ZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtZHJpdmVyLWhpZC1yb2NjYXQta29uZSBiL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtZHJpdmVyLWhpZC1yb2NjYXQta29uZQppbmRleCAwNjNiZGE3Li42OThiODA4IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWRyaXZlci1oaWQtcm9jY2F0LWtvbmUKKysrIGIvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1kcml2ZXItaGlkLXJvY2NhdC1rb25lCkBAIC0xLDQgKzEsNCBAQAotV2hhdDoJCS9zeXMvYnVzL3VzYi9kZXZpY2VzLzxidXNudW0+LTxkZXZudW0+Ojxjb25maWcgbnVtPi48aW50ZXJmYWNlIG51bT4vYWN0dWFsX2RwaQorV2hhdDoJCS9zeXMvYnVzL3VzYi9kZXZpY2VzLzxidXNudW0+LTxkZXZudW0+Ojxjb25maWcgbnVtPi48aW50ZXJmYWNlIG51bT4vPGhpZC1idXM+Ojx2ZW5kb3ItaWQ+Ojxwcm9kdWN0LWlkPi48bnVtPi9rb25lL3JvY2NhdGtvbmU8bWlub3I+L2FjdHVhbF9kcGkKIERhdGU6CQlNYXJjaCAyMDEwCiBDb250YWN0OglTdGVmYW4gQWNoYXR6IDxlcmF6b3JfZGVAdXNlcnMuc291cmNlZm9yZ2UubmV0PgogRGVzY3JpcHRpb246CUl0IGlzIHBvc3NpYmxlIHRvIHN3aXRjaCB0aGUgZHBpIHNldHRpbmcgb2YgdGhlIG1vdXNlIHdpdGggdGhlCkBAIC0xNywxMyArMTcsMTMgQEAKIAogCQlUaGlzIGZpbGUgaXMgcmVhZG9ubHkuCiAKLVdoYXQ6CQkvc3lzL2J1cy91c2IvZGV2aWNlcy88YnVzbnVtPi08ZGV2bnVtPjo8Y29uZmlnIG51bT4uPGludGVyZmFjZSBudW0+L2FjdHVhbF9wcm9maWxlCitXaGF0OgkJL3N5cy9idXMvdXNiL2RldmljZXMvPGJ1c251bT4tPGRldm51bT46PGNvbmZpZyBudW0+LjxpbnRlcmZhY2UgbnVtPi88aGlkLWJ1cz46PHZlbmRvci1pZD46PHByb2R1Y3QtaWQ+LjxudW0+L2tvbmUvcm9jY2F0a29uZTxtaW5vcj4vYWN0dWFsX3Byb2ZpbGUKIERhdGU6CQlNYXJjaCAyMDEwCiBDb250YWN0OglTdGVmYW4gQWNoYXR6IDxlcmF6b3JfZGVAdXNlcnMuc291cmNlZm9yZ2UubmV0PgogRGVzY3JpcHRpb246CVdoZW4gcmVhZCwgdGhpcyBmaWxlIHJldHVybnMgdGhlIG51bWJlciBvZiB0aGUgYWN0dWFsIHByb2ZpbGUuCiAJCVRoaXMgZmlsZSBpcyByZWFkb25seS4KIAotV2hhdDoJCS9zeXMvYnVzL3VzYi9kZXZpY2VzLzxidXNudW0+LTxkZXZudW0+Ojxjb25maWcgbnVtPi48aW50ZXJmYWNlIG51bT4vZmlybXdhcmVfdmVyc2lvbgorV2hhdDoJCS9zeXMvYnVzL3VzYi9kZXZpY2VzLzxidXNudW0+LTxkZXZudW0+Ojxjb25maWcgbnVtPi48aW50ZXJmYWNlIG51bT4vPGhpZC1idXM+Ojx2ZW5kb3ItaWQ+Ojxwcm9kdWN0LWlkPi48bnVtPi9rb25lL3JvY2NhdGtvbmU8bWlub3I+L2Zpcm13YXJlX3ZlcnNpb24KIERhdGU6CQlNYXJjaCAyMDEwCiBDb250YWN0OglTdGVmYW4gQWNoYXR6IDxlcmF6b3JfZGVAdXNlcnMuc291cmNlZm9yZ2UubmV0PgogRGVzY3JpcHRpb246CVdoZW4gcmVhZCwgdGhpcyBmaWxlIHJldHVybnMgdGhlIHJhdyBpbnRlZ2VyIHZlcnNpb24gbnVtYmVyIG9mIHRoZQpAQCAtMzMsNyArMzMsNyBAQAogCQlsZWZ0LiBFLmcuIGEgcmV0dXJuZWQgdmFsdWUgb2YgMTM4IG1lYW5zIDEuMzgKIAkJVGhpcyBmaWxlIGlzIHJlYWRvbmx5LgogCi1XaGF0OgkJL3N5cy9idXMvdXNiL2RldmljZXMvPGJ1c251bT4tPGRldm51bT46PGNvbmZpZyBudW0+LjxpbnRlcmZhY2UgbnVtPi9wcm9maWxlWzEtNV0KK1doYXQ6CQkvc3lzL2J1cy91c2IvZGV2aWNlcy88YnVzbnVtPi08ZGV2bnVtPjo8Y29uZmlnIG51bT4uPGludGVyZmFjZSBudW0+LzxoaWQtYnVzPjo8dmVuZG9yLWlkPjo8cHJvZHVjdC1pZD4uPG51bT4va29uZS9yb2NjYXRrb25lPG1pbm9yPi9wcm9maWxlWzEtNV0KIERhdGU6CQlNYXJjaCAyMDEwCiBDb250YWN0OglTdGVmYW4gQWNoYXR6IDxlcmF6b3JfZGVAdXNlcnMuc291cmNlZm9yZ2UubmV0PgogRGVzY3JpcHRpb246CVRoZSBtb3VzZSBjYW4gc3RvcmUgNSBwcm9maWxlcyB3aGljaCBjYW4gYmUgc3dpdGNoZWQgYnkgdGhlCkBAIC00OCw3ICs0OCw3IEBACiAJCXN0b3JlZCBpbiB0aGUgcHJvZmlsZSBkb2Vzbid0IG5lZWQgdG8gZml0IHRoZSBudW1iZXIgb2YgdGhlCiAJCXN0b3JlLgogCi1XaGF0OgkJL3N5cy9idXMvdXNiL2RldmljZXMvPGJ1c251bT4tPGRldm51bT46PGNvbmZpZyBudW0+LjxpbnRlcmZhY2UgbnVtPi9zZXR0aW5ncworV2hhdDoJCS9zeXMvYnVzL3VzYi9kZXZpY2VzLzxidXNudW0+LTxkZXZudW0+Ojxjb25maWcgbnVtPi48aW50ZXJmYWNlIG51bT4vPGhpZC1idXM+Ojx2ZW5kb3ItaWQ+Ojxwcm9kdWN0LWlkPi48bnVtPi9rb25lL3JvY2NhdGtvbmU8bWlub3I+L3NldHRpbmdzCiBEYXRlOgkJTWFyY2ggMjAxMAogQ29udGFjdDoJU3RlZmFuIEFjaGF0eiA8ZXJhem9yX2RlQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KIERlc2NyaXB0aW9uOglXaGVuIHJlYWQsIHRoaXMgZmlsZSByZXR1cm5zIHRoZSBzZXR0aW5ncyBzdG9yZWQgaW4gdGhlIG1vdXNlLgpAQCAtNTgsNyArNTgsNyBAQAogCQlUaGUgZGF0YSBoYXMgdG8gYmUgMzYgYnl0ZXMgbG9uZy4gVGhlIG1vdXNlIHdpbGwgcmVqZWN0IGludmFsaWQKIAkJZGF0YS4KIAotV2hhdDoJCS9zeXMvYnVzL3VzYi9kZXZpY2VzLzxidXNudW0+LTxkZXZudW0+Ojxjb25maWcgbnVtPi48aW50ZXJmYWNlIG51bT4vc3RhcnR1cF9wcm9maWxlCitXaGF0OgkJL3N5cy9idXMvdXNiL2RldmljZXMvPGJ1c251bT4tPGRldm51bT46PGNvbmZpZyBudW0+LjxpbnRlcmZhY2UgbnVtPi88aGlkLWJ1cz46PHZlbmRvci1pZD46PHByb2R1Y3QtaWQ+LjxudW0+L2tvbmUvcm9jY2F0a29uZTxtaW5vcj4vc3RhcnR1cF9wcm9maWxlCiBEYXRlOgkJTWFyY2ggMjAxMAogQ29udGFjdDoJU3RlZmFuIEFjaGF0eiA8ZXJhem9yX2RlQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KIERlc2NyaXB0aW9uOglUaGUgaW50ZWdlciB2YWx1ZSBvZiB0aGlzIGF0dHJpYnV0ZSByYW5nZXMgZnJvbSAxIHRvIDUuCkBAIC02Nyw3ICs2Nyw3IEBACiAJCVdoZW4gd3JpdHRlbiwgdGhpcyBmaWxlIHNldHMgdGhlIG51bWJlciBvZiB0aGUgc3RhcnR1cCBwcm9maWxlCiAJCWFuZCB0aGUgbW91c2UgYWN0aXZhdGVzIHRoaXMgcHJvZmlsZSBpbW1lZGlhdGVseS4KIAotV2hhdDoJCS9zeXMvYnVzL3VzYi9kZXZpY2VzLzxidXNudW0+LTxkZXZudW0+Ojxjb25maWcgbnVtPi48aW50ZXJmYWNlIG51bT4vdGN1CitXaGF0OgkJL3N5cy9idXMvdXNiL2RldmljZXMvPGJ1c251bT4tPGRldm51bT46PGNvbmZpZyBudW0+LjxpbnRlcmZhY2UgbnVtPi88aGlkLWJ1cz46PHZlbmRvci1pZD46PHByb2R1Y3QtaWQ+LjxudW0+L2tvbmUvcm9jY2F0a29uZTxtaW5vcj4vdGN1CiBEYXRlOgkJTWFyY2ggMjAxMAogQ29udGFjdDoJU3RlZmFuIEFjaGF0eiA8ZXJhem9yX2RlQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KIERlc2NyaXB0aW9uOglUaGUgbW91c2UgaGFzIGEgIlRyYWNraW5nIENvbnRyb2wgVW5pdCIgd2hpY2ggbGV0cyB0aGUgdXNlcgpAQCAtNzgsNyArNzgsNyBAQAogCQlXcml0aW5nIDEgaW4gdGhpcyBmaWxlIHdpbGwgc3RhcnQgdGhlIGNhbGlicmF0aW9uIHdoaWNoIHRha2VzCiAJCWFyb3VuZCA2IHNlY29uZHMgdG8gY29tcGxldGUgYW5kIGFjdGl2YXRlcyB0aGUgVENVLgogCi1XaGF0OgkJL3N5cy9idXMvdXNiL2RldmljZXMvPGJ1c251bT4tPGRldm51bT46PGNvbmZpZyBudW0+LjxpbnRlcmZhY2UgbnVtPi93ZWlnaHQKK1doYXQ6CQkvc3lzL2J1cy91c2IvZGV2aWNlcy88YnVzbnVtPi08ZGV2bnVtPjo8Y29uZmlnIG51bT4uPGludGVyZmFjZSBudW0+LzxoaWQtYnVzPjo8dmVuZG9yLWlkPjo8cHJvZHVjdC1pZD4uPG51bT4va29uZS9yb2NjYXRrb25lPG1pbm9yPi93ZWlnaHQKIERhdGU6CQlNYXJjaCAyMDEwCiBDb250YWN0OglTdGVmYW4gQWNoYXR6IDxlcmF6b3JfZGVAdXNlcnMuc291cmNlZm9yZ2UubmV0PgogRGVzY3JpcHRpb246CVRoZSBtb3VzZSBjYW4gYmUgZXF1aXBwZWQgd2l0aCBvbmUgb2YgZm91ciBzdXBwbGllZCB3ZWlnaHRzCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWRyaXZlci1oaWQtcm9jY2F0LWtvbmVwbHVzIGIvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1kcml2ZXItaGlkLXJvY2NhdC1rb25lcGx1cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjlmMzBlCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1kcml2ZXItaGlkLXJvY2NhdC1rb25lcGx1cwpAQCAtMCwwICsxLDEwOCBAQAorV2hhdDoJCS9zeXMvYnVzL3VzYi9kZXZpY2VzLzxidXNudW0+LTxkZXZudW0+Ojxjb25maWcgbnVtPi48aW50ZXJmYWNlIG51bT4vPGhpZC1idXM+Ojx2ZW5kb3ItaWQ+Ojxwcm9kdWN0LWlkPi48bnVtPi9rb25lcGx1cy9yb2NjYXRrb25lcGx1czxtaW5vcj4vYWN0dWFsX3Byb2ZpbGUKK0RhdGU6CQlPY3RvYmVyIDIwMTAKK0NvbnRhY3Q6CVN0ZWZhbiBBY2hhdHogPGVyYXpvcl9kZUB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CitEZXNjcmlwdGlvbjoJV2hlbiByZWFkLCB0aGlzIGZpbGUgcmV0dXJucyB0aGUgbnVtYmVyIG9mIHRoZSBhY3R1YWwgcHJvZmlsZSBpbgorCQlyYW5nZSAwLTQuCisJCVRoaXMgZmlsZSBpcyByZWFkb25seS4KKworV2hhdDoJCS9zeXMvYnVzL3VzYi9kZXZpY2VzLzxidXNudW0+LTxkZXZudW0+Ojxjb25maWcgbnVtPi48aW50ZXJmYWNlIG51bT4vPGhpZC1idXM+Ojx2ZW5kb3ItaWQ+Ojxwcm9kdWN0LWlkPi48bnVtPi9rb25lcGx1cy9yb2NjYXRrb25lcGx1czxtaW5vcj4vZmlybXdhcmVfdmVyc2lvbgorRGF0ZToJCU9jdG9iZXIgMjAxMAorQ29udGFjdDoJU3RlZmFuIEFjaGF0eiA8ZXJhem9yX2RlQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KK0Rlc2NyaXB0aW9uOglXaGVuIHJlYWQsIHRoaXMgZmlsZSByZXR1cm5zIHRoZSByYXcgaW50ZWdlciB2ZXJzaW9uIG51bWJlciBvZiB0aGUKKwkJZmlybXdhcmUgcmVwb3J0ZWQgYnkgdGhlIG1vdXNlLiBVc2luZyB0aGUgaW50ZWdlciB2YWx1ZSBlYXNlcworCQlmdXJ0aGVyIHVzYWdlIGluIG90aGVyIHByb2dyYW1zLiBUbyByZWNlaXZlIHRoZSByZWFsIHZlcnNpb24KKwkJbnVtYmVyIHRoZSBkZWNpbWFsIHBvaW50IGhhcyB0byBiZSBzaGlmdGVkIDIgcG9zaXRpb25zIHRvIHRoZQorCQlsZWZ0LiBFLmcuIGEgcmV0dXJuZWQgdmFsdWUgb2YgMTIxIG1lYW5zIDEuMjEKKwkJVGhpcyBmaWxlIGlzIHJlYWRvbmx5LgorCitXaGF0OgkJL3N5cy9idXMvdXNiL2RldmljZXMvPGJ1c251bT4tPGRldm51bT46PGNvbmZpZyBudW0+LjxpbnRlcmZhY2UgbnVtPi88aGlkLWJ1cz46PHZlbmRvci1pZD46PHByb2R1Y3QtaWQ+LjxudW0+L2tvbmVwbHVzL3JvY2NhdGtvbmVwbHVzPG1pbm9yPi9tYWNybworRGF0ZToJCU9jdG9iZXIgMjAxMAorQ29udGFjdDoJU3RlZmFuIEFjaGF0eiA8ZXJhem9yX2RlQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KK0Rlc2NyaXB0aW9uOglUaGUgbW91c2UgY2FuIHN0b3JlIGEgbWFjcm8gd2l0aCBtYXggNTAwIGtleS9idXR0b24gc3Ryb2tlcworCQlpbnRlcm5hbGx5LgorCQlXaGVuIHdyaXR0ZW4sIHRoaXMgZmlsZSBsZXRzIG9uZSBzZXQgdGhlIHNlcXVlbmNlIGZvciBhIHNwZWNpZmljCisJCWJ1dHRvbiBmb3IgYSBzcGVjaWZpYyBwcm9maWxlLiBCdXR0b24gYW5kIHByb2ZpbGUgbnVtYmVycyBhcmUKKwkJaW5jbHVkZWQgaW4gd3JpdHRlbiBkYXRhLiBUaGUgZGF0YSBoYXMgdG8gYmUgMjA4MiBieXRlcyBsb25nLgorCQlUaGlzIGZpbGUgaXMgd3JpdGVvbmx5LgorCitXaGF0OgkJL3N5cy9idXMvdXNiL2RldmljZXMvPGJ1c251bT4tPGRldm51bT46PGNvbmZpZyBudW0+LjxpbnRlcmZhY2UgbnVtPi88aGlkLWJ1cz46PHZlbmRvci1pZD46PHByb2R1Y3QtaWQ+LjxudW0+L2tvbmVwbHVzL3JvY2NhdGtvbmVwbHVzPG1pbm9yPi9wcm9maWxlX2J1dHRvbnMKK0RhdGU6CQlBdWd1c3QgMjAxMAorQ29udGFjdDoJU3RlZmFuIEFjaGF0eiA8ZXJhem9yX2RlQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KK0Rlc2NyaXB0aW9uOglUaGUgbW91c2UgY2FuIHN0b3JlIDUgcHJvZmlsZXMgd2hpY2ggY2FuIGJlIHN3aXRjaGVkIGJ5IHRoZQorCQlwcmVzcyBvZiBhIGJ1dHRvbi4gQSBwcm9maWxlIGlzIHNwbGl0IGluIHNldHRpbmdzIGFuZCBidXR0b25zLgorCQlwcm9maWxlX2J1dHRvbnMgaG9sZHMgaW5mb3JtYXRpb25zIGFib3V0IGJ1dHRvbiBsYXlvdXQuCisJCVdoZW4gd3JpdHRlbiwgdGhpcyBmaWxlIGxldHMgb25lIHdyaXRlIHRoZSByZXNwZWN0aXZlIHByb2ZpbGUKKwkJYnV0dG9ucyBiYWNrIHRvIHRoZSBtb3VzZS4gVGhlIGRhdGEgaGFzIHRvIGJlIDc3IGJ5dGVzIGxvbmcuCisJCVRoZSBtb3VzZSB3aWxsIHJlamVjdCBpbnZhbGlkIGRhdGEuCisJCVdoaWNoIHByb2ZpbGUgdG8gd3JpdGUgaXMgZGV0ZXJtaW5lZCBieSB0aGUgcHJvZmlsZSBudW1iZXIKKwkJY29udGFpbmVkIGluIHRoZSBkYXRhLgorCQlUaGlzIGZpbGUgaXMgd3JpdGVvbmx5LgorCitXaGF0OgkJL3N5cy9idXMvdXNiL2RldmljZXMvPGJ1c251bT4tPGRldm51bT46PGNvbmZpZyBudW0+LjxpbnRlcmZhY2UgbnVtPi88aGlkLWJ1cz46PHZlbmRvci1pZD46PHByb2R1Y3QtaWQ+LjxudW0+L2tvbmVwbHVzL3JvY2NhdGtvbmVwbHVzPG1pbm9yPi9wcm9maWxlWzEtNV1fYnV0dG9ucworRGF0ZToJCUF1Z3VzdCAyMDEwCitDb250YWN0OglTdGVmYW4gQWNoYXR6IDxlcmF6b3JfZGVAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorRGVzY3JpcHRpb246CVRoZSBtb3VzZSBjYW4gc3RvcmUgNSBwcm9maWxlcyB3aGljaCBjYW4gYmUgc3dpdGNoZWQgYnkgdGhlCisJCXByZXNzIG9mIGEgYnV0dG9uLiBBIHByb2ZpbGUgaXMgc3BsaXQgaW4gc2V0dGluZ3MgYW5kIGJ1dHRvbnMuCisJCXByb2ZpbGVfYnV0dG9ucyBob2xkcyBpbmZvcm1hdGlvbnMgYWJvdXQgYnV0dG9uIGxheW91dC4KKwkJV2hlbiByZWFkLCB0aGVzZSBmaWxlcyByZXR1cm4gdGhlIHJlc3BlY3RpdmUgcHJvZmlsZSBidXR0b25zLgorCQlUaGUgcmV0dXJuZWQgZGF0YSBpcyA3NyBieXRlcyBpbiBzaXplLgorCQlUaGlzIGZpbGUgaXMgcmVhZG9ubHkuCisKK1doYXQ6CQkvc3lzL2J1cy91c2IvZGV2aWNlcy88YnVzbnVtPi08ZGV2bnVtPjo8Y29uZmlnIG51bT4uPGludGVyZmFjZSBudW0+LzxoaWQtYnVzPjo8dmVuZG9yLWlkPjo8cHJvZHVjdC1pZD4uPG51bT4va29uZXBsdXMvcm9jY2F0a29uZXBsdXM8bWlub3I+L3Byb2ZpbGVfc2V0dGluZ3MKK0RhdGU6CQlPY3RvYmVyIDIwMTAKK0NvbnRhY3Q6CVN0ZWZhbiBBY2hhdHogPGVyYXpvcl9kZUB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CitEZXNjcmlwdGlvbjoJVGhlIG1vdXNlIGNhbiBzdG9yZSA1IHByb2ZpbGVzIHdoaWNoIGNhbiBiZSBzd2l0Y2hlZCBieSB0aGUKKwkJcHJlc3Mgb2YgYSBidXR0b24uIEEgcHJvZmlsZSBpcyBzcGxpdCBpbiBzZXR0aW5ncyBhbmQgYnV0dG9ucy4KKwkJcHJvZmlsZV9zZXR0aW5ncyBob2xkcyBpbmZvcm1hdGlvbnMgbGlrZSByZXNvbHV0aW9uLCBzZW5zaXRpdml0eQorCQlhbmQgbGlnaHQgZWZmZWN0cy4KKwkJV2hlbiB3cml0dGVuLCB0aGlzIGZpbGUgbGV0cyBvbmUgd3JpdGUgdGhlIHJlc3BlY3RpdmUgcHJvZmlsZQorCQlzZXR0aW5ncyBiYWNrIHRvIHRoZSBtb3VzZS4gVGhlIGRhdGEgaGFzIHRvIGJlIDQzIGJ5dGVzIGxvbmcuCisJCVRoZSBtb3VzZSB3aWxsIHJlamVjdCBpbnZhbGlkIGRhdGEuCisJCVdoaWNoIHByb2ZpbGUgdG8gd3JpdGUgaXMgZGV0ZXJtaW5lZCBieSB0aGUgcHJvZmlsZSBudW1iZXIKKwkJY29udGFpbmVkIGluIHRoZSBkYXRhLgorCQlUaGlzIGZpbGUgaXMgd3JpdGVvbmx5LgorCitXaGF0OgkJL3N5cy9idXMvdXNiL2RldmljZXMvPGJ1c251bT4tPGRldm51bT46PGNvbmZpZyBudW0+LjxpbnRlcmZhY2UgbnVtPi88aGlkLWJ1cz46PHZlbmRvci1pZD46PHByb2R1Y3QtaWQ+LjxudW0+L2tvbmVwbHVzL3JvY2NhdGtvbmVwbHVzPG1pbm9yPi9wcm9maWxlWzEtNV1fc2V0dGluZ3MKK0RhdGU6CQlBdWd1c3QgMjAxMAorQ29udGFjdDoJU3RlZmFuIEFjaGF0eiA8ZXJhem9yX2RlQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KK0Rlc2NyaXB0aW9uOglUaGUgbW91c2UgY2FuIHN0b3JlIDUgcHJvZmlsZXMgd2hpY2ggY2FuIGJlIHN3aXRjaGVkIGJ5IHRoZQorCQlwcmVzcyBvZiBhIGJ1dHRvbi4gQSBwcm9maWxlIGlzIHNwbGl0IGluIHNldHRpbmdzIGFuZCBidXR0b25zLgorCQlwcm9maWxlX3NldHRpbmdzIGhvbGRzIGluZm9ybWF0aW9ucyBsaWtlIHJlc29sdXRpb24sIHNlbnNpdGl2aXR5CisJCWFuZCBsaWdodCBlZmZlY3RzLgorCQlXaGVuIHJlYWQsIHRoZXNlIGZpbGVzIHJldHVybiB0aGUgcmVzcGVjdGl2ZSBwcm9maWxlIHNldHRpbmdzLgorCQlUaGUgcmV0dXJuZWQgZGF0YSBpcyA0MyBieXRlcyBpbiBzaXplLgorCQlUaGlzIGZpbGUgaXMgcmVhZG9ubHkuCisKK1doYXQ6CQkvc3lzL2J1cy91c2IvZGV2aWNlcy88YnVzbnVtPi08ZGV2bnVtPjo8Y29uZmlnIG51bT4uPGludGVyZmFjZSBudW0+LzxoaWQtYnVzPjo8dmVuZG9yLWlkPjo8cHJvZHVjdC1pZD4uPG51bT4va29uZXBsdXMvcm9jY2F0a29uZXBsdXM8bWlub3I+L3NlbnNvcgorRGF0ZToJCU9jdG9iZXIgMjAxMAorQ29udGFjdDoJU3RlZmFuIEFjaGF0eiA8ZXJhem9yX2RlQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KK0Rlc2NyaXB0aW9uOglUaGUgbW91c2UgaGFzIGEgdHJhY2tpbmctIGFuZCBhIGRpc3RhbmNlLWNvbnRyb2wtdW5pdC4gVGhlc2UKKwkJY2FuIGJlIGFjdGl2YXRlZC9kZWFjdGl2YXRlZCBhbmQgdGhlIGxpZnQtb2ZmIGRpc3RhbmNlIGNhbiBiZQorCQlzZXQuIFRoZSBkYXRhIGhhcyB0byBiZSA2IGJ5dGVzIGxvbmcuCisJCVRoaXMgZmlsZSBpcyB3cml0ZW9ubHkuCisKK1doYXQ6CQkvc3lzL2J1cy91c2IvZGV2aWNlcy88YnVzbnVtPi08ZGV2bnVtPjo8Y29uZmlnIG51bT4uPGludGVyZmFjZSBudW0+LzxoaWQtYnVzPjo8dmVuZG9yLWlkPjo8cHJvZHVjdC1pZD4uPG51bT4va29uZXBsdXMvcm9jY2F0a29uZXBsdXM8bWlub3I+L3N0YXJ0dXBfcHJvZmlsZQorRGF0ZToJCU9jdG9iZXIgMjAxMAorQ29udGFjdDoJU3RlZmFuIEFjaGF0eiA8ZXJhem9yX2RlQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KK0Rlc2NyaXB0aW9uOglUaGUgaW50ZWdlciB2YWx1ZSBvZiB0aGlzIGF0dHJpYnV0ZSByYW5nZXMgZnJvbSAwLTQuCisgICAgICAgICAgICAgICAgV2hlbiByZWFkLCB0aGlzIGF0dHJpYnV0ZSByZXR1cm5zIHRoZSBudW1iZXIgb2YgdGhlIHByb2ZpbGUKKyAgICAgICAgICAgICAgICB0aGF0J3MgYWN0aXZlIHdoZW4gdGhlIG1vdXNlIGlzIHBvd2VyZWQgb24uCisJCVdoZW4gd3JpdHRlbiwgdGhpcyBmaWxlIHNldHMgdGhlIG51bWJlciBvZiB0aGUgc3RhcnR1cCBwcm9maWxlCisJCWFuZCB0aGUgbW91c2UgYWN0aXZhdGVzIHRoaXMgcHJvZmlsZSBpbW1lZGlhdGVseS4KKworV2hhdDoJCS9zeXMvYnVzL3VzYi9kZXZpY2VzLzxidXNudW0+LTxkZXZudW0+Ojxjb25maWcgbnVtPi48aW50ZXJmYWNlIG51bT4vPGhpZC1idXM+Ojx2ZW5kb3ItaWQ+Ojxwcm9kdWN0LWlkPi48bnVtPi9rb25lcGx1cy9yb2NjYXRrb25lcGx1czxtaW5vcj4vdGN1CitEYXRlOgkJT2N0b2JlciAyMDEwCitDb250YWN0OglTdGVmYW4gQWNoYXR6IDxlcmF6b3JfZGVAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorRGVzY3JpcHRpb246CVdoZW4gd3JpdHRlbiBhIGNhbGlicmF0aW9uIHByb2Nlc3MgZm9yIHRoZSB0cmFja2luZyBjb250cm9sIHVuaXQKKwkJY2FuIGJlIGluaXRpYXRlZC9jYW5jZWxsZWQuCisJCVRoZSBkYXRhIGhhcyB0byBiZSAzIGJ5dGVzIGxvbmcuCisJCVRoaXMgZmlsZSBpcyB3cml0ZW9ubHkuCisKK1doYXQ6CQkvc3lzL2J1cy91c2IvZGV2aWNlcy88YnVzbnVtPi08ZGV2bnVtPjo8Y29uZmlnIG51bT4uPGludGVyZmFjZSBudW0+LzxoaWQtYnVzPjo8dmVuZG9yLWlkPjo8cHJvZHVjdC1pZD4uPG51bT4va29uZXBsdXMvcm9jY2F0a29uZXBsdXM8bWlub3I+L3RjdV9pbWFnZQorRGF0ZToJCU9jdG9iZXIgMjAxMAorQ29udGFjdDoJU3RlZmFuIEFjaGF0eiA8ZXJhem9yX2RlQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KK0Rlc2NyaXB0aW9uOglXaGVuIHJlYWQgdGhlIG1vdXNlIHJldHVybnMgYSAzMHgzMCBwaXhlbCBpbWFnZSBvZiB0aGUKKwkJc2FtcGxlZCB1bmRlcmdyb3VuZC4gVGhpcyB3b3JrcyBvbmx5IGluIHRoZSBjb3Vyc2Ugb2YgYQorCQljYWxpYnJhdGlvbiBwcm9jZXNzIGluaXRpYXRlZCB3aXRoIHRjdS4KKwkJVGhlIHJldHVybmVkIGRhdGEgaXMgMTAyOCBieXRlcyBpbiBzaXplLgorCQlUaGlzIGZpbGUgaXMgcmVhZG9ubHkuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWRyaXZlci1oaWQtcm9jY2F0LXB5cmEgYi9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWRyaXZlci1oaWQtcm9jY2F0LXB5cmEKaW5kZXggYWQxMTI1Yi4uMWMzN2I4MiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1kcml2ZXItaGlkLXJvY2NhdC1weXJhCisrKyBiL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtZHJpdmVyLWhpZC1yb2NjYXQtcHlyYQpAQCAtMSw0ICsxLDQgQEAKLVdoYXQ6CQkvc3lzL2J1cy91c2IvZGV2aWNlcy88YnVzbnVtPi08ZGV2bnVtPjo8Y29uZmlnIG51bT4uPGludGVyZmFjZSBudW0+L2FjdHVhbF9jcGkKK1doYXQ6CQkvc3lzL2J1cy91c2IvZGV2aWNlcy88YnVzbnVtPi08ZGV2bnVtPjo8Y29uZmlnIG51bT4uPGludGVyZmFjZSBudW0+LzxoaWQtYnVzPjo8dmVuZG9yLWlkPjo8cHJvZHVjdC1pZD4uPG51bT4vcHlyYS9yb2NjYXRweXJhPG1pbm9yPi9hY3R1YWxfY3BpCiBEYXRlOgkJQXVndXN0IDIwMTAKIENvbnRhY3Q6CVN0ZWZhbiBBY2hhdHogPGVyYXpvcl9kZUB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CiBEZXNjcmlwdGlvbjoJSXQgaXMgcG9zc2libGUgdG8gc3dpdGNoIHRoZSBjcGkgc2V0dGluZyBvZiB0aGUgbW91c2Ugd2l0aCB0aGUKQEAgLTE0LDE0ICsxNCwxNCBAQAogCiAJCVRoaXMgZmlsZSBpcyByZWFkb25seS4KIAotV2hhdDoJCS9zeXMvYnVzL3VzYi9kZXZpY2VzLzxidXNudW0+LTxkZXZudW0+Ojxjb25maWcgbnVtPi48aW50ZXJmYWNlIG51bT4vYWN0dWFsX3Byb2ZpbGUKK1doYXQ6CQkvc3lzL2J1cy91c2IvZGV2aWNlcy88YnVzbnVtPi08ZGV2bnVtPjo8Y29uZmlnIG51bT4uPGludGVyZmFjZSBudW0+LzxoaWQtYnVzPjo8dmVuZG9yLWlkPjo8cHJvZHVjdC1pZD4uPG51bT4vcHlyYS9yb2NjYXRweXJhPG1pbm9yPi9hY3R1YWxfcHJvZmlsZQogRGF0ZToJCUF1Z3VzdCAyMDEwCiBDb250YWN0OglTdGVmYW4gQWNoYXR6IDxlcmF6b3JfZGVAdXNlcnMuc291cmNlZm9yZ2UubmV0PgogRGVzY3JpcHRpb246CVdoZW4gcmVhZCwgdGhpcyBmaWxlIHJldHVybnMgdGhlIG51bWJlciBvZiB0aGUgYWN0dWFsIHByb2ZpbGUgaW4KIAkJcmFuZ2UgMC00LgogCQlUaGlzIGZpbGUgaXMgcmVhZG9ubHkuCiAKLVdoYXQ6CQkvc3lzL2J1cy91c2IvZGV2aWNlcy88YnVzbnVtPi08ZGV2bnVtPjo8Y29uZmlnIG51bT4uPGludGVyZmFjZSBudW0+L2Zpcm13YXJlX3ZlcnNpb24KK1doYXQ6CQkvc3lzL2J1cy91c2IvZGV2aWNlcy88YnVzbnVtPi08ZGV2bnVtPjo8Y29uZmlnIG51bT4uPGludGVyZmFjZSBudW0+LzxoaWQtYnVzPjo8dmVuZG9yLWlkPjo8cHJvZHVjdC1pZD4uPG51bT4vcHlyYS9yb2NjYXRweXJhPG1pbm9yPi9maXJtd2FyZV92ZXJzaW9uCiBEYXRlOgkJQXVndXN0IDIwMTAKIENvbnRhY3Q6CVN0ZWZhbiBBY2hhdHogPGVyYXpvcl9kZUB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CiBEZXNjcmlwdGlvbjoJV2hlbiByZWFkLCB0aGlzIGZpbGUgcmV0dXJucyB0aGUgcmF3IGludGVnZXIgdmVyc2lvbiBudW1iZXIgb2YgdGhlCkBAIC0zMSw3ICszMSw3IEBACiAJCWxlZnQuIEUuZy4gYSByZXR1cm5lZCB2YWx1ZSBvZiAxMzggbWVhbnMgMS4zOAogCQlUaGlzIGZpbGUgaXMgcmVhZG9ubHkuCiAKLVdoYXQ6CQkvc3lzL2J1cy91c2IvZGV2aWNlcy88YnVzbnVtPi08ZGV2bnVtPjo8Y29uZmlnIG51bT4uPGludGVyZmFjZSBudW0+L3Byb2ZpbGVfc2V0dGluZ3MKK1doYXQ6CQkvc3lzL2J1cy91c2IvZGV2aWNlcy88YnVzbnVtPi08ZGV2bnVtPjo8Y29uZmlnIG51bT4uPGludGVyZmFjZSBudW0+LzxoaWQtYnVzPjo8dmVuZG9yLWlkPjo8cHJvZHVjdC1pZD4uPG51bT4vcHlyYS9yb2NjYXRweXJhPG1pbm9yPi9wcm9maWxlX3NldHRpbmdzCiBEYXRlOgkJQXVndXN0IDIwMTAKIENvbnRhY3Q6CVN0ZWZhbiBBY2hhdHogPGVyYXpvcl9kZUB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CiBEZXNjcmlwdGlvbjoJVGhlIG1vdXNlIGNhbiBzdG9yZSA1IHByb2ZpbGVzIHdoaWNoIGNhbiBiZSBzd2l0Y2hlZCBieSB0aGUKQEAgLTQ1LDcgKzQ1LDcgQEAKIAkJY29udGFpbmVkIGluIHRoZSBkYXRhLgogCQlUaGlzIGZpbGUgaXMgd3JpdGVvbmx5LgogCi1XaGF0OgkJL3N5cy9idXMvdXNiL2RldmljZXMvPGJ1c251bT4tPGRldm51bT46PGNvbmZpZyBudW0+LjxpbnRlcmZhY2UgbnVtPi9wcm9maWxlWzEtNV1fc2V0dGluZ3MKK1doYXQ6CQkvc3lzL2J1cy91c2IvZGV2aWNlcy88YnVzbnVtPi08ZGV2bnVtPjo8Y29uZmlnIG51bT4uPGludGVyZmFjZSBudW0+LzxoaWQtYnVzPjo8dmVuZG9yLWlkPjo8cHJvZHVjdC1pZD4uPG51bT4vcHlyYS9yb2NjYXRweXJhPG1pbm9yPi9wcm9maWxlWzEtNV1fc2V0dGluZ3MKIERhdGU6CQlBdWd1c3QgMjAxMAogQ29udGFjdDoJU3RlZmFuIEFjaGF0eiA8ZXJhem9yX2RlQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KIERlc2NyaXB0aW9uOglUaGUgbW91c2UgY2FuIHN0b3JlIDUgcHJvZmlsZXMgd2hpY2ggY2FuIGJlIHN3aXRjaGVkIGJ5IHRoZQpAQCAtNTYsNyArNTYsNyBAQAogCQlUaGUgcmV0dXJuZWQgZGF0YSBpcyAxMyBieXRlcyBpbiBzaXplLgogCQlUaGlzIGZpbGUgaXMgcmVhZG9ubHkuCiAKLVdoYXQ6CQkvc3lzL2J1cy91c2IvZGV2aWNlcy88YnVzbnVtPi08ZGV2bnVtPjo8Y29uZmlnIG51bT4uPGludGVyZmFjZSBudW0+L3Byb2ZpbGVfYnV0dG9ucworV2hhdDoJCS9zeXMvYnVzL3VzYi9kZXZpY2VzLzxidXNudW0+LTxkZXZudW0+Ojxjb25maWcgbnVtPi48aW50ZXJmYWNlIG51bT4vPGhpZC1idXM+Ojx2ZW5kb3ItaWQ+Ojxwcm9kdWN0LWlkPi48bnVtPi9weXJhL3JvY2NhdHB5cmE8bWlub3I+L3Byb2ZpbGVfYnV0dG9ucwogRGF0ZToJCUF1Z3VzdCAyMDEwCiBDb250YWN0OglTdGVmYW4gQWNoYXR6IDxlcmF6b3JfZGVAdXNlcnMuc291cmNlZm9yZ2UubmV0PgogRGVzY3JpcHRpb246CVRoZSBtb3VzZSBjYW4gc3RvcmUgNSBwcm9maWxlcyB3aGljaCBjYW4gYmUgc3dpdGNoZWQgYnkgdGhlCkBAIC02OSw3ICs2OSw3IEBACiAJCWNvbnRhaW5lZCBpbiB0aGUgZGF0YS4KIAkJVGhpcyBmaWxlIGlzIHdyaXRlb25seS4KIAotV2hhdDoJCS9zeXMvYnVzL3VzYi9kZXZpY2VzLzxidXNudW0+LTxkZXZudW0+Ojxjb25maWcgbnVtPi48aW50ZXJmYWNlIG51bT4vcHJvZmlsZVsxLTVdX2J1dHRvbnMKK1doYXQ6CQkvc3lzL2J1cy91c2IvZGV2aWNlcy88YnVzbnVtPi08ZGV2bnVtPjo8Y29uZmlnIG51bT4uPGludGVyZmFjZSBudW0+LzxoaWQtYnVzPjo8dmVuZG9yLWlkPjo8cHJvZHVjdC1pZD4uPG51bT4vcHlyYS9yb2NjYXRweXJhPG1pbm9yPi9wcm9maWxlWzEtNV1fYnV0dG9ucwogRGF0ZToJCUF1Z3VzdCAyMDEwCiBDb250YWN0OglTdGVmYW4gQWNoYXR6IDxlcmF6b3JfZGVAdXNlcnMuc291cmNlZm9yZ2UubmV0PgogRGVzY3JpcHRpb246CVRoZSBtb3VzZSBjYW4gc3RvcmUgNSBwcm9maWxlcyB3aGljaCBjYW4gYmUgc3dpdGNoZWQgYnkgdGhlCkBAIC03OSw3ICs3OSw3IEBACiAJCVRoZSByZXR1cm5lZCBkYXRhIGlzIDE5IGJ5dGVzIGluIHNpemUuCiAJCVRoaXMgZmlsZSBpcyByZWFkb25seS4KIAotV2hhdDoJCS9zeXMvYnVzL3VzYi9kZXZpY2VzLzxidXNudW0+LTxkZXZudW0+Ojxjb25maWcgbnVtPi48aW50ZXJmYWNlIG51bT4vc3RhcnR1cF9wcm9maWxlCitXaGF0OgkJL3N5cy9idXMvdXNiL2RldmljZXMvPGJ1c251bT4tPGRldm51bT46PGNvbmZpZyBudW0+LjxpbnRlcmZhY2UgbnVtPi88aGlkLWJ1cz46PHZlbmRvci1pZD46PHByb2R1Y3QtaWQ+LjxudW0+L3B5cmEvcm9jY2F0cHlyYTxtaW5vcj4vc3RhcnR1cF9wcm9maWxlCiBEYXRlOgkJQXVndXN0IDIwMTAKIENvbnRhY3Q6CVN0ZWZhbiBBY2hhdHogPGVyYXpvcl9kZUB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CiBEZXNjcmlwdGlvbjoJVGhlIGludGVnZXIgdmFsdWUgb2YgdGhpcyBhdHRyaWJ1dGUgcmFuZ2VzIGZyb20gMC00LgpAQCAtODcsNyArODcsNyBAQAogICAgICAgICAgICAgICAgIHRoYXQncyBhY3RpdmUgd2hlbiB0aGUgbW91c2UgaXMgcG93ZXJlZCBvbi4KIAkJVGhpcyBmaWxlIGlzIHJlYWRvbmx5LgogCi1XaGF0OgkJL3N5cy9idXMvdXNiL2RldmljZXMvPGJ1c251bT4tPGRldm51bT46PGNvbmZpZyBudW0+LjxpbnRlcmZhY2UgbnVtPi9zZXR0aW5ncworV2hhdDoJCS9zeXMvYnVzL3VzYi9kZXZpY2VzLzxidXNudW0+LTxkZXZudW0+Ojxjb25maWcgbnVtPi48aW50ZXJmYWNlIG51bT4vPGhpZC1idXM+Ojx2ZW5kb3ItaWQ+Ojxwcm9kdWN0LWlkPi48bnVtPi9weXJhL3JvY2NhdHB5cmE8bWlub3I+L3NldHRpbmdzCiBEYXRlOgkJQXVndXN0IDIwMTAKIENvbnRhY3Q6CVN0ZWZhbiBBY2hhdHogPGVyYXpvcl9kZUB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CiBEZXNjcmlwdGlvbjoJV2hlbiByZWFkLCB0aGlzIGZpbGUgcmV0dXJucyB0aGUgc2V0dGluZ3Mgc3RvcmVkIGluIHRoZSBtb3VzZS4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtcGxhdGZvcm0taWRlYXBhZC1sYXB0b3AgYi9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLXBsYXRmb3JtLWlkZWFwYWQtbGFwdG9wCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwN2ZjYTIKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLXBsYXRmb3JtLWlkZWFwYWQtbGFwdG9wCkBAIC0wLDAgKzEsNiBAQAorV2hhdDoJCS9zeXMvZGV2aWNlcy9wbGF0Zm9ybS9pZGVhcGFkL2NhbWVyYV9wb3dlcgorRGF0ZToJCURlYyAyMDEwCitLZXJuZWxWZXJzaW9uOgkyLjYuMzcKK0NvbnRhY3Q6CSJJa2UgUGFuaGMgPGlrZS5wYW5AY2Fub25pY2FsLmNvbT4iCitEZXNjcmlwdGlvbjoKKwkJQ29udHJvbCB0aGUgcG93ZXIgb2YgY2FtZXJhIG1vZHVsZS4gMSBtZWFucyBvbiwgMCBtZWFucyBvZmYuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2NvY2NpbmVsbGUudHh0IGIvRG9jdW1lbnRhdGlvbi9jb2NjaW5lbGxlLnR4dAppbmRleCA0YTI3NmVhLi45NmI2OTAzIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2NvY2NpbmVsbGUudHh0CisrKyBiL0RvY3VtZW50YXRpb24vY29jY2luZWxsZS50eHQKQEAgLTM2LDYgKzM2LDEwIEBACiAKICAgICAgICAgc3VkbyBtYWtlIGluc3RhbGwKIAorVGhlIHNlbWFudGljIHBhdGNoZXMgaW4gdGhlIGtlcm5lbCB3aWxsIHdvcmsgYmVzdCB3aXRoIENvY2NpbmVsbGUgdmVyc2lvbgorMC4yLjQgb3IgbGF0ZXIuICBVc2luZyBlYXJsaWVyIHZlcnNpb25zIG1heSBpbmN1ciBzb21lIHBhcnNlIGVycm9ycyBpbiB0aGUKK3NlbWFudGljIHBhdGNoIGNvZGUsIGJ1dCBhbnkgcmVzdWx0cyB0aGF0IGFyZSBvYnRhaW5lZCBzaG91bGQgc3RpbGwgYmUKK2NvcnJlY3QuCiAKICBVc2luZyBDb2NjaW5lbGxlIG9uIHRoZSBMaW51eCBrZXJuZWwKIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2h3bW9uL2RzNjIwIGIvRG9jdW1lbnRhdGlvbi9od21vbi9kczYyMApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZmJlM2NkCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9od21vbi9kczYyMApAQCAtMCwwICsxLDM0IEBACitLZXJuZWwgZHJpdmVyIGRzNjIwCis9PT09PT09PT09PT09PT09PT09CisKK1N1cHBvcnRlZCBjaGlwczoKKyAgKiBEYWxsYXMgU2VtaWNvbmR1Y3RvciBEUzYyMAorICAgIFByZWZpeDogJ2RzNjIwJworICAgIERhdGFzaGVldDogUHVibGljbHkgYXZhaWxhYmxlIGF0IHRoZSBEYWxsYXMgU2VtaWNvbmR1Y3RvciB3ZWJzaXRlCisgICAgICAgICAgICAgICBodHRwOi8vd3d3LmRhbHNlbWkuY29tLworCitBdXRob3JzOgorICAgICAgICBSb2xhbmQgU3RpZ2dlIDxzdGlnZ2VAYW50Y29tLmRlPgorICAgICAgICBiYXNlZCBvbiBkczE2MjEuYyBieQorICAgICAgICBDaHJpc3RpYW4gVy4gWnVja3NjaHdlcmR0IDx6YW55QHRyaXEubmV0PgorCitEZXNjcmlwdGlvbgorLS0tLS0tLS0tLS0KKworVGhlIERTNjIwIGlzIGEgKG9uZSBpbnN0YW5jZSkgZGlnaXRhbCB0aGVybW9tZXRlciBhbmQgdGhlcm1vc3RhdC4gSXQgaGFzIGJvdGgKK2hpZ2ggYW5kIGxvdyB0ZW1wZXJhdHVyZSBsaW1pdHMgd2hpY2ggY2FuIGJlIHVzZXIgZGVmaW5lZCAoaS5lLiAgcHJvZ3JhbW1lZAoraW50byBub24tdm9sYXRpbGUgb24tY2hpcCByZWdpc3RlcnMpLiBUZW1wZXJhdHVyZSByYW5nZSBpcyAtNTUgZGVncmVlIENlbHNpdXMKK3RvICsxMjUuIEJldHdlZW4gMCBhbmQgNzAgZGVncmVlIENlbHNpdXMsIGFjY3VyYWN5IGlzIDAuNSBLZWx2aW4uIFRoZSB2YWx1ZQorcmV0dXJuZWQgdmlhIHN5c2ZzIGRpc3BsYXlzIHBvc3QgZGVjaW1hbCBwb3NpdGlvbnMuCisKK1RoZSB0aGVybW9zdGF0IGZ1bmN0aW9uIHdvcmtzIGFzIGZvbGxvd3M6IFdoZW4gY29uZmlndXJlZCB2aWEgcGxhdGZvcm1fZGF0YQorKHN0cnVjdCBkczYyMF9wbGF0Zm9ybV9kYXRhKSAucG9tb2RlID09IDAgKGRlZmF1bHQpLCB0aGUgdGhlcm1vc3RhdCBvdXRwdXQgcGluCitQTyBpcyBhbHdheXMgbG93LiBJZiAucG9tb2RlID09IDEsIHRoZSB0aGVybW9zdGF0IGlzIGluIFBPX0xPVyBtb2RlLiBJLmUuLCB0aGUKK291dHB1dCBwaW4gUE8gYmVjb21lcyBhY3RpdmUgd2hlbiB0aGUgdGVtcGVyYXR1cmUgZmFsbHMgYmVsb3cgdGVtcDFfbWluIGFuZAorc3RheXMgYWN0aXZlIHVudGlsIHRoZSB0ZW1wZXJhdHVyZSBnb2VzIGFib3ZlIHRlbXAxX21heC4KKworTGlrZXdpc2UsIHdpdGggLnBvbW9kZSA9PSAyLCB0aGUgdGhlcm1vc3RhdCBpcyBpbiBQT19ISUdIIG1vZGUuIEkuZS4sIHRoZSBQTworb3V0cHV0IHBpbiBiZWNvbWVzIGFjdGl2ZSB3aGVuIHRoZSB0ZW1wZXJhdHVyZSBnb2VzIGFib3ZlIHRlbXAxX21heCBhbmQgc3RheXMKK2FjdGl2ZSB1bnRpbCB0aGUgdGVtcGVyYXR1cmUgZmFsbHMgYmVsb3cgdGVtcDFfbWluLgorCitUaGUgUE8gb3V0cHV0IHBpbiBvZiB0aGUgRFM2MjAgb3BlcmF0ZXMgYWN0aXZlLWxvdy4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaHdtb24vc2h0MjEgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL3NodDIxCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiMTdmZGEKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL3NodDIxCkBAIC0wLDAgKzEsNDkgQEAKK0tlcm5lbCBkcml2ZXIgc2h0MjEKKz09PT09PT09PT09PT09PT09PT0KKworU3VwcG9ydGVkIGNoaXBzOgorICAqIFNlbnNpcmlvbiBTSFQyMQorICAgIFByZWZpeDogJ3NodDIxJworICAgIEFkZHJlc3NlcyBzY2FubmVkOiBub25lCisgICAgRGF0YXNoZWV0OiBQdWJsaWNseSBhdmFpbGFibGUgYXQgdGhlIFNlbnNpcmlvbiB3ZWJzaXRlCisgICAgaHR0cDovL3d3dy5zZW5zaXJpb24uY29tL2VuL3BkZi9wcm9kdWN0X2luZm9ybWF0aW9uL0RhdGFzaGVldC1odW1pZGl0eS1zZW5zb3ItU0hUMjEucGRmCisKKyAgKiBTZW5zaXJpb24gU0hUMjUKKyAgICBQcmVmaXg6ICdzaHQyMScKKyAgICBBZGRyZXNzZXMgc2Nhbm5lZDogbm9uZQorICAgIERhdGFzaGVldDogUHVibGljbHkgYXZhaWxhYmxlIGF0IHRoZSBTZW5zaXJpb24gd2Vic2l0ZQorICAgIGh0dHA6Ly93d3cuc2Vuc2lyaW9uLmNvbS9lbi9wZGYvcHJvZHVjdF9pbmZvcm1hdGlvbi9EYXRhc2hlZXQtaHVtaWRpdHktc2Vuc29yLVNIVDI1LnBkZgorCitBdXRob3I6CisgIFVycyBGbGVpc2NoIDx1cnMuZmxlaXNjaEBzZW5zaXJpb24uY29tPgorCitEZXNjcmlwdGlvbgorLS0tLS0tLS0tLS0KKworVGhlIFNIVDIxIGFuZCBTSFQyNSBhcmUgaHVtaWRpdHkgYW5kIHRlbXBlcmF0dXJlIHNlbnNvcnMgaW4gYSBERk4gcGFja2FnZSBvZgorb25seSAzIHggMyBtbSBmb290cHJpbnQgYW5kIDEuMSBtbSBoZWlnaHQuIFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHR3bworZGV2aWNlcyBpcyB0aGUgaGlnaGVyIGxldmVsIG9mIHByZWNpc2lvbiBvZiB0aGUgU0hUMjUgKDEuOCUgcmVsYXRpdmUgaHVtaWRpdHksCiswLjIgZGVncmVlIENlbHNpdXMpIGNvbXBhcmVkIHdpdGggdGhlIFNIVDIxICgyLjAlIHJlbGF0aXZlIGh1bWlkaXR5LAorMC4zIGRlZ3JlZSBDZWxzaXVzKS4KKworVGhlIGRldmljZXMgY29tbXVuaWNhdGUgd2l0aCB0aGUgSTJDIHByb3RvY29sLiBBbGwgc2Vuc29ycyBhcmUgc2V0IHRvIHRoZSBzYW1lCitJMkMgYWRkcmVzcyAweDQwLCBzbyBhbiBlbnRyeSB3aXRoIEkyQ19CT0FSRF9JTkZPKCJzaHQyMSIsIDB4NDApIGNhbiBiZSB1c2VkCitpbiB0aGUgYm9hcmQgc2V0dXAgY29kZS4KKworc3lzZnMtSW50ZXJmYWNlCistLS0tLS0tLS0tLS0tLS0KKwordGVtcDFfaW5wdXQgLSB0ZW1wZXJhdHVyZSBpbnB1dAoraHVtaWRpdHkxX2lucHV0IC0gaHVtaWRpdHkgaW5wdXQKKworTm90ZXMKKy0tLS0tCisKK1RoZSBkcml2ZXIgdXNlcyB0aGUgZGVmYXVsdCByZXNvbHV0aW9uIHNldHRpbmdzIG9mIDEyIGJpdCBmb3IgaHVtaWRpdHkgYW5kIDE0CitiaXQgZm9yIHRlbXBlcmF0dXJlLCB3aGljaCByZXN1bHRzIGluIHR5cGljYWwgbWVhc3VyZW1lbnQgdGltZXMgb2YgMjIgbXMgZm9yCitodW1pZGl0eSBhbmQgNjYgbXMgZm9yIHRlbXBlcmF0dXJlLiBUbyBrZWVwIHNlbGYgaGVhdGluZyBiZWxvdyAwLjEgZGVncmVlCitDZWxzaXVzLCB0aGUgZGV2aWNlIHNob3VsZCBub3QgYmUgYWN0aXZlIGZvciBtb3JlIHRoYW4gMTAlIG9mIHRoZSB0aW1lLAorZS5nLiBtYXhpbXVtIHR3byBtZWFzdXJlbWVudHMgcGVyIHNlY29uZCBhdCB0aGUgZ2l2ZW4gcmVzb2x1dGlvbi4KKworRGlmZmVyZW50IHJlc29sdXRpb25zLCB0aGUgb24tY2hpcCBoZWF0ZXIsIHVzaW5nIHRoZSBDUkMgY2hlY2tzdW0gYW5kIHJlYWRpbmcKK3RoZSBzZXJpYWwgbnVtYmVyIGFyZSBub3Qgc3VwcG9ydGVkIHlldC4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaHdtb24vc3lzZnMtaW50ZXJmYWNlIGIvRG9jdW1lbnRhdGlvbi9od21vbi9zeXNmcy1pbnRlcmZhY2UKaW5kZXggNjQ1Njk5MC4uYzY1NTlmMSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9od21vbi9zeXNmcy1pbnRlcmZhY2UKKysrIGIvRG9jdW1lbnRhdGlvbi9od21vbi9zeXNmcy1pbnRlcmZhY2UKQEAgLTM4NCwxMCArMzg0LDIwIEBACiAJCVVuaXQ6IG1pbGxpYW1wZXJlCiAJCVJXCiAKK2N1cnJbMS0qXV9sY3JpdAlDdXJyZW50IGNyaXRpY2FsIGxvdyB2YWx1ZQorCQlVbml0OiBtaWxsaWFtcGVyZQorCQlSVworCitjdXJyWzEtKl1fY3JpdAlDdXJyZW50IGNyaXRpY2FsIGhpZ2ggdmFsdWUuCisJCVVuaXQ6IG1pbGxpYW1wZXJlCisJCVJXCisKIGN1cnJbMS0qXV9pbnB1dAlDdXJyZW50IGlucHV0IHZhbHVlCiAJCVVuaXQ6IG1pbGxpYW1wZXJlCiAJCVJPCiAKK0Fsc28gc2VlIHRoZSBBbGFybXMgc2VjdGlvbiBmb3Igc3RhdHVzIGZsYWdzIGFzc29jaWF0ZWQgd2l0aCBjdXJyZW50cy4KKwogKioqKioqKioqCiAqIFBvd2VyICoKICoqKioqKioqKgpAQCAtNDUwLDEzICs0NjAsNiBAQAogCQkJCVVuaXQ6IFBlcmNlbnQKIAkJCQlSTwogCi1wb3dlclsxLSpdX2FsYXJtCQkxIGlmIHRoZSBzeXN0ZW0gaXMgZHJhd2luZyBtb3JlIHBvd2VyIHRoYW4gdGhlCi0JCQkJY2FwIGFsbG93czsgMCBvdGhlcndpc2UuICBBIHBvbGwgbm90aWZpY2F0aW9uIGlzCi0JCQkJc2VudCB0byB0aGlzIGZpbGUgd2hlbiB0aGUgcG93ZXIgdXNlIGV4Y2VlZHMgdGhlCi0JCQkJY2FwLiAgVGhpcyBmaWxlIG9ubHkgYXBwZWFycyBpZiB0aGUgY2FwIGlzIGtub3duCi0JCQkJdG8gYmUgZW5mb3JjZWQgYnkgaGFyZHdhcmUuCi0JCQkJUk8KLQogcG93ZXJbMS0qXV9jYXAJCQlJZiBwb3dlciB1c2UgcmlzZXMgYWJvdmUgdGhpcyBsaW1pdCwgdGhlCiAJCQkJc3lzdGVtIHNob3VsZCB0YWtlIGFjdGlvbiB0byByZWR1Y2UgcG93ZXIgdXNlLgogCQkJCUEgcG9sbCBub3RpZmljYXRpb24gaXMgc2VudCB0byB0aGlzIGZpbGUgaWYgdGhlCkBAIC00NzksNiArNDgyLDIwIEBACiAJCQkJVW5pdDogbWljcm9XYXR0CiAJCQkJUk8KIAorcG93ZXJbMS0qXV9tYXgJCQlNYXhpbXVtIHBvd2VyLgorCQkJCVVuaXQ6IG1pY3JvV2F0dAorCQkJCVJXCisKK3Bvd2VyWzEtKl1fY3JpdAkJCUNyaXRpY2FsIG1heGltdW0gcG93ZXIuCisJCQkJSWYgcG93ZXIgcmlzZXMgdG8gb3IgYWJvdmUgdGhpcyBsaW1pdCwgdGhlCisJCQkJc3lzdGVtIGlzIGV4cGVjdGVkIHRha2UgZHJhc3RpYyBhY3Rpb24gdG8gcmVkdWNlCisJCQkJcG93ZXIgY29uc3VtcHRpb24sIHN1Y2ggYXMgYSBzeXN0ZW0gc2h1dGRvd24gb3IKKwkJCQlhIGZvcmNlZCBwb3dlcmRvd24gb2Ygc29tZSBkZXZpY2VzLgorCQkJCVVuaXQ6IG1pY3JvV2F0dAorCQkJCVJXCisKK0Fsc28gc2VlIHRoZSBBbGFybXMgc2VjdGlvbiBmb3Igc3RhdHVzIGZsYWdzIGFzc29jaWF0ZWQgd2l0aCBwb3dlciByZWFkaW5ncy4KKwogKioqKioqKioqKgogKiBFbmVyZ3kgKgogKioqKioqKioqKgpAQCAtNDg4LDYgKzUwNSwxNSBAQAogCQkJCVJPCiAKIAorKioqKioqKioqKioqCisqIEh1bWlkaXR5ICoKKyoqKioqKioqKioqKgorCitodW1pZGl0eVsxLSpdX2lucHV0CQlIdW1pZGl0eQorCQkJCVVuaXQ6IG1pbGxpLXBlcmNlbnQgKHBlciBjZW50IG1pbGxlLCBwY20pCisJCQkJUk8KKworCiAqKioqKioqKioqCiAqIEFsYXJtcyAqCiAqKioqKioqKioqCkBAIC01MDEsNiArNTI3LDcgQEAKIAogaW5bMC0qXV9hbGFybQogY3VyclsxLSpdX2FsYXJtCitwb3dlclsxLSpdX2FsYXJtCiBmYW5bMS0qXV9hbGFybQogdGVtcFsxLSpdX2FsYXJtCiAJCUNoYW5uZWwgYWxhcm0KQEAgLTUxMiwxMiArNTM5LDIwIEBACiAKIGluWzAtKl1fbWluX2FsYXJtCiBpblswLSpdX21heF9hbGFybQoraW5bMC0qXV9sY3JpdF9hbGFybQoraW5bMC0qXV9jcml0X2FsYXJtCiBjdXJyWzEtKl1fbWluX2FsYXJtCiBjdXJyWzEtKl1fbWF4X2FsYXJtCitjdXJyWzEtKl1fbGNyaXRfYWxhcm0KK2N1cnJbMS0qXV9jcml0X2FsYXJtCitwb3dlclsxLSpdX2NhcF9hbGFybQorcG93ZXJbMS0qXV9tYXhfYWxhcm0KK3Bvd2VyWzEtKl1fY3JpdF9hbGFybQogZmFuWzEtKl1fbWluX2FsYXJtCiBmYW5bMS0qXV9tYXhfYWxhcm0KIHRlbXBbMS0qXV9taW5fYWxhcm0KIHRlbXBbMS0qXV9tYXhfYWxhcm0KK3RlbXBbMS0qXV9sY3JpdF9hbGFybQogdGVtcFsxLSpdX2NyaXRfYWxhcm0KIHRlbXBbMS0qXV9lbWVyZ2VuY3lfYWxhcm0KIAkJTGltaXQgYWxhcm0KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaTJjL211eGVzL2dwaW8taTJjbXV4IGIvRG9jdW1lbnRhdGlvbi9pMmMvbXV4ZXMvZ3Bpby1pMmNtdXgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODExY2Q3OAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vaTJjL211eGVzL2dwaW8taTJjbXV4CkBAIC0wLDAgKzEsNjUgQEAKK0tlcm5lbCBkcml2ZXIgZ3Bpby1pMmNtdXgKKworQXV0aG9yOiBQZXRlciBLb3JzZ2FhcmQgPHBldGVyLmtvcnNnYWFyZEBiYXJjby5jb20+CisKK0Rlc2NyaXB0aW9uCistLS0tLS0tLS0tLQorCitncGlvLWkyY211eCBpcyBhbiBpMmMgbXV4IGRyaXZlciBwcm92aWRpbmcgYWNjZXNzIHRvIEkyQyBidXMgc2VnbWVudHMKK2Zyb20gYSBtYXN0ZXIgSTJDIGJ1cyBhbmQgYSBoYXJkd2FyZSBNVVggY29udHJvbGxlZCB0aHJvdWdoIEdQSU8gcGlucy4KKworRS5HLjoKKworICAtLS0tLS0tLS0tICAgICAgICAgICAgICAtLS0tLS0tLS0tICBCdXMgc2VnbWVudCAxICAgLSAtIC0gLSAtCisgfCAgICAgICAgICB8IFNDTC9TREEgICAgfCAgICAgICAgICB8LS0tLS0tLS0tLS0tLS0gfCAgICAgICAgICAgfAorIHwgICAgICAgICAgfC0tLS0tLS0tLS0tLXwgICAgICAgICAgfAorIHwgICAgICAgICAgfCAgICAgICAgICAgIHwgICAgICAgICAgfCBCdXMgc2VnbWVudCAyIHwgICAgICAgICAgIHwKKyB8ICBMaW51eCAgIHwgR1BJTyAxLi5OICB8ICAgTVVYICAgIHwtLS0tLS0tLS0tLS0tLS0gICBEZXZpY2VzCisgfCAgICAgICAgICB8LS0tLS0tLS0tLS0tfCAgICAgICAgICB8ICAgICAgICAgICAgICAgfCAgICAgICAgICAgfAorIHwgICAgICAgICAgfCAgICAgICAgICAgIHwgICAgICAgICAgfCBCdXMgc2VnbWVudCBNCisgfCAgICAgICAgICB8ICAgICAgICAgICAgfCAgICAgICAgICB8LS0tLS0tLS0tLS0tLS0tfCAgICAgICAgICAgfAorICAtLS0tLS0tLS0tICAgICAgICAgICAgICAtLS0tLS0tLS0tICAgICAgICAgICAgICAgICAgLSAtIC0gLSAtCisKK1NDTC9TREEgb2YgdGhlIG1hc3RlciBJMkMgYnVzIGlzIG11bHRpcGxleGVkIHRvIGJ1cyBzZWdtZW50IDEuLk0KK2FjY29yZGluZyB0byB0aGUgc2V0dGluZ3Mgb2YgdGhlIEdQSU8gcGlucyAxLi5OLgorCitVc2FnZQorLS0tLS0KKworZ3Bpby1pMmNtdXggdXNlcyB0aGUgcGxhdGZvcm0gYnVzLCBzbyB5b3UgbmVlZCB0byBwcm92aWRlIGEgc3RydWN0CitwbGF0Zm9ybV9kZXZpY2Ugd2l0aCB0aGUgcGxhdGZvcm1fZGF0YSBwb2ludGluZyB0byBhIHN0cnVjdAorZ3Bpb19pMmNtdXhfcGxhdGZvcm1fZGF0YSB3aXRoIHRoZSBJMkMgYWRhcHRlciBudW1iZXIgb2YgdGhlIG1hc3RlcgorYnVzLCB0aGUgbnVtYmVyIG9mIGJ1cyBzZWdtZW50cyB0byBjcmVhdGUgYW5kIHRoZSBHUElPIHBpbnMgdXNlZAordG8gY29udHJvbCBpdC4gU2VlIGluY2x1ZGUvbGludXgvZ3Bpby1pMmNtdXguaCBmb3IgZGV0YWlscy4KKworRS5HLiBzb21ldGhpbmcgbGlrZSB0aGlzIGZvciBhIE1VWCBwcm92aWRpbmcgNCBidXMgc2VnbWVudHMKK2NvbnRyb2xsZWQgdGhyb3VnaCAzIEdQSU8gcGluczoKKworI2luY2x1ZGUgPGxpbnV4L2dwaW8taTJjbXV4Lmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBteWJvYXJkX2dwaW9tdXhfZ3Bpb3NbXSA9IHsKKwlBVDkxX1BJTl9QQzI2LCBBVDkxX1BJTl9QQzI1LCBBVDkxX1BJTl9QQzI0Cit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgbXlib2FyZF9ncGlvbXV4X3ZhbHVlc1tdID0geworCTAsIDEsIDIsIDMKK307CisKK3N0YXRpYyBzdHJ1Y3QgZ3Bpb19pMmNtdXhfcGxhdGZvcm1fZGF0YSBteWJvYXJkX2kyY211eF9kYXRhID0geworCS5wYXJlbnQJCT0gMSwKKwkuYmFzZV9ucgk9IDIsIC8qIG9wdGlvbmFsICovCisJLnZhbHVlcwkJPSBteWJvYXJkX2dwaW9tdXhfdmFsdWVzLAorCS5uX3ZhbHVlcwk9IEFSUkFZX1NJWkUobXlib2FyZF9ncGlvbXV4X3ZhbHVlcyksCisJLmdwaW9zCQk9IG15Ym9hcmRfZ3Bpb211eF9ncGlvcywKKwkubl9ncGlvcwk9IEFSUkFZX1NJWkUobXlib2FyZF9ncGlvbXV4X2dwaW9zKSwKKwkuaWRsZQkJPSA0LCAvKiBvcHRpb25hbCAqLworfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgbXlib2FyZF9pMmNtdXggPSB7CisJLm5hbWUJCT0gImdwaW8taTJjbXV4IiwKKwkuaWQJCT0gMCwKKwkuZGV2CQk9IHsKKwkJLnBsYXRmb3JtX2RhdGEJPSAmbXlib2FyZF9pMmNtdXhfZGF0YSwKKwl9LAorfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24va2J1aWxkL2tidWlsZC50eHQgYi9Eb2N1bWVudGF0aW9uL2tidWlsZC9rYnVpbGQudHh0CmluZGV4IDFlNTE2NWEuLjRhOTkwMzEgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24va2J1aWxkL2tidWlsZC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9rYnVpbGQva2J1aWxkLnR4dApAQCAtNzMsNiArNzMsMTQgQEAKIFRoZSBvdXRwdXQgZGlyZWN0b3J5IGNhbiBhbHNvIGJlIHNwZWNpZmllZCB1c2luZyAiTz0uLi4iLgogU2V0dGluZyAiTz0uLi4iIHRha2VzIHByZWNlZGVuY2Ugb3ZlciBLQlVJTERfT1VUUFVULgogCitLQlVJTERfREVCQVJDSAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0ZvciB0aGUgZGViLXBrZyB0YXJnZXQsIGFsbG93cyBvdmVycmlkaW5nIHRoZSBub3JtYWwgaGV1cmlzdGljcyBkZXBsb3llZCBieQorZGViLXBrZy4gTm9ybWFsbHkgZGViLXBrZyBhdHRlbXB0cyB0byBndWVzcyB0aGUgcmlnaHQgYXJjaGl0ZWN0dXJlIGJhc2VkIG9uCit0aGUgVVRTX01BQ0hJTkUgdmFyaWFibGUsIGFuZCBvbiBzb21lIGFyY2hpdGVjdHVyZXMgYWxzbyB0aGUga2VybmVsIGNvbmZpZy4KK1RoZSB2YWx1ZSBvZiBLQlVJTERfREVCQVJDSCBpcyBhc3N1bWVkIChub3QgY2hlY2tlZCkgdG8gYmUgYSB2YWxpZCBEZWJpYW4KK2FyY2hpdGVjdHVyZS4KKwogQVJDSAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNldCBBUkNIIHRvIHRoZSBhcmNoaXRlY3R1cmUgdG8gYmUgYnVpbHQuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2tidWlsZC9rY29uZmlnLWxhbmd1YWdlLnR4dCBiL0RvY3VtZW50YXRpb24va2J1aWxkL2tjb25maWctbGFuZ3VhZ2UudHh0CmluZGV4IDJmZTkzY2EuLmI1MDdkNjEgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24va2J1aWxkL2tjb25maWctbGFuZ3VhZ2UudHh0CisrKyBiL0RvY3VtZW50YXRpb24va2J1aWxkL2tjb25maWctbGFuZ3VhZ2UudHh0CkBAIC0xMTIsNyArMTEyLDYgQEAKIAkobm8gcHJvbXB0cyBhbnl3aGVyZSkgYW5kIGZvciBzeW1ib2xzIHdpdGggbm8gZGVwZW5kZW5jaWVzLgogCVRoYXQgd2lsbCBsaW1pdCB0aGUgdXNlZnVsbmVzcyBidXQgb24gdGhlIG90aGVyIGhhbmQgYXZvaWQKIAl0aGUgaWxsZWdhbCBjb25maWd1cmF0aW9ucyBhbGwgb3Zlci4KLQlrY29uZmlnIHNob3VsZCBvbmUgZGF5IHdhcm4gYWJvdXQgc3VjaCB0aGluZ3MuCiAKIC0gbnVtZXJpY2FsIHJhbmdlczogInJhbmdlIiA8c3ltYm9sPiA8c3ltYm9sPiBbImlmIiA8ZXhwcj5dCiAgIFRoaXMgYWxsb3dzIHRvIGxpbWl0IHRoZSByYW5nZSBvZiBwb3NzaWJsZSBpbnB1dCB2YWx1ZXMgZm9yIGludApAQCAtMjY4LDcgKzI2Nyw3IEBACiAKIGNob2ljZXM6CiAKLQkiY2hvaWNlIgorCSJjaG9pY2UiIFtzeW1ib2xdCiAJPGNob2ljZSBvcHRpb25zPgogCTxjaG9pY2UgYmxvY2s+CiAJImVuZGNob2ljZSIKQEAgLTI4Miw2ICsyODEsMTAgQEAKIGNhbiBiZSBjb21waWxlZCBhcyBtb2R1bGVzLgogQSBjaG9pY2UgYWNjZXB0cyBhbm90aGVyIG9wdGlvbiAib3B0aW9uYWwiLCB3aGljaCBhbGxvd3MgdG8gc2V0IHRoZQogY2hvaWNlIHRvICduJyBhbmQgbm8gZW50cnkgbmVlZHMgdG8gYmUgc2VsZWN0ZWQuCitJZiBubyBbc3ltYm9sXSBpcyBhc3NvY2lhdGVkIHdpdGggYSBjaG9pY2UsIHRoZW4geW91IGNhbiBub3QgaGF2ZSBtdWx0aXBsZQorZGVmaW5pdGlvbnMgb2YgdGhhdCBjaG9pY2UuIElmIGEgW3N5bWJvbF0gaXMgYXNzb2NpYXRlZCB0byB0aGUgY2hvaWNlLAordGhlbiB5b3UgbWF5IGRlZmluZSB0aGUgc2FtZSBjaG9pY2UgKGllLiB3aXRoIHRoZSBzYW1lIGVudHJpZXMpIGluIGFub3RoZXIKK3BsYWNlLgogCiBjb21tZW50OgogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2tidWlsZC9tYWtlZmlsZXMudHh0IGIvRG9jdW1lbnRhdGlvbi9rYnVpbGQvbWFrZWZpbGVzLnR4dAppbmRleCAwZWYwMGJkLi44NmUzY2QwIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2tidWlsZC9tYWtlZmlsZXMudHh0CisrKyBiL0RvY3VtZW50YXRpb24va2J1aWxkL21ha2VmaWxlcy50eHQKQEAgLTExMzYsNiArMTEzNiwyMSBAQAogCSAgICAgIHJlc3VsdGluZyBpbiB0aGUgdGFyZ2V0IGZpbGUgYmVpbmcgcmVjb21waWxlZCBmb3Igbm8KIAkgICAgICBvYnZpb3VzIHJlYXNvbi4KIAorICAgIGR0YworCUNyZWF0ZSBmbGF0dGVuZCBkZXZpY2UgdHJlZSBibG9iIG9iamVjdCBzdWl0YWJsZSBmb3IgbGlua2luZworCWludG8gdm1saW51eC4gRGV2aWNlIHRyZWUgYmxvYnMgbGlua2VkIGludG8gdm1saW51eCBhcmUgcGxhY2VkCisJaW4gYW4gaW5pdCBzZWN0aW9uIGluIHRoZSBpbWFnZS4gUGxhdGZvcm0gY29kZSAqbXVzdCogY29weSB0aGUKKwlibG9iIHRvIG5vbi1pbml0IG1lbW9yeSBwcmlvciB0byBjYWxsaW5nIHVuZmxhdHRlbl9kZXZpY2VfdHJlZSgpLgorCisJRXhhbXBsZToKKwkJI2FyY2gveDg2L3BsYXRmb3JtL2NlNDEwMC9NYWtlZmlsZQorCQljbGVhbi1maWxlcyA6PSAqZHRiLlMKKworCQlEVENfRkxBR1MgOj0gLXAgMTAyNAorCQlvYmoteSArPSBmb28uZHRiLm8KKworCQkkKG9iaikvJS5kdGI6ICQoc3JjKS8lLmR0cworCQkJJChjYWxsIGNtZCxkdGMpCiAKIC0tLSA2LjcgQ3VzdG9tIGtidWlsZCBjb21tYW5kcwogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2tlcm5lbC1wYXJhbWV0ZXJzLnR4dCBiL0RvY3VtZW50YXRpb24va2VybmVsLXBhcmFtZXRlcnMudHh0CmluZGV4IGYzZGM5NTEuLmVkMzcwOGYgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24va2VybmVsLXBhcmFtZXRlcnMudHh0CisrKyBiL0RvY3VtZW50YXRpb24va2VybmVsLXBhcmFtZXRlcnMudHh0CkBAIC00MDMsNiArNDAzLDEwIEBACiAJYnR0di5wbGw9CVNlZSBEb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L2J0dHYvSW5zbW9kLW9wdGlvbnMKIAlidHR2LnR1bmVyPQlhbmQgRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9idHR2L0NBUkRMSVNUCiAKKwlidWxrX3JlbW92ZT1vZmYJW1BQQ10gIFRoaXMgcGFyYW1ldGVyIGRpc2FibGVzIHRoZSB1c2Ugb2YgdGhlIHBTZXJpZXMKKwkJCWZpcm13YXJlIGZlYXR1cmUgZm9yIGZsdXNoaW5nIG11bHRpcGxlIGhwdGUgZW50cmllcworCQkJYXQgYSB0aW1lLgorCiAJYzEwMT0JCVtORVRdIE1veGEgQzEwMSBzeW5jaHJvbm91cyBzZXJpYWwgY2FyZAogCiAJY2FjaGVzaXplPQlbQlVHUz1YODYtMzJdIE92ZXJyaWRlIGxldmVsIDIgQ1BVIGNhY2hlIHNpemUgZGV0ZWN0aW9uLgpAQCAtMTQ5MCw2ICsxNDk0LDEwIEBACiAJbXRkcGFydHM9CVtNVERdCiAJCQlTZWUgZHJpdmVycy9tdGQvY21kbGluZXBhcnQuYy4KIAorCW11bHRpdGNlPW9mZglbUFBDXSAgVGhpcyBwYXJhbWV0ZXIgZGlzYWJsZXMgdGhlIHVzZSBvZiB0aGUgcFNlcmllcworCQkJZmlybXdhcmUgZmVhdHVyZSBmb3IgdXBkYXRpbmcgbXVsdGlwbGUgVENFIGVudHJpZXMKKwkJCWF0IGEgdGltZS4KKwogCW9uZW5hbmQuYmRyeT0JW0hXLE1URF0gRmxleC1PbmVOQU5EIEJvdW5kYXJ5IENvbmZpZ3VyYXRpb24KIAogCQkJRm9ybWF0OiBbZGllMF9ib3VuZGFyeV1bLGRpZTBfbG9ja11bLGRpZTFfYm91bmRhcnldWyxkaWUxX2xvY2tdCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2tleXMtdHJ1c3RlZC1lbmNyeXB0ZWQudHh0IGIvRG9jdW1lbnRhdGlvbi9rZXlzLXRydXN0ZWQtZW5jcnlwdGVkLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZmI3OWJjCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9rZXlzLXRydXN0ZWQtZW5jcnlwdGVkLnR4dApAQCAtMCwwICsxLDE0NSBAQAorCQkJVHJ1c3RlZCBhbmQgRW5jcnlwdGVkIEtleXMKKworVHJ1c3RlZCBhbmQgRW5jcnlwdGVkIEtleXMgYXJlIHR3byBuZXcga2V5IHR5cGVzIGFkZGVkIHRvIHRoZSBleGlzdGluZyBrZXJuZWwKK2tleSByaW5nIHNlcnZpY2UuICBCb3RoIG9mIHRoZXNlIG5ldyB0eXBlcyBhcmUgdmFyaWFibGUgbGVuZ3RoIHN5bW1ldGljIGtleXMsCithbmQgaW4gYm90aCBjYXNlcyBhbGwga2V5cyBhcmUgY3JlYXRlZCBpbiB0aGUga2VybmVsLCBhbmQgdXNlciBzcGFjZSBzZWVzLAorc3RvcmVzLCBhbmQgbG9hZHMgb25seSBlbmNyeXB0ZWQgYmxvYnMuICBUcnVzdGVkIEtleXMgcmVxdWlyZSB0aGUgYXZhaWxhYmlsaXR5CitvZiBhIFRydXN0ZWQgUGxhdGZvcm0gTW9kdWxlIChUUE0pIGNoaXAgZm9yIGdyZWF0ZXIgc2VjdXJpdHksIHdoaWxlIEVuY3J5cHRlZAorS2V5cyBjYW4gYmUgdXNlZCBvbiBhbnkgc3lzdGVtLiAgQWxsIHVzZXIgbGV2ZWwgYmxvYnMsIGFyZSBkaXNwbGF5ZWQgYW5kIGxvYWRlZAoraW4gaGV4IGFzY2lpIGZvciBjb252ZW5pZW5jZSwgYW5kIGFyZSBpbnRlZ3JpdHkgdmVyaWZpZWQuCisKK1RydXN0ZWQgS2V5cyB1c2UgYSBUUE0gYm90aCB0byBnZW5lcmF0ZSBhbmQgdG8gc2VhbCB0aGUga2V5cy4gIEtleXMgYXJlIHNlYWxlZAordW5kZXIgYSAyMDQ4IGJpdCBSU0Ega2V5IGluIHRoZSBUUE0sIGFuZCBvcHRpb25hbGx5IHNlYWxlZCB0byBzcGVjaWZpZWQgUENSCisoaW50ZWdyaXR5IG1lYXN1cmVtZW50KSB2YWx1ZXMsIGFuZCBvbmx5IHVuc2VhbGVkIGJ5IHRoZSBUUE0sIGlmIFBDUnMgYW5kIGJsb2IKK2ludGVncml0eSB2ZXJpZmljYXRpb25zIG1hdGNoLiAgQSBsb2FkZWQgVHJ1c3RlZCBLZXkgY2FuIGJlIHVwZGF0ZWQgd2l0aCBuZXcKKyhmdXR1cmUpIFBDUiB2YWx1ZXMsIHNvIGtleXMgYXJlIGVhc2lseSBtaWdyYXRlZCB0byBuZXcgcGNyIHZhbHVlcywgc3VjaCBhcword2hlbiB0aGUga2VybmVsIGFuZCBpbml0cmFtZnMgYXJlIHVwZGF0ZWQuICBUaGUgc2FtZSBrZXkgY2FuIGhhdmUgbWFueSBzYXZlZAorYmxvYnMgdW5kZXIgZGlmZmVyZW50IFBDUiB2YWx1ZXMsIHNvIG11bHRpcGxlIGJvb3RzIGFyZSBlYXNpbHkgc3VwcG9ydGVkLgorCitCeSBkZWZhdWx0LCB0cnVzdGVkIGtleXMgYXJlIHNlYWxlZCB1bmRlciB0aGUgU1JLLCB3aGljaCBoYXMgdGhlIGRlZmF1bHQKK2F1dGhvcml6YXRpb24gdmFsdWUgKDIwIHplcm9zKS4gIFRoaXMgY2FuIGJlIHNldCBhdCB0YWtlb3duZXJzaGlwIHRpbWUgd2l0aCB0aGUKK3Ryb3VzZXIncyB1dGlsaXR5OiAidHBtX3Rha2Vvd25lcnNoaXAgLXUgLXoiLgorCitVc2FnZToKKyAgICBrZXljdGwgYWRkIHRydXN0ZWQgbmFtZSAibmV3IGtleWxlbiBbb3B0aW9uc10iIHJpbmcKKyAgICBrZXljdGwgYWRkIHRydXN0ZWQgbmFtZSAibG9hZCBoZXhfYmxvYiBbcGNybG9jaz1wY3JudW1dIiByaW5nCisgICAga2V5Y3RsIHVwZGF0ZSBrZXkgInVwZGF0ZSBbb3B0aW9uc10iCisgICAga2V5Y3RsIHByaW50IGtleWlkCisKKyAgICBvcHRpb25zOgorICAgICAgIGtleWhhbmRsZT0gYXNjaWkgaGV4IHZhbHVlIG9mIHNlYWxpbmcga2V5IGRlZmF1bHQgMHg0MDAwMDAwMCAoU1JLKQorICAgICAgIGtleWF1dGg9CSAgYXNjaWkgaGV4IGF1dGggZm9yIHNlYWxpbmcga2V5IGRlZmF1bHQgMHgwMC4uLmkKKwkJICAoNDAgYXNjaWkgemVyb3MpCisgICAgICAgYmxvYmF1dGg9ICBhc2NpaSBoZXggYXV0aCBmb3Igc2VhbGVkIGRhdGEgZGVmYXVsdCAweDAwLi4uCisJCSAgKDQwIGFzY2lpIHplcm9zKQorICAgICAgIGJsb2JhdXRoPSAgYXNjaWkgaGV4IGF1dGggZm9yIHNlYWxlZCBkYXRhIGRlZmF1bHQgMHgwMC4uLgorCQkgICg0MCBhc2NpaSB6ZXJvcykKKyAgICAgICBwY3JpbmZvPQkgIGFzY2lpIGhleCBvZiBQQ1JfSU5GTyBvciBQQ1JfSU5GT19MT05HIChubyBkZWZhdWx0KQorICAgICAgIHBjcmxvY2s9CSAgcGNyIG51bWJlciB0byBiZSBleHRlbmRlZCB0byAibG9jayIgYmxvYgorICAgICAgIG1pZ3JhdGFibGU9IDB8MSBpbmRpY2F0aW5nIHBlcm1pc3Npb24gdG8gcmVzZWFsIHRvIG5ldyBQQ1IgdmFsdWVzLAorICAgICAgICAgICAgICAgICAgIGRlZmF1bHQgMSAocmVzZWFsaW5nIGFsbG93ZWQpCisKKyJrZXljdGwgcHJpbnQiIHJldHVybnMgYW4gYXNjaWkgaGV4IGNvcHkgb2YgdGhlIHNlYWxlZCBrZXksIHdoaWNoIGlzIGluIHN0YW5kYXJkCitUUE1fU1RPUkVEX0RBVEEgZm9ybWF0LiAgVGhlIGtleSBsZW5ndGggZm9yIG5ldyBrZXlzIGFyZSBhbHdheXMgaW4gYnl0ZXMuCitUcnVzdGVkIEtleXMgY2FuIGJlIDMyIC0gMTI4IGJ5dGVzICgyNTYgLSAxMDI0IGJpdHMpLCB0aGUgdXBwZXIgbGltaXQgaXMgdG8gZml0Cit3aXRoaW4gdGhlIDIwNDggYml0IFNSSyAoUlNBKSBrZXlsZW5ndGgsIHdpdGggYWxsIG5lY2Vzc2FyeSBzdHJ1Y3R1cmUvcGFkZGluZy4KKworRW5jcnlwdGVkIGtleXMgZG8gbm90IGRlcGVuZCBvbiBhIFRQTSwgYW5kIGFyZSBmYXN0ZXIsIGFzIHRoZXkgdXNlIEFFUyBmb3IKK2VuY3J5cHRpb24vZGVjcnlwdGlvbi4gIE5ldyBrZXlzIGFyZSBjcmVhdGVkIGZyb20ga2VybmVsIGdlbmVyYXRlZCByYW5kb20KK251bWJlcnMsIGFuZCBhcmUgZW5jcnlwdGVkL2RlY3J5cHRlZCB1c2luZyBhIHNwZWNpZmllZCAnbWFzdGVyJyBrZXkuICBUaGUKKydtYXN0ZXInIGtleSBjYW4gZWl0aGVyIGJlIGEgdHJ1c3RlZC1rZXkgb3IgdXNlci1rZXkgdHlwZS4gIFRoZSBtYWluCitkaXNhZHZhbnRhZ2Ugb2YgZW5jcnlwdGVkIGtleXMgaXMgdGhhdCBpZiB0aGV5IGFyZSBub3Qgcm9vdGVkIGluIGEgdHJ1c3RlZCBrZXksCit0aGV5IGFyZSBvbmx5IGFzIHNlY3VyZSBhcyB0aGUgdXNlciBrZXkgZW5jcnlwdGluZyB0aGVtLiAgVGhlIG1hc3RlciB1c2VyIGtleQorc2hvdWxkIHRoZXJlZm9yZSBiZSBsb2FkZWQgaW4gYXMgc2VjdXJlIGEgd2F5IGFzIHBvc3NpYmxlLCBwcmVmZXJhYmx5IGVhcmx5IGluCitib290LgorCitVc2FnZToKKyAga2V5Y3RsIGFkZCBlbmNyeXB0ZWQgbmFtZSAibmV3IGtleS10eXBlOm1hc3Rlci1rZXktbmFtZSBrZXlsZW4iIHJpbmcKKyAga2V5Y3RsIGFkZCBlbmNyeXB0ZWQgbmFtZSAibG9hZCBoZXhfYmxvYiIgcmluZworICBrZXljdGwgdXBkYXRlIGtleWlkICJ1cGRhdGUga2V5LXR5cGU6bWFzdGVyLWtleS1uYW1lIgorCit3aGVyZSAna2V5LXR5cGUnIGlzIGVpdGhlciAndHJ1c3RlZCcgb3IgJ3VzZXInLgorCitFeGFtcGxlcyBvZiB0cnVzdGVkIGFuZCBlbmNyeXB0ZWQga2V5IHVzYWdlOgorCitDcmVhdGUgYW5kIHNhdmUgYSB0cnVzdGVkIGtleSBuYW1lZCAia21rIiBvZiBsZW5ndGggMzIgYnl0ZXM6CisKKyAgICAkIGtleWN0bCBhZGQgdHJ1c3RlZCBrbWsgIm5ldyAzMiIgQHUKKyAgICA0NDA1MDI4NDgKKworICAgICQga2V5Y3RsIHNob3cKKyAgICBTZXNzaW9uIEtleXJpbmcKKyAgICAgICAgICAgLTMgLS1hbHN3cnYgICAgNTAwICAgNTAwICBrZXlyaW5nOiBfc2VzCisgICAgIDk3ODMzNzE0IC0tYWxzd3J2ICAgIDUwMCAgICAtMSAgIFxfIGtleXJpbmc6IF91aWQuNTAwCisgICAgNDQwNTAyODQ4IC0tYWxzd3J2ICAgIDUwMCAgIDUwMCAgICAgICBcXyB0cnVzdGVkOiBrbWsKKworICAgICQga2V5Y3RsIHByaW50IDQ0MDUwMjg0OAorICAgIDAxMDEwMDAwMDAwMDAwMDAwMDAwMDEwMDVkMDFiN2UzZjRhNmJlNTcwOTkzMGYzYjcwYTc0M2NiYjQyZTBjYzk1ZTE4ZTkxNQorICAgIDNmNjBkYTQ1NWJiZjExNDRhZDEyZTRmOTJiNDUyZjk2NjkyOWY2MTA1ZmQyOWNhMjhlNGQ0ZDVhMDMxZDA2ODQ3OGJhY2IwYgorICAgIDI3MzUxMTE5ZjgyMjkxMWIwYTExYmEzZDM0OThiYTZhMzJlNTBkYWM3ZjMyODk0ZGQ4OTBlYjlhZDU3OGU0ZTI5MmM4MzcyMgorICAgIGE1MmU1NmEwOTdlNmE2OGIzZjU2ZjdhNTJlY2UwY2RjY2JhMWViNjJjYWQ3ZDgxN2Y2ZGM1ODg5OGIzYWMxNWYzNjAyNmZlYworICAgIGQ1NjhiZDRhNzA2Y2I2MGJiMzdiZTZkOGYxMjQwNjYxMTk5ZDY0MGI2NmZiMGZlM2IwNzlmOTdmNDUwYjllZjljMjJjNmQ1ZAorICAgIGRkMzc5ZjBmYWNkMWNkMDIwMjgxZGZhM2M3MGJhMjFhM2ZhNmZjMjQ3MWRjNmQxM2VjZjgyOThiOTQ2ZjY1MzQ1ZmFhNWVmMAorICAgIGYxZjhmZmYwM2FkMGFjYjA4MzcyNTUzNTYzNmFkZGIwOGQ3M2RlZGI5ODMyZGExOTgwODFlNWRlYWU4NGJmYWYwNDA5YzIyYgorICAgIGU0YThhZWEyYjYwN2VjOTY5MzFlNmY0ZDRmZTU2M2JhCisKKyAgICAkIGtleWN0bCBwaXBlIDQ0MDUwMjg0OCA+IGttay5ibG9iCisKK0xvYWQgYSB0cnVzdGVkIGtleSBmcm9tIHRoZSBzYXZlZCBibG9iOgorCisgICAgJCBrZXljdGwgYWRkIHRydXN0ZWQga21rICJsb2FkIGBjYXQga21rLmJsb2JgIiBAdQorICAgIDI2ODcyODgyNAorCisgICAgJCBrZXljdGwgcHJpbnQgMjY4NzI4ODI0CisgICAgMDEwMTAwMDAwMDAwMDAwMDAwMDAwMTAwNWQwMWI3ZTNmNGE2YmU1NzA5OTMwZjNiNzBhNzQzY2JiNDJlMGNjOTVlMThlOTE1CisgICAgM2Y2MGRhNDU1YmJmMTE0NGFkMTJlNGY5MmI0NTJmOTY2OTI5ZjYxMDVmZDI5Y2EyOGU0ZDRkNWEwMzFkMDY4NDc4YmFjYjBiCisgICAgMjczNTExMTlmODIyOTExYjBhMTFiYTNkMzQ5OGJhNmEzMmU1MGRhYzdmMzI4OTRkZDg5MGViOWFkNTc4ZTRlMjkyYzgzNzIyCisgICAgYTUyZTU2YTA5N2U2YTY4YjNmNTZmN2E1MmVjZTBjZGNjYmExZWI2MmNhZDdkODE3ZjZkYzU4ODk4YjNhYzE1ZjM2MDI2ZmVjCisgICAgZDU2OGJkNGE3MDZjYjYwYmIzN2JlNmQ4ZjEyNDA2NjExOTlkNjQwYjY2ZmIwZmUzYjA3OWY5N2Y0NTBiOWVmOWMyMmM2ZDVkCisgICAgZGQzNzlmMGZhY2QxY2QwMjAyODFkZmEzYzcwYmEyMWEzZmE2ZmMyNDcxZGM2ZDEzZWNmODI5OGI5NDZmNjUzNDVmYWE1ZWYwCisgICAgZjFmOGZmZjAzYWQwYWNiMDgzNzI1NTM1NjM2YWRkYjA4ZDczZGVkYjk4MzJkYTE5ODA4MWU1ZGVhZTg0YmZhZjA0MDljMjJiCisgICAgZTRhOGFlYTJiNjA3ZWM5NjkzMWU2ZjRkNGZlNTYzYmEKKworUmVzZWFsIGEgdHJ1c3RlZCBrZXkgdW5kZXIgbmV3IHBjciB2YWx1ZXM6CisKKyAgICAkIGtleWN0bCB1cGRhdGUgMjY4NzI4ODI0ICJ1cGRhdGUgcGNyaW5mbz1gY2F0IHBjci5ibG9iYCIKKyAgICAkIGtleWN0bCBwcmludCAyNjg3Mjg4MjQKKyAgICAwMTAxMDAwMDAwMDAwMDJjMDAwMjgwMDA5M2MzNWEwOWI3MGZmZjI2ZTdhOThhZTc4NmM2NDFlNjc4ZWM2ZmZiNmI0NmQ4MDUKKyAgICA3N2M4YTYzNzdhZWQ5ZDMyMTljNmRmZWM0YjIzZmZlMzAwMDAwMTAwNWQzN2Q0NzJhYzhhNDQwMjNmYmIzZDE4NTgzYTRmNzMKKyAgICBkM2EwNzZjMDg1OGY2ZjFkY2FhMzllYTBmMTE5OTExZmYwM2Y1NDA2ZGY0ZjdmMjdmNDFkYThkNzE5NGY0NWM5ZjRlMDBmMmUKKyAgICBkZjQ0OWYyNjYyNTNhYTNmNTJlNTVjNTNkZTE0Nzc3M2UwMGYwZjlhY2E4NmM2NGQ5NGM5NTM4MjI2NTk2OGMzNTRjNWVhYjQKKyAgICA5NjM4YzVhZTk5Yzg5ZGUxZTA5OTcyNDJlZGZiMGI1MDE3NDRlMTFmZjk3NjJkZmQ5NTFjZmZkOTMyMjdjYzUxMzM4NGU3ZTYKKyAgICBlNzgyYzI5NDM1YzdlYzJlZGFmYWEyZjRjMWZlNmU3YTc4MWI1OTU0OWZmNTI5NjM3MWI0MjEzMzc3N2RjYzViOGI5NzE2MTAKKyAgICA5NGJjNjdlZGUxOWU0M2RkYjlkYzJiYWFjYWQzNzRhMzZmZWFmMDMxNGQ3MDBhZjBhNjVjMTY0YjcwODI0MDE3NDBlNDg5YzkKKyAgICA3ZWY2YTI0ZGVmZTQ4NDYxMDQyMDliZjBjM2VjZWQ3ZmExYTY3MmVkNWIxMjVmYzlkOGNkODhiNDc2YTY1OGE0NDM0NjQ0ZWYKKyAgICBkZjhhZTlhMTc4ZTlmODNiYTlmMDhkMTBmYTQ3ZTQyMjZiOThiMDcwMmYwNmIzYjgKKworQ3JlYXRlIGFuZCBzYXZlIGFuIGVuY3J5cHRlZCBrZXkgImV2bSIgdXNpbmcgdGhlIGFib3ZlIHRydXN0ZWQga2V5ICJrbWsiOgorCisgICAgJCBrZXljdGwgYWRkIGVuY3J5cHRlZCBldm0gIm5ldyB0cnVzdGVkOmttayAzMiIgQHUKKyAgICAxNTk3NzExNzUKKworICAgICQga2V5Y3RsIHByaW50IDE1OTc3MTE3NQorICAgIHRydXN0ZWQ6a21rIDMyIDIzNzU3MjVhZDU3Nzk4ODQ2YTliYmQyNDBkZTg5MDZmMDA2ZTY2YzAzYWY1M2IxYjM4MmRiYmM1NQorICAgIGJlMmE0NDYxNmU0OTU5NDMwNDM2ZGM0ZjJhN2E5NjU5YWE2MGJiNDY1MmFlYjIxMjBmMTQ5ZWQxOTdjNTY0ZTAyNDcxN2M2NAorICAgIDU5NzJkY2I4MmFiMmRkZTgzMzc2ZDgyYjJlM2MwOWZmYworCisgICAgJCBrZXljdGwgcGlwZSAxNTk3NzExNzUgPiBldm0uYmxvYgorCitMb2FkIGFuIGVuY3J5cHRlZCBrZXkgImV2bSIgZnJvbSBzYXZlZCBibG9iOgorCisgICAgJCBrZXljdGwgYWRkIGVuY3J5cHRlZCBldm0gImxvYWQgYGNhdCBldm0uYmxvYmAiIEB1CisgICAgODMxNjg0MjYyCisKKyAgICAkIGtleWN0bCBwcmludCA4MzE2ODQyNjIKKyAgICB0cnVzdGVkOmttayAzMiAyMzc1NzI1YWQ1Nzc5ODg0NmE5YmJkMjQwZGU4OTA2ZjAwNmU2NmMwM2FmNTNiMWIzODJkYmJjNTUKKyAgICBiZTJhNDQ2MTZlNDk1OTQzMDQzNmRjNGYyYTdhOTY1OWFhNjBiYjQ2NTJhZWIyMTIwZjE0OWVkMTk3YzU2NGUwMjQ3MTdjNjQKKyAgICA1OTcyZGNiODJhYjJkZGU4MzM3NmQ4MmIyZTNjMDlmZmMKKworCitUaGUgaW5pdGlhbCBjb25zdW1lciBvZiB0cnVzdGVkIGtleXMgaXMgRVZNLCB3aGljaCBhdCBib290IHRpbWUgbmVlZHMgYSBoaWdoCitxdWFsaXR5IHN5bW1ldHJpYyBrZXkgZm9yIEhNQUMgcHJvdGVjdGlvbiBvZiBmaWxlIG1ldGFkYXRhLiAgVGhlIHVzZSBvZiBhCit0cnVzdGVkIGtleSBwcm92aWRlcyBzdHJvbmcgZ3VhcmFudGVlcyB0aGF0IHRoZSBFVk0ga2V5IGhhcyBub3QgYmVlbgorY29tcHJvbWlzZWQgYnkgYSB1c2VyIGxldmVsIHByb2JsZW0sIGFuZCB3aGVuIHNlYWxlZCB0byBzcGVjaWZpYyBib290IFBDUgordmFsdWVzLCBwcm90ZWN0cyBhZ2FpbnN0IGJvb3QgYW5kIG9mZmxpbmUgYXR0YWNrcy4gIE90aGVyIHVzZXMgZm9yIHRydXN0ZWQgYW5kCitlbmNyeXB0ZWQga2V5cywgc3VjaCBhcyBmb3IgZGlzayBhbmQgZmlsZSBlbmNyeXB0aW9uIGFyZSBhbnRpY2lwYXRlZC4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vbWFrZS9oZWFkZXJzX2luc3RhbGwudHh0IGIvRG9jdW1lbnRhdGlvbi9tYWtlL2hlYWRlcnNfaW5zdGFsbC50eHQKaW5kZXggZjI0ODFjYS4uOTUxZWI5ZiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9tYWtlL2hlYWRlcnNfaW5zdGFsbC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9tYWtlL2hlYWRlcnNfaW5zdGFsbC50eHQKQEAgLTM5LDggKzM5LDkgQEAKIFRoZSBjb21tYW5kICJtYWtlIGhlYWRlcnNfaW5zdGFsbF9hbGwiIGV4cG9ydHMgaGVhZGVycyBmb3IgYWxsIGFyY2hpdGVjdHVyZXMKIHNpbXVsdGFuZW91c2x5LiAgKFRoaXMgaXMgbW9zdGx5IG9mIGludGVyZXN0IHRvIGRpc3RyaWJ1dGlvbiBtYWludGFpbmVycywKIHdobyBjcmVhdGUgYW4gYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IHRhcmJhbGwgZnJvbSB0aGUgcmVzdWx0aW5nIGluY2x1ZGUKLWRpcmVjdG9yeS4pICBSZW1lbWJlciB0byBwcm92aWRlIHRoZSBhcHByb3ByaWF0ZSBsaW51eC9hc20gZGlyZWN0b3J5IHZpYSAibXYiCi1vciAibG4gLXMiIGJlZm9yZSBidWlsZGluZyBhIEMgbGlicmFyeSB3aXRoIGhlYWRlcnMgZXhwb3J0ZWQgdGhpcyB3YXkuCitkaXJlY3RvcnkuKSAgWW91IGFsc28gY2FuIHVzZSBIRFJfQVJDSF9MSVNUIHRvIHNwZWNpZnkgbGlzdCBvZiBhcmNoaXRlY3R1cmVzLgorUmVtZW1iZXIgdG8gcHJvdmlkZSB0aGUgYXBwcm9wcmlhdGUgbGludXgvYXNtIGRpcmVjdG9yeSB2aWEgIm12IiBvciAibG4gLXMiCitiZWZvcmUgYnVpbGRpbmcgYSBDIGxpYnJhcnkgd2l0aCBoZWFkZXJzIGV4cG9ydGVkIHRoaXMgd2F5LgogCiBUaGUga2VybmVsIGhlYWRlciBleHBvcnQgaW5mcmFzdHJ1Y3R1cmUgaXMgbWFpbnRhaW5lZCBieSBEYXZpZCBXb29kaG91c2UKIDxkd213MkBpbmZyYWRlYWQub3JnPi4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vcG93ZXIvZHJpdmVycy10ZXN0aW5nLnR4dCBiL0RvY3VtZW50YXRpb24vcG93ZXIvZHJpdmVycy10ZXN0aW5nLnR4dAppbmRleCA3ZjdhNzM3Li42MzhhZmRmIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3Bvd2VyL2RyaXZlcnMtdGVzdGluZy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9wb3dlci9kcml2ZXJzLXRlc3RpbmcudHh0CkBAIC0yMywxMCArMjMsMTAgQEAKIHdpdGhvdXQgdGhlIG5ldyBkcml2ZXIsIHlvdSBhcmUgcmVhZHkgdG8gdGVzdCBpdDoKIAogYSkgQnVpbGQgdGhlIGRyaXZlciBhcyBhIG1vZHVsZSwgbG9hZCBpdCBhbmQgdHJ5IHRoZSB0ZXN0IG1vZGVzIG9mIGhpYmVybmF0aW9uCi0gICAoc2VlOiBEb2N1bWVudHMvcG93ZXIvYmFzaWMtcG0tZGVidWdnaW5nLnR4dCwgMSkuCisgICAoc2VlOiBEb2N1bWVudGF0aW9uL3Bvd2VyL2Jhc2ljLXBtLWRlYnVnZ2luZy50eHQsIDEpLgogCiBiKSBMb2FkIHRoZSBkcml2ZXIgYW5kIGF0dGVtcHQgdG8gaGliZXJuYXRlIGluIHRoZSAicmVib290IiwgInNodXRkb3duIiBhbmQKLSAgICJwbGF0Zm9ybSIgbW9kZXMgKHNlZTogRG9jdW1lbnRzL3Bvd2VyL2Jhc2ljLXBtLWRlYnVnZ2luZy50eHQsIDEpLgorICAgInBsYXRmb3JtIiBtb2RlcyAoc2VlOiBEb2N1bWVudGF0aW9uL3Bvd2VyL2Jhc2ljLXBtLWRlYnVnZ2luZy50eHQsIDEpLgogCiBjKSBDb21waWxlIHRoZSBkcml2ZXIgZGlyZWN0bHkgaW50byB0aGUga2VybmVsIGFuZCB0cnkgdGhlIHRlc3QgbW9kZXMgb2YKICAgIGhpYmVybmF0aW9uLgpAQCAtMzQsMTIgKzM0LDEyIEBACiBkKSBBdHRlbXB0IHRvIGhpYmVybmF0ZSB3aXRoIHRoZSBkcml2ZXIgY29tcGlsZWQgZGlyZWN0bHkgaW50byB0aGUga2VybmVsCiAgICBpbiB0aGUgInJlYm9vdCIsICJzaHV0ZG93biIgYW5kICJwbGF0Zm9ybSIgbW9kZXMuCiAKLWUpIFRyeSB0aGUgdGVzdCBtb2RlcyBvZiBzdXNwZW5kIChzZWU6IERvY3VtZW50cy9wb3dlci9iYXNpYy1wbS1kZWJ1Z2dpbmcudHh0LAorZSkgVHJ5IHRoZSB0ZXN0IG1vZGVzIG9mIHN1c3BlbmQgKHNlZTogRG9jdW1lbnRhdGlvbi9wb3dlci9iYXNpYy1wbS1kZWJ1Z2dpbmcudHh0LAogICAgMikuICBbQXMgZmFyIGFzIHRoZSBTVFIgdGVzdHMgYXJlIGNvbmNlcm5lZCwgaXQgc2hvdWxkIG5vdCBtYXR0ZXIgd2hldGhlciBvcgogICAgbm90IHRoZSBkcml2ZXIgaXMgYnVpbHQgYXMgYSBtb2R1bGUuXQogCiBmKSBBdHRlbXB0IHRvIHN1c3BlbmQgdG8gUkFNIHVzaW5nIHRoZSBzMnJhbSB0b29sIHdpdGggdGhlIGRyaXZlciBsb2FkZWQKLSAgIChzZWU6IERvY3VtZW50cy9wb3dlci9iYXNpYy1wbS1kZWJ1Z2dpbmcudHh0LCAyKS4KKyAgIChzZWU6IERvY3VtZW50YXRpb24vcG93ZXIvYmFzaWMtcG0tZGVidWdnaW5nLnR4dCwgMikuCiAKIEVhY2ggb2YgdGhlIGFib3ZlIHRlc3RzIHNob3VsZCBiZSByZXBlYXRlZCBzZXZlcmFsIHRpbWVzIGFuZCB0aGUgU1REIHRlc3RzCiBzaG91bGQgYmUgbWl4ZWQgd2l0aCB0aGUgU1RSIHRlc3RzLiAgSWYgYW55IG9mIHRoZW0gZmFpbHMsIHRoZSBkcml2ZXIgY2Fubm90IGJlCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3Bvd2VyL3J1bnRpbWVfcG0udHh0IGIvRG9jdW1lbnRhdGlvbi9wb3dlci9ydW50aW1lX3BtLnR4dAppbmRleCA0MWNjN2IzLi5mZmU1NWZmIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3Bvd2VyL3J1bnRpbWVfcG0udHh0CisrKyBiL0RvY3VtZW50YXRpb24vcG93ZXIvcnVudGltZV9wbS50eHQKQEAgLTUwLDYgKzUwLDE1IEBACiBhbmQgZGV2aWNlIGNsYXNzIGNhbGxiYWNrcyBhcmUgcmVmZXJyZWQgdG8gYXMgc3Vic3lzdGVtLWxldmVsIGNhbGxiYWNrcyBpbiB3aGF0CiBmb2xsb3dzLgogCitCeSBkZWZhdWx0LCB0aGUgY2FsbGJhY2tzIGFyZSBhbHdheXMgaW52b2tlZCBpbiBwcm9jZXNzIGNvbnRleHQgd2l0aCBpbnRlcnJ1cHRzCitlbmFibGVkLiAgSG93ZXZlciwgc3Vic3lzdGVtcyBjYW4gdXNlIHRoZSBwbV9ydW50aW1lX2lycV9zYWZlKCkgaGVscGVyIGZ1bmN0aW9uCit0byB0ZWxsIHRoZSBQTSBjb3JlIHRoYXQgYSBkZXZpY2UncyAtPnJ1bnRpbWVfc3VzcGVuZCgpIGFuZCAtPnJ1bnRpbWVfcmVzdW1lKCkKK2NhbGxiYWNrcyBzaG91bGQgYmUgaW52b2tlZCBpbiBhdG9taWMgY29udGV4dCB3aXRoIGludGVycnVwdHMgZGlzYWJsZWQKKygtPnJ1bnRpbWVfaWRsZSgpIGlzIHN0aWxsIGludm9rZWQgdGhlIGRlZmF1bHQgd2F5KS4gIFRoaXMgaW1wbGllcyB0aGF0IHRoZXNlCitjYWxsYmFjayByb3V0aW5lcyBtdXN0IG5vdCBibG9jayBvciBzbGVlcCwgYnV0IGl0IGFsc28gbWVhbnMgdGhhdCB0aGUKK3N5bmNocm9ub3VzIGhlbHBlciBmdW5jdGlvbnMgbGlzdGVkIGF0IHRoZSBlbmQgb2YgU2VjdGlvbiA0IGNhbiBiZSB1c2VkIHdpdGhpbgorYW4gaW50ZXJydXB0IGhhbmRsZXIgb3IgaW4gYW4gYXRvbWljIGNvbnRleHQuCisKIFRoZSBzdWJzeXN0ZW0tbGV2ZWwgc3VzcGVuZCBjYWxsYmFjayBpcyBfZW50aXJlbHlfIF9yZXNwb25zaWJsZV8gZm9yIGhhbmRsaW5nCiB0aGUgc3VzcGVuZCBvZiB0aGUgZGV2aWNlIGFzIGFwcHJvcHJpYXRlLCB3aGljaCBtYXksIGJ1dCBuZWVkIG5vdCBpbmNsdWRlCiBleGVjdXRpbmcgdGhlIGRldmljZSBkcml2ZXIncyBvd24gLT5ydW50aW1lX3N1c3BlbmQoKSBjYWxsYmFjayAoZnJvbSB0aGUKQEAgLTIzNyw2ICsyNDYsMTAgQEAKICAgICAgIFNlY3Rpb24gOCk7IGl0IG1heSBiZSBtb2RpZmllZCBvbmx5IGJ5IHRoZSBwbV9ydW50aW1lX25vX2NhbGxiYWNrcygpCiAgICAgICBoZWxwZXIgZnVuY3Rpb24KIAorICB1bnNpZ25lZCBpbnQgaXJxX3NhZmU7CisgICAgLSBpbmRpY2F0ZXMgdGhhdCB0aGUgLT5ydW50aW1lX3N1c3BlbmQoKSBhbmQgLT5ydW50aW1lX3Jlc3VtZSgpIGNhbGxiYWNrcworICAgICAgd2lsbCBiZSBpbnZva2VkIHdpdGggdGhlIHNwaW5sb2NrIGhlbGQgYW5kIGludGVycnVwdHMgZGlzYWJsZWQKKwogICB1bnNpZ25lZCBpbnQgdXNlX2F1dG9zdXNwZW5kOwogICAgIC0gaW5kaWNhdGVzIHRoYXQgdGhlIGRldmljZSdzIGRyaXZlciBzdXBwb3J0cyBkZWxheWVkIGF1dG9zdXNwZW5kIChzZWUKICAgICAgIFNlY3Rpb24gOSk7IGl0IG1heSBiZSBtb2RpZmllZCBvbmx5IGJ5IHRoZQpAQCAtMzQ0LDYgKzM1NywxMCBAQAogICAgIC0gZGVjcmVtZW50IHRoZSBkZXZpY2UncyB1c2FnZSBjb3VudGVyOyBpZiB0aGUgcmVzdWx0IGlzIDAgdGhlbiBydW4KICAgICAgIHBtX3J1bnRpbWVfaWRsZShkZXYpIGFuZCByZXR1cm4gaXRzIHJlc3VsdAogCisgIGludCBwbV9ydW50aW1lX3B1dF9zeW5jX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KTsKKyAgICAtIGRlY3JlbWVudCB0aGUgZGV2aWNlJ3MgdXNhZ2UgY291bnRlcjsgaWYgdGhlIHJlc3VsdCBpcyAwIHRoZW4gcnVuCisgICAgICBwbV9ydW50aW1lX3N1c3BlbmQoZGV2KSBhbmQgcmV0dXJuIGl0cyByZXN1bHQKKwogICBpbnQgcG1fcnVudGltZV9wdXRfc3luY19hdXRvc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpOwogICAgIC0gZGVjcmVtZW50IHRoZSBkZXZpY2UncyB1c2FnZSBjb3VudGVyOyBpZiB0aGUgcmVzdWx0IGlzIDAgdGhlbiBydW4KICAgICAgIHBtX3J1bnRpbWVfYXV0b3N1c3BlbmQoZGV2KSBhbmQgcmV0dXJuIGl0cyByZXN1bHQKQEAgLTM5Nyw2ICs0MTQsMTEgQEAKICAgICAgIFBNIGF0dHJpYnV0ZXMgZnJvbSAvc3lzL2RldmljZXMvLi4uL3Bvd2VyIChvciBwcmV2ZW50IHRoZW0gZnJvbSBiZWluZwogICAgICAgYWRkZWQgd2hlbiB0aGUgZGV2aWNlIGlzIHJlZ2lzdGVyZWQpCiAKKyAgdm9pZCBwbV9ydW50aW1lX2lycV9zYWZlKHN0cnVjdCBkZXZpY2UgKmRldik7CisgICAgLSBzZXQgdGhlIHBvd2VyLmlycV9zYWZlIGZsYWcgZm9yIHRoZSBkZXZpY2UsIGNhdXNpbmcgdGhlIHJ1bnRpbWUtUE0KKyAgICAgIHN1c3BlbmQgYW5kIHJlc3VtZSBjYWxsYmFja3MgKGJ1dCBub3QgdGhlIGlkbGUgY2FsbGJhY2spIHRvIGJlIGludm9rZWQKKyAgICAgIHdpdGggaW50ZXJydXB0cyBkaXNhYmxlZAorCiAgIHZvaWQgcG1fcnVudGltZV9tYXJrX2xhc3RfYnVzeShzdHJ1Y3QgZGV2aWNlICpkZXYpOwogICAgIC0gc2V0IHRoZSBwb3dlci5sYXN0X2J1c3kgZmllbGQgdG8gdGhlIGN1cnJlbnQgdGltZQogCkBAIC00MzgsNiArNDYwLDE1IEBACiBwbV9ydW50aW1lX21hcmtfbGFzdF9idXN5KCkKIHBtX3J1bnRpbWVfYXV0b3N1c3BlbmRfZXhwaXJhdGlvbigpCiAKK0lmIHBtX3J1bnRpbWVfaXJxX3NhZmUoKSBoYXMgYmVlbiBjYWxsZWQgZm9yIGEgZGV2aWNlIHRoZW4gdGhlIGZvbGxvd2luZyBoZWxwZXIKK2Z1bmN0aW9ucyBtYXkgYWxzbyBiZSB1c2VkIGluIGludGVycnVwdCBjb250ZXh0OgorCitwbV9ydW50aW1lX3N1c3BlbmQoKQorcG1fcnVudGltZV9hdXRvc3VzcGVuZCgpCitwbV9ydW50aW1lX3Jlc3VtZSgpCitwbV9ydW50aW1lX2dldF9zeW5jKCkKK3BtX3J1bnRpbWVfcHV0X3N5bmNfc3VzcGVuZCgpCisKIDUuIFJ1bi10aW1lIFBNIEluaXRpYWxpemF0aW9uLCBEZXZpY2UgUHJvYmluZyBhbmQgUmVtb3ZhbAogCiBJbml0aWFsbHksIHRoZSBydW4tdGltZSBQTSBpcyBkaXNhYmxlZCBmb3IgYWxsIGRldmljZXMsIHdoaWNoIG1lYW5zIHRoYXQgdGhlCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3Bvd2VycGMvYm9vdGluZy13aXRob3V0LW9mLnR4dCBiL0RvY3VtZW50YXRpb24vcG93ZXJwYy9ib290aW5nLXdpdGhvdXQtb2YudHh0CmluZGV4IDMwMmRiNWQuLjMyNzJlZDUgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vcG93ZXJwYy9ib290aW5nLXdpdGhvdXQtb2YudHh0CisrKyBiL0RvY3VtZW50YXRpb24vcG93ZXJwYy9ib290aW5nLXdpdGhvdXQtb2YudHh0CkBAIC0xMzEsNyArMTMxLDcgQEAKIHBvaW50IGFuZCB0aGUgd2F5IGEgbmV3IHBsYXRmb3JtIHNob3VsZCBiZSBhZGRlZCB0byB0aGUga2VybmVsLiBUaGUKIGxlZ2FjeSBpU2VyaWVzIHBsYXRmb3JtIGJyZWFrcyB0aG9zZSBydWxlcyBhcyBpdCBwcmVkYXRlcyB0aGlzIHNjaGVtZSwKIGJ1dCBubyBuZXcgYm9hcmQgc3VwcG9ydCB3aWxsIGJlIGFjY2VwdGVkIGluIHRoZSBtYWluIHRyZWUgdGhhdAotZG9lc24ndCBmb2xsb3dzIHRoZW0gcHJvcGVybHkuICBJbiBhZGRpdGlvbiwgc2luY2UgdGhlIGFkdmVudCBvZiB0aGUKK2RvZXNuJ3QgZm9sbG93IHRoZW0gcHJvcGVybHkuICBJbiBhZGRpdGlvbiwgc2luY2UgdGhlIGFkdmVudCBvZiB0aGUKIGFyY2gvcG93ZXJwYyBtZXJnZWQgYXJjaGl0ZWN0dXJlIGZvciBwcGMzMiBhbmQgcHBjNjQsIG5ldyAzMi1iaXQKIHBsYXRmb3JtcyBhbmQgMzItYml0IHBsYXRmb3JtcyB3aGljaCBtb3ZlIGludG8gYXJjaC9wb3dlcnBjIHdpbGwgYmUKIHJlcXVpcmVkIHRvIHVzZSB0aGVzZSBydWxlcyBhcyB3ZWxsLgpAQCAtMTAyNSw3ICsxMDI1LDcgQEAKIAogV0FSTklORzogVGhpcyB2ZXJzaW9uIGlzIHN0aWxsIGluIGVhcmx5IGRldmVsb3BtZW50IHN0YWdlOyB0aGUKIHJlc3VsdGluZyBkZXZpY2UtdHJlZSAiYmxvYnMiIGhhdmUgbm90IHlldCBiZWVuIHZhbGlkYXRlZCB3aXRoIHRoZQota2VybmVsLiBUaGUgY3VycmVudCBnZW5lcmF0ZWQgYmxvYyBsYWNrcyBhIHVzZWZ1bCByZXNlcnZlIG1hcCAoaXQgd2lsbAora2VybmVsLiBUaGUgY3VycmVudCBnZW5lcmF0ZWQgYmxvY2sgbGFja3MgYSB1c2VmdWwgcmVzZXJ2ZSBtYXAgKGl0IHdpbGwKIGJlIGZpeGVkIHRvIGdlbmVyYXRlIGFuIGVtcHR5IG9uZSwgaXQncyB1cCB0byB0aGUgYm9vdGxvYWRlciB0byBmaWxsCiBpdCB1cCkgYW1vbmcgb3RoZXJzLiBUaGUgZXJyb3IgaGFuZGxpbmcgbmVlZHMgd29yaywgYnVncyBhcmUgbHVya2luZywKIGV0Yy4uLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9wb3dlcnBjL2R0cy1iaW5kaW5ncy80eHgvY3BtLnR4dCBiL0RvY3VtZW50YXRpb24vcG93ZXJwYy9kdHMtYmluZGluZ3MvNHh4L2NwbS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWU0NTk4MAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vcG93ZXJwYy9kdHMtYmluZGluZ3MvNHh4L2NwbS50eHQKQEAgLTAsMCArMSw1MiBAQAorUFBDNHh4IENsb2NrIFBvd2VyIE1hbmFnZW1lbnQgKENQTSkgbm9kZQorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorCS0gY29tcGF0aWJsZQkJOiBjb21wYXRpYmxlIGxpc3QsIGN1cnJlbnRseSBvbmx5ICJpYm0sY3BtIgorCS0gZGNyLWFjY2Vzcy1tZXRob2QJOiAibmF0aXZlIgorCS0gZGNyLXJlZwkJOiA8IERDUiByZWdpc3RlciByYW5nZSA+CisKK09wdGlvbmFsIHByb3BlcnRpZXM6CisJLSBlci1vZmZzZXQJCTogQWxsIDR4eCBTb0NzIHdpdGggYSBDUE0gY29udHJvbGxlciBoYXZlCisJCQkJICBvbmUgb2YgdHdvIGRpZmZlcmVudCBvcmRlciBmb3IgdGhlIENQTQorCQkJCSAgcmVnaXN0ZXJzLiBTb21lIGhhdmUgdGhlIENQTSByZWdpc3RlcnMKKwkJCQkgIGluIHRoZSBmb2xsb3dpbmcgb3JkZXIgKEVSLEZSLFNSKS4gVGhlCisJCQkJICBvdGhlcnMgaGF2ZSB0aGVtIGluIHRoZSBmb2xsb3dpbmcgb3JkZXIKKwkJCQkgIChTUixFUixGUikuIEZvciB0aGUgc2Vjb25kIGNhc2Ugc2V0CisJCQkJICBlci1vZmZzZXQgPSA8MT4uCisJLSB1bnVzZWQtdW5pdHMJCTogc3BlY2lmaWVyIGNvbnNpc3Qgb2Ygb25lIGNlbGwuIEZvciBlYWNoCisJCQkJICBiaXQgaW4gdGhlIGNlbGwsIHRoZSBjb3JyZXNwb25kaW5nIGJpdAorCQkJCSAgaW4gQ1BNIHdpbGwgYmUgc2V0IHRvIHR1cm4gb2ZmIHVudXNlZAorCQkJCSAgZGV2aWNlcy4KKwktIGlkbGUtZG96ZQkJOiBzcGVjaWZpZXIgY29uc2lzdCBvZiBvbmUgY2VsbC4gRm9yIGVhY2gKKwkJCQkgIGJpdCBpbiB0aGUgY2VsbCwgdGhlIGNvcnJlc3BvbmRpbmcgYml0CisJCQkJICBpbiBDUE0gd2lsbCBiZSBzZXQgdG8gdHVybiBvZmYgdW51c2VkCisJCQkJICBkZXZpY2VzLiBUaGlzIGlzIHVzdWFsbHkganVzdCBDUE1bQ1BVXS4KKwktIHN0YW5kYnkJCTogc3BlY2lmaWVyIGNvbnNpc3Qgb2Ygb25lIGNlbGwuIEZvciBlYWNoCisJCQkJICBiaXQgaW4gdGhlIGNlbGwsIHRoZSBjb3JyZXNwb25kaW5nIGJpdAorCQkJCSAgaW4gQ1BNIHdpbGwgYmUgc2V0IG9uIHN0YW5kYnkgYW5kCisJCQkJICByZXN0b3JlZCBvbiByZXN1bWUuCisJLSBzdXNwZW5kCQk6IHNwZWNpZmllciBjb25zaXN0IG9mIG9uZSBjZWxsLiBGb3IgZWFjaAorCQkJCSAgYml0IGluIHRoZSBjZWxsLCB0aGUgY29ycmVzcG9uZGluZyBiaXQKKwkJCQkgIGluIENQTSB3aWxsIGJlIHNldCBvbiBzdXNwZW5kIChtZW0pIGFuZAorCQkJCSAgcmVzdG9yZWQgb24gcmVzdW1lLiBOb3RlLCBmb3Igc3RhbmRieQorCQkJCSAgYW5kIHN1c3BlbmQgdGhlIGNvcnJlc3BvbmRpbmcgYml0cyBjYW4KKwkJCQkgIGJlIGRpZmZlcmVudCBvciB0aGUgc2FtZS4gVXN1YWxseSBmb3IKKwkJCQkgIHN0YW5kYnkgb25seSBjbGFzcyAyIGFuZCAzIHVuaXRzIGFyZSBzZXQuCisJCQkJICBIb3dldmVyLCB0aGUgaW50ZXJmYWNlIGRvZXMgbm90IGNhcmUuCisJCQkJICBJZiB0aGV5IGFyZSB0aGUgc2FtZSwgdGhlIGFkZGl0aW9uYWwKKwkJCQkgIHBvd2VyIHNhdmluZyB3aWxsIGJlIHNlZWluZyBpZiBzdXBwb3J0CisJCQkJICBpcyBhdmFpbGFibGUgdG8gcHV0IHRoZSBERFIgaW4gc2VsZgorCQkJCSAgcmVmcmVzaCBtb2RlIGFuZCBhbnkgYWRkaXRpb25hbCBwb3dlcgorCQkJCSAgc2F2aW5nIHRlY2huaXF1ZXMgZm9yIHRoZSBzcGVjaWZpYyBTb0MuCisKK0V4YW1wbGU6CisJQ1BNMDogY3BtIHsKKwkJY29tcGF0aWJsZSA9ICJpYm0sY3BtIjsKKwkJZGNyLWFjY2Vzcy1tZXRob2QgPSAibmF0aXZlIjsKKwkJZGNyLXJlZyA9IDwweDE2MCAweDAwMz47CisJCWVyLW9mZnNldCA9IDwwPjsKKwkJdW51c2VkLXVuaXRzID0gPDB4MDAwMDAxMDA+OworCQlpZGxlLWRvemUgPSA8MHgwMjAwMDAwMD47CisJCXN0YW5kYnkgPSA8MHhmZWZmMDAwMD47CisJCXN1c3BlbmQgPSA8MHhmZWZmNzkxZD47Cit9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9wb3dlcnBjL2R0cy1iaW5kaW5ncy9lZXByb20udHh0IGIvRG9jdW1lbnRhdGlvbi9wb3dlcnBjL2R0cy1iaW5kaW5ncy9lZXByb20udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzNDJjMTAKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL3Bvd2VycGMvZHRzLWJpbmRpbmdzL2VlcHJvbS50eHQKQEAgLTAsMCArMSwyOCBAQAorRUVQUk9NcyAoSTJDKQorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorCisgIC0gY29tcGF0aWJsZSA6IHNob3VsZCBiZSAiPG1hbnVmYWN0dXJlcj4sPHR5cGU+IgorCQkgSWYgdGhlcmUgaXMgbm8gc3BlY2lmaWMgZHJpdmVyIGZvciA8bWFudWZhY3R1cmVyPiwgYSBnZW5lcmljCisJCSBkcml2ZXIgYmFzZWQgb24gPHR5cGU+IGlzIHNlbGVjdGVkLiBQb3NzaWJsZSB0eXBlcyBhcmU6CisJCSAyNGMwMCwgMjRjMDEsIDI0YzAyLCAyNGMwNCwgMjRjMDgsIDI0YzE2LCAyNGMzMiwgMjRjNjQsCisJCSAyNGMxMjgsIDI0YzI1NiwgMjRjNTEyLCAyNGMxMDI0LCBzcGQKKworICAtIHJlZyA6IHRoZSBJMkMgYWRkcmVzcyBvZiB0aGUgRUVQUk9NCisKK09wdGlvbmFsIHByb3BlcnRpZXM6CisKKyAgLSBwYWdlc2l6ZSA6IHRoZSBsZW5ndGggb2YgdGhlIHBhZ2VzaXplIGZvciB3cml0aW5nLiBQbGVhc2UgY29uc3VsdCB0aGUKKyAgICAgICAgICAgICAgIG1hbnVhbCBvZiB5b3VyIGRldmljZSwgdGhhdCB2YWx1ZSB2YXJpZXMgYSBsb3QuIEEgd3JvbmcgdmFsdWUKKwkgICAgICAgbWF5IHJlc3VsdCBpbiBkYXRhIGxvc3MhIElmIG5vdCBzcGVjaWZpZWQsIGEgc2FmZXR5IHZhbHVlIG9mCisJICAgICAgICcxJyBpcyB1c2VkIHdoaWNoIHdpbGwgYmUgdmVyeSBzbG93LgorCisgIC0gcmVhZC1vbmx5OiB0aGlzIHBhcmFtZXRlcmxlc3MgcHJvcGVydHkgZGlzYWJsZXMgd3JpdGVzIHRvIHRoZSBlZXByb20KKworRXhhbXBsZToKKworZWVwcm9tQDUyIHsKKwljb21wYXRpYmxlID0gImF0bWVsLDI0YzMyIjsKKwlyZWcgPSA8MHg1Mj47CisJcGFnZXNpemUgPSA8MzI+OworfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vc3lzY3RsL2tlcm5lbC50eHQgYi9Eb2N1bWVudGF0aW9uL3N5c2N0bC9rZXJuZWwudHh0CmluZGV4IDIwOWUxNTguLjU3NDA2NzEgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vc3lzY3RsL2tlcm5lbC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9zeXNjdGwva2VybmVsLnR4dApAQCAtMjE5LDcgKzIxOSw3IEBACiBUaGlzIHRvZ2dsZSBpbmRpY2F0ZXMgd2hldGhlciB1bnByaXZpbGVnZWQgdXNlcnMgYXJlIHByZXZlbnRlZCBmcm9tIHVzaW5nCiBkbWVzZyg4KSB0byB2aWV3IG1lc3NhZ2VzIGZyb20gdGhlIGtlcm5lbCdzIGxvZyBidWZmZXIuICBXaGVuCiBkbWVzZ19yZXN0cmljdCBpcyBzZXQgdG8gKDApIHRoZXJlIGFyZSBubyByZXN0cmljdGlvbnMuICBXaGVuCi1kbWVzZ19yZXN0cmljdCBpcyBzZXQgc2V0IHRvICgxKSwgdXNlcnMgbXVzdCBoYXZlIENBUF9TWVNfQURNSU4gdG8gdXNlCitkbWVzZ19yZXN0cmljdCBpcyBzZXQgc2V0IHRvICgxKSwgdXNlcnMgbXVzdCBoYXZlIENBUF9TWVNMT0cgdG8gdXNlCiBkbWVzZyg4KS4KIAogVGhlIGtlcm5lbCBjb25maWcgb3B0aW9uIENPTkZJR19TRUNVUklUWV9ETUVTR19SRVNUUklDVCBzZXRzIHRoZSBkZWZhdWx0CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3ZtL01ha2VmaWxlIGIvRG9jdW1lbnRhdGlvbi92bS9NYWtlZmlsZQppbmRleCA5ZGNmZjMyLi4zZmE0ZDA2IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3ZtL01ha2VmaWxlCisrKyBiL0RvY3VtZW50YXRpb24vdm0vTWFrZWZpbGUKQEAgLTIsNyArMiw3IEBACiBvYmotIDo9IGR1bW15Lm8KIAogIyBMaXN0IG9mIHByb2dyYW1zIHRvIGJ1aWxkCi1ob3N0cHJvZ3MteSA6PSBzbGFiaW5mbyBwYWdlLXR5cGVzIGh1Z2VwYWdlLW1tYXAgaHVnZXBhZ2Utc2htIG1hcF9odWdldGxiCitob3N0cHJvZ3MteSA6PSBwYWdlLXR5cGVzIGh1Z2VwYWdlLW1tYXAgaHVnZXBhZ2Utc2htIG1hcF9odWdldGxiCiAKICMgVGVsbCBrYnVpbGQgdG8gYWx3YXlzIGJ1aWxkIHRoZSBwcm9ncmFtcwogYWx3YXlzIDo9ICQoaG9zdHByb2dzLXkpCmRpZmYgLS1naXQgYS9NQUlOVEFJTkVSUyBiL01BSU5UQUlORVJTCmluZGV4IDIzZDA0MzYuLjQyZjk5MWUgMTAwNjQ0Ci0tLSBhL01BSU5UQUlORVJTCisrKyBiL01BSU5UQUlORVJTCkBAIC0yODUsNiArMjg1LDQxIEBACiBTOglNYWludGFpbmVkCiBGOglzb3VuZC9wY2kvYWQxODg5LioKIAorQUQ1MjVYIEFOQUxPRyBERVZJQ0VTIERJR0lUQUwgUE9URU5USU9NRVRFUlMgRFJJVkVSCitNOglNaWNoYWVsIEhlbm5lcmljaCA8bWljaGFlbC5oZW5uZXJpY2hAYW5hbG9nLmNvbT4KK0w6CWRldmljZS1kcml2ZXItZGV2ZWxAYmxhY2tmaW4udWNsaW51eC5vcmcKK1c6CWh0dHA6Ly93aWtpLWFuYWxvZy5jb20vQUQ1MjU0CitTOglTdXBwb3J0ZWQKK0Y6CWRyaXZlcnMvbWlzYy9hZDUyNXhfZHBvdC5jCisKK0FENTM5OCBDVVJSRU5UIFJFR1VMQVRPUiBEUklWRVIgKEFENTM5OC9BRDU4MjEpCitNOglNaWNoYWVsIEhlbm5lcmljaCA8bWljaGFlbC5oZW5uZXJpY2hAYW5hbG9nLmNvbT4KK0w6CWRldmljZS1kcml2ZXItZGV2ZWxAYmxhY2tmaW4udWNsaW51eC5vcmcKK1c6CWh0dHA6Ly93aWtpLWFuYWxvZy5jb20vQUQ1Mzk4CitTOglTdXBwb3J0ZWQKK0Y6CWRyaXZlcnMvcmVndWxhdG9yL2FkNTM5OC5jCisKK0FENzE0WCBDQVBBQ0lUQU5DRSBUT1VDSCBTRU5TT1IgRFJJVkVSIChBRDcxNDIvMy83LzgvN0EpCitNOglNaWNoYWVsIEhlbm5lcmljaCA8bWljaGFlbC5oZW5uZXJpY2hAYW5hbG9nLmNvbT4KK0w6CWRldmljZS1kcml2ZXItZGV2ZWxAYmxhY2tmaW4udWNsaW51eC5vcmcKK1c6CWh0dHA6Ly93aWtpLWFuYWxvZy5jb20vQUQ3MTQyCitTOglTdXBwb3J0ZWQKK0Y6CWRyaXZlcnMvaW5wdXQvbWlzYy9hZDcxNHguYworCitBRDc4NzcgVE9VQ0hTQ1JFRU4gRFJJVkVSCitNOglNaWNoYWVsIEhlbm5lcmljaCA8bWljaGFlbC5oZW5uZXJpY2hAYW5hbG9nLmNvbT4KK0w6CWRldmljZS1kcml2ZXItZGV2ZWxAYmxhY2tmaW4udWNsaW51eC5vcmcKK1c6CWh0dHA6Ly93aWtpLWFuYWxvZy5jb20vQUQ3ODc3CitTOglTdXBwb3J0ZWQKK0Y6CWRyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vYWQ3ODc3LmMKKworQUQ3ODc5IFRPVUNIU0NSRUVOIERSSVZFUiAoQUQ3ODc5L0FENzg4OSkKK006CU1pY2hhZWwgSGVubmVyaWNoIDxtaWNoYWVsLmhlbm5lcmljaEBhbmFsb2cuY29tPgorTDoJZGV2aWNlLWRyaXZlci1kZXZlbEBibGFja2Zpbi51Y2xpbnV4Lm9yZworVzoJaHR0cDovL3dpa2ktYW5hbG9nLmNvbS9BRDc4NzkKK1M6CVN1cHBvcnRlZAorRjoJZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9hZDc4NzkuYworCiBBRE0xMDI1IEhBUkRXQVJFIE1PTklUT1IgRFJJVkVSCiBNOglKZWFuIERlbHZhcmUgPGtoYWxpQGxpbnV4LWZyLm9yZz4KIEw6CWxtLXNlbnNvcnNAbG0tc2Vuc29ycy5vcmcKQEAgLTMwNCw2ICszMzksMzIgQEAKIFM6CU9ycGhhbgogRjoJZHJpdmVycy9uZXQvd2lyZWxlc3MvYWRtODIxMS4qCiAKK0FEUDU1MjAgQkFDS0xJR0hUIERSSVZFUiBXSVRIIElPIEVYUEFOREVSIChBRFA1NTIwL0FEUDU1MDEpCitNOglNaWNoYWVsIEhlbm5lcmljaCA8bWljaGFlbC5oZW5uZXJpY2hAYW5hbG9nLmNvbT4KK0w6CWRldmljZS1kcml2ZXItZGV2ZWxAYmxhY2tmaW4udWNsaW51eC5vcmcKK1c6CWh0dHA6Ly93aWtpLWFuYWxvZy5jb20vQURQNTUyMAorUzoJU3VwcG9ydGVkCitGOglkcml2ZXJzL21mZC9hZHA1NTIwLmMKK0Y6CWRyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L2FkcDU1MjBfYmwuYworRjoJZHJpdmVycy9sZWQvbGVkcy1hZHA1NTIwLmMKK0Y6CWRyaXZlcnMvZ3Bpby9hZHA1NTIwLWdwaW8uYworRjoJZHJpdmVycy9pbnB1dC9rZXlib2FyZC9hZHA1NTIwLWtleXMuYworCitBRFA1NTg4IFFXRVJUWSBLRVlQQUQgQU5EIElPIEVYUEFOREVSIERSSVZFUiAoQURQNTU4OC9BRFA1NTg3KQorTToJTWljaGFlbCBIZW5uZXJpY2ggPG1pY2hhZWwuaGVubmVyaWNoQGFuYWxvZy5jb20+CitMOglkZXZpY2UtZHJpdmVyLWRldmVsQGJsYWNrZmluLnVjbGludXgub3JnCitXOglodHRwOi8vd2lraS1hbmFsb2cuY29tL0FEUDU1ODgKK1M6CVN1cHBvcnRlZAorRjoJZHJpdmVycy9pbnB1dC9rZXlib2FyZC9hZHA1NTg4LWtleXMuYworRjoJZHJpdmVycy9ncGlvL2FkcDU1ODgtZ3Bpby5jCisKK0FEUDg4NjAgQkFDS0xJR0hUIERSSVZFUiAoQURQODg2MC9BRFA4ODYxL0FEUDg4NjMpCitNOglNaWNoYWVsIEhlbm5lcmljaCA8bWljaGFlbC5oZW5uZXJpY2hAYW5hbG9nLmNvbT4KK0w6CWRldmljZS1kcml2ZXItZGV2ZWxAYmxhY2tmaW4udWNsaW51eC5vcmcKK1c6CWh0dHA6Ly93aWtpLWFuYWxvZy5jb20vQURQODg2MAorUzoJU3VwcG9ydGVkCitGOglkcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9hZHA4ODYwX2JsLmMKKwogQURUNzQ2WCBGQU4gRFJJVkVSCiBNOglDb2xpbiBMZXJveSA8Y29saW5AY29saW5vLm5ldD4KIFM6CU1haW50YWluZWQKQEAgLTMxNiw2ICszNzcsMTMgQEAKIEY6CURvY3VtZW50YXRpb24vaHdtb24vYWR0NzQ3NQogRjoJZHJpdmVycy9od21vbi9hZHQ3NDc1LmMKIAorQURYTDM0WCBUSFJFRS1BWElTIERJR0lUQUwgQUNDRUxFUk9NRVRFUiBEUklWRVIgKEFEWEwzNDUvQURYTDM0NikKK006CU1pY2hhZWwgSGVubmVyaWNoIDxtaWNoYWVsLmhlbm5lcmljaEBhbmFsb2cuY29tPgorTDoJZGV2aWNlLWRyaXZlci1kZXZlbEBibGFja2Zpbi51Y2xpbnV4Lm9yZworVzoJaHR0cDovL3dpa2ktYW5hbG9nLmNvbS9BRFhMMzQ1CitTOglTdXBwb3J0ZWQKK0Y6CWRyaXZlcnMvaW5wdXQvbWlzYy9hZHhsMzR4LmMKKwogQURWQU5TWVMgU0NTSSBEUklWRVIKIE06CU1hdHRoZXcgV2lsY294IDxtYXR0aGV3QHdpbC5jeD4KIEw6CWxpbnV4LXNjc2lAdmdlci5rZXJuZWwub3JnCkBAIC00NDAsMTYgKzUwOCwyMiBAQAogUzoJTWFpbnRhaW5lZAogRjoJZHJpdmVycy9pbmZpbmliYW5kL2h3L2Ftc28xMTAwLwogCitBTkFMT0cgREVWSUNFUyBJTkMgQVNPQyBDT0RFQyBEUklWRVJTCitMOglkZXZpY2UtZHJpdmVyLWRldmVsQGJsYWNrZmluLnVjbGludXgub3JnCitMOglhbHNhLWRldmVsQGFsc2EtcHJvamVjdC5vcmcgKG1vZGVyYXRlZCBmb3Igbm9uLXN1YnNjcmliZXJzKQorVzoJaHR0cDovL3dpa2ktYW5hbG9nLmNvbS8KK1M6CVN1cHBvcnRlZAorRjoJc291bmQvc29jL2NvZGVjcy9hZDEqCitGOglzb3VuZC9zb2MvY29kZWNzL2FkYXUqCitGOglzb3VuZC9zb2MvY29kZWNzL2FkYXYqCitGOglzb3VuZC9zb2MvY29kZWNzL3NzbSoKKwogQU5BTE9HIERFVklDRVMgSU5DIEFTT0MgRFJJVkVSUwogTDoJdWNsaW51eC1kaXN0LWRldmVsQGJsYWNrZmluLnVjbGludXgub3JnCiBMOglhbHNhLWRldmVsQGFsc2EtcHJvamVjdC5vcmcgKG1vZGVyYXRlZCBmb3Igbm9uLXN1YnNjcmliZXJzKQogVzoJaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnLwogUzoJU3VwcG9ydGVkCiBGOglzb3VuZC9zb2MvYmxhY2tmaW4vKgotRjoJc291bmQvc29jL2NvZGVjcy9hZDEqCi1GOglzb3VuZC9zb2MvY29kZWNzL2FkYXUqCi1GOglzb3VuZC9zb2MvY29kZWNzL2FkYXYqCi1GOglzb3VuZC9zb2MvY29kZWNzL3NzbSoKIAogQU9BIChBcHBsZSBPbmJvYXJkIEF1ZGlvKSBBTFNBIERSSVZFUgogTToJSm9oYW5uZXMgQmVyZyA8am9oYW5uZXNAc2lwc29sdXRpb25zLm5ldD4KQEAgLTE0MjMsNyArMTQ5Nyw5IEBACiBCUk9BRENPTSBCUkNNODAyMTEgSUVFRTgwMi4xMW4gV0lSRUxFU1MgRFJJVkVSCiBNOglCcmV0dCBSdWRsZXkgPGJydWRsZXlAYnJvYWRjb20uY29tPgogTToJSGVucnkgUHRhc2luc2tpIDxoZW5yeXBAYnJvYWRjb20uY29tPgotTToJTm9oZWUgS28gPG5vaGVla0Bicm9hZGNvbS5jb20+CitNOglEb3dhbiBLaW0gPGRvd2FuQGJyb2FkY29tLmNvbT4KK006CVJvbGFuZCBWb3NzZW4gPHJ2b3NzZW5AYnJvYWRjb20uY29tPgorTToJQXJlbmQgdmFuIFNwcmllbCA8YXJlbmRAYnJvYWRjb20uY29tPgogTDoJbGludXgtd2lyZWxlc3NAdmdlci5rZXJuZWwub3JnCiBTOglTdXBwb3J0ZWQKIEY6CWRyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvCkBAIC0xNzA5LDcgKzE3ODUsOCBAQAogRjoJZHJpdmVycy91c2IvYXRtL2N4YWNydS5jCiAKIENPTkZJR0ZTCi1NOglKb2VsIEJlY2tlciA8am9lbC5iZWNrZXJAb3JhY2xlLmNvbT4KK006CUpvZWwgQmVja2VyIDxqbGJlY0BldmlscGxhbi5vcmc+CitUOglnaXQgZ2l0Oi8vZ2l0Lmtlcm5lbC5vcmcvcHViL3NjbS9saW51eC9rZXJuZWwvZ2l0L2psYmVjL2NvbmZpZ2ZzLmdpdAogUzoJU3VwcG9ydGVkCiBGOglmcy9jb25maWdmcy8KIEY6CWluY2x1ZGUvbGludXgvY29uZmlnZnMuaApAQCAtMjI3MSw2ICsyMzQ4LDE0IEBACiBTOglNYWludGFpbmVkCiBGOglkcml2ZXJzL3BsYXRmb3JtL3g4Ni9lZWVwYy1sYXB0b3AuYwogCitFRUVQQyBXTUkgRVhUUkFTIERSSVZFUgorTToJQ29yZW50aW4gQ2hhcnkgPGNvcmVudGluY2pAaWtzYWlmLm5ldD4KK0w6CWFjcGk0YXN1cy11c2VyQGxpc3RzLnNvdXJjZWZvcmdlLm5ldAorTDoJcGxhdGZvcm0tZHJpdmVyLXg4NkB2Z2VyLmtlcm5lbC5vcmcKK1c6CWh0dHA6Ly9hY3BpNGFzdXMuc2YubmV0CitTOglNYWludGFpbmVkCitGOglkcml2ZXJzL3BsYXRmb3JtL3g4Ni9lZWVwYy13bWkuYworCiBFRklGQiBGUkFNRUJVRkZFUiBEUklWRVIKIEw6CWxpbnV4LWZiZGV2QHZnZXIua2VybmVsLm9yZwogTToJUGV0ZXIgSm9uZXMgPHBqb25lc0ByZWRoYXQuY29tPgpAQCAtMjYwOCw2ICsyNjkzLDE0IEBACiBGOglkcml2ZXJzL2kyYy9idXNzZXMvaTJjLWdwaW8uYwogRjoJaW5jbHVkZS9saW51eC9pMmMtZ3Bpby5oCiAKK0dFTkVSSUMgR1BJTyBJMkMgTVVMVElQTEVYRVIgRFJJVkVSCitNOglQZXRlciBLb3JzZ2FhcmQgPHBldGVyLmtvcnNnYWFyZEBiYXJjby5jb20+CitMOglsaW51eC1pMmNAdmdlci5rZXJuZWwub3JnCitTOglTdXBwb3J0ZWQKK0Y6CWRyaXZlcnMvaTJjL211eGVzL2dwaW8taTJjbXV4LmMKK0Y6CWluY2x1ZGUvbGludXgvZ3Bpby1pMmNtdXguaAorRjoJRG9jdW1lbnRhdGlvbi9pMmMvbXV4ZXMvZ3Bpby1pMmNtdXgKKwogR0VORVJJQyBIRExDIChXQU4pIERSSVZFUlMKIE06CUtyenlzenRvZiBIYWxhc2EgPGtoY0BwbS53YXcucGw+CiBXOglodHRwOi8vd3d3Lmtlcm5lbC5vcmcvcHViL2xpbnV4L3V0aWxzL25ldC9oZGxjLwpAQCAtNDI2OCw2ICs0MzYxLDcgQEAKIE06CUtPTklTSEkgUnl1c3VrZSA8a29uaXNoaS5yeXVzdWtlQGxhYi5udHQuY28uanA+CiBMOglsaW51eC1uaWxmc0B2Z2VyLmtlcm5lbC5vcmcKIFc6CWh0dHA6Ly93d3cubmlsZnMub3JnL2VuLworVDoJZ2l0IGdpdDovL2dpdC5rZXJuZWwub3JnL3B1Yi9zY20vbGludXgva2VybmVsL2dpdC9yeXVzdWtlL25pbGZzMi5naXQKIFM6CVN1cHBvcnRlZAogRjoJRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9uaWxmczIudHh0CiBGOglmcy9uaWxmczIvCkBAIC00NDU2LDcgKzQ1NTAsNyBAQAogCiBPUkFDTEUgQ0xVU1RFUiBGSUxFU1lTVEVNIDIgKE9DRlMyKQogTToJTWFyayBGYXNoZWggPG1mYXNoZWhAc3VzZS5jb20+Ci1NOglKb2VsIEJlY2tlciA8am9lbC5iZWNrZXJAb3JhY2xlLmNvbT4KK006CUpvZWwgQmVja2VyIDxqbGJlY0BldmlscGxhbi5vcmc+CiBMOglvY2ZzMi1kZXZlbEBvc3Mub3JhY2xlLmNvbSAobW9kZXJhdGVkIGZvciBub24tc3Vic2NyaWJlcnMpCiBXOglodHRwOi8vb3NzLm9yYWNsZS5jb20vcHJvamVjdHMvb2NmczIvCiBUOglnaXQgZ2l0Oi8vZ2l0Lmtlcm5lbC5vcmcvcHViL3NjbS9saW51eC9rZXJuZWwvZ2l0L2psYmVjL29jZnMyLmdpdApAQCAtNTkyOSw3ICs2MDIzLDggQEAKIFRPTU9ZTyBTRUNVUklUWSBNT0RVTEUKIE06CUtlbnRhcm8gVGFrZWRhIDx0YWtlZGFrbkBudHRkYXRhLmNvLmpwPgogTToJVGV0c3VvIEhhbmRhIDxwZW5ndWluLWtlcm5lbEBJLWxvdmUuU0FLVVJBLm5lLmpwPgotTDoJdG9tb3lvLXVzZXJzLWVuQGxpc3RzLnNvdXJjZWZvcmdlLmpwIChzdWJzY3JpYmVycy1vbmx5LCBmb3IgZGV2ZWxvcGVycyBhbmQgdXNlcnMgaW4gRW5nbGlzaCkKK0w6CXRvbW95by1kZXYtZW5AbGlzdHMuc291cmNlZm9yZ2UuanAgKHN1YnNjcmliZXJzLW9ubHksIGZvciBkZXZlbG9wZXJzIGluIEVuZ2xpc2gpCitMOgl0b21veW8tdXNlcnMtZW5AbGlzdHMuc291cmNlZm9yZ2UuanAgKHN1YnNjcmliZXJzLW9ubHksIGZvciB1c2VycyBpbiBFbmdsaXNoKQogTDoJdG9tb3lvLWRldkBsaXN0cy5zb3VyY2Vmb3JnZS5qcCAoc3Vic2NyaWJlcnMtb25seSwgZm9yIGRldmVsb3BlcnMgaW4gSmFwYW5lc2UpCiBMOgl0b21veW8tdXNlcnNAbGlzdHMuc291cmNlZm9yZ2UuanAgKHN1YnNjcmliZXJzLW9ubHksIGZvciB1c2VycyBpbiBKYXBhbmVzZSkKIFc6CWh0dHA6Ly90b21veW8uc291cmNlZm9yZ2UuanAvCmRpZmYgLS1naXQgYS9NYWtlZmlsZSBiL01ha2VmaWxlCmluZGV4IDc0YjI1NTUuLjZhNDU3NjkgMTAwNjQ0Ci0tLSBhL01ha2VmaWxlCisrKyBiL01ha2VmaWxlCkBAIC0yMjQsNiArMjI0LDcgQEAKIGVuZGlmCiAKIEtDT05GSUdfQ09ORklHCT89IC5jb25maWcKK2V4cG9ydCBLQ09ORklHX0NPTkZJRwogCiAjIFNIRUxMIHVzZWQgYnkga2J1aWxkCiBDT05GSUdfU0hFTEwgOj0gJChzaGVsbCBpZiBbIC14ICIkJEJBU0giIF07IHRoZW4gZWNobyAkJEJBU0g7IFwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbmZpZ3MvdTg1MDBfZGVmY29uZmlnIGIvYXJjaC9hcm0vY29uZmlncy91ODUwMF9kZWZjb25maWcKaW5kZXggYmU4MGYwMy4uNTJkODZjNCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vY29uZmlncy91ODUwMF9kZWZjb25maWcKKysrIGIvYXJjaC9hcm0vY29uZmlncy91ODUwMF9kZWZjb25maWcKQEAgLTksNiArOSwxMCBAQAogIyBDT05GSUdfTEJEQUYgaXMgbm90IHNldAogIyBDT05GSUdfQkxLX0RFVl9CU0cgaXMgbm90IHNldAogQ09ORklHX0FSQ0hfVTg1MDA9eQorQ09ORklHX1VYNTAwX1NPQ19EQjU1MDA9eQorQ09ORklHX1VYNTAwX1NPQ19EQjg1MDA9eQorQ09ORklHX01BQ0hfVTg1MDA9eQorQ09ORklHX01BQ0hfVTU1MDA9eQogQ09ORklHX1NNUD15CiBDT05GSUdfTlJfQ1BVUz0yCiBDT05GSUdfUFJFRU1QVD15CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWRvdmUvY29tbW9uLmMgYi9hcmNoL2FybS9tYWNoLWRvdmUvY29tbW9uLmMKaW5kZXggZjdhMTI1OC4uZmU2MjdhYiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1kb3ZlL2NvbW1vbi5jCisrKyBiL2FyY2gvYXJtL21hY2gtZG92ZS9jb21tb24uYwpAQCAtNzcwLDcgKzc3MCw3IEBACiB9OwogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBkb3ZlX3NkaW8wID0gewotCS5uYW1lCQk9ICJzZGhjaS1tdiIsCisJLm5hbWUJCT0gInNkaGNpLWRvdmUiLAogCS5pZAkJPSAwLAogCS5kZXYJCT0gewogCQkuZG1hX21hc2sJCT0gJnNkaW9fZG1hbWFzaywKQEAgLTc5OCw3ICs3OTgsNyBAQAogfTsKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgZG92ZV9zZGlvMSA9IHsKLQkubmFtZQkJPSAic2RoY2ktbXYiLAorCS5uYW1lCQk9ICJzZGhjaS1kb3ZlIiwKIAkuaWQJCT0gMSwKIAkuZGV2CQk9IHsKIAkJLmRtYV9tYXNrCQk9ICZzZGlvX2RtYW1hc2ssCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1zbS9LY29uZmlnIGIvYXJjaC9hcm0vbWFjaC1tc20vS2NvbmZpZwppbmRleCBmYWU5MzFhLi41ZDNkOWFkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW1zbS9LY29uZmlnCisrKyBiL2FyY2gvYXJtL21hY2gtbXNtL0tjb25maWcKQEAgLTQwLDExICs0MCwxMyBAQAogCWJvb2wgIk1TTThYNjAiCiAJc2VsZWN0IE1BQ0hfTVNNOFg2MF9TVVJGIGlmICghTUFDSF9NU004WDYwX1JVTUkzICYmICFNQUNIX01TTThYNjBfU0lNIFwKIAkJCQkgICYmICFNQUNIX01TTThYNjBfRkZBKQorCXNlbGVjdCBBUkNIX01TTV9TQ09SUElPTk1QCiAJc2VsZWN0IEFSTV9HSUMKIAlzZWxlY3QgQ1BVX1Y3CiAJc2VsZWN0IE1TTV9WMl9UTE1NCiAJc2VsZWN0IE1TTV9HUElPTVVYCiAJc2VsZWN0IElPTU1VX0FQSQorCXNlbGVjdCBNU01fU0NNIGlmIFNNUAogCiBlbmRjaG9pY2UKIApAQCAtMTcyLDQgKzE3NCw3IEBACiAKIGNvbmZpZyBJT01NVV9BUEkKIAlib29sCisKK2NvbmZpZyBNU01fU0NNCisJYm9vbAogZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXNtL01ha2VmaWxlIGIvYXJjaC9hcm0vbWFjaC1tc20vTWFrZWZpbGUKaW5kZXggNTk2NDZiYi4uOTQxOTVjMSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1tc20vTWFrZWZpbGUKKysrIGIvYXJjaC9hcm0vbWFjaC1tc20vTWFrZWZpbGUKQEAgLTE4LDYgKzE4LDEwIEBACiBvYmotJChDT05GSUdfQVJDSF9RU0Q4WDUwKSArPSBzaXJjLm8KIG9iai0kKENPTkZJR19NU01fU01EKSArPSBzbWQubyBzbWRfZGVidWcubwogb2JqLSQoQ09ORklHX01TTV9TTUQpICs9IGxhc3RfcmFkaW9fbG9nLm8KK29iai0kKENPTkZJR19NU01fU0NNKSArPSBzY20ubyBzY20tYm9vdC5vCisKK29iai0kKENPTkZJR19IT1RQTFVHX0NQVSkgKz0gaG90cGx1Zy5vCitvYmotJChDT05GSUdfU01QKSArPSBoZWFkc21wLm8gcGxhdHNtcC5vCiAKIG9iai0kKENPTkZJR19NQUNIX1RST1VUKSArPSBib2FyZC10cm91dC5vIGJvYXJkLXRyb3V0LWdwaW8ubyBib2FyZC10cm91dC1tbWMubyBkZXZpY2VzLW1zbTd4MDAubwogb2JqLSQoQ09ORklHX01BQ0hfVFJPVVQpICs9IGJvYXJkLXRyb3V0Lm8gYm9hcmQtdHJvdXQtZ3Bpby5vIGJvYXJkLXRyb3V0LW1tYy5vIGJvYXJkLXRyb3V0LXBhbmVsLm8gZGV2aWNlcy1tc203eDAwLm8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXNtL2hlYWRzbXAuUyBiL2FyY2gvYXJtL21hY2gtbXNtL2hlYWRzbXAuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMGMyMTQzCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1tc20vaGVhZHNtcC5TCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiAgbGludXgvYXJjaC9hcm0vbWFjaC1yZWFsdmlldy9oZWFkc21wLlMKKyAqCisgKiAgQ29weXJpZ2h0IChjKSAyMDAzIEFSTSBMaW1pdGVkCisgKiAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKyNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCisJX19JTklUCisKKy8qCisgKiBNU00gc3BlY2lmaWMgZW50cnkgcG9pbnQgZm9yIHNlY29uZGFyeSBDUFVzLiAgVGhpcyBwcm92aWRlcworICogYSAiaG9sZGluZyBwZW4iIGludG8gd2hpY2ggYWxsIHNlY29uZGFyeSBjb3JlcyBhcmUgaGVsZCB1bnRpbCB3ZSdyZQorICogcmVhZHkgZm9yIHRoZW0gdG8gaW5pdGlhbGlzZS4KKyAqLworRU5UUlkobXNtX3NlY29uZGFyeV9zdGFydHVwKQorCW1yYwlwMTUsIDAsIHIwLCBjMCwgYzAsIDUKKwlhbmQJcjAsIHIwLCAjMTUKKwlhZHIJcjQsIDFmCisJbGRtaWEJcjQsIHtyNSwgcjZ9CisJc3ViCXI0LCByNCwgcjUKKwlhZGQJcjYsIHI2LCByNAorcGVuOglsZHIJcjcsIFtyNl0KKwljbXAJcjcsIHIwCisJYm5lCXBlbgorCisJLyoKKwkgKiB3ZSd2ZSBiZWVuIHJlbGVhc2VkIGZyb20gdGhlIGhvbGRpbmcgcGVuOiBzZWNvbmRhcnlfc3RhY2sKKwkgKiBzaG91bGQgbm93IGNvbnRhaW4gdGhlIFNWQyBzdGFjayBmb3IgdGhpcyBjb3JlCisJICovCisJYglzZWNvbmRhcnlfc3RhcnR1cAorCisJLmFsaWduCisxOgkubG9uZwkuCisJLmxvbmcJcGVuX3JlbGVhc2UKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXNtL2hvdHBsdWcuYyBiL2FyY2gvYXJtL21hY2gtbXNtL2hvdHBsdWcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTMxZjcwCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1tc20vaG90cGx1Zy5jCkBAIC0wLDAgKzEsOTEgQEAKKy8qCisgKiAgQ29weXJpZ2h0IChDKSAyMDAyIEFSTSBMdGQuCisgKiAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgorCisjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KKworZXh0ZXJuIHZvbGF0aWxlIGludCBwZW5fcmVsZWFzZTsKKworc3RhdGljIGlubGluZSB2b2lkIGNwdV9lbnRlcl9sb3dwb3dlcih2b2lkKQoreworCS8qIEp1c3QgZmx1c2ggdGhlIGNhY2hlLiBDaGFuZ2luZyB0aGUgY29oZXJlbmN5IGlzIG5vdCB5ZXQKKwkgKiBhdmFpbGFibGUgb24gbXNtLiAqLworCWZsdXNoX2NhY2hlX2FsbCgpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgY3B1X2xlYXZlX2xvd3Bvd2VyKHZvaWQpCit7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwbGF0Zm9ybV9kb19sb3dwb3dlcih1bnNpZ25lZCBpbnQgY3B1KQoreworCS8qIEp1c3QgZW50ZXIgd2ZpIGZvciBub3cuIFRPRE86IFByb3Blcmx5IHNodXQgb2ZmIHRoZSBjcHUuICovCisJZm9yICg7OykgeworCQkvKgorCQkgKiBoZXJlJ3MgdGhlIFdGSQorCQkgKi8KKwkJYXNtKCJ3ZmkiCisJCSAgICA6CisJCSAgICA6CisJCSAgICA6ICJtZW1vcnkiLCAiY2MiKTsKKworCQlpZiAocGVuX3JlbGVhc2UgPT0gY3B1KSB7CisJCQkvKgorCQkJICogT0ssIHByb3BlciB3YWtldXAsIHdlJ3JlIGRvbmUKKwkJCSAqLworCQkJYnJlYWs7CisJCX0KKworCQkvKgorCQkgKiBnZXR0aW5nIGhlcmUsIG1lYW5zIHRoYXQgd2UgaGF2ZSBjb21lIG91dCBvZiBXRkkgd2l0aG91dAorCQkgKiBoYXZpbmcgYmVlbiB3b2tlbiB1cCAtIHRoaXMgc2hvdWxkbid0IGhhcHBlbgorCQkgKgorCQkgKiBUaGUgdHJvdWJsZSBpcywgbGV0dGluZyBwZW9wbGUga25vdyBhYm91dCB0aGlzIGlzIG5vdCByZWFsbHkKKwkJICogcG9zc2libGUsIHNpbmNlIHdlIGFyZSBjdXJyZW50bHkgcnVubmluZyBpbmNvaGVyZW50bHksIGFuZAorCQkgKiB0aGVyZWZvcmUgY2Fubm90IHNhZmVseSBjYWxsIHByaW50aygpIG9yIGFueXRoaW5nIGVsc2UKKwkJICovCisJCXByX2RlYnVnKCJDUFUldTogc3B1cmlvdXMgd2FrZXVwIGNhbGxcbiIsIGNwdSk7CisJfQorfQorCitpbnQgcGxhdGZvcm1fY3B1X2tpbGwodW5zaWduZWQgaW50IGNwdSkKK3sKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIHBsYXRmb3JtLXNwZWNpZmljIGNvZGUgdG8gc2h1dGRvd24gYSBDUFUKKyAqCisgKiBDYWxsZWQgd2l0aCBJUlFzIGRpc2FibGVkCisgKi8KK3ZvaWQgcGxhdGZvcm1fY3B1X2RpZSh1bnNpZ25lZCBpbnQgY3B1KQoreworCS8qCisJICogd2UncmUgcmVhZHkgZm9yIHNodXRkb3duIG5vdywgc28gZG8gaXQKKwkgKi8KKwljcHVfZW50ZXJfbG93cG93ZXIoKTsKKwlwbGF0Zm9ybV9kb19sb3dwb3dlcihjcHUpOworCisJLyoKKwkgKiBicmluZyB0aGlzIENQVSBiYWNrIGludG8gdGhlIHdvcmxkIG9mIGNhY2hlCisJICogY29oZXJlbmN5LCBhbmQgdGhlbiByZXN0b3JlIGludGVycnVwdHMKKwkgKi8KKwljcHVfbGVhdmVfbG93cG93ZXIoKTsKK30KKworaW50IHBsYXRmb3JtX2NwdV9kaXNhYmxlKHVuc2lnbmVkIGludCBjcHUpCit7CisJLyoKKwkgKiB3ZSBkb24ndCBhbGxvdyBDUFUgMCB0byBiZSBzaHV0ZG93biAoaXQgaXMgc3RpbGwgdG9vIHNwZWNpYWwKKwkgKiBlLmcuIGNsb2NrIHRpY2sgaW50ZXJydXB0cykKKwkgKi8KKwlyZXR1cm4gY3B1ID09IDAgPyAtRVBFUk0gOiAwOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1tc20vaW5jbHVkZS9tYWNoL21zbV9pb21hcC04eDYwLmggYi9hcmNoL2FybS9tYWNoLW1zbS9pbmNsdWRlL21hY2gvbXNtX2lvbWFwLTh4NjAuaAppbmRleCA3YzQzYTliLi5hNTRlMzNiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW1zbS9pbmNsdWRlL21hY2gvbXNtX2lvbWFwLTh4NjAuaAorKysgYi9hcmNoL2FybS9tYWNoLW1zbS9pbmNsdWRlL21hY2gvbXNtX2lvbWFwLTh4NjAuaApAQCAtNjAsNyArNjAsMTEgQEAKIAogI2RlZmluZSBNU01fVE1SX0JBU0UJCUlPTUVNKDB4RjAyMDAwMDApCiAjZGVmaW5lIE1TTV9UTVJfUEhZUwkJMHgwMjAwMDAwMAotI2RlZmluZSBNU01fVE1SX1NJWkUJCShTWl8xTSkKKyNkZWZpbmUgTVNNX1RNUl9TSVpFCQlTWl80SworCisjZGVmaW5lIE1TTV9UTVIwX0JBU0UJCUlPTUVNKDB4RjAyMDEwMDApCisjZGVmaW5lIE1TTV9UTVIwX1BIWVMJCTB4MDIwNDAwMDAKKyNkZWZpbmUgTVNNX1RNUjBfU0laRQkJU1pfNEsKIAogI2RlZmluZSBNU01fR1BUX0JBU0UJCShNU01fVE1SX0JBU0UgKyAweDQpCiAjZGVmaW5lIE1TTV9ER1RfQkFTRQkJKE1TTV9UTVJfQkFTRSArIDB4MjQpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1zbS9pby5jIGIvYXJjaC9hcm0vbWFjaC1tc20vaW8uYwppbmRleCBmOTEyZDdiLi44MDBmMzI3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW1zbS9pby5jCisrKyBiL2FyY2gvYXJtL21hY2gtbXNtL2lvLmMKQEAgLTEwNSw2ICsxMDUsNyBAQAogCU1TTV9ERVZJQ0UoUUdJQ19ESVNUKSwKIAlNU01fREVWSUNFKFFHSUNfQ1BVKSwKIAlNU01fREVWSUNFKFRNUiksCisJTVNNX0RFVklDRShUTVIwKSwKIAlNU01fREVWSUNFKEFDQyksCiAJTVNNX0RFVklDRShHQ0MpLAogfTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXNtL3BsYXRzbXAuYyBiL2FyY2gvYXJtL21hY2gtbXNtL3BsYXRzbXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjQyN2JjCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1tc20vcGxhdHNtcC5jCkBAIC0wLDAgKzEsMTY2IEBACisvKgorICogIENvcHlyaWdodCAoQykgMjAwMiBBUk0gTHRkLgorICogIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqICBDb3B5cmlnaHQgKGMpIDIwMTAsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisKKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUvZ2ljLmg+CisjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KKyNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgorCisjaW5jbHVkZSA8bWFjaC9tc21faW9tYXAuaD4KKworI2luY2x1ZGUgInNjbS1ib290LmgiCisKKyNkZWZpbmUgVkREX1NDMV9BUlJBWV9DTEFNUF9HRlNfQ1RMIDB4MTVBMAorI2RlZmluZSBTQ1NTX0NQVTFDT1JFX1JFU0VUIDB4RDgwCisjZGVmaW5lIFNDU1NfREJHX1NUQVRVU19DT1JFX1BXUkRVUCAweEU2NAorCisvKiBNYXNrIGZvciBlZGdlIHRyaWdnZXIgUFBJcyBleGNlcHQgQVZTX1NWSUNJTlQgYW5kIEFWU19TVklDSU5UU1dET05FICovCisjZGVmaW5lIEdJQ19QUElfRURHRV9NQVNLIDB4RkZGRkQ3RkYKKworZXh0ZXJuIHZvaWQgbXNtX3NlY29uZGFyeV9zdGFydHVwKHZvaWQpOworLyoKKyAqIGNvbnRyb2wgZm9yIHdoaWNoIGNvcmUgaXMgdGhlIG5leHQgdG8gY29tZSBvdXQgb2YgdGhlIHNlY29uZGFyeQorICogYm9vdCAiaG9sZGluZyBwZW4iLgorICovCit2b2xhdGlsZSBpbnQgcGVuX3JlbGVhc2UgPSAtMTsKKworc3RhdGljIERFRklORV9TUElOTE9DSyhib290X2xvY2spOworCit2b2lkIF9fY3B1aW5pdCBwbGF0Zm9ybV9zZWNvbmRhcnlfaW5pdCh1bnNpZ25lZCBpbnQgY3B1KQoreworCS8qIENvbmZpZ3VyZSBlZGdlLXRyaWdnZXJlZCBQUElzICovCisJd3JpdGVsKEdJQ19QUElfRURHRV9NQVNLLCBNU01fUUdJQ19ESVNUX0JBU0UgKyBHSUNfRElTVF9DT05GSUcgKyA0KTsKKworCS8qCisJICogaWYgYW55IGludGVycnVwdHMgYXJlIGFscmVhZHkgZW5hYmxlZCBmb3IgdGhlIHByaW1hcnkKKwkgKiBjb3JlIChlLmcuIHRpbWVyIGlycSksIHRoZW4gdGhleSB3aWxsIG5vdCBoYXZlIGJlZW4gZW5hYmxlZAorCSAqIGZvciB1czogZG8gc28KKwkgKi8KKwlnaWNfc2Vjb25kYXJ5X2luaXQoMCk7CisKKwkvKgorCSAqIGxldCB0aGUgcHJpbWFyeSBwcm9jZXNzb3Iga25vdyB3ZSdyZSBvdXQgb2YgdGhlCisJICogcGVuLCB0aGVuIGhlYWQgb2ZmIGludG8gdGhlIEMgZW50cnkgcG9pbnQKKwkgKi8KKwlwZW5fcmVsZWFzZSA9IC0xOworCXNtcF93bWIoKTsKKworCS8qCisJICogU3luY2hyb25pc2Ugd2l0aCB0aGUgYm9vdCB0aHJlYWQuCisJICovCisJc3Bpbl9sb2NrKCZib290X2xvY2spOworCXNwaW5fdW5sb2NrKCZib290X2xvY2spOworfQorCitzdGF0aWMgX19jcHVpbml0IHZvaWQgcHJlcGFyZV9jb2xkX2NwdSh1bnNpZ25lZCBpbnQgY3B1KQoreworCWludCByZXQ7CisJcmV0ID0gc2NtX3NldF9ib290X2FkZHIodmlydF90b19waHlzKG1zbV9zZWNvbmRhcnlfc3RhcnR1cCksCisJCQkJU0NNX0ZMQUdfQ09MREJPT1RfQ1BVMSk7CisJaWYgKHJldCA9PSAwKSB7CisJCXZvaWQgKnNjMV9iYXNlX3B0cjsKKwkJc2MxX2Jhc2VfcHRyID0gaW9yZW1hcF9ub2NhY2hlKDB4MDA5MDIwMDAsIFNaXzRLKjIpOworCQlpZiAoc2MxX2Jhc2VfcHRyKSB7CisJCQl3cml0ZWwoMCwgc2MxX2Jhc2VfcHRyICsgVkREX1NDMV9BUlJBWV9DTEFNUF9HRlNfQ1RMKTsKKwkJCXdyaXRlbCgwLCBzYzFfYmFzZV9wdHIgKyBTQ1NTX0NQVTFDT1JFX1JFU0VUKTsKKwkJCXdyaXRlbCgzLCBzYzFfYmFzZV9wdHIgKyBTQ1NTX0RCR19TVEFUVVNfQ09SRV9QV1JEVVApOworCQkJaW91bm1hcChzYzFfYmFzZV9wdHIpOworCQl9CisJfSBlbHNlCisJCXByaW50ayhLRVJOX0RFQlVHICJGYWlsZWQgdG8gc2V0IHNlY29uZGFyeSBjb3JlIGJvb3QgIgorCQkJCSAgImFkZHJlc3NcbiIpOworfQorCitpbnQgX19jcHVpbml0IGJvb3Rfc2Vjb25kYXJ5KHVuc2lnbmVkIGludCBjcHUsIHN0cnVjdCB0YXNrX3N0cnVjdCAqaWRsZSkKK3sKKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CisJc3RhdGljIGludCBjb2xkX2Jvb3RfZG9uZTsKKworCS8qIE9ubHkgbmVlZCB0byBicmluZyBjcHUgb3V0IG9mIHJlc2V0IHRoaXMgd2F5IG9uY2UgKi8KKwlpZiAoY29sZF9ib290X2RvbmUgPT0gZmFsc2UpIHsKKwkJcHJlcGFyZV9jb2xkX2NwdShjcHUpOworCQljb2xkX2Jvb3RfZG9uZSA9IHRydWU7CisJfQorCisJLyoKKwkgKiBzZXQgc3luY2hyb25pc2F0aW9uIHN0YXRlIGJldHdlZW4gdGhpcyBib290IHByb2Nlc3NvcgorCSAqIGFuZCB0aGUgc2Vjb25kYXJ5IG9uZQorCSAqLworCXNwaW5fbG9jaygmYm9vdF9sb2NrKTsKKworCS8qCisJICogVGhlIHNlY29uZGFyeSBwcm9jZXNzb3IgaXMgd2FpdGluZyB0byBiZSByZWxlYXNlZCBmcm9tCisJICogdGhlIGhvbGRpbmcgcGVuIC0gcmVsZWFzZSBpdCwgdGhlbiB3YWl0IGZvciBpdCB0byBmbGFnCisJICogdGhhdCBpdCBoYXMgYmVlbiByZWxlYXNlZCBieSByZXNldHRpbmcgcGVuX3JlbGVhc2UuCisJICoKKwkgKiBOb3RlIHRoYXQgInBlbl9yZWxlYXNlIiBpcyB0aGUgaGFyZHdhcmUgQ1BVIElELCB3aGVyZWFzCisJICogImNwdSIgaXMgTGludXgncyBpbnRlcm5hbCBJRC4KKwkgKi8KKwlwZW5fcmVsZWFzZSA9IGNwdTsKKwlfX2NwdWNfZmx1c2hfZGNhY2hlX2FyZWEoKHZvaWQgKikmcGVuX3JlbGVhc2UsIHNpemVvZihwZW5fcmVsZWFzZSkpOworCW91dGVyX2NsZWFuX3JhbmdlKF9fcGEoJnBlbl9yZWxlYXNlKSwgX19wYSgmcGVuX3JlbGVhc2UgKyAxKSk7CisKKwkvKgorCSAqIFNlbmQgdGhlIHNlY29uZGFyeSBDUFUgYSBzb2Z0IGludGVycnVwdCwgdGhlcmVieSBjYXVzaW5nCisJICogdGhlIGJvb3QgbW9uaXRvciB0byByZWFkIHRoZSBzeXN0ZW0gd2lkZSBmbGFncyByZWdpc3RlciwKKwkgKiBhbmQgYnJhbmNoIHRvIHRoZSBhZGRyZXNzIGZvdW5kIHRoZXJlLgorCSAqLworCXNtcF9jcm9zc19jYWxsKGNwdW1hc2tfb2YoY3B1KSwgMSk7CisKKwl0aW1lb3V0ID0gamlmZmllcyArICgxICogSFopOworCXdoaWxlICh0aW1lX2JlZm9yZShqaWZmaWVzLCB0aW1lb3V0KSkgeworCQlzbXBfcm1iKCk7CisJCWlmIChwZW5fcmVsZWFzZSA9PSAtMSkKKwkJCWJyZWFrOworCisJCXVkZWxheSgxMCk7CisJfQorCisJLyoKKwkgKiBub3cgdGhlIHNlY29uZGFyeSBjb3JlIGlzIHN0YXJ0aW5nIHVwIGxldCBpdCBydW4gaXRzCisJICogY2FsaWJyYXRpb25zLCB0aGVuIHdhaXQgZm9yIGl0IHRvIGZpbmlzaAorCSAqLworCXNwaW5fdW5sb2NrKCZib290X2xvY2spOworCisJcmV0dXJuIHBlbl9yZWxlYXNlICE9IC0xID8gLUVOT1NZUyA6IDA7Cit9CisKKy8qCisgKiBJbml0aWFsaXNlIHRoZSBDUFUgcG9zc2libGUgbWFwIGVhcmx5IC0gdGhpcyBkZXNjcmliZXMgdGhlIENQVXMKKyAqIHdoaWNoIG1heSBiZSBwcmVzZW50IG9yIGJlY29tZSBwcmVzZW50IGluIHRoZSBzeXN0ZW0uIFRoZSBtc204eDYwCisgKiBkb2VzIG5vdCBzdXBwb3J0IHRoZSBBUk0gU0NVLCBzbyBqdXN0IHNldCB0aGUgcG9zc2libGUgY3B1IG1hc2sgdG8KKyAqIE5SX0NQVVMuCisgKi8KK3ZvaWQgX19pbml0IHNtcF9pbml0X2NwdXModm9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBOUl9DUFVTOyBpKyspCisJCXNldF9jcHVfcG9zc2libGUoaSwgdHJ1ZSk7Cit9CisKK3ZvaWQgX19pbml0IHBsYXRmb3JtX3NtcF9wcmVwYXJlX2NwdXModW5zaWduZWQgaW50IG1heF9jcHVzKQoreworCWludCBpOworCisJLyoKKwkgKiBJbml0aWFsaXNlIHRoZSBwcmVzZW50IG1hcCwgd2hpY2ggZGVzY3JpYmVzIHRoZSBzZXQgb2YgQ1BVcworCSAqIGFjdHVhbGx5IHBvcHVsYXRlZCBhdCB0aGUgcHJlc2VudCB0aW1lLgorCSAqLworCWZvciAoaSA9IDA7IGkgPCBtYXhfY3B1czsgaSsrKQorCQlzZXRfY3B1X3ByZXNlbnQoaSwgdHJ1ZSk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1zbS9zY20tYm9vdC5jIGIvYXJjaC9hcm0vbWFjaC1tc20vc2NtLWJvb3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NWNlZTNlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1tc20vc2NtLWJvb3QuYwpAQCAtMCwwICsxLDM5IEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTAsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKworI2luY2x1ZGUgInNjbS5oIgorI2luY2x1ZGUgInNjbS1ib290LmgiCisKKy8qCisgKiBTZXQgdGhlIGNvbGQvd2FybSBib290IGFkZHJlc3MgZm9yIG9uZSBvZiB0aGUgQ1BVIGNvcmVzLgorICovCitpbnQgc2NtX3NldF9ib290X2FkZHIocGh5c19hZGRyX3QgYWRkciwgaW50IGZsYWdzKQoreworCXN0cnVjdCB7CisJCXVuc2lnbmVkIGludCBmbGFnczsKKwkJcGh5c19hZGRyX3QgIGFkZHI7CisJfSBjbWQ7CisKKwljbWQuYWRkciA9IGFkZHI7CisJY21kLmZsYWdzID0gZmxhZ3M7CisJcmV0dXJuIHNjbV9jYWxsKFNDTV9TVkNfQk9PVCwgU0NNX0JPT1RfQUREUiwKKwkJCSZjbWQsIHNpemVvZihjbWQpLCBOVUxMLCAwKTsKK30KK0VYUE9SVF9TWU1CT0woc2NtX3NldF9ib290X2FkZHIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1tc20vc2NtLWJvb3QuaCBiL2FyY2gvYXJtL21hY2gtbXNtL3NjbS1ib290LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjhmOWI2MQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtbXNtL3NjbS1ib290LmgKQEAgLTAsMCArMSwzOCBAQAorLyogQ29weXJpZ2h0IChjKSAyMDEwLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkCisgKiAgICAgICB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIENvZGUgQXVyb3JhIEZvcnVtLCBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5UCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SCisgKiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKKyAqIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFCisgKiBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOCisgKiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworI2lmbmRlZiBfX01BQ0hfU0NNX0JPT1RfSAorI2RlZmluZSBfX01BQ0hfU0NNX0JPT1RfSAorCisjZGVmaW5lIFNDTV9CT09UX0FERFIJCQkweDEKKyNkZWZpbmUgU0NNX0ZMQUdfQ09MREJPT1RfQ1BVMQkJMHgxCisjZGVmaW5lIFNDTV9GTEFHX1dBUk1CT09UX0NQVTEJCTB4MgorI2RlZmluZSBTQ01fRkxBR19XQVJNQk9PVF9DUFUwCQkweDQKKworaW50IHNjbV9zZXRfYm9vdF9hZGRyKHBoeXNfYWRkcl90IGFkZHIsIGludCBmbGFncyk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1tc20vc2NtLmMgYi9hcmNoL2FybS9tYWNoLW1zbS9zY20uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNGI5YmM5Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1tc20vc2NtLmMKQEAgLTAsMCArMSwyODcgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxMCwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorCisjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KKworI2luY2x1ZGUgInNjbS5oIgorCisvKiBDYWNoZSBsaW5lIHNpemUgZm9yIG1zbTh4NjAgKi8KKyNkZWZpbmUgQ0FDSEVMSU5FU0laRSAzMgorCisjZGVmaW5lIFNDTV9FTk9NRU0JCS01CisjZGVmaW5lIFNDTV9FT1BOT1RTVVBQCQktNAorI2RlZmluZSBTQ01fRUlOVkFMX0FERFIJCS0zCisjZGVmaW5lIFNDTV9FSU5WQUxfQVJHCQktMgorI2RlZmluZSBTQ01fRVJST1IJCS0xCisjZGVmaW5lIFNDTV9JTlRFUlJVUFRFRAkJMQorCitzdGF0aWMgREVGSU5FX01VVEVYKHNjbV9sb2NrKTsKKworLyoqCisgKiBzdHJ1Y3Qgc2NtX2NvbW1hbmQgLSBvbmUgU0NNIGNvbW1hbmQgYnVmZmVyCisgKiBAbGVuOiB0b3RhbCBhdmFpbGFibGUgbWVtb3J5IGZvciBjb21tYW5kIGFuZCByZXNwb25zZQorICogQGJ1Zl9vZmZzZXQ6IHN0YXJ0IG9mIGNvbW1hbmQgYnVmZmVyCisgKiBAcmVzcF9oZHJfb2Zmc2V0OiBzdGFydCBvZiByZXNwb25zZSBidWZmZXIKKyAqIEBpZDogY29tbWFuZCB0byBiZSBleGVjdXRlZAorICogQGJ1ZjogYnVmZmVyIHJldHVybmVkIGZyb20gc2NtX2dldF9jb21tYW5kX2J1ZmZlcigpCisgKgorICogQW4gU0NNIGNvbW1hbmQgaXMgbGF5ZWQgb3V0IGluIG1lbW9yeSBhcyBmb2xsb3dzOgorICoKKyAqCS0tLS0tLS0tLS0tLS0tLS0tLS0gPC0tLSBzdHJ1Y3Qgc2NtX2NvbW1hbmQKKyAqCXwgY29tbWFuZCBoZWFkZXIgIHwKKyAqCS0tLS0tLS0tLS0tLS0tLS0tLS0gPC0tLSBzY21fZ2V0X2NvbW1hbmRfYnVmZmVyKCkKKyAqCXwgY29tbWFuZCBidWZmZXIgIHwKKyAqCS0tLS0tLS0tLS0tLS0tLS0tLS0gPC0tLSBzdHJ1Y3Qgc2NtX3Jlc3BvbnNlIGFuZAorICoJfCByZXNwb25zZSBoZWFkZXIgfCAgICAgIHNjbV9jb21tYW5kX3RvX3Jlc3BvbnNlKCkKKyAqCS0tLS0tLS0tLS0tLS0tLS0tLS0gPC0tLSBzY21fZ2V0X3Jlc3BvbnNlX2J1ZmZlcigpCisgKgl8IHJlc3BvbnNlIGJ1ZmZlciB8CisgKgktLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogVGhlcmUgY2FuIGJlIGFyYml0cmFyeSBwYWRkaW5nIGJldHdlZW4gdGhlIGhlYWRlcnMgYW5kIGJ1ZmZlcnMgc28KKyAqIHlvdSBzaG91bGQgYWx3YXlzIHVzZSB0aGUgYXBwcm9wcmlhdGUgc2NtX2dldF8qX2J1ZmZlcigpIHJvdXRpbmVzCisgKiB0byBhY2Nlc3MgdGhlIGJ1ZmZlcnMgaW4gYSBzYWZlIG1hbm5lci4KKyAqLworc3RydWN0IHNjbV9jb21tYW5kIHsKKwl1MzIJbGVuOworCXUzMglidWZfb2Zmc2V0OworCXUzMglyZXNwX2hkcl9vZmZzZXQ7CisJdTMyCWlkOworCXUzMglidWZbMF07Cit9OworCisvKioKKyAqIHN0cnVjdCBzY21fcmVzcG9uc2UgLSBvbmUgU0NNIHJlc3BvbnNlIGJ1ZmZlcgorICogQGxlbjogdG90YWwgYXZhaWxhYmxlIG1lbW9yeSBmb3IgcmVzcG9uc2UKKyAqIEBidWZfb2Zmc2V0OiBzdGFydCBvZiByZXNwb25zZSBkYXRhIHJlbGF0aXZlIHRvIHN0YXJ0IG9mIHNjbV9yZXNwb25zZQorICogQGlzX2NvbXBsZXRlOiBpbmRpY2F0ZXMgaWYgdGhlIGNvbW1hbmQgaGFzIGZpbmlzaGVkIHByb2Nlc3NpbmcKKyAqLworc3RydWN0IHNjbV9yZXNwb25zZSB7CisJdTMyCWxlbjsKKwl1MzIJYnVmX29mZnNldDsKKwl1MzIJaXNfY29tcGxldGU7Cit9OworCisvKioKKyAqIGFsbG9jX3NjbV9jb21tYW5kKCkgLSBBbGxvY2F0ZSBhbiBTQ00gY29tbWFuZAorICogQGNtZF9zaXplOiBzaXplIG9mIHRoZSBjb21tYW5kIGJ1ZmZlcgorICogQHJlc3Bfc2l6ZTogc2l6ZSBvZiB0aGUgcmVzcG9uc2UgYnVmZmVyCisgKgorICogQWxsb2NhdGUgYW4gU0NNIGNvbW1hbmQsIGluY2x1ZGluZyBlbm91Z2ggcm9vbSBmb3IgdGhlIGNvbW1hbmQKKyAqIGFuZCByZXNwb25zZSBoZWFkZXJzIGFzIHdlbGwgYXMgdGhlIGNvbW1hbmQgYW5kIHJlc3BvbnNlIGJ1ZmZlcnMuCisgKgorICogUmV0dXJucyBhIHZhbGlkICZzY21fY29tbWFuZCBvbiBzdWNjZXNzIG9yICVOVUxMIGlmIHRoZSBhbGxvY2F0aW9uIGZhaWxzLgorICovCitzdGF0aWMgc3RydWN0IHNjbV9jb21tYW5kICphbGxvY19zY21fY29tbWFuZChzaXplX3QgY21kX3NpemUsIHNpemVfdCByZXNwX3NpemUpCit7CisJc3RydWN0IHNjbV9jb21tYW5kICpjbWQ7CisJc2l6ZV90IGxlbiA9IHNpemVvZigqY21kKSArIHNpemVvZihzdHJ1Y3Qgc2NtX3Jlc3BvbnNlKSArIGNtZF9zaXplICsKKwkJcmVzcF9zaXplOworCisJY21kID0ga3phbGxvYyhQQUdFX0FMSUdOKGxlbiksIEdGUF9LRVJORUwpOworCWlmIChjbWQpIHsKKwkJY21kLT5sZW4gPSBsZW47CisJCWNtZC0+YnVmX29mZnNldCA9IG9mZnNldG9mKHN0cnVjdCBzY21fY29tbWFuZCwgYnVmKTsKKwkJY21kLT5yZXNwX2hkcl9vZmZzZXQgPSBjbWQtPmJ1Zl9vZmZzZXQgKyBjbWRfc2l6ZTsKKwl9CisJcmV0dXJuIGNtZDsKK30KKworLyoqCisgKiBmcmVlX3NjbV9jb21tYW5kKCkgLSBGcmVlIGFuIFNDTSBjb21tYW5kCisgKiBAY21kOiBjb21tYW5kIHRvIGZyZWUKKyAqCisgKiBGcmVlIGFuIFNDTSBjb21tYW5kLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgZnJlZV9zY21fY29tbWFuZChzdHJ1Y3Qgc2NtX2NvbW1hbmQgKmNtZCkKK3sKKwlrZnJlZShjbWQpOworfQorCisvKioKKyAqIHNjbV9jb21tYW5kX3RvX3Jlc3BvbnNlKCkgLSBHZXQgYSBwb2ludGVyIHRvIGEgc2NtX3Jlc3BvbnNlCisgKiBAY21kOiBjb21tYW5kCisgKgorICogUmV0dXJucyBhIHBvaW50ZXIgdG8gYSByZXNwb25zZSBmb3IgYSBjb21tYW5kLgorICovCitzdGF0aWMgaW5saW5lIHN0cnVjdCBzY21fcmVzcG9uc2UgKnNjbV9jb21tYW5kX3RvX3Jlc3BvbnNlKAorCQljb25zdCBzdHJ1Y3Qgc2NtX2NvbW1hbmQgKmNtZCkKK3sKKwlyZXR1cm4gKHZvaWQgKiljbWQgKyBjbWQtPnJlc3BfaGRyX29mZnNldDsKK30KKworLyoqCisgKiBzY21fZ2V0X2NvbW1hbmRfYnVmZmVyKCkgLSBHZXQgYSBwb2ludGVyIHRvIGEgY29tbWFuZCBidWZmZXIKKyAqIEBjbWQ6IGNvbW1hbmQKKyAqCisgKiBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgY29tbWFuZCBidWZmZXIgb2YgYSBjb21tYW5kLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgKnNjbV9nZXRfY29tbWFuZF9idWZmZXIoY29uc3Qgc3RydWN0IHNjbV9jb21tYW5kICpjbWQpCit7CisJcmV0dXJuICh2b2lkICopY21kLT5idWY7Cit9CisKKy8qKgorICogc2NtX2dldF9yZXNwb25zZV9idWZmZXIoKSAtIEdldCBhIHBvaW50ZXIgdG8gYSByZXNwb25zZSBidWZmZXIKKyAqIEByc3A6IHJlc3BvbnNlCisgKgorICogUmV0dXJucyBhIHBvaW50ZXIgdG8gYSByZXNwb25zZSBidWZmZXIgb2YgYSByZXNwb25zZS4KKyAqLworc3RhdGljIGlubGluZSB2b2lkICpzY21fZ2V0X3Jlc3BvbnNlX2J1ZmZlcihjb25zdCBzdHJ1Y3Qgc2NtX3Jlc3BvbnNlICpyc3ApCit7CisJcmV0dXJuICh2b2lkICopcnNwICsgcnNwLT5idWZfb2Zmc2V0OworfQorCitzdGF0aWMgaW50IHNjbV9yZW1hcF9lcnJvcihpbnQgZXJyKQoreworCXN3aXRjaCAoZXJyKSB7CisJY2FzZSBTQ01fRVJST1I6CisJCXJldHVybiAtRUlPOworCWNhc2UgU0NNX0VJTlZBTF9BRERSOgorCWNhc2UgU0NNX0VJTlZBTF9BUkc6CisJCXJldHVybiAtRUlOVkFMOworCWNhc2UgU0NNX0VPUE5PVFNVUFA6CisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwljYXNlIFNDTV9FTk9NRU06CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIHUzMiBzbWModTMyIGNtZF9hZGRyKQoreworCWludCBjb250ZXh0X2lkOworCXJlZ2lzdGVyIHUzMiByMCBhc20oInIwIikgPSAxOworCXJlZ2lzdGVyIHUzMiByMSBhc20oInIxIikgPSAodTMyKSZjb250ZXh0X2lkOworCXJlZ2lzdGVyIHUzMiByMiBhc20oInIyIikgPSBjbWRfYWRkcjsKKwlhc20oCisJCV9fYXNtZXEoIiUwIiwgInIwIikKKwkJX19hc21lcSgiJTEiLCAicjAiKQorCQlfX2FzbWVxKCIlMiIsICJyMSIpCisJCV9fYXNtZXEoIiUzIiwgInIyIikKKwkJInNtYwkjMAlAIHN3aXRjaCB0byBzZWN1cmUgd29ybGRcbiIKKwkJOiAiPXIiIChyMCkKKwkJOiAiciIgKHIwKSwgInIiIChyMSksICJyIiAocjIpCisJCTogInIzIik7CisJcmV0dXJuIHIwOworfQorCitzdGF0aWMgaW50IF9fc2NtX2NhbGwoY29uc3Qgc3RydWN0IHNjbV9jb21tYW5kICpjbWQpCit7CisJaW50IHJldDsKKwl1MzIgY21kX2FkZHIgPSB2aXJ0X3RvX3BoeXMoY21kKTsKKworCS8qCisJICogRmx1c2ggdGhlIGVudGlyZSBjYWNoZSBoZXJlIHNvIGNhbGxlcnMgZG9uJ3QgaGF2ZSB0byByZW1lbWJlcgorCSAqIHRvIGZsdXNoIHRoZSBjYWNoZSB3aGVuIHBhc3NpbmcgcGh5c2ljYWwgYWRkcmVzc2VzIHRvIHRoZSBzZWN1cmUKKwkgKiBzaWRlIGluIHRoZSBidWZmZXIuCisJICovCisJZmx1c2hfY2FjaGVfYWxsKCk7CisJZG8geworCQlyZXQgPSBzbWMoY21kX2FkZHIpOworCQlpZiAocmV0IDwgMCkgeworCQkJcmV0ID0gc2NtX3JlbWFwX2Vycm9yKHJldCk7CisJCQlicmVhazsKKwkJfQorCX0gd2hpbGUgKHJldCA9PSBTQ01fSU5URVJSVVBURUQpOworCisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBzY21fY2FsbCgpIC0gU2VuZCBhbiBTQ00gY29tbWFuZAorICogQHN2Y19pZDogc2VydmljZSBpZGVudGlmaWVyCisgKiBAY21kX2lkOiBjb21tYW5kIGlkZW50aWZpZXIKKyAqIEBjbWRfYnVmOiBjb21tYW5kIGJ1ZmZlcgorICogQGNtZF9sZW46IGxlbmd0aCBvZiB0aGUgY29tbWFuZCBidWZmZXIKKyAqIEByZXNwX2J1ZjogcmVzcG9uc2UgYnVmZmVyCisgKiBAcmVzcF9sZW46IGxlbmd0aCBvZiB0aGUgcmVzcG9uc2UgYnVmZmVyCisgKgorICogU2VuZHMgYSBjb21tYW5kIHRvIHRoZSBTQ00gYW5kIHdhaXRzIGZvciB0aGUgY29tbWFuZCB0byBmaW5pc2ggcHJvY2Vzc2luZy4KKyAqLworaW50IHNjbV9jYWxsKHUzMiBzdmNfaWQsIHUzMiBjbWRfaWQsIGNvbnN0IHZvaWQgKmNtZF9idWYsIHNpemVfdCBjbWRfbGVuLAorCQl2b2lkICpyZXNwX2J1Ziwgc2l6ZV90IHJlc3BfbGVuKQoreworCWludCByZXQ7CisJc3RydWN0IHNjbV9jb21tYW5kICpjbWQ7CisJc3RydWN0IHNjbV9yZXNwb25zZSAqcnNwOworCisJY21kID0gYWxsb2Nfc2NtX2NvbW1hbmQoY21kX2xlbiwgcmVzcF9sZW4pOworCWlmICghY21kKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWNtZC0+aWQgPSAoc3ZjX2lkIDw8IDEwKSB8IGNtZF9pZDsKKwlpZiAoY21kX2J1ZikKKwkJbWVtY3B5KHNjbV9nZXRfY29tbWFuZF9idWZmZXIoY21kKSwgY21kX2J1ZiwgY21kX2xlbik7CisKKwltdXRleF9sb2NrKCZzY21fbG9jayk7CisJcmV0ID0gX19zY21fY2FsbChjbWQpOworCW11dGV4X3VubG9jaygmc2NtX2xvY2spOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCisJcnNwID0gc2NtX2NvbW1hbmRfdG9fcmVzcG9uc2UoY21kKTsKKwlkbyB7CisJCXUzMiBzdGFydCA9ICh1MzIpcnNwOworCQl1MzIgZW5kID0gKHUzMilzY21fZ2V0X3Jlc3BvbnNlX2J1ZmZlcihyc3ApICsgcmVzcF9sZW47CisJCXN0YXJ0ICY9IH4oQ0FDSEVMSU5FU0laRSAtIDEpOworCQl3aGlsZSAoc3RhcnQgPCBlbmQpIHsKKwkJCWFzbSAoIm1jciBwMTUsIDAsICUwLCBjNywgYzYsIDEiIDogOiAiciIgKHN0YXJ0KQorCQkJICAgICA6ICJtZW1vcnkiKTsKKwkJCXN0YXJ0ICs9IENBQ0hFTElORVNJWkU7CisJCX0KKwl9IHdoaWxlICghcnNwLT5pc19jb21wbGV0ZSk7CisKKwlpZiAocmVzcF9idWYpCisJCW1lbWNweShyZXNwX2J1Ziwgc2NtX2dldF9yZXNwb25zZV9idWZmZXIocnNwKSwgcmVzcF9sZW4pOworb3V0OgorCWZyZWVfc2NtX2NvbW1hbmQoY21kKTsKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTChzY21fY2FsbCk7CisKK3UzMiBzY21fZ2V0X3ZlcnNpb24odm9pZCkKK3sKKwlpbnQgY29udGV4dF9pZDsKKwlzdGF0aWMgdTMyIHZlcnNpb24gPSAtMTsKKwlyZWdpc3RlciB1MzIgcjAgYXNtKCJyMCIpID0gMHgxIDw8IDg7CisJcmVnaXN0ZXIgdTMyIHIxIGFzbSgicjEiKSA9ICh1MzIpJmNvbnRleHRfaWQ7CisKKwlpZiAodmVyc2lvbiAhPSAtMSkKKwkJcmV0dXJuIHZlcnNpb247CisKKwltdXRleF9sb2NrKCZzY21fbG9jayk7CisJYXNtKAorCQlfX2FzbWVxKCIlMCIsICJyMSIpCisJCV9fYXNtZXEoIiUxIiwgInIwIikKKwkJX19hc21lcSgiJTIiLCAicjEiKQorCQkic21jCSMwCUAgc3dpdGNoIHRvIHNlY3VyZSB3b3JsZFxuIgorCQk6ICI9ciIgKHIxKQorCQk6ICJyIiAocjApLCAiciIgKHIxKQorCQk6ICJyMiIsICJyMyIpOworCXZlcnNpb24gPSByMTsKKwltdXRleF91bmxvY2soJnNjbV9sb2NrKTsKKworCXJldHVybiB2ZXJzaW9uOworfQorRVhQT1JUX1NZTUJPTChzY21fZ2V0X3ZlcnNpb24pOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1tc20vc2NtLmggYi9hcmNoL2FybS9tYWNoLW1zbS9zY20uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjE3ODZiCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1tc20vc2NtLmgKQEAgLTAsMCArMSw0MSBAQAorLyogQ29weXJpZ2h0IChjKSAyMDEwLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkCisgKiAgICAgICB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIENvZGUgQXVyb3JhIEZvcnVtLCBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5UCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SCisgKiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKKyAqIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFCisgKiBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOCisgKiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworI2lmbmRlZiBfX01BQ0hfU0NNX0gKKyNkZWZpbmUgX19NQUNIX1NDTV9ICisKKyNkZWZpbmUgU0NNX1NWQ19CT09UCQkJMHgxCisjZGVmaW5lIFNDTV9TVkNfUElMCQkJMHgyCisKK2V4dGVybiBpbnQgc2NtX2NhbGwodTMyIHN2Y19pZCwgdTMyIGNtZF9pZCwgY29uc3Qgdm9pZCAqY21kX2J1Ziwgc2l6ZV90IGNtZF9sZW4sCisJCXZvaWQgKnJlc3BfYnVmLCBzaXplX3QgcmVzcF9sZW4pOworCisjZGVmaW5lIFNDTV9WRVJTSU9OKG1ham9yLCBtaW5vcikgKCgobWFqb3IpIDw8IDE2KSB8ICgobWlub3IpICYgMHhGRikpCisKK2V4dGVybiB1MzIgc2NtX2dldF92ZXJzaW9uKHZvaWQpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXNtL3RpbWVyLmMgYi9hcmNoL2FybS9tYWNoLW1zbS90aW1lci5jCmluZGV4IDU5NWJlN2YuLmMxMDVkMjggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbXNtL3RpbWVyLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1tc20vdGltZXIuYwpAQCAtNDcsNiArNDcsMTkgQEAKIAogI2RlZmluZSBHUFRfSFogMzI3NjgKIAorZW51bSB0aW1lcl9sb2NhdGlvbiB7CisJTE9DQUxfVElNRVIgPSAwLAorCUdMT0JBTF9USU1FUiA9IDEsCit9OworCisjaWZkZWYgTVNNX1RNUjBfQkFTRQorI2RlZmluZSBNU01fVE1SX0dMT0JBTAkJKE1TTV9UTVIwX0JBU0UgLSBNU01fVE1SX0JBU0UpCisjZWxzZQorI2RlZmluZSBNU01fVE1SX0dMT0JBTAkJMAorI2VuZGlmCisKKyNkZWZpbmUgTVNNX0dMT0JBTF9USU1FUiBNU01fQ0xPQ0tfREdUCisKICNpZiBkZWZpbmVkKENPTkZJR19BUkNIX1FTRDhYNTApCiAjZGVmaW5lIERHVF9IWiAoMTkyMDAwMDAgLyA0KSAvKiAxOS4yIE1IeiAvIDQgYnkgZGVmYXVsdCAqLwogI2RlZmluZSBNU01fREdUX1NISUZUICgwKQpAQCAtNjUsNDkgKzc4LDY3IEBACiAJdm9pZCBfX2lvbWVtICAgICAgICAgICAgICAgICpyZWdiYXNlOwogCXVpbnQzMl90ICAgICAgICAgICAgICAgICAgICBmcmVxOwogCXVpbnQzMl90ICAgICAgICAgICAgICAgICAgICBzaGlmdDsKKwl2b2lkIF9faW9tZW0gICAgICAgICAgICAgICAgKmdsb2JhbF9jb3VudGVyOworCXZvaWQgX19pb21lbSAgICAgICAgICAgICAgICAqbG9jYWxfY291bnRlcjsKIH07CiAKK2VudW0geworCU1TTV9DTE9DS19HUFQsCisJTVNNX0NMT0NLX0RHVCwKKwlOUl9USU1FUlMsCit9OworCisKK3N0YXRpYyBzdHJ1Y3QgbXNtX2Nsb2NrIG1zbV9jbG9ja3NbXTsKK3N0YXRpYyBzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpsb2NhbF9jbG9ja19ldmVudDsKKwogc3RhdGljIGlycXJldHVybl90IG1zbV90aW1lcl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkKQogewogCXN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmV2dCA9IGRldl9pZDsKKwlpZiAoc21wX3Byb2Nlc3Nvcl9pZCgpICE9IDApCisJCWV2dCA9IGxvY2FsX2Nsb2NrX2V2ZW50OworCWlmIChldnQtPmV2ZW50X2hhbmRsZXIgPT0gTlVMTCkKKwkJcmV0dXJuIElSUV9IQU5ETEVEOwogCWV2dC0+ZXZlbnRfaGFuZGxlcihldnQpOwogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIAotc3RhdGljIGN5Y2xlX3QgbXNtX2dwdF9yZWFkKHN0cnVjdCBjbG9ja3NvdXJjZSAqY3MpCitzdGF0aWMgY3ljbGVfdCBtc21fcmVhZF90aW1lcl9jb3VudChzdHJ1Y3QgY2xvY2tzb3VyY2UgKmNzKQogewotCXJldHVybiByZWFkbChNU01fR1BUX0JBU0UgKyBUSU1FUl9DT1VOVF9WQUwpOworCXN0cnVjdCBtc21fY2xvY2sgKmNsayA9IGNvbnRhaW5lcl9vZihjcywgc3RydWN0IG1zbV9jbG9jaywgY2xvY2tzb3VyY2UpOworCisJcmV0dXJuIHJlYWRsKGNsay0+Z2xvYmFsX2NvdW50ZXIpOwogfQogCi1zdGF0aWMgY3ljbGVfdCBtc21fZGd0X3JlYWQoc3RydWN0IGNsb2Nrc291cmNlICpjcykKK3N0YXRpYyBzdHJ1Y3QgbXNtX2Nsb2NrICpjbG9ja2V2ZW50X3RvX2Nsb2NrKHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmV2dCkKIHsKLQlyZXR1cm4gcmVhZGwoTVNNX0RHVF9CQVNFICsgVElNRVJfQ09VTlRfVkFMKSA+PiBNU01fREdUX1NISUZUOworI2lmZGVmIENPTkZJR19TTVAKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgTlJfVElNRVJTOyBpKyspCisJCWlmIChldnQgPT0gJihtc21fY2xvY2tzW2ldLmNsb2NrZXZlbnQpKQorCQkJcmV0dXJuICZtc21fY2xvY2tzW2ldOworCXJldHVybiAmbXNtX2Nsb2Nrc1tNU01fR0xPQkFMX1RJTUVSXTsKKyNlbHNlCisJcmV0dXJuIGNvbnRhaW5lcl9vZihldnQsIHN0cnVjdCBtc21fY2xvY2ssIGNsb2NrZXZlbnQpOworI2VuZGlmCiB9CiAKIHN0YXRpYyBpbnQgbXNtX3RpbWVyX3NldF9uZXh0X2V2ZW50KHVuc2lnbmVkIGxvbmcgY3ljbGVzLAogCQkJCSAgICBzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpldnQpCiB7Ci0Jc3RydWN0IG1zbV9jbG9jayAqY2xvY2sgPSBjb250YWluZXJfb2YoZXZ0LCBzdHJ1Y3QgbXNtX2Nsb2NrLCBjbG9ja2V2ZW50KTsKLQl1aW50MzJfdCBub3cgPSByZWFkbChjbG9jay0+cmVnYmFzZSArIFRJTUVSX0NPVU5UX1ZBTCk7CisJc3RydWN0IG1zbV9jbG9jayAqY2xvY2sgPSBjbG9ja2V2ZW50X3RvX2Nsb2NrKGV2dCk7CisJdWludDMyX3Qgbm93ID0gcmVhZGwoY2xvY2stPmxvY2FsX2NvdW50ZXIpOwogCXVpbnQzMl90IGFsYXJtID0gbm93ICsgKGN5Y2xlcyA8PCBjbG9jay0+c2hpZnQpOwotCWludCBsYXRlOwogCiAJd3JpdGVsKGFsYXJtLCBjbG9jay0+cmVnYmFzZSArIFRJTUVSX01BVENIX1ZBTCk7Ci0Jbm93ID0gcmVhZGwoY2xvY2stPnJlZ2Jhc2UgKyBUSU1FUl9DT1VOVF9WQUwpOwotCWxhdGUgPSBub3cgLSBhbGFybTsKLQlpZiAobGF0ZSA+PSAoLTIgPDwgY2xvY2stPnNoaWZ0KSAmJiBsYXRlIDwgREdUX0haKjUpIHsKLQkJcHJpbnRrKEtFUk5fTk9USUNFICJtc21fdGltZXJfc2V0X25leHRfZXZlbnQoJWx1KSBjbG9jayAlcywgIgotCQkgICAgICAgImFsYXJtIGFscmVhZHkgZXhwaXJlZCwgbm93ICV4LCBhbGFybSAleCwgbGF0ZSAlZFxuIiwKLQkJICAgICAgIGN5Y2xlcywgY2xvY2stPmNsb2NrZXZlbnQubmFtZSwgbm93LCBhbGFybSwgbGF0ZSk7Ci0JCXJldHVybiAtRVRJTUU7Ci0JfQogCXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZCBtc21fdGltZXJfc2V0X21vZGUoZW51bSBjbG9ja19ldmVudF9tb2RlIG1vZGUsCiAJCQkgICAgICBzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpldnQpCiB7Ci0Jc3RydWN0IG1zbV9jbG9jayAqY2xvY2sgPSBjb250YWluZXJfb2YoZXZ0LCBzdHJ1Y3QgbXNtX2Nsb2NrLCBjbG9ja2V2ZW50KTsKKwlzdHJ1Y3QgbXNtX2Nsb2NrICpjbG9jayA9IGNsb2NrZXZlbnRfdG9fY2xvY2soZXZ0KTsKKwogCXN3aXRjaCAobW9kZSkgewogCWNhc2UgQ0xPQ0tfRVZUX01PREVfUkVTVU1FOgogCWNhc2UgQ0xPQ0tfRVZUX01PREVfUEVSSU9ESUM6CkBAIC0xMjMsNyArMTU0LDcgQEAKIH0KIAogc3RhdGljIHN0cnVjdCBtc21fY2xvY2sgbXNtX2Nsb2Nrc1tdID0gewotCXsKKwlbTVNNX0NMT0NLX0dQVF0gPSB7CiAJCS5jbG9ja2V2ZW50ID0gewogCQkJLm5hbWUgICAgICAgICAgID0gImdwX3RpbWVyIiwKIAkJCS5mZWF0dXJlcyAgICAgICA9IENMT0NLX0VWVF9GRUFUX09ORVNIT1QsCkBAIC0xMzUsNyArMTY2LDcgQEAKIAkJLmNsb2Nrc291cmNlID0gewogCQkJLm5hbWUgICAgICAgICAgID0gImdwX3RpbWVyIiwKIAkJCS5yYXRpbmcgICAgICAgICA9IDIwMCwKLQkJCS5yZWFkICAgICAgICAgICA9IG1zbV9ncHRfcmVhZCwKKwkJCS5yZWFkICAgICAgICAgICA9IG1zbV9yZWFkX3RpbWVyX2NvdW50LAogCQkJLm1hc2sgICAgICAgICAgID0gQ0xPQ0tTT1VSQ0VfTUFTSygzMiksCiAJCQkuZmxhZ3MgICAgICAgICAgPSBDTE9DS19TT1VSQ0VfSVNfQ09OVElOVU9VUywKIAkJfSwKQEAgLTE0Nyw5ICsxNzgsMTIgQEAKIAkJCS5pcnEgICAgID0gSU5UX0dQX1RJTUVSX0VYUAogCQl9LAogCQkucmVnYmFzZSA9IE1TTV9HUFRfQkFTRSwKLQkJLmZyZXEgPSBHUFRfSFoKKwkJLmZyZXEgPSBHUFRfSFosCisJCS5sb2NhbF9jb3VudGVyID0gTVNNX0dQVF9CQVNFICsgVElNRVJfQ09VTlRfVkFMLAorCQkuZ2xvYmFsX2NvdW50ZXIgPSBNU01fR1BUX0JBU0UgKyBUSU1FUl9DT1VOVF9WQUwgKworCQkJTVNNX1RNUl9HTE9CQUwsCiAJfSwKLQl7CisJW01TTV9DTE9DS19ER1RdID0gewogCQkuY2xvY2tldmVudCA9IHsKIAkJCS5uYW1lICAgICAgICAgICA9ICJkZ190aW1lciIsCiAJCQkuZmVhdHVyZXMgICAgICAgPSBDTE9DS19FVlRfRkVBVF9PTkVTSE9ULApAQCAtMTYxLDcgKzE5NSw3IEBACiAJCS5jbG9ja3NvdXJjZSA9IHsKIAkJCS5uYW1lICAgICAgICAgICA9ICJkZ190aW1lciIsCiAJCQkucmF0aW5nICAgICAgICAgPSAzMDAsCi0JCQkucmVhZCAgICAgICAgICAgPSBtc21fZGd0X3JlYWQsCisJCQkucmVhZCAgICAgICAgICAgPSBtc21fcmVhZF90aW1lcl9jb3VudCwKIAkJCS5tYXNrICAgICAgICAgICA9IENMT0NLU09VUkNFX01BU0soKDMyIC0gTVNNX0RHVF9TSElGVCkpLAogCQkJLmZsYWdzICAgICAgICAgID0gQ0xPQ0tfU09VUkNFX0lTX0NPTlRJTlVPVVMsCiAJCX0sCkBAIC0xNzQsNyArMjA4LDEwIEBACiAJCX0sCiAJCS5yZWdiYXNlID0gTVNNX0RHVF9CQVNFLAogCQkuZnJlcSA9IERHVF9IWiA+PiBNU01fREdUX1NISUZULAotCQkuc2hpZnQgPSBNU01fREdUX1NISUZUCisJCS5zaGlmdCA9IE1TTV9ER1RfU0hJRlQsCisJCS5sb2NhbF9jb3VudGVyID0gTVNNX0RHVF9CQVNFICsgVElNRVJfQ09VTlRfVkFMLAorCQkuZ2xvYmFsX2NvdW50ZXIgPSBNU01fREdUX0JBU0UgKyBUSU1FUl9DT1VOVF9WQUwgKworCQkJTVNNX1RNUl9HTE9CQUwsCiAJfQogfTsKIApAQCAtMTgzLDcgKzIyMCw3IEBACiAJaW50IGk7CiAJaW50IHJlczsKIAotI2lmZGVmIENPTkZJR19BUkNIX01TTThYNjAKKyNpZmRlZiBDT05GSUdfQVJDSF9NU01fU0NPUlBJT05NUAogCXdyaXRlbChER1RfQ0xLX0NUTF9ESVZfNCwgTVNNX1RNUl9CQVNFICsgREdUX0NMS19DVEwpOwogI2VuZGlmCiAKQEAgLTIxNyw2ICsyNTQsNDggQEAKIAl9CiB9CiAKKyNpZmRlZiBDT05GSUdfU01QCit2b2lkIF9fY3B1aW5pdCBsb2NhbF90aW1lcl9zZXR1cChzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpldnQpCit7CisJc3RydWN0IG1zbV9jbG9jayAqY2xvY2sgPSAmbXNtX2Nsb2Nrc1tNU01fR0xPQkFMX1RJTUVSXTsKKworCS8qIFVzZSBleGlzdGluZyBjbG9ja19ldmVudCBmb3IgY3B1IDAgKi8KKwlpZiAoIXNtcF9wcm9jZXNzb3JfaWQoKSkKKwkJcmV0dXJuOworCisJd3JpdGVsKERHVF9DTEtfQ1RMX0RJVl80LCBNU01fVE1SX0JBU0UgKyBER1RfQ0xLX0NUTCk7CisKKwlpZiAoIWxvY2FsX2Nsb2NrX2V2ZW50KSB7CisJCXdyaXRlbCgwLCBjbG9jay0+cmVnYmFzZSAgKyBUSU1FUl9FTkFCTEUpOworCQl3cml0ZWwoMCwgY2xvY2stPnJlZ2Jhc2UgKyBUSU1FUl9DTEVBUik7CisJCXdyaXRlbCh+MCwgY2xvY2stPnJlZ2Jhc2UgKyBUSU1FUl9NQVRDSF9WQUwpOworCX0KKwlldnQtPmlycSA9IGNsb2NrLT5pcnEuaXJxOworCWV2dC0+bmFtZSA9ICJsb2NhbF90aW1lciI7CisJZXZ0LT5mZWF0dXJlcyA9IENMT0NLX0VWVF9GRUFUX09ORVNIT1Q7CisJZXZ0LT5yYXRpbmcgPSBjbG9jay0+Y2xvY2tldmVudC5yYXRpbmc7CisJZXZ0LT5zZXRfbW9kZSA9IG1zbV90aW1lcl9zZXRfbW9kZTsKKwlldnQtPnNldF9uZXh0X2V2ZW50ID0gbXNtX3RpbWVyX3NldF9uZXh0X2V2ZW50OworCWV2dC0+c2hpZnQgPSBjbG9jay0+Y2xvY2tldmVudC5zaGlmdDsKKwlldnQtPm11bHQgPSBkaXZfc2MoY2xvY2stPmZyZXEsIE5TRUNfUEVSX1NFQywgZXZ0LT5zaGlmdCk7CisJZXZ0LT5tYXhfZGVsdGFfbnMgPQorCQljbG9ja2V2ZW50X2RlbHRhMm5zKDB4ZjAwMDAwMDAgPj4gY2xvY2stPnNoaWZ0LCBldnQpOworCWV2dC0+bWluX2RlbHRhX25zID0gY2xvY2tldmVudF9kZWx0YTJucyg0LCBldnQpOworCisJbG9jYWxfY2xvY2tfZXZlbnQgPSBldnQ7CisKKwlnaWNfZW5hYmxlX3BwaShjbG9jay0+aXJxLmlycSk7CisKKwljbG9ja2V2ZW50c19yZWdpc3Rlcl9kZXZpY2UoZXZ0KTsKK30KKworaW5saW5lIGludCBsb2NhbF90aW1lcl9hY2sodm9pZCkKK3sKKwlyZXR1cm4gMTsKK30KKworI2VuZGlmCisKIHN0cnVjdCBzeXNfdGltZXIgbXNtX3RpbWVyID0gewogCS5pbml0ID0gbXNtX3RpbWVyX2luaXQKIH07CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXRlZ3JhL2luY2x1ZGUvbWFjaC9zZGhjaS5oIGIvYXJjaC9hcm0vbWFjaC10ZWdyYS9pbmNsdWRlL21hY2gvc2RoY2kuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYWQwODZlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC10ZWdyYS9pbmNsdWRlL21hY2gvc2RoY2kuaApAQCAtMCwwICsxLDI5IEBACisvKgorICogaW5jbHVkZS9hc20tYXJtL2FyY2gtdGVncmEvaW5jbHVkZS9tYWNoL3NkaGNpLmgKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgUGFsbSwgSW5jLgorICogQXV0aG9yOiBZdm9ubmUgWWlwIDx5QHBhbG0uY29tPgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisgKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICovCisjaWZuZGVmIF9fQVNNX0FSTV9BUkNIX1RFR1JBX1NESENJX0gKKyNkZWZpbmUgX19BU01fQVJNX0FSQ0hfVEVHUkFfU0RIQ0lfSAorCisjaW5jbHVkZSA8bGludXgvbW1jL2hvc3QuaD4KKworc3RydWN0IHRlZ3JhX3NkaGNpX3BsYXRmb3JtX2RhdGEgeworCWludCBjZF9ncGlvOworCWludCB3cF9ncGlvOworCWludCBwb3dlcl9ncGlvOworCWludCBpc184Yml0OworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXV4NTAwL0tjb25maWcgYi9hcmNoL2FybS9tYWNoLXV4NTAwL0tjb25maWcKaW5kZXggMmRkNDRhMC4uMjQ3Y2FhMyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC11eDUwMC9LY29uZmlnCisrKyBiL2FyY2gvYXJtL21hY2gtdXg1MDAvS2NvbmZpZwpAQCAtNywyOCArNywzMCBAQAogCXNlbGVjdCBIQVNfTVRVCiAJc2VsZWN0IE5PTUFESUtfR1BJTwogCi1jb25maWcgVVg1MDBfU09DX0RCODUwMAotCWJvb2wKK21lbnUgIlV4NTAwIFNvQyIKIAogY29uZmlnIFVYNTAwX1NPQ19EQjU1MDAKLQlib29sCisJYm9vbCAiREI1NTAwIgogCi1jaG9pY2UKLQlwcm9tcHQgIlV4NTAwIHRhcmdldCBwbGF0Zm9ybSIKLQlkZWZhdWx0IE1BQ0hfVTg1MDBfTU9QCitjb25maWcgVVg1MDBfU09DX0RCODUwMAorCWJvb2wgIkRCODUwMCIKIAotY29uZmlnIE1BQ0hfVTg1MDBfTU9QCitlbmRtZW51CisKK21lbnUgIlV4NTAwIHRhcmdldCBwbGF0Zm9ybSIKKworY29uZmlnIE1BQ0hfVTg1MDAKIAlib29sICJVODUwMCBEZXZlbG9wbWVudCBwbGF0Zm9ybSIKLQlzZWxlY3QgVVg1MDBfU09DX0RCODUwMAorCWRlcGVuZHMgb24gVVg1MDBfU09DX0RCODUwMAogCWhlbHAKIAkgIEluY2x1ZGUgc3VwcG9ydCBmb3IgdGhlIG1vcDUwMCBkZXZlbG9wbWVudCBwbGF0Zm9ybS4KIAogY29uZmlnIE1BQ0hfVTU1MDAKIAlib29sICJVNTUwMCBEZXZlbG9wbWVudCBwbGF0Zm9ybSIKLQlzZWxlY3QgVVg1MDBfU09DX0RCNTUwMAorCWRlcGVuZHMgb24gVVg1MDBfU09DX0RCNTUwMAogCWhlbHAKIAkgIEluY2x1ZGUgc3VwcG9ydCBmb3IgdGhlIFU1NTAwIGRldmVsb3BtZW50IHBsYXRmb3JtLgotZW5kY2hvaWNlCitlbmRtZW51CiAKIGNvbmZpZyBVWDUwMF9ERUJVR19VQVJUCiAJaW50ICJVeDUwMCBVQVJUIHRvIHVzZSBmb3IgbG93LWxldmVsIGRlYnVnIgpAQCAtMzksMTQgKzQxLDE0IEBACiAKIGNvbmZpZyBVNTUwMF9NT0RFTV9JUlEKIAlib29sICJNb2RlbSBJUlEgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIE1BQ0hfVTU1MDAKKwlkZXBlbmRzIG9uIFVYNTAwX1NPQ19EQjU1MDAKIAlkZWZhdWx0IHkKIAloZWxwCiAJICBBZGQgc3VwcG9ydCBmb3IgaGFuZGxpbmcgSVJROnMgZnJvbSBtb2RlbSBzaWRlCiAKIGNvbmZpZyBVNTUwMF9NQk9YCiAJYm9vbCAiTWFpbGJveCBzdXBwb3J0IgotCWRlcGVuZHMgb24gTUFDSF9VNTUwMCAmJiBVNTUwMF9NT0RFTV9JUlEKKwlkZXBlbmRzIG9uIFU1NTAwX01PREVNX0lSUQogCWRlZmF1bHQgeQogCWhlbHAKIAkgIEFkZCBzdXBwb3J0IGZvciBVNTUwMCBtYWlsYm94IGNvbW11bmljYXRpb24gd2l0aCBtb2RlbSBzaWRlCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXV4NTAwL01ha2VmaWxlIGIvYXJjaC9hcm0vbWFjaC11eDUwMC9NYWtlZmlsZQppbmRleCAxMjA1MmU4Li41M2ViYjQyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXV4NTAwL01ha2VmaWxlCisrKyBiL2FyY2gvYXJtL21hY2gtdXg1MDAvTWFrZWZpbGUKQEAgLTIsMTAgKzIsMTEgQEAKICMgTWFrZWZpbGUgZm9yIHRoZSBsaW51eCBrZXJuZWwsIFU4NTAwIG1hY2hpbmUuCiAjCiAKLW9iai15CQkJCTo9IGNsb2NrLm8gY3B1Lm8gZGV2aWNlcy5vIGRldmljZXMtY29tbW9uLm8KK29iai15CQkJCTo9IGNsb2NrLm8gY3B1Lm8gZGV2aWNlcy5vIGRldmljZXMtY29tbW9uLm8gXAorCQkJCSAgIGlkLm8KIG9iai0kKENPTkZJR19VWDUwMF9TT0NfREI1NTAwKQkrPSBjcHUtZGI1NTAwLm8gZG1hLWRiNTUwMC5vCiBvYmotJChDT05GSUdfVVg1MDBfU09DX0RCODUwMCkJKz0gY3B1LWRiODUwMC5vIGRldmljZXMtZGI4NTAwLm8gcHJjbXUubwotb2JqLSQoQ09ORklHX01BQ0hfVTg1MDBfTU9QKQkrPSBib2FyZC1tb3A1MDAubyBib2FyZC1tb3A1MDAtc2RpLm8gXAorb2JqLSQoQ09ORklHX01BQ0hfVTg1MDApCSs9IGJvYXJkLW1vcDUwMC5vIGJvYXJkLW1vcDUwMC1zZGkubyBcCiAJCQkJYm9hcmQtbW9wNTAwLWtleXBhZHMubwogb2JqLSQoQ09ORklHX01BQ0hfVTU1MDApCSs9IGJvYXJkLXU1NTAwLm8gYm9hcmQtdTU1MDAtc2RpLm8KIG9iai0kKENPTkZJR19TTVApCQkrPSBwbGF0c21wLm8gaGVhZHNtcC5vCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXV4NTAwL2Nsb2NrLmMgYi9hcmNoL2FybS9tYWNoLXV4NTAwL2Nsb2NrLmMKaW5kZXggY2NmZjJkYWUxLi5iMmIwYTNiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXV4NTAwL2Nsb2NrLmMKKysrIGIvYXJjaC9hcm0vbWFjaC11eDUwMC9jbG9jay5jCkBAIC0xMzYsOCArMTM2LDcgQEAKICAqLwogc3RhdGljIHVuc2lnbmVkIGxvbmcgY2xrX210dV9nZXRfcmF0ZShzdHJ1Y3QgY2xrICpjbGspCiB7Ci0Jdm9pZCBfX2lvbWVtICphZGRyID0gX19pb19hZGRyZXNzKFVYNTAwX1BSQ01VX0JBU0UpCi0JCSsgUFJDTV9UQ1I7CisJdm9pZCBfX2lvbWVtICphZGRyOwogCXUzMiB0Y3I7CiAJaW50IG10dSA9IChpbnQpIGNsay0+ZGF0YTsKIAkvKgpAQCAtMTQ5LDEzICsxNDgsMjAgQEAKIAl1bnNpZ25lZCBsb25nIG10dXJhdGU7CiAJdW5zaWduZWQgbG9uZyByZXRjbGs7CiAKKwlpZiAoY3B1X2lzX3U1NTAwKCkpCisJCWFkZHIgPSBfX2lvX2FkZHJlc3MoVTU1MDBfUFJDTVVfQkFTRSk7CisJZWxzZSBpZiAoY3B1X2lzX3U4NTAwKCkpCisJCWFkZHIgPSBfX2lvX2FkZHJlc3MoVTg1MDBfUFJDTVVfQkFTRSk7CisJZWxzZQorCQl1eDUwMF91bmtub3duX3NvYygpOworCiAJLyoKIAkgKiBPbiBhIHN0YXJ0dXAsIGFsd2F5cyBjb25pZmd1cmUgdGhlIFRDUiB0byB0aGUgZG96ZSBtb2RlOwogCSAqIGJvb3Rsb2FkZXJzIGRvIGl0IGZvciB1cy4gRG8gdGhpcyBpbiB0aGUga2VybmVsIHRvby4KIAkgKi8KLQl3cml0ZWwoUFJDTV9UQ1JfRE9aRV9NT0RFLCBhZGRyKTsKKwl3cml0ZWwoUFJDTV9UQ1JfRE9aRV9NT0RFLCBhZGRyICsgUFJDTV9UQ1IpOwogCi0JdGNyID0gcmVhZGwoYWRkcik7CisJdGNyID0gcmVhZGwoYWRkciArIFBSQ01fVENSKTsKIAogCS8qIEdldCB0aGUgcmF0ZSBmcm9tIHRoZSBwYXJlbnQgYXMgYSBkZWZhdWx0ICovCiAJaWYgKGNsay0+cGFyZW50X3BlcmlwaCkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdXg1MDAvY3B1LWRiNTUwMC5jIGIvYXJjaC9hcm0vbWFjaC11eDUwMC9jcHUtZGI1NTAwLmMKaW5kZXggYWNjODQxZS4uYWYwNGUwOCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC11eDUwMC9jcHUtZGI1NTAwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC11eDUwMC9jcHUtZGI1NTAwLmMKQEAgLTIxLDcgKzIxLDIwIEBACiAKICNpbmNsdWRlICJkZXZpY2VzLWRiNTUwMC5oIgogCitzdGF0aWMgc3RydWN0IG1hcF9kZXNjIHU1NTAwX3VhcnRfaW9fZGVzY1tdIF9faW5pdGRhdGEgPSB7CisJX19JT19ERVZfREVTQyhVNTUwMF9VQVJUMF9CQVNFLCBTWl80SyksCisJX19JT19ERVZfREVTQyhVNTUwMF9VQVJUMl9CQVNFLCBTWl80SyksCit9OworCiBzdGF0aWMgc3RydWN0IG1hcF9kZXNjIHU1NTAwX2lvX2Rlc2NbXSBfX2luaXRkYXRhID0geworCV9fSU9fREVWX0RFU0MoVTU1MDBfR0lDX0NQVV9CQVNFLCBTWl80SyksCisJX19JT19ERVZfREVTQyhVNTUwMF9HSUNfRElTVF9CQVNFLCBTWl80SyksCisJX19JT19ERVZfREVTQyhVNTUwMF9MMkNDX0JBU0UsIFNaXzRLKSwKKwlfX0lPX0RFVl9ERVNDKFU1NTAwX1RXRF9CQVNFLCBTWl80SyksCisJX19JT19ERVZfREVTQyhVNTUwMF9NVFUwX0JBU0UsIFNaXzRLKSwKKwlfX0lPX0RFVl9ERVNDKFU1NTAwX1NDVV9CQVNFLCBTWl80SyksCisJX19JT19ERVZfREVTQyhVNTUwMF9CQUNLVVBSQU0wX0JBU0UsIFNaXzhLKSwKKwogCV9fSU9fREVWX0RFU0MoVTU1MDBfR1BJTzBfQkFTRSwgU1pfNEspLAogCV9fSU9fREVWX0RFU0MoVTU1MDBfR1BJTzFfQkFTRSwgU1pfNEspLAogCV9fSU9fREVWX0RFU0MoVTU1MDBfR1BJTzJfQkFTRSwgU1pfNEspLApAQCAtMTQzLDYgKzE1NiwxMSBAQAogCiB2b2lkIF9faW5pdCB1NTUwMF9tYXBfaW8odm9pZCkKIHsKKwkvKgorCSAqIE1hcCB0aGUgVUFSVHMgZWFybHkgc28gdGhhdCB0aGUgREVCVUdfTEwgc3R1ZmYgY29udGludWVzIHRvIHdvcmsuCisJICovCisJaW90YWJsZV9pbml0KHU1NTAwX3VhcnRfaW9fZGVzYywgQVJSQVlfU0laRSh1NTUwMF91YXJ0X2lvX2Rlc2MpKTsKKwogCXV4NTAwX21hcF9pbygpOwogCiAJaW90YWJsZV9pbml0KHU1NTAwX2lvX2Rlc2MsIEFSUkFZX1NJWkUodTU1MDBfaW9fZGVzYykpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC11eDUwMC9jcHUtZGI4NTAwLmMgYi9hcmNoL2FybS9tYWNoLXV4NTAwL2NwdS1kYjg1MDAuYwppbmRleCBjMGYzNGE0Li4xNzQ4ZmJjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXV4NTAwL2NwdS1kYjg1MDAuYworKysgYi9hcmNoL2FybS9tYWNoLXV4NTAwL2NwdS1kYjg1MDAuYwpAQCAtMjksMTMgKzI5LDMxIEBACiB9OwogCiAvKiBtaW5pbXVtIHN0YXRpYyBpL28gbWFwcGluZyByZXF1aXJlZCB0byBib290IFU4NTAwIHBsYXRmb3JtcyAqLworc3RhdGljIHN0cnVjdCBtYXBfZGVzYyB1ODUwMF91YXJ0X2lvX2Rlc2NbXSBfX2luaXRkYXRhID0geworCV9fSU9fREVWX0RFU0MoVTg1MDBfVUFSVDBfQkFTRSwgU1pfNEspLAorCV9fSU9fREVWX0RFU0MoVTg1MDBfVUFSVDJfQkFTRSwgU1pfNEspLAorfTsKKwogc3RhdGljIHN0cnVjdCBtYXBfZGVzYyB1ODUwMF9pb19kZXNjW10gX19pbml0ZGF0YSA9IHsKKwlfX0lPX0RFVl9ERVNDKFU4NTAwX0dJQ19DUFVfQkFTRSwgU1pfNEspLAorCV9fSU9fREVWX0RFU0MoVTg1MDBfR0lDX0RJU1RfQkFTRSwgU1pfNEspLAorCV9fSU9fREVWX0RFU0MoVTg1MDBfTDJDQ19CQVNFLCBTWl80SyksCisJX19JT19ERVZfREVTQyhVODUwMF9UV0RfQkFTRSwgU1pfNEspLAorCV9fSU9fREVWX0RFU0MoVTg1MDBfTVRVMF9CQVNFLCBTWl80SyksCisJX19JT19ERVZfREVTQyhVODUwMF9TQ1VfQkFTRSwgU1pfNEspLAorCV9fSU9fREVWX0RFU0MoVTg1MDBfQkFDS1VQUkFNMF9CQVNFLCBTWl84SyksCisKKwlfX0lPX0RFVl9ERVNDKFU4NTAwX0NMS1JTVDFfQkFTRSwgU1pfNEspLAorCV9fSU9fREVWX0RFU0MoVTg1MDBfQ0xLUlNUMl9CQVNFLCBTWl80SyksCisJX19JT19ERVZfREVTQyhVODUwMF9DTEtSU1QzX0JBU0UsIFNaXzRLKSwKKwlfX0lPX0RFVl9ERVNDKFU4NTAwX0NMS1JTVDVfQkFTRSwgU1pfNEspLAorCV9fSU9fREVWX0RFU0MoVTg1MDBfQ0xLUlNUNl9CQVNFLCBTWl80SyksCisKIAlfX0lPX0RFVl9ERVNDKFU4NTAwX1BSQ01VX0JBU0UsIFNaXzRLKSwKIAlfX0lPX0RFVl9ERVNDKFU4NTAwX0dQSU8wX0JBU0UsIFNaXzRLKSwKIAlfX0lPX0RFVl9ERVNDKFU4NTAwX0dQSU8xX0JBU0UsIFNaXzRLKSwKIAlfX0lPX0RFVl9ERVNDKFU4NTAwX0dQSU8yX0JBU0UsIFNaXzRLKSwKIAlfX0lPX0RFVl9ERVNDKFU4NTAwX0dQSU8zX0JBU0UsIFNaXzRLKSwKLQlfX01FTV9ERVZfREVTQyhVODUwMF9CT09UX1JPTV9CQVNFLCBTWl8xTSksCiB9OwogCiBzdGF0aWMgc3RydWN0IG1hcF9kZXNjIHU4NTAwX2VkX2lvX2Rlc2NbXSBfX2luaXRkYXRhID0gewpAQCAtNTIsNzEgKzcwLDEzIEBACiAJX19JT19ERVZfREVTQyhVODUwMF9QUkNNVV9UQ0RNX0JBU0UsIFNaXzRLKSwKIH07CiAKLS8qCi0gKiBGdW5jdGlvbnMgdG8gZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIGxhdGVyIEFTSUNzCi0gKiBXZSBsb29rIGludG8gdGhlIGVuZCBvZiB0aGUgUk9NIHRvIGxvY2F0ZSB0aGUgaGFyZGNvZGVkIEFTSUMgSUQuCi0gKiBUaGlzIGlzIG9ubHkgbmVlZGVkIHRvIGRpZmZlcmVudGlhdGUgYmV0d2VlbiBtaW5vciByZXZpc2lvbnMgYW5kCi0gKiBwcm9jZXNzIHZhcmlhbnRzIG9mIGFuIEFTSUMsIHRoZSBtYWpvciByZXZpc2lvbnMgYXJlIGVuY29kZWQgaW4KLSAqIHRoZSBjcHVpZC4KLSAqLwotI2RlZmluZSBVODUwMF9BU0lDX0lEX0xPQ19FRF9WMQkoVTg1MDBfQk9PVF9ST01fQkFTRSArIDB4MUZGRjQpCi0jZGVmaW5lIFU4NTAwX0FTSUNfSURfTE9DX1YyCShVODUwMF9CT09UX1JPTV9CQVNFICsgMHgxREJGNCkKLSNkZWZpbmUgVTg1MDBfQVNJQ19SRVZfRUQJMHgwMQotI2RlZmluZSBVODUwMF9BU0lDX1JFVl9WMTAJMHhBMAotI2RlZmluZSBVODUwMF9BU0lDX1JFVl9WMTEJMHhBMQotI2RlZmluZSBVODUwMF9BU0lDX1JFVl9WMjAJMHhCMAotCi0vKioKLSAqIHN0cnVjdCBkYjg1MDBfYXNpY19pZCAtIGZpZWxkcyBvZiB0aGUgQVNJQyBJRAotICogQHByb2Nlc3M6IHRoZSBtYW51ZmFjdHVyaW5nIHByb2Nlc3MsIDB4NDAgaXMgNDAgbm0KLSAqICAweDAwIGlzICJzdGFuZGFyZCIKLSAqIEBwYXJ0bnVtYmVyOiBoaXRoZXJldG8gMHg4NTAwIGZvciBEQjg1MDAKLSAqIEByZXZpc2lvbjogdmVyc2lvbiBjb2RlIGluIHRoZSBzZXJpZXMKLSAqIFRoaXMgZmllbGQgZGVmaW5pb24gaXMgbm90IGZvcm1hbGx5IGRlZmluZWQgYnV0IG1ha2VzCi0gKiBzZW5zZS4KLSAqLwotc3RydWN0IGRiODUwMF9hc2ljX2lkIHsKLQl1OCBwcm9jZXNzOwotCXUxNiBwYXJ0bnVtYmVyOwotCXU4IHJldmlzaW9uOwotfTsKLQotLyogVGhpcyBpc24ndCBnb2luZyB0byBjaGFuZ2UgYXQgcnVudGltZSAqLwotc3RhdGljIHN0cnVjdCBkYjg1MDBfYXNpY19pZCBkYjg1MDBfaWQ7Ci0KLXN0YXRpYyB2b2lkIF9faW5pdCBnZXRfZGI4NTAwX2FzaWNfaWQodm9pZCkKLXsKLQl1MzIgYXNpY2lkOwotCi0JaWYgKGNwdV9pc191ODUwMHYxKCkgfHwgY3B1X2lzX3U4NTAwZWQoKSkKLQkJYXNpY2lkID0gcmVhZGwoX19pb19hZGRyZXNzKFU4NTAwX0FTSUNfSURfTE9DX0VEX1YxKSk7Ci0JZWxzZSBpZiAoY3B1X2lzX3U4NTAwdjIoKSkKLQkJYXNpY2lkID0gcmVhZGwoX19pb19hZGRyZXNzKFU4NTAwX0FTSUNfSURfTE9DX1YyKSk7Ci0JZWxzZQotCQlCVUcoKTsKLQotCWRiODUwMF9pZC5wcm9jZXNzID0gKGFzaWNpZCA+PiAyNCk7Ci0JZGI4NTAwX2lkLnBhcnRudW1iZXIgPSAoYXNpY2lkID4+IDE2KSAmIDB4RkZGRlU7Ci0JZGI4NTAwX2lkLnJldmlzaW9uID0gYXNpY2lkICYgMHhGRlU7Ci19Ci0KLWJvb2wgY3B1X2lzX3U4NTAwdjEwKHZvaWQpCi17Ci0JcmV0dXJuIChkYjg1MDBfaWQucmV2aXNpb24gPT0gVTg1MDBfQVNJQ19SRVZfVjEwKTsKLX0KLQotYm9vbCBjcHVfaXNfdTg1MDB2MTEodm9pZCkKLXsKLQlyZXR1cm4gKGRiODUwMF9pZC5yZXZpc2lvbiA9PSBVODUwMF9BU0lDX1JFVl9WMTEpOwotfQotCi1ib29sIGNwdV9pc191ODUwMHYyMCh2b2lkKQotewotCXJldHVybiAoZGI4NTAwX2lkLnJldmlzaW9uID09IFU4NTAwX0FTSUNfUkVWX1YyMCk7Ci19Ci0KIHZvaWQgX19pbml0IHU4NTAwX21hcF9pbyh2b2lkKQogeworCS8qCisJICogTWFwIHRoZSBVQVJUcyBlYXJseSBzbyB0aGF0IHRoZSBERUJVR19MTCBzdHVmZiBjb250aW51ZXMgdG8gd29yay4KKwkgKi8KKwlpb3RhYmxlX2luaXQodTg1MDBfdWFydF9pb19kZXNjLCBBUlJBWV9TSVpFKHU4NTAwX3VhcnRfaW9fZGVzYykpOworCiAJdXg1MDBfbWFwX2lvKCk7CiAKIAlpb3RhYmxlX2luaXQodTg1MDBfaW9fZGVzYywgQVJSQVlfU0laRSh1ODUwMF9pb19kZXNjKSk7CkBAIC0xMjcsOSArODcsNiBAQAogCQlpb3RhYmxlX2luaXQodTg1MDBfdjFfaW9fZGVzYywgQVJSQVlfU0laRSh1ODUwMF92MV9pb19kZXNjKSk7CiAJZWxzZSBpZiAoY3B1X2lzX3U4NTAwdjIoKSkKIAkJaW90YWJsZV9pbml0KHU4NTAwX3YyX2lvX2Rlc2MsIEFSUkFZX1NJWkUodTg1MDBfdjJfaW9fZGVzYykpOwotCi0JLyogUmVhZCBvdXQgdGhlIEFTSUMgSUQgYXMgZWFybHkgYXMgd2UgY2FuICovCi0JZ2V0X2RiODUwMF9hc2ljX2lkKCk7CiB9CiAKIHN0YXRpYyByZXNvdXJjZV9zaXplX3QgX19pbml0ZGF0YSBkYjg1MDBfZ3Bpb19iYXNlW10gPSB7CkBAIC0xNTksMjAgKzExNiw2IEBACiAgKi8KIHZvaWQgX19pbml0IHU4NTAwX2luaXRfZGV2aWNlcyh2b2lkKQogewotCS8qIERpc3BsYXkgc29tZSBBU0lDIGJvaWxlcnBsYXRlICovCi0JcHJfaW5mbygiREI4NTAwOiBwcm9jZXNzOiAlMDJ4LCByZXZpc2lvbiBJRDogMHglMDJ4XG4iLAotCQlkYjg1MDBfaWQucHJvY2VzcywgZGI4NTAwX2lkLnJldmlzaW9uKTsKLQlpZiAoY3B1X2lzX3U4NTAwZWQoKSkKLQkJcHJfaW5mbygiREI4NTAwOiBFYXJseSBEcm9wIChFRClcbiIpOwotCWVsc2UgaWYgKGNwdV9pc191ODUwMHYxMCgpKQotCQlwcl9pbmZvKCJEQjg1MDA6IHZlcnNpb24gMS4wXG4iKTsKLQllbHNlIGlmIChjcHVfaXNfdTg1MDB2MTEoKSkKLQkJcHJfaW5mbygiREI4NTAwOiB2ZXJzaW9uIDEuMVxuIik7Ci0JZWxzZSBpZiAoY3B1X2lzX3U4NTAwdjIwKCkpCi0JCXByX2luZm8oIkRCODUwMDogdmVyc2lvbiAyLjBcbiIpOwotCWVsc2UKLQkJcHJfd2FybmluZygiQVNJQzogVU5LTk9XTiBTSUxJQ09OIFZFUlNJT04hXG4iKTsKLQogCWlmIChjcHVfaXNfdTg1MDBlZCgpKQogCQlkbWE0MF91ODUwMGVkX2ZpeHVwKCk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdXg1MDAvY3B1LmMgYi9hcmNoL2FybS9tYWNoLXV4NTAwL2NwdS5jCmluZGV4IDU3MzA0MDkuLjVhNDMxMDcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtdXg1MDAvY3B1LmMKKysrIGIvYXJjaC9hcm0vbWFjaC11eDUwMC9jcHUuYwpAQCAtMjMsMzcgKzIzLDI1IEBACiAKICNpbmNsdWRlICJjbG9jay5oIgogCi1zdGF0aWMgc3RydWN0IG1hcF9kZXNjIHV4NTAwX2lvX2Rlc2NbXSBfX2luaXRkYXRhID0gewotCV9fSU9fREVWX0RFU0MoVVg1MDBfVUFSVDBfQkFTRSwgU1pfNEspLAotCV9fSU9fREVWX0RFU0MoVVg1MDBfVUFSVDJfQkFTRSwgU1pfNEspLAotCi0JX19JT19ERVZfREVTQyhVWDUwMF9HSUNfQ1BVX0JBU0UsIFNaXzRLKSwKLQlfX0lPX0RFVl9ERVNDKFVYNTAwX0dJQ19ESVNUX0JBU0UsIFNaXzRLKSwKLQlfX0lPX0RFVl9ERVNDKFVYNTAwX0wyQ0NfQkFTRSwgU1pfNEspLAotCV9fSU9fREVWX0RFU0MoVVg1MDBfVFdEX0JBU0UsIFNaXzRLKSwKLQlfX0lPX0RFVl9ERVNDKFVYNTAwX1NDVV9CQVNFLCBTWl80SyksCi0KLQlfX0lPX0RFVl9ERVNDKFVYNTAwX0NMS1JTVDFfQkFTRSwgU1pfNEspLAotCV9fSU9fREVWX0RFU0MoVVg1MDBfQ0xLUlNUMl9CQVNFLCBTWl80SyksCi0JX19JT19ERVZfREVTQyhVWDUwMF9DTEtSU1QzX0JBU0UsIFNaXzRLKSwKLQlfX0lPX0RFVl9ERVNDKFVYNTAwX0NMS1JTVDVfQkFTRSwgU1pfNEspLAotCV9fSU9fREVWX0RFU0MoVVg1MDBfQ0xLUlNUNl9CQVNFLCBTWl80SyksCi0KLQlfX0lPX0RFVl9ERVNDKFVYNTAwX01UVTBfQkFTRSwgU1pfNEspLAotCV9fSU9fREVWX0RFU0MoVVg1MDBfTVRVMV9CQVNFLCBTWl80SyksCi0KLQlfX0lPX0RFVl9ERVNDKFVYNTAwX0JBQ0tVUFJBTTBfQkFTRSwgU1pfOEspLAotfTsKLQotdm9pZCBfX2luaXQgdXg1MDBfbWFwX2lvKHZvaWQpCi17Ci0JaW90YWJsZV9pbml0KHV4NTAwX2lvX2Rlc2MsIEFSUkFZX1NJWkUodXg1MDBfaW9fZGVzYykpOwotfQorI2lmZGVmIENPTkZJR19DQUNIRV9MMlgwCitzdGF0aWMgdm9pZCBfX2lvbWVtICpsMngwX2Jhc2U7CisjZW5kaWYKIAogdm9pZCBfX2luaXQgdXg1MDBfaW5pdF9pcnEodm9pZCkKIHsKLQlnaWNfaW5pdCgwLCAyOSwgX19pb19hZGRyZXNzKFVYNTAwX0dJQ19ESVNUX0JBU0UpLAotCQkgX19pb19hZGRyZXNzKFVYNTAwX0dJQ19DUFVfQkFTRSkpOworCXZvaWQgX19pb21lbSAqZGlzdF9iYXNlOworCXZvaWQgX19pb21lbSAqY3B1X2Jhc2U7CisKKwlpZiAoY3B1X2lzX3U1NTAwKCkpIHsKKwkJZGlzdF9iYXNlID0gX19pb19hZGRyZXNzKFU1NTAwX0dJQ19ESVNUX0JBU0UpOworCQljcHVfYmFzZSA9IF9faW9fYWRkcmVzcyhVNTUwMF9HSUNfQ1BVX0JBU0UpOworCX0gZWxzZSBpZiAoY3B1X2lzX3U4NTAwKCkpIHsKKwkJZGlzdF9iYXNlID0gX19pb19hZGRyZXNzKFU4NTAwX0dJQ19ESVNUX0JBU0UpOworCQljcHVfYmFzZSA9IF9faW9fYWRkcmVzcyhVODUwMF9HSUNfQ1BVX0JBU0UpOworCX0gZWxzZQorCQl1eDUwMF91bmtub3duX3NvYygpOworCisJZ2ljX2luaXQoMCwgMjksIGRpc3RfYmFzZSwgY3B1X2Jhc2UpOwogCiAJLyoKIAkgKiBJbml0IGNsb2NrcyBoZXJlIHNvIHRoYXQgdGhleSBhcmUgYXZhaWxhYmxlIGZvciBzeXN0ZW0gdGltZXIKQEAgLTc0LDcgKzYyLDggQEAKIAogc3RhdGljIGlubGluZSB2b2lkIHV4NTAwX2NhY2hlX3N5bmModm9pZCkKIHsKLQl2b2lkIF9faW9tZW0gKmJhc2UgPSBfX2lvX2FkZHJlc3MoVVg1MDBfTDJDQ19CQVNFKTsKKwl2b2lkIF9faW9tZW0gKmJhc2UgPSBsMngwX2Jhc2U7CisKIAl3cml0ZWxfcmVsYXhlZCgwLCBiYXNlICsgTDJYMF9DQUNIRV9TWU5DKTsKIAl1eDUwMF9jYWNoZV93YWl0KGJhc2UgKyBMMlgwX0NBQ0hFX1NZTkMsIDEpOwogfQpAQCAtOTYsMjAgKzg1LDIzIEBACiAgKi8KIHN0YXRpYyB2b2lkIHV4NTAwX2wyeDBfaW52X2FsbCh2b2lkKQogewotCXZvaWQgX19pb21lbSAqbDJ4MF9iYXNlID0gX19pb19hZGRyZXNzKFVYNTAwX0wyQ0NfQkFTRSk7CisJdm9pZCBfX2lvbWVtICpiYXNlID0gbDJ4MF9iYXNlOwogCXVpbnQzMl90IGwyeDBfd2F5X21hc2sgPSAoMTw8MTYpIC0gMTsJLyogQml0bWFzayBvZiBhY3RpdmUgd2F5cyAqLwogCiAJLyogaW52YWxpZGF0ZSBhbGwgd2F5cyAqLwotCXdyaXRlbF9yZWxheGVkKGwyeDBfd2F5X21hc2ssIGwyeDBfYmFzZSArIEwyWDBfSU5WX1dBWSk7Ci0JdXg1MDBfY2FjaGVfd2FpdChsMngwX2Jhc2UgKyBMMlgwX0lOVl9XQVksIGwyeDBfd2F5X21hc2spOworCXdyaXRlbF9yZWxheGVkKGwyeDBfd2F5X21hc2ssIGJhc2UgKyBMMlgwX0lOVl9XQVkpOworCXV4NTAwX2NhY2hlX3dhaXQoYmFzZSArIEwyWDBfSU5WX1dBWSwgbDJ4MF93YXlfbWFzayk7CiAJdXg1MDBfY2FjaGVfc3luYygpOwogfQogCiBzdGF0aWMgaW50IHV4NTAwX2wyeDBfaW5pdCh2b2lkKQogewotCXZvaWQgX19pb21lbSAqbDJ4MF9iYXNlOwotCi0JbDJ4MF9iYXNlID0gX19pb19hZGRyZXNzKFVYNTAwX0wyQ0NfQkFTRSk7CisJaWYgKGNwdV9pc191NTUwMCgpKQorCQlsMngwX2Jhc2UgPSBfX2lvX2FkZHJlc3MoVTU1MDBfTDJDQ19CQVNFKTsKKwllbHNlIGlmIChjcHVfaXNfdTg1MDAoKSkKKwkJbDJ4MF9iYXNlID0gX19pb19hZGRyZXNzKFU4NTAwX0wyQ0NfQkFTRSk7CisJZWxzZQorCQl1eDUwMF91bmtub3duX3NvYygpOwogCiAJLyogNjRLQiB3YXkgc2l6ZSwgOCB3YXkgYXNzb2NpYXRpdml0eSwgZm9yY2UgV0EgKi8KIAlsMngwX2luaXQobDJ4MF9iYXNlLCAweDNlMDYwMDAwLCAweGMwMDAwZmZmKTsKQEAgLTEyNywxMyArMTE5LDIxIEBACiB7CiAjaWZkZWYgQ09ORklHX0xPQ0FMX1RJTUVSUwogCS8qIFNldHVwIHRoZSBsb2NhbCB0aW1lciBiYXNlICovCi0JdHdkX2Jhc2UgPSBfX2lvX2FkZHJlc3MoVVg1MDBfVFdEX0JBU0UpOwotI2VuZGlmCi0JLyogU2V0dXAgdGhlIE1UVSBiYXNlICovCi0JaWYgKGNwdV9pc191ODUwMGVkKCkpCi0JCW10dV9iYXNlID0gX19pb19hZGRyZXNzKFU4NTAwX01UVTBfQkFTRV9FRCk7CisJaWYgKGNwdV9pc191NTUwMCgpKQorCQl0d2RfYmFzZSA9IF9faW9fYWRkcmVzcyhVNTUwMF9UV0RfQkFTRSk7CisJZWxzZSBpZiAoY3B1X2lzX3U4NTAwKCkpCisJCXR3ZF9iYXNlID0gX19pb19hZGRyZXNzKFU4NTAwX1RXRF9CQVNFKTsKIAllbHNlCi0JCW10dV9iYXNlID0gX19pb19hZGRyZXNzKFVYNTAwX01UVTBfQkFTRSk7CisJCXV4NTAwX3Vua25vd25fc29jKCk7CisjZW5kaWYKKwlpZiAoY3B1X2lzX3U1NTAwKCkpCisJCW10dV9iYXNlID0gX19pb19hZGRyZXNzKFU1NTAwX01UVTBfQkFTRSk7CisJZWxzZSBpZiAoY3B1X2lzX3U4NTAwZWQoKSkKKwkJbXR1X2Jhc2UgPSBfX2lvX2FkZHJlc3MoVTg1MDBfTVRVMF9CQVNFX0VEKTsKKwllbHNlIGlmIChjcHVfaXNfdTg1MDAoKSkKKwkJbXR1X2Jhc2UgPSBfX2lvX2FkZHJlc3MoVTg1MDBfTVRVMF9CQVNFKTsKKwllbHNlCisJCXV4NTAwX3Vua25vd25fc29jKCk7CiAKIAlubWRrX3RpbWVyX2luaXQoKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdXg1MDAvaWQuYyBiL2FyY2gvYXJtL21hY2gtdXg1MDAvaWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzUxMjJlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC11eDUwMC9pZC5jCkBAIC0wLDAgKzEsMTA3IEBACisvKgorICogQ29weXJpZ2h0IChDKSBTVC1Fcmljc3NvbiBTQSAyMDEwCisgKgorICogQXV0aG9yOiBSYWJpbiBWaW5jZW50IDxyYWJpbi52aW5jZW50QHN0ZXJpY3Nzb24uY29tPiBmb3IgU1QtRXJpY3Nzb24KKyAqIExpY2Vuc2UgdGVybXM6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIHZlcnNpb24gMgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKworI2luY2x1ZGUgPGFzbS9jcHV0eXBlLmg+CisjaW5jbHVkZSA8YXNtL3RsYmZsdXNoLmg+CisjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KKworI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxtYWNoL3NldHVwLmg+CisKK3N0cnVjdCBkYng1MDBfYXNpY19pZCBkYng1MDBfaWQ7CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgdXg1MDBfcmVhZF9hc2ljaWQocGh5c19hZGRyX3QgYWRkcikKK3sKKwlwaHlzX2FkZHJfdCBiYXNlID0gYWRkciAmIH4weGZmZjsKKwlzdHJ1Y3QgbWFwX2Rlc2MgZGVzYyA9IHsKKwkJLnZpcnR1YWwJPSBJT19BRERSRVNTKGJhc2UpLAorCQkucGZuCQk9IF9fcGh5c190b19wZm4oYmFzZSksCisJCS5sZW5ndGgJCT0gU1pfMTZLLAorCQkudHlwZQkJPSBNVF9ERVZJQ0UsCisJfTsKKworCWlvdGFibGVfaW5pdCgmZGVzYywgMSk7CisKKwkvKiBBcyBpbiBkZXZpY2VtYXBzX2luaXQoKSAqLworCWxvY2FsX2ZsdXNoX3RsYl9hbGwoKTsKKwlmbHVzaF9jYWNoZV9hbGwoKTsKKworCXJldHVybiByZWFkbChfX2lvX2FkZHJlc3MoYWRkcikpOworfQorCitzdGF0aWMgdm9pZCB1eDUwMF9wcmludF9zb2NfaW5mbyh1bnNpZ25lZCBpbnQgYXNpY2lkKQoreworCXVuc2lnbmVkIGludCByZXYgPSBkYng1MDBfcmV2aXNpb24oKTsKKworCXByX2luZm8oIkRCJTR4ICIsIGRieDUwMF9wYXJ0bnVtYmVyKCkpOworCisJaWYgKHJldiA9PSAweDAxKQorCQlwcl9jb250KCJFYXJseSBEcm9wIik7CisJZWxzZSBpZiAocmV2ID49IDB4QTApCisJCXByX2NvbnQoInYlZC4lZCIgLCAocmV2ID4+IDQpIC0gMHhBICsgMSwgcmV2ICYgMHhmKTsKKwllbHNlCisJCXByX2NvbnQoIlVua25vd24iKTsKKworCXByX2NvbnQoIiBbJSMwMTB4XVxuIiwgYXNpY2lkKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBwYXJ0bnVtYmVyKHVuc2lnbmVkIGludCBhc2ljaWQpCit7CisJcmV0dXJuIChhc2ljaWQgPj4gOCkgJiAweGZmZmY7Cit9CisKKy8qCisgKiBTT0MJCU1JRFIJCUFTSUNJRCBBRERSRVNTCQlBU0lDSUQgVkFMVUUKKyAqIERCODUwMGVkCTB4NDEwZmMwOTAJMHg5MDAxRkZGNAkJMHgwMDg1MDAwMQorICogREI4NTAwdjEJMHg0MTFmYzA5MQkweDkwMDFGRkY0CQkweDAwODUwMEEwCisgKiBEQjg1MDB2MS4xCTB4NDExZmMwOTEJMHg5MDAxRkZGNAkJMHgwMDg1MDBBMQorICogREI4NTAwdjIJMHg0MTJmYzA5MQkweDkwMDFEQkY0CQkweDAwODUwMEIwCisgKiBEQjU1MDB2MQkweDQxMmZjMDkxCTB4OTAwMUZGRjQJCTB4MDA1NTAwQTAKKyAqLworCit2b2lkIF9faW5pdCB1eDUwMF9tYXBfaW8odm9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgY3B1aWQgPSByZWFkX2NwdWlkX2lkKCk7CisJdW5zaWduZWQgaW50IGFzaWNpZCA9IDA7CisJcGh5c19hZGRyX3QgYWRkciA9IDA7CisKKwlzd2l0Y2ggKGNwdWlkKSB7CisJY2FzZSAweDQxMGZjMDkwOiAvKiBEQjg1MDBlZCAqLworCWNhc2UgMHg0MTFmYzA5MTogLyogREI4NTAwdjEgKi8KKwkJYWRkciA9IDB4OTAwMUZGRjQ7CisJCWJyZWFrOworCisJY2FzZSAweDQxMmZjMDkxOiAvKiBEQjg1MDB2MiAvIERCNTUwMHYxICovCisJCWFzaWNpZCA9IHV4NTAwX3JlYWRfYXNpY2lkKDB4OTAwMURCRjQpOworCQlpZiAocGFydG51bWJlcihhc2ljaWQpID09IDB4ODUwMCkKKwkJCS8qIERCODUwMHYyICovCisJCQlicmVhazsKKworCQkvKiBEQjU1MDB2MSAqLworCQlhZGRyID0gMHg5MDAxRkZGNDsKKwkJYnJlYWs7CisJfQorCisJaWYgKGFkZHIpCisJCWFzaWNpZCA9IHV4NTAwX3JlYWRfYXNpY2lkKGFkZHIpOworCisJaWYgKCFhc2ljaWQpIHsKKwkJcHJfZXJyKCJVbmFibGUgdG8gaWRlbnRpZnkgU29DXG4iKTsKKwkJdXg1MDBfdW5rbm93bl9zb2MoKTsKKwl9CisKKwlkYng1MDBfaWQucHJvY2VzcyA9IGFzaWNpZCA+PiAyNDsKKwlkYng1MDBfaWQucGFydG51bWJlciA9IHBhcnRudW1iZXIoYXNpY2lkKTsKKwlkYng1MDBfaWQucmV2aXNpb24gPSBhc2ljaWQgJiAweGZmOworCisJdXg1MDBfcHJpbnRfc29jX2luZm8oYXNpY2lkKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdXg1MDAvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMgYi9hcmNoL2FybS9tYWNoLXV4NTAwL2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TCmluZGV4IGJlN2MwZjEuLjcwMGZiMDUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtdXg1MDAvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMKKysrIGIvYXJjaC9hcm0vbWFjaC11eDUwMC9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUwpAQCAtMTQsNyArMTQsMjQgQEAKICNlcnJvciBJbnZhbGlkIFV4NTAwIGRlYnVnIFVBUlQKICNlbmRpZgogCi0jZGVmaW5lIF9fVVg1MDBfVUFSVChuKQlVWDUwMF9VQVJUIyNuIyNfQkFTRQorLyoKKyAqIERFQlVHX0xMIG9ubHkgd29ya3MgaWYgb25seSBvbmUgU09DIGlzIGJ1aWx0IGluLiAgV2UgZG9uJ3QgdXNlICNlbHNlIGJlbG93CisgKiBpbiBvcmRlciB0byBnZXQgIl9fVVg1MDBfVUFSVCByZWRlZmluZWQiIHdhcm5pbmdzIGlmIG1vcmUgdGhhbiBvbmUgU09DIGlzCisgKiBidWlsdCwgc28gdGhhdCB0aGVyZSdzIHNvbWUgaGludCBkdXJpbmcgdGhlIGJ1aWxkIHRoYXQgc29tZXRoaW5nIGlzIHdyb25nLgorICovCisKKyNpZmRlZiBDT05GSUdfVVg1MDBfU09DX0RCNTUwMAorI2RlZmluZSBfX1VYNTAwX1VBUlQobikJVTU1MDBfVUFSVCMjbiMjX0JBU0UKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1VYNTAwX1NPQ19EQjg1MDAKKyNkZWZpbmUgX19VWDUwMF9VQVJUKG4pCVU4NTAwX1VBUlQjI24jI19CQVNFCisjZW5kaWYKKworI2lmbmRlZiBfX1VYNTAwX1VBUlQKKyNlcnJvciBVbmtub3duIFNPQworI2VuZGlmCisKICNkZWZpbmUgVVg1MDBfVUFSVChuKQlfX1VYNTAwX1VBUlQobikKICNkZWZpbmUgVUFSVF9CQVNFCVVYNTAwX1VBUlQoQ09ORklHX1VYNTAwX0RFQlVHX1VBUlQpCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdXg1MDAvaW5jbHVkZS9tYWNoL2VudHJ5LW1hY3JvLlMgYi9hcmNoL2FybS9tYWNoLXV4NTAwL2luY2x1ZGUvbWFjaC9lbnRyeS1tYWNyby5TCmluZGV4IGEzN2Y1ODUuLjA3MWJiYTkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtdXg1MDAvaW5jbHVkZS9tYWNoL2VudHJ5LW1hY3JvLlMKKysrIGIvYXJjaC9hcm0vbWFjaC11eDUwMC9pbmNsdWRlL21hY2gvZW50cnktbWFjcm8uUwpAQCAtMTEsMTUgKzExLDEwIEBACiAgKiB3YXJyYW50eSBvZiBhbnkga2luZCwgd2hldGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKi8KICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+Ci0jZGVmaW5lIEhBVkVfR0VUX0lSUU5SX1BSRUFNQkxFCiAjaW5jbHVkZSA8YXNtL2hhcmR3YXJlL2VudHJ5LW1hY3JvLWdpYy5TPgogCiAJCS5tYWNybwlkaXNhYmxlX2ZpcQogCQkuZW5kbQogCi0JCS5tYWNybyAgZ2V0X2lycW5yX3ByZWFtYmxlLCBiYXNlLCB0bXAKLQkJbGRyICAgICBcYmFzZSwgPUlPX0FERFJFU1MoVVg1MDBfR0lDX0NQVV9CQVNFKQotCQkuZW5kbQotCiAJCS5tYWNybyAgYXJjaF9yZXRfdG9fdXNlciwgdG1wMSwgdG1wMgogCQkuZW5kbQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC11eDUwMC9pbmNsdWRlL21hY2gvaGFyZHdhcmUuaCBiL2FyY2gvYXJtL21hY2gtdXg1MDAvaW5jbHVkZS9tYWNoL2hhcmR3YXJlLmgKaW5kZXggNjI5NWNjNS4uYmY2M2YyNiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC11eDUwMC9pbmNsdWRlL21hY2gvaGFyZHdhcmUuaAorKysgYi9hcmNoL2FybS9tYWNoLXV4NTAwL2luY2x1ZGUvbWFjaC9oYXJkd2FyZS5oCkBAIC0yOSwxMTggKzI5LDEyIEBACiAjaW5jbHVkZSA8bWFjaC9kYjg1MDAtcmVncy5oPgogI2luY2x1ZGUgPG1hY2gvZGI1NTAwLXJlZ3MuaD4KIAotI2lmZGVmIENPTkZJR19VWDUwMF9TT0NfREI4NTAwCi0jZGVmaW5lIFVYNTAwKHBlcmlwaCkJCVU4NTAwXyMjcGVyaXBoIyNfQkFTRQotI2VsaWYgZGVmaW5lZChDT05GSUdfVVg1MDBfU09DX0RCNTUwMCkKLSNkZWZpbmUgVVg1MDAocGVyaXBoKQkJVTU1MDBfIyNwZXJpcGgjI19CQVNFCi0jZW5kaWYKLQotI2RlZmluZSBVWDUwMF9CQUNLVVBSQU0wX0JBU0UJVVg1MDAoQkFDS1VQUkFNMCkKLSNkZWZpbmUgVVg1MDBfQkFDS1VQUkFNMV9CQVNFCVVYNTAwKEJBQ0tVUFJBTTEpCi0jZGVmaW5lIFVYNTAwX0IyUjJfQkFTRQkJVVg1MDAoQjJSMikKLQotI2RlZmluZSBVWDUwMF9DTEtSU1QxX0JBU0UJVVg1MDAoQ0xLUlNUMSkKLSNkZWZpbmUgVVg1MDBfQ0xLUlNUMl9CQVNFCVVYNTAwKENMS1JTVDIpCi0jZGVmaW5lIFVYNTAwX0NMS1JTVDNfQkFTRQlVWDUwMChDTEtSU1QzKQotI2RlZmluZSBVWDUwMF9DTEtSU1Q1X0JBU0UJVVg1MDAoQ0xLUlNUNSkKLSNkZWZpbmUgVVg1MDBfQ0xLUlNUNl9CQVNFCVVYNTAwKENMS1JTVDYpCi0KLSNkZWZpbmUgVVg1MDBfRE1BX0JBU0UJCVVYNTAwKERNQSkKLSNkZWZpbmUgVVg1MDBfRlNNQ19CQVNFCQlVWDUwMChGU01DKQotCi0jZGVmaW5lIFVYNTAwX0dJQ19DUFVfQkFTRQlVWDUwMChHSUNfQ1BVKQotI2RlZmluZSBVWDUwMF9HSUNfRElTVF9CQVNFCVVYNTAwKEdJQ19ESVNUKQotCi0jZGVmaW5lIFVYNTAwX0kyQzFfQkFTRQkJVVg1MDAoSTJDMSkKLSNkZWZpbmUgVVg1MDBfSTJDMl9CQVNFCQlVWDUwMChJMkMyKQotI2RlZmluZSBVWDUwMF9JMkMzX0JBU0UJCVVYNTAwKEkyQzMpCi0KLSNkZWZpbmUgVVg1MDBfTDJDQ19CQVNFCQlVWDUwMChMMkNDKQotI2RlZmluZSBVWDUwMF9NQ0RFX0JBU0UJCVVYNTAwKE1DREUpCi0jZGVmaW5lIFVYNTAwX01UVTBfQkFTRQkJVVg1MDAoTVRVMCkKLSNkZWZpbmUgVVg1MDBfTVRVMV9CQVNFCQlVWDUwMChNVFUxKQotI2RlZmluZSBVWDUwMF9QUkNNVV9CQVNFCVVYNTAwKFBSQ01VKQotCi0jZGVmaW5lIFVYNTAwX1JOR19CQVNFCQlVWDUwMChSTkcpCi0jZGVmaW5lIFVYNTAwX1JUQ19CQVNFCQlVWDUwMChSVEMpCi0KLSNkZWZpbmUgVVg1MDBfU0NVX0JBU0UJCVVYNTAwKFNDVSkKLQotI2RlZmluZSBVWDUwMF9TREkwX0JBU0UJCVVYNTAwKFNESTApCi0jZGVmaW5lIFVYNTAwX1NESTFfQkFTRQkJVVg1MDAoU0RJMSkKLSNkZWZpbmUgVVg1MDBfU0RJMl9CQVNFCQlVWDUwMChTREkyKQotI2RlZmluZSBVWDUwMF9TREkzX0JBU0UJCVVYNTAwKFNESTMpCi0jZGVmaW5lIFVYNTAwX1NESTRfQkFTRQkJVVg1MDAoU0RJNCkKLQotI2RlZmluZSBVWDUwMF9TUEkwX0JBU0UJCVVYNTAwKFNQSTApCi0jZGVmaW5lIFVYNTAwX1NQSTFfQkFTRQkJVVg1MDAoU1BJMSkKLSNkZWZpbmUgVVg1MDBfU1BJMl9CQVNFCQlVWDUwMChTUEkyKQotI2RlZmluZSBVWDUwMF9TUEkzX0JBU0UJCVVYNTAwKFNQSTMpCi0KLSNkZWZpbmUgVVg1MDBfU0lBX0JBU0UJCVVYNTAwKFNJQSkKLSNkZWZpbmUgVVg1MDBfU1ZBX0JBU0UJCVVYNTAwKFNWQSkKLQotI2RlZmluZSBVWDUwMF9UV0RfQkFTRQkJVVg1MDAoVFdEKQotCi0jZGVmaW5lIFVYNTAwX1VBUlQwX0JBU0UJVVg1MDAoVUFSVDApCi0jZGVmaW5lIFVYNTAwX1VBUlQxX0JBU0UJVVg1MDAoVUFSVDEpCi0jZGVmaW5lIFVYNTAwX1VBUlQyX0JBU0UJVVg1MDAoVUFSVDIpCi0KLSNkZWZpbmUgVVg1MDBfVVNCT1RHX0JBU0UJVVg1MDAoVVNCT1RHKQotCiAvKiBTVC1Fcmljc3NvbiBtb2RpZmllZCBwbDAyMiBpZCAqLwogI2RlZmluZSBTU1BfUEVSX0lECQkweDAxMDgwMDIyCiAKICNpZm5kZWYgX19BU1NFTUJMWV9fCiAKLSNpbmNsdWRlIDxhc20vY3B1dHlwZS5oPgotCi1zdGF0aWMgaW5saW5lIGJvb2wgY3B1X2lzX3U4NTAwKHZvaWQpCi17Ci0jaWZkZWYgQ09ORklHX1VYNTAwX1NPQ19EQjg1MDAKLQlyZXR1cm4gMTsKLSNlbHNlCi0JcmV0dXJuIDA7Ci0jZW5kaWYKLX0KLQotI2RlZmluZSBDUFVJRF9EQjg1MDBFRAkweDQxMGZjMDkwCi0jZGVmaW5lIENQVUlEX0RCODUwMFYxCTB4NDExZmMwOTEKLSNkZWZpbmUgQ1BVSURfREI4NTAwVjIJMHg0MTJmYzA5MQotCi1zdGF0aWMgaW5saW5lIGJvb2wgY3B1X2lzX3U4NTAwZWQodm9pZCkKLXsKLQlyZXR1cm4gY3B1X2lzX3U4NTAwKCkgJiYgKHJlYWRfY3B1aWRfaWQoKSA9PSBDUFVJRF9EQjg1MDBFRCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgYm9vbCBjcHVfaXNfdTg1MDB2MSh2b2lkKQotewotCXJldHVybiBjcHVfaXNfdTg1MDAoKSAmJiAocmVhZF9jcHVpZF9pZCgpID09IENQVUlEX0RCODUwMFYxKTsKLX0KLQotc3RhdGljIGlubGluZSBib29sIGNwdV9pc191ODUwMHYyKHZvaWQpCi17Ci0JcmV0dXJuIGNwdV9pc191ODUwMCgpICYmIChyZWFkX2NwdWlkX2lkKCkgPT0gQ1BVSURfREI4NTAwVjIpOwotfQotCi0jaWZkZWYgQ09ORklHX1VYNTAwX1NPQ19EQjg1MDAKLWJvb2wgY3B1X2lzX3U4NTAwdjEwKHZvaWQpOwotYm9vbCBjcHVfaXNfdTg1MDB2MTEodm9pZCk7Ci1ib29sIGNwdV9pc191ODUwMHYyMCh2b2lkKTsKLSNlbHNlCi1zdGF0aWMgaW5saW5lIGJvb2wgY3B1X2lzX3U4NTAwdjEwKHZvaWQpIHsgcmV0dXJuIGZhbHNlOyB9Ci1zdGF0aWMgaW5saW5lIGJvb2wgY3B1X2lzX3U4NTAwdjExKHZvaWQpIHsgcmV0dXJuIGZhbHNlOyB9Ci1zdGF0aWMgaW5saW5lIGJvb2wgY3B1X2lzX3U4NTAwdjIwKHZvaWQpIHsgcmV0dXJuIGZhbHNlOyB9Ci0jZW5kaWYKLQotc3RhdGljIGlubGluZSBib29sIGNwdV9pc191NTUwMCh2b2lkKQotewotI2lmZGVmIENPTkZJR19VWDUwMF9TT0NfREI1NTAwCi0JcmV0dXJuIDE7Ci0jZWxzZQotCXJldHVybiAwOwotI2VuZGlmCi19CisjaW5jbHVkZSA8bWFjaC9pZC5oPgogCiAjZGVmaW5lIEFSUkFZX0FORF9TSVpFKHgpCSh4KSwgQVJSQVlfU0laRSh4KQogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXV4NTAwL2luY2x1ZGUvbWFjaC9pZC5oIGIvYXJjaC9hcm0vbWFjaC11eDUwMC9pbmNsdWRlL21hY2gvaWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTI4OGQxCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC11eDUwMC9pbmNsdWRlL21hY2gvaWQuaApAQCAtMCwwICsxLDgwIEBACisvKgorICogQ29weXJpZ2h0IChDKSBTVC1Fcmljc3NvbiBTQSAyMDEwCisgKgorICogQXV0aG9yOiBSYWJpbiBWaW5jZW50IDxyYWJpbi52aW5jZW50QHN0ZXJpY3Nzb24uY29tPiBmb3IgU1QtRXJpY3Nzb24KKyAqIExpY2Vuc2UgdGVybXM6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIHZlcnNpb24gMgorICovCisKKyNpZm5kZWYgX19NQUNIX1VYNTAwX0lECisjZGVmaW5lIF9fTUFDSF9VWDUwMF9JRAorCisvKioKKyAqIHN0cnVjdCBkYng1MDBfYXNpY19pZCAtIGZpZWxkcyBvZiB0aGUgQVNJQyBJRAorICogQHByb2Nlc3M6IHRoZSBtYW51ZmFjdHVyaW5nIHByb2Nlc3MsIDB4NDAgaXMgNDAgbm0gMHgwMCBpcyAic3RhbmRhcmQiCisgKiBAcGFydG51bWJlcjogaGl0aGVyZXRvIDB4ODUwMCBmb3IgREI4NTAwCisgKiBAcmV2aXNpb246IHZlcnNpb24gY29kZSBpbiB0aGUgc2VyaWVzCisgKi8KK3N0cnVjdCBkYng1MDBfYXNpY19pZCB7CisJdTE2CXBhcnRudW1iZXI7CisJdTgJcmV2aXNpb247CisJdTgJcHJvY2VzczsKK307CisKK2V4dGVybiBzdHJ1Y3QgZGJ4NTAwX2FzaWNfaWQgZGJ4NTAwX2lkOworCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBfX2F0dHJpYnV0ZV9jb25zdF9fIGRieDUwMF9wYXJ0bnVtYmVyKHZvaWQpCit7CisJcmV0dXJuIGRieDUwMF9pZC5wYXJ0bnVtYmVyOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBfX2F0dHJpYnV0ZV9jb25zdF9fIGRieDUwMF9yZXZpc2lvbih2b2lkKQoreworCXJldHVybiBkYng1MDBfaWQucmV2aXNpb247Cit9CisKKy8qCisgKiBTT0NzCisgKi8KKworc3RhdGljIGlubGluZSBib29sIF9fYXR0cmlidXRlX2NvbnN0X18gY3B1X2lzX3U4NTAwKHZvaWQpCit7CisJcmV0dXJuIGRieDUwMF9wYXJ0bnVtYmVyKCkgPT0gMHg4NTAwOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgX19hdHRyaWJ1dGVfY29uc3RfXyBjcHVfaXNfdTU1MDAodm9pZCkKK3sKKwlyZXR1cm4gZGJ4NTAwX3BhcnRudW1iZXIoKSA9PSAweDU1MDA7Cit9CisKKy8qCisgKiA4NTAwIHJldmlzaW9ucworICovCisKK3N0YXRpYyBpbmxpbmUgYm9vbCBfX2F0dHJpYnV0ZV9jb25zdF9fIGNwdV9pc191ODUwMGVkKHZvaWQpCit7CisJcmV0dXJuIGNwdV9pc191ODUwMCgpICYmIGRieDUwMF9yZXZpc2lvbigpID09IDB4MDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBfX2F0dHJpYnV0ZV9jb25zdF9fIGNwdV9pc191ODUwMHYxKHZvaWQpCit7CisJcmV0dXJuIGNwdV9pc191ODUwMCgpICYmIChkYng1MDBfcmV2aXNpb24oKSAmIDB4ZjApID09IDB4QTA7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBfX2F0dHJpYnV0ZV9jb25zdF9fIGNwdV9pc191ODUwMHYxMCh2b2lkKQoreworCXJldHVybiBjcHVfaXNfdTg1MDAoKSAmJiBkYng1MDBfcmV2aXNpb24oKSA9PSAweEEwOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgX19hdHRyaWJ1dGVfY29uc3RfXyBjcHVfaXNfdTg1MDB2MTEodm9pZCkKK3sKKwlyZXR1cm4gY3B1X2lzX3U4NTAwKCkgJiYgZGJ4NTAwX3JldmlzaW9uKCkgPT0gMHhBMTsKK30KKworc3RhdGljIGlubGluZSBib29sIF9fYXR0cmlidXRlX2NvbnN0X18gY3B1X2lzX3U4NTAwdjIodm9pZCkKK3sKKwlyZXR1cm4gY3B1X2lzX3U4NTAwKCkgJiYgKChkYng1MDBfcmV2aXNpb24oKSAmIDB4ZjApID09IDB4QjApOworfQorCisjZGVmaW5lIHV4NTAwX3Vua25vd25fc29jKCkJQlVHKCkKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXV4NTAwL2luY2x1ZGUvbWFjaC9pcnFzLmggYi9hcmNoL2FybS9tYWNoLXV4NTAwL2luY2x1ZGUvbWFjaC9pcnFzLmgKaW5kZXggODgwYWU0NS4uYmExMjk0YyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC11eDUwMC9pbmNsdWRlL21hY2gvaXJxcy5oCisrKyBiL2FyY2gvYXJtL21hY2gtdXg1MDAvaW5jbHVkZS9tYWNoL2lycXMuaApAQCAtMzYsNyArMzYsNyBAQAogLyogVGhpcyB3aWxsIGJlIG92ZXJyaWRkZW4gYnkgYm9hcmQtc3BlY2lmaWMgaXJxIGhlYWRlcnMgKi8KICNkZWZpbmUgSVJRX0JPQVJEX0VORAkJCUlSUV9CT0FSRF9TVEFSVAogCi0jaWZkZWYgQ09ORklHX01BQ0hfVTg1MDBfTU9QCisjaWZkZWYgQ09ORklHX01BQ0hfVTg1MDAKICNpbmNsdWRlIDxtYWNoL2lycXMtYm9hcmQtbW9wNTAwLmg+CiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC11eDUwMC9pbmNsdWRlL21hY2gvc2V0dXAuaCBiL2FyY2gvYXJtL21hY2gtdXg1MDAvaW5jbHVkZS9tYWNoL3NldHVwLmgKaW5kZXggNDY5ODc3ZS4uYTdkMzYzZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC11eDUwMC9pbmNsdWRlL21hY2gvc2V0dXAuaAorKysgYi9hcmNoL2FybS9tYWNoLXV4NTAwL2luY2x1ZGUvbWFjaC9zZXR1cC5oCkBAIC0xNCw3ICsxNCw3IEBACiAjaW5jbHVkZSA8YXNtL21hY2gvdGltZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KIAotZXh0ZXJuIHZvaWQgX19pbml0IHV4NTAwX21hcF9pbyh2b2lkKTsKK3ZvaWQgX19pbml0IHV4NTAwX21hcF9pbyh2b2lkKTsKIGV4dGVybiB2b2lkIF9faW5pdCB1NTUwMF9tYXBfaW8odm9pZCk7CiBleHRlcm4gdm9pZCBfX2luaXQgdTg1MDBfbWFwX2lvKHZvaWQpOwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXV4NTAwL21vZGVtLWlycS1kYjU1MDAuYyBiL2FyY2gvYXJtL21hY2gtdXg1MDAvbW9kZW0taXJxLWRiNTUwMC5jCmluZGV4IDMxODdmODguLmUxMjk2YTcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtdXg1MDAvbW9kZW0taXJxLWRiNTUwMC5jCisrKyBiL2FyY2gvYXJtL21hY2gtdXg1MDAvbW9kZW0taXJxLWRiNTUwMC5jCkBAIC0xMiw2ICsxMiw4IEBACiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAKKyNpbmNsdWRlIDxtYWNoL2lkLmg+CisKICNkZWZpbmUgTU9ERU1fSU5UQ09OX0JBU0VfQUREUiAweEJGRkQzMDAwCiAjZGVmaW5lIE1PREVNX0lOVENPTl9TSVpFIDB4RkZGCiAKQEAgLTEwMSw2ICsxMDMsOSBAQAogCXN0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgIG1vZGVtX2lycV9jaGlwOwogCXN0cnVjdCBtb2RlbV9pcnEgKm1pOwogCisJaWYgKCFjcHVfaXNfdTU1MDAoKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKIAlwcl9pbmZvKCJtb2RlbV9pcnE6IFNldCB1cCBJUlEgaGFuZGxlciBmb3IgaW5jb21pbmcgbW9kZW0gSVJRICVkXG4iLAogCQkgICBJUlFfREI1NTAwX01PREVNKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC11eDUwMC9wbGF0c21wLmMgYi9hcmNoL2FybS9tYWNoLXV4NTAwL3BsYXRzbXAuYwppbmRleCBkNzdlNzZjLi40ZmZmNGQ0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXV4NTAwL3BsYXRzbXAuYworKysgYi9hcmNoL2FybS9tYWNoLXV4NTAwL3BsYXRzbXAuYwpAQCAtMjAsNiArMjAsNyBAQAogI2luY2x1ZGUgPGFzbS9jYWNoZWZsdXNoLmg+CiAjaW5jbHVkZSA8YXNtL3NtcF9zY3UuaD4KICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8bWFjaC9zZXR1cC5oPgogCiAvKgogICogY29udHJvbCBmb3Igd2hpY2ggY29yZSBpcyB0aGUgbmV4dCB0byBjb21lIG91dCBvZiB0aGUgc2Vjb25kYXJ5CkBAIC00MCw2ICs0MSwxOCBAQAogCW91dGVyX2NsZWFuX3JhbmdlKF9fcGEoJnBlbl9yZWxlYXNlKSwgX19wYSgmcGVuX3JlbGVhc2UgKyAxKSk7CiB9CiAKK3N0YXRpYyB2b2lkIF9faW9tZW0gKnNjdV9iYXNlX2FkZHIodm9pZCkKK3sKKwlpZiAoY3B1X2lzX3U1NTAwKCkpCisJCXJldHVybiBfX2lvX2FkZHJlc3MoVTU1MDBfU0NVX0JBU0UpOworCWVsc2UgaWYgKGNwdV9pc191ODUwMCgpKQorCQlyZXR1cm4gX19pb19hZGRyZXNzKFU4NTAwX1NDVV9CQVNFKTsKKwllbHNlCisJCXV4NTAwX3Vua25vd25fc29jKCk7CisKKwlyZXR1cm4gTlVMTDsKK30KKwogc3RhdGljIERFRklORV9TUElOTE9DSyhib290X2xvY2spOwogCiB2b2lkIF9fY3B1aW5pdCBwbGF0Zm9ybV9zZWNvbmRhcnlfaW5pdCh1bnNpZ25lZCBpbnQgY3B1KQpAQCAtMTAwLDIxICsxMTMsMjggQEAKIAogc3RhdGljIHZvaWQgX19pbml0IHdha2V1cF9zZWNvbmRhcnkodm9pZCkKIHsKKwl2b2lkIF9faW9tZW0gKmJhY2t1cHJhbTsKKworCWlmIChjcHVfaXNfdTU1MDAoKSkKKwkJYmFja3VwcmFtID0gX19pb19hZGRyZXNzKFU1NTAwX0JBQ0tVUFJBTTBfQkFTRSk7CisJZWxzZSBpZiAoY3B1X2lzX3U4NTAwKCkpCisJCWJhY2t1cHJhbSA9IF9faW9fYWRkcmVzcyhVODUwMF9CQUNLVVBSQU0wX0JBU0UpOworCWVsc2UKKwkJdXg1MDBfdW5rbm93bl9zb2MoKTsKKwogCS8qCiAJICogd3JpdGUgdGhlIGFkZHJlc3Mgb2Ygc2Vjb25kYXJ5IHN0YXJ0dXAgaW50byB0aGUgYmFja3VwIHJhbSByZWdpc3RlcgogCSAqIGF0IG9mZnNldCAweDFGRjQsIHRoZW4gd3JpdGUgdGhlIG1hZ2ljIG51bWJlciAweEExRkVFRDAxIHRvIHRoZQogCSAqIGJhY2t1cCByYW0gcmVnaXN0ZXIgYXQgb2Zmc2V0IDB4MUZGMCwgd2hpY2ggaXMgd2hhdCBib290IHJvbSBjb2RlCiAJICogaXMgd2FpdGluZyBmb3IuIFRoaXMgd291bGQgd2FrZSB1cCB0aGUgc2Vjb25kYXJ5IGNvcmUgZnJvbSBXRkUKIAkgKi8KLSNkZWZpbmUgVTg1MDBfQ1BVMV9KVU1QQUREUl9PRkZTRVQgMHgxRkY0CisjZGVmaW5lIFVYNTAwX0NQVTFfSlVNUEFERFJfT0ZGU0VUIDB4MUZGNAogCV9fcmF3X3dyaXRlbCh2aXJ0X3RvX3BoeXModTg1MDBfc2Vjb25kYXJ5X3N0YXJ0dXApLAotCQlfX2lvX2FkZHJlc3MoVVg1MDBfQkFDS1VQUkFNMF9CQVNFKSArCi0JCVU4NTAwX0NQVTFfSlVNUEFERFJfT0ZGU0VUKTsKKwkJICAgICBiYWNrdXByYW0gKyBVWDUwMF9DUFUxX0pVTVBBRERSX09GRlNFVCk7CiAKLSNkZWZpbmUgVTg1MDBfQ1BVMV9XQUtFTUFHSUNfT0ZGU0VUIDB4MUZGMAorI2RlZmluZSBVWDUwMF9DUFUxX1dBS0VNQUdJQ19PRkZTRVQgMHgxRkYwCiAJX19yYXdfd3JpdGVsKDB4QTFGRUVEMDEsCi0JCV9faW9fYWRkcmVzcyhVWDUwMF9CQUNLVVBSQU0wX0JBU0UpICsKLQkJVTg1MDBfQ1BVMV9XQUtFTUFHSUNfT0ZGU0VUKTsKKwkJICAgICBiYWNrdXByYW0gKyBVWDUwMF9DUFUxX1dBS0VNQUdJQ19PRkZTRVQpOwogCiAJLyogbWFrZSBzdXJlIHdyaXRlIGJ1ZmZlciBpcyBkcmFpbmVkICovCiAJbWIoKTsKQEAgLTEyNiw5ICsxNDYsMTAgQEAKICAqLwogdm9pZCBfX2luaXQgc21wX2luaXRfY3B1cyh2b2lkKQogeworCXZvaWQgX19pb21lbSAqc2N1X2Jhc2UgPSBzY3VfYmFzZV9hZGRyKCk7CiAJdW5zaWduZWQgaW50IGksIG5jb3JlczsKIAotCW5jb3JlcyA9IHNjdV9nZXRfY29yZV9jb3VudChfX2lvX2FkZHJlc3MoVVg1MDBfU0NVX0JBU0UpKTsKKwluY29yZXMgPSBzY3VfYmFzZSA/IHNjdV9nZXRfY29yZV9jb3VudChzY3VfYmFzZSkgOiAxOwogCiAJLyogc2FuaXR5IGNoZWNrICovCiAJaWYgKG5jb3JlcyA+IE5SX0NQVVMpIHsKQEAgLTE1NCw2ICsxNzUsNiBAQAogCWZvciAoaSA9IDA7IGkgPCBtYXhfY3B1czsgaSsrKQogCQlzZXRfY3B1X3ByZXNlbnQoaSwgdHJ1ZSk7CiAKLQlzY3VfZW5hYmxlKF9faW9fYWRkcmVzcyhVWDUwMF9TQ1VfQkFTRSkpOworCXNjdV9lbmFibGUoc2N1X2Jhc2VfYWRkcigpKTsKIAl3YWtldXBfc2Vjb25kYXJ5KCk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXMzYzI0eHgvY3B1LWZyZXEuYyBiL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9jcHUtZnJlcS5jCmluZGV4IDFlY2MxNWIuLjI1YThmYzcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9jcHUtZnJlcS5jCisrKyBiL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9jcHUtZnJlcS5jCkBAIC0yMSw3ICsyMSw2IEBACiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9zeXNkZXYuaD4KLSNpbmNsdWRlIDxsaW51eC9rb2JqZWN0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vTWFrZWZpbGUgYi9hcmNoL2JsYWNrZmluL01ha2VmaWxlCmluZGV4IDQ2NzM4ZDQuLjQ2ZjQyYjIgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vTWFrZWZpbGUKKysrIGIvYXJjaC9ibGFja2Zpbi9NYWtlZmlsZQpAQCAtMTksNyArMTksNyBAQAogZW5kaWYKIEtCVUlMRF9BRkxBR1MgICAgICAgICAgICs9ICQoY2FsbCBjYy1vcHRpb24sLW1uby1mZHBpYykKIEtCVUlMRF9DRkxBR1NfTU9EVUxFICAgICs9IC1tbG9uZy1jYWxscwotS0JVSUxEX0xERkxBR1NfTU9EVUxFICAgKz0gLW0gZWxmMzJiZmluCitMREZMQUdTICAgICAgICAgICAgICAgICArPSAtbSBlbGYzMmJmaW4KIEtBTExTWU1TICAgICAgICAgKz0gLS1zeW1ib2wtcHJlZml4PV8KIAogS0JVSUxEX0RFRkNPTkZJRyA6PSBCRjUzNy1TVEFNUF9kZWZjb25maWcKQEAgLTk3LDggKzk3LDExIEBACiByZXYtJChDT05GSUdfQkZfUkVWX05PTkUpIDo9IG5vbmUKIHJldi0kKENPTkZJR19CRl9SRVZfQU5ZKSAgOj0gYW55CiAKLUtCVUlMRF9DRkxBR1MgKz0gLW1jcHU9JChjcHUteSktJChyZXYteSkKLUtCVUlMRF9BRkxBR1MgKz0gLW1jcHU9JChjcHUteSktJChyZXYteSkKK0NQVV9SRVYgOj0gJChjcHUteSktJChyZXYteSkKK2V4cG9ydCBDUFVfUkVWCisKK0tCVUlMRF9DRkxBR1MgKz0gLW1jcHU9JChDUFVfUkVWKQorS0JVSUxEX0FGTEFHUyArPSAtbWNwdT0kKENQVV9SRVYpCiAKICMgLSB3ZSB1dGlsaXplIHRoZSBzaWxpY29uIHJldiBmcm9tIHRoZSB0b29sY2hhaW4sIHNvIG1vdmUgaXQgb3ZlciB0byB0aGUgY2hlY2tmbGFncwogQ0hFQ0tGTEFHU19TSUxJQ09OID0gJChzaGVsbCBlY2hvICIiIHwgJChDUFApICQoS0JVSUxEX0NGTEFHUykgLWREIC0gMj4vZGV2L251bGwgfCBhd2sgJyQkMiA9PSAiX19TSUxJQ09OX1JFVklTSU9OX18iIHsgcHJpbnQgJCQzIH0nKQpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9ib290L01ha2VmaWxlIGIvYXJjaC9ibGFja2Zpbi9ib290L01ha2VmaWxlCmluZGV4IDEzZDJkYmQuLjBhNDkyNzkgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vYm9vdC9NYWtlZmlsZQorKysgYi9hcmNoL2JsYWNrZmluL2Jvb3QvTWFrZWZpbGUKQEAgLTE3LDcgKzE3LDcgQEAKIAogcXVpZXRfY21kX3VpbWFnZSA9IFVJTUFHRSAgJEAKICAgICAgIGNtZF91aW1hZ2UgPSAkKENPTkZJR19TSEVMTCkgJChNS0lNQUdFKSAtQSAkKEFSQ0gpIC1PIGxpbnV4IC1UIGtlcm5lbCBcCi0gICAgICAgICAgICAgICAgICAgLUMgJCgyKSAtbiAnJChNQUNISU5FKS0kKEtFUk5FTFJFTEVBU0UpJyBcCisgICAgICAgICAgICAgICAgICAgLUMgJCgyKSAtbiAnJChDUFVfUkVWKS0kKEtFUk5FTFJFTEVBU0UpJyBcCiAgICAgICAgICAgICAgICAgICAgLWUgJChzaGVsbCAkKE5NKSB2bWxpbnV4IHwgYXdrICckJE5GID09ICJfX3N0YXJ0IiB7cHJpbnQgJCQxfScpIFwKICAgICAgICAgICAgICAgICAgICAkKFVJTUFHRV9PUFRTLXkpIC1kICQ8ICRACiAKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vY29uZmlncy9CRjU2MS1FWktJVC1TTVBfZGVmY29uZmlnIGIvYXJjaC9ibGFja2Zpbi9jb25maWdzL0JGNTYxLUVaS0lULVNNUF9kZWZjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGNmNDUxMAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYmxhY2tmaW4vY29uZmlncy9CRjU2MS1FWktJVC1TTVBfZGVmY29uZmlnCkBAIC0wLDAgKzEsMTEzIEBACitDT05GSUdfRVhQRVJJTUVOVEFMPXkKK0NPTkZJR19TWVNWSVBDPXkKK0NPTkZJR19JS0NPTkZJRz15CitDT05GSUdfSUtDT05GSUdfUFJPQz15CitDT05GSUdfTE9HX0JVRl9TSElGVD0xNAorQ09ORklHX0JMS19ERVZfSU5JVFJEPXkKKyMgQ09ORklHX0NDX09QVElNSVpFX0ZPUl9TSVpFIGlzIG5vdCBzZXQKK0NPTkZJR19FTUJFRERFRD15CisjIENPTkZJR19TWVNDVExfU1lTQ0FMTCBpcyBub3Qgc2V0CisjIENPTkZJR19FTEZfQ09SRSBpcyBub3Qgc2V0CisjIENPTkZJR19GVVRFWCBpcyBub3Qgc2V0CisjIENPTkZJR19TSUdOQUxGRCBpcyBub3Qgc2V0CisjIENPTkZJR19USU1FUkZEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VWRU5URkQgaXMgbm90IHNldAorIyBDT05GSUdfQUlPIGlzIG5vdCBzZXQKK0NPTkZJR19TTEFCPXkKK0NPTkZJR19NTUFQX0FMTE9XX1VOSU5JVElBTElaRUQ9eQorQ09ORklHX01PRFVMRVM9eQorQ09ORklHX01PRFVMRV9VTkxPQUQ9eQorIyBDT05GSUdfTEJEQUYgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9CU0cgaXMgbm90IHNldAorIyBDT05GSUdfSU9TQ0hFRF9ERUFETElORSBpcyBub3Qgc2V0CisjIENPTkZJR19JT1NDSEVEX0NGUSBpcyBub3Qgc2V0CitDT05GSUdfUFJFRU1QVF9WT0xVTlRBUlk9eQorQ09ORklHX0JGNTYxPXkKK0NPTkZJR19TTVA9eQorQ09ORklHX0lSUV9USU1FUjA9MTAKK0NPTkZJR19DTEtJTl9IWj0zMDAwMDAwMAorQ09ORklHX0hJR0hfUkVTX1RJTUVSUz15CitDT05GSUdfTk9NTVVfSU5JVElBTF9UUklNX0VYQ0VTUz0wCitDT05GSUdfQkZJTl9HUFRJTUVSUz1tCitDT05GSUdfQ19DRFBSSU89eQorQ09ORklHX0JBTktfMz0weEFBQzIKK0NPTkZJR19CSU5GTVRfRkxBVD15CitDT05GSUdfQklORk1UX1pGTEFUPXkKK0NPTkZJR19QTT15CitDT05GSUdfTkVUPXkKK0NPTkZJR19QQUNLRVQ9eQorQ09ORklHX1VOSVg9eQorQ09ORklHX0lORVQ9eQorQ09ORklHX0lQX1BOUD15CisjIENPTkZJR19JTkVUX1hGUk1fTU9ERV9UUkFOU1BPUlQgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9YRlJNX01PREVfVFVOTkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfWEZSTV9NT0RFX0JFRVQgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9MUk8gaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9ESUFHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQVjYgaXMgbm90IHNldAorQ09ORklHX0lSREE9bQorQ09ORklHX0lSTEFOPW0KK0NPTkZJR19JUkNPTU09bQorQ09ORklHX0lSREFfQ0FDSEVfTEFTVF9MU0FQPXkKK0NPTkZJR19JUlRUWV9TSVI9bQorIyBDT05GSUdfV0lSRUxFU1MgaXMgbm90IHNldAorQ09ORklHX1VFVkVOVF9IRUxQRVJfUEFUSD0iL3NiaW4vaG90cGx1ZyIKKyMgQ09ORklHX0ZXX0xPQURFUiBpcyBub3Qgc2V0CitDT05GSUdfTVREPXkKK0NPTkZJR19NVERfUEFSVElUSU9OUz15CitDT05GSUdfTVREX0NNRExJTkVfUEFSVFM9eQorQ09ORklHX01URF9DSEFSPW0KK0NPTkZJR19NVERfQkxPQ0s9eQorQ09ORklHX01URF9DRkk9bQorQ09ORklHX01URF9DRklfQU1EU1REPW0KK0NPTkZJR19NVERfUkFNPXkKK0NPTkZJR19NVERfUk9NPW0KK0NPTkZJR19NVERfUEhZU01BUD1tCitDT05GSUdfQkxLX0RFVl9SQU09eQorQ09ORklHX05FVERFVklDRVM9eQorQ09ORklHX05FVF9FVEhFUk5FVD15CitDT05GSUdfU01DOTFYPXkKKyMgQ09ORklHX05FVERFVl8xMDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVERFVl8xMDAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19XTEFOIGlzIG5vdCBzZXQKK0NPTkZJR19JTlBVVD1tCisjIENPTkZJR19JTlBVVF9NT1VTRURFViBpcyBub3Qgc2V0CitDT05GSUdfSU5QVVRfRVZERVY9bQorIyBDT05GSUdfSU5QVVRfS0VZQk9BUkQgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfTU9VU0UgaXMgbm90IHNldAorIyBDT05GSUdfU0VSSU8gaXMgbm90IHNldAorIyBDT05GSUdfVlQgaXMgbm90IHNldAorIyBDT05GSUdfREVWS01FTSBpcyBub3Qgc2V0CitDT05GSUdfQkZJTl9KVEFHX0NPTU09bQorQ09ORklHX1NFUklBTF9CRklOPXkKK0NPTkZJR19TRVJJQUxfQkZJTl9DT05TT0xFPXkKKyMgQ09ORklHX0xFR0FDWV9QVFlTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hXX1JBTkRPTSBpcyBub3Qgc2V0CitDT05GSUdfU1BJPXkKK0NPTkZJR19TUElfQkZJTj15CitDT05GSUdfR1BJT0xJQj15CitDT05GSUdfR1BJT19TWVNGUz15CisjIENPTkZJR19IV01PTiBpcyBub3Qgc2V0CitDT05GSUdfV0FUQ0hET0c9eQorQ09ORklHX0JGSU5fV0RUPXkKKyMgQ09ORklHX1VTQl9TVVBQT1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ROT1RJRlkgaXMgbm90IHNldAorQ09ORklHX0pGRlMyX0ZTPW0KK0NPTkZJR19ORlNfRlM9bQorQ09ORklHX05GU19WMz15CitDT05GSUdfU01CX0ZTPW0KK0NPTkZJR19ERUJVR19LRVJORUw9eQorQ09ORklHX0RFQlVHX1NISVJRPXkKK0NPTkZJR19ERVRFQ1RfSFVOR19UQVNLPXkKK0NPTkZJR19ERUJVR19JTkZPPXkKKyMgQ09ORklHX1JDVV9DUFVfU1RBTExfREVURUNUT1IgaXMgbm90IHNldAorIyBDT05GSUdfRlRSQUNFIGlzIG5vdCBzZXQKK0NPTkZJR19ERUJVR19NTVJTPXkKK0NPTkZJR19ERUJVR19IV0VSUj15CitDT05GSUdfRVhBQ1RfSFdFUlI9eQorQ09ORklHX0RFQlVHX0RPVUJMRUZBVUxUPXkKK0NPTkZJR19ERUJVR19CRklOX0hXVFJBQ0VfQ09NUFJFU1NJT05fT05FPXkKK0NPTkZJR19FQVJMWV9QUklOVEs9eQorQ09ORklHX0NQTEJfSU5GTz15CitDT05GSUdfQ1JZUFRPPXkKKyMgQ09ORklHX0NSWVBUT19BTlNJX0NQUk5HIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vY29uZmlncy9ETlA1MzcwX2RlZmNvbmZpZyBiL2FyY2gvYmxhY2tmaW4vY29uZmlncy9ETlA1MzcwX2RlZmNvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZWJjN2Q5Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9ibGFja2Zpbi9jb25maWdzL0ROUDUzNzBfZGVmY29uZmlnCkBAIC0wLDAgKzEsMTIxIEBACitDT05GSUdfRVhQRVJJTUVOVEFMPXkKK0NPTkZJR19MT0NBTFZFUlNJT049IkROUDUzNzAiCitDT05GSUdfU1lTVklQQz15CitDT05GSUdfSUtDT05GSUc9eQorQ09ORklHX0lLQ09ORklHX1BST0M9eQorQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKK0NPTkZJR19CTEtfREVWX0lOSVRSRD15CitDT05GSUdfRU1CRURERUQ9eQorQ09ORklHX1NMT0I9eQorIyBDT05GSUdfQkxLX0RFVl9CU0cgaXMgbm90IHNldAorIyBDT05GSUdfSU9TQ0hFRF9DRlEgaXMgbm90IHNldAorQ09ORklHX0JGNTM3PXkKK0NPTkZJR19CRl9SRVZfMF8zPXkKK0NPTkZJR19ETlA1MzcwPXkKK0NPTkZJR19JUlFfRVJST1I9NworIyBDT05GSUdfQ1lDTEVTX0NMT0NLU09VUkNFIGlzIG5vdCBzZXQKK0NPTkZJR19DX0NEUFJJTz15CitDT05GSUdfQ19BTUJFTl9CMF9CMV9CMj15CitDT05GSUdfUE09eQorIyBDT05GSUdfU1VTUEVORCBpcyBub3Qgc2V0CitDT05GSUdfTkVUPXkKK0NPTkZJR19QQUNLRVQ9eQorQ09ORklHX1VOSVg9eQorQ09ORklHX0lORVQ9eQorQ09ORklHX0lQX1BOUD15CitDT05GSUdfSVBfUE5QX1JBUlA9eQorQ09ORklHX1NZTl9DT09LSUVTPXkKKyMgQ09ORklHX0lORVRfWEZSTV9NT0RFX1RSQU5TUE9SVCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX1hGUk1fTU9ERV9UVU5ORUwgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9YRlJNX01PREVfQkVFVCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX0xSTyBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX0RJQUcgaXMgbm90IHNldAorIyBDT05GSUdfSVBWNiBpcyBub3Qgc2V0CitDT05GSUdfTExDMj15CitDT05GSUdfVUVWRU5UX0hFTFBFUl9QQVRIPSIvc2Jpbi9ob3RwbHVnIgorQ09ORklHX01URD15CitDT05GSUdfTVREX0RFQlVHPXkKK0NPTkZJR19NVERfREVCVUdfVkVSQk9TRT0xCitDT05GSUdfTVREX1BBUlRJVElPTlM9eQorQ09ORklHX01URF9DSEFSPXkKK0NPTkZJR19NVERfQkxPQ0s9eQorQ09ORklHX05GVEw9eQorQ09ORklHX05GVExfUlc9eQorQ09ORklHX01URF9DRkk9eQorQ09ORklHX01URF9DRklfQU1EU1REPXkKK0NPTkZJR19NVERfUk9NPXkKK0NPTkZJR19NVERfQUJTRU5UPXkKK0NPTkZJR19NVERfQ09NUExFWF9NQVBQSU5HUz15CitDT05GSUdfTVREX1BIWVNNQVA9eQorQ09ORklHX01URF9VQ0xJTlVYPXkKK0NPTkZJR19NVERfUExBVFJBTT15CitDT05GSUdfTVREX0RBVEFGTEFTSD15CitDT05GSUdfTVREX0JMT0NLMk1URD15CitDT05GSUdfTVREX05BTkQ9eQorQ09ORklHX01URF9OQU5EX1BMQVRGT1JNPXkKK0NPTkZJR19CTEtfREVWX0xPT1A9eQorQ09ORklHX0JMS19ERVZfUkFNPXkKKyMgQ09ORklHX01JU0NfREVWSUNFUyBpcyBub3Qgc2V0CitDT05GSUdfTkVUREVWSUNFUz15CitDT05GSUdfREFWSUNPTV9QSFk9eQorQ09ORklHX05FVF9FVEhFUk5FVD15CitDT05GSUdfQkZJTl9NQUM9eQorIyBDT05GSUdfTkVUREVWXzEwMDAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUREVWXzEwMDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dMQU4gaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVQgaXMgbm90IHNldAorIyBDT05GSUdfU0VSSU8gaXMgbm90IHNldAorIyBDT05GSUdfQkZJTl9ETUFfSU5URVJGQUNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFVktNRU0gaXMgbm90IHNldAorQ09ORklHX0JGSU5fSlRBR19DT01NPXkKK0NPTkZJR19CRklOX0pUQUdfQ09NTV9DT05TT0xFPXkKK0NPTkZJR19TRVJJQUxfQkZJTj15CitDT05GSUdfU0VSSUFMX0JGSU5fQ09OU09MRT15CitDT05GSUdfU0VSSUFMX0JGSU5fVUFSVDA9eQorQ09ORklHX0xFR0FDWV9QVFlfQ09VTlQ9NjQKKyMgQ09ORklHX0hXX1JBTkRPTSBpcyBub3Qgc2V0CitDT05GSUdfSTJDPXkKK0NPTkZJR19JMkNfQ0hBUkRFVj15CitDT05GSUdfSTJDX0JMQUNLRklOX1RXST15CitDT05GSUdfU1BJPXkKK0NPTkZJR19TUElfQkZJTj15CitDT05GSUdfU1BJX1NQSURFVj15CitDT05GSUdfR1BJT0xJQj15CitDT05GSUdfR1BJT19TWVNGUz15CitDT05GSUdfU0VOU09SU19MTTc1PXkKKyMgQ09ORklHX1VTQl9TVVBQT1JUIGlzIG5vdCBzZXQKK0NPTkZJR19NTUM9eQorQ09ORklHX01NQ19TUEk9eQorQ09ORklHX0RNQURFVklDRVM9eQorQ09ORklHX0VYVDJfRlM9eQorQ09ORklHX0VYVDJfRlNfWEFUVFI9eQorIyBDT05GSUdfRE5PVElGWSBpcyBub3Qgc2V0CitDT05GSUdfTVNET1NfRlM9eQorQ09ORklHX1ZGQVRfRlM9eQorQ09ORklHX0ZBVF9ERUZBVUxUX0NPREVQQUdFPTg1MAorQ09ORklHX0pGRlMyX0ZTPXkKK0NPTkZJR19DUkFNRlM9eQorQ09ORklHX1JPTUZTX0ZTPXkKK0NPTkZJR19ST01GU19CQUNLRURfQllfQk9USD15CisjIENPTkZJR19ORVRXT1JLX0ZJTEVTWVNURU1TIGlzIG5vdCBzZXQKK0NPTkZJR19OTFNfQ09ERVBBR0VfNDM3PXkKK0NPTkZJR19OTFNfQ09ERVBBR0VfODUwPXkKK0NPTkZJR19OTFNfSVNPODg1OV8xPXkKK0NPTkZJR19ERUJVR19LRVJORUw9eQorQ09ORklHX0RFQlVHX1NISVJRPXkKK0NPTkZJR19ERVRFQ1RfSFVOR19UQVNLPXkKK0NPTkZJR19ERUJVR19PQkpFQ1RTPXkKK0NPTkZJR19ERUJVR19MT0NLX0FMTE9DPXkKK0NPTkZJR19ERUJVR19LT0JKRUNUPXkKK0NPTkZJR19ERUJVR19JTkZPPXkKK0NPTkZJR19ERUJVR19WTT15CitDT05GSUdfREVCVUdfTUVNT1JZX0lOSVQ9eQorQ09ORklHX0RFQlVHX0xJU1Q9eQorIyBDT05GSUdfUkNVX0NQVV9TVEFMTF9ERVRFQ1RPUiBpcyBub3Qgc2V0CitDT05GSUdfU1lTQ1RMX1NZU0NBTExfQ0hFQ0s9eQorQ09ORklHX1BBR0VfUE9JU09OSU5HPXkKKyMgQ09ORklHX0ZUUkFDRSBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfRE9VQkxFRkFVTFQ9eQorQ09ORklHX0NQTEJfSU5GTz15CitDT05GSUdfQ1JDX0NDSVRUPXkKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vYmZpbl9kbWEuaCBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vYmZpbl9kbWEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTExMjA3Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9iZmluX2RtYS5oCkBAIC0wLDAgKzEsOTEgQEAKKy8qCisgKiBiZmluX2RtYS5oIC0gQmxhY2tmaW4gRE1BIGRlZmluZXMvc3RydWN0dXJlcy9ldGMuLi4KKyAqCisgKiBDb3B5cmlnaHQgMjAwNC0yMDEwIEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCisgKi8KKworI2lmbmRlZiBfX0FTTV9CRklOX0RNQV9IX18KKyNkZWZpbmUgX19BU01fQkZJTl9ETUFfSF9fCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisvKiBETUFfQ09ORklHIE1hc2tzICovCisjZGVmaW5lIERNQUVOCQkJMHgwMDAxCS8qIERNQSBDaGFubmVsIEVuYWJsZSAqLworI2RlZmluZSBXTlIJCQkJMHgwMDAyCS8qIENoYW5uZWwgRGlyZWN0aW9uIChXL1IqKSAqLworI2RlZmluZSBXRFNJWkVfOAkJMHgwMDAwCS8qIFRyYW5zZmVyIFdvcmQgU2l6ZSA9IDggKi8KKyNkZWZpbmUgV0RTSVpFXzE2CQkweDAwMDQJLyogVHJhbnNmZXIgV29yZCBTaXplID0gMTYgKi8KKyNkZWZpbmUgV0RTSVpFXzMyCQkweDAwMDgJLyogVHJhbnNmZXIgV29yZCBTaXplID0gMzIgKi8KKyNkZWZpbmUgRE1BMkQJCQkweDAwMTAJLyogRE1BIE1vZGUgKDJELzFEKikgKi8KKyNkZWZpbmUgUkVTVEFSVAkJCTB4MDAyMAkvKiBETUEgQnVmZmVyIENsZWFyICovCisjZGVmaW5lIERJX1NFTAkJCTB4MDA0MAkvKiBEYXRhIEludGVycnVwdCBUaW1pbmcgU2VsZWN0ICovCisjZGVmaW5lIERJX0VOCQkJMHgwMDgwCS8qIERhdGEgSW50ZXJydXB0IEVuYWJsZSAqLworI2RlZmluZSBORFNJWkVfMAkJMHgwMDAwCS8qIE5leHQgRGVzY3JpcHRvciBTaXplID0gMCAoU3RvcC9BdXRvYnVmZmVyKSAqLworI2RlZmluZSBORFNJWkVfMQkJMHgwMTAwCS8qIE5leHQgRGVzY3JpcHRvciBTaXplID0gMSAqLworI2RlZmluZSBORFNJWkVfMgkJMHgwMjAwCS8qIE5leHQgRGVzY3JpcHRvciBTaXplID0gMiAqLworI2RlZmluZSBORFNJWkVfMwkJMHgwMzAwCS8qIE5leHQgRGVzY3JpcHRvciBTaXplID0gMyAqLworI2RlZmluZSBORFNJWkVfNAkJMHgwNDAwCS8qIE5leHQgRGVzY3JpcHRvciBTaXplID0gNCAqLworI2RlZmluZSBORFNJWkVfNQkJMHgwNTAwCS8qIE5leHQgRGVzY3JpcHRvciBTaXplID0gNSAqLworI2RlZmluZSBORFNJWkVfNgkJMHgwNjAwCS8qIE5leHQgRGVzY3JpcHRvciBTaXplID0gNiAqLworI2RlZmluZSBORFNJWkVfNwkJMHgwNzAwCS8qIE5leHQgRGVzY3JpcHRvciBTaXplID0gNyAqLworI2RlZmluZSBORFNJWkVfOAkJMHgwODAwCS8qIE5leHQgRGVzY3JpcHRvciBTaXplID0gOCAqLworI2RlZmluZSBORFNJWkVfOQkJMHgwOTAwCS8qIE5leHQgRGVzY3JpcHRvciBTaXplID0gOSAqLworI2RlZmluZSBORFNJWkUJCQkweDBmMDAJLyogTmV4dCBEZXNjcmlwdG9yIFNpemUgKi8KKyNkZWZpbmUgRE1BRkxPVwkJCTB4NzAwMAkvKiBGbG93IENvbnRyb2wgKi8KKyNkZWZpbmUgRE1BRkxPV19TVE9QCTB4MDAwMAkvKiBTdG9wIE1vZGUgKi8KKyNkZWZpbmUgRE1BRkxPV19BVVRPCTB4MTAwMAkvKiBBdXRvYnVmZmVyIE1vZGUgKi8KKyNkZWZpbmUgRE1BRkxPV19BUlJBWQkweDQwMDAJLyogRGVzY3JpcHRvciBBcnJheSBNb2RlICovCisjZGVmaW5lIERNQUZMT1dfU01BTEwJMHg2MDAwCS8qIFNtYWxsIE1vZGVsIERlc2NyaXB0b3IgTGlzdCBNb2RlICovCisjZGVmaW5lIERNQUZMT1dfTEFSR0UJMHg3MDAwCS8qIExhcmdlIE1vZGVsIERlc2NyaXB0b3IgTGlzdCBNb2RlICovCisKKy8qIERNQV9JUlFfU1RBVFVTIE1hc2tzICovCisjZGVmaW5lIERNQV9ET05FCQkweDAwMDEJLyogRE1BIENvbXBsZXRpb24gSW50ZXJydXB0IFN0YXR1cyAqLworI2RlZmluZSBETUFfRVJSCQkJMHgwMDAyCS8qIERNQSBFcnJvciBJbnRlcnJ1cHQgU3RhdHVzICovCisjZGVmaW5lIERGRVRDSAkJCTB4MDAwNAkvKiBETUEgRGVzY3JpcHRvciBGZXRjaCBJbmRpY2F0b3IgKi8KKyNkZWZpbmUgRE1BX1JVTgkJCTB4MDAwOAkvKiBETUEgQ2hhbm5lbCBSdW5uaW5nIEluZGljYXRvciAqLworCisvKgorICogQWxsIEJsYWNrZmluIHN5c3RlbSBNTVJzIGFyZSBwYWRkZWQgdG8gMzJiaXRzIGV2ZW4gaWYgdGhlIHJlZ2lzdGVyCisgKiBpdHNlbGYgaXMgb25seSAxNmJpdHMuICBTbyB1c2UgYSBoZWxwZXIgbWFjcm8gdG8gc3RyZWFtbGluZSB0aGlzLgorICovCisjZGVmaW5lIF9fQkZQKG0pIHUxNiBtOyB1MTYgX19wYWRfIyNtCisKKy8qCisgKiBiZmluIGRtYSByZWdpc3RlcnMgbGF5b3V0CisgKi8KK3N0cnVjdCBiZmluX2RtYV9yZWdzIHsKKwl1MzIgbmV4dF9kZXNjX3B0cjsKKwl1MzIgc3RhcnRfYWRkcjsKKwlfX0JGUChjb25maWcpOworCXUzMiBfX3BhZDA7CisJX19CRlAoeF9jb3VudCk7CisJX19CRlAoeF9tb2RpZnkpOworCV9fQkZQKHlfY291bnQpOworCV9fQkZQKHlfbW9kaWZ5KTsKKwl1MzIgY3Vycl9kZXNjX3B0cjsKKwl1MzIgY3Vycl9hZGRyOworCV9fQkZQKGlycV9zdGF0dXMpOworCV9fQkZQKHBlcmlwaGVyYWxfbWFwKTsKKwlfX0JGUChjdXJyX3hfY291bnQpOworCXUzMiBfX3BhZDE7CisJX19CRlAoY3Vycl95X2NvdW50KTsKKwl1MzIgX19wYWQyOworfTsKKworLyoKKyAqIGJmaW4gaGFuZHNoYWtlIG1kbWEgcmVnaXN0ZXJzIGxheW91dAorICovCitzdHJ1Y3QgYmZpbl9obWRtYV9yZWdzIHsKKwlfX0JGUChjb250cm9sKTsKKwlfX0JGUChlY2luaXQpOworCV9fQkZQKGJjaW5pdCk7CisJX19CRlAoZWN1cmdlbnQpOworCV9fQkZQKGVjb3ZlcmZsb3cpOworCV9fQkZQKGVjb3VudCk7CisJX19CRlAoYmNvdW50KTsKK307CisKKyN1bmRlZiBfX0JGUAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vYmZpbl9zZXJpYWwuaCBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vYmZpbl9zZXJpYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZmY5ZjE0Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9iZmluX3NlcmlhbC5oCkBAIC0wLDAgKzEsMjc1IEBACisvKgorICogYmZpbl9zZXJpYWwuaCAtIEJsYWNrZmluIFVBUlQvU2VyaWFsIGRlZmluaXRpb25zCisgKgorICogQ29weXJpZ2h0IDIwMDYtMjAxMCBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgorICovCisKKyNpZm5kZWYgX19CRklOX0FTTV9TRVJJQUxfSF9fCisjZGVmaW5lIF9fQkZJTl9BU01fU0VSSUFMX0hfXworCisjaW5jbHVkZSA8bGludXgvc2VyaWFsX2NvcmUuaD4KKyNpbmNsdWRlIDxtYWNoL2Fub21hbHkuaD4KKyNpbmNsdWRlIDxtYWNoL2JmaW5fc2VyaWFsLmg+CisKKyNpZiBkZWZpbmVkKENPTkZJR19CRklOX1VBUlQwX0NUU1JUUykgfHwgXAorICAgIGRlZmluZWQoQ09ORklHX0JGSU5fVUFSVDFfQ1RTUlRTKSB8fCBcCisgICAgZGVmaW5lZChDT05GSUdfQkZJTl9VQVJUMl9DVFNSVFMpIHx8IFwKKyAgICBkZWZpbmVkKENPTkZJR19CRklOX1VBUlQzX0NUU1JUUykKKyMgaWZkZWYgQkZJTl9VQVJUX0JGNTRYX1NUWUxFCisjICBkZWZpbmUgQ09ORklHX1NFUklBTF9CRklOX0hBUkRfQ1RTUlRTCisjIGVsc2UKKyMgIGRlZmluZSBDT05GSUdfU0VSSUFMX0JGSU5fQ1RTUlRTCisjIGVuZGlmCisjZW5kaWYKKworc3RydWN0IGNpcmNfYnVmOworc3RydWN0IHRpbWVyX2xpc3Q7CitzdHJ1Y3Qgd29ya19zdHJ1Y3Q7CisKK3N0cnVjdCBiZmluX3NlcmlhbF9wb3J0IHsKKwlzdHJ1Y3QgdWFydF9wb3J0IHBvcnQ7CisJdW5zaWduZWQgaW50IG9sZF9zdGF0dXM7CisJaW50IHN0YXR1c19pcnE7CisjaWZuZGVmIEJGSU5fVUFSVF9CRjU0WF9TVFlMRQorCXVuc2lnbmVkIGludCBsc3I7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfU0VSSUFMX0JGSU5fRE1BCisJaW50IHR4X2RvbmU7CisJaW50IHR4X2NvdW50OworCXN0cnVjdCBjaXJjX2J1ZiByeF9kbWFfYnVmOworCXN0cnVjdCB0aW1lcl9saXN0IHJ4X2RtYV90aW1lcjsKKwlpbnQgcnhfZG1hX25yb3dzOworCXVuc2lnbmVkIGludCB0eF9kbWFfY2hhbm5lbDsKKwl1bnNpZ25lZCBpbnQgcnhfZG1hX2NoYW5uZWw7CisJc3RydWN0IHdvcmtfc3RydWN0IHR4X2RtYV93b3JrcXVldWU7CisjZWxpZiBBTk9NQUxZXzA1MDAwMzYzCisJdW5zaWduZWQgaW50IGFub21hbHlfdGhyZXNob2xkOworI2VuZGlmCisjaWZkZWYgQ09ORklHX1NFUklBTF9CRklOX0hBUkRfQ1RTUlRTCisJaW50IHNjdHM7CisjZW5kaWYKKyNpZiBkZWZpbmVkKENPTkZJR19TRVJJQUxfQkZJTl9DVFNSVFMpIHx8IFwKKwlkZWZpbmVkKENPTkZJR19TRVJJQUxfQkZJTl9IQVJEX0NUU1JUUykKKwlpbnQgY3RzX3BpbjsKKwlpbnQgcnRzX3BpbjsKKyNlbmRpZgorfTsKKworLyogVUFSVF9MQ1IgTWFza3MgKi8KKyNkZWZpbmUgV0xTKHgpICAgICAgICAgICAgICAgICAgICgoKHgpLTUpICYgMHgwMykgIC8qIFdvcmQgTGVuZ3RoIFNlbGVjdCAqLworI2RlZmluZSBTVEIgICAgICAgICAgICAgICAgICAgICAgMHgwNCAgLyogU3RvcCBCaXRzICovCisjZGVmaW5lIFBFTiAgICAgICAgICAgICAgICAgICAgICAweDA4ICAvKiBQYXJpdHkgRW5hYmxlICovCisjZGVmaW5lIEVQUyAgICAgICAgICAgICAgICAgICAgICAweDEwICAvKiBFdmVuIFBhcml0eSBTZWxlY3QgKi8KKyNkZWZpbmUgU1RQICAgICAgICAgICAgICAgICAgICAgIDB4MjAgIC8qIFN0aWNrIFBhcml0eSAqLworI2RlZmluZSBTQiAgICAgICAgICAgICAgICAgICAgICAgMHg0MCAgLyogU2V0IEJyZWFrICovCisjZGVmaW5lIERMQUIgICAgICAgICAgICAgICAgICAgICAweDgwICAvKiBEaXZpc29yIExhdGNoIEFjY2VzcyAqLworCisvKiBVQVJUX0xTUiBNYXNrcyAqLworI2RlZmluZSBEUiAgICAgICAgICAgICAgICAgICAgICAgMHgwMSAgLyogRGF0YSBSZWFkeSAqLworI2RlZmluZSBPRSAgICAgICAgICAgICAgICAgICAgICAgMHgwMiAgLyogT3ZlcnJ1biBFcnJvciAqLworI2RlZmluZSBQRSAgICAgICAgICAgICAgICAgICAgICAgMHgwNCAgLyogUGFyaXR5IEVycm9yICovCisjZGVmaW5lIEZFICAgICAgICAgICAgICAgICAgICAgICAweDA4ICAvKiBGcmFtaW5nIEVycm9yICovCisjZGVmaW5lIEJJICAgICAgICAgICAgICAgICAgICAgICAweDEwICAvKiBCcmVhayBJbnRlcnJ1cHQgKi8KKyNkZWZpbmUgVEhSRSAgICAgICAgICAgICAgICAgICAgIDB4MjAgIC8qIFRIUiBFbXB0eSAqLworI2RlZmluZSBURU1UICAgICAgICAgICAgICAgICAgICAgMHg0MCAgLyogVFNSIGFuZCBVQVJUX1RIUiBFbXB0eSAqLworI2RlZmluZSBURkkgICAgICAgICAgICAgICAgICAgICAgMHg4MCAgLyogVHJhbnNtaXNzaW9uIEZpbmlzaGVkIEluZGljYXRvciAqLworCisvKiBVQVJUX0lFUiBNYXNrcyAqLworI2RlZmluZSBFUkJGSSAgICAgICAgICAgICAgICAgICAgMHgwMSAgLyogRW5hYmxlIFJlY2VpdmUgQnVmZmVyIEZ1bGwgSW50ZXJydXB0ICovCisjZGVmaW5lIEVUQkVJICAgICAgICAgICAgICAgICAgICAweDAyICAvKiBFbmFibGUgVHJhbnNtaXQgQnVmZmVyIEVtcHR5IEludGVycnVwdCAqLworI2RlZmluZSBFTFNJICAgICAgICAgICAgICAgICAgICAgMHgwNCAgLyogRW5hYmxlIFJYIFN0YXR1cyBJbnRlcnJ1cHQgKi8KKyNkZWZpbmUgRURTU0kgICAgICAgICAgICAgICAgICAgIDB4MDggIC8qIEVuYWJsZSBNb2RlbSBTdGF0dXMgSW50ZXJydXB0ICovCisjZGVmaW5lIEVEVFBUSSAgICAgICAgICAgICAgICAgICAweDEwICAvKiBFbmFibGUgRE1BIFRyYW5zbWl0IFBJUlEgSW50ZXJydXB0ICovCisjZGVmaW5lIEVURkkgICAgICAgICAgICAgICAgICAgICAweDIwICAvKiBFbmFibGUgVHJhbnNtaXNzaW9uIEZpbmlzaGVkIEludGVycnVwdCAqLworI2RlZmluZSBFUkZDSSAgICAgICAgICAgICAgICAgICAgMHg0MCAgLyogRW5hYmxlIFJlY2VpdmUgRklGTyBDb3VudCBJbnRlcnJ1cHQgKi8KKworLyogVUFSVF9NQ1IgTWFza3MgKi8KKyNkZWZpbmUgWE9GRiAgICAgICAgICAgICAgICAgICAgIDB4MDEgIC8qIFRyYW5zbWl0dGVyIE9mZiAqLworI2RlZmluZSBNUlRTICAgICAgICAgICAgICAgICAgICAgMHgwMiAgLyogTWFudWFsIFJlcXVlc3QgVG8gU2VuZCAqLworI2RlZmluZSBSRklUICAgICAgICAgICAgICAgICAgICAgMHgwNCAgLyogUmVjZWl2ZSBGSUZPIElSUSBUaHJlc2hvbGQgKi8KKyNkZWZpbmUgUkZSVCAgICAgICAgICAgICAgICAgICAgIDB4MDggIC8qIFJlY2VpdmUgRklGTyBSVFMgVGhyZXNob2xkICovCisjZGVmaW5lIExPT1BfRU5BICAgICAgICAgICAgICAgICAweDEwICAvKiBMb29wYmFjayBNb2RlIEVuYWJsZSAqLworI2RlZmluZSBGQ1BPTCAgICAgICAgICAgICAgICAgICAgMHgyMCAgLyogRmxvdyBDb250cm9sIFBpbiBQb2xhcml0eSAqLworI2RlZmluZSBBUlRTICAgICAgICAgICAgICAgICAgICAgMHg0MCAgLyogQXV0b21hdGljIFJlcXVlc3QgVG8gU2VuZCAqLworI2RlZmluZSBBQ1RTICAgICAgICAgICAgICAgICAgICAgMHg4MCAgLyogQXV0b21hdGljIENsZWFyIFRvIFNlbmQgKi8KKworLyogVUFSVF9NU1IgTWFza3MgKi8KKyNkZWZpbmUgU0NUUyAgICAgICAgICAgICAgICAgICAgIDB4MDEgIC8qIFN0aWNreSBDVFMgKi8KKyNkZWZpbmUgQ1RTICAgICAgICAgICAgICAgICAgICAgIDB4MTAgIC8qIENsZWFyIFRvIFNlbmQgKi8KKyNkZWZpbmUgUkZDUyAgICAgICAgICAgICAgICAgICAgIDB4MjAgIC8qIFJlY2VpdmUgRklGTyBDb3VudCBTdGF0dXMgKi8KKworLyogVUFSVF9HQ1RMIE1hc2tzICovCisjZGVmaW5lIFVDRU4gICAgICAgICAgICAgICAgICAgICAweDAxICAvKiBFbmFibGUgVUFSVHggQ2xvY2tzICovCisjZGVmaW5lIElSRU4gICAgICAgICAgICAgICAgICAgICAweDAyICAvKiBFbmFibGUgSXJEQSBNb2RlICovCisjZGVmaW5lIFRQT0xDICAgICAgICAgICAgICAgICAgICAweDA0ICAvKiBJckRBIFRYIFBvbGFyaXR5IENoYW5nZSAqLworI2RlZmluZSBSUE9MQyAgICAgICAgICAgICAgICAgICAgMHgwOCAgLyogSXJEQSBSWCBQb2xhcml0eSBDaGFuZ2UgKi8KKyNkZWZpbmUgRlBFICAgICAgICAgICAgICAgICAgICAgIDB4MTAgIC8qIEZvcmNlIFBhcml0eSBFcnJvciBPbiBUcmFuc21pdCAqLworI2RlZmluZSBGRkUgICAgICAgICAgICAgICAgICAgICAgMHgyMCAgLyogRm9yY2UgRnJhbWluZyBFcnJvciBPbiBUcmFuc21pdCAqLworCisjaWZkZWYgQkZJTl9VQVJUX0JGNTRYX1NUWUxFCisjIGRlZmluZSBPRkZTRVRfRExMICAgICAgICAgICAgICAweDAwICAvKiBEaXZpc29yIExhdGNoIChMb3ctQnl0ZSkgICAgICAgICovCisjIGRlZmluZSBPRkZTRVRfRExIICAgICAgICAgICAgICAweDA0ICAvKiBEaXZpc29yIExhdGNoIChIaWdoLUJ5dGUpICAgICAgICovCisjIGRlZmluZSBPRkZTRVRfR0NUTCAgICAgICAgICAgICAweDA4ICAvKiBHbG9iYWwgQ29udHJvbCBSZWdpc3RlciAgICAgICAgICovCisjIGRlZmluZSBPRkZTRVRfTENSICAgICAgICAgICAgICAweDBDICAvKiBMaW5lIENvbnRyb2wgUmVnaXN0ZXIgICAgICAgICAgICovCisjIGRlZmluZSBPRkZTRVRfTUNSICAgICAgICAgICAgICAweDEwICAvKiBNb2RlbSBDb250cm9sIFJlZ2lzdGVyICAgICAgICAgICovCisjIGRlZmluZSBPRkZTRVRfTFNSICAgICAgICAgICAgICAweDE0ICAvKiBMaW5lIFN0YXR1cyBSZWdpc3RlciAgICAgICAgICAgICovCisjIGRlZmluZSBPRkZTRVRfTVNSICAgICAgICAgICAgICAweDE4ICAvKiBNb2RlbSBTdGF0dXMgUmVnaXN0ZXIgICAgICAgICAgICovCisjIGRlZmluZSBPRkZTRVRfU0NSICAgICAgICAgICAgICAweDFDICAvKiBTQ1IgU2NyYXRjaCBSZWdpc3RlciAgICAgICAgICAgICovCisjIGRlZmluZSBPRkZTRVRfSUVSX1NFVCAgICAgICAgICAweDIwICAvKiBTZXQgSW50ZXJydXB0IEVuYWJsZSBSZWdpc3RlciAgICovCisjIGRlZmluZSBPRkZTRVRfSUVSX0NMRUFSICAgICAgICAweDI0ICAvKiBDbGVhciBJbnRlcnJ1cHQgRW5hYmxlIFJlZ2lzdGVyICovCisjIGRlZmluZSBPRkZTRVRfVEhSICAgICAgICAgICAgICAweDI4ICAvKiBUcmFuc21pdCBIb2xkaW5nIHJlZ2lzdGVyICAgICAgICovCisjIGRlZmluZSBPRkZTRVRfUkJSICAgICAgICAgICAgICAweDJDICAvKiBSZWNlaXZlIEJ1ZmZlciByZWdpc3RlciAgICAgICAgICovCisjZWxzZSAvKiBCRjUzMyBzdHlsZSAqLworIyBkZWZpbmUgT0ZGU0VUX1RIUiAgICAgICAgICAgICAgMHgwMCAgLyogVHJhbnNtaXQgSG9sZGluZyByZWdpc3RlciAgICAgICAgICovCisjIGRlZmluZSBPRkZTRVRfUkJSICAgICAgICAgICAgICAweDAwICAvKiBSZWNlaXZlIEJ1ZmZlciByZWdpc3RlciAgICAgICAgICAgKi8KKyMgZGVmaW5lIE9GRlNFVF9ETEwgICAgICAgICAgICAgIDB4MDAgIC8qIERpdmlzb3IgTGF0Y2ggKExvdy1CeXRlKSAgICAgICAgICAqLworIyBkZWZpbmUgT0ZGU0VUX0RMSCAgICAgICAgICAgICAgMHgwNCAgLyogRGl2aXNvciBMYXRjaCAoSGlnaC1CeXRlKSAgICAgICAgICovCisjIGRlZmluZSBPRkZTRVRfSUVSICAgICAgICAgICAgICAweDA0ICAvKiBJbnRlcnJ1cHQgRW5hYmxlIFJlZ2lzdGVyICAgICAgICAgKi8KKyMgZGVmaW5lIE9GRlNFVF9JSVIgICAgICAgICAgICAgIDB4MDggIC8qIEludGVycnVwdCBJZGVudGlmaWNhdGlvbiBSZWdpc3RlciAqLworIyBkZWZpbmUgT0ZGU0VUX0xDUiAgICAgICAgICAgICAgMHgwQyAgLyogTGluZSBDb250cm9sIFJlZ2lzdGVyICAgICAgICAgICAgICovCisjIGRlZmluZSBPRkZTRVRfTUNSICAgICAgICAgICAgICAweDEwICAvKiBNb2RlbSBDb250cm9sIFJlZ2lzdGVyICAgICAgICAgICAgKi8KKyMgZGVmaW5lIE9GRlNFVF9MU1IgICAgICAgICAgICAgIDB4MTQgIC8qIExpbmUgU3RhdHVzIFJlZ2lzdGVyICAgICAgICAgICAgICAqLworIyBkZWZpbmUgT0ZGU0VUX01TUiAgICAgICAgICAgICAgMHgxOCAgLyogTW9kZW0gU3RhdHVzIFJlZ2lzdGVyICAgICAgICAgICAgICovCisjIGRlZmluZSBPRkZTRVRfU0NSICAgICAgICAgICAgICAweDFDICAvKiBTQ1IgU2NyYXRjaCBSZWdpc3RlciAgICAgICAgICAgICAgKi8KKyMgZGVmaW5lIE9GRlNFVF9HQ1RMICAgICAgICAgICAgIDB4MjQgIC8qIEdsb2JhbCBDb250cm9sIFJlZ2lzdGVyICAgICAgICAgICAqLworLyogY29kZSBzaG91bGQgbm90IG5lZWQgSUlSLCBzbyBmb3JjZSBidWlsZCBlcnJvciBpZiB0aGV5IHVzZSBpdCAqLworIyB1bmRlZiBPRkZTRVRfSUlSCisjZW5kaWYKKworLyoKKyAqIEFsbCBCbGFja2ZpbiBzeXN0ZW0gTU1ScyBhcmUgcGFkZGVkIHRvIDMyYml0cyBldmVuIGlmIHRoZSByZWdpc3RlcgorICogaXRzZWxmIGlzIG9ubHkgMTZiaXRzLiAgU28gdXNlIGEgaGVscGVyIG1hY3JvIHRvIHN0cmVhbWxpbmUgdGhpcy4KKyAqLworI2RlZmluZSBfX0JGUChtKSB1MTYgbTsgdTE2IF9fcGFkXyMjbQorc3RydWN0IGJmaW5fdWFydF9yZWdzIHsKKyNpZmRlZiBCRklOX1VBUlRfQkY1NFhfU1RZTEUKKwlfX0JGUChkbGwpOworCV9fQkZQKGRsaCk7CisJX19CRlAoZ2N0bCk7CisJX19CRlAobGNyKTsKKwlfX0JGUChtY3IpOworCV9fQkZQKGxzcik7CisJX19CRlAobXNyKTsKKwlfX0JGUChzY3IpOworCV9fQkZQKGllcl9zZXQpOworCV9fQkZQKGllcl9jbGVhcik7CisJX19CRlAodGhyKTsKKwlfX0JGUChyYnIpOworI2Vsc2UKKwl1bmlvbiB7CisJCXUxNiBkbGw7CisJCXUxNiB0aHI7CisJCWNvbnN0IHUxNiByYnI7CisJfTsKKwljb25zdCB1MTYgX19wYWQwOworCXVuaW9uIHsKKwkJdTE2IGRsaDsKKwkJdTE2IGllcjsKKwl9OworCWNvbnN0IHUxNiBfX3BhZDE7CisJY29uc3QgX19CRlAoaWlyKTsKKwlfX0JGUChsY3IpOworCV9fQkZQKG1jcik7CisJX19CRlAobHNyKTsKKwlfX0JGUChtc3IpOworCV9fQkZQKHNjcik7CisJY29uc3QgdTMyIF9fcGFkMjsKKwlfX0JGUChnY3RsKTsKKyNlbmRpZgorfTsKKyN1bmRlZiBfX0JGUAorCisjaWZuZGVmIHBvcnRfbWVtYmFzZQorIyBkZWZpbmUgcG9ydF9tZW1iYXNlKHApICgoKHN0cnVjdCBiZmluX3NlcmlhbF9wb3J0ICopKHApKS0+cG9ydC5tZW1iYXNlKQorI2VuZGlmCisKKyNkZWZpbmUgVUFSVF9HRVRfQ0hBUihwKSAgICAgIGJmaW5fcmVhZDE2KHBvcnRfbWVtYmFzZShwKSArIE9GRlNFVF9SQlIpCisjZGVmaW5lIFVBUlRfR0VUX0RMTChwKSAgICAgICBiZmluX3JlYWQxNihwb3J0X21lbWJhc2UocCkgKyBPRkZTRVRfRExMKQorI2RlZmluZSBVQVJUX0dFVF9ETEgocCkgICAgICAgYmZpbl9yZWFkMTYocG9ydF9tZW1iYXNlKHApICsgT0ZGU0VUX0RMSCkKKyNkZWZpbmUgVUFSVF9HRVRfR0NUTChwKSAgICAgIGJmaW5fcmVhZDE2KHBvcnRfbWVtYmFzZShwKSArIE9GRlNFVF9HQ1RMKQorI2RlZmluZSBVQVJUX0dFVF9MQ1IocCkgICAgICAgYmZpbl9yZWFkMTYocG9ydF9tZW1iYXNlKHApICsgT0ZGU0VUX0xDUikKKyNkZWZpbmUgVUFSVF9HRVRfTUNSKHApICAgICAgIGJmaW5fcmVhZDE2KHBvcnRfbWVtYmFzZShwKSArIE9GRlNFVF9NQ1IpCisjZGVmaW5lIFVBUlRfR0VUX01TUihwKSAgICAgICBiZmluX3JlYWQxNihwb3J0X21lbWJhc2UocCkgKyBPRkZTRVRfTVNSKQorCisjZGVmaW5lIFVBUlRfUFVUX0NIQVIocCwgdikgICBiZmluX3dyaXRlMTYocG9ydF9tZW1iYXNlKHApICsgT0ZGU0VUX1RIUiwgdikKKyNkZWZpbmUgVUFSVF9QVVRfRExMKHAsIHYpICAgIGJmaW5fd3JpdGUxNihwb3J0X21lbWJhc2UocCkgKyBPRkZTRVRfRExMLCB2KQorI2RlZmluZSBVQVJUX1BVVF9ETEgocCwgdikgICAgYmZpbl93cml0ZTE2KHBvcnRfbWVtYmFzZShwKSArIE9GRlNFVF9ETEgsIHYpCisjZGVmaW5lIFVBUlRfUFVUX0dDVEwocCwgdikgICBiZmluX3dyaXRlMTYocG9ydF9tZW1iYXNlKHApICsgT0ZGU0VUX0dDVEwsIHYpCisjZGVmaW5lIFVBUlRfUFVUX0xDUihwLCB2KSAgICBiZmluX3dyaXRlMTYocG9ydF9tZW1iYXNlKHApICsgT0ZGU0VUX0xDUiwgdikKKyNkZWZpbmUgVUFSVF9QVVRfTUNSKHAsIHYpICAgIGJmaW5fd3JpdGUxNihwb3J0X21lbWJhc2UocCkgKyBPRkZTRVRfTUNSLCB2KQorCisjaWZkZWYgQkZJTl9VQVJUX0JGNTRYX1NUWUxFCisKKyNkZWZpbmUgVUFSVF9DTEVBUl9JRVIocCwgdikgIGJmaW5fd3JpdGUxNihwb3J0X21lbWJhc2UocCkgKyBPRkZTRVRfSUVSX0NMRUFSLCB2KQorI2RlZmluZSBVQVJUX0dFVF9JRVIocCkgICAgICAgYmZpbl9yZWFkMTYocG9ydF9tZW1iYXNlKHApICsgT0ZGU0VUX0lFUl9TRVQpCisjZGVmaW5lIFVBUlRfU0VUX0lFUihwLCB2KSAgICBiZmluX3dyaXRlMTYocG9ydF9tZW1iYXNlKHApICsgT0ZGU0VUX0lFUl9TRVQsIHYpCisKKyNkZWZpbmUgVUFSVF9DTEVBUl9ETEFCKHApICAgIC8qIE1NUnMgbm90IG11eGVkIG9uIEJGNTR4ICovCisjZGVmaW5lIFVBUlRfU0VUX0RMQUIocCkgICAgICAvKiBNTVJzIG5vdCBtdXhlZCBvbiBCRjU0eCAqLworCisjZGVmaW5lIFVBUlRfQ0xFQVJfTFNSKHApICAgICBiZmluX3dyaXRlMTYocG9ydF9tZW1iYXNlKHApICsgT0ZGU0VUX0xTUiwgLTEpCisjZGVmaW5lIFVBUlRfR0VUX0xTUihwKSAgICAgICBiZmluX3JlYWQxNihwb3J0X21lbWJhc2UocCkgKyBPRkZTRVRfTFNSKQorI2RlZmluZSBVQVJUX1BVVF9MU1IocCwgdikgICAgYmZpbl93cml0ZTE2KHBvcnRfbWVtYmFzZShwKSArIE9GRlNFVF9MU1IsIHYpCisKKy8qIFRoaXMgaGFuZGxlcyBoYXJkIENUUy9SVFMgKi8KKyNkZWZpbmUgQkZJTl9VQVJUX0NUU1JUU19IQVJECisjZGVmaW5lIFVBUlRfQ0xFQVJfU0NUUyhwKSAgICAgIGJmaW5fd3JpdGUxNigocG9ydF9tZW1iYXNlKHApICsgT0ZGU0VUX01TUiksIFNDVFMpCisjZGVmaW5lIFVBUlRfR0VUX0NUUyh4KSAgICAgICAgIChVQVJUX0dFVF9NU1IoeCkgJiBDVFMpCisjZGVmaW5lIFVBUlRfRElTQUJMRV9SVFMoeCkgICAgIFVBUlRfUFVUX01DUih4LCBVQVJUX0dFVF9NQ1IoeCkgJiB+KEFSVFMgfCBNUlRTKSkKKyNkZWZpbmUgVUFSVF9FTkFCTEVfUlRTKHgpICAgICAgVUFSVF9QVVRfTUNSKHgsIFVBUlRfR0VUX01DUih4KSB8IE1SVFMgfCBBUlRTKQorI2RlZmluZSBVQVJUX0VOQUJMRV9JTlRTKHgsIHYpICBVQVJUX1NFVF9JRVIoeCwgdikKKyNkZWZpbmUgVUFSVF9ESVNBQkxFX0lOVFMoeCkgICAgVUFSVF9DTEVBUl9JRVIoeCwgMHhGKQorCisjZWxzZSAvKiBCRjUzMyBzdHlsZSAqLworCisjZGVmaW5lIFVBUlRfQ0xFQVJfSUVSKHAsIHYpICBVQVJUX1BVVF9JRVIocCwgVUFSVF9HRVRfSUVSKHApICYgfih2KSkKKyNkZWZpbmUgVUFSVF9HRVRfSUVSKHApICAgICAgIGJmaW5fcmVhZDE2KHBvcnRfbWVtYmFzZShwKSArIE9GRlNFVF9JRVIpCisjZGVmaW5lIFVBUlRfUFVUX0lFUihwLCB2KSAgICBiZmluX3dyaXRlMTYocG9ydF9tZW1iYXNlKHApICsgT0ZGU0VUX0lFUiwgdikKKyNkZWZpbmUgVUFSVF9TRVRfSUVSKHAsIHYpICAgIFVBUlRfUFVUX0lFUihwLCBVQVJUX0dFVF9JRVIocCkgfCAodikpCisKKyNkZWZpbmUgVUFSVF9DTEVBUl9ETEFCKHApICAgIGRvIHsgVUFSVF9QVVRfTENSKHAsIFVBUlRfR0VUX0xDUihwKSAmIH5ETEFCKTsgU1NZTkMoKTsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgVUFSVF9TRVRfRExBQihwKSAgICAgIGRvIHsgVUFSVF9QVVRfTENSKHAsIFVBUlRfR0VUX0xDUihwKSB8IERMQUIpOyBTU1lOQygpOyB9IHdoaWxlICgwKQorCisjaWZuZGVmIHB1dF9sc3JfY2FjaGUKKyMgZGVmaW5lIHB1dF9sc3JfY2FjaGUocCwgdikgKCgoc3RydWN0IGJmaW5fc2VyaWFsX3BvcnQgKikocCkpLT5sc3IgPSAodikpCisjZW5kaWYKKyNpZm5kZWYgZ2V0X2xzcl9jYWNoZQorIyBkZWZpbmUgZ2V0X2xzcl9jYWNoZShwKSAgICAoKChzdHJ1Y3QgYmZpbl9zZXJpYWxfcG9ydCAqKShwKSktPmxzcikKKyNlbmRpZgorCisvKiBUaGUgaGFyZHdhcmUgY2xlYXJzIHRoZSBMU1IgYml0cyB1cG9uIHJlYWQsIHNvIHdlIG5lZWQgdG8gY2FjaGUKKyAqIHNvbWUgb2YgdGhlIG1vcmUgZnVuIGJpdHMgaW4gc29mdHdhcmUgc28gdGhleSBkb24ndCBnZXQgbG9zdAorICogd2hlbiBjaGVja2luZyB0aGUgTFNSIGluIG90aGVyIGNvZGUgcGF0aHMgKFRYKS4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIFVBUlRfQ0xFQVJfTFNSKHZvaWQgKnApCit7CisJcHV0X2xzcl9jYWNoZShwLCAwKTsKKwliZmluX3dyaXRlMTYocG9ydF9tZW1iYXNlKHApICsgT0ZGU0VUX0xTUiwgLTEpOworfQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgVUFSVF9HRVRfTFNSKHZvaWQgKnApCit7CisJdW5zaWduZWQgaW50IGxzciA9IGJmaW5fcmVhZDE2KHBvcnRfbWVtYmFzZShwKSArIE9GRlNFVF9MU1IpOworCXB1dF9sc3JfY2FjaGUocCwgZ2V0X2xzcl9jYWNoZShwKSB8IChsc3IgJiAoQkl8RkV8UEV8T0UpKSk7CisJcmV0dXJuIGxzciB8IGdldF9sc3JfY2FjaGUocCk7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgVUFSVF9QVVRfTFNSKHZvaWQgKnAsIHVpbnQxNl90IHZhbCkKK3sKKwlwdXRfbHNyX2NhY2hlKHAsIGdldF9sc3JfY2FjaGUocCkgJiB+dmFsKTsKK30KKworLyogVGhpcyBoYW5kbGVzIHNvZnQgQ1RTL1JUUyAqLworI2RlZmluZSBVQVJUX0dFVF9DVFMoeCkgICAgICAgIGdwaW9fZ2V0X3ZhbHVlKCh4KS0+Y3RzX3BpbikKKyNkZWZpbmUgVUFSVF9ESVNBQkxFX1JUUyh4KSAgICBncGlvX3NldF92YWx1ZSgoeCktPnJ0c19waW4sIDEpCisjZGVmaW5lIFVBUlRfRU5BQkxFX1JUUyh4KSAgICAgZ3Bpb19zZXRfdmFsdWUoKHgpLT5ydHNfcGluLCAwKQorI2RlZmluZSBVQVJUX0VOQUJMRV9JTlRTKHgsIHYpIFVBUlRfUFVUX0lFUih4LCB2KQorI2RlZmluZSBVQVJUX0RJU0FCTEVfSU5UUyh4KSAgIFVBUlRfUFVUX0lFUih4LCAwKQorCisjZW5kaWYKKworI2lmbmRlZiBCRklOX1VBUlRfVFhfRklGT19TSVpFCisjIGRlZmluZSBCRklOX1VBUlRfVFhfRklGT19TSVpFIDIKKyNlbmRpZgorCisjZW5kaWYgLyogX19CRklOX0FTTV9TRVJJQUxfSF9fICovCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2JpdG9wcy5oIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9iaXRvcHMuaAppbmRleCAzZjdlZjRkLi4yOWY0ZmQ4IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2JpdG9wcy5oCisrKyBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vYml0b3BzLmgKQEAgLTEwOCw3ICsxMDgsOSBAQAogI2RlZmluZSBzbXBfbWJfX2JlZm9yZV9jbGVhcl9iaXQoKQliYXJyaWVyKCkKICNkZWZpbmUgc21wX21iX19hZnRlcl9jbGVhcl9iaXQoKQliYXJyaWVyKCkKIAorI2RlZmluZSB0ZXN0X2JpdCBfX3NraXBfdGVzdF9iaXQKICNpbmNsdWRlIDxhc20tZ2VuZXJpYy9iaXRvcHMvbm9uLWF0b21pYy5oPgorI3VuZGVmIHRlc3RfYml0CiAKICNlbmRpZiAvKiBDT05GSUdfU01QICovCiAKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vY2FjaGUuaCBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vY2FjaGUuaAppbmRleCBiZDA2NDFhLi41Njg4ODVhIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2NhY2hlLmgKKysrIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9jYWNoZS5oCkBAIC03LDYgKzcsOCBAQAogI2lmbmRlZiBfX0FSQ0hfQkxBQ0tGSU5fQ0FDSEVfSAogI2RlZmluZSBfX0FSQ0hfQkxBQ0tGSU5fQ0FDSEVfSAogCisjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgkvKiBmb3IgYXNtbGlua2FnZSAqLworCiAvKgogICogQnl0ZXMgcGVyIEwxIGNhY2hlIGxpbmUKICAqIEJsYWNrZmluIGxvYWRzIDMyIGJ5dGVzIGZvciBjYWNoZQpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9jYWNoZWZsdXNoLmggYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2NhY2hlZmx1c2guaAppbmRleCAyNjY2ZmY4Li43NzEzNWI2IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2NhY2hlZmx1c2guaAorKysgYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2NhY2hlZmx1c2guaApAQCAtMTEsNiArMTEsOSBAQAogCiAjaW5jbHVkZSA8YXNtL2JsYWNrZmluLmg+CS8qIGZvciBTU1lOQygpICovCiAjaW5jbHVkZSA8YXNtL3NlY3Rpb25zLmg+CS8qIGZvciBfcmFtZW5kICovCisjaWZkZWYgQ09ORklHX1NNUAorI2luY2x1ZGUgPGFzbS9zbXAuaD4KKyNlbmRpZgogCiBleHRlcm4gdm9pZCBibGFja2Zpbl9pY2FjaGVfZmx1c2hfcmFuZ2UodW5zaWduZWQgbG9uZyBzdGFydF9hZGRyZXNzLCB1bnNpZ25lZCBsb25nIGVuZF9hZGRyZXNzKTsKIGV4dGVybiB2b2lkIGJsYWNrZmluX2RjYWNoZV9mbHVzaF9yYW5nZSh1bnNpZ25lZCBsb25nIHN0YXJ0X2FkZHJlc3MsIHVuc2lnbmVkIGxvbmcgZW5kX2FkZHJlc3MpOwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9kbWEuaCBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vZG1hLmgKaW5kZXggZWVkZjNjYS4uZDlkYmMxYSAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9kbWEuaAorKysgYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2RtYS5oCkBAIC0xNCw0MCArMTQsNyBAQAogI2luY2x1ZGUgPGFzbS9ibGFja2Zpbi5oPgogI2luY2x1ZGUgPGFzbS9wYWdlLmg+CiAjaW5jbHVkZSA8YXNtLWdlbmVyaWMvZG1hLmg+Ci0KLS8qIERNQV9DT05GSUcgTWFza3MgKi8KLSNkZWZpbmUgRE1BRU4JCQkweDAwMDEJLyogRE1BIENoYW5uZWwgRW5hYmxlICovCi0jZGVmaW5lIFdOUgkJCQkweDAwMDIJLyogQ2hhbm5lbCBEaXJlY3Rpb24gKFcvUiopICovCi0jZGVmaW5lIFdEU0laRV84CQkweDAwMDAJLyogVHJhbnNmZXIgV29yZCBTaXplID0gOCAqLwotI2RlZmluZSBXRFNJWkVfMTYJCTB4MDAwNAkvKiBUcmFuc2ZlciBXb3JkIFNpemUgPSAxNiAqLwotI2RlZmluZSBXRFNJWkVfMzIJCTB4MDAwOAkvKiBUcmFuc2ZlciBXb3JkIFNpemUgPSAzMiAqLwotI2RlZmluZSBETUEyRAkJCTB4MDAxMAkvKiBETUEgTW9kZSAoMkQvMUQqKSAqLwotI2RlZmluZSBSRVNUQVJUCQkJMHgwMDIwCS8qIERNQSBCdWZmZXIgQ2xlYXIgKi8KLSNkZWZpbmUgRElfU0VMCQkJMHgwMDQwCS8qIERhdGEgSW50ZXJydXB0IFRpbWluZyBTZWxlY3QgKi8KLSNkZWZpbmUgRElfRU4JCQkweDAwODAJLyogRGF0YSBJbnRlcnJ1cHQgRW5hYmxlICovCi0jZGVmaW5lIE5EU0laRV8wCQkweDAwMDAJLyogTmV4dCBEZXNjcmlwdG9yIFNpemUgPSAwIChTdG9wL0F1dG9idWZmZXIpICovCi0jZGVmaW5lIE5EU0laRV8xCQkweDAxMDAJLyogTmV4dCBEZXNjcmlwdG9yIFNpemUgPSAxICovCi0jZGVmaW5lIE5EU0laRV8yCQkweDAyMDAJLyogTmV4dCBEZXNjcmlwdG9yIFNpemUgPSAyICovCi0jZGVmaW5lIE5EU0laRV8zCQkweDAzMDAJLyogTmV4dCBEZXNjcmlwdG9yIFNpemUgPSAzICovCi0jZGVmaW5lIE5EU0laRV80CQkweDA0MDAJLyogTmV4dCBEZXNjcmlwdG9yIFNpemUgPSA0ICovCi0jZGVmaW5lIE5EU0laRV81CQkweDA1MDAJLyogTmV4dCBEZXNjcmlwdG9yIFNpemUgPSA1ICovCi0jZGVmaW5lIE5EU0laRV82CQkweDA2MDAJLyogTmV4dCBEZXNjcmlwdG9yIFNpemUgPSA2ICovCi0jZGVmaW5lIE5EU0laRV83CQkweDA3MDAJLyogTmV4dCBEZXNjcmlwdG9yIFNpemUgPSA3ICovCi0jZGVmaW5lIE5EU0laRV84CQkweDA4MDAJLyogTmV4dCBEZXNjcmlwdG9yIFNpemUgPSA4ICovCi0jZGVmaW5lIE5EU0laRV85CQkweDA5MDAJLyogTmV4dCBEZXNjcmlwdG9yIFNpemUgPSA5ICovCi0jZGVmaW5lIE5EU0laRQkJCTB4MGYwMAkvKiBOZXh0IERlc2NyaXB0b3IgU2l6ZSAqLwotI2RlZmluZSBETUFGTE9XCQkJMHg3MDAwCS8qIEZsb3cgQ29udHJvbCAqLwotI2RlZmluZSBETUFGTE9XX1NUT1AJMHgwMDAwCS8qIFN0b3AgTW9kZSAqLwotI2RlZmluZSBETUFGTE9XX0FVVE8JMHgxMDAwCS8qIEF1dG9idWZmZXIgTW9kZSAqLwotI2RlZmluZSBETUFGTE9XX0FSUkFZCTB4NDAwMAkvKiBEZXNjcmlwdG9yIEFycmF5IE1vZGUgKi8KLSNkZWZpbmUgRE1BRkxPV19TTUFMTAkweDYwMDAJLyogU21hbGwgTW9kZWwgRGVzY3JpcHRvciBMaXN0IE1vZGUgKi8KLSNkZWZpbmUgRE1BRkxPV19MQVJHRQkweDcwMDAJLyogTGFyZ2UgTW9kZWwgRGVzY3JpcHRvciBMaXN0IE1vZGUgKi8KLQotLyogRE1BX0lSUV9TVEFUVVMgTWFza3MgKi8KLSNkZWZpbmUgRE1BX0RPTkUJCTB4MDAwMQkvKiBETUEgQ29tcGxldGlvbiBJbnRlcnJ1cHQgU3RhdHVzICovCi0jZGVmaW5lIERNQV9FUlIJCQkweDAwMDIJLyogRE1BIEVycm9yIEludGVycnVwdCBTdGF0dXMgKi8KLSNkZWZpbmUgREZFVENICQkJMHgwMDA0CS8qIERNQSBEZXNjcmlwdG9yIEZldGNoIEluZGljYXRvciAqLwotI2RlZmluZSBETUFfUlVOCQkJMHgwMDA4CS8qIERNQSBDaGFubmVsIFJ1bm5pbmcgSW5kaWNhdG9yICovCisjaW5jbHVkZSA8YXNtL2JmaW5fZG1hLmg+CiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICogY29uZmlnIHJlZyBiaXRzIHZhbHVlCkBAIC0xNDksNyArMTE2LDcgQEAKICoJRE1BIEFQSSdzCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogZXh0ZXJuIHN0cnVjdCBkbWFfY2hhbm5lbCBkbWFfY2hbTUFYX0RNQV9DSEFOTkVMU107Ci1leHRlcm4gc3RydWN0IGRtYV9yZWdpc3RlciAqZG1hX2lvX2Jhc2VfYWRkcltNQVhfRE1BX0NIQU5ORUxTXTsKK2V4dGVybiBzdHJ1Y3QgZG1hX3JlZ2lzdGVyICogY29uc3QgZG1hX2lvX2Jhc2VfYWRkcltNQVhfRE1BX0NIQU5ORUxTXTsKIGV4dGVybiBpbnQgY2hhbm5lbDJpcnEodW5zaWduZWQgaW50IGNoYW5uZWwpOwogCiBzdGF0aWMgaW5saW5lIHZvaWQgc2V0X2RtYV9zdGFydF9hZGRyKHVuc2lnbmVkIGludCBjaGFubmVsLCB1bnNpZ25lZCBsb25nIGFkZHIpCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2RwbWMuaCBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vZHBtYy5oCmluZGV4IGVmY2MzYWUuLjMwNDcxMjAgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vZHBtYy5oCisrKyBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vZHBtYy5oCkBAIC05LDYgKzksOCBAQAogI2lmbmRlZiBfQkxBQ0tGSU5fRFBNQ19IXwogI2RlZmluZSBfQkxBQ0tGSU5fRFBNQ19IXwogCisjaW5jbHVkZSA8bWFjaC9wbGwuaD4KKwogLyogUExMX0NUTCBNYXNrcyAqLwogI2RlZmluZSBERgkJCTB4MDAwMQkvKiAwOiBQTEwgPSBDTEtJTiwgMTogUExMID0gQ0xLSU4vMiAqLwogI2RlZmluZSBQTExfT0ZGCQkJMHgwMDAyCS8qIFBMTCBOb3QgUG93ZXJlZCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9pby5oIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9pby5oCmluZGV4IDIzNGZiYWMuLmRjY2FlMjYgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vaW8uaAorKysgYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2lvLmgKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDQtMjAwOSBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKiBDb3B5cmlnaHQgMjAwNC0yMDEwIEFuYWxvZyBEZXZpY2VzIEluYy4KICAqCiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCiAgKi8KQEAgLTcsMTQ4ICs3LDQ4IEBACiAjaWZuZGVmIF9CRklOX0lPX0gKICNkZWZpbmUgX0JGSU5fSU9fSAogCi0jaWZkZWYgX19LRVJORUxfXwotCi0jaWZuZGVmIF9fQVNTRU1CTFlfXwotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jZW5kaWYKICNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgogCi0vKgotICogVGhlc2UgYXJlIGZvciBJU0EvUENJIHNoYXJlZCBtZW1vcnkgX29ubHlfIGFuZCBzaG91bGQgbmV2ZXIgYmUgdXNlZAotICogb24gYW55IG90aGVyIHR5cGUgb2YgbWVtb3J5LCBpbmNsdWRpbmcgWm9ycm8gbWVtb3J5LiBUaGV5IGFyZSBtZWFudCB0bwotICogYWNjZXNzIHRoZSBidXMgaW4gdGhlIGJ1cyBieXRlIG9yZGVyIHdoaWNoIGlzIGxpdHRsZS1lbmRpYW4hLgotICoKLSAqIHJlYWRYL3dyaXRlWCgpIGFyZSB1c2VkIHRvIGFjY2VzcyBtZW1vcnkgbWFwcGVkIGRldmljZXMuIE9uIHNvbWUKLSAqIGFyY2hpdGVjdHVyZXMgdGhlIG1lbW9yeSBtYXBwZWQgSU8gc3R1ZmYgbmVlZHMgdG8gYmUgYWNjZXNzZWQKLSAqIGRpZmZlcmVudGx5LiBPbiB0aGUgYmZpbiBhcmNoaXRlY3R1cmUsIHdlIGp1c3QgcmVhZC93cml0ZSB0aGUKLSAqIG1lbW9yeSBsb2NhdGlvbiBkaXJlY3RseS4KLSAqLwotI2lmbmRlZiBfX0FTU0VNQkxZX18KLQotc3RhdGljIGlubGluZSB1bnNpZ25lZCBjaGFyIHJlYWRiKGNvbnN0IHZvbGF0aWxlIHZvaWQgX19pb21lbSAqYWRkcikKLXsKLQl1bnNpZ25lZCBpbnQgdmFsOwotCWludCB0bXA7Ci0KLQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCi0JCSJjbGkgJTE7IgotCQkiTk9QOyBOT1A7IFNTWU5DOyIKLQkJIiUwID0gYiBbJTJdICh6KTsiCi0JCSJzdGkgJTE7IgotCQk6ICI9ZCIodmFsKSwgIj1kIih0bXApCi0JCTogImEiKGFkZHIpCi0JKTsKLQotCXJldHVybiAodW5zaWduZWQgY2hhcikgdmFsOworI2RlZmluZSBERUNMQVJFX0JGSU5fUkFXX1JFQURYKHNpemUsIHR5cGUsIGFzbSwgYXNtX3NpZ24pIFwKK3N0YXRpYyBpbmxpbmUgdHlwZSBfX3Jhd19yZWFkIyNzaXplKGNvbnN0IHZvbGF0aWxlIHZvaWQgX19pb21lbSAqYWRkcikgXAoreyBcCisJdW5zaWduZWQgaW50IHZhbDsgXAorCWludCB0bXA7IFwKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIFwKKwkJImNsaSAlMTsiIFwKKwkJIk5PUDsgTk9QOyBTU1lOQzsiIFwKKwkJIiUwID0gIiNhc20iIFslMl0gIiNhc21fc2lnbiI7IiBcCisJCSJzdGkgJTE7IiBcCisJCTogIj1kIih2YWwpLCAiPWQiKHRtcCkgXAorCQk6ICJhIihhZGRyKSBcCisJKTsgXAorCXJldHVybiAodHlwZSkgdmFsOyBcCiB9Ci0KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgc2hvcnQgcmVhZHcoY29uc3Qgdm9sYXRpbGUgdm9pZCBfX2lvbWVtICphZGRyKQotewotCXVuc2lnbmVkIGludCB2YWw7Ci0JaW50IHRtcDsKLQotCV9fYXNtX18gX192b2xhdGlsZV9fICgKLQkJImNsaSAlMTsiCi0JCSJOT1A7IE5PUDsgU1NZTkM7IgotCQkiJTAgPSB3IFslMl0gKHopOyIKLQkJInN0aSAlMTsiCi0JCTogIj1kIih2YWwpLCAiPWQiKHRtcCkKLQkJOiAiYSIoYWRkcikKLQkpOwotCi0JcmV0dXJuICh1bnNpZ25lZCBzaG9ydCkgdmFsOwotfQotCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCByZWFkbChjb25zdCB2b2xhdGlsZSB2b2lkIF9faW9tZW0gKmFkZHIpCi17Ci0JdW5zaWduZWQgaW50IHZhbDsKLQlpbnQgdG1wOwotCi0JX19hc21fXyBfX3ZvbGF0aWxlX18gKAotCQkiY2xpICUxOyIKLQkJIk5PUDsgTk9QOyBTU1lOQzsiCi0JCSIlMCA9IFslMl07IgotCQkic3RpICUxOyIKLQkJOiAiPWQiKHZhbCksICI9ZCIodG1wKQotCQk6ICJhIihhZGRyKQotCSk7Ci0KLQlyZXR1cm4gdmFsOwotfQotCi0jZW5kaWYgLyogIF9fQVNTRU1CTFlfXyAqLwotCi0jZGVmaW5lIHdyaXRlYihiLCBhZGRyKSAodm9pZCkoKCoodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKSAoYWRkcikpID0gKGIpKQotI2RlZmluZSB3cml0ZXcoYiwgYWRkcikgKHZvaWQpKCgqKHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICopIChhZGRyKSkgPSAoYikpCi0jZGVmaW5lIHdyaXRlbChiLCBhZGRyKSAodm9pZCkoKCoodm9sYXRpbGUgdW5zaWduZWQgaW50ICopIChhZGRyKSkgPSAoYikpCi0KLSNkZWZpbmUgX19yYXdfcmVhZGIgcmVhZGIKLSNkZWZpbmUgX19yYXdfcmVhZHcgcmVhZHcKLSNkZWZpbmUgX19yYXdfcmVhZGwgcmVhZGwKLSNkZWZpbmUgX19yYXdfd3JpdGViIHdyaXRlYgotI2RlZmluZSBfX3Jhd193cml0ZXcgd3JpdGV3Ci0jZGVmaW5lIF9fcmF3X3dyaXRlbCB3cml0ZWwKLSNkZWZpbmUgbWVtc2V0X2lvKGEsIGIsIGMpCW1lbXNldCgodm9pZCAqKShhKSwgKGIpLCAoYykpCi0jZGVmaW5lIG1lbWNweV9mcm9taW8oYSwgYiwgYykJbWVtY3B5KChhKSwgKHZvaWQgKikoYiksIChjKSkKLSNkZWZpbmUgbWVtY3B5X3RvaW8oYSwgYiwgYykJbWVtY3B5KCh2b2lkICopKGEpLCAoYiksIChjKSkKLQotLyogQ29udmVydCAiSS9PIHBvcnQgYWRkcmVzc2VzIiB0byBhY3R1YWwgYWRkcmVzc2VzLiAgaS5lLiB1Z2x5IGNhc3RzLiAqLwotI2RlZmluZSBfX2lvKHBvcnQpICgodm9pZCAqKSh1bnNpZ25lZCBsb25nKShwb3J0KSkKLQotI2RlZmluZSBpbmIocG9ydCkgICAgcmVhZGIoX19pbyhwb3J0KSkKLSNkZWZpbmUgaW53KHBvcnQpICAgIHJlYWR3KF9faW8ocG9ydCkpCi0jZGVmaW5lIGlubChwb3J0KSAgICByZWFkbChfX2lvKHBvcnQpKQotI2RlZmluZSBvdXRiKHgsIHBvcnQpIHdyaXRlYih4LCBfX2lvKHBvcnQpKQotI2RlZmluZSBvdXR3KHgsIHBvcnQpIHdyaXRldyh4LCBfX2lvKHBvcnQpKQotI2RlZmluZSBvdXRsKHgsIHBvcnQpIHdyaXRlbCh4LCBfX2lvKHBvcnQpKQotCi0jZGVmaW5lIGluYl9wKHBvcnQpICAgIGluYihfX2lvKHBvcnQpKQotI2RlZmluZSBpbndfcChwb3J0KSAgICBpbncoX19pbyhwb3J0KSkKLSNkZWZpbmUgaW5sX3AocG9ydCkgICAgaW5sKF9faW8ocG9ydCkpCi0jZGVmaW5lIG91dGJfcCh4LCBwb3J0KSBvdXRiKHgsIF9faW8ocG9ydCkpCi0jZGVmaW5lIG91dHdfcCh4LCBwb3J0KSBvdXR3KHgsIF9faW8ocG9ydCkpCi0jZGVmaW5lIG91dGxfcCh4LCBwb3J0KSBvdXRsKHgsIF9faW8ocG9ydCkpCi0KLSNkZWZpbmUgaW9yZWFkOF9yZXAoYSwgZCwgYykJcmVhZHNiKGEsIGQsIGMpCi0jZGVmaW5lIGlvcmVhZDE2X3JlcChhLCBkLCBjKQlyZWFkc3coYSwgZCwgYykKLSNkZWZpbmUgaW9yZWFkMzJfcmVwKGEsIGQsIGMpCXJlYWRzbChhLCBkLCBjKQotI2RlZmluZSBpb3dyaXRlOF9yZXAoYSwgcywgYykJd3JpdGVzYihhLCBzLCBjKQotI2RlZmluZSBpb3dyaXRlMTZfcmVwKGEsIHMsIGMpCXdyaXRlc3coYSwgcywgYykKLSNkZWZpbmUgaW93cml0ZTMyX3JlcChhLCBzLCBjKQl3cml0ZXNsKGEsIHMsIGMpCi0KLSNkZWZpbmUgaW9yZWFkOCh4KQkJCXJlYWRiKHgpCi0jZGVmaW5lIGlvcmVhZDE2KHgpCQkJcmVhZHcoeCkKLSNkZWZpbmUgaW9yZWFkMzIoeCkJCQlyZWFkbCh4KQotI2RlZmluZSBpb3dyaXRlOCh2YWwsIHgpCQl3cml0ZWIodmFsLCB4KQotI2RlZmluZSBpb3dyaXRlMTYodmFsLCB4KQkJd3JpdGV3KHZhbCwgeCkKLSNkZWZpbmUgaW93cml0ZTMyKHZhbCwgeCkJCXdyaXRlbCh2YWwsIHgpCi0KLS8qKgotICogSS9PIHdyaXRlIGJhcnJpZXIKLSAqCi0gKiBFbnN1cmUgb3JkZXJpbmcgb2YgSS9PIHNwYWNlIHdyaXRlcy4gVGhpcyB3aWxsIG1ha2Ugc3VyZSB0aGF0IHdyaXRlcwotICogZm9sbG93aW5nIHRoZSBiYXJyaWVyIHdpbGwgYXJyaXZlIGFmdGVyIGFsbCBwcmV2aW91cyB3cml0ZXMuCi0gKi8KLSNkZWZpbmUgbW1pb3diKCkgZG8geyBTU1lOQygpOyB3bWIoKTsgfSB3aGlsZSAoMCkKLQotI2RlZmluZSBJT19TUEFDRV9MSU1JVCAweGZmZmZmZmZmCi0KLS8qIFZhbHVlcyBmb3Igbm9jYWNoZWZsYWcgYW5kIGNtb2RlICovCi0jZGVmaW5lIElPTUFQX05PQ0FDSEVfU0VSCQkxCi0KLSNpZm5kZWYgX19BU1NFTUJMWV9fCitERUNMQVJFX0JGSU5fUkFXX1JFQURYKGIsIHU4LCBiLCAoeikpCisjZGVmaW5lIF9fcmF3X3JlYWRiIF9fcmF3X3JlYWRiCitERUNMQVJFX0JGSU5fUkFXX1JFQURYKHcsIHUxNiwgdywgKHopKQorI2RlZmluZSBfX3Jhd19yZWFkdyBfX3Jhd19yZWFkdworREVDTEFSRV9CRklOX1JBV19SRUFEWChsLCB1MzIsICwgKQorI2RlZmluZSBfX3Jhd19yZWFkbCBfX3Jhd19yZWFkbAogCiBleHRlcm4gdm9pZCBvdXRzYih1bnNpZ25lZCBsb25nIHBvcnQsIGNvbnN0IHZvaWQgKmFkZHIsIHVuc2lnbmVkIGxvbmcgY291bnQpOwogZXh0ZXJuIHZvaWQgb3V0c3codW5zaWduZWQgbG9uZyBwb3J0LCBjb25zdCB2b2lkICphZGRyLCB1bnNpZ25lZCBsb25nIGNvdW50KTsKIGV4dGVybiB2b2lkIG91dHN3XzgodW5zaWduZWQgbG9uZyBwb3J0LCBjb25zdCB2b2lkICphZGRyLCB1bnNpZ25lZCBsb25nIGNvdW50KTsKIGV4dGVybiB2b2lkIG91dHNsKHVuc2lnbmVkIGxvbmcgcG9ydCwgY29uc3Qgdm9pZCAqYWRkciwgdW5zaWduZWQgbG9uZyBjb3VudCk7CisjZGVmaW5lIG91dHNiIG91dHNiCisjZGVmaW5lIG91dHN3IG91dHN3CisjZGVmaW5lIG91dHNsIG91dHNsCiAKIGV4dGVybiB2b2lkIGluc2IodW5zaWduZWQgbG9uZyBwb3J0LCB2b2lkICphZGRyLCB1bnNpZ25lZCBsb25nIGNvdW50KTsKIGV4dGVybiB2b2lkIGluc3codW5zaWduZWQgbG9uZyBwb3J0LCB2b2lkICphZGRyLCB1bnNpZ25lZCBsb25nIGNvdW50KTsKIGV4dGVybiB2b2lkIGluc3dfOCh1bnNpZ25lZCBsb25nIHBvcnQsIHZvaWQgKmFkZHIsIHVuc2lnbmVkIGxvbmcgY291bnQpOwogZXh0ZXJuIHZvaWQgaW5zbCh1bnNpZ25lZCBsb25nIHBvcnQsIHZvaWQgKmFkZHIsIHVuc2lnbmVkIGxvbmcgY291bnQpOwogZXh0ZXJuIHZvaWQgaW5zbF8xNih1bnNpZ25lZCBsb25nIHBvcnQsIHZvaWQgKmFkZHIsIHVuc2lnbmVkIGxvbmcgY291bnQpOworI2RlZmluZSBpbnNiIGluc2IKKyNkZWZpbmUgaW5zdyBpbnN3CisjZGVmaW5lIGluc2wgaW5zbAogCiBleHRlcm4gdm9pZCBkbWFfb3V0c2IodW5zaWduZWQgbG9uZyBwb3J0LCBjb25zdCB2b2lkICphZGRyLCB1bnNpZ25lZCBzaG9ydCBjb3VudCk7CiBleHRlcm4gdm9pZCBkbWFfb3V0c3codW5zaWduZWQgbG9uZyBwb3J0LCBjb25zdCB2b2lkICphZGRyLCB1bnNpZ25lZCBzaG9ydCBjb3VudCk7CkBAIC0xNTgsMTA4ICs1OCwxNCBAQAogZXh0ZXJuIHZvaWQgZG1hX2luc3codW5zaWduZWQgbG9uZyBwb3J0LCB2b2lkICphZGRyLCB1bnNpZ25lZCBzaG9ydCBjb3VudCk7CiBleHRlcm4gdm9pZCBkbWFfaW5zbCh1bnNpZ25lZCBsb25nIHBvcnQsIHZvaWQgKmFkZHIsIHVuc2lnbmVkIHNob3J0IGNvdW50KTsKIAotc3RhdGljIGlubGluZSB2b2lkIHJlYWRzbChjb25zdCB2b2lkIF9faW9tZW0gKmFkZHIsIHZvaWQgKmJ1ZiwgaW50IGxlbikKLXsKLQlpbnNsKCh1bnNpZ25lZCBsb25nKWFkZHIsIGJ1ZiwgbGVuKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHJlYWRzdyhjb25zdCB2b2lkIF9faW9tZW0gKmFkZHIsIHZvaWQgKmJ1ZiwgaW50IGxlbikKLXsKLQlpbnN3KCh1bnNpZ25lZCBsb25nKWFkZHIsIGJ1ZiwgbGVuKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHJlYWRzYihjb25zdCB2b2lkIF9faW9tZW0gKmFkZHIsIHZvaWQgKmJ1ZiwgaW50IGxlbikKLXsKLQlpbnNiKCh1bnNpZ25lZCBsb25nKWFkZHIsIGJ1ZiwgbGVuKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHdyaXRlc2woY29uc3Qgdm9pZCBfX2lvbWVtICphZGRyLCBjb25zdCB2b2lkICpidWYsIGludCBsZW4pCi17Ci0Jb3V0c2woKHVuc2lnbmVkIGxvbmcpYWRkciwgYnVmLCBsZW4pOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgd3JpdGVzdyhjb25zdCB2b2lkIF9faW9tZW0gKmFkZHIsIGNvbnN0IHZvaWQgKmJ1ZiwgaW50IGxlbikKLXsKLQlvdXRzdygodW5zaWduZWQgbG9uZylhZGRyLCBidWYsIGxlbik7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCB3cml0ZXNiKGNvbnN0IHZvaWQgX19pb21lbSAqYWRkciwgY29uc3Qgdm9pZCAqYnVmLCBpbnQgbGVuKQotewotCW91dHNiKCh1bnNpZ25lZCBsb25nKWFkZHIsIGJ1ZiwgbGVuKTsKLX0KLQotLyoKLSAqIE1hcCBzb21lIHBoeXNpY2FsIGFkZHJlc3MgcmFuZ2UgaW50byB0aGUga2VybmVsIGFkZHJlc3Mgc3BhY2UuCisvKioKKyAqIEkvTyB3cml0ZSBiYXJyaWVyCisgKgorICogRW5zdXJlIG9yZGVyaW5nIG9mIEkvTyBzcGFjZSB3cml0ZXMuIFRoaXMgd2lsbCBtYWtlIHN1cmUgdGhhdCB3cml0ZXMKKyAqIGZvbGxvd2luZyB0aGUgYmFycmllciB3aWxsIGFycml2ZSBhZnRlciBhbGwgcHJldmlvdXMgd3JpdGVzLgogICovCi1zdGF0aWMgaW5saW5lIHZvaWQgX19pb21lbSAqX19pb3JlbWFwKHVuc2lnbmVkIGxvbmcgcGh5c2FkZHIsIHVuc2lnbmVkIGxvbmcgc2l6ZSwKLQkJCQlpbnQgY2FjaGVmbGFnKQotewotCXJldHVybiAodm9pZCBfX2lvbWVtICopcGh5c2FkZHI7Ci19CisjZGVmaW5lIG1taW93YigpIGRvIHsgU1NZTkMoKTsgd21iKCk7IH0gd2hpbGUgKDApCiAKLS8qCi0gKiBVbm1hcCBhIGlvcmVtYXAoKWVkIHJlZ2lvbiBhZ2FpbgotICovCi1zdGF0aWMgaW5saW5lIHZvaWQgaW91bm1hcCh2b2lkICphZGRyKQotewotfQotCi0vKgotICogX19pb3VubWFwIHVubWFwcyBuZWFybHkgZXZlcnl0aGluZywgc28gYmUgY2FyZWZ1bAotICogaXQgZG9lc24ndCBmcmVlIGN1cnJlbnRseSBwb2ludGVyL3BhZ2UgdGFibGVzIGFueW1vcmUgYnV0IGl0Ci0gKiB3YW5zJ3QgdXNlZCBhbnl3YXkgYW5kIG1pZ2h0IGJlIGFkZGVkIGxhdGVyLgotICovCi1zdGF0aWMgaW5saW5lIHZvaWQgX19pb3VubWFwKHZvaWQgKmFkZHIsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKLXsKLX0KLQotLyoKLSAqIFNldCBuZXcgY2FjaGUgbW9kZSBmb3Igc29tZSBrZXJuZWwgYWRkcmVzcyBzcGFjZS4KLSAqIFRoZSBjYWxsZXIgbXVzdCBwdXNoIGRhdGEgZm9yIHRoYXQgcmFuZ2UgaXRzZWxmLCBpZiBzdWNoIGRhdGEgbWF5IGFscmVhZHkKLSAqIGJlIGluIHRoZSBjYWNoZS4KLSAqLwotc3RhdGljIGlubGluZSB2b2lkIGtlcm5lbF9zZXRfY2FjaGVtb2RlKHZvaWQgKmFkZHIsIHVuc2lnbmVkIGxvbmcgc2l6ZSwKLQkJCQkJaW50IGNtb2RlKQotewotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgX19pb21lbSAqaW9yZW1hcCh1bnNpZ25lZCBsb25nIHBoeXNhZGRyLCB1bnNpZ25lZCBsb25nIHNpemUpCi17Ci0JcmV0dXJuIF9faW9yZW1hcChwaHlzYWRkciwgc2l6ZSwgSU9NQVBfTk9DQUNIRV9TRVIpOwotfQotc3RhdGljIGlubGluZSB2b2lkIF9faW9tZW0gKmlvcmVtYXBfbm9jYWNoZSh1bnNpZ25lZCBsb25nIHBoeXNhZGRyLAotCQkJCQkgICAgdW5zaWduZWQgbG9uZyBzaXplKQotewotCXJldHVybiBfX2lvcmVtYXAocGh5c2FkZHIsIHNpemUsIElPTUFQX05PQ0FDSEVfU0VSKTsKLX0KLQotZXh0ZXJuIHZvaWQgYmxrZmluX2ludl9jYWNoZV9hbGwodm9pZCk7CisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvaW8uaD4KIAogI2VuZGlmCi0KLSNkZWZpbmUJaW9wb3J0X21hcChwb3J0LCBucikJCSgodm9pZCBfX2lvbWVtKikocG9ydCkpCi0jZGVmaW5lCWlvcG9ydF91bm1hcChhZGRyKQotCi0vKiBQYWdlcyB0byBwaHlzaWNhbCBhZGRyZXNzLi4uICovCi0jZGVmaW5lIHBhZ2VfdG9fYnVzKHBhZ2UpICAgICAgICgocGFnZSAtIG1lbV9tYXApIDw8IFBBR0VfU0hJRlQpCi0KLSNkZWZpbmUgcGh5c190b192aXJ0KHZhZGRyKQkoKHZvaWQgKikgKHZhZGRyKSkKLSNkZWZpbmUgdmlydF90b19waHlzKHZhZGRyKQkoKHVuc2lnbmVkIGxvbmcpICh2YWRkcikpCi0KLSNkZWZpbmUgdmlydF90b19idXMgdmlydF90b19waHlzCi0jZGVmaW5lIGJ1c190b192aXJ0IHBoeXNfdG9fdmlydAotCi0vKgotICogQ29udmVydCBhIHBoeXNpY2FsIHBvaW50ZXIgdG8gYSB2aXJ0dWFsIGtlcm5lbCBwb2ludGVyIGZvciAvZGV2L21lbQotICogYWNjZXNzCi0gKi8KLSNkZWZpbmUgeGxhdGVfZGV2X21lbV9wdHIocCkJX192YShwKQotCi0vKgotICogQ29udmVydCBhIHZpcnR1YWwgY2FjaGVkIHBvaW50ZXIgdG8gYW4gdW5jYWNoZWQgcG9pbnRlcgotICovCi0jZGVmaW5lIHhsYXRlX2Rldl9rbWVtX3B0cihwKQlwCi0KLSNlbmRpZgkJCQkvKiBfX0tFUk5FTF9fICovCi0KLSNlbmRpZgkJCQkvKiBfQkZJTl9JT19IICovCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2lycWZsYWdzLmggYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2lycWZsYWdzLmgKaW5kZXggNDFjNGQ3MC4uMzM2NWNiOSAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9pcnFmbGFncy5oCisrKyBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vaXJxZmxhZ3MuaApAQCAtMTMsOSArMTMsNiBAQAogI2lmZGVmIENPTkZJR19TTVAKICMgaW5jbHVkZSA8YXNtL3BkYS5oPgogIyBpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+Ci0vKiBGb3J3YXJkIGRlY2wgbmVlZGVkIGR1ZSB0byBjZGVmIGludGVyIGRlcGVuZGVuY2llcyAqLwotc3RhdGljIGlubGluZSB1aW50MzJfdCBfX3B1cmUgYmZpbl9kc3BpZCh2b2lkKTsKLSMgZGVmaW5lIGJsYWNrZmluX2NvcmVfaWQoKSAoYmZpbl9kc3BpZCgpICYgMHhmZikKICMgZGVmaW5lIGJmaW5faXJxX2ZsYWdzIGNwdV9wZGFbYmxhY2tmaW5fY29yZV9pZCgpXS5pbWFzawogI2Vsc2UKIGV4dGVybiB1bnNpZ25lZCBsb25nIGJmaW5faXJxX2ZsYWdzOwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9wcm9jZXNzb3IuaCBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vcHJvY2Vzc29yLmgKaW5kZXggYWVhODgwMi4uOGFmNzc3MiAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9wcm9jZXNzb3IuaAorKysgYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL3Byb2Nlc3Nvci5oCkBAIC0xNCw3ICsxNCw3IEBACiAjZGVmaW5lIGN1cnJlbnRfdGV4dF9hZGRyKCkgKHsgX19sYWJlbF9fIF9sOyBfbDogJiZfbDt9KQogCiAjaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgotI2luY2x1ZGUgPGFzbS9ibGFja2Zpbi5oPgorI2luY2x1ZGUgPG1hY2gvYmxhY2tmaW4uaD4KIAogc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHJkdXNwKHZvaWQpCiB7CkBAIC0xMzQsNiArMTM0LDggQEAKIAlyZXR1cm4gYmZpbl9yZWFkX0RTUElEKCk7CiB9CiAKKyNkZWZpbmUgYmxhY2tmaW5fY29yZV9pZCgpIChiZmluX2RzcGlkKCkgJiAweGZmKQorCiBzdGF0aWMgaW5saW5lIHVpbnQzMl90IF9fcHVyZSBiZmluX2NvbXBpbGVkX3JldmlkKHZvaWQpCiB7CiAjaWYgZGVmaW5lZChDT05GSUdfQkZfUkVWXzBfMCkKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vc3BpbmxvY2suaCBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vc3BpbmxvY2suaAppbmRleCAxOTQyY2NmLi4xZjI4NmU3IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL3NwaW5sb2NrLmgKKysrIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9zcGlubG9jay5oCkBAIC0xNywxMiArMTcsMTIgQEAKIGFzbWxpbmthZ2Ugdm9pZCBfX3Jhd19zcGluX2xvY2tfYXNtKHZvbGF0aWxlIGludCAqcHRyKTsKIGFzbWxpbmthZ2UgaW50IF9fcmF3X3NwaW5fdHJ5bG9ja19hc20odm9sYXRpbGUgaW50ICpwdHIpOwogYXNtbGlua2FnZSB2b2lkIF9fcmF3X3NwaW5fdW5sb2NrX2FzbSh2b2xhdGlsZSBpbnQgKnB0cik7Ci1hc21saW5rYWdlIHZvaWQgYXJjaF9yZWFkX2xvY2tfYXNtKHZvbGF0aWxlIGludCAqcHRyKTsKLWFzbWxpbmthZ2UgaW50IGFyY2hfcmVhZF90cnlsb2NrX2FzbSh2b2xhdGlsZSBpbnQgKnB0cik7Ci1hc21saW5rYWdlIHZvaWQgYXJjaF9yZWFkX3VubG9ja19hc20odm9sYXRpbGUgaW50ICpwdHIpOwotYXNtbGlua2FnZSB2b2lkIGFyY2hfd3JpdGVfbG9ja19hc20odm9sYXRpbGUgaW50ICpwdHIpOwotYXNtbGlua2FnZSBpbnQgYXJjaF93cml0ZV90cnlsb2NrX2FzbSh2b2xhdGlsZSBpbnQgKnB0cik7Ci1hc21saW5rYWdlIHZvaWQgYXJjaF93cml0ZV91bmxvY2tfYXNtKHZvbGF0aWxlIGludCAqcHRyKTsKK2FzbWxpbmthZ2Ugdm9pZCBfX3Jhd19yZWFkX2xvY2tfYXNtKHZvbGF0aWxlIGludCAqcHRyKTsKK2FzbWxpbmthZ2UgaW50IF9fcmF3X3JlYWRfdHJ5bG9ja19hc20odm9sYXRpbGUgaW50ICpwdHIpOworYXNtbGlua2FnZSB2b2lkIF9fcmF3X3JlYWRfdW5sb2NrX2FzbSh2b2xhdGlsZSBpbnQgKnB0cik7Cithc21saW5rYWdlIHZvaWQgX19yYXdfd3JpdGVfbG9ja19hc20odm9sYXRpbGUgaW50ICpwdHIpOworYXNtbGlua2FnZSBpbnQgX19yYXdfd3JpdGVfdHJ5bG9ja19hc20odm9sYXRpbGUgaW50ICpwdHIpOworYXNtbGlua2FnZSB2b2lkIF9fcmF3X3dyaXRlX3VubG9ja19hc20odm9sYXRpbGUgaW50ICpwdHIpOwogCiBzdGF0aWMgaW5saW5lIGludCBhcmNoX3NwaW5faXNfbG9ja2VkKGFyY2hfc3BpbmxvY2tfdCAqbG9jaykKIHsKQEAgLTY0LDMyICs2NCwzNiBAQAogCiBzdGF0aWMgaW5saW5lIHZvaWQgYXJjaF9yZWFkX2xvY2soYXJjaF9yd2xvY2tfdCAqcncpCiB7Ci0JYXJjaF9yZWFkX2xvY2tfYXNtKCZydy0+bG9jayk7CisJX19yYXdfcmVhZF9sb2NrX2FzbSgmcnctPmxvY2spOwogfQogCisjZGVmaW5lIGFyY2hfcmVhZF9sb2NrX2ZsYWdzKGxvY2ssIGZsYWdzKSBhcmNoX3JlYWRfbG9jayhsb2NrKQorCiBzdGF0aWMgaW5saW5lIGludCBhcmNoX3JlYWRfdHJ5bG9jayhhcmNoX3J3bG9ja190ICpydykKIHsKLQlyZXR1cm4gYXJjaF9yZWFkX3RyeWxvY2tfYXNtKCZydy0+bG9jayk7CisJcmV0dXJuIF9fcmF3X3JlYWRfdHJ5bG9ja19hc20oJnJ3LT5sb2NrKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIGFyY2hfcmVhZF91bmxvY2soYXJjaF9yd2xvY2tfdCAqcncpCiB7Ci0JYXJjaF9yZWFkX3VubG9ja19hc20oJnJ3LT5sb2NrKTsKKwlfX3Jhd19yZWFkX3VubG9ja19hc20oJnJ3LT5sb2NrKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIGFyY2hfd3JpdGVfbG9jayhhcmNoX3J3bG9ja190ICpydykKIHsKLQlhcmNoX3dyaXRlX2xvY2tfYXNtKCZydy0+bG9jayk7CisJX19yYXdfd3JpdGVfbG9ja19hc20oJnJ3LT5sb2NrKTsKIH0KIAorI2RlZmluZSBhcmNoX3dyaXRlX2xvY2tfZmxhZ3MobG9jaywgZmxhZ3MpIGFyY2hfd3JpdGVfbG9jayhsb2NrKQorCiBzdGF0aWMgaW5saW5lIGludCBhcmNoX3dyaXRlX3RyeWxvY2soYXJjaF9yd2xvY2tfdCAqcncpCiB7Ci0JcmV0dXJuIGFyY2hfd3JpdGVfdHJ5bG9ja19hc20oJnJ3LT5sb2NrKTsKKwlyZXR1cm4gX19yYXdfd3JpdGVfdHJ5bG9ja19hc20oJnJ3LT5sb2NrKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIGFyY2hfd3JpdGVfdW5sb2NrKGFyY2hfcndsb2NrX3QgKnJ3KQogewotCWFyY2hfd3JpdGVfdW5sb2NrX2FzbSgmcnctPmxvY2spOworCV9fcmF3X3dyaXRlX3VubG9ja19hc20oJnJ3LT5sb2NrKTsKIH0KIAogI2RlZmluZSBhcmNoX3NwaW5fcmVsYXgobG9jaykgIAljcHVfcmVsYXgoKQpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL21hY2gtY29tbW9uL3BsbC5oIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL21hY2gtY29tbW9uL3BsbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4MjE3OGIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvbWFjaC1jb21tb24vcGxsLmgKQEAgLTAsMCArMSw4NiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1LTIwMTAgQW5hbG9nIERldmljZXMgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KKyAqLworCisjaWZuZGVmIF9NQUNIX0NPTU1PTl9QTExfSAorI2RlZmluZSBfTUFDSF9DT01NT05fUExMX0gKKworI2lmbmRlZiBfX0FTU0VNQkxZX18KKworI2luY2x1ZGUgPGFzbS9ibGFja2Zpbi5oPgorI2luY2x1ZGUgPGFzbS9pcnFmbGFncy5oPgorCisjaWZuZGVmIGJmaW5faXdyX3Jlc3RvcmUKK3N0YXRpYyBpbmxpbmUgdm9pZAorYmZpbl9pd3JfcmVzdG9yZSh1bnNpZ25lZCBsb25nIGl3cjAsIHVuc2lnbmVkIGxvbmcgaXdyMSwgdW5zaWduZWQgbG9uZyBpd3IyKQoreworI2lmZGVmIFNJQ19JV1IKKwliZmluX3dyaXRlX1NJQ19JV1IoaXdyMCk7CisjZWxzZQorCWJmaW5fd3JpdGVfU0lDX0lXUjAoaXdyMCk7CisjIGlmZGVmIFNJQ19JV1IxCisJYmZpbl93cml0ZV9TSUNfSVdSMShpd3IxKTsKKyMgZW5kaWYKKyMgaWZkZWYgU0lDX0lXUjIKKwliZmluX3dyaXRlX1NJQ19JV1IyKGl3cjIpOworIyBlbmRpZgorI2VuZGlmCit9CisjZW5kaWYKKworI2lmbmRlZiBiZmluX2l3cl9zYXZlCitzdGF0aWMgaW5saW5lIHZvaWQKK2JmaW5faXdyX3NhdmUodW5zaWduZWQgbG9uZyBuaXdyMCwgdW5zaWduZWQgbG9uZyBuaXdyMSwgdW5zaWduZWQgbG9uZyBuaXdyMiwKKyAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyAqaXdyMCwgdW5zaWduZWQgbG9uZyAqaXdyMSwgdW5zaWduZWQgbG9uZyAqaXdyMikKK3sKKyNpZmRlZiBTSUNfSVdSCisJKml3cjAgPSBiZmluX3JlYWRfU0lDX0lXUigpOworI2Vsc2UKKwkqaXdyMCA9IGJmaW5fcmVhZF9TSUNfSVdSMCgpOworIyBpZmRlZiBTSUNfSVdSMQorCSppd3IxID0gYmZpbl9yZWFkX1NJQ19JV1IxKCk7CisjIGVuZGlmCisjIGlmZGVmIFNJQ19JV1IyCisJKml3cjIgPSBiZmluX3JlYWRfU0lDX0lXUjIoKTsKKyMgZW5kaWYKKyNlbmRpZgorCWJmaW5faXdyX3Jlc3RvcmUobml3cjAsIG5pd3IxLCBuaXdyMik7Cit9CisjZW5kaWYKKworc3RhdGljIGlubGluZSB2b2lkIF9iZmluX3dyaXRlX3BsbF9yZWxvY2sodTMyIGFkZHIsIHVuc2lnbmVkIGludCB2YWwpCit7CisJdW5zaWduZWQgbG9uZyBmbGFncywgaXdyMCwgaXdyMSwgaXdyMjsKKworCWlmICh2YWwgPT0gYmZpbl9yZWFkX1BMTF9DVEwoKSkKKwkJcmV0dXJuOworCisJZmxhZ3MgPSBoYXJkX2xvY2FsX2lycV9zYXZlKCk7CisJLyogRW5hYmxlIHRoZSBQTEwgV2FrZXVwIGJpdCBpbiBTSUMgSVdSICovCisJYmZpbl9pd3Jfc2F2ZShJV1JfRU5BQkxFKDApLCAwLCAwLCAmaXdyMCwgJml3cjEsICZpd3IyKTsKKworCWJmaW5fd3JpdGUxNihhZGRyLCB2YWwpOworCVNTWU5DKCk7CisJYXNtKCJJRExFOyIpOworCisJYmZpbl9pd3JfcmVzdG9yZShpd3IwLCBpd3IxLCBpd3IyKTsKKwloYXJkX2xvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKK30KKworLyogV3JpdGluZyB0byBQTExfQ1RMIGluaXRpYXRlcyBhIFBMTCByZWxvY2sgc2VxdWVuY2UgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBiZmluX3dyaXRlX1BMTF9DVEwodW5zaWduZWQgaW50IHZhbCkKK3sKKwlfYmZpbl93cml0ZV9wbGxfcmVsb2NrKFBMTF9DVEwsIHZhbCk7Cit9CisKKy8qIFdyaXRpbmcgdG8gVlJfQ1RMIGluaXRpYXRlcyBhIFBMTCByZWxvY2sgc2VxdWVuY2UgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBiZmluX3dyaXRlX1ZSX0NUTCh1bnNpZ25lZCBpbnQgdmFsKQoreworCV9iZmluX3dyaXRlX3BsbF9yZWxvY2soVlJfQ1RMLCB2YWwpOworfQorCisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvbWFjaC1jb21tb24vcG9ydHMtYS5oIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL21hY2gtY29tbW9uL3BvcnRzLWEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Zjc4YTc2Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL21hY2gtY29tbW9uL3BvcnRzLWEuaApAQCAtMCwwICsxLDI1IEBACisvKgorICogUG9ydCBBIE1hc2tzCisgKi8KKworI2lmbmRlZiBfX0JGSU5fUEVSSVBIRVJBTF9QT1JUX0FfXworI2RlZmluZSBfX0JGSU5fUEVSSVBIRVJBTF9QT1JUX0FfXworCisjZGVmaW5lIFBBMAkJKDEgPDwgMCkKKyNkZWZpbmUgUEExCQkoMSA8PCAxKQorI2RlZmluZSBQQTIJCSgxIDw8IDIpCisjZGVmaW5lIFBBMwkJKDEgPDwgMykKKyNkZWZpbmUgUEE0CQkoMSA8PCA0KQorI2RlZmluZSBQQTUJCSgxIDw8IDUpCisjZGVmaW5lIFBBNgkJKDEgPDwgNikKKyNkZWZpbmUgUEE3CQkoMSA8PCA3KQorI2RlZmluZSBQQTgJCSgxIDw8IDgpCisjZGVmaW5lIFBBOQkJKDEgPDwgOSkKKyNkZWZpbmUgUEExMAkJKDEgPDwgMTApCisjZGVmaW5lIFBBMTEJCSgxIDw8IDExKQorI2RlZmluZSBQQTEyCQkoMSA8PCAxMikKKyNkZWZpbmUgUEExMwkJKDEgPDwgMTMpCisjZGVmaW5lIFBBMTQJCSgxIDw8IDE0KQorI2RlZmluZSBQQTE1CQkoMSA8PCAxNSkKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvbWFjaC1jb21tb24vcG9ydHMtYi5oIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL21hY2gtY29tbW9uL3BvcnRzLWIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODE3MDJmCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL21hY2gtY29tbW9uL3BvcnRzLWIuaApAQCAtMCwwICsxLDI1IEBACisvKgorICogUG9ydCBCIE1hc2tzCisgKi8KKworI2lmbmRlZiBfX0JGSU5fUEVSSVBIRVJBTF9QT1JUX0JfXworI2RlZmluZSBfX0JGSU5fUEVSSVBIRVJBTF9QT1JUX0JfXworCisjZGVmaW5lIFBCMAkJKDEgPDwgMCkKKyNkZWZpbmUgUEIxCQkoMSA8PCAxKQorI2RlZmluZSBQQjIJCSgxIDw8IDIpCisjZGVmaW5lIFBCMwkJKDEgPDwgMykKKyNkZWZpbmUgUEI0CQkoMSA8PCA0KQorI2RlZmluZSBQQjUJCSgxIDw8IDUpCisjZGVmaW5lIFBCNgkJKDEgPDwgNikKKyNkZWZpbmUgUEI3CQkoMSA8PCA3KQorI2RlZmluZSBQQjgJCSgxIDw8IDgpCisjZGVmaW5lIFBCOQkJKDEgPDwgOSkKKyNkZWZpbmUgUEIxMAkJKDEgPDwgMTApCisjZGVmaW5lIFBCMTEJCSgxIDw8IDExKQorI2RlZmluZSBQQjEyCQkoMSA8PCAxMikKKyNkZWZpbmUgUEIxMwkJKDEgPDwgMTMpCisjZGVmaW5lIFBCMTQJCSgxIDw8IDE0KQorI2RlZmluZSBQQjE1CQkoMSA8PCAxNSkKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvbWFjaC1jb21tb24vcG9ydHMtYy5oIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL21hY2gtY29tbW9uL3BvcnRzLWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zY2M2NjVlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL21hY2gtY29tbW9uL3BvcnRzLWMuaApAQCAtMCwwICsxLDI1IEBACisvKgorICogUG9ydCBDIE1hc2tzCisgKi8KKworI2lmbmRlZiBfX0JGSU5fUEVSSVBIRVJBTF9QT1JUX0NfXworI2RlZmluZSBfX0JGSU5fUEVSSVBIRVJBTF9QT1JUX0NfXworCisjZGVmaW5lIFBDMAkJKDEgPDwgMCkKKyNkZWZpbmUgUEMxCQkoMSA8PCAxKQorI2RlZmluZSBQQzIJCSgxIDw8IDIpCisjZGVmaW5lIFBDMwkJKDEgPDwgMykKKyNkZWZpbmUgUEM0CQkoMSA8PCA0KQorI2RlZmluZSBQQzUJCSgxIDw8IDUpCisjZGVmaW5lIFBDNgkJKDEgPDwgNikKKyNkZWZpbmUgUEM3CQkoMSA8PCA3KQorI2RlZmluZSBQQzgJCSgxIDw8IDgpCisjZGVmaW5lIFBDOQkJKDEgPDwgOSkKKyNkZWZpbmUgUEMxMAkJKDEgPDwgMTApCisjZGVmaW5lIFBDMTEJCSgxIDw8IDExKQorI2RlZmluZSBQQzEyCQkoMSA8PCAxMikKKyNkZWZpbmUgUEMxMwkJKDEgPDwgMTMpCisjZGVmaW5lIFBDMTQJCSgxIDw8IDE0KQorI2RlZmluZSBQQzE1CQkoMSA8PCAxNSkKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvbWFjaC1jb21tb24vcG9ydHMtZC5oIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL21hY2gtY29tbW9uL3BvcnRzLWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjhjNmEwCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL21hY2gtY29tbW9uL3BvcnRzLWQuaApAQCAtMCwwICsxLDI1IEBACisvKgorICogUG9ydCBEIE1hc2tzCisgKi8KKworI2lmbmRlZiBfX0JGSU5fUEVSSVBIRVJBTF9QT1JUX0RfXworI2RlZmluZSBfX0JGSU5fUEVSSVBIRVJBTF9QT1JUX0RfXworCisjZGVmaW5lIFBEMAkJKDEgPDwgMCkKKyNkZWZpbmUgUEQxCQkoMSA8PCAxKQorI2RlZmluZSBQRDIJCSgxIDw8IDIpCisjZGVmaW5lIFBEMwkJKDEgPDwgMykKKyNkZWZpbmUgUEQ0CQkoMSA8PCA0KQorI2RlZmluZSBQRDUJCSgxIDw8IDUpCisjZGVmaW5lIFBENgkJKDEgPDwgNikKKyNkZWZpbmUgUEQ3CQkoMSA8PCA3KQorI2RlZmluZSBQRDgJCSgxIDw8IDgpCisjZGVmaW5lIFBEOQkJKDEgPDwgOSkKKyNkZWZpbmUgUEQxMAkJKDEgPDwgMTApCisjZGVmaW5lIFBEMTEJCSgxIDw8IDExKQorI2RlZmluZSBQRDEyCQkoMSA8PCAxMikKKyNkZWZpbmUgUEQxMwkJKDEgPDwgMTMpCisjZGVmaW5lIFBEMTQJCSgxIDw8IDE0KQorI2RlZmluZSBQRDE1CQkoMSA8PCAxNSkKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvbWFjaC1jb21tb24vcG9ydHMtZS5oIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL21hY2gtY29tbW9uL3BvcnRzLWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODhiMGQwCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL21hY2gtY29tbW9uL3BvcnRzLWUuaApAQCAtMCwwICsxLDI1IEBACisvKgorICogUG9ydCBFIE1hc2tzCisgKi8KKworI2lmbmRlZiBfX0JGSU5fUEVSSVBIRVJBTF9QT1JUX0VfXworI2RlZmluZSBfX0JGSU5fUEVSSVBIRVJBTF9QT1JUX0VfXworCisjZGVmaW5lIFBFMAkJKDEgPDwgMCkKKyNkZWZpbmUgUEUxCQkoMSA8PCAxKQorI2RlZmluZSBQRTIJCSgxIDw8IDIpCisjZGVmaW5lIFBFMwkJKDEgPDwgMykKKyNkZWZpbmUgUEU0CQkoMSA8PCA0KQorI2RlZmluZSBQRTUJCSgxIDw8IDUpCisjZGVmaW5lIFBFNgkJKDEgPDwgNikKKyNkZWZpbmUgUEU3CQkoMSA8PCA3KQorI2RlZmluZSBQRTgJCSgxIDw8IDgpCisjZGVmaW5lIFBFOQkJKDEgPDwgOSkKKyNkZWZpbmUgUEUxMAkJKDEgPDwgMTApCisjZGVmaW5lIFBFMTEJCSgxIDw8IDExKQorI2RlZmluZSBQRTEyCQkoMSA8PCAxMikKKyNkZWZpbmUgUEUxMwkJKDEgPDwgMTMpCisjZGVmaW5lIFBFMTQJCSgxIDw8IDE0KQorI2RlZmluZSBQRTE1CQkoMSA8PCAxNSkKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvbWFjaC1jb21tb24vcG9ydHMtZi5oIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL21hY2gtY29tbW9uL3BvcnRzLWYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNmFmMjA2Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL21hY2gtY29tbW9uL3BvcnRzLWYuaApAQCAtMCwwICsxLDI1IEBACisvKgorICogUG9ydCBGIE1hc2tzCisgKi8KKworI2lmbmRlZiBfX0JGSU5fUEVSSVBIRVJBTF9QT1JUX0ZfXworI2RlZmluZSBfX0JGSU5fUEVSSVBIRVJBTF9QT1JUX0ZfXworCisjZGVmaW5lIFBGMAkJKDEgPDwgMCkKKyNkZWZpbmUgUEYxCQkoMSA8PCAxKQorI2RlZmluZSBQRjIJCSgxIDw8IDIpCisjZGVmaW5lIFBGMwkJKDEgPDwgMykKKyNkZWZpbmUgUEY0CQkoMSA8PCA0KQorI2RlZmluZSBQRjUJCSgxIDw8IDUpCisjZGVmaW5lIFBGNgkJKDEgPDwgNikKKyNkZWZpbmUgUEY3CQkoMSA8PCA3KQorI2RlZmluZSBQRjgJCSgxIDw8IDgpCisjZGVmaW5lIFBGOQkJKDEgPDwgOSkKKyNkZWZpbmUgUEYxMAkJKDEgPDwgMTApCisjZGVmaW5lIFBGMTEJCSgxIDw8IDExKQorI2RlZmluZSBQRjEyCQkoMSA8PCAxMikKKyNkZWZpbmUgUEYxMwkJKDEgPDwgMTMpCisjZGVmaW5lIFBGMTQJCSgxIDw8IDE0KQorI2RlZmluZSBQRjE1CQkoMSA8PCAxNSkKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvbWFjaC1jb21tb24vcG9ydHMtZy5oIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL21hY2gtY29tbW9uL3BvcnRzLWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTM1NWQzCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL21hY2gtY29tbW9uL3BvcnRzLWcuaApAQCAtMCwwICsxLDI1IEBACisvKgorICogUG9ydCBHIE1hc2tzCisgKi8KKworI2lmbmRlZiBfX0JGSU5fUEVSSVBIRVJBTF9QT1JUX0dfXworI2RlZmluZSBfX0JGSU5fUEVSSVBIRVJBTF9QT1JUX0dfXworCisjZGVmaW5lIFBHMAkJKDEgPDwgMCkKKyNkZWZpbmUgUEcxCQkoMSA8PCAxKQorI2RlZmluZSBQRzIJCSgxIDw8IDIpCisjZGVmaW5lIFBHMwkJKDEgPDwgMykKKyNkZWZpbmUgUEc0CQkoMSA8PCA0KQorI2RlZmluZSBQRzUJCSgxIDw8IDUpCisjZGVmaW5lIFBHNgkJKDEgPDwgNikKKyNkZWZpbmUgUEc3CQkoMSA8PCA3KQorI2RlZmluZSBQRzgJCSgxIDw8IDgpCisjZGVmaW5lIFBHOQkJKDEgPDwgOSkKKyNkZWZpbmUgUEcxMAkJKDEgPDwgMTApCisjZGVmaW5lIFBHMTEJCSgxIDw8IDExKQorI2RlZmluZSBQRzEyCQkoMSA8PCAxMikKKyNkZWZpbmUgUEcxMwkJKDEgPDwgMTMpCisjZGVmaW5lIFBHMTQJCSgxIDw8IDE0KQorI2RlZmluZSBQRzE1CQkoMSA8PCAxNSkKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvbWFjaC1jb21tb24vcG9ydHMtaC5oIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL21hY2gtY29tbW9uL3BvcnRzLWguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTM5MTBjCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL21hY2gtY29tbW9uL3BvcnRzLWguaApAQCAtMCwwICsxLDI1IEBACisvKgorICogUG9ydCBIIE1hc2tzCisgKi8KKworI2lmbmRlZiBfX0JGSU5fUEVSSVBIRVJBTF9QT1JUX0hfXworI2RlZmluZSBfX0JGSU5fUEVSSVBIRVJBTF9QT1JUX0hfXworCisjZGVmaW5lIFBIMAkJKDEgPDwgMCkKKyNkZWZpbmUgUEgxCQkoMSA8PCAxKQorI2RlZmluZSBQSDIJCSgxIDw8IDIpCisjZGVmaW5lIFBIMwkJKDEgPDwgMykKKyNkZWZpbmUgUEg0CQkoMSA8PCA0KQorI2RlZmluZSBQSDUJCSgxIDw8IDUpCisjZGVmaW5lIFBINgkJKDEgPDwgNikKKyNkZWZpbmUgUEg3CQkoMSA8PCA3KQorI2RlZmluZSBQSDgJCSgxIDw8IDgpCisjZGVmaW5lIFBIOQkJKDEgPDwgOSkKKyNkZWZpbmUgUEgxMAkJKDEgPDwgMTApCisjZGVmaW5lIFBIMTEJCSgxIDw8IDExKQorI2RlZmluZSBQSDEyCQkoMSA8PCAxMikKKyNkZWZpbmUgUEgxMwkJKDEgPDwgMTMpCisjZGVmaW5lIFBIMTQJCSgxIDw8IDE0KQorI2RlZmluZSBQSDE1CQkoMSA8PCAxNSkKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvbWFjaC1jb21tb24vcG9ydHMtaS5oIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL21hY2gtY29tbW9uL3BvcnRzLWkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTc2ZjA4Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL21hY2gtY29tbW9uL3BvcnRzLWkuaApAQCAtMCwwICsxLDI1IEBACisvKgorICogUG9ydCBJIE1hc2tzCisgKi8KKworI2lmbmRlZiBfX0JGSU5fUEVSSVBIRVJBTF9QT1JUX0lfXworI2RlZmluZSBfX0JGSU5fUEVSSVBIRVJBTF9QT1JUX0lfXworCisjZGVmaW5lIFBJMAkJKDEgPDwgMCkKKyNkZWZpbmUgUEkxCQkoMSA8PCAxKQorI2RlZmluZSBQSTIJCSgxIDw8IDIpCisjZGVmaW5lIFBJMwkJKDEgPDwgMykKKyNkZWZpbmUgUEk0CQkoMSA8PCA0KQorI2RlZmluZSBQSTUJCSgxIDw8IDUpCisjZGVmaW5lIFBJNgkJKDEgPDwgNikKKyNkZWZpbmUgUEk3CQkoMSA8PCA3KQorI2RlZmluZSBQSTgJCSgxIDw8IDgpCisjZGVmaW5lIFBJOQkJKDEgPDwgOSkKKyNkZWZpbmUgUEkxMAkJKDEgPDwgMTApCisjZGVmaW5lIFBJMTEJCSgxIDw8IDExKQorI2RlZmluZSBQSTEyCQkoMSA8PCAxMikKKyNkZWZpbmUgUEkxMwkJKDEgPDwgMTMpCisjZGVmaW5lIFBJMTQJCSgxIDw8IDE0KQorI2RlZmluZSBQSTE1CQkoMSA8PCAxNSkKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvbWFjaC1jb21tb24vcG9ydHMtai5oIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL21hY2gtY29tbW9uL3BvcnRzLWouaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MjQxMjNlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL21hY2gtY29tbW9uL3BvcnRzLWouaApAQCAtMCwwICsxLDI1IEBACisvKgorICogUG9ydCBKIE1hc2tzCisgKi8KKworI2lmbmRlZiBfX0JGSU5fUEVSSVBIRVJBTF9QT1JUX0pfXworI2RlZmluZSBfX0JGSU5fUEVSSVBIRVJBTF9QT1JUX0pfXworCisjZGVmaW5lIFBKMAkJKDEgPDwgMCkKKyNkZWZpbmUgUEoxCQkoMSA8PCAxKQorI2RlZmluZSBQSjIJCSgxIDw8IDIpCisjZGVmaW5lIFBKMwkJKDEgPDwgMykKKyNkZWZpbmUgUEo0CQkoMSA8PCA0KQorI2RlZmluZSBQSjUJCSgxIDw8IDUpCisjZGVmaW5lIFBKNgkJKDEgPDwgNikKKyNkZWZpbmUgUEo3CQkoMSA8PCA3KQorI2RlZmluZSBQSjgJCSgxIDw8IDgpCisjZGVmaW5lIFBKOQkJKDEgPDwgOSkKKyNkZWZpbmUgUEoxMAkJKDEgPDwgMTApCisjZGVmaW5lIFBKMTEJCSgxIDw8IDExKQorI2RlZmluZSBQSjEyCQkoMSA8PCAxMikKKyNkZWZpbmUgUEoxMwkJKDEgPDwgMTMpCisjZGVmaW5lIFBKMTQJCSgxIDw8IDE0KQorI2RlZmluZSBQSjE1CQkoMSA8PCAxNSkKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2tlcm5lbC9jcGxiLW5vbXB1L2NwbGJpbml0LmMgYi9hcmNoL2JsYWNrZmluL2tlcm5lbC9jcGxiLW5vbXB1L2NwbGJpbml0LmMKaW5kZXggYmZlNzVhZi4uODg2ZTAwMCAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9rZXJuZWwvY3BsYi1ub21wdS9jcGxiaW5pdC5jCisrKyBiL2FyY2gvYmxhY2tmaW4va2VybmVsL2NwbGItbm9tcHUvY3BsYmluaXQuYwpAQCAtMTE2LDcgKzExNiw3IEBACiAJICAgICgoX3JhbWVuZCAtIHVuY2FjaGVkX2VuZCkgPj0gMSAqIDEwMjQgKiAxMDI0KSkKIAkJZGNwbGJfYm91bmRzW2lfZF0uZWFkZHIgPSB1bmNhY2hlZF9lbmQ7CiAJZWxzZQotCQlkY3BsYl9ib3VuZHNbaV9kXS5lYWRkciA9IHVuY2FjaGVkX2VuZCAmIH4oMSAqIDEwMjQgKiAxMDI0KTsKKwkJZGNwbGJfYm91bmRzW2lfZF0uZWFkZHIgPSB1bmNhY2hlZF9lbmQgJiB+KDEgKiAxMDI0ICogMTAyNCAtIDEpOwogCWRjcGxiX2JvdW5kc1tpX2QrK10uZGF0YSA9IFNEUkFNX0RHRU5FUklDOwogCS8qIERNQSB1bmNhY2hlZCByZWdpb24uICAqLwogCWlmIChETUFfVU5DQUNIRURfUkVHSU9OKSB7CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2tlcm5lbC9rZ2RiLmMgYi9hcmNoL2JsYWNrZmluL2tlcm5lbC9rZ2RiLmMKaW5kZXggZWRhZTQ2MS4uZWI5MjU5MiAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9rZXJuZWwva2dkYi5jCisrKyBiL2FyY2gvYmxhY2tmaW4va2VybmVsL2tnZGIuYwpAQCAtMzQ1LDYgKzM0NSwyMyBAQAogfQogI2VuZGlmCiAKKyNpZmRlZiBDT05GSUdfSVBJUEUKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGtnZGJfYXJjaF9pbWFzazsKKyNlbmRpZgorCit2b2lkIGtnZGJfcG9zdF9wcmltYXJ5X2NvZGUoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIGludCBlX3ZlY3RvciwgaW50IGVycl9jb2RlKQoreworCWlmIChrZ2RiX3NpbmdsZV9zdGVwKQorCQlwcmVlbXB0X2VuYWJsZSgpOworCisjaWZkZWYgQ09ORklHX0lQSVBFCisJaWYgKGtnZGJfYXJjaF9pbWFzaykgeworCQljcHVfcGRhW3Jhd19zbXBfcHJvY2Vzc29yX2lkKCldLmV4X2ltYXNrID0ga2dkYl9hcmNoX2ltYXNrOworCQlrZ2RiX2FyY2hfaW1hc2sgPSAwOworCX0KKyNlbmRpZgorfQorCiBpbnQga2dkYl9hcmNoX2hhbmRsZV9leGNlcHRpb24oaW50IHZlY3RvciwgaW50IHNpZ25vLAogCQkJICAgICAgIGludCBlcnJfY29kZSwgY2hhciAqcmVtY29tX2luX2J1ZmZlciwKIAkJCSAgICAgICBjaGFyICpyZW1jb21fb3V0X2J1ZmZlciwKQEAgLTM4OCw2ICs0MDUsMTIgQEAKIAkJCSAqIGtnZGJfc2luZ2xlX3N0ZXAgPiAwIG1lYW5zIGluIHNpbmdsZSBzdGVwIG1vZGUKIAkJCSAqLwogCQkJa2dkYl9zaW5nbGVfc3RlcCA9IGkgKyAxOworCisJCQlwcmVlbXB0X2Rpc2FibGUoKTsKKyNpZmRlZiBDT05GSUdfSVBJUEUKKwkJCWtnZGJfYXJjaF9pbWFzayA9IGNwdV9wZGFbcmF3X3NtcF9wcm9jZXNzb3JfaWQoKV0uZXhfaW1hc2s7CisJCQljcHVfcGRhW3Jhd19zbXBfcHJvY2Vzc29yX2lkKCldLmV4X2ltYXNrID0gMDsKKyNlbmRpZgogCQl9CiAKIAkJYmZpbl9jb3JyZWN0X2h3X2JyZWFrKCk7CkBAIC00NDgsNiArNDcxLDkgQEAKIGludCBrZ2RiX2FyY2hfaW5pdCh2b2lkKQogewogCWtnZGJfc2luZ2xlX3N0ZXAgPSAwOworI2lmZGVmIENPTkZJR19JUElQRQorCWtnZGJfYXJjaF9pbWFzayA9IDA7CisjZW5kaWYKIAogCWJmaW5fcmVtb3ZlX2FsbF9od19icmVhaygpOwogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9rZXJuZWwva2dkYl90ZXN0LmMgYi9hcmNoL2JsYWNrZmluL2tlcm5lbC9rZ2RiX3Rlc3QuYwppbmRleCAwOGMwMjM2Li4yYTZlOWRiIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2tlcm5lbC9rZ2RiX3Rlc3QuYworKysgYi9hcmNoL2JsYWNrZmluL2tlcm5lbC9rZ2RiX3Rlc3QuYwpAQCAtOTUsNiArOTUsMTAgQEAKIHsKIAlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmVudHJ5OwogCisjaWYgTDJfTEVOR1RICisJbnVtMiA9IDA7CisjZW5kaWYKKwogCWVudHJ5ID0gcHJvY19jcmVhdGUoImtnZGJ0ZXN0IiwgMCwgTlVMTCwgJmtnZGJfdGVzdF9wcm9jX2ZvcHMpOwogCWlmIChlbnRyeSA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT01FTTsKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9ib2FyZHMvZXpicmQuYyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9ib2FyZHMvZXpicmQuYwppbmRleCBiODk0YzhhLi5jMGNjYWRjIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvYm9hcmRzL2V6YnJkLmMKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2JvYXJkcy9lemJyZC5jCkBAIC0xMDQsMjQgKzEwNCwyMyBAQAogCiBzdGF0aWMgc3RydWN0IGJmaW5fcGh5ZGV2X3BsYXRmb3JtX2RhdGEgYmZpbl9waHlkZXZfZGF0YVtdID0gewogCXsKLQkJLmFkZHIgPSAxLAotCQkuaXJxID0gSVJRX01BQ19QSFlJTlQsCi0JfSwKLQl7Ci0JCS5hZGRyID0gMiwKLQkJLmlycSA9IElSUV9NQUNfUEhZSU5ULAotCX0sCi0JeworI2lmIGRlZmluZWQoQ09ORklHX05FVF9EU0FfS1NaODg5M00pIHx8IGRlZmluZWQoQ09ORklHX05FVF9EU0FfS1NaODg5M01fTU9EVUxFKQogCQkuYWRkciA9IDMsCisjZWxzZQorCQkuYWRkciA9IDEsCisjZW5kaWYKIAkJLmlycSA9IElSUV9NQUNfUEhZSU5ULAogCX0sCiB9OwogCiBzdGF0aWMgc3RydWN0IGJmaW5fbWlpX2J1c19wbGF0Zm9ybV9kYXRhIGJmaW5fbWlpX2J1c19kYXRhID0gewotCS5waHlkZXZfbnVtYmVyID0gMywKKwkucGh5ZGV2X251bWJlciA9IDEsCiAJLnBoeWRldl9kYXRhID0gYmZpbl9waHlkZXZfZGF0YSwKIAkucGh5X21vZGUgPSBQSFlfSU5URVJGQUNFX01PREVfTUlJLAogCS5tYWNfcGVyaXBoZXJhbHMgPSBiZmluX21hY19wZXJpcGhlcmFscywKKyNpZiBkZWZpbmVkKENPTkZJR19ORVRfRFNBX0tTWjg4OTNNKSB8fCBkZWZpbmVkKENPTkZJR19ORVRfRFNBX0tTWjg4OTNNX01PRFVMRSkKKwkucGh5X21hc2sgPSAweGZmZjcsIC8qIE9ubHkgcHJvYmUgdGhlIHBvcnQgcGh5IGNvbm5lY3QgdG8gdGhlIG9uIGNoaXAgTUFDICovCisjZW5kaWYKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGJmaW5fbWlpX2J1cyA9IHsKQEAgLTQ1Myw3ICs0NTIsNyBAQAogCX0sCiB9OwogCi11bnNpZ25lZCBzaG9ydCBiZmluX3VhcnQwX3BlcmlwaGVyYWxzW10gPSB7CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgYmZpbl91YXJ0MF9wZXJpcGhlcmFsc1tdID0gewogCVBfVUFSVDBfVFgsIFBfVUFSVDBfUlgsIDAKIH07CiAKQEAgLTQ5Niw3ICs0OTUsNyBAQAogCX0sCiB9OwogCi11bnNpZ25lZCBzaG9ydCBiZmluX3VhcnQxX3BlcmlwaGVyYWxzW10gPSB7CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgYmZpbl91YXJ0MV9wZXJpcGhlcmFsc1tdID0gewogCVBfVUFSVDFfVFgsIFBfVUFSVDFfUlgsIDAKIH07CiAKQEAgLTYzNiw5ICs2MzUsOSBAQAogCX0sCiB9OwogCi11bnNpZ25lZCBzaG9ydCBiZmluX3Nwb3J0MF9wZXJpcGhlcmFsc1tdID0geworc3RhdGljIHVuc2lnbmVkIHNob3J0IGJmaW5fc3BvcnQwX3BlcmlwaGVyYWxzW10gPSB7CiAJUF9TUE9SVDBfVEZTLCBQX1NQT1JUMF9EVFBSSSwgUF9TUE9SVDBfVFNDTEssIFBfU1BPUlQwX1JGUywKLQlQX1NQT1JUMF9EUlBSSSwgUF9TUE9SVDBfUlNDTEssIFBfU1BPUlQwX0RSU0VDLCBQX1NQT1JUMF9EVFNFQywgMAorCVBfU1BPUlQwX0RSUFJJLCBQX1NQT1JUMF9SU0NMSywgMAogfTsKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYmZpbl9zcG9ydDBfdWFydF9kZXZpY2UgPSB7CkBAIC02NzAsOSArNjY5LDkgQEAKIAl9LAogfTsKIAotdW5zaWduZWQgc2hvcnQgYmZpbl9zcG9ydDFfcGVyaXBoZXJhbHNbXSA9IHsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBiZmluX3Nwb3J0MV9wZXJpcGhlcmFsc1tdID0gewogCVBfU1BPUlQxX1RGUywgUF9TUE9SVDFfRFRQUkksIFBfU1BPUlQxX1RTQ0xLLCBQX1NQT1JUMV9SRlMsCi0JUF9TUE9SVDFfRFJQUkksIFBfU1BPUlQxX1JTQ0xLLCBQX1NQT1JUMV9EUlNFQywgUF9TUE9SVDFfRFRTRUMsIDAKKwlQX1NQT1JUMV9EUlBSSSwgUF9TUE9SVDFfUlNDTEssIDAKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGJmaW5fc3BvcnQxX3VhcnRfZGV2aWNlID0gewpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2JvYXJkcy90Y20tYmY1MTguYyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9ib2FyZHMvdGNtLWJmNTE4LmMKaW5kZXggZTZjZTFkNy4uNTBmYzVjOCAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2JvYXJkcy90Y20tYmY1MTguYworKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvYm9hcmRzL3RjbS1iZjUxOC5jCkBAIC0zNzcsNyArMzc3LDcgQEAKIAl9LAogfTsKIAotdW5zaWduZWQgc2hvcnQgYmZpbl91YXJ0MF9wZXJpcGhlcmFsc1tdID0geworc3RhdGljIHVuc2lnbmVkIHNob3J0IGJmaW5fdWFydDBfcGVyaXBoZXJhbHNbXSA9IHsKIAlQX1VBUlQwX1RYLCBQX1VBUlQwX1JYLCAwCiB9OwogCkBAIC00MjAsNyArNDIwLDcgQEAKIAl9LAogfTsKIAotdW5zaWduZWQgc2hvcnQgYmZpbl91YXJ0MV9wZXJpcGhlcmFsc1tdID0geworc3RhdGljIHVuc2lnbmVkIHNob3J0IGJmaW5fdWFydDFfcGVyaXBoZXJhbHNbXSA9IHsKIAlQX1VBUlQxX1RYLCBQX1VBUlQxX1JYLCAwCiB9OwogCkBAIC01NDcsOSArNTQ3LDkgQEAKIAl9LAogfTsKIAotdW5zaWduZWQgc2hvcnQgYmZpbl9zcG9ydDBfcGVyaXBoZXJhbHNbXSA9IHsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBiZmluX3Nwb3J0MF9wZXJpcGhlcmFsc1tdID0gewogCVBfU1BPUlQwX1RGUywgUF9TUE9SVDBfRFRQUkksIFBfU1BPUlQwX1RTQ0xLLCBQX1NQT1JUMF9SRlMsCi0JUF9TUE9SVDBfRFJQUkksIFBfU1BPUlQwX1JTQ0xLLCBQX1NQT1JUMF9EUlNFQywgUF9TUE9SVDBfRFRTRUMsIDAKKwlQX1NQT1JUMF9EUlBSSSwgUF9TUE9SVDBfUlNDTEssIDAKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGJmaW5fc3BvcnQwX3VhcnRfZGV2aWNlID0gewpAQCAtNTgxLDkgKzU4MSw5IEBACiAJfSwKIH07CiAKLXVuc2lnbmVkIHNob3J0IGJmaW5fc3BvcnQxX3BlcmlwaGVyYWxzW10gPSB7CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgYmZpbl9zcG9ydDFfcGVyaXBoZXJhbHNbXSA9IHsKIAlQX1NQT1JUMV9URlMsIFBfU1BPUlQxX0RUUFJJLCBQX1NQT1JUMV9UU0NMSywgUF9TUE9SVDFfUkZTLAotCVBfU1BPUlQxX0RSUFJJLCBQX1NQT1JUMV9SU0NMSywgUF9TUE9SVDFfRFJTRUMsIFBfU1BPUlQxX0RUU0VDLCAwCisJUF9TUE9SVDFfRFJQUkksIFBfU1BPUlQxX1JTQ0xLLCAwCiB9OwogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZmluX3Nwb3J0MV91YXJ0X2RldmljZSA9IHsKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9kbWEuYyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9kbWEuYwppbmRleCA3OGI0MzYwLi5iY2QxZmJjIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvZG1hLmMKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2RtYS5jCkBAIC0xMSw3ICsxMSw3IEBACiAjaW5jbHVkZSA8YXNtL2JsYWNrZmluLmg+CiAjaW5jbHVkZSA8YXNtL2RtYS5oPgogCi1zdHJ1Y3QgZG1hX3JlZ2lzdGVyICpkbWFfaW9fYmFzZV9hZGRyW01BWF9ETUFfQ0hBTk5FTFNdID0geworc3RydWN0IGRtYV9yZWdpc3RlciAqIGNvbnN0IGRtYV9pb19iYXNlX2FkZHJbTUFYX0RNQV9DSEFOTkVMU10gPSB7CiAJKHN0cnVjdCBkbWFfcmVnaXN0ZXIgKikgRE1BMF9ORVhUX0RFU0NfUFRSLAogCShzdHJ1Y3QgZG1hX3JlZ2lzdGVyICopIERNQTFfTkVYVF9ERVNDX1BUUiwKIAkoc3RydWN0IGRtYV9yZWdpc3RlciAqKSBETUEyX05FWFRfREVTQ19QVFIsCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvaW5jbHVkZS9tYWNoL2JmaW5fc2VyaWFsLmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvaW5jbHVkZS9tYWNoL2JmaW5fc2VyaWFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDBjNjAzZgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9pbmNsdWRlL21hY2gvYmZpbl9zZXJpYWwuaApAQCAtMCwwICsxLDE0IEBACisvKgorICogbWFjaC9iZmluX3NlcmlhbC5oIC0gQmxhY2tmaW4gVUFSVC9TZXJpYWwgZGVmaW5pdGlvbnMKKyAqCisgKiBDb3B5cmlnaHQgMjAwNi0yMDEwIEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCisgKi8KKworI2lmbmRlZiBfX0JGSU5fTUFDSF9TRVJJQUxfSF9fCisjZGVmaW5lIF9fQkZJTl9NQUNIX1NFUklBTF9IX18KKworI2RlZmluZSBCRklOX1VBUlRfTlJfUE9SVFMJMgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9pbmNsdWRlL21hY2gvYmZpbl9zZXJpYWxfNXh4LmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvaW5jbHVkZS9tYWNoL2JmaW5fc2VyaWFsXzV4eC5oCmluZGV4IDk3MGQzMTAuLmY2ZDkyNGEgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9pbmNsdWRlL21hY2gvYmZpbl9zZXJpYWxfNXh4LmgKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2luY2x1ZGUvbWFjaC9iZmluX3NlcmlhbF81eHguaApAQCAtNCwzNiArNCw5IEBACiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIKICAqLwogCi0jaW5jbHVkZSA8bGludXgvc2VyaWFsLmg+CiAjaW5jbHVkZSA8YXNtL2RtYS5oPgogI2luY2x1ZGUgPGFzbS9wb3J0bXV4Lmg+CiAKLSNkZWZpbmUgVUFSVF9HRVRfQ0hBUih1YXJ0KSAgICAgYmZpbl9yZWFkMTYoKCh1YXJ0KS0+cG9ydC5tZW1iYXNlICsgT0ZGU0VUX1JCUikpCi0jZGVmaW5lIFVBUlRfR0VUX0RMTCh1YXJ0KQliZmluX3JlYWQxNigoKHVhcnQpLT5wb3J0Lm1lbWJhc2UgKyBPRkZTRVRfRExMKSkKLSNkZWZpbmUgVUFSVF9HRVRfSUVSKHVhcnQpICAgICAgYmZpbl9yZWFkMTYoKCh1YXJ0KS0+cG9ydC5tZW1iYXNlICsgT0ZGU0VUX0lFUikpCi0jZGVmaW5lIFVBUlRfR0VUX0RMSCh1YXJ0KQliZmluX3JlYWQxNigoKHVhcnQpLT5wb3J0Lm1lbWJhc2UgKyBPRkZTRVRfRExIKSkKLSNkZWZpbmUgVUFSVF9HRVRfSUlSKHVhcnQpICAgICAgYmZpbl9yZWFkMTYoKCh1YXJ0KS0+cG9ydC5tZW1iYXNlICsgT0ZGU0VUX0lJUikpCi0jZGVmaW5lIFVBUlRfR0VUX0xDUih1YXJ0KSAgICAgIGJmaW5fcmVhZDE2KCgodWFydCktPnBvcnQubWVtYmFzZSArIE9GRlNFVF9MQ1IpKQotI2RlZmluZSBVQVJUX0dFVF9HQ1RMKHVhcnQpICAgICBiZmluX3JlYWQxNigoKHVhcnQpLT5wb3J0Lm1lbWJhc2UgKyBPRkZTRVRfR0NUTCkpCi0KLSNkZWZpbmUgVUFSVF9QVVRfQ0hBUih1YXJ0LCB2KSAgIGJmaW5fd3JpdGUxNigoKHVhcnQpLT5wb3J0Lm1lbWJhc2UgKyBPRkZTRVRfVEhSKSwgdikKLSNkZWZpbmUgVUFSVF9QVVRfRExMKHVhcnQsIHYpICAgIGJmaW5fd3JpdGUxNigoKHVhcnQpLT5wb3J0Lm1lbWJhc2UgKyBPRkZTRVRfRExMKSwgdikKLSNkZWZpbmUgVUFSVF9QVVRfSUVSKHVhcnQsIHYpICAgIGJmaW5fd3JpdGUxNigoKHVhcnQpLT5wb3J0Lm1lbWJhc2UgKyBPRkZTRVRfSUVSKSwgdikKLSNkZWZpbmUgVUFSVF9TRVRfSUVSKHVhcnQsIHYpICAgIFVBUlRfUFVUX0lFUih1YXJ0LCBVQVJUX0dFVF9JRVIodWFydCkgfCAodikpCi0jZGVmaW5lIFVBUlRfQ0xFQVJfSUVSKHVhcnQsIHYpICBVQVJUX1BVVF9JRVIodWFydCwgVUFSVF9HRVRfSUVSKHVhcnQpICYgfih2KSkKLSNkZWZpbmUgVUFSVF9QVVRfRExIKHVhcnQsIHYpICAgIGJmaW5fd3JpdGUxNigoKHVhcnQpLT5wb3J0Lm1lbWJhc2UgKyBPRkZTRVRfRExIKSwgdikKLSNkZWZpbmUgVUFSVF9QVVRfTENSKHVhcnQsIHYpICAgIGJmaW5fd3JpdGUxNigoKHVhcnQpLT5wb3J0Lm1lbWJhc2UgKyBPRkZTRVRfTENSKSwgdikKLSNkZWZpbmUgVUFSVF9QVVRfR0NUTCh1YXJ0LCB2KSAgIGJmaW5fd3JpdGUxNigoKHVhcnQpLT5wb3J0Lm1lbWJhc2UgKyBPRkZTRVRfR0NUTCksIHYpCi0KLSNkZWZpbmUgVUFSVF9TRVRfRExBQih1YXJ0KSAgICAgZG8geyBVQVJUX1BVVF9MQ1IodWFydCwgVUFSVF9HRVRfTENSKHVhcnQpIHwgRExBQik7IFNTWU5DKCk7IH0gd2hpbGUgKDApCi0jZGVmaW5lIFVBUlRfQ0xFQVJfRExBQih1YXJ0KSAgIGRvIHsgVUFSVF9QVVRfTENSKHVhcnQsIFVBUlRfR0VUX0xDUih1YXJ0KSAmIH5ETEFCKTsgU1NZTkMoKTsgfSB3aGlsZSAoMCkKLQotI2RlZmluZSBVQVJUX0dFVF9DVFMoeCkgZ3Bpb19nZXRfdmFsdWUoeC0+Y3RzX3BpbikKLSNkZWZpbmUgVUFSVF9ESVNBQkxFX1JUUyh4KSBncGlvX3NldF92YWx1ZSh4LT5ydHNfcGluLCAxKQotI2RlZmluZSBVQVJUX0VOQUJMRV9SVFMoeCkgZ3Bpb19zZXRfdmFsdWUoeC0+cnRzX3BpbiwgMCkKLSNkZWZpbmUgVUFSVF9FTkFCTEVfSU5UUyh4LCB2KSBVQVJUX1BVVF9JRVIoeCwgdikKLSNkZWZpbmUgVUFSVF9ESVNBQkxFX0lOVFMoeCkgVUFSVF9QVVRfSUVSKHgsIDApCi0KICNpZiBkZWZpbmVkKENPTkZJR19CRklOX1VBUlQwX0NUU1JUUykgfHwgZGVmaW5lZChDT05GSUdfQkZJTl9VQVJUMV9DVFNSVFMpCiAjIGRlZmluZSBDT05GSUdfU0VSSUFMX0JGSU5fQ1RTUlRTCiAKQEAgLTU0LDUwICsyNyw2IEBACiAjIGVuZGlmCiAjZW5kaWYKIAotI2RlZmluZSBCRklOX1VBUlRfVFhfRklGT19TSVpFCTIKLQotLyoKLSAqIFRoZSBwaW4gY29uZmlndXJhdGlvbiBpcyBkaWZmZXJlbnQgZnJvbSBzY2hlbWF0aWMKLSAqLwotc3RydWN0IGJmaW5fc2VyaWFsX3BvcnQgewotCXN0cnVjdCB1YXJ0X3BvcnQgcG9ydDsKLQl1bnNpZ25lZCBpbnQgb2xkX3N0YXR1czsKLQlpbnQgc3RhdHVzX2lycTsKLQl1bnNpZ25lZCBpbnQgbHNyOwotI2lmZGVmIENPTkZJR19TRVJJQUxfQkZJTl9ETUEKLQlpbnQgdHhfZG9uZTsKLQlpbnQgdHhfY291bnQ7Ci0Jc3RydWN0IGNpcmNfYnVmIHJ4X2RtYV9idWY7Ci0Jc3RydWN0IHRpbWVyX2xpc3QgcnhfZG1hX3RpbWVyOwotCWludCByeF9kbWFfbnJvd3M7Ci0JdW5zaWduZWQgaW50IHR4X2RtYV9jaGFubmVsOwotCXVuc2lnbmVkIGludCByeF9kbWFfY2hhbm5lbDsKLQlzdHJ1Y3Qgd29ya19zdHJ1Y3QgdHhfZG1hX3dvcmtxdWV1ZTsKLSNlbmRpZgotI2lmZGVmIENPTkZJR19TRVJJQUxfQkZJTl9DVFNSVFMKLQlzdHJ1Y3QgdGltZXJfbGlzdCBjdHNfdGltZXI7Ci0JaW50IGN0c19waW47Ci0JaW50IHJ0c19waW47Ci0jZW5kaWYKLX07Ci0KLS8qIFRoZSBoYXJkd2FyZSBjbGVhcnMgdGhlIExTUiBiaXRzIHVwb24gcmVhZCwgc28gd2UgbmVlZCB0byBjYWNoZQotICogc29tZSBvZiB0aGUgbW9yZSBmdW4gYml0cyBpbiBzb2Z0d2FyZSBzbyB0aGV5IGRvbid0IGdldCBsb3N0Ci0gKiB3aGVuIGNoZWNraW5nIHRoZSBMU1IgaW4gb3RoZXIgY29kZSBwYXRocyAoVFgpLgotICovCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBVQVJUX0dFVF9MU1Ioc3RydWN0IGJmaW5fc2VyaWFsX3BvcnQgKnVhcnQpCi17Ci0JdW5zaWduZWQgaW50IGxzciA9IGJmaW5fcmVhZDE2KHVhcnQtPnBvcnQubWVtYmFzZSArIE9GRlNFVF9MU1IpOwotCXVhcnQtPmxzciB8PSAobHNyICYgKEJJfEZFfFBFfE9FKSk7Ci0JcmV0dXJuIGxzciB8IHVhcnQtPmxzcjsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIFVBUlRfQ0xFQVJfTFNSKHN0cnVjdCBiZmluX3NlcmlhbF9wb3J0ICp1YXJ0KQotewotCXVhcnQtPmxzciA9IDA7Ci0JYmZpbl93cml0ZTE2KHVhcnQtPnBvcnQubWVtYmFzZSArIE9GRlNFVF9MU1IsIC0xKTsKLX0KLQogc3RydWN0IGJmaW5fc2VyaWFsX3JlcyB7CiAJdW5zaWduZWQgbG9uZyB1YXJ0X2Jhc2VfYWRkcjsKIAlpbnQgdWFydF9pcnE7CkBAIC0xNDYsMyArNzUsNSBAQAogfTsKIAogI2RlZmluZSBEUklWRVJfTkFNRSAiYmZpbi11YXJ0IgorCisjaW5jbHVkZSA8YXNtL2JmaW5fc2VyaWFsLmg+CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvaW5jbHVkZS9tYWNoL2JsYWNrZmluLmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvaW5jbHVkZS9tYWNoL2JsYWNrZmluLmgKaW5kZXggOTA1MzQ2Mi4uYTg4Mjg4NiAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2luY2x1ZGUvbWFjaC9ibGFja2Zpbi5oCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9pbmNsdWRlL21hY2gvYmxhY2tmaW4uaApAQCAtMSw2MSArMSw0MyBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA4LTIwMDkgQW5hbG9nIERldmljZXMgSW5jLgorICogQ29weXJpZ2h0IDIwMDgtMjAxMCBBbmFsb2cgRGV2aWNlcyBJbmMuCiAgKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCiAgKi8KIAogI2lmbmRlZiBfTUFDSF9CTEFDS0ZJTl9IXwogI2RlZmluZSBfTUFDSF9CTEFDS0ZJTl9IXwogCiAjaW5jbHVkZSAiYmY1MTguaCIKLSNpbmNsdWRlICJkZWZCRjUxMi5oIgogI2luY2x1ZGUgImFub21hbHkuaCIKIAotI2lmIGRlZmluZWQoQ09ORklHX0JGNTE4KQotI2luY2x1ZGUgImRlZkJGNTE4LmgiCisjaW5jbHVkZSA8YXNtL2RlZl9MUEJsYWNrZmluLmg+CisjaWZkZWYgQ09ORklHX0JGNTEyCisjIGluY2x1ZGUgImRlZkJGNTEyLmgiCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfQkY1MTQKKyMgaW5jbHVkZSAiZGVmQkY1MTQuaCIKKyNlbmRpZgorI2lmZGVmIENPTkZJR19CRjUxNgorIyBpbmNsdWRlICJkZWZCRjUxNi5oIgorI2VuZGlmCisjaWZkZWYgQ09ORklHX0JGNTE4CisjIGluY2x1ZGUgImRlZkJGNTE4LmgiCiAjZW5kaWYKIAotI2lmIGRlZmluZWQoQ09ORklHX0JGNTE2KQotI2luY2x1ZGUgImRlZkJGNTE2LmgiCisjaWZuZGVmIF9fQVNTRU1CTFlfXworIyBpbmNsdWRlIDxhc20vY2RlZl9MUEJsYWNrZmluLmg+CisjIGlmZGVmIENPTkZJR19CRjUxMgorIyAgaW5jbHVkZSAiY2RlZkJGNTEyLmgiCisjIGVuZGlmCisjIGlmZGVmIENPTkZJR19CRjUxNAorIyAgaW5jbHVkZSAiY2RlZkJGNTE0LmgiCisjIGVuZGlmCisjIGlmZGVmIENPTkZJR19CRjUxNgorIyAgaW5jbHVkZSAiY2RlZkJGNTE2LmgiCisjIGVuZGlmCisjIGlmZGVmIENPTkZJR19CRjUxOAorIyAgaW5jbHVkZSAiY2RlZkJGNTE4LmgiCisjIGVuZGlmCiAjZW5kaWYKIAotI2lmIGRlZmluZWQoQ09ORklHX0JGNTE0KQotI2luY2x1ZGUgImRlZkJGNTE0LmgiCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoQ09ORklHX0JGNTEyKQotI2luY2x1ZGUgImRlZkJGNTEyLmgiCi0jZW5kaWYKLQotI2lmICFkZWZpbmVkKF9fQVNTRU1CTFlfXykKLSNpbmNsdWRlICJjZGVmQkY1MTIuaCIKLQotI2lmIGRlZmluZWQoQ09ORklHX0JGNTE4KQotI2luY2x1ZGUgImNkZWZCRjUxOC5oIgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKENPTkZJR19CRjUxNikKLSNpbmNsdWRlICJjZGVmQkY1MTYuaCIKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChDT05GSUdfQkY1MTQpCi0jaW5jbHVkZSAiY2RlZkJGNTE0LmgiCi0jZW5kaWYKLSNlbmRpZgotCi0jZGVmaW5lIEJGSU5fVUFSVF9OUl9QT1JUUwkyCi0KLSNkZWZpbmUgT0ZGU0VUX1RIUiAgICAgICAgICAgICAgMHgwMAkvKiBUcmFuc21pdCBIb2xkaW5nIHJlZ2lzdGVyICAgICAgICAgICAgKi8KLSNkZWZpbmUgT0ZGU0VUX1JCUiAgICAgICAgICAgICAgMHgwMAkvKiBSZWNlaXZlIEJ1ZmZlciByZWdpc3RlciAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgT0ZGU0VUX0RMTCAgICAgICAgICAgICAgMHgwMAkvKiBEaXZpc29yIExhdGNoIChMb3ctQnl0ZSkgICAgICAgICAgICAgKi8KLSNkZWZpbmUgT0ZGU0VUX0lFUiAgICAgICAgICAgICAgMHgwNAkvKiBJbnRlcnJ1cHQgRW5hYmxlIFJlZ2lzdGVyICAgICAgICAgICAgKi8KLSNkZWZpbmUgT0ZGU0VUX0RMSCAgICAgICAgICAgICAgMHgwNAkvKiBEaXZpc29yIExhdGNoIChIaWdoLUJ5dGUpICAgICAgICAgICAgKi8KLSNkZWZpbmUgT0ZGU0VUX0lJUiAgICAgICAgICAgICAgMHgwOAkvKiBJbnRlcnJ1cHQgSWRlbnRpZmljYXRpb24gUmVnaXN0ZXIgICAgKi8KLSNkZWZpbmUgT0ZGU0VUX0xDUiAgICAgICAgICAgICAgMHgwQwkvKiBMaW5lIENvbnRyb2wgUmVnaXN0ZXIgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgT0ZGU0VUX01DUiAgICAgICAgICAgICAgMHgxMAkvKiBNb2RlbSBDb250cm9sIFJlZ2lzdGVyICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgT0ZGU0VUX0xTUiAgICAgICAgICAgICAgMHgxNAkvKiBMaW5lIFN0YXR1cyBSZWdpc3RlciAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgT0ZGU0VUX01TUiAgICAgICAgICAgICAgMHgxOAkvKiBNb2RlbSBTdGF0dXMgUmVnaXN0ZXIgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgT0ZGU0VUX1NDUiAgICAgICAgICAgICAgMHgxQwkvKiBTQ1IgU2NyYXRjaCBSZWdpc3RlciAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgT0ZGU0VUX0dDVEwgICAgICAgICAgICAgMHgyNAkvKiBHbG9iYWwgQ29udHJvbCBSZWdpc3RlciAgICAgICAgICAgICAgKi8KLQogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvaW5jbHVkZS9tYWNoL2NkZWZCRjUxMi5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2luY2x1ZGUvbWFjaC9jZGVmQkY1MTIuaAppbmRleCA0OTMwMjBkLi5iNjU3ZDM3IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvaW5jbHVkZS9tYWNoL2NkZWZCRjUxMi5oCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9pbmNsdWRlL21hY2gvY2RlZkJGNTEyLmgKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDgtMjAwOSBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKiBDb3B5cmlnaHQgMjAwOC0yMDEwIEFuYWxvZyBEZXZpY2VzIEluYy4KICAqCiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgQURJIEJTRCBsaWNlbnNlIG9yIHRoZSBHUEwtMiAob3IgbGF0ZXIpCiAgKi8KQEAgLTcsMTUgKzcsMTAzNyBAQAogI2lmbmRlZiBfQ0RFRl9CRjUxMl9ICiAjZGVmaW5lIF9DREVGX0JGNTEyX0gKIAotLyogaW5jbHVkZSBhbGwgQ29yZSByZWdpc3RlcnMgYW5kIGJpdCBkZWZpbml0aW9ucyAqLwotI2luY2x1ZGUgImRlZkJGNTEyLmgiCisvKiBDbG9jayBhbmQgU3lzdGVtIENvbnRyb2wJKDB4RkZDMDAwMDAgLSAweEZGQzAwMEZGKQkJCQkJCQkJKi8KKyNkZWZpbmUgYmZpbl9yZWFkX1BMTF9DVEwoKQkJCWJmaW5fcmVhZDE2KFBMTF9DVEwpCisjZGVmaW5lIGJmaW5fcmVhZF9QTExfRElWKCkJCQliZmluX3JlYWQxNihQTExfRElWKQorI2RlZmluZSBiZmluX3dyaXRlX1BMTF9ESVYodmFsKQkJCWJmaW5fd3JpdGUxNihQTExfRElWLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9WUl9DVEwoKQkJCWJmaW5fcmVhZDE2KFZSX0NUTCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BMTF9TVEFUKCkJCQliZmluX3JlYWQxNihQTExfU1RBVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9QTExfU1RBVCh2YWwpCQliZmluX3dyaXRlMTYoUExMX1NUQVQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BMTF9MT0NLQ05UKCkJCQliZmluX3JlYWQxNihQTExfTE9DS0NOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9QTExfTE9DS0NOVCh2YWwpCQliZmluX3dyaXRlMTYoUExMX0xPQ0tDTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NISVBJRCgpCQkJYmZpbl9yZWFkMzIoQ0hJUElEKQorI2RlZmluZSBiZmluX3dyaXRlX0NISVBJRCh2YWwpCQkJYmZpbl93cml0ZTMyKENISVBJRCwgdmFsKQogCi0vKiBpbmNsdWRlIGNvcmUgc3BlY2lmaWMgcmVnaXN0ZXIgcG9pbnRlciBkZWZpbml0aW9ucyAqLwotI2luY2x1ZGUgPGFzbS9jZGVmX0xQQmxhY2tmaW4uaD4KIAotLyogU1lTVEVNICYgTU1SIEFERFJFU1MgREVGSU5JVElPTlMgRk9SIEFEU1AtQkY1MTIgKi8KKy8qIFN5c3RlbSBJbnRlcnJ1cHQgQ29udHJvbGxlciAoMHhGRkMwMDEwMCAtIDB4RkZDMDAxRkYpCQkJCQkJCSovCisjZGVmaW5lIGJmaW5fcmVhZF9TV1JTVCgpCQkJYmZpbl9yZWFkMTYoU1dSU1QpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1dSU1QodmFsKQkJCWJmaW5fd3JpdGUxNihTV1JTVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1lTQ1IoKQkJCWJmaW5fcmVhZDE2KFNZU0NSKQorI2RlZmluZSBiZmluX3dyaXRlX1NZU0NSKHZhbCkJCQliZmluX3dyaXRlMTYoU1lTQ1IsIHZhbCkKIAotLyogaW5jbHVkZSBjZGVmQkY1MXhfYmFzZS5oIGZvciB0aGUgc2V0IG9mICNkZWZpbmVzIHRoYXQgYXJlIGNvbW1vbiB0byBhbGwgQURTUC1CRjUxeCBwcm9jZXNzb3JzICovCi0jaW5jbHVkZSAiY2RlZkJGNTF4X2Jhc2UuaCIKKyNkZWZpbmUgYmZpbl9yZWFkX1NJQ19SVkVDVCgpCQkJYmZpbl9yZWFkMzIoU0lDX1JWRUNUKQorI2RlZmluZSBiZmluX3dyaXRlX1NJQ19SVkVDVCh2YWwpCQliZmluX3dyaXRlMzIoU0lDX1JWRUNULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TSUNfSU1BU0swKCkJCQliZmluX3JlYWQzMihTSUNfSU1BU0swKQorI2RlZmluZSBiZmluX3dyaXRlX1NJQ19JTUFTSzAodmFsKQkJYmZpbl93cml0ZTMyKFNJQ19JTUFTSzAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NJQ19JTUFTSyh4KQkJCWJmaW5fcmVhZDMyKFNJQ19JTUFTSzAgKyAoeCA8PCA2KSkKKyNkZWZpbmUgYmZpbl93cml0ZV9TSUNfSU1BU0soeCwgdmFsKQkJYmZpbl93cml0ZTMyKChTSUNfSU1BU0swICsgKHggPDwgNikpLCB2YWwpCisKKyNkZWZpbmUgYmZpbl9yZWFkX1NJQ19JQVIwKCkJCQliZmluX3JlYWQzMihTSUNfSUFSMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9TSUNfSUFSMCh2YWwpCQliZmluX3dyaXRlMzIoU0lDX0lBUjAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NJQ19JQVIxKCkJCQliZmluX3JlYWQzMihTSUNfSUFSMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9TSUNfSUFSMSh2YWwpCQliZmluX3dyaXRlMzIoU0lDX0lBUjEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NJQ19JQVIyKCkJCQliZmluX3JlYWQzMihTSUNfSUFSMikKKyNkZWZpbmUgYmZpbl93cml0ZV9TSUNfSUFSMih2YWwpCQliZmluX3dyaXRlMzIoU0lDX0lBUjIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NJQ19JQVIzKCkJCQliZmluX3JlYWQzMihTSUNfSUFSMykKKyNkZWZpbmUgYmZpbl93cml0ZV9TSUNfSUFSMyh2YWwpCQliZmluX3dyaXRlMzIoU0lDX0lBUjMsIHZhbCkKKworI2RlZmluZSBiZmluX3JlYWRfU0lDX0lTUjAoKQkJCWJmaW5fcmVhZDMyKFNJQ19JU1IwKQorI2RlZmluZSBiZmluX3dyaXRlX1NJQ19JU1IwKHZhbCkJCWJmaW5fd3JpdGUzMihTSUNfSVNSMCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU0lDX0lTUih4KQkJCWJmaW5fcmVhZDMyKFNJQ19JU1IwICsgKHggPDwgNikpCisjZGVmaW5lIGJmaW5fd3JpdGVfU0lDX0lTUih4LCB2YWwpCQliZmluX3dyaXRlMzIoKFNJQ19JU1IwICsgKHggPDwgNikpLCB2YWwpCisKKyNkZWZpbmUgYmZpbl9yZWFkX1NJQ19JV1IwKCkJCQliZmluX3JlYWQzMihTSUNfSVdSMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9TSUNfSVdSMCh2YWwpCQliZmluX3dyaXRlMzIoU0lDX0lXUjAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NJQ19JV1IoeCkJCQliZmluX3JlYWQzMihTSUNfSVdSMCArICh4IDw8IDYpKQorI2RlZmluZSBiZmluX3dyaXRlX1NJQ19JV1IoeCwgdmFsKQkJYmZpbl93cml0ZTMyKChTSUNfSVdSMCArICh4IDw8IDYpKSwgdmFsKQorCisvKiBTSUMgQWRkaXRpb25zIHRvIEFEU1AtQkY1MXggKDB4RkZDMDAxNEMgLSAweEZGQzAwMTYyKSAqLworCisjZGVmaW5lIGJmaW5fcmVhZF9TSUNfSU1BU0sxKCkJCQliZmluX3JlYWQzMihTSUNfSU1BU0sxKQorI2RlZmluZSBiZmluX3dyaXRlX1NJQ19JTUFTSzEodmFsKQkJYmZpbl93cml0ZTMyKFNJQ19JTUFTSzEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NJQ19JQVI0KCkJCQliZmluX3JlYWQzMihTSUNfSUFSNCkKKyNkZWZpbmUgYmZpbl93cml0ZV9TSUNfSUFSNCh2YWwpCQliZmluX3dyaXRlMzIoU0lDX0lBUjQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NJQ19JQVI1KCkJCQliZmluX3JlYWQzMihTSUNfSUFSNSkKKyNkZWZpbmUgYmZpbl93cml0ZV9TSUNfSUFSNSh2YWwpCQliZmluX3dyaXRlMzIoU0lDX0lBUjUsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NJQ19JQVI2KCkJCQliZmluX3JlYWQzMihTSUNfSUFSNikKKyNkZWZpbmUgYmZpbl93cml0ZV9TSUNfSUFSNih2YWwpCQliZmluX3dyaXRlMzIoU0lDX0lBUjYsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NJQ19JQVI3KCkJCQliZmluX3JlYWQzMihTSUNfSUFSNykKKyNkZWZpbmUgYmZpbl93cml0ZV9TSUNfSUFSNyh2YWwpCQliZmluX3dyaXRlMzIoU0lDX0lBUjcsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NJQ19JU1IxKCkJCQliZmluX3JlYWQzMihTSUNfSVNSMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9TSUNfSVNSMSh2YWwpCQliZmluX3dyaXRlMzIoU0lDX0lTUjEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NJQ19JV1IxKCkJCQliZmluX3JlYWQzMihTSUNfSVdSMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9TSUNfSVdSMSh2YWwpCQliZmluX3dyaXRlMzIoU0lDX0lXUjEsIHZhbCkKKworLyogV2F0Y2hkb2cgVGltZXIJCSgweEZGQzAwMjAwIC0gMHhGRkMwMDJGRikJCQkJCQkJCQkqLworI2RlZmluZSBiZmluX3JlYWRfV0RPR19DVEwoKQkJCWJmaW5fcmVhZDE2KFdET0dfQ1RMKQorI2RlZmluZSBiZmluX3dyaXRlX1dET0dfQ1RMKHZhbCkJCWJmaW5fd3JpdGUxNihXRE9HX0NUTCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfV0RPR19DTlQoKQkJCWJmaW5fcmVhZDMyKFdET0dfQ05UKQorI2RlZmluZSBiZmluX3dyaXRlX1dET0dfQ05UKHZhbCkJCWJmaW5fd3JpdGUzMihXRE9HX0NOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfV0RPR19TVEFUKCkJCQliZmluX3JlYWQzMihXRE9HX1NUQVQpCisjZGVmaW5lIGJmaW5fd3JpdGVfV0RPR19TVEFUKHZhbCkJCWJmaW5fd3JpdGUzMihXRE9HX1NUQVQsIHZhbCkKKworCisvKiBSZWFsIFRpbWUgQ2xvY2sJCSgweEZGQzAwMzAwIC0gMHhGRkMwMDNGRikJCQkJCQkJCQkqLworI2RlZmluZSBiZmluX3JlYWRfUlRDX1NUQVQoKQkJCWJmaW5fcmVhZDMyKFJUQ19TVEFUKQorI2RlZmluZSBiZmluX3dyaXRlX1JUQ19TVEFUKHZhbCkJCWJmaW5fd3JpdGUzMihSVENfU1RBVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUlRDX0lDVEwoKQkJCWJmaW5fcmVhZDE2KFJUQ19JQ1RMKQorI2RlZmluZSBiZmluX3dyaXRlX1JUQ19JQ1RMKHZhbCkJCWJmaW5fd3JpdGUxNihSVENfSUNUTCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUlRDX0lTVEFUKCkJCQliZmluX3JlYWQxNihSVENfSVNUQVQpCisjZGVmaW5lIGJmaW5fd3JpdGVfUlRDX0lTVEFUKHZhbCkJCWJmaW5fd3JpdGUxNihSVENfSVNUQVQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1JUQ19TV0NOVCgpCQkJYmZpbl9yZWFkMTYoUlRDX1NXQ05UKQorI2RlZmluZSBiZmluX3dyaXRlX1JUQ19TV0NOVCh2YWwpCQliZmluX3dyaXRlMTYoUlRDX1NXQ05ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9SVENfQUxBUk0oKQkJCWJmaW5fcmVhZDMyKFJUQ19BTEFSTSkKKyNkZWZpbmUgYmZpbl93cml0ZV9SVENfQUxBUk0odmFsKQkJYmZpbl93cml0ZTMyKFJUQ19BTEFSTSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUlRDX0ZBU1QoKQkJCWJmaW5fcmVhZDE2KFJUQ19GQVNUKQorI2RlZmluZSBiZmluX3dyaXRlX1JUQ19GQVNUKHZhbCkJCWJmaW5fd3JpdGUxNihSVENfRkFTVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUlRDX1BSRU4oKQkJCWJmaW5fcmVhZDE2KFJUQ19QUkVOKQorI2RlZmluZSBiZmluX3dyaXRlX1JUQ19QUkVOKHZhbCkJCWJmaW5fd3JpdGUxNihSVENfUFJFTiwgdmFsKQorCisKKy8qIFVBUlQwIENvbnRyb2xsZXIJCSgweEZGQzAwNDAwIC0gMHhGRkMwMDRGRikJCQkJCQkJCQkqLworI2RlZmluZSBiZmluX3JlYWRfVUFSVDBfVEhSKCkJCQliZmluX3JlYWQxNihVQVJUMF9USFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfVUFSVDBfVEhSKHZhbCkJCWJmaW5fd3JpdGUxNihVQVJUMF9USFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1VBUlQwX1JCUigpCQkJYmZpbl9yZWFkMTYoVUFSVDBfUkJSKQorI2RlZmluZSBiZmluX3dyaXRlX1VBUlQwX1JCUih2YWwpCQliZmluX3dyaXRlMTYoVUFSVDBfUkJSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9VQVJUMF9ETEwoKQkJCWJmaW5fcmVhZDE2KFVBUlQwX0RMTCkKKyNkZWZpbmUgYmZpbl93cml0ZV9VQVJUMF9ETEwodmFsKQkJYmZpbl93cml0ZTE2KFVBUlQwX0RMTCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVUFSVDBfSUVSKCkJCQliZmluX3JlYWQxNihVQVJUMF9JRVIpCisjZGVmaW5lIGJmaW5fd3JpdGVfVUFSVDBfSUVSKHZhbCkJCWJmaW5fd3JpdGUxNihVQVJUMF9JRVIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1VBUlQwX0RMSCgpCQkJYmZpbl9yZWFkMTYoVUFSVDBfRExIKQorI2RlZmluZSBiZmluX3dyaXRlX1VBUlQwX0RMSCh2YWwpCQliZmluX3dyaXRlMTYoVUFSVDBfRExILCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9VQVJUMF9JSVIoKQkJCWJmaW5fcmVhZDE2KFVBUlQwX0lJUikKKyNkZWZpbmUgYmZpbl93cml0ZV9VQVJUMF9JSVIodmFsKQkJYmZpbl93cml0ZTE2KFVBUlQwX0lJUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVUFSVDBfTENSKCkJCQliZmluX3JlYWQxNihVQVJUMF9MQ1IpCisjZGVmaW5lIGJmaW5fd3JpdGVfVUFSVDBfTENSKHZhbCkJCWJmaW5fd3JpdGUxNihVQVJUMF9MQ1IsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1VBUlQwX01DUigpCQkJYmZpbl9yZWFkMTYoVUFSVDBfTUNSKQorI2RlZmluZSBiZmluX3dyaXRlX1VBUlQwX01DUih2YWwpCQliZmluX3dyaXRlMTYoVUFSVDBfTUNSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9VQVJUMF9MU1IoKQkJCWJmaW5fcmVhZDE2KFVBUlQwX0xTUikKKyNkZWZpbmUgYmZpbl93cml0ZV9VQVJUMF9MU1IodmFsKQkJYmZpbl93cml0ZTE2KFVBUlQwX0xTUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVUFSVDBfTVNSKCkJCQliZmluX3JlYWQxNihVQVJUMF9NU1IpCisjZGVmaW5lIGJmaW5fd3JpdGVfVUFSVDBfTVNSKHZhbCkJCWJmaW5fd3JpdGUxNihVQVJUMF9NU1IsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1VBUlQwX1NDUigpCQkJYmZpbl9yZWFkMTYoVUFSVDBfU0NSKQorI2RlZmluZSBiZmluX3dyaXRlX1VBUlQwX1NDUih2YWwpCQliZmluX3dyaXRlMTYoVUFSVDBfU0NSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9VQVJUMF9HQ1RMKCkJCQliZmluX3JlYWQxNihVQVJUMF9HQ1RMKQorI2RlZmluZSBiZmluX3dyaXRlX1VBUlQwX0dDVEwodmFsKQkJYmZpbl93cml0ZTE2KFVBUlQwX0dDVEwsIHZhbCkKKworCisvKiBUSU1FUjAtNyBSZWdpc3RlcnMJCSgweEZGQzAwNjAwIC0gMHhGRkMwMDZGRikJCQkJCQkJCSovCisjZGVmaW5lIGJmaW5fcmVhZF9USU1FUjBfQ09ORklHKCkJCWJmaW5fcmVhZDE2KFRJTUVSMF9DT05GSUcpCisjZGVmaW5lIGJmaW5fd3JpdGVfVElNRVIwX0NPTkZJRyh2YWwpCQliZmluX3dyaXRlMTYoVElNRVIwX0NPTkZJRywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVElNRVIwX0NPVU5URVIoKQkJYmZpbl9yZWFkMzIoVElNRVIwX0NPVU5URVIpCisjZGVmaW5lIGJmaW5fd3JpdGVfVElNRVIwX0NPVU5URVIodmFsKQkJYmZpbl93cml0ZTMyKFRJTUVSMF9DT1VOVEVSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9USU1FUjBfUEVSSU9EKCkJCWJmaW5fcmVhZDMyKFRJTUVSMF9QRVJJT0QpCisjZGVmaW5lIGJmaW5fd3JpdGVfVElNRVIwX1BFUklPRCh2YWwpCQliZmluX3dyaXRlMzIoVElNRVIwX1BFUklPRCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVElNRVIwX1dJRFRIKCkJCWJmaW5fcmVhZDMyKFRJTUVSMF9XSURUSCkKKyNkZWZpbmUgYmZpbl93cml0ZV9USU1FUjBfV0lEVEgodmFsKQkJYmZpbl93cml0ZTMyKFRJTUVSMF9XSURUSCwgdmFsKQorCisjZGVmaW5lIGJmaW5fcmVhZF9USU1FUjFfQ09ORklHKCkJCWJmaW5fcmVhZDE2KFRJTUVSMV9DT05GSUcpCisjZGVmaW5lIGJmaW5fd3JpdGVfVElNRVIxX0NPTkZJRyh2YWwpCQliZmluX3dyaXRlMTYoVElNRVIxX0NPTkZJRywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVElNRVIxX0NPVU5URVIoKQkJYmZpbl9yZWFkMzIoVElNRVIxX0NPVU5URVIpCisjZGVmaW5lIGJmaW5fd3JpdGVfVElNRVIxX0NPVU5URVIodmFsKQkJYmZpbl93cml0ZTMyKFRJTUVSMV9DT1VOVEVSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9USU1FUjFfUEVSSU9EKCkJCWJmaW5fcmVhZDMyKFRJTUVSMV9QRVJJT0QpCisjZGVmaW5lIGJmaW5fd3JpdGVfVElNRVIxX1BFUklPRCh2YWwpCQliZmluX3dyaXRlMzIoVElNRVIxX1BFUklPRCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVElNRVIxX1dJRFRIKCkJCWJmaW5fcmVhZDMyKFRJTUVSMV9XSURUSCkKKyNkZWZpbmUgYmZpbl93cml0ZV9USU1FUjFfV0lEVEgodmFsKQkJYmZpbl93cml0ZTMyKFRJTUVSMV9XSURUSCwgdmFsKQorCisjZGVmaW5lIGJmaW5fcmVhZF9USU1FUjJfQ09ORklHKCkJCWJmaW5fcmVhZDE2KFRJTUVSMl9DT05GSUcpCisjZGVmaW5lIGJmaW5fd3JpdGVfVElNRVIyX0NPTkZJRyh2YWwpCQliZmluX3dyaXRlMTYoVElNRVIyX0NPTkZJRywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVElNRVIyX0NPVU5URVIoKQkJYmZpbl9yZWFkMzIoVElNRVIyX0NPVU5URVIpCisjZGVmaW5lIGJmaW5fd3JpdGVfVElNRVIyX0NPVU5URVIodmFsKQkJYmZpbl93cml0ZTMyKFRJTUVSMl9DT1VOVEVSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9USU1FUjJfUEVSSU9EKCkJCWJmaW5fcmVhZDMyKFRJTUVSMl9QRVJJT0QpCisjZGVmaW5lIGJmaW5fd3JpdGVfVElNRVIyX1BFUklPRCh2YWwpCQliZmluX3dyaXRlMzIoVElNRVIyX1BFUklPRCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVElNRVIyX1dJRFRIKCkJCWJmaW5fcmVhZDMyKFRJTUVSMl9XSURUSCkKKyNkZWZpbmUgYmZpbl93cml0ZV9USU1FUjJfV0lEVEgodmFsKQkJYmZpbl93cml0ZTMyKFRJTUVSMl9XSURUSCwgdmFsKQorCisjZGVmaW5lIGJmaW5fcmVhZF9USU1FUjNfQ09ORklHKCkJCWJmaW5fcmVhZDE2KFRJTUVSM19DT05GSUcpCisjZGVmaW5lIGJmaW5fd3JpdGVfVElNRVIzX0NPTkZJRyh2YWwpCQliZmluX3dyaXRlMTYoVElNRVIzX0NPTkZJRywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVElNRVIzX0NPVU5URVIoKQkJYmZpbl9yZWFkMzIoVElNRVIzX0NPVU5URVIpCisjZGVmaW5lIGJmaW5fd3JpdGVfVElNRVIzX0NPVU5URVIodmFsKQkJYmZpbl93cml0ZTMyKFRJTUVSM19DT1VOVEVSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9USU1FUjNfUEVSSU9EKCkJCWJmaW5fcmVhZDMyKFRJTUVSM19QRVJJT0QpCisjZGVmaW5lIGJmaW5fd3JpdGVfVElNRVIzX1BFUklPRCh2YWwpCQliZmluX3dyaXRlMzIoVElNRVIzX1BFUklPRCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVElNRVIzX1dJRFRIKCkJCWJmaW5fcmVhZDMyKFRJTUVSM19XSURUSCkKKyNkZWZpbmUgYmZpbl93cml0ZV9USU1FUjNfV0lEVEgodmFsKQkJYmZpbl93cml0ZTMyKFRJTUVSM19XSURUSCwgdmFsKQorCisjZGVmaW5lIGJmaW5fcmVhZF9USU1FUjRfQ09ORklHKCkJCWJmaW5fcmVhZDE2KFRJTUVSNF9DT05GSUcpCisjZGVmaW5lIGJmaW5fd3JpdGVfVElNRVI0X0NPTkZJRyh2YWwpCQliZmluX3dyaXRlMTYoVElNRVI0X0NPTkZJRywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVElNRVI0X0NPVU5URVIoKQkJYmZpbl9yZWFkMzIoVElNRVI0X0NPVU5URVIpCisjZGVmaW5lIGJmaW5fd3JpdGVfVElNRVI0X0NPVU5URVIodmFsKQkJYmZpbl93cml0ZTMyKFRJTUVSNF9DT1VOVEVSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9USU1FUjRfUEVSSU9EKCkJCWJmaW5fcmVhZDMyKFRJTUVSNF9QRVJJT0QpCisjZGVmaW5lIGJmaW5fd3JpdGVfVElNRVI0X1BFUklPRCh2YWwpCQliZmluX3dyaXRlMzIoVElNRVI0X1BFUklPRCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVElNRVI0X1dJRFRIKCkJCWJmaW5fcmVhZDMyKFRJTUVSNF9XSURUSCkKKyNkZWZpbmUgYmZpbl93cml0ZV9USU1FUjRfV0lEVEgodmFsKQkJYmZpbl93cml0ZTMyKFRJTUVSNF9XSURUSCwgdmFsKQorCisjZGVmaW5lIGJmaW5fcmVhZF9USU1FUjVfQ09ORklHKCkJCWJmaW5fcmVhZDE2KFRJTUVSNV9DT05GSUcpCisjZGVmaW5lIGJmaW5fd3JpdGVfVElNRVI1X0NPTkZJRyh2YWwpCQliZmluX3dyaXRlMTYoVElNRVI1X0NPTkZJRywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVElNRVI1X0NPVU5URVIoKQkJYmZpbl9yZWFkMzIoVElNRVI1X0NPVU5URVIpCisjZGVmaW5lIGJmaW5fd3JpdGVfVElNRVI1X0NPVU5URVIodmFsKQkJYmZpbl93cml0ZTMyKFRJTUVSNV9DT1VOVEVSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9USU1FUjVfUEVSSU9EKCkJCWJmaW5fcmVhZDMyKFRJTUVSNV9QRVJJT0QpCisjZGVmaW5lIGJmaW5fd3JpdGVfVElNRVI1X1BFUklPRCh2YWwpCQliZmluX3dyaXRlMzIoVElNRVI1X1BFUklPRCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVElNRVI1X1dJRFRIKCkJCWJmaW5fcmVhZDMyKFRJTUVSNV9XSURUSCkKKyNkZWZpbmUgYmZpbl93cml0ZV9USU1FUjVfV0lEVEgodmFsKQkJYmZpbl93cml0ZTMyKFRJTUVSNV9XSURUSCwgdmFsKQorCisjZGVmaW5lIGJmaW5fcmVhZF9USU1FUjZfQ09ORklHKCkJCWJmaW5fcmVhZDE2KFRJTUVSNl9DT05GSUcpCisjZGVmaW5lIGJmaW5fd3JpdGVfVElNRVI2X0NPTkZJRyh2YWwpCQliZmluX3dyaXRlMTYoVElNRVI2X0NPTkZJRywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVElNRVI2X0NPVU5URVIoKQkJYmZpbl9yZWFkMzIoVElNRVI2X0NPVU5URVIpCisjZGVmaW5lIGJmaW5fd3JpdGVfVElNRVI2X0NPVU5URVIodmFsKQkJYmZpbl93cml0ZTMyKFRJTUVSNl9DT1VOVEVSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9USU1FUjZfUEVSSU9EKCkJCWJmaW5fcmVhZDMyKFRJTUVSNl9QRVJJT0QpCisjZGVmaW5lIGJmaW5fd3JpdGVfVElNRVI2X1BFUklPRCh2YWwpCQliZmluX3dyaXRlMzIoVElNRVI2X1BFUklPRCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVElNRVI2X1dJRFRIKCkJCWJmaW5fcmVhZDMyKFRJTUVSNl9XSURUSCkKKyNkZWZpbmUgYmZpbl93cml0ZV9USU1FUjZfV0lEVEgodmFsKQkJYmZpbl93cml0ZTMyKFRJTUVSNl9XSURUSCwgdmFsKQorCisjZGVmaW5lIGJmaW5fcmVhZF9USU1FUjdfQ09ORklHKCkJCWJmaW5fcmVhZDE2KFRJTUVSN19DT05GSUcpCisjZGVmaW5lIGJmaW5fd3JpdGVfVElNRVI3X0NPTkZJRyh2YWwpCQliZmluX3dyaXRlMTYoVElNRVI3X0NPTkZJRywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVElNRVI3X0NPVU5URVIoKQkJYmZpbl9yZWFkMzIoVElNRVI3X0NPVU5URVIpCisjZGVmaW5lIGJmaW5fd3JpdGVfVElNRVI3X0NPVU5URVIodmFsKQkJYmZpbl93cml0ZTMyKFRJTUVSN19DT1VOVEVSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9USU1FUjdfUEVSSU9EKCkJCWJmaW5fcmVhZDMyKFRJTUVSN19QRVJJT0QpCisjZGVmaW5lIGJmaW5fd3JpdGVfVElNRVI3X1BFUklPRCh2YWwpCQliZmluX3dyaXRlMzIoVElNRVI3X1BFUklPRCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVElNRVI3X1dJRFRIKCkJCWJmaW5fcmVhZDMyKFRJTUVSN19XSURUSCkKKyNkZWZpbmUgYmZpbl93cml0ZV9USU1FUjdfV0lEVEgodmFsKQkJYmZpbl93cml0ZTMyKFRJTUVSN19XSURUSCwgdmFsKQorCisjZGVmaW5lIGJmaW5fcmVhZF9USU1FUl9FTkFCTEUoKQkJYmZpbl9yZWFkMTYoVElNRVJfRU5BQkxFKQorI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSX0VOQUJMRSh2YWwpCQliZmluX3dyaXRlMTYoVElNRVJfRU5BQkxFLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9USU1FUl9ESVNBQkxFKCkJCWJmaW5fcmVhZDE2KFRJTUVSX0RJU0FCTEUpCisjZGVmaW5lIGJmaW5fd3JpdGVfVElNRVJfRElTQUJMRSh2YWwpCQliZmluX3dyaXRlMTYoVElNRVJfRElTQUJMRSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVElNRVJfU1RBVFVTKCkJCWJmaW5fcmVhZDMyKFRJTUVSX1NUQVRVUykKKyNkZWZpbmUgYmZpbl93cml0ZV9USU1FUl9TVEFUVVModmFsKQkJYmZpbl93cml0ZTMyKFRJTUVSX1NUQVRVUywgdmFsKQorCisKKy8qIEdlbmVyYWwgUHVycG9zZSBJL08gUG9ydCBGICgweEZGQzAwNzAwIC0gMHhGRkMwMDdGRikJCQkJCQkJCSovCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JURklPKCkJCQliZmluX3JlYWQxNihQT1JURklPKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRGSU8odmFsKQkJCWJmaW5fd3JpdGUxNihQT1JURklPLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JURklPX0NMRUFSKCkJCWJmaW5fcmVhZDE2KFBPUlRGSU9fQ0xFQVIpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEZJT19DTEVBUih2YWwpCQliZmluX3dyaXRlMTYoUE9SVEZJT19DTEVBUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEZJT19TRVQoKQkJCWJmaW5fcmVhZDE2KFBPUlRGSU9fU0VUKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRGSU9fU0VUKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JURklPX1NFVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEZJT19UT0dHTEUoKQkJYmZpbl9yZWFkMTYoUE9SVEZJT19UT0dHTEUpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEZJT19UT0dHTEUodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRGSU9fVE9HR0xFLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JURklPX01BU0tBKCkJCWJmaW5fcmVhZDE2KFBPUlRGSU9fTUFTS0EpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEZJT19NQVNLQSh2YWwpCQliZmluX3dyaXRlMTYoUE9SVEZJT19NQVNLQSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEZJT19NQVNLQV9DTEVBUigpCQliZmluX3JlYWQxNihQT1JURklPX01BU0tBX0NMRUFSKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRGSU9fTUFTS0FfQ0xFQVIodmFsKQliZmluX3dyaXRlMTYoUE9SVEZJT19NQVNLQV9DTEVBUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEZJT19NQVNLQV9TRVQoKQkJYmZpbl9yZWFkMTYoUE9SVEZJT19NQVNLQV9TRVQpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEZJT19NQVNLQV9TRVQodmFsKQliZmluX3dyaXRlMTYoUE9SVEZJT19NQVNLQV9TRVQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRGSU9fTUFTS0FfVE9HR0xFKCkJYmZpbl9yZWFkMTYoUE9SVEZJT19NQVNLQV9UT0dHTEUpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEZJT19NQVNLQV9UT0dHTEUodmFsKQliZmluX3dyaXRlMTYoUE9SVEZJT19NQVNLQV9UT0dHTEUsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRGSU9fTUFTS0IoKQkJYmZpbl9yZWFkMTYoUE9SVEZJT19NQVNLQikKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JURklPX01BU0tCKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JURklPX01BU0tCLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JURklPX01BU0tCX0NMRUFSKCkJCWJmaW5fcmVhZDE2KFBPUlRGSU9fTUFTS0JfQ0xFQVIpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEZJT19NQVNLQl9DTEVBUih2YWwpCWJmaW5fd3JpdGUxNihQT1JURklPX01BU0tCX0NMRUFSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JURklPX01BU0tCX1NFVCgpCQliZmluX3JlYWQxNihQT1JURklPX01BU0tCX1NFVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JURklPX01BU0tCX1NFVCh2YWwpCWJmaW5fd3JpdGUxNihQT1JURklPX01BU0tCX1NFVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEZJT19NQVNLQl9UT0dHTEUoKQliZmluX3JlYWQxNihQT1JURklPX01BU0tCX1RPR0dMRSkKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JURklPX01BU0tCX1RPR0dMRSh2YWwpCWJmaW5fd3JpdGUxNihQT1JURklPX01BU0tCX1RPR0dMRSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEZJT19ESVIoKQkJCWJmaW5fcmVhZDE2KFBPUlRGSU9fRElSKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRGSU9fRElSKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JURklPX0RJUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEZJT19QT0xBUigpCQliZmluX3JlYWQxNihQT1JURklPX1BPTEFSKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRGSU9fUE9MQVIodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRGSU9fUE9MQVIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRGSU9fRURHRSgpCQliZmluX3JlYWQxNihQT1JURklPX0VER0UpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEZJT19FREdFKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JURklPX0VER0UsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRGSU9fQk9USCgpCQliZmluX3JlYWQxNihQT1JURklPX0JPVEgpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEZJT19CT1RIKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JURklPX0JPVEgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRGSU9fSU5FTigpCQliZmluX3JlYWQxNihQT1JURklPX0lORU4pCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEZJT19JTkVOKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JURklPX0lORU4sIHZhbCkKKworCisvKiBTUE9SVDAgQ29udHJvbGxlcgkJKDB4RkZDMDA4MDAgLSAweEZGQzAwOEZGKQkJCQkJCQkJKi8KKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMF9UQ1IxKCkJCQliZmluX3JlYWQxNihTUE9SVDBfVENSMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDBfVENSMSh2YWwpCQliZmluX3dyaXRlMTYoU1BPUlQwX1RDUjEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMF9UQ1IyKCkJCQliZmluX3JlYWQxNihTUE9SVDBfVENSMikKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDBfVENSMih2YWwpCQliZmluX3dyaXRlMTYoU1BPUlQwX1RDUjIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMF9UQ0xLRElWKCkJCWJmaW5fcmVhZDE2KFNQT1JUMF9UQ0xLRElWKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMF9UQ0xLRElWKHZhbCkJCWJmaW5fd3JpdGUxNihTUE9SVDBfVENMS0RJViwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQwX1RGU0RJVigpCQliZmluX3JlYWQxNihTUE9SVDBfVEZTRElWKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMF9URlNESVYodmFsKQkJYmZpbl93cml0ZTE2KFNQT1JUMF9URlNESVYsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMF9UWCgpCQkJYmZpbl9yZWFkMzIoU1BPUlQwX1RYKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMF9UWCh2YWwpCQliZmluX3dyaXRlMzIoU1BPUlQwX1RYLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDBfUlgoKQkJCWJmaW5fcmVhZDMyKFNQT1JUMF9SWCkKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDBfUlgodmFsKQkJYmZpbl93cml0ZTMyKFNQT1JUMF9SWCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQwX1RYMzIoKQkJCWJmaW5fcmVhZDMyKFNQT1JUMF9UWCkKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDBfVFgzMih2YWwpCQliZmluX3dyaXRlMzIoU1BPUlQwX1RYLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDBfUlgzMigpCQkJYmZpbl9yZWFkMzIoU1BPUlQwX1JYKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMF9SWDMyKHZhbCkJCWJmaW5fd3JpdGUzMihTUE9SVDBfUlgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMF9UWDE2KCkJCQliZmluX3JlYWQxNihTUE9SVDBfVFgpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQwX1RYMTYodmFsKQkJYmZpbl93cml0ZTE2KFNQT1JUMF9UWCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQwX1JYMTYoKQkJCWJmaW5fcmVhZDE2KFNQT1JUMF9SWCkKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDBfUlgxNih2YWwpCQliZmluX3dyaXRlMTYoU1BPUlQwX1JYLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDBfUkNSMSgpCQkJYmZpbl9yZWFkMTYoU1BPUlQwX1JDUjEpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQwX1JDUjEodmFsKQkJYmZpbl93cml0ZTE2KFNQT1JUMF9SQ1IxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDBfUkNSMigpCQkJYmZpbl9yZWFkMTYoU1BPUlQwX1JDUjIpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQwX1JDUjIodmFsKQkJYmZpbl93cml0ZTE2KFNQT1JUMF9SQ1IyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDBfUkNMS0RJVigpCQliZmluX3JlYWQxNihTUE9SVDBfUkNMS0RJVikKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDBfUkNMS0RJVih2YWwpCQliZmluX3dyaXRlMTYoU1BPUlQwX1JDTEtESVYsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMF9SRlNESVYoKQkJYmZpbl9yZWFkMTYoU1BPUlQwX1JGU0RJVikKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDBfUkZTRElWKHZhbCkJCWJmaW5fd3JpdGUxNihTUE9SVDBfUkZTRElWLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDBfU1RBVCgpCQkJYmZpbl9yZWFkMTYoU1BPUlQwX1NUQVQpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQwX1NUQVQodmFsKQkJYmZpbl93cml0ZTE2KFNQT1JUMF9TVEFULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDBfQ0hOTCgpCQkJYmZpbl9yZWFkMTYoU1BPUlQwX0NITkwpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQwX0NITkwodmFsKQkJYmZpbl93cml0ZTE2KFNQT1JUMF9DSE5MLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDBfTUNNQzEoKQkJYmZpbl9yZWFkMTYoU1BPUlQwX01DTUMxKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMF9NQ01DMSh2YWwpCQliZmluX3dyaXRlMTYoU1BPUlQwX01DTUMxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDBfTUNNQzIoKQkJYmZpbl9yZWFkMTYoU1BPUlQwX01DTUMyKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMF9NQ01DMih2YWwpCQliZmluX3dyaXRlMTYoU1BPUlQwX01DTUMyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDBfTVRDUzAoKQkJYmZpbl9yZWFkMzIoU1BPUlQwX01UQ1MwKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMF9NVENTMCh2YWwpCQliZmluX3dyaXRlMzIoU1BPUlQwX01UQ1MwLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDBfTVRDUzEoKQkJYmZpbl9yZWFkMzIoU1BPUlQwX01UQ1MxKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMF9NVENTMSh2YWwpCQliZmluX3dyaXRlMzIoU1BPUlQwX01UQ1MxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDBfTVRDUzIoKQkJYmZpbl9yZWFkMzIoU1BPUlQwX01UQ1MyKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMF9NVENTMih2YWwpCQliZmluX3dyaXRlMzIoU1BPUlQwX01UQ1MyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDBfTVRDUzMoKQkJYmZpbl9yZWFkMzIoU1BPUlQwX01UQ1MzKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMF9NVENTMyh2YWwpCQliZmluX3dyaXRlMzIoU1BPUlQwX01UQ1MzLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDBfTVJDUzAoKQkJYmZpbl9yZWFkMzIoU1BPUlQwX01SQ1MwKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMF9NUkNTMCh2YWwpCQliZmluX3dyaXRlMzIoU1BPUlQwX01SQ1MwLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDBfTVJDUzEoKQkJYmZpbl9yZWFkMzIoU1BPUlQwX01SQ1MxKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMF9NUkNTMSh2YWwpCQliZmluX3dyaXRlMzIoU1BPUlQwX01SQ1MxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDBfTVJDUzIoKQkJYmZpbl9yZWFkMzIoU1BPUlQwX01SQ1MyKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMF9NUkNTMih2YWwpCQliZmluX3dyaXRlMzIoU1BPUlQwX01SQ1MyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDBfTVJDUzMoKQkJYmZpbl9yZWFkMzIoU1BPUlQwX01SQ1MzKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMF9NUkNTMyh2YWwpCQliZmluX3dyaXRlMzIoU1BPUlQwX01SQ1MzLCB2YWwpCisKKworLyogU1BPUlQxIENvbnRyb2xsZXIJCSgweEZGQzAwOTAwIC0gMHhGRkMwMDlGRikJCQkJCQkJCSovCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDFfVENSMSgpCQkJYmZpbl9yZWFkMTYoU1BPUlQxX1RDUjEpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQxX1RDUjEodmFsKQkJYmZpbl93cml0ZTE2KFNQT1JUMV9UQ1IxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDFfVENSMigpCQkJYmZpbl9yZWFkMTYoU1BPUlQxX1RDUjIpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQxX1RDUjIodmFsKQkJYmZpbl93cml0ZTE2KFNQT1JUMV9UQ1IyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDFfVENMS0RJVigpCQliZmluX3JlYWQxNihTUE9SVDFfVENMS0RJVikKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDFfVENMS0RJVih2YWwpCQliZmluX3dyaXRlMTYoU1BPUlQxX1RDTEtESVYsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMV9URlNESVYoKQkJYmZpbl9yZWFkMTYoU1BPUlQxX1RGU0RJVikKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDFfVEZTRElWKHZhbCkJCWJmaW5fd3JpdGUxNihTUE9SVDFfVEZTRElWLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDFfVFgoKQkJCWJmaW5fcmVhZDMyKFNQT1JUMV9UWCkKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDFfVFgodmFsKQkJYmZpbl93cml0ZTMyKFNQT1JUMV9UWCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQxX1JYKCkJCQliZmluX3JlYWQzMihTUE9SVDFfUlgpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQxX1JYKHZhbCkJCWJmaW5fd3JpdGUzMihTUE9SVDFfUlgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMV9UWDMyKCkJCQliZmluX3JlYWQzMihTUE9SVDFfVFgpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQxX1RYMzIodmFsKQkJYmZpbl93cml0ZTMyKFNQT1JUMV9UWCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQxX1JYMzIoKQkJCWJmaW5fcmVhZDMyKFNQT1JUMV9SWCkKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDFfUlgzMih2YWwpCQliZmluX3dyaXRlMzIoU1BPUlQxX1JYLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDFfVFgxNigpCQkJYmZpbl9yZWFkMTYoU1BPUlQxX1RYKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMV9UWDE2KHZhbCkJCWJmaW5fd3JpdGUxNihTUE9SVDFfVFgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMV9SWDE2KCkJCQliZmluX3JlYWQxNihTUE9SVDFfUlgpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQxX1JYMTYodmFsKQkJYmZpbl93cml0ZTE2KFNQT1JUMV9SWCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQxX1JDUjEoKQkJCWJmaW5fcmVhZDE2KFNQT1JUMV9SQ1IxKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMV9SQ1IxKHZhbCkJCWJmaW5fd3JpdGUxNihTUE9SVDFfUkNSMSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQxX1JDUjIoKQkJCWJmaW5fcmVhZDE2KFNQT1JUMV9SQ1IyKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMV9SQ1IyKHZhbCkJCWJmaW5fd3JpdGUxNihTUE9SVDFfUkNSMiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQxX1JDTEtESVYoKQkJYmZpbl9yZWFkMTYoU1BPUlQxX1JDTEtESVYpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQxX1JDTEtESVYodmFsKQkJYmZpbl93cml0ZTE2KFNQT1JUMV9SQ0xLRElWLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDFfUkZTRElWKCkJCWJmaW5fcmVhZDE2KFNQT1JUMV9SRlNESVYpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQxX1JGU0RJVih2YWwpCQliZmluX3dyaXRlMTYoU1BPUlQxX1JGU0RJViwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQxX1NUQVQoKQkJCWJmaW5fcmVhZDE2KFNQT1JUMV9TVEFUKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMV9TVEFUKHZhbCkJCWJmaW5fd3JpdGUxNihTUE9SVDFfU1RBVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQxX0NITkwoKQkJCWJmaW5fcmVhZDE2KFNQT1JUMV9DSE5MKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMV9DSE5MKHZhbCkJCWJmaW5fd3JpdGUxNihTUE9SVDFfQ0hOTCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQxX01DTUMxKCkJCWJmaW5fcmVhZDE2KFNQT1JUMV9NQ01DMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDFfTUNNQzEodmFsKQkJYmZpbl93cml0ZTE2KFNQT1JUMV9NQ01DMSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQxX01DTUMyKCkJCWJmaW5fcmVhZDE2KFNQT1JUMV9NQ01DMikKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDFfTUNNQzIodmFsKQkJYmZpbl93cml0ZTE2KFNQT1JUMV9NQ01DMiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQxX01UQ1MwKCkJCWJmaW5fcmVhZDMyKFNQT1JUMV9NVENTMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDFfTVRDUzAodmFsKQkJYmZpbl93cml0ZTMyKFNQT1JUMV9NVENTMCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQxX01UQ1MxKCkJCWJmaW5fcmVhZDMyKFNQT1JUMV9NVENTMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDFfTVRDUzEodmFsKQkJYmZpbl93cml0ZTMyKFNQT1JUMV9NVENTMSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQxX01UQ1MyKCkJCWJmaW5fcmVhZDMyKFNQT1JUMV9NVENTMikKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDFfTVRDUzIodmFsKQkJYmZpbl93cml0ZTMyKFNQT1JUMV9NVENTMiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQxX01UQ1MzKCkJCWJmaW5fcmVhZDMyKFNQT1JUMV9NVENTMykKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDFfTVRDUzModmFsKQkJYmZpbl93cml0ZTMyKFNQT1JUMV9NVENTMywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQxX01SQ1MwKCkJCWJmaW5fcmVhZDMyKFNQT1JUMV9NUkNTMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDFfTVJDUzAodmFsKQkJYmZpbl93cml0ZTMyKFNQT1JUMV9NUkNTMCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQxX01SQ1MxKCkJCWJmaW5fcmVhZDMyKFNQT1JUMV9NUkNTMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDFfTVJDUzEodmFsKQkJYmZpbl93cml0ZTMyKFNQT1JUMV9NUkNTMSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQxX01SQ1MyKCkJCWJmaW5fcmVhZDMyKFNQT1JUMV9NUkNTMikKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDFfTVJDUzIodmFsKQkJYmZpbl93cml0ZTMyKFNQT1JUMV9NUkNTMiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQxX01SQ1MzKCkJCWJmaW5fcmVhZDMyKFNQT1JUMV9NUkNTMykKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDFfTVJDUzModmFsKQkJYmZpbl93cml0ZTMyKFNQT1JUMV9NUkNTMywgdmFsKQorCisKKy8qIEV4dGVybmFsIEJ1cyBJbnRlcmZhY2UgVW5pdCAoMHhGRkMwMEEwMCAtIDB4RkZDMDBBRkYpCQkJCQkJCSovCisjZGVmaW5lIGJmaW5fcmVhZF9FQklVX0FNR0NUTCgpCQkJYmZpbl9yZWFkMTYoRUJJVV9BTUdDVEwpCisjZGVmaW5lIGJmaW5fd3JpdGVfRUJJVV9BTUdDVEwodmFsKQkJYmZpbl93cml0ZTE2KEVCSVVfQU1HQ1RMLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FQklVX0FNQkNUTDAoKQkJYmZpbl9yZWFkMzIoRUJJVV9BTUJDVEwwKQorI2RlZmluZSBiZmluX3dyaXRlX0VCSVVfQU1CQ1RMMCh2YWwpCQliZmluX3dyaXRlMzIoRUJJVV9BTUJDVEwwLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FQklVX0FNQkNUTDEoKQkJYmZpbl9yZWFkMzIoRUJJVV9BTUJDVEwxKQorI2RlZmluZSBiZmluX3dyaXRlX0VCSVVfQU1CQ1RMMSh2YWwpCQliZmluX3dyaXRlMzIoRUJJVV9BTUJDVEwxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FQklVX1NER0NUTCgpCQkJYmZpbl9yZWFkMzIoRUJJVV9TREdDVEwpCisjZGVmaW5lIGJmaW5fd3JpdGVfRUJJVV9TREdDVEwodmFsKQkJYmZpbl93cml0ZTMyKEVCSVVfU0RHQ1RMLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FQklVX1NEQkNUTCgpCQkJYmZpbl9yZWFkMTYoRUJJVV9TREJDVEwpCisjZGVmaW5lIGJmaW5fd3JpdGVfRUJJVV9TREJDVEwodmFsKQkJYmZpbl93cml0ZTE2KEVCSVVfU0RCQ1RMLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FQklVX1NEUlJDKCkJCQliZmluX3JlYWQxNihFQklVX1NEUlJDKQorI2RlZmluZSBiZmluX3dyaXRlX0VCSVVfU0RSUkModmFsKQkJYmZpbl93cml0ZTE2KEVCSVVfU0RSUkMsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VCSVVfU0RTVEFUKCkJCQliZmluX3JlYWQxNihFQklVX1NEU1RBVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9FQklVX1NEU1RBVCh2YWwpCQliZmluX3dyaXRlMTYoRUJJVV9TRFNUQVQsIHZhbCkKKworCisvKiBETUEgVHJhZmZpYyBDb250cm9sIFJlZ2lzdGVycwkJCQkJCQkJCQkJCQkqLworI2RlZmluZSBiZmluX3JlYWRfRE1BQ19UQ19QRVIoKQkJCWJmaW5fcmVhZDE2KERNQUNfVENfUEVSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQUNfVENfUEVSKHZhbCkJCWJmaW5fd3JpdGUxNihETUFDX1RDX1BFUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BQ19UQ19DTlQoKQkJCWJmaW5fcmVhZDE2KERNQUNfVENfQ05UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQUNfVENfQ05UKHZhbCkJCWJmaW5fd3JpdGUxNihETUFDX1RDX0NOVCwgdmFsKQorCisvKiBETUEgQ29udHJvbGxlcgkJCQkJCQkJCQkJCQkJCQkJKi8KKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTBfQ09ORklHKCkJCQliZmluX3JlYWQxNihETUEwX0NPTkZJRykKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUEwX0NPTkZJRyh2YWwpCQliZmluX3dyaXRlMTYoRE1BMF9DT05GSUcsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTBfTkVYVF9ERVNDX1BUUigpCQliZmluX3JlYWQzMihETUEwX05FWFRfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMF9ORVhUX0RFU0NfUFRSKHZhbCkJYmZpbl93cml0ZTMyKERNQTBfTkVYVF9ERVNDX1BUUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMF9TVEFSVF9BRERSKCkJCWJmaW5fcmVhZDMyKERNQTBfU1RBUlRfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUEwX1NUQVJUX0FERFIodmFsKQkJYmZpbl93cml0ZTMyKERNQTBfU1RBUlRfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMF9YX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTBfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUEwX1hfQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KERNQTBfWF9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMF9ZX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTBfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUEwX1lfQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KERNQTBfWV9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMF9YX01PRElGWSgpCQliZmluX3JlYWQxNihETUEwX1hfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTBfWF9NT0RJRlkodmFsKQkJYmZpbl93cml0ZTE2KERNQTBfWF9NT0RJRlksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTBfWV9NT0RJRlkoKQkJYmZpbl9yZWFkMTYoRE1BMF9ZX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUEwX1lfTU9ESUZZKHZhbCkJCWJmaW5fd3JpdGUxNihETUEwX1lfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUEwX0NVUlJfREVTQ19QVFIoKQkJYmZpbl9yZWFkMzIoRE1BMF9DVVJSX0RFU0NfUFRSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTBfQ1VSUl9ERVNDX1BUUih2YWwpCWJmaW5fd3JpdGUzMihETUEwX0NVUlJfREVTQ19QVFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTBfQ1VSUl9BRERSKCkJCWJmaW5fcmVhZDMyKERNQTBfQ1VSUl9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTBfQ1VSUl9BRERSKHZhbCkJCWJmaW5fd3JpdGUzMihETUEwX0NVUlJfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMF9DVVJSX1hfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BMF9DVVJSX1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMF9DVVJSX1hfQ09VTlQodmFsKQliZmluX3dyaXRlMTYoRE1BMF9DVVJSX1hfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTBfQ1VSUl9ZX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTBfQ1VSUl9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTBfQ1VSUl9ZX0NPVU5UKHZhbCkJYmZpbl93cml0ZTE2KERNQTBfQ1VSUl9ZX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUEwX0lSUV9TVEFUVVMoKQkJYmZpbl9yZWFkMTYoRE1BMF9JUlFfU1RBVFVTKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTBfSVJRX1NUQVRVUyh2YWwpCQliZmluX3dyaXRlMTYoRE1BMF9JUlFfU1RBVFVTLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUEwX1BFUklQSEVSQUxfTUFQKCkJCWJmaW5fcmVhZDE2KERNQTBfUEVSSVBIRVJBTF9NQVApCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMF9QRVJJUEhFUkFMX01BUCh2YWwpCWJmaW5fd3JpdGUxNihETUEwX1BFUklQSEVSQUxfTUFQLCB2YWwpCisKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTFfQ09ORklHKCkJCQliZmluX3JlYWQxNihETUExX0NPTkZJRykKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExX0NPTkZJRyh2YWwpCQliZmluX3dyaXRlMTYoRE1BMV9DT05GSUcsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTFfTkVYVF9ERVNDX1BUUigpCQliZmluX3JlYWQzMihETUExX05FWFRfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMV9ORVhUX0RFU0NfUFRSKHZhbCkJYmZpbl93cml0ZTMyKERNQTFfTkVYVF9ERVNDX1BUUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMV9TVEFSVF9BRERSKCkJCWJmaW5fcmVhZDMyKERNQTFfU1RBUlRfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExX1NUQVJUX0FERFIodmFsKQkJYmZpbl93cml0ZTMyKERNQTFfU1RBUlRfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMV9YX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTFfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExX1hfQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KERNQTFfWF9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMV9ZX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTFfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExX1lfQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KERNQTFfWV9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMV9YX01PRElGWSgpCQliZmluX3JlYWQxNihETUExX1hfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTFfWF9NT0RJRlkodmFsKQkJYmZpbl93cml0ZTE2KERNQTFfWF9NT0RJRlksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTFfWV9NT0RJRlkoKQkJYmZpbl9yZWFkMTYoRE1BMV9ZX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExX1lfTU9ESUZZKHZhbCkJCWJmaW5fd3JpdGUxNihETUExX1lfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExX0NVUlJfREVTQ19QVFIoKQkJYmZpbl9yZWFkMzIoRE1BMV9DVVJSX0RFU0NfUFRSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTFfQ1VSUl9ERVNDX1BUUih2YWwpCWJmaW5fd3JpdGUzMihETUExX0NVUlJfREVTQ19QVFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTFfQ1VSUl9BRERSKCkJCWJmaW5fcmVhZDMyKERNQTFfQ1VSUl9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTFfQ1VSUl9BRERSKHZhbCkJCWJmaW5fd3JpdGUzMihETUExX0NVUlJfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMV9DVVJSX1hfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BMV9DVVJSX1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMV9DVVJSX1hfQ09VTlQodmFsKQliZmluX3dyaXRlMTYoRE1BMV9DVVJSX1hfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTFfQ1VSUl9ZX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTFfQ1VSUl9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTFfQ1VSUl9ZX0NPVU5UKHZhbCkJYmZpbl93cml0ZTE2KERNQTFfQ1VSUl9ZX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExX0lSUV9TVEFUVVMoKQkJYmZpbl9yZWFkMTYoRE1BMV9JUlFfU1RBVFVTKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTFfSVJRX1NUQVRVUyh2YWwpCQliZmluX3dyaXRlMTYoRE1BMV9JUlFfU1RBVFVTLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExX1BFUklQSEVSQUxfTUFQKCkJCWJmaW5fcmVhZDE2KERNQTFfUEVSSVBIRVJBTF9NQVApCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMV9QRVJJUEhFUkFMX01BUCh2YWwpCWJmaW5fd3JpdGUxNihETUExX1BFUklQSEVSQUxfTUFQLCB2YWwpCisKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTJfQ09ORklHKCkJCQliZmluX3JlYWQxNihETUEyX0NPTkZJRykKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUEyX0NPTkZJRyh2YWwpCQliZmluX3dyaXRlMTYoRE1BMl9DT05GSUcsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTJfTkVYVF9ERVNDX1BUUigpCQliZmluX3JlYWQzMihETUEyX05FWFRfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMl9ORVhUX0RFU0NfUFRSKHZhbCkJYmZpbl93cml0ZTMyKERNQTJfTkVYVF9ERVNDX1BUUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMl9TVEFSVF9BRERSKCkJCWJmaW5fcmVhZDMyKERNQTJfU1RBUlRfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUEyX1NUQVJUX0FERFIodmFsKQkJYmZpbl93cml0ZTMyKERNQTJfU1RBUlRfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMl9YX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTJfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUEyX1hfQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KERNQTJfWF9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMl9ZX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTJfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUEyX1lfQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KERNQTJfWV9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMl9YX01PRElGWSgpCQliZmluX3JlYWQxNihETUEyX1hfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTJfWF9NT0RJRlkodmFsKQkJYmZpbl93cml0ZTE2KERNQTJfWF9NT0RJRlksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTJfWV9NT0RJRlkoKQkJYmZpbl9yZWFkMTYoRE1BMl9ZX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUEyX1lfTU9ESUZZKHZhbCkJCWJmaW5fd3JpdGUxNihETUEyX1lfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUEyX0NVUlJfREVTQ19QVFIoKQkJYmZpbl9yZWFkMzIoRE1BMl9DVVJSX0RFU0NfUFRSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTJfQ1VSUl9ERVNDX1BUUih2YWwpCWJmaW5fd3JpdGUzMihETUEyX0NVUlJfREVTQ19QVFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTJfQ1VSUl9BRERSKCkJCWJmaW5fcmVhZDMyKERNQTJfQ1VSUl9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTJfQ1VSUl9BRERSKHZhbCkJCWJmaW5fd3JpdGUzMihETUEyX0NVUlJfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMl9DVVJSX1hfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BMl9DVVJSX1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMl9DVVJSX1hfQ09VTlQodmFsKQliZmluX3dyaXRlMTYoRE1BMl9DVVJSX1hfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTJfQ1VSUl9ZX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTJfQ1VSUl9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTJfQ1VSUl9ZX0NPVU5UKHZhbCkJYmZpbl93cml0ZTE2KERNQTJfQ1VSUl9ZX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUEyX0lSUV9TVEFUVVMoKQkJYmZpbl9yZWFkMTYoRE1BMl9JUlFfU1RBVFVTKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTJfSVJRX1NUQVRVUyh2YWwpCQliZmluX3dyaXRlMTYoRE1BMl9JUlFfU1RBVFVTLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUEyX1BFUklQSEVSQUxfTUFQKCkJCWJmaW5fcmVhZDE2KERNQTJfUEVSSVBIRVJBTF9NQVApCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMl9QRVJJUEhFUkFMX01BUCh2YWwpCWJmaW5fd3JpdGUxNihETUEyX1BFUklQSEVSQUxfTUFQLCB2YWwpCisKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTNfQ09ORklHKCkJCQliZmluX3JlYWQxNihETUEzX0NPTkZJRykKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUEzX0NPTkZJRyh2YWwpCQliZmluX3dyaXRlMTYoRE1BM19DT05GSUcsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTNfTkVYVF9ERVNDX1BUUigpCQliZmluX3JlYWQzMihETUEzX05FWFRfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BM19ORVhUX0RFU0NfUFRSKHZhbCkJYmZpbl93cml0ZTMyKERNQTNfTkVYVF9ERVNDX1BUUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BM19TVEFSVF9BRERSKCkJCWJmaW5fcmVhZDMyKERNQTNfU1RBUlRfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUEzX1NUQVJUX0FERFIodmFsKQkJYmZpbl93cml0ZTMyKERNQTNfU1RBUlRfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BM19YX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTNfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUEzX1hfQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KERNQTNfWF9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BM19ZX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTNfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUEzX1lfQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KERNQTNfWV9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BM19YX01PRElGWSgpCQliZmluX3JlYWQxNihETUEzX1hfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTNfWF9NT0RJRlkodmFsKQkJYmZpbl93cml0ZTE2KERNQTNfWF9NT0RJRlksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTNfWV9NT0RJRlkoKQkJYmZpbl9yZWFkMTYoRE1BM19ZX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUEzX1lfTU9ESUZZKHZhbCkJCWJmaW5fd3JpdGUxNihETUEzX1lfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUEzX0NVUlJfREVTQ19QVFIoKQkJYmZpbl9yZWFkMzIoRE1BM19DVVJSX0RFU0NfUFRSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTNfQ1VSUl9ERVNDX1BUUih2YWwpCWJmaW5fd3JpdGUzMihETUEzX0NVUlJfREVTQ19QVFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTNfQ1VSUl9BRERSKCkJCWJmaW5fcmVhZDMyKERNQTNfQ1VSUl9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTNfQ1VSUl9BRERSKHZhbCkJCWJmaW5fd3JpdGUzMihETUEzX0NVUlJfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BM19DVVJSX1hfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BM19DVVJSX1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BM19DVVJSX1hfQ09VTlQodmFsKQliZmluX3dyaXRlMTYoRE1BM19DVVJSX1hfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTNfQ1VSUl9ZX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTNfQ1VSUl9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTNfQ1VSUl9ZX0NPVU5UKHZhbCkJYmZpbl93cml0ZTE2KERNQTNfQ1VSUl9ZX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUEzX0lSUV9TVEFUVVMoKQkJYmZpbl9yZWFkMTYoRE1BM19JUlFfU1RBVFVTKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTNfSVJRX1NUQVRVUyh2YWwpCQliZmluX3dyaXRlMTYoRE1BM19JUlFfU1RBVFVTLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUEzX1BFUklQSEVSQUxfTUFQKCkJCWJmaW5fcmVhZDE2KERNQTNfUEVSSVBIRVJBTF9NQVApCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BM19QRVJJUEhFUkFMX01BUCh2YWwpCWJmaW5fd3JpdGUxNihETUEzX1BFUklQSEVSQUxfTUFQLCB2YWwpCisKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTRfQ09ORklHKCkJCQliZmluX3JlYWQxNihETUE0X0NPTkZJRykKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE0X0NPTkZJRyh2YWwpCQliZmluX3dyaXRlMTYoRE1BNF9DT05GSUcsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTRfTkVYVF9ERVNDX1BUUigpCQliZmluX3JlYWQzMihETUE0X05FWFRfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BNF9ORVhUX0RFU0NfUFRSKHZhbCkJYmZpbl93cml0ZTMyKERNQTRfTkVYVF9ERVNDX1BUUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BNF9TVEFSVF9BRERSKCkJCWJmaW5fcmVhZDMyKERNQTRfU1RBUlRfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE0X1NUQVJUX0FERFIodmFsKQkJYmZpbl93cml0ZTMyKERNQTRfU1RBUlRfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BNF9YX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTRfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE0X1hfQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KERNQTRfWF9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BNF9ZX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTRfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE0X1lfQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KERNQTRfWV9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BNF9YX01PRElGWSgpCQliZmluX3JlYWQxNihETUE0X1hfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTRfWF9NT0RJRlkodmFsKQkJYmZpbl93cml0ZTE2KERNQTRfWF9NT0RJRlksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTRfWV9NT0RJRlkoKQkJYmZpbl9yZWFkMTYoRE1BNF9ZX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE0X1lfTU9ESUZZKHZhbCkJCWJmaW5fd3JpdGUxNihETUE0X1lfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE0X0NVUlJfREVTQ19QVFIoKQkJYmZpbl9yZWFkMzIoRE1BNF9DVVJSX0RFU0NfUFRSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTRfQ1VSUl9ERVNDX1BUUih2YWwpCWJmaW5fd3JpdGUzMihETUE0X0NVUlJfREVTQ19QVFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTRfQ1VSUl9BRERSKCkJCWJmaW5fcmVhZDMyKERNQTRfQ1VSUl9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTRfQ1VSUl9BRERSKHZhbCkJCWJmaW5fd3JpdGUzMihETUE0X0NVUlJfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BNF9DVVJSX1hfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BNF9DVVJSX1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BNF9DVVJSX1hfQ09VTlQodmFsKQliZmluX3dyaXRlMTYoRE1BNF9DVVJSX1hfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTRfQ1VSUl9ZX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTRfQ1VSUl9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTRfQ1VSUl9ZX0NPVU5UKHZhbCkJYmZpbl93cml0ZTE2KERNQTRfQ1VSUl9ZX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE0X0lSUV9TVEFUVVMoKQkJYmZpbl9yZWFkMTYoRE1BNF9JUlFfU1RBVFVTKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTRfSVJRX1NUQVRVUyh2YWwpCQliZmluX3dyaXRlMTYoRE1BNF9JUlFfU1RBVFVTLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE0X1BFUklQSEVSQUxfTUFQKCkJCWJmaW5fcmVhZDE2KERNQTRfUEVSSVBIRVJBTF9NQVApCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BNF9QRVJJUEhFUkFMX01BUCh2YWwpCWJmaW5fd3JpdGUxNihETUE0X1BFUklQSEVSQUxfTUFQLCB2YWwpCisKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTVfQ09ORklHKCkJCQliZmluX3JlYWQxNihETUE1X0NPTkZJRykKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE1X0NPTkZJRyh2YWwpCQliZmluX3dyaXRlMTYoRE1BNV9DT05GSUcsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTVfTkVYVF9ERVNDX1BUUigpCQliZmluX3JlYWQzMihETUE1X05FWFRfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BNV9ORVhUX0RFU0NfUFRSKHZhbCkJYmZpbl93cml0ZTMyKERNQTVfTkVYVF9ERVNDX1BUUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BNV9TVEFSVF9BRERSKCkJCWJmaW5fcmVhZDMyKERNQTVfU1RBUlRfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE1X1NUQVJUX0FERFIodmFsKQkJYmZpbl93cml0ZTMyKERNQTVfU1RBUlRfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BNV9YX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTVfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE1X1hfQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KERNQTVfWF9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BNV9ZX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTVfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE1X1lfQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KERNQTVfWV9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BNV9YX01PRElGWSgpCQliZmluX3JlYWQxNihETUE1X1hfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTVfWF9NT0RJRlkodmFsKQkJYmZpbl93cml0ZTE2KERNQTVfWF9NT0RJRlksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTVfWV9NT0RJRlkoKQkJYmZpbl9yZWFkMTYoRE1BNV9ZX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE1X1lfTU9ESUZZKHZhbCkJCWJmaW5fd3JpdGUxNihETUE1X1lfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE1X0NVUlJfREVTQ19QVFIoKQkJYmZpbl9yZWFkMzIoRE1BNV9DVVJSX0RFU0NfUFRSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTVfQ1VSUl9ERVNDX1BUUih2YWwpCWJmaW5fd3JpdGUzMihETUE1X0NVUlJfREVTQ19QVFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTVfQ1VSUl9BRERSKCkJCWJmaW5fcmVhZDMyKERNQTVfQ1VSUl9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTVfQ1VSUl9BRERSKHZhbCkJCWJmaW5fd3JpdGUzMihETUE1X0NVUlJfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BNV9DVVJSX1hfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BNV9DVVJSX1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BNV9DVVJSX1hfQ09VTlQodmFsKQliZmluX3dyaXRlMTYoRE1BNV9DVVJSX1hfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTVfQ1VSUl9ZX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTVfQ1VSUl9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTVfQ1VSUl9ZX0NPVU5UKHZhbCkJYmZpbl93cml0ZTE2KERNQTVfQ1VSUl9ZX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE1X0lSUV9TVEFUVVMoKQkJYmZpbl9yZWFkMTYoRE1BNV9JUlFfU1RBVFVTKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTVfSVJRX1NUQVRVUyh2YWwpCQliZmluX3dyaXRlMTYoRE1BNV9JUlFfU1RBVFVTLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE1X1BFUklQSEVSQUxfTUFQKCkJCWJmaW5fcmVhZDE2KERNQTVfUEVSSVBIRVJBTF9NQVApCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BNV9QRVJJUEhFUkFMX01BUCh2YWwpCWJmaW5fd3JpdGUxNihETUE1X1BFUklQSEVSQUxfTUFQLCB2YWwpCisKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTZfQ09ORklHKCkJCQliZmluX3JlYWQxNihETUE2X0NPTkZJRykKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE2X0NPTkZJRyh2YWwpCQliZmluX3dyaXRlMTYoRE1BNl9DT05GSUcsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTZfTkVYVF9ERVNDX1BUUigpCQliZmluX3JlYWQzMihETUE2X05FWFRfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BNl9ORVhUX0RFU0NfUFRSKHZhbCkJYmZpbl93cml0ZTMyKERNQTZfTkVYVF9ERVNDX1BUUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BNl9TVEFSVF9BRERSKCkJCWJmaW5fcmVhZDMyKERNQTZfU1RBUlRfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE2X1NUQVJUX0FERFIodmFsKQkJYmZpbl93cml0ZTMyKERNQTZfU1RBUlRfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BNl9YX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTZfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE2X1hfQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KERNQTZfWF9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BNl9ZX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTZfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE2X1lfQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KERNQTZfWV9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BNl9YX01PRElGWSgpCQliZmluX3JlYWQxNihETUE2X1hfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTZfWF9NT0RJRlkodmFsKQkJYmZpbl93cml0ZTE2KERNQTZfWF9NT0RJRlksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTZfWV9NT0RJRlkoKQkJYmZpbl9yZWFkMTYoRE1BNl9ZX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE2X1lfTU9ESUZZKHZhbCkJCWJmaW5fd3JpdGUxNihETUE2X1lfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE2X0NVUlJfREVTQ19QVFIoKQkJYmZpbl9yZWFkMzIoRE1BNl9DVVJSX0RFU0NfUFRSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTZfQ1VSUl9ERVNDX1BUUih2YWwpCWJmaW5fd3JpdGUzMihETUE2X0NVUlJfREVTQ19QVFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTZfQ1VSUl9BRERSKCkJCWJmaW5fcmVhZDMyKERNQTZfQ1VSUl9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTZfQ1VSUl9BRERSKHZhbCkJCWJmaW5fd3JpdGUzMihETUE2X0NVUlJfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BNl9DVVJSX1hfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BNl9DVVJSX1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BNl9DVVJSX1hfQ09VTlQodmFsKQliZmluX3dyaXRlMTYoRE1BNl9DVVJSX1hfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTZfQ1VSUl9ZX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTZfQ1VSUl9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTZfQ1VSUl9ZX0NPVU5UKHZhbCkJYmZpbl93cml0ZTE2KERNQTZfQ1VSUl9ZX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE2X0lSUV9TVEFUVVMoKQkJYmZpbl9yZWFkMTYoRE1BNl9JUlFfU1RBVFVTKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTZfSVJRX1NUQVRVUyh2YWwpCQliZmluX3dyaXRlMTYoRE1BNl9JUlFfU1RBVFVTLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE2X1BFUklQSEVSQUxfTUFQKCkJCWJmaW5fcmVhZDE2KERNQTZfUEVSSVBIRVJBTF9NQVApCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BNl9QRVJJUEhFUkFMX01BUCh2YWwpCWJmaW5fd3JpdGUxNihETUE2X1BFUklQSEVSQUxfTUFQLCB2YWwpCisKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTdfQ09ORklHKCkJCQliZmluX3JlYWQxNihETUE3X0NPTkZJRykKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE3X0NPTkZJRyh2YWwpCQliZmluX3dyaXRlMTYoRE1BN19DT05GSUcsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTdfTkVYVF9ERVNDX1BUUigpCQliZmluX3JlYWQzMihETUE3X05FWFRfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BN19ORVhUX0RFU0NfUFRSKHZhbCkJYmZpbl93cml0ZTMyKERNQTdfTkVYVF9ERVNDX1BUUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BN19TVEFSVF9BRERSKCkJCWJmaW5fcmVhZDMyKERNQTdfU1RBUlRfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE3X1NUQVJUX0FERFIodmFsKQkJYmZpbl93cml0ZTMyKERNQTdfU1RBUlRfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BN19YX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTdfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE3X1hfQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KERNQTdfWF9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BN19ZX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTdfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE3X1lfQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KERNQTdfWV9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BN19YX01PRElGWSgpCQliZmluX3JlYWQxNihETUE3X1hfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTdfWF9NT0RJRlkodmFsKQkJYmZpbl93cml0ZTE2KERNQTdfWF9NT0RJRlksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTdfWV9NT0RJRlkoKQkJYmZpbl9yZWFkMTYoRE1BN19ZX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE3X1lfTU9ESUZZKHZhbCkJCWJmaW5fd3JpdGUxNihETUE3X1lfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE3X0NVUlJfREVTQ19QVFIoKQkJYmZpbl9yZWFkMzIoRE1BN19DVVJSX0RFU0NfUFRSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTdfQ1VSUl9ERVNDX1BUUih2YWwpCWJmaW5fd3JpdGUzMihETUE3X0NVUlJfREVTQ19QVFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTdfQ1VSUl9BRERSKCkJCWJmaW5fcmVhZDMyKERNQTdfQ1VSUl9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTdfQ1VSUl9BRERSKHZhbCkJCWJmaW5fd3JpdGUzMihETUE3X0NVUlJfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BN19DVVJSX1hfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BN19DVVJSX1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BN19DVVJSX1hfQ09VTlQodmFsKQliZmluX3dyaXRlMTYoRE1BN19DVVJSX1hfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTdfQ1VSUl9ZX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTdfQ1VSUl9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTdfQ1VSUl9ZX0NPVU5UKHZhbCkJYmZpbl93cml0ZTE2KERNQTdfQ1VSUl9ZX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE3X0lSUV9TVEFUVVMoKQkJYmZpbl9yZWFkMTYoRE1BN19JUlFfU1RBVFVTKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTdfSVJRX1NUQVRVUyh2YWwpCQliZmluX3dyaXRlMTYoRE1BN19JUlFfU1RBVFVTLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE3X1BFUklQSEVSQUxfTUFQKCkJCWJmaW5fcmVhZDE2KERNQTdfUEVSSVBIRVJBTF9NQVApCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BN19QRVJJUEhFUkFMX01BUCh2YWwpCWJmaW5fd3JpdGUxNihETUE3X1BFUklQSEVSQUxfTUFQLCB2YWwpCisKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQThfQ09ORklHKCkJCQliZmluX3JlYWQxNihETUE4X0NPTkZJRykKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE4X0NPTkZJRyh2YWwpCQliZmluX3dyaXRlMTYoRE1BOF9DT05GSUcsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQThfTkVYVF9ERVNDX1BUUigpCQliZmluX3JlYWQzMihETUE4X05FWFRfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BOF9ORVhUX0RFU0NfUFRSKHZhbCkJYmZpbl93cml0ZTMyKERNQThfTkVYVF9ERVNDX1BUUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BOF9TVEFSVF9BRERSKCkJCWJmaW5fcmVhZDMyKERNQThfU1RBUlRfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE4X1NUQVJUX0FERFIodmFsKQkJYmZpbl93cml0ZTMyKERNQThfU1RBUlRfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BOF9YX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQThfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE4X1hfQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KERNQThfWF9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BOF9ZX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQThfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE4X1lfQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KERNQThfWV9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BOF9YX01PRElGWSgpCQliZmluX3JlYWQxNihETUE4X1hfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQThfWF9NT0RJRlkodmFsKQkJYmZpbl93cml0ZTE2KERNQThfWF9NT0RJRlksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQThfWV9NT0RJRlkoKQkJYmZpbl9yZWFkMTYoRE1BOF9ZX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE4X1lfTU9ESUZZKHZhbCkJCWJmaW5fd3JpdGUxNihETUE4X1lfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE4X0NVUlJfREVTQ19QVFIoKQkJYmZpbl9yZWFkMzIoRE1BOF9DVVJSX0RFU0NfUFRSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQThfQ1VSUl9ERVNDX1BUUih2YWwpCWJmaW5fd3JpdGUzMihETUE4X0NVUlJfREVTQ19QVFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQThfQ1VSUl9BRERSKCkJCWJmaW5fcmVhZDMyKERNQThfQ1VSUl9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQThfQ1VSUl9BRERSKHZhbCkJCWJmaW5fd3JpdGUzMihETUE4X0NVUlJfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BOF9DVVJSX1hfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BOF9DVVJSX1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BOF9DVVJSX1hfQ09VTlQodmFsKQliZmluX3dyaXRlMTYoRE1BOF9DVVJSX1hfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQThfQ1VSUl9ZX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQThfQ1VSUl9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQThfQ1VSUl9ZX0NPVU5UKHZhbCkJYmZpbl93cml0ZTE2KERNQThfQ1VSUl9ZX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE4X0lSUV9TVEFUVVMoKQkJYmZpbl9yZWFkMTYoRE1BOF9JUlFfU1RBVFVTKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQThfSVJRX1NUQVRVUyh2YWwpCQliZmluX3dyaXRlMTYoRE1BOF9JUlFfU1RBVFVTLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE4X1BFUklQSEVSQUxfTUFQKCkJCWJmaW5fcmVhZDE2KERNQThfUEVSSVBIRVJBTF9NQVApCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BOF9QRVJJUEhFUkFMX01BUCh2YWwpCWJmaW5fd3JpdGUxNihETUE4X1BFUklQSEVSQUxfTUFQLCB2YWwpCisKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTlfQ09ORklHKCkJCQliZmluX3JlYWQxNihETUE5X0NPTkZJRykKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE5X0NPTkZJRyh2YWwpCQliZmluX3dyaXRlMTYoRE1BOV9DT05GSUcsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTlfTkVYVF9ERVNDX1BUUigpCQliZmluX3JlYWQzMihETUE5X05FWFRfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BOV9ORVhUX0RFU0NfUFRSKHZhbCkJYmZpbl93cml0ZTMyKERNQTlfTkVYVF9ERVNDX1BUUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BOV9TVEFSVF9BRERSKCkJCWJmaW5fcmVhZDMyKERNQTlfU1RBUlRfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE5X1NUQVJUX0FERFIodmFsKQkJYmZpbl93cml0ZTMyKERNQTlfU1RBUlRfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BOV9YX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTlfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE5X1hfQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KERNQTlfWF9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BOV9ZX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTlfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE5X1lfQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KERNQTlfWV9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BOV9YX01PRElGWSgpCQliZmluX3JlYWQxNihETUE5X1hfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTlfWF9NT0RJRlkodmFsKQkJYmZpbl93cml0ZTE2KERNQTlfWF9NT0RJRlksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTlfWV9NT0RJRlkoKQkJYmZpbl9yZWFkMTYoRE1BOV9ZX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE5X1lfTU9ESUZZKHZhbCkJCWJmaW5fd3JpdGUxNihETUE5X1lfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE5X0NVUlJfREVTQ19QVFIoKQkJYmZpbl9yZWFkMzIoRE1BOV9DVVJSX0RFU0NfUFRSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTlfQ1VSUl9ERVNDX1BUUih2YWwpCWJmaW5fd3JpdGUzMihETUE5X0NVUlJfREVTQ19QVFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTlfQ1VSUl9BRERSKCkJCWJmaW5fcmVhZDMyKERNQTlfQ1VSUl9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTlfQ1VSUl9BRERSKHZhbCkJCWJmaW5fd3JpdGUzMihETUE5X0NVUlJfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BOV9DVVJSX1hfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BOV9DVVJSX1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BOV9DVVJSX1hfQ09VTlQodmFsKQliZmluX3dyaXRlMTYoRE1BOV9DVVJSX1hfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTlfQ1VSUl9ZX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTlfQ1VSUl9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTlfQ1VSUl9ZX0NPVU5UKHZhbCkJYmZpbl93cml0ZTE2KERNQTlfQ1VSUl9ZX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE5X0lSUV9TVEFUVVMoKQkJYmZpbl9yZWFkMTYoRE1BOV9JUlFfU1RBVFVTKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTlfSVJRX1NUQVRVUyh2YWwpCQliZmluX3dyaXRlMTYoRE1BOV9JUlFfU1RBVFVTLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE5X1BFUklQSEVSQUxfTUFQKCkJCWJmaW5fcmVhZDE2KERNQTlfUEVSSVBIRVJBTF9NQVApCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BOV9QRVJJUEhFUkFMX01BUCh2YWwpCWJmaW5fd3JpdGUxNihETUE5X1BFUklQSEVSQUxfTUFQLCB2YWwpCisKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTEwX0NPTkZJRygpCQliZmluX3JlYWQxNihETUExMF9DT05GSUcpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTBfQ09ORklHKHZhbCkJCWJmaW5fd3JpdGUxNihETUExMF9DT05GSUcsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTEwX05FWFRfREVTQ19QVFIoKQkJYmZpbl9yZWFkMzIoRE1BMTBfTkVYVF9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExMF9ORVhUX0RFU0NfUFRSKHZhbCkJYmZpbl93cml0ZTMyKERNQTEwX05FWFRfREVTQ19QVFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTEwX1NUQVJUX0FERFIoKQkJYmZpbl9yZWFkMzIoRE1BMTBfU1RBUlRfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExMF9TVEFSVF9BRERSKHZhbCkJYmZpbl93cml0ZTMyKERNQTEwX1NUQVJUX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTEwX1hfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BMTBfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExMF9YX0NPVU5UKHZhbCkJCWJmaW5fd3JpdGUxNihETUExMF9YX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExMF9ZX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTEwX1lfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTBfWV9DT1VOVCh2YWwpCQliZmluX3dyaXRlMTYoRE1BMTBfWV9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTBfWF9NT0RJRlkoKQkJYmZpbl9yZWFkMTYoRE1BMTBfWF9NT0RJRlkpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTBfWF9NT0RJRlkodmFsKQkJYmZpbl93cml0ZTE2KERNQTEwX1hfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExMF9ZX01PRElGWSgpCQliZmluX3JlYWQxNihETUExMF9ZX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExMF9ZX01PRElGWSh2YWwpCQliZmluX3dyaXRlMTYoRE1BMTBfWV9NT0RJRlksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTEwX0NVUlJfREVTQ19QVFIoKQkJYmZpbl9yZWFkMzIoRE1BMTBfQ1VSUl9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExMF9DVVJSX0RFU0NfUFRSKHZhbCkJYmZpbl93cml0ZTMyKERNQTEwX0NVUlJfREVTQ19QVFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTEwX0NVUlJfQUREUigpCQliZmluX3JlYWQzMihETUExMF9DVVJSX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTBfQ1VSUl9BRERSKHZhbCkJCWJmaW5fd3JpdGUzMihETUExMF9DVVJSX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTEwX0NVUlJfWF9DT1VOVCgpCQliZmluX3JlYWQxNihETUExMF9DVVJSX1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTBfQ1VSUl9YX0NPVU5UKHZhbCkJYmZpbl93cml0ZTE2KERNQTEwX0NVUlJfWF9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTBfQ1VSUl9ZX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTEwX0NVUlJfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExMF9DVVJSX1lfQ09VTlQodmFsKQliZmluX3dyaXRlMTYoRE1BMTBfQ1VSUl9ZX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExMF9JUlFfU1RBVFVTKCkJCWJmaW5fcmVhZDE2KERNQTEwX0lSUV9TVEFUVVMpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTBfSVJRX1NUQVRVUyh2YWwpCWJmaW5fd3JpdGUxNihETUExMF9JUlFfU1RBVFVTLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExMF9QRVJJUEhFUkFMX01BUCgpCWJmaW5fcmVhZDE2KERNQTEwX1BFUklQSEVSQUxfTUFQKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTEwX1BFUklQSEVSQUxfTUFQKHZhbCkJYmZpbl93cml0ZTE2KERNQTEwX1BFUklQSEVSQUxfTUFQLCB2YWwpCisKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTExX0NPTkZJRygpCQliZmluX3JlYWQxNihETUExMV9DT05GSUcpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTFfQ09ORklHKHZhbCkJCWJmaW5fd3JpdGUxNihETUExMV9DT05GSUcsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTExX05FWFRfREVTQ19QVFIoKQkJYmZpbl9yZWFkMzIoRE1BMTFfTkVYVF9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExMV9ORVhUX0RFU0NfUFRSKHZhbCkJYmZpbl93cml0ZTMyKERNQTExX05FWFRfREVTQ19QVFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTExX1NUQVJUX0FERFIoKQkJYmZpbl9yZWFkMzIoRE1BMTFfU1RBUlRfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExMV9TVEFSVF9BRERSKHZhbCkJYmZpbl93cml0ZTMyKERNQTExX1NUQVJUX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTExX1hfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BMTFfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExMV9YX0NPVU5UKHZhbCkJCWJmaW5fd3JpdGUxNihETUExMV9YX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExMV9ZX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTExX1lfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTFfWV9DT1VOVCh2YWwpCQliZmluX3dyaXRlMTYoRE1BMTFfWV9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTFfWF9NT0RJRlkoKQkJYmZpbl9yZWFkMTYoRE1BMTFfWF9NT0RJRlkpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTFfWF9NT0RJRlkodmFsKQkJYmZpbl93cml0ZTE2KERNQTExX1hfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExMV9ZX01PRElGWSgpCQliZmluX3JlYWQxNihETUExMV9ZX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExMV9ZX01PRElGWSh2YWwpCQliZmluX3dyaXRlMTYoRE1BMTFfWV9NT0RJRlksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTExX0NVUlJfREVTQ19QVFIoKQkJYmZpbl9yZWFkMzIoRE1BMTFfQ1VSUl9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExMV9DVVJSX0RFU0NfUFRSKHZhbCkJYmZpbl93cml0ZTMyKERNQTExX0NVUlJfREVTQ19QVFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTExX0NVUlJfQUREUigpCQliZmluX3JlYWQzMihETUExMV9DVVJSX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTFfQ1VSUl9BRERSKHZhbCkJCWJmaW5fd3JpdGUzMihETUExMV9DVVJSX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTExX0NVUlJfWF9DT1VOVCgpCQliZmluX3JlYWQxNihETUExMV9DVVJSX1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTFfQ1VSUl9YX0NPVU5UKHZhbCkJYmZpbl93cml0ZTE2KERNQTExX0NVUlJfWF9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTFfQ1VSUl9ZX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTExX0NVUlJfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExMV9DVVJSX1lfQ09VTlQodmFsKQliZmluX3dyaXRlMTYoRE1BMTFfQ1VSUl9ZX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExMV9JUlFfU1RBVFVTKCkJCWJmaW5fcmVhZDE2KERNQTExX0lSUV9TVEFUVVMpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTFfSVJRX1NUQVRVUyh2YWwpCWJmaW5fd3JpdGUxNihETUExMV9JUlFfU1RBVFVTLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExMV9QRVJJUEhFUkFMX01BUCgpCWJmaW5fcmVhZDE2KERNQTExX1BFUklQSEVSQUxfTUFQKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTExX1BFUklQSEVSQUxfTUFQKHZhbCkJYmZpbl93cml0ZTE2KERNQTExX1BFUklQSEVSQUxfTUFQLCB2YWwpCisKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDBfQ09ORklHKCkJCWJmaW5fcmVhZDE2KE1ETUFfRDBfQ09ORklHKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDBfQ09ORklHKHZhbCkJCWJmaW5fd3JpdGUxNihNRE1BX0QwX0NPTkZJRywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMF9ORVhUX0RFU0NfUFRSKCkJYmZpbl9yZWFkMzIoTURNQV9EMF9ORVhUX0RFU0NfUFRSKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDBfTkVYVF9ERVNDX1BUUih2YWwpCWJmaW5fd3JpdGUzMihNRE1BX0QwX05FWFRfREVTQ19QVFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDBfU1RBUlRfQUREUigpCQliZmluX3JlYWQzMihNRE1BX0QwX1NUQVJUX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMF9TVEFSVF9BRERSKHZhbCkJYmZpbl93cml0ZTMyKE1ETUFfRDBfU1RBUlRfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMF9YX0NPVU5UKCkJCWJmaW5fcmVhZDE2KE1ETUFfRDBfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QwX1hfQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KE1ETUFfRDBfWF9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMF9ZX0NPVU5UKCkJCWJmaW5fcmVhZDE2KE1ETUFfRDBfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QwX1lfQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KE1ETUFfRDBfWV9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMF9YX01PRElGWSgpCQliZmluX3JlYWQxNihNRE1BX0QwX1hfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDBfWF9NT0RJRlkodmFsKQliZmluX3dyaXRlMTYoTURNQV9EMF9YX01PRElGWSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMF9ZX01PRElGWSgpCQliZmluX3JlYWQxNihNRE1BX0QwX1lfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDBfWV9NT0RJRlkodmFsKQliZmluX3dyaXRlMTYoTURNQV9EMF9ZX01PRElGWSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMF9DVVJSX0RFU0NfUFRSKCkJYmZpbl9yZWFkMzIoTURNQV9EMF9DVVJSX0RFU0NfUFRSKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDBfQ1VSUl9ERVNDX1BUUih2YWwpCWJmaW5fd3JpdGUzMihNRE1BX0QwX0NVUlJfREVTQ19QVFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDBfQ1VSUl9BRERSKCkJCWJmaW5fcmVhZDMyKE1ETUFfRDBfQ1VSUl9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDBfQ1VSUl9BRERSKHZhbCkJYmZpbl93cml0ZTMyKE1ETUFfRDBfQ1VSUl9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QwX0NVUlJfWF9DT1VOVCgpCWJmaW5fcmVhZDE2KE1ETUFfRDBfQ1VSUl9YX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDBfQ1VSUl9YX0NPVU5UKHZhbCkJYmZpbl93cml0ZTE2KE1ETUFfRDBfQ1VSUl9YX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QwX0NVUlJfWV9DT1VOVCgpCWJmaW5fcmVhZDE2KE1ETUFfRDBfQ1VSUl9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDBfQ1VSUl9ZX0NPVU5UKHZhbCkJYmZpbl93cml0ZTE2KE1ETUFfRDBfQ1VSUl9ZX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QwX0lSUV9TVEFUVVMoKQkJYmZpbl9yZWFkMTYoTURNQV9EMF9JUlFfU1RBVFVTKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDBfSVJRX1NUQVRVUyh2YWwpCWJmaW5fd3JpdGUxNihNRE1BX0QwX0lSUV9TVEFUVVMsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDBfUEVSSVBIRVJBTF9NQVAoKQliZmluX3JlYWQxNihNRE1BX0QwX1BFUklQSEVSQUxfTUFQKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDBfUEVSSVBIRVJBTF9NQVAodmFsKQliZmluX3dyaXRlMTYoTURNQV9EMF9QRVJJUEhFUkFMX01BUCwgdmFsKQorCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MwX0NPTkZJRygpCQliZmluX3JlYWQxNihNRE1BX1MwX0NPTkZJRykKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MwX0NPTkZJRyh2YWwpCQliZmluX3dyaXRlMTYoTURNQV9TMF9DT05GSUcsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzBfTkVYVF9ERVNDX1BUUigpCWJmaW5fcmVhZDMyKE1ETUFfUzBfTkVYVF9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MwX05FWFRfREVTQ19QVFIodmFsKQliZmluX3dyaXRlMzIoTURNQV9TMF9ORVhUX0RFU0NfUFRSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MwX1NUQVJUX0FERFIoKQkJYmZpbl9yZWFkMzIoTURNQV9TMF9TVEFSVF9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzBfU1RBUlRfQUREUih2YWwpCWJmaW5fd3JpdGUzMihNRE1BX1MwX1NUQVJUX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzBfWF9DT1VOVCgpCQliZmluX3JlYWQxNihNRE1BX1MwX1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMF9YX0NPVU5UKHZhbCkJCWJmaW5fd3JpdGUxNihNRE1BX1MwX1hfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzBfWV9DT1VOVCgpCQliZmluX3JlYWQxNihNRE1BX1MwX1lfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMF9ZX0NPVU5UKHZhbCkJCWJmaW5fd3JpdGUxNihNRE1BX1MwX1lfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzBfWF9NT0RJRlkoKQkJYmZpbl9yZWFkMTYoTURNQV9TMF9YX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MwX1hfTU9ESUZZKHZhbCkJYmZpbl93cml0ZTE2KE1ETUFfUzBfWF9NT0RJRlksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzBfWV9NT0RJRlkoKQkJYmZpbl9yZWFkMTYoTURNQV9TMF9ZX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MwX1lfTU9ESUZZKHZhbCkJYmZpbl93cml0ZTE2KE1ETUFfUzBfWV9NT0RJRlksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzBfQ1VSUl9ERVNDX1BUUigpCWJmaW5fcmVhZDMyKE1ETUFfUzBfQ1VSUl9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MwX0NVUlJfREVTQ19QVFIodmFsKQliZmluX3dyaXRlMzIoTURNQV9TMF9DVVJSX0RFU0NfUFRSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MwX0NVUlJfQUREUigpCQliZmluX3JlYWQzMihNRE1BX1MwX0NVUlJfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MwX0NVUlJfQUREUih2YWwpCWJmaW5fd3JpdGUzMihNRE1BX1MwX0NVUlJfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMF9DVVJSX1hfQ09VTlQoKQliZmluX3JlYWQxNihNRE1BX1MwX0NVUlJfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MwX0NVUlJfWF9DT1VOVCh2YWwpCWJmaW5fd3JpdGUxNihNRE1BX1MwX0NVUlJfWF9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMF9DVVJSX1lfQ09VTlQoKQliZmluX3JlYWQxNihNRE1BX1MwX0NVUlJfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MwX0NVUlJfWV9DT1VOVCh2YWwpCWJmaW5fd3JpdGUxNihNRE1BX1MwX0NVUlJfWV9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMF9JUlFfU1RBVFVTKCkJCWJmaW5fcmVhZDE2KE1ETUFfUzBfSVJRX1NUQVRVUykKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MwX0lSUV9TVEFUVVModmFsKQliZmluX3dyaXRlMTYoTURNQV9TMF9JUlFfU1RBVFVTLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MwX1BFUklQSEVSQUxfTUFQKCkJYmZpbl9yZWFkMTYoTURNQV9TMF9QRVJJUEhFUkFMX01BUCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MwX1BFUklQSEVSQUxfTUFQKHZhbCkJYmZpbl93cml0ZTE2KE1ETUFfUzBfUEVSSVBIRVJBTF9NQVAsIHZhbCkKKworI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMV9DT05GSUcoKQkJYmZpbl9yZWFkMTYoTURNQV9EMV9DT05GSUcpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMV9DT05GSUcodmFsKQkJYmZpbl93cml0ZTE2KE1ETUFfRDFfQ09ORklHLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QxX05FWFRfREVTQ19QVFIoKQliZmluX3JlYWQzMihNRE1BX0QxX05FWFRfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMV9ORVhUX0RFU0NfUFRSKHZhbCkJYmZpbl93cml0ZTMyKE1ETUFfRDFfTkVYVF9ERVNDX1BUUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMV9TVEFSVF9BRERSKCkJCWJmaW5fcmVhZDMyKE1ETUFfRDFfU1RBUlRfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QxX1NUQVJUX0FERFIodmFsKQliZmluX3dyaXRlMzIoTURNQV9EMV9TVEFSVF9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QxX1hfQ09VTlQoKQkJYmZpbl9yZWFkMTYoTURNQV9EMV9YX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDFfWF9DT1VOVCh2YWwpCQliZmluX3dyaXRlMTYoTURNQV9EMV9YX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QxX1lfQ09VTlQoKQkJYmZpbl9yZWFkMTYoTURNQV9EMV9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDFfWV9DT1VOVCh2YWwpCQliZmluX3dyaXRlMTYoTURNQV9EMV9ZX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QxX1hfTU9ESUZZKCkJCWJmaW5fcmVhZDE2KE1ETUFfRDFfWF9NT0RJRlkpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMV9YX01PRElGWSh2YWwpCWJmaW5fd3JpdGUxNihNRE1BX0QxX1hfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QxX1lfTU9ESUZZKCkJCWJmaW5fcmVhZDE2KE1ETUFfRDFfWV9NT0RJRlkpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMV9ZX01PRElGWSh2YWwpCWJmaW5fd3JpdGUxNihNRE1BX0QxX1lfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QxX0NVUlJfREVTQ19QVFIoKQliZmluX3JlYWQzMihNRE1BX0QxX0NVUlJfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMV9DVVJSX0RFU0NfUFRSKHZhbCkJYmZpbl93cml0ZTMyKE1ETUFfRDFfQ1VSUl9ERVNDX1BUUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMV9DVVJSX0FERFIoKQkJYmZpbl9yZWFkMzIoTURNQV9EMV9DVVJSX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMV9DVVJSX0FERFIodmFsKQliZmluX3dyaXRlMzIoTURNQV9EMV9DVVJSX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDFfQ1VSUl9YX0NPVU5UKCkJYmZpbl9yZWFkMTYoTURNQV9EMV9DVVJSX1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMV9DVVJSX1hfQ09VTlQodmFsKQliZmluX3dyaXRlMTYoTURNQV9EMV9DVVJSX1hfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDFfQ1VSUl9ZX0NPVU5UKCkJYmZpbl9yZWFkMTYoTURNQV9EMV9DVVJSX1lfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMV9DVVJSX1lfQ09VTlQodmFsKQliZmluX3dyaXRlMTYoTURNQV9EMV9DVVJSX1lfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDFfSVJRX1NUQVRVUygpCQliZmluX3JlYWQxNihNRE1BX0QxX0lSUV9TVEFUVVMpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMV9JUlFfU1RBVFVTKHZhbCkJYmZpbl93cml0ZTE2KE1ETUFfRDFfSVJRX1NUQVRVUywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMV9QRVJJUEhFUkFMX01BUCgpCWJmaW5fcmVhZDE2KE1ETUFfRDFfUEVSSVBIRVJBTF9NQVApCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMV9QRVJJUEhFUkFMX01BUCh2YWwpCWJmaW5fd3JpdGUxNihNRE1BX0QxX1BFUklQSEVSQUxfTUFQLCB2YWwpCisKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzFfQ09ORklHKCkJCWJmaW5fcmVhZDE2KE1ETUFfUzFfQ09ORklHKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzFfQ09ORklHKHZhbCkJCWJmaW5fd3JpdGUxNihNRE1BX1MxX0NPTkZJRywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMV9ORVhUX0RFU0NfUFRSKCkJYmZpbl9yZWFkMzIoTURNQV9TMV9ORVhUX0RFU0NfUFRSKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzFfTkVYVF9ERVNDX1BUUih2YWwpCWJmaW5fd3JpdGUzMihNRE1BX1MxX05FWFRfREVTQ19QVFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzFfU1RBUlRfQUREUigpCQliZmluX3JlYWQzMihNRE1BX1MxX1NUQVJUX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMV9TVEFSVF9BRERSKHZhbCkJYmZpbl93cml0ZTMyKE1ETUFfUzFfU1RBUlRfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMV9YX0NPVU5UKCkJCWJmaW5fcmVhZDE2KE1ETUFfUzFfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MxX1hfQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KE1ETUFfUzFfWF9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMV9ZX0NPVU5UKCkJCWJmaW5fcmVhZDE2KE1ETUFfUzFfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MxX1lfQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KE1ETUFfUzFfWV9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMV9YX01PRElGWSgpCQliZmluX3JlYWQxNihNRE1BX1MxX1hfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzFfWF9NT0RJRlkodmFsKQliZmluX3dyaXRlMTYoTURNQV9TMV9YX01PRElGWSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMV9ZX01PRElGWSgpCQliZmluX3JlYWQxNihNRE1BX1MxX1lfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzFfWV9NT0RJRlkodmFsKQliZmluX3dyaXRlMTYoTURNQV9TMV9ZX01PRElGWSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMV9DVVJSX0RFU0NfUFRSKCkJYmZpbl9yZWFkMzIoTURNQV9TMV9DVVJSX0RFU0NfUFRSKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzFfQ1VSUl9ERVNDX1BUUih2YWwpCWJmaW5fd3JpdGUzMihNRE1BX1MxX0NVUlJfREVTQ19QVFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzFfQ1VSUl9BRERSKCkJCWJmaW5fcmVhZDMyKE1ETUFfUzFfQ1VSUl9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzFfQ1VSUl9BRERSKHZhbCkJYmZpbl93cml0ZTMyKE1ETUFfUzFfQ1VSUl9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MxX0NVUlJfWF9DT1VOVCgpCWJmaW5fcmVhZDE2KE1ETUFfUzFfQ1VSUl9YX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzFfQ1VSUl9YX0NPVU5UKHZhbCkJYmZpbl93cml0ZTE2KE1ETUFfUzFfQ1VSUl9YX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MxX0NVUlJfWV9DT1VOVCgpCWJmaW5fcmVhZDE2KE1ETUFfUzFfQ1VSUl9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzFfQ1VSUl9ZX0NPVU5UKHZhbCkJYmZpbl93cml0ZTE2KE1ETUFfUzFfQ1VSUl9ZX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MxX0lSUV9TVEFUVVMoKQkJYmZpbl9yZWFkMTYoTURNQV9TMV9JUlFfU1RBVFVTKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzFfSVJRX1NUQVRVUyh2YWwpCWJmaW5fd3JpdGUxNihNRE1BX1MxX0lSUV9TVEFUVVMsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzFfUEVSSVBIRVJBTF9NQVAoKQliZmluX3JlYWQxNihNRE1BX1MxX1BFUklQSEVSQUxfTUFQKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzFfUEVSSVBIRVJBTF9NQVAodmFsKQliZmluX3dyaXRlMTYoTURNQV9TMV9QRVJJUEhFUkFMX01BUCwgdmFsKQorCisKKy8qIFBhcmFsbGVsIFBlcmlwaGVyYWwgSW50ZXJmYWNlICgweEZGQzAxMDAwIC0gMHhGRkMwMTBGRikJCQkJCQkJKi8KKyNkZWZpbmUgYmZpbl9yZWFkX1BQSV9DT05UUk9MKCkJCQliZmluX3JlYWQxNihQUElfQ09OVFJPTCkKKyNkZWZpbmUgYmZpbl93cml0ZV9QUElfQ09OVFJPTCh2YWwpCQliZmluX3dyaXRlMTYoUFBJX0NPTlRST0wsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BQSV9TVEFUVVMoKQkJCWJmaW5fcmVhZDE2KFBQSV9TVEFUVVMpCisjZGVmaW5lIGJmaW5fd3JpdGVfUFBJX1NUQVRVUyh2YWwpCQliZmluX3dyaXRlMTYoUFBJX1NUQVRVUywgdmFsKQorI2RlZmluZSBiZmluX2NsZWFyX1BQSV9TVEFUVVMoKQkJCWJmaW5fd3JpdGVfUFBJX1NUQVRVUygweEZGRkYpCisjZGVmaW5lIGJmaW5fcmVhZF9QUElfREVMQVkoKQkJCWJmaW5fcmVhZDE2KFBQSV9ERUxBWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9QUElfREVMQVkodmFsKQkJYmZpbl93cml0ZTE2KFBQSV9ERUxBWSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUFBJX0NPVU5UKCkJCQliZmluX3JlYWQxNihQUElfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfUFBJX0NPVU5UKHZhbCkJCWJmaW5fd3JpdGUxNihQUElfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BQSV9GUkFNRSgpCQkJYmZpbl9yZWFkMTYoUFBJX0ZSQU1FKQorI2RlZmluZSBiZmluX3dyaXRlX1BQSV9GUkFNRSh2YWwpCQliZmluX3dyaXRlMTYoUFBJX0ZSQU1FLCB2YWwpCisKKworLyogVHdvLVdpcmUgSW50ZXJmYWNlCQkoMHhGRkMwMTQwMCAtIDB4RkZDMDE0RkYpCQkJCQkJCQkqLworCisvKiBHZW5lcmFsIFB1cnBvc2UgSS9PIFBvcnQgRyAoMHhGRkMwMTUwMCAtIDB4RkZDMDE1RkYpCQkJCQkJCQkqLworI2RlZmluZSBiZmluX3JlYWRfUE9SVEdJTygpCQkJYmZpbl9yZWFkMTYoUE9SVEdJTykKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JUR0lPKHZhbCkJCQliZmluX3dyaXRlMTYoUE9SVEdJTywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEdJT19DTEVBUigpCQliZmluX3JlYWQxNihQT1JUR0lPX0NMRUFSKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRHSU9fQ0xFQVIodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRHSU9fQ0xFQVIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRHSU9fU0VUKCkJCQliZmluX3JlYWQxNihQT1JUR0lPX1NFVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JUR0lPX1NFVCh2YWwpCQliZmluX3dyaXRlMTYoUE9SVEdJT19TRVQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRHSU9fVE9HR0xFKCkJCWJmaW5fcmVhZDE2KFBPUlRHSU9fVE9HR0xFKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRHSU9fVE9HR0xFKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JUR0lPX1RPR0dMRSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEdJT19NQVNLQSgpCQliZmluX3JlYWQxNihQT1JUR0lPX01BU0tBKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRHSU9fTUFTS0EodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRHSU9fTUFTS0EsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRHSU9fTUFTS0FfQ0xFQVIoKQkJYmZpbl9yZWFkMTYoUE9SVEdJT19NQVNLQV9DTEVBUikKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JUR0lPX01BU0tBX0NMRUFSKHZhbCkJYmZpbl93cml0ZTE2KFBPUlRHSU9fTUFTS0FfQ0xFQVIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRHSU9fTUFTS0FfU0VUKCkJCWJmaW5fcmVhZDE2KFBPUlRHSU9fTUFTS0FfU0VUKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRHSU9fTUFTS0FfU0VUKHZhbCkJYmZpbl93cml0ZTE2KFBPUlRHSU9fTUFTS0FfU0VULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JUR0lPX01BU0tBX1RPR0dMRSgpCWJmaW5fcmVhZDE2KFBPUlRHSU9fTUFTS0FfVE9HR0xFKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRHSU9fTUFTS0FfVE9HR0xFKHZhbCkJYmZpbl93cml0ZTE2KFBPUlRHSU9fTUFTS0FfVE9HR0xFLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JUR0lPX01BU0tCKCkJCWJmaW5fcmVhZDE2KFBPUlRHSU9fTUFTS0IpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEdJT19NQVNLQih2YWwpCQliZmluX3dyaXRlMTYoUE9SVEdJT19NQVNLQiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEdJT19NQVNLQl9DTEVBUigpCQliZmluX3JlYWQxNihQT1JUR0lPX01BU0tCX0NMRUFSKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRHSU9fTUFTS0JfQ0xFQVIodmFsKQliZmluX3dyaXRlMTYoUE9SVEdJT19NQVNLQl9DTEVBUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEdJT19NQVNLQl9TRVQoKQkJYmZpbl9yZWFkMTYoUE9SVEdJT19NQVNLQl9TRVQpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEdJT19NQVNLQl9TRVQodmFsKQliZmluX3dyaXRlMTYoUE9SVEdJT19NQVNLQl9TRVQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRHSU9fTUFTS0JfVE9HR0xFKCkJYmZpbl9yZWFkMTYoUE9SVEdJT19NQVNLQl9UT0dHTEUpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEdJT19NQVNLQl9UT0dHTEUodmFsKQliZmluX3dyaXRlMTYoUE9SVEdJT19NQVNLQl9UT0dHTEUsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRHSU9fRElSKCkJCQliZmluX3JlYWQxNihQT1JUR0lPX0RJUikKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JUR0lPX0RJUih2YWwpCQliZmluX3dyaXRlMTYoUE9SVEdJT19ESVIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRHSU9fUE9MQVIoKQkJYmZpbl9yZWFkMTYoUE9SVEdJT19QT0xBUikKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JUR0lPX1BPTEFSKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JUR0lPX1BPTEFSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JUR0lPX0VER0UoKQkJYmZpbl9yZWFkMTYoUE9SVEdJT19FREdFKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRHSU9fRURHRSh2YWwpCQliZmluX3dyaXRlMTYoUE9SVEdJT19FREdFLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JUR0lPX0JPVEgoKQkJYmZpbl9yZWFkMTYoUE9SVEdJT19CT1RIKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRHSU9fQk9USCh2YWwpCQliZmluX3dyaXRlMTYoUE9SVEdJT19CT1RILCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JUR0lPX0lORU4oKQkJYmZpbl9yZWFkMTYoUE9SVEdJT19JTkVOKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRHSU9fSU5FTih2YWwpCQliZmluX3dyaXRlMTYoUE9SVEdJT19JTkVOLCB2YWwpCisKKworLyogR2VuZXJhbCBQdXJwb3NlIEkvTyBQb3J0IEggKDB4RkZDMDE3MDAgLSAweEZGQzAxN0ZGKQkJCQkJCQkJKi8KKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRISU8oKQkJCWJmaW5fcmVhZDE2KFBPUlRISU8pCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEhJTyh2YWwpCQkJYmZpbl93cml0ZTE2KFBPUlRISU8sIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRISU9fQ0xFQVIoKQkJYmZpbl9yZWFkMTYoUE9SVEhJT19DTEVBUikKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JUSElPX0NMRUFSKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JUSElPX0NMRUFSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JUSElPX1NFVCgpCQkJYmZpbl9yZWFkMTYoUE9SVEhJT19TRVQpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEhJT19TRVQodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRISU9fU0VULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JUSElPX1RPR0dMRSgpCQliZmluX3JlYWQxNihQT1JUSElPX1RPR0dMRSkKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JUSElPX1RPR0dMRSh2YWwpCQliZmluX3dyaXRlMTYoUE9SVEhJT19UT0dHTEUsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRISU9fTUFTS0EoKQkJYmZpbl9yZWFkMTYoUE9SVEhJT19NQVNLQSkKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JUSElPX01BU0tBKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JUSElPX01BU0tBLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JUSElPX01BU0tBX0NMRUFSKCkJCWJmaW5fcmVhZDE2KFBPUlRISU9fTUFTS0FfQ0xFQVIpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEhJT19NQVNLQV9DTEVBUih2YWwpCWJmaW5fd3JpdGUxNihQT1JUSElPX01BU0tBX0NMRUFSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JUSElPX01BU0tBX1NFVCgpCQliZmluX3JlYWQxNihQT1JUSElPX01BU0tBX1NFVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JUSElPX01BU0tBX1NFVCh2YWwpCWJmaW5fd3JpdGUxNihQT1JUSElPX01BU0tBX1NFVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEhJT19NQVNLQV9UT0dHTEUoKQliZmluX3JlYWQxNihQT1JUSElPX01BU0tBX1RPR0dMRSkKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JUSElPX01BU0tBX1RPR0dMRSh2YWwpCWJmaW5fd3JpdGUxNihQT1JUSElPX01BU0tBX1RPR0dMRSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEhJT19NQVNLQigpCQliZmluX3JlYWQxNihQT1JUSElPX01BU0tCKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRISU9fTUFTS0IodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRISU9fTUFTS0IsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRISU9fTUFTS0JfQ0xFQVIoKQkJYmZpbl9yZWFkMTYoUE9SVEhJT19NQVNLQl9DTEVBUikKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JUSElPX01BU0tCX0NMRUFSKHZhbCkJYmZpbl93cml0ZTE2KFBPUlRISU9fTUFTS0JfQ0xFQVIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRISU9fTUFTS0JfU0VUKCkJCWJmaW5fcmVhZDE2KFBPUlRISU9fTUFTS0JfU0VUKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRISU9fTUFTS0JfU0VUKHZhbCkJYmZpbl93cml0ZTE2KFBPUlRISU9fTUFTS0JfU0VULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JUSElPX01BU0tCX1RPR0dMRSgpCWJmaW5fcmVhZDE2KFBPUlRISU9fTUFTS0JfVE9HR0xFKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRISU9fTUFTS0JfVE9HR0xFKHZhbCkJYmZpbl93cml0ZTE2KFBPUlRISU9fTUFTS0JfVE9HR0xFLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JUSElPX0RJUigpCQkJYmZpbl9yZWFkMTYoUE9SVEhJT19ESVIpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEhJT19ESVIodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRISU9fRElSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JUSElPX1BPTEFSKCkJCWJmaW5fcmVhZDE2KFBPUlRISU9fUE9MQVIpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEhJT19QT0xBUih2YWwpCQliZmluX3dyaXRlMTYoUE9SVEhJT19QT0xBUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEhJT19FREdFKCkJCWJmaW5fcmVhZDE2KFBPUlRISU9fRURHRSkKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JUSElPX0VER0UodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRISU9fRURHRSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEhJT19CT1RIKCkJCWJmaW5fcmVhZDE2KFBPUlRISU9fQk9USCkKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JUSElPX0JPVEgodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRISU9fQk9USCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEhJT19JTkVOKCkJCWJmaW5fcmVhZDE2KFBPUlRISU9fSU5FTikKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JUSElPX0lORU4odmFsKQkJYmZpbl93cml0ZTE2KFBPUlRISU9fSU5FTiwgdmFsKQorCisKKy8qIFVBUlQxIENvbnRyb2xsZXIJCSgweEZGQzAyMDAwIC0gMHhGRkMwMjBGRikJCQkJCQkJCSovCisjZGVmaW5lIGJmaW5fcmVhZF9VQVJUMV9USFIoKQkJCWJmaW5fcmVhZDE2KFVBUlQxX1RIUikKKyNkZWZpbmUgYmZpbl93cml0ZV9VQVJUMV9USFIodmFsKQkJYmZpbl93cml0ZTE2KFVBUlQxX1RIUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVUFSVDFfUkJSKCkJCQliZmluX3JlYWQxNihVQVJUMV9SQlIpCisjZGVmaW5lIGJmaW5fd3JpdGVfVUFSVDFfUkJSKHZhbCkJCWJmaW5fd3JpdGUxNihVQVJUMV9SQlIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1VBUlQxX0RMTCgpCQkJYmZpbl9yZWFkMTYoVUFSVDFfRExMKQorI2RlZmluZSBiZmluX3dyaXRlX1VBUlQxX0RMTCh2YWwpCQliZmluX3dyaXRlMTYoVUFSVDFfRExMLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9VQVJUMV9JRVIoKQkJCWJmaW5fcmVhZDE2KFVBUlQxX0lFUikKKyNkZWZpbmUgYmZpbl93cml0ZV9VQVJUMV9JRVIodmFsKQkJYmZpbl93cml0ZTE2KFVBUlQxX0lFUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVUFSVDFfRExIKCkJCQliZmluX3JlYWQxNihVQVJUMV9ETEgpCisjZGVmaW5lIGJmaW5fd3JpdGVfVUFSVDFfRExIKHZhbCkJCWJmaW5fd3JpdGUxNihVQVJUMV9ETEgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1VBUlQxX0lJUigpCQkJYmZpbl9yZWFkMTYoVUFSVDFfSUlSKQorI2RlZmluZSBiZmluX3dyaXRlX1VBUlQxX0lJUih2YWwpCQliZmluX3dyaXRlMTYoVUFSVDFfSUlSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9VQVJUMV9MQ1IoKQkJCWJmaW5fcmVhZDE2KFVBUlQxX0xDUikKKyNkZWZpbmUgYmZpbl93cml0ZV9VQVJUMV9MQ1IodmFsKQkJYmZpbl93cml0ZTE2KFVBUlQxX0xDUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVUFSVDFfTUNSKCkJCQliZmluX3JlYWQxNihVQVJUMV9NQ1IpCisjZGVmaW5lIGJmaW5fd3JpdGVfVUFSVDFfTUNSKHZhbCkJCWJmaW5fd3JpdGUxNihVQVJUMV9NQ1IsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1VBUlQxX0xTUigpCQkJYmZpbl9yZWFkMTYoVUFSVDFfTFNSKQorI2RlZmluZSBiZmluX3dyaXRlX1VBUlQxX0xTUih2YWwpCQliZmluX3dyaXRlMTYoVUFSVDFfTFNSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9VQVJUMV9NU1IoKQkJCWJmaW5fcmVhZDE2KFVBUlQxX01TUikKKyNkZWZpbmUgYmZpbl93cml0ZV9VQVJUMV9NU1IodmFsKQkJYmZpbl93cml0ZTE2KFVBUlQxX01TUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVUFSVDFfU0NSKCkJCQliZmluX3JlYWQxNihVQVJUMV9TQ1IpCisjZGVmaW5lIGJmaW5fd3JpdGVfVUFSVDFfU0NSKHZhbCkJCWJmaW5fd3JpdGUxNihVQVJUMV9TQ1IsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1VBUlQxX0dDVEwoKQkJCWJmaW5fcmVhZDE2KFVBUlQxX0dDVEwpCisjZGVmaW5lIGJmaW5fd3JpdGVfVUFSVDFfR0NUTCh2YWwpCQliZmluX3dyaXRlMTYoVUFSVDFfR0NUTCwgdmFsKQorCisvKiBPbWl0IENBTiByZWdpc3RlciBzZXRzIGZyb20gdGhlIGNkZWZCRjUzNC5oIChDQU4gaXMgbm90IGluIHRoZSBBRFNQLUJGNTF4IHByb2Nlc3NvcikgKi8KKworLyogUGluIENvbnRyb2wgUmVnaXN0ZXJzCSgweEZGQzAzMjAwIC0gMHhGRkMwMzJGRikJCQkJCQkJCSovCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JURl9GRVIoKQkJCWJmaW5fcmVhZDE2KFBPUlRGX0ZFUikKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JURl9GRVIodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRGX0ZFUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEdfRkVSKCkJCQliZmluX3JlYWQxNihQT1JUR19GRVIpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEdfRkVSKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JUR19GRVIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRIX0ZFUigpCQkJYmZpbl9yZWFkMTYoUE9SVEhfRkVSKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRIX0ZFUih2YWwpCQliZmluX3dyaXRlMTYoUE9SVEhfRkVSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JUX01VWCgpCQkJYmZpbl9yZWFkMTYoUE9SVF9NVVgpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVF9NVVgodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRfTVVYLCB2YWwpCisKKworLyogSGFuZHNoYWtlIE1ETUEgUmVnaXN0ZXJzCSgweEZGQzAzMzAwIC0gMHhGRkMwMzNGRikJCQkJCQkJCSovCisjZGVmaW5lIGJmaW5fcmVhZF9ITURNQTBfQ09OVFJPTCgpCQliZmluX3JlYWQxNihITURNQTBfQ09OVFJPTCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ITURNQTBfQ09OVFJPTCh2YWwpCQliZmluX3dyaXRlMTYoSE1ETUEwX0NPTlRST0wsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0hNRE1BMF9FQ0lOSVQoKQkJYmZpbl9yZWFkMTYoSE1ETUEwX0VDSU5JVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ITURNQTBfRUNJTklUKHZhbCkJCWJmaW5fd3JpdGUxNihITURNQTBfRUNJTklULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ITURNQTBfQkNJTklUKCkJCWJmaW5fcmVhZDE2KEhNRE1BMF9CQ0lOSVQpCisjZGVmaW5lIGJmaW5fd3JpdGVfSE1ETUEwX0JDSU5JVCh2YWwpCQliZmluX3dyaXRlMTYoSE1ETUEwX0JDSU5JVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfSE1ETUEwX0VDVVJHRU5UKCkJCWJmaW5fcmVhZDE2KEhNRE1BMF9FQ1VSR0VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ITURNQTBfRUNVUkdFTlQodmFsKQkJYmZpbl93cml0ZTE2KEhNRE1BMF9FQ1VSR0VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfSE1ETUEwX0VDT1ZFUkZMT1coKQkJYmZpbl9yZWFkMTYoSE1ETUEwX0VDT1ZFUkZMT1cpCisjZGVmaW5lIGJmaW5fd3JpdGVfSE1ETUEwX0VDT1ZFUkZMT1codmFsKQliZmluX3dyaXRlMTYoSE1ETUEwX0VDT1ZFUkZMT1csIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0hNRE1BMF9FQ09VTlQoKQkJYmZpbl9yZWFkMTYoSE1ETUEwX0VDT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ITURNQTBfRUNPVU5UKHZhbCkJCWJmaW5fd3JpdGUxNihITURNQTBfRUNPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ITURNQTBfQkNPVU5UKCkJCWJmaW5fcmVhZDE2KEhNRE1BMF9CQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfSE1ETUEwX0JDT1VOVCh2YWwpCQliZmluX3dyaXRlMTYoSE1ETUEwX0JDT1VOVCwgdmFsKQorCisjZGVmaW5lIGJmaW5fcmVhZF9ITURNQTFfQ09OVFJPTCgpCQliZmluX3JlYWQxNihITURNQTFfQ09OVFJPTCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ITURNQTFfQ09OVFJPTCh2YWwpCQliZmluX3dyaXRlMTYoSE1ETUExX0NPTlRST0wsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0hNRE1BMV9FQ0lOSVQoKQkJYmZpbl9yZWFkMTYoSE1ETUExX0VDSU5JVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ITURNQTFfRUNJTklUKHZhbCkJCWJmaW5fd3JpdGUxNihITURNQTFfRUNJTklULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ITURNQTFfQkNJTklUKCkJCWJmaW5fcmVhZDE2KEhNRE1BMV9CQ0lOSVQpCisjZGVmaW5lIGJmaW5fd3JpdGVfSE1ETUExX0JDSU5JVCh2YWwpCQliZmluX3dyaXRlMTYoSE1ETUExX0JDSU5JVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfSE1ETUExX0VDVVJHRU5UKCkJCWJmaW5fcmVhZDE2KEhNRE1BMV9FQ1VSR0VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ITURNQTFfRUNVUkdFTlQodmFsKQkJYmZpbl93cml0ZTE2KEhNRE1BMV9FQ1VSR0VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfSE1ETUExX0VDT1ZFUkZMT1coKQkJYmZpbl9yZWFkMTYoSE1ETUExX0VDT1ZFUkZMT1cpCisjZGVmaW5lIGJmaW5fd3JpdGVfSE1ETUExX0VDT1ZFUkZMT1codmFsKQliZmluX3dyaXRlMTYoSE1ETUExX0VDT1ZFUkZMT1csIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0hNRE1BMV9FQ09VTlQoKQkJYmZpbl9yZWFkMTYoSE1ETUExX0VDT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ITURNQTFfRUNPVU5UKHZhbCkJCWJmaW5fd3JpdGUxNihITURNQTFfRUNPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ITURNQTFfQkNPVU5UKCkJCWJmaW5fcmVhZDE2KEhNRE1BMV9CQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfSE1ETUExX0JDT1VOVCh2YWwpCQliZmluX3dyaXRlMTYoSE1ETUExX0JDT1VOVCwgdmFsKQorCisvKiA9PT09IGVuZCBmcm9tIGNkZWZCRjUzNC5oID09PT0gKi8KKworLyogR1BJTyBQSU4gbXV4ICgweEZGQzAzMjEwIC0gT3hGRkMwMzI4OCkgKi8KKworI2RlZmluZSBiZmluX3JlYWRfUE9SVEZfTVVYKCkJCQliZmluX3JlYWQxNihQT1JURl9NVVgpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEZfTVVYKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JURl9NVVgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRHX01VWCgpCQkJYmZpbl9yZWFkMTYoUE9SVEdfTVVYKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRHX01VWCh2YWwpCQliZmluX3dyaXRlMTYoUE9SVEdfTVVYLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JUSF9NVVgoKQkJCWJmaW5fcmVhZDE2KFBPUlRIX01VWCkKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JUSF9NVVgodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRIX01VWCwgdmFsKQorCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JURl9EUklWRSgpCQkJYmZpbl9yZWFkMTYoUE9SVEZfRFJJVkUpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEZfRFJJVkUodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRGX0RSSVZFLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JUR19EUklWRSgpCQkJYmZpbl9yZWFkMTYoUE9SVEdfRFJJVkUpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEdfRFJJVkUodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRHX0RSSVZFLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JUSF9EUklWRSgpCQkJYmZpbl9yZWFkMTYoUE9SVEhfRFJJVkUpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEhfRFJJVkUodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRIX0RSSVZFLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JURl9TTEVXKCkJCQliZmluX3JlYWQxNihQT1JURl9TTEVXKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRGX1NMRVcodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRGX1NMRVcsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRHX1NMRVcoKQkJCWJmaW5fcmVhZDE2KFBPUlRHX1NMRVcpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEdfU0xFVyh2YWwpCQliZmluX3dyaXRlMTYoUE9SVEdfU0xFVywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEhfU0xFVygpCQkJYmZpbl9yZWFkMTYoUE9SVEhfU0xFVykKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JUSF9TTEVXKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JUSF9TTEVXLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JURl9IWVNURVJJU0lTKCkJCWJmaW5fcmVhZDE2KFBPUlRGX0hZU1RFUklTSVMpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEZfSFlTVEVSSVNJUyh2YWwpCWJmaW5fd3JpdGUxNihQT1JURl9IWVNURVJJU0lTLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JUR19IWVNURVJJU0lTKCkJCWJmaW5fcmVhZDE2KFBPUlRHX0hZU1RFUklTSVMpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEdfSFlTVEVSSVNJUyh2YWwpCWJmaW5fd3JpdGUxNihQT1JUR19IWVNURVJJU0lTLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JUSF9IWVNURVJJU0lTKCkJCWJmaW5fcmVhZDE2KFBPUlRIX0hZU1RFUklTSVMpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEhfSFlTVEVSSVNJUyh2YWwpCWJmaW5fd3JpdGUxNihQT1JUSF9IWVNURVJJU0lTLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NSVNDUE9SVF9EUklWRSgpCQliZmluX3JlYWQxNihNSVNDUE9SVF9EUklWRSkKKyNkZWZpbmUgYmZpbl93cml0ZV9NSVNDUE9SVF9EUklWRSh2YWwpCQliZmluX3dyaXRlMTYoTUlTQ1BPUlRfRFJJVkUsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01JU0NQT1JUX1NMRVcoKQkJYmZpbl9yZWFkMTYoTUlTQ1BPUlRfU0xFVykKKyNkZWZpbmUgYmZpbl93cml0ZV9NSVNDUE9SVF9TTEVXKHZhbCkJCWJmaW5fd3JpdGUxNihNSVNDUE9SVF9TTEVXLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NSVNDUE9SVF9IWVNURVJJU0lTKCkJCWJmaW5fcmVhZDE2KE1JU0NQT1JUX0hZU1RFUklTSVMpCisjZGVmaW5lIGJmaW5fd3JpdGVfTUlTQ1BPUlRfSFlTVEVSSVNJUyh2YWwpCWJmaW5fd3JpdGUxNihNSVNDUE9SVF9IWVNURVJJU0lTLCB2YWwpCisKKy8qIEhPU1QgUG9ydCBSZWdpc3RlcnMgKi8KKworI2RlZmluZSBiZmluX3JlYWRfSE9TVF9DT05UUk9MKCkJCWJmaW5fcmVhZDE2KEhPU1RfQ09OVFJPTCkKKyNkZWZpbmUgYmZpbl93cml0ZV9IT1NUX0NPTlRST0wodmFsKQkJYmZpbl93cml0ZTE2KEhPU1RfQ09OVFJPTCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfSE9TVF9TVEFUVVMoKQkJCWJmaW5fcmVhZDE2KEhPU1RfU1RBVFVTKQorI2RlZmluZSBiZmluX3dyaXRlX0hPU1RfU1RBVFVTKHZhbCkJCWJmaW5fd3JpdGUxNihIT1NUX1NUQVRVUywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfSE9TVF9USU1FT1VUKCkJCWJmaW5fcmVhZDE2KEhPU1RfVElNRU9VVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9IT1NUX1RJTUVPVVQodmFsKQkJYmZpbl93cml0ZTE2KEhPU1RfVElNRU9VVCwgdmFsKQorCisvKiBDb3VudGVyIFJlZ2lzdGVycyAqLworCisjZGVmaW5lIGJmaW5fcmVhZF9DTlRfQ09ORklHKCkJCQliZmluX3JlYWQxNihDTlRfQ09ORklHKQorI2RlZmluZSBiZmluX3dyaXRlX0NOVF9DT05GSUcodmFsKQkJYmZpbl93cml0ZTE2KENOVF9DT05GSUcsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NOVF9JTUFTSygpCQkJYmZpbl9yZWFkMTYoQ05UX0lNQVNLKQorI2RlZmluZSBiZmluX3dyaXRlX0NOVF9JTUFTSyh2YWwpCQliZmluX3dyaXRlMTYoQ05UX0lNQVNLLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DTlRfU1RBVFVTKCkJCQliZmluX3JlYWQxNihDTlRfU1RBVFVTKQorI2RlZmluZSBiZmluX3dyaXRlX0NOVF9TVEFUVVModmFsKQkJYmZpbl93cml0ZTE2KENOVF9TVEFUVVMsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NOVF9DT01NQU5EKCkJCQliZmluX3JlYWQxNihDTlRfQ09NTUFORCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DTlRfQ09NTUFORCh2YWwpCQliZmluX3dyaXRlMTYoQ05UX0NPTU1BTkQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NOVF9ERUJPVU5DRSgpCQliZmluX3JlYWQxNihDTlRfREVCT1VOQ0UpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ05UX0RFQk9VTkNFKHZhbCkJCWJmaW5fd3JpdGUxNihDTlRfREVCT1VOQ0UsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NOVF9DT1VOVEVSKCkJCQliZmluX3JlYWQzMihDTlRfQ09VTlRFUikKKyNkZWZpbmUgYmZpbl93cml0ZV9DTlRfQ09VTlRFUih2YWwpCQliZmluX3dyaXRlMzIoQ05UX0NPVU5URVIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NOVF9NQVgoKQkJCWJmaW5fcmVhZDMyKENOVF9NQVgpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ05UX01BWCh2YWwpCQkJYmZpbl93cml0ZTMyKENOVF9NQVgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NOVF9NSU4oKQkJCWJmaW5fcmVhZDMyKENOVF9NSU4pCisjZGVmaW5lIGJmaW5fd3JpdGVfQ05UX01JTih2YWwpCQkJYmZpbl93cml0ZTMyKENOVF9NSU4sIHZhbCkKKworLyogU2VjdXJpdHkgUmVnaXN0ZXJzICovCisKKyNkZWZpbmUgYmZpbl9yZWFkX1NFQ1VSRV9TWVNTV1QoKQkJYmZpbl9yZWFkMzIoU0VDVVJFX1NZU1NXVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9TRUNVUkVfU1lTU1dUKHZhbCkJCWJmaW5fd3JpdGUzMihTRUNVUkVfU1lTU1dULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TRUNVUkVfQ09OVFJPTCgpCQliZmluX3JlYWQxNihTRUNVUkVfQ09OVFJPTCkKKyNkZWZpbmUgYmZpbl93cml0ZV9TRUNVUkVfQ09OVFJPTCh2YWwpCQliZmluX3dyaXRlMTYoU0VDVVJFX0NPTlRST0wsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NFQ1VSRV9TVEFUVVMoKQkJYmZpbl9yZWFkMTYoU0VDVVJFX1NUQVRVUykKKyNkZWZpbmUgYmZpbl93cml0ZV9TRUNVUkVfU1RBVFVTKHZhbCkJCWJmaW5fd3JpdGUxNihTRUNVUkVfU1RBVFVTLCB2YWwpCiAKICNlbmRpZiAvKiBfQ0RFRl9CRjUxMl9IICovCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvaW5jbHVkZS9tYWNoL2NkZWZCRjUxNC5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2luY2x1ZGUvbWFjaC9jZGVmQkY1MTQuaAppbmRleCAxMDhmYTRiLi5kYzk4ODY2IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvaW5jbHVkZS9tYWNoL2NkZWZCRjUxNC5oCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9pbmNsdWRlL21hY2gvY2RlZkJGNTE0LmgKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDgtMjAwOSBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKiBDb3B5cmlnaHQgMjAwOC0yMDEwIEFuYWxvZyBEZXZpY2VzIEluYy4KICAqCiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgQURJIEJTRCBsaWNlbnNlIG9yIHRoZSBHUEwtMiAob3IgbGF0ZXIpCiAgKi8KQEAgLTcsOSArNyw2IEBACiAjaWZuZGVmIF9DREVGX0JGNTE0X0gKICNkZWZpbmUgX0NERUZfQkY1MTRfSAogCi0vKiBpbmNsdWRlIGFsbCBDb3JlIHJlZ2lzdGVycyBhbmQgYml0IGRlZmluaXRpb25zICovCi0jaW5jbHVkZSAiZGVmQkY1MTQuaCIKLQogLyogQkY1MTQgaXMgQkY1MTIgKyBSU0kgKi8KICNpbmNsdWRlICJjZGVmQkY1MTIuaCIKIApkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2luY2x1ZGUvbWFjaC9jZGVmQkY1MTYuaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9pbmNsdWRlL21hY2gvY2RlZkJGNTE2LmgKaW5kZXggMjc1MTU5Mi4uMTQyZTQ1YyAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2luY2x1ZGUvbWFjaC9jZGVmQkY1MTYuaAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvaW5jbHVkZS9tYWNoL2NkZWZCRjUxNi5oCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA4LTIwMDkgQW5hbG9nIERldmljZXMgSW5jLgorICogQ29weXJpZ2h0IDIwMDgtMjAxMCBBbmFsb2cgRGV2aWNlcyBJbmMuCiAgKgogICogTGljZW5zZWQgdW5kZXIgdGhlIEFESSBCU0QgbGljZW5zZSBvciB0aGUgR1BMLTIgKG9yIGxhdGVyKQogICovCkBAIC03LDkgKzcsNiBAQAogI2lmbmRlZiBfQ0RFRl9CRjUxNl9ICiAjZGVmaW5lIF9DREVGX0JGNTE2X0gKIAotLyogaW5jbHVkZSBhbGwgQ29yZSByZWdpc3RlcnMgYW5kIGJpdCBkZWZpbml0aW9ucyAqLwotI2luY2x1ZGUgImRlZkJGNTE2LmgiCi0KIC8qIEJGNTE2IGlzIEJGNTE0ICsgRU1BQyAqLwogI2luY2x1ZGUgImNkZWZCRjUxNC5oIgogCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvaW5jbHVkZS9tYWNoL2NkZWZCRjUxOC5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2luY2x1ZGUvbWFjaC9jZGVmQkY1MTguaAppbmRleCA3ZmI3ZjBlLi5lNjM4MTk3IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvaW5jbHVkZS9tYWNoL2NkZWZCRjUxOC5oCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9pbmNsdWRlL21hY2gvY2RlZkJGNTE4LmgKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDgtMjAwOSBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKiBDb3B5cmlnaHQgMjAwOC0yMDEwIEFuYWxvZyBEZXZpY2VzIEluYy4KICAqCiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgQURJIEJTRCBsaWNlbnNlIG9yIHRoZSBHUEwtMiAob3IgbGF0ZXIpCiAgKi8KQEAgLTcsOSArNyw2IEBACiAjaWZuZGVmIF9DREVGX0JGNTE4X0gKICNkZWZpbmUgX0NERUZfQkY1MThfSAogCi0vKiBpbmNsdWRlIGFsbCBDb3JlIHJlZ2lzdGVycyBhbmQgYml0IGRlZmluaXRpb25zICovCi0jaW5jbHVkZSAiZGVmQkY1MTguaCIKLQogLyogQkY1MTggaXMgQkY1MTYgKyBJRUVFLTE1ODggKi8KICNpbmNsdWRlICJjZGVmQkY1MTYuaCIKIApkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2luY2x1ZGUvbWFjaC9jZGVmQkY1MXhfYmFzZS5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2luY2x1ZGUvbWFjaC9jZGVmQkY1MXhfYmFzZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTY5NjlmLi4wMDAwMDAwCi0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9pbmNsdWRlL21hY2gvY2RlZkJGNTF4X2Jhc2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwNjEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDA4IEFuYWxvZyBEZXZpY2VzIEluYy4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIKLSAqLwotCi0jaWZuZGVmIF9DREVGX0JGNTJYX0gKLSNkZWZpbmUgX0NERUZfQkY1MlhfSAotCi0jaW5jbHVkZSA8YXNtL2JsYWNrZmluLmg+Ci0KLSNpbmNsdWRlICJkZWZCRjUxeF9iYXNlLmgiCi0KLS8qIEluY2x1ZGUgY29yZSBzcGVjaWZpYyByZWdpc3RlciBwb2ludGVyIGRlZmluaXRpb25zIAkJCQkJCQkJKi8KLSNpbmNsdWRlIDxhc20vY2RlZl9MUEJsYWNrZmluLmg+Ci0KLS8qID09PT0gYmVnaW4gZnJvbSBjZGVmQkY1MzQuaCA9PT09ICovCi0KLS8qIENsb2NrIGFuZCBTeXN0ZW0gQ29udHJvbAkoMHhGRkMwMDAwMCAtIDB4RkZDMDAwRkYpCQkJCQkJCQkqLwotI2RlZmluZSBiZmluX3JlYWRfUExMX0NUTCgpCQkJYmZpbl9yZWFkMTYoUExMX0NUTCkKLSNkZWZpbmUgYmZpbl9yZWFkX1BMTF9ESVYoKQkJCWJmaW5fcmVhZDE2KFBMTF9ESVYpCi0jZGVmaW5lIGJmaW5fd3JpdGVfUExMX0RJVih2YWwpCQkJYmZpbl93cml0ZTE2KFBMTF9ESVYsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1ZSX0NUTCgpCQkJYmZpbl9yZWFkMTYoVlJfQ1RMKQotI2RlZmluZSBiZmluX3JlYWRfUExMX1NUQVQoKQkJCWJmaW5fcmVhZDE2KFBMTF9TVEFUKQotI2RlZmluZSBiZmluX3dyaXRlX1BMTF9TVEFUKHZhbCkJCWJmaW5fd3JpdGUxNihQTExfU1RBVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfUExMX0xPQ0tDTlQoKQkJCWJmaW5fcmVhZDE2KFBMTF9MT0NLQ05UKQotI2RlZmluZSBiZmluX3dyaXRlX1BMTF9MT0NLQ05UKHZhbCkJCWJmaW5fd3JpdGUxNihQTExfTE9DS0NOVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfQ0hJUElEKCkJCQliZmluX3JlYWQzMihDSElQSUQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfQ0hJUElEKHZhbCkJCQliZmluX3dyaXRlMzIoQ0hJUElELCB2YWwpCi0KLQotLyogU3lzdGVtIEludGVycnVwdCBDb250cm9sbGVyICgweEZGQzAwMTAwIC0gMHhGRkMwMDFGRikJCQkJCQkJKi8KLSNkZWZpbmUgYmZpbl9yZWFkX1NXUlNUKCkJCQliZmluX3JlYWQxNihTV1JTVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9TV1JTVCh2YWwpCQkJYmZpbl93cml0ZTE2KFNXUlNULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9TWVNDUigpCQkJYmZpbl9yZWFkMTYoU1lTQ1IpCi0jZGVmaW5lIGJmaW5fd3JpdGVfU1lTQ1IodmFsKQkJCWJmaW5fd3JpdGUxNihTWVNDUiwgdmFsKQotCi0jZGVmaW5lIGJmaW5fcmVhZF9TSUNfUlZFQ1QoKQkJCWJmaW5fcmVhZDMyKFNJQ19SVkVDVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9TSUNfUlZFQ1QodmFsKQkJYmZpbl93cml0ZTMyKFNJQ19SVkVDVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfU0lDX0lNQVNLMCgpCQkJYmZpbl9yZWFkMzIoU0lDX0lNQVNLMCkKLSNkZWZpbmUgYmZpbl93cml0ZV9TSUNfSU1BU0swKHZhbCkJCWJmaW5fd3JpdGUzMihTSUNfSU1BU0swLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9TSUNfSU1BU0soeCkJCQliZmluX3JlYWQzMihTSUNfSU1BU0swICsgKHggPDwgNikpCi0jZGVmaW5lIGJmaW5fd3JpdGVfU0lDX0lNQVNLKHgsIHZhbCkJCWJmaW5fd3JpdGUzMigoU0lDX0lNQVNLMCArICh4IDw8IDYpKSwgdmFsKQotCi0jZGVmaW5lIGJmaW5fcmVhZF9TSUNfSUFSMCgpCQkJYmZpbl9yZWFkMzIoU0lDX0lBUjApCi0jZGVmaW5lIGJmaW5fd3JpdGVfU0lDX0lBUjAodmFsKQkJYmZpbl93cml0ZTMyKFNJQ19JQVIwLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9TSUNfSUFSMSgpCQkJYmZpbl9yZWFkMzIoU0lDX0lBUjEpCi0jZGVmaW5lIGJmaW5fd3JpdGVfU0lDX0lBUjEodmFsKQkJYmZpbl93cml0ZTMyKFNJQ19JQVIxLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9TSUNfSUFSMigpCQkJYmZpbl9yZWFkMzIoU0lDX0lBUjIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfU0lDX0lBUjIodmFsKQkJYmZpbl93cml0ZTMyKFNJQ19JQVIyLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9TSUNfSUFSMygpCQkJYmZpbl9yZWFkMzIoU0lDX0lBUjMpCi0jZGVmaW5lIGJmaW5fd3JpdGVfU0lDX0lBUjModmFsKQkJYmZpbl93cml0ZTMyKFNJQ19JQVIzLCB2YWwpCi0KLSNkZWZpbmUgYmZpbl9yZWFkX1NJQ19JU1IwKCkJCQliZmluX3JlYWQzMihTSUNfSVNSMCkKLSNkZWZpbmUgYmZpbl93cml0ZV9TSUNfSVNSMCh2YWwpCQliZmluX3dyaXRlMzIoU0lDX0lTUjAsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1NJQ19JU1IoeCkJCQliZmluX3JlYWQzMihTSUNfSVNSMCArICh4IDw8IDYpKQotI2RlZmluZSBiZmluX3dyaXRlX1NJQ19JU1IoeCwgdmFsKQkJYmZpbl93cml0ZTMyKChTSUNfSVNSMCArICh4IDw8IDYpKSwgdmFsKQotCi0jZGVmaW5lIGJmaW5fcmVhZF9TSUNfSVdSMCgpCQkJYmZpbl9yZWFkMzIoU0lDX0lXUjApCi0jZGVmaW5lIGJmaW5fd3JpdGVfU0lDX0lXUjAodmFsKQkJYmZpbl93cml0ZTMyKFNJQ19JV1IwLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9TSUNfSVdSKHgpCQkJYmZpbl9yZWFkMzIoU0lDX0lXUjAgKyAoeCA8PCA2KSkKLSNkZWZpbmUgYmZpbl93cml0ZV9TSUNfSVdSKHgsIHZhbCkJCWJmaW5fd3JpdGUzMigoU0lDX0lXUjAgKyAoeCA8PCA2KSksIHZhbCkKLQotLyogU0lDIEFkZGl0aW9ucyB0byBBRFNQLUJGNTF4ICgweEZGQzAwMTRDIC0gMHhGRkMwMDE2MikgKi8KLQotI2RlZmluZSBiZmluX3JlYWRfU0lDX0lNQVNLMSgpCQkJYmZpbl9yZWFkMzIoU0lDX0lNQVNLMSkKLSNkZWZpbmUgYmZpbl93cml0ZV9TSUNfSU1BU0sxKHZhbCkJCWJmaW5fd3JpdGUzMihTSUNfSU1BU0sxLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9TSUNfSUFSNCgpCQkJYmZpbl9yZWFkMzIoU0lDX0lBUjQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfU0lDX0lBUjQodmFsKQkJYmZpbl93cml0ZTMyKFNJQ19JQVI0LCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9TSUNfSUFSNSgpCQkJYmZpbl9yZWFkMzIoU0lDX0lBUjUpCi0jZGVmaW5lIGJmaW5fd3JpdGVfU0lDX0lBUjUodmFsKQkJYmZpbl93cml0ZTMyKFNJQ19JQVI1LCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9TSUNfSUFSNigpCQkJYmZpbl9yZWFkMzIoU0lDX0lBUjYpCi0jZGVmaW5lIGJmaW5fd3JpdGVfU0lDX0lBUjYodmFsKQkJYmZpbl93cml0ZTMyKFNJQ19JQVI2LCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9TSUNfSUFSNygpCQkJYmZpbl9yZWFkMzIoU0lDX0lBUjcpCi0jZGVmaW5lIGJmaW5fd3JpdGVfU0lDX0lBUjcodmFsKQkJYmZpbl93cml0ZTMyKFNJQ19JQVI3LCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9TSUNfSVNSMSgpCQkJYmZpbl9yZWFkMzIoU0lDX0lTUjEpCi0jZGVmaW5lIGJmaW5fd3JpdGVfU0lDX0lTUjEodmFsKQkJYmZpbl93cml0ZTMyKFNJQ19JU1IxLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9TSUNfSVdSMSgpCQkJYmZpbl9yZWFkMzIoU0lDX0lXUjEpCi0jZGVmaW5lIGJmaW5fd3JpdGVfU0lDX0lXUjEodmFsKQkJYmZpbl93cml0ZTMyKFNJQ19JV1IxLCB2YWwpCi0KLS8qIFdhdGNoZG9nIFRpbWVyCQkoMHhGRkMwMDIwMCAtIDB4RkZDMDAyRkYpCQkJCQkJCQkJKi8KLSNkZWZpbmUgYmZpbl9yZWFkX1dET0dfQ1RMKCkJCQliZmluX3JlYWQxNihXRE9HX0NUTCkKLSNkZWZpbmUgYmZpbl93cml0ZV9XRE9HX0NUTCh2YWwpCQliZmluX3dyaXRlMTYoV0RPR19DVEwsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1dET0dfQ05UKCkJCQliZmluX3JlYWQzMihXRE9HX0NOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9XRE9HX0NOVCh2YWwpCQliZmluX3dyaXRlMzIoV0RPR19DTlQsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1dET0dfU1RBVCgpCQkJYmZpbl9yZWFkMzIoV0RPR19TVEFUKQotI2RlZmluZSBiZmluX3dyaXRlX1dET0dfU1RBVCh2YWwpCQliZmluX3dyaXRlMzIoV0RPR19TVEFULCB2YWwpCi0KLQotLyogUmVhbCBUaW1lIENsb2NrCQkoMHhGRkMwMDMwMCAtIDB4RkZDMDAzRkYpCQkJCQkJCQkJKi8KLSNkZWZpbmUgYmZpbl9yZWFkX1JUQ19TVEFUKCkJCQliZmluX3JlYWQzMihSVENfU1RBVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9SVENfU1RBVCh2YWwpCQliZmluX3dyaXRlMzIoUlRDX1NUQVQsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1JUQ19JQ1RMKCkJCQliZmluX3JlYWQxNihSVENfSUNUTCkKLSNkZWZpbmUgYmZpbl93cml0ZV9SVENfSUNUTCh2YWwpCQliZmluX3dyaXRlMTYoUlRDX0lDVEwsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1JUQ19JU1RBVCgpCQkJYmZpbl9yZWFkMTYoUlRDX0lTVEFUKQotI2RlZmluZSBiZmluX3dyaXRlX1JUQ19JU1RBVCh2YWwpCQliZmluX3dyaXRlMTYoUlRDX0lTVEFULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9SVENfU1dDTlQoKQkJCWJmaW5fcmVhZDE2KFJUQ19TV0NOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9SVENfU1dDTlQodmFsKQkJYmZpbl93cml0ZTE2KFJUQ19TV0NOVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfUlRDX0FMQVJNKCkJCQliZmluX3JlYWQzMihSVENfQUxBUk0pCi0jZGVmaW5lIGJmaW5fd3JpdGVfUlRDX0FMQVJNKHZhbCkJCWJmaW5fd3JpdGUzMihSVENfQUxBUk0sIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1JUQ19GQVNUKCkJCQliZmluX3JlYWQxNihSVENfRkFTVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9SVENfRkFTVCh2YWwpCQliZmluX3dyaXRlMTYoUlRDX0ZBU1QsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1JUQ19QUkVOKCkJCQliZmluX3JlYWQxNihSVENfUFJFTikKLSNkZWZpbmUgYmZpbl93cml0ZV9SVENfUFJFTih2YWwpCQliZmluX3dyaXRlMTYoUlRDX1BSRU4sIHZhbCkKLQotCi0vKiBVQVJUMCBDb250cm9sbGVyCQkoMHhGRkMwMDQwMCAtIDB4RkZDMDA0RkYpCQkJCQkJCQkJKi8KLSNkZWZpbmUgYmZpbl9yZWFkX1VBUlQwX1RIUigpCQkJYmZpbl9yZWFkMTYoVUFSVDBfVEhSKQotI2RlZmluZSBiZmluX3dyaXRlX1VBUlQwX1RIUih2YWwpCQliZmluX3dyaXRlMTYoVUFSVDBfVEhSLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9VQVJUMF9SQlIoKQkJCWJmaW5fcmVhZDE2KFVBUlQwX1JCUikKLSNkZWZpbmUgYmZpbl93cml0ZV9VQVJUMF9SQlIodmFsKQkJYmZpbl93cml0ZTE2KFVBUlQwX1JCUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfVUFSVDBfRExMKCkJCQliZmluX3JlYWQxNihVQVJUMF9ETEwpCi0jZGVmaW5lIGJmaW5fd3JpdGVfVUFSVDBfRExMKHZhbCkJCWJmaW5fd3JpdGUxNihVQVJUMF9ETEwsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1VBUlQwX0lFUigpCQkJYmZpbl9yZWFkMTYoVUFSVDBfSUVSKQotI2RlZmluZSBiZmluX3dyaXRlX1VBUlQwX0lFUih2YWwpCQliZmluX3dyaXRlMTYoVUFSVDBfSUVSLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9VQVJUMF9ETEgoKQkJCWJmaW5fcmVhZDE2KFVBUlQwX0RMSCkKLSNkZWZpbmUgYmZpbl93cml0ZV9VQVJUMF9ETEgodmFsKQkJYmZpbl93cml0ZTE2KFVBUlQwX0RMSCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfVUFSVDBfSUlSKCkJCQliZmluX3JlYWQxNihVQVJUMF9JSVIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfVUFSVDBfSUlSKHZhbCkJCWJmaW5fd3JpdGUxNihVQVJUMF9JSVIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1VBUlQwX0xDUigpCQkJYmZpbl9yZWFkMTYoVUFSVDBfTENSKQotI2RlZmluZSBiZmluX3dyaXRlX1VBUlQwX0xDUih2YWwpCQliZmluX3dyaXRlMTYoVUFSVDBfTENSLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9VQVJUMF9NQ1IoKQkJCWJmaW5fcmVhZDE2KFVBUlQwX01DUikKLSNkZWZpbmUgYmZpbl93cml0ZV9VQVJUMF9NQ1IodmFsKQkJYmZpbl93cml0ZTE2KFVBUlQwX01DUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfVUFSVDBfTFNSKCkJCQliZmluX3JlYWQxNihVQVJUMF9MU1IpCi0jZGVmaW5lIGJmaW5fd3JpdGVfVUFSVDBfTFNSKHZhbCkJCWJmaW5fd3JpdGUxNihVQVJUMF9MU1IsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1VBUlQwX01TUigpCQkJYmZpbl9yZWFkMTYoVUFSVDBfTVNSKQotI2RlZmluZSBiZmluX3dyaXRlX1VBUlQwX01TUih2YWwpCQliZmluX3dyaXRlMTYoVUFSVDBfTVNSLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9VQVJUMF9TQ1IoKQkJCWJmaW5fcmVhZDE2KFVBUlQwX1NDUikKLSNkZWZpbmUgYmZpbl93cml0ZV9VQVJUMF9TQ1IodmFsKQkJYmZpbl93cml0ZTE2KFVBUlQwX1NDUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfVUFSVDBfR0NUTCgpCQkJYmZpbl9yZWFkMTYoVUFSVDBfR0NUTCkKLSNkZWZpbmUgYmZpbl93cml0ZV9VQVJUMF9HQ1RMKHZhbCkJCWJmaW5fd3JpdGUxNihVQVJUMF9HQ1RMLCB2YWwpCi0KLQotLyogVElNRVIwLTcgUmVnaXN0ZXJzCQkoMHhGRkMwMDYwMCAtIDB4RkZDMDA2RkYpCQkJCQkJCQkqLwotI2RlZmluZSBiZmluX3JlYWRfVElNRVIwX0NPTkZJRygpCQliZmluX3JlYWQxNihUSU1FUjBfQ09ORklHKQotI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSMF9DT05GSUcodmFsKQkJYmZpbl93cml0ZTE2KFRJTUVSMF9DT05GSUcsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1RJTUVSMF9DT1VOVEVSKCkJCWJmaW5fcmVhZDMyKFRJTUVSMF9DT1VOVEVSKQotI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSMF9DT1VOVEVSKHZhbCkJCWJmaW5fd3JpdGUzMihUSU1FUjBfQ09VTlRFUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfVElNRVIwX1BFUklPRCgpCQliZmluX3JlYWQzMihUSU1FUjBfUEVSSU9EKQotI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSMF9QRVJJT0QodmFsKQkJYmZpbl93cml0ZTMyKFRJTUVSMF9QRVJJT0QsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1RJTUVSMF9XSURUSCgpCQliZmluX3JlYWQzMihUSU1FUjBfV0lEVEgpCi0jZGVmaW5lIGJmaW5fd3JpdGVfVElNRVIwX1dJRFRIKHZhbCkJCWJmaW5fd3JpdGUzMihUSU1FUjBfV0lEVEgsIHZhbCkKLQotI2RlZmluZSBiZmluX3JlYWRfVElNRVIxX0NPTkZJRygpCQliZmluX3JlYWQxNihUSU1FUjFfQ09ORklHKQotI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSMV9DT05GSUcodmFsKQkJYmZpbl93cml0ZTE2KFRJTUVSMV9DT05GSUcsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1RJTUVSMV9DT1VOVEVSKCkJCWJmaW5fcmVhZDMyKFRJTUVSMV9DT1VOVEVSKQotI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSMV9DT1VOVEVSKHZhbCkJCWJmaW5fd3JpdGUzMihUSU1FUjFfQ09VTlRFUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfVElNRVIxX1BFUklPRCgpCQliZmluX3JlYWQzMihUSU1FUjFfUEVSSU9EKQotI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSMV9QRVJJT0QodmFsKQkJYmZpbl93cml0ZTMyKFRJTUVSMV9QRVJJT0QsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1RJTUVSMV9XSURUSCgpCQliZmluX3JlYWQzMihUSU1FUjFfV0lEVEgpCi0jZGVmaW5lIGJmaW5fd3JpdGVfVElNRVIxX1dJRFRIKHZhbCkJCWJmaW5fd3JpdGUzMihUSU1FUjFfV0lEVEgsIHZhbCkKLQotI2RlZmluZSBiZmluX3JlYWRfVElNRVIyX0NPTkZJRygpCQliZmluX3JlYWQxNihUSU1FUjJfQ09ORklHKQotI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSMl9DT05GSUcodmFsKQkJYmZpbl93cml0ZTE2KFRJTUVSMl9DT05GSUcsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1RJTUVSMl9DT1VOVEVSKCkJCWJmaW5fcmVhZDMyKFRJTUVSMl9DT1VOVEVSKQotI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSMl9DT1VOVEVSKHZhbCkJCWJmaW5fd3JpdGUzMihUSU1FUjJfQ09VTlRFUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfVElNRVIyX1BFUklPRCgpCQliZmluX3JlYWQzMihUSU1FUjJfUEVSSU9EKQotI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSMl9QRVJJT0QodmFsKQkJYmZpbl93cml0ZTMyKFRJTUVSMl9QRVJJT0QsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1RJTUVSMl9XSURUSCgpCQliZmluX3JlYWQzMihUSU1FUjJfV0lEVEgpCi0jZGVmaW5lIGJmaW5fd3JpdGVfVElNRVIyX1dJRFRIKHZhbCkJCWJmaW5fd3JpdGUzMihUSU1FUjJfV0lEVEgsIHZhbCkKLQotI2RlZmluZSBiZmluX3JlYWRfVElNRVIzX0NPTkZJRygpCQliZmluX3JlYWQxNihUSU1FUjNfQ09ORklHKQotI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSM19DT05GSUcodmFsKQkJYmZpbl93cml0ZTE2KFRJTUVSM19DT05GSUcsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1RJTUVSM19DT1VOVEVSKCkJCWJmaW5fcmVhZDMyKFRJTUVSM19DT1VOVEVSKQotI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSM19DT1VOVEVSKHZhbCkJCWJmaW5fd3JpdGUzMihUSU1FUjNfQ09VTlRFUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfVElNRVIzX1BFUklPRCgpCQliZmluX3JlYWQzMihUSU1FUjNfUEVSSU9EKQotI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSM19QRVJJT0QodmFsKQkJYmZpbl93cml0ZTMyKFRJTUVSM19QRVJJT0QsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1RJTUVSM19XSURUSCgpCQliZmluX3JlYWQzMihUSU1FUjNfV0lEVEgpCi0jZGVmaW5lIGJmaW5fd3JpdGVfVElNRVIzX1dJRFRIKHZhbCkJCWJmaW5fd3JpdGUzMihUSU1FUjNfV0lEVEgsIHZhbCkKLQotI2RlZmluZSBiZmluX3JlYWRfVElNRVI0X0NPTkZJRygpCQliZmluX3JlYWQxNihUSU1FUjRfQ09ORklHKQotI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSNF9DT05GSUcodmFsKQkJYmZpbl93cml0ZTE2KFRJTUVSNF9DT05GSUcsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1RJTUVSNF9DT1VOVEVSKCkJCWJmaW5fcmVhZDMyKFRJTUVSNF9DT1VOVEVSKQotI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSNF9DT1VOVEVSKHZhbCkJCWJmaW5fd3JpdGUzMihUSU1FUjRfQ09VTlRFUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfVElNRVI0X1BFUklPRCgpCQliZmluX3JlYWQzMihUSU1FUjRfUEVSSU9EKQotI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSNF9QRVJJT0QodmFsKQkJYmZpbl93cml0ZTMyKFRJTUVSNF9QRVJJT0QsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1RJTUVSNF9XSURUSCgpCQliZmluX3JlYWQzMihUSU1FUjRfV0lEVEgpCi0jZGVmaW5lIGJmaW5fd3JpdGVfVElNRVI0X1dJRFRIKHZhbCkJCWJmaW5fd3JpdGUzMihUSU1FUjRfV0lEVEgsIHZhbCkKLQotI2RlZmluZSBiZmluX3JlYWRfVElNRVI1X0NPTkZJRygpCQliZmluX3JlYWQxNihUSU1FUjVfQ09ORklHKQotI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSNV9DT05GSUcodmFsKQkJYmZpbl93cml0ZTE2KFRJTUVSNV9DT05GSUcsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1RJTUVSNV9DT1VOVEVSKCkJCWJmaW5fcmVhZDMyKFRJTUVSNV9DT1VOVEVSKQotI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSNV9DT1VOVEVSKHZhbCkJCWJmaW5fd3JpdGUzMihUSU1FUjVfQ09VTlRFUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfVElNRVI1X1BFUklPRCgpCQliZmluX3JlYWQzMihUSU1FUjVfUEVSSU9EKQotI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSNV9QRVJJT0QodmFsKQkJYmZpbl93cml0ZTMyKFRJTUVSNV9QRVJJT0QsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1RJTUVSNV9XSURUSCgpCQliZmluX3JlYWQzMihUSU1FUjVfV0lEVEgpCi0jZGVmaW5lIGJmaW5fd3JpdGVfVElNRVI1X1dJRFRIKHZhbCkJCWJmaW5fd3JpdGUzMihUSU1FUjVfV0lEVEgsIHZhbCkKLQotI2RlZmluZSBiZmluX3JlYWRfVElNRVI2X0NPTkZJRygpCQliZmluX3JlYWQxNihUSU1FUjZfQ09ORklHKQotI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSNl9DT05GSUcodmFsKQkJYmZpbl93cml0ZTE2KFRJTUVSNl9DT05GSUcsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1RJTUVSNl9DT1VOVEVSKCkJCWJmaW5fcmVhZDMyKFRJTUVSNl9DT1VOVEVSKQotI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSNl9DT1VOVEVSKHZhbCkJCWJmaW5fd3JpdGUzMihUSU1FUjZfQ09VTlRFUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfVElNRVI2X1BFUklPRCgpCQliZmluX3JlYWQzMihUSU1FUjZfUEVSSU9EKQotI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSNl9QRVJJT0QodmFsKQkJYmZpbl93cml0ZTMyKFRJTUVSNl9QRVJJT0QsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1RJTUVSNl9XSURUSCgpCQliZmluX3JlYWQzMihUSU1FUjZfV0lEVEgpCi0jZGVmaW5lIGJmaW5fd3JpdGVfVElNRVI2X1dJRFRIKHZhbCkJCWJmaW5fd3JpdGUzMihUSU1FUjZfV0lEVEgsIHZhbCkKLQotI2RlZmluZSBiZmluX3JlYWRfVElNRVI3X0NPTkZJRygpCQliZmluX3JlYWQxNihUSU1FUjdfQ09ORklHKQotI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSN19DT05GSUcodmFsKQkJYmZpbl93cml0ZTE2KFRJTUVSN19DT05GSUcsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1RJTUVSN19DT1VOVEVSKCkJCWJmaW5fcmVhZDMyKFRJTUVSN19DT1VOVEVSKQotI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSN19DT1VOVEVSKHZhbCkJCWJmaW5fd3JpdGUzMihUSU1FUjdfQ09VTlRFUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfVElNRVI3X1BFUklPRCgpCQliZmluX3JlYWQzMihUSU1FUjdfUEVSSU9EKQotI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSN19QRVJJT0QodmFsKQkJYmZpbl93cml0ZTMyKFRJTUVSN19QRVJJT0QsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1RJTUVSN19XSURUSCgpCQliZmluX3JlYWQzMihUSU1FUjdfV0lEVEgpCi0jZGVmaW5lIGJmaW5fd3JpdGVfVElNRVI3X1dJRFRIKHZhbCkJCWJmaW5fd3JpdGUzMihUSU1FUjdfV0lEVEgsIHZhbCkKLQotI2RlZmluZSBiZmluX3JlYWRfVElNRVJfRU5BQkxFKCkJCWJmaW5fcmVhZDE2KFRJTUVSX0VOQUJMRSkKLSNkZWZpbmUgYmZpbl93cml0ZV9USU1FUl9FTkFCTEUodmFsKQkJYmZpbl93cml0ZTE2KFRJTUVSX0VOQUJMRSwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfVElNRVJfRElTQUJMRSgpCQliZmluX3JlYWQxNihUSU1FUl9ESVNBQkxFKQotI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSX0RJU0FCTEUodmFsKQkJYmZpbl93cml0ZTE2KFRJTUVSX0RJU0FCTEUsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1RJTUVSX1NUQVRVUygpCQliZmluX3JlYWQzMihUSU1FUl9TVEFUVVMpCi0jZGVmaW5lIGJmaW5fd3JpdGVfVElNRVJfU1RBVFVTKHZhbCkJCWJmaW5fd3JpdGUzMihUSU1FUl9TVEFUVVMsIHZhbCkKLQotCi0vKiBHZW5lcmFsIFB1cnBvc2UgSS9PIFBvcnQgRiAoMHhGRkMwMDcwMCAtIDB4RkZDMDA3RkYpCQkJCQkJCQkqLwotI2RlZmluZSBiZmluX3JlYWRfUE9SVEZJTygpCQkJYmZpbl9yZWFkMTYoUE9SVEZJTykKLSNkZWZpbmUgYmZpbl93cml0ZV9QT1JURklPKHZhbCkJCQliZmluX3dyaXRlMTYoUE9SVEZJTywgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfUE9SVEZJT19DTEVBUigpCQliZmluX3JlYWQxNihQT1JURklPX0NMRUFSKQotI2RlZmluZSBiZmluX3dyaXRlX1BPUlRGSU9fQ0xFQVIodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRGSU9fQ0xFQVIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1BPUlRGSU9fU0VUKCkJCQliZmluX3JlYWQxNihQT1JURklPX1NFVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9QT1JURklPX1NFVCh2YWwpCQliZmluX3dyaXRlMTYoUE9SVEZJT19TRVQsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1BPUlRGSU9fVE9HR0xFKCkJCWJmaW5fcmVhZDE2KFBPUlRGSU9fVE9HR0xFKQotI2RlZmluZSBiZmluX3dyaXRlX1BPUlRGSU9fVE9HR0xFKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JURklPX1RPR0dMRSwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfUE9SVEZJT19NQVNLQSgpCQliZmluX3JlYWQxNihQT1JURklPX01BU0tBKQotI2RlZmluZSBiZmluX3dyaXRlX1BPUlRGSU9fTUFTS0EodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRGSU9fTUFTS0EsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1BPUlRGSU9fTUFTS0FfQ0xFQVIoKQkJYmZpbl9yZWFkMTYoUE9SVEZJT19NQVNLQV9DTEVBUikKLSNkZWZpbmUgYmZpbl93cml0ZV9QT1JURklPX01BU0tBX0NMRUFSKHZhbCkJYmZpbl93cml0ZTE2KFBPUlRGSU9fTUFTS0FfQ0xFQVIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1BPUlRGSU9fTUFTS0FfU0VUKCkJCWJmaW5fcmVhZDE2KFBPUlRGSU9fTUFTS0FfU0VUKQotI2RlZmluZSBiZmluX3dyaXRlX1BPUlRGSU9fTUFTS0FfU0VUKHZhbCkJYmZpbl93cml0ZTE2KFBPUlRGSU9fTUFTS0FfU0VULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9QT1JURklPX01BU0tBX1RPR0dMRSgpCWJmaW5fcmVhZDE2KFBPUlRGSU9fTUFTS0FfVE9HR0xFKQotI2RlZmluZSBiZmluX3dyaXRlX1BPUlRGSU9fTUFTS0FfVE9HR0xFKHZhbCkJYmZpbl93cml0ZTE2KFBPUlRGSU9fTUFTS0FfVE9HR0xFLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9QT1JURklPX01BU0tCKCkJCWJmaW5fcmVhZDE2KFBPUlRGSU9fTUFTS0IpCi0jZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEZJT19NQVNLQih2YWwpCQliZmluX3dyaXRlMTYoUE9SVEZJT19NQVNLQiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfUE9SVEZJT19NQVNLQl9DTEVBUigpCQliZmluX3JlYWQxNihQT1JURklPX01BU0tCX0NMRUFSKQotI2RlZmluZSBiZmluX3dyaXRlX1BPUlRGSU9fTUFTS0JfQ0xFQVIodmFsKQliZmluX3dyaXRlMTYoUE9SVEZJT19NQVNLQl9DTEVBUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfUE9SVEZJT19NQVNLQl9TRVQoKQkJYmZpbl9yZWFkMTYoUE9SVEZJT19NQVNLQl9TRVQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEZJT19NQVNLQl9TRVQodmFsKQliZmluX3dyaXRlMTYoUE9SVEZJT19NQVNLQl9TRVQsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1BPUlRGSU9fTUFTS0JfVE9HR0xFKCkJYmZpbl9yZWFkMTYoUE9SVEZJT19NQVNLQl9UT0dHTEUpCi0jZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEZJT19NQVNLQl9UT0dHTEUodmFsKQliZmluX3dyaXRlMTYoUE9SVEZJT19NQVNLQl9UT0dHTEUsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1BPUlRGSU9fRElSKCkJCQliZmluX3JlYWQxNihQT1JURklPX0RJUikKLSNkZWZpbmUgYmZpbl93cml0ZV9QT1JURklPX0RJUih2YWwpCQliZmluX3dyaXRlMTYoUE9SVEZJT19ESVIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1BPUlRGSU9fUE9MQVIoKQkJYmZpbl9yZWFkMTYoUE9SVEZJT19QT0xBUikKLSNkZWZpbmUgYmZpbl93cml0ZV9QT1JURklPX1BPTEFSKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JURklPX1BPTEFSLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9QT1JURklPX0VER0UoKQkJYmZpbl9yZWFkMTYoUE9SVEZJT19FREdFKQotI2RlZmluZSBiZmluX3dyaXRlX1BPUlRGSU9fRURHRSh2YWwpCQliZmluX3dyaXRlMTYoUE9SVEZJT19FREdFLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9QT1JURklPX0JPVEgoKQkJYmZpbl9yZWFkMTYoUE9SVEZJT19CT1RIKQotI2RlZmluZSBiZmluX3dyaXRlX1BPUlRGSU9fQk9USCh2YWwpCQliZmluX3dyaXRlMTYoUE9SVEZJT19CT1RILCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9QT1JURklPX0lORU4oKQkJYmZpbl9yZWFkMTYoUE9SVEZJT19JTkVOKQotI2RlZmluZSBiZmluX3dyaXRlX1BPUlRGSU9fSU5FTih2YWwpCQliZmluX3dyaXRlMTYoUE9SVEZJT19JTkVOLCB2YWwpCi0KLQotLyogU1BPUlQwIENvbnRyb2xsZXIJCSgweEZGQzAwODAwIC0gMHhGRkMwMDhGRikJCQkJCQkJCSovCi0jZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDBfVENSMSgpCQkJYmZpbl9yZWFkMTYoU1BPUlQwX1RDUjEpCi0jZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQwX1RDUjEodmFsKQkJYmZpbl93cml0ZTE2KFNQT1JUMF9UQ1IxLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDBfVENSMigpCQkJYmZpbl9yZWFkMTYoU1BPUlQwX1RDUjIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQwX1RDUjIodmFsKQkJYmZpbl93cml0ZTE2KFNQT1JUMF9UQ1IyLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDBfVENMS0RJVigpCQliZmluX3JlYWQxNihTUE9SVDBfVENMS0RJVikKLSNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDBfVENMS0RJVih2YWwpCQliZmluX3dyaXRlMTYoU1BPUlQwX1RDTEtESVYsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMF9URlNESVYoKQkJYmZpbl9yZWFkMTYoU1BPUlQwX1RGU0RJVikKLSNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDBfVEZTRElWKHZhbCkJCWJmaW5fd3JpdGUxNihTUE9SVDBfVEZTRElWLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDBfVFgoKQkJCWJmaW5fcmVhZDMyKFNQT1JUMF9UWCkKLSNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDBfVFgodmFsKQkJYmZpbl93cml0ZTMyKFNQT1JUMF9UWCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfU1BPUlQwX1JYKCkJCQliZmluX3JlYWQzMihTUE9SVDBfUlgpCi0jZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQwX1JYKHZhbCkJCWJmaW5fd3JpdGUzMihTUE9SVDBfUlgsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMF9UWDMyKCkJCQliZmluX3JlYWQzMihTUE9SVDBfVFgpCi0jZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQwX1RYMzIodmFsKQkJYmZpbl93cml0ZTMyKFNQT1JUMF9UWCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfU1BPUlQwX1JYMzIoKQkJCWJmaW5fcmVhZDMyKFNQT1JUMF9SWCkKLSNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDBfUlgzMih2YWwpCQliZmluX3dyaXRlMzIoU1BPUlQwX1JYLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDBfVFgxNigpCQkJYmZpbl9yZWFkMTYoU1BPUlQwX1RYKQotI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMF9UWDE2KHZhbCkJCWJmaW5fd3JpdGUxNihTUE9SVDBfVFgsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMF9SWDE2KCkJCQliZmluX3JlYWQxNihTUE9SVDBfUlgpCi0jZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQwX1JYMTYodmFsKQkJYmZpbl93cml0ZTE2KFNQT1JUMF9SWCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfU1BPUlQwX1JDUjEoKQkJCWJmaW5fcmVhZDE2KFNQT1JUMF9SQ1IxKQotI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMF9SQ1IxKHZhbCkJCWJmaW5fd3JpdGUxNihTUE9SVDBfUkNSMSwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfU1BPUlQwX1JDUjIoKQkJCWJmaW5fcmVhZDE2KFNQT1JUMF9SQ1IyKQotI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMF9SQ1IyKHZhbCkJCWJmaW5fd3JpdGUxNihTUE9SVDBfUkNSMiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfU1BPUlQwX1JDTEtESVYoKQkJYmZpbl9yZWFkMTYoU1BPUlQwX1JDTEtESVYpCi0jZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQwX1JDTEtESVYodmFsKQkJYmZpbl93cml0ZTE2KFNQT1JUMF9SQ0xLRElWLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDBfUkZTRElWKCkJCWJmaW5fcmVhZDE2KFNQT1JUMF9SRlNESVYpCi0jZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQwX1JGU0RJVih2YWwpCQliZmluX3dyaXRlMTYoU1BPUlQwX1JGU0RJViwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfU1BPUlQwX1NUQVQoKQkJCWJmaW5fcmVhZDE2KFNQT1JUMF9TVEFUKQotI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMF9TVEFUKHZhbCkJCWJmaW5fd3JpdGUxNihTUE9SVDBfU1RBVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfU1BPUlQwX0NITkwoKQkJCWJmaW5fcmVhZDE2KFNQT1JUMF9DSE5MKQotI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMF9DSE5MKHZhbCkJCWJmaW5fd3JpdGUxNihTUE9SVDBfQ0hOTCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfU1BPUlQwX01DTUMxKCkJCWJmaW5fcmVhZDE2KFNQT1JUMF9NQ01DMSkKLSNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDBfTUNNQzEodmFsKQkJYmZpbl93cml0ZTE2KFNQT1JUMF9NQ01DMSwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfU1BPUlQwX01DTUMyKCkJCWJmaW5fcmVhZDE2KFNQT1JUMF9NQ01DMikKLSNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDBfTUNNQzIodmFsKQkJYmZpbl93cml0ZTE2KFNQT1JUMF9NQ01DMiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfU1BPUlQwX01UQ1MwKCkJCWJmaW5fcmVhZDMyKFNQT1JUMF9NVENTMCkKLSNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDBfTVRDUzAodmFsKQkJYmZpbl93cml0ZTMyKFNQT1JUMF9NVENTMCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfU1BPUlQwX01UQ1MxKCkJCWJmaW5fcmVhZDMyKFNQT1JUMF9NVENTMSkKLSNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDBfTVRDUzEodmFsKQkJYmZpbl93cml0ZTMyKFNQT1JUMF9NVENTMSwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfU1BPUlQwX01UQ1MyKCkJCWJmaW5fcmVhZDMyKFNQT1JUMF9NVENTMikKLSNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDBfTVRDUzIodmFsKQkJYmZpbl93cml0ZTMyKFNQT1JUMF9NVENTMiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfU1BPUlQwX01UQ1MzKCkJCWJmaW5fcmVhZDMyKFNQT1JUMF9NVENTMykKLSNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDBfTVRDUzModmFsKQkJYmZpbl93cml0ZTMyKFNQT1JUMF9NVENTMywgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfU1BPUlQwX01SQ1MwKCkJCWJmaW5fcmVhZDMyKFNQT1JUMF9NUkNTMCkKLSNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDBfTVJDUzAodmFsKQkJYmZpbl93cml0ZTMyKFNQT1JUMF9NUkNTMCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfU1BPUlQwX01SQ1MxKCkJCWJmaW5fcmVhZDMyKFNQT1JUMF9NUkNTMSkKLSNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDBfTVJDUzEodmFsKQkJYmZpbl93cml0ZTMyKFNQT1JUMF9NUkNTMSwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfU1BPUlQwX01SQ1MyKCkJCWJmaW5fcmVhZDMyKFNQT1JUMF9NUkNTMikKLSNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDBfTVJDUzIodmFsKQkJYmZpbl93cml0ZTMyKFNQT1JUMF9NUkNTMiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfU1BPUlQwX01SQ1MzKCkJCWJmaW5fcmVhZDMyKFNQT1JUMF9NUkNTMykKLSNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDBfTVJDUzModmFsKQkJYmZpbl93cml0ZTMyKFNQT1JUMF9NUkNTMywgdmFsKQotCi0KLS8qIFNQT1JUMSBDb250cm9sbGVyCQkoMHhGRkMwMDkwMCAtIDB4RkZDMDA5RkYpCQkJCQkJCQkqLwotI2RlZmluZSBiZmluX3JlYWRfU1BPUlQxX1RDUjEoKQkJCWJmaW5fcmVhZDE2KFNQT1JUMV9UQ1IxKQotI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMV9UQ1IxKHZhbCkJCWJmaW5fd3JpdGUxNihTUE9SVDFfVENSMSwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfU1BPUlQxX1RDUjIoKQkJCWJmaW5fcmVhZDE2KFNQT1JUMV9UQ1IyKQotI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMV9UQ1IyKHZhbCkJCWJmaW5fd3JpdGUxNihTUE9SVDFfVENSMiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfU1BPUlQxX1RDTEtESVYoKQkJYmZpbl9yZWFkMTYoU1BPUlQxX1RDTEtESVYpCi0jZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQxX1RDTEtESVYodmFsKQkJYmZpbl93cml0ZTE2KFNQT1JUMV9UQ0xLRElWLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDFfVEZTRElWKCkJCWJmaW5fcmVhZDE2KFNQT1JUMV9URlNESVYpCi0jZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQxX1RGU0RJVih2YWwpCQliZmluX3dyaXRlMTYoU1BPUlQxX1RGU0RJViwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfU1BPUlQxX1RYKCkJCQliZmluX3JlYWQzMihTUE9SVDFfVFgpCi0jZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQxX1RYKHZhbCkJCWJmaW5fd3JpdGUzMihTUE9SVDFfVFgsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMV9SWCgpCQkJYmZpbl9yZWFkMzIoU1BPUlQxX1JYKQotI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMV9SWCh2YWwpCQliZmluX3dyaXRlMzIoU1BPUlQxX1JYLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDFfVFgzMigpCQkJYmZpbl9yZWFkMzIoU1BPUlQxX1RYKQotI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMV9UWDMyKHZhbCkJCWJmaW5fd3JpdGUzMihTUE9SVDFfVFgsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMV9SWDMyKCkJCQliZmluX3JlYWQzMihTUE9SVDFfUlgpCi0jZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQxX1JYMzIodmFsKQkJYmZpbl93cml0ZTMyKFNQT1JUMV9SWCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfU1BPUlQxX1RYMTYoKQkJCWJmaW5fcmVhZDE2KFNQT1JUMV9UWCkKLSNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDFfVFgxNih2YWwpCQliZmluX3dyaXRlMTYoU1BPUlQxX1RYLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDFfUlgxNigpCQkJYmZpbl9yZWFkMTYoU1BPUlQxX1JYKQotI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMV9SWDE2KHZhbCkJCWJmaW5fd3JpdGUxNihTUE9SVDFfUlgsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMV9SQ1IxKCkJCQliZmluX3JlYWQxNihTUE9SVDFfUkNSMSkKLSNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDFfUkNSMSh2YWwpCQliZmluX3dyaXRlMTYoU1BPUlQxX1JDUjEsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMV9SQ1IyKCkJCQliZmluX3JlYWQxNihTUE9SVDFfUkNSMikKLSNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDFfUkNSMih2YWwpCQliZmluX3dyaXRlMTYoU1BPUlQxX1JDUjIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMV9SQ0xLRElWKCkJCWJmaW5fcmVhZDE2KFNQT1JUMV9SQ0xLRElWKQotI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMV9SQ0xLRElWKHZhbCkJCWJmaW5fd3JpdGUxNihTUE9SVDFfUkNMS0RJViwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfU1BPUlQxX1JGU0RJVigpCQliZmluX3JlYWQxNihTUE9SVDFfUkZTRElWKQotI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMV9SRlNESVYodmFsKQkJYmZpbl93cml0ZTE2KFNQT1JUMV9SRlNESVYsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMV9TVEFUKCkJCQliZmluX3JlYWQxNihTUE9SVDFfU1RBVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDFfU1RBVCh2YWwpCQliZmluX3dyaXRlMTYoU1BPUlQxX1NUQVQsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMV9DSE5MKCkJCQliZmluX3JlYWQxNihTUE9SVDFfQ0hOTCkKLSNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDFfQ0hOTCh2YWwpCQliZmluX3dyaXRlMTYoU1BPUlQxX0NITkwsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMV9NQ01DMSgpCQliZmluX3JlYWQxNihTUE9SVDFfTUNNQzEpCi0jZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQxX01DTUMxKHZhbCkJCWJmaW5fd3JpdGUxNihTUE9SVDFfTUNNQzEsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMV9NQ01DMigpCQliZmluX3JlYWQxNihTUE9SVDFfTUNNQzIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQxX01DTUMyKHZhbCkJCWJmaW5fd3JpdGUxNihTUE9SVDFfTUNNQzIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMV9NVENTMCgpCQliZmluX3JlYWQzMihTUE9SVDFfTVRDUzApCi0jZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQxX01UQ1MwKHZhbCkJCWJmaW5fd3JpdGUzMihTUE9SVDFfTVRDUzAsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMV9NVENTMSgpCQliZmluX3JlYWQzMihTUE9SVDFfTVRDUzEpCi0jZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQxX01UQ1MxKHZhbCkJCWJmaW5fd3JpdGUzMihTUE9SVDFfTVRDUzEsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMV9NVENTMigpCQliZmluX3JlYWQzMihTUE9SVDFfTVRDUzIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQxX01UQ1MyKHZhbCkJCWJmaW5fd3JpdGUzMihTUE9SVDFfTVRDUzIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMV9NVENTMygpCQliZmluX3JlYWQzMihTUE9SVDFfTVRDUzMpCi0jZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQxX01UQ1MzKHZhbCkJCWJmaW5fd3JpdGUzMihTUE9SVDFfTVRDUzMsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMV9NUkNTMCgpCQliZmluX3JlYWQzMihTUE9SVDFfTVJDUzApCi0jZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQxX01SQ1MwKHZhbCkJCWJmaW5fd3JpdGUzMihTUE9SVDFfTVJDUzAsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMV9NUkNTMSgpCQliZmluX3JlYWQzMihTUE9SVDFfTVJDUzEpCi0jZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQxX01SQ1MxKHZhbCkJCWJmaW5fd3JpdGUzMihTUE9SVDFfTVJDUzEsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMV9NUkNTMigpCQliZmluX3JlYWQzMihTUE9SVDFfTVJDUzIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQxX01SQ1MyKHZhbCkJCWJmaW5fd3JpdGUzMihTUE9SVDFfTVJDUzIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMV9NUkNTMygpCQliZmluX3JlYWQzMihTUE9SVDFfTVJDUzMpCi0jZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQxX01SQ1MzKHZhbCkJCWJmaW5fd3JpdGUzMihTUE9SVDFfTVJDUzMsIHZhbCkKLQotCi0vKiBFeHRlcm5hbCBCdXMgSW50ZXJmYWNlIFVuaXQgKDB4RkZDMDBBMDAgLSAweEZGQzAwQUZGKQkJCQkJCQkqLwotI2RlZmluZSBiZmluX3JlYWRfRUJJVV9BTUdDVEwoKQkJCWJmaW5fcmVhZDE2KEVCSVVfQU1HQ1RMKQotI2RlZmluZSBiZmluX3dyaXRlX0VCSVVfQU1HQ1RMKHZhbCkJCWJmaW5fd3JpdGUxNihFQklVX0FNR0NUTCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRUJJVV9BTUJDVEwwKCkJCWJmaW5fcmVhZDMyKEVCSVVfQU1CQ1RMMCkKLSNkZWZpbmUgYmZpbl93cml0ZV9FQklVX0FNQkNUTDAodmFsKQkJYmZpbl93cml0ZTMyKEVCSVVfQU1CQ1RMMCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRUJJVV9BTUJDVEwxKCkJCWJmaW5fcmVhZDMyKEVCSVVfQU1CQ1RMMSkKLSNkZWZpbmUgYmZpbl93cml0ZV9FQklVX0FNQkNUTDEodmFsKQkJYmZpbl93cml0ZTMyKEVCSVVfQU1CQ1RMMSwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRUJJVV9TREdDVEwoKQkJCWJmaW5fcmVhZDMyKEVCSVVfU0RHQ1RMKQotI2RlZmluZSBiZmluX3dyaXRlX0VCSVVfU0RHQ1RMKHZhbCkJCWJmaW5fd3JpdGUzMihFQklVX1NER0NUTCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRUJJVV9TREJDVEwoKQkJCWJmaW5fcmVhZDE2KEVCSVVfU0RCQ1RMKQotI2RlZmluZSBiZmluX3dyaXRlX0VCSVVfU0RCQ1RMKHZhbCkJCWJmaW5fd3JpdGUxNihFQklVX1NEQkNUTCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRUJJVV9TRFJSQygpCQkJYmZpbl9yZWFkMTYoRUJJVV9TRFJSQykKLSNkZWZpbmUgYmZpbl93cml0ZV9FQklVX1NEUlJDKHZhbCkJCWJmaW5fd3JpdGUxNihFQklVX1NEUlJDLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9FQklVX1NEU1RBVCgpCQkJYmZpbl9yZWFkMTYoRUJJVV9TRFNUQVQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRUJJVV9TRFNUQVQodmFsKQkJYmZpbl93cml0ZTE2KEVCSVVfU0RTVEFULCB2YWwpCi0KLQotLyogRE1BIFRyYWZmaWMgQ29udHJvbCBSZWdpc3RlcnMJCQkJCQkJCQkJCQkJKi8KLSNkZWZpbmUgYmZpbl9yZWFkX0RNQV9UQ19QRVIoKQkJCWJmaW5fcmVhZDE2KERNQV9UQ19QRVIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BX1RDX1BFUih2YWwpCQliZmluX3dyaXRlMTYoRE1BX1RDX1BFUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BX1RDX0NOVCgpCQkJYmZpbl9yZWFkMTYoRE1BX1RDX0NOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUFfVENfQ05UKHZhbCkJCWJmaW5fd3JpdGUxNihETUFfVENfQ05ULCB2YWwpCi0KLS8qIEFsdGVybmF0ZSBkZXByZWNhdGVkIHJlZ2lzdGVyIG5hbWVzIChiZWxvdykgcHJvdmlkZWQgZm9yIGJhY2t3YXJkcyBjb2RlIGNvbXBhdGliaWxpdHkgKi8KLSNkZWZpbmUgYmZpbl9yZWFkX0RNQV9UQ1BFUigpCQkJYmZpbl9yZWFkMTYoRE1BX1RDUEVSKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQV9UQ1BFUih2YWwpCQliZmluX3dyaXRlMTYoRE1BX1RDUEVSLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUFfVENDTlQoKQkJCWJmaW5fcmVhZDE2KERNQV9UQ0NOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUFfVENDTlQodmFsKQkJYmZpbl93cml0ZTE2KERNQV9UQ0NOVCwgdmFsKQotCi0vKiBETUEgQ29udHJvbGxlcgkJCQkJCQkJCQkJCQkJCQkJKi8KLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTBfQ09ORklHKCkJCQliZmluX3JlYWQxNihETUEwX0NPTkZJRykKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUEwX0NPTkZJRyh2YWwpCQliZmluX3dyaXRlMTYoRE1BMF9DT05GSUcsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTBfTkVYVF9ERVNDX1BUUigpCQliZmluX3JlYWQzMihETUEwX05FWFRfREVTQ19QVFIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BMF9ORVhUX0RFU0NfUFRSKHZhbCkJYmZpbl93cml0ZTMyKERNQTBfTkVYVF9ERVNDX1BUUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BMF9TVEFSVF9BRERSKCkJCWJmaW5fcmVhZDMyKERNQTBfU1RBUlRfQUREUikKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUEwX1NUQVJUX0FERFIodmFsKQkJYmZpbl93cml0ZTMyKERNQTBfU1RBUlRfQUREUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BMF9YX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTBfWF9DT1VOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUEwX1hfQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KERNQTBfWF9DT1VOVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BMF9ZX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTBfWV9DT1VOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUEwX1lfQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KERNQTBfWV9DT1VOVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BMF9YX01PRElGWSgpCQliZmluX3JlYWQxNihETUEwX1hfTU9ESUZZKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTBfWF9NT0RJRlkodmFsKQkJYmZpbl93cml0ZTE2KERNQTBfWF9NT0RJRlksIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTBfWV9NT0RJRlkoKQkJYmZpbl9yZWFkMTYoRE1BMF9ZX01PRElGWSkKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUEwX1lfTU9ESUZZKHZhbCkJCWJmaW5fd3JpdGUxNihETUEwX1lfTU9ESUZZLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUEwX0NVUlJfREVTQ19QVFIoKQkJYmZpbl9yZWFkMzIoRE1BMF9DVVJSX0RFU0NfUFRSKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTBfQ1VSUl9ERVNDX1BUUih2YWwpCWJmaW5fd3JpdGUzMihETUEwX0NVUlJfREVTQ19QVFIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTBfQ1VSUl9BRERSKCkJCWJmaW5fcmVhZDMyKERNQTBfQ1VSUl9BRERSKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTBfQ1VSUl9BRERSKHZhbCkJCWJmaW5fd3JpdGUzMihETUEwX0NVUlJfQUREUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BMF9DVVJSX1hfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BMF9DVVJSX1hfQ09VTlQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BMF9DVVJSX1hfQ09VTlQodmFsKQliZmluX3dyaXRlMTYoRE1BMF9DVVJSX1hfQ09VTlQsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTBfQ1VSUl9ZX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTBfQ1VSUl9ZX0NPVU5UKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTBfQ1VSUl9ZX0NPVU5UKHZhbCkJYmZpbl93cml0ZTE2KERNQTBfQ1VSUl9ZX0NPVU5ULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUEwX0lSUV9TVEFUVVMoKQkJYmZpbl9yZWFkMTYoRE1BMF9JUlFfU1RBVFVTKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTBfSVJRX1NUQVRVUyh2YWwpCQliZmluX3dyaXRlMTYoRE1BMF9JUlFfU1RBVFVTLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUEwX1BFUklQSEVSQUxfTUFQKCkJCWJmaW5fcmVhZDE2KERNQTBfUEVSSVBIRVJBTF9NQVApCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BMF9QRVJJUEhFUkFMX01BUCh2YWwpCWJmaW5fd3JpdGUxNihETUEwX1BFUklQSEVSQUxfTUFQLCB2YWwpCi0KLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTFfQ09ORklHKCkJCQliZmluX3JlYWQxNihETUExX0NPTkZJRykKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUExX0NPTkZJRyh2YWwpCQliZmluX3dyaXRlMTYoRE1BMV9DT05GSUcsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTFfTkVYVF9ERVNDX1BUUigpCQliZmluX3JlYWQzMihETUExX05FWFRfREVTQ19QVFIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BMV9ORVhUX0RFU0NfUFRSKHZhbCkJYmZpbl93cml0ZTMyKERNQTFfTkVYVF9ERVNDX1BUUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BMV9TVEFSVF9BRERSKCkJCWJmaW5fcmVhZDMyKERNQTFfU1RBUlRfQUREUikKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUExX1NUQVJUX0FERFIodmFsKQkJYmZpbl93cml0ZTMyKERNQTFfU1RBUlRfQUREUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BMV9YX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTFfWF9DT1VOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUExX1hfQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KERNQTFfWF9DT1VOVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BMV9ZX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTFfWV9DT1VOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUExX1lfQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KERNQTFfWV9DT1VOVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BMV9YX01PRElGWSgpCQliZmluX3JlYWQxNihETUExX1hfTU9ESUZZKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTFfWF9NT0RJRlkodmFsKQkJYmZpbl93cml0ZTE2KERNQTFfWF9NT0RJRlksIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTFfWV9NT0RJRlkoKQkJYmZpbl9yZWFkMTYoRE1BMV9ZX01PRElGWSkKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUExX1lfTU9ESUZZKHZhbCkJCWJmaW5fd3JpdGUxNihETUExX1lfTU9ESUZZLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUExX0NVUlJfREVTQ19QVFIoKQkJYmZpbl9yZWFkMzIoRE1BMV9DVVJSX0RFU0NfUFRSKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTFfQ1VSUl9ERVNDX1BUUih2YWwpCWJmaW5fd3JpdGUzMihETUExX0NVUlJfREVTQ19QVFIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTFfQ1VSUl9BRERSKCkJCWJmaW5fcmVhZDMyKERNQTFfQ1VSUl9BRERSKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTFfQ1VSUl9BRERSKHZhbCkJCWJmaW5fd3JpdGUzMihETUExX0NVUlJfQUREUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BMV9DVVJSX1hfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BMV9DVVJSX1hfQ09VTlQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BMV9DVVJSX1hfQ09VTlQodmFsKQliZmluX3dyaXRlMTYoRE1BMV9DVVJSX1hfQ09VTlQsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTFfQ1VSUl9ZX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTFfQ1VSUl9ZX0NPVU5UKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTFfQ1VSUl9ZX0NPVU5UKHZhbCkJYmZpbl93cml0ZTE2KERNQTFfQ1VSUl9ZX0NPVU5ULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUExX0lSUV9TVEFUVVMoKQkJYmZpbl9yZWFkMTYoRE1BMV9JUlFfU1RBVFVTKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTFfSVJRX1NUQVRVUyh2YWwpCQliZmluX3dyaXRlMTYoRE1BMV9JUlFfU1RBVFVTLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUExX1BFUklQSEVSQUxfTUFQKCkJCWJmaW5fcmVhZDE2KERNQTFfUEVSSVBIRVJBTF9NQVApCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BMV9QRVJJUEhFUkFMX01BUCh2YWwpCWJmaW5fd3JpdGUxNihETUExX1BFUklQSEVSQUxfTUFQLCB2YWwpCi0KLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTJfQ09ORklHKCkJCQliZmluX3JlYWQxNihETUEyX0NPTkZJRykKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUEyX0NPTkZJRyh2YWwpCQliZmluX3dyaXRlMTYoRE1BMl9DT05GSUcsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTJfTkVYVF9ERVNDX1BUUigpCQliZmluX3JlYWQzMihETUEyX05FWFRfREVTQ19QVFIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BMl9ORVhUX0RFU0NfUFRSKHZhbCkJYmZpbl93cml0ZTMyKERNQTJfTkVYVF9ERVNDX1BUUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BMl9TVEFSVF9BRERSKCkJCWJmaW5fcmVhZDMyKERNQTJfU1RBUlRfQUREUikKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUEyX1NUQVJUX0FERFIodmFsKQkJYmZpbl93cml0ZTMyKERNQTJfU1RBUlRfQUREUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BMl9YX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTJfWF9DT1VOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUEyX1hfQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KERNQTJfWF9DT1VOVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BMl9ZX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTJfWV9DT1VOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUEyX1lfQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KERNQTJfWV9DT1VOVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BMl9YX01PRElGWSgpCQliZmluX3JlYWQxNihETUEyX1hfTU9ESUZZKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTJfWF9NT0RJRlkodmFsKQkJYmZpbl93cml0ZTE2KERNQTJfWF9NT0RJRlksIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTJfWV9NT0RJRlkoKQkJYmZpbl9yZWFkMTYoRE1BMl9ZX01PRElGWSkKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUEyX1lfTU9ESUZZKHZhbCkJCWJmaW5fd3JpdGUxNihETUEyX1lfTU9ESUZZLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUEyX0NVUlJfREVTQ19QVFIoKQkJYmZpbl9yZWFkMzIoRE1BMl9DVVJSX0RFU0NfUFRSKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTJfQ1VSUl9ERVNDX1BUUih2YWwpCWJmaW5fd3JpdGUzMihETUEyX0NVUlJfREVTQ19QVFIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTJfQ1VSUl9BRERSKCkJCWJmaW5fcmVhZDMyKERNQTJfQ1VSUl9BRERSKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTJfQ1VSUl9BRERSKHZhbCkJCWJmaW5fd3JpdGUzMihETUEyX0NVUlJfQUREUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BMl9DVVJSX1hfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BMl9DVVJSX1hfQ09VTlQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BMl9DVVJSX1hfQ09VTlQodmFsKQliZmluX3dyaXRlMTYoRE1BMl9DVVJSX1hfQ09VTlQsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTJfQ1VSUl9ZX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTJfQ1VSUl9ZX0NPVU5UKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTJfQ1VSUl9ZX0NPVU5UKHZhbCkJYmZpbl93cml0ZTE2KERNQTJfQ1VSUl9ZX0NPVU5ULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUEyX0lSUV9TVEFUVVMoKQkJYmZpbl9yZWFkMTYoRE1BMl9JUlFfU1RBVFVTKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTJfSVJRX1NUQVRVUyh2YWwpCQliZmluX3dyaXRlMTYoRE1BMl9JUlFfU1RBVFVTLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUEyX1BFUklQSEVSQUxfTUFQKCkJCWJmaW5fcmVhZDE2KERNQTJfUEVSSVBIRVJBTF9NQVApCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BMl9QRVJJUEhFUkFMX01BUCh2YWwpCWJmaW5fd3JpdGUxNihETUEyX1BFUklQSEVSQUxfTUFQLCB2YWwpCi0KLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTNfQ09ORklHKCkJCQliZmluX3JlYWQxNihETUEzX0NPTkZJRykKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUEzX0NPTkZJRyh2YWwpCQliZmluX3dyaXRlMTYoRE1BM19DT05GSUcsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTNfTkVYVF9ERVNDX1BUUigpCQliZmluX3JlYWQzMihETUEzX05FWFRfREVTQ19QVFIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BM19ORVhUX0RFU0NfUFRSKHZhbCkJYmZpbl93cml0ZTMyKERNQTNfTkVYVF9ERVNDX1BUUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BM19TVEFSVF9BRERSKCkJCWJmaW5fcmVhZDMyKERNQTNfU1RBUlRfQUREUikKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUEzX1NUQVJUX0FERFIodmFsKQkJYmZpbl93cml0ZTMyKERNQTNfU1RBUlRfQUREUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BM19YX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTNfWF9DT1VOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUEzX1hfQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KERNQTNfWF9DT1VOVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BM19ZX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTNfWV9DT1VOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUEzX1lfQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KERNQTNfWV9DT1VOVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BM19YX01PRElGWSgpCQliZmluX3JlYWQxNihETUEzX1hfTU9ESUZZKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTNfWF9NT0RJRlkodmFsKQkJYmZpbl93cml0ZTE2KERNQTNfWF9NT0RJRlksIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTNfWV9NT0RJRlkoKQkJYmZpbl9yZWFkMTYoRE1BM19ZX01PRElGWSkKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUEzX1lfTU9ESUZZKHZhbCkJCWJmaW5fd3JpdGUxNihETUEzX1lfTU9ESUZZLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUEzX0NVUlJfREVTQ19QVFIoKQkJYmZpbl9yZWFkMzIoRE1BM19DVVJSX0RFU0NfUFRSKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTNfQ1VSUl9ERVNDX1BUUih2YWwpCWJmaW5fd3JpdGUzMihETUEzX0NVUlJfREVTQ19QVFIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTNfQ1VSUl9BRERSKCkJCWJmaW5fcmVhZDMyKERNQTNfQ1VSUl9BRERSKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTNfQ1VSUl9BRERSKHZhbCkJCWJmaW5fd3JpdGUzMihETUEzX0NVUlJfQUREUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BM19DVVJSX1hfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BM19DVVJSX1hfQ09VTlQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BM19DVVJSX1hfQ09VTlQodmFsKQliZmluX3dyaXRlMTYoRE1BM19DVVJSX1hfQ09VTlQsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTNfQ1VSUl9ZX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTNfQ1VSUl9ZX0NPVU5UKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTNfQ1VSUl9ZX0NPVU5UKHZhbCkJYmZpbl93cml0ZTE2KERNQTNfQ1VSUl9ZX0NPVU5ULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUEzX0lSUV9TVEFUVVMoKQkJYmZpbl9yZWFkMTYoRE1BM19JUlFfU1RBVFVTKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTNfSVJRX1NUQVRVUyh2YWwpCQliZmluX3dyaXRlMTYoRE1BM19JUlFfU1RBVFVTLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUEzX1BFUklQSEVSQUxfTUFQKCkJCWJmaW5fcmVhZDE2KERNQTNfUEVSSVBIRVJBTF9NQVApCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BM19QRVJJUEhFUkFMX01BUCh2YWwpCWJmaW5fd3JpdGUxNihETUEzX1BFUklQSEVSQUxfTUFQLCB2YWwpCi0KLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTRfQ09ORklHKCkJCQliZmluX3JlYWQxNihETUE0X0NPTkZJRykKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUE0X0NPTkZJRyh2YWwpCQliZmluX3dyaXRlMTYoRE1BNF9DT05GSUcsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTRfTkVYVF9ERVNDX1BUUigpCQliZmluX3JlYWQzMihETUE0X05FWFRfREVTQ19QVFIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BNF9ORVhUX0RFU0NfUFRSKHZhbCkJYmZpbl93cml0ZTMyKERNQTRfTkVYVF9ERVNDX1BUUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BNF9TVEFSVF9BRERSKCkJCWJmaW5fcmVhZDMyKERNQTRfU1RBUlRfQUREUikKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUE0X1NUQVJUX0FERFIodmFsKQkJYmZpbl93cml0ZTMyKERNQTRfU1RBUlRfQUREUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BNF9YX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTRfWF9DT1VOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUE0X1hfQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KERNQTRfWF9DT1VOVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BNF9ZX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTRfWV9DT1VOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUE0X1lfQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KERNQTRfWV9DT1VOVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BNF9YX01PRElGWSgpCQliZmluX3JlYWQxNihETUE0X1hfTU9ESUZZKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTRfWF9NT0RJRlkodmFsKQkJYmZpbl93cml0ZTE2KERNQTRfWF9NT0RJRlksIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTRfWV9NT0RJRlkoKQkJYmZpbl9yZWFkMTYoRE1BNF9ZX01PRElGWSkKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUE0X1lfTU9ESUZZKHZhbCkJCWJmaW5fd3JpdGUxNihETUE0X1lfTU9ESUZZLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUE0X0NVUlJfREVTQ19QVFIoKQkJYmZpbl9yZWFkMzIoRE1BNF9DVVJSX0RFU0NfUFRSKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTRfQ1VSUl9ERVNDX1BUUih2YWwpCWJmaW5fd3JpdGUzMihETUE0X0NVUlJfREVTQ19QVFIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTRfQ1VSUl9BRERSKCkJCWJmaW5fcmVhZDMyKERNQTRfQ1VSUl9BRERSKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTRfQ1VSUl9BRERSKHZhbCkJCWJmaW5fd3JpdGUzMihETUE0X0NVUlJfQUREUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BNF9DVVJSX1hfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BNF9DVVJSX1hfQ09VTlQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BNF9DVVJSX1hfQ09VTlQodmFsKQliZmluX3dyaXRlMTYoRE1BNF9DVVJSX1hfQ09VTlQsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTRfQ1VSUl9ZX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTRfQ1VSUl9ZX0NPVU5UKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTRfQ1VSUl9ZX0NPVU5UKHZhbCkJYmZpbl93cml0ZTE2KERNQTRfQ1VSUl9ZX0NPVU5ULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUE0X0lSUV9TVEFUVVMoKQkJYmZpbl9yZWFkMTYoRE1BNF9JUlFfU1RBVFVTKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTRfSVJRX1NUQVRVUyh2YWwpCQliZmluX3dyaXRlMTYoRE1BNF9JUlFfU1RBVFVTLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUE0X1BFUklQSEVSQUxfTUFQKCkJCWJmaW5fcmVhZDE2KERNQTRfUEVSSVBIRVJBTF9NQVApCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BNF9QRVJJUEhFUkFMX01BUCh2YWwpCWJmaW5fd3JpdGUxNihETUE0X1BFUklQSEVSQUxfTUFQLCB2YWwpCi0KLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTVfQ09ORklHKCkJCQliZmluX3JlYWQxNihETUE1X0NPTkZJRykKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUE1X0NPTkZJRyh2YWwpCQliZmluX3dyaXRlMTYoRE1BNV9DT05GSUcsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTVfTkVYVF9ERVNDX1BUUigpCQliZmluX3JlYWQzMihETUE1X05FWFRfREVTQ19QVFIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BNV9ORVhUX0RFU0NfUFRSKHZhbCkJYmZpbl93cml0ZTMyKERNQTVfTkVYVF9ERVNDX1BUUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BNV9TVEFSVF9BRERSKCkJCWJmaW5fcmVhZDMyKERNQTVfU1RBUlRfQUREUikKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUE1X1NUQVJUX0FERFIodmFsKQkJYmZpbl93cml0ZTMyKERNQTVfU1RBUlRfQUREUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BNV9YX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTVfWF9DT1VOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUE1X1hfQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KERNQTVfWF9DT1VOVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BNV9ZX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTVfWV9DT1VOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUE1X1lfQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KERNQTVfWV9DT1VOVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BNV9YX01PRElGWSgpCQliZmluX3JlYWQxNihETUE1X1hfTU9ESUZZKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTVfWF9NT0RJRlkodmFsKQkJYmZpbl93cml0ZTE2KERNQTVfWF9NT0RJRlksIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTVfWV9NT0RJRlkoKQkJYmZpbl9yZWFkMTYoRE1BNV9ZX01PRElGWSkKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUE1X1lfTU9ESUZZKHZhbCkJCWJmaW5fd3JpdGUxNihETUE1X1lfTU9ESUZZLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUE1X0NVUlJfREVTQ19QVFIoKQkJYmZpbl9yZWFkMzIoRE1BNV9DVVJSX0RFU0NfUFRSKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTVfQ1VSUl9ERVNDX1BUUih2YWwpCWJmaW5fd3JpdGUzMihETUE1X0NVUlJfREVTQ19QVFIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTVfQ1VSUl9BRERSKCkJCWJmaW5fcmVhZDMyKERNQTVfQ1VSUl9BRERSKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTVfQ1VSUl9BRERSKHZhbCkJCWJmaW5fd3JpdGUzMihETUE1X0NVUlJfQUREUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BNV9DVVJSX1hfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BNV9DVVJSX1hfQ09VTlQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BNV9DVVJSX1hfQ09VTlQodmFsKQliZmluX3dyaXRlMTYoRE1BNV9DVVJSX1hfQ09VTlQsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTVfQ1VSUl9ZX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTVfQ1VSUl9ZX0NPVU5UKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTVfQ1VSUl9ZX0NPVU5UKHZhbCkJYmZpbl93cml0ZTE2KERNQTVfQ1VSUl9ZX0NPVU5ULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUE1X0lSUV9TVEFUVVMoKQkJYmZpbl9yZWFkMTYoRE1BNV9JUlFfU1RBVFVTKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTVfSVJRX1NUQVRVUyh2YWwpCQliZmluX3dyaXRlMTYoRE1BNV9JUlFfU1RBVFVTLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUE1X1BFUklQSEVSQUxfTUFQKCkJCWJmaW5fcmVhZDE2KERNQTVfUEVSSVBIRVJBTF9NQVApCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BNV9QRVJJUEhFUkFMX01BUCh2YWwpCWJmaW5fd3JpdGUxNihETUE1X1BFUklQSEVSQUxfTUFQLCB2YWwpCi0KLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTZfQ09ORklHKCkJCQliZmluX3JlYWQxNihETUE2X0NPTkZJRykKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUE2X0NPTkZJRyh2YWwpCQliZmluX3dyaXRlMTYoRE1BNl9DT05GSUcsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTZfTkVYVF9ERVNDX1BUUigpCQliZmluX3JlYWQzMihETUE2X05FWFRfREVTQ19QVFIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BNl9ORVhUX0RFU0NfUFRSKHZhbCkJYmZpbl93cml0ZTMyKERNQTZfTkVYVF9ERVNDX1BUUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BNl9TVEFSVF9BRERSKCkJCWJmaW5fcmVhZDMyKERNQTZfU1RBUlRfQUREUikKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUE2X1NUQVJUX0FERFIodmFsKQkJYmZpbl93cml0ZTMyKERNQTZfU1RBUlRfQUREUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BNl9YX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTZfWF9DT1VOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUE2X1hfQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KERNQTZfWF9DT1VOVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BNl9ZX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTZfWV9DT1VOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUE2X1lfQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KERNQTZfWV9DT1VOVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BNl9YX01PRElGWSgpCQliZmluX3JlYWQxNihETUE2X1hfTU9ESUZZKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTZfWF9NT0RJRlkodmFsKQkJYmZpbl93cml0ZTE2KERNQTZfWF9NT0RJRlksIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTZfWV9NT0RJRlkoKQkJYmZpbl9yZWFkMTYoRE1BNl9ZX01PRElGWSkKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUE2X1lfTU9ESUZZKHZhbCkJCWJmaW5fd3JpdGUxNihETUE2X1lfTU9ESUZZLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUE2X0NVUlJfREVTQ19QVFIoKQkJYmZpbl9yZWFkMzIoRE1BNl9DVVJSX0RFU0NfUFRSKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTZfQ1VSUl9ERVNDX1BUUih2YWwpCWJmaW5fd3JpdGUzMihETUE2X0NVUlJfREVTQ19QVFIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTZfQ1VSUl9BRERSKCkJCWJmaW5fcmVhZDMyKERNQTZfQ1VSUl9BRERSKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTZfQ1VSUl9BRERSKHZhbCkJCWJmaW5fd3JpdGUzMihETUE2X0NVUlJfQUREUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BNl9DVVJSX1hfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BNl9DVVJSX1hfQ09VTlQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BNl9DVVJSX1hfQ09VTlQodmFsKQliZmluX3dyaXRlMTYoRE1BNl9DVVJSX1hfQ09VTlQsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTZfQ1VSUl9ZX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTZfQ1VSUl9ZX0NPVU5UKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTZfQ1VSUl9ZX0NPVU5UKHZhbCkJYmZpbl93cml0ZTE2KERNQTZfQ1VSUl9ZX0NPVU5ULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUE2X0lSUV9TVEFUVVMoKQkJYmZpbl9yZWFkMTYoRE1BNl9JUlFfU1RBVFVTKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTZfSVJRX1NUQVRVUyh2YWwpCQliZmluX3dyaXRlMTYoRE1BNl9JUlFfU1RBVFVTLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUE2X1BFUklQSEVSQUxfTUFQKCkJCWJmaW5fcmVhZDE2KERNQTZfUEVSSVBIRVJBTF9NQVApCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BNl9QRVJJUEhFUkFMX01BUCh2YWwpCWJmaW5fd3JpdGUxNihETUE2X1BFUklQSEVSQUxfTUFQLCB2YWwpCi0KLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTdfQ09ORklHKCkJCQliZmluX3JlYWQxNihETUE3X0NPTkZJRykKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUE3X0NPTkZJRyh2YWwpCQliZmluX3dyaXRlMTYoRE1BN19DT05GSUcsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTdfTkVYVF9ERVNDX1BUUigpCQliZmluX3JlYWQzMihETUE3X05FWFRfREVTQ19QVFIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BN19ORVhUX0RFU0NfUFRSKHZhbCkJYmZpbl93cml0ZTMyKERNQTdfTkVYVF9ERVNDX1BUUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BN19TVEFSVF9BRERSKCkJCWJmaW5fcmVhZDMyKERNQTdfU1RBUlRfQUREUikKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUE3X1NUQVJUX0FERFIodmFsKQkJYmZpbl93cml0ZTMyKERNQTdfU1RBUlRfQUREUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BN19YX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTdfWF9DT1VOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUE3X1hfQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KERNQTdfWF9DT1VOVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BN19ZX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTdfWV9DT1VOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUE3X1lfQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KERNQTdfWV9DT1VOVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BN19YX01PRElGWSgpCQliZmluX3JlYWQxNihETUE3X1hfTU9ESUZZKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTdfWF9NT0RJRlkodmFsKQkJYmZpbl93cml0ZTE2KERNQTdfWF9NT0RJRlksIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTdfWV9NT0RJRlkoKQkJYmZpbl9yZWFkMTYoRE1BN19ZX01PRElGWSkKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUE3X1lfTU9ESUZZKHZhbCkJCWJmaW5fd3JpdGUxNihETUE3X1lfTU9ESUZZLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUE3X0NVUlJfREVTQ19QVFIoKQkJYmZpbl9yZWFkMzIoRE1BN19DVVJSX0RFU0NfUFRSKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTdfQ1VSUl9ERVNDX1BUUih2YWwpCWJmaW5fd3JpdGUzMihETUE3X0NVUlJfREVTQ19QVFIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTdfQ1VSUl9BRERSKCkJCWJmaW5fcmVhZDMyKERNQTdfQ1VSUl9BRERSKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTdfQ1VSUl9BRERSKHZhbCkJCWJmaW5fd3JpdGUzMihETUE3X0NVUlJfQUREUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BN19DVVJSX1hfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BN19DVVJSX1hfQ09VTlQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BN19DVVJSX1hfQ09VTlQodmFsKQliZmluX3dyaXRlMTYoRE1BN19DVVJSX1hfQ09VTlQsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTdfQ1VSUl9ZX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTdfQ1VSUl9ZX0NPVU5UKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTdfQ1VSUl9ZX0NPVU5UKHZhbCkJYmZpbl93cml0ZTE2KERNQTdfQ1VSUl9ZX0NPVU5ULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUE3X0lSUV9TVEFUVVMoKQkJYmZpbl9yZWFkMTYoRE1BN19JUlFfU1RBVFVTKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTdfSVJRX1NUQVRVUyh2YWwpCQliZmluX3dyaXRlMTYoRE1BN19JUlFfU1RBVFVTLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUE3X1BFUklQSEVSQUxfTUFQKCkJCWJmaW5fcmVhZDE2KERNQTdfUEVSSVBIRVJBTF9NQVApCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BN19QRVJJUEhFUkFMX01BUCh2YWwpCWJmaW5fd3JpdGUxNihETUE3X1BFUklQSEVSQUxfTUFQLCB2YWwpCi0KLSNkZWZpbmUgYmZpbl9yZWFkX0RNQThfQ09ORklHKCkJCQliZmluX3JlYWQxNihETUE4X0NPTkZJRykKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUE4X0NPTkZJRyh2YWwpCQliZmluX3dyaXRlMTYoRE1BOF9DT05GSUcsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQThfTkVYVF9ERVNDX1BUUigpCQliZmluX3JlYWQzMihETUE4X05FWFRfREVTQ19QVFIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BOF9ORVhUX0RFU0NfUFRSKHZhbCkJYmZpbl93cml0ZTMyKERNQThfTkVYVF9ERVNDX1BUUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BOF9TVEFSVF9BRERSKCkJCWJmaW5fcmVhZDMyKERNQThfU1RBUlRfQUREUikKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUE4X1NUQVJUX0FERFIodmFsKQkJYmZpbl93cml0ZTMyKERNQThfU1RBUlRfQUREUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BOF9YX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQThfWF9DT1VOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUE4X1hfQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KERNQThfWF9DT1VOVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BOF9ZX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQThfWV9DT1VOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUE4X1lfQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KERNQThfWV9DT1VOVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BOF9YX01PRElGWSgpCQliZmluX3JlYWQxNihETUE4X1hfTU9ESUZZKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQThfWF9NT0RJRlkodmFsKQkJYmZpbl93cml0ZTE2KERNQThfWF9NT0RJRlksIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQThfWV9NT0RJRlkoKQkJYmZpbl9yZWFkMTYoRE1BOF9ZX01PRElGWSkKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUE4X1lfTU9ESUZZKHZhbCkJCWJmaW5fd3JpdGUxNihETUE4X1lfTU9ESUZZLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUE4X0NVUlJfREVTQ19QVFIoKQkJYmZpbl9yZWFkMzIoRE1BOF9DVVJSX0RFU0NfUFRSKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQThfQ1VSUl9ERVNDX1BUUih2YWwpCWJmaW5fd3JpdGUzMihETUE4X0NVUlJfREVTQ19QVFIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQThfQ1VSUl9BRERSKCkJCWJmaW5fcmVhZDMyKERNQThfQ1VSUl9BRERSKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQThfQ1VSUl9BRERSKHZhbCkJCWJmaW5fd3JpdGUzMihETUE4X0NVUlJfQUREUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BOF9DVVJSX1hfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BOF9DVVJSX1hfQ09VTlQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BOF9DVVJSX1hfQ09VTlQodmFsKQliZmluX3dyaXRlMTYoRE1BOF9DVVJSX1hfQ09VTlQsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQThfQ1VSUl9ZX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQThfQ1VSUl9ZX0NPVU5UKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQThfQ1VSUl9ZX0NPVU5UKHZhbCkJYmZpbl93cml0ZTE2KERNQThfQ1VSUl9ZX0NPVU5ULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUE4X0lSUV9TVEFUVVMoKQkJYmZpbl9yZWFkMTYoRE1BOF9JUlFfU1RBVFVTKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQThfSVJRX1NUQVRVUyh2YWwpCQliZmluX3dyaXRlMTYoRE1BOF9JUlFfU1RBVFVTLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUE4X1BFUklQSEVSQUxfTUFQKCkJCWJmaW5fcmVhZDE2KERNQThfUEVSSVBIRVJBTF9NQVApCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BOF9QRVJJUEhFUkFMX01BUCh2YWwpCWJmaW5fd3JpdGUxNihETUE4X1BFUklQSEVSQUxfTUFQLCB2YWwpCi0KLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTlfQ09ORklHKCkJCQliZmluX3JlYWQxNihETUE5X0NPTkZJRykKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUE5X0NPTkZJRyh2YWwpCQliZmluX3dyaXRlMTYoRE1BOV9DT05GSUcsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTlfTkVYVF9ERVNDX1BUUigpCQliZmluX3JlYWQzMihETUE5X05FWFRfREVTQ19QVFIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BOV9ORVhUX0RFU0NfUFRSKHZhbCkJYmZpbl93cml0ZTMyKERNQTlfTkVYVF9ERVNDX1BUUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BOV9TVEFSVF9BRERSKCkJCWJmaW5fcmVhZDMyKERNQTlfU1RBUlRfQUREUikKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUE5X1NUQVJUX0FERFIodmFsKQkJYmZpbl93cml0ZTMyKERNQTlfU1RBUlRfQUREUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BOV9YX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTlfWF9DT1VOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUE5X1hfQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KERNQTlfWF9DT1VOVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BOV9ZX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTlfWV9DT1VOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUE5X1lfQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KERNQTlfWV9DT1VOVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BOV9YX01PRElGWSgpCQliZmluX3JlYWQxNihETUE5X1hfTU9ESUZZKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTlfWF9NT0RJRlkodmFsKQkJYmZpbl93cml0ZTE2KERNQTlfWF9NT0RJRlksIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTlfWV9NT0RJRlkoKQkJYmZpbl9yZWFkMTYoRE1BOV9ZX01PRElGWSkKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUE5X1lfTU9ESUZZKHZhbCkJCWJmaW5fd3JpdGUxNihETUE5X1lfTU9ESUZZLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUE5X0NVUlJfREVTQ19QVFIoKQkJYmZpbl9yZWFkMzIoRE1BOV9DVVJSX0RFU0NfUFRSKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTlfQ1VSUl9ERVNDX1BUUih2YWwpCWJmaW5fd3JpdGUzMihETUE5X0NVUlJfREVTQ19QVFIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTlfQ1VSUl9BRERSKCkJCWJmaW5fcmVhZDMyKERNQTlfQ1VSUl9BRERSKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTlfQ1VSUl9BRERSKHZhbCkJCWJmaW5fd3JpdGUzMihETUE5X0NVUlJfQUREUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BOV9DVVJSX1hfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BOV9DVVJSX1hfQ09VTlQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BOV9DVVJSX1hfQ09VTlQodmFsKQliZmluX3dyaXRlMTYoRE1BOV9DVVJSX1hfQ09VTlQsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTlfQ1VSUl9ZX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTlfQ1VSUl9ZX0NPVU5UKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTlfQ1VSUl9ZX0NPVU5UKHZhbCkJYmZpbl93cml0ZTE2KERNQTlfQ1VSUl9ZX0NPVU5ULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUE5X0lSUV9TVEFUVVMoKQkJYmZpbl9yZWFkMTYoRE1BOV9JUlFfU1RBVFVTKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTlfSVJRX1NUQVRVUyh2YWwpCQliZmluX3dyaXRlMTYoRE1BOV9JUlFfU1RBVFVTLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUE5X1BFUklQSEVSQUxfTUFQKCkJCWJmaW5fcmVhZDE2KERNQTlfUEVSSVBIRVJBTF9NQVApCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BOV9QRVJJUEhFUkFMX01BUCh2YWwpCWJmaW5fd3JpdGUxNihETUE5X1BFUklQSEVSQUxfTUFQLCB2YWwpCi0KLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTEwX0NPTkZJRygpCQliZmluX3JlYWQxNihETUExMF9DT05GSUcpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTBfQ09ORklHKHZhbCkJCWJmaW5fd3JpdGUxNihETUExMF9DT05GSUcsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTEwX05FWFRfREVTQ19QVFIoKQkJYmZpbl9yZWFkMzIoRE1BMTBfTkVYVF9ERVNDX1BUUikKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUExMF9ORVhUX0RFU0NfUFRSKHZhbCkJYmZpbl93cml0ZTMyKERNQTEwX05FWFRfREVTQ19QVFIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTEwX1NUQVJUX0FERFIoKQkJYmZpbl9yZWFkMzIoRE1BMTBfU1RBUlRfQUREUikKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUExMF9TVEFSVF9BRERSKHZhbCkJYmZpbl93cml0ZTMyKERNQTEwX1NUQVJUX0FERFIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTEwX1hfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BMTBfWF9DT1VOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUExMF9YX0NPVU5UKHZhbCkJCWJmaW5fd3JpdGUxNihETUExMF9YX0NPVU5ULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUExMF9ZX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTEwX1lfQ09VTlQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTBfWV9DT1VOVCh2YWwpCQliZmluX3dyaXRlMTYoRE1BMTBfWV9DT1VOVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BMTBfWF9NT0RJRlkoKQkJYmZpbl9yZWFkMTYoRE1BMTBfWF9NT0RJRlkpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTBfWF9NT0RJRlkodmFsKQkJYmZpbl93cml0ZTE2KERNQTEwX1hfTU9ESUZZLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUExMF9ZX01PRElGWSgpCQliZmluX3JlYWQxNihETUExMF9ZX01PRElGWSkKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUExMF9ZX01PRElGWSh2YWwpCQliZmluX3dyaXRlMTYoRE1BMTBfWV9NT0RJRlksIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTEwX0NVUlJfREVTQ19QVFIoKQkJYmZpbl9yZWFkMzIoRE1BMTBfQ1VSUl9ERVNDX1BUUikKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUExMF9DVVJSX0RFU0NfUFRSKHZhbCkJYmZpbl93cml0ZTMyKERNQTEwX0NVUlJfREVTQ19QVFIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTEwX0NVUlJfQUREUigpCQliZmluX3JlYWQzMihETUExMF9DVVJSX0FERFIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTBfQ1VSUl9BRERSKHZhbCkJCWJmaW5fd3JpdGUzMihETUExMF9DVVJSX0FERFIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTEwX0NVUlJfWF9DT1VOVCgpCQliZmluX3JlYWQxNihETUExMF9DVVJSX1hfQ09VTlQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTBfQ1VSUl9YX0NPVU5UKHZhbCkJYmZpbl93cml0ZTE2KERNQTEwX0NVUlJfWF9DT1VOVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BMTBfQ1VSUl9ZX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTEwX0NVUlJfWV9DT1VOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUExMF9DVVJSX1lfQ09VTlQodmFsKQliZmluX3dyaXRlMTYoRE1BMTBfQ1VSUl9ZX0NPVU5ULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUExMF9JUlFfU1RBVFVTKCkJCWJmaW5fcmVhZDE2KERNQTEwX0lSUV9TVEFUVVMpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTBfSVJRX1NUQVRVUyh2YWwpCWJmaW5fd3JpdGUxNihETUExMF9JUlFfU1RBVFVTLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUExMF9QRVJJUEhFUkFMX01BUCgpCWJmaW5fcmVhZDE2KERNQTEwX1BFUklQSEVSQUxfTUFQKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTEwX1BFUklQSEVSQUxfTUFQKHZhbCkJYmZpbl93cml0ZTE2KERNQTEwX1BFUklQSEVSQUxfTUFQLCB2YWwpCi0KLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTExX0NPTkZJRygpCQliZmluX3JlYWQxNihETUExMV9DT05GSUcpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTFfQ09ORklHKHZhbCkJCWJmaW5fd3JpdGUxNihETUExMV9DT05GSUcsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTExX05FWFRfREVTQ19QVFIoKQkJYmZpbl9yZWFkMzIoRE1BMTFfTkVYVF9ERVNDX1BUUikKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUExMV9ORVhUX0RFU0NfUFRSKHZhbCkJYmZpbl93cml0ZTMyKERNQTExX05FWFRfREVTQ19QVFIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTExX1NUQVJUX0FERFIoKQkJYmZpbl9yZWFkMzIoRE1BMTFfU1RBUlRfQUREUikKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUExMV9TVEFSVF9BRERSKHZhbCkJYmZpbl93cml0ZTMyKERNQTExX1NUQVJUX0FERFIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTExX1hfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BMTFfWF9DT1VOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUExMV9YX0NPVU5UKHZhbCkJCWJmaW5fd3JpdGUxNihETUExMV9YX0NPVU5ULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUExMV9ZX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTExX1lfQ09VTlQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTFfWV9DT1VOVCh2YWwpCQliZmluX3dyaXRlMTYoRE1BMTFfWV9DT1VOVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BMTFfWF9NT0RJRlkoKQkJYmZpbl9yZWFkMTYoRE1BMTFfWF9NT0RJRlkpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTFfWF9NT0RJRlkodmFsKQkJYmZpbl93cml0ZTE2KERNQTExX1hfTU9ESUZZLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUExMV9ZX01PRElGWSgpCQliZmluX3JlYWQxNihETUExMV9ZX01PRElGWSkKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUExMV9ZX01PRElGWSh2YWwpCQliZmluX3dyaXRlMTYoRE1BMTFfWV9NT0RJRlksIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTExX0NVUlJfREVTQ19QVFIoKQkJYmZpbl9yZWFkMzIoRE1BMTFfQ1VSUl9ERVNDX1BUUikKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUExMV9DVVJSX0RFU0NfUFRSKHZhbCkJYmZpbl93cml0ZTMyKERNQTExX0NVUlJfREVTQ19QVFIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTExX0NVUlJfQUREUigpCQliZmluX3JlYWQzMihETUExMV9DVVJSX0FERFIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTFfQ1VSUl9BRERSKHZhbCkJCWJmaW5fd3JpdGUzMihETUExMV9DVVJSX0FERFIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTExX0NVUlJfWF9DT1VOVCgpCQliZmluX3JlYWQxNihETUExMV9DVVJSX1hfQ09VTlQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTFfQ1VSUl9YX0NPVU5UKHZhbCkJYmZpbl93cml0ZTE2KERNQTExX0NVUlJfWF9DT1VOVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BMTFfQ1VSUl9ZX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTExX0NVUlJfWV9DT1VOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUExMV9DVVJSX1lfQ09VTlQodmFsKQliZmluX3dyaXRlMTYoRE1BMTFfQ1VSUl9ZX0NPVU5ULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUExMV9JUlFfU1RBVFVTKCkJCWJmaW5fcmVhZDE2KERNQTExX0lSUV9TVEFUVVMpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTFfSVJRX1NUQVRVUyh2YWwpCWJmaW5fd3JpdGUxNihETUExMV9JUlFfU1RBVFVTLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUExMV9QRVJJUEhFUkFMX01BUCgpCWJmaW5fcmVhZDE2KERNQTExX1BFUklQSEVSQUxfTUFQKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTExX1BFUklQSEVSQUxfTUFQKHZhbCkJYmZpbl93cml0ZTE2KERNQTExX1BFUklQSEVSQUxfTUFQLCB2YWwpCi0KLSNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDBfQ09ORklHKCkJCWJmaW5fcmVhZDE2KE1ETUFfRDBfQ09ORklHKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDBfQ09ORklHKHZhbCkJCWJmaW5fd3JpdGUxNihNRE1BX0QwX0NPTkZJRywgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMF9ORVhUX0RFU0NfUFRSKCkJYmZpbl9yZWFkMzIoTURNQV9EMF9ORVhUX0RFU0NfUFRSKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDBfTkVYVF9ERVNDX1BUUih2YWwpCWJmaW5fd3JpdGUzMihNRE1BX0QwX05FWFRfREVTQ19QVFIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDBfU1RBUlRfQUREUigpCQliZmluX3JlYWQzMihNRE1BX0QwX1NUQVJUX0FERFIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMF9TVEFSVF9BRERSKHZhbCkJYmZpbl93cml0ZTMyKE1ETUFfRDBfU1RBUlRfQUREUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMF9YX0NPVU5UKCkJCWJmaW5fcmVhZDE2KE1ETUFfRDBfWF9DT1VOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QwX1hfQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KE1ETUFfRDBfWF9DT1VOVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMF9ZX0NPVU5UKCkJCWJmaW5fcmVhZDE2KE1ETUFfRDBfWV9DT1VOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QwX1lfQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KE1ETUFfRDBfWV9DT1VOVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMF9YX01PRElGWSgpCQliZmluX3JlYWQxNihNRE1BX0QwX1hfTU9ESUZZKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDBfWF9NT0RJRlkodmFsKQliZmluX3dyaXRlMTYoTURNQV9EMF9YX01PRElGWSwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMF9ZX01PRElGWSgpCQliZmluX3JlYWQxNihNRE1BX0QwX1lfTU9ESUZZKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDBfWV9NT0RJRlkodmFsKQliZmluX3dyaXRlMTYoTURNQV9EMF9ZX01PRElGWSwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMF9DVVJSX0RFU0NfUFRSKCkJYmZpbl9yZWFkMzIoTURNQV9EMF9DVVJSX0RFU0NfUFRSKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDBfQ1VSUl9ERVNDX1BUUih2YWwpCWJmaW5fd3JpdGUzMihNRE1BX0QwX0NVUlJfREVTQ19QVFIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDBfQ1VSUl9BRERSKCkJCWJmaW5fcmVhZDMyKE1ETUFfRDBfQ1VSUl9BRERSKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDBfQ1VSUl9BRERSKHZhbCkJYmZpbl93cml0ZTMyKE1ETUFfRDBfQ1VSUl9BRERSLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QwX0NVUlJfWF9DT1VOVCgpCWJmaW5fcmVhZDE2KE1ETUFfRDBfQ1VSUl9YX0NPVU5UKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDBfQ1VSUl9YX0NPVU5UKHZhbCkJYmZpbl93cml0ZTE2KE1ETUFfRDBfQ1VSUl9YX0NPVU5ULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QwX0NVUlJfWV9DT1VOVCgpCWJmaW5fcmVhZDE2KE1ETUFfRDBfQ1VSUl9ZX0NPVU5UKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDBfQ1VSUl9ZX0NPVU5UKHZhbCkJYmZpbl93cml0ZTE2KE1ETUFfRDBfQ1VSUl9ZX0NPVU5ULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QwX0lSUV9TVEFUVVMoKQkJYmZpbl9yZWFkMTYoTURNQV9EMF9JUlFfU1RBVFVTKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDBfSVJRX1NUQVRVUyh2YWwpCWJmaW5fd3JpdGUxNihNRE1BX0QwX0lSUV9TVEFUVVMsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDBfUEVSSVBIRVJBTF9NQVAoKQliZmluX3JlYWQxNihNRE1BX0QwX1BFUklQSEVSQUxfTUFQKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDBfUEVSSVBIRVJBTF9NQVAodmFsKQliZmluX3dyaXRlMTYoTURNQV9EMF9QRVJJUEhFUkFMX01BUCwgdmFsKQotCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MwX0NPTkZJRygpCQliZmluX3JlYWQxNihNRE1BX1MwX0NPTkZJRykKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MwX0NPTkZJRyh2YWwpCQliZmluX3dyaXRlMTYoTURNQV9TMF9DT05GSUcsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzBfTkVYVF9ERVNDX1BUUigpCWJmaW5fcmVhZDMyKE1ETUFfUzBfTkVYVF9ERVNDX1BUUikKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MwX05FWFRfREVTQ19QVFIodmFsKQliZmluX3dyaXRlMzIoTURNQV9TMF9ORVhUX0RFU0NfUFRSLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MwX1NUQVJUX0FERFIoKQkJYmZpbl9yZWFkMzIoTURNQV9TMF9TVEFSVF9BRERSKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzBfU1RBUlRfQUREUih2YWwpCWJmaW5fd3JpdGUzMihNRE1BX1MwX1NUQVJUX0FERFIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzBfWF9DT1VOVCgpCQliZmluX3JlYWQxNihNRE1BX1MwX1hfQ09VTlQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMF9YX0NPVU5UKHZhbCkJCWJmaW5fd3JpdGUxNihNRE1BX1MwX1hfQ09VTlQsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzBfWV9DT1VOVCgpCQliZmluX3JlYWQxNihNRE1BX1MwX1lfQ09VTlQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMF9ZX0NPVU5UKHZhbCkJCWJmaW5fd3JpdGUxNihNRE1BX1MwX1lfQ09VTlQsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzBfWF9NT0RJRlkoKQkJYmZpbl9yZWFkMTYoTURNQV9TMF9YX01PRElGWSkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MwX1hfTU9ESUZZKHZhbCkJYmZpbl93cml0ZTE2KE1ETUFfUzBfWF9NT0RJRlksIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzBfWV9NT0RJRlkoKQkJYmZpbl9yZWFkMTYoTURNQV9TMF9ZX01PRElGWSkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MwX1lfTU9ESUZZKHZhbCkJYmZpbl93cml0ZTE2KE1ETUFfUzBfWV9NT0RJRlksIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzBfQ1VSUl9ERVNDX1BUUigpCWJmaW5fcmVhZDMyKE1ETUFfUzBfQ1VSUl9ERVNDX1BUUikKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MwX0NVUlJfREVTQ19QVFIodmFsKQliZmluX3dyaXRlMzIoTURNQV9TMF9DVVJSX0RFU0NfUFRSLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MwX0NVUlJfQUREUigpCQliZmluX3JlYWQzMihNRE1BX1MwX0NVUlJfQUREUikKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MwX0NVUlJfQUREUih2YWwpCWJmaW5fd3JpdGUzMihNRE1BX1MwX0NVUlJfQUREUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMF9DVVJSX1hfQ09VTlQoKQliZmluX3JlYWQxNihNRE1BX1MwX0NVUlJfWF9DT1VOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MwX0NVUlJfWF9DT1VOVCh2YWwpCWJmaW5fd3JpdGUxNihNRE1BX1MwX0NVUlJfWF9DT1VOVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMF9DVVJSX1lfQ09VTlQoKQliZmluX3JlYWQxNihNRE1BX1MwX0NVUlJfWV9DT1VOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MwX0NVUlJfWV9DT1VOVCh2YWwpCWJmaW5fd3JpdGUxNihNRE1BX1MwX0NVUlJfWV9DT1VOVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMF9JUlFfU1RBVFVTKCkJCWJmaW5fcmVhZDE2KE1ETUFfUzBfSVJRX1NUQVRVUykKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MwX0lSUV9TVEFUVVModmFsKQliZmluX3dyaXRlMTYoTURNQV9TMF9JUlFfU1RBVFVTLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MwX1BFUklQSEVSQUxfTUFQKCkJYmZpbl9yZWFkMTYoTURNQV9TMF9QRVJJUEhFUkFMX01BUCkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MwX1BFUklQSEVSQUxfTUFQKHZhbCkJYmZpbl93cml0ZTE2KE1ETUFfUzBfUEVSSVBIRVJBTF9NQVAsIHZhbCkKLQotI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMV9DT05GSUcoKQkJYmZpbl9yZWFkMTYoTURNQV9EMV9DT05GSUcpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMV9DT05GSUcodmFsKQkJYmZpbl93cml0ZTE2KE1ETUFfRDFfQ09ORklHLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QxX05FWFRfREVTQ19QVFIoKQliZmluX3JlYWQzMihNRE1BX0QxX05FWFRfREVTQ19QVFIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMV9ORVhUX0RFU0NfUFRSKHZhbCkJYmZpbl93cml0ZTMyKE1ETUFfRDFfTkVYVF9ERVNDX1BUUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMV9TVEFSVF9BRERSKCkJCWJmaW5fcmVhZDMyKE1ETUFfRDFfU1RBUlRfQUREUikKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QxX1NUQVJUX0FERFIodmFsKQliZmluX3dyaXRlMzIoTURNQV9EMV9TVEFSVF9BRERSLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QxX1hfQ09VTlQoKQkJYmZpbl9yZWFkMTYoTURNQV9EMV9YX0NPVU5UKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDFfWF9DT1VOVCh2YWwpCQliZmluX3dyaXRlMTYoTURNQV9EMV9YX0NPVU5ULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QxX1lfQ09VTlQoKQkJYmZpbl9yZWFkMTYoTURNQV9EMV9ZX0NPVU5UKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDFfWV9DT1VOVCh2YWwpCQliZmluX3dyaXRlMTYoTURNQV9EMV9ZX0NPVU5ULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QxX1hfTU9ESUZZKCkJCWJmaW5fcmVhZDE2KE1ETUFfRDFfWF9NT0RJRlkpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMV9YX01PRElGWSh2YWwpCWJmaW5fd3JpdGUxNihNRE1BX0QxX1hfTU9ESUZZLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QxX1lfTU9ESUZZKCkJCWJmaW5fcmVhZDE2KE1ETUFfRDFfWV9NT0RJRlkpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMV9ZX01PRElGWSh2YWwpCWJmaW5fd3JpdGUxNihNRE1BX0QxX1lfTU9ESUZZLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QxX0NVUlJfREVTQ19QVFIoKQliZmluX3JlYWQzMihNRE1BX0QxX0NVUlJfREVTQ19QVFIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMV9DVVJSX0RFU0NfUFRSKHZhbCkJYmZpbl93cml0ZTMyKE1ETUFfRDFfQ1VSUl9ERVNDX1BUUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMV9DVVJSX0FERFIoKQkJYmZpbl9yZWFkMzIoTURNQV9EMV9DVVJSX0FERFIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMV9DVVJSX0FERFIodmFsKQliZmluX3dyaXRlMzIoTURNQV9EMV9DVVJSX0FERFIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDFfQ1VSUl9YX0NPVU5UKCkJYmZpbl9yZWFkMTYoTURNQV9EMV9DVVJSX1hfQ09VTlQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMV9DVVJSX1hfQ09VTlQodmFsKQliZmluX3dyaXRlMTYoTURNQV9EMV9DVVJSX1hfQ09VTlQsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDFfQ1VSUl9ZX0NPVU5UKCkJYmZpbl9yZWFkMTYoTURNQV9EMV9DVVJSX1lfQ09VTlQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMV9DVVJSX1lfQ09VTlQodmFsKQliZmluX3dyaXRlMTYoTURNQV9EMV9DVVJSX1lfQ09VTlQsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDFfSVJRX1NUQVRVUygpCQliZmluX3JlYWQxNihNRE1BX0QxX0lSUV9TVEFUVVMpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMV9JUlFfU1RBVFVTKHZhbCkJYmZpbl93cml0ZTE2KE1ETUFfRDFfSVJRX1NUQVRVUywgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMV9QRVJJUEhFUkFMX01BUCgpCWJmaW5fcmVhZDE2KE1ETUFfRDFfUEVSSVBIRVJBTF9NQVApCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMV9QRVJJUEhFUkFMX01BUCh2YWwpCWJmaW5fd3JpdGUxNihNRE1BX0QxX1BFUklQSEVSQUxfTUFQLCB2YWwpCi0KLSNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzFfQ09ORklHKCkJCWJmaW5fcmVhZDE2KE1ETUFfUzFfQ09ORklHKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzFfQ09ORklHKHZhbCkJCWJmaW5fd3JpdGUxNihNRE1BX1MxX0NPTkZJRywgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMV9ORVhUX0RFU0NfUFRSKCkJYmZpbl9yZWFkMzIoTURNQV9TMV9ORVhUX0RFU0NfUFRSKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzFfTkVYVF9ERVNDX1BUUih2YWwpCWJmaW5fd3JpdGUzMihNRE1BX1MxX05FWFRfREVTQ19QVFIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzFfU1RBUlRfQUREUigpCQliZmluX3JlYWQzMihNRE1BX1MxX1NUQVJUX0FERFIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMV9TVEFSVF9BRERSKHZhbCkJYmZpbl93cml0ZTMyKE1ETUFfUzFfU1RBUlRfQUREUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMV9YX0NPVU5UKCkJCWJmaW5fcmVhZDE2KE1ETUFfUzFfWF9DT1VOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MxX1hfQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KE1ETUFfUzFfWF9DT1VOVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMV9ZX0NPVU5UKCkJCWJmaW5fcmVhZDE2KE1ETUFfUzFfWV9DT1VOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MxX1lfQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KE1ETUFfUzFfWV9DT1VOVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMV9YX01PRElGWSgpCQliZmluX3JlYWQxNihNRE1BX1MxX1hfTU9ESUZZKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzFfWF9NT0RJRlkodmFsKQliZmluX3dyaXRlMTYoTURNQV9TMV9YX01PRElGWSwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMV9ZX01PRElGWSgpCQliZmluX3JlYWQxNihNRE1BX1MxX1lfTU9ESUZZKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzFfWV9NT0RJRlkodmFsKQliZmluX3dyaXRlMTYoTURNQV9TMV9ZX01PRElGWSwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMV9DVVJSX0RFU0NfUFRSKCkJYmZpbl9yZWFkMzIoTURNQV9TMV9DVVJSX0RFU0NfUFRSKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzFfQ1VSUl9ERVNDX1BUUih2YWwpCWJmaW5fd3JpdGUzMihNRE1BX1MxX0NVUlJfREVTQ19QVFIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzFfQ1VSUl9BRERSKCkJCWJmaW5fcmVhZDMyKE1ETUFfUzFfQ1VSUl9BRERSKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzFfQ1VSUl9BRERSKHZhbCkJYmZpbl93cml0ZTMyKE1ETUFfUzFfQ1VSUl9BRERSLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MxX0NVUlJfWF9DT1VOVCgpCWJmaW5fcmVhZDE2KE1ETUFfUzFfQ1VSUl9YX0NPVU5UKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzFfQ1VSUl9YX0NPVU5UKHZhbCkJYmZpbl93cml0ZTE2KE1ETUFfUzFfQ1VSUl9YX0NPVU5ULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MxX0NVUlJfWV9DT1VOVCgpCWJmaW5fcmVhZDE2KE1ETUFfUzFfQ1VSUl9ZX0NPVU5UKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzFfQ1VSUl9ZX0NPVU5UKHZhbCkJYmZpbl93cml0ZTE2KE1ETUFfUzFfQ1VSUl9ZX0NPVU5ULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MxX0lSUV9TVEFUVVMoKQkJYmZpbl9yZWFkMTYoTURNQV9TMV9JUlFfU1RBVFVTKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzFfSVJRX1NUQVRVUyh2YWwpCWJmaW5fd3JpdGUxNihNRE1BX1MxX0lSUV9TVEFUVVMsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzFfUEVSSVBIRVJBTF9NQVAoKQliZmluX3JlYWQxNihNRE1BX1MxX1BFUklQSEVSQUxfTUFQKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzFfUEVSSVBIRVJBTF9NQVAodmFsKQliZmluX3dyaXRlMTYoTURNQV9TMV9QRVJJUEhFUkFMX01BUCwgdmFsKQotCi0KLS8qIFBhcmFsbGVsIFBlcmlwaGVyYWwgSW50ZXJmYWNlICgweEZGQzAxMDAwIC0gMHhGRkMwMTBGRikJCQkJCQkJKi8KLSNkZWZpbmUgYmZpbl9yZWFkX1BQSV9DT05UUk9MKCkJCQliZmluX3JlYWQxNihQUElfQ09OVFJPTCkKLSNkZWZpbmUgYmZpbl93cml0ZV9QUElfQ09OVFJPTCh2YWwpCQliZmluX3dyaXRlMTYoUFBJX0NPTlRST0wsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1BQSV9TVEFUVVMoKQkJCWJmaW5fcmVhZDE2KFBQSV9TVEFUVVMpCi0jZGVmaW5lIGJmaW5fd3JpdGVfUFBJX1NUQVRVUyh2YWwpCQliZmluX3dyaXRlMTYoUFBJX1NUQVRVUywgdmFsKQotI2RlZmluZSBiZmluX2NsZWFyX1BQSV9TVEFUVVMoKQkJCWJmaW5fd3JpdGVfUFBJX1NUQVRVUygweEZGRkYpCi0jZGVmaW5lIGJmaW5fcmVhZF9QUElfREVMQVkoKQkJCWJmaW5fcmVhZDE2KFBQSV9ERUxBWSkKLSNkZWZpbmUgYmZpbl93cml0ZV9QUElfREVMQVkodmFsKQkJYmZpbl93cml0ZTE2KFBQSV9ERUxBWSwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfUFBJX0NPVU5UKCkJCQliZmluX3JlYWQxNihQUElfQ09VTlQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfUFBJX0NPVU5UKHZhbCkJCWJmaW5fd3JpdGUxNihQUElfQ09VTlQsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1BQSV9GUkFNRSgpCQkJYmZpbl9yZWFkMTYoUFBJX0ZSQU1FKQotI2RlZmluZSBiZmluX3dyaXRlX1BQSV9GUkFNRSh2YWwpCQliZmluX3dyaXRlMTYoUFBJX0ZSQU1FLCB2YWwpCi0KLQotLyogVHdvLVdpcmUgSW50ZXJmYWNlCQkoMHhGRkMwMTQwMCAtIDB4RkZDMDE0RkYpCQkJCQkJCQkqLwotCi0vKiBHZW5lcmFsIFB1cnBvc2UgSS9PIFBvcnQgRyAoMHhGRkMwMTUwMCAtIDB4RkZDMDE1RkYpCQkJCQkJCQkqLwotI2RlZmluZSBiZmluX3JlYWRfUE9SVEdJTygpCQkJYmZpbl9yZWFkMTYoUE9SVEdJTykKLSNkZWZpbmUgYmZpbl93cml0ZV9QT1JUR0lPKHZhbCkJCQliZmluX3dyaXRlMTYoUE9SVEdJTywgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfUE9SVEdJT19DTEVBUigpCQliZmluX3JlYWQxNihQT1JUR0lPX0NMRUFSKQotI2RlZmluZSBiZmluX3dyaXRlX1BPUlRHSU9fQ0xFQVIodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRHSU9fQ0xFQVIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1BPUlRHSU9fU0VUKCkJCQliZmluX3JlYWQxNihQT1JUR0lPX1NFVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9QT1JUR0lPX1NFVCh2YWwpCQliZmluX3dyaXRlMTYoUE9SVEdJT19TRVQsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1BPUlRHSU9fVE9HR0xFKCkJCWJmaW5fcmVhZDE2KFBPUlRHSU9fVE9HR0xFKQotI2RlZmluZSBiZmluX3dyaXRlX1BPUlRHSU9fVE9HR0xFKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JUR0lPX1RPR0dMRSwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfUE9SVEdJT19NQVNLQSgpCQliZmluX3JlYWQxNihQT1JUR0lPX01BU0tBKQotI2RlZmluZSBiZmluX3dyaXRlX1BPUlRHSU9fTUFTS0EodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRHSU9fTUFTS0EsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1BPUlRHSU9fTUFTS0FfQ0xFQVIoKQkJYmZpbl9yZWFkMTYoUE9SVEdJT19NQVNLQV9DTEVBUikKLSNkZWZpbmUgYmZpbl93cml0ZV9QT1JUR0lPX01BU0tBX0NMRUFSKHZhbCkJYmZpbl93cml0ZTE2KFBPUlRHSU9fTUFTS0FfQ0xFQVIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1BPUlRHSU9fTUFTS0FfU0VUKCkJCWJmaW5fcmVhZDE2KFBPUlRHSU9fTUFTS0FfU0VUKQotI2RlZmluZSBiZmluX3dyaXRlX1BPUlRHSU9fTUFTS0FfU0VUKHZhbCkJYmZpbl93cml0ZTE2KFBPUlRHSU9fTUFTS0FfU0VULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9QT1JUR0lPX01BU0tBX1RPR0dMRSgpCWJmaW5fcmVhZDE2KFBPUlRHSU9fTUFTS0FfVE9HR0xFKQotI2RlZmluZSBiZmluX3dyaXRlX1BPUlRHSU9fTUFTS0FfVE9HR0xFKHZhbCkJYmZpbl93cml0ZTE2KFBPUlRHSU9fTUFTS0FfVE9HR0xFLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9QT1JUR0lPX01BU0tCKCkJCWJmaW5fcmVhZDE2KFBPUlRHSU9fTUFTS0IpCi0jZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEdJT19NQVNLQih2YWwpCQliZmluX3dyaXRlMTYoUE9SVEdJT19NQVNLQiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfUE9SVEdJT19NQVNLQl9DTEVBUigpCQliZmluX3JlYWQxNihQT1JUR0lPX01BU0tCX0NMRUFSKQotI2RlZmluZSBiZmluX3dyaXRlX1BPUlRHSU9fTUFTS0JfQ0xFQVIodmFsKQliZmluX3dyaXRlMTYoUE9SVEdJT19NQVNLQl9DTEVBUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfUE9SVEdJT19NQVNLQl9TRVQoKQkJYmZpbl9yZWFkMTYoUE9SVEdJT19NQVNLQl9TRVQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEdJT19NQVNLQl9TRVQodmFsKQliZmluX3dyaXRlMTYoUE9SVEdJT19NQVNLQl9TRVQsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1BPUlRHSU9fTUFTS0JfVE9HR0xFKCkJYmZpbl9yZWFkMTYoUE9SVEdJT19NQVNLQl9UT0dHTEUpCi0jZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEdJT19NQVNLQl9UT0dHTEUodmFsKQliZmluX3dyaXRlMTYoUE9SVEdJT19NQVNLQl9UT0dHTEUsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1BPUlRHSU9fRElSKCkJCQliZmluX3JlYWQxNihQT1JUR0lPX0RJUikKLSNkZWZpbmUgYmZpbl93cml0ZV9QT1JUR0lPX0RJUih2YWwpCQliZmluX3dyaXRlMTYoUE9SVEdJT19ESVIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1BPUlRHSU9fUE9MQVIoKQkJYmZpbl9yZWFkMTYoUE9SVEdJT19QT0xBUikKLSNkZWZpbmUgYmZpbl93cml0ZV9QT1JUR0lPX1BPTEFSKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JUR0lPX1BPTEFSLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9QT1JUR0lPX0VER0UoKQkJYmZpbl9yZWFkMTYoUE9SVEdJT19FREdFKQotI2RlZmluZSBiZmluX3dyaXRlX1BPUlRHSU9fRURHRSh2YWwpCQliZmluX3dyaXRlMTYoUE9SVEdJT19FREdFLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9QT1JUR0lPX0JPVEgoKQkJYmZpbl9yZWFkMTYoUE9SVEdJT19CT1RIKQotI2RlZmluZSBiZmluX3dyaXRlX1BPUlRHSU9fQk9USCh2YWwpCQliZmluX3dyaXRlMTYoUE9SVEdJT19CT1RILCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9QT1JUR0lPX0lORU4oKQkJYmZpbl9yZWFkMTYoUE9SVEdJT19JTkVOKQotI2RlZmluZSBiZmluX3dyaXRlX1BPUlRHSU9fSU5FTih2YWwpCQliZmluX3dyaXRlMTYoUE9SVEdJT19JTkVOLCB2YWwpCi0KLQotLyogR2VuZXJhbCBQdXJwb3NlIEkvTyBQb3J0IEggKDB4RkZDMDE3MDAgLSAweEZGQzAxN0ZGKQkJCQkJCQkJKi8KLSNkZWZpbmUgYmZpbl9yZWFkX1BPUlRISU8oKQkJCWJmaW5fcmVhZDE2KFBPUlRISU8pCi0jZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEhJTyh2YWwpCQkJYmZpbl93cml0ZTE2KFBPUlRISU8sIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1BPUlRISU9fQ0xFQVIoKQkJYmZpbl9yZWFkMTYoUE9SVEhJT19DTEVBUikKLSNkZWZpbmUgYmZpbl93cml0ZV9QT1JUSElPX0NMRUFSKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JUSElPX0NMRUFSLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9QT1JUSElPX1NFVCgpCQkJYmZpbl9yZWFkMTYoUE9SVEhJT19TRVQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEhJT19TRVQodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRISU9fU0VULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9QT1JUSElPX1RPR0dMRSgpCQliZmluX3JlYWQxNihQT1JUSElPX1RPR0dMRSkKLSNkZWZpbmUgYmZpbl93cml0ZV9QT1JUSElPX1RPR0dMRSh2YWwpCQliZmluX3dyaXRlMTYoUE9SVEhJT19UT0dHTEUsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1BPUlRISU9fTUFTS0EoKQkJYmZpbl9yZWFkMTYoUE9SVEhJT19NQVNLQSkKLSNkZWZpbmUgYmZpbl93cml0ZV9QT1JUSElPX01BU0tBKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JUSElPX01BU0tBLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9QT1JUSElPX01BU0tBX0NMRUFSKCkJCWJmaW5fcmVhZDE2KFBPUlRISU9fTUFTS0FfQ0xFQVIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEhJT19NQVNLQV9DTEVBUih2YWwpCWJmaW5fd3JpdGUxNihQT1JUSElPX01BU0tBX0NMRUFSLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9QT1JUSElPX01BU0tBX1NFVCgpCQliZmluX3JlYWQxNihQT1JUSElPX01BU0tBX1NFVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9QT1JUSElPX01BU0tBX1NFVCh2YWwpCWJmaW5fd3JpdGUxNihQT1JUSElPX01BU0tBX1NFVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfUE9SVEhJT19NQVNLQV9UT0dHTEUoKQliZmluX3JlYWQxNihQT1JUSElPX01BU0tBX1RPR0dMRSkKLSNkZWZpbmUgYmZpbl93cml0ZV9QT1JUSElPX01BU0tBX1RPR0dMRSh2YWwpCWJmaW5fd3JpdGUxNihQT1JUSElPX01BU0tBX1RPR0dMRSwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfUE9SVEhJT19NQVNLQigpCQliZmluX3JlYWQxNihQT1JUSElPX01BU0tCKQotI2RlZmluZSBiZmluX3dyaXRlX1BPUlRISU9fTUFTS0IodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRISU9fTUFTS0IsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1BPUlRISU9fTUFTS0JfQ0xFQVIoKQkJYmZpbl9yZWFkMTYoUE9SVEhJT19NQVNLQl9DTEVBUikKLSNkZWZpbmUgYmZpbl93cml0ZV9QT1JUSElPX01BU0tCX0NMRUFSKHZhbCkJYmZpbl93cml0ZTE2KFBPUlRISU9fTUFTS0JfQ0xFQVIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1BPUlRISU9fTUFTS0JfU0VUKCkJCWJmaW5fcmVhZDE2KFBPUlRISU9fTUFTS0JfU0VUKQotI2RlZmluZSBiZmluX3dyaXRlX1BPUlRISU9fTUFTS0JfU0VUKHZhbCkJYmZpbl93cml0ZTE2KFBPUlRISU9fTUFTS0JfU0VULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9QT1JUSElPX01BU0tCX1RPR0dMRSgpCWJmaW5fcmVhZDE2KFBPUlRISU9fTUFTS0JfVE9HR0xFKQotI2RlZmluZSBiZmluX3dyaXRlX1BPUlRISU9fTUFTS0JfVE9HR0xFKHZhbCkJYmZpbl93cml0ZTE2KFBPUlRISU9fTUFTS0JfVE9HR0xFLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9QT1JUSElPX0RJUigpCQkJYmZpbl9yZWFkMTYoUE9SVEhJT19ESVIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEhJT19ESVIodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRISU9fRElSLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9QT1JUSElPX1BPTEFSKCkJCWJmaW5fcmVhZDE2KFBPUlRISU9fUE9MQVIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEhJT19QT0xBUih2YWwpCQliZmluX3dyaXRlMTYoUE9SVEhJT19QT0xBUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfUE9SVEhJT19FREdFKCkJCWJmaW5fcmVhZDE2KFBPUlRISU9fRURHRSkKLSNkZWZpbmUgYmZpbl93cml0ZV9QT1JUSElPX0VER0UodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRISU9fRURHRSwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfUE9SVEhJT19CT1RIKCkJCWJmaW5fcmVhZDE2KFBPUlRISU9fQk9USCkKLSNkZWZpbmUgYmZpbl93cml0ZV9QT1JUSElPX0JPVEgodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRISU9fQk9USCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfUE9SVEhJT19JTkVOKCkJCWJmaW5fcmVhZDE2KFBPUlRISU9fSU5FTikKLSNkZWZpbmUgYmZpbl93cml0ZV9QT1JUSElPX0lORU4odmFsKQkJYmZpbl93cml0ZTE2KFBPUlRISU9fSU5FTiwgdmFsKQotCi0KLS8qIFVBUlQxIENvbnRyb2xsZXIJCSgweEZGQzAyMDAwIC0gMHhGRkMwMjBGRikJCQkJCQkJCSovCi0jZGVmaW5lIGJmaW5fcmVhZF9VQVJUMV9USFIoKQkJCWJmaW5fcmVhZDE2KFVBUlQxX1RIUikKLSNkZWZpbmUgYmZpbl93cml0ZV9VQVJUMV9USFIodmFsKQkJYmZpbl93cml0ZTE2KFVBUlQxX1RIUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfVUFSVDFfUkJSKCkJCQliZmluX3JlYWQxNihVQVJUMV9SQlIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfVUFSVDFfUkJSKHZhbCkJCWJmaW5fd3JpdGUxNihVQVJUMV9SQlIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1VBUlQxX0RMTCgpCQkJYmZpbl9yZWFkMTYoVUFSVDFfRExMKQotI2RlZmluZSBiZmluX3dyaXRlX1VBUlQxX0RMTCh2YWwpCQliZmluX3dyaXRlMTYoVUFSVDFfRExMLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9VQVJUMV9JRVIoKQkJCWJmaW5fcmVhZDE2KFVBUlQxX0lFUikKLSNkZWZpbmUgYmZpbl93cml0ZV9VQVJUMV9JRVIodmFsKQkJYmZpbl93cml0ZTE2KFVBUlQxX0lFUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfVUFSVDFfRExIKCkJCQliZmluX3JlYWQxNihVQVJUMV9ETEgpCi0jZGVmaW5lIGJmaW5fd3JpdGVfVUFSVDFfRExIKHZhbCkJCWJmaW5fd3JpdGUxNihVQVJUMV9ETEgsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1VBUlQxX0lJUigpCQkJYmZpbl9yZWFkMTYoVUFSVDFfSUlSKQotI2RlZmluZSBiZmluX3dyaXRlX1VBUlQxX0lJUih2YWwpCQliZmluX3dyaXRlMTYoVUFSVDFfSUlSLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9VQVJUMV9MQ1IoKQkJCWJmaW5fcmVhZDE2KFVBUlQxX0xDUikKLSNkZWZpbmUgYmZpbl93cml0ZV9VQVJUMV9MQ1IodmFsKQkJYmZpbl93cml0ZTE2KFVBUlQxX0xDUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfVUFSVDFfTUNSKCkJCQliZmluX3JlYWQxNihVQVJUMV9NQ1IpCi0jZGVmaW5lIGJmaW5fd3JpdGVfVUFSVDFfTUNSKHZhbCkJCWJmaW5fd3JpdGUxNihVQVJUMV9NQ1IsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1VBUlQxX0xTUigpCQkJYmZpbl9yZWFkMTYoVUFSVDFfTFNSKQotI2RlZmluZSBiZmluX3dyaXRlX1VBUlQxX0xTUih2YWwpCQliZmluX3dyaXRlMTYoVUFSVDFfTFNSLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9VQVJUMV9NU1IoKQkJCWJmaW5fcmVhZDE2KFVBUlQxX01TUikKLSNkZWZpbmUgYmZpbl93cml0ZV9VQVJUMV9NU1IodmFsKQkJYmZpbl93cml0ZTE2KFVBUlQxX01TUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfVUFSVDFfU0NSKCkJCQliZmluX3JlYWQxNihVQVJUMV9TQ1IpCi0jZGVmaW5lIGJmaW5fd3JpdGVfVUFSVDFfU0NSKHZhbCkJCWJmaW5fd3JpdGUxNihVQVJUMV9TQ1IsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1VBUlQxX0dDVEwoKQkJCWJmaW5fcmVhZDE2KFVBUlQxX0dDVEwpCi0jZGVmaW5lIGJmaW5fd3JpdGVfVUFSVDFfR0NUTCh2YWwpCQliZmluX3dyaXRlMTYoVUFSVDFfR0NUTCwgdmFsKQotCi0vKiBPbWl0IENBTiByZWdpc3RlciBzZXRzIGZyb20gdGhlIGNkZWZCRjUzNC5oIChDQU4gaXMgbm90IGluIHRoZSBBRFNQLUJGNTF4IHByb2Nlc3NvcikgKi8KLQotLyogUGluIENvbnRyb2wgUmVnaXN0ZXJzCSgweEZGQzAzMjAwIC0gMHhGRkMwMzJGRikJCQkJCQkJCSovCi0jZGVmaW5lIGJmaW5fcmVhZF9QT1JURl9GRVIoKQkJCWJmaW5fcmVhZDE2KFBPUlRGX0ZFUikKLSNkZWZpbmUgYmZpbl93cml0ZV9QT1JURl9GRVIodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRGX0ZFUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfUE9SVEdfRkVSKCkJCQliZmluX3JlYWQxNihQT1JUR19GRVIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEdfRkVSKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JUR19GRVIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1BPUlRIX0ZFUigpCQkJYmZpbl9yZWFkMTYoUE9SVEhfRkVSKQotI2RlZmluZSBiZmluX3dyaXRlX1BPUlRIX0ZFUih2YWwpCQliZmluX3dyaXRlMTYoUE9SVEhfRkVSLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9QT1JUX01VWCgpCQkJYmZpbl9yZWFkMTYoUE9SVF9NVVgpCi0jZGVmaW5lIGJmaW5fd3JpdGVfUE9SVF9NVVgodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRfTVVYLCB2YWwpCi0KLQotLyogSGFuZHNoYWtlIE1ETUEgUmVnaXN0ZXJzCSgweEZGQzAzMzAwIC0gMHhGRkMwMzNGRikJCQkJCQkJCSovCi0jZGVmaW5lIGJmaW5fcmVhZF9ITURNQTBfQ09OVFJPTCgpCQliZmluX3JlYWQxNihITURNQTBfQ09OVFJPTCkKLSNkZWZpbmUgYmZpbl93cml0ZV9ITURNQTBfQ09OVFJPTCh2YWwpCQliZmluX3dyaXRlMTYoSE1ETUEwX0NPTlRST0wsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0hNRE1BMF9FQ0lOSVQoKQkJYmZpbl9yZWFkMTYoSE1ETUEwX0VDSU5JVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9ITURNQTBfRUNJTklUKHZhbCkJCWJmaW5fd3JpdGUxNihITURNQTBfRUNJTklULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ITURNQTBfQkNJTklUKCkJCWJmaW5fcmVhZDE2KEhNRE1BMF9CQ0lOSVQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfSE1ETUEwX0JDSU5JVCh2YWwpCQliZmluX3dyaXRlMTYoSE1ETUEwX0JDSU5JVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfSE1ETUEwX0VDVVJHRU5UKCkJCWJmaW5fcmVhZDE2KEhNRE1BMF9FQ1VSR0VOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9ITURNQTBfRUNVUkdFTlQodmFsKQkJYmZpbl93cml0ZTE2KEhNRE1BMF9FQ1VSR0VOVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfSE1ETUEwX0VDT1ZFUkZMT1coKQkJYmZpbl9yZWFkMTYoSE1ETUEwX0VDT1ZFUkZMT1cpCi0jZGVmaW5lIGJmaW5fd3JpdGVfSE1ETUEwX0VDT1ZFUkZMT1codmFsKQliZmluX3dyaXRlMTYoSE1ETUEwX0VDT1ZFUkZMT1csIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0hNRE1BMF9FQ09VTlQoKQkJYmZpbl9yZWFkMTYoSE1ETUEwX0VDT1VOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9ITURNQTBfRUNPVU5UKHZhbCkJCWJmaW5fd3JpdGUxNihITURNQTBfRUNPVU5ULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ITURNQTBfQkNPVU5UKCkJCWJmaW5fcmVhZDE2KEhNRE1BMF9CQ09VTlQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfSE1ETUEwX0JDT1VOVCh2YWwpCQliZmluX3dyaXRlMTYoSE1ETUEwX0JDT1VOVCwgdmFsKQotCi0jZGVmaW5lIGJmaW5fcmVhZF9ITURNQTFfQ09OVFJPTCgpCQliZmluX3JlYWQxNihITURNQTFfQ09OVFJPTCkKLSNkZWZpbmUgYmZpbl93cml0ZV9ITURNQTFfQ09OVFJPTCh2YWwpCQliZmluX3dyaXRlMTYoSE1ETUExX0NPTlRST0wsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0hNRE1BMV9FQ0lOSVQoKQkJYmZpbl9yZWFkMTYoSE1ETUExX0VDSU5JVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9ITURNQTFfRUNJTklUKHZhbCkJCWJmaW5fd3JpdGUxNihITURNQTFfRUNJTklULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ITURNQTFfQkNJTklUKCkJCWJmaW5fcmVhZDE2KEhNRE1BMV9CQ0lOSVQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfSE1ETUExX0JDSU5JVCh2YWwpCQliZmluX3dyaXRlMTYoSE1ETUExX0JDSU5JVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfSE1ETUExX0VDVVJHRU5UKCkJCWJmaW5fcmVhZDE2KEhNRE1BMV9FQ1VSR0VOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9ITURNQTFfRUNVUkdFTlQodmFsKQkJYmZpbl93cml0ZTE2KEhNRE1BMV9FQ1VSR0VOVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfSE1ETUExX0VDT1ZFUkZMT1coKQkJYmZpbl9yZWFkMTYoSE1ETUExX0VDT1ZFUkZMT1cpCi0jZGVmaW5lIGJmaW5fd3JpdGVfSE1ETUExX0VDT1ZFUkZMT1codmFsKQliZmluX3dyaXRlMTYoSE1ETUExX0VDT1ZFUkZMT1csIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0hNRE1BMV9FQ09VTlQoKQkJYmZpbl9yZWFkMTYoSE1ETUExX0VDT1VOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9ITURNQTFfRUNPVU5UKHZhbCkJCWJmaW5fd3JpdGUxNihITURNQTFfRUNPVU5ULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ITURNQTFfQkNPVU5UKCkJCWJmaW5fcmVhZDE2KEhNRE1BMV9CQ09VTlQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfSE1ETUExX0JDT1VOVCh2YWwpCQliZmluX3dyaXRlMTYoSE1ETUExX0JDT1VOVCwgdmFsKQotCi0vKiA9PT09IGVuZCBmcm9tIGNkZWZCRjUzNC5oID09PT0gKi8KLQotLyogR1BJTyBQSU4gbXV4ICgweEZGQzAzMjEwIC0gT3hGRkMwMzI4OCkgKi8KLQotI2RlZmluZSBiZmluX3JlYWRfUE9SVEZfTVVYKCkJCQliZmluX3JlYWQxNihQT1JURl9NVVgpCi0jZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEZfTVVYKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JURl9NVVgsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1BPUlRHX01VWCgpCQkJYmZpbl9yZWFkMTYoUE9SVEdfTVVYKQotI2RlZmluZSBiZmluX3dyaXRlX1BPUlRHX01VWCh2YWwpCQliZmluX3dyaXRlMTYoUE9SVEdfTVVYLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9QT1JUSF9NVVgoKQkJCWJmaW5fcmVhZDE2KFBPUlRIX01VWCkKLSNkZWZpbmUgYmZpbl93cml0ZV9QT1JUSF9NVVgodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRIX01VWCwgdmFsKQotCi0jZGVmaW5lIGJmaW5fcmVhZF9QT1JURl9EUklWRSgpCQkJYmZpbl9yZWFkMTYoUE9SVEZfRFJJVkUpCi0jZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEZfRFJJVkUodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRGX0RSSVZFLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9QT1JUR19EUklWRSgpCQkJYmZpbl9yZWFkMTYoUE9SVEdfRFJJVkUpCi0jZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEdfRFJJVkUodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRHX0RSSVZFLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9QT1JUSF9EUklWRSgpCQkJYmZpbl9yZWFkMTYoUE9SVEhfRFJJVkUpCi0jZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEhfRFJJVkUodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRIX0RSSVZFLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9QT1JURl9TTEVXKCkJCQliZmluX3JlYWQxNihQT1JURl9TTEVXKQotI2RlZmluZSBiZmluX3dyaXRlX1BPUlRGX1NMRVcodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRGX1NMRVcsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1BPUlRHX1NMRVcoKQkJCWJmaW5fcmVhZDE2KFBPUlRHX1NMRVcpCi0jZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEdfU0xFVyh2YWwpCQliZmluX3dyaXRlMTYoUE9SVEdfU0xFVywgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfUE9SVEhfU0xFVygpCQkJYmZpbl9yZWFkMTYoUE9SVEhfU0xFVykKLSNkZWZpbmUgYmZpbl93cml0ZV9QT1JUSF9TTEVXKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JUSF9TTEVXLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9QT1JURl9IWVNURVJJU0lTKCkJCWJmaW5fcmVhZDE2KFBPUlRGX0hZU1RFUklTSVMpCi0jZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEZfSFlTVEVSSVNJUyh2YWwpCWJmaW5fd3JpdGUxNihQT1JURl9IWVNURVJJU0lTLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9QT1JUR19IWVNURVJJU0lTKCkJCWJmaW5fcmVhZDE2KFBPUlRHX0hZU1RFUklTSVMpCi0jZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEdfSFlTVEVSSVNJUyh2YWwpCWJmaW5fd3JpdGUxNihQT1JUR19IWVNURVJJU0lTLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9QT1JUSF9IWVNURVJJU0lTKCkJCWJmaW5fcmVhZDE2KFBPUlRIX0hZU1RFUklTSVMpCi0jZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEhfSFlTVEVSSVNJUyh2YWwpCWJmaW5fd3JpdGUxNihQT1JUSF9IWVNURVJJU0lTLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NSVNDUE9SVF9EUklWRSgpCQliZmluX3JlYWQxNihNSVNDUE9SVF9EUklWRSkKLSNkZWZpbmUgYmZpbl93cml0ZV9NSVNDUE9SVF9EUklWRSh2YWwpCQliZmluX3dyaXRlMTYoTUlTQ1BPUlRfRFJJVkUsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01JU0NQT1JUX1NMRVcoKQkJYmZpbl9yZWFkMTYoTUlTQ1BPUlRfU0xFVykKLSNkZWZpbmUgYmZpbl93cml0ZV9NSVNDUE9SVF9TTEVXKHZhbCkJCWJmaW5fd3JpdGUxNihNSVNDUE9SVF9TTEVXLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NSVNDUE9SVF9IWVNURVJJU0lTKCkJCWJmaW5fcmVhZDE2KE1JU0NQT1JUX0hZU1RFUklTSVMpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTUlTQ1BPUlRfSFlTVEVSSVNJUyh2YWwpCWJmaW5fd3JpdGUxNihNSVNDUE9SVF9IWVNURVJJU0lTLCB2YWwpCi0KLS8qIEhPU1QgUG9ydCBSZWdpc3RlcnMgKi8KLQotI2RlZmluZSBiZmluX3JlYWRfSE9TVF9DT05UUk9MKCkJCWJmaW5fcmVhZDE2KEhPU1RfQ09OVFJPTCkKLSNkZWZpbmUgYmZpbl93cml0ZV9IT1NUX0NPTlRST0wodmFsKQkJYmZpbl93cml0ZTE2KEhPU1RfQ09OVFJPTCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfSE9TVF9TVEFUVVMoKQkJCWJmaW5fcmVhZDE2KEhPU1RfU1RBVFVTKQotI2RlZmluZSBiZmluX3dyaXRlX0hPU1RfU1RBVFVTKHZhbCkJCWJmaW5fd3JpdGUxNihIT1NUX1NUQVRVUywgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfSE9TVF9USU1FT1VUKCkJCWJmaW5fcmVhZDE2KEhPU1RfVElNRU9VVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9IT1NUX1RJTUVPVVQodmFsKQkJYmZpbl93cml0ZTE2KEhPU1RfVElNRU9VVCwgdmFsKQotCi0vKiBDb3VudGVyIFJlZ2lzdGVycyAqLwotCi0jZGVmaW5lIGJmaW5fcmVhZF9DTlRfQ09ORklHKCkJCQliZmluX3JlYWQxNihDTlRfQ09ORklHKQotI2RlZmluZSBiZmluX3dyaXRlX0NOVF9DT05GSUcodmFsKQkJYmZpbl93cml0ZTE2KENOVF9DT05GSUcsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0NOVF9JTUFTSygpCQkJYmZpbl9yZWFkMTYoQ05UX0lNQVNLKQotI2RlZmluZSBiZmluX3dyaXRlX0NOVF9JTUFTSyh2YWwpCQliZmluX3dyaXRlMTYoQ05UX0lNQVNLLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9DTlRfU1RBVFVTKCkJCQliZmluX3JlYWQxNihDTlRfU1RBVFVTKQotI2RlZmluZSBiZmluX3dyaXRlX0NOVF9TVEFUVVModmFsKQkJYmZpbl93cml0ZTE2KENOVF9TVEFUVVMsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0NOVF9DT01NQU5EKCkJCQliZmluX3JlYWQxNihDTlRfQ09NTUFORCkKLSNkZWZpbmUgYmZpbl93cml0ZV9DTlRfQ09NTUFORCh2YWwpCQliZmluX3dyaXRlMTYoQ05UX0NPTU1BTkQsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0NOVF9ERUJPVU5DRSgpCQliZmluX3JlYWQxNihDTlRfREVCT1VOQ0UpCi0jZGVmaW5lIGJmaW5fd3JpdGVfQ05UX0RFQk9VTkNFKHZhbCkJCWJmaW5fd3JpdGUxNihDTlRfREVCT1VOQ0UsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0NOVF9DT1VOVEVSKCkJCQliZmluX3JlYWQzMihDTlRfQ09VTlRFUikKLSNkZWZpbmUgYmZpbl93cml0ZV9DTlRfQ09VTlRFUih2YWwpCQliZmluX3dyaXRlMzIoQ05UX0NPVU5URVIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0NOVF9NQVgoKQkJCWJmaW5fcmVhZDMyKENOVF9NQVgpCi0jZGVmaW5lIGJmaW5fd3JpdGVfQ05UX01BWCh2YWwpCQkJYmZpbl93cml0ZTMyKENOVF9NQVgsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0NOVF9NSU4oKQkJCWJmaW5fcmVhZDMyKENOVF9NSU4pCi0jZGVmaW5lIGJmaW5fd3JpdGVfQ05UX01JTih2YWwpCQkJYmZpbl93cml0ZTMyKENOVF9NSU4sIHZhbCkKLQotLyogU2VjdXJpdHkgUmVnaXN0ZXJzICovCi0KLSNkZWZpbmUgYmZpbl9yZWFkX1NFQ1VSRV9TWVNTV1QoKQkJYmZpbl9yZWFkMzIoU0VDVVJFX1NZU1NXVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9TRUNVUkVfU1lTU1dUKHZhbCkJCWJmaW5fd3JpdGUzMihTRUNVUkVfU1lTU1dULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9TRUNVUkVfQ09OVFJPTCgpCQliZmluX3JlYWQxNihTRUNVUkVfQ09OVFJPTCkKLSNkZWZpbmUgYmZpbl93cml0ZV9TRUNVUkVfQ09OVFJPTCh2YWwpCQliZmluX3dyaXRlMTYoU0VDVVJFX0NPTlRST0wsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1NFQ1VSRV9TVEFUVVMoKQkJYmZpbl9yZWFkMTYoU0VDVVJFX1NUQVRVUykKLSNkZWZpbmUgYmZpbl93cml0ZV9TRUNVUkVfU1RBVFVTKHZhbCkJCWJmaW5fd3JpdGUxNihTRUNVUkVfU1RBVFVTLCB2YWwpCi0KLS8qIFRoZXNlIG5lZWQgdG8gYmUgbGFzdCBkdWUgdG8gdGhlIGNkZWYvbGludXggaW50ZXItZGVwZW5kZW5jaWVzICovCi0jaW5jbHVkZSA8YXNtL2lycS5oPgotCi0jZW5kaWYgLyogX0NERUZfQkY1MlhfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2luY2x1ZGUvbWFjaC9kZWZCRjUxMi5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2luY2x1ZGUvbWFjaC9kZWZCRjUxMi5oCmluZGV4IDliNTA1YmIuLjI3Mjg1ODIgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9pbmNsdWRlL21hY2gvZGVmQkY1MTIuaAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvaW5jbHVkZS9tYWNoL2RlZkJGNTEyLmgKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDggQW5hbG9nIERldmljZXMgSW5jLgorICogQ29weXJpZ2h0IDIwMDgtMjAxMCBBbmFsb2cgRGV2aWNlcyBJbmMuCiAgKgogICogTGljZW5zZWQgdW5kZXIgdGhlIEFESSBCU0QgbGljZW5zZSBvciB0aGUgR1BMLTIgKG9yIGxhdGVyKQogICovCkBAIC03LDEyICs3LDEzODggQEAKICNpZm5kZWYgX0RFRl9CRjUxMl9ICiAjZGVmaW5lIF9ERUZfQkY1MTJfSAogCi0vKiBJbmNsdWRlIGFsbCBDb3JlIHJlZ2lzdGVycyBhbmQgYml0IGRlZmluaXRpb25zICovCi0jaW5jbHVkZSA8YXNtL2RlZl9MUEJsYWNrZmluLmg+CisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogICBTWVNURU0gJiBNTVIgQUREUkVTUyBERUZJTklUSU9OUyBDT01NT04gVE8gQUxMIEFEU1AtQkY1MXggICAgKi8KKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCiAKLS8qIFNZU1RFTSAmIE1NUiBBRERSRVNTIERFRklOSVRJT05TIEZPUiBBRFNQLUJGNTEyICovCisvKiBDbG9jayBhbmQgU3lzdGVtIENvbnRyb2wJKDB4RkZDMDAwMDAgLSAweEZGQzAwMEZGKQkJCQkJCQkJKi8KKyNkZWZpbmUgUExMX0NUTAkJCQkweEZGQzAwMDAwCS8qIFBMTCBDb250cm9sIFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgUExMX0RJVgkJCQkweEZGQzAwMDA0CS8qIFBMTCBEaXZpZGUgUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBWUl9DVEwJCQkJMHhGRkMwMDAwOAkvKiBWb2x0YWdlIFJlZ3VsYXRvciBDb250cm9sIFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIFBMTF9TVEFUCQkJMHhGRkMwMDAwQwkvKiBQTEwgU3RhdHVzIFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgUExMX0xPQ0tDTlQJCQkweEZGQzAwMDEwCS8qIFBMTCBMb2NrIENvdW50IFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBDSElQSUQJCQkJMHhGRkMwMDAxNAkvKiBEZXZpY2UgSUQgUmVnaXN0ZXIgKi8KIAotLyogSW5jbHVkZSBkZWZCRjUxeF9iYXNlLmggZm9yIHRoZSBzZXQgb2YgI2RlZmluZXMgdGhhdCBhcmUgY29tbW9uIHRvIGFsbCBBRFNQLUJGNTF4IHByb2Nlc3NvcnMgKi8KLSNpbmNsdWRlICJkZWZCRjUxeF9iYXNlLmgiCisvKiBTeXN0ZW0gSW50ZXJydXB0IENvbnRyb2xsZXIgKDB4RkZDMDAxMDAgLSAweEZGQzAwMUZGKQkJCQkJCQkJKi8KKyNkZWZpbmUgU1dSU1QJCQkJMHhGRkMwMDEwMAkvKiBTb2Z0d2FyZSBSZXNldCBSZWdpc3RlcgkJCQkJKi8KKyNkZWZpbmUgU1lTQ1IJCQkJMHhGRkMwMDEwNAkvKiBTeXN0ZW0gQ29uZmlndXJhdGlvbiBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBTSUNfUlZFQ1QJCQkweEZGQzAwMTA4CS8qIEludGVycnVwdCBSZXNldCBWZWN0b3IgQWRkcmVzcyBSZWdpc3RlcgkJCSovCisKKyNkZWZpbmUgU0lDX0lNQVNLMAkJCTB4RkZDMDAxMEMJLyogSW50ZXJydXB0IE1hc2sgUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIFNJQ19JQVIwCQkJMHhGRkMwMDExMAkvKiBJbnRlcnJ1cHQgQXNzaWdubWVudCBSZWdpc3RlciAwCQkJCSovCisjZGVmaW5lIFNJQ19JQVIxCQkJMHhGRkMwMDExNAkvKiBJbnRlcnJ1cHQgQXNzaWdubWVudCBSZWdpc3RlciAxCQkJCSovCisjZGVmaW5lIFNJQ19JQVIyCQkJMHhGRkMwMDExOAkvKiBJbnRlcnJ1cHQgQXNzaWdubWVudCBSZWdpc3RlciAyCQkJCSovCisjZGVmaW5lIFNJQ19JQVIzCQkJMHhGRkMwMDExQwkvKiBJbnRlcnJ1cHQgQXNzaWdubWVudCBSZWdpc3RlciAzCQkJCSovCisjZGVmaW5lIFNJQ19JU1IwCQkJMHhGRkMwMDEyMAkvKiBJbnRlcnJ1cHQgU3RhdHVzIFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBTSUNfSVdSMAkJCTB4RkZDMDAxMjQJLyogSW50ZXJydXB0IFdha2V1cCBSZWdpc3RlcgkJCQkJKi8KKworLyogU0lDIEFkZGl0aW9ucyB0byBBRFNQLUJGNTF4ICgweEZGQzAwMTRDIC0gMHhGRkMwMDE2MikgKi8KKyNkZWZpbmUgU0lDX0lNQVNLMSAgICAgICAgICAgICAgICAgICAgICAweEZGQzAwMTRDICAgICAvKiBJbnRlcnJ1cHQgTWFzayByZWdpc3RlciBvZiBTSUMyICovCisjZGVmaW5lIFNJQ19JQVI0ICAgICAgICAgICAgICAgICAgICAgICAgMHhGRkMwMDE1MCAgICAgLyogSW50ZXJydXB0IEFzc2lnbm1lbnQgcmVnaXN0ZXI0ICovCisjZGVmaW5lIFNJQ19JQVI1ICAgICAgICAgICAgICAgICAgICAgICAgMHhGRkMwMDE1NCAgICAgLyogSW50ZXJydXB0IEFzc2lnbm1lbnQgcmVnaXN0ZXI1ICovCisjZGVmaW5lIFNJQ19JQVI2ICAgICAgICAgICAgICAgICAgICAgICAgMHhGRkMwMDE1OCAgICAgLyogSW50ZXJydXB0IEFzc2lnbm1lbnQgcmVnaXN0ZXI2ICovCisjZGVmaW5lIFNJQ19JQVI3ICAgICAgICAgICAgICAgICAgICAgICAgMHhGRkMwMDE1QyAgICAgLyogSW50ZXJydXB0IEFzc2lnbm1lbnQgcmVnaXN0ZXI3ICovCisjZGVmaW5lIFNJQ19JU1IxICAgICAgICAgICAgICAgICAgICAgICAgMHhGRkMwMDE2MCAgICAgLyogSW50ZXJydXB0IFN0YXR1ciByZWdpc3RlciAqLworI2RlZmluZSBTSUNfSVdSMSAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZDMDAxNjQgICAgIC8qIEludGVycnVwdCBXYWtldXAgcmVnaXN0ZXIgKi8KKworCisvKiBXYXRjaGRvZyBUaW1lcgkJCSgweEZGQzAwMjAwIC0gMHhGRkMwMDJGRikJCQkJCQkJCSovCisjZGVmaW5lIFdET0dfQ1RMCQkJMHhGRkMwMDIwMAkvKiBXYXRjaGRvZyBDb250cm9sIFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIFdET0dfQ05UCQkJMHhGRkMwMDIwNAkvKiBXYXRjaGRvZyBDb3VudCBSZWdpc3RlcgkJCQkJKi8KKyNkZWZpbmUgV0RPR19TVEFUCQkJMHhGRkMwMDIwOAkvKiBXYXRjaGRvZyBTdGF0dXMgUmVnaXN0ZXIJCQkJCSovCisKKworLyogUmVhbCBUaW1lIENsb2NrCQkoMHhGRkMwMDMwMCAtIDB4RkZDMDAzRkYpCQkJCQkJCQkJKi8KKyNkZWZpbmUgUlRDX1NUQVQJCQkweEZGQzAwMzAwCS8qIFJUQyBTdGF0dXMgUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBSVENfSUNUTAkJCTB4RkZDMDAzMDQJLyogUlRDIEludGVycnVwdCBDb250cm9sIFJlZ2lzdGVyCQkJKi8KKyNkZWZpbmUgUlRDX0lTVEFUCQkJMHhGRkMwMDMwOAkvKiBSVEMgSW50ZXJydXB0IFN0YXR1cyBSZWdpc3RlcgkJCSovCisjZGVmaW5lIFJUQ19TV0NOVAkJCTB4RkZDMDAzMEMJLyogUlRDIFN0b3B3YXRjaCBDb3VudCBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBSVENfQUxBUk0JCQkweEZGQzAwMzEwCS8qIFJUQyBBbGFybSBUaW1lIFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBSVENfRkFTVAkJCTB4RkZDMDAzMTQJLyogUlRDIFByZXNjYWxlciBFbmFibGUgUmVnaXN0ZXIJCQkqLworI2RlZmluZSBSVENfUFJFTgkJCTB4RkZDMDAzMTQJLyogUlRDIFByZXNjYWxlciBFbmFibGUgQWx0ZXJuYXRlIE1hY3JvCQkqLworCisKKy8qIFVBUlQwIENvbnRyb2xsZXIJCSgweEZGQzAwNDAwIC0gMHhGRkMwMDRGRikJCQkJCQkJCQkqLworI2RlZmluZSBVQVJUMF9USFIJCQkweEZGQzAwNDAwCS8qIFRyYW5zbWl0IEhvbGRpbmcgcmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgVUFSVDBfUkJSCQkJMHhGRkMwMDQwMAkvKiBSZWNlaXZlIEJ1ZmZlciByZWdpc3RlcgkJCQkJKi8KKyNkZWZpbmUgVUFSVDBfRExMCQkJMHhGRkMwMDQwMAkvKiBEaXZpc29yIExhdGNoIChMb3ctQnl0ZSkJCQkJCSovCisjZGVmaW5lIFVBUlQwX0lFUgkJCTB4RkZDMDA0MDQJLyogSW50ZXJydXB0IEVuYWJsZSBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBVQVJUMF9ETEgJCQkweEZGQzAwNDA0CS8qIERpdmlzb3IgTGF0Y2ggKEhpZ2gtQnl0ZSkJCQkJKi8KKyNkZWZpbmUgVUFSVDBfSUlSCQkJMHhGRkMwMDQwOAkvKiBJbnRlcnJ1cHQgSWRlbnRpZmljYXRpb24gUmVnaXN0ZXIJCSovCisjZGVmaW5lIFVBUlQwX0xDUgkJCTB4RkZDMDA0MEMJLyogTGluZSBDb250cm9sIFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBVQVJUMF9NQ1IJCQkweEZGQzAwNDEwCS8qIE1vZGVtIENvbnRyb2wgUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIFVBUlQwX0xTUgkJCTB4RkZDMDA0MTQJLyogTGluZSBTdGF0dXMgUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBVQVJUMF9NU1IJCQkweEZGQzAwNDE4CS8qIE1vZGVtIFN0YXR1cyBSZWdpc3RlcgkJCQkJKi8KKyNkZWZpbmUgVUFSVDBfU0NSCQkJMHhGRkMwMDQxQwkvKiBTQ1IgU2NyYXRjaCBSZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIFVBUlQwX0dDVEwJCQkweEZGQzAwNDI0CS8qIEdsb2JhbCBDb250cm9sIFJlZ2lzdGVyCQkJCQkqLworCisvKiBTUEkwIENvbnRyb2xsZXIJCQkoMHhGRkMwMDUwMCAtIDB4RkZDMDA1RkYpCQkJCQkJCSovCisjZGVmaW5lIFNQSTBfUkVHQkFTRQkJCTB4RkZDMDA1MDAKKyNkZWZpbmUgU1BJMF9DVEwJCQkweEZGQzAwNTAwCS8qIFNQSSBDb250cm9sIFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgU1BJMF9GTEcJCQkweEZGQzAwNTA0CS8qIFNQSSBGbGFnIHJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgU1BJMF9TVEFUCQkJMHhGRkMwMDUwOAkvKiBTUEkgU3RhdHVzIHJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgU1BJMF9UREJSCQkJMHhGRkMwMDUwQwkvKiBTUEkgVHJhbnNtaXQgRGF0YSBCdWZmZXIgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgU1BJMF9SREJSCQkJMHhGRkMwMDUxMAkvKiBTUEkgUmVjZWl2ZSBEYXRhIEJ1ZmZlciBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBTUEkwX0JBVUQJCQkweEZGQzAwNTE0CS8qIFNQSSBCYXVkIHJhdGUgUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIFNQSTBfU0hBRE9XCQkJMHhGRkMwMDUxOAkvKiBTUElfUkRCUiBTaGFkb3cgUmVnaXN0ZXIJCQkJCSovCisKKy8qIFNQSTEgQ29udHJvbGxlcgkJCSgweEZGQzAzNDAwIC0gMHhGRkMwMzRGRikJCQkJCQkJKi8KKyNkZWZpbmUgU1BJMV9SRUdCQVNFCQkJMHhGRkMwMzQwMAorI2RlZmluZSBTUEkxX0NUTAkJCTB4RkZDMDM0MDAJLyogU1BJIENvbnRyb2wgUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBTUEkxX0ZMRwkJCTB4RkZDMDM0MDQJLyogU1BJIEZsYWcgcmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBTUEkxX1NUQVQJCQkweEZGQzAzNDA4CS8qIFNQSSBTdGF0dXMgcmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBTUEkxX1REQlIJCQkweEZGQzAzNDBDCS8qIFNQSSBUcmFuc21pdCBEYXRhIEJ1ZmZlciBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBTUEkxX1JEQlIJCQkweEZGQzAzNDEwCS8qIFNQSSBSZWNlaXZlIERhdGEgQnVmZmVyIFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIFNQSTFfQkFVRAkJCTB4RkZDMDM0MTQJLyogU1BJIEJhdWQgcmF0ZSBSZWdpc3RlcgkJCQkJKi8KKyNkZWZpbmUgU1BJMV9TSEFET1cJCQkweEZGQzAzNDE4CS8qIFNQSV9SREJSIFNoYWRvdyBSZWdpc3RlcgkJCQkJKi8KKworLyogVElNRVIwLTcgUmVnaXN0ZXJzCQkoMHhGRkMwMDYwMCAtIDB4RkZDMDA2RkYpCQkJCQkJCQkqLworI2RlZmluZSBUSU1FUjBfQ09ORklHCQkweEZGQzAwNjAwCS8qIFRpbWVyIDAgQ29uZmlndXJhdGlvbiBSZWdpc3RlcgkJCSovCisjZGVmaW5lIFRJTUVSMF9DT1VOVEVSCQkweEZGQzAwNjA0CS8qIFRpbWVyIDAgQ291bnRlciBSZWdpc3RlcgkJCQkJKi8KKyNkZWZpbmUgVElNRVIwX1BFUklPRAkJMHhGRkMwMDYwOAkvKiBUaW1lciAwIFBlcmlvZCBSZWdpc3RlcgkJCQkJKi8KKyNkZWZpbmUgVElNRVIwX1dJRFRICQkweEZGQzAwNjBDCS8qIFRpbWVyIDAgV2lkdGggUmVnaXN0ZXIJCQkJCSovCisKKyNkZWZpbmUgVElNRVIxX0NPTkZJRwkJMHhGRkMwMDYxMAkvKiBUaW1lciAxIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgIAkJCSovCisjZGVmaW5lIFRJTUVSMV9DT1VOVEVSCQkweEZGQzAwNjE0CS8qIFRpbWVyIDEgQ291bnRlciBSZWdpc3RlciAgICAgICAgCQkJKi8KKyNkZWZpbmUgVElNRVIxX1BFUklPRAkJMHhGRkMwMDYxOAkvKiBUaW1lciAxIFBlcmlvZCBSZWdpc3RlciAgICAgICAgIAkJCSovCisjZGVmaW5lIFRJTUVSMV9XSURUSAkJMHhGRkMwMDYxQwkvKiBUaW1lciAxIFdpZHRoIFJlZ2lzdGVyICAgICAgICAgIAkJCSovCisKKyNkZWZpbmUgVElNRVIyX0NPTkZJRwkJMHhGRkMwMDYyMAkvKiBUaW1lciAyIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgIAkJCSovCisjZGVmaW5lIFRJTUVSMl9DT1VOVEVSCQkweEZGQzAwNjI0CS8qIFRpbWVyIDIgQ291bnRlciBSZWdpc3RlciAgICAgICAgCQkJKi8KKyNkZWZpbmUgVElNRVIyX1BFUklPRAkJMHhGRkMwMDYyOAkvKiBUaW1lciAyIFBlcmlvZCBSZWdpc3RlciAgICAgICAgIAkJCSovCisjZGVmaW5lIFRJTUVSMl9XSURUSAkJMHhGRkMwMDYyQwkvKiBUaW1lciAyIFdpZHRoIFJlZ2lzdGVyICAgICAgICAgIAkJCSovCisKKyNkZWZpbmUgVElNRVIzX0NPTkZJRwkJMHhGRkMwMDYzMAkvKiBUaW1lciAzIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIJCQkqLworI2RlZmluZSBUSU1FUjNfQ09VTlRFUgkJMHhGRkMwMDYzNAkvKiBUaW1lciAzIENvdW50ZXIgUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIFRJTUVSM19QRVJJT0QJCTB4RkZDMDA2MzgJLyogVGltZXIgMyBQZXJpb2QgUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIFRJTUVSM19XSURUSAkJMHhGRkMwMDYzQwkvKiBUaW1lciAzIFdpZHRoIFJlZ2lzdGVyCQkJCQkqLworCisjZGVmaW5lIFRJTUVSNF9DT05GSUcJCTB4RkZDMDA2NDAJLyogVGltZXIgNCBDb25maWd1cmF0aW9uIFJlZ2lzdGVyICAJCQkqLworI2RlZmluZSBUSU1FUjRfQ09VTlRFUgkJMHhGRkMwMDY0NAkvKiBUaW1lciA0IENvdW50ZXIgUmVnaXN0ZXIgICAgICAgIAkJCSovCisjZGVmaW5lIFRJTUVSNF9QRVJJT0QJCTB4RkZDMDA2NDgJLyogVGltZXIgNCBQZXJpb2QgUmVnaXN0ZXIgICAgICAgICAJCQkqLworI2RlZmluZSBUSU1FUjRfV0lEVEgJCTB4RkZDMDA2NEMJLyogVGltZXIgNCBXaWR0aCBSZWdpc3RlciAgICAgICAgICAJCQkqLworCisjZGVmaW5lIFRJTUVSNV9DT05GSUcJCTB4RkZDMDA2NTAJLyogVGltZXIgNSBDb25maWd1cmF0aW9uIFJlZ2lzdGVyICAJCQkqLworI2RlZmluZSBUSU1FUjVfQ09VTlRFUgkJMHhGRkMwMDY1NAkvKiBUaW1lciA1IENvdW50ZXIgUmVnaXN0ZXIgICAgICAgIAkJCSovCisjZGVmaW5lIFRJTUVSNV9QRVJJT0QJCTB4RkZDMDA2NTgJLyogVGltZXIgNSBQZXJpb2QgUmVnaXN0ZXIgICAgICAgICAJCQkqLworI2RlZmluZSBUSU1FUjVfV0lEVEgJCTB4RkZDMDA2NUMJLyogVGltZXIgNSBXaWR0aCBSZWdpc3RlciAgICAgICAgICAJCQkqLworCisjZGVmaW5lIFRJTUVSNl9DT05GSUcJCTB4RkZDMDA2NjAJLyogVGltZXIgNiBDb25maWd1cmF0aW9uIFJlZ2lzdGVyICAJCQkqLworI2RlZmluZSBUSU1FUjZfQ09VTlRFUgkJMHhGRkMwMDY2NAkvKiBUaW1lciA2IENvdW50ZXIgUmVnaXN0ZXIgICAgICAgIAkJCSovCisjZGVmaW5lIFRJTUVSNl9QRVJJT0QJCTB4RkZDMDA2NjgJLyogVGltZXIgNiBQZXJpb2QgUmVnaXN0ZXIgICAgICAgICAJCQkqLworI2RlZmluZSBUSU1FUjZfV0lEVEgJCTB4RkZDMDA2NkMJLyogVGltZXIgNiBXaWR0aCBSZWdpc3RlciAgICAgICAgICAJCQkqLworCisjZGVmaW5lIFRJTUVSN19DT05GSUcJCTB4RkZDMDA2NzAJLyogVGltZXIgNyBDb25maWd1cmF0aW9uIFJlZ2lzdGVyICAJCQkqLworI2RlZmluZSBUSU1FUjdfQ09VTlRFUgkJMHhGRkMwMDY3NAkvKiBUaW1lciA3IENvdW50ZXIgUmVnaXN0ZXIgICAgICAgIAkJCSovCisjZGVmaW5lIFRJTUVSN19QRVJJT0QJCTB4RkZDMDA2NzgJLyogVGltZXIgNyBQZXJpb2QgUmVnaXN0ZXIgICAgICAgICAJCQkqLworI2RlZmluZSBUSU1FUjdfV0lEVEgJCTB4RkZDMDA2N0MJLyogVGltZXIgNyBXaWR0aCBSZWdpc3RlciAgICAgICAJCQkqLworCisjZGVmaW5lIFRJTUVSX0VOQUJMRQkJMHhGRkMwMDY4MAkvKiBUaW1lciBFbmFibGUgUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIFRJTUVSX0RJU0FCTEUJCTB4RkZDMDA2ODQJLyogVGltZXIgRGlzYWJsZSBSZWdpc3RlcgkJCQkJKi8KKyNkZWZpbmUgVElNRVJfU1RBVFVTCQkweEZGQzAwNjg4CS8qIFRpbWVyIFN0YXR1cyBSZWdpc3RlcgkJCQkJKi8KKworLyogR2VuZXJhbCBQdXJwb3NlIEkvTyBQb3J0IEYgKDB4RkZDMDA3MDAgLSAweEZGQzAwN0ZGKQkJCQkJCQkJCQkJCSovCisjZGVmaW5lIFBPUlRGSU8JCQkJCTB4RkZDMDA3MDAJLyogUG9ydCBGIEkvTyBQaW4gU3RhdGUgU3BlY2lmeSBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBQT1JURklPX0NMRUFSCQkJMHhGRkMwMDcwNAkvKiBQb3J0IEYgSS9PIFBlcmlwaGVyYWwgSW50ZXJydXB0IENsZWFyIFJlZ2lzdGVyCQkqLworI2RlZmluZSBQT1JURklPX1NFVAkJCQkweEZGQzAwNzA4CS8qIFBvcnQgRiBJL08gUGVyaXBoZXJhbCBJbnRlcnJ1cHQgU2V0IFJlZ2lzdGVyCQkJKi8KKyNkZWZpbmUgUE9SVEZJT19UT0dHTEUJCQkweEZGQzAwNzBDCS8qIFBvcnQgRiBJL08gUGluIFN0YXRlIFRvZ2dsZSBSZWdpc3RlcgkJCQkJKi8KKyNkZWZpbmUgUE9SVEZJT19NQVNLQQkJCTB4RkZDMDA3MTAJLyogUG9ydCBGIEkvTyBNYXNrIFN0YXRlIFNwZWNpZnkgSW50ZXJydXB0IEEgUmVnaXN0ZXIJKi8KKyNkZWZpbmUgUE9SVEZJT19NQVNLQV9DTEVBUgkJMHhGRkMwMDcxNAkvKiBQb3J0IEYgSS9PIE1hc2sgRGlzYWJsZSBJbnRlcnJ1cHQgQSBSZWdpc3RlcgkJCSovCisjZGVmaW5lIFBPUlRGSU9fTUFTS0FfU0VUCQkweEZGQzAwNzE4CS8qIFBvcnQgRiBJL08gTWFzayBFbmFibGUgSW50ZXJydXB0IEEgUmVnaXN0ZXIJCQkqLworI2RlZmluZSBQT1JURklPX01BU0tBX1RPR0dMRQkweEZGQzAwNzFDCS8qIFBvcnQgRiBJL08gTWFzayBUb2dnbGUgRW5hYmxlIEludGVycnVwdCBBIFJlZ2lzdGVyCSovCisjZGVmaW5lIFBPUlRGSU9fTUFTS0IJCQkweEZGQzAwNzIwCS8qIFBvcnQgRiBJL08gTWFzayBTdGF0ZSBTcGVjaWZ5IEludGVycnVwdCBCIFJlZ2lzdGVyCSovCisjZGVmaW5lIFBPUlRGSU9fTUFTS0JfQ0xFQVIJCTB4RkZDMDA3MjQJLyogUG9ydCBGIEkvTyBNYXNrIERpc2FibGUgSW50ZXJydXB0IEIgUmVnaXN0ZXIJCQkqLworI2RlZmluZSBQT1JURklPX01BU0tCX1NFVAkJMHhGRkMwMDcyOAkvKiBQb3J0IEYgSS9PIE1hc2sgRW5hYmxlIEludGVycnVwdCBCIFJlZ2lzdGVyCQkJKi8KKyNkZWZpbmUgUE9SVEZJT19NQVNLQl9UT0dHTEUJMHhGRkMwMDcyQwkvKiBQb3J0IEYgSS9PIE1hc2sgVG9nZ2xlIEVuYWJsZSBJbnRlcnJ1cHQgQiBSZWdpc3RlcgkqLworI2RlZmluZSBQT1JURklPX0RJUgkJCQkweEZGQzAwNzMwCS8qIFBvcnQgRiBJL08gRGlyZWN0aW9uIFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgUE9SVEZJT19QT0xBUgkJCTB4RkZDMDA3MzQJLyogUG9ydCBGIEkvTyBTb3VyY2UgUG9sYXJpdHkgUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIFBPUlRGSU9fRURHRQkJCTB4RkZDMDA3MzgJLyogUG9ydCBGIEkvTyBTb3VyY2UgU2Vuc2l0aXZpdHkgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgUE9SVEZJT19CT1RICQkJMHhGRkMwMDczQwkvKiBQb3J0IEYgSS9PIFNldCBvbiBCT1RIIEVkZ2VzIFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIFBPUlRGSU9fSU5FTgkJCTB4RkZDMDA3NDAJLyogUG9ydCBGIEkvTyBJbnB1dCBFbmFibGUgUmVnaXN0ZXIgCQkJCQkqLworCisvKiBTUE9SVDAgQ29udHJvbGxlcgkJKDB4RkZDMDA4MDAgLSAweEZGQzAwOEZGKQkJCQkJCQkJCQkqLworI2RlZmluZSBTUE9SVDBfVENSMQkJCTB4RkZDMDA4MDAJLyogU1BPUlQwIFRyYW5zbWl0IENvbmZpZ3VyYXRpb24gMSBSZWdpc3RlcgkJCSovCisjZGVmaW5lIFNQT1JUMF9UQ1IyCQkJMHhGRkMwMDgwNAkvKiBTUE9SVDAgVHJhbnNtaXQgQ29uZmlndXJhdGlvbiAyIFJlZ2lzdGVyCQkJKi8KKyNkZWZpbmUgU1BPUlQwX1RDTEtESVYJCTB4RkZDMDA4MDgJLyogU1BPUlQwIFRyYW5zbWl0IENsb2NrIERpdmlkZXIJCQkJCSovCisjZGVmaW5lIFNQT1JUMF9URlNESVYJCTB4RkZDMDA4MEMJLyogU1BPUlQwIFRyYW5zbWl0IEZyYW1lIFN5bmMgRGl2aWRlcgkJCQkqLworI2RlZmluZSBTUE9SVDBfVFgJCQkweEZGQzAwODEwCS8qIFNQT1JUMCBUWCBEYXRhIFJlZ2lzdGVyCQkJCQkJCSovCisjZGVmaW5lIFNQT1JUMF9SWAkJCTB4RkZDMDA4MTgJLyogU1BPUlQwIFJYIERhdGEgUmVnaXN0ZXIJCQkJCQkJKi8KKyNkZWZpbmUgU1BPUlQwX1JDUjEJCQkweEZGQzAwODIwCS8qIFNQT1JUMCBUcmFuc21pdCBDb25maWd1cmF0aW9uIDEgUmVnaXN0ZXIJCQkqLworI2RlZmluZSBTUE9SVDBfUkNSMgkJCTB4RkZDMDA4MjQJLyogU1BPUlQwIFRyYW5zbWl0IENvbmZpZ3VyYXRpb24gMiBSZWdpc3RlcgkJCSovCisjZGVmaW5lIFNQT1JUMF9SQ0xLRElWCQkweEZGQzAwODI4CS8qIFNQT1JUMCBSZWNlaXZlIENsb2NrIERpdmlkZXIJCQkJCQkqLworI2RlZmluZSBTUE9SVDBfUkZTRElWCQkweEZGQzAwODJDCS8qIFNQT1JUMCBSZWNlaXZlIEZyYW1lIFN5bmMgRGl2aWRlcgkJCQkqLworI2RlZmluZSBTUE9SVDBfU1RBVAkJCTB4RkZDMDA4MzAJLyogU1BPUlQwIFN0YXR1cyBSZWdpc3RlcgkJCQkJCQkqLworI2RlZmluZSBTUE9SVDBfQ0hOTAkJCTB4RkZDMDA4MzQJLyogU1BPUlQwIEN1cnJlbnQgQ2hhbm5lbCBSZWdpc3RlcgkJCQkJKi8KKyNkZWZpbmUgU1BPUlQwX01DTUMxCQkweEZGQzAwODM4CS8qIFNQT1JUMCBNdWx0aS1DaGFubmVsIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgMQkqLworI2RlZmluZSBTUE9SVDBfTUNNQzIJCTB4RkZDMDA4M0MJLyogU1BPUlQwIE11bHRpLUNoYW5uZWwgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAyCSovCisjZGVmaW5lIFNQT1JUMF9NVENTMAkJMHhGRkMwMDg0MAkvKiBTUE9SVDAgTXVsdGktQ2hhbm5lbCBUcmFuc21pdCBTZWxlY3QgUmVnaXN0ZXIgMAkqLworI2RlZmluZSBTUE9SVDBfTVRDUzEJCTB4RkZDMDA4NDQJLyogU1BPUlQwIE11bHRpLUNoYW5uZWwgVHJhbnNtaXQgU2VsZWN0IFJlZ2lzdGVyIDEJKi8KKyNkZWZpbmUgU1BPUlQwX01UQ1MyCQkweEZGQzAwODQ4CS8qIFNQT1JUMCBNdWx0aS1DaGFubmVsIFRyYW5zbWl0IFNlbGVjdCBSZWdpc3RlciAyCSovCisjZGVmaW5lIFNQT1JUMF9NVENTMwkJMHhGRkMwMDg0QwkvKiBTUE9SVDAgTXVsdGktQ2hhbm5lbCBUcmFuc21pdCBTZWxlY3QgUmVnaXN0ZXIgMwkqLworI2RlZmluZSBTUE9SVDBfTVJDUzAJCTB4RkZDMDA4NTAJLyogU1BPUlQwIE11bHRpLUNoYW5uZWwgUmVjZWl2ZSBTZWxlY3QgUmVnaXN0ZXIgMAkqLworI2RlZmluZSBTUE9SVDBfTVJDUzEJCTB4RkZDMDA4NTQJLyogU1BPUlQwIE11bHRpLUNoYW5uZWwgUmVjZWl2ZSBTZWxlY3QgUmVnaXN0ZXIgMQkqLworI2RlZmluZSBTUE9SVDBfTVJDUzIJCTB4RkZDMDA4NTgJLyogU1BPUlQwIE11bHRpLUNoYW5uZWwgUmVjZWl2ZSBTZWxlY3QgUmVnaXN0ZXIgMgkqLworI2RlZmluZSBTUE9SVDBfTVJDUzMJCTB4RkZDMDA4NUMJLyogU1BPUlQwIE11bHRpLUNoYW5uZWwgUmVjZWl2ZSBTZWxlY3QgUmVnaXN0ZXIgMwkqLworCisvKiBTUE9SVDEgQ29udHJvbGxlcgkJKDB4RkZDMDA5MDAgLSAweEZGQzAwOUZGKQkJCQkJCQkJCQkqLworI2RlZmluZSBTUE9SVDFfVENSMQkJCTB4RkZDMDA5MDAJLyogU1BPUlQxIFRyYW5zbWl0IENvbmZpZ3VyYXRpb24gMSBSZWdpc3RlcgkJCSovCisjZGVmaW5lIFNQT1JUMV9UQ1IyCQkJMHhGRkMwMDkwNAkvKiBTUE9SVDEgVHJhbnNtaXQgQ29uZmlndXJhdGlvbiAyIFJlZ2lzdGVyCQkJKi8KKyNkZWZpbmUgU1BPUlQxX1RDTEtESVYJCTB4RkZDMDA5MDgJLyogU1BPUlQxIFRyYW5zbWl0IENsb2NrIERpdmlkZXIJCQkJCSovCisjZGVmaW5lIFNQT1JUMV9URlNESVYJCTB4RkZDMDA5MEMJLyogU1BPUlQxIFRyYW5zbWl0IEZyYW1lIFN5bmMgRGl2aWRlcgkJCQkqLworI2RlZmluZSBTUE9SVDFfVFgJCQkweEZGQzAwOTEwCS8qIFNQT1JUMSBUWCBEYXRhIFJlZ2lzdGVyCQkJCQkJCSovCisjZGVmaW5lIFNQT1JUMV9SWAkJCTB4RkZDMDA5MTgJLyogU1BPUlQxIFJYIERhdGEgUmVnaXN0ZXIJCQkJCQkJKi8KKyNkZWZpbmUgU1BPUlQxX1JDUjEJCQkweEZGQzAwOTIwCS8qIFNQT1JUMSBUcmFuc21pdCBDb25maWd1cmF0aW9uIDEgUmVnaXN0ZXIJCQkqLworI2RlZmluZSBTUE9SVDFfUkNSMgkJCTB4RkZDMDA5MjQJLyogU1BPUlQxIFRyYW5zbWl0IENvbmZpZ3VyYXRpb24gMiBSZWdpc3RlcgkJCSovCisjZGVmaW5lIFNQT1JUMV9SQ0xLRElWCQkweEZGQzAwOTI4CS8qIFNQT1JUMSBSZWNlaXZlIENsb2NrIERpdmlkZXIJCQkJCQkqLworI2RlZmluZSBTUE9SVDFfUkZTRElWCQkweEZGQzAwOTJDCS8qIFNQT1JUMSBSZWNlaXZlIEZyYW1lIFN5bmMgRGl2aWRlcgkJCQkqLworI2RlZmluZSBTUE9SVDFfU1RBVAkJCTB4RkZDMDA5MzAJLyogU1BPUlQxIFN0YXR1cyBSZWdpc3RlcgkJCQkJCQkqLworI2RlZmluZSBTUE9SVDFfQ0hOTAkJCTB4RkZDMDA5MzQJLyogU1BPUlQxIEN1cnJlbnQgQ2hhbm5lbCBSZWdpc3RlcgkJCQkJKi8KKyNkZWZpbmUgU1BPUlQxX01DTUMxCQkweEZGQzAwOTM4CS8qIFNQT1JUMSBNdWx0aS1DaGFubmVsIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgMQkqLworI2RlZmluZSBTUE9SVDFfTUNNQzIJCTB4RkZDMDA5M0MJLyogU1BPUlQxIE11bHRpLUNoYW5uZWwgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAyCSovCisjZGVmaW5lIFNQT1JUMV9NVENTMAkJMHhGRkMwMDk0MAkvKiBTUE9SVDEgTXVsdGktQ2hhbm5lbCBUcmFuc21pdCBTZWxlY3QgUmVnaXN0ZXIgMAkqLworI2RlZmluZSBTUE9SVDFfTVRDUzEJCTB4RkZDMDA5NDQJLyogU1BPUlQxIE11bHRpLUNoYW5uZWwgVHJhbnNtaXQgU2VsZWN0IFJlZ2lzdGVyIDEJKi8KKyNkZWZpbmUgU1BPUlQxX01UQ1MyCQkweEZGQzAwOTQ4CS8qIFNQT1JUMSBNdWx0aS1DaGFubmVsIFRyYW5zbWl0IFNlbGVjdCBSZWdpc3RlciAyCSovCisjZGVmaW5lIFNQT1JUMV9NVENTMwkJMHhGRkMwMDk0QwkvKiBTUE9SVDEgTXVsdGktQ2hhbm5lbCBUcmFuc21pdCBTZWxlY3QgUmVnaXN0ZXIgMwkqLworI2RlZmluZSBTUE9SVDFfTVJDUzAJCTB4RkZDMDA5NTAJLyogU1BPUlQxIE11bHRpLUNoYW5uZWwgUmVjZWl2ZSBTZWxlY3QgUmVnaXN0ZXIgMAkqLworI2RlZmluZSBTUE9SVDFfTVJDUzEJCTB4RkZDMDA5NTQJLyogU1BPUlQxIE11bHRpLUNoYW5uZWwgUmVjZWl2ZSBTZWxlY3QgUmVnaXN0ZXIgMQkqLworI2RlZmluZSBTUE9SVDFfTVJDUzIJCTB4RkZDMDA5NTgJLyogU1BPUlQxIE11bHRpLUNoYW5uZWwgUmVjZWl2ZSBTZWxlY3QgUmVnaXN0ZXIgMgkqLworI2RlZmluZSBTUE9SVDFfTVJDUzMJCTB4RkZDMDA5NUMJLyogU1BPUlQxIE11bHRpLUNoYW5uZWwgUmVjZWl2ZSBTZWxlY3QgUmVnaXN0ZXIgMwkqLworCisvKiBFeHRlcm5hbCBCdXMgSW50ZXJmYWNlIFVuaXQgKDB4RkZDMDBBMDAgLSAweEZGQzAwQUZGKQkJCQkJCQkJKi8KKyNkZWZpbmUgRUJJVV9BTUdDVEwJCQkweEZGQzAwQTAwCS8qIEFzeW5jaHJvbm91cyBNZW1vcnkgR2xvYmFsIENvbnRyb2wgUmVnaXN0ZXIJKi8KKyNkZWZpbmUgRUJJVV9BTUJDVEwwCQkweEZGQzAwQTA0CS8qIEFzeW5jaHJvbm91cyBNZW1vcnkgQmFuayBDb250cm9sIFJlZ2lzdGVyIDAJKi8KKyNkZWZpbmUgRUJJVV9BTUJDVEwxCQkweEZGQzAwQTA4CS8qIEFzeW5jaHJvbm91cyBNZW1vcnkgQmFuayBDb250cm9sIFJlZ2lzdGVyIDEJKi8KKyNkZWZpbmUgRUJJVV9TREdDVEwJCQkweEZGQzAwQTEwCS8qIFNEUkFNIEdsb2JhbCBDb250cm9sIFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIEVCSVVfU0RCQ1RMCQkJMHhGRkMwMEExNAkvKiBTRFJBTSBCYW5rIENvbnRyb2wgUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIEVCSVVfU0RSUkMJCQkweEZGQzAwQTE4CS8qIFNEUkFNIFJlZnJlc2ggUmF0ZSBDb250cm9sIFJlZ2lzdGVyCQkJKi8KKyNkZWZpbmUgRUJJVV9TRFNUQVQJCQkweEZGQzAwQTFDCS8qIFNEUkFNIFN0YXR1cyBSZWdpc3RlcgkJCQkJCSovCisKKy8qIERNQSBUcmFmZmljIENvbnRyb2wgUmVnaXN0ZXJzCQkJCQkJCQkJCQkJCSovCisjZGVmaW5lIERNQUNfVENfUEVSCQkJMHhGRkMwMEIwQwkvKiBUcmFmZmljIENvbnRyb2wgUGVyaW9kcyBSZWdpc3RlcgkJCSovCisjZGVmaW5lIERNQUNfVENfQ05UCQkJMHhGRkMwMEIxMAkvKiBUcmFmZmljIENvbnRyb2wgQ3VycmVudCBDb3VudHMgUmVnaXN0ZXIJKi8KKworLyogRE1BIENvbnRyb2xsZXIgKDB4RkZDMDBDMDAgLSAweEZGQzAwRkZGKQkJCQkJCQkJCQkJCQkJCSovCisjZGVmaW5lIERNQTBfTkVYVF9ERVNDX1BUUgkJMHhGRkMwMEMwMAkvKiBETUEgQ2hhbm5lbCAwIE5leHQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyCQkqLworI2RlZmluZSBETUEwX1NUQVJUX0FERFIJCQkweEZGQzAwQzA0CS8qIERNQSBDaGFubmVsIDAgU3RhcnQgQWRkcmVzcyBSZWdpc3RlcgkJCQkJKi8KKyNkZWZpbmUgRE1BMF9DT05GSUcJCQkJMHhGRkMwMEMwOAkvKiBETUEgQ2hhbm5lbCAwIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIERNQTBfWF9DT1VOVAkJCTB4RkZDMDBDMTAJLyogRE1BIENoYW5uZWwgMCBYIENvdW50IFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgRE1BMF9YX01PRElGWQkJCTB4RkZDMDBDMTQJLyogRE1BIENoYW5uZWwgMCBYIE1vZGlmeSBSZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIERNQTBfWV9DT1VOVAkJCTB4RkZDMDBDMTgJLyogRE1BIENoYW5uZWwgMCBZIENvdW50IFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgRE1BMF9ZX01PRElGWQkJCTB4RkZDMDBDMUMJLyogRE1BIENoYW5uZWwgMCBZIE1vZGlmeSBSZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIERNQTBfQ1VSUl9ERVNDX1BUUgkJMHhGRkMwMEMyMAkvKiBETUEgQ2hhbm5lbCAwIEN1cnJlbnQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyCSovCisjZGVmaW5lIERNQTBfQ1VSUl9BRERSCQkJMHhGRkMwMEMyNAkvKiBETUEgQ2hhbm5lbCAwIEN1cnJlbnQgQWRkcmVzcyBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBETUEwX0lSUV9TVEFUVVMJCQkweEZGQzAwQzI4CS8qIERNQSBDaGFubmVsIDAgSW50ZXJydXB0L1N0YXR1cyBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBETUEwX1BFUklQSEVSQUxfTUFQCQkweEZGQzAwQzJDCS8qIERNQSBDaGFubmVsIDAgUGVyaXBoZXJhbCBNYXAgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgRE1BMF9DVVJSX1hfQ09VTlQJCTB4RkZDMDBDMzAJLyogRE1BIENoYW5uZWwgMCBDdXJyZW50IFggQ291bnQgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgRE1BMF9DVVJSX1lfQ09VTlQJCTB4RkZDMDBDMzgJLyogRE1BIENoYW5uZWwgMCBDdXJyZW50IFkgQ291bnQgUmVnaXN0ZXIJCQkJKi8KKworI2RlZmluZSBETUExX05FWFRfREVTQ19QVFIJCTB4RkZDMDBDNDAJLyogRE1BIENoYW5uZWwgMSBOZXh0IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlcgkJKi8KKyNkZWZpbmUgRE1BMV9TVEFSVF9BRERSCQkJMHhGRkMwMEM0NAkvKiBETUEgQ2hhbm5lbCAxIFN0YXJ0IEFkZHJlc3MgUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIERNQTFfQ09ORklHCQkJCTB4RkZDMDBDNDgJLyogRE1BIENoYW5uZWwgMSBDb25maWd1cmF0aW9uIFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBETUExX1hfQ09VTlQJCQkweEZGQzAwQzUwCS8qIERNQSBDaGFubmVsIDEgWCBDb3VudCBSZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIERNQTFfWF9NT0RJRlkJCQkweEZGQzAwQzU0CS8qIERNQSBDaGFubmVsIDEgWCBNb2RpZnkgUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBETUExX1lfQ09VTlQJCQkweEZGQzAwQzU4CS8qIERNQSBDaGFubmVsIDEgWSBDb3VudCBSZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIERNQTFfWV9NT0RJRlkJCQkweEZGQzAwQzVDCS8qIERNQSBDaGFubmVsIDEgWSBNb2RpZnkgUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBETUExX0NVUlJfREVTQ19QVFIJCTB4RkZDMDBDNjAJLyogRE1BIENoYW5uZWwgMSBDdXJyZW50IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlcgkqLworI2RlZmluZSBETUExX0NVUlJfQUREUgkJCTB4RkZDMDBDNjQJLyogRE1BIENoYW5uZWwgMSBDdXJyZW50IEFkZHJlc3MgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgRE1BMV9JUlFfU1RBVFVTCQkJMHhGRkMwMEM2OAkvKiBETUEgQ2hhbm5lbCAxIEludGVycnVwdC9TdGF0dXMgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgRE1BMV9QRVJJUEhFUkFMX01BUAkJMHhGRkMwMEM2QwkvKiBETUEgQ2hhbm5lbCAxIFBlcmlwaGVyYWwgTWFwIFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIERNQTFfQ1VSUl9YX0NPVU5UCQkweEZGQzAwQzcwCS8qIERNQSBDaGFubmVsIDEgQ3VycmVudCBYIENvdW50IFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIERNQTFfQ1VSUl9ZX0NPVU5UCQkweEZGQzAwQzc4CS8qIERNQSBDaGFubmVsIDEgQ3VycmVudCBZIENvdW50IFJlZ2lzdGVyCQkJCSovCisKKyNkZWZpbmUgRE1BMl9ORVhUX0RFU0NfUFRSCQkweEZGQzAwQzgwCS8qIERNQSBDaGFubmVsIDIgTmV4dCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIJCSovCisjZGVmaW5lIERNQTJfU1RBUlRfQUREUgkJCTB4RkZDMDBDODQJLyogRE1BIENoYW5uZWwgMiBTdGFydCBBZGRyZXNzIFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBETUEyX0NPTkZJRwkJCQkweEZGQzAwQzg4CS8qIERNQSBDaGFubmVsIDIgQ29uZmlndXJhdGlvbiBSZWdpc3RlcgkJCQkJKi8KKyNkZWZpbmUgRE1BMl9YX0NPVU5UCQkJMHhGRkMwMEM5MAkvKiBETUEgQ2hhbm5lbCAyIFggQ291bnQgUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBETUEyX1hfTU9ESUZZCQkJMHhGRkMwMEM5NAkvKiBETUEgQ2hhbm5lbCAyIFggTW9kaWZ5IFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgRE1BMl9ZX0NPVU5UCQkJMHhGRkMwMEM5OAkvKiBETUEgQ2hhbm5lbCAyIFkgQ291bnQgUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBETUEyX1lfTU9ESUZZCQkJMHhGRkMwMEM5QwkvKiBETUEgQ2hhbm5lbCAyIFkgTW9kaWZ5IFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgRE1BMl9DVVJSX0RFU0NfUFRSCQkweEZGQzAwQ0EwCS8qIERNQSBDaGFubmVsIDIgQ3VycmVudCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIJKi8KKyNkZWZpbmUgRE1BMl9DVVJSX0FERFIJCQkweEZGQzAwQ0E0CS8qIERNQSBDaGFubmVsIDIgQ3VycmVudCBBZGRyZXNzIFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIERNQTJfSVJRX1NUQVRVUwkJCTB4RkZDMDBDQTgJLyogRE1BIENoYW5uZWwgMiBJbnRlcnJ1cHQvU3RhdHVzIFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIERNQTJfUEVSSVBIRVJBTF9NQVAJCTB4RkZDMDBDQUMJLyogRE1BIENoYW5uZWwgMiBQZXJpcGhlcmFsIE1hcCBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBETUEyX0NVUlJfWF9DT1VOVAkJMHhGRkMwMENCMAkvKiBETUEgQ2hhbm5lbCAyIEN1cnJlbnQgWCBDb3VudCBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBETUEyX0NVUlJfWV9DT1VOVAkJMHhGRkMwMENCOAkvKiBETUEgQ2hhbm5lbCAyIEN1cnJlbnQgWSBDb3VudCBSZWdpc3RlcgkJCQkqLworCisjZGVmaW5lIERNQTNfTkVYVF9ERVNDX1BUUgkJMHhGRkMwMENDMAkvKiBETUEgQ2hhbm5lbCAzIE5leHQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyCQkqLworI2RlZmluZSBETUEzX1NUQVJUX0FERFIJCQkweEZGQzAwQ0M0CS8qIERNQSBDaGFubmVsIDMgU3RhcnQgQWRkcmVzcyBSZWdpc3RlcgkJCQkJKi8KKyNkZWZpbmUgRE1BM19DT05GSUcJCQkJMHhGRkMwMENDOAkvKiBETUEgQ2hhbm5lbCAzIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIERNQTNfWF9DT1VOVAkJCTB4RkZDMDBDRDAJLyogRE1BIENoYW5uZWwgMyBYIENvdW50IFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgRE1BM19YX01PRElGWQkJCTB4RkZDMDBDRDQJLyogRE1BIENoYW5uZWwgMyBYIE1vZGlmeSBSZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIERNQTNfWV9DT1VOVAkJCTB4RkZDMDBDRDgJLyogRE1BIENoYW5uZWwgMyBZIENvdW50IFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgRE1BM19ZX01PRElGWQkJCTB4RkZDMDBDREMJLyogRE1BIENoYW5uZWwgMyBZIE1vZGlmeSBSZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIERNQTNfQ1VSUl9ERVNDX1BUUgkJMHhGRkMwMENFMAkvKiBETUEgQ2hhbm5lbCAzIEN1cnJlbnQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyCSovCisjZGVmaW5lIERNQTNfQ1VSUl9BRERSCQkJMHhGRkMwMENFNAkvKiBETUEgQ2hhbm5lbCAzIEN1cnJlbnQgQWRkcmVzcyBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBETUEzX0lSUV9TVEFUVVMJCQkweEZGQzAwQ0U4CS8qIERNQSBDaGFubmVsIDMgSW50ZXJydXB0L1N0YXR1cyBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBETUEzX1BFUklQSEVSQUxfTUFQCQkweEZGQzAwQ0VDCS8qIERNQSBDaGFubmVsIDMgUGVyaXBoZXJhbCBNYXAgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgRE1BM19DVVJSX1hfQ09VTlQJCTB4RkZDMDBDRjAJLyogRE1BIENoYW5uZWwgMyBDdXJyZW50IFggQ291bnQgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgRE1BM19DVVJSX1lfQ09VTlQJCTB4RkZDMDBDRjgJLyogRE1BIENoYW5uZWwgMyBDdXJyZW50IFkgQ291bnQgUmVnaXN0ZXIJCQkJKi8KKworI2RlZmluZSBETUE0X05FWFRfREVTQ19QVFIJCTB4RkZDMDBEMDAJLyogRE1BIENoYW5uZWwgNCBOZXh0IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlcgkJKi8KKyNkZWZpbmUgRE1BNF9TVEFSVF9BRERSCQkJMHhGRkMwMEQwNAkvKiBETUEgQ2hhbm5lbCA0IFN0YXJ0IEFkZHJlc3MgUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIERNQTRfQ09ORklHCQkJCTB4RkZDMDBEMDgJLyogRE1BIENoYW5uZWwgNCBDb25maWd1cmF0aW9uIFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBETUE0X1hfQ09VTlQJCQkweEZGQzAwRDEwCS8qIERNQSBDaGFubmVsIDQgWCBDb3VudCBSZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIERNQTRfWF9NT0RJRlkJCQkweEZGQzAwRDE0CS8qIERNQSBDaGFubmVsIDQgWCBNb2RpZnkgUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBETUE0X1lfQ09VTlQJCQkweEZGQzAwRDE4CS8qIERNQSBDaGFubmVsIDQgWSBDb3VudCBSZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIERNQTRfWV9NT0RJRlkJCQkweEZGQzAwRDFDCS8qIERNQSBDaGFubmVsIDQgWSBNb2RpZnkgUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBETUE0X0NVUlJfREVTQ19QVFIJCTB4RkZDMDBEMjAJLyogRE1BIENoYW5uZWwgNCBDdXJyZW50IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlcgkqLworI2RlZmluZSBETUE0X0NVUlJfQUREUgkJCTB4RkZDMDBEMjQJLyogRE1BIENoYW5uZWwgNCBDdXJyZW50IEFkZHJlc3MgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgRE1BNF9JUlFfU1RBVFVTCQkJMHhGRkMwMEQyOAkvKiBETUEgQ2hhbm5lbCA0IEludGVycnVwdC9TdGF0dXMgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgRE1BNF9QRVJJUEhFUkFMX01BUAkJMHhGRkMwMEQyQwkvKiBETUEgQ2hhbm5lbCA0IFBlcmlwaGVyYWwgTWFwIFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIERNQTRfQ1VSUl9YX0NPVU5UCQkweEZGQzAwRDMwCS8qIERNQSBDaGFubmVsIDQgQ3VycmVudCBYIENvdW50IFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIERNQTRfQ1VSUl9ZX0NPVU5UCQkweEZGQzAwRDM4CS8qIERNQSBDaGFubmVsIDQgQ3VycmVudCBZIENvdW50IFJlZ2lzdGVyCQkJCSovCisKKyNkZWZpbmUgRE1BNV9ORVhUX0RFU0NfUFRSCQkweEZGQzAwRDQwCS8qIERNQSBDaGFubmVsIDUgTmV4dCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIJCSovCisjZGVmaW5lIERNQTVfU1RBUlRfQUREUgkJCTB4RkZDMDBENDQJLyogRE1BIENoYW5uZWwgNSBTdGFydCBBZGRyZXNzIFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBETUE1X0NPTkZJRwkJCQkweEZGQzAwRDQ4CS8qIERNQSBDaGFubmVsIDUgQ29uZmlndXJhdGlvbiBSZWdpc3RlcgkJCQkJKi8KKyNkZWZpbmUgRE1BNV9YX0NPVU5UCQkJMHhGRkMwMEQ1MAkvKiBETUEgQ2hhbm5lbCA1IFggQ291bnQgUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBETUE1X1hfTU9ESUZZCQkJMHhGRkMwMEQ1NAkvKiBETUEgQ2hhbm5lbCA1IFggTW9kaWZ5IFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgRE1BNV9ZX0NPVU5UCQkJMHhGRkMwMEQ1OAkvKiBETUEgQ2hhbm5lbCA1IFkgQ291bnQgUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBETUE1X1lfTU9ESUZZCQkJMHhGRkMwMEQ1QwkvKiBETUEgQ2hhbm5lbCA1IFkgTW9kaWZ5IFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgRE1BNV9DVVJSX0RFU0NfUFRSCQkweEZGQzAwRDYwCS8qIERNQSBDaGFubmVsIDUgQ3VycmVudCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIJKi8KKyNkZWZpbmUgRE1BNV9DVVJSX0FERFIJCQkweEZGQzAwRDY0CS8qIERNQSBDaGFubmVsIDUgQ3VycmVudCBBZGRyZXNzIFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIERNQTVfSVJRX1NUQVRVUwkJCTB4RkZDMDBENjgJLyogRE1BIENoYW5uZWwgNSBJbnRlcnJ1cHQvU3RhdHVzIFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIERNQTVfUEVSSVBIRVJBTF9NQVAJCTB4RkZDMDBENkMJLyogRE1BIENoYW5uZWwgNSBQZXJpcGhlcmFsIE1hcCBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBETUE1X0NVUlJfWF9DT1VOVAkJMHhGRkMwMEQ3MAkvKiBETUEgQ2hhbm5lbCA1IEN1cnJlbnQgWCBDb3VudCBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBETUE1X0NVUlJfWV9DT1VOVAkJMHhGRkMwMEQ3OAkvKiBETUEgQ2hhbm5lbCA1IEN1cnJlbnQgWSBDb3VudCBSZWdpc3RlcgkJCQkqLworCisjZGVmaW5lIERNQTZfTkVYVF9ERVNDX1BUUgkJMHhGRkMwMEQ4MAkvKiBETUEgQ2hhbm5lbCA2IE5leHQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyCQkqLworI2RlZmluZSBETUE2X1NUQVJUX0FERFIJCQkweEZGQzAwRDg0CS8qIERNQSBDaGFubmVsIDYgU3RhcnQgQWRkcmVzcyBSZWdpc3RlcgkJCQkJKi8KKyNkZWZpbmUgRE1BNl9DT05GSUcJCQkJMHhGRkMwMEQ4OAkvKiBETUEgQ2hhbm5lbCA2IENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIERNQTZfWF9DT1VOVAkJCTB4RkZDMDBEOTAJLyogRE1BIENoYW5uZWwgNiBYIENvdW50IFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgRE1BNl9YX01PRElGWQkJCTB4RkZDMDBEOTQJLyogRE1BIENoYW5uZWwgNiBYIE1vZGlmeSBSZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIERNQTZfWV9DT1VOVAkJCTB4RkZDMDBEOTgJLyogRE1BIENoYW5uZWwgNiBZIENvdW50IFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgRE1BNl9ZX01PRElGWQkJCTB4RkZDMDBEOUMJLyogRE1BIENoYW5uZWwgNiBZIE1vZGlmeSBSZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIERNQTZfQ1VSUl9ERVNDX1BUUgkJMHhGRkMwMERBMAkvKiBETUEgQ2hhbm5lbCA2IEN1cnJlbnQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyCSovCisjZGVmaW5lIERNQTZfQ1VSUl9BRERSCQkJMHhGRkMwMERBNAkvKiBETUEgQ2hhbm5lbCA2IEN1cnJlbnQgQWRkcmVzcyBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBETUE2X0lSUV9TVEFUVVMJCQkweEZGQzAwREE4CS8qIERNQSBDaGFubmVsIDYgSW50ZXJydXB0L1N0YXR1cyBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBETUE2X1BFUklQSEVSQUxfTUFQCQkweEZGQzAwREFDCS8qIERNQSBDaGFubmVsIDYgUGVyaXBoZXJhbCBNYXAgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgRE1BNl9DVVJSX1hfQ09VTlQJCTB4RkZDMDBEQjAJLyogRE1BIENoYW5uZWwgNiBDdXJyZW50IFggQ291bnQgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgRE1BNl9DVVJSX1lfQ09VTlQJCTB4RkZDMDBEQjgJLyogRE1BIENoYW5uZWwgNiBDdXJyZW50IFkgQ291bnQgUmVnaXN0ZXIJCQkJKi8KKworI2RlZmluZSBETUE3X05FWFRfREVTQ19QVFIJCTB4RkZDMDBEQzAJLyogRE1BIENoYW5uZWwgNyBOZXh0IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlcgkJKi8KKyNkZWZpbmUgRE1BN19TVEFSVF9BRERSCQkJMHhGRkMwMERDNAkvKiBETUEgQ2hhbm5lbCA3IFN0YXJ0IEFkZHJlc3MgUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIERNQTdfQ09ORklHCQkJCTB4RkZDMDBEQzgJLyogRE1BIENoYW5uZWwgNyBDb25maWd1cmF0aW9uIFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBETUE3X1hfQ09VTlQJCQkweEZGQzAwREQwCS8qIERNQSBDaGFubmVsIDcgWCBDb3VudCBSZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIERNQTdfWF9NT0RJRlkJCQkweEZGQzAwREQ0CS8qIERNQSBDaGFubmVsIDcgWCBNb2RpZnkgUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBETUE3X1lfQ09VTlQJCQkweEZGQzAwREQ4CS8qIERNQSBDaGFubmVsIDcgWSBDb3VudCBSZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIERNQTdfWV9NT0RJRlkJCQkweEZGQzAwRERDCS8qIERNQSBDaGFubmVsIDcgWSBNb2RpZnkgUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBETUE3X0NVUlJfREVTQ19QVFIJCTB4RkZDMDBERTAJLyogRE1BIENoYW5uZWwgNyBDdXJyZW50IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlcgkqLworI2RlZmluZSBETUE3X0NVUlJfQUREUgkJCTB4RkZDMDBERTQJLyogRE1BIENoYW5uZWwgNyBDdXJyZW50IEFkZHJlc3MgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgRE1BN19JUlFfU1RBVFVTCQkJMHhGRkMwMERFOAkvKiBETUEgQ2hhbm5lbCA3IEludGVycnVwdC9TdGF0dXMgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgRE1BN19QRVJJUEhFUkFMX01BUAkJMHhGRkMwMERFQwkvKiBETUEgQ2hhbm5lbCA3IFBlcmlwaGVyYWwgTWFwIFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIERNQTdfQ1VSUl9YX0NPVU5UCQkweEZGQzAwREYwCS8qIERNQSBDaGFubmVsIDcgQ3VycmVudCBYIENvdW50IFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIERNQTdfQ1VSUl9ZX0NPVU5UCQkweEZGQzAwREY4CS8qIERNQSBDaGFubmVsIDcgQ3VycmVudCBZIENvdW50IFJlZ2lzdGVyCQkJCSovCisKKyNkZWZpbmUgRE1BOF9ORVhUX0RFU0NfUFRSCQkweEZGQzAwRTAwCS8qIERNQSBDaGFubmVsIDggTmV4dCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIJCSovCisjZGVmaW5lIERNQThfU1RBUlRfQUREUgkJCTB4RkZDMDBFMDQJLyogRE1BIENoYW5uZWwgOCBTdGFydCBBZGRyZXNzIFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBETUE4X0NPTkZJRwkJCQkweEZGQzAwRTA4CS8qIERNQSBDaGFubmVsIDggQ29uZmlndXJhdGlvbiBSZWdpc3RlcgkJCQkJKi8KKyNkZWZpbmUgRE1BOF9YX0NPVU5UCQkJMHhGRkMwMEUxMAkvKiBETUEgQ2hhbm5lbCA4IFggQ291bnQgUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBETUE4X1hfTU9ESUZZCQkJMHhGRkMwMEUxNAkvKiBETUEgQ2hhbm5lbCA4IFggTW9kaWZ5IFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgRE1BOF9ZX0NPVU5UCQkJMHhGRkMwMEUxOAkvKiBETUEgQ2hhbm5lbCA4IFkgQ291bnQgUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBETUE4X1lfTU9ESUZZCQkJMHhGRkMwMEUxQwkvKiBETUEgQ2hhbm5lbCA4IFkgTW9kaWZ5IFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgRE1BOF9DVVJSX0RFU0NfUFRSCQkweEZGQzAwRTIwCS8qIERNQSBDaGFubmVsIDggQ3VycmVudCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIJKi8KKyNkZWZpbmUgRE1BOF9DVVJSX0FERFIJCQkweEZGQzAwRTI0CS8qIERNQSBDaGFubmVsIDggQ3VycmVudCBBZGRyZXNzIFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIERNQThfSVJRX1NUQVRVUwkJCTB4RkZDMDBFMjgJLyogRE1BIENoYW5uZWwgOCBJbnRlcnJ1cHQvU3RhdHVzIFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIERNQThfUEVSSVBIRVJBTF9NQVAJCTB4RkZDMDBFMkMJLyogRE1BIENoYW5uZWwgOCBQZXJpcGhlcmFsIE1hcCBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBETUE4X0NVUlJfWF9DT1VOVAkJMHhGRkMwMEUzMAkvKiBETUEgQ2hhbm5lbCA4IEN1cnJlbnQgWCBDb3VudCBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBETUE4X0NVUlJfWV9DT1VOVAkJMHhGRkMwMEUzOAkvKiBETUEgQ2hhbm5lbCA4IEN1cnJlbnQgWSBDb3VudCBSZWdpc3RlcgkJCQkqLworCisjZGVmaW5lIERNQTlfTkVYVF9ERVNDX1BUUgkJMHhGRkMwMEU0MAkvKiBETUEgQ2hhbm5lbCA5IE5leHQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyCQkqLworI2RlZmluZSBETUE5X1NUQVJUX0FERFIJCQkweEZGQzAwRTQ0CS8qIERNQSBDaGFubmVsIDkgU3RhcnQgQWRkcmVzcyBSZWdpc3RlcgkJCQkJKi8KKyNkZWZpbmUgRE1BOV9DT05GSUcJCQkJMHhGRkMwMEU0OAkvKiBETUEgQ2hhbm5lbCA5IENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIERNQTlfWF9DT1VOVAkJCTB4RkZDMDBFNTAJLyogRE1BIENoYW5uZWwgOSBYIENvdW50IFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgRE1BOV9YX01PRElGWQkJCTB4RkZDMDBFNTQJLyogRE1BIENoYW5uZWwgOSBYIE1vZGlmeSBSZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIERNQTlfWV9DT1VOVAkJCTB4RkZDMDBFNTgJLyogRE1BIENoYW5uZWwgOSBZIENvdW50IFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgRE1BOV9ZX01PRElGWQkJCTB4RkZDMDBFNUMJLyogRE1BIENoYW5uZWwgOSBZIE1vZGlmeSBSZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIERNQTlfQ1VSUl9ERVNDX1BUUgkJMHhGRkMwMEU2MAkvKiBETUEgQ2hhbm5lbCA5IEN1cnJlbnQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyCSovCisjZGVmaW5lIERNQTlfQ1VSUl9BRERSCQkJMHhGRkMwMEU2NAkvKiBETUEgQ2hhbm5lbCA5IEN1cnJlbnQgQWRkcmVzcyBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBETUE5X0lSUV9TVEFUVVMJCQkweEZGQzAwRTY4CS8qIERNQSBDaGFubmVsIDkgSW50ZXJydXB0L1N0YXR1cyBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBETUE5X1BFUklQSEVSQUxfTUFQCQkweEZGQzAwRTZDCS8qIERNQSBDaGFubmVsIDkgUGVyaXBoZXJhbCBNYXAgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgRE1BOV9DVVJSX1hfQ09VTlQJCTB4RkZDMDBFNzAJLyogRE1BIENoYW5uZWwgOSBDdXJyZW50IFggQ291bnQgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgRE1BOV9DVVJSX1lfQ09VTlQJCTB4RkZDMDBFNzgJLyogRE1BIENoYW5uZWwgOSBDdXJyZW50IFkgQ291bnQgUmVnaXN0ZXIJCQkJKi8KKworI2RlZmluZSBETUExMF9ORVhUX0RFU0NfUFRSCQkweEZGQzAwRTgwCS8qIERNQSBDaGFubmVsIDEwIE5leHQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyCQkqLworI2RlZmluZSBETUExMF9TVEFSVF9BRERSCQkweEZGQzAwRTg0CS8qIERNQSBDaGFubmVsIDEwIFN0YXJ0IEFkZHJlc3MgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgRE1BMTBfQ09ORklHCQkJMHhGRkMwMEU4OAkvKiBETUEgQ2hhbm5lbCAxMCBDb25maWd1cmF0aW9uIFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIERNQTEwX1hfQ09VTlQJCQkweEZGQzAwRTkwCS8qIERNQSBDaGFubmVsIDEwIFggQ291bnQgUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBETUExMF9YX01PRElGWQkJCTB4RkZDMDBFOTQJLyogRE1BIENoYW5uZWwgMTAgWCBNb2RpZnkgUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBETUExMF9ZX0NPVU5UCQkJMHhGRkMwMEU5OAkvKiBETUEgQ2hhbm5lbCAxMCBZIENvdW50IFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgRE1BMTBfWV9NT0RJRlkJCQkweEZGQzAwRTlDCS8qIERNQSBDaGFubmVsIDEwIFkgTW9kaWZ5IFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgRE1BMTBfQ1VSUl9ERVNDX1BUUgkJMHhGRkMwMEVBMAkvKiBETUEgQ2hhbm5lbCAxMCBDdXJyZW50IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlcgkqLworI2RlZmluZSBETUExMF9DVVJSX0FERFIJCQkweEZGQzAwRUE0CS8qIERNQSBDaGFubmVsIDEwIEN1cnJlbnQgQWRkcmVzcyBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBETUExMF9JUlFfU1RBVFVTCQkweEZGQzAwRUE4CS8qIERNQSBDaGFubmVsIDEwIEludGVycnVwdC9TdGF0dXMgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgRE1BMTBfUEVSSVBIRVJBTF9NQVAJMHhGRkMwMEVBQwkvKiBETUEgQ2hhbm5lbCAxMCBQZXJpcGhlcmFsIE1hcCBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBETUExMF9DVVJSX1hfQ09VTlQJCTB4RkZDMDBFQjAJLyogRE1BIENoYW5uZWwgMTAgQ3VycmVudCBYIENvdW50IFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIERNQTEwX0NVUlJfWV9DT1VOVAkJMHhGRkMwMEVCOAkvKiBETUEgQ2hhbm5lbCAxMCBDdXJyZW50IFkgQ291bnQgUmVnaXN0ZXIJCQkJKi8KKworI2RlZmluZSBETUExMV9ORVhUX0RFU0NfUFRSCQkweEZGQzAwRUMwCS8qIERNQSBDaGFubmVsIDExIE5leHQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyCQkqLworI2RlZmluZSBETUExMV9TVEFSVF9BRERSCQkweEZGQzAwRUM0CS8qIERNQSBDaGFubmVsIDExIFN0YXJ0IEFkZHJlc3MgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgRE1BMTFfQ09ORklHCQkJMHhGRkMwMEVDOAkvKiBETUEgQ2hhbm5lbCAxMSBDb25maWd1cmF0aW9uIFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIERNQTExX1hfQ09VTlQJCQkweEZGQzAwRUQwCS8qIERNQSBDaGFubmVsIDExIFggQ291bnQgUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBETUExMV9YX01PRElGWQkJCTB4RkZDMDBFRDQJLyogRE1BIENoYW5uZWwgMTEgWCBNb2RpZnkgUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBETUExMV9ZX0NPVU5UCQkJMHhGRkMwMEVEOAkvKiBETUEgQ2hhbm5lbCAxMSBZIENvdW50IFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgRE1BMTFfWV9NT0RJRlkJCQkweEZGQzAwRURDCS8qIERNQSBDaGFubmVsIDExIFkgTW9kaWZ5IFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgRE1BMTFfQ1VSUl9ERVNDX1BUUgkJMHhGRkMwMEVFMAkvKiBETUEgQ2hhbm5lbCAxMSBDdXJyZW50IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlcgkqLworI2RlZmluZSBETUExMV9DVVJSX0FERFIJCQkweEZGQzAwRUU0CS8qIERNQSBDaGFubmVsIDExIEN1cnJlbnQgQWRkcmVzcyBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBETUExMV9JUlFfU1RBVFVTCQkweEZGQzAwRUU4CS8qIERNQSBDaGFubmVsIDExIEludGVycnVwdC9TdGF0dXMgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgRE1BMTFfUEVSSVBIRVJBTF9NQVAJMHhGRkMwMEVFQwkvKiBETUEgQ2hhbm5lbCAxMSBQZXJpcGhlcmFsIE1hcCBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBETUExMV9DVVJSX1hfQ09VTlQJCTB4RkZDMDBFRjAJLyogRE1BIENoYW5uZWwgMTEgQ3VycmVudCBYIENvdW50IFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIERNQTExX0NVUlJfWV9DT1VOVAkJMHhGRkMwMEVGOAkvKiBETUEgQ2hhbm5lbCAxMSBDdXJyZW50IFkgQ291bnQgUmVnaXN0ZXIJCQkJKi8KKworI2RlZmluZSBNRE1BX0QwX05FWFRfREVTQ19QVFIJMHhGRkMwMEYwMAkvKiBNZW1ETUEgU3RyZWFtIDAgRGVzdGluYXRpb24gTmV4dCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIJCSovCisjZGVmaW5lIE1ETUFfRDBfU1RBUlRfQUREUgkJMHhGRkMwMEYwNAkvKiBNZW1ETUEgU3RyZWFtIDAgRGVzdGluYXRpb24gU3RhcnQgQWRkcmVzcyBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBNRE1BX0QwX0NPTkZJRwkJCTB4RkZDMDBGMDgJLyogTWVtRE1BIFN0cmVhbSAwIERlc3RpbmF0aW9uIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgTURNQV9EMF9YX0NPVU5UCQkJMHhGRkMwMEYxMAkvKiBNZW1ETUEgU3RyZWFtIDAgRGVzdGluYXRpb24gWCBDb3VudCBSZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIE1ETUFfRDBfWF9NT0RJRlkJCTB4RkZDMDBGMTQJLyogTWVtRE1BIFN0cmVhbSAwIERlc3RpbmF0aW9uIFggTW9kaWZ5IFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBNRE1BX0QwX1lfQ09VTlQJCQkweEZGQzAwRjE4CS8qIE1lbURNQSBTdHJlYW0gMCBEZXN0aW5hdGlvbiBZIENvdW50IFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgTURNQV9EMF9ZX01PRElGWQkJMHhGRkMwMEYxQwkvKiBNZW1ETUEgU3RyZWFtIDAgRGVzdGluYXRpb24gWSBNb2RpZnkgUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIE1ETUFfRDBfQ1VSUl9ERVNDX1BUUgkweEZGQzAwRjIwCS8qIE1lbURNQSBTdHJlYW0gMCBEZXN0aW5hdGlvbiBDdXJyZW50IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlcgkqLworI2RlZmluZSBNRE1BX0QwX0NVUlJfQUREUgkJMHhGRkMwMEYyNAkvKiBNZW1ETUEgU3RyZWFtIDAgRGVzdGluYXRpb24gQ3VycmVudCBBZGRyZXNzIFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIE1ETUFfRDBfSVJRX1NUQVRVUwkJMHhGRkMwMEYyOAkvKiBNZW1ETUEgU3RyZWFtIDAgRGVzdGluYXRpb24gSW50ZXJydXB0L1N0YXR1cyBSZWdpc3RlcgkJCSovCisjZGVmaW5lIE1ETUFfRDBfUEVSSVBIRVJBTF9NQVAJMHhGRkMwMEYyQwkvKiBNZW1ETUEgU3RyZWFtIDAgRGVzdGluYXRpb24gUGVyaXBoZXJhbCBNYXAgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgTURNQV9EMF9DVVJSX1hfQ09VTlQJMHhGRkMwMEYzMAkvKiBNZW1ETUEgU3RyZWFtIDAgRGVzdGluYXRpb24gQ3VycmVudCBYIENvdW50IFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIE1ETUFfRDBfQ1VSUl9ZX0NPVU5UCTB4RkZDMDBGMzgJLyogTWVtRE1BIFN0cmVhbSAwIERlc3RpbmF0aW9uIEN1cnJlbnQgWSBDb3VudCBSZWdpc3RlcgkJCQkqLworCisjZGVmaW5lIE1ETUFfUzBfTkVYVF9ERVNDX1BUUgkweEZGQzAwRjQwCS8qIE1lbURNQSBTdHJlYW0gMCBTb3VyY2UgTmV4dCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIJCQkqLworI2RlZmluZSBNRE1BX1MwX1NUQVJUX0FERFIJCTB4RkZDMDBGNDQJLyogTWVtRE1BIFN0cmVhbSAwIFNvdXJjZSBTdGFydCBBZGRyZXNzIFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBNRE1BX1MwX0NPTkZJRwkJCTB4RkZDMDBGNDgJLyogTWVtRE1BIFN0cmVhbSAwIFNvdXJjZSBDb25maWd1cmF0aW9uIFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBNRE1BX1MwX1hfQ09VTlQJCQkweEZGQzAwRjUwCS8qIE1lbURNQSBTdHJlYW0gMCBTb3VyY2UgWCBDb3VudCBSZWdpc3RlcgkJCQkJCQkqLworI2RlZmluZSBNRE1BX1MwX1hfTU9ESUZZCQkweEZGQzAwRjU0CS8qIE1lbURNQSBTdHJlYW0gMCBTb3VyY2UgWCBNb2RpZnkgUmVnaXN0ZXIJCQkJCQkJKi8KKyNkZWZpbmUgTURNQV9TMF9ZX0NPVU5UCQkJMHhGRkMwMEY1OAkvKiBNZW1ETUEgU3RyZWFtIDAgU291cmNlIFkgQ291bnQgUmVnaXN0ZXIJCQkJCQkJKi8KKyNkZWZpbmUgTURNQV9TMF9ZX01PRElGWQkJMHhGRkMwMEY1QwkvKiBNZW1ETUEgU3RyZWFtIDAgU291cmNlIFkgTW9kaWZ5IFJlZ2lzdGVyCQkJCQkJCSovCisjZGVmaW5lIE1ETUFfUzBfQ1VSUl9ERVNDX1BUUgkweEZGQzAwRjYwCS8qIE1lbURNQSBTdHJlYW0gMCBTb3VyY2UgQ3VycmVudCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIJCSovCisjZGVmaW5lIE1ETUFfUzBfQ1VSUl9BRERSCQkweEZGQzAwRjY0CS8qIE1lbURNQSBTdHJlYW0gMCBTb3VyY2UgQ3VycmVudCBBZGRyZXNzIFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBNRE1BX1MwX0lSUV9TVEFUVVMJCTB4RkZDMDBGNjgJLyogTWVtRE1BIFN0cmVhbSAwIFNvdXJjZSBJbnRlcnJ1cHQvU3RhdHVzIFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBNRE1BX1MwX1BFUklQSEVSQUxfTUFQCTB4RkZDMDBGNkMJLyogTWVtRE1BIFN0cmVhbSAwIFNvdXJjZSBQZXJpcGhlcmFsIE1hcCBSZWdpc3RlcgkJCQkJKi8KKyNkZWZpbmUgTURNQV9TMF9DVVJSX1hfQ09VTlQJMHhGRkMwMEY3MAkvKiBNZW1ETUEgU3RyZWFtIDAgU291cmNlIEN1cnJlbnQgWCBDb3VudCBSZWdpc3RlcgkJCQkJKi8KKyNkZWZpbmUgTURNQV9TMF9DVVJSX1lfQ09VTlQJMHhGRkMwMEY3OAkvKiBNZW1ETUEgU3RyZWFtIDAgU291cmNlIEN1cnJlbnQgWSBDb3VudCBSZWdpc3RlcgkJCQkJKi8KKworI2RlZmluZSBNRE1BX0QxX05FWFRfREVTQ19QVFIJMHhGRkMwMEY4MAkvKiBNZW1ETUEgU3RyZWFtIDEgRGVzdGluYXRpb24gTmV4dCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIJCSovCisjZGVmaW5lIE1ETUFfRDFfU1RBUlRfQUREUgkJMHhGRkMwMEY4NAkvKiBNZW1ETUEgU3RyZWFtIDEgRGVzdGluYXRpb24gU3RhcnQgQWRkcmVzcyBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBNRE1BX0QxX0NPTkZJRwkJCTB4RkZDMDBGODgJLyogTWVtRE1BIFN0cmVhbSAxIERlc3RpbmF0aW9uIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgTURNQV9EMV9YX0NPVU5UCQkJMHhGRkMwMEY5MAkvKiBNZW1ETUEgU3RyZWFtIDEgRGVzdGluYXRpb24gWCBDb3VudCBSZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIE1ETUFfRDFfWF9NT0RJRlkJCTB4RkZDMDBGOTQJLyogTWVtRE1BIFN0cmVhbSAxIERlc3RpbmF0aW9uIFggTW9kaWZ5IFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBNRE1BX0QxX1lfQ09VTlQJCQkweEZGQzAwRjk4CS8qIE1lbURNQSBTdHJlYW0gMSBEZXN0aW5hdGlvbiBZIENvdW50IFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgTURNQV9EMV9ZX01PRElGWQkJMHhGRkMwMEY5QwkvKiBNZW1ETUEgU3RyZWFtIDEgRGVzdGluYXRpb24gWSBNb2RpZnkgUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIE1ETUFfRDFfQ1VSUl9ERVNDX1BUUgkweEZGQzAwRkEwCS8qIE1lbURNQSBTdHJlYW0gMSBEZXN0aW5hdGlvbiBDdXJyZW50IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlcgkqLworI2RlZmluZSBNRE1BX0QxX0NVUlJfQUREUgkJMHhGRkMwMEZBNAkvKiBNZW1ETUEgU3RyZWFtIDEgRGVzdGluYXRpb24gQ3VycmVudCBBZGRyZXNzIFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIE1ETUFfRDFfSVJRX1NUQVRVUwkJMHhGRkMwMEZBOAkvKiBNZW1ETUEgU3RyZWFtIDEgRGVzdGluYXRpb24gSW50ZXJydXB0L1N0YXR1cyBSZWdpc3RlcgkJCSovCisjZGVmaW5lIE1ETUFfRDFfUEVSSVBIRVJBTF9NQVAJMHhGRkMwMEZBQwkvKiBNZW1ETUEgU3RyZWFtIDEgRGVzdGluYXRpb24gUGVyaXBoZXJhbCBNYXAgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgTURNQV9EMV9DVVJSX1hfQ09VTlQJMHhGRkMwMEZCMAkvKiBNZW1ETUEgU3RyZWFtIDEgRGVzdGluYXRpb24gQ3VycmVudCBYIENvdW50IFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIE1ETUFfRDFfQ1VSUl9ZX0NPVU5UCTB4RkZDMDBGQjgJLyogTWVtRE1BIFN0cmVhbSAxIERlc3RpbmF0aW9uIEN1cnJlbnQgWSBDb3VudCBSZWdpc3RlcgkJCQkqLworCisjZGVmaW5lIE1ETUFfUzFfTkVYVF9ERVNDX1BUUgkweEZGQzAwRkMwCS8qIE1lbURNQSBTdHJlYW0gMSBTb3VyY2UgTmV4dCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIJCQkqLworI2RlZmluZSBNRE1BX1MxX1NUQVJUX0FERFIJCTB4RkZDMDBGQzQJLyogTWVtRE1BIFN0cmVhbSAxIFNvdXJjZSBTdGFydCBBZGRyZXNzIFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBNRE1BX1MxX0NPTkZJRwkJCTB4RkZDMDBGQzgJLyogTWVtRE1BIFN0cmVhbSAxIFNvdXJjZSBDb25maWd1cmF0aW9uIFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBNRE1BX1MxX1hfQ09VTlQJCQkweEZGQzAwRkQwCS8qIE1lbURNQSBTdHJlYW0gMSBTb3VyY2UgWCBDb3VudCBSZWdpc3RlcgkJCQkJCQkqLworI2RlZmluZSBNRE1BX1MxX1hfTU9ESUZZCQkweEZGQzAwRkQ0CS8qIE1lbURNQSBTdHJlYW0gMSBTb3VyY2UgWCBNb2RpZnkgUmVnaXN0ZXIJCQkJCQkJKi8KKyNkZWZpbmUgTURNQV9TMV9ZX0NPVU5UCQkJMHhGRkMwMEZEOAkvKiBNZW1ETUEgU3RyZWFtIDEgU291cmNlIFkgQ291bnQgUmVnaXN0ZXIJCQkJCQkJKi8KKyNkZWZpbmUgTURNQV9TMV9ZX01PRElGWQkJMHhGRkMwMEZEQwkvKiBNZW1ETUEgU3RyZWFtIDEgU291cmNlIFkgTW9kaWZ5IFJlZ2lzdGVyCQkJCQkJCSovCisjZGVmaW5lIE1ETUFfUzFfQ1VSUl9ERVNDX1BUUgkweEZGQzAwRkUwCS8qIE1lbURNQSBTdHJlYW0gMSBTb3VyY2UgQ3VycmVudCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIJCSovCisjZGVmaW5lIE1ETUFfUzFfQ1VSUl9BRERSCQkweEZGQzAwRkU0CS8qIE1lbURNQSBTdHJlYW0gMSBTb3VyY2UgQ3VycmVudCBBZGRyZXNzIFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBNRE1BX1MxX0lSUV9TVEFUVVMJCTB4RkZDMDBGRTgJLyogTWVtRE1BIFN0cmVhbSAxIFNvdXJjZSBJbnRlcnJ1cHQvU3RhdHVzIFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBNRE1BX1MxX1BFUklQSEVSQUxfTUFQCTB4RkZDMDBGRUMJLyogTWVtRE1BIFN0cmVhbSAxIFNvdXJjZSBQZXJpcGhlcmFsIE1hcCBSZWdpc3RlcgkJCQkJKi8KKyNkZWZpbmUgTURNQV9TMV9DVVJSX1hfQ09VTlQJMHhGRkMwMEZGMAkvKiBNZW1ETUEgU3RyZWFtIDEgU291cmNlIEN1cnJlbnQgWCBDb3VudCBSZWdpc3RlcgkJCQkJKi8KKyNkZWZpbmUgTURNQV9TMV9DVVJSX1lfQ09VTlQJMHhGRkMwMEZGOAkvKiBNZW1ETUEgU3RyZWFtIDEgU291cmNlIEN1cnJlbnQgWSBDb3VudCBSZWdpc3RlcgkJCQkJKi8KKworCisvKiBQYXJhbGxlbCBQZXJpcGhlcmFsIEludGVyZmFjZSAoMHhGRkMwMTAwMCAtIDB4RkZDMDEwRkYpCQkJCSovCisjZGVmaW5lIFBQSV9DT05UUk9MCQkJMHhGRkMwMTAwMAkvKiBQUEkgQ29udHJvbCBSZWdpc3RlcgkJCSovCisjZGVmaW5lIFBQSV9TVEFUVVMJCQkweEZGQzAxMDA0CS8qIFBQSSBTdGF0dXMgUmVnaXN0ZXIJCQkqLworI2RlZmluZSBQUElfQ09VTlQJCQkweEZGQzAxMDA4CS8qIFBQSSBUcmFuc2ZlciBDb3VudCBSZWdpc3RlcgkqLworI2RlZmluZSBQUElfREVMQVkJCQkweEZGQzAxMDBDCS8qIFBQSSBEZWxheSBDb3VudCBSZWdpc3RlcgkJKi8KKyNkZWZpbmUgUFBJX0ZSQU1FCQkJMHhGRkMwMTAxMAkvKiBQUEkgRnJhbWUgTGVuZ3RoIFJlZ2lzdGVyCSovCisKKworLyogVHdvLVdpcmUgSW50ZXJmYWNlCQkoMHhGRkMwMTQwMCAtIDB4RkZDMDE0RkYpCQkJCQkJCQkqLworI2RlZmluZSBUV0kwX1JFR0JBU0UJCQkweEZGQzAxNDAwCisjZGVmaW5lIFRXSTBfQ0xLRElWCQkJMHhGRkMwMTQwMAkvKiBTZXJpYWwgQ2xvY2sgRGl2aWRlciBSZWdpc3RlcgkJCSovCisjZGVmaW5lIFRXSTBfQ09OVFJPTAkJCTB4RkZDMDE0MDQJLyogVFdJIENvbnRyb2wgUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBUV0kwX1NMQVZFX0NUTAkJMHhGRkMwMTQwOAkvKiBTbGF2ZSBNb2RlIENvbnRyb2wgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgVFdJMF9TTEFWRV9TVEFUCQkweEZGQzAxNDBDCS8qIFNsYXZlIE1vZGUgU3RhdHVzIFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIFRXSTBfU0xBVkVfQUREUgkJMHhGRkMwMTQxMAkvKiBTbGF2ZSBNb2RlIEFkZHJlc3MgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgVFdJMF9NQVNURVJfQ1RMCQkweEZGQzAxNDE0CS8qIE1hc3RlciBNb2RlIENvbnRyb2wgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgVFdJMF9NQVNURVJfU1RBVAkJMHhGRkMwMTQxOAkvKiBNYXN0ZXIgTW9kZSBTdGF0dXMgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgVFdJMF9NQVNURVJfQUREUgkJMHhGRkMwMTQxQwkvKiBNYXN0ZXIgTW9kZSBBZGRyZXNzIFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIFRXSTBfSU5UX1NUQVQJCTB4RkZDMDE0MjAJLyogVFdJIEludGVycnVwdCBTdGF0dXMgUmVnaXN0ZXIJCQkqLworI2RlZmluZSBUV0kwX0lOVF9NQVNLCQkweEZGQzAxNDI0CS8qIFRXSSBNYXN0ZXIgSW50ZXJydXB0IE1hc2sgUmVnaXN0ZXIJCSovCisjZGVmaW5lIFRXSTBfRklGT19DVEwJCTB4RkZDMDE0MjgJLyogRklGTyBDb250cm9sIFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBUV0kwX0ZJRk9fU1RBVAkJMHhGRkMwMTQyQwkvKiBGSUZPIFN0YXR1cyBSZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIFRXSTBfWE1UX0RBVEE4CQkweEZGQzAxNDgwCS8qIEZJRk8gVHJhbnNtaXQgRGF0YSBTaW5nbGUgQnl0ZSBSZWdpc3RlcgkqLworI2RlZmluZSBUV0kwX1hNVF9EQVRBMTYJCTB4RkZDMDE0ODQJLyogRklGTyBUcmFuc21pdCBEYXRhIERvdWJsZSBCeXRlIFJlZ2lzdGVyCSovCisjZGVmaW5lIFRXSTBfUkNWX0RBVEE4CQkweEZGQzAxNDg4CS8qIEZJRk8gUmVjZWl2ZSBEYXRhIFNpbmdsZSBCeXRlIFJlZ2lzdGVyCSovCisjZGVmaW5lIFRXSTBfUkNWX0RBVEExNgkJMHhGRkMwMTQ4QwkvKiBGSUZPIFJlY2VpdmUgRGF0YSBEb3VibGUgQnl0ZSBSZWdpc3RlcgkqLworCisKKy8qIEdlbmVyYWwgUHVycG9zZSBJL08gUG9ydCBHICgweEZGQzAxNTAwIC0gMHhGRkMwMTVGRikJCQkJCQkJCQkJCQkqLworI2RlZmluZSBQT1JUR0lPCQkJCQkweEZGQzAxNTAwCS8qIFBvcnQgRyBJL08gUGluIFN0YXRlIFNwZWNpZnkgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgUE9SVEdJT19DTEVBUgkJCTB4RkZDMDE1MDQJLyogUG9ydCBHIEkvTyBQZXJpcGhlcmFsIEludGVycnVwdCBDbGVhciBSZWdpc3RlcgkJKi8KKyNkZWZpbmUgUE9SVEdJT19TRVQJCQkJMHhGRkMwMTUwOAkvKiBQb3J0IEcgSS9PIFBlcmlwaGVyYWwgSW50ZXJydXB0IFNldCBSZWdpc3RlcgkJCSovCisjZGVmaW5lIFBPUlRHSU9fVE9HR0xFCQkJMHhGRkMwMTUwQwkvKiBQb3J0IEcgSS9PIFBpbiBTdGF0ZSBUb2dnbGUgUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIFBPUlRHSU9fTUFTS0EJCQkweEZGQzAxNTEwCS8qIFBvcnQgRyBJL08gTWFzayBTdGF0ZSBTcGVjaWZ5IEludGVycnVwdCBBIFJlZ2lzdGVyCSovCisjZGVmaW5lIFBPUlRHSU9fTUFTS0FfQ0xFQVIJCTB4RkZDMDE1MTQJLyogUG9ydCBHIEkvTyBNYXNrIERpc2FibGUgSW50ZXJydXB0IEEgUmVnaXN0ZXIJCQkqLworI2RlZmluZSBQT1JUR0lPX01BU0tBX1NFVAkJMHhGRkMwMTUxOAkvKiBQb3J0IEcgSS9PIE1hc2sgRW5hYmxlIEludGVycnVwdCBBIFJlZ2lzdGVyCQkJKi8KKyNkZWZpbmUgUE9SVEdJT19NQVNLQV9UT0dHTEUJMHhGRkMwMTUxQwkvKiBQb3J0IEcgSS9PIE1hc2sgVG9nZ2xlIEVuYWJsZSBJbnRlcnJ1cHQgQSBSZWdpc3RlcgkqLworI2RlZmluZSBQT1JUR0lPX01BU0tCCQkJMHhGRkMwMTUyMAkvKiBQb3J0IEcgSS9PIE1hc2sgU3RhdGUgU3BlY2lmeSBJbnRlcnJ1cHQgQiBSZWdpc3RlcgkqLworI2RlZmluZSBQT1JUR0lPX01BU0tCX0NMRUFSCQkweEZGQzAxNTI0CS8qIFBvcnQgRyBJL08gTWFzayBEaXNhYmxlIEludGVycnVwdCBCIFJlZ2lzdGVyCQkJKi8KKyNkZWZpbmUgUE9SVEdJT19NQVNLQl9TRVQJCTB4RkZDMDE1MjgJLyogUG9ydCBHIEkvTyBNYXNrIEVuYWJsZSBJbnRlcnJ1cHQgQiBSZWdpc3RlcgkJCSovCisjZGVmaW5lIFBPUlRHSU9fTUFTS0JfVE9HR0xFCTB4RkZDMDE1MkMJLyogUG9ydCBHIEkvTyBNYXNrIFRvZ2dsZSBFbmFibGUgSW50ZXJydXB0IEIgUmVnaXN0ZXIJKi8KKyNkZWZpbmUgUE9SVEdJT19ESVIJCQkJMHhGRkMwMTUzMAkvKiBQb3J0IEcgSS9PIERpcmVjdGlvbiBSZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIFBPUlRHSU9fUE9MQVIJCQkweEZGQzAxNTM0CS8qIFBvcnQgRyBJL08gU291cmNlIFBvbGFyaXR5IFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBQT1JUR0lPX0VER0UJCQkweEZGQzAxNTM4CS8qIFBvcnQgRyBJL08gU291cmNlIFNlbnNpdGl2aXR5IFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIFBPUlRHSU9fQk9USAkJCTB4RkZDMDE1M0MJLyogUG9ydCBHIEkvTyBTZXQgb24gQk9USCBFZGdlcyBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBQT1JUR0lPX0lORU4JCQkweEZGQzAxNTQwCS8qIFBvcnQgRyBJL08gSW5wdXQgRW5hYmxlIFJlZ2lzdGVyCQkJCQkJKi8KKworCisvKiBHZW5lcmFsIFB1cnBvc2UgSS9PIFBvcnQgSCAoMHhGRkMwMTcwMCAtIDB4RkZDMDE3RkYpCQkJCQkJCQkJCQkJKi8KKyNkZWZpbmUgUE9SVEhJTwkJCQkJMHhGRkMwMTcwMAkvKiBQb3J0IEggSS9PIFBpbiBTdGF0ZSBTcGVjaWZ5IFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIFBPUlRISU9fQ0xFQVIJCQkweEZGQzAxNzA0CS8qIFBvcnQgSCBJL08gUGVyaXBoZXJhbCBJbnRlcnJ1cHQgQ2xlYXIgUmVnaXN0ZXIJCSovCisjZGVmaW5lIFBPUlRISU9fU0VUCQkJCTB4RkZDMDE3MDgJLyogUG9ydCBIIEkvTyBQZXJpcGhlcmFsIEludGVycnVwdCBTZXQgUmVnaXN0ZXIJCQkqLworI2RlZmluZSBQT1JUSElPX1RPR0dMRQkJCTB4RkZDMDE3MEMJLyogUG9ydCBIIEkvTyBQaW4gU3RhdGUgVG9nZ2xlIFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBQT1JUSElPX01BU0tBCQkJMHhGRkMwMTcxMAkvKiBQb3J0IEggSS9PIE1hc2sgU3RhdGUgU3BlY2lmeSBJbnRlcnJ1cHQgQSBSZWdpc3RlcgkqLworI2RlZmluZSBQT1JUSElPX01BU0tBX0NMRUFSCQkweEZGQzAxNzE0CS8qIFBvcnQgSCBJL08gTWFzayBEaXNhYmxlIEludGVycnVwdCBBIFJlZ2lzdGVyCQkJKi8KKyNkZWZpbmUgUE9SVEhJT19NQVNLQV9TRVQJCTB4RkZDMDE3MTgJLyogUG9ydCBIIEkvTyBNYXNrIEVuYWJsZSBJbnRlcnJ1cHQgQSBSZWdpc3RlcgkJCSovCisjZGVmaW5lIFBPUlRISU9fTUFTS0FfVE9HR0xFCTB4RkZDMDE3MUMJLyogUG9ydCBIIEkvTyBNYXNrIFRvZ2dsZSBFbmFibGUgSW50ZXJydXB0IEEgUmVnaXN0ZXIJKi8KKyNkZWZpbmUgUE9SVEhJT19NQVNLQgkJCTB4RkZDMDE3MjAJLyogUG9ydCBIIEkvTyBNYXNrIFN0YXRlIFNwZWNpZnkgSW50ZXJydXB0IEIgUmVnaXN0ZXIJKi8KKyNkZWZpbmUgUE9SVEhJT19NQVNLQl9DTEVBUgkJMHhGRkMwMTcyNAkvKiBQb3J0IEggSS9PIE1hc2sgRGlzYWJsZSBJbnRlcnJ1cHQgQiBSZWdpc3RlcgkJCSovCisjZGVmaW5lIFBPUlRISU9fTUFTS0JfU0VUCQkweEZGQzAxNzI4CS8qIFBvcnQgSCBJL08gTWFzayBFbmFibGUgSW50ZXJydXB0IEIgUmVnaXN0ZXIJCQkqLworI2RlZmluZSBQT1JUSElPX01BU0tCX1RPR0dMRQkweEZGQzAxNzJDCS8qIFBvcnQgSCBJL08gTWFzayBUb2dnbGUgRW5hYmxlIEludGVycnVwdCBCIFJlZ2lzdGVyCSovCisjZGVmaW5lIFBPUlRISU9fRElSCQkJCTB4RkZDMDE3MzAJLyogUG9ydCBIIEkvTyBEaXJlY3Rpb24gUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBQT1JUSElPX1BPTEFSCQkJMHhGRkMwMTczNAkvKiBQb3J0IEggSS9PIFNvdXJjZSBQb2xhcml0eSBSZWdpc3RlcgkJCQkJKi8KKyNkZWZpbmUgUE9SVEhJT19FREdFCQkJMHhGRkMwMTczOAkvKiBQb3J0IEggSS9PIFNvdXJjZSBTZW5zaXRpdml0eSBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBQT1JUSElPX0JPVEgJCQkweEZGQzAxNzNDCS8qIFBvcnQgSCBJL08gU2V0IG9uIEJPVEggRWRnZXMgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgUE9SVEhJT19JTkVOCQkJMHhGRkMwMTc0MAkvKiBQb3J0IEggSS9PIElucHV0IEVuYWJsZSBSZWdpc3RlcgkJCQkJCSovCisKKworLyogVUFSVDEgQ29udHJvbGxlcgkJKDB4RkZDMDIwMDAgLSAweEZGQzAyMEZGKQkJCQkJCQkJKi8KKyNkZWZpbmUgVUFSVDFfVEhSCQkJMHhGRkMwMjAwMAkvKiBUcmFuc21pdCBIb2xkaW5nIHJlZ2lzdGVyCQkJKi8KKyNkZWZpbmUgVUFSVDFfUkJSCQkJMHhGRkMwMjAwMAkvKiBSZWNlaXZlIEJ1ZmZlciByZWdpc3RlcgkJCQkqLworI2RlZmluZSBVQVJUMV9ETEwJCQkweEZGQzAyMDAwCS8qIERpdmlzb3IgTGF0Y2ggKExvdy1CeXRlKQkJCQkqLworI2RlZmluZSBVQVJUMV9JRVIJCQkweEZGQzAyMDA0CS8qIEludGVycnVwdCBFbmFibGUgUmVnaXN0ZXIJCQkqLworI2RlZmluZSBVQVJUMV9ETEgJCQkweEZGQzAyMDA0CS8qIERpdmlzb3IgTGF0Y2ggKEhpZ2gtQnl0ZSkJCQkqLworI2RlZmluZSBVQVJUMV9JSVIJCQkweEZGQzAyMDA4CS8qIEludGVycnVwdCBJZGVudGlmaWNhdGlvbiBSZWdpc3RlcgkqLworI2RlZmluZSBVQVJUMV9MQ1IJCQkweEZGQzAyMDBDCS8qIExpbmUgQ29udHJvbCBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBVQVJUMV9NQ1IJCQkweEZGQzAyMDEwCS8qIE1vZGVtIENvbnRyb2wgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgVUFSVDFfTFNSCQkJMHhGRkMwMjAxNAkvKiBMaW5lIFN0YXR1cyBSZWdpc3RlcgkJCQkJKi8KKyNkZWZpbmUgVUFSVDFfTVNSCQkJMHhGRkMwMjAxOAkvKiBNb2RlbSBTdGF0dXMgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgVUFSVDFfU0NSCQkJMHhGRkMwMjAxQwkvKiBTQ1IgU2NyYXRjaCBSZWdpc3RlcgkJCQkJKi8KKyNkZWZpbmUgVUFSVDFfR0NUTAkJCTB4RkZDMDIwMjQJLyogR2xvYmFsIENvbnRyb2wgUmVnaXN0ZXIJCQkJKi8KKworCisvKiBQaW4gQ29udHJvbCBSZWdpc3RlcnMJKDB4RkZDMDMyMDAgLSAweEZGQzAzMkZGKQkJCQkJCQkJCQkJKi8KKyNkZWZpbmUgUE9SVEZfRkVSCQkJMHhGRkMwMzIwMAkvKiBQb3J0IEYgRnVuY3Rpb24gRW5hYmxlIFJlZ2lzdGVyIChBbHRlcm5hdGUvRmxhZyopCSovCisjZGVmaW5lIFBPUlRHX0ZFUgkJCTB4RkZDMDMyMDQJLyogUG9ydCBHIEZ1bmN0aW9uIEVuYWJsZSBSZWdpc3RlciAoQWx0ZXJuYXRlL0ZsYWcqKQkqLworI2RlZmluZSBQT1JUSF9GRVIJCQkweEZGQzAzMjA4CS8qIFBvcnQgSCBGdW5jdGlvbiBFbmFibGUgUmVnaXN0ZXIgKEFsdGVybmF0ZS9GbGFnKikJKi8KKyNkZWZpbmUgQkZJTl9QT1JUX01VWAkJCTB4RkZDMDMyMEMJLyogUG9ydCBNdWx0aXBsZXhlciBDb250cm9sIFJlZ2lzdGVyCQkJCQkqLworCisKKy8qIEhhbmRzaGFrZSBNRE1BIFJlZ2lzdGVycwkoMHhGRkMwMzMwMCAtIDB4RkZDMDMzRkYpCQkJCQkJCQkJCSovCisjZGVmaW5lIEhNRE1BMF9DT05UUk9MCQkweEZGQzAzMzAwCS8qIEhhbmRzaGFrZSBNRE1BMCBDb250cm9sIFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBITURNQTBfRUNJTklUCQkweEZGQzAzMzA0CS8qIEhNRE1BMCBJbml0aWFsIEVkZ2UgQ291bnQgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgSE1ETUEwX0JDSU5JVAkJMHhGRkMwMzMwOAkvKiBITURNQTAgSW5pdGlhbCBCbG9jayBDb3VudCBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBITURNQTBfRUNVUkdFTlQJCTB4RkZDMDMzMEMJLyogSE1ETUEwIFVyZ2VudCBFZGdlIENvdW50IFRocmVzaG9sZCBSZWdpc3RlcgkJKi8KKyNkZWZpbmUgSE1ETUEwX0VDT1ZFUkZMT1cJMHhGRkMwMzMxMAkvKiBITURNQTAgRWRnZSBDb3VudCBPdmVyZmxvdyBJbnRlcnJ1cHQgUmVnaXN0ZXIJKi8KKyNkZWZpbmUgSE1ETUEwX0VDT1VOVAkJMHhGRkMwMzMxNAkvKiBITURNQTAgQ3VycmVudCBFZGdlIENvdW50IFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIEhNRE1BMF9CQ09VTlQJCTB4RkZDMDMzMTgJLyogSE1ETUEwIEN1cnJlbnQgQmxvY2sgQ291bnQgUmVnaXN0ZXIJCQkJKi8KKworI2RlZmluZSBITURNQTFfQ09OVFJPTAkJMHhGRkMwMzM0MAkvKiBIYW5kc2hha2UgTURNQTEgQ29udHJvbCBSZWdpc3RlcgkJCQkJKi8KKyNkZWZpbmUgSE1ETUExX0VDSU5JVAkJMHhGRkMwMzM0NAkvKiBITURNQTEgSW5pdGlhbCBFZGdlIENvdW50IFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIEhNRE1BMV9CQ0lOSVQJCTB4RkZDMDMzNDgJLyogSE1ETUExIEluaXRpYWwgQmxvY2sgQ291bnQgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgSE1ETUExX0VDVVJHRU5UCQkweEZGQzAzMzRDCS8qIEhNRE1BMSBVcmdlbnQgRWRnZSBDb3VudCBUaHJlc2hvbGQgUmVnaXN0ZXIJCSovCisjZGVmaW5lIEhNRE1BMV9FQ09WRVJGTE9XCTB4RkZDMDMzNTAJLyogSE1ETUExIEVkZ2UgQ291bnQgT3ZlcmZsb3cgSW50ZXJydXB0IFJlZ2lzdGVyCSovCisjZGVmaW5lIEhNRE1BMV9FQ09VTlQJCTB4RkZDMDMzNTQJLyogSE1ETUExIEN1cnJlbnQgRWRnZSBDb3VudCBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBITURNQTFfQkNPVU5UCQkweEZGQzAzMzU4CS8qIEhNRE1BMSBDdXJyZW50IEJsb2NrIENvdW50IFJlZ2lzdGVyCQkJCSovCisKKworLyogR1BJTyBQSU4gbXV4ICgweEZGQzAzMjEwIC0gT3hGRkMwMzI4OCkgKi8KKyNkZWZpbmUgUE9SVEZfTVVYICAgICAgICAgICAgICAgMHhGRkMwMzIxMCAgICAgIC8qIFBvcnQgRiBtdXggY29udHJvbCAqLworI2RlZmluZSBQT1JUR19NVVggICAgICAgICAgICAgICAweEZGQzAzMjE0ICAgICAgLyogUG9ydCBHIG11eCBjb250cm9sICovCisjZGVmaW5lIFBPUlRIX01VWCAgICAgICAgICAgICAgIDB4RkZDMDMyMTggICAgICAvKiBQb3J0IEggbXV4IGNvbnRyb2wgKi8KKyNkZWZpbmUgUE9SVEZfRFJJVkUgICAgICAgICAgICAgMHhGRkMwMzIyMCAgICAgIC8qIFBvcnQgRiBkcml2ZSBzdHJlbmd0aCBjb250cm9sICovCisjZGVmaW5lIFBPUlRHX0RSSVZFICAgICAgICAgICAgIDB4RkZDMDMyMjQgICAgICAvKiBQb3J0IEcgZHJpdmUgc3RyZW5ndGggY29udHJvbCAqLworI2RlZmluZSBQT1JUSF9EUklWRSAgICAgICAgICAgICAweEZGQzAzMjI4ICAgICAgLyogUG9ydCBIIGRyaXZlIHN0cmVuZ3RoIGNvbnRyb2wgKi8KKyNkZWZpbmUgUE9SVEZfU0xFVyAgICAgICAgICAgICAgMHhGRkMwMzIzMCAgICAgIC8qIFBvcnQgRiBzbGV3IGNvbnRyb2wgKi8KKyNkZWZpbmUgUE9SVEdfU0xFVyAgICAgICAgICAgICAgMHhGRkMwMzIzNCAgICAgIC8qIFBvcnQgRyBzbGV3IGNvbnRyb2wgKi8KKyNkZWZpbmUgUE9SVEhfU0xFVyAgICAgICAgICAgICAgMHhGRkMwMzIzOCAgICAgIC8qIFBvcnQgSCBzbGV3IGNvbnRyb2wgKi8KKyNkZWZpbmUgUE9SVEZfSFlTVEVSSVNJUyAgICAgICAgMHhGRkMwMzI0MCAgICAgIC8qIFBvcnQgRiBTY2htaXR0IHRyaWdnZXIgY29udHJvbCAqLworI2RlZmluZSBQT1JUR19IWVNURVJJU0lTICAgICAgICAweEZGQzAzMjQ0ICAgICAgLyogUG9ydCBHIFNjaG1pdHQgdHJpZ2dlciBjb250cm9sICovCisjZGVmaW5lIFBPUlRIX0hZU1RFUklTSVMgICAgICAgIDB4RkZDMDMyNDggICAgICAvKiBQb3J0IEggU2NobWl0dCB0cmlnZ2VyIGNvbnRyb2wgKi8KKyNkZWZpbmUgTUlTQ1BPUlRfRFJJVkUgICAgICAgICAgMHhGRkMwMzI4MCAgICAgIC8qIE1pc2MgUG9ydCBkcml2ZSBzdHJlbmd0aCBjb250cm9sICovCisjZGVmaW5lIE1JU0NQT1JUX1NMRVcgICAgICAgICAgIDB4RkZDMDMyODQgICAgICAvKiBNaXNjIFBvcnQgc2xldyBjb250cm9sICovCisjZGVmaW5lIE1JU0NQT1JUX0hZU1RFUklTSVMgICAgIDB4RkZDMDMyODggICAgICAvKiBNaXNjIFBvcnQgU2NobWl0dCB0cmlnZ2VyIGNvbnRyb2wgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqIFN5c3RlbSBNTVIgUmVnaXN0ZXIgQml0cyBBbmQgTWFjcm9zCisqKgorKiogRGlzY2xhaW1lcjoJQWxsIG1hY3JvcyBhcmUgaW50ZW5kZWQgdG8gbWFrZSBDIGFuZCBBc3NlbWJseSBjb2RlIG1vcmUgcmVhZGFibGUuCisqKgkJCQlVc2UgdGhlc2UgbWFjcm9zIGNhcmVmdWxseSwgYXMgYW55IHRoYXQgZG8gbGVmdCBzaGlmdHMgZm9yIGZpZWxkCisqKgkJCQlkZXBvc2l0aW5nIHdpbGwgcmVzdWx0IGluIHRoZSBsb3dlciBvcmRlciBiaXRzIGJlaW5nIGRlc3Ryb3llZC4gIEFueQorKioJCQkJbWFjcm8gdGhhdCBzaGlmdHMgbGVmdCB0byBwcm9wZXJseSBwb3NpdGlvbiB0aGUgYml0LWZpZWxkIHNob3VsZCBiZQorKioJCQkJdXNlZCBhcyBwYXJ0IG9mIGFuIE9SIHRvIGluaXRpYWxpemUgYSByZWdpc3RlciBhbmQgTk9UIGFzIGEgZHluYW1pYworKioJCQkJbW9kaWZpZXIgVU5MRVNTIHRoZSBsb3dlciBvcmRlciBiaXRzIGFyZSBzYXZlZCBhbmQgT1JlZCBiYWNrIGluIHdoZW4KKyoqCQkJCXRoZSBtYWNybyBpcyB1c2VkLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogQ0hJUElEIE1hc2tzICovCisjZGVmaW5lIENISVBJRF9WRVJTSU9OICAgICAgICAgMHhGMDAwMDAwMAorI2RlZmluZSBDSElQSURfRkFNSUxZICAgICAgICAgIDB4MEZGRkYwMDAKKyNkZWZpbmUgQ0hJUElEX01BTlVGQUNUVVJFICAgICAweDAwMDAwRkZFCisKKy8qIFNXUlNUIE1hc2tzCQkJCQkJCQkJCQkJCQkJCQkJKi8KKyNkZWZpbmUgU1lTVEVNX1JFU0VUCQkweDAwMDcJLyogSW5pdGlhdGVzIEEgU3lzdGVtIFNvZnR3YXJlIFJlc2V0CQkJKi8KKyNkZWZpbmUJRE9VQkxFX0ZBVUxUCQkweDAwMDgJLyogQ29yZSBEb3VibGUgRmF1bHQgQ2F1c2VzIFJlc2V0CQkJCSovCisjZGVmaW5lIFJFU0VUX0RPVUJMRQkJMHgyMDAwCS8qIFNXIFJlc2V0IEdlbmVyYXRlZCBCeSBDb3JlIERvdWJsZS1GYXVsdAkJKi8KKyNkZWZpbmUgUkVTRVRfV0RPRwkJCTB4NDAwMAkvKiBTVyBSZXNldCBHZW5lcmF0ZWQgQnkgV2F0Y2hkb2cgVGltZXIJCQkqLworI2RlZmluZSBSRVNFVF9TT0ZUV0FSRQkJMHg4MDAwCS8qIFNXIFJlc2V0IE9jY3VycmVkIFNpbmNlIExhc3QgUmVhZCBPZiBTV1JTVAkqLworCisvKiBTWVNDUiBNYXNrcwkJCQkJCQkJCQkJCQkJCQkJCQkJKi8KKyNkZWZpbmUgQk1PREUJCQkJMHgwMDA3CS8qIEJvb3QgTW9kZSAtIExhdGNoZWQgRHVyaW5nIEhXIFJlc2V0IEZyb20gTW9kZSBQaW5zCSovCisjZGVmaW5lCU5PQk9PVAkJCQkweDAwMTAJLyogRXhlY3V0ZSBGcm9tIEwxIG9yIEFTWU5DIEJhbmsgMCBXaGVuIEJNT0RFID0gMAkJKi8KKworCisvKiAqKioqKioqKioqKioqICBTWVNURU0gSU5URVJSVVBUIENPTlRST0xMRVIgTUFTS1MgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFBlcmlwaGVyYWwgTWFza3MgRm9yIFNJQ19JU1IsIFNJQ19JV1IsIFNJQ19JTUFTSwkJCQkJCQkJCQkqLworCisjaWYgMAorI2RlZmluZSBJUlFfUExMX1dBS0VVUAkweDAwMDAwMDAxCS8qIFBMTCBXYWtldXAgSW50ZXJydXB0CQkJIAkJCQkJKi8KKworI2RlZmluZSBJUlFfRVJST1IxICAgICAgMHgwMDAwMDAwMiAgLyogRXJyb3IgSW50ZXJydXB0IChETUEsIERNQVJ4IEJsb2NrLCBETUFSeCBPdmVyZmxvdykgKi8KKyNkZWZpbmUgSVJRX0VSUk9SMiAgICAgIDB4MDAwMDAwMDQgIC8qIEVycm9yIEludGVycnVwdCAoQ0FOLCBFdGhlcm5ldCwgU1BPUlR4LCBQUEksIFNQSSwgVUFSVHgpICovCisjZGVmaW5lIElSUV9SVEMJCQkweDAwMDAwMDA4CS8qIFJlYWwgVGltZSBDbG9jayBJbnRlcnJ1cHQgCQkJCQkJKi8KKyNkZWZpbmUgSVJRX0RNQTAJCTB4MDAwMDAwMTAJLyogRE1BIENoYW5uZWwgMCAoUFBJKSBJbnRlcnJ1cHQgCQkJCQkqLworI2RlZmluZSBJUlFfRE1BMwkJMHgwMDAwMDAyMAkvKiBETUEgQ2hhbm5lbCAzIChTUE9SVDAgUlgpIEludGVycnVwdCAJCQkJKi8KKyNkZWZpbmUgSVJRX0RNQTQJCTB4MDAwMDAwNDAJLyogRE1BIENoYW5uZWwgNCAoU1BPUlQwIFRYKSBJbnRlcnJ1cHQgCQkJCSovCisjZGVmaW5lIElSUV9ETUE1CQkweDAwMDAwMDgwCS8qIERNQSBDaGFubmVsIDUgKFNQT1JUMSBSWCkgSW50ZXJydXB0IAkJCQkqLworCisjZGVmaW5lIElSUV9ETUE2CQkweDAwMDAwMTAwCS8qIERNQSBDaGFubmVsIDYgKFNQT1JUMSBUWCkgSW50ZXJydXB0IAkJIAkJKi8KKyNkZWZpbmUgSVJRX1RXSQkJCTB4MDAwMDAyMDAJLyogVFdJIEludGVycnVwdAkJCQkJCQkJCSovCisjZGVmaW5lIElSUV9ETUE3CQkweDAwMDAwNDAwCS8qIERNQSBDaGFubmVsIDcgKFNQSSkgSW50ZXJydXB0IAkJCQkJKi8KKyNkZWZpbmUgSVJRX0RNQTgJCTB4MDAwMDA4MDAJLyogRE1BIENoYW5uZWwgOCAoVUFSVDAgUlgpIEludGVycnVwdCAJCQkJKi8KKyNkZWZpbmUgSVJRX0RNQTkJCTB4MDAwMDEwMDAJLyogRE1BIENoYW5uZWwgOSAoVUFSVDAgVFgpIEludGVycnVwdCAJCQkJKi8KKyNkZWZpbmUgSVJRX0RNQTEwCQkweDAwMDAyMDAwCS8qIERNQSBDaGFubmVsIDEwIChVQVJUMSBSWCkgSW50ZXJydXB0IAkJCQkqLworI2RlZmluZSBJUlFfRE1BMTEJCTB4MDAwMDQwMDAJLyogRE1BIENoYW5uZWwgMTEgKFVBUlQxIFRYKSBJbnRlcnJ1cHQgCQkJCSovCisjZGVmaW5lIElSUV9DQU5fUlgJCTB4MDAwMDgwMDAJLyogQ0FOIFJlY2VpdmUgSW50ZXJydXB0IAkJCQkJCQkqLworCisjZGVmaW5lIElSUV9DQU5fVFgJCTB4MDAwMTAwMDAJLyogQ0FOIFRyYW5zbWl0IEludGVycnVwdCAgCQkJCQkJCSovCisjZGVmaW5lIElSUV9ETUExCQkweDAwMDIwMDAwCS8qIERNQSBDaGFubmVsIDEgKEV0aGVybmV0IFJYKSBJbnRlcnJ1cHQgCQkJKi8KKyNkZWZpbmUgSVJRX1BGQV9QT1JUSAkweDAwMDIwMDAwCS8qIFBGIFBvcnQgSCAoUEY0NzozMikgSW50ZXJydXB0IEEgCQkJCQkqLworI2RlZmluZSBJUlFfRE1BMgkJMHgwMDA0MDAwMAkvKiBETUEgQ2hhbm5lbCAyIChFdGhlcm5ldCBUWCkgSW50ZXJydXB0IAkJCSovCisjZGVmaW5lIElSUV9QRkJfUE9SVEgJMHgwMDA0MDAwMAkvKiBQRiBQb3J0IEggKFBGNDc6MzIpIEludGVycnVwdCBCIAkJCQkJKi8KKyNkZWZpbmUgSVJRX1RJTUVSMAkJMHgwMDA4MDAwMAkvKiBUaW1lciAwIEludGVycnVwdAkJCQkJCQkJKi8KKyNkZWZpbmUgSVJRX1RJTUVSMQkJMHgwMDEwMDAwMAkvKiBUaW1lciAxIEludGVycnVwdCAJCQkJCQkJCSovCisjZGVmaW5lIElSUV9USU1FUjIJCTB4MDAyMDAwMDAJLyogVGltZXIgMiBJbnRlcnJ1cHQgCQkJCQkJCQkqLworI2RlZmluZSBJUlFfVElNRVIzCQkweDAwNDAwMDAwCS8qIFRpbWVyIDMgSW50ZXJydXB0IAkJCQkJCQkJKi8KKyNkZWZpbmUgSVJRX1RJTUVSNAkJMHgwMDgwMDAwMAkvKiBUaW1lciA0IEludGVycnVwdCAJCQkJCQkJCSovCisKKyNkZWZpbmUgSVJRX1RJTUVSNQkJMHgwMTAwMDAwMAkvKiBUaW1lciA1IEludGVycnVwdCAJCQkJCQkJCSovCisjZGVmaW5lIElSUV9USU1FUjYJCTB4MDIwMDAwMDAJLyogVGltZXIgNiBJbnRlcnJ1cHQgCQkJCQkJCQkqLworI2RlZmluZSBJUlFfVElNRVI3CQkweDA0MDAwMDAwCS8qIFRpbWVyIDcgSW50ZXJydXB0IAkJCQkJCQkJKi8KKyNkZWZpbmUgSVJRX1BGQV9QT1JURkcJMHgwODAwMDAwMAkvKiBQRiBQb3J0cyBGJkcgKFBGMzE6MCkgSW50ZXJydXB0IEEgCQkJCSovCisjZGVmaW5lIElSUV9QRkJfUE9SVEYJMHg4MDAwMDAwMAkvKiBQRiBQb3J0IEYgKFBGMTU6MCkgSW50ZXJydXB0IEIgCQkJCQkqLworI2RlZmluZSBJUlFfRE1BMTIJCTB4MjAwMDAwMDAJLyogRE1BIENoYW5uZWxzIDEyIChNRE1BMSBTb3VyY2UpIFJYIEludGVycnVwdCAJCSovCisjZGVmaW5lIElSUV9ETUExMwkJMHgyMDAwMDAwMAkvKiBETUEgQ2hhbm5lbHMgMTMgKE1ETUExIERlc3RpbmF0aW9uKSBUWCBJbnRlcnJ1cHQgKi8KKyNkZWZpbmUgSVJRX0RNQTE0CQkweDQwMDAwMDAwCS8qIERNQSBDaGFubmVscyAxNCAoTURNQTAgU291cmNlKSBSWCBJbnRlcnJ1cHQgCQkqLworI2RlZmluZSBJUlFfRE1BMTUJCTB4NDAwMDAwMDAJLyogRE1BIENoYW5uZWxzIDE1IChNRE1BMCBEZXN0aW5hdGlvbikgVFggSW50ZXJydXB0ICovCisjZGVmaW5lIElSUV9XRE9HCQkweDgwMDAwMDAwCS8qIFNvZnR3YXJlIFdhdGNoZG9nIFRpbWVyIEludGVycnVwdCAJCQkJKi8KKyNkZWZpbmUgSVJRX1BGQl9QT1JURwkweDEwMDAwMDAwCS8qIFBGIFBvcnQgRyAoUEYzMToxNikgSW50ZXJydXB0IEIgCQkJCQkqLworI2VuZGlmCisKKy8qIFNJQ19JQVIwIE1hY3JvcwkJCQkJCQkJCQkJCQkJCSovCisjZGVmaW5lIFAwX0lWRyh4KQkJKCgoeCkmMHhGKS03KQkJCS8qIFBlcmlwaGVyYWwgIzAgYXNzaWduZWQgSVZHICN4IAkqLworI2RlZmluZSBQMV9JVkcoeCkJCSgoKHgpJjB4RiktNykgPDwgMHg0CS8qIFBlcmlwaGVyYWwgIzEgYXNzaWduZWQgSVZHICN4IAkqLworI2RlZmluZSBQMl9JVkcoeCkJCSgoKHgpJjB4RiktNykgPDwgMHg4CS8qIFBlcmlwaGVyYWwgIzIgYXNzaWduZWQgSVZHICN4IAkqLworI2RlZmluZSBQM19JVkcoeCkJCSgoKHgpJjB4RiktNykgPDwgMHhDCS8qIFBlcmlwaGVyYWwgIzMgYXNzaWduZWQgSVZHICN4CSovCisjZGVmaW5lIFA0X0lWRyh4KQkJKCgoeCkmMHhGKS03KSA8PCAweDEwCS8qIFBlcmlwaGVyYWwgIzQgYXNzaWduZWQgSVZHICN4CSovCisjZGVmaW5lIFA1X0lWRyh4KQkJKCgoeCkmMHhGKS03KSA8PCAweDE0CS8qIFBlcmlwaGVyYWwgIzUgYXNzaWduZWQgSVZHICN4CSovCisjZGVmaW5lIFA2X0lWRyh4KQkJKCgoeCkmMHhGKS03KSA8PCAweDE4CS8qIFBlcmlwaGVyYWwgIzYgYXNzaWduZWQgSVZHICN4CSovCisjZGVmaW5lIFA3X0lWRyh4KQkJKCgoeCkmMHhGKS03KSA8PCAweDFDCS8qIFBlcmlwaGVyYWwgIzcgYXNzaWduZWQgSVZHICN4CSovCisKKy8qIFNJQ19JQVIxIE1hY3JvcwkJCQkJCQkJCQkJCQkJCSovCisjZGVmaW5lIFA4X0lWRyh4KQkJKCgoeCkmMHhGKS03KQkJCS8qIFBlcmlwaGVyYWwgIzggYXNzaWduZWQgSVZHICN4IAkqLworI2RlZmluZSBQOV9JVkcoeCkJCSgoKHgpJjB4RiktNykgPDwgMHg0CS8qIFBlcmlwaGVyYWwgIzkgYXNzaWduZWQgSVZHICN4IAkqLworI2RlZmluZSBQMTBfSVZHKHgpCQkoKCh4KSYweEYpLTcpIDw8IDB4OAkvKiBQZXJpcGhlcmFsICMxMCBhc3NpZ25lZCBJVkcgI3gJKi8KKyNkZWZpbmUgUDExX0lWRyh4KQkJKCgoeCkmMHhGKS03KSA8PCAweEMJLyogUGVyaXBoZXJhbCAjMTEgYXNzaWduZWQgSVZHICN4IAkqLworI2RlZmluZSBQMTJfSVZHKHgpCQkoKCh4KSYweEYpLTcpIDw8IDB4MTAJLyogUGVyaXBoZXJhbCAjMTIgYXNzaWduZWQgSVZHICN4CSovCisjZGVmaW5lIFAxM19JVkcoeCkJCSgoKHgpJjB4RiktNykgPDwgMHgxNAkvKiBQZXJpcGhlcmFsICMxMyBhc3NpZ25lZCBJVkcgI3gJKi8KKyNkZWZpbmUgUDE0X0lWRyh4KQkJKCgoeCkmMHhGKS03KSA8PCAweDE4CS8qIFBlcmlwaGVyYWwgIzE0IGFzc2lnbmVkIElWRyAjeAkqLworI2RlZmluZSBQMTVfSVZHKHgpCQkoKCh4KSYweEYpLTcpIDw8IDB4MUMJLyogUGVyaXBoZXJhbCAjMTUgYXNzaWduZWQgSVZHICN4CSovCisKKy8qIFNJQ19JQVIyIE1hY3JvcwkJCQkJCQkJCQkJCQkJCSovCisjZGVmaW5lIFAxNl9JVkcoeCkJCSgoKHgpJjB4RiktNykJCQkvKiBQZXJpcGhlcmFsICMxNiBhc3NpZ25lZCBJVkcgI3gJKi8KKyNkZWZpbmUgUDE3X0lWRyh4KQkJKCgoeCkmMHhGKS03KSA8PCAweDQJLyogUGVyaXBoZXJhbCAjMTcgYXNzaWduZWQgSVZHICN4CSovCisjZGVmaW5lIFAxOF9JVkcoeCkJCSgoKHgpJjB4RiktNykgPDwgMHg4CS8qIFBlcmlwaGVyYWwgIzE4IGFzc2lnbmVkIElWRyAjeAkqLworI2RlZmluZSBQMTlfSVZHKHgpCQkoKCh4KSYweEYpLTcpIDw8IDB4QwkvKiBQZXJpcGhlcmFsICMxOSBhc3NpZ25lZCBJVkcgI3gJKi8KKyNkZWZpbmUgUDIwX0lWRyh4KQkJKCgoeCkmMHhGKS03KSA8PCAweDEwCS8qIFBlcmlwaGVyYWwgIzIwIGFzc2lnbmVkIElWRyAjeAkqLworI2RlZmluZSBQMjFfSVZHKHgpCQkoKCh4KSYweEYpLTcpIDw8IDB4MTQJLyogUGVyaXBoZXJhbCAjMjEgYXNzaWduZWQgSVZHICN4CSovCisjZGVmaW5lIFAyMl9JVkcoeCkJCSgoKHgpJjB4RiktNykgPDwgMHgxOAkvKiBQZXJpcGhlcmFsICMyMiBhc3NpZ25lZCBJVkcgI3gJKi8KKyNkZWZpbmUgUDIzX0lWRyh4KQkJKCgoeCkmMHhGKS03KSA8PCAweDFDCS8qIFBlcmlwaGVyYWwgIzIzIGFzc2lnbmVkIElWRyAjeAkqLworCisvKiBTSUNfSUFSMyBNYWNyb3MJCQkJCQkJCQkJCQkJCQkqLworI2RlZmluZSBQMjRfSVZHKHgpCQkoKCh4KSYweEYpLTcpCQkJLyogUGVyaXBoZXJhbCAjMjQgYXNzaWduZWQgSVZHICN4CSovCisjZGVmaW5lIFAyNV9JVkcoeCkJCSgoKHgpJjB4RiktNykgPDwgMHg0CS8qIFBlcmlwaGVyYWwgIzI1IGFzc2lnbmVkIElWRyAjeAkqLworI2RlZmluZSBQMjZfSVZHKHgpCQkoKCh4KSYweEYpLTcpIDw8IDB4OAkvKiBQZXJpcGhlcmFsICMyNiBhc3NpZ25lZCBJVkcgI3gJKi8KKyNkZWZpbmUgUDI3X0lWRyh4KQkJKCgoeCkmMHhGKS03KSA8PCAweEMJLyogUGVyaXBoZXJhbCAjMjcgYXNzaWduZWQgSVZHICN4CSovCisjZGVmaW5lIFAyOF9JVkcoeCkJCSgoKHgpJjB4RiktNykgPDwgMHgxMAkvKiBQZXJpcGhlcmFsICMyOCBhc3NpZ25lZCBJVkcgI3gJKi8KKyNkZWZpbmUgUDI5X0lWRyh4KQkJKCgoeCkmMHhGKS03KSA8PCAweDE0CS8qIFBlcmlwaGVyYWwgIzI5IGFzc2lnbmVkIElWRyAjeAkqLworI2RlZmluZSBQMzBfSVZHKHgpCQkoKCh4KSYweEYpLTcpIDw8IDB4MTgJLyogUGVyaXBoZXJhbCAjMzAgYXNzaWduZWQgSVZHICN4CSovCisjZGVmaW5lIFAzMV9JVkcoeCkJCSgoKHgpJjB4RiktNykgPDwgMHgxQwkvKiBQZXJpcGhlcmFsICMzMSBhc3NpZ25lZCBJVkcgI3gJKi8KKworCisvKiBTSUNfSU1BU0sgTWFza3MJCQkJCQkJCQkJCQkJCQkJCQkqLworI2RlZmluZSBTSUNfVU5NQVNLX0FMTAkweDAwMDAwMDAwCQkJCQkvKiBVbm1hc2sgYWxsIHBlcmlwaGVyYWwgaW50ZXJydXB0cwkqLworI2RlZmluZSBTSUNfTUFTS19BTEwJMHhGRkZGRkZGRgkJCQkJLyogTWFzayBhbGwgcGVyaXBoZXJhbCBpbnRlcnJ1cHRzCSovCisjZGVmaW5lIFNJQ19NQVNLKHgpCQkoMSA8PCAoKHgpJjB4MUYpKQkJCQkJLyogTWFzayBQZXJpcGhlcmFsICN4IGludGVycnVwdAkJKi8KKyNkZWZpbmUgU0lDX1VOTUFTSyh4KQkoMHhGRkZGRkZGRiBeICgxIDw8ICgoeCkmMHgxRikpKQkvKiBVbm1hc2sgUGVyaXBoZXJhbCAjeCBpbnRlcnJ1cHQJKi8KKworLyogU0lDX0lXUiBNYXNrcwkJCQkJCQkJCQkJCQkJCQkJCSovCisjZGVmaW5lIElXUl9ESVNBQkxFX0FMTAkweDAwMDAwMDAwCQkJCQkvKiBXYWtldXAgRGlzYWJsZSBhbGwgcGVyaXBoZXJhbHMJKi8KKyNkZWZpbmUgSVdSX0VOQUJMRV9BTEwJMHhGRkZGRkZGRgkJCQkJLyogV2FrZXVwIEVuYWJsZSBhbGwgcGVyaXBoZXJhbHMJKi8KKyNkZWZpbmUgSVdSX0VOQUJMRSh4KQkoMSA8PCAoKHgpJjB4MUYpKQkJCQkJLyogV2FrZXVwIEVuYWJsZSBQZXJpcGhlcmFsICN4CQkqLworI2RlZmluZSBJV1JfRElTQUJMRSh4KQkoMHhGRkZGRkZGRiBeICgxIDw8ICgoeCkmMHgxRikpKSAJLyogV2FrZXVwIERpc2FibGUgUGVyaXBoZXJhbCAjeAkJKi8KKworLyogICoqKioqKioqKioqKioqKiogIEdFTkVSQUwgUFVSUE9TRSBUSU1FUiBNQVNLUyAgKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFRJTUVSX0VOQUJMRSBNYXNrcwkJCQkJCQkJCQkJCQkqLworI2RlZmluZSBUSU1FTjAJCQkweDAwMDEJCS8qIEVuYWJsZSBUaW1lciAwCQkJCQkqLworI2RlZmluZSBUSU1FTjEJCQkweDAwMDIJCS8qIEVuYWJsZSBUaW1lciAxCQkJCQkqLworI2RlZmluZSBUSU1FTjIJCQkweDAwMDQJCS8qIEVuYWJsZSBUaW1lciAyCQkJCQkqLworI2RlZmluZSBUSU1FTjMJCQkweDAwMDgJCS8qIEVuYWJsZSBUaW1lciAzCQkJCQkqLworI2RlZmluZSBUSU1FTjQJCQkweDAwMTAJCS8qIEVuYWJsZSBUaW1lciA0CQkJCQkqLworI2RlZmluZSBUSU1FTjUJCQkweDAwMjAJCS8qIEVuYWJsZSBUaW1lciA1CQkJCQkqLworI2RlZmluZSBUSU1FTjYJCQkweDAwNDAJCS8qIEVuYWJsZSBUaW1lciA2CQkJCQkqLworI2RlZmluZSBUSU1FTjcJCQkweDAwODAJCS8qIEVuYWJsZSBUaW1lciA3CQkJCQkqLworCisvKiBUSU1FUl9ESVNBQkxFIE1hc2tzCQkJCQkJCQkJCQkJCSovCisjZGVmaW5lIFRJTURJUzAJCQlUSU1FTjAJCS8qIERpc2FibGUgVGltZXIgMAkJCQkJKi8KKyNkZWZpbmUgVElNRElTMQkJCVRJTUVOMQkJLyogRGlzYWJsZSBUaW1lciAxCQkJCQkqLworI2RlZmluZSBUSU1ESVMyCQkJVElNRU4yCQkvKiBEaXNhYmxlIFRpbWVyIDIJCQkJCSovCisjZGVmaW5lIFRJTURJUzMJCQlUSU1FTjMJCS8qIERpc2FibGUgVGltZXIgMwkJCQkJKi8KKyNkZWZpbmUgVElNRElTNAkJCVRJTUVONAkJLyogRGlzYWJsZSBUaW1lciA0CQkJCQkqLworI2RlZmluZSBUSU1ESVM1CQkJVElNRU41CQkvKiBEaXNhYmxlIFRpbWVyIDUJCQkJCSovCisjZGVmaW5lIFRJTURJUzYJCQlUSU1FTjYJCS8qIERpc2FibGUgVGltZXIgNgkJCQkJKi8KKyNkZWZpbmUgVElNRElTNwkJCVRJTUVONwkJLyogRGlzYWJsZSBUaW1lciA3CQkJCQkqLworCisvKiBUSU1FUl9TVEFUVVMgTWFza3MJCQkJCQkJCQkJCQkJKi8KKyNkZWZpbmUgVElNSUwwCQkJMHgwMDAwMDAwMQkvKiBUaW1lciAwIEludGVycnVwdAkJCQkqLworI2RlZmluZSBUSU1JTDEJCQkweDAwMDAwMDAyCS8qIFRpbWVyIDEgSW50ZXJydXB0CQkJCSovCisjZGVmaW5lIFRJTUlMMgkJCTB4MDAwMDAwMDQJLyogVGltZXIgMiBJbnRlcnJ1cHQJCQkJKi8KKyNkZWZpbmUgVElNSUwzCQkJMHgwMDAwMDAwOAkvKiBUaW1lciAzIEludGVycnVwdAkJCQkqLworI2RlZmluZSBUT1ZGX0VSUjAJCTB4MDAwMDAwMTAJLyogVGltZXIgMCBDb3VudGVyIE92ZXJmbG93CQkJKi8KKyNkZWZpbmUgVE9WRl9FUlIxCQkweDAwMDAwMDIwCS8qIFRpbWVyIDEgQ291bnRlciBPdmVyZmxvdwkJCSovCisjZGVmaW5lIFRPVkZfRVJSMgkJMHgwMDAwMDA0MAkvKiBUaW1lciAyIENvdW50ZXIgT3ZlcmZsb3cJCQkqLworI2RlZmluZSBUT1ZGX0VSUjMJCTB4MDAwMDAwODAJLyogVGltZXIgMyBDb3VudGVyIE92ZXJmbG93CQkJKi8KKyNkZWZpbmUgVFJVTjAJCQkweDAwMDAxMDAwCS8qIFRpbWVyIDAgU2xhdmUgRW5hYmxlIFN0YXR1cwkJKi8KKyNkZWZpbmUgVFJVTjEJCQkweDAwMDAyMDAwCS8qIFRpbWVyIDEgU2xhdmUgRW5hYmxlIFN0YXR1cwkJKi8KKyNkZWZpbmUgVFJVTjIJCQkweDAwMDA0MDAwCS8qIFRpbWVyIDIgU2xhdmUgRW5hYmxlIFN0YXR1cwkJKi8KKyNkZWZpbmUgVFJVTjMJCQkweDAwMDA4MDAwCS8qIFRpbWVyIDMgU2xhdmUgRW5hYmxlIFN0YXR1cwkJKi8KKyNkZWZpbmUgVElNSUw0CQkJMHgwMDAxMDAwMAkvKiBUaW1lciA0IEludGVycnVwdAkJCQkqLworI2RlZmluZSBUSU1JTDUJCQkweDAwMDIwMDAwCS8qIFRpbWVyIDUgSW50ZXJydXB0CQkJCSovCisjZGVmaW5lIFRJTUlMNgkJCTB4MDAwNDAwMDAJLyogVGltZXIgNiBJbnRlcnJ1cHQJCQkJKi8KKyNkZWZpbmUgVElNSUw3CQkJMHgwMDA4MDAwMAkvKiBUaW1lciA3IEludGVycnVwdAkJCQkqLworI2RlZmluZSBUT1ZGX0VSUjQJCTB4MDAxMDAwMDAJLyogVGltZXIgNCBDb3VudGVyIE92ZXJmbG93CQkJKi8KKyNkZWZpbmUgVE9WRl9FUlI1CQkweDAwMjAwMDAwCS8qIFRpbWVyIDUgQ291bnRlciBPdmVyZmxvdwkJCSovCisjZGVmaW5lIFRPVkZfRVJSNgkJMHgwMDQwMDAwMAkvKiBUaW1lciA2IENvdW50ZXIgT3ZlcmZsb3cJCQkqLworI2RlZmluZSBUT1ZGX0VSUjcJCTB4MDA4MDAwMDAJLyogVGltZXIgNyBDb3VudGVyIE92ZXJmbG93CQkJKi8KKyNkZWZpbmUgVFJVTjQJCQkweDEwMDAwMDAwCS8qIFRpbWVyIDQgU2xhdmUgRW5hYmxlIFN0YXR1cwkJKi8KKyNkZWZpbmUgVFJVTjUJCQkweDIwMDAwMDAwCS8qIFRpbWVyIDUgU2xhdmUgRW5hYmxlIFN0YXR1cwkJKi8KKyNkZWZpbmUgVFJVTjYJCQkweDQwMDAwMDAwCS8qIFRpbWVyIDYgU2xhdmUgRW5hYmxlIFN0YXR1cwkJKi8KKyNkZWZpbmUgVFJVTjcJCQkweDgwMDAwMDAwCS8qIFRpbWVyIDcgU2xhdmUgRW5hYmxlIFN0YXR1cwkJKi8KKworLyogQWx0ZXJuYXRlIERlcHJlY2F0ZWQgTWFjcm9zIFByb3ZpZGVkIEZvciBCYWNrd2FyZHMgQ29kZSBDb21wYXRpYmlsaXR5ICovCisjZGVmaW5lIFRPVkxfRVJSMCBUT1ZGX0VSUjAKKyNkZWZpbmUgVE9WTF9FUlIxIFRPVkZfRVJSMQorI2RlZmluZSBUT1ZMX0VSUjIgVE9WRl9FUlIyCisjZGVmaW5lIFRPVkxfRVJSMyBUT1ZGX0VSUjMKKyNkZWZpbmUgVE9WTF9FUlI0IFRPVkZfRVJSNAorI2RlZmluZSBUT1ZMX0VSUjUgVE9WRl9FUlI1CisjZGVmaW5lIFRPVkxfRVJSNiBUT1ZGX0VSUjYKKyNkZWZpbmUgVE9WTF9FUlI3IFRPVkZfRVJSNworCisvKiBUSU1FUnhfQ09ORklHIE1hc2tzCQkJCQkJCQkJCQkJCSovCisjZGVmaW5lIFBXTV9PVVQJCQkweDAwMDEJLyogUHVsc2UtV2lkdGggTW9kdWxhdGlvbiBPdXRwdXQgTW9kZQkqLworI2RlZmluZSBXRFRIX0NBUAkJMHgwMDAyCS8qIFdpZHRoIENhcHR1cmUgSW5wdXQgTW9kZQkJCQkqLworI2RlZmluZSBFWFRfQ0xLCQkJMHgwMDAzCS8qIEV4dGVybmFsIENsb2NrIE1vZGUJCQkJCSovCisjZGVmaW5lIFBVTFNFX0hJCQkweDAwMDQJLyogQWN0aW9uIFB1bHNlIChQb3NpdGl2ZS9OZWdhdGl2ZSopCSovCisjZGVmaW5lIFBFUklPRF9DTlQJCTB4MDAwOAkvKiBQZXJpb2QgQ291bnQJCQkJCQkJKi8KKyNkZWZpbmUgSVJRX0VOQQkJCTB4MDAxMAkvKiBJbnRlcnJ1cHQgUmVxdWVzdCBFbmFibGUJCQkJKi8KKyNkZWZpbmUgVElOX1NFTAkJCTB4MDAyMAkvKiBUaW1lciBJbnB1dCBTZWxlY3QJCQkJCSovCisjZGVmaW5lIE9VVF9ESVMJCQkweDAwNDAJLyogT3V0cHV0IFBhZCBEaXNhYmxlCQkJCQkqLworI2RlZmluZSBDTEtfU0VMCQkJMHgwMDgwCS8qIFRpbWVyIENsb2NrIFNlbGVjdAkJCQkJKi8KKyNkZWZpbmUgVE9HR0xFX0hJCQkweDAxMDAJLyogUFdNX09VVCBQVUxTRV9ISSBUb2dnbGUgTW9kZQkJCSovCisjZGVmaW5lIEVNVV9SVU4JCQkweDAyMDAJLyogRW11bGF0aW9uIEJlaGF2aW9yIFNlbGVjdAkJCSovCisjZGVmaW5lIEVSUl9UWVAJCQkweEMwMDAJLyogRXJyb3IgVHlwZQkJCQkJCQkqLworCisvKiAqKioqKioqKioqKioqKioqKioqKiogIEFTWU5DSFJPTk9VUyBNRU1PUlkgQ09OVFJPTExFUiBNQVNLUyAgKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEVCSVVfQU1HQ1RMIE1hc2tzCQkJCQkJCQkJCQkJCQkJCQkqLworI2RlZmluZSBBTUNLRU4JCQkweDAwMDEJCS8qIEVuYWJsZSBDTEtPVVQJCQkJCQkJCQkqLworI2RlZmluZQlBTUJFTl9OT05FCQkweDAwMDAJCS8qIEFsbCBCYW5rcyBEaXNhYmxlZAkJCQkJCQkJKi8KKyNkZWZpbmUgQU1CRU5fQjAJCTB4MDAwMgkJLyogRW5hYmxlIEFzeW5jIE1lbW9yeSBCYW5rIDAgb25seQkJCQkJKi8KKyNkZWZpbmUgQU1CRU5fQjBfQjEJCTB4MDAwNAkJLyogRW5hYmxlIEFzeW5jIE1lbW9yeSBCYW5rcyAwICYgMSBvbmx5CQkJCSovCisjZGVmaW5lIEFNQkVOX0IwX0IxX0IyCTB4MDAwNgkJLyogRW5hYmxlIEFzeW5jIE1lbW9yeSBCYW5rcyAwLCAxLCBhbmQgMgkJCSovCisjZGVmaW5lIEFNQkVOX0FMTAkJMHgwMDA4CQkvKiBFbmFibGUgQXN5bmMgTWVtb3J5IEJhbmtzIChhbGwpIDAsIDEsIDIsIGFuZCAzCSovCisKKy8qIEVCSVVfQU1CQ1RMMCBNYXNrcwkJCQkJCQkJCQkJCQkJCQkJKi8KKyNkZWZpbmUgQjBSRFlFTgkJCTB4MDAwMDAwMDEgIC8qIEJhbmsgMCAoQjApIFJEWSBFbmFibGUJCQkJCQkJKi8KKyNkZWZpbmUgQjBSRFlQT0wJCTB4MDAwMDAwMDIgIC8qIEIwIFJEWSBBY3RpdmUgSGlnaAkJCQkJCQkJKi8KKyNkZWZpbmUgQjBUVF8xCQkJMHgwMDAwMDAwNCAgLyogQjAgVHJhbnNpdGlvbiBUaW1lIChSZWFkIHRvIFdyaXRlKSA9IDEgY3ljbGUJCSovCisjZGVmaW5lIEIwVFRfMgkJCTB4MDAwMDAwMDggIC8qIEIwIFRyYW5zaXRpb24gVGltZSAoUmVhZCB0byBXcml0ZSkgPSAyIGN5Y2xlcwkqLworI2RlZmluZSBCMFRUXzMJCQkweDAwMDAwMDBDICAvKiBCMCBUcmFuc2l0aW9uIFRpbWUgKFJlYWQgdG8gV3JpdGUpID0gMyBjeWNsZXMJKi8KKyNkZWZpbmUgQjBUVF80CQkJMHgwMDAwMDAwMCAgLyogQjAgVHJhbnNpdGlvbiBUaW1lIChSZWFkIHRvIFdyaXRlKSA9IDQgY3ljbGVzCSovCisjZGVmaW5lIEIwU1RfMQkJCTB4MDAwMDAwMTAgIC8qIEIwIFNldHVwIFRpbWUgKEFPRSB0byBSZWFkL1dyaXRlKSA9IDEgY3ljbGUJCSovCisjZGVmaW5lIEIwU1RfMgkJCTB4MDAwMDAwMjAgIC8qIEIwIFNldHVwIFRpbWUgKEFPRSB0byBSZWFkL1dyaXRlKSA9IDIgY3ljbGVzCQkqLworI2RlZmluZSBCMFNUXzMJCQkweDAwMDAwMDMwICAvKiBCMCBTZXR1cCBUaW1lIChBT0UgdG8gUmVhZC9Xcml0ZSkgPSAzIGN5Y2xlcwkJKi8KKyNkZWZpbmUgQjBTVF80CQkJMHgwMDAwMDAwMCAgLyogQjAgU2V0dXAgVGltZSAoQU9FIHRvIFJlYWQvV3JpdGUpID0gNCBjeWNsZXMJCSovCisjZGVmaW5lIEIwSFRfMQkJCTB4MDAwMDAwNDAgIC8qIEIwIEhvbGQgVGltZSAoflJlYWQvV3JpdGUgdG8gfkFPRSkgPSAxIGN5Y2xlCQkqLworI2RlZmluZSBCMEhUXzIJCQkweDAwMDAwMDgwICAvKiBCMCBIb2xkIFRpbWUgKH5SZWFkL1dyaXRlIHRvIH5BT0UpID0gMiBjeWNsZXMJKi8KKyNkZWZpbmUgQjBIVF8zCQkJMHgwMDAwMDBDMCAgLyogQjAgSG9sZCBUaW1lICh+UmVhZC9Xcml0ZSB0byB+QU9FKSA9IDMgY3ljbGVzCSovCisjZGVmaW5lIEIwSFRfMAkJCTB4MDAwMDAwMDAgIC8qIEIwIEhvbGQgVGltZSAoflJlYWQvV3JpdGUgdG8gfkFPRSkgPSAwIGN5Y2xlcwkqLworI2RlZmluZSBCMFJBVF8xCQkJMHgwMDAwMDEwMCAgLyogQjAgUmVhZCBBY2Nlc3MgVGltZSA9IDEgY3ljbGUJCQkJCSovCisjZGVmaW5lIEIwUkFUXzIJCQkweDAwMDAwMjAwICAvKiBCMCBSZWFkIEFjY2VzcyBUaW1lID0gMiBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIwUkFUXzMJCQkweDAwMDAwMzAwICAvKiBCMCBSZWFkIEFjY2VzcyBUaW1lID0gMyBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIwUkFUXzQJCQkweDAwMDAwNDAwICAvKiBCMCBSZWFkIEFjY2VzcyBUaW1lID0gNCBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIwUkFUXzUJCQkweDAwMDAwNTAwICAvKiBCMCBSZWFkIEFjY2VzcyBUaW1lID0gNSBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIwUkFUXzYJCQkweDAwMDAwNjAwICAvKiBCMCBSZWFkIEFjY2VzcyBUaW1lID0gNiBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIwUkFUXzcJCQkweDAwMDAwNzAwICAvKiBCMCBSZWFkIEFjY2VzcyBUaW1lID0gNyBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIwUkFUXzgJCQkweDAwMDAwODAwICAvKiBCMCBSZWFkIEFjY2VzcyBUaW1lID0gOCBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIwUkFUXzkJCQkweDAwMDAwOTAwICAvKiBCMCBSZWFkIEFjY2VzcyBUaW1lID0gOSBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIwUkFUXzEwCQkweDAwMDAwQTAwICAvKiBCMCBSZWFkIEFjY2VzcyBUaW1lID0gMTAgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMFJBVF8xMQkJMHgwMDAwMEIwMCAgLyogQjAgUmVhZCBBY2Nlc3MgVGltZSA9IDExIGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjBSQVRfMTIJCTB4MDAwMDBDMDAgIC8qIEIwIFJlYWQgQWNjZXNzIFRpbWUgPSAxMiBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIwUkFUXzEzCQkweDAwMDAwRDAwICAvKiBCMCBSZWFkIEFjY2VzcyBUaW1lID0gMTMgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMFJBVF8xNAkJMHgwMDAwMEUwMCAgLyogQjAgUmVhZCBBY2Nlc3MgVGltZSA9IDE0IGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjBSQVRfMTUJCTB4MDAwMDBGMDAgIC8qIEIwIFJlYWQgQWNjZXNzIFRpbWUgPSAxNSBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIwV0FUXzEJCQkweDAwMDAxMDAwICAvKiBCMCBXcml0ZSBBY2Nlc3MgVGltZSA9IDEgY3ljbGUJCQkJCSovCisjZGVmaW5lIEIwV0FUXzIJCQkweDAwMDAyMDAwICAvKiBCMCBXcml0ZSBBY2Nlc3MgVGltZSA9IDIgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMFdBVF8zCQkJMHgwMDAwMzAwMCAgLyogQjAgV3JpdGUgQWNjZXNzIFRpbWUgPSAzIGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjBXQVRfNAkJCTB4MDAwMDQwMDAgIC8qIEIwIFdyaXRlIEFjY2VzcyBUaW1lID0gNCBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIwV0FUXzUJCQkweDAwMDA1MDAwICAvKiBCMCBXcml0ZSBBY2Nlc3MgVGltZSA9IDUgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMFdBVF82CQkJMHgwMDAwNjAwMCAgLyogQjAgV3JpdGUgQWNjZXNzIFRpbWUgPSA2IGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjBXQVRfNwkJCTB4MDAwMDcwMDAgIC8qIEIwIFdyaXRlIEFjY2VzcyBUaW1lID0gNyBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIwV0FUXzgJCQkweDAwMDA4MDAwICAvKiBCMCBXcml0ZSBBY2Nlc3MgVGltZSA9IDggY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMFdBVF85CQkJMHgwMDAwOTAwMCAgLyogQjAgV3JpdGUgQWNjZXNzIFRpbWUgPSA5IGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjBXQVRfMTAJCTB4MDAwMEEwMDAgIC8qIEIwIFdyaXRlIEFjY2VzcyBUaW1lID0gMTAgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMFdBVF8xMQkJMHgwMDAwQjAwMCAgLyogQjAgV3JpdGUgQWNjZXNzIFRpbWUgPSAxMSBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIwV0FUXzEyCQkweDAwMDBDMDAwICAvKiBCMCBXcml0ZSBBY2Nlc3MgVGltZSA9IDEyIGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjBXQVRfMTMJCTB4MDAwMEQwMDAgIC8qIEIwIFdyaXRlIEFjY2VzcyBUaW1lID0gMTMgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMFdBVF8xNAkJMHgwMDAwRTAwMCAgLyogQjAgV3JpdGUgQWNjZXNzIFRpbWUgPSAxNCBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIwV0FUXzE1CQkweDAwMDBGMDAwICAvKiBCMCBXcml0ZSBBY2Nlc3MgVGltZSA9IDE1IGN5Y2xlcwkJCQkJKi8KKworI2RlZmluZSBCMVJEWUVOCQkJMHgwMDAxMDAwMCAgLyogQmFuayAxIChCMSkgUkRZIEVuYWJsZSAgICAgICAgICAgICAgICAgICAgICAgCSovCisjZGVmaW5lIEIxUkRZUE9MCQkweDAwMDIwMDAwICAvKiBCMSBSRFkgQWN0aXZlIEhpZ2ggICAgICAgICAgICAgICAgICAgICAgICAgICAJKi8KKyNkZWZpbmUgQjFUVF8xCQkJMHgwMDA0MDAwMCAgLyogQjEgVHJhbnNpdGlvbiBUaW1lIChSZWFkIHRvIFdyaXRlKSA9IDEgY3ljbGUgCSovCisjZGVmaW5lIEIxVFRfMgkJCTB4MDAwODAwMDAgIC8qIEIxIFRyYW5zaXRpb24gVGltZSAoUmVhZCB0byBXcml0ZSkgPSAyIGN5Y2xlcwkqLworI2RlZmluZSBCMVRUXzMJCQkweDAwMEMwMDAwICAvKiBCMSBUcmFuc2l0aW9uIFRpbWUgKFJlYWQgdG8gV3JpdGUpID0gMyBjeWNsZXMJKi8KKyNkZWZpbmUgQjFUVF80CQkJMHgwMDAwMDAwMCAgLyogQjEgVHJhbnNpdGlvbiBUaW1lIChSZWFkIHRvIFdyaXRlKSA9IDQgY3ljbGVzCSovCisjZGVmaW5lIEIxU1RfMQkJCTB4MDAxMDAwMDAgIC8qIEIxIFNldHVwIFRpbWUgKEFPRSB0byBSZWFkL1dyaXRlKSA9IDEgY3ljbGUgIAkqLworI2RlZmluZSBCMVNUXzIJCQkweDAwMjAwMDAwICAvKiBCMSBTZXR1cCBUaW1lIChBT0UgdG8gUmVhZC9Xcml0ZSkgPSAyIGN5Y2xlcyAJKi8KKyNkZWZpbmUgQjFTVF8zCQkJMHgwMDMwMDAwMCAgLyogQjEgU2V0dXAgVGltZSAoQU9FIHRvIFJlYWQvV3JpdGUpID0gMyBjeWNsZXMgCSovCisjZGVmaW5lIEIxU1RfNAkJCTB4MDAwMDAwMDAgIC8qIEIxIFNldHVwIFRpbWUgKEFPRSB0byBSZWFkL1dyaXRlKSA9IDQgY3ljbGVzIAkqLworI2RlZmluZSBCMUhUXzEJCQkweDAwNDAwMDAwICAvKiBCMSBIb2xkIFRpbWUgKH5SZWFkL1dyaXRlIHRvIH5BT0UpID0gMSBjeWNsZSAJKi8KKyNkZWZpbmUgQjFIVF8yCQkJMHgwMDgwMDAwMCAgLyogQjEgSG9sZCBUaW1lICh+UmVhZC9Xcml0ZSB0byB+QU9FKSA9IDIgY3ljbGVzCSovCisjZGVmaW5lIEIxSFRfMwkJCTB4MDBDMDAwMDAgIC8qIEIxIEhvbGQgVGltZSAoflJlYWQvV3JpdGUgdG8gfkFPRSkgPSAzIGN5Y2xlcwkqLworI2RlZmluZSBCMUhUXzAJCQkweDAwMDAwMDAwICAvKiBCMSBIb2xkIFRpbWUgKH5SZWFkL1dyaXRlIHRvIH5BT0UpID0gMCBjeWNsZXMJKi8KKyNkZWZpbmUgQjFSQVRfMQkJCTB4MDEwMDAwMDAgIC8qIEIxIFJlYWQgQWNjZXNzIFRpbWUgPSAxIGN5Y2xlCQkJCQkqLworI2RlZmluZSBCMVJBVF8yCQkJMHgwMjAwMDAwMCAgLyogQjEgUmVhZCBBY2Nlc3MgVGltZSA9IDIgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMVJBVF8zCQkJMHgwMzAwMDAwMCAgLyogQjEgUmVhZCBBY2Nlc3MgVGltZSA9IDMgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMVJBVF80CQkJMHgwNDAwMDAwMCAgLyogQjEgUmVhZCBBY2Nlc3MgVGltZSA9IDQgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMVJBVF81CQkJMHgwNTAwMDAwMCAgLyogQjEgUmVhZCBBY2Nlc3MgVGltZSA9IDUgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMVJBVF82CQkJMHgwNjAwMDAwMCAgLyogQjEgUmVhZCBBY2Nlc3MgVGltZSA9IDYgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMVJBVF83CQkJMHgwNzAwMDAwMCAgLyogQjEgUmVhZCBBY2Nlc3MgVGltZSA9IDcgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMVJBVF84CQkJMHgwODAwMDAwMCAgLyogQjEgUmVhZCBBY2Nlc3MgVGltZSA9IDggY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMVJBVF85CQkJMHgwOTAwMDAwMCAgLyogQjEgUmVhZCBBY2Nlc3MgVGltZSA9IDkgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMVJBVF8xMAkJMHgwQTAwMDAwMCAgLyogQjEgUmVhZCBBY2Nlc3MgVGltZSA9IDEwIGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjFSQVRfMTEJCTB4MEIwMDAwMDAgIC8qIEIxIFJlYWQgQWNjZXNzIFRpbWUgPSAxMSBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIxUkFUXzEyCQkweDBDMDAwMDAwICAvKiBCMSBSZWFkIEFjY2VzcyBUaW1lID0gMTIgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMVJBVF8xMwkJMHgwRDAwMDAwMCAgLyogQjEgUmVhZCBBY2Nlc3MgVGltZSA9IDEzIGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjFSQVRfMTQJCTB4MEUwMDAwMDAgIC8qIEIxIFJlYWQgQWNjZXNzIFRpbWUgPSAxNCBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIxUkFUXzE1CQkweDBGMDAwMDAwICAvKiBCMSBSZWFkIEFjY2VzcyBUaW1lID0gMTUgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMVdBVF8xCQkJMHgxMDAwMDAwMCAgLyogQjEgV3JpdGUgQWNjZXNzIFRpbWUgPSAxIGN5Y2xlCQkJCQkqLworI2RlZmluZSBCMVdBVF8yCQkJMHgyMDAwMDAwMCAgLyogQjEgV3JpdGUgQWNjZXNzIFRpbWUgPSAyIGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjFXQVRfMwkJCTB4MzAwMDAwMDAgIC8qIEIxIFdyaXRlIEFjY2VzcyBUaW1lID0gMyBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIxV0FUXzQJCQkweDQwMDAwMDAwICAvKiBCMSBXcml0ZSBBY2Nlc3MgVGltZSA9IDQgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMVdBVF81CQkJMHg1MDAwMDAwMCAgLyogQjEgV3JpdGUgQWNjZXNzIFRpbWUgPSA1IGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjFXQVRfNgkJCTB4NjAwMDAwMDAgIC8qIEIxIFdyaXRlIEFjY2VzcyBUaW1lID0gNiBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIxV0FUXzcJCQkweDcwMDAwMDAwICAvKiBCMSBXcml0ZSBBY2Nlc3MgVGltZSA9IDcgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMVdBVF84CQkJMHg4MDAwMDAwMCAgLyogQjEgV3JpdGUgQWNjZXNzIFRpbWUgPSA4IGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjFXQVRfOQkJCTB4OTAwMDAwMDAgIC8qIEIxIFdyaXRlIEFjY2VzcyBUaW1lID0gOSBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIxV0FUXzEwCQkweEEwMDAwMDAwICAvKiBCMSBXcml0ZSBBY2Nlc3MgVGltZSA9IDEwIGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjFXQVRfMTEJCTB4QjAwMDAwMDAgIC8qIEIxIFdyaXRlIEFjY2VzcyBUaW1lID0gMTEgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMVdBVF8xMgkJMHhDMDAwMDAwMCAgLyogQjEgV3JpdGUgQWNjZXNzIFRpbWUgPSAxMiBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIxV0FUXzEzCQkweEQwMDAwMDAwICAvKiBCMSBXcml0ZSBBY2Nlc3MgVGltZSA9IDEzIGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjFXQVRfMTQJCTB4RTAwMDAwMDAgIC8qIEIxIFdyaXRlIEFjY2VzcyBUaW1lID0gMTQgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMVdBVF8xNQkJMHhGMDAwMDAwMCAgLyogQjEgV3JpdGUgQWNjZXNzIFRpbWUgPSAxNSBjeWNsZXMJCQkJCSovCisKKy8qIEVCSVVfQU1CQ1RMMSBNYXNrcwkJCQkJCQkJCQkJCQkJCQkJKi8KKyNkZWZpbmUgQjJSRFlFTgkJCTB4MDAwMDAwMDEgIC8qIEJhbmsgMiAoQjIpIFJEWSBFbmFibGUJCQkJCQkJKi8KKyNkZWZpbmUgQjJSRFlQT0wJCTB4MDAwMDAwMDIgIC8qIEIyIFJEWSBBY3RpdmUgSGlnaAkJCQkJCQkJKi8KKyNkZWZpbmUgQjJUVF8xCQkJMHgwMDAwMDAwNCAgLyogQjIgVHJhbnNpdGlvbiBUaW1lIChSZWFkIHRvIFdyaXRlKSA9IDEgY3ljbGUJCSovCisjZGVmaW5lIEIyVFRfMgkJCTB4MDAwMDAwMDggIC8qIEIyIFRyYW5zaXRpb24gVGltZSAoUmVhZCB0byBXcml0ZSkgPSAyIGN5Y2xlcwkqLworI2RlZmluZSBCMlRUXzMJCQkweDAwMDAwMDBDICAvKiBCMiBUcmFuc2l0aW9uIFRpbWUgKFJlYWQgdG8gV3JpdGUpID0gMyBjeWNsZXMJKi8KKyNkZWZpbmUgQjJUVF80CQkJMHgwMDAwMDAwMCAgLyogQjIgVHJhbnNpdGlvbiBUaW1lIChSZWFkIHRvIFdyaXRlKSA9IDQgY3ljbGVzCSovCisjZGVmaW5lIEIyU1RfMQkJCTB4MDAwMDAwMTAgIC8qIEIyIFNldHVwIFRpbWUgKEFPRSB0byBSZWFkL1dyaXRlKSA9IDEgY3ljbGUJCSovCisjZGVmaW5lIEIyU1RfMgkJCTB4MDAwMDAwMjAgIC8qIEIyIFNldHVwIFRpbWUgKEFPRSB0byBSZWFkL1dyaXRlKSA9IDIgY3ljbGVzCQkqLworI2RlZmluZSBCMlNUXzMJCQkweDAwMDAwMDMwICAvKiBCMiBTZXR1cCBUaW1lIChBT0UgdG8gUmVhZC9Xcml0ZSkgPSAzIGN5Y2xlcwkJKi8KKyNkZWZpbmUgQjJTVF80CQkJMHgwMDAwMDAwMCAgLyogQjIgU2V0dXAgVGltZSAoQU9FIHRvIFJlYWQvV3JpdGUpID0gNCBjeWNsZXMJCSovCisjZGVmaW5lIEIySFRfMQkJCTB4MDAwMDAwNDAgIC8qIEIyIEhvbGQgVGltZSAoflJlYWQvV3JpdGUgdG8gfkFPRSkgPSAxIGN5Y2xlCQkqLworI2RlZmluZSBCMkhUXzIJCQkweDAwMDAwMDgwICAvKiBCMiBIb2xkIFRpbWUgKH5SZWFkL1dyaXRlIHRvIH5BT0UpID0gMiBjeWNsZXMJKi8KKyNkZWZpbmUgQjJIVF8zCQkJMHgwMDAwMDBDMCAgLyogQjIgSG9sZCBUaW1lICh+UmVhZC9Xcml0ZSB0byB+QU9FKSA9IDMgY3ljbGVzCSovCisjZGVmaW5lIEIySFRfMAkJCTB4MDAwMDAwMDAgIC8qIEIyIEhvbGQgVGltZSAoflJlYWQvV3JpdGUgdG8gfkFPRSkgPSAwIGN5Y2xlcwkqLworI2RlZmluZSBCMlJBVF8xCQkJMHgwMDAwMDEwMCAgLyogQjIgUmVhZCBBY2Nlc3MgVGltZSA9IDEgY3ljbGUJCQkJCSovCisjZGVmaW5lIEIyUkFUXzIJCQkweDAwMDAwMjAwICAvKiBCMiBSZWFkIEFjY2VzcyBUaW1lID0gMiBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIyUkFUXzMJCQkweDAwMDAwMzAwICAvKiBCMiBSZWFkIEFjY2VzcyBUaW1lID0gMyBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIyUkFUXzQJCQkweDAwMDAwNDAwICAvKiBCMiBSZWFkIEFjY2VzcyBUaW1lID0gNCBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIyUkFUXzUJCQkweDAwMDAwNTAwICAvKiBCMiBSZWFkIEFjY2VzcyBUaW1lID0gNSBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIyUkFUXzYJCQkweDAwMDAwNjAwICAvKiBCMiBSZWFkIEFjY2VzcyBUaW1lID0gNiBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIyUkFUXzcJCQkweDAwMDAwNzAwICAvKiBCMiBSZWFkIEFjY2VzcyBUaW1lID0gNyBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIyUkFUXzgJCQkweDAwMDAwODAwICAvKiBCMiBSZWFkIEFjY2VzcyBUaW1lID0gOCBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIyUkFUXzkJCQkweDAwMDAwOTAwICAvKiBCMiBSZWFkIEFjY2VzcyBUaW1lID0gOSBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIyUkFUXzEwCQkweDAwMDAwQTAwICAvKiBCMiBSZWFkIEFjY2VzcyBUaW1lID0gMTAgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMlJBVF8xMQkJMHgwMDAwMEIwMCAgLyogQjIgUmVhZCBBY2Nlc3MgVGltZSA9IDExIGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjJSQVRfMTIJCTB4MDAwMDBDMDAgIC8qIEIyIFJlYWQgQWNjZXNzIFRpbWUgPSAxMiBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIyUkFUXzEzCQkweDAwMDAwRDAwICAvKiBCMiBSZWFkIEFjY2VzcyBUaW1lID0gMTMgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMlJBVF8xNAkJMHgwMDAwMEUwMCAgLyogQjIgUmVhZCBBY2Nlc3MgVGltZSA9IDE0IGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjJSQVRfMTUJCTB4MDAwMDBGMDAgIC8qIEIyIFJlYWQgQWNjZXNzIFRpbWUgPSAxNSBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIyV0FUXzEJCQkweDAwMDAxMDAwICAvKiBCMiBXcml0ZSBBY2Nlc3MgVGltZSA9IDEgY3ljbGUJCQkJCSovCisjZGVmaW5lIEIyV0FUXzIJCQkweDAwMDAyMDAwICAvKiBCMiBXcml0ZSBBY2Nlc3MgVGltZSA9IDIgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMldBVF8zCQkJMHgwMDAwMzAwMCAgLyogQjIgV3JpdGUgQWNjZXNzIFRpbWUgPSAzIGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjJXQVRfNAkJCTB4MDAwMDQwMDAgIC8qIEIyIFdyaXRlIEFjY2VzcyBUaW1lID0gNCBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIyV0FUXzUJCQkweDAwMDA1MDAwICAvKiBCMiBXcml0ZSBBY2Nlc3MgVGltZSA9IDUgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMldBVF82CQkJMHgwMDAwNjAwMCAgLyogQjIgV3JpdGUgQWNjZXNzIFRpbWUgPSA2IGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjJXQVRfNwkJCTB4MDAwMDcwMDAgIC8qIEIyIFdyaXRlIEFjY2VzcyBUaW1lID0gNyBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIyV0FUXzgJCQkweDAwMDA4MDAwICAvKiBCMiBXcml0ZSBBY2Nlc3MgVGltZSA9IDggY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMldBVF85CQkJMHgwMDAwOTAwMCAgLyogQjIgV3JpdGUgQWNjZXNzIFRpbWUgPSA5IGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjJXQVRfMTAJCTB4MDAwMEEwMDAgIC8qIEIyIFdyaXRlIEFjY2VzcyBUaW1lID0gMTAgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMldBVF8xMQkJMHgwMDAwQjAwMCAgLyogQjIgV3JpdGUgQWNjZXNzIFRpbWUgPSAxMSBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIyV0FUXzEyCQkweDAwMDBDMDAwICAvKiBCMiBXcml0ZSBBY2Nlc3MgVGltZSA9IDEyIGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjJXQVRfMTMJCTB4MDAwMEQwMDAgIC8qIEIyIFdyaXRlIEFjY2VzcyBUaW1lID0gMTMgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMldBVF8xNAkJMHgwMDAwRTAwMCAgLyogQjIgV3JpdGUgQWNjZXNzIFRpbWUgPSAxNCBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIyV0FUXzE1CQkweDAwMDBGMDAwICAvKiBCMiBXcml0ZSBBY2Nlc3MgVGltZSA9IDE1IGN5Y2xlcwkJCQkJKi8KKworI2RlZmluZSBCM1JEWUVOCQkJMHgwMDAxMDAwMCAgLyogQmFuayAzIChCMykgUkRZIEVuYWJsZQkJCQkJCQkqLworI2RlZmluZSBCM1JEWVBPTAkJMHgwMDAyMDAwMCAgLyogQjMgUkRZIEFjdGl2ZSBIaWdoCQkJCQkJCQkqLworI2RlZmluZSBCM1RUXzEJCQkweDAwMDQwMDAwICAvKiBCMyBUcmFuc2l0aW9uIFRpbWUgKFJlYWQgdG8gV3JpdGUpID0gMSBjeWNsZQkJKi8KKyNkZWZpbmUgQjNUVF8yCQkJMHgwMDA4MDAwMCAgLyogQjMgVHJhbnNpdGlvbiBUaW1lIChSZWFkIHRvIFdyaXRlKSA9IDIgY3ljbGVzCSovCisjZGVmaW5lIEIzVFRfMwkJCTB4MDAwQzAwMDAgIC8qIEIzIFRyYW5zaXRpb24gVGltZSAoUmVhZCB0byBXcml0ZSkgPSAzIGN5Y2xlcwkqLworI2RlZmluZSBCM1RUXzQJCQkweDAwMDAwMDAwICAvKiBCMyBUcmFuc2l0aW9uIFRpbWUgKFJlYWQgdG8gV3JpdGUpID0gNCBjeWNsZXMJKi8KKyNkZWZpbmUgQjNTVF8xCQkJMHgwMDEwMDAwMCAgLyogQjMgU2V0dXAgVGltZSAoQU9FIHRvIFJlYWQvV3JpdGUpID0gMSBjeWNsZQkJKi8KKyNkZWZpbmUgQjNTVF8yCQkJMHgwMDIwMDAwMCAgLyogQjMgU2V0dXAgVGltZSAoQU9FIHRvIFJlYWQvV3JpdGUpID0gMiBjeWNsZXMJCSovCisjZGVmaW5lIEIzU1RfMwkJCTB4MDAzMDAwMDAgIC8qIEIzIFNldHVwIFRpbWUgKEFPRSB0byBSZWFkL1dyaXRlKSA9IDMgY3ljbGVzCQkqLworI2RlZmluZSBCM1NUXzQJCQkweDAwMDAwMDAwICAvKiBCMyBTZXR1cCBUaW1lIChBT0UgdG8gUmVhZC9Xcml0ZSkgPSA0IGN5Y2xlcwkJKi8KKyNkZWZpbmUgQjNIVF8xCQkJMHgwMDQwMDAwMCAgLyogQjMgSG9sZCBUaW1lICh+UmVhZC9Xcml0ZSB0byB+QU9FKSA9IDEgY3ljbGUJCSovCisjZGVmaW5lIEIzSFRfMgkJCTB4MDA4MDAwMDAgIC8qIEIzIEhvbGQgVGltZSAoflJlYWQvV3JpdGUgdG8gfkFPRSkgPSAyIGN5Y2xlcwkqLworI2RlZmluZSBCM0hUXzMJCQkweDAwQzAwMDAwICAvKiBCMyBIb2xkIFRpbWUgKH5SZWFkL1dyaXRlIHRvIH5BT0UpID0gMyBjeWNsZXMJKi8KKyNkZWZpbmUgQjNIVF8wCQkJMHgwMDAwMDAwMCAgLyogQjMgSG9sZCBUaW1lICh+UmVhZC9Xcml0ZSB0byB+QU9FKSA9IDAgY3ljbGVzCSovCisjZGVmaW5lIEIzUkFUXzEJCQkweDAxMDAwMDAwICAvKiBCMyBSZWFkIEFjY2VzcyBUaW1lID0gMSBjeWNsZQkJCQkJKi8KKyNkZWZpbmUgQjNSQVRfMgkJCTB4MDIwMDAwMDAgIC8qIEIzIFJlYWQgQWNjZXNzIFRpbWUgPSAyIGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjNSQVRfMwkJCTB4MDMwMDAwMDAgIC8qIEIzIFJlYWQgQWNjZXNzIFRpbWUgPSAzIGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjNSQVRfNAkJCTB4MDQwMDAwMDAgIC8qIEIzIFJlYWQgQWNjZXNzIFRpbWUgPSA0IGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjNSQVRfNQkJCTB4MDUwMDAwMDAgIC8qIEIzIFJlYWQgQWNjZXNzIFRpbWUgPSA1IGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjNSQVRfNgkJCTB4MDYwMDAwMDAgIC8qIEIzIFJlYWQgQWNjZXNzIFRpbWUgPSA2IGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjNSQVRfNwkJCTB4MDcwMDAwMDAgIC8qIEIzIFJlYWQgQWNjZXNzIFRpbWUgPSA3IGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjNSQVRfOAkJCTB4MDgwMDAwMDAgIC8qIEIzIFJlYWQgQWNjZXNzIFRpbWUgPSA4IGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjNSQVRfOQkJCTB4MDkwMDAwMDAgIC8qIEIzIFJlYWQgQWNjZXNzIFRpbWUgPSA5IGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjNSQVRfMTAJCTB4MEEwMDAwMDAgIC8qIEIzIFJlYWQgQWNjZXNzIFRpbWUgPSAxMCBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIzUkFUXzExCQkweDBCMDAwMDAwICAvKiBCMyBSZWFkIEFjY2VzcyBUaW1lID0gMTEgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCM1JBVF8xMgkJMHgwQzAwMDAwMCAgLyogQjMgUmVhZCBBY2Nlc3MgVGltZSA9IDEyIGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjNSQVRfMTMJCTB4MEQwMDAwMDAgIC8qIEIzIFJlYWQgQWNjZXNzIFRpbWUgPSAxMyBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIzUkFUXzE0CQkweDBFMDAwMDAwICAvKiBCMyBSZWFkIEFjY2VzcyBUaW1lID0gMTQgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCM1JBVF8xNQkJMHgwRjAwMDAwMCAgLyogQjMgUmVhZCBBY2Nlc3MgVGltZSA9IDE1IGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjNXQVRfMQkJCTB4MTAwMDAwMDAgIC8qIEIzIFdyaXRlIEFjY2VzcyBUaW1lID0gMSBjeWNsZQkJCQkJKi8KKyNkZWZpbmUgQjNXQVRfMgkJCTB4MjAwMDAwMDAgIC8qIEIzIFdyaXRlIEFjY2VzcyBUaW1lID0gMiBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIzV0FUXzMJCQkweDMwMDAwMDAwICAvKiBCMyBXcml0ZSBBY2Nlc3MgVGltZSA9IDMgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCM1dBVF80CQkJMHg0MDAwMDAwMCAgLyogQjMgV3JpdGUgQWNjZXNzIFRpbWUgPSA0IGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjNXQVRfNQkJCTB4NTAwMDAwMDAgIC8qIEIzIFdyaXRlIEFjY2VzcyBUaW1lID0gNSBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIzV0FUXzYJCQkweDYwMDAwMDAwICAvKiBCMyBXcml0ZSBBY2Nlc3MgVGltZSA9IDYgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCM1dBVF83CQkJMHg3MDAwMDAwMCAgLyogQjMgV3JpdGUgQWNjZXNzIFRpbWUgPSA3IGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjNXQVRfOAkJCTB4ODAwMDAwMDAgIC8qIEIzIFdyaXRlIEFjY2VzcyBUaW1lID0gOCBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIzV0FUXzkJCQkweDkwMDAwMDAwICAvKiBCMyBXcml0ZSBBY2Nlc3MgVGltZSA9IDkgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCM1dBVF8xMAkJMHhBMDAwMDAwMCAgLyogQjMgV3JpdGUgQWNjZXNzIFRpbWUgPSAxMCBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIzV0FUXzExCQkweEIwMDAwMDAwICAvKiBCMyBXcml0ZSBBY2Nlc3MgVGltZSA9IDExIGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjNXQVRfMTIJCTB4QzAwMDAwMDAgIC8qIEIzIFdyaXRlIEFjY2VzcyBUaW1lID0gMTIgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCM1dBVF8xMwkJMHhEMDAwMDAwMCAgLyogQjMgV3JpdGUgQWNjZXNzIFRpbWUgPSAxMyBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIzV0FUXzE0CQkweEUwMDAwMDAwICAvKiBCMyBXcml0ZSBBY2Nlc3MgVGltZSA9IDE0IGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjNXQVRfMTUJCTB4RjAwMDAwMDAgIC8qIEIzIFdyaXRlIEFjY2VzcyBUaW1lID0gMTUgY3ljbGVzCQkJCQkqLworCisKKy8qICoqKioqKioqKioqKioqKioqKioqKiogIFNEUkFNIENPTlRST0xMRVIgTUFTS1MgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBFQklVX1NER0NUTCBNYXNrcwkJCQkJCQkJCQkJCQkJCQkJCQkqLworI2RlZmluZSBTQ1RMRQkJCTB4MDAwMDAwMDEJLyogRW5hYmxlIFNEUkFNIFNpZ25hbHMJCQkJCQkJCQkJKi8KKyNkZWZpbmUgQ0xfMgkJCTB4MDAwMDAwMDgJLyogU0RSQU0gQ0FTIExhdGVuY3kgPSAyIGN5Y2xlcwkJCQkJCQkJKi8KKyNkZWZpbmUgQ0xfMwkJCTB4MDAwMDAwMEMJLyogU0RSQU0gQ0FTIExhdGVuY3kgPSAzIGN5Y2xlcwkJCQkJCQkJKi8KKyNkZWZpbmUgUEFTUl9BTEwJCTB4MDAwMDAwMDAJLyogQWxsIDQgU0RSQU0gQmFua3MgUmVmcmVzaGVkIEluIFNlbGYtUmVmcmVzaAkJCQkqLworI2RlZmluZSBQQVNSX0IwX0IxCQkweDAwMDAwMDEwCS8qIFNEUkFNIEJhbmtzIDAgYW5kIDEgQXJlIFJlZnJlc2hlZCBJbiBTZWxmLVJlZnJlc2gJCSovCisjZGVmaW5lIFBBU1JfQjAJCQkweDAwMDAwMDIwCS8qIE9ubHkgU0RSQU0gQmFuayAwIElzIFJlZnJlc2hlZCBJbiBTZWxmLVJlZnJlc2gJCQkqLworI2RlZmluZSBUUkFTXzEJCQkweDAwMDAwMDQwCS8qIFNEUkFNIHRSQVMgPSAxIGN5Y2xlCQkJCQkJCQkJCSovCisjZGVmaW5lIFRSQVNfMgkJCTB4MDAwMDAwODAJLyogU0RSQU0gdFJBUyA9IDIgY3ljbGVzCQkJCQkJCQkJKi8KKyNkZWZpbmUgVFJBU18zCQkJMHgwMDAwMDBDMAkvKiBTRFJBTSB0UkFTID0gMyBjeWNsZXMJCQkJCQkJCQkqLworI2RlZmluZSBUUkFTXzQJCQkweDAwMDAwMTAwCS8qIFNEUkFNIHRSQVMgPSA0IGN5Y2xlcwkJCQkJCQkJCSovCisjZGVmaW5lIFRSQVNfNQkJCTB4MDAwMDAxNDAJLyogU0RSQU0gdFJBUyA9IDUgY3ljbGVzCQkJCQkJCQkJKi8KKyNkZWZpbmUgVFJBU182CQkJMHgwMDAwMDE4MAkvKiBTRFJBTSB0UkFTID0gNiBjeWNsZXMJCQkJCQkJCQkqLworI2RlZmluZSBUUkFTXzcJCQkweDAwMDAwMUMwCS8qIFNEUkFNIHRSQVMgPSA3IGN5Y2xlcwkJCQkJCQkJCSovCisjZGVmaW5lIFRSQVNfOAkJCTB4MDAwMDAyMDAJLyogU0RSQU0gdFJBUyA9IDggY3ljbGVzCQkJCQkJCQkJKi8KKyNkZWZpbmUgVFJBU185CQkJMHgwMDAwMDI0MAkvKiBTRFJBTSB0UkFTID0gOSBjeWNsZXMJCQkJCQkJCQkqLworI2RlZmluZSBUUkFTXzEwCQkJMHgwMDAwMDI4MAkvKiBTRFJBTSB0UkFTID0gMTAgY3ljbGVzCQkJCQkJCQkJKi8KKyNkZWZpbmUgVFJBU18xMQkJCTB4MDAwMDAyQzAJLyogU0RSQU0gdFJBUyA9IDExIGN5Y2xlcwkJCQkJCQkJCSovCisjZGVmaW5lIFRSQVNfMTIJCQkweDAwMDAwMzAwCS8qIFNEUkFNIHRSQVMgPSAxMiBjeWNsZXMJCQkJCQkJCQkqLworI2RlZmluZSBUUkFTXzEzCQkJMHgwMDAwMDM0MAkvKiBTRFJBTSB0UkFTID0gMTMgY3ljbGVzCQkJCQkJCQkJKi8KKyNkZWZpbmUgVFJBU18xNAkJCTB4MDAwMDAzODAJLyogU0RSQU0gdFJBUyA9IDE0IGN5Y2xlcwkJCQkJCQkJCSovCisjZGVmaW5lIFRSQVNfMTUJCQkweDAwMDAwM0MwCS8qIFNEUkFNIHRSQVMgPSAxNSBjeWNsZXMJCQkJCQkJCQkqLworI2RlZmluZSBUUlBfMQkJCTB4MDAwMDA4MDAJLyogU0RSQU0gdFJQID0gMSBjeWNsZQkJCQkJCQkJCQkqLworI2RlZmluZSBUUlBfMgkJCTB4MDAwMDEwMDAJLyogU0RSQU0gdFJQID0gMiBjeWNsZXMJCQkJCQkJCQkJKi8KKyNkZWZpbmUgVFJQXzMJCQkweDAwMDAxODAwCS8qIFNEUkFNIHRSUCA9IDMgY3ljbGVzCQkJCQkJCQkJCSovCisjZGVmaW5lIFRSUF80CQkJMHgwMDAwMjAwMAkvKiBTRFJBTSB0UlAgPSA0IGN5Y2xlcwkJCQkJCQkJCQkqLworI2RlZmluZSBUUlBfNQkJCTB4MDAwMDI4MDAJLyogU0RSQU0gdFJQID0gNSBjeWNsZXMJCQkJCQkJCQkJKi8KKyNkZWZpbmUgVFJQXzYJCQkweDAwMDAzMDAwCS8qIFNEUkFNIHRSUCA9IDYgY3ljbGVzCQkJCQkJCQkJCSovCisjZGVmaW5lIFRSUF83CQkJMHgwMDAwMzgwMAkvKiBTRFJBTSB0UlAgPSA3IGN5Y2xlcwkJCQkJCQkJCQkqLworI2RlZmluZSBUUkNEXzEJCQkweDAwMDA4MDAwCS8qIFNEUkFNIHRSQ0QgPSAxIGN5Y2xlCQkJCQkJCQkJCSovCisjZGVmaW5lIFRSQ0RfMgkJCTB4MDAwMTAwMDAJLyogU0RSQU0gdFJDRCA9IDIgY3ljbGVzCQkJCQkJCQkJKi8KKyNkZWZpbmUgVFJDRF8zCQkJMHgwMDAxODAwMAkvKiBTRFJBTSB0UkNEID0gMyBjeWNsZXMJCQkJCQkJCQkqLworI2RlZmluZSBUUkNEXzQJCQkweDAwMDIwMDAwCS8qIFNEUkFNIHRSQ0QgPSA0IGN5Y2xlcwkJCQkJCQkJCSovCisjZGVmaW5lIFRSQ0RfNQkJCTB4MDAwMjgwMDAJLyogU0RSQU0gdFJDRCA9IDUgY3ljbGVzCQkJCQkJCQkJKi8KKyNkZWZpbmUgVFJDRF82CQkJMHgwMDAzMDAwMAkvKiBTRFJBTSB0UkNEID0gNiBjeWNsZXMJCQkJCQkJCQkqLworI2RlZmluZSBUUkNEXzcJCQkweDAwMDM4MDAwCS8qIFNEUkFNIHRSQ0QgPSA3IGN5Y2xlcwkJCQkJCQkJCSovCisjZGVmaW5lIFRXUl8xCQkJMHgwMDA4MDAwMAkvKiBTRFJBTSB0V1IgPSAxIGN5Y2xlCQkJCQkJCQkJCSovCisjZGVmaW5lIFRXUl8yCQkJMHgwMDEwMDAwMAkvKiBTRFJBTSB0V1IgPSAyIGN5Y2xlcwkJCQkJCQkJCQkqLworI2RlZmluZSBUV1JfMwkJCTB4MDAxODAwMDAJLyogU0RSQU0gdFdSID0gMyBjeWNsZXMJCQkJCQkJCQkJKi8KKyNkZWZpbmUgUFVQU0QJCQkweDAwMjAwMDAwCS8qIFBvd2VyLVVwIFN0YXJ0IERlbGF5ICgxNSBTQ0xLIEN5Y2xlcyBEZWxheSkJCQkJKi8KKyNkZWZpbmUgUFNNCQkJCTB4MDA0MDAwMDAJLyogUG93ZXItVXAgU2VxdWVuY2UgKE1vZGUgUmVnaXN0ZXIgQmVmb3JlL0FmdGVyKiBSZWZyZXNoKQkqLworI2RlZmluZSBQU1MJCQkJMHgwMDgwMDAwMAkvKiBFbmFibGUgUG93ZXItVXAgU2VxdWVuY2Ugb24gTmV4dCBTRFJBTSBBY2Nlc3MJCQkqLworI2RlZmluZSBTUkZTCQkJMHgwMTAwMDAwMAkvKiBFbmFibGUgU0RSQU0gU2VsZi1SZWZyZXNoIE1vZGUJCQkJCQkJKi8KKyNkZWZpbmUgRUJVRkUJCQkweDAyMDAwMDAwCS8qIEVuYWJsZSBFeHRlcm5hbCBCdWZmZXJpbmcgVGltaW5nCQkJCQkJCSovCisjZGVmaW5lIEZCQlJXCQkJMHgwNDAwMDAwMAkvKiBFbmFibGUgRmFzdCBCYWNrLVRvLUJhY2sgUmVhZCBUbyBXcml0ZQkJCQkJKi8KKyNkZWZpbmUgRU1SRU4JCQkweDEwMDAwMDAwCS8qIEV4dGVuZGVkIE1vZGUgUmVnaXN0ZXIgRW5hYmxlCQkJCQkJCSovCisjZGVmaW5lIFRDU1IJCQkweDIwMDAwMDAwCS8qIFRlbXAtQ29tcGVuc2F0ZWQgU2VsZi1SZWZyZXNoIFZhbHVlICg4NS80NSogRGVnIEMpCQkqLworI2RlZmluZSBDRERCRwkJCTB4NDAwMDAwMDAJLyogVHJpc3RhdGUgU0RSQU0gQ29udHJvbHMgRHVyaW5nIEJ1cyBHcmFudAkJCQkJKi8KKworLyogRUJJVV9TREJDVEwgTWFza3MJCQkJCQkJCQkJCQkJCQkJCQkqLworI2RlZmluZSBFQkUJCQkJMHgwMDAxCQkvKiBFbmFibGUgU0RSQU0gRXh0ZXJuYWwgQmFuawkJCQkJCQkqLworI2RlZmluZSBFQlNaXzE2CQkJMHgwMDAwCQkvKiBTRFJBTSBFeHRlcm5hbCBCYW5rIFNpemUgPSAxNk1CCSovCisjZGVmaW5lIEVCU1pfMzIJCQkweDAwMDIJCS8qIFNEUkFNIEV4dGVybmFsIEJhbmsgU2l6ZSA9IDMyTUIJKi8KKyNkZWZpbmUgRUJTWl82NAkJCTB4MDAwNAkJLyogU0RSQU0gRXh0ZXJuYWwgQmFuayBTaXplID0gNjRNQgkqLworI2RlZmluZSBFQlNaXzEyOAkJMHgwMDA2CQkvKiBTRFJBTSBFeHRlcm5hbCBCYW5rIFNpemUgPSAxMjhNQgkJKi8KKyNkZWZpbmUgRUJTWl8yNTYJCTB4MDAwOAkJLyogU0RSQU0gRXh0ZXJuYWwgQmFuayBTaXplID0gMjU2TUIgCSovCisjZGVmaW5lIEVCU1pfNTEyCQkweDAwMEEJCS8qIFNEUkFNIEV4dGVybmFsIEJhbmsgU2l6ZSA9IDUxMk1CCQkqLworI2RlZmluZSBFQkNBV184CQkJMHgwMDAwCQkvKiBTRFJBTSBFeHRlcm5hbCBCYW5rIENvbHVtbiBBZGRyZXNzIFdpZHRoID0gOCBCaXRzCSovCisjZGVmaW5lIEVCQ0FXXzkJCQkweDAwMTAJCS8qIFNEUkFNIEV4dGVybmFsIEJhbmsgQ29sdW1uIEFkZHJlc3MgV2lkdGggPSA5IEJpdHMJKi8KKyNkZWZpbmUgRUJDQVdfMTAJCTB4MDAyMAkJLyogU0RSQU0gRXh0ZXJuYWwgQmFuayBDb2x1bW4gQWRkcmVzcyBXaWR0aCA9IDEwIEJpdHMJKi8KKyNkZWZpbmUgRUJDQVdfMTEJCTB4MDAzMAkJLyogU0RSQU0gRXh0ZXJuYWwgQmFuayBDb2x1bW4gQWRkcmVzcyBXaWR0aCA9IDExIEJpdHMJKi8KKworLyogRUJJVV9TRFNUQVQgTWFza3MJCQkJCQkJCQkJCQkJCSovCisjZGVmaW5lIFNEQ0kJCQkweDAwMDEJCS8qIFNEUkFNIENvbnRyb2xsZXIgSWRsZSAJCQkJKi8KKyNkZWZpbmUgU0RTUkEJCQkweDAwMDIJCS8qIFNEUkFNIFNlbGYtUmVmcmVzaCBBY3RpdmUJCQkqLworI2RlZmluZSBTRFBVQQkJCTB4MDAwNAkJLyogU0RSQU0gUG93ZXItVXAgQWN0aXZlIAkJCQkqLworI2RlZmluZSBTRFJTCQkJMHgwMDA4CQkvKiBTRFJBTSBXaWxsIFBvd2VyLVVwIE9uIE5leHQgQWNjZXNzCSovCisjZGVmaW5lIFNERUFTRQkJCTB4MDAxMAkJLyogU0RSQU0gRUFCIFN0aWNreSBFcnJvciBTdGF0dXMJCSovCisjZGVmaW5lIEJHU1RBVAkJCTB4MDAyMAkJLyogQnVzIEdyYW50IFN0YXR1cwkJCQkJCSovCisKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKiogIERNQSBDT05UUk9MTEVSIE1BU0tTICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogRE1BeF9QRVJJUEhFUkFMX01BUCwgTURNQV95eV9QRVJJUEhFUkFMX01BUCBNYXNrcwkJCQkJCQkJKi8KKyNkZWZpbmUgQ1RZUEUJCQkweDAwNDAJLyogRE1BIENoYW5uZWwgVHlwZSBJbmRpY2F0b3IgKE1lbW9yeS9QZXJpcGhlcmFsKikJKi8KKyNkZWZpbmUgUE1BUAkJCTB4RjAwMAkvKiBQZXJpcGhlcmFsIE1hcHBlZCBUbyBUaGlzIENoYW5uZWwJCQkJKi8KKyNkZWZpbmUgUE1BUF9QUEkJCTB4MDAwMAkvKiAJCVBQSSBQb3J0IERNQQkJCQkJCQkJKi8KKyNkZWZpbmUJUE1BUF9FTUFDUlgJCTB4MTAwMAkvKiAJCUV0aGVybmV0IFJlY2VpdmUgRE1BCQkJCQkJKi8KKyNkZWZpbmUgUE1BUF9FTUFDVFgJCTB4MjAwMAkvKiAJCUV0aGVybmV0IFRyYW5zbWl0IERNQQkJCQkJCSovCisjZGVmaW5lIFBNQVBfU1BPUlQwUlgJMHgzMDAwCS8qIAkJU1BPUlQwIFJlY2VpdmUgRE1BCQkJCQkJCSovCisjZGVmaW5lIFBNQVBfU1BPUlQwVFgJMHg0MDAwCS8qIAkJU1BPUlQwIFRyYW5zbWl0IERNQQkJCQkJCQkqLworI2RlZmluZSBQTUFQX1NQT1JUMVJYCTB4NTAwMAkvKiAJCVNQT1JUMSBSZWNlaXZlIERNQQkJCQkJCQkqLworI2RlZmluZSBQTUFQX1NQT1JUMVRYCTB4NjAwMAkvKiAJCVNQT1JUMSBUcmFuc21pdCBETUEJCQkJCQkJKi8KKyNkZWZpbmUgUE1BUF9TUEkJCTB4NzAwMAkvKiAJCVNQSSBQb3J0IERNQQkJCQkJCQkJKi8KKyNkZWZpbmUgUE1BUF9VQVJUMFJYCTB4ODAwMAkvKiAJCVVBUlQwIFBvcnQgUmVjZWl2ZSBETUEJCQkJCQkqLworI2RlZmluZSBQTUFQX1VBUlQwVFgJMHg5MDAwCS8qIAkJVUFSVDAgUG9ydCBUcmFuc21pdCBETUEJCQkJCQkqLworI2RlZmluZQlQTUFQX1VBUlQxUlgJMHhBMDAwCS8qIAkJVUFSVDEgUG9ydCBSZWNlaXZlIERNQQkJCQkJCSovCisjZGVmaW5lCVBNQVBfVUFSVDFUWAkweEIwMDAJLyogCQlVQVJUMSBQb3J0IFRyYW5zbWl0IERNQQkJCQkJCSovCisKKy8qICAqKioqKioqKioqKiogIFBBUkFMTEVMIFBFUklQSEVSQUwgSU5URVJGQUNFIChQUEkpIE1BU0tTICoqKioqKioqKioqKiovCisvKiAgUFBJX0NPTlRST0wgTWFza3MJCQkJCQkJCQkJCQkJKi8KKyNkZWZpbmUgUE9SVF9FTgkJCTB4MDAwMQkJLyogUFBJIFBvcnQgRW5hYmxlCQkJCQkqLworI2RlZmluZSBQT1JUX0RJUgkJMHgwMDAyCQkvKiBQUEkgUG9ydCBEaXJlY3Rpb24JCQkJKi8KKyNkZWZpbmUgWEZSX1RZUEUJCTB4MDAwQwkJLyogUFBJIFRyYW5zZmVyIFR5cGUJCQkJKi8KKyNkZWZpbmUgUE9SVF9DRkcJCTB4MDAzMAkJLyogUFBJIFBvcnQgQ29uZmlndXJhdGlvbgkJCSovCisjZGVmaW5lIEZMRF9TRUwJCQkweDAwNDAJCS8qIFBQSSBBY3RpdmUgRmllbGQgU2VsZWN0CQkJKi8KKyNkZWZpbmUgUEFDS19FTgkJCTB4MDA4MAkJLyogUFBJIFBhY2tpbmcgTW9kZQkJCQkJKi8KKyNkZWZpbmUgRE1BMzIJCQkweDAxMDAJCS8qIFBQSSAzMi1iaXQgRE1BIEVuYWJsZQkJCSovCisjZGVmaW5lIFNLSVBfRU4JCQkweDAyMDAJCS8qIFBQSSBTa2lwIEVsZW1lbnQgRW5hYmxlCQkJKi8KKyNkZWZpbmUgU0tJUF9FTwkJCTB4MDQwMAkJLyogUFBJIFNraXAgRXZlbi9PZGQgRWxlbWVudHMJCSovCisjZGVmaW5lIERMRU5fOAkJCTB4MDAwMAkJLyogRGF0YSBMZW5ndGggPSA4IEJpdHMJCQkJKi8KKyNkZWZpbmUgRExFTl8xMAkJCTB4MDgwMAkJLyogRGF0YSBMZW5ndGggPSAxMCBCaXRzCQkJKi8KKyNkZWZpbmUgRExFTl8xMQkJCTB4MTAwMAkJLyogRGF0YSBMZW5ndGggPSAxMSBCaXRzCQkJKi8KKyNkZWZpbmUgRExFTl8xMgkJCTB4MTgwMAkJLyogRGF0YSBMZW5ndGggPSAxMiBCaXRzCQkJKi8KKyNkZWZpbmUgRExFTl8xMwkJCTB4MjAwMAkJLyogRGF0YSBMZW5ndGggPSAxMyBCaXRzCQkJKi8KKyNkZWZpbmUgRExFTl8xNAkJCTB4MjgwMAkJLyogRGF0YSBMZW5ndGggPSAxNCBCaXRzCQkJKi8KKyNkZWZpbmUgRExFTl8xNQkJCTB4MzAwMAkJLyogRGF0YSBMZW5ndGggPSAxNSBCaXRzCQkJKi8KKyNkZWZpbmUgRExFTl8xNgkJCTB4MzgwMAkJLyogRGF0YSBMZW5ndGggPSAxNiBCaXRzCQkJKi8KKyNkZWZpbmUgRExFTkdUSAkJCTB4MzgwMAkJLyogUFBJIERhdGEgTGVuZ3RoICAqLworI2RlZmluZSBQT0xDCQkJMHg0MDAwCQkvKiBQUEkgQ2xvY2sgUG9sYXJpdHkJCQkJKi8KKyNkZWZpbmUgUE9MUwkJCTB4ODAwMAkJLyogUFBJIEZyYW1lIFN5bmMgUG9sYXJpdHkJCQkqLworCisvKiBQUElfU1RBVFVTIE1hc2tzCQkJCQkJCQkJCQkJCQkqLworI2RlZmluZSBGTEQJCQkJMHgwNDAwCQkvKiBGaWVsZCBJbmRpY2F0b3IJCQkJCSovCisjZGVmaW5lIEZUX0VSUgkJCTB4MDgwMAkJLyogRnJhbWUgVHJhY2sgRXJyb3IJCQkJKi8KKyNkZWZpbmUgT1ZSCQkJCTB4MTAwMAkJLyogRklGTyBPdmVyZmxvdyBFcnJvcgkJCQkqLworI2RlZmluZSBVTkRSCQkJMHgyMDAwCQkvKiBGSUZPIFVuZGVycnVuIEVycm9yCQkJCSovCisjZGVmaW5lIEVSUl9ERVQJCQkweDQwMDAJCS8qIEVycm9yIERldGVjdGVkIEluZGljYXRvcgkJCSovCisjZGVmaW5lIEVSUl9OQ09SCQkweDgwMDAJCS8qIEVycm9yIE5vdCBDb3JyZWN0ZWQgSW5kaWNhdG9yCSovCisKKworLyogICoqKioqKioqKioqKioqKioqKioqICBUV08tV0lSRSBJTlRFUkZBQ0UgKFRXSSkgTUFTS1MgICoqKioqKioqKioqKioqKioqKioqKioqLworLyogVFdJX0NMS0RJViBNYWNyb3MgKFVzZTogKnBUV0lfQ0xLRElWID0gQ0xLTE9XKHgpfENMS0hJKHkpOyAgKQkJCQkqLworI2RlZmluZQlDTEtMT1coeCkJKCh4KSAmIDB4RkYpCQkvKiBQZXJpb2RzIENsb2NrIElzIEhlbGQgTG93CQkJKi8KKyNkZWZpbmUgQ0xLSEkoeSkJKCgoeSkmMHhGRik8PDB4OCkJLyogUGVyaW9kcyBCZWZvcmUgTmV3IENsb2NrIExvdwkJCSovCisKKy8qIFRXSV9QUkVTQ0FMRSBNYXNrcwkJCQkJCQkJCQkJCQkJCSovCisjZGVmaW5lCVBSRVNDQUxFCTB4MDA3RgkJLyogU0NMS3MgUGVyIEludGVybmFsIFRpbWUgUmVmZXJlbmNlICgxME1IeikJKi8KKyNkZWZpbmUJVFdJX0VOQQkJMHgwMDgwCQkvKiBUV0kgRW5hYmxlCQkJCQkJCQkJKi8KKyNkZWZpbmUJU0NDQgkJMHgwMjAwCQkvKiBTQ0NCIENvbXBhdGliaWxpdHkgRW5hYmxlCQkJCQkqLworCisvKiBUV0lfU0xBVkVfQ1RMIE1hc2tzCQkJCQkJCQkJCQkJCQkJKi8KKyNkZWZpbmUJU0VOCQkJMHgwMDAxCQkvKiBTbGF2ZSBFbmFibGUJCQkJCQkJCQkqLworI2RlZmluZQlTQUREX0xFTgkweDAwMDIJCS8qIFNsYXZlIEFkZHJlc3MgTGVuZ3RoCQkJCQkJCSovCisjZGVmaW5lCVNURFZBTAkJMHgwMDA0CQkvKiBTbGF2ZSBUcmFuc21pdCBEYXRhIFZhbGlkCQkJCQkqLworI2RlZmluZQlOQUsJCQkweDAwMDgJCS8qIE5BSy9BQ0sqIEdlbmVyYXRlZCBBdCBDb25jbHVzaW9uIE9mIFRyYW5zZmVyICovCisjZGVmaW5lCUdFTgkJCTB4MDAxMAkJLyogR2VuZXJhbCBDYWxsIEFkcnJlc3MgTWF0Y2hpbmcgRW5hYmxlZAkJKi8KKworLyogVFdJX1NMQVZFX1NUQVQgTWFza3MJCQkJCQkJCQkJCQkJCQkqLworI2RlZmluZQlTRElSCQkweDAwMDEJCS8qIFNsYXZlIFRyYW5zZmVyIERpcmVjdGlvbiAoVHJhbnNtaXQvUmVjZWl2ZSopCSovCisjZGVmaW5lIEdDQUxMCQkweDAwMDIJCS8qIEdlbmVyYWwgQ2FsbCBJbmRpY2F0b3IJCQkJCQkqLworCisvKiBUV0lfTUFTVEVSX0NUTCBNYXNrcwkJCQkJCQkJCQkJCQkqLworI2RlZmluZQlNRU4JCQkweDAwMDEJCS8qIE1hc3RlciBNb2RlIEVuYWJsZQkJCQkJCSovCisjZGVmaW5lCU1BRERfTEVOCTB4MDAwMgkJLyogTWFzdGVyIEFkZHJlc3MgTGVuZ3RoCQkJCQkqLworI2RlZmluZQlNRElSCQkweDAwMDQJCS8qIE1hc3RlciBUcmFuc21pdCBEaXJlY3Rpb24gKFJYL1RYKikJCSovCisjZGVmaW5lCUZBU1QJCTB4MDAwOAkJLyogVXNlIEZhc3QgTW9kZSBUaW1pbmcgU3BlY3MJCQkJKi8KKyNkZWZpbmUJU1RPUAkJMHgwMDEwCQkvKiBJc3N1ZSBTdG9wIENvbmRpdGlvbgkJCQkJCSovCisjZGVmaW5lCVJTVEFSVAkJMHgwMDIwCQkvKiBSZXBlYXQgU3RhcnQgb3IgU3RvcCogQXQgRW5kIE9mIFRyYW5zZmVyCSovCisjZGVmaW5lCURDTlQJCTB4M0ZDMAkJLyogRGF0YSBCeXRlcyBUbyBUcmFuc2ZlcgkJCQkJKi8KKyNkZWZpbmUJU0RBT1ZSCQkweDQwMDAJCS8qIFNlcmlhbCBEYXRhIE92ZXJyaWRlCQkJCQkJKi8KKyNkZWZpbmUJU0NMT1ZSCQkweDgwMDAJCS8qIFNlcmlhbCBDbG9jayBPdmVycmlkZQkJCQkJKi8KKworLyogVFdJX01BU1RFUl9TVEFUIE1hc2tzCQkJCQkJCQkJCQkJCQkqLworI2RlZmluZQlNUFJPRwkJMHgwMDAxCQkvKiBNYXN0ZXIgVHJhbnNmZXIgSW4gUHJvZ3Jlc3MJCQkJCSovCisjZGVmaW5lCUxPU1RBUkIJCTB4MDAwMgkJLyogTG9zdCBBcmJpdHJhdGlvbiBJbmRpY2F0b3IgKFhmZXIgQWJvcnRlZCkJKi8KKyNkZWZpbmUJQU5BSwkJMHgwMDA0CQkvKiBBZGRyZXNzIE5vdCBBY2tub3dsZWRnZWQJCQkJCQkqLworI2RlZmluZQlETkFLCQkweDAwMDgJCS8qIERhdGEgTm90IEFja25vd2xlZGdlZAkJCQkJCSovCisjZGVmaW5lCUJVRlJERVJSCTB4MDAxMAkJLyogQnVmZmVyIFJlYWQgRXJyb3IJCQkJCQkJKi8KKyNkZWZpbmUJQlVGV1JFUlIJMHgwMDIwCQkvKiBCdWZmZXIgV3JpdGUgRXJyb3IJCQkJCQkJKi8KKyNkZWZpbmUJU0RBU0VOCQkweDAwNDAJCS8qIFNlcmlhbCBEYXRhIFNlbnNlCQkJCQkJCSovCisjZGVmaW5lCVNDTFNFTgkJMHgwMDgwCQkvKiBTZXJpYWwgQ2xvY2sgU2Vuc2UJCQkJCQkJKi8KKyNkZWZpbmUJQlVTQlVTWQkJMHgwMTAwCQkvKiBCdXMgQnVzeSBJbmRpY2F0b3IJCQkJCQkJKi8KKworLyogVFdJX0lOVF9TUkMgYW5kIFRXSV9JTlRfRU5BQkxFIE1hc2tzCQkJCQkJKi8KKyNkZWZpbmUJU0lOSVQJCTB4MDAwMQkJLyogU2xhdmUgVHJhbnNmZXIgSW5pdGlhdGVkCSovCisjZGVmaW5lCVNDT01QCQkweDAwMDIJCS8qIFNsYXZlIFRyYW5zZmVyIENvbXBsZXRlCSovCisjZGVmaW5lCVNFUlIJCTB4MDAwNAkJLyogU2xhdmUgVHJhbnNmZXIgRXJyb3IJCSovCisjZGVmaW5lCVNPVkYJCTB4MDAwOAkJLyogU2xhdmUgT3ZlcmZsb3cJCQkqLworI2RlZmluZQlNQ09NUAkJMHgwMDEwCQkvKiBNYXN0ZXIgVHJhbnNmZXIgQ29tcGxldGUJKi8KKyNkZWZpbmUJTUVSUgkJMHgwMDIwCQkvKiBNYXN0ZXIgVHJhbnNmZXIgRXJyb3IJKi8KKyNkZWZpbmUJWE1UU0VSVgkJMHgwMDQwCQkvKiBUcmFuc21pdCBGSUZPIFNlcnZpY2UJKi8KKyNkZWZpbmUJUkNWU0VSVgkJMHgwMDgwCQkvKiBSZWNlaXZlIEZJRk8gU2VydmljZQkJKi8KKworLyogVFdJX0ZJRk9fQ1RSTCBNYXNrcwkJCQkJCQkJCQkJCSovCisjZGVmaW5lCVhNVEZMVVNICTB4MDAwMQkJLyogVHJhbnNtaXQgQnVmZmVyIEZsdXNoCQkJKi8KKyNkZWZpbmUJUkNWRkxVU0gJMHgwMDAyCQkvKiBSZWNlaXZlIEJ1ZmZlciBGbHVzaAkJCQkqLworI2RlZmluZQlYTVRJTlRMRU4JMHgwMDA0CQkvKiBUcmFuc21pdCBCdWZmZXIgSW50ZXJydXB0IExlbmd0aAkqLworI2RlZmluZQlSQ1ZJTlRMRU4JMHgwMDA4CQkvKiBSZWNlaXZlIEJ1ZmZlciBJbnRlcnJ1cHQgTGVuZ3RoCSovCisKKy8qIFRXSV9GSUZPX1NUQVQgTWFza3MJCQkJCQkJCQkJCQkJCQkqLworI2RlZmluZQlYTVRTVEFUCQkweDAwMDMJCS8qIFRyYW5zbWl0IEZJRk8gU3RhdHVzCQkJCQkJCSovCisjZGVmaW5lCVhNVF9FTVBUWQkweDAwMDAJCS8qIAkJVHJhbnNtaXQgRklGTyBFbXB0eQkJCQkJCSovCisjZGVmaW5lCVhNVF9IQUxGCTB4MDAwMQkJLyogCQlUcmFuc21pdCBGSUZPIEhhcyAxIEJ5dGUgVG8gV3JpdGUJCSovCisjZGVmaW5lCVhNVF9GVUxMCTB4MDAwMwkJLyogCQlUcmFuc21pdCBGSUZPIEZ1bGwgKDIgQnl0ZXMgVG8gV3JpdGUpCSovCisKKyNkZWZpbmUJUkNWU1RBVAkJMHgwMDBDCQkvKiBSZWNlaXZlIEZJRk8gU3RhdHVzCQkJCQkJCSovCisjZGVmaW5lCVJDVl9FTVBUWQkweDAwMDAJCS8qIAkJUmVjZWl2ZSBGSUZPIEVtcHR5CQkJCQkJKi8KKyNkZWZpbmUJUkNWX0hBTEYJMHgwMDA0CQkvKiAJCVJlY2VpdmUgRklGTyBIYXMgMSBCeXRlIFRvIFJlYWQJCQkqLworI2RlZmluZQlSQ1ZfRlVMTAkweDAwMEMJCS8qIAkJUmVjZWl2ZSBGSUZPIEZ1bGwgKDIgQnl0ZXMgVG8gUmVhZCkJCSovCisKKworLyogICoqKioqKioqKioqKioqKioqKiogIFBJTiBDT05UUk9MIFJFR0lTVEVSIE1BU0tTICAqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBQT1JUX01VWCBNYXNrcwkJCQkJCQkJCQkJCQkJCSovCisjZGVmaW5lCVBKU0UJCQkweDAwMDEJCQkvKiBQb3J0IEogU1BJL1NQT1JUIEVuYWJsZQkJCSovCisjZGVmaW5lCVBKU0VfU1BPUlQJCTB4MDAwMAkJCS8qIAkJRW5hYmxlIFRGUzAvRFQwUFJJCQkJKi8KKyNkZWZpbmUJUEpTRV9TUEkJCTB4MDAwMQkJCS8qIAkJRW5hYmxlIFNQSV9TU0VMMzoyCQkJKi8KKworI2RlZmluZQlQSkNFKHgpCQkJKCgoeCkmMHgzKTw8MSkJLyogUG9ydCBKIENBTi9TUEkvU1BPUlQgRW5hYmxlCQkqLworI2RlZmluZQlQSkNFX1NQT1JUCQkweDAwMDAJCQkvKiAJCUVuYWJsZSBEUjBTRUMvRFQwU0VDCQkqLworI2RlZmluZQlQSkNFX0NBTgkJMHgwMDAyCQkJLyogCQlFbmFibGUgQ0FOIFJYL1RYCQkJKi8KKyNkZWZpbmUJUEpDRV9TUEkJCTB4MDAwNAkJCS8qIAkJRW5hYmxlIFNQSV9TU0VMNwkJCSovCisKKyNkZWZpbmUJUEZERQkJCTB4MDAwOAkJCS8qIFBvcnQgRiBETUEgUmVxdWVzdCBFbmFibGUJCSovCisjZGVmaW5lCVBGREVfVUFSVAkJMHgwMDAwCQkJLyogCQlFbmFibGUgVUFSVDAgUlgvVFgJCQkqLworI2RlZmluZQlQRkRFX0RNQQkJMHgwMDA4CQkJLyogCQlFbmFibGUgRE1BUjE6MAkJCQkqLworCisjZGVmaW5lCVBGVEUJCQkweDAwMTAJCQkvKiBQb3J0IEYgVGltZXIgRW5hYmxlCQkJCSovCisjZGVmaW5lCVBGVEVfVUFSVAkJMHgwMDAwCQkJLyoJCUVuYWJsZSBVQVJUMSBSWC9UWAkJCSovCisjZGVmaW5lCVBGVEVfVElNRVIJCTB4MDAxMAkJCS8qIAkJRW5hYmxlIFRNUjc6NgkJCQkqLworCisjZGVmaW5lCVBGUzZFCQkJMHgwMDIwCQkJLyogUG9ydCBGIFNQSSBTU0VMIDYgRW5hYmxlCQkJKi8KKyNkZWZpbmUJUEZTNkVfVElNRVIJCTB4MDAwMAkJCS8qCQlFbmFibGUgVE1SNQkJCQkJKi8KKyNkZWZpbmUJUEZTNkVfU1BJCQkweDAwMjAJCQkvKiAJCUVuYWJsZSBTUElfU1NFTDYJCQkqLworCisjZGVmaW5lCVBGUzVFCQkJMHgwMDQwCQkJLyogUG9ydCBGIFNQSSBTU0VMIDUgRW5hYmxlCQkJKi8KKyNkZWZpbmUJUEZTNUVfVElNRVIJCTB4MDAwMAkJCS8qCQlFbmFibGUgVE1SNAkJCQkJKi8KKyNkZWZpbmUJUEZTNUVfU1BJCQkweDAwNDAJCQkvKiAJCUVuYWJsZSBTUElfU1NFTDUJCQkqLworCisjZGVmaW5lCVBGUzRFCQkJMHgwMDgwCQkJLyogUG9ydCBGIFNQSSBTU0VMIDQgRW5hYmxlCQkJKi8KKyNkZWZpbmUJUEZTNEVfVElNRVIJCTB4MDAwMAkJCS8qCQlFbmFibGUgVE1SMwkJCQkJKi8KKyNkZWZpbmUJUEZTNEVfU1BJCQkweDAwODAJCQkvKiAJCUVuYWJsZSBTUElfU1NFTDQJCQkqLworCisjZGVmaW5lCVBGRkUJCQkweDAxMDAJCQkvKiBQb3J0IEYgUFBJIEZyYW1lIFN5bmMgRW5hYmxlCQkqLworI2RlZmluZQlQRkZFX1RJTUVSCQkweDAwMDAJCQkvKiAJCUVuYWJsZSBUTVIyCQkJCQkqLworI2RlZmluZQlQRkZFX1BQSQkJMHgwMTAwCQkJLyogCQlFbmFibGUgUFBJIEZTMwkJCQkqLworCisjZGVmaW5lCVBHU0UJCQkweDAyMDAJCQkvKiBQb3J0IEcgU1BPUlQxIFNlY29uZGFyeSBFbmFibGUJKi8KKyNkZWZpbmUJUEdTRV9QUEkJCTB4MDAwMAkJCS8qIAkJRW5hYmxlIFBQSSBEOTo4CQkJCSovCisjZGVmaW5lCVBHU0VfU1BPUlQJCTB4MDIwMAkJCS8qIAkJRW5hYmxlIERSMVNFQy9EVDFTRUMJCSovCisKKyNkZWZpbmUJUEdSRQkJCTB4MDQwMAkJCS8qIFBvcnQgRyBTUE9SVDEgUmVjZWl2ZSBFbmFibGUJCSovCisjZGVmaW5lCVBHUkVfUFBJCQkweDAwMDAJCQkvKiAJCUVuYWJsZSBQUEkgRDEyOjEwCQkJKi8KKyNkZWZpbmUJUEdSRV9TUE9SVAkJMHgwNDAwCQkJLyogCQlFbmFibGUgRFIxUFJJL1JGUzEvUlNDTEsxCSovCisKKyNkZWZpbmUJUEdURQkJCTB4MDgwMAkJCS8qIFBvcnQgRyBTUE9SVDEgVHJhbnNtaXQgRW5hYmxlCSovCisjZGVmaW5lCVBHVEVfUFBJCQkweDAwMDAJCQkvKiAJCUVuYWJsZSBQUEkgRDE1OjEzCQkJKi8KKyNkZWZpbmUJUEdURV9TUE9SVAkJMHgwODAwCQkJLyogCQlFbmFibGUgRFQxUFJJL1RGUzEvVFNDTEsxCSovCisKKworLyogICoqKioqKioqKioqKioqKioqKiAgSEFORFNIQUtFIERNQSAoSERNQSkgTUFTS1MgICoqKioqKioqKioqKioqKioqKioqKi8KKy8qIEhETUF4X0NUTCBNYXNrcwkJCQkJCQkJCQkJCQkJKi8KKyNkZWZpbmUJSE1ETUFFTgkJMHgwMDAxCS8qIEVuYWJsZSBIYW5kc2hha2UgRE1BIDAvMQkJCQkJKi8KKyNkZWZpbmUJUkVQCQkJMHgwMDAyCS8qIEhETUEgUmVxdWVzdCBQb2xhcml0eQkJCQkJKi8KKyNkZWZpbmUJVVRFCQkJMHgwMDA0CS8qIFVyZ2VuY3kgVGhyZXNob2xkIEVuYWJsZQkJCQkJKi8KKyNkZWZpbmUJT0lFCQkJMHgwMDEwCS8qIE92ZXJmbG93IEludGVycnVwdCBFbmFibGUJCQkJKi8KKyNkZWZpbmUJQkRJRQkJMHgwMDIwCS8qIEJsb2NrIERvbmUgSW50ZXJydXB0IEVuYWJsZQkJCQkqLworI2RlZmluZQlNQkRJCQkweDAwNDAJLyogTWFzayBCbG9jayBEb25lIElSUSBJZiBQZW5kaW5nIEVDTlQJCSovCisjZGVmaW5lCURSUQkJCTB4MDMwMAkvKiBIRE1BIFJlcXVlc3QgVHlwZQkJCQkJCSovCisjZGVmaW5lCURSUV9OT05FCTB4MDAwMAkvKiAJCU5vIFJlcXVlc3QJCQkJCQkJKi8KKyNkZWZpbmUJRFJRX1NJTkdMRQkweDAxMDAJLyogCQlDaGFubmVscyBSZXF1ZXN0IFNpbmdsZQkJCQkqLworI2RlZmluZQlEUlFfTVVMVEkJMHgwMjAwCS8qIAkJQ2hhbm5lbHMgUmVxdWVzdCBNdWx0aSAoRGVmYXVsdCkJKi8KKyNkZWZpbmUJRFJRX1VSR0VOVAkweDAzMDAJLyogCQlDaGFubmVscyBSZXF1ZXN0IE11bHRpIFVyZ2VudAkJKi8KKyNkZWZpbmUJUkJDCQkJMHgxMDAwCS8qIFJlbG9hZCBCQ05UIFdpdGggSUJDTlQJCQkJCSovCisjZGVmaW5lCVBTCQkJMHgyMDAwCS8qIEhETUEgUGluIFN0YXR1cwkJCQkJCQkqLworI2RlZmluZQlPSQkJCTB4NDAwMAkvKiBPdmVyZmxvdyBJbnRlcnJ1cHQgR2VuZXJhdGVkCQkJCSovCisjZGVmaW5lCUJESQkJCTB4ODAwMAkvKiBCbG9jayBEb25lIEludGVycnVwdCBHZW5lcmF0ZWQJCQkqLworCisvKiBlbnRyeSBhZGRyZXNzZXMgb2YgdGhlIHVzZXItY2FsbGFibGUgQm9vdCBST00gZnVuY3Rpb25zICovCisKKyNkZWZpbmUgX0JPT1RST01fUkVTRVQgMHhFRjAwMDAwMAorI2RlZmluZSBfQk9PVFJPTV9GSU5BTF9JTklUIDB4RUYwMDAwMDIKKyNkZWZpbmUgX0JPT1RST01fRE9fTUVNT1JZX0RNQSAweEVGMDAwMDA2CisjZGVmaW5lIF9CT09UUk9NX0JPT1RfRFhFX0ZMQVNIIDB4RUYwMDAwMDgKKyNkZWZpbmUgX0JPT1RST01fQk9PVF9EWEVfU1BJIDB4RUYwMDAwMEEKKyNkZWZpbmUgX0JPT1RST01fQk9PVF9EWEVfVFdJIDB4RUYwMDAwMEMKKyNkZWZpbmUgX0JPT1RST01fR0VUX0RYRV9BRERSRVNTX0ZMQVNIIDB4RUYwMDAwMTAKKyNkZWZpbmUgX0JPT1RST01fR0VUX0RYRV9BRERSRVNTX1NQSSAweEVGMDAwMDEyCisjZGVmaW5lIF9CT09UUk9NX0dFVF9EWEVfQUREUkVTU19UV0kgMHhFRjAwMDAxNAorCisvKiBBbHRlcm5hdGUgRGVwcmVjYXRlZCBNYWNyb3MgUHJvdmlkZWQgRm9yIEJhY2t3YXJkcyBDb2RlIENvbXBhdGliaWxpdHkgKi8KKyNkZWZpbmUJUEdERV9VQVJUICAgUEZERV9VQVJUCisjZGVmaW5lCVBHREVfRE1BICAgIFBGREVfRE1BCisjZGVmaW5lCUNLRUxPVwkJU0NLRUxPVworCisvKiBIT1NUIFBvcnQgUmVnaXN0ZXJzICovCisKKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICBIT1NUX0NPTlRST0wgIDB4ZmZjMDM0MDAgICAvKiBIT1NUIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgSE9TVF9TVEFUVVMgIDB4ZmZjMDM0MDQgICAvKiBIT1NUIFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgIEhPU1RfVElNRU9VVCAgMHhmZmMwMzQwOCAgIC8qIEhPU1QgQWNrbm93bGVkZ2UgTW9kZSBUaW1lb3V0IFJlZ2lzdGVyICovCisKKy8qIENvdW50ZXIgUmVnaXN0ZXJzICovCisKKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgIENOVF9DT05GSUcgIDB4ZmZjMDM1MDAgICAvKiBDb25maWd1cmF0aW9uIFJlZ2lzdGVyICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICAgQ05UX0lNQVNLICAweGZmYzAzNTA0ICAgLyogSW50ZXJydXB0IE1hc2sgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgIENOVF9TVEFUVVMgIDB4ZmZjMDM1MDggICAvKiBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgQ05UX0NPTU1BTkQgIDB4ZmZjMDM1MGMgICAvKiBDb21tYW5kIFJlZ2lzdGVyICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgQ05UX0RFQk9VTkNFICAweGZmYzAzNTEwICAgLyogRGVib3VuY2UgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgQ05UX0NPVU5URVIgIDB4ZmZjMDM1MTQgICAvKiBDb3VudGVyIFJlZ2lzdGVyICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICAgICBDTlRfTUFYICAweGZmYzAzNTE4ICAgLyogTWF4aW1hbCBDb3VudCBSZWdpc3RlciAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgICAgQ05UX01JTiAgMHhmZmMwMzUxYyAgIC8qIE1pbmltYWwgQ291bnQgUmVnaXN0ZXIgKi8KKworLyogT1RQL0ZVU0UgUmVnaXN0ZXJzICovCisKKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgT1RQX0NPTlRST0wgIDB4ZmZjMDM2MDAgICAvKiBPVFAvRnVzZSBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICAgICBPVFBfQkVOICAweGZmYzAzNjA0ICAgLyogT1RQL0Z1c2UgQnl0ZSBFbmFibGUgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgIE9UUF9TVEFUVVMgIDB4ZmZjMDM2MDggICAvKiBPVFAvRnVzZSBTdGF0dXMgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgIE9UUF9USU1JTkcgIDB4ZmZjMDM2MGMgICAvKiBPVFAvRnVzZSBBY2Nlc3MgVGltaW5nICovCisKKy8qIFNlY3VyaXR5IFJlZ2lzdGVycyAqLworCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICBTRUNVUkVfU1lTU1dUICAweGZmYzAzNjIwICAgLyogU2VjdXJlIFN5c3RlbSBTd2l0Y2hlcyAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICBTRUNVUkVfQ09OVFJPTCAgMHhmZmMwMzYyNCAgIC8qIFNlY3VyZSBDb250cm9sICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICBTRUNVUkVfU1RBVFVTICAweGZmYzAzNjI4ICAgLyogU2VjdXJlIFN0YXR1cyAqLworCisvKiBPVFAgUmVhZC9Xcml0ZSBEYXRhIEJ1ZmZlciBSZWdpc3RlcnMgKi8KKworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgIE9UUF9EQVRBMCAgMHhmZmMwMzY4MCAgIC8qIE9UUC9GdXNlIERhdGEgKE9UUF9EQVRBMC0zKSBhY2Nlc3NlcyB0aGUgZnVzZSByZWFkIHdyaXRlIGJ1ZmZlciAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgIE9UUF9EQVRBMSAgMHhmZmMwMzY4NCAgIC8qIE9UUC9GdXNlIERhdGEgKE9UUF9EQVRBMC0zKSBhY2Nlc3NlcyB0aGUgZnVzZSByZWFkIHdyaXRlIGJ1ZmZlciAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgIE9UUF9EQVRBMiAgMHhmZmMwMzY4OCAgIC8qIE9UUC9GdXNlIERhdGEgKE9UUF9EQVRBMC0zKSBhY2Nlc3NlcyB0aGUgZnVzZSByZWFkIHdyaXRlIGJ1ZmZlciAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgIE9UUF9EQVRBMyAgMHhmZmMwMzY4YyAgIC8qIE9UUC9GdXNlIERhdGEgKE9UUF9EQVRBMC0zKSBhY2Nlc3NlcyB0aGUgZnVzZSByZWFkIHdyaXRlIGJ1ZmZlciAqLworCisvKiBNb3RvciBDb250cm9sIFBXTSBSZWdpc3RlcnMgKi8KKworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgICBQV01fQ1RSTCAgMHhmZmMwMzcwMCAgIC8qIFBXTSBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICAgIFBXTV9TVEFUICAweGZmYzAzNzA0ICAgLyogUFdNIFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgICAgIFBXTV9UTSAgMHhmZmMwMzcwOCAgIC8qIFBXTSBQZXJpb2QgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgICAgICBQV01fRFQgIDB4ZmZjMDM3MGMgICAvKiBQV00gRGVhZCBUaW1lIFJlZ2lzdGVyICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICAgIFBXTV9HQVRFICAweGZmYzAzNzEwICAgLyogUFdNIENob3BwaW5nIENvbnRyb2wgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgICAgIFBXTV9DSEEgIDB4ZmZjMDM3MTQgICAvKiBQV00gQ2hhbm5lbCBBIER1dHkgQ29udHJvbCAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgICAgUFdNX0NIQiAgMHhmZmMwMzcxOCAgIC8qIFBXTSBDaGFubmVsIEIgRHV0eSBDb250cm9sICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICAgICBQV01fQ0hDICAweGZmYzAzNzFjICAgLyogUFdNIENoYW5uZWwgQyBEdXR5IENvbnRyb2wgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgICAgIFBXTV9TRUcgIDB4ZmZjMDM3MjAgICAvKiBQV00gQ3Jvc3NvdmVyIGFuZCBPdXRwdXQgRW5hYmxlICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICBQV01fU1lOQ1dUICAweGZmYzAzNzI0ICAgLyogUFdNIFN5bmMgUGx1c2UgV2lkdGggQ29udHJvbCAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgICBQV01fQ0hBTCAgMHhmZmMwMzcyOCAgIC8qIFBXTSBDaGFubmVsIEFMIER1dHkgQ29udHJvbCAoU1IgbW9kZSBvbmx5KSAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgICBQV01fQ0hCTCAgMHhmZmMwMzcyYyAgIC8qIFBXTSBDaGFubmVsIEJMIER1dHkgQ29udHJvbCAoU1IgbW9kZSBvbmx5KSAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgICBQV01fQ0hDTCAgMHhmZmMwMzczMCAgIC8qIFBXTSBDaGFubmVsIENMIER1dHkgQ29udHJvbCAoU1IgbW9kZSBvbmx5KSAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgICAgUFdNX0xTSSAgMHhmZmMwMzczNCAgIC8qIFBXTSBMb3cgU2lkZSBJbnZlcnQgKFNSIG1vZGUgb25seSkgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgICBQV01fU1RBVDIgIDB4ZmZjMDM3MzggICAvKiBQV00gU3RhdHVzIFJlZ2lzdGVyIDIgKi8KKworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiAgICAgU0lOR0xFIEJJVCBNQUNSTyBQQUlSUyAoYml0IG1hc2sgYW5kIG5lZ2F0ZWQgb25lKSAgICAgICovCisvKiAgICAgYW5kIE1VTFRJIEJJVCBSRUFEIE1BQ1JPUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKy8qIEJpdCBtYXNrcyBmb3IgSE9TVF9DT05UUk9MICovCisKKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgSE9TVF9DTlRSX0hPU1RfRU4gIDB4MSAgICAgICAgLyogSG9zdCBFbmFibGUgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICBIT1NUX0NOVFJfbkhPU1RfRU4gIDB4MAorI2RlZmluZSAgICAgICAgICAgICAgICAgIEhPU1RfQ05UUl9IT1NUX0VORCAgMHgyICAgICAgICAvKiBIb3N0IEVuZGlhbmVzcyAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgSE9TVF9DTlRSX25IT1NUX0VORCAgMHgwCisjZGVmaW5lICAgICAgICAgICAgICAgICBIT1NUX0NOVFJfREFUQV9TSVpFICAweDQgICAgICAgIC8qIERhdGEgU2l6ZSAqLworI2RlZmluZSAgICAgICAgICAgICAgICBIT1NUX0NOVFJfbkRBVEFfU0laRSAgMHgwCisjZGVmaW5lICAgICAgICAgICAgICAgICAgSE9TVF9DTlRSX0hPU1RfUlNUICAweDggICAgICAgIC8qIEhvc3QgUmVzZXQgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgIEhPU1RfQ05UUl9uSE9TVF9SU1QgIDB4MAorI2RlZmluZSAgICAgICAgICAgICAgICAgIEhPU1RfQ05UUl9IUkRZX09WUiAgMHgyMCAgICAgICAvKiBIb3N0IFJlYWR5IE92ZXJyaWRlICovCisjZGVmaW5lICAgICAgICAgICAgICAgICBIT1NUX0NOVFJfbkhSRFlfT1ZSICAweDAKKyNkZWZpbmUgICAgICAgICAgICAgICAgICBIT1NUX0NOVFJfSU5UX01PREUgIDB4NDAgICAgICAgLyogSW50ZXJydXB0IE1vZGUgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgIEhPU1RfQ05UUl9uSU5UX01PREUgIDB4MAorI2RlZmluZSAgICAgICAgICAgICAgICAgICAgIEhPU1RfQ05UUl9CVF9FTiAgMHg4MCAgICAgICAvKiBCdXMgVGltZW91dCBFbmFibGUgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgSE9TVF9DTlRSXyBuQlRfRU4gIDB4MAorI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgSE9TVF9DTlRSX0VIVyAgMHgxMDAgICAgICAvKiBFbmFibGUgSG9zdCBXcml0ZSAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICBIT1NUX0NOVFJfbkVIVyAgMHgwCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICBIT1NUX0NOVFJfRUhSICAweDIwMCAgICAgIC8qIEVuYWJsZSBIb3N0IFJlYWQgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgSE9TVF9DTlRSX25FSFIgIDB4MAorI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgSE9TVF9DTlRSX0JEUiAgMHg0MDAgICAgICAvKiBCdXJzdCBETUEgUmVxdWVzdHMgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgSE9TVF9DTlRSX25CRFIgIDB4MAorCisvKiBCaXQgbWFza3MgZm9yIEhPU1RfU1RBVFVTICovCisKKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICBIT1NUX1NUQVRfUkVBRFkgIDB4MSAgICAgICAgLyogRE1BIFJlYWR5ICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICBIT1NUX1NUQVRfblJFQURZICAweDAKKyNkZWZpbmUgICAgICAgICAgICAgICAgICBIT1NUX1NUQVRfRklGT0ZVTEwgIDB4MiAgICAgICAgLyogRklGTyBGdWxsICovCisjZGVmaW5lICAgICAgICAgICAgICAgICBIT1NUX1NUQVRfbkZJRk9GVUxMICAweDAKKyNkZWZpbmUgICAgICAgICAgICAgICAgIEhPU1RfU1RBVF9GSUZPRU1QVFkgIDB4NCAgICAgICAgLyogRklGTyBFbXB0eSAqLworI2RlZmluZSAgICAgICAgICAgICAgICBIT1NUX1NUQVRfbkZJRk9FTVBUWSAgMHgwCisjZGVmaW5lICAgICAgICAgICAgICAgICAgSE9TVF9TVEFUX0NPTVBMRVRFICAweDggICAgICAgIC8qIERNQSBDb21wbGV0ZSAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgSE9TVF9TVEFUX25DT01QTEVURSAgMHgwCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgIEhPU1RfU1RBVF9IU0hLICAweDEwICAgICAgIC8qIEhvc3QgSGFuZHNoYWtlICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgSE9TVF9TVEFUX25IU0hLICAweDAKKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgSE9TVF9TVEFUX1RJTUVPVVQgIDB4MjAgICAgICAgLyogSG9zdCBUaW1lb3V0ICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgSE9TVF9TVEFUX25USU1FT1VUICAweDAKKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgSE9TVF9TVEFUX0hJUlEgIDB4NDAgICAgICAgLyogSG9zdCBJbnRlcnJ1cHQgUmVxdWVzdCAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgIEhPU1RfU1RBVF9uSElSUSAgMHgwCisjZGVmaW5lICAgICAgICAgICAgICAgIEhPU1RfU1RBVF9BTExPV19DTkZHICAweDgwICAgICAgIC8qIEFsbG93IE5ldyBDb25maWd1cmF0aW9uICovCisjZGVmaW5lICAgICAgICAgICAgICAgSE9TVF9TVEFUX25BTExPV19DTkZHICAweDAKKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgSE9TVF9TVEFUX0RNQV9ESVIgIDB4MTAwICAgICAgLyogRE1BIERpcmVjdGlvbiAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgIEhPU1RfU1RBVF9uRE1BX0RJUiAgMHgwCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICBIT1NUX1NUQVRfQlRFICAweDIwMCAgICAgIC8qIEJ1cyBUaW1lb3V0IEVuYWJsZWQgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgSE9TVF9TVEFUX25CVEUgIDB4MAorI2RlZmluZSAgICAgICAgICAgICAgIEhPU1RfU1RBVF9IT1NUUkRfRE9ORSAgMHg4MDAwICAgICAvKiBIb3N0IFJlYWQgQ29tcGxldGlvbiBJbnRlcnJ1cHQgKi8KKyNkZWZpbmUgICAgICAgICAgICAgIEhPU1RfU1RBVF9uSE9TVFJEX0RPTkUgIDB4MAorCisvKiBCaXQgbWFza3MgZm9yIEhPU1RfVElNRU9VVCAqLworCisjZGVmaW5lICAgICAgICAgICAgIEhPU1RfQ09VTlRfVElNRU9VVCAgMHg3ZmYgICAgICAvKiBIb3N0IFRpbWVvdXQgY291bnQgKi8KKworLyogQml0IG1hc2tzIGZvciBTRUNVUkVfU1lTU1dUICovCisKKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgRU1VREFCTCAgMHgxICAgICAgICAvKiBFbXVsYXRpb24gRGlzYWJsZS4gKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICBuRU1VREFCTCAgMHgwCisjZGVmaW5lICAgICAgICAgICAgICAgICAgIFJTVERBQkwgIDB4MiAgICAgICAgLyogUmVzZXQgRGlzYWJsZSAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgIG5SU1REQUJMICAweDAKKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgTDFJREFCTCAgMHgxYyAgICAgICAvKiBMMSBJbnN0cnVjdGlvbiBNZW1vcnkgRGlzYWJsZS4gKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICBMMURBREFCTCAgMHhlMCAgICAgICAvKiBMMSBEYXRhIEJhbmsgQSBNZW1vcnkgRGlzYWJsZS4gKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICBMMURCREFCTCAgMHg3MDAgICAgICAvKiBMMSBEYXRhIEJhbmsgQiBNZW1vcnkgRGlzYWJsZS4gKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgRE1BME9WUiAgMHg4MDAgICAgICAvKiBETUEwIE1lbW9yeSBBY2Nlc3MgT3ZlcnJpZGUgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICBuRE1BME9WUiAgMHgwCisjZGVmaW5lICAgICAgICAgICAgICAgICAgIERNQTFPVlIgIDB4MTAwMCAgICAgLyogRE1BMSBNZW1vcnkgQWNjZXNzIE92ZXJyaWRlICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgbkRNQTFPVlIgIDB4MAorI2RlZmluZSAgICAgICAgICAgICAgICAgICAgRU1VT1ZSICAweDQwMDAgICAgIC8qIEVtdWxhdGlvbiBPdmVycmlkZSAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICBuRU1VT1ZSICAweDAKKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgIE9UUFNFTiAgMHg4MDAwICAgICAvKiBPVFAgU2VjcmV0cyBFbmFibGUuICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgIG5PVFBTRU4gIDB4MAorI2RlZmluZSAgICAgICAgICAgICAgICAgICAgTDJEQUJMICAweDcwMDAwICAgIC8qIEwyIE1lbW9yeSBEaXNhYmxlLiAqLworCisvKiBCaXQgbWFza3MgZm9yIFNFQ1VSRV9DT05UUk9MICovCisKKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgU0VDVVJFMCAgMHgxICAgICAgICAvKiBTRUNVUkUgMCAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgIG5TRUNVUkUwICAweDAKKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgU0VDVVJFMSAgMHgyICAgICAgICAvKiBTRUNVUkUgMSAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgIG5TRUNVUkUxICAweDAKKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgU0VDVVJFMiAgMHg0ICAgICAgICAvKiBTRUNVUkUgMiAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgIG5TRUNVUkUyICAweDAKKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgU0VDVVJFMyAgMHg4ICAgICAgICAvKiBTRUNVUkUgMyAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgIG5TRUNVUkUzICAweDAKKworLyogQml0IG1hc2tzIGZvciBTRUNVUkVfU1RBVFVTICovCisKKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgU0VDTU9ERSAgMHgzICAgICAgICAvKiBTZWN1cmVkIE1vZGUgQ29udHJvbCBTdGF0ZSAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgTk1JICAweDQgICAgICAgIC8qIE5vbiBNYXNrYWJsZSBJbnRlcnJ1cHQgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgbk5NSSAgMHgwCisjZGVmaW5lICAgICAgICAgICAgICAgICAgIEFGVkFMSUQgIDB4OCAgICAgICAgLyogQXV0aGVudGljYXRpb24gRmlybXdhcmUgVmFsaWQgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICBuQUZWQUxJRCAgMHgwCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICBBRkVYSVQgIDB4MTAgICAgICAgLyogQXV0aGVudGljYXRpb24gRmlybXdhcmUgRXhpdCAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICBuQUZFWElUICAweDAKKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgU0VDU1RBVCAgMHhlMCAgICAgICAvKiBTZWN1cmUgU3RhdHVzICovCiAKICNlbmRpZiAvKiBfREVGX0JGNTEyX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9pbmNsdWRlL21hY2gvZGVmQkY1MXhfYmFzZS5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2luY2x1ZGUvbWFjaC9kZWZCRjUxeF9iYXNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmODQ5MTMuLjAwMDAwMDAKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2luY2x1ZGUvbWFjaC9kZWZCRjUxeF9iYXNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNDk1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwOCBBbmFsb2cgRGV2aWNlcyBJbmMuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFESSBCU0QgbGljZW5zZSBvciB0aGUgR1BMLTIgKG9yIGxhdGVyKQotICovCi0KLSNpZm5kZWYgX0RFRl9CRjUxWF9ICi0jZGVmaW5lIF9ERUZfQkY1MVhfSAotCi0KLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0vKiAgIFNZU1RFTSAmIE1NUiBBRERSRVNTIERFRklOSVRJT05TIENPTU1PTiBUTyBBTEwgQURTUC1CRjUxeCAgICAqLwotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLQotLyogQ2xvY2sgYW5kIFN5c3RlbSBDb250cm9sCSgweEZGQzAwMDAwIC0gMHhGRkMwMDBGRikJCQkJCQkJCSovCi0jZGVmaW5lIFBMTF9DVEwJCQkJMHhGRkMwMDAwMAkvKiBQTEwgQ29udHJvbCBSZWdpc3RlcgkJCQkJCSovCi0jZGVmaW5lIFBMTF9ESVYJCQkJMHhGRkMwMDAwNAkvKiBQTEwgRGl2aWRlIFJlZ2lzdGVyCQkJCQkJKi8KLSNkZWZpbmUgVlJfQ1RMCQkJCTB4RkZDMDAwMDgJLyogVm9sdGFnZSBSZWd1bGF0b3IgQ29udHJvbCBSZWdpc3RlcgkJCQkqLwotI2RlZmluZSBQTExfU1RBVAkJCTB4RkZDMDAwMEMJLyogUExMIFN0YXR1cyBSZWdpc3RlcgkJCQkJCSovCi0jZGVmaW5lIFBMTF9MT0NLQ05UCQkJMHhGRkMwMDAxMAkvKiBQTEwgTG9jayBDb3VudCBSZWdpc3RlcgkJCQkJKi8KLSNkZWZpbmUgQ0hJUElECQkJCTB4RkZDMDAwMTQJLyogRGV2aWNlIElEIFJlZ2lzdGVyICovCi0KLS8qIFN5c3RlbSBJbnRlcnJ1cHQgQ29udHJvbGxlciAoMHhGRkMwMDEwMCAtIDB4RkZDMDAxRkYpCQkJCQkJCQkqLwotI2RlZmluZSBTV1JTVAkJCQkweEZGQzAwMTAwCS8qIFNvZnR3YXJlIFJlc2V0IFJlZ2lzdGVyCQkJCQkqLwotI2RlZmluZSBTWVNDUgkJCQkweEZGQzAwMTA0CS8qIFN5c3RlbSBDb25maWd1cmF0aW9uIFJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIFNJQ19SVkVDVAkJCTB4RkZDMDAxMDgJLyogSW50ZXJydXB0IFJlc2V0IFZlY3RvciBBZGRyZXNzIFJlZ2lzdGVyCQkJKi8KLQotI2RlZmluZSBTSUNfSU1BU0swCQkJMHhGRkMwMDEwQwkvKiBJbnRlcnJ1cHQgTWFzayBSZWdpc3RlcgkJCQkJKi8KLSNkZWZpbmUgU0lDX0lBUjAJCQkweEZGQzAwMTEwCS8qIEludGVycnVwdCBBc3NpZ25tZW50IFJlZ2lzdGVyIDAJCQkJKi8KLSNkZWZpbmUgU0lDX0lBUjEJCQkweEZGQzAwMTE0CS8qIEludGVycnVwdCBBc3NpZ25tZW50IFJlZ2lzdGVyIDEJCQkJKi8KLSNkZWZpbmUgU0lDX0lBUjIJCQkweEZGQzAwMTE4CS8qIEludGVycnVwdCBBc3NpZ25tZW50IFJlZ2lzdGVyIDIJCQkJKi8KLSNkZWZpbmUgU0lDX0lBUjMJCQkweEZGQzAwMTFDCS8qIEludGVycnVwdCBBc3NpZ25tZW50IFJlZ2lzdGVyIDMJCQkJKi8KLSNkZWZpbmUgU0lDX0lTUjAJCQkweEZGQzAwMTIwCS8qIEludGVycnVwdCBTdGF0dXMgUmVnaXN0ZXIJCQkJCSovCi0jZGVmaW5lIFNJQ19JV1IwCQkJMHhGRkMwMDEyNAkvKiBJbnRlcnJ1cHQgV2FrZXVwIFJlZ2lzdGVyCQkJCQkqLwotCi0vKiBTSUMgQWRkaXRpb25zIHRvIEFEU1AtQkY1MXggKDB4RkZDMDAxNEMgLSAweEZGQzAwMTYyKSAqLwotI2RlZmluZSBTSUNfSU1BU0sxICAgICAgICAgICAgICAgICAgICAgIDB4RkZDMDAxNEMgICAgIC8qIEludGVycnVwdCBNYXNrIHJlZ2lzdGVyIG9mIFNJQzIgKi8KLSNkZWZpbmUgU0lDX0lBUjQgICAgICAgICAgICAgICAgICAgICAgICAweEZGQzAwMTUwICAgICAvKiBJbnRlcnJ1cHQgQXNzaWdubWVudCByZWdpc3RlcjQgKi8KLSNkZWZpbmUgU0lDX0lBUjUgICAgICAgICAgICAgICAgICAgICAgICAweEZGQzAwMTU0ICAgICAvKiBJbnRlcnJ1cHQgQXNzaWdubWVudCByZWdpc3RlcjUgKi8KLSNkZWZpbmUgU0lDX0lBUjYgICAgICAgICAgICAgICAgICAgICAgICAweEZGQzAwMTU4ICAgICAvKiBJbnRlcnJ1cHQgQXNzaWdubWVudCByZWdpc3RlcjYgKi8KLSNkZWZpbmUgU0lDX0lBUjcgICAgICAgICAgICAgICAgICAgICAgICAweEZGQzAwMTVDICAgICAvKiBJbnRlcnJ1cHQgQXNzaWdubWVudCByZWdpc3RlcjcgKi8KLSNkZWZpbmUgU0lDX0lTUjEgICAgICAgICAgICAgICAgICAgICAgICAweEZGQzAwMTYwICAgICAvKiBJbnRlcnJ1cHQgU3RhdHVyIHJlZ2lzdGVyICovCi0jZGVmaW5lIFNJQ19JV1IxICAgICAgICAgICAgICAgICAgICAgICAgMHhGRkMwMDE2NCAgICAgLyogSW50ZXJydXB0IFdha2V1cCByZWdpc3RlciAqLwotCi0KLS8qIFdhdGNoZG9nIFRpbWVyCQkJKDB4RkZDMDAyMDAgLSAweEZGQzAwMkZGKQkJCQkJCQkJKi8KLSNkZWZpbmUgV0RPR19DVEwJCQkweEZGQzAwMjAwCS8qIFdhdGNoZG9nIENvbnRyb2wgUmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgV0RPR19DTlQJCQkweEZGQzAwMjA0CS8qIFdhdGNoZG9nIENvdW50IFJlZ2lzdGVyCQkJCQkqLwotI2RlZmluZSBXRE9HX1NUQVQJCQkweEZGQzAwMjA4CS8qIFdhdGNoZG9nIFN0YXR1cyBSZWdpc3RlcgkJCQkJKi8KLQotCi0vKiBSZWFsIFRpbWUgQ2xvY2sJCSgweEZGQzAwMzAwIC0gMHhGRkMwMDNGRikJCQkJCQkJCQkqLwotI2RlZmluZSBSVENfU1RBVAkJCTB4RkZDMDAzMDAJLyogUlRDIFN0YXR1cyBSZWdpc3RlcgkJCQkJCSovCi0jZGVmaW5lIFJUQ19JQ1RMCQkJMHhGRkMwMDMwNAkvKiBSVEMgSW50ZXJydXB0IENvbnRyb2wgUmVnaXN0ZXIJCQkqLwotI2RlZmluZSBSVENfSVNUQVQJCQkweEZGQzAwMzA4CS8qIFJUQyBJbnRlcnJ1cHQgU3RhdHVzIFJlZ2lzdGVyCQkJKi8KLSNkZWZpbmUgUlRDX1NXQ05UCQkJMHhGRkMwMDMwQwkvKiBSVEMgU3RvcHdhdGNoIENvdW50IFJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIFJUQ19BTEFSTQkJCTB4RkZDMDAzMTAJLyogUlRDIEFsYXJtIFRpbWUgUmVnaXN0ZXIJCQkJCSovCi0jZGVmaW5lIFJUQ19GQVNUCQkJMHhGRkMwMDMxNAkvKiBSVEMgUHJlc2NhbGVyIEVuYWJsZSBSZWdpc3RlcgkJCSovCi0jZGVmaW5lIFJUQ19QUkVOCQkJMHhGRkMwMDMxNAkvKiBSVEMgUHJlc2NhbGVyIEVuYWJsZSBBbHRlcm5hdGUgTWFjcm8JCSovCi0KLQotLyogVUFSVDAgQ29udHJvbGxlcgkJKDB4RkZDMDA0MDAgLSAweEZGQzAwNEZGKQkJCQkJCQkJCSovCi0jZGVmaW5lIFVBUlQwX1RIUgkJCTB4RkZDMDA0MDAJLyogVHJhbnNtaXQgSG9sZGluZyByZWdpc3RlcgkJCQkqLwotI2RlZmluZSBVQVJUMF9SQlIJCQkweEZGQzAwNDAwCS8qIFJlY2VpdmUgQnVmZmVyIHJlZ2lzdGVyCQkJCQkqLwotI2RlZmluZSBVQVJUMF9ETEwJCQkweEZGQzAwNDAwCS8qIERpdmlzb3IgTGF0Y2ggKExvdy1CeXRlKQkJCQkJKi8KLSNkZWZpbmUgVUFSVDBfSUVSCQkJMHhGRkMwMDQwNAkvKiBJbnRlcnJ1cHQgRW5hYmxlIFJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIFVBUlQwX0RMSAkJCTB4RkZDMDA0MDQJLyogRGl2aXNvciBMYXRjaCAoSGlnaC1CeXRlKQkJCQkqLwotI2RlZmluZSBVQVJUMF9JSVIJCQkweEZGQzAwNDA4CS8qIEludGVycnVwdCBJZGVudGlmaWNhdGlvbiBSZWdpc3RlcgkJKi8KLSNkZWZpbmUgVUFSVDBfTENSCQkJMHhGRkMwMDQwQwkvKiBMaW5lIENvbnRyb2wgUmVnaXN0ZXIJCQkJCSovCi0jZGVmaW5lIFVBUlQwX01DUgkJCTB4RkZDMDA0MTAJLyogTW9kZW0gQ29udHJvbCBSZWdpc3RlcgkJCQkJKi8KLSNkZWZpbmUgVUFSVDBfTFNSCQkJMHhGRkMwMDQxNAkvKiBMaW5lIFN0YXR1cyBSZWdpc3RlcgkJCQkJCSovCi0jZGVmaW5lIFVBUlQwX01TUgkJCTB4RkZDMDA0MTgJLyogTW9kZW0gU3RhdHVzIFJlZ2lzdGVyCQkJCQkqLwotI2RlZmluZSBVQVJUMF9TQ1IJCQkweEZGQzAwNDFDCS8qIFNDUiBTY3JhdGNoIFJlZ2lzdGVyCQkJCQkJKi8KLSNkZWZpbmUgVUFSVDBfR0NUTAkJCTB4RkZDMDA0MjQJLyogR2xvYmFsIENvbnRyb2wgUmVnaXN0ZXIJCQkJCSovCi0KLS8qIFNQSTAgQ29udHJvbGxlcgkJCSgweEZGQzAwNTAwIC0gMHhGRkMwMDVGRikJCQkJCQkJKi8KLSNkZWZpbmUgU1BJMF9SRUdCQVNFCQkJMHhGRkMwMDUwMAotI2RlZmluZSBTUEkwX0NUTAkJCTB4RkZDMDA1MDAJLyogU1BJIENvbnRyb2wgUmVnaXN0ZXIJCQkJCQkqLwotI2RlZmluZSBTUEkwX0ZMRwkJCTB4RkZDMDA1MDQJLyogU1BJIEZsYWcgcmVnaXN0ZXIJCQkJCQkqLwotI2RlZmluZSBTUEkwX1NUQVQJCQkweEZGQzAwNTA4CS8qIFNQSSBTdGF0dXMgcmVnaXN0ZXIJCQkJCQkqLwotI2RlZmluZSBTUEkwX1REQlIJCQkweEZGQzAwNTBDCS8qIFNQSSBUcmFuc21pdCBEYXRhIEJ1ZmZlciBSZWdpc3RlcgkJCQkqLwotI2RlZmluZSBTUEkwX1JEQlIJCQkweEZGQzAwNTEwCS8qIFNQSSBSZWNlaXZlIERhdGEgQnVmZmVyIFJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIFNQSTBfQkFVRAkJCTB4RkZDMDA1MTQJLyogU1BJIEJhdWQgcmF0ZSBSZWdpc3RlcgkJCQkJKi8KLSNkZWZpbmUgU1BJMF9TSEFET1cJCQkweEZGQzAwNTE4CS8qIFNQSV9SREJSIFNoYWRvdyBSZWdpc3RlcgkJCQkJKi8KLQotLyogU1BJMSBDb250cm9sbGVyCQkJKDB4RkZDMDM0MDAgLSAweEZGQzAzNEZGKQkJCQkJCQkqLwotI2RlZmluZSBTUEkxX1JFR0JBU0UJCQkweEZGQzAzNDAwCi0jZGVmaW5lIFNQSTFfQ1RMCQkJMHhGRkMwMzQwMAkvKiBTUEkgQ29udHJvbCBSZWdpc3RlcgkJCQkJCSovCi0jZGVmaW5lIFNQSTFfRkxHCQkJMHhGRkMwMzQwNAkvKiBTUEkgRmxhZyByZWdpc3RlcgkJCQkJCSovCi0jZGVmaW5lIFNQSTFfU1RBVAkJCTB4RkZDMDM0MDgJLyogU1BJIFN0YXR1cyByZWdpc3RlcgkJCQkJCSovCi0jZGVmaW5lIFNQSTFfVERCUgkJCTB4RkZDMDM0MEMJLyogU1BJIFRyYW5zbWl0IERhdGEgQnVmZmVyIFJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIFNQSTFfUkRCUgkJCTB4RkZDMDM0MTAJLyogU1BJIFJlY2VpdmUgRGF0YSBCdWZmZXIgUmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgU1BJMV9CQVVECQkJMHhGRkMwMzQxNAkvKiBTUEkgQmF1ZCByYXRlIFJlZ2lzdGVyCQkJCQkqLwotI2RlZmluZSBTUEkxX1NIQURPVwkJCTB4RkZDMDM0MTgJLyogU1BJX1JEQlIgU2hhZG93IFJlZ2lzdGVyCQkJCQkqLwotCi0vKiBUSU1FUjAtNyBSZWdpc3RlcnMJCSgweEZGQzAwNjAwIC0gMHhGRkMwMDZGRikJCQkJCQkJCSovCi0jZGVmaW5lIFRJTUVSMF9DT05GSUcJCTB4RkZDMDA2MDAJLyogVGltZXIgMCBDb25maWd1cmF0aW9uIFJlZ2lzdGVyCQkJKi8KLSNkZWZpbmUgVElNRVIwX0NPVU5URVIJCTB4RkZDMDA2MDQJLyogVGltZXIgMCBDb3VudGVyIFJlZ2lzdGVyCQkJCQkqLwotI2RlZmluZSBUSU1FUjBfUEVSSU9ECQkweEZGQzAwNjA4CS8qIFRpbWVyIDAgUGVyaW9kIFJlZ2lzdGVyCQkJCQkqLwotI2RlZmluZSBUSU1FUjBfV0lEVEgJCTB4RkZDMDA2MEMJLyogVGltZXIgMCBXaWR0aCBSZWdpc3RlcgkJCQkJKi8KLQotI2RlZmluZSBUSU1FUjFfQ09ORklHCQkweEZGQzAwNjEwCS8qIFRpbWVyIDEgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAgCQkJKi8KLSNkZWZpbmUgVElNRVIxX0NPVU5URVIJCTB4RkZDMDA2MTQJLyogVGltZXIgMSBDb3VudGVyIFJlZ2lzdGVyICAgICAgICAJCQkqLwotI2RlZmluZSBUSU1FUjFfUEVSSU9ECQkweEZGQzAwNjE4CS8qIFRpbWVyIDEgUGVyaW9kIFJlZ2lzdGVyICAgICAgICAgCQkJKi8KLSNkZWZpbmUgVElNRVIxX1dJRFRICQkweEZGQzAwNjFDCS8qIFRpbWVyIDEgV2lkdGggUmVnaXN0ZXIgICAgICAgICAgCQkJKi8KLQotI2RlZmluZSBUSU1FUjJfQ09ORklHCQkweEZGQzAwNjIwCS8qIFRpbWVyIDIgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAgCQkJKi8KLSNkZWZpbmUgVElNRVIyX0NPVU5URVIJCTB4RkZDMDA2MjQJLyogVGltZXIgMiBDb3VudGVyIFJlZ2lzdGVyICAgICAgICAJCQkqLwotI2RlZmluZSBUSU1FUjJfUEVSSU9ECQkweEZGQzAwNjI4CS8qIFRpbWVyIDIgUGVyaW9kIFJlZ2lzdGVyICAgICAgICAgCQkJKi8KLSNkZWZpbmUgVElNRVIyX1dJRFRICQkweEZGQzAwNjJDCS8qIFRpbWVyIDIgV2lkdGggUmVnaXN0ZXIgICAgICAgICAgCQkJKi8KLQotI2RlZmluZSBUSU1FUjNfQ09ORklHCQkweEZGQzAwNjMwCS8qIFRpbWVyIDMgQ29uZmlndXJhdGlvbiBSZWdpc3RlcgkJCSovCi0jZGVmaW5lIFRJTUVSM19DT1VOVEVSCQkweEZGQzAwNjM0CS8qIFRpbWVyIDMgQ291bnRlciBSZWdpc3RlcgkJCQkJKi8KLSNkZWZpbmUgVElNRVIzX1BFUklPRAkJMHhGRkMwMDYzOAkvKiBUaW1lciAzIFBlcmlvZCBSZWdpc3RlcgkJCQkJKi8KLSNkZWZpbmUgVElNRVIzX1dJRFRICQkweEZGQzAwNjNDCS8qIFRpbWVyIDMgV2lkdGggUmVnaXN0ZXIJCQkJCSovCi0KLSNkZWZpbmUgVElNRVI0X0NPTkZJRwkJMHhGRkMwMDY0MAkvKiBUaW1lciA0IENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgIAkJCSovCi0jZGVmaW5lIFRJTUVSNF9DT1VOVEVSCQkweEZGQzAwNjQ0CS8qIFRpbWVyIDQgQ291bnRlciBSZWdpc3RlciAgICAgICAgCQkJKi8KLSNkZWZpbmUgVElNRVI0X1BFUklPRAkJMHhGRkMwMDY0OAkvKiBUaW1lciA0IFBlcmlvZCBSZWdpc3RlciAgICAgICAgIAkJCSovCi0jZGVmaW5lIFRJTUVSNF9XSURUSAkJMHhGRkMwMDY0QwkvKiBUaW1lciA0IFdpZHRoIFJlZ2lzdGVyICAgICAgICAgIAkJCSovCi0KLSNkZWZpbmUgVElNRVI1X0NPTkZJRwkJMHhGRkMwMDY1MAkvKiBUaW1lciA1IENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgIAkJCSovCi0jZGVmaW5lIFRJTUVSNV9DT1VOVEVSCQkweEZGQzAwNjU0CS8qIFRpbWVyIDUgQ291bnRlciBSZWdpc3RlciAgICAgICAgCQkJKi8KLSNkZWZpbmUgVElNRVI1X1BFUklPRAkJMHhGRkMwMDY1OAkvKiBUaW1lciA1IFBlcmlvZCBSZWdpc3RlciAgICAgICAgIAkJCSovCi0jZGVmaW5lIFRJTUVSNV9XSURUSAkJMHhGRkMwMDY1QwkvKiBUaW1lciA1IFdpZHRoIFJlZ2lzdGVyICAgICAgICAgIAkJCSovCi0KLSNkZWZpbmUgVElNRVI2X0NPTkZJRwkJMHhGRkMwMDY2MAkvKiBUaW1lciA2IENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgIAkJCSovCi0jZGVmaW5lIFRJTUVSNl9DT1VOVEVSCQkweEZGQzAwNjY0CS8qIFRpbWVyIDYgQ291bnRlciBSZWdpc3RlciAgICAgICAgCQkJKi8KLSNkZWZpbmUgVElNRVI2X1BFUklPRAkJMHhGRkMwMDY2OAkvKiBUaW1lciA2IFBlcmlvZCBSZWdpc3RlciAgICAgICAgIAkJCSovCi0jZGVmaW5lIFRJTUVSNl9XSURUSAkJMHhGRkMwMDY2QwkvKiBUaW1lciA2IFdpZHRoIFJlZ2lzdGVyICAgICAgICAgIAkJCSovCi0KLSNkZWZpbmUgVElNRVI3X0NPTkZJRwkJMHhGRkMwMDY3MAkvKiBUaW1lciA3IENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgIAkJCSovCi0jZGVmaW5lIFRJTUVSN19DT1VOVEVSCQkweEZGQzAwNjc0CS8qIFRpbWVyIDcgQ291bnRlciBSZWdpc3RlciAgICAgICAgCQkJKi8KLSNkZWZpbmUgVElNRVI3X1BFUklPRAkJMHhGRkMwMDY3OAkvKiBUaW1lciA3IFBlcmlvZCBSZWdpc3RlciAgICAgICAgIAkJCSovCi0jZGVmaW5lIFRJTUVSN19XSURUSAkJMHhGRkMwMDY3QwkvKiBUaW1lciA3IFdpZHRoIFJlZ2lzdGVyICAgICAgIAkJCSovCi0KLSNkZWZpbmUgVElNRVJfRU5BQkxFCQkweEZGQzAwNjgwCS8qIFRpbWVyIEVuYWJsZSBSZWdpc3RlcgkJCQkJKi8KLSNkZWZpbmUgVElNRVJfRElTQUJMRQkJMHhGRkMwMDY4NAkvKiBUaW1lciBEaXNhYmxlIFJlZ2lzdGVyCQkJCQkqLwotI2RlZmluZSBUSU1FUl9TVEFUVVMJCTB4RkZDMDA2ODgJLyogVGltZXIgU3RhdHVzIFJlZ2lzdGVyCQkJCQkqLwotCi0vKiBHZW5lcmFsIFB1cnBvc2UgSS9PIFBvcnQgRiAoMHhGRkMwMDcwMCAtIDB4RkZDMDA3RkYpCQkJCQkJCQkJCQkJKi8KLSNkZWZpbmUgUE9SVEZJTwkJCQkJMHhGRkMwMDcwMAkvKiBQb3J0IEYgSS9PIFBpbiBTdGF0ZSBTcGVjaWZ5IFJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIFBPUlRGSU9fQ0xFQVIJCQkweEZGQzAwNzA0CS8qIFBvcnQgRiBJL08gUGVyaXBoZXJhbCBJbnRlcnJ1cHQgQ2xlYXIgUmVnaXN0ZXIJCSovCi0jZGVmaW5lIFBPUlRGSU9fU0VUCQkJCTB4RkZDMDA3MDgJLyogUG9ydCBGIEkvTyBQZXJpcGhlcmFsIEludGVycnVwdCBTZXQgUmVnaXN0ZXIJCQkqLwotI2RlZmluZSBQT1JURklPX1RPR0dMRQkJCTB4RkZDMDA3MEMJLyogUG9ydCBGIEkvTyBQaW4gU3RhdGUgVG9nZ2xlIFJlZ2lzdGVyCQkJCQkqLwotI2RlZmluZSBQT1JURklPX01BU0tBCQkJMHhGRkMwMDcxMAkvKiBQb3J0IEYgSS9PIE1hc2sgU3RhdGUgU3BlY2lmeSBJbnRlcnJ1cHQgQSBSZWdpc3RlcgkqLwotI2RlZmluZSBQT1JURklPX01BU0tBX0NMRUFSCQkweEZGQzAwNzE0CS8qIFBvcnQgRiBJL08gTWFzayBEaXNhYmxlIEludGVycnVwdCBBIFJlZ2lzdGVyCQkJKi8KLSNkZWZpbmUgUE9SVEZJT19NQVNLQV9TRVQJCTB4RkZDMDA3MTgJLyogUG9ydCBGIEkvTyBNYXNrIEVuYWJsZSBJbnRlcnJ1cHQgQSBSZWdpc3RlcgkJCSovCi0jZGVmaW5lIFBPUlRGSU9fTUFTS0FfVE9HR0xFCTB4RkZDMDA3MUMJLyogUG9ydCBGIEkvTyBNYXNrIFRvZ2dsZSBFbmFibGUgSW50ZXJydXB0IEEgUmVnaXN0ZXIJKi8KLSNkZWZpbmUgUE9SVEZJT19NQVNLQgkJCTB4RkZDMDA3MjAJLyogUG9ydCBGIEkvTyBNYXNrIFN0YXRlIFNwZWNpZnkgSW50ZXJydXB0IEIgUmVnaXN0ZXIJKi8KLSNkZWZpbmUgUE9SVEZJT19NQVNLQl9DTEVBUgkJMHhGRkMwMDcyNAkvKiBQb3J0IEYgSS9PIE1hc2sgRGlzYWJsZSBJbnRlcnJ1cHQgQiBSZWdpc3RlcgkJCSovCi0jZGVmaW5lIFBPUlRGSU9fTUFTS0JfU0VUCQkweEZGQzAwNzI4CS8qIFBvcnQgRiBJL08gTWFzayBFbmFibGUgSW50ZXJydXB0IEIgUmVnaXN0ZXIJCQkqLwotI2RlZmluZSBQT1JURklPX01BU0tCX1RPR0dMRQkweEZGQzAwNzJDCS8qIFBvcnQgRiBJL08gTWFzayBUb2dnbGUgRW5hYmxlIEludGVycnVwdCBCIFJlZ2lzdGVyCSovCi0jZGVmaW5lIFBPUlRGSU9fRElSCQkJCTB4RkZDMDA3MzAJLyogUG9ydCBGIEkvTyBEaXJlY3Rpb24gUmVnaXN0ZXIJCQkJCQkqLwotI2RlZmluZSBQT1JURklPX1BPTEFSCQkJMHhGRkMwMDczNAkvKiBQb3J0IEYgSS9PIFNvdXJjZSBQb2xhcml0eSBSZWdpc3RlcgkJCQkJKi8KLSNkZWZpbmUgUE9SVEZJT19FREdFCQkJMHhGRkMwMDczOAkvKiBQb3J0IEYgSS9PIFNvdXJjZSBTZW5zaXRpdml0eSBSZWdpc3RlcgkJCQkqLwotI2RlZmluZSBQT1JURklPX0JPVEgJCQkweEZGQzAwNzNDCS8qIFBvcnQgRiBJL08gU2V0IG9uIEJPVEggRWRnZXMgUmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgUE9SVEZJT19JTkVOCQkJMHhGRkMwMDc0MAkvKiBQb3J0IEYgSS9PIElucHV0IEVuYWJsZSBSZWdpc3RlciAJCQkJCSovCi0KLS8qIFNQT1JUMCBDb250cm9sbGVyCQkoMHhGRkMwMDgwMCAtIDB4RkZDMDA4RkYpCQkJCQkJCQkJCSovCi0jZGVmaW5lIFNQT1JUMF9UQ1IxCQkJMHhGRkMwMDgwMAkvKiBTUE9SVDAgVHJhbnNtaXQgQ29uZmlndXJhdGlvbiAxIFJlZ2lzdGVyCQkJKi8KLSNkZWZpbmUgU1BPUlQwX1RDUjIJCQkweEZGQzAwODA0CS8qIFNQT1JUMCBUcmFuc21pdCBDb25maWd1cmF0aW9uIDIgUmVnaXN0ZXIJCQkqLwotI2RlZmluZSBTUE9SVDBfVENMS0RJVgkJMHhGRkMwMDgwOAkvKiBTUE9SVDAgVHJhbnNtaXQgQ2xvY2sgRGl2aWRlcgkJCQkJKi8KLSNkZWZpbmUgU1BPUlQwX1RGU0RJVgkJMHhGRkMwMDgwQwkvKiBTUE9SVDAgVHJhbnNtaXQgRnJhbWUgU3luYyBEaXZpZGVyCQkJCSovCi0jZGVmaW5lIFNQT1JUMF9UWAkJCTB4RkZDMDA4MTAJLyogU1BPUlQwIFRYIERhdGEgUmVnaXN0ZXIJCQkJCQkJKi8KLSNkZWZpbmUgU1BPUlQwX1JYCQkJMHhGRkMwMDgxOAkvKiBTUE9SVDAgUlggRGF0YSBSZWdpc3RlcgkJCQkJCQkqLwotI2RlZmluZSBTUE9SVDBfUkNSMQkJCTB4RkZDMDA4MjAJLyogU1BPUlQwIFRyYW5zbWl0IENvbmZpZ3VyYXRpb24gMSBSZWdpc3RlcgkJCSovCi0jZGVmaW5lIFNQT1JUMF9SQ1IyCQkJMHhGRkMwMDgyNAkvKiBTUE9SVDAgVHJhbnNtaXQgQ29uZmlndXJhdGlvbiAyIFJlZ2lzdGVyCQkJKi8KLSNkZWZpbmUgU1BPUlQwX1JDTEtESVYJCTB4RkZDMDA4MjgJLyogU1BPUlQwIFJlY2VpdmUgQ2xvY2sgRGl2aWRlcgkJCQkJCSovCi0jZGVmaW5lIFNQT1JUMF9SRlNESVYJCTB4RkZDMDA4MkMJLyogU1BPUlQwIFJlY2VpdmUgRnJhbWUgU3luYyBEaXZpZGVyCQkJCSovCi0jZGVmaW5lIFNQT1JUMF9TVEFUCQkJMHhGRkMwMDgzMAkvKiBTUE9SVDAgU3RhdHVzIFJlZ2lzdGVyCQkJCQkJCSovCi0jZGVmaW5lIFNQT1JUMF9DSE5MCQkJMHhGRkMwMDgzNAkvKiBTUE9SVDAgQ3VycmVudCBDaGFubmVsIFJlZ2lzdGVyCQkJCQkqLwotI2RlZmluZSBTUE9SVDBfTUNNQzEJCTB4RkZDMDA4MzgJLyogU1BPUlQwIE11bHRpLUNoYW5uZWwgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAxCSovCi0jZGVmaW5lIFNQT1JUMF9NQ01DMgkJMHhGRkMwMDgzQwkvKiBTUE9SVDAgTXVsdGktQ2hhbm5lbCBDb25maWd1cmF0aW9uIFJlZ2lzdGVyIDIJKi8KLSNkZWZpbmUgU1BPUlQwX01UQ1MwCQkweEZGQzAwODQwCS8qIFNQT1JUMCBNdWx0aS1DaGFubmVsIFRyYW5zbWl0IFNlbGVjdCBSZWdpc3RlciAwCSovCi0jZGVmaW5lIFNQT1JUMF9NVENTMQkJMHhGRkMwMDg0NAkvKiBTUE9SVDAgTXVsdGktQ2hhbm5lbCBUcmFuc21pdCBTZWxlY3QgUmVnaXN0ZXIgMQkqLwotI2RlZmluZSBTUE9SVDBfTVRDUzIJCTB4RkZDMDA4NDgJLyogU1BPUlQwIE11bHRpLUNoYW5uZWwgVHJhbnNtaXQgU2VsZWN0IFJlZ2lzdGVyIDIJKi8KLSNkZWZpbmUgU1BPUlQwX01UQ1MzCQkweEZGQzAwODRDCS8qIFNQT1JUMCBNdWx0aS1DaGFubmVsIFRyYW5zbWl0IFNlbGVjdCBSZWdpc3RlciAzCSovCi0jZGVmaW5lIFNQT1JUMF9NUkNTMAkJMHhGRkMwMDg1MAkvKiBTUE9SVDAgTXVsdGktQ2hhbm5lbCBSZWNlaXZlIFNlbGVjdCBSZWdpc3RlciAwCSovCi0jZGVmaW5lIFNQT1JUMF9NUkNTMQkJMHhGRkMwMDg1NAkvKiBTUE9SVDAgTXVsdGktQ2hhbm5lbCBSZWNlaXZlIFNlbGVjdCBSZWdpc3RlciAxCSovCi0jZGVmaW5lIFNQT1JUMF9NUkNTMgkJMHhGRkMwMDg1OAkvKiBTUE9SVDAgTXVsdGktQ2hhbm5lbCBSZWNlaXZlIFNlbGVjdCBSZWdpc3RlciAyCSovCi0jZGVmaW5lIFNQT1JUMF9NUkNTMwkJMHhGRkMwMDg1QwkvKiBTUE9SVDAgTXVsdGktQ2hhbm5lbCBSZWNlaXZlIFNlbGVjdCBSZWdpc3RlciAzCSovCi0KLS8qIFNQT1JUMSBDb250cm9sbGVyCQkoMHhGRkMwMDkwMCAtIDB4RkZDMDA5RkYpCQkJCQkJCQkJCSovCi0jZGVmaW5lIFNQT1JUMV9UQ1IxCQkJMHhGRkMwMDkwMAkvKiBTUE9SVDEgVHJhbnNtaXQgQ29uZmlndXJhdGlvbiAxIFJlZ2lzdGVyCQkJKi8KLSNkZWZpbmUgU1BPUlQxX1RDUjIJCQkweEZGQzAwOTA0CS8qIFNQT1JUMSBUcmFuc21pdCBDb25maWd1cmF0aW9uIDIgUmVnaXN0ZXIJCQkqLwotI2RlZmluZSBTUE9SVDFfVENMS0RJVgkJMHhGRkMwMDkwOAkvKiBTUE9SVDEgVHJhbnNtaXQgQ2xvY2sgRGl2aWRlcgkJCQkJKi8KLSNkZWZpbmUgU1BPUlQxX1RGU0RJVgkJMHhGRkMwMDkwQwkvKiBTUE9SVDEgVHJhbnNtaXQgRnJhbWUgU3luYyBEaXZpZGVyCQkJCSovCi0jZGVmaW5lIFNQT1JUMV9UWAkJCTB4RkZDMDA5MTAJLyogU1BPUlQxIFRYIERhdGEgUmVnaXN0ZXIJCQkJCQkJKi8KLSNkZWZpbmUgU1BPUlQxX1JYCQkJMHhGRkMwMDkxOAkvKiBTUE9SVDEgUlggRGF0YSBSZWdpc3RlcgkJCQkJCQkqLwotI2RlZmluZSBTUE9SVDFfUkNSMQkJCTB4RkZDMDA5MjAJLyogU1BPUlQxIFRyYW5zbWl0IENvbmZpZ3VyYXRpb24gMSBSZWdpc3RlcgkJCSovCi0jZGVmaW5lIFNQT1JUMV9SQ1IyCQkJMHhGRkMwMDkyNAkvKiBTUE9SVDEgVHJhbnNtaXQgQ29uZmlndXJhdGlvbiAyIFJlZ2lzdGVyCQkJKi8KLSNkZWZpbmUgU1BPUlQxX1JDTEtESVYJCTB4RkZDMDA5MjgJLyogU1BPUlQxIFJlY2VpdmUgQ2xvY2sgRGl2aWRlcgkJCQkJCSovCi0jZGVmaW5lIFNQT1JUMV9SRlNESVYJCTB4RkZDMDA5MkMJLyogU1BPUlQxIFJlY2VpdmUgRnJhbWUgU3luYyBEaXZpZGVyCQkJCSovCi0jZGVmaW5lIFNQT1JUMV9TVEFUCQkJMHhGRkMwMDkzMAkvKiBTUE9SVDEgU3RhdHVzIFJlZ2lzdGVyCQkJCQkJCSovCi0jZGVmaW5lIFNQT1JUMV9DSE5MCQkJMHhGRkMwMDkzNAkvKiBTUE9SVDEgQ3VycmVudCBDaGFubmVsIFJlZ2lzdGVyCQkJCQkqLwotI2RlZmluZSBTUE9SVDFfTUNNQzEJCTB4RkZDMDA5MzgJLyogU1BPUlQxIE11bHRpLUNoYW5uZWwgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAxCSovCi0jZGVmaW5lIFNQT1JUMV9NQ01DMgkJMHhGRkMwMDkzQwkvKiBTUE9SVDEgTXVsdGktQ2hhbm5lbCBDb25maWd1cmF0aW9uIFJlZ2lzdGVyIDIJKi8KLSNkZWZpbmUgU1BPUlQxX01UQ1MwCQkweEZGQzAwOTQwCS8qIFNQT1JUMSBNdWx0aS1DaGFubmVsIFRyYW5zbWl0IFNlbGVjdCBSZWdpc3RlciAwCSovCi0jZGVmaW5lIFNQT1JUMV9NVENTMQkJMHhGRkMwMDk0NAkvKiBTUE9SVDEgTXVsdGktQ2hhbm5lbCBUcmFuc21pdCBTZWxlY3QgUmVnaXN0ZXIgMQkqLwotI2RlZmluZSBTUE9SVDFfTVRDUzIJCTB4RkZDMDA5NDgJLyogU1BPUlQxIE11bHRpLUNoYW5uZWwgVHJhbnNtaXQgU2VsZWN0IFJlZ2lzdGVyIDIJKi8KLSNkZWZpbmUgU1BPUlQxX01UQ1MzCQkweEZGQzAwOTRDCS8qIFNQT1JUMSBNdWx0aS1DaGFubmVsIFRyYW5zbWl0IFNlbGVjdCBSZWdpc3RlciAzCSovCi0jZGVmaW5lIFNQT1JUMV9NUkNTMAkJMHhGRkMwMDk1MAkvKiBTUE9SVDEgTXVsdGktQ2hhbm5lbCBSZWNlaXZlIFNlbGVjdCBSZWdpc3RlciAwCSovCi0jZGVmaW5lIFNQT1JUMV9NUkNTMQkJMHhGRkMwMDk1NAkvKiBTUE9SVDEgTXVsdGktQ2hhbm5lbCBSZWNlaXZlIFNlbGVjdCBSZWdpc3RlciAxCSovCi0jZGVmaW5lIFNQT1JUMV9NUkNTMgkJMHhGRkMwMDk1OAkvKiBTUE9SVDEgTXVsdGktQ2hhbm5lbCBSZWNlaXZlIFNlbGVjdCBSZWdpc3RlciAyCSovCi0jZGVmaW5lIFNQT1JUMV9NUkNTMwkJMHhGRkMwMDk1QwkvKiBTUE9SVDEgTXVsdGktQ2hhbm5lbCBSZWNlaXZlIFNlbGVjdCBSZWdpc3RlciAzCSovCi0KLS8qIEV4dGVybmFsIEJ1cyBJbnRlcmZhY2UgVW5pdCAoMHhGRkMwMEEwMCAtIDB4RkZDMDBBRkYpCQkJCQkJCQkqLwotI2RlZmluZSBFQklVX0FNR0NUTAkJCTB4RkZDMDBBMDAJLyogQXN5bmNocm9ub3VzIE1lbW9yeSBHbG9iYWwgQ29udHJvbCBSZWdpc3RlcgkqLwotI2RlZmluZSBFQklVX0FNQkNUTDAJCTB4RkZDMDBBMDQJLyogQXN5bmNocm9ub3VzIE1lbW9yeSBCYW5rIENvbnRyb2wgUmVnaXN0ZXIgMAkqLwotI2RlZmluZSBFQklVX0FNQkNUTDEJCTB4RkZDMDBBMDgJLyogQXN5bmNocm9ub3VzIE1lbW9yeSBCYW5rIENvbnRyb2wgUmVnaXN0ZXIgMQkqLwotI2RlZmluZSBFQklVX1NER0NUTAkJCTB4RkZDMDBBMTAJLyogU0RSQU0gR2xvYmFsIENvbnRyb2wgUmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgRUJJVV9TREJDVEwJCQkweEZGQzAwQTE0CS8qIFNEUkFNIEJhbmsgQ29udHJvbCBSZWdpc3RlcgkJCQkJKi8KLSNkZWZpbmUgRUJJVV9TRFJSQwkJCTB4RkZDMDBBMTgJLyogU0RSQU0gUmVmcmVzaCBSYXRlIENvbnRyb2wgUmVnaXN0ZXIJCQkqLwotI2RlZmluZSBFQklVX1NEU1RBVAkJCTB4RkZDMDBBMUMJLyogU0RSQU0gU3RhdHVzIFJlZ2lzdGVyCQkJCQkJKi8KLQotLyogRE1BIFRyYWZmaWMgQ29udHJvbCBSZWdpc3RlcnMJCQkJCQkJCQkJCQkJKi8KLSNkZWZpbmUgRE1BX1RDX1BFUgkJCTB4RkZDMDBCMEMJLyogVHJhZmZpYyBDb250cm9sIFBlcmlvZHMgUmVnaXN0ZXIJCQkqLwotI2RlZmluZSBETUFfVENfQ05UCQkJMHhGRkMwMEIxMAkvKiBUcmFmZmljIENvbnRyb2wgQ3VycmVudCBDb3VudHMgUmVnaXN0ZXIJKi8KLQotLyogQWx0ZXJuYXRlIGRlcHJlY2F0ZWQgcmVnaXN0ZXIgbmFtZXMgKGJlbG93KSBwcm92aWRlZCBmb3IgYmFja3dhcmRzIGNvZGUgY29tcGF0aWJpbGl0eSAqLwotI2RlZmluZSBETUFfVENQRVIJCQkweEZGQzAwQjBDCS8qIFRyYWZmaWMgQ29udHJvbCBQZXJpb2RzIFJlZ2lzdGVyCQkJKi8KLSNkZWZpbmUgRE1BX1RDQ05UCQkJMHhGRkMwMEIxMAkvKiBUcmFmZmljIENvbnRyb2wgQ3VycmVudCBDb3VudHMgUmVnaXN0ZXIJKi8KLQotLyogRE1BIENvbnRyb2xsZXIgKDB4RkZDMDBDMDAgLSAweEZGQzAwRkZGKQkJCQkJCQkJCQkJCQkJCSovCi0jZGVmaW5lIERNQTBfTkVYVF9ERVNDX1BUUgkJMHhGRkMwMEMwMAkvKiBETUEgQ2hhbm5lbCAwIE5leHQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyCQkqLwotI2RlZmluZSBETUEwX1NUQVJUX0FERFIJCQkweEZGQzAwQzA0CS8qIERNQSBDaGFubmVsIDAgU3RhcnQgQWRkcmVzcyBSZWdpc3RlcgkJCQkJKi8KLSNkZWZpbmUgRE1BMF9DT05GSUcJCQkJMHhGRkMwMEMwOAkvKiBETUEgQ2hhbm5lbCAwIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIJCQkJCSovCi0jZGVmaW5lIERNQTBfWF9DT1VOVAkJCTB4RkZDMDBDMTAJLyogRE1BIENoYW5uZWwgMCBYIENvdW50IFJlZ2lzdGVyCQkJCQkJKi8KLSNkZWZpbmUgRE1BMF9YX01PRElGWQkJCTB4RkZDMDBDMTQJLyogRE1BIENoYW5uZWwgMCBYIE1vZGlmeSBSZWdpc3RlcgkJCQkJCSovCi0jZGVmaW5lIERNQTBfWV9DT1VOVAkJCTB4RkZDMDBDMTgJLyogRE1BIENoYW5uZWwgMCBZIENvdW50IFJlZ2lzdGVyCQkJCQkJKi8KLSNkZWZpbmUgRE1BMF9ZX01PRElGWQkJCTB4RkZDMDBDMUMJLyogRE1BIENoYW5uZWwgMCBZIE1vZGlmeSBSZWdpc3RlcgkJCQkJCSovCi0jZGVmaW5lIERNQTBfQ1VSUl9ERVNDX1BUUgkJMHhGRkMwMEMyMAkvKiBETUEgQ2hhbm5lbCAwIEN1cnJlbnQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyCSovCi0jZGVmaW5lIERNQTBfQ1VSUl9BRERSCQkJMHhGRkMwMEMyNAkvKiBETUEgQ2hhbm5lbCAwIEN1cnJlbnQgQWRkcmVzcyBSZWdpc3RlcgkJCQkqLwotI2RlZmluZSBETUEwX0lSUV9TVEFUVVMJCQkweEZGQzAwQzI4CS8qIERNQSBDaGFubmVsIDAgSW50ZXJydXB0L1N0YXR1cyBSZWdpc3RlcgkJCQkqLwotI2RlZmluZSBETUEwX1BFUklQSEVSQUxfTUFQCQkweEZGQzAwQzJDCS8qIERNQSBDaGFubmVsIDAgUGVyaXBoZXJhbCBNYXAgUmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgRE1BMF9DVVJSX1hfQ09VTlQJCTB4RkZDMDBDMzAJLyogRE1BIENoYW5uZWwgMCBDdXJyZW50IFggQ291bnQgUmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgRE1BMF9DVVJSX1lfQ09VTlQJCTB4RkZDMDBDMzgJLyogRE1BIENoYW5uZWwgMCBDdXJyZW50IFkgQ291bnQgUmVnaXN0ZXIJCQkJKi8KLQotI2RlZmluZSBETUExX05FWFRfREVTQ19QVFIJCTB4RkZDMDBDNDAJLyogRE1BIENoYW5uZWwgMSBOZXh0IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlcgkJKi8KLSNkZWZpbmUgRE1BMV9TVEFSVF9BRERSCQkJMHhGRkMwMEM0NAkvKiBETUEgQ2hhbm5lbCAxIFN0YXJ0IEFkZHJlc3MgUmVnaXN0ZXIJCQkJCSovCi0jZGVmaW5lIERNQTFfQ09ORklHCQkJCTB4RkZDMDBDNDgJLyogRE1BIENoYW5uZWwgMSBDb25maWd1cmF0aW9uIFJlZ2lzdGVyCQkJCQkqLwotI2RlZmluZSBETUExX1hfQ09VTlQJCQkweEZGQzAwQzUwCS8qIERNQSBDaGFubmVsIDEgWCBDb3VudCBSZWdpc3RlcgkJCQkJCSovCi0jZGVmaW5lIERNQTFfWF9NT0RJRlkJCQkweEZGQzAwQzU0CS8qIERNQSBDaGFubmVsIDEgWCBNb2RpZnkgUmVnaXN0ZXIJCQkJCQkqLwotI2RlZmluZSBETUExX1lfQ09VTlQJCQkweEZGQzAwQzU4CS8qIERNQSBDaGFubmVsIDEgWSBDb3VudCBSZWdpc3RlcgkJCQkJCSovCi0jZGVmaW5lIERNQTFfWV9NT0RJRlkJCQkweEZGQzAwQzVDCS8qIERNQSBDaGFubmVsIDEgWSBNb2RpZnkgUmVnaXN0ZXIJCQkJCQkqLwotI2RlZmluZSBETUExX0NVUlJfREVTQ19QVFIJCTB4RkZDMDBDNjAJLyogRE1BIENoYW5uZWwgMSBDdXJyZW50IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlcgkqLwotI2RlZmluZSBETUExX0NVUlJfQUREUgkJCTB4RkZDMDBDNjQJLyogRE1BIENoYW5uZWwgMSBDdXJyZW50IEFkZHJlc3MgUmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgRE1BMV9JUlFfU1RBVFVTCQkJMHhGRkMwMEM2OAkvKiBETUEgQ2hhbm5lbCAxIEludGVycnVwdC9TdGF0dXMgUmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgRE1BMV9QRVJJUEhFUkFMX01BUAkJMHhGRkMwMEM2QwkvKiBETUEgQ2hhbm5lbCAxIFBlcmlwaGVyYWwgTWFwIFJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIERNQTFfQ1VSUl9YX0NPVU5UCQkweEZGQzAwQzcwCS8qIERNQSBDaGFubmVsIDEgQ3VycmVudCBYIENvdW50IFJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIERNQTFfQ1VSUl9ZX0NPVU5UCQkweEZGQzAwQzc4CS8qIERNQSBDaGFubmVsIDEgQ3VycmVudCBZIENvdW50IFJlZ2lzdGVyCQkJCSovCi0KLSNkZWZpbmUgRE1BMl9ORVhUX0RFU0NfUFRSCQkweEZGQzAwQzgwCS8qIERNQSBDaGFubmVsIDIgTmV4dCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIJCSovCi0jZGVmaW5lIERNQTJfU1RBUlRfQUREUgkJCTB4RkZDMDBDODQJLyogRE1BIENoYW5uZWwgMiBTdGFydCBBZGRyZXNzIFJlZ2lzdGVyCQkJCQkqLwotI2RlZmluZSBETUEyX0NPTkZJRwkJCQkweEZGQzAwQzg4CS8qIERNQSBDaGFubmVsIDIgQ29uZmlndXJhdGlvbiBSZWdpc3RlcgkJCQkJKi8KLSNkZWZpbmUgRE1BMl9YX0NPVU5UCQkJMHhGRkMwMEM5MAkvKiBETUEgQ2hhbm5lbCAyIFggQ291bnQgUmVnaXN0ZXIJCQkJCQkqLwotI2RlZmluZSBETUEyX1hfTU9ESUZZCQkJMHhGRkMwMEM5NAkvKiBETUEgQ2hhbm5lbCAyIFggTW9kaWZ5IFJlZ2lzdGVyCQkJCQkJKi8KLSNkZWZpbmUgRE1BMl9ZX0NPVU5UCQkJMHhGRkMwMEM5OAkvKiBETUEgQ2hhbm5lbCAyIFkgQ291bnQgUmVnaXN0ZXIJCQkJCQkqLwotI2RlZmluZSBETUEyX1lfTU9ESUZZCQkJMHhGRkMwMEM5QwkvKiBETUEgQ2hhbm5lbCAyIFkgTW9kaWZ5IFJlZ2lzdGVyCQkJCQkJKi8KLSNkZWZpbmUgRE1BMl9DVVJSX0RFU0NfUFRSCQkweEZGQzAwQ0EwCS8qIERNQSBDaGFubmVsIDIgQ3VycmVudCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIJKi8KLSNkZWZpbmUgRE1BMl9DVVJSX0FERFIJCQkweEZGQzAwQ0E0CS8qIERNQSBDaGFubmVsIDIgQ3VycmVudCBBZGRyZXNzIFJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIERNQTJfSVJRX1NUQVRVUwkJCTB4RkZDMDBDQTgJLyogRE1BIENoYW5uZWwgMiBJbnRlcnJ1cHQvU3RhdHVzIFJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIERNQTJfUEVSSVBIRVJBTF9NQVAJCTB4RkZDMDBDQUMJLyogRE1BIENoYW5uZWwgMiBQZXJpcGhlcmFsIE1hcCBSZWdpc3RlcgkJCQkqLwotI2RlZmluZSBETUEyX0NVUlJfWF9DT1VOVAkJMHhGRkMwMENCMAkvKiBETUEgQ2hhbm5lbCAyIEN1cnJlbnQgWCBDb3VudCBSZWdpc3RlcgkJCQkqLwotI2RlZmluZSBETUEyX0NVUlJfWV9DT1VOVAkJMHhGRkMwMENCOAkvKiBETUEgQ2hhbm5lbCAyIEN1cnJlbnQgWSBDb3VudCBSZWdpc3RlcgkJCQkqLwotCi0jZGVmaW5lIERNQTNfTkVYVF9ERVNDX1BUUgkJMHhGRkMwMENDMAkvKiBETUEgQ2hhbm5lbCAzIE5leHQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyCQkqLwotI2RlZmluZSBETUEzX1NUQVJUX0FERFIJCQkweEZGQzAwQ0M0CS8qIERNQSBDaGFubmVsIDMgU3RhcnQgQWRkcmVzcyBSZWdpc3RlcgkJCQkJKi8KLSNkZWZpbmUgRE1BM19DT05GSUcJCQkJMHhGRkMwMENDOAkvKiBETUEgQ2hhbm5lbCAzIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIJCQkJCSovCi0jZGVmaW5lIERNQTNfWF9DT1VOVAkJCTB4RkZDMDBDRDAJLyogRE1BIENoYW5uZWwgMyBYIENvdW50IFJlZ2lzdGVyCQkJCQkJKi8KLSNkZWZpbmUgRE1BM19YX01PRElGWQkJCTB4RkZDMDBDRDQJLyogRE1BIENoYW5uZWwgMyBYIE1vZGlmeSBSZWdpc3RlcgkJCQkJCSovCi0jZGVmaW5lIERNQTNfWV9DT1VOVAkJCTB4RkZDMDBDRDgJLyogRE1BIENoYW5uZWwgMyBZIENvdW50IFJlZ2lzdGVyCQkJCQkJKi8KLSNkZWZpbmUgRE1BM19ZX01PRElGWQkJCTB4RkZDMDBDREMJLyogRE1BIENoYW5uZWwgMyBZIE1vZGlmeSBSZWdpc3RlcgkJCQkJCSovCi0jZGVmaW5lIERNQTNfQ1VSUl9ERVNDX1BUUgkJMHhGRkMwMENFMAkvKiBETUEgQ2hhbm5lbCAzIEN1cnJlbnQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyCSovCi0jZGVmaW5lIERNQTNfQ1VSUl9BRERSCQkJMHhGRkMwMENFNAkvKiBETUEgQ2hhbm5lbCAzIEN1cnJlbnQgQWRkcmVzcyBSZWdpc3RlcgkJCQkqLwotI2RlZmluZSBETUEzX0lSUV9TVEFUVVMJCQkweEZGQzAwQ0U4CS8qIERNQSBDaGFubmVsIDMgSW50ZXJydXB0L1N0YXR1cyBSZWdpc3RlcgkJCQkqLwotI2RlZmluZSBETUEzX1BFUklQSEVSQUxfTUFQCQkweEZGQzAwQ0VDCS8qIERNQSBDaGFubmVsIDMgUGVyaXBoZXJhbCBNYXAgUmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgRE1BM19DVVJSX1hfQ09VTlQJCTB4RkZDMDBDRjAJLyogRE1BIENoYW5uZWwgMyBDdXJyZW50IFggQ291bnQgUmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgRE1BM19DVVJSX1lfQ09VTlQJCTB4RkZDMDBDRjgJLyogRE1BIENoYW5uZWwgMyBDdXJyZW50IFkgQ291bnQgUmVnaXN0ZXIJCQkJKi8KLQotI2RlZmluZSBETUE0X05FWFRfREVTQ19QVFIJCTB4RkZDMDBEMDAJLyogRE1BIENoYW5uZWwgNCBOZXh0IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlcgkJKi8KLSNkZWZpbmUgRE1BNF9TVEFSVF9BRERSCQkJMHhGRkMwMEQwNAkvKiBETUEgQ2hhbm5lbCA0IFN0YXJ0IEFkZHJlc3MgUmVnaXN0ZXIJCQkJCSovCi0jZGVmaW5lIERNQTRfQ09ORklHCQkJCTB4RkZDMDBEMDgJLyogRE1BIENoYW5uZWwgNCBDb25maWd1cmF0aW9uIFJlZ2lzdGVyCQkJCQkqLwotI2RlZmluZSBETUE0X1hfQ09VTlQJCQkweEZGQzAwRDEwCS8qIERNQSBDaGFubmVsIDQgWCBDb3VudCBSZWdpc3RlcgkJCQkJCSovCi0jZGVmaW5lIERNQTRfWF9NT0RJRlkJCQkweEZGQzAwRDE0CS8qIERNQSBDaGFubmVsIDQgWCBNb2RpZnkgUmVnaXN0ZXIJCQkJCQkqLwotI2RlZmluZSBETUE0X1lfQ09VTlQJCQkweEZGQzAwRDE4CS8qIERNQSBDaGFubmVsIDQgWSBDb3VudCBSZWdpc3RlcgkJCQkJCSovCi0jZGVmaW5lIERNQTRfWV9NT0RJRlkJCQkweEZGQzAwRDFDCS8qIERNQSBDaGFubmVsIDQgWSBNb2RpZnkgUmVnaXN0ZXIJCQkJCQkqLwotI2RlZmluZSBETUE0X0NVUlJfREVTQ19QVFIJCTB4RkZDMDBEMjAJLyogRE1BIENoYW5uZWwgNCBDdXJyZW50IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlcgkqLwotI2RlZmluZSBETUE0X0NVUlJfQUREUgkJCTB4RkZDMDBEMjQJLyogRE1BIENoYW5uZWwgNCBDdXJyZW50IEFkZHJlc3MgUmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgRE1BNF9JUlFfU1RBVFVTCQkJMHhGRkMwMEQyOAkvKiBETUEgQ2hhbm5lbCA0IEludGVycnVwdC9TdGF0dXMgUmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgRE1BNF9QRVJJUEhFUkFMX01BUAkJMHhGRkMwMEQyQwkvKiBETUEgQ2hhbm5lbCA0IFBlcmlwaGVyYWwgTWFwIFJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIERNQTRfQ1VSUl9YX0NPVU5UCQkweEZGQzAwRDMwCS8qIERNQSBDaGFubmVsIDQgQ3VycmVudCBYIENvdW50IFJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIERNQTRfQ1VSUl9ZX0NPVU5UCQkweEZGQzAwRDM4CS8qIERNQSBDaGFubmVsIDQgQ3VycmVudCBZIENvdW50IFJlZ2lzdGVyCQkJCSovCi0KLSNkZWZpbmUgRE1BNV9ORVhUX0RFU0NfUFRSCQkweEZGQzAwRDQwCS8qIERNQSBDaGFubmVsIDUgTmV4dCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIJCSovCi0jZGVmaW5lIERNQTVfU1RBUlRfQUREUgkJCTB4RkZDMDBENDQJLyogRE1BIENoYW5uZWwgNSBTdGFydCBBZGRyZXNzIFJlZ2lzdGVyCQkJCQkqLwotI2RlZmluZSBETUE1X0NPTkZJRwkJCQkweEZGQzAwRDQ4CS8qIERNQSBDaGFubmVsIDUgQ29uZmlndXJhdGlvbiBSZWdpc3RlcgkJCQkJKi8KLSNkZWZpbmUgRE1BNV9YX0NPVU5UCQkJMHhGRkMwMEQ1MAkvKiBETUEgQ2hhbm5lbCA1IFggQ291bnQgUmVnaXN0ZXIJCQkJCQkqLwotI2RlZmluZSBETUE1X1hfTU9ESUZZCQkJMHhGRkMwMEQ1NAkvKiBETUEgQ2hhbm5lbCA1IFggTW9kaWZ5IFJlZ2lzdGVyCQkJCQkJKi8KLSNkZWZpbmUgRE1BNV9ZX0NPVU5UCQkJMHhGRkMwMEQ1OAkvKiBETUEgQ2hhbm5lbCA1IFkgQ291bnQgUmVnaXN0ZXIJCQkJCQkqLwotI2RlZmluZSBETUE1X1lfTU9ESUZZCQkJMHhGRkMwMEQ1QwkvKiBETUEgQ2hhbm5lbCA1IFkgTW9kaWZ5IFJlZ2lzdGVyCQkJCQkJKi8KLSNkZWZpbmUgRE1BNV9DVVJSX0RFU0NfUFRSCQkweEZGQzAwRDYwCS8qIERNQSBDaGFubmVsIDUgQ3VycmVudCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIJKi8KLSNkZWZpbmUgRE1BNV9DVVJSX0FERFIJCQkweEZGQzAwRDY0CS8qIERNQSBDaGFubmVsIDUgQ3VycmVudCBBZGRyZXNzIFJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIERNQTVfSVJRX1NUQVRVUwkJCTB4RkZDMDBENjgJLyogRE1BIENoYW5uZWwgNSBJbnRlcnJ1cHQvU3RhdHVzIFJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIERNQTVfUEVSSVBIRVJBTF9NQVAJCTB4RkZDMDBENkMJLyogRE1BIENoYW5uZWwgNSBQZXJpcGhlcmFsIE1hcCBSZWdpc3RlcgkJCQkqLwotI2RlZmluZSBETUE1X0NVUlJfWF9DT1VOVAkJMHhGRkMwMEQ3MAkvKiBETUEgQ2hhbm5lbCA1IEN1cnJlbnQgWCBDb3VudCBSZWdpc3RlcgkJCQkqLwotI2RlZmluZSBETUE1X0NVUlJfWV9DT1VOVAkJMHhGRkMwMEQ3OAkvKiBETUEgQ2hhbm5lbCA1IEN1cnJlbnQgWSBDb3VudCBSZWdpc3RlcgkJCQkqLwotCi0jZGVmaW5lIERNQTZfTkVYVF9ERVNDX1BUUgkJMHhGRkMwMEQ4MAkvKiBETUEgQ2hhbm5lbCA2IE5leHQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyCQkqLwotI2RlZmluZSBETUE2X1NUQVJUX0FERFIJCQkweEZGQzAwRDg0CS8qIERNQSBDaGFubmVsIDYgU3RhcnQgQWRkcmVzcyBSZWdpc3RlcgkJCQkJKi8KLSNkZWZpbmUgRE1BNl9DT05GSUcJCQkJMHhGRkMwMEQ4OAkvKiBETUEgQ2hhbm5lbCA2IENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIJCQkJCSovCi0jZGVmaW5lIERNQTZfWF9DT1VOVAkJCTB4RkZDMDBEOTAJLyogRE1BIENoYW5uZWwgNiBYIENvdW50IFJlZ2lzdGVyCQkJCQkJKi8KLSNkZWZpbmUgRE1BNl9YX01PRElGWQkJCTB4RkZDMDBEOTQJLyogRE1BIENoYW5uZWwgNiBYIE1vZGlmeSBSZWdpc3RlcgkJCQkJCSovCi0jZGVmaW5lIERNQTZfWV9DT1VOVAkJCTB4RkZDMDBEOTgJLyogRE1BIENoYW5uZWwgNiBZIENvdW50IFJlZ2lzdGVyCQkJCQkJKi8KLSNkZWZpbmUgRE1BNl9ZX01PRElGWQkJCTB4RkZDMDBEOUMJLyogRE1BIENoYW5uZWwgNiBZIE1vZGlmeSBSZWdpc3RlcgkJCQkJCSovCi0jZGVmaW5lIERNQTZfQ1VSUl9ERVNDX1BUUgkJMHhGRkMwMERBMAkvKiBETUEgQ2hhbm5lbCA2IEN1cnJlbnQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyCSovCi0jZGVmaW5lIERNQTZfQ1VSUl9BRERSCQkJMHhGRkMwMERBNAkvKiBETUEgQ2hhbm5lbCA2IEN1cnJlbnQgQWRkcmVzcyBSZWdpc3RlcgkJCQkqLwotI2RlZmluZSBETUE2X0lSUV9TVEFUVVMJCQkweEZGQzAwREE4CS8qIERNQSBDaGFubmVsIDYgSW50ZXJydXB0L1N0YXR1cyBSZWdpc3RlcgkJCQkqLwotI2RlZmluZSBETUE2X1BFUklQSEVSQUxfTUFQCQkweEZGQzAwREFDCS8qIERNQSBDaGFubmVsIDYgUGVyaXBoZXJhbCBNYXAgUmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgRE1BNl9DVVJSX1hfQ09VTlQJCTB4RkZDMDBEQjAJLyogRE1BIENoYW5uZWwgNiBDdXJyZW50IFggQ291bnQgUmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgRE1BNl9DVVJSX1lfQ09VTlQJCTB4RkZDMDBEQjgJLyogRE1BIENoYW5uZWwgNiBDdXJyZW50IFkgQ291bnQgUmVnaXN0ZXIJCQkJKi8KLQotI2RlZmluZSBETUE3X05FWFRfREVTQ19QVFIJCTB4RkZDMDBEQzAJLyogRE1BIENoYW5uZWwgNyBOZXh0IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlcgkJKi8KLSNkZWZpbmUgRE1BN19TVEFSVF9BRERSCQkJMHhGRkMwMERDNAkvKiBETUEgQ2hhbm5lbCA3IFN0YXJ0IEFkZHJlc3MgUmVnaXN0ZXIJCQkJCSovCi0jZGVmaW5lIERNQTdfQ09ORklHCQkJCTB4RkZDMDBEQzgJLyogRE1BIENoYW5uZWwgNyBDb25maWd1cmF0aW9uIFJlZ2lzdGVyCQkJCQkqLwotI2RlZmluZSBETUE3X1hfQ09VTlQJCQkweEZGQzAwREQwCS8qIERNQSBDaGFubmVsIDcgWCBDb3VudCBSZWdpc3RlcgkJCQkJCSovCi0jZGVmaW5lIERNQTdfWF9NT0RJRlkJCQkweEZGQzAwREQ0CS8qIERNQSBDaGFubmVsIDcgWCBNb2RpZnkgUmVnaXN0ZXIJCQkJCQkqLwotI2RlZmluZSBETUE3X1lfQ09VTlQJCQkweEZGQzAwREQ4CS8qIERNQSBDaGFubmVsIDcgWSBDb3VudCBSZWdpc3RlcgkJCQkJCSovCi0jZGVmaW5lIERNQTdfWV9NT0RJRlkJCQkweEZGQzAwRERDCS8qIERNQSBDaGFubmVsIDcgWSBNb2RpZnkgUmVnaXN0ZXIJCQkJCQkqLwotI2RlZmluZSBETUE3X0NVUlJfREVTQ19QVFIJCTB4RkZDMDBERTAJLyogRE1BIENoYW5uZWwgNyBDdXJyZW50IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlcgkqLwotI2RlZmluZSBETUE3X0NVUlJfQUREUgkJCTB4RkZDMDBERTQJLyogRE1BIENoYW5uZWwgNyBDdXJyZW50IEFkZHJlc3MgUmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgRE1BN19JUlFfU1RBVFVTCQkJMHhGRkMwMERFOAkvKiBETUEgQ2hhbm5lbCA3IEludGVycnVwdC9TdGF0dXMgUmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgRE1BN19QRVJJUEhFUkFMX01BUAkJMHhGRkMwMERFQwkvKiBETUEgQ2hhbm5lbCA3IFBlcmlwaGVyYWwgTWFwIFJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIERNQTdfQ1VSUl9YX0NPVU5UCQkweEZGQzAwREYwCS8qIERNQSBDaGFubmVsIDcgQ3VycmVudCBYIENvdW50IFJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIERNQTdfQ1VSUl9ZX0NPVU5UCQkweEZGQzAwREY4CS8qIERNQSBDaGFubmVsIDcgQ3VycmVudCBZIENvdW50IFJlZ2lzdGVyCQkJCSovCi0KLSNkZWZpbmUgRE1BOF9ORVhUX0RFU0NfUFRSCQkweEZGQzAwRTAwCS8qIERNQSBDaGFubmVsIDggTmV4dCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIJCSovCi0jZGVmaW5lIERNQThfU1RBUlRfQUREUgkJCTB4RkZDMDBFMDQJLyogRE1BIENoYW5uZWwgOCBTdGFydCBBZGRyZXNzIFJlZ2lzdGVyCQkJCQkqLwotI2RlZmluZSBETUE4X0NPTkZJRwkJCQkweEZGQzAwRTA4CS8qIERNQSBDaGFubmVsIDggQ29uZmlndXJhdGlvbiBSZWdpc3RlcgkJCQkJKi8KLSNkZWZpbmUgRE1BOF9YX0NPVU5UCQkJMHhGRkMwMEUxMAkvKiBETUEgQ2hhbm5lbCA4IFggQ291bnQgUmVnaXN0ZXIJCQkJCQkqLwotI2RlZmluZSBETUE4X1hfTU9ESUZZCQkJMHhGRkMwMEUxNAkvKiBETUEgQ2hhbm5lbCA4IFggTW9kaWZ5IFJlZ2lzdGVyCQkJCQkJKi8KLSNkZWZpbmUgRE1BOF9ZX0NPVU5UCQkJMHhGRkMwMEUxOAkvKiBETUEgQ2hhbm5lbCA4IFkgQ291bnQgUmVnaXN0ZXIJCQkJCQkqLwotI2RlZmluZSBETUE4X1lfTU9ESUZZCQkJMHhGRkMwMEUxQwkvKiBETUEgQ2hhbm5lbCA4IFkgTW9kaWZ5IFJlZ2lzdGVyCQkJCQkJKi8KLSNkZWZpbmUgRE1BOF9DVVJSX0RFU0NfUFRSCQkweEZGQzAwRTIwCS8qIERNQSBDaGFubmVsIDggQ3VycmVudCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIJKi8KLSNkZWZpbmUgRE1BOF9DVVJSX0FERFIJCQkweEZGQzAwRTI0CS8qIERNQSBDaGFubmVsIDggQ3VycmVudCBBZGRyZXNzIFJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIERNQThfSVJRX1NUQVRVUwkJCTB4RkZDMDBFMjgJLyogRE1BIENoYW5uZWwgOCBJbnRlcnJ1cHQvU3RhdHVzIFJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIERNQThfUEVSSVBIRVJBTF9NQVAJCTB4RkZDMDBFMkMJLyogRE1BIENoYW5uZWwgOCBQZXJpcGhlcmFsIE1hcCBSZWdpc3RlcgkJCQkqLwotI2RlZmluZSBETUE4X0NVUlJfWF9DT1VOVAkJMHhGRkMwMEUzMAkvKiBETUEgQ2hhbm5lbCA4IEN1cnJlbnQgWCBDb3VudCBSZWdpc3RlcgkJCQkqLwotI2RlZmluZSBETUE4X0NVUlJfWV9DT1VOVAkJMHhGRkMwMEUzOAkvKiBETUEgQ2hhbm5lbCA4IEN1cnJlbnQgWSBDb3VudCBSZWdpc3RlcgkJCQkqLwotCi0jZGVmaW5lIERNQTlfTkVYVF9ERVNDX1BUUgkJMHhGRkMwMEU0MAkvKiBETUEgQ2hhbm5lbCA5IE5leHQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyCQkqLwotI2RlZmluZSBETUE5X1NUQVJUX0FERFIJCQkweEZGQzAwRTQ0CS8qIERNQSBDaGFubmVsIDkgU3RhcnQgQWRkcmVzcyBSZWdpc3RlcgkJCQkJKi8KLSNkZWZpbmUgRE1BOV9DT05GSUcJCQkJMHhGRkMwMEU0OAkvKiBETUEgQ2hhbm5lbCA5IENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIJCQkJCSovCi0jZGVmaW5lIERNQTlfWF9DT1VOVAkJCTB4RkZDMDBFNTAJLyogRE1BIENoYW5uZWwgOSBYIENvdW50IFJlZ2lzdGVyCQkJCQkJKi8KLSNkZWZpbmUgRE1BOV9YX01PRElGWQkJCTB4RkZDMDBFNTQJLyogRE1BIENoYW5uZWwgOSBYIE1vZGlmeSBSZWdpc3RlcgkJCQkJCSovCi0jZGVmaW5lIERNQTlfWV9DT1VOVAkJCTB4RkZDMDBFNTgJLyogRE1BIENoYW5uZWwgOSBZIENvdW50IFJlZ2lzdGVyCQkJCQkJKi8KLSNkZWZpbmUgRE1BOV9ZX01PRElGWQkJCTB4RkZDMDBFNUMJLyogRE1BIENoYW5uZWwgOSBZIE1vZGlmeSBSZWdpc3RlcgkJCQkJCSovCi0jZGVmaW5lIERNQTlfQ1VSUl9ERVNDX1BUUgkJMHhGRkMwMEU2MAkvKiBETUEgQ2hhbm5lbCA5IEN1cnJlbnQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyCSovCi0jZGVmaW5lIERNQTlfQ1VSUl9BRERSCQkJMHhGRkMwMEU2NAkvKiBETUEgQ2hhbm5lbCA5IEN1cnJlbnQgQWRkcmVzcyBSZWdpc3RlcgkJCQkqLwotI2RlZmluZSBETUE5X0lSUV9TVEFUVVMJCQkweEZGQzAwRTY4CS8qIERNQSBDaGFubmVsIDkgSW50ZXJydXB0L1N0YXR1cyBSZWdpc3RlcgkJCQkqLwotI2RlZmluZSBETUE5X1BFUklQSEVSQUxfTUFQCQkweEZGQzAwRTZDCS8qIERNQSBDaGFubmVsIDkgUGVyaXBoZXJhbCBNYXAgUmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgRE1BOV9DVVJSX1hfQ09VTlQJCTB4RkZDMDBFNzAJLyogRE1BIENoYW5uZWwgOSBDdXJyZW50IFggQ291bnQgUmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgRE1BOV9DVVJSX1lfQ09VTlQJCTB4RkZDMDBFNzgJLyogRE1BIENoYW5uZWwgOSBDdXJyZW50IFkgQ291bnQgUmVnaXN0ZXIJCQkJKi8KLQotI2RlZmluZSBETUExMF9ORVhUX0RFU0NfUFRSCQkweEZGQzAwRTgwCS8qIERNQSBDaGFubmVsIDEwIE5leHQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyCQkqLwotI2RlZmluZSBETUExMF9TVEFSVF9BRERSCQkweEZGQzAwRTg0CS8qIERNQSBDaGFubmVsIDEwIFN0YXJ0IEFkZHJlc3MgUmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgRE1BMTBfQ09ORklHCQkJMHhGRkMwMEU4OAkvKiBETUEgQ2hhbm5lbCAxMCBDb25maWd1cmF0aW9uIFJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIERNQTEwX1hfQ09VTlQJCQkweEZGQzAwRTkwCS8qIERNQSBDaGFubmVsIDEwIFggQ291bnQgUmVnaXN0ZXIJCQkJCQkqLwotI2RlZmluZSBETUExMF9YX01PRElGWQkJCTB4RkZDMDBFOTQJLyogRE1BIENoYW5uZWwgMTAgWCBNb2RpZnkgUmVnaXN0ZXIJCQkJCQkqLwotI2RlZmluZSBETUExMF9ZX0NPVU5UCQkJMHhGRkMwMEU5OAkvKiBETUEgQ2hhbm5lbCAxMCBZIENvdW50IFJlZ2lzdGVyCQkJCQkJKi8KLSNkZWZpbmUgRE1BMTBfWV9NT0RJRlkJCQkweEZGQzAwRTlDCS8qIERNQSBDaGFubmVsIDEwIFkgTW9kaWZ5IFJlZ2lzdGVyCQkJCQkJKi8KLSNkZWZpbmUgRE1BMTBfQ1VSUl9ERVNDX1BUUgkJMHhGRkMwMEVBMAkvKiBETUEgQ2hhbm5lbCAxMCBDdXJyZW50IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlcgkqLwotI2RlZmluZSBETUExMF9DVVJSX0FERFIJCQkweEZGQzAwRUE0CS8qIERNQSBDaGFubmVsIDEwIEN1cnJlbnQgQWRkcmVzcyBSZWdpc3RlcgkJCQkqLwotI2RlZmluZSBETUExMF9JUlFfU1RBVFVTCQkweEZGQzAwRUE4CS8qIERNQSBDaGFubmVsIDEwIEludGVycnVwdC9TdGF0dXMgUmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgRE1BMTBfUEVSSVBIRVJBTF9NQVAJMHhGRkMwMEVBQwkvKiBETUEgQ2hhbm5lbCAxMCBQZXJpcGhlcmFsIE1hcCBSZWdpc3RlcgkJCQkqLwotI2RlZmluZSBETUExMF9DVVJSX1hfQ09VTlQJCTB4RkZDMDBFQjAJLyogRE1BIENoYW5uZWwgMTAgQ3VycmVudCBYIENvdW50IFJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIERNQTEwX0NVUlJfWV9DT1VOVAkJMHhGRkMwMEVCOAkvKiBETUEgQ2hhbm5lbCAxMCBDdXJyZW50IFkgQ291bnQgUmVnaXN0ZXIJCQkJKi8KLQotI2RlZmluZSBETUExMV9ORVhUX0RFU0NfUFRSCQkweEZGQzAwRUMwCS8qIERNQSBDaGFubmVsIDExIE5leHQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyCQkqLwotI2RlZmluZSBETUExMV9TVEFSVF9BRERSCQkweEZGQzAwRUM0CS8qIERNQSBDaGFubmVsIDExIFN0YXJ0IEFkZHJlc3MgUmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgRE1BMTFfQ09ORklHCQkJMHhGRkMwMEVDOAkvKiBETUEgQ2hhbm5lbCAxMSBDb25maWd1cmF0aW9uIFJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIERNQTExX1hfQ09VTlQJCQkweEZGQzAwRUQwCS8qIERNQSBDaGFubmVsIDExIFggQ291bnQgUmVnaXN0ZXIJCQkJCQkqLwotI2RlZmluZSBETUExMV9YX01PRElGWQkJCTB4RkZDMDBFRDQJLyogRE1BIENoYW5uZWwgMTEgWCBNb2RpZnkgUmVnaXN0ZXIJCQkJCQkqLwotI2RlZmluZSBETUExMV9ZX0NPVU5UCQkJMHhGRkMwMEVEOAkvKiBETUEgQ2hhbm5lbCAxMSBZIENvdW50IFJlZ2lzdGVyCQkJCQkJKi8KLSNkZWZpbmUgRE1BMTFfWV9NT0RJRlkJCQkweEZGQzAwRURDCS8qIERNQSBDaGFubmVsIDExIFkgTW9kaWZ5IFJlZ2lzdGVyCQkJCQkJKi8KLSNkZWZpbmUgRE1BMTFfQ1VSUl9ERVNDX1BUUgkJMHhGRkMwMEVFMAkvKiBETUEgQ2hhbm5lbCAxMSBDdXJyZW50IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlcgkqLwotI2RlZmluZSBETUExMV9DVVJSX0FERFIJCQkweEZGQzAwRUU0CS8qIERNQSBDaGFubmVsIDExIEN1cnJlbnQgQWRkcmVzcyBSZWdpc3RlcgkJCQkqLwotI2RlZmluZSBETUExMV9JUlFfU1RBVFVTCQkweEZGQzAwRUU4CS8qIERNQSBDaGFubmVsIDExIEludGVycnVwdC9TdGF0dXMgUmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgRE1BMTFfUEVSSVBIRVJBTF9NQVAJMHhGRkMwMEVFQwkvKiBETUEgQ2hhbm5lbCAxMSBQZXJpcGhlcmFsIE1hcCBSZWdpc3RlcgkJCQkqLwotI2RlZmluZSBETUExMV9DVVJSX1hfQ09VTlQJCTB4RkZDMDBFRjAJLyogRE1BIENoYW5uZWwgMTEgQ3VycmVudCBYIENvdW50IFJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIERNQTExX0NVUlJfWV9DT1VOVAkJMHhGRkMwMEVGOAkvKiBETUEgQ2hhbm5lbCAxMSBDdXJyZW50IFkgQ291bnQgUmVnaXN0ZXIJCQkJKi8KLQotI2RlZmluZSBNRE1BX0QwX05FWFRfREVTQ19QVFIJMHhGRkMwMEYwMAkvKiBNZW1ETUEgU3RyZWFtIDAgRGVzdGluYXRpb24gTmV4dCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIJCSovCi0jZGVmaW5lIE1ETUFfRDBfU1RBUlRfQUREUgkJMHhGRkMwMEYwNAkvKiBNZW1ETUEgU3RyZWFtIDAgRGVzdGluYXRpb24gU3RhcnQgQWRkcmVzcyBSZWdpc3RlcgkJCQkqLwotI2RlZmluZSBNRE1BX0QwX0NPTkZJRwkJCTB4RkZDMDBGMDgJLyogTWVtRE1BIFN0cmVhbSAwIERlc3RpbmF0aW9uIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgTURNQV9EMF9YX0NPVU5UCQkJMHhGRkMwMEYxMAkvKiBNZW1ETUEgU3RyZWFtIDAgRGVzdGluYXRpb24gWCBDb3VudCBSZWdpc3RlcgkJCQkJCSovCi0jZGVmaW5lIE1ETUFfRDBfWF9NT0RJRlkJCTB4RkZDMDBGMTQJLyogTWVtRE1BIFN0cmVhbSAwIERlc3RpbmF0aW9uIFggTW9kaWZ5IFJlZ2lzdGVyCQkJCQkqLwotI2RlZmluZSBNRE1BX0QwX1lfQ09VTlQJCQkweEZGQzAwRjE4CS8qIE1lbURNQSBTdHJlYW0gMCBEZXN0aW5hdGlvbiBZIENvdW50IFJlZ2lzdGVyCQkJCQkJKi8KLSNkZWZpbmUgTURNQV9EMF9ZX01PRElGWQkJMHhGRkMwMEYxQwkvKiBNZW1ETUEgU3RyZWFtIDAgRGVzdGluYXRpb24gWSBNb2RpZnkgUmVnaXN0ZXIJCQkJCSovCi0jZGVmaW5lIE1ETUFfRDBfQ1VSUl9ERVNDX1BUUgkweEZGQzAwRjIwCS8qIE1lbURNQSBTdHJlYW0gMCBEZXN0aW5hdGlvbiBDdXJyZW50IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlcgkqLwotI2RlZmluZSBNRE1BX0QwX0NVUlJfQUREUgkJMHhGRkMwMEYyNAkvKiBNZW1ETUEgU3RyZWFtIDAgRGVzdGluYXRpb24gQ3VycmVudCBBZGRyZXNzIFJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIE1ETUFfRDBfSVJRX1NUQVRVUwkJMHhGRkMwMEYyOAkvKiBNZW1ETUEgU3RyZWFtIDAgRGVzdGluYXRpb24gSW50ZXJydXB0L1N0YXR1cyBSZWdpc3RlcgkJCSovCi0jZGVmaW5lIE1ETUFfRDBfUEVSSVBIRVJBTF9NQVAJMHhGRkMwMEYyQwkvKiBNZW1ETUEgU3RyZWFtIDAgRGVzdGluYXRpb24gUGVyaXBoZXJhbCBNYXAgUmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgTURNQV9EMF9DVVJSX1hfQ09VTlQJMHhGRkMwMEYzMAkvKiBNZW1ETUEgU3RyZWFtIDAgRGVzdGluYXRpb24gQ3VycmVudCBYIENvdW50IFJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIE1ETUFfRDBfQ1VSUl9ZX0NPVU5UCTB4RkZDMDBGMzgJLyogTWVtRE1BIFN0cmVhbSAwIERlc3RpbmF0aW9uIEN1cnJlbnQgWSBDb3VudCBSZWdpc3RlcgkJCQkqLwotCi0jZGVmaW5lIE1ETUFfUzBfTkVYVF9ERVNDX1BUUgkweEZGQzAwRjQwCS8qIE1lbURNQSBTdHJlYW0gMCBTb3VyY2UgTmV4dCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIJCQkqLwotI2RlZmluZSBNRE1BX1MwX1NUQVJUX0FERFIJCTB4RkZDMDBGNDQJLyogTWVtRE1BIFN0cmVhbSAwIFNvdXJjZSBTdGFydCBBZGRyZXNzIFJlZ2lzdGVyCQkJCQkqLwotI2RlZmluZSBNRE1BX1MwX0NPTkZJRwkJCTB4RkZDMDBGNDgJLyogTWVtRE1BIFN0cmVhbSAwIFNvdXJjZSBDb25maWd1cmF0aW9uIFJlZ2lzdGVyCQkJCQkqLwotI2RlZmluZSBNRE1BX1MwX1hfQ09VTlQJCQkweEZGQzAwRjUwCS8qIE1lbURNQSBTdHJlYW0gMCBTb3VyY2UgWCBDb3VudCBSZWdpc3RlcgkJCQkJCQkqLwotI2RlZmluZSBNRE1BX1MwX1hfTU9ESUZZCQkweEZGQzAwRjU0CS8qIE1lbURNQSBTdHJlYW0gMCBTb3VyY2UgWCBNb2RpZnkgUmVnaXN0ZXIJCQkJCQkJKi8KLSNkZWZpbmUgTURNQV9TMF9ZX0NPVU5UCQkJMHhGRkMwMEY1OAkvKiBNZW1ETUEgU3RyZWFtIDAgU291cmNlIFkgQ291bnQgUmVnaXN0ZXIJCQkJCQkJKi8KLSNkZWZpbmUgTURNQV9TMF9ZX01PRElGWQkJMHhGRkMwMEY1QwkvKiBNZW1ETUEgU3RyZWFtIDAgU291cmNlIFkgTW9kaWZ5IFJlZ2lzdGVyCQkJCQkJCSovCi0jZGVmaW5lIE1ETUFfUzBfQ1VSUl9ERVNDX1BUUgkweEZGQzAwRjYwCS8qIE1lbURNQSBTdHJlYW0gMCBTb3VyY2UgQ3VycmVudCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIJCSovCi0jZGVmaW5lIE1ETUFfUzBfQ1VSUl9BRERSCQkweEZGQzAwRjY0CS8qIE1lbURNQSBTdHJlYW0gMCBTb3VyY2UgQ3VycmVudCBBZGRyZXNzIFJlZ2lzdGVyCQkJCQkqLwotI2RlZmluZSBNRE1BX1MwX0lSUV9TVEFUVVMJCTB4RkZDMDBGNjgJLyogTWVtRE1BIFN0cmVhbSAwIFNvdXJjZSBJbnRlcnJ1cHQvU3RhdHVzIFJlZ2lzdGVyCQkJCQkqLwotI2RlZmluZSBNRE1BX1MwX1BFUklQSEVSQUxfTUFQCTB4RkZDMDBGNkMJLyogTWVtRE1BIFN0cmVhbSAwIFNvdXJjZSBQZXJpcGhlcmFsIE1hcCBSZWdpc3RlcgkJCQkJKi8KLSNkZWZpbmUgTURNQV9TMF9DVVJSX1hfQ09VTlQJMHhGRkMwMEY3MAkvKiBNZW1ETUEgU3RyZWFtIDAgU291cmNlIEN1cnJlbnQgWCBDb3VudCBSZWdpc3RlcgkJCQkJKi8KLSNkZWZpbmUgTURNQV9TMF9DVVJSX1lfQ09VTlQJMHhGRkMwMEY3OAkvKiBNZW1ETUEgU3RyZWFtIDAgU291cmNlIEN1cnJlbnQgWSBDb3VudCBSZWdpc3RlcgkJCQkJKi8KLQotI2RlZmluZSBNRE1BX0QxX05FWFRfREVTQ19QVFIJMHhGRkMwMEY4MAkvKiBNZW1ETUEgU3RyZWFtIDEgRGVzdGluYXRpb24gTmV4dCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIJCSovCi0jZGVmaW5lIE1ETUFfRDFfU1RBUlRfQUREUgkJMHhGRkMwMEY4NAkvKiBNZW1ETUEgU3RyZWFtIDEgRGVzdGluYXRpb24gU3RhcnQgQWRkcmVzcyBSZWdpc3RlcgkJCQkqLwotI2RlZmluZSBNRE1BX0QxX0NPTkZJRwkJCTB4RkZDMDBGODgJLyogTWVtRE1BIFN0cmVhbSAxIERlc3RpbmF0aW9uIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgTURNQV9EMV9YX0NPVU5UCQkJMHhGRkMwMEY5MAkvKiBNZW1ETUEgU3RyZWFtIDEgRGVzdGluYXRpb24gWCBDb3VudCBSZWdpc3RlcgkJCQkJCSovCi0jZGVmaW5lIE1ETUFfRDFfWF9NT0RJRlkJCTB4RkZDMDBGOTQJLyogTWVtRE1BIFN0cmVhbSAxIERlc3RpbmF0aW9uIFggTW9kaWZ5IFJlZ2lzdGVyCQkJCQkqLwotI2RlZmluZSBNRE1BX0QxX1lfQ09VTlQJCQkweEZGQzAwRjk4CS8qIE1lbURNQSBTdHJlYW0gMSBEZXN0aW5hdGlvbiBZIENvdW50IFJlZ2lzdGVyCQkJCQkJKi8KLSNkZWZpbmUgTURNQV9EMV9ZX01PRElGWQkJMHhGRkMwMEY5QwkvKiBNZW1ETUEgU3RyZWFtIDEgRGVzdGluYXRpb24gWSBNb2RpZnkgUmVnaXN0ZXIJCQkJCSovCi0jZGVmaW5lIE1ETUFfRDFfQ1VSUl9ERVNDX1BUUgkweEZGQzAwRkEwCS8qIE1lbURNQSBTdHJlYW0gMSBEZXN0aW5hdGlvbiBDdXJyZW50IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlcgkqLwotI2RlZmluZSBNRE1BX0QxX0NVUlJfQUREUgkJMHhGRkMwMEZBNAkvKiBNZW1ETUEgU3RyZWFtIDEgRGVzdGluYXRpb24gQ3VycmVudCBBZGRyZXNzIFJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIE1ETUFfRDFfSVJRX1NUQVRVUwkJMHhGRkMwMEZBOAkvKiBNZW1ETUEgU3RyZWFtIDEgRGVzdGluYXRpb24gSW50ZXJydXB0L1N0YXR1cyBSZWdpc3RlcgkJCSovCi0jZGVmaW5lIE1ETUFfRDFfUEVSSVBIRVJBTF9NQVAJMHhGRkMwMEZBQwkvKiBNZW1ETUEgU3RyZWFtIDEgRGVzdGluYXRpb24gUGVyaXBoZXJhbCBNYXAgUmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgTURNQV9EMV9DVVJSX1hfQ09VTlQJMHhGRkMwMEZCMAkvKiBNZW1ETUEgU3RyZWFtIDEgRGVzdGluYXRpb24gQ3VycmVudCBYIENvdW50IFJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIE1ETUFfRDFfQ1VSUl9ZX0NPVU5UCTB4RkZDMDBGQjgJLyogTWVtRE1BIFN0cmVhbSAxIERlc3RpbmF0aW9uIEN1cnJlbnQgWSBDb3VudCBSZWdpc3RlcgkJCQkqLwotCi0jZGVmaW5lIE1ETUFfUzFfTkVYVF9ERVNDX1BUUgkweEZGQzAwRkMwCS8qIE1lbURNQSBTdHJlYW0gMSBTb3VyY2UgTmV4dCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIJCQkqLwotI2RlZmluZSBNRE1BX1MxX1NUQVJUX0FERFIJCTB4RkZDMDBGQzQJLyogTWVtRE1BIFN0cmVhbSAxIFNvdXJjZSBTdGFydCBBZGRyZXNzIFJlZ2lzdGVyCQkJCQkqLwotI2RlZmluZSBNRE1BX1MxX0NPTkZJRwkJCTB4RkZDMDBGQzgJLyogTWVtRE1BIFN0cmVhbSAxIFNvdXJjZSBDb25maWd1cmF0aW9uIFJlZ2lzdGVyCQkJCQkqLwotI2RlZmluZSBNRE1BX1MxX1hfQ09VTlQJCQkweEZGQzAwRkQwCS8qIE1lbURNQSBTdHJlYW0gMSBTb3VyY2UgWCBDb3VudCBSZWdpc3RlcgkJCQkJCQkqLwotI2RlZmluZSBNRE1BX1MxX1hfTU9ESUZZCQkweEZGQzAwRkQ0CS8qIE1lbURNQSBTdHJlYW0gMSBTb3VyY2UgWCBNb2RpZnkgUmVnaXN0ZXIJCQkJCQkJKi8KLSNkZWZpbmUgTURNQV9TMV9ZX0NPVU5UCQkJMHhGRkMwMEZEOAkvKiBNZW1ETUEgU3RyZWFtIDEgU291cmNlIFkgQ291bnQgUmVnaXN0ZXIJCQkJCQkJKi8KLSNkZWZpbmUgTURNQV9TMV9ZX01PRElGWQkJMHhGRkMwMEZEQwkvKiBNZW1ETUEgU3RyZWFtIDEgU291cmNlIFkgTW9kaWZ5IFJlZ2lzdGVyCQkJCQkJCSovCi0jZGVmaW5lIE1ETUFfUzFfQ1VSUl9ERVNDX1BUUgkweEZGQzAwRkUwCS8qIE1lbURNQSBTdHJlYW0gMSBTb3VyY2UgQ3VycmVudCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIJCSovCi0jZGVmaW5lIE1ETUFfUzFfQ1VSUl9BRERSCQkweEZGQzAwRkU0CS8qIE1lbURNQSBTdHJlYW0gMSBTb3VyY2UgQ3VycmVudCBBZGRyZXNzIFJlZ2lzdGVyCQkJCQkqLwotI2RlZmluZSBNRE1BX1MxX0lSUV9TVEFUVVMJCTB4RkZDMDBGRTgJLyogTWVtRE1BIFN0cmVhbSAxIFNvdXJjZSBJbnRlcnJ1cHQvU3RhdHVzIFJlZ2lzdGVyCQkJCQkqLwotI2RlZmluZSBNRE1BX1MxX1BFUklQSEVSQUxfTUFQCTB4RkZDMDBGRUMJLyogTWVtRE1BIFN0cmVhbSAxIFNvdXJjZSBQZXJpcGhlcmFsIE1hcCBSZWdpc3RlcgkJCQkJKi8KLSNkZWZpbmUgTURNQV9TMV9DVVJSX1hfQ09VTlQJMHhGRkMwMEZGMAkvKiBNZW1ETUEgU3RyZWFtIDEgU291cmNlIEN1cnJlbnQgWCBDb3VudCBSZWdpc3RlcgkJCQkJKi8KLSNkZWZpbmUgTURNQV9TMV9DVVJSX1lfQ09VTlQJMHhGRkMwMEZGOAkvKiBNZW1ETUEgU3RyZWFtIDEgU291cmNlIEN1cnJlbnQgWSBDb3VudCBSZWdpc3RlcgkJCQkJKi8KLQotCi0vKiBQYXJhbGxlbCBQZXJpcGhlcmFsIEludGVyZmFjZSAoMHhGRkMwMTAwMCAtIDB4RkZDMDEwRkYpCQkJCSovCi0jZGVmaW5lIFBQSV9DT05UUk9MCQkJMHhGRkMwMTAwMAkvKiBQUEkgQ29udHJvbCBSZWdpc3RlcgkJCSovCi0jZGVmaW5lIFBQSV9TVEFUVVMJCQkweEZGQzAxMDA0CS8qIFBQSSBTdGF0dXMgUmVnaXN0ZXIJCQkqLwotI2RlZmluZSBQUElfQ09VTlQJCQkweEZGQzAxMDA4CS8qIFBQSSBUcmFuc2ZlciBDb3VudCBSZWdpc3RlcgkqLwotI2RlZmluZSBQUElfREVMQVkJCQkweEZGQzAxMDBDCS8qIFBQSSBEZWxheSBDb3VudCBSZWdpc3RlcgkJKi8KLSNkZWZpbmUgUFBJX0ZSQU1FCQkJMHhGRkMwMTAxMAkvKiBQUEkgRnJhbWUgTGVuZ3RoIFJlZ2lzdGVyCSovCi0KLQotLyogVHdvLVdpcmUgSW50ZXJmYWNlCQkoMHhGRkMwMTQwMCAtIDB4RkZDMDE0RkYpCQkJCQkJCQkqLwotI2RlZmluZSBUV0kwX1JFR0JBU0UJCQkweEZGQzAxNDAwCi0jZGVmaW5lIFRXSTBfQ0xLRElWCQkJMHhGRkMwMTQwMAkvKiBTZXJpYWwgQ2xvY2sgRGl2aWRlciBSZWdpc3RlcgkJCSovCi0jZGVmaW5lIFRXSTBfQ09OVFJPTAkJCTB4RkZDMDE0MDQJLyogVFdJIENvbnRyb2wgUmVnaXN0ZXIJCQkJCQkqLwotI2RlZmluZSBUV0kwX1NMQVZFX0NUTAkJMHhGRkMwMTQwOAkvKiBTbGF2ZSBNb2RlIENvbnRyb2wgUmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgVFdJMF9TTEFWRV9TVEFUCQkweEZGQzAxNDBDCS8qIFNsYXZlIE1vZGUgU3RhdHVzIFJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIFRXSTBfU0xBVkVfQUREUgkJMHhGRkMwMTQxMAkvKiBTbGF2ZSBNb2RlIEFkZHJlc3MgUmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgVFdJMF9NQVNURVJfQ1RMCQkweEZGQzAxNDE0CS8qIE1hc3RlciBNb2RlIENvbnRyb2wgUmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgVFdJMF9NQVNURVJfU1RBVAkJMHhGRkMwMTQxOAkvKiBNYXN0ZXIgTW9kZSBTdGF0dXMgUmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgVFdJMF9NQVNURVJfQUREUgkJMHhGRkMwMTQxQwkvKiBNYXN0ZXIgTW9kZSBBZGRyZXNzIFJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIFRXSTBfSU5UX1NUQVQJCTB4RkZDMDE0MjAJLyogVFdJIEludGVycnVwdCBTdGF0dXMgUmVnaXN0ZXIJCQkqLwotI2RlZmluZSBUV0kwX0lOVF9NQVNLCQkweEZGQzAxNDI0CS8qIFRXSSBNYXN0ZXIgSW50ZXJydXB0IE1hc2sgUmVnaXN0ZXIJCSovCi0jZGVmaW5lIFRXSTBfRklGT19DVEwJCTB4RkZDMDE0MjgJLyogRklGTyBDb250cm9sIFJlZ2lzdGVyCQkJCQkqLwotI2RlZmluZSBUV0kwX0ZJRk9fU1RBVAkJMHhGRkMwMTQyQwkvKiBGSUZPIFN0YXR1cyBSZWdpc3RlcgkJCQkJCSovCi0jZGVmaW5lIFRXSTBfWE1UX0RBVEE4CQkweEZGQzAxNDgwCS8qIEZJRk8gVHJhbnNtaXQgRGF0YSBTaW5nbGUgQnl0ZSBSZWdpc3RlcgkqLwotI2RlZmluZSBUV0kwX1hNVF9EQVRBMTYJCTB4RkZDMDE0ODQJLyogRklGTyBUcmFuc21pdCBEYXRhIERvdWJsZSBCeXRlIFJlZ2lzdGVyCSovCi0jZGVmaW5lIFRXSTBfUkNWX0RBVEE4CQkweEZGQzAxNDg4CS8qIEZJRk8gUmVjZWl2ZSBEYXRhIFNpbmdsZSBCeXRlIFJlZ2lzdGVyCSovCi0jZGVmaW5lIFRXSTBfUkNWX0RBVEExNgkJMHhGRkMwMTQ4QwkvKiBGSUZPIFJlY2VpdmUgRGF0YSBEb3VibGUgQnl0ZSBSZWdpc3RlcgkqLwotCi0KLS8qIEdlbmVyYWwgUHVycG9zZSBJL08gUG9ydCBHICgweEZGQzAxNTAwIC0gMHhGRkMwMTVGRikJCQkJCQkJCQkJCQkqLwotI2RlZmluZSBQT1JUR0lPCQkJCQkweEZGQzAxNTAwCS8qIFBvcnQgRyBJL08gUGluIFN0YXRlIFNwZWNpZnkgUmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgUE9SVEdJT19DTEVBUgkJCTB4RkZDMDE1MDQJLyogUG9ydCBHIEkvTyBQZXJpcGhlcmFsIEludGVycnVwdCBDbGVhciBSZWdpc3RlcgkJKi8KLSNkZWZpbmUgUE9SVEdJT19TRVQJCQkJMHhGRkMwMTUwOAkvKiBQb3J0IEcgSS9PIFBlcmlwaGVyYWwgSW50ZXJydXB0IFNldCBSZWdpc3RlcgkJCSovCi0jZGVmaW5lIFBPUlRHSU9fVE9HR0xFCQkJMHhGRkMwMTUwQwkvKiBQb3J0IEcgSS9PIFBpbiBTdGF0ZSBUb2dnbGUgUmVnaXN0ZXIJCQkJCSovCi0jZGVmaW5lIFBPUlRHSU9fTUFTS0EJCQkweEZGQzAxNTEwCS8qIFBvcnQgRyBJL08gTWFzayBTdGF0ZSBTcGVjaWZ5IEludGVycnVwdCBBIFJlZ2lzdGVyCSovCi0jZGVmaW5lIFBPUlRHSU9fTUFTS0FfQ0xFQVIJCTB4RkZDMDE1MTQJLyogUG9ydCBHIEkvTyBNYXNrIERpc2FibGUgSW50ZXJydXB0IEEgUmVnaXN0ZXIJCQkqLwotI2RlZmluZSBQT1JUR0lPX01BU0tBX1NFVAkJMHhGRkMwMTUxOAkvKiBQb3J0IEcgSS9PIE1hc2sgRW5hYmxlIEludGVycnVwdCBBIFJlZ2lzdGVyCQkJKi8KLSNkZWZpbmUgUE9SVEdJT19NQVNLQV9UT0dHTEUJMHhGRkMwMTUxQwkvKiBQb3J0IEcgSS9PIE1hc2sgVG9nZ2xlIEVuYWJsZSBJbnRlcnJ1cHQgQSBSZWdpc3RlcgkqLwotI2RlZmluZSBQT1JUR0lPX01BU0tCCQkJMHhGRkMwMTUyMAkvKiBQb3J0IEcgSS9PIE1hc2sgU3RhdGUgU3BlY2lmeSBJbnRlcnJ1cHQgQiBSZWdpc3RlcgkqLwotI2RlZmluZSBQT1JUR0lPX01BU0tCX0NMRUFSCQkweEZGQzAxNTI0CS8qIFBvcnQgRyBJL08gTWFzayBEaXNhYmxlIEludGVycnVwdCBCIFJlZ2lzdGVyCQkJKi8KLSNkZWZpbmUgUE9SVEdJT19NQVNLQl9TRVQJCTB4RkZDMDE1MjgJLyogUG9ydCBHIEkvTyBNYXNrIEVuYWJsZSBJbnRlcnJ1cHQgQiBSZWdpc3RlcgkJCSovCi0jZGVmaW5lIFBPUlRHSU9fTUFTS0JfVE9HR0xFCTB4RkZDMDE1MkMJLyogUG9ydCBHIEkvTyBNYXNrIFRvZ2dsZSBFbmFibGUgSW50ZXJydXB0IEIgUmVnaXN0ZXIJKi8KLSNkZWZpbmUgUE9SVEdJT19ESVIJCQkJMHhGRkMwMTUzMAkvKiBQb3J0IEcgSS9PIERpcmVjdGlvbiBSZWdpc3RlcgkJCQkJCSovCi0jZGVmaW5lIFBPUlRHSU9fUE9MQVIJCQkweEZGQzAxNTM0CS8qIFBvcnQgRyBJL08gU291cmNlIFBvbGFyaXR5IFJlZ2lzdGVyCQkJCQkqLwotI2RlZmluZSBQT1JUR0lPX0VER0UJCQkweEZGQzAxNTM4CS8qIFBvcnQgRyBJL08gU291cmNlIFNlbnNpdGl2aXR5IFJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIFBPUlRHSU9fQk9USAkJCTB4RkZDMDE1M0MJLyogUG9ydCBHIEkvTyBTZXQgb24gQk9USCBFZGdlcyBSZWdpc3RlcgkJCQkqLwotI2RlZmluZSBQT1JUR0lPX0lORU4JCQkweEZGQzAxNTQwCS8qIFBvcnQgRyBJL08gSW5wdXQgRW5hYmxlIFJlZ2lzdGVyCQkJCQkJKi8KLQotCi0vKiBHZW5lcmFsIFB1cnBvc2UgSS9PIFBvcnQgSCAoMHhGRkMwMTcwMCAtIDB4RkZDMDE3RkYpCQkJCQkJCQkJCQkJKi8KLSNkZWZpbmUgUE9SVEhJTwkJCQkJMHhGRkMwMTcwMAkvKiBQb3J0IEggSS9PIFBpbiBTdGF0ZSBTcGVjaWZ5IFJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIFBPUlRISU9fQ0xFQVIJCQkweEZGQzAxNzA0CS8qIFBvcnQgSCBJL08gUGVyaXBoZXJhbCBJbnRlcnJ1cHQgQ2xlYXIgUmVnaXN0ZXIJCSovCi0jZGVmaW5lIFBPUlRISU9fU0VUCQkJCTB4RkZDMDE3MDgJLyogUG9ydCBIIEkvTyBQZXJpcGhlcmFsIEludGVycnVwdCBTZXQgUmVnaXN0ZXIJCQkqLwotI2RlZmluZSBQT1JUSElPX1RPR0dMRQkJCTB4RkZDMDE3MEMJLyogUG9ydCBIIEkvTyBQaW4gU3RhdGUgVG9nZ2xlIFJlZ2lzdGVyCQkJCQkqLwotI2RlZmluZSBQT1JUSElPX01BU0tBCQkJMHhGRkMwMTcxMAkvKiBQb3J0IEggSS9PIE1hc2sgU3RhdGUgU3BlY2lmeSBJbnRlcnJ1cHQgQSBSZWdpc3RlcgkqLwotI2RlZmluZSBQT1JUSElPX01BU0tBX0NMRUFSCQkweEZGQzAxNzE0CS8qIFBvcnQgSCBJL08gTWFzayBEaXNhYmxlIEludGVycnVwdCBBIFJlZ2lzdGVyCQkJKi8KLSNkZWZpbmUgUE9SVEhJT19NQVNLQV9TRVQJCTB4RkZDMDE3MTgJLyogUG9ydCBIIEkvTyBNYXNrIEVuYWJsZSBJbnRlcnJ1cHQgQSBSZWdpc3RlcgkJCSovCi0jZGVmaW5lIFBPUlRISU9fTUFTS0FfVE9HR0xFCTB4RkZDMDE3MUMJLyogUG9ydCBIIEkvTyBNYXNrIFRvZ2dsZSBFbmFibGUgSW50ZXJydXB0IEEgUmVnaXN0ZXIJKi8KLSNkZWZpbmUgUE9SVEhJT19NQVNLQgkJCTB4RkZDMDE3MjAJLyogUG9ydCBIIEkvTyBNYXNrIFN0YXRlIFNwZWNpZnkgSW50ZXJydXB0IEIgUmVnaXN0ZXIJKi8KLSNkZWZpbmUgUE9SVEhJT19NQVNLQl9DTEVBUgkJMHhGRkMwMTcyNAkvKiBQb3J0IEggSS9PIE1hc2sgRGlzYWJsZSBJbnRlcnJ1cHQgQiBSZWdpc3RlcgkJCSovCi0jZGVmaW5lIFBPUlRISU9fTUFTS0JfU0VUCQkweEZGQzAxNzI4CS8qIFBvcnQgSCBJL08gTWFzayBFbmFibGUgSW50ZXJydXB0IEIgUmVnaXN0ZXIJCQkqLwotI2RlZmluZSBQT1JUSElPX01BU0tCX1RPR0dMRQkweEZGQzAxNzJDCS8qIFBvcnQgSCBJL08gTWFzayBUb2dnbGUgRW5hYmxlIEludGVycnVwdCBCIFJlZ2lzdGVyCSovCi0jZGVmaW5lIFBPUlRISU9fRElSCQkJCTB4RkZDMDE3MzAJLyogUG9ydCBIIEkvTyBEaXJlY3Rpb24gUmVnaXN0ZXIJCQkJCQkqLwotI2RlZmluZSBQT1JUSElPX1BPTEFSCQkJMHhGRkMwMTczNAkvKiBQb3J0IEggSS9PIFNvdXJjZSBQb2xhcml0eSBSZWdpc3RlcgkJCQkJKi8KLSNkZWZpbmUgUE9SVEhJT19FREdFCQkJMHhGRkMwMTczOAkvKiBQb3J0IEggSS9PIFNvdXJjZSBTZW5zaXRpdml0eSBSZWdpc3RlcgkJCQkqLwotI2RlZmluZSBQT1JUSElPX0JPVEgJCQkweEZGQzAxNzNDCS8qIFBvcnQgSCBJL08gU2V0IG9uIEJPVEggRWRnZXMgUmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgUE9SVEhJT19JTkVOCQkJMHhGRkMwMTc0MAkvKiBQb3J0IEggSS9PIElucHV0IEVuYWJsZSBSZWdpc3RlcgkJCQkJCSovCi0KLQotLyogVUFSVDEgQ29udHJvbGxlcgkJKDB4RkZDMDIwMDAgLSAweEZGQzAyMEZGKQkJCQkJCQkJKi8KLSNkZWZpbmUgVUFSVDFfVEhSCQkJMHhGRkMwMjAwMAkvKiBUcmFuc21pdCBIb2xkaW5nIHJlZ2lzdGVyCQkJKi8KLSNkZWZpbmUgVUFSVDFfUkJSCQkJMHhGRkMwMjAwMAkvKiBSZWNlaXZlIEJ1ZmZlciByZWdpc3RlcgkJCQkqLwotI2RlZmluZSBVQVJUMV9ETEwJCQkweEZGQzAyMDAwCS8qIERpdmlzb3IgTGF0Y2ggKExvdy1CeXRlKQkJCQkqLwotI2RlZmluZSBVQVJUMV9JRVIJCQkweEZGQzAyMDA0CS8qIEludGVycnVwdCBFbmFibGUgUmVnaXN0ZXIJCQkqLwotI2RlZmluZSBVQVJUMV9ETEgJCQkweEZGQzAyMDA0CS8qIERpdmlzb3IgTGF0Y2ggKEhpZ2gtQnl0ZSkJCQkqLwotI2RlZmluZSBVQVJUMV9JSVIJCQkweEZGQzAyMDA4CS8qIEludGVycnVwdCBJZGVudGlmaWNhdGlvbiBSZWdpc3RlcgkqLwotI2RlZmluZSBVQVJUMV9MQ1IJCQkweEZGQzAyMDBDCS8qIExpbmUgQ29udHJvbCBSZWdpc3RlcgkJCQkqLwotI2RlZmluZSBVQVJUMV9NQ1IJCQkweEZGQzAyMDEwCS8qIE1vZGVtIENvbnRyb2wgUmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgVUFSVDFfTFNSCQkJMHhGRkMwMjAxNAkvKiBMaW5lIFN0YXR1cyBSZWdpc3RlcgkJCQkJKi8KLSNkZWZpbmUgVUFSVDFfTVNSCQkJMHhGRkMwMjAxOAkvKiBNb2RlbSBTdGF0dXMgUmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgVUFSVDFfU0NSCQkJMHhGRkMwMjAxQwkvKiBTQ1IgU2NyYXRjaCBSZWdpc3RlcgkJCQkJKi8KLSNkZWZpbmUgVUFSVDFfR0NUTAkJCTB4RkZDMDIwMjQJLyogR2xvYmFsIENvbnRyb2wgUmVnaXN0ZXIJCQkJKi8KLQotCi0vKiBQaW4gQ29udHJvbCBSZWdpc3RlcnMJKDB4RkZDMDMyMDAgLSAweEZGQzAzMkZGKQkJCQkJCQkJCQkJKi8KLSNkZWZpbmUgUE9SVEZfRkVSCQkJMHhGRkMwMzIwMAkvKiBQb3J0IEYgRnVuY3Rpb24gRW5hYmxlIFJlZ2lzdGVyIChBbHRlcm5hdGUvRmxhZyopCSovCi0jZGVmaW5lIFBPUlRHX0ZFUgkJCTB4RkZDMDMyMDQJLyogUG9ydCBHIEZ1bmN0aW9uIEVuYWJsZSBSZWdpc3RlciAoQWx0ZXJuYXRlL0ZsYWcqKQkqLwotI2RlZmluZSBQT1JUSF9GRVIJCQkweEZGQzAzMjA4CS8qIFBvcnQgSCBGdW5jdGlvbiBFbmFibGUgUmVnaXN0ZXIgKEFsdGVybmF0ZS9GbGFnKikJKi8KLSNkZWZpbmUgQkZJTl9QT1JUX01VWAkJCTB4RkZDMDMyMEMJLyogUG9ydCBNdWx0aXBsZXhlciBDb250cm9sIFJlZ2lzdGVyCQkJCQkqLwotCi0KLS8qIEhhbmRzaGFrZSBNRE1BIFJlZ2lzdGVycwkoMHhGRkMwMzMwMCAtIDB4RkZDMDMzRkYpCQkJCQkJCQkJCSovCi0jZGVmaW5lIEhNRE1BMF9DT05UUk9MCQkweEZGQzAzMzAwCS8qIEhhbmRzaGFrZSBNRE1BMCBDb250cm9sIFJlZ2lzdGVyCQkJCQkqLwotI2RlZmluZSBITURNQTBfRUNJTklUCQkweEZGQzAzMzA0CS8qIEhNRE1BMCBJbml0aWFsIEVkZ2UgQ291bnQgUmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgSE1ETUEwX0JDSU5JVAkJMHhGRkMwMzMwOAkvKiBITURNQTAgSW5pdGlhbCBCbG9jayBDb3VudCBSZWdpc3RlcgkJCQkqLwotI2RlZmluZSBITURNQTBfRUNVUkdFTlQJCTB4RkZDMDMzMEMJLyogSE1ETUEwIFVyZ2VudCBFZGdlIENvdW50IFRocmVzaG9sZCBSZWdpc3RlcgkJKi8KLSNkZWZpbmUgSE1ETUEwX0VDT1ZFUkZMT1cJMHhGRkMwMzMxMAkvKiBITURNQTAgRWRnZSBDb3VudCBPdmVyZmxvdyBJbnRlcnJ1cHQgUmVnaXN0ZXIJKi8KLSNkZWZpbmUgSE1ETUEwX0VDT1VOVAkJMHhGRkMwMzMxNAkvKiBITURNQTAgQ3VycmVudCBFZGdlIENvdW50IFJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIEhNRE1BMF9CQ09VTlQJCTB4RkZDMDMzMTgJLyogSE1ETUEwIEN1cnJlbnQgQmxvY2sgQ291bnQgUmVnaXN0ZXIJCQkJKi8KLQotI2RlZmluZSBITURNQTFfQ09OVFJPTAkJMHhGRkMwMzM0MAkvKiBIYW5kc2hha2UgTURNQTEgQ29udHJvbCBSZWdpc3RlcgkJCQkJKi8KLSNkZWZpbmUgSE1ETUExX0VDSU5JVAkJMHhGRkMwMzM0NAkvKiBITURNQTEgSW5pdGlhbCBFZGdlIENvdW50IFJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIEhNRE1BMV9CQ0lOSVQJCTB4RkZDMDMzNDgJLyogSE1ETUExIEluaXRpYWwgQmxvY2sgQ291bnQgUmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgSE1ETUExX0VDVVJHRU5UCQkweEZGQzAzMzRDCS8qIEhNRE1BMSBVcmdlbnQgRWRnZSBDb3VudCBUaHJlc2hvbGQgUmVnaXN0ZXIJCSovCi0jZGVmaW5lIEhNRE1BMV9FQ09WRVJGTE9XCTB4RkZDMDMzNTAJLyogSE1ETUExIEVkZ2UgQ291bnQgT3ZlcmZsb3cgSW50ZXJydXB0IFJlZ2lzdGVyCSovCi0jZGVmaW5lIEhNRE1BMV9FQ09VTlQJCTB4RkZDMDMzNTQJLyogSE1ETUExIEN1cnJlbnQgRWRnZSBDb3VudCBSZWdpc3RlcgkJCQkqLwotI2RlZmluZSBITURNQTFfQkNPVU5UCQkweEZGQzAzMzU4CS8qIEhNRE1BMSBDdXJyZW50IEJsb2NrIENvdW50IFJlZ2lzdGVyCQkJCSovCi0KLQotLyogR1BJTyBQSU4gbXV4ICgweEZGQzAzMjEwIC0gT3hGRkMwMzI4OCkgKi8KLSNkZWZpbmUgUE9SVEZfTVVYICAgICAgICAgICAgICAgMHhGRkMwMzIxMCAgICAgIC8qIFBvcnQgRiBtdXggY29udHJvbCAqLwotI2RlZmluZSBQT1JUR19NVVggICAgICAgICAgICAgICAweEZGQzAzMjE0ICAgICAgLyogUG9ydCBHIG11eCBjb250cm9sICovCi0jZGVmaW5lIFBPUlRIX01VWCAgICAgICAgICAgICAgIDB4RkZDMDMyMTggICAgICAvKiBQb3J0IEggbXV4IGNvbnRyb2wgKi8KLSNkZWZpbmUgUE9SVEZfRFJJVkUgICAgICAgICAgICAgMHhGRkMwMzIyMCAgICAgIC8qIFBvcnQgRiBkcml2ZSBzdHJlbmd0aCBjb250cm9sICovCi0jZGVmaW5lIFBPUlRHX0RSSVZFICAgICAgICAgICAgIDB4RkZDMDMyMjQgICAgICAvKiBQb3J0IEcgZHJpdmUgc3RyZW5ndGggY29udHJvbCAqLwotI2RlZmluZSBQT1JUSF9EUklWRSAgICAgICAgICAgICAweEZGQzAzMjI4ICAgICAgLyogUG9ydCBIIGRyaXZlIHN0cmVuZ3RoIGNvbnRyb2wgKi8KLSNkZWZpbmUgUE9SVEZfU0xFVyAgICAgICAgICAgICAgMHhGRkMwMzIzMCAgICAgIC8qIFBvcnQgRiBzbGV3IGNvbnRyb2wgKi8KLSNkZWZpbmUgUE9SVEdfU0xFVyAgICAgICAgICAgICAgMHhGRkMwMzIzNCAgICAgIC8qIFBvcnQgRyBzbGV3IGNvbnRyb2wgKi8KLSNkZWZpbmUgUE9SVEhfU0xFVyAgICAgICAgICAgICAgMHhGRkMwMzIzOCAgICAgIC8qIFBvcnQgSCBzbGV3IGNvbnRyb2wgKi8KLSNkZWZpbmUgUE9SVEZfSFlTVEVSSVNJUyAgICAgICAgMHhGRkMwMzI0MCAgICAgIC8qIFBvcnQgRiBTY2htaXR0IHRyaWdnZXIgY29udHJvbCAqLwotI2RlZmluZSBQT1JUR19IWVNURVJJU0lTICAgICAgICAweEZGQzAzMjQ0ICAgICAgLyogUG9ydCBHIFNjaG1pdHQgdHJpZ2dlciBjb250cm9sICovCi0jZGVmaW5lIFBPUlRIX0hZU1RFUklTSVMgICAgICAgIDB4RkZDMDMyNDggICAgICAvKiBQb3J0IEggU2NobWl0dCB0cmlnZ2VyIGNvbnRyb2wgKi8KLSNkZWZpbmUgTUlTQ1BPUlRfRFJJVkUgICAgICAgICAgMHhGRkMwMzI4MCAgICAgIC8qIE1pc2MgUG9ydCBkcml2ZSBzdHJlbmd0aCBjb250cm9sICovCi0jZGVmaW5lIE1JU0NQT1JUX1NMRVcgICAgICAgICAgIDB4RkZDMDMyODQgICAgICAvKiBNaXNjIFBvcnQgc2xldyBjb250cm9sICovCi0jZGVmaW5lIE1JU0NQT1JUX0hZU1RFUklTSVMgICAgIDB4RkZDMDMyODggICAgICAvKiBNaXNjIFBvcnQgU2NobWl0dCB0cmlnZ2VyIGNvbnRyb2wgKi8KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoqIFN5c3RlbSBNTVIgUmVnaXN0ZXIgQml0cyBBbmQgTWFjcm9zCi0qKgotKiogRGlzY2xhaW1lcjoJQWxsIG1hY3JvcyBhcmUgaW50ZW5kZWQgdG8gbWFrZSBDIGFuZCBBc3NlbWJseSBjb2RlIG1vcmUgcmVhZGFibGUuCi0qKgkJCQlVc2UgdGhlc2UgbWFjcm9zIGNhcmVmdWxseSwgYXMgYW55IHRoYXQgZG8gbGVmdCBzaGlmdHMgZm9yIGZpZWxkCi0qKgkJCQlkZXBvc2l0aW5nIHdpbGwgcmVzdWx0IGluIHRoZSBsb3dlciBvcmRlciBiaXRzIGJlaW5nIGRlc3Ryb3llZC4gIEFueQotKioJCQkJbWFjcm8gdGhhdCBzaGlmdHMgbGVmdCB0byBwcm9wZXJseSBwb3NpdGlvbiB0aGUgYml0LWZpZWxkIHNob3VsZCBiZQotKioJCQkJdXNlZCBhcyBwYXJ0IG9mIGFuIE9SIHRvIGluaXRpYWxpemUgYSByZWdpc3RlciBhbmQgTk9UIGFzIGEgZHluYW1pYwotKioJCQkJbW9kaWZpZXIgVU5MRVNTIHRoZSBsb3dlciBvcmRlciBiaXRzIGFyZSBzYXZlZCBhbmQgT1JlZCBiYWNrIGluIHdoZW4KLSoqCQkJCXRoZSBtYWNybyBpcyB1c2VkLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogQ0hJUElEIE1hc2tzICovCi0jZGVmaW5lIENISVBJRF9WRVJTSU9OICAgICAgICAgMHhGMDAwMDAwMAotI2RlZmluZSBDSElQSURfRkFNSUxZICAgICAgICAgIDB4MEZGRkYwMDAKLSNkZWZpbmUgQ0hJUElEX01BTlVGQUNUVVJFICAgICAweDAwMDAwRkZFCi0KLS8qIFNXUlNUIE1hc2tzCQkJCQkJCQkJCQkJCQkJCQkJKi8KLSNkZWZpbmUgU1lTVEVNX1JFU0VUCQkweDAwMDcJLyogSW5pdGlhdGVzIEEgU3lzdGVtIFNvZnR3YXJlIFJlc2V0CQkJKi8KLSNkZWZpbmUJRE9VQkxFX0ZBVUxUCQkweDAwMDgJLyogQ29yZSBEb3VibGUgRmF1bHQgQ2F1c2VzIFJlc2V0CQkJCSovCi0jZGVmaW5lIFJFU0VUX0RPVUJMRQkJMHgyMDAwCS8qIFNXIFJlc2V0IEdlbmVyYXRlZCBCeSBDb3JlIERvdWJsZS1GYXVsdAkJKi8KLSNkZWZpbmUgUkVTRVRfV0RPRwkJCTB4NDAwMAkvKiBTVyBSZXNldCBHZW5lcmF0ZWQgQnkgV2F0Y2hkb2cgVGltZXIJCQkqLwotI2RlZmluZSBSRVNFVF9TT0ZUV0FSRQkJMHg4MDAwCS8qIFNXIFJlc2V0IE9jY3VycmVkIFNpbmNlIExhc3QgUmVhZCBPZiBTV1JTVAkqLwotCi0vKiBTWVNDUiBNYXNrcwkJCQkJCQkJCQkJCQkJCQkJCQkJKi8KLSNkZWZpbmUgQk1PREUJCQkJMHgwMDA3CS8qIEJvb3QgTW9kZSAtIExhdGNoZWQgRHVyaW5nIEhXIFJlc2V0IEZyb20gTW9kZSBQaW5zCSovCi0jZGVmaW5lCU5PQk9PVAkJCQkweDAwMTAJLyogRXhlY3V0ZSBGcm9tIEwxIG9yIEFTWU5DIEJhbmsgMCBXaGVuIEJNT0RFID0gMAkJKi8KLQotCi0vKiAqKioqKioqKioqKioqICBTWVNURU0gSU5URVJSVVBUIENPTlRST0xMRVIgTUFTS1MgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIFBlcmlwaGVyYWwgTWFza3MgRm9yIFNJQ19JU1IsIFNJQ19JV1IsIFNJQ19JTUFTSwkJCQkJCQkJCQkqLwotCi0jaWYgMAotI2RlZmluZSBJUlFfUExMX1dBS0VVUAkweDAwMDAwMDAxCS8qIFBMTCBXYWtldXAgSW50ZXJydXB0CQkJIAkJCQkJKi8KLQotI2RlZmluZSBJUlFfRVJST1IxICAgICAgMHgwMDAwMDAwMiAgLyogRXJyb3IgSW50ZXJydXB0IChETUEsIERNQVJ4IEJsb2NrLCBETUFSeCBPdmVyZmxvdykgKi8KLSNkZWZpbmUgSVJRX0VSUk9SMiAgICAgIDB4MDAwMDAwMDQgIC8qIEVycm9yIEludGVycnVwdCAoQ0FOLCBFdGhlcm5ldCwgU1BPUlR4LCBQUEksIFNQSSwgVUFSVHgpICovCi0jZGVmaW5lIElSUV9SVEMJCQkweDAwMDAwMDA4CS8qIFJlYWwgVGltZSBDbG9jayBJbnRlcnJ1cHQgCQkJCQkJKi8KLSNkZWZpbmUgSVJRX0RNQTAJCTB4MDAwMDAwMTAJLyogRE1BIENoYW5uZWwgMCAoUFBJKSBJbnRlcnJ1cHQgCQkJCQkqLwotI2RlZmluZSBJUlFfRE1BMwkJMHgwMDAwMDAyMAkvKiBETUEgQ2hhbm5lbCAzIChTUE9SVDAgUlgpIEludGVycnVwdCAJCQkJKi8KLSNkZWZpbmUgSVJRX0RNQTQJCTB4MDAwMDAwNDAJLyogRE1BIENoYW5uZWwgNCAoU1BPUlQwIFRYKSBJbnRlcnJ1cHQgCQkJCSovCi0jZGVmaW5lIElSUV9ETUE1CQkweDAwMDAwMDgwCS8qIERNQSBDaGFubmVsIDUgKFNQT1JUMSBSWCkgSW50ZXJydXB0IAkJCQkqLwotCi0jZGVmaW5lIElSUV9ETUE2CQkweDAwMDAwMTAwCS8qIERNQSBDaGFubmVsIDYgKFNQT1JUMSBUWCkgSW50ZXJydXB0IAkJIAkJKi8KLSNkZWZpbmUgSVJRX1RXSQkJCTB4MDAwMDAyMDAJLyogVFdJIEludGVycnVwdAkJCQkJCQkJCSovCi0jZGVmaW5lIElSUV9ETUE3CQkweDAwMDAwNDAwCS8qIERNQSBDaGFubmVsIDcgKFNQSSkgSW50ZXJydXB0IAkJCQkJKi8KLSNkZWZpbmUgSVJRX0RNQTgJCTB4MDAwMDA4MDAJLyogRE1BIENoYW5uZWwgOCAoVUFSVDAgUlgpIEludGVycnVwdCAJCQkJKi8KLSNkZWZpbmUgSVJRX0RNQTkJCTB4MDAwMDEwMDAJLyogRE1BIENoYW5uZWwgOSAoVUFSVDAgVFgpIEludGVycnVwdCAJCQkJKi8KLSNkZWZpbmUgSVJRX0RNQTEwCQkweDAwMDAyMDAwCS8qIERNQSBDaGFubmVsIDEwIChVQVJUMSBSWCkgSW50ZXJydXB0IAkJCQkqLwotI2RlZmluZSBJUlFfRE1BMTEJCTB4MDAwMDQwMDAJLyogRE1BIENoYW5uZWwgMTEgKFVBUlQxIFRYKSBJbnRlcnJ1cHQgCQkJCSovCi0jZGVmaW5lIElSUV9DQU5fUlgJCTB4MDAwMDgwMDAJLyogQ0FOIFJlY2VpdmUgSW50ZXJydXB0IAkJCQkJCQkqLwotCi0jZGVmaW5lIElSUV9DQU5fVFgJCTB4MDAwMTAwMDAJLyogQ0FOIFRyYW5zbWl0IEludGVycnVwdCAgCQkJCQkJCSovCi0jZGVmaW5lIElSUV9ETUExCQkweDAwMDIwMDAwCS8qIERNQSBDaGFubmVsIDEgKEV0aGVybmV0IFJYKSBJbnRlcnJ1cHQgCQkJKi8KLSNkZWZpbmUgSVJRX1BGQV9QT1JUSAkweDAwMDIwMDAwCS8qIFBGIFBvcnQgSCAoUEY0NzozMikgSW50ZXJydXB0IEEgCQkJCQkqLwotI2RlZmluZSBJUlFfRE1BMgkJMHgwMDA0MDAwMAkvKiBETUEgQ2hhbm5lbCAyIChFdGhlcm5ldCBUWCkgSW50ZXJydXB0IAkJCSovCi0jZGVmaW5lIElSUV9QRkJfUE9SVEgJMHgwMDA0MDAwMAkvKiBQRiBQb3J0IEggKFBGNDc6MzIpIEludGVycnVwdCBCIAkJCQkJKi8KLSNkZWZpbmUgSVJRX1RJTUVSMAkJMHgwMDA4MDAwMAkvKiBUaW1lciAwIEludGVycnVwdAkJCQkJCQkJKi8KLSNkZWZpbmUgSVJRX1RJTUVSMQkJMHgwMDEwMDAwMAkvKiBUaW1lciAxIEludGVycnVwdCAJCQkJCQkJCSovCi0jZGVmaW5lIElSUV9USU1FUjIJCTB4MDAyMDAwMDAJLyogVGltZXIgMiBJbnRlcnJ1cHQgCQkJCQkJCQkqLwotI2RlZmluZSBJUlFfVElNRVIzCQkweDAwNDAwMDAwCS8qIFRpbWVyIDMgSW50ZXJydXB0IAkJCQkJCQkJKi8KLSNkZWZpbmUgSVJRX1RJTUVSNAkJMHgwMDgwMDAwMAkvKiBUaW1lciA0IEludGVycnVwdCAJCQkJCQkJCSovCi0KLSNkZWZpbmUgSVJRX1RJTUVSNQkJMHgwMTAwMDAwMAkvKiBUaW1lciA1IEludGVycnVwdCAJCQkJCQkJCSovCi0jZGVmaW5lIElSUV9USU1FUjYJCTB4MDIwMDAwMDAJLyogVGltZXIgNiBJbnRlcnJ1cHQgCQkJCQkJCQkqLwotI2RlZmluZSBJUlFfVElNRVI3CQkweDA0MDAwMDAwCS8qIFRpbWVyIDcgSW50ZXJydXB0IAkJCQkJCQkJKi8KLSNkZWZpbmUgSVJRX1BGQV9QT1JURkcJMHgwODAwMDAwMAkvKiBQRiBQb3J0cyBGJkcgKFBGMzE6MCkgSW50ZXJydXB0IEEgCQkJCSovCi0jZGVmaW5lIElSUV9QRkJfUE9SVEYJMHg4MDAwMDAwMAkvKiBQRiBQb3J0IEYgKFBGMTU6MCkgSW50ZXJydXB0IEIgCQkJCQkqLwotI2RlZmluZSBJUlFfRE1BMTIJCTB4MjAwMDAwMDAJLyogRE1BIENoYW5uZWxzIDEyIChNRE1BMSBTb3VyY2UpIFJYIEludGVycnVwdCAJCSovCi0jZGVmaW5lIElSUV9ETUExMwkJMHgyMDAwMDAwMAkvKiBETUEgQ2hhbm5lbHMgMTMgKE1ETUExIERlc3RpbmF0aW9uKSBUWCBJbnRlcnJ1cHQgKi8KLSNkZWZpbmUgSVJRX0RNQTE0CQkweDQwMDAwMDAwCS8qIERNQSBDaGFubmVscyAxNCAoTURNQTAgU291cmNlKSBSWCBJbnRlcnJ1cHQgCQkqLwotI2RlZmluZSBJUlFfRE1BMTUJCTB4NDAwMDAwMDAJLyogRE1BIENoYW5uZWxzIDE1IChNRE1BMCBEZXN0aW5hdGlvbikgVFggSW50ZXJydXB0ICovCi0jZGVmaW5lIElSUV9XRE9HCQkweDgwMDAwMDAwCS8qIFNvZnR3YXJlIFdhdGNoZG9nIFRpbWVyIEludGVycnVwdCAJCQkJKi8KLSNkZWZpbmUgSVJRX1BGQl9QT1JURwkweDEwMDAwMDAwCS8qIFBGIFBvcnQgRyAoUEYzMToxNikgSW50ZXJydXB0IEIgCQkJCQkqLwotI2VuZGlmCi0KLS8qIFNJQ19JQVIwIE1hY3JvcwkJCQkJCQkJCQkJCQkJCSovCi0jZGVmaW5lIFAwX0lWRyh4KQkJKCgoeCkmMHhGKS03KQkJCS8qIFBlcmlwaGVyYWwgIzAgYXNzaWduZWQgSVZHICN4IAkqLwotI2RlZmluZSBQMV9JVkcoeCkJCSgoKHgpJjB4RiktNykgPDwgMHg0CS8qIFBlcmlwaGVyYWwgIzEgYXNzaWduZWQgSVZHICN4IAkqLwotI2RlZmluZSBQMl9JVkcoeCkJCSgoKHgpJjB4RiktNykgPDwgMHg4CS8qIFBlcmlwaGVyYWwgIzIgYXNzaWduZWQgSVZHICN4IAkqLwotI2RlZmluZSBQM19JVkcoeCkJCSgoKHgpJjB4RiktNykgPDwgMHhDCS8qIFBlcmlwaGVyYWwgIzMgYXNzaWduZWQgSVZHICN4CSovCi0jZGVmaW5lIFA0X0lWRyh4KQkJKCgoeCkmMHhGKS03KSA8PCAweDEwCS8qIFBlcmlwaGVyYWwgIzQgYXNzaWduZWQgSVZHICN4CSovCi0jZGVmaW5lIFA1X0lWRyh4KQkJKCgoeCkmMHhGKS03KSA8PCAweDE0CS8qIFBlcmlwaGVyYWwgIzUgYXNzaWduZWQgSVZHICN4CSovCi0jZGVmaW5lIFA2X0lWRyh4KQkJKCgoeCkmMHhGKS03KSA8PCAweDE4CS8qIFBlcmlwaGVyYWwgIzYgYXNzaWduZWQgSVZHICN4CSovCi0jZGVmaW5lIFA3X0lWRyh4KQkJKCgoeCkmMHhGKS03KSA8PCAweDFDCS8qIFBlcmlwaGVyYWwgIzcgYXNzaWduZWQgSVZHICN4CSovCi0KLS8qIFNJQ19JQVIxIE1hY3JvcwkJCQkJCQkJCQkJCQkJCSovCi0jZGVmaW5lIFA4X0lWRyh4KQkJKCgoeCkmMHhGKS03KQkJCS8qIFBlcmlwaGVyYWwgIzggYXNzaWduZWQgSVZHICN4IAkqLwotI2RlZmluZSBQOV9JVkcoeCkJCSgoKHgpJjB4RiktNykgPDwgMHg0CS8qIFBlcmlwaGVyYWwgIzkgYXNzaWduZWQgSVZHICN4IAkqLwotI2RlZmluZSBQMTBfSVZHKHgpCQkoKCh4KSYweEYpLTcpIDw8IDB4OAkvKiBQZXJpcGhlcmFsICMxMCBhc3NpZ25lZCBJVkcgI3gJKi8KLSNkZWZpbmUgUDExX0lWRyh4KQkJKCgoeCkmMHhGKS03KSA8PCAweEMJLyogUGVyaXBoZXJhbCAjMTEgYXNzaWduZWQgSVZHICN4IAkqLwotI2RlZmluZSBQMTJfSVZHKHgpCQkoKCh4KSYweEYpLTcpIDw8IDB4MTAJLyogUGVyaXBoZXJhbCAjMTIgYXNzaWduZWQgSVZHICN4CSovCi0jZGVmaW5lIFAxM19JVkcoeCkJCSgoKHgpJjB4RiktNykgPDwgMHgxNAkvKiBQZXJpcGhlcmFsICMxMyBhc3NpZ25lZCBJVkcgI3gJKi8KLSNkZWZpbmUgUDE0X0lWRyh4KQkJKCgoeCkmMHhGKS03KSA8PCAweDE4CS8qIFBlcmlwaGVyYWwgIzE0IGFzc2lnbmVkIElWRyAjeAkqLwotI2RlZmluZSBQMTVfSVZHKHgpCQkoKCh4KSYweEYpLTcpIDw8IDB4MUMJLyogUGVyaXBoZXJhbCAjMTUgYXNzaWduZWQgSVZHICN4CSovCi0KLS8qIFNJQ19JQVIyIE1hY3JvcwkJCQkJCQkJCQkJCQkJCSovCi0jZGVmaW5lIFAxNl9JVkcoeCkJCSgoKHgpJjB4RiktNykJCQkvKiBQZXJpcGhlcmFsICMxNiBhc3NpZ25lZCBJVkcgI3gJKi8KLSNkZWZpbmUgUDE3X0lWRyh4KQkJKCgoeCkmMHhGKS03KSA8PCAweDQJLyogUGVyaXBoZXJhbCAjMTcgYXNzaWduZWQgSVZHICN4CSovCi0jZGVmaW5lIFAxOF9JVkcoeCkJCSgoKHgpJjB4RiktNykgPDwgMHg4CS8qIFBlcmlwaGVyYWwgIzE4IGFzc2lnbmVkIElWRyAjeAkqLwotI2RlZmluZSBQMTlfSVZHKHgpCQkoKCh4KSYweEYpLTcpIDw8IDB4QwkvKiBQZXJpcGhlcmFsICMxOSBhc3NpZ25lZCBJVkcgI3gJKi8KLSNkZWZpbmUgUDIwX0lWRyh4KQkJKCgoeCkmMHhGKS03KSA8PCAweDEwCS8qIFBlcmlwaGVyYWwgIzIwIGFzc2lnbmVkIElWRyAjeAkqLwotI2RlZmluZSBQMjFfSVZHKHgpCQkoKCh4KSYweEYpLTcpIDw8IDB4MTQJLyogUGVyaXBoZXJhbCAjMjEgYXNzaWduZWQgSVZHICN4CSovCi0jZGVmaW5lIFAyMl9JVkcoeCkJCSgoKHgpJjB4RiktNykgPDwgMHgxOAkvKiBQZXJpcGhlcmFsICMyMiBhc3NpZ25lZCBJVkcgI3gJKi8KLSNkZWZpbmUgUDIzX0lWRyh4KQkJKCgoeCkmMHhGKS03KSA8PCAweDFDCS8qIFBlcmlwaGVyYWwgIzIzIGFzc2lnbmVkIElWRyAjeAkqLwotCi0vKiBTSUNfSUFSMyBNYWNyb3MJCQkJCQkJCQkJCQkJCQkqLwotI2RlZmluZSBQMjRfSVZHKHgpCQkoKCh4KSYweEYpLTcpCQkJLyogUGVyaXBoZXJhbCAjMjQgYXNzaWduZWQgSVZHICN4CSovCi0jZGVmaW5lIFAyNV9JVkcoeCkJCSgoKHgpJjB4RiktNykgPDwgMHg0CS8qIFBlcmlwaGVyYWwgIzI1IGFzc2lnbmVkIElWRyAjeAkqLwotI2RlZmluZSBQMjZfSVZHKHgpCQkoKCh4KSYweEYpLTcpIDw8IDB4OAkvKiBQZXJpcGhlcmFsICMyNiBhc3NpZ25lZCBJVkcgI3gJKi8KLSNkZWZpbmUgUDI3X0lWRyh4KQkJKCgoeCkmMHhGKS03KSA8PCAweEMJLyogUGVyaXBoZXJhbCAjMjcgYXNzaWduZWQgSVZHICN4CSovCi0jZGVmaW5lIFAyOF9JVkcoeCkJCSgoKHgpJjB4RiktNykgPDwgMHgxMAkvKiBQZXJpcGhlcmFsICMyOCBhc3NpZ25lZCBJVkcgI3gJKi8KLSNkZWZpbmUgUDI5X0lWRyh4KQkJKCgoeCkmMHhGKS03KSA8PCAweDE0CS8qIFBlcmlwaGVyYWwgIzI5IGFzc2lnbmVkIElWRyAjeAkqLwotI2RlZmluZSBQMzBfSVZHKHgpCQkoKCh4KSYweEYpLTcpIDw8IDB4MTgJLyogUGVyaXBoZXJhbCAjMzAgYXNzaWduZWQgSVZHICN4CSovCi0jZGVmaW5lIFAzMV9JVkcoeCkJCSgoKHgpJjB4RiktNykgPDwgMHgxQwkvKiBQZXJpcGhlcmFsICMzMSBhc3NpZ25lZCBJVkcgI3gJKi8KLQotCi0vKiBTSUNfSU1BU0sgTWFza3MJCQkJCQkJCQkJCQkJCQkJCQkqLwotI2RlZmluZSBTSUNfVU5NQVNLX0FMTAkweDAwMDAwMDAwCQkJCQkvKiBVbm1hc2sgYWxsIHBlcmlwaGVyYWwgaW50ZXJydXB0cwkqLwotI2RlZmluZSBTSUNfTUFTS19BTEwJMHhGRkZGRkZGRgkJCQkJLyogTWFzayBhbGwgcGVyaXBoZXJhbCBpbnRlcnJ1cHRzCSovCi0jZGVmaW5lIFNJQ19NQVNLKHgpCQkoMSA8PCAoKHgpJjB4MUYpKQkJCQkJLyogTWFzayBQZXJpcGhlcmFsICN4IGludGVycnVwdAkJKi8KLSNkZWZpbmUgU0lDX1VOTUFTSyh4KQkoMHhGRkZGRkZGRiBeICgxIDw8ICgoeCkmMHgxRikpKQkvKiBVbm1hc2sgUGVyaXBoZXJhbCAjeCBpbnRlcnJ1cHQJKi8KLQotLyogU0lDX0lXUiBNYXNrcwkJCQkJCQkJCQkJCQkJCQkJCSovCi0jZGVmaW5lIElXUl9ESVNBQkxFX0FMTAkweDAwMDAwMDAwCQkJCQkvKiBXYWtldXAgRGlzYWJsZSBhbGwgcGVyaXBoZXJhbHMJKi8KLSNkZWZpbmUgSVdSX0VOQUJMRV9BTEwJMHhGRkZGRkZGRgkJCQkJLyogV2FrZXVwIEVuYWJsZSBhbGwgcGVyaXBoZXJhbHMJKi8KLSNkZWZpbmUgSVdSX0VOQUJMRSh4KQkoMSA8PCAoKHgpJjB4MUYpKQkJCQkJLyogV2FrZXVwIEVuYWJsZSBQZXJpcGhlcmFsICN4CQkqLwotI2RlZmluZSBJV1JfRElTQUJMRSh4KQkoMHhGRkZGRkZGRiBeICgxIDw8ICgoeCkmMHgxRikpKSAJLyogV2FrZXVwIERpc2FibGUgUGVyaXBoZXJhbCAjeAkJKi8KLQotCi0vKiAqKioqKioqKioqKioqKiBVQVJUIENPTlRST0xMRVIgTUFTS1MgKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIFVBUlR4X0xDUiBNYXNrcwkJCQkJCQkJCQkJCSovCi0jZGVmaW5lIFdMUyh4KQkJKCgoeCktNSkgJiAweDAzKQkvKiBXb3JkIExlbmd0aCBTZWxlY3QgKi8KLSNkZWZpbmUgU1RCCQkJMHgwNAkJCQkvKiBTdG9wIEJpdHMJCQkqLwotI2RlZmluZSBQRU4JCQkweDA4CQkJCS8qIFBhcml0eSBFbmFibGUJCSovCi0jZGVmaW5lIEVQUwkJCTB4MTAJCQkJLyogRXZlbiBQYXJpdHkgU2VsZWN0CSovCi0jZGVmaW5lIFNUUAkJCTB4MjAJCQkJLyogU3RpY2sgUGFyaXR5CQkJKi8KLSNkZWZpbmUgU0IJCQkweDQwCQkJCS8qIFNldCBCcmVhawkJCSovCi0jZGVmaW5lIERMQUIJCTB4ODAJCQkJLyogRGl2aXNvciBMYXRjaCBBY2Nlc3MJKi8KLQotLyogVUFSVHhfTUNSIE1hc2sJCQkJCQkJCQkJKi8KLSNkZWZpbmUgTE9PUF9FTkEJMHgxMAkvKiBMb29wYmFjayBNb2RlIEVuYWJsZSAqLwotI2RlZmluZSBMT09QX0VOQV9QCTB4MDQKLQotLyogVUFSVHhfTFNSIE1hc2tzCQkJCQkJCQkJCSovCi0jZGVmaW5lIERSCQkJMHgwMQkvKiBEYXRhIFJlYWR5CQkJCSovCi0jZGVmaW5lIE9FCQkJMHgwMgkvKiBPdmVycnVuIEVycm9yCQkJKi8KLSNkZWZpbmUgUEUJCQkweDA0CS8qIFBhcml0eSBFcnJvcgkJCQkqLwotI2RlZmluZSBGRQkJCTB4MDgJLyogRnJhbWluZyBFcnJvcgkJCSovCi0jZGVmaW5lIEJJCQkJMHgxMAkvKiBCcmVhayBJbnRlcnJ1cHQJCQkqLwotI2RlZmluZSBUSFJFCQkweDIwCS8qIFRIUiBFbXB0eQkJCQkqLwotI2RlZmluZSBURU1UCQkweDQwCS8qIFRTUiBhbmQgVUFSVF9USFIgRW1wdHkJKi8KLQotLyogVUFSVHhfSUVSIE1hc2tzCQkJCQkJCQkJCQkJCQkJKi8KLSNkZWZpbmUgRVJCRkkJCTB4MDEJCS8qIEVuYWJsZSBSZWNlaXZlIEJ1ZmZlciBGdWxsIEludGVycnVwdAkJKi8KLSNkZWZpbmUgRVRCRUkJCTB4MDIJCS8qIEVuYWJsZSBUcmFuc21pdCBCdWZmZXIgRW1wdHkgSW50ZXJydXB0CSovCi0jZGVmaW5lIEVMU0kJCTB4MDQJCS8qIEVuYWJsZSBSWCBTdGF0dXMgSW50ZXJydXB0CQkJCSovCi0KLS8qIFVBUlR4X0lJUiBNYXNrcwkJCQkJCQkJCQkJCQkJKi8KLSNkZWZpbmUgTklOVAkJMHgwMQkJLyogUGVuZGluZyBJbnRlcnJ1cHQJCQkJCSovCi0jZGVmaW5lIElJUl9UWF9SRUFEWSAgICAweDAyCQkvKiBVQVJUX1RIUiBlbXB0eSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBJSVJfUlhfUkVBRFkgICAgMHgwNAkJLyogUmVjZWl2ZSBkYXRhIHJlYWR5ICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgSUlSX0xJTkVfQ0hBTkdFIDB4MDYJCS8qIFJlY2VpdmUgbGluZSBzdGF0dXMgICAgCQkJKi8KLSNkZWZpbmUgSUlSX1NUQVRVUwkweDA2CQkvKiBIaWdoZXN0IFByaW9yaXR5IFBlbmRpbmcgSW50ZXJydXB0CSovCi0KLS8qIFVBUlR4X0dDVEwgTWFza3MJCQkJCQkJCQkJCQkJKi8KLSNkZWZpbmUgVUNFTgkJMHgwMQkJLyogRW5hYmxlIFVBUlR4IENsb2NrcwkJCQkqLwotI2RlZmluZSBJUkVOCQkweDAyCQkvKiBFbmFibGUgSXJEQSBNb2RlCQkJCQkqLwotI2RlZmluZSBUUE9MQwkJMHgwNAkJLyogSXJEQSBUWCBQb2xhcml0eSBDaGFuZ2UJCQkqLwotI2RlZmluZSBSUE9MQwkJMHgwOAkJLyogSXJEQSBSWCBQb2xhcml0eSBDaGFuZ2UJCQkqLwotI2RlZmluZSBGUEUJCQkweDEwCQkvKiBGb3JjZSBQYXJpdHkgRXJyb3IgT24gVHJhbnNtaXQJKi8KLSNkZWZpbmUgRkZFCQkJMHgyMAkJLyogRm9yY2UgRnJhbWluZyBFcnJvciBPbiBUcmFuc21pdAkqLwotCi0KLS8qICAqKioqKioqKioqKioqKioqICBHRU5FUkFMIFBVUlBPU0UgVElNRVIgTUFTS1MgICoqKioqKioqKioqKioqKioqKioqKiovCi0vKiBUSU1FUl9FTkFCTEUgTWFza3MJCQkJCQkJCQkJCQkJKi8KLSNkZWZpbmUgVElNRU4wCQkJMHgwMDAxCQkvKiBFbmFibGUgVGltZXIgMAkJCQkJKi8KLSNkZWZpbmUgVElNRU4xCQkJMHgwMDAyCQkvKiBFbmFibGUgVGltZXIgMQkJCQkJKi8KLSNkZWZpbmUgVElNRU4yCQkJMHgwMDA0CQkvKiBFbmFibGUgVGltZXIgMgkJCQkJKi8KLSNkZWZpbmUgVElNRU4zCQkJMHgwMDA4CQkvKiBFbmFibGUgVGltZXIgMwkJCQkJKi8KLSNkZWZpbmUgVElNRU40CQkJMHgwMDEwCQkvKiBFbmFibGUgVGltZXIgNAkJCQkJKi8KLSNkZWZpbmUgVElNRU41CQkJMHgwMDIwCQkvKiBFbmFibGUgVGltZXIgNQkJCQkJKi8KLSNkZWZpbmUgVElNRU42CQkJMHgwMDQwCQkvKiBFbmFibGUgVGltZXIgNgkJCQkJKi8KLSNkZWZpbmUgVElNRU43CQkJMHgwMDgwCQkvKiBFbmFibGUgVGltZXIgNwkJCQkJKi8KLQotLyogVElNRVJfRElTQUJMRSBNYXNrcwkJCQkJCQkJCQkJCQkqLwotI2RlZmluZSBUSU1ESVMwCQkJVElNRU4wCQkvKiBEaXNhYmxlIFRpbWVyIDAJCQkJCSovCi0jZGVmaW5lIFRJTURJUzEJCQlUSU1FTjEJCS8qIERpc2FibGUgVGltZXIgMQkJCQkJKi8KLSNkZWZpbmUgVElNRElTMgkJCVRJTUVOMgkJLyogRGlzYWJsZSBUaW1lciAyCQkJCQkqLwotI2RlZmluZSBUSU1ESVMzCQkJVElNRU4zCQkvKiBEaXNhYmxlIFRpbWVyIDMJCQkJCSovCi0jZGVmaW5lIFRJTURJUzQJCQlUSU1FTjQJCS8qIERpc2FibGUgVGltZXIgNAkJCQkJKi8KLSNkZWZpbmUgVElNRElTNQkJCVRJTUVONQkJLyogRGlzYWJsZSBUaW1lciA1CQkJCQkqLwotI2RlZmluZSBUSU1ESVM2CQkJVElNRU42CQkvKiBEaXNhYmxlIFRpbWVyIDYJCQkJCSovCi0jZGVmaW5lIFRJTURJUzcJCQlUSU1FTjcJCS8qIERpc2FibGUgVGltZXIgNwkJCQkJKi8KLQotLyogVElNRVJfU1RBVFVTIE1hc2tzCQkJCQkJCQkJCQkJCSovCi0jZGVmaW5lIFRJTUlMMAkJCTB4MDAwMDAwMDEJLyogVGltZXIgMCBJbnRlcnJ1cHQJCQkJKi8KLSNkZWZpbmUgVElNSUwxCQkJMHgwMDAwMDAwMgkvKiBUaW1lciAxIEludGVycnVwdAkJCQkqLwotI2RlZmluZSBUSU1JTDIJCQkweDAwMDAwMDA0CS8qIFRpbWVyIDIgSW50ZXJydXB0CQkJCSovCi0jZGVmaW5lIFRJTUlMMwkJCTB4MDAwMDAwMDgJLyogVGltZXIgMyBJbnRlcnJ1cHQJCQkJKi8KLSNkZWZpbmUgVE9WRl9FUlIwCQkweDAwMDAwMDEwCS8qIFRpbWVyIDAgQ291bnRlciBPdmVyZmxvdwkJCSovCi0jZGVmaW5lIFRPVkZfRVJSMQkJMHgwMDAwMDAyMAkvKiBUaW1lciAxIENvdW50ZXIgT3ZlcmZsb3cJCQkqLwotI2RlZmluZSBUT1ZGX0VSUjIJCTB4MDAwMDAwNDAJLyogVGltZXIgMiBDb3VudGVyIE92ZXJmbG93CQkJKi8KLSNkZWZpbmUgVE9WRl9FUlIzCQkweDAwMDAwMDgwCS8qIFRpbWVyIDMgQ291bnRlciBPdmVyZmxvdwkJCSovCi0jZGVmaW5lIFRSVU4wCQkJMHgwMDAwMTAwMAkvKiBUaW1lciAwIFNsYXZlIEVuYWJsZSBTdGF0dXMJCSovCi0jZGVmaW5lIFRSVU4xCQkJMHgwMDAwMjAwMAkvKiBUaW1lciAxIFNsYXZlIEVuYWJsZSBTdGF0dXMJCSovCi0jZGVmaW5lIFRSVU4yCQkJMHgwMDAwNDAwMAkvKiBUaW1lciAyIFNsYXZlIEVuYWJsZSBTdGF0dXMJCSovCi0jZGVmaW5lIFRSVU4zCQkJMHgwMDAwODAwMAkvKiBUaW1lciAzIFNsYXZlIEVuYWJsZSBTdGF0dXMJCSovCi0jZGVmaW5lIFRJTUlMNAkJCTB4MDAwMTAwMDAJLyogVGltZXIgNCBJbnRlcnJ1cHQJCQkJKi8KLSNkZWZpbmUgVElNSUw1CQkJMHgwMDAyMDAwMAkvKiBUaW1lciA1IEludGVycnVwdAkJCQkqLwotI2RlZmluZSBUSU1JTDYJCQkweDAwMDQwMDAwCS8qIFRpbWVyIDYgSW50ZXJydXB0CQkJCSovCi0jZGVmaW5lIFRJTUlMNwkJCTB4MDAwODAwMDAJLyogVGltZXIgNyBJbnRlcnJ1cHQJCQkJKi8KLSNkZWZpbmUgVE9WRl9FUlI0CQkweDAwMTAwMDAwCS8qIFRpbWVyIDQgQ291bnRlciBPdmVyZmxvdwkJCSovCi0jZGVmaW5lIFRPVkZfRVJSNQkJMHgwMDIwMDAwMAkvKiBUaW1lciA1IENvdW50ZXIgT3ZlcmZsb3cJCQkqLwotI2RlZmluZSBUT1ZGX0VSUjYJCTB4MDA0MDAwMDAJLyogVGltZXIgNiBDb3VudGVyIE92ZXJmbG93CQkJKi8KLSNkZWZpbmUgVE9WRl9FUlI3CQkweDAwODAwMDAwCS8qIFRpbWVyIDcgQ291bnRlciBPdmVyZmxvdwkJCSovCi0jZGVmaW5lIFRSVU40CQkJMHgxMDAwMDAwMAkvKiBUaW1lciA0IFNsYXZlIEVuYWJsZSBTdGF0dXMJCSovCi0jZGVmaW5lIFRSVU41CQkJMHgyMDAwMDAwMAkvKiBUaW1lciA1IFNsYXZlIEVuYWJsZSBTdGF0dXMJCSovCi0jZGVmaW5lIFRSVU42CQkJMHg0MDAwMDAwMAkvKiBUaW1lciA2IFNsYXZlIEVuYWJsZSBTdGF0dXMJCSovCi0jZGVmaW5lIFRSVU43CQkJMHg4MDAwMDAwMAkvKiBUaW1lciA3IFNsYXZlIEVuYWJsZSBTdGF0dXMJCSovCi0KLS8qIEFsdGVybmF0ZSBEZXByZWNhdGVkIE1hY3JvcyBQcm92aWRlZCBGb3IgQmFja3dhcmRzIENvZGUgQ29tcGF0aWJpbGl0eSAqLwotI2RlZmluZSBUT1ZMX0VSUjAgVE9WRl9FUlIwCi0jZGVmaW5lIFRPVkxfRVJSMSBUT1ZGX0VSUjEKLSNkZWZpbmUgVE9WTF9FUlIyIFRPVkZfRVJSMgotI2RlZmluZSBUT1ZMX0VSUjMgVE9WRl9FUlIzCi0jZGVmaW5lIFRPVkxfRVJSNCBUT1ZGX0VSUjQKLSNkZWZpbmUgVE9WTF9FUlI1IFRPVkZfRVJSNQotI2RlZmluZSBUT1ZMX0VSUjYgVE9WRl9FUlI2Ci0jZGVmaW5lIFRPVkxfRVJSNyBUT1ZGX0VSUjcKLQotLyogVElNRVJ4X0NPTkZJRyBNYXNrcwkJCQkJCQkJCQkJCQkqLwotI2RlZmluZSBQV01fT1VUCQkJMHgwMDAxCS8qIFB1bHNlLVdpZHRoIE1vZHVsYXRpb24gT3V0cHV0IE1vZGUJKi8KLSNkZWZpbmUgV0RUSF9DQVAJCTB4MDAwMgkvKiBXaWR0aCBDYXB0dXJlIElucHV0IE1vZGUJCQkJKi8KLSNkZWZpbmUgRVhUX0NMSwkJCTB4MDAwMwkvKiBFeHRlcm5hbCBDbG9jayBNb2RlCQkJCQkqLwotI2RlZmluZSBQVUxTRV9ISQkJMHgwMDA0CS8qIEFjdGlvbiBQdWxzZSAoUG9zaXRpdmUvTmVnYXRpdmUqKQkqLwotI2RlZmluZSBQRVJJT0RfQ05UCQkweDAwMDgJLyogUGVyaW9kIENvdW50CQkJCQkJCSovCi0jZGVmaW5lIElSUV9FTkEJCQkweDAwMTAJLyogSW50ZXJydXB0IFJlcXVlc3QgRW5hYmxlCQkJCSovCi0jZGVmaW5lIFRJTl9TRUwJCQkweDAwMjAJLyogVGltZXIgSW5wdXQgU2VsZWN0CQkJCQkqLwotI2RlZmluZSBPVVRfRElTCQkJMHgwMDQwCS8qIE91dHB1dCBQYWQgRGlzYWJsZQkJCQkJKi8KLSNkZWZpbmUgQ0xLX1NFTAkJCTB4MDA4MAkvKiBUaW1lciBDbG9jayBTZWxlY3QJCQkJCSovCi0jZGVmaW5lIFRPR0dMRV9ISQkJMHgwMTAwCS8qIFBXTV9PVVQgUFVMU0VfSEkgVG9nZ2xlIE1vZGUJCQkqLwotI2RlZmluZSBFTVVfUlVOCQkJMHgwMjAwCS8qIEVtdWxhdGlvbiBCZWhhdmlvciBTZWxlY3QJCQkqLwotI2RlZmluZSBFUlJfVFlQCQkJMHhDMDAwCS8qIEVycm9yIFR5cGUJCQkJCQkJKi8KLQotCi0vKiAqKioqKioqKioqKioqKioqKiogICBHUElPIFBPUlRTIEYsIEcsIEggTUFTS1MgICoqKioqKioqKioqKioqKioqKioqKioqLwotLyogIEdlbmVyYWwgUHVycG9zZSBJTyAoMHhGRkMwMDcwMCAtIDB4RkZDMDA3RkYpICBNYXNrcyAJCQkJKi8KLS8qIFBvcnQgRiBNYXNrcyAJCQkJCQkJCQkJCQkJCSovCi0jZGVmaW5lIFBGMAkJMHgwMDAxCi0jZGVmaW5lIFBGMQkJMHgwMDAyCi0jZGVmaW5lIFBGMgkJMHgwMDA0Ci0jZGVmaW5lIFBGMwkJMHgwMDA4Ci0jZGVmaW5lIFBGNAkJMHgwMDEwCi0jZGVmaW5lIFBGNQkJMHgwMDIwCi0jZGVmaW5lIFBGNgkJMHgwMDQwCi0jZGVmaW5lIFBGNwkJMHgwMDgwCi0jZGVmaW5lIFBGOAkJMHgwMTAwCi0jZGVmaW5lIFBGOQkJMHgwMjAwCi0jZGVmaW5lIFBGMTAJMHgwNDAwCi0jZGVmaW5lIFBGMTEJMHgwODAwCi0jZGVmaW5lIFBGMTIJMHgxMDAwCi0jZGVmaW5lIFBGMTMJMHgyMDAwCi0jZGVmaW5lIFBGMTQJMHg0MDAwCi0jZGVmaW5lIFBGMTUJMHg4MDAwCi0KLS8qIFBvcnQgRyBNYXNrcwkJCQkJCQkJCQkJCQkJCSovCi0jZGVmaW5lIFBHMAkJMHgwMDAxCi0jZGVmaW5lIFBHMQkJMHgwMDAyCi0jZGVmaW5lIFBHMgkJMHgwMDA0Ci0jZGVmaW5lIFBHMwkJMHgwMDA4Ci0jZGVmaW5lIFBHNAkJMHgwMDEwCi0jZGVmaW5lIFBHNQkJMHgwMDIwCi0jZGVmaW5lIFBHNgkJMHgwMDQwCi0jZGVmaW5lIFBHNwkJMHgwMDgwCi0jZGVmaW5lIFBHOAkJMHgwMTAwCi0jZGVmaW5lIFBHOQkJMHgwMjAwCi0jZGVmaW5lIFBHMTAJMHgwNDAwCi0jZGVmaW5lIFBHMTEJMHgwODAwCi0jZGVmaW5lIFBHMTIJMHgxMDAwCi0jZGVmaW5lIFBHMTMJMHgyMDAwCi0jZGVmaW5lIFBHMTQJMHg0MDAwCi0jZGVmaW5lIFBHMTUJMHg4MDAwCi0KLS8qIFBvcnQgSCBNYXNrcwkJCQkJCQkJCQkJCQkJCSovCi0jZGVmaW5lIFBIMAkJMHgwMDAxCi0jZGVmaW5lIFBIMQkJMHgwMDAyCi0jZGVmaW5lIFBIMgkJMHgwMDA0Ci0jZGVmaW5lIFBIMwkJMHgwMDA4Ci0jZGVmaW5lIFBINAkJMHgwMDEwCi0jZGVmaW5lIFBINQkJMHgwMDIwCi0jZGVmaW5lIFBINgkJMHgwMDQwCi0jZGVmaW5lIFBINwkJMHgwMDgwCi0KLS8qICoqKioqKioqKioqKioqKioqKioqKiAgQVNZTkNIUk9OT1VTIE1FTU9SWSBDT05UUk9MTEVSIE1BU0tTICAqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogRUJJVV9BTUdDVEwgTWFza3MJCQkJCQkJCQkJCQkJCQkJCSovCi0jZGVmaW5lIEFNQ0tFTgkJCTB4MDAwMQkJLyogRW5hYmxlIENMS09VVAkJCQkJCQkJCSovCi0jZGVmaW5lCUFNQkVOX05PTkUJCTB4MDAwMAkJLyogQWxsIEJhbmtzIERpc2FibGVkCQkJCQkJCQkqLwotI2RlZmluZSBBTUJFTl9CMAkJMHgwMDAyCQkvKiBFbmFibGUgQXN5bmMgTWVtb3J5IEJhbmsgMCBvbmx5CQkJCQkqLwotI2RlZmluZSBBTUJFTl9CMF9CMQkJMHgwMDA0CQkvKiBFbmFibGUgQXN5bmMgTWVtb3J5IEJhbmtzIDAgJiAxIG9ubHkJCQkJKi8KLSNkZWZpbmUgQU1CRU5fQjBfQjFfQjIJMHgwMDA2CQkvKiBFbmFibGUgQXN5bmMgTWVtb3J5IEJhbmtzIDAsIDEsIGFuZCAyCQkJKi8KLSNkZWZpbmUgQU1CRU5fQUxMCQkweDAwMDgJCS8qIEVuYWJsZSBBc3luYyBNZW1vcnkgQmFua3MgKGFsbCkgMCwgMSwgMiwgYW5kIDMJKi8KLQotLyogRUJJVV9BTUJDVEwwIE1hc2tzCQkJCQkJCQkJCQkJCQkJCQkqLwotI2RlZmluZSBCMFJEWUVOCQkJMHgwMDAwMDAwMSAgLyogQmFuayAwIChCMCkgUkRZIEVuYWJsZQkJCQkJCQkqLwotI2RlZmluZSBCMFJEWVBPTAkJMHgwMDAwMDAwMiAgLyogQjAgUkRZIEFjdGl2ZSBIaWdoCQkJCQkJCQkqLwotI2RlZmluZSBCMFRUXzEJCQkweDAwMDAwMDA0ICAvKiBCMCBUcmFuc2l0aW9uIFRpbWUgKFJlYWQgdG8gV3JpdGUpID0gMSBjeWNsZQkJKi8KLSNkZWZpbmUgQjBUVF8yCQkJMHgwMDAwMDAwOCAgLyogQjAgVHJhbnNpdGlvbiBUaW1lIChSZWFkIHRvIFdyaXRlKSA9IDIgY3ljbGVzCSovCi0jZGVmaW5lIEIwVFRfMwkJCTB4MDAwMDAwMEMgIC8qIEIwIFRyYW5zaXRpb24gVGltZSAoUmVhZCB0byBXcml0ZSkgPSAzIGN5Y2xlcwkqLwotI2RlZmluZSBCMFRUXzQJCQkweDAwMDAwMDAwICAvKiBCMCBUcmFuc2l0aW9uIFRpbWUgKFJlYWQgdG8gV3JpdGUpID0gNCBjeWNsZXMJKi8KLSNkZWZpbmUgQjBTVF8xCQkJMHgwMDAwMDAxMCAgLyogQjAgU2V0dXAgVGltZSAoQU9FIHRvIFJlYWQvV3JpdGUpID0gMSBjeWNsZQkJKi8KLSNkZWZpbmUgQjBTVF8yCQkJMHgwMDAwMDAyMCAgLyogQjAgU2V0dXAgVGltZSAoQU9FIHRvIFJlYWQvV3JpdGUpID0gMiBjeWNsZXMJCSovCi0jZGVmaW5lIEIwU1RfMwkJCTB4MDAwMDAwMzAgIC8qIEIwIFNldHVwIFRpbWUgKEFPRSB0byBSZWFkL1dyaXRlKSA9IDMgY3ljbGVzCQkqLwotI2RlZmluZSBCMFNUXzQJCQkweDAwMDAwMDAwICAvKiBCMCBTZXR1cCBUaW1lIChBT0UgdG8gUmVhZC9Xcml0ZSkgPSA0IGN5Y2xlcwkJKi8KLSNkZWZpbmUgQjBIVF8xCQkJMHgwMDAwMDA0MCAgLyogQjAgSG9sZCBUaW1lICh+UmVhZC9Xcml0ZSB0byB+QU9FKSA9IDEgY3ljbGUJCSovCi0jZGVmaW5lIEIwSFRfMgkJCTB4MDAwMDAwODAgIC8qIEIwIEhvbGQgVGltZSAoflJlYWQvV3JpdGUgdG8gfkFPRSkgPSAyIGN5Y2xlcwkqLwotI2RlZmluZSBCMEhUXzMJCQkweDAwMDAwMEMwICAvKiBCMCBIb2xkIFRpbWUgKH5SZWFkL1dyaXRlIHRvIH5BT0UpID0gMyBjeWNsZXMJKi8KLSNkZWZpbmUgQjBIVF8wCQkJMHgwMDAwMDAwMCAgLyogQjAgSG9sZCBUaW1lICh+UmVhZC9Xcml0ZSB0byB+QU9FKSA9IDAgY3ljbGVzCSovCi0jZGVmaW5lIEIwUkFUXzEJCQkweDAwMDAwMTAwICAvKiBCMCBSZWFkIEFjY2VzcyBUaW1lID0gMSBjeWNsZQkJCQkJKi8KLSNkZWZpbmUgQjBSQVRfMgkJCTB4MDAwMDAyMDAgIC8qIEIwIFJlYWQgQWNjZXNzIFRpbWUgPSAyIGN5Y2xlcwkJCQkJKi8KLSNkZWZpbmUgQjBSQVRfMwkJCTB4MDAwMDAzMDAgIC8qIEIwIFJlYWQgQWNjZXNzIFRpbWUgPSAzIGN5Y2xlcwkJCQkJKi8KLSNkZWZpbmUgQjBSQVRfNAkJCTB4MDAwMDA0MDAgIC8qIEIwIFJlYWQgQWNjZXNzIFRpbWUgPSA0IGN5Y2xlcwkJCQkJKi8KLSNkZWZpbmUgQjBSQVRfNQkJCTB4MDAwMDA1MDAgIC8qIEIwIFJlYWQgQWNjZXNzIFRpbWUgPSA1IGN5Y2xlcwkJCQkJKi8KLSNkZWZpbmUgQjBSQVRfNgkJCTB4MDAwMDA2MDAgIC8qIEIwIFJlYWQgQWNjZXNzIFRpbWUgPSA2IGN5Y2xlcwkJCQkJKi8KLSNkZWZpbmUgQjBSQVRfNwkJCTB4MDAwMDA3MDAgIC8qIEIwIFJlYWQgQWNjZXNzIFRpbWUgPSA3IGN5Y2xlcwkJCQkJKi8KLSNkZWZpbmUgQjBSQVRfOAkJCTB4MDAwMDA4MDAgIC8qIEIwIFJlYWQgQWNjZXNzIFRpbWUgPSA4IGN5Y2xlcwkJCQkJKi8KLSNkZWZpbmUgQjBSQVRfOQkJCTB4MDAwMDA5MDAgIC8qIEIwIFJlYWQgQWNjZXNzIFRpbWUgPSA5IGN5Y2xlcwkJCQkJKi8KLSNkZWZpbmUgQjBSQVRfMTAJCTB4MDAwMDBBMDAgIC8qIEIwIFJlYWQgQWNjZXNzIFRpbWUgPSAxMCBjeWNsZXMJCQkJCSovCi0jZGVmaW5lIEIwUkFUXzExCQkweDAwMDAwQjAwICAvKiBCMCBSZWFkIEFjY2VzcyBUaW1lID0gMTEgY3ljbGVzCQkJCQkqLwotI2RlZmluZSBCMFJBVF8xMgkJMHgwMDAwMEMwMCAgLyogQjAgUmVhZCBBY2Nlc3MgVGltZSA9IDEyIGN5Y2xlcwkJCQkJKi8KLSNkZWZpbmUgQjBSQVRfMTMJCTB4MDAwMDBEMDAgIC8qIEIwIFJlYWQgQWNjZXNzIFRpbWUgPSAxMyBjeWNsZXMJCQkJCSovCi0jZGVmaW5lIEIwUkFUXzE0CQkweDAwMDAwRTAwICAvKiBCMCBSZWFkIEFjY2VzcyBUaW1lID0gMTQgY3ljbGVzCQkJCQkqLwotI2RlZmluZSBCMFJBVF8xNQkJMHgwMDAwMEYwMCAgLyogQjAgUmVhZCBBY2Nlc3MgVGltZSA9IDE1IGN5Y2xlcwkJCQkJKi8KLSNkZWZpbmUgQjBXQVRfMQkJCTB4MDAwMDEwMDAgIC8qIEIwIFdyaXRlIEFjY2VzcyBUaW1lID0gMSBjeWNsZQkJCQkJKi8KLSNkZWZpbmUgQjBXQVRfMgkJCTB4MDAwMDIwMDAgIC8qIEIwIFdyaXRlIEFjY2VzcyBUaW1lID0gMiBjeWNsZXMJCQkJCSovCi0jZGVmaW5lIEIwV0FUXzMJCQkweDAwMDAzMDAwICAvKiBCMCBXcml0ZSBBY2Nlc3MgVGltZSA9IDMgY3ljbGVzCQkJCQkqLwotI2RlZmluZSBCMFdBVF80CQkJMHgwMDAwNDAwMCAgLyogQjAgV3JpdGUgQWNjZXNzIFRpbWUgPSA0IGN5Y2xlcwkJCQkJKi8KLSNkZWZpbmUgQjBXQVRfNQkJCTB4MDAwMDUwMDAgIC8qIEIwIFdyaXRlIEFjY2VzcyBUaW1lID0gNSBjeWNsZXMJCQkJCSovCi0jZGVmaW5lIEIwV0FUXzYJCQkweDAwMDA2MDAwICAvKiBCMCBXcml0ZSBBY2Nlc3MgVGltZSA9IDYgY3ljbGVzCQkJCQkqLwotI2RlZmluZSBCMFdBVF83CQkJMHgwMDAwNzAwMCAgLyogQjAgV3JpdGUgQWNjZXNzIFRpbWUgPSA3IGN5Y2xlcwkJCQkJKi8KLSNkZWZpbmUgQjBXQVRfOAkJCTB4MDAwMDgwMDAgIC8qIEIwIFdyaXRlIEFjY2VzcyBUaW1lID0gOCBjeWNsZXMJCQkJCSovCi0jZGVmaW5lIEIwV0FUXzkJCQkweDAwMDA5MDAwICAvKiBCMCBXcml0ZSBBY2Nlc3MgVGltZSA9IDkgY3ljbGVzCQkJCQkqLwotI2RlZmluZSBCMFdBVF8xMAkJMHgwMDAwQTAwMCAgLyogQjAgV3JpdGUgQWNjZXNzIFRpbWUgPSAxMCBjeWNsZXMJCQkJCSovCi0jZGVmaW5lIEIwV0FUXzExCQkweDAwMDBCMDAwICAvKiBCMCBXcml0ZSBBY2Nlc3MgVGltZSA9IDExIGN5Y2xlcwkJCQkJKi8KLSNkZWZpbmUgQjBXQVRfMTIJCTB4MDAwMEMwMDAgIC8qIEIwIFdyaXRlIEFjY2VzcyBUaW1lID0gMTIgY3ljbGVzCQkJCQkqLwotI2RlZmluZSBCMFdBVF8xMwkJMHgwMDAwRDAwMCAgLyogQjAgV3JpdGUgQWNjZXNzIFRpbWUgPSAxMyBjeWNsZXMJCQkJCSovCi0jZGVmaW5lIEIwV0FUXzE0CQkweDAwMDBFMDAwICAvKiBCMCBXcml0ZSBBY2Nlc3MgVGltZSA9IDE0IGN5Y2xlcwkJCQkJKi8KLSNkZWZpbmUgQjBXQVRfMTUJCTB4MDAwMEYwMDAgIC8qIEIwIFdyaXRlIEFjY2VzcyBUaW1lID0gMTUgY3ljbGVzCQkJCQkqLwotCi0jZGVmaW5lIEIxUkRZRU4JCQkweDAwMDEwMDAwICAvKiBCYW5rIDEgKEIxKSBSRFkgRW5hYmxlICAgICAgICAgICAgICAgICAgICAgICAJKi8KLSNkZWZpbmUgQjFSRFlQT0wJCTB4MDAwMjAwMDAgIC8qIEIxIFJEWSBBY3RpdmUgSGlnaCAgICAgICAgICAgICAgICAgICAgICAgICAgIAkqLwotI2RlZmluZSBCMVRUXzEJCQkweDAwMDQwMDAwICAvKiBCMSBUcmFuc2l0aW9uIFRpbWUgKFJlYWQgdG8gV3JpdGUpID0gMSBjeWNsZSAJKi8KLSNkZWZpbmUgQjFUVF8yCQkJMHgwMDA4MDAwMCAgLyogQjEgVHJhbnNpdGlvbiBUaW1lIChSZWFkIHRvIFdyaXRlKSA9IDIgY3ljbGVzCSovCi0jZGVmaW5lIEIxVFRfMwkJCTB4MDAwQzAwMDAgIC8qIEIxIFRyYW5zaXRpb24gVGltZSAoUmVhZCB0byBXcml0ZSkgPSAzIGN5Y2xlcwkqLwotI2RlZmluZSBCMVRUXzQJCQkweDAwMDAwMDAwICAvKiBCMSBUcmFuc2l0aW9uIFRpbWUgKFJlYWQgdG8gV3JpdGUpID0gNCBjeWNsZXMJKi8KLSNkZWZpbmUgQjFTVF8xCQkJMHgwMDEwMDAwMCAgLyogQjEgU2V0dXAgVGltZSAoQU9FIHRvIFJlYWQvV3JpdGUpID0gMSBjeWNsZSAgCSovCi0jZGVmaW5lIEIxU1RfMgkJCTB4MDAyMDAwMDAgIC8qIEIxIFNldHVwIFRpbWUgKEFPRSB0byBSZWFkL1dyaXRlKSA9IDIgY3ljbGVzIAkqLwotI2RlZmluZSBCMVNUXzMJCQkweDAwMzAwMDAwICAvKiBCMSBTZXR1cCBUaW1lIChBT0UgdG8gUmVhZC9Xcml0ZSkgPSAzIGN5Y2xlcyAJKi8KLSNkZWZpbmUgQjFTVF80CQkJMHgwMDAwMDAwMCAgLyogQjEgU2V0dXAgVGltZSAoQU9FIHRvIFJlYWQvV3JpdGUpID0gNCBjeWNsZXMgCSovCi0jZGVmaW5lIEIxSFRfMQkJCTB4MDA0MDAwMDAgIC8qIEIxIEhvbGQgVGltZSAoflJlYWQvV3JpdGUgdG8gfkFPRSkgPSAxIGN5Y2xlIAkqLwotI2RlZmluZSBCMUhUXzIJCQkweDAwODAwMDAwICAvKiBCMSBIb2xkIFRpbWUgKH5SZWFkL1dyaXRlIHRvIH5BT0UpID0gMiBjeWNsZXMJKi8KLSNkZWZpbmUgQjFIVF8zCQkJMHgwMEMwMDAwMCAgLyogQjEgSG9sZCBUaW1lICh+UmVhZC9Xcml0ZSB0byB+QU9FKSA9IDMgY3ljbGVzCSovCi0jZGVmaW5lIEIxSFRfMAkJCTB4MDAwMDAwMDAgIC8qIEIxIEhvbGQgVGltZSAoflJlYWQvV3JpdGUgdG8gfkFPRSkgPSAwIGN5Y2xlcwkqLwotI2RlZmluZSBCMVJBVF8xCQkJMHgwMTAwMDAwMCAgLyogQjEgUmVhZCBBY2Nlc3MgVGltZSA9IDEgY3ljbGUJCQkJCSovCi0jZGVmaW5lIEIxUkFUXzIJCQkweDAyMDAwMDAwICAvKiBCMSBSZWFkIEFjY2VzcyBUaW1lID0gMiBjeWNsZXMJCQkJCSovCi0jZGVmaW5lIEIxUkFUXzMJCQkweDAzMDAwMDAwICAvKiBCMSBSZWFkIEFjY2VzcyBUaW1lID0gMyBjeWNsZXMJCQkJCSovCi0jZGVmaW5lIEIxUkFUXzQJCQkweDA0MDAwMDAwICAvKiBCMSBSZWFkIEFjY2VzcyBUaW1lID0gNCBjeWNsZXMJCQkJCSovCi0jZGVmaW5lIEIxUkFUXzUJCQkweDA1MDAwMDAwICAvKiBCMSBSZWFkIEFjY2VzcyBUaW1lID0gNSBjeWNsZXMJCQkJCSovCi0jZGVmaW5lIEIxUkFUXzYJCQkweDA2MDAwMDAwICAvKiBCMSBSZWFkIEFjY2VzcyBUaW1lID0gNiBjeWNsZXMJCQkJCSovCi0jZGVmaW5lIEIxUkFUXzcJCQkweDA3MDAwMDAwICAvKiBCMSBSZWFkIEFjY2VzcyBUaW1lID0gNyBjeWNsZXMJCQkJCSovCi0jZGVmaW5lIEIxUkFUXzgJCQkweDA4MDAwMDAwICAvKiBCMSBSZWFkIEFjY2VzcyBUaW1lID0gOCBjeWNsZXMJCQkJCSovCi0jZGVmaW5lIEIxUkFUXzkJCQkweDA5MDAwMDAwICAvKiBCMSBSZWFkIEFjY2VzcyBUaW1lID0gOSBjeWNsZXMJCQkJCSovCi0jZGVmaW5lIEIxUkFUXzEwCQkweDBBMDAwMDAwICAvKiBCMSBSZWFkIEFjY2VzcyBUaW1lID0gMTAgY3ljbGVzCQkJCQkqLwotI2RlZmluZSBCMVJBVF8xMQkJMHgwQjAwMDAwMCAgLyogQjEgUmVhZCBBY2Nlc3MgVGltZSA9IDExIGN5Y2xlcwkJCQkJKi8KLSNkZWZpbmUgQjFSQVRfMTIJCTB4MEMwMDAwMDAgIC8qIEIxIFJlYWQgQWNjZXNzIFRpbWUgPSAxMiBjeWNsZXMJCQkJCSovCi0jZGVmaW5lIEIxUkFUXzEzCQkweDBEMDAwMDAwICAvKiBCMSBSZWFkIEFjY2VzcyBUaW1lID0gMTMgY3ljbGVzCQkJCQkqLwotI2RlZmluZSBCMVJBVF8xNAkJMHgwRTAwMDAwMCAgLyogQjEgUmVhZCBBY2Nlc3MgVGltZSA9IDE0IGN5Y2xlcwkJCQkJKi8KLSNkZWZpbmUgQjFSQVRfMTUJCTB4MEYwMDAwMDAgIC8qIEIxIFJlYWQgQWNjZXNzIFRpbWUgPSAxNSBjeWNsZXMJCQkJCSovCi0jZGVmaW5lIEIxV0FUXzEJCQkweDEwMDAwMDAwICAvKiBCMSBXcml0ZSBBY2Nlc3MgVGltZSA9IDEgY3ljbGUJCQkJCSovCi0jZGVmaW5lIEIxV0FUXzIJCQkweDIwMDAwMDAwICAvKiBCMSBXcml0ZSBBY2Nlc3MgVGltZSA9IDIgY3ljbGVzCQkJCQkqLwotI2RlZmluZSBCMVdBVF8zCQkJMHgzMDAwMDAwMCAgLyogQjEgV3JpdGUgQWNjZXNzIFRpbWUgPSAzIGN5Y2xlcwkJCQkJKi8KLSNkZWZpbmUgQjFXQVRfNAkJCTB4NDAwMDAwMDAgIC8qIEIxIFdyaXRlIEFjY2VzcyBUaW1lID0gNCBjeWNsZXMJCQkJCSovCi0jZGVmaW5lIEIxV0FUXzUJCQkweDUwMDAwMDAwICAvKiBCMSBXcml0ZSBBY2Nlc3MgVGltZSA9IDUgY3ljbGVzCQkJCQkqLwotI2RlZmluZSBCMVdBVF82CQkJMHg2MDAwMDAwMCAgLyogQjEgV3JpdGUgQWNjZXNzIFRpbWUgPSA2IGN5Y2xlcwkJCQkJKi8KLSNkZWZpbmUgQjFXQVRfNwkJCTB4NzAwMDAwMDAgIC8qIEIxIFdyaXRlIEFjY2VzcyBUaW1lID0gNyBjeWNsZXMJCQkJCSovCi0jZGVmaW5lIEIxV0FUXzgJCQkweDgwMDAwMDAwICAvKiBCMSBXcml0ZSBBY2Nlc3MgVGltZSA9IDggY3ljbGVzCQkJCQkqLwotI2RlZmluZSBCMVdBVF85CQkJMHg5MDAwMDAwMCAgLyogQjEgV3JpdGUgQWNjZXNzIFRpbWUgPSA5IGN5Y2xlcwkJCQkJKi8KLSNkZWZpbmUgQjFXQVRfMTAJCTB4QTAwMDAwMDAgIC8qIEIxIFdyaXRlIEFjY2VzcyBUaW1lID0gMTAgY3ljbGVzCQkJCQkqLwotI2RlZmluZSBCMVdBVF8xMQkJMHhCMDAwMDAwMCAgLyogQjEgV3JpdGUgQWNjZXNzIFRpbWUgPSAxMSBjeWNsZXMJCQkJCSovCi0jZGVmaW5lIEIxV0FUXzEyCQkweEMwMDAwMDAwICAvKiBCMSBXcml0ZSBBY2Nlc3MgVGltZSA9IDEyIGN5Y2xlcwkJCQkJKi8KLSNkZWZpbmUgQjFXQVRfMTMJCTB4RDAwMDAwMDAgIC8qIEIxIFdyaXRlIEFjY2VzcyBUaW1lID0gMTMgY3ljbGVzCQkJCQkqLwotI2RlZmluZSBCMVdBVF8xNAkJMHhFMDAwMDAwMCAgLyogQjEgV3JpdGUgQWNjZXNzIFRpbWUgPSAxNCBjeWNsZXMJCQkJCSovCi0jZGVmaW5lIEIxV0FUXzE1CQkweEYwMDAwMDAwICAvKiBCMSBXcml0ZSBBY2Nlc3MgVGltZSA9IDE1IGN5Y2xlcwkJCQkJKi8KLQotLyogRUJJVV9BTUJDVEwxIE1hc2tzCQkJCQkJCQkJCQkJCQkJCQkqLwotI2RlZmluZSBCMlJEWUVOCQkJMHgwMDAwMDAwMSAgLyogQmFuayAyIChCMikgUkRZIEVuYWJsZQkJCQkJCQkqLwotI2RlZmluZSBCMlJEWVBPTAkJMHgwMDAwMDAwMiAgLyogQjIgUkRZIEFjdGl2ZSBIaWdoCQkJCQkJCQkqLwotI2RlZmluZSBCMlRUXzEJCQkweDAwMDAwMDA0ICAvKiBCMiBUcmFuc2l0aW9uIFRpbWUgKFJlYWQgdG8gV3JpdGUpID0gMSBjeWNsZQkJKi8KLSNkZWZpbmUgQjJUVF8yCQkJMHgwMDAwMDAwOCAgLyogQjIgVHJhbnNpdGlvbiBUaW1lIChSZWFkIHRvIFdyaXRlKSA9IDIgY3ljbGVzCSovCi0jZGVmaW5lIEIyVFRfMwkJCTB4MDAwMDAwMEMgIC8qIEIyIFRyYW5zaXRpb24gVGltZSAoUmVhZCB0byBXcml0ZSkgPSAzIGN5Y2xlcwkqLwotI2RlZmluZSBCMlRUXzQJCQkweDAwMDAwMDAwICAvKiBCMiBUcmFuc2l0aW9uIFRpbWUgKFJlYWQgdG8gV3JpdGUpID0gNCBjeWNsZXMJKi8KLSNkZWZpbmUgQjJTVF8xCQkJMHgwMDAwMDAxMCAgLyogQjIgU2V0dXAgVGltZSAoQU9FIHRvIFJlYWQvV3JpdGUpID0gMSBjeWNsZQkJKi8KLSNkZWZpbmUgQjJTVF8yCQkJMHgwMDAwMDAyMCAgLyogQjIgU2V0dXAgVGltZSAoQU9FIHRvIFJlYWQvV3JpdGUpID0gMiBjeWNsZXMJCSovCi0jZGVmaW5lIEIyU1RfMwkJCTB4MDAwMDAwMzAgIC8qIEIyIFNldHVwIFRpbWUgKEFPRSB0byBSZWFkL1dyaXRlKSA9IDMgY3ljbGVzCQkqLwotI2RlZmluZSBCMlNUXzQJCQkweDAwMDAwMDAwICAvKiBCMiBTZXR1cCBUaW1lIChBT0UgdG8gUmVhZC9Xcml0ZSkgPSA0IGN5Y2xlcwkJKi8KLSNkZWZpbmUgQjJIVF8xCQkJMHgwMDAwMDA0MCAgLyogQjIgSG9sZCBUaW1lICh+UmVhZC9Xcml0ZSB0byB+QU9FKSA9IDEgY3ljbGUJCSovCi0jZGVmaW5lIEIySFRfMgkJCTB4MDAwMDAwODAgIC8qIEIyIEhvbGQgVGltZSAoflJlYWQvV3JpdGUgdG8gfkFPRSkgPSAyIGN5Y2xlcwkqLwotI2RlZmluZSBCMkhUXzMJCQkweDAwMDAwMEMwICAvKiBCMiBIb2xkIFRpbWUgKH5SZWFkL1dyaXRlIHRvIH5BT0UpID0gMyBjeWNsZXMJKi8KLSNkZWZpbmUgQjJIVF8wCQkJMHgwMDAwMDAwMCAgLyogQjIgSG9sZCBUaW1lICh+UmVhZC9Xcml0ZSB0byB+QU9FKSA9IDAgY3ljbGVzCSovCi0jZGVmaW5lIEIyUkFUXzEJCQkweDAwMDAwMTAwICAvKiBCMiBSZWFkIEFjY2VzcyBUaW1lID0gMSBjeWNsZQkJCQkJKi8KLSNkZWZpbmUgQjJSQVRfMgkJCTB4MDAwMDAyMDAgIC8qIEIyIFJlYWQgQWNjZXNzIFRpbWUgPSAyIGN5Y2xlcwkJCQkJKi8KLSNkZWZpbmUgQjJSQVRfMwkJCTB4MDAwMDAzMDAgIC8qIEIyIFJlYWQgQWNjZXNzIFRpbWUgPSAzIGN5Y2xlcwkJCQkJKi8KLSNkZWZpbmUgQjJSQVRfNAkJCTB4MDAwMDA0MDAgIC8qIEIyIFJlYWQgQWNjZXNzIFRpbWUgPSA0IGN5Y2xlcwkJCQkJKi8KLSNkZWZpbmUgQjJSQVRfNQkJCTB4MDAwMDA1MDAgIC8qIEIyIFJlYWQgQWNjZXNzIFRpbWUgPSA1IGN5Y2xlcwkJCQkJKi8KLSNkZWZpbmUgQjJSQVRfNgkJCTB4MDAwMDA2MDAgIC8qIEIyIFJlYWQgQWNjZXNzIFRpbWUgPSA2IGN5Y2xlcwkJCQkJKi8KLSNkZWZpbmUgQjJSQVRfNwkJCTB4MDAwMDA3MDAgIC8qIEIyIFJlYWQgQWNjZXNzIFRpbWUgPSA3IGN5Y2xlcwkJCQkJKi8KLSNkZWZpbmUgQjJSQVRfOAkJCTB4MDAwMDA4MDAgIC8qIEIyIFJlYWQgQWNjZXNzIFRpbWUgPSA4IGN5Y2xlcwkJCQkJKi8KLSNkZWZpbmUgQjJSQVRfOQkJCTB4MDAwMDA5MDAgIC8qIEIyIFJlYWQgQWNjZXNzIFRpbWUgPSA5IGN5Y2xlcwkJCQkJKi8KLSNkZWZpbmUgQjJSQVRfMTAJCTB4MDAwMDBBMDAgIC8qIEIyIFJlYWQgQWNjZXNzIFRpbWUgPSAxMCBjeWNsZXMJCQkJCSovCi0jZGVmaW5lIEIyUkFUXzExCQkweDAwMDAwQjAwICAvKiBCMiBSZWFkIEFjY2VzcyBUaW1lID0gMTEgY3ljbGVzCQkJCQkqLwotI2RlZmluZSBCMlJBVF8xMgkJMHgwMDAwMEMwMCAgLyogQjIgUmVhZCBBY2Nlc3MgVGltZSA9IDEyIGN5Y2xlcwkJCQkJKi8KLSNkZWZpbmUgQjJSQVRfMTMJCTB4MDAwMDBEMDAgIC8qIEIyIFJlYWQgQWNjZXNzIFRpbWUgPSAxMyBjeWNsZXMJCQkJCSovCi0jZGVmaW5lIEIyUkFUXzE0CQkweDAwMDAwRTAwICAvKiBCMiBSZWFkIEFjY2VzcyBUaW1lID0gMTQgY3ljbGVzCQkJCQkqLwotI2RlZmluZSBCMlJBVF8xNQkJMHgwMDAwMEYwMCAgLyogQjIgUmVhZCBBY2Nlc3MgVGltZSA9IDE1IGN5Y2xlcwkJCQkJKi8KLSNkZWZpbmUgQjJXQVRfMQkJCTB4MDAwMDEwMDAgIC8qIEIyIFdyaXRlIEFjY2VzcyBUaW1lID0gMSBjeWNsZQkJCQkJKi8KLSNkZWZpbmUgQjJXQVRfMgkJCTB4MDAwMDIwMDAgIC8qIEIyIFdyaXRlIEFjY2VzcyBUaW1lID0gMiBjeWNsZXMJCQkJCSovCi0jZGVmaW5lIEIyV0FUXzMJCQkweDAwMDAzMDAwICAvKiBCMiBXcml0ZSBBY2Nlc3MgVGltZSA9IDMgY3ljbGVzCQkJCQkqLwotI2RlZmluZSBCMldBVF80CQkJMHgwMDAwNDAwMCAgLyogQjIgV3JpdGUgQWNjZXNzIFRpbWUgPSA0IGN5Y2xlcwkJCQkJKi8KLSNkZWZpbmUgQjJXQVRfNQkJCTB4MDAwMDUwMDAgIC8qIEIyIFdyaXRlIEFjY2VzcyBUaW1lID0gNSBjeWNsZXMJCQkJCSovCi0jZGVmaW5lIEIyV0FUXzYJCQkweDAwMDA2MDAwICAvKiBCMiBXcml0ZSBBY2Nlc3MgVGltZSA9IDYgY3ljbGVzCQkJCQkqLwotI2RlZmluZSBCMldBVF83CQkJMHgwMDAwNzAwMCAgLyogQjIgV3JpdGUgQWNjZXNzIFRpbWUgPSA3IGN5Y2xlcwkJCQkJKi8KLSNkZWZpbmUgQjJXQVRfOAkJCTB4MDAwMDgwMDAgIC8qIEIyIFdyaXRlIEFjY2VzcyBUaW1lID0gOCBjeWNsZXMJCQkJCSovCi0jZGVmaW5lIEIyV0FUXzkJCQkweDAwMDA5MDAwICAvKiBCMiBXcml0ZSBBY2Nlc3MgVGltZSA9IDkgY3ljbGVzCQkJCQkqLwotI2RlZmluZSBCMldBVF8xMAkJMHgwMDAwQTAwMCAgLyogQjIgV3JpdGUgQWNjZXNzIFRpbWUgPSAxMCBjeWNsZXMJCQkJCSovCi0jZGVmaW5lIEIyV0FUXzExCQkweDAwMDBCMDAwICAvKiBCMiBXcml0ZSBBY2Nlc3MgVGltZSA9IDExIGN5Y2xlcwkJCQkJKi8KLSNkZWZpbmUgQjJXQVRfMTIJCTB4MDAwMEMwMDAgIC8qIEIyIFdyaXRlIEFjY2VzcyBUaW1lID0gMTIgY3ljbGVzCQkJCQkqLwotI2RlZmluZSBCMldBVF8xMwkJMHgwMDAwRDAwMCAgLyogQjIgV3JpdGUgQWNjZXNzIFRpbWUgPSAxMyBjeWNsZXMJCQkJCSovCi0jZGVmaW5lIEIyV0FUXzE0CQkweDAwMDBFMDAwICAvKiBCMiBXcml0ZSBBY2Nlc3MgVGltZSA9IDE0IGN5Y2xlcwkJCQkJKi8KLSNkZWZpbmUgQjJXQVRfMTUJCTB4MDAwMEYwMDAgIC8qIEIyIFdyaXRlIEFjY2VzcyBUaW1lID0gMTUgY3ljbGVzCQkJCQkqLwotCi0jZGVmaW5lIEIzUkRZRU4JCQkweDAwMDEwMDAwICAvKiBCYW5rIDMgKEIzKSBSRFkgRW5hYmxlCQkJCQkJCSovCi0jZGVmaW5lIEIzUkRZUE9MCQkweDAwMDIwMDAwICAvKiBCMyBSRFkgQWN0aXZlIEhpZ2gJCQkJCQkJCSovCi0jZGVmaW5lIEIzVFRfMQkJCTB4MDAwNDAwMDAgIC8qIEIzIFRyYW5zaXRpb24gVGltZSAoUmVhZCB0byBXcml0ZSkgPSAxIGN5Y2xlCQkqLwotI2RlZmluZSBCM1RUXzIJCQkweDAwMDgwMDAwICAvKiBCMyBUcmFuc2l0aW9uIFRpbWUgKFJlYWQgdG8gV3JpdGUpID0gMiBjeWNsZXMJKi8KLSNkZWZpbmUgQjNUVF8zCQkJMHgwMDBDMDAwMCAgLyogQjMgVHJhbnNpdGlvbiBUaW1lIChSZWFkIHRvIFdyaXRlKSA9IDMgY3ljbGVzCSovCi0jZGVmaW5lIEIzVFRfNAkJCTB4MDAwMDAwMDAgIC8qIEIzIFRyYW5zaXRpb24gVGltZSAoUmVhZCB0byBXcml0ZSkgPSA0IGN5Y2xlcwkqLwotI2RlZmluZSBCM1NUXzEJCQkweDAwMTAwMDAwICAvKiBCMyBTZXR1cCBUaW1lIChBT0UgdG8gUmVhZC9Xcml0ZSkgPSAxIGN5Y2xlCQkqLwotI2RlZmluZSBCM1NUXzIJCQkweDAwMjAwMDAwICAvKiBCMyBTZXR1cCBUaW1lIChBT0UgdG8gUmVhZC9Xcml0ZSkgPSAyIGN5Y2xlcwkJKi8KLSNkZWZpbmUgQjNTVF8zCQkJMHgwMDMwMDAwMCAgLyogQjMgU2V0dXAgVGltZSAoQU9FIHRvIFJlYWQvV3JpdGUpID0gMyBjeWNsZXMJCSovCi0jZGVmaW5lIEIzU1RfNAkJCTB4MDAwMDAwMDAgIC8qIEIzIFNldHVwIFRpbWUgKEFPRSB0byBSZWFkL1dyaXRlKSA9IDQgY3ljbGVzCQkqLwotI2RlZmluZSBCM0hUXzEJCQkweDAwNDAwMDAwICAvKiBCMyBIb2xkIFRpbWUgKH5SZWFkL1dyaXRlIHRvIH5BT0UpID0gMSBjeWNsZQkJKi8KLSNkZWZpbmUgQjNIVF8yCQkJMHgwMDgwMDAwMCAgLyogQjMgSG9sZCBUaW1lICh+UmVhZC9Xcml0ZSB0byB+QU9FKSA9IDIgY3ljbGVzCSovCi0jZGVmaW5lIEIzSFRfMwkJCTB4MDBDMDAwMDAgIC8qIEIzIEhvbGQgVGltZSAoflJlYWQvV3JpdGUgdG8gfkFPRSkgPSAzIGN5Y2xlcwkqLwotI2RlZmluZSBCM0hUXzAJCQkweDAwMDAwMDAwICAvKiBCMyBIb2xkIFRpbWUgKH5SZWFkL1dyaXRlIHRvIH5BT0UpID0gMCBjeWNsZXMJKi8KLSNkZWZpbmUgQjNSQVRfMQkJCTB4MDEwMDAwMDAgIC8qIEIzIFJlYWQgQWNjZXNzIFRpbWUgPSAxIGN5Y2xlCQkJCQkqLwotI2RlZmluZSBCM1JBVF8yCQkJMHgwMjAwMDAwMCAgLyogQjMgUmVhZCBBY2Nlc3MgVGltZSA9IDIgY3ljbGVzCQkJCQkqLwotI2RlZmluZSBCM1JBVF8zCQkJMHgwMzAwMDAwMCAgLyogQjMgUmVhZCBBY2Nlc3MgVGltZSA9IDMgY3ljbGVzCQkJCQkqLwotI2RlZmluZSBCM1JBVF80CQkJMHgwNDAwMDAwMCAgLyogQjMgUmVhZCBBY2Nlc3MgVGltZSA9IDQgY3ljbGVzCQkJCQkqLwotI2RlZmluZSBCM1JBVF81CQkJMHgwNTAwMDAwMCAgLyogQjMgUmVhZCBBY2Nlc3MgVGltZSA9IDUgY3ljbGVzCQkJCQkqLwotI2RlZmluZSBCM1JBVF82CQkJMHgwNjAwMDAwMCAgLyogQjMgUmVhZCBBY2Nlc3MgVGltZSA9IDYgY3ljbGVzCQkJCQkqLwotI2RlZmluZSBCM1JBVF83CQkJMHgwNzAwMDAwMCAgLyogQjMgUmVhZCBBY2Nlc3MgVGltZSA9IDcgY3ljbGVzCQkJCQkqLwotI2RlZmluZSBCM1JBVF84CQkJMHgwODAwMDAwMCAgLyogQjMgUmVhZCBBY2Nlc3MgVGltZSA9IDggY3ljbGVzCQkJCQkqLwotI2RlZmluZSBCM1JBVF85CQkJMHgwOTAwMDAwMCAgLyogQjMgUmVhZCBBY2Nlc3MgVGltZSA9IDkgY3ljbGVzCQkJCQkqLwotI2RlZmluZSBCM1JBVF8xMAkJMHgwQTAwMDAwMCAgLyogQjMgUmVhZCBBY2Nlc3MgVGltZSA9IDEwIGN5Y2xlcwkJCQkJKi8KLSNkZWZpbmUgQjNSQVRfMTEJCTB4MEIwMDAwMDAgIC8qIEIzIFJlYWQgQWNjZXNzIFRpbWUgPSAxMSBjeWNsZXMJCQkJCSovCi0jZGVmaW5lIEIzUkFUXzEyCQkweDBDMDAwMDAwICAvKiBCMyBSZWFkIEFjY2VzcyBUaW1lID0gMTIgY3ljbGVzCQkJCQkqLwotI2RlZmluZSBCM1JBVF8xMwkJMHgwRDAwMDAwMCAgLyogQjMgUmVhZCBBY2Nlc3MgVGltZSA9IDEzIGN5Y2xlcwkJCQkJKi8KLSNkZWZpbmUgQjNSQVRfMTQJCTB4MEUwMDAwMDAgIC8qIEIzIFJlYWQgQWNjZXNzIFRpbWUgPSAxNCBjeWNsZXMJCQkJCSovCi0jZGVmaW5lIEIzUkFUXzE1CQkweDBGMDAwMDAwICAvKiBCMyBSZWFkIEFjY2VzcyBUaW1lID0gMTUgY3ljbGVzCQkJCQkqLwotI2RlZmluZSBCM1dBVF8xCQkJMHgxMDAwMDAwMCAgLyogQjMgV3JpdGUgQWNjZXNzIFRpbWUgPSAxIGN5Y2xlCQkJCQkqLwotI2RlZmluZSBCM1dBVF8yCQkJMHgyMDAwMDAwMCAgLyogQjMgV3JpdGUgQWNjZXNzIFRpbWUgPSAyIGN5Y2xlcwkJCQkJKi8KLSNkZWZpbmUgQjNXQVRfMwkJCTB4MzAwMDAwMDAgIC8qIEIzIFdyaXRlIEFjY2VzcyBUaW1lID0gMyBjeWNsZXMJCQkJCSovCi0jZGVmaW5lIEIzV0FUXzQJCQkweDQwMDAwMDAwICAvKiBCMyBXcml0ZSBBY2Nlc3MgVGltZSA9IDQgY3ljbGVzCQkJCQkqLwotI2RlZmluZSBCM1dBVF81CQkJMHg1MDAwMDAwMCAgLyogQjMgV3JpdGUgQWNjZXNzIFRpbWUgPSA1IGN5Y2xlcwkJCQkJKi8KLSNkZWZpbmUgQjNXQVRfNgkJCTB4NjAwMDAwMDAgIC8qIEIzIFdyaXRlIEFjY2VzcyBUaW1lID0gNiBjeWNsZXMJCQkJCSovCi0jZGVmaW5lIEIzV0FUXzcJCQkweDcwMDAwMDAwICAvKiBCMyBXcml0ZSBBY2Nlc3MgVGltZSA9IDcgY3ljbGVzCQkJCQkqLwotI2RlZmluZSBCM1dBVF84CQkJMHg4MDAwMDAwMCAgLyogQjMgV3JpdGUgQWNjZXNzIFRpbWUgPSA4IGN5Y2xlcwkJCQkJKi8KLSNkZWZpbmUgQjNXQVRfOQkJCTB4OTAwMDAwMDAgIC8qIEIzIFdyaXRlIEFjY2VzcyBUaW1lID0gOSBjeWNsZXMJCQkJCSovCi0jZGVmaW5lIEIzV0FUXzEwCQkweEEwMDAwMDAwICAvKiBCMyBXcml0ZSBBY2Nlc3MgVGltZSA9IDEwIGN5Y2xlcwkJCQkJKi8KLSNkZWZpbmUgQjNXQVRfMTEJCTB4QjAwMDAwMDAgIC8qIEIzIFdyaXRlIEFjY2VzcyBUaW1lID0gMTEgY3ljbGVzCQkJCQkqLwotI2RlZmluZSBCM1dBVF8xMgkJMHhDMDAwMDAwMCAgLyogQjMgV3JpdGUgQWNjZXNzIFRpbWUgPSAxMiBjeWNsZXMJCQkJCSovCi0jZGVmaW5lIEIzV0FUXzEzCQkweEQwMDAwMDAwICAvKiBCMyBXcml0ZSBBY2Nlc3MgVGltZSA9IDEzIGN5Y2xlcwkJCQkJKi8KLSNkZWZpbmUgQjNXQVRfMTQJCTB4RTAwMDAwMDAgIC8qIEIzIFdyaXRlIEFjY2VzcyBUaW1lID0gMTQgY3ljbGVzCQkJCQkqLwotI2RlZmluZSBCM1dBVF8xNQkJMHhGMDAwMDAwMCAgLyogQjMgV3JpdGUgQWNjZXNzIFRpbWUgPSAxNSBjeWNsZXMJCQkJCSovCi0KLQotLyogKioqKioqKioqKioqKioqKioqKioqKiAgU0RSQU0gQ09OVFJPTExFUiBNQVNLUyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIEVCSVVfU0RHQ1RMIE1hc2tzCQkJCQkJCQkJCQkJCQkJCQkJCSovCi0jZGVmaW5lIFNDVExFCQkJMHgwMDAwMDAwMQkvKiBFbmFibGUgU0RSQU0gU2lnbmFscwkJCQkJCQkJCQkqLwotI2RlZmluZSBDTF8yCQkJMHgwMDAwMDAwOAkvKiBTRFJBTSBDQVMgTGF0ZW5jeSA9IDIgY3ljbGVzCQkJCQkJCQkqLwotI2RlZmluZSBDTF8zCQkJMHgwMDAwMDAwQwkvKiBTRFJBTSBDQVMgTGF0ZW5jeSA9IDMgY3ljbGVzCQkJCQkJCQkqLwotI2RlZmluZSBQQVNSX0FMTAkJMHgwMDAwMDAwMAkvKiBBbGwgNCBTRFJBTSBCYW5rcyBSZWZyZXNoZWQgSW4gU2VsZi1SZWZyZXNoCQkJCSovCi0jZGVmaW5lIFBBU1JfQjBfQjEJCTB4MDAwMDAwMTAJLyogU0RSQU0gQmFua3MgMCBhbmQgMSBBcmUgUmVmcmVzaGVkIEluIFNlbGYtUmVmcmVzaAkJKi8KLSNkZWZpbmUgUEFTUl9CMAkJCTB4MDAwMDAwMjAJLyogT25seSBTRFJBTSBCYW5rIDAgSXMgUmVmcmVzaGVkIEluIFNlbGYtUmVmcmVzaAkJCSovCi0jZGVmaW5lIFRSQVNfMQkJCTB4MDAwMDAwNDAJLyogU0RSQU0gdFJBUyA9IDEgY3ljbGUJCQkJCQkJCQkJKi8KLSNkZWZpbmUgVFJBU18yCQkJMHgwMDAwMDA4MAkvKiBTRFJBTSB0UkFTID0gMiBjeWNsZXMJCQkJCQkJCQkqLwotI2RlZmluZSBUUkFTXzMJCQkweDAwMDAwMEMwCS8qIFNEUkFNIHRSQVMgPSAzIGN5Y2xlcwkJCQkJCQkJCSovCi0jZGVmaW5lIFRSQVNfNAkJCTB4MDAwMDAxMDAJLyogU0RSQU0gdFJBUyA9IDQgY3ljbGVzCQkJCQkJCQkJKi8KLSNkZWZpbmUgVFJBU181CQkJMHgwMDAwMDE0MAkvKiBTRFJBTSB0UkFTID0gNSBjeWNsZXMJCQkJCQkJCQkqLwotI2RlZmluZSBUUkFTXzYJCQkweDAwMDAwMTgwCS8qIFNEUkFNIHRSQVMgPSA2IGN5Y2xlcwkJCQkJCQkJCSovCi0jZGVmaW5lIFRSQVNfNwkJCTB4MDAwMDAxQzAJLyogU0RSQU0gdFJBUyA9IDcgY3ljbGVzCQkJCQkJCQkJKi8KLSNkZWZpbmUgVFJBU184CQkJMHgwMDAwMDIwMAkvKiBTRFJBTSB0UkFTID0gOCBjeWNsZXMJCQkJCQkJCQkqLwotI2RlZmluZSBUUkFTXzkJCQkweDAwMDAwMjQwCS8qIFNEUkFNIHRSQVMgPSA5IGN5Y2xlcwkJCQkJCQkJCSovCi0jZGVmaW5lIFRSQVNfMTAJCQkweDAwMDAwMjgwCS8qIFNEUkFNIHRSQVMgPSAxMCBjeWNsZXMJCQkJCQkJCQkqLwotI2RlZmluZSBUUkFTXzExCQkJMHgwMDAwMDJDMAkvKiBTRFJBTSB0UkFTID0gMTEgY3ljbGVzCQkJCQkJCQkJKi8KLSNkZWZpbmUgVFJBU18xMgkJCTB4MDAwMDAzMDAJLyogU0RSQU0gdFJBUyA9IDEyIGN5Y2xlcwkJCQkJCQkJCSovCi0jZGVmaW5lIFRSQVNfMTMJCQkweDAwMDAwMzQwCS8qIFNEUkFNIHRSQVMgPSAxMyBjeWNsZXMJCQkJCQkJCQkqLwotI2RlZmluZSBUUkFTXzE0CQkJMHgwMDAwMDM4MAkvKiBTRFJBTSB0UkFTID0gMTQgY3ljbGVzCQkJCQkJCQkJKi8KLSNkZWZpbmUgVFJBU18xNQkJCTB4MDAwMDAzQzAJLyogU0RSQU0gdFJBUyA9IDE1IGN5Y2xlcwkJCQkJCQkJCSovCi0jZGVmaW5lIFRSUF8xCQkJMHgwMDAwMDgwMAkvKiBTRFJBTSB0UlAgPSAxIGN5Y2xlCQkJCQkJCQkJCSovCi0jZGVmaW5lIFRSUF8yCQkJMHgwMDAwMTAwMAkvKiBTRFJBTSB0UlAgPSAyIGN5Y2xlcwkJCQkJCQkJCQkqLwotI2RlZmluZSBUUlBfMwkJCTB4MDAwMDE4MDAJLyogU0RSQU0gdFJQID0gMyBjeWNsZXMJCQkJCQkJCQkJKi8KLSNkZWZpbmUgVFJQXzQJCQkweDAwMDAyMDAwCS8qIFNEUkFNIHRSUCA9IDQgY3ljbGVzCQkJCQkJCQkJCSovCi0jZGVmaW5lIFRSUF81CQkJMHgwMDAwMjgwMAkvKiBTRFJBTSB0UlAgPSA1IGN5Y2xlcwkJCQkJCQkJCQkqLwotI2RlZmluZSBUUlBfNgkJCTB4MDAwMDMwMDAJLyogU0RSQU0gdFJQID0gNiBjeWNsZXMJCQkJCQkJCQkJKi8KLSNkZWZpbmUgVFJQXzcJCQkweDAwMDAzODAwCS8qIFNEUkFNIHRSUCA9IDcgY3ljbGVzCQkJCQkJCQkJCSovCi0jZGVmaW5lIFRSQ0RfMQkJCTB4MDAwMDgwMDAJLyogU0RSQU0gdFJDRCA9IDEgY3ljbGUJCQkJCQkJCQkJKi8KLSNkZWZpbmUgVFJDRF8yCQkJMHgwMDAxMDAwMAkvKiBTRFJBTSB0UkNEID0gMiBjeWNsZXMJCQkJCQkJCQkqLwotI2RlZmluZSBUUkNEXzMJCQkweDAwMDE4MDAwCS8qIFNEUkFNIHRSQ0QgPSAzIGN5Y2xlcwkJCQkJCQkJCSovCi0jZGVmaW5lIFRSQ0RfNAkJCTB4MDAwMjAwMDAJLyogU0RSQU0gdFJDRCA9IDQgY3ljbGVzCQkJCQkJCQkJKi8KLSNkZWZpbmUgVFJDRF81CQkJMHgwMDAyODAwMAkvKiBTRFJBTSB0UkNEID0gNSBjeWNsZXMJCQkJCQkJCQkqLwotI2RlZmluZSBUUkNEXzYJCQkweDAwMDMwMDAwCS8qIFNEUkFNIHRSQ0QgPSA2IGN5Y2xlcwkJCQkJCQkJCSovCi0jZGVmaW5lIFRSQ0RfNwkJCTB4MDAwMzgwMDAJLyogU0RSQU0gdFJDRCA9IDcgY3ljbGVzCQkJCQkJCQkJKi8KLSNkZWZpbmUgVFdSXzEJCQkweDAwMDgwMDAwCS8qIFNEUkFNIHRXUiA9IDEgY3ljbGUJCQkJCQkJCQkJKi8KLSNkZWZpbmUgVFdSXzIJCQkweDAwMTAwMDAwCS8qIFNEUkFNIHRXUiA9IDIgY3ljbGVzCQkJCQkJCQkJCSovCi0jZGVmaW5lIFRXUl8zCQkJMHgwMDE4MDAwMAkvKiBTRFJBTSB0V1IgPSAzIGN5Y2xlcwkJCQkJCQkJCQkqLwotI2RlZmluZSBQVVBTRAkJCTB4MDAyMDAwMDAJLyogUG93ZXItVXAgU3RhcnQgRGVsYXkgKDE1IFNDTEsgQ3ljbGVzIERlbGF5KQkJCQkqLwotI2RlZmluZSBQU00JCQkJMHgwMDQwMDAwMAkvKiBQb3dlci1VcCBTZXF1ZW5jZSAoTW9kZSBSZWdpc3RlciBCZWZvcmUvQWZ0ZXIqIFJlZnJlc2gpCSovCi0jZGVmaW5lIFBTUwkJCQkweDAwODAwMDAwCS8qIEVuYWJsZSBQb3dlci1VcCBTZXF1ZW5jZSBvbiBOZXh0IFNEUkFNIEFjY2VzcwkJCSovCi0jZGVmaW5lIFNSRlMJCQkweDAxMDAwMDAwCS8qIEVuYWJsZSBTRFJBTSBTZWxmLVJlZnJlc2ggTW9kZQkJCQkJCQkqLwotI2RlZmluZSBFQlVGRQkJCTB4MDIwMDAwMDAJLyogRW5hYmxlIEV4dGVybmFsIEJ1ZmZlcmluZyBUaW1pbmcJCQkJCQkJKi8KLSNkZWZpbmUgRkJCUlcJCQkweDA0MDAwMDAwCS8qIEVuYWJsZSBGYXN0IEJhY2stVG8tQmFjayBSZWFkIFRvIFdyaXRlCQkJCQkqLwotI2RlZmluZSBFTVJFTgkJCTB4MTAwMDAwMDAJLyogRXh0ZW5kZWQgTW9kZSBSZWdpc3RlciBFbmFibGUJCQkJCQkJKi8KLSNkZWZpbmUgVENTUgkJCTB4MjAwMDAwMDAJLyogVGVtcC1Db21wZW5zYXRlZCBTZWxmLVJlZnJlc2ggVmFsdWUgKDg1LzQ1KiBEZWcgQykJCSovCi0jZGVmaW5lIENEREJHCQkJMHg0MDAwMDAwMAkvKiBUcmlzdGF0ZSBTRFJBTSBDb250cm9scyBEdXJpbmcgQnVzIEdyYW50CQkJCQkqLwotCi0vKiBFQklVX1NEQkNUTCBNYXNrcwkJCQkJCQkJCQkJCQkJCQkJCSovCi0jZGVmaW5lIEVCRQkJCQkweDAwMDEJCS8qIEVuYWJsZSBTRFJBTSBFeHRlcm5hbCBCYW5rCQkJCQkJCSovCi0jZGVmaW5lIEVCU1pfMTYJCQkweDAwMDAJCS8qIFNEUkFNIEV4dGVybmFsIEJhbmsgU2l6ZSA9IDE2TUIJKi8KLSNkZWZpbmUgRUJTWl8zMgkJCTB4MDAwMgkJLyogU0RSQU0gRXh0ZXJuYWwgQmFuayBTaXplID0gMzJNQgkqLwotI2RlZmluZSBFQlNaXzY0CQkJMHgwMDA0CQkvKiBTRFJBTSBFeHRlcm5hbCBCYW5rIFNpemUgPSA2NE1CCSovCi0jZGVmaW5lIEVCU1pfMTI4CQkweDAwMDYJCS8qIFNEUkFNIEV4dGVybmFsIEJhbmsgU2l6ZSA9IDEyOE1CCQkqLwotI2RlZmluZSBFQlNaXzI1NgkJMHgwMDA4CQkvKiBTRFJBTSBFeHRlcm5hbCBCYW5rIFNpemUgPSAyNTZNQiAJKi8KLSNkZWZpbmUgRUJTWl81MTIJCTB4MDAwQQkJLyogU0RSQU0gRXh0ZXJuYWwgQmFuayBTaXplID0gNTEyTUIJCSovCi0jZGVmaW5lIEVCQ0FXXzgJCQkweDAwMDAJCS8qIFNEUkFNIEV4dGVybmFsIEJhbmsgQ29sdW1uIEFkZHJlc3MgV2lkdGggPSA4IEJpdHMJKi8KLSNkZWZpbmUgRUJDQVdfOQkJCTB4MDAxMAkJLyogU0RSQU0gRXh0ZXJuYWwgQmFuayBDb2x1bW4gQWRkcmVzcyBXaWR0aCA9IDkgQml0cwkqLwotI2RlZmluZSBFQkNBV18xMAkJMHgwMDIwCQkvKiBTRFJBTSBFeHRlcm5hbCBCYW5rIENvbHVtbiBBZGRyZXNzIFdpZHRoID0gMTAgQml0cwkqLwotI2RlZmluZSBFQkNBV18xMQkJMHgwMDMwCQkvKiBTRFJBTSBFeHRlcm5hbCBCYW5rIENvbHVtbiBBZGRyZXNzIFdpZHRoID0gMTEgQml0cwkqLwotCi0vKiBFQklVX1NEU1RBVCBNYXNrcwkJCQkJCQkJCQkJCQkJKi8KLSNkZWZpbmUgU0RDSQkJCTB4MDAwMQkJLyogU0RSQU0gQ29udHJvbGxlciBJZGxlIAkJCQkqLwotI2RlZmluZSBTRFNSQQkJCTB4MDAwMgkJLyogU0RSQU0gU2VsZi1SZWZyZXNoIEFjdGl2ZQkJCSovCi0jZGVmaW5lIFNEUFVBCQkJMHgwMDA0CQkvKiBTRFJBTSBQb3dlci1VcCBBY3RpdmUgCQkJCSovCi0jZGVmaW5lIFNEUlMJCQkweDAwMDgJCS8qIFNEUkFNIFdpbGwgUG93ZXItVXAgT24gTmV4dCBBY2Nlc3MJKi8KLSNkZWZpbmUgU0RFQVNFCQkJMHgwMDEwCQkvKiBTRFJBTSBFQUIgU3RpY2t5IEVycm9yIFN0YXR1cwkJKi8KLSNkZWZpbmUgQkdTVEFUCQkJMHgwMDIwCQkvKiBCdXMgR3JhbnQgU3RhdHVzCQkJCQkJKi8KLQotCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKiAgRE1BIENPTlRST0xMRVIgTUFTS1MgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBETUF4X1BFUklQSEVSQUxfTUFQLCBNRE1BX3l5X1BFUklQSEVSQUxfTUFQIE1hc2tzCQkJCQkJCQkqLwotI2RlZmluZSBDVFlQRQkJCTB4MDA0MAkvKiBETUEgQ2hhbm5lbCBUeXBlIEluZGljYXRvciAoTWVtb3J5L1BlcmlwaGVyYWwqKQkqLwotI2RlZmluZSBQTUFQCQkJMHhGMDAwCS8qIFBlcmlwaGVyYWwgTWFwcGVkIFRvIFRoaXMgQ2hhbm5lbAkJCQkqLwotI2RlZmluZSBQTUFQX1BQSQkJMHgwMDAwCS8qIAkJUFBJIFBvcnQgRE1BCQkJCQkJCQkqLwotI2RlZmluZQlQTUFQX0VNQUNSWAkJMHgxMDAwCS8qIAkJRXRoZXJuZXQgUmVjZWl2ZSBETUEJCQkJCQkqLwotI2RlZmluZSBQTUFQX0VNQUNUWAkJMHgyMDAwCS8qIAkJRXRoZXJuZXQgVHJhbnNtaXQgRE1BCQkJCQkJKi8KLSNkZWZpbmUgUE1BUF9TUE9SVDBSWAkweDMwMDAJLyogCQlTUE9SVDAgUmVjZWl2ZSBETUEJCQkJCQkJKi8KLSNkZWZpbmUgUE1BUF9TUE9SVDBUWAkweDQwMDAJLyogCQlTUE9SVDAgVHJhbnNtaXQgRE1BCQkJCQkJCSovCi0jZGVmaW5lIFBNQVBfU1BPUlQxUlgJMHg1MDAwCS8qIAkJU1BPUlQxIFJlY2VpdmUgRE1BCQkJCQkJCSovCi0jZGVmaW5lIFBNQVBfU1BPUlQxVFgJMHg2MDAwCS8qIAkJU1BPUlQxIFRyYW5zbWl0IERNQQkJCQkJCQkqLwotI2RlZmluZSBQTUFQX1NQSQkJMHg3MDAwCS8qIAkJU1BJIFBvcnQgRE1BCQkJCQkJCQkqLwotI2RlZmluZSBQTUFQX1VBUlQwUlgJMHg4MDAwCS8qIAkJVUFSVDAgUG9ydCBSZWNlaXZlIERNQQkJCQkJCSovCi0jZGVmaW5lIFBNQVBfVUFSVDBUWAkweDkwMDAJLyogCQlVQVJUMCBQb3J0IFRyYW5zbWl0IERNQQkJCQkJCSovCi0jZGVmaW5lCVBNQVBfVUFSVDFSWAkweEEwMDAJLyogCQlVQVJUMSBQb3J0IFJlY2VpdmUgRE1BCQkJCQkJKi8KLSNkZWZpbmUJUE1BUF9VQVJUMVRYCTB4QjAwMAkvKiAJCVVBUlQxIFBvcnQgVHJhbnNtaXQgRE1BCQkJCQkJKi8KLQotLyogICoqKioqKioqKioqKiAgUEFSQUxMRUwgUEVSSVBIRVJBTCBJTlRFUkZBQ0UgKFBQSSkgTUFTS1MgKioqKioqKioqKioqKi8KLS8qICBQUElfQ09OVFJPTCBNYXNrcwkJCQkJCQkJCQkJCQkqLwotI2RlZmluZSBQT1JUX0VOCQkJMHgwMDAxCQkvKiBQUEkgUG9ydCBFbmFibGUJCQkJCSovCi0jZGVmaW5lIFBPUlRfRElSCQkweDAwMDIJCS8qIFBQSSBQb3J0IERpcmVjdGlvbgkJCQkqLwotI2RlZmluZSBYRlJfVFlQRQkJMHgwMDBDCQkvKiBQUEkgVHJhbnNmZXIgVHlwZQkJCQkqLwotI2RlZmluZSBQT1JUX0NGRwkJMHgwMDMwCQkvKiBQUEkgUG9ydCBDb25maWd1cmF0aW9uCQkJKi8KLSNkZWZpbmUgRkxEX1NFTAkJCTB4MDA0MAkJLyogUFBJIEFjdGl2ZSBGaWVsZCBTZWxlY3QJCQkqLwotI2RlZmluZSBQQUNLX0VOCQkJMHgwMDgwCQkvKiBQUEkgUGFja2luZyBNb2RlCQkJCQkqLwotI2RlZmluZSBETUEzMgkJCTB4MDEwMAkJLyogUFBJIDMyLWJpdCBETUEgRW5hYmxlCQkJKi8KLSNkZWZpbmUgU0tJUF9FTgkJCTB4MDIwMAkJLyogUFBJIFNraXAgRWxlbWVudCBFbmFibGUJCQkqLwotI2RlZmluZSBTS0lQX0VPCQkJMHgwNDAwCQkvKiBQUEkgU2tpcCBFdmVuL09kZCBFbGVtZW50cwkJKi8KLSNkZWZpbmUgRExFTl84CQkJMHgwMDAwCQkvKiBEYXRhIExlbmd0aCA9IDggQml0cwkJCQkqLwotI2RlZmluZSBETEVOXzEwCQkJMHgwODAwCQkvKiBEYXRhIExlbmd0aCA9IDEwIEJpdHMJCQkqLwotI2RlZmluZSBETEVOXzExCQkJMHgxMDAwCQkvKiBEYXRhIExlbmd0aCA9IDExIEJpdHMJCQkqLwotI2RlZmluZSBETEVOXzEyCQkJMHgxODAwCQkvKiBEYXRhIExlbmd0aCA9IDEyIEJpdHMJCQkqLwotI2RlZmluZSBETEVOXzEzCQkJMHgyMDAwCQkvKiBEYXRhIExlbmd0aCA9IDEzIEJpdHMJCQkqLwotI2RlZmluZSBETEVOXzE0CQkJMHgyODAwCQkvKiBEYXRhIExlbmd0aCA9IDE0IEJpdHMJCQkqLwotI2RlZmluZSBETEVOXzE1CQkJMHgzMDAwCQkvKiBEYXRhIExlbmd0aCA9IDE1IEJpdHMJCQkqLwotI2RlZmluZSBETEVOXzE2CQkJMHgzODAwCQkvKiBEYXRhIExlbmd0aCA9IDE2IEJpdHMJCQkqLwotI2RlZmluZSBETEVOR1RICQkJMHgzODAwCQkvKiBQUEkgRGF0YSBMZW5ndGggICovCi0jZGVmaW5lIFBPTEMJCQkweDQwMDAJCS8qIFBQSSBDbG9jayBQb2xhcml0eQkJCQkqLwotI2RlZmluZSBQT0xTCQkJMHg4MDAwCQkvKiBQUEkgRnJhbWUgU3luYyBQb2xhcml0eQkJCSovCi0KLS8qIFBQSV9TVEFUVVMgTWFza3MJCQkJCQkJCQkJCQkJCSovCi0jZGVmaW5lIEZMRAkJCQkweDA0MDAJCS8qIEZpZWxkIEluZGljYXRvcgkJCQkJKi8KLSNkZWZpbmUgRlRfRVJSCQkJMHgwODAwCQkvKiBGcmFtZSBUcmFjayBFcnJvcgkJCQkqLwotI2RlZmluZSBPVlIJCQkJMHgxMDAwCQkvKiBGSUZPIE92ZXJmbG93IEVycm9yCQkJCSovCi0jZGVmaW5lIFVORFIJCQkweDIwMDAJCS8qIEZJRk8gVW5kZXJydW4gRXJyb3IJCQkJKi8KLSNkZWZpbmUgRVJSX0RFVAkJCTB4NDAwMAkJLyogRXJyb3IgRGV0ZWN0ZWQgSW5kaWNhdG9yCQkJKi8KLSNkZWZpbmUgRVJSX05DT1IJCTB4ODAwMAkJLyogRXJyb3IgTm90IENvcnJlY3RlZCBJbmRpY2F0b3IJKi8KLQotCi0vKiAgKioqKioqKioqKioqKioqKioqKiogIFRXTy1XSVJFIElOVEVSRkFDRSAoVFdJKSBNQVNLUyAgKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBUV0lfQ0xLRElWIE1hY3JvcyAoVXNlOiAqcFRXSV9DTEtESVYgPSBDTEtMT1coeCl8Q0xLSEkoeSk7ICApCQkJCSovCi0jZGVmaW5lCUNMS0xPVyh4KQkoKHgpICYgMHhGRikJCS8qIFBlcmlvZHMgQ2xvY2sgSXMgSGVsZCBMb3cJCQkqLwotI2RlZmluZSBDTEtISSh5KQkoKCh5KSYweEZGKTw8MHg4KQkvKiBQZXJpb2RzIEJlZm9yZSBOZXcgQ2xvY2sgTG93CQkJKi8KLQotLyogVFdJX1BSRVNDQUxFIE1hc2tzCQkJCQkJCQkJCQkJCQkJKi8KLSNkZWZpbmUJUFJFU0NBTEUJMHgwMDdGCQkvKiBTQ0xLcyBQZXIgSW50ZXJuYWwgVGltZSBSZWZlcmVuY2UgKDEwTUh6KQkqLwotI2RlZmluZQlUV0lfRU5BCQkweDAwODAJCS8qIFRXSSBFbmFibGUJCQkJCQkJCQkqLwotI2RlZmluZQlTQ0NCCQkweDAyMDAJCS8qIFNDQ0IgQ29tcGF0aWJpbGl0eSBFbmFibGUJCQkJCSovCi0KLS8qIFRXSV9TTEFWRV9DVEwgTWFza3MJCQkJCQkJCQkJCQkJCQkqLwotI2RlZmluZQlTRU4JCQkweDAwMDEJCS8qIFNsYXZlIEVuYWJsZQkJCQkJCQkJCSovCi0jZGVmaW5lCVNBRERfTEVOCTB4MDAwMgkJLyogU2xhdmUgQWRkcmVzcyBMZW5ndGgJCQkJCQkJKi8KLSNkZWZpbmUJU1REVkFMCQkweDAwMDQJCS8qIFNsYXZlIFRyYW5zbWl0IERhdGEgVmFsaWQJCQkJCSovCi0jZGVmaW5lCU5BSwkJCTB4MDAwOAkJLyogTkFLL0FDSyogR2VuZXJhdGVkIEF0IENvbmNsdXNpb24gT2YgVHJhbnNmZXIgKi8KLSNkZWZpbmUJR0VOCQkJMHgwMDEwCQkvKiBHZW5lcmFsIENhbGwgQWRycmVzcyBNYXRjaGluZyBFbmFibGVkCQkqLwotCi0vKiBUV0lfU0xBVkVfU1RBVCBNYXNrcwkJCQkJCQkJCQkJCQkJCSovCi0jZGVmaW5lCVNESVIJCTB4MDAwMQkJLyogU2xhdmUgVHJhbnNmZXIgRGlyZWN0aW9uIChUcmFuc21pdC9SZWNlaXZlKikJKi8KLSNkZWZpbmUgR0NBTEwJCTB4MDAwMgkJLyogR2VuZXJhbCBDYWxsIEluZGljYXRvcgkJCQkJCSovCi0KLS8qIFRXSV9NQVNURVJfQ1RMIE1hc2tzCQkJCQkJCQkJCQkJCSovCi0jZGVmaW5lCU1FTgkJCTB4MDAwMQkJLyogTWFzdGVyIE1vZGUgRW5hYmxlCQkJCQkJKi8KLSNkZWZpbmUJTUFERF9MRU4JMHgwMDAyCQkvKiBNYXN0ZXIgQWRkcmVzcyBMZW5ndGgJCQkJCSovCi0jZGVmaW5lCU1ESVIJCTB4MDAwNAkJLyogTWFzdGVyIFRyYW5zbWl0IERpcmVjdGlvbiAoUlgvVFgqKQkJKi8KLSNkZWZpbmUJRkFTVAkJMHgwMDA4CQkvKiBVc2UgRmFzdCBNb2RlIFRpbWluZyBTcGVjcwkJCQkqLwotI2RlZmluZQlTVE9QCQkweDAwMTAJCS8qIElzc3VlIFN0b3AgQ29uZGl0aW9uCQkJCQkJKi8KLSNkZWZpbmUJUlNUQVJUCQkweDAwMjAJCS8qIFJlcGVhdCBTdGFydCBvciBTdG9wKiBBdCBFbmQgT2YgVHJhbnNmZXIJKi8KLSNkZWZpbmUJRENOVAkJMHgzRkMwCQkvKiBEYXRhIEJ5dGVzIFRvIFRyYW5zZmVyCQkJCQkqLwotI2RlZmluZQlTREFPVlIJCTB4NDAwMAkJLyogU2VyaWFsIERhdGEgT3ZlcnJpZGUJCQkJCQkqLwotI2RlZmluZQlTQ0xPVlIJCTB4ODAwMAkJLyogU2VyaWFsIENsb2NrIE92ZXJyaWRlCQkJCQkqLwotCi0vKiBUV0lfTUFTVEVSX1NUQVQgTWFza3MJCQkJCQkJCQkJCQkJCSovCi0jZGVmaW5lCU1QUk9HCQkweDAwMDEJCS8qIE1hc3RlciBUcmFuc2ZlciBJbiBQcm9ncmVzcwkJCQkJKi8KLSNkZWZpbmUJTE9TVEFSQgkJMHgwMDAyCQkvKiBMb3N0IEFyYml0cmF0aW9uIEluZGljYXRvciAoWGZlciBBYm9ydGVkKQkqLwotI2RlZmluZQlBTkFLCQkweDAwMDQJCS8qIEFkZHJlc3MgTm90IEFja25vd2xlZGdlZAkJCQkJCSovCi0jZGVmaW5lCUROQUsJCTB4MDAwOAkJLyogRGF0YSBOb3QgQWNrbm93bGVkZ2VkCQkJCQkJKi8KLSNkZWZpbmUJQlVGUkRFUlIJMHgwMDEwCQkvKiBCdWZmZXIgUmVhZCBFcnJvcgkJCQkJCQkqLwotI2RlZmluZQlCVUZXUkVSUgkweDAwMjAJCS8qIEJ1ZmZlciBXcml0ZSBFcnJvcgkJCQkJCQkqLwotI2RlZmluZQlTREFTRU4JCTB4MDA0MAkJLyogU2VyaWFsIERhdGEgU2Vuc2UJCQkJCQkJKi8KLSNkZWZpbmUJU0NMU0VOCQkweDAwODAJCS8qIFNlcmlhbCBDbG9jayBTZW5zZQkJCQkJCQkqLwotI2RlZmluZQlCVVNCVVNZCQkweDAxMDAJCS8qIEJ1cyBCdXN5IEluZGljYXRvcgkJCQkJCQkqLwotCi0vKiBUV0lfSU5UX1NSQyBhbmQgVFdJX0lOVF9FTkFCTEUgTWFza3MJCQkJCQkqLwotI2RlZmluZQlTSU5JVAkJMHgwMDAxCQkvKiBTbGF2ZSBUcmFuc2ZlciBJbml0aWF0ZWQJKi8KLSNkZWZpbmUJU0NPTVAJCTB4MDAwMgkJLyogU2xhdmUgVHJhbnNmZXIgQ29tcGxldGUJKi8KLSNkZWZpbmUJU0VSUgkJMHgwMDA0CQkvKiBTbGF2ZSBUcmFuc2ZlciBFcnJvcgkJKi8KLSNkZWZpbmUJU09WRgkJMHgwMDA4CQkvKiBTbGF2ZSBPdmVyZmxvdwkJCSovCi0jZGVmaW5lCU1DT01QCQkweDAwMTAJCS8qIE1hc3RlciBUcmFuc2ZlciBDb21wbGV0ZQkqLwotI2RlZmluZQlNRVJSCQkweDAwMjAJCS8qIE1hc3RlciBUcmFuc2ZlciBFcnJvcgkqLwotI2RlZmluZQlYTVRTRVJWCQkweDAwNDAJCS8qIFRyYW5zbWl0IEZJRk8gU2VydmljZQkqLwotI2RlZmluZQlSQ1ZTRVJWCQkweDAwODAJCS8qIFJlY2VpdmUgRklGTyBTZXJ2aWNlCQkqLwotCi0vKiBUV0lfRklGT19DVFJMIE1hc2tzCQkJCQkJCQkJCQkJKi8KLSNkZWZpbmUJWE1URkxVU0gJMHgwMDAxCQkvKiBUcmFuc21pdCBCdWZmZXIgRmx1c2gJCQkqLwotI2RlZmluZQlSQ1ZGTFVTSAkweDAwMDIJCS8qIFJlY2VpdmUgQnVmZmVyIEZsdXNoCQkJCSovCi0jZGVmaW5lCVhNVElOVExFTgkweDAwMDQJCS8qIFRyYW5zbWl0IEJ1ZmZlciBJbnRlcnJ1cHQgTGVuZ3RoCSovCi0jZGVmaW5lCVJDVklOVExFTgkweDAwMDgJCS8qIFJlY2VpdmUgQnVmZmVyIEludGVycnVwdCBMZW5ndGgJKi8KLQotLyogVFdJX0ZJRk9fU1RBVCBNYXNrcwkJCQkJCQkJCQkJCQkJCSovCi0jZGVmaW5lCVhNVFNUQVQJCTB4MDAwMwkJLyogVHJhbnNtaXQgRklGTyBTdGF0dXMJCQkJCQkJKi8KLSNkZWZpbmUJWE1UX0VNUFRZCTB4MDAwMAkJLyogCQlUcmFuc21pdCBGSUZPIEVtcHR5CQkJCQkJKi8KLSNkZWZpbmUJWE1UX0hBTEYJMHgwMDAxCQkvKiAJCVRyYW5zbWl0IEZJRk8gSGFzIDEgQnl0ZSBUbyBXcml0ZQkJKi8KLSNkZWZpbmUJWE1UX0ZVTEwJMHgwMDAzCQkvKiAJCVRyYW5zbWl0IEZJRk8gRnVsbCAoMiBCeXRlcyBUbyBXcml0ZSkJKi8KLQotI2RlZmluZQlSQ1ZTVEFUCQkweDAwMEMJCS8qIFJlY2VpdmUgRklGTyBTdGF0dXMJCQkJCQkJKi8KLSNkZWZpbmUJUkNWX0VNUFRZCTB4MDAwMAkJLyogCQlSZWNlaXZlIEZJRk8gRW1wdHkJCQkJCQkqLwotI2RlZmluZQlSQ1ZfSEFMRgkweDAwMDQJCS8qIAkJUmVjZWl2ZSBGSUZPIEhhcyAxIEJ5dGUgVG8gUmVhZAkJCSovCi0jZGVmaW5lCVJDVl9GVUxMCTB4MDAwQwkJLyogCQlSZWNlaXZlIEZJRk8gRnVsbCAoMiBCeXRlcyBUbyBSZWFkKQkJKi8KLQotCi0vKiAgKioqKioqKioqKioqKioqKioqKiAgUElOIENPTlRST0wgUkVHSVNURVIgTUFTS1MgICoqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIFBPUlRfTVVYIE1hc2tzCQkJCQkJCQkJCQkJCQkJKi8KLSNkZWZpbmUJUEpTRQkJCTB4MDAwMQkJCS8qIFBvcnQgSiBTUEkvU1BPUlQgRW5hYmxlCQkJKi8KLSNkZWZpbmUJUEpTRV9TUE9SVAkJMHgwMDAwCQkJLyogCQlFbmFibGUgVEZTMC9EVDBQUkkJCQkqLwotI2RlZmluZQlQSlNFX1NQSQkJMHgwMDAxCQkJLyogCQlFbmFibGUgU1BJX1NTRUwzOjIJCQkqLwotCi0jZGVmaW5lCVBKQ0UoeCkJCQkoKCh4KSYweDMpPDwxKQkvKiBQb3J0IEogQ0FOL1NQSS9TUE9SVCBFbmFibGUJCSovCi0jZGVmaW5lCVBKQ0VfU1BPUlQJCTB4MDAwMAkJCS8qIAkJRW5hYmxlIERSMFNFQy9EVDBTRUMJCSovCi0jZGVmaW5lCVBKQ0VfQ0FOCQkweDAwMDIJCQkvKiAJCUVuYWJsZSBDQU4gUlgvVFgJCQkqLwotI2RlZmluZQlQSkNFX1NQSQkJMHgwMDA0CQkJLyogCQlFbmFibGUgU1BJX1NTRUw3CQkJKi8KLQotI2RlZmluZQlQRkRFCQkJMHgwMDA4CQkJLyogUG9ydCBGIERNQSBSZXF1ZXN0IEVuYWJsZQkJKi8KLSNkZWZpbmUJUEZERV9VQVJUCQkweDAwMDAJCQkvKiAJCUVuYWJsZSBVQVJUMCBSWC9UWAkJCSovCi0jZGVmaW5lCVBGREVfRE1BCQkweDAwMDgJCQkvKiAJCUVuYWJsZSBETUFSMTowCQkJCSovCi0KLSNkZWZpbmUJUEZURQkJCTB4MDAxMAkJCS8qIFBvcnQgRiBUaW1lciBFbmFibGUJCQkJKi8KLSNkZWZpbmUJUEZURV9VQVJUCQkweDAwMDAJCQkvKgkJRW5hYmxlIFVBUlQxIFJYL1RYCQkJKi8KLSNkZWZpbmUJUEZURV9USU1FUgkJMHgwMDEwCQkJLyogCQlFbmFibGUgVE1SNzo2CQkJCSovCi0KLSNkZWZpbmUJUEZTNkUJCQkweDAwMjAJCQkvKiBQb3J0IEYgU1BJIFNTRUwgNiBFbmFibGUJCQkqLwotI2RlZmluZQlQRlM2RV9USU1FUgkJMHgwMDAwCQkJLyoJCUVuYWJsZSBUTVI1CQkJCQkqLwotI2RlZmluZQlQRlM2RV9TUEkJCTB4MDAyMAkJCS8qIAkJRW5hYmxlIFNQSV9TU0VMNgkJCSovCi0KLSNkZWZpbmUJUEZTNUUJCQkweDAwNDAJCQkvKiBQb3J0IEYgU1BJIFNTRUwgNSBFbmFibGUJCQkqLwotI2RlZmluZQlQRlM1RV9USU1FUgkJMHgwMDAwCQkJLyoJCUVuYWJsZSBUTVI0CQkJCQkqLwotI2RlZmluZQlQRlM1RV9TUEkJCTB4MDA0MAkJCS8qIAkJRW5hYmxlIFNQSV9TU0VMNQkJCSovCi0KLSNkZWZpbmUJUEZTNEUJCQkweDAwODAJCQkvKiBQb3J0IEYgU1BJIFNTRUwgNCBFbmFibGUJCQkqLwotI2RlZmluZQlQRlM0RV9USU1FUgkJMHgwMDAwCQkJLyoJCUVuYWJsZSBUTVIzCQkJCQkqLwotI2RlZmluZQlQRlM0RV9TUEkJCTB4MDA4MAkJCS8qIAkJRW5hYmxlIFNQSV9TU0VMNAkJCSovCi0KLSNkZWZpbmUJUEZGRQkJCTB4MDEwMAkJCS8qIFBvcnQgRiBQUEkgRnJhbWUgU3luYyBFbmFibGUJCSovCi0jZGVmaW5lCVBGRkVfVElNRVIJCTB4MDAwMAkJCS8qIAkJRW5hYmxlIFRNUjIJCQkJCSovCi0jZGVmaW5lCVBGRkVfUFBJCQkweDAxMDAJCQkvKiAJCUVuYWJsZSBQUEkgRlMzCQkJCSovCi0KLSNkZWZpbmUJUEdTRQkJCTB4MDIwMAkJCS8qIFBvcnQgRyBTUE9SVDEgU2Vjb25kYXJ5IEVuYWJsZQkqLwotI2RlZmluZQlQR1NFX1BQSQkJMHgwMDAwCQkJLyogCQlFbmFibGUgUFBJIEQ5OjgJCQkJKi8KLSNkZWZpbmUJUEdTRV9TUE9SVAkJMHgwMjAwCQkJLyogCQlFbmFibGUgRFIxU0VDL0RUMVNFQwkJKi8KLQotI2RlZmluZQlQR1JFCQkJMHgwNDAwCQkJLyogUG9ydCBHIFNQT1JUMSBSZWNlaXZlIEVuYWJsZQkJKi8KLSNkZWZpbmUJUEdSRV9QUEkJCTB4MDAwMAkJCS8qIAkJRW5hYmxlIFBQSSBEMTI6MTAJCQkqLwotI2RlZmluZQlQR1JFX1NQT1JUCQkweDA0MDAJCQkvKiAJCUVuYWJsZSBEUjFQUkkvUkZTMS9SU0NMSzEJKi8KLQotI2RlZmluZQlQR1RFCQkJMHgwODAwCQkJLyogUG9ydCBHIFNQT1JUMSBUcmFuc21pdCBFbmFibGUJKi8KLSNkZWZpbmUJUEdURV9QUEkJCTB4MDAwMAkJCS8qIAkJRW5hYmxlIFBQSSBEMTU6MTMJCQkqLwotI2RlZmluZQlQR1RFX1NQT1JUCQkweDA4MDAJCQkvKiAJCUVuYWJsZSBEVDFQUkkvVEZTMS9UU0NMSzEJKi8KLQotCi0vKiAgKioqKioqKioqKioqKioqKioqICBIQU5EU0hBS0UgRE1BIChIRE1BKSBNQVNLUyAgKioqKioqKioqKioqKioqKioqKioqLwotLyogSERNQXhfQ1RMIE1hc2tzCQkJCQkJCQkJCQkJCQkqLwotI2RlZmluZQlITURNQUVOCQkweDAwMDEJLyogRW5hYmxlIEhhbmRzaGFrZSBETUEgMC8xCQkJCQkqLwotI2RlZmluZQlSRVAJCQkweDAwMDIJLyogSERNQSBSZXF1ZXN0IFBvbGFyaXR5CQkJCQkqLwotI2RlZmluZQlVVEUJCQkweDAwMDQJLyogVXJnZW5jeSBUaHJlc2hvbGQgRW5hYmxlCQkJCQkqLwotI2RlZmluZQlPSUUJCQkweDAwMTAJLyogT3ZlcmZsb3cgSW50ZXJydXB0IEVuYWJsZQkJCQkqLwotI2RlZmluZQlCRElFCQkweDAwMjAJLyogQmxvY2sgRG9uZSBJbnRlcnJ1cHQgRW5hYmxlCQkJCSovCi0jZGVmaW5lCU1CREkJCTB4MDA0MAkvKiBNYXNrIEJsb2NrIERvbmUgSVJRIElmIFBlbmRpbmcgRUNOVAkJKi8KLSNkZWZpbmUJRFJRCQkJMHgwMzAwCS8qIEhETUEgUmVxdWVzdCBUeXBlCQkJCQkJKi8KLSNkZWZpbmUJRFJRX05PTkUJMHgwMDAwCS8qIAkJTm8gUmVxdWVzdAkJCQkJCQkqLwotI2RlZmluZQlEUlFfU0lOR0xFCTB4MDEwMAkvKiAJCUNoYW5uZWxzIFJlcXVlc3QgU2luZ2xlCQkJCSovCi0jZGVmaW5lCURSUV9NVUxUSQkweDAyMDAJLyogCQlDaGFubmVscyBSZXF1ZXN0IE11bHRpIChEZWZhdWx0KQkqLwotI2RlZmluZQlEUlFfVVJHRU5UCTB4MDMwMAkvKiAJCUNoYW5uZWxzIFJlcXVlc3QgTXVsdGkgVXJnZW50CQkqLwotI2RlZmluZQlSQkMJCQkweDEwMDAJLyogUmVsb2FkIEJDTlQgV2l0aCBJQkNOVAkJCQkJKi8KLSNkZWZpbmUJUFMJCQkweDIwMDAJLyogSERNQSBQaW4gU3RhdHVzCQkJCQkJCSovCi0jZGVmaW5lCU9JCQkJMHg0MDAwCS8qIE92ZXJmbG93IEludGVycnVwdCBHZW5lcmF0ZWQJCQkJKi8KLSNkZWZpbmUJQkRJCQkJMHg4MDAwCS8qIEJsb2NrIERvbmUgSW50ZXJydXB0IEdlbmVyYXRlZAkJCSovCi0KLS8qIGVudHJ5IGFkZHJlc3NlcyBvZiB0aGUgdXNlci1jYWxsYWJsZSBCb290IFJPTSBmdW5jdGlvbnMgKi8KLQotI2RlZmluZSBfQk9PVFJPTV9SRVNFVCAweEVGMDAwMDAwCi0jZGVmaW5lIF9CT09UUk9NX0ZJTkFMX0lOSVQgMHhFRjAwMDAwMgotI2RlZmluZSBfQk9PVFJPTV9ET19NRU1PUllfRE1BIDB4RUYwMDAwMDYKLSNkZWZpbmUgX0JPT1RST01fQk9PVF9EWEVfRkxBU0ggMHhFRjAwMDAwOAotI2RlZmluZSBfQk9PVFJPTV9CT09UX0RYRV9TUEkgMHhFRjAwMDAwQQotI2RlZmluZSBfQk9PVFJPTV9CT09UX0RYRV9UV0kgMHhFRjAwMDAwQwotI2RlZmluZSBfQk9PVFJPTV9HRVRfRFhFX0FERFJFU1NfRkxBU0ggMHhFRjAwMDAxMAotI2RlZmluZSBfQk9PVFJPTV9HRVRfRFhFX0FERFJFU1NfU1BJIDB4RUYwMDAwMTIKLSNkZWZpbmUgX0JPT1RST01fR0VUX0RYRV9BRERSRVNTX1RXSSAweEVGMDAwMDE0Ci0KLS8qIEFsdGVybmF0ZSBEZXByZWNhdGVkIE1hY3JvcyBQcm92aWRlZCBGb3IgQmFja3dhcmRzIENvZGUgQ29tcGF0aWJpbGl0eSAqLwotI2RlZmluZQlQR0RFX1VBUlQgICBQRkRFX1VBUlQKLSNkZWZpbmUJUEdERV9ETUEgICAgUEZERV9ETUEKLSNkZWZpbmUJQ0tFTE9XCQlTQ0tFTE9XCi0KLS8qIEhPU1QgUG9ydCBSZWdpc3RlcnMgKi8KLQotI2RlZmluZSAgICAgICAgICAgICAgICAgICAgIEhPU1RfQ09OVFJPTCAgMHhmZmMwMzQwMCAgIC8qIEhPU1QgQ29udHJvbCBSZWdpc3RlciAqLwotI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICBIT1NUX1NUQVRVUyAgMHhmZmMwMzQwNCAgIC8qIEhPU1QgU3RhdHVzIFJlZ2lzdGVyICovCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgICAgSE9TVF9USU1FT1VUICAweGZmYzAzNDA4ICAgLyogSE9TVCBBY2tub3dsZWRnZSBNb2RlIFRpbWVvdXQgUmVnaXN0ZXIgKi8KLQotLyogQ291bnRlciBSZWdpc3RlcnMgKi8KLQotI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgQ05UX0NPTkZJRyAgMHhmZmMwMzUwMCAgIC8qIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgKi8KLSNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgICBDTlRfSU1BU0sgIDB4ZmZjMDM1MDQgICAvKiBJbnRlcnJ1cHQgTWFzayBSZWdpc3RlciAqLwotI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgQ05UX1NUQVRVUyAgMHhmZmMwMzUwOCAgIC8qIFN0YXR1cyBSZWdpc3RlciAqLwotI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICBDTlRfQ09NTUFORCAgMHhmZmMwMzUwYyAgIC8qIENvbW1hbmQgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgICAgICAgICAgICAgICAgICAgICBDTlRfREVCT1VOQ0UgIDB4ZmZjMDM1MTAgICAvKiBEZWJvdW5jZSBSZWdpc3RlciAqLwotI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICBDTlRfQ09VTlRFUiAgMHhmZmMwMzUxNCAgIC8qIENvdW50ZXIgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgICAgIENOVF9NQVggIDB4ZmZjMDM1MTggICAvKiBNYXhpbWFsIENvdW50IFJlZ2lzdGVyICovCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICAgICBDTlRfTUlOICAweGZmYzAzNTFjICAgLyogTWluaW1hbCBDb3VudCBSZWdpc3RlciAqLwotCi0vKiBPVFAvRlVTRSBSZWdpc3RlcnMgKi8KLQotI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICBPVFBfQ09OVFJPTCAgMHhmZmMwMzYwMCAgIC8qIE9UUC9GdXNlIENvbnRyb2wgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgICAgIE9UUF9CRU4gIDB4ZmZjMDM2MDQgICAvKiBPVFAvRnVzZSBCeXRlIEVuYWJsZSAqLwotI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgT1RQX1NUQVRVUyAgMHhmZmMwMzYwOCAgIC8qIE9UUC9GdXNlIFN0YXR1cyAqLwotI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgT1RQX1RJTUlORyAgMHhmZmMwMzYwYyAgIC8qIE9UUC9GdXNlIEFjY2VzcyBUaW1pbmcgKi8KLQotLyogU2VjdXJpdHkgUmVnaXN0ZXJzICovCi0KLSNkZWZpbmUgICAgICAgICAgICAgICAgICAgIFNFQ1VSRV9TWVNTV1QgIDB4ZmZjMDM2MjAgICAvKiBTZWN1cmUgU3lzdGVtIFN3aXRjaGVzICovCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgIFNFQ1VSRV9DT05UUk9MICAweGZmYzAzNjI0ICAgLyogU2VjdXJlIENvbnRyb2wgKi8KLSNkZWZpbmUgICAgICAgICAgICAgICAgICAgIFNFQ1VSRV9TVEFUVVMgIDB4ZmZjMDM2MjggICAvKiBTZWN1cmUgU3RhdHVzICovCi0KLS8qIE9UUCBSZWFkL1dyaXRlIERhdGEgQnVmZmVyIFJlZ2lzdGVycyAqLwotCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICAgT1RQX0RBVEEwICAweGZmYzAzNjgwICAgLyogT1RQL0Z1c2UgRGF0YSAoT1RQX0RBVEEwLTMpIGFjY2Vzc2VzIHRoZSBmdXNlIHJlYWQgd3JpdGUgYnVmZmVyICovCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICAgT1RQX0RBVEExICAweGZmYzAzNjg0ICAgLyogT1RQL0Z1c2UgRGF0YSAoT1RQX0RBVEEwLTMpIGFjY2Vzc2VzIHRoZSBmdXNlIHJlYWQgd3JpdGUgYnVmZmVyICovCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICAgT1RQX0RBVEEyICAweGZmYzAzNjg4ICAgLyogT1RQL0Z1c2UgRGF0YSAoT1RQX0RBVEEwLTMpIGFjY2Vzc2VzIHRoZSBmdXNlIHJlYWQgd3JpdGUgYnVmZmVyICovCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICAgT1RQX0RBVEEzICAweGZmYzAzNjhjICAgLyogT1RQL0Z1c2UgRGF0YSAoT1RQX0RBVEEwLTMpIGFjY2Vzc2VzIHRoZSBmdXNlIHJlYWQgd3JpdGUgYnVmZmVyICovCi0KLS8qIE1vdG9yIENvbnRyb2wgUFdNIFJlZ2lzdGVycyAqLwotCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICAgIFBXTV9DVFJMICAweGZmYzAzNzAwICAgLyogUFdNIENvbnRyb2wgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgICAgUFdNX1NUQVQgIDB4ZmZjMDM3MDQgICAvKiBQV00gU3RhdHVzIFJlZ2lzdGVyICovCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICAgICAgUFdNX1RNICAweGZmYzAzNzA4ICAgLyogUFdNIFBlcmlvZCBSZWdpc3RlciAqLwotI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgICAgIFBXTV9EVCAgMHhmZmMwMzcwYyAgIC8qIFBXTSBEZWFkIFRpbWUgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgICAgUFdNX0dBVEUgIDB4ZmZjMDM3MTAgICAvKiBQV00gQ2hvcHBpbmcgQ29udHJvbCAqLwotI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgICAgUFdNX0NIQSAgMHhmZmMwMzcxNCAgIC8qIFBXTSBDaGFubmVsIEEgRHV0eSBDb250cm9sICovCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICAgICBQV01fQ0hCICAweGZmYzAzNzE4ICAgLyogUFdNIENoYW5uZWwgQiBEdXR5IENvbnRyb2wgKi8KLSNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgICAgIFBXTV9DSEMgIDB4ZmZjMDM3MWMgICAvKiBQV00gQ2hhbm5lbCBDIER1dHkgQ29udHJvbCAqLwotI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgICAgUFdNX1NFRyAgMHhmZmMwMzcyMCAgIC8qIFBXTSBDcm9zc292ZXIgYW5kIE91dHB1dCBFbmFibGUgKi8KLSNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgIFBXTV9TWU5DV1QgIDB4ZmZjMDM3MjQgICAvKiBQV00gU3luYyBQbHVzZSBXaWR0aCBDb250cm9sICovCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICAgIFBXTV9DSEFMICAweGZmYzAzNzI4ICAgLyogUFdNIENoYW5uZWwgQUwgRHV0eSBDb250cm9sIChTUiBtb2RlIG9ubHkpICovCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICAgIFBXTV9DSEJMICAweGZmYzAzNzJjICAgLyogUFdNIENoYW5uZWwgQkwgRHV0eSBDb250cm9sIChTUiBtb2RlIG9ubHkpICovCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICAgIFBXTV9DSENMICAweGZmYzAzNzMwICAgLyogUFdNIENoYW5uZWwgQ0wgRHV0eSBDb250cm9sIChTUiBtb2RlIG9ubHkpICovCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICAgICBQV01fTFNJICAweGZmYzAzNzM0ICAgLyogUFdNIExvdyBTaWRlIEludmVydCAoU1IgbW9kZSBvbmx5KSAqLwotI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgIFBXTV9TVEFUMiAgMHhmZmMwMzczOCAgIC8qIFBXTSBTdGF0dXMgUmVnaXN0ZXIgMiAqLwotCi0KLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLS8qICAgICBTSU5HTEUgQklUIE1BQ1JPIFBBSVJTIChiaXQgbWFzayBhbmQgbmVnYXRlZCBvbmUpICAgICAgKi8KLS8qICAgICBhbmQgTVVMVEkgQklUIFJFQUQgTUFDUk9TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLQotLyogQml0IG1hc2tzIGZvciBIT1NUX0NPTlRST0wgKi8KLQotI2RlZmluZSAgICAgICAgICAgICAgICAgICBIT1NUX0NOVFJfSE9TVF9FTiAgMHgxICAgICAgICAvKiBIb3N0IEVuYWJsZSAqLwotI2RlZmluZSAgICAgICAgICAgICAgICAgIEhPU1RfQ05UUl9uSE9TVF9FTiAgMHgwCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgSE9TVF9DTlRSX0hPU1RfRU5EICAweDIgICAgICAgIC8qIEhvc3QgRW5kaWFuZXNzICovCi0jZGVmaW5lICAgICAgICAgICAgICAgICBIT1NUX0NOVFJfbkhPU1RfRU5EICAweDAKLSNkZWZpbmUgICAgICAgICAgICAgICAgIEhPU1RfQ05UUl9EQVRBX1NJWkUgIDB4NCAgICAgICAgLyogRGF0YSBTaXplICovCi0jZGVmaW5lICAgICAgICAgICAgICAgIEhPU1RfQ05UUl9uREFUQV9TSVpFICAweDAKLSNkZWZpbmUgICAgICAgICAgICAgICAgICBIT1NUX0NOVFJfSE9TVF9SU1QgIDB4OCAgICAgICAgLyogSG9zdCBSZXNldCAqLwotI2RlZmluZSAgICAgICAgICAgICAgICAgSE9TVF9DTlRSX25IT1NUX1JTVCAgMHgwCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgSE9TVF9DTlRSX0hSRFlfT1ZSICAweDIwICAgICAgIC8qIEhvc3QgUmVhZHkgT3ZlcnJpZGUgKi8KLSNkZWZpbmUgICAgICAgICAgICAgICAgIEhPU1RfQ05UUl9uSFJEWV9PVlIgIDB4MAotI2RlZmluZSAgICAgICAgICAgICAgICAgIEhPU1RfQ05UUl9JTlRfTU9ERSAgMHg0MCAgICAgICAvKiBJbnRlcnJ1cHQgTW9kZSAqLwotI2RlZmluZSAgICAgICAgICAgICAgICAgSE9TVF9DTlRSX25JTlRfTU9ERSAgMHgwCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgICAgSE9TVF9DTlRSX0JUX0VOICAweDgwICAgICAgIC8qIEJ1cyBUaW1lb3V0IEVuYWJsZSAqLwotI2RlZmluZSAgICAgICAgICAgICAgICAgICBIT1NUX0NOVFJfIG5CVF9FTiAgMHgwCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICBIT1NUX0NOVFJfRUhXICAweDEwMCAgICAgIC8qIEVuYWJsZSBIb3N0IFdyaXRlICovCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgICAgIEhPU1RfQ05UUl9uRUhXICAweDAKLSNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgIEhPU1RfQ05UUl9FSFIgIDB4MjAwICAgICAgLyogRW5hYmxlIEhvc3QgUmVhZCAqLwotI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICBIT1NUX0NOVFJfbkVIUiAgMHgwCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICBIT1NUX0NOVFJfQkRSICAweDQwMCAgICAgIC8qIEJ1cnN0IERNQSBSZXF1ZXN0cyAqLwotI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICBIT1NUX0NOVFJfbkJEUiAgMHgwCi0KLS8qIEJpdCBtYXNrcyBmb3IgSE9TVF9TVEFUVVMgKi8KLQotI2RlZmluZSAgICAgICAgICAgICAgICAgICAgIEhPU1RfU1RBVF9SRUFEWSAgMHgxICAgICAgICAvKiBETUEgUmVhZHkgKi8KLSNkZWZpbmUgICAgICAgICAgICAgICAgICAgIEhPU1RfU1RBVF9uUkVBRFkgIDB4MAotI2RlZmluZSAgICAgICAgICAgICAgICAgIEhPU1RfU1RBVF9GSUZPRlVMTCAgMHgyICAgICAgICAvKiBGSUZPIEZ1bGwgKi8KLSNkZWZpbmUgICAgICAgICAgICAgICAgIEhPU1RfU1RBVF9uRklGT0ZVTEwgIDB4MAotI2RlZmluZSAgICAgICAgICAgICAgICAgSE9TVF9TVEFUX0ZJRk9FTVBUWSAgMHg0ICAgICAgICAvKiBGSUZPIEVtcHR5ICovCi0jZGVmaW5lICAgICAgICAgICAgICAgIEhPU1RfU1RBVF9uRklGT0VNUFRZICAweDAKLSNkZWZpbmUgICAgICAgICAgICAgICAgICBIT1NUX1NUQVRfQ09NUExFVEUgIDB4OCAgICAgICAgLyogRE1BIENvbXBsZXRlICovCi0jZGVmaW5lICAgICAgICAgICAgICAgICBIT1NUX1NUQVRfbkNPTVBMRVRFICAweDAKLSNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgSE9TVF9TVEFUX0hTSEsgIDB4MTAgICAgICAgLyogSG9zdCBIYW5kc2hha2UgKi8KLSNkZWZpbmUgICAgICAgICAgICAgICAgICAgICBIT1NUX1NUQVRfbkhTSEsgIDB4MAotI2RlZmluZSAgICAgICAgICAgICAgICAgICBIT1NUX1NUQVRfVElNRU9VVCAgMHgyMCAgICAgICAvKiBIb3N0IFRpbWVvdXQgKi8KLSNkZWZpbmUgICAgICAgICAgICAgICAgICBIT1NUX1NUQVRfblRJTUVPVVQgIDB4MAotI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICBIT1NUX1NUQVRfSElSUSAgMHg0MCAgICAgICAvKiBIb3N0IEludGVycnVwdCBSZXF1ZXN0ICovCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgICAgSE9TVF9TVEFUX25ISVJRICAweDAKLSNkZWZpbmUgICAgICAgICAgICAgICAgSE9TVF9TVEFUX0FMTE9XX0NORkcgIDB4ODAgICAgICAgLyogQWxsb3cgTmV3IENvbmZpZ3VyYXRpb24gKi8KLSNkZWZpbmUgICAgICAgICAgICAgICBIT1NUX1NUQVRfbkFMTE9XX0NORkcgIDB4MAotI2RlZmluZSAgICAgICAgICAgICAgICAgICBIT1NUX1NUQVRfRE1BX0RJUiAgMHgxMDAgICAgICAvKiBETUEgRGlyZWN0aW9uICovCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgSE9TVF9TVEFUX25ETUFfRElSICAweDAKLSNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgIEhPU1RfU1RBVF9CVEUgIDB4MjAwICAgICAgLyogQnVzIFRpbWVvdXQgRW5hYmxlZCAqLwotI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICBIT1NUX1NUQVRfbkJURSAgMHgwCi0jZGVmaW5lICAgICAgICAgICAgICAgSE9TVF9TVEFUX0hPU1RSRF9ET05FICAweDgwMDAgICAgIC8qIEhvc3QgUmVhZCBDb21wbGV0aW9uIEludGVycnVwdCAqLwotI2RlZmluZSAgICAgICAgICAgICAgSE9TVF9TVEFUX25IT1NUUkRfRE9ORSAgMHgwCi0KLS8qIEJpdCBtYXNrcyBmb3IgSE9TVF9USU1FT1VUICovCi0KLSNkZWZpbmUgICAgICAgICAgICAgSE9TVF9DT1VOVF9USU1FT1VUICAweDdmZiAgICAgIC8qIEhvc3QgVGltZW91dCBjb3VudCAqLwotCi0vKiBCaXQgbWFza3MgZm9yIFNFQ1VSRV9TWVNTV1QgKi8KLQotI2RlZmluZSAgICAgICAgICAgICAgICAgICBFTVVEQUJMICAweDEgICAgICAgIC8qIEVtdWxhdGlvbiBEaXNhYmxlLiAqLwotI2RlZmluZSAgICAgICAgICAgICAgICAgIG5FTVVEQUJMICAweDAKLSNkZWZpbmUgICAgICAgICAgICAgICAgICAgUlNUREFCTCAgMHgyICAgICAgICAvKiBSZXNldCBEaXNhYmxlICovCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgblJTVERBQkwgIDB4MAotI2RlZmluZSAgICAgICAgICAgICAgICAgICBMMUlEQUJMICAweDFjICAgICAgIC8qIEwxIEluc3RydWN0aW9uIE1lbW9yeSBEaXNhYmxlLiAqLwotI2RlZmluZSAgICAgICAgICAgICAgICAgIEwxREFEQUJMICAweGUwICAgICAgIC8qIEwxIERhdGEgQmFuayBBIE1lbW9yeSBEaXNhYmxlLiAqLwotI2RlZmluZSAgICAgICAgICAgICAgICAgIEwxREJEQUJMICAweDcwMCAgICAgIC8qIEwxIERhdGEgQmFuayBCIE1lbW9yeSBEaXNhYmxlLiAqLwotI2RlZmluZSAgICAgICAgICAgICAgICAgICBETUEwT1ZSICAweDgwMCAgICAgIC8qIERNQTAgTWVtb3J5IEFjY2VzcyBPdmVycmlkZSAqLwotI2RlZmluZSAgICAgICAgICAgICAgICAgIG5ETUEwT1ZSICAweDAKLSNkZWZpbmUgICAgICAgICAgICAgICAgICAgRE1BMU9WUiAgMHgxMDAwICAgICAvKiBETUExIE1lbW9yeSBBY2Nlc3MgT3ZlcnJpZGUgKi8KLSNkZWZpbmUgICAgICAgICAgICAgICAgICBuRE1BMU9WUiAgMHgwCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgICBFTVVPVlIgIDB4NDAwMCAgICAgLyogRW11bGF0aW9uIE92ZXJyaWRlICovCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgIG5FTVVPVlIgIDB4MAotI2RlZmluZSAgICAgICAgICAgICAgICAgICAgT1RQU0VOICAweDgwMDAgICAgIC8qIE9UUCBTZWNyZXRzIEVuYWJsZS4gKi8KLSNkZWZpbmUgICAgICAgICAgICAgICAgICAgbk9UUFNFTiAgMHgwCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgICBMMkRBQkwgIDB4NzAwMDAgICAgLyogTDIgTWVtb3J5IERpc2FibGUuICovCi0KLS8qIEJpdCBtYXNrcyBmb3IgU0VDVVJFX0NPTlRST0wgKi8KLQotI2RlZmluZSAgICAgICAgICAgICAgICAgICBTRUNVUkUwICAweDEgICAgICAgIC8qIFNFQ1VSRSAwICovCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgblNFQ1VSRTAgIDB4MAotI2RlZmluZSAgICAgICAgICAgICAgICAgICBTRUNVUkUxICAweDIgICAgICAgIC8qIFNFQ1VSRSAxICovCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgblNFQ1VSRTEgIDB4MAotI2RlZmluZSAgICAgICAgICAgICAgICAgICBTRUNVUkUyICAweDQgICAgICAgIC8qIFNFQ1VSRSAyICovCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgblNFQ1VSRTIgIDB4MAotI2RlZmluZSAgICAgICAgICAgICAgICAgICBTRUNVUkUzICAweDggICAgICAgIC8qIFNFQ1VSRSAzICovCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgblNFQ1VSRTMgIDB4MAotCi0vKiBCaXQgbWFza3MgZm9yIFNFQ1VSRV9TVEFUVVMgKi8KLQotI2RlZmluZSAgICAgICAgICAgICAgICAgICBTRUNNT0RFICAweDMgICAgICAgIC8qIFNlY3VyZWQgTW9kZSBDb250cm9sIFN0YXRlICovCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICBOTUkgIDB4NCAgICAgICAgLyogTm9uIE1hc2thYmxlIEludGVycnVwdCAqLwotI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICBuTk1JICAweDAKLSNkZWZpbmUgICAgICAgICAgICAgICAgICAgQUZWQUxJRCAgMHg4ICAgICAgICAvKiBBdXRoZW50aWNhdGlvbiBGaXJtd2FyZSBWYWxpZCAqLwotI2RlZmluZSAgICAgICAgICAgICAgICAgIG5BRlZBTElEICAweDAKLSNkZWZpbmUgICAgICAgICAgICAgICAgICAgIEFGRVhJVCAgMHgxMCAgICAgICAvKiBBdXRoZW50aWNhdGlvbiBGaXJtd2FyZSBFeGl0ICovCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgIG5BRkVYSVQgIDB4MAotI2RlZmluZSAgICAgICAgICAgICAgICAgICBTRUNTVEFUICAweGUwICAgICAgIC8qIFNlY3VyZSBTdGF0dXMgKi8KLQotCi0KLSNlbmRpZiAvKiBfREVGX0JGNTFYX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9pbmNsdWRlL21hY2gvZ3Bpby5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2luY2x1ZGUvbWFjaC9ncGlvLmgKaW5kZXggOWFmNmNlMC4uYjQ4MDcwNSAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2luY2x1ZGUvbWFjaC9ncGlvLmgKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2luY2x1ZGUvbWFjaC9ncGlvLmgKQEAgLTU1LDQgKzU1LDggQEAKICNkZWZpbmUgUE9SVF9HIEdQSU9fUEcwCiAjZGVmaW5lIFBPUlRfSCBHUElPX1BIMAogCisjaW5jbHVkZSA8bWFjaC1jb21tb24vcG9ydHMtZi5oPgorI2luY2x1ZGUgPG1hY2gtY29tbW9uL3BvcnRzLWcuaD4KKyNpbmNsdWRlIDxtYWNoLWNvbW1vbi9wb3J0cy1oLmg+CisKICNlbmRpZiAvKiBfTUFDSF9HUElPX0hfICovCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvaW5jbHVkZS9tYWNoL3BsbC5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2luY2x1ZGUvbWFjaC9wbGwuaAppbmRleCBkNTUwMjk4Li45NGNjYTY3IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvaW5jbHVkZS9tYWNoL3BsbC5oCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9pbmNsdWRlL21hY2gvcGxsLmgKQEAgLTEsNjMgKzEgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwOCBBbmFsb2cgRGV2aWNlcyBJbmMuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyCi0gKi8KLQotI2lmbmRlZiBfTUFDSF9QTExfSAotI2RlZmluZSBfTUFDSF9QTExfSAotCi0jaW5jbHVkZSA8YXNtL2JsYWNrZmluLmg+Ci0jaW5jbHVkZSA8YXNtL2lycWZsYWdzLmg+Ci0KLS8qIFdyaXRpbmcgdG8gUExMX0NUTCBpbml0aWF0ZXMgYSBQTEwgcmVsb2NrIHNlcXVlbmNlLiAqLwotc3RhdGljIF9faW5saW5lX18gdm9pZCBiZmluX3dyaXRlX1BMTF9DVEwodW5zaWduZWQgaW50IHZhbCkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzLCBpd3IwLCBpd3IxOwotCi0JaWYgKHZhbCA9PSBiZmluX3JlYWRfUExMX0NUTCgpKQotCQlyZXR1cm47Ci0KLQlmbGFncyA9IGhhcmRfbG9jYWxfaXJxX3NhdmUoKTsKLQkvKiBFbmFibGUgdGhlIFBMTCBXYWtldXAgYml0IGluIFNJQyBJV1IgKi8KLQlpd3IwID0gYmZpbl9yZWFkMzIoU0lDX0lXUjApOwotCWl3cjEgPSBiZmluX3JlYWQzMihTSUNfSVdSMSk7Ci0JLyogT25seSBhbGxvdyBQUEwgV2FrZXVwKSAqLwotCWJmaW5fd3JpdGUzMihTSUNfSVdSMCwgSVdSX0VOQUJMRSgwKSk7Ci0JYmZpbl93cml0ZTMyKFNJQ19JV1IxLCAwKTsKLQotCWJmaW5fd3JpdGUxNihQTExfQ1RMLCB2YWwpOwotCVNTWU5DKCk7Ci0JYXNtKCJJRExFOyIpOwotCi0JYmZpbl93cml0ZTMyKFNJQ19JV1IwLCBpd3IwKTsKLQliZmluX3dyaXRlMzIoU0lDX0lXUjEsIGl3cjEpOwotCWhhcmRfbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotfQotCi0vKiBXcml0aW5nIHRvIFZSX0NUTCBpbml0aWF0ZXMgYSBQTEwgcmVsb2NrIHNlcXVlbmNlLiAqLwotc3RhdGljIF9faW5saW5lX18gdm9pZCBiZmluX3dyaXRlX1ZSX0NUTCh1bnNpZ25lZCBpbnQgdmFsKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIGl3cjAsIGl3cjE7Ci0KLQlpZiAodmFsID09IGJmaW5fcmVhZF9WUl9DVEwoKSkKLQkJcmV0dXJuOwotCi0JZmxhZ3MgPSBoYXJkX2xvY2FsX2lycV9zYXZlKCk7Ci0JLyogRW5hYmxlIHRoZSBQTEwgV2FrZXVwIGJpdCBpbiBTSUMgSVdSICovCi0JaXdyMCA9IGJmaW5fcmVhZDMyKFNJQ19JV1IwKTsKLQlpd3IxID0gYmZpbl9yZWFkMzIoU0lDX0lXUjEpOwotCS8qIE9ubHkgYWxsb3cgUFBMIFdha2V1cCkgKi8KLQliZmluX3dyaXRlMzIoU0lDX0lXUjAsIElXUl9FTkFCTEUoMCkpOwotCWJmaW5fd3JpdGUzMihTSUNfSVdSMSwgMCk7Ci0KLQliZmluX3dyaXRlMTYoVlJfQ1RMLCB2YWwpOwotCVNTWU5DKCk7Ci0JYXNtKCJJRExFOyIpOwotCi0JYmZpbl93cml0ZTMyKFNJQ19JV1IwLCBpd3IwKTsKLQliZmluX3dyaXRlMzIoU0lDX0lXUjEsIGl3cjEpOwotCWhhcmRfbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotfQotCi0jZW5kaWYgLyogX01BQ0hfUExMX0ggKi8KKyNpbmNsdWRlIDxtYWNoLWNvbW1vbi9wbGwuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9ib2FyZHMvYWQ3MTYwZXZhbC5jIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2JvYXJkcy9hZDcxNjBldmFsLmMKaW5kZXggNTIyOTVmZi4uY2NhYjRjNiAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2JvYXJkcy9hZDcxNjBldmFsLmMKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2JvYXJkcy9hZDcxNjBldmFsLmMKQEAgLTY3LDYgKzY3LDcgQEAKIAkgKiBpZiBpdCBpcyB0aGUgY2FzZS4KIAkgKi8KIAkuZ3Bpb192cnNlbF9hY3RpdmUJPSAxLAorCS5jbGtpbiAgICAgICAgICA9IDI0LCAgICAgICAgICAgLyogbXVzYiBDTEtJTiBpbiBNSFogKi8KIH07CiAKIHN0YXRpYyBzdHJ1Y3QgbXVzYl9oZHJjX3BsYXRmb3JtX2RhdGEgbXVzYl9wbGF0ID0gewpAQCAtNDE5LDcgKzQyMCw3IEBACiAJfSwKIH07CiAKLXVuc2lnbmVkIHNob3J0IGJmaW5fdWFydDBfcGVyaXBoZXJhbHNbXSA9IHsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBiZmluX3VhcnQwX3BlcmlwaGVyYWxzW10gPSB7CiAJUF9VQVJUMF9UWCwgUF9VQVJUMF9SWCwgMAogfTsKIApAQCAtNDc0LDcgKzQ3NSw3IEBACiAjZW5kaWYKIH07CiAKLXVuc2lnbmVkIHNob3J0IGJmaW5fdWFydDFfcGVyaXBoZXJhbHNbXSA9IHsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBiZmluX3VhcnQxX3BlcmlwaGVyYWxzW10gPSB7CiAJUF9VQVJUMV9UWCwgUF9VQVJUMV9SWCwgMAogfTsKIApAQCAtNjI3LDkgKzYyOCw5IEBACiAJfSwKIH07CiAKLXVuc2lnbmVkIHNob3J0IGJmaW5fc3BvcnQwX3BlcmlwaGVyYWxzW10gPSB7CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgYmZpbl9zcG9ydDBfcGVyaXBoZXJhbHNbXSA9IHsKIAlQX1NQT1JUMF9URlMsIFBfU1BPUlQwX0RUUFJJLCBQX1NQT1JUMF9UU0NMSywgUF9TUE9SVDBfUkZTLAotCVBfU1BPUlQwX0RSUFJJLCBQX1NQT1JUMF9SU0NMSywgUF9TUE9SVDBfRFJTRUMsIFBfU1BPUlQwX0RUU0VDLCAwCisJUF9TUE9SVDBfRFJQUkksIFBfU1BPUlQwX1JTQ0xLLCAwCiB9OwogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZmluX3Nwb3J0MF91YXJ0X2RldmljZSA9IHsKQEAgLTY2MSw5ICs2NjIsOSBAQAogCX0sCiB9OwogCi11bnNpZ25lZCBzaG9ydCBiZmluX3Nwb3J0MV9wZXJpcGhlcmFsc1tdID0geworc3RhdGljIHVuc2lnbmVkIHNob3J0IGJmaW5fc3BvcnQxX3BlcmlwaGVyYWxzW10gPSB7CiAJUF9TUE9SVDFfVEZTLCBQX1NQT1JUMV9EVFBSSSwgUF9TUE9SVDFfVFNDTEssIFBfU1BPUlQxX1JGUywKLQlQX1NQT1JUMV9EUlBSSSwgUF9TUE9SVDFfUlNDTEssIFBfU1BPUlQxX0RSU0VDLCBQX1NQT1JUMV9EVFNFQywgMAorCVBfU1BPUlQxX0RSUFJJLCBQX1NQT1JUMV9SU0NMSywgMAogfTsKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYmZpbl9zcG9ydDFfdWFydF9kZXZpY2UgPSB7CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvYm9hcmRzL2NtX2JmNTI3LmMgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvYm9hcmRzL2NtX2JmNTI3LmMKaW5kZXggNTA1MzNlZC4uYzlkNmRjOCAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2JvYXJkcy9jbV9iZjUyNy5jCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9ib2FyZHMvY21fYmY1MjcuYwpAQCAtMTA0LDYgKzEwNCw3IEBACiAJICogaWYgaXQgaXMgdGhlIGNhc2UuCiAJICovCiAJLmdwaW9fdnJzZWxfYWN0aXZlCT0gMSwKKwkuY2xraW4gICAgICAgICAgPSAyNCwgICAgICAgICAgIC8qIG11c2IgQ0xLSU4gaW4gTUhaICovCiB9OwogCiBzdGF0aWMgc3RydWN0IG11c2JfaGRyY19wbGF0Zm9ybV9kYXRhIG11c2JfcGxhdCA9IHsKQEAgLTYxNCw3ICs2MTUsNyBAQAogCX0sCiB9OwogCi11bnNpZ25lZCBzaG9ydCBiZmluX3VhcnQwX3BlcmlwaGVyYWxzW10gPSB7CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgYmZpbl91YXJ0MF9wZXJpcGhlcmFsc1tdID0gewogCVBfVUFSVDBfVFgsIFBfVUFSVDBfUlgsIDAKIH07CiAKQEAgLTY2OSw3ICs2NzAsNyBAQAogI2VuZGlmCiB9OwogCi11bnNpZ25lZCBzaG9ydCBiZmluX3VhcnQxX3BlcmlwaGVyYWxzW10gPSB7CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgYmZpbl91YXJ0MV9wZXJpcGhlcmFsc1tdID0gewogCVBfVUFSVDFfVFgsIFBfVUFSVDFfUlgsIDAKIH07CiAKQEAgLTgwMSw5ICs4MDIsOSBAQAogCX0sCiB9OwogCi11bnNpZ25lZCBzaG9ydCBiZmluX3Nwb3J0MF9wZXJpcGhlcmFsc1tdID0geworc3RhdGljIHVuc2lnbmVkIHNob3J0IGJmaW5fc3BvcnQwX3BlcmlwaGVyYWxzW10gPSB7CiAJUF9TUE9SVDBfVEZTLCBQX1NQT1JUMF9EVFBSSSwgUF9TUE9SVDBfVFNDTEssIFBfU1BPUlQwX1JGUywKLQlQX1NQT1JUMF9EUlBSSSwgUF9TUE9SVDBfUlNDTEssIFBfU1BPUlQwX0RSU0VDLCBQX1NQT1JUMF9EVFNFQywgMAorCVBfU1BPUlQwX0RSUFJJLCBQX1NQT1JUMF9SU0NMSywgMAogfTsKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYmZpbl9zcG9ydDBfdWFydF9kZXZpY2UgPSB7CkBAIC04MzUsOSArODM2LDkgQEAKIAl9LAogfTsKIAotdW5zaWduZWQgc2hvcnQgYmZpbl9zcG9ydDFfcGVyaXBoZXJhbHNbXSA9IHsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBiZmluX3Nwb3J0MV9wZXJpcGhlcmFsc1tdID0gewogCVBfU1BPUlQxX1RGUywgUF9TUE9SVDFfRFRQUkksIFBfU1BPUlQxX1RTQ0xLLCBQX1NQT1JUMV9SRlMsCi0JUF9TUE9SVDFfRFJQUkksIFBfU1BPUlQxX1JTQ0xLLCBQX1NQT1JUMV9EUlNFQywgUF9TUE9SVDFfRFRTRUMsIDAKKwlQX1NQT1JUMV9EUlBSSSwgUF9TUE9SVDFfUlNDTEssIDAKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGJmaW5fc3BvcnQxX3VhcnRfZGV2aWNlID0gewpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2JvYXJkcy9lemJyZC5jIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2JvYXJkcy9lemJyZC5jCmluZGV4IGQwNjE3N2IuLmI3MTAxYWEgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9ib2FyZHMvZXpicmQuYworKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvYm9hcmRzL2V6YnJkLmMKQEAgLTY4LDYgKzY4LDcgQEAKIAkgKiBpZiBpdCBpcyB0aGUgY2FzZS4KIAkgKi8KIAkuZ3Bpb192cnNlbF9hY3RpdmUJPSAxLAorCS5jbGtpbiAgICAgICAgICA9IDI0LCAgICAgICAgICAgLyogbXVzYiBDTEtJTiBpbiBNSFogKi8KIH07CiAKIHN0YXRpYyBzdHJ1Y3QgbXVzYl9oZHJjX3BsYXRmb3JtX2RhdGEgbXVzYl9wbGF0ID0gewpAQCAtNDk5LDcgKzUwMCw3IEBACiAJfSwKIH07CiAKLXVuc2lnbmVkIHNob3J0IGJmaW5fdWFydDBfcGVyaXBoZXJhbHNbXSA9IHsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBiZmluX3VhcnQwX3BlcmlwaGVyYWxzW10gPSB7CiAJUF9VQVJUMF9UWCwgUF9VQVJUMF9SWCwgMAogfTsKIApAQCAtNTU0LDcgKzU1NSw3IEBACiAjZW5kaWYKIH07CiAKLXVuc2lnbmVkIHNob3J0IGJmaW5fdWFydDFfcGVyaXBoZXJhbHNbXSA9IHsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBiZmluX3VhcnQxX3BlcmlwaGVyYWxzW10gPSB7CiAJUF9VQVJUMV9UWCwgUF9VQVJUMV9SWCwgMAogfTsKIApAQCAtNjgxLDkgKzY4Miw5IEBACiAJfSwKIH07CiAKLXVuc2lnbmVkIHNob3J0IGJmaW5fc3BvcnQwX3BlcmlwaGVyYWxzW10gPSB7CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgYmZpbl9zcG9ydDBfcGVyaXBoZXJhbHNbXSA9IHsKIAlQX1NQT1JUMF9URlMsIFBfU1BPUlQwX0RUUFJJLCBQX1NQT1JUMF9UU0NMSywgUF9TUE9SVDBfUkZTLAotCVBfU1BPUlQwX0RSUFJJLCBQX1NQT1JUMF9SU0NMSywgUF9TUE9SVDBfRFJTRUMsIFBfU1BPUlQwX0RUU0VDLCAwCisJUF9TUE9SVDBfRFJQUkksIFBfU1BPUlQwX1JTQ0xLLCAwCiB9OwogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZmluX3Nwb3J0MF91YXJ0X2RldmljZSA9IHsKQEAgLTcxNSw5ICs3MTYsOSBAQAogCX0sCiB9OwogCi11bnNpZ25lZCBzaG9ydCBiZmluX3Nwb3J0MV9wZXJpcGhlcmFsc1tdID0geworc3RhdGljIHVuc2lnbmVkIHNob3J0IGJmaW5fc3BvcnQxX3BlcmlwaGVyYWxzW10gPSB7CiAJUF9TUE9SVDFfVEZTLCBQX1NQT1JUMV9EVFBSSSwgUF9TUE9SVDFfVFNDTEssIFBfU1BPUlQxX1JGUywKLQlQX1NQT1JUMV9EUlBSSSwgUF9TUE9SVDFfUlNDTEssIFBfU1BPUlQxX0RSU0VDLCBQX1NQT1JUMV9EVFNFQywgMAorCVBfU1BPUlQxX0RSUFJJLCBQX1NQT1JUMV9SU0NMSywgMAogfTsKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYmZpbl9zcG9ydDFfdWFydF9kZXZpY2UgPSB7CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvYm9hcmRzL2V6a2l0LmMgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvYm9hcmRzL2V6a2l0LmMKaW5kZXggMzVhODhhNS4uMmNkMmZmNiAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2JvYXJkcy9lemtpdC5jCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9ib2FyZHMvZXpraXQuYwpAQCAtMTA4LDYgKzEwOCw3IEBACiAJICogaWYgaXQgaXMgdGhlIGNhc2UuCiAJICovCiAJLmdwaW9fdnJzZWxfYWN0aXZlCT0gMSwKKwkuY2xraW4gICAgICAgICAgPSAyNCwgICAgICAgICAgIC8qIG11c2IgQ0xLSU4gaW4gTUhaICovCiB9OwogCiBzdGF0aWMgc3RydWN0IG11c2JfaGRyY19wbGF0Zm9ybV9kYXRhIG11c2JfcGxhdCA9IHsKQEAgLTcwOCw3ICs3MDksNyBAQAogCX0sCiB9OwogCi11bnNpZ25lZCBzaG9ydCBiZmluX3VhcnQwX3BlcmlwaGVyYWxzW10gPSB7CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgYmZpbl91YXJ0MF9wZXJpcGhlcmFsc1tdID0gewogCVBfVUFSVDBfVFgsIFBfVUFSVDBfUlgsIDAKIH07CiAKQEAgLTc2Myw3ICs3NjQsNyBAQAogI2VuZGlmCiB9OwogCi11bnNpZ25lZCBzaG9ydCBiZmluX3VhcnQxX3BlcmlwaGVyYWxzW10gPSB7CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgYmZpbl91YXJ0MV9wZXJpcGhlcmFsc1tdID0gewogCVBfVUFSVDFfVFgsIFBfVUFSVDFfUlgsIDAKIH07CiAKQEAgLTk2Miw2ICs5NjMsMTEgQEAKIAkJSTJDX0JPQVJEX0lORk8oImFkNTI1MiIsIDB4MmYpLAogCX0sCiAjZW5kaWYKKyNpZiBkZWZpbmVkKENPTkZJR19TTkRfU09DX0FEQVUxMzczKSB8fCBkZWZpbmVkKENPTkZJR19TTkRfU09DX0FEQVUxMzczX01PRFVMRSkKKwl7CisJCUkyQ19CT0FSRF9JTkZPKCJhZGF1MTM3MyIsIDB4MUEpLAorCX0sCisjZW5kaWYKIH07CiAKICNpZiBkZWZpbmVkKENPTkZJR19TRVJJQUxfQkZJTl9TUE9SVCkgfHwgZGVmaW5lZChDT05GSUdfU0VSSUFMX0JGSU5fU1BPUlRfTU9EVUxFKQpAQCAtOTg0LDkgKzk5MCw5IEBACiAJfSwKIH07CiAKLXVuc2lnbmVkIHNob3J0IGJmaW5fc3BvcnQwX3BlcmlwaGVyYWxzW10gPSB7CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgYmZpbl9zcG9ydDBfcGVyaXBoZXJhbHNbXSA9IHsKIAlQX1NQT1JUMF9URlMsIFBfU1BPUlQwX0RUUFJJLCBQX1NQT1JUMF9UU0NMSywgUF9TUE9SVDBfUkZTLAotCVBfU1BPUlQwX0RSUFJJLCBQX1NQT1JUMF9SU0NMSywgUF9TUE9SVDBfRFJTRUMsIFBfU1BPUlQwX0RUU0VDLCAwCisJUF9TUE9SVDBfRFJQUkksIFBfU1BPUlQwX1JTQ0xLLCAwCiB9OwogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZmluX3Nwb3J0MF91YXJ0X2RldmljZSA9IHsKQEAgLTEwMTgsOSArMTAyNCw5IEBACiAJfSwKIH07CiAKLXVuc2lnbmVkIHNob3J0IGJmaW5fc3BvcnQxX3BlcmlwaGVyYWxzW10gPSB7CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgYmZpbl9zcG9ydDFfcGVyaXBoZXJhbHNbXSA9IHsKIAlQX1NQT1JUMV9URlMsIFBfU1BPUlQxX0RUUFJJLCBQX1NQT1JUMV9UU0NMSywgUF9TUE9SVDFfUkZTLAotCVBfU1BPUlQxX0RSUFJJLCBQX1NQT1JUMV9SU0NMSywgUF9TUE9SVDFfRFJTRUMsIFBfU1BPUlQxX0RUU0VDLCAwCisJUF9TUE9SVDFfRFJQUkksIFBfU1BPUlQxX1JTQ0xLLCAwCiB9OwogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZmluX3Nwb3J0MV91YXJ0X2RldmljZSA9IHsKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9ib2FyZHMvdGxsNjUyN20uYyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9ib2FyZHMvdGxsNjUyN20uYwppbmRleCAxMzA4NjFiLi4xOGQzMDNkIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvYm9hcmRzL3RsbDY1MjdtLmMKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2JvYXJkcy90bGw2NTI3bS5jCkBAIC0xOTMsNyArMTkzLDcgQEAKIAlHUElPX1BHMSwgR1BJT19QSDksIEdQSU9fUEgxMAogfTsKIAotc3RhdGljIHN0cnVjdCBncGlvX2RlY29kZXJfcGxhdGZyb21fZGF0YSBzcGlfZGVjb2RlZF9jcyA9IHsKK3N0YXRpYyBzdHJ1Y3QgZ3Bpb19kZWNvZGVyX3BsYXRmb3JtX2RhdGEgc3BpX2RlY29kZWRfY3MgPSB7CiAJLmJhc2UJCT0gRVhQX0dQSU9fU1BJU0VMX0JBU0UsCiAJLmlucHV0X2FkZHJzCT0gZ3Bpb19hZGRyX2lucHV0cywKIAkubnJfaW5wdXRfYWRkcnMgPSBBUlJBWV9TSVpFKGdwaW9fYWRkcl9pbnB1dHMpLApAQCAtNTg2LDcgKzU4Niw3IEBACiAJfSwKIH07CiAKLXVuc2lnbmVkIHNob3J0IGJmaW5fdWFydDBfcGVyaXBoZXJhbHNbXSA9IHsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBiZmluX3VhcnQwX3BlcmlwaGVyYWxzW10gPSB7CiAJUF9VQVJUMF9UWCwgUF9VQVJUMF9SWCwgMAogfTsKIApAQCAtNjQyLDcgKzY0Miw3IEBACiAjZW5kaWYKIH07CiAKLXVuc2lnbmVkIHNob3J0IGJmaW5fdWFydDFfcGVyaXBoZXJhbHNbXSA9IHsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBiZmluX3VhcnQxX3BlcmlwaGVyYWxzW10gPSB7CiAJUF9VQVJUMV9UWCwgUF9VQVJUMV9SWCwgMAogfTsKIApAQCAtNzk5LDkgKzc5OSw5IEBACiAJfSwKIH07CiAKLXVuc2lnbmVkIHNob3J0IGJmaW5fc3BvcnQwX3BlcmlwaGVyYWxzW10gPSB7CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgYmZpbl9zcG9ydDBfcGVyaXBoZXJhbHNbXSA9IHsKIAlQX1NQT1JUMF9URlMsIFBfU1BPUlQwX0RUUFJJLCBQX1NQT1JUMF9UU0NMSywgUF9TUE9SVDBfUkZTLAotCVBfU1BPUlQwX0RSUFJJLCBQX1NQT1JUMF9SU0NMSywgUF9TUE9SVDBfRFJTRUMsIFBfU1BPUlQwX0RUU0VDLCAwCisJUF9TUE9SVDBfRFJQUkksIFBfU1BPUlQwX1JTQ0xLLCAwCiB9OwogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZmluX3Nwb3J0MF91YXJ0X2RldmljZSA9IHsKQEAgLTgzNCw5ICs4MzQsOSBAQAogCX0sCiB9OwogCi11bnNpZ25lZCBzaG9ydCBiZmluX3Nwb3J0MV9wZXJpcGhlcmFsc1tdID0geworc3RhdGljIHVuc2lnbmVkIHNob3J0IGJmaW5fc3BvcnQxX3BlcmlwaGVyYWxzW10gPSB7CiAJUF9TUE9SVDFfVEZTLCBQX1NQT1JUMV9EVFBSSSwgUF9TUE9SVDFfVFNDTEssIFBfU1BPUlQxX1JGUywKLQlQX1NQT1JUMV9EUlBSSSwgUF9TUE9SVDFfUlNDTEssIFBfU1BPUlQxX0RSU0VDLCBQX1NQT1JUMV9EVFNFQywgMAorCVBfU1BPUlQxX0RSUFJJLCBQX1NQT1JUMV9SU0NMSywgMAogfTsKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYmZpbl9zcG9ydDFfdWFydF9kZXZpY2UgPSB7CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvZG1hLmMgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvZG1hLmMKaW5kZXggN2JjNzU3Ny4uMWZhYmRlZiAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2RtYS5jCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9kbWEuYwpAQCAtMTEsNyArMTEsNyBAQAogI2luY2x1ZGUgPGFzbS9ibGFja2Zpbi5oPgogI2luY2x1ZGUgPGFzbS9kbWEuaD4KIAotc3RydWN0IGRtYV9yZWdpc3RlciAqZG1hX2lvX2Jhc2VfYWRkcltNQVhfRE1BX0NIQU5ORUxTXSA9IHsKK3N0cnVjdCBkbWFfcmVnaXN0ZXIgKiBjb25zdCBkbWFfaW9fYmFzZV9hZGRyW01BWF9ETUFfQ0hBTk5FTFNdID0gewogCShzdHJ1Y3QgZG1hX3JlZ2lzdGVyICopIERNQTBfTkVYVF9ERVNDX1BUUiwKIAkoc3RydWN0IGRtYV9yZWdpc3RlciAqKSBETUExX05FWFRfREVTQ19QVFIsCiAJKHN0cnVjdCBkbWFfcmVnaXN0ZXIgKikgRE1BMl9ORVhUX0RFU0NfUFRSLApkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2luY2x1ZGUvbWFjaC9iZmluX3NlcmlhbC5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2luY2x1ZGUvbWFjaC9iZmluX3NlcmlhbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwYzYwM2YKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvaW5jbHVkZS9tYWNoL2JmaW5fc2VyaWFsLmgKQEAgLTAsMCArMSwxNCBAQAorLyoKKyAqIG1hY2gvYmZpbl9zZXJpYWwuaCAtIEJsYWNrZmluIFVBUlQvU2VyaWFsIGRlZmluaXRpb25zCisgKgorICogQ29weXJpZ2h0IDIwMDYtMjAxMCBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgorICovCisKKyNpZm5kZWYgX19CRklOX01BQ0hfU0VSSUFMX0hfXworI2RlZmluZSBfX0JGSU5fTUFDSF9TRVJJQUxfSF9fCisKKyNkZWZpbmUgQkZJTl9VQVJUX05SX1BPUlRTCTIKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvaW5jbHVkZS9tYWNoL2JmaW5fc2VyaWFsXzV4eC5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2luY2x1ZGUvbWFjaC9iZmluX3NlcmlhbF81eHguaAppbmRleCBjMWQ1NWI4Li45NjBlMDg5IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvaW5jbHVkZS9tYWNoL2JmaW5fc2VyaWFsXzV4eC5oCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9pbmNsdWRlL21hY2gvYmZpbl9zZXJpYWxfNXh4LmgKQEAgLTQsMzYgKzQsOSBAQAogICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyCiAgKi8KIAotI2luY2x1ZGUgPGxpbnV4L3NlcmlhbC5oPgogI2luY2x1ZGUgPGFzbS9kbWEuaD4KICNpbmNsdWRlIDxhc20vcG9ydG11eC5oPgogCi0jZGVmaW5lIFVBUlRfR0VUX0NIQVIodWFydCkgICAgIGJmaW5fcmVhZDE2KCgodWFydCktPnBvcnQubWVtYmFzZSArIE9GRlNFVF9SQlIpKQotI2RlZmluZSBVQVJUX0dFVF9ETEwodWFydCkJYmZpbl9yZWFkMTYoKCh1YXJ0KS0+cG9ydC5tZW1iYXNlICsgT0ZGU0VUX0RMTCkpCi0jZGVmaW5lIFVBUlRfR0VUX0lFUih1YXJ0KSAgICAgIGJmaW5fcmVhZDE2KCgodWFydCktPnBvcnQubWVtYmFzZSArIE9GRlNFVF9JRVIpKQotI2RlZmluZSBVQVJUX0dFVF9ETEgodWFydCkJYmZpbl9yZWFkMTYoKCh1YXJ0KS0+cG9ydC5tZW1iYXNlICsgT0ZGU0VUX0RMSCkpCi0jZGVmaW5lIFVBUlRfR0VUX0lJUih1YXJ0KSAgICAgIGJmaW5fcmVhZDE2KCgodWFydCktPnBvcnQubWVtYmFzZSArIE9GRlNFVF9JSVIpKQotI2RlZmluZSBVQVJUX0dFVF9MQ1IodWFydCkgICAgICBiZmluX3JlYWQxNigoKHVhcnQpLT5wb3J0Lm1lbWJhc2UgKyBPRkZTRVRfTENSKSkKLSNkZWZpbmUgVUFSVF9HRVRfR0NUTCh1YXJ0KSAgICAgYmZpbl9yZWFkMTYoKCh1YXJ0KS0+cG9ydC5tZW1iYXNlICsgT0ZGU0VUX0dDVEwpKQotCi0jZGVmaW5lIFVBUlRfUFVUX0NIQVIodWFydCwgdikgICBiZmluX3dyaXRlMTYoKCh1YXJ0KS0+cG9ydC5tZW1iYXNlICsgT0ZGU0VUX1RIUiksIHYpCi0jZGVmaW5lIFVBUlRfUFVUX0RMTCh1YXJ0LCB2KSAgICBiZmluX3dyaXRlMTYoKCh1YXJ0KS0+cG9ydC5tZW1iYXNlICsgT0ZGU0VUX0RMTCksIHYpCi0jZGVmaW5lIFVBUlRfUFVUX0lFUih1YXJ0LCB2KSAgICBiZmluX3dyaXRlMTYoKCh1YXJ0KS0+cG9ydC5tZW1iYXNlICsgT0ZGU0VUX0lFUiksIHYpCi0jZGVmaW5lIFVBUlRfU0VUX0lFUih1YXJ0LCB2KSAgICBVQVJUX1BVVF9JRVIodWFydCwgVUFSVF9HRVRfSUVSKHVhcnQpIHwgKHYpKQotI2RlZmluZSBVQVJUX0NMRUFSX0lFUih1YXJ0LCB2KSAgVUFSVF9QVVRfSUVSKHVhcnQsIFVBUlRfR0VUX0lFUih1YXJ0KSAmIH4odikpCi0jZGVmaW5lIFVBUlRfUFVUX0RMSCh1YXJ0LCB2KSAgICBiZmluX3dyaXRlMTYoKCh1YXJ0KS0+cG9ydC5tZW1iYXNlICsgT0ZGU0VUX0RMSCksIHYpCi0jZGVmaW5lIFVBUlRfUFVUX0xDUih1YXJ0LCB2KSAgICBiZmluX3dyaXRlMTYoKCh1YXJ0KS0+cG9ydC5tZW1iYXNlICsgT0ZGU0VUX0xDUiksIHYpCi0jZGVmaW5lIFVBUlRfUFVUX0dDVEwodWFydCwgdikgICBiZmluX3dyaXRlMTYoKCh1YXJ0KS0+cG9ydC5tZW1iYXNlICsgT0ZGU0VUX0dDVEwpLCB2KQotCi0jZGVmaW5lIFVBUlRfU0VUX0RMQUIodWFydCkgICAgIGRvIHsgVUFSVF9QVVRfTENSKHVhcnQsIFVBUlRfR0VUX0xDUih1YXJ0KSB8IERMQUIpOyBTU1lOQygpOyB9IHdoaWxlICgwKQotI2RlZmluZSBVQVJUX0NMRUFSX0RMQUIodWFydCkgICBkbyB7IFVBUlRfUFVUX0xDUih1YXJ0LCBVQVJUX0dFVF9MQ1IodWFydCkgJiB+RExBQik7IFNTWU5DKCk7IH0gd2hpbGUgKDApCi0KLSNkZWZpbmUgVUFSVF9HRVRfQ1RTKHgpIGdwaW9fZ2V0X3ZhbHVlKHgtPmN0c19waW4pCi0jZGVmaW5lIFVBUlRfRElTQUJMRV9SVFMoeCkgZ3Bpb19zZXRfdmFsdWUoeC0+cnRzX3BpbiwgMSkKLSNkZWZpbmUgVUFSVF9FTkFCTEVfUlRTKHgpIGdwaW9fc2V0X3ZhbHVlKHgtPnJ0c19waW4sIDApCi0jZGVmaW5lIFVBUlRfRU5BQkxFX0lOVFMoeCwgdikgVUFSVF9QVVRfSUVSKHgsIHYpCi0jZGVmaW5lIFVBUlRfRElTQUJMRV9JTlRTKHgpIFVBUlRfUFVUX0lFUih4LCAwKQotCiAjaWYgZGVmaW5lZChDT05GSUdfQkZJTl9VQVJUMF9DVFNSVFMpIHx8IGRlZmluZWQoQ09ORklHX0JGSU5fVUFSVDFfQ1RTUlRTKQogIyBkZWZpbmUgQ09ORklHX1NFUklBTF9CRklOX0NUU1JUUwogCkBAIC01NCw1MCArMjcsNiBAQAogIyBlbmRpZgogI2VuZGlmCiAKLSNkZWZpbmUgQkZJTl9VQVJUX1RYX0ZJRk9fU0laRQkyCi0KLS8qCi0gKiBUaGUgcGluIGNvbmZpZ3VyYXRpb24gaXMgZGlmZmVyZW50IGZyb20gc2NoZW1hdGljCi0gKi8KLXN0cnVjdCBiZmluX3NlcmlhbF9wb3J0IHsKLQlzdHJ1Y3QgdWFydF9wb3J0IHBvcnQ7Ci0JdW5zaWduZWQgaW50IG9sZF9zdGF0dXM7Ci0JaW50IHN0YXR1c19pcnE7Ci0JdW5zaWduZWQgaW50IGxzcjsKLSNpZmRlZiBDT05GSUdfU0VSSUFMX0JGSU5fRE1BCi0JaW50IHR4X2RvbmU7Ci0JaW50IHR4X2NvdW50OwotCXN0cnVjdCBjaXJjX2J1ZiByeF9kbWFfYnVmOwotCXN0cnVjdCB0aW1lcl9saXN0IHJ4X2RtYV90aW1lcjsKLQlpbnQgcnhfZG1hX25yb3dzOwotCXVuc2lnbmVkIGludCB0eF9kbWFfY2hhbm5lbDsKLQl1bnNpZ25lZCBpbnQgcnhfZG1hX2NoYW5uZWw7Ci0Jc3RydWN0IHdvcmtfc3RydWN0IHR4X2RtYV93b3JrcXVldWU7Ci0jZW5kaWYKLSNpZmRlZiBDT05GSUdfU0VSSUFMX0JGSU5fQ1RTUlRTCi0Jc3RydWN0IHRpbWVyX2xpc3QgY3RzX3RpbWVyOwotCWludCBjdHNfcGluOwotCWludCBydHNfcGluOwotI2VuZGlmCi19OwotCi0vKiBUaGUgaGFyZHdhcmUgY2xlYXJzIHRoZSBMU1IgYml0cyB1cG9uIHJlYWQsIHNvIHdlIG5lZWQgdG8gY2FjaGUKLSAqIHNvbWUgb2YgdGhlIG1vcmUgZnVuIGJpdHMgaW4gc29mdHdhcmUgc28gdGhleSBkb24ndCBnZXQgbG9zdAotICogd2hlbiBjaGVja2luZyB0aGUgTFNSIGluIG90aGVyIGNvZGUgcGF0aHMgKFRYKS4KLSAqLwotc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgVUFSVF9HRVRfTFNSKHN0cnVjdCBiZmluX3NlcmlhbF9wb3J0ICp1YXJ0KQotewotCXVuc2lnbmVkIGludCBsc3IgPSBiZmluX3JlYWQxNih1YXJ0LT5wb3J0Lm1lbWJhc2UgKyBPRkZTRVRfTFNSKTsKLQl1YXJ0LT5sc3IgfD0gKGxzciAmIChCSXxGRXxQRXxPRSkpOwotCXJldHVybiBsc3IgfCB1YXJ0LT5sc3I7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBVQVJUX0NMRUFSX0xTUihzdHJ1Y3QgYmZpbl9zZXJpYWxfcG9ydCAqdWFydCkKLXsKLQl1YXJ0LT5sc3IgPSAwOwotCWJmaW5fd3JpdGUxNih1YXJ0LT5wb3J0Lm1lbWJhc2UgKyBPRkZTRVRfTFNSLCAtMSk7Ci19Ci0KIHN0cnVjdCBiZmluX3NlcmlhbF9yZXMgewogCXVuc2lnbmVkIGxvbmcgdWFydF9iYXNlX2FkZHI7CiAJaW50IHVhcnRfaXJxOwpAQCAtMTQ2LDMgKzc1LDUgQEAKIH07CiAKICNkZWZpbmUgRFJJVkVSX05BTUUgImJmaW4tdWFydCIKKworI2luY2x1ZGUgPGFzbS9iZmluX3NlcmlhbC5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2luY2x1ZGUvbWFjaC9ibGFja2Zpbi5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2luY2x1ZGUvbWFjaC9ibGFja2Zpbi5oCmluZGV4IGY3MTRjNWQuLmUxZDI3OTIgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9pbmNsdWRlL21hY2gvYmxhY2tmaW4uaAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvaW5jbHVkZS9tYWNoL2JsYWNrZmluLmgKQEAgLTEsNDkgKzEsMzcgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNy0yMDA5IEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqIENvcHlyaWdodCAyMDA3LTIwMTAgQW5hbG9nIERldmljZXMgSW5jLgogICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlcgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgogICovCiAKICNpZm5kZWYgX01BQ0hfQkxBQ0tGSU5fSF8KICNkZWZpbmUgX01BQ0hfQkxBQ0tGSU5fSF8KIAogI2luY2x1ZGUgImJmNTI3LmgiCi0jaW5jbHVkZSAiZGVmQkY1MjIuaCIKICNpbmNsdWRlICJhbm9tYWx5LmgiCiAKLSNpZiBkZWZpbmVkKENPTkZJR19CRjUyNykgfHwgZGVmaW5lZChDT05GSUdfQkY1MjYpCi0jaW5jbHVkZSAiZGVmQkY1MjcuaCIKKyNpbmNsdWRlIDxhc20vZGVmX0xQQmxhY2tmaW4uaD4KKyNpZiBkZWZpbmVkKENPTkZJR19CRjUyMykgfHwgZGVmaW5lZChDT05GSUdfQkY1MjIpCisjIGluY2x1ZGUgImRlZkJGNTIyLmgiCiAjZW5kaWYKLQogI2lmIGRlZmluZWQoQ09ORklHX0JGNTI1KSB8fCBkZWZpbmVkKENPTkZJR19CRjUyNCkKLSNpbmNsdWRlICJkZWZCRjUyNS5oIgorIyBpbmNsdWRlICJkZWZCRjUyNS5oIgorI2VuZGlmCisjaWYgZGVmaW5lZChDT05GSUdfQkY1MjcpIHx8IGRlZmluZWQoQ09ORklHX0JGNTI2KQorIyBpbmNsdWRlICJkZWZCRjUyNy5oIgogI2VuZGlmCiAKICNpZiAhZGVmaW5lZChfX0FTU0VNQkxZX18pCi0jaW5jbHVkZSAiY2RlZkJGNTIyLmgiCi0KLSNpZiBkZWZpbmVkKENPTkZJR19CRjUyNykgfHwgZGVmaW5lZChDT05GSUdfQkY1MjYpCi0jaW5jbHVkZSAiY2RlZkJGNTI3LmgiCisjIGluY2x1ZGUgPGFzbS9jZGVmX0xQQmxhY2tmaW4uaD4KKyMgaWYgZGVmaW5lZChDT05GSUdfQkY1MjMpIHx8IGRlZmluZWQoQ09ORklHX0JGNTIyKQorIyAgaW5jbHVkZSAiY2RlZkJGNTIyLmgiCisjIGVuZGlmCisjIGlmIGRlZmluZWQoQ09ORklHX0JGNTI1KSB8fCBkZWZpbmVkKENPTkZJR19CRjUyNCkKKyMgIGluY2x1ZGUgImNkZWZCRjUyNS5oIgorIyBlbmRpZgorIyBpZiBkZWZpbmVkKENPTkZJR19CRjUyNykgfHwgZGVmaW5lZChDT05GSUdfQkY1MjYpCisjICBpbmNsdWRlICJjZGVmQkY1MjcuaCIKKyMgZW5kaWYKICNlbmRpZgogCi0jaWYgZGVmaW5lZChDT05GSUdfQkY1MjUpIHx8IGRlZmluZWQoQ09ORklHX0JGNTI0KQotI2luY2x1ZGUgImNkZWZCRjUyNS5oIgotI2VuZGlmCi0jZW5kaWYKLQotI2RlZmluZSBCRklOX1VBUlRfTlJfUE9SVFMJMgotCi0jZGVmaW5lIE9GRlNFVF9USFIgICAgICAgICAgICAgIDB4MDAJLyogVHJhbnNtaXQgSG9sZGluZyByZWdpc3RlciAgICAgICAgICAgICovCi0jZGVmaW5lIE9GRlNFVF9SQlIgICAgICAgICAgICAgIDB4MDAJLyogUmVjZWl2ZSBCdWZmZXIgcmVnaXN0ZXIgICAgICAgICAgICAgICovCi0jZGVmaW5lIE9GRlNFVF9ETEwgICAgICAgICAgICAgIDB4MDAJLyogRGl2aXNvciBMYXRjaCAoTG93LUJ5dGUpICAgICAgICAgICAgICovCi0jZGVmaW5lIE9GRlNFVF9JRVIgICAgICAgICAgICAgIDB4MDQJLyogSW50ZXJydXB0IEVuYWJsZSBSZWdpc3RlciAgICAgICAgICAgICovCi0jZGVmaW5lIE9GRlNFVF9ETEggICAgICAgICAgICAgIDB4MDQJLyogRGl2aXNvciBMYXRjaCAoSGlnaC1CeXRlKSAgICAgICAgICAgICovCi0jZGVmaW5lIE9GRlNFVF9JSVIgICAgICAgICAgICAgIDB4MDgJLyogSW50ZXJydXB0IElkZW50aWZpY2F0aW9uIFJlZ2lzdGVyICAgICovCi0jZGVmaW5lIE9GRlNFVF9MQ1IgICAgICAgICAgICAgIDB4MEMJLyogTGluZSBDb250cm9sIFJlZ2lzdGVyICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIE9GRlNFVF9NQ1IgICAgICAgICAgICAgIDB4MTAJLyogTW9kZW0gQ29udHJvbCBSZWdpc3RlciAgICAgICAgICAgICAgICovCi0jZGVmaW5lIE9GRlNFVF9MU1IgICAgICAgICAgICAgIDB4MTQJLyogTGluZSBTdGF0dXMgUmVnaXN0ZXIgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIE9GRlNFVF9NU1IgICAgICAgICAgICAgIDB4MTgJLyogTW9kZW0gU3RhdHVzIFJlZ2lzdGVyICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIE9GRlNFVF9TQ1IgICAgICAgICAgICAgIDB4MUMJLyogU0NSIFNjcmF0Y2ggUmVnaXN0ZXIgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIE9GRlNFVF9HQ1RMICAgICAgICAgICAgIDB4MjQJLyogR2xvYmFsIENvbnRyb2wgUmVnaXN0ZXIgICAgICAgICAgICAgICovCi0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2luY2x1ZGUvbWFjaC9jZGVmQkY1MjIuaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9pbmNsdWRlL21hY2gvY2RlZkJGNTIyLmgKaW5kZXggMTA3OWFmOC4uNjE4ZGZjZCAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2luY2x1ZGUvbWFjaC9jZGVmQkY1MjIuaAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvaW5jbHVkZS9tYWNoL2NkZWZCRjUyMi5oCkBAIC0xLDIxICsxLDEwOTUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNy0yMDA4IEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqIENvcHlyaWdodCAyMDA3LTIwMTAgQW5hbG9nIERldmljZXMgSW5jLgogICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlcgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgogICovCiAKICNpZm5kZWYgX0NERUZfQkY1MjJfSAogI2RlZmluZSBfQ0RFRl9CRjUyMl9ICiAKLS8qIGluY2x1ZGUgYWxsIENvcmUgcmVnaXN0ZXJzIGFuZCBiaXQgZGVmaW5pdGlvbnMgKi8KLSNpbmNsdWRlICJkZWZCRjUyMi5oIgorLyogQ2xvY2sgYW5kIFN5c3RlbSBDb250cm9sCSgweEZGQzAwMDAwIC0gMHhGRkMwMDBGRikJCQkJCQkJCSovCisjZGVmaW5lIGJmaW5fcmVhZF9QTExfQ1RMKCkJCQliZmluX3JlYWQxNihQTExfQ1RMKQorI2RlZmluZSBiZmluX3JlYWRfUExMX0RJVigpCQkJYmZpbl9yZWFkMTYoUExMX0RJVikKKyNkZWZpbmUgYmZpbl93cml0ZV9QTExfRElWKHZhbCkJCQliZmluX3dyaXRlMTYoUExMX0RJViwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVlJfQ1RMKCkJCQliZmluX3JlYWQxNihWUl9DVEwpCisjZGVmaW5lIGJmaW5fcmVhZF9QTExfU1RBVCgpCQkJYmZpbl9yZWFkMTYoUExMX1NUQVQpCisjZGVmaW5lIGJmaW5fd3JpdGVfUExMX1NUQVQodmFsKQkJYmZpbl93cml0ZTE2KFBMTF9TVEFULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QTExfTE9DS0NOVCgpCQkJYmZpbl9yZWFkMTYoUExMX0xPQ0tDTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfUExMX0xPQ0tDTlQodmFsKQkJYmZpbl93cml0ZTE2KFBMTF9MT0NLQ05ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DSElQSUQoKQkJCWJmaW5fcmVhZDMyKENISVBJRCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DSElQSUQodmFsKQkJCWJmaW5fd3JpdGUzMihDSElQSUQsIHZhbCkKIAotLyogaW5jbHVkZSBjb3JlIHNwZWNpZmljIHJlZ2lzdGVyIHBvaW50ZXIgZGVmaW5pdGlvbnMgKi8KLSNpbmNsdWRlIDxhc20vY2RlZl9MUEJsYWNrZmluLmg+CiAKLS8qIFNZU1RFTSAmIE1NUiBBRERSRVNTIERFRklOSVRJT05TIEZPUiBBRFNQLUJGNTIyICovCisvKiBTeXN0ZW0gSW50ZXJydXB0IENvbnRyb2xsZXIgKDB4RkZDMDAxMDAgLSAweEZGQzAwMUZGKQkJCQkJCQkqLworI2RlZmluZSBiZmluX3JlYWRfU1dSU1QoKQkJCWJmaW5fcmVhZDE2KFNXUlNUKQorI2RlZmluZSBiZmluX3dyaXRlX1NXUlNUKHZhbCkJCQliZmluX3dyaXRlMTYoU1dSU1QsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NZU0NSKCkJCQliZmluX3JlYWQxNihTWVNDUikKKyNkZWZpbmUgYmZpbl93cml0ZV9TWVNDUih2YWwpCQkJYmZpbl93cml0ZTE2KFNZU0NSLCB2YWwpCiAKLS8qIGluY2x1ZGUgY2RlZkJGNTJ4X2Jhc2UuaCBmb3IgdGhlIHNldCBvZiAjZGVmaW5lcyB0aGF0IGFyZSBjb21tb24gdG8gYWxsIEFEU1AtQkY1MnggcHJvY2Vzc29ycyAqLwotI2luY2x1ZGUgImNkZWZCRjUyeF9iYXNlLmgiCisjZGVmaW5lIGJmaW5fcmVhZF9TSUNfUlZFQ1QoKQkJCWJmaW5fcmVhZDMyKFNJQ19SVkVDVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9TSUNfUlZFQ1QodmFsKQkJYmZpbl93cml0ZTMyKFNJQ19SVkVDVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU0lDX0lNQVNLMCgpCQkJYmZpbl9yZWFkMzIoU0lDX0lNQVNLMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9TSUNfSU1BU0swKHZhbCkJCWJmaW5fd3JpdGUzMihTSUNfSU1BU0swLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TSUNfSU1BU0soeCkJCQliZmluX3JlYWQzMihTSUNfSU1BU0swICsgKHggPDwgNikpCisjZGVmaW5lIGJmaW5fd3JpdGVfU0lDX0lNQVNLKHgsIHZhbCkJCWJmaW5fd3JpdGUzMigoU0lDX0lNQVNLMCArICh4IDw8IDYpKSwgdmFsKQorCisjZGVmaW5lIGJmaW5fcmVhZF9TSUNfSUFSMCgpCQkJYmZpbl9yZWFkMzIoU0lDX0lBUjApCisjZGVmaW5lIGJmaW5fd3JpdGVfU0lDX0lBUjAodmFsKQkJYmZpbl93cml0ZTMyKFNJQ19JQVIwLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TSUNfSUFSMSgpCQkJYmZpbl9yZWFkMzIoU0lDX0lBUjEpCisjZGVmaW5lIGJmaW5fd3JpdGVfU0lDX0lBUjEodmFsKQkJYmZpbl93cml0ZTMyKFNJQ19JQVIxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TSUNfSUFSMigpCQkJYmZpbl9yZWFkMzIoU0lDX0lBUjIpCisjZGVmaW5lIGJmaW5fd3JpdGVfU0lDX0lBUjIodmFsKQkJYmZpbl93cml0ZTMyKFNJQ19JQVIyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TSUNfSUFSMygpCQkJYmZpbl9yZWFkMzIoU0lDX0lBUjMpCisjZGVmaW5lIGJmaW5fd3JpdGVfU0lDX0lBUjModmFsKQkJYmZpbl93cml0ZTMyKFNJQ19JQVIzLCB2YWwpCisKKyNkZWZpbmUgYmZpbl9yZWFkX1NJQ19JU1IwKCkJCQliZmluX3JlYWQzMihTSUNfSVNSMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9TSUNfSVNSMCh2YWwpCQliZmluX3dyaXRlMzIoU0lDX0lTUjAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NJQ19JU1IoeCkJCQliZmluX3JlYWQzMihTSUNfSVNSMCArICh4IDw8IDYpKQorI2RlZmluZSBiZmluX3dyaXRlX1NJQ19JU1IoeCwgdmFsKQkJYmZpbl93cml0ZTMyKChTSUNfSVNSMCArICh4IDw8IDYpKSwgdmFsKQorCisjZGVmaW5lIGJmaW5fcmVhZF9TSUNfSVdSMCgpCQkJYmZpbl9yZWFkMzIoU0lDX0lXUjApCisjZGVmaW5lIGJmaW5fd3JpdGVfU0lDX0lXUjAodmFsKQkJYmZpbl93cml0ZTMyKFNJQ19JV1IwLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TSUNfSVdSKHgpCQkJYmZpbl9yZWFkMzIoU0lDX0lXUjAgKyAoeCA8PCA2KSkKKyNkZWZpbmUgYmZpbl93cml0ZV9TSUNfSVdSKHgsIHZhbCkJCWJmaW5fd3JpdGUzMigoU0lDX0lXUjAgKyAoeCA8PCA2KSksIHZhbCkKKworLyogU0lDIEFkZGl0aW9ucyB0byBBRFNQLUJGNTJ4ICgweEZGQzAwMTRDIC0gMHhGRkMwMDE2MikgKi8KKworI2RlZmluZSBiZmluX3JlYWRfU0lDX0lNQVNLMSgpCQkJYmZpbl9yZWFkMzIoU0lDX0lNQVNLMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9TSUNfSU1BU0sxKHZhbCkJCWJmaW5fd3JpdGUzMihTSUNfSU1BU0sxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TSUNfSUFSNCgpCQkJYmZpbl9yZWFkMzIoU0lDX0lBUjQpCisjZGVmaW5lIGJmaW5fd3JpdGVfU0lDX0lBUjQodmFsKQkJYmZpbl93cml0ZTMyKFNJQ19JQVI0LCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TSUNfSUFSNSgpCQkJYmZpbl9yZWFkMzIoU0lDX0lBUjUpCisjZGVmaW5lIGJmaW5fd3JpdGVfU0lDX0lBUjUodmFsKQkJYmZpbl93cml0ZTMyKFNJQ19JQVI1LCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TSUNfSUFSNigpCQkJYmZpbl9yZWFkMzIoU0lDX0lBUjYpCisjZGVmaW5lIGJmaW5fd3JpdGVfU0lDX0lBUjYodmFsKQkJYmZpbl93cml0ZTMyKFNJQ19JQVI2LCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TSUNfSUFSNygpCQkJYmZpbl9yZWFkMzIoU0lDX0lBUjcpCisjZGVmaW5lIGJmaW5fd3JpdGVfU0lDX0lBUjcodmFsKQkJYmZpbl93cml0ZTMyKFNJQ19JQVI3LCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TSUNfSVNSMSgpCQkJYmZpbl9yZWFkMzIoU0lDX0lTUjEpCisjZGVmaW5lIGJmaW5fd3JpdGVfU0lDX0lTUjEodmFsKQkJYmZpbl93cml0ZTMyKFNJQ19JU1IxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TSUNfSVdSMSgpCQkJYmZpbl9yZWFkMzIoU0lDX0lXUjEpCisjZGVmaW5lIGJmaW5fd3JpdGVfU0lDX0lXUjEodmFsKQkJYmZpbl93cml0ZTMyKFNJQ19JV1IxLCB2YWwpCisKKy8qIFdhdGNoZG9nIFRpbWVyCQkoMHhGRkMwMDIwMCAtIDB4RkZDMDAyRkYpCQkJCQkJCQkJKi8KKyNkZWZpbmUgYmZpbl9yZWFkX1dET0dfQ1RMKCkJCQliZmluX3JlYWQxNihXRE9HX0NUTCkKKyNkZWZpbmUgYmZpbl93cml0ZV9XRE9HX0NUTCh2YWwpCQliZmluX3dyaXRlMTYoV0RPR19DVEwsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1dET0dfQ05UKCkJCQliZmluX3JlYWQzMihXRE9HX0NOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9XRE9HX0NOVCh2YWwpCQliZmluX3dyaXRlMzIoV0RPR19DTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1dET0dfU1RBVCgpCQkJYmZpbl9yZWFkMzIoV0RPR19TVEFUKQorI2RlZmluZSBiZmluX3dyaXRlX1dET0dfU1RBVCh2YWwpCQliZmluX3dyaXRlMzIoV0RPR19TVEFULCB2YWwpCisKKworLyogUmVhbCBUaW1lIENsb2NrCQkoMHhGRkMwMDMwMCAtIDB4RkZDMDAzRkYpCQkJCQkJCQkJKi8KKyNkZWZpbmUgYmZpbl9yZWFkX1JUQ19TVEFUKCkJCQliZmluX3JlYWQzMihSVENfU1RBVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9SVENfU1RBVCh2YWwpCQliZmluX3dyaXRlMzIoUlRDX1NUQVQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1JUQ19JQ1RMKCkJCQliZmluX3JlYWQxNihSVENfSUNUTCkKKyNkZWZpbmUgYmZpbl93cml0ZV9SVENfSUNUTCh2YWwpCQliZmluX3dyaXRlMTYoUlRDX0lDVEwsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1JUQ19JU1RBVCgpCQkJYmZpbl9yZWFkMTYoUlRDX0lTVEFUKQorI2RlZmluZSBiZmluX3dyaXRlX1JUQ19JU1RBVCh2YWwpCQliZmluX3dyaXRlMTYoUlRDX0lTVEFULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9SVENfU1dDTlQoKQkJCWJmaW5fcmVhZDE2KFJUQ19TV0NOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9SVENfU1dDTlQodmFsKQkJYmZpbl93cml0ZTE2KFJUQ19TV0NOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUlRDX0FMQVJNKCkJCQliZmluX3JlYWQzMihSVENfQUxBUk0pCisjZGVmaW5lIGJmaW5fd3JpdGVfUlRDX0FMQVJNKHZhbCkJCWJmaW5fd3JpdGUzMihSVENfQUxBUk0sIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1JUQ19GQVNUKCkJCQliZmluX3JlYWQxNihSVENfRkFTVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9SVENfRkFTVCh2YWwpCQliZmluX3dyaXRlMTYoUlRDX0ZBU1QsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1JUQ19QUkVOKCkJCQliZmluX3JlYWQxNihSVENfUFJFTikKKyNkZWZpbmUgYmZpbl93cml0ZV9SVENfUFJFTih2YWwpCQliZmluX3dyaXRlMTYoUlRDX1BSRU4sIHZhbCkKKworCisvKiBVQVJUMCBDb250cm9sbGVyCQkoMHhGRkMwMDQwMCAtIDB4RkZDMDA0RkYpCQkJCQkJCQkJKi8KKyNkZWZpbmUgYmZpbl9yZWFkX1VBUlQwX1RIUigpCQkJYmZpbl9yZWFkMTYoVUFSVDBfVEhSKQorI2RlZmluZSBiZmluX3dyaXRlX1VBUlQwX1RIUih2YWwpCQliZmluX3dyaXRlMTYoVUFSVDBfVEhSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9VQVJUMF9SQlIoKQkJCWJmaW5fcmVhZDE2KFVBUlQwX1JCUikKKyNkZWZpbmUgYmZpbl93cml0ZV9VQVJUMF9SQlIodmFsKQkJYmZpbl93cml0ZTE2KFVBUlQwX1JCUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVUFSVDBfRExMKCkJCQliZmluX3JlYWQxNihVQVJUMF9ETEwpCisjZGVmaW5lIGJmaW5fd3JpdGVfVUFSVDBfRExMKHZhbCkJCWJmaW5fd3JpdGUxNihVQVJUMF9ETEwsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1VBUlQwX0lFUigpCQkJYmZpbl9yZWFkMTYoVUFSVDBfSUVSKQorI2RlZmluZSBiZmluX3dyaXRlX1VBUlQwX0lFUih2YWwpCQliZmluX3dyaXRlMTYoVUFSVDBfSUVSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9VQVJUMF9ETEgoKQkJCWJmaW5fcmVhZDE2KFVBUlQwX0RMSCkKKyNkZWZpbmUgYmZpbl93cml0ZV9VQVJUMF9ETEgodmFsKQkJYmZpbl93cml0ZTE2KFVBUlQwX0RMSCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVUFSVDBfSUlSKCkJCQliZmluX3JlYWQxNihVQVJUMF9JSVIpCisjZGVmaW5lIGJmaW5fd3JpdGVfVUFSVDBfSUlSKHZhbCkJCWJmaW5fd3JpdGUxNihVQVJUMF9JSVIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1VBUlQwX0xDUigpCQkJYmZpbl9yZWFkMTYoVUFSVDBfTENSKQorI2RlZmluZSBiZmluX3dyaXRlX1VBUlQwX0xDUih2YWwpCQliZmluX3dyaXRlMTYoVUFSVDBfTENSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9VQVJUMF9NQ1IoKQkJCWJmaW5fcmVhZDE2KFVBUlQwX01DUikKKyNkZWZpbmUgYmZpbl93cml0ZV9VQVJUMF9NQ1IodmFsKQkJYmZpbl93cml0ZTE2KFVBUlQwX01DUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVUFSVDBfTFNSKCkJCQliZmluX3JlYWQxNihVQVJUMF9MU1IpCisjZGVmaW5lIGJmaW5fd3JpdGVfVUFSVDBfTFNSKHZhbCkJCWJmaW5fd3JpdGUxNihVQVJUMF9MU1IsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1VBUlQwX01TUigpCQkJYmZpbl9yZWFkMTYoVUFSVDBfTVNSKQorI2RlZmluZSBiZmluX3dyaXRlX1VBUlQwX01TUih2YWwpCQliZmluX3dyaXRlMTYoVUFSVDBfTVNSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9VQVJUMF9TQ1IoKQkJCWJmaW5fcmVhZDE2KFVBUlQwX1NDUikKKyNkZWZpbmUgYmZpbl93cml0ZV9VQVJUMF9TQ1IodmFsKQkJYmZpbl93cml0ZTE2KFVBUlQwX1NDUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVUFSVDBfR0NUTCgpCQkJYmZpbl9yZWFkMTYoVUFSVDBfR0NUTCkKKyNkZWZpbmUgYmZpbl93cml0ZV9VQVJUMF9HQ1RMKHZhbCkJCWJmaW5fd3JpdGUxNihVQVJUMF9HQ1RMLCB2YWwpCisKKworLyogU1BJIENvbnRyb2xsZXIJCSgweEZGQzAwNTAwIC0gMHhGRkMwMDVGRikJCQkJCQkJCQkqLworI2RlZmluZSBiZmluX3JlYWRfU1BJX0NUTCgpCQkJYmZpbl9yZWFkMTYoU1BJX0NUTCkKKyNkZWZpbmUgYmZpbl93cml0ZV9TUElfQ1RMKHZhbCkJCQliZmluX3dyaXRlMTYoU1BJX0NUTCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BJX0ZMRygpCQkJYmZpbl9yZWFkMTYoU1BJX0ZMRykKKyNkZWZpbmUgYmZpbl93cml0ZV9TUElfRkxHKHZhbCkJCQliZmluX3dyaXRlMTYoU1BJX0ZMRywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BJX1NUQVQoKQkJCWJmaW5fcmVhZDE2KFNQSV9TVEFUKQorI2RlZmluZSBiZmluX3dyaXRlX1NQSV9TVEFUKHZhbCkJCWJmaW5fd3JpdGUxNihTUElfU1RBVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BJX1REQlIoKQkJCWJmaW5fcmVhZDE2KFNQSV9UREJSKQorI2RlZmluZSBiZmluX3dyaXRlX1NQSV9UREJSKHZhbCkJCWJmaW5fd3JpdGUxNihTUElfVERCUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BJX1JEQlIoKQkJCWJmaW5fcmVhZDE2KFNQSV9SREJSKQorI2RlZmluZSBiZmluX3dyaXRlX1NQSV9SREJSKHZhbCkJCWJmaW5fd3JpdGUxNihTUElfUkRCUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BJX0JBVUQoKQkJCWJmaW5fcmVhZDE2KFNQSV9CQVVEKQorI2RlZmluZSBiZmluX3dyaXRlX1NQSV9CQVVEKHZhbCkJCWJmaW5fd3JpdGUxNihTUElfQkFVRCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BJX1NIQURPVygpCQkJYmZpbl9yZWFkMTYoU1BJX1NIQURPVykKKyNkZWZpbmUgYmZpbl93cml0ZV9TUElfU0hBRE9XKHZhbCkJCWJmaW5fd3JpdGUxNihTUElfU0hBRE9XLCB2YWwpCisKKworLyogVElNRVIwLTcgUmVnaXN0ZXJzCQkoMHhGRkMwMDYwMCAtIDB4RkZDMDA2RkYpCQkJCQkJCQkqLworI2RlZmluZSBiZmluX3JlYWRfVElNRVIwX0NPTkZJRygpCQliZmluX3JlYWQxNihUSU1FUjBfQ09ORklHKQorI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSMF9DT05GSUcodmFsKQkJYmZpbl93cml0ZTE2KFRJTUVSMF9DT05GSUcsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1RJTUVSMF9DT1VOVEVSKCkJCWJmaW5fcmVhZDMyKFRJTUVSMF9DT1VOVEVSKQorI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSMF9DT1VOVEVSKHZhbCkJCWJmaW5fd3JpdGUzMihUSU1FUjBfQ09VTlRFUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVElNRVIwX1BFUklPRCgpCQliZmluX3JlYWQzMihUSU1FUjBfUEVSSU9EKQorI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSMF9QRVJJT0QodmFsKQkJYmZpbl93cml0ZTMyKFRJTUVSMF9QRVJJT0QsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1RJTUVSMF9XSURUSCgpCQliZmluX3JlYWQzMihUSU1FUjBfV0lEVEgpCisjZGVmaW5lIGJmaW5fd3JpdGVfVElNRVIwX1dJRFRIKHZhbCkJCWJmaW5fd3JpdGUzMihUSU1FUjBfV0lEVEgsIHZhbCkKKworI2RlZmluZSBiZmluX3JlYWRfVElNRVIxX0NPTkZJRygpCQliZmluX3JlYWQxNihUSU1FUjFfQ09ORklHKQorI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSMV9DT05GSUcodmFsKQkJYmZpbl93cml0ZTE2KFRJTUVSMV9DT05GSUcsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1RJTUVSMV9DT1VOVEVSKCkJCWJmaW5fcmVhZDMyKFRJTUVSMV9DT1VOVEVSKQorI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSMV9DT1VOVEVSKHZhbCkJCWJmaW5fd3JpdGUzMihUSU1FUjFfQ09VTlRFUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVElNRVIxX1BFUklPRCgpCQliZmluX3JlYWQzMihUSU1FUjFfUEVSSU9EKQorI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSMV9QRVJJT0QodmFsKQkJYmZpbl93cml0ZTMyKFRJTUVSMV9QRVJJT0QsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1RJTUVSMV9XSURUSCgpCQliZmluX3JlYWQzMihUSU1FUjFfV0lEVEgpCisjZGVmaW5lIGJmaW5fd3JpdGVfVElNRVIxX1dJRFRIKHZhbCkJCWJmaW5fd3JpdGUzMihUSU1FUjFfV0lEVEgsIHZhbCkKKworI2RlZmluZSBiZmluX3JlYWRfVElNRVIyX0NPTkZJRygpCQliZmluX3JlYWQxNihUSU1FUjJfQ09ORklHKQorI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSMl9DT05GSUcodmFsKQkJYmZpbl93cml0ZTE2KFRJTUVSMl9DT05GSUcsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1RJTUVSMl9DT1VOVEVSKCkJCWJmaW5fcmVhZDMyKFRJTUVSMl9DT1VOVEVSKQorI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSMl9DT1VOVEVSKHZhbCkJCWJmaW5fd3JpdGUzMihUSU1FUjJfQ09VTlRFUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVElNRVIyX1BFUklPRCgpCQliZmluX3JlYWQzMihUSU1FUjJfUEVSSU9EKQorI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSMl9QRVJJT0QodmFsKQkJYmZpbl93cml0ZTMyKFRJTUVSMl9QRVJJT0QsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1RJTUVSMl9XSURUSCgpCQliZmluX3JlYWQzMihUSU1FUjJfV0lEVEgpCisjZGVmaW5lIGJmaW5fd3JpdGVfVElNRVIyX1dJRFRIKHZhbCkJCWJmaW5fd3JpdGUzMihUSU1FUjJfV0lEVEgsIHZhbCkKKworI2RlZmluZSBiZmluX3JlYWRfVElNRVIzX0NPTkZJRygpCQliZmluX3JlYWQxNihUSU1FUjNfQ09ORklHKQorI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSM19DT05GSUcodmFsKQkJYmZpbl93cml0ZTE2KFRJTUVSM19DT05GSUcsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1RJTUVSM19DT1VOVEVSKCkJCWJmaW5fcmVhZDMyKFRJTUVSM19DT1VOVEVSKQorI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSM19DT1VOVEVSKHZhbCkJCWJmaW5fd3JpdGUzMihUSU1FUjNfQ09VTlRFUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVElNRVIzX1BFUklPRCgpCQliZmluX3JlYWQzMihUSU1FUjNfUEVSSU9EKQorI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSM19QRVJJT0QodmFsKQkJYmZpbl93cml0ZTMyKFRJTUVSM19QRVJJT0QsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1RJTUVSM19XSURUSCgpCQliZmluX3JlYWQzMihUSU1FUjNfV0lEVEgpCisjZGVmaW5lIGJmaW5fd3JpdGVfVElNRVIzX1dJRFRIKHZhbCkJCWJmaW5fd3JpdGUzMihUSU1FUjNfV0lEVEgsIHZhbCkKKworI2RlZmluZSBiZmluX3JlYWRfVElNRVI0X0NPTkZJRygpCQliZmluX3JlYWQxNihUSU1FUjRfQ09ORklHKQorI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSNF9DT05GSUcodmFsKQkJYmZpbl93cml0ZTE2KFRJTUVSNF9DT05GSUcsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1RJTUVSNF9DT1VOVEVSKCkJCWJmaW5fcmVhZDMyKFRJTUVSNF9DT1VOVEVSKQorI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSNF9DT1VOVEVSKHZhbCkJCWJmaW5fd3JpdGUzMihUSU1FUjRfQ09VTlRFUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVElNRVI0X1BFUklPRCgpCQliZmluX3JlYWQzMihUSU1FUjRfUEVSSU9EKQorI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSNF9QRVJJT0QodmFsKQkJYmZpbl93cml0ZTMyKFRJTUVSNF9QRVJJT0QsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1RJTUVSNF9XSURUSCgpCQliZmluX3JlYWQzMihUSU1FUjRfV0lEVEgpCisjZGVmaW5lIGJmaW5fd3JpdGVfVElNRVI0X1dJRFRIKHZhbCkJCWJmaW5fd3JpdGUzMihUSU1FUjRfV0lEVEgsIHZhbCkKKworI2RlZmluZSBiZmluX3JlYWRfVElNRVI1X0NPTkZJRygpCQliZmluX3JlYWQxNihUSU1FUjVfQ09ORklHKQorI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSNV9DT05GSUcodmFsKQkJYmZpbl93cml0ZTE2KFRJTUVSNV9DT05GSUcsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1RJTUVSNV9DT1VOVEVSKCkJCWJmaW5fcmVhZDMyKFRJTUVSNV9DT1VOVEVSKQorI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSNV9DT1VOVEVSKHZhbCkJCWJmaW5fd3JpdGUzMihUSU1FUjVfQ09VTlRFUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVElNRVI1X1BFUklPRCgpCQliZmluX3JlYWQzMihUSU1FUjVfUEVSSU9EKQorI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSNV9QRVJJT0QodmFsKQkJYmZpbl93cml0ZTMyKFRJTUVSNV9QRVJJT0QsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1RJTUVSNV9XSURUSCgpCQliZmluX3JlYWQzMihUSU1FUjVfV0lEVEgpCisjZGVmaW5lIGJmaW5fd3JpdGVfVElNRVI1X1dJRFRIKHZhbCkJCWJmaW5fd3JpdGUzMihUSU1FUjVfV0lEVEgsIHZhbCkKKworI2RlZmluZSBiZmluX3JlYWRfVElNRVI2X0NPTkZJRygpCQliZmluX3JlYWQxNihUSU1FUjZfQ09ORklHKQorI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSNl9DT05GSUcodmFsKQkJYmZpbl93cml0ZTE2KFRJTUVSNl9DT05GSUcsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1RJTUVSNl9DT1VOVEVSKCkJCWJmaW5fcmVhZDMyKFRJTUVSNl9DT1VOVEVSKQorI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSNl9DT1VOVEVSKHZhbCkJCWJmaW5fd3JpdGUzMihUSU1FUjZfQ09VTlRFUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVElNRVI2X1BFUklPRCgpCQliZmluX3JlYWQzMihUSU1FUjZfUEVSSU9EKQorI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSNl9QRVJJT0QodmFsKQkJYmZpbl93cml0ZTMyKFRJTUVSNl9QRVJJT0QsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1RJTUVSNl9XSURUSCgpCQliZmluX3JlYWQzMihUSU1FUjZfV0lEVEgpCisjZGVmaW5lIGJmaW5fd3JpdGVfVElNRVI2X1dJRFRIKHZhbCkJCWJmaW5fd3JpdGUzMihUSU1FUjZfV0lEVEgsIHZhbCkKKworI2RlZmluZSBiZmluX3JlYWRfVElNRVI3X0NPTkZJRygpCQliZmluX3JlYWQxNihUSU1FUjdfQ09ORklHKQorI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSN19DT05GSUcodmFsKQkJYmZpbl93cml0ZTE2KFRJTUVSN19DT05GSUcsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1RJTUVSN19DT1VOVEVSKCkJCWJmaW5fcmVhZDMyKFRJTUVSN19DT1VOVEVSKQorI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSN19DT1VOVEVSKHZhbCkJCWJmaW5fd3JpdGUzMihUSU1FUjdfQ09VTlRFUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVElNRVI3X1BFUklPRCgpCQliZmluX3JlYWQzMihUSU1FUjdfUEVSSU9EKQorI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSN19QRVJJT0QodmFsKQkJYmZpbl93cml0ZTMyKFRJTUVSN19QRVJJT0QsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1RJTUVSN19XSURUSCgpCQliZmluX3JlYWQzMihUSU1FUjdfV0lEVEgpCisjZGVmaW5lIGJmaW5fd3JpdGVfVElNRVI3X1dJRFRIKHZhbCkJCWJmaW5fd3JpdGUzMihUSU1FUjdfV0lEVEgsIHZhbCkKKworI2RlZmluZSBiZmluX3JlYWRfVElNRVJfRU5BQkxFKCkJCWJmaW5fcmVhZDE2KFRJTUVSX0VOQUJMRSkKKyNkZWZpbmUgYmZpbl93cml0ZV9USU1FUl9FTkFCTEUodmFsKQkJYmZpbl93cml0ZTE2KFRJTUVSX0VOQUJMRSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVElNRVJfRElTQUJMRSgpCQliZmluX3JlYWQxNihUSU1FUl9ESVNBQkxFKQorI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSX0RJU0FCTEUodmFsKQkJYmZpbl93cml0ZTE2KFRJTUVSX0RJU0FCTEUsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1RJTUVSX1NUQVRVUygpCQliZmluX3JlYWQzMihUSU1FUl9TVEFUVVMpCisjZGVmaW5lIGJmaW5fd3JpdGVfVElNRVJfU1RBVFVTKHZhbCkJCWJmaW5fd3JpdGUzMihUSU1FUl9TVEFUVVMsIHZhbCkKKworCisvKiBHZW5lcmFsIFB1cnBvc2UgSS9PIFBvcnQgRiAoMHhGRkMwMDcwMCAtIDB4RkZDMDA3RkYpCQkJCQkJCQkqLworI2RlZmluZSBiZmluX3JlYWRfUE9SVEZJTygpCQkJYmZpbl9yZWFkMTYoUE9SVEZJTykKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JURklPKHZhbCkJCQliZmluX3dyaXRlMTYoUE9SVEZJTywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEZJT19DTEVBUigpCQliZmluX3JlYWQxNihQT1JURklPX0NMRUFSKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRGSU9fQ0xFQVIodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRGSU9fQ0xFQVIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRGSU9fU0VUKCkJCQliZmluX3JlYWQxNihQT1JURklPX1NFVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JURklPX1NFVCh2YWwpCQliZmluX3dyaXRlMTYoUE9SVEZJT19TRVQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRGSU9fVE9HR0xFKCkJCWJmaW5fcmVhZDE2KFBPUlRGSU9fVE9HR0xFKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRGSU9fVE9HR0xFKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JURklPX1RPR0dMRSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEZJT19NQVNLQSgpCQliZmluX3JlYWQxNihQT1JURklPX01BU0tBKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRGSU9fTUFTS0EodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRGSU9fTUFTS0EsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRGSU9fTUFTS0FfQ0xFQVIoKQkJYmZpbl9yZWFkMTYoUE9SVEZJT19NQVNLQV9DTEVBUikKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JURklPX01BU0tBX0NMRUFSKHZhbCkJYmZpbl93cml0ZTE2KFBPUlRGSU9fTUFTS0FfQ0xFQVIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRGSU9fTUFTS0FfU0VUKCkJCWJmaW5fcmVhZDE2KFBPUlRGSU9fTUFTS0FfU0VUKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRGSU9fTUFTS0FfU0VUKHZhbCkJYmZpbl93cml0ZTE2KFBPUlRGSU9fTUFTS0FfU0VULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JURklPX01BU0tBX1RPR0dMRSgpCWJmaW5fcmVhZDE2KFBPUlRGSU9fTUFTS0FfVE9HR0xFKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRGSU9fTUFTS0FfVE9HR0xFKHZhbCkJYmZpbl93cml0ZTE2KFBPUlRGSU9fTUFTS0FfVE9HR0xFLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JURklPX01BU0tCKCkJCWJmaW5fcmVhZDE2KFBPUlRGSU9fTUFTS0IpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEZJT19NQVNLQih2YWwpCQliZmluX3dyaXRlMTYoUE9SVEZJT19NQVNLQiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEZJT19NQVNLQl9DTEVBUigpCQliZmluX3JlYWQxNihQT1JURklPX01BU0tCX0NMRUFSKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRGSU9fTUFTS0JfQ0xFQVIodmFsKQliZmluX3dyaXRlMTYoUE9SVEZJT19NQVNLQl9DTEVBUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEZJT19NQVNLQl9TRVQoKQkJYmZpbl9yZWFkMTYoUE9SVEZJT19NQVNLQl9TRVQpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEZJT19NQVNLQl9TRVQodmFsKQliZmluX3dyaXRlMTYoUE9SVEZJT19NQVNLQl9TRVQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRGSU9fTUFTS0JfVE9HR0xFKCkJYmZpbl9yZWFkMTYoUE9SVEZJT19NQVNLQl9UT0dHTEUpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEZJT19NQVNLQl9UT0dHTEUodmFsKQliZmluX3dyaXRlMTYoUE9SVEZJT19NQVNLQl9UT0dHTEUsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRGSU9fRElSKCkJCQliZmluX3JlYWQxNihQT1JURklPX0RJUikKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JURklPX0RJUih2YWwpCQliZmluX3dyaXRlMTYoUE9SVEZJT19ESVIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRGSU9fUE9MQVIoKQkJYmZpbl9yZWFkMTYoUE9SVEZJT19QT0xBUikKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JURklPX1BPTEFSKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JURklPX1BPTEFSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JURklPX0VER0UoKQkJYmZpbl9yZWFkMTYoUE9SVEZJT19FREdFKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRGSU9fRURHRSh2YWwpCQliZmluX3dyaXRlMTYoUE9SVEZJT19FREdFLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JURklPX0JPVEgoKQkJYmZpbl9yZWFkMTYoUE9SVEZJT19CT1RIKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRGSU9fQk9USCh2YWwpCQliZmluX3dyaXRlMTYoUE9SVEZJT19CT1RILCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JURklPX0lORU4oKQkJYmZpbl9yZWFkMTYoUE9SVEZJT19JTkVOKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRGSU9fSU5FTih2YWwpCQliZmluX3dyaXRlMTYoUE9SVEZJT19JTkVOLCB2YWwpCisKKworLyogU1BPUlQwIENvbnRyb2xsZXIJCSgweEZGQzAwODAwIC0gMHhGRkMwMDhGRikJCQkJCQkJCSovCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDBfVENSMSgpCQkJYmZpbl9yZWFkMTYoU1BPUlQwX1RDUjEpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQwX1RDUjEodmFsKQkJYmZpbl93cml0ZTE2KFNQT1JUMF9UQ1IxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDBfVENSMigpCQkJYmZpbl9yZWFkMTYoU1BPUlQwX1RDUjIpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQwX1RDUjIodmFsKQkJYmZpbl93cml0ZTE2KFNQT1JUMF9UQ1IyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDBfVENMS0RJVigpCQliZmluX3JlYWQxNihTUE9SVDBfVENMS0RJVikKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDBfVENMS0RJVih2YWwpCQliZmluX3dyaXRlMTYoU1BPUlQwX1RDTEtESVYsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMF9URlNESVYoKQkJYmZpbl9yZWFkMTYoU1BPUlQwX1RGU0RJVikKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDBfVEZTRElWKHZhbCkJCWJmaW5fd3JpdGUxNihTUE9SVDBfVEZTRElWLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDBfVFgoKQkJCWJmaW5fcmVhZDMyKFNQT1JUMF9UWCkKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDBfVFgodmFsKQkJYmZpbl93cml0ZTMyKFNQT1JUMF9UWCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQwX1JYKCkJCQliZmluX3JlYWQzMihTUE9SVDBfUlgpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQwX1JYKHZhbCkJCWJmaW5fd3JpdGUzMihTUE9SVDBfUlgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMF9UWDMyKCkJCQliZmluX3JlYWQzMihTUE9SVDBfVFgpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQwX1RYMzIodmFsKQkJYmZpbl93cml0ZTMyKFNQT1JUMF9UWCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQwX1JYMzIoKQkJCWJmaW5fcmVhZDMyKFNQT1JUMF9SWCkKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDBfUlgzMih2YWwpCQliZmluX3dyaXRlMzIoU1BPUlQwX1JYLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDBfVFgxNigpCQkJYmZpbl9yZWFkMTYoU1BPUlQwX1RYKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMF9UWDE2KHZhbCkJCWJmaW5fd3JpdGUxNihTUE9SVDBfVFgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMF9SWDE2KCkJCQliZmluX3JlYWQxNihTUE9SVDBfUlgpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQwX1JYMTYodmFsKQkJYmZpbl93cml0ZTE2KFNQT1JUMF9SWCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQwX1JDUjEoKQkJCWJmaW5fcmVhZDE2KFNQT1JUMF9SQ1IxKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMF9SQ1IxKHZhbCkJCWJmaW5fd3JpdGUxNihTUE9SVDBfUkNSMSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQwX1JDUjIoKQkJCWJmaW5fcmVhZDE2KFNQT1JUMF9SQ1IyKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMF9SQ1IyKHZhbCkJCWJmaW5fd3JpdGUxNihTUE9SVDBfUkNSMiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQwX1JDTEtESVYoKQkJYmZpbl9yZWFkMTYoU1BPUlQwX1JDTEtESVYpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQwX1JDTEtESVYodmFsKQkJYmZpbl93cml0ZTE2KFNQT1JUMF9SQ0xLRElWLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDBfUkZTRElWKCkJCWJmaW5fcmVhZDE2KFNQT1JUMF9SRlNESVYpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQwX1JGU0RJVih2YWwpCQliZmluX3dyaXRlMTYoU1BPUlQwX1JGU0RJViwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQwX1NUQVQoKQkJCWJmaW5fcmVhZDE2KFNQT1JUMF9TVEFUKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMF9TVEFUKHZhbCkJCWJmaW5fd3JpdGUxNihTUE9SVDBfU1RBVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQwX0NITkwoKQkJCWJmaW5fcmVhZDE2KFNQT1JUMF9DSE5MKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMF9DSE5MKHZhbCkJCWJmaW5fd3JpdGUxNihTUE9SVDBfQ0hOTCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQwX01DTUMxKCkJCWJmaW5fcmVhZDE2KFNQT1JUMF9NQ01DMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDBfTUNNQzEodmFsKQkJYmZpbl93cml0ZTE2KFNQT1JUMF9NQ01DMSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQwX01DTUMyKCkJCWJmaW5fcmVhZDE2KFNQT1JUMF9NQ01DMikKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDBfTUNNQzIodmFsKQkJYmZpbl93cml0ZTE2KFNQT1JUMF9NQ01DMiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQwX01UQ1MwKCkJCWJmaW5fcmVhZDMyKFNQT1JUMF9NVENTMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDBfTVRDUzAodmFsKQkJYmZpbl93cml0ZTMyKFNQT1JUMF9NVENTMCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQwX01UQ1MxKCkJCWJmaW5fcmVhZDMyKFNQT1JUMF9NVENTMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDBfTVRDUzEodmFsKQkJYmZpbl93cml0ZTMyKFNQT1JUMF9NVENTMSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQwX01UQ1MyKCkJCWJmaW5fcmVhZDMyKFNQT1JUMF9NVENTMikKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDBfTVRDUzIodmFsKQkJYmZpbl93cml0ZTMyKFNQT1JUMF9NVENTMiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQwX01UQ1MzKCkJCWJmaW5fcmVhZDMyKFNQT1JUMF9NVENTMykKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDBfTVRDUzModmFsKQkJYmZpbl93cml0ZTMyKFNQT1JUMF9NVENTMywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQwX01SQ1MwKCkJCWJmaW5fcmVhZDMyKFNQT1JUMF9NUkNTMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDBfTVJDUzAodmFsKQkJYmZpbl93cml0ZTMyKFNQT1JUMF9NUkNTMCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQwX01SQ1MxKCkJCWJmaW5fcmVhZDMyKFNQT1JUMF9NUkNTMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDBfTVJDUzEodmFsKQkJYmZpbl93cml0ZTMyKFNQT1JUMF9NUkNTMSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQwX01SQ1MyKCkJCWJmaW5fcmVhZDMyKFNQT1JUMF9NUkNTMikKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDBfTVJDUzIodmFsKQkJYmZpbl93cml0ZTMyKFNQT1JUMF9NUkNTMiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQwX01SQ1MzKCkJCWJmaW5fcmVhZDMyKFNQT1JUMF9NUkNTMykKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDBfTVJDUzModmFsKQkJYmZpbl93cml0ZTMyKFNQT1JUMF9NUkNTMywgdmFsKQorCisKKy8qIFNQT1JUMSBDb250cm9sbGVyCQkoMHhGRkMwMDkwMCAtIDB4RkZDMDA5RkYpCQkJCQkJCQkqLworI2RlZmluZSBiZmluX3JlYWRfU1BPUlQxX1RDUjEoKQkJCWJmaW5fcmVhZDE2KFNQT1JUMV9UQ1IxKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMV9UQ1IxKHZhbCkJCWJmaW5fd3JpdGUxNihTUE9SVDFfVENSMSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQxX1RDUjIoKQkJCWJmaW5fcmVhZDE2KFNQT1JUMV9UQ1IyKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMV9UQ1IyKHZhbCkJCWJmaW5fd3JpdGUxNihTUE9SVDFfVENSMiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQxX1RDTEtESVYoKQkJYmZpbl9yZWFkMTYoU1BPUlQxX1RDTEtESVYpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQxX1RDTEtESVYodmFsKQkJYmZpbl93cml0ZTE2KFNQT1JUMV9UQ0xLRElWLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDFfVEZTRElWKCkJCWJmaW5fcmVhZDE2KFNQT1JUMV9URlNESVYpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQxX1RGU0RJVih2YWwpCQliZmluX3dyaXRlMTYoU1BPUlQxX1RGU0RJViwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQxX1RYKCkJCQliZmluX3JlYWQzMihTUE9SVDFfVFgpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQxX1RYKHZhbCkJCWJmaW5fd3JpdGUzMihTUE9SVDFfVFgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMV9SWCgpCQkJYmZpbl9yZWFkMzIoU1BPUlQxX1JYKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMV9SWCh2YWwpCQliZmluX3dyaXRlMzIoU1BPUlQxX1JYLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDFfVFgzMigpCQkJYmZpbl9yZWFkMzIoU1BPUlQxX1RYKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMV9UWDMyKHZhbCkJCWJmaW5fd3JpdGUzMihTUE9SVDFfVFgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMV9SWDMyKCkJCQliZmluX3JlYWQzMihTUE9SVDFfUlgpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQxX1JYMzIodmFsKQkJYmZpbl93cml0ZTMyKFNQT1JUMV9SWCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQxX1RYMTYoKQkJCWJmaW5fcmVhZDE2KFNQT1JUMV9UWCkKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDFfVFgxNih2YWwpCQliZmluX3dyaXRlMTYoU1BPUlQxX1RYLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDFfUlgxNigpCQkJYmZpbl9yZWFkMTYoU1BPUlQxX1JYKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMV9SWDE2KHZhbCkJCWJmaW5fd3JpdGUxNihTUE9SVDFfUlgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMV9SQ1IxKCkJCQliZmluX3JlYWQxNihTUE9SVDFfUkNSMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDFfUkNSMSh2YWwpCQliZmluX3dyaXRlMTYoU1BPUlQxX1JDUjEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMV9SQ1IyKCkJCQliZmluX3JlYWQxNihTUE9SVDFfUkNSMikKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDFfUkNSMih2YWwpCQliZmluX3dyaXRlMTYoU1BPUlQxX1JDUjIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMV9SQ0xLRElWKCkJCWJmaW5fcmVhZDE2KFNQT1JUMV9SQ0xLRElWKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMV9SQ0xLRElWKHZhbCkJCWJmaW5fd3JpdGUxNihTUE9SVDFfUkNMS0RJViwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQxX1JGU0RJVigpCQliZmluX3JlYWQxNihTUE9SVDFfUkZTRElWKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMV9SRlNESVYodmFsKQkJYmZpbl93cml0ZTE2KFNQT1JUMV9SRlNESVYsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMV9TVEFUKCkJCQliZmluX3JlYWQxNihTUE9SVDFfU1RBVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDFfU1RBVCh2YWwpCQliZmluX3dyaXRlMTYoU1BPUlQxX1NUQVQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMV9DSE5MKCkJCQliZmluX3JlYWQxNihTUE9SVDFfQ0hOTCkKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDFfQ0hOTCh2YWwpCQliZmluX3dyaXRlMTYoU1BPUlQxX0NITkwsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMV9NQ01DMSgpCQliZmluX3JlYWQxNihTUE9SVDFfTUNNQzEpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQxX01DTUMxKHZhbCkJCWJmaW5fd3JpdGUxNihTUE9SVDFfTUNNQzEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMV9NQ01DMigpCQliZmluX3JlYWQxNihTUE9SVDFfTUNNQzIpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQxX01DTUMyKHZhbCkJCWJmaW5fd3JpdGUxNihTUE9SVDFfTUNNQzIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMV9NVENTMCgpCQliZmluX3JlYWQzMihTUE9SVDFfTVRDUzApCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQxX01UQ1MwKHZhbCkJCWJmaW5fd3JpdGUzMihTUE9SVDFfTVRDUzAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMV9NVENTMSgpCQliZmluX3JlYWQzMihTUE9SVDFfTVRDUzEpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQxX01UQ1MxKHZhbCkJCWJmaW5fd3JpdGUzMihTUE9SVDFfTVRDUzEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMV9NVENTMigpCQliZmluX3JlYWQzMihTUE9SVDFfTVRDUzIpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQxX01UQ1MyKHZhbCkJCWJmaW5fd3JpdGUzMihTUE9SVDFfTVRDUzIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMV9NVENTMygpCQliZmluX3JlYWQzMihTUE9SVDFfTVRDUzMpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQxX01UQ1MzKHZhbCkJCWJmaW5fd3JpdGUzMihTUE9SVDFfTVRDUzMsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMV9NUkNTMCgpCQliZmluX3JlYWQzMihTUE9SVDFfTVJDUzApCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQxX01SQ1MwKHZhbCkJCWJmaW5fd3JpdGUzMihTUE9SVDFfTVJDUzAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMV9NUkNTMSgpCQliZmluX3JlYWQzMihTUE9SVDFfTVJDUzEpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQxX01SQ1MxKHZhbCkJCWJmaW5fd3JpdGUzMihTUE9SVDFfTVJDUzEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMV9NUkNTMigpCQliZmluX3JlYWQzMihTUE9SVDFfTVJDUzIpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQxX01SQ1MyKHZhbCkJCWJmaW5fd3JpdGUzMihTUE9SVDFfTVJDUzIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMV9NUkNTMygpCQliZmluX3JlYWQzMihTUE9SVDFfTVJDUzMpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQxX01SQ1MzKHZhbCkJCWJmaW5fd3JpdGUzMihTUE9SVDFfTVJDUzMsIHZhbCkKKworCisvKiBFeHRlcm5hbCBCdXMgSW50ZXJmYWNlIFVuaXQgKDB4RkZDMDBBMDAgLSAweEZGQzAwQUZGKQkJCQkJCQkqLworI2RlZmluZSBiZmluX3JlYWRfRUJJVV9BTUdDVEwoKQkJCWJmaW5fcmVhZDE2KEVCSVVfQU1HQ1RMKQorI2RlZmluZSBiZmluX3dyaXRlX0VCSVVfQU1HQ1RMKHZhbCkJCWJmaW5fd3JpdGUxNihFQklVX0FNR0NUTCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRUJJVV9BTUJDVEwwKCkJCWJmaW5fcmVhZDMyKEVCSVVfQU1CQ1RMMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9FQklVX0FNQkNUTDAodmFsKQkJYmZpbl93cml0ZTMyKEVCSVVfQU1CQ1RMMCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRUJJVV9BTUJDVEwxKCkJCWJmaW5fcmVhZDMyKEVCSVVfQU1CQ1RMMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9FQklVX0FNQkNUTDEodmFsKQkJYmZpbl93cml0ZTMyKEVCSVVfQU1CQ1RMMSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRUJJVV9TREdDVEwoKQkJCWJmaW5fcmVhZDMyKEVCSVVfU0RHQ1RMKQorI2RlZmluZSBiZmluX3dyaXRlX0VCSVVfU0RHQ1RMKHZhbCkJCWJmaW5fd3JpdGUzMihFQklVX1NER0NUTCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRUJJVV9TREJDVEwoKQkJCWJmaW5fcmVhZDE2KEVCSVVfU0RCQ1RMKQorI2RlZmluZSBiZmluX3dyaXRlX0VCSVVfU0RCQ1RMKHZhbCkJCWJmaW5fd3JpdGUxNihFQklVX1NEQkNUTCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRUJJVV9TRFJSQygpCQkJYmZpbl9yZWFkMTYoRUJJVV9TRFJSQykKKyNkZWZpbmUgYmZpbl93cml0ZV9FQklVX1NEUlJDKHZhbCkJCWJmaW5fd3JpdGUxNihFQklVX1NEUlJDLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FQklVX1NEU1RBVCgpCQkJYmZpbl9yZWFkMTYoRUJJVV9TRFNUQVQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRUJJVV9TRFNUQVQodmFsKQkJYmZpbl93cml0ZTE2KEVCSVVfU0RTVEFULCB2YWwpCisKKworLyogRE1BIFRyYWZmaWMgQ29udHJvbCBSZWdpc3RlcnMJCQkJCQkJCQkJCQkJKi8KKyNkZWZpbmUgYmZpbl9yZWFkX0RNQUNfVENfUEVSKCkJCQliZmluX3JlYWQxNihETUFDX1RDX1BFUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUFDX1RDX1BFUih2YWwpCQliZmluX3dyaXRlMTYoRE1BQ19UQ19QRVIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQUNfVENfQ05UKCkJCQliZmluX3JlYWQxNihETUFDX1RDX0NOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUFDX1RDX0NOVCh2YWwpCQliZmluX3dyaXRlMTYoRE1BQ19UQ19DTlQsIHZhbCkKKworLyogRE1BIENvbnRyb2xsZXIJCQkJCQkJCQkJCQkJCQkJCSovCisjZGVmaW5lIGJmaW5fcmVhZF9ETUEwX0NPTkZJRygpCQkJYmZpbl9yZWFkMTYoRE1BMF9DT05GSUcpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMF9DT05GSUcodmFsKQkJYmZpbl93cml0ZTE2KERNQTBfQ09ORklHLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUEwX05FWFRfREVTQ19QVFIoKQkJYmZpbl9yZWFkMzIoRE1BMF9ORVhUX0RFU0NfUFRSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTBfTkVYVF9ERVNDX1BUUih2YWwpCWJmaW5fd3JpdGUzMihETUEwX05FWFRfREVTQ19QVFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTBfU1RBUlRfQUREUigpCQliZmluX3JlYWQzMihETUEwX1NUQVJUX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMF9TVEFSVF9BRERSKHZhbCkJCWJmaW5fd3JpdGUzMihETUEwX1NUQVJUX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTBfWF9DT1VOVCgpCQliZmluX3JlYWQxNihETUEwX1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMF9YX0NPVU5UKHZhbCkJCWJmaW5fd3JpdGUxNihETUEwX1hfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTBfWV9DT1VOVCgpCQliZmluX3JlYWQxNihETUEwX1lfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMF9ZX0NPVU5UKHZhbCkJCWJmaW5fd3JpdGUxNihETUEwX1lfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTBfWF9NT0RJRlkoKQkJYmZpbl9yZWFkMTYoRE1BMF9YX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUEwX1hfTU9ESUZZKHZhbCkJCWJmaW5fd3JpdGUxNihETUEwX1hfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUEwX1lfTU9ESUZZKCkJCWJmaW5fcmVhZDE2KERNQTBfWV9NT0RJRlkpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMF9ZX01PRElGWSh2YWwpCQliZmluX3dyaXRlMTYoRE1BMF9ZX01PRElGWSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMF9DVVJSX0RFU0NfUFRSKCkJCWJmaW5fcmVhZDMyKERNQTBfQ1VSUl9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUEwX0NVUlJfREVTQ19QVFIodmFsKQliZmluX3dyaXRlMzIoRE1BMF9DVVJSX0RFU0NfUFRSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUEwX0NVUlJfQUREUigpCQliZmluX3JlYWQzMihETUEwX0NVUlJfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUEwX0NVUlJfQUREUih2YWwpCQliZmluX3dyaXRlMzIoRE1BMF9DVVJSX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTBfQ1VSUl9YX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTBfQ1VSUl9YX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTBfQ1VSUl9YX0NPVU5UKHZhbCkJYmZpbl93cml0ZTE2KERNQTBfQ1VSUl9YX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUEwX0NVUlJfWV9DT1VOVCgpCQliZmluX3JlYWQxNihETUEwX0NVUlJfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUEwX0NVUlJfWV9DT1VOVCh2YWwpCWJmaW5fd3JpdGUxNihETUEwX0NVUlJfWV9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMF9JUlFfU1RBVFVTKCkJCWJmaW5fcmVhZDE2KERNQTBfSVJRX1NUQVRVUykKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUEwX0lSUV9TVEFUVVModmFsKQkJYmZpbl93cml0ZTE2KERNQTBfSVJRX1NUQVRVUywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMF9QRVJJUEhFUkFMX01BUCgpCQliZmluX3JlYWQxNihETUEwX1BFUklQSEVSQUxfTUFQKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTBfUEVSSVBIRVJBTF9NQVAodmFsKQliZmluX3dyaXRlMTYoRE1BMF9QRVJJUEhFUkFMX01BUCwgdmFsKQorCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExX0NPTkZJRygpCQkJYmZpbl9yZWFkMTYoRE1BMV9DT05GSUcpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMV9DT05GSUcodmFsKQkJYmZpbl93cml0ZTE2KERNQTFfQ09ORklHLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExX05FWFRfREVTQ19QVFIoKQkJYmZpbl9yZWFkMzIoRE1BMV9ORVhUX0RFU0NfUFRSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTFfTkVYVF9ERVNDX1BUUih2YWwpCWJmaW5fd3JpdGUzMihETUExX05FWFRfREVTQ19QVFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTFfU1RBUlRfQUREUigpCQliZmluX3JlYWQzMihETUExX1NUQVJUX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMV9TVEFSVF9BRERSKHZhbCkJCWJmaW5fd3JpdGUzMihETUExX1NUQVJUX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTFfWF9DT1VOVCgpCQliZmluX3JlYWQxNihETUExX1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMV9YX0NPVU5UKHZhbCkJCWJmaW5fd3JpdGUxNihETUExX1hfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTFfWV9DT1VOVCgpCQliZmluX3JlYWQxNihETUExX1lfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMV9ZX0NPVU5UKHZhbCkJCWJmaW5fd3JpdGUxNihETUExX1lfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTFfWF9NT0RJRlkoKQkJYmZpbl9yZWFkMTYoRE1BMV9YX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExX1hfTU9ESUZZKHZhbCkJCWJmaW5fd3JpdGUxNihETUExX1hfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExX1lfTU9ESUZZKCkJCWJmaW5fcmVhZDE2KERNQTFfWV9NT0RJRlkpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMV9ZX01PRElGWSh2YWwpCQliZmluX3dyaXRlMTYoRE1BMV9ZX01PRElGWSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMV9DVVJSX0RFU0NfUFRSKCkJCWJmaW5fcmVhZDMyKERNQTFfQ1VSUl9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExX0NVUlJfREVTQ19QVFIodmFsKQliZmluX3dyaXRlMzIoRE1BMV9DVVJSX0RFU0NfUFRSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExX0NVUlJfQUREUigpCQliZmluX3JlYWQzMihETUExX0NVUlJfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExX0NVUlJfQUREUih2YWwpCQliZmluX3dyaXRlMzIoRE1BMV9DVVJSX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTFfQ1VSUl9YX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTFfQ1VSUl9YX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTFfQ1VSUl9YX0NPVU5UKHZhbCkJYmZpbl93cml0ZTE2KERNQTFfQ1VSUl9YX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExX0NVUlJfWV9DT1VOVCgpCQliZmluX3JlYWQxNihETUExX0NVUlJfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExX0NVUlJfWV9DT1VOVCh2YWwpCWJmaW5fd3JpdGUxNihETUExX0NVUlJfWV9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMV9JUlFfU1RBVFVTKCkJCWJmaW5fcmVhZDE2KERNQTFfSVJRX1NUQVRVUykKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExX0lSUV9TVEFUVVModmFsKQkJYmZpbl93cml0ZTE2KERNQTFfSVJRX1NUQVRVUywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMV9QRVJJUEhFUkFMX01BUCgpCQliZmluX3JlYWQxNihETUExX1BFUklQSEVSQUxfTUFQKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTFfUEVSSVBIRVJBTF9NQVAodmFsKQliZmluX3dyaXRlMTYoRE1BMV9QRVJJUEhFUkFMX01BUCwgdmFsKQorCisjZGVmaW5lIGJmaW5fcmVhZF9ETUEyX0NPTkZJRygpCQkJYmZpbl9yZWFkMTYoRE1BMl9DT05GSUcpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMl9DT05GSUcodmFsKQkJYmZpbl93cml0ZTE2KERNQTJfQ09ORklHLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUEyX05FWFRfREVTQ19QVFIoKQkJYmZpbl9yZWFkMzIoRE1BMl9ORVhUX0RFU0NfUFRSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTJfTkVYVF9ERVNDX1BUUih2YWwpCWJmaW5fd3JpdGUzMihETUEyX05FWFRfREVTQ19QVFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTJfU1RBUlRfQUREUigpCQliZmluX3JlYWQzMihETUEyX1NUQVJUX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMl9TVEFSVF9BRERSKHZhbCkJCWJmaW5fd3JpdGUzMihETUEyX1NUQVJUX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTJfWF9DT1VOVCgpCQliZmluX3JlYWQxNihETUEyX1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMl9YX0NPVU5UKHZhbCkJCWJmaW5fd3JpdGUxNihETUEyX1hfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTJfWV9DT1VOVCgpCQliZmluX3JlYWQxNihETUEyX1lfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMl9ZX0NPVU5UKHZhbCkJCWJmaW5fd3JpdGUxNihETUEyX1lfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTJfWF9NT0RJRlkoKQkJYmZpbl9yZWFkMTYoRE1BMl9YX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUEyX1hfTU9ESUZZKHZhbCkJCWJmaW5fd3JpdGUxNihETUEyX1hfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUEyX1lfTU9ESUZZKCkJCWJmaW5fcmVhZDE2KERNQTJfWV9NT0RJRlkpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMl9ZX01PRElGWSh2YWwpCQliZmluX3dyaXRlMTYoRE1BMl9ZX01PRElGWSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMl9DVVJSX0RFU0NfUFRSKCkJCWJmaW5fcmVhZDMyKERNQTJfQ1VSUl9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUEyX0NVUlJfREVTQ19QVFIodmFsKQliZmluX3dyaXRlMzIoRE1BMl9DVVJSX0RFU0NfUFRSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUEyX0NVUlJfQUREUigpCQliZmluX3JlYWQzMihETUEyX0NVUlJfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUEyX0NVUlJfQUREUih2YWwpCQliZmluX3dyaXRlMzIoRE1BMl9DVVJSX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTJfQ1VSUl9YX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTJfQ1VSUl9YX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTJfQ1VSUl9YX0NPVU5UKHZhbCkJYmZpbl93cml0ZTE2KERNQTJfQ1VSUl9YX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUEyX0NVUlJfWV9DT1VOVCgpCQliZmluX3JlYWQxNihETUEyX0NVUlJfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUEyX0NVUlJfWV9DT1VOVCh2YWwpCWJmaW5fd3JpdGUxNihETUEyX0NVUlJfWV9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMl9JUlFfU1RBVFVTKCkJCWJmaW5fcmVhZDE2KERNQTJfSVJRX1NUQVRVUykKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUEyX0lSUV9TVEFUVVModmFsKQkJYmZpbl93cml0ZTE2KERNQTJfSVJRX1NUQVRVUywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMl9QRVJJUEhFUkFMX01BUCgpCQliZmluX3JlYWQxNihETUEyX1BFUklQSEVSQUxfTUFQKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTJfUEVSSVBIRVJBTF9NQVAodmFsKQliZmluX3dyaXRlMTYoRE1BMl9QRVJJUEhFUkFMX01BUCwgdmFsKQorCisjZGVmaW5lIGJmaW5fcmVhZF9ETUEzX0NPTkZJRygpCQkJYmZpbl9yZWFkMTYoRE1BM19DT05GSUcpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BM19DT05GSUcodmFsKQkJYmZpbl93cml0ZTE2KERNQTNfQ09ORklHLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUEzX05FWFRfREVTQ19QVFIoKQkJYmZpbl9yZWFkMzIoRE1BM19ORVhUX0RFU0NfUFRSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTNfTkVYVF9ERVNDX1BUUih2YWwpCWJmaW5fd3JpdGUzMihETUEzX05FWFRfREVTQ19QVFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTNfU1RBUlRfQUREUigpCQliZmluX3JlYWQzMihETUEzX1NUQVJUX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BM19TVEFSVF9BRERSKHZhbCkJCWJmaW5fd3JpdGUzMihETUEzX1NUQVJUX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTNfWF9DT1VOVCgpCQliZmluX3JlYWQxNihETUEzX1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BM19YX0NPVU5UKHZhbCkJCWJmaW5fd3JpdGUxNihETUEzX1hfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTNfWV9DT1VOVCgpCQliZmluX3JlYWQxNihETUEzX1lfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BM19ZX0NPVU5UKHZhbCkJCWJmaW5fd3JpdGUxNihETUEzX1lfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTNfWF9NT0RJRlkoKQkJYmZpbl9yZWFkMTYoRE1BM19YX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUEzX1hfTU9ESUZZKHZhbCkJCWJmaW5fd3JpdGUxNihETUEzX1hfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUEzX1lfTU9ESUZZKCkJCWJmaW5fcmVhZDE2KERNQTNfWV9NT0RJRlkpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BM19ZX01PRElGWSh2YWwpCQliZmluX3dyaXRlMTYoRE1BM19ZX01PRElGWSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BM19DVVJSX0RFU0NfUFRSKCkJCWJmaW5fcmVhZDMyKERNQTNfQ1VSUl9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUEzX0NVUlJfREVTQ19QVFIodmFsKQliZmluX3dyaXRlMzIoRE1BM19DVVJSX0RFU0NfUFRSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUEzX0NVUlJfQUREUigpCQliZmluX3JlYWQzMihETUEzX0NVUlJfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUEzX0NVUlJfQUREUih2YWwpCQliZmluX3dyaXRlMzIoRE1BM19DVVJSX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTNfQ1VSUl9YX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTNfQ1VSUl9YX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTNfQ1VSUl9YX0NPVU5UKHZhbCkJYmZpbl93cml0ZTE2KERNQTNfQ1VSUl9YX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUEzX0NVUlJfWV9DT1VOVCgpCQliZmluX3JlYWQxNihETUEzX0NVUlJfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUEzX0NVUlJfWV9DT1VOVCh2YWwpCWJmaW5fd3JpdGUxNihETUEzX0NVUlJfWV9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BM19JUlFfU1RBVFVTKCkJCWJmaW5fcmVhZDE2KERNQTNfSVJRX1NUQVRVUykKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUEzX0lSUV9TVEFUVVModmFsKQkJYmZpbl93cml0ZTE2KERNQTNfSVJRX1NUQVRVUywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BM19QRVJJUEhFUkFMX01BUCgpCQliZmluX3JlYWQxNihETUEzX1BFUklQSEVSQUxfTUFQKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTNfUEVSSVBIRVJBTF9NQVAodmFsKQliZmluX3dyaXRlMTYoRE1BM19QRVJJUEhFUkFMX01BUCwgdmFsKQorCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE0X0NPTkZJRygpCQkJYmZpbl9yZWFkMTYoRE1BNF9DT05GSUcpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BNF9DT05GSUcodmFsKQkJYmZpbl93cml0ZTE2KERNQTRfQ09ORklHLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE0X05FWFRfREVTQ19QVFIoKQkJYmZpbl9yZWFkMzIoRE1BNF9ORVhUX0RFU0NfUFRSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTRfTkVYVF9ERVNDX1BUUih2YWwpCWJmaW5fd3JpdGUzMihETUE0X05FWFRfREVTQ19QVFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTRfU1RBUlRfQUREUigpCQliZmluX3JlYWQzMihETUE0X1NUQVJUX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BNF9TVEFSVF9BRERSKHZhbCkJCWJmaW5fd3JpdGUzMihETUE0X1NUQVJUX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTRfWF9DT1VOVCgpCQliZmluX3JlYWQxNihETUE0X1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BNF9YX0NPVU5UKHZhbCkJCWJmaW5fd3JpdGUxNihETUE0X1hfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTRfWV9DT1VOVCgpCQliZmluX3JlYWQxNihETUE0X1lfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BNF9ZX0NPVU5UKHZhbCkJCWJmaW5fd3JpdGUxNihETUE0X1lfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTRfWF9NT0RJRlkoKQkJYmZpbl9yZWFkMTYoRE1BNF9YX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE0X1hfTU9ESUZZKHZhbCkJCWJmaW5fd3JpdGUxNihETUE0X1hfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE0X1lfTU9ESUZZKCkJCWJmaW5fcmVhZDE2KERNQTRfWV9NT0RJRlkpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BNF9ZX01PRElGWSh2YWwpCQliZmluX3dyaXRlMTYoRE1BNF9ZX01PRElGWSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BNF9DVVJSX0RFU0NfUFRSKCkJCWJmaW5fcmVhZDMyKERNQTRfQ1VSUl9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE0X0NVUlJfREVTQ19QVFIodmFsKQliZmluX3dyaXRlMzIoRE1BNF9DVVJSX0RFU0NfUFRSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE0X0NVUlJfQUREUigpCQliZmluX3JlYWQzMihETUE0X0NVUlJfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE0X0NVUlJfQUREUih2YWwpCQliZmluX3dyaXRlMzIoRE1BNF9DVVJSX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTRfQ1VSUl9YX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTRfQ1VSUl9YX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTRfQ1VSUl9YX0NPVU5UKHZhbCkJYmZpbl93cml0ZTE2KERNQTRfQ1VSUl9YX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE0X0NVUlJfWV9DT1VOVCgpCQliZmluX3JlYWQxNihETUE0X0NVUlJfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE0X0NVUlJfWV9DT1VOVCh2YWwpCWJmaW5fd3JpdGUxNihETUE0X0NVUlJfWV9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BNF9JUlFfU1RBVFVTKCkJCWJmaW5fcmVhZDE2KERNQTRfSVJRX1NUQVRVUykKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE0X0lSUV9TVEFUVVModmFsKQkJYmZpbl93cml0ZTE2KERNQTRfSVJRX1NUQVRVUywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BNF9QRVJJUEhFUkFMX01BUCgpCQliZmluX3JlYWQxNihETUE0X1BFUklQSEVSQUxfTUFQKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTRfUEVSSVBIRVJBTF9NQVAodmFsKQliZmluX3dyaXRlMTYoRE1BNF9QRVJJUEhFUkFMX01BUCwgdmFsKQorCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE1X0NPTkZJRygpCQkJYmZpbl9yZWFkMTYoRE1BNV9DT05GSUcpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BNV9DT05GSUcodmFsKQkJYmZpbl93cml0ZTE2KERNQTVfQ09ORklHLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE1X05FWFRfREVTQ19QVFIoKQkJYmZpbl9yZWFkMzIoRE1BNV9ORVhUX0RFU0NfUFRSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTVfTkVYVF9ERVNDX1BUUih2YWwpCWJmaW5fd3JpdGUzMihETUE1X05FWFRfREVTQ19QVFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTVfU1RBUlRfQUREUigpCQliZmluX3JlYWQzMihETUE1X1NUQVJUX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BNV9TVEFSVF9BRERSKHZhbCkJCWJmaW5fd3JpdGUzMihETUE1X1NUQVJUX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTVfWF9DT1VOVCgpCQliZmluX3JlYWQxNihETUE1X1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BNV9YX0NPVU5UKHZhbCkJCWJmaW5fd3JpdGUxNihETUE1X1hfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTVfWV9DT1VOVCgpCQliZmluX3JlYWQxNihETUE1X1lfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BNV9ZX0NPVU5UKHZhbCkJCWJmaW5fd3JpdGUxNihETUE1X1lfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTVfWF9NT0RJRlkoKQkJYmZpbl9yZWFkMTYoRE1BNV9YX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE1X1hfTU9ESUZZKHZhbCkJCWJmaW5fd3JpdGUxNihETUE1X1hfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE1X1lfTU9ESUZZKCkJCWJmaW5fcmVhZDE2KERNQTVfWV9NT0RJRlkpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BNV9ZX01PRElGWSh2YWwpCQliZmluX3dyaXRlMTYoRE1BNV9ZX01PRElGWSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BNV9DVVJSX0RFU0NfUFRSKCkJCWJmaW5fcmVhZDMyKERNQTVfQ1VSUl9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE1X0NVUlJfREVTQ19QVFIodmFsKQliZmluX3dyaXRlMzIoRE1BNV9DVVJSX0RFU0NfUFRSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE1X0NVUlJfQUREUigpCQliZmluX3JlYWQzMihETUE1X0NVUlJfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE1X0NVUlJfQUREUih2YWwpCQliZmluX3dyaXRlMzIoRE1BNV9DVVJSX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTVfQ1VSUl9YX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTVfQ1VSUl9YX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTVfQ1VSUl9YX0NPVU5UKHZhbCkJYmZpbl93cml0ZTE2KERNQTVfQ1VSUl9YX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE1X0NVUlJfWV9DT1VOVCgpCQliZmluX3JlYWQxNihETUE1X0NVUlJfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE1X0NVUlJfWV9DT1VOVCh2YWwpCWJmaW5fd3JpdGUxNihETUE1X0NVUlJfWV9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BNV9JUlFfU1RBVFVTKCkJCWJmaW5fcmVhZDE2KERNQTVfSVJRX1NUQVRVUykKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE1X0lSUV9TVEFUVVModmFsKQkJYmZpbl93cml0ZTE2KERNQTVfSVJRX1NUQVRVUywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BNV9QRVJJUEhFUkFMX01BUCgpCQliZmluX3JlYWQxNihETUE1X1BFUklQSEVSQUxfTUFQKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTVfUEVSSVBIRVJBTF9NQVAodmFsKQliZmluX3dyaXRlMTYoRE1BNV9QRVJJUEhFUkFMX01BUCwgdmFsKQorCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE2X0NPTkZJRygpCQkJYmZpbl9yZWFkMTYoRE1BNl9DT05GSUcpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BNl9DT05GSUcodmFsKQkJYmZpbl93cml0ZTE2KERNQTZfQ09ORklHLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE2X05FWFRfREVTQ19QVFIoKQkJYmZpbl9yZWFkMzIoRE1BNl9ORVhUX0RFU0NfUFRSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTZfTkVYVF9ERVNDX1BUUih2YWwpCWJmaW5fd3JpdGUzMihETUE2X05FWFRfREVTQ19QVFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTZfU1RBUlRfQUREUigpCQliZmluX3JlYWQzMihETUE2X1NUQVJUX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BNl9TVEFSVF9BRERSKHZhbCkJCWJmaW5fd3JpdGUzMihETUE2X1NUQVJUX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTZfWF9DT1VOVCgpCQliZmluX3JlYWQxNihETUE2X1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BNl9YX0NPVU5UKHZhbCkJCWJmaW5fd3JpdGUxNihETUE2X1hfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTZfWV9DT1VOVCgpCQliZmluX3JlYWQxNihETUE2X1lfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BNl9ZX0NPVU5UKHZhbCkJCWJmaW5fd3JpdGUxNihETUE2X1lfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTZfWF9NT0RJRlkoKQkJYmZpbl9yZWFkMTYoRE1BNl9YX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE2X1hfTU9ESUZZKHZhbCkJCWJmaW5fd3JpdGUxNihETUE2X1hfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE2X1lfTU9ESUZZKCkJCWJmaW5fcmVhZDE2KERNQTZfWV9NT0RJRlkpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BNl9ZX01PRElGWSh2YWwpCQliZmluX3dyaXRlMTYoRE1BNl9ZX01PRElGWSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BNl9DVVJSX0RFU0NfUFRSKCkJCWJmaW5fcmVhZDMyKERNQTZfQ1VSUl9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE2X0NVUlJfREVTQ19QVFIodmFsKQliZmluX3dyaXRlMzIoRE1BNl9DVVJSX0RFU0NfUFRSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE2X0NVUlJfQUREUigpCQliZmluX3JlYWQzMihETUE2X0NVUlJfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE2X0NVUlJfQUREUih2YWwpCQliZmluX3dyaXRlMzIoRE1BNl9DVVJSX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTZfQ1VSUl9YX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTZfQ1VSUl9YX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTZfQ1VSUl9YX0NPVU5UKHZhbCkJYmZpbl93cml0ZTE2KERNQTZfQ1VSUl9YX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE2X0NVUlJfWV9DT1VOVCgpCQliZmluX3JlYWQxNihETUE2X0NVUlJfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE2X0NVUlJfWV9DT1VOVCh2YWwpCWJmaW5fd3JpdGUxNihETUE2X0NVUlJfWV9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BNl9JUlFfU1RBVFVTKCkJCWJmaW5fcmVhZDE2KERNQTZfSVJRX1NUQVRVUykKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE2X0lSUV9TVEFUVVModmFsKQkJYmZpbl93cml0ZTE2KERNQTZfSVJRX1NUQVRVUywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BNl9QRVJJUEhFUkFMX01BUCgpCQliZmluX3JlYWQxNihETUE2X1BFUklQSEVSQUxfTUFQKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTZfUEVSSVBIRVJBTF9NQVAodmFsKQliZmluX3dyaXRlMTYoRE1BNl9QRVJJUEhFUkFMX01BUCwgdmFsKQorCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE3X0NPTkZJRygpCQkJYmZpbl9yZWFkMTYoRE1BN19DT05GSUcpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BN19DT05GSUcodmFsKQkJYmZpbl93cml0ZTE2KERNQTdfQ09ORklHLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE3X05FWFRfREVTQ19QVFIoKQkJYmZpbl9yZWFkMzIoRE1BN19ORVhUX0RFU0NfUFRSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTdfTkVYVF9ERVNDX1BUUih2YWwpCWJmaW5fd3JpdGUzMihETUE3X05FWFRfREVTQ19QVFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTdfU1RBUlRfQUREUigpCQliZmluX3JlYWQzMihETUE3X1NUQVJUX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BN19TVEFSVF9BRERSKHZhbCkJCWJmaW5fd3JpdGUzMihETUE3X1NUQVJUX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTdfWF9DT1VOVCgpCQliZmluX3JlYWQxNihETUE3X1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BN19YX0NPVU5UKHZhbCkJCWJmaW5fd3JpdGUxNihETUE3X1hfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTdfWV9DT1VOVCgpCQliZmluX3JlYWQxNihETUE3X1lfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BN19ZX0NPVU5UKHZhbCkJCWJmaW5fd3JpdGUxNihETUE3X1lfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTdfWF9NT0RJRlkoKQkJYmZpbl9yZWFkMTYoRE1BN19YX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE3X1hfTU9ESUZZKHZhbCkJCWJmaW5fd3JpdGUxNihETUE3X1hfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE3X1lfTU9ESUZZKCkJCWJmaW5fcmVhZDE2KERNQTdfWV9NT0RJRlkpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BN19ZX01PRElGWSh2YWwpCQliZmluX3dyaXRlMTYoRE1BN19ZX01PRElGWSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BN19DVVJSX0RFU0NfUFRSKCkJCWJmaW5fcmVhZDMyKERNQTdfQ1VSUl9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE3X0NVUlJfREVTQ19QVFIodmFsKQliZmluX3dyaXRlMzIoRE1BN19DVVJSX0RFU0NfUFRSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE3X0NVUlJfQUREUigpCQliZmluX3JlYWQzMihETUE3X0NVUlJfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE3X0NVUlJfQUREUih2YWwpCQliZmluX3dyaXRlMzIoRE1BN19DVVJSX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTdfQ1VSUl9YX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTdfQ1VSUl9YX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTdfQ1VSUl9YX0NPVU5UKHZhbCkJYmZpbl93cml0ZTE2KERNQTdfQ1VSUl9YX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE3X0NVUlJfWV9DT1VOVCgpCQliZmluX3JlYWQxNihETUE3X0NVUlJfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE3X0NVUlJfWV9DT1VOVCh2YWwpCWJmaW5fd3JpdGUxNihETUE3X0NVUlJfWV9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BN19JUlFfU1RBVFVTKCkJCWJmaW5fcmVhZDE2KERNQTdfSVJRX1NUQVRVUykKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE3X0lSUV9TVEFUVVModmFsKQkJYmZpbl93cml0ZTE2KERNQTdfSVJRX1NUQVRVUywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BN19QRVJJUEhFUkFMX01BUCgpCQliZmluX3JlYWQxNihETUE3X1BFUklQSEVSQUxfTUFQKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTdfUEVSSVBIRVJBTF9NQVAodmFsKQliZmluX3dyaXRlMTYoRE1BN19QRVJJUEhFUkFMX01BUCwgdmFsKQorCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE4X0NPTkZJRygpCQkJYmZpbl9yZWFkMTYoRE1BOF9DT05GSUcpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BOF9DT05GSUcodmFsKQkJYmZpbl93cml0ZTE2KERNQThfQ09ORklHLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE4X05FWFRfREVTQ19QVFIoKQkJYmZpbl9yZWFkMzIoRE1BOF9ORVhUX0RFU0NfUFRSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQThfTkVYVF9ERVNDX1BUUih2YWwpCWJmaW5fd3JpdGUzMihETUE4X05FWFRfREVTQ19QVFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQThfU1RBUlRfQUREUigpCQliZmluX3JlYWQzMihETUE4X1NUQVJUX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BOF9TVEFSVF9BRERSKHZhbCkJCWJmaW5fd3JpdGUzMihETUE4X1NUQVJUX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQThfWF9DT1VOVCgpCQliZmluX3JlYWQxNihETUE4X1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BOF9YX0NPVU5UKHZhbCkJCWJmaW5fd3JpdGUxNihETUE4X1hfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQThfWV9DT1VOVCgpCQliZmluX3JlYWQxNihETUE4X1lfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BOF9ZX0NPVU5UKHZhbCkJCWJmaW5fd3JpdGUxNihETUE4X1lfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQThfWF9NT0RJRlkoKQkJYmZpbl9yZWFkMTYoRE1BOF9YX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE4X1hfTU9ESUZZKHZhbCkJCWJmaW5fd3JpdGUxNihETUE4X1hfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE4X1lfTU9ESUZZKCkJCWJmaW5fcmVhZDE2KERNQThfWV9NT0RJRlkpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BOF9ZX01PRElGWSh2YWwpCQliZmluX3dyaXRlMTYoRE1BOF9ZX01PRElGWSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BOF9DVVJSX0RFU0NfUFRSKCkJCWJmaW5fcmVhZDMyKERNQThfQ1VSUl9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE4X0NVUlJfREVTQ19QVFIodmFsKQliZmluX3dyaXRlMzIoRE1BOF9DVVJSX0RFU0NfUFRSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE4X0NVUlJfQUREUigpCQliZmluX3JlYWQzMihETUE4X0NVUlJfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE4X0NVUlJfQUREUih2YWwpCQliZmluX3dyaXRlMzIoRE1BOF9DVVJSX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQThfQ1VSUl9YX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQThfQ1VSUl9YX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQThfQ1VSUl9YX0NPVU5UKHZhbCkJYmZpbl93cml0ZTE2KERNQThfQ1VSUl9YX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE4X0NVUlJfWV9DT1VOVCgpCQliZmluX3JlYWQxNihETUE4X0NVUlJfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE4X0NVUlJfWV9DT1VOVCh2YWwpCWJmaW5fd3JpdGUxNihETUE4X0NVUlJfWV9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BOF9JUlFfU1RBVFVTKCkJCWJmaW5fcmVhZDE2KERNQThfSVJRX1NUQVRVUykKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE4X0lSUV9TVEFUVVModmFsKQkJYmZpbl93cml0ZTE2KERNQThfSVJRX1NUQVRVUywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BOF9QRVJJUEhFUkFMX01BUCgpCQliZmluX3JlYWQxNihETUE4X1BFUklQSEVSQUxfTUFQKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQThfUEVSSVBIRVJBTF9NQVAodmFsKQliZmluX3dyaXRlMTYoRE1BOF9QRVJJUEhFUkFMX01BUCwgdmFsKQorCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE5X0NPTkZJRygpCQkJYmZpbl9yZWFkMTYoRE1BOV9DT05GSUcpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BOV9DT05GSUcodmFsKQkJYmZpbl93cml0ZTE2KERNQTlfQ09ORklHLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE5X05FWFRfREVTQ19QVFIoKQkJYmZpbl9yZWFkMzIoRE1BOV9ORVhUX0RFU0NfUFRSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTlfTkVYVF9ERVNDX1BUUih2YWwpCWJmaW5fd3JpdGUzMihETUE5X05FWFRfREVTQ19QVFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTlfU1RBUlRfQUREUigpCQliZmluX3JlYWQzMihETUE5X1NUQVJUX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BOV9TVEFSVF9BRERSKHZhbCkJCWJmaW5fd3JpdGUzMihETUE5X1NUQVJUX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTlfWF9DT1VOVCgpCQliZmluX3JlYWQxNihETUE5X1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BOV9YX0NPVU5UKHZhbCkJCWJmaW5fd3JpdGUxNihETUE5X1hfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTlfWV9DT1VOVCgpCQliZmluX3JlYWQxNihETUE5X1lfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BOV9ZX0NPVU5UKHZhbCkJCWJmaW5fd3JpdGUxNihETUE5X1lfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTlfWF9NT0RJRlkoKQkJYmZpbl9yZWFkMTYoRE1BOV9YX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE5X1hfTU9ESUZZKHZhbCkJCWJmaW5fd3JpdGUxNihETUE5X1hfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE5X1lfTU9ESUZZKCkJCWJmaW5fcmVhZDE2KERNQTlfWV9NT0RJRlkpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BOV9ZX01PRElGWSh2YWwpCQliZmluX3dyaXRlMTYoRE1BOV9ZX01PRElGWSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BOV9DVVJSX0RFU0NfUFRSKCkJCWJmaW5fcmVhZDMyKERNQTlfQ1VSUl9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE5X0NVUlJfREVTQ19QVFIodmFsKQliZmluX3dyaXRlMzIoRE1BOV9DVVJSX0RFU0NfUFRSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE5X0NVUlJfQUREUigpCQliZmluX3JlYWQzMihETUE5X0NVUlJfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE5X0NVUlJfQUREUih2YWwpCQliZmluX3dyaXRlMzIoRE1BOV9DVVJSX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTlfQ1VSUl9YX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTlfQ1VSUl9YX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTlfQ1VSUl9YX0NPVU5UKHZhbCkJYmZpbl93cml0ZTE2KERNQTlfQ1VSUl9YX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE5X0NVUlJfWV9DT1VOVCgpCQliZmluX3JlYWQxNihETUE5X0NVUlJfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE5X0NVUlJfWV9DT1VOVCh2YWwpCWJmaW5fd3JpdGUxNihETUE5X0NVUlJfWV9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BOV9JUlFfU1RBVFVTKCkJCWJmaW5fcmVhZDE2KERNQTlfSVJRX1NUQVRVUykKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE5X0lSUV9TVEFUVVModmFsKQkJYmZpbl93cml0ZTE2KERNQTlfSVJRX1NUQVRVUywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BOV9QRVJJUEhFUkFMX01BUCgpCQliZmluX3JlYWQxNihETUE5X1BFUklQSEVSQUxfTUFQKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTlfUEVSSVBIRVJBTF9NQVAodmFsKQliZmluX3dyaXRlMTYoRE1BOV9QRVJJUEhFUkFMX01BUCwgdmFsKQorCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExMF9DT05GSUcoKQkJYmZpbl9yZWFkMTYoRE1BMTBfQ09ORklHKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTEwX0NPTkZJRyh2YWwpCQliZmluX3dyaXRlMTYoRE1BMTBfQ09ORklHLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExMF9ORVhUX0RFU0NfUFRSKCkJCWJmaW5fcmVhZDMyKERNQTEwX05FWFRfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTBfTkVYVF9ERVNDX1BUUih2YWwpCWJmaW5fd3JpdGUzMihETUExMF9ORVhUX0RFU0NfUFRSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExMF9TVEFSVF9BRERSKCkJCWJmaW5fcmVhZDMyKERNQTEwX1NUQVJUX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTBfU1RBUlRfQUREUih2YWwpCWJmaW5fd3JpdGUzMihETUExMF9TVEFSVF9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExMF9YX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTEwX1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTBfWF9DT1VOVCh2YWwpCQliZmluX3dyaXRlMTYoRE1BMTBfWF9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTBfWV9DT1VOVCgpCQliZmluX3JlYWQxNihETUExMF9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTEwX1lfQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KERNQTEwX1lfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTEwX1hfTU9ESUZZKCkJCWJmaW5fcmVhZDE2KERNQTEwX1hfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTEwX1hfTU9ESUZZKHZhbCkJCWJmaW5fd3JpdGUxNihETUExMF9YX01PRElGWSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTBfWV9NT0RJRlkoKQkJYmZpbl9yZWFkMTYoRE1BMTBfWV9NT0RJRlkpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTBfWV9NT0RJRlkodmFsKQkJYmZpbl93cml0ZTE2KERNQTEwX1lfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExMF9DVVJSX0RFU0NfUFRSKCkJCWJmaW5fcmVhZDMyKERNQTEwX0NVUlJfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTBfQ1VSUl9ERVNDX1BUUih2YWwpCWJmaW5fd3JpdGUzMihETUExMF9DVVJSX0RFU0NfUFRSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExMF9DVVJSX0FERFIoKQkJYmZpbl9yZWFkMzIoRE1BMTBfQ1VSUl9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTEwX0NVUlJfQUREUih2YWwpCQliZmluX3dyaXRlMzIoRE1BMTBfQ1VSUl9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExMF9DVVJSX1hfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BMTBfQ1VSUl9YX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTEwX0NVUlJfWF9DT1VOVCh2YWwpCWJmaW5fd3JpdGUxNihETUExMF9DVVJSX1hfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTEwX0NVUlJfWV9DT1VOVCgpCQliZmluX3JlYWQxNihETUExMF9DVVJSX1lfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTBfQ1VSUl9ZX0NPVU5UKHZhbCkJYmZpbl93cml0ZTE2KERNQTEwX0NVUlJfWV9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTBfSVJRX1NUQVRVUygpCQliZmluX3JlYWQxNihETUExMF9JUlFfU1RBVFVTKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTEwX0lSUV9TVEFUVVModmFsKQliZmluX3dyaXRlMTYoRE1BMTBfSVJRX1NUQVRVUywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTBfUEVSSVBIRVJBTF9NQVAoKQliZmluX3JlYWQxNihETUExMF9QRVJJUEhFUkFMX01BUCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExMF9QRVJJUEhFUkFMX01BUCh2YWwpCWJmaW5fd3JpdGUxNihETUExMF9QRVJJUEhFUkFMX01BUCwgdmFsKQorCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExMV9DT05GSUcoKQkJYmZpbl9yZWFkMTYoRE1BMTFfQ09ORklHKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTExX0NPTkZJRyh2YWwpCQliZmluX3dyaXRlMTYoRE1BMTFfQ09ORklHLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExMV9ORVhUX0RFU0NfUFRSKCkJCWJmaW5fcmVhZDMyKERNQTExX05FWFRfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTFfTkVYVF9ERVNDX1BUUih2YWwpCWJmaW5fd3JpdGUzMihETUExMV9ORVhUX0RFU0NfUFRSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExMV9TVEFSVF9BRERSKCkJCWJmaW5fcmVhZDMyKERNQTExX1NUQVJUX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTFfU1RBUlRfQUREUih2YWwpCWJmaW5fd3JpdGUzMihETUExMV9TVEFSVF9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExMV9YX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTExX1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTFfWF9DT1VOVCh2YWwpCQliZmluX3dyaXRlMTYoRE1BMTFfWF9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTFfWV9DT1VOVCgpCQliZmluX3JlYWQxNihETUExMV9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTExX1lfQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KERNQTExX1lfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTExX1hfTU9ESUZZKCkJCWJmaW5fcmVhZDE2KERNQTExX1hfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTExX1hfTU9ESUZZKHZhbCkJCWJmaW5fd3JpdGUxNihETUExMV9YX01PRElGWSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTFfWV9NT0RJRlkoKQkJYmZpbl9yZWFkMTYoRE1BMTFfWV9NT0RJRlkpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTFfWV9NT0RJRlkodmFsKQkJYmZpbl93cml0ZTE2KERNQTExX1lfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExMV9DVVJSX0RFU0NfUFRSKCkJCWJmaW5fcmVhZDMyKERNQTExX0NVUlJfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTFfQ1VSUl9ERVNDX1BUUih2YWwpCWJmaW5fd3JpdGUzMihETUExMV9DVVJSX0RFU0NfUFRSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExMV9DVVJSX0FERFIoKQkJYmZpbl9yZWFkMzIoRE1BMTFfQ1VSUl9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTExX0NVUlJfQUREUih2YWwpCQliZmluX3dyaXRlMzIoRE1BMTFfQ1VSUl9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExMV9DVVJSX1hfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BMTFfQ1VSUl9YX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTExX0NVUlJfWF9DT1VOVCh2YWwpCWJmaW5fd3JpdGUxNihETUExMV9DVVJSX1hfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTExX0NVUlJfWV9DT1VOVCgpCQliZmluX3JlYWQxNihETUExMV9DVVJSX1lfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTFfQ1VSUl9ZX0NPVU5UKHZhbCkJYmZpbl93cml0ZTE2KERNQTExX0NVUlJfWV9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTFfSVJRX1NUQVRVUygpCQliZmluX3JlYWQxNihETUExMV9JUlFfU1RBVFVTKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTExX0lSUV9TVEFUVVModmFsKQliZmluX3dyaXRlMTYoRE1BMTFfSVJRX1NUQVRVUywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTFfUEVSSVBIRVJBTF9NQVAoKQliZmluX3JlYWQxNihETUExMV9QRVJJUEhFUkFMX01BUCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExMV9QRVJJUEhFUkFMX01BUCh2YWwpCWJmaW5fd3JpdGUxNihETUExMV9QRVJJUEhFUkFMX01BUCwgdmFsKQorCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QwX0NPTkZJRygpCQliZmluX3JlYWQxNihNRE1BX0QwX0NPTkZJRykKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QwX0NPTkZJRyh2YWwpCQliZmluX3dyaXRlMTYoTURNQV9EMF9DT05GSUcsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDBfTkVYVF9ERVNDX1BUUigpCWJmaW5fcmVhZDMyKE1ETUFfRDBfTkVYVF9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QwX05FWFRfREVTQ19QVFIodmFsKQliZmluX3dyaXRlMzIoTURNQV9EMF9ORVhUX0RFU0NfUFRSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QwX1NUQVJUX0FERFIoKQkJYmZpbl9yZWFkMzIoTURNQV9EMF9TVEFSVF9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDBfU1RBUlRfQUREUih2YWwpCWJmaW5fd3JpdGUzMihNRE1BX0QwX1NUQVJUX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDBfWF9DT1VOVCgpCQliZmluX3JlYWQxNihNRE1BX0QwX1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMF9YX0NPVU5UKHZhbCkJCWJmaW5fd3JpdGUxNihNRE1BX0QwX1hfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDBfWV9DT1VOVCgpCQliZmluX3JlYWQxNihNRE1BX0QwX1lfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMF9ZX0NPVU5UKHZhbCkJCWJmaW5fd3JpdGUxNihNRE1BX0QwX1lfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDBfWF9NT0RJRlkoKQkJYmZpbl9yZWFkMTYoTURNQV9EMF9YX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QwX1hfTU9ESUZZKHZhbCkJYmZpbl93cml0ZTE2KE1ETUFfRDBfWF9NT0RJRlksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDBfWV9NT0RJRlkoKQkJYmZpbl9yZWFkMTYoTURNQV9EMF9ZX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QwX1lfTU9ESUZZKHZhbCkJYmZpbl93cml0ZTE2KE1ETUFfRDBfWV9NT0RJRlksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDBfQ1VSUl9ERVNDX1BUUigpCWJmaW5fcmVhZDMyKE1ETUFfRDBfQ1VSUl9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QwX0NVUlJfREVTQ19QVFIodmFsKQliZmluX3dyaXRlMzIoTURNQV9EMF9DVVJSX0RFU0NfUFRSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QwX0NVUlJfQUREUigpCQliZmluX3JlYWQzMihNRE1BX0QwX0NVUlJfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QwX0NVUlJfQUREUih2YWwpCWJmaW5fd3JpdGUzMihNRE1BX0QwX0NVUlJfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMF9DVVJSX1hfQ09VTlQoKQliZmluX3JlYWQxNihNRE1BX0QwX0NVUlJfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QwX0NVUlJfWF9DT1VOVCh2YWwpCWJmaW5fd3JpdGUxNihNRE1BX0QwX0NVUlJfWF9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMF9DVVJSX1lfQ09VTlQoKQliZmluX3JlYWQxNihNRE1BX0QwX0NVUlJfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QwX0NVUlJfWV9DT1VOVCh2YWwpCWJmaW5fd3JpdGUxNihNRE1BX0QwX0NVUlJfWV9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMF9JUlFfU1RBVFVTKCkJCWJmaW5fcmVhZDE2KE1ETUFfRDBfSVJRX1NUQVRVUykKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QwX0lSUV9TVEFUVVModmFsKQliZmluX3dyaXRlMTYoTURNQV9EMF9JUlFfU1RBVFVTLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QwX1BFUklQSEVSQUxfTUFQKCkJYmZpbl9yZWFkMTYoTURNQV9EMF9QRVJJUEhFUkFMX01BUCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QwX1BFUklQSEVSQUxfTUFQKHZhbCkJYmZpbl93cml0ZTE2KE1ETUFfRDBfUEVSSVBIRVJBTF9NQVAsIHZhbCkKKworI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMF9DT05GSUcoKQkJYmZpbl9yZWFkMTYoTURNQV9TMF9DT05GSUcpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMF9DT05GSUcodmFsKQkJYmZpbl93cml0ZTE2KE1ETUFfUzBfQ09ORklHLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MwX05FWFRfREVTQ19QVFIoKQliZmluX3JlYWQzMihNRE1BX1MwX05FWFRfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMF9ORVhUX0RFU0NfUFRSKHZhbCkJYmZpbl93cml0ZTMyKE1ETUFfUzBfTkVYVF9ERVNDX1BUUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMF9TVEFSVF9BRERSKCkJCWJmaW5fcmVhZDMyKE1ETUFfUzBfU1RBUlRfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MwX1NUQVJUX0FERFIodmFsKQliZmluX3dyaXRlMzIoTURNQV9TMF9TVEFSVF9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MwX1hfQ09VTlQoKQkJYmZpbl9yZWFkMTYoTURNQV9TMF9YX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzBfWF9DT1VOVCh2YWwpCQliZmluX3dyaXRlMTYoTURNQV9TMF9YX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MwX1lfQ09VTlQoKQkJYmZpbl9yZWFkMTYoTURNQV9TMF9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzBfWV9DT1VOVCh2YWwpCQliZmluX3dyaXRlMTYoTURNQV9TMF9ZX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MwX1hfTU9ESUZZKCkJCWJmaW5fcmVhZDE2KE1ETUFfUzBfWF9NT0RJRlkpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMF9YX01PRElGWSh2YWwpCWJmaW5fd3JpdGUxNihNRE1BX1MwX1hfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MwX1lfTU9ESUZZKCkJCWJmaW5fcmVhZDE2KE1ETUFfUzBfWV9NT0RJRlkpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMF9ZX01PRElGWSh2YWwpCWJmaW5fd3JpdGUxNihNRE1BX1MwX1lfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MwX0NVUlJfREVTQ19QVFIoKQliZmluX3JlYWQzMihNRE1BX1MwX0NVUlJfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMF9DVVJSX0RFU0NfUFRSKHZhbCkJYmZpbl93cml0ZTMyKE1ETUFfUzBfQ1VSUl9ERVNDX1BUUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMF9DVVJSX0FERFIoKQkJYmZpbl9yZWFkMzIoTURNQV9TMF9DVVJSX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMF9DVVJSX0FERFIodmFsKQliZmluX3dyaXRlMzIoTURNQV9TMF9DVVJSX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzBfQ1VSUl9YX0NPVU5UKCkJYmZpbl9yZWFkMTYoTURNQV9TMF9DVVJSX1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMF9DVVJSX1hfQ09VTlQodmFsKQliZmluX3dyaXRlMTYoTURNQV9TMF9DVVJSX1hfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzBfQ1VSUl9ZX0NPVU5UKCkJYmZpbl9yZWFkMTYoTURNQV9TMF9DVVJSX1lfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMF9DVVJSX1lfQ09VTlQodmFsKQliZmluX3dyaXRlMTYoTURNQV9TMF9DVVJSX1lfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzBfSVJRX1NUQVRVUygpCQliZmluX3JlYWQxNihNRE1BX1MwX0lSUV9TVEFUVVMpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMF9JUlFfU1RBVFVTKHZhbCkJYmZpbl93cml0ZTE2KE1ETUFfUzBfSVJRX1NUQVRVUywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMF9QRVJJUEhFUkFMX01BUCgpCWJmaW5fcmVhZDE2KE1ETUFfUzBfUEVSSVBIRVJBTF9NQVApCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMF9QRVJJUEhFUkFMX01BUCh2YWwpCWJmaW5fd3JpdGUxNihNRE1BX1MwX1BFUklQSEVSQUxfTUFQLCB2YWwpCisKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDFfQ09ORklHKCkJCWJmaW5fcmVhZDE2KE1ETUFfRDFfQ09ORklHKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDFfQ09ORklHKHZhbCkJCWJmaW5fd3JpdGUxNihNRE1BX0QxX0NPTkZJRywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMV9ORVhUX0RFU0NfUFRSKCkJYmZpbl9yZWFkMzIoTURNQV9EMV9ORVhUX0RFU0NfUFRSKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDFfTkVYVF9ERVNDX1BUUih2YWwpCWJmaW5fd3JpdGUzMihNRE1BX0QxX05FWFRfREVTQ19QVFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDFfU1RBUlRfQUREUigpCQliZmluX3JlYWQzMihNRE1BX0QxX1NUQVJUX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMV9TVEFSVF9BRERSKHZhbCkJYmZpbl93cml0ZTMyKE1ETUFfRDFfU1RBUlRfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMV9YX0NPVU5UKCkJCWJmaW5fcmVhZDE2KE1ETUFfRDFfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QxX1hfQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KE1ETUFfRDFfWF9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMV9ZX0NPVU5UKCkJCWJmaW5fcmVhZDE2KE1ETUFfRDFfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QxX1lfQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KE1ETUFfRDFfWV9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMV9YX01PRElGWSgpCQliZmluX3JlYWQxNihNRE1BX0QxX1hfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDFfWF9NT0RJRlkodmFsKQliZmluX3dyaXRlMTYoTURNQV9EMV9YX01PRElGWSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMV9ZX01PRElGWSgpCQliZmluX3JlYWQxNihNRE1BX0QxX1lfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDFfWV9NT0RJRlkodmFsKQliZmluX3dyaXRlMTYoTURNQV9EMV9ZX01PRElGWSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMV9DVVJSX0RFU0NfUFRSKCkJYmZpbl9yZWFkMzIoTURNQV9EMV9DVVJSX0RFU0NfUFRSKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDFfQ1VSUl9ERVNDX1BUUih2YWwpCWJmaW5fd3JpdGUzMihNRE1BX0QxX0NVUlJfREVTQ19QVFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDFfQ1VSUl9BRERSKCkJCWJmaW5fcmVhZDMyKE1ETUFfRDFfQ1VSUl9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDFfQ1VSUl9BRERSKHZhbCkJYmZpbl93cml0ZTMyKE1ETUFfRDFfQ1VSUl9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QxX0NVUlJfWF9DT1VOVCgpCWJmaW5fcmVhZDE2KE1ETUFfRDFfQ1VSUl9YX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDFfQ1VSUl9YX0NPVU5UKHZhbCkJYmZpbl93cml0ZTE2KE1ETUFfRDFfQ1VSUl9YX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QxX0NVUlJfWV9DT1VOVCgpCWJmaW5fcmVhZDE2KE1ETUFfRDFfQ1VSUl9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDFfQ1VSUl9ZX0NPVU5UKHZhbCkJYmZpbl93cml0ZTE2KE1ETUFfRDFfQ1VSUl9ZX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QxX0lSUV9TVEFUVVMoKQkJYmZpbl9yZWFkMTYoTURNQV9EMV9JUlFfU1RBVFVTKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDFfSVJRX1NUQVRVUyh2YWwpCWJmaW5fd3JpdGUxNihNRE1BX0QxX0lSUV9TVEFUVVMsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDFfUEVSSVBIRVJBTF9NQVAoKQliZmluX3JlYWQxNihNRE1BX0QxX1BFUklQSEVSQUxfTUFQKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDFfUEVSSVBIRVJBTF9NQVAodmFsKQliZmluX3dyaXRlMTYoTURNQV9EMV9QRVJJUEhFUkFMX01BUCwgdmFsKQorCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MxX0NPTkZJRygpCQliZmluX3JlYWQxNihNRE1BX1MxX0NPTkZJRykKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MxX0NPTkZJRyh2YWwpCQliZmluX3dyaXRlMTYoTURNQV9TMV9DT05GSUcsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzFfTkVYVF9ERVNDX1BUUigpCWJmaW5fcmVhZDMyKE1ETUFfUzFfTkVYVF9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MxX05FWFRfREVTQ19QVFIodmFsKQliZmluX3dyaXRlMzIoTURNQV9TMV9ORVhUX0RFU0NfUFRSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MxX1NUQVJUX0FERFIoKQkJYmZpbl9yZWFkMzIoTURNQV9TMV9TVEFSVF9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzFfU1RBUlRfQUREUih2YWwpCWJmaW5fd3JpdGUzMihNRE1BX1MxX1NUQVJUX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzFfWF9DT1VOVCgpCQliZmluX3JlYWQxNihNRE1BX1MxX1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMV9YX0NPVU5UKHZhbCkJCWJmaW5fd3JpdGUxNihNRE1BX1MxX1hfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzFfWV9DT1VOVCgpCQliZmluX3JlYWQxNihNRE1BX1MxX1lfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMV9ZX0NPVU5UKHZhbCkJCWJmaW5fd3JpdGUxNihNRE1BX1MxX1lfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzFfWF9NT0RJRlkoKQkJYmZpbl9yZWFkMTYoTURNQV9TMV9YX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MxX1hfTU9ESUZZKHZhbCkJYmZpbl93cml0ZTE2KE1ETUFfUzFfWF9NT0RJRlksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzFfWV9NT0RJRlkoKQkJYmZpbl9yZWFkMTYoTURNQV9TMV9ZX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MxX1lfTU9ESUZZKHZhbCkJYmZpbl93cml0ZTE2KE1ETUFfUzFfWV9NT0RJRlksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzFfQ1VSUl9ERVNDX1BUUigpCWJmaW5fcmVhZDMyKE1ETUFfUzFfQ1VSUl9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MxX0NVUlJfREVTQ19QVFIodmFsKQliZmluX3dyaXRlMzIoTURNQV9TMV9DVVJSX0RFU0NfUFRSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MxX0NVUlJfQUREUigpCQliZmluX3JlYWQzMihNRE1BX1MxX0NVUlJfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MxX0NVUlJfQUREUih2YWwpCWJmaW5fd3JpdGUzMihNRE1BX1MxX0NVUlJfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMV9DVVJSX1hfQ09VTlQoKQliZmluX3JlYWQxNihNRE1BX1MxX0NVUlJfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MxX0NVUlJfWF9DT1VOVCh2YWwpCWJmaW5fd3JpdGUxNihNRE1BX1MxX0NVUlJfWF9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMV9DVVJSX1lfQ09VTlQoKQliZmluX3JlYWQxNihNRE1BX1MxX0NVUlJfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MxX0NVUlJfWV9DT1VOVCh2YWwpCWJmaW5fd3JpdGUxNihNRE1BX1MxX0NVUlJfWV9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMV9JUlFfU1RBVFVTKCkJCWJmaW5fcmVhZDE2KE1ETUFfUzFfSVJRX1NUQVRVUykKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MxX0lSUV9TVEFUVVModmFsKQliZmluX3dyaXRlMTYoTURNQV9TMV9JUlFfU1RBVFVTLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MxX1BFUklQSEVSQUxfTUFQKCkJYmZpbl9yZWFkMTYoTURNQV9TMV9QRVJJUEhFUkFMX01BUCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MxX1BFUklQSEVSQUxfTUFQKHZhbCkJYmZpbl93cml0ZTE2KE1ETUFfUzFfUEVSSVBIRVJBTF9NQVAsIHZhbCkKKworCisvKiBQYXJhbGxlbCBQZXJpcGhlcmFsIEludGVyZmFjZSAoMHhGRkMwMTAwMCAtIDB4RkZDMDEwRkYpCQkJCQkJCSovCisjZGVmaW5lIGJmaW5fcmVhZF9QUElfQ09OVFJPTCgpCQkJYmZpbl9yZWFkMTYoUFBJX0NPTlRST0wpCisjZGVmaW5lIGJmaW5fd3JpdGVfUFBJX0NPTlRST0wodmFsKQkJYmZpbl93cml0ZTE2KFBQSV9DT05UUk9MLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QUElfU1RBVFVTKCkJCQliZmluX3JlYWQxNihQUElfU1RBVFVTKQorI2RlZmluZSBiZmluX3dyaXRlX1BQSV9TVEFUVVModmFsKQkJYmZpbl93cml0ZTE2KFBQSV9TVEFUVVMsIHZhbCkKKyNkZWZpbmUgYmZpbl9jbGVhcl9QUElfU1RBVFVTKCkJCQliZmluX3dyaXRlX1BQSV9TVEFUVVMoMHhGRkZGKQorI2RlZmluZSBiZmluX3JlYWRfUFBJX0RFTEFZKCkJCQliZmluX3JlYWQxNihQUElfREVMQVkpCisjZGVmaW5lIGJmaW5fd3JpdGVfUFBJX0RFTEFZKHZhbCkJCWJmaW5fd3JpdGUxNihQUElfREVMQVksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BQSV9DT1VOVCgpCQkJYmZpbl9yZWFkMTYoUFBJX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX1BQSV9DT1VOVCh2YWwpCQliZmluX3dyaXRlMTYoUFBJX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QUElfRlJBTUUoKQkJCWJmaW5fcmVhZDE2KFBQSV9GUkFNRSkKKyNkZWZpbmUgYmZpbl93cml0ZV9QUElfRlJBTUUodmFsKQkJYmZpbl93cml0ZTE2KFBQSV9GUkFNRSwgdmFsKQorCisKKy8qIFR3by1XaXJlIEludGVyZmFjZQkJKDB4RkZDMDE0MDAgLSAweEZGQzAxNEZGKQkJCQkJCQkJKi8KKworLyogR2VuZXJhbCBQdXJwb3NlIEkvTyBQb3J0IEcgKDB4RkZDMDE1MDAgLSAweEZGQzAxNUZGKQkJCQkJCQkJKi8KKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRHSU8oKQkJCWJmaW5fcmVhZDE2KFBPUlRHSU8pCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEdJTyh2YWwpCQkJYmZpbl93cml0ZTE2KFBPUlRHSU8sIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRHSU9fQ0xFQVIoKQkJYmZpbl9yZWFkMTYoUE9SVEdJT19DTEVBUikKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JUR0lPX0NMRUFSKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JUR0lPX0NMRUFSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JUR0lPX1NFVCgpCQkJYmZpbl9yZWFkMTYoUE9SVEdJT19TRVQpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEdJT19TRVQodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRHSU9fU0VULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JUR0lPX1RPR0dMRSgpCQliZmluX3JlYWQxNihQT1JUR0lPX1RPR0dMRSkKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JUR0lPX1RPR0dMRSh2YWwpCQliZmluX3dyaXRlMTYoUE9SVEdJT19UT0dHTEUsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRHSU9fTUFTS0EoKQkJYmZpbl9yZWFkMTYoUE9SVEdJT19NQVNLQSkKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JUR0lPX01BU0tBKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JUR0lPX01BU0tBLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JUR0lPX01BU0tBX0NMRUFSKCkJCWJmaW5fcmVhZDE2KFBPUlRHSU9fTUFTS0FfQ0xFQVIpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEdJT19NQVNLQV9DTEVBUih2YWwpCWJmaW5fd3JpdGUxNihQT1JUR0lPX01BU0tBX0NMRUFSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JUR0lPX01BU0tBX1NFVCgpCQliZmluX3JlYWQxNihQT1JUR0lPX01BU0tBX1NFVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JUR0lPX01BU0tBX1NFVCh2YWwpCWJmaW5fd3JpdGUxNihQT1JUR0lPX01BU0tBX1NFVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEdJT19NQVNLQV9UT0dHTEUoKQliZmluX3JlYWQxNihQT1JUR0lPX01BU0tBX1RPR0dMRSkKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JUR0lPX01BU0tBX1RPR0dMRSh2YWwpCWJmaW5fd3JpdGUxNihQT1JUR0lPX01BU0tBX1RPR0dMRSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEdJT19NQVNLQigpCQliZmluX3JlYWQxNihQT1JUR0lPX01BU0tCKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRHSU9fTUFTS0IodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRHSU9fTUFTS0IsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRHSU9fTUFTS0JfQ0xFQVIoKQkJYmZpbl9yZWFkMTYoUE9SVEdJT19NQVNLQl9DTEVBUikKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JUR0lPX01BU0tCX0NMRUFSKHZhbCkJYmZpbl93cml0ZTE2KFBPUlRHSU9fTUFTS0JfQ0xFQVIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRHSU9fTUFTS0JfU0VUKCkJCWJmaW5fcmVhZDE2KFBPUlRHSU9fTUFTS0JfU0VUKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRHSU9fTUFTS0JfU0VUKHZhbCkJYmZpbl93cml0ZTE2KFBPUlRHSU9fTUFTS0JfU0VULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JUR0lPX01BU0tCX1RPR0dMRSgpCWJmaW5fcmVhZDE2KFBPUlRHSU9fTUFTS0JfVE9HR0xFKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRHSU9fTUFTS0JfVE9HR0xFKHZhbCkJYmZpbl93cml0ZTE2KFBPUlRHSU9fTUFTS0JfVE9HR0xFLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JUR0lPX0RJUigpCQkJYmZpbl9yZWFkMTYoUE9SVEdJT19ESVIpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEdJT19ESVIodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRHSU9fRElSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JUR0lPX1BPTEFSKCkJCWJmaW5fcmVhZDE2KFBPUlRHSU9fUE9MQVIpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEdJT19QT0xBUih2YWwpCQliZmluX3dyaXRlMTYoUE9SVEdJT19QT0xBUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEdJT19FREdFKCkJCWJmaW5fcmVhZDE2KFBPUlRHSU9fRURHRSkKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JUR0lPX0VER0UodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRHSU9fRURHRSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEdJT19CT1RIKCkJCWJmaW5fcmVhZDE2KFBPUlRHSU9fQk9USCkKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JUR0lPX0JPVEgodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRHSU9fQk9USCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEdJT19JTkVOKCkJCWJmaW5fcmVhZDE2KFBPUlRHSU9fSU5FTikKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JUR0lPX0lORU4odmFsKQkJYmZpbl93cml0ZTE2KFBPUlRHSU9fSU5FTiwgdmFsKQorCisKKy8qIEdlbmVyYWwgUHVycG9zZSBJL08gUG9ydCBIICgweEZGQzAxNzAwIC0gMHhGRkMwMTdGRikJCQkJCQkJCSovCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JUSElPKCkJCQliZmluX3JlYWQxNihQT1JUSElPKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRISU8odmFsKQkJCWJmaW5fd3JpdGUxNihQT1JUSElPLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JUSElPX0NMRUFSKCkJCWJmaW5fcmVhZDE2KFBPUlRISU9fQ0xFQVIpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEhJT19DTEVBUih2YWwpCQliZmluX3dyaXRlMTYoUE9SVEhJT19DTEVBUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEhJT19TRVQoKQkJCWJmaW5fcmVhZDE2KFBPUlRISU9fU0VUKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRISU9fU0VUKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JUSElPX1NFVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEhJT19UT0dHTEUoKQkJYmZpbl9yZWFkMTYoUE9SVEhJT19UT0dHTEUpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEhJT19UT0dHTEUodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRISU9fVE9HR0xFLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JUSElPX01BU0tBKCkJCWJmaW5fcmVhZDE2KFBPUlRISU9fTUFTS0EpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEhJT19NQVNLQSh2YWwpCQliZmluX3dyaXRlMTYoUE9SVEhJT19NQVNLQSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEhJT19NQVNLQV9DTEVBUigpCQliZmluX3JlYWQxNihQT1JUSElPX01BU0tBX0NMRUFSKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRISU9fTUFTS0FfQ0xFQVIodmFsKQliZmluX3dyaXRlMTYoUE9SVEhJT19NQVNLQV9DTEVBUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEhJT19NQVNLQV9TRVQoKQkJYmZpbl9yZWFkMTYoUE9SVEhJT19NQVNLQV9TRVQpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEhJT19NQVNLQV9TRVQodmFsKQliZmluX3dyaXRlMTYoUE9SVEhJT19NQVNLQV9TRVQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRISU9fTUFTS0FfVE9HR0xFKCkJYmZpbl9yZWFkMTYoUE9SVEhJT19NQVNLQV9UT0dHTEUpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEhJT19NQVNLQV9UT0dHTEUodmFsKQliZmluX3dyaXRlMTYoUE9SVEhJT19NQVNLQV9UT0dHTEUsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRISU9fTUFTS0IoKQkJYmZpbl9yZWFkMTYoUE9SVEhJT19NQVNLQikKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JUSElPX01BU0tCKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JUSElPX01BU0tCLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JUSElPX01BU0tCX0NMRUFSKCkJCWJmaW5fcmVhZDE2KFBPUlRISU9fTUFTS0JfQ0xFQVIpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEhJT19NQVNLQl9DTEVBUih2YWwpCWJmaW5fd3JpdGUxNihQT1JUSElPX01BU0tCX0NMRUFSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JUSElPX01BU0tCX1NFVCgpCQliZmluX3JlYWQxNihQT1JUSElPX01BU0tCX1NFVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JUSElPX01BU0tCX1NFVCh2YWwpCWJmaW5fd3JpdGUxNihQT1JUSElPX01BU0tCX1NFVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEhJT19NQVNLQl9UT0dHTEUoKQliZmluX3JlYWQxNihQT1JUSElPX01BU0tCX1RPR0dMRSkKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JUSElPX01BU0tCX1RPR0dMRSh2YWwpCWJmaW5fd3JpdGUxNihQT1JUSElPX01BU0tCX1RPR0dMRSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEhJT19ESVIoKQkJCWJmaW5fcmVhZDE2KFBPUlRISU9fRElSKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRISU9fRElSKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JUSElPX0RJUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEhJT19QT0xBUigpCQliZmluX3JlYWQxNihQT1JUSElPX1BPTEFSKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRISU9fUE9MQVIodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRISU9fUE9MQVIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRISU9fRURHRSgpCQliZmluX3JlYWQxNihQT1JUSElPX0VER0UpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEhJT19FREdFKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JUSElPX0VER0UsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRISU9fQk9USCgpCQliZmluX3JlYWQxNihQT1JUSElPX0JPVEgpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEhJT19CT1RIKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JUSElPX0JPVEgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRISU9fSU5FTigpCQliZmluX3JlYWQxNihQT1JUSElPX0lORU4pCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEhJT19JTkVOKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JUSElPX0lORU4sIHZhbCkKKworCisvKiBVQVJUMSBDb250cm9sbGVyCQkoMHhGRkMwMjAwMCAtIDB4RkZDMDIwRkYpCQkJCQkJCQkqLworI2RlZmluZSBiZmluX3JlYWRfVUFSVDFfVEhSKCkJCQliZmluX3JlYWQxNihVQVJUMV9USFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfVUFSVDFfVEhSKHZhbCkJCWJmaW5fd3JpdGUxNihVQVJUMV9USFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1VBUlQxX1JCUigpCQkJYmZpbl9yZWFkMTYoVUFSVDFfUkJSKQorI2RlZmluZSBiZmluX3dyaXRlX1VBUlQxX1JCUih2YWwpCQliZmluX3dyaXRlMTYoVUFSVDFfUkJSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9VQVJUMV9ETEwoKQkJCWJmaW5fcmVhZDE2KFVBUlQxX0RMTCkKKyNkZWZpbmUgYmZpbl93cml0ZV9VQVJUMV9ETEwodmFsKQkJYmZpbl93cml0ZTE2KFVBUlQxX0RMTCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVUFSVDFfSUVSKCkJCQliZmluX3JlYWQxNihVQVJUMV9JRVIpCisjZGVmaW5lIGJmaW5fd3JpdGVfVUFSVDFfSUVSKHZhbCkJCWJmaW5fd3JpdGUxNihVQVJUMV9JRVIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1VBUlQxX0RMSCgpCQkJYmZpbl9yZWFkMTYoVUFSVDFfRExIKQorI2RlZmluZSBiZmluX3dyaXRlX1VBUlQxX0RMSCh2YWwpCQliZmluX3dyaXRlMTYoVUFSVDFfRExILCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9VQVJUMV9JSVIoKQkJCWJmaW5fcmVhZDE2KFVBUlQxX0lJUikKKyNkZWZpbmUgYmZpbl93cml0ZV9VQVJUMV9JSVIodmFsKQkJYmZpbl93cml0ZTE2KFVBUlQxX0lJUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVUFSVDFfTENSKCkJCQliZmluX3JlYWQxNihVQVJUMV9MQ1IpCisjZGVmaW5lIGJmaW5fd3JpdGVfVUFSVDFfTENSKHZhbCkJCWJmaW5fd3JpdGUxNihVQVJUMV9MQ1IsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1VBUlQxX01DUigpCQkJYmZpbl9yZWFkMTYoVUFSVDFfTUNSKQorI2RlZmluZSBiZmluX3dyaXRlX1VBUlQxX01DUih2YWwpCQliZmluX3dyaXRlMTYoVUFSVDFfTUNSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9VQVJUMV9MU1IoKQkJCWJmaW5fcmVhZDE2KFVBUlQxX0xTUikKKyNkZWZpbmUgYmZpbl93cml0ZV9VQVJUMV9MU1IodmFsKQkJYmZpbl93cml0ZTE2KFVBUlQxX0xTUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVUFSVDFfTVNSKCkJCQliZmluX3JlYWQxNihVQVJUMV9NU1IpCisjZGVmaW5lIGJmaW5fd3JpdGVfVUFSVDFfTVNSKHZhbCkJCWJmaW5fd3JpdGUxNihVQVJUMV9NU1IsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1VBUlQxX1NDUigpCQkJYmZpbl9yZWFkMTYoVUFSVDFfU0NSKQorI2RlZmluZSBiZmluX3dyaXRlX1VBUlQxX1NDUih2YWwpCQliZmluX3dyaXRlMTYoVUFSVDFfU0NSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9VQVJUMV9HQ1RMKCkJCQliZmluX3JlYWQxNihVQVJUMV9HQ1RMKQorI2RlZmluZSBiZmluX3dyaXRlX1VBUlQxX0dDVEwodmFsKQkJYmZpbl93cml0ZTE2KFVBUlQxX0dDVEwsIHZhbCkKKworLyogT21pdCBDQU4gcmVnaXN0ZXIgc2V0cyBmcm9tIHRoZSBjZGVmQkY1MzQuaCAoQ0FOIGlzIG5vdCBpbiB0aGUgQURTUC1CRjUyeCBwcm9jZXNzb3IpICovCisKKy8qIFBpbiBDb250cm9sIFJlZ2lzdGVycwkoMHhGRkMwMzIwMCAtIDB4RkZDMDMyRkYpCQkJCQkJCQkqLworI2RlZmluZSBiZmluX3JlYWRfUE9SVEZfRkVSKCkJCQliZmluX3JlYWQxNihQT1JURl9GRVIpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEZfRkVSKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JURl9GRVIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRHX0ZFUigpCQkJYmZpbl9yZWFkMTYoUE9SVEdfRkVSKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRHX0ZFUih2YWwpCQliZmluX3dyaXRlMTYoUE9SVEdfRkVSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JUSF9GRVIoKQkJCWJmaW5fcmVhZDE2KFBPUlRIX0ZFUikKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JUSF9GRVIodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRIX0ZFUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVF9NVVgoKQkJCWJmaW5fcmVhZDE2KFBPUlRfTVVYKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRfTVVYKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JUX01VWCwgdmFsKQorCisKKy8qIEhhbmRzaGFrZSBNRE1BIFJlZ2lzdGVycwkoMHhGRkMwMzMwMCAtIDB4RkZDMDMzRkYpCQkJCQkJCQkqLworI2RlZmluZSBiZmluX3JlYWRfSE1ETUEwX0NPTlRST0woKQkJYmZpbl9yZWFkMTYoSE1ETUEwX0NPTlRST0wpCisjZGVmaW5lIGJmaW5fd3JpdGVfSE1ETUEwX0NPTlRST0wodmFsKQkJYmZpbl93cml0ZTE2KEhNRE1BMF9DT05UUk9MLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ITURNQTBfRUNJTklUKCkJCWJmaW5fcmVhZDE2KEhNRE1BMF9FQ0lOSVQpCisjZGVmaW5lIGJmaW5fd3JpdGVfSE1ETUEwX0VDSU5JVCh2YWwpCQliZmluX3dyaXRlMTYoSE1ETUEwX0VDSU5JVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfSE1ETUEwX0JDSU5JVCgpCQliZmluX3JlYWQxNihITURNQTBfQkNJTklUKQorI2RlZmluZSBiZmluX3dyaXRlX0hNRE1BMF9CQ0lOSVQodmFsKQkJYmZpbl93cml0ZTE2KEhNRE1BMF9CQ0lOSVQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0hNRE1BMF9FQ1VSR0VOVCgpCQliZmluX3JlYWQxNihITURNQTBfRUNVUkdFTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfSE1ETUEwX0VDVVJHRU5UKHZhbCkJCWJmaW5fd3JpdGUxNihITURNQTBfRUNVUkdFTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0hNRE1BMF9FQ09WRVJGTE9XKCkJCWJmaW5fcmVhZDE2KEhNRE1BMF9FQ09WRVJGTE9XKQorI2RlZmluZSBiZmluX3dyaXRlX0hNRE1BMF9FQ09WRVJGTE9XKHZhbCkJYmZpbl93cml0ZTE2KEhNRE1BMF9FQ09WRVJGTE9XLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ITURNQTBfRUNPVU5UKCkJCWJmaW5fcmVhZDE2KEhNRE1BMF9FQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfSE1ETUEwX0VDT1VOVCh2YWwpCQliZmluX3dyaXRlMTYoSE1ETUEwX0VDT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfSE1ETUEwX0JDT1VOVCgpCQliZmluX3JlYWQxNihITURNQTBfQkNPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0hNRE1BMF9CQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KEhNRE1BMF9CQ09VTlQsIHZhbCkKKworI2RlZmluZSBiZmluX3JlYWRfSE1ETUExX0NPTlRST0woKQkJYmZpbl9yZWFkMTYoSE1ETUExX0NPTlRST0wpCisjZGVmaW5lIGJmaW5fd3JpdGVfSE1ETUExX0NPTlRST0wodmFsKQkJYmZpbl93cml0ZTE2KEhNRE1BMV9DT05UUk9MLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ITURNQTFfRUNJTklUKCkJCWJmaW5fcmVhZDE2KEhNRE1BMV9FQ0lOSVQpCisjZGVmaW5lIGJmaW5fd3JpdGVfSE1ETUExX0VDSU5JVCh2YWwpCQliZmluX3dyaXRlMTYoSE1ETUExX0VDSU5JVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfSE1ETUExX0JDSU5JVCgpCQliZmluX3JlYWQxNihITURNQTFfQkNJTklUKQorI2RlZmluZSBiZmluX3dyaXRlX0hNRE1BMV9CQ0lOSVQodmFsKQkJYmZpbl93cml0ZTE2KEhNRE1BMV9CQ0lOSVQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0hNRE1BMV9FQ1VSR0VOVCgpCQliZmluX3JlYWQxNihITURNQTFfRUNVUkdFTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfSE1ETUExX0VDVVJHRU5UKHZhbCkJCWJmaW5fd3JpdGUxNihITURNQTFfRUNVUkdFTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0hNRE1BMV9FQ09WRVJGTE9XKCkJCWJmaW5fcmVhZDE2KEhNRE1BMV9FQ09WRVJGTE9XKQorI2RlZmluZSBiZmluX3dyaXRlX0hNRE1BMV9FQ09WRVJGTE9XKHZhbCkJYmZpbl93cml0ZTE2KEhNRE1BMV9FQ09WRVJGTE9XLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ITURNQTFfRUNPVU5UKCkJCWJmaW5fcmVhZDE2KEhNRE1BMV9FQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfSE1ETUExX0VDT1VOVCh2YWwpCQliZmluX3dyaXRlMTYoSE1ETUExX0VDT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfSE1ETUExX0JDT1VOVCgpCQliZmluX3JlYWQxNihITURNQTFfQkNPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0hNRE1BMV9CQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KEhNRE1BMV9CQ09VTlQsIHZhbCkKKworLyogPT09PSBlbmQgZnJvbSBjZGVmQkY1MzQuaCA9PT09ICovCisKKy8qIEdQSU8gUElOIG11eCAoMHhGRkMwMzIxMCAtIE94RkZDMDMyODgpICovCisKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRGX01VWCgpCQkJYmZpbl9yZWFkMTYoUE9SVEZfTVVYKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRGX01VWCh2YWwpCQliZmluX3dyaXRlMTYoUE9SVEZfTVVYLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JUR19NVVgoKQkJCWJmaW5fcmVhZDE2KFBPUlRHX01VWCkKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JUR19NVVgodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRHX01VWCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEhfTVVYKCkJCQliZmluX3JlYWQxNihQT1JUSF9NVVgpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEhfTVVYKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JUSF9NVVgsIHZhbCkKKworI2RlZmluZSBiZmluX3JlYWRfUE9SVEZfRFJJVkUoKQkJCWJmaW5fcmVhZDE2KFBPUlRGX0RSSVZFKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRGX0RSSVZFKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JURl9EUklWRSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEdfRFJJVkUoKQkJCWJmaW5fcmVhZDE2KFBPUlRHX0RSSVZFKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRHX0RSSVZFKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JUR19EUklWRSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEhfRFJJVkUoKQkJCWJmaW5fcmVhZDE2KFBPUlRIX0RSSVZFKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRIX0RSSVZFKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JUSF9EUklWRSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEZfU0xFVygpCQkJYmZpbl9yZWFkMTYoUE9SVEZfU0xFVykKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JURl9TTEVXKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JURl9TTEVXLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JUR19TTEVXKCkJCQliZmluX3JlYWQxNihQT1JUR19TTEVXKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRHX1NMRVcodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRHX1NMRVcsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRIX1NMRVcoKQkJCWJmaW5fcmVhZDE2KFBPUlRIX1NMRVcpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEhfU0xFVyh2YWwpCQliZmluX3dyaXRlMTYoUE9SVEhfU0xFVywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEZfSFlTVEVSSVNJUygpCQliZmluX3JlYWQxNihQT1JURl9IWVNURVJJU0lTKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRGX0hZU1RFUklTSVModmFsKQliZmluX3dyaXRlMTYoUE9SVEZfSFlTVEVSSVNJUywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEdfSFlTVEVSSVNJUygpCQliZmluX3JlYWQxNihQT1JUR19IWVNURVJJU0lTKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRHX0hZU1RFUklTSVModmFsKQliZmluX3dyaXRlMTYoUE9SVEdfSFlTVEVSSVNJUywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEhfSFlTVEVSSVNJUygpCQliZmluX3JlYWQxNihQT1JUSF9IWVNURVJJU0lTKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRIX0hZU1RFUklTSVModmFsKQliZmluX3dyaXRlMTYoUE9SVEhfSFlTVEVSSVNJUywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTUlTQ1BPUlRfRFJJVkUoKQkJYmZpbl9yZWFkMTYoTUlTQ1BPUlRfRFJJVkUpCisjZGVmaW5lIGJmaW5fd3JpdGVfTUlTQ1BPUlRfRFJJVkUodmFsKQkJYmZpbl93cml0ZTE2KE1JU0NQT1JUX0RSSVZFLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NSVNDUE9SVF9TTEVXKCkJCWJmaW5fcmVhZDE2KE1JU0NQT1JUX1NMRVcpCisjZGVmaW5lIGJmaW5fd3JpdGVfTUlTQ1BPUlRfU0xFVyh2YWwpCQliZmluX3dyaXRlMTYoTUlTQ1BPUlRfU0xFVywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTUlTQ1BPUlRfSFlTVEVSSVNJUygpCQliZmluX3JlYWQxNihNSVNDUE9SVF9IWVNURVJJU0lTKQorI2RlZmluZSBiZmluX3dyaXRlX01JU0NQT1JUX0hZU1RFUklTSVModmFsKQliZmluX3dyaXRlMTYoTUlTQ1BPUlRfSFlTVEVSSVNJUywgdmFsKQorCisvKiBIT1NUIFBvcnQgUmVnaXN0ZXJzICovCisKKyNkZWZpbmUgYmZpbl9yZWFkX0hPU1RfQ09OVFJPTCgpCQliZmluX3JlYWQxNihIT1NUX0NPTlRST0wpCisjZGVmaW5lIGJmaW5fd3JpdGVfSE9TVF9DT05UUk9MKHZhbCkJCWJmaW5fd3JpdGUxNihIT1NUX0NPTlRST0wsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0hPU1RfU1RBVFVTKCkJCQliZmluX3JlYWQxNihIT1NUX1NUQVRVUykKKyNkZWZpbmUgYmZpbl93cml0ZV9IT1NUX1NUQVRVUyh2YWwpCQliZmluX3dyaXRlMTYoSE9TVF9TVEFUVVMsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0hPU1RfVElNRU9VVCgpCQliZmluX3JlYWQxNihIT1NUX1RJTUVPVVQpCisjZGVmaW5lIGJmaW5fd3JpdGVfSE9TVF9USU1FT1VUKHZhbCkJCWJmaW5fd3JpdGUxNihIT1NUX1RJTUVPVVQsIHZhbCkKKworLyogQ291bnRlciBSZWdpc3RlcnMgKi8KKworI2RlZmluZSBiZmluX3JlYWRfQ05UX0NPTkZJRygpCQkJYmZpbl9yZWFkMTYoQ05UX0NPTkZJRykKKyNkZWZpbmUgYmZpbl93cml0ZV9DTlRfQ09ORklHKHZhbCkJCWJmaW5fd3JpdGUxNihDTlRfQ09ORklHLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DTlRfSU1BU0soKQkJCWJmaW5fcmVhZDE2KENOVF9JTUFTSykKKyNkZWZpbmUgYmZpbl93cml0ZV9DTlRfSU1BU0sodmFsKQkJYmZpbl93cml0ZTE2KENOVF9JTUFTSywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ05UX1NUQVRVUygpCQkJYmZpbl9yZWFkMTYoQ05UX1NUQVRVUykKKyNkZWZpbmUgYmZpbl93cml0ZV9DTlRfU1RBVFVTKHZhbCkJCWJmaW5fd3JpdGUxNihDTlRfU1RBVFVTLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DTlRfQ09NTUFORCgpCQkJYmZpbl9yZWFkMTYoQ05UX0NPTU1BTkQpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ05UX0NPTU1BTkQodmFsKQkJYmZpbl93cml0ZTE2KENOVF9DT01NQU5ELCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DTlRfREVCT1VOQ0UoKQkJYmZpbl9yZWFkMTYoQ05UX0RFQk9VTkNFKQorI2RlZmluZSBiZmluX3dyaXRlX0NOVF9ERUJPVU5DRSh2YWwpCQliZmluX3dyaXRlMTYoQ05UX0RFQk9VTkNFLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DTlRfQ09VTlRFUigpCQkJYmZpbl9yZWFkMzIoQ05UX0NPVU5URVIpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ05UX0NPVU5URVIodmFsKQkJYmZpbl93cml0ZTMyKENOVF9DT1VOVEVSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DTlRfTUFYKCkJCQliZmluX3JlYWQzMihDTlRfTUFYKQorI2RlZmluZSBiZmluX3dyaXRlX0NOVF9NQVgodmFsKQkJCWJmaW5fd3JpdGUzMihDTlRfTUFYLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DTlRfTUlOKCkJCQliZmluX3JlYWQzMihDTlRfTUlOKQorI2RlZmluZSBiZmluX3dyaXRlX0NOVF9NSU4odmFsKQkJCWJmaW5fd3JpdGUzMihDTlRfTUlOLCB2YWwpCisKKy8qIFNlY3VyaXR5IFJlZ2lzdGVycyAqLworCisjZGVmaW5lIGJmaW5fcmVhZF9TRUNVUkVfU1lTU1dUKCkJCWJmaW5fcmVhZDMyKFNFQ1VSRV9TWVNTV1QpCisjZGVmaW5lIGJmaW5fd3JpdGVfU0VDVVJFX1NZU1NXVCh2YWwpCQliZmluX3dyaXRlMzIoU0VDVVJFX1NZU1NXVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU0VDVVJFX0NPTlRST0woKQkJYmZpbl9yZWFkMTYoU0VDVVJFX0NPTlRST0wpCisjZGVmaW5lIGJmaW5fd3JpdGVfU0VDVVJFX0NPTlRST0wodmFsKQkJYmZpbl93cml0ZTE2KFNFQ1VSRV9DT05UUk9MLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TRUNVUkVfU1RBVFVTKCkJCWJmaW5fcmVhZDE2KFNFQ1VSRV9TVEFUVVMpCisjZGVmaW5lIGJmaW5fd3JpdGVfU0VDVVJFX1NUQVRVUyh2YWwpCQliZmluX3dyaXRlMTYoU0VDVVJFX1NUQVRVUywgdmFsKQorCisvKiBORkMgUmVnaXN0ZXJzICovCisKKyNkZWZpbmUgYmZpbl9yZWFkX05GQ19DVEwoKQkJCWJmaW5fcmVhZDE2KE5GQ19DVEwpCisjZGVmaW5lIGJmaW5fd3JpdGVfTkZDX0NUTCh2YWwpCQkJYmZpbl93cml0ZTE2KE5GQ19DVEwsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX05GQ19TVEFUKCkJCQliZmluX3JlYWQxNihORkNfU1RBVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ORkNfU1RBVCh2YWwpCQliZmluX3dyaXRlMTYoTkZDX1NUQVQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX05GQ19JUlFTVEFUKCkJCQliZmluX3JlYWQxNihORkNfSVJRU1RBVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ORkNfSVJRU1RBVCh2YWwpCQliZmluX3dyaXRlMTYoTkZDX0lSUVNUQVQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX05GQ19JUlFNQVNLKCkJCQliZmluX3JlYWQxNihORkNfSVJRTUFTSykKKyNkZWZpbmUgYmZpbl93cml0ZV9ORkNfSVJRTUFTSyh2YWwpCQliZmluX3dyaXRlMTYoTkZDX0lSUU1BU0ssIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX05GQ19FQ0MwKCkJCQliZmluX3JlYWQxNihORkNfRUNDMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ORkNfRUNDMCh2YWwpCQliZmluX3dyaXRlMTYoTkZDX0VDQzAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX05GQ19FQ0MxKCkJCQliZmluX3JlYWQxNihORkNfRUNDMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9ORkNfRUNDMSh2YWwpCQliZmluX3dyaXRlMTYoTkZDX0VDQzEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX05GQ19FQ0MyKCkJCQliZmluX3JlYWQxNihORkNfRUNDMikKKyNkZWZpbmUgYmZpbl93cml0ZV9ORkNfRUNDMih2YWwpCQliZmluX3dyaXRlMTYoTkZDX0VDQzIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX05GQ19FQ0MzKCkJCQliZmluX3JlYWQxNihORkNfRUNDMykKKyNkZWZpbmUgYmZpbl93cml0ZV9ORkNfRUNDMyh2YWwpCQliZmluX3dyaXRlMTYoTkZDX0VDQzMsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX05GQ19DT1VOVCgpCQkJYmZpbl9yZWFkMTYoTkZDX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX05GQ19DT1VOVCh2YWwpCQliZmluX3dyaXRlMTYoTkZDX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ORkNfUlNUKCkJCQliZmluX3JlYWQxNihORkNfUlNUKQorI2RlZmluZSBiZmluX3dyaXRlX05GQ19SU1QodmFsKQkJCWJmaW5fd3JpdGUxNihORkNfUlNULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ORkNfUEdDVEwoKQkJCWJmaW5fcmVhZDE2KE5GQ19QR0NUTCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ORkNfUEdDVEwodmFsKQkJYmZpbl93cml0ZTE2KE5GQ19QR0NUTCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTkZDX1JFQUQoKQkJCWJmaW5fcmVhZDE2KE5GQ19SRUFEKQorI2RlZmluZSBiZmluX3dyaXRlX05GQ19SRUFEKHZhbCkJCWJmaW5fd3JpdGUxNihORkNfUkVBRCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTkZDX0FERFIoKQkJCWJmaW5fcmVhZDE2KE5GQ19BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX05GQ19BRERSKHZhbCkJCWJmaW5fd3JpdGUxNihORkNfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTkZDX0NNRCgpCQkJYmZpbl9yZWFkMTYoTkZDX0NNRCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ORkNfQ01EKHZhbCkJCQliZmluX3dyaXRlMTYoTkZDX0NNRCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTkZDX0RBVEFfV1IoKQkJCWJmaW5fcmVhZDE2KE5GQ19EQVRBX1dSKQorI2RlZmluZSBiZmluX3dyaXRlX05GQ19EQVRBX1dSKHZhbCkJCWJmaW5fd3JpdGUxNihORkNfREFUQV9XUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTkZDX0RBVEFfUkQoKQkJCWJmaW5fcmVhZDE2KE5GQ19EQVRBX1JEKQorI2RlZmluZSBiZmluX3dyaXRlX05GQ19EQVRBX1JEKHZhbCkJCWJmaW5fd3JpdGUxNihORkNfREFUQV9SRCwgdmFsKQogCiAjZW5kaWYgLyogX0NERUZfQkY1MjJfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2luY2x1ZGUvbWFjaC9jZGVmQkY1MjUuaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9pbmNsdWRlL21hY2gvY2RlZkJGNTI1LmgKaW5kZXggZDdlMjc1MS4uZDkwYTg1YiAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2luY2x1ZGUvbWFjaC9jZGVmQkY1MjUuaAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvaW5jbHVkZS9tYWNoL2NkZWZCRjUyNS5oCkBAIC0xLDE1ICsxLDEyIEBACiAvKgotICogQ29weXJpZ2h0IDIwMDctMjAwOCBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKiBDb3B5cmlnaHQgMjAwNy0yMDEwIEFuYWxvZyBEZXZpY2VzIEluYy4KICAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KICAqLwogCiAjaWZuZGVmIF9DREVGX0JGNTI1X0gKICNkZWZpbmUgX0NERUZfQkY1MjVfSAogCi0vKiBpbmNsdWRlIGFsbCBDb3JlIHJlZ2lzdGVycyBhbmQgYml0IGRlZmluaXRpb25zICovCi0jaW5jbHVkZSAiZGVmQkY1MjUuaCIKLQogLyogQkY1MjUgaXMgQkY1MjIgKyBVU0IgKi8KICNpbmNsdWRlICJjZGVmQkY1MjIuaCIKIApkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2luY2x1ZGUvbWFjaC9jZGVmQkY1MjcuaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9pbmNsdWRlL21hY2gvY2RlZkJGNTI3LmgKaW5kZXggYzdiYTU0NC4uZWIyMmY1OCAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2luY2x1ZGUvbWFjaC9jZGVmQkY1MjcuaAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvaW5jbHVkZS9tYWNoL2NkZWZCRjUyNy5oCkBAIC0xLDE1ICsxLDEyIEBACiAvKgotICogQ29weXJpZ2h0IDIwMDctMjAwOCBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKiBDb3B5cmlnaHQgMjAwNy0yMDEwIEFuYWxvZyBEZXZpY2VzIEluYy4KICAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KICAqLwogCiAjaWZuZGVmIF9DREVGX0JGNTI3X0gKICNkZWZpbmUgX0NERUZfQkY1MjdfSAogCi0vKiBpbmNsdWRlIGFsbCBDb3JlIHJlZ2lzdGVycyBhbmQgYml0IGRlZmluaXRpb25zICovCi0jaW5jbHVkZSAiZGVmQkY1MjcuaCIKLQogLyogQkY1MjcgaXMgQkY1MjUgKyBFTUFDICovCiAjaW5jbHVkZSAiY2RlZkJGNTI1LmgiCiAKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9pbmNsdWRlL21hY2gvY2RlZkJGNTJ4X2Jhc2UuaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9pbmNsdWRlL21hY2gvY2RlZkJGNTJ4X2Jhc2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzA0OGI1Mi4uMDAwMDAwMAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvaW5jbHVkZS9tYWNoL2NkZWZCRjUyeF9iYXNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwNy0yMDA4IEFuYWxvZyBEZXZpY2VzIEluYy4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIKLSAqLwotCi0jaWZuZGVmIF9DREVGX0JGNTJYX0gKLSNkZWZpbmUgX0NERUZfQkY1MlhfSAotCi0jaW5jbHVkZSA8YXNtL2JsYWNrZmluLmg+Ci0KLSNpbmNsdWRlICJkZWZCRjUyeF9iYXNlLmgiCi0KLS8qIEluY2x1ZGUgY29yZSBzcGVjaWZpYyByZWdpc3RlciBwb2ludGVyIGRlZmluaXRpb25zIAkJCQkJCQkJKi8KLSNpbmNsdWRlIDxhc20vY2RlZl9MUEJsYWNrZmluLmg+Ci0KLS8qID09PT0gYmVnaW4gZnJvbSBjZGVmQkY1MzQuaCA9PT09ICovCi0KLS8qIENsb2NrIGFuZCBTeXN0ZW0gQ29udHJvbAkoMHhGRkMwMDAwMCAtIDB4RkZDMDAwRkYpCQkJCQkJCQkqLwotI2RlZmluZSBiZmluX3JlYWRfUExMX0NUTCgpCQkJYmZpbl9yZWFkMTYoUExMX0NUTCkKLSNkZWZpbmUgYmZpbl9yZWFkX1BMTF9ESVYoKQkJCWJmaW5fcmVhZDE2KFBMTF9ESVYpCi0jZGVmaW5lIGJmaW5fd3JpdGVfUExMX0RJVih2YWwpCQkJYmZpbl93cml0ZTE2KFBMTF9ESVYsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1ZSX0NUTCgpCQkJYmZpbl9yZWFkMTYoVlJfQ1RMKQotI2RlZmluZSBiZmluX3JlYWRfUExMX1NUQVQoKQkJCWJmaW5fcmVhZDE2KFBMTF9TVEFUKQotI2RlZmluZSBiZmluX3dyaXRlX1BMTF9TVEFUKHZhbCkJCWJmaW5fd3JpdGUxNihQTExfU1RBVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfUExMX0xPQ0tDTlQoKQkJCWJmaW5fcmVhZDE2KFBMTF9MT0NLQ05UKQotI2RlZmluZSBiZmluX3dyaXRlX1BMTF9MT0NLQ05UKHZhbCkJCWJmaW5fd3JpdGUxNihQTExfTE9DS0NOVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfQ0hJUElEKCkJCQliZmluX3JlYWQzMihDSElQSUQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfQ0hJUElEKHZhbCkJCQliZmluX3dyaXRlMzIoQ0hJUElELCB2YWwpCi0KLQotLyogU3lzdGVtIEludGVycnVwdCBDb250cm9sbGVyICgweEZGQzAwMTAwIC0gMHhGRkMwMDFGRikJCQkJCQkJKi8KLSNkZWZpbmUgYmZpbl9yZWFkX1NXUlNUKCkJCQliZmluX3JlYWQxNihTV1JTVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9TV1JTVCh2YWwpCQkJYmZpbl93cml0ZTE2KFNXUlNULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9TWVNDUigpCQkJYmZpbl9yZWFkMTYoU1lTQ1IpCi0jZGVmaW5lIGJmaW5fd3JpdGVfU1lTQ1IodmFsKQkJCWJmaW5fd3JpdGUxNihTWVNDUiwgdmFsKQotCi0jZGVmaW5lIGJmaW5fcmVhZF9TSUNfUlZFQ1QoKQkJCWJmaW5fcmVhZDMyKFNJQ19SVkVDVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9TSUNfUlZFQ1QodmFsKQkJYmZpbl93cml0ZTMyKFNJQ19SVkVDVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfU0lDX0lNQVNLMCgpCQkJYmZpbl9yZWFkMzIoU0lDX0lNQVNLMCkKLSNkZWZpbmUgYmZpbl93cml0ZV9TSUNfSU1BU0swKHZhbCkJCWJmaW5fd3JpdGUzMihTSUNfSU1BU0swLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9TSUNfSU1BU0soeCkJCQliZmluX3JlYWQzMihTSUNfSU1BU0swICsgKHggPDwgNikpCi0jZGVmaW5lIGJmaW5fd3JpdGVfU0lDX0lNQVNLKHgsIHZhbCkJCWJmaW5fd3JpdGUzMigoU0lDX0lNQVNLMCArICh4IDw8IDYpKSwgdmFsKQotCi0jZGVmaW5lIGJmaW5fcmVhZF9TSUNfSUFSMCgpCQkJYmZpbl9yZWFkMzIoU0lDX0lBUjApCi0jZGVmaW5lIGJmaW5fd3JpdGVfU0lDX0lBUjAodmFsKQkJYmZpbl93cml0ZTMyKFNJQ19JQVIwLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9TSUNfSUFSMSgpCQkJYmZpbl9yZWFkMzIoU0lDX0lBUjEpCi0jZGVmaW5lIGJmaW5fd3JpdGVfU0lDX0lBUjEodmFsKQkJYmZpbl93cml0ZTMyKFNJQ19JQVIxLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9TSUNfSUFSMigpCQkJYmZpbl9yZWFkMzIoU0lDX0lBUjIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfU0lDX0lBUjIodmFsKQkJYmZpbl93cml0ZTMyKFNJQ19JQVIyLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9TSUNfSUFSMygpCQkJYmZpbl9yZWFkMzIoU0lDX0lBUjMpCi0jZGVmaW5lIGJmaW5fd3JpdGVfU0lDX0lBUjModmFsKQkJYmZpbl93cml0ZTMyKFNJQ19JQVIzLCB2YWwpCi0KLSNkZWZpbmUgYmZpbl9yZWFkX1NJQ19JU1IwKCkJCQliZmluX3JlYWQzMihTSUNfSVNSMCkKLSNkZWZpbmUgYmZpbl93cml0ZV9TSUNfSVNSMCh2YWwpCQliZmluX3dyaXRlMzIoU0lDX0lTUjAsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1NJQ19JU1IoeCkJCQliZmluX3JlYWQzMihTSUNfSVNSMCArICh4IDw8IDYpKQotI2RlZmluZSBiZmluX3dyaXRlX1NJQ19JU1IoeCwgdmFsKQkJYmZpbl93cml0ZTMyKChTSUNfSVNSMCArICh4IDw8IDYpKSwgdmFsKQotCi0jZGVmaW5lIGJmaW5fcmVhZF9TSUNfSVdSMCgpCQkJYmZpbl9yZWFkMzIoU0lDX0lXUjApCi0jZGVmaW5lIGJmaW5fd3JpdGVfU0lDX0lXUjAodmFsKQkJYmZpbl93cml0ZTMyKFNJQ19JV1IwLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9TSUNfSVdSKHgpCQkJYmZpbl9yZWFkMzIoU0lDX0lXUjAgKyAoeCA8PCA2KSkKLSNkZWZpbmUgYmZpbl93cml0ZV9TSUNfSVdSKHgsIHZhbCkJCWJmaW5fd3JpdGUzMigoU0lDX0lXUjAgKyAoeCA8PCA2KSksIHZhbCkKLQotLyogU0lDIEFkZGl0aW9ucyB0byBBRFNQLUJGNTJ4ICgweEZGQzAwMTRDIC0gMHhGRkMwMDE2MikgKi8KLQotI2RlZmluZSBiZmluX3JlYWRfU0lDX0lNQVNLMSgpCQkJYmZpbl9yZWFkMzIoU0lDX0lNQVNLMSkKLSNkZWZpbmUgYmZpbl93cml0ZV9TSUNfSU1BU0sxKHZhbCkJCWJmaW5fd3JpdGUzMihTSUNfSU1BU0sxLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9TSUNfSUFSNCgpCQkJYmZpbl9yZWFkMzIoU0lDX0lBUjQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfU0lDX0lBUjQodmFsKQkJYmZpbl93cml0ZTMyKFNJQ19JQVI0LCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9TSUNfSUFSNSgpCQkJYmZpbl9yZWFkMzIoU0lDX0lBUjUpCi0jZGVmaW5lIGJmaW5fd3JpdGVfU0lDX0lBUjUodmFsKQkJYmZpbl93cml0ZTMyKFNJQ19JQVI1LCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9TSUNfSUFSNigpCQkJYmZpbl9yZWFkMzIoU0lDX0lBUjYpCi0jZGVmaW5lIGJmaW5fd3JpdGVfU0lDX0lBUjYodmFsKQkJYmZpbl93cml0ZTMyKFNJQ19JQVI2LCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9TSUNfSUFSNygpCQkJYmZpbl9yZWFkMzIoU0lDX0lBUjcpCi0jZGVmaW5lIGJmaW5fd3JpdGVfU0lDX0lBUjcodmFsKQkJYmZpbl93cml0ZTMyKFNJQ19JQVI3LCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9TSUNfSVNSMSgpCQkJYmZpbl9yZWFkMzIoU0lDX0lTUjEpCi0jZGVmaW5lIGJmaW5fd3JpdGVfU0lDX0lTUjEodmFsKQkJYmZpbl93cml0ZTMyKFNJQ19JU1IxLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9TSUNfSVdSMSgpCQkJYmZpbl9yZWFkMzIoU0lDX0lXUjEpCi0jZGVmaW5lIGJmaW5fd3JpdGVfU0lDX0lXUjEodmFsKQkJYmZpbl93cml0ZTMyKFNJQ19JV1IxLCB2YWwpCi0KLS8qIFdhdGNoZG9nIFRpbWVyCQkoMHhGRkMwMDIwMCAtIDB4RkZDMDAyRkYpCQkJCQkJCQkJKi8KLSNkZWZpbmUgYmZpbl9yZWFkX1dET0dfQ1RMKCkJCQliZmluX3JlYWQxNihXRE9HX0NUTCkKLSNkZWZpbmUgYmZpbl93cml0ZV9XRE9HX0NUTCh2YWwpCQliZmluX3dyaXRlMTYoV0RPR19DVEwsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1dET0dfQ05UKCkJCQliZmluX3JlYWQzMihXRE9HX0NOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9XRE9HX0NOVCh2YWwpCQliZmluX3dyaXRlMzIoV0RPR19DTlQsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1dET0dfU1RBVCgpCQkJYmZpbl9yZWFkMzIoV0RPR19TVEFUKQotI2RlZmluZSBiZmluX3dyaXRlX1dET0dfU1RBVCh2YWwpCQliZmluX3dyaXRlMzIoV0RPR19TVEFULCB2YWwpCi0KLQotLyogUmVhbCBUaW1lIENsb2NrCQkoMHhGRkMwMDMwMCAtIDB4RkZDMDAzRkYpCQkJCQkJCQkJKi8KLSNkZWZpbmUgYmZpbl9yZWFkX1JUQ19TVEFUKCkJCQliZmluX3JlYWQzMihSVENfU1RBVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9SVENfU1RBVCh2YWwpCQliZmluX3dyaXRlMzIoUlRDX1NUQVQsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1JUQ19JQ1RMKCkJCQliZmluX3JlYWQxNihSVENfSUNUTCkKLSNkZWZpbmUgYmZpbl93cml0ZV9SVENfSUNUTCh2YWwpCQliZmluX3dyaXRlMTYoUlRDX0lDVEwsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1JUQ19JU1RBVCgpCQkJYmZpbl9yZWFkMTYoUlRDX0lTVEFUKQotI2RlZmluZSBiZmluX3dyaXRlX1JUQ19JU1RBVCh2YWwpCQliZmluX3dyaXRlMTYoUlRDX0lTVEFULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9SVENfU1dDTlQoKQkJCWJmaW5fcmVhZDE2KFJUQ19TV0NOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9SVENfU1dDTlQodmFsKQkJYmZpbl93cml0ZTE2KFJUQ19TV0NOVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfUlRDX0FMQVJNKCkJCQliZmluX3JlYWQzMihSVENfQUxBUk0pCi0jZGVmaW5lIGJmaW5fd3JpdGVfUlRDX0FMQVJNKHZhbCkJCWJmaW5fd3JpdGUzMihSVENfQUxBUk0sIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1JUQ19GQVNUKCkJCQliZmluX3JlYWQxNihSVENfRkFTVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9SVENfRkFTVCh2YWwpCQliZmluX3dyaXRlMTYoUlRDX0ZBU1QsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1JUQ19QUkVOKCkJCQliZmluX3JlYWQxNihSVENfUFJFTikKLSNkZWZpbmUgYmZpbl93cml0ZV9SVENfUFJFTih2YWwpCQliZmluX3dyaXRlMTYoUlRDX1BSRU4sIHZhbCkKLQotCi0vKiBVQVJUMCBDb250cm9sbGVyCQkoMHhGRkMwMDQwMCAtIDB4RkZDMDA0RkYpCQkJCQkJCQkJKi8KLSNkZWZpbmUgYmZpbl9yZWFkX1VBUlQwX1RIUigpCQkJYmZpbl9yZWFkMTYoVUFSVDBfVEhSKQotI2RlZmluZSBiZmluX3dyaXRlX1VBUlQwX1RIUih2YWwpCQliZmluX3dyaXRlMTYoVUFSVDBfVEhSLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9VQVJUMF9SQlIoKQkJCWJmaW5fcmVhZDE2KFVBUlQwX1JCUikKLSNkZWZpbmUgYmZpbl93cml0ZV9VQVJUMF9SQlIodmFsKQkJYmZpbl93cml0ZTE2KFVBUlQwX1JCUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfVUFSVDBfRExMKCkJCQliZmluX3JlYWQxNihVQVJUMF9ETEwpCi0jZGVmaW5lIGJmaW5fd3JpdGVfVUFSVDBfRExMKHZhbCkJCWJmaW5fd3JpdGUxNihVQVJUMF9ETEwsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1VBUlQwX0lFUigpCQkJYmZpbl9yZWFkMTYoVUFSVDBfSUVSKQotI2RlZmluZSBiZmluX3dyaXRlX1VBUlQwX0lFUih2YWwpCQliZmluX3dyaXRlMTYoVUFSVDBfSUVSLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9VQVJUMF9ETEgoKQkJCWJmaW5fcmVhZDE2KFVBUlQwX0RMSCkKLSNkZWZpbmUgYmZpbl93cml0ZV9VQVJUMF9ETEgodmFsKQkJYmZpbl93cml0ZTE2KFVBUlQwX0RMSCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfVUFSVDBfSUlSKCkJCQliZmluX3JlYWQxNihVQVJUMF9JSVIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfVUFSVDBfSUlSKHZhbCkJCWJmaW5fd3JpdGUxNihVQVJUMF9JSVIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1VBUlQwX0xDUigpCQkJYmZpbl9yZWFkMTYoVUFSVDBfTENSKQotI2RlZmluZSBiZmluX3dyaXRlX1VBUlQwX0xDUih2YWwpCQliZmluX3dyaXRlMTYoVUFSVDBfTENSLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9VQVJUMF9NQ1IoKQkJCWJmaW5fcmVhZDE2KFVBUlQwX01DUikKLSNkZWZpbmUgYmZpbl93cml0ZV9VQVJUMF9NQ1IodmFsKQkJYmZpbl93cml0ZTE2KFVBUlQwX01DUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfVUFSVDBfTFNSKCkJCQliZmluX3JlYWQxNihVQVJUMF9MU1IpCi0jZGVmaW5lIGJmaW5fd3JpdGVfVUFSVDBfTFNSKHZhbCkJCWJmaW5fd3JpdGUxNihVQVJUMF9MU1IsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1VBUlQwX01TUigpCQkJYmZpbl9yZWFkMTYoVUFSVDBfTVNSKQotI2RlZmluZSBiZmluX3dyaXRlX1VBUlQwX01TUih2YWwpCQliZmluX3dyaXRlMTYoVUFSVDBfTVNSLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9VQVJUMF9TQ1IoKQkJCWJmaW5fcmVhZDE2KFVBUlQwX1NDUikKLSNkZWZpbmUgYmZpbl93cml0ZV9VQVJUMF9TQ1IodmFsKQkJYmZpbl93cml0ZTE2KFVBUlQwX1NDUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfVUFSVDBfR0NUTCgpCQkJYmZpbl9yZWFkMTYoVUFSVDBfR0NUTCkKLSNkZWZpbmUgYmZpbl93cml0ZV9VQVJUMF9HQ1RMKHZhbCkJCWJmaW5fd3JpdGUxNihVQVJUMF9HQ1RMLCB2YWwpCi0KLQotLyogU1BJIENvbnRyb2xsZXIJCSgweEZGQzAwNTAwIC0gMHhGRkMwMDVGRikJCQkJCQkJCQkqLwotI2RlZmluZSBiZmluX3JlYWRfU1BJX0NUTCgpCQkJYmZpbl9yZWFkMTYoU1BJX0NUTCkKLSNkZWZpbmUgYmZpbl93cml0ZV9TUElfQ1RMKHZhbCkJCQliZmluX3dyaXRlMTYoU1BJX0NUTCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfU1BJX0ZMRygpCQkJYmZpbl9yZWFkMTYoU1BJX0ZMRykKLSNkZWZpbmUgYmZpbl93cml0ZV9TUElfRkxHKHZhbCkJCQliZmluX3dyaXRlMTYoU1BJX0ZMRywgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfU1BJX1NUQVQoKQkJCWJmaW5fcmVhZDE2KFNQSV9TVEFUKQotI2RlZmluZSBiZmluX3dyaXRlX1NQSV9TVEFUKHZhbCkJCWJmaW5fd3JpdGUxNihTUElfU1RBVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfU1BJX1REQlIoKQkJCWJmaW5fcmVhZDE2KFNQSV9UREJSKQotI2RlZmluZSBiZmluX3dyaXRlX1NQSV9UREJSKHZhbCkJCWJmaW5fd3JpdGUxNihTUElfVERCUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfU1BJX1JEQlIoKQkJCWJmaW5fcmVhZDE2KFNQSV9SREJSKQotI2RlZmluZSBiZmluX3dyaXRlX1NQSV9SREJSKHZhbCkJCWJmaW5fd3JpdGUxNihTUElfUkRCUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfU1BJX0JBVUQoKQkJCWJmaW5fcmVhZDE2KFNQSV9CQVVEKQotI2RlZmluZSBiZmluX3dyaXRlX1NQSV9CQVVEKHZhbCkJCWJmaW5fd3JpdGUxNihTUElfQkFVRCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfU1BJX1NIQURPVygpCQkJYmZpbl9yZWFkMTYoU1BJX1NIQURPVykKLSNkZWZpbmUgYmZpbl93cml0ZV9TUElfU0hBRE9XKHZhbCkJCWJmaW5fd3JpdGUxNihTUElfU0hBRE9XLCB2YWwpCi0KLQotLyogVElNRVIwLTcgUmVnaXN0ZXJzCQkoMHhGRkMwMDYwMCAtIDB4RkZDMDA2RkYpCQkJCQkJCQkqLwotI2RlZmluZSBiZmluX3JlYWRfVElNRVIwX0NPTkZJRygpCQliZmluX3JlYWQxNihUSU1FUjBfQ09ORklHKQotI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSMF9DT05GSUcodmFsKQkJYmZpbl93cml0ZTE2KFRJTUVSMF9DT05GSUcsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1RJTUVSMF9DT1VOVEVSKCkJCWJmaW5fcmVhZDMyKFRJTUVSMF9DT1VOVEVSKQotI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSMF9DT1VOVEVSKHZhbCkJCWJmaW5fd3JpdGUzMihUSU1FUjBfQ09VTlRFUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfVElNRVIwX1BFUklPRCgpCQliZmluX3JlYWQzMihUSU1FUjBfUEVSSU9EKQotI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSMF9QRVJJT0QodmFsKQkJYmZpbl93cml0ZTMyKFRJTUVSMF9QRVJJT0QsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1RJTUVSMF9XSURUSCgpCQliZmluX3JlYWQzMihUSU1FUjBfV0lEVEgpCi0jZGVmaW5lIGJmaW5fd3JpdGVfVElNRVIwX1dJRFRIKHZhbCkJCWJmaW5fd3JpdGUzMihUSU1FUjBfV0lEVEgsIHZhbCkKLQotI2RlZmluZSBiZmluX3JlYWRfVElNRVIxX0NPTkZJRygpCQliZmluX3JlYWQxNihUSU1FUjFfQ09ORklHKQotI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSMV9DT05GSUcodmFsKQkJYmZpbl93cml0ZTE2KFRJTUVSMV9DT05GSUcsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1RJTUVSMV9DT1VOVEVSKCkJCWJmaW5fcmVhZDMyKFRJTUVSMV9DT1VOVEVSKQotI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSMV9DT1VOVEVSKHZhbCkJCWJmaW5fd3JpdGUzMihUSU1FUjFfQ09VTlRFUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfVElNRVIxX1BFUklPRCgpCQliZmluX3JlYWQzMihUSU1FUjFfUEVSSU9EKQotI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSMV9QRVJJT0QodmFsKQkJYmZpbl93cml0ZTMyKFRJTUVSMV9QRVJJT0QsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1RJTUVSMV9XSURUSCgpCQliZmluX3JlYWQzMihUSU1FUjFfV0lEVEgpCi0jZGVmaW5lIGJmaW5fd3JpdGVfVElNRVIxX1dJRFRIKHZhbCkJCWJmaW5fd3JpdGUzMihUSU1FUjFfV0lEVEgsIHZhbCkKLQotI2RlZmluZSBiZmluX3JlYWRfVElNRVIyX0NPTkZJRygpCQliZmluX3JlYWQxNihUSU1FUjJfQ09ORklHKQotI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSMl9DT05GSUcodmFsKQkJYmZpbl93cml0ZTE2KFRJTUVSMl9DT05GSUcsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1RJTUVSMl9DT1VOVEVSKCkJCWJmaW5fcmVhZDMyKFRJTUVSMl9DT1VOVEVSKQotI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSMl9DT1VOVEVSKHZhbCkJCWJmaW5fd3JpdGUzMihUSU1FUjJfQ09VTlRFUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfVElNRVIyX1BFUklPRCgpCQliZmluX3JlYWQzMihUSU1FUjJfUEVSSU9EKQotI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSMl9QRVJJT0QodmFsKQkJYmZpbl93cml0ZTMyKFRJTUVSMl9QRVJJT0QsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1RJTUVSMl9XSURUSCgpCQliZmluX3JlYWQzMihUSU1FUjJfV0lEVEgpCi0jZGVmaW5lIGJmaW5fd3JpdGVfVElNRVIyX1dJRFRIKHZhbCkJCWJmaW5fd3JpdGUzMihUSU1FUjJfV0lEVEgsIHZhbCkKLQotI2RlZmluZSBiZmluX3JlYWRfVElNRVIzX0NPTkZJRygpCQliZmluX3JlYWQxNihUSU1FUjNfQ09ORklHKQotI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSM19DT05GSUcodmFsKQkJYmZpbl93cml0ZTE2KFRJTUVSM19DT05GSUcsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1RJTUVSM19DT1VOVEVSKCkJCWJmaW5fcmVhZDMyKFRJTUVSM19DT1VOVEVSKQotI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSM19DT1VOVEVSKHZhbCkJCWJmaW5fd3JpdGUzMihUSU1FUjNfQ09VTlRFUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfVElNRVIzX1BFUklPRCgpCQliZmluX3JlYWQzMihUSU1FUjNfUEVSSU9EKQotI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSM19QRVJJT0QodmFsKQkJYmZpbl93cml0ZTMyKFRJTUVSM19QRVJJT0QsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1RJTUVSM19XSURUSCgpCQliZmluX3JlYWQzMihUSU1FUjNfV0lEVEgpCi0jZGVmaW5lIGJmaW5fd3JpdGVfVElNRVIzX1dJRFRIKHZhbCkJCWJmaW5fd3JpdGUzMihUSU1FUjNfV0lEVEgsIHZhbCkKLQotI2RlZmluZSBiZmluX3JlYWRfVElNRVI0X0NPTkZJRygpCQliZmluX3JlYWQxNihUSU1FUjRfQ09ORklHKQotI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSNF9DT05GSUcodmFsKQkJYmZpbl93cml0ZTE2KFRJTUVSNF9DT05GSUcsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1RJTUVSNF9DT1VOVEVSKCkJCWJmaW5fcmVhZDMyKFRJTUVSNF9DT1VOVEVSKQotI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSNF9DT1VOVEVSKHZhbCkJCWJmaW5fd3JpdGUzMihUSU1FUjRfQ09VTlRFUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfVElNRVI0X1BFUklPRCgpCQliZmluX3JlYWQzMihUSU1FUjRfUEVSSU9EKQotI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSNF9QRVJJT0QodmFsKQkJYmZpbl93cml0ZTMyKFRJTUVSNF9QRVJJT0QsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1RJTUVSNF9XSURUSCgpCQliZmluX3JlYWQzMihUSU1FUjRfV0lEVEgpCi0jZGVmaW5lIGJmaW5fd3JpdGVfVElNRVI0X1dJRFRIKHZhbCkJCWJmaW5fd3JpdGUzMihUSU1FUjRfV0lEVEgsIHZhbCkKLQotI2RlZmluZSBiZmluX3JlYWRfVElNRVI1X0NPTkZJRygpCQliZmluX3JlYWQxNihUSU1FUjVfQ09ORklHKQotI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSNV9DT05GSUcodmFsKQkJYmZpbl93cml0ZTE2KFRJTUVSNV9DT05GSUcsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1RJTUVSNV9DT1VOVEVSKCkJCWJmaW5fcmVhZDMyKFRJTUVSNV9DT1VOVEVSKQotI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSNV9DT1VOVEVSKHZhbCkJCWJmaW5fd3JpdGUzMihUSU1FUjVfQ09VTlRFUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfVElNRVI1X1BFUklPRCgpCQliZmluX3JlYWQzMihUSU1FUjVfUEVSSU9EKQotI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSNV9QRVJJT0QodmFsKQkJYmZpbl93cml0ZTMyKFRJTUVSNV9QRVJJT0QsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1RJTUVSNV9XSURUSCgpCQliZmluX3JlYWQzMihUSU1FUjVfV0lEVEgpCi0jZGVmaW5lIGJmaW5fd3JpdGVfVElNRVI1X1dJRFRIKHZhbCkJCWJmaW5fd3JpdGUzMihUSU1FUjVfV0lEVEgsIHZhbCkKLQotI2RlZmluZSBiZmluX3JlYWRfVElNRVI2X0NPTkZJRygpCQliZmluX3JlYWQxNihUSU1FUjZfQ09ORklHKQotI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSNl9DT05GSUcodmFsKQkJYmZpbl93cml0ZTE2KFRJTUVSNl9DT05GSUcsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1RJTUVSNl9DT1VOVEVSKCkJCWJmaW5fcmVhZDMyKFRJTUVSNl9DT1VOVEVSKQotI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSNl9DT1VOVEVSKHZhbCkJCWJmaW5fd3JpdGUzMihUSU1FUjZfQ09VTlRFUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfVElNRVI2X1BFUklPRCgpCQliZmluX3JlYWQzMihUSU1FUjZfUEVSSU9EKQotI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSNl9QRVJJT0QodmFsKQkJYmZpbl93cml0ZTMyKFRJTUVSNl9QRVJJT0QsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1RJTUVSNl9XSURUSCgpCQliZmluX3JlYWQzMihUSU1FUjZfV0lEVEgpCi0jZGVmaW5lIGJmaW5fd3JpdGVfVElNRVI2X1dJRFRIKHZhbCkJCWJmaW5fd3JpdGUzMihUSU1FUjZfV0lEVEgsIHZhbCkKLQotI2RlZmluZSBiZmluX3JlYWRfVElNRVI3X0NPTkZJRygpCQliZmluX3JlYWQxNihUSU1FUjdfQ09ORklHKQotI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSN19DT05GSUcodmFsKQkJYmZpbl93cml0ZTE2KFRJTUVSN19DT05GSUcsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1RJTUVSN19DT1VOVEVSKCkJCWJmaW5fcmVhZDMyKFRJTUVSN19DT1VOVEVSKQotI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSN19DT1VOVEVSKHZhbCkJCWJmaW5fd3JpdGUzMihUSU1FUjdfQ09VTlRFUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfVElNRVI3X1BFUklPRCgpCQliZmluX3JlYWQzMihUSU1FUjdfUEVSSU9EKQotI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSN19QRVJJT0QodmFsKQkJYmZpbl93cml0ZTMyKFRJTUVSN19QRVJJT0QsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1RJTUVSN19XSURUSCgpCQliZmluX3JlYWQzMihUSU1FUjdfV0lEVEgpCi0jZGVmaW5lIGJmaW5fd3JpdGVfVElNRVI3X1dJRFRIKHZhbCkJCWJmaW5fd3JpdGUzMihUSU1FUjdfV0lEVEgsIHZhbCkKLQotI2RlZmluZSBiZmluX3JlYWRfVElNRVJfRU5BQkxFKCkJCWJmaW5fcmVhZDE2KFRJTUVSX0VOQUJMRSkKLSNkZWZpbmUgYmZpbl93cml0ZV9USU1FUl9FTkFCTEUodmFsKQkJYmZpbl93cml0ZTE2KFRJTUVSX0VOQUJMRSwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfVElNRVJfRElTQUJMRSgpCQliZmluX3JlYWQxNihUSU1FUl9ESVNBQkxFKQotI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSX0RJU0FCTEUodmFsKQkJYmZpbl93cml0ZTE2KFRJTUVSX0RJU0FCTEUsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1RJTUVSX1NUQVRVUygpCQliZmluX3JlYWQzMihUSU1FUl9TVEFUVVMpCi0jZGVmaW5lIGJmaW5fd3JpdGVfVElNRVJfU1RBVFVTKHZhbCkJCWJmaW5fd3JpdGUzMihUSU1FUl9TVEFUVVMsIHZhbCkKLQotCi0vKiBHZW5lcmFsIFB1cnBvc2UgSS9PIFBvcnQgRiAoMHhGRkMwMDcwMCAtIDB4RkZDMDA3RkYpCQkJCQkJCQkqLwotI2RlZmluZSBiZmluX3JlYWRfUE9SVEZJTygpCQkJYmZpbl9yZWFkMTYoUE9SVEZJTykKLSNkZWZpbmUgYmZpbl93cml0ZV9QT1JURklPKHZhbCkJCQliZmluX3dyaXRlMTYoUE9SVEZJTywgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfUE9SVEZJT19DTEVBUigpCQliZmluX3JlYWQxNihQT1JURklPX0NMRUFSKQotI2RlZmluZSBiZmluX3dyaXRlX1BPUlRGSU9fQ0xFQVIodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRGSU9fQ0xFQVIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1BPUlRGSU9fU0VUKCkJCQliZmluX3JlYWQxNihQT1JURklPX1NFVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9QT1JURklPX1NFVCh2YWwpCQliZmluX3dyaXRlMTYoUE9SVEZJT19TRVQsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1BPUlRGSU9fVE9HR0xFKCkJCWJmaW5fcmVhZDE2KFBPUlRGSU9fVE9HR0xFKQotI2RlZmluZSBiZmluX3dyaXRlX1BPUlRGSU9fVE9HR0xFKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JURklPX1RPR0dMRSwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfUE9SVEZJT19NQVNLQSgpCQliZmluX3JlYWQxNihQT1JURklPX01BU0tBKQotI2RlZmluZSBiZmluX3dyaXRlX1BPUlRGSU9fTUFTS0EodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRGSU9fTUFTS0EsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1BPUlRGSU9fTUFTS0FfQ0xFQVIoKQkJYmZpbl9yZWFkMTYoUE9SVEZJT19NQVNLQV9DTEVBUikKLSNkZWZpbmUgYmZpbl93cml0ZV9QT1JURklPX01BU0tBX0NMRUFSKHZhbCkJYmZpbl93cml0ZTE2KFBPUlRGSU9fTUFTS0FfQ0xFQVIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1BPUlRGSU9fTUFTS0FfU0VUKCkJCWJmaW5fcmVhZDE2KFBPUlRGSU9fTUFTS0FfU0VUKQotI2RlZmluZSBiZmluX3dyaXRlX1BPUlRGSU9fTUFTS0FfU0VUKHZhbCkJYmZpbl93cml0ZTE2KFBPUlRGSU9fTUFTS0FfU0VULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9QT1JURklPX01BU0tBX1RPR0dMRSgpCWJmaW5fcmVhZDE2KFBPUlRGSU9fTUFTS0FfVE9HR0xFKQotI2RlZmluZSBiZmluX3dyaXRlX1BPUlRGSU9fTUFTS0FfVE9HR0xFKHZhbCkJYmZpbl93cml0ZTE2KFBPUlRGSU9fTUFTS0FfVE9HR0xFLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9QT1JURklPX01BU0tCKCkJCWJmaW5fcmVhZDE2KFBPUlRGSU9fTUFTS0IpCi0jZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEZJT19NQVNLQih2YWwpCQliZmluX3dyaXRlMTYoUE9SVEZJT19NQVNLQiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfUE9SVEZJT19NQVNLQl9DTEVBUigpCQliZmluX3JlYWQxNihQT1JURklPX01BU0tCX0NMRUFSKQotI2RlZmluZSBiZmluX3dyaXRlX1BPUlRGSU9fTUFTS0JfQ0xFQVIodmFsKQliZmluX3dyaXRlMTYoUE9SVEZJT19NQVNLQl9DTEVBUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfUE9SVEZJT19NQVNLQl9TRVQoKQkJYmZpbl9yZWFkMTYoUE9SVEZJT19NQVNLQl9TRVQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEZJT19NQVNLQl9TRVQodmFsKQliZmluX3dyaXRlMTYoUE9SVEZJT19NQVNLQl9TRVQsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1BPUlRGSU9fTUFTS0JfVE9HR0xFKCkJYmZpbl9yZWFkMTYoUE9SVEZJT19NQVNLQl9UT0dHTEUpCi0jZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEZJT19NQVNLQl9UT0dHTEUodmFsKQliZmluX3dyaXRlMTYoUE9SVEZJT19NQVNLQl9UT0dHTEUsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1BPUlRGSU9fRElSKCkJCQliZmluX3JlYWQxNihQT1JURklPX0RJUikKLSNkZWZpbmUgYmZpbl93cml0ZV9QT1JURklPX0RJUih2YWwpCQliZmluX3dyaXRlMTYoUE9SVEZJT19ESVIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1BPUlRGSU9fUE9MQVIoKQkJYmZpbl9yZWFkMTYoUE9SVEZJT19QT0xBUikKLSNkZWZpbmUgYmZpbl93cml0ZV9QT1JURklPX1BPTEFSKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JURklPX1BPTEFSLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9QT1JURklPX0VER0UoKQkJYmZpbl9yZWFkMTYoUE9SVEZJT19FREdFKQotI2RlZmluZSBiZmluX3dyaXRlX1BPUlRGSU9fRURHRSh2YWwpCQliZmluX3dyaXRlMTYoUE9SVEZJT19FREdFLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9QT1JURklPX0JPVEgoKQkJYmZpbl9yZWFkMTYoUE9SVEZJT19CT1RIKQotI2RlZmluZSBiZmluX3dyaXRlX1BPUlRGSU9fQk9USCh2YWwpCQliZmluX3dyaXRlMTYoUE9SVEZJT19CT1RILCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9QT1JURklPX0lORU4oKQkJYmZpbl9yZWFkMTYoUE9SVEZJT19JTkVOKQotI2RlZmluZSBiZmluX3dyaXRlX1BPUlRGSU9fSU5FTih2YWwpCQliZmluX3dyaXRlMTYoUE9SVEZJT19JTkVOLCB2YWwpCi0KLQotLyogU1BPUlQwIENvbnRyb2xsZXIJCSgweEZGQzAwODAwIC0gMHhGRkMwMDhGRikJCQkJCQkJCSovCi0jZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDBfVENSMSgpCQkJYmZpbl9yZWFkMTYoU1BPUlQwX1RDUjEpCi0jZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQwX1RDUjEodmFsKQkJYmZpbl93cml0ZTE2KFNQT1JUMF9UQ1IxLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDBfVENSMigpCQkJYmZpbl9yZWFkMTYoU1BPUlQwX1RDUjIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQwX1RDUjIodmFsKQkJYmZpbl93cml0ZTE2KFNQT1JUMF9UQ1IyLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDBfVENMS0RJVigpCQliZmluX3JlYWQxNihTUE9SVDBfVENMS0RJVikKLSNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDBfVENMS0RJVih2YWwpCQliZmluX3dyaXRlMTYoU1BPUlQwX1RDTEtESVYsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMF9URlNESVYoKQkJYmZpbl9yZWFkMTYoU1BPUlQwX1RGU0RJVikKLSNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDBfVEZTRElWKHZhbCkJCWJmaW5fd3JpdGUxNihTUE9SVDBfVEZTRElWLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDBfVFgoKQkJCWJmaW5fcmVhZDMyKFNQT1JUMF9UWCkKLSNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDBfVFgodmFsKQkJYmZpbl93cml0ZTMyKFNQT1JUMF9UWCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfU1BPUlQwX1JYKCkJCQliZmluX3JlYWQzMihTUE9SVDBfUlgpCi0jZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQwX1JYKHZhbCkJCWJmaW5fd3JpdGUzMihTUE9SVDBfUlgsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMF9UWDMyKCkJCQliZmluX3JlYWQzMihTUE9SVDBfVFgpCi0jZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQwX1RYMzIodmFsKQkJYmZpbl93cml0ZTMyKFNQT1JUMF9UWCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfU1BPUlQwX1JYMzIoKQkJCWJmaW5fcmVhZDMyKFNQT1JUMF9SWCkKLSNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDBfUlgzMih2YWwpCQliZmluX3dyaXRlMzIoU1BPUlQwX1JYLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDBfVFgxNigpCQkJYmZpbl9yZWFkMTYoU1BPUlQwX1RYKQotI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMF9UWDE2KHZhbCkJCWJmaW5fd3JpdGUxNihTUE9SVDBfVFgsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMF9SWDE2KCkJCQliZmluX3JlYWQxNihTUE9SVDBfUlgpCi0jZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQwX1JYMTYodmFsKQkJYmZpbl93cml0ZTE2KFNQT1JUMF9SWCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfU1BPUlQwX1JDUjEoKQkJCWJmaW5fcmVhZDE2KFNQT1JUMF9SQ1IxKQotI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMF9SQ1IxKHZhbCkJCWJmaW5fd3JpdGUxNihTUE9SVDBfUkNSMSwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfU1BPUlQwX1JDUjIoKQkJCWJmaW5fcmVhZDE2KFNQT1JUMF9SQ1IyKQotI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMF9SQ1IyKHZhbCkJCWJmaW5fd3JpdGUxNihTUE9SVDBfUkNSMiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfU1BPUlQwX1JDTEtESVYoKQkJYmZpbl9yZWFkMTYoU1BPUlQwX1JDTEtESVYpCi0jZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQwX1JDTEtESVYodmFsKQkJYmZpbl93cml0ZTE2KFNQT1JUMF9SQ0xLRElWLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDBfUkZTRElWKCkJCWJmaW5fcmVhZDE2KFNQT1JUMF9SRlNESVYpCi0jZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQwX1JGU0RJVih2YWwpCQliZmluX3dyaXRlMTYoU1BPUlQwX1JGU0RJViwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfU1BPUlQwX1NUQVQoKQkJCWJmaW5fcmVhZDE2KFNQT1JUMF9TVEFUKQotI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMF9TVEFUKHZhbCkJCWJmaW5fd3JpdGUxNihTUE9SVDBfU1RBVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfU1BPUlQwX0NITkwoKQkJCWJmaW5fcmVhZDE2KFNQT1JUMF9DSE5MKQotI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMF9DSE5MKHZhbCkJCWJmaW5fd3JpdGUxNihTUE9SVDBfQ0hOTCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfU1BPUlQwX01DTUMxKCkJCWJmaW5fcmVhZDE2KFNQT1JUMF9NQ01DMSkKLSNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDBfTUNNQzEodmFsKQkJYmZpbl93cml0ZTE2KFNQT1JUMF9NQ01DMSwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfU1BPUlQwX01DTUMyKCkJCWJmaW5fcmVhZDE2KFNQT1JUMF9NQ01DMikKLSNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDBfTUNNQzIodmFsKQkJYmZpbl93cml0ZTE2KFNQT1JUMF9NQ01DMiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfU1BPUlQwX01UQ1MwKCkJCWJmaW5fcmVhZDMyKFNQT1JUMF9NVENTMCkKLSNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDBfTVRDUzAodmFsKQkJYmZpbl93cml0ZTMyKFNQT1JUMF9NVENTMCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfU1BPUlQwX01UQ1MxKCkJCWJmaW5fcmVhZDMyKFNQT1JUMF9NVENTMSkKLSNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDBfTVRDUzEodmFsKQkJYmZpbl93cml0ZTMyKFNQT1JUMF9NVENTMSwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfU1BPUlQwX01UQ1MyKCkJCWJmaW5fcmVhZDMyKFNQT1JUMF9NVENTMikKLSNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDBfTVRDUzIodmFsKQkJYmZpbl93cml0ZTMyKFNQT1JUMF9NVENTMiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfU1BPUlQwX01UQ1MzKCkJCWJmaW5fcmVhZDMyKFNQT1JUMF9NVENTMykKLSNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDBfTVRDUzModmFsKQkJYmZpbl93cml0ZTMyKFNQT1JUMF9NVENTMywgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfU1BPUlQwX01SQ1MwKCkJCWJmaW5fcmVhZDMyKFNQT1JUMF9NUkNTMCkKLSNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDBfTVJDUzAodmFsKQkJYmZpbl93cml0ZTMyKFNQT1JUMF9NUkNTMCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfU1BPUlQwX01SQ1MxKCkJCWJmaW5fcmVhZDMyKFNQT1JUMF9NUkNTMSkKLSNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDBfTVJDUzEodmFsKQkJYmZpbl93cml0ZTMyKFNQT1JUMF9NUkNTMSwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfU1BPUlQwX01SQ1MyKCkJCWJmaW5fcmVhZDMyKFNQT1JUMF9NUkNTMikKLSNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDBfTVJDUzIodmFsKQkJYmZpbl93cml0ZTMyKFNQT1JUMF9NUkNTMiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfU1BPUlQwX01SQ1MzKCkJCWJmaW5fcmVhZDMyKFNQT1JUMF9NUkNTMykKLSNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDBfTVJDUzModmFsKQkJYmZpbl93cml0ZTMyKFNQT1JUMF9NUkNTMywgdmFsKQotCi0KLS8qIFNQT1JUMSBDb250cm9sbGVyCQkoMHhGRkMwMDkwMCAtIDB4RkZDMDA5RkYpCQkJCQkJCQkqLwotI2RlZmluZSBiZmluX3JlYWRfU1BPUlQxX1RDUjEoKQkJCWJmaW5fcmVhZDE2KFNQT1JUMV9UQ1IxKQotI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMV9UQ1IxKHZhbCkJCWJmaW5fd3JpdGUxNihTUE9SVDFfVENSMSwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfU1BPUlQxX1RDUjIoKQkJCWJmaW5fcmVhZDE2KFNQT1JUMV9UQ1IyKQotI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMV9UQ1IyKHZhbCkJCWJmaW5fd3JpdGUxNihTUE9SVDFfVENSMiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfU1BPUlQxX1RDTEtESVYoKQkJYmZpbl9yZWFkMTYoU1BPUlQxX1RDTEtESVYpCi0jZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQxX1RDTEtESVYodmFsKQkJYmZpbl93cml0ZTE2KFNQT1JUMV9UQ0xLRElWLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDFfVEZTRElWKCkJCWJmaW5fcmVhZDE2KFNQT1JUMV9URlNESVYpCi0jZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQxX1RGU0RJVih2YWwpCQliZmluX3dyaXRlMTYoU1BPUlQxX1RGU0RJViwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfU1BPUlQxX1RYKCkJCQliZmluX3JlYWQzMihTUE9SVDFfVFgpCi0jZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQxX1RYKHZhbCkJCWJmaW5fd3JpdGUzMihTUE9SVDFfVFgsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMV9SWCgpCQkJYmZpbl9yZWFkMzIoU1BPUlQxX1JYKQotI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMV9SWCh2YWwpCQliZmluX3dyaXRlMzIoU1BPUlQxX1JYLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDFfVFgzMigpCQkJYmZpbl9yZWFkMzIoU1BPUlQxX1RYKQotI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMV9UWDMyKHZhbCkJCWJmaW5fd3JpdGUzMihTUE9SVDFfVFgsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMV9SWDMyKCkJCQliZmluX3JlYWQzMihTUE9SVDFfUlgpCi0jZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQxX1JYMzIodmFsKQkJYmZpbl93cml0ZTMyKFNQT1JUMV9SWCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfU1BPUlQxX1RYMTYoKQkJCWJmaW5fcmVhZDE2KFNQT1JUMV9UWCkKLSNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDFfVFgxNih2YWwpCQliZmluX3dyaXRlMTYoU1BPUlQxX1RYLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDFfUlgxNigpCQkJYmZpbl9yZWFkMTYoU1BPUlQxX1JYKQotI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMV9SWDE2KHZhbCkJCWJmaW5fd3JpdGUxNihTUE9SVDFfUlgsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMV9SQ1IxKCkJCQliZmluX3JlYWQxNihTUE9SVDFfUkNSMSkKLSNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDFfUkNSMSh2YWwpCQliZmluX3dyaXRlMTYoU1BPUlQxX1JDUjEsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMV9SQ1IyKCkJCQliZmluX3JlYWQxNihTUE9SVDFfUkNSMikKLSNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDFfUkNSMih2YWwpCQliZmluX3dyaXRlMTYoU1BPUlQxX1JDUjIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMV9SQ0xLRElWKCkJCWJmaW5fcmVhZDE2KFNQT1JUMV9SQ0xLRElWKQotI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMV9SQ0xLRElWKHZhbCkJCWJmaW5fd3JpdGUxNihTUE9SVDFfUkNMS0RJViwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfU1BPUlQxX1JGU0RJVigpCQliZmluX3JlYWQxNihTUE9SVDFfUkZTRElWKQotI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMV9SRlNESVYodmFsKQkJYmZpbl93cml0ZTE2KFNQT1JUMV9SRlNESVYsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMV9TVEFUKCkJCQliZmluX3JlYWQxNihTUE9SVDFfU1RBVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDFfU1RBVCh2YWwpCQliZmluX3dyaXRlMTYoU1BPUlQxX1NUQVQsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMV9DSE5MKCkJCQliZmluX3JlYWQxNihTUE9SVDFfQ0hOTCkKLSNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDFfQ0hOTCh2YWwpCQliZmluX3dyaXRlMTYoU1BPUlQxX0NITkwsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMV9NQ01DMSgpCQliZmluX3JlYWQxNihTUE9SVDFfTUNNQzEpCi0jZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQxX01DTUMxKHZhbCkJCWJmaW5fd3JpdGUxNihTUE9SVDFfTUNNQzEsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMV9NQ01DMigpCQliZmluX3JlYWQxNihTUE9SVDFfTUNNQzIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQxX01DTUMyKHZhbCkJCWJmaW5fd3JpdGUxNihTUE9SVDFfTUNNQzIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMV9NVENTMCgpCQliZmluX3JlYWQzMihTUE9SVDFfTVRDUzApCi0jZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQxX01UQ1MwKHZhbCkJCWJmaW5fd3JpdGUzMihTUE9SVDFfTVRDUzAsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMV9NVENTMSgpCQliZmluX3JlYWQzMihTUE9SVDFfTVRDUzEpCi0jZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQxX01UQ1MxKHZhbCkJCWJmaW5fd3JpdGUzMihTUE9SVDFfTVRDUzEsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMV9NVENTMigpCQliZmluX3JlYWQzMihTUE9SVDFfTVRDUzIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQxX01UQ1MyKHZhbCkJCWJmaW5fd3JpdGUzMihTUE9SVDFfTVRDUzIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMV9NVENTMygpCQliZmluX3JlYWQzMihTUE9SVDFfTVRDUzMpCi0jZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQxX01UQ1MzKHZhbCkJCWJmaW5fd3JpdGUzMihTUE9SVDFfTVRDUzMsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMV9NUkNTMCgpCQliZmluX3JlYWQzMihTUE9SVDFfTVJDUzApCi0jZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQxX01SQ1MwKHZhbCkJCWJmaW5fd3JpdGUzMihTUE9SVDFfTVJDUzAsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMV9NUkNTMSgpCQliZmluX3JlYWQzMihTUE9SVDFfTVJDUzEpCi0jZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQxX01SQ1MxKHZhbCkJCWJmaW5fd3JpdGUzMihTUE9SVDFfTVJDUzEsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMV9NUkNTMigpCQliZmluX3JlYWQzMihTUE9SVDFfTVJDUzIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQxX01SQ1MyKHZhbCkJCWJmaW5fd3JpdGUzMihTUE9SVDFfTVJDUzIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMV9NUkNTMygpCQliZmluX3JlYWQzMihTUE9SVDFfTVJDUzMpCi0jZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQxX01SQ1MzKHZhbCkJCWJmaW5fd3JpdGUzMihTUE9SVDFfTVJDUzMsIHZhbCkKLQotCi0vKiBFeHRlcm5hbCBCdXMgSW50ZXJmYWNlIFVuaXQgKDB4RkZDMDBBMDAgLSAweEZGQzAwQUZGKQkJCQkJCQkqLwotI2RlZmluZSBiZmluX3JlYWRfRUJJVV9BTUdDVEwoKQkJCWJmaW5fcmVhZDE2KEVCSVVfQU1HQ1RMKQotI2RlZmluZSBiZmluX3dyaXRlX0VCSVVfQU1HQ1RMKHZhbCkJCWJmaW5fd3JpdGUxNihFQklVX0FNR0NUTCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRUJJVV9BTUJDVEwwKCkJCWJmaW5fcmVhZDMyKEVCSVVfQU1CQ1RMMCkKLSNkZWZpbmUgYmZpbl93cml0ZV9FQklVX0FNQkNUTDAodmFsKQkJYmZpbl93cml0ZTMyKEVCSVVfQU1CQ1RMMCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRUJJVV9BTUJDVEwxKCkJCWJmaW5fcmVhZDMyKEVCSVVfQU1CQ1RMMSkKLSNkZWZpbmUgYmZpbl93cml0ZV9FQklVX0FNQkNUTDEodmFsKQkJYmZpbl93cml0ZTMyKEVCSVVfQU1CQ1RMMSwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRUJJVV9TREdDVEwoKQkJCWJmaW5fcmVhZDMyKEVCSVVfU0RHQ1RMKQotI2RlZmluZSBiZmluX3dyaXRlX0VCSVVfU0RHQ1RMKHZhbCkJCWJmaW5fd3JpdGUzMihFQklVX1NER0NUTCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRUJJVV9TREJDVEwoKQkJCWJmaW5fcmVhZDE2KEVCSVVfU0RCQ1RMKQotI2RlZmluZSBiZmluX3dyaXRlX0VCSVVfU0RCQ1RMKHZhbCkJCWJmaW5fd3JpdGUxNihFQklVX1NEQkNUTCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRUJJVV9TRFJSQygpCQkJYmZpbl9yZWFkMTYoRUJJVV9TRFJSQykKLSNkZWZpbmUgYmZpbl93cml0ZV9FQklVX1NEUlJDKHZhbCkJCWJmaW5fd3JpdGUxNihFQklVX1NEUlJDLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9FQklVX1NEU1RBVCgpCQkJYmZpbl9yZWFkMTYoRUJJVV9TRFNUQVQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRUJJVV9TRFNUQVQodmFsKQkJYmZpbl93cml0ZTE2KEVCSVVfU0RTVEFULCB2YWwpCi0KLQotLyogRE1BIFRyYWZmaWMgQ29udHJvbCBSZWdpc3RlcnMJCQkJCQkJCQkJCQkJKi8KLSNkZWZpbmUgYmZpbl9yZWFkX0RNQV9UQ19QRVIoKQkJCWJmaW5fcmVhZDE2KERNQV9UQ19QRVIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BX1RDX1BFUih2YWwpCQliZmluX3dyaXRlMTYoRE1BX1RDX1BFUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BX1RDX0NOVCgpCQkJYmZpbl9yZWFkMTYoRE1BX1RDX0NOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUFfVENfQ05UKHZhbCkJCWJmaW5fd3JpdGUxNihETUFfVENfQ05ULCB2YWwpCi0KLS8qIEFsdGVybmF0ZSBkZXByZWNhdGVkIHJlZ2lzdGVyIG5hbWVzIChiZWxvdykgcHJvdmlkZWQgZm9yIGJhY2t3YXJkcyBjb2RlIGNvbXBhdGliaWxpdHkgKi8KLSNkZWZpbmUgYmZpbl9yZWFkX0RNQV9UQ1BFUigpCQkJYmZpbl9yZWFkMTYoRE1BX1RDUEVSKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQV9UQ1BFUih2YWwpCQliZmluX3dyaXRlMTYoRE1BX1RDUEVSLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUFfVENDTlQoKQkJCWJmaW5fcmVhZDE2KERNQV9UQ0NOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUFfVENDTlQodmFsKQkJYmZpbl93cml0ZTE2KERNQV9UQ0NOVCwgdmFsKQotCi0vKiBETUEgQ29udHJvbGxlcgkJCQkJCQkJCQkJCQkJCQkJKi8KLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTBfQ09ORklHKCkJCQliZmluX3JlYWQxNihETUEwX0NPTkZJRykKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUEwX0NPTkZJRyh2YWwpCQliZmluX3dyaXRlMTYoRE1BMF9DT05GSUcsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTBfTkVYVF9ERVNDX1BUUigpCQliZmluX3JlYWQzMihETUEwX05FWFRfREVTQ19QVFIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BMF9ORVhUX0RFU0NfUFRSKHZhbCkJYmZpbl93cml0ZTMyKERNQTBfTkVYVF9ERVNDX1BUUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BMF9TVEFSVF9BRERSKCkJCWJmaW5fcmVhZDMyKERNQTBfU1RBUlRfQUREUikKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUEwX1NUQVJUX0FERFIodmFsKQkJYmZpbl93cml0ZTMyKERNQTBfU1RBUlRfQUREUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BMF9YX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTBfWF9DT1VOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUEwX1hfQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KERNQTBfWF9DT1VOVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BMF9ZX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTBfWV9DT1VOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUEwX1lfQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KERNQTBfWV9DT1VOVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BMF9YX01PRElGWSgpCQliZmluX3JlYWQxNihETUEwX1hfTU9ESUZZKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTBfWF9NT0RJRlkodmFsKQkJYmZpbl93cml0ZTE2KERNQTBfWF9NT0RJRlksIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTBfWV9NT0RJRlkoKQkJYmZpbl9yZWFkMTYoRE1BMF9ZX01PRElGWSkKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUEwX1lfTU9ESUZZKHZhbCkJCWJmaW5fd3JpdGUxNihETUEwX1lfTU9ESUZZLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUEwX0NVUlJfREVTQ19QVFIoKQkJYmZpbl9yZWFkMzIoRE1BMF9DVVJSX0RFU0NfUFRSKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTBfQ1VSUl9ERVNDX1BUUih2YWwpCWJmaW5fd3JpdGUzMihETUEwX0NVUlJfREVTQ19QVFIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTBfQ1VSUl9BRERSKCkJCWJmaW5fcmVhZDMyKERNQTBfQ1VSUl9BRERSKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTBfQ1VSUl9BRERSKHZhbCkJCWJmaW5fd3JpdGUzMihETUEwX0NVUlJfQUREUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BMF9DVVJSX1hfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BMF9DVVJSX1hfQ09VTlQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BMF9DVVJSX1hfQ09VTlQodmFsKQliZmluX3dyaXRlMTYoRE1BMF9DVVJSX1hfQ09VTlQsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTBfQ1VSUl9ZX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTBfQ1VSUl9ZX0NPVU5UKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTBfQ1VSUl9ZX0NPVU5UKHZhbCkJYmZpbl93cml0ZTE2KERNQTBfQ1VSUl9ZX0NPVU5ULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUEwX0lSUV9TVEFUVVMoKQkJYmZpbl9yZWFkMTYoRE1BMF9JUlFfU1RBVFVTKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTBfSVJRX1NUQVRVUyh2YWwpCQliZmluX3dyaXRlMTYoRE1BMF9JUlFfU1RBVFVTLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUEwX1BFUklQSEVSQUxfTUFQKCkJCWJmaW5fcmVhZDE2KERNQTBfUEVSSVBIRVJBTF9NQVApCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BMF9QRVJJUEhFUkFMX01BUCh2YWwpCWJmaW5fd3JpdGUxNihETUEwX1BFUklQSEVSQUxfTUFQLCB2YWwpCi0KLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTFfQ09ORklHKCkJCQliZmluX3JlYWQxNihETUExX0NPTkZJRykKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUExX0NPTkZJRyh2YWwpCQliZmluX3dyaXRlMTYoRE1BMV9DT05GSUcsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTFfTkVYVF9ERVNDX1BUUigpCQliZmluX3JlYWQzMihETUExX05FWFRfREVTQ19QVFIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BMV9ORVhUX0RFU0NfUFRSKHZhbCkJYmZpbl93cml0ZTMyKERNQTFfTkVYVF9ERVNDX1BUUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BMV9TVEFSVF9BRERSKCkJCWJmaW5fcmVhZDMyKERNQTFfU1RBUlRfQUREUikKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUExX1NUQVJUX0FERFIodmFsKQkJYmZpbl93cml0ZTMyKERNQTFfU1RBUlRfQUREUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BMV9YX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTFfWF9DT1VOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUExX1hfQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KERNQTFfWF9DT1VOVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BMV9ZX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTFfWV9DT1VOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUExX1lfQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KERNQTFfWV9DT1VOVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BMV9YX01PRElGWSgpCQliZmluX3JlYWQxNihETUExX1hfTU9ESUZZKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTFfWF9NT0RJRlkodmFsKQkJYmZpbl93cml0ZTE2KERNQTFfWF9NT0RJRlksIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTFfWV9NT0RJRlkoKQkJYmZpbl9yZWFkMTYoRE1BMV9ZX01PRElGWSkKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUExX1lfTU9ESUZZKHZhbCkJCWJmaW5fd3JpdGUxNihETUExX1lfTU9ESUZZLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUExX0NVUlJfREVTQ19QVFIoKQkJYmZpbl9yZWFkMzIoRE1BMV9DVVJSX0RFU0NfUFRSKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTFfQ1VSUl9ERVNDX1BUUih2YWwpCWJmaW5fd3JpdGUzMihETUExX0NVUlJfREVTQ19QVFIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTFfQ1VSUl9BRERSKCkJCWJmaW5fcmVhZDMyKERNQTFfQ1VSUl9BRERSKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTFfQ1VSUl9BRERSKHZhbCkJCWJmaW5fd3JpdGUzMihETUExX0NVUlJfQUREUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BMV9DVVJSX1hfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BMV9DVVJSX1hfQ09VTlQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BMV9DVVJSX1hfQ09VTlQodmFsKQliZmluX3dyaXRlMTYoRE1BMV9DVVJSX1hfQ09VTlQsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTFfQ1VSUl9ZX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTFfQ1VSUl9ZX0NPVU5UKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTFfQ1VSUl9ZX0NPVU5UKHZhbCkJYmZpbl93cml0ZTE2KERNQTFfQ1VSUl9ZX0NPVU5ULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUExX0lSUV9TVEFUVVMoKQkJYmZpbl9yZWFkMTYoRE1BMV9JUlFfU1RBVFVTKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTFfSVJRX1NUQVRVUyh2YWwpCQliZmluX3dyaXRlMTYoRE1BMV9JUlFfU1RBVFVTLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUExX1BFUklQSEVSQUxfTUFQKCkJCWJmaW5fcmVhZDE2KERNQTFfUEVSSVBIRVJBTF9NQVApCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BMV9QRVJJUEhFUkFMX01BUCh2YWwpCWJmaW5fd3JpdGUxNihETUExX1BFUklQSEVSQUxfTUFQLCB2YWwpCi0KLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTJfQ09ORklHKCkJCQliZmluX3JlYWQxNihETUEyX0NPTkZJRykKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUEyX0NPTkZJRyh2YWwpCQliZmluX3dyaXRlMTYoRE1BMl9DT05GSUcsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTJfTkVYVF9ERVNDX1BUUigpCQliZmluX3JlYWQzMihETUEyX05FWFRfREVTQ19QVFIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BMl9ORVhUX0RFU0NfUFRSKHZhbCkJYmZpbl93cml0ZTMyKERNQTJfTkVYVF9ERVNDX1BUUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BMl9TVEFSVF9BRERSKCkJCWJmaW5fcmVhZDMyKERNQTJfU1RBUlRfQUREUikKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUEyX1NUQVJUX0FERFIodmFsKQkJYmZpbl93cml0ZTMyKERNQTJfU1RBUlRfQUREUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BMl9YX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTJfWF9DT1VOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUEyX1hfQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KERNQTJfWF9DT1VOVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BMl9ZX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTJfWV9DT1VOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUEyX1lfQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KERNQTJfWV9DT1VOVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BMl9YX01PRElGWSgpCQliZmluX3JlYWQxNihETUEyX1hfTU9ESUZZKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTJfWF9NT0RJRlkodmFsKQkJYmZpbl93cml0ZTE2KERNQTJfWF9NT0RJRlksIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTJfWV9NT0RJRlkoKQkJYmZpbl9yZWFkMTYoRE1BMl9ZX01PRElGWSkKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUEyX1lfTU9ESUZZKHZhbCkJCWJmaW5fd3JpdGUxNihETUEyX1lfTU9ESUZZLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUEyX0NVUlJfREVTQ19QVFIoKQkJYmZpbl9yZWFkMzIoRE1BMl9DVVJSX0RFU0NfUFRSKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTJfQ1VSUl9ERVNDX1BUUih2YWwpCWJmaW5fd3JpdGUzMihETUEyX0NVUlJfREVTQ19QVFIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTJfQ1VSUl9BRERSKCkJCWJmaW5fcmVhZDMyKERNQTJfQ1VSUl9BRERSKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTJfQ1VSUl9BRERSKHZhbCkJCWJmaW5fd3JpdGUzMihETUEyX0NVUlJfQUREUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BMl9DVVJSX1hfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BMl9DVVJSX1hfQ09VTlQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BMl9DVVJSX1hfQ09VTlQodmFsKQliZmluX3dyaXRlMTYoRE1BMl9DVVJSX1hfQ09VTlQsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTJfQ1VSUl9ZX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTJfQ1VSUl9ZX0NPVU5UKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTJfQ1VSUl9ZX0NPVU5UKHZhbCkJYmZpbl93cml0ZTE2KERNQTJfQ1VSUl9ZX0NPVU5ULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUEyX0lSUV9TVEFUVVMoKQkJYmZpbl9yZWFkMTYoRE1BMl9JUlFfU1RBVFVTKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTJfSVJRX1NUQVRVUyh2YWwpCQliZmluX3dyaXRlMTYoRE1BMl9JUlFfU1RBVFVTLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUEyX1BFUklQSEVSQUxfTUFQKCkJCWJmaW5fcmVhZDE2KERNQTJfUEVSSVBIRVJBTF9NQVApCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BMl9QRVJJUEhFUkFMX01BUCh2YWwpCWJmaW5fd3JpdGUxNihETUEyX1BFUklQSEVSQUxfTUFQLCB2YWwpCi0KLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTNfQ09ORklHKCkJCQliZmluX3JlYWQxNihETUEzX0NPTkZJRykKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUEzX0NPTkZJRyh2YWwpCQliZmluX3dyaXRlMTYoRE1BM19DT05GSUcsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTNfTkVYVF9ERVNDX1BUUigpCQliZmluX3JlYWQzMihETUEzX05FWFRfREVTQ19QVFIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BM19ORVhUX0RFU0NfUFRSKHZhbCkJYmZpbl93cml0ZTMyKERNQTNfTkVYVF9ERVNDX1BUUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BM19TVEFSVF9BRERSKCkJCWJmaW5fcmVhZDMyKERNQTNfU1RBUlRfQUREUikKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUEzX1NUQVJUX0FERFIodmFsKQkJYmZpbl93cml0ZTMyKERNQTNfU1RBUlRfQUREUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BM19YX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTNfWF9DT1VOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUEzX1hfQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KERNQTNfWF9DT1VOVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BM19ZX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTNfWV9DT1VOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUEzX1lfQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KERNQTNfWV9DT1VOVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BM19YX01PRElGWSgpCQliZmluX3JlYWQxNihETUEzX1hfTU9ESUZZKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTNfWF9NT0RJRlkodmFsKQkJYmZpbl93cml0ZTE2KERNQTNfWF9NT0RJRlksIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTNfWV9NT0RJRlkoKQkJYmZpbl9yZWFkMTYoRE1BM19ZX01PRElGWSkKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUEzX1lfTU9ESUZZKHZhbCkJCWJmaW5fd3JpdGUxNihETUEzX1lfTU9ESUZZLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUEzX0NVUlJfREVTQ19QVFIoKQkJYmZpbl9yZWFkMzIoRE1BM19DVVJSX0RFU0NfUFRSKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTNfQ1VSUl9ERVNDX1BUUih2YWwpCWJmaW5fd3JpdGUzMihETUEzX0NVUlJfREVTQ19QVFIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTNfQ1VSUl9BRERSKCkJCWJmaW5fcmVhZDMyKERNQTNfQ1VSUl9BRERSKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTNfQ1VSUl9BRERSKHZhbCkJCWJmaW5fd3JpdGUzMihETUEzX0NVUlJfQUREUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BM19DVVJSX1hfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BM19DVVJSX1hfQ09VTlQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BM19DVVJSX1hfQ09VTlQodmFsKQliZmluX3dyaXRlMTYoRE1BM19DVVJSX1hfQ09VTlQsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTNfQ1VSUl9ZX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTNfQ1VSUl9ZX0NPVU5UKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTNfQ1VSUl9ZX0NPVU5UKHZhbCkJYmZpbl93cml0ZTE2KERNQTNfQ1VSUl9ZX0NPVU5ULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUEzX0lSUV9TVEFUVVMoKQkJYmZpbl9yZWFkMTYoRE1BM19JUlFfU1RBVFVTKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTNfSVJRX1NUQVRVUyh2YWwpCQliZmluX3dyaXRlMTYoRE1BM19JUlFfU1RBVFVTLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUEzX1BFUklQSEVSQUxfTUFQKCkJCWJmaW5fcmVhZDE2KERNQTNfUEVSSVBIRVJBTF9NQVApCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BM19QRVJJUEhFUkFMX01BUCh2YWwpCWJmaW5fd3JpdGUxNihETUEzX1BFUklQSEVSQUxfTUFQLCB2YWwpCi0KLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTRfQ09ORklHKCkJCQliZmluX3JlYWQxNihETUE0X0NPTkZJRykKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUE0X0NPTkZJRyh2YWwpCQliZmluX3dyaXRlMTYoRE1BNF9DT05GSUcsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTRfTkVYVF9ERVNDX1BUUigpCQliZmluX3JlYWQzMihETUE0X05FWFRfREVTQ19QVFIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BNF9ORVhUX0RFU0NfUFRSKHZhbCkJYmZpbl93cml0ZTMyKERNQTRfTkVYVF9ERVNDX1BUUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BNF9TVEFSVF9BRERSKCkJCWJmaW5fcmVhZDMyKERNQTRfU1RBUlRfQUREUikKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUE0X1NUQVJUX0FERFIodmFsKQkJYmZpbl93cml0ZTMyKERNQTRfU1RBUlRfQUREUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BNF9YX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTRfWF9DT1VOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUE0X1hfQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KERNQTRfWF9DT1VOVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BNF9ZX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTRfWV9DT1VOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUE0X1lfQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KERNQTRfWV9DT1VOVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BNF9YX01PRElGWSgpCQliZmluX3JlYWQxNihETUE0X1hfTU9ESUZZKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTRfWF9NT0RJRlkodmFsKQkJYmZpbl93cml0ZTE2KERNQTRfWF9NT0RJRlksIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTRfWV9NT0RJRlkoKQkJYmZpbl9yZWFkMTYoRE1BNF9ZX01PRElGWSkKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUE0X1lfTU9ESUZZKHZhbCkJCWJmaW5fd3JpdGUxNihETUE0X1lfTU9ESUZZLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUE0X0NVUlJfREVTQ19QVFIoKQkJYmZpbl9yZWFkMzIoRE1BNF9DVVJSX0RFU0NfUFRSKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTRfQ1VSUl9ERVNDX1BUUih2YWwpCWJmaW5fd3JpdGUzMihETUE0X0NVUlJfREVTQ19QVFIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTRfQ1VSUl9BRERSKCkJCWJmaW5fcmVhZDMyKERNQTRfQ1VSUl9BRERSKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTRfQ1VSUl9BRERSKHZhbCkJCWJmaW5fd3JpdGUzMihETUE0X0NVUlJfQUREUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BNF9DVVJSX1hfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BNF9DVVJSX1hfQ09VTlQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BNF9DVVJSX1hfQ09VTlQodmFsKQliZmluX3dyaXRlMTYoRE1BNF9DVVJSX1hfQ09VTlQsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTRfQ1VSUl9ZX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTRfQ1VSUl9ZX0NPVU5UKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTRfQ1VSUl9ZX0NPVU5UKHZhbCkJYmZpbl93cml0ZTE2KERNQTRfQ1VSUl9ZX0NPVU5ULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUE0X0lSUV9TVEFUVVMoKQkJYmZpbl9yZWFkMTYoRE1BNF9JUlFfU1RBVFVTKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTRfSVJRX1NUQVRVUyh2YWwpCQliZmluX3dyaXRlMTYoRE1BNF9JUlFfU1RBVFVTLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUE0X1BFUklQSEVSQUxfTUFQKCkJCWJmaW5fcmVhZDE2KERNQTRfUEVSSVBIRVJBTF9NQVApCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BNF9QRVJJUEhFUkFMX01BUCh2YWwpCWJmaW5fd3JpdGUxNihETUE0X1BFUklQSEVSQUxfTUFQLCB2YWwpCi0KLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTVfQ09ORklHKCkJCQliZmluX3JlYWQxNihETUE1X0NPTkZJRykKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUE1X0NPTkZJRyh2YWwpCQliZmluX3dyaXRlMTYoRE1BNV9DT05GSUcsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTVfTkVYVF9ERVNDX1BUUigpCQliZmluX3JlYWQzMihETUE1X05FWFRfREVTQ19QVFIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BNV9ORVhUX0RFU0NfUFRSKHZhbCkJYmZpbl93cml0ZTMyKERNQTVfTkVYVF9ERVNDX1BUUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BNV9TVEFSVF9BRERSKCkJCWJmaW5fcmVhZDMyKERNQTVfU1RBUlRfQUREUikKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUE1X1NUQVJUX0FERFIodmFsKQkJYmZpbl93cml0ZTMyKERNQTVfU1RBUlRfQUREUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BNV9YX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTVfWF9DT1VOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUE1X1hfQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KERNQTVfWF9DT1VOVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BNV9ZX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTVfWV9DT1VOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUE1X1lfQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KERNQTVfWV9DT1VOVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BNV9YX01PRElGWSgpCQliZmluX3JlYWQxNihETUE1X1hfTU9ESUZZKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTVfWF9NT0RJRlkodmFsKQkJYmZpbl93cml0ZTE2KERNQTVfWF9NT0RJRlksIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTVfWV9NT0RJRlkoKQkJYmZpbl9yZWFkMTYoRE1BNV9ZX01PRElGWSkKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUE1X1lfTU9ESUZZKHZhbCkJCWJmaW5fd3JpdGUxNihETUE1X1lfTU9ESUZZLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUE1X0NVUlJfREVTQ19QVFIoKQkJYmZpbl9yZWFkMzIoRE1BNV9DVVJSX0RFU0NfUFRSKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTVfQ1VSUl9ERVNDX1BUUih2YWwpCWJmaW5fd3JpdGUzMihETUE1X0NVUlJfREVTQ19QVFIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTVfQ1VSUl9BRERSKCkJCWJmaW5fcmVhZDMyKERNQTVfQ1VSUl9BRERSKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTVfQ1VSUl9BRERSKHZhbCkJCWJmaW5fd3JpdGUzMihETUE1X0NVUlJfQUREUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BNV9DVVJSX1hfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BNV9DVVJSX1hfQ09VTlQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BNV9DVVJSX1hfQ09VTlQodmFsKQliZmluX3dyaXRlMTYoRE1BNV9DVVJSX1hfQ09VTlQsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTVfQ1VSUl9ZX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTVfQ1VSUl9ZX0NPVU5UKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTVfQ1VSUl9ZX0NPVU5UKHZhbCkJYmZpbl93cml0ZTE2KERNQTVfQ1VSUl9ZX0NPVU5ULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUE1X0lSUV9TVEFUVVMoKQkJYmZpbl9yZWFkMTYoRE1BNV9JUlFfU1RBVFVTKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTVfSVJRX1NUQVRVUyh2YWwpCQliZmluX3dyaXRlMTYoRE1BNV9JUlFfU1RBVFVTLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUE1X1BFUklQSEVSQUxfTUFQKCkJCWJmaW5fcmVhZDE2KERNQTVfUEVSSVBIRVJBTF9NQVApCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BNV9QRVJJUEhFUkFMX01BUCh2YWwpCWJmaW5fd3JpdGUxNihETUE1X1BFUklQSEVSQUxfTUFQLCB2YWwpCi0KLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTZfQ09ORklHKCkJCQliZmluX3JlYWQxNihETUE2X0NPTkZJRykKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUE2X0NPTkZJRyh2YWwpCQliZmluX3dyaXRlMTYoRE1BNl9DT05GSUcsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTZfTkVYVF9ERVNDX1BUUigpCQliZmluX3JlYWQzMihETUE2X05FWFRfREVTQ19QVFIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BNl9ORVhUX0RFU0NfUFRSKHZhbCkJYmZpbl93cml0ZTMyKERNQTZfTkVYVF9ERVNDX1BUUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BNl9TVEFSVF9BRERSKCkJCWJmaW5fcmVhZDMyKERNQTZfU1RBUlRfQUREUikKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUE2X1NUQVJUX0FERFIodmFsKQkJYmZpbl93cml0ZTMyKERNQTZfU1RBUlRfQUREUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BNl9YX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTZfWF9DT1VOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUE2X1hfQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KERNQTZfWF9DT1VOVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BNl9ZX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTZfWV9DT1VOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUE2X1lfQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KERNQTZfWV9DT1VOVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BNl9YX01PRElGWSgpCQliZmluX3JlYWQxNihETUE2X1hfTU9ESUZZKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTZfWF9NT0RJRlkodmFsKQkJYmZpbl93cml0ZTE2KERNQTZfWF9NT0RJRlksIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTZfWV9NT0RJRlkoKQkJYmZpbl9yZWFkMTYoRE1BNl9ZX01PRElGWSkKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUE2X1lfTU9ESUZZKHZhbCkJCWJmaW5fd3JpdGUxNihETUE2X1lfTU9ESUZZLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUE2X0NVUlJfREVTQ19QVFIoKQkJYmZpbl9yZWFkMzIoRE1BNl9DVVJSX0RFU0NfUFRSKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTZfQ1VSUl9ERVNDX1BUUih2YWwpCWJmaW5fd3JpdGUzMihETUE2X0NVUlJfREVTQ19QVFIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTZfQ1VSUl9BRERSKCkJCWJmaW5fcmVhZDMyKERNQTZfQ1VSUl9BRERSKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTZfQ1VSUl9BRERSKHZhbCkJCWJmaW5fd3JpdGUzMihETUE2X0NVUlJfQUREUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BNl9DVVJSX1hfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BNl9DVVJSX1hfQ09VTlQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BNl9DVVJSX1hfQ09VTlQodmFsKQliZmluX3dyaXRlMTYoRE1BNl9DVVJSX1hfQ09VTlQsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTZfQ1VSUl9ZX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTZfQ1VSUl9ZX0NPVU5UKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTZfQ1VSUl9ZX0NPVU5UKHZhbCkJYmZpbl93cml0ZTE2KERNQTZfQ1VSUl9ZX0NPVU5ULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUE2X0lSUV9TVEFUVVMoKQkJYmZpbl9yZWFkMTYoRE1BNl9JUlFfU1RBVFVTKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTZfSVJRX1NUQVRVUyh2YWwpCQliZmluX3dyaXRlMTYoRE1BNl9JUlFfU1RBVFVTLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUE2X1BFUklQSEVSQUxfTUFQKCkJCWJmaW5fcmVhZDE2KERNQTZfUEVSSVBIRVJBTF9NQVApCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BNl9QRVJJUEhFUkFMX01BUCh2YWwpCWJmaW5fd3JpdGUxNihETUE2X1BFUklQSEVSQUxfTUFQLCB2YWwpCi0KLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTdfQ09ORklHKCkJCQliZmluX3JlYWQxNihETUE3X0NPTkZJRykKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUE3X0NPTkZJRyh2YWwpCQliZmluX3dyaXRlMTYoRE1BN19DT05GSUcsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTdfTkVYVF9ERVNDX1BUUigpCQliZmluX3JlYWQzMihETUE3X05FWFRfREVTQ19QVFIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BN19ORVhUX0RFU0NfUFRSKHZhbCkJYmZpbl93cml0ZTMyKERNQTdfTkVYVF9ERVNDX1BUUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BN19TVEFSVF9BRERSKCkJCWJmaW5fcmVhZDMyKERNQTdfU1RBUlRfQUREUikKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUE3X1NUQVJUX0FERFIodmFsKQkJYmZpbl93cml0ZTMyKERNQTdfU1RBUlRfQUREUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BN19YX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTdfWF9DT1VOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUE3X1hfQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KERNQTdfWF9DT1VOVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BN19ZX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTdfWV9DT1VOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUE3X1lfQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KERNQTdfWV9DT1VOVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BN19YX01PRElGWSgpCQliZmluX3JlYWQxNihETUE3X1hfTU9ESUZZKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTdfWF9NT0RJRlkodmFsKQkJYmZpbl93cml0ZTE2KERNQTdfWF9NT0RJRlksIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTdfWV9NT0RJRlkoKQkJYmZpbl9yZWFkMTYoRE1BN19ZX01PRElGWSkKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUE3X1lfTU9ESUZZKHZhbCkJCWJmaW5fd3JpdGUxNihETUE3X1lfTU9ESUZZLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUE3X0NVUlJfREVTQ19QVFIoKQkJYmZpbl9yZWFkMzIoRE1BN19DVVJSX0RFU0NfUFRSKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTdfQ1VSUl9ERVNDX1BUUih2YWwpCWJmaW5fd3JpdGUzMihETUE3X0NVUlJfREVTQ19QVFIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTdfQ1VSUl9BRERSKCkJCWJmaW5fcmVhZDMyKERNQTdfQ1VSUl9BRERSKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTdfQ1VSUl9BRERSKHZhbCkJCWJmaW5fd3JpdGUzMihETUE3X0NVUlJfQUREUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BN19DVVJSX1hfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BN19DVVJSX1hfQ09VTlQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BN19DVVJSX1hfQ09VTlQodmFsKQliZmluX3dyaXRlMTYoRE1BN19DVVJSX1hfQ09VTlQsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTdfQ1VSUl9ZX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTdfQ1VSUl9ZX0NPVU5UKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTdfQ1VSUl9ZX0NPVU5UKHZhbCkJYmZpbl93cml0ZTE2KERNQTdfQ1VSUl9ZX0NPVU5ULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUE3X0lSUV9TVEFUVVMoKQkJYmZpbl9yZWFkMTYoRE1BN19JUlFfU1RBVFVTKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTdfSVJRX1NUQVRVUyh2YWwpCQliZmluX3dyaXRlMTYoRE1BN19JUlFfU1RBVFVTLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUE3X1BFUklQSEVSQUxfTUFQKCkJCWJmaW5fcmVhZDE2KERNQTdfUEVSSVBIRVJBTF9NQVApCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BN19QRVJJUEhFUkFMX01BUCh2YWwpCWJmaW5fd3JpdGUxNihETUE3X1BFUklQSEVSQUxfTUFQLCB2YWwpCi0KLSNkZWZpbmUgYmZpbl9yZWFkX0RNQThfQ09ORklHKCkJCQliZmluX3JlYWQxNihETUE4X0NPTkZJRykKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUE4X0NPTkZJRyh2YWwpCQliZmluX3dyaXRlMTYoRE1BOF9DT05GSUcsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQThfTkVYVF9ERVNDX1BUUigpCQliZmluX3JlYWQzMihETUE4X05FWFRfREVTQ19QVFIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BOF9ORVhUX0RFU0NfUFRSKHZhbCkJYmZpbl93cml0ZTMyKERNQThfTkVYVF9ERVNDX1BUUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BOF9TVEFSVF9BRERSKCkJCWJmaW5fcmVhZDMyKERNQThfU1RBUlRfQUREUikKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUE4X1NUQVJUX0FERFIodmFsKQkJYmZpbl93cml0ZTMyKERNQThfU1RBUlRfQUREUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BOF9YX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQThfWF9DT1VOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUE4X1hfQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KERNQThfWF9DT1VOVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BOF9ZX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQThfWV9DT1VOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUE4X1lfQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KERNQThfWV9DT1VOVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BOF9YX01PRElGWSgpCQliZmluX3JlYWQxNihETUE4X1hfTU9ESUZZKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQThfWF9NT0RJRlkodmFsKQkJYmZpbl93cml0ZTE2KERNQThfWF9NT0RJRlksIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQThfWV9NT0RJRlkoKQkJYmZpbl9yZWFkMTYoRE1BOF9ZX01PRElGWSkKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUE4X1lfTU9ESUZZKHZhbCkJCWJmaW5fd3JpdGUxNihETUE4X1lfTU9ESUZZLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUE4X0NVUlJfREVTQ19QVFIoKQkJYmZpbl9yZWFkMzIoRE1BOF9DVVJSX0RFU0NfUFRSKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQThfQ1VSUl9ERVNDX1BUUih2YWwpCWJmaW5fd3JpdGUzMihETUE4X0NVUlJfREVTQ19QVFIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQThfQ1VSUl9BRERSKCkJCWJmaW5fcmVhZDMyKERNQThfQ1VSUl9BRERSKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQThfQ1VSUl9BRERSKHZhbCkJCWJmaW5fd3JpdGUzMihETUE4X0NVUlJfQUREUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BOF9DVVJSX1hfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BOF9DVVJSX1hfQ09VTlQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BOF9DVVJSX1hfQ09VTlQodmFsKQliZmluX3dyaXRlMTYoRE1BOF9DVVJSX1hfQ09VTlQsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQThfQ1VSUl9ZX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQThfQ1VSUl9ZX0NPVU5UKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQThfQ1VSUl9ZX0NPVU5UKHZhbCkJYmZpbl93cml0ZTE2KERNQThfQ1VSUl9ZX0NPVU5ULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUE4X0lSUV9TVEFUVVMoKQkJYmZpbl9yZWFkMTYoRE1BOF9JUlFfU1RBVFVTKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQThfSVJRX1NUQVRVUyh2YWwpCQliZmluX3dyaXRlMTYoRE1BOF9JUlFfU1RBVFVTLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUE4X1BFUklQSEVSQUxfTUFQKCkJCWJmaW5fcmVhZDE2KERNQThfUEVSSVBIRVJBTF9NQVApCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BOF9QRVJJUEhFUkFMX01BUCh2YWwpCWJmaW5fd3JpdGUxNihETUE4X1BFUklQSEVSQUxfTUFQLCB2YWwpCi0KLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTlfQ09ORklHKCkJCQliZmluX3JlYWQxNihETUE5X0NPTkZJRykKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUE5X0NPTkZJRyh2YWwpCQliZmluX3dyaXRlMTYoRE1BOV9DT05GSUcsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTlfTkVYVF9ERVNDX1BUUigpCQliZmluX3JlYWQzMihETUE5X05FWFRfREVTQ19QVFIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BOV9ORVhUX0RFU0NfUFRSKHZhbCkJYmZpbl93cml0ZTMyKERNQTlfTkVYVF9ERVNDX1BUUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BOV9TVEFSVF9BRERSKCkJCWJmaW5fcmVhZDMyKERNQTlfU1RBUlRfQUREUikKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUE5X1NUQVJUX0FERFIodmFsKQkJYmZpbl93cml0ZTMyKERNQTlfU1RBUlRfQUREUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BOV9YX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTlfWF9DT1VOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUE5X1hfQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KERNQTlfWF9DT1VOVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BOV9ZX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTlfWV9DT1VOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUE5X1lfQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KERNQTlfWV9DT1VOVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BOV9YX01PRElGWSgpCQliZmluX3JlYWQxNihETUE5X1hfTU9ESUZZKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTlfWF9NT0RJRlkodmFsKQkJYmZpbl93cml0ZTE2KERNQTlfWF9NT0RJRlksIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTlfWV9NT0RJRlkoKQkJYmZpbl9yZWFkMTYoRE1BOV9ZX01PRElGWSkKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUE5X1lfTU9ESUZZKHZhbCkJCWJmaW5fd3JpdGUxNihETUE5X1lfTU9ESUZZLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUE5X0NVUlJfREVTQ19QVFIoKQkJYmZpbl9yZWFkMzIoRE1BOV9DVVJSX0RFU0NfUFRSKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTlfQ1VSUl9ERVNDX1BUUih2YWwpCWJmaW5fd3JpdGUzMihETUE5X0NVUlJfREVTQ19QVFIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTlfQ1VSUl9BRERSKCkJCWJmaW5fcmVhZDMyKERNQTlfQ1VSUl9BRERSKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTlfQ1VSUl9BRERSKHZhbCkJCWJmaW5fd3JpdGUzMihETUE5X0NVUlJfQUREUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BOV9DVVJSX1hfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BOV9DVVJSX1hfQ09VTlQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BOV9DVVJSX1hfQ09VTlQodmFsKQliZmluX3dyaXRlMTYoRE1BOV9DVVJSX1hfQ09VTlQsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTlfQ1VSUl9ZX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTlfQ1VSUl9ZX0NPVU5UKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTlfQ1VSUl9ZX0NPVU5UKHZhbCkJYmZpbl93cml0ZTE2KERNQTlfQ1VSUl9ZX0NPVU5ULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUE5X0lSUV9TVEFUVVMoKQkJYmZpbl9yZWFkMTYoRE1BOV9JUlFfU1RBVFVTKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTlfSVJRX1NUQVRVUyh2YWwpCQliZmluX3dyaXRlMTYoRE1BOV9JUlFfU1RBVFVTLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUE5X1BFUklQSEVSQUxfTUFQKCkJCWJmaW5fcmVhZDE2KERNQTlfUEVSSVBIRVJBTF9NQVApCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BOV9QRVJJUEhFUkFMX01BUCh2YWwpCWJmaW5fd3JpdGUxNihETUE5X1BFUklQSEVSQUxfTUFQLCB2YWwpCi0KLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTEwX0NPTkZJRygpCQliZmluX3JlYWQxNihETUExMF9DT05GSUcpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTBfQ09ORklHKHZhbCkJCWJmaW5fd3JpdGUxNihETUExMF9DT05GSUcsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTEwX05FWFRfREVTQ19QVFIoKQkJYmZpbl9yZWFkMzIoRE1BMTBfTkVYVF9ERVNDX1BUUikKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUExMF9ORVhUX0RFU0NfUFRSKHZhbCkJYmZpbl93cml0ZTMyKERNQTEwX05FWFRfREVTQ19QVFIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTEwX1NUQVJUX0FERFIoKQkJYmZpbl9yZWFkMzIoRE1BMTBfU1RBUlRfQUREUikKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUExMF9TVEFSVF9BRERSKHZhbCkJYmZpbl93cml0ZTMyKERNQTEwX1NUQVJUX0FERFIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTEwX1hfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BMTBfWF9DT1VOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUExMF9YX0NPVU5UKHZhbCkJCWJmaW5fd3JpdGUxNihETUExMF9YX0NPVU5ULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUExMF9ZX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTEwX1lfQ09VTlQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTBfWV9DT1VOVCh2YWwpCQliZmluX3dyaXRlMTYoRE1BMTBfWV9DT1VOVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BMTBfWF9NT0RJRlkoKQkJYmZpbl9yZWFkMTYoRE1BMTBfWF9NT0RJRlkpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTBfWF9NT0RJRlkodmFsKQkJYmZpbl93cml0ZTE2KERNQTEwX1hfTU9ESUZZLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUExMF9ZX01PRElGWSgpCQliZmluX3JlYWQxNihETUExMF9ZX01PRElGWSkKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUExMF9ZX01PRElGWSh2YWwpCQliZmluX3dyaXRlMTYoRE1BMTBfWV9NT0RJRlksIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTEwX0NVUlJfREVTQ19QVFIoKQkJYmZpbl9yZWFkMzIoRE1BMTBfQ1VSUl9ERVNDX1BUUikKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUExMF9DVVJSX0RFU0NfUFRSKHZhbCkJYmZpbl93cml0ZTMyKERNQTEwX0NVUlJfREVTQ19QVFIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTEwX0NVUlJfQUREUigpCQliZmluX3JlYWQzMihETUExMF9DVVJSX0FERFIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTBfQ1VSUl9BRERSKHZhbCkJCWJmaW5fd3JpdGUzMihETUExMF9DVVJSX0FERFIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTEwX0NVUlJfWF9DT1VOVCgpCQliZmluX3JlYWQxNihETUExMF9DVVJSX1hfQ09VTlQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTBfQ1VSUl9YX0NPVU5UKHZhbCkJYmZpbl93cml0ZTE2KERNQTEwX0NVUlJfWF9DT1VOVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BMTBfQ1VSUl9ZX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTEwX0NVUlJfWV9DT1VOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUExMF9DVVJSX1lfQ09VTlQodmFsKQliZmluX3dyaXRlMTYoRE1BMTBfQ1VSUl9ZX0NPVU5ULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUExMF9JUlFfU1RBVFVTKCkJCWJmaW5fcmVhZDE2KERNQTEwX0lSUV9TVEFUVVMpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTBfSVJRX1NUQVRVUyh2YWwpCWJmaW5fd3JpdGUxNihETUExMF9JUlFfU1RBVFVTLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUExMF9QRVJJUEhFUkFMX01BUCgpCWJmaW5fcmVhZDE2KERNQTEwX1BFUklQSEVSQUxfTUFQKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTEwX1BFUklQSEVSQUxfTUFQKHZhbCkJYmZpbl93cml0ZTE2KERNQTEwX1BFUklQSEVSQUxfTUFQLCB2YWwpCi0KLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTExX0NPTkZJRygpCQliZmluX3JlYWQxNihETUExMV9DT05GSUcpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTFfQ09ORklHKHZhbCkJCWJmaW5fd3JpdGUxNihETUExMV9DT05GSUcsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTExX05FWFRfREVTQ19QVFIoKQkJYmZpbl9yZWFkMzIoRE1BMTFfTkVYVF9ERVNDX1BUUikKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUExMV9ORVhUX0RFU0NfUFRSKHZhbCkJYmZpbl93cml0ZTMyKERNQTExX05FWFRfREVTQ19QVFIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTExX1NUQVJUX0FERFIoKQkJYmZpbl9yZWFkMzIoRE1BMTFfU1RBUlRfQUREUikKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUExMV9TVEFSVF9BRERSKHZhbCkJYmZpbl93cml0ZTMyKERNQTExX1NUQVJUX0FERFIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTExX1hfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BMTFfWF9DT1VOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUExMV9YX0NPVU5UKHZhbCkJCWJmaW5fd3JpdGUxNihETUExMV9YX0NPVU5ULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUExMV9ZX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTExX1lfQ09VTlQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTFfWV9DT1VOVCh2YWwpCQliZmluX3dyaXRlMTYoRE1BMTFfWV9DT1VOVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BMTFfWF9NT0RJRlkoKQkJYmZpbl9yZWFkMTYoRE1BMTFfWF9NT0RJRlkpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTFfWF9NT0RJRlkodmFsKQkJYmZpbl93cml0ZTE2KERNQTExX1hfTU9ESUZZLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUExMV9ZX01PRElGWSgpCQliZmluX3JlYWQxNihETUExMV9ZX01PRElGWSkKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUExMV9ZX01PRElGWSh2YWwpCQliZmluX3dyaXRlMTYoRE1BMTFfWV9NT0RJRlksIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTExX0NVUlJfREVTQ19QVFIoKQkJYmZpbl9yZWFkMzIoRE1BMTFfQ1VSUl9ERVNDX1BUUikKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUExMV9DVVJSX0RFU0NfUFRSKHZhbCkJYmZpbl93cml0ZTMyKERNQTExX0NVUlJfREVTQ19QVFIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTExX0NVUlJfQUREUigpCQliZmluX3JlYWQzMihETUExMV9DVVJSX0FERFIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTFfQ1VSUl9BRERSKHZhbCkJCWJmaW5fd3JpdGUzMihETUExMV9DVVJSX0FERFIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTExX0NVUlJfWF9DT1VOVCgpCQliZmluX3JlYWQxNihETUExMV9DVVJSX1hfQ09VTlQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTFfQ1VSUl9YX0NPVU5UKHZhbCkJYmZpbl93cml0ZTE2KERNQTExX0NVUlJfWF9DT1VOVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BMTFfQ1VSUl9ZX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTExX0NVUlJfWV9DT1VOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUExMV9DVVJSX1lfQ09VTlQodmFsKQliZmluX3dyaXRlMTYoRE1BMTFfQ1VSUl9ZX0NPVU5ULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUExMV9JUlFfU1RBVFVTKCkJCWJmaW5fcmVhZDE2KERNQTExX0lSUV9TVEFUVVMpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTFfSVJRX1NUQVRVUyh2YWwpCWJmaW5fd3JpdGUxNihETUExMV9JUlFfU1RBVFVTLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUExMV9QRVJJUEhFUkFMX01BUCgpCWJmaW5fcmVhZDE2KERNQTExX1BFUklQSEVSQUxfTUFQKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTExX1BFUklQSEVSQUxfTUFQKHZhbCkJYmZpbl93cml0ZTE2KERNQTExX1BFUklQSEVSQUxfTUFQLCB2YWwpCi0KLSNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDBfQ09ORklHKCkJCWJmaW5fcmVhZDE2KE1ETUFfRDBfQ09ORklHKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDBfQ09ORklHKHZhbCkJCWJmaW5fd3JpdGUxNihNRE1BX0QwX0NPTkZJRywgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMF9ORVhUX0RFU0NfUFRSKCkJYmZpbl9yZWFkMzIoTURNQV9EMF9ORVhUX0RFU0NfUFRSKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDBfTkVYVF9ERVNDX1BUUih2YWwpCWJmaW5fd3JpdGUzMihNRE1BX0QwX05FWFRfREVTQ19QVFIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDBfU1RBUlRfQUREUigpCQliZmluX3JlYWQzMihNRE1BX0QwX1NUQVJUX0FERFIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMF9TVEFSVF9BRERSKHZhbCkJYmZpbl93cml0ZTMyKE1ETUFfRDBfU1RBUlRfQUREUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMF9YX0NPVU5UKCkJCWJmaW5fcmVhZDE2KE1ETUFfRDBfWF9DT1VOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QwX1hfQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KE1ETUFfRDBfWF9DT1VOVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMF9ZX0NPVU5UKCkJCWJmaW5fcmVhZDE2KE1ETUFfRDBfWV9DT1VOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QwX1lfQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KE1ETUFfRDBfWV9DT1VOVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMF9YX01PRElGWSgpCQliZmluX3JlYWQxNihNRE1BX0QwX1hfTU9ESUZZKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDBfWF9NT0RJRlkodmFsKQliZmluX3dyaXRlMTYoTURNQV9EMF9YX01PRElGWSwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMF9ZX01PRElGWSgpCQliZmluX3JlYWQxNihNRE1BX0QwX1lfTU9ESUZZKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDBfWV9NT0RJRlkodmFsKQliZmluX3dyaXRlMTYoTURNQV9EMF9ZX01PRElGWSwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMF9DVVJSX0RFU0NfUFRSKCkJYmZpbl9yZWFkMzIoTURNQV9EMF9DVVJSX0RFU0NfUFRSKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDBfQ1VSUl9ERVNDX1BUUih2YWwpCWJmaW5fd3JpdGUzMihNRE1BX0QwX0NVUlJfREVTQ19QVFIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDBfQ1VSUl9BRERSKCkJCWJmaW5fcmVhZDMyKE1ETUFfRDBfQ1VSUl9BRERSKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDBfQ1VSUl9BRERSKHZhbCkJYmZpbl93cml0ZTMyKE1ETUFfRDBfQ1VSUl9BRERSLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QwX0NVUlJfWF9DT1VOVCgpCWJmaW5fcmVhZDE2KE1ETUFfRDBfQ1VSUl9YX0NPVU5UKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDBfQ1VSUl9YX0NPVU5UKHZhbCkJYmZpbl93cml0ZTE2KE1ETUFfRDBfQ1VSUl9YX0NPVU5ULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QwX0NVUlJfWV9DT1VOVCgpCWJmaW5fcmVhZDE2KE1ETUFfRDBfQ1VSUl9ZX0NPVU5UKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDBfQ1VSUl9ZX0NPVU5UKHZhbCkJYmZpbl93cml0ZTE2KE1ETUFfRDBfQ1VSUl9ZX0NPVU5ULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QwX0lSUV9TVEFUVVMoKQkJYmZpbl9yZWFkMTYoTURNQV9EMF9JUlFfU1RBVFVTKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDBfSVJRX1NUQVRVUyh2YWwpCWJmaW5fd3JpdGUxNihNRE1BX0QwX0lSUV9TVEFUVVMsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDBfUEVSSVBIRVJBTF9NQVAoKQliZmluX3JlYWQxNihNRE1BX0QwX1BFUklQSEVSQUxfTUFQKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDBfUEVSSVBIRVJBTF9NQVAodmFsKQliZmluX3dyaXRlMTYoTURNQV9EMF9QRVJJUEhFUkFMX01BUCwgdmFsKQotCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MwX0NPTkZJRygpCQliZmluX3JlYWQxNihNRE1BX1MwX0NPTkZJRykKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MwX0NPTkZJRyh2YWwpCQliZmluX3dyaXRlMTYoTURNQV9TMF9DT05GSUcsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzBfTkVYVF9ERVNDX1BUUigpCWJmaW5fcmVhZDMyKE1ETUFfUzBfTkVYVF9ERVNDX1BUUikKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MwX05FWFRfREVTQ19QVFIodmFsKQliZmluX3dyaXRlMzIoTURNQV9TMF9ORVhUX0RFU0NfUFRSLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MwX1NUQVJUX0FERFIoKQkJYmZpbl9yZWFkMzIoTURNQV9TMF9TVEFSVF9BRERSKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzBfU1RBUlRfQUREUih2YWwpCWJmaW5fd3JpdGUzMihNRE1BX1MwX1NUQVJUX0FERFIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzBfWF9DT1VOVCgpCQliZmluX3JlYWQxNihNRE1BX1MwX1hfQ09VTlQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMF9YX0NPVU5UKHZhbCkJCWJmaW5fd3JpdGUxNihNRE1BX1MwX1hfQ09VTlQsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzBfWV9DT1VOVCgpCQliZmluX3JlYWQxNihNRE1BX1MwX1lfQ09VTlQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMF9ZX0NPVU5UKHZhbCkJCWJmaW5fd3JpdGUxNihNRE1BX1MwX1lfQ09VTlQsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzBfWF9NT0RJRlkoKQkJYmZpbl9yZWFkMTYoTURNQV9TMF9YX01PRElGWSkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MwX1hfTU9ESUZZKHZhbCkJYmZpbl93cml0ZTE2KE1ETUFfUzBfWF9NT0RJRlksIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzBfWV9NT0RJRlkoKQkJYmZpbl9yZWFkMTYoTURNQV9TMF9ZX01PRElGWSkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MwX1lfTU9ESUZZKHZhbCkJYmZpbl93cml0ZTE2KE1ETUFfUzBfWV9NT0RJRlksIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzBfQ1VSUl9ERVNDX1BUUigpCWJmaW5fcmVhZDMyKE1ETUFfUzBfQ1VSUl9ERVNDX1BUUikKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MwX0NVUlJfREVTQ19QVFIodmFsKQliZmluX3dyaXRlMzIoTURNQV9TMF9DVVJSX0RFU0NfUFRSLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MwX0NVUlJfQUREUigpCQliZmluX3JlYWQzMihNRE1BX1MwX0NVUlJfQUREUikKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MwX0NVUlJfQUREUih2YWwpCWJmaW5fd3JpdGUzMihNRE1BX1MwX0NVUlJfQUREUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMF9DVVJSX1hfQ09VTlQoKQliZmluX3JlYWQxNihNRE1BX1MwX0NVUlJfWF9DT1VOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MwX0NVUlJfWF9DT1VOVCh2YWwpCWJmaW5fd3JpdGUxNihNRE1BX1MwX0NVUlJfWF9DT1VOVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMF9DVVJSX1lfQ09VTlQoKQliZmluX3JlYWQxNihNRE1BX1MwX0NVUlJfWV9DT1VOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MwX0NVUlJfWV9DT1VOVCh2YWwpCWJmaW5fd3JpdGUxNihNRE1BX1MwX0NVUlJfWV9DT1VOVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMF9JUlFfU1RBVFVTKCkJCWJmaW5fcmVhZDE2KE1ETUFfUzBfSVJRX1NUQVRVUykKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MwX0lSUV9TVEFUVVModmFsKQliZmluX3dyaXRlMTYoTURNQV9TMF9JUlFfU1RBVFVTLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MwX1BFUklQSEVSQUxfTUFQKCkJYmZpbl9yZWFkMTYoTURNQV9TMF9QRVJJUEhFUkFMX01BUCkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MwX1BFUklQSEVSQUxfTUFQKHZhbCkJYmZpbl93cml0ZTE2KE1ETUFfUzBfUEVSSVBIRVJBTF9NQVAsIHZhbCkKLQotI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMV9DT05GSUcoKQkJYmZpbl9yZWFkMTYoTURNQV9EMV9DT05GSUcpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMV9DT05GSUcodmFsKQkJYmZpbl93cml0ZTE2KE1ETUFfRDFfQ09ORklHLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QxX05FWFRfREVTQ19QVFIoKQliZmluX3JlYWQzMihNRE1BX0QxX05FWFRfREVTQ19QVFIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMV9ORVhUX0RFU0NfUFRSKHZhbCkJYmZpbl93cml0ZTMyKE1ETUFfRDFfTkVYVF9ERVNDX1BUUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMV9TVEFSVF9BRERSKCkJCWJmaW5fcmVhZDMyKE1ETUFfRDFfU1RBUlRfQUREUikKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QxX1NUQVJUX0FERFIodmFsKQliZmluX3dyaXRlMzIoTURNQV9EMV9TVEFSVF9BRERSLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QxX1hfQ09VTlQoKQkJYmZpbl9yZWFkMTYoTURNQV9EMV9YX0NPVU5UKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDFfWF9DT1VOVCh2YWwpCQliZmluX3dyaXRlMTYoTURNQV9EMV9YX0NPVU5ULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QxX1lfQ09VTlQoKQkJYmZpbl9yZWFkMTYoTURNQV9EMV9ZX0NPVU5UKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDFfWV9DT1VOVCh2YWwpCQliZmluX3dyaXRlMTYoTURNQV9EMV9ZX0NPVU5ULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QxX1hfTU9ESUZZKCkJCWJmaW5fcmVhZDE2KE1ETUFfRDFfWF9NT0RJRlkpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMV9YX01PRElGWSh2YWwpCWJmaW5fd3JpdGUxNihNRE1BX0QxX1hfTU9ESUZZLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QxX1lfTU9ESUZZKCkJCWJmaW5fcmVhZDE2KE1ETUFfRDFfWV9NT0RJRlkpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMV9ZX01PRElGWSh2YWwpCWJmaW5fd3JpdGUxNihNRE1BX0QxX1lfTU9ESUZZLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QxX0NVUlJfREVTQ19QVFIoKQliZmluX3JlYWQzMihNRE1BX0QxX0NVUlJfREVTQ19QVFIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMV9DVVJSX0RFU0NfUFRSKHZhbCkJYmZpbl93cml0ZTMyKE1ETUFfRDFfQ1VSUl9ERVNDX1BUUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMV9DVVJSX0FERFIoKQkJYmZpbl9yZWFkMzIoTURNQV9EMV9DVVJSX0FERFIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMV9DVVJSX0FERFIodmFsKQliZmluX3dyaXRlMzIoTURNQV9EMV9DVVJSX0FERFIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDFfQ1VSUl9YX0NPVU5UKCkJYmZpbl9yZWFkMTYoTURNQV9EMV9DVVJSX1hfQ09VTlQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMV9DVVJSX1hfQ09VTlQodmFsKQliZmluX3dyaXRlMTYoTURNQV9EMV9DVVJSX1hfQ09VTlQsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDFfQ1VSUl9ZX0NPVU5UKCkJYmZpbl9yZWFkMTYoTURNQV9EMV9DVVJSX1lfQ09VTlQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMV9DVVJSX1lfQ09VTlQodmFsKQliZmluX3dyaXRlMTYoTURNQV9EMV9DVVJSX1lfQ09VTlQsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDFfSVJRX1NUQVRVUygpCQliZmluX3JlYWQxNihNRE1BX0QxX0lSUV9TVEFUVVMpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMV9JUlFfU1RBVFVTKHZhbCkJYmZpbl93cml0ZTE2KE1ETUFfRDFfSVJRX1NUQVRVUywgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMV9QRVJJUEhFUkFMX01BUCgpCWJmaW5fcmVhZDE2KE1ETUFfRDFfUEVSSVBIRVJBTF9NQVApCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMV9QRVJJUEhFUkFMX01BUCh2YWwpCWJmaW5fd3JpdGUxNihNRE1BX0QxX1BFUklQSEVSQUxfTUFQLCB2YWwpCi0KLSNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzFfQ09ORklHKCkJCWJmaW5fcmVhZDE2KE1ETUFfUzFfQ09ORklHKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzFfQ09ORklHKHZhbCkJCWJmaW5fd3JpdGUxNihNRE1BX1MxX0NPTkZJRywgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMV9ORVhUX0RFU0NfUFRSKCkJYmZpbl9yZWFkMzIoTURNQV9TMV9ORVhUX0RFU0NfUFRSKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzFfTkVYVF9ERVNDX1BUUih2YWwpCWJmaW5fd3JpdGUzMihNRE1BX1MxX05FWFRfREVTQ19QVFIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzFfU1RBUlRfQUREUigpCQliZmluX3JlYWQzMihNRE1BX1MxX1NUQVJUX0FERFIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMV9TVEFSVF9BRERSKHZhbCkJYmZpbl93cml0ZTMyKE1ETUFfUzFfU1RBUlRfQUREUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMV9YX0NPVU5UKCkJCWJmaW5fcmVhZDE2KE1ETUFfUzFfWF9DT1VOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MxX1hfQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KE1ETUFfUzFfWF9DT1VOVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMV9ZX0NPVU5UKCkJCWJmaW5fcmVhZDE2KE1ETUFfUzFfWV9DT1VOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MxX1lfQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KE1ETUFfUzFfWV9DT1VOVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMV9YX01PRElGWSgpCQliZmluX3JlYWQxNihNRE1BX1MxX1hfTU9ESUZZKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzFfWF9NT0RJRlkodmFsKQliZmluX3dyaXRlMTYoTURNQV9TMV9YX01PRElGWSwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMV9ZX01PRElGWSgpCQliZmluX3JlYWQxNihNRE1BX1MxX1lfTU9ESUZZKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzFfWV9NT0RJRlkodmFsKQliZmluX3dyaXRlMTYoTURNQV9TMV9ZX01PRElGWSwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMV9DVVJSX0RFU0NfUFRSKCkJYmZpbl9yZWFkMzIoTURNQV9TMV9DVVJSX0RFU0NfUFRSKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzFfQ1VSUl9ERVNDX1BUUih2YWwpCWJmaW5fd3JpdGUzMihNRE1BX1MxX0NVUlJfREVTQ19QVFIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzFfQ1VSUl9BRERSKCkJCWJmaW5fcmVhZDMyKE1ETUFfUzFfQ1VSUl9BRERSKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzFfQ1VSUl9BRERSKHZhbCkJYmZpbl93cml0ZTMyKE1ETUFfUzFfQ1VSUl9BRERSLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MxX0NVUlJfWF9DT1VOVCgpCWJmaW5fcmVhZDE2KE1ETUFfUzFfQ1VSUl9YX0NPVU5UKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzFfQ1VSUl9YX0NPVU5UKHZhbCkJYmZpbl93cml0ZTE2KE1ETUFfUzFfQ1VSUl9YX0NPVU5ULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MxX0NVUlJfWV9DT1VOVCgpCWJmaW5fcmVhZDE2KE1ETUFfUzFfQ1VSUl9ZX0NPVU5UKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzFfQ1VSUl9ZX0NPVU5UKHZhbCkJYmZpbl93cml0ZTE2KE1ETUFfUzFfQ1VSUl9ZX0NPVU5ULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MxX0lSUV9TVEFUVVMoKQkJYmZpbl9yZWFkMTYoTURNQV9TMV9JUlFfU1RBVFVTKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzFfSVJRX1NUQVRVUyh2YWwpCWJmaW5fd3JpdGUxNihNRE1BX1MxX0lSUV9TVEFUVVMsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzFfUEVSSVBIRVJBTF9NQVAoKQliZmluX3JlYWQxNihNRE1BX1MxX1BFUklQSEVSQUxfTUFQKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzFfUEVSSVBIRVJBTF9NQVAodmFsKQliZmluX3dyaXRlMTYoTURNQV9TMV9QRVJJUEhFUkFMX01BUCwgdmFsKQotCi0KLS8qIFBhcmFsbGVsIFBlcmlwaGVyYWwgSW50ZXJmYWNlICgweEZGQzAxMDAwIC0gMHhGRkMwMTBGRikJCQkJCQkJKi8KLSNkZWZpbmUgYmZpbl9yZWFkX1BQSV9DT05UUk9MKCkJCQliZmluX3JlYWQxNihQUElfQ09OVFJPTCkKLSNkZWZpbmUgYmZpbl93cml0ZV9QUElfQ09OVFJPTCh2YWwpCQliZmluX3dyaXRlMTYoUFBJX0NPTlRST0wsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1BQSV9TVEFUVVMoKQkJCWJmaW5fcmVhZDE2KFBQSV9TVEFUVVMpCi0jZGVmaW5lIGJmaW5fd3JpdGVfUFBJX1NUQVRVUyh2YWwpCQliZmluX3dyaXRlMTYoUFBJX1NUQVRVUywgdmFsKQotI2RlZmluZSBiZmluX2NsZWFyX1BQSV9TVEFUVVMoKQkJCWJmaW5fd3JpdGVfUFBJX1NUQVRVUygweEZGRkYpCi0jZGVmaW5lIGJmaW5fcmVhZF9QUElfREVMQVkoKQkJCWJmaW5fcmVhZDE2KFBQSV9ERUxBWSkKLSNkZWZpbmUgYmZpbl93cml0ZV9QUElfREVMQVkodmFsKQkJYmZpbl93cml0ZTE2KFBQSV9ERUxBWSwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfUFBJX0NPVU5UKCkJCQliZmluX3JlYWQxNihQUElfQ09VTlQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfUFBJX0NPVU5UKHZhbCkJCWJmaW5fd3JpdGUxNihQUElfQ09VTlQsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1BQSV9GUkFNRSgpCQkJYmZpbl9yZWFkMTYoUFBJX0ZSQU1FKQotI2RlZmluZSBiZmluX3dyaXRlX1BQSV9GUkFNRSh2YWwpCQliZmluX3dyaXRlMTYoUFBJX0ZSQU1FLCB2YWwpCi0KLQotLyogVHdvLVdpcmUgSW50ZXJmYWNlCQkoMHhGRkMwMTQwMCAtIDB4RkZDMDE0RkYpCQkJCQkJCQkqLwotCi0vKiBHZW5lcmFsIFB1cnBvc2UgSS9PIFBvcnQgRyAoMHhGRkMwMTUwMCAtIDB4RkZDMDE1RkYpCQkJCQkJCQkqLwotI2RlZmluZSBiZmluX3JlYWRfUE9SVEdJTygpCQkJYmZpbl9yZWFkMTYoUE9SVEdJTykKLSNkZWZpbmUgYmZpbl93cml0ZV9QT1JUR0lPKHZhbCkJCQliZmluX3dyaXRlMTYoUE9SVEdJTywgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfUE9SVEdJT19DTEVBUigpCQliZmluX3JlYWQxNihQT1JUR0lPX0NMRUFSKQotI2RlZmluZSBiZmluX3dyaXRlX1BPUlRHSU9fQ0xFQVIodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRHSU9fQ0xFQVIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1BPUlRHSU9fU0VUKCkJCQliZmluX3JlYWQxNihQT1JUR0lPX1NFVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9QT1JUR0lPX1NFVCh2YWwpCQliZmluX3dyaXRlMTYoUE9SVEdJT19TRVQsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1BPUlRHSU9fVE9HR0xFKCkJCWJmaW5fcmVhZDE2KFBPUlRHSU9fVE9HR0xFKQotI2RlZmluZSBiZmluX3dyaXRlX1BPUlRHSU9fVE9HR0xFKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JUR0lPX1RPR0dMRSwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfUE9SVEdJT19NQVNLQSgpCQliZmluX3JlYWQxNihQT1JUR0lPX01BU0tBKQotI2RlZmluZSBiZmluX3dyaXRlX1BPUlRHSU9fTUFTS0EodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRHSU9fTUFTS0EsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1BPUlRHSU9fTUFTS0FfQ0xFQVIoKQkJYmZpbl9yZWFkMTYoUE9SVEdJT19NQVNLQV9DTEVBUikKLSNkZWZpbmUgYmZpbl93cml0ZV9QT1JUR0lPX01BU0tBX0NMRUFSKHZhbCkJYmZpbl93cml0ZTE2KFBPUlRHSU9fTUFTS0FfQ0xFQVIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1BPUlRHSU9fTUFTS0FfU0VUKCkJCWJmaW5fcmVhZDE2KFBPUlRHSU9fTUFTS0FfU0VUKQotI2RlZmluZSBiZmluX3dyaXRlX1BPUlRHSU9fTUFTS0FfU0VUKHZhbCkJYmZpbl93cml0ZTE2KFBPUlRHSU9fTUFTS0FfU0VULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9QT1JUR0lPX01BU0tBX1RPR0dMRSgpCWJmaW5fcmVhZDE2KFBPUlRHSU9fTUFTS0FfVE9HR0xFKQotI2RlZmluZSBiZmluX3dyaXRlX1BPUlRHSU9fTUFTS0FfVE9HR0xFKHZhbCkJYmZpbl93cml0ZTE2KFBPUlRHSU9fTUFTS0FfVE9HR0xFLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9QT1JUR0lPX01BU0tCKCkJCWJmaW5fcmVhZDE2KFBPUlRHSU9fTUFTS0IpCi0jZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEdJT19NQVNLQih2YWwpCQliZmluX3dyaXRlMTYoUE9SVEdJT19NQVNLQiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfUE9SVEdJT19NQVNLQl9DTEVBUigpCQliZmluX3JlYWQxNihQT1JUR0lPX01BU0tCX0NMRUFSKQotI2RlZmluZSBiZmluX3dyaXRlX1BPUlRHSU9fTUFTS0JfQ0xFQVIodmFsKQliZmluX3dyaXRlMTYoUE9SVEdJT19NQVNLQl9DTEVBUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfUE9SVEdJT19NQVNLQl9TRVQoKQkJYmZpbl9yZWFkMTYoUE9SVEdJT19NQVNLQl9TRVQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEdJT19NQVNLQl9TRVQodmFsKQliZmluX3dyaXRlMTYoUE9SVEdJT19NQVNLQl9TRVQsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1BPUlRHSU9fTUFTS0JfVE9HR0xFKCkJYmZpbl9yZWFkMTYoUE9SVEdJT19NQVNLQl9UT0dHTEUpCi0jZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEdJT19NQVNLQl9UT0dHTEUodmFsKQliZmluX3dyaXRlMTYoUE9SVEdJT19NQVNLQl9UT0dHTEUsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1BPUlRHSU9fRElSKCkJCQliZmluX3JlYWQxNihQT1JUR0lPX0RJUikKLSNkZWZpbmUgYmZpbl93cml0ZV9QT1JUR0lPX0RJUih2YWwpCQliZmluX3dyaXRlMTYoUE9SVEdJT19ESVIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1BPUlRHSU9fUE9MQVIoKQkJYmZpbl9yZWFkMTYoUE9SVEdJT19QT0xBUikKLSNkZWZpbmUgYmZpbl93cml0ZV9QT1JUR0lPX1BPTEFSKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JUR0lPX1BPTEFSLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9QT1JUR0lPX0VER0UoKQkJYmZpbl9yZWFkMTYoUE9SVEdJT19FREdFKQotI2RlZmluZSBiZmluX3dyaXRlX1BPUlRHSU9fRURHRSh2YWwpCQliZmluX3dyaXRlMTYoUE9SVEdJT19FREdFLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9QT1JUR0lPX0JPVEgoKQkJYmZpbl9yZWFkMTYoUE9SVEdJT19CT1RIKQotI2RlZmluZSBiZmluX3dyaXRlX1BPUlRHSU9fQk9USCh2YWwpCQliZmluX3dyaXRlMTYoUE9SVEdJT19CT1RILCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9QT1JUR0lPX0lORU4oKQkJYmZpbl9yZWFkMTYoUE9SVEdJT19JTkVOKQotI2RlZmluZSBiZmluX3dyaXRlX1BPUlRHSU9fSU5FTih2YWwpCQliZmluX3dyaXRlMTYoUE9SVEdJT19JTkVOLCB2YWwpCi0KLQotLyogR2VuZXJhbCBQdXJwb3NlIEkvTyBQb3J0IEggKDB4RkZDMDE3MDAgLSAweEZGQzAxN0ZGKQkJCQkJCQkJKi8KLSNkZWZpbmUgYmZpbl9yZWFkX1BPUlRISU8oKQkJCWJmaW5fcmVhZDE2KFBPUlRISU8pCi0jZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEhJTyh2YWwpCQkJYmZpbl93cml0ZTE2KFBPUlRISU8sIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1BPUlRISU9fQ0xFQVIoKQkJYmZpbl9yZWFkMTYoUE9SVEhJT19DTEVBUikKLSNkZWZpbmUgYmZpbl93cml0ZV9QT1JUSElPX0NMRUFSKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JUSElPX0NMRUFSLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9QT1JUSElPX1NFVCgpCQkJYmZpbl9yZWFkMTYoUE9SVEhJT19TRVQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEhJT19TRVQodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRISU9fU0VULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9QT1JUSElPX1RPR0dMRSgpCQliZmluX3JlYWQxNihQT1JUSElPX1RPR0dMRSkKLSNkZWZpbmUgYmZpbl93cml0ZV9QT1JUSElPX1RPR0dMRSh2YWwpCQliZmluX3dyaXRlMTYoUE9SVEhJT19UT0dHTEUsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1BPUlRISU9fTUFTS0EoKQkJYmZpbl9yZWFkMTYoUE9SVEhJT19NQVNLQSkKLSNkZWZpbmUgYmZpbl93cml0ZV9QT1JUSElPX01BU0tBKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JUSElPX01BU0tBLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9QT1JUSElPX01BU0tBX0NMRUFSKCkJCWJmaW5fcmVhZDE2KFBPUlRISU9fTUFTS0FfQ0xFQVIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEhJT19NQVNLQV9DTEVBUih2YWwpCWJmaW5fd3JpdGUxNihQT1JUSElPX01BU0tBX0NMRUFSLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9QT1JUSElPX01BU0tBX1NFVCgpCQliZmluX3JlYWQxNihQT1JUSElPX01BU0tBX1NFVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9QT1JUSElPX01BU0tBX1NFVCh2YWwpCWJmaW5fd3JpdGUxNihQT1JUSElPX01BU0tBX1NFVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfUE9SVEhJT19NQVNLQV9UT0dHTEUoKQliZmluX3JlYWQxNihQT1JUSElPX01BU0tBX1RPR0dMRSkKLSNkZWZpbmUgYmZpbl93cml0ZV9QT1JUSElPX01BU0tBX1RPR0dMRSh2YWwpCWJmaW5fd3JpdGUxNihQT1JUSElPX01BU0tBX1RPR0dMRSwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfUE9SVEhJT19NQVNLQigpCQliZmluX3JlYWQxNihQT1JUSElPX01BU0tCKQotI2RlZmluZSBiZmluX3dyaXRlX1BPUlRISU9fTUFTS0IodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRISU9fTUFTS0IsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1BPUlRISU9fTUFTS0JfQ0xFQVIoKQkJYmZpbl9yZWFkMTYoUE9SVEhJT19NQVNLQl9DTEVBUikKLSNkZWZpbmUgYmZpbl93cml0ZV9QT1JUSElPX01BU0tCX0NMRUFSKHZhbCkJYmZpbl93cml0ZTE2KFBPUlRISU9fTUFTS0JfQ0xFQVIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1BPUlRISU9fTUFTS0JfU0VUKCkJCWJmaW5fcmVhZDE2KFBPUlRISU9fTUFTS0JfU0VUKQotI2RlZmluZSBiZmluX3dyaXRlX1BPUlRISU9fTUFTS0JfU0VUKHZhbCkJYmZpbl93cml0ZTE2KFBPUlRISU9fTUFTS0JfU0VULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9QT1JUSElPX01BU0tCX1RPR0dMRSgpCWJmaW5fcmVhZDE2KFBPUlRISU9fTUFTS0JfVE9HR0xFKQotI2RlZmluZSBiZmluX3dyaXRlX1BPUlRISU9fTUFTS0JfVE9HR0xFKHZhbCkJYmZpbl93cml0ZTE2KFBPUlRISU9fTUFTS0JfVE9HR0xFLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9QT1JUSElPX0RJUigpCQkJYmZpbl9yZWFkMTYoUE9SVEhJT19ESVIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEhJT19ESVIodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRISU9fRElSLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9QT1JUSElPX1BPTEFSKCkJCWJmaW5fcmVhZDE2KFBPUlRISU9fUE9MQVIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEhJT19QT0xBUih2YWwpCQliZmluX3dyaXRlMTYoUE9SVEhJT19QT0xBUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfUE9SVEhJT19FREdFKCkJCWJmaW5fcmVhZDE2KFBPUlRISU9fRURHRSkKLSNkZWZpbmUgYmZpbl93cml0ZV9QT1JUSElPX0VER0UodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRISU9fRURHRSwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfUE9SVEhJT19CT1RIKCkJCWJmaW5fcmVhZDE2KFBPUlRISU9fQk9USCkKLSNkZWZpbmUgYmZpbl93cml0ZV9QT1JUSElPX0JPVEgodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRISU9fQk9USCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfUE9SVEhJT19JTkVOKCkJCWJmaW5fcmVhZDE2KFBPUlRISU9fSU5FTikKLSNkZWZpbmUgYmZpbl93cml0ZV9QT1JUSElPX0lORU4odmFsKQkJYmZpbl93cml0ZTE2KFBPUlRISU9fSU5FTiwgdmFsKQotCi0KLS8qIFVBUlQxIENvbnRyb2xsZXIJCSgweEZGQzAyMDAwIC0gMHhGRkMwMjBGRikJCQkJCQkJCSovCi0jZGVmaW5lIGJmaW5fcmVhZF9VQVJUMV9USFIoKQkJCWJmaW5fcmVhZDE2KFVBUlQxX1RIUikKLSNkZWZpbmUgYmZpbl93cml0ZV9VQVJUMV9USFIodmFsKQkJYmZpbl93cml0ZTE2KFVBUlQxX1RIUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfVUFSVDFfUkJSKCkJCQliZmluX3JlYWQxNihVQVJUMV9SQlIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfVUFSVDFfUkJSKHZhbCkJCWJmaW5fd3JpdGUxNihVQVJUMV9SQlIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1VBUlQxX0RMTCgpCQkJYmZpbl9yZWFkMTYoVUFSVDFfRExMKQotI2RlZmluZSBiZmluX3dyaXRlX1VBUlQxX0RMTCh2YWwpCQliZmluX3dyaXRlMTYoVUFSVDFfRExMLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9VQVJUMV9JRVIoKQkJCWJmaW5fcmVhZDE2KFVBUlQxX0lFUikKLSNkZWZpbmUgYmZpbl93cml0ZV9VQVJUMV9JRVIodmFsKQkJYmZpbl93cml0ZTE2KFVBUlQxX0lFUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfVUFSVDFfRExIKCkJCQliZmluX3JlYWQxNihVQVJUMV9ETEgpCi0jZGVmaW5lIGJmaW5fd3JpdGVfVUFSVDFfRExIKHZhbCkJCWJmaW5fd3JpdGUxNihVQVJUMV9ETEgsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1VBUlQxX0lJUigpCQkJYmZpbl9yZWFkMTYoVUFSVDFfSUlSKQotI2RlZmluZSBiZmluX3dyaXRlX1VBUlQxX0lJUih2YWwpCQliZmluX3dyaXRlMTYoVUFSVDFfSUlSLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9VQVJUMV9MQ1IoKQkJCWJmaW5fcmVhZDE2KFVBUlQxX0xDUikKLSNkZWZpbmUgYmZpbl93cml0ZV9VQVJUMV9MQ1IodmFsKQkJYmZpbl93cml0ZTE2KFVBUlQxX0xDUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfVUFSVDFfTUNSKCkJCQliZmluX3JlYWQxNihVQVJUMV9NQ1IpCi0jZGVmaW5lIGJmaW5fd3JpdGVfVUFSVDFfTUNSKHZhbCkJCWJmaW5fd3JpdGUxNihVQVJUMV9NQ1IsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1VBUlQxX0xTUigpCQkJYmZpbl9yZWFkMTYoVUFSVDFfTFNSKQotI2RlZmluZSBiZmluX3dyaXRlX1VBUlQxX0xTUih2YWwpCQliZmluX3dyaXRlMTYoVUFSVDFfTFNSLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9VQVJUMV9NU1IoKQkJCWJmaW5fcmVhZDE2KFVBUlQxX01TUikKLSNkZWZpbmUgYmZpbl93cml0ZV9VQVJUMV9NU1IodmFsKQkJYmZpbl93cml0ZTE2KFVBUlQxX01TUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfVUFSVDFfU0NSKCkJCQliZmluX3JlYWQxNihVQVJUMV9TQ1IpCi0jZGVmaW5lIGJmaW5fd3JpdGVfVUFSVDFfU0NSKHZhbCkJCWJmaW5fd3JpdGUxNihVQVJUMV9TQ1IsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1VBUlQxX0dDVEwoKQkJCWJmaW5fcmVhZDE2KFVBUlQxX0dDVEwpCi0jZGVmaW5lIGJmaW5fd3JpdGVfVUFSVDFfR0NUTCh2YWwpCQliZmluX3dyaXRlMTYoVUFSVDFfR0NUTCwgdmFsKQotCi0vKiBPbWl0IENBTiByZWdpc3RlciBzZXRzIGZyb20gdGhlIGNkZWZCRjUzNC5oIChDQU4gaXMgbm90IGluIHRoZSBBRFNQLUJGNTJ4IHByb2Nlc3NvcikgKi8KLQotLyogUGluIENvbnRyb2wgUmVnaXN0ZXJzCSgweEZGQzAzMjAwIC0gMHhGRkMwMzJGRikJCQkJCQkJCSovCi0jZGVmaW5lIGJmaW5fcmVhZF9QT1JURl9GRVIoKQkJCWJmaW5fcmVhZDE2KFBPUlRGX0ZFUikKLSNkZWZpbmUgYmZpbl93cml0ZV9QT1JURl9GRVIodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRGX0ZFUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfUE9SVEdfRkVSKCkJCQliZmluX3JlYWQxNihQT1JUR19GRVIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEdfRkVSKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JUR19GRVIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1BPUlRIX0ZFUigpCQkJYmZpbl9yZWFkMTYoUE9SVEhfRkVSKQotI2RlZmluZSBiZmluX3dyaXRlX1BPUlRIX0ZFUih2YWwpCQliZmluX3dyaXRlMTYoUE9SVEhfRkVSLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9QT1JUX01VWCgpCQkJYmZpbl9yZWFkMTYoUE9SVF9NVVgpCi0jZGVmaW5lIGJmaW5fd3JpdGVfUE9SVF9NVVgodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRfTVVYLCB2YWwpCi0KLQotLyogSGFuZHNoYWtlIE1ETUEgUmVnaXN0ZXJzCSgweEZGQzAzMzAwIC0gMHhGRkMwMzNGRikJCQkJCQkJCSovCi0jZGVmaW5lIGJmaW5fcmVhZF9ITURNQTBfQ09OVFJPTCgpCQliZmluX3JlYWQxNihITURNQTBfQ09OVFJPTCkKLSNkZWZpbmUgYmZpbl93cml0ZV9ITURNQTBfQ09OVFJPTCh2YWwpCQliZmluX3dyaXRlMTYoSE1ETUEwX0NPTlRST0wsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0hNRE1BMF9FQ0lOSVQoKQkJYmZpbl9yZWFkMTYoSE1ETUEwX0VDSU5JVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9ITURNQTBfRUNJTklUKHZhbCkJCWJmaW5fd3JpdGUxNihITURNQTBfRUNJTklULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ITURNQTBfQkNJTklUKCkJCWJmaW5fcmVhZDE2KEhNRE1BMF9CQ0lOSVQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfSE1ETUEwX0JDSU5JVCh2YWwpCQliZmluX3dyaXRlMTYoSE1ETUEwX0JDSU5JVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfSE1ETUEwX0VDVVJHRU5UKCkJCWJmaW5fcmVhZDE2KEhNRE1BMF9FQ1VSR0VOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9ITURNQTBfRUNVUkdFTlQodmFsKQkJYmZpbl93cml0ZTE2KEhNRE1BMF9FQ1VSR0VOVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfSE1ETUEwX0VDT1ZFUkZMT1coKQkJYmZpbl9yZWFkMTYoSE1ETUEwX0VDT1ZFUkZMT1cpCi0jZGVmaW5lIGJmaW5fd3JpdGVfSE1ETUEwX0VDT1ZFUkZMT1codmFsKQliZmluX3dyaXRlMTYoSE1ETUEwX0VDT1ZFUkZMT1csIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0hNRE1BMF9FQ09VTlQoKQkJYmZpbl9yZWFkMTYoSE1ETUEwX0VDT1VOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9ITURNQTBfRUNPVU5UKHZhbCkJCWJmaW5fd3JpdGUxNihITURNQTBfRUNPVU5ULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ITURNQTBfQkNPVU5UKCkJCWJmaW5fcmVhZDE2KEhNRE1BMF9CQ09VTlQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfSE1ETUEwX0JDT1VOVCh2YWwpCQliZmluX3dyaXRlMTYoSE1ETUEwX0JDT1VOVCwgdmFsKQotCi0jZGVmaW5lIGJmaW5fcmVhZF9ITURNQTFfQ09OVFJPTCgpCQliZmluX3JlYWQxNihITURNQTFfQ09OVFJPTCkKLSNkZWZpbmUgYmZpbl93cml0ZV9ITURNQTFfQ09OVFJPTCh2YWwpCQliZmluX3dyaXRlMTYoSE1ETUExX0NPTlRST0wsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0hNRE1BMV9FQ0lOSVQoKQkJYmZpbl9yZWFkMTYoSE1ETUExX0VDSU5JVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9ITURNQTFfRUNJTklUKHZhbCkJCWJmaW5fd3JpdGUxNihITURNQTFfRUNJTklULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ITURNQTFfQkNJTklUKCkJCWJmaW5fcmVhZDE2KEhNRE1BMV9CQ0lOSVQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfSE1ETUExX0JDSU5JVCh2YWwpCQliZmluX3dyaXRlMTYoSE1ETUExX0JDSU5JVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfSE1ETUExX0VDVVJHRU5UKCkJCWJmaW5fcmVhZDE2KEhNRE1BMV9FQ1VSR0VOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9ITURNQTFfRUNVUkdFTlQodmFsKQkJYmZpbl93cml0ZTE2KEhNRE1BMV9FQ1VSR0VOVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfSE1ETUExX0VDT1ZFUkZMT1coKQkJYmZpbl9yZWFkMTYoSE1ETUExX0VDT1ZFUkZMT1cpCi0jZGVmaW5lIGJmaW5fd3JpdGVfSE1ETUExX0VDT1ZFUkZMT1codmFsKQliZmluX3dyaXRlMTYoSE1ETUExX0VDT1ZFUkZMT1csIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0hNRE1BMV9FQ09VTlQoKQkJYmZpbl9yZWFkMTYoSE1ETUExX0VDT1VOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9ITURNQTFfRUNPVU5UKHZhbCkJCWJmaW5fd3JpdGUxNihITURNQTFfRUNPVU5ULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ITURNQTFfQkNPVU5UKCkJCWJmaW5fcmVhZDE2KEhNRE1BMV9CQ09VTlQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfSE1ETUExX0JDT1VOVCh2YWwpCQliZmluX3dyaXRlMTYoSE1ETUExX0JDT1VOVCwgdmFsKQotCi0vKiA9PT09IGVuZCBmcm9tIGNkZWZCRjUzNC5oID09PT0gKi8KLQotLyogR1BJTyBQSU4gbXV4ICgweEZGQzAzMjEwIC0gT3hGRkMwMzI4OCkgKi8KLQotI2RlZmluZSBiZmluX3JlYWRfUE9SVEZfTVVYKCkJCQliZmluX3JlYWQxNihQT1JURl9NVVgpCi0jZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEZfTVVYKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JURl9NVVgsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1BPUlRHX01VWCgpCQkJYmZpbl9yZWFkMTYoUE9SVEdfTVVYKQotI2RlZmluZSBiZmluX3dyaXRlX1BPUlRHX01VWCh2YWwpCQliZmluX3dyaXRlMTYoUE9SVEdfTVVYLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9QT1JUSF9NVVgoKQkJCWJmaW5fcmVhZDE2KFBPUlRIX01VWCkKLSNkZWZpbmUgYmZpbl93cml0ZV9QT1JUSF9NVVgodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRIX01VWCwgdmFsKQotCi0jZGVmaW5lIGJmaW5fcmVhZF9QT1JURl9EUklWRSgpCQkJYmZpbl9yZWFkMTYoUE9SVEZfRFJJVkUpCi0jZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEZfRFJJVkUodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRGX0RSSVZFLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9QT1JUR19EUklWRSgpCQkJYmZpbl9yZWFkMTYoUE9SVEdfRFJJVkUpCi0jZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEdfRFJJVkUodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRHX0RSSVZFLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9QT1JUSF9EUklWRSgpCQkJYmZpbl9yZWFkMTYoUE9SVEhfRFJJVkUpCi0jZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEhfRFJJVkUodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRIX0RSSVZFLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9QT1JURl9TTEVXKCkJCQliZmluX3JlYWQxNihQT1JURl9TTEVXKQotI2RlZmluZSBiZmluX3dyaXRlX1BPUlRGX1NMRVcodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRGX1NMRVcsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1BPUlRHX1NMRVcoKQkJCWJmaW5fcmVhZDE2KFBPUlRHX1NMRVcpCi0jZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEdfU0xFVyh2YWwpCQliZmluX3dyaXRlMTYoUE9SVEdfU0xFVywgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfUE9SVEhfU0xFVygpCQkJYmZpbl9yZWFkMTYoUE9SVEhfU0xFVykKLSNkZWZpbmUgYmZpbl93cml0ZV9QT1JUSF9TTEVXKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JUSF9TTEVXLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9QT1JURl9IWVNURVJJU0lTKCkJCWJmaW5fcmVhZDE2KFBPUlRGX0hZU1RFUklTSVMpCi0jZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEZfSFlTVEVSSVNJUyh2YWwpCWJmaW5fd3JpdGUxNihQT1JURl9IWVNURVJJU0lTLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9QT1JUR19IWVNURVJJU0lTKCkJCWJmaW5fcmVhZDE2KFBPUlRHX0hZU1RFUklTSVMpCi0jZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEdfSFlTVEVSSVNJUyh2YWwpCWJmaW5fd3JpdGUxNihQT1JUR19IWVNURVJJU0lTLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9QT1JUSF9IWVNURVJJU0lTKCkJCWJmaW5fcmVhZDE2KFBPUlRIX0hZU1RFUklTSVMpCi0jZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEhfSFlTVEVSSVNJUyh2YWwpCWJmaW5fd3JpdGUxNihQT1JUSF9IWVNURVJJU0lTLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NSVNDUE9SVF9EUklWRSgpCQliZmluX3JlYWQxNihNSVNDUE9SVF9EUklWRSkKLSNkZWZpbmUgYmZpbl93cml0ZV9NSVNDUE9SVF9EUklWRSh2YWwpCQliZmluX3dyaXRlMTYoTUlTQ1BPUlRfRFJJVkUsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01JU0NQT1JUX1NMRVcoKQkJYmZpbl9yZWFkMTYoTUlTQ1BPUlRfU0xFVykKLSNkZWZpbmUgYmZpbl93cml0ZV9NSVNDUE9SVF9TTEVXKHZhbCkJCWJmaW5fd3JpdGUxNihNSVNDUE9SVF9TTEVXLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NSVNDUE9SVF9IWVNURVJJU0lTKCkJCWJmaW5fcmVhZDE2KE1JU0NQT1JUX0hZU1RFUklTSVMpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTUlTQ1BPUlRfSFlTVEVSSVNJUyh2YWwpCWJmaW5fd3JpdGUxNihNSVNDUE9SVF9IWVNURVJJU0lTLCB2YWwpCi0KLS8qIEhPU1QgUG9ydCBSZWdpc3RlcnMgKi8KLQotI2RlZmluZSBiZmluX3JlYWRfSE9TVF9DT05UUk9MKCkJCWJmaW5fcmVhZDE2KEhPU1RfQ09OVFJPTCkKLSNkZWZpbmUgYmZpbl93cml0ZV9IT1NUX0NPTlRST0wodmFsKQkJYmZpbl93cml0ZTE2KEhPU1RfQ09OVFJPTCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfSE9TVF9TVEFUVVMoKQkJCWJmaW5fcmVhZDE2KEhPU1RfU1RBVFVTKQotI2RlZmluZSBiZmluX3dyaXRlX0hPU1RfU1RBVFVTKHZhbCkJCWJmaW5fd3JpdGUxNihIT1NUX1NUQVRVUywgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfSE9TVF9USU1FT1VUKCkJCWJmaW5fcmVhZDE2KEhPU1RfVElNRU9VVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9IT1NUX1RJTUVPVVQodmFsKQkJYmZpbl93cml0ZTE2KEhPU1RfVElNRU9VVCwgdmFsKQotCi0vKiBDb3VudGVyIFJlZ2lzdGVycyAqLwotCi0jZGVmaW5lIGJmaW5fcmVhZF9DTlRfQ09ORklHKCkJCQliZmluX3JlYWQxNihDTlRfQ09ORklHKQotI2RlZmluZSBiZmluX3dyaXRlX0NOVF9DT05GSUcodmFsKQkJYmZpbl93cml0ZTE2KENOVF9DT05GSUcsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0NOVF9JTUFTSygpCQkJYmZpbl9yZWFkMTYoQ05UX0lNQVNLKQotI2RlZmluZSBiZmluX3dyaXRlX0NOVF9JTUFTSyh2YWwpCQliZmluX3dyaXRlMTYoQ05UX0lNQVNLLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9DTlRfU1RBVFVTKCkJCQliZmluX3JlYWQxNihDTlRfU1RBVFVTKQotI2RlZmluZSBiZmluX3dyaXRlX0NOVF9TVEFUVVModmFsKQkJYmZpbl93cml0ZTE2KENOVF9TVEFUVVMsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0NOVF9DT01NQU5EKCkJCQliZmluX3JlYWQxNihDTlRfQ09NTUFORCkKLSNkZWZpbmUgYmZpbl93cml0ZV9DTlRfQ09NTUFORCh2YWwpCQliZmluX3dyaXRlMTYoQ05UX0NPTU1BTkQsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0NOVF9ERUJPVU5DRSgpCQliZmluX3JlYWQxNihDTlRfREVCT1VOQ0UpCi0jZGVmaW5lIGJmaW5fd3JpdGVfQ05UX0RFQk9VTkNFKHZhbCkJCWJmaW5fd3JpdGUxNihDTlRfREVCT1VOQ0UsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0NOVF9DT1VOVEVSKCkJCQliZmluX3JlYWQzMihDTlRfQ09VTlRFUikKLSNkZWZpbmUgYmZpbl93cml0ZV9DTlRfQ09VTlRFUih2YWwpCQliZmluX3dyaXRlMzIoQ05UX0NPVU5URVIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0NOVF9NQVgoKQkJCWJmaW5fcmVhZDMyKENOVF9NQVgpCi0jZGVmaW5lIGJmaW5fd3JpdGVfQ05UX01BWCh2YWwpCQkJYmZpbl93cml0ZTMyKENOVF9NQVgsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0NOVF9NSU4oKQkJCWJmaW5fcmVhZDMyKENOVF9NSU4pCi0jZGVmaW5lIGJmaW5fd3JpdGVfQ05UX01JTih2YWwpCQkJYmZpbl93cml0ZTMyKENOVF9NSU4sIHZhbCkKLQotLyogU2VjdXJpdHkgUmVnaXN0ZXJzICovCi0KLSNkZWZpbmUgYmZpbl9yZWFkX1NFQ1VSRV9TWVNTV1QoKQkJYmZpbl9yZWFkMzIoU0VDVVJFX1NZU1NXVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9TRUNVUkVfU1lTU1dUKHZhbCkJCWJmaW5fd3JpdGUzMihTRUNVUkVfU1lTU1dULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9TRUNVUkVfQ09OVFJPTCgpCQliZmluX3JlYWQxNihTRUNVUkVfQ09OVFJPTCkKLSNkZWZpbmUgYmZpbl93cml0ZV9TRUNVUkVfQ09OVFJPTCh2YWwpCQliZmluX3dyaXRlMTYoU0VDVVJFX0NPTlRST0wsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX1NFQ1VSRV9TVEFUVVMoKQkJYmZpbl9yZWFkMTYoU0VDVVJFX1NUQVRVUykKLSNkZWZpbmUgYmZpbl93cml0ZV9TRUNVUkVfU1RBVFVTKHZhbCkJCWJmaW5fd3JpdGUxNihTRUNVUkVfU1RBVFVTLCB2YWwpCi0KLS8qIE5GQyBSZWdpc3RlcnMgKi8KLQotI2RlZmluZSBiZmluX3JlYWRfTkZDX0NUTCgpCQkJYmZpbl9yZWFkMTYoTkZDX0NUTCkKLSNkZWZpbmUgYmZpbl93cml0ZV9ORkNfQ1RMKHZhbCkJCQliZmluX3dyaXRlMTYoTkZDX0NUTCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTkZDX1NUQVQoKQkJCWJmaW5fcmVhZDE2KE5GQ19TVEFUKQotI2RlZmluZSBiZmluX3dyaXRlX05GQ19TVEFUKHZhbCkJCWJmaW5fd3JpdGUxNihORkNfU1RBVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTkZDX0lSUVNUQVQoKQkJCWJmaW5fcmVhZDE2KE5GQ19JUlFTVEFUKQotI2RlZmluZSBiZmluX3dyaXRlX05GQ19JUlFTVEFUKHZhbCkJCWJmaW5fd3JpdGUxNihORkNfSVJRU1RBVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTkZDX0lSUU1BU0soKQkJCWJmaW5fcmVhZDE2KE5GQ19JUlFNQVNLKQotI2RlZmluZSBiZmluX3dyaXRlX05GQ19JUlFNQVNLKHZhbCkJCWJmaW5fd3JpdGUxNihORkNfSVJRTUFTSywgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTkZDX0VDQzAoKQkJCWJmaW5fcmVhZDE2KE5GQ19FQ0MwKQotI2RlZmluZSBiZmluX3dyaXRlX05GQ19FQ0MwKHZhbCkJCWJmaW5fd3JpdGUxNihORkNfRUNDMCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTkZDX0VDQzEoKQkJCWJmaW5fcmVhZDE2KE5GQ19FQ0MxKQotI2RlZmluZSBiZmluX3dyaXRlX05GQ19FQ0MxKHZhbCkJCWJmaW5fd3JpdGUxNihORkNfRUNDMSwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTkZDX0VDQzIoKQkJCWJmaW5fcmVhZDE2KE5GQ19FQ0MyKQotI2RlZmluZSBiZmluX3dyaXRlX05GQ19FQ0MyKHZhbCkJCWJmaW5fd3JpdGUxNihORkNfRUNDMiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTkZDX0VDQzMoKQkJCWJmaW5fcmVhZDE2KE5GQ19FQ0MzKQotI2RlZmluZSBiZmluX3dyaXRlX05GQ19FQ0MzKHZhbCkJCWJmaW5fd3JpdGUxNihORkNfRUNDMywgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTkZDX0NPVU5UKCkJCQliZmluX3JlYWQxNihORkNfQ09VTlQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTkZDX0NPVU5UKHZhbCkJCWJmaW5fd3JpdGUxNihORkNfQ09VTlQsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX05GQ19SU1QoKQkJCWJmaW5fcmVhZDE2KE5GQ19SU1QpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTkZDX1JTVCh2YWwpCQkJYmZpbl93cml0ZTE2KE5GQ19SU1QsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX05GQ19QR0NUTCgpCQkJYmZpbl9yZWFkMTYoTkZDX1BHQ1RMKQotI2RlZmluZSBiZmluX3dyaXRlX05GQ19QR0NUTCh2YWwpCQliZmluX3dyaXRlMTYoTkZDX1BHQ1RMLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ORkNfUkVBRCgpCQkJYmZpbl9yZWFkMTYoTkZDX1JFQUQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTkZDX1JFQUQodmFsKQkJYmZpbl93cml0ZTE2KE5GQ19SRUFELCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ORkNfQUREUigpCQkJYmZpbl9yZWFkMTYoTkZDX0FERFIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTkZDX0FERFIodmFsKQkJYmZpbl93cml0ZTE2KE5GQ19BRERSLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ORkNfQ01EKCkJCQliZmluX3JlYWQxNihORkNfQ01EKQotI2RlZmluZSBiZmluX3dyaXRlX05GQ19DTUQodmFsKQkJCWJmaW5fd3JpdGUxNihORkNfQ01ELCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ORkNfREFUQV9XUigpCQkJYmZpbl9yZWFkMTYoTkZDX0RBVEFfV1IpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTkZDX0RBVEFfV1IodmFsKQkJYmZpbl93cml0ZTE2KE5GQ19EQVRBX1dSLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ORkNfREFUQV9SRCgpCQkJYmZpbl9yZWFkMTYoTkZDX0RBVEFfUkQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTkZDX0RBVEFfUkQodmFsKQkJYmZpbl93cml0ZTE2KE5GQ19EQVRBX1JELCB2YWwpCi0KLS8qIFRoZXNlIG5lZWQgdG8gYmUgbGFzdCBkdWUgdG8gdGhlIGNkZWYvbGludXggaW50ZXItZGVwZW5kZW5jaWVzICovCi0jaW5jbHVkZSA8YXNtL2lycS5oPgotCi0jZW5kaWYgLyogX0NERUZfQkY1MlhfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2luY2x1ZGUvbWFjaC9kZWZCRjUyMi5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2luY2x1ZGUvbWFjaC9kZWZCRjUyMi5oCmluZGV4IGNiMTM5YTIuLjg5ZjU0MjAgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9pbmNsdWRlL21hY2gvZGVmQkY1MjIuaAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvaW5jbHVkZS9tYWNoL2RlZkJGNTIyLmgKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDctMjAwOCBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKiBDb3B5cmlnaHQgMjAwNy0yMDEwIEFuYWxvZyBEZXZpY2VzIEluYy4KICAqCiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgQURJIEJTRCBsaWNlbnNlIG9yIHRoZSBHUEwtMiAob3IgbGF0ZXIpCiAgKi8KQEAgLTcsMTIgKzcsMTM5MyBAQAogI2lmbmRlZiBfREVGX0JGNTIyX0gKICNkZWZpbmUgX0RFRl9CRjUyMl9ICiAKLS8qIEluY2x1ZGUgYWxsIENvcmUgcmVnaXN0ZXJzIGFuZCBiaXQgZGVmaW5pdGlvbnMgKi8KLSNpbmNsdWRlIDxhc20vZGVmX0xQQmxhY2tmaW4uaD4KKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiAgIFNZU1RFTSAmIE1NUiBBRERSRVNTIERFRklOSVRJT05TIENPTU1PTiBUTyBBTEwgQURTUC1CRjUyeCAgICAqLworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KIAotLyogU1lTVEVNICYgTU1SIEFERFJFU1MgREVGSU5JVElPTlMgRk9SIEFEU1AtQkY1MjIgKi8KKy8qID09PT0gYmVnaW4gZnJvbSBkZWZCRjUzNC5oID09PT0gKi8KIAotLyogSW5jbHVkZSBkZWZCRjUyeF9iYXNlLmggZm9yIHRoZSBzZXQgb2YgI2RlZmluZXMgdGhhdCBhcmUgY29tbW9uIHRvIGFsbCBBRFNQLUJGNTJ4IHByb2Nlc3NvcnMgKi8KLSNpbmNsdWRlICJkZWZCRjUyeF9iYXNlLmgiCisvKiBDbG9jayBhbmQgU3lzdGVtIENvbnRyb2wJKDB4RkZDMDAwMDAgLSAweEZGQzAwMEZGKQkJCQkJCQkJKi8KKyNkZWZpbmUgUExMX0NUTAkJCQkweEZGQzAwMDAwCS8qIFBMTCBDb250cm9sIFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgUExMX0RJVgkJCQkweEZGQzAwMDA0CS8qIFBMTCBEaXZpZGUgUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBWUl9DVEwJCQkJMHhGRkMwMDAwOAkvKiBWb2x0YWdlIFJlZ3VsYXRvciBDb250cm9sIFJlZ2lzdGVyCQkqLworI2RlZmluZSBQTExfU1RBVAkJCTB4RkZDMDAwMEMJLyogUExMIFN0YXR1cyBSZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIFBMTF9MT0NLQ05UCQkJMHhGRkMwMDAxMAkvKiBQTEwgTG9jayBDb3VudCBSZWdpc3RlcgkJCQkJKi8KKyNkZWZpbmUgQ0hJUElEICAgICAgICAweEZGQzAwMDE0ICAvKiBEZXZpY2UgSUQgUmVnaXN0ZXIgKi8KKworCisvKiBTeXN0ZW0gSW50ZXJydXB0IENvbnRyb2xsZXIgKDB4RkZDMDAxMDAgLSAweEZGQzAwMUZGKQkJCQkJCQkqLworI2RlZmluZSBTV1JTVAkJCQkweEZGQzAwMTAwCS8qIFNvZnR3YXJlIFJlc2V0IFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBTWVNDUgkJCQkweEZGQzAwMTA0CS8qIFN5c3RlbSBDb25maWd1cmF0aW9uIFJlZ2lzdGVyCQkJKi8KKyNkZWZpbmUgU0lDX1JWRUNUCQkJMHhGRkMwMDEwOAkvKiBJbnRlcnJ1cHQgUmVzZXQgVmVjdG9yIEFkZHJlc3MgUmVnaXN0ZXIJKi8KKworI2RlZmluZSBTSUNfSU1BU0swCQkJMHhGRkMwMDEwQwkvKiBJbnRlcnJ1cHQgTWFzayBSZWdpc3RlcgkJCQkJKi8KKyNkZWZpbmUgU0lDX0lBUjAJCQkweEZGQzAwMTEwCS8qIEludGVycnVwdCBBc3NpZ25tZW50IFJlZ2lzdGVyIDAJCQkqLworI2RlZmluZSBTSUNfSUFSMQkJCTB4RkZDMDAxMTQJLyogSW50ZXJydXB0IEFzc2lnbm1lbnQgUmVnaXN0ZXIgMQkJCSovCisjZGVmaW5lIFNJQ19JQVIyCQkJMHhGRkMwMDExOAkvKiBJbnRlcnJ1cHQgQXNzaWdubWVudCBSZWdpc3RlciAyCQkJKi8KKyNkZWZpbmUgU0lDX0lBUjMJCQkweEZGQzAwMTFDCS8qIEludGVycnVwdCBBc3NpZ25tZW50IFJlZ2lzdGVyIDMJCQkqLworI2RlZmluZSBTSUNfSVNSMAkJCQkweEZGQzAwMTIwCS8qIEludGVycnVwdCBTdGF0dXMgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgU0lDX0lXUjAJCQkJMHhGRkMwMDEyNAkvKiBJbnRlcnJ1cHQgV2FrZXVwIFJlZ2lzdGVyCQkJCSovCisKKy8qIFNJQyBBZGRpdGlvbnMgdG8gQURTUC1CRjUyeCAoMHhGRkMwMDE0QyAtIDB4RkZDMDAxNjIpICovCisjZGVmaW5lIFNJQ19JTUFTSzEgICAgICAgICAgICAgICAgICAgICAgMHhGRkMwMDE0QyAgICAgLyogSW50ZXJydXB0IE1hc2sgcmVnaXN0ZXIgb2YgU0lDMiAqLworI2RlZmluZSBTSUNfSUFSNCAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZDMDAxNTAgICAgIC8qIEludGVycnVwdCBBc3NpZ25tZW50IHJlZ2lzdGVyNCAqLworI2RlZmluZSBTSUNfSUFSNSAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZDMDAxNTQgICAgIC8qIEludGVycnVwdCBBc3NpZ25tZW50IHJlZ2lzdGVyNSAqLworI2RlZmluZSBTSUNfSUFSNiAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZDMDAxNTggICAgIC8qIEludGVycnVwdCBBc3NpZ25tZW50IHJlZ2lzdGVyNiAqLworI2RlZmluZSBTSUNfSUFSNyAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZDMDAxNUMgICAgIC8qIEludGVycnVwdCBBc3NpZ25tZW50IHJlZ2lzdGVyNyAqLworI2RlZmluZSBTSUNfSVNSMSAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZDMDAxNjAgICAgIC8qIEludGVycnVwdCBTdGF0dXIgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgU0lDX0lXUjEgICAgICAgICAgICAgICAgICAgICAgICAweEZGQzAwMTY0ICAgICAvKiBJbnRlcnJ1cHQgV2FrZXVwIHJlZ2lzdGVyICovCisKKworLyogV2F0Y2hkb2cgVGltZXIJCQkoMHhGRkMwMDIwMCAtIDB4RkZDMDAyRkYpCQkJCQkJCQkqLworI2RlZmluZSBXRE9HX0NUTAkJCTB4RkZDMDAyMDAJLyogV2F0Y2hkb2cgQ29udHJvbCBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBXRE9HX0NOVAkJCTB4RkZDMDAyMDQJLyogV2F0Y2hkb2cgQ291bnQgUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIFdET0dfU1RBVAkJCTB4RkZDMDAyMDgJLyogV2F0Y2hkb2cgU3RhdHVzIFJlZ2lzdGVyCQkJCQkqLworCisKKy8qIFJlYWwgVGltZSBDbG9jawkJKDB4RkZDMDAzMDAgLSAweEZGQzAwM0ZGKQkJCQkJCQkJCSovCisjZGVmaW5lIFJUQ19TVEFUCQkJMHhGRkMwMDMwMAkvKiBSVEMgU3RhdHVzIFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgUlRDX0lDVEwJCQkweEZGQzAwMzA0CS8qIFJUQyBJbnRlcnJ1cHQgQ29udHJvbCBSZWdpc3RlcgkJCSovCisjZGVmaW5lIFJUQ19JU1RBVAkJCTB4RkZDMDAzMDgJLyogUlRDIEludGVycnVwdCBTdGF0dXMgUmVnaXN0ZXIJCQkqLworI2RlZmluZSBSVENfU1dDTlQJCQkweEZGQzAwMzBDCS8qIFJUQyBTdG9wd2F0Y2ggQ291bnQgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgUlRDX0FMQVJNCQkJMHhGRkMwMDMxMAkvKiBSVEMgQWxhcm0gVGltZSBSZWdpc3RlcgkJCQkJKi8KKyNkZWZpbmUgUlRDX0ZBU1QJCQkweEZGQzAwMzE0CS8qIFJUQyBQcmVzY2FsZXIgRW5hYmxlIFJlZ2lzdGVyCQkJKi8KKyNkZWZpbmUgUlRDX1BSRU4JCQkweEZGQzAwMzE0CS8qIFJUQyBQcmVzY2FsZXIgRW5hYmxlIEFsdGVybmF0ZSBNYWNybwkJKi8KKworCisvKiBVQVJUMCBDb250cm9sbGVyCQkoMHhGRkMwMDQwMCAtIDB4RkZDMDA0RkYpCQkJCQkJCQkJKi8KKyNkZWZpbmUgVUFSVDBfVEhSCQkJMHhGRkMwMDQwMAkvKiBUcmFuc21pdCBIb2xkaW5nIHJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIFVBUlQwX1JCUgkJCTB4RkZDMDA0MDAJLyogUmVjZWl2ZSBCdWZmZXIgcmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIFVBUlQwX0RMTAkJCTB4RkZDMDA0MDAJLyogRGl2aXNvciBMYXRjaCAoTG93LUJ5dGUpCQkJCQkqLworI2RlZmluZSBVQVJUMF9JRVIJCQkweEZGQzAwNDA0CS8qIEludGVycnVwdCBFbmFibGUgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgVUFSVDBfRExICQkJMHhGRkMwMDQwNAkvKiBEaXZpc29yIExhdGNoIChIaWdoLUJ5dGUpCQkJCSovCisjZGVmaW5lIFVBUlQwX0lJUgkJCTB4RkZDMDA0MDgJLyogSW50ZXJydXB0IElkZW50aWZpY2F0aW9uIFJlZ2lzdGVyCQkqLworI2RlZmluZSBVQVJUMF9MQ1IJCQkweEZGQzAwNDBDCS8qIExpbmUgQ29udHJvbCBSZWdpc3RlcgkJCQkJKi8KKyNkZWZpbmUgVUFSVDBfTUNSCQkJMHhGRkMwMDQxMAkvKiBNb2RlbSBDb250cm9sIFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBVQVJUMF9MU1IJCQkweEZGQzAwNDE0CS8qIExpbmUgU3RhdHVzIFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgVUFSVDBfTVNSCQkJMHhGRkMwMDQxOAkvKiBNb2RlbSBTdGF0dXMgUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIFVBUlQwX1NDUgkJCTB4RkZDMDA0MUMJLyogU0NSIFNjcmF0Y2ggUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBVQVJUMF9HQ1RMCQkJMHhGRkMwMDQyNAkvKiBHbG9iYWwgQ29udHJvbCBSZWdpc3RlcgkJCQkJKi8KKworCisvKiBTUEkgQ29udHJvbGxlcgkJCSgweEZGQzAwNTAwIC0gMHhGRkMwMDVGRikJCQkJCQkJCSovCisjZGVmaW5lIFNQSTBfUkVHQkFTRQkJCTB4RkZDMDA1MDAKKyNkZWZpbmUgU1BJX0NUTAkJCQkweEZGQzAwNTAwCS8qIFNQSSBDb250cm9sIFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgU1BJX0ZMRwkJCQkweEZGQzAwNTA0CS8qIFNQSSBGbGFnIHJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgU1BJX1NUQVQJCQkweEZGQzAwNTA4CS8qIFNQSSBTdGF0dXMgcmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBTUElfVERCUgkJCTB4RkZDMDA1MEMJLyogU1BJIFRyYW5zbWl0IERhdGEgQnVmZmVyIFJlZ2lzdGVyCQkqLworI2RlZmluZSBTUElfUkRCUgkJCTB4RkZDMDA1MTAJLyogU1BJIFJlY2VpdmUgRGF0YSBCdWZmZXIgUmVnaXN0ZXIJCQkqLworI2RlZmluZSBTUElfQkFVRAkJCTB4RkZDMDA1MTQJLyogU1BJIEJhdWQgcmF0ZSBSZWdpc3RlcgkJCQkJKi8KKyNkZWZpbmUgU1BJX1NIQURPVwkJCTB4RkZDMDA1MTgJLyogU1BJX1JEQlIgU2hhZG93IFJlZ2lzdGVyCQkJCQkqLworCisKKy8qIFRJTUVSMC03IFJlZ2lzdGVycwkJKDB4RkZDMDA2MDAgLSAweEZGQzAwNkZGKQkJCQkJCQkJKi8KKyNkZWZpbmUgVElNRVIwX0NPTkZJRwkJMHhGRkMwMDYwMAkvKiBUaW1lciAwIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIJCQkqLworI2RlZmluZSBUSU1FUjBfQ09VTlRFUgkJMHhGRkMwMDYwNAkvKiBUaW1lciAwIENvdW50ZXIgUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIFRJTUVSMF9QRVJJT0QJCTB4RkZDMDA2MDgJLyogVGltZXIgMCBQZXJpb2QgUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIFRJTUVSMF9XSURUSAkJMHhGRkMwMDYwQwkvKiBUaW1lciAwIFdpZHRoIFJlZ2lzdGVyCQkJCQkqLworCisjZGVmaW5lIFRJTUVSMV9DT05GSUcJCTB4RkZDMDA2MTAJLyogVGltZXIgMSBDb25maWd1cmF0aW9uIFJlZ2lzdGVyICAJCQkqLworI2RlZmluZSBUSU1FUjFfQ09VTlRFUgkJMHhGRkMwMDYxNAkvKiBUaW1lciAxIENvdW50ZXIgUmVnaXN0ZXIgICAgICAgIAkJCSovCisjZGVmaW5lIFRJTUVSMV9QRVJJT0QJCTB4RkZDMDA2MTgJLyogVGltZXIgMSBQZXJpb2QgUmVnaXN0ZXIgICAgICAgICAJCQkqLworI2RlZmluZSBUSU1FUjFfV0lEVEgJCTB4RkZDMDA2MUMJLyogVGltZXIgMSBXaWR0aCBSZWdpc3RlciAgICAgICAgICAJCQkqLworCisjZGVmaW5lIFRJTUVSMl9DT05GSUcJCTB4RkZDMDA2MjAJLyogVGltZXIgMiBDb25maWd1cmF0aW9uIFJlZ2lzdGVyICAJCQkqLworI2RlZmluZSBUSU1FUjJfQ09VTlRFUgkJMHhGRkMwMDYyNAkvKiBUaW1lciAyIENvdW50ZXIgUmVnaXN0ZXIgICAgICAgIAkJCSovCisjZGVmaW5lIFRJTUVSMl9QRVJJT0QJCTB4RkZDMDA2MjgJLyogVGltZXIgMiBQZXJpb2QgUmVnaXN0ZXIgICAgICAgICAJCQkqLworI2RlZmluZSBUSU1FUjJfV0lEVEgJCTB4RkZDMDA2MkMJLyogVGltZXIgMiBXaWR0aCBSZWdpc3RlciAgICAgICAgICAJCQkqLworCisjZGVmaW5lIFRJTUVSM19DT05GSUcJCTB4RkZDMDA2MzAJLyogVGltZXIgMyBDb25maWd1cmF0aW9uIFJlZ2lzdGVyCQkJKi8KKyNkZWZpbmUgVElNRVIzX0NPVU5URVIJCTB4RkZDMDA2MzQJLyogVGltZXIgMyBDb3VudGVyIFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBUSU1FUjNfUEVSSU9ECQkweEZGQzAwNjM4CS8qIFRpbWVyIDMgUGVyaW9kIFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBUSU1FUjNfV0lEVEgJCTB4RkZDMDA2M0MJLyogVGltZXIgMyBXaWR0aCBSZWdpc3RlcgkJCQkJKi8KKworI2RlZmluZSBUSU1FUjRfQ09ORklHCQkweEZGQzAwNjQwCS8qIFRpbWVyIDQgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAgCQkJKi8KKyNkZWZpbmUgVElNRVI0X0NPVU5URVIJCTB4RkZDMDA2NDQJLyogVGltZXIgNCBDb3VudGVyIFJlZ2lzdGVyICAgICAgICAJCQkqLworI2RlZmluZSBUSU1FUjRfUEVSSU9ECQkweEZGQzAwNjQ4CS8qIFRpbWVyIDQgUGVyaW9kIFJlZ2lzdGVyICAgICAgICAgCQkJKi8KKyNkZWZpbmUgVElNRVI0X1dJRFRICQkweEZGQzAwNjRDCS8qIFRpbWVyIDQgV2lkdGggUmVnaXN0ZXIgICAgICAgICAgCQkJKi8KKworI2RlZmluZSBUSU1FUjVfQ09ORklHCQkweEZGQzAwNjUwCS8qIFRpbWVyIDUgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAgCQkJKi8KKyNkZWZpbmUgVElNRVI1X0NPVU5URVIJCTB4RkZDMDA2NTQJLyogVGltZXIgNSBDb3VudGVyIFJlZ2lzdGVyICAgICAgICAJCQkqLworI2RlZmluZSBUSU1FUjVfUEVSSU9ECQkweEZGQzAwNjU4CS8qIFRpbWVyIDUgUGVyaW9kIFJlZ2lzdGVyICAgICAgICAgCQkJKi8KKyNkZWZpbmUgVElNRVI1X1dJRFRICQkweEZGQzAwNjVDCS8qIFRpbWVyIDUgV2lkdGggUmVnaXN0ZXIgICAgICAgICAgCQkJKi8KKworI2RlZmluZSBUSU1FUjZfQ09ORklHCQkweEZGQzAwNjYwCS8qIFRpbWVyIDYgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAgCQkJKi8KKyNkZWZpbmUgVElNRVI2X0NPVU5URVIJCTB4RkZDMDA2NjQJLyogVGltZXIgNiBDb3VudGVyIFJlZ2lzdGVyICAgICAgICAJCQkqLworI2RlZmluZSBUSU1FUjZfUEVSSU9ECQkweEZGQzAwNjY4CS8qIFRpbWVyIDYgUGVyaW9kIFJlZ2lzdGVyICAgICAgICAgCQkJKi8KKyNkZWZpbmUgVElNRVI2X1dJRFRICQkweEZGQzAwNjZDCS8qIFRpbWVyIDYgV2lkdGggUmVnaXN0ZXIgICAgICAgICAgCQkJKi8KKworI2RlZmluZSBUSU1FUjdfQ09ORklHCQkweEZGQzAwNjcwCS8qIFRpbWVyIDcgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAgCQkJKi8KKyNkZWZpbmUgVElNRVI3X0NPVU5URVIJCTB4RkZDMDA2NzQJLyogVGltZXIgNyBDb3VudGVyIFJlZ2lzdGVyICAgICAgICAJCQkqLworI2RlZmluZSBUSU1FUjdfUEVSSU9ECQkweEZGQzAwNjc4CS8qIFRpbWVyIDcgUGVyaW9kIFJlZ2lzdGVyICAgICAgICAgCQkJKi8KKyNkZWZpbmUgVElNRVI3X1dJRFRICQkweEZGQzAwNjdDCS8qIFRpbWVyIDcgV2lkdGggUmVnaXN0ZXIgICAgICAgCQkJKi8KKworI2RlZmluZSBUSU1FUl9FTkFCTEUJCTB4RkZDMDA2ODAJLyogVGltZXIgRW5hYmxlIFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBUSU1FUl9ESVNBQkxFCQkweEZGQzAwNjg0CS8qIFRpbWVyIERpc2FibGUgUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIFRJTUVSX1NUQVRVUwkJMHhGRkMwMDY4OAkvKiBUaW1lciBTdGF0dXMgUmVnaXN0ZXIJCQkJCSovCisKKworLyogR2VuZXJhbCBQdXJwb3NlIEkvTyBQb3J0IEYgKDB4RkZDMDA3MDAgLSAweEZGQzAwN0ZGKQkJCQkJCQkJCQkJCSovCisjZGVmaW5lIFBPUlRGSU8JCQkJCTB4RkZDMDA3MDAJLyogUG9ydCBGIEkvTyBQaW4gU3RhdGUgU3BlY2lmeSBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBQT1JURklPX0NMRUFSCQkJMHhGRkMwMDcwNAkvKiBQb3J0IEYgSS9PIFBlcmlwaGVyYWwgSW50ZXJydXB0IENsZWFyIFJlZ2lzdGVyCQkqLworI2RlZmluZSBQT1JURklPX1NFVAkJCQkweEZGQzAwNzA4CS8qIFBvcnQgRiBJL08gUGVyaXBoZXJhbCBJbnRlcnJ1cHQgU2V0IFJlZ2lzdGVyCQkJKi8KKyNkZWZpbmUgUE9SVEZJT19UT0dHTEUJCQkweEZGQzAwNzBDCS8qIFBvcnQgRiBJL08gUGluIFN0YXRlIFRvZ2dsZSBSZWdpc3RlcgkJCQkJKi8KKyNkZWZpbmUgUE9SVEZJT19NQVNLQQkJCTB4RkZDMDA3MTAJLyogUG9ydCBGIEkvTyBNYXNrIFN0YXRlIFNwZWNpZnkgSW50ZXJydXB0IEEgUmVnaXN0ZXIJKi8KKyNkZWZpbmUgUE9SVEZJT19NQVNLQV9DTEVBUgkJMHhGRkMwMDcxNAkvKiBQb3J0IEYgSS9PIE1hc2sgRGlzYWJsZSBJbnRlcnJ1cHQgQSBSZWdpc3RlcgkJCSovCisjZGVmaW5lIFBPUlRGSU9fTUFTS0FfU0VUCQkweEZGQzAwNzE4CS8qIFBvcnQgRiBJL08gTWFzayBFbmFibGUgSW50ZXJydXB0IEEgUmVnaXN0ZXIJCQkqLworI2RlZmluZSBQT1JURklPX01BU0tBX1RPR0dMRQkweEZGQzAwNzFDCS8qIFBvcnQgRiBJL08gTWFzayBUb2dnbGUgRW5hYmxlIEludGVycnVwdCBBIFJlZ2lzdGVyCSovCisjZGVmaW5lIFBPUlRGSU9fTUFTS0IJCQkweEZGQzAwNzIwCS8qIFBvcnQgRiBJL08gTWFzayBTdGF0ZSBTcGVjaWZ5IEludGVycnVwdCBCIFJlZ2lzdGVyCSovCisjZGVmaW5lIFBPUlRGSU9fTUFTS0JfQ0xFQVIJCTB4RkZDMDA3MjQJLyogUG9ydCBGIEkvTyBNYXNrIERpc2FibGUgSW50ZXJydXB0IEIgUmVnaXN0ZXIJCQkqLworI2RlZmluZSBQT1JURklPX01BU0tCX1NFVAkJMHhGRkMwMDcyOAkvKiBQb3J0IEYgSS9PIE1hc2sgRW5hYmxlIEludGVycnVwdCBCIFJlZ2lzdGVyCQkJKi8KKyNkZWZpbmUgUE9SVEZJT19NQVNLQl9UT0dHTEUJMHhGRkMwMDcyQwkvKiBQb3J0IEYgSS9PIE1hc2sgVG9nZ2xlIEVuYWJsZSBJbnRlcnJ1cHQgQiBSZWdpc3RlcgkqLworI2RlZmluZSBQT1JURklPX0RJUgkJCQkweEZGQzAwNzMwCS8qIFBvcnQgRiBJL08gRGlyZWN0aW9uIFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgUE9SVEZJT19QT0xBUgkJCTB4RkZDMDA3MzQJLyogUG9ydCBGIEkvTyBTb3VyY2UgUG9sYXJpdHkgUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIFBPUlRGSU9fRURHRQkJCTB4RkZDMDA3MzgJLyogUG9ydCBGIEkvTyBTb3VyY2UgU2Vuc2l0aXZpdHkgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgUE9SVEZJT19CT1RICQkJMHhGRkMwMDczQwkvKiBQb3J0IEYgSS9PIFNldCBvbiBCT1RIIEVkZ2VzIFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIFBPUlRGSU9fSU5FTgkJCTB4RkZDMDA3NDAJLyogUG9ydCBGIEkvTyBJbnB1dCBFbmFibGUgUmVnaXN0ZXIgCQkJCQkqLworCisKKy8qIFNQT1JUMCBDb250cm9sbGVyCQkoMHhGRkMwMDgwMCAtIDB4RkZDMDA4RkYpCQkJCQkJCQkJCSovCisjZGVmaW5lIFNQT1JUMF9UQ1IxCQkJMHhGRkMwMDgwMAkvKiBTUE9SVDAgVHJhbnNtaXQgQ29uZmlndXJhdGlvbiAxIFJlZ2lzdGVyCQkJKi8KKyNkZWZpbmUgU1BPUlQwX1RDUjIJCQkweEZGQzAwODA0CS8qIFNQT1JUMCBUcmFuc21pdCBDb25maWd1cmF0aW9uIDIgUmVnaXN0ZXIJCQkqLworI2RlZmluZSBTUE9SVDBfVENMS0RJVgkJMHhGRkMwMDgwOAkvKiBTUE9SVDAgVHJhbnNtaXQgQ2xvY2sgRGl2aWRlcgkJCQkJKi8KKyNkZWZpbmUgU1BPUlQwX1RGU0RJVgkJMHhGRkMwMDgwQwkvKiBTUE9SVDAgVHJhbnNtaXQgRnJhbWUgU3luYyBEaXZpZGVyCQkJCSovCisjZGVmaW5lIFNQT1JUMF9UWAkJCTB4RkZDMDA4MTAJLyogU1BPUlQwIFRYIERhdGEgUmVnaXN0ZXIJCQkJCQkJKi8KKyNkZWZpbmUgU1BPUlQwX1JYCQkJMHhGRkMwMDgxOAkvKiBTUE9SVDAgUlggRGF0YSBSZWdpc3RlcgkJCQkJCQkqLworI2RlZmluZSBTUE9SVDBfUkNSMQkJCTB4RkZDMDA4MjAJLyogU1BPUlQwIFRyYW5zbWl0IENvbmZpZ3VyYXRpb24gMSBSZWdpc3RlcgkJCSovCisjZGVmaW5lIFNQT1JUMF9SQ1IyCQkJMHhGRkMwMDgyNAkvKiBTUE9SVDAgVHJhbnNtaXQgQ29uZmlndXJhdGlvbiAyIFJlZ2lzdGVyCQkJKi8KKyNkZWZpbmUgU1BPUlQwX1JDTEtESVYJCTB4RkZDMDA4MjgJLyogU1BPUlQwIFJlY2VpdmUgQ2xvY2sgRGl2aWRlcgkJCQkJCSovCisjZGVmaW5lIFNQT1JUMF9SRlNESVYJCTB4RkZDMDA4MkMJLyogU1BPUlQwIFJlY2VpdmUgRnJhbWUgU3luYyBEaXZpZGVyCQkJCSovCisjZGVmaW5lIFNQT1JUMF9TVEFUCQkJMHhGRkMwMDgzMAkvKiBTUE9SVDAgU3RhdHVzIFJlZ2lzdGVyCQkJCQkJCSovCisjZGVmaW5lIFNQT1JUMF9DSE5MCQkJMHhGRkMwMDgzNAkvKiBTUE9SVDAgQ3VycmVudCBDaGFubmVsIFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBTUE9SVDBfTUNNQzEJCTB4RkZDMDA4MzgJLyogU1BPUlQwIE11bHRpLUNoYW5uZWwgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAxCSovCisjZGVmaW5lIFNQT1JUMF9NQ01DMgkJMHhGRkMwMDgzQwkvKiBTUE9SVDAgTXVsdGktQ2hhbm5lbCBDb25maWd1cmF0aW9uIFJlZ2lzdGVyIDIJKi8KKyNkZWZpbmUgU1BPUlQwX01UQ1MwCQkweEZGQzAwODQwCS8qIFNQT1JUMCBNdWx0aS1DaGFubmVsIFRyYW5zbWl0IFNlbGVjdCBSZWdpc3RlciAwCSovCisjZGVmaW5lIFNQT1JUMF9NVENTMQkJMHhGRkMwMDg0NAkvKiBTUE9SVDAgTXVsdGktQ2hhbm5lbCBUcmFuc21pdCBTZWxlY3QgUmVnaXN0ZXIgMQkqLworI2RlZmluZSBTUE9SVDBfTVRDUzIJCTB4RkZDMDA4NDgJLyogU1BPUlQwIE11bHRpLUNoYW5uZWwgVHJhbnNtaXQgU2VsZWN0IFJlZ2lzdGVyIDIJKi8KKyNkZWZpbmUgU1BPUlQwX01UQ1MzCQkweEZGQzAwODRDCS8qIFNQT1JUMCBNdWx0aS1DaGFubmVsIFRyYW5zbWl0IFNlbGVjdCBSZWdpc3RlciAzCSovCisjZGVmaW5lIFNQT1JUMF9NUkNTMAkJMHhGRkMwMDg1MAkvKiBTUE9SVDAgTXVsdGktQ2hhbm5lbCBSZWNlaXZlIFNlbGVjdCBSZWdpc3RlciAwCSovCisjZGVmaW5lIFNQT1JUMF9NUkNTMQkJMHhGRkMwMDg1NAkvKiBTUE9SVDAgTXVsdGktQ2hhbm5lbCBSZWNlaXZlIFNlbGVjdCBSZWdpc3RlciAxCSovCisjZGVmaW5lIFNQT1JUMF9NUkNTMgkJMHhGRkMwMDg1OAkvKiBTUE9SVDAgTXVsdGktQ2hhbm5lbCBSZWNlaXZlIFNlbGVjdCBSZWdpc3RlciAyCSovCisjZGVmaW5lIFNQT1JUMF9NUkNTMwkJMHhGRkMwMDg1QwkvKiBTUE9SVDAgTXVsdGktQ2hhbm5lbCBSZWNlaXZlIFNlbGVjdCBSZWdpc3RlciAzCSovCisKKworLyogU1BPUlQxIENvbnRyb2xsZXIJCSgweEZGQzAwOTAwIC0gMHhGRkMwMDlGRikJCQkJCQkJCQkJKi8KKyNkZWZpbmUgU1BPUlQxX1RDUjEJCQkweEZGQzAwOTAwCS8qIFNQT1JUMSBUcmFuc21pdCBDb25maWd1cmF0aW9uIDEgUmVnaXN0ZXIJCQkqLworI2RlZmluZSBTUE9SVDFfVENSMgkJCTB4RkZDMDA5MDQJLyogU1BPUlQxIFRyYW5zbWl0IENvbmZpZ3VyYXRpb24gMiBSZWdpc3RlcgkJCSovCisjZGVmaW5lIFNQT1JUMV9UQ0xLRElWCQkweEZGQzAwOTA4CS8qIFNQT1JUMSBUcmFuc21pdCBDbG9jayBEaXZpZGVyCQkJCQkqLworI2RlZmluZSBTUE9SVDFfVEZTRElWCQkweEZGQzAwOTBDCS8qIFNQT1JUMSBUcmFuc21pdCBGcmFtZSBTeW5jIERpdmlkZXIJCQkJKi8KKyNkZWZpbmUgU1BPUlQxX1RYCQkJMHhGRkMwMDkxMAkvKiBTUE9SVDEgVFggRGF0YSBSZWdpc3RlcgkJCQkJCQkqLworI2RlZmluZSBTUE9SVDFfUlgJCQkweEZGQzAwOTE4CS8qIFNQT1JUMSBSWCBEYXRhIFJlZ2lzdGVyCQkJCQkJCSovCisjZGVmaW5lIFNQT1JUMV9SQ1IxCQkJMHhGRkMwMDkyMAkvKiBTUE9SVDEgVHJhbnNtaXQgQ29uZmlndXJhdGlvbiAxIFJlZ2lzdGVyCQkJKi8KKyNkZWZpbmUgU1BPUlQxX1JDUjIJCQkweEZGQzAwOTI0CS8qIFNQT1JUMSBUcmFuc21pdCBDb25maWd1cmF0aW9uIDIgUmVnaXN0ZXIJCQkqLworI2RlZmluZSBTUE9SVDFfUkNMS0RJVgkJMHhGRkMwMDkyOAkvKiBTUE9SVDEgUmVjZWl2ZSBDbG9jayBEaXZpZGVyCQkJCQkJKi8KKyNkZWZpbmUgU1BPUlQxX1JGU0RJVgkJMHhGRkMwMDkyQwkvKiBTUE9SVDEgUmVjZWl2ZSBGcmFtZSBTeW5jIERpdmlkZXIJCQkJKi8KKyNkZWZpbmUgU1BPUlQxX1NUQVQJCQkweEZGQzAwOTMwCS8qIFNQT1JUMSBTdGF0dXMgUmVnaXN0ZXIJCQkJCQkJKi8KKyNkZWZpbmUgU1BPUlQxX0NITkwJCQkweEZGQzAwOTM0CS8qIFNQT1JUMSBDdXJyZW50IENoYW5uZWwgUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIFNQT1JUMV9NQ01DMQkJMHhGRkMwMDkzOAkvKiBTUE9SVDEgTXVsdGktQ2hhbm5lbCBDb25maWd1cmF0aW9uIFJlZ2lzdGVyIDEJKi8KKyNkZWZpbmUgU1BPUlQxX01DTUMyCQkweEZGQzAwOTNDCS8qIFNQT1JUMSBNdWx0aS1DaGFubmVsIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgMgkqLworI2RlZmluZSBTUE9SVDFfTVRDUzAJCTB4RkZDMDA5NDAJLyogU1BPUlQxIE11bHRpLUNoYW5uZWwgVHJhbnNtaXQgU2VsZWN0IFJlZ2lzdGVyIDAJKi8KKyNkZWZpbmUgU1BPUlQxX01UQ1MxCQkweEZGQzAwOTQ0CS8qIFNQT1JUMSBNdWx0aS1DaGFubmVsIFRyYW5zbWl0IFNlbGVjdCBSZWdpc3RlciAxCSovCisjZGVmaW5lIFNQT1JUMV9NVENTMgkJMHhGRkMwMDk0OAkvKiBTUE9SVDEgTXVsdGktQ2hhbm5lbCBUcmFuc21pdCBTZWxlY3QgUmVnaXN0ZXIgMgkqLworI2RlZmluZSBTUE9SVDFfTVRDUzMJCTB4RkZDMDA5NEMJLyogU1BPUlQxIE11bHRpLUNoYW5uZWwgVHJhbnNtaXQgU2VsZWN0IFJlZ2lzdGVyIDMJKi8KKyNkZWZpbmUgU1BPUlQxX01SQ1MwCQkweEZGQzAwOTUwCS8qIFNQT1JUMSBNdWx0aS1DaGFubmVsIFJlY2VpdmUgU2VsZWN0IFJlZ2lzdGVyIDAJKi8KKyNkZWZpbmUgU1BPUlQxX01SQ1MxCQkweEZGQzAwOTU0CS8qIFNQT1JUMSBNdWx0aS1DaGFubmVsIFJlY2VpdmUgU2VsZWN0IFJlZ2lzdGVyIDEJKi8KKyNkZWZpbmUgU1BPUlQxX01SQ1MyCQkweEZGQzAwOTU4CS8qIFNQT1JUMSBNdWx0aS1DaGFubmVsIFJlY2VpdmUgU2VsZWN0IFJlZ2lzdGVyIDIJKi8KKyNkZWZpbmUgU1BPUlQxX01SQ1MzCQkweEZGQzAwOTVDCS8qIFNQT1JUMSBNdWx0aS1DaGFubmVsIFJlY2VpdmUgU2VsZWN0IFJlZ2lzdGVyIDMJKi8KKworCisvKiBFeHRlcm5hbCBCdXMgSW50ZXJmYWNlIFVuaXQgKDB4RkZDMDBBMDAgLSAweEZGQzAwQUZGKQkJCQkJCQkJKi8KKyNkZWZpbmUgRUJJVV9BTUdDVEwJCQkweEZGQzAwQTAwCS8qIEFzeW5jaHJvbm91cyBNZW1vcnkgR2xvYmFsIENvbnRyb2wgUmVnaXN0ZXIJKi8KKyNkZWZpbmUgRUJJVV9BTUJDVEwwCQkweEZGQzAwQTA0CS8qIEFzeW5jaHJvbm91cyBNZW1vcnkgQmFuayBDb250cm9sIFJlZ2lzdGVyIDAJKi8KKyNkZWZpbmUgRUJJVV9BTUJDVEwxCQkweEZGQzAwQTA4CS8qIEFzeW5jaHJvbm91cyBNZW1vcnkgQmFuayBDb250cm9sIFJlZ2lzdGVyIDEJKi8KKyNkZWZpbmUgRUJJVV9TREdDVEwJCQkweEZGQzAwQTEwCS8qIFNEUkFNIEdsb2JhbCBDb250cm9sIFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIEVCSVVfU0RCQ1RMCQkJMHhGRkMwMEExNAkvKiBTRFJBTSBCYW5rIENvbnRyb2wgUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIEVCSVVfU0RSUkMJCQkweEZGQzAwQTE4CS8qIFNEUkFNIFJlZnJlc2ggUmF0ZSBDb250cm9sIFJlZ2lzdGVyCQkJKi8KKyNkZWZpbmUgRUJJVV9TRFNUQVQJCQkweEZGQzAwQTFDCS8qIFNEUkFNIFN0YXR1cyBSZWdpc3RlcgkJCQkJCSovCisKKworLyogRE1BIFRyYWZmaWMgQ29udHJvbCBSZWdpc3RlcnMJCQkJCQkJCQkJCQkJKi8KKyNkZWZpbmUgRE1BQ19UQ19QRVIJCQkweEZGQzAwQjBDCS8qIFRyYWZmaWMgQ29udHJvbCBQZXJpb2RzIFJlZ2lzdGVyCQkJKi8KKyNkZWZpbmUgRE1BQ19UQ19DTlQJCQkweEZGQzAwQjEwCS8qIFRyYWZmaWMgQ29udHJvbCBDdXJyZW50IENvdW50cyBSZWdpc3RlcgkqLworCisvKiBETUEgQ29udHJvbGxlciAoMHhGRkMwMEMwMCAtIDB4RkZDMDBGRkYpCQkJCQkJCQkJCQkJCQkJKi8KKyNkZWZpbmUgRE1BMF9ORVhUX0RFU0NfUFRSCQkweEZGQzAwQzAwCS8qIERNQSBDaGFubmVsIDAgTmV4dCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIJCSovCisjZGVmaW5lIERNQTBfU1RBUlRfQUREUgkJCTB4RkZDMDBDMDQJLyogRE1BIENoYW5uZWwgMCBTdGFydCBBZGRyZXNzIFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBETUEwX0NPTkZJRwkJCQkweEZGQzAwQzA4CS8qIERNQSBDaGFubmVsIDAgQ29uZmlndXJhdGlvbiBSZWdpc3RlcgkJCQkJKi8KKyNkZWZpbmUgRE1BMF9YX0NPVU5UCQkJMHhGRkMwMEMxMAkvKiBETUEgQ2hhbm5lbCAwIFggQ291bnQgUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBETUEwX1hfTU9ESUZZCQkJMHhGRkMwMEMxNAkvKiBETUEgQ2hhbm5lbCAwIFggTW9kaWZ5IFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgRE1BMF9ZX0NPVU5UCQkJMHhGRkMwMEMxOAkvKiBETUEgQ2hhbm5lbCAwIFkgQ291bnQgUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBETUEwX1lfTU9ESUZZCQkJMHhGRkMwMEMxQwkvKiBETUEgQ2hhbm5lbCAwIFkgTW9kaWZ5IFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgRE1BMF9DVVJSX0RFU0NfUFRSCQkweEZGQzAwQzIwCS8qIERNQSBDaGFubmVsIDAgQ3VycmVudCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIJKi8KKyNkZWZpbmUgRE1BMF9DVVJSX0FERFIJCQkweEZGQzAwQzI0CS8qIERNQSBDaGFubmVsIDAgQ3VycmVudCBBZGRyZXNzIFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIERNQTBfSVJRX1NUQVRVUwkJCTB4RkZDMDBDMjgJLyogRE1BIENoYW5uZWwgMCBJbnRlcnJ1cHQvU3RhdHVzIFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIERNQTBfUEVSSVBIRVJBTF9NQVAJCTB4RkZDMDBDMkMJLyogRE1BIENoYW5uZWwgMCBQZXJpcGhlcmFsIE1hcCBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBETUEwX0NVUlJfWF9DT1VOVAkJMHhGRkMwMEMzMAkvKiBETUEgQ2hhbm5lbCAwIEN1cnJlbnQgWCBDb3VudCBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBETUEwX0NVUlJfWV9DT1VOVAkJMHhGRkMwMEMzOAkvKiBETUEgQ2hhbm5lbCAwIEN1cnJlbnQgWSBDb3VudCBSZWdpc3RlcgkJCQkqLworCisjZGVmaW5lIERNQTFfTkVYVF9ERVNDX1BUUgkJMHhGRkMwMEM0MAkvKiBETUEgQ2hhbm5lbCAxIE5leHQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyCQkqLworI2RlZmluZSBETUExX1NUQVJUX0FERFIJCQkweEZGQzAwQzQ0CS8qIERNQSBDaGFubmVsIDEgU3RhcnQgQWRkcmVzcyBSZWdpc3RlcgkJCQkJKi8KKyNkZWZpbmUgRE1BMV9DT05GSUcJCQkJMHhGRkMwMEM0OAkvKiBETUEgQ2hhbm5lbCAxIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIERNQTFfWF9DT1VOVAkJCTB4RkZDMDBDNTAJLyogRE1BIENoYW5uZWwgMSBYIENvdW50IFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgRE1BMV9YX01PRElGWQkJCTB4RkZDMDBDNTQJLyogRE1BIENoYW5uZWwgMSBYIE1vZGlmeSBSZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIERNQTFfWV9DT1VOVAkJCTB4RkZDMDBDNTgJLyogRE1BIENoYW5uZWwgMSBZIENvdW50IFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgRE1BMV9ZX01PRElGWQkJCTB4RkZDMDBDNUMJLyogRE1BIENoYW5uZWwgMSBZIE1vZGlmeSBSZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIERNQTFfQ1VSUl9ERVNDX1BUUgkJMHhGRkMwMEM2MAkvKiBETUEgQ2hhbm5lbCAxIEN1cnJlbnQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyCSovCisjZGVmaW5lIERNQTFfQ1VSUl9BRERSCQkJMHhGRkMwMEM2NAkvKiBETUEgQ2hhbm5lbCAxIEN1cnJlbnQgQWRkcmVzcyBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBETUExX0lSUV9TVEFUVVMJCQkweEZGQzAwQzY4CS8qIERNQSBDaGFubmVsIDEgSW50ZXJydXB0L1N0YXR1cyBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBETUExX1BFUklQSEVSQUxfTUFQCQkweEZGQzAwQzZDCS8qIERNQSBDaGFubmVsIDEgUGVyaXBoZXJhbCBNYXAgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgRE1BMV9DVVJSX1hfQ09VTlQJCTB4RkZDMDBDNzAJLyogRE1BIENoYW5uZWwgMSBDdXJyZW50IFggQ291bnQgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgRE1BMV9DVVJSX1lfQ09VTlQJCTB4RkZDMDBDNzgJLyogRE1BIENoYW5uZWwgMSBDdXJyZW50IFkgQ291bnQgUmVnaXN0ZXIJCQkJKi8KKworI2RlZmluZSBETUEyX05FWFRfREVTQ19QVFIJCTB4RkZDMDBDODAJLyogRE1BIENoYW5uZWwgMiBOZXh0IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlcgkJKi8KKyNkZWZpbmUgRE1BMl9TVEFSVF9BRERSCQkJMHhGRkMwMEM4NAkvKiBETUEgQ2hhbm5lbCAyIFN0YXJ0IEFkZHJlc3MgUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIERNQTJfQ09ORklHCQkJCTB4RkZDMDBDODgJLyogRE1BIENoYW5uZWwgMiBDb25maWd1cmF0aW9uIFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBETUEyX1hfQ09VTlQJCQkweEZGQzAwQzkwCS8qIERNQSBDaGFubmVsIDIgWCBDb3VudCBSZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIERNQTJfWF9NT0RJRlkJCQkweEZGQzAwQzk0CS8qIERNQSBDaGFubmVsIDIgWCBNb2RpZnkgUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBETUEyX1lfQ09VTlQJCQkweEZGQzAwQzk4CS8qIERNQSBDaGFubmVsIDIgWSBDb3VudCBSZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIERNQTJfWV9NT0RJRlkJCQkweEZGQzAwQzlDCS8qIERNQSBDaGFubmVsIDIgWSBNb2RpZnkgUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBETUEyX0NVUlJfREVTQ19QVFIJCTB4RkZDMDBDQTAJLyogRE1BIENoYW5uZWwgMiBDdXJyZW50IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlcgkqLworI2RlZmluZSBETUEyX0NVUlJfQUREUgkJCTB4RkZDMDBDQTQJLyogRE1BIENoYW5uZWwgMiBDdXJyZW50IEFkZHJlc3MgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgRE1BMl9JUlFfU1RBVFVTCQkJMHhGRkMwMENBOAkvKiBETUEgQ2hhbm5lbCAyIEludGVycnVwdC9TdGF0dXMgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgRE1BMl9QRVJJUEhFUkFMX01BUAkJMHhGRkMwMENBQwkvKiBETUEgQ2hhbm5lbCAyIFBlcmlwaGVyYWwgTWFwIFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIERNQTJfQ1VSUl9YX0NPVU5UCQkweEZGQzAwQ0IwCS8qIERNQSBDaGFubmVsIDIgQ3VycmVudCBYIENvdW50IFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIERNQTJfQ1VSUl9ZX0NPVU5UCQkweEZGQzAwQ0I4CS8qIERNQSBDaGFubmVsIDIgQ3VycmVudCBZIENvdW50IFJlZ2lzdGVyCQkJCSovCisKKyNkZWZpbmUgRE1BM19ORVhUX0RFU0NfUFRSCQkweEZGQzAwQ0MwCS8qIERNQSBDaGFubmVsIDMgTmV4dCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIJCSovCisjZGVmaW5lIERNQTNfU1RBUlRfQUREUgkJCTB4RkZDMDBDQzQJLyogRE1BIENoYW5uZWwgMyBTdGFydCBBZGRyZXNzIFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBETUEzX0NPTkZJRwkJCQkweEZGQzAwQ0M4CS8qIERNQSBDaGFubmVsIDMgQ29uZmlndXJhdGlvbiBSZWdpc3RlcgkJCQkJKi8KKyNkZWZpbmUgRE1BM19YX0NPVU5UCQkJMHhGRkMwMENEMAkvKiBETUEgQ2hhbm5lbCAzIFggQ291bnQgUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBETUEzX1hfTU9ESUZZCQkJMHhGRkMwMENENAkvKiBETUEgQ2hhbm5lbCAzIFggTW9kaWZ5IFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgRE1BM19ZX0NPVU5UCQkJMHhGRkMwMENEOAkvKiBETUEgQ2hhbm5lbCAzIFkgQ291bnQgUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBETUEzX1lfTU9ESUZZCQkJMHhGRkMwMENEQwkvKiBETUEgQ2hhbm5lbCAzIFkgTW9kaWZ5IFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgRE1BM19DVVJSX0RFU0NfUFRSCQkweEZGQzAwQ0UwCS8qIERNQSBDaGFubmVsIDMgQ3VycmVudCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIJKi8KKyNkZWZpbmUgRE1BM19DVVJSX0FERFIJCQkweEZGQzAwQ0U0CS8qIERNQSBDaGFubmVsIDMgQ3VycmVudCBBZGRyZXNzIFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIERNQTNfSVJRX1NUQVRVUwkJCTB4RkZDMDBDRTgJLyogRE1BIENoYW5uZWwgMyBJbnRlcnJ1cHQvU3RhdHVzIFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIERNQTNfUEVSSVBIRVJBTF9NQVAJCTB4RkZDMDBDRUMJLyogRE1BIENoYW5uZWwgMyBQZXJpcGhlcmFsIE1hcCBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBETUEzX0NVUlJfWF9DT1VOVAkJMHhGRkMwMENGMAkvKiBETUEgQ2hhbm5lbCAzIEN1cnJlbnQgWCBDb3VudCBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBETUEzX0NVUlJfWV9DT1VOVAkJMHhGRkMwMENGOAkvKiBETUEgQ2hhbm5lbCAzIEN1cnJlbnQgWSBDb3VudCBSZWdpc3RlcgkJCQkqLworCisjZGVmaW5lIERNQTRfTkVYVF9ERVNDX1BUUgkJMHhGRkMwMEQwMAkvKiBETUEgQ2hhbm5lbCA0IE5leHQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyCQkqLworI2RlZmluZSBETUE0X1NUQVJUX0FERFIJCQkweEZGQzAwRDA0CS8qIERNQSBDaGFubmVsIDQgU3RhcnQgQWRkcmVzcyBSZWdpc3RlcgkJCQkJKi8KKyNkZWZpbmUgRE1BNF9DT05GSUcJCQkJMHhGRkMwMEQwOAkvKiBETUEgQ2hhbm5lbCA0IENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIERNQTRfWF9DT1VOVAkJCTB4RkZDMDBEMTAJLyogRE1BIENoYW5uZWwgNCBYIENvdW50IFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgRE1BNF9YX01PRElGWQkJCTB4RkZDMDBEMTQJLyogRE1BIENoYW5uZWwgNCBYIE1vZGlmeSBSZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIERNQTRfWV9DT1VOVAkJCTB4RkZDMDBEMTgJLyogRE1BIENoYW5uZWwgNCBZIENvdW50IFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgRE1BNF9ZX01PRElGWQkJCTB4RkZDMDBEMUMJLyogRE1BIENoYW5uZWwgNCBZIE1vZGlmeSBSZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIERNQTRfQ1VSUl9ERVNDX1BUUgkJMHhGRkMwMEQyMAkvKiBETUEgQ2hhbm5lbCA0IEN1cnJlbnQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyCSovCisjZGVmaW5lIERNQTRfQ1VSUl9BRERSCQkJMHhGRkMwMEQyNAkvKiBETUEgQ2hhbm5lbCA0IEN1cnJlbnQgQWRkcmVzcyBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBETUE0X0lSUV9TVEFUVVMJCQkweEZGQzAwRDI4CS8qIERNQSBDaGFubmVsIDQgSW50ZXJydXB0L1N0YXR1cyBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBETUE0X1BFUklQSEVSQUxfTUFQCQkweEZGQzAwRDJDCS8qIERNQSBDaGFubmVsIDQgUGVyaXBoZXJhbCBNYXAgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgRE1BNF9DVVJSX1hfQ09VTlQJCTB4RkZDMDBEMzAJLyogRE1BIENoYW5uZWwgNCBDdXJyZW50IFggQ291bnQgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgRE1BNF9DVVJSX1lfQ09VTlQJCTB4RkZDMDBEMzgJLyogRE1BIENoYW5uZWwgNCBDdXJyZW50IFkgQ291bnQgUmVnaXN0ZXIJCQkJKi8KKworI2RlZmluZSBETUE1X05FWFRfREVTQ19QVFIJCTB4RkZDMDBENDAJLyogRE1BIENoYW5uZWwgNSBOZXh0IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlcgkJKi8KKyNkZWZpbmUgRE1BNV9TVEFSVF9BRERSCQkJMHhGRkMwMEQ0NAkvKiBETUEgQ2hhbm5lbCA1IFN0YXJ0IEFkZHJlc3MgUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIERNQTVfQ09ORklHCQkJCTB4RkZDMDBENDgJLyogRE1BIENoYW5uZWwgNSBDb25maWd1cmF0aW9uIFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBETUE1X1hfQ09VTlQJCQkweEZGQzAwRDUwCS8qIERNQSBDaGFubmVsIDUgWCBDb3VudCBSZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIERNQTVfWF9NT0RJRlkJCQkweEZGQzAwRDU0CS8qIERNQSBDaGFubmVsIDUgWCBNb2RpZnkgUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBETUE1X1lfQ09VTlQJCQkweEZGQzAwRDU4CS8qIERNQSBDaGFubmVsIDUgWSBDb3VudCBSZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIERNQTVfWV9NT0RJRlkJCQkweEZGQzAwRDVDCS8qIERNQSBDaGFubmVsIDUgWSBNb2RpZnkgUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBETUE1X0NVUlJfREVTQ19QVFIJCTB4RkZDMDBENjAJLyogRE1BIENoYW5uZWwgNSBDdXJyZW50IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlcgkqLworI2RlZmluZSBETUE1X0NVUlJfQUREUgkJCTB4RkZDMDBENjQJLyogRE1BIENoYW5uZWwgNSBDdXJyZW50IEFkZHJlc3MgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgRE1BNV9JUlFfU1RBVFVTCQkJMHhGRkMwMEQ2OAkvKiBETUEgQ2hhbm5lbCA1IEludGVycnVwdC9TdGF0dXMgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgRE1BNV9QRVJJUEhFUkFMX01BUAkJMHhGRkMwMEQ2QwkvKiBETUEgQ2hhbm5lbCA1IFBlcmlwaGVyYWwgTWFwIFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIERNQTVfQ1VSUl9YX0NPVU5UCQkweEZGQzAwRDcwCS8qIERNQSBDaGFubmVsIDUgQ3VycmVudCBYIENvdW50IFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIERNQTVfQ1VSUl9ZX0NPVU5UCQkweEZGQzAwRDc4CS8qIERNQSBDaGFubmVsIDUgQ3VycmVudCBZIENvdW50IFJlZ2lzdGVyCQkJCSovCisKKyNkZWZpbmUgRE1BNl9ORVhUX0RFU0NfUFRSCQkweEZGQzAwRDgwCS8qIERNQSBDaGFubmVsIDYgTmV4dCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIJCSovCisjZGVmaW5lIERNQTZfU1RBUlRfQUREUgkJCTB4RkZDMDBEODQJLyogRE1BIENoYW5uZWwgNiBTdGFydCBBZGRyZXNzIFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBETUE2X0NPTkZJRwkJCQkweEZGQzAwRDg4CS8qIERNQSBDaGFubmVsIDYgQ29uZmlndXJhdGlvbiBSZWdpc3RlcgkJCQkJKi8KKyNkZWZpbmUgRE1BNl9YX0NPVU5UCQkJMHhGRkMwMEQ5MAkvKiBETUEgQ2hhbm5lbCA2IFggQ291bnQgUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBETUE2X1hfTU9ESUZZCQkJMHhGRkMwMEQ5NAkvKiBETUEgQ2hhbm5lbCA2IFggTW9kaWZ5IFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgRE1BNl9ZX0NPVU5UCQkJMHhGRkMwMEQ5OAkvKiBETUEgQ2hhbm5lbCA2IFkgQ291bnQgUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBETUE2X1lfTU9ESUZZCQkJMHhGRkMwMEQ5QwkvKiBETUEgQ2hhbm5lbCA2IFkgTW9kaWZ5IFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgRE1BNl9DVVJSX0RFU0NfUFRSCQkweEZGQzAwREEwCS8qIERNQSBDaGFubmVsIDYgQ3VycmVudCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIJKi8KKyNkZWZpbmUgRE1BNl9DVVJSX0FERFIJCQkweEZGQzAwREE0CS8qIERNQSBDaGFubmVsIDYgQ3VycmVudCBBZGRyZXNzIFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIERNQTZfSVJRX1NUQVRVUwkJCTB4RkZDMDBEQTgJLyogRE1BIENoYW5uZWwgNiBJbnRlcnJ1cHQvU3RhdHVzIFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIERNQTZfUEVSSVBIRVJBTF9NQVAJCTB4RkZDMDBEQUMJLyogRE1BIENoYW5uZWwgNiBQZXJpcGhlcmFsIE1hcCBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBETUE2X0NVUlJfWF9DT1VOVAkJMHhGRkMwMERCMAkvKiBETUEgQ2hhbm5lbCA2IEN1cnJlbnQgWCBDb3VudCBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBETUE2X0NVUlJfWV9DT1VOVAkJMHhGRkMwMERCOAkvKiBETUEgQ2hhbm5lbCA2IEN1cnJlbnQgWSBDb3VudCBSZWdpc3RlcgkJCQkqLworCisjZGVmaW5lIERNQTdfTkVYVF9ERVNDX1BUUgkJMHhGRkMwMERDMAkvKiBETUEgQ2hhbm5lbCA3IE5leHQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyCQkqLworI2RlZmluZSBETUE3X1NUQVJUX0FERFIJCQkweEZGQzAwREM0CS8qIERNQSBDaGFubmVsIDcgU3RhcnQgQWRkcmVzcyBSZWdpc3RlcgkJCQkJKi8KKyNkZWZpbmUgRE1BN19DT05GSUcJCQkJMHhGRkMwMERDOAkvKiBETUEgQ2hhbm5lbCA3IENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIERNQTdfWF9DT1VOVAkJCTB4RkZDMDBERDAJLyogRE1BIENoYW5uZWwgNyBYIENvdW50IFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgRE1BN19YX01PRElGWQkJCTB4RkZDMDBERDQJLyogRE1BIENoYW5uZWwgNyBYIE1vZGlmeSBSZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIERNQTdfWV9DT1VOVAkJCTB4RkZDMDBERDgJLyogRE1BIENoYW5uZWwgNyBZIENvdW50IFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgRE1BN19ZX01PRElGWQkJCTB4RkZDMDBEREMJLyogRE1BIENoYW5uZWwgNyBZIE1vZGlmeSBSZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIERNQTdfQ1VSUl9ERVNDX1BUUgkJMHhGRkMwMERFMAkvKiBETUEgQ2hhbm5lbCA3IEN1cnJlbnQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyCSovCisjZGVmaW5lIERNQTdfQ1VSUl9BRERSCQkJMHhGRkMwMERFNAkvKiBETUEgQ2hhbm5lbCA3IEN1cnJlbnQgQWRkcmVzcyBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBETUE3X0lSUV9TVEFUVVMJCQkweEZGQzAwREU4CS8qIERNQSBDaGFubmVsIDcgSW50ZXJydXB0L1N0YXR1cyBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBETUE3X1BFUklQSEVSQUxfTUFQCQkweEZGQzAwREVDCS8qIERNQSBDaGFubmVsIDcgUGVyaXBoZXJhbCBNYXAgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgRE1BN19DVVJSX1hfQ09VTlQJCTB4RkZDMDBERjAJLyogRE1BIENoYW5uZWwgNyBDdXJyZW50IFggQ291bnQgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgRE1BN19DVVJSX1lfQ09VTlQJCTB4RkZDMDBERjgJLyogRE1BIENoYW5uZWwgNyBDdXJyZW50IFkgQ291bnQgUmVnaXN0ZXIJCQkJKi8KKworI2RlZmluZSBETUE4X05FWFRfREVTQ19QVFIJCTB4RkZDMDBFMDAJLyogRE1BIENoYW5uZWwgOCBOZXh0IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlcgkJKi8KKyNkZWZpbmUgRE1BOF9TVEFSVF9BRERSCQkJMHhGRkMwMEUwNAkvKiBETUEgQ2hhbm5lbCA4IFN0YXJ0IEFkZHJlc3MgUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIERNQThfQ09ORklHCQkJCTB4RkZDMDBFMDgJLyogRE1BIENoYW5uZWwgOCBDb25maWd1cmF0aW9uIFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBETUE4X1hfQ09VTlQJCQkweEZGQzAwRTEwCS8qIERNQSBDaGFubmVsIDggWCBDb3VudCBSZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIERNQThfWF9NT0RJRlkJCQkweEZGQzAwRTE0CS8qIERNQSBDaGFubmVsIDggWCBNb2RpZnkgUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBETUE4X1lfQ09VTlQJCQkweEZGQzAwRTE4CS8qIERNQSBDaGFubmVsIDggWSBDb3VudCBSZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIERNQThfWV9NT0RJRlkJCQkweEZGQzAwRTFDCS8qIERNQSBDaGFubmVsIDggWSBNb2RpZnkgUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBETUE4X0NVUlJfREVTQ19QVFIJCTB4RkZDMDBFMjAJLyogRE1BIENoYW5uZWwgOCBDdXJyZW50IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlcgkqLworI2RlZmluZSBETUE4X0NVUlJfQUREUgkJCTB4RkZDMDBFMjQJLyogRE1BIENoYW5uZWwgOCBDdXJyZW50IEFkZHJlc3MgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgRE1BOF9JUlFfU1RBVFVTCQkJMHhGRkMwMEUyOAkvKiBETUEgQ2hhbm5lbCA4IEludGVycnVwdC9TdGF0dXMgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgRE1BOF9QRVJJUEhFUkFMX01BUAkJMHhGRkMwMEUyQwkvKiBETUEgQ2hhbm5lbCA4IFBlcmlwaGVyYWwgTWFwIFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIERNQThfQ1VSUl9YX0NPVU5UCQkweEZGQzAwRTMwCS8qIERNQSBDaGFubmVsIDggQ3VycmVudCBYIENvdW50IFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIERNQThfQ1VSUl9ZX0NPVU5UCQkweEZGQzAwRTM4CS8qIERNQSBDaGFubmVsIDggQ3VycmVudCBZIENvdW50IFJlZ2lzdGVyCQkJCSovCisKKyNkZWZpbmUgRE1BOV9ORVhUX0RFU0NfUFRSCQkweEZGQzAwRTQwCS8qIERNQSBDaGFubmVsIDkgTmV4dCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIJCSovCisjZGVmaW5lIERNQTlfU1RBUlRfQUREUgkJCTB4RkZDMDBFNDQJLyogRE1BIENoYW5uZWwgOSBTdGFydCBBZGRyZXNzIFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBETUE5X0NPTkZJRwkJCQkweEZGQzAwRTQ4CS8qIERNQSBDaGFubmVsIDkgQ29uZmlndXJhdGlvbiBSZWdpc3RlcgkJCQkJKi8KKyNkZWZpbmUgRE1BOV9YX0NPVU5UCQkJMHhGRkMwMEU1MAkvKiBETUEgQ2hhbm5lbCA5IFggQ291bnQgUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBETUE5X1hfTU9ESUZZCQkJMHhGRkMwMEU1NAkvKiBETUEgQ2hhbm5lbCA5IFggTW9kaWZ5IFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgRE1BOV9ZX0NPVU5UCQkJMHhGRkMwMEU1OAkvKiBETUEgQ2hhbm5lbCA5IFkgQ291bnQgUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBETUE5X1lfTU9ESUZZCQkJMHhGRkMwMEU1QwkvKiBETUEgQ2hhbm5lbCA5IFkgTW9kaWZ5IFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgRE1BOV9DVVJSX0RFU0NfUFRSCQkweEZGQzAwRTYwCS8qIERNQSBDaGFubmVsIDkgQ3VycmVudCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIJKi8KKyNkZWZpbmUgRE1BOV9DVVJSX0FERFIJCQkweEZGQzAwRTY0CS8qIERNQSBDaGFubmVsIDkgQ3VycmVudCBBZGRyZXNzIFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIERNQTlfSVJRX1NUQVRVUwkJCTB4RkZDMDBFNjgJLyogRE1BIENoYW5uZWwgOSBJbnRlcnJ1cHQvU3RhdHVzIFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIERNQTlfUEVSSVBIRVJBTF9NQVAJCTB4RkZDMDBFNkMJLyogRE1BIENoYW5uZWwgOSBQZXJpcGhlcmFsIE1hcCBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBETUE5X0NVUlJfWF9DT1VOVAkJMHhGRkMwMEU3MAkvKiBETUEgQ2hhbm5lbCA5IEN1cnJlbnQgWCBDb3VudCBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBETUE5X0NVUlJfWV9DT1VOVAkJMHhGRkMwMEU3OAkvKiBETUEgQ2hhbm5lbCA5IEN1cnJlbnQgWSBDb3VudCBSZWdpc3RlcgkJCQkqLworCisjZGVmaW5lIERNQTEwX05FWFRfREVTQ19QVFIJCTB4RkZDMDBFODAJLyogRE1BIENoYW5uZWwgMTAgTmV4dCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIJCSovCisjZGVmaW5lIERNQTEwX1NUQVJUX0FERFIJCTB4RkZDMDBFODQJLyogRE1BIENoYW5uZWwgMTAgU3RhcnQgQWRkcmVzcyBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBETUExMF9DT05GSUcJCQkweEZGQzAwRTg4CS8qIERNQSBDaGFubmVsIDEwIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgRE1BMTBfWF9DT1VOVAkJCTB4RkZDMDBFOTAJLyogRE1BIENoYW5uZWwgMTAgWCBDb3VudCBSZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIERNQTEwX1hfTU9ESUZZCQkJMHhGRkMwMEU5NAkvKiBETUEgQ2hhbm5lbCAxMCBYIE1vZGlmeSBSZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIERNQTEwX1lfQ09VTlQJCQkweEZGQzAwRTk4CS8qIERNQSBDaGFubmVsIDEwIFkgQ291bnQgUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBETUExMF9ZX01PRElGWQkJCTB4RkZDMDBFOUMJLyogRE1BIENoYW5uZWwgMTAgWSBNb2RpZnkgUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBETUExMF9DVVJSX0RFU0NfUFRSCQkweEZGQzAwRUEwCS8qIERNQSBDaGFubmVsIDEwIEN1cnJlbnQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyCSovCisjZGVmaW5lIERNQTEwX0NVUlJfQUREUgkJCTB4RkZDMDBFQTQJLyogRE1BIENoYW5uZWwgMTAgQ3VycmVudCBBZGRyZXNzIFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIERNQTEwX0lSUV9TVEFUVVMJCTB4RkZDMDBFQTgJLyogRE1BIENoYW5uZWwgMTAgSW50ZXJydXB0L1N0YXR1cyBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBETUExMF9QRVJJUEhFUkFMX01BUAkweEZGQzAwRUFDCS8qIERNQSBDaGFubmVsIDEwIFBlcmlwaGVyYWwgTWFwIFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIERNQTEwX0NVUlJfWF9DT1VOVAkJMHhGRkMwMEVCMAkvKiBETUEgQ2hhbm5lbCAxMCBDdXJyZW50IFggQ291bnQgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgRE1BMTBfQ1VSUl9ZX0NPVU5UCQkweEZGQzAwRUI4CS8qIERNQSBDaGFubmVsIDEwIEN1cnJlbnQgWSBDb3VudCBSZWdpc3RlcgkJCQkqLworCisjZGVmaW5lIERNQTExX05FWFRfREVTQ19QVFIJCTB4RkZDMDBFQzAJLyogRE1BIENoYW5uZWwgMTEgTmV4dCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIJCSovCisjZGVmaW5lIERNQTExX1NUQVJUX0FERFIJCTB4RkZDMDBFQzQJLyogRE1BIENoYW5uZWwgMTEgU3RhcnQgQWRkcmVzcyBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBETUExMV9DT05GSUcJCQkweEZGQzAwRUM4CS8qIERNQSBDaGFubmVsIDExIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgRE1BMTFfWF9DT1VOVAkJCTB4RkZDMDBFRDAJLyogRE1BIENoYW5uZWwgMTEgWCBDb3VudCBSZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIERNQTExX1hfTU9ESUZZCQkJMHhGRkMwMEVENAkvKiBETUEgQ2hhbm5lbCAxMSBYIE1vZGlmeSBSZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIERNQTExX1lfQ09VTlQJCQkweEZGQzAwRUQ4CS8qIERNQSBDaGFubmVsIDExIFkgQ291bnQgUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBETUExMV9ZX01PRElGWQkJCTB4RkZDMDBFREMJLyogRE1BIENoYW5uZWwgMTEgWSBNb2RpZnkgUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBETUExMV9DVVJSX0RFU0NfUFRSCQkweEZGQzAwRUUwCS8qIERNQSBDaGFubmVsIDExIEN1cnJlbnQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyCSovCisjZGVmaW5lIERNQTExX0NVUlJfQUREUgkJCTB4RkZDMDBFRTQJLyogRE1BIENoYW5uZWwgMTEgQ3VycmVudCBBZGRyZXNzIFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIERNQTExX0lSUV9TVEFUVVMJCTB4RkZDMDBFRTgJLyogRE1BIENoYW5uZWwgMTEgSW50ZXJydXB0L1N0YXR1cyBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBETUExMV9QRVJJUEhFUkFMX01BUAkweEZGQzAwRUVDCS8qIERNQSBDaGFubmVsIDExIFBlcmlwaGVyYWwgTWFwIFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIERNQTExX0NVUlJfWF9DT1VOVAkJMHhGRkMwMEVGMAkvKiBETUEgQ2hhbm5lbCAxMSBDdXJyZW50IFggQ291bnQgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgRE1BMTFfQ1VSUl9ZX0NPVU5UCQkweEZGQzAwRUY4CS8qIERNQSBDaGFubmVsIDExIEN1cnJlbnQgWSBDb3VudCBSZWdpc3RlcgkJCQkqLworCisjZGVmaW5lIE1ETUFfRDBfTkVYVF9ERVNDX1BUUgkweEZGQzAwRjAwCS8qIE1lbURNQSBTdHJlYW0gMCBEZXN0aW5hdGlvbiBOZXh0IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlcgkJKi8KKyNkZWZpbmUgTURNQV9EMF9TVEFSVF9BRERSCQkweEZGQzAwRjA0CS8qIE1lbURNQSBTdHJlYW0gMCBEZXN0aW5hdGlvbiBTdGFydCBBZGRyZXNzIFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIE1ETUFfRDBfQ09ORklHCQkJMHhGRkMwMEYwOAkvKiBNZW1ETUEgU3RyZWFtIDAgRGVzdGluYXRpb24gQ29uZmlndXJhdGlvbiBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBNRE1BX0QwX1hfQ09VTlQJCQkweEZGQzAwRjEwCS8qIE1lbURNQSBTdHJlYW0gMCBEZXN0aW5hdGlvbiBYIENvdW50IFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgTURNQV9EMF9YX01PRElGWQkJMHhGRkMwMEYxNAkvKiBNZW1ETUEgU3RyZWFtIDAgRGVzdGluYXRpb24gWCBNb2RpZnkgUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIE1ETUFfRDBfWV9DT1VOVAkJCTB4RkZDMDBGMTgJLyogTWVtRE1BIFN0cmVhbSAwIERlc3RpbmF0aW9uIFkgQ291bnQgUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBNRE1BX0QwX1lfTU9ESUZZCQkweEZGQzAwRjFDCS8qIE1lbURNQSBTdHJlYW0gMCBEZXN0aW5hdGlvbiBZIE1vZGlmeSBSZWdpc3RlcgkJCQkJKi8KKyNkZWZpbmUgTURNQV9EMF9DVVJSX0RFU0NfUFRSCTB4RkZDMDBGMjAJLyogTWVtRE1BIFN0cmVhbSAwIERlc3RpbmF0aW9uIEN1cnJlbnQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyCSovCisjZGVmaW5lIE1ETUFfRDBfQ1VSUl9BRERSCQkweEZGQzAwRjI0CS8qIE1lbURNQSBTdHJlYW0gMCBEZXN0aW5hdGlvbiBDdXJyZW50IEFkZHJlc3MgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgTURNQV9EMF9JUlFfU1RBVFVTCQkweEZGQzAwRjI4CS8qIE1lbURNQSBTdHJlYW0gMCBEZXN0aW5hdGlvbiBJbnRlcnJ1cHQvU3RhdHVzIFJlZ2lzdGVyCQkJKi8KKyNkZWZpbmUgTURNQV9EMF9QRVJJUEhFUkFMX01BUAkweEZGQzAwRjJDCS8qIE1lbURNQSBTdHJlYW0gMCBEZXN0aW5hdGlvbiBQZXJpcGhlcmFsIE1hcCBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBNRE1BX0QwX0NVUlJfWF9DT1VOVAkweEZGQzAwRjMwCS8qIE1lbURNQSBTdHJlYW0gMCBEZXN0aW5hdGlvbiBDdXJyZW50IFggQ291bnQgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgTURNQV9EMF9DVVJSX1lfQ09VTlQJMHhGRkMwMEYzOAkvKiBNZW1ETUEgU3RyZWFtIDAgRGVzdGluYXRpb24gQ3VycmVudCBZIENvdW50IFJlZ2lzdGVyCQkJCSovCisKKyNkZWZpbmUgTURNQV9TMF9ORVhUX0RFU0NfUFRSCTB4RkZDMDBGNDAJLyogTWVtRE1BIFN0cmVhbSAwIFNvdXJjZSBOZXh0IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlcgkJCSovCisjZGVmaW5lIE1ETUFfUzBfU1RBUlRfQUREUgkJMHhGRkMwMEY0NAkvKiBNZW1ETUEgU3RyZWFtIDAgU291cmNlIFN0YXJ0IEFkZHJlc3MgUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIE1ETUFfUzBfQ09ORklHCQkJMHhGRkMwMEY0OAkvKiBNZW1ETUEgU3RyZWFtIDAgU291cmNlIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIE1ETUFfUzBfWF9DT1VOVAkJCTB4RkZDMDBGNTAJLyogTWVtRE1BIFN0cmVhbSAwIFNvdXJjZSBYIENvdW50IFJlZ2lzdGVyCQkJCQkJCSovCisjZGVmaW5lIE1ETUFfUzBfWF9NT0RJRlkJCTB4RkZDMDBGNTQJLyogTWVtRE1BIFN0cmVhbSAwIFNvdXJjZSBYIE1vZGlmeSBSZWdpc3RlcgkJCQkJCQkqLworI2RlZmluZSBNRE1BX1MwX1lfQ09VTlQJCQkweEZGQzAwRjU4CS8qIE1lbURNQSBTdHJlYW0gMCBTb3VyY2UgWSBDb3VudCBSZWdpc3RlcgkJCQkJCQkqLworI2RlZmluZSBNRE1BX1MwX1lfTU9ESUZZCQkweEZGQzAwRjVDCS8qIE1lbURNQSBTdHJlYW0gMCBTb3VyY2UgWSBNb2RpZnkgUmVnaXN0ZXIJCQkJCQkJKi8KKyNkZWZpbmUgTURNQV9TMF9DVVJSX0RFU0NfUFRSCTB4RkZDMDBGNjAJLyogTWVtRE1BIFN0cmVhbSAwIFNvdXJjZSBDdXJyZW50IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlcgkJKi8KKyNkZWZpbmUgTURNQV9TMF9DVVJSX0FERFIJCTB4RkZDMDBGNjQJLyogTWVtRE1BIFN0cmVhbSAwIFNvdXJjZSBDdXJyZW50IEFkZHJlc3MgUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIE1ETUFfUzBfSVJRX1NUQVRVUwkJMHhGRkMwMEY2OAkvKiBNZW1ETUEgU3RyZWFtIDAgU291cmNlIEludGVycnVwdC9TdGF0dXMgUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIE1ETUFfUzBfUEVSSVBIRVJBTF9NQVAJMHhGRkMwMEY2QwkvKiBNZW1ETUEgU3RyZWFtIDAgU291cmNlIFBlcmlwaGVyYWwgTWFwIFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBNRE1BX1MwX0NVUlJfWF9DT1VOVAkweEZGQzAwRjcwCS8qIE1lbURNQSBTdHJlYW0gMCBTb3VyY2UgQ3VycmVudCBYIENvdW50IFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBNRE1BX1MwX0NVUlJfWV9DT1VOVAkweEZGQzAwRjc4CS8qIE1lbURNQSBTdHJlYW0gMCBTb3VyY2UgQ3VycmVudCBZIENvdW50IFJlZ2lzdGVyCQkJCQkqLworCisjZGVmaW5lIE1ETUFfRDFfTkVYVF9ERVNDX1BUUgkweEZGQzAwRjgwCS8qIE1lbURNQSBTdHJlYW0gMSBEZXN0aW5hdGlvbiBOZXh0IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlcgkJKi8KKyNkZWZpbmUgTURNQV9EMV9TVEFSVF9BRERSCQkweEZGQzAwRjg0CS8qIE1lbURNQSBTdHJlYW0gMSBEZXN0aW5hdGlvbiBTdGFydCBBZGRyZXNzIFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIE1ETUFfRDFfQ09ORklHCQkJMHhGRkMwMEY4OAkvKiBNZW1ETUEgU3RyZWFtIDEgRGVzdGluYXRpb24gQ29uZmlndXJhdGlvbiBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBNRE1BX0QxX1hfQ09VTlQJCQkweEZGQzAwRjkwCS8qIE1lbURNQSBTdHJlYW0gMSBEZXN0aW5hdGlvbiBYIENvdW50IFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgTURNQV9EMV9YX01PRElGWQkJMHhGRkMwMEY5NAkvKiBNZW1ETUEgU3RyZWFtIDEgRGVzdGluYXRpb24gWCBNb2RpZnkgUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIE1ETUFfRDFfWV9DT1VOVAkJCTB4RkZDMDBGOTgJLyogTWVtRE1BIFN0cmVhbSAxIERlc3RpbmF0aW9uIFkgQ291bnQgUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBNRE1BX0QxX1lfTU9ESUZZCQkweEZGQzAwRjlDCS8qIE1lbURNQSBTdHJlYW0gMSBEZXN0aW5hdGlvbiBZIE1vZGlmeSBSZWdpc3RlcgkJCQkJKi8KKyNkZWZpbmUgTURNQV9EMV9DVVJSX0RFU0NfUFRSCTB4RkZDMDBGQTAJLyogTWVtRE1BIFN0cmVhbSAxIERlc3RpbmF0aW9uIEN1cnJlbnQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyCSovCisjZGVmaW5lIE1ETUFfRDFfQ1VSUl9BRERSCQkweEZGQzAwRkE0CS8qIE1lbURNQSBTdHJlYW0gMSBEZXN0aW5hdGlvbiBDdXJyZW50IEFkZHJlc3MgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgTURNQV9EMV9JUlFfU1RBVFVTCQkweEZGQzAwRkE4CS8qIE1lbURNQSBTdHJlYW0gMSBEZXN0aW5hdGlvbiBJbnRlcnJ1cHQvU3RhdHVzIFJlZ2lzdGVyCQkJKi8KKyNkZWZpbmUgTURNQV9EMV9QRVJJUEhFUkFMX01BUAkweEZGQzAwRkFDCS8qIE1lbURNQSBTdHJlYW0gMSBEZXN0aW5hdGlvbiBQZXJpcGhlcmFsIE1hcCBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBNRE1BX0QxX0NVUlJfWF9DT1VOVAkweEZGQzAwRkIwCS8qIE1lbURNQSBTdHJlYW0gMSBEZXN0aW5hdGlvbiBDdXJyZW50IFggQ291bnQgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgTURNQV9EMV9DVVJSX1lfQ09VTlQJMHhGRkMwMEZCOAkvKiBNZW1ETUEgU3RyZWFtIDEgRGVzdGluYXRpb24gQ3VycmVudCBZIENvdW50IFJlZ2lzdGVyCQkJCSovCisKKyNkZWZpbmUgTURNQV9TMV9ORVhUX0RFU0NfUFRSCTB4RkZDMDBGQzAJLyogTWVtRE1BIFN0cmVhbSAxIFNvdXJjZSBOZXh0IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlcgkJCSovCisjZGVmaW5lIE1ETUFfUzFfU1RBUlRfQUREUgkJMHhGRkMwMEZDNAkvKiBNZW1ETUEgU3RyZWFtIDEgU291cmNlIFN0YXJ0IEFkZHJlc3MgUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIE1ETUFfUzFfQ09ORklHCQkJMHhGRkMwMEZDOAkvKiBNZW1ETUEgU3RyZWFtIDEgU291cmNlIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIE1ETUFfUzFfWF9DT1VOVAkJCTB4RkZDMDBGRDAJLyogTWVtRE1BIFN0cmVhbSAxIFNvdXJjZSBYIENvdW50IFJlZ2lzdGVyCQkJCQkJCSovCisjZGVmaW5lIE1ETUFfUzFfWF9NT0RJRlkJCTB4RkZDMDBGRDQJLyogTWVtRE1BIFN0cmVhbSAxIFNvdXJjZSBYIE1vZGlmeSBSZWdpc3RlcgkJCQkJCQkqLworI2RlZmluZSBNRE1BX1MxX1lfQ09VTlQJCQkweEZGQzAwRkQ4CS8qIE1lbURNQSBTdHJlYW0gMSBTb3VyY2UgWSBDb3VudCBSZWdpc3RlcgkJCQkJCQkqLworI2RlZmluZSBNRE1BX1MxX1lfTU9ESUZZCQkweEZGQzAwRkRDCS8qIE1lbURNQSBTdHJlYW0gMSBTb3VyY2UgWSBNb2RpZnkgUmVnaXN0ZXIJCQkJCQkJKi8KKyNkZWZpbmUgTURNQV9TMV9DVVJSX0RFU0NfUFRSCTB4RkZDMDBGRTAJLyogTWVtRE1BIFN0cmVhbSAxIFNvdXJjZSBDdXJyZW50IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlcgkJKi8KKyNkZWZpbmUgTURNQV9TMV9DVVJSX0FERFIJCTB4RkZDMDBGRTQJLyogTWVtRE1BIFN0cmVhbSAxIFNvdXJjZSBDdXJyZW50IEFkZHJlc3MgUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIE1ETUFfUzFfSVJRX1NUQVRVUwkJMHhGRkMwMEZFOAkvKiBNZW1ETUEgU3RyZWFtIDEgU291cmNlIEludGVycnVwdC9TdGF0dXMgUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIE1ETUFfUzFfUEVSSVBIRVJBTF9NQVAJMHhGRkMwMEZFQwkvKiBNZW1ETUEgU3RyZWFtIDEgU291cmNlIFBlcmlwaGVyYWwgTWFwIFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBNRE1BX1MxX0NVUlJfWF9DT1VOVAkweEZGQzAwRkYwCS8qIE1lbURNQSBTdHJlYW0gMSBTb3VyY2UgQ3VycmVudCBYIENvdW50IFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBNRE1BX1MxX0NVUlJfWV9DT1VOVAkweEZGQzAwRkY4CS8qIE1lbURNQSBTdHJlYW0gMSBTb3VyY2UgQ3VycmVudCBZIENvdW50IFJlZ2lzdGVyCQkJCQkqLworCisKKy8qIFBhcmFsbGVsIFBlcmlwaGVyYWwgSW50ZXJmYWNlICgweEZGQzAxMDAwIC0gMHhGRkMwMTBGRikJCQkJKi8KKyNkZWZpbmUgUFBJX0NPTlRST0wJCQkweEZGQzAxMDAwCS8qIFBQSSBDb250cm9sIFJlZ2lzdGVyCQkJKi8KKyNkZWZpbmUgUFBJX1NUQVRVUwkJCTB4RkZDMDEwMDQJLyogUFBJIFN0YXR1cyBSZWdpc3RlcgkJCSovCisjZGVmaW5lIFBQSV9DT1VOVAkJCTB4RkZDMDEwMDgJLyogUFBJIFRyYW5zZmVyIENvdW50IFJlZ2lzdGVyCSovCisjZGVmaW5lIFBQSV9ERUxBWQkJCTB4RkZDMDEwMEMJLyogUFBJIERlbGF5IENvdW50IFJlZ2lzdGVyCQkqLworI2RlZmluZSBQUElfRlJBTUUJCQkweEZGQzAxMDEwCS8qIFBQSSBGcmFtZSBMZW5ndGggUmVnaXN0ZXIJKi8KKworCisvKiBUd28tV2lyZSBJbnRlcmZhY2UJCSgweEZGQzAxNDAwIC0gMHhGRkMwMTRGRikJCQkJCQkJCSovCisjZGVmaW5lIFRXSTBfUkVHQkFTRQkJCTB4RkZDMDE0MDAKKyNkZWZpbmUgVFdJMF9DTEtESVYJCQkweEZGQzAxNDAwCS8qIFNlcmlhbCBDbG9jayBEaXZpZGVyIFJlZ2lzdGVyCQkJKi8KKyNkZWZpbmUgVFdJMF9DT05UUk9MCQkJMHhGRkMwMTQwNAkvKiBUV0kgQ29udHJvbCBSZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIFRXSTBfU0xBVkVfQ1RMCQkweEZGQzAxNDA4CS8qIFNsYXZlIE1vZGUgQ29udHJvbCBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBUV0kwX1NMQVZFX1NUQVQJCTB4RkZDMDE0MEMJLyogU2xhdmUgTW9kZSBTdGF0dXMgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgVFdJMF9TTEFWRV9BRERSCQkweEZGQzAxNDEwCS8qIFNsYXZlIE1vZGUgQWRkcmVzcyBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBUV0kwX01BU1RFUl9DVEwJCTB4RkZDMDE0MTQJLyogTWFzdGVyIE1vZGUgQ29udHJvbCBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBUV0kwX01BU1RFUl9TVEFUCQkweEZGQzAxNDE4CS8qIE1hc3RlciBNb2RlIFN0YXR1cyBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBUV0kwX01BU1RFUl9BRERSCQkweEZGQzAxNDFDCS8qIE1hc3RlciBNb2RlIEFkZHJlc3MgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgVFdJMF9JTlRfU1RBVAkJMHhGRkMwMTQyMAkvKiBUV0kgSW50ZXJydXB0IFN0YXR1cyBSZWdpc3RlcgkJCSovCisjZGVmaW5lIFRXSTBfSU5UX01BU0sJCTB4RkZDMDE0MjQJLyogVFdJIE1hc3RlciBJbnRlcnJ1cHQgTWFzayBSZWdpc3RlcgkJKi8KKyNkZWZpbmUgVFdJMF9GSUZPX0NUTAkJMHhGRkMwMTQyOAkvKiBGSUZPIENvbnRyb2wgUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIFRXSTBfRklGT19TVEFUCQkweEZGQzAxNDJDCS8qIEZJRk8gU3RhdHVzIFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgVFdJMF9YTVRfREFUQTgJCTB4RkZDMDE0ODAJLyogRklGTyBUcmFuc21pdCBEYXRhIFNpbmdsZSBCeXRlIFJlZ2lzdGVyCSovCisjZGVmaW5lIFRXSTBfWE1UX0RBVEExNgkJMHhGRkMwMTQ4NAkvKiBGSUZPIFRyYW5zbWl0IERhdGEgRG91YmxlIEJ5dGUgUmVnaXN0ZXIJKi8KKyNkZWZpbmUgVFdJMF9SQ1ZfREFUQTgJCTB4RkZDMDE0ODgJLyogRklGTyBSZWNlaXZlIERhdGEgU2luZ2xlIEJ5dGUgUmVnaXN0ZXIJKi8KKyNkZWZpbmUgVFdJMF9SQ1ZfREFUQTE2CQkweEZGQzAxNDhDCS8qIEZJRk8gUmVjZWl2ZSBEYXRhIERvdWJsZSBCeXRlIFJlZ2lzdGVyCSovCisKKworLyogR2VuZXJhbCBQdXJwb3NlIEkvTyBQb3J0IEcgKDB4RkZDMDE1MDAgLSAweEZGQzAxNUZGKQkJCQkJCQkJCQkJCSovCisjZGVmaW5lIFBPUlRHSU8JCQkJCTB4RkZDMDE1MDAJLyogUG9ydCBHIEkvTyBQaW4gU3RhdGUgU3BlY2lmeSBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBQT1JUR0lPX0NMRUFSCQkJMHhGRkMwMTUwNAkvKiBQb3J0IEcgSS9PIFBlcmlwaGVyYWwgSW50ZXJydXB0IENsZWFyIFJlZ2lzdGVyCQkqLworI2RlZmluZSBQT1JUR0lPX1NFVAkJCQkweEZGQzAxNTA4CS8qIFBvcnQgRyBJL08gUGVyaXBoZXJhbCBJbnRlcnJ1cHQgU2V0IFJlZ2lzdGVyCQkJKi8KKyNkZWZpbmUgUE9SVEdJT19UT0dHTEUJCQkweEZGQzAxNTBDCS8qIFBvcnQgRyBJL08gUGluIFN0YXRlIFRvZ2dsZSBSZWdpc3RlcgkJCQkJKi8KKyNkZWZpbmUgUE9SVEdJT19NQVNLQQkJCTB4RkZDMDE1MTAJLyogUG9ydCBHIEkvTyBNYXNrIFN0YXRlIFNwZWNpZnkgSW50ZXJydXB0IEEgUmVnaXN0ZXIJKi8KKyNkZWZpbmUgUE9SVEdJT19NQVNLQV9DTEVBUgkJMHhGRkMwMTUxNAkvKiBQb3J0IEcgSS9PIE1hc2sgRGlzYWJsZSBJbnRlcnJ1cHQgQSBSZWdpc3RlcgkJCSovCisjZGVmaW5lIFBPUlRHSU9fTUFTS0FfU0VUCQkweEZGQzAxNTE4CS8qIFBvcnQgRyBJL08gTWFzayBFbmFibGUgSW50ZXJydXB0IEEgUmVnaXN0ZXIJCQkqLworI2RlZmluZSBQT1JUR0lPX01BU0tBX1RPR0dMRQkweEZGQzAxNTFDCS8qIFBvcnQgRyBJL08gTWFzayBUb2dnbGUgRW5hYmxlIEludGVycnVwdCBBIFJlZ2lzdGVyCSovCisjZGVmaW5lIFBPUlRHSU9fTUFTS0IJCQkweEZGQzAxNTIwCS8qIFBvcnQgRyBJL08gTWFzayBTdGF0ZSBTcGVjaWZ5IEludGVycnVwdCBCIFJlZ2lzdGVyCSovCisjZGVmaW5lIFBPUlRHSU9fTUFTS0JfQ0xFQVIJCTB4RkZDMDE1MjQJLyogUG9ydCBHIEkvTyBNYXNrIERpc2FibGUgSW50ZXJydXB0IEIgUmVnaXN0ZXIJCQkqLworI2RlZmluZSBQT1JUR0lPX01BU0tCX1NFVAkJMHhGRkMwMTUyOAkvKiBQb3J0IEcgSS9PIE1hc2sgRW5hYmxlIEludGVycnVwdCBCIFJlZ2lzdGVyCQkJKi8KKyNkZWZpbmUgUE9SVEdJT19NQVNLQl9UT0dHTEUJMHhGRkMwMTUyQwkvKiBQb3J0IEcgSS9PIE1hc2sgVG9nZ2xlIEVuYWJsZSBJbnRlcnJ1cHQgQiBSZWdpc3RlcgkqLworI2RlZmluZSBQT1JUR0lPX0RJUgkJCQkweEZGQzAxNTMwCS8qIFBvcnQgRyBJL08gRGlyZWN0aW9uIFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgUE9SVEdJT19QT0xBUgkJCTB4RkZDMDE1MzQJLyogUG9ydCBHIEkvTyBTb3VyY2UgUG9sYXJpdHkgUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIFBPUlRHSU9fRURHRQkJCTB4RkZDMDE1MzgJLyogUG9ydCBHIEkvTyBTb3VyY2UgU2Vuc2l0aXZpdHkgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgUE9SVEdJT19CT1RICQkJMHhGRkMwMTUzQwkvKiBQb3J0IEcgSS9PIFNldCBvbiBCT1RIIEVkZ2VzIFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIFBPUlRHSU9fSU5FTgkJCTB4RkZDMDE1NDAJLyogUG9ydCBHIEkvTyBJbnB1dCBFbmFibGUgUmVnaXN0ZXIJCQkJCQkqLworCisKKy8qIEdlbmVyYWwgUHVycG9zZSBJL08gUG9ydCBIICgweEZGQzAxNzAwIC0gMHhGRkMwMTdGRikJCQkJCQkJCQkJCQkqLworI2RlZmluZSBQT1JUSElPCQkJCQkweEZGQzAxNzAwCS8qIFBvcnQgSCBJL08gUGluIFN0YXRlIFNwZWNpZnkgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgUE9SVEhJT19DTEVBUgkJCTB4RkZDMDE3MDQJLyogUG9ydCBIIEkvTyBQZXJpcGhlcmFsIEludGVycnVwdCBDbGVhciBSZWdpc3RlcgkJKi8KKyNkZWZpbmUgUE9SVEhJT19TRVQJCQkJMHhGRkMwMTcwOAkvKiBQb3J0IEggSS9PIFBlcmlwaGVyYWwgSW50ZXJydXB0IFNldCBSZWdpc3RlcgkJCSovCisjZGVmaW5lIFBPUlRISU9fVE9HR0xFCQkJMHhGRkMwMTcwQwkvKiBQb3J0IEggSS9PIFBpbiBTdGF0ZSBUb2dnbGUgUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIFBPUlRISU9fTUFTS0EJCQkweEZGQzAxNzEwCS8qIFBvcnQgSCBJL08gTWFzayBTdGF0ZSBTcGVjaWZ5IEludGVycnVwdCBBIFJlZ2lzdGVyCSovCisjZGVmaW5lIFBPUlRISU9fTUFTS0FfQ0xFQVIJCTB4RkZDMDE3MTQJLyogUG9ydCBIIEkvTyBNYXNrIERpc2FibGUgSW50ZXJydXB0IEEgUmVnaXN0ZXIJCQkqLworI2RlZmluZSBQT1JUSElPX01BU0tBX1NFVAkJMHhGRkMwMTcxOAkvKiBQb3J0IEggSS9PIE1hc2sgRW5hYmxlIEludGVycnVwdCBBIFJlZ2lzdGVyCQkJKi8KKyNkZWZpbmUgUE9SVEhJT19NQVNLQV9UT0dHTEUJMHhGRkMwMTcxQwkvKiBQb3J0IEggSS9PIE1hc2sgVG9nZ2xlIEVuYWJsZSBJbnRlcnJ1cHQgQSBSZWdpc3RlcgkqLworI2RlZmluZSBQT1JUSElPX01BU0tCCQkJMHhGRkMwMTcyMAkvKiBQb3J0IEggSS9PIE1hc2sgU3RhdGUgU3BlY2lmeSBJbnRlcnJ1cHQgQiBSZWdpc3RlcgkqLworI2RlZmluZSBQT1JUSElPX01BU0tCX0NMRUFSCQkweEZGQzAxNzI0CS8qIFBvcnQgSCBJL08gTWFzayBEaXNhYmxlIEludGVycnVwdCBCIFJlZ2lzdGVyCQkJKi8KKyNkZWZpbmUgUE9SVEhJT19NQVNLQl9TRVQJCTB4RkZDMDE3MjgJLyogUG9ydCBIIEkvTyBNYXNrIEVuYWJsZSBJbnRlcnJ1cHQgQiBSZWdpc3RlcgkJCSovCisjZGVmaW5lIFBPUlRISU9fTUFTS0JfVE9HR0xFCTB4RkZDMDE3MkMJLyogUG9ydCBIIEkvTyBNYXNrIFRvZ2dsZSBFbmFibGUgSW50ZXJydXB0IEIgUmVnaXN0ZXIJKi8KKyNkZWZpbmUgUE9SVEhJT19ESVIJCQkJMHhGRkMwMTczMAkvKiBQb3J0IEggSS9PIERpcmVjdGlvbiBSZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIFBPUlRISU9fUE9MQVIJCQkweEZGQzAxNzM0CS8qIFBvcnQgSCBJL08gU291cmNlIFBvbGFyaXR5IFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBQT1JUSElPX0VER0UJCQkweEZGQzAxNzM4CS8qIFBvcnQgSCBJL08gU291cmNlIFNlbnNpdGl2aXR5IFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIFBPUlRISU9fQk9USAkJCTB4RkZDMDE3M0MJLyogUG9ydCBIIEkvTyBTZXQgb24gQk9USCBFZGdlcyBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBQT1JUSElPX0lORU4JCQkweEZGQzAxNzQwCS8qIFBvcnQgSCBJL08gSW5wdXQgRW5hYmxlIFJlZ2lzdGVyCQkJCQkJKi8KKworCisvKiBVQVJUMSBDb250cm9sbGVyCQkoMHhGRkMwMjAwMCAtIDB4RkZDMDIwRkYpCQkJCQkJCQkqLworI2RlZmluZSBVQVJUMV9USFIJCQkweEZGQzAyMDAwCS8qIFRyYW5zbWl0IEhvbGRpbmcgcmVnaXN0ZXIJCQkqLworI2RlZmluZSBVQVJUMV9SQlIJCQkweEZGQzAyMDAwCS8qIFJlY2VpdmUgQnVmZmVyIHJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIFVBUlQxX0RMTAkJCTB4RkZDMDIwMDAJLyogRGl2aXNvciBMYXRjaCAoTG93LUJ5dGUpCQkJCSovCisjZGVmaW5lIFVBUlQxX0lFUgkJCTB4RkZDMDIwMDQJLyogSW50ZXJydXB0IEVuYWJsZSBSZWdpc3RlcgkJCSovCisjZGVmaW5lIFVBUlQxX0RMSAkJCTB4RkZDMDIwMDQJLyogRGl2aXNvciBMYXRjaCAoSGlnaC1CeXRlKQkJCSovCisjZGVmaW5lIFVBUlQxX0lJUgkJCTB4RkZDMDIwMDgJLyogSW50ZXJydXB0IElkZW50aWZpY2F0aW9uIFJlZ2lzdGVyCSovCisjZGVmaW5lIFVBUlQxX0xDUgkJCTB4RkZDMDIwMEMJLyogTGluZSBDb250cm9sIFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIFVBUlQxX01DUgkJCTB4RkZDMDIwMTAJLyogTW9kZW0gQ29udHJvbCBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBVQVJUMV9MU1IJCQkweEZGQzAyMDE0CS8qIExpbmUgU3RhdHVzIFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBVQVJUMV9NU1IJCQkweEZGQzAyMDE4CS8qIE1vZGVtIFN0YXR1cyBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBVQVJUMV9TQ1IJCQkweEZGQzAyMDFDCS8qIFNDUiBTY3JhdGNoIFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBVQVJUMV9HQ1RMCQkJMHhGRkMwMjAyNAkvKiBHbG9iYWwgQ29udHJvbCBSZWdpc3RlcgkJCQkqLworCisKKy8qIE9taXQgQ0FOIHJlZ2lzdGVyIHNldHMgZnJvbSB0aGUgZGVmQkY1MzQuaCAoQ0FOIGlzIG5vdCBpbiB0aGUgQURTUC1CRjUyeCBwcm9jZXNzb3IpICovCisKKy8qIFBpbiBDb250cm9sIFJlZ2lzdGVycwkoMHhGRkMwMzIwMCAtIDB4RkZDMDMyRkYpCQkJCQkJCQkJCQkqLworI2RlZmluZSBQT1JURl9GRVIJCQkweEZGQzAzMjAwCS8qIFBvcnQgRiBGdW5jdGlvbiBFbmFibGUgUmVnaXN0ZXIgKEFsdGVybmF0ZS9GbGFnKikJKi8KKyNkZWZpbmUgUE9SVEdfRkVSCQkJMHhGRkMwMzIwNAkvKiBQb3J0IEcgRnVuY3Rpb24gRW5hYmxlIFJlZ2lzdGVyIChBbHRlcm5hdGUvRmxhZyopCSovCisjZGVmaW5lIFBPUlRIX0ZFUgkJCTB4RkZDMDMyMDgJLyogUG9ydCBIIEZ1bmN0aW9uIEVuYWJsZSBSZWdpc3RlciAoQWx0ZXJuYXRlL0ZsYWcqKQkqLworI2RlZmluZSBCRklOX1BPUlRfTVVYCQkJMHhGRkMwMzIwQwkvKiBQb3J0IE11bHRpcGxleGVyIENvbnRyb2wgUmVnaXN0ZXIJCQkJCSovCisKKworLyogSGFuZHNoYWtlIE1ETUEgUmVnaXN0ZXJzCSgweEZGQzAzMzAwIC0gMHhGRkMwMzNGRikJCQkJCQkJCQkJKi8KKyNkZWZpbmUgSE1ETUEwX0NPTlRST0wJCTB4RkZDMDMzMDAJLyogSGFuZHNoYWtlIE1ETUEwIENvbnRyb2wgUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIEhNRE1BMF9FQ0lOSVQJCTB4RkZDMDMzMDQJLyogSE1ETUEwIEluaXRpYWwgRWRnZSBDb3VudCBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBITURNQTBfQkNJTklUCQkweEZGQzAzMzA4CS8qIEhNRE1BMCBJbml0aWFsIEJsb2NrIENvdW50IFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIEhNRE1BMF9FQ1VSR0VOVAkJMHhGRkMwMzMwQwkvKiBITURNQTAgVXJnZW50IEVkZ2UgQ291bnQgVGhyZXNob2xkIFJlZ2lzdGVyCQkqLworI2RlZmluZSBITURNQTBfRUNPVkVSRkxPVwkweEZGQzAzMzEwCS8qIEhNRE1BMCBFZGdlIENvdW50IE92ZXJmbG93IEludGVycnVwdCBSZWdpc3RlcgkqLworI2RlZmluZSBITURNQTBfRUNPVU5UCQkweEZGQzAzMzE0CS8qIEhNRE1BMCBDdXJyZW50IEVkZ2UgQ291bnQgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgSE1ETUEwX0JDT1VOVAkJMHhGRkMwMzMxOAkvKiBITURNQTAgQ3VycmVudCBCbG9jayBDb3VudCBSZWdpc3RlcgkJCQkqLworCisjZGVmaW5lIEhNRE1BMV9DT05UUk9MCQkweEZGQzAzMzQwCS8qIEhhbmRzaGFrZSBNRE1BMSBDb250cm9sIFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBITURNQTFfRUNJTklUCQkweEZGQzAzMzQ0CS8qIEhNRE1BMSBJbml0aWFsIEVkZ2UgQ291bnQgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgSE1ETUExX0JDSU5JVAkJMHhGRkMwMzM0OAkvKiBITURNQTEgSW5pdGlhbCBCbG9jayBDb3VudCBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBITURNQTFfRUNVUkdFTlQJCTB4RkZDMDMzNEMJLyogSE1ETUExIFVyZ2VudCBFZGdlIENvdW50IFRocmVzaG9sZCBSZWdpc3RlcgkJKi8KKyNkZWZpbmUgSE1ETUExX0VDT1ZFUkZMT1cJMHhGRkMwMzM1MAkvKiBITURNQTEgRWRnZSBDb3VudCBPdmVyZmxvdyBJbnRlcnJ1cHQgUmVnaXN0ZXIJKi8KKyNkZWZpbmUgSE1ETUExX0VDT1VOVAkJMHhGRkMwMzM1NAkvKiBITURNQTEgQ3VycmVudCBFZGdlIENvdW50IFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIEhNRE1BMV9CQ09VTlQJCTB4RkZDMDMzNTgJLyogSE1ETUExIEN1cnJlbnQgQmxvY2sgQ291bnQgUmVnaXN0ZXIJCQkJKi8KKworLyogR1BJTyBQSU4gbXV4ICgweEZGQzAzMjEwIC0gT3hGRkMwMzI4OCkgKi8KKyNkZWZpbmUgUE9SVEZfTVVYICAgICAgICAgICAgICAgMHhGRkMwMzIxMCAgICAgIC8qIFBvcnQgRiBtdXggY29udHJvbCAqLworI2RlZmluZSBQT1JUR19NVVggICAgICAgICAgICAgICAweEZGQzAzMjE0ICAgICAgLyogUG9ydCBHIG11eCBjb250cm9sICovCisjZGVmaW5lIFBPUlRIX01VWCAgICAgICAgICAgICAgIDB4RkZDMDMyMTggICAgICAvKiBQb3J0IEggbXV4IGNvbnRyb2wgKi8KKyNkZWZpbmUgUE9SVEZfRFJJVkUgICAgICAgICAgICAgMHhGRkMwMzIyMCAgICAgIC8qIFBvcnQgRiBkcml2ZSBzdHJlbmd0aCBjb250cm9sICovCisjZGVmaW5lIFBPUlRHX0RSSVZFICAgICAgICAgICAgIDB4RkZDMDMyMjQgICAgICAvKiBQb3J0IEcgZHJpdmUgc3RyZW5ndGggY29udHJvbCAqLworI2RlZmluZSBQT1JUSF9EUklWRSAgICAgICAgICAgICAweEZGQzAzMjI4ICAgICAgLyogUG9ydCBIIGRyaXZlIHN0cmVuZ3RoIGNvbnRyb2wgKi8KKyNkZWZpbmUgUE9SVEZfU0xFVyAgICAgICAgICAgICAgMHhGRkMwMzIzMCAgICAgIC8qIFBvcnQgRiBzbGV3IGNvbnRyb2wgKi8KKyNkZWZpbmUgUE9SVEdfU0xFVyAgICAgICAgICAgICAgMHhGRkMwMzIzNCAgICAgIC8qIFBvcnQgRyBzbGV3IGNvbnRyb2wgKi8KKyNkZWZpbmUgUE9SVEhfU0xFVyAgICAgICAgICAgICAgMHhGRkMwMzIzOCAgICAgIC8qIFBvcnQgSCBzbGV3IGNvbnRyb2wgKi8KKyNkZWZpbmUgUE9SVEZfSFlTVEVSSVNJUyAgICAgICAgMHhGRkMwMzI0MCAgICAgIC8qIFBvcnQgRiBTY2htaXR0IHRyaWdnZXIgY29udHJvbCAqLworI2RlZmluZSBQT1JUR19IWVNURVJJU0lTICAgICAgICAweEZGQzAzMjQ0ICAgICAgLyogUG9ydCBHIFNjaG1pdHQgdHJpZ2dlciBjb250cm9sICovCisjZGVmaW5lIFBPUlRIX0hZU1RFUklTSVMgICAgICAgIDB4RkZDMDMyNDggICAgICAvKiBQb3J0IEggU2NobWl0dCB0cmlnZ2VyIGNvbnRyb2wgKi8KKyNkZWZpbmUgTUlTQ1BPUlRfRFJJVkUgICAgICAgICAgMHhGRkMwMzI4MCAgICAgIC8qIE1pc2MgUG9ydCBkcml2ZSBzdHJlbmd0aCBjb250cm9sICovCisjZGVmaW5lIE1JU0NQT1JUX1NMRVcgICAgICAgICAgIDB4RkZDMDMyODQgICAgICAvKiBNaXNjIFBvcnQgc2xldyBjb250cm9sICovCisjZGVmaW5lIE1JU0NQT1JUX0hZU1RFUklTSVMgICAgIDB4RkZDMDMyODggICAgICAvKiBNaXNjIFBvcnQgU2NobWl0dCB0cmlnZ2VyIGNvbnRyb2wgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqIFN5c3RlbSBNTVIgUmVnaXN0ZXIgQml0cyBBbmQgTWFjcm9zCisqKgorKiogRGlzY2xhaW1lcjoJQWxsIG1hY3JvcyBhcmUgaW50ZW5kZWQgdG8gbWFrZSBDIGFuZCBBc3NlbWJseSBjb2RlIG1vcmUgcmVhZGFibGUuCisqKgkJCQlVc2UgdGhlc2UgbWFjcm9zIGNhcmVmdWxseSwgYXMgYW55IHRoYXQgZG8gbGVmdCBzaGlmdHMgZm9yIGZpZWxkCisqKgkJCQlkZXBvc2l0aW5nIHdpbGwgcmVzdWx0IGluIHRoZSBsb3dlciBvcmRlciBiaXRzIGJlaW5nIGRlc3Ryb3llZC4gIEFueQorKioJCQkJbWFjcm8gdGhhdCBzaGlmdHMgbGVmdCB0byBwcm9wZXJseSBwb3NpdGlvbiB0aGUgYml0LWZpZWxkIHNob3VsZCBiZQorKioJCQkJdXNlZCBhcyBwYXJ0IG9mIGFuIE9SIHRvIGluaXRpYWxpemUgYSByZWdpc3RlciBhbmQgTk9UIGFzIGEgZHluYW1pYworKioJCQkJbW9kaWZpZXIgVU5MRVNTIHRoZSBsb3dlciBvcmRlciBiaXRzIGFyZSBzYXZlZCBhbmQgT1JlZCBiYWNrIGluIHdoZW4KKyoqCQkJCXRoZSBtYWNybyBpcyB1c2VkLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogQ0hJUElEIE1hc2tzICovCisjZGVmaW5lIENISVBJRF9WRVJTSU9OICAgICAgICAgMHhGMDAwMDAwMAorI2RlZmluZSBDSElQSURfRkFNSUxZICAgICAgICAgIDB4MEZGRkYwMDAKKyNkZWZpbmUgQ0hJUElEX01BTlVGQUNUVVJFICAgICAweDAwMDAwRkZFCisKKy8qIFNXUlNUIE1hc2tzCQkJCQkJCQkJCQkJCQkJCQkJKi8KKyNkZWZpbmUgU1lTVEVNX1JFU0VUCQkweDAwMDcJLyogSW5pdGlhdGVzIEEgU3lzdGVtIFNvZnR3YXJlIFJlc2V0CQkJKi8KKyNkZWZpbmUJRE9VQkxFX0ZBVUxUCQkweDAwMDgJLyogQ29yZSBEb3VibGUgRmF1bHQgQ2F1c2VzIFJlc2V0CQkJCSovCisjZGVmaW5lIFJFU0VUX0RPVUJMRQkJMHgyMDAwCS8qIFNXIFJlc2V0IEdlbmVyYXRlZCBCeSBDb3JlIERvdWJsZS1GYXVsdAkJKi8KKyNkZWZpbmUgUkVTRVRfV0RPRwkJCTB4NDAwMAkvKiBTVyBSZXNldCBHZW5lcmF0ZWQgQnkgV2F0Y2hkb2cgVGltZXIJCQkqLworI2RlZmluZSBSRVNFVF9TT0ZUV0FSRQkJMHg4MDAwCS8qIFNXIFJlc2V0IE9jY3VycmVkIFNpbmNlIExhc3QgUmVhZCBPZiBTV1JTVAkqLworCisvKiBTWVNDUiBNYXNrcwkJCQkJCQkJCQkJCQkJCQkJCQkJKi8KKyNkZWZpbmUgQk1PREUJCQkJMHgwMDA3CS8qIEJvb3QgTW9kZSAtIExhdGNoZWQgRHVyaW5nIEhXIFJlc2V0IEZyb20gTW9kZSBQaW5zCSovCisjZGVmaW5lCU5PQk9PVAkJCQkweDAwMTAJLyogRXhlY3V0ZSBGcm9tIEwxIG9yIEFTWU5DIEJhbmsgMCBXaGVuIEJNT0RFID0gMAkJKi8KKworCisvKiAqKioqKioqKioqKioqICBTWVNURU0gSU5URVJSVVBUIENPTlRST0xMRVIgTUFTS1MgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFBlcmlwaGVyYWwgTWFza3MgRm9yIFNJQ19JU1IsIFNJQ19JV1IsIFNJQ19JTUFTSwkJCQkJCQkJCQkqLworCisjaWYgMAorI2RlZmluZSBJUlFfUExMX1dBS0VVUAkweDAwMDAwMDAxCS8qIFBMTCBXYWtldXAgSW50ZXJydXB0CQkJIAkJCQkJKi8KKworI2RlZmluZSBJUlFfRVJST1IxICAgICAgMHgwMDAwMDAwMiAgLyogRXJyb3IgSW50ZXJydXB0IChETUEsIERNQVJ4IEJsb2NrLCBETUFSeCBPdmVyZmxvdykgKi8KKyNkZWZpbmUgSVJRX0VSUk9SMiAgICAgIDB4MDAwMDAwMDQgIC8qIEVycm9yIEludGVycnVwdCAoQ0FOLCBFdGhlcm5ldCwgU1BPUlR4LCBQUEksIFNQSSwgVUFSVHgpICovCisjZGVmaW5lIElSUV9SVEMJCQkweDAwMDAwMDA4CS8qIFJlYWwgVGltZSBDbG9jayBJbnRlcnJ1cHQgCQkJCQkJKi8KKyNkZWZpbmUgSVJRX0RNQTAJCTB4MDAwMDAwMTAJLyogRE1BIENoYW5uZWwgMCAoUFBJKSBJbnRlcnJ1cHQgCQkJCQkqLworI2RlZmluZSBJUlFfRE1BMwkJMHgwMDAwMDAyMAkvKiBETUEgQ2hhbm5lbCAzIChTUE9SVDAgUlgpIEludGVycnVwdCAJCQkJKi8KKyNkZWZpbmUgSVJRX0RNQTQJCTB4MDAwMDAwNDAJLyogRE1BIENoYW5uZWwgNCAoU1BPUlQwIFRYKSBJbnRlcnJ1cHQgCQkJCSovCisjZGVmaW5lIElSUV9ETUE1CQkweDAwMDAwMDgwCS8qIERNQSBDaGFubmVsIDUgKFNQT1JUMSBSWCkgSW50ZXJydXB0IAkJCQkqLworCisjZGVmaW5lIElSUV9ETUE2CQkweDAwMDAwMTAwCS8qIERNQSBDaGFubmVsIDYgKFNQT1JUMSBUWCkgSW50ZXJydXB0IAkJIAkJKi8KKyNkZWZpbmUgSVJRX1RXSQkJCTB4MDAwMDAyMDAJLyogVFdJIEludGVycnVwdAkJCQkJCQkJCSovCisjZGVmaW5lIElSUV9ETUE3CQkweDAwMDAwNDAwCS8qIERNQSBDaGFubmVsIDcgKFNQSSkgSW50ZXJydXB0IAkJCQkJKi8KKyNkZWZpbmUgSVJRX0RNQTgJCTB4MDAwMDA4MDAJLyogRE1BIENoYW5uZWwgOCAoVUFSVDAgUlgpIEludGVycnVwdCAJCQkJKi8KKyNkZWZpbmUgSVJRX0RNQTkJCTB4MDAwMDEwMDAJLyogRE1BIENoYW5uZWwgOSAoVUFSVDAgVFgpIEludGVycnVwdCAJCQkJKi8KKyNkZWZpbmUgSVJRX0RNQTEwCQkweDAwMDAyMDAwCS8qIERNQSBDaGFubmVsIDEwIChVQVJUMSBSWCkgSW50ZXJydXB0IAkJCQkqLworI2RlZmluZSBJUlFfRE1BMTEJCTB4MDAwMDQwMDAJLyogRE1BIENoYW5uZWwgMTEgKFVBUlQxIFRYKSBJbnRlcnJ1cHQgCQkJCSovCisjZGVmaW5lIElSUV9DQU5fUlgJCTB4MDAwMDgwMDAJLyogQ0FOIFJlY2VpdmUgSW50ZXJydXB0IAkJCQkJCQkqLworCisjZGVmaW5lIElSUV9DQU5fVFgJCTB4MDAwMTAwMDAJLyogQ0FOIFRyYW5zbWl0IEludGVycnVwdCAgCQkJCQkJCSovCisjZGVmaW5lIElSUV9ETUExCQkweDAwMDIwMDAwCS8qIERNQSBDaGFubmVsIDEgKEV0aGVybmV0IFJYKSBJbnRlcnJ1cHQgCQkJKi8KKyNkZWZpbmUgSVJRX1BGQV9QT1JUSAkweDAwMDIwMDAwCS8qIFBGIFBvcnQgSCAoUEY0NzozMikgSW50ZXJydXB0IEEgCQkJCQkqLworI2RlZmluZSBJUlFfRE1BMgkJMHgwMDA0MDAwMAkvKiBETUEgQ2hhbm5lbCAyIChFdGhlcm5ldCBUWCkgSW50ZXJydXB0IAkJCSovCisjZGVmaW5lIElSUV9QRkJfUE9SVEgJMHgwMDA0MDAwMAkvKiBQRiBQb3J0IEggKFBGNDc6MzIpIEludGVycnVwdCBCIAkJCQkJKi8KKyNkZWZpbmUgSVJRX1RJTUVSMAkJMHgwMDA4MDAwMAkvKiBUaW1lciAwIEludGVycnVwdAkJCQkJCQkJKi8KKyNkZWZpbmUgSVJRX1RJTUVSMQkJMHgwMDEwMDAwMAkvKiBUaW1lciAxIEludGVycnVwdCAJCQkJCQkJCSovCisjZGVmaW5lIElSUV9USU1FUjIJCTB4MDAyMDAwMDAJLyogVGltZXIgMiBJbnRlcnJ1cHQgCQkJCQkJCQkqLworI2RlZmluZSBJUlFfVElNRVIzCQkweDAwNDAwMDAwCS8qIFRpbWVyIDMgSW50ZXJydXB0IAkJCQkJCQkJKi8KKyNkZWZpbmUgSVJRX1RJTUVSNAkJMHgwMDgwMDAwMAkvKiBUaW1lciA0IEludGVycnVwdCAJCQkJCQkJCSovCisKKyNkZWZpbmUgSVJRX1RJTUVSNQkJMHgwMTAwMDAwMAkvKiBUaW1lciA1IEludGVycnVwdCAJCQkJCQkJCSovCisjZGVmaW5lIElSUV9USU1FUjYJCTB4MDIwMDAwMDAJLyogVGltZXIgNiBJbnRlcnJ1cHQgCQkJCQkJCQkqLworI2RlZmluZSBJUlFfVElNRVI3CQkweDA0MDAwMDAwCS8qIFRpbWVyIDcgSW50ZXJydXB0IAkJCQkJCQkJKi8KKyNkZWZpbmUgSVJRX1BGQV9QT1JURkcJMHgwODAwMDAwMAkvKiBQRiBQb3J0cyBGJkcgKFBGMzE6MCkgSW50ZXJydXB0IEEgCQkJCSovCisjZGVmaW5lIElSUV9QRkJfUE9SVEYJMHg4MDAwMDAwMAkvKiBQRiBQb3J0IEYgKFBGMTU6MCkgSW50ZXJydXB0IEIgCQkJCQkqLworI2RlZmluZSBJUlFfRE1BMTIJCTB4MjAwMDAwMDAJLyogRE1BIENoYW5uZWxzIDEyIChNRE1BMSBTb3VyY2UpIFJYIEludGVycnVwdCAJCSovCisjZGVmaW5lIElSUV9ETUExMwkJMHgyMDAwMDAwMAkvKiBETUEgQ2hhbm5lbHMgMTMgKE1ETUExIERlc3RpbmF0aW9uKSBUWCBJbnRlcnJ1cHQgKi8KKyNkZWZpbmUgSVJRX0RNQTE0CQkweDQwMDAwMDAwCS8qIERNQSBDaGFubmVscyAxNCAoTURNQTAgU291cmNlKSBSWCBJbnRlcnJ1cHQgCQkqLworI2RlZmluZSBJUlFfRE1BMTUJCTB4NDAwMDAwMDAJLyogRE1BIENoYW5uZWxzIDE1IChNRE1BMCBEZXN0aW5hdGlvbikgVFggSW50ZXJydXB0ICovCisjZGVmaW5lIElSUV9XRE9HCQkweDgwMDAwMDAwCS8qIFNvZnR3YXJlIFdhdGNoZG9nIFRpbWVyIEludGVycnVwdCAJCQkJKi8KKyNkZWZpbmUgSVJRX1BGQl9QT1JURwkweDEwMDAwMDAwCS8qIFBGIFBvcnQgRyAoUEYzMToxNikgSW50ZXJydXB0IEIgCQkJCQkqLworI2VuZGlmCisKKy8qIFNJQ19JQVIwIE1hY3JvcwkJCQkJCQkJCQkJCQkJCSovCisjZGVmaW5lIFAwX0lWRyh4KQkJKCgoeCkmMHhGKS03KQkJCS8qIFBlcmlwaGVyYWwgIzAgYXNzaWduZWQgSVZHICN4IAkqLworI2RlZmluZSBQMV9JVkcoeCkJCSgoKHgpJjB4RiktNykgPDwgMHg0CS8qIFBlcmlwaGVyYWwgIzEgYXNzaWduZWQgSVZHICN4IAkqLworI2RlZmluZSBQMl9JVkcoeCkJCSgoKHgpJjB4RiktNykgPDwgMHg4CS8qIFBlcmlwaGVyYWwgIzIgYXNzaWduZWQgSVZHICN4IAkqLworI2RlZmluZSBQM19JVkcoeCkJCSgoKHgpJjB4RiktNykgPDwgMHhDCS8qIFBlcmlwaGVyYWwgIzMgYXNzaWduZWQgSVZHICN4CSovCisjZGVmaW5lIFA0X0lWRyh4KQkJKCgoeCkmMHhGKS03KSA8PCAweDEwCS8qIFBlcmlwaGVyYWwgIzQgYXNzaWduZWQgSVZHICN4CSovCisjZGVmaW5lIFA1X0lWRyh4KQkJKCgoeCkmMHhGKS03KSA8PCAweDE0CS8qIFBlcmlwaGVyYWwgIzUgYXNzaWduZWQgSVZHICN4CSovCisjZGVmaW5lIFA2X0lWRyh4KQkJKCgoeCkmMHhGKS03KSA8PCAweDE4CS8qIFBlcmlwaGVyYWwgIzYgYXNzaWduZWQgSVZHICN4CSovCisjZGVmaW5lIFA3X0lWRyh4KQkJKCgoeCkmMHhGKS03KSA8PCAweDFDCS8qIFBlcmlwaGVyYWwgIzcgYXNzaWduZWQgSVZHICN4CSovCisKKy8qIFNJQ19JQVIxIE1hY3JvcwkJCQkJCQkJCQkJCQkJCSovCisjZGVmaW5lIFA4X0lWRyh4KQkJKCgoeCkmMHhGKS03KQkJCS8qIFBlcmlwaGVyYWwgIzggYXNzaWduZWQgSVZHICN4IAkqLworI2RlZmluZSBQOV9JVkcoeCkJCSgoKHgpJjB4RiktNykgPDwgMHg0CS8qIFBlcmlwaGVyYWwgIzkgYXNzaWduZWQgSVZHICN4IAkqLworI2RlZmluZSBQMTBfSVZHKHgpCQkoKCh4KSYweEYpLTcpIDw8IDB4OAkvKiBQZXJpcGhlcmFsICMxMCBhc3NpZ25lZCBJVkcgI3gJKi8KKyNkZWZpbmUgUDExX0lWRyh4KQkJKCgoeCkmMHhGKS03KSA8PCAweEMJLyogUGVyaXBoZXJhbCAjMTEgYXNzaWduZWQgSVZHICN4IAkqLworI2RlZmluZSBQMTJfSVZHKHgpCQkoKCh4KSYweEYpLTcpIDw8IDB4MTAJLyogUGVyaXBoZXJhbCAjMTIgYXNzaWduZWQgSVZHICN4CSovCisjZGVmaW5lIFAxM19JVkcoeCkJCSgoKHgpJjB4RiktNykgPDwgMHgxNAkvKiBQZXJpcGhlcmFsICMxMyBhc3NpZ25lZCBJVkcgI3gJKi8KKyNkZWZpbmUgUDE0X0lWRyh4KQkJKCgoeCkmMHhGKS03KSA8PCAweDE4CS8qIFBlcmlwaGVyYWwgIzE0IGFzc2lnbmVkIElWRyAjeAkqLworI2RlZmluZSBQMTVfSVZHKHgpCQkoKCh4KSYweEYpLTcpIDw8IDB4MUMJLyogUGVyaXBoZXJhbCAjMTUgYXNzaWduZWQgSVZHICN4CSovCisKKy8qIFNJQ19JQVIyIE1hY3JvcwkJCQkJCQkJCQkJCQkJCSovCisjZGVmaW5lIFAxNl9JVkcoeCkJCSgoKHgpJjB4RiktNykJCQkvKiBQZXJpcGhlcmFsICMxNiBhc3NpZ25lZCBJVkcgI3gJKi8KKyNkZWZpbmUgUDE3X0lWRyh4KQkJKCgoeCkmMHhGKS03KSA8PCAweDQJLyogUGVyaXBoZXJhbCAjMTcgYXNzaWduZWQgSVZHICN4CSovCisjZGVmaW5lIFAxOF9JVkcoeCkJCSgoKHgpJjB4RiktNykgPDwgMHg4CS8qIFBlcmlwaGVyYWwgIzE4IGFzc2lnbmVkIElWRyAjeAkqLworI2RlZmluZSBQMTlfSVZHKHgpCQkoKCh4KSYweEYpLTcpIDw8IDB4QwkvKiBQZXJpcGhlcmFsICMxOSBhc3NpZ25lZCBJVkcgI3gJKi8KKyNkZWZpbmUgUDIwX0lWRyh4KQkJKCgoeCkmMHhGKS03KSA8PCAweDEwCS8qIFBlcmlwaGVyYWwgIzIwIGFzc2lnbmVkIElWRyAjeAkqLworI2RlZmluZSBQMjFfSVZHKHgpCQkoKCh4KSYweEYpLTcpIDw8IDB4MTQJLyogUGVyaXBoZXJhbCAjMjEgYXNzaWduZWQgSVZHICN4CSovCisjZGVmaW5lIFAyMl9JVkcoeCkJCSgoKHgpJjB4RiktNykgPDwgMHgxOAkvKiBQZXJpcGhlcmFsICMyMiBhc3NpZ25lZCBJVkcgI3gJKi8KKyNkZWZpbmUgUDIzX0lWRyh4KQkJKCgoeCkmMHhGKS03KSA8PCAweDFDCS8qIFBlcmlwaGVyYWwgIzIzIGFzc2lnbmVkIElWRyAjeAkqLworCisvKiBTSUNfSUFSMyBNYWNyb3MJCQkJCQkJCQkJCQkJCQkqLworI2RlZmluZSBQMjRfSVZHKHgpCQkoKCh4KSYweEYpLTcpCQkJLyogUGVyaXBoZXJhbCAjMjQgYXNzaWduZWQgSVZHICN4CSovCisjZGVmaW5lIFAyNV9JVkcoeCkJCSgoKHgpJjB4RiktNykgPDwgMHg0CS8qIFBlcmlwaGVyYWwgIzI1IGFzc2lnbmVkIElWRyAjeAkqLworI2RlZmluZSBQMjZfSVZHKHgpCQkoKCh4KSYweEYpLTcpIDw8IDB4OAkvKiBQZXJpcGhlcmFsICMyNiBhc3NpZ25lZCBJVkcgI3gJKi8KKyNkZWZpbmUgUDI3X0lWRyh4KQkJKCgoeCkmMHhGKS03KSA8PCAweEMJLyogUGVyaXBoZXJhbCAjMjcgYXNzaWduZWQgSVZHICN4CSovCisjZGVmaW5lIFAyOF9JVkcoeCkJCSgoKHgpJjB4RiktNykgPDwgMHgxMAkvKiBQZXJpcGhlcmFsICMyOCBhc3NpZ25lZCBJVkcgI3gJKi8KKyNkZWZpbmUgUDI5X0lWRyh4KQkJKCgoeCkmMHhGKS03KSA8PCAweDE0CS8qIFBlcmlwaGVyYWwgIzI5IGFzc2lnbmVkIElWRyAjeAkqLworI2RlZmluZSBQMzBfSVZHKHgpCQkoKCh4KSYweEYpLTcpIDw8IDB4MTgJLyogUGVyaXBoZXJhbCAjMzAgYXNzaWduZWQgSVZHICN4CSovCisjZGVmaW5lIFAzMV9JVkcoeCkJCSgoKHgpJjB4RiktNykgPDwgMHgxQwkvKiBQZXJpcGhlcmFsICMzMSBhc3NpZ25lZCBJVkcgI3gJKi8KKworCisvKiBTSUNfSU1BU0sgTWFza3MJCQkJCQkJCQkJCQkJCQkJCQkqLworI2RlZmluZSBTSUNfVU5NQVNLX0FMTAkweDAwMDAwMDAwCQkJCQkvKiBVbm1hc2sgYWxsIHBlcmlwaGVyYWwgaW50ZXJydXB0cwkqLworI2RlZmluZSBTSUNfTUFTS19BTEwJMHhGRkZGRkZGRgkJCQkJLyogTWFzayBhbGwgcGVyaXBoZXJhbCBpbnRlcnJ1cHRzCSovCisjZGVmaW5lIFNJQ19NQVNLKHgpCQkoMSA8PCAoKHgpJjB4MUYpKQkJCQkJLyogTWFzayBQZXJpcGhlcmFsICN4IGludGVycnVwdAkJKi8KKyNkZWZpbmUgU0lDX1VOTUFTSyh4KQkoMHhGRkZGRkZGRiBeICgxIDw8ICgoeCkmMHgxRikpKQkvKiBVbm1hc2sgUGVyaXBoZXJhbCAjeCBpbnRlcnJ1cHQJKi8KKworLyogU0lDX0lXUiBNYXNrcwkJCQkJCQkJCQkJCQkJCQkJCSovCisjZGVmaW5lIElXUl9ESVNBQkxFX0FMTAkweDAwMDAwMDAwCQkJCQkvKiBXYWtldXAgRGlzYWJsZSBhbGwgcGVyaXBoZXJhbHMJKi8KKyNkZWZpbmUgSVdSX0VOQUJMRV9BTEwJMHhGRkZGRkZGRgkJCQkJLyogV2FrZXVwIEVuYWJsZSBhbGwgcGVyaXBoZXJhbHMJKi8KKyNkZWZpbmUgSVdSX0VOQUJMRSh4KQkoMSA8PCAoKHgpJjB4MUYpKQkJCQkJLyogV2FrZXVwIEVuYWJsZSBQZXJpcGhlcmFsICN4CQkqLworI2RlZmluZSBJV1JfRElTQUJMRSh4KQkoMHhGRkZGRkZGRiBeICgxIDw8ICgoeCkmMHgxRikpKSAJLyogV2FrZXVwIERpc2FibGUgUGVyaXBoZXJhbCAjeAkJKi8KKworLyogICoqKioqKioqKioqKioqKiogIEdFTkVSQUwgUFVSUE9TRSBUSU1FUiBNQVNLUyAgKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFRJTUVSX0VOQUJMRSBNYXNrcwkJCQkJCQkJCQkJCQkqLworI2RlZmluZSBUSU1FTjAJCQkweDAwMDEJCS8qIEVuYWJsZSBUaW1lciAwCQkJCQkqLworI2RlZmluZSBUSU1FTjEJCQkweDAwMDIJCS8qIEVuYWJsZSBUaW1lciAxCQkJCQkqLworI2RlZmluZSBUSU1FTjIJCQkweDAwMDQJCS8qIEVuYWJsZSBUaW1lciAyCQkJCQkqLworI2RlZmluZSBUSU1FTjMJCQkweDAwMDgJCS8qIEVuYWJsZSBUaW1lciAzCQkJCQkqLworI2RlZmluZSBUSU1FTjQJCQkweDAwMTAJCS8qIEVuYWJsZSBUaW1lciA0CQkJCQkqLworI2RlZmluZSBUSU1FTjUJCQkweDAwMjAJCS8qIEVuYWJsZSBUaW1lciA1CQkJCQkqLworI2RlZmluZSBUSU1FTjYJCQkweDAwNDAJCS8qIEVuYWJsZSBUaW1lciA2CQkJCQkqLworI2RlZmluZSBUSU1FTjcJCQkweDAwODAJCS8qIEVuYWJsZSBUaW1lciA3CQkJCQkqLworCisvKiBUSU1FUl9ESVNBQkxFIE1hc2tzCQkJCQkJCQkJCQkJCSovCisjZGVmaW5lIFRJTURJUzAJCQlUSU1FTjAJCS8qIERpc2FibGUgVGltZXIgMAkJCQkJKi8KKyNkZWZpbmUgVElNRElTMQkJCVRJTUVOMQkJLyogRGlzYWJsZSBUaW1lciAxCQkJCQkqLworI2RlZmluZSBUSU1ESVMyCQkJVElNRU4yCQkvKiBEaXNhYmxlIFRpbWVyIDIJCQkJCSovCisjZGVmaW5lIFRJTURJUzMJCQlUSU1FTjMJCS8qIERpc2FibGUgVGltZXIgMwkJCQkJKi8KKyNkZWZpbmUgVElNRElTNAkJCVRJTUVONAkJLyogRGlzYWJsZSBUaW1lciA0CQkJCQkqLworI2RlZmluZSBUSU1ESVM1CQkJVElNRU41CQkvKiBEaXNhYmxlIFRpbWVyIDUJCQkJCSovCisjZGVmaW5lIFRJTURJUzYJCQlUSU1FTjYJCS8qIERpc2FibGUgVGltZXIgNgkJCQkJKi8KKyNkZWZpbmUgVElNRElTNwkJCVRJTUVONwkJLyogRGlzYWJsZSBUaW1lciA3CQkJCQkqLworCisvKiBUSU1FUl9TVEFUVVMgTWFza3MJCQkJCQkJCQkJCQkJKi8KKyNkZWZpbmUgVElNSUwwCQkJMHgwMDAwMDAwMQkvKiBUaW1lciAwIEludGVycnVwdAkJCQkqLworI2RlZmluZSBUSU1JTDEJCQkweDAwMDAwMDAyCS8qIFRpbWVyIDEgSW50ZXJydXB0CQkJCSovCisjZGVmaW5lIFRJTUlMMgkJCTB4MDAwMDAwMDQJLyogVGltZXIgMiBJbnRlcnJ1cHQJCQkJKi8KKyNkZWZpbmUgVElNSUwzCQkJMHgwMDAwMDAwOAkvKiBUaW1lciAzIEludGVycnVwdAkJCQkqLworI2RlZmluZSBUT1ZGX0VSUjAJCTB4MDAwMDAwMTAJLyogVGltZXIgMCBDb3VudGVyIE92ZXJmbG93CQkJKi8KKyNkZWZpbmUgVE9WRl9FUlIxCQkweDAwMDAwMDIwCS8qIFRpbWVyIDEgQ291bnRlciBPdmVyZmxvdwkJCSovCisjZGVmaW5lIFRPVkZfRVJSMgkJMHgwMDAwMDA0MAkvKiBUaW1lciAyIENvdW50ZXIgT3ZlcmZsb3cJCQkqLworI2RlZmluZSBUT1ZGX0VSUjMJCTB4MDAwMDAwODAJLyogVGltZXIgMyBDb3VudGVyIE92ZXJmbG93CQkJKi8KKyNkZWZpbmUgVFJVTjAJCQkweDAwMDAxMDAwCS8qIFRpbWVyIDAgU2xhdmUgRW5hYmxlIFN0YXR1cwkJKi8KKyNkZWZpbmUgVFJVTjEJCQkweDAwMDAyMDAwCS8qIFRpbWVyIDEgU2xhdmUgRW5hYmxlIFN0YXR1cwkJKi8KKyNkZWZpbmUgVFJVTjIJCQkweDAwMDA0MDAwCS8qIFRpbWVyIDIgU2xhdmUgRW5hYmxlIFN0YXR1cwkJKi8KKyNkZWZpbmUgVFJVTjMJCQkweDAwMDA4MDAwCS8qIFRpbWVyIDMgU2xhdmUgRW5hYmxlIFN0YXR1cwkJKi8KKyNkZWZpbmUgVElNSUw0CQkJMHgwMDAxMDAwMAkvKiBUaW1lciA0IEludGVycnVwdAkJCQkqLworI2RlZmluZSBUSU1JTDUJCQkweDAwMDIwMDAwCS8qIFRpbWVyIDUgSW50ZXJydXB0CQkJCSovCisjZGVmaW5lIFRJTUlMNgkJCTB4MDAwNDAwMDAJLyogVGltZXIgNiBJbnRlcnJ1cHQJCQkJKi8KKyNkZWZpbmUgVElNSUw3CQkJMHgwMDA4MDAwMAkvKiBUaW1lciA3IEludGVycnVwdAkJCQkqLworI2RlZmluZSBUT1ZGX0VSUjQJCTB4MDAxMDAwMDAJLyogVGltZXIgNCBDb3VudGVyIE92ZXJmbG93CQkJKi8KKyNkZWZpbmUgVE9WRl9FUlI1CQkweDAwMjAwMDAwCS8qIFRpbWVyIDUgQ291bnRlciBPdmVyZmxvdwkJCSovCisjZGVmaW5lIFRPVkZfRVJSNgkJMHgwMDQwMDAwMAkvKiBUaW1lciA2IENvdW50ZXIgT3ZlcmZsb3cJCQkqLworI2RlZmluZSBUT1ZGX0VSUjcJCTB4MDA4MDAwMDAJLyogVGltZXIgNyBDb3VudGVyIE92ZXJmbG93CQkJKi8KKyNkZWZpbmUgVFJVTjQJCQkweDEwMDAwMDAwCS8qIFRpbWVyIDQgU2xhdmUgRW5hYmxlIFN0YXR1cwkJKi8KKyNkZWZpbmUgVFJVTjUJCQkweDIwMDAwMDAwCS8qIFRpbWVyIDUgU2xhdmUgRW5hYmxlIFN0YXR1cwkJKi8KKyNkZWZpbmUgVFJVTjYJCQkweDQwMDAwMDAwCS8qIFRpbWVyIDYgU2xhdmUgRW5hYmxlIFN0YXR1cwkJKi8KKyNkZWZpbmUgVFJVTjcJCQkweDgwMDAwMDAwCS8qIFRpbWVyIDcgU2xhdmUgRW5hYmxlIFN0YXR1cwkJKi8KKworLyogQWx0ZXJuYXRlIERlcHJlY2F0ZWQgTWFjcm9zIFByb3ZpZGVkIEZvciBCYWNrd2FyZHMgQ29kZSBDb21wYXRpYmlsaXR5ICovCisjZGVmaW5lIFRPVkxfRVJSMCBUT1ZGX0VSUjAKKyNkZWZpbmUgVE9WTF9FUlIxIFRPVkZfRVJSMQorI2RlZmluZSBUT1ZMX0VSUjIgVE9WRl9FUlIyCisjZGVmaW5lIFRPVkxfRVJSMyBUT1ZGX0VSUjMKKyNkZWZpbmUgVE9WTF9FUlI0IFRPVkZfRVJSNAorI2RlZmluZSBUT1ZMX0VSUjUgVE9WRl9FUlI1CisjZGVmaW5lIFRPVkxfRVJSNiBUT1ZGX0VSUjYKKyNkZWZpbmUgVE9WTF9FUlI3IFRPVkZfRVJSNworCisvKiBUSU1FUnhfQ09ORklHIE1hc2tzCQkJCQkJCQkJCQkJCSovCisjZGVmaW5lIFBXTV9PVVQJCQkweDAwMDEJLyogUHVsc2UtV2lkdGggTW9kdWxhdGlvbiBPdXRwdXQgTW9kZQkqLworI2RlZmluZSBXRFRIX0NBUAkJMHgwMDAyCS8qIFdpZHRoIENhcHR1cmUgSW5wdXQgTW9kZQkJCQkqLworI2RlZmluZSBFWFRfQ0xLCQkJMHgwMDAzCS8qIEV4dGVybmFsIENsb2NrIE1vZGUJCQkJCSovCisjZGVmaW5lIFBVTFNFX0hJCQkweDAwMDQJLyogQWN0aW9uIFB1bHNlIChQb3NpdGl2ZS9OZWdhdGl2ZSopCSovCisjZGVmaW5lIFBFUklPRF9DTlQJCTB4MDAwOAkvKiBQZXJpb2QgQ291bnQJCQkJCQkJKi8KKyNkZWZpbmUgSVJRX0VOQQkJCTB4MDAxMAkvKiBJbnRlcnJ1cHQgUmVxdWVzdCBFbmFibGUJCQkJKi8KKyNkZWZpbmUgVElOX1NFTAkJCTB4MDAyMAkvKiBUaW1lciBJbnB1dCBTZWxlY3QJCQkJCSovCisjZGVmaW5lIE9VVF9ESVMJCQkweDAwNDAJLyogT3V0cHV0IFBhZCBEaXNhYmxlCQkJCQkqLworI2RlZmluZSBDTEtfU0VMCQkJMHgwMDgwCS8qIFRpbWVyIENsb2NrIFNlbGVjdAkJCQkJKi8KKyNkZWZpbmUgVE9HR0xFX0hJCQkweDAxMDAJLyogUFdNX09VVCBQVUxTRV9ISSBUb2dnbGUgTW9kZQkJCSovCisjZGVmaW5lIEVNVV9SVU4JCQkweDAyMDAJLyogRW11bGF0aW9uIEJlaGF2aW9yIFNlbGVjdAkJCSovCisjZGVmaW5lIEVSUl9UWVAJCQkweEMwMDAJLyogRXJyb3IgVHlwZQkJCQkJCQkqLworCisvKiAqKioqKioqKioqKioqKioqKioqKiogIEFTWU5DSFJPTk9VUyBNRU1PUlkgQ09OVFJPTExFUiBNQVNLUyAgKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEVCSVVfQU1HQ1RMIE1hc2tzCQkJCQkJCQkJCQkJCQkJCQkqLworI2RlZmluZSBBTUNLRU4JCQkweDAwMDEJCS8qIEVuYWJsZSBDTEtPVVQJCQkJCQkJCQkqLworI2RlZmluZQlBTUJFTl9OT05FCQkweDAwMDAJCS8qIEFsbCBCYW5rcyBEaXNhYmxlZAkJCQkJCQkJKi8KKyNkZWZpbmUgQU1CRU5fQjAJCTB4MDAwMgkJLyogRW5hYmxlIEFzeW5jIE1lbW9yeSBCYW5rIDAgb25seQkJCQkJKi8KKyNkZWZpbmUgQU1CRU5fQjBfQjEJCTB4MDAwNAkJLyogRW5hYmxlIEFzeW5jIE1lbW9yeSBCYW5rcyAwICYgMSBvbmx5CQkJCSovCisjZGVmaW5lIEFNQkVOX0IwX0IxX0IyCTB4MDAwNgkJLyogRW5hYmxlIEFzeW5jIE1lbW9yeSBCYW5rcyAwLCAxLCBhbmQgMgkJCSovCisjZGVmaW5lIEFNQkVOX0FMTAkJMHgwMDA4CQkvKiBFbmFibGUgQXN5bmMgTWVtb3J5IEJhbmtzIChhbGwpIDAsIDEsIDIsIGFuZCAzCSovCisKKy8qIEVCSVVfQU1CQ1RMMCBNYXNrcwkJCQkJCQkJCQkJCQkJCQkJKi8KKyNkZWZpbmUgQjBSRFlFTgkJCTB4MDAwMDAwMDEgIC8qIEJhbmsgMCAoQjApIFJEWSBFbmFibGUJCQkJCQkJKi8KKyNkZWZpbmUgQjBSRFlQT0wJCTB4MDAwMDAwMDIgIC8qIEIwIFJEWSBBY3RpdmUgSGlnaAkJCQkJCQkJKi8KKyNkZWZpbmUgQjBUVF8xCQkJMHgwMDAwMDAwNCAgLyogQjAgVHJhbnNpdGlvbiBUaW1lIChSZWFkIHRvIFdyaXRlKSA9IDEgY3ljbGUJCSovCisjZGVmaW5lIEIwVFRfMgkJCTB4MDAwMDAwMDggIC8qIEIwIFRyYW5zaXRpb24gVGltZSAoUmVhZCB0byBXcml0ZSkgPSAyIGN5Y2xlcwkqLworI2RlZmluZSBCMFRUXzMJCQkweDAwMDAwMDBDICAvKiBCMCBUcmFuc2l0aW9uIFRpbWUgKFJlYWQgdG8gV3JpdGUpID0gMyBjeWNsZXMJKi8KKyNkZWZpbmUgQjBUVF80CQkJMHgwMDAwMDAwMCAgLyogQjAgVHJhbnNpdGlvbiBUaW1lIChSZWFkIHRvIFdyaXRlKSA9IDQgY3ljbGVzCSovCisjZGVmaW5lIEIwU1RfMQkJCTB4MDAwMDAwMTAgIC8qIEIwIFNldHVwIFRpbWUgKEFPRSB0byBSZWFkL1dyaXRlKSA9IDEgY3ljbGUJCSovCisjZGVmaW5lIEIwU1RfMgkJCTB4MDAwMDAwMjAgIC8qIEIwIFNldHVwIFRpbWUgKEFPRSB0byBSZWFkL1dyaXRlKSA9IDIgY3ljbGVzCQkqLworI2RlZmluZSBCMFNUXzMJCQkweDAwMDAwMDMwICAvKiBCMCBTZXR1cCBUaW1lIChBT0UgdG8gUmVhZC9Xcml0ZSkgPSAzIGN5Y2xlcwkJKi8KKyNkZWZpbmUgQjBTVF80CQkJMHgwMDAwMDAwMCAgLyogQjAgU2V0dXAgVGltZSAoQU9FIHRvIFJlYWQvV3JpdGUpID0gNCBjeWNsZXMJCSovCisjZGVmaW5lIEIwSFRfMQkJCTB4MDAwMDAwNDAgIC8qIEIwIEhvbGQgVGltZSAoflJlYWQvV3JpdGUgdG8gfkFPRSkgPSAxIGN5Y2xlCQkqLworI2RlZmluZSBCMEhUXzIJCQkweDAwMDAwMDgwICAvKiBCMCBIb2xkIFRpbWUgKH5SZWFkL1dyaXRlIHRvIH5BT0UpID0gMiBjeWNsZXMJKi8KKyNkZWZpbmUgQjBIVF8zCQkJMHgwMDAwMDBDMCAgLyogQjAgSG9sZCBUaW1lICh+UmVhZC9Xcml0ZSB0byB+QU9FKSA9IDMgY3ljbGVzCSovCisjZGVmaW5lIEIwSFRfMAkJCTB4MDAwMDAwMDAgIC8qIEIwIEhvbGQgVGltZSAoflJlYWQvV3JpdGUgdG8gfkFPRSkgPSAwIGN5Y2xlcwkqLworI2RlZmluZSBCMFJBVF8xCQkJMHgwMDAwMDEwMCAgLyogQjAgUmVhZCBBY2Nlc3MgVGltZSA9IDEgY3ljbGUJCQkJCSovCisjZGVmaW5lIEIwUkFUXzIJCQkweDAwMDAwMjAwICAvKiBCMCBSZWFkIEFjY2VzcyBUaW1lID0gMiBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIwUkFUXzMJCQkweDAwMDAwMzAwICAvKiBCMCBSZWFkIEFjY2VzcyBUaW1lID0gMyBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIwUkFUXzQJCQkweDAwMDAwNDAwICAvKiBCMCBSZWFkIEFjY2VzcyBUaW1lID0gNCBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIwUkFUXzUJCQkweDAwMDAwNTAwICAvKiBCMCBSZWFkIEFjY2VzcyBUaW1lID0gNSBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIwUkFUXzYJCQkweDAwMDAwNjAwICAvKiBCMCBSZWFkIEFjY2VzcyBUaW1lID0gNiBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIwUkFUXzcJCQkweDAwMDAwNzAwICAvKiBCMCBSZWFkIEFjY2VzcyBUaW1lID0gNyBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIwUkFUXzgJCQkweDAwMDAwODAwICAvKiBCMCBSZWFkIEFjY2VzcyBUaW1lID0gOCBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIwUkFUXzkJCQkweDAwMDAwOTAwICAvKiBCMCBSZWFkIEFjY2VzcyBUaW1lID0gOSBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIwUkFUXzEwCQkweDAwMDAwQTAwICAvKiBCMCBSZWFkIEFjY2VzcyBUaW1lID0gMTAgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMFJBVF8xMQkJMHgwMDAwMEIwMCAgLyogQjAgUmVhZCBBY2Nlc3MgVGltZSA9IDExIGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjBSQVRfMTIJCTB4MDAwMDBDMDAgIC8qIEIwIFJlYWQgQWNjZXNzIFRpbWUgPSAxMiBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIwUkFUXzEzCQkweDAwMDAwRDAwICAvKiBCMCBSZWFkIEFjY2VzcyBUaW1lID0gMTMgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMFJBVF8xNAkJMHgwMDAwMEUwMCAgLyogQjAgUmVhZCBBY2Nlc3MgVGltZSA9IDE0IGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjBSQVRfMTUJCTB4MDAwMDBGMDAgIC8qIEIwIFJlYWQgQWNjZXNzIFRpbWUgPSAxNSBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIwV0FUXzEJCQkweDAwMDAxMDAwICAvKiBCMCBXcml0ZSBBY2Nlc3MgVGltZSA9IDEgY3ljbGUJCQkJCSovCisjZGVmaW5lIEIwV0FUXzIJCQkweDAwMDAyMDAwICAvKiBCMCBXcml0ZSBBY2Nlc3MgVGltZSA9IDIgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMFdBVF8zCQkJMHgwMDAwMzAwMCAgLyogQjAgV3JpdGUgQWNjZXNzIFRpbWUgPSAzIGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjBXQVRfNAkJCTB4MDAwMDQwMDAgIC8qIEIwIFdyaXRlIEFjY2VzcyBUaW1lID0gNCBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIwV0FUXzUJCQkweDAwMDA1MDAwICAvKiBCMCBXcml0ZSBBY2Nlc3MgVGltZSA9IDUgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMFdBVF82CQkJMHgwMDAwNjAwMCAgLyogQjAgV3JpdGUgQWNjZXNzIFRpbWUgPSA2IGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjBXQVRfNwkJCTB4MDAwMDcwMDAgIC8qIEIwIFdyaXRlIEFjY2VzcyBUaW1lID0gNyBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIwV0FUXzgJCQkweDAwMDA4MDAwICAvKiBCMCBXcml0ZSBBY2Nlc3MgVGltZSA9IDggY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMFdBVF85CQkJMHgwMDAwOTAwMCAgLyogQjAgV3JpdGUgQWNjZXNzIFRpbWUgPSA5IGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjBXQVRfMTAJCTB4MDAwMEEwMDAgIC8qIEIwIFdyaXRlIEFjY2VzcyBUaW1lID0gMTAgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMFdBVF8xMQkJMHgwMDAwQjAwMCAgLyogQjAgV3JpdGUgQWNjZXNzIFRpbWUgPSAxMSBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIwV0FUXzEyCQkweDAwMDBDMDAwICAvKiBCMCBXcml0ZSBBY2Nlc3MgVGltZSA9IDEyIGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjBXQVRfMTMJCTB4MDAwMEQwMDAgIC8qIEIwIFdyaXRlIEFjY2VzcyBUaW1lID0gMTMgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMFdBVF8xNAkJMHgwMDAwRTAwMCAgLyogQjAgV3JpdGUgQWNjZXNzIFRpbWUgPSAxNCBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIwV0FUXzE1CQkweDAwMDBGMDAwICAvKiBCMCBXcml0ZSBBY2Nlc3MgVGltZSA9IDE1IGN5Y2xlcwkJCQkJKi8KKworI2RlZmluZSBCMVJEWUVOCQkJMHgwMDAxMDAwMCAgLyogQmFuayAxIChCMSkgUkRZIEVuYWJsZSAgICAgICAgICAgICAgICAgICAgICAgCSovCisjZGVmaW5lIEIxUkRZUE9MCQkweDAwMDIwMDAwICAvKiBCMSBSRFkgQWN0aXZlIEhpZ2ggICAgICAgICAgICAgICAgICAgICAgICAgICAJKi8KKyNkZWZpbmUgQjFUVF8xCQkJMHgwMDA0MDAwMCAgLyogQjEgVHJhbnNpdGlvbiBUaW1lIChSZWFkIHRvIFdyaXRlKSA9IDEgY3ljbGUgCSovCisjZGVmaW5lIEIxVFRfMgkJCTB4MDAwODAwMDAgIC8qIEIxIFRyYW5zaXRpb24gVGltZSAoUmVhZCB0byBXcml0ZSkgPSAyIGN5Y2xlcwkqLworI2RlZmluZSBCMVRUXzMJCQkweDAwMEMwMDAwICAvKiBCMSBUcmFuc2l0aW9uIFRpbWUgKFJlYWQgdG8gV3JpdGUpID0gMyBjeWNsZXMJKi8KKyNkZWZpbmUgQjFUVF80CQkJMHgwMDAwMDAwMCAgLyogQjEgVHJhbnNpdGlvbiBUaW1lIChSZWFkIHRvIFdyaXRlKSA9IDQgY3ljbGVzCSovCisjZGVmaW5lIEIxU1RfMQkJCTB4MDAxMDAwMDAgIC8qIEIxIFNldHVwIFRpbWUgKEFPRSB0byBSZWFkL1dyaXRlKSA9IDEgY3ljbGUgIAkqLworI2RlZmluZSBCMVNUXzIJCQkweDAwMjAwMDAwICAvKiBCMSBTZXR1cCBUaW1lIChBT0UgdG8gUmVhZC9Xcml0ZSkgPSAyIGN5Y2xlcyAJKi8KKyNkZWZpbmUgQjFTVF8zCQkJMHgwMDMwMDAwMCAgLyogQjEgU2V0dXAgVGltZSAoQU9FIHRvIFJlYWQvV3JpdGUpID0gMyBjeWNsZXMgCSovCisjZGVmaW5lIEIxU1RfNAkJCTB4MDAwMDAwMDAgIC8qIEIxIFNldHVwIFRpbWUgKEFPRSB0byBSZWFkL1dyaXRlKSA9IDQgY3ljbGVzIAkqLworI2RlZmluZSBCMUhUXzEJCQkweDAwNDAwMDAwICAvKiBCMSBIb2xkIFRpbWUgKH5SZWFkL1dyaXRlIHRvIH5BT0UpID0gMSBjeWNsZSAJKi8KKyNkZWZpbmUgQjFIVF8yCQkJMHgwMDgwMDAwMCAgLyogQjEgSG9sZCBUaW1lICh+UmVhZC9Xcml0ZSB0byB+QU9FKSA9IDIgY3ljbGVzCSovCisjZGVmaW5lIEIxSFRfMwkJCTB4MDBDMDAwMDAgIC8qIEIxIEhvbGQgVGltZSAoflJlYWQvV3JpdGUgdG8gfkFPRSkgPSAzIGN5Y2xlcwkqLworI2RlZmluZSBCMUhUXzAJCQkweDAwMDAwMDAwICAvKiBCMSBIb2xkIFRpbWUgKH5SZWFkL1dyaXRlIHRvIH5BT0UpID0gMCBjeWNsZXMJKi8KKyNkZWZpbmUgQjFSQVRfMQkJCTB4MDEwMDAwMDAgIC8qIEIxIFJlYWQgQWNjZXNzIFRpbWUgPSAxIGN5Y2xlCQkJCQkqLworI2RlZmluZSBCMVJBVF8yCQkJMHgwMjAwMDAwMCAgLyogQjEgUmVhZCBBY2Nlc3MgVGltZSA9IDIgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMVJBVF8zCQkJMHgwMzAwMDAwMCAgLyogQjEgUmVhZCBBY2Nlc3MgVGltZSA9IDMgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMVJBVF80CQkJMHgwNDAwMDAwMCAgLyogQjEgUmVhZCBBY2Nlc3MgVGltZSA9IDQgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMVJBVF81CQkJMHgwNTAwMDAwMCAgLyogQjEgUmVhZCBBY2Nlc3MgVGltZSA9IDUgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMVJBVF82CQkJMHgwNjAwMDAwMCAgLyogQjEgUmVhZCBBY2Nlc3MgVGltZSA9IDYgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMVJBVF83CQkJMHgwNzAwMDAwMCAgLyogQjEgUmVhZCBBY2Nlc3MgVGltZSA9IDcgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMVJBVF84CQkJMHgwODAwMDAwMCAgLyogQjEgUmVhZCBBY2Nlc3MgVGltZSA9IDggY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMVJBVF85CQkJMHgwOTAwMDAwMCAgLyogQjEgUmVhZCBBY2Nlc3MgVGltZSA9IDkgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMVJBVF8xMAkJMHgwQTAwMDAwMCAgLyogQjEgUmVhZCBBY2Nlc3MgVGltZSA9IDEwIGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjFSQVRfMTEJCTB4MEIwMDAwMDAgIC8qIEIxIFJlYWQgQWNjZXNzIFRpbWUgPSAxMSBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIxUkFUXzEyCQkweDBDMDAwMDAwICAvKiBCMSBSZWFkIEFjY2VzcyBUaW1lID0gMTIgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMVJBVF8xMwkJMHgwRDAwMDAwMCAgLyogQjEgUmVhZCBBY2Nlc3MgVGltZSA9IDEzIGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjFSQVRfMTQJCTB4MEUwMDAwMDAgIC8qIEIxIFJlYWQgQWNjZXNzIFRpbWUgPSAxNCBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIxUkFUXzE1CQkweDBGMDAwMDAwICAvKiBCMSBSZWFkIEFjY2VzcyBUaW1lID0gMTUgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMVdBVF8xCQkJMHgxMDAwMDAwMCAgLyogQjEgV3JpdGUgQWNjZXNzIFRpbWUgPSAxIGN5Y2xlCQkJCQkqLworI2RlZmluZSBCMVdBVF8yCQkJMHgyMDAwMDAwMCAgLyogQjEgV3JpdGUgQWNjZXNzIFRpbWUgPSAyIGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjFXQVRfMwkJCTB4MzAwMDAwMDAgIC8qIEIxIFdyaXRlIEFjY2VzcyBUaW1lID0gMyBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIxV0FUXzQJCQkweDQwMDAwMDAwICAvKiBCMSBXcml0ZSBBY2Nlc3MgVGltZSA9IDQgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMVdBVF81CQkJMHg1MDAwMDAwMCAgLyogQjEgV3JpdGUgQWNjZXNzIFRpbWUgPSA1IGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjFXQVRfNgkJCTB4NjAwMDAwMDAgIC8qIEIxIFdyaXRlIEFjY2VzcyBUaW1lID0gNiBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIxV0FUXzcJCQkweDcwMDAwMDAwICAvKiBCMSBXcml0ZSBBY2Nlc3MgVGltZSA9IDcgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMVdBVF84CQkJMHg4MDAwMDAwMCAgLyogQjEgV3JpdGUgQWNjZXNzIFRpbWUgPSA4IGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjFXQVRfOQkJCTB4OTAwMDAwMDAgIC8qIEIxIFdyaXRlIEFjY2VzcyBUaW1lID0gOSBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIxV0FUXzEwCQkweEEwMDAwMDAwICAvKiBCMSBXcml0ZSBBY2Nlc3MgVGltZSA9IDEwIGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjFXQVRfMTEJCTB4QjAwMDAwMDAgIC8qIEIxIFdyaXRlIEFjY2VzcyBUaW1lID0gMTEgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMVdBVF8xMgkJMHhDMDAwMDAwMCAgLyogQjEgV3JpdGUgQWNjZXNzIFRpbWUgPSAxMiBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIxV0FUXzEzCQkweEQwMDAwMDAwICAvKiBCMSBXcml0ZSBBY2Nlc3MgVGltZSA9IDEzIGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjFXQVRfMTQJCTB4RTAwMDAwMDAgIC8qIEIxIFdyaXRlIEFjY2VzcyBUaW1lID0gMTQgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMVdBVF8xNQkJMHhGMDAwMDAwMCAgLyogQjEgV3JpdGUgQWNjZXNzIFRpbWUgPSAxNSBjeWNsZXMJCQkJCSovCisKKy8qIEVCSVVfQU1CQ1RMMSBNYXNrcwkJCQkJCQkJCQkJCQkJCQkJKi8KKyNkZWZpbmUgQjJSRFlFTgkJCTB4MDAwMDAwMDEgIC8qIEJhbmsgMiAoQjIpIFJEWSBFbmFibGUJCQkJCQkJKi8KKyNkZWZpbmUgQjJSRFlQT0wJCTB4MDAwMDAwMDIgIC8qIEIyIFJEWSBBY3RpdmUgSGlnaAkJCQkJCQkJKi8KKyNkZWZpbmUgQjJUVF8xCQkJMHgwMDAwMDAwNCAgLyogQjIgVHJhbnNpdGlvbiBUaW1lIChSZWFkIHRvIFdyaXRlKSA9IDEgY3ljbGUJCSovCisjZGVmaW5lIEIyVFRfMgkJCTB4MDAwMDAwMDggIC8qIEIyIFRyYW5zaXRpb24gVGltZSAoUmVhZCB0byBXcml0ZSkgPSAyIGN5Y2xlcwkqLworI2RlZmluZSBCMlRUXzMJCQkweDAwMDAwMDBDICAvKiBCMiBUcmFuc2l0aW9uIFRpbWUgKFJlYWQgdG8gV3JpdGUpID0gMyBjeWNsZXMJKi8KKyNkZWZpbmUgQjJUVF80CQkJMHgwMDAwMDAwMCAgLyogQjIgVHJhbnNpdGlvbiBUaW1lIChSZWFkIHRvIFdyaXRlKSA9IDQgY3ljbGVzCSovCisjZGVmaW5lIEIyU1RfMQkJCTB4MDAwMDAwMTAgIC8qIEIyIFNldHVwIFRpbWUgKEFPRSB0byBSZWFkL1dyaXRlKSA9IDEgY3ljbGUJCSovCisjZGVmaW5lIEIyU1RfMgkJCTB4MDAwMDAwMjAgIC8qIEIyIFNldHVwIFRpbWUgKEFPRSB0byBSZWFkL1dyaXRlKSA9IDIgY3ljbGVzCQkqLworI2RlZmluZSBCMlNUXzMJCQkweDAwMDAwMDMwICAvKiBCMiBTZXR1cCBUaW1lIChBT0UgdG8gUmVhZC9Xcml0ZSkgPSAzIGN5Y2xlcwkJKi8KKyNkZWZpbmUgQjJTVF80CQkJMHgwMDAwMDAwMCAgLyogQjIgU2V0dXAgVGltZSAoQU9FIHRvIFJlYWQvV3JpdGUpID0gNCBjeWNsZXMJCSovCisjZGVmaW5lIEIySFRfMQkJCTB4MDAwMDAwNDAgIC8qIEIyIEhvbGQgVGltZSAoflJlYWQvV3JpdGUgdG8gfkFPRSkgPSAxIGN5Y2xlCQkqLworI2RlZmluZSBCMkhUXzIJCQkweDAwMDAwMDgwICAvKiBCMiBIb2xkIFRpbWUgKH5SZWFkL1dyaXRlIHRvIH5BT0UpID0gMiBjeWNsZXMJKi8KKyNkZWZpbmUgQjJIVF8zCQkJMHgwMDAwMDBDMCAgLyogQjIgSG9sZCBUaW1lICh+UmVhZC9Xcml0ZSB0byB+QU9FKSA9IDMgY3ljbGVzCSovCisjZGVmaW5lIEIySFRfMAkJCTB4MDAwMDAwMDAgIC8qIEIyIEhvbGQgVGltZSAoflJlYWQvV3JpdGUgdG8gfkFPRSkgPSAwIGN5Y2xlcwkqLworI2RlZmluZSBCMlJBVF8xCQkJMHgwMDAwMDEwMCAgLyogQjIgUmVhZCBBY2Nlc3MgVGltZSA9IDEgY3ljbGUJCQkJCSovCisjZGVmaW5lIEIyUkFUXzIJCQkweDAwMDAwMjAwICAvKiBCMiBSZWFkIEFjY2VzcyBUaW1lID0gMiBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIyUkFUXzMJCQkweDAwMDAwMzAwICAvKiBCMiBSZWFkIEFjY2VzcyBUaW1lID0gMyBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIyUkFUXzQJCQkweDAwMDAwNDAwICAvKiBCMiBSZWFkIEFjY2VzcyBUaW1lID0gNCBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIyUkFUXzUJCQkweDAwMDAwNTAwICAvKiBCMiBSZWFkIEFjY2VzcyBUaW1lID0gNSBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIyUkFUXzYJCQkweDAwMDAwNjAwICAvKiBCMiBSZWFkIEFjY2VzcyBUaW1lID0gNiBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIyUkFUXzcJCQkweDAwMDAwNzAwICAvKiBCMiBSZWFkIEFjY2VzcyBUaW1lID0gNyBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIyUkFUXzgJCQkweDAwMDAwODAwICAvKiBCMiBSZWFkIEFjY2VzcyBUaW1lID0gOCBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIyUkFUXzkJCQkweDAwMDAwOTAwICAvKiBCMiBSZWFkIEFjY2VzcyBUaW1lID0gOSBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIyUkFUXzEwCQkweDAwMDAwQTAwICAvKiBCMiBSZWFkIEFjY2VzcyBUaW1lID0gMTAgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMlJBVF8xMQkJMHgwMDAwMEIwMCAgLyogQjIgUmVhZCBBY2Nlc3MgVGltZSA9IDExIGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjJSQVRfMTIJCTB4MDAwMDBDMDAgIC8qIEIyIFJlYWQgQWNjZXNzIFRpbWUgPSAxMiBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIyUkFUXzEzCQkweDAwMDAwRDAwICAvKiBCMiBSZWFkIEFjY2VzcyBUaW1lID0gMTMgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMlJBVF8xNAkJMHgwMDAwMEUwMCAgLyogQjIgUmVhZCBBY2Nlc3MgVGltZSA9IDE0IGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjJSQVRfMTUJCTB4MDAwMDBGMDAgIC8qIEIyIFJlYWQgQWNjZXNzIFRpbWUgPSAxNSBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIyV0FUXzEJCQkweDAwMDAxMDAwICAvKiBCMiBXcml0ZSBBY2Nlc3MgVGltZSA9IDEgY3ljbGUJCQkJCSovCisjZGVmaW5lIEIyV0FUXzIJCQkweDAwMDAyMDAwICAvKiBCMiBXcml0ZSBBY2Nlc3MgVGltZSA9IDIgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMldBVF8zCQkJMHgwMDAwMzAwMCAgLyogQjIgV3JpdGUgQWNjZXNzIFRpbWUgPSAzIGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjJXQVRfNAkJCTB4MDAwMDQwMDAgIC8qIEIyIFdyaXRlIEFjY2VzcyBUaW1lID0gNCBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIyV0FUXzUJCQkweDAwMDA1MDAwICAvKiBCMiBXcml0ZSBBY2Nlc3MgVGltZSA9IDUgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMldBVF82CQkJMHgwMDAwNjAwMCAgLyogQjIgV3JpdGUgQWNjZXNzIFRpbWUgPSA2IGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjJXQVRfNwkJCTB4MDAwMDcwMDAgIC8qIEIyIFdyaXRlIEFjY2VzcyBUaW1lID0gNyBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIyV0FUXzgJCQkweDAwMDA4MDAwICAvKiBCMiBXcml0ZSBBY2Nlc3MgVGltZSA9IDggY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMldBVF85CQkJMHgwMDAwOTAwMCAgLyogQjIgV3JpdGUgQWNjZXNzIFRpbWUgPSA5IGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjJXQVRfMTAJCTB4MDAwMEEwMDAgIC8qIEIyIFdyaXRlIEFjY2VzcyBUaW1lID0gMTAgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMldBVF8xMQkJMHgwMDAwQjAwMCAgLyogQjIgV3JpdGUgQWNjZXNzIFRpbWUgPSAxMSBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIyV0FUXzEyCQkweDAwMDBDMDAwICAvKiBCMiBXcml0ZSBBY2Nlc3MgVGltZSA9IDEyIGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjJXQVRfMTMJCTB4MDAwMEQwMDAgIC8qIEIyIFdyaXRlIEFjY2VzcyBUaW1lID0gMTMgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMldBVF8xNAkJMHgwMDAwRTAwMCAgLyogQjIgV3JpdGUgQWNjZXNzIFRpbWUgPSAxNCBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIyV0FUXzE1CQkweDAwMDBGMDAwICAvKiBCMiBXcml0ZSBBY2Nlc3MgVGltZSA9IDE1IGN5Y2xlcwkJCQkJKi8KKworI2RlZmluZSBCM1JEWUVOCQkJMHgwMDAxMDAwMCAgLyogQmFuayAzIChCMykgUkRZIEVuYWJsZQkJCQkJCQkqLworI2RlZmluZSBCM1JEWVBPTAkJMHgwMDAyMDAwMCAgLyogQjMgUkRZIEFjdGl2ZSBIaWdoCQkJCQkJCQkqLworI2RlZmluZSBCM1RUXzEJCQkweDAwMDQwMDAwICAvKiBCMyBUcmFuc2l0aW9uIFRpbWUgKFJlYWQgdG8gV3JpdGUpID0gMSBjeWNsZQkJKi8KKyNkZWZpbmUgQjNUVF8yCQkJMHgwMDA4MDAwMCAgLyogQjMgVHJhbnNpdGlvbiBUaW1lIChSZWFkIHRvIFdyaXRlKSA9IDIgY3ljbGVzCSovCisjZGVmaW5lIEIzVFRfMwkJCTB4MDAwQzAwMDAgIC8qIEIzIFRyYW5zaXRpb24gVGltZSAoUmVhZCB0byBXcml0ZSkgPSAzIGN5Y2xlcwkqLworI2RlZmluZSBCM1RUXzQJCQkweDAwMDAwMDAwICAvKiBCMyBUcmFuc2l0aW9uIFRpbWUgKFJlYWQgdG8gV3JpdGUpID0gNCBjeWNsZXMJKi8KKyNkZWZpbmUgQjNTVF8xCQkJMHgwMDEwMDAwMCAgLyogQjMgU2V0dXAgVGltZSAoQU9FIHRvIFJlYWQvV3JpdGUpID0gMSBjeWNsZQkJKi8KKyNkZWZpbmUgQjNTVF8yCQkJMHgwMDIwMDAwMCAgLyogQjMgU2V0dXAgVGltZSAoQU9FIHRvIFJlYWQvV3JpdGUpID0gMiBjeWNsZXMJCSovCisjZGVmaW5lIEIzU1RfMwkJCTB4MDAzMDAwMDAgIC8qIEIzIFNldHVwIFRpbWUgKEFPRSB0byBSZWFkL1dyaXRlKSA9IDMgY3ljbGVzCQkqLworI2RlZmluZSBCM1NUXzQJCQkweDAwMDAwMDAwICAvKiBCMyBTZXR1cCBUaW1lIChBT0UgdG8gUmVhZC9Xcml0ZSkgPSA0IGN5Y2xlcwkJKi8KKyNkZWZpbmUgQjNIVF8xCQkJMHgwMDQwMDAwMCAgLyogQjMgSG9sZCBUaW1lICh+UmVhZC9Xcml0ZSB0byB+QU9FKSA9IDEgY3ljbGUJCSovCisjZGVmaW5lIEIzSFRfMgkJCTB4MDA4MDAwMDAgIC8qIEIzIEhvbGQgVGltZSAoflJlYWQvV3JpdGUgdG8gfkFPRSkgPSAyIGN5Y2xlcwkqLworI2RlZmluZSBCM0hUXzMJCQkweDAwQzAwMDAwICAvKiBCMyBIb2xkIFRpbWUgKH5SZWFkL1dyaXRlIHRvIH5BT0UpID0gMyBjeWNsZXMJKi8KKyNkZWZpbmUgQjNIVF8wCQkJMHgwMDAwMDAwMCAgLyogQjMgSG9sZCBUaW1lICh+UmVhZC9Xcml0ZSB0byB+QU9FKSA9IDAgY3ljbGVzCSovCisjZGVmaW5lIEIzUkFUXzEJCQkweDAxMDAwMDAwICAvKiBCMyBSZWFkIEFjY2VzcyBUaW1lID0gMSBjeWNsZQkJCQkJKi8KKyNkZWZpbmUgQjNSQVRfMgkJCTB4MDIwMDAwMDAgIC8qIEIzIFJlYWQgQWNjZXNzIFRpbWUgPSAyIGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjNSQVRfMwkJCTB4MDMwMDAwMDAgIC8qIEIzIFJlYWQgQWNjZXNzIFRpbWUgPSAzIGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjNSQVRfNAkJCTB4MDQwMDAwMDAgIC8qIEIzIFJlYWQgQWNjZXNzIFRpbWUgPSA0IGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjNSQVRfNQkJCTB4MDUwMDAwMDAgIC8qIEIzIFJlYWQgQWNjZXNzIFRpbWUgPSA1IGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjNSQVRfNgkJCTB4MDYwMDAwMDAgIC8qIEIzIFJlYWQgQWNjZXNzIFRpbWUgPSA2IGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjNSQVRfNwkJCTB4MDcwMDAwMDAgIC8qIEIzIFJlYWQgQWNjZXNzIFRpbWUgPSA3IGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjNSQVRfOAkJCTB4MDgwMDAwMDAgIC8qIEIzIFJlYWQgQWNjZXNzIFRpbWUgPSA4IGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjNSQVRfOQkJCTB4MDkwMDAwMDAgIC8qIEIzIFJlYWQgQWNjZXNzIFRpbWUgPSA5IGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjNSQVRfMTAJCTB4MEEwMDAwMDAgIC8qIEIzIFJlYWQgQWNjZXNzIFRpbWUgPSAxMCBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIzUkFUXzExCQkweDBCMDAwMDAwICAvKiBCMyBSZWFkIEFjY2VzcyBUaW1lID0gMTEgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCM1JBVF8xMgkJMHgwQzAwMDAwMCAgLyogQjMgUmVhZCBBY2Nlc3MgVGltZSA9IDEyIGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjNSQVRfMTMJCTB4MEQwMDAwMDAgIC8qIEIzIFJlYWQgQWNjZXNzIFRpbWUgPSAxMyBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIzUkFUXzE0CQkweDBFMDAwMDAwICAvKiBCMyBSZWFkIEFjY2VzcyBUaW1lID0gMTQgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCM1JBVF8xNQkJMHgwRjAwMDAwMCAgLyogQjMgUmVhZCBBY2Nlc3MgVGltZSA9IDE1IGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjNXQVRfMQkJCTB4MTAwMDAwMDAgIC8qIEIzIFdyaXRlIEFjY2VzcyBUaW1lID0gMSBjeWNsZQkJCQkJKi8KKyNkZWZpbmUgQjNXQVRfMgkJCTB4MjAwMDAwMDAgIC8qIEIzIFdyaXRlIEFjY2VzcyBUaW1lID0gMiBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIzV0FUXzMJCQkweDMwMDAwMDAwICAvKiBCMyBXcml0ZSBBY2Nlc3MgVGltZSA9IDMgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCM1dBVF80CQkJMHg0MDAwMDAwMCAgLyogQjMgV3JpdGUgQWNjZXNzIFRpbWUgPSA0IGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjNXQVRfNQkJCTB4NTAwMDAwMDAgIC8qIEIzIFdyaXRlIEFjY2VzcyBUaW1lID0gNSBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIzV0FUXzYJCQkweDYwMDAwMDAwICAvKiBCMyBXcml0ZSBBY2Nlc3MgVGltZSA9IDYgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCM1dBVF83CQkJMHg3MDAwMDAwMCAgLyogQjMgV3JpdGUgQWNjZXNzIFRpbWUgPSA3IGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjNXQVRfOAkJCTB4ODAwMDAwMDAgIC8qIEIzIFdyaXRlIEFjY2VzcyBUaW1lID0gOCBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIzV0FUXzkJCQkweDkwMDAwMDAwICAvKiBCMyBXcml0ZSBBY2Nlc3MgVGltZSA9IDkgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCM1dBVF8xMAkJMHhBMDAwMDAwMCAgLyogQjMgV3JpdGUgQWNjZXNzIFRpbWUgPSAxMCBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIzV0FUXzExCQkweEIwMDAwMDAwICAvKiBCMyBXcml0ZSBBY2Nlc3MgVGltZSA9IDExIGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjNXQVRfMTIJCTB4QzAwMDAwMDAgIC8qIEIzIFdyaXRlIEFjY2VzcyBUaW1lID0gMTIgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCM1dBVF8xMwkJMHhEMDAwMDAwMCAgLyogQjMgV3JpdGUgQWNjZXNzIFRpbWUgPSAxMyBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIzV0FUXzE0CQkweEUwMDAwMDAwICAvKiBCMyBXcml0ZSBBY2Nlc3MgVGltZSA9IDE0IGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjNXQVRfMTUJCTB4RjAwMDAwMDAgIC8qIEIzIFdyaXRlIEFjY2VzcyBUaW1lID0gMTUgY3ljbGVzCQkJCQkqLworCisKKy8qICoqKioqKioqKioqKioqKioqKioqKiogIFNEUkFNIENPTlRST0xMRVIgTUFTS1MgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBFQklVX1NER0NUTCBNYXNrcwkJCQkJCQkJCQkJCQkJCQkJCQkqLworI2RlZmluZSBTQ1RMRQkJCTB4MDAwMDAwMDEJLyogRW5hYmxlIFNEUkFNIFNpZ25hbHMJCQkJCQkJCQkJKi8KKyNkZWZpbmUgQ0xfMgkJCTB4MDAwMDAwMDgJLyogU0RSQU0gQ0FTIExhdGVuY3kgPSAyIGN5Y2xlcwkJCQkJCQkJKi8KKyNkZWZpbmUgQ0xfMwkJCTB4MDAwMDAwMEMJLyogU0RSQU0gQ0FTIExhdGVuY3kgPSAzIGN5Y2xlcwkJCQkJCQkJKi8KKyNkZWZpbmUgUEFTUl9BTEwJCTB4MDAwMDAwMDAJLyogQWxsIDQgU0RSQU0gQmFua3MgUmVmcmVzaGVkIEluIFNlbGYtUmVmcmVzaAkJCQkqLworI2RlZmluZSBQQVNSX0IwX0IxCQkweDAwMDAwMDEwCS8qIFNEUkFNIEJhbmtzIDAgYW5kIDEgQXJlIFJlZnJlc2hlZCBJbiBTZWxmLVJlZnJlc2gJCSovCisjZGVmaW5lIFBBU1JfQjAJCQkweDAwMDAwMDIwCS8qIE9ubHkgU0RSQU0gQmFuayAwIElzIFJlZnJlc2hlZCBJbiBTZWxmLVJlZnJlc2gJCQkqLworI2RlZmluZSBUUkFTXzEJCQkweDAwMDAwMDQwCS8qIFNEUkFNIHRSQVMgPSAxIGN5Y2xlCQkJCQkJCQkJCSovCisjZGVmaW5lIFRSQVNfMgkJCTB4MDAwMDAwODAJLyogU0RSQU0gdFJBUyA9IDIgY3ljbGVzCQkJCQkJCQkJKi8KKyNkZWZpbmUgVFJBU18zCQkJMHgwMDAwMDBDMAkvKiBTRFJBTSB0UkFTID0gMyBjeWNsZXMJCQkJCQkJCQkqLworI2RlZmluZSBUUkFTXzQJCQkweDAwMDAwMTAwCS8qIFNEUkFNIHRSQVMgPSA0IGN5Y2xlcwkJCQkJCQkJCSovCisjZGVmaW5lIFRSQVNfNQkJCTB4MDAwMDAxNDAJLyogU0RSQU0gdFJBUyA9IDUgY3ljbGVzCQkJCQkJCQkJKi8KKyNkZWZpbmUgVFJBU182CQkJMHgwMDAwMDE4MAkvKiBTRFJBTSB0UkFTID0gNiBjeWNsZXMJCQkJCQkJCQkqLworI2RlZmluZSBUUkFTXzcJCQkweDAwMDAwMUMwCS8qIFNEUkFNIHRSQVMgPSA3IGN5Y2xlcwkJCQkJCQkJCSovCisjZGVmaW5lIFRSQVNfOAkJCTB4MDAwMDAyMDAJLyogU0RSQU0gdFJBUyA9IDggY3ljbGVzCQkJCQkJCQkJKi8KKyNkZWZpbmUgVFJBU185CQkJMHgwMDAwMDI0MAkvKiBTRFJBTSB0UkFTID0gOSBjeWNsZXMJCQkJCQkJCQkqLworI2RlZmluZSBUUkFTXzEwCQkJMHgwMDAwMDI4MAkvKiBTRFJBTSB0UkFTID0gMTAgY3ljbGVzCQkJCQkJCQkJKi8KKyNkZWZpbmUgVFJBU18xMQkJCTB4MDAwMDAyQzAJLyogU0RSQU0gdFJBUyA9IDExIGN5Y2xlcwkJCQkJCQkJCSovCisjZGVmaW5lIFRSQVNfMTIJCQkweDAwMDAwMzAwCS8qIFNEUkFNIHRSQVMgPSAxMiBjeWNsZXMJCQkJCQkJCQkqLworI2RlZmluZSBUUkFTXzEzCQkJMHgwMDAwMDM0MAkvKiBTRFJBTSB0UkFTID0gMTMgY3ljbGVzCQkJCQkJCQkJKi8KKyNkZWZpbmUgVFJBU18xNAkJCTB4MDAwMDAzODAJLyogU0RSQU0gdFJBUyA9IDE0IGN5Y2xlcwkJCQkJCQkJCSovCisjZGVmaW5lIFRSQVNfMTUJCQkweDAwMDAwM0MwCS8qIFNEUkFNIHRSQVMgPSAxNSBjeWNsZXMJCQkJCQkJCQkqLworI2RlZmluZSBUUlBfMQkJCTB4MDAwMDA4MDAJLyogU0RSQU0gdFJQID0gMSBjeWNsZQkJCQkJCQkJCQkqLworI2RlZmluZSBUUlBfMgkJCTB4MDAwMDEwMDAJLyogU0RSQU0gdFJQID0gMiBjeWNsZXMJCQkJCQkJCQkJKi8KKyNkZWZpbmUgVFJQXzMJCQkweDAwMDAxODAwCS8qIFNEUkFNIHRSUCA9IDMgY3ljbGVzCQkJCQkJCQkJCSovCisjZGVmaW5lIFRSUF80CQkJMHgwMDAwMjAwMAkvKiBTRFJBTSB0UlAgPSA0IGN5Y2xlcwkJCQkJCQkJCQkqLworI2RlZmluZSBUUlBfNQkJCTB4MDAwMDI4MDAJLyogU0RSQU0gdFJQID0gNSBjeWNsZXMJCQkJCQkJCQkJKi8KKyNkZWZpbmUgVFJQXzYJCQkweDAwMDAzMDAwCS8qIFNEUkFNIHRSUCA9IDYgY3ljbGVzCQkJCQkJCQkJCSovCisjZGVmaW5lIFRSUF83CQkJMHgwMDAwMzgwMAkvKiBTRFJBTSB0UlAgPSA3IGN5Y2xlcwkJCQkJCQkJCQkqLworI2RlZmluZSBUUkNEXzEJCQkweDAwMDA4MDAwCS8qIFNEUkFNIHRSQ0QgPSAxIGN5Y2xlCQkJCQkJCQkJCSovCisjZGVmaW5lIFRSQ0RfMgkJCTB4MDAwMTAwMDAJLyogU0RSQU0gdFJDRCA9IDIgY3ljbGVzCQkJCQkJCQkJKi8KKyNkZWZpbmUgVFJDRF8zCQkJMHgwMDAxODAwMAkvKiBTRFJBTSB0UkNEID0gMyBjeWNsZXMJCQkJCQkJCQkqLworI2RlZmluZSBUUkNEXzQJCQkweDAwMDIwMDAwCS8qIFNEUkFNIHRSQ0QgPSA0IGN5Y2xlcwkJCQkJCQkJCSovCisjZGVmaW5lIFRSQ0RfNQkJCTB4MDAwMjgwMDAJLyogU0RSQU0gdFJDRCA9IDUgY3ljbGVzCQkJCQkJCQkJKi8KKyNkZWZpbmUgVFJDRF82CQkJMHgwMDAzMDAwMAkvKiBTRFJBTSB0UkNEID0gNiBjeWNsZXMJCQkJCQkJCQkqLworI2RlZmluZSBUUkNEXzcJCQkweDAwMDM4MDAwCS8qIFNEUkFNIHRSQ0QgPSA3IGN5Y2xlcwkJCQkJCQkJCSovCisjZGVmaW5lIFRXUl8xCQkJMHgwMDA4MDAwMAkvKiBTRFJBTSB0V1IgPSAxIGN5Y2xlCQkJCQkJCQkJCSovCisjZGVmaW5lIFRXUl8yCQkJMHgwMDEwMDAwMAkvKiBTRFJBTSB0V1IgPSAyIGN5Y2xlcwkJCQkJCQkJCQkqLworI2RlZmluZSBUV1JfMwkJCTB4MDAxODAwMDAJLyogU0RSQU0gdFdSID0gMyBjeWNsZXMJCQkJCQkJCQkJKi8KKyNkZWZpbmUgUFVQU0QJCQkweDAwMjAwMDAwCS8qIFBvd2VyLVVwIFN0YXJ0IERlbGF5ICgxNSBTQ0xLIEN5Y2xlcyBEZWxheSkJCQkJKi8KKyNkZWZpbmUgUFNNCQkJCTB4MDA0MDAwMDAJLyogUG93ZXItVXAgU2VxdWVuY2UgKE1vZGUgUmVnaXN0ZXIgQmVmb3JlL0FmdGVyKiBSZWZyZXNoKQkqLworI2RlZmluZSBQU1MJCQkJMHgwMDgwMDAwMAkvKiBFbmFibGUgUG93ZXItVXAgU2VxdWVuY2Ugb24gTmV4dCBTRFJBTSBBY2Nlc3MJCQkqLworI2RlZmluZSBTUkZTCQkJMHgwMTAwMDAwMAkvKiBFbmFibGUgU0RSQU0gU2VsZi1SZWZyZXNoIE1vZGUJCQkJCQkJKi8KKyNkZWZpbmUgRUJVRkUJCQkweDAyMDAwMDAwCS8qIEVuYWJsZSBFeHRlcm5hbCBCdWZmZXJpbmcgVGltaW5nCQkJCQkJCSovCisjZGVmaW5lIEZCQlJXCQkJMHgwNDAwMDAwMAkvKiBFbmFibGUgRmFzdCBCYWNrLVRvLUJhY2sgUmVhZCBUbyBXcml0ZQkJCQkJKi8KKyNkZWZpbmUgRU1SRU4JCQkweDEwMDAwMDAwCS8qIEV4dGVuZGVkIE1vZGUgUmVnaXN0ZXIgRW5hYmxlCQkJCQkJCSovCisjZGVmaW5lIFRDU1IJCQkweDIwMDAwMDAwCS8qIFRlbXAtQ29tcGVuc2F0ZWQgU2VsZi1SZWZyZXNoIFZhbHVlICg4NS80NSogRGVnIEMpCQkqLworI2RlZmluZSBDRERCRwkJCTB4NDAwMDAwMDAJLyogVHJpc3RhdGUgU0RSQU0gQ29udHJvbHMgRHVyaW5nIEJ1cyBHcmFudAkJCQkJKi8KKworLyogRUJJVV9TREJDVEwgTWFza3MJCQkJCQkJCQkJCQkJCQkJCQkqLworI2RlZmluZSBFQkUJCQkJMHgwMDAxCQkvKiBFbmFibGUgU0RSQU0gRXh0ZXJuYWwgQmFuawkJCQkJCQkqLworI2RlZmluZSBFQlNaXzE2CQkJMHgwMDAwCQkvKiBTRFJBTSBFeHRlcm5hbCBCYW5rIFNpemUgPSAxNk1CCSovCisjZGVmaW5lIEVCU1pfMzIJCQkweDAwMDIJCS8qIFNEUkFNIEV4dGVybmFsIEJhbmsgU2l6ZSA9IDMyTUIJKi8KKyNkZWZpbmUgRUJTWl82NAkJCTB4MDAwNAkJLyogU0RSQU0gRXh0ZXJuYWwgQmFuayBTaXplID0gNjRNQgkqLworI2RlZmluZSBFQlNaXzEyOAkJMHgwMDA2CQkvKiBTRFJBTSBFeHRlcm5hbCBCYW5rIFNpemUgPSAxMjhNQgkJKi8KKyNkZWZpbmUgRUJTWl8yNTYJCTB4MDAwOAkJLyogU0RSQU0gRXh0ZXJuYWwgQmFuayBTaXplID0gMjU2TUIgCSovCisjZGVmaW5lIEVCU1pfNTEyCQkweDAwMEEJCS8qIFNEUkFNIEV4dGVybmFsIEJhbmsgU2l6ZSA9IDUxMk1CCQkqLworI2RlZmluZSBFQkNBV184CQkJMHgwMDAwCQkvKiBTRFJBTSBFeHRlcm5hbCBCYW5rIENvbHVtbiBBZGRyZXNzIFdpZHRoID0gOCBCaXRzCSovCisjZGVmaW5lIEVCQ0FXXzkJCQkweDAwMTAJCS8qIFNEUkFNIEV4dGVybmFsIEJhbmsgQ29sdW1uIEFkZHJlc3MgV2lkdGggPSA5IEJpdHMJKi8KKyNkZWZpbmUgRUJDQVdfMTAJCTB4MDAyMAkJLyogU0RSQU0gRXh0ZXJuYWwgQmFuayBDb2x1bW4gQWRkcmVzcyBXaWR0aCA9IDEwIEJpdHMJKi8KKyNkZWZpbmUgRUJDQVdfMTEJCTB4MDAzMAkJLyogU0RSQU0gRXh0ZXJuYWwgQmFuayBDb2x1bW4gQWRkcmVzcyBXaWR0aCA9IDExIEJpdHMJKi8KKworLyogRUJJVV9TRFNUQVQgTWFza3MJCQkJCQkJCQkJCQkJCSovCisjZGVmaW5lIFNEQ0kJCQkweDAwMDEJCS8qIFNEUkFNIENvbnRyb2xsZXIgSWRsZSAJCQkJKi8KKyNkZWZpbmUgU0RTUkEJCQkweDAwMDIJCS8qIFNEUkFNIFNlbGYtUmVmcmVzaCBBY3RpdmUJCQkqLworI2RlZmluZSBTRFBVQQkJCTB4MDAwNAkJLyogU0RSQU0gUG93ZXItVXAgQWN0aXZlIAkJCQkqLworI2RlZmluZSBTRFJTCQkJMHgwMDA4CQkvKiBTRFJBTSBXaWxsIFBvd2VyLVVwIE9uIE5leHQgQWNjZXNzCSovCisjZGVmaW5lIFNERUFTRQkJCTB4MDAxMAkJLyogU0RSQU0gRUFCIFN0aWNreSBFcnJvciBTdGF0dXMJCSovCisjZGVmaW5lIEJHU1RBVAkJCTB4MDAyMAkJLyogQnVzIEdyYW50IFN0YXR1cwkJCQkJCSovCisKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKiogIERNQSBDT05UUk9MTEVSIE1BU0tTICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogRE1BeF9QRVJJUEhFUkFMX01BUCwgTURNQV95eV9QRVJJUEhFUkFMX01BUCBNYXNrcwkJCQkJCQkJKi8KKyNkZWZpbmUgQ1RZUEUJCQkweDAwNDAJLyogRE1BIENoYW5uZWwgVHlwZSBJbmRpY2F0b3IgKE1lbW9yeS9QZXJpcGhlcmFsKikJKi8KKyNkZWZpbmUgUE1BUAkJCTB4RjAwMAkvKiBQZXJpcGhlcmFsIE1hcHBlZCBUbyBUaGlzIENoYW5uZWwJCQkJKi8KKyNkZWZpbmUgUE1BUF9QUEkJCTB4MDAwMAkvKiAJCVBQSSBQb3J0IERNQQkJCQkJCQkJKi8KKyNkZWZpbmUJUE1BUF9FTUFDUlgJCTB4MTAwMAkvKiAJCUV0aGVybmV0IFJlY2VpdmUgRE1BCQkJCQkJKi8KKyNkZWZpbmUgUE1BUF9FTUFDVFgJCTB4MjAwMAkvKiAJCUV0aGVybmV0IFRyYW5zbWl0IERNQQkJCQkJCSovCisjZGVmaW5lIFBNQVBfU1BPUlQwUlgJMHgzMDAwCS8qIAkJU1BPUlQwIFJlY2VpdmUgRE1BCQkJCQkJCSovCisjZGVmaW5lIFBNQVBfU1BPUlQwVFgJMHg0MDAwCS8qIAkJU1BPUlQwIFRyYW5zbWl0IERNQQkJCQkJCQkqLworI2RlZmluZSBQTUFQX1NQT1JUMVJYCTB4NTAwMAkvKiAJCVNQT1JUMSBSZWNlaXZlIERNQQkJCQkJCQkqLworI2RlZmluZSBQTUFQX1NQT1JUMVRYCTB4NjAwMAkvKiAJCVNQT1JUMSBUcmFuc21pdCBETUEJCQkJCQkJKi8KKyNkZWZpbmUgUE1BUF9TUEkJCTB4NzAwMAkvKiAJCVNQSSBQb3J0IERNQQkJCQkJCQkJKi8KKyNkZWZpbmUgUE1BUF9VQVJUMFJYCTB4ODAwMAkvKiAJCVVBUlQwIFBvcnQgUmVjZWl2ZSBETUEJCQkJCQkqLworI2RlZmluZSBQTUFQX1VBUlQwVFgJMHg5MDAwCS8qIAkJVUFSVDAgUG9ydCBUcmFuc21pdCBETUEJCQkJCQkqLworI2RlZmluZQlQTUFQX1VBUlQxUlgJMHhBMDAwCS8qIAkJVUFSVDEgUG9ydCBSZWNlaXZlIERNQQkJCQkJCSovCisjZGVmaW5lCVBNQVBfVUFSVDFUWAkweEIwMDAJLyogCQlVQVJUMSBQb3J0IFRyYW5zbWl0IERNQQkJCQkJCSovCisKKy8qICAqKioqKioqKioqKiogIFBBUkFMTEVMIFBFUklQSEVSQUwgSU5URVJGQUNFIChQUEkpIE1BU0tTICoqKioqKioqKioqKiovCisvKiAgUFBJX0NPTlRST0wgTWFza3MJCQkJCQkJCQkJCQkJKi8KKyNkZWZpbmUgUE9SVF9FTgkJCTB4MDAwMQkJLyogUFBJIFBvcnQgRW5hYmxlCQkJCQkqLworI2RlZmluZSBQT1JUX0RJUgkJMHgwMDAyCQkvKiBQUEkgUG9ydCBEaXJlY3Rpb24JCQkJKi8KKyNkZWZpbmUgWEZSX1RZUEUJCTB4MDAwQwkJLyogUFBJIFRyYW5zZmVyIFR5cGUJCQkJKi8KKyNkZWZpbmUgUE9SVF9DRkcJCTB4MDAzMAkJLyogUFBJIFBvcnQgQ29uZmlndXJhdGlvbgkJCSovCisjZGVmaW5lIEZMRF9TRUwJCQkweDAwNDAJCS8qIFBQSSBBY3RpdmUgRmllbGQgU2VsZWN0CQkJKi8KKyNkZWZpbmUgUEFDS19FTgkJCTB4MDA4MAkJLyogUFBJIFBhY2tpbmcgTW9kZQkJCQkJKi8KKyNkZWZpbmUgRE1BMzIJCQkweDAxMDAJCS8qIFBQSSAzMi1iaXQgRE1BIEVuYWJsZQkJCSovCisjZGVmaW5lIFNLSVBfRU4JCQkweDAyMDAJCS8qIFBQSSBTa2lwIEVsZW1lbnQgRW5hYmxlCQkJKi8KKyNkZWZpbmUgU0tJUF9FTwkJCTB4MDQwMAkJLyogUFBJIFNraXAgRXZlbi9PZGQgRWxlbWVudHMJCSovCisjZGVmaW5lIERMRU5fOAkJCTB4MDAwMAkJLyogRGF0YSBMZW5ndGggPSA4IEJpdHMJCQkJKi8KKyNkZWZpbmUgRExFTl8xMAkJCTB4MDgwMAkJLyogRGF0YSBMZW5ndGggPSAxMCBCaXRzCQkJKi8KKyNkZWZpbmUgRExFTl8xMQkJCTB4MTAwMAkJLyogRGF0YSBMZW5ndGggPSAxMSBCaXRzCQkJKi8KKyNkZWZpbmUgRExFTl8xMgkJCTB4MTgwMAkJLyogRGF0YSBMZW5ndGggPSAxMiBCaXRzCQkJKi8KKyNkZWZpbmUgRExFTl8xMwkJCTB4MjAwMAkJLyogRGF0YSBMZW5ndGggPSAxMyBCaXRzCQkJKi8KKyNkZWZpbmUgRExFTl8xNAkJCTB4MjgwMAkJLyogRGF0YSBMZW5ndGggPSAxNCBCaXRzCQkJKi8KKyNkZWZpbmUgRExFTl8xNQkJCTB4MzAwMAkJLyogRGF0YSBMZW5ndGggPSAxNSBCaXRzCQkJKi8KKyNkZWZpbmUgRExFTl8xNgkJCTB4MzgwMAkJLyogRGF0YSBMZW5ndGggPSAxNiBCaXRzCQkJKi8KKyNkZWZpbmUgRExFTkdUSAkJCTB4MzgwMAkJLyogUFBJIERhdGEgTGVuZ3RoICAqLworI2RlZmluZSBQT0xDCQkJMHg0MDAwCQkvKiBQUEkgQ2xvY2sgUG9sYXJpdHkJCQkJKi8KKyNkZWZpbmUgUE9MUwkJCTB4ODAwMAkJLyogUFBJIEZyYW1lIFN5bmMgUG9sYXJpdHkJCQkqLworCisvKiBQUElfU1RBVFVTIE1hc2tzCQkJCQkJCQkJCQkJCQkqLworI2RlZmluZSBGTEQJCQkJMHgwNDAwCQkvKiBGaWVsZCBJbmRpY2F0b3IJCQkJCSovCisjZGVmaW5lIEZUX0VSUgkJCTB4MDgwMAkJLyogRnJhbWUgVHJhY2sgRXJyb3IJCQkJKi8KKyNkZWZpbmUgT1ZSCQkJCTB4MTAwMAkJLyogRklGTyBPdmVyZmxvdyBFcnJvcgkJCQkqLworI2RlZmluZSBVTkRSCQkJMHgyMDAwCQkvKiBGSUZPIFVuZGVycnVuIEVycm9yCQkJCSovCisjZGVmaW5lIEVSUl9ERVQJCQkweDQwMDAJCS8qIEVycm9yIERldGVjdGVkIEluZGljYXRvcgkJCSovCisjZGVmaW5lIEVSUl9OQ09SCQkweDgwMDAJCS8qIEVycm9yIE5vdCBDb3JyZWN0ZWQgSW5kaWNhdG9yCSovCisKKworLyogICoqKioqKioqKioqKioqKioqKioqICBUV08tV0lSRSBJTlRFUkZBQ0UgKFRXSSkgTUFTS1MgICoqKioqKioqKioqKioqKioqKioqKioqLworLyogVFdJX0NMS0RJViBNYWNyb3MgKFVzZTogKnBUV0lfQ0xLRElWID0gQ0xLTE9XKHgpfENMS0hJKHkpOyAgKQkJCQkqLworI2RlZmluZQlDTEtMT1coeCkJKCh4KSAmIDB4RkYpCQkvKiBQZXJpb2RzIENsb2NrIElzIEhlbGQgTG93CQkJKi8KKyNkZWZpbmUgQ0xLSEkoeSkJKCgoeSkmMHhGRik8PDB4OCkJLyogUGVyaW9kcyBCZWZvcmUgTmV3IENsb2NrIExvdwkJCSovCisKKy8qIFRXSV9QUkVTQ0FMRSBNYXNrcwkJCQkJCQkJCQkJCQkJCSovCisjZGVmaW5lCVBSRVNDQUxFCTB4MDA3RgkJLyogU0NMS3MgUGVyIEludGVybmFsIFRpbWUgUmVmZXJlbmNlICgxME1IeikJKi8KKyNkZWZpbmUJVFdJX0VOQQkJMHgwMDgwCQkvKiBUV0kgRW5hYmxlCQkJCQkJCQkJKi8KKyNkZWZpbmUJU0NDQgkJMHgwMjAwCQkvKiBTQ0NCIENvbXBhdGliaWxpdHkgRW5hYmxlCQkJCQkqLworCisvKiBUV0lfU0xBVkVfQ1RMIE1hc2tzCQkJCQkJCQkJCQkJCQkJKi8KKyNkZWZpbmUJU0VOCQkJMHgwMDAxCQkvKiBTbGF2ZSBFbmFibGUJCQkJCQkJCQkqLworI2RlZmluZQlTQUREX0xFTgkweDAwMDIJCS8qIFNsYXZlIEFkZHJlc3MgTGVuZ3RoCQkJCQkJCSovCisjZGVmaW5lCVNURFZBTAkJMHgwMDA0CQkvKiBTbGF2ZSBUcmFuc21pdCBEYXRhIFZhbGlkCQkJCQkqLworI2RlZmluZQlOQUsJCQkweDAwMDgJCS8qIE5BSy9BQ0sqIEdlbmVyYXRlZCBBdCBDb25jbHVzaW9uIE9mIFRyYW5zZmVyICovCisjZGVmaW5lCUdFTgkJCTB4MDAxMAkJLyogR2VuZXJhbCBDYWxsIEFkcnJlc3MgTWF0Y2hpbmcgRW5hYmxlZAkJKi8KKworLyogVFdJX1NMQVZFX1NUQVQgTWFza3MJCQkJCQkJCQkJCQkJCQkqLworI2RlZmluZQlTRElSCQkweDAwMDEJCS8qIFNsYXZlIFRyYW5zZmVyIERpcmVjdGlvbiAoVHJhbnNtaXQvUmVjZWl2ZSopCSovCisjZGVmaW5lIEdDQUxMCQkweDAwMDIJCS8qIEdlbmVyYWwgQ2FsbCBJbmRpY2F0b3IJCQkJCQkqLworCisvKiBUV0lfTUFTVEVSX0NUTCBNYXNrcwkJCQkJCQkJCQkJCQkqLworI2RlZmluZQlNRU4JCQkweDAwMDEJCS8qIE1hc3RlciBNb2RlIEVuYWJsZQkJCQkJCSovCisjZGVmaW5lCU1BRERfTEVOCTB4MDAwMgkJLyogTWFzdGVyIEFkZHJlc3MgTGVuZ3RoCQkJCQkqLworI2RlZmluZQlNRElSCQkweDAwMDQJCS8qIE1hc3RlciBUcmFuc21pdCBEaXJlY3Rpb24gKFJYL1RYKikJCSovCisjZGVmaW5lCUZBU1QJCTB4MDAwOAkJLyogVXNlIEZhc3QgTW9kZSBUaW1pbmcgU3BlY3MJCQkJKi8KKyNkZWZpbmUJU1RPUAkJMHgwMDEwCQkvKiBJc3N1ZSBTdG9wIENvbmRpdGlvbgkJCQkJCSovCisjZGVmaW5lCVJTVEFSVAkJMHgwMDIwCQkvKiBSZXBlYXQgU3RhcnQgb3IgU3RvcCogQXQgRW5kIE9mIFRyYW5zZmVyCSovCisjZGVmaW5lCURDTlQJCTB4M0ZDMAkJLyogRGF0YSBCeXRlcyBUbyBUcmFuc2ZlcgkJCQkJKi8KKyNkZWZpbmUJU0RBT1ZSCQkweDQwMDAJCS8qIFNlcmlhbCBEYXRhIE92ZXJyaWRlCQkJCQkJKi8KKyNkZWZpbmUJU0NMT1ZSCQkweDgwMDAJCS8qIFNlcmlhbCBDbG9jayBPdmVycmlkZQkJCQkJKi8KKworLyogVFdJX01BU1RFUl9TVEFUIE1hc2tzCQkJCQkJCQkJCQkJCQkqLworI2RlZmluZQlNUFJPRwkJMHgwMDAxCQkvKiBNYXN0ZXIgVHJhbnNmZXIgSW4gUHJvZ3Jlc3MJCQkJCSovCisjZGVmaW5lCUxPU1RBUkIJCTB4MDAwMgkJLyogTG9zdCBBcmJpdHJhdGlvbiBJbmRpY2F0b3IgKFhmZXIgQWJvcnRlZCkJKi8KKyNkZWZpbmUJQU5BSwkJMHgwMDA0CQkvKiBBZGRyZXNzIE5vdCBBY2tub3dsZWRnZWQJCQkJCQkqLworI2RlZmluZQlETkFLCQkweDAwMDgJCS8qIERhdGEgTm90IEFja25vd2xlZGdlZAkJCQkJCSovCisjZGVmaW5lCUJVRlJERVJSCTB4MDAxMAkJLyogQnVmZmVyIFJlYWQgRXJyb3IJCQkJCQkJKi8KKyNkZWZpbmUJQlVGV1JFUlIJMHgwMDIwCQkvKiBCdWZmZXIgV3JpdGUgRXJyb3IJCQkJCQkJKi8KKyNkZWZpbmUJU0RBU0VOCQkweDAwNDAJCS8qIFNlcmlhbCBEYXRhIFNlbnNlCQkJCQkJCSovCisjZGVmaW5lCVNDTFNFTgkJMHgwMDgwCQkvKiBTZXJpYWwgQ2xvY2sgU2Vuc2UJCQkJCQkJKi8KKyNkZWZpbmUJQlVTQlVTWQkJMHgwMTAwCQkvKiBCdXMgQnVzeSBJbmRpY2F0b3IJCQkJCQkJKi8KKworLyogVFdJX0lOVF9TUkMgYW5kIFRXSV9JTlRfRU5BQkxFIE1hc2tzCQkJCQkJKi8KKyNkZWZpbmUJU0lOSVQJCTB4MDAwMQkJLyogU2xhdmUgVHJhbnNmZXIgSW5pdGlhdGVkCSovCisjZGVmaW5lCVNDT01QCQkweDAwMDIJCS8qIFNsYXZlIFRyYW5zZmVyIENvbXBsZXRlCSovCisjZGVmaW5lCVNFUlIJCTB4MDAwNAkJLyogU2xhdmUgVHJhbnNmZXIgRXJyb3IJCSovCisjZGVmaW5lCVNPVkYJCTB4MDAwOAkJLyogU2xhdmUgT3ZlcmZsb3cJCQkqLworI2RlZmluZQlNQ09NUAkJMHgwMDEwCQkvKiBNYXN0ZXIgVHJhbnNmZXIgQ29tcGxldGUJKi8KKyNkZWZpbmUJTUVSUgkJMHgwMDIwCQkvKiBNYXN0ZXIgVHJhbnNmZXIgRXJyb3IJKi8KKyNkZWZpbmUJWE1UU0VSVgkJMHgwMDQwCQkvKiBUcmFuc21pdCBGSUZPIFNlcnZpY2UJKi8KKyNkZWZpbmUJUkNWU0VSVgkJMHgwMDgwCQkvKiBSZWNlaXZlIEZJRk8gU2VydmljZQkJKi8KKworLyogVFdJX0ZJRk9fQ1RSTCBNYXNrcwkJCQkJCQkJCQkJCSovCisjZGVmaW5lCVhNVEZMVVNICTB4MDAwMQkJLyogVHJhbnNtaXQgQnVmZmVyIEZsdXNoCQkJKi8KKyNkZWZpbmUJUkNWRkxVU0gJMHgwMDAyCQkvKiBSZWNlaXZlIEJ1ZmZlciBGbHVzaAkJCQkqLworI2RlZmluZQlYTVRJTlRMRU4JMHgwMDA0CQkvKiBUcmFuc21pdCBCdWZmZXIgSW50ZXJydXB0IExlbmd0aAkqLworI2RlZmluZQlSQ1ZJTlRMRU4JMHgwMDA4CQkvKiBSZWNlaXZlIEJ1ZmZlciBJbnRlcnJ1cHQgTGVuZ3RoCSovCisKKy8qIFRXSV9GSUZPX1NUQVQgTWFza3MJCQkJCQkJCQkJCQkJCQkqLworI2RlZmluZQlYTVRTVEFUCQkweDAwMDMJCS8qIFRyYW5zbWl0IEZJRk8gU3RhdHVzCQkJCQkJCSovCisjZGVmaW5lCVhNVF9FTVBUWQkweDAwMDAJCS8qIAkJVHJhbnNtaXQgRklGTyBFbXB0eQkJCQkJCSovCisjZGVmaW5lCVhNVF9IQUxGCTB4MDAwMQkJLyogCQlUcmFuc21pdCBGSUZPIEhhcyAxIEJ5dGUgVG8gV3JpdGUJCSovCisjZGVmaW5lCVhNVF9GVUxMCTB4MDAwMwkJLyogCQlUcmFuc21pdCBGSUZPIEZ1bGwgKDIgQnl0ZXMgVG8gV3JpdGUpCSovCisKKyNkZWZpbmUJUkNWU1RBVAkJMHgwMDBDCQkvKiBSZWNlaXZlIEZJRk8gU3RhdHVzCQkJCQkJCSovCisjZGVmaW5lCVJDVl9FTVBUWQkweDAwMDAJCS8qIAkJUmVjZWl2ZSBGSUZPIEVtcHR5CQkJCQkJKi8KKyNkZWZpbmUJUkNWX0hBTEYJMHgwMDA0CQkvKiAJCVJlY2VpdmUgRklGTyBIYXMgMSBCeXRlIFRvIFJlYWQJCQkqLworI2RlZmluZQlSQ1ZfRlVMTAkweDAwMEMJCS8qIAkJUmVjZWl2ZSBGSUZPIEZ1bGwgKDIgQnl0ZXMgVG8gUmVhZCkJCSovCisKKworLyogT21pdCBDQU4gbWFza3MgZnJvbSBkZWZCRjUzNC5oICovCisKKy8qICAqKioqKioqKioqKioqKioqKioqICBQSU4gQ09OVFJPTCBSRUdJU1RFUiBNQVNLUyAgKioqKioqKioqKioqKioqKioqKioqKioqLworLyogUE9SVF9NVVggTWFza3MJCQkJCQkJCQkJCQkJCQkqLworI2RlZmluZQlQSlNFCQkJMHgwMDAxCQkJLyogUG9ydCBKIFNQSS9TUE9SVCBFbmFibGUJCQkqLworI2RlZmluZQlQSlNFX1NQT1JUCQkweDAwMDAJCQkvKiAJCUVuYWJsZSBURlMwL0RUMFBSSQkJCSovCisjZGVmaW5lCVBKU0VfU1BJCQkweDAwMDEJCQkvKiAJCUVuYWJsZSBTUElfU1NFTDM6MgkJCSovCisKKyNkZWZpbmUJUEpDRSh4KQkJCSgoKHgpJjB4Myk8PDEpCS8qIFBvcnQgSiBDQU4vU1BJL1NQT1JUIEVuYWJsZQkJKi8KKyNkZWZpbmUJUEpDRV9TUE9SVAkJMHgwMDAwCQkJLyogCQlFbmFibGUgRFIwU0VDL0RUMFNFQwkJKi8KKyNkZWZpbmUJUEpDRV9DQU4JCTB4MDAwMgkJCS8qIAkJRW5hYmxlIENBTiBSWC9UWAkJCSovCisjZGVmaW5lCVBKQ0VfU1BJCQkweDAwMDQJCQkvKiAJCUVuYWJsZSBTUElfU1NFTDcJCQkqLworCisjZGVmaW5lCVBGREUJCQkweDAwMDgJCQkvKiBQb3J0IEYgRE1BIFJlcXVlc3QgRW5hYmxlCQkqLworI2RlZmluZQlQRkRFX1VBUlQJCTB4MDAwMAkJCS8qIAkJRW5hYmxlIFVBUlQwIFJYL1RYCQkJKi8KKyNkZWZpbmUJUEZERV9ETUEJCTB4MDAwOAkJCS8qIAkJRW5hYmxlIERNQVIxOjAJCQkJKi8KKworI2RlZmluZQlQRlRFCQkJMHgwMDEwCQkJLyogUG9ydCBGIFRpbWVyIEVuYWJsZQkJCQkqLworI2RlZmluZQlQRlRFX1VBUlQJCTB4MDAwMAkJCS8qCQlFbmFibGUgVUFSVDEgUlgvVFgJCQkqLworI2RlZmluZQlQRlRFX1RJTUVSCQkweDAwMTAJCQkvKiAJCUVuYWJsZSBUTVI3OjYJCQkJKi8KKworI2RlZmluZQlQRlM2RQkJCTB4MDAyMAkJCS8qIFBvcnQgRiBTUEkgU1NFTCA2IEVuYWJsZQkJCSovCisjZGVmaW5lCVBGUzZFX1RJTUVSCQkweDAwMDAJCQkvKgkJRW5hYmxlIFRNUjUJCQkJCSovCisjZGVmaW5lCVBGUzZFX1NQSQkJMHgwMDIwCQkJLyogCQlFbmFibGUgU1BJX1NTRUw2CQkJKi8KKworI2RlZmluZQlQRlM1RQkJCTB4MDA0MAkJCS8qIFBvcnQgRiBTUEkgU1NFTCA1IEVuYWJsZQkJCSovCisjZGVmaW5lCVBGUzVFX1RJTUVSCQkweDAwMDAJCQkvKgkJRW5hYmxlIFRNUjQJCQkJCSovCisjZGVmaW5lCVBGUzVFX1NQSQkJMHgwMDQwCQkJLyogCQlFbmFibGUgU1BJX1NTRUw1CQkJKi8KKworI2RlZmluZQlQRlM0RQkJCTB4MDA4MAkJCS8qIFBvcnQgRiBTUEkgU1NFTCA0IEVuYWJsZQkJCSovCisjZGVmaW5lCVBGUzRFX1RJTUVSCQkweDAwMDAJCQkvKgkJRW5hYmxlIFRNUjMJCQkJCSovCisjZGVmaW5lCVBGUzRFX1NQSQkJMHgwMDgwCQkJLyogCQlFbmFibGUgU1BJX1NTRUw0CQkJKi8KKworI2RlZmluZQlQRkZFCQkJMHgwMTAwCQkJLyogUG9ydCBGIFBQSSBGcmFtZSBTeW5jIEVuYWJsZQkJKi8KKyNkZWZpbmUJUEZGRV9USU1FUgkJMHgwMDAwCQkJLyogCQlFbmFibGUgVE1SMgkJCQkJKi8KKyNkZWZpbmUJUEZGRV9QUEkJCTB4MDEwMAkJCS8qIAkJRW5hYmxlIFBQSSBGUzMJCQkJKi8KKworI2RlZmluZQlQR1NFCQkJMHgwMjAwCQkJLyogUG9ydCBHIFNQT1JUMSBTZWNvbmRhcnkgRW5hYmxlCSovCisjZGVmaW5lCVBHU0VfUFBJCQkweDAwMDAJCQkvKiAJCUVuYWJsZSBQUEkgRDk6OAkJCQkqLworI2RlZmluZQlQR1NFX1NQT1JUCQkweDAyMDAJCQkvKiAJCUVuYWJsZSBEUjFTRUMvRFQxU0VDCQkqLworCisjZGVmaW5lCVBHUkUJCQkweDA0MDAJCQkvKiBQb3J0IEcgU1BPUlQxIFJlY2VpdmUgRW5hYmxlCQkqLworI2RlZmluZQlQR1JFX1BQSQkJMHgwMDAwCQkJLyogCQlFbmFibGUgUFBJIEQxMjoxMAkJCSovCisjZGVmaW5lCVBHUkVfU1BPUlQJCTB4MDQwMAkJCS8qIAkJRW5hYmxlIERSMVBSSS9SRlMxL1JTQ0xLMQkqLworCisjZGVmaW5lCVBHVEUJCQkweDA4MDAJCQkvKiBQb3J0IEcgU1BPUlQxIFRyYW5zbWl0IEVuYWJsZQkqLworI2RlZmluZQlQR1RFX1BQSQkJMHgwMDAwCQkJLyogCQlFbmFibGUgUFBJIEQxNToxMwkJCSovCisjZGVmaW5lCVBHVEVfU1BPUlQJCTB4MDgwMAkJCS8qIAkJRW5hYmxlIERUMVBSSS9URlMxL1RTQ0xLMQkqLworCisKKy8qICAqKioqKioqKioqKioqKioqKiogIEhBTkRTSEFLRSBETUEgKEhETUEpIE1BU0tTICAqKioqKioqKioqKioqKioqKioqKiovCisvKiBIRE1BeF9DVEwgTWFza3MJCQkJCQkJCQkJCQkJCSovCisjZGVmaW5lCUhNRE1BRU4JCTB4MDAwMQkvKiBFbmFibGUgSGFuZHNoYWtlIERNQSAwLzEJCQkJCSovCisjZGVmaW5lCVJFUAkJCTB4MDAwMgkvKiBIRE1BIFJlcXVlc3QgUG9sYXJpdHkJCQkJCSovCisjZGVmaW5lCVVURQkJCTB4MDAwNAkvKiBVcmdlbmN5IFRocmVzaG9sZCBFbmFibGUJCQkJCSovCisjZGVmaW5lCU9JRQkJCTB4MDAxMAkvKiBPdmVyZmxvdyBJbnRlcnJ1cHQgRW5hYmxlCQkJCSovCisjZGVmaW5lCUJESUUJCTB4MDAyMAkvKiBCbG9jayBEb25lIEludGVycnVwdCBFbmFibGUJCQkJKi8KKyNkZWZpbmUJTUJESQkJMHgwMDQwCS8qIE1hc2sgQmxvY2sgRG9uZSBJUlEgSWYgUGVuZGluZyBFQ05UCQkqLworI2RlZmluZQlEUlEJCQkweDAzMDAJLyogSERNQSBSZXF1ZXN0IFR5cGUJCQkJCQkqLworI2RlZmluZQlEUlFfTk9ORQkweDAwMDAJLyogCQlObyBSZXF1ZXN0CQkJCQkJCSovCisjZGVmaW5lCURSUV9TSU5HTEUJMHgwMTAwCS8qIAkJQ2hhbm5lbHMgUmVxdWVzdCBTaW5nbGUJCQkJKi8KKyNkZWZpbmUJRFJRX01VTFRJCTB4MDIwMAkvKiAJCUNoYW5uZWxzIFJlcXVlc3QgTXVsdGkgKERlZmF1bHQpCSovCisjZGVmaW5lCURSUV9VUkdFTlQJMHgwMzAwCS8qIAkJQ2hhbm5lbHMgUmVxdWVzdCBNdWx0aSBVcmdlbnQJCSovCisjZGVmaW5lCVJCQwkJCTB4MTAwMAkvKiBSZWxvYWQgQkNOVCBXaXRoIElCQ05UCQkJCQkqLworI2RlZmluZQlQUwkJCTB4MjAwMAkvKiBIRE1BIFBpbiBTdGF0dXMJCQkJCQkJKi8KKyNkZWZpbmUJT0kJCQkweDQwMDAJLyogT3ZlcmZsb3cgSW50ZXJydXB0IEdlbmVyYXRlZAkJCQkqLworI2RlZmluZQlCREkJCQkweDgwMDAJLyogQmxvY2sgRG9uZSBJbnRlcnJ1cHQgR2VuZXJhdGVkCQkJKi8KKworLyogZW50cnkgYWRkcmVzc2VzIG9mIHRoZSB1c2VyLWNhbGxhYmxlIEJvb3QgUk9NIGZ1bmN0aW9ucyAqLworCisjZGVmaW5lIF9CT09UUk9NX1JFU0VUIDB4RUYwMDAwMDAKKyNkZWZpbmUgX0JPT1RST01fRklOQUxfSU5JVCAweEVGMDAwMDAyCisjZGVmaW5lIF9CT09UUk9NX0RPX01FTU9SWV9ETUEgMHhFRjAwMDAwNgorI2RlZmluZSBfQk9PVFJPTV9CT09UX0RYRV9GTEFTSCAweEVGMDAwMDA4CisjZGVmaW5lIF9CT09UUk9NX0JPT1RfRFhFX1NQSSAweEVGMDAwMDBBCisjZGVmaW5lIF9CT09UUk9NX0JPT1RfRFhFX1RXSSAweEVGMDAwMDBDCisjZGVmaW5lIF9CT09UUk9NX0dFVF9EWEVfQUREUkVTU19GTEFTSCAweEVGMDAwMDEwCisjZGVmaW5lIF9CT09UUk9NX0dFVF9EWEVfQUREUkVTU19TUEkgMHhFRjAwMDAxMgorI2RlZmluZSBfQk9PVFJPTV9HRVRfRFhFX0FERFJFU1NfVFdJIDB4RUYwMDAwMTQKKworLyogQWx0ZXJuYXRlIERlcHJlY2F0ZWQgTWFjcm9zIFByb3ZpZGVkIEZvciBCYWNrd2FyZHMgQ29kZSBDb21wYXRpYmlsaXR5ICovCisjZGVmaW5lCVBHREVfVUFSVCAgIFBGREVfVUFSVAorI2RlZmluZQlQR0RFX0RNQSAgICBQRkRFX0RNQQorI2RlZmluZQlDS0VMT1cJCVNDS0VMT1cKKworLyogPT09PSBlbmQgZnJvbSBkZWZCRjUzNC5oID09PT0gKi8KKworLyogSE9TVCBQb3J0IFJlZ2lzdGVycyAqLworCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgSE9TVF9DT05UUk9MICAweGZmYzAzNDAwICAgLyogSE9TVCBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgIEhPU1RfU1RBVFVTICAweGZmYzAzNDA0ICAgLyogSE9TVCBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICBIT1NUX1RJTUVPVVQgIDB4ZmZjMDM0MDggICAvKiBIT1NUIEFja25vd2xlZGdlIE1vZGUgVGltZW91dCBSZWdpc3RlciAqLworCisvKiBDb3VudGVyIFJlZ2lzdGVycyAqLworCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICBDTlRfQ09ORklHICAweGZmYzAzNTAwICAgLyogQ29uZmlndXJhdGlvbiBSZWdpc3RlciAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgIENOVF9JTUFTSyAgMHhmZmMwMzUwNCAgIC8qIEludGVycnVwdCBNYXNrIFJlZ2lzdGVyICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICBDTlRfU1RBVFVTICAweGZmYzAzNTA4ICAgLyogU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgIENOVF9DT01NQU5EICAweGZmYzAzNTBjICAgLyogQ29tbWFuZCBSZWdpc3RlciAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgIENOVF9ERUJPVU5DRSAgMHhmZmMwMzUxMCAgIC8qIERlYm91bmNlIFJlZ2lzdGVyICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgIENOVF9DT1VOVEVSICAweGZmYzAzNTE0ICAgLyogQ291bnRlciBSZWdpc3RlciAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgICAgQ05UX01BWCAgMHhmZmMwMzUxOCAgIC8qIE1heGltYWwgQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgICAgIENOVF9NSU4gIDB4ZmZjMDM1MWMgICAvKiBNaW5pbWFsIENvdW50IFJlZ2lzdGVyICovCisKKy8qIE9UUC9GVVNFIFJlZ2lzdGVycyAqLworCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgIE9UUF9DT05UUk9MICAweGZmYzAzNjAwICAgLyogT1RQL0Z1c2UgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgICAgT1RQX0JFTiAgMHhmZmMwMzYwNCAgIC8qIE9UUC9GdXNlIEJ5dGUgRW5hYmxlICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICBPVFBfU1RBVFVTICAweGZmYzAzNjA4ICAgLyogT1RQL0Z1c2UgU3RhdHVzICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICBPVFBfVElNSU5HICAweGZmYzAzNjBjICAgLyogT1RQL0Z1c2UgQWNjZXNzIFRpbWluZyAqLworCisvKiBTZWN1cml0eSBSZWdpc3RlcnMgKi8KKworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgU0VDVVJFX1NZU1NXVCAgMHhmZmMwMzYyMCAgIC8qIFNlY3VyZSBTeXN0ZW0gU3dpdGNoZXMgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgU0VDVVJFX0NPTlRST0wgIDB4ZmZjMDM2MjQgICAvKiBTZWN1cmUgQ29udHJvbCAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgU0VDVVJFX1NUQVRVUyAgMHhmZmMwMzYyOCAgIC8qIFNlY3VyZSBTdGF0dXMgKi8KKworLyogT1RQIFJlYWQvV3JpdGUgRGF0YSBCdWZmZXIgUmVnaXN0ZXJzICovCisKKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgICBPVFBfREFUQTAgIDB4ZmZjMDM2ODAgICAvKiBPVFAvRnVzZSBEYXRhIChPVFBfREFUQTAtMykgYWNjZXNzZXMgdGhlIGZ1c2UgcmVhZCB3cml0ZSBidWZmZXIgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgICBPVFBfREFUQTEgIDB4ZmZjMDM2ODQgICAvKiBPVFAvRnVzZSBEYXRhIChPVFBfREFUQTAtMykgYWNjZXNzZXMgdGhlIGZ1c2UgcmVhZCB3cml0ZSBidWZmZXIgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgICBPVFBfREFUQTIgIDB4ZmZjMDM2ODggICAvKiBPVFAvRnVzZSBEYXRhIChPVFBfREFUQTAtMykgYWNjZXNzZXMgdGhlIGZ1c2UgcmVhZCB3cml0ZSBidWZmZXIgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgICBPVFBfREFUQTMgIDB4ZmZjMDM2OGMgICAvKiBPVFAvRnVzZSBEYXRhIChPVFBfREFUQTAtMykgYWNjZXNzZXMgdGhlIGZ1c2UgcmVhZCB3cml0ZSBidWZmZXIgKi8KKworLyogTkZDIFJlZ2lzdGVycyAqLworCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICAgICBORkNfQ1RMICAweGZmYzAzNzAwICAgLyogTkFORCBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICAgIE5GQ19TVEFUICAweGZmYzAzNzA0ICAgLyogTkFORCBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgTkZDX0lSUVNUQVQgIDB4ZmZjMDM3MDggICAvKiBOQU5EIEludGVycnVwdCBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgTkZDX0lSUU1BU0sgIDB4ZmZjMDM3MGMgICAvKiBOQU5EIEludGVycnVwdCBNYXNrIFJlZ2lzdGVyICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICAgIE5GQ19FQ0MwICAweGZmYzAzNzEwICAgLyogTkFORCBFQ0MgUmVnaXN0ZXIgMCAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgICBORkNfRUNDMSAgMHhmZmMwMzcxNCAgIC8qIE5BTkQgRUNDIFJlZ2lzdGVyIDEgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgICAgTkZDX0VDQzIgIDB4ZmZjMDM3MTggICAvKiBOQU5EIEVDQyBSZWdpc3RlciAyICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICAgIE5GQ19FQ0MzICAweGZmYzAzNzFjICAgLyogTkFORCBFQ0MgUmVnaXN0ZXIgMyAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgIE5GQ19DT1VOVCAgMHhmZmMwMzcyMCAgIC8qIE5BTkQgRUNDIENvdW50IFJlZ2lzdGVyICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICAgICBORkNfUlNUICAweGZmYzAzNzI0ICAgLyogTkFORCBFQ0MgUmVzZXQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgICBORkNfUEdDVEwgIDB4ZmZjMDM3MjggICAvKiBOQU5EIFBhZ2UgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgICBORkNfUkVBRCAgMHhmZmMwMzcyYyAgIC8qIE5BTkQgUmVhZCBEYXRhIFJlZ2lzdGVyICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICAgIE5GQ19BRERSICAweGZmYzAzNzQwICAgLyogTkFORCBBZGRyZXNzIFJlZ2lzdGVyICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICAgICBORkNfQ01EICAweGZmYzAzNzQ0ICAgLyogTkFORCBDb21tYW5kIFJlZ2lzdGVyICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgIE5GQ19EQVRBX1dSICAweGZmYzAzNzQ4ICAgLyogTkFORCBEYXRhIFdyaXRlIFJlZ2lzdGVyICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgIE5GQ19EQVRBX1JEICAweGZmYzAzNzRjICAgLyogTkFORCBEYXRhIFJlYWQgUmVnaXN0ZXIgKi8KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogICAgIFNJTkdMRSBCSVQgTUFDUk8gUEFJUlMgKGJpdCBtYXNrIGFuZCBuZWdhdGVkIG9uZSkgICAgICAqLworLyogICAgIGFuZCBNVUxUSSBCSVQgUkVBRCBNQUNST1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisvKiBCaXQgbWFza3MgZm9yIEhPU1RfQ09OVFJPTCAqLworCisjZGVmaW5lICAgICAgICAgICAgICAgICAgIEhPU1RfQ05UUl9IT1NUX0VOICAweDEgICAgICAgIC8qIEhvc3QgRW5hYmxlICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgSE9TVF9DTlRSX25IT1NUX0VOICAweDAKKyNkZWZpbmUgICAgICAgICAgICAgICAgICBIT1NUX0NOVFJfSE9TVF9FTkQgIDB4MiAgICAgICAgLyogSG9zdCBFbmRpYW5lc3MgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgIEhPU1RfQ05UUl9uSE9TVF9FTkQgIDB4MAorI2RlZmluZSAgICAgICAgICAgICAgICAgSE9TVF9DTlRSX0RBVEFfU0laRSAgMHg0ICAgICAgICAvKiBEYXRhIFNpemUgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgSE9TVF9DTlRSX25EQVRBX1NJWkUgIDB4MAorI2RlZmluZSAgICAgICAgICAgICAgICAgIEhPU1RfQ05UUl9IT1NUX1JTVCAgMHg4ICAgICAgICAvKiBIb3N0IFJlc2V0ICovCisjZGVmaW5lICAgICAgICAgICAgICAgICBIT1NUX0NOVFJfbkhPU1RfUlNUICAweDAKKyNkZWZpbmUgICAgICAgICAgICAgICAgICBIT1NUX0NOVFJfSFJEWV9PVlIgIDB4MjAgICAgICAgLyogSG9zdCBSZWFkeSBPdmVycmlkZSAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgSE9TVF9DTlRSX25IUkRZX09WUiAgMHgwCisjZGVmaW5lICAgICAgICAgICAgICAgICAgSE9TVF9DTlRSX0lOVF9NT0RFICAweDQwICAgICAgIC8qIEludGVycnVwdCBNb2RlICovCisjZGVmaW5lICAgICAgICAgICAgICAgICBIT1NUX0NOVFJfbklOVF9NT0RFICAweDAKKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICBIT1NUX0NOVFJfQlRfRU4gIDB4ODAgICAgICAgLyogQnVzIFRpbWVvdXQgRW5hYmxlICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgIEhPU1RfQ05UUl8gbkJUX0VOICAweDAKKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgIEhPU1RfQ05UUl9FSFcgIDB4MTAwICAgICAgLyogRW5hYmxlIEhvc3QgV3JpdGUgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgSE9TVF9DTlRSX25FSFcgIDB4MAorI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgSE9TVF9DTlRSX0VIUiAgMHgyMDAgICAgICAvKiBFbmFibGUgSG9zdCBSZWFkICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgIEhPU1RfQ05UUl9uRUhSICAweDAKKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgIEhPU1RfQ05UUl9CRFIgIDB4NDAwICAgICAgLyogQnVyc3QgRE1BIFJlcXVlc3RzICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgIEhPU1RfQ05UUl9uQkRSICAweDAKKworLyogQml0IG1hc2tzIGZvciBIT1NUX1NUQVRVUyAqLworCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgSE9TVF9TVEFUX1JFQURZICAweDEgICAgICAgIC8qIERNQSBSZWFkeSAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgSE9TVF9TVEFUX25SRUFEWSAgMHgwCisjZGVmaW5lICAgICAgICAgICAgICAgICAgSE9TVF9TVEFUX0ZJRk9GVUxMICAweDIgICAgICAgIC8qIEZJRk8gRnVsbCAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgSE9TVF9TVEFUX25GSUZPRlVMTCAgMHgwCisjZGVmaW5lICAgICAgICAgICAgICAgICBIT1NUX1NUQVRfRklGT0VNUFRZICAweDQgICAgICAgIC8qIEZJRk8gRW1wdHkgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgSE9TVF9TVEFUX25GSUZPRU1QVFkgIDB4MAorI2RlZmluZSAgICAgICAgICAgICAgICAgIEhPU1RfU1RBVF9DT01QTEVURSAgMHg4ICAgICAgICAvKiBETUEgQ29tcGxldGUgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgIEhPU1RfU1RBVF9uQ09NUExFVEUgIDB4MAorI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICBIT1NUX1NUQVRfSFNISyAgMHgxMCAgICAgICAvKiBIb3N0IEhhbmRzaGFrZSAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgIEhPU1RfU1RBVF9uSFNISyAgMHgwCisjZGVmaW5lICAgICAgICAgICAgICAgICAgIEhPU1RfU1RBVF9USU1FT1VUICAweDIwICAgICAgIC8qIEhvc3QgVGltZW91dCAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgIEhPU1RfU1RBVF9uVElNRU9VVCAgMHgwCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgIEhPU1RfU1RBVF9ISVJRICAweDQwICAgICAgIC8qIEhvc3QgSW50ZXJydXB0IFJlcXVlc3QgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICBIT1NUX1NUQVRfbkhJUlEgIDB4MAorI2RlZmluZSAgICAgICAgICAgICAgICBIT1NUX1NUQVRfQUxMT1dfQ05GRyAgMHg4MCAgICAgICAvKiBBbGxvdyBOZXcgQ29uZmlndXJhdGlvbiAqLworI2RlZmluZSAgICAgICAgICAgICAgIEhPU1RfU1RBVF9uQUxMT1dfQ05GRyAgMHgwCisjZGVmaW5lICAgICAgICAgICAgICAgICAgIEhPU1RfU1RBVF9ETUFfRElSICAweDEwMCAgICAgIC8qIERNQSBEaXJlY3Rpb24gKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICBIT1NUX1NUQVRfbkRNQV9ESVIgIDB4MAorI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgSE9TVF9TVEFUX0JURSAgMHgyMDAgICAgICAvKiBCdXMgVGltZW91dCBFbmFibGVkICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgIEhPU1RfU1RBVF9uQlRFICAweDAKKyNkZWZpbmUgICAgICAgICAgICAgICBIT1NUX1NUQVRfSE9TVFJEX0RPTkUgIDB4ODAwMCAgICAgLyogSG9zdCBSZWFkIENvbXBsZXRpb24gSW50ZXJydXB0ICovCisjZGVmaW5lICAgICAgICAgICAgICBIT1NUX1NUQVRfbkhPU1RSRF9ET05FICAweDAKKworLyogQml0IG1hc2tzIGZvciBIT1NUX1RJTUVPVVQgKi8KKworI2RlZmluZSAgICAgICAgICAgICBIT1NUX0NPVU5UX1RJTUVPVVQgIDB4N2ZmICAgICAgLyogSG9zdCBUaW1lb3V0IGNvdW50ICovCisKKy8qIEJpdCBtYXNrcyBmb3IgU0VDVVJFX1NZU1NXVCAqLworCisjZGVmaW5lICAgICAgICAgICAgICAgICAgIEVNVURBQkwgIDB4MSAgICAgICAgLyogRW11bGF0aW9uIERpc2FibGUuICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgbkVNVURBQkwgIDB4MAorI2RlZmluZSAgICAgICAgICAgICAgICAgICBSU1REQUJMICAweDIgICAgICAgIC8qIFJlc2V0IERpc2FibGUgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICBuUlNUREFCTCAgMHgwCisjZGVmaW5lICAgICAgICAgICAgICAgICAgIEwxSURBQkwgIDB4MWMgICAgICAgLyogTDEgSW5zdHJ1Y3Rpb24gTWVtb3J5IERpc2FibGUuICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgTDFEQURBQkwgIDB4ZTAgICAgICAgLyogTDEgRGF0YSBCYW5rIEEgTWVtb3J5IERpc2FibGUuICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgTDFEQkRBQkwgIDB4NzAwICAgICAgLyogTDEgRGF0YSBCYW5rIEIgTWVtb3J5IERpc2FibGUuICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgIERNQTBPVlIgIDB4ODAwICAgICAgLyogRE1BMCBNZW1vcnkgQWNjZXNzIE92ZXJyaWRlICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgbkRNQTBPVlIgIDB4MAorI2RlZmluZSAgICAgICAgICAgICAgICAgICBETUExT1ZSICAweDEwMDAgICAgIC8qIERNQTEgTWVtb3J5IEFjY2VzcyBPdmVycmlkZSAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgIG5ETUExT1ZSICAweDAKKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgIEVNVU9WUiAgMHg0MDAwICAgICAvKiBFbXVsYXRpb24gT3ZlcnJpZGUgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgbkVNVU9WUiAgMHgwCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICBPVFBTRU4gIDB4ODAwMCAgICAgLyogT1RQIFNlY3JldHMgRW5hYmxlLiAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICBuT1RQU0VOICAweDAKKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgIEwyREFCTCAgMHg3MDAwMCAgICAvKiBMMiBNZW1vcnkgRGlzYWJsZS4gKi8KKworLyogQml0IG1hc2tzIGZvciBTRUNVUkVfQ09OVFJPTCAqLworCisjZGVmaW5lICAgICAgICAgICAgICAgICAgIFNFQ1VSRTAgIDB4MSAgICAgICAgLyogU0VDVVJFIDAgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICBuU0VDVVJFMCAgMHgwCisjZGVmaW5lICAgICAgICAgICAgICAgICAgIFNFQ1VSRTEgIDB4MiAgICAgICAgLyogU0VDVVJFIDEgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICBuU0VDVVJFMSAgMHgwCisjZGVmaW5lICAgICAgICAgICAgICAgICAgIFNFQ1VSRTIgIDB4NCAgICAgICAgLyogU0VDVVJFIDIgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICBuU0VDVVJFMiAgMHgwCisjZGVmaW5lICAgICAgICAgICAgICAgICAgIFNFQ1VSRTMgIDB4OCAgICAgICAgLyogU0VDVVJFIDMgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICBuU0VDVVJFMyAgMHgwCisKKy8qIEJpdCBtYXNrcyBmb3IgU0VDVVJFX1NUQVRVUyAqLworCisjZGVmaW5lICAgICAgICAgICAgICAgICAgIFNFQ01PREUgIDB4MyAgICAgICAgLyogU2VjdXJlZCBNb2RlIENvbnRyb2wgU3RhdGUgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgIE5NSSAgMHg0ICAgICAgICAvKiBOb24gTWFza2FibGUgSW50ZXJydXB0ICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgIG5OTUkgIDB4MAorI2RlZmluZSAgICAgICAgICAgICAgICAgICBBRlZBTElEICAweDggICAgICAgIC8qIEF1dGhlbnRpY2F0aW9uIEZpcm13YXJlIFZhbGlkICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgbkFGVkFMSUQgIDB4MAorI2RlZmluZSAgICAgICAgICAgICAgICAgICAgQUZFWElUICAweDEwICAgICAgIC8qIEF1dGhlbnRpY2F0aW9uIEZpcm13YXJlIEV4aXQgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgbkFGRVhJVCAgMHgwCisjZGVmaW5lICAgICAgICAgICAgICAgICAgIFNFQ1NUQVQgIDB4ZTAgICAgICAgLyogU2VjdXJlIFN0YXR1cyAqLwogCiAjZW5kaWYgLyogX0RFRl9CRjUyMl9IICovCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvaW5jbHVkZS9tYWNoL2RlZkJGNTI1LmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvaW5jbHVkZS9tYWNoL2RlZkJGNTI1LmgKaW5kZXggYzEzNmY3MC4uY2MzODNhZCAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2luY2x1ZGUvbWFjaC9kZWZCRjUyNS5oCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9pbmNsdWRlL21hY2gvZGVmQkY1MjUuaApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNy0yMDA4IEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqIENvcHlyaWdodCAyMDA3LTIwMTAgQW5hbG9nIERldmljZXMgSW5jLgogICoKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBREkgQlNEIGxpY2Vuc2Ugb3IgdGhlIEdQTC0yIChvciBsYXRlcikKICAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2luY2x1ZGUvbWFjaC9kZWZCRjUyNy5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2luY2x1ZGUvbWFjaC9kZWZCRjUyNy5oCmluZGV4IDRkZDU4ZmIuLjA1MzY5YTkgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9pbmNsdWRlL21hY2gvZGVmQkY1MjcuaAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvaW5jbHVkZS9tYWNoL2RlZkJGNTI3LmgKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDctMjAwOCBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKiBDb3B5cmlnaHQgMjAwNy0yMDEwIEFuYWxvZyBEZXZpY2VzIEluYy4KICAqCiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgQURJIEJTRCBsaWNlbnNlIG9yIHRoZSBHUEwtMiAob3IgbGF0ZXIpCiAgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9pbmNsdWRlL21hY2gvZGVmQkY1MnhfYmFzZS5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2luY2x1ZGUvbWFjaC9kZWZCRjUyeF9iYXNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5NDc1MDMuLjAwMDAwMDAKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2luY2x1ZGUvbWFjaC9kZWZCRjUyeF9iYXNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNTA2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwNy0yMDA4IEFuYWxvZyBEZXZpY2VzIEluYy4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQURJIEJTRCBsaWNlbnNlIG9yIHRoZSBHUEwtMiAob3IgbGF0ZXIpCi0gKi8KLQotI2lmbmRlZiBfREVGX0JGNTJYX0gKLSNkZWZpbmUgX0RFRl9CRjUyWF9ICi0KLQotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLS8qICAgU1lTVEVNICYgTU1SIEFERFJFU1MgREVGSU5JVElPTlMgQ09NTU9OIFRPIEFMTCBBRFNQLUJGNTJ4ICAgICovCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotCi0vKiA9PT09IGJlZ2luIGZyb20gZGVmQkY1MzQuaCA9PT09ICovCi0KLS8qIENsb2NrIGFuZCBTeXN0ZW0gQ29udHJvbAkoMHhGRkMwMDAwMCAtIDB4RkZDMDAwRkYpCQkJCQkJCQkqLwotI2RlZmluZSBQTExfQ1RMCQkJCTB4RkZDMDAwMDAJLyogUExMIENvbnRyb2wgUmVnaXN0ZXIJCQkJCQkqLwotI2RlZmluZSBQTExfRElWCQkJCTB4RkZDMDAwMDQJLyogUExMIERpdmlkZSBSZWdpc3RlcgkJCQkJCSovCi0jZGVmaW5lIFZSX0NUTAkJCQkweEZGQzAwMDA4CS8qIFZvbHRhZ2UgUmVndWxhdG9yIENvbnRyb2wgUmVnaXN0ZXIJCSovCi0jZGVmaW5lIFBMTF9TVEFUCQkJMHhGRkMwMDAwQwkvKiBQTEwgU3RhdHVzIFJlZ2lzdGVyCQkJCQkJKi8KLSNkZWZpbmUgUExMX0xPQ0tDTlQJCQkweEZGQzAwMDEwCS8qIFBMTCBMb2NrIENvdW50IFJlZ2lzdGVyCQkJCQkqLwotI2RlZmluZSBDSElQSUQgICAgICAgIDB4RkZDMDAwMTQgIC8qIERldmljZSBJRCBSZWdpc3RlciAqLwotCi0KLS8qIFN5c3RlbSBJbnRlcnJ1cHQgQ29udHJvbGxlciAoMHhGRkMwMDEwMCAtIDB4RkZDMDAxRkYpCQkJCQkJCSovCi0jZGVmaW5lIFNXUlNUCQkJCTB4RkZDMDAxMDAJLyogU29mdHdhcmUgUmVzZXQgUmVnaXN0ZXIJCQkJCSovCi0jZGVmaW5lIFNZU0NSCQkJCTB4RkZDMDAxMDQJLyogU3lzdGVtIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIJCQkqLwotI2RlZmluZSBTSUNfUlZFQ1QJCQkweEZGQzAwMTA4CS8qIEludGVycnVwdCBSZXNldCBWZWN0b3IgQWRkcmVzcyBSZWdpc3RlcgkqLwotCi0jZGVmaW5lIFNJQ19JTUFTSzAJCQkweEZGQzAwMTBDCS8qIEludGVycnVwdCBNYXNrIFJlZ2lzdGVyCQkJCQkqLwotI2RlZmluZSBTSUNfSUFSMAkJCTB4RkZDMDAxMTAJLyogSW50ZXJydXB0IEFzc2lnbm1lbnQgUmVnaXN0ZXIgMAkJCSovCi0jZGVmaW5lIFNJQ19JQVIxCQkJMHhGRkMwMDExNAkvKiBJbnRlcnJ1cHQgQXNzaWdubWVudCBSZWdpc3RlciAxCQkJKi8KLSNkZWZpbmUgU0lDX0lBUjIJCQkweEZGQzAwMTE4CS8qIEludGVycnVwdCBBc3NpZ25tZW50IFJlZ2lzdGVyIDIJCQkqLwotI2RlZmluZSBTSUNfSUFSMwkJCTB4RkZDMDAxMUMJLyogSW50ZXJydXB0IEFzc2lnbm1lbnQgUmVnaXN0ZXIgMwkJCSovCi0jZGVmaW5lIFNJQ19JU1IwCQkJCTB4RkZDMDAxMjAJLyogSW50ZXJydXB0IFN0YXR1cyBSZWdpc3RlcgkJCQkqLwotI2RlZmluZSBTSUNfSVdSMAkJCQkweEZGQzAwMTI0CS8qIEludGVycnVwdCBXYWtldXAgUmVnaXN0ZXIJCQkJKi8KLQotLyogU0lDIEFkZGl0aW9ucyB0byBBRFNQLUJGNTJ4ICgweEZGQzAwMTRDIC0gMHhGRkMwMDE2MikgKi8KLSNkZWZpbmUgU0lDX0lNQVNLMSAgICAgICAgICAgICAgICAgICAgICAweEZGQzAwMTRDICAgICAvKiBJbnRlcnJ1cHQgTWFzayByZWdpc3RlciBvZiBTSUMyICovCi0jZGVmaW5lIFNJQ19JQVI0ICAgICAgICAgICAgICAgICAgICAgICAgMHhGRkMwMDE1MCAgICAgLyogSW50ZXJydXB0IEFzc2lnbm1lbnQgcmVnaXN0ZXI0ICovCi0jZGVmaW5lIFNJQ19JQVI1ICAgICAgICAgICAgICAgICAgICAgICAgMHhGRkMwMDE1NCAgICAgLyogSW50ZXJydXB0IEFzc2lnbm1lbnQgcmVnaXN0ZXI1ICovCi0jZGVmaW5lIFNJQ19JQVI2ICAgICAgICAgICAgICAgICAgICAgICAgMHhGRkMwMDE1OCAgICAgLyogSW50ZXJydXB0IEFzc2lnbm1lbnQgcmVnaXN0ZXI2ICovCi0jZGVmaW5lIFNJQ19JQVI3ICAgICAgICAgICAgICAgICAgICAgICAgMHhGRkMwMDE1QyAgICAgLyogSW50ZXJydXB0IEFzc2lnbm1lbnQgcmVnaXN0ZXI3ICovCi0jZGVmaW5lIFNJQ19JU1IxICAgICAgICAgICAgICAgICAgICAgICAgMHhGRkMwMDE2MCAgICAgLyogSW50ZXJydXB0IFN0YXR1ciByZWdpc3RlciAqLwotI2RlZmluZSBTSUNfSVdSMSAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZDMDAxNjQgICAgIC8qIEludGVycnVwdCBXYWtldXAgcmVnaXN0ZXIgKi8KLQotCi0vKiBXYXRjaGRvZyBUaW1lcgkJCSgweEZGQzAwMjAwIC0gMHhGRkMwMDJGRikJCQkJCQkJCSovCi0jZGVmaW5lIFdET0dfQ1RMCQkJMHhGRkMwMDIwMAkvKiBXYXRjaGRvZyBDb250cm9sIFJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIFdET0dfQ05UCQkJMHhGRkMwMDIwNAkvKiBXYXRjaGRvZyBDb3VudCBSZWdpc3RlcgkJCQkJKi8KLSNkZWZpbmUgV0RPR19TVEFUCQkJMHhGRkMwMDIwOAkvKiBXYXRjaGRvZyBTdGF0dXMgUmVnaXN0ZXIJCQkJCSovCi0KLQotLyogUmVhbCBUaW1lIENsb2NrCQkoMHhGRkMwMDMwMCAtIDB4RkZDMDAzRkYpCQkJCQkJCQkJKi8KLSNkZWZpbmUgUlRDX1NUQVQJCQkweEZGQzAwMzAwCS8qIFJUQyBTdGF0dXMgUmVnaXN0ZXIJCQkJCQkqLwotI2RlZmluZSBSVENfSUNUTAkJCTB4RkZDMDAzMDQJLyogUlRDIEludGVycnVwdCBDb250cm9sIFJlZ2lzdGVyCQkJKi8KLSNkZWZpbmUgUlRDX0lTVEFUCQkJMHhGRkMwMDMwOAkvKiBSVEMgSW50ZXJydXB0IFN0YXR1cyBSZWdpc3RlcgkJCSovCi0jZGVmaW5lIFJUQ19TV0NOVAkJCTB4RkZDMDAzMEMJLyogUlRDIFN0b3B3YXRjaCBDb3VudCBSZWdpc3RlcgkJCQkqLwotI2RlZmluZSBSVENfQUxBUk0JCQkweEZGQzAwMzEwCS8qIFJUQyBBbGFybSBUaW1lIFJlZ2lzdGVyCQkJCQkqLwotI2RlZmluZSBSVENfRkFTVAkJCTB4RkZDMDAzMTQJLyogUlRDIFByZXNjYWxlciBFbmFibGUgUmVnaXN0ZXIJCQkqLwotI2RlZmluZSBSVENfUFJFTgkJCTB4RkZDMDAzMTQJLyogUlRDIFByZXNjYWxlciBFbmFibGUgQWx0ZXJuYXRlIE1hY3JvCQkqLwotCi0KLS8qIFVBUlQwIENvbnRyb2xsZXIJCSgweEZGQzAwNDAwIC0gMHhGRkMwMDRGRikJCQkJCQkJCQkqLwotI2RlZmluZSBVQVJUMF9USFIJCQkweEZGQzAwNDAwCS8qIFRyYW5zbWl0IEhvbGRpbmcgcmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgVUFSVDBfUkJSCQkJMHhGRkMwMDQwMAkvKiBSZWNlaXZlIEJ1ZmZlciByZWdpc3RlcgkJCQkJKi8KLSNkZWZpbmUgVUFSVDBfRExMCQkJMHhGRkMwMDQwMAkvKiBEaXZpc29yIExhdGNoIChMb3ctQnl0ZSkJCQkJCSovCi0jZGVmaW5lIFVBUlQwX0lFUgkJCTB4RkZDMDA0MDQJLyogSW50ZXJydXB0IEVuYWJsZSBSZWdpc3RlcgkJCQkqLwotI2RlZmluZSBVQVJUMF9ETEgJCQkweEZGQzAwNDA0CS8qIERpdmlzb3IgTGF0Y2ggKEhpZ2gtQnl0ZSkJCQkJKi8KLSNkZWZpbmUgVUFSVDBfSUlSCQkJMHhGRkMwMDQwOAkvKiBJbnRlcnJ1cHQgSWRlbnRpZmljYXRpb24gUmVnaXN0ZXIJCSovCi0jZGVmaW5lIFVBUlQwX0xDUgkJCTB4RkZDMDA0MEMJLyogTGluZSBDb250cm9sIFJlZ2lzdGVyCQkJCQkqLwotI2RlZmluZSBVQVJUMF9NQ1IJCQkweEZGQzAwNDEwCS8qIE1vZGVtIENvbnRyb2wgUmVnaXN0ZXIJCQkJCSovCi0jZGVmaW5lIFVBUlQwX0xTUgkJCTB4RkZDMDA0MTQJLyogTGluZSBTdGF0dXMgUmVnaXN0ZXIJCQkJCQkqLwotI2RlZmluZSBVQVJUMF9NU1IJCQkweEZGQzAwNDE4CS8qIE1vZGVtIFN0YXR1cyBSZWdpc3RlcgkJCQkJKi8KLSNkZWZpbmUgVUFSVDBfU0NSCQkJMHhGRkMwMDQxQwkvKiBTQ1IgU2NyYXRjaCBSZWdpc3RlcgkJCQkJCSovCi0jZGVmaW5lIFVBUlQwX0dDVEwJCQkweEZGQzAwNDI0CS8qIEdsb2JhbCBDb250cm9sIFJlZ2lzdGVyCQkJCQkqLwotCi0KLS8qIFNQSSBDb250cm9sbGVyCQkJKDB4RkZDMDA1MDAgLSAweEZGQzAwNUZGKQkJCQkJCQkJKi8KLSNkZWZpbmUgU1BJMF9SRUdCQVNFCQkJMHhGRkMwMDUwMAotI2RlZmluZSBTUElfQ1RMCQkJCTB4RkZDMDA1MDAJLyogU1BJIENvbnRyb2wgUmVnaXN0ZXIJCQkJCQkqLwotI2RlZmluZSBTUElfRkxHCQkJCTB4RkZDMDA1MDQJLyogU1BJIEZsYWcgcmVnaXN0ZXIJCQkJCQkqLwotI2RlZmluZSBTUElfU1RBVAkJCTB4RkZDMDA1MDgJLyogU1BJIFN0YXR1cyByZWdpc3RlcgkJCQkJCSovCi0jZGVmaW5lIFNQSV9UREJSCQkJMHhGRkMwMDUwQwkvKiBTUEkgVHJhbnNtaXQgRGF0YSBCdWZmZXIgUmVnaXN0ZXIJCSovCi0jZGVmaW5lIFNQSV9SREJSCQkJMHhGRkMwMDUxMAkvKiBTUEkgUmVjZWl2ZSBEYXRhIEJ1ZmZlciBSZWdpc3RlcgkJCSovCi0jZGVmaW5lIFNQSV9CQVVECQkJMHhGRkMwMDUxNAkvKiBTUEkgQmF1ZCByYXRlIFJlZ2lzdGVyCQkJCQkqLwotI2RlZmluZSBTUElfU0hBRE9XCQkJMHhGRkMwMDUxOAkvKiBTUElfUkRCUiBTaGFkb3cgUmVnaXN0ZXIJCQkJCSovCi0KLQotLyogVElNRVIwLTcgUmVnaXN0ZXJzCQkoMHhGRkMwMDYwMCAtIDB4RkZDMDA2RkYpCQkJCQkJCQkqLwotI2RlZmluZSBUSU1FUjBfQ09ORklHCQkweEZGQzAwNjAwCS8qIFRpbWVyIDAgQ29uZmlndXJhdGlvbiBSZWdpc3RlcgkJCSovCi0jZGVmaW5lIFRJTUVSMF9DT1VOVEVSCQkweEZGQzAwNjA0CS8qIFRpbWVyIDAgQ291bnRlciBSZWdpc3RlcgkJCQkJKi8KLSNkZWZpbmUgVElNRVIwX1BFUklPRAkJMHhGRkMwMDYwOAkvKiBUaW1lciAwIFBlcmlvZCBSZWdpc3RlcgkJCQkJKi8KLSNkZWZpbmUgVElNRVIwX1dJRFRICQkweEZGQzAwNjBDCS8qIFRpbWVyIDAgV2lkdGggUmVnaXN0ZXIJCQkJCSovCi0KLSNkZWZpbmUgVElNRVIxX0NPTkZJRwkJMHhGRkMwMDYxMAkvKiBUaW1lciAxIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgIAkJCSovCi0jZGVmaW5lIFRJTUVSMV9DT1VOVEVSCQkweEZGQzAwNjE0CS8qIFRpbWVyIDEgQ291bnRlciBSZWdpc3RlciAgICAgICAgCQkJKi8KLSNkZWZpbmUgVElNRVIxX1BFUklPRAkJMHhGRkMwMDYxOAkvKiBUaW1lciAxIFBlcmlvZCBSZWdpc3RlciAgICAgICAgIAkJCSovCi0jZGVmaW5lIFRJTUVSMV9XSURUSAkJMHhGRkMwMDYxQwkvKiBUaW1lciAxIFdpZHRoIFJlZ2lzdGVyICAgICAgICAgIAkJCSovCi0KLSNkZWZpbmUgVElNRVIyX0NPTkZJRwkJMHhGRkMwMDYyMAkvKiBUaW1lciAyIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgIAkJCSovCi0jZGVmaW5lIFRJTUVSMl9DT1VOVEVSCQkweEZGQzAwNjI0CS8qIFRpbWVyIDIgQ291bnRlciBSZWdpc3RlciAgICAgICAgCQkJKi8KLSNkZWZpbmUgVElNRVIyX1BFUklPRAkJMHhGRkMwMDYyOAkvKiBUaW1lciAyIFBlcmlvZCBSZWdpc3RlciAgICAgICAgIAkJCSovCi0jZGVmaW5lIFRJTUVSMl9XSURUSAkJMHhGRkMwMDYyQwkvKiBUaW1lciAyIFdpZHRoIFJlZ2lzdGVyICAgICAgICAgIAkJCSovCi0KLSNkZWZpbmUgVElNRVIzX0NPTkZJRwkJMHhGRkMwMDYzMAkvKiBUaW1lciAzIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIJCQkqLwotI2RlZmluZSBUSU1FUjNfQ09VTlRFUgkJMHhGRkMwMDYzNAkvKiBUaW1lciAzIENvdW50ZXIgUmVnaXN0ZXIJCQkJCSovCi0jZGVmaW5lIFRJTUVSM19QRVJJT0QJCTB4RkZDMDA2MzgJLyogVGltZXIgMyBQZXJpb2QgUmVnaXN0ZXIJCQkJCSovCi0jZGVmaW5lIFRJTUVSM19XSURUSAkJMHhGRkMwMDYzQwkvKiBUaW1lciAzIFdpZHRoIFJlZ2lzdGVyCQkJCQkqLwotCi0jZGVmaW5lIFRJTUVSNF9DT05GSUcJCTB4RkZDMDA2NDAJLyogVGltZXIgNCBDb25maWd1cmF0aW9uIFJlZ2lzdGVyICAJCQkqLwotI2RlZmluZSBUSU1FUjRfQ09VTlRFUgkJMHhGRkMwMDY0NAkvKiBUaW1lciA0IENvdW50ZXIgUmVnaXN0ZXIgICAgICAgIAkJCSovCi0jZGVmaW5lIFRJTUVSNF9QRVJJT0QJCTB4RkZDMDA2NDgJLyogVGltZXIgNCBQZXJpb2QgUmVnaXN0ZXIgICAgICAgICAJCQkqLwotI2RlZmluZSBUSU1FUjRfV0lEVEgJCTB4RkZDMDA2NEMJLyogVGltZXIgNCBXaWR0aCBSZWdpc3RlciAgICAgICAgICAJCQkqLwotCi0jZGVmaW5lIFRJTUVSNV9DT05GSUcJCTB4RkZDMDA2NTAJLyogVGltZXIgNSBDb25maWd1cmF0aW9uIFJlZ2lzdGVyICAJCQkqLwotI2RlZmluZSBUSU1FUjVfQ09VTlRFUgkJMHhGRkMwMDY1NAkvKiBUaW1lciA1IENvdW50ZXIgUmVnaXN0ZXIgICAgICAgIAkJCSovCi0jZGVmaW5lIFRJTUVSNV9QRVJJT0QJCTB4RkZDMDA2NTgJLyogVGltZXIgNSBQZXJpb2QgUmVnaXN0ZXIgICAgICAgICAJCQkqLwotI2RlZmluZSBUSU1FUjVfV0lEVEgJCTB4RkZDMDA2NUMJLyogVGltZXIgNSBXaWR0aCBSZWdpc3RlciAgICAgICAgICAJCQkqLwotCi0jZGVmaW5lIFRJTUVSNl9DT05GSUcJCTB4RkZDMDA2NjAJLyogVGltZXIgNiBDb25maWd1cmF0aW9uIFJlZ2lzdGVyICAJCQkqLwotI2RlZmluZSBUSU1FUjZfQ09VTlRFUgkJMHhGRkMwMDY2NAkvKiBUaW1lciA2IENvdW50ZXIgUmVnaXN0ZXIgICAgICAgIAkJCSovCi0jZGVmaW5lIFRJTUVSNl9QRVJJT0QJCTB4RkZDMDA2NjgJLyogVGltZXIgNiBQZXJpb2QgUmVnaXN0ZXIgICAgICAgICAJCQkqLwotI2RlZmluZSBUSU1FUjZfV0lEVEgJCTB4RkZDMDA2NkMJLyogVGltZXIgNiBXaWR0aCBSZWdpc3RlciAgICAgICAgICAJCQkqLwotCi0jZGVmaW5lIFRJTUVSN19DT05GSUcJCTB4RkZDMDA2NzAJLyogVGltZXIgNyBDb25maWd1cmF0aW9uIFJlZ2lzdGVyICAJCQkqLwotI2RlZmluZSBUSU1FUjdfQ09VTlRFUgkJMHhGRkMwMDY3NAkvKiBUaW1lciA3IENvdW50ZXIgUmVnaXN0ZXIgICAgICAgIAkJCSovCi0jZGVmaW5lIFRJTUVSN19QRVJJT0QJCTB4RkZDMDA2NzgJLyogVGltZXIgNyBQZXJpb2QgUmVnaXN0ZXIgICAgICAgICAJCQkqLwotI2RlZmluZSBUSU1FUjdfV0lEVEgJCTB4RkZDMDA2N0MJLyogVGltZXIgNyBXaWR0aCBSZWdpc3RlciAgICAgICAJCQkqLwotCi0jZGVmaW5lIFRJTUVSX0VOQUJMRQkJMHhGRkMwMDY4MAkvKiBUaW1lciBFbmFibGUgUmVnaXN0ZXIJCQkJCSovCi0jZGVmaW5lIFRJTUVSX0RJU0FCTEUJCTB4RkZDMDA2ODQJLyogVGltZXIgRGlzYWJsZSBSZWdpc3RlcgkJCQkJKi8KLSNkZWZpbmUgVElNRVJfU1RBVFVTCQkweEZGQzAwNjg4CS8qIFRpbWVyIFN0YXR1cyBSZWdpc3RlcgkJCQkJKi8KLQotCi0vKiBHZW5lcmFsIFB1cnBvc2UgSS9PIFBvcnQgRiAoMHhGRkMwMDcwMCAtIDB4RkZDMDA3RkYpCQkJCQkJCQkJCQkJKi8KLSNkZWZpbmUgUE9SVEZJTwkJCQkJMHhGRkMwMDcwMAkvKiBQb3J0IEYgSS9PIFBpbiBTdGF0ZSBTcGVjaWZ5IFJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIFBPUlRGSU9fQ0xFQVIJCQkweEZGQzAwNzA0CS8qIFBvcnQgRiBJL08gUGVyaXBoZXJhbCBJbnRlcnJ1cHQgQ2xlYXIgUmVnaXN0ZXIJCSovCi0jZGVmaW5lIFBPUlRGSU9fU0VUCQkJCTB4RkZDMDA3MDgJLyogUG9ydCBGIEkvTyBQZXJpcGhlcmFsIEludGVycnVwdCBTZXQgUmVnaXN0ZXIJCQkqLwotI2RlZmluZSBQT1JURklPX1RPR0dMRQkJCTB4RkZDMDA3MEMJLyogUG9ydCBGIEkvTyBQaW4gU3RhdGUgVG9nZ2xlIFJlZ2lzdGVyCQkJCQkqLwotI2RlZmluZSBQT1JURklPX01BU0tBCQkJMHhGRkMwMDcxMAkvKiBQb3J0IEYgSS9PIE1hc2sgU3RhdGUgU3BlY2lmeSBJbnRlcnJ1cHQgQSBSZWdpc3RlcgkqLwotI2RlZmluZSBQT1JURklPX01BU0tBX0NMRUFSCQkweEZGQzAwNzE0CS8qIFBvcnQgRiBJL08gTWFzayBEaXNhYmxlIEludGVycnVwdCBBIFJlZ2lzdGVyCQkJKi8KLSNkZWZpbmUgUE9SVEZJT19NQVNLQV9TRVQJCTB4RkZDMDA3MTgJLyogUG9ydCBGIEkvTyBNYXNrIEVuYWJsZSBJbnRlcnJ1cHQgQSBSZWdpc3RlcgkJCSovCi0jZGVmaW5lIFBPUlRGSU9fTUFTS0FfVE9HR0xFCTB4RkZDMDA3MUMJLyogUG9ydCBGIEkvTyBNYXNrIFRvZ2dsZSBFbmFibGUgSW50ZXJydXB0IEEgUmVnaXN0ZXIJKi8KLSNkZWZpbmUgUE9SVEZJT19NQVNLQgkJCTB4RkZDMDA3MjAJLyogUG9ydCBGIEkvTyBNYXNrIFN0YXRlIFNwZWNpZnkgSW50ZXJydXB0IEIgUmVnaXN0ZXIJKi8KLSNkZWZpbmUgUE9SVEZJT19NQVNLQl9DTEVBUgkJMHhGRkMwMDcyNAkvKiBQb3J0IEYgSS9PIE1hc2sgRGlzYWJsZSBJbnRlcnJ1cHQgQiBSZWdpc3RlcgkJCSovCi0jZGVmaW5lIFBPUlRGSU9fTUFTS0JfU0VUCQkweEZGQzAwNzI4CS8qIFBvcnQgRiBJL08gTWFzayBFbmFibGUgSW50ZXJydXB0IEIgUmVnaXN0ZXIJCQkqLwotI2RlZmluZSBQT1JURklPX01BU0tCX1RPR0dMRQkweEZGQzAwNzJDCS8qIFBvcnQgRiBJL08gTWFzayBUb2dnbGUgRW5hYmxlIEludGVycnVwdCBCIFJlZ2lzdGVyCSovCi0jZGVmaW5lIFBPUlRGSU9fRElSCQkJCTB4RkZDMDA3MzAJLyogUG9ydCBGIEkvTyBEaXJlY3Rpb24gUmVnaXN0ZXIJCQkJCQkqLwotI2RlZmluZSBQT1JURklPX1BPTEFSCQkJMHhGRkMwMDczNAkvKiBQb3J0IEYgSS9PIFNvdXJjZSBQb2xhcml0eSBSZWdpc3RlcgkJCQkJKi8KLSNkZWZpbmUgUE9SVEZJT19FREdFCQkJMHhGRkMwMDczOAkvKiBQb3J0IEYgSS9PIFNvdXJjZSBTZW5zaXRpdml0eSBSZWdpc3RlcgkJCQkqLwotI2RlZmluZSBQT1JURklPX0JPVEgJCQkweEZGQzAwNzNDCS8qIFBvcnQgRiBJL08gU2V0IG9uIEJPVEggRWRnZXMgUmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgUE9SVEZJT19JTkVOCQkJMHhGRkMwMDc0MAkvKiBQb3J0IEYgSS9PIElucHV0IEVuYWJsZSBSZWdpc3RlciAJCQkJCSovCi0KLQotLyogU1BPUlQwIENvbnRyb2xsZXIJCSgweEZGQzAwODAwIC0gMHhGRkMwMDhGRikJCQkJCQkJCQkJKi8KLSNkZWZpbmUgU1BPUlQwX1RDUjEJCQkweEZGQzAwODAwCS8qIFNQT1JUMCBUcmFuc21pdCBDb25maWd1cmF0aW9uIDEgUmVnaXN0ZXIJCQkqLwotI2RlZmluZSBTUE9SVDBfVENSMgkJCTB4RkZDMDA4MDQJLyogU1BPUlQwIFRyYW5zbWl0IENvbmZpZ3VyYXRpb24gMiBSZWdpc3RlcgkJCSovCi0jZGVmaW5lIFNQT1JUMF9UQ0xLRElWCQkweEZGQzAwODA4CS8qIFNQT1JUMCBUcmFuc21pdCBDbG9jayBEaXZpZGVyCQkJCQkqLwotI2RlZmluZSBTUE9SVDBfVEZTRElWCQkweEZGQzAwODBDCS8qIFNQT1JUMCBUcmFuc21pdCBGcmFtZSBTeW5jIERpdmlkZXIJCQkJKi8KLSNkZWZpbmUgU1BPUlQwX1RYCQkJMHhGRkMwMDgxMAkvKiBTUE9SVDAgVFggRGF0YSBSZWdpc3RlcgkJCQkJCQkqLwotI2RlZmluZSBTUE9SVDBfUlgJCQkweEZGQzAwODE4CS8qIFNQT1JUMCBSWCBEYXRhIFJlZ2lzdGVyCQkJCQkJCSovCi0jZGVmaW5lIFNQT1JUMF9SQ1IxCQkJMHhGRkMwMDgyMAkvKiBTUE9SVDAgVHJhbnNtaXQgQ29uZmlndXJhdGlvbiAxIFJlZ2lzdGVyCQkJKi8KLSNkZWZpbmUgU1BPUlQwX1JDUjIJCQkweEZGQzAwODI0CS8qIFNQT1JUMCBUcmFuc21pdCBDb25maWd1cmF0aW9uIDIgUmVnaXN0ZXIJCQkqLwotI2RlZmluZSBTUE9SVDBfUkNMS0RJVgkJMHhGRkMwMDgyOAkvKiBTUE9SVDAgUmVjZWl2ZSBDbG9jayBEaXZpZGVyCQkJCQkJKi8KLSNkZWZpbmUgU1BPUlQwX1JGU0RJVgkJMHhGRkMwMDgyQwkvKiBTUE9SVDAgUmVjZWl2ZSBGcmFtZSBTeW5jIERpdmlkZXIJCQkJKi8KLSNkZWZpbmUgU1BPUlQwX1NUQVQJCQkweEZGQzAwODMwCS8qIFNQT1JUMCBTdGF0dXMgUmVnaXN0ZXIJCQkJCQkJKi8KLSNkZWZpbmUgU1BPUlQwX0NITkwJCQkweEZGQzAwODM0CS8qIFNQT1JUMCBDdXJyZW50IENoYW5uZWwgUmVnaXN0ZXIJCQkJCSovCi0jZGVmaW5lIFNQT1JUMF9NQ01DMQkJMHhGRkMwMDgzOAkvKiBTUE9SVDAgTXVsdGktQ2hhbm5lbCBDb25maWd1cmF0aW9uIFJlZ2lzdGVyIDEJKi8KLSNkZWZpbmUgU1BPUlQwX01DTUMyCQkweEZGQzAwODNDCS8qIFNQT1JUMCBNdWx0aS1DaGFubmVsIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgMgkqLwotI2RlZmluZSBTUE9SVDBfTVRDUzAJCTB4RkZDMDA4NDAJLyogU1BPUlQwIE11bHRpLUNoYW5uZWwgVHJhbnNtaXQgU2VsZWN0IFJlZ2lzdGVyIDAJKi8KLSNkZWZpbmUgU1BPUlQwX01UQ1MxCQkweEZGQzAwODQ0CS8qIFNQT1JUMCBNdWx0aS1DaGFubmVsIFRyYW5zbWl0IFNlbGVjdCBSZWdpc3RlciAxCSovCi0jZGVmaW5lIFNQT1JUMF9NVENTMgkJMHhGRkMwMDg0OAkvKiBTUE9SVDAgTXVsdGktQ2hhbm5lbCBUcmFuc21pdCBTZWxlY3QgUmVnaXN0ZXIgMgkqLwotI2RlZmluZSBTUE9SVDBfTVRDUzMJCTB4RkZDMDA4NEMJLyogU1BPUlQwIE11bHRpLUNoYW5uZWwgVHJhbnNtaXQgU2VsZWN0IFJlZ2lzdGVyIDMJKi8KLSNkZWZpbmUgU1BPUlQwX01SQ1MwCQkweEZGQzAwODUwCS8qIFNQT1JUMCBNdWx0aS1DaGFubmVsIFJlY2VpdmUgU2VsZWN0IFJlZ2lzdGVyIDAJKi8KLSNkZWZpbmUgU1BPUlQwX01SQ1MxCQkweEZGQzAwODU0CS8qIFNQT1JUMCBNdWx0aS1DaGFubmVsIFJlY2VpdmUgU2VsZWN0IFJlZ2lzdGVyIDEJKi8KLSNkZWZpbmUgU1BPUlQwX01SQ1MyCQkweEZGQzAwODU4CS8qIFNQT1JUMCBNdWx0aS1DaGFubmVsIFJlY2VpdmUgU2VsZWN0IFJlZ2lzdGVyIDIJKi8KLSNkZWZpbmUgU1BPUlQwX01SQ1MzCQkweEZGQzAwODVDCS8qIFNQT1JUMCBNdWx0aS1DaGFubmVsIFJlY2VpdmUgU2VsZWN0IFJlZ2lzdGVyIDMJKi8KLQotCi0vKiBTUE9SVDEgQ29udHJvbGxlcgkJKDB4RkZDMDA5MDAgLSAweEZGQzAwOUZGKQkJCQkJCQkJCQkqLwotI2RlZmluZSBTUE9SVDFfVENSMQkJCTB4RkZDMDA5MDAJLyogU1BPUlQxIFRyYW5zbWl0IENvbmZpZ3VyYXRpb24gMSBSZWdpc3RlcgkJCSovCi0jZGVmaW5lIFNQT1JUMV9UQ1IyCQkJMHhGRkMwMDkwNAkvKiBTUE9SVDEgVHJhbnNtaXQgQ29uZmlndXJhdGlvbiAyIFJlZ2lzdGVyCQkJKi8KLSNkZWZpbmUgU1BPUlQxX1RDTEtESVYJCTB4RkZDMDA5MDgJLyogU1BPUlQxIFRyYW5zbWl0IENsb2NrIERpdmlkZXIJCQkJCSovCi0jZGVmaW5lIFNQT1JUMV9URlNESVYJCTB4RkZDMDA5MEMJLyogU1BPUlQxIFRyYW5zbWl0IEZyYW1lIFN5bmMgRGl2aWRlcgkJCQkqLwotI2RlZmluZSBTUE9SVDFfVFgJCQkweEZGQzAwOTEwCS8qIFNQT1JUMSBUWCBEYXRhIFJlZ2lzdGVyCQkJCQkJCSovCi0jZGVmaW5lIFNQT1JUMV9SWAkJCTB4RkZDMDA5MTgJLyogU1BPUlQxIFJYIERhdGEgUmVnaXN0ZXIJCQkJCQkJKi8KLSNkZWZpbmUgU1BPUlQxX1JDUjEJCQkweEZGQzAwOTIwCS8qIFNQT1JUMSBUcmFuc21pdCBDb25maWd1cmF0aW9uIDEgUmVnaXN0ZXIJCQkqLwotI2RlZmluZSBTUE9SVDFfUkNSMgkJCTB4RkZDMDA5MjQJLyogU1BPUlQxIFRyYW5zbWl0IENvbmZpZ3VyYXRpb24gMiBSZWdpc3RlcgkJCSovCi0jZGVmaW5lIFNQT1JUMV9SQ0xLRElWCQkweEZGQzAwOTI4CS8qIFNQT1JUMSBSZWNlaXZlIENsb2NrIERpdmlkZXIJCQkJCQkqLwotI2RlZmluZSBTUE9SVDFfUkZTRElWCQkweEZGQzAwOTJDCS8qIFNQT1JUMSBSZWNlaXZlIEZyYW1lIFN5bmMgRGl2aWRlcgkJCQkqLwotI2RlZmluZSBTUE9SVDFfU1RBVAkJCTB4RkZDMDA5MzAJLyogU1BPUlQxIFN0YXR1cyBSZWdpc3RlcgkJCQkJCQkqLwotI2RlZmluZSBTUE9SVDFfQ0hOTAkJCTB4RkZDMDA5MzQJLyogU1BPUlQxIEN1cnJlbnQgQ2hhbm5lbCBSZWdpc3RlcgkJCQkJKi8KLSNkZWZpbmUgU1BPUlQxX01DTUMxCQkweEZGQzAwOTM4CS8qIFNQT1JUMSBNdWx0aS1DaGFubmVsIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgMQkqLwotI2RlZmluZSBTUE9SVDFfTUNNQzIJCTB4RkZDMDA5M0MJLyogU1BPUlQxIE11bHRpLUNoYW5uZWwgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAyCSovCi0jZGVmaW5lIFNQT1JUMV9NVENTMAkJMHhGRkMwMDk0MAkvKiBTUE9SVDEgTXVsdGktQ2hhbm5lbCBUcmFuc21pdCBTZWxlY3QgUmVnaXN0ZXIgMAkqLwotI2RlZmluZSBTUE9SVDFfTVRDUzEJCTB4RkZDMDA5NDQJLyogU1BPUlQxIE11bHRpLUNoYW5uZWwgVHJhbnNtaXQgU2VsZWN0IFJlZ2lzdGVyIDEJKi8KLSNkZWZpbmUgU1BPUlQxX01UQ1MyCQkweEZGQzAwOTQ4CS8qIFNQT1JUMSBNdWx0aS1DaGFubmVsIFRyYW5zbWl0IFNlbGVjdCBSZWdpc3RlciAyCSovCi0jZGVmaW5lIFNQT1JUMV9NVENTMwkJMHhGRkMwMDk0QwkvKiBTUE9SVDEgTXVsdGktQ2hhbm5lbCBUcmFuc21pdCBTZWxlY3QgUmVnaXN0ZXIgMwkqLwotI2RlZmluZSBTUE9SVDFfTVJDUzAJCTB4RkZDMDA5NTAJLyogU1BPUlQxIE11bHRpLUNoYW5uZWwgUmVjZWl2ZSBTZWxlY3QgUmVnaXN0ZXIgMAkqLwotI2RlZmluZSBTUE9SVDFfTVJDUzEJCTB4RkZDMDA5NTQJLyogU1BPUlQxIE11bHRpLUNoYW5uZWwgUmVjZWl2ZSBTZWxlY3QgUmVnaXN0ZXIgMQkqLwotI2RlZmluZSBTUE9SVDFfTVJDUzIJCTB4RkZDMDA5NTgJLyogU1BPUlQxIE11bHRpLUNoYW5uZWwgUmVjZWl2ZSBTZWxlY3QgUmVnaXN0ZXIgMgkqLwotI2RlZmluZSBTUE9SVDFfTVJDUzMJCTB4RkZDMDA5NUMJLyogU1BPUlQxIE11bHRpLUNoYW5uZWwgUmVjZWl2ZSBTZWxlY3QgUmVnaXN0ZXIgMwkqLwotCi0KLS8qIEV4dGVybmFsIEJ1cyBJbnRlcmZhY2UgVW5pdCAoMHhGRkMwMEEwMCAtIDB4RkZDMDBBRkYpCQkJCQkJCQkqLwotI2RlZmluZSBFQklVX0FNR0NUTAkJCTB4RkZDMDBBMDAJLyogQXN5bmNocm9ub3VzIE1lbW9yeSBHbG9iYWwgQ29udHJvbCBSZWdpc3RlcgkqLwotI2RlZmluZSBFQklVX0FNQkNUTDAJCTB4RkZDMDBBMDQJLyogQXN5bmNocm9ub3VzIE1lbW9yeSBCYW5rIENvbnRyb2wgUmVnaXN0ZXIgMAkqLwotI2RlZmluZSBFQklVX0FNQkNUTDEJCTB4RkZDMDBBMDgJLyogQXN5bmNocm9ub3VzIE1lbW9yeSBCYW5rIENvbnRyb2wgUmVnaXN0ZXIgMQkqLwotI2RlZmluZSBFQklVX1NER0NUTAkJCTB4RkZDMDBBMTAJLyogU0RSQU0gR2xvYmFsIENvbnRyb2wgUmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgRUJJVV9TREJDVEwJCQkweEZGQzAwQTE0CS8qIFNEUkFNIEJhbmsgQ29udHJvbCBSZWdpc3RlcgkJCQkJKi8KLSNkZWZpbmUgRUJJVV9TRFJSQwkJCTB4RkZDMDBBMTgJLyogU0RSQU0gUmVmcmVzaCBSYXRlIENvbnRyb2wgUmVnaXN0ZXIJCQkqLwotI2RlZmluZSBFQklVX1NEU1RBVAkJCTB4RkZDMDBBMUMJLyogU0RSQU0gU3RhdHVzIFJlZ2lzdGVyCQkJCQkJKi8KLQotCi0vKiBETUEgVHJhZmZpYyBDb250cm9sIFJlZ2lzdGVycwkJCQkJCQkJCQkJCQkqLwotI2RlZmluZSBETUFfVENfUEVSCQkJMHhGRkMwMEIwQwkvKiBUcmFmZmljIENvbnRyb2wgUGVyaW9kcyBSZWdpc3RlcgkJCSovCi0jZGVmaW5lIERNQV9UQ19DTlQJCQkweEZGQzAwQjEwCS8qIFRyYWZmaWMgQ29udHJvbCBDdXJyZW50IENvdW50cyBSZWdpc3RlcgkqLwotCi0vKiBBbHRlcm5hdGUgZGVwcmVjYXRlZCByZWdpc3RlciBuYW1lcyAoYmVsb3cpIHByb3ZpZGVkIGZvciBiYWNrd2FyZHMgY29kZSBjb21wYXRpYmlsaXR5ICovCi0jZGVmaW5lIERNQV9UQ1BFUgkJCTB4RkZDMDBCMEMJLyogVHJhZmZpYyBDb250cm9sIFBlcmlvZHMgUmVnaXN0ZXIJCQkqLwotI2RlZmluZSBETUFfVENDTlQJCQkweEZGQzAwQjEwCS8qIFRyYWZmaWMgQ29udHJvbCBDdXJyZW50IENvdW50cyBSZWdpc3RlcgkqLwotCi0vKiBETUEgQ29udHJvbGxlciAoMHhGRkMwMEMwMCAtIDB4RkZDMDBGRkYpCQkJCQkJCQkJCQkJCQkJKi8KLSNkZWZpbmUgRE1BMF9ORVhUX0RFU0NfUFRSCQkweEZGQzAwQzAwCS8qIERNQSBDaGFubmVsIDAgTmV4dCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIJCSovCi0jZGVmaW5lIERNQTBfU1RBUlRfQUREUgkJCTB4RkZDMDBDMDQJLyogRE1BIENoYW5uZWwgMCBTdGFydCBBZGRyZXNzIFJlZ2lzdGVyCQkJCQkqLwotI2RlZmluZSBETUEwX0NPTkZJRwkJCQkweEZGQzAwQzA4CS8qIERNQSBDaGFubmVsIDAgQ29uZmlndXJhdGlvbiBSZWdpc3RlcgkJCQkJKi8KLSNkZWZpbmUgRE1BMF9YX0NPVU5UCQkJMHhGRkMwMEMxMAkvKiBETUEgQ2hhbm5lbCAwIFggQ291bnQgUmVnaXN0ZXIJCQkJCQkqLwotI2RlZmluZSBETUEwX1hfTU9ESUZZCQkJMHhGRkMwMEMxNAkvKiBETUEgQ2hhbm5lbCAwIFggTW9kaWZ5IFJlZ2lzdGVyCQkJCQkJKi8KLSNkZWZpbmUgRE1BMF9ZX0NPVU5UCQkJMHhGRkMwMEMxOAkvKiBETUEgQ2hhbm5lbCAwIFkgQ291bnQgUmVnaXN0ZXIJCQkJCQkqLwotI2RlZmluZSBETUEwX1lfTU9ESUZZCQkJMHhGRkMwMEMxQwkvKiBETUEgQ2hhbm5lbCAwIFkgTW9kaWZ5IFJlZ2lzdGVyCQkJCQkJKi8KLSNkZWZpbmUgRE1BMF9DVVJSX0RFU0NfUFRSCQkweEZGQzAwQzIwCS8qIERNQSBDaGFubmVsIDAgQ3VycmVudCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIJKi8KLSNkZWZpbmUgRE1BMF9DVVJSX0FERFIJCQkweEZGQzAwQzI0CS8qIERNQSBDaGFubmVsIDAgQ3VycmVudCBBZGRyZXNzIFJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIERNQTBfSVJRX1NUQVRVUwkJCTB4RkZDMDBDMjgJLyogRE1BIENoYW5uZWwgMCBJbnRlcnJ1cHQvU3RhdHVzIFJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIERNQTBfUEVSSVBIRVJBTF9NQVAJCTB4RkZDMDBDMkMJLyogRE1BIENoYW5uZWwgMCBQZXJpcGhlcmFsIE1hcCBSZWdpc3RlcgkJCQkqLwotI2RlZmluZSBETUEwX0NVUlJfWF9DT1VOVAkJMHhGRkMwMEMzMAkvKiBETUEgQ2hhbm5lbCAwIEN1cnJlbnQgWCBDb3VudCBSZWdpc3RlcgkJCQkqLwotI2RlZmluZSBETUEwX0NVUlJfWV9DT1VOVAkJMHhGRkMwMEMzOAkvKiBETUEgQ2hhbm5lbCAwIEN1cnJlbnQgWSBDb3VudCBSZWdpc3RlcgkJCQkqLwotCi0jZGVmaW5lIERNQTFfTkVYVF9ERVNDX1BUUgkJMHhGRkMwMEM0MAkvKiBETUEgQ2hhbm5lbCAxIE5leHQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyCQkqLwotI2RlZmluZSBETUExX1NUQVJUX0FERFIJCQkweEZGQzAwQzQ0CS8qIERNQSBDaGFubmVsIDEgU3RhcnQgQWRkcmVzcyBSZWdpc3RlcgkJCQkJKi8KLSNkZWZpbmUgRE1BMV9DT05GSUcJCQkJMHhGRkMwMEM0OAkvKiBETUEgQ2hhbm5lbCAxIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIJCQkJCSovCi0jZGVmaW5lIERNQTFfWF9DT1VOVAkJCTB4RkZDMDBDNTAJLyogRE1BIENoYW5uZWwgMSBYIENvdW50IFJlZ2lzdGVyCQkJCQkJKi8KLSNkZWZpbmUgRE1BMV9YX01PRElGWQkJCTB4RkZDMDBDNTQJLyogRE1BIENoYW5uZWwgMSBYIE1vZGlmeSBSZWdpc3RlcgkJCQkJCSovCi0jZGVmaW5lIERNQTFfWV9DT1VOVAkJCTB4RkZDMDBDNTgJLyogRE1BIENoYW5uZWwgMSBZIENvdW50IFJlZ2lzdGVyCQkJCQkJKi8KLSNkZWZpbmUgRE1BMV9ZX01PRElGWQkJCTB4RkZDMDBDNUMJLyogRE1BIENoYW5uZWwgMSBZIE1vZGlmeSBSZWdpc3RlcgkJCQkJCSovCi0jZGVmaW5lIERNQTFfQ1VSUl9ERVNDX1BUUgkJMHhGRkMwMEM2MAkvKiBETUEgQ2hhbm5lbCAxIEN1cnJlbnQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyCSovCi0jZGVmaW5lIERNQTFfQ1VSUl9BRERSCQkJMHhGRkMwMEM2NAkvKiBETUEgQ2hhbm5lbCAxIEN1cnJlbnQgQWRkcmVzcyBSZWdpc3RlcgkJCQkqLwotI2RlZmluZSBETUExX0lSUV9TVEFUVVMJCQkweEZGQzAwQzY4CS8qIERNQSBDaGFubmVsIDEgSW50ZXJydXB0L1N0YXR1cyBSZWdpc3RlcgkJCQkqLwotI2RlZmluZSBETUExX1BFUklQSEVSQUxfTUFQCQkweEZGQzAwQzZDCS8qIERNQSBDaGFubmVsIDEgUGVyaXBoZXJhbCBNYXAgUmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgRE1BMV9DVVJSX1hfQ09VTlQJCTB4RkZDMDBDNzAJLyogRE1BIENoYW5uZWwgMSBDdXJyZW50IFggQ291bnQgUmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgRE1BMV9DVVJSX1lfQ09VTlQJCTB4RkZDMDBDNzgJLyogRE1BIENoYW5uZWwgMSBDdXJyZW50IFkgQ291bnQgUmVnaXN0ZXIJCQkJKi8KLQotI2RlZmluZSBETUEyX05FWFRfREVTQ19QVFIJCTB4RkZDMDBDODAJLyogRE1BIENoYW5uZWwgMiBOZXh0IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlcgkJKi8KLSNkZWZpbmUgRE1BMl9TVEFSVF9BRERSCQkJMHhGRkMwMEM4NAkvKiBETUEgQ2hhbm5lbCAyIFN0YXJ0IEFkZHJlc3MgUmVnaXN0ZXIJCQkJCSovCi0jZGVmaW5lIERNQTJfQ09ORklHCQkJCTB4RkZDMDBDODgJLyogRE1BIENoYW5uZWwgMiBDb25maWd1cmF0aW9uIFJlZ2lzdGVyCQkJCQkqLwotI2RlZmluZSBETUEyX1hfQ09VTlQJCQkweEZGQzAwQzkwCS8qIERNQSBDaGFubmVsIDIgWCBDb3VudCBSZWdpc3RlcgkJCQkJCSovCi0jZGVmaW5lIERNQTJfWF9NT0RJRlkJCQkweEZGQzAwQzk0CS8qIERNQSBDaGFubmVsIDIgWCBNb2RpZnkgUmVnaXN0ZXIJCQkJCQkqLwotI2RlZmluZSBETUEyX1lfQ09VTlQJCQkweEZGQzAwQzk4CS8qIERNQSBDaGFubmVsIDIgWSBDb3VudCBSZWdpc3RlcgkJCQkJCSovCi0jZGVmaW5lIERNQTJfWV9NT0RJRlkJCQkweEZGQzAwQzlDCS8qIERNQSBDaGFubmVsIDIgWSBNb2RpZnkgUmVnaXN0ZXIJCQkJCQkqLwotI2RlZmluZSBETUEyX0NVUlJfREVTQ19QVFIJCTB4RkZDMDBDQTAJLyogRE1BIENoYW5uZWwgMiBDdXJyZW50IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlcgkqLwotI2RlZmluZSBETUEyX0NVUlJfQUREUgkJCTB4RkZDMDBDQTQJLyogRE1BIENoYW5uZWwgMiBDdXJyZW50IEFkZHJlc3MgUmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgRE1BMl9JUlFfU1RBVFVTCQkJMHhGRkMwMENBOAkvKiBETUEgQ2hhbm5lbCAyIEludGVycnVwdC9TdGF0dXMgUmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgRE1BMl9QRVJJUEhFUkFMX01BUAkJMHhGRkMwMENBQwkvKiBETUEgQ2hhbm5lbCAyIFBlcmlwaGVyYWwgTWFwIFJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIERNQTJfQ1VSUl9YX0NPVU5UCQkweEZGQzAwQ0IwCS8qIERNQSBDaGFubmVsIDIgQ3VycmVudCBYIENvdW50IFJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIERNQTJfQ1VSUl9ZX0NPVU5UCQkweEZGQzAwQ0I4CS8qIERNQSBDaGFubmVsIDIgQ3VycmVudCBZIENvdW50IFJlZ2lzdGVyCQkJCSovCi0KLSNkZWZpbmUgRE1BM19ORVhUX0RFU0NfUFRSCQkweEZGQzAwQ0MwCS8qIERNQSBDaGFubmVsIDMgTmV4dCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIJCSovCi0jZGVmaW5lIERNQTNfU1RBUlRfQUREUgkJCTB4RkZDMDBDQzQJLyogRE1BIENoYW5uZWwgMyBTdGFydCBBZGRyZXNzIFJlZ2lzdGVyCQkJCQkqLwotI2RlZmluZSBETUEzX0NPTkZJRwkJCQkweEZGQzAwQ0M4CS8qIERNQSBDaGFubmVsIDMgQ29uZmlndXJhdGlvbiBSZWdpc3RlcgkJCQkJKi8KLSNkZWZpbmUgRE1BM19YX0NPVU5UCQkJMHhGRkMwMENEMAkvKiBETUEgQ2hhbm5lbCAzIFggQ291bnQgUmVnaXN0ZXIJCQkJCQkqLwotI2RlZmluZSBETUEzX1hfTU9ESUZZCQkJMHhGRkMwMENENAkvKiBETUEgQ2hhbm5lbCAzIFggTW9kaWZ5IFJlZ2lzdGVyCQkJCQkJKi8KLSNkZWZpbmUgRE1BM19ZX0NPVU5UCQkJMHhGRkMwMENEOAkvKiBETUEgQ2hhbm5lbCAzIFkgQ291bnQgUmVnaXN0ZXIJCQkJCQkqLwotI2RlZmluZSBETUEzX1lfTU9ESUZZCQkJMHhGRkMwMENEQwkvKiBETUEgQ2hhbm5lbCAzIFkgTW9kaWZ5IFJlZ2lzdGVyCQkJCQkJKi8KLSNkZWZpbmUgRE1BM19DVVJSX0RFU0NfUFRSCQkweEZGQzAwQ0UwCS8qIERNQSBDaGFubmVsIDMgQ3VycmVudCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIJKi8KLSNkZWZpbmUgRE1BM19DVVJSX0FERFIJCQkweEZGQzAwQ0U0CS8qIERNQSBDaGFubmVsIDMgQ3VycmVudCBBZGRyZXNzIFJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIERNQTNfSVJRX1NUQVRVUwkJCTB4RkZDMDBDRTgJLyogRE1BIENoYW5uZWwgMyBJbnRlcnJ1cHQvU3RhdHVzIFJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIERNQTNfUEVSSVBIRVJBTF9NQVAJCTB4RkZDMDBDRUMJLyogRE1BIENoYW5uZWwgMyBQZXJpcGhlcmFsIE1hcCBSZWdpc3RlcgkJCQkqLwotI2RlZmluZSBETUEzX0NVUlJfWF9DT1VOVAkJMHhGRkMwMENGMAkvKiBETUEgQ2hhbm5lbCAzIEN1cnJlbnQgWCBDb3VudCBSZWdpc3RlcgkJCQkqLwotI2RlZmluZSBETUEzX0NVUlJfWV9DT1VOVAkJMHhGRkMwMENGOAkvKiBETUEgQ2hhbm5lbCAzIEN1cnJlbnQgWSBDb3VudCBSZWdpc3RlcgkJCQkqLwotCi0jZGVmaW5lIERNQTRfTkVYVF9ERVNDX1BUUgkJMHhGRkMwMEQwMAkvKiBETUEgQ2hhbm5lbCA0IE5leHQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyCQkqLwotI2RlZmluZSBETUE0X1NUQVJUX0FERFIJCQkweEZGQzAwRDA0CS8qIERNQSBDaGFubmVsIDQgU3RhcnQgQWRkcmVzcyBSZWdpc3RlcgkJCQkJKi8KLSNkZWZpbmUgRE1BNF9DT05GSUcJCQkJMHhGRkMwMEQwOAkvKiBETUEgQ2hhbm5lbCA0IENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIJCQkJCSovCi0jZGVmaW5lIERNQTRfWF9DT1VOVAkJCTB4RkZDMDBEMTAJLyogRE1BIENoYW5uZWwgNCBYIENvdW50IFJlZ2lzdGVyCQkJCQkJKi8KLSNkZWZpbmUgRE1BNF9YX01PRElGWQkJCTB4RkZDMDBEMTQJLyogRE1BIENoYW5uZWwgNCBYIE1vZGlmeSBSZWdpc3RlcgkJCQkJCSovCi0jZGVmaW5lIERNQTRfWV9DT1VOVAkJCTB4RkZDMDBEMTgJLyogRE1BIENoYW5uZWwgNCBZIENvdW50IFJlZ2lzdGVyCQkJCQkJKi8KLSNkZWZpbmUgRE1BNF9ZX01PRElGWQkJCTB4RkZDMDBEMUMJLyogRE1BIENoYW5uZWwgNCBZIE1vZGlmeSBSZWdpc3RlcgkJCQkJCSovCi0jZGVmaW5lIERNQTRfQ1VSUl9ERVNDX1BUUgkJMHhGRkMwMEQyMAkvKiBETUEgQ2hhbm5lbCA0IEN1cnJlbnQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyCSovCi0jZGVmaW5lIERNQTRfQ1VSUl9BRERSCQkJMHhGRkMwMEQyNAkvKiBETUEgQ2hhbm5lbCA0IEN1cnJlbnQgQWRkcmVzcyBSZWdpc3RlcgkJCQkqLwotI2RlZmluZSBETUE0X0lSUV9TVEFUVVMJCQkweEZGQzAwRDI4CS8qIERNQSBDaGFubmVsIDQgSW50ZXJydXB0L1N0YXR1cyBSZWdpc3RlcgkJCQkqLwotI2RlZmluZSBETUE0X1BFUklQSEVSQUxfTUFQCQkweEZGQzAwRDJDCS8qIERNQSBDaGFubmVsIDQgUGVyaXBoZXJhbCBNYXAgUmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgRE1BNF9DVVJSX1hfQ09VTlQJCTB4RkZDMDBEMzAJLyogRE1BIENoYW5uZWwgNCBDdXJyZW50IFggQ291bnQgUmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgRE1BNF9DVVJSX1lfQ09VTlQJCTB4RkZDMDBEMzgJLyogRE1BIENoYW5uZWwgNCBDdXJyZW50IFkgQ291bnQgUmVnaXN0ZXIJCQkJKi8KLQotI2RlZmluZSBETUE1X05FWFRfREVTQ19QVFIJCTB4RkZDMDBENDAJLyogRE1BIENoYW5uZWwgNSBOZXh0IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlcgkJKi8KLSNkZWZpbmUgRE1BNV9TVEFSVF9BRERSCQkJMHhGRkMwMEQ0NAkvKiBETUEgQ2hhbm5lbCA1IFN0YXJ0IEFkZHJlc3MgUmVnaXN0ZXIJCQkJCSovCi0jZGVmaW5lIERNQTVfQ09ORklHCQkJCTB4RkZDMDBENDgJLyogRE1BIENoYW5uZWwgNSBDb25maWd1cmF0aW9uIFJlZ2lzdGVyCQkJCQkqLwotI2RlZmluZSBETUE1X1hfQ09VTlQJCQkweEZGQzAwRDUwCS8qIERNQSBDaGFubmVsIDUgWCBDb3VudCBSZWdpc3RlcgkJCQkJCSovCi0jZGVmaW5lIERNQTVfWF9NT0RJRlkJCQkweEZGQzAwRDU0CS8qIERNQSBDaGFubmVsIDUgWCBNb2RpZnkgUmVnaXN0ZXIJCQkJCQkqLwotI2RlZmluZSBETUE1X1lfQ09VTlQJCQkweEZGQzAwRDU4CS8qIERNQSBDaGFubmVsIDUgWSBDb3VudCBSZWdpc3RlcgkJCQkJCSovCi0jZGVmaW5lIERNQTVfWV9NT0RJRlkJCQkweEZGQzAwRDVDCS8qIERNQSBDaGFubmVsIDUgWSBNb2RpZnkgUmVnaXN0ZXIJCQkJCQkqLwotI2RlZmluZSBETUE1X0NVUlJfREVTQ19QVFIJCTB4RkZDMDBENjAJLyogRE1BIENoYW5uZWwgNSBDdXJyZW50IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlcgkqLwotI2RlZmluZSBETUE1X0NVUlJfQUREUgkJCTB4RkZDMDBENjQJLyogRE1BIENoYW5uZWwgNSBDdXJyZW50IEFkZHJlc3MgUmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgRE1BNV9JUlFfU1RBVFVTCQkJMHhGRkMwMEQ2OAkvKiBETUEgQ2hhbm5lbCA1IEludGVycnVwdC9TdGF0dXMgUmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgRE1BNV9QRVJJUEhFUkFMX01BUAkJMHhGRkMwMEQ2QwkvKiBETUEgQ2hhbm5lbCA1IFBlcmlwaGVyYWwgTWFwIFJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIERNQTVfQ1VSUl9YX0NPVU5UCQkweEZGQzAwRDcwCS8qIERNQSBDaGFubmVsIDUgQ3VycmVudCBYIENvdW50IFJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIERNQTVfQ1VSUl9ZX0NPVU5UCQkweEZGQzAwRDc4CS8qIERNQSBDaGFubmVsIDUgQ3VycmVudCBZIENvdW50IFJlZ2lzdGVyCQkJCSovCi0KLSNkZWZpbmUgRE1BNl9ORVhUX0RFU0NfUFRSCQkweEZGQzAwRDgwCS8qIERNQSBDaGFubmVsIDYgTmV4dCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIJCSovCi0jZGVmaW5lIERNQTZfU1RBUlRfQUREUgkJCTB4RkZDMDBEODQJLyogRE1BIENoYW5uZWwgNiBTdGFydCBBZGRyZXNzIFJlZ2lzdGVyCQkJCQkqLwotI2RlZmluZSBETUE2X0NPTkZJRwkJCQkweEZGQzAwRDg4CS8qIERNQSBDaGFubmVsIDYgQ29uZmlndXJhdGlvbiBSZWdpc3RlcgkJCQkJKi8KLSNkZWZpbmUgRE1BNl9YX0NPVU5UCQkJMHhGRkMwMEQ5MAkvKiBETUEgQ2hhbm5lbCA2IFggQ291bnQgUmVnaXN0ZXIJCQkJCQkqLwotI2RlZmluZSBETUE2X1hfTU9ESUZZCQkJMHhGRkMwMEQ5NAkvKiBETUEgQ2hhbm5lbCA2IFggTW9kaWZ5IFJlZ2lzdGVyCQkJCQkJKi8KLSNkZWZpbmUgRE1BNl9ZX0NPVU5UCQkJMHhGRkMwMEQ5OAkvKiBETUEgQ2hhbm5lbCA2IFkgQ291bnQgUmVnaXN0ZXIJCQkJCQkqLwotI2RlZmluZSBETUE2X1lfTU9ESUZZCQkJMHhGRkMwMEQ5QwkvKiBETUEgQ2hhbm5lbCA2IFkgTW9kaWZ5IFJlZ2lzdGVyCQkJCQkJKi8KLSNkZWZpbmUgRE1BNl9DVVJSX0RFU0NfUFRSCQkweEZGQzAwREEwCS8qIERNQSBDaGFubmVsIDYgQ3VycmVudCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIJKi8KLSNkZWZpbmUgRE1BNl9DVVJSX0FERFIJCQkweEZGQzAwREE0CS8qIERNQSBDaGFubmVsIDYgQ3VycmVudCBBZGRyZXNzIFJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIERNQTZfSVJRX1NUQVRVUwkJCTB4RkZDMDBEQTgJLyogRE1BIENoYW5uZWwgNiBJbnRlcnJ1cHQvU3RhdHVzIFJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIERNQTZfUEVSSVBIRVJBTF9NQVAJCTB4RkZDMDBEQUMJLyogRE1BIENoYW5uZWwgNiBQZXJpcGhlcmFsIE1hcCBSZWdpc3RlcgkJCQkqLwotI2RlZmluZSBETUE2X0NVUlJfWF9DT1VOVAkJMHhGRkMwMERCMAkvKiBETUEgQ2hhbm5lbCA2IEN1cnJlbnQgWCBDb3VudCBSZWdpc3RlcgkJCQkqLwotI2RlZmluZSBETUE2X0NVUlJfWV9DT1VOVAkJMHhGRkMwMERCOAkvKiBETUEgQ2hhbm5lbCA2IEN1cnJlbnQgWSBDb3VudCBSZWdpc3RlcgkJCQkqLwotCi0jZGVmaW5lIERNQTdfTkVYVF9ERVNDX1BUUgkJMHhGRkMwMERDMAkvKiBETUEgQ2hhbm5lbCA3IE5leHQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyCQkqLwotI2RlZmluZSBETUE3X1NUQVJUX0FERFIJCQkweEZGQzAwREM0CS8qIERNQSBDaGFubmVsIDcgU3RhcnQgQWRkcmVzcyBSZWdpc3RlcgkJCQkJKi8KLSNkZWZpbmUgRE1BN19DT05GSUcJCQkJMHhGRkMwMERDOAkvKiBETUEgQ2hhbm5lbCA3IENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIJCQkJCSovCi0jZGVmaW5lIERNQTdfWF9DT1VOVAkJCTB4RkZDMDBERDAJLyogRE1BIENoYW5uZWwgNyBYIENvdW50IFJlZ2lzdGVyCQkJCQkJKi8KLSNkZWZpbmUgRE1BN19YX01PRElGWQkJCTB4RkZDMDBERDQJLyogRE1BIENoYW5uZWwgNyBYIE1vZGlmeSBSZWdpc3RlcgkJCQkJCSovCi0jZGVmaW5lIERNQTdfWV9DT1VOVAkJCTB4RkZDMDBERDgJLyogRE1BIENoYW5uZWwgNyBZIENvdW50IFJlZ2lzdGVyCQkJCQkJKi8KLSNkZWZpbmUgRE1BN19ZX01PRElGWQkJCTB4RkZDMDBEREMJLyogRE1BIENoYW5uZWwgNyBZIE1vZGlmeSBSZWdpc3RlcgkJCQkJCSovCi0jZGVmaW5lIERNQTdfQ1VSUl9ERVNDX1BUUgkJMHhGRkMwMERFMAkvKiBETUEgQ2hhbm5lbCA3IEN1cnJlbnQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyCSovCi0jZGVmaW5lIERNQTdfQ1VSUl9BRERSCQkJMHhGRkMwMERFNAkvKiBETUEgQ2hhbm5lbCA3IEN1cnJlbnQgQWRkcmVzcyBSZWdpc3RlcgkJCQkqLwotI2RlZmluZSBETUE3X0lSUV9TVEFUVVMJCQkweEZGQzAwREU4CS8qIERNQSBDaGFubmVsIDcgSW50ZXJydXB0L1N0YXR1cyBSZWdpc3RlcgkJCQkqLwotI2RlZmluZSBETUE3X1BFUklQSEVSQUxfTUFQCQkweEZGQzAwREVDCS8qIERNQSBDaGFubmVsIDcgUGVyaXBoZXJhbCBNYXAgUmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgRE1BN19DVVJSX1hfQ09VTlQJCTB4RkZDMDBERjAJLyogRE1BIENoYW5uZWwgNyBDdXJyZW50IFggQ291bnQgUmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgRE1BN19DVVJSX1lfQ09VTlQJCTB4RkZDMDBERjgJLyogRE1BIENoYW5uZWwgNyBDdXJyZW50IFkgQ291bnQgUmVnaXN0ZXIJCQkJKi8KLQotI2RlZmluZSBETUE4X05FWFRfREVTQ19QVFIJCTB4RkZDMDBFMDAJLyogRE1BIENoYW5uZWwgOCBOZXh0IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlcgkJKi8KLSNkZWZpbmUgRE1BOF9TVEFSVF9BRERSCQkJMHhGRkMwMEUwNAkvKiBETUEgQ2hhbm5lbCA4IFN0YXJ0IEFkZHJlc3MgUmVnaXN0ZXIJCQkJCSovCi0jZGVmaW5lIERNQThfQ09ORklHCQkJCTB4RkZDMDBFMDgJLyogRE1BIENoYW5uZWwgOCBDb25maWd1cmF0aW9uIFJlZ2lzdGVyCQkJCQkqLwotI2RlZmluZSBETUE4X1hfQ09VTlQJCQkweEZGQzAwRTEwCS8qIERNQSBDaGFubmVsIDggWCBDb3VudCBSZWdpc3RlcgkJCQkJCSovCi0jZGVmaW5lIERNQThfWF9NT0RJRlkJCQkweEZGQzAwRTE0CS8qIERNQSBDaGFubmVsIDggWCBNb2RpZnkgUmVnaXN0ZXIJCQkJCQkqLwotI2RlZmluZSBETUE4X1lfQ09VTlQJCQkweEZGQzAwRTE4CS8qIERNQSBDaGFubmVsIDggWSBDb3VudCBSZWdpc3RlcgkJCQkJCSovCi0jZGVmaW5lIERNQThfWV9NT0RJRlkJCQkweEZGQzAwRTFDCS8qIERNQSBDaGFubmVsIDggWSBNb2RpZnkgUmVnaXN0ZXIJCQkJCQkqLwotI2RlZmluZSBETUE4X0NVUlJfREVTQ19QVFIJCTB4RkZDMDBFMjAJLyogRE1BIENoYW5uZWwgOCBDdXJyZW50IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlcgkqLwotI2RlZmluZSBETUE4X0NVUlJfQUREUgkJCTB4RkZDMDBFMjQJLyogRE1BIENoYW5uZWwgOCBDdXJyZW50IEFkZHJlc3MgUmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgRE1BOF9JUlFfU1RBVFVTCQkJMHhGRkMwMEUyOAkvKiBETUEgQ2hhbm5lbCA4IEludGVycnVwdC9TdGF0dXMgUmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgRE1BOF9QRVJJUEhFUkFMX01BUAkJMHhGRkMwMEUyQwkvKiBETUEgQ2hhbm5lbCA4IFBlcmlwaGVyYWwgTWFwIFJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIERNQThfQ1VSUl9YX0NPVU5UCQkweEZGQzAwRTMwCS8qIERNQSBDaGFubmVsIDggQ3VycmVudCBYIENvdW50IFJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIERNQThfQ1VSUl9ZX0NPVU5UCQkweEZGQzAwRTM4CS8qIERNQSBDaGFubmVsIDggQ3VycmVudCBZIENvdW50IFJlZ2lzdGVyCQkJCSovCi0KLSNkZWZpbmUgRE1BOV9ORVhUX0RFU0NfUFRSCQkweEZGQzAwRTQwCS8qIERNQSBDaGFubmVsIDkgTmV4dCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIJCSovCi0jZGVmaW5lIERNQTlfU1RBUlRfQUREUgkJCTB4RkZDMDBFNDQJLyogRE1BIENoYW5uZWwgOSBTdGFydCBBZGRyZXNzIFJlZ2lzdGVyCQkJCQkqLwotI2RlZmluZSBETUE5X0NPTkZJRwkJCQkweEZGQzAwRTQ4CS8qIERNQSBDaGFubmVsIDkgQ29uZmlndXJhdGlvbiBSZWdpc3RlcgkJCQkJKi8KLSNkZWZpbmUgRE1BOV9YX0NPVU5UCQkJMHhGRkMwMEU1MAkvKiBETUEgQ2hhbm5lbCA5IFggQ291bnQgUmVnaXN0ZXIJCQkJCQkqLwotI2RlZmluZSBETUE5X1hfTU9ESUZZCQkJMHhGRkMwMEU1NAkvKiBETUEgQ2hhbm5lbCA5IFggTW9kaWZ5IFJlZ2lzdGVyCQkJCQkJKi8KLSNkZWZpbmUgRE1BOV9ZX0NPVU5UCQkJMHhGRkMwMEU1OAkvKiBETUEgQ2hhbm5lbCA5IFkgQ291bnQgUmVnaXN0ZXIJCQkJCQkqLwotI2RlZmluZSBETUE5X1lfTU9ESUZZCQkJMHhGRkMwMEU1QwkvKiBETUEgQ2hhbm5lbCA5IFkgTW9kaWZ5IFJlZ2lzdGVyCQkJCQkJKi8KLSNkZWZpbmUgRE1BOV9DVVJSX0RFU0NfUFRSCQkweEZGQzAwRTYwCS8qIERNQSBDaGFubmVsIDkgQ3VycmVudCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIJKi8KLSNkZWZpbmUgRE1BOV9DVVJSX0FERFIJCQkweEZGQzAwRTY0CS8qIERNQSBDaGFubmVsIDkgQ3VycmVudCBBZGRyZXNzIFJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIERNQTlfSVJRX1NUQVRVUwkJCTB4RkZDMDBFNjgJLyogRE1BIENoYW5uZWwgOSBJbnRlcnJ1cHQvU3RhdHVzIFJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIERNQTlfUEVSSVBIRVJBTF9NQVAJCTB4RkZDMDBFNkMJLyogRE1BIENoYW5uZWwgOSBQZXJpcGhlcmFsIE1hcCBSZWdpc3RlcgkJCQkqLwotI2RlZmluZSBETUE5X0NVUlJfWF9DT1VOVAkJMHhGRkMwMEU3MAkvKiBETUEgQ2hhbm5lbCA5IEN1cnJlbnQgWCBDb3VudCBSZWdpc3RlcgkJCQkqLwotI2RlZmluZSBETUE5X0NVUlJfWV9DT1VOVAkJMHhGRkMwMEU3OAkvKiBETUEgQ2hhbm5lbCA5IEN1cnJlbnQgWSBDb3VudCBSZWdpc3RlcgkJCQkqLwotCi0jZGVmaW5lIERNQTEwX05FWFRfREVTQ19QVFIJCTB4RkZDMDBFODAJLyogRE1BIENoYW5uZWwgMTAgTmV4dCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIJCSovCi0jZGVmaW5lIERNQTEwX1NUQVJUX0FERFIJCTB4RkZDMDBFODQJLyogRE1BIENoYW5uZWwgMTAgU3RhcnQgQWRkcmVzcyBSZWdpc3RlcgkJCQkqLwotI2RlZmluZSBETUExMF9DT05GSUcJCQkweEZGQzAwRTg4CS8qIERNQSBDaGFubmVsIDEwIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgRE1BMTBfWF9DT1VOVAkJCTB4RkZDMDBFOTAJLyogRE1BIENoYW5uZWwgMTAgWCBDb3VudCBSZWdpc3RlcgkJCQkJCSovCi0jZGVmaW5lIERNQTEwX1hfTU9ESUZZCQkJMHhGRkMwMEU5NAkvKiBETUEgQ2hhbm5lbCAxMCBYIE1vZGlmeSBSZWdpc3RlcgkJCQkJCSovCi0jZGVmaW5lIERNQTEwX1lfQ09VTlQJCQkweEZGQzAwRTk4CS8qIERNQSBDaGFubmVsIDEwIFkgQ291bnQgUmVnaXN0ZXIJCQkJCQkqLwotI2RlZmluZSBETUExMF9ZX01PRElGWQkJCTB4RkZDMDBFOUMJLyogRE1BIENoYW5uZWwgMTAgWSBNb2RpZnkgUmVnaXN0ZXIJCQkJCQkqLwotI2RlZmluZSBETUExMF9DVVJSX0RFU0NfUFRSCQkweEZGQzAwRUEwCS8qIERNQSBDaGFubmVsIDEwIEN1cnJlbnQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyCSovCi0jZGVmaW5lIERNQTEwX0NVUlJfQUREUgkJCTB4RkZDMDBFQTQJLyogRE1BIENoYW5uZWwgMTAgQ3VycmVudCBBZGRyZXNzIFJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIERNQTEwX0lSUV9TVEFUVVMJCTB4RkZDMDBFQTgJLyogRE1BIENoYW5uZWwgMTAgSW50ZXJydXB0L1N0YXR1cyBSZWdpc3RlcgkJCQkqLwotI2RlZmluZSBETUExMF9QRVJJUEhFUkFMX01BUAkweEZGQzAwRUFDCS8qIERNQSBDaGFubmVsIDEwIFBlcmlwaGVyYWwgTWFwIFJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIERNQTEwX0NVUlJfWF9DT1VOVAkJMHhGRkMwMEVCMAkvKiBETUEgQ2hhbm5lbCAxMCBDdXJyZW50IFggQ291bnQgUmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgRE1BMTBfQ1VSUl9ZX0NPVU5UCQkweEZGQzAwRUI4CS8qIERNQSBDaGFubmVsIDEwIEN1cnJlbnQgWSBDb3VudCBSZWdpc3RlcgkJCQkqLwotCi0jZGVmaW5lIERNQTExX05FWFRfREVTQ19QVFIJCTB4RkZDMDBFQzAJLyogRE1BIENoYW5uZWwgMTEgTmV4dCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIJCSovCi0jZGVmaW5lIERNQTExX1NUQVJUX0FERFIJCTB4RkZDMDBFQzQJLyogRE1BIENoYW5uZWwgMTEgU3RhcnQgQWRkcmVzcyBSZWdpc3RlcgkJCQkqLwotI2RlZmluZSBETUExMV9DT05GSUcJCQkweEZGQzAwRUM4CS8qIERNQSBDaGFubmVsIDExIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgRE1BMTFfWF9DT1VOVAkJCTB4RkZDMDBFRDAJLyogRE1BIENoYW5uZWwgMTEgWCBDb3VudCBSZWdpc3RlcgkJCQkJCSovCi0jZGVmaW5lIERNQTExX1hfTU9ESUZZCQkJMHhGRkMwMEVENAkvKiBETUEgQ2hhbm5lbCAxMSBYIE1vZGlmeSBSZWdpc3RlcgkJCQkJCSovCi0jZGVmaW5lIERNQTExX1lfQ09VTlQJCQkweEZGQzAwRUQ4CS8qIERNQSBDaGFubmVsIDExIFkgQ291bnQgUmVnaXN0ZXIJCQkJCQkqLwotI2RlZmluZSBETUExMV9ZX01PRElGWQkJCTB4RkZDMDBFREMJLyogRE1BIENoYW5uZWwgMTEgWSBNb2RpZnkgUmVnaXN0ZXIJCQkJCQkqLwotI2RlZmluZSBETUExMV9DVVJSX0RFU0NfUFRSCQkweEZGQzAwRUUwCS8qIERNQSBDaGFubmVsIDExIEN1cnJlbnQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyCSovCi0jZGVmaW5lIERNQTExX0NVUlJfQUREUgkJCTB4RkZDMDBFRTQJLyogRE1BIENoYW5uZWwgMTEgQ3VycmVudCBBZGRyZXNzIFJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIERNQTExX0lSUV9TVEFUVVMJCTB4RkZDMDBFRTgJLyogRE1BIENoYW5uZWwgMTEgSW50ZXJydXB0L1N0YXR1cyBSZWdpc3RlcgkJCQkqLwotI2RlZmluZSBETUExMV9QRVJJUEhFUkFMX01BUAkweEZGQzAwRUVDCS8qIERNQSBDaGFubmVsIDExIFBlcmlwaGVyYWwgTWFwIFJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIERNQTExX0NVUlJfWF9DT1VOVAkJMHhGRkMwMEVGMAkvKiBETUEgQ2hhbm5lbCAxMSBDdXJyZW50IFggQ291bnQgUmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgRE1BMTFfQ1VSUl9ZX0NPVU5UCQkweEZGQzAwRUY4CS8qIERNQSBDaGFubmVsIDExIEN1cnJlbnQgWSBDb3VudCBSZWdpc3RlcgkJCQkqLwotCi0jZGVmaW5lIE1ETUFfRDBfTkVYVF9ERVNDX1BUUgkweEZGQzAwRjAwCS8qIE1lbURNQSBTdHJlYW0gMCBEZXN0aW5hdGlvbiBOZXh0IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlcgkJKi8KLSNkZWZpbmUgTURNQV9EMF9TVEFSVF9BRERSCQkweEZGQzAwRjA0CS8qIE1lbURNQSBTdHJlYW0gMCBEZXN0aW5hdGlvbiBTdGFydCBBZGRyZXNzIFJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIE1ETUFfRDBfQ09ORklHCQkJMHhGRkMwMEYwOAkvKiBNZW1ETUEgU3RyZWFtIDAgRGVzdGluYXRpb24gQ29uZmlndXJhdGlvbiBSZWdpc3RlcgkJCQkqLwotI2RlZmluZSBNRE1BX0QwX1hfQ09VTlQJCQkweEZGQzAwRjEwCS8qIE1lbURNQSBTdHJlYW0gMCBEZXN0aW5hdGlvbiBYIENvdW50IFJlZ2lzdGVyCQkJCQkJKi8KLSNkZWZpbmUgTURNQV9EMF9YX01PRElGWQkJMHhGRkMwMEYxNAkvKiBNZW1ETUEgU3RyZWFtIDAgRGVzdGluYXRpb24gWCBNb2RpZnkgUmVnaXN0ZXIJCQkJCSovCi0jZGVmaW5lIE1ETUFfRDBfWV9DT1VOVAkJCTB4RkZDMDBGMTgJLyogTWVtRE1BIFN0cmVhbSAwIERlc3RpbmF0aW9uIFkgQ291bnQgUmVnaXN0ZXIJCQkJCQkqLwotI2RlZmluZSBNRE1BX0QwX1lfTU9ESUZZCQkweEZGQzAwRjFDCS8qIE1lbURNQSBTdHJlYW0gMCBEZXN0aW5hdGlvbiBZIE1vZGlmeSBSZWdpc3RlcgkJCQkJKi8KLSNkZWZpbmUgTURNQV9EMF9DVVJSX0RFU0NfUFRSCTB4RkZDMDBGMjAJLyogTWVtRE1BIFN0cmVhbSAwIERlc3RpbmF0aW9uIEN1cnJlbnQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyCSovCi0jZGVmaW5lIE1ETUFfRDBfQ1VSUl9BRERSCQkweEZGQzAwRjI0CS8qIE1lbURNQSBTdHJlYW0gMCBEZXN0aW5hdGlvbiBDdXJyZW50IEFkZHJlc3MgUmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgTURNQV9EMF9JUlFfU1RBVFVTCQkweEZGQzAwRjI4CS8qIE1lbURNQSBTdHJlYW0gMCBEZXN0aW5hdGlvbiBJbnRlcnJ1cHQvU3RhdHVzIFJlZ2lzdGVyCQkJKi8KLSNkZWZpbmUgTURNQV9EMF9QRVJJUEhFUkFMX01BUAkweEZGQzAwRjJDCS8qIE1lbURNQSBTdHJlYW0gMCBEZXN0aW5hdGlvbiBQZXJpcGhlcmFsIE1hcCBSZWdpc3RlcgkJCQkqLwotI2RlZmluZSBNRE1BX0QwX0NVUlJfWF9DT1VOVAkweEZGQzAwRjMwCS8qIE1lbURNQSBTdHJlYW0gMCBEZXN0aW5hdGlvbiBDdXJyZW50IFggQ291bnQgUmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgTURNQV9EMF9DVVJSX1lfQ09VTlQJMHhGRkMwMEYzOAkvKiBNZW1ETUEgU3RyZWFtIDAgRGVzdGluYXRpb24gQ3VycmVudCBZIENvdW50IFJlZ2lzdGVyCQkJCSovCi0KLSNkZWZpbmUgTURNQV9TMF9ORVhUX0RFU0NfUFRSCTB4RkZDMDBGNDAJLyogTWVtRE1BIFN0cmVhbSAwIFNvdXJjZSBOZXh0IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlcgkJCSovCi0jZGVmaW5lIE1ETUFfUzBfU1RBUlRfQUREUgkJMHhGRkMwMEY0NAkvKiBNZW1ETUEgU3RyZWFtIDAgU291cmNlIFN0YXJ0IEFkZHJlc3MgUmVnaXN0ZXIJCQkJCSovCi0jZGVmaW5lIE1ETUFfUzBfQ09ORklHCQkJMHhGRkMwMEY0OAkvKiBNZW1ETUEgU3RyZWFtIDAgU291cmNlIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIJCQkJCSovCi0jZGVmaW5lIE1ETUFfUzBfWF9DT1VOVAkJCTB4RkZDMDBGNTAJLyogTWVtRE1BIFN0cmVhbSAwIFNvdXJjZSBYIENvdW50IFJlZ2lzdGVyCQkJCQkJCSovCi0jZGVmaW5lIE1ETUFfUzBfWF9NT0RJRlkJCTB4RkZDMDBGNTQJLyogTWVtRE1BIFN0cmVhbSAwIFNvdXJjZSBYIE1vZGlmeSBSZWdpc3RlcgkJCQkJCQkqLwotI2RlZmluZSBNRE1BX1MwX1lfQ09VTlQJCQkweEZGQzAwRjU4CS8qIE1lbURNQSBTdHJlYW0gMCBTb3VyY2UgWSBDb3VudCBSZWdpc3RlcgkJCQkJCQkqLwotI2RlZmluZSBNRE1BX1MwX1lfTU9ESUZZCQkweEZGQzAwRjVDCS8qIE1lbURNQSBTdHJlYW0gMCBTb3VyY2UgWSBNb2RpZnkgUmVnaXN0ZXIJCQkJCQkJKi8KLSNkZWZpbmUgTURNQV9TMF9DVVJSX0RFU0NfUFRSCTB4RkZDMDBGNjAJLyogTWVtRE1BIFN0cmVhbSAwIFNvdXJjZSBDdXJyZW50IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlcgkJKi8KLSNkZWZpbmUgTURNQV9TMF9DVVJSX0FERFIJCTB4RkZDMDBGNjQJLyogTWVtRE1BIFN0cmVhbSAwIFNvdXJjZSBDdXJyZW50IEFkZHJlc3MgUmVnaXN0ZXIJCQkJCSovCi0jZGVmaW5lIE1ETUFfUzBfSVJRX1NUQVRVUwkJMHhGRkMwMEY2OAkvKiBNZW1ETUEgU3RyZWFtIDAgU291cmNlIEludGVycnVwdC9TdGF0dXMgUmVnaXN0ZXIJCQkJCSovCi0jZGVmaW5lIE1ETUFfUzBfUEVSSVBIRVJBTF9NQVAJMHhGRkMwMEY2QwkvKiBNZW1ETUEgU3RyZWFtIDAgU291cmNlIFBlcmlwaGVyYWwgTWFwIFJlZ2lzdGVyCQkJCQkqLwotI2RlZmluZSBNRE1BX1MwX0NVUlJfWF9DT1VOVAkweEZGQzAwRjcwCS8qIE1lbURNQSBTdHJlYW0gMCBTb3VyY2UgQ3VycmVudCBYIENvdW50IFJlZ2lzdGVyCQkJCQkqLwotI2RlZmluZSBNRE1BX1MwX0NVUlJfWV9DT1VOVAkweEZGQzAwRjc4CS8qIE1lbURNQSBTdHJlYW0gMCBTb3VyY2UgQ3VycmVudCBZIENvdW50IFJlZ2lzdGVyCQkJCQkqLwotCi0jZGVmaW5lIE1ETUFfRDFfTkVYVF9ERVNDX1BUUgkweEZGQzAwRjgwCS8qIE1lbURNQSBTdHJlYW0gMSBEZXN0aW5hdGlvbiBOZXh0IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlcgkJKi8KLSNkZWZpbmUgTURNQV9EMV9TVEFSVF9BRERSCQkweEZGQzAwRjg0CS8qIE1lbURNQSBTdHJlYW0gMSBEZXN0aW5hdGlvbiBTdGFydCBBZGRyZXNzIFJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIE1ETUFfRDFfQ09ORklHCQkJMHhGRkMwMEY4OAkvKiBNZW1ETUEgU3RyZWFtIDEgRGVzdGluYXRpb24gQ29uZmlndXJhdGlvbiBSZWdpc3RlcgkJCQkqLwotI2RlZmluZSBNRE1BX0QxX1hfQ09VTlQJCQkweEZGQzAwRjkwCS8qIE1lbURNQSBTdHJlYW0gMSBEZXN0aW5hdGlvbiBYIENvdW50IFJlZ2lzdGVyCQkJCQkJKi8KLSNkZWZpbmUgTURNQV9EMV9YX01PRElGWQkJMHhGRkMwMEY5NAkvKiBNZW1ETUEgU3RyZWFtIDEgRGVzdGluYXRpb24gWCBNb2RpZnkgUmVnaXN0ZXIJCQkJCSovCi0jZGVmaW5lIE1ETUFfRDFfWV9DT1VOVAkJCTB4RkZDMDBGOTgJLyogTWVtRE1BIFN0cmVhbSAxIERlc3RpbmF0aW9uIFkgQ291bnQgUmVnaXN0ZXIJCQkJCQkqLwotI2RlZmluZSBNRE1BX0QxX1lfTU9ESUZZCQkweEZGQzAwRjlDCS8qIE1lbURNQSBTdHJlYW0gMSBEZXN0aW5hdGlvbiBZIE1vZGlmeSBSZWdpc3RlcgkJCQkJKi8KLSNkZWZpbmUgTURNQV9EMV9DVVJSX0RFU0NfUFRSCTB4RkZDMDBGQTAJLyogTWVtRE1BIFN0cmVhbSAxIERlc3RpbmF0aW9uIEN1cnJlbnQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyCSovCi0jZGVmaW5lIE1ETUFfRDFfQ1VSUl9BRERSCQkweEZGQzAwRkE0CS8qIE1lbURNQSBTdHJlYW0gMSBEZXN0aW5hdGlvbiBDdXJyZW50IEFkZHJlc3MgUmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgTURNQV9EMV9JUlFfU1RBVFVTCQkweEZGQzAwRkE4CS8qIE1lbURNQSBTdHJlYW0gMSBEZXN0aW5hdGlvbiBJbnRlcnJ1cHQvU3RhdHVzIFJlZ2lzdGVyCQkJKi8KLSNkZWZpbmUgTURNQV9EMV9QRVJJUEhFUkFMX01BUAkweEZGQzAwRkFDCS8qIE1lbURNQSBTdHJlYW0gMSBEZXN0aW5hdGlvbiBQZXJpcGhlcmFsIE1hcCBSZWdpc3RlcgkJCQkqLwotI2RlZmluZSBNRE1BX0QxX0NVUlJfWF9DT1VOVAkweEZGQzAwRkIwCS8qIE1lbURNQSBTdHJlYW0gMSBEZXN0aW5hdGlvbiBDdXJyZW50IFggQ291bnQgUmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgTURNQV9EMV9DVVJSX1lfQ09VTlQJMHhGRkMwMEZCOAkvKiBNZW1ETUEgU3RyZWFtIDEgRGVzdGluYXRpb24gQ3VycmVudCBZIENvdW50IFJlZ2lzdGVyCQkJCSovCi0KLSNkZWZpbmUgTURNQV9TMV9ORVhUX0RFU0NfUFRSCTB4RkZDMDBGQzAJLyogTWVtRE1BIFN0cmVhbSAxIFNvdXJjZSBOZXh0IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlcgkJCSovCi0jZGVmaW5lIE1ETUFfUzFfU1RBUlRfQUREUgkJMHhGRkMwMEZDNAkvKiBNZW1ETUEgU3RyZWFtIDEgU291cmNlIFN0YXJ0IEFkZHJlc3MgUmVnaXN0ZXIJCQkJCSovCi0jZGVmaW5lIE1ETUFfUzFfQ09ORklHCQkJMHhGRkMwMEZDOAkvKiBNZW1ETUEgU3RyZWFtIDEgU291cmNlIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIJCQkJCSovCi0jZGVmaW5lIE1ETUFfUzFfWF9DT1VOVAkJCTB4RkZDMDBGRDAJLyogTWVtRE1BIFN0cmVhbSAxIFNvdXJjZSBYIENvdW50IFJlZ2lzdGVyCQkJCQkJCSovCi0jZGVmaW5lIE1ETUFfUzFfWF9NT0RJRlkJCTB4RkZDMDBGRDQJLyogTWVtRE1BIFN0cmVhbSAxIFNvdXJjZSBYIE1vZGlmeSBSZWdpc3RlcgkJCQkJCQkqLwotI2RlZmluZSBNRE1BX1MxX1lfQ09VTlQJCQkweEZGQzAwRkQ4CS8qIE1lbURNQSBTdHJlYW0gMSBTb3VyY2UgWSBDb3VudCBSZWdpc3RlcgkJCQkJCQkqLwotI2RlZmluZSBNRE1BX1MxX1lfTU9ESUZZCQkweEZGQzAwRkRDCS8qIE1lbURNQSBTdHJlYW0gMSBTb3VyY2UgWSBNb2RpZnkgUmVnaXN0ZXIJCQkJCQkJKi8KLSNkZWZpbmUgTURNQV9TMV9DVVJSX0RFU0NfUFRSCTB4RkZDMDBGRTAJLyogTWVtRE1BIFN0cmVhbSAxIFNvdXJjZSBDdXJyZW50IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlcgkJKi8KLSNkZWZpbmUgTURNQV9TMV9DVVJSX0FERFIJCTB4RkZDMDBGRTQJLyogTWVtRE1BIFN0cmVhbSAxIFNvdXJjZSBDdXJyZW50IEFkZHJlc3MgUmVnaXN0ZXIJCQkJCSovCi0jZGVmaW5lIE1ETUFfUzFfSVJRX1NUQVRVUwkJMHhGRkMwMEZFOAkvKiBNZW1ETUEgU3RyZWFtIDEgU291cmNlIEludGVycnVwdC9TdGF0dXMgUmVnaXN0ZXIJCQkJCSovCi0jZGVmaW5lIE1ETUFfUzFfUEVSSVBIRVJBTF9NQVAJMHhGRkMwMEZFQwkvKiBNZW1ETUEgU3RyZWFtIDEgU291cmNlIFBlcmlwaGVyYWwgTWFwIFJlZ2lzdGVyCQkJCQkqLwotI2RlZmluZSBNRE1BX1MxX0NVUlJfWF9DT1VOVAkweEZGQzAwRkYwCS8qIE1lbURNQSBTdHJlYW0gMSBTb3VyY2UgQ3VycmVudCBYIENvdW50IFJlZ2lzdGVyCQkJCQkqLwotI2RlZmluZSBNRE1BX1MxX0NVUlJfWV9DT1VOVAkweEZGQzAwRkY4CS8qIE1lbURNQSBTdHJlYW0gMSBTb3VyY2UgQ3VycmVudCBZIENvdW50IFJlZ2lzdGVyCQkJCQkqLwotCi0KLS8qIFBhcmFsbGVsIFBlcmlwaGVyYWwgSW50ZXJmYWNlICgweEZGQzAxMDAwIC0gMHhGRkMwMTBGRikJCQkJKi8KLSNkZWZpbmUgUFBJX0NPTlRST0wJCQkweEZGQzAxMDAwCS8qIFBQSSBDb250cm9sIFJlZ2lzdGVyCQkJKi8KLSNkZWZpbmUgUFBJX1NUQVRVUwkJCTB4RkZDMDEwMDQJLyogUFBJIFN0YXR1cyBSZWdpc3RlcgkJCSovCi0jZGVmaW5lIFBQSV9DT1VOVAkJCTB4RkZDMDEwMDgJLyogUFBJIFRyYW5zZmVyIENvdW50IFJlZ2lzdGVyCSovCi0jZGVmaW5lIFBQSV9ERUxBWQkJCTB4RkZDMDEwMEMJLyogUFBJIERlbGF5IENvdW50IFJlZ2lzdGVyCQkqLwotI2RlZmluZSBQUElfRlJBTUUJCQkweEZGQzAxMDEwCS8qIFBQSSBGcmFtZSBMZW5ndGggUmVnaXN0ZXIJKi8KLQotCi0vKiBUd28tV2lyZSBJbnRlcmZhY2UJCSgweEZGQzAxNDAwIC0gMHhGRkMwMTRGRikJCQkJCQkJCSovCi0jZGVmaW5lIFRXSTBfUkVHQkFTRQkJCTB4RkZDMDE0MDAKLSNkZWZpbmUgVFdJMF9DTEtESVYJCQkweEZGQzAxNDAwCS8qIFNlcmlhbCBDbG9jayBEaXZpZGVyIFJlZ2lzdGVyCQkJKi8KLSNkZWZpbmUgVFdJMF9DT05UUk9MCQkJMHhGRkMwMTQwNAkvKiBUV0kgQ29udHJvbCBSZWdpc3RlcgkJCQkJCSovCi0jZGVmaW5lIFRXSTBfU0xBVkVfQ1RMCQkweEZGQzAxNDA4CS8qIFNsYXZlIE1vZGUgQ29udHJvbCBSZWdpc3RlcgkJCQkqLwotI2RlZmluZSBUV0kwX1NMQVZFX1NUQVQJCTB4RkZDMDE0MEMJLyogU2xhdmUgTW9kZSBTdGF0dXMgUmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgVFdJMF9TTEFWRV9BRERSCQkweEZGQzAxNDEwCS8qIFNsYXZlIE1vZGUgQWRkcmVzcyBSZWdpc3RlcgkJCQkqLwotI2RlZmluZSBUV0kwX01BU1RFUl9DVEwJCTB4RkZDMDE0MTQJLyogTWFzdGVyIE1vZGUgQ29udHJvbCBSZWdpc3RlcgkJCQkqLwotI2RlZmluZSBUV0kwX01BU1RFUl9TVEFUCQkweEZGQzAxNDE4CS8qIE1hc3RlciBNb2RlIFN0YXR1cyBSZWdpc3RlcgkJCQkqLwotI2RlZmluZSBUV0kwX01BU1RFUl9BRERSCQkweEZGQzAxNDFDCS8qIE1hc3RlciBNb2RlIEFkZHJlc3MgUmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgVFdJMF9JTlRfU1RBVAkJMHhGRkMwMTQyMAkvKiBUV0kgSW50ZXJydXB0IFN0YXR1cyBSZWdpc3RlcgkJCSovCi0jZGVmaW5lIFRXSTBfSU5UX01BU0sJCTB4RkZDMDE0MjQJLyogVFdJIE1hc3RlciBJbnRlcnJ1cHQgTWFzayBSZWdpc3RlcgkJKi8KLSNkZWZpbmUgVFdJMF9GSUZPX0NUTAkJMHhGRkMwMTQyOAkvKiBGSUZPIENvbnRyb2wgUmVnaXN0ZXIJCQkJCSovCi0jZGVmaW5lIFRXSTBfRklGT19TVEFUCQkweEZGQzAxNDJDCS8qIEZJRk8gU3RhdHVzIFJlZ2lzdGVyCQkJCQkJKi8KLSNkZWZpbmUgVFdJMF9YTVRfREFUQTgJCTB4RkZDMDE0ODAJLyogRklGTyBUcmFuc21pdCBEYXRhIFNpbmdsZSBCeXRlIFJlZ2lzdGVyCSovCi0jZGVmaW5lIFRXSTBfWE1UX0RBVEExNgkJMHhGRkMwMTQ4NAkvKiBGSUZPIFRyYW5zbWl0IERhdGEgRG91YmxlIEJ5dGUgUmVnaXN0ZXIJKi8KLSNkZWZpbmUgVFdJMF9SQ1ZfREFUQTgJCTB4RkZDMDE0ODgJLyogRklGTyBSZWNlaXZlIERhdGEgU2luZ2xlIEJ5dGUgUmVnaXN0ZXIJKi8KLSNkZWZpbmUgVFdJMF9SQ1ZfREFUQTE2CQkweEZGQzAxNDhDCS8qIEZJRk8gUmVjZWl2ZSBEYXRhIERvdWJsZSBCeXRlIFJlZ2lzdGVyCSovCi0KLQotLyogR2VuZXJhbCBQdXJwb3NlIEkvTyBQb3J0IEcgKDB4RkZDMDE1MDAgLSAweEZGQzAxNUZGKQkJCQkJCQkJCQkJCSovCi0jZGVmaW5lIFBPUlRHSU8JCQkJCTB4RkZDMDE1MDAJLyogUG9ydCBHIEkvTyBQaW4gU3RhdGUgU3BlY2lmeSBSZWdpc3RlcgkJCQkqLwotI2RlZmluZSBQT1JUR0lPX0NMRUFSCQkJMHhGRkMwMTUwNAkvKiBQb3J0IEcgSS9PIFBlcmlwaGVyYWwgSW50ZXJydXB0IENsZWFyIFJlZ2lzdGVyCQkqLwotI2RlZmluZSBQT1JUR0lPX1NFVAkJCQkweEZGQzAxNTA4CS8qIFBvcnQgRyBJL08gUGVyaXBoZXJhbCBJbnRlcnJ1cHQgU2V0IFJlZ2lzdGVyCQkJKi8KLSNkZWZpbmUgUE9SVEdJT19UT0dHTEUJCQkweEZGQzAxNTBDCS8qIFBvcnQgRyBJL08gUGluIFN0YXRlIFRvZ2dsZSBSZWdpc3RlcgkJCQkJKi8KLSNkZWZpbmUgUE9SVEdJT19NQVNLQQkJCTB4RkZDMDE1MTAJLyogUG9ydCBHIEkvTyBNYXNrIFN0YXRlIFNwZWNpZnkgSW50ZXJydXB0IEEgUmVnaXN0ZXIJKi8KLSNkZWZpbmUgUE9SVEdJT19NQVNLQV9DTEVBUgkJMHhGRkMwMTUxNAkvKiBQb3J0IEcgSS9PIE1hc2sgRGlzYWJsZSBJbnRlcnJ1cHQgQSBSZWdpc3RlcgkJCSovCi0jZGVmaW5lIFBPUlRHSU9fTUFTS0FfU0VUCQkweEZGQzAxNTE4CS8qIFBvcnQgRyBJL08gTWFzayBFbmFibGUgSW50ZXJydXB0IEEgUmVnaXN0ZXIJCQkqLwotI2RlZmluZSBQT1JUR0lPX01BU0tBX1RPR0dMRQkweEZGQzAxNTFDCS8qIFBvcnQgRyBJL08gTWFzayBUb2dnbGUgRW5hYmxlIEludGVycnVwdCBBIFJlZ2lzdGVyCSovCi0jZGVmaW5lIFBPUlRHSU9fTUFTS0IJCQkweEZGQzAxNTIwCS8qIFBvcnQgRyBJL08gTWFzayBTdGF0ZSBTcGVjaWZ5IEludGVycnVwdCBCIFJlZ2lzdGVyCSovCi0jZGVmaW5lIFBPUlRHSU9fTUFTS0JfQ0xFQVIJCTB4RkZDMDE1MjQJLyogUG9ydCBHIEkvTyBNYXNrIERpc2FibGUgSW50ZXJydXB0IEIgUmVnaXN0ZXIJCQkqLwotI2RlZmluZSBQT1JUR0lPX01BU0tCX1NFVAkJMHhGRkMwMTUyOAkvKiBQb3J0IEcgSS9PIE1hc2sgRW5hYmxlIEludGVycnVwdCBCIFJlZ2lzdGVyCQkJKi8KLSNkZWZpbmUgUE9SVEdJT19NQVNLQl9UT0dHTEUJMHhGRkMwMTUyQwkvKiBQb3J0IEcgSS9PIE1hc2sgVG9nZ2xlIEVuYWJsZSBJbnRlcnJ1cHQgQiBSZWdpc3RlcgkqLwotI2RlZmluZSBQT1JUR0lPX0RJUgkJCQkweEZGQzAxNTMwCS8qIFBvcnQgRyBJL08gRGlyZWN0aW9uIFJlZ2lzdGVyCQkJCQkJKi8KLSNkZWZpbmUgUE9SVEdJT19QT0xBUgkJCTB4RkZDMDE1MzQJLyogUG9ydCBHIEkvTyBTb3VyY2UgUG9sYXJpdHkgUmVnaXN0ZXIJCQkJCSovCi0jZGVmaW5lIFBPUlRHSU9fRURHRQkJCTB4RkZDMDE1MzgJLyogUG9ydCBHIEkvTyBTb3VyY2UgU2Vuc2l0aXZpdHkgUmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgUE9SVEdJT19CT1RICQkJMHhGRkMwMTUzQwkvKiBQb3J0IEcgSS9PIFNldCBvbiBCT1RIIEVkZ2VzIFJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIFBPUlRHSU9fSU5FTgkJCTB4RkZDMDE1NDAJLyogUG9ydCBHIEkvTyBJbnB1dCBFbmFibGUgUmVnaXN0ZXIJCQkJCQkqLwotCi0KLS8qIEdlbmVyYWwgUHVycG9zZSBJL08gUG9ydCBIICgweEZGQzAxNzAwIC0gMHhGRkMwMTdGRikJCQkJCQkJCQkJCQkqLwotI2RlZmluZSBQT1JUSElPCQkJCQkweEZGQzAxNzAwCS8qIFBvcnQgSCBJL08gUGluIFN0YXRlIFNwZWNpZnkgUmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgUE9SVEhJT19DTEVBUgkJCTB4RkZDMDE3MDQJLyogUG9ydCBIIEkvTyBQZXJpcGhlcmFsIEludGVycnVwdCBDbGVhciBSZWdpc3RlcgkJKi8KLSNkZWZpbmUgUE9SVEhJT19TRVQJCQkJMHhGRkMwMTcwOAkvKiBQb3J0IEggSS9PIFBlcmlwaGVyYWwgSW50ZXJydXB0IFNldCBSZWdpc3RlcgkJCSovCi0jZGVmaW5lIFBPUlRISU9fVE9HR0xFCQkJMHhGRkMwMTcwQwkvKiBQb3J0IEggSS9PIFBpbiBTdGF0ZSBUb2dnbGUgUmVnaXN0ZXIJCQkJCSovCi0jZGVmaW5lIFBPUlRISU9fTUFTS0EJCQkweEZGQzAxNzEwCS8qIFBvcnQgSCBJL08gTWFzayBTdGF0ZSBTcGVjaWZ5IEludGVycnVwdCBBIFJlZ2lzdGVyCSovCi0jZGVmaW5lIFBPUlRISU9fTUFTS0FfQ0xFQVIJCTB4RkZDMDE3MTQJLyogUG9ydCBIIEkvTyBNYXNrIERpc2FibGUgSW50ZXJydXB0IEEgUmVnaXN0ZXIJCQkqLwotI2RlZmluZSBQT1JUSElPX01BU0tBX1NFVAkJMHhGRkMwMTcxOAkvKiBQb3J0IEggSS9PIE1hc2sgRW5hYmxlIEludGVycnVwdCBBIFJlZ2lzdGVyCQkJKi8KLSNkZWZpbmUgUE9SVEhJT19NQVNLQV9UT0dHTEUJMHhGRkMwMTcxQwkvKiBQb3J0IEggSS9PIE1hc2sgVG9nZ2xlIEVuYWJsZSBJbnRlcnJ1cHQgQSBSZWdpc3RlcgkqLwotI2RlZmluZSBQT1JUSElPX01BU0tCCQkJMHhGRkMwMTcyMAkvKiBQb3J0IEggSS9PIE1hc2sgU3RhdGUgU3BlY2lmeSBJbnRlcnJ1cHQgQiBSZWdpc3RlcgkqLwotI2RlZmluZSBQT1JUSElPX01BU0tCX0NMRUFSCQkweEZGQzAxNzI0CS8qIFBvcnQgSCBJL08gTWFzayBEaXNhYmxlIEludGVycnVwdCBCIFJlZ2lzdGVyCQkJKi8KLSNkZWZpbmUgUE9SVEhJT19NQVNLQl9TRVQJCTB4RkZDMDE3MjgJLyogUG9ydCBIIEkvTyBNYXNrIEVuYWJsZSBJbnRlcnJ1cHQgQiBSZWdpc3RlcgkJCSovCi0jZGVmaW5lIFBPUlRISU9fTUFTS0JfVE9HR0xFCTB4RkZDMDE3MkMJLyogUG9ydCBIIEkvTyBNYXNrIFRvZ2dsZSBFbmFibGUgSW50ZXJydXB0IEIgUmVnaXN0ZXIJKi8KLSNkZWZpbmUgUE9SVEhJT19ESVIJCQkJMHhGRkMwMTczMAkvKiBQb3J0IEggSS9PIERpcmVjdGlvbiBSZWdpc3RlcgkJCQkJCSovCi0jZGVmaW5lIFBPUlRISU9fUE9MQVIJCQkweEZGQzAxNzM0CS8qIFBvcnQgSCBJL08gU291cmNlIFBvbGFyaXR5IFJlZ2lzdGVyCQkJCQkqLwotI2RlZmluZSBQT1JUSElPX0VER0UJCQkweEZGQzAxNzM4CS8qIFBvcnQgSCBJL08gU291cmNlIFNlbnNpdGl2aXR5IFJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIFBPUlRISU9fQk9USAkJCTB4RkZDMDE3M0MJLyogUG9ydCBIIEkvTyBTZXQgb24gQk9USCBFZGdlcyBSZWdpc3RlcgkJCQkqLwotI2RlZmluZSBQT1JUSElPX0lORU4JCQkweEZGQzAxNzQwCS8qIFBvcnQgSCBJL08gSW5wdXQgRW5hYmxlIFJlZ2lzdGVyCQkJCQkJKi8KLQotCi0vKiBVQVJUMSBDb250cm9sbGVyCQkoMHhGRkMwMjAwMCAtIDB4RkZDMDIwRkYpCQkJCQkJCQkqLwotI2RlZmluZSBVQVJUMV9USFIJCQkweEZGQzAyMDAwCS8qIFRyYW5zbWl0IEhvbGRpbmcgcmVnaXN0ZXIJCQkqLwotI2RlZmluZSBVQVJUMV9SQlIJCQkweEZGQzAyMDAwCS8qIFJlY2VpdmUgQnVmZmVyIHJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIFVBUlQxX0RMTAkJCTB4RkZDMDIwMDAJLyogRGl2aXNvciBMYXRjaCAoTG93LUJ5dGUpCQkJCSovCi0jZGVmaW5lIFVBUlQxX0lFUgkJCTB4RkZDMDIwMDQJLyogSW50ZXJydXB0IEVuYWJsZSBSZWdpc3RlcgkJCSovCi0jZGVmaW5lIFVBUlQxX0RMSAkJCTB4RkZDMDIwMDQJLyogRGl2aXNvciBMYXRjaCAoSGlnaC1CeXRlKQkJCSovCi0jZGVmaW5lIFVBUlQxX0lJUgkJCTB4RkZDMDIwMDgJLyogSW50ZXJydXB0IElkZW50aWZpY2F0aW9uIFJlZ2lzdGVyCSovCi0jZGVmaW5lIFVBUlQxX0xDUgkJCTB4RkZDMDIwMEMJLyogTGluZSBDb250cm9sIFJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIFVBUlQxX01DUgkJCTB4RkZDMDIwMTAJLyogTW9kZW0gQ29udHJvbCBSZWdpc3RlcgkJCQkqLwotI2RlZmluZSBVQVJUMV9MU1IJCQkweEZGQzAyMDE0CS8qIExpbmUgU3RhdHVzIFJlZ2lzdGVyCQkJCQkqLwotI2RlZmluZSBVQVJUMV9NU1IJCQkweEZGQzAyMDE4CS8qIE1vZGVtIFN0YXR1cyBSZWdpc3RlcgkJCQkqLwotI2RlZmluZSBVQVJUMV9TQ1IJCQkweEZGQzAyMDFDCS8qIFNDUiBTY3JhdGNoIFJlZ2lzdGVyCQkJCQkqLwotI2RlZmluZSBVQVJUMV9HQ1RMCQkJMHhGRkMwMjAyNAkvKiBHbG9iYWwgQ29udHJvbCBSZWdpc3RlcgkJCQkqLwotCi0KLS8qIE9taXQgQ0FOIHJlZ2lzdGVyIHNldHMgZnJvbSB0aGUgZGVmQkY1MzQuaCAoQ0FOIGlzIG5vdCBpbiB0aGUgQURTUC1CRjUyeCBwcm9jZXNzb3IpICovCi0KLS8qIFBpbiBDb250cm9sIFJlZ2lzdGVycwkoMHhGRkMwMzIwMCAtIDB4RkZDMDMyRkYpCQkJCQkJCQkJCQkqLwotI2RlZmluZSBQT1JURl9GRVIJCQkweEZGQzAzMjAwCS8qIFBvcnQgRiBGdW5jdGlvbiBFbmFibGUgUmVnaXN0ZXIgKEFsdGVybmF0ZS9GbGFnKikJKi8KLSNkZWZpbmUgUE9SVEdfRkVSCQkJMHhGRkMwMzIwNAkvKiBQb3J0IEcgRnVuY3Rpb24gRW5hYmxlIFJlZ2lzdGVyIChBbHRlcm5hdGUvRmxhZyopCSovCi0jZGVmaW5lIFBPUlRIX0ZFUgkJCTB4RkZDMDMyMDgJLyogUG9ydCBIIEZ1bmN0aW9uIEVuYWJsZSBSZWdpc3RlciAoQWx0ZXJuYXRlL0ZsYWcqKQkqLwotI2RlZmluZSBCRklOX1BPUlRfTVVYCQkJMHhGRkMwMzIwQwkvKiBQb3J0IE11bHRpcGxleGVyIENvbnRyb2wgUmVnaXN0ZXIJCQkJCSovCi0KLQotLyogSGFuZHNoYWtlIE1ETUEgUmVnaXN0ZXJzCSgweEZGQzAzMzAwIC0gMHhGRkMwMzNGRikJCQkJCQkJCQkJKi8KLSNkZWZpbmUgSE1ETUEwX0NPTlRST0wJCTB4RkZDMDMzMDAJLyogSGFuZHNoYWtlIE1ETUEwIENvbnRyb2wgUmVnaXN0ZXIJCQkJCSovCi0jZGVmaW5lIEhNRE1BMF9FQ0lOSVQJCTB4RkZDMDMzMDQJLyogSE1ETUEwIEluaXRpYWwgRWRnZSBDb3VudCBSZWdpc3RlcgkJCQkqLwotI2RlZmluZSBITURNQTBfQkNJTklUCQkweEZGQzAzMzA4CS8qIEhNRE1BMCBJbml0aWFsIEJsb2NrIENvdW50IFJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIEhNRE1BMF9FQ1VSR0VOVAkJMHhGRkMwMzMwQwkvKiBITURNQTAgVXJnZW50IEVkZ2UgQ291bnQgVGhyZXNob2xkIFJlZ2lzdGVyCQkqLwotI2RlZmluZSBITURNQTBfRUNPVkVSRkxPVwkweEZGQzAzMzEwCS8qIEhNRE1BMCBFZGdlIENvdW50IE92ZXJmbG93IEludGVycnVwdCBSZWdpc3RlcgkqLwotI2RlZmluZSBITURNQTBfRUNPVU5UCQkweEZGQzAzMzE0CS8qIEhNRE1BMCBDdXJyZW50IEVkZ2UgQ291bnQgUmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgSE1ETUEwX0JDT1VOVAkJMHhGRkMwMzMxOAkvKiBITURNQTAgQ3VycmVudCBCbG9jayBDb3VudCBSZWdpc3RlcgkJCQkqLwotCi0jZGVmaW5lIEhNRE1BMV9DT05UUk9MCQkweEZGQzAzMzQwCS8qIEhhbmRzaGFrZSBNRE1BMSBDb250cm9sIFJlZ2lzdGVyCQkJCQkqLwotI2RlZmluZSBITURNQTFfRUNJTklUCQkweEZGQzAzMzQ0CS8qIEhNRE1BMSBJbml0aWFsIEVkZ2UgQ291bnQgUmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgSE1ETUExX0JDSU5JVAkJMHhGRkMwMzM0OAkvKiBITURNQTEgSW5pdGlhbCBCbG9jayBDb3VudCBSZWdpc3RlcgkJCQkqLwotI2RlZmluZSBITURNQTFfRUNVUkdFTlQJCTB4RkZDMDMzNEMJLyogSE1ETUExIFVyZ2VudCBFZGdlIENvdW50IFRocmVzaG9sZCBSZWdpc3RlcgkJKi8KLSNkZWZpbmUgSE1ETUExX0VDT1ZFUkZMT1cJMHhGRkMwMzM1MAkvKiBITURNQTEgRWRnZSBDb3VudCBPdmVyZmxvdyBJbnRlcnJ1cHQgUmVnaXN0ZXIJKi8KLSNkZWZpbmUgSE1ETUExX0VDT1VOVAkJMHhGRkMwMzM1NAkvKiBITURNQTEgQ3VycmVudCBFZGdlIENvdW50IFJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIEhNRE1BMV9CQ09VTlQJCTB4RkZDMDMzNTgJLyogSE1ETUExIEN1cnJlbnQgQmxvY2sgQ291bnQgUmVnaXN0ZXIJCQkJKi8KLQotLyogR1BJTyBQSU4gbXV4ICgweEZGQzAzMjEwIC0gT3hGRkMwMzI4OCkgKi8KLSNkZWZpbmUgUE9SVEZfTVVYICAgICAgICAgICAgICAgMHhGRkMwMzIxMCAgICAgIC8qIFBvcnQgRiBtdXggY29udHJvbCAqLwotI2RlZmluZSBQT1JUR19NVVggICAgICAgICAgICAgICAweEZGQzAzMjE0ICAgICAgLyogUG9ydCBHIG11eCBjb250cm9sICovCi0jZGVmaW5lIFBPUlRIX01VWCAgICAgICAgICAgICAgIDB4RkZDMDMyMTggICAgICAvKiBQb3J0IEggbXV4IGNvbnRyb2wgKi8KLSNkZWZpbmUgUE9SVEZfRFJJVkUgICAgICAgICAgICAgMHhGRkMwMzIyMCAgICAgIC8qIFBvcnQgRiBkcml2ZSBzdHJlbmd0aCBjb250cm9sICovCi0jZGVmaW5lIFBPUlRHX0RSSVZFICAgICAgICAgICAgIDB4RkZDMDMyMjQgICAgICAvKiBQb3J0IEcgZHJpdmUgc3RyZW5ndGggY29udHJvbCAqLwotI2RlZmluZSBQT1JUSF9EUklWRSAgICAgICAgICAgICAweEZGQzAzMjI4ICAgICAgLyogUG9ydCBIIGRyaXZlIHN0cmVuZ3RoIGNvbnRyb2wgKi8KLSNkZWZpbmUgUE9SVEZfU0xFVyAgICAgICAgICAgICAgMHhGRkMwMzIzMCAgICAgIC8qIFBvcnQgRiBzbGV3IGNvbnRyb2wgKi8KLSNkZWZpbmUgUE9SVEdfU0xFVyAgICAgICAgICAgICAgMHhGRkMwMzIzNCAgICAgIC8qIFBvcnQgRyBzbGV3IGNvbnRyb2wgKi8KLSNkZWZpbmUgUE9SVEhfU0xFVyAgICAgICAgICAgICAgMHhGRkMwMzIzOCAgICAgIC8qIFBvcnQgSCBzbGV3IGNvbnRyb2wgKi8KLSNkZWZpbmUgUE9SVEZfSFlTVEVSSVNJUyAgICAgICAgMHhGRkMwMzI0MCAgICAgIC8qIFBvcnQgRiBTY2htaXR0IHRyaWdnZXIgY29udHJvbCAqLwotI2RlZmluZSBQT1JUR19IWVNURVJJU0lTICAgICAgICAweEZGQzAzMjQ0ICAgICAgLyogUG9ydCBHIFNjaG1pdHQgdHJpZ2dlciBjb250cm9sICovCi0jZGVmaW5lIFBPUlRIX0hZU1RFUklTSVMgICAgICAgIDB4RkZDMDMyNDggICAgICAvKiBQb3J0IEggU2NobWl0dCB0cmlnZ2VyIGNvbnRyb2wgKi8KLSNkZWZpbmUgTUlTQ1BPUlRfRFJJVkUgICAgICAgICAgMHhGRkMwMzI4MCAgICAgIC8qIE1pc2MgUG9ydCBkcml2ZSBzdHJlbmd0aCBjb250cm9sICovCi0jZGVmaW5lIE1JU0NQT1JUX1NMRVcgICAgICAgICAgIDB4RkZDMDMyODQgICAgICAvKiBNaXNjIFBvcnQgc2xldyBjb250cm9sICovCi0jZGVmaW5lIE1JU0NQT1JUX0hZU1RFUklTSVMgICAgIDB4RkZDMDMyODggICAgICAvKiBNaXNjIFBvcnQgU2NobWl0dCB0cmlnZ2VyIGNvbnRyb2wgKi8KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoqIFN5c3RlbSBNTVIgUmVnaXN0ZXIgQml0cyBBbmQgTWFjcm9zCi0qKgotKiogRGlzY2xhaW1lcjoJQWxsIG1hY3JvcyBhcmUgaW50ZW5kZWQgdG8gbWFrZSBDIGFuZCBBc3NlbWJseSBjb2RlIG1vcmUgcmVhZGFibGUuCi0qKgkJCQlVc2UgdGhlc2UgbWFjcm9zIGNhcmVmdWxseSwgYXMgYW55IHRoYXQgZG8gbGVmdCBzaGlmdHMgZm9yIGZpZWxkCi0qKgkJCQlkZXBvc2l0aW5nIHdpbGwgcmVzdWx0IGluIHRoZSBsb3dlciBvcmRlciBiaXRzIGJlaW5nIGRlc3Ryb3llZC4gIEFueQotKioJCQkJbWFjcm8gdGhhdCBzaGlmdHMgbGVmdCB0byBwcm9wZXJseSBwb3NpdGlvbiB0aGUgYml0LWZpZWxkIHNob3VsZCBiZQotKioJCQkJdXNlZCBhcyBwYXJ0IG9mIGFuIE9SIHRvIGluaXRpYWxpemUgYSByZWdpc3RlciBhbmQgTk9UIGFzIGEgZHluYW1pYwotKioJCQkJbW9kaWZpZXIgVU5MRVNTIHRoZSBsb3dlciBvcmRlciBiaXRzIGFyZSBzYXZlZCBhbmQgT1JlZCBiYWNrIGluIHdoZW4KLSoqCQkJCXRoZSBtYWNybyBpcyB1c2VkLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogQ0hJUElEIE1hc2tzICovCi0jZGVmaW5lIENISVBJRF9WRVJTSU9OICAgICAgICAgMHhGMDAwMDAwMAotI2RlZmluZSBDSElQSURfRkFNSUxZICAgICAgICAgIDB4MEZGRkYwMDAKLSNkZWZpbmUgQ0hJUElEX01BTlVGQUNUVVJFICAgICAweDAwMDAwRkZFCi0KLS8qIFNXUlNUIE1hc2tzCQkJCQkJCQkJCQkJCQkJCQkJKi8KLSNkZWZpbmUgU1lTVEVNX1JFU0VUCQkweDAwMDcJLyogSW5pdGlhdGVzIEEgU3lzdGVtIFNvZnR3YXJlIFJlc2V0CQkJKi8KLSNkZWZpbmUJRE9VQkxFX0ZBVUxUCQkweDAwMDgJLyogQ29yZSBEb3VibGUgRmF1bHQgQ2F1c2VzIFJlc2V0CQkJCSovCi0jZGVmaW5lIFJFU0VUX0RPVUJMRQkJMHgyMDAwCS8qIFNXIFJlc2V0IEdlbmVyYXRlZCBCeSBDb3JlIERvdWJsZS1GYXVsdAkJKi8KLSNkZWZpbmUgUkVTRVRfV0RPRwkJCTB4NDAwMAkvKiBTVyBSZXNldCBHZW5lcmF0ZWQgQnkgV2F0Y2hkb2cgVGltZXIJCQkqLwotI2RlZmluZSBSRVNFVF9TT0ZUV0FSRQkJMHg4MDAwCS8qIFNXIFJlc2V0IE9jY3VycmVkIFNpbmNlIExhc3QgUmVhZCBPZiBTV1JTVAkqLwotCi0vKiBTWVNDUiBNYXNrcwkJCQkJCQkJCQkJCQkJCQkJCQkJKi8KLSNkZWZpbmUgQk1PREUJCQkJMHgwMDA3CS8qIEJvb3QgTW9kZSAtIExhdGNoZWQgRHVyaW5nIEhXIFJlc2V0IEZyb20gTW9kZSBQaW5zCSovCi0jZGVmaW5lCU5PQk9PVAkJCQkweDAwMTAJLyogRXhlY3V0ZSBGcm9tIEwxIG9yIEFTWU5DIEJhbmsgMCBXaGVuIEJNT0RFID0gMAkJKi8KLQotCi0vKiAqKioqKioqKioqKioqICBTWVNURU0gSU5URVJSVVBUIENPTlRST0xMRVIgTUFTS1MgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIFBlcmlwaGVyYWwgTWFza3MgRm9yIFNJQ19JU1IsIFNJQ19JV1IsIFNJQ19JTUFTSwkJCQkJCQkJCQkqLwotCi0jaWYgMAotI2RlZmluZSBJUlFfUExMX1dBS0VVUAkweDAwMDAwMDAxCS8qIFBMTCBXYWtldXAgSW50ZXJydXB0CQkJIAkJCQkJKi8KLQotI2RlZmluZSBJUlFfRVJST1IxICAgICAgMHgwMDAwMDAwMiAgLyogRXJyb3IgSW50ZXJydXB0IChETUEsIERNQVJ4IEJsb2NrLCBETUFSeCBPdmVyZmxvdykgKi8KLSNkZWZpbmUgSVJRX0VSUk9SMiAgICAgIDB4MDAwMDAwMDQgIC8qIEVycm9yIEludGVycnVwdCAoQ0FOLCBFdGhlcm5ldCwgU1BPUlR4LCBQUEksIFNQSSwgVUFSVHgpICovCi0jZGVmaW5lIElSUV9SVEMJCQkweDAwMDAwMDA4CS8qIFJlYWwgVGltZSBDbG9jayBJbnRlcnJ1cHQgCQkJCQkJKi8KLSNkZWZpbmUgSVJRX0RNQTAJCTB4MDAwMDAwMTAJLyogRE1BIENoYW5uZWwgMCAoUFBJKSBJbnRlcnJ1cHQgCQkJCQkqLwotI2RlZmluZSBJUlFfRE1BMwkJMHgwMDAwMDAyMAkvKiBETUEgQ2hhbm5lbCAzIChTUE9SVDAgUlgpIEludGVycnVwdCAJCQkJKi8KLSNkZWZpbmUgSVJRX0RNQTQJCTB4MDAwMDAwNDAJLyogRE1BIENoYW5uZWwgNCAoU1BPUlQwIFRYKSBJbnRlcnJ1cHQgCQkJCSovCi0jZGVmaW5lIElSUV9ETUE1CQkweDAwMDAwMDgwCS8qIERNQSBDaGFubmVsIDUgKFNQT1JUMSBSWCkgSW50ZXJydXB0IAkJCQkqLwotCi0jZGVmaW5lIElSUV9ETUE2CQkweDAwMDAwMTAwCS8qIERNQSBDaGFubmVsIDYgKFNQT1JUMSBUWCkgSW50ZXJydXB0IAkJIAkJKi8KLSNkZWZpbmUgSVJRX1RXSQkJCTB4MDAwMDAyMDAJLyogVFdJIEludGVycnVwdAkJCQkJCQkJCSovCi0jZGVmaW5lIElSUV9ETUE3CQkweDAwMDAwNDAwCS8qIERNQSBDaGFubmVsIDcgKFNQSSkgSW50ZXJydXB0IAkJCQkJKi8KLSNkZWZpbmUgSVJRX0RNQTgJCTB4MDAwMDA4MDAJLyogRE1BIENoYW5uZWwgOCAoVUFSVDAgUlgpIEludGVycnVwdCAJCQkJKi8KLSNkZWZpbmUgSVJRX0RNQTkJCTB4MDAwMDEwMDAJLyogRE1BIENoYW5uZWwgOSAoVUFSVDAgVFgpIEludGVycnVwdCAJCQkJKi8KLSNkZWZpbmUgSVJRX0RNQTEwCQkweDAwMDAyMDAwCS8qIERNQSBDaGFubmVsIDEwIChVQVJUMSBSWCkgSW50ZXJydXB0IAkJCQkqLwotI2RlZmluZSBJUlFfRE1BMTEJCTB4MDAwMDQwMDAJLyogRE1BIENoYW5uZWwgMTEgKFVBUlQxIFRYKSBJbnRlcnJ1cHQgCQkJCSovCi0jZGVmaW5lIElSUV9DQU5fUlgJCTB4MDAwMDgwMDAJLyogQ0FOIFJlY2VpdmUgSW50ZXJydXB0IAkJCQkJCQkqLwotCi0jZGVmaW5lIElSUV9DQU5fVFgJCTB4MDAwMTAwMDAJLyogQ0FOIFRyYW5zbWl0IEludGVycnVwdCAgCQkJCQkJCSovCi0jZGVmaW5lIElSUV9ETUExCQkweDAwMDIwMDAwCS8qIERNQSBDaGFubmVsIDEgKEV0aGVybmV0IFJYKSBJbnRlcnJ1cHQgCQkJKi8KLSNkZWZpbmUgSVJRX1BGQV9QT1JUSAkweDAwMDIwMDAwCS8qIFBGIFBvcnQgSCAoUEY0NzozMikgSW50ZXJydXB0IEEgCQkJCQkqLwotI2RlZmluZSBJUlFfRE1BMgkJMHgwMDA0MDAwMAkvKiBETUEgQ2hhbm5lbCAyIChFdGhlcm5ldCBUWCkgSW50ZXJydXB0IAkJCSovCi0jZGVmaW5lIElSUV9QRkJfUE9SVEgJMHgwMDA0MDAwMAkvKiBQRiBQb3J0IEggKFBGNDc6MzIpIEludGVycnVwdCBCIAkJCQkJKi8KLSNkZWZpbmUgSVJRX1RJTUVSMAkJMHgwMDA4MDAwMAkvKiBUaW1lciAwIEludGVycnVwdAkJCQkJCQkJKi8KLSNkZWZpbmUgSVJRX1RJTUVSMQkJMHgwMDEwMDAwMAkvKiBUaW1lciAxIEludGVycnVwdCAJCQkJCQkJCSovCi0jZGVmaW5lIElSUV9USU1FUjIJCTB4MDAyMDAwMDAJLyogVGltZXIgMiBJbnRlcnJ1cHQgCQkJCQkJCQkqLwotI2RlZmluZSBJUlFfVElNRVIzCQkweDAwNDAwMDAwCS8qIFRpbWVyIDMgSW50ZXJydXB0IAkJCQkJCQkJKi8KLSNkZWZpbmUgSVJRX1RJTUVSNAkJMHgwMDgwMDAwMAkvKiBUaW1lciA0IEludGVycnVwdCAJCQkJCQkJCSovCi0KLSNkZWZpbmUgSVJRX1RJTUVSNQkJMHgwMTAwMDAwMAkvKiBUaW1lciA1IEludGVycnVwdCAJCQkJCQkJCSovCi0jZGVmaW5lIElSUV9USU1FUjYJCTB4MDIwMDAwMDAJLyogVGltZXIgNiBJbnRlcnJ1cHQgCQkJCQkJCQkqLwotI2RlZmluZSBJUlFfVElNRVI3CQkweDA0MDAwMDAwCS8qIFRpbWVyIDcgSW50ZXJydXB0IAkJCQkJCQkJKi8KLSNkZWZpbmUgSVJRX1BGQV9QT1JURkcJMHgwODAwMDAwMAkvKiBQRiBQb3J0cyBGJkcgKFBGMzE6MCkgSW50ZXJydXB0IEEgCQkJCSovCi0jZGVmaW5lIElSUV9QRkJfUE9SVEYJMHg4MDAwMDAwMAkvKiBQRiBQb3J0IEYgKFBGMTU6MCkgSW50ZXJydXB0IEIgCQkJCQkqLwotI2RlZmluZSBJUlFfRE1BMTIJCTB4MjAwMDAwMDAJLyogRE1BIENoYW5uZWxzIDEyIChNRE1BMSBTb3VyY2UpIFJYIEludGVycnVwdCAJCSovCi0jZGVmaW5lIElSUV9ETUExMwkJMHgyMDAwMDAwMAkvKiBETUEgQ2hhbm5lbHMgMTMgKE1ETUExIERlc3RpbmF0aW9uKSBUWCBJbnRlcnJ1cHQgKi8KLSNkZWZpbmUgSVJRX0RNQTE0CQkweDQwMDAwMDAwCS8qIERNQSBDaGFubmVscyAxNCAoTURNQTAgU291cmNlKSBSWCBJbnRlcnJ1cHQgCQkqLwotI2RlZmluZSBJUlFfRE1BMTUJCTB4NDAwMDAwMDAJLyogRE1BIENoYW5uZWxzIDE1IChNRE1BMCBEZXN0aW5hdGlvbikgVFggSW50ZXJydXB0ICovCi0jZGVmaW5lIElSUV9XRE9HCQkweDgwMDAwMDAwCS8qIFNvZnR3YXJlIFdhdGNoZG9nIFRpbWVyIEludGVycnVwdCAJCQkJKi8KLSNkZWZpbmUgSVJRX1BGQl9QT1JURwkweDEwMDAwMDAwCS8qIFBGIFBvcnQgRyAoUEYzMToxNikgSW50ZXJydXB0IEIgCQkJCQkqLwotI2VuZGlmCi0KLS8qIFNJQ19JQVIwIE1hY3JvcwkJCQkJCQkJCQkJCQkJCSovCi0jZGVmaW5lIFAwX0lWRyh4KQkJKCgoeCkmMHhGKS03KQkJCS8qIFBlcmlwaGVyYWwgIzAgYXNzaWduZWQgSVZHICN4IAkqLwotI2RlZmluZSBQMV9JVkcoeCkJCSgoKHgpJjB4RiktNykgPDwgMHg0CS8qIFBlcmlwaGVyYWwgIzEgYXNzaWduZWQgSVZHICN4IAkqLwotI2RlZmluZSBQMl9JVkcoeCkJCSgoKHgpJjB4RiktNykgPDwgMHg4CS8qIFBlcmlwaGVyYWwgIzIgYXNzaWduZWQgSVZHICN4IAkqLwotI2RlZmluZSBQM19JVkcoeCkJCSgoKHgpJjB4RiktNykgPDwgMHhDCS8qIFBlcmlwaGVyYWwgIzMgYXNzaWduZWQgSVZHICN4CSovCi0jZGVmaW5lIFA0X0lWRyh4KQkJKCgoeCkmMHhGKS03KSA8PCAweDEwCS8qIFBlcmlwaGVyYWwgIzQgYXNzaWduZWQgSVZHICN4CSovCi0jZGVmaW5lIFA1X0lWRyh4KQkJKCgoeCkmMHhGKS03KSA8PCAweDE0CS8qIFBlcmlwaGVyYWwgIzUgYXNzaWduZWQgSVZHICN4CSovCi0jZGVmaW5lIFA2X0lWRyh4KQkJKCgoeCkmMHhGKS03KSA8PCAweDE4CS8qIFBlcmlwaGVyYWwgIzYgYXNzaWduZWQgSVZHICN4CSovCi0jZGVmaW5lIFA3X0lWRyh4KQkJKCgoeCkmMHhGKS03KSA8PCAweDFDCS8qIFBlcmlwaGVyYWwgIzcgYXNzaWduZWQgSVZHICN4CSovCi0KLS8qIFNJQ19JQVIxIE1hY3JvcwkJCQkJCQkJCQkJCQkJCSovCi0jZGVmaW5lIFA4X0lWRyh4KQkJKCgoeCkmMHhGKS03KQkJCS8qIFBlcmlwaGVyYWwgIzggYXNzaWduZWQgSVZHICN4IAkqLwotI2RlZmluZSBQOV9JVkcoeCkJCSgoKHgpJjB4RiktNykgPDwgMHg0CS8qIFBlcmlwaGVyYWwgIzkgYXNzaWduZWQgSVZHICN4IAkqLwotI2RlZmluZSBQMTBfSVZHKHgpCQkoKCh4KSYweEYpLTcpIDw8IDB4OAkvKiBQZXJpcGhlcmFsICMxMCBhc3NpZ25lZCBJVkcgI3gJKi8KLSNkZWZpbmUgUDExX0lWRyh4KQkJKCgoeCkmMHhGKS03KSA8PCAweEMJLyogUGVyaXBoZXJhbCAjMTEgYXNzaWduZWQgSVZHICN4IAkqLwotI2RlZmluZSBQMTJfSVZHKHgpCQkoKCh4KSYweEYpLTcpIDw8IDB4MTAJLyogUGVyaXBoZXJhbCAjMTIgYXNzaWduZWQgSVZHICN4CSovCi0jZGVmaW5lIFAxM19JVkcoeCkJCSgoKHgpJjB4RiktNykgPDwgMHgxNAkvKiBQZXJpcGhlcmFsICMxMyBhc3NpZ25lZCBJVkcgI3gJKi8KLSNkZWZpbmUgUDE0X0lWRyh4KQkJKCgoeCkmMHhGKS03KSA8PCAweDE4CS8qIFBlcmlwaGVyYWwgIzE0IGFzc2lnbmVkIElWRyAjeAkqLwotI2RlZmluZSBQMTVfSVZHKHgpCQkoKCh4KSYweEYpLTcpIDw8IDB4MUMJLyogUGVyaXBoZXJhbCAjMTUgYXNzaWduZWQgSVZHICN4CSovCi0KLS8qIFNJQ19JQVIyIE1hY3JvcwkJCQkJCQkJCQkJCQkJCSovCi0jZGVmaW5lIFAxNl9JVkcoeCkJCSgoKHgpJjB4RiktNykJCQkvKiBQZXJpcGhlcmFsICMxNiBhc3NpZ25lZCBJVkcgI3gJKi8KLSNkZWZpbmUgUDE3X0lWRyh4KQkJKCgoeCkmMHhGKS03KSA8PCAweDQJLyogUGVyaXBoZXJhbCAjMTcgYXNzaWduZWQgSVZHICN4CSovCi0jZGVmaW5lIFAxOF9JVkcoeCkJCSgoKHgpJjB4RiktNykgPDwgMHg4CS8qIFBlcmlwaGVyYWwgIzE4IGFzc2lnbmVkIElWRyAjeAkqLwotI2RlZmluZSBQMTlfSVZHKHgpCQkoKCh4KSYweEYpLTcpIDw8IDB4QwkvKiBQZXJpcGhlcmFsICMxOSBhc3NpZ25lZCBJVkcgI3gJKi8KLSNkZWZpbmUgUDIwX0lWRyh4KQkJKCgoeCkmMHhGKS03KSA8PCAweDEwCS8qIFBlcmlwaGVyYWwgIzIwIGFzc2lnbmVkIElWRyAjeAkqLwotI2RlZmluZSBQMjFfSVZHKHgpCQkoKCh4KSYweEYpLTcpIDw8IDB4MTQJLyogUGVyaXBoZXJhbCAjMjEgYXNzaWduZWQgSVZHICN4CSovCi0jZGVmaW5lIFAyMl9JVkcoeCkJCSgoKHgpJjB4RiktNykgPDwgMHgxOAkvKiBQZXJpcGhlcmFsICMyMiBhc3NpZ25lZCBJVkcgI3gJKi8KLSNkZWZpbmUgUDIzX0lWRyh4KQkJKCgoeCkmMHhGKS03KSA8PCAweDFDCS8qIFBlcmlwaGVyYWwgIzIzIGFzc2lnbmVkIElWRyAjeAkqLwotCi0vKiBTSUNfSUFSMyBNYWNyb3MJCQkJCQkJCQkJCQkJCQkqLwotI2RlZmluZSBQMjRfSVZHKHgpCQkoKCh4KSYweEYpLTcpCQkJLyogUGVyaXBoZXJhbCAjMjQgYXNzaWduZWQgSVZHICN4CSovCi0jZGVmaW5lIFAyNV9JVkcoeCkJCSgoKHgpJjB4RiktNykgPDwgMHg0CS8qIFBlcmlwaGVyYWwgIzI1IGFzc2lnbmVkIElWRyAjeAkqLwotI2RlZmluZSBQMjZfSVZHKHgpCQkoKCh4KSYweEYpLTcpIDw8IDB4OAkvKiBQZXJpcGhlcmFsICMyNiBhc3NpZ25lZCBJVkcgI3gJKi8KLSNkZWZpbmUgUDI3X0lWRyh4KQkJKCgoeCkmMHhGKS03KSA8PCAweEMJLyogUGVyaXBoZXJhbCAjMjcgYXNzaWduZWQgSVZHICN4CSovCi0jZGVmaW5lIFAyOF9JVkcoeCkJCSgoKHgpJjB4RiktNykgPDwgMHgxMAkvKiBQZXJpcGhlcmFsICMyOCBhc3NpZ25lZCBJVkcgI3gJKi8KLSNkZWZpbmUgUDI5X0lWRyh4KQkJKCgoeCkmMHhGKS03KSA8PCAweDE0CS8qIFBlcmlwaGVyYWwgIzI5IGFzc2lnbmVkIElWRyAjeAkqLwotI2RlZmluZSBQMzBfSVZHKHgpCQkoKCh4KSYweEYpLTcpIDw8IDB4MTgJLyogUGVyaXBoZXJhbCAjMzAgYXNzaWduZWQgSVZHICN4CSovCi0jZGVmaW5lIFAzMV9JVkcoeCkJCSgoKHgpJjB4RiktNykgPDwgMHgxQwkvKiBQZXJpcGhlcmFsICMzMSBhc3NpZ25lZCBJVkcgI3gJKi8KLQotCi0vKiBTSUNfSU1BU0sgTWFza3MJCQkJCQkJCQkJCQkJCQkJCQkqLwotI2RlZmluZSBTSUNfVU5NQVNLX0FMTAkweDAwMDAwMDAwCQkJCQkvKiBVbm1hc2sgYWxsIHBlcmlwaGVyYWwgaW50ZXJydXB0cwkqLwotI2RlZmluZSBTSUNfTUFTS19BTEwJMHhGRkZGRkZGRgkJCQkJLyogTWFzayBhbGwgcGVyaXBoZXJhbCBpbnRlcnJ1cHRzCSovCi0jZGVmaW5lIFNJQ19NQVNLKHgpCQkoMSA8PCAoKHgpJjB4MUYpKQkJCQkJLyogTWFzayBQZXJpcGhlcmFsICN4IGludGVycnVwdAkJKi8KLSNkZWZpbmUgU0lDX1VOTUFTSyh4KQkoMHhGRkZGRkZGRiBeICgxIDw8ICgoeCkmMHgxRikpKQkvKiBVbm1hc2sgUGVyaXBoZXJhbCAjeCBpbnRlcnJ1cHQJKi8KLQotLyogU0lDX0lXUiBNYXNrcwkJCQkJCQkJCQkJCQkJCQkJCSovCi0jZGVmaW5lIElXUl9ESVNBQkxFX0FMTAkweDAwMDAwMDAwCQkJCQkvKiBXYWtldXAgRGlzYWJsZSBhbGwgcGVyaXBoZXJhbHMJKi8KLSNkZWZpbmUgSVdSX0VOQUJMRV9BTEwJMHhGRkZGRkZGRgkJCQkJLyogV2FrZXVwIEVuYWJsZSBhbGwgcGVyaXBoZXJhbHMJKi8KLSNkZWZpbmUgSVdSX0VOQUJMRSh4KQkoMSA8PCAoKHgpJjB4MUYpKQkJCQkJLyogV2FrZXVwIEVuYWJsZSBQZXJpcGhlcmFsICN4CQkqLwotI2RlZmluZSBJV1JfRElTQUJMRSh4KQkoMHhGRkZGRkZGRiBeICgxIDw8ICgoeCkmMHgxRikpKSAJLyogV2FrZXVwIERpc2FibGUgUGVyaXBoZXJhbCAjeAkJKi8KLQotCi0vKiAqKioqKioqKioqKioqKiBVQVJUIENPTlRST0xMRVIgTUFTS1MgKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIFVBUlR4X0xDUiBNYXNrcwkJCQkJCQkJCQkJCSovCi0jZGVmaW5lIFdMUyh4KQkJKCgoeCktNSkgJiAweDAzKQkvKiBXb3JkIExlbmd0aCBTZWxlY3QgKi8KLSNkZWZpbmUgU1RCCQkJMHgwNAkJCQkvKiBTdG9wIEJpdHMJCQkqLwotI2RlZmluZSBQRU4JCQkweDA4CQkJCS8qIFBhcml0eSBFbmFibGUJCSovCi0jZGVmaW5lIEVQUwkJCTB4MTAJCQkJLyogRXZlbiBQYXJpdHkgU2VsZWN0CSovCi0jZGVmaW5lIFNUUAkJCTB4MjAJCQkJLyogU3RpY2sgUGFyaXR5CQkJKi8KLSNkZWZpbmUgU0IJCQkweDQwCQkJCS8qIFNldCBCcmVhawkJCSovCi0jZGVmaW5lIERMQUIJCTB4ODAJCQkJLyogRGl2aXNvciBMYXRjaCBBY2Nlc3MJKi8KLQotLyogVUFSVHhfTUNSIE1hc2sJCQkJCQkJCQkJKi8KLSNkZWZpbmUgTE9PUF9FTkEJMHgxMAkvKiBMb29wYmFjayBNb2RlIEVuYWJsZSAqLwotI2RlZmluZSBMT09QX0VOQV9QCTB4MDQKLQotLyogVUFSVHhfTFNSIE1hc2tzCQkJCQkJCQkJCSovCi0jZGVmaW5lIERSCQkJMHgwMQkvKiBEYXRhIFJlYWR5CQkJCSovCi0jZGVmaW5lIE9FCQkJMHgwMgkvKiBPdmVycnVuIEVycm9yCQkJKi8KLSNkZWZpbmUgUEUJCQkweDA0CS8qIFBhcml0eSBFcnJvcgkJCQkqLwotI2RlZmluZSBGRQkJCTB4MDgJLyogRnJhbWluZyBFcnJvcgkJCSovCi0jZGVmaW5lIEJJCQkJMHgxMAkvKiBCcmVhayBJbnRlcnJ1cHQJCQkqLwotI2RlZmluZSBUSFJFCQkweDIwCS8qIFRIUiBFbXB0eQkJCQkqLwotI2RlZmluZSBURU1UCQkweDQwCS8qIFRTUiBhbmQgVUFSVF9USFIgRW1wdHkJKi8KLQotLyogVUFSVHhfSUVSIE1hc2tzCQkJCQkJCQkJCQkJCQkJKi8KLSNkZWZpbmUgRVJCRkkJCTB4MDEJCS8qIEVuYWJsZSBSZWNlaXZlIEJ1ZmZlciBGdWxsIEludGVycnVwdAkJKi8KLSNkZWZpbmUgRVRCRUkJCTB4MDIJCS8qIEVuYWJsZSBUcmFuc21pdCBCdWZmZXIgRW1wdHkgSW50ZXJydXB0CSovCi0jZGVmaW5lIEVMU0kJCTB4MDQJCS8qIEVuYWJsZSBSWCBTdGF0dXMgSW50ZXJydXB0CQkJCSovCi0KLS8qIFVBUlR4X0lJUiBNYXNrcwkJCQkJCQkJCQkJCQkJKi8KLSNkZWZpbmUgTklOVAkJMHgwMQkJLyogUGVuZGluZyBJbnRlcnJ1cHQJCQkJCSovCi0jZGVmaW5lIElJUl9UWF9SRUFEWSAgICAweDAyCQkvKiBVQVJUX1RIUiBlbXB0eSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBJSVJfUlhfUkVBRFkgICAgMHgwNAkJLyogUmVjZWl2ZSBkYXRhIHJlYWR5ICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgSUlSX0xJTkVfQ0hBTkdFIDB4MDYJCS8qIFJlY2VpdmUgbGluZSBzdGF0dXMgICAgCQkJKi8KLSNkZWZpbmUgSUlSX1NUQVRVUwkweDA2CQkvKiBIaWdoZXN0IFByaW9yaXR5IFBlbmRpbmcgSW50ZXJydXB0CSovCi0KLS8qIFVBUlR4X0dDVEwgTWFza3MJCQkJCQkJCQkJCQkJKi8KLSNkZWZpbmUgVUNFTgkJMHgwMQkJLyogRW5hYmxlIFVBUlR4IENsb2NrcwkJCQkqLwotI2RlZmluZSBJUkVOCQkweDAyCQkvKiBFbmFibGUgSXJEQSBNb2RlCQkJCQkqLwotI2RlZmluZSBUUE9MQwkJMHgwNAkJLyogSXJEQSBUWCBQb2xhcml0eSBDaGFuZ2UJCQkqLwotI2RlZmluZSBSUE9MQwkJMHgwOAkJLyogSXJEQSBSWCBQb2xhcml0eSBDaGFuZ2UJCQkqLwotI2RlZmluZSBGUEUJCQkweDEwCQkvKiBGb3JjZSBQYXJpdHkgRXJyb3IgT24gVHJhbnNtaXQJKi8KLSNkZWZpbmUgRkZFCQkJMHgyMAkJLyogRm9yY2UgRnJhbWluZyBFcnJvciBPbiBUcmFuc21pdAkqLwotCi0KLS8qICAqKioqKioqKioqKioqKioqICBHRU5FUkFMIFBVUlBPU0UgVElNRVIgTUFTS1MgICoqKioqKioqKioqKioqKioqKioqKiovCi0vKiBUSU1FUl9FTkFCTEUgTWFza3MJCQkJCQkJCQkJCQkJKi8KLSNkZWZpbmUgVElNRU4wCQkJMHgwMDAxCQkvKiBFbmFibGUgVGltZXIgMAkJCQkJKi8KLSNkZWZpbmUgVElNRU4xCQkJMHgwMDAyCQkvKiBFbmFibGUgVGltZXIgMQkJCQkJKi8KLSNkZWZpbmUgVElNRU4yCQkJMHgwMDA0CQkvKiBFbmFibGUgVGltZXIgMgkJCQkJKi8KLSNkZWZpbmUgVElNRU4zCQkJMHgwMDA4CQkvKiBFbmFibGUgVGltZXIgMwkJCQkJKi8KLSNkZWZpbmUgVElNRU40CQkJMHgwMDEwCQkvKiBFbmFibGUgVGltZXIgNAkJCQkJKi8KLSNkZWZpbmUgVElNRU41CQkJMHgwMDIwCQkvKiBFbmFibGUgVGltZXIgNQkJCQkJKi8KLSNkZWZpbmUgVElNRU42CQkJMHgwMDQwCQkvKiBFbmFibGUgVGltZXIgNgkJCQkJKi8KLSNkZWZpbmUgVElNRU43CQkJMHgwMDgwCQkvKiBFbmFibGUgVGltZXIgNwkJCQkJKi8KLQotLyogVElNRVJfRElTQUJMRSBNYXNrcwkJCQkJCQkJCQkJCQkqLwotI2RlZmluZSBUSU1ESVMwCQkJVElNRU4wCQkvKiBEaXNhYmxlIFRpbWVyIDAJCQkJCSovCi0jZGVmaW5lIFRJTURJUzEJCQlUSU1FTjEJCS8qIERpc2FibGUgVGltZXIgMQkJCQkJKi8KLSNkZWZpbmUgVElNRElTMgkJCVRJTUVOMgkJLyogRGlzYWJsZSBUaW1lciAyCQkJCQkqLwotI2RlZmluZSBUSU1ESVMzCQkJVElNRU4zCQkvKiBEaXNhYmxlIFRpbWVyIDMJCQkJCSovCi0jZGVmaW5lIFRJTURJUzQJCQlUSU1FTjQJCS8qIERpc2FibGUgVGltZXIgNAkJCQkJKi8KLSNkZWZpbmUgVElNRElTNQkJCVRJTUVONQkJLyogRGlzYWJsZSBUaW1lciA1CQkJCQkqLwotI2RlZmluZSBUSU1ESVM2CQkJVElNRU42CQkvKiBEaXNhYmxlIFRpbWVyIDYJCQkJCSovCi0jZGVmaW5lIFRJTURJUzcJCQlUSU1FTjcJCS8qIERpc2FibGUgVGltZXIgNwkJCQkJKi8KLQotLyogVElNRVJfU1RBVFVTIE1hc2tzCQkJCQkJCQkJCQkJCSovCi0jZGVmaW5lIFRJTUlMMAkJCTB4MDAwMDAwMDEJLyogVGltZXIgMCBJbnRlcnJ1cHQJCQkJKi8KLSNkZWZpbmUgVElNSUwxCQkJMHgwMDAwMDAwMgkvKiBUaW1lciAxIEludGVycnVwdAkJCQkqLwotI2RlZmluZSBUSU1JTDIJCQkweDAwMDAwMDA0CS8qIFRpbWVyIDIgSW50ZXJydXB0CQkJCSovCi0jZGVmaW5lIFRJTUlMMwkJCTB4MDAwMDAwMDgJLyogVGltZXIgMyBJbnRlcnJ1cHQJCQkJKi8KLSNkZWZpbmUgVE9WRl9FUlIwCQkweDAwMDAwMDEwCS8qIFRpbWVyIDAgQ291bnRlciBPdmVyZmxvdwkJCSovCi0jZGVmaW5lIFRPVkZfRVJSMQkJMHgwMDAwMDAyMAkvKiBUaW1lciAxIENvdW50ZXIgT3ZlcmZsb3cJCQkqLwotI2RlZmluZSBUT1ZGX0VSUjIJCTB4MDAwMDAwNDAJLyogVGltZXIgMiBDb3VudGVyIE92ZXJmbG93CQkJKi8KLSNkZWZpbmUgVE9WRl9FUlIzCQkweDAwMDAwMDgwCS8qIFRpbWVyIDMgQ291bnRlciBPdmVyZmxvdwkJCSovCi0jZGVmaW5lIFRSVU4wCQkJMHgwMDAwMTAwMAkvKiBUaW1lciAwIFNsYXZlIEVuYWJsZSBTdGF0dXMJCSovCi0jZGVmaW5lIFRSVU4xCQkJMHgwMDAwMjAwMAkvKiBUaW1lciAxIFNsYXZlIEVuYWJsZSBTdGF0dXMJCSovCi0jZGVmaW5lIFRSVU4yCQkJMHgwMDAwNDAwMAkvKiBUaW1lciAyIFNsYXZlIEVuYWJsZSBTdGF0dXMJCSovCi0jZGVmaW5lIFRSVU4zCQkJMHgwMDAwODAwMAkvKiBUaW1lciAzIFNsYXZlIEVuYWJsZSBTdGF0dXMJCSovCi0jZGVmaW5lIFRJTUlMNAkJCTB4MDAwMTAwMDAJLyogVGltZXIgNCBJbnRlcnJ1cHQJCQkJKi8KLSNkZWZpbmUgVElNSUw1CQkJMHgwMDAyMDAwMAkvKiBUaW1lciA1IEludGVycnVwdAkJCQkqLwotI2RlZmluZSBUSU1JTDYJCQkweDAwMDQwMDAwCS8qIFRpbWVyIDYgSW50ZXJydXB0CQkJCSovCi0jZGVmaW5lIFRJTUlMNwkJCTB4MDAwODAwMDAJLyogVGltZXIgNyBJbnRlcnJ1cHQJCQkJKi8KLSNkZWZpbmUgVE9WRl9FUlI0CQkweDAwMTAwMDAwCS8qIFRpbWVyIDQgQ291bnRlciBPdmVyZmxvdwkJCSovCi0jZGVmaW5lIFRPVkZfRVJSNQkJMHgwMDIwMDAwMAkvKiBUaW1lciA1IENvdW50ZXIgT3ZlcmZsb3cJCQkqLwotI2RlZmluZSBUT1ZGX0VSUjYJCTB4MDA0MDAwMDAJLyogVGltZXIgNiBDb3VudGVyIE92ZXJmbG93CQkJKi8KLSNkZWZpbmUgVE9WRl9FUlI3CQkweDAwODAwMDAwCS8qIFRpbWVyIDcgQ291bnRlciBPdmVyZmxvdwkJCSovCi0jZGVmaW5lIFRSVU40CQkJMHgxMDAwMDAwMAkvKiBUaW1lciA0IFNsYXZlIEVuYWJsZSBTdGF0dXMJCSovCi0jZGVmaW5lIFRSVU41CQkJMHgyMDAwMDAwMAkvKiBUaW1lciA1IFNsYXZlIEVuYWJsZSBTdGF0dXMJCSovCi0jZGVmaW5lIFRSVU42CQkJMHg0MDAwMDAwMAkvKiBUaW1lciA2IFNsYXZlIEVuYWJsZSBTdGF0dXMJCSovCi0jZGVmaW5lIFRSVU43CQkJMHg4MDAwMDAwMAkvKiBUaW1lciA3IFNsYXZlIEVuYWJsZSBTdGF0dXMJCSovCi0KLS8qIEFsdGVybmF0ZSBEZXByZWNhdGVkIE1hY3JvcyBQcm92aWRlZCBGb3IgQmFja3dhcmRzIENvZGUgQ29tcGF0aWJpbGl0eSAqLwotI2RlZmluZSBUT1ZMX0VSUjAgVE9WRl9FUlIwCi0jZGVmaW5lIFRPVkxfRVJSMSBUT1ZGX0VSUjEKLSNkZWZpbmUgVE9WTF9FUlIyIFRPVkZfRVJSMgotI2RlZmluZSBUT1ZMX0VSUjMgVE9WRl9FUlIzCi0jZGVmaW5lIFRPVkxfRVJSNCBUT1ZGX0VSUjQKLSNkZWZpbmUgVE9WTF9FUlI1IFRPVkZfRVJSNQotI2RlZmluZSBUT1ZMX0VSUjYgVE9WRl9FUlI2Ci0jZGVmaW5lIFRPVkxfRVJSNyBUT1ZGX0VSUjcKLQotLyogVElNRVJ4X0NPTkZJRyBNYXNrcwkJCQkJCQkJCQkJCQkqLwotI2RlZmluZSBQV01fT1VUCQkJMHgwMDAxCS8qIFB1bHNlLVdpZHRoIE1vZHVsYXRpb24gT3V0cHV0IE1vZGUJKi8KLSNkZWZpbmUgV0RUSF9DQVAJCTB4MDAwMgkvKiBXaWR0aCBDYXB0dXJlIElucHV0IE1vZGUJCQkJKi8KLSNkZWZpbmUgRVhUX0NMSwkJCTB4MDAwMwkvKiBFeHRlcm5hbCBDbG9jayBNb2RlCQkJCQkqLwotI2RlZmluZSBQVUxTRV9ISQkJMHgwMDA0CS8qIEFjdGlvbiBQdWxzZSAoUG9zaXRpdmUvTmVnYXRpdmUqKQkqLwotI2RlZmluZSBQRVJJT0RfQ05UCQkweDAwMDgJLyogUGVyaW9kIENvdW50CQkJCQkJCSovCi0jZGVmaW5lIElSUV9FTkEJCQkweDAwMTAJLyogSW50ZXJydXB0IFJlcXVlc3QgRW5hYmxlCQkJCSovCi0jZGVmaW5lIFRJTl9TRUwJCQkweDAwMjAJLyogVGltZXIgSW5wdXQgU2VsZWN0CQkJCQkqLwotI2RlZmluZSBPVVRfRElTCQkJMHgwMDQwCS8qIE91dHB1dCBQYWQgRGlzYWJsZQkJCQkJKi8KLSNkZWZpbmUgQ0xLX1NFTAkJCTB4MDA4MAkvKiBUaW1lciBDbG9jayBTZWxlY3QJCQkJCSovCi0jZGVmaW5lIFRPR0dMRV9ISQkJMHgwMTAwCS8qIFBXTV9PVVQgUFVMU0VfSEkgVG9nZ2xlIE1vZGUJCQkqLwotI2RlZmluZSBFTVVfUlVOCQkJMHgwMjAwCS8qIEVtdWxhdGlvbiBCZWhhdmlvciBTZWxlY3QJCQkqLwotI2RlZmluZSBFUlJfVFlQCQkJMHhDMDAwCS8qIEVycm9yIFR5cGUJCQkJCQkJKi8KLQotCi0vKiAqKioqKioqKioqKioqKioqKiogICBHUElPIFBPUlRTIEYsIEcsIEggTUFTS1MgICoqKioqKioqKioqKioqKioqKioqKioqLwotLyogIEdlbmVyYWwgUHVycG9zZSBJTyAoMHhGRkMwMDcwMCAtIDB4RkZDMDA3RkYpICBNYXNrcyAJCQkJKi8KLS8qIFBvcnQgRiBNYXNrcyAJCQkJCQkJCQkJCQkJCSovCi0jZGVmaW5lIFBGMAkJMHgwMDAxCi0jZGVmaW5lIFBGMQkJMHgwMDAyCi0jZGVmaW5lIFBGMgkJMHgwMDA0Ci0jZGVmaW5lIFBGMwkJMHgwMDA4Ci0jZGVmaW5lIFBGNAkJMHgwMDEwCi0jZGVmaW5lIFBGNQkJMHgwMDIwCi0jZGVmaW5lIFBGNgkJMHgwMDQwCi0jZGVmaW5lIFBGNwkJMHgwMDgwCi0jZGVmaW5lIFBGOAkJMHgwMTAwCi0jZGVmaW5lIFBGOQkJMHgwMjAwCi0jZGVmaW5lIFBGMTAJMHgwNDAwCi0jZGVmaW5lIFBGMTEJMHgwODAwCi0jZGVmaW5lIFBGMTIJMHgxMDAwCi0jZGVmaW5lIFBGMTMJMHgyMDAwCi0jZGVmaW5lIFBGMTQJMHg0MDAwCi0jZGVmaW5lIFBGMTUJMHg4MDAwCi0KLS8qIFBvcnQgRyBNYXNrcwkJCQkJCQkJCQkJCQkJCSovCi0jZGVmaW5lIFBHMAkJMHgwMDAxCi0jZGVmaW5lIFBHMQkJMHgwMDAyCi0jZGVmaW5lIFBHMgkJMHgwMDA0Ci0jZGVmaW5lIFBHMwkJMHgwMDA4Ci0jZGVmaW5lIFBHNAkJMHgwMDEwCi0jZGVmaW5lIFBHNQkJMHgwMDIwCi0jZGVmaW5lIFBHNgkJMHgwMDQwCi0jZGVmaW5lIFBHNwkJMHgwMDgwCi0jZGVmaW5lIFBHOAkJMHgwMTAwCi0jZGVmaW5lIFBHOQkJMHgwMjAwCi0jZGVmaW5lIFBHMTAJMHgwNDAwCi0jZGVmaW5lIFBHMTEJMHgwODAwCi0jZGVmaW5lIFBHMTIJMHgxMDAwCi0jZGVmaW5lIFBHMTMJMHgyMDAwCi0jZGVmaW5lIFBHMTQJMHg0MDAwCi0jZGVmaW5lIFBHMTUJMHg4MDAwCi0KLS8qIFBvcnQgSCBNYXNrcwkJCQkJCQkJCQkJCQkJCSovCi0jZGVmaW5lIFBIMAkJMHgwMDAxCi0jZGVmaW5lIFBIMQkJMHgwMDAyCi0jZGVmaW5lIFBIMgkJMHgwMDA0Ci0jZGVmaW5lIFBIMwkJMHgwMDA4Ci0jZGVmaW5lIFBINAkJMHgwMDEwCi0jZGVmaW5lIFBINQkJMHgwMDIwCi0jZGVmaW5lIFBINgkJMHgwMDQwCi0jZGVmaW5lIFBINwkJMHgwMDgwCi0jZGVmaW5lIFBIOAkJMHgwMTAwCi0jZGVmaW5lIFBIOQkJMHgwMjAwCi0jZGVmaW5lIFBIMTAJMHgwNDAwCi0jZGVmaW5lIFBIMTEJMHgwODAwCi0jZGVmaW5lIFBIMTIJMHgxMDAwCi0jZGVmaW5lIFBIMTMJMHgyMDAwCi0jZGVmaW5lIFBIMTQJMHg0MDAwCi0jZGVmaW5lIFBIMTUJMHg4MDAwCi0KLS8qICoqKioqKioqKioqKioqKioqKioqKiAgQVNZTkNIUk9OT1VTIE1FTU9SWSBDT05UUk9MTEVSIE1BU0tTICAqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogRUJJVV9BTUdDVEwgTWFza3MJCQkJCQkJCQkJCQkJCQkJCSovCi0jZGVmaW5lIEFNQ0tFTgkJCTB4MDAwMQkJLyogRW5hYmxlIENMS09VVAkJCQkJCQkJCSovCi0jZGVmaW5lCUFNQkVOX05PTkUJCTB4MDAwMAkJLyogQWxsIEJhbmtzIERpc2FibGVkCQkJCQkJCQkqLwotI2RlZmluZSBBTUJFTl9CMAkJMHgwMDAyCQkvKiBFbmFibGUgQXN5bmMgTWVtb3J5IEJhbmsgMCBvbmx5CQkJCQkqLwotI2RlZmluZSBBTUJFTl9CMF9CMQkJMHgwMDA0CQkvKiBFbmFibGUgQXN5bmMgTWVtb3J5IEJhbmtzIDAgJiAxIG9ubHkJCQkJKi8KLSNkZWZpbmUgQU1CRU5fQjBfQjFfQjIJMHgwMDA2CQkvKiBFbmFibGUgQXN5bmMgTWVtb3J5IEJhbmtzIDAsIDEsIGFuZCAyCQkJKi8KLSNkZWZpbmUgQU1CRU5fQUxMCQkweDAwMDgJCS8qIEVuYWJsZSBBc3luYyBNZW1vcnkgQmFua3MgKGFsbCkgMCwgMSwgMiwgYW5kIDMJKi8KLQotLyogRUJJVV9BTUJDVEwwIE1hc2tzCQkJCQkJCQkJCQkJCQkJCQkqLwotI2RlZmluZSBCMFJEWUVOCQkJMHgwMDAwMDAwMSAgLyogQmFuayAwIChCMCkgUkRZIEVuYWJsZQkJCQkJCQkqLwotI2RlZmluZSBCMFJEWVBPTAkJMHgwMDAwMDAwMiAgLyogQjAgUkRZIEFjdGl2ZSBIaWdoCQkJCQkJCQkqLwotI2RlZmluZSBCMFRUXzEJCQkweDAwMDAwMDA0ICAvKiBCMCBUcmFuc2l0aW9uIFRpbWUgKFJlYWQgdG8gV3JpdGUpID0gMSBjeWNsZQkJKi8KLSNkZWZpbmUgQjBUVF8yCQkJMHgwMDAwMDAwOCAgLyogQjAgVHJhbnNpdGlvbiBUaW1lIChSZWFkIHRvIFdyaXRlKSA9IDIgY3ljbGVzCSovCi0jZGVmaW5lIEIwVFRfMwkJCTB4MDAwMDAwMEMgIC8qIEIwIFRyYW5zaXRpb24gVGltZSAoUmVhZCB0byBXcml0ZSkgPSAzIGN5Y2xlcwkqLwotI2RlZmluZSBCMFRUXzQJCQkweDAwMDAwMDAwICAvKiBCMCBUcmFuc2l0aW9uIFRpbWUgKFJlYWQgdG8gV3JpdGUpID0gNCBjeWNsZXMJKi8KLSNkZWZpbmUgQjBTVF8xCQkJMHgwMDAwMDAxMCAgLyogQjAgU2V0dXAgVGltZSAoQU9FIHRvIFJlYWQvV3JpdGUpID0gMSBjeWNsZQkJKi8KLSNkZWZpbmUgQjBTVF8yCQkJMHgwMDAwMDAyMCAgLyogQjAgU2V0dXAgVGltZSAoQU9FIHRvIFJlYWQvV3JpdGUpID0gMiBjeWNsZXMJCSovCi0jZGVmaW5lIEIwU1RfMwkJCTB4MDAwMDAwMzAgIC8qIEIwIFNldHVwIFRpbWUgKEFPRSB0byBSZWFkL1dyaXRlKSA9IDMgY3ljbGVzCQkqLwotI2RlZmluZSBCMFNUXzQJCQkweDAwMDAwMDAwICAvKiBCMCBTZXR1cCBUaW1lIChBT0UgdG8gUmVhZC9Xcml0ZSkgPSA0IGN5Y2xlcwkJKi8KLSNkZWZpbmUgQjBIVF8xCQkJMHgwMDAwMDA0MCAgLyogQjAgSG9sZCBUaW1lICh+UmVhZC9Xcml0ZSB0byB+QU9FKSA9IDEgY3ljbGUJCSovCi0jZGVmaW5lIEIwSFRfMgkJCTB4MDAwMDAwODAgIC8qIEIwIEhvbGQgVGltZSAoflJlYWQvV3JpdGUgdG8gfkFPRSkgPSAyIGN5Y2xlcwkqLwotI2RlZmluZSBCMEhUXzMJCQkweDAwMDAwMEMwICAvKiBCMCBIb2xkIFRpbWUgKH5SZWFkL1dyaXRlIHRvIH5BT0UpID0gMyBjeWNsZXMJKi8KLSNkZWZpbmUgQjBIVF8wCQkJMHgwMDAwMDAwMCAgLyogQjAgSG9sZCBUaW1lICh+UmVhZC9Xcml0ZSB0byB+QU9FKSA9IDAgY3ljbGVzCSovCi0jZGVmaW5lIEIwUkFUXzEJCQkweDAwMDAwMTAwICAvKiBCMCBSZWFkIEFjY2VzcyBUaW1lID0gMSBjeWNsZQkJCQkJKi8KLSNkZWZpbmUgQjBSQVRfMgkJCTB4MDAwMDAyMDAgIC8qIEIwIFJlYWQgQWNjZXNzIFRpbWUgPSAyIGN5Y2xlcwkJCQkJKi8KLSNkZWZpbmUgQjBSQVRfMwkJCTB4MDAwMDAzMDAgIC8qIEIwIFJlYWQgQWNjZXNzIFRpbWUgPSAzIGN5Y2xlcwkJCQkJKi8KLSNkZWZpbmUgQjBSQVRfNAkJCTB4MDAwMDA0MDAgIC8qIEIwIFJlYWQgQWNjZXNzIFRpbWUgPSA0IGN5Y2xlcwkJCQkJKi8KLSNkZWZpbmUgQjBSQVRfNQkJCTB4MDAwMDA1MDAgIC8qIEIwIFJlYWQgQWNjZXNzIFRpbWUgPSA1IGN5Y2xlcwkJCQkJKi8KLSNkZWZpbmUgQjBSQVRfNgkJCTB4MDAwMDA2MDAgIC8qIEIwIFJlYWQgQWNjZXNzIFRpbWUgPSA2IGN5Y2xlcwkJCQkJKi8KLSNkZWZpbmUgQjBSQVRfNwkJCTB4MDAwMDA3MDAgIC8qIEIwIFJlYWQgQWNjZXNzIFRpbWUgPSA3IGN5Y2xlcwkJCQkJKi8KLSNkZWZpbmUgQjBSQVRfOAkJCTB4MDAwMDA4MDAgIC8qIEIwIFJlYWQgQWNjZXNzIFRpbWUgPSA4IGN5Y2xlcwkJCQkJKi8KLSNkZWZpbmUgQjBSQVRfOQkJCTB4MDAwMDA5MDAgIC8qIEIwIFJlYWQgQWNjZXNzIFRpbWUgPSA5IGN5Y2xlcwkJCQkJKi8KLSNkZWZpbmUgQjBSQVRfMTAJCTB4MDAwMDBBMDAgIC8qIEIwIFJlYWQgQWNjZXNzIFRpbWUgPSAxMCBjeWNsZXMJCQkJCSovCi0jZGVmaW5lIEIwUkFUXzExCQkweDAwMDAwQjAwICAvKiBCMCBSZWFkIEFjY2VzcyBUaW1lID0gMTEgY3ljbGVzCQkJCQkqLwotI2RlZmluZSBCMFJBVF8xMgkJMHgwMDAwMEMwMCAgLyogQjAgUmVhZCBBY2Nlc3MgVGltZSA9IDEyIGN5Y2xlcwkJCQkJKi8KLSNkZWZpbmUgQjBSQVRfMTMJCTB4MDAwMDBEMDAgIC8qIEIwIFJlYWQgQWNjZXNzIFRpbWUgPSAxMyBjeWNsZXMJCQkJCSovCi0jZGVmaW5lIEIwUkFUXzE0CQkweDAwMDAwRTAwICAvKiBCMCBSZWFkIEFjY2VzcyBUaW1lID0gMTQgY3ljbGVzCQkJCQkqLwotI2RlZmluZSBCMFJBVF8xNQkJMHgwMDAwMEYwMCAgLyogQjAgUmVhZCBBY2Nlc3MgVGltZSA9IDE1IGN5Y2xlcwkJCQkJKi8KLSNkZWZpbmUgQjBXQVRfMQkJCTB4MDAwMDEwMDAgIC8qIEIwIFdyaXRlIEFjY2VzcyBUaW1lID0gMSBjeWNsZQkJCQkJKi8KLSNkZWZpbmUgQjBXQVRfMgkJCTB4MDAwMDIwMDAgIC8qIEIwIFdyaXRlIEFjY2VzcyBUaW1lID0gMiBjeWNsZXMJCQkJCSovCi0jZGVmaW5lIEIwV0FUXzMJCQkweDAwMDAzMDAwICAvKiBCMCBXcml0ZSBBY2Nlc3MgVGltZSA9IDMgY3ljbGVzCQkJCQkqLwotI2RlZmluZSBCMFdBVF80CQkJMHgwMDAwNDAwMCAgLyogQjAgV3JpdGUgQWNjZXNzIFRpbWUgPSA0IGN5Y2xlcwkJCQkJKi8KLSNkZWZpbmUgQjBXQVRfNQkJCTB4MDAwMDUwMDAgIC8qIEIwIFdyaXRlIEFjY2VzcyBUaW1lID0gNSBjeWNsZXMJCQkJCSovCi0jZGVmaW5lIEIwV0FUXzYJCQkweDAwMDA2MDAwICAvKiBCMCBXcml0ZSBBY2Nlc3MgVGltZSA9IDYgY3ljbGVzCQkJCQkqLwotI2RlZmluZSBCMFdBVF83CQkJMHgwMDAwNzAwMCAgLyogQjAgV3JpdGUgQWNjZXNzIFRpbWUgPSA3IGN5Y2xlcwkJCQkJKi8KLSNkZWZpbmUgQjBXQVRfOAkJCTB4MDAwMDgwMDAgIC8qIEIwIFdyaXRlIEFjY2VzcyBUaW1lID0gOCBjeWNsZXMJCQkJCSovCi0jZGVmaW5lIEIwV0FUXzkJCQkweDAwMDA5MDAwICAvKiBCMCBXcml0ZSBBY2Nlc3MgVGltZSA9IDkgY3ljbGVzCQkJCQkqLwotI2RlZmluZSBCMFdBVF8xMAkJMHgwMDAwQTAwMCAgLyogQjAgV3JpdGUgQWNjZXNzIFRpbWUgPSAxMCBjeWNsZXMJCQkJCSovCi0jZGVmaW5lIEIwV0FUXzExCQkweDAwMDBCMDAwICAvKiBCMCBXcml0ZSBBY2Nlc3MgVGltZSA9IDExIGN5Y2xlcwkJCQkJKi8KLSNkZWZpbmUgQjBXQVRfMTIJCTB4MDAwMEMwMDAgIC8qIEIwIFdyaXRlIEFjY2VzcyBUaW1lID0gMTIgY3ljbGVzCQkJCQkqLwotI2RlZmluZSBCMFdBVF8xMwkJMHgwMDAwRDAwMCAgLyogQjAgV3JpdGUgQWNjZXNzIFRpbWUgPSAxMyBjeWNsZXMJCQkJCSovCi0jZGVmaW5lIEIwV0FUXzE0CQkweDAwMDBFMDAwICAvKiBCMCBXcml0ZSBBY2Nlc3MgVGltZSA9IDE0IGN5Y2xlcwkJCQkJKi8KLSNkZWZpbmUgQjBXQVRfMTUJCTB4MDAwMEYwMDAgIC8qIEIwIFdyaXRlIEFjY2VzcyBUaW1lID0gMTUgY3ljbGVzCQkJCQkqLwotCi0jZGVmaW5lIEIxUkRZRU4JCQkweDAwMDEwMDAwICAvKiBCYW5rIDEgKEIxKSBSRFkgRW5hYmxlICAgICAgICAgICAgICAgICAgICAgICAJKi8KLSNkZWZpbmUgQjFSRFlQT0wJCTB4MDAwMjAwMDAgIC8qIEIxIFJEWSBBY3RpdmUgSGlnaCAgICAgICAgICAgICAgICAgICAgICAgICAgIAkqLwotI2RlZmluZSBCMVRUXzEJCQkweDAwMDQwMDAwICAvKiBCMSBUcmFuc2l0aW9uIFRpbWUgKFJlYWQgdG8gV3JpdGUpID0gMSBjeWNsZSAJKi8KLSNkZWZpbmUgQjFUVF8yCQkJMHgwMDA4MDAwMCAgLyogQjEgVHJhbnNpdGlvbiBUaW1lIChSZWFkIHRvIFdyaXRlKSA9IDIgY3ljbGVzCSovCi0jZGVmaW5lIEIxVFRfMwkJCTB4MDAwQzAwMDAgIC8qIEIxIFRyYW5zaXRpb24gVGltZSAoUmVhZCB0byBXcml0ZSkgPSAzIGN5Y2xlcwkqLwotI2RlZmluZSBCMVRUXzQJCQkweDAwMDAwMDAwICAvKiBCMSBUcmFuc2l0aW9uIFRpbWUgKFJlYWQgdG8gV3JpdGUpID0gNCBjeWNsZXMJKi8KLSNkZWZpbmUgQjFTVF8xCQkJMHgwMDEwMDAwMCAgLyogQjEgU2V0dXAgVGltZSAoQU9FIHRvIFJlYWQvV3JpdGUpID0gMSBjeWNsZSAgCSovCi0jZGVmaW5lIEIxU1RfMgkJCTB4MDAyMDAwMDAgIC8qIEIxIFNldHVwIFRpbWUgKEFPRSB0byBSZWFkL1dyaXRlKSA9IDIgY3ljbGVzIAkqLwotI2RlZmluZSBCMVNUXzMJCQkweDAwMzAwMDAwICAvKiBCMSBTZXR1cCBUaW1lIChBT0UgdG8gUmVhZC9Xcml0ZSkgPSAzIGN5Y2xlcyAJKi8KLSNkZWZpbmUgQjFTVF80CQkJMHgwMDAwMDAwMCAgLyogQjEgU2V0dXAgVGltZSAoQU9FIHRvIFJlYWQvV3JpdGUpID0gNCBjeWNsZXMgCSovCi0jZGVmaW5lIEIxSFRfMQkJCTB4MDA0MDAwMDAgIC8qIEIxIEhvbGQgVGltZSAoflJlYWQvV3JpdGUgdG8gfkFPRSkgPSAxIGN5Y2xlIAkqLwotI2RlZmluZSBCMUhUXzIJCQkweDAwODAwMDAwICAvKiBCMSBIb2xkIFRpbWUgKH5SZWFkL1dyaXRlIHRvIH5BT0UpID0gMiBjeWNsZXMJKi8KLSNkZWZpbmUgQjFIVF8zCQkJMHgwMEMwMDAwMCAgLyogQjEgSG9sZCBUaW1lICh+UmVhZC9Xcml0ZSB0byB+QU9FKSA9IDMgY3ljbGVzCSovCi0jZGVmaW5lIEIxSFRfMAkJCTB4MDAwMDAwMDAgIC8qIEIxIEhvbGQgVGltZSAoflJlYWQvV3JpdGUgdG8gfkFPRSkgPSAwIGN5Y2xlcwkqLwotI2RlZmluZSBCMVJBVF8xCQkJMHgwMTAwMDAwMCAgLyogQjEgUmVhZCBBY2Nlc3MgVGltZSA9IDEgY3ljbGUJCQkJCSovCi0jZGVmaW5lIEIxUkFUXzIJCQkweDAyMDAwMDAwICAvKiBCMSBSZWFkIEFjY2VzcyBUaW1lID0gMiBjeWNsZXMJCQkJCSovCi0jZGVmaW5lIEIxUkFUXzMJCQkweDAzMDAwMDAwICAvKiBCMSBSZWFkIEFjY2VzcyBUaW1lID0gMyBjeWNsZXMJCQkJCSovCi0jZGVmaW5lIEIxUkFUXzQJCQkweDA0MDAwMDAwICAvKiBCMSBSZWFkIEFjY2VzcyBUaW1lID0gNCBjeWNsZXMJCQkJCSovCi0jZGVmaW5lIEIxUkFUXzUJCQkweDA1MDAwMDAwICAvKiBCMSBSZWFkIEFjY2VzcyBUaW1lID0gNSBjeWNsZXMJCQkJCSovCi0jZGVmaW5lIEIxUkFUXzYJCQkweDA2MDAwMDAwICAvKiBCMSBSZWFkIEFjY2VzcyBUaW1lID0gNiBjeWNsZXMJCQkJCSovCi0jZGVmaW5lIEIxUkFUXzcJCQkweDA3MDAwMDAwICAvKiBCMSBSZWFkIEFjY2VzcyBUaW1lID0gNyBjeWNsZXMJCQkJCSovCi0jZGVmaW5lIEIxUkFUXzgJCQkweDA4MDAwMDAwICAvKiBCMSBSZWFkIEFjY2VzcyBUaW1lID0gOCBjeWNsZXMJCQkJCSovCi0jZGVmaW5lIEIxUkFUXzkJCQkweDA5MDAwMDAwICAvKiBCMSBSZWFkIEFjY2VzcyBUaW1lID0gOSBjeWNsZXMJCQkJCSovCi0jZGVmaW5lIEIxUkFUXzEwCQkweDBBMDAwMDAwICAvKiBCMSBSZWFkIEFjY2VzcyBUaW1lID0gMTAgY3ljbGVzCQkJCQkqLwotI2RlZmluZSBCMVJBVF8xMQkJMHgwQjAwMDAwMCAgLyogQjEgUmVhZCBBY2Nlc3MgVGltZSA9IDExIGN5Y2xlcwkJCQkJKi8KLSNkZWZpbmUgQjFSQVRfMTIJCTB4MEMwMDAwMDAgIC8qIEIxIFJlYWQgQWNjZXNzIFRpbWUgPSAxMiBjeWNsZXMJCQkJCSovCi0jZGVmaW5lIEIxUkFUXzEzCQkweDBEMDAwMDAwICAvKiBCMSBSZWFkIEFjY2VzcyBUaW1lID0gMTMgY3ljbGVzCQkJCQkqLwotI2RlZmluZSBCMVJBVF8xNAkJMHgwRTAwMDAwMCAgLyogQjEgUmVhZCBBY2Nlc3MgVGltZSA9IDE0IGN5Y2xlcwkJCQkJKi8KLSNkZWZpbmUgQjFSQVRfMTUJCTB4MEYwMDAwMDAgIC8qIEIxIFJlYWQgQWNjZXNzIFRpbWUgPSAxNSBjeWNsZXMJCQkJCSovCi0jZGVmaW5lIEIxV0FUXzEJCQkweDEwMDAwMDAwICAvKiBCMSBXcml0ZSBBY2Nlc3MgVGltZSA9IDEgY3ljbGUJCQkJCSovCi0jZGVmaW5lIEIxV0FUXzIJCQkweDIwMDAwMDAwICAvKiBCMSBXcml0ZSBBY2Nlc3MgVGltZSA9IDIgY3ljbGVzCQkJCQkqLwotI2RlZmluZSBCMVdBVF8zCQkJMHgzMDAwMDAwMCAgLyogQjEgV3JpdGUgQWNjZXNzIFRpbWUgPSAzIGN5Y2xlcwkJCQkJKi8KLSNkZWZpbmUgQjFXQVRfNAkJCTB4NDAwMDAwMDAgIC8qIEIxIFdyaXRlIEFjY2VzcyBUaW1lID0gNCBjeWNsZXMJCQkJCSovCi0jZGVmaW5lIEIxV0FUXzUJCQkweDUwMDAwMDAwICAvKiBCMSBXcml0ZSBBY2Nlc3MgVGltZSA9IDUgY3ljbGVzCQkJCQkqLwotI2RlZmluZSBCMVdBVF82CQkJMHg2MDAwMDAwMCAgLyogQjEgV3JpdGUgQWNjZXNzIFRpbWUgPSA2IGN5Y2xlcwkJCQkJKi8KLSNkZWZpbmUgQjFXQVRfNwkJCTB4NzAwMDAwMDAgIC8qIEIxIFdyaXRlIEFjY2VzcyBUaW1lID0gNyBjeWNsZXMJCQkJCSovCi0jZGVmaW5lIEIxV0FUXzgJCQkweDgwMDAwMDAwICAvKiBCMSBXcml0ZSBBY2Nlc3MgVGltZSA9IDggY3ljbGVzCQkJCQkqLwotI2RlZmluZSBCMVdBVF85CQkJMHg5MDAwMDAwMCAgLyogQjEgV3JpdGUgQWNjZXNzIFRpbWUgPSA5IGN5Y2xlcwkJCQkJKi8KLSNkZWZpbmUgQjFXQVRfMTAJCTB4QTAwMDAwMDAgIC8qIEIxIFdyaXRlIEFjY2VzcyBUaW1lID0gMTAgY3ljbGVzCQkJCQkqLwotI2RlZmluZSBCMVdBVF8xMQkJMHhCMDAwMDAwMCAgLyogQjEgV3JpdGUgQWNjZXNzIFRpbWUgPSAxMSBjeWNsZXMJCQkJCSovCi0jZGVmaW5lIEIxV0FUXzEyCQkweEMwMDAwMDAwICAvKiBCMSBXcml0ZSBBY2Nlc3MgVGltZSA9IDEyIGN5Y2xlcwkJCQkJKi8KLSNkZWZpbmUgQjFXQVRfMTMJCTB4RDAwMDAwMDAgIC8qIEIxIFdyaXRlIEFjY2VzcyBUaW1lID0gMTMgY3ljbGVzCQkJCQkqLwotI2RlZmluZSBCMVdBVF8xNAkJMHhFMDAwMDAwMCAgLyogQjEgV3JpdGUgQWNjZXNzIFRpbWUgPSAxNCBjeWNsZXMJCQkJCSovCi0jZGVmaW5lIEIxV0FUXzE1CQkweEYwMDAwMDAwICAvKiBCMSBXcml0ZSBBY2Nlc3MgVGltZSA9IDE1IGN5Y2xlcwkJCQkJKi8KLQotLyogRUJJVV9BTUJDVEwxIE1hc2tzCQkJCQkJCQkJCQkJCQkJCQkqLwotI2RlZmluZSBCMlJEWUVOCQkJMHgwMDAwMDAwMSAgLyogQmFuayAyIChCMikgUkRZIEVuYWJsZQkJCQkJCQkqLwotI2RlZmluZSBCMlJEWVBPTAkJMHgwMDAwMDAwMiAgLyogQjIgUkRZIEFjdGl2ZSBIaWdoCQkJCQkJCQkqLwotI2RlZmluZSBCMlRUXzEJCQkweDAwMDAwMDA0ICAvKiBCMiBUcmFuc2l0aW9uIFRpbWUgKFJlYWQgdG8gV3JpdGUpID0gMSBjeWNsZQkJKi8KLSNkZWZpbmUgQjJUVF8yCQkJMHgwMDAwMDAwOCAgLyogQjIgVHJhbnNpdGlvbiBUaW1lIChSZWFkIHRvIFdyaXRlKSA9IDIgY3ljbGVzCSovCi0jZGVmaW5lIEIyVFRfMwkJCTB4MDAwMDAwMEMgIC8qIEIyIFRyYW5zaXRpb24gVGltZSAoUmVhZCB0byBXcml0ZSkgPSAzIGN5Y2xlcwkqLwotI2RlZmluZSBCMlRUXzQJCQkweDAwMDAwMDAwICAvKiBCMiBUcmFuc2l0aW9uIFRpbWUgKFJlYWQgdG8gV3JpdGUpID0gNCBjeWNsZXMJKi8KLSNkZWZpbmUgQjJTVF8xCQkJMHgwMDAwMDAxMCAgLyogQjIgU2V0dXAgVGltZSAoQU9FIHRvIFJlYWQvV3JpdGUpID0gMSBjeWNsZQkJKi8KLSNkZWZpbmUgQjJTVF8yCQkJMHgwMDAwMDAyMCAgLyogQjIgU2V0dXAgVGltZSAoQU9FIHRvIFJlYWQvV3JpdGUpID0gMiBjeWNsZXMJCSovCi0jZGVmaW5lIEIyU1RfMwkJCTB4MDAwMDAwMzAgIC8qIEIyIFNldHVwIFRpbWUgKEFPRSB0byBSZWFkL1dyaXRlKSA9IDMgY3ljbGVzCQkqLwotI2RlZmluZSBCMlNUXzQJCQkweDAwMDAwMDAwICAvKiBCMiBTZXR1cCBUaW1lIChBT0UgdG8gUmVhZC9Xcml0ZSkgPSA0IGN5Y2xlcwkJKi8KLSNkZWZpbmUgQjJIVF8xCQkJMHgwMDAwMDA0MCAgLyogQjIgSG9sZCBUaW1lICh+UmVhZC9Xcml0ZSB0byB+QU9FKSA9IDEgY3ljbGUJCSovCi0jZGVmaW5lIEIySFRfMgkJCTB4MDAwMDAwODAgIC8qIEIyIEhvbGQgVGltZSAoflJlYWQvV3JpdGUgdG8gfkFPRSkgPSAyIGN5Y2xlcwkqLwotI2RlZmluZSBCMkhUXzMJCQkweDAwMDAwMEMwICAvKiBCMiBIb2xkIFRpbWUgKH5SZWFkL1dyaXRlIHRvIH5BT0UpID0gMyBjeWNsZXMJKi8KLSNkZWZpbmUgQjJIVF8wCQkJMHgwMDAwMDAwMCAgLyogQjIgSG9sZCBUaW1lICh+UmVhZC9Xcml0ZSB0byB+QU9FKSA9IDAgY3ljbGVzCSovCi0jZGVmaW5lIEIyUkFUXzEJCQkweDAwMDAwMTAwICAvKiBCMiBSZWFkIEFjY2VzcyBUaW1lID0gMSBjeWNsZQkJCQkJKi8KLSNkZWZpbmUgQjJSQVRfMgkJCTB4MDAwMDAyMDAgIC8qIEIyIFJlYWQgQWNjZXNzIFRpbWUgPSAyIGN5Y2xlcwkJCQkJKi8KLSNkZWZpbmUgQjJSQVRfMwkJCTB4MDAwMDAzMDAgIC8qIEIyIFJlYWQgQWNjZXNzIFRpbWUgPSAzIGN5Y2xlcwkJCQkJKi8KLSNkZWZpbmUgQjJSQVRfNAkJCTB4MDAwMDA0MDAgIC8qIEIyIFJlYWQgQWNjZXNzIFRpbWUgPSA0IGN5Y2xlcwkJCQkJKi8KLSNkZWZpbmUgQjJSQVRfNQkJCTB4MDAwMDA1MDAgIC8qIEIyIFJlYWQgQWNjZXNzIFRpbWUgPSA1IGN5Y2xlcwkJCQkJKi8KLSNkZWZpbmUgQjJSQVRfNgkJCTB4MDAwMDA2MDAgIC8qIEIyIFJlYWQgQWNjZXNzIFRpbWUgPSA2IGN5Y2xlcwkJCQkJKi8KLSNkZWZpbmUgQjJSQVRfNwkJCTB4MDAwMDA3MDAgIC8qIEIyIFJlYWQgQWNjZXNzIFRpbWUgPSA3IGN5Y2xlcwkJCQkJKi8KLSNkZWZpbmUgQjJSQVRfOAkJCTB4MDAwMDA4MDAgIC8qIEIyIFJlYWQgQWNjZXNzIFRpbWUgPSA4IGN5Y2xlcwkJCQkJKi8KLSNkZWZpbmUgQjJSQVRfOQkJCTB4MDAwMDA5MDAgIC8qIEIyIFJlYWQgQWNjZXNzIFRpbWUgPSA5IGN5Y2xlcwkJCQkJKi8KLSNkZWZpbmUgQjJSQVRfMTAJCTB4MDAwMDBBMDAgIC8qIEIyIFJlYWQgQWNjZXNzIFRpbWUgPSAxMCBjeWNsZXMJCQkJCSovCi0jZGVmaW5lIEIyUkFUXzExCQkweDAwMDAwQjAwICAvKiBCMiBSZWFkIEFjY2VzcyBUaW1lID0gMTEgY3ljbGVzCQkJCQkqLwotI2RlZmluZSBCMlJBVF8xMgkJMHgwMDAwMEMwMCAgLyogQjIgUmVhZCBBY2Nlc3MgVGltZSA9IDEyIGN5Y2xlcwkJCQkJKi8KLSNkZWZpbmUgQjJSQVRfMTMJCTB4MDAwMDBEMDAgIC8qIEIyIFJlYWQgQWNjZXNzIFRpbWUgPSAxMyBjeWNsZXMJCQkJCSovCi0jZGVmaW5lIEIyUkFUXzE0CQkweDAwMDAwRTAwICAvKiBCMiBSZWFkIEFjY2VzcyBUaW1lID0gMTQgY3ljbGVzCQkJCQkqLwotI2RlZmluZSBCMlJBVF8xNQkJMHgwMDAwMEYwMCAgLyogQjIgUmVhZCBBY2Nlc3MgVGltZSA9IDE1IGN5Y2xlcwkJCQkJKi8KLSNkZWZpbmUgQjJXQVRfMQkJCTB4MDAwMDEwMDAgIC8qIEIyIFdyaXRlIEFjY2VzcyBUaW1lID0gMSBjeWNsZQkJCQkJKi8KLSNkZWZpbmUgQjJXQVRfMgkJCTB4MDAwMDIwMDAgIC8qIEIyIFdyaXRlIEFjY2VzcyBUaW1lID0gMiBjeWNsZXMJCQkJCSovCi0jZGVmaW5lIEIyV0FUXzMJCQkweDAwMDAzMDAwICAvKiBCMiBXcml0ZSBBY2Nlc3MgVGltZSA9IDMgY3ljbGVzCQkJCQkqLwotI2RlZmluZSBCMldBVF80CQkJMHgwMDAwNDAwMCAgLyogQjIgV3JpdGUgQWNjZXNzIFRpbWUgPSA0IGN5Y2xlcwkJCQkJKi8KLSNkZWZpbmUgQjJXQVRfNQkJCTB4MDAwMDUwMDAgIC8qIEIyIFdyaXRlIEFjY2VzcyBUaW1lID0gNSBjeWNsZXMJCQkJCSovCi0jZGVmaW5lIEIyV0FUXzYJCQkweDAwMDA2MDAwICAvKiBCMiBXcml0ZSBBY2Nlc3MgVGltZSA9IDYgY3ljbGVzCQkJCQkqLwotI2RlZmluZSBCMldBVF83CQkJMHgwMDAwNzAwMCAgLyogQjIgV3JpdGUgQWNjZXNzIFRpbWUgPSA3IGN5Y2xlcwkJCQkJKi8KLSNkZWZpbmUgQjJXQVRfOAkJCTB4MDAwMDgwMDAgIC8qIEIyIFdyaXRlIEFjY2VzcyBUaW1lID0gOCBjeWNsZXMJCQkJCSovCi0jZGVmaW5lIEIyV0FUXzkJCQkweDAwMDA5MDAwICAvKiBCMiBXcml0ZSBBY2Nlc3MgVGltZSA9IDkgY3ljbGVzCQkJCQkqLwotI2RlZmluZSBCMldBVF8xMAkJMHgwMDAwQTAwMCAgLyogQjIgV3JpdGUgQWNjZXNzIFRpbWUgPSAxMCBjeWNsZXMJCQkJCSovCi0jZGVmaW5lIEIyV0FUXzExCQkweDAwMDBCMDAwICAvKiBCMiBXcml0ZSBBY2Nlc3MgVGltZSA9IDExIGN5Y2xlcwkJCQkJKi8KLSNkZWZpbmUgQjJXQVRfMTIJCTB4MDAwMEMwMDAgIC8qIEIyIFdyaXRlIEFjY2VzcyBUaW1lID0gMTIgY3ljbGVzCQkJCQkqLwotI2RlZmluZSBCMldBVF8xMwkJMHgwMDAwRDAwMCAgLyogQjIgV3JpdGUgQWNjZXNzIFRpbWUgPSAxMyBjeWNsZXMJCQkJCSovCi0jZGVmaW5lIEIyV0FUXzE0CQkweDAwMDBFMDAwICAvKiBCMiBXcml0ZSBBY2Nlc3MgVGltZSA9IDE0IGN5Y2xlcwkJCQkJKi8KLSNkZWZpbmUgQjJXQVRfMTUJCTB4MDAwMEYwMDAgIC8qIEIyIFdyaXRlIEFjY2VzcyBUaW1lID0gMTUgY3ljbGVzCQkJCQkqLwotCi0jZGVmaW5lIEIzUkRZRU4JCQkweDAwMDEwMDAwICAvKiBCYW5rIDMgKEIzKSBSRFkgRW5hYmxlCQkJCQkJCSovCi0jZGVmaW5lIEIzUkRZUE9MCQkweDAwMDIwMDAwICAvKiBCMyBSRFkgQWN0aXZlIEhpZ2gJCQkJCQkJCSovCi0jZGVmaW5lIEIzVFRfMQkJCTB4MDAwNDAwMDAgIC8qIEIzIFRyYW5zaXRpb24gVGltZSAoUmVhZCB0byBXcml0ZSkgPSAxIGN5Y2xlCQkqLwotI2RlZmluZSBCM1RUXzIJCQkweDAwMDgwMDAwICAvKiBCMyBUcmFuc2l0aW9uIFRpbWUgKFJlYWQgdG8gV3JpdGUpID0gMiBjeWNsZXMJKi8KLSNkZWZpbmUgQjNUVF8zCQkJMHgwMDBDMDAwMCAgLyogQjMgVHJhbnNpdGlvbiBUaW1lIChSZWFkIHRvIFdyaXRlKSA9IDMgY3ljbGVzCSovCi0jZGVmaW5lIEIzVFRfNAkJCTB4MDAwMDAwMDAgIC8qIEIzIFRyYW5zaXRpb24gVGltZSAoUmVhZCB0byBXcml0ZSkgPSA0IGN5Y2xlcwkqLwotI2RlZmluZSBCM1NUXzEJCQkweDAwMTAwMDAwICAvKiBCMyBTZXR1cCBUaW1lIChBT0UgdG8gUmVhZC9Xcml0ZSkgPSAxIGN5Y2xlCQkqLwotI2RlZmluZSBCM1NUXzIJCQkweDAwMjAwMDAwICAvKiBCMyBTZXR1cCBUaW1lIChBT0UgdG8gUmVhZC9Xcml0ZSkgPSAyIGN5Y2xlcwkJKi8KLSNkZWZpbmUgQjNTVF8zCQkJMHgwMDMwMDAwMCAgLyogQjMgU2V0dXAgVGltZSAoQU9FIHRvIFJlYWQvV3JpdGUpID0gMyBjeWNsZXMJCSovCi0jZGVmaW5lIEIzU1RfNAkJCTB4MDAwMDAwMDAgIC8qIEIzIFNldHVwIFRpbWUgKEFPRSB0byBSZWFkL1dyaXRlKSA9IDQgY3ljbGVzCQkqLwotI2RlZmluZSBCM0hUXzEJCQkweDAwNDAwMDAwICAvKiBCMyBIb2xkIFRpbWUgKH5SZWFkL1dyaXRlIHRvIH5BT0UpID0gMSBjeWNsZQkJKi8KLSNkZWZpbmUgQjNIVF8yCQkJMHgwMDgwMDAwMCAgLyogQjMgSG9sZCBUaW1lICh+UmVhZC9Xcml0ZSB0byB+QU9FKSA9IDIgY3ljbGVzCSovCi0jZGVmaW5lIEIzSFRfMwkJCTB4MDBDMDAwMDAgIC8qIEIzIEhvbGQgVGltZSAoflJlYWQvV3JpdGUgdG8gfkFPRSkgPSAzIGN5Y2xlcwkqLwotI2RlZmluZSBCM0hUXzAJCQkweDAwMDAwMDAwICAvKiBCMyBIb2xkIFRpbWUgKH5SZWFkL1dyaXRlIHRvIH5BT0UpID0gMCBjeWNsZXMJKi8KLSNkZWZpbmUgQjNSQVRfMQkJCTB4MDEwMDAwMDAgIC8qIEIzIFJlYWQgQWNjZXNzIFRpbWUgPSAxIGN5Y2xlCQkJCQkqLwotI2RlZmluZSBCM1JBVF8yCQkJMHgwMjAwMDAwMCAgLyogQjMgUmVhZCBBY2Nlc3MgVGltZSA9IDIgY3ljbGVzCQkJCQkqLwotI2RlZmluZSBCM1JBVF8zCQkJMHgwMzAwMDAwMCAgLyogQjMgUmVhZCBBY2Nlc3MgVGltZSA9IDMgY3ljbGVzCQkJCQkqLwotI2RlZmluZSBCM1JBVF80CQkJMHgwNDAwMDAwMCAgLyogQjMgUmVhZCBBY2Nlc3MgVGltZSA9IDQgY3ljbGVzCQkJCQkqLwotI2RlZmluZSBCM1JBVF81CQkJMHgwNTAwMDAwMCAgLyogQjMgUmVhZCBBY2Nlc3MgVGltZSA9IDUgY3ljbGVzCQkJCQkqLwotI2RlZmluZSBCM1JBVF82CQkJMHgwNjAwMDAwMCAgLyogQjMgUmVhZCBBY2Nlc3MgVGltZSA9IDYgY3ljbGVzCQkJCQkqLwotI2RlZmluZSBCM1JBVF83CQkJMHgwNzAwMDAwMCAgLyogQjMgUmVhZCBBY2Nlc3MgVGltZSA9IDcgY3ljbGVzCQkJCQkqLwotI2RlZmluZSBCM1JBVF84CQkJMHgwODAwMDAwMCAgLyogQjMgUmVhZCBBY2Nlc3MgVGltZSA9IDggY3ljbGVzCQkJCQkqLwotI2RlZmluZSBCM1JBVF85CQkJMHgwOTAwMDAwMCAgLyogQjMgUmVhZCBBY2Nlc3MgVGltZSA9IDkgY3ljbGVzCQkJCQkqLwotI2RlZmluZSBCM1JBVF8xMAkJMHgwQTAwMDAwMCAgLyogQjMgUmVhZCBBY2Nlc3MgVGltZSA9IDEwIGN5Y2xlcwkJCQkJKi8KLSNkZWZpbmUgQjNSQVRfMTEJCTB4MEIwMDAwMDAgIC8qIEIzIFJlYWQgQWNjZXNzIFRpbWUgPSAxMSBjeWNsZXMJCQkJCSovCi0jZGVmaW5lIEIzUkFUXzEyCQkweDBDMDAwMDAwICAvKiBCMyBSZWFkIEFjY2VzcyBUaW1lID0gMTIgY3ljbGVzCQkJCQkqLwotI2RlZmluZSBCM1JBVF8xMwkJMHgwRDAwMDAwMCAgLyogQjMgUmVhZCBBY2Nlc3MgVGltZSA9IDEzIGN5Y2xlcwkJCQkJKi8KLSNkZWZpbmUgQjNSQVRfMTQJCTB4MEUwMDAwMDAgIC8qIEIzIFJlYWQgQWNjZXNzIFRpbWUgPSAxNCBjeWNsZXMJCQkJCSovCi0jZGVmaW5lIEIzUkFUXzE1CQkweDBGMDAwMDAwICAvKiBCMyBSZWFkIEFjY2VzcyBUaW1lID0gMTUgY3ljbGVzCQkJCQkqLwotI2RlZmluZSBCM1dBVF8xCQkJMHgxMDAwMDAwMCAgLyogQjMgV3JpdGUgQWNjZXNzIFRpbWUgPSAxIGN5Y2xlCQkJCQkqLwotI2RlZmluZSBCM1dBVF8yCQkJMHgyMDAwMDAwMCAgLyogQjMgV3JpdGUgQWNjZXNzIFRpbWUgPSAyIGN5Y2xlcwkJCQkJKi8KLSNkZWZpbmUgQjNXQVRfMwkJCTB4MzAwMDAwMDAgIC8qIEIzIFdyaXRlIEFjY2VzcyBUaW1lID0gMyBjeWNsZXMJCQkJCSovCi0jZGVmaW5lIEIzV0FUXzQJCQkweDQwMDAwMDAwICAvKiBCMyBXcml0ZSBBY2Nlc3MgVGltZSA9IDQgY3ljbGVzCQkJCQkqLwotI2RlZmluZSBCM1dBVF81CQkJMHg1MDAwMDAwMCAgLyogQjMgV3JpdGUgQWNjZXNzIFRpbWUgPSA1IGN5Y2xlcwkJCQkJKi8KLSNkZWZpbmUgQjNXQVRfNgkJCTB4NjAwMDAwMDAgIC8qIEIzIFdyaXRlIEFjY2VzcyBUaW1lID0gNiBjeWNsZXMJCQkJCSovCi0jZGVmaW5lIEIzV0FUXzcJCQkweDcwMDAwMDAwICAvKiBCMyBXcml0ZSBBY2Nlc3MgVGltZSA9IDcgY3ljbGVzCQkJCQkqLwotI2RlZmluZSBCM1dBVF84CQkJMHg4MDAwMDAwMCAgLyogQjMgV3JpdGUgQWNjZXNzIFRpbWUgPSA4IGN5Y2xlcwkJCQkJKi8KLSNkZWZpbmUgQjNXQVRfOQkJCTB4OTAwMDAwMDAgIC8qIEIzIFdyaXRlIEFjY2VzcyBUaW1lID0gOSBjeWNsZXMJCQkJCSovCi0jZGVmaW5lIEIzV0FUXzEwCQkweEEwMDAwMDAwICAvKiBCMyBXcml0ZSBBY2Nlc3MgVGltZSA9IDEwIGN5Y2xlcwkJCQkJKi8KLSNkZWZpbmUgQjNXQVRfMTEJCTB4QjAwMDAwMDAgIC8qIEIzIFdyaXRlIEFjY2VzcyBUaW1lID0gMTEgY3ljbGVzCQkJCQkqLwotI2RlZmluZSBCM1dBVF8xMgkJMHhDMDAwMDAwMCAgLyogQjMgV3JpdGUgQWNjZXNzIFRpbWUgPSAxMiBjeWNsZXMJCQkJCSovCi0jZGVmaW5lIEIzV0FUXzEzCQkweEQwMDAwMDAwICAvKiBCMyBXcml0ZSBBY2Nlc3MgVGltZSA9IDEzIGN5Y2xlcwkJCQkJKi8KLSNkZWZpbmUgQjNXQVRfMTQJCTB4RTAwMDAwMDAgIC8qIEIzIFdyaXRlIEFjY2VzcyBUaW1lID0gMTQgY3ljbGVzCQkJCQkqLwotI2RlZmluZSBCM1dBVF8xNQkJMHhGMDAwMDAwMCAgLyogQjMgV3JpdGUgQWNjZXNzIFRpbWUgPSAxNSBjeWNsZXMJCQkJCSovCi0KLQotLyogKioqKioqKioqKioqKioqKioqKioqKiAgU0RSQU0gQ09OVFJPTExFUiBNQVNLUyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIEVCSVVfU0RHQ1RMIE1hc2tzCQkJCQkJCQkJCQkJCQkJCQkJCSovCi0jZGVmaW5lIFNDVExFCQkJMHgwMDAwMDAwMQkvKiBFbmFibGUgU0RSQU0gU2lnbmFscwkJCQkJCQkJCQkqLwotI2RlZmluZSBDTF8yCQkJMHgwMDAwMDAwOAkvKiBTRFJBTSBDQVMgTGF0ZW5jeSA9IDIgY3ljbGVzCQkJCQkJCQkqLwotI2RlZmluZSBDTF8zCQkJMHgwMDAwMDAwQwkvKiBTRFJBTSBDQVMgTGF0ZW5jeSA9IDMgY3ljbGVzCQkJCQkJCQkqLwotI2RlZmluZSBQQVNSX0FMTAkJMHgwMDAwMDAwMAkvKiBBbGwgNCBTRFJBTSBCYW5rcyBSZWZyZXNoZWQgSW4gU2VsZi1SZWZyZXNoCQkJCSovCi0jZGVmaW5lIFBBU1JfQjBfQjEJCTB4MDAwMDAwMTAJLyogU0RSQU0gQmFua3MgMCBhbmQgMSBBcmUgUmVmcmVzaGVkIEluIFNlbGYtUmVmcmVzaAkJKi8KLSNkZWZpbmUgUEFTUl9CMAkJCTB4MDAwMDAwMjAJLyogT25seSBTRFJBTSBCYW5rIDAgSXMgUmVmcmVzaGVkIEluIFNlbGYtUmVmcmVzaAkJCSovCi0jZGVmaW5lIFRSQVNfMQkJCTB4MDAwMDAwNDAJLyogU0RSQU0gdFJBUyA9IDEgY3ljbGUJCQkJCQkJCQkJKi8KLSNkZWZpbmUgVFJBU18yCQkJMHgwMDAwMDA4MAkvKiBTRFJBTSB0UkFTID0gMiBjeWNsZXMJCQkJCQkJCQkqLwotI2RlZmluZSBUUkFTXzMJCQkweDAwMDAwMEMwCS8qIFNEUkFNIHRSQVMgPSAzIGN5Y2xlcwkJCQkJCQkJCSovCi0jZGVmaW5lIFRSQVNfNAkJCTB4MDAwMDAxMDAJLyogU0RSQU0gdFJBUyA9IDQgY3ljbGVzCQkJCQkJCQkJKi8KLSNkZWZpbmUgVFJBU181CQkJMHgwMDAwMDE0MAkvKiBTRFJBTSB0UkFTID0gNSBjeWNsZXMJCQkJCQkJCQkqLwotI2RlZmluZSBUUkFTXzYJCQkweDAwMDAwMTgwCS8qIFNEUkFNIHRSQVMgPSA2IGN5Y2xlcwkJCQkJCQkJCSovCi0jZGVmaW5lIFRSQVNfNwkJCTB4MDAwMDAxQzAJLyogU0RSQU0gdFJBUyA9IDcgY3ljbGVzCQkJCQkJCQkJKi8KLSNkZWZpbmUgVFJBU184CQkJMHgwMDAwMDIwMAkvKiBTRFJBTSB0UkFTID0gOCBjeWNsZXMJCQkJCQkJCQkqLwotI2RlZmluZSBUUkFTXzkJCQkweDAwMDAwMjQwCS8qIFNEUkFNIHRSQVMgPSA5IGN5Y2xlcwkJCQkJCQkJCSovCi0jZGVmaW5lIFRSQVNfMTAJCQkweDAwMDAwMjgwCS8qIFNEUkFNIHRSQVMgPSAxMCBjeWNsZXMJCQkJCQkJCQkqLwotI2RlZmluZSBUUkFTXzExCQkJMHgwMDAwMDJDMAkvKiBTRFJBTSB0UkFTID0gMTEgY3ljbGVzCQkJCQkJCQkJKi8KLSNkZWZpbmUgVFJBU18xMgkJCTB4MDAwMDAzMDAJLyogU0RSQU0gdFJBUyA9IDEyIGN5Y2xlcwkJCQkJCQkJCSovCi0jZGVmaW5lIFRSQVNfMTMJCQkweDAwMDAwMzQwCS8qIFNEUkFNIHRSQVMgPSAxMyBjeWNsZXMJCQkJCQkJCQkqLwotI2RlZmluZSBUUkFTXzE0CQkJMHgwMDAwMDM4MAkvKiBTRFJBTSB0UkFTID0gMTQgY3ljbGVzCQkJCQkJCQkJKi8KLSNkZWZpbmUgVFJBU18xNQkJCTB4MDAwMDAzQzAJLyogU0RSQU0gdFJBUyA9IDE1IGN5Y2xlcwkJCQkJCQkJCSovCi0jZGVmaW5lIFRSUF8xCQkJMHgwMDAwMDgwMAkvKiBTRFJBTSB0UlAgPSAxIGN5Y2xlCQkJCQkJCQkJCSovCi0jZGVmaW5lIFRSUF8yCQkJMHgwMDAwMTAwMAkvKiBTRFJBTSB0UlAgPSAyIGN5Y2xlcwkJCQkJCQkJCQkqLwotI2RlZmluZSBUUlBfMwkJCTB4MDAwMDE4MDAJLyogU0RSQU0gdFJQID0gMyBjeWNsZXMJCQkJCQkJCQkJKi8KLSNkZWZpbmUgVFJQXzQJCQkweDAwMDAyMDAwCS8qIFNEUkFNIHRSUCA9IDQgY3ljbGVzCQkJCQkJCQkJCSovCi0jZGVmaW5lIFRSUF81CQkJMHgwMDAwMjgwMAkvKiBTRFJBTSB0UlAgPSA1IGN5Y2xlcwkJCQkJCQkJCQkqLwotI2RlZmluZSBUUlBfNgkJCTB4MDAwMDMwMDAJLyogU0RSQU0gdFJQID0gNiBjeWNsZXMJCQkJCQkJCQkJKi8KLSNkZWZpbmUgVFJQXzcJCQkweDAwMDAzODAwCS8qIFNEUkFNIHRSUCA9IDcgY3ljbGVzCQkJCQkJCQkJCSovCi0jZGVmaW5lIFRSQ0RfMQkJCTB4MDAwMDgwMDAJLyogU0RSQU0gdFJDRCA9IDEgY3ljbGUJCQkJCQkJCQkJKi8KLSNkZWZpbmUgVFJDRF8yCQkJMHgwMDAxMDAwMAkvKiBTRFJBTSB0UkNEID0gMiBjeWNsZXMJCQkJCQkJCQkqLwotI2RlZmluZSBUUkNEXzMJCQkweDAwMDE4MDAwCS8qIFNEUkFNIHRSQ0QgPSAzIGN5Y2xlcwkJCQkJCQkJCSovCi0jZGVmaW5lIFRSQ0RfNAkJCTB4MDAwMjAwMDAJLyogU0RSQU0gdFJDRCA9IDQgY3ljbGVzCQkJCQkJCQkJKi8KLSNkZWZpbmUgVFJDRF81CQkJMHgwMDAyODAwMAkvKiBTRFJBTSB0UkNEID0gNSBjeWNsZXMJCQkJCQkJCQkqLwotI2RlZmluZSBUUkNEXzYJCQkweDAwMDMwMDAwCS8qIFNEUkFNIHRSQ0QgPSA2IGN5Y2xlcwkJCQkJCQkJCSovCi0jZGVmaW5lIFRSQ0RfNwkJCTB4MDAwMzgwMDAJLyogU0RSQU0gdFJDRCA9IDcgY3ljbGVzCQkJCQkJCQkJKi8KLSNkZWZpbmUgVFdSXzEJCQkweDAwMDgwMDAwCS8qIFNEUkFNIHRXUiA9IDEgY3ljbGUJCQkJCQkJCQkJKi8KLSNkZWZpbmUgVFdSXzIJCQkweDAwMTAwMDAwCS8qIFNEUkFNIHRXUiA9IDIgY3ljbGVzCQkJCQkJCQkJCSovCi0jZGVmaW5lIFRXUl8zCQkJMHgwMDE4MDAwMAkvKiBTRFJBTSB0V1IgPSAzIGN5Y2xlcwkJCQkJCQkJCQkqLwotI2RlZmluZSBQVVBTRAkJCTB4MDAyMDAwMDAJLyogUG93ZXItVXAgU3RhcnQgRGVsYXkgKDE1IFNDTEsgQ3ljbGVzIERlbGF5KQkJCQkqLwotI2RlZmluZSBQU00JCQkJMHgwMDQwMDAwMAkvKiBQb3dlci1VcCBTZXF1ZW5jZSAoTW9kZSBSZWdpc3RlciBCZWZvcmUvQWZ0ZXIqIFJlZnJlc2gpCSovCi0jZGVmaW5lIFBTUwkJCQkweDAwODAwMDAwCS8qIEVuYWJsZSBQb3dlci1VcCBTZXF1ZW5jZSBvbiBOZXh0IFNEUkFNIEFjY2VzcwkJCSovCi0jZGVmaW5lIFNSRlMJCQkweDAxMDAwMDAwCS8qIEVuYWJsZSBTRFJBTSBTZWxmLVJlZnJlc2ggTW9kZQkJCQkJCQkqLwotI2RlZmluZSBFQlVGRQkJCTB4MDIwMDAwMDAJLyogRW5hYmxlIEV4dGVybmFsIEJ1ZmZlcmluZyBUaW1pbmcJCQkJCQkJKi8KLSNkZWZpbmUgRkJCUlcJCQkweDA0MDAwMDAwCS8qIEVuYWJsZSBGYXN0IEJhY2stVG8tQmFjayBSZWFkIFRvIFdyaXRlCQkJCQkqLwotI2RlZmluZSBFTVJFTgkJCTB4MTAwMDAwMDAJLyogRXh0ZW5kZWQgTW9kZSBSZWdpc3RlciBFbmFibGUJCQkJCQkJKi8KLSNkZWZpbmUgVENTUgkJCTB4MjAwMDAwMDAJLyogVGVtcC1Db21wZW5zYXRlZCBTZWxmLVJlZnJlc2ggVmFsdWUgKDg1LzQ1KiBEZWcgQykJCSovCi0jZGVmaW5lIENEREJHCQkJMHg0MDAwMDAwMAkvKiBUcmlzdGF0ZSBTRFJBTSBDb250cm9scyBEdXJpbmcgQnVzIEdyYW50CQkJCQkqLwotCi0vKiBFQklVX1NEQkNUTCBNYXNrcwkJCQkJCQkJCQkJCQkJCQkJCSovCi0jZGVmaW5lIEVCRQkJCQkweDAwMDEJCS8qIEVuYWJsZSBTRFJBTSBFeHRlcm5hbCBCYW5rCQkJCQkJCSovCi0jZGVmaW5lIEVCU1pfMTYJCQkweDAwMDAJCS8qIFNEUkFNIEV4dGVybmFsIEJhbmsgU2l6ZSA9IDE2TUIJKi8KLSNkZWZpbmUgRUJTWl8zMgkJCTB4MDAwMgkJLyogU0RSQU0gRXh0ZXJuYWwgQmFuayBTaXplID0gMzJNQgkqLwotI2RlZmluZSBFQlNaXzY0CQkJMHgwMDA0CQkvKiBTRFJBTSBFeHRlcm5hbCBCYW5rIFNpemUgPSA2NE1CCSovCi0jZGVmaW5lIEVCU1pfMTI4CQkweDAwMDYJCS8qIFNEUkFNIEV4dGVybmFsIEJhbmsgU2l6ZSA9IDEyOE1CCQkqLwotI2RlZmluZSBFQlNaXzI1NgkJMHgwMDA4CQkvKiBTRFJBTSBFeHRlcm5hbCBCYW5rIFNpemUgPSAyNTZNQiAJKi8KLSNkZWZpbmUgRUJTWl81MTIJCTB4MDAwQQkJLyogU0RSQU0gRXh0ZXJuYWwgQmFuayBTaXplID0gNTEyTUIJCSovCi0jZGVmaW5lIEVCQ0FXXzgJCQkweDAwMDAJCS8qIFNEUkFNIEV4dGVybmFsIEJhbmsgQ29sdW1uIEFkZHJlc3MgV2lkdGggPSA4IEJpdHMJKi8KLSNkZWZpbmUgRUJDQVdfOQkJCTB4MDAxMAkJLyogU0RSQU0gRXh0ZXJuYWwgQmFuayBDb2x1bW4gQWRkcmVzcyBXaWR0aCA9IDkgQml0cwkqLwotI2RlZmluZSBFQkNBV18xMAkJMHgwMDIwCQkvKiBTRFJBTSBFeHRlcm5hbCBCYW5rIENvbHVtbiBBZGRyZXNzIFdpZHRoID0gMTAgQml0cwkqLwotI2RlZmluZSBFQkNBV18xMQkJMHgwMDMwCQkvKiBTRFJBTSBFeHRlcm5hbCBCYW5rIENvbHVtbiBBZGRyZXNzIFdpZHRoID0gMTEgQml0cwkqLwotCi0vKiBFQklVX1NEU1RBVCBNYXNrcwkJCQkJCQkJCQkJCQkJKi8KLSNkZWZpbmUgU0RDSQkJCTB4MDAwMQkJLyogU0RSQU0gQ29udHJvbGxlciBJZGxlIAkJCQkqLwotI2RlZmluZSBTRFNSQQkJCTB4MDAwMgkJLyogU0RSQU0gU2VsZi1SZWZyZXNoIEFjdGl2ZQkJCSovCi0jZGVmaW5lIFNEUFVBCQkJMHgwMDA0CQkvKiBTRFJBTSBQb3dlci1VcCBBY3RpdmUgCQkJCSovCi0jZGVmaW5lIFNEUlMJCQkweDAwMDgJCS8qIFNEUkFNIFdpbGwgUG93ZXItVXAgT24gTmV4dCBBY2Nlc3MJKi8KLSNkZWZpbmUgU0RFQVNFCQkJMHgwMDEwCQkvKiBTRFJBTSBFQUIgU3RpY2t5IEVycm9yIFN0YXR1cwkJKi8KLSNkZWZpbmUgQkdTVEFUCQkJMHgwMDIwCQkvKiBCdXMgR3JhbnQgU3RhdHVzCQkJCQkJKi8KLQotCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKiAgRE1BIENPTlRST0xMRVIgTUFTS1MgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBETUF4X1BFUklQSEVSQUxfTUFQLCBNRE1BX3l5X1BFUklQSEVSQUxfTUFQIE1hc2tzCQkJCQkJCQkqLwotI2RlZmluZSBDVFlQRQkJCTB4MDA0MAkvKiBETUEgQ2hhbm5lbCBUeXBlIEluZGljYXRvciAoTWVtb3J5L1BlcmlwaGVyYWwqKQkqLwotI2RlZmluZSBQTUFQCQkJMHhGMDAwCS8qIFBlcmlwaGVyYWwgTWFwcGVkIFRvIFRoaXMgQ2hhbm5lbAkJCQkqLwotI2RlZmluZSBQTUFQX1BQSQkJMHgwMDAwCS8qIAkJUFBJIFBvcnQgRE1BCQkJCQkJCQkqLwotI2RlZmluZQlQTUFQX0VNQUNSWAkJMHgxMDAwCS8qIAkJRXRoZXJuZXQgUmVjZWl2ZSBETUEJCQkJCQkqLwotI2RlZmluZSBQTUFQX0VNQUNUWAkJMHgyMDAwCS8qIAkJRXRoZXJuZXQgVHJhbnNtaXQgRE1BCQkJCQkJKi8KLSNkZWZpbmUgUE1BUF9TUE9SVDBSWAkweDMwMDAJLyogCQlTUE9SVDAgUmVjZWl2ZSBETUEJCQkJCQkJKi8KLSNkZWZpbmUgUE1BUF9TUE9SVDBUWAkweDQwMDAJLyogCQlTUE9SVDAgVHJhbnNtaXQgRE1BCQkJCQkJCSovCi0jZGVmaW5lIFBNQVBfU1BPUlQxUlgJMHg1MDAwCS8qIAkJU1BPUlQxIFJlY2VpdmUgRE1BCQkJCQkJCSovCi0jZGVmaW5lIFBNQVBfU1BPUlQxVFgJMHg2MDAwCS8qIAkJU1BPUlQxIFRyYW5zbWl0IERNQQkJCQkJCQkqLwotI2RlZmluZSBQTUFQX1NQSQkJMHg3MDAwCS8qIAkJU1BJIFBvcnQgRE1BCQkJCQkJCQkqLwotI2RlZmluZSBQTUFQX1VBUlQwUlgJMHg4MDAwCS8qIAkJVUFSVDAgUG9ydCBSZWNlaXZlIERNQQkJCQkJCSovCi0jZGVmaW5lIFBNQVBfVUFSVDBUWAkweDkwMDAJLyogCQlVQVJUMCBQb3J0IFRyYW5zbWl0IERNQQkJCQkJCSovCi0jZGVmaW5lCVBNQVBfVUFSVDFSWAkweEEwMDAJLyogCQlVQVJUMSBQb3J0IFJlY2VpdmUgRE1BCQkJCQkJKi8KLSNkZWZpbmUJUE1BUF9VQVJUMVRYCTB4QjAwMAkvKiAJCVVBUlQxIFBvcnQgVHJhbnNtaXQgRE1BCQkJCQkJKi8KLQotLyogICoqKioqKioqKioqKiAgUEFSQUxMRUwgUEVSSVBIRVJBTCBJTlRFUkZBQ0UgKFBQSSkgTUFTS1MgKioqKioqKioqKioqKi8KLS8qICBQUElfQ09OVFJPTCBNYXNrcwkJCQkJCQkJCQkJCQkqLwotI2RlZmluZSBQT1JUX0VOCQkJMHgwMDAxCQkvKiBQUEkgUG9ydCBFbmFibGUJCQkJCSovCi0jZGVmaW5lIFBPUlRfRElSCQkweDAwMDIJCS8qIFBQSSBQb3J0IERpcmVjdGlvbgkJCQkqLwotI2RlZmluZSBYRlJfVFlQRQkJMHgwMDBDCQkvKiBQUEkgVHJhbnNmZXIgVHlwZQkJCQkqLwotI2RlZmluZSBQT1JUX0NGRwkJMHgwMDMwCQkvKiBQUEkgUG9ydCBDb25maWd1cmF0aW9uCQkJKi8KLSNkZWZpbmUgRkxEX1NFTAkJCTB4MDA0MAkJLyogUFBJIEFjdGl2ZSBGaWVsZCBTZWxlY3QJCQkqLwotI2RlZmluZSBQQUNLX0VOCQkJMHgwMDgwCQkvKiBQUEkgUGFja2luZyBNb2RlCQkJCQkqLwotI2RlZmluZSBETUEzMgkJCTB4MDEwMAkJLyogUFBJIDMyLWJpdCBETUEgRW5hYmxlCQkJKi8KLSNkZWZpbmUgU0tJUF9FTgkJCTB4MDIwMAkJLyogUFBJIFNraXAgRWxlbWVudCBFbmFibGUJCQkqLwotI2RlZmluZSBTS0lQX0VPCQkJMHgwNDAwCQkvKiBQUEkgU2tpcCBFdmVuL09kZCBFbGVtZW50cwkJKi8KLSNkZWZpbmUgRExFTl84CQkJMHgwMDAwCQkvKiBEYXRhIExlbmd0aCA9IDggQml0cwkJCQkqLwotI2RlZmluZSBETEVOXzEwCQkJMHgwODAwCQkvKiBEYXRhIExlbmd0aCA9IDEwIEJpdHMJCQkqLwotI2RlZmluZSBETEVOXzExCQkJMHgxMDAwCQkvKiBEYXRhIExlbmd0aCA9IDExIEJpdHMJCQkqLwotI2RlZmluZSBETEVOXzEyCQkJMHgxODAwCQkvKiBEYXRhIExlbmd0aCA9IDEyIEJpdHMJCQkqLwotI2RlZmluZSBETEVOXzEzCQkJMHgyMDAwCQkvKiBEYXRhIExlbmd0aCA9IDEzIEJpdHMJCQkqLwotI2RlZmluZSBETEVOXzE0CQkJMHgyODAwCQkvKiBEYXRhIExlbmd0aCA9IDE0IEJpdHMJCQkqLwotI2RlZmluZSBETEVOXzE1CQkJMHgzMDAwCQkvKiBEYXRhIExlbmd0aCA9IDE1IEJpdHMJCQkqLwotI2RlZmluZSBETEVOXzE2CQkJMHgzODAwCQkvKiBEYXRhIExlbmd0aCA9IDE2IEJpdHMJCQkqLwotI2RlZmluZSBETEVOR1RICQkJMHgzODAwCQkvKiBQUEkgRGF0YSBMZW5ndGggICovCi0jZGVmaW5lIFBPTEMJCQkweDQwMDAJCS8qIFBQSSBDbG9jayBQb2xhcml0eQkJCQkqLwotI2RlZmluZSBQT0xTCQkJMHg4MDAwCQkvKiBQUEkgRnJhbWUgU3luYyBQb2xhcml0eQkJCSovCi0KLS8qIFBQSV9TVEFUVVMgTWFza3MJCQkJCQkJCQkJCQkJCSovCi0jZGVmaW5lIEZMRAkJCQkweDA0MDAJCS8qIEZpZWxkIEluZGljYXRvcgkJCQkJKi8KLSNkZWZpbmUgRlRfRVJSCQkJMHgwODAwCQkvKiBGcmFtZSBUcmFjayBFcnJvcgkJCQkqLwotI2RlZmluZSBPVlIJCQkJMHgxMDAwCQkvKiBGSUZPIE92ZXJmbG93IEVycm9yCQkJCSovCi0jZGVmaW5lIFVORFIJCQkweDIwMDAJCS8qIEZJRk8gVW5kZXJydW4gRXJyb3IJCQkJKi8KLSNkZWZpbmUgRVJSX0RFVAkJCTB4NDAwMAkJLyogRXJyb3IgRGV0ZWN0ZWQgSW5kaWNhdG9yCQkJKi8KLSNkZWZpbmUgRVJSX05DT1IJCTB4ODAwMAkJLyogRXJyb3IgTm90IENvcnJlY3RlZCBJbmRpY2F0b3IJKi8KLQotCi0vKiAgKioqKioqKioqKioqKioqKioqKiogIFRXTy1XSVJFIElOVEVSRkFDRSAoVFdJKSBNQVNLUyAgKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBUV0lfQ0xLRElWIE1hY3JvcyAoVXNlOiAqcFRXSV9DTEtESVYgPSBDTEtMT1coeCl8Q0xLSEkoeSk7ICApCQkJCSovCi0jZGVmaW5lCUNMS0xPVyh4KQkoKHgpICYgMHhGRikJCS8qIFBlcmlvZHMgQ2xvY2sgSXMgSGVsZCBMb3cJCQkqLwotI2RlZmluZSBDTEtISSh5KQkoKCh5KSYweEZGKTw8MHg4KQkvKiBQZXJpb2RzIEJlZm9yZSBOZXcgQ2xvY2sgTG93CQkJKi8KLQotLyogVFdJX1BSRVNDQUxFIE1hc2tzCQkJCQkJCQkJCQkJCQkJKi8KLSNkZWZpbmUJUFJFU0NBTEUJMHgwMDdGCQkvKiBTQ0xLcyBQZXIgSW50ZXJuYWwgVGltZSBSZWZlcmVuY2UgKDEwTUh6KQkqLwotI2RlZmluZQlUV0lfRU5BCQkweDAwODAJCS8qIFRXSSBFbmFibGUJCQkJCQkJCQkqLwotI2RlZmluZQlTQ0NCCQkweDAyMDAJCS8qIFNDQ0IgQ29tcGF0aWJpbGl0eSBFbmFibGUJCQkJCSovCi0KLS8qIFRXSV9TTEFWRV9DVEwgTWFza3MJCQkJCQkJCQkJCQkJCQkqLwotI2RlZmluZQlTRU4JCQkweDAwMDEJCS8qIFNsYXZlIEVuYWJsZQkJCQkJCQkJCSovCi0jZGVmaW5lCVNBRERfTEVOCTB4MDAwMgkJLyogU2xhdmUgQWRkcmVzcyBMZW5ndGgJCQkJCQkJKi8KLSNkZWZpbmUJU1REVkFMCQkweDAwMDQJCS8qIFNsYXZlIFRyYW5zbWl0IERhdGEgVmFsaWQJCQkJCSovCi0jZGVmaW5lCU5BSwkJCTB4MDAwOAkJLyogTkFLL0FDSyogR2VuZXJhdGVkIEF0IENvbmNsdXNpb24gT2YgVHJhbnNmZXIgKi8KLSNkZWZpbmUJR0VOCQkJMHgwMDEwCQkvKiBHZW5lcmFsIENhbGwgQWRycmVzcyBNYXRjaGluZyBFbmFibGVkCQkqLwotCi0vKiBUV0lfU0xBVkVfU1RBVCBNYXNrcwkJCQkJCQkJCQkJCQkJCSovCi0jZGVmaW5lCVNESVIJCTB4MDAwMQkJLyogU2xhdmUgVHJhbnNmZXIgRGlyZWN0aW9uIChUcmFuc21pdC9SZWNlaXZlKikJKi8KLSNkZWZpbmUgR0NBTEwJCTB4MDAwMgkJLyogR2VuZXJhbCBDYWxsIEluZGljYXRvcgkJCQkJCSovCi0KLS8qIFRXSV9NQVNURVJfQ1RMIE1hc2tzCQkJCQkJCQkJCQkJCSovCi0jZGVmaW5lCU1FTgkJCTB4MDAwMQkJLyogTWFzdGVyIE1vZGUgRW5hYmxlCQkJCQkJKi8KLSNkZWZpbmUJTUFERF9MRU4JMHgwMDAyCQkvKiBNYXN0ZXIgQWRkcmVzcyBMZW5ndGgJCQkJCSovCi0jZGVmaW5lCU1ESVIJCTB4MDAwNAkJLyogTWFzdGVyIFRyYW5zbWl0IERpcmVjdGlvbiAoUlgvVFgqKQkJKi8KLSNkZWZpbmUJRkFTVAkJMHgwMDA4CQkvKiBVc2UgRmFzdCBNb2RlIFRpbWluZyBTcGVjcwkJCQkqLwotI2RlZmluZQlTVE9QCQkweDAwMTAJCS8qIElzc3VlIFN0b3AgQ29uZGl0aW9uCQkJCQkJKi8KLSNkZWZpbmUJUlNUQVJUCQkweDAwMjAJCS8qIFJlcGVhdCBTdGFydCBvciBTdG9wKiBBdCBFbmQgT2YgVHJhbnNmZXIJKi8KLSNkZWZpbmUJRENOVAkJMHgzRkMwCQkvKiBEYXRhIEJ5dGVzIFRvIFRyYW5zZmVyCQkJCQkqLwotI2RlZmluZQlTREFPVlIJCTB4NDAwMAkJLyogU2VyaWFsIERhdGEgT3ZlcnJpZGUJCQkJCQkqLwotI2RlZmluZQlTQ0xPVlIJCTB4ODAwMAkJLyogU2VyaWFsIENsb2NrIE92ZXJyaWRlCQkJCQkqLwotCi0vKiBUV0lfTUFTVEVSX1NUQVQgTWFza3MJCQkJCQkJCQkJCQkJCSovCi0jZGVmaW5lCU1QUk9HCQkweDAwMDEJCS8qIE1hc3RlciBUcmFuc2ZlciBJbiBQcm9ncmVzcwkJCQkJKi8KLSNkZWZpbmUJTE9TVEFSQgkJMHgwMDAyCQkvKiBMb3N0IEFyYml0cmF0aW9uIEluZGljYXRvciAoWGZlciBBYm9ydGVkKQkqLwotI2RlZmluZQlBTkFLCQkweDAwMDQJCS8qIEFkZHJlc3MgTm90IEFja25vd2xlZGdlZAkJCQkJCSovCi0jZGVmaW5lCUROQUsJCTB4MDAwOAkJLyogRGF0YSBOb3QgQWNrbm93bGVkZ2VkCQkJCQkJKi8KLSNkZWZpbmUJQlVGUkRFUlIJMHgwMDEwCQkvKiBCdWZmZXIgUmVhZCBFcnJvcgkJCQkJCQkqLwotI2RlZmluZQlCVUZXUkVSUgkweDAwMjAJCS8qIEJ1ZmZlciBXcml0ZSBFcnJvcgkJCQkJCQkqLwotI2RlZmluZQlTREFTRU4JCTB4MDA0MAkJLyogU2VyaWFsIERhdGEgU2Vuc2UJCQkJCQkJKi8KLSNkZWZpbmUJU0NMU0VOCQkweDAwODAJCS8qIFNlcmlhbCBDbG9jayBTZW5zZQkJCQkJCQkqLwotI2RlZmluZQlCVVNCVVNZCQkweDAxMDAJCS8qIEJ1cyBCdXN5IEluZGljYXRvcgkJCQkJCQkqLwotCi0vKiBUV0lfSU5UX1NSQyBhbmQgVFdJX0lOVF9FTkFCTEUgTWFza3MJCQkJCQkqLwotI2RlZmluZQlTSU5JVAkJMHgwMDAxCQkvKiBTbGF2ZSBUcmFuc2ZlciBJbml0aWF0ZWQJKi8KLSNkZWZpbmUJU0NPTVAJCTB4MDAwMgkJLyogU2xhdmUgVHJhbnNmZXIgQ29tcGxldGUJKi8KLSNkZWZpbmUJU0VSUgkJMHgwMDA0CQkvKiBTbGF2ZSBUcmFuc2ZlciBFcnJvcgkJKi8KLSNkZWZpbmUJU09WRgkJMHgwMDA4CQkvKiBTbGF2ZSBPdmVyZmxvdwkJCSovCi0jZGVmaW5lCU1DT01QCQkweDAwMTAJCS8qIE1hc3RlciBUcmFuc2ZlciBDb21wbGV0ZQkqLwotI2RlZmluZQlNRVJSCQkweDAwMjAJCS8qIE1hc3RlciBUcmFuc2ZlciBFcnJvcgkqLwotI2RlZmluZQlYTVRTRVJWCQkweDAwNDAJCS8qIFRyYW5zbWl0IEZJRk8gU2VydmljZQkqLwotI2RlZmluZQlSQ1ZTRVJWCQkweDAwODAJCS8qIFJlY2VpdmUgRklGTyBTZXJ2aWNlCQkqLwotCi0vKiBUV0lfRklGT19DVFJMIE1hc2tzCQkJCQkJCQkJCQkJKi8KLSNkZWZpbmUJWE1URkxVU0gJMHgwMDAxCQkvKiBUcmFuc21pdCBCdWZmZXIgRmx1c2gJCQkqLwotI2RlZmluZQlSQ1ZGTFVTSAkweDAwMDIJCS8qIFJlY2VpdmUgQnVmZmVyIEZsdXNoCQkJCSovCi0jZGVmaW5lCVhNVElOVExFTgkweDAwMDQJCS8qIFRyYW5zbWl0IEJ1ZmZlciBJbnRlcnJ1cHQgTGVuZ3RoCSovCi0jZGVmaW5lCVJDVklOVExFTgkweDAwMDgJCS8qIFJlY2VpdmUgQnVmZmVyIEludGVycnVwdCBMZW5ndGgJKi8KLQotLyogVFdJX0ZJRk9fU1RBVCBNYXNrcwkJCQkJCQkJCQkJCQkJCSovCi0jZGVmaW5lCVhNVFNUQVQJCTB4MDAwMwkJLyogVHJhbnNtaXQgRklGTyBTdGF0dXMJCQkJCQkJKi8KLSNkZWZpbmUJWE1UX0VNUFRZCTB4MDAwMAkJLyogCQlUcmFuc21pdCBGSUZPIEVtcHR5CQkJCQkJKi8KLSNkZWZpbmUJWE1UX0hBTEYJMHgwMDAxCQkvKiAJCVRyYW5zbWl0IEZJRk8gSGFzIDEgQnl0ZSBUbyBXcml0ZQkJKi8KLSNkZWZpbmUJWE1UX0ZVTEwJMHgwMDAzCQkvKiAJCVRyYW5zbWl0IEZJRk8gRnVsbCAoMiBCeXRlcyBUbyBXcml0ZSkJKi8KLQotI2RlZmluZQlSQ1ZTVEFUCQkweDAwMEMJCS8qIFJlY2VpdmUgRklGTyBTdGF0dXMJCQkJCQkJKi8KLSNkZWZpbmUJUkNWX0VNUFRZCTB4MDAwMAkJLyogCQlSZWNlaXZlIEZJRk8gRW1wdHkJCQkJCQkqLwotI2RlZmluZQlSQ1ZfSEFMRgkweDAwMDQJCS8qIAkJUmVjZWl2ZSBGSUZPIEhhcyAxIEJ5dGUgVG8gUmVhZAkJCSovCi0jZGVmaW5lCVJDVl9GVUxMCTB4MDAwQwkJLyogCQlSZWNlaXZlIEZJRk8gRnVsbCAoMiBCeXRlcyBUbyBSZWFkKQkJKi8KLQotCi0vKiBPbWl0IENBTiBtYXNrcyBmcm9tIGRlZkJGNTM0LmggKi8KLQotLyogICoqKioqKioqKioqKioqKioqKiogIFBJTiBDT05UUk9MIFJFR0lTVEVSIE1BU0tTICAqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBQT1JUX01VWCBNYXNrcwkJCQkJCQkJCQkJCQkJCSovCi0jZGVmaW5lCVBKU0UJCQkweDAwMDEJCQkvKiBQb3J0IEogU1BJL1NQT1JUIEVuYWJsZQkJCSovCi0jZGVmaW5lCVBKU0VfU1BPUlQJCTB4MDAwMAkJCS8qIAkJRW5hYmxlIFRGUzAvRFQwUFJJCQkJKi8KLSNkZWZpbmUJUEpTRV9TUEkJCTB4MDAwMQkJCS8qIAkJRW5hYmxlIFNQSV9TU0VMMzoyCQkJKi8KLQotI2RlZmluZQlQSkNFKHgpCQkJKCgoeCkmMHgzKTw8MSkJLyogUG9ydCBKIENBTi9TUEkvU1BPUlQgRW5hYmxlCQkqLwotI2RlZmluZQlQSkNFX1NQT1JUCQkweDAwMDAJCQkvKiAJCUVuYWJsZSBEUjBTRUMvRFQwU0VDCQkqLwotI2RlZmluZQlQSkNFX0NBTgkJMHgwMDAyCQkJLyogCQlFbmFibGUgQ0FOIFJYL1RYCQkJKi8KLSNkZWZpbmUJUEpDRV9TUEkJCTB4MDAwNAkJCS8qIAkJRW5hYmxlIFNQSV9TU0VMNwkJCSovCi0KLSNkZWZpbmUJUEZERQkJCTB4MDAwOAkJCS8qIFBvcnQgRiBETUEgUmVxdWVzdCBFbmFibGUJCSovCi0jZGVmaW5lCVBGREVfVUFSVAkJMHgwMDAwCQkJLyogCQlFbmFibGUgVUFSVDAgUlgvVFgJCQkqLwotI2RlZmluZQlQRkRFX0RNQQkJMHgwMDA4CQkJLyogCQlFbmFibGUgRE1BUjE6MAkJCQkqLwotCi0jZGVmaW5lCVBGVEUJCQkweDAwMTAJCQkvKiBQb3J0IEYgVGltZXIgRW5hYmxlCQkJCSovCi0jZGVmaW5lCVBGVEVfVUFSVAkJMHgwMDAwCQkJLyoJCUVuYWJsZSBVQVJUMSBSWC9UWAkJCSovCi0jZGVmaW5lCVBGVEVfVElNRVIJCTB4MDAxMAkJCS8qIAkJRW5hYmxlIFRNUjc6NgkJCQkqLwotCi0jZGVmaW5lCVBGUzZFCQkJMHgwMDIwCQkJLyogUG9ydCBGIFNQSSBTU0VMIDYgRW5hYmxlCQkJKi8KLSNkZWZpbmUJUEZTNkVfVElNRVIJCTB4MDAwMAkJCS8qCQlFbmFibGUgVE1SNQkJCQkJKi8KLSNkZWZpbmUJUEZTNkVfU1BJCQkweDAwMjAJCQkvKiAJCUVuYWJsZSBTUElfU1NFTDYJCQkqLwotCi0jZGVmaW5lCVBGUzVFCQkJMHgwMDQwCQkJLyogUG9ydCBGIFNQSSBTU0VMIDUgRW5hYmxlCQkJKi8KLSNkZWZpbmUJUEZTNUVfVElNRVIJCTB4MDAwMAkJCS8qCQlFbmFibGUgVE1SNAkJCQkJKi8KLSNkZWZpbmUJUEZTNUVfU1BJCQkweDAwNDAJCQkvKiAJCUVuYWJsZSBTUElfU1NFTDUJCQkqLwotCi0jZGVmaW5lCVBGUzRFCQkJMHgwMDgwCQkJLyogUG9ydCBGIFNQSSBTU0VMIDQgRW5hYmxlCQkJKi8KLSNkZWZpbmUJUEZTNEVfVElNRVIJCTB4MDAwMAkJCS8qCQlFbmFibGUgVE1SMwkJCQkJKi8KLSNkZWZpbmUJUEZTNEVfU1BJCQkweDAwODAJCQkvKiAJCUVuYWJsZSBTUElfU1NFTDQJCQkqLwotCi0jZGVmaW5lCVBGRkUJCQkweDAxMDAJCQkvKiBQb3J0IEYgUFBJIEZyYW1lIFN5bmMgRW5hYmxlCQkqLwotI2RlZmluZQlQRkZFX1RJTUVSCQkweDAwMDAJCQkvKiAJCUVuYWJsZSBUTVIyCQkJCQkqLwotI2RlZmluZQlQRkZFX1BQSQkJMHgwMTAwCQkJLyogCQlFbmFibGUgUFBJIEZTMwkJCQkqLwotCi0jZGVmaW5lCVBHU0UJCQkweDAyMDAJCQkvKiBQb3J0IEcgU1BPUlQxIFNlY29uZGFyeSBFbmFibGUJKi8KLSNkZWZpbmUJUEdTRV9QUEkJCTB4MDAwMAkJCS8qIAkJRW5hYmxlIFBQSSBEOTo4CQkJCSovCi0jZGVmaW5lCVBHU0VfU1BPUlQJCTB4MDIwMAkJCS8qIAkJRW5hYmxlIERSMVNFQy9EVDFTRUMJCSovCi0KLSNkZWZpbmUJUEdSRQkJCTB4MDQwMAkJCS8qIFBvcnQgRyBTUE9SVDEgUmVjZWl2ZSBFbmFibGUJCSovCi0jZGVmaW5lCVBHUkVfUFBJCQkweDAwMDAJCQkvKiAJCUVuYWJsZSBQUEkgRDEyOjEwCQkJKi8KLSNkZWZpbmUJUEdSRV9TUE9SVAkJMHgwNDAwCQkJLyogCQlFbmFibGUgRFIxUFJJL1JGUzEvUlNDTEsxCSovCi0KLSNkZWZpbmUJUEdURQkJCTB4MDgwMAkJCS8qIFBvcnQgRyBTUE9SVDEgVHJhbnNtaXQgRW5hYmxlCSovCi0jZGVmaW5lCVBHVEVfUFBJCQkweDAwMDAJCQkvKiAJCUVuYWJsZSBQUEkgRDE1OjEzCQkJKi8KLSNkZWZpbmUJUEdURV9TUE9SVAkJMHgwODAwCQkJLyogCQlFbmFibGUgRFQxUFJJL1RGUzEvVFNDTEsxCSovCi0KLQotLyogICoqKioqKioqKioqKioqKioqKiAgSEFORFNIQUtFIERNQSAoSERNQSkgTUFTS1MgICoqKioqKioqKioqKioqKioqKioqKi8KLS8qIEhETUF4X0NUTCBNYXNrcwkJCQkJCQkJCQkJCQkJKi8KLSNkZWZpbmUJSE1ETUFFTgkJMHgwMDAxCS8qIEVuYWJsZSBIYW5kc2hha2UgRE1BIDAvMQkJCQkJKi8KLSNkZWZpbmUJUkVQCQkJMHgwMDAyCS8qIEhETUEgUmVxdWVzdCBQb2xhcml0eQkJCQkJKi8KLSNkZWZpbmUJVVRFCQkJMHgwMDA0CS8qIFVyZ2VuY3kgVGhyZXNob2xkIEVuYWJsZQkJCQkJKi8KLSNkZWZpbmUJT0lFCQkJMHgwMDEwCS8qIE92ZXJmbG93IEludGVycnVwdCBFbmFibGUJCQkJKi8KLSNkZWZpbmUJQkRJRQkJMHgwMDIwCS8qIEJsb2NrIERvbmUgSW50ZXJydXB0IEVuYWJsZQkJCQkqLwotI2RlZmluZQlNQkRJCQkweDAwNDAJLyogTWFzayBCbG9jayBEb25lIElSUSBJZiBQZW5kaW5nIEVDTlQJCSovCi0jZGVmaW5lCURSUQkJCTB4MDMwMAkvKiBIRE1BIFJlcXVlc3QgVHlwZQkJCQkJCSovCi0jZGVmaW5lCURSUV9OT05FCTB4MDAwMAkvKiAJCU5vIFJlcXVlc3QJCQkJCQkJKi8KLSNkZWZpbmUJRFJRX1NJTkdMRQkweDAxMDAJLyogCQlDaGFubmVscyBSZXF1ZXN0IFNpbmdsZQkJCQkqLwotI2RlZmluZQlEUlFfTVVMVEkJMHgwMjAwCS8qIAkJQ2hhbm5lbHMgUmVxdWVzdCBNdWx0aSAoRGVmYXVsdCkJKi8KLSNkZWZpbmUJRFJRX1VSR0VOVAkweDAzMDAJLyogCQlDaGFubmVscyBSZXF1ZXN0IE11bHRpIFVyZ2VudAkJKi8KLSNkZWZpbmUJUkJDCQkJMHgxMDAwCS8qIFJlbG9hZCBCQ05UIFdpdGggSUJDTlQJCQkJCSovCi0jZGVmaW5lCVBTCQkJMHgyMDAwCS8qIEhETUEgUGluIFN0YXR1cwkJCQkJCQkqLwotI2RlZmluZQlPSQkJCTB4NDAwMAkvKiBPdmVyZmxvdyBJbnRlcnJ1cHQgR2VuZXJhdGVkCQkJCSovCi0jZGVmaW5lCUJESQkJCTB4ODAwMAkvKiBCbG9jayBEb25lIEludGVycnVwdCBHZW5lcmF0ZWQJCQkqLwotCi0vKiBlbnRyeSBhZGRyZXNzZXMgb2YgdGhlIHVzZXItY2FsbGFibGUgQm9vdCBST00gZnVuY3Rpb25zICovCi0KLSNkZWZpbmUgX0JPT1RST01fUkVTRVQgMHhFRjAwMDAwMAotI2RlZmluZSBfQk9PVFJPTV9GSU5BTF9JTklUIDB4RUYwMDAwMDIKLSNkZWZpbmUgX0JPT1RST01fRE9fTUVNT1JZX0RNQSAweEVGMDAwMDA2Ci0jZGVmaW5lIF9CT09UUk9NX0JPT1RfRFhFX0ZMQVNIIDB4RUYwMDAwMDgKLSNkZWZpbmUgX0JPT1RST01fQk9PVF9EWEVfU1BJIDB4RUYwMDAwMEEKLSNkZWZpbmUgX0JPT1RST01fQk9PVF9EWEVfVFdJIDB4RUYwMDAwMEMKLSNkZWZpbmUgX0JPT1RST01fR0VUX0RYRV9BRERSRVNTX0ZMQVNIIDB4RUYwMDAwMTAKLSNkZWZpbmUgX0JPT1RST01fR0VUX0RYRV9BRERSRVNTX1NQSSAweEVGMDAwMDEyCi0jZGVmaW5lIF9CT09UUk9NX0dFVF9EWEVfQUREUkVTU19UV0kgMHhFRjAwMDAxNAotCi0vKiBBbHRlcm5hdGUgRGVwcmVjYXRlZCBNYWNyb3MgUHJvdmlkZWQgRm9yIEJhY2t3YXJkcyBDb2RlIENvbXBhdGliaWxpdHkgKi8KLSNkZWZpbmUJUEdERV9VQVJUICAgUEZERV9VQVJUCi0jZGVmaW5lCVBHREVfRE1BICAgIFBGREVfRE1BCi0jZGVmaW5lCUNLRUxPVwkJU0NLRUxPVwotCi0vKiA9PT09IGVuZCBmcm9tIGRlZkJGNTM0LmggPT09PSAqLwotCi0vKiBIT1NUIFBvcnQgUmVnaXN0ZXJzICovCi0KLSNkZWZpbmUgICAgICAgICAgICAgICAgICAgICBIT1NUX0NPTlRST0wgIDB4ZmZjMDM0MDAgICAvKiBIT1NUIENvbnRyb2wgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgSE9TVF9TVEFUVVMgIDB4ZmZjMDM0MDQgICAvKiBIT1NUIFN0YXR1cyBSZWdpc3RlciAqLwotI2RlZmluZSAgICAgICAgICAgICAgICAgICAgIEhPU1RfVElNRU9VVCAgMHhmZmMwMzQwOCAgIC8qIEhPU1QgQWNrbm93bGVkZ2UgTW9kZSBUaW1lb3V0IFJlZ2lzdGVyICovCi0KLS8qIENvdW50ZXIgUmVnaXN0ZXJzICovCi0KLSNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgIENOVF9DT05GSUcgIDB4ZmZjMDM1MDAgICAvKiBDb25maWd1cmF0aW9uIFJlZ2lzdGVyICovCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICAgQ05UX0lNQVNLICAweGZmYzAzNTA0ICAgLyogSW50ZXJydXB0IE1hc2sgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgIENOVF9TVEFUVVMgIDB4ZmZjMDM1MDggICAvKiBTdGF0dXMgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgQ05UX0NPTU1BTkQgIDB4ZmZjMDM1MGMgICAvKiBDb21tYW5kIFJlZ2lzdGVyICovCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgICAgQ05UX0RFQk9VTkNFICAweGZmYzAzNTEwICAgLyogRGVib3VuY2UgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgQ05UX0NPVU5URVIgIDB4ZmZjMDM1MTQgICAvKiBDb3VudGVyIFJlZ2lzdGVyICovCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICAgICBDTlRfTUFYICAweGZmYzAzNTE4ICAgLyogTWF4aW1hbCBDb3VudCBSZWdpc3RlciAqLwotI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgICAgQ05UX01JTiAgMHhmZmMwMzUxYyAgIC8qIE1pbmltYWwgQ291bnQgUmVnaXN0ZXIgKi8KLQotLyogT1RQL0ZVU0UgUmVnaXN0ZXJzICovCi0KLSNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgT1RQX0NPTlRST0wgIDB4ZmZjMDM2MDAgICAvKiBPVFAvRnVzZSBDb250cm9sIFJlZ2lzdGVyICovCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICAgICBPVFBfQkVOICAweGZmYzAzNjA0ICAgLyogT1RQL0Z1c2UgQnl0ZSBFbmFibGUgKi8KLSNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgIE9UUF9TVEFUVVMgIDB4ZmZjMDM2MDggICAvKiBPVFAvRnVzZSBTdGF0dXMgKi8KLSNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgIE9UUF9USU1JTkcgIDB4ZmZjMDM2MGMgICAvKiBPVFAvRnVzZSBBY2Nlc3MgVGltaW5nICovCi0KLS8qIFNlY3VyaXR5IFJlZ2lzdGVycyAqLwotCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgICBTRUNVUkVfU1lTU1dUICAweGZmYzAzNjIwICAgLyogU2VjdXJlIFN5c3RlbSBTd2l0Y2hlcyAqLwotI2RlZmluZSAgICAgICAgICAgICAgICAgICBTRUNVUkVfQ09OVFJPTCAgMHhmZmMwMzYyNCAgIC8qIFNlY3VyZSBDb250cm9sICovCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgICBTRUNVUkVfU1RBVFVTICAweGZmYzAzNjI4ICAgLyogU2VjdXJlIFN0YXR1cyAqLwotCi0vKiBPVFAgUmVhZC9Xcml0ZSBEYXRhIEJ1ZmZlciBSZWdpc3RlcnMgKi8KLQotI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgIE9UUF9EQVRBMCAgMHhmZmMwMzY4MCAgIC8qIE9UUC9GdXNlIERhdGEgKE9UUF9EQVRBMC0zKSBhY2Nlc3NlcyB0aGUgZnVzZSByZWFkIHdyaXRlIGJ1ZmZlciAqLwotI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgIE9UUF9EQVRBMSAgMHhmZmMwMzY4NCAgIC8qIE9UUC9GdXNlIERhdGEgKE9UUF9EQVRBMC0zKSBhY2Nlc3NlcyB0aGUgZnVzZSByZWFkIHdyaXRlIGJ1ZmZlciAqLwotI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgIE9UUF9EQVRBMiAgMHhmZmMwMzY4OCAgIC8qIE9UUC9GdXNlIERhdGEgKE9UUF9EQVRBMC0zKSBhY2Nlc3NlcyB0aGUgZnVzZSByZWFkIHdyaXRlIGJ1ZmZlciAqLwotI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgIE9UUF9EQVRBMyAgMHhmZmMwMzY4YyAgIC8qIE9UUC9GdXNlIERhdGEgKE9UUF9EQVRBMC0zKSBhY2Nlc3NlcyB0aGUgZnVzZSByZWFkIHdyaXRlIGJ1ZmZlciAqLwotCi0vKiBORkMgUmVnaXN0ZXJzICovCi0KLSNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgICAgIE5GQ19DVEwgIDB4ZmZjMDM3MDAgICAvKiBOQU5EIENvbnRyb2wgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgICAgTkZDX1NUQVQgIDB4ZmZjMDM3MDQgICAvKiBOQU5EIFN0YXR1cyBSZWdpc3RlciAqLwotI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICBORkNfSVJRU1RBVCAgMHhmZmMwMzcwOCAgIC8qIE5BTkQgSW50ZXJydXB0IFN0YXR1cyBSZWdpc3RlciAqLwotI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICBORkNfSVJRTUFTSyAgMHhmZmMwMzcwYyAgIC8qIE5BTkQgSW50ZXJydXB0IE1hc2sgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgICAgTkZDX0VDQzAgIDB4ZmZjMDM3MTAgICAvKiBOQU5EIEVDQyBSZWdpc3RlciAwICovCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICAgIE5GQ19FQ0MxICAweGZmYzAzNzE0ICAgLyogTkFORCBFQ0MgUmVnaXN0ZXIgMSAqLwotI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgICBORkNfRUNDMiAgMHhmZmMwMzcxOCAgIC8qIE5BTkQgRUNDIFJlZ2lzdGVyIDIgKi8KLSNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgICAgTkZDX0VDQzMgIDB4ZmZjMDM3MWMgICAvKiBOQU5EIEVDQyBSZWdpc3RlciAzICovCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICAgTkZDX0NPVU5UICAweGZmYzAzNzIwICAgLyogTkFORCBFQ0MgQ291bnQgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgICAgIE5GQ19SU1QgIDB4ZmZjMDM3MjQgICAvKiBOQU5EIEVDQyBSZXNldCBSZWdpc3RlciAqLwotI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgIE5GQ19QR0NUTCAgMHhmZmMwMzcyOCAgIC8qIE5BTkQgUGFnZSBDb250cm9sIFJlZ2lzdGVyICovCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICAgIE5GQ19SRUFEICAweGZmYzAzNzJjICAgLyogTkFORCBSZWFkIERhdGEgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgICAgTkZDX0FERFIgIDB4ZmZjMDM3NDAgICAvKiBOQU5EIEFkZHJlc3MgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgICAgIE5GQ19DTUQgIDB4ZmZjMDM3NDQgICAvKiBOQU5EIENvbW1hbmQgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgTkZDX0RBVEFfV1IgIDB4ZmZjMDM3NDggICAvKiBOQU5EIERhdGEgV3JpdGUgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgTkZDX0RBVEFfUkQgIDB4ZmZjMDM3NGMgICAvKiBOQU5EIERhdGEgUmVhZCBSZWdpc3RlciAqLwotCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0vKiAgICAgU0lOR0xFIEJJVCBNQUNSTyBQQUlSUyAoYml0IG1hc2sgYW5kIG5lZ2F0ZWQgb25lKSAgICAgICovCi0vKiAgICAgYW5kIE1VTFRJIEJJVCBSRUFEIE1BQ1JPUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0KLS8qIEJpdCBtYXNrcyBmb3IgSE9TVF9DT05UUk9MICovCi0KLSNkZWZpbmUgICAgICAgICAgICAgICAgICAgSE9TVF9DTlRSX0hPU1RfRU4gIDB4MSAgICAgICAgLyogSG9zdCBFbmFibGUgKi8KLSNkZWZpbmUgICAgICAgICAgICAgICAgICBIT1NUX0NOVFJfbkhPU1RfRU4gIDB4MAotI2RlZmluZSAgICAgICAgICAgICAgICAgIEhPU1RfQ05UUl9IT1NUX0VORCAgMHgyICAgICAgICAvKiBIb3N0IEVuZGlhbmVzcyAqLwotI2RlZmluZSAgICAgICAgICAgICAgICAgSE9TVF9DTlRSX25IT1NUX0VORCAgMHgwCi0jZGVmaW5lICAgICAgICAgICAgICAgICBIT1NUX0NOVFJfREFUQV9TSVpFICAweDQgICAgICAgIC8qIERhdGEgU2l6ZSAqLwotI2RlZmluZSAgICAgICAgICAgICAgICBIT1NUX0NOVFJfbkRBVEFfU0laRSAgMHgwCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgSE9TVF9DTlRSX0hPU1RfUlNUICAweDggICAgICAgIC8qIEhvc3QgUmVzZXQgKi8KLSNkZWZpbmUgICAgICAgICAgICAgICAgIEhPU1RfQ05UUl9uSE9TVF9SU1QgIDB4MAotI2RlZmluZSAgICAgICAgICAgICAgICAgIEhPU1RfQ05UUl9IUkRZX09WUiAgMHgyMCAgICAgICAvKiBIb3N0IFJlYWR5IE92ZXJyaWRlICovCi0jZGVmaW5lICAgICAgICAgICAgICAgICBIT1NUX0NOVFJfbkhSRFlfT1ZSICAweDAKLSNkZWZpbmUgICAgICAgICAgICAgICAgICBIT1NUX0NOVFJfSU5UX01PREUgIDB4NDAgICAgICAgLyogSW50ZXJydXB0IE1vZGUgKi8KLSNkZWZpbmUgICAgICAgICAgICAgICAgIEhPU1RfQ05UUl9uSU5UX01PREUgIDB4MAotI2RlZmluZSAgICAgICAgICAgICAgICAgICAgIEhPU1RfQ05UUl9CVF9FTiAgMHg4MCAgICAgICAvKiBCdXMgVGltZW91dCBFbmFibGUgKi8KLSNkZWZpbmUgICAgICAgICAgICAgICAgICAgSE9TVF9DTlRSXyBuQlRfRU4gIDB4MAotI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgSE9TVF9DTlRSX0VIVyAgMHgxMDAgICAgICAvKiBFbmFibGUgSG9zdCBXcml0ZSAqLwotI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICBIT1NUX0NOVFJfbkVIVyAgMHgwCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICBIT1NUX0NOVFJfRUhSICAweDIwMCAgICAgIC8qIEVuYWJsZSBIb3N0IFJlYWQgKi8KLSNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgSE9TVF9DTlRSX25FSFIgIDB4MAotI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgSE9TVF9DTlRSX0JEUiAgMHg0MDAgICAgICAvKiBCdXJzdCBETUEgUmVxdWVzdHMgKi8KLSNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgSE9TVF9DTlRSX25CRFIgIDB4MAotCi0vKiBCaXQgbWFza3MgZm9yIEhPU1RfU1RBVFVTICovCi0KLSNkZWZpbmUgICAgICAgICAgICAgICAgICAgICBIT1NUX1NUQVRfUkVBRFkgIDB4MSAgICAgICAgLyogRE1BIFJlYWR5ICovCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgICBIT1NUX1NUQVRfblJFQURZICAweDAKLSNkZWZpbmUgICAgICAgICAgICAgICAgICBIT1NUX1NUQVRfRklGT0ZVTEwgIDB4MiAgICAgICAgLyogRklGTyBGdWxsICovCi0jZGVmaW5lICAgICAgICAgICAgICAgICBIT1NUX1NUQVRfbkZJRk9GVUxMICAweDAKLSNkZWZpbmUgICAgICAgICAgICAgICAgIEhPU1RfU1RBVF9GSUZPRU1QVFkgIDB4NCAgICAgICAgLyogRklGTyBFbXB0eSAqLwotI2RlZmluZSAgICAgICAgICAgICAgICBIT1NUX1NUQVRfbkZJRk9FTVBUWSAgMHgwCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgSE9TVF9TVEFUX0NPTVBMRVRFICAweDggICAgICAgIC8qIERNQSBDb21wbGV0ZSAqLwotI2RlZmluZSAgICAgICAgICAgICAgICAgSE9TVF9TVEFUX25DT01QTEVURSAgMHgwCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgICAgIEhPU1RfU1RBVF9IU0hLICAweDEwICAgICAgIC8qIEhvc3QgSGFuZHNoYWtlICovCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgICAgSE9TVF9TVEFUX25IU0hLICAweDAKLSNkZWZpbmUgICAgICAgICAgICAgICAgICAgSE9TVF9TVEFUX1RJTUVPVVQgIDB4MjAgICAgICAgLyogSG9zdCBUaW1lb3V0ICovCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgSE9TVF9TVEFUX25USU1FT1VUICAweDAKLSNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgSE9TVF9TVEFUX0hJUlEgIDB4NDAgICAgICAgLyogSG9zdCBJbnRlcnJ1cHQgUmVxdWVzdCAqLwotI2RlZmluZSAgICAgICAgICAgICAgICAgICAgIEhPU1RfU1RBVF9uSElSUSAgMHgwCi0jZGVmaW5lICAgICAgICAgICAgICAgIEhPU1RfU1RBVF9BTExPV19DTkZHICAweDgwICAgICAgIC8qIEFsbG93IE5ldyBDb25maWd1cmF0aW9uICovCi0jZGVmaW5lICAgICAgICAgICAgICAgSE9TVF9TVEFUX25BTExPV19DTkZHICAweDAKLSNkZWZpbmUgICAgICAgICAgICAgICAgICAgSE9TVF9TVEFUX0RNQV9ESVIgIDB4MTAwICAgICAgLyogRE1BIERpcmVjdGlvbiAqLwotI2RlZmluZSAgICAgICAgICAgICAgICAgIEhPU1RfU1RBVF9uRE1BX0RJUiAgMHgwCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICBIT1NUX1NUQVRfQlRFICAweDIwMCAgICAgIC8qIEJ1cyBUaW1lb3V0IEVuYWJsZWQgKi8KLSNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgSE9TVF9TVEFUX25CVEUgIDB4MAotI2RlZmluZSAgICAgICAgICAgICAgIEhPU1RfU1RBVF9IT1NUUkRfRE9ORSAgMHg4MDAwICAgICAvKiBIb3N0IFJlYWQgQ29tcGxldGlvbiBJbnRlcnJ1cHQgKi8KLSNkZWZpbmUgICAgICAgICAgICAgIEhPU1RfU1RBVF9uSE9TVFJEX0RPTkUgIDB4MAotCi0vKiBCaXQgbWFza3MgZm9yIEhPU1RfVElNRU9VVCAqLwotCi0jZGVmaW5lICAgICAgICAgICAgIEhPU1RfQ09VTlRfVElNRU9VVCAgMHg3ZmYgICAgICAvKiBIb3N0IFRpbWVvdXQgY291bnQgKi8KLQotLyogQml0IG1hc2tzIGZvciBTRUNVUkVfU1lTU1dUICovCi0KLSNkZWZpbmUgICAgICAgICAgICAgICAgICAgRU1VREFCTCAgMHgxICAgICAgICAvKiBFbXVsYXRpb24gRGlzYWJsZS4gKi8KLSNkZWZpbmUgICAgICAgICAgICAgICAgICBuRU1VREFCTCAgMHgwCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgIFJTVERBQkwgIDB4MiAgICAgICAgLyogUmVzZXQgRGlzYWJsZSAqLwotI2RlZmluZSAgICAgICAgICAgICAgICAgIG5SU1REQUJMICAweDAKLSNkZWZpbmUgICAgICAgICAgICAgICAgICAgTDFJREFCTCAgMHgxYyAgICAgICAvKiBMMSBJbnN0cnVjdGlvbiBNZW1vcnkgRGlzYWJsZS4gKi8KLSNkZWZpbmUgICAgICAgICAgICAgICAgICBMMURBREFCTCAgMHhlMCAgICAgICAvKiBMMSBEYXRhIEJhbmsgQSBNZW1vcnkgRGlzYWJsZS4gKi8KLSNkZWZpbmUgICAgICAgICAgICAgICAgICBMMURCREFCTCAgMHg3MDAgICAgICAvKiBMMSBEYXRhIEJhbmsgQiBNZW1vcnkgRGlzYWJsZS4gKi8KLSNkZWZpbmUgICAgICAgICAgICAgICAgICAgRE1BME9WUiAgMHg4MDAgICAgICAvKiBETUEwIE1lbW9yeSBBY2Nlc3MgT3ZlcnJpZGUgKi8KLSNkZWZpbmUgICAgICAgICAgICAgICAgICBuRE1BME9WUiAgMHgwCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgIERNQTFPVlIgIDB4MTAwMCAgICAgLyogRE1BMSBNZW1vcnkgQWNjZXNzIE92ZXJyaWRlICovCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgbkRNQTFPVlIgIDB4MAotI2RlZmluZSAgICAgICAgICAgICAgICAgICAgRU1VT1ZSICAweDQwMDAgICAgIC8qIEVtdWxhdGlvbiBPdmVycmlkZSAqLwotI2RlZmluZSAgICAgICAgICAgICAgICAgICBuRU1VT1ZSICAweDAKLSNkZWZpbmUgICAgICAgICAgICAgICAgICAgIE9UUFNFTiAgMHg4MDAwICAgICAvKiBPVFAgU2VjcmV0cyBFbmFibGUuICovCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgIG5PVFBTRU4gIDB4MAotI2RlZmluZSAgICAgICAgICAgICAgICAgICAgTDJEQUJMICAweDcwMDAwICAgIC8qIEwyIE1lbW9yeSBEaXNhYmxlLiAqLwotCi0vKiBCaXQgbWFza3MgZm9yIFNFQ1VSRV9DT05UUk9MICovCi0KLSNkZWZpbmUgICAgICAgICAgICAgICAgICAgU0VDVVJFMCAgMHgxICAgICAgICAvKiBTRUNVUkUgMCAqLwotI2RlZmluZSAgICAgICAgICAgICAgICAgIG5TRUNVUkUwICAweDAKLSNkZWZpbmUgICAgICAgICAgICAgICAgICAgU0VDVVJFMSAgMHgyICAgICAgICAvKiBTRUNVUkUgMSAqLwotI2RlZmluZSAgICAgICAgICAgICAgICAgIG5TRUNVUkUxICAweDAKLSNkZWZpbmUgICAgICAgICAgICAgICAgICAgU0VDVVJFMiAgMHg0ICAgICAgICAvKiBTRUNVUkUgMiAqLwotI2RlZmluZSAgICAgICAgICAgICAgICAgIG5TRUNVUkUyICAweDAKLSNkZWZpbmUgICAgICAgICAgICAgICAgICAgU0VDVVJFMyAgMHg4ICAgICAgICAvKiBTRUNVUkUgMyAqLwotI2RlZmluZSAgICAgICAgICAgICAgICAgIG5TRUNVUkUzICAweDAKLQotLyogQml0IG1hc2tzIGZvciBTRUNVUkVfU1RBVFVTICovCi0KLSNkZWZpbmUgICAgICAgICAgICAgICAgICAgU0VDTU9ERSAgMHgzICAgICAgICAvKiBTZWN1cmVkIE1vZGUgQ29udHJvbCBTdGF0ZSAqLwotI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgTk1JICAweDQgICAgICAgIC8qIE5vbiBNYXNrYWJsZSBJbnRlcnJ1cHQgKi8KLSNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgbk5NSSAgMHgwCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgIEFGVkFMSUQgIDB4OCAgICAgICAgLyogQXV0aGVudGljYXRpb24gRmlybXdhcmUgVmFsaWQgKi8KLSNkZWZpbmUgICAgICAgICAgICAgICAgICBuQUZWQUxJRCAgMHgwCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgICBBRkVYSVQgIDB4MTAgICAgICAgLyogQXV0aGVudGljYXRpb24gRmlybXdhcmUgRXhpdCAqLwotI2RlZmluZSAgICAgICAgICAgICAgICAgICBuQUZFWElUICAweDAKLSNkZWZpbmUgICAgICAgICAgICAgICAgICAgU0VDU1RBVCAgMHhlMCAgICAgICAvKiBTZWN1cmUgU3RhdHVzICovCi0KLSNlbmRpZiAvKiBfREVGX0JGNTJYX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9pbmNsdWRlL21hY2gvZ3Bpby5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2luY2x1ZGUvbWFjaC9ncGlvLmgKaW5kZXggZjgwYzI5OS4uZmJhNjA2YiAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2luY2x1ZGUvbWFjaC9ncGlvLmgKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2luY2x1ZGUvbWFjaC9ncGlvLmgKQEAgLTYyLDQgKzYyLDggQEAKICNkZWZpbmUgUE9SVF9HIEdQSU9fUEcwCiAjZGVmaW5lIFBPUlRfSCBHUElPX1BIMAogCisjaW5jbHVkZSA8bWFjaC1jb21tb24vcG9ydHMtZi5oPgorI2luY2x1ZGUgPG1hY2gtY29tbW9uL3BvcnRzLWcuaD4KKyNpbmNsdWRlIDxtYWNoLWNvbW1vbi9wb3J0cy1oLmg+CisKICNlbmRpZiAvKiBfTUFDSF9HUElPX0hfICovCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvaW5jbHVkZS9tYWNoL3BsbC5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2luY2x1ZGUvbWFjaC9wbGwuaAppbmRleCAyNGYxZDdjLi45NGNjYTY3IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvaW5jbHVkZS9tYWNoL3BsbC5oCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9pbmNsdWRlL21hY2gvcGxsLmgKQEAgLTEsNjMgKzEgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwNy0yMDA4IEFuYWxvZyBEZXZpY2VzIEluYy4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIKLSAqLwotCi0jaWZuZGVmIF9NQUNIX1BMTF9ICi0jZGVmaW5lIF9NQUNIX1BMTF9ICi0KLSNpbmNsdWRlIDxhc20vYmxhY2tmaW4uaD4KLSNpbmNsdWRlIDxhc20vaXJxZmxhZ3MuaD4KLQotLyogV3JpdGluZyB0byBQTExfQ1RMIGluaXRpYXRlcyBhIFBMTCByZWxvY2sgc2VxdWVuY2UuICovCi1zdGF0aWMgX19pbmxpbmVfXyB2b2lkIGJmaW5fd3JpdGVfUExMX0NUTCh1bnNpZ25lZCBpbnQgdmFsKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIGl3cjAsIGl3cjE7Ci0KLQlpZiAodmFsID09IGJmaW5fcmVhZF9QTExfQ1RMKCkpCi0JCXJldHVybjsKLQotCWZsYWdzID0gaGFyZF9sb2NhbF9pcnFfc2F2ZSgpOwotCS8qIEVuYWJsZSB0aGUgUExMIFdha2V1cCBiaXQgaW4gU0lDIElXUiAqLwotCWl3cjAgPSBiZmluX3JlYWQzMihTSUNfSVdSMCk7Ci0JaXdyMSA9IGJmaW5fcmVhZDMyKFNJQ19JV1IxKTsKLQkvKiBPbmx5IGFsbG93IFBQTCBXYWtldXApICovCi0JYmZpbl93cml0ZTMyKFNJQ19JV1IwLCBJV1JfRU5BQkxFKDApKTsKLQliZmluX3dyaXRlMzIoU0lDX0lXUjEsIDApOwotCi0JYmZpbl93cml0ZTE2KFBMTF9DVEwsIHZhbCk7Ci0JU1NZTkMoKTsKLQlhc20oIklETEU7Iik7Ci0KLQliZmluX3dyaXRlMzIoU0lDX0lXUjAsIGl3cjApOwotCWJmaW5fd3JpdGUzMihTSUNfSVdSMSwgaXdyMSk7Ci0JaGFyZF9sb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci19Ci0KLS8qIFdyaXRpbmcgdG8gVlJfQ1RMIGluaXRpYXRlcyBhIFBMTCByZWxvY2sgc2VxdWVuY2UuICovCi1zdGF0aWMgX19pbmxpbmVfXyB2b2lkIGJmaW5fd3JpdGVfVlJfQ1RMKHVuc2lnbmVkIGludCB2YWwpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFncywgaXdyMCwgaXdyMTsKLQotCWlmICh2YWwgPT0gYmZpbl9yZWFkX1ZSX0NUTCgpKQotCQlyZXR1cm47Ci0KLQlmbGFncyA9IGhhcmRfbG9jYWxfaXJxX3NhdmUoKTsKLQkvKiBFbmFibGUgdGhlIFBMTCBXYWtldXAgYml0IGluIFNJQyBJV1IgKi8KLQlpd3IwID0gYmZpbl9yZWFkMzIoU0lDX0lXUjApOwotCWl3cjEgPSBiZmluX3JlYWQzMihTSUNfSVdSMSk7Ci0JLyogT25seSBhbGxvdyBQUEwgV2FrZXVwKSAqLwotCWJmaW5fd3JpdGUzMihTSUNfSVdSMCwgSVdSX0VOQUJMRSgwKSk7Ci0JYmZpbl93cml0ZTMyKFNJQ19JV1IxLCAwKTsKLQotCWJmaW5fd3JpdGUxNihWUl9DVEwsIHZhbCk7Ci0JU1NZTkMoKTsKLQlhc20oIklETEU7Iik7Ci0KLQliZmluX3dyaXRlMzIoU0lDX0lXUjAsIGl3cjApOwotCWJmaW5fd3JpdGUzMihTSUNfSVdSMSwgaXdyMSk7Ci0JaGFyZF9sb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci19Ci0KLSNlbmRpZiAvKiBfTUFDSF9QTExfSCAqLworI2luY2x1ZGUgPG1hY2gtY29tbW9uL3BsbC5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2JvYXJkcy9IODYwNi5jIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2JvYXJkcy9IODYwNi5jCmluZGV4IDJjZTdiMTYuLmQ0YmZjZWEgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9ib2FyZHMvSDg2MDYuYworKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvYm9hcmRzL0g4NjA2LmMKQEAgLTI4Niw3ICsyODYsNyBAQAogCX0sCiB9OwogCi11bnNpZ25lZCBzaG9ydCBiZmluX3VhcnQwX3BlcmlwaGVyYWxzW10gPSB7CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgYmZpbl91YXJ0MF9wZXJpcGhlcmFsc1tdID0gewogCVBfVUFSVDBfVFgsIFBfVUFSVDBfUlgsIDAKIH07CiAKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9ib2FyZHMvYmxhY2tzdGFtcC5jIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2JvYXJkcy9ibGFja3N0YW1wLmMKaW5kZXggMjBjMTAyMi4uODdiNWFmMyAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2JvYXJkcy9ibGFja3N0YW1wLmMKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2JvYXJkcy9ibGFja3N0YW1wLmMKQEAgLTI1LDcgKzI1LDYgQEAKICNpbmNsdWRlIDxhc20vYmZpbjV4eF9zcGkuaD4KICNpbmNsdWRlIDxhc20vcG9ydG11eC5oPgogI2luY2x1ZGUgPGFzbS9kcG1jLmg+Ci0jaW5jbHVkZSA8bWFjaC9maW9fZmxhZy5oPgogCiAvKgogICogTmFtZSB0aGUgQm9hcmQgZm9yIHRoZSAvcHJvYy9jcHVpbmZvCkBAIC0yMjUsNyArMjI0LDcgQEAKIAl9LAogfTsKIAotdW5zaWduZWQgc2hvcnQgYmZpbl91YXJ0MF9wZXJpcGhlcmFsc1tdID0geworc3RhdGljIHVuc2lnbmVkIHNob3J0IGJmaW5fdWFydDBfcGVyaXBoZXJhbHNbXSA9IHsKIAlQX1VBUlQwX1RYLCBQX1VBUlQwX1JYLCAwCiB9OwogCkBAIC0yOTAsOSArMjg5LDkgQEAKIAl9LAogfTsKIAotdW5zaWduZWQgc2hvcnQgYmZpbl9zcG9ydDBfcGVyaXBoZXJhbHNbXSA9IHsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBiZmluX3Nwb3J0MF9wZXJpcGhlcmFsc1tdID0gewogCVBfU1BPUlQwX1RGUywgUF9TUE9SVDBfRFRQUkksIFBfU1BPUlQwX1RTQ0xLLCBQX1NQT1JUMF9SRlMsCi0JUF9TUE9SVDBfRFJQUkksIFBfU1BPUlQwX1JTQ0xLLCBQX1NQT1JUMF9EUlNFQywgUF9TUE9SVDBfRFRTRUMsIDAKKwlQX1NQT1JUMF9EUlBSSSwgUF9TUE9SVDBfUlNDTEssIDAKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGJmaW5fc3BvcnQwX3VhcnRfZGV2aWNlID0gewpAQCAtMzI0LDkgKzMyMyw5IEBACiAJfSwKIH07CiAKLXVuc2lnbmVkIHNob3J0IGJmaW5fc3BvcnQxX3BlcmlwaGVyYWxzW10gPSB7CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgYmZpbl9zcG9ydDFfcGVyaXBoZXJhbHNbXSA9IHsKIAlQX1NQT1JUMV9URlMsIFBfU1BPUlQxX0RUUFJJLCBQX1NQT1JUMV9UU0NMSywgUF9TUE9SVDFfUkZTLAotCVBfU1BPUlQxX0RSUFJJLCBQX1NQT1JUMV9SU0NMSywgUF9TUE9SVDFfRFJTRUMsIFBfU1BPUlQxX0RUU0VDLCAwCisJUF9TUE9SVDFfRFJQUkksIFBfU1BPUlQxX1JTQ0xLLCAwCiB9OwogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZmluX3Nwb3J0MV91YXJ0X2RldmljZSA9IHsKQEAgLTQ3NiwxMCArNDc1LDE2IEBACiAJCXJldHVybiByZXQ7CiAKICNpZiBkZWZpbmVkKENPTkZJR19TTUM5MVgpIHx8IGRlZmluZWQoQ09ORklHX1NNQzkxWF9NT0RVTEUpCi0JLyogc2V0dXAgQkY1MzNfU1RBTVAgQ1BMRCB0byByb3V0ZSBBTVMzIHRvIEV0aGVybmV0IE1BQyAqLwotCWJmaW5fd3JpdGVfRklPX0RJUihiZmluX3JlYWRfRklPX0RJUigpIHwgUEYwKTsKLQliZmluX3dyaXRlX0ZJT19GTEFHX1MoUEYwKTsKLQlTU1lOQygpOworCS8qCisJICogc2V0dXAgQkY1MzNfU1RBTVAgQ1BMRCB0byByb3V0ZSBBTVMzIHRvIEV0aGVybmV0IE1BQy4KKwkgKiB0aGUgYmZpbi1hc3luYy1tYXAgZHJpdmVyIHRha2VzIGNhcmUgb2YgZmxpcHBpbmcgYmV0d2VlbgorCSAqIGZsYXNoIGFuZCBldGhlcm5ldCB3aGVuIG5lY2Vzc2FyeS4KKwkgKi8KKwlyZXQgPSBncGlvX3JlcXVlc3QoR1BJT19QRjAsICJlbmV0X2NwbGQiKTsKKwlpZiAoIXJldCkgeworCQlncGlvX2RpcmVjdGlvbl9vdXRwdXQoR1BJT19QRjAsIDEpOworCQlncGlvX2ZyZWUoR1BJT19QRjApOworCX0KICNlbmRpZgogCiAJc3BpX3JlZ2lzdGVyX2JvYXJkX2luZm8oYmZpbl9zcGlfYm9hcmRfaW5mbywgQVJSQVlfU0laRShiZmluX3NwaV9ib2FyZF9pbmZvKSk7CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvYm9hcmRzL2NtX2JmNTMzLmMgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvYm9hcmRzL2NtX2JmNTMzLmMKaW5kZXggYWRiZTYyYS4uNGQ1NjA0ZSAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2JvYXJkcy9jbV9iZjUzMy5jCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9ib2FyZHMvY21fYmY1MzMuYwpAQCAtMjcxLDcgKzI3MSw3IEBACiAJfSwKIH07CiAKLXVuc2lnbmVkIHNob3J0IGJmaW5fdWFydDBfcGVyaXBoZXJhbHNbXSA9IHsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBiZmluX3VhcnQwX3BlcmlwaGVyYWxzW10gPSB7CiAJUF9VQVJUMF9UWCwgUF9VQVJUMF9SWCwgMAogfTsKIApAQCAtMzM2LDkgKzMzNiw5IEBACiAJfSwKIH07CiAKLXVuc2lnbmVkIHNob3J0IGJmaW5fc3BvcnQwX3BlcmlwaGVyYWxzW10gPSB7CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgYmZpbl9zcG9ydDBfcGVyaXBoZXJhbHNbXSA9IHsKIAlQX1NQT1JUMF9URlMsIFBfU1BPUlQwX0RUUFJJLCBQX1NQT1JUMF9UU0NMSywgUF9TUE9SVDBfUkZTLAotCVBfU1BPUlQwX0RSUFJJLCBQX1NQT1JUMF9SU0NMSywgUF9TUE9SVDBfRFJTRUMsIFBfU1BPUlQwX0RUU0VDLCAwCisJUF9TUE9SVDBfRFJQUkksIFBfU1BPUlQwX1JTQ0xLLCAwCiB9OwogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZmluX3Nwb3J0MF91YXJ0X2RldmljZSA9IHsKQEAgLTM3MCw5ICszNzAsOSBAQAogCX0sCiB9OwogCi11bnNpZ25lZCBzaG9ydCBiZmluX3Nwb3J0MV9wZXJpcGhlcmFsc1tdID0geworc3RhdGljIHVuc2lnbmVkIHNob3J0IGJmaW5fc3BvcnQxX3BlcmlwaGVyYWxzW10gPSB7CiAJUF9TUE9SVDFfVEZTLCBQX1NQT1JUMV9EVFBSSSwgUF9TUE9SVDFfVFNDTEssIFBfU1BPUlQxX1JGUywKLQlQX1NQT1JUMV9EUlBSSSwgUF9TUE9SVDFfUlNDTEssIFBfU1BPUlQxX0RSU0VDLCBQX1NQT1JUMV9EVFNFQywgMAorCVBfU1BPUlQxX0RSUFJJLCBQX1NQT1JUMV9SU0NMSywgMAogfTsKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYmZpbl9zcG9ydDFfdWFydF9kZXZpY2UgPSB7CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvYm9hcmRzL2V6a2l0LmMgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvYm9hcmRzL2V6a2l0LmMKaW5kZXggYTFjYjhlNy4uYjY3YjkxZCAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2JvYXJkcy9lemtpdC5jCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9ib2FyZHMvZXpraXQuYwpAQCAtMzQ5LDcgKzM0OSw3IEBACiAJfSwKIH07CiAKLXVuc2lnbmVkIHNob3J0IGJmaW5fdWFydDBfcGVyaXBoZXJhbHNbXSA9IHsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBiZmluX3VhcnQwX3BlcmlwaGVyYWxzW10gPSB7CiAJUF9VQVJUMF9UWCwgUF9VQVJUMF9SWCwgMAogfTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2JvYXJkcy9pcDB4LmMgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvYm9hcmRzL2lwMHguYwppbmRleCA1YmE0YjAyLi5mODY5YTM3IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvYm9hcmRzL2lwMHguYworKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvYm9hcmRzL2lwMHguYwpAQCAtMjIsNyArMjIsNiBAQAogI2luY2x1ZGUgPGFzbS9kbWEuaD4KICNpbmNsdWRlIDxhc20vYmZpbjV4eF9zcGkuaD4KICNpbmNsdWRlIDxhc20vcG9ydG11eC5oPgotI2luY2x1ZGUgPG1hY2gvZmlvX2ZsYWcuaD4KIAogLyoKICAqIE5hbWUgdGhlIEJvYXJkIGZvciB0aGUgL3Byb2MvY3B1aW5mbwpAQCAtMTc0LDcgKzE3Myw3IEBACiAJfSwKIH07CiAKLXVuc2lnbmVkIHNob3J0IGJmaW5fdWFydDBfcGVyaXBoZXJhbHNbXSA9IHsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBiZmluX3VhcnQwX3BlcmlwaGVyYWxzW10gPSB7CiAJUF9VQVJUMF9UWCwgUF9VQVJUMF9SWCwgMAogfTsKIApAQCAtMjk1LDE1ICsyOTQsNyBAQAogCXByaW50ayhLRVJOX0lORk8gIiVzKCk6IHJlZ2lzdGVyaW5nIGRldmljZSByZXNvdXJjZXNcbiIsIF9fZnVuY19fKTsKIAlwbGF0Zm9ybV9hZGRfZGV2aWNlcyhpcDB4X2RldmljZXMsIEFSUkFZX1NJWkUoaXAweF9kZXZpY2VzKSk7CiAKLSNpZiBkZWZpbmVkKENPTkZJR19TUElfQkZJTikgfHwgZGVmaW5lZChDT05GSUdfU1BJX0JGSU5fTU9EVUxFKQotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGJmaW5fc3BpX2JvYXJkX2luZm8pOyArK2kpIHsKLQkJaW50IGogPSAxIDw8IGJmaW5fc3BpX2JvYXJkX2luZm9baV0uY2hpcF9zZWxlY3Q7Ci0JCS8qIHNldCBzcGkgY3MgdG8gMSAqLwotCQliZmluX3dyaXRlX0ZJT19ESVIoYmZpbl9yZWFkX0ZJT19ESVIoKSB8IGopOwotCQliZmluX3dyaXRlX0ZJT19GTEFHX1Moaik7Ci0JfQogCXNwaV9yZWdpc3Rlcl9ib2FyZF9pbmZvKGJmaW5fc3BpX2JvYXJkX2luZm8sIEFSUkFZX1NJWkUoYmZpbl9zcGlfYm9hcmRfaW5mbykpOwotI2VuZGlmCiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9ib2FyZHMvc3RhbXAuYyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9ib2FyZHMvc3RhbXAuYwppbmRleCBiM2IxY2RlLi40MzIyNGVmIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvYm9hcmRzL3N0YW1wLmMKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2JvYXJkcy9zdGFtcC5jCkBAIC0yNCw3ICsyNCw2IEBACiAjaW5jbHVkZSA8YXNtL3JlYm9vdC5oPgogI2luY2x1ZGUgPGFzbS9wb3J0bXV4Lmg+CiAjaW5jbHVkZSA8YXNtL2RwbWMuaD4KLSNpbmNsdWRlIDxtYWNoL2Zpb19mbGFnLmg+CiAKIC8qCiAgKiBOYW1lIHRoZSBCb2FyZCBmb3IgdGhlIC9wcm9jL2NwdWluZm8KQEAgLTM1NCw3ICszNTMsNyBAQAogCX0sCiB9OwogCi11bnNpZ25lZCBzaG9ydCBiZmluX3VhcnQwX3BlcmlwaGVyYWxzW10gPSB7CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgYmZpbl91YXJ0MF9wZXJpcGhlcmFsc1tdID0gewogCVBfVUFSVDBfVFgsIFBfVUFSVDBfUlgsIDAKIH07CiAKQEAgLTQxOSw5ICs0MTgsOSBAQAogCX0sCiB9OwogCi11bnNpZ25lZCBzaG9ydCBiZmluX3Nwb3J0MF9wZXJpcGhlcmFsc1tdID0geworc3RhdGljIHVuc2lnbmVkIHNob3J0IGJmaW5fc3BvcnQwX3BlcmlwaGVyYWxzW10gPSB7CiAJUF9TUE9SVDBfVEZTLCBQX1NQT1JUMF9EVFBSSSwgUF9TUE9SVDBfVFNDTEssIFBfU1BPUlQwX1JGUywKLQlQX1NQT1JUMF9EUlBSSSwgUF9TUE9SVDBfUlNDTEssIFBfU1BPUlQwX0RSU0VDLCBQX1NQT1JUMF9EVFNFQywgMAorCVBfU1BPUlQwX0RSUFJJLCBQX1NQT1JUMF9SU0NMSywgMAogfTsKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYmZpbl9zcG9ydDBfdWFydF9kZXZpY2UgPSB7CkBAIC00NTMsOSArNDUyLDkgQEAKIAl9LAogfTsKIAotdW5zaWduZWQgc2hvcnQgYmZpbl9zcG9ydDFfcGVyaXBoZXJhbHNbXSA9IHsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBiZmluX3Nwb3J0MV9wZXJpcGhlcmFsc1tdID0gewogCVBfU1BPUlQxX1RGUywgUF9TUE9SVDFfRFRQUkksIFBfU1BPUlQxX1RTQ0xLLCBQX1NQT1JUMV9SRlMsCi0JUF9TUE9SVDFfRFJQUkksIFBfU1BPUlQxX1JTQ0xLLCBQX1NQT1JUMV9EUlNFQywgUF9TUE9SVDFfRFRTRUMsIDAKKwlQX1NQT1JUMV9EUlBSSSwgUF9TUE9SVDFfUlNDTEssIDAKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGJmaW5fc3BvcnQxX3VhcnRfZGV2aWNlID0gewpAQCAtNjc0LDEwICs2NzMsMTYgQEAKIAkJcmV0dXJuIHJldDsKIAogI2lmIGRlZmluZWQoQ09ORklHX1NNQzkxWCkgfHwgZGVmaW5lZChDT05GSUdfU01DOTFYX01PRFVMRSkKLQkvKiBzZXR1cCBCRjUzM19TVEFNUCBDUExEIHRvIHJvdXRlIEFNUzMgdG8gRXRoZXJuZXQgTUFDICovCi0JYmZpbl93cml0ZV9GSU9fRElSKGJmaW5fcmVhZF9GSU9fRElSKCkgfCBQRjApOwotCWJmaW5fd3JpdGVfRklPX0ZMQUdfUyhQRjApOwotCVNTWU5DKCk7CisJLyoKKwkgKiBzZXR1cCBCRjUzM19TVEFNUCBDUExEIHRvIHJvdXRlIEFNUzMgdG8gRXRoZXJuZXQgTUFDLgorCSAqIHRoZSBiZmluLWFzeW5jLW1hcCBkcml2ZXIgdGFrZXMgY2FyZSBvZiBmbGlwcGluZyBiZXR3ZWVuCisJICogZmxhc2ggYW5kIGV0aGVybmV0IHdoZW4gbmVjZXNzYXJ5LgorCSAqLworCXJldCA9IGdwaW9fcmVxdWVzdChHUElPX1BGMCwgImVuZXRfY3BsZCIpOworCWlmICghcmV0KSB7CisJCWdwaW9fZGlyZWN0aW9uX291dHB1dChHUElPX1BGMCwgMSk7CisJCWdwaW9fZnJlZShHUElPX1BGMCk7CisJfQogI2VuZGlmCiAKIAlzcGlfcmVnaXN0ZXJfYm9hcmRfaW5mbyhiZmluX3NwaV9ib2FyZF9pbmZvLCBBUlJBWV9TSVpFKGJmaW5fc3BpX2JvYXJkX2luZm8pKTsKQEAgLTcxMyw3ICs3MTgsNiBAQAogdm9pZCBuYXRpdmVfbWFjaGluZV9yZXN0YXJ0KGNoYXIgKmNtZCkKIHsKIAkvKiB3b3JrYXJvdW5kIHB1bGwgdXAgb24gY3BsZCAvIGZsYXNoIHBpbiBub3QgYmVpbmcgc3Ryb25nIGVub3VnaCAqLwotCWJmaW5fd3JpdGVfRklPX0lORU4oflBGMCk7Ci0JYmZpbl93cml0ZV9GSU9fRElSKFBGMCk7Ci0JYmZpbl93cml0ZV9GSU9fRkxBR19DKFBGMCk7CisJZ3Bpb19yZXF1ZXN0KEdQSU9fUEYwLCAiZmxhc2hfY3BsZCIpOworCWdwaW9fZGlyZWN0aW9uX291dHB1dChHUElPX1BGMCwgMCk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvZG1hLmMgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvZG1hLmMKaW5kZXggNGExNGE0Ni4uMWY1OTg4ZCAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2RtYS5jCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9kbWEuYwpAQCAtMTEsNyArMTEsNyBAQAogI2luY2x1ZGUgPGFzbS9ibGFja2Zpbi5oPgogI2luY2x1ZGUgPGFzbS9kbWEuaD4KIAotc3RydWN0IGRtYV9yZWdpc3RlciAqZG1hX2lvX2Jhc2VfYWRkcltNQVhfRE1BX0NIQU5ORUxTXSA9IHsKK3N0cnVjdCBkbWFfcmVnaXN0ZXIgKiBjb25zdCBkbWFfaW9fYmFzZV9hZGRyW01BWF9ETUFfQ0hBTk5FTFNdID0gewogCShzdHJ1Y3QgZG1hX3JlZ2lzdGVyICopIERNQTBfTkVYVF9ERVNDX1BUUiwKIAkoc3RydWN0IGRtYV9yZWdpc3RlciAqKSBETUExX05FWFRfREVTQ19QVFIsCiAJKHN0cnVjdCBkbWFfcmVnaXN0ZXIgKikgRE1BMl9ORVhUX0RFU0NfUFRSLApkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2luY2x1ZGUvbWFjaC9iZmluX3NlcmlhbC5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2luY2x1ZGUvbWFjaC9iZmluX3NlcmlhbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4MDcyYzgKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvaW5jbHVkZS9tYWNoL2JmaW5fc2VyaWFsLmgKQEAgLTAsMCArMSwxNCBAQAorLyoKKyAqIG1hY2gvYmZpbl9zZXJpYWwuaCAtIEJsYWNrZmluIFVBUlQvU2VyaWFsIGRlZmluaXRpb25zCisgKgorICogQ29weXJpZ2h0IDIwMDYtMjAxMCBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgorICovCisKKyNpZm5kZWYgX19CRklOX01BQ0hfU0VSSUFMX0hfXworI2RlZmluZSBfX0JGSU5fTUFDSF9TRVJJQUxfSF9fCisKKyNkZWZpbmUgQkZJTl9VQVJUX05SX1BPUlRTCTEKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvaW5jbHVkZS9tYWNoL2JmaW5fc2VyaWFsXzV4eC5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2luY2x1ZGUvbWFjaC9iZmluX3NlcmlhbF81eHguaAppbmRleCA5ZTFmM2RlLi40NWRjYWE0IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvaW5jbHVkZS9tYWNoL2JmaW5fc2VyaWFsXzV4eC5oCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9pbmNsdWRlL21hY2gvYmZpbl9zZXJpYWxfNXh4LmgKQEAgLTQsMzYgKzQsOSBAQAogICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyCiAgKi8KIAotI2luY2x1ZGUgPGxpbnV4L3NlcmlhbC5oPgogI2luY2x1ZGUgPGFzbS9kbWEuaD4KICNpbmNsdWRlIDxhc20vcG9ydG11eC5oPgogCi0jZGVmaW5lIFVBUlRfR0VUX0NIQVIodWFydCkgICAgIGJmaW5fcmVhZDE2KCgodWFydCktPnBvcnQubWVtYmFzZSArIE9GRlNFVF9SQlIpKQotI2RlZmluZSBVQVJUX0dFVF9ETEwodWFydCkJYmZpbl9yZWFkMTYoKCh1YXJ0KS0+cG9ydC5tZW1iYXNlICsgT0ZGU0VUX0RMTCkpCi0jZGVmaW5lIFVBUlRfR0VUX0lFUih1YXJ0KSAgICAgIGJmaW5fcmVhZDE2KCgodWFydCktPnBvcnQubWVtYmFzZSArIE9GRlNFVF9JRVIpKQotI2RlZmluZSBVQVJUX0dFVF9ETEgodWFydCkJYmZpbl9yZWFkMTYoKCh1YXJ0KS0+cG9ydC5tZW1iYXNlICsgT0ZGU0VUX0RMSCkpCi0jZGVmaW5lIFVBUlRfR0VUX0lJUih1YXJ0KSAgICAgIGJmaW5fcmVhZDE2KCgodWFydCktPnBvcnQubWVtYmFzZSArIE9GRlNFVF9JSVIpKQotI2RlZmluZSBVQVJUX0dFVF9MQ1IodWFydCkgICAgICBiZmluX3JlYWQxNigoKHVhcnQpLT5wb3J0Lm1lbWJhc2UgKyBPRkZTRVRfTENSKSkKLSNkZWZpbmUgVUFSVF9HRVRfR0NUTCh1YXJ0KSAgICAgYmZpbl9yZWFkMTYoKCh1YXJ0KS0+cG9ydC5tZW1iYXNlICsgT0ZGU0VUX0dDVEwpKQotCi0jZGVmaW5lIFVBUlRfUFVUX0NIQVIodWFydCx2KSAgIGJmaW5fd3JpdGUxNigoKHVhcnQpLT5wb3J0Lm1lbWJhc2UgKyBPRkZTRVRfVEhSKSx2KQotI2RlZmluZSBVQVJUX1BVVF9ETEwodWFydCx2KSAgICBiZmluX3dyaXRlMTYoKCh1YXJ0KS0+cG9ydC5tZW1iYXNlICsgT0ZGU0VUX0RMTCksdikKLSNkZWZpbmUgVUFSVF9QVVRfSUVSKHVhcnQsdikgICAgYmZpbl93cml0ZTE2KCgodWFydCktPnBvcnQubWVtYmFzZSArIE9GRlNFVF9JRVIpLHYpCi0jZGVmaW5lIFVBUlRfU0VUX0lFUih1YXJ0LHYpICAgIFVBUlRfUFVUX0lFUih1YXJ0LCBVQVJUX0dFVF9JRVIodWFydCkgfCAodikpCi0jZGVmaW5lIFVBUlRfQ0xFQVJfSUVSKHVhcnQsdikgIFVBUlRfUFVUX0lFUih1YXJ0LCBVQVJUX0dFVF9JRVIodWFydCkgJiB+KHYpKQotI2RlZmluZSBVQVJUX1BVVF9ETEgodWFydCx2KSAgICBiZmluX3dyaXRlMTYoKCh1YXJ0KS0+cG9ydC5tZW1iYXNlICsgT0ZGU0VUX0RMSCksdikKLSNkZWZpbmUgVUFSVF9QVVRfTENSKHVhcnQsdikgICAgYmZpbl93cml0ZTE2KCgodWFydCktPnBvcnQubWVtYmFzZSArIE9GRlNFVF9MQ1IpLHYpCi0jZGVmaW5lIFVBUlRfUFVUX0dDVEwodWFydCx2KSAgIGJmaW5fd3JpdGUxNigoKHVhcnQpLT5wb3J0Lm1lbWJhc2UgKyBPRkZTRVRfR0NUTCksdikKLQotI2RlZmluZSBVQVJUX1NFVF9ETEFCKHVhcnQpICAgICBkbyB7IFVBUlRfUFVUX0xDUih1YXJ0LCBVQVJUX0dFVF9MQ1IodWFydCkgfCBETEFCKTsgU1NZTkMoKTsgfSB3aGlsZSAoMCkKLSNkZWZpbmUgVUFSVF9DTEVBUl9ETEFCKHVhcnQpICAgZG8geyBVQVJUX1BVVF9MQ1IodWFydCwgVUFSVF9HRVRfTENSKHVhcnQpICYgfkRMQUIpOyBTU1lOQygpOyB9IHdoaWxlICgwKQotCi0jZGVmaW5lIFVBUlRfR0VUX0NUUyh4KSBncGlvX2dldF92YWx1ZSh4LT5jdHNfcGluKQotI2RlZmluZSBVQVJUX0RJU0FCTEVfUlRTKHgpIGdwaW9fc2V0X3ZhbHVlKHgtPnJ0c19waW4sIDEpCi0jZGVmaW5lIFVBUlRfRU5BQkxFX1JUUyh4KSBncGlvX3NldF92YWx1ZSh4LT5ydHNfcGluLCAwKQotI2RlZmluZSBVQVJUX0VOQUJMRV9JTlRTKHgsIHYpIFVBUlRfUFVUX0lFUih4LCB2KQotI2RlZmluZSBVQVJUX0RJU0FCTEVfSU5UUyh4KSBVQVJUX1BVVF9JRVIoeCwgMCkKLQogI2lmZGVmIENPTkZJR19CRklOX1VBUlQwX0NUU1JUUwogIyBkZWZpbmUgQ09ORklHX1NFUklBTF9CRklOX0NUU1JUUwogIyBpZm5kZWYgQ09ORklHX1VBUlQwX0NUU19QSU4KQEAgLTQ0LDUxICsxNyw2IEBACiAjIGVuZGlmCiAjZW5kaWYKIAotI2RlZmluZSBCRklOX1VBUlRfVFhfRklGT19TSVpFCTIKLQotc3RydWN0IGJmaW5fc2VyaWFsX3BvcnQgewotICAgICAgICBzdHJ1Y3QgdWFydF9wb3J0ICAgICAgICBwb3J0OwotICAgICAgICB1bnNpZ25lZCBpbnQgICAgICAgICAgICBvbGRfc3RhdHVzOwotCWludAkJCXN0YXR1c19pcnE7Ci0JdW5zaWduZWQgaW50IGxzcjsKLSNpZmRlZiBDT05GSUdfU0VSSUFMX0JGSU5fRE1BCi0JaW50CQkJdHhfZG9uZTsKLQlpbnQJCQl0eF9jb3VudDsKLQlzdHJ1Y3QgY2lyY19idWYJCXJ4X2RtYV9idWY7Ci0Jc3RydWN0IHRpbWVyX2xpc3QgICAgICAgcnhfZG1hX3RpbWVyOwotCWludAkJCXJ4X2RtYV9ucm93czsKLQl1bnNpZ25lZCBpbnQJCXR4X2RtYV9jaGFubmVsOwotCXVuc2lnbmVkIGludAkJcnhfZG1hX2NoYW5uZWw7Ci0Jc3RydWN0IHdvcmtfc3RydWN0CXR4X2RtYV93b3JrcXVldWU7Ci0jZWxzZQotIyBpZiBBTk9NQUxZXzA1MDAwMzYzCi0JdW5zaWduZWQgaW50IGFub21hbHlfdGhyZXNob2xkOwotIyBlbmRpZgotI2VuZGlmCi0jaWZkZWYgQ09ORklHX1NFUklBTF9CRklOX0NUU1JUUwotCXN0cnVjdCB0aW1lcl9saXN0ICAgICAgIGN0c190aW1lcjsKLQlpbnQJCQljdHNfcGluOwotCWludAkJCXJ0c19waW47Ci0jZW5kaWYKLX07Ci0KLS8qIFRoZSBoYXJkd2FyZSBjbGVhcnMgdGhlIExTUiBiaXRzIHVwb24gcmVhZCwgc28gd2UgbmVlZCB0byBjYWNoZQotICogc29tZSBvZiB0aGUgbW9yZSBmdW4gYml0cyBpbiBzb2Z0d2FyZSBzbyB0aGV5IGRvbid0IGdldCBsb3N0Ci0gKiB3aGVuIGNoZWNraW5nIHRoZSBMU1IgaW4gb3RoZXIgY29kZSBwYXRocyAoVFgpLgotICovCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBVQVJUX0dFVF9MU1Ioc3RydWN0IGJmaW5fc2VyaWFsX3BvcnQgKnVhcnQpCi17Ci0JdW5zaWduZWQgaW50IGxzciA9IGJmaW5fcmVhZDE2KHVhcnQtPnBvcnQubWVtYmFzZSArIE9GRlNFVF9MU1IpOwotCXVhcnQtPmxzciB8PSAobHNyICYgKEJJfEZFfFBFfE9FKSk7Ci0JcmV0dXJuIGxzciB8IHVhcnQtPmxzcjsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIFVBUlRfQ0xFQVJfTFNSKHN0cnVjdCBiZmluX3NlcmlhbF9wb3J0ICp1YXJ0KQotewotCXVhcnQtPmxzciA9IDA7Ci0JYmZpbl93cml0ZTE2KHVhcnQtPnBvcnQubWVtYmFzZSArIE9GRlNFVF9MU1IsIC0xKTsKLX0KLQogc3RydWN0IGJmaW5fc2VyaWFsX3JlcyB7CiAJdW5zaWduZWQgbG9uZwl1YXJ0X2Jhc2VfYWRkcjsKIAlpbnQJCXVhcnRfaXJxOwpAQCAtMTIwLDMgKzQ4LDUgQEAKIH07CiAKICNkZWZpbmUgRFJJVkVSX05BTUUgImJmaW4tdWFydCIKKworI2luY2x1ZGUgPGFzbS9iZmluX3NlcmlhbC5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2luY2x1ZGUvbWFjaC9ibGFja2Zpbi5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2luY2x1ZGUvbWFjaC9ibGFja2Zpbi5oCmluZGV4IGY0YmQ2ZGYuLmUzNjYyMDcgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9pbmNsdWRlL21hY2gvYmxhY2tmaW4uaAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvaW5jbHVkZS9tYWNoL2JsYWNrZmluLmgKQEAgLTEsNyArMSw3IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDUtMjAwOSBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDEwIEFuYWxvZyBEZXZpY2VzIEluYy4KICAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KICAqLwogCiAjaWZuZGVmIF9NQUNIX0JMQUNLRklOX0hfCkBAIC0xMCwyNiArMTAsMTQgQEAKICNkZWZpbmUgQkY1MzNfRkFNSUxZCiAKICNpbmNsdWRlICJiZjUzMy5oIgotI2luY2x1ZGUgImRlZkJGNTMyLmgiCiAjaW5jbHVkZSAiYW5vbWFseS5oIgogCi0jaWYgIWRlZmluZWQoX19BU1NFTUJMWV9fKQotI2luY2x1ZGUgImNkZWZCRjUzMi5oIgorI2luY2x1ZGUgPGFzbS9kZWZfTFBCbGFja2Zpbi5oPgorI2luY2x1ZGUgImRlZkJGNTMyLmgiCisKKyNpZm5kZWYgX19BU1NFTUJMWV9fCisjIGluY2x1ZGUgPGFzbS9jZGVmX0xQQmxhY2tmaW4uaD4KKyMgaW5jbHVkZSAiY2RlZkJGNTMyLmgiCiAjZW5kaWYKIAotI2RlZmluZSBCRklOX1VBUlRfTlJfUE9SVFMgICAgICAxCi0KLSNkZWZpbmUgT0ZGU0VUX1RIUiAgICAgICAgICAgICAgMHgwMAkvKiBUcmFuc21pdCBIb2xkaW5nIHJlZ2lzdGVyICAgICAgICAgICAgKi8KLSNkZWZpbmUgT0ZGU0VUX1JCUiAgICAgICAgICAgICAgMHgwMAkvKiBSZWNlaXZlIEJ1ZmZlciByZWdpc3RlciAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgT0ZGU0VUX0RMTCAgICAgICAgICAgICAgMHgwMAkvKiBEaXZpc29yIExhdGNoIChMb3ctQnl0ZSkgICAgICAgICAgICAgKi8KLSNkZWZpbmUgT0ZGU0VUX0lFUiAgICAgICAgICAgICAgMHgwNAkvKiBJbnRlcnJ1cHQgRW5hYmxlIFJlZ2lzdGVyICAgICAgICAgICAgKi8KLSNkZWZpbmUgT0ZGU0VUX0RMSCAgICAgICAgICAgICAgMHgwNAkvKiBEaXZpc29yIExhdGNoIChIaWdoLUJ5dGUpICAgICAgICAgICAgKi8KLSNkZWZpbmUgT0ZGU0VUX0lJUiAgICAgICAgICAgICAgMHgwOAkvKiBJbnRlcnJ1cHQgSWRlbnRpZmljYXRpb24gUmVnaXN0ZXIgICAgKi8KLSNkZWZpbmUgT0ZGU0VUX0xDUiAgICAgICAgICAgICAgMHgwQwkvKiBMaW5lIENvbnRyb2wgUmVnaXN0ZXIgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgT0ZGU0VUX01DUiAgICAgICAgICAgICAgMHgxMAkvKiBNb2RlbSBDb250cm9sIFJlZ2lzdGVyICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgT0ZGU0VUX0xTUiAgICAgICAgICAgICAgMHgxNAkvKiBMaW5lIFN0YXR1cyBSZWdpc3RlciAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgT0ZGU0VUX01TUiAgICAgICAgICAgICAgMHgxOAkvKiBNb2RlbSBTdGF0dXMgUmVnaXN0ZXIgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgT0ZGU0VUX1NDUiAgICAgICAgICAgICAgMHgxQwkvKiBTQ1IgU2NyYXRjaCBSZWdpc3RlciAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgT0ZGU0VUX0dDVEwgICAgICAgICAgICAgMHgyNAkvKiBHbG9iYWwgQ29udHJvbCBSZWdpc3RlciAgICAgICAgICAgICAgKi8KLQotI2VuZGlmCQkJCS8qIF9NQUNIX0JMQUNLRklOX0hfICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9pbmNsdWRlL21hY2gvY2RlZkJGNTMyLmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvaW5jbHVkZS9tYWNoL2NkZWZCRjUzMi5oCmluZGV4IDQwMWU1MjQuLmZkMGNiZTQgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9pbmNsdWRlL21hY2gvY2RlZkJGNTMyLmgKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2luY2x1ZGUvbWFjaC9jZGVmQkY1MzIuaApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNS0yMDA4IEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqIENvcHlyaWdodCAyMDA1LTIwMTAgQW5hbG9nIERldmljZXMgSW5jLgogICoKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlcgogICovCkBAIC03LDkgKzcsNiBAQAogI2lmbmRlZiBfQ0RFRl9CRjUzMl9ICiAjZGVmaW5lIF9DREVGX0JGNTMyX0gKIAotLyppbmNsdWRlIGNvcmUgc3BlY2lmaWMgcmVnaXN0ZXIgcG9pbnRlciBkZWZpbml0aW9ucyovCi0jaW5jbHVkZSA8YXNtL2NkZWZfTFBCbGFja2Zpbi5oPgotCiAvKiBDbG9jayBhbmQgU3lzdGVtIENvbnRyb2wgKDB4RkZDMCAwNDAwLTB4RkZDMCAwN0ZGKSAqLwogI2RlZmluZSBiZmluX3JlYWRfUExMX0NUTCgpICAgICAgICAgICAgICAgICAgYmZpbl9yZWFkMTYoUExMX0NUTCkKICNkZWZpbmUgYmZpbl9yZWFkX1BMTF9TVEFUKCkgICAgICAgICAgICAgICAgIGJmaW5fcmVhZDE2KFBMTF9TVEFUKQpAQCAtNjYsMTYgKzYzLDEwIEBACiAjZGVmaW5lIGJmaW5fd3JpdGVfUlRDX1BSRU4odmFsKSAgICAgICAgICAgICBiZmluX3dyaXRlMTYoUlRDX1BSRU4sdmFsKQogCiAvKiBETUEgVHJhZmZpYyBjb250cm9scyAqLwotI2RlZmluZSBiZmluX3JlYWRfRE1BX1RDUEVSKCkgICAgICAgICAgICAgICAgYmZpbl9yZWFkMTYoRE1BX1RDUEVSKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQV9UQ1BFUih2YWwpICAgICAgICAgICAgYmZpbl93cml0ZTE2KERNQV9UQ1BFUix2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUFfVENDTlQoKSAgICAgICAgICAgICAgICBiZmluX3JlYWQxNihETUFfVENDTlQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BX1RDQ05UKHZhbCkgICAgICAgICAgICBiZmluX3dyaXRlMTYoRE1BX1RDQ05ULHZhbCkKLQotLyogQWx0ZXJuYXRlIGRlcHJlY2F0ZWQgcmVnaXN0ZXIgbmFtZXMgKGJlbG93KSBwcm92aWRlZCBmb3IgYmFja3dhcmRzIGNvZGUgY29tcGF0aWJpbGl0eSAqLwotI2RlZmluZSBiZmluX3JlYWRfRE1BX1RDX1BFUigpICAgICAgICAgICAgICAgYmZpbl9yZWFkMTYoRE1BX1RDX1BFUikKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUFfVENfUEVSKHZhbCkgICAgICAgICAgIGJmaW5fd3JpdGUxNihETUFfVENfUEVSLHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQV9UQ19DTlQoKSAgICAgICAgICAgICAgIGJmaW5fcmVhZDE2KERNQV9UQ19DTlQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BX1RDX0NOVCh2YWwpICAgICAgICAgICBiZmluX3dyaXRlMTYoRE1BX1RDX0NOVCx2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUFDX1RDX1BFUigpICAgICAgICAgICAgICBiZmluX3JlYWQxNihETUFDX1RDX1BFUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUFDX1RDX1BFUih2YWwpICAgICAgICAgIGJmaW5fd3JpdGUxNihETUFDX1RDX1BFUix2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUFDX1RDX0NOVCgpICAgICAgICAgICAgICBiZmluX3JlYWQxNihETUFDX1RDX0NOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUFDX1RDX0NOVCh2YWwpICAgICAgICAgIGJmaW5fd3JpdGUxNihETUFDX1RDX0NOVCx2YWwpCiAKIC8qIEdlbmVyYWwgUHVycG9zZSBJTyAoMHhGRkMwIDI0MDAtMHhGRkMwIDI3RkYpICovCiAjZGVmaW5lIGJmaW5fcmVhZF9GSU9fRElSKCkgICAgICAgICAgICAgICAgICBiZmluX3JlYWQxNihGSU9fRElSKQpAQCAtMTA1LDYgKzk2LDQ3IEBACiAjZGVmaW5lIGJmaW5fcmVhZF9GSU9fTUFTS0JfVCgpICAgICAgICAgICAgICBiZmluX3JlYWQxNihGSU9fTUFTS0JfVCkKICNkZWZpbmUgYmZpbl93cml0ZV9GSU9fTUFTS0JfVCh2YWwpICAgICAgICAgIGJmaW5fd3JpdGUxNihGSU9fTUFTS0JfVCx2YWwpCiAKKyNpZiBBTk9NQUxZXzA1MDAwMzExCisvKiBLZWVwIGF0IHRoZSBDUFAgZXhwYW5zaW9uIHRvIGF2b2lkIGNpcmN1bGFyIGhlYWRlciBkZXBlbmRlbmN5IGxvb3BzICovCisjZGVmaW5lIEJGSU5fV1JJVEVfRklPX0ZMQUcobmFtZSwgdmFsKSBcCisJZG8geyBcCisJCXVuc2lnbmVkIGxvbmcgX19mbGFnczsgXAorCQlfX2ZsYWdzID0gaGFyZF9sb2NhbF9pcnFfc2F2ZSgpOyBcCisJCWJmaW5fd3JpdGUxNihGSU9fRkxBR18jI25hbWUsIHZhbCk7IFwKKwkJYmZpbl9yZWFkX0NISVBJRCgpOyBcCisJCWhhcmRfbG9jYWxfaXJxX3Jlc3RvcmUoX19mbGFncyk7IFwKKwl9IHdoaWxlICgwKQorI2RlZmluZSBiZmluX3dyaXRlX0ZJT19GTEFHX0QodmFsKSAgICAgICAgICAgQkZJTl9XUklURV9GSU9fRkxBRyhELCB2YWwpCisjZGVmaW5lIGJmaW5fd3JpdGVfRklPX0ZMQUdfQyh2YWwpICAgICAgICAgICBCRklOX1dSSVRFX0ZJT19GTEFHKEMsIHZhbCkKKyNkZWZpbmUgYmZpbl93cml0ZV9GSU9fRkxBR19TKHZhbCkgICAgICAgICAgIEJGSU5fV1JJVEVfRklPX0ZMQUcoUywgdmFsKQorI2RlZmluZSBiZmluX3dyaXRlX0ZJT19GTEFHX1QodmFsKSAgICAgICAgICAgQkZJTl9XUklURV9GSU9fRkxBRyhULCB2YWwpCisKKyNkZWZpbmUgQkZJTl9SRUFEX0ZJT19GTEFHKG5hbWUpIFwKKwkoeyBcCisJCXVuc2lnbmVkIGxvbmcgX19mbGFnczsgXAorCQl1MTYgX19yZXQ7IFwKKwkJX19mbGFncyA9IGhhcmRfbG9jYWxfaXJxX3NhdmUoKTsgXAorCQlfX3JldCA9IGJmaW5fcmVhZDE2KEZJT19GTEFHXyMjbmFtZSk7IFwKKwkJYmZpbl9yZWFkX0NISVBJRCgpOyBcCisJCWhhcmRfbG9jYWxfaXJxX3Jlc3RvcmUoX19mbGFncyk7IFwKKwkJX19yZXQ7IFwKKwl9KQorI2RlZmluZSBiZmluX3JlYWRfRklPX0ZMQUdfRCgpICAgICAgICAgICAgICAgQkZJTl9SRUFEX0ZJT19GTEFHKEQpCisjZGVmaW5lIGJmaW5fcmVhZF9GSU9fRkxBR19DKCkgICAgICAgICAgICAgICBCRklOX1JFQURfRklPX0ZMQUcoQykKKyNkZWZpbmUgYmZpbl9yZWFkX0ZJT19GTEFHX1MoKSAgICAgICAgICAgICAgIEJGSU5fUkVBRF9GSU9fRkxBRyhTKQorI2RlZmluZSBiZmluX3JlYWRfRklPX0ZMQUdfVCgpICAgICAgICAgICAgICAgQkZJTl9SRUFEX0ZJT19GTEFHKFQpCisKKyNlbHNlCisjZGVmaW5lIGJmaW5fd3JpdGVfRklPX0ZMQUdfRCh2YWwpICAgICAgICAgICBiZmluX3dyaXRlMTYoRklPX0ZMQUdfRCwgdmFsKQorI2RlZmluZSBiZmluX3dyaXRlX0ZJT19GTEFHX0ModmFsKSAgICAgICAgICAgYmZpbl93cml0ZTE2KEZJT19GTEFHX0MsIHZhbCkKKyNkZWZpbmUgYmZpbl93cml0ZV9GSU9fRkxBR19TKHZhbCkgICAgICAgICAgIGJmaW5fd3JpdGUxNihGSU9fRkxBR19TLCB2YWwpCisjZGVmaW5lIGJmaW5fd3JpdGVfRklPX0ZMQUdfVCh2YWwpICAgICAgICAgICBiZmluX3dyaXRlMTYoRklPX0ZMQUdfVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRklPX0ZMQUdfRCgpICAgICAgICAgICAgICAgYmZpbl9yZWFkMTYoRklPX0ZMQUdfRCkKKyNkZWZpbmUgYmZpbl9yZWFkX0ZJT19GTEFHX0MoKSAgICAgICAgICAgICAgIGJmaW5fcmVhZDE2KEZJT19GTEFHX0MpCisjZGVmaW5lIGJmaW5fcmVhZF9GSU9fRkxBR19TKCkgICAgICAgICAgICAgICBiZmluX3JlYWQxNihGSU9fRkxBR19TKQorI2RlZmluZSBiZmluX3JlYWRfRklPX0ZMQUdfVCgpICAgICAgICAgICAgICAgYmZpbl9yZWFkMTYoRklPX0ZMQUdfVCkKKyNlbmRpZgorCiAvKiBETUEgQ29udHJvbGxlciAqLwogI2RlZmluZSBiZmluX3JlYWRfRE1BMF9DT05GSUcoKSAgICAgICAgICAgICAgYmZpbl9yZWFkMTYoRE1BMF9DT05GSUcpCiAjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMF9DT05GSUcodmFsKSAgICAgICAgICBiZmluX3dyaXRlMTYoRE1BMF9DT05GSUcsdmFsKQpAQCAtNjQ3LDcgKzY3OSw0IEBACiAjZGVmaW5lIGJmaW5fcmVhZF9QUElfRlJBTUUoKSAgICAgICAgICAgICAgICBiZmluX3JlYWQxNihQUElfRlJBTUUpCiAjZGVmaW5lIGJmaW5fd3JpdGVfUFBJX0ZSQU1FKHZhbCkgICAgICAgICAgICBiZmluX3dyaXRlMTYoUFBJX0ZSQU1FLHZhbCkKIAotLyogVGhlc2UgbmVlZCB0byBiZSBsYXN0IGR1ZSB0byB0aGUgY2RlZi9saW51eCBpbnRlci1kZXBlbmRlbmNpZXMgKi8KLSNpbmNsdWRlIDxhc20vaXJxLmg+Ci0KICNlbmRpZgkJCQkvKiBfQ0RFRl9CRjUzMl9IICovCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvaW5jbHVkZS9tYWNoL2RlZkJGNTMyLmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvaW5jbHVkZS9tYWNoL2RlZkJGNTMyLmgKaW5kZXggM2FkYjBiNC4uMjM3NmQ1MyAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2luY2x1ZGUvbWFjaC9kZWZCRjUzMi5oCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9pbmNsdWRlL21hY2gvZGVmQkY1MzIuaApAQCAtMSw3ICsxLDcgQEAKIC8qCiAgKiBTeXN0ZW0gJiBNTVIgYml0IGFuZCBBZGRyZXNzIGRlZmluaXRpb25zIGZvciBBRFNQLUJGNTMyCiAgKgotICogQ29weXJpZ2h0IDIwMDUtMjAwOCBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDEwIEFuYWxvZyBEZXZpY2VzIEluYy4KICAqCiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgQURJIEJTRCBsaWNlbnNlIG9yIHRoZSBHUEwtMiAob3IgbGF0ZXIpCiAgKi8KQEAgLTksOSArOSw2IEBACiAjaWZuZGVmIF9ERUZfQkY1MzJfSAogI2RlZmluZSBfREVGX0JGNTMyX0gKIAotLyogaW5jbHVkZSBhbGwgQ29yZSByZWdpc3RlcnMgYW5kIGJpdCBkZWZpbml0aW9ucyAqLwotI2luY2x1ZGUgPGFzbS9kZWZfTFBCbGFja2Zpbi5oPgotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KIC8qIFN5c3RlbSBNTVIgUmVnaXN0ZXIgTWFwICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KQEAgLTE4MiwxMiArMTc5LDggQEAKICNkZWZpbmUgRUJJVV9TRFNUQVQJCQkweEZGQzAwQTFDCS8qIFNEUkFNIFN0YXR1cyBSZWdpc3RlciAqLwogCiAvKiBETUEgVHJhZmZpYyBjb250cm9scyAqLwotI2RlZmluZSBETUFfVENfUEVSIDB4RkZDMDBCMEMJLyogVHJhZmZpYyBDb250cm9sIFBlcmlvZHMgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgRE1BX1RDX0NOVCAweEZGQzAwQjEwCS8qIFRyYWZmaWMgQ29udHJvbCBDdXJyZW50IENvdW50cyBSZWdpc3RlciAqLwotCi0vKiBBbHRlcm5hdGUgZGVwcmVjYXRlZCByZWdpc3RlciBuYW1lcyAoYmVsb3cpIHByb3ZpZGVkIGZvciBiYWNrd2FyZHMgY29kZSBjb21wYXRpYmlsaXR5ICovCi0jZGVmaW5lIERNQV9UQ1BFUiAweEZGQzAwQjBDCS8qIFRyYWZmaWMgQ29udHJvbCBQZXJpb2RzIFJlZ2lzdGVyICovCi0jZGVmaW5lIERNQV9UQ0NOVCAweEZGQzAwQjEwCS8qIFRyYWZmaWMgQ29udHJvbCBDdXJyZW50IENvdW50cyBSZWdpc3RlciAqLworI2RlZmluZSBETUFDX1RDX1BFUiAweEZGQzAwQjBDCS8qIFRyYWZmaWMgQ29udHJvbCBQZXJpb2RzIFJlZ2lzdGVyICovCisjZGVmaW5lIERNQUNfVENfQ05UIDB4RkZDMDBCMTAJLyogVHJhZmZpYyBDb250cm9sIEN1cnJlbnQgQ291bnRzIFJlZ2lzdGVyICovCiAKIC8qIERNQSBDb250cm9sbGVyICgweEZGQzAwQzAwIC0gMHhGRkMwMEZGRikgKi8KICNkZWZpbmUgRE1BMF9DT05GSUcJCTB4RkZDMDBDMDgJLyogRE1BIENoYW5uZWwgMCBDb25maWd1cmF0aW9uIFJlZ2lzdGVyICovCkBAIC00MzIsODMgKzQyNSw2IEBACiAjZGVmaW5lIElXUl9FTkFCTEUoeCkJICAgICAgICgxIDw8ICh4KSkJLyogV2FrZXVwIEVuYWJsZSBQZXJpcGhlcmFsICN4ICovCiAjZGVmaW5lIElXUl9ESVNBQkxFKHgpICgweEZGRkZGRkZGIF4gKDEgPDwgKHgpKSkJLyogV2FrZXVwIERpc2FibGUgUGVyaXBoZXJhbCAjeCAqLwogCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBVQVJUIENPTlRST0xMRVIgTUFTS1MgKioqKioqKioqKioqKioqKioqKioqKiAqLwotCi0vKiBVQVJUX0xDUiBSZWdpc3RlciAqLwotCi0jZGVmaW5lIERMQUIJMHg4MAotI2RlZmluZSBTQiAgICAgIDB4NDAKLSNkZWZpbmUgU1RQICAgICAgMHgyMAotI2RlZmluZSBFUFMgICAgIDB4MTAKLSNkZWZpbmUgUEVOCTB4MDgKLSNkZWZpbmUgU1RCCTB4MDQKLSNkZWZpbmUgV0xTKHgpCSgoeC01KSAmIDB4MDMpCi0KLSNkZWZpbmUgRExBQl9QCTB4MDcKLSNkZWZpbmUgU0JfUAkweDA2Ci0jZGVmaW5lIFNUUF9QCTB4MDUKLSNkZWZpbmUgRVBTX1AJMHgwNAotI2RlZmluZSBQRU5fUAkweDAzCi0jZGVmaW5lIFNUQl9QCTB4MDIKLSNkZWZpbmUgV0xTX1AxCTB4MDEKLSNkZWZpbmUgV0xTX1AwCTB4MDAKLQotLyogVUFSVF9NQ1IgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgTE9PUF9FTkEJMHgxMAotI2RlZmluZSBMT09QX0VOQV9QCTB4MDQKLQotLyogVUFSVF9MU1IgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgVEVNVAkweDQwCi0jZGVmaW5lIFRIUkUJMHgyMAotI2RlZmluZSBCSQkweDEwCi0jZGVmaW5lIEZFCTB4MDgKLSNkZWZpbmUgUEUJMHgwNAotI2RlZmluZSBPRQkweDAyCi0jZGVmaW5lIERSCTB4MDEKLQotI2RlZmluZSBURU1QX1AJMHgwNgotI2RlZmluZSBUSFJFX1AJMHgwNQotI2RlZmluZSBCSV9QCTB4MDQKLSNkZWZpbmUgRkVfUAkweDAzCi0jZGVmaW5lIFBFX1AJMHgwMgotI2RlZmluZSBPRV9QCTB4MDEKLSNkZWZpbmUgRFJfUAkweDAwCi0KLS8qIFVBUlRfSUVSIFJlZ2lzdGVyICovCi0jZGVmaW5lIEVMU0kJMHgwNAotI2RlZmluZSBFVEJFSQkweDAyCi0jZGVmaW5lIEVSQkZJCTB4MDEKLQotI2RlZmluZSBFTFNJX1AJMHgwMgotI2RlZmluZSBFVEJFSV9QCTB4MDEKLSNkZWZpbmUgRVJCRklfUAkweDAwCi0KLS8qIFVBUlRfSUlSIFJlZ2lzdGVyICovCi0jZGVmaW5lIFNUQVRVUyh4KQkoKHggPDwgMSkgJiAweDA2KQotI2RlZmluZSBOSU5UCQkweDAxCi0jZGVmaW5lIFNUQVRVU19QMQkweDAyCi0jZGVmaW5lIFNUQVRVU19QMAkweDAxCi0jZGVmaW5lIE5JTlRfUAkJMHgwMAotI2RlZmluZSBJSVJfVFhfUkVBRFkgICAgMHgwMgkvKiBVQVJUX1RIUiBlbXB0eSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBJSVJfUlhfUkVBRFkgICAgMHgwNAkvKiBSZWNlaXZlIGRhdGEgcmVhZHkgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBJSVJfTElORV9DSEFOR0UgMHgwNgkvKiBSZWNlaXZlIGxpbmUgc3RhdHVzICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBJSVJfU1RBVFVTCTB4MDYKLQotLyogVUFSVF9HQ1RMIFJlZ2lzdGVyICovCi0jZGVmaW5lIEZGRQkweDIwCi0jZGVmaW5lIEZQRQkweDEwCi0jZGVmaW5lIFJQT0xDCTB4MDgKLSNkZWZpbmUgVFBPTEMJMHgwNAotI2RlZmluZSBJUkVOCTB4MDIKLSNkZWZpbmUgVUNFTgkweDAxCi0KLSNkZWZpbmUgRkZFX1AJMHgwNQotI2RlZmluZSBGUEVfUAkweDA0Ci0jZGVmaW5lIFJQT0xDX1AJMHgwMwotI2RlZmluZSBUUE9MQ19QCTB4MDIKLSNkZWZpbmUgSVJFTl9QCTB4MDEKLSNkZWZpbmUgVUNFTl9QCTB4MDAKLQogLyogICoqKioqKioqKiAgUEFSQUxMRUwgUEVSSVBIRVJBTCBJTlRFUkZBQ0UgKFBQSSkgTUFTS1MgKioqKioqKioqKioqKioqKiAgICovCiAKIC8qICBQUElfQ09OVFJPTCBNYXNrcyAgICAgICAgICovCkBAIC02NDMsNDQgKzU1OSw2IEBACiAjZGVmaW5lIEVSUl9UWVBfUDAJCTB4MEUKICNkZWZpbmUgRVJSX1RZUF9QMQkJMHgwRgogCi0vKi8gKioqKioqKioqKioqKioqKioqICAgUFJPR1JBTU1BQkxFIEZMQUcgTUFTS1MgICoqKioqKioqKioqKioqKioqKioqKiAqLwotCi0vKiAgR2VuZXJhbCBQdXJwb3NlIElPICgweEZGQzAwNzAwIC0gMHhGRkMwMDdGRikgIE1hc2tzICovCi0jZGVmaW5lIFBGMCAgICAgICAgIDB4MDAwMQotI2RlZmluZSBQRjEgICAgICAgICAweDAwMDIKLSNkZWZpbmUgUEYyICAgICAgICAgMHgwMDA0Ci0jZGVmaW5lIFBGMyAgICAgICAgIDB4MDAwOAotI2RlZmluZSBQRjQgICAgICAgICAweDAwMTAKLSNkZWZpbmUgUEY1ICAgICAgICAgMHgwMDIwCi0jZGVmaW5lIFBGNiAgICAgICAgIDB4MDA0MAotI2RlZmluZSBQRjcgICAgICAgICAweDAwODAKLSNkZWZpbmUgUEY4ICAgICAgICAgMHgwMTAwCi0jZGVmaW5lIFBGOSAgICAgICAgIDB4MDIwMAotI2RlZmluZSBQRjEwICAgICAgICAweDA0MDAKLSNkZWZpbmUgUEYxMSAgICAgICAgMHgwODAwCi0jZGVmaW5lIFBGMTIgICAgICAgIDB4MTAwMAotI2RlZmluZSBQRjEzICAgICAgICAweDIwMDAKLSNkZWZpbmUgUEYxNCAgICAgICAgMHg0MDAwCi0jZGVmaW5lIFBGMTUgICAgICAgIDB4ODAwMAotCi0vKiAgR2VuZXJhbCBQdXJwb3NlIElPICgweEZGQzAwNzAwIC0gMHhGRkMwMDdGRikgIEJJVCBQT1NJVElPTlMgKi8KLSNkZWZpbmUgUEYwX1AgICAgICAgICAwCi0jZGVmaW5lIFBGMV9QICAgICAgICAgMQotI2RlZmluZSBQRjJfUCAgICAgICAgIDIKLSNkZWZpbmUgUEYzX1AgICAgICAgICAzCi0jZGVmaW5lIFBGNF9QICAgICAgICAgNAotI2RlZmluZSBQRjVfUCAgICAgICAgIDUKLSNkZWZpbmUgUEY2X1AgICAgICAgICA2Ci0jZGVmaW5lIFBGN19QICAgICAgICAgNwotI2RlZmluZSBQRjhfUCAgICAgICAgIDgKLSNkZWZpbmUgUEY5X1AgICAgICAgICA5Ci0jZGVmaW5lIFBGMTBfUCAgICAgICAgMTAKLSNkZWZpbmUgUEYxMV9QICAgICAgICAxMQotI2RlZmluZSBQRjEyX1AgICAgICAgIDEyCi0jZGVmaW5lIFBGMTNfUCAgICAgICAgMTMKLSNkZWZpbmUgUEYxNF9QICAgICAgICAxNAotI2RlZmluZSBQRjE1X1AgICAgICAgIDE1Ci0KIC8qICoqKioqKioqKioqKioqKioqKioqKiAgQVNZTkNIUk9OT1VTIE1FTU9SWSBDT05UUk9MTEVSIE1BU0tTICAqKioqKioqKioqKioqICovCiAKIC8qIEFNR0NUTCBNYXNrcyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2luY2x1ZGUvbWFjaC9maW9fZmxhZy5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2luY2x1ZGUvbWFjaC9maW9fZmxhZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMGJmYmEwLi4wMDAwMDAwCi0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9pbmNsdWRlL21hY2gvZmlvX2ZsYWcuaAorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwNS0yMDA4IEFuYWxvZyBEZXZpY2VzIEluYy4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIKLSAqLwotCi0jaWZuZGVmIF9NQUNIX0ZJT19GTEFHX0gKLSNkZWZpbmUgX01BQ0hfRklPX0ZMQUdfSAotCi0jaW5jbHVkZSA8YXNtL2JsYWNrZmluLmg+Ci0jaW5jbHVkZSA8YXNtL2lycWZsYWdzLmg+Ci0KLSNpZiBBTk9NQUxZXzA1MDAwMzExCi0jZGVmaW5lIEJGSU5fV1JJVEVfRklPX0ZMQUcobmFtZSkgXAotc3RhdGljIGlubGluZSB2b2lkIGJmaW5fd3JpdGVfRklPX0ZMQUdfIyNuYW1lKHVuc2lnbmVkIHNob3J0IHZhbCkgXAoteyBcCi0JdW5zaWduZWQgbG9uZyBmbGFnczsgXAotCWZsYWdzID0gaGFyZF9sb2NhbF9pcnFfc2F2ZSgpOyBcCi0JYmZpbl93cml0ZTE2KEZJT19GTEFHXyMjbmFtZSwgdmFsKTsgXAotCWJmaW5fcmVhZF9DSElQSUQoKTsgXAotCWhhcmRfbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOyBcCi19Ci1CRklOX1dSSVRFX0ZJT19GTEFHKEQpCi1CRklOX1dSSVRFX0ZJT19GTEFHKEMpCi1CRklOX1dSSVRFX0ZJT19GTEFHKFMpCi1CRklOX1dSSVRFX0ZJT19GTEFHKFQpCi0KLSNkZWZpbmUgQkZJTl9SRUFEX0ZJT19GTEFHKG5hbWUpIFwKLXN0YXRpYyBpbmxpbmUgdTE2IGJmaW5fcmVhZF9GSU9fRkxBR18jI25hbWUodm9pZCkgXAoteyBcCi0JdW5zaWduZWQgbG9uZyBmbGFnczsgXAotCXUxNiByZXQ7IFwKLQlmbGFncyA9IGhhcmRfbG9jYWxfaXJxX3NhdmUoKTsgXAotCXJldCA9IGJmaW5fcmVhZDE2KEZJT19GTEFHXyMjbmFtZSk7IFwKLQliZmluX3JlYWRfQ0hJUElEKCk7IFwKLQloYXJkX2xvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsgXAotCXJldHVybiByZXQ7IFwKLX0KLUJGSU5fUkVBRF9GSU9fRkxBRyhEKQotQkZJTl9SRUFEX0ZJT19GTEFHKEMpCi1CRklOX1JFQURfRklPX0ZMQUcoUykKLUJGSU5fUkVBRF9GSU9fRkxBRyhUKQotCi0jZWxzZQotI2RlZmluZSBiZmluX3dyaXRlX0ZJT19GTEFHX0QodmFsKSAgICAgICAgICAgYmZpbl93cml0ZTE2KEZJT19GTEFHX0QsIHZhbCkKLSNkZWZpbmUgYmZpbl93cml0ZV9GSU9fRkxBR19DKHZhbCkgICAgICAgICAgIGJmaW5fd3JpdGUxNihGSU9fRkxBR19DLCB2YWwpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRklPX0ZMQUdfUyh2YWwpICAgICAgICAgICBiZmluX3dyaXRlMTYoRklPX0ZMQUdfUywgdmFsKQotI2RlZmluZSBiZmluX3dyaXRlX0ZJT19GTEFHX1QodmFsKSAgICAgICAgICAgYmZpbl93cml0ZTE2KEZJT19GTEFHX1QsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0ZJT19GTEFHX1QoKSAgICAgICAgICAgICAgIGJmaW5fcmVhZDE2KEZJT19GTEFHX1QpCi0jZGVmaW5lIGJmaW5fcmVhZF9GSU9fRkxBR19DKCkgICAgICAgICAgICAgICBiZmluX3JlYWQxNihGSU9fRkxBR19DKQotI2RlZmluZSBiZmluX3JlYWRfRklPX0ZMQUdfUygpICAgICAgICAgICAgICAgYmZpbl9yZWFkMTYoRklPX0ZMQUdfUykKLSNkZWZpbmUgYmZpbl9yZWFkX0ZJT19GTEFHX0QoKSAgICAgICAgICAgICAgIGJmaW5fcmVhZDE2KEZJT19GTEFHX0QpCi0jZW5kaWYKLQotI2VuZGlmIC8qIF9NQUNIX0ZJT19GTEFHX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9pbmNsdWRlL21hY2gvZ3Bpby5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2luY2x1ZGUvbWFjaC9ncGlvLmgKaW5kZXggZTAyNDE2ZC4uY2NlNGY4ZiAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2luY2x1ZGUvbWFjaC9ncGlvLmgKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2luY2x1ZGUvbWFjaC9ncGlvLmgKQEAgLTI4LDQgKzI4LDYgQEAKIAogI2RlZmluZSBQT1JUX0YgR1BJT19QRjAKIAorI2luY2x1ZGUgPG1hY2gtY29tbW9uL3BvcnRzLWYuaD4KKwogI2VuZGlmIC8qIF9NQUNIX0dQSU9fSF8gKi8KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9pbmNsdWRlL21hY2gvcGxsLmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvaW5jbHVkZS9tYWNoL3BsbC5oCmluZGV4IDE2OWMxMDYuLjk0Y2NhNjcgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9pbmNsdWRlL21hY2gvcGxsLmgKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2luY2x1ZGUvbWFjaC9wbGwuaApAQCAtMSw1NyArMSBAQAotLyoKLSAqIENvcHlyaWdodCAyMDA1LTIwMDggQW5hbG9nIERldmljZXMgSW5jLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlcgotICovCi0KLSNpZm5kZWYgX01BQ0hfUExMX0gKLSNkZWZpbmUgX01BQ0hfUExMX0gKLQotI2luY2x1ZGUgPGFzbS9ibGFja2Zpbi5oPgotI2luY2x1ZGUgPGFzbS9pcnFmbGFncy5oPgotCi0vKiBXcml0aW5nIHRvIFBMTF9DVEwgaW5pdGlhdGVzIGEgUExMIHJlbG9jayBzZXF1ZW5jZS4gKi8KLXN0YXRpYyBfX2lubGluZV9fIHZvaWQgYmZpbl93cml0ZV9QTExfQ1RMKHVuc2lnbmVkIGludCB2YWwpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFncywgaXdyOwotCi0JaWYgKHZhbCA9PSBiZmluX3JlYWRfUExMX0NUTCgpKQotCQlyZXR1cm47Ci0KLQlmbGFncyA9IGhhcmRfbG9jYWxfaXJxX3NhdmUoKTsKLQkvKiBFbmFibGUgdGhlIFBMTCBXYWtldXAgYml0IGluIFNJQyBJV1IgKi8KLQlpd3IgPSBiZmluX3JlYWQzMihTSUNfSVdSKTsKLQkvKiBPbmx5IGFsbG93IFBQTCBXYWtldXApICovCi0JYmZpbl93cml0ZTMyKFNJQ19JV1IsIElXUl9FTkFCTEUoMCkpOwotCi0JYmZpbl93cml0ZTE2KFBMTF9DVEwsIHZhbCk7Ci0JU1NZTkMoKTsKLQlhc20oIklETEU7Iik7Ci0KLQliZmluX3dyaXRlMzIoU0lDX0lXUiwgaXdyKTsKLQloYXJkX2xvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLX0KLQotLyogV3JpdGluZyB0byBWUl9DVEwgaW5pdGlhdGVzIGEgUExMIHJlbG9jayBzZXF1ZW5jZS4gKi8KLXN0YXRpYyBfX2lubGluZV9fIHZvaWQgYmZpbl93cml0ZV9WUl9DVEwodW5zaWduZWQgaW50IHZhbCkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzLCBpd3I7Ci0KLQlpZiAodmFsID09IGJmaW5fcmVhZF9WUl9DVEwoKSkKLQkJcmV0dXJuOwotCi0JZmxhZ3MgPSBoYXJkX2xvY2FsX2lycV9zYXZlKCk7Ci0JLyogRW5hYmxlIHRoZSBQTEwgV2FrZXVwIGJpdCBpbiBTSUMgSVdSICovCi0JaXdyID0gYmZpbl9yZWFkMzIoU0lDX0lXUik7Ci0JLyogT25seSBhbGxvdyBQUEwgV2FrZXVwKSAqLwotCWJmaW5fd3JpdGUzMihTSUNfSVdSLCBJV1JfRU5BQkxFKDApKTsKLQotCWJmaW5fd3JpdGUxNihWUl9DVEwsIHZhbCk7Ci0JU1NZTkMoKTsKLQlhc20oIklETEU7Iik7Ci0KLQliZmluX3dyaXRlMzIoU0lDX0lXUiwgaXdyKTsKLQloYXJkX2xvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLX0KLQotI2VuZGlmIC8qIF9NQUNIX1BMTF9IICovCisjaW5jbHVkZSA8bWFjaC1jb21tb24vcGxsLmg+CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvYm9hcmRzL0tjb25maWcgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvYm9hcmRzL0tjb25maWcKaW5kZXggNDQxMzJmZC4uYTQ0YmYzYSAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2JvYXJkcy9LY29uZmlnCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9ib2FyZHMvS2NvbmZpZwpAQCAtMzksNCArMzksMTAgQEAKIAloZWxwCiAJICBCb2FyZCBzdXBwbHkgcGFja2FnZSBmb3IgQ1NQIE1pbm90YXVyCiAKK2NvbmZpZyBETlA1MzcwCisJYm9vbCAiU1NWIERpbC9OZXRQQyBETlAvNTM3MCIKKwlkZXBlbmRzIG9uIChCRjUzNykKKwloZWxwCisJICBCb2FyZCBzdXBwbHkgcGFja2FnZSBmb3IgRE5QLzUzNzAgRElMNjQgbW9kdWxlCisKIGVuZGNob2ljZQpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2JvYXJkcy9NYWtlZmlsZSBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9ib2FyZHMvTWFrZWZpbGUKaW5kZXggN2U2YWE0ZS4uZmU0MjI1OCAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2JvYXJkcy9NYWtlZmlsZQorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvYm9hcmRzL01ha2VmaWxlCkBAIC04LDMgKzgsNCBAQAogb2JqLSQoQ09ORklHX0JGSU41MzdfQkxVRVRFQ0hOSVhfVENNKSAgKz0gdGNtX2JmNTM3Lm8KIG9iai0kKENPTkZJR19QTkFWMTApICAgICAgICAgICAgICAgICAgICs9IHBuYXYxMC5vCiBvYmotJChDT05GSUdfQ0FNU0lHX01JTk9UQVVSKSAgICAgICAgICArPSBtaW5vdGF1ci5vCitvYmotJChDT05GSUdfRE5QNTM3MCkgICAgICAgICAgICAgICAgICArPSBkbnA1MzcwLm8KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9ib2FyZHMvY21fYmY1MzdlLmMgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvYm9hcmRzL2NtX2JmNTM3ZS5jCmluZGV4IDgzNjY5OGMuLjJjNzc2ZTEgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9ib2FyZHMvY21fYmY1MzdlLmMKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2JvYXJkcy9jbV9iZjUzN2UuYwpAQCAtMzczLDcgKzM3Myw3IEBACiAjZW5kaWYKIH07CiAKLXVuc2lnbmVkIHNob3J0IGJmaW5fdWFydDBfcGVyaXBoZXJhbHNbXSA9IHsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBiZmluX3VhcnQwX3BlcmlwaGVyYWxzW10gPSB7CiAJUF9VQVJUMF9UWCwgUF9VQVJUMF9SWCwgMAogfTsKIApAQCAtNDM0LDcgKzQzNCw3IEBACiAjZW5kaWYKIH07CiAKLXVuc2lnbmVkIHNob3J0IGJmaW5fdWFydDFfcGVyaXBoZXJhbHNbXSA9IHsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBiZmluX3VhcnQxX3BlcmlwaGVyYWxzW10gPSB7CiAJUF9VQVJUMV9UWCwgUF9VQVJUMV9SWCwgMAogfTsKIApAQCAtNTQ1LDkgKzU0NSw5IEBACiAJfSwKIH07CiAKLXVuc2lnbmVkIHNob3J0IGJmaW5fc3BvcnQwX3BlcmlwaGVyYWxzW10gPSB7CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgYmZpbl9zcG9ydDBfcGVyaXBoZXJhbHNbXSA9IHsKIAlQX1NQT1JUMF9URlMsIFBfU1BPUlQwX0RUUFJJLCBQX1NQT1JUMF9UU0NMSywgUF9TUE9SVDBfUkZTLAotCVBfU1BPUlQwX0RSUFJJLCBQX1NQT1JUMF9SU0NMSywgUF9TUE9SVDBfRFJTRUMsIFBfU1BPUlQwX0RUU0VDLCAwCisJUF9TUE9SVDBfRFJQUkksIFBfU1BPUlQwX1JTQ0xLLCAwCiB9OwogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZmluX3Nwb3J0MF91YXJ0X2RldmljZSA9IHsKQEAgLTU3OSw5ICs1NzksOSBAQAogCX0sCiB9OwogCi11bnNpZ25lZCBzaG9ydCBiZmluX3Nwb3J0MV9wZXJpcGhlcmFsc1tdID0geworc3RhdGljIHVuc2lnbmVkIHNob3J0IGJmaW5fc3BvcnQxX3BlcmlwaGVyYWxzW10gPSB7CiAJUF9TUE9SVDFfVEZTLCBQX1NQT1JUMV9EVFBSSSwgUF9TUE9SVDFfVFNDTEssIFBfU1BPUlQxX1JGUywKLQlQX1NQT1JUMV9EUlBSSSwgUF9TUE9SVDFfUlNDTEssIFBfU1BPUlQxX0RSU0VDLCBQX1NQT1JUMV9EVFNFQywgMAorCVBfU1BPUlQxX0RSUFJJLCBQX1NQT1JUMV9SU0NMSywgMAogfTsKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYmZpbl9zcG9ydDFfdWFydF9kZXZpY2UgPSB7CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvYm9hcmRzL2NtX2JmNTM3dS5jIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2JvYXJkcy9jbV9iZjUzN3UuYwppbmRleCAyYTg1NjcwLi4wODU2NjExIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvYm9hcmRzL2NtX2JmNTM3dS5jCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9ib2FyZHMvY21fYmY1Mzd1LmMKQEAgLTM1Niw3ICszNTYsNyBAQAogCX0sCiB9OwogCi11bnNpZ25lZCBzaG9ydCBiZmluX3VhcnQwX3BlcmlwaGVyYWxzW10gPSB7CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgYmZpbl91YXJ0MF9wZXJpcGhlcmFsc1tdID0gewogCVBfVUFSVDBfVFgsIFBfVUFSVDBfUlgsIDAKIH07CiAKQEAgLTM5OSw3ICszOTksNyBAQAogCX0sCiB9OwogCi11bnNpZ25lZCBzaG9ydCBiZmluX3VhcnQxX3BlcmlwaGVyYWxzW10gPSB7CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgYmZpbl91YXJ0MV9wZXJpcGhlcmFsc1tdID0gewogCVBfVUFSVDFfVFgsIFBfVUFSVDFfUlgsIDAKIH07CiAKQEAgLTUxMCw5ICs1MTAsOSBAQAogCX0sCiB9OwogCi11bnNpZ25lZCBzaG9ydCBiZmluX3Nwb3J0MF9wZXJpcGhlcmFsc1tdID0geworc3RhdGljIHVuc2lnbmVkIHNob3J0IGJmaW5fc3BvcnQwX3BlcmlwaGVyYWxzW10gPSB7CiAJUF9TUE9SVDBfVEZTLCBQX1NQT1JUMF9EVFBSSSwgUF9TUE9SVDBfVFNDTEssIFBfU1BPUlQwX1JGUywKLQlQX1NQT1JUMF9EUlBSSSwgUF9TUE9SVDBfUlNDTEssIFBfU1BPUlQwX0RSU0VDLCBQX1NQT1JUMF9EVFNFQywgMAorCVBfU1BPUlQwX0RSUFJJLCBQX1NQT1JUMF9SU0NMSywgMAogfTsKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYmZpbl9zcG9ydDBfdWFydF9kZXZpY2UgPSB7CkBAIC01NDQsOSArNTQ0LDkgQEAKIAl9LAogfTsKIAotdW5zaWduZWQgc2hvcnQgYmZpbl9zcG9ydDFfcGVyaXBoZXJhbHNbXSA9IHsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBiZmluX3Nwb3J0MV9wZXJpcGhlcmFsc1tdID0gewogCVBfU1BPUlQxX1RGUywgUF9TUE9SVDFfRFRQUkksIFBfU1BPUlQxX1RTQ0xLLCBQX1NQT1JUMV9SRlMsCi0JUF9TUE9SVDFfRFJQUkksIFBfU1BPUlQxX1JTQ0xLLCBQX1NQT1JUMV9EUlNFQywgUF9TUE9SVDFfRFRTRUMsIDAKKwlQX1NQT1JUMV9EUlBSSSwgUF9TUE9SVDFfUlNDTEssIDAKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGJmaW5fc3BvcnQxX3VhcnRfZGV2aWNlID0gewpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2JvYXJkcy9kbnA1MzcwLmMgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvYm9hcmRzL2RucDUzNzAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMWU5ZWEwCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2JvYXJkcy9kbnA1MzcwLmMKQEAgLTAsMCArMSw0MTggQEAKKy8qCisgKiBUaGlzIGlzIHRoZSBjb25maWd1cmF0aW9uIGZvciBTU1YgRGlsL05ldFBDIEROUC81MzcwIGJvYXJkLgorICoKKyAqIERJTCBtb2R1bGU6ICAgICAgICAgaHR0cDovL3d3dy5kaWxuZXRwYy5jb20vZG5wMDA4Ni5odG0KKyAqIFNLMjggKHN0YXJ0ZXIga2l0KTogaHR0cDovL3d3dy5kaWxuZXRwYy5jb20vZG5wMDA4OC5odG0KKyAqCisgKiBDb3B5cmlnaHQgMjAxMCAzYWxpdHkgRGlnaXRhbCBTeXN0ZW1zCisgKiBDb3B5cmlnaHQgMjAwNSBOYXRpb25hbCBJQ1QgQXVzdHJhbGlhIChOSUNUQSkKKyAqIENvcHlyaWdodCAyMDA0LTIwMDYgQW5hbG9nIERldmljZXMgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9tdGQvbXRkLmg+CisjaW5jbHVkZSA8bGludXgvbXRkL25hbmQuaD4KKyNpbmNsdWRlIDxsaW51eC9tdGQvcGFydGl0aW9ucy5oPgorI2luY2x1ZGUgPGxpbnV4L210ZC9wbGF0LXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L210ZC9waHlzbWFwLmg+CisjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaS9mbGFzaC5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaS9tbWNfc3BpLmg+CisjaW5jbHVkZSA8bGludXgvcGh5Lmg+CisjaW5jbHVkZSA8YXNtL2RtYS5oPgorI2luY2x1ZGUgPGFzbS9iZmluNXh4X3NwaS5oPgorI2luY2x1ZGUgPGFzbS9yZWJvb3QuaD4KKyNpbmNsdWRlIDxhc20vcG9ydG11eC5oPgorI2luY2x1ZGUgPGFzbS9kcG1jLmg+CisKKy8qCisgKiBOYW1lIHRoZSBCb2FyZCBmb3IgdGhlIC9wcm9jL2NwdWluZm8KKyAqLworY29uc3QgY2hhciBiZmluX2JvYXJkX25hbWVbXSA9ICJETlAvNTM3MCI7CisjZGVmaW5lIEZMQVNIX01BQyAgICAgICAgICAgICAgIDB4MjAyZjAwMDAKKyNkZWZpbmUgQ09ORklHX01URF9QSFlTTUFQX0xFTiAgMHgzMDAwMDAKKworI2lmIGRlZmluZWQoQ09ORklHX1JUQ19EUlZfQkZJTikgfHwgZGVmaW5lZChDT05GSUdfUlRDX0RSVl9CRklOX01PRFVMRSkKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHJ0Y19kZXZpY2UgPSB7CisJLm5hbWUgPSAicnRjLWJmaW4iLAorCS5pZCAgID0gLTEsCit9OworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19CRklOX01BQykgfHwgZGVmaW5lZChDT05GSUdfQkZJTl9NQUNfTU9EVUxFKQorI2luY2x1ZGUgPGxpbnV4L2JmaW5fbWFjLmg+CitzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgYmZpbl9tYWNfcGVyaXBoZXJhbHNbXSA9IFBfUk1JSTA7CisKK3N0YXRpYyBzdHJ1Y3QgYmZpbl9waHlkZXZfcGxhdGZvcm1fZGF0YSBiZmluX3BoeWRldl9kYXRhW10gPSB7CisJeworCQkuYWRkciA9IDEsCisJCS5pcnEgPSBQSFlfUE9MTCwgLyogSVJRX01BQ19QSFlJTlQgKi8KKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBiZmluX21paV9idXNfcGxhdGZvcm1fZGF0YSBiZmluX21paV9idXNfZGF0YSA9IHsKKwkucGh5ZGV2X251bWJlciAgID0gMSwKKwkucGh5ZGV2X2RhdGEgICAgID0gYmZpbl9waHlkZXZfZGF0YSwKKwkucGh5X21vZGUgICAgICAgID0gUEhZX0lOVEVSRkFDRV9NT0RFX1JNSUksCisJLm1hY19wZXJpcGhlcmFscyA9IGJmaW5fbWFjX3BlcmlwaGVyYWxzLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYmZpbl9taWlfYnVzID0geworCS5uYW1lID0gImJmaW5fbWlpX2J1cyIsCisJLmRldiA9IHsKKwkJLnBsYXRmb3JtX2RhdGEgPSAmYmZpbl9taWlfYnVzX2RhdGEsCisJfQorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYmZpbl9tYWNfZGV2aWNlID0geworCS5uYW1lID0gImJmaW5fbWFjIiwKKwkuZGV2ID0geworCQkucGxhdGZvcm1fZGF0YSA9ICZiZmluX21paV9idXMsCisJfQorfTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfTVREX1BIWVNNQVApIHx8IGRlZmluZWQoQ09ORklHX01URF9QSFlTTUFQX01PRFVMRSkKK3N0YXRpYyBzdHJ1Y3QgbXRkX3BhcnRpdGlvbiBhc21iX2ZsYXNoX3BhcnRpdGlvbnNbXSA9IHsKKwl7CisJCS5uYW1lICAgICAgID0gImJvb3Rsb2FkZXIobm9yKSIsCisJCS5zaXplICAgICAgID0gMHgzMDAwMCwKKwkJLm9mZnNldCAgICAgPSAwLAorCX0sIHsKKwkJLm5hbWUgICAgICAgPSAibGludXgga2VybmVsIGFuZCByb290ZnMobm9yKSIsCisJCS5zaXplICAgICAgID0gMHgzMDAwMDAgLSAweDMwMDAwIC0gMHgxMDAwMCwKKwkJLm9mZnNldCAgICAgPSBNVERQQVJUX09GU19BUFBFTkQsCisJfSwgeworCQkubmFtZSAgICAgICA9ICJNQUMgYWRkcmVzcyhub3IpIiwKKwkJLnNpemUgICAgICAgPSAweDEwMDAwLAorCQkub2Zmc2V0ICAgICA9IE1URFBBUlRfT0ZTX0FQUEVORCwKKwkJLm1hc2tfZmxhZ3MgPSBNVERfV1JJVEVBQkxFLAorCX0KK307CisKK3N0YXRpYyBzdHJ1Y3QgcGh5c21hcF9mbGFzaF9kYXRhIGFzbWJfZmxhc2hfZGF0YSA9IHsKKwkud2lkdGggICAgICA9IDEsCisJLnBhcnRzICAgICAgPSBhc21iX2ZsYXNoX3BhcnRpdGlvbnMsCisJLm5yX3BhcnRzICAgPSBBUlJBWV9TSVpFKGFzbWJfZmxhc2hfcGFydGl0aW9ucyksCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGFzbWJfZmxhc2hfcmVzb3VyY2UgPSB7CisJLnN0YXJ0ID0gMHgyMDAwMDAwMCwKKwkuZW5kICAgPSAweDIwMmZmZmZmLAorCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAorfTsKKworLyogNCBNQiBOT1IgZmxhc2ggYXR0YWNoZWQgdG8gYXN5bmMgbWVtb3J5IGJhbmtzIDAtMiwKKyAqIHRoZXJlZm9yZSBvbmx5IDMgTUIgdmlzaWJsZS4KKyAqLworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYXNtYl9mbGFzaF9kZXZpY2UgPSB7CisJLm5hbWUJICA9ICJwaHlzbWFwLWZsYXNoIiwKKwkuaWQJICA9IDAsCisJLmRldiA9IHsKKwkJLnBsYXRmb3JtX2RhdGEgPSAmYXNtYl9mbGFzaF9kYXRhLAorCX0sCisJLm51bV9yZXNvdXJjZXMgPSAxLAorCS5yZXNvdXJjZSAgICAgID0gJmFzbWJfZmxhc2hfcmVzb3VyY2UsCit9OworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19TUElfQkZJTikgfHwgZGVmaW5lZChDT05GSUdfU1BJX0JGSU5fTU9EVUxFKQorCisjaWYgZGVmaW5lZChDT05GSUdfTU1DX1NQSSkgfHwgZGVmaW5lZChDT05GSUdfTU1DX1NQSV9NT0RVTEUpCisKKyNkZWZpbmUgTU1DX1NQSV9DQVJEX0RFVEVDVF9JTlQgSVJRX1BGNQorCitzdGF0aWMgaW50IGJmaW5fbW1jX3NwaV9pbml0KHN0cnVjdCBkZXZpY2UgKmRldiwKKwlpcnFyZXR1cm5fdCAoKmRldGVjdF9pbnQpKGludCwgdm9pZCAqKSwgdm9pZCAqZGF0YSkKK3sKKwlyZXR1cm4gcmVxdWVzdF9pcnEoTU1DX1NQSV9DQVJEX0RFVEVDVF9JTlQsIGRldGVjdF9pbnQsCisJCUlSUUZfVFJJR0dFUl9GQUxMSU5HLCAibW1jLXNwaS1kZXRlY3QiLCBkYXRhKTsKK30KKworc3RhdGljIHZvaWQgYmZpbl9tbWNfc3BpX2V4aXQoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpkYXRhKQoreworCWZyZWVfaXJxKE1NQ19TUElfQ0FSRF9ERVRFQ1RfSU5ULCBkYXRhKTsKK30KKworc3RhdGljIHN0cnVjdCBiZmluNXh4X3NwaV9jaGlwIG1tY19zcGlfY2hpcF9pbmZvID0geworCS5lbmFibGVfZG1hICAgID0gMCwJIC8qIHVzZSBubyBkbWEgdHJhbnNmZXIgd2l0aCB0aGlzIGNoaXAqLworCS5iaXRzX3Blcl93b3JkID0gOCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbW1jX3NwaV9wbGF0Zm9ybV9kYXRhIGJmaW5fbW1jX3NwaV9wZGF0YSA9IHsKKwkuaW5pdCA9IGJmaW5fbW1jX3NwaV9pbml0LAorCS5leGl0ID0gYmZpbl9tbWNfc3BpX2V4aXQsCisJLmRldGVjdF9kZWxheSA9IDEwMCwgLyogbXNlY3MgKi8KK307CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX01URF9EQVRBRkxBU0gpIHx8IGRlZmluZWQoQ09ORklHX01URF9EQVRBRkxBU0hfTU9EVUxFKQorLyogVGhpcyBtYXBwaW5nIGlzIGZvciBhdDQ1ZGI2NDIgaXQgaGFzIDEwNTYgcGFnZSBzaXplLAorICogcGFydGl0aW9uIHNpemUgYW5kIG9mZnNldCBzaG91bGQgYmUgcGFnZSBhbGlnbmVkCisgKi8KK3N0YXRpYyBzdHJ1Y3QgbXRkX3BhcnRpdGlvbiBiZmluX3NwaV9kYXRhZmxhc2hfcGFydGl0aW9uc1tdID0geworCXsKKwkJLm5hbWUgICA9ICJKRkZTMiBkYXRhZmxhc2gobm9yKSIsCisjaWZkZWYgQ09ORklHX01URF9QQUdFU0laRV8xMDI0CisJCS5vZmZzZXQgPSAweDQwMDAwLAorCQkuc2l6ZSAgID0gMHg3QzAwMDAsCisjZWxzZQorCQkub2Zmc2V0ID0gMHgwLAorCQkuc2l6ZSAgID0gMHg4NDAwMDAsCisjZW5kaWYKKwl9Cit9OworCitzdGF0aWMgc3RydWN0IGZsYXNoX3BsYXRmb3JtX2RhdGEgYmZpbl9zcGlfZGF0YWZsYXNoX2RhdGEgPSB7CisJLm5hbWUgICAgID0gIm10ZF9kYXRhZmxhc2giLAorCS5wYXJ0cyAgICA9IGJmaW5fc3BpX2RhdGFmbGFzaF9wYXJ0aXRpb25zLAorCS5ucl9wYXJ0cyA9IEFSUkFZX1NJWkUoYmZpbl9zcGlfZGF0YWZsYXNoX3BhcnRpdGlvbnMpLAorCS50eXBlICAgICA9ICJtdGRfZGF0YWZsYXNoIiwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYmZpbjV4eF9zcGlfY2hpcCBzcGlfZGF0YWZsYXNoX2NoaXBfaW5mbyA9IHsKKwkuZW5hYmxlX2RtYSAgICA9IDAsCSAvKiB1c2Ugbm8gZG1hIHRyYW5zZmVyIHdpdGggdGhpcyBjaGlwKi8KKwkuYml0c19wZXJfd29yZCA9IDgsCit9OworI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3Qgc3BpX2JvYXJkX2luZm8gYmZpbl9zcGlfYm9hcmRfaW5mb1tdIF9faW5pdGRhdGEgPSB7CisvKiBTRC9NTUMgY2FyZCByZWFkZXIgYXQgU1BJIGJ1cyAqLworI2lmIGRlZmluZWQoQ09ORklHX01NQ19TUEkpIHx8IGRlZmluZWQoQ09ORklHX01NQ19TUElfTU9EVUxFKQorCXsKKwkJLm1vZGFsaWFzCSA9ICJtbWNfc3BpIiwKKwkJLm1heF9zcGVlZF9oeiAgICA9IDIwMDAwMDAwLAorCQkuYnVzX251bQkgPSAwLAorCQkuY2hpcF9zZWxlY3QgICAgID0gMSwKKwkJLnBsYXRmb3JtX2RhdGEgICA9ICZiZmluX21tY19zcGlfcGRhdGEsCisJCS5jb250cm9sbGVyX2RhdGEgPSAmbW1jX3NwaV9jaGlwX2luZm8sCisJCS5tb2RlCSAgICAgICAgID0gU1BJX01PREVfMywKKwl9LAorI2VuZGlmCisKKy8qIDggTWVnYWJ5dGUgQXRtZWwgTk9SIGZsYXNoIGNoaXAgYXQgU1BJIGJ1cyAqLworI2lmIGRlZmluZWQoQ09ORklHX01URF9EQVRBRkxBU0gpIHx8IGRlZmluZWQoQ09ORklHX01URF9EQVRBRkxBU0hfTU9EVUxFKQorCXsKKwkubW9kYWxpYXMgICAgICAgID0gIm10ZF9kYXRhZmxhc2giLAorCS5tYXhfc3BlZWRfaHogICAgPSAxNjcwMDAwMCwKKwkuYnVzX251bSAgICAgICAgID0gMCwKKwkuY2hpcF9zZWxlY3QgICAgID0gMiwKKwkucGxhdGZvcm1fZGF0YSAgID0gJmJmaW5fc3BpX2RhdGFmbGFzaF9kYXRhLAorCS5jb250cm9sbGVyX2RhdGEgPSAmc3BpX2RhdGFmbGFzaF9jaGlwX2luZm8sCisJLm1vZGUgICAgICAgICAgICA9IFNQSV9NT0RFXzMsIC8qIFNQSV9DUEhBIGFuZCBTUElfQ1BPTCAqLworCX0sCisjZW5kaWYKK307CisKKy8qIFNQSSBjb250cm9sbGVyIGRhdGEgKi8KKy8qIFNQSSAoMCkgKi8KK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYmZpbl9zcGkwX3Jlc291cmNlW10gPSB7CisJWzBdID0geworCQkuc3RhcnQgPSBTUEkwX1JFR0JBU0UsCisJCS5lbmQgICA9IFNQSTBfUkVHQkFTRSArIDB4RkYsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzFdID0geworCQkuc3RhcnQgPSBDSF9TUEksCisJCS5lbmQgICA9IENIX1NQSSwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9ETUEsCisJfSwKKwlbMl0gPSB7CisJCS5zdGFydCA9IElSUV9TUEksCisJCS5lbmQgICA9IElSUV9TUEksCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IGJmaW41eHhfc3BpX21hc3RlciBzcGlfYmZpbl9tYXN0ZXJfaW5mbyA9IHsKKwkubnVtX2NoaXBzZWxlY3QgPSA4LAorCS5lbmFibGVfZG1hICAgICA9IDEsICAvKiBtYXN0ZXIgaGFzIHRoZSBhYmlsaXR5IHRvIGRvIGRtYSB0cmFuc2ZlciAqLworCS5waW5fcmVxICAgICAgICA9IHtQX1NQSTBfU0NLLCBQX1NQSTBfTUlTTywgUF9TUEkwX01PU0ksIDB9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugc3BpX2JmaW5fbWFzdGVyX2RldmljZSA9IHsKKwkubmFtZSAgICAgICAgICA9ICJiZmluLXNwaSIsCisJLmlkICAgICAgICAgICAgPSAwLCAvKiBCdXMgbnVtYmVyICovCisJLm51bV9yZXNvdXJjZXMgPSBBUlJBWV9TSVpFKGJmaW5fc3BpMF9yZXNvdXJjZSksCisJLnJlc291cmNlICAgICAgPSBiZmluX3NwaTBfcmVzb3VyY2UsCisJLmRldiAgICAgICAgICAgPSB7CisJCS5wbGF0Zm9ybV9kYXRhID0gJnNwaV9iZmluX21hc3Rlcl9pbmZvLCAvKiBQYXNzZWQgdG8gZHJpdmVyICovCisJfSwKK307CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX1NFUklBTF9CRklOKSB8fCBkZWZpbmVkKENPTkZJR19TRVJJQUxfQkZJTl9NT0RVTEUpCisjaWZkZWYgQ09ORklHX1NFUklBTF9CRklOX1VBUlQwCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGJmaW5fdWFydDBfcmVzb3VyY2VzW10gPSB7CisJeworCQkuc3RhcnQgPSBVQVJUMF9USFIsCisJCS5lbmQgPSBVQVJUMF9HQ1RMKzIsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJeworCQkuc3RhcnQgPSBJUlFfVUFSVDBfUlgsCisJCS5lbmQgPSBJUlFfVUFSVDBfUlgrMSwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJfSwKKwl7CisJCS5zdGFydCA9IElSUV9VQVJUMF9FUlJPUiwKKwkJLmVuZCA9IElSUV9VQVJUMF9FUlJPUiwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJfSwKKwl7CisJCS5zdGFydCA9IENIX1VBUlQwX1RYLAorCQkuZW5kID0gQ0hfVUFSVDBfVFgsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfRE1BLAorCX0sCisJeworCQkuc3RhcnQgPSBDSF9VQVJUMF9SWCwKKwkJLmVuZCA9IENIX1VBUlQwX1JYLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0RNQSwKKwl9LAorfTsKKworc3RhdGljIHVuc2lnbmVkIHNob3J0IGJmaW5fdWFydDBfcGVyaXBoZXJhbHNbXSA9IHsKKwlQX1VBUlQwX1RYLCBQX1VBUlQwX1JYLCAwCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZmluX3VhcnQwX2RldmljZSA9IHsKKwkubmFtZSA9ICJiZmluLXVhcnQiLAorCS5pZCA9IDAsCisJLm51bV9yZXNvdXJjZXMgPSBBUlJBWV9TSVpFKGJmaW5fdWFydDBfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UgPSBiZmluX3VhcnQwX3Jlc291cmNlcywKKwkuZGV2ID0geworCQkucGxhdGZvcm1fZGF0YSA9ICZiZmluX3VhcnQwX3BlcmlwaGVyYWxzLCAvKiBQYXNzZWQgdG8gZHJpdmVyICovCisJfSwKK307CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19TRVJJQUxfQkZJTl9VQVJUMQorc3RhdGljIHN0cnVjdCByZXNvdXJjZSBiZmluX3VhcnQxX3Jlc291cmNlc1tdID0geworCXsKKwkJLnN0YXJ0ID0gVUFSVDFfVEhSLAorCQkuZW5kICAgPSBVQVJUMV9HQ1RMKzIsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJeworCQkuc3RhcnQgPSBJUlFfVUFSVDFfUlgsCisJCS5lbmQgICA9IElSUV9VQVJUMV9SWCsxLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorCXsKKwkJLnN0YXJ0ID0gSVJRX1VBUlQxX0VSUk9SLAorCQkuZW5kICAgPSBJUlFfVUFSVDFfRVJST1IsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCX0sCisJeworCQkuc3RhcnQgPSBDSF9VQVJUMV9UWCwKKwkJLmVuZCAgID0gQ0hfVUFSVDFfVFgsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfRE1BLAorCX0sCisJeworCQkuc3RhcnQgPSBDSF9VQVJUMV9SWCwKKwkJLmVuZCAgID0gQ0hfVUFSVDFfUlgsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfRE1BLAorCX0sCit9OworCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgYmZpbl91YXJ0MV9wZXJpcGhlcmFsc1tdID0geworCVBfVUFSVDFfVFgsIFBfVUFSVDFfUlgsIDAKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGJmaW5fdWFydDFfZGV2aWNlID0geworCS5uYW1lICAgICAgICAgID0gImJmaW4tdWFydCIsCisJLmlkICAgICAgICAgICAgPSAxLAorCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRShiZmluX3VhcnQxX3Jlc291cmNlcyksCisJLnJlc291cmNlICAgICAgPSBiZmluX3VhcnQxX3Jlc291cmNlcywKKwkuZGV2ID0geworCQkucGxhdGZvcm1fZGF0YSA9ICZiZmluX3VhcnQxX3BlcmlwaGVyYWxzLCAvKiBQYXNzZWQgdG8gZHJpdmVyICovCisJfSwKK307CisjZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfSTJDX0JMQUNLRklOX1RXSSkgfHwgZGVmaW5lZChDT05GSUdfSTJDX0JMQUNLRklOX1RXSV9NT0RVTEUpCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGJmaW5fdHdpMF9yZXNvdXJjZVtdID0geworCVswXSA9IHsKKwkJLnN0YXJ0ID0gVFdJMF9SRUdCQVNFLAorCQkuZW5kICAgPSBUV0kwX1JFR0JBU0UgKyAweGZmLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVsxXSA9IHsKKwkJLnN0YXJ0ID0gSVJRX1RXSSwKKwkJLmVuZCAgID0gSVJRX1RXSSwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGkyY19iZmluX3R3aV9kZXZpY2UgPSB7CisJLm5hbWUgICAgICAgICAgPSAiaTJjLWJmaW4tdHdpIiwKKwkuaWQgICAgICAgICAgICA9IDAsCisJLm51bV9yZXNvdXJjZXMgPSBBUlJBWV9TSVpFKGJmaW5fdHdpMF9yZXNvdXJjZSksCisJLnJlc291cmNlICAgICAgPSBiZmluX3R3aTBfcmVzb3VyY2UsCit9OworI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkbnA1MzcwX2RldmljZXNbXSBfX2luaXRkYXRhID0geworCisjaWYgZGVmaW5lZChDT05GSUdfU0VSSUFMX0JGSU4pIHx8IGRlZmluZWQoQ09ORklHX1NFUklBTF9CRklOX01PRFVMRSkKKyNpZmRlZiBDT05GSUdfU0VSSUFMX0JGSU5fVUFSVDAKKwkmYmZpbl91YXJ0MF9kZXZpY2UsCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfU0VSSUFMX0JGSU5fVUFSVDEKKwkmYmZpbl91YXJ0MV9kZXZpY2UsCisjZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfTVREX1BIWVNNQVApIHx8IGRlZmluZWQoQ09ORklHX01URF9QSFlTTUFQX01PRFVMRSkKKwkmYXNtYl9mbGFzaF9kZXZpY2UsCisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX0JGSU5fTUFDKSB8fCBkZWZpbmVkKENPTkZJR19CRklOX01BQ19NT0RVTEUpCisJJmJmaW5fbWlpX2J1cywKKwkmYmZpbl9tYWNfZGV2aWNlLAorI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19TUElfQkZJTikgfHwgZGVmaW5lZChDT05GSUdfU1BJX0JGSU5fTU9EVUxFKQorCSZzcGlfYmZpbl9tYXN0ZXJfZGV2aWNlLAorI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19JMkNfQkxBQ0tGSU5fVFdJKSB8fCBkZWZpbmVkKENPTkZJR19JMkNfQkxBQ0tGSU5fVFdJX01PRFVMRSkKKwkmaTJjX2JmaW5fdHdpX2RldmljZSwKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfUlRDX0RSVl9CRklOKSB8fCBkZWZpbmVkKENPTkZJR19SVENfRFJWX0JGSU5fTU9EVUxFKQorCSZydGNfZGV2aWNlLAorI2VuZGlmCisKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGRucDUzNzBfaW5pdCh2b2lkKQoreworCXByaW50ayhLRVJOX0lORk8gIkROUC81MzcwOiByZWdpc3RlcmluZyBkZXZpY2UgcmVzb3VyY2VzXG4iKTsKKwlwbGF0Zm9ybV9hZGRfZGV2aWNlcyhkbnA1MzcwX2RldmljZXMsIEFSUkFZX1NJWkUoZG5wNTM3MF9kZXZpY2VzKSk7CisJcHJpbnRrKEtFUk5fSU5GTyAiRE5QLzUzNzA6IHJlZ2lzdGVyaW5nICV6dSBTUEkgc2xhdmUgZGV2aWNlc1xuIiwKKwkgICAgICAgQVJSQVlfU0laRShiZmluX3NwaV9ib2FyZF9pbmZvKSk7CisJc3BpX3JlZ2lzdGVyX2JvYXJkX2luZm8oYmZpbl9zcGlfYm9hcmRfaW5mbywgQVJSQVlfU0laRShiZmluX3NwaV9ib2FyZF9pbmZvKSk7CisJcHJpbnRrKEtFUk5fSU5GTyAiRE5QLzUzNzA6IE1BQyAlcE1cbiIsICh2b2lkICopRkxBU0hfTUFDKTsKKwlyZXR1cm4gMDsKK30KK2FyY2hfaW5pdGNhbGwoZG5wNTM3MF9pbml0KTsKKworLyoKKyAqIEN1cnJlbnRseSB0aGUgTUFDIGFkZHJlc3MgaXMgc2F2ZWQgaW4gRmxhc2ggYnkgVS1Cb290CisgKi8KK3ZvaWQgYmZpbl9nZXRfZXRoZXJfYWRkcihjaGFyICphZGRyKQoreworCSoodTMyICopKCYoYWRkclswXSkpID0gYmZpbl9yZWFkMzIoRkxBU0hfTUFDKTsKKwkqKHUxNiAqKSgmKGFkZHJbNF0pKSA9IGJmaW5fcmVhZDE2KEZMQVNIX01BQyArIDQpOworfQorRVhQT1JUX1NZTUJPTChiZmluX2dldF9ldGhlcl9hZGRyKTsKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9ib2FyZHMvbWlub3RhdXIuYyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9ib2FyZHMvbWlub3RhdXIuYwppbmRleCA0OTgwMDUxLi5iZmIzNjcxIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvYm9hcmRzL21pbm90YXVyLmMKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2JvYXJkcy9taW5vdGF1ci5jCkBAIC0yNjMsNyArMjYzLDcgQEAKIAl9LAogfTsKIAotdW5zaWduZWQgc2hvcnQgYmZpbl91YXJ0MF9wZXJpcGhlcmFsc1tdID0geworc3RhdGljIHVuc2lnbmVkIHNob3J0IGJmaW5fdWFydDBfcGVyaXBoZXJhbHNbXSA9IHsKIAlQX1VBUlQwX1RYLCBQX1VBUlQwX1JYLCAwCiB9OwogCkBAIC0zMDYsNyArMzA2LDcgQEAKIAl9LAogfTsKIAotdW5zaWduZWQgc2hvcnQgYmZpbl91YXJ0MV9wZXJpcGhlcmFsc1tdID0geworc3RhdGljIHVuc2lnbmVkIHNob3J0IGJmaW5fdWFydDFfcGVyaXBoZXJhbHNbXSA9IHsKIAlQX1VBUlQxX1RYLCBQX1VBUlQxX1JYLCAwCiB9OwogCkBAIC00MTksOSArNDE5LDkgQEAKIAl9LAogfTsKIAotdW5zaWduZWQgc2hvcnQgYmZpbl9zcG9ydDBfcGVyaXBoZXJhbHNbXSA9IHsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBiZmluX3Nwb3J0MF9wZXJpcGhlcmFsc1tdID0gewogCVBfU1BPUlQwX1RGUywgUF9TUE9SVDBfRFRQUkksIFBfU1BPUlQwX1RTQ0xLLCBQX1NQT1JUMF9SRlMsCi0JUF9TUE9SVDBfRFJQUkksIFBfU1BPUlQwX1JTQ0xLLCBQX1NQT1JUMF9EUlNFQywgUF9TUE9SVDBfRFRTRUMsIDAKKwlQX1NQT1JUMF9EUlBSSSwgUF9TUE9SVDBfUlNDTEssIDAKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGJmaW5fc3BvcnQwX3VhcnRfZGV2aWNlID0gewpAQCAtNDUzLDkgKzQ1Myw5IEBACiAJfSwKIH07CiAKLXVuc2lnbmVkIHNob3J0IGJmaW5fc3BvcnQxX3BlcmlwaGVyYWxzW10gPSB7CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgYmZpbl9zcG9ydDFfcGVyaXBoZXJhbHNbXSA9IHsKIAlQX1NQT1JUMV9URlMsIFBfU1BPUlQxX0RUUFJJLCBQX1NQT1JUMV9UU0NMSywgUF9TUE9SVDFfUkZTLAotCVBfU1BPUlQxX0RSUFJJLCBQX1NQT1JUMV9SU0NMSywgUF9TUE9SVDFfRFJTRUMsIFBfU1BPUlQxX0RUU0VDLCAwCisJUF9TUE9SVDFfRFJQUkksIFBfU1BPUlQxX1JTQ0xLLCAwCiB9OwogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZmluX3Nwb3J0MV91YXJ0X2RldmljZSA9IHsKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9ib2FyZHMvcG5hdjEwLmMgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvYm9hcmRzL3BuYXYxMC5jCmluZGV4IGI5NTgwNzguLjkzODlmMDMgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9ib2FyZHMvcG5hdjEwLmMKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2JvYXJkcy9wbmF2MTAuYwpAQCAtMzY3LDcgKzM2Nyw3IEBACiAJfSwKIH07CiAKLXVuc2lnbmVkIHNob3J0IGJmaW5fdWFydDBfcGVyaXBoZXJhbHNbXSA9IHsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBiZmluX3VhcnQwX3BlcmlwaGVyYWxzW10gPSB7CiAJUF9VQVJUMF9UWCwgUF9VQVJUMF9SWCwgMAogfTsKIApAQCAtNDEwLDcgKzQxMCw3IEBACiAJfSwKIH07CiAKLXVuc2lnbmVkIHNob3J0IGJmaW5fdWFydDFfcGVyaXBoZXJhbHNbXSA9IHsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBiZmluX3VhcnQxX3BlcmlwaGVyYWxzW10gPSB7CiAJUF9VQVJUMV9UWCwgUF9VQVJUMV9SWCwgMAogfTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2JvYXJkcy9zdGFtcC5jIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2JvYXJkcy9zdGFtcC5jCmluZGV4IDNhYTM0NGMuLjJjNjk3ODUgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9ib2FyZHMvc3RhbXAuYworKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvYm9hcmRzL3N0YW1wLmMKQEAgLTI4OSw3ICsyODksNyBAQAogI2VuZGlmCiAKICNpZiBkZWZpbmVkKENPTkZJR19DQU5fQkZJTikgfHwgZGVmaW5lZChDT05GSUdfQ0FOX0JGSU5fTU9EVUxFKQotdW5zaWduZWQgc2hvcnQgYmZpbl9jYW5fcGVyaXBoZXJhbHNbXSA9IHsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBiZmluX2Nhbl9wZXJpcGhlcmFsc1tdID0gewogCVBfQ0FOMF9SWCwgUF9DQU4wX1RYLCAwCiB9OwogCkBAIC02OTMsNyArNjkzLDcgQEAKICNlbmRpZgogCiAjaWYgZGVmaW5lZChDT05GSUdfQUQyUzEyMFgpIHx8IGRlZmluZWQoQ09ORklHX0FEMlMxMjBYX01PRFVMRSkKLXVuc2lnbmVkIHNob3J0IGFkMnMxMjB4X3BsYXRmb3JtX2RhdGFbXSA9IHsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBhZDJzMTIweF9wbGF0Zm9ybV9kYXRhW10gPSB7CiAJLyogdXNlZCBhcyBTQU1QTEUgYW5kIFJEVkVMICovCiAJR1BJT19QRjUsIEdQSU9fUEY2LCAwCiB9OwpAQCAtNzA1LDcgKzcwNSw3IEBACiAjZW5kaWYKIAogI2lmIGRlZmluZWQoQ09ORklHX0FEMlMxMjEwKSB8fCBkZWZpbmVkKENPTkZJR19BRDJTMTIxMF9NT0RVTEUpCi11bnNpZ25lZCBzaG9ydCBhZDJzMTIxMF9wbGF0Zm9ybV9kYXRhW10gPSB7CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgYWQyczEyMTBfcGxhdGZvcm1fZGF0YVtdID0gewogCS8qIHVzZSBhcyBTQU1QTEUsIEEwLCBBMSAqLwogCUdQSU9fUEY3LCBHUElPX1BGOCwgR1BJT19QRjksCiAjIGlmIGRlZmluZWQoQ09ORklHX0FEMlMxMjEwX0dQSU9fSU5QVVQpIHx8IGRlZmluZWQoQ09ORklHX0FEMlMxMjEwX0dQSU9fT1VUUFVUKQpAQCAtMTcxNyw3ICsxNzE3LDcgQEAKICNlbmRpZgogfTsKIAotdW5zaWduZWQgc2hvcnQgYmZpbl91YXJ0MF9wZXJpcGhlcmFsc1tdID0geworc3RhdGljIHVuc2lnbmVkIHNob3J0IGJmaW5fdWFydDBfcGVyaXBoZXJhbHNbXSA9IHsKIAlQX1VBUlQwX1RYLCBQX1VBUlQwX1JYLCAwCiB9OwogCkBAIC0xNzYwLDcgKzE3NjAsNyBAQAogCX0sCiB9OwogCi11bnNpZ25lZCBzaG9ydCBiZmluX3VhcnQxX3BlcmlwaGVyYWxzW10gPSB7CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgYmZpbl91YXJ0MV9wZXJpcGhlcmFsc1tdID0gewogCVBfVUFSVDFfVFgsIFBfVUFSVDFfUlgsIDAKIH07CiAKQEAgLTI0NDcsOSArMjQ0Nyw5IEBACiAJfSwKIH07CiAKLXVuc2lnbmVkIHNob3J0IGJmaW5fc3BvcnQwX3BlcmlwaGVyYWxzW10gPSB7CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgYmZpbl9zcG9ydDBfcGVyaXBoZXJhbHNbXSA9IHsKIAlQX1NQT1JUMF9URlMsIFBfU1BPUlQwX0RUUFJJLCBQX1NQT1JUMF9UU0NMSywgUF9TUE9SVDBfUkZTLAotCVBfU1BPUlQwX0RSUFJJLCBQX1NQT1JUMF9SU0NMSywgUF9TUE9SVDBfRFJTRUMsIFBfU1BPUlQwX0RUU0VDLCAwCisJUF9TUE9SVDBfRFJQUkksIFBfU1BPUlQwX1JTQ0xLLCAwCiB9OwogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZmluX3Nwb3J0MF91YXJ0X2RldmljZSA9IHsKQEAgLTI0ODEsOSArMjQ4MSw5IEBACiAJfSwKIH07CiAKLXVuc2lnbmVkIHNob3J0IGJmaW5fc3BvcnQxX3BlcmlwaGVyYWxzW10gPSB7CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgYmZpbl9zcG9ydDFfcGVyaXBoZXJhbHNbXSA9IHsKIAlQX1NQT1JUMV9URlMsIFBfU1BPUlQxX0RUUFJJLCBQX1NQT1JUMV9UU0NMSywgUF9TUE9SVDFfUkZTLAotCVBfU1BPUlQxX0RSUFJJLCBQX1NQT1JUMV9SU0NMSywgUF9TUE9SVDFfRFJTRUMsIFBfU1BPUlQxX0RUU0VDLCAwCisJUF9TUE9SVDFfRFJQUkksIFBfU1BPUlQxX1JTQ0xLLCAwCiB9OwogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZmluX3Nwb3J0MV91YXJ0X2RldmljZSA9IHsKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9ib2FyZHMvdGNtX2JmNTM3LmMgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvYm9hcmRzL3RjbV9iZjUzNy5jCmluZGV4IDMxNDk4YWQuLjA3NjFiMjAgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9ib2FyZHMvdGNtX2JmNTM3LmMKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2JvYXJkcy90Y21fYmY1MzcuYwpAQCAtMzU2LDcgKzM1Niw3IEBACiAJfSwKIH07CiAKLXVuc2lnbmVkIHNob3J0IGJmaW5fdWFydDBfcGVyaXBoZXJhbHNbXSA9IHsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBiZmluX3VhcnQwX3BlcmlwaGVyYWxzW10gPSB7CiAJUF9VQVJUMF9UWCwgUF9VQVJUMF9SWCwgMAogfTsKIApAQCAtMzk5LDcgKzM5OSw3IEBACiAJfSwKIH07CiAKLXVuc2lnbmVkIHNob3J0IGJmaW5fdWFydDFfcGVyaXBoZXJhbHNbXSA9IHsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBiZmluX3VhcnQxX3BlcmlwaGVyYWxzW10gPSB7CiAJUF9VQVJUMV9UWCwgUF9VQVJUMV9SWCwgMAogfTsKIApAQCAtNTEyLDkgKzUxMiw5IEBACiAJfSwKIH07CiAKLXVuc2lnbmVkIHNob3J0IGJmaW5fc3BvcnQwX3BlcmlwaGVyYWxzW10gPSB7CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgYmZpbl9zcG9ydDBfcGVyaXBoZXJhbHNbXSA9IHsKIAlQX1NQT1JUMF9URlMsIFBfU1BPUlQwX0RUUFJJLCBQX1NQT1JUMF9UU0NMSywgUF9TUE9SVDBfUkZTLAotCVBfU1BPUlQwX0RSUFJJLCBQX1NQT1JUMF9SU0NMSywgUF9TUE9SVDBfRFJTRUMsIFBfU1BPUlQwX0RUU0VDLCAwCisJUF9TUE9SVDBfRFJQUkksIFBfU1BPUlQwX1JTQ0xLLCAwCiB9OwogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZmluX3Nwb3J0MF91YXJ0X2RldmljZSA9IHsKQEAgLTU0Niw5ICs1NDYsOSBAQAogCX0sCiB9OwogCi11bnNpZ25lZCBzaG9ydCBiZmluX3Nwb3J0MV9wZXJpcGhlcmFsc1tdID0geworc3RhdGljIHVuc2lnbmVkIHNob3J0IGJmaW5fc3BvcnQxX3BlcmlwaGVyYWxzW10gPSB7CiAJUF9TUE9SVDFfVEZTLCBQX1NQT1JUMV9EVFBSSSwgUF9TUE9SVDFfVFNDTEssIFBfU1BPUlQxX1JGUywKLQlQX1NQT1JUMV9EUlBSSSwgUF9TUE9SVDFfUlNDTEssIFBfU1BPUlQxX0RSU0VDLCBQX1NQT1JUMV9EVFNFQywgMAorCVBfU1BPUlQxX0RSUFJJLCBQX1NQT1JUMV9SU0NMSywgMAogfTsKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYmZpbl9zcG9ydDFfdWFydF9kZXZpY2UgPSB7CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvZG1hLmMgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvZG1hLmMKaW5kZXggNWM4YzRlZC4uNWM2MmU5OSAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2RtYS5jCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9kbWEuYwpAQCAtMTEsNyArMTEsNyBAQAogI2luY2x1ZGUgPGFzbS9ibGFja2Zpbi5oPgogI2luY2x1ZGUgPGFzbS9kbWEuaD4KIAotc3RydWN0IGRtYV9yZWdpc3RlciAqZG1hX2lvX2Jhc2VfYWRkcltNQVhfRE1BX0NIQU5ORUxTXSA9IHsKK3N0cnVjdCBkbWFfcmVnaXN0ZXIgKiBjb25zdCBkbWFfaW9fYmFzZV9hZGRyW01BWF9ETUFfQ0hBTk5FTFNdID0gewogCShzdHJ1Y3QgZG1hX3JlZ2lzdGVyICopIERNQTBfTkVYVF9ERVNDX1BUUiwKIAkoc3RydWN0IGRtYV9yZWdpc3RlciAqKSBETUExX05FWFRfREVTQ19QVFIsCiAJKHN0cnVjdCBkbWFfcmVnaXN0ZXIgKikgRE1BMl9ORVhUX0RFU0NfUFRSLApkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2luY2x1ZGUvbWFjaC9iZmluX3NlcmlhbC5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2luY2x1ZGUvbWFjaC9iZmluX3NlcmlhbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwYzYwM2YKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvaW5jbHVkZS9tYWNoL2JmaW5fc2VyaWFsLmgKQEAgLTAsMCArMSwxNCBAQAorLyoKKyAqIG1hY2gvYmZpbl9zZXJpYWwuaCAtIEJsYWNrZmluIFVBUlQvU2VyaWFsIGRlZmluaXRpb25zCisgKgorICogQ29weXJpZ2h0IDIwMDYtMjAxMCBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgorICovCisKKyNpZm5kZWYgX19CRklOX01BQ0hfU0VSSUFMX0hfXworI2RlZmluZSBfX0JGSU5fTUFDSF9TRVJJQUxfSF9fCisKKyNkZWZpbmUgQkZJTl9VQVJUX05SX1BPUlRTCTIKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvaW5jbHVkZS9tYWNoL2JmaW5fc2VyaWFsXzV4eC5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2luY2x1ZGUvbWFjaC9iZmluX3NlcmlhbF81eHguaAppbmRleCA2MzVjOTFjLi4zZTk1NWRiIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvaW5jbHVkZS9tYWNoL2JmaW5fc2VyaWFsXzV4eC5oCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9pbmNsdWRlL21hY2gvYmZpbl9zZXJpYWxfNXh4LmgKQEAgLTQsMzYgKzQsOSBAQAogICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyCiAgKi8KIAotI2luY2x1ZGUgPGxpbnV4L3NlcmlhbC5oPgogI2luY2x1ZGUgPGFzbS9kbWEuaD4KICNpbmNsdWRlIDxhc20vcG9ydG11eC5oPgogCi0jZGVmaW5lIFVBUlRfR0VUX0NIQVIodWFydCkgICAgIGJmaW5fcmVhZDE2KCgodWFydCktPnBvcnQubWVtYmFzZSArIE9GRlNFVF9SQlIpKQotI2RlZmluZSBVQVJUX0dFVF9ETEwodWFydCkJYmZpbl9yZWFkMTYoKCh1YXJ0KS0+cG9ydC5tZW1iYXNlICsgT0ZGU0VUX0RMTCkpCi0jZGVmaW5lIFVBUlRfR0VUX0lFUih1YXJ0KSAgICAgIGJmaW5fcmVhZDE2KCgodWFydCktPnBvcnQubWVtYmFzZSArIE9GRlNFVF9JRVIpKQotI2RlZmluZSBVQVJUX0dFVF9ETEgodWFydCkJYmZpbl9yZWFkMTYoKCh1YXJ0KS0+cG9ydC5tZW1iYXNlICsgT0ZGU0VUX0RMSCkpCi0jZGVmaW5lIFVBUlRfR0VUX0lJUih1YXJ0KSAgICAgIGJmaW5fcmVhZDE2KCgodWFydCktPnBvcnQubWVtYmFzZSArIE9GRlNFVF9JSVIpKQotI2RlZmluZSBVQVJUX0dFVF9MQ1IodWFydCkgICAgICBiZmluX3JlYWQxNigoKHVhcnQpLT5wb3J0Lm1lbWJhc2UgKyBPRkZTRVRfTENSKSkKLSNkZWZpbmUgVUFSVF9HRVRfR0NUTCh1YXJ0KSAgICAgYmZpbl9yZWFkMTYoKCh1YXJ0KS0+cG9ydC5tZW1iYXNlICsgT0ZGU0VUX0dDVEwpKQotCi0jZGVmaW5lIFVBUlRfUFVUX0NIQVIodWFydCx2KSAgIGJmaW5fd3JpdGUxNigoKHVhcnQpLT5wb3J0Lm1lbWJhc2UgKyBPRkZTRVRfVEhSKSx2KQotI2RlZmluZSBVQVJUX1BVVF9ETEwodWFydCx2KSAgICBiZmluX3dyaXRlMTYoKCh1YXJ0KS0+cG9ydC5tZW1iYXNlICsgT0ZGU0VUX0RMTCksdikKLSNkZWZpbmUgVUFSVF9QVVRfSUVSKHVhcnQsdikgICAgYmZpbl93cml0ZTE2KCgodWFydCktPnBvcnQubWVtYmFzZSArIE9GRlNFVF9JRVIpLHYpCi0jZGVmaW5lIFVBUlRfU0VUX0lFUih1YXJ0LHYpICAgIFVBUlRfUFVUX0lFUih1YXJ0LCBVQVJUX0dFVF9JRVIodWFydCkgfCAodikpCi0jZGVmaW5lIFVBUlRfQ0xFQVJfSUVSKHVhcnQsdikgIFVBUlRfUFVUX0lFUih1YXJ0LCBVQVJUX0dFVF9JRVIodWFydCkgJiB+KHYpKQotI2RlZmluZSBVQVJUX1BVVF9ETEgodWFydCx2KSAgICBiZmluX3dyaXRlMTYoKCh1YXJ0KS0+cG9ydC5tZW1iYXNlICsgT0ZGU0VUX0RMSCksdikKLSNkZWZpbmUgVUFSVF9QVVRfTENSKHVhcnQsdikgICAgYmZpbl93cml0ZTE2KCgodWFydCktPnBvcnQubWVtYmFzZSArIE9GRlNFVF9MQ1IpLHYpCi0jZGVmaW5lIFVBUlRfUFVUX0dDVEwodWFydCx2KSAgIGJmaW5fd3JpdGUxNigoKHVhcnQpLT5wb3J0Lm1lbWJhc2UgKyBPRkZTRVRfR0NUTCksdikKLQotI2RlZmluZSBVQVJUX1NFVF9ETEFCKHVhcnQpICAgICBkbyB7IFVBUlRfUFVUX0xDUih1YXJ0LCBVQVJUX0dFVF9MQ1IodWFydCkgfCBETEFCKTsgU1NZTkMoKTsgfSB3aGlsZSAoMCkKLSNkZWZpbmUgVUFSVF9DTEVBUl9ETEFCKHVhcnQpICAgZG8geyBVQVJUX1BVVF9MQ1IodWFydCwgVUFSVF9HRVRfTENSKHVhcnQpICYgfkRMQUIpOyBTU1lOQygpOyB9IHdoaWxlICgwKQotCi0jZGVmaW5lIFVBUlRfR0VUX0NUUyh4KSBncGlvX2dldF92YWx1ZSh4LT5jdHNfcGluKQotI2RlZmluZSBVQVJUX0RJU0FCTEVfUlRTKHgpIGdwaW9fc2V0X3ZhbHVlKHgtPnJ0c19waW4sIDEpCi0jZGVmaW5lIFVBUlRfRU5BQkxFX1JUUyh4KSBncGlvX3NldF92YWx1ZSh4LT5ydHNfcGluLCAwKQotI2RlZmluZSBVQVJUX0VOQUJMRV9JTlRTKHgsIHYpIFVBUlRfUFVUX0lFUih4LCB2KQotI2RlZmluZSBVQVJUX0RJU0FCTEVfSU5UUyh4KSBVQVJUX1BVVF9JRVIoeCwgMCkKLQogI2lmIGRlZmluZWQoQ09ORklHX0JGSU5fVUFSVDBfQ1RTUlRTKSB8fCBkZWZpbmVkKENPTkZJR19CRklOX1VBUlQxX0NUU1JUUykKICMgZGVmaW5lIENPTkZJR19TRVJJQUxfQkZJTl9DVFNSVFMKIApAQCAtNTQsNDkgKzI3LDYgQEAKICMgZW5kaWYKICNlbmRpZgogCi0jZGVmaW5lIEJGSU5fVUFSVF9UWF9GSUZPX1NJWkUJMgotCi0vKgotICogVGhlIHBpbiBjb25maWd1cmF0aW9uIGlzIGRpZmZlcmVudCBmcm9tIHNjaGVtYXRpYwotICovCi1zdHJ1Y3QgYmZpbl9zZXJpYWxfcG9ydCB7Ci0gICAgICAgIHN0cnVjdCB1YXJ0X3BvcnQgICAgICAgIHBvcnQ7Ci0gICAgICAgIHVuc2lnbmVkIGludCAgICAgICAgICAgIG9sZF9zdGF0dXM7Ci0JaW50CQkJc3RhdHVzX2lycTsKLQl1bnNpZ25lZCBpbnQgbHNyOwotI2lmZGVmIENPTkZJR19TRVJJQUxfQkZJTl9ETUEKLQlpbnQJCQl0eF9kb25lOwotCWludAkJCXR4X2NvdW50OwotCXN0cnVjdCBjaXJjX2J1ZgkJcnhfZG1hX2J1ZjsKLQlzdHJ1Y3QgdGltZXJfbGlzdCAgICAgICByeF9kbWFfdGltZXI7Ci0JaW50CQkJcnhfZG1hX25yb3dzOwotCXVuc2lnbmVkIGludAkJdHhfZG1hX2NoYW5uZWw7Ci0JdW5zaWduZWQgaW50CQlyeF9kbWFfY2hhbm5lbDsKLQlzdHJ1Y3Qgd29ya19zdHJ1Y3QJdHhfZG1hX3dvcmtxdWV1ZTsKLSNlbmRpZgotI2lmZGVmIENPTkZJR19TRVJJQUxfQkZJTl9DVFNSVFMKLQlpbnQJCWN0c19waW47Ci0JaW50IAkJcnRzX3BpbjsKLSNlbmRpZgotfTsKLQotLyogVGhlIGhhcmR3YXJlIGNsZWFycyB0aGUgTFNSIGJpdHMgdXBvbiByZWFkLCBzbyB3ZSBuZWVkIHRvIGNhY2hlCi0gKiBzb21lIG9mIHRoZSBtb3JlIGZ1biBiaXRzIGluIHNvZnR3YXJlIHNvIHRoZXkgZG9uJ3QgZ2V0IGxvc3QKLSAqIHdoZW4gY2hlY2tpbmcgdGhlIExTUiBpbiBvdGhlciBjb2RlIHBhdGhzIChUWCkuCi0gKi8KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IFVBUlRfR0VUX0xTUihzdHJ1Y3QgYmZpbl9zZXJpYWxfcG9ydCAqdWFydCkKLXsKLQl1bnNpZ25lZCBpbnQgbHNyID0gYmZpbl9yZWFkMTYodWFydC0+cG9ydC5tZW1iYXNlICsgT0ZGU0VUX0xTUik7Ci0JdWFydC0+bHNyIHw9IChsc3IgJiAoQkl8RkV8UEV8T0UpKTsKLQlyZXR1cm4gbHNyIHwgdWFydC0+bHNyOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgVUFSVF9DTEVBUl9MU1Ioc3RydWN0IGJmaW5fc2VyaWFsX3BvcnQgKnVhcnQpCi17Ci0JdWFydC0+bHNyID0gMDsKLQliZmluX3dyaXRlMTYodWFydC0+cG9ydC5tZW1iYXNlICsgT0ZGU0VUX0xTUiwgLTEpOwotfQotCiBzdHJ1Y3QgYmZpbl9zZXJpYWxfcmVzIHsKIAl1bnNpZ25lZCBsb25nCXVhcnRfYmFzZV9hZGRyOwogCWludAkJdWFydF9pcnE7CkBAIC0xNDUsMyArNzUsNSBAQAogfTsKIAogI2RlZmluZSBEUklWRVJfTkFNRSAiYmZpbi11YXJ0IgorCisjaW5jbHVkZSA8YXNtL2JmaW5fc2VyaWFsLmg+CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvaW5jbHVkZS9tYWNoL2JsYWNrZmluLmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvaW5jbHVkZS9tYWNoL2JsYWNrZmluLmgKaW5kZXggYTEyZDRiNi4uYmFhMDk2ZiAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2luY2x1ZGUvbWFjaC9ibGFja2Zpbi5oCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9pbmNsdWRlL21hY2gvYmxhY2tmaW4uaApAQCAtMSw3ICsxLDcgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNS0yMDA5IEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqIENvcHlyaWdodCAyMDA1LTIwMTAgQW5hbG9nIERldmljZXMgSW5jLgogICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlcgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgogICovCiAKICNpZm5kZWYgX01BQ0hfQkxBQ0tGSU5fSF8KQEAgLTEwLDM0ICsxMCwyNCBAQAogI2RlZmluZSBCRjUzN19GQU1JTFkKIAogI2luY2x1ZGUgImJmNTM3LmgiCi0jaW5jbHVkZSAiZGVmQkY1MzQuaCIKICNpbmNsdWRlICJhbm9tYWx5LmgiCiAKKyNpbmNsdWRlIDxhc20vZGVmX0xQQmxhY2tmaW4uaD4KKyNpZmRlZiBDT05GSUdfQkY1MzQKKyMgaW5jbHVkZSAiZGVmQkY1MzQuaCIKKyNlbmRpZgogI2lmIGRlZmluZWQoQ09ORklHX0JGNTM3KSB8fCBkZWZpbmVkKENPTkZJR19CRjUzNikKLSNpbmNsdWRlICJkZWZCRjUzNy5oIgorIyBpbmNsdWRlICJkZWZCRjUzNy5oIgogI2VuZGlmCiAKICNpZiAhZGVmaW5lZChfX0FTU0VNQkxZX18pCi0jaW5jbHVkZSAiY2RlZkJGNTM0LmgiCi0KLSNpZiBkZWZpbmVkKENPTkZJR19CRjUzNykgfHwgZGVmaW5lZChDT05GSUdfQkY1MzYpCi0jaW5jbHVkZSAiY2RlZkJGNTM3LmgiCisjIGluY2x1ZGUgPGFzbS9jZGVmX0xQQmxhY2tmaW4uaD4KKyMgaWZkZWYgQ09ORklHX0JGNTM0CisjICBpbmNsdWRlICJjZGVmQkY1MzQuaCIKKyMgZW5kaWYKKyMgaWYgZGVmaW5lZChDT05GSUdfQkY1MzcpIHx8IGRlZmluZWQoQ09ORklHX0JGNTM2KQorIyAgaW5jbHVkZSAiY2RlZkJGNTM3LmgiCisjIGVuZGlmCiAjZW5kaWYKLSNlbmRpZgotCi0jZGVmaW5lIEJGSU5fVUFSVF9OUl9QT1JUUwkyCi0KLSNkZWZpbmUgT0ZGU0VUX1RIUiAgICAgICAgICAgICAgMHgwMAkvKiBUcmFuc21pdCBIb2xkaW5nIHJlZ2lzdGVyICAgICAgICAgICAgKi8KLSNkZWZpbmUgT0ZGU0VUX1JCUiAgICAgICAgICAgICAgMHgwMAkvKiBSZWNlaXZlIEJ1ZmZlciByZWdpc3RlciAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgT0ZGU0VUX0RMTCAgICAgICAgICAgICAgMHgwMAkvKiBEaXZpc29yIExhdGNoIChMb3ctQnl0ZSkgICAgICAgICAgICAgKi8KLSNkZWZpbmUgT0ZGU0VUX0lFUiAgICAgICAgICAgICAgMHgwNAkvKiBJbnRlcnJ1cHQgRW5hYmxlIFJlZ2lzdGVyICAgICAgICAgICAgKi8KLSNkZWZpbmUgT0ZGU0VUX0RMSCAgICAgICAgICAgICAgMHgwNAkvKiBEaXZpc29yIExhdGNoIChIaWdoLUJ5dGUpICAgICAgICAgICAgKi8KLSNkZWZpbmUgT0ZGU0VUX0lJUiAgICAgICAgICAgICAgMHgwOAkvKiBJbnRlcnJ1cHQgSWRlbnRpZmljYXRpb24gUmVnaXN0ZXIgICAgKi8KLSNkZWZpbmUgT0ZGU0VUX0xDUiAgICAgICAgICAgICAgMHgwQwkvKiBMaW5lIENvbnRyb2wgUmVnaXN0ZXIgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgT0ZGU0VUX01DUiAgICAgICAgICAgICAgMHgxMAkvKiBNb2RlbSBDb250cm9sIFJlZ2lzdGVyICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgT0ZGU0VUX0xTUiAgICAgICAgICAgICAgMHgxNAkvKiBMaW5lIFN0YXR1cyBSZWdpc3RlciAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgT0ZGU0VUX01TUiAgICAgICAgICAgICAgMHgxOAkvKiBNb2RlbSBTdGF0dXMgUmVnaXN0ZXIgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgT0ZGU0VUX1NDUiAgICAgICAgICAgICAgMHgxQwkvKiBTQ1IgU2NyYXRjaCBSZWdpc3RlciAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgT0ZGU0VUX0dDVEwgICAgICAgICAgICAgMHgyNAkvKiBHbG9iYWwgQ29udHJvbCBSZWdpc3RlciAgICAgICAgICAgICAgKi8KIAogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvaW5jbHVkZS9tYWNoL2NkZWZCRjUzNC5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2luY2x1ZGUvbWFjaC9jZGVmQkY1MzQuaAppbmRleCBmYmViMzVlLi41NjNlZGU5IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvaW5jbHVkZS9tYWNoL2NkZWZCRjUzNC5oCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9pbmNsdWRlL21hY2gvY2RlZkJGNTM0LmgKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDUtMjAwOCBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDEwIEFuYWxvZyBEZXZpY2VzIEluYy4KICAqCiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIKICAqLwpAQCAtNywxNCArNyw2IEBACiAjaWZuZGVmIF9DREVGX0JGNTM0X0gKICNkZWZpbmUgX0NERUZfQkY1MzRfSAogCi0jaW5jbHVkZSA8YXNtL2JsYWNrZmluLmg+Ci0KLS8qIEluY2x1ZGUgYWxsIENvcmUgcmVnaXN0ZXJzIGFuZCBiaXQgZGVmaW5pdGlvbnMgCQkJCQkJCQkJKi8KLSNpbmNsdWRlICJkZWZCRjUzNC5oIgotCi0vKiBJbmNsdWRlIGNvcmUgc3BlY2lmaWMgcmVnaXN0ZXIgcG9pbnRlciBkZWZpbml0aW9ucyAJCQkJCQkJCSovCi0jaW5jbHVkZSA8YXNtL2NkZWZfTFBCbGFja2Zpbi5oPgotCiAvKiBDbG9jayBhbmQgU3lzdGVtIENvbnRyb2wJKDB4RkZDMDAwMDAgLSAweEZGQzAwMEZGKQkJCQkJCQkJKi8KICNkZWZpbmUgYmZpbl9yZWFkX1BMTF9DVEwoKSAgICAgICAgICAgICAgICAgIGJmaW5fcmVhZDE2KFBMTF9DVEwpCiAjZGVmaW5lIGJmaW5fcmVhZF9QTExfRElWKCkgICAgICAgICAgICAgICAgICBiZmluX3JlYWQxNihQTExfRElWKQpAQCAtMzU1LDE2ICszNDcsMTAgQEAKICNkZWZpbmUgYmZpbl93cml0ZV9FQklVX1NEU1RBVCh2YWwpICAgICAgICAgIGJmaW5fd3JpdGUxNihFQklVX1NEU1RBVCx2YWwpCiAKIC8qIERNQSBUcmFmZmljIENvbnRyb2wgUmVnaXN0ZXJzCQkJCQkJCQkJCQkJCSovCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUFfVENfUEVSKCkgICAgICAgICAgICAgICAgYmZpbl9yZWFkMTYoRE1BX1RDX1BFUikKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUFfVENfUEVSKHZhbCkgICAgICAgICAgICBiZmluX3dyaXRlMTYoRE1BX1RDX1BFUix2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUFfVENfQ05UKCkgICAgICAgICAgICAgICAgYmZpbl9yZWFkMTYoRE1BX1RDX0NOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUFfVENfQ05UKHZhbCkgICAgICAgICAgICBiZmluX3dyaXRlMTYoRE1BX1RDX0NOVCx2YWwpCi0KLS8qIEFsdGVybmF0ZSBkZXByZWNhdGVkIHJlZ2lzdGVyIG5hbWVzIChiZWxvdykgcHJvdmlkZWQgZm9yIGJhY2t3YXJkcyBjb2RlIGNvbXBhdGliaWxpdHkgKi8KLSNkZWZpbmUgYmZpbl9yZWFkX0RNQV9UQ1BFUigpICAgICAgICAgICAgICAgIGJmaW5fcmVhZDE2KERNQV9UQ1BFUikKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUFfVENQRVIodmFsKSAgICAgICAgICAgIGJmaW5fd3JpdGUxNihETUFfVENQRVIsdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BX1RDQ05UKCkgICAgICAgICAgICAgICAgYmZpbl9yZWFkMTYoRE1BX1RDQ05UKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQV9UQ0NOVCh2YWwpICAgICAgICAgICAgYmZpbl93cml0ZTE2KERNQV9UQ0NOVCx2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUFDX1RDX1BFUigpICAgICAgICAgICAgICBiZmluX3JlYWQxNihETUFDX1RDX1BFUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUFDX1RDX1BFUih2YWwpICAgICAgICAgIGJmaW5fd3JpdGUxNihETUFDX1RDX1BFUix2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUFDX1RDX0NOVCgpICAgICAgICAgICAgICBiZmluX3JlYWQxNihETUFDX1RDX0NOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUFDX1RDX0NOVCh2YWwpICAgICAgICAgIGJmaW5fd3JpdGUxNihETUFDX1RDX0NOVCx2YWwpCiAKIC8qIERNQSBDb250cm9sbGVyCQkJCQkJCQkJCQkJCQkJCQkqLwogI2RlZmluZSBiZmluX3JlYWRfRE1BMF9DT05GSUcoKSAgICAgICAgICAgICAgYmZpbl9yZWFkMTYoRE1BMF9DT05GSUcpCkBAIC0xNzQ3LDcgKzE3MzMsNCBAQAogI2RlZmluZSBiZmluX3JlYWRfSE1ETUExX0JDT1VOVCgpICAgICAgICAgICAgYmZpbl9yZWFkMTYoSE1ETUExX0JDT1VOVCkKICNkZWZpbmUgYmZpbl93cml0ZV9ITURNQTFfQkNPVU5UKHZhbCkgICAgICAgIGJmaW5fd3JpdGUxNihITURNQTFfQkNPVU5ULHZhbCkKIAotLyogVGhlc2UgbmVlZCB0byBiZSBsYXN0IGR1ZSB0byB0aGUgY2RlZi9saW51eCBpbnRlci1kZXBlbmRlbmNpZXMgKi8KLSNpbmNsdWRlIDxhc20vaXJxLmg+Ci0KICNlbmRpZgkJCQkvKiBfQ0RFRl9CRjUzNF9IICovCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvaW5jbHVkZS9tYWNoL2NkZWZCRjUzNy5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2luY2x1ZGUvbWFjaC9jZGVmQkY1MzcuaAppbmRleCA5MzYzYzM5Li4xOWVjMjFlIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvaW5jbHVkZS9tYWNoL2NkZWZCRjUzNy5oCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9pbmNsdWRlL21hY2gvY2RlZkJGNTM3LmgKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDUtMjAwOCBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDEwIEFuYWxvZyBEZXZpY2VzIEluYy4KICAqCiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIKICAqLwpAQCAtMTAsOSArMTAsNiBAQAogLyogSW5jbHVkZSBNTVJzIENvbW1vbiB0byBCRjUzNCAJCQkJCQkJCSovCiAjaW5jbHVkZSAiY2RlZkJGNTM0LmgiCiAKLS8qIEluY2x1ZGUgYWxsIENvcmUgcmVnaXN0ZXJzIGFuZCBiaXQgZGVmaW5pdGlvbnMgCQkJCQkJCQkJKi8KLSNpbmNsdWRlICJkZWZCRjUzNy5oIgotCiAvKiBJbmNsdWRlIE1hY3JvICJEZWZpbmVzIiBGb3IgRU1BQyAoVW5pcXVlIHRvIEJGNTM2L0JGNTM3CQkqLwogLyogMTAvMTAwIEV0aGVybmV0IENvbnRyb2xsZXIJKDB4RkZDMDMwMDAgLSAweEZGQzAzMUZGKSAJCQkJCQkqLwogI2RlZmluZSBiZmluX3JlYWRfRU1BQ19PUE1PREUoKSAgICAgICAgICAgICAgYmZpbl9yZWFkMzIoRU1BQ19PUE1PREUpCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvaW5jbHVkZS9tYWNoL2RlZkJGNTM0LmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvaW5jbHVkZS9tYWNoL2RlZkJGNTM0LmgKaW5kZXggMDMyM2U2Yi4uMzI1MjlhMCAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2luY2x1ZGUvbWFjaC9kZWZCRjUzNC5oCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9pbmNsdWRlL21hY2gvZGVmQkY1MzQuaApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNS0yMDA4IEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqIENvcHlyaWdodCAyMDA1LTIwMTAgQW5hbG9nIERldmljZXMgSW5jLgogICoKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBREkgQlNEIGxpY2Vuc2Ugb3IgdGhlIEdQTC0yIChvciBsYXRlcikKICAqLwpAQCAtNyw5ICs3LDYgQEAKICNpZm5kZWYgX0RFRl9CRjUzNF9ICiAjZGVmaW5lIF9ERUZfQkY1MzRfSAogCi0vKiBJbmNsdWRlIGFsbCBDb3JlIHJlZ2lzdGVycyBhbmQgYml0IGRlZmluaXRpb25zICovCi0jaW5jbHVkZSA8YXNtL2RlZl9MUEJsYWNrZmluLmg+Ci0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoqIFN5c3RlbSBNTVIgUmVnaXN0ZXIgTWFwCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMTkzLDEyICsxOTAsOCBAQAogI2RlZmluZSBFQklVX1NEU1RBVAkJCTB4RkZDMDBBMUMJLyogU0RSQU0gU3RhdHVzIFJlZ2lzdGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIAogLyogRE1BIFRyYWZmaWMgQ29udHJvbCBSZWdpc3RlcnMJCQkJCQkJCQkJCQkJKi8KLSNkZWZpbmUgRE1BX1RDX1BFUgkJCTB4RkZDMDBCMEMJLyogVHJhZmZpYyBDb250cm9sIFBlcmlvZHMgUmVnaXN0ZXIJCQkqLwotI2RlZmluZSBETUFfVENfQ05UCQkJMHhGRkMwMEIxMAkvKiBUcmFmZmljIENvbnRyb2wgQ3VycmVudCBDb3VudHMgUmVnaXN0ZXIJKi8KLQotLyogQWx0ZXJuYXRlIGRlcHJlY2F0ZWQgcmVnaXN0ZXIgbmFtZXMgKGJlbG93KSBwcm92aWRlZCBmb3IgYmFja3dhcmRzIGNvZGUgY29tcGF0aWJpbGl0eSAqLwotI2RlZmluZSBETUFfVENQRVIJCQkweEZGQzAwQjBDCS8qIFRyYWZmaWMgQ29udHJvbCBQZXJpb2RzIFJlZ2lzdGVyCQkJKi8KLSNkZWZpbmUgRE1BX1RDQ05UCQkJMHhGRkMwMEIxMAkvKiBUcmFmZmljIENvbnRyb2wgQ3VycmVudCBDb3VudHMgUmVnaXN0ZXIJKi8KKyNkZWZpbmUgRE1BQ19UQ19QRVIJCQkweEZGQzAwQjBDCS8qIFRyYWZmaWMgQ29udHJvbCBQZXJpb2RzIFJlZ2lzdGVyCQkJKi8KKyNkZWZpbmUgRE1BQ19UQ19DTlQJCQkweEZGQzAwQjEwCS8qIFRyYWZmaWMgQ29udHJvbCBDdXJyZW50IENvdW50cyBSZWdpc3RlcgkqLwogCiAvKiBETUEgQ29udHJvbGxlciAoMHhGRkMwMEMwMCAtIDB4RkZDMDBGRkYpCQkJCQkJCQkJCQkJCQkJKi8KICNkZWZpbmUgRE1BMF9ORVhUX0RFU0NfUFRSCQkweEZGQzAwQzAwCS8qIERNQSBDaGFubmVsIDAgTmV4dCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIgICAgICAgICAgICAgICAqLwpAQCAtMTAyOSw0OCArMTAyMiw2IEBACiAjZGVmaW5lIElXUl9FTkFCTEUoeCkJKDEgPDwgKCh4KSYweDFGKSkJLyogV2FrZXVwIEVuYWJsZSBQZXJpcGhlcmFsICN4ICAgICAgICAgICovCiAjZGVmaW5lIElXUl9ESVNBQkxFKHgpCSgweEZGRkZGRkZGIF4gKDEgPDwgKCh4KSYweDFGKSkpCS8qIFdha2V1cCBEaXNhYmxlIFBlcmlwaGVyYWwgI3ggICAgICAgICAqLwogCi0vKiAqKioqKioqKioqKioqKiBVQVJUIENPTlRST0xMRVIgTUFTS1MgKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIFVBUlR4X0xDUiBNYXNrcwkJCQkJCQkJCQkJCSovCi0jZGVmaW5lIFdMUyh4KQkJKCgoeCktNSkgJiAweDAzKQkvKiBXb3JkIExlbmd0aCBTZWxlY3QgICAqLwotI2RlZmluZSBTVEIJCQkweDA0CS8qIFN0b3AgQml0cyAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgUEVOCQkJMHgwOAkvKiBQYXJpdHkgRW5hYmxlICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIEVQUwkJCTB4MTAJLyogRXZlbiBQYXJpdHkgU2VsZWN0ICAgKi8KLSNkZWZpbmUgU1RQCQkJMHgyMAkvKiBTdGljayBQYXJpdHkgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIFNCCQkJMHg0MAkvKiBTZXQgQnJlYWsgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIERMQUIJCTB4ODAJLyogRGl2aXNvciBMYXRjaCBBY2Nlc3MgKi8KLQotLyogVUFSVHhfTUNSIE1hc2sJCQkJCQkJCQkJKi8KLSNkZWZpbmUgTE9PUF9FTkEJCTB4MTAJLyogTG9vcGJhY2sgTW9kZSBFbmFibGUgICAgICAgICAqLwotI2RlZmluZSBMT09QX0VOQV9QCTB4MDQKLS8qIFVBUlR4X0xTUiBNYXNrcwkJCQkJCQkJCQkqLwotI2RlZmluZSBEUgkJCTB4MDEJLyogRGF0YSBSZWFkeSAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIE9FCQkJMHgwMgkvKiBPdmVycnVuIEVycm9yICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgUEUJCQkweDA0CS8qIFBhcml0eSBFcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBGRQkJCTB4MDgJLyogRnJhbWluZyBFcnJvciAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIEJJCQkJMHgxMAkvKiBCcmVhayBJbnRlcnJ1cHQgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgVEhSRQkJMHgyMAkvKiBUSFIgRW1wdHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgVEVNVAkJMHg0MAkvKiBUU1IgYW5kIFVBUlRfVEhSIEVtcHR5ICAgICAgICovCi0KLS8qIFVBUlR4X0lFUiBNYXNrcwkJCQkJCQkJCQkJCQkJCSovCi0jZGVmaW5lIEVSQkZJCQkweDAxCS8qIEVuYWJsZSBSZWNlaXZlIEJ1ZmZlciBGdWxsIEludGVycnVwdCAgICAgICAgICovCi0jZGVmaW5lIEVUQkVJCQkweDAyCS8qIEVuYWJsZSBUcmFuc21pdCBCdWZmZXIgRW1wdHkgSW50ZXJydXB0ICAgICAgICovCi0jZGVmaW5lIEVMU0kJCTB4MDQJLyogRW5hYmxlIFJYIFN0YXR1cyBJbnRlcnJ1cHQgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0vKiBVQVJUeF9JSVIgTWFza3MJCQkJCQkJCQkJCQkJCSovCi0jZGVmaW5lIE5JTlQJCTB4MDEJLyogUGVuZGluZyBJbnRlcnJ1cHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBJSVJfVFhfUkVBRFkgICAgMHgwMgkvKiBVQVJUX1RIUiBlbXB0eSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBJSVJfUlhfUkVBRFkgICAgMHgwNAkvKiBSZWNlaXZlIGRhdGEgcmVhZHkgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBJSVJfTElORV9DSEFOR0UgMHgwNgkvKiBSZWNlaXZlIGxpbmUgc3RhdHVzICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBJSVJfU1RBVFVTCTB4MDYKLQotLyogVUFSVHhfR0NUTCBNYXNrcwkJCQkJCQkJCQkJCQkqLwotI2RlZmluZSBVQ0VOCQkweDAxCS8qIEVuYWJsZSBVQVJUeCBDbG9ja3MgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIElSRU4JCTB4MDIJLyogRW5hYmxlIElyREEgTW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBUUE9MQwkJMHgwNAkvKiBJckRBIFRYIFBvbGFyaXR5IENoYW5nZSAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBSUE9MQwkJMHgwOAkvKiBJckRBIFJYIFBvbGFyaXR5IENoYW5nZSAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBGUEUJCQkweDEwCS8qIEZvcmNlIFBhcml0eSBFcnJvciBPbiBUcmFuc21pdCAgICAgICAqLwotI2RlZmluZSBGRkUJCQkweDIwCS8qIEZvcmNlIEZyYW1pbmcgRXJyb3IgT24gVHJhbnNtaXQgICAgICAqLwotCiAvKiAgKioqKioqKioqKioqKioqKiAgR0VORVJBTCBQVVJQT1NFIFRJTUVSIE1BU0tTICAqKioqKioqKioqKioqKioqKioqKioqLwogLyogVElNRVJfRU5BQkxFIE1hc2tzCQkJCQkJCQkJCQkJCSovCiAjZGVmaW5lIFRJTUVOMAkJCTB4MDAwMQkvKiBFbmFibGUgVGltZXIgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC0xMTQxLDYyICsxMDkyLDYgQEAKICNkZWZpbmUgRU1VX1JVTgkJCTB4MDIwMAkvKiBFbXVsYXRpb24gQmVoYXZpb3IgU2VsZWN0ICAgICAgICAgICAgICAgICAgICAqLwogI2RlZmluZSBFUlJfVFlQCQkJMHhDMDAwCS8qIEVycm9yIFR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogCi0vKiAqKioqKioqKioqKioqKioqKiogICBHUElPIFBPUlRTIEYsIEcsIEggTUFTS1MgICoqKioqKioqKioqKioqKioqKioqKioqLwotLyogIEdlbmVyYWwgUHVycG9zZSBJTyAoMHhGRkMwMDcwMCAtIDB4RkZDMDA3RkYpICBNYXNrcyAJCQkJKi8KLS8qIFBvcnQgRiBNYXNrcyAJCQkJCQkJCQkJCQkJCSovCi0jZGVmaW5lIFBGMAkJMHgwMDAxCi0jZGVmaW5lIFBGMQkJMHgwMDAyCi0jZGVmaW5lIFBGMgkJMHgwMDA0Ci0jZGVmaW5lIFBGMwkJMHgwMDA4Ci0jZGVmaW5lIFBGNAkJMHgwMDEwCi0jZGVmaW5lIFBGNQkJMHgwMDIwCi0jZGVmaW5lIFBGNgkJMHgwMDQwCi0jZGVmaW5lIFBGNwkJMHgwMDgwCi0jZGVmaW5lIFBGOAkJMHgwMTAwCi0jZGVmaW5lIFBGOQkJMHgwMjAwCi0jZGVmaW5lIFBGMTAJMHgwNDAwCi0jZGVmaW5lIFBGMTEJMHgwODAwCi0jZGVmaW5lIFBGMTIJMHgxMDAwCi0jZGVmaW5lIFBGMTMJMHgyMDAwCi0jZGVmaW5lIFBGMTQJMHg0MDAwCi0jZGVmaW5lIFBGMTUJMHg4MDAwCi0KLS8qIFBvcnQgRyBNYXNrcwkJCQkJCQkJCQkJCQkJCSovCi0jZGVmaW5lIFBHMAkJMHgwMDAxCi0jZGVmaW5lIFBHMQkJMHgwMDAyCi0jZGVmaW5lIFBHMgkJMHgwMDA0Ci0jZGVmaW5lIFBHMwkJMHgwMDA4Ci0jZGVmaW5lIFBHNAkJMHgwMDEwCi0jZGVmaW5lIFBHNQkJMHgwMDIwCi0jZGVmaW5lIFBHNgkJMHgwMDQwCi0jZGVmaW5lIFBHNwkJMHgwMDgwCi0jZGVmaW5lIFBHOAkJMHgwMTAwCi0jZGVmaW5lIFBHOQkJMHgwMjAwCi0jZGVmaW5lIFBHMTAJMHgwNDAwCi0jZGVmaW5lIFBHMTEJMHgwODAwCi0jZGVmaW5lIFBHMTIJMHgxMDAwCi0jZGVmaW5lIFBHMTMJMHgyMDAwCi0jZGVmaW5lIFBHMTQJMHg0MDAwCi0jZGVmaW5lIFBHMTUJMHg4MDAwCi0KLS8qIFBvcnQgSCBNYXNrcwkJCQkJCQkJCQkJCQkJCSovCi0jZGVmaW5lIFBIMAkJMHgwMDAxCi0jZGVmaW5lIFBIMQkJMHgwMDAyCi0jZGVmaW5lIFBIMgkJMHgwMDA0Ci0jZGVmaW5lIFBIMwkJMHgwMDA4Ci0jZGVmaW5lIFBINAkJMHgwMDEwCi0jZGVmaW5lIFBINQkJMHgwMDIwCi0jZGVmaW5lIFBINgkJMHgwMDQwCi0jZGVmaW5lIFBINwkJMHgwMDgwCi0jZGVmaW5lIFBIOAkJMHgwMTAwCi0jZGVmaW5lIFBIOQkJMHgwMjAwCi0jZGVmaW5lIFBIMTAJMHgwNDAwCi0jZGVmaW5lIFBIMTEJMHgwODAwCi0jZGVmaW5lIFBIMTIJMHgxMDAwCi0jZGVmaW5lIFBIMTMJMHgyMDAwCi0jZGVmaW5lIFBIMTQJMHg0MDAwCi0jZGVmaW5lIFBIMTUJMHg4MDAwCi0KIC8qICoqKioqKioqKioqKioqKioqKioqKiAgQVNZTkNIUk9OT1VTIE1FTU9SWSBDT05UUk9MTEVSIE1BU0tTICAqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogRUJJVV9BTUdDVEwgTWFza3MJCQkJCQkJCQkJCQkJCQkJCSovCiAjZGVmaW5lIEFNQ0tFTgkJCTB4MDAwMQkvKiBFbmFibGUgQ0xLT1VUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9pbmNsdWRlL21hY2gvZGVmQkY1MzcuaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9pbmNsdWRlL21hY2gvZGVmQkY1MzcuaAppbmRleCA4Y2I1ZDVjLi4zZDQ3MWQ3IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvaW5jbHVkZS9tYWNoL2RlZkJGNTM3LmgKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2luY2x1ZGUvbWFjaC9kZWZCRjUzNy5oCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA1LTIwMDggQW5hbG9nIERldmljZXMgSW5jLgorICogQ29weXJpZ2h0IDIwMDUtMjAxMCBBbmFsb2cgRGV2aWNlcyBJbmMuCiAgKgogICogTGljZW5zZWQgdW5kZXIgdGhlIEFESSBCU0QgbGljZW5zZSBvciB0aGUgR1BMLTIgKG9yIGxhdGVyKQogICovCkBAIC03LDkgKzcsNiBAQAogI2lmbmRlZiBfREVGX0JGNTM3X0gKICNkZWZpbmUgX0RFRl9CRjUzN19ICiAKLS8qIEluY2x1ZGUgYWxsIENvcmUgcmVnaXN0ZXJzIGFuZCBiaXQgZGVmaW5pdGlvbnMqLwotI2luY2x1ZGUgPGFzbS9jZGVmX0xQQmxhY2tmaW4uaD4KLQogLyogSW5jbHVkZSBhbGwgTU1SIGFuZCBiaXQgZGVmaW5lcyBjb21tb24gdG8gQkY1MzQgKi8KICNpbmNsdWRlICJkZWZCRjUzNC5oIgogCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvaW5jbHVkZS9tYWNoL2dwaW8uaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9pbmNsdWRlL21hY2gvZ3Bpby5oCmluZGV4IGY4MGMyOTkuLmZiYTYwNmIgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9pbmNsdWRlL21hY2gvZ3Bpby5oCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9pbmNsdWRlL21hY2gvZ3Bpby5oCkBAIC02Miw0ICs2Miw4IEBACiAjZGVmaW5lIFBPUlRfRyBHUElPX1BHMAogI2RlZmluZSBQT1JUX0ggR1BJT19QSDAKIAorI2luY2x1ZGUgPG1hY2gtY29tbW9uL3BvcnRzLWYuaD4KKyNpbmNsdWRlIDxtYWNoLWNvbW1vbi9wb3J0cy1nLmg+CisjaW5jbHVkZSA8bWFjaC1jb21tb24vcG9ydHMtaC5oPgorCiAjZW5kaWYgLyogX01BQ0hfR1BJT19IXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2luY2x1ZGUvbWFjaC9wbGwuaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9pbmNsdWRlL21hY2gvcGxsLmgKaW5kZXggMTY5YzEwNi4uOTRjY2E2NyAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2luY2x1ZGUvbWFjaC9wbGwuaAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvaW5jbHVkZS9tYWNoL3BsbC5oCkBAIC0xLDU3ICsxIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDUtMjAwOCBBbmFsb2cgRGV2aWNlcyBJbmMuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyCi0gKi8KLQotI2lmbmRlZiBfTUFDSF9QTExfSAotI2RlZmluZSBfTUFDSF9QTExfSAotCi0jaW5jbHVkZSA8YXNtL2JsYWNrZmluLmg+Ci0jaW5jbHVkZSA8YXNtL2lycWZsYWdzLmg+Ci0KLS8qIFdyaXRpbmcgdG8gUExMX0NUTCBpbml0aWF0ZXMgYSBQTEwgcmVsb2NrIHNlcXVlbmNlLiAqLwotc3RhdGljIF9faW5saW5lX18gdm9pZCBiZmluX3dyaXRlX1BMTF9DVEwodW5zaWduZWQgaW50IHZhbCkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzLCBpd3I7Ci0KLQlpZiAodmFsID09IGJmaW5fcmVhZF9QTExfQ1RMKCkpCi0JCXJldHVybjsKLQotCWZsYWdzID0gaGFyZF9sb2NhbF9pcnFfc2F2ZSgpOwotCS8qIEVuYWJsZSB0aGUgUExMIFdha2V1cCBiaXQgaW4gU0lDIElXUiAqLwotCWl3ciA9IGJmaW5fcmVhZDMyKFNJQ19JV1IpOwotCS8qIE9ubHkgYWxsb3cgUFBMIFdha2V1cCkgKi8KLQliZmluX3dyaXRlMzIoU0lDX0lXUiwgSVdSX0VOQUJMRSgwKSk7Ci0KLQliZmluX3dyaXRlMTYoUExMX0NUTCwgdmFsKTsKLQlTU1lOQygpOwotCWFzbSgiSURMRTsiKTsKLQotCWJmaW5fd3JpdGUzMihTSUNfSVdSLCBpd3IpOwotCWhhcmRfbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotfQotCi0vKiBXcml0aW5nIHRvIFZSX0NUTCBpbml0aWF0ZXMgYSBQTEwgcmVsb2NrIHNlcXVlbmNlLiAqLwotc3RhdGljIF9faW5saW5lX18gdm9pZCBiZmluX3dyaXRlX1ZSX0NUTCh1bnNpZ25lZCBpbnQgdmFsKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIGl3cjsKLQotCWlmICh2YWwgPT0gYmZpbl9yZWFkX1ZSX0NUTCgpKQotCQlyZXR1cm47Ci0KLQlmbGFncyA9IGhhcmRfbG9jYWxfaXJxX3NhdmUoKTsKLQkvKiBFbmFibGUgdGhlIFBMTCBXYWtldXAgYml0IGluIFNJQyBJV1IgKi8KLQlpd3IgPSBiZmluX3JlYWQzMihTSUNfSVdSKTsKLQkvKiBPbmx5IGFsbG93IFBQTCBXYWtldXApICovCi0JYmZpbl93cml0ZTMyKFNJQ19JV1IsIElXUl9FTkFCTEUoMCkpOwotCi0JYmZpbl93cml0ZTE2KFZSX0NUTCwgdmFsKTsKLQlTU1lOQygpOwotCWFzbSgiSURMRTsiKTsKLQotCWJmaW5fd3JpdGUzMihTSUNfSVdSLCBpd3IpOwotCWhhcmRfbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotfQotCi0jZW5kaWYgLyogX01BQ0hfUExMX0ggKi8KKyNpbmNsdWRlIDxtYWNoLWNvbW1vbi9wbGwuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzOC9ib2FyZHMvZXpraXQuYyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzOC9ib2FyZHMvZXpraXQuYwppbmRleCBjNmZiMGE1Li5lNjE0MjRlIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzgvYm9hcmRzL2V6a2l0LmMKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM4L2JvYXJkcy9lemtpdC5jCkBAIC04Miw3ICs4Miw3IEBACiAjZW5kaWYKIH07CiAKLXVuc2lnbmVkIHNob3J0IGJmaW5fdWFydDBfcGVyaXBoZXJhbHNbXSA9IHsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBiZmluX3VhcnQwX3BlcmlwaGVyYWxzW10gPSB7CiAJUF9VQVJUMF9UWCwgUF9VQVJUMF9SWCwgMAogfTsKIApAQCAtMTI1LDcgKzEyNSw3IEBACiAJfSwKIH07CiAKLXVuc2lnbmVkIHNob3J0IGJmaW5fdWFydDFfcGVyaXBoZXJhbHNbXSA9IHsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBiZmluX3VhcnQxX3BlcmlwaGVyYWxzW10gPSB7CiAJUF9VQVJUMV9UWCwgUF9VQVJUMV9SWCwgMAogfTsKIApAQCAtMTY4LDcgKzE2OCw3IEBACiAJfSwKIH07CiAKLXVuc2lnbmVkIHNob3J0IGJmaW5fdWFydDJfcGVyaXBoZXJhbHNbXSA9IHsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBiZmluX3VhcnQyX3BlcmlwaGVyYWxzW10gPSB7CiAJUF9VQVJUMl9UWCwgUF9VQVJUMl9SWCwgMAogfTsKIApAQCAtMjgyLDkgKzI4Miw5IEBACiAJfSwKIH07CiAKLXVuc2lnbmVkIHNob3J0IGJmaW5fc3BvcnQwX3BlcmlwaGVyYWxzW10gPSB7CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgYmZpbl9zcG9ydDBfcGVyaXBoZXJhbHNbXSA9IHsKIAlQX1NQT1JUMF9URlMsIFBfU1BPUlQwX0RUUFJJLCBQX1NQT1JUMF9UU0NMSywgUF9TUE9SVDBfUkZTLAotCVBfU1BPUlQwX0RSUFJJLCBQX1NQT1JUMF9SU0NMSywgUF9TUE9SVDBfRFJTRUMsIFBfU1BPUlQwX0RUU0VDLCAwCisJUF9TUE9SVDBfRFJQUkksIFBfU1BPUlQwX1JTQ0xLLCAwCiB9OwogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZmluX3Nwb3J0MF91YXJ0X2RldmljZSA9IHsKQEAgLTMxNiw5ICszMTYsOSBAQAogCX0sCiB9OwogCi11bnNpZ25lZCBzaG9ydCBiZmluX3Nwb3J0MV9wZXJpcGhlcmFsc1tdID0geworc3RhdGljIHVuc2lnbmVkIHNob3J0IGJmaW5fc3BvcnQxX3BlcmlwaGVyYWxzW10gPSB7CiAJUF9TUE9SVDFfVEZTLCBQX1NQT1JUMV9EVFBSSSwgUF9TUE9SVDFfVFNDTEssIFBfU1BPUlQxX1JGUywKLQlQX1NQT1JUMV9EUlBSSSwgUF9TUE9SVDFfUlNDTEssIFBfU1BPUlQxX0RSU0VDLCBQX1NQT1JUMV9EVFNFQywgMAorCVBfU1BPUlQxX0RSUFJJLCBQX1NQT1JUMV9SU0NMSywgMAogfTsKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYmZpbl9zcG9ydDFfdWFydF9kZXZpY2UgPSB7CkBAIC0zNTAsNyArMzUwLDcgQEAKIAl9LAogfTsKIAotdW5zaWduZWQgc2hvcnQgYmZpbl9zcG9ydDJfcGVyaXBoZXJhbHNbXSA9IHsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBiZmluX3Nwb3J0Ml9wZXJpcGhlcmFsc1tdID0gewogCVBfU1BPUlQyX1RGUywgUF9TUE9SVDJfRFRQUkksIFBfU1BPUlQyX1RTQ0xLLCBQX1NQT1JUMl9SRlMsCiAJUF9TUE9SVDJfRFJQUkksIFBfU1BPUlQyX1JTQ0xLLCBQX1NQT1JUMl9EUlNFQywgUF9TUE9SVDJfRFRTRUMsIDAKIH07CkBAIC0zODQsNyArMzg0LDcgQEAKIAl9LAogfTsKIAotdW5zaWduZWQgc2hvcnQgYmZpbl9zcG9ydDNfcGVyaXBoZXJhbHNbXSA9IHsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBiZmluX3Nwb3J0M19wZXJpcGhlcmFsc1tdID0gewogCVBfU1BPUlQzX1RGUywgUF9TUE9SVDNfRFRQUkksIFBfU1BPUlQzX1RTQ0xLLCBQX1NQT1JUM19SRlMsCiAJUF9TUE9SVDNfRFJQUkksIFBfU1BPUlQzX1JTQ0xLLCBQX1NQT1JUM19EUlNFQywgUF9TUE9SVDNfRFRTRUMsIDAKIH07CkBAIC00MDIsNyArNDAyLDcgQEAKICNlbmRpZgogCiAjaWYgZGVmaW5lZChDT05GSUdfQ0FOX0JGSU4pIHx8IGRlZmluZWQoQ09ORklHX0NBTl9CRklOX01PRFVMRSkKLXVuc2lnbmVkIHNob3J0IGJmaW5fY2FuX3BlcmlwaGVyYWxzW10gPSB7CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgYmZpbl9jYW5fcGVyaXBoZXJhbHNbXSA9IHsKIAlQX0NBTjBfUlgsIFBfQ0FOMF9UWCwgMAogfTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM4L2RtYS5jIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM4L2RtYS5jCmluZGV4IDVkYzAyMjUuLmNjZThlZjUgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzOC9kbWEuYworKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzgvZG1hLmMKQEAgLTExLDcgKzExLDcgQEAKICNpbmNsdWRlIDxhc20vYmxhY2tmaW4uaD4KICNpbmNsdWRlIDxhc20vZG1hLmg+CiAKLXN0cnVjdCBkbWFfcmVnaXN0ZXIgKmRtYV9pb19iYXNlX2FkZHJbTUFYX0RNQV9DSEFOTkVMU10gPSB7CitzdHJ1Y3QgZG1hX3JlZ2lzdGVyICogY29uc3QgZG1hX2lvX2Jhc2VfYWRkcltNQVhfRE1BX0NIQU5ORUxTXSA9IHsKIAkoc3RydWN0IGRtYV9yZWdpc3RlciAqKSBETUEwX05FWFRfREVTQ19QVFIsCiAJKHN0cnVjdCBkbWFfcmVnaXN0ZXIgKikgRE1BMV9ORVhUX0RFU0NfUFRSLAogCShzdHJ1Y3QgZG1hX3JlZ2lzdGVyICopIERNQTJfTkVYVF9ERVNDX1BUUiwKQEAgLTMyLDE0ICszMiwxNCBAQAogCShzdHJ1Y3QgZG1hX3JlZ2lzdGVyICopIERNQTE3X05FWFRfREVTQ19QVFIsCiAJKHN0cnVjdCBkbWFfcmVnaXN0ZXIgKikgRE1BMThfTkVYVF9ERVNDX1BUUiwKIAkoc3RydWN0IGRtYV9yZWdpc3RlciAqKSBETUExOV9ORVhUX0RFU0NfUFRSLAotCShzdHJ1Y3QgZG1hX3JlZ2lzdGVyICopIE1ETUEwX0QwX05FWFRfREVTQ19QVFIsCi0JKHN0cnVjdCBkbWFfcmVnaXN0ZXIgKikgTURNQTBfUzBfTkVYVF9ERVNDX1BUUiwKLQkoc3RydWN0IGRtYV9yZWdpc3RlciAqKSBNRE1BMF9EMV9ORVhUX0RFU0NfUFRSLAotCShzdHJ1Y3QgZG1hX3JlZ2lzdGVyICopIE1ETUEwX1MxX05FWFRfREVTQ19QVFIsCi0JKHN0cnVjdCBkbWFfcmVnaXN0ZXIgKikgTURNQTFfRDBfTkVYVF9ERVNDX1BUUiwKLQkoc3RydWN0IGRtYV9yZWdpc3RlciAqKSBNRE1BMV9TMF9ORVhUX0RFU0NfUFRSLAotCShzdHJ1Y3QgZG1hX3JlZ2lzdGVyICopIE1ETUExX0QxX05FWFRfREVTQ19QVFIsCi0JKHN0cnVjdCBkbWFfcmVnaXN0ZXIgKikgTURNQTFfUzFfTkVYVF9ERVNDX1BUUiwKKwkoc3RydWN0IGRtYV9yZWdpc3RlciAqKSBNRE1BX0QwX05FWFRfREVTQ19QVFIsCisJKHN0cnVjdCBkbWFfcmVnaXN0ZXIgKikgTURNQV9TMF9ORVhUX0RFU0NfUFRSLAorCShzdHJ1Y3QgZG1hX3JlZ2lzdGVyICopIE1ETUFfRDFfTkVYVF9ERVNDX1BUUiwKKwkoc3RydWN0IGRtYV9yZWdpc3RlciAqKSBNRE1BX1MxX05FWFRfREVTQ19QVFIsCisJKHN0cnVjdCBkbWFfcmVnaXN0ZXIgKikgTURNQV9EMl9ORVhUX0RFU0NfUFRSLAorCShzdHJ1Y3QgZG1hX3JlZ2lzdGVyICopIE1ETUFfUzJfTkVYVF9ERVNDX1BUUiwKKwkoc3RydWN0IGRtYV9yZWdpc3RlciAqKSBNRE1BX0QzX05FWFRfREVTQ19QVFIsCisJKHN0cnVjdCBkbWFfcmVnaXN0ZXIgKikgTURNQV9TM19ORVhUX0RFU0NfUFRSLAogfTsKIEVYUE9SVF9TWU1CT0woZG1hX2lvX2Jhc2VfYWRkcik7CiAKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzOC9pbmNsdWRlL21hY2gvYmZpbl9zZXJpYWwuaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzOC9pbmNsdWRlL21hY2gvYmZpbl9zZXJpYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjZlMjc2Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM4L2luY2x1ZGUvbWFjaC9iZmluX3NlcmlhbC5oCkBAIC0wLDAgKzEsMTQgQEAKKy8qCisgKiBtYWNoL2JmaW5fc2VyaWFsLmggLSBCbGFja2ZpbiBVQVJUL1NlcmlhbCBkZWZpbml0aW9ucworICoKKyAqIENvcHlyaWdodCAyMDA2LTIwMTAgQW5hbG9nIERldmljZXMgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KKyAqLworCisjaWZuZGVmIF9fQkZJTl9NQUNIX1NFUklBTF9IX18KKyNkZWZpbmUgX19CRklOX01BQ0hfU0VSSUFMX0hfXworCisjZGVmaW5lIEJGSU5fVUFSVF9OUl9QT1JUUwkzCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM4L2luY2x1ZGUvbWFjaC9iZmluX3NlcmlhbF81eHguaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzOC9pbmNsdWRlL21hY2gvYmZpbl9zZXJpYWxfNXh4LmgKaW5kZXggNWMxNDgxNC4uYmViNTAyZSAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM4L2luY2x1ZGUvbWFjaC9iZmluX3NlcmlhbF81eHguaAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzgvaW5jbHVkZS9tYWNoL2JmaW5fc2VyaWFsXzV4eC5oCkBAIC00LDM2ICs0LDkgQEAKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KICAqLwogCi0jaW5jbHVkZSA8bGludXgvc2VyaWFsLmg+CiAjaW5jbHVkZSA8YXNtL2RtYS5oPgogI2luY2x1ZGUgPGFzbS9wb3J0bXV4Lmg+CiAKLSNkZWZpbmUgVUFSVF9HRVRfQ0hBUih1YXJ0KSAgICAgYmZpbl9yZWFkMTYoKCh1YXJ0KS0+cG9ydC5tZW1iYXNlICsgT0ZGU0VUX1JCUikpCi0jZGVmaW5lIFVBUlRfR0VUX0RMTCh1YXJ0KQliZmluX3JlYWQxNigoKHVhcnQpLT5wb3J0Lm1lbWJhc2UgKyBPRkZTRVRfRExMKSkKLSNkZWZpbmUgVUFSVF9HRVRfSUVSKHVhcnQpICAgICAgYmZpbl9yZWFkMTYoKCh1YXJ0KS0+cG9ydC5tZW1iYXNlICsgT0ZGU0VUX0lFUikpCi0jZGVmaW5lIFVBUlRfR0VUX0RMSCh1YXJ0KQliZmluX3JlYWQxNigoKHVhcnQpLT5wb3J0Lm1lbWJhc2UgKyBPRkZTRVRfRExIKSkKLSNkZWZpbmUgVUFSVF9HRVRfSUlSKHVhcnQpICAgICAgYmZpbl9yZWFkMTYoKCh1YXJ0KS0+cG9ydC5tZW1iYXNlICsgT0ZGU0VUX0lJUikpCi0jZGVmaW5lIFVBUlRfR0VUX0xDUih1YXJ0KSAgICAgIGJmaW5fcmVhZDE2KCgodWFydCktPnBvcnQubWVtYmFzZSArIE9GRlNFVF9MQ1IpKQotI2RlZmluZSBVQVJUX0dFVF9HQ1RMKHVhcnQpICAgICBiZmluX3JlYWQxNigoKHVhcnQpLT5wb3J0Lm1lbWJhc2UgKyBPRkZTRVRfR0NUTCkpCi0KLSNkZWZpbmUgVUFSVF9QVVRfQ0hBUih1YXJ0LCB2KSAgIGJmaW5fd3JpdGUxNigoKHVhcnQpLT5wb3J0Lm1lbWJhc2UgKyBPRkZTRVRfVEhSKSwgdikKLSNkZWZpbmUgVUFSVF9QVVRfRExMKHVhcnQsIHYpICAgIGJmaW5fd3JpdGUxNigoKHVhcnQpLT5wb3J0Lm1lbWJhc2UgKyBPRkZTRVRfRExMKSwgdikKLSNkZWZpbmUgVUFSVF9QVVRfSUVSKHVhcnQsIHYpICAgIGJmaW5fd3JpdGUxNigoKHVhcnQpLT5wb3J0Lm1lbWJhc2UgKyBPRkZTRVRfSUVSKSwgdikKLSNkZWZpbmUgVUFSVF9TRVRfSUVSKHVhcnQsIHYpICAgIFVBUlRfUFVUX0lFUih1YXJ0LCBVQVJUX0dFVF9JRVIodWFydCkgfCAodikpCi0jZGVmaW5lIFVBUlRfQ0xFQVJfSUVSKHVhcnQsIHYpICBVQVJUX1BVVF9JRVIodWFydCwgVUFSVF9HRVRfSUVSKHVhcnQpICYgfih2KSkKLSNkZWZpbmUgVUFSVF9QVVRfRExIKHVhcnQsIHYpICAgIGJmaW5fd3JpdGUxNigoKHVhcnQpLT5wb3J0Lm1lbWJhc2UgKyBPRkZTRVRfRExIKSwgdikKLSNkZWZpbmUgVUFSVF9QVVRfTENSKHVhcnQsIHYpICAgIGJmaW5fd3JpdGUxNigoKHVhcnQpLT5wb3J0Lm1lbWJhc2UgKyBPRkZTRVRfTENSKSwgdikKLSNkZWZpbmUgVUFSVF9QVVRfR0NUTCh1YXJ0LCB2KSAgIGJmaW5fd3JpdGUxNigoKHVhcnQpLT5wb3J0Lm1lbWJhc2UgKyBPRkZTRVRfR0NUTCksIHYpCi0KLSNkZWZpbmUgVUFSVF9TRVRfRExBQih1YXJ0KSAgICAgZG8geyBVQVJUX1BVVF9MQ1IodWFydCwgVUFSVF9HRVRfTENSKHVhcnQpIHwgRExBQik7IFNTWU5DKCk7IH0gd2hpbGUgKDApCi0jZGVmaW5lIFVBUlRfQ0xFQVJfRExBQih1YXJ0KSAgIGRvIHsgVUFSVF9QVVRfTENSKHVhcnQsIFVBUlRfR0VUX0xDUih1YXJ0KSAmIH5ETEFCKTsgU1NZTkMoKTsgfSB3aGlsZSAoMCkKLQotI2RlZmluZSBVQVJUX0dFVF9DVFMoeCkgZ3Bpb19nZXRfdmFsdWUoeC0+Y3RzX3BpbikKLSNkZWZpbmUgVUFSVF9ESVNBQkxFX1JUUyh4KSBncGlvX3NldF92YWx1ZSh4LT5ydHNfcGluLCAxKQotI2RlZmluZSBVQVJUX0VOQUJMRV9SVFMoeCkgZ3Bpb19zZXRfdmFsdWUoeC0+cnRzX3BpbiwgMCkKLSNkZWZpbmUgVUFSVF9FTkFCTEVfSU5UUyh4LCB2KSBVQVJUX1BVVF9JRVIoeCwgdikKLSNkZWZpbmUgVUFSVF9ESVNBQkxFX0lOVFMoeCkgVUFSVF9QVVRfSUVSKHgsIDApCi0KICNpZiBkZWZpbmVkKENPTkZJR19CRklOX1VBUlQwX0NUU1JUUykgfHwgZGVmaW5lZChDT05GSUdfQkZJTl9VQVJUMV9DVFNSVFMpCiAjIGRlZmluZSBDT05GSUdfU0VSSUFMX0JGSU5fQ1RTUlRTCiAKQEAgLTU0LDUwICsyNyw2IEBACiAjIGVuZGlmCiAjZW5kaWYKIAotI2RlZmluZSBCRklOX1VBUlRfVFhfRklGT19TSVpFCTIKLQotLyoKLSAqIFRoZSBwaW4gY29uZmlndXJhdGlvbiBpcyBkaWZmZXJlbnQgZnJvbSBzY2hlbWF0aWMKLSAqLwotc3RydWN0IGJmaW5fc2VyaWFsX3BvcnQgewotCXN0cnVjdCB1YXJ0X3BvcnQJcG9ydDsKLQl1bnNpZ25lZCBpbnQJCW9sZF9zdGF0dXM7Ci0JaW50CQkJc3RhdHVzX2lycTsKLQl1bnNpZ25lZCBpbnQgbHNyOwotI2lmZGVmIENPTkZJR19TRVJJQUxfQkZJTl9ETUEKLQlpbnQJCQl0eF9kb25lOwotCWludAkJCXR4X2NvdW50OwotCXN0cnVjdCBjaXJjX2J1ZgkJcnhfZG1hX2J1ZjsKLQlzdHJ1Y3QgdGltZXJfbGlzdCAgICAgICByeF9kbWFfdGltZXI7Ci0JaW50CQkJcnhfZG1hX25yb3dzOwotCXVuc2lnbmVkIGludAkJdHhfZG1hX2NoYW5uZWw7Ci0JdW5zaWduZWQgaW50CQlyeF9kbWFfY2hhbm5lbDsKLQlzdHJ1Y3Qgd29ya19zdHJ1Y3QJdHhfZG1hX3dvcmtxdWV1ZTsKLSNlbmRpZgotI2lmZGVmIENPTkZJR19TRVJJQUxfQkZJTl9DVFNSVFMKLQlzdHJ1Y3QgdGltZXJfbGlzdAljdHNfdGltZXI7Ci0JaW50CQljdHNfcGluOwotCWludAkJcnRzX3BpbjsKLSNlbmRpZgotfTsKLQotLyogVGhlIGhhcmR3YXJlIGNsZWFycyB0aGUgTFNSIGJpdHMgdXBvbiByZWFkLCBzbyB3ZSBuZWVkIHRvIGNhY2hlCi0gKiBzb21lIG9mIHRoZSBtb3JlIGZ1biBiaXRzIGluIHNvZnR3YXJlIHNvIHRoZXkgZG9uJ3QgZ2V0IGxvc3QKLSAqIHdoZW4gY2hlY2tpbmcgdGhlIExTUiBpbiBvdGhlciBjb2RlIHBhdGhzIChUWCkuCi0gKi8KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IFVBUlRfR0VUX0xTUihzdHJ1Y3QgYmZpbl9zZXJpYWxfcG9ydCAqdWFydCkKLXsKLQl1bnNpZ25lZCBpbnQgbHNyID0gYmZpbl9yZWFkMTYodWFydC0+cG9ydC5tZW1iYXNlICsgT0ZGU0VUX0xTUik7Ci0JdWFydC0+bHNyIHw9IChsc3IgJiAoQkl8RkV8UEV8T0UpKTsKLQlyZXR1cm4gbHNyIHwgdWFydC0+bHNyOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgVUFSVF9DTEVBUl9MU1Ioc3RydWN0IGJmaW5fc2VyaWFsX3BvcnQgKnVhcnQpCi17Ci0JdWFydC0+bHNyID0gMDsKLQliZmluX3dyaXRlMTYodWFydC0+cG9ydC5tZW1iYXNlICsgT0ZGU0VUX0xTUiwgLTEpOwotfQotCiBzdHJ1Y3QgYmZpbl9zZXJpYWxfcmVzIHsKIAl1bnNpZ25lZCBsb25nCXVhcnRfYmFzZV9hZGRyOwogCWludAkJdWFydF9pcnE7CkBAIC0xNjAsMyArODksNSBAQAogfTsKIAogI2RlZmluZSBEUklWRVJfTkFNRSAiYmZpbi11YXJ0IgorCisjaW5jbHVkZSA8YXNtL2JmaW5fc2VyaWFsLmg+CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzgvaW5jbHVkZS9tYWNoL2JsYWNrZmluLmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzgvaW5jbHVkZS9tYWNoL2JsYWNrZmluLmgKaW5kZXggMDhiNWVhYi4uNzkxZDA4NCAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM4L2luY2x1ZGUvbWFjaC9ibGFja2Zpbi5oCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzOC9pbmNsdWRlL21hY2gvYmxhY2tmaW4uaApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwOC0yMDA5IEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqIENvcHlyaWdodCAyMDA4LTIwMTAgQW5hbG9nIERldmljZXMgSW5jLgogICoKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KICAqLwpAQCAtMTAsMzEgKzEwLDI0IEBACiAjZGVmaW5lIEJGNTM4X0ZBTUlMWQogCiAjaW5jbHVkZSAiYmY1MzguaCIKLSNpbmNsdWRlICJkZWZCRjUzOS5oIgogI2luY2x1ZGUgImFub21hbHkuaCIKIAotCi0jaWYgIWRlZmluZWQoX19BU1NFTUJMWV9fKQotI2luY2x1ZGUgImNkZWZCRjUzOC5oIgotCi0jaWYgZGVmaW5lZChDT05GSUdfQkY1MzkpCi0jaW5jbHVkZSAiY2RlZkJGNTM5LmgiCisjaW5jbHVkZSA8YXNtL2RlZl9MUEJsYWNrZmluLmg+CisjaWZkZWYgQ09ORklHX0JGNTM4CisjIGluY2x1ZGUgImRlZkJGNTM4LmgiCiAjZW5kaWYKKyNpZmRlZiBDT05GSUdfQkY1MzkKKyMgaW5jbHVkZSAiZGVmQkY1MzkuaCIKICNlbmRpZgogCi0jZGVmaW5lIEJGSU5fVUFSVF9OUl9QT1JUUwkzCi0KLSNkZWZpbmUgT0ZGU0VUX1RIUiAgICAgICAgICAgICAgMHgwMAkvKiBUcmFuc21pdCBIb2xkaW5nIHJlZ2lzdGVyICAgICAgICAgICAgKi8KLSNkZWZpbmUgT0ZGU0VUX1JCUiAgICAgICAgICAgICAgMHgwMAkvKiBSZWNlaXZlIEJ1ZmZlciByZWdpc3RlciAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgT0ZGU0VUX0RMTCAgICAgICAgICAgICAgMHgwMAkvKiBEaXZpc29yIExhdGNoIChMb3ctQnl0ZSkgICAgICAgICAgICAgKi8KLSNkZWZpbmUgT0ZGU0VUX0lFUiAgICAgICAgICAgICAgMHgwNAkvKiBJbnRlcnJ1cHQgRW5hYmxlIFJlZ2lzdGVyICAgICAgICAgICAgKi8KLSNkZWZpbmUgT0ZGU0VUX0RMSCAgICAgICAgICAgICAgMHgwNAkvKiBEaXZpc29yIExhdGNoIChIaWdoLUJ5dGUpICAgICAgICAgICAgKi8KLSNkZWZpbmUgT0ZGU0VUX0lJUiAgICAgICAgICAgICAgMHgwOAkvKiBJbnRlcnJ1cHQgSWRlbnRpZmljYXRpb24gUmVnaXN0ZXIgICAgKi8KLSNkZWZpbmUgT0ZGU0VUX0xDUiAgICAgICAgICAgICAgMHgwQwkvKiBMaW5lIENvbnRyb2wgUmVnaXN0ZXIgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgT0ZGU0VUX01DUiAgICAgICAgICAgICAgMHgxMAkvKiBNb2RlbSBDb250cm9sIFJlZ2lzdGVyICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgT0ZGU0VUX0xTUiAgICAgICAgICAgICAgMHgxNAkvKiBMaW5lIFN0YXR1cyBSZWdpc3RlciAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgT0ZGU0VUX01TUiAgICAgICAgICAgICAgMHgxOAkvKiBNb2RlbSBTdGF0dXMgUmVnaXN0ZXIgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgT0ZGU0VUX1NDUiAgICAgICAgICAgICAgMHgxQwkvKiBTQ1IgU2NyYXRjaCBSZWdpc3RlciAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgT0ZGU0VUX0dDVEwgICAgICAgICAgICAgMHgyNAkvKiBHbG9iYWwgQ29udHJvbCBSZWdpc3RlciAgICAgICAgICAgICAgKi8KKyNpZm5kZWYgX19BU1NFTUJMWV9fCisjIGluY2x1ZGUgPGFzbS9jZGVmX0xQQmxhY2tmaW4uaD4KKyMgaWZkZWYgQ09ORklHX0JGNTM4CisjICBpbmNsdWRlICJjZGVmQkY1MzguaCIKKyMgZW5kaWYKKyMgaWZkZWYgQ09ORklHX0JGNTM5CisjICBpbmNsdWRlICJjZGVmQkY1MzkuaCIKKyMgZW5kaWYKKyNlbmRpZgogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzOC9pbmNsdWRlL21hY2gvY2RlZkJGNTM4LmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzgvaW5jbHVkZS9tYWNoL2NkZWZCRjUzOC5oCmluZGV4IDA4NWIwNmIuLmY2YTU2NzkgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzOC9pbmNsdWRlL21hY2gvY2RlZkJGNTM4LmgKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM4L2luY2x1ZGUvbWFjaC9jZGVmQkY1MzguaApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwOC0yMDA5IEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqIENvcHlyaWdodCAyMDA4LTIwMTAgQW5hbG9nIERldmljZXMgSW5jLgogICoKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KICAqLwpAQCAtNywxNCArNyw2IEBACiAjaWZuZGVmIF9DREVGX0JGNTM4X0gKICNkZWZpbmUgX0NERUZfQkY1MzhfSAogCi0jaW5jbHVkZSA8YXNtL2JsYWNrZmluLmg+Ci0KLS8qaW5jbHVkZSBhbGwgQ29yZSByZWdpc3RlcnMgYW5kIGJpdCBkZWZpbml0aW9ucyovCi0jaW5jbHVkZSAiZGVmQkY1MzkuaCIKLQotLyppbmNsdWRlIGNvcmUgc3BlY2lmaWMgcmVnaXN0ZXIgcG9pbnRlciBkZWZpbml0aW9ucyovCi0jaW5jbHVkZSA8YXNtL2NkZWZfTFBCbGFja2Zpbi5oPgotCiAjZGVmaW5lIGJmaW5fd3JpdGVQVFIoYWRkciwgdmFsKSBiZmluX3dyaXRlMzIoYWRkciwgdmFsKQogCiAjZGVmaW5lIGJmaW5fcmVhZF9QTExfQ1RMKCkgICAgICAgICAgICBiZmluX3JlYWQxNihQTExfQ1RMKQpAQCAtNDg3LDEwICs0NzksMTAgQEAKICNkZWZpbmUgYmZpbl93cml0ZV9FQklVX1NEUlJDKHZhbCkgICAgIGJmaW5fd3JpdGUxNihFQklVX1NEUlJDLCB2YWwpCiAjZGVmaW5lIGJmaW5fcmVhZF9FQklVX1NEU1RBVCgpICAgICAgICBiZmluX3JlYWQxNihFQklVX1NEU1RBVCkKICNkZWZpbmUgYmZpbl93cml0ZV9FQklVX1NEU1RBVCh2YWwpICAgIGJmaW5fd3JpdGUxNihFQklVX1NEU1RBVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRE1BMF9UQ19QRVIoKSAgICAgICAgYmZpbl9yZWFkMTYoRE1BMF9UQ19QRVIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfRE1BMF9UQ19QRVIodmFsKSAgICBiZmluX3dyaXRlMTYoRE1BMF9UQ19QRVIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTBfVENfQ05UKCkgICAgICAgIGJmaW5fcmVhZDE2KERNQTBfVENfQ05UKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTBfVENfQ05UKHZhbCkgICAgYmZpbl93cml0ZTE2KERNQTBfVENfQ05ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUFDMF9UQ19QRVIoKSAgICAgICBiZmluX3JlYWQxNihETUFDMF9UQ19QRVIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BQzBfVENfUEVSKHZhbCkgICBiZmluX3dyaXRlMTYoRE1BQzBfVENfUEVSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUFDMF9UQ19DTlQoKSAgICAgICBiZmluX3JlYWQxNihETUFDMF9UQ19DTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BQzBfVENfQ05UKHZhbCkgICBiZmluX3dyaXRlMTYoRE1BQzBfVENfQ05ULCB2YWwpCiAjZGVmaW5lIGJmaW5fcmVhZF9ETUEwX05FWFRfREVTQ19QVFIoKSBiZmluX3JlYWRQVFIoRE1BMF9ORVhUX0RFU0NfUFRSKQogI2RlZmluZSBiZmluX3dyaXRlX0RNQTBfTkVYVF9ERVNDX1BUUih2YWwpIGJmaW5fd3JpdGVQVFIoRE1BMF9ORVhUX0RFU0NfUFRSLCB2YWwpCiAjZGVmaW5lIGJmaW5fcmVhZF9ETUEwX1NUQVJUX0FERFIoKSAgICBiZmluX3JlYWRQVFIoRE1BMF9TVEFSVF9BRERSKQpAQCAtNjk5LDEwICs2OTEsMTAgQEAKICNkZWZpbmUgYmZpbl93cml0ZV9ETUE3X0NVUlJfWF9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihETUE3X0NVUlJfWF9DT1VOVCwgdmFsKQogI2RlZmluZSBiZmluX3JlYWRfRE1BN19DVVJSX1lfQ09VTlQoKSAgYmZpbl9yZWFkMTYoRE1BN19DVVJSX1lfQ09VTlQpCiAjZGVmaW5lIGJmaW5fd3JpdGVfRE1BN19DVVJSX1lfQ09VTlQodmFsKSBiZmluX3dyaXRlMTYoRE1BN19DVVJSX1lfQ09VTlQsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX0RNQTFfVENfUEVSKCkgICAgICAgIGJmaW5fcmVhZDE2KERNQTFfVENfUEVSKQotI2RlZmluZSBiZmluX3dyaXRlX0RNQTFfVENfUEVSKHZhbCkgICAgYmZpbl93cml0ZTE2KERNQTFfVENfUEVSLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUExX1RDX0NOVCgpICAgICAgICBiZmluX3JlYWQxNihETUExX1RDX0NOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUExX1RDX0NOVCh2YWwpICAgIGJmaW5fd3JpdGUxNihETUExX1RDX0NOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BQzFfVENfUEVSKCkgICAgICAgYmZpbl9yZWFkMTYoRE1BQzFfVENfUEVSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQUMxX1RDX1BFUih2YWwpICAgYmZpbl93cml0ZTE2KERNQUMxX1RDX1BFUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BQzFfVENfQ05UKCkgICAgICAgYmZpbl9yZWFkMTYoRE1BQzFfVENfQ05UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQUMxX1RDX0NOVCh2YWwpICAgYmZpbl93cml0ZTE2KERNQUMxX1RDX0NOVCwgdmFsKQogI2RlZmluZSBiZmluX3JlYWRfRE1BOF9ORVhUX0RFU0NfUFRSKCkgYmZpbl9yZWFkUFRSKERNQThfTkVYVF9ERVNDX1BUUikKICNkZWZpbmUgYmZpbl93cml0ZV9ETUE4X05FWFRfREVTQ19QVFIodmFsKSBiZmluX3dyaXRlUFRSKERNQThfTkVYVF9ERVNDX1BUUiwgdmFsKQogI2RlZmluZSBiZmluX3JlYWRfRE1BOF9TVEFSVF9BRERSKCkgICAgYmZpbl9yZWFkUFRSKERNQThfU1RBUlRfQUREUikKQEAgLTEwMTUsMjczICsxMDA3LDIxNCBAQAogI2RlZmluZSBiZmluX3dyaXRlX0RNQTE5X0NVUlJfWF9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihETUExOV9DVVJSX1hfQ09VTlQsIHZhbCkKICNkZWZpbmUgYmZpbl9yZWFkX0RNQTE5X0NVUlJfWV9DT1VOVCgpIGJmaW5fcmVhZDE2KERNQTE5X0NVUlJfWV9DT1VOVCkKICNkZWZpbmUgYmZpbl93cml0ZV9ETUExOV9DVVJSX1lfQ09VTlQodmFsKSBiZmluX3dyaXRlMTYoRE1BMTlfQ1VSUl9ZX0NPVU5ULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BMF9EMF9ORVhUX0RFU0NfUFRSKCkgYmZpbl9yZWFkUFRSKE1ETUEwX0QwX05FWFRfREVTQ19QVFIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQTBfRDBfTkVYVF9ERVNDX1BUUih2YWwpIGJmaW5fd3JpdGVQVFIoTURNQTBfRDBfTkVYVF9ERVNDX1BUUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQTBfRDBfU1RBUlRfQUREUigpIGJmaW5fcmVhZFBUUihNRE1BMF9EMF9TVEFSVF9BRERSKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUEwX0QwX1NUQVJUX0FERFIodmFsKSBiZmluX3dyaXRlUFRSKE1ETUEwX0QwX1NUQVJUX0FERFIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUEwX0QwX0NPTkZJRygpICAgIGJmaW5fcmVhZDE2KE1ETUEwX0QwX0NPTkZJRykKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMF9EMF9DT05GSUcodmFsKSBiZmluX3dyaXRlMTYoTURNQTBfRDBfQ09ORklHLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BMF9EMF9YX0NPVU5UKCkgICBiZmluX3JlYWQxNihNRE1BMF9EMF9YX0NPVU5UKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUEwX0QwX1hfQ09VTlQodmFsKSBiZmluX3dyaXRlMTYoTURNQTBfRDBfWF9DT1VOVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQTBfRDBfWF9NT0RJRlkoKSAgYmZpbl9yZWFkMTYoTURNQTBfRDBfWF9NT0RJRlkpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQTBfRDBfWF9NT0RJRlkodmFsKSBiZmluX3dyaXRlMTYoTURNQTBfRDBfWF9NT0RJRlksIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUEwX0QwX1lfQ09VTlQoKSAgIGJmaW5fcmVhZDE2KE1ETUEwX0QwX1lfQ09VTlQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQTBfRDBfWV9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMF9EMF9ZX0NPVU5ULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BMF9EMF9ZX01PRElGWSgpICBiZmluX3JlYWQxNihNRE1BMF9EMF9ZX01PRElGWSkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMF9EMF9ZX01PRElGWSh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMF9EMF9ZX01PRElGWSwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQTBfRDBfQ1VSUl9ERVNDX1BUUigpIGJmaW5fcmVhZFBUUihNRE1BMF9EMF9DVVJSX0RFU0NfUFRSKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUEwX0QwX0NVUlJfREVTQ19QVFIodmFsKSBiZmluX3dyaXRlUFRSKE1ETUEwX0QwX0NVUlJfREVTQ19QVFIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUEwX0QwX0NVUlJfQUREUigpIGJmaW5fcmVhZFBUUihNRE1BMF9EMF9DVVJSX0FERFIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQTBfRDBfQ1VSUl9BRERSKHZhbCkgYmZpbl93cml0ZVBUUihNRE1BMF9EMF9DVVJSX0FERFIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUEwX0QwX0lSUV9TVEFUVVMoKSBiZmluX3JlYWQxNihNRE1BMF9EMF9JUlFfU1RBVFVTKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUEwX0QwX0lSUV9TVEFUVVModmFsKSBiZmluX3dyaXRlMTYoTURNQTBfRDBfSVJRX1NUQVRVUywgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQTBfRDBfUEVSSVBIRVJBTF9NQVAoKSBiZmluX3JlYWQxNihNRE1BMF9EMF9QRVJJUEhFUkFMX01BUCkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMF9EMF9QRVJJUEhFUkFMX01BUCh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMF9EMF9QRVJJUEhFUkFMX01BUCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQTBfRDBfQ1VSUl9YX0NPVU5UKCkgYmZpbl9yZWFkMTYoTURNQTBfRDBfQ1VSUl9YX0NPVU5UKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUEwX0QwX0NVUlJfWF9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMF9EMF9DVVJSX1hfQ09VTlQsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUEwX0QwX0NVUlJfWV9DT1VOVCgpIGJmaW5fcmVhZDE2KE1ETUEwX0QwX0NVUlJfWV9DT1VOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMF9EMF9DVVJSX1lfQ09VTlQodmFsKSBiZmluX3dyaXRlMTYoTURNQTBfRDBfQ1VSUl9ZX0NPVU5ULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BMF9TMF9ORVhUX0RFU0NfUFRSKCkgYmZpbl9yZWFkUFRSKE1ETUEwX1MwX05FWFRfREVTQ19QVFIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQTBfUzBfTkVYVF9ERVNDX1BUUih2YWwpIGJmaW5fd3JpdGVQVFIoTURNQTBfUzBfTkVYVF9ERVNDX1BUUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQTBfUzBfU1RBUlRfQUREUigpIGJmaW5fcmVhZFBUUihNRE1BMF9TMF9TVEFSVF9BRERSKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUEwX1MwX1NUQVJUX0FERFIodmFsKSBiZmluX3dyaXRlUFRSKE1ETUEwX1MwX1NUQVJUX0FERFIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUEwX1MwX0NPTkZJRygpICAgIGJmaW5fcmVhZDE2KE1ETUEwX1MwX0NPTkZJRykKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMF9TMF9DT05GSUcodmFsKSBiZmluX3dyaXRlMTYoTURNQTBfUzBfQ09ORklHLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BMF9TMF9YX0NPVU5UKCkgICBiZmluX3JlYWQxNihNRE1BMF9TMF9YX0NPVU5UKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUEwX1MwX1hfQ09VTlQodmFsKSBiZmluX3dyaXRlMTYoTURNQTBfUzBfWF9DT1VOVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQTBfUzBfWF9NT0RJRlkoKSAgYmZpbl9yZWFkMTYoTURNQTBfUzBfWF9NT0RJRlkpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQTBfUzBfWF9NT0RJRlkodmFsKSBiZmluX3dyaXRlMTYoTURNQTBfUzBfWF9NT0RJRlksIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUEwX1MwX1lfQ09VTlQoKSAgIGJmaW5fcmVhZDE2KE1ETUEwX1MwX1lfQ09VTlQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQTBfUzBfWV9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMF9TMF9ZX0NPVU5ULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BMF9TMF9ZX01PRElGWSgpICBiZmluX3JlYWQxNihNRE1BMF9TMF9ZX01PRElGWSkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMF9TMF9ZX01PRElGWSh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMF9TMF9ZX01PRElGWSwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQTBfUzBfQ1VSUl9ERVNDX1BUUigpIGJmaW5fcmVhZFBUUihNRE1BMF9TMF9DVVJSX0RFU0NfUFRSKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUEwX1MwX0NVUlJfREVTQ19QVFIodmFsKSBiZmluX3dyaXRlUFRSKE1ETUEwX1MwX0NVUlJfREVTQ19QVFIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUEwX1MwX0NVUlJfQUREUigpIGJmaW5fcmVhZFBUUihNRE1BMF9TMF9DVVJSX0FERFIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQTBfUzBfQ1VSUl9BRERSKHZhbCkgYmZpbl93cml0ZVBUUihNRE1BMF9TMF9DVVJSX0FERFIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUEwX1MwX0lSUV9TVEFUVVMoKSBiZmluX3JlYWQxNihNRE1BMF9TMF9JUlFfU1RBVFVTKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUEwX1MwX0lSUV9TVEFUVVModmFsKSBiZmluX3dyaXRlMTYoTURNQTBfUzBfSVJRX1NUQVRVUywgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQTBfUzBfUEVSSVBIRVJBTF9NQVAoKSBiZmluX3JlYWQxNihNRE1BMF9TMF9QRVJJUEhFUkFMX01BUCkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMF9TMF9QRVJJUEhFUkFMX01BUCh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMF9TMF9QRVJJUEhFUkFMX01BUCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQTBfUzBfQ1VSUl9YX0NPVU5UKCkgYmZpbl9yZWFkMTYoTURNQTBfUzBfQ1VSUl9YX0NPVU5UKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUEwX1MwX0NVUlJfWF9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMF9TMF9DVVJSX1hfQ09VTlQsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUEwX1MwX0NVUlJfWV9DT1VOVCgpIGJmaW5fcmVhZDE2KE1ETUEwX1MwX0NVUlJfWV9DT1VOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMF9TMF9DVVJSX1lfQ09VTlQodmFsKSBiZmluX3dyaXRlMTYoTURNQTBfUzBfQ1VSUl9ZX0NPVU5ULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BMF9EMV9ORVhUX0RFU0NfUFRSKCkgYmZpbl9yZWFkUFRSKE1ETUEwX0QxX05FWFRfREVTQ19QVFIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQTBfRDFfTkVYVF9ERVNDX1BUUih2YWwpIGJmaW5fd3JpdGVQVFIoTURNQTBfRDFfTkVYVF9ERVNDX1BUUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQTBfRDFfU1RBUlRfQUREUigpIGJmaW5fcmVhZFBUUihNRE1BMF9EMV9TVEFSVF9BRERSKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUEwX0QxX1NUQVJUX0FERFIodmFsKSBiZmluX3dyaXRlUFRSKE1ETUEwX0QxX1NUQVJUX0FERFIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUEwX0QxX0NPTkZJRygpICAgIGJmaW5fcmVhZDE2KE1ETUEwX0QxX0NPTkZJRykKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMF9EMV9DT05GSUcodmFsKSBiZmluX3dyaXRlMTYoTURNQTBfRDFfQ09ORklHLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BMF9EMV9YX0NPVU5UKCkgICBiZmluX3JlYWQxNihNRE1BMF9EMV9YX0NPVU5UKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUEwX0QxX1hfQ09VTlQodmFsKSBiZmluX3dyaXRlMTYoTURNQTBfRDFfWF9DT1VOVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQTBfRDFfWF9NT0RJRlkoKSAgYmZpbl9yZWFkMTYoTURNQTBfRDFfWF9NT0RJRlkpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQTBfRDFfWF9NT0RJRlkodmFsKSBiZmluX3dyaXRlMTYoTURNQTBfRDFfWF9NT0RJRlksIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUEwX0QxX1lfQ09VTlQoKSAgIGJmaW5fcmVhZDE2KE1ETUEwX0QxX1lfQ09VTlQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQTBfRDFfWV9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMF9EMV9ZX0NPVU5ULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BMF9EMV9ZX01PRElGWSgpICBiZmluX3JlYWQxNihNRE1BMF9EMV9ZX01PRElGWSkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMF9EMV9ZX01PRElGWSh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMF9EMV9ZX01PRElGWSwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQTBfRDFfQ1VSUl9ERVNDX1BUUigpIGJmaW5fcmVhZFBUUihNRE1BMF9EMV9DVVJSX0RFU0NfUFRSKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUEwX0QxX0NVUlJfREVTQ19QVFIodmFsKSBiZmluX3dyaXRlUFRSKE1ETUEwX0QxX0NVUlJfREVTQ19QVFIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUEwX0QxX0NVUlJfQUREUigpIGJmaW5fcmVhZFBUUihNRE1BMF9EMV9DVVJSX0FERFIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQTBfRDFfQ1VSUl9BRERSKHZhbCkgYmZpbl93cml0ZVBUUihNRE1BMF9EMV9DVVJSX0FERFIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUEwX0QxX0lSUV9TVEFUVVMoKSBiZmluX3JlYWQxNihNRE1BMF9EMV9JUlFfU1RBVFVTKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUEwX0QxX0lSUV9TVEFUVVModmFsKSBiZmluX3dyaXRlMTYoTURNQTBfRDFfSVJRX1NUQVRVUywgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQTBfRDFfUEVSSVBIRVJBTF9NQVAoKSBiZmluX3JlYWQxNihNRE1BMF9EMV9QRVJJUEhFUkFMX01BUCkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMF9EMV9QRVJJUEhFUkFMX01BUCh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMF9EMV9QRVJJUEhFUkFMX01BUCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQTBfRDFfQ1VSUl9YX0NPVU5UKCkgYmZpbl9yZWFkMTYoTURNQTBfRDFfQ1VSUl9YX0NPVU5UKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUEwX0QxX0NVUlJfWF9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMF9EMV9DVVJSX1hfQ09VTlQsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUEwX0QxX0NVUlJfWV9DT1VOVCgpIGJmaW5fcmVhZDE2KE1ETUEwX0QxX0NVUlJfWV9DT1VOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMF9EMV9DVVJSX1lfQ09VTlQodmFsKSBiZmluX3dyaXRlMTYoTURNQTBfRDFfQ1VSUl9ZX0NPVU5ULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BMF9TMV9ORVhUX0RFU0NfUFRSKCkgYmZpbl9yZWFkUFRSKE1ETUEwX1MxX05FWFRfREVTQ19QVFIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQTBfUzFfTkVYVF9ERVNDX1BUUih2YWwpIGJmaW5fd3JpdGVQVFIoTURNQTBfUzFfTkVYVF9ERVNDX1BUUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQTBfUzFfU1RBUlRfQUREUigpIGJmaW5fcmVhZFBUUihNRE1BMF9TMV9TVEFSVF9BRERSKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUEwX1MxX1NUQVJUX0FERFIodmFsKSBiZmluX3dyaXRlUFRSKE1ETUEwX1MxX1NUQVJUX0FERFIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUEwX1MxX0NPTkZJRygpICAgIGJmaW5fcmVhZDE2KE1ETUEwX1MxX0NPTkZJRykKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMF9TMV9DT05GSUcodmFsKSBiZmluX3dyaXRlMTYoTURNQTBfUzFfQ09ORklHLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BMF9TMV9YX0NPVU5UKCkgICBiZmluX3JlYWQxNihNRE1BMF9TMV9YX0NPVU5UKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUEwX1MxX1hfQ09VTlQodmFsKSBiZmluX3dyaXRlMTYoTURNQTBfUzFfWF9DT1VOVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQTBfUzFfWF9NT0RJRlkoKSAgYmZpbl9yZWFkMTYoTURNQTBfUzFfWF9NT0RJRlkpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQTBfUzFfWF9NT0RJRlkodmFsKSBiZmluX3dyaXRlMTYoTURNQTBfUzFfWF9NT0RJRlksIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUEwX1MxX1lfQ09VTlQoKSAgIGJmaW5fcmVhZDE2KE1ETUEwX1MxX1lfQ09VTlQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQTBfUzFfWV9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMF9TMV9ZX0NPVU5ULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BMF9TMV9ZX01PRElGWSgpICBiZmluX3JlYWQxNihNRE1BMF9TMV9ZX01PRElGWSkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMF9TMV9ZX01PRElGWSh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMF9TMV9ZX01PRElGWSwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQTBfUzFfQ1VSUl9ERVNDX1BUUigpIGJmaW5fcmVhZFBUUihNRE1BMF9TMV9DVVJSX0RFU0NfUFRSKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUEwX1MxX0NVUlJfREVTQ19QVFIodmFsKSBiZmluX3dyaXRlUFRSKE1ETUEwX1MxX0NVUlJfREVTQ19QVFIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUEwX1MxX0NVUlJfQUREUigpIGJmaW5fcmVhZFBUUihNRE1BMF9TMV9DVVJSX0FERFIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQTBfUzFfQ1VSUl9BRERSKHZhbCkgYmZpbl93cml0ZVBUUihNRE1BMF9TMV9DVVJSX0FERFIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUEwX1MxX0lSUV9TVEFUVVMoKSBiZmluX3JlYWQxNihNRE1BMF9TMV9JUlFfU1RBVFVTKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUEwX1MxX0lSUV9TVEFUVVModmFsKSBiZmluX3dyaXRlMTYoTURNQTBfUzFfSVJRX1NUQVRVUywgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQTBfUzFfUEVSSVBIRVJBTF9NQVAoKSBiZmluX3JlYWQxNihNRE1BMF9TMV9QRVJJUEhFUkFMX01BUCkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMF9TMV9QRVJJUEhFUkFMX01BUCh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMF9TMV9QRVJJUEhFUkFMX01BUCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQTBfUzFfQ1VSUl9YX0NPVU5UKCkgYmZpbl9yZWFkMTYoTURNQTBfUzFfQ1VSUl9YX0NPVU5UKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUEwX1MxX0NVUlJfWF9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMF9TMV9DVVJSX1hfQ09VTlQsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUEwX1MxX0NVUlJfWV9DT1VOVCgpIGJmaW5fcmVhZDE2KE1ETUEwX1MxX0NVUlJfWV9DT1VOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMF9TMV9DVVJSX1lfQ09VTlQodmFsKSBiZmluX3dyaXRlMTYoTURNQTBfUzFfQ1VSUl9ZX0NPVU5ULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BMV9EMF9ORVhUX0RFU0NfUFRSKCkgYmZpbl9yZWFkUFRSKE1ETUExX0QwX05FWFRfREVTQ19QVFIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQTFfRDBfTkVYVF9ERVNDX1BUUih2YWwpIGJmaW5fd3JpdGVQVFIoTURNQTFfRDBfTkVYVF9ERVNDX1BUUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQTFfRDBfU1RBUlRfQUREUigpIGJmaW5fcmVhZFBUUihNRE1BMV9EMF9TVEFSVF9BRERSKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUExX0QwX1NUQVJUX0FERFIodmFsKSBiZmluX3dyaXRlUFRSKE1ETUExX0QwX1NUQVJUX0FERFIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUExX0QwX0NPTkZJRygpICAgIGJmaW5fcmVhZDE2KE1ETUExX0QwX0NPTkZJRykKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMV9EMF9DT05GSUcodmFsKSBiZmluX3dyaXRlMTYoTURNQTFfRDBfQ09ORklHLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BMV9EMF9YX0NPVU5UKCkgICBiZmluX3JlYWQxNihNRE1BMV9EMF9YX0NPVU5UKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUExX0QwX1hfQ09VTlQodmFsKSBiZmluX3dyaXRlMTYoTURNQTFfRDBfWF9DT1VOVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQTFfRDBfWF9NT0RJRlkoKSAgYmZpbl9yZWFkMTYoTURNQTFfRDBfWF9NT0RJRlkpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQTFfRDBfWF9NT0RJRlkodmFsKSBiZmluX3dyaXRlMTYoTURNQTFfRDBfWF9NT0RJRlksIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUExX0QwX1lfQ09VTlQoKSAgIGJmaW5fcmVhZDE2KE1ETUExX0QwX1lfQ09VTlQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQTFfRDBfWV9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMV9EMF9ZX0NPVU5ULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BMV9EMF9ZX01PRElGWSgpICBiZmluX3JlYWQxNihNRE1BMV9EMF9ZX01PRElGWSkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMV9EMF9ZX01PRElGWSh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMV9EMF9ZX01PRElGWSwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQTFfRDBfQ1VSUl9ERVNDX1BUUigpIGJmaW5fcmVhZFBUUihNRE1BMV9EMF9DVVJSX0RFU0NfUFRSKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUExX0QwX0NVUlJfREVTQ19QVFIodmFsKSBiZmluX3dyaXRlUFRSKE1ETUExX0QwX0NVUlJfREVTQ19QVFIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUExX0QwX0NVUlJfQUREUigpIGJmaW5fcmVhZFBUUihNRE1BMV9EMF9DVVJSX0FERFIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQTFfRDBfQ1VSUl9BRERSKHZhbCkgYmZpbl93cml0ZVBUUihNRE1BMV9EMF9DVVJSX0FERFIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUExX0QwX0lSUV9TVEFUVVMoKSBiZmluX3JlYWQxNihNRE1BMV9EMF9JUlFfU1RBVFVTKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUExX0QwX0lSUV9TVEFUVVModmFsKSBiZmluX3dyaXRlMTYoTURNQTFfRDBfSVJRX1NUQVRVUywgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQTFfRDBfUEVSSVBIRVJBTF9NQVAoKSBiZmluX3JlYWQxNihNRE1BMV9EMF9QRVJJUEhFUkFMX01BUCkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMV9EMF9QRVJJUEhFUkFMX01BUCh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMV9EMF9QRVJJUEhFUkFMX01BUCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQTFfRDBfQ1VSUl9YX0NPVU5UKCkgYmZpbl9yZWFkMTYoTURNQTFfRDBfQ1VSUl9YX0NPVU5UKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUExX0QwX0NVUlJfWF9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMV9EMF9DVVJSX1hfQ09VTlQsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUExX0QwX0NVUlJfWV9DT1VOVCgpIGJmaW5fcmVhZDE2KE1ETUExX0QwX0NVUlJfWV9DT1VOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMV9EMF9DVVJSX1lfQ09VTlQodmFsKSBiZmluX3dyaXRlMTYoTURNQTFfRDBfQ1VSUl9ZX0NPVU5ULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BMV9TMF9ORVhUX0RFU0NfUFRSKCkgYmZpbl9yZWFkUFRSKE1ETUExX1MwX05FWFRfREVTQ19QVFIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQTFfUzBfTkVYVF9ERVNDX1BUUih2YWwpIGJmaW5fd3JpdGVQVFIoTURNQTFfUzBfTkVYVF9ERVNDX1BUUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQTFfUzBfU1RBUlRfQUREUigpIGJmaW5fcmVhZFBUUihNRE1BMV9TMF9TVEFSVF9BRERSKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUExX1MwX1NUQVJUX0FERFIodmFsKSBiZmluX3dyaXRlUFRSKE1ETUExX1MwX1NUQVJUX0FERFIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUExX1MwX0NPTkZJRygpICAgIGJmaW5fcmVhZDE2KE1ETUExX1MwX0NPTkZJRykKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMV9TMF9DT05GSUcodmFsKSBiZmluX3dyaXRlMTYoTURNQTFfUzBfQ09ORklHLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BMV9TMF9YX0NPVU5UKCkgICBiZmluX3JlYWQxNihNRE1BMV9TMF9YX0NPVU5UKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUExX1MwX1hfQ09VTlQodmFsKSBiZmluX3dyaXRlMTYoTURNQTFfUzBfWF9DT1VOVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQTFfUzBfWF9NT0RJRlkoKSAgYmZpbl9yZWFkMTYoTURNQTFfUzBfWF9NT0RJRlkpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQTFfUzBfWF9NT0RJRlkodmFsKSBiZmluX3dyaXRlMTYoTURNQTFfUzBfWF9NT0RJRlksIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUExX1MwX1lfQ09VTlQoKSAgIGJmaW5fcmVhZDE2KE1ETUExX1MwX1lfQ09VTlQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQTFfUzBfWV9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMV9TMF9ZX0NPVU5ULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BMV9TMF9ZX01PRElGWSgpICBiZmluX3JlYWQxNihNRE1BMV9TMF9ZX01PRElGWSkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMV9TMF9ZX01PRElGWSh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMV9TMF9ZX01PRElGWSwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQTFfUzBfQ1VSUl9ERVNDX1BUUigpIGJmaW5fcmVhZFBUUihNRE1BMV9TMF9DVVJSX0RFU0NfUFRSKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUExX1MwX0NVUlJfREVTQ19QVFIodmFsKSBiZmluX3dyaXRlUFRSKE1ETUExX1MwX0NVUlJfREVTQ19QVFIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUExX1MwX0NVUlJfQUREUigpIGJmaW5fcmVhZFBUUihNRE1BMV9TMF9DVVJSX0FERFIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQTFfUzBfQ1VSUl9BRERSKHZhbCkgYmZpbl93cml0ZVBUUihNRE1BMV9TMF9DVVJSX0FERFIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUExX1MwX0lSUV9TVEFUVVMoKSBiZmluX3JlYWQxNihNRE1BMV9TMF9JUlFfU1RBVFVTKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUExX1MwX0lSUV9TVEFUVVModmFsKSBiZmluX3dyaXRlMTYoTURNQTFfUzBfSVJRX1NUQVRVUywgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQTFfUzBfUEVSSVBIRVJBTF9NQVAoKSBiZmluX3JlYWQxNihNRE1BMV9TMF9QRVJJUEhFUkFMX01BUCkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMV9TMF9QRVJJUEhFUkFMX01BUCh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMV9TMF9QRVJJUEhFUkFMX01BUCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQTFfUzBfQ1VSUl9YX0NPVU5UKCkgYmZpbl9yZWFkMTYoTURNQTFfUzBfQ1VSUl9YX0NPVU5UKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUExX1MwX0NVUlJfWF9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMV9TMF9DVVJSX1hfQ09VTlQsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUExX1MwX0NVUlJfWV9DT1VOVCgpIGJmaW5fcmVhZDE2KE1ETUExX1MwX0NVUlJfWV9DT1VOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMV9TMF9DVVJSX1lfQ09VTlQodmFsKSBiZmluX3dyaXRlMTYoTURNQTFfUzBfQ1VSUl9ZX0NPVU5ULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BMV9EMV9ORVhUX0RFU0NfUFRSKCkgYmZpbl9yZWFkUFRSKE1ETUExX0QxX05FWFRfREVTQ19QVFIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQTFfRDFfTkVYVF9ERVNDX1BUUih2YWwpIGJmaW5fd3JpdGVQVFIoTURNQTFfRDFfTkVYVF9ERVNDX1BUUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQTFfRDFfU1RBUlRfQUREUigpIGJmaW5fcmVhZFBUUihNRE1BMV9EMV9TVEFSVF9BRERSKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUExX0QxX1NUQVJUX0FERFIodmFsKSBiZmluX3dyaXRlUFRSKE1ETUExX0QxX1NUQVJUX0FERFIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUExX0QxX0NPTkZJRygpICAgIGJmaW5fcmVhZDE2KE1ETUExX0QxX0NPTkZJRykKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMV9EMV9DT05GSUcodmFsKSBiZmluX3dyaXRlMTYoTURNQTFfRDFfQ09ORklHLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BMV9EMV9YX0NPVU5UKCkgICBiZmluX3JlYWQxNihNRE1BMV9EMV9YX0NPVU5UKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUExX0QxX1hfQ09VTlQodmFsKSBiZmluX3dyaXRlMTYoTURNQTFfRDFfWF9DT1VOVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQTFfRDFfWF9NT0RJRlkoKSAgYmZpbl9yZWFkMTYoTURNQTFfRDFfWF9NT0RJRlkpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQTFfRDFfWF9NT0RJRlkodmFsKSBiZmluX3dyaXRlMTYoTURNQTFfRDFfWF9NT0RJRlksIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUExX0QxX1lfQ09VTlQoKSAgIGJmaW5fcmVhZDE2KE1ETUExX0QxX1lfQ09VTlQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQTFfRDFfWV9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMV9EMV9ZX0NPVU5ULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BMV9EMV9ZX01PRElGWSgpICBiZmluX3JlYWQxNihNRE1BMV9EMV9ZX01PRElGWSkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMV9EMV9ZX01PRElGWSh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMV9EMV9ZX01PRElGWSwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQTFfRDFfQ1VSUl9ERVNDX1BUUigpIGJmaW5fcmVhZFBUUihNRE1BMV9EMV9DVVJSX0RFU0NfUFRSKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUExX0QxX0NVUlJfREVTQ19QVFIodmFsKSBiZmluX3dyaXRlUFRSKE1ETUExX0QxX0NVUlJfREVTQ19QVFIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUExX0QxX0NVUlJfQUREUigpIGJmaW5fcmVhZFBUUihNRE1BMV9EMV9DVVJSX0FERFIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQTFfRDFfQ1VSUl9BRERSKHZhbCkgYmZpbl93cml0ZVBUUihNRE1BMV9EMV9DVVJSX0FERFIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUExX0QxX0lSUV9TVEFUVVMoKSBiZmluX3JlYWQxNihNRE1BMV9EMV9JUlFfU1RBVFVTKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUExX0QxX0lSUV9TVEFUVVModmFsKSBiZmluX3dyaXRlMTYoTURNQTFfRDFfSVJRX1NUQVRVUywgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQTFfRDFfUEVSSVBIRVJBTF9NQVAoKSBiZmluX3JlYWQxNihNRE1BMV9EMV9QRVJJUEhFUkFMX01BUCkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMV9EMV9QRVJJUEhFUkFMX01BUCh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMV9EMV9QRVJJUEhFUkFMX01BUCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQTFfRDFfQ1VSUl9YX0NPVU5UKCkgYmZpbl9yZWFkMTYoTURNQTFfRDFfQ1VSUl9YX0NPVU5UKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUExX0QxX0NVUlJfWF9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMV9EMV9DVVJSX1hfQ09VTlQsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUExX0QxX0NVUlJfWV9DT1VOVCgpIGJmaW5fcmVhZDE2KE1ETUExX0QxX0NVUlJfWV9DT1VOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMV9EMV9DVVJSX1lfQ09VTlQodmFsKSBiZmluX3dyaXRlMTYoTURNQTFfRDFfQ1VSUl9ZX0NPVU5ULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BMV9TMV9ORVhUX0RFU0NfUFRSKCkgYmZpbl9yZWFkUFRSKE1ETUExX1MxX05FWFRfREVTQ19QVFIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQTFfUzFfTkVYVF9ERVNDX1BUUih2YWwpIGJmaW5fd3JpdGVQVFIoTURNQTFfUzFfTkVYVF9ERVNDX1BUUiwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQTFfUzFfU1RBUlRfQUREUigpIGJmaW5fcmVhZFBUUihNRE1BMV9TMV9TVEFSVF9BRERSKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUExX1MxX1NUQVJUX0FERFIodmFsKSBiZmluX3dyaXRlUFRSKE1ETUExX1MxX1NUQVJUX0FERFIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUExX1MxX0NPTkZJRygpICAgIGJmaW5fcmVhZDE2KE1ETUExX1MxX0NPTkZJRykKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMV9TMV9DT05GSUcodmFsKSBiZmluX3dyaXRlMTYoTURNQTFfUzFfQ09ORklHLCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BMV9TMV9YX0NPVU5UKCkgICBiZmluX3JlYWQxNihNRE1BMV9TMV9YX0NPVU5UKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUExX1MxX1hfQ09VTlQodmFsKSBiZmluX3dyaXRlMTYoTURNQTFfUzFfWF9DT1VOVCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQTFfUzFfWF9NT0RJRlkoKSAgYmZpbl9yZWFkMTYoTURNQTFfUzFfWF9NT0RJRlkpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQTFfUzFfWF9NT0RJRlkodmFsKSBiZmluX3dyaXRlMTYoTURNQTFfUzFfWF9NT0RJRlksIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUExX1MxX1lfQ09VTlQoKSAgIGJmaW5fcmVhZDE2KE1ETUExX1MxX1lfQ09VTlQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQTFfUzFfWV9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMV9TMV9ZX0NPVU5ULCB2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BMV9TMV9ZX01PRElGWSgpICBiZmluX3JlYWQxNihNRE1BMV9TMV9ZX01PRElGWSkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMV9TMV9ZX01PRElGWSh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMV9TMV9ZX01PRElGWSwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQTFfUzFfQ1VSUl9ERVNDX1BUUigpIGJmaW5fcmVhZFBUUihNRE1BMV9TMV9DVVJSX0RFU0NfUFRSKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUExX1MxX0NVUlJfREVTQ19QVFIodmFsKSBiZmluX3dyaXRlUFRSKE1ETUExX1MxX0NVUlJfREVTQ19QVFIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUExX1MxX0NVUlJfQUREUigpIGJmaW5fcmVhZFBUUihNRE1BMV9TMV9DVVJSX0FERFIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQTFfUzFfQ1VSUl9BRERSKHZhbCkgYmZpbl93cml0ZVBUUihNRE1BMV9TMV9DVVJSX0FERFIsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUExX1MxX0lSUV9TVEFUVVMoKSBiZmluX3JlYWQxNihNRE1BMV9TMV9JUlFfU1RBVFVTKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUExX1MxX0lSUV9TVEFUVVModmFsKSBiZmluX3dyaXRlMTYoTURNQTFfUzFfSVJRX1NUQVRVUywgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQTFfUzFfUEVSSVBIRVJBTF9NQVAoKSBiZmluX3JlYWQxNihNRE1BMV9TMV9QRVJJUEhFUkFMX01BUCkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMV9TMV9QRVJJUEhFUkFMX01BUCh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMV9TMV9QRVJJUEhFUkFMX01BUCwgdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQTFfUzFfQ1VSUl9YX0NPVU5UKCkgYmZpbl9yZWFkMTYoTURNQTFfUzFfQ1VSUl9YX0NPVU5UKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUExX1MxX0NVUlJfWF9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMV9TMV9DVVJSX1hfQ09VTlQsIHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUExX1MxX0NVUlJfWV9DT1VOVCgpIGJmaW5fcmVhZDE2KE1ETUExX1MxX0NVUlJfWV9DT1VOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMV9TMV9DVVJSX1lfQ09VTlQodmFsKSBiZmluX3dyaXRlMTYoTURNQTFfUzFfQ1VSUl9ZX0NPVU5ULCB2YWwpCi0KLSNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzBfQ09ORklHKCkgIGJmaW5fcmVhZF9NRE1BMF9TMF9DT05GSUcoKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzBfQ09ORklHKHZhbCkgYmZpbl93cml0ZV9NRE1BMF9TMF9DT05GSUcodmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMF9JUlFfU1RBVFVTKCkgIGJmaW5fcmVhZF9NRE1BMF9TMF9JUlFfU1RBVFVTKCkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MwX0lSUV9TVEFUVVModmFsKSBiZmluX3dyaXRlX01ETUEwX1MwX0lSUV9TVEFUVVModmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMF9YX01PRElGWSgpICBiZmluX3JlYWRfTURNQTBfUzBfWF9NT0RJRlkoKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzBfWF9NT0RJRlkodmFsKSBiZmluX3dyaXRlX01ETUEwX1MwX1hfTU9ESUZZKHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzBfWV9NT0RJRlkoKSAgYmZpbl9yZWFkX01ETUEwX1MwX1lfTU9ESUZZKCkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MwX1lfTU9ESUZZKHZhbCkgYmZpbl93cml0ZV9NRE1BMF9TMF9ZX01PRElGWSh2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MwX1hfQ09VTlQoKSAgYmZpbl9yZWFkX01ETUEwX1MwX1hfQ09VTlQoKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzBfWF9DT1VOVCh2YWwpIGJmaW5fd3JpdGVfTURNQTBfUzBfWF9DT1VOVCh2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MwX1lfQ09VTlQoKSAgYmZpbl9yZWFkX01ETUEwX1MwX1lfQ09VTlQoKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzBfWV9DT1VOVCh2YWwpIGJmaW5fd3JpdGVfTURNQTBfUzBfWV9DT1VOVCh2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MwX1NUQVJUX0FERFIoKSAgYmZpbl9yZWFkX01ETUEwX1MwX1NUQVJUX0FERFIoKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzBfU1RBUlRfQUREUih2YWwpIGJmaW5fd3JpdGVfTURNQTBfUzBfU1RBUlRfQUREUih2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QwX0NPTkZJRygpICBiZmluX3JlYWRfTURNQTBfRDBfQ09ORklHKCkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QwX0NPTkZJRyh2YWwpIGJmaW5fd3JpdGVfTURNQTBfRDBfQ09ORklHKHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDBfSVJRX1NUQVRVUygpICBiZmluX3JlYWRfTURNQTBfRDBfSVJRX1NUQVRVUygpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMF9JUlFfU1RBVFVTKHZhbCkgYmZpbl93cml0ZV9NRE1BMF9EMF9JUlFfU1RBVFVTKHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDBfWF9NT0RJRlkoKSAgYmZpbl9yZWFkX01ETUEwX0QwX1hfTU9ESUZZKCkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QwX1hfTU9ESUZZKHZhbCkgYmZpbl93cml0ZV9NRE1BMF9EMF9YX01PRElGWSh2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QwX1lfTU9ESUZZKCkgIGJmaW5fcmVhZF9NRE1BMF9EMF9ZX01PRElGWSgpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMF9ZX01PRElGWSh2YWwpIGJmaW5fd3JpdGVfTURNQTBfRDBfWV9NT0RJRlkodmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMF9YX0NPVU5UKCkgIGJmaW5fcmVhZF9NRE1BMF9EMF9YX0NPVU5UKCkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QwX1hfQ09VTlQodmFsKSBiZmluX3dyaXRlX01ETUEwX0QwX1hfQ09VTlQodmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMF9ZX0NPVU5UKCkgIGJmaW5fcmVhZF9NRE1BMF9EMF9ZX0NPVU5UKCkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QwX1lfQ09VTlQodmFsKSBiZmluX3dyaXRlX01ETUEwX0QwX1lfQ09VTlQodmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMF9TVEFSVF9BRERSKCkgIGJmaW5fcmVhZF9NRE1BMF9EMF9TVEFSVF9BRERSKCkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QwX1NUQVJUX0FERFIodmFsKSBiZmluX3dyaXRlX01ETUEwX0QwX1NUQVJUX0FERFIodmFsKQotCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MxX0NPTkZJRygpICBiZmluX3JlYWRfTURNQTBfUzFfQ09ORklHKCkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MxX0NPTkZJRyh2YWwpIGJmaW5fd3JpdGVfTURNQTBfUzFfQ09ORklHKHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzFfSVJRX1NUQVRVUygpICBiZmluX3JlYWRfTURNQTBfUzFfSVJRX1NUQVRVUygpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMV9JUlFfU1RBVFVTKHZhbCkgYmZpbl93cml0ZV9NRE1BMF9TMV9JUlFfU1RBVFVTKHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzFfWF9NT0RJRlkoKSAgYmZpbl9yZWFkX01ETUEwX1MxX1hfTU9ESUZZKCkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MxX1hfTU9ESUZZKHZhbCkgYmZpbl93cml0ZV9NRE1BMF9TMV9YX01PRElGWSh2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MxX1lfTU9ESUZZKCkgIGJmaW5fcmVhZF9NRE1BMF9TMV9ZX01PRElGWSgpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMV9ZX01PRElGWSh2YWwpIGJmaW5fd3JpdGVfTURNQTBfUzFfWV9NT0RJRlkodmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMV9YX0NPVU5UKCkgIGJmaW5fcmVhZF9NRE1BMF9TMV9YX0NPVU5UKCkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MxX1hfQ09VTlQodmFsKSBiZmluX3dyaXRlX01ETUEwX1MxX1hfQ09VTlQodmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMV9ZX0NPVU5UKCkgIGJmaW5fcmVhZF9NRE1BMF9TMV9ZX0NPVU5UKCkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MxX1lfQ09VTlQodmFsKSBiZmluX3dyaXRlX01ETUEwX1MxX1lfQ09VTlQodmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMV9TVEFSVF9BRERSKCkgIGJmaW5fcmVhZF9NRE1BMF9TMV9TVEFSVF9BRERSKCkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MxX1NUQVJUX0FERFIodmFsKSBiZmluX3dyaXRlX01ETUEwX1MxX1NUQVJUX0FERFIodmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMV9DT05GSUcoKSAgYmZpbl9yZWFkX01ETUEwX0QxX0NPTkZJRygpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMV9DT05GSUcodmFsKSBiZmluX3dyaXRlX01ETUEwX0QxX0NPTkZJRyh2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QxX0lSUV9TVEFUVVMoKSAgYmZpbl9yZWFkX01ETUEwX0QxX0lSUV9TVEFUVVMoKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDFfSVJRX1NUQVRVUyh2YWwpIGJmaW5fd3JpdGVfTURNQTBfRDFfSVJRX1NUQVRVUyh2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QxX1hfTU9ESUZZKCkgIGJmaW5fcmVhZF9NRE1BMF9EMV9YX01PRElGWSgpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMV9YX01PRElGWSh2YWwpIGJmaW5fd3JpdGVfTURNQTBfRDFfWF9NT0RJRlkodmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMV9ZX01PRElGWSgpICBiZmluX3JlYWRfTURNQTBfRDFfWV9NT0RJRlkoKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDFfWV9NT0RJRlkodmFsKSBiZmluX3dyaXRlX01ETUEwX0QxX1lfTU9ESUZZKHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDFfWF9DT1VOVCgpICBiZmluX3JlYWRfTURNQTBfRDFfWF9DT1VOVCgpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMV9YX0NPVU5UKHZhbCkgYmZpbl93cml0ZV9NRE1BMF9EMV9YX0NPVU5UKHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDFfWV9DT1VOVCgpICBiZmluX3JlYWRfTURNQTBfRDFfWV9DT1VOVCgpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMV9ZX0NPVU5UKHZhbCkgYmZpbl93cml0ZV9NRE1BMF9EMV9ZX0NPVU5UKHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDFfU1RBUlRfQUREUigpICBiZmluX3JlYWRfTURNQTBfRDFfU1RBUlRfQUREUigpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMV9TVEFSVF9BRERSKHZhbCkgYmZpbl93cml0ZV9NRE1BMF9EMV9TVEFSVF9BRERSKHZhbCkKLQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMF9ORVhUX0RFU0NfUFRSKCkgYmZpbl9yZWFkUFRSKE1ETUFfRDBfTkVYVF9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QwX05FWFRfREVTQ19QVFIodmFsKSBiZmluX3dyaXRlUFRSKE1ETUFfRDBfTkVYVF9ERVNDX1BUUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMF9TVEFSVF9BRERSKCkgYmZpbl9yZWFkUFRSKE1ETUFfRDBfU1RBUlRfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QwX1NUQVJUX0FERFIodmFsKSBiZmluX3dyaXRlUFRSKE1ETUFfRDBfU1RBUlRfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMF9DT05GSUcoKSAgICBiZmluX3JlYWQxNihNRE1BX0QwX0NPTkZJRykKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QwX0NPTkZJRyh2YWwpIGJmaW5fd3JpdGUxNihNRE1BX0QwX0NPTkZJRywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMF9YX0NPVU5UKCkgICBiZmluX3JlYWQxNihNRE1BX0QwX1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMF9YX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KE1ETUFfRDBfWF9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMF9YX01PRElGWSgpICBiZmluX3JlYWQxNihNRE1BX0QwX1hfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDBfWF9NT0RJRlkodmFsKSBiZmluX3dyaXRlMTYoTURNQV9EMF9YX01PRElGWSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMF9ZX0NPVU5UKCkgICBiZmluX3JlYWQxNihNRE1BX0QwX1lfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMF9ZX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KE1ETUFfRDBfWV9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMF9ZX01PRElGWSgpICBiZmluX3JlYWQxNihNRE1BX0QwX1lfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDBfWV9NT0RJRlkodmFsKSBiZmluX3dyaXRlMTYoTURNQV9EMF9ZX01PRElGWSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMF9DVVJSX0RFU0NfUFRSKCkgYmZpbl9yZWFkUFRSKE1ETUFfRDBfQ1VSUl9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QwX0NVUlJfREVTQ19QVFIodmFsKSBiZmluX3dyaXRlUFRSKE1ETUFfRDBfQ1VSUl9ERVNDX1BUUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMF9DVVJSX0FERFIoKSBiZmluX3JlYWRQVFIoTURNQV9EMF9DVVJSX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMF9DVVJSX0FERFIodmFsKSBiZmluX3dyaXRlUFRSKE1ETUFfRDBfQ1VSUl9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QwX0lSUV9TVEFUVVMoKSBiZmluX3JlYWQxNihNRE1BX0QwX0lSUV9TVEFUVVMpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMF9JUlFfU1RBVFVTKHZhbCkgYmZpbl93cml0ZTE2KE1ETUFfRDBfSVJRX1NUQVRVUywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMF9QRVJJUEhFUkFMX01BUCgpIGJmaW5fcmVhZDE2KE1ETUFfRDBfUEVSSVBIRVJBTF9NQVApCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMF9QRVJJUEhFUkFMX01BUCh2YWwpIGJmaW5fd3JpdGUxNihNRE1BX0QwX1BFUklQSEVSQUxfTUFQLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QwX0NVUlJfWF9DT1VOVCgpIGJmaW5fcmVhZDE2KE1ETUFfRDBfQ1VSUl9YX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDBfQ1VSUl9YX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KE1ETUFfRDBfQ1VSUl9YX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QwX0NVUlJfWV9DT1VOVCgpIGJmaW5fcmVhZDE2KE1ETUFfRDBfQ1VSUl9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDBfQ1VSUl9ZX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KE1ETUFfRDBfQ1VSUl9ZX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MwX05FWFRfREVTQ19QVFIoKSBiZmluX3JlYWRQVFIoTURNQV9TMF9ORVhUX0RFU0NfUFRSKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzBfTkVYVF9ERVNDX1BUUih2YWwpIGJmaW5fd3JpdGVQVFIoTURNQV9TMF9ORVhUX0RFU0NfUFRSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MwX1NUQVJUX0FERFIoKSBiZmluX3JlYWRQVFIoTURNQV9TMF9TVEFSVF9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzBfU1RBUlRfQUREUih2YWwpIGJmaW5fd3JpdGVQVFIoTURNQV9TMF9TVEFSVF9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MwX0NPTkZJRygpICAgIGJmaW5fcmVhZDE2KE1ETUFfUzBfQ09ORklHKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzBfQ09ORklHKHZhbCkgYmZpbl93cml0ZTE2KE1ETUFfUzBfQ09ORklHLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MwX1hfQ09VTlQoKSAgIGJmaW5fcmVhZDE2KE1ETUFfUzBfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MwX1hfQ09VTlQodmFsKSBiZmluX3dyaXRlMTYoTURNQV9TMF9YX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MwX1hfTU9ESUZZKCkgIGJmaW5fcmVhZDE2KE1ETUFfUzBfWF9NT0RJRlkpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMF9YX01PRElGWSh2YWwpIGJmaW5fd3JpdGUxNihNRE1BX1MwX1hfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MwX1lfQ09VTlQoKSAgIGJmaW5fcmVhZDE2KE1ETUFfUzBfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MwX1lfQ09VTlQodmFsKSBiZmluX3dyaXRlMTYoTURNQV9TMF9ZX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MwX1lfTU9ESUZZKCkgIGJmaW5fcmVhZDE2KE1ETUFfUzBfWV9NT0RJRlkpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMF9ZX01PRElGWSh2YWwpIGJmaW5fd3JpdGUxNihNRE1BX1MwX1lfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MwX0NVUlJfREVTQ19QVFIoKSBiZmluX3JlYWRQVFIoTURNQV9TMF9DVVJSX0RFU0NfUFRSKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzBfQ1VSUl9ERVNDX1BUUih2YWwpIGJmaW5fd3JpdGVQVFIoTURNQV9TMF9DVVJSX0RFU0NfUFRSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MwX0NVUlJfQUREUigpIGJmaW5fcmVhZFBUUihNRE1BX1MwX0NVUlJfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MwX0NVUlJfQUREUih2YWwpIGJmaW5fd3JpdGVQVFIoTURNQV9TMF9DVVJSX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzBfSVJRX1NUQVRVUygpIGJmaW5fcmVhZDE2KE1ETUFfUzBfSVJRX1NUQVRVUykKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MwX0lSUV9TVEFUVVModmFsKSBiZmluX3dyaXRlMTYoTURNQV9TMF9JUlFfU1RBVFVTLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MwX1BFUklQSEVSQUxfTUFQKCkgYmZpbl9yZWFkMTYoTURNQV9TMF9QRVJJUEhFUkFMX01BUCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MwX1BFUklQSEVSQUxfTUFQKHZhbCkgYmZpbl93cml0ZTE2KE1ETUFfUzBfUEVSSVBIRVJBTF9NQVAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzBfQ1VSUl9YX0NPVU5UKCkgYmZpbl9yZWFkMTYoTURNQV9TMF9DVVJSX1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMF9DVVJSX1hfQ09VTlQodmFsKSBiZmluX3dyaXRlMTYoTURNQV9TMF9DVVJSX1hfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzBfQ1VSUl9ZX0NPVU5UKCkgYmZpbl9yZWFkMTYoTURNQV9TMF9DVVJSX1lfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMF9DVVJSX1lfQ09VTlQodmFsKSBiZmluX3dyaXRlMTYoTURNQV9TMF9DVVJSX1lfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDFfTkVYVF9ERVNDX1BUUigpIGJmaW5fcmVhZFBUUihNRE1BX0QxX05FWFRfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMV9ORVhUX0RFU0NfUFRSKHZhbCkgYmZpbl93cml0ZVBUUihNRE1BX0QxX05FWFRfREVTQ19QVFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDFfU1RBUlRfQUREUigpIGJmaW5fcmVhZFBUUihNRE1BX0QxX1NUQVJUX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMV9TVEFSVF9BRERSKHZhbCkgYmZpbl93cml0ZVBUUihNRE1BX0QxX1NUQVJUX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDFfQ09ORklHKCkgICAgYmZpbl9yZWFkMTYoTURNQV9EMV9DT05GSUcpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMV9DT05GSUcodmFsKSBiZmluX3dyaXRlMTYoTURNQV9EMV9DT05GSUcsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDFfWF9DT1VOVCgpICAgYmZpbl9yZWFkMTYoTURNQV9EMV9YX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDFfWF9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihNRE1BX0QxX1hfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDFfWF9NT0RJRlkoKSAgYmZpbl9yZWFkMTYoTURNQV9EMV9YX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QxX1hfTU9ESUZZKHZhbCkgYmZpbl93cml0ZTE2KE1ETUFfRDFfWF9NT0RJRlksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDFfWV9DT1VOVCgpICAgYmZpbl9yZWFkMTYoTURNQV9EMV9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDFfWV9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihNRE1BX0QxX1lfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDFfWV9NT0RJRlkoKSAgYmZpbl9yZWFkMTYoTURNQV9EMV9ZX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QxX1lfTU9ESUZZKHZhbCkgYmZpbl93cml0ZTE2KE1ETUFfRDFfWV9NT0RJRlksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDFfQ1VSUl9ERVNDX1BUUigpIGJmaW5fcmVhZFBUUihNRE1BX0QxX0NVUlJfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMV9DVVJSX0RFU0NfUFRSKHZhbCkgYmZpbl93cml0ZVBUUihNRE1BX0QxX0NVUlJfREVTQ19QVFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDFfQ1VSUl9BRERSKCkgYmZpbl9yZWFkUFRSKE1ETUFfRDFfQ1VSUl9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDFfQ1VSUl9BRERSKHZhbCkgYmZpbl93cml0ZVBUUihNRE1BX0QxX0NVUlJfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMV9JUlFfU1RBVFVTKCkgYmZpbl9yZWFkMTYoTURNQV9EMV9JUlFfU1RBVFVTKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDFfSVJRX1NUQVRVUyh2YWwpIGJmaW5fd3JpdGUxNihNRE1BX0QxX0lSUV9TVEFUVVMsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDFfUEVSSVBIRVJBTF9NQVAoKSBiZmluX3JlYWQxNihNRE1BX0QxX1BFUklQSEVSQUxfTUFQKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDFfUEVSSVBIRVJBTF9NQVAodmFsKSBiZmluX3dyaXRlMTYoTURNQV9EMV9QRVJJUEhFUkFMX01BUCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMV9DVVJSX1hfQ09VTlQoKSBiZmluX3JlYWQxNihNRE1BX0QxX0NVUlJfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QxX0NVUlJfWF9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihNRE1BX0QxX0NVUlJfWF9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMV9DVVJSX1lfQ09VTlQoKSBiZmluX3JlYWQxNihNRE1BX0QxX0NVUlJfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QxX0NVUlJfWV9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihNRE1BX0QxX0NVUlJfWV9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMV9ORVhUX0RFU0NfUFRSKCkgYmZpbl9yZWFkUFRSKE1ETUFfUzFfTkVYVF9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MxX05FWFRfREVTQ19QVFIodmFsKSBiZmluX3dyaXRlUFRSKE1ETUFfUzFfTkVYVF9ERVNDX1BUUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMV9TVEFSVF9BRERSKCkgYmZpbl9yZWFkUFRSKE1ETUFfUzFfU1RBUlRfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MxX1NUQVJUX0FERFIodmFsKSBiZmluX3dyaXRlUFRSKE1ETUFfUzFfU1RBUlRfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMV9DT05GSUcoKSAgICBiZmluX3JlYWQxNihNRE1BX1MxX0NPTkZJRykKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MxX0NPTkZJRyh2YWwpIGJmaW5fd3JpdGUxNihNRE1BX1MxX0NPTkZJRywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMV9YX0NPVU5UKCkgICBiZmluX3JlYWQxNihNRE1BX1MxX1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMV9YX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KE1ETUFfUzFfWF9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMV9YX01PRElGWSgpICBiZmluX3JlYWQxNihNRE1BX1MxX1hfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzFfWF9NT0RJRlkodmFsKSBiZmluX3dyaXRlMTYoTURNQV9TMV9YX01PRElGWSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMV9ZX0NPVU5UKCkgICBiZmluX3JlYWQxNihNRE1BX1MxX1lfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMV9ZX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KE1ETUFfUzFfWV9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMV9ZX01PRElGWSgpICBiZmluX3JlYWQxNihNRE1BX1MxX1lfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzFfWV9NT0RJRlkodmFsKSBiZmluX3dyaXRlMTYoTURNQV9TMV9ZX01PRElGWSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMV9DVVJSX0RFU0NfUFRSKCkgYmZpbl9yZWFkUFRSKE1ETUFfUzFfQ1VSUl9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MxX0NVUlJfREVTQ19QVFIodmFsKSBiZmluX3dyaXRlUFRSKE1ETUFfUzFfQ1VSUl9ERVNDX1BUUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMV9DVVJSX0FERFIoKSBiZmluX3JlYWRQVFIoTURNQV9TMV9DVVJSX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMV9DVVJSX0FERFIodmFsKSBiZmluX3dyaXRlUFRSKE1ETUFfUzFfQ1VSUl9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MxX0lSUV9TVEFUVVMoKSBiZmluX3JlYWQxNihNRE1BX1MxX0lSUV9TVEFUVVMpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMV9JUlFfU1RBVFVTKHZhbCkgYmZpbl93cml0ZTE2KE1ETUFfUzFfSVJRX1NUQVRVUywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMV9QRVJJUEhFUkFMX01BUCgpIGJmaW5fcmVhZDE2KE1ETUFfUzFfUEVSSVBIRVJBTF9NQVApCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMV9QRVJJUEhFUkFMX01BUCh2YWwpIGJmaW5fd3JpdGUxNihNRE1BX1MxX1BFUklQSEVSQUxfTUFQLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MxX0NVUlJfWF9DT1VOVCgpIGJmaW5fcmVhZDE2KE1ETUFfUzFfQ1VSUl9YX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzFfQ1VSUl9YX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KE1ETUFfUzFfQ1VSUl9YX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MxX0NVUlJfWV9DT1VOVCgpIGJmaW5fcmVhZDE2KE1ETUFfUzFfQ1VSUl9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzFfQ1VSUl9ZX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KE1ETUFfUzFfQ1VSUl9ZX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QyX05FWFRfREVTQ19QVFIoKSBiZmluX3JlYWRQVFIoTURNQV9EMl9ORVhUX0RFU0NfUFRSKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDJfTkVYVF9ERVNDX1BUUih2YWwpIGJmaW5fd3JpdGVQVFIoTURNQV9EMl9ORVhUX0RFU0NfUFRSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QyX1NUQVJUX0FERFIoKSBiZmluX3JlYWRQVFIoTURNQV9EMl9TVEFSVF9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDJfU1RBUlRfQUREUih2YWwpIGJmaW5fd3JpdGVQVFIoTURNQV9EMl9TVEFSVF9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QyX0NPTkZJRygpICAgIGJmaW5fcmVhZDE2KE1ETUFfRDJfQ09ORklHKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDJfQ09ORklHKHZhbCkgYmZpbl93cml0ZTE2KE1ETUFfRDJfQ09ORklHLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QyX1hfQ09VTlQoKSAgIGJmaW5fcmVhZDE2KE1ETUFfRDJfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QyX1hfQ09VTlQodmFsKSBiZmluX3dyaXRlMTYoTURNQV9EMl9YX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QyX1hfTU9ESUZZKCkgIGJmaW5fcmVhZDE2KE1ETUFfRDJfWF9NT0RJRlkpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMl9YX01PRElGWSh2YWwpIGJmaW5fd3JpdGUxNihNRE1BX0QyX1hfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QyX1lfQ09VTlQoKSAgIGJmaW5fcmVhZDE2KE1ETUFfRDJfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QyX1lfQ09VTlQodmFsKSBiZmluX3dyaXRlMTYoTURNQV9EMl9ZX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QyX1lfTU9ESUZZKCkgIGJmaW5fcmVhZDE2KE1ETUFfRDJfWV9NT0RJRlkpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMl9ZX01PRElGWSh2YWwpIGJmaW5fd3JpdGUxNihNRE1BX0QyX1lfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QyX0NVUlJfREVTQ19QVFIoKSBiZmluX3JlYWRQVFIoTURNQV9EMl9DVVJSX0RFU0NfUFRSKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDJfQ1VSUl9ERVNDX1BUUih2YWwpIGJmaW5fd3JpdGVQVFIoTURNQV9EMl9DVVJSX0RFU0NfUFRSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QyX0NVUlJfQUREUigpIGJmaW5fcmVhZFBUUihNRE1BX0QyX0NVUlJfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QyX0NVUlJfQUREUih2YWwpIGJmaW5fd3JpdGVQVFIoTURNQV9EMl9DVVJSX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDJfSVJRX1NUQVRVUygpIGJmaW5fcmVhZDE2KE1ETUFfRDJfSVJRX1NUQVRVUykKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QyX0lSUV9TVEFUVVModmFsKSBiZmluX3dyaXRlMTYoTURNQV9EMl9JUlFfU1RBVFVTLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QyX1BFUklQSEVSQUxfTUFQKCkgYmZpbl9yZWFkMTYoTURNQV9EMl9QRVJJUEhFUkFMX01BUCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QyX1BFUklQSEVSQUxfTUFQKHZhbCkgYmZpbl93cml0ZTE2KE1ETUFfRDJfUEVSSVBIRVJBTF9NQVAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDJfQ1VSUl9YX0NPVU5UKCkgYmZpbl9yZWFkMTYoTURNQV9EMl9DVVJSX1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMl9DVVJSX1hfQ09VTlQodmFsKSBiZmluX3dyaXRlMTYoTURNQV9EMl9DVVJSX1hfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDJfQ1VSUl9ZX0NPVU5UKCkgYmZpbl9yZWFkMTYoTURNQV9EMl9DVVJSX1lfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMl9DVVJSX1lfQ09VTlQodmFsKSBiZmluX3dyaXRlMTYoTURNQV9EMl9DVVJSX1lfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzJfTkVYVF9ERVNDX1BUUigpIGJmaW5fcmVhZFBUUihNRE1BX1MyX05FWFRfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMl9ORVhUX0RFU0NfUFRSKHZhbCkgYmZpbl93cml0ZVBUUihNRE1BX1MyX05FWFRfREVTQ19QVFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzJfU1RBUlRfQUREUigpIGJmaW5fcmVhZFBUUihNRE1BX1MyX1NUQVJUX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMl9TVEFSVF9BRERSKHZhbCkgYmZpbl93cml0ZVBUUihNRE1BX1MyX1NUQVJUX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzJfQ09ORklHKCkgICAgYmZpbl9yZWFkMTYoTURNQV9TMl9DT05GSUcpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMl9DT05GSUcodmFsKSBiZmluX3dyaXRlMTYoTURNQV9TMl9DT05GSUcsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzJfWF9DT1VOVCgpICAgYmZpbl9yZWFkMTYoTURNQV9TMl9YX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzJfWF9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihNRE1BX1MyX1hfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzJfWF9NT0RJRlkoKSAgYmZpbl9yZWFkMTYoTURNQV9TMl9YX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MyX1hfTU9ESUZZKHZhbCkgYmZpbl93cml0ZTE2KE1ETUFfUzJfWF9NT0RJRlksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzJfWV9DT1VOVCgpICAgYmZpbl9yZWFkMTYoTURNQV9TMl9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzJfWV9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihNRE1BX1MyX1lfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzJfWV9NT0RJRlkoKSAgYmZpbl9yZWFkMTYoTURNQV9TMl9ZX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MyX1lfTU9ESUZZKHZhbCkgYmZpbl93cml0ZTE2KE1ETUFfUzJfWV9NT0RJRlksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzJfQ1VSUl9ERVNDX1BUUigpIGJmaW5fcmVhZFBUUihNRE1BX1MyX0NVUlJfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMl9DVVJSX0RFU0NfUFRSKHZhbCkgYmZpbl93cml0ZVBUUihNRE1BX1MyX0NVUlJfREVTQ19QVFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzJfQ1VSUl9BRERSKCkgYmZpbl9yZWFkUFRSKE1ETUFfUzJfQ1VSUl9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzJfQ1VSUl9BRERSKHZhbCkgYmZpbl93cml0ZVBUUihNRE1BX1MyX0NVUlJfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMl9JUlFfU1RBVFVTKCkgYmZpbl9yZWFkMTYoTURNQV9TMl9JUlFfU1RBVFVTKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzJfSVJRX1NUQVRVUyh2YWwpIGJmaW5fd3JpdGUxNihNRE1BX1MyX0lSUV9TVEFUVVMsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzJfUEVSSVBIRVJBTF9NQVAoKSBiZmluX3JlYWQxNihNRE1BX1MyX1BFUklQSEVSQUxfTUFQKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzJfUEVSSVBIRVJBTF9NQVAodmFsKSBiZmluX3dyaXRlMTYoTURNQV9TMl9QRVJJUEhFUkFMX01BUCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMl9DVVJSX1hfQ09VTlQoKSBiZmluX3JlYWQxNihNRE1BX1MyX0NVUlJfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MyX0NVUlJfWF9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihNRE1BX1MyX0NVUlJfWF9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMl9DVVJSX1lfQ09VTlQoKSBiZmluX3JlYWQxNihNRE1BX1MyX0NVUlJfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MyX0NVUlJfWV9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihNRE1BX1MyX0NVUlJfWV9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9EM19ORVhUX0RFU0NfUFRSKCkgYmZpbl9yZWFkUFRSKE1ETUFfRDNfTkVYVF9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QzX05FWFRfREVTQ19QVFIodmFsKSBiZmluX3dyaXRlUFRSKE1ETUFfRDNfTkVYVF9ERVNDX1BUUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9EM19TVEFSVF9BRERSKCkgYmZpbl9yZWFkUFRSKE1ETUFfRDNfU1RBUlRfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QzX1NUQVJUX0FERFIodmFsKSBiZmluX3dyaXRlUFRSKE1ETUFfRDNfU1RBUlRfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9EM19DT05GSUcoKSAgICBiZmluX3JlYWQxNihNRE1BX0QzX0NPTkZJRykKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QzX0NPTkZJRyh2YWwpIGJmaW5fd3JpdGUxNihNRE1BX0QzX0NPTkZJRywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9EM19YX0NPVU5UKCkgICBiZmluX3JlYWQxNihNRE1BX0QzX1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EM19YX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KE1ETUFfRDNfWF9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9EM19YX01PRElGWSgpICBiZmluX3JlYWQxNihNRE1BX0QzX1hfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDNfWF9NT0RJRlkodmFsKSBiZmluX3dyaXRlMTYoTURNQV9EM19YX01PRElGWSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9EM19ZX0NPVU5UKCkgICBiZmluX3JlYWQxNihNRE1BX0QzX1lfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EM19ZX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KE1ETUFfRDNfWV9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9EM19ZX01PRElGWSgpICBiZmluX3JlYWQxNihNRE1BX0QzX1lfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDNfWV9NT0RJRlkodmFsKSBiZmluX3dyaXRlMTYoTURNQV9EM19ZX01PRElGWSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9EM19DVVJSX0RFU0NfUFRSKCkgYmZpbl9yZWFkUFRSKE1ETUFfRDNfQ1VSUl9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QzX0NVUlJfREVTQ19QVFIodmFsKSBiZmluX3dyaXRlUFRSKE1ETUFfRDNfQ1VSUl9ERVNDX1BUUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9EM19DVVJSX0FERFIoKSBiZmluX3JlYWRQVFIoTURNQV9EM19DVVJSX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EM19DVVJSX0FERFIodmFsKSBiZmluX3dyaXRlUFRSKE1ETUFfRDNfQ1VSUl9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QzX0lSUV9TVEFUVVMoKSBiZmluX3JlYWQxNihNRE1BX0QzX0lSUV9TVEFUVVMpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EM19JUlFfU1RBVFVTKHZhbCkgYmZpbl93cml0ZTE2KE1ETUFfRDNfSVJRX1NUQVRVUywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9EM19QRVJJUEhFUkFMX01BUCgpIGJmaW5fcmVhZDE2KE1ETUFfRDNfUEVSSVBIRVJBTF9NQVApCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EM19QRVJJUEhFUkFMX01BUCh2YWwpIGJmaW5fd3JpdGUxNihNRE1BX0QzX1BFUklQSEVSQUxfTUFQLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QzX0NVUlJfWF9DT1VOVCgpIGJmaW5fcmVhZDE2KE1ETUFfRDNfQ1VSUl9YX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDNfQ1VSUl9YX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KE1ETUFfRDNfQ1VSUl9YX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QzX0NVUlJfWV9DT1VOVCgpIGJmaW5fcmVhZDE2KE1ETUFfRDNfQ1VSUl9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDNfQ1VSUl9ZX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KE1ETUFfRDNfQ1VSUl9ZX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MzX05FWFRfREVTQ19QVFIoKSBiZmluX3JlYWRQVFIoTURNQV9TM19ORVhUX0RFU0NfUFRSKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzNfTkVYVF9ERVNDX1BUUih2YWwpIGJmaW5fd3JpdGVQVFIoTURNQV9TM19ORVhUX0RFU0NfUFRSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MzX1NUQVJUX0FERFIoKSBiZmluX3JlYWRQVFIoTURNQV9TM19TVEFSVF9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzNfU1RBUlRfQUREUih2YWwpIGJmaW5fd3JpdGVQVFIoTURNQV9TM19TVEFSVF9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MzX0NPTkZJRygpICAgIGJmaW5fcmVhZDE2KE1ETUFfUzNfQ09ORklHKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzNfQ09ORklHKHZhbCkgYmZpbl93cml0ZTE2KE1ETUFfUzNfQ09ORklHLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MzX1hfQ09VTlQoKSAgIGJmaW5fcmVhZDE2KE1ETUFfUzNfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MzX1hfQ09VTlQodmFsKSBiZmluX3dyaXRlMTYoTURNQV9TM19YX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MzX1hfTU9ESUZZKCkgIGJmaW5fcmVhZDE2KE1ETUFfUzNfWF9NT0RJRlkpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TM19YX01PRElGWSh2YWwpIGJmaW5fd3JpdGUxNihNRE1BX1MzX1hfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MzX1lfQ09VTlQoKSAgIGJmaW5fcmVhZDE2KE1ETUFfUzNfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MzX1lfQ09VTlQodmFsKSBiZmluX3dyaXRlMTYoTURNQV9TM19ZX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MzX1lfTU9ESUZZKCkgIGJmaW5fcmVhZDE2KE1ETUFfUzNfWV9NT0RJRlkpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TM19ZX01PRElGWSh2YWwpIGJmaW5fd3JpdGUxNihNRE1BX1MzX1lfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MzX0NVUlJfREVTQ19QVFIoKSBiZmluX3JlYWRQVFIoTURNQV9TM19DVVJSX0RFU0NfUFRSKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzNfQ1VSUl9ERVNDX1BUUih2YWwpIGJmaW5fd3JpdGVQVFIoTURNQV9TM19DVVJSX0RFU0NfUFRSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MzX0NVUlJfQUREUigpIGJmaW5fcmVhZFBUUihNRE1BX1MzX0NVUlJfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MzX0NVUlJfQUREUih2YWwpIGJmaW5fd3JpdGVQVFIoTURNQV9TM19DVVJSX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzNfSVJRX1NUQVRVUygpIGJmaW5fcmVhZDE2KE1ETUFfUzNfSVJRX1NUQVRVUykKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MzX0lSUV9TVEFUVVModmFsKSBiZmluX3dyaXRlMTYoTURNQV9TM19JUlFfU1RBVFVTLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MzX1BFUklQSEVSQUxfTUFQKCkgYmZpbl9yZWFkMTYoTURNQV9TM19QRVJJUEhFUkFMX01BUCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MzX1BFUklQSEVSQUxfTUFQKHZhbCkgYmZpbl93cml0ZTE2KE1ETUFfUzNfUEVSSVBIRVJBTF9NQVAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzNfQ1VSUl9YX0NPVU5UKCkgYmZpbl9yZWFkMTYoTURNQV9TM19DVVJSX1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TM19DVVJSX1hfQ09VTlQodmFsKSBiZmluX3dyaXRlMTYoTURNQV9TM19DVVJSX1hfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzNfQ1VSUl9ZX0NPVU5UKCkgYmZpbl9yZWFkMTYoTURNQV9TM19DVVJSX1lfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TM19DVVJSX1lfQ09VTlQodmFsKSBiZmluX3dyaXRlMTYoTURNQV9TM19DVVJSX1lfQ09VTlQsIHZhbCkKICNkZWZpbmUgYmZpbl9yZWFkX1BQSV9DT05UUk9MKCkgICAgICAgIGJmaW5fcmVhZDE2KFBQSV9DT05UUk9MKQogI2RlZmluZSBiZmluX3dyaXRlX1BQSV9DT05UUk9MKHZhbCkgICAgYmZpbl93cml0ZTE2KFBQSV9DT05UUk9MLCB2YWwpCiAjZGVmaW5lIGJmaW5fcmVhZF9QUElfU1RBVFVTKCkgICAgICAgICBiZmluX3JlYWQxNihQUElfU1RBVFVTKQpAQCAtMjAyNCw3ICsxOTU3LDQgQEAKICNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjMxX0lEMSgpICAgICAgIGJmaW5fcmVhZDE2KENBTl9NQjMxX0lEMSkKICNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIzMV9JRDEodmFsKSAgIGJmaW5fd3JpdGUxNihDQU5fTUIzMV9JRDEsIHZhbCkKIAotLyogVGhlc2UgbmVlZCB0byBiZSBsYXN0IGR1ZSB0byB0aGUgY2RlZi9saW51eCBpbnRlci1kZXBlbmRlbmNpZXMgKi8KLSNpbmNsdWRlIDxhc20vaXJxLmg+Ci0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM4L2luY2x1ZGUvbWFjaC9jZGVmQkY1MzkuaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzOC9pbmNsdWRlL21hY2gvY2RlZkJGNTM5LmgKaW5kZXggMTk4YzRiYi4uYWNjMTVmMyAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM4L2luY2x1ZGUvbWFjaC9jZGVmQkY1MzkuaAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzgvaW5jbHVkZS9tYWNoL2NkZWZCRjUzOS5oCkBAIC0xLDYgKzEsNyBAQAotLyogRE8gTk9UIEVESVQgVEhJUyBGSUxFCi0gKiBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSBnZW5lcmF0ZS1jZGVmLWhlYWRlcnMueHNsCi0gKiBETyBOT1QgRURJVCBUSElTIEZJTEUKKy8qCisgKiBDb3B5cmlnaHQgMjAwOC0yMDEwIEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCiAgKi8KIAogI2lmbmRlZiBfQ0RFRl9CRjUzOV9ICkBAIC05LDcgKzEwLDYgQEAKIC8qIEluY2x1ZGUgTU1ScyBDb21tb24gdG8gQkY1MzggCQkJCQkJCQkqLwogI2luY2x1ZGUgImNkZWZCRjUzOC5oIgogCi0KICNkZWZpbmUgYmZpbl9yZWFkX01YVlJfQ09ORklHKCkgICAgICAgIGJmaW5fcmVhZDE2KE1YVlJfQ09ORklHKQogI2RlZmluZSBiZmluX3dyaXRlX01YVlJfQ09ORklHKHZhbCkgICAgYmZpbl93cml0ZTE2KE1YVlJfQ09ORklHLCB2YWwpCiAjZGVmaW5lIGJmaW5fcmVhZF9NWFZSX1BMTF9DVExfMCgpICAgICBiZmluX3JlYWQzMihNWFZSX1BMTF9DVExfMCkKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzOC9pbmNsdWRlL21hY2gvZGVmQkY1MzguaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzOC9pbmNsdWRlL21hY2gvZGVmQkY1MzguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjdmODFkCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM4L2luY2x1ZGUvbWFjaC9kZWZCRjUzOC5oCkBAIC0wLDAgKzEsMTgyNSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA4LTIwMTAgQW5hbG9nIERldmljZXMgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBREkgQlNEIGxpY2Vuc2Ugb3IgdGhlIEdQTC0yIChvciBsYXRlcikKKyAqLworCisjaWZuZGVmIF9ERUZfQkY1MzhfSAorI2RlZmluZSBfREVGX0JGNTM4X0gKKworLyogQ2xvY2svUmVndWxhdG9yIENvbnRyb2wgKDB4RkZDMDAwMDAgLSAweEZGQzAwMEZGKSAqLworI2RlZmluZQlQTExfQ1RMCQkJMHhGRkMwMDAwMAkvKiBQTEwgQ29udHJvbCByZWdpc3RlciAoMTYtYml0KSAqLworI2RlZmluZQlQTExfRElWCQkJMHhGRkMwMDAwNAkvKiBQTEwgRGl2aWRlIFJlZ2lzdGVyICgxNi1iaXQpICovCisjZGVmaW5lCVZSX0NUTAkJCTB4RkZDMDAwMDgJLyogVm9sdGFnZSBSZWd1bGF0b3IgQ29udHJvbCBSZWdpc3RlciAoMTYtYml0KSAqLworI2RlZmluZQlQTExfU1RBVAkJMHhGRkMwMDAwQwkvKiBQTEwgU3RhdHVzIHJlZ2lzdGVyICgxNi1iaXQpICovCisjZGVmaW5lCVBMTF9MT0NLQ05UCQkweEZGQzAwMDEwCS8qIFBMTCBMb2NrCUNvdW50IHJlZ2lzdGVyICgxNi1iaXQpICovCisjZGVmaW5lCUNISVBJRAkJCTB4RkZDMDAwMTQJLyogQ2hpcAlJRCBSZWdpc3RlciAqLworCisvKiBDSElQSUQgTWFza3MgKi8KKyNkZWZpbmUgQ0hJUElEX1ZFUlNJT04gICAgICAgICAweEYwMDAwMDAwCisjZGVmaW5lIENISVBJRF9GQU1JTFkgICAgICAgICAgMHgwRkZGRjAwMAorI2RlZmluZSBDSElQSURfTUFOVUZBQ1RVUkUgICAgIDB4MDAwMDBGRkUKKworLyogU3lzdGVtIEludGVycnVwdCBDb250cm9sbGVyICgweEZGQzAwMTAwIC0gMHhGRkMwMDFGRikgKi8KKyNkZWZpbmUJU1dSU1QJCQkweEZGQzAwMTAwICAvKiBTb2Z0d2FyZQlSZXNldCBSZWdpc3RlciAoMTYtYml0KSAqLworI2RlZmluZQlTWVNDUgkJCTB4RkZDMDAxMDQgIC8qIFN5c3RlbSBDb25maWd1cmF0aW9uIHJlZ2lzdGUgKi8KKyNkZWZpbmUJU0lDX1JWRUNUCQkweEZGQzAwMTA4CisjZGVmaW5lCVNJQ19JTUFTSzAJCTB4RkZDMDAxMEMgIC8qIEludGVycnVwdCBNYXNrIFJlZ2lzdGVyICovCisjZGVmaW5lCVNJQ19JQVIwCQkweEZGQzAwMTEwICAvKiBJbnRlcnJ1cHQgQXNzaWdubWVudCBSZWdpc3RlciAwICovCisjZGVmaW5lCVNJQ19JQVIxCQkweEZGQzAwMTE0ICAvKiBJbnRlcnJ1cHQgQXNzaWdubWVudCBSZWdpc3RlciAxICovCisjZGVmaW5lCVNJQ19JQVIyCQkweEZGQzAwMTE4ICAvKiBJbnRlcnJ1cHQgQXNzaWdubWVudCBSZWdpc3RlciAyICovCisjZGVmaW5lCVNJQ19JQVIzCQkJMHhGRkMwMDExQwkvKiBJbnRlcnJ1cHQgQXNzaWdubWVudAlSZWdpc3RlciAzICovCisjZGVmaW5lCVNJQ19JU1IwCQkJMHhGRkMwMDEyMCAgLyogSW50ZXJydXB0IFN0YXR1cwlSZWdpc3RlciAqLworI2RlZmluZQlTSUNfSVdSMAkJCTB4RkZDMDAxMjQgIC8qIEludGVycnVwdCBXYWtldXAJUmVnaXN0ZXIgKi8KKyNkZWZpbmUJU0lDX0lNQVNLMQkJCTB4RkZDMDAxMjgJLyogSW50ZXJydXB0IE1hc2sgUmVnaXN0ZXIgMSAqLworI2RlZmluZQlTSUNfSVNSMQkJCTB4RkZDMDAxMkMJLyogSW50ZXJydXB0IFN0YXR1cyBSZWdpc3RlciAxICovCisjZGVmaW5lCVNJQ19JV1IxCQkJMHhGRkMwMDEzMAkvKiBJbnRlcnJ1cHQgV2FrZXVwIFJlZ2lzdGVyIDEgKi8KKyNkZWZpbmUJU0lDX0lBUjQJCQkweEZGQzAwMTM0CS8qIEludGVycnVwdCBBc3NpZ25tZW50CVJlZ2lzdGVyIDQgKi8KKyNkZWZpbmUJU0lDX0lBUjUJCQkweEZGQzAwMTM4CS8qIEludGVycnVwdCBBc3NpZ25tZW50CVJlZ2lzdGVyIDUgKi8KKyNkZWZpbmUJU0lDX0lBUjYJCQkweEZGQzAwMTNDCS8qIEludGVycnVwdCBBc3NpZ25tZW50CVJlZ2lzdGVyIDYgKi8KKworCisvKiBXYXRjaGRvZyBUaW1lciAoMHhGRkMwMDIwMCAtCTB4RkZDMDAyRkYpICovCisjZGVmaW5lCVdET0dfQ1RMCTB4RkZDMDAyMDAgIC8qIFdhdGNoZG9nCUNvbnRyb2wJUmVnaXN0ZXIgKi8KKyNkZWZpbmUJV0RPR19DTlQJMHhGRkMwMDIwNCAgLyogV2F0Y2hkb2cJQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJV0RPR19TVEFUCTB4RkZDMDAyMDggIC8qIFdhdGNoZG9nCVN0YXR1cyBSZWdpc3RlciAqLworCisKKy8qIFJlYWwJVGltZSBDbG9jayAoMHhGRkMwMDMwMCAtIDB4RkZDMDAzRkYpICovCisjZGVmaW5lCVJUQ19TVEFUCTB4RkZDMDAzMDAgIC8qIFJUQyBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJUlRDX0lDVEwJMHhGRkMwMDMwNCAgLyogUlRDIEludGVycnVwdCBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lCVJUQ19JU1RBVAkweEZGQzAwMzA4ICAvKiBSVEMgSW50ZXJydXB0IFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZQlSVENfU1dDTlQJMHhGRkMwMDMwQyAgLyogUlRDIFN0b3B3YXRjaCBDb3VudCBSZWdpc3RlciAqLworI2RlZmluZQlSVENfQUxBUk0JMHhGRkMwMDMxMCAgLyogUlRDIEFsYXJtIFRpbWUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJUlRDX0ZBU1QJMHhGRkMwMDMxNCAgLyogUlRDIFByZXNjYWxlciBFbmFibGUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJUlRDX1BSRU4JCTB4RkZDMDAzMTQgIC8qIFJUQyBQcmVzY2FsZXIgRW5hYmxlIFJlZ2lzdGVyIChhbHRlcm5hdGUJbWFjcm8pICovCisKKworLyogVUFSVDAgQ29udHJvbGxlciAoMHhGRkMwMDQwMAktIDB4RkZDMDA0RkYpICovCisjZGVmaW5lCVVBUlQwX1RIUgkgICAgICAweEZGQzAwNDAwICAvKiBUcmFuc21pdCBIb2xkaW5nIHJlZ2lzdGVyICovCisjZGVmaW5lCVVBUlQwX1JCUgkgICAgICAweEZGQzAwNDAwICAvKiBSZWNlaXZlIEJ1ZmZlciByZWdpc3RlciAqLworI2RlZmluZQlVQVJUMF9ETEwJICAgICAgMHhGRkMwMDQwMCAgLyogRGl2aXNvciBMYXRjaCAoTG93LUJ5dGUpICovCisjZGVmaW5lCVVBUlQwX0lFUgkgICAgICAweEZGQzAwNDA0ICAvKiBJbnRlcnJ1cHQgRW5hYmxlIFJlZ2lzdGVyICovCisjZGVmaW5lCVVBUlQwX0RMSAkgICAgICAweEZGQzAwNDA0ICAvKiBEaXZpc29yIExhdGNoIChIaWdoLUJ5dGUpICovCisjZGVmaW5lCVVBUlQwX0lJUgkgICAgICAweEZGQzAwNDA4ICAvKiBJbnRlcnJ1cHQgSWRlbnRpZmljYXRpb24gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJVUFSVDBfTENSCSAgICAgIDB4RkZDMDA0MEMgIC8qIExpbmUgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZQlVQVJUMF9NQ1IJCQkgMHhGRkMwMDQxMCAgLyoJTW9kZW0gQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZQlVQVJUMF9MU1IJICAgICAgMHhGRkMwMDQxNCAgLyogTGluZSBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJVUFSVDBfU0NSCSAgICAgIDB4RkZDMDA0MUMgIC8qIFNDUiBTY3JhdGNoIFJlZ2lzdGVyICovCisjZGVmaW5lCVVBUlQwX0dDVEwJCSAgICAgMHhGRkMwMDQyNAkgLyogR2xvYmFsIENvbnRyb2wgUmVnaXN0ZXIgKi8KKworCisvKiBTUEkwCUNvbnRyb2xsZXIgKDB4RkZDMDA1MDAgLSAweEZGQzAwNUZGKSAqLworCisjZGVmaW5lCVNQSTBfQ1RMCQkJMHhGRkMwMDUwMCAgLyogU1BJMCBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lCVNQSTBfRkxHCQkJMHhGRkMwMDUwNCAgLyogU1BJMCBGbGFnIHJlZ2lzdGVyICovCisjZGVmaW5lCVNQSTBfU1RBVAkJCTB4RkZDMDA1MDggIC8qIFNQSTAgU3RhdHVzIHJlZ2lzdGVyICovCisjZGVmaW5lCVNQSTBfVERCUgkJCTB4RkZDMDA1MEMgIC8qIFNQSTAgVHJhbnNtaXQgRGF0YSBCdWZmZXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJU1BJMF9SREJSCQkJMHhGRkMwMDUxMCAgLyogU1BJMCBSZWNlaXZlIERhdGEgQnVmZmVyCVJlZ2lzdGVyICovCisjZGVmaW5lCVNQSTBfQkFVRAkJCTB4RkZDMDA1MTQgIC8qIFNQSTAgQmF1ZCByYXRlIFJlZ2lzdGVyICovCisjZGVmaW5lCVNQSTBfU0hBRE9XCQkJMHhGRkMwMDUxOCAgLyogU1BJMF9SREJSIFNoYWRvdwlSZWdpc3RlciAqLworI2RlZmluZSBTUEkwX1JFR0JBU0UJCQlTUEkwX0NUTAorCisKKy8qIFRJTUVSIDAsIDEsIDIgUmVnaXN0ZXJzICgweEZGQzAwNjAwIC0gMHhGRkMwMDZGRikgKi8KKyNkZWZpbmUJVElNRVIwX0NPTkZJRwkJCTB4RkZDMDA2MDAgICAgIC8qIFRpbWVyCTAgQ29uZmlndXJhdGlvbglSZWdpc3RlciAqLworI2RlZmluZQlUSU1FUjBfQ09VTlRFUgkJCQkweEZGQzAwNjA0ICAgICAvKiBUaW1lcgkwIENvdW50ZXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJVElNRVIwX1BFUklPRAkJCTB4RkZDMDA2MDggICAgIC8qIFRpbWVyCTAgUGVyaW9kIFJlZ2lzdGVyICovCisjZGVmaW5lCVRJTUVSMF9XSURUSAkJCTB4RkZDMDA2MEMgICAgIC8qIFRpbWVyCTAgV2lkdGgJUmVnaXN0ZXIgKi8KKworI2RlZmluZQlUSU1FUjFfQ09ORklHCQkJMHhGRkMwMDYxMAkvKiAgVGltZXIgMSBDb25maWd1cmF0aW9uIFJlZ2lzdGVyICAgKi8KKyNkZWZpbmUJVElNRVIxX0NPVU5URVIJCQkweEZGQzAwNjE0CS8qICBUaW1lciAxIENvdW50ZXIgUmVnaXN0ZXIJICAgICAqLworI2RlZmluZQlUSU1FUjFfUEVSSU9ECQkJMHhGRkMwMDYxOAkvKiAgVGltZXIgMSBQZXJpb2QgUmVnaXN0ZXIJICAgICAqLworI2RlZmluZQlUSU1FUjFfV0lEVEgJCQkweEZGQzAwNjFDCS8qICBUaW1lciAxIFdpZHRoIFJlZ2lzdGVyCSAgICAgKi8KKworI2RlZmluZQlUSU1FUjJfQ09ORklHCQkJMHhGRkMwMDYyMAkvKiBUaW1lciAyIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgICAqLworI2RlZmluZQlUSU1FUjJfQ09VTlRFUgkJCTB4RkZDMDA2MjQJLyogVGltZXIgMiBDb3VudGVyIFJlZ2lzdGVyCSAgICAqLworI2RlZmluZQlUSU1FUjJfUEVSSU9ECQkJMHhGRkMwMDYyOAkvKiBUaW1lciAyIFBlcmlvZCBSZWdpc3RlcgkgICAgKi8KKyNkZWZpbmUJVElNRVIyX1dJRFRICQkJMHhGRkMwMDYyQwkvKiBUaW1lciAyIFdpZHRoIFJlZ2lzdGVyCSAgICAqLworCisjZGVmaW5lCVRJTUVSX0VOQUJMRQkJCQkweEZGQzAwNjQwCS8qIFRpbWVyIEVuYWJsZQlSZWdpc3RlciAqLworI2RlZmluZQlUSU1FUl9ESVNBQkxFCQkJCTB4RkZDMDA2NDQJLyogVGltZXIgRGlzYWJsZSBSZWdpc3RlciAqLworI2RlZmluZQlUSU1FUl9TVEFUVVMJCQkJMHhGRkMwMDY0OAkvKiBUaW1lciBTdGF0dXMJUmVnaXN0ZXIgKi8KKworCisvKiBQcm9ncmFtbWFibGUJRmxhZ3MgKDB4RkZDMDA3MDAgLSAweEZGQzAwN0ZGKSAqLworI2RlZmluZQlGSU9fRkxBR19ECQkJCTB4RkZDMDA3MDAgIC8qIEZsYWcgTWFzayB0byBkaXJlY3RseSBzcGVjaWZ5IHN0YXRlIG9mIHBpbnMgKi8KKyNkZWZpbmUJRklPX0ZMQUdfQwkJCTB4RkZDMDA3MDQgIC8qIFBlcmlwaGVyYWwgSW50ZXJydXB0IEZsYWcgUmVnaXN0ZXIgKGNsZWFyKSAqLworI2RlZmluZQlGSU9fRkxBR19TCQkJMHhGRkMwMDcwOCAgLyogUGVyaXBoZXJhbCBJbnRlcnJ1cHQgRmxhZyBSZWdpc3RlciAoc2V0KSAqLworI2RlZmluZQlGSU9fRkxBR19UCQkJCQkweEZGQzAwNzBDICAvKiBGbGFnIE1hc2sgdG8gZGlyZWN0bHkgdG9nZ2xlIHN0YXRlIG9mIHBpbnMgKi8KKyNkZWZpbmUJRklPX01BU0tBX0QJCQkweEZGQzAwNzEwICAvKiBGbGFnIE1hc2sgSW50ZXJydXB0IEEgUmVnaXN0ZXIgKHNldCBkaXJlY3RseSkgKi8KKyNkZWZpbmUJRklPX01BU0tBX0MJCQkweEZGQzAwNzE0ICAvKiBGbGFnIE1hc2sgSW50ZXJydXB0IEEgUmVnaXN0ZXIgKGNsZWFyKSAqLworI2RlZmluZQlGSU9fTUFTS0FfUwkJCTB4RkZDMDA3MTggIC8qIEZsYWcgTWFzayBJbnRlcnJ1cHQgQSBSZWdpc3RlciAoc2V0KSAqLworI2RlZmluZQlGSU9fTUFTS0FfVAkJCTB4RkZDMDA3MUMgIC8qIEZsYWcgTWFzayBJbnRlcnJ1cHQgQSBSZWdpc3RlciAodG9nZ2xlKSAqLworI2RlZmluZQlGSU9fTUFTS0JfRAkJCTB4RkZDMDA3MjAgIC8qIEZsYWcgTWFzayBJbnRlcnJ1cHQgQiBSZWdpc3RlciAoc2V0IGRpcmVjdGx5KSAqLworI2RlZmluZQlGSU9fTUFTS0JfQwkJCTB4RkZDMDA3MjQgIC8qIEZsYWcgTWFzayBJbnRlcnJ1cHQgQiBSZWdpc3RlciAoY2xlYXIpICovCisjZGVmaW5lCUZJT19NQVNLQl9TCQkJMHhGRkMwMDcyOCAgLyogRmxhZyBNYXNrIEludGVycnVwdCBCIFJlZ2lzdGVyIChzZXQpICovCisjZGVmaW5lCUZJT19NQVNLQl9UCQkJMHhGRkMwMDcyQyAgLyogRmxhZyBNYXNrIEludGVycnVwdCBCIFJlZ2lzdGVyICh0b2dnbGUpICovCisjZGVmaW5lCUZJT19ESVIJCQkJMHhGRkMwMDczMCAgLyogUGVyaXBoZXJhbCBGbGFnIERpcmVjdGlvbiBSZWdpc3RlciAqLworI2RlZmluZQlGSU9fUE9MQVIJCQkweEZGQzAwNzM0ICAvKiBGbGFnIFNvdXJjZSBQb2xhcml0eSBSZWdpc3RlciAqLworI2RlZmluZQlGSU9fRURHRQkJCTB4RkZDMDA3MzggIC8qIEZsYWcgU291cmNlIFNlbnNpdGl2aXR5IFJlZ2lzdGVyICovCisjZGVmaW5lCUZJT19CT1RICQkJMHhGRkMwMDczQyAgLyogRmxhZyBTZXQJb24gQk9USAlFZGdlcyBSZWdpc3RlciAqLworI2RlZmluZQlGSU9fSU5FTgkJCQkJMHhGRkMwMDc0MCAgLyogRmxhZyBJbnB1dCBFbmFibGUgUmVnaXN0ZXIgICovCisKKworLyogU1BPUlQwIENvbnRyb2xsZXIgKDB4RkZDMDA4MDAgLSAweEZGQzAwOEZGKSAqLworI2RlZmluZQlTUE9SVDBfVENSMQkJCQkweEZGQzAwODAwICAvKiBTUE9SVDAgVHJhbnNtaXQgQ29uZmlndXJhdGlvbiAxIFJlZ2lzdGVyICovCisjZGVmaW5lCVNQT1JUMF9UQ1IyCQkJCTB4RkZDMDA4MDQgIC8qIFNQT1JUMCBUcmFuc21pdCBDb25maWd1cmF0aW9uIDIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJU1BPUlQwX1RDTEtESVYJCQkweEZGQzAwODA4ICAvKiBTUE9SVDAgVHJhbnNtaXQgQ2xvY2sgRGl2aWRlciAqLworI2RlZmluZQlTUE9SVDBfVEZTRElWCQkJMHhGRkMwMDgwQyAgLyogU1BPUlQwIFRyYW5zbWl0IEZyYW1lIFN5bmMgRGl2aWRlciAqLworI2RlZmluZQlTUE9SVDBfVFgJCQkweEZGQzAwODEwICAvKiBTUE9SVDAgVFggRGF0YSBSZWdpc3RlciAqLworI2RlZmluZQlTUE9SVDBfUlgJCQkweEZGQzAwODE4ICAvKiBTUE9SVDAgUlggRGF0YSBSZWdpc3RlciAqLworI2RlZmluZQlTUE9SVDBfUkNSMQkJCQkweEZGQzAwODIwICAvKiBTUE9SVDAgVHJhbnNtaXQgQ29uZmlndXJhdGlvbiAxIFJlZ2lzdGVyICovCisjZGVmaW5lCVNQT1JUMF9SQ1IyCQkJCTB4RkZDMDA4MjQgIC8qIFNQT1JUMCBUcmFuc21pdCBDb25maWd1cmF0aW9uIDIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJU1BPUlQwX1JDTEtESVYJCQkweEZGQzAwODI4ICAvKiBTUE9SVDAgUmVjZWl2ZSBDbG9jayBEaXZpZGVyICovCisjZGVmaW5lCVNQT1JUMF9SRlNESVYJCQkweEZGQzAwODJDICAvKiBTUE9SVDAgUmVjZWl2ZSBGcmFtZSBTeW5jIERpdmlkZXIgKi8KKyNkZWZpbmUJU1BPUlQwX1NUQVQJCQkweEZGQzAwODMwICAvKiBTUE9SVDAgU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lCVNQT1JUMF9DSE5MCQkJMHhGRkMwMDgzNCAgLyogU1BPUlQwIEN1cnJlbnQgQ2hhbm5lbCBSZWdpc3RlciAqLworI2RlZmluZQlTUE9SVDBfTUNNQzEJCQkweEZGQzAwODM4ICAvKiBTUE9SVDAgTXVsdGktQ2hhbm5lbCBDb25maWd1cmF0aW9uIFJlZ2lzdGVyIDEgKi8KKyNkZWZpbmUJU1BPUlQwX01DTUMyCQkJMHhGRkMwMDgzQyAgLyogU1BPUlQwIE11bHRpLUNoYW5uZWwgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAyICovCisjZGVmaW5lCVNQT1JUMF9NVENTMAkJCTB4RkZDMDA4NDAgIC8qIFNQT1JUMCBNdWx0aS1DaGFubmVsIFRyYW5zbWl0IFNlbGVjdCBSZWdpc3RlciAwICovCisjZGVmaW5lCVNQT1JUMF9NVENTMQkJCTB4RkZDMDA4NDQgIC8qIFNQT1JUMCBNdWx0aS1DaGFubmVsIFRyYW5zbWl0IFNlbGVjdCBSZWdpc3RlciAxICovCisjZGVmaW5lCVNQT1JUMF9NVENTMgkJCTB4RkZDMDA4NDggIC8qIFNQT1JUMCBNdWx0aS1DaGFubmVsIFRyYW5zbWl0IFNlbGVjdCBSZWdpc3RlciAyICovCisjZGVmaW5lCVNQT1JUMF9NVENTMwkJCTB4RkZDMDA4NEMgIC8qIFNQT1JUMCBNdWx0aS1DaGFubmVsIFRyYW5zbWl0IFNlbGVjdCBSZWdpc3RlciAzICovCisjZGVmaW5lCVNQT1JUMF9NUkNTMAkJCTB4RkZDMDA4NTAgIC8qIFNQT1JUMCBNdWx0aS1DaGFubmVsIFJlY2VpdmUgU2VsZWN0IFJlZ2lzdGVyIDAgKi8KKyNkZWZpbmUJU1BPUlQwX01SQ1MxCQkJMHhGRkMwMDg1NCAgLyogU1BPUlQwIE11bHRpLUNoYW5uZWwgUmVjZWl2ZSBTZWxlY3QgUmVnaXN0ZXIgMSAqLworI2RlZmluZQlTUE9SVDBfTVJDUzIJCQkweEZGQzAwODU4ICAvKiBTUE9SVDAgTXVsdGktQ2hhbm5lbCBSZWNlaXZlIFNlbGVjdCBSZWdpc3RlciAyICovCisjZGVmaW5lCVNQT1JUMF9NUkNTMwkJCTB4RkZDMDA4NUMgIC8qIFNQT1JUMCBNdWx0aS1DaGFubmVsIFJlY2VpdmUgU2VsZWN0IFJlZ2lzdGVyIDMgKi8KKworCisvKiBTUE9SVDEgQ29udHJvbGxlciAoMHhGRkMwMDkwMCAtIDB4RkZDMDA5RkYpICovCisjZGVmaW5lCVNQT1JUMV9UQ1IxCQkJCTB4RkZDMDA5MDAgIC8qIFNQT1JUMSBUcmFuc21pdCBDb25maWd1cmF0aW9uIDEgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJU1BPUlQxX1RDUjIJCQkJMHhGRkMwMDkwNCAgLyogU1BPUlQxIFRyYW5zbWl0IENvbmZpZ3VyYXRpb24gMiBSZWdpc3RlciAqLworI2RlZmluZQlTUE9SVDFfVENMS0RJVgkJCTB4RkZDMDA5MDggIC8qIFNQT1JUMSBUcmFuc21pdCBDbG9jayBEaXZpZGVyICovCisjZGVmaW5lCVNQT1JUMV9URlNESVYJCQkweEZGQzAwOTBDICAvKiBTUE9SVDEgVHJhbnNtaXQgRnJhbWUgU3luYyBEaXZpZGVyICovCisjZGVmaW5lCVNQT1JUMV9UWAkJCTB4RkZDMDA5MTAgIC8qIFNQT1JUMSBUWCBEYXRhIFJlZ2lzdGVyICovCisjZGVmaW5lCVNQT1JUMV9SWAkJCTB4RkZDMDA5MTggIC8qIFNQT1JUMSBSWCBEYXRhIFJlZ2lzdGVyICovCisjZGVmaW5lCVNQT1JUMV9SQ1IxCQkJCTB4RkZDMDA5MjAgIC8qIFNQT1JUMSBUcmFuc21pdCBDb25maWd1cmF0aW9uIDEgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJU1BPUlQxX1JDUjIJCQkJMHhGRkMwMDkyNCAgLyogU1BPUlQxIFRyYW5zbWl0IENvbmZpZ3VyYXRpb24gMiBSZWdpc3RlciAqLworI2RlZmluZQlTUE9SVDFfUkNMS0RJVgkJCTB4RkZDMDA5MjggIC8qIFNQT1JUMSBSZWNlaXZlIENsb2NrIERpdmlkZXIgKi8KKyNkZWZpbmUJU1BPUlQxX1JGU0RJVgkJCTB4RkZDMDA5MkMgIC8qIFNQT1JUMSBSZWNlaXZlIEZyYW1lIFN5bmMgRGl2aWRlciAqLworI2RlZmluZQlTUE9SVDFfU1RBVAkJCTB4RkZDMDA5MzAgIC8qIFNQT1JUMSBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJU1BPUlQxX0NITkwJCQkweEZGQzAwOTM0ICAvKiBTUE9SVDEgQ3VycmVudCBDaGFubmVsIFJlZ2lzdGVyICovCisjZGVmaW5lCVNQT1JUMV9NQ01DMQkJCTB4RkZDMDA5MzggIC8qIFNQT1JUMSBNdWx0aS1DaGFubmVsIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgMSAqLworI2RlZmluZQlTUE9SVDFfTUNNQzIJCQkweEZGQzAwOTNDICAvKiBTUE9SVDEgTXVsdGktQ2hhbm5lbCBDb25maWd1cmF0aW9uIFJlZ2lzdGVyIDIgKi8KKyNkZWZpbmUJU1BPUlQxX01UQ1MwCQkJMHhGRkMwMDk0MCAgLyogU1BPUlQxIE11bHRpLUNoYW5uZWwgVHJhbnNtaXQgU2VsZWN0IFJlZ2lzdGVyIDAgKi8KKyNkZWZpbmUJU1BPUlQxX01UQ1MxCQkJMHhGRkMwMDk0NCAgLyogU1BPUlQxIE11bHRpLUNoYW5uZWwgVHJhbnNtaXQgU2VsZWN0IFJlZ2lzdGVyIDEgKi8KKyNkZWZpbmUJU1BPUlQxX01UQ1MyCQkJMHhGRkMwMDk0OCAgLyogU1BPUlQxIE11bHRpLUNoYW5uZWwgVHJhbnNtaXQgU2VsZWN0IFJlZ2lzdGVyIDIgKi8KKyNkZWZpbmUJU1BPUlQxX01UQ1MzCQkJMHhGRkMwMDk0QyAgLyogU1BPUlQxIE11bHRpLUNoYW5uZWwgVHJhbnNtaXQgU2VsZWN0IFJlZ2lzdGVyIDMgKi8KKyNkZWZpbmUJU1BPUlQxX01SQ1MwCQkJMHhGRkMwMDk1MCAgLyogU1BPUlQxIE11bHRpLUNoYW5uZWwgUmVjZWl2ZSBTZWxlY3QgUmVnaXN0ZXIgMCAqLworI2RlZmluZQlTUE9SVDFfTVJDUzEJCQkweEZGQzAwOTU0ICAvKiBTUE9SVDEgTXVsdGktQ2hhbm5lbCBSZWNlaXZlIFNlbGVjdCBSZWdpc3RlciAxICovCisjZGVmaW5lCVNQT1JUMV9NUkNTMgkJCTB4RkZDMDA5NTggIC8qIFNQT1JUMSBNdWx0aS1DaGFubmVsIFJlY2VpdmUgU2VsZWN0IFJlZ2lzdGVyIDIgKi8KKyNkZWZpbmUJU1BPUlQxX01SQ1MzCQkJMHhGRkMwMDk1QyAgLyogU1BPUlQxIE11bHRpLUNoYW5uZWwgUmVjZWl2ZSBTZWxlY3QgUmVnaXN0ZXIgMyAqLworCisKKy8qIEV4dGVybmFsIEJ1cwlJbnRlcmZhY2UgVW5pdCAoMHhGRkMwMEEwMCAtIDB4RkZDMDBBRkYpICovCisvKiBBc3luY2hyb25vdXMJTWVtb3J5IENvbnRyb2xsZXIgICovCisjZGVmaW5lCUVCSVVfQU1HQ1RMCQkJMHhGRkMwMEEwMCAgLyogQXN5bmNocm9ub3VzIE1lbW9yeSBHbG9iYWwgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZQlFQklVX0FNQkNUTDAJCTB4RkZDMDBBMDQgIC8qIEFzeW5jaHJvbm91cyBNZW1vcnkgQmFuawlDb250cm9sCVJlZ2lzdGVyIDAgKi8KKyNkZWZpbmUJRUJJVV9BTUJDVEwxCQkweEZGQzAwQTA4ICAvKiBBc3luY2hyb25vdXMgTWVtb3J5IEJhbmsJQ29udHJvbAlSZWdpc3RlciAxICovCisKKy8qIFNEUkFNIENvbnRyb2xsZXIgKi8KKyNkZWZpbmUJRUJJVV9TREdDVEwJCQkweEZGQzAwQTEwICAvKiBTRFJBTSBHbG9iYWwgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZQlFQklVX1NEQkNUTAkJCTB4RkZDMDBBMTQgIC8qIFNEUkFNIEJhbmsgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZQlFQklVX1NEUlJDCQkJMHhGRkMwMEExOCAgLyogU0RSQU0gUmVmcmVzaCBSYXRlIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRUJJVV9TRFNUQVQJCQkweEZGQzAwQTFDICAvKiBTRFJBTSBTdGF0dXMgUmVnaXN0ZXIgKi8KKworCisKKy8qIERNQSBDb250cm9sbGVyIDAgVHJhZmZpYyBDb250cm9sIFJlZ2lzdGVycyAoMHhGRkMwMEIwMCAtIDB4RkZDMDBCRkYpICovCisKKyNkZWZpbmUJRE1BQzBfVENfUEVSCQkJMHhGRkMwMEIwQwkvKiBETUEgQ29udHJvbGxlciAwIFRyYWZmaWMgQ29udHJvbCBQZXJpb2RzIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQUMwX1RDX0NOVAkJCTB4RkZDMDBCMTAJLyogRE1BIENvbnRyb2xsZXIgMCBUcmFmZmljIENvbnRyb2wgQ3VycmVudCBDb3VudHMgUmVnaXN0ZXIgKi8KKworCisKKy8qIERNQSBDb250cm9sbGVyIDAgKDB4RkZDMDBDMDAJLSAweEZGQzAwRkZGKQkJCQkJCQkgKi8KKworI2RlZmluZQlETUEwX05FWFRfREVTQ19QVFIJCTB4RkZDMDBDMDAJLyogRE1BIENoYW5uZWwgMCBOZXh0IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlciAqLworI2RlZmluZQlETUEwX1NUQVJUX0FERFIJCQkweEZGQzAwQzA0CS8qIERNQSBDaGFubmVsIDAgU3RhcnQgQWRkcmVzcyBSZWdpc3RlciAqLworI2RlZmluZQlETUEwX0NPTkZJRwkJCQkweEZGQzAwQzA4CS8qIERNQSBDaGFubmVsIDAgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAqLworI2RlZmluZQlETUEwX1hfQ09VTlQJCQkweEZGQzAwQzEwCS8qIERNQSBDaGFubmVsIDAgWCBDb3VudCBSZWdpc3RlciAqLworI2RlZmluZQlETUEwX1hfTU9ESUZZCQkJMHhGRkMwMEMxNAkvKiBETUEgQ2hhbm5lbCAwIFggTW9kaWZ5IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTBfWV9DT1VOVAkJCTB4RkZDMDBDMTgJLyogRE1BIENoYW5uZWwgMCBZIENvdW50IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTBfWV9NT0RJRlkJCQkweEZGQzAwQzFDCS8qIERNQSBDaGFubmVsIDAgWSBNb2RpZnkgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMF9DVVJSX0RFU0NfUFRSCQkweEZGQzAwQzIwCS8qIERNQSBDaGFubmVsIDAgQ3VycmVudCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMF9DVVJSX0FERFIJCQkweEZGQzAwQzI0CS8qIERNQSBDaGFubmVsIDAgQ3VycmVudCBBZGRyZXNzIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTBfSVJRX1NUQVRVUwkJCTB4RkZDMDBDMjgJLyogRE1BIENoYW5uZWwgMCBJbnRlcnJ1cHQvU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTBfUEVSSVBIRVJBTF9NQVAJCTB4RkZDMDBDMkMJLyogRE1BIENoYW5uZWwgMCBQZXJpcGhlcmFsIE1hcAlSZWdpc3RlciAqLworI2RlZmluZQlETUEwX0NVUlJfWF9DT1VOVAkJMHhGRkMwMEMzMAkvKiBETUEgQ2hhbm5lbCAwIEN1cnJlbnQgWCBDb3VudCBSZWdpc3RlciAqLworI2RlZmluZQlETUEwX0NVUlJfWV9DT1VOVAkJMHhGRkMwMEMzOAkvKiBETUEgQ2hhbm5lbCAwIEN1cnJlbnQgWSBDb3VudCBSZWdpc3RlciAqLworCisjZGVmaW5lCURNQTFfTkVYVF9ERVNDX1BUUgkJMHhGRkMwMEM0MAkvKiBETUEgQ2hhbm5lbCAxIE5leHQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTFfU1RBUlRfQUREUgkJCTB4RkZDMDBDNDQJLyogRE1BIENoYW5uZWwgMSBTdGFydCBBZGRyZXNzIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTFfQ09ORklHCQkJCTB4RkZDMDBDNDgJLyogRE1BIENoYW5uZWwgMSBDb25maWd1cmF0aW9uIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTFfWF9DT1VOVAkJCTB4RkZDMDBDNTAJLyogRE1BIENoYW5uZWwgMSBYIENvdW50IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTFfWF9NT0RJRlkJCQkweEZGQzAwQzU0CS8qIERNQSBDaGFubmVsIDEgWCBNb2RpZnkgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMV9ZX0NPVU5UCQkJMHhGRkMwMEM1OAkvKiBETUEgQ2hhbm5lbCAxIFkgQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMV9ZX01PRElGWQkJCTB4RkZDMDBDNUMJLyogRE1BIENoYW5uZWwgMSBZIE1vZGlmeSBSZWdpc3RlciAqLworI2RlZmluZQlETUExX0NVUlJfREVTQ19QVFIJCTB4RkZDMDBDNjAJLyogRE1BIENoYW5uZWwgMSBDdXJyZW50IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlciAqLworI2RlZmluZQlETUExX0NVUlJfQUREUgkJCTB4RkZDMDBDNjQJLyogRE1BIENoYW5uZWwgMSBDdXJyZW50IEFkZHJlc3MgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMV9JUlFfU1RBVFVTCQkJMHhGRkMwMEM2OAkvKiBETUEgQ2hhbm5lbCAxIEludGVycnVwdC9TdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMV9QRVJJUEhFUkFMX01BUAkJMHhGRkMwMEM2QwkvKiBETUEgQ2hhbm5lbCAxIFBlcmlwaGVyYWwgTWFwCVJlZ2lzdGVyICovCisjZGVmaW5lCURNQTFfQ1VSUl9YX0NPVU5UCQkweEZGQzAwQzcwCS8qIERNQSBDaGFubmVsIDEgQ3VycmVudCBYIENvdW50IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTFfQ1VSUl9ZX0NPVU5UCQkweEZGQzAwQzc4CS8qIERNQSBDaGFubmVsIDEgQ3VycmVudCBZIENvdW50IFJlZ2lzdGVyICovCisKKyNkZWZpbmUJRE1BMl9ORVhUX0RFU0NfUFRSCQkweEZGQzAwQzgwCS8qIERNQSBDaGFubmVsIDIgTmV4dCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMl9TVEFSVF9BRERSCQkJMHhGRkMwMEM4NAkvKiBETUEgQ2hhbm5lbCAyIFN0YXJ0IEFkZHJlc3MgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMl9DT05GSUcJCQkJMHhGRkMwMEM4OAkvKiBETUEgQ2hhbm5lbCAyIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMl9YX0NPVU5UCQkJMHhGRkMwMEM5MAkvKiBETUEgQ2hhbm5lbCAyIFggQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMl9YX01PRElGWQkJCTB4RkZDMDBDOTQJLyogRE1BIENoYW5uZWwgMiBYIE1vZGlmeSBSZWdpc3RlciAqLworI2RlZmluZQlETUEyX1lfQ09VTlQJCQkweEZGQzAwQzk4CS8qIERNQSBDaGFubmVsIDIgWSBDb3VudCBSZWdpc3RlciAqLworI2RlZmluZQlETUEyX1lfTU9ESUZZCQkJMHhGRkMwMEM5QwkvKiBETUEgQ2hhbm5lbCAyIFkgTW9kaWZ5IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTJfQ1VSUl9ERVNDX1BUUgkJMHhGRkMwMENBMAkvKiBETUEgQ2hhbm5lbCAyIEN1cnJlbnQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTJfQ1VSUl9BRERSCQkJMHhGRkMwMENBNAkvKiBETUEgQ2hhbm5lbCAyIEN1cnJlbnQgQWRkcmVzcyBSZWdpc3RlciAqLworI2RlZmluZQlETUEyX0lSUV9TVEFUVVMJCQkweEZGQzAwQ0E4CS8qIERNQSBDaGFubmVsIDIgSW50ZXJydXB0L1N0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZQlETUEyX1BFUklQSEVSQUxfTUFQCQkweEZGQzAwQ0FDCS8qIERNQSBDaGFubmVsIDIgUGVyaXBoZXJhbCBNYXAJUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMl9DVVJSX1hfQ09VTlQJCTB4RkZDMDBDQjAJLyogRE1BIENoYW5uZWwgMiBDdXJyZW50IFggQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMl9DVVJSX1lfQ09VTlQJCTB4RkZDMDBDQjgJLyogRE1BIENoYW5uZWwgMiBDdXJyZW50IFkgQ291bnQgUmVnaXN0ZXIgKi8KKworI2RlZmluZQlETUEzX05FWFRfREVTQ19QVFIJCTB4RkZDMDBDQzAJLyogRE1BIENoYW5uZWwgMyBOZXh0IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlciAqLworI2RlZmluZQlETUEzX1NUQVJUX0FERFIJCQkweEZGQzAwQ0M0CS8qIERNQSBDaGFubmVsIDMgU3RhcnQgQWRkcmVzcyBSZWdpc3RlciAqLworI2RlZmluZQlETUEzX0NPTkZJRwkJCQkweEZGQzAwQ0M4CS8qIERNQSBDaGFubmVsIDMgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAqLworI2RlZmluZQlETUEzX1hfQ09VTlQJCQkweEZGQzAwQ0QwCS8qIERNQSBDaGFubmVsIDMgWCBDb3VudCBSZWdpc3RlciAqLworI2RlZmluZQlETUEzX1hfTU9ESUZZCQkJMHhGRkMwMENENAkvKiBETUEgQ2hhbm5lbCAzIFggTW9kaWZ5IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTNfWV9DT1VOVAkJCTB4RkZDMDBDRDgJLyogRE1BIENoYW5uZWwgMyBZIENvdW50IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTNfWV9NT0RJRlkJCQkweEZGQzAwQ0RDCS8qIERNQSBDaGFubmVsIDMgWSBNb2RpZnkgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BM19DVVJSX0RFU0NfUFRSCQkweEZGQzAwQ0UwCS8qIERNQSBDaGFubmVsIDMgQ3VycmVudCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BM19DVVJSX0FERFIJCQkweEZGQzAwQ0U0CS8qIERNQSBDaGFubmVsIDMgQ3VycmVudCBBZGRyZXNzIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTNfSVJRX1NUQVRVUwkJCTB4RkZDMDBDRTgJLyogRE1BIENoYW5uZWwgMyBJbnRlcnJ1cHQvU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTNfUEVSSVBIRVJBTF9NQVAJCTB4RkZDMDBDRUMJLyogRE1BIENoYW5uZWwgMyBQZXJpcGhlcmFsIE1hcAlSZWdpc3RlciAqLworI2RlZmluZQlETUEzX0NVUlJfWF9DT1VOVAkJMHhGRkMwMENGMAkvKiBETUEgQ2hhbm5lbCAzIEN1cnJlbnQgWCBDb3VudCBSZWdpc3RlciAqLworI2RlZmluZQlETUEzX0NVUlJfWV9DT1VOVAkJMHhGRkMwMENGOAkvKiBETUEgQ2hhbm5lbCAzIEN1cnJlbnQgWSBDb3VudCBSZWdpc3RlciAqLworCisjZGVmaW5lCURNQTRfTkVYVF9ERVNDX1BUUgkJMHhGRkMwMEQwMAkvKiBETUEgQ2hhbm5lbCA0IE5leHQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTRfU1RBUlRfQUREUgkJCTB4RkZDMDBEMDQJLyogRE1BIENoYW5uZWwgNCBTdGFydCBBZGRyZXNzIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTRfQ09ORklHCQkJCTB4RkZDMDBEMDgJLyogRE1BIENoYW5uZWwgNCBDb25maWd1cmF0aW9uIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTRfWF9DT1VOVAkJCTB4RkZDMDBEMTAJLyogRE1BIENoYW5uZWwgNCBYIENvdW50IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTRfWF9NT0RJRlkJCQkweEZGQzAwRDE0CS8qIERNQSBDaGFubmVsIDQgWCBNb2RpZnkgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BNF9ZX0NPVU5UCQkJMHhGRkMwMEQxOAkvKiBETUEgQ2hhbm5lbCA0IFkgQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BNF9ZX01PRElGWQkJCTB4RkZDMDBEMUMJLyogRE1BIENoYW5uZWwgNCBZIE1vZGlmeSBSZWdpc3RlciAqLworI2RlZmluZQlETUE0X0NVUlJfREVTQ19QVFIJCTB4RkZDMDBEMjAJLyogRE1BIENoYW5uZWwgNCBDdXJyZW50IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlciAqLworI2RlZmluZQlETUE0X0NVUlJfQUREUgkJCTB4RkZDMDBEMjQJLyogRE1BIENoYW5uZWwgNCBDdXJyZW50IEFkZHJlc3MgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BNF9JUlFfU1RBVFVTCQkJMHhGRkMwMEQyOAkvKiBETUEgQ2hhbm5lbCA0IEludGVycnVwdC9TdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BNF9QRVJJUEhFUkFMX01BUAkJMHhGRkMwMEQyQwkvKiBETUEgQ2hhbm5lbCA0IFBlcmlwaGVyYWwgTWFwCVJlZ2lzdGVyICovCisjZGVmaW5lCURNQTRfQ1VSUl9YX0NPVU5UCQkweEZGQzAwRDMwCS8qIERNQSBDaGFubmVsIDQgQ3VycmVudCBYIENvdW50IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTRfQ1VSUl9ZX0NPVU5UCQkweEZGQzAwRDM4CS8qIERNQSBDaGFubmVsIDQgQ3VycmVudCBZIENvdW50IFJlZ2lzdGVyICovCisKKyNkZWZpbmUJRE1BNV9ORVhUX0RFU0NfUFRSCQkweEZGQzAwRDQwCS8qIERNQSBDaGFubmVsIDUgTmV4dCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BNV9TVEFSVF9BRERSCQkJMHhGRkMwMEQ0NAkvKiBETUEgQ2hhbm5lbCA1IFN0YXJ0IEFkZHJlc3MgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BNV9DT05GSUcJCQkJMHhGRkMwMEQ0OAkvKiBETUEgQ2hhbm5lbCA1IENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BNV9YX0NPVU5UCQkJMHhGRkMwMEQ1MAkvKiBETUEgQ2hhbm5lbCA1IFggQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BNV9YX01PRElGWQkJCTB4RkZDMDBENTQJLyogRE1BIENoYW5uZWwgNSBYIE1vZGlmeSBSZWdpc3RlciAqLworI2RlZmluZQlETUE1X1lfQ09VTlQJCQkweEZGQzAwRDU4CS8qIERNQSBDaGFubmVsIDUgWSBDb3VudCBSZWdpc3RlciAqLworI2RlZmluZQlETUE1X1lfTU9ESUZZCQkJMHhGRkMwMEQ1QwkvKiBETUEgQ2hhbm5lbCA1IFkgTW9kaWZ5IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTVfQ1VSUl9ERVNDX1BUUgkJMHhGRkMwMEQ2MAkvKiBETUEgQ2hhbm5lbCA1IEN1cnJlbnQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTVfQ1VSUl9BRERSCQkJMHhGRkMwMEQ2NAkvKiBETUEgQ2hhbm5lbCA1IEN1cnJlbnQgQWRkcmVzcyBSZWdpc3RlciAqLworI2RlZmluZQlETUE1X0lSUV9TVEFUVVMJCQkweEZGQzAwRDY4CS8qIERNQSBDaGFubmVsIDUgSW50ZXJydXB0L1N0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZQlETUE1X1BFUklQSEVSQUxfTUFQCQkweEZGQzAwRDZDCS8qIERNQSBDaGFubmVsIDUgUGVyaXBoZXJhbCBNYXAJUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BNV9DVVJSX1hfQ09VTlQJCTB4RkZDMDBENzAJLyogRE1BIENoYW5uZWwgNSBDdXJyZW50IFggQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BNV9DVVJSX1lfQ09VTlQJCTB4RkZDMDBENzgJLyogRE1BIENoYW5uZWwgNSBDdXJyZW50IFkgQ291bnQgUmVnaXN0ZXIgKi8KKworI2RlZmluZQlETUE2X05FWFRfREVTQ19QVFIJCTB4RkZDMDBEODAJLyogRE1BIENoYW5uZWwgNiBOZXh0IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlciAqLworI2RlZmluZQlETUE2X1NUQVJUX0FERFIJCQkweEZGQzAwRDg0CS8qIERNQSBDaGFubmVsIDYgU3RhcnQgQWRkcmVzcyBSZWdpc3RlciAqLworI2RlZmluZQlETUE2X0NPTkZJRwkJCQkweEZGQzAwRDg4CS8qIERNQSBDaGFubmVsIDYgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAqLworI2RlZmluZQlETUE2X1hfQ09VTlQJCQkweEZGQzAwRDkwCS8qIERNQSBDaGFubmVsIDYgWCBDb3VudCBSZWdpc3RlciAqLworI2RlZmluZQlETUE2X1hfTU9ESUZZCQkJMHhGRkMwMEQ5NAkvKiBETUEgQ2hhbm5lbCA2IFggTW9kaWZ5IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTZfWV9DT1VOVAkJCTB4RkZDMDBEOTgJLyogRE1BIENoYW5uZWwgNiBZIENvdW50IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTZfWV9NT0RJRlkJCQkweEZGQzAwRDlDCS8qIERNQSBDaGFubmVsIDYgWSBNb2RpZnkgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BNl9DVVJSX0RFU0NfUFRSCQkweEZGQzAwREEwCS8qIERNQSBDaGFubmVsIDYgQ3VycmVudCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BNl9DVVJSX0FERFIJCQkweEZGQzAwREE0CS8qIERNQSBDaGFubmVsIDYgQ3VycmVudCBBZGRyZXNzIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTZfSVJRX1NUQVRVUwkJCTB4RkZDMDBEQTgJLyogRE1BIENoYW5uZWwgNiBJbnRlcnJ1cHQvU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTZfUEVSSVBIRVJBTF9NQVAJCTB4RkZDMDBEQUMJLyogRE1BIENoYW5uZWwgNiBQZXJpcGhlcmFsIE1hcAlSZWdpc3RlciAqLworI2RlZmluZQlETUE2X0NVUlJfWF9DT1VOVAkJMHhGRkMwMERCMAkvKiBETUEgQ2hhbm5lbCA2IEN1cnJlbnQgWCBDb3VudCBSZWdpc3RlciAqLworI2RlZmluZQlETUE2X0NVUlJfWV9DT1VOVAkJMHhGRkMwMERCOAkvKiBETUEgQ2hhbm5lbCA2IEN1cnJlbnQgWSBDb3VudCBSZWdpc3RlciAqLworCisjZGVmaW5lCURNQTdfTkVYVF9ERVNDX1BUUgkJMHhGRkMwMERDMAkvKiBETUEgQ2hhbm5lbCA3IE5leHQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTdfU1RBUlRfQUREUgkJCTB4RkZDMDBEQzQJLyogRE1BIENoYW5uZWwgNyBTdGFydCBBZGRyZXNzIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTdfQ09ORklHCQkJCTB4RkZDMDBEQzgJLyogRE1BIENoYW5uZWwgNyBDb25maWd1cmF0aW9uIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTdfWF9DT1VOVAkJCTB4RkZDMDBERDAJLyogRE1BIENoYW5uZWwgNyBYIENvdW50IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTdfWF9NT0RJRlkJCQkweEZGQzAwREQ0CS8qIERNQSBDaGFubmVsIDcgWCBNb2RpZnkgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BN19ZX0NPVU5UCQkJMHhGRkMwMEREOAkvKiBETUEgQ2hhbm5lbCA3IFkgQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BN19ZX01PRElGWQkJCTB4RkZDMDBEREMJLyogRE1BIENoYW5uZWwgNyBZIE1vZGlmeSBSZWdpc3RlciAqLworI2RlZmluZQlETUE3X0NVUlJfREVTQ19QVFIJCTB4RkZDMDBERTAJLyogRE1BIENoYW5uZWwgNyBDdXJyZW50IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlciAqLworI2RlZmluZQlETUE3X0NVUlJfQUREUgkJCTB4RkZDMDBERTQJLyogRE1BIENoYW5uZWwgNyBDdXJyZW50IEFkZHJlc3MgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BN19JUlFfU1RBVFVTCQkJMHhGRkMwMERFOAkvKiBETUEgQ2hhbm5lbCA3IEludGVycnVwdC9TdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BN19QRVJJUEhFUkFMX01BUAkJMHhGRkMwMERFQwkvKiBETUEgQ2hhbm5lbCA3IFBlcmlwaGVyYWwgTWFwCVJlZ2lzdGVyICovCisjZGVmaW5lCURNQTdfQ1VSUl9YX0NPVU5UCQkweEZGQzAwREYwCS8qIERNQSBDaGFubmVsIDcgQ3VycmVudCBYIENvdW50IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTdfQ1VSUl9ZX0NPVU5UCQkweEZGQzAwREY4CS8qIERNQSBDaGFubmVsIDcgQ3VycmVudCBZIENvdW50IFJlZ2lzdGVyICovCisKKyNkZWZpbmUJTURNQV9EMF9ORVhUX0RFU0NfUFRSCTB4RkZDMDBFMDAJLyogTWVtRE1BMCBTdHJlYW0gMCBEZXN0aW5hdGlvbglOZXh0IERlc2NyaXB0b3IJUG9pbnRlcglSZWdpc3RlciAqLworI2RlZmluZQlNRE1BX0QwX1NUQVJUX0FERFIJCTB4RkZDMDBFMDQJLyogTWVtRE1BMCBTdHJlYW0gMCBEZXN0aW5hdGlvbglTdGFydCBBZGRyZXNzIFJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUFfRDBfQ09ORklHCQkJMHhGRkMwMEUwOAkvKiBNZW1ETUEwIFN0cmVhbSAwIERlc3RpbmF0aW9uCUNvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQV9EMF9YX0NPVU5UCQkweEZGQzAwRTEwCS8qIE1lbURNQTAgU3RyZWFtIDAgRGVzdGluYXRpb24JWCBDb3VudAlSZWdpc3RlciAqLworI2RlZmluZQlNRE1BX0QwX1hfTU9ESUZZCQkweEZGQzAwRTE0CS8qIE1lbURNQTAgU3RyZWFtIDAgRGVzdGluYXRpb24JWCBNb2RpZnkgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQV9EMF9ZX0NPVU5UCQkweEZGQzAwRTE4CS8qIE1lbURNQTAgU3RyZWFtIDAgRGVzdGluYXRpb24JWSBDb3VudAlSZWdpc3RlciAqLworI2RlZmluZQlNRE1BX0QwX1lfTU9ESUZZCQkweEZGQzAwRTFDCS8qIE1lbURNQTAgU3RyZWFtIDAgRGVzdGluYXRpb24JWSBNb2RpZnkgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQV9EMF9DVVJSX0RFU0NfUFRSCTB4RkZDMDBFMjAJLyogTWVtRE1BMCBTdHJlYW0gMCBEZXN0aW5hdGlvbglDdXJyZW50CURlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlciAqLworI2RlZmluZQlNRE1BX0QwX0NVUlJfQUREUgkJMHhGRkMwMEUyNAkvKiBNZW1ETUEwIFN0cmVhbSAwIERlc3RpbmF0aW9uCUN1cnJlbnQJQWRkcmVzcwlSZWdpc3RlciAqLworI2RlZmluZQlNRE1BX0QwX0lSUV9TVEFUVVMJCTB4RkZDMDBFMjgJLyogTWVtRE1BMCBTdHJlYW0gMCBEZXN0aW5hdGlvbglJbnRlcnJ1cHQvU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUFfRDBfUEVSSVBIRVJBTF9NQVAJMHhGRkMwMEUyQwkvKiBNZW1ETUEwIFN0cmVhbSAwIERlc3RpbmF0aW9uCVBlcmlwaGVyYWwgTWFwIFJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUFfRDBfQ1VSUl9YX0NPVU5UCTB4RkZDMDBFMzAJLyogTWVtRE1BMCBTdHJlYW0gMCBEZXN0aW5hdGlvbglDdXJyZW50CVggQ291bnQJUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQV9EMF9DVVJSX1lfQ09VTlQJMHhGRkMwMEUzOAkvKiBNZW1ETUEwIFN0cmVhbSAwIERlc3RpbmF0aW9uCUN1cnJlbnQJWSBDb3VudAlSZWdpc3RlciAqLworCisjZGVmaW5lCU1ETUFfUzBfTkVYVF9ERVNDX1BUUgkweEZGQzAwRTQwCS8qIE1lbURNQTAgU3RyZWFtIDAgU291cmNlIE5leHQJRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUFfUzBfU1RBUlRfQUREUgkJMHhGRkMwMEU0NAkvKiBNZW1ETUEwIFN0cmVhbSAwIFNvdXJjZSBTdGFydCBBZGRyZXNzIFJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUFfUzBfQ09ORklHCQkJMHhGRkMwMEU0OAkvKiBNZW1ETUEwIFN0cmVhbSAwIFNvdXJjZSBDb25maWd1cmF0aW9uIFJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUFfUzBfWF9DT1VOVAkJMHhGRkMwMEU1MAkvKiBNZW1ETUEwIFN0cmVhbSAwIFNvdXJjZSBYIENvdW50IFJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUFfUzBfWF9NT0RJRlkJCTB4RkZDMDBFNTQJLyogTWVtRE1BMCBTdHJlYW0gMCBTb3VyY2UgWCBNb2RpZnkgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQV9TMF9ZX0NPVU5UCQkweEZGQzAwRTU4CS8qIE1lbURNQTAgU3RyZWFtIDAgU291cmNlIFkgQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQV9TMF9ZX01PRElGWQkJMHhGRkMwMEU1QwkvKiBNZW1ETUEwIFN0cmVhbSAwIFNvdXJjZSBZIE1vZGlmeSBSZWdpc3RlciAqLworI2RlZmluZQlNRE1BX1MwX0NVUlJfREVTQ19QVFIJMHhGRkMwMEU2MAkvKiBNZW1ETUEwIFN0cmVhbSAwIFNvdXJjZSBDdXJyZW50IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlciAqLworI2RlZmluZQlNRE1BX1MwX0NVUlJfQUREUgkJMHhGRkMwMEU2NAkvKiBNZW1ETUEwIFN0cmVhbSAwIFNvdXJjZSBDdXJyZW50IEFkZHJlc3MgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQV9TMF9JUlFfU1RBVFVTCQkweEZGQzAwRTY4CS8qIE1lbURNQTAgU3RyZWFtIDAgU291cmNlIEludGVycnVwdC9TdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQV9TMF9QRVJJUEhFUkFMX01BUAkweEZGQzAwRTZDCS8qIE1lbURNQTAgU3RyZWFtIDAgU291cmNlIFBlcmlwaGVyYWwgTWFwIFJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUFfUzBfQ1VSUl9YX0NPVU5UCTB4RkZDMDBFNzAJLyogTWVtRE1BMCBTdHJlYW0gMCBTb3VyY2UgQ3VycmVudCBYIENvdW50IFJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUFfUzBfQ1VSUl9ZX0NPVU5UCTB4RkZDMDBFNzgJLyogTWVtRE1BMCBTdHJlYW0gMCBTb3VyY2UgQ3VycmVudCBZIENvdW50IFJlZ2lzdGVyICovCisKKyNkZWZpbmUJTURNQV9EMV9ORVhUX0RFU0NfUFRSCTB4RkZDMDBFODAJLyogTWVtRE1BMCBTdHJlYW0gMSBEZXN0aW5hdGlvbglOZXh0IERlc2NyaXB0b3IJUG9pbnRlcglSZWdpc3RlciAqLworI2RlZmluZQlNRE1BX0QxX1NUQVJUX0FERFIJCTB4RkZDMDBFODQJLyogTWVtRE1BMCBTdHJlYW0gMSBEZXN0aW5hdGlvbglTdGFydCBBZGRyZXNzIFJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUFfRDFfQ09ORklHCQkJMHhGRkMwMEU4OAkvKiBNZW1ETUEwIFN0cmVhbSAxIERlc3RpbmF0aW9uCUNvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQV9EMV9YX0NPVU5UCQkweEZGQzAwRTkwCS8qIE1lbURNQTAgU3RyZWFtIDEgRGVzdGluYXRpb24JWCBDb3VudAlSZWdpc3RlciAqLworI2RlZmluZQlNRE1BX0QxX1hfTU9ESUZZCQkweEZGQzAwRTk0CS8qIE1lbURNQTAgU3RyZWFtIDEgRGVzdGluYXRpb24JWCBNb2RpZnkgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQV9EMV9ZX0NPVU5UCQkweEZGQzAwRTk4CS8qIE1lbURNQTAgU3RyZWFtIDEgRGVzdGluYXRpb24JWSBDb3VudAlSZWdpc3RlciAqLworI2RlZmluZQlNRE1BX0QxX1lfTU9ESUZZCQkweEZGQzAwRTlDCS8qIE1lbURNQTAgU3RyZWFtIDEgRGVzdGluYXRpb24JWSBNb2RpZnkgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQV9EMV9DVVJSX0RFU0NfUFRSCTB4RkZDMDBFQTAJLyogTWVtRE1BMCBTdHJlYW0gMSBEZXN0aW5hdGlvbglDdXJyZW50CURlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlciAqLworI2RlZmluZQlNRE1BX0QxX0NVUlJfQUREUgkJMHhGRkMwMEVBNAkvKiBNZW1ETUEwIFN0cmVhbSAxIERlc3RpbmF0aW9uCUN1cnJlbnQJQWRkcmVzcwlSZWdpc3RlciAqLworI2RlZmluZQlNRE1BX0QxX0lSUV9TVEFUVVMJCTB4RkZDMDBFQTgJLyogTWVtRE1BMCBTdHJlYW0gMSBEZXN0aW5hdGlvbglJbnRlcnJ1cHQvU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUFfRDFfUEVSSVBIRVJBTF9NQVAJMHhGRkMwMEVBQwkvKiBNZW1ETUEwIFN0cmVhbSAxIERlc3RpbmF0aW9uCVBlcmlwaGVyYWwgTWFwIFJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUFfRDFfQ1VSUl9YX0NPVU5UCTB4RkZDMDBFQjAJLyogTWVtRE1BMCBTdHJlYW0gMSBEZXN0aW5hdGlvbglDdXJyZW50CVggQ291bnQJUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQV9EMV9DVVJSX1lfQ09VTlQJMHhGRkMwMEVCOAkvKiBNZW1ETUEwIFN0cmVhbSAxIERlc3RpbmF0aW9uCUN1cnJlbnQJWSBDb3VudAlSZWdpc3RlciAqLworCisjZGVmaW5lCU1ETUFfUzFfTkVYVF9ERVNDX1BUUgkweEZGQzAwRUMwCS8qIE1lbURNQTAgU3RyZWFtIDEgU291cmNlIE5leHQJRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUFfUzFfU1RBUlRfQUREUgkJMHhGRkMwMEVDNAkvKiBNZW1ETUEwIFN0cmVhbSAxIFNvdXJjZSBTdGFydCBBZGRyZXNzIFJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUFfUzFfQ09ORklHCQkJMHhGRkMwMEVDOAkvKiBNZW1ETUEwIFN0cmVhbSAxIFNvdXJjZSBDb25maWd1cmF0aW9uIFJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUFfUzFfWF9DT1VOVAkJMHhGRkMwMEVEMAkvKiBNZW1ETUEwIFN0cmVhbSAxIFNvdXJjZSBYIENvdW50IFJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUFfUzFfWF9NT0RJRlkJCTB4RkZDMDBFRDQJLyogTWVtRE1BMCBTdHJlYW0gMSBTb3VyY2UgWCBNb2RpZnkgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQV9TMV9ZX0NPVU5UCQkweEZGQzAwRUQ4CS8qIE1lbURNQTAgU3RyZWFtIDEgU291cmNlIFkgQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQV9TMV9ZX01PRElGWQkJMHhGRkMwMEVEQwkvKiBNZW1ETUEwIFN0cmVhbSAxIFNvdXJjZSBZIE1vZGlmeSBSZWdpc3RlciAqLworI2RlZmluZQlNRE1BX1MxX0NVUlJfREVTQ19QVFIJMHhGRkMwMEVFMAkvKiBNZW1ETUEwIFN0cmVhbSAxIFNvdXJjZSBDdXJyZW50IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlciAqLworI2RlZmluZQlNRE1BX1MxX0NVUlJfQUREUgkJMHhGRkMwMEVFNAkvKiBNZW1ETUEwIFN0cmVhbSAxIFNvdXJjZSBDdXJyZW50IEFkZHJlc3MgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQV9TMV9JUlFfU1RBVFVTCQkweEZGQzAwRUU4CS8qIE1lbURNQTAgU3RyZWFtIDEgU291cmNlIEludGVycnVwdC9TdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQV9TMV9QRVJJUEhFUkFMX01BUAkweEZGQzAwRUVDCS8qIE1lbURNQTAgU3RyZWFtIDEgU291cmNlIFBlcmlwaGVyYWwgTWFwIFJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUFfUzFfQ1VSUl9YX0NPVU5UCTB4RkZDMDBFRjAJLyogTWVtRE1BMCBTdHJlYW0gMSBTb3VyY2UgQ3VycmVudCBYIENvdW50IFJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUFfUzFfQ1VSUl9ZX0NPVU5UCTB4RkZDMDBFRjgJLyogTWVtRE1BMCBTdHJlYW0gMSBTb3VyY2UgQ3VycmVudCBZIENvdW50IFJlZ2lzdGVyICovCisKKworLyogUGFyYWxsZWwgUGVyaXBoZXJhbCBJbnRlcmZhY2UgKFBQSSkgKDB4RkZDMDEwMDAgLSAweEZGQzAxMEZGKSAqLworI2RlZmluZQlQUElfQ09OVFJPTAkJCTB4RkZDMDEwMDAJLyogUFBJIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJUFBJX1NUQVRVUwkJCTB4RkZDMDEwMDQJLyogUFBJIFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZQlQUElfQ09VTlQJCQkweEZGQzAxMDA4CS8qIFBQSSBUcmFuc2ZlcglDb3VudCBSZWdpc3RlciAqLworI2RlZmluZQlQUElfREVMQVkJCQkweEZGQzAxMDBDCS8qIFBQSSBEZWxheSBDb3VudCBSZWdpc3RlciAqLworI2RlZmluZQlQUElfRlJBTUUJCQkweEZGQzAxMDEwCS8qIFBQSSBGcmFtZSBMZW5ndGggUmVnaXN0ZXIgKi8KKworCisvKiBUd28tV2lyZSBJbnRlcmZhY2UgMAkoMHhGRkMwMTQwMCAtIDB4RkZDMDE0RkYpCQkJICovCisjZGVmaW5lCVRXSTBfQ0xLRElWCQkJMHhGRkMwMTQwMAkvKiBTZXJpYWwgQ2xvY2sJRGl2aWRlcglSZWdpc3RlciAqLworI2RlZmluZQlUV0kwX0NPTlRST0wJCTB4RkZDMDE0MDQJLyogVFdJMAlNYXN0ZXIgSW50ZXJuYWwJVGltZSBSZWZlcmVuY2UgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJVFdJMF9TTEFWRV9DVEwJCTB4RkZDMDE0MDgJLyogU2xhdmUgTW9kZSBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lCVRXSTBfU0xBVkVfU1RBVAkJMHhGRkMwMTQwQwkvKiBTbGF2ZSBNb2RlIFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZQlUV0kwX1NMQVZFX0FERFIJCTB4RkZDMDE0MTAJLyogU2xhdmUgTW9kZSBBZGRyZXNzIFJlZ2lzdGVyICovCisjZGVmaW5lCVRXSTBfTUFTVEVSX0NUTAkweEZGQzAxNDE0CS8qIE1hc3RlciBNb2RlIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJVFdJMF9NQVNURVJfU1RBVAkweEZGQzAxNDE4CS8qIE1hc3RlciBNb2RlIFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZQlUV0kwX01BU1RFUl9BRERSCTB4RkZDMDE0MUMJLyogTWFzdGVyIE1vZGUgQWRkcmVzcyBSZWdpc3RlciAqLworI2RlZmluZQlUV0kwX0lOVF9TVEFUCQkweEZGQzAxNDIwCS8qIFRXSTAJTWFzdGVyIEludGVycnVwdCBSZWdpc3RlciAqLworI2RlZmluZQlUV0kwX0lOVF9NQVNLCQkweEZGQzAxNDI0CS8qIFRXSTAJTWFzdGVyIEludGVycnVwdCBNYXNrIFJlZ2lzdGVyICovCisjZGVmaW5lCVRXSTBfRklGT19DVEwJCTB4RkZDMDE0MjgJLyogRklGTwlDb250cm9sCVJlZ2lzdGVyICovCisjZGVmaW5lCVRXSTBfRklGT19TVEFUCQkweEZGQzAxNDJDCS8qIEZJRk8JU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lCVRXSTBfWE1UX0RBVEE4CQkweEZGQzAxNDgwCS8qIEZJRk8JVHJhbnNtaXQgRGF0YSBTaW5nbGUgQnl0ZSBSZWdpc3RlciAqLworI2RlZmluZQlUV0kwX1hNVF9EQVRBMTYJCTB4RkZDMDE0ODQJLyogRklGTwlUcmFuc21pdCBEYXRhIERvdWJsZSBCeXRlIFJlZ2lzdGVyICovCisjZGVmaW5lCVRXSTBfUkNWX0RBVEE4CQkweEZGQzAxNDg4CS8qIEZJRk8JUmVjZWl2ZQlEYXRhIFNpbmdsZSBCeXRlIFJlZ2lzdGVyICovCisjZGVmaW5lCVRXSTBfUkNWX0RBVEExNgkJMHhGRkMwMTQ4QwkvKiBGSUZPCVJlY2VpdmUJRGF0YSBEb3VibGUgQnl0ZSBSZWdpc3RlciAqLworCisjZGVmaW5lIFRXSTBfUkVHQkFTRQkJVFdJMF9DTEtESVYKKworLyogdGhlIGZvbGxvd2luZyBhcmUgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5ICovCisjZGVmaW5lCVRXSTBfUFJFU0NBTEUJIFRXSTBfQ09OVFJPTAorI2RlZmluZQlUV0kwX0lOVF9TUkMJIFRXSTBfSU5UX1NUQVQKKyNkZWZpbmUJVFdJMF9JTlRfRU5BQkxFCSBUV0kwX0lOVF9NQVNLCisKKworLyogR2VuZXJhbC1QdXJwb3NlIFBvcnRzICAoMHhGRkMwMTUwMCAtCTB4RkZDMDE1RkYpCSAqLworCisvKiBHUElPCVBvcnQgQyBSZWdpc3RlcglOYW1lcyAqLworI2RlZmluZSBQT1JUQ0lPX0ZFUgkJCTB4RkZDMDE1MDAJLyogR1BJTwlQaW4gUG9ydCBDIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUE9SVENJTwkJCQkweEZGQzAxNTEwCS8qIEdQSU8JUGluIFBvcnQgQyBEYXRhCVJlZ2lzdGVyICovCisjZGVmaW5lIFBPUlRDSU9fQ0xFQVIJCQkweEZGQzAxNTIwCS8qIENsZWFyIEdQSU8gUGluIFBvcnQgQyBSZWdpc3RlciAqLworI2RlZmluZSBQT1JUQ0lPX1NFVAkJCTB4RkZDMDE1MzAJLyogU2V0IEdQSU8gUGluCVBvcnQgQyBSZWdpc3RlciAqLworI2RlZmluZSBQT1JUQ0lPX1RPR0dMRQkJCTB4RkZDMDE1NDAJLyogVG9nZ2xlIEdQSU8gUGluIFBvcnQJQyBSZWdpc3RlciAqLworI2RlZmluZSBQT1JUQ0lPX0RJUgkJCTB4RkZDMDE1NTAJLyogR1BJTwlQaW4gUG9ydCBDIERpcmVjdGlvbiBSZWdpc3RlciAqLworI2RlZmluZSBQT1JUQ0lPX0lORU4JCQkweEZGQzAxNTYwCS8qIEdQSU8JUGluIFBvcnQgQyBJbnB1dCBFbmFibGUJUmVnaXN0ZXIgKi8KKworLyogR1BJTwlQb3J0IEQgUmVnaXN0ZXIJTmFtZXMgKi8KKyNkZWZpbmUgUE9SVERJT19GRVIJCQkweEZGQzAxNTA0CS8qIEdQSU8JUGluIFBvcnQgRCBDb25maWd1cmF0aW9uIFJlZ2lzdGVyICovCisjZGVmaW5lIFBPUlRESU8JCQkJMHhGRkMwMTUxNAkvKiBHUElPCVBpbiBQb3J0IEQgRGF0YQlSZWdpc3RlciAqLworI2RlZmluZSBQT1JURElPX0NMRUFSCQkJMHhGRkMwMTUyNAkvKiBDbGVhciBHUElPIFBpbiBQb3J0IEQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUE9SVERJT19TRVQJCQkweEZGQzAxNTM0CS8qIFNldCBHUElPIFBpbglQb3J0IEQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUE9SVERJT19UT0dHTEUJCQkweEZGQzAxNTQ0CS8qIFRvZ2dsZSBHUElPIFBpbiBQb3J0CUQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUE9SVERJT19ESVIJCQkweEZGQzAxNTU0CS8qIEdQSU8JUGluIFBvcnQgRCBEaXJlY3Rpb24gUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUE9SVERJT19JTkVOCQkJMHhGRkMwMTU2NAkvKiBHUElPCVBpbiBQb3J0IEQgSW5wdXQgRW5hYmxlCVJlZ2lzdGVyICovCisKKy8qIEdQSU8JUG9ydCBFIFJlZ2lzdGVyCU5hbWVzICovCisjZGVmaW5lIFBPUlRFSU9fRkVSCQkJMHhGRkMwMTUwOAkvKiBHUElPCVBpbiBQb3J0IEUgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAqLworI2RlZmluZSBQT1JURUlPCQkJCTB4RkZDMDE1MTgJLyogR1BJTwlQaW4gUG9ydCBFIERhdGEJUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUE9SVEVJT19DTEVBUgkJCTB4RkZDMDE1MjgJLyogQ2xlYXIgR1BJTyBQaW4gUG9ydCBFIFJlZ2lzdGVyICovCisjZGVmaW5lIFBPUlRFSU9fU0VUCQkJMHhGRkMwMTUzOAkvKiBTZXQgR1BJTyBQaW4JUG9ydCBFIFJlZ2lzdGVyICovCisjZGVmaW5lIFBPUlRFSU9fVE9HR0xFCQkJMHhGRkMwMTU0OAkvKiBUb2dnbGUgR1BJTyBQaW4gUG9ydAlFIFJlZ2lzdGVyICovCisjZGVmaW5lIFBPUlRFSU9fRElSCQkJMHhGRkMwMTU1OAkvKiBHUElPCVBpbiBQb3J0IEUgRGlyZWN0aW9uIFJlZ2lzdGVyICovCisjZGVmaW5lIFBPUlRFSU9fSU5FTgkJCTB4RkZDMDE1NjgJLyogR1BJTwlQaW4gUG9ydCBFIElucHV0IEVuYWJsZQlSZWdpc3RlciAqLworCisvKiBETUEgQ29udHJvbGxlciAxIFRyYWZmaWMgQ29udHJvbCBSZWdpc3RlcnMgKDB4RkZDMDFCMDAgLSAweEZGQzAxQkZGKSAqLworCisjZGVmaW5lCURNQUMxX1RDX1BFUgkJCTB4RkZDMDFCMEMJLyogRE1BIENvbnRyb2xsZXIgMSBUcmFmZmljIENvbnRyb2wgUGVyaW9kcyBSZWdpc3RlciAqLworI2RlZmluZQlETUFDMV9UQ19DTlQJCQkweEZGQzAxQjEwCS8qIERNQSBDb250cm9sbGVyIDEgVHJhZmZpYyBDb250cm9sIEN1cnJlbnQgQ291bnRzIFJlZ2lzdGVyICovCisKKworCisvKiBETUEgQ29udHJvbGxlciAxICgweEZGQzAxQzAwCS0gMHhGRkMwMUZGRikJCQkJCQkJICovCisjZGVmaW5lCURNQThfTkVYVF9ERVNDX1BUUgkJMHhGRkMwMUMwMAkvKiBETUEgQ2hhbm5lbCA4IE5leHQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQThfU1RBUlRfQUREUgkJCTB4RkZDMDFDMDQJLyogRE1BIENoYW5uZWwgOCBTdGFydCBBZGRyZXNzIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQThfQ09ORklHCQkJCTB4RkZDMDFDMDgJLyogRE1BIENoYW5uZWwgOCBDb25maWd1cmF0aW9uIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQThfWF9DT1VOVAkJCTB4RkZDMDFDMTAJLyogRE1BIENoYW5uZWwgOCBYIENvdW50IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQThfWF9NT0RJRlkJCQkweEZGQzAxQzE0CS8qIERNQSBDaGFubmVsIDggWCBNb2RpZnkgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BOF9ZX0NPVU5UCQkJMHhGRkMwMUMxOAkvKiBETUEgQ2hhbm5lbCA4IFkgQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BOF9ZX01PRElGWQkJCTB4RkZDMDFDMUMJLyogRE1BIENoYW5uZWwgOCBZIE1vZGlmeSBSZWdpc3RlciAqLworI2RlZmluZQlETUE4X0NVUlJfREVTQ19QVFIJCTB4RkZDMDFDMjAJLyogRE1BIENoYW5uZWwgOCBDdXJyZW50IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlciAqLworI2RlZmluZQlETUE4X0NVUlJfQUREUgkJCTB4RkZDMDFDMjQJLyogRE1BIENoYW5uZWwgOCBDdXJyZW50IEFkZHJlc3MgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BOF9JUlFfU1RBVFVTCQkJMHhGRkMwMUMyOAkvKiBETUEgQ2hhbm5lbCA4IEludGVycnVwdC9TdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BOF9QRVJJUEhFUkFMX01BUAkJMHhGRkMwMUMyQwkvKiBETUEgQ2hhbm5lbCA4IFBlcmlwaGVyYWwgTWFwCVJlZ2lzdGVyICovCisjZGVmaW5lCURNQThfQ1VSUl9YX0NPVU5UCQkweEZGQzAxQzMwCS8qIERNQSBDaGFubmVsIDggQ3VycmVudCBYIENvdW50IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQThfQ1VSUl9ZX0NPVU5UCQkweEZGQzAxQzM4CS8qIERNQSBDaGFubmVsIDggQ3VycmVudCBZIENvdW50IFJlZ2lzdGVyICovCisKKyNkZWZpbmUJRE1BOV9ORVhUX0RFU0NfUFRSCQkweEZGQzAxQzQwCS8qIERNQSBDaGFubmVsIDkgTmV4dCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BOV9TVEFSVF9BRERSCQkJMHhGRkMwMUM0NAkvKiBETUEgQ2hhbm5lbCA5IFN0YXJ0IEFkZHJlc3MgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BOV9DT05GSUcJCQkJMHhGRkMwMUM0OAkvKiBETUEgQ2hhbm5lbCA5IENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BOV9YX0NPVU5UCQkJMHhGRkMwMUM1MAkvKiBETUEgQ2hhbm5lbCA5IFggQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BOV9YX01PRElGWQkJCTB4RkZDMDFDNTQJLyogRE1BIENoYW5uZWwgOSBYIE1vZGlmeSBSZWdpc3RlciAqLworI2RlZmluZQlETUE5X1lfQ09VTlQJCQkweEZGQzAxQzU4CS8qIERNQSBDaGFubmVsIDkgWSBDb3VudCBSZWdpc3RlciAqLworI2RlZmluZQlETUE5X1lfTU9ESUZZCQkJMHhGRkMwMUM1QwkvKiBETUEgQ2hhbm5lbCA5IFkgTW9kaWZ5IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTlfQ1VSUl9ERVNDX1BUUgkJMHhGRkMwMUM2MAkvKiBETUEgQ2hhbm5lbCA5IEN1cnJlbnQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTlfQ1VSUl9BRERSCQkJMHhGRkMwMUM2NAkvKiBETUEgQ2hhbm5lbCA5IEN1cnJlbnQgQWRkcmVzcyBSZWdpc3RlciAqLworI2RlZmluZQlETUE5X0lSUV9TVEFUVVMJCQkweEZGQzAxQzY4CS8qIERNQSBDaGFubmVsIDkgSW50ZXJydXB0L1N0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZQlETUE5X1BFUklQSEVSQUxfTUFQCQkweEZGQzAxQzZDCS8qIERNQSBDaGFubmVsIDkgUGVyaXBoZXJhbCBNYXAJUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BOV9DVVJSX1hfQ09VTlQJCTB4RkZDMDFDNzAJLyogRE1BIENoYW5uZWwgOSBDdXJyZW50IFggQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BOV9DVVJSX1lfQ09VTlQJCTB4RkZDMDFDNzgJLyogRE1BIENoYW5uZWwgOSBDdXJyZW50IFkgQ291bnQgUmVnaXN0ZXIgKi8KKworI2RlZmluZQlETUExMF9ORVhUX0RFU0NfUFRSCQkweEZGQzAxQzgwCS8qIERNQSBDaGFubmVsIDEwIE5leHQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTEwX1NUQVJUX0FERFIJCTB4RkZDMDFDODQJLyogRE1BIENoYW5uZWwgMTAgU3RhcnQJQWRkcmVzcwlSZWdpc3RlciAqLworI2RlZmluZQlETUExMF9DT05GSUcJCQkweEZGQzAxQzg4CS8qIERNQSBDaGFubmVsIDEwIENvbmZpZ3VyYXRpb24JUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTBfWF9DT1VOVAkJCTB4RkZDMDFDOTAJLyogRE1BIENoYW5uZWwgMTAgWCBDb3VudCBSZWdpc3RlciAqLworI2RlZmluZQlETUExMF9YX01PRElGWQkJCTB4RkZDMDFDOTQJLyogRE1BIENoYW5uZWwgMTAgWCBNb2RpZnkgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTBfWV9DT1VOVAkJCTB4RkZDMDFDOTgJLyogRE1BIENoYW5uZWwgMTAgWSBDb3VudCBSZWdpc3RlciAqLworI2RlZmluZQlETUExMF9ZX01PRElGWQkJCTB4RkZDMDFDOUMJLyogRE1BIENoYW5uZWwgMTAgWSBNb2RpZnkgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTBfQ1VSUl9ERVNDX1BUUgkJMHhGRkMwMUNBMAkvKiBETUEgQ2hhbm5lbCAxMCBDdXJyZW50IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlciAqLworI2RlZmluZQlETUExMF9DVVJSX0FERFIJCQkweEZGQzAxQ0E0CS8qIERNQSBDaGFubmVsIDEwIEN1cnJlbnQgQWRkcmVzcyBSZWdpc3RlciAqLworI2RlZmluZQlETUExMF9JUlFfU1RBVFVTCQkweEZGQzAxQ0E4CS8qIERNQSBDaGFubmVsIDEwIEludGVycnVwdC9TdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTBfUEVSSVBIRVJBTF9NQVAJMHhGRkMwMUNBQwkvKiBETUEgQ2hhbm5lbCAxMCBQZXJpcGhlcmFsIE1hcCBSZWdpc3RlciAqLworI2RlZmluZQlETUExMF9DVVJSX1hfQ09VTlQJCTB4RkZDMDFDQjAJLyogRE1BIENoYW5uZWwgMTAgQ3VycmVudCBYIENvdW50IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTEwX0NVUlJfWV9DT1VOVAkJMHhGRkMwMUNCOAkvKiBETUEgQ2hhbm5lbCAxMCBDdXJyZW50IFkgQ291bnQgUmVnaXN0ZXIgKi8KKworI2RlZmluZQlETUExMV9ORVhUX0RFU0NfUFRSCQkweEZGQzAxQ0MwCS8qIERNQSBDaGFubmVsIDExIE5leHQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTExX1NUQVJUX0FERFIJCTB4RkZDMDFDQzQJLyogRE1BIENoYW5uZWwgMTEgU3RhcnQJQWRkcmVzcwlSZWdpc3RlciAqLworI2RlZmluZQlETUExMV9DT05GSUcJCQkweEZGQzAxQ0M4CS8qIERNQSBDaGFubmVsIDExIENvbmZpZ3VyYXRpb24JUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTFfWF9DT1VOVAkJCTB4RkZDMDFDRDAJLyogRE1BIENoYW5uZWwgMTEgWCBDb3VudCBSZWdpc3RlciAqLworI2RlZmluZQlETUExMV9YX01PRElGWQkJCTB4RkZDMDFDRDQJLyogRE1BIENoYW5uZWwgMTEgWCBNb2RpZnkgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTFfWV9DT1VOVAkJCTB4RkZDMDFDRDgJLyogRE1BIENoYW5uZWwgMTEgWSBDb3VudCBSZWdpc3RlciAqLworI2RlZmluZQlETUExMV9ZX01PRElGWQkJCTB4RkZDMDFDREMJLyogRE1BIENoYW5uZWwgMTEgWSBNb2RpZnkgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTFfQ1VSUl9ERVNDX1BUUgkJMHhGRkMwMUNFMAkvKiBETUEgQ2hhbm5lbCAxMSBDdXJyZW50IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlciAqLworI2RlZmluZQlETUExMV9DVVJSX0FERFIJCQkweEZGQzAxQ0U0CS8qIERNQSBDaGFubmVsIDExIEN1cnJlbnQgQWRkcmVzcyBSZWdpc3RlciAqLworI2RlZmluZQlETUExMV9JUlFfU1RBVFVTCQkweEZGQzAxQ0U4CS8qIERNQSBDaGFubmVsIDExIEludGVycnVwdC9TdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTFfUEVSSVBIRVJBTF9NQVAJMHhGRkMwMUNFQwkvKiBETUEgQ2hhbm5lbCAxMSBQZXJpcGhlcmFsIE1hcCBSZWdpc3RlciAqLworI2RlZmluZQlETUExMV9DVVJSX1hfQ09VTlQJCTB4RkZDMDFDRjAJLyogRE1BIENoYW5uZWwgMTEgQ3VycmVudCBYIENvdW50IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTExX0NVUlJfWV9DT1VOVAkJMHhGRkMwMUNGOAkvKiBETUEgQ2hhbm5lbCAxMSBDdXJyZW50IFkgQ291bnQgUmVnaXN0ZXIgKi8KKworI2RlZmluZQlETUExMl9ORVhUX0RFU0NfUFRSCQkweEZGQzAxRDAwCS8qIERNQSBDaGFubmVsIDEyIE5leHQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTEyX1NUQVJUX0FERFIJCTB4RkZDMDFEMDQJLyogRE1BIENoYW5uZWwgMTIgU3RhcnQJQWRkcmVzcwlSZWdpc3RlciAqLworI2RlZmluZQlETUExMl9DT05GSUcJCQkweEZGQzAxRDA4CS8qIERNQSBDaGFubmVsIDEyIENvbmZpZ3VyYXRpb24JUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTJfWF9DT1VOVAkJCTB4RkZDMDFEMTAJLyogRE1BIENoYW5uZWwgMTIgWCBDb3VudCBSZWdpc3RlciAqLworI2RlZmluZQlETUExMl9YX01PRElGWQkJCTB4RkZDMDFEMTQJLyogRE1BIENoYW5uZWwgMTIgWCBNb2RpZnkgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTJfWV9DT1VOVAkJCTB4RkZDMDFEMTgJLyogRE1BIENoYW5uZWwgMTIgWSBDb3VudCBSZWdpc3RlciAqLworI2RlZmluZQlETUExMl9ZX01PRElGWQkJCTB4RkZDMDFEMUMJLyogRE1BIENoYW5uZWwgMTIgWSBNb2RpZnkgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTJfQ1VSUl9ERVNDX1BUUgkJMHhGRkMwMUQyMAkvKiBETUEgQ2hhbm5lbCAxMiBDdXJyZW50IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlciAqLworI2RlZmluZQlETUExMl9DVVJSX0FERFIJCQkweEZGQzAxRDI0CS8qIERNQSBDaGFubmVsIDEyIEN1cnJlbnQgQWRkcmVzcyBSZWdpc3RlciAqLworI2RlZmluZQlETUExMl9JUlFfU1RBVFVTCQkweEZGQzAxRDI4CS8qIERNQSBDaGFubmVsIDEyIEludGVycnVwdC9TdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTJfUEVSSVBIRVJBTF9NQVAJMHhGRkMwMUQyQwkvKiBETUEgQ2hhbm5lbCAxMiBQZXJpcGhlcmFsIE1hcCBSZWdpc3RlciAqLworI2RlZmluZQlETUExMl9DVVJSX1hfQ09VTlQJCTB4RkZDMDFEMzAJLyogRE1BIENoYW5uZWwgMTIgQ3VycmVudCBYIENvdW50IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTEyX0NVUlJfWV9DT1VOVAkJMHhGRkMwMUQzOAkvKiBETUEgQ2hhbm5lbCAxMiBDdXJyZW50IFkgQ291bnQgUmVnaXN0ZXIgKi8KKworI2RlZmluZQlETUExM19ORVhUX0RFU0NfUFRSCQkweEZGQzAxRDQwCS8qIERNQSBDaGFubmVsIDEzIE5leHQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTEzX1NUQVJUX0FERFIJCTB4RkZDMDFENDQJLyogRE1BIENoYW5uZWwgMTMgU3RhcnQJQWRkcmVzcwlSZWdpc3RlciAqLworI2RlZmluZQlETUExM19DT05GSUcJCQkweEZGQzAxRDQ4CS8qIERNQSBDaGFubmVsIDEzIENvbmZpZ3VyYXRpb24JUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTNfWF9DT1VOVAkJCTB4RkZDMDFENTAJLyogRE1BIENoYW5uZWwgMTMgWCBDb3VudCBSZWdpc3RlciAqLworI2RlZmluZQlETUExM19YX01PRElGWQkJCTB4RkZDMDFENTQJLyogRE1BIENoYW5uZWwgMTMgWCBNb2RpZnkgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTNfWV9DT1VOVAkJCTB4RkZDMDFENTgJLyogRE1BIENoYW5uZWwgMTMgWSBDb3VudCBSZWdpc3RlciAqLworI2RlZmluZQlETUExM19ZX01PRElGWQkJCTB4RkZDMDFENUMJLyogRE1BIENoYW5uZWwgMTMgWSBNb2RpZnkgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTNfQ1VSUl9ERVNDX1BUUgkJMHhGRkMwMUQ2MAkvKiBETUEgQ2hhbm5lbCAxMyBDdXJyZW50IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlciAqLworI2RlZmluZQlETUExM19DVVJSX0FERFIJCQkweEZGQzAxRDY0CS8qIERNQSBDaGFubmVsIDEzIEN1cnJlbnQgQWRkcmVzcyBSZWdpc3RlciAqLworI2RlZmluZQlETUExM19JUlFfU1RBVFVTCQkweEZGQzAxRDY4CS8qIERNQSBDaGFubmVsIDEzIEludGVycnVwdC9TdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTNfUEVSSVBIRVJBTF9NQVAJMHhGRkMwMUQ2QwkvKiBETUEgQ2hhbm5lbCAxMyBQZXJpcGhlcmFsIE1hcCBSZWdpc3RlciAqLworI2RlZmluZQlETUExM19DVVJSX1hfQ09VTlQJCTB4RkZDMDFENzAJLyogRE1BIENoYW5uZWwgMTMgQ3VycmVudCBYIENvdW50IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTEzX0NVUlJfWV9DT1VOVAkJMHhGRkMwMUQ3OAkvKiBETUEgQ2hhbm5lbCAxMyBDdXJyZW50IFkgQ291bnQgUmVnaXN0ZXIgKi8KKworI2RlZmluZQlETUExNF9ORVhUX0RFU0NfUFRSCQkweEZGQzAxRDgwCS8qIERNQSBDaGFubmVsIDE0IE5leHQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTE0X1NUQVJUX0FERFIJCTB4RkZDMDFEODQJLyogRE1BIENoYW5uZWwgMTQgU3RhcnQJQWRkcmVzcwlSZWdpc3RlciAqLworI2RlZmluZQlETUExNF9DT05GSUcJCQkweEZGQzAxRDg4CS8qIERNQSBDaGFubmVsIDE0IENvbmZpZ3VyYXRpb24JUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTRfWF9DT1VOVAkJCTB4RkZDMDFEOTAJLyogRE1BIENoYW5uZWwgMTQgWCBDb3VudCBSZWdpc3RlciAqLworI2RlZmluZQlETUExNF9YX01PRElGWQkJCTB4RkZDMDFEOTQJLyogRE1BIENoYW5uZWwgMTQgWCBNb2RpZnkgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTRfWV9DT1VOVAkJCTB4RkZDMDFEOTgJLyogRE1BIENoYW5uZWwgMTQgWSBDb3VudCBSZWdpc3RlciAqLworI2RlZmluZQlETUExNF9ZX01PRElGWQkJCTB4RkZDMDFEOUMJLyogRE1BIENoYW5uZWwgMTQgWSBNb2RpZnkgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTRfQ1VSUl9ERVNDX1BUUgkJMHhGRkMwMURBMAkvKiBETUEgQ2hhbm5lbCAxNCBDdXJyZW50IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlciAqLworI2RlZmluZQlETUExNF9DVVJSX0FERFIJCQkweEZGQzAxREE0CS8qIERNQSBDaGFubmVsIDE0IEN1cnJlbnQgQWRkcmVzcyBSZWdpc3RlciAqLworI2RlZmluZQlETUExNF9JUlFfU1RBVFVTCQkweEZGQzAxREE4CS8qIERNQSBDaGFubmVsIDE0IEludGVycnVwdC9TdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTRfUEVSSVBIRVJBTF9NQVAJMHhGRkMwMURBQwkvKiBETUEgQ2hhbm5lbCAxNCBQZXJpcGhlcmFsIE1hcCBSZWdpc3RlciAqLworI2RlZmluZQlETUExNF9DVVJSX1hfQ09VTlQJCTB4RkZDMDFEQjAJLyogRE1BIENoYW5uZWwgMTQgQ3VycmVudCBYIENvdW50IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTE0X0NVUlJfWV9DT1VOVAkJMHhGRkMwMURCOAkvKiBETUEgQ2hhbm5lbCAxNCBDdXJyZW50IFkgQ291bnQgUmVnaXN0ZXIgKi8KKworI2RlZmluZQlETUExNV9ORVhUX0RFU0NfUFRSCQkweEZGQzAxREMwCS8qIERNQSBDaGFubmVsIDE1IE5leHQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTE1X1NUQVJUX0FERFIJCTB4RkZDMDFEQzQJLyogRE1BIENoYW5uZWwgMTUgU3RhcnQJQWRkcmVzcwlSZWdpc3RlciAqLworI2RlZmluZQlETUExNV9DT05GSUcJCQkweEZGQzAxREM4CS8qIERNQSBDaGFubmVsIDE1IENvbmZpZ3VyYXRpb24JUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTVfWF9DT1VOVAkJCTB4RkZDMDFERDAJLyogRE1BIENoYW5uZWwgMTUgWCBDb3VudCBSZWdpc3RlciAqLworI2RlZmluZQlETUExNV9YX01PRElGWQkJCTB4RkZDMDFERDQJLyogRE1BIENoYW5uZWwgMTUgWCBNb2RpZnkgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTVfWV9DT1VOVAkJCTB4RkZDMDFERDgJLyogRE1BIENoYW5uZWwgMTUgWSBDb3VudCBSZWdpc3RlciAqLworI2RlZmluZQlETUExNV9ZX01PRElGWQkJCTB4RkZDMDFEREMJLyogRE1BIENoYW5uZWwgMTUgWSBNb2RpZnkgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTVfQ1VSUl9ERVNDX1BUUgkJMHhGRkMwMURFMAkvKiBETUEgQ2hhbm5lbCAxNSBDdXJyZW50IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlciAqLworI2RlZmluZQlETUExNV9DVVJSX0FERFIJCQkweEZGQzAxREU0CS8qIERNQSBDaGFubmVsIDE1IEN1cnJlbnQgQWRkcmVzcyBSZWdpc3RlciAqLworI2RlZmluZQlETUExNV9JUlFfU1RBVFVTCQkweEZGQzAxREU4CS8qIERNQSBDaGFubmVsIDE1IEludGVycnVwdC9TdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTVfUEVSSVBIRVJBTF9NQVAJMHhGRkMwMURFQwkvKiBETUEgQ2hhbm5lbCAxNSBQZXJpcGhlcmFsIE1hcCBSZWdpc3RlciAqLworI2RlZmluZQlETUExNV9DVVJSX1hfQ09VTlQJCTB4RkZDMDFERjAJLyogRE1BIENoYW5uZWwgMTUgQ3VycmVudCBYIENvdW50IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTE1X0NVUlJfWV9DT1VOVAkJMHhGRkMwMURGOAkvKiBETUEgQ2hhbm5lbCAxNSBDdXJyZW50IFkgQ291bnQgUmVnaXN0ZXIgKi8KKworI2RlZmluZQlETUExNl9ORVhUX0RFU0NfUFRSCQkweEZGQzAxRTAwCS8qIERNQSBDaGFubmVsIDE2IE5leHQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTE2X1NUQVJUX0FERFIJCTB4RkZDMDFFMDQJLyogRE1BIENoYW5uZWwgMTYgU3RhcnQJQWRkcmVzcwlSZWdpc3RlciAqLworI2RlZmluZQlETUExNl9DT05GSUcJCQkweEZGQzAxRTA4CS8qIERNQSBDaGFubmVsIDE2IENvbmZpZ3VyYXRpb24JUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTZfWF9DT1VOVAkJCTB4RkZDMDFFMTAJLyogRE1BIENoYW5uZWwgMTYgWCBDb3VudCBSZWdpc3RlciAqLworI2RlZmluZQlETUExNl9YX01PRElGWQkJCTB4RkZDMDFFMTQJLyogRE1BIENoYW5uZWwgMTYgWCBNb2RpZnkgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTZfWV9DT1VOVAkJCTB4RkZDMDFFMTgJLyogRE1BIENoYW5uZWwgMTYgWSBDb3VudCBSZWdpc3RlciAqLworI2RlZmluZQlETUExNl9ZX01PRElGWQkJCTB4RkZDMDFFMUMJLyogRE1BIENoYW5uZWwgMTYgWSBNb2RpZnkgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTZfQ1VSUl9ERVNDX1BUUgkJMHhGRkMwMUUyMAkvKiBETUEgQ2hhbm5lbCAxNiBDdXJyZW50IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlciAqLworI2RlZmluZQlETUExNl9DVVJSX0FERFIJCQkweEZGQzAxRTI0CS8qIERNQSBDaGFubmVsIDE2IEN1cnJlbnQgQWRkcmVzcyBSZWdpc3RlciAqLworI2RlZmluZQlETUExNl9JUlFfU1RBVFVTCQkweEZGQzAxRTI4CS8qIERNQSBDaGFubmVsIDE2IEludGVycnVwdC9TdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTZfUEVSSVBIRVJBTF9NQVAJMHhGRkMwMUUyQwkvKiBETUEgQ2hhbm5lbCAxNiBQZXJpcGhlcmFsIE1hcCBSZWdpc3RlciAqLworI2RlZmluZQlETUExNl9DVVJSX1hfQ09VTlQJCTB4RkZDMDFFMzAJLyogRE1BIENoYW5uZWwgMTYgQ3VycmVudCBYIENvdW50IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTE2X0NVUlJfWV9DT1VOVAkJMHhGRkMwMUUzOAkvKiBETUEgQ2hhbm5lbCAxNiBDdXJyZW50IFkgQ291bnQgUmVnaXN0ZXIgKi8KKworI2RlZmluZQlETUExN19ORVhUX0RFU0NfUFRSCQkweEZGQzAxRTQwCS8qIERNQSBDaGFubmVsIDE3IE5leHQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTE3X1NUQVJUX0FERFIJCTB4RkZDMDFFNDQJLyogRE1BIENoYW5uZWwgMTcgU3RhcnQJQWRkcmVzcwlSZWdpc3RlciAqLworI2RlZmluZQlETUExN19DT05GSUcJCQkweEZGQzAxRTQ4CS8qIERNQSBDaGFubmVsIDE3IENvbmZpZ3VyYXRpb24JUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTdfWF9DT1VOVAkJCTB4RkZDMDFFNTAJLyogRE1BIENoYW5uZWwgMTcgWCBDb3VudCBSZWdpc3RlciAqLworI2RlZmluZQlETUExN19YX01PRElGWQkJCTB4RkZDMDFFNTQJLyogRE1BIENoYW5uZWwgMTcgWCBNb2RpZnkgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTdfWV9DT1VOVAkJCTB4RkZDMDFFNTgJLyogRE1BIENoYW5uZWwgMTcgWSBDb3VudCBSZWdpc3RlciAqLworI2RlZmluZQlETUExN19ZX01PRElGWQkJCTB4RkZDMDFFNUMJLyogRE1BIENoYW5uZWwgMTcgWSBNb2RpZnkgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTdfQ1VSUl9ERVNDX1BUUgkJMHhGRkMwMUU2MAkvKiBETUEgQ2hhbm5lbCAxNyBDdXJyZW50IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlciAqLworI2RlZmluZQlETUExN19DVVJSX0FERFIJCQkweEZGQzAxRTY0CS8qIERNQSBDaGFubmVsIDE3IEN1cnJlbnQgQWRkcmVzcyBSZWdpc3RlciAqLworI2RlZmluZQlETUExN19JUlFfU1RBVFVTCQkweEZGQzAxRTY4CS8qIERNQSBDaGFubmVsIDE3IEludGVycnVwdC9TdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTdfUEVSSVBIRVJBTF9NQVAJMHhGRkMwMUU2QwkvKiBETUEgQ2hhbm5lbCAxNyBQZXJpcGhlcmFsIE1hcCBSZWdpc3RlciAqLworI2RlZmluZQlETUExN19DVVJSX1hfQ09VTlQJCTB4RkZDMDFFNzAJLyogRE1BIENoYW5uZWwgMTcgQ3VycmVudCBYIENvdW50IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTE3X0NVUlJfWV9DT1VOVAkJMHhGRkMwMUU3OAkvKiBETUEgQ2hhbm5lbCAxNyBDdXJyZW50IFkgQ291bnQgUmVnaXN0ZXIgKi8KKworI2RlZmluZQlETUExOF9ORVhUX0RFU0NfUFRSCQkweEZGQzAxRTgwCS8qIERNQSBDaGFubmVsIDE4IE5leHQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTE4X1NUQVJUX0FERFIJCTB4RkZDMDFFODQJLyogRE1BIENoYW5uZWwgMTggU3RhcnQJQWRkcmVzcwlSZWdpc3RlciAqLworI2RlZmluZQlETUExOF9DT05GSUcJCQkweEZGQzAxRTg4CS8qIERNQSBDaGFubmVsIDE4IENvbmZpZ3VyYXRpb24JUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMThfWF9DT1VOVAkJCTB4RkZDMDFFOTAJLyogRE1BIENoYW5uZWwgMTggWCBDb3VudCBSZWdpc3RlciAqLworI2RlZmluZQlETUExOF9YX01PRElGWQkJCTB4RkZDMDFFOTQJLyogRE1BIENoYW5uZWwgMTggWCBNb2RpZnkgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMThfWV9DT1VOVAkJCTB4RkZDMDFFOTgJLyogRE1BIENoYW5uZWwgMTggWSBDb3VudCBSZWdpc3RlciAqLworI2RlZmluZQlETUExOF9ZX01PRElGWQkJCTB4RkZDMDFFOUMJLyogRE1BIENoYW5uZWwgMTggWSBNb2RpZnkgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMThfQ1VSUl9ERVNDX1BUUgkJMHhGRkMwMUVBMAkvKiBETUEgQ2hhbm5lbCAxOCBDdXJyZW50IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlciAqLworI2RlZmluZQlETUExOF9DVVJSX0FERFIJCQkweEZGQzAxRUE0CS8qIERNQSBDaGFubmVsIDE4IEN1cnJlbnQgQWRkcmVzcyBSZWdpc3RlciAqLworI2RlZmluZQlETUExOF9JUlFfU1RBVFVTCQkweEZGQzAxRUE4CS8qIERNQSBDaGFubmVsIDE4IEludGVycnVwdC9TdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMThfUEVSSVBIRVJBTF9NQVAJMHhGRkMwMUVBQwkvKiBETUEgQ2hhbm5lbCAxOCBQZXJpcGhlcmFsIE1hcCBSZWdpc3RlciAqLworI2RlZmluZQlETUExOF9DVVJSX1hfQ09VTlQJCTB4RkZDMDFFQjAJLyogRE1BIENoYW5uZWwgMTggQ3VycmVudCBYIENvdW50IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTE4X0NVUlJfWV9DT1VOVAkJMHhGRkMwMUVCOAkvKiBETUEgQ2hhbm5lbCAxOCBDdXJyZW50IFkgQ291bnQgUmVnaXN0ZXIgKi8KKworI2RlZmluZQlETUExOV9ORVhUX0RFU0NfUFRSCQkweEZGQzAxRUMwCS8qIERNQSBDaGFubmVsIDE5IE5leHQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTE5X1NUQVJUX0FERFIJCTB4RkZDMDFFQzQJLyogRE1BIENoYW5uZWwgMTkgU3RhcnQJQWRkcmVzcwlSZWdpc3RlciAqLworI2RlZmluZQlETUExOV9DT05GSUcJCQkweEZGQzAxRUM4CS8qIERNQSBDaGFubmVsIDE5IENvbmZpZ3VyYXRpb24JUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTlfWF9DT1VOVAkJCTB4RkZDMDFFRDAJLyogRE1BIENoYW5uZWwgMTkgWCBDb3VudCBSZWdpc3RlciAqLworI2RlZmluZQlETUExOV9YX01PRElGWQkJCTB4RkZDMDFFRDQJLyogRE1BIENoYW5uZWwgMTkgWCBNb2RpZnkgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTlfWV9DT1VOVAkJCTB4RkZDMDFFRDgJLyogRE1BIENoYW5uZWwgMTkgWSBDb3VudCBSZWdpc3RlciAqLworI2RlZmluZQlETUExOV9ZX01PRElGWQkJCTB4RkZDMDFFREMJLyogRE1BIENoYW5uZWwgMTkgWSBNb2RpZnkgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTlfQ1VSUl9ERVNDX1BUUgkJMHhGRkMwMUVFMAkvKiBETUEgQ2hhbm5lbCAxOSBDdXJyZW50IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlciAqLworI2RlZmluZQlETUExOV9DVVJSX0FERFIJCQkweEZGQzAxRUU0CS8qIERNQSBDaGFubmVsIDE5IEN1cnJlbnQgQWRkcmVzcyBSZWdpc3RlciAqLworI2RlZmluZQlETUExOV9JUlFfU1RBVFVTCQkweEZGQzAxRUU4CS8qIERNQSBDaGFubmVsIDE5IEludGVycnVwdC9TdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTlfUEVSSVBIRVJBTF9NQVAJMHhGRkMwMUVFQwkvKiBETUEgQ2hhbm5lbCAxOSBQZXJpcGhlcmFsIE1hcCBSZWdpc3RlciAqLworI2RlZmluZQlETUExOV9DVVJSX1hfQ09VTlQJCTB4RkZDMDFFRjAJLyogRE1BIENoYW5uZWwgMTkgQ3VycmVudCBYIENvdW50IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTE5X0NVUlJfWV9DT1VOVAkJMHhGRkMwMUVGOAkvKiBETUEgQ2hhbm5lbCAxOSBDdXJyZW50IFkgQ291bnQgUmVnaXN0ZXIgKi8KKworI2RlZmluZQlNRE1BX0QyX05FWFRfREVTQ19QVFIJMHhGRkMwMUYwMAkvKiBNZW1ETUExIFN0cmVhbSAwIERlc3RpbmF0aW9uCU5leHQgRGVzY3JpcHRvcglQb2ludGVyCVJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUFfRDJfU1RBUlRfQUREUgkJMHhGRkMwMUYwNAkvKiBNZW1ETUExIFN0cmVhbSAwIERlc3RpbmF0aW9uCVN0YXJ0IEFkZHJlc3MgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQV9EMl9DT05GSUcJCQkweEZGQzAxRjA4CS8qIE1lbURNQTEgU3RyZWFtIDAgRGVzdGluYXRpb24JQ29uZmlndXJhdGlvbiBSZWdpc3RlciAqLworI2RlZmluZQlNRE1BX0QyX1hfQ09VTlQJCTB4RkZDMDFGMTAJLyogTWVtRE1BMSBTdHJlYW0gMCBEZXN0aW5hdGlvbglYIENvdW50CVJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUFfRDJfWF9NT0RJRlkJCTB4RkZDMDFGMTQJLyogTWVtRE1BMSBTdHJlYW0gMCBEZXN0aW5hdGlvbglYIE1vZGlmeSBSZWdpc3RlciAqLworI2RlZmluZQlNRE1BX0QyX1lfQ09VTlQJCTB4RkZDMDFGMTgJLyogTWVtRE1BMSBTdHJlYW0gMCBEZXN0aW5hdGlvbglZIENvdW50CVJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUFfRDJfWV9NT0RJRlkJCTB4RkZDMDFGMUMJLyogTWVtRE1BMSBTdHJlYW0gMCBEZXN0aW5hdGlvbglZIE1vZGlmeSBSZWdpc3RlciAqLworI2RlZmluZQlNRE1BX0QyX0NVUlJfREVTQ19QVFIJMHhGRkMwMUYyMAkvKiBNZW1ETUExIFN0cmVhbSAwIERlc3RpbmF0aW9uCUN1cnJlbnQJRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUFfRDJfQ1VSUl9BRERSCQkweEZGQzAxRjI0CS8qIE1lbURNQTEgU3RyZWFtIDAgRGVzdGluYXRpb24JQ3VycmVudAlBZGRyZXNzCVJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUFfRDJfSVJRX1NUQVRVUwkJMHhGRkMwMUYyOAkvKiBNZW1ETUExIFN0cmVhbSAwIERlc3RpbmF0aW9uCUludGVycnVwdC9TdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQV9EMl9QRVJJUEhFUkFMX01BUAkweEZGQzAxRjJDCS8qIE1lbURNQTEgU3RyZWFtIDAgRGVzdGluYXRpb24JUGVyaXBoZXJhbCBNYXAgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQV9EMl9DVVJSX1hfQ09VTlQJMHhGRkMwMUYzMAkvKiBNZW1ETUExIFN0cmVhbSAwIERlc3RpbmF0aW9uCUN1cnJlbnQJWCBDb3VudAlSZWdpc3RlciAqLworI2RlZmluZQlNRE1BX0QyX0NVUlJfWV9DT1VOVAkweEZGQzAxRjM4CS8qIE1lbURNQTEgU3RyZWFtIDAgRGVzdGluYXRpb24JQ3VycmVudAlZIENvdW50CVJlZ2lzdGVyICovCisKKyNkZWZpbmUJTURNQV9TMl9ORVhUX0RFU0NfUFRSCTB4RkZDMDFGNDAJLyogTWVtRE1BMSBTdHJlYW0gMCBTb3VyY2UgTmV4dAlEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQV9TMl9TVEFSVF9BRERSCQkweEZGQzAxRjQ0CS8qIE1lbURNQTEgU3RyZWFtIDAgU291cmNlIFN0YXJ0IEFkZHJlc3MgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQV9TMl9DT05GSUcJCQkweEZGQzAxRjQ4CS8qIE1lbURNQTEgU3RyZWFtIDAgU291cmNlIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQV9TMl9YX0NPVU5UCQkweEZGQzAxRjUwCS8qIE1lbURNQTEgU3RyZWFtIDAgU291cmNlIFggQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQV9TMl9YX01PRElGWQkJMHhGRkMwMUY1NAkvKiBNZW1ETUExIFN0cmVhbSAwIFNvdXJjZSBYIE1vZGlmeSBSZWdpc3RlciAqLworI2RlZmluZQlNRE1BX1MyX1lfQ09VTlQJCTB4RkZDMDFGNTgJLyogTWVtRE1BMSBTdHJlYW0gMCBTb3VyY2UgWSBDb3VudCBSZWdpc3RlciAqLworI2RlZmluZQlNRE1BX1MyX1lfTU9ESUZZCQkweEZGQzAxRjVDCS8qIE1lbURNQTEgU3RyZWFtIDAgU291cmNlIFkgTW9kaWZ5IFJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUFfUzJfQ1VSUl9ERVNDX1BUUgkweEZGQzAxRjYwCS8qIE1lbURNQTEgU3RyZWFtIDAgU291cmNlIEN1cnJlbnQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUFfUzJfQ1VSUl9BRERSCQkweEZGQzAxRjY0CS8qIE1lbURNQTEgU3RyZWFtIDAgU291cmNlIEN1cnJlbnQgQWRkcmVzcyBSZWdpc3RlciAqLworI2RlZmluZQlNRE1BX1MyX0lSUV9TVEFUVVMJCTB4RkZDMDFGNjgJLyogTWVtRE1BMSBTdHJlYW0gMCBTb3VyY2UgSW50ZXJydXB0L1N0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZQlNRE1BX1MyX1BFUklQSEVSQUxfTUFQCTB4RkZDMDFGNkMJLyogTWVtRE1BMSBTdHJlYW0gMCBTb3VyY2UgUGVyaXBoZXJhbCBNYXAgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQV9TMl9DVVJSX1hfQ09VTlQJMHhGRkMwMUY3MAkvKiBNZW1ETUExIFN0cmVhbSAwIFNvdXJjZSBDdXJyZW50IFggQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQV9TMl9DVVJSX1lfQ09VTlQJMHhGRkMwMUY3OAkvKiBNZW1ETUExIFN0cmVhbSAwIFNvdXJjZSBDdXJyZW50IFkgQ291bnQgUmVnaXN0ZXIgKi8KKworI2RlZmluZQlNRE1BX0QzX05FWFRfREVTQ19QVFIJMHhGRkMwMUY4MAkvKiBNZW1ETUExIFN0cmVhbSAxIERlc3RpbmF0aW9uCU5leHQgRGVzY3JpcHRvcglQb2ludGVyCVJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUFfRDNfU1RBUlRfQUREUgkJMHhGRkMwMUY4NAkvKiBNZW1ETUExIFN0cmVhbSAxIERlc3RpbmF0aW9uCVN0YXJ0IEFkZHJlc3MgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQV9EM19DT05GSUcJCQkweEZGQzAxRjg4CS8qIE1lbURNQTEgU3RyZWFtIDEgRGVzdGluYXRpb24JQ29uZmlndXJhdGlvbiBSZWdpc3RlciAqLworI2RlZmluZQlNRE1BX0QzX1hfQ09VTlQJCTB4RkZDMDFGOTAJLyogTWVtRE1BMSBTdHJlYW0gMSBEZXN0aW5hdGlvbglYIENvdW50CVJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUFfRDNfWF9NT0RJRlkJCTB4RkZDMDFGOTQJLyogTWVtRE1BMSBTdHJlYW0gMSBEZXN0aW5hdGlvbglYIE1vZGlmeSBSZWdpc3RlciAqLworI2RlZmluZQlNRE1BX0QzX1lfQ09VTlQJCTB4RkZDMDFGOTgJLyogTWVtRE1BMSBTdHJlYW0gMSBEZXN0aW5hdGlvbglZIENvdW50CVJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUFfRDNfWV9NT0RJRlkJCTB4RkZDMDFGOUMJLyogTWVtRE1BMSBTdHJlYW0gMSBEZXN0aW5hdGlvbglZIE1vZGlmeSBSZWdpc3RlciAqLworI2RlZmluZQlNRE1BX0QzX0NVUlJfREVTQ19QVFIJMHhGRkMwMUZBMAkvKiBNZW1ETUExIFN0cmVhbSAxIERlc3RpbmF0aW9uCUN1cnJlbnQJRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUFfRDNfQ1VSUl9BRERSCQkweEZGQzAxRkE0CS8qIE1lbURNQTEgU3RyZWFtIDEgRGVzdGluYXRpb24JQ3VycmVudAlBZGRyZXNzCVJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUFfRDNfSVJRX1NUQVRVUwkJMHhGRkMwMUZBOAkvKiBNZW1ETUExIFN0cmVhbSAxIERlc3RpbmF0aW9uCUludGVycnVwdC9TdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQV9EM19QRVJJUEhFUkFMX01BUAkweEZGQzAxRkFDCS8qIE1lbURNQTEgU3RyZWFtIDEgRGVzdGluYXRpb24JUGVyaXBoZXJhbCBNYXAgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQV9EM19DVVJSX1hfQ09VTlQJMHhGRkMwMUZCMAkvKiBNZW1ETUExIFN0cmVhbSAxIERlc3RpbmF0aW9uCUN1cnJlbnQJWCBDb3VudAlSZWdpc3RlciAqLworI2RlZmluZQlNRE1BX0QzX0NVUlJfWV9DT1VOVAkweEZGQzAxRkI4CS8qIE1lbURNQTEgU3RyZWFtIDEgRGVzdGluYXRpb24JQ3VycmVudAlZIENvdW50CVJlZ2lzdGVyICovCisKKyNkZWZpbmUJTURNQV9TM19ORVhUX0RFU0NfUFRSCTB4RkZDMDFGQzAJLyogTWVtRE1BMSBTdHJlYW0gMSBTb3VyY2UgTmV4dAlEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQV9TM19TVEFSVF9BRERSCQkweEZGQzAxRkM0CS8qIE1lbURNQTEgU3RyZWFtIDEgU291cmNlIFN0YXJ0IEFkZHJlc3MgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQV9TM19DT05GSUcJCQkweEZGQzAxRkM4CS8qIE1lbURNQTEgU3RyZWFtIDEgU291cmNlIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQV9TM19YX0NPVU5UCQkweEZGQzAxRkQwCS8qIE1lbURNQTEgU3RyZWFtIDEgU291cmNlIFggQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQV9TM19YX01PRElGWQkJMHhGRkMwMUZENAkvKiBNZW1ETUExIFN0cmVhbSAxIFNvdXJjZSBYIE1vZGlmeSBSZWdpc3RlciAqLworI2RlZmluZQlNRE1BX1MzX1lfQ09VTlQJCTB4RkZDMDFGRDgJLyogTWVtRE1BMSBTdHJlYW0gMSBTb3VyY2UgWSBDb3VudCBSZWdpc3RlciAqLworI2RlZmluZQlNRE1BX1MzX1lfTU9ESUZZCQkweEZGQzAxRkRDCS8qIE1lbURNQTEgU3RyZWFtIDEgU291cmNlIFkgTW9kaWZ5IFJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUFfUzNfQ1VSUl9ERVNDX1BUUgkweEZGQzAxRkUwCS8qIE1lbURNQTEgU3RyZWFtIDEgU291cmNlIEN1cnJlbnQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUFfUzNfQ1VSUl9BRERSCQkweEZGQzAxRkU0CS8qIE1lbURNQTEgU3RyZWFtIDEgU291cmNlIEN1cnJlbnQgQWRkcmVzcyBSZWdpc3RlciAqLworI2RlZmluZQlNRE1BX1MzX0lSUV9TVEFUVVMJCTB4RkZDMDFGRTgJLyogTWVtRE1BMSBTdHJlYW0gMSBTb3VyY2UgSW50ZXJydXB0L1N0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZQlNRE1BX1MzX1BFUklQSEVSQUxfTUFQCTB4RkZDMDFGRUMJLyogTWVtRE1BMSBTdHJlYW0gMSBTb3VyY2UgUGVyaXBoZXJhbCBNYXAgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQV9TM19DVVJSX1hfQ09VTlQJMHhGRkMwMUZGMAkvKiBNZW1ETUExIFN0cmVhbSAxIFNvdXJjZSBDdXJyZW50IFggQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQV9TM19DVVJSX1lfQ09VTlQJMHhGRkMwMUZGOAkvKiBNZW1ETUExIFN0cmVhbSAxIFNvdXJjZSBDdXJyZW50IFkgQ291bnQgUmVnaXN0ZXIgKi8KKworCisvKiBVQVJUMSBDb250cm9sbGVyCQkoMHhGRkMwMjAwMCAtIDB4RkZDMDIwRkYpCSAqLworI2RlZmluZQlVQVJUMV9USFIJCQkweEZGQzAyMDAwCS8qIFRyYW5zbWl0IEhvbGRpbmcgcmVnaXN0ZXIgKi8KKyNkZWZpbmUJVUFSVDFfUkJSCQkJMHhGRkMwMjAwMAkvKiBSZWNlaXZlIEJ1ZmZlciByZWdpc3RlciAqLworI2RlZmluZQlVQVJUMV9ETEwJCQkweEZGQzAyMDAwCS8qIERpdmlzb3IgTGF0Y2ggKExvdy1CeXRlKSAqLworI2RlZmluZQlVQVJUMV9JRVIJCQkweEZGQzAyMDA0CS8qIEludGVycnVwdCBFbmFibGUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJVUFSVDFfRExICQkJMHhGRkMwMjAwNAkvKiBEaXZpc29yIExhdGNoIChIaWdoLUJ5dGUpICovCisjZGVmaW5lCVVBUlQxX0lJUgkJCTB4RkZDMDIwMDgJLyogSW50ZXJydXB0IElkZW50aWZpY2F0aW9uIFJlZ2lzdGVyICovCisjZGVmaW5lCVVBUlQxX0xDUgkJCTB4RkZDMDIwMEMJLyogTGluZQlDb250cm9sCVJlZ2lzdGVyICovCisjZGVmaW5lCVVBUlQxX01DUgkJCTB4RkZDMDIwMTAJLyogTW9kZW0gQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZQlVQVJUMV9MU1IJCQkweEZGQzAyMDE0CS8qIExpbmUJU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lCVVBUlQxX1NDUgkJCTB4RkZDMDIwMUMJLyogU0NSIFNjcmF0Y2ggUmVnaXN0ZXIgKi8KKyNkZWZpbmUJVUFSVDFfR0NUTAkJCTB4RkZDMDIwMjQJLyogR2xvYmFsIENvbnRyb2wgUmVnaXN0ZXIgKi8KKworCisvKiBVQVJUMiBDb250cm9sbGVyCQkoMHhGRkMwMjEwMCAtIDB4RkZDMDIxRkYpCSAqLworI2RlZmluZQlVQVJUMl9USFIJCQkweEZGQzAyMTAwCS8qIFRyYW5zbWl0IEhvbGRpbmcgcmVnaXN0ZXIgKi8KKyNkZWZpbmUJVUFSVDJfUkJSCQkJMHhGRkMwMjEwMAkvKiBSZWNlaXZlIEJ1ZmZlciByZWdpc3RlciAqLworI2RlZmluZQlVQVJUMl9ETEwJCQkweEZGQzAyMTAwCS8qIERpdmlzb3IgTGF0Y2ggKExvdy1CeXRlKSAqLworI2RlZmluZQlVQVJUMl9JRVIJCQkweEZGQzAyMTA0CS8qIEludGVycnVwdCBFbmFibGUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJVUFSVDJfRExICQkJMHhGRkMwMjEwNAkvKiBEaXZpc29yIExhdGNoIChIaWdoLUJ5dGUpICovCisjZGVmaW5lCVVBUlQyX0lJUgkJCTB4RkZDMDIxMDgJLyogSW50ZXJydXB0IElkZW50aWZpY2F0aW9uIFJlZ2lzdGVyICovCisjZGVmaW5lCVVBUlQyX0xDUgkJCTB4RkZDMDIxMEMJLyogTGluZQlDb250cm9sCVJlZ2lzdGVyICovCisjZGVmaW5lCVVBUlQyX01DUgkJCTB4RkZDMDIxMTAJLyogTW9kZW0gQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZQlVQVJUMl9MU1IJCQkweEZGQzAyMTE0CS8qIExpbmUJU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lCVVBUlQyX1NDUgkJCTB4RkZDMDIxMUMJLyogU0NSIFNjcmF0Y2ggUmVnaXN0ZXIgKi8KKyNkZWZpbmUJVUFSVDJfR0NUTAkJCTB4RkZDMDIxMjQJLyogR2xvYmFsIENvbnRyb2wgUmVnaXN0ZXIgKi8KKworCisvKiBUd28tV2lyZSBJbnRlcmZhY2UgMQkoMHhGRkMwMjIwMCAtIDB4RkZDMDIyRkYpCQkJICovCisjZGVmaW5lCVRXSTFfQ0xLRElWCQkJMHhGRkMwMjIwMAkvKiBTZXJpYWwgQ2xvY2sJRGl2aWRlcglSZWdpc3RlciAqLworI2RlZmluZQlUV0kxX0NPTlRST0wJCTB4RkZDMDIyMDQJLyogVFdJMQlNYXN0ZXIgSW50ZXJuYWwJVGltZSBSZWZlcmVuY2UgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJVFdJMV9TTEFWRV9DVEwJCTB4RkZDMDIyMDgJLyogU2xhdmUgTW9kZSBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lCVRXSTFfU0xBVkVfU1RBVAkJMHhGRkMwMjIwQwkvKiBTbGF2ZSBNb2RlIFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZQlUV0kxX1NMQVZFX0FERFIJCTB4RkZDMDIyMTAJLyogU2xhdmUgTW9kZSBBZGRyZXNzIFJlZ2lzdGVyICovCisjZGVmaW5lCVRXSTFfTUFTVEVSX0NUTAkweEZGQzAyMjE0CS8qIE1hc3RlciBNb2RlIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJVFdJMV9NQVNURVJfU1RBVAkweEZGQzAyMjE4CS8qIE1hc3RlciBNb2RlIFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZQlUV0kxX01BU1RFUl9BRERSCTB4RkZDMDIyMUMJLyogTWFzdGVyIE1vZGUgQWRkcmVzcyBSZWdpc3RlciAqLworI2RlZmluZQlUV0kxX0lOVF9TVEFUCQkweEZGQzAyMjIwCS8qIFRXSTEJTWFzdGVyIEludGVycnVwdCBSZWdpc3RlciAqLworI2RlZmluZQlUV0kxX0lOVF9NQVNLCQkweEZGQzAyMjI0CS8qIFRXSTEJTWFzdGVyIEludGVycnVwdCBNYXNrIFJlZ2lzdGVyICovCisjZGVmaW5lCVRXSTFfRklGT19DVEwJCTB4RkZDMDIyMjgJLyogRklGTwlDb250cm9sCVJlZ2lzdGVyICovCisjZGVmaW5lCVRXSTFfRklGT19TVEFUCQkweEZGQzAyMjJDCS8qIEZJRk8JU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lCVRXSTFfWE1UX0RBVEE4CQkweEZGQzAyMjgwCS8qIEZJRk8JVHJhbnNtaXQgRGF0YSBTaW5nbGUgQnl0ZSBSZWdpc3RlciAqLworI2RlZmluZQlUV0kxX1hNVF9EQVRBMTYJCTB4RkZDMDIyODQJLyogRklGTwlUcmFuc21pdCBEYXRhIERvdWJsZSBCeXRlIFJlZ2lzdGVyICovCisjZGVmaW5lCVRXSTFfUkNWX0RBVEE4CQkweEZGQzAyMjg4CS8qIEZJRk8JUmVjZWl2ZQlEYXRhIFNpbmdsZSBCeXRlIFJlZ2lzdGVyICovCisjZGVmaW5lCVRXSTFfUkNWX0RBVEExNgkJMHhGRkMwMjI4QwkvKiBGSUZPCVJlY2VpdmUJRGF0YSBEb3VibGUgQnl0ZSBSZWdpc3RlciAqLworI2RlZmluZSBUV0kxX1JFR0JBU0UJCVRXSTFfQ0xLRElWCisKKworLyogdGhlIGZvbGxvd2luZyBhcmUgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5ICovCisjZGVmaW5lCVRXSTFfUFJFU0NBTEUJICBUV0kxX0NPTlRST0wKKyNkZWZpbmUJVFdJMV9JTlRfU1JDCSAgVFdJMV9JTlRfU1RBVAorI2RlZmluZQlUV0kxX0lOVF9FTkFCTEUJICBUV0kxX0lOVF9NQVNLCisKKworLyogU1BJMQlDb250cm9sbGVyCQkoMHhGRkMwMjMwMCAtIDB4RkZDMDIzRkYpCSAqLworI2RlZmluZQlTUEkxX0NUTAkJCTB4RkZDMDIzMDAgIC8qIFNQSTEgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZQlTUEkxX0ZMRwkJCTB4RkZDMDIzMDQgIC8qIFNQSTEgRmxhZyByZWdpc3RlciAqLworI2RlZmluZQlTUEkxX1NUQVQJCQkweEZGQzAyMzA4ICAvKiBTUEkxIFN0YXR1cyByZWdpc3RlciAqLworI2RlZmluZQlTUEkxX1REQlIJCQkweEZGQzAyMzBDICAvKiBTUEkxIFRyYW5zbWl0IERhdGEgQnVmZmVyIFJlZ2lzdGVyICovCisjZGVmaW5lCVNQSTFfUkRCUgkJCTB4RkZDMDIzMTAgIC8qIFNQSTEgUmVjZWl2ZSBEYXRhIEJ1ZmZlcglSZWdpc3RlciAqLworI2RlZmluZQlTUEkxX0JBVUQJCQkweEZGQzAyMzE0ICAvKiBTUEkxIEJhdWQgcmF0ZSBSZWdpc3RlciAqLworI2RlZmluZQlTUEkxX1NIQURPVwkJCTB4RkZDMDIzMTggIC8qIFNQSTFfUkRCUiBTaGFkb3cJUmVnaXN0ZXIgKi8KKyNkZWZpbmUgU1BJMV9SRUdCQVNFCQkJU1BJMV9DVEwKKworLyogU1BJMglDb250cm9sbGVyCQkoMHhGRkMwMjQwMCAtIDB4RkZDMDI0RkYpCSAqLworI2RlZmluZQlTUEkyX0NUTAkJCTB4RkZDMDI0MDAgIC8qIFNQSTIgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZQlTUEkyX0ZMRwkJCTB4RkZDMDI0MDQgIC8qIFNQSTIgRmxhZyByZWdpc3RlciAqLworI2RlZmluZQlTUEkyX1NUQVQJCQkweEZGQzAyNDA4ICAvKiBTUEkyIFN0YXR1cyByZWdpc3RlciAqLworI2RlZmluZQlTUEkyX1REQlIJCQkweEZGQzAyNDBDICAvKiBTUEkyIFRyYW5zbWl0IERhdGEgQnVmZmVyIFJlZ2lzdGVyICovCisjZGVmaW5lCVNQSTJfUkRCUgkJCTB4RkZDMDI0MTAgIC8qIFNQSTIgUmVjZWl2ZSBEYXRhIEJ1ZmZlcglSZWdpc3RlciAqLworI2RlZmluZQlTUEkyX0JBVUQJCQkweEZGQzAyNDE0ICAvKiBTUEkyIEJhdWQgcmF0ZSBSZWdpc3RlciAqLworI2RlZmluZQlTUEkyX1NIQURPVwkJCTB4RkZDMDI0MTggIC8qIFNQSTJfUkRCUiBTaGFkb3cJUmVnaXN0ZXIgKi8KKyNkZWZpbmUgU1BJMl9SRUdCQVNFCQkJU1BJMl9DVEwKKworLyogU1BPUlQyIENvbnRyb2xsZXIJCSgweEZGQzAyNTAwIC0gMHhGRkMwMjVGRikJCQkgKi8KKyNkZWZpbmUJU1BPUlQyX1RDUjEJCQkweEZGQzAyNTAwCS8qIFNQT1JUMiBUcmFuc21pdCBDb25maWd1cmF0aW9uIDEgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJU1BPUlQyX1RDUjIJCQkweEZGQzAyNTA0CS8qIFNQT1JUMiBUcmFuc21pdCBDb25maWd1cmF0aW9uIDIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJU1BPUlQyX1RDTEtESVYJCTB4RkZDMDI1MDgJLyogU1BPUlQyIFRyYW5zbWl0IENsb2NrIERpdmlkZXIgKi8KKyNkZWZpbmUJU1BPUlQyX1RGU0RJVgkJMHhGRkMwMjUwQwkvKiBTUE9SVDIgVHJhbnNtaXQgRnJhbWUgU3luYyBEaXZpZGVyICovCisjZGVmaW5lCVNQT1JUMl9UWAkJCTB4RkZDMDI1MTAJLyogU1BPUlQyIFRYIERhdGEgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJU1BPUlQyX1JYCQkJMHhGRkMwMjUxOAkvKiBTUE9SVDIgUlggRGF0YSBSZWdpc3RlciAqLworI2RlZmluZQlTUE9SVDJfUkNSMQkJCTB4RkZDMDI1MjAJLyogU1BPUlQyIFRyYW5zbWl0IENvbmZpZ3VyYXRpb24gMSBSZWdpc3RlciAqLworI2RlZmluZQlTUE9SVDJfUkNSMgkJCTB4RkZDMDI1MjQJLyogU1BPUlQyIFRyYW5zbWl0IENvbmZpZ3VyYXRpb24gMiBSZWdpc3RlciAqLworI2RlZmluZQlTUE9SVDJfUkNMS0RJVgkJMHhGRkMwMjUyOAkvKiBTUE9SVDIgUmVjZWl2ZSBDbG9jawlEaXZpZGVyICovCisjZGVmaW5lCVNQT1JUMl9SRlNESVYJCTB4RkZDMDI1MkMJLyogU1BPUlQyIFJlY2VpdmUgRnJhbWUJU3luYyBEaXZpZGVyICovCisjZGVmaW5lCVNQT1JUMl9TVEFUCQkJMHhGRkMwMjUzMAkvKiBTUE9SVDIgU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lCVNQT1JUMl9DSE5MCQkJMHhGRkMwMjUzNAkvKiBTUE9SVDIgQ3VycmVudCBDaGFubmVsIFJlZ2lzdGVyICovCisjZGVmaW5lCVNQT1JUMl9NQ01DMQkJMHhGRkMwMjUzOAkvKiBTUE9SVDIgTXVsdGktQ2hhbm5lbAlDb25maWd1cmF0aW9uIFJlZ2lzdGVyIDEgKi8KKyNkZWZpbmUJU1BPUlQyX01DTUMyCQkweEZGQzAyNTNDCS8qIFNQT1JUMiBNdWx0aS1DaGFubmVsCUNvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgMiAqLworI2RlZmluZQlTUE9SVDJfTVRDUzAJCTB4RkZDMDI1NDAJLyogU1BPUlQyIE11bHRpLUNoYW5uZWwJVHJhbnNtaXQgU2VsZWN0CVJlZ2lzdGVyIDAgKi8KKyNkZWZpbmUJU1BPUlQyX01UQ1MxCQkweEZGQzAyNTQ0CS8qIFNQT1JUMiBNdWx0aS1DaGFubmVsCVRyYW5zbWl0IFNlbGVjdAlSZWdpc3RlciAxICovCisjZGVmaW5lCVNQT1JUMl9NVENTMgkJMHhGRkMwMjU0OAkvKiBTUE9SVDIgTXVsdGktQ2hhbm5lbAlUcmFuc21pdCBTZWxlY3QJUmVnaXN0ZXIgMiAqLworI2RlZmluZQlTUE9SVDJfTVRDUzMJCTB4RkZDMDI1NEMJLyogU1BPUlQyIE11bHRpLUNoYW5uZWwJVHJhbnNtaXQgU2VsZWN0CVJlZ2lzdGVyIDMgKi8KKyNkZWZpbmUJU1BPUlQyX01SQ1MwCQkweEZGQzAyNTUwCS8qIFNQT1JUMiBNdWx0aS1DaGFubmVsCVJlY2VpdmUJU2VsZWN0IFJlZ2lzdGVyCTAgKi8KKyNkZWZpbmUJU1BPUlQyX01SQ1MxCQkweEZGQzAyNTU0CS8qIFNQT1JUMiBNdWx0aS1DaGFubmVsCVJlY2VpdmUJU2VsZWN0IFJlZ2lzdGVyCTEgKi8KKyNkZWZpbmUJU1BPUlQyX01SQ1MyCQkweEZGQzAyNTU4CS8qIFNQT1JUMiBNdWx0aS1DaGFubmVsCVJlY2VpdmUJU2VsZWN0IFJlZ2lzdGVyCTIgKi8KKyNkZWZpbmUJU1BPUlQyX01SQ1MzCQkweEZGQzAyNTVDCS8qIFNQT1JUMiBNdWx0aS1DaGFubmVsCVJlY2VpdmUJU2VsZWN0IFJlZ2lzdGVyCTMgKi8KKworCisvKiBTUE9SVDMgQ29udHJvbGxlcgkJKDB4RkZDMDI2MDAgLSAweEZGQzAyNkZGKQkJCSAqLworI2RlZmluZQlTUE9SVDNfVENSMQkJCTB4RkZDMDI2MDAJLyogU1BPUlQzIFRyYW5zbWl0IENvbmZpZ3VyYXRpb24gMSBSZWdpc3RlciAqLworI2RlZmluZQlTUE9SVDNfVENSMgkJCTB4RkZDMDI2MDQJLyogU1BPUlQzIFRyYW5zbWl0IENvbmZpZ3VyYXRpb24gMiBSZWdpc3RlciAqLworI2RlZmluZQlTUE9SVDNfVENMS0RJVgkJMHhGRkMwMjYwOAkvKiBTUE9SVDMgVHJhbnNtaXQgQ2xvY2sgRGl2aWRlciAqLworI2RlZmluZQlTUE9SVDNfVEZTRElWCQkweEZGQzAyNjBDCS8qIFNQT1JUMyBUcmFuc21pdCBGcmFtZSBTeW5jIERpdmlkZXIgKi8KKyNkZWZpbmUJU1BPUlQzX1RYCQkJMHhGRkMwMjYxMAkvKiBTUE9SVDMgVFggRGF0YSBSZWdpc3RlciAqLworI2RlZmluZQlTUE9SVDNfUlgJCQkweEZGQzAyNjE4CS8qIFNQT1JUMyBSWCBEYXRhIFJlZ2lzdGVyICovCisjZGVmaW5lCVNQT1JUM19SQ1IxCQkJMHhGRkMwMjYyMAkvKiBTUE9SVDMgVHJhbnNtaXQgQ29uZmlndXJhdGlvbiAxIFJlZ2lzdGVyICovCisjZGVmaW5lCVNQT1JUM19SQ1IyCQkJMHhGRkMwMjYyNAkvKiBTUE9SVDMgVHJhbnNtaXQgQ29uZmlndXJhdGlvbiAyIFJlZ2lzdGVyICovCisjZGVmaW5lCVNQT1JUM19SQ0xLRElWCQkweEZGQzAyNjI4CS8qIFNQT1JUMyBSZWNlaXZlIENsb2NrCURpdmlkZXIgKi8KKyNkZWZpbmUJU1BPUlQzX1JGU0RJVgkJMHhGRkMwMjYyQwkvKiBTUE9SVDMgUmVjZWl2ZSBGcmFtZQlTeW5jIERpdmlkZXIgKi8KKyNkZWZpbmUJU1BPUlQzX1NUQVQJCQkweEZGQzAyNjMwCS8qIFNQT1JUMyBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJU1BPUlQzX0NITkwJCQkweEZGQzAyNjM0CS8qIFNQT1JUMyBDdXJyZW50IENoYW5uZWwgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJU1BPUlQzX01DTUMxCQkweEZGQzAyNjM4CS8qIFNQT1JUMyBNdWx0aS1DaGFubmVsCUNvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgMSAqLworI2RlZmluZQlTUE9SVDNfTUNNQzIJCTB4RkZDMDI2M0MJLyogU1BPUlQzIE11bHRpLUNoYW5uZWwJQ29uZmlndXJhdGlvbiBSZWdpc3RlciAyICovCisjZGVmaW5lCVNQT1JUM19NVENTMAkJMHhGRkMwMjY0MAkvKiBTUE9SVDMgTXVsdGktQ2hhbm5lbAlUcmFuc21pdCBTZWxlY3QJUmVnaXN0ZXIgMCAqLworI2RlZmluZQlTUE9SVDNfTVRDUzEJCTB4RkZDMDI2NDQJLyogU1BPUlQzIE11bHRpLUNoYW5uZWwJVHJhbnNtaXQgU2VsZWN0CVJlZ2lzdGVyIDEgKi8KKyNkZWZpbmUJU1BPUlQzX01UQ1MyCQkweEZGQzAyNjQ4CS8qIFNQT1JUMyBNdWx0aS1DaGFubmVsCVRyYW5zbWl0IFNlbGVjdAlSZWdpc3RlciAyICovCisjZGVmaW5lCVNQT1JUM19NVENTMwkJMHhGRkMwMjY0QwkvKiBTUE9SVDMgTXVsdGktQ2hhbm5lbAlUcmFuc21pdCBTZWxlY3QJUmVnaXN0ZXIgMyAqLworI2RlZmluZQlTUE9SVDNfTVJDUzAJCTB4RkZDMDI2NTAJLyogU1BPUlQzIE11bHRpLUNoYW5uZWwJUmVjZWl2ZQlTZWxlY3QgUmVnaXN0ZXIJMCAqLworI2RlZmluZQlTUE9SVDNfTVJDUzEJCTB4RkZDMDI2NTQJLyogU1BPUlQzIE11bHRpLUNoYW5uZWwJUmVjZWl2ZQlTZWxlY3QgUmVnaXN0ZXIJMSAqLworI2RlZmluZQlTUE9SVDNfTVJDUzIJCTB4RkZDMDI2NTgJLyogU1BPUlQzIE11bHRpLUNoYW5uZWwJUmVjZWl2ZQlTZWxlY3QgUmVnaXN0ZXIJMiAqLworI2RlZmluZQlTUE9SVDNfTVJDUzMJCTB4RkZDMDI2NUMJLyogU1BPUlQzIE11bHRpLUNoYW5uZWwJUmVjZWl2ZQlTZWxlY3QgUmVnaXN0ZXIJMyAqLworCisKKy8qIENBTiBDb250cm9sbGVyCQkoMHhGRkMwMkEwMCAtIDB4RkZDMDJGRkYpCQkJCSAqLworLyogRm9yIE1haWxib3hlcyAwLTE1CQkJCQkJCQkJCQkgKi8KKyNkZWZpbmUJQ0FOX01DMQkJCQkweEZGQzAyQTAwCS8qIE1haWxib3ggY29uZmlnIHJlZyAxCSAqLworI2RlZmluZQlDQU5fTUQxCQkJCTB4RkZDMDJBMDQJLyogTWFpbGJveCBkaXJlY3Rpb24gcmVnIDEgKi8KKyNkZWZpbmUJQ0FOX1RSUzEJCQkweEZGQzAyQTA4CS8qIFRyYW5zbWl0IFJlcXVlc3QgU2V0CXJlZyAxICovCisjZGVmaW5lCUNBTl9UUlIxCQkJMHhGRkMwMkEwQwkvKiBUcmFuc21pdCBSZXF1ZXN0IFJlc2V0IHJlZyAxICovCisjZGVmaW5lCUNBTl9UQTEJCQkJMHhGRkMwMkExMAkvKiBUcmFuc21pdCBBY2tub3dsZWRnZQlyZWcgMSAqLworI2RlZmluZQlDQU5fQUExCQkJCTB4RkZDMDJBMTQJLyogVHJhbnNtaXQgQWJvcnQgQWNrbm93bGVkZ2UgcmVnIDEgKi8KKyNkZWZpbmUJQ0FOX1JNUDEJCQkweEZGQzAyQTE4CS8qIFJlY2VpdmUgTWVzc2FnZSBQZW5kaW5nIHJlZyAxICovCisjZGVmaW5lCUNBTl9STUwxCQkJMHhGRkMwMkExQwkvKiBSZWNlaXZlIE1lc3NhZ2UgTG9zdAlyZWcgMSAqLworI2RlZmluZQlDQU5fTUJUSUYxCQkJMHhGRkMwMkEyMAkvKiBNYWlsYm94IFRyYW5zbWl0IEludGVycnVwdCBGbGFnIHJlZyAxICovCisjZGVmaW5lCUNBTl9NQlJJRjEJCQkweEZGQzAyQTI0CS8qIE1haWxib3ggUmVjZWl2ZSAgSW50ZXJydXB0IEZsYWcgcmVnIDEgKi8KKyNkZWZpbmUJQ0FOX01CSU0xCQkJMHhGRkMwMkEyOAkvKiBNYWlsYm94IEludGVycnVwdCBNYXNrIHJlZyAxICovCisjZGVmaW5lCUNBTl9SRkgxCQkJMHhGRkMwMkEyQwkvKiBSZW1vdGUgRnJhbWUJSGFuZGxpbmcgcmVnIDEgKi8KKyNkZWZpbmUJQ0FOX09QU1MxCQkJMHhGRkMwMkEzMAkvKiBPdmVyd3JpdGUgUHJvdGVjdGlvbglTaW5nbGUgU2hvdCBYbWlzc2lvbiByZWcgMSAqLworCisvKiBGb3IgTWFpbGJveGVzIDE2LTMxCQkJCQkJCQkJCQkgKi8KKyNkZWZpbmUJQ0FOX01DMgkJCQkweEZGQzAyQTQwCS8qIE1haWxib3ggY29uZmlnIHJlZyAyCSAqLworI2RlZmluZQlDQU5fTUQyCQkJCTB4RkZDMDJBNDQJLyogTWFpbGJveCBkaXJlY3Rpb24gcmVnIDIgKi8KKyNkZWZpbmUJQ0FOX1RSUzIJCQkweEZGQzAyQTQ4CS8qIFRyYW5zbWl0IFJlcXVlc3QgU2V0CXJlZyAyICovCisjZGVmaW5lCUNBTl9UUlIyCQkJMHhGRkMwMkE0QwkvKiBUcmFuc21pdCBSZXF1ZXN0IFJlc2V0IHJlZyAyICovCisjZGVmaW5lCUNBTl9UQTIJCQkJMHhGRkMwMkE1MAkvKiBUcmFuc21pdCBBY2tub3dsZWRnZQlyZWcgMiAqLworI2RlZmluZQlDQU5fQUEyCQkJCTB4RkZDMDJBNTQJLyogVHJhbnNtaXQgQWJvcnQgQWNrbm93bGVkZ2UgcmVnIDIgKi8KKyNkZWZpbmUJQ0FOX1JNUDIJCQkweEZGQzAyQTU4CS8qIFJlY2VpdmUgTWVzc2FnZSBQZW5kaW5nIHJlZyAyICovCisjZGVmaW5lCUNBTl9STUwyCQkJMHhGRkMwMkE1QwkvKiBSZWNlaXZlIE1lc3NhZ2UgTG9zdAlyZWcgMiAqLworI2RlZmluZQlDQU5fTUJUSUYyCQkJMHhGRkMwMkE2MAkvKiBNYWlsYm94IFRyYW5zbWl0IEludGVycnVwdCBGbGFnIHJlZyAyICovCisjZGVmaW5lCUNBTl9NQlJJRjIJCQkweEZGQzAyQTY0CS8qIE1haWxib3ggUmVjZWl2ZSAgSW50ZXJydXB0IEZsYWcgcmVnIDIgKi8KKyNkZWZpbmUJQ0FOX01CSU0yCQkJMHhGRkMwMkE2OAkvKiBNYWlsYm94IEludGVycnVwdCBNYXNrIHJlZyAyICovCisjZGVmaW5lCUNBTl9SRkgyCQkJMHhGRkMwMkE2QwkvKiBSZW1vdGUgRnJhbWUJSGFuZGxpbmcgcmVnIDIgKi8KKyNkZWZpbmUJQ0FOX09QU1MyCQkJMHhGRkMwMkE3MAkvKiBPdmVyd3JpdGUgUHJvdGVjdGlvbglTaW5nbGUgU2hvdCBYbWlzc2lvbiByZWcgMiAqLworCisjZGVmaW5lCUNBTl9DTE9DSwkJCTB4RkZDMDJBODAJLyogQml0IFRpbWluZyBDb25maWd1cmF0aW9uIHJlZ2lzdGVyIDAgKi8KKyNkZWZpbmUJQ0FOX1RJTUlORwkJCTB4RkZDMDJBODQJLyogQml0IFRpbWluZyBDb25maWd1cmF0aW9uIHJlZ2lzdGVyIDEgKi8KKworI2RlZmluZQlDQU5fREVCVUcJCQkweEZGQzAyQTg4CS8qIERlYnVnIFJlZ2lzdGVyCQkgKi8KKy8qIHRoZSBmb2xsb3dpbmcgaXMgZm9yCWJhY2t3YXJkcyBjb21wYXRpYmlsaXR5ICovCisjZGVmaW5lCUNBTl9DTkYJCSBDQU5fREVCVUcKKworI2RlZmluZQlDQU5fU1RBVFVTCQkJMHhGRkMwMkE4QwkvKiBHbG9iYWwgU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9DRUMJCQkJMHhGRkMwMkE5MAkvKiBFcnJvciBDb3VudGVyIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9HSVMJCQkJMHhGRkMwMkE5NAkvKiBHbG9iYWwgSW50ZXJydXB0IFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fR0lNCQkJCTB4RkZDMDJBOTgJLyogR2xvYmFsIEludGVycnVwdCBNYXNrIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9HSUYJCQkJMHhGRkMwMkE5QwkvKiBHbG9iYWwgSW50ZXJydXB0IEZsYWcgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX0NPTlRST0wJCQkweEZGQzAyQUEwCS8qIE1hc3RlciBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9JTlRSCQkJMHhGRkMwMkFBNAkvKiBJbnRlcnJ1cHQgUGVuZGluZyBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUJURAkJCTB4RkZDMDJBQUMJLyogTWFpbGJveCBUZW1wb3JhcnkgRGlzYWJsZSBGZWF0dXJlICovCisjZGVmaW5lCUNBTl9FV1IJCQkJMHhGRkMwMkFCMAkvKiBQcm9ncmFtbWFibGUJV2FybmluZwlMZXZlbCAqLworI2RlZmluZQlDQU5fRVNSCQkJCTB4RkZDMDJBQjQJLyogRXJyb3IgU3RhdHVzCVJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9VQ0NOVAkJCTB4RkZDMDJBQzQJLyogVW5pdmVyc2FsIENvdW50ZXIJICovCisjZGVmaW5lCUNBTl9VQ1JDCQkJMHhGRkMwMkFDOAkvKiBVbml2ZXJzYWwgQ291bnRlciBSZWxvYWQvQ2FwdHVyZSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fVUNDTkYJCQkweEZGQzAyQUNDCS8qIFVuaXZlcnNhbCBDb3VudGVyIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgKi8KKworLyogTWFpbGJveCBBY2NlcHRhbmNlIE1hc2tzCQkJCQkgKi8KKyNkZWZpbmUJQ0FOX0FNMDBMCQkJMHhGRkMwMkIwMAkvKiBNYWlsYm94IDAgTG93IEFjY2VwdGFuY2UgTWFzayAqLworI2RlZmluZQlDQU5fQU0wMEgJCQkweEZGQzAyQjA0CS8qIE1haWxib3ggMCBIaWdoIEFjY2VwdGFuY2UgTWFzayAqLworI2RlZmluZQlDQU5fQU0wMUwJCQkweEZGQzAyQjA4CS8qIE1haWxib3ggMSBMb3cgQWNjZXB0YW5jZSBNYXNrICovCisjZGVmaW5lCUNBTl9BTTAxSAkJCTB4RkZDMDJCMEMJLyogTWFpbGJveCAxIEhpZ2ggQWNjZXB0YW5jZSBNYXNrICovCisjZGVmaW5lCUNBTl9BTTAyTAkJCTB4RkZDMDJCMTAJLyogTWFpbGJveCAyIExvdyBBY2NlcHRhbmNlIE1hc2sgKi8KKyNkZWZpbmUJQ0FOX0FNMDJICQkJMHhGRkMwMkIxNAkvKiBNYWlsYm94IDIgSGlnaCBBY2NlcHRhbmNlIE1hc2sgKi8KKyNkZWZpbmUJQ0FOX0FNMDNMCQkJMHhGRkMwMkIxOAkvKiBNYWlsYm94IDMgTG93IEFjY2VwdGFuY2UgTWFzayAqLworI2RlZmluZQlDQU5fQU0wM0gJCQkweEZGQzAyQjFDCS8qIE1haWxib3ggMyBIaWdoIEFjY2VwdGFuY2UgTWFzayAqLworI2RlZmluZQlDQU5fQU0wNEwJCQkweEZGQzAyQjIwCS8qIE1haWxib3ggNCBMb3cgQWNjZXB0YW5jZSBNYXNrICovCisjZGVmaW5lCUNBTl9BTTA0SAkJCTB4RkZDMDJCMjQJLyogTWFpbGJveCA0IEhpZ2ggQWNjZXB0YW5jZSBNYXNrICovCisjZGVmaW5lCUNBTl9BTTA1TAkJCTB4RkZDMDJCMjgJLyogTWFpbGJveCA1IExvdyBBY2NlcHRhbmNlIE1hc2sgKi8KKyNkZWZpbmUJQ0FOX0FNMDVICQkJMHhGRkMwMkIyQwkvKiBNYWlsYm94IDUgSGlnaCBBY2NlcHRhbmNlIE1hc2sgKi8KKyNkZWZpbmUJQ0FOX0FNMDZMCQkJMHhGRkMwMkIzMAkvKiBNYWlsYm94IDYgTG93IEFjY2VwdGFuY2UgTWFzayAqLworI2RlZmluZQlDQU5fQU0wNkgJCQkweEZGQzAyQjM0CS8qIE1haWxib3ggNiBIaWdoIEFjY2VwdGFuY2UgTWFzayAqLworI2RlZmluZQlDQU5fQU0wN0wJCQkweEZGQzAyQjM4CS8qIE1haWxib3ggNyBMb3cgQWNjZXB0YW5jZSBNYXNrICovCisjZGVmaW5lCUNBTl9BTTA3SAkJCTB4RkZDMDJCM0MJLyogTWFpbGJveCA3IEhpZ2ggQWNjZXB0YW5jZSBNYXNrICovCisjZGVmaW5lCUNBTl9BTTA4TAkJCTB4RkZDMDJCNDAJLyogTWFpbGJveCA4IExvdyBBY2NlcHRhbmNlIE1hc2sgKi8KKyNkZWZpbmUJQ0FOX0FNMDhICQkJMHhGRkMwMkI0NAkvKiBNYWlsYm94IDggSGlnaCBBY2NlcHRhbmNlIE1hc2sgKi8KKyNkZWZpbmUJQ0FOX0FNMDlMCQkJMHhGRkMwMkI0OAkvKiBNYWlsYm94IDkgTG93IEFjY2VwdGFuY2UgTWFzayAqLworI2RlZmluZQlDQU5fQU0wOUgJCQkweEZGQzAyQjRDCS8qIE1haWxib3ggOSBIaWdoIEFjY2VwdGFuY2UgTWFzayAqLworI2RlZmluZQlDQU5fQU0xMEwJCQkweEZGQzAyQjUwCS8qIE1haWxib3ggMTAgTG93IEFjY2VwdGFuY2UgTWFzayAqLworI2RlZmluZQlDQU5fQU0xMEgJCQkweEZGQzAyQjU0CS8qIE1haWxib3ggMTAgSGlnaCBBY2NlcHRhbmNlIE1hc2sgKi8KKyNkZWZpbmUJQ0FOX0FNMTFMCQkJMHhGRkMwMkI1OAkvKiBNYWlsYm94IDExIExvdyBBY2NlcHRhbmNlIE1hc2sgKi8KKyNkZWZpbmUJQ0FOX0FNMTFICQkJMHhGRkMwMkI1QwkvKiBNYWlsYm94IDExIEhpZ2ggQWNjZXB0YW5jZSBNYXNrICovCisjZGVmaW5lCUNBTl9BTTEyTAkJCTB4RkZDMDJCNjAJLyogTWFpbGJveCAxMiBMb3cgQWNjZXB0YW5jZSBNYXNrICovCisjZGVmaW5lCUNBTl9BTTEySAkJCTB4RkZDMDJCNjQJLyogTWFpbGJveCAxMiBIaWdoIEFjY2VwdGFuY2UgTWFzayAqLworI2RlZmluZQlDQU5fQU0xM0wJCQkweEZGQzAyQjY4CS8qIE1haWxib3ggMTMgTG93IEFjY2VwdGFuY2UgTWFzayAqLworI2RlZmluZQlDQU5fQU0xM0gJCQkweEZGQzAyQjZDCS8qIE1haWxib3ggMTMgSGlnaCBBY2NlcHRhbmNlIE1hc2sgKi8KKyNkZWZpbmUJQ0FOX0FNMTRMCQkJMHhGRkMwMkI3MAkvKiBNYWlsYm94IDE0IExvdyBBY2NlcHRhbmNlIE1hc2sgKi8KKyNkZWZpbmUJQ0FOX0FNMTRICQkJMHhGRkMwMkI3NAkvKiBNYWlsYm94IDE0IEhpZ2ggQWNjZXB0YW5jZSBNYXNrICovCisjZGVmaW5lCUNBTl9BTTE1TAkJCTB4RkZDMDJCNzgJLyogTWFpbGJveCAxNSBMb3cgQWNjZXB0YW5jZSBNYXNrICovCisjZGVmaW5lCUNBTl9BTTE1SAkJCTB4RkZDMDJCN0MJLyogTWFpbGJveCAxNSBIaWdoIEFjY2VwdGFuY2UgTWFzayAqLworCisjZGVmaW5lCUNBTl9BTTE2TAkJCTB4RkZDMDJCODAJLyogTWFpbGJveCAxNiBMb3cgQWNjZXB0YW5jZSBNYXNrICovCisjZGVmaW5lCUNBTl9BTTE2SAkJCTB4RkZDMDJCODQJLyogTWFpbGJveCAxNiBIaWdoIEFjY2VwdGFuY2UgTWFzayAqLworI2RlZmluZQlDQU5fQU0xN0wJCQkweEZGQzAyQjg4CS8qIE1haWxib3ggMTcgTG93IEFjY2VwdGFuY2UgTWFzayAqLworI2RlZmluZQlDQU5fQU0xN0gJCQkweEZGQzAyQjhDCS8qIE1haWxib3ggMTcgSGlnaCBBY2NlcHRhbmNlIE1hc2sgKi8KKyNkZWZpbmUJQ0FOX0FNMThMCQkJMHhGRkMwMkI5MAkvKiBNYWlsYm94IDE4IExvdyBBY2NlcHRhbmNlIE1hc2sgKi8KKyNkZWZpbmUJQ0FOX0FNMThICQkJMHhGRkMwMkI5NAkvKiBNYWlsYm94IDE4IEhpZ2ggQWNjZXB0YW5jZSBNYXNrICovCisjZGVmaW5lCUNBTl9BTTE5TAkJCTB4RkZDMDJCOTgJLyogTWFpbGJveCAxOSBMb3cgQWNjZXB0YW5jZSBNYXNrICovCisjZGVmaW5lCUNBTl9BTTE5SAkJCTB4RkZDMDJCOUMJLyogTWFpbGJveCAxOSBIaWdoIEFjY2VwdGFuY2UgTWFzayAqLworI2RlZmluZQlDQU5fQU0yMEwJCQkweEZGQzAyQkEwCS8qIE1haWxib3ggMjAgTG93IEFjY2VwdGFuY2UgTWFzayAqLworI2RlZmluZQlDQU5fQU0yMEgJCQkweEZGQzAyQkE0CS8qIE1haWxib3ggMjAgSGlnaCBBY2NlcHRhbmNlIE1hc2sgKi8KKyNkZWZpbmUJQ0FOX0FNMjFMCQkJMHhGRkMwMkJBOAkvKiBNYWlsYm94IDIxIExvdyBBY2NlcHRhbmNlIE1hc2sgKi8KKyNkZWZpbmUJQ0FOX0FNMjFICQkJMHhGRkMwMkJBQwkvKiBNYWlsYm94IDIxIEhpZ2ggQWNjZXB0YW5jZSBNYXNrICovCisjZGVmaW5lCUNBTl9BTTIyTAkJCTB4RkZDMDJCQjAJLyogTWFpbGJveCAyMiBMb3cgQWNjZXB0YW5jZSBNYXNrICovCisjZGVmaW5lCUNBTl9BTTIySAkJCTB4RkZDMDJCQjQJLyogTWFpbGJveCAyMiBIaWdoIEFjY2VwdGFuY2UgTWFzayAqLworI2RlZmluZQlDQU5fQU0yM0wJCQkweEZGQzAyQkI4CS8qIE1haWxib3ggMjMgTG93IEFjY2VwdGFuY2UgTWFzayAqLworI2RlZmluZQlDQU5fQU0yM0gJCQkweEZGQzAyQkJDCS8qIE1haWxib3ggMjMgSGlnaCBBY2NlcHRhbmNlIE1hc2sgKi8KKyNkZWZpbmUJQ0FOX0FNMjRMCQkJMHhGRkMwMkJDMAkvKiBNYWlsYm94IDI0IExvdyBBY2NlcHRhbmNlIE1hc2sgKi8KKyNkZWZpbmUJQ0FOX0FNMjRICQkJMHhGRkMwMkJDNAkvKiBNYWlsYm94IDI0IEhpZ2ggQWNjZXB0YW5jZSBNYXNrICovCisjZGVmaW5lCUNBTl9BTTI1TAkJCTB4RkZDMDJCQzgJLyogTWFpbGJveCAyNSBMb3cgQWNjZXB0YW5jZSBNYXNrICovCisjZGVmaW5lCUNBTl9BTTI1SAkJCTB4RkZDMDJCQ0MJLyogTWFpbGJveCAyNSBIaWdoIEFjY2VwdGFuY2UgTWFzayAqLworI2RlZmluZQlDQU5fQU0yNkwJCQkweEZGQzAyQkQwCS8qIE1haWxib3ggMjYgTG93IEFjY2VwdGFuY2UgTWFzayAqLworI2RlZmluZQlDQU5fQU0yNkgJCQkweEZGQzAyQkQ0CS8qIE1haWxib3ggMjYgSGlnaCBBY2NlcHRhbmNlIE1hc2sgKi8KKyNkZWZpbmUJQ0FOX0FNMjdMCQkJMHhGRkMwMkJEOAkvKiBNYWlsYm94IDI3IExvdyBBY2NlcHRhbmNlIE1hc2sgKi8KKyNkZWZpbmUJQ0FOX0FNMjdICQkJMHhGRkMwMkJEQwkvKiBNYWlsYm94IDI3IEhpZ2ggQWNjZXB0YW5jZSBNYXNrICovCisjZGVmaW5lCUNBTl9BTTI4TAkJCTB4RkZDMDJCRTAJLyogTWFpbGJveCAyOCBMb3cgQWNjZXB0YW5jZSBNYXNrICovCisjZGVmaW5lCUNBTl9BTTI4SAkJCTB4RkZDMDJCRTQJLyogTWFpbGJveCAyOCBIaWdoIEFjY2VwdGFuY2UgTWFzayAqLworI2RlZmluZQlDQU5fQU0yOUwJCQkweEZGQzAyQkU4CS8qIE1haWxib3ggMjkgTG93IEFjY2VwdGFuY2UgTWFzayAqLworI2RlZmluZQlDQU5fQU0yOUgJCQkweEZGQzAyQkVDCS8qIE1haWxib3ggMjkgSGlnaCBBY2NlcHRhbmNlIE1hc2sgKi8KKyNkZWZpbmUJQ0FOX0FNMzBMCQkJMHhGRkMwMkJGMAkvKiBNYWlsYm94IDMwIExvdyBBY2NlcHRhbmNlIE1hc2sgKi8KKyNkZWZpbmUJQ0FOX0FNMzBICQkJMHhGRkMwMkJGNAkvKiBNYWlsYm94IDMwIEhpZ2ggQWNjZXB0YW5jZSBNYXNrICovCisjZGVmaW5lCUNBTl9BTTMxTAkJCTB4RkZDMDJCRjgJLyogTWFpbGJveCAzMSBMb3cgQWNjZXB0YW5jZSBNYXNrICovCisjZGVmaW5lCUNBTl9BTTMxSAkJCTB4RkZDMDJCRkMJLyogTWFpbGJveCAzMSBIaWdoIEFjY2VwdGFuY2UgTWFzayAqLworCisvKiBDQU4gQWNjZXB0YW5jZSBNYXNrIE1hY3JvcyAqLworI2RlZmluZQlDQU5fQU1fTCh4KQkJCShDQU5fQU0wMEwrKCh4KSoweDgpKQorI2RlZmluZQlDQU5fQU1fSCh4KQkJCShDQU5fQU0wMEgrKCh4KSoweDgpKQorCisvKiBNYWlsYm94IFJlZ2lzdGVycwkJCQkJCQkJCSAqLworI2RlZmluZQlDQU5fTUIwMF9EQVRBMAkJMHhGRkMwMkMwMAkvKiBNYWlsYm94IDAgRGF0YSBXb3JkIDAgWzE1OjBdCVJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjAwX0RBVEExCQkweEZGQzAyQzA0CS8qIE1haWxib3ggMCBEYXRhIFdvcmQgMSBbMzE6MTZdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjAwX0RBVEEyCQkweEZGQzAyQzA4CS8qIE1haWxib3ggMCBEYXRhIFdvcmQgMiBbNDc6MzJdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjAwX0RBVEEzCQkweEZGQzAyQzBDCS8qIE1haWxib3ggMCBEYXRhIFdvcmQgMyBbNjM6NDhdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjAwX0xFTkdUSAkJMHhGRkMwMkMxMAkvKiBNYWlsYm94IDAgRGF0YSBMZW5ndGggQ29kZSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIwMF9USU1FU1RBTVAJMHhGRkMwMkMxNAkvKiBNYWlsYm94IDAgVGltZSBTdGFtcAlWYWx1ZSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIwMF9JRDAJCTB4RkZDMDJDMTgJLyogTWFpbGJveCAwIElkZW50aWZpZXIJTG93IFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjAwX0lEMQkJMHhGRkMwMkMxQwkvKiBNYWlsYm94IDAgSWRlbnRpZmllcglIaWdoIFJlZ2lzdGVyICovCisKKyNkZWZpbmUJQ0FOX01CMDFfREFUQTAJCTB4RkZDMDJDMjAJLyogTWFpbGJveCAxIERhdGEgV29yZCAwIFsxNTowXQlSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIwMV9EQVRBMQkJMHhGRkMwMkMyNAkvKiBNYWlsYm94IDEgRGF0YSBXb3JkIDEgWzMxOjE2XSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIwMV9EQVRBMgkJMHhGRkMwMkMyOAkvKiBNYWlsYm94IDEgRGF0YSBXb3JkIDIgWzQ3OjMyXSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIwMV9EQVRBMwkJMHhGRkMwMkMyQwkvKiBNYWlsYm94IDEgRGF0YSBXb3JkIDMgWzYzOjQ4XSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIwMV9MRU5HVEgJCTB4RkZDMDJDMzAJLyogTWFpbGJveCAxIERhdGEgTGVuZ3RoIENvZGUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMDFfVElNRVNUQU1QCTB4RkZDMDJDMzQJLyogTWFpbGJveCAxIFRpbWUgU3RhbXAJVmFsdWUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMDFfSUQwCQkweEZGQzAyQzM4CS8qIE1haWxib3ggMSBJZGVudGlmaWVyCUxvdyBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIwMV9JRDEJCTB4RkZDMDJDM0MJLyogTWFpbGJveCAxIElkZW50aWZpZXIJSGlnaCBSZWdpc3RlciAqLworCisjZGVmaW5lCUNBTl9NQjAyX0RBVEEwCQkweEZGQzAyQzQwCS8qIE1haWxib3ggMiBEYXRhIFdvcmQgMCBbMTU6MF0JUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMDJfREFUQTEJCTB4RkZDMDJDNDQJLyogTWFpbGJveCAyIERhdGEgV29yZCAxIFszMToxNl0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMDJfREFUQTIJCTB4RkZDMDJDNDgJLyogTWFpbGJveCAyIERhdGEgV29yZCAyIFs0NzozMl0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMDJfREFUQTMJCTB4RkZDMDJDNEMJLyogTWFpbGJveCAyIERhdGEgV29yZCAzIFs2Mzo0OF0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMDJfTEVOR1RICQkweEZGQzAyQzUwCS8qIE1haWxib3ggMiBEYXRhIExlbmd0aCBDb2RlIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjAyX1RJTUVTVEFNUAkweEZGQzAyQzU0CS8qIE1haWxib3ggMiBUaW1lIFN0YW1wCVZhbHVlIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjAyX0lEMAkJMHhGRkMwMkM1OAkvKiBNYWlsYm94IDIgSWRlbnRpZmllcglMb3cgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMDJfSUQxCQkweEZGQzAyQzVDCS8qIE1haWxib3ggMiBJZGVudGlmaWVyCUhpZ2ggUmVnaXN0ZXIgKi8KKworI2RlZmluZQlDQU5fTUIwM19EQVRBMAkJMHhGRkMwMkM2MAkvKiBNYWlsYm94IDMgRGF0YSBXb3JkIDAgWzE1OjBdCVJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjAzX0RBVEExCQkweEZGQzAyQzY0CS8qIE1haWxib3ggMyBEYXRhIFdvcmQgMSBbMzE6MTZdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjAzX0RBVEEyCQkweEZGQzAyQzY4CS8qIE1haWxib3ggMyBEYXRhIFdvcmQgMiBbNDc6MzJdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjAzX0RBVEEzCQkweEZGQzAyQzZDCS8qIE1haWxib3ggMyBEYXRhIFdvcmQgMyBbNjM6NDhdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjAzX0xFTkdUSAkJMHhGRkMwMkM3MAkvKiBNYWlsYm94IDMgRGF0YSBMZW5ndGggQ29kZSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIwM19USU1FU1RBTVAJMHhGRkMwMkM3NAkvKiBNYWlsYm94IDMgVGltZSBTdGFtcAlWYWx1ZSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIwM19JRDAJCTB4RkZDMDJDNzgJLyogTWFpbGJveCAzIElkZW50aWZpZXIJTG93IFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjAzX0lEMQkJMHhGRkMwMkM3QwkvKiBNYWlsYm94IDMgSWRlbnRpZmllcglIaWdoIFJlZ2lzdGVyICovCisKKyNkZWZpbmUJQ0FOX01CMDRfREFUQTAJCTB4RkZDMDJDODAJLyogTWFpbGJveCA0IERhdGEgV29yZCAwIFsxNTowXQlSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIwNF9EQVRBMQkJMHhGRkMwMkM4NAkvKiBNYWlsYm94IDQgRGF0YSBXb3JkIDEgWzMxOjE2XSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIwNF9EQVRBMgkJMHhGRkMwMkM4OAkvKiBNYWlsYm94IDQgRGF0YSBXb3JkIDIgWzQ3OjMyXSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIwNF9EQVRBMwkJMHhGRkMwMkM4QwkvKiBNYWlsYm94IDQgRGF0YSBXb3JkIDMgWzYzOjQ4XSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIwNF9MRU5HVEgJCTB4RkZDMDJDOTAJLyogTWFpbGJveCA0IERhdGEgTGVuZ3RoIENvZGUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMDRfVElNRVNUQU1QCTB4RkZDMDJDOTQJLyogTWFpbGJveCA0IFRpbWUgU3RhbXAJVmFsdWUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMDRfSUQwCQkweEZGQzAyQzk4CS8qIE1haWxib3ggNCBJZGVudGlmaWVyCUxvdyBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIwNF9JRDEJCTB4RkZDMDJDOUMJLyogTWFpbGJveCA0IElkZW50aWZpZXIJSGlnaCBSZWdpc3RlciAqLworCisjZGVmaW5lCUNBTl9NQjA1X0RBVEEwCQkweEZGQzAyQ0EwCS8qIE1haWxib3ggNSBEYXRhIFdvcmQgMCBbMTU6MF0JUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMDVfREFUQTEJCTB4RkZDMDJDQTQJLyogTWFpbGJveCA1IERhdGEgV29yZCAxIFszMToxNl0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMDVfREFUQTIJCTB4RkZDMDJDQTgJLyogTWFpbGJveCA1IERhdGEgV29yZCAyIFs0NzozMl0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMDVfREFUQTMJCTB4RkZDMDJDQUMJLyogTWFpbGJveCA1IERhdGEgV29yZCAzIFs2Mzo0OF0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMDVfTEVOR1RICQkweEZGQzAyQ0IwCS8qIE1haWxib3ggNSBEYXRhIExlbmd0aCBDb2RlIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjA1X1RJTUVTVEFNUAkweEZGQzAyQ0I0CS8qIE1haWxib3ggNSBUaW1lIFN0YW1wCVZhbHVlIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjA1X0lEMAkJMHhGRkMwMkNCOAkvKiBNYWlsYm94IDUgSWRlbnRpZmllcglMb3cgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMDVfSUQxCQkweEZGQzAyQ0JDCS8qIE1haWxib3ggNSBJZGVudGlmaWVyCUhpZ2ggUmVnaXN0ZXIgKi8KKworI2RlZmluZQlDQU5fTUIwNl9EQVRBMAkJMHhGRkMwMkNDMAkvKiBNYWlsYm94IDYgRGF0YSBXb3JkIDAgWzE1OjBdCVJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjA2X0RBVEExCQkweEZGQzAyQ0M0CS8qIE1haWxib3ggNiBEYXRhIFdvcmQgMSBbMzE6MTZdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjA2X0RBVEEyCQkweEZGQzAyQ0M4CS8qIE1haWxib3ggNiBEYXRhIFdvcmQgMiBbNDc6MzJdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjA2X0RBVEEzCQkweEZGQzAyQ0NDCS8qIE1haWxib3ggNiBEYXRhIFdvcmQgMyBbNjM6NDhdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjA2X0xFTkdUSAkJMHhGRkMwMkNEMAkvKiBNYWlsYm94IDYgRGF0YSBMZW5ndGggQ29kZSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIwNl9USU1FU1RBTVAJMHhGRkMwMkNENAkvKiBNYWlsYm94IDYgVGltZSBTdGFtcAlWYWx1ZSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIwNl9JRDAJCTB4RkZDMDJDRDgJLyogTWFpbGJveCA2IElkZW50aWZpZXIJTG93IFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjA2X0lEMQkJMHhGRkMwMkNEQwkvKiBNYWlsYm94IDYgSWRlbnRpZmllcglIaWdoIFJlZ2lzdGVyICovCisKKyNkZWZpbmUJQ0FOX01CMDdfREFUQTAJCTB4RkZDMDJDRTAJLyogTWFpbGJveCA3IERhdGEgV29yZCAwIFsxNTowXQlSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIwN19EQVRBMQkJMHhGRkMwMkNFNAkvKiBNYWlsYm94IDcgRGF0YSBXb3JkIDEgWzMxOjE2XSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIwN19EQVRBMgkJMHhGRkMwMkNFOAkvKiBNYWlsYm94IDcgRGF0YSBXb3JkIDIgWzQ3OjMyXSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIwN19EQVRBMwkJMHhGRkMwMkNFQwkvKiBNYWlsYm94IDcgRGF0YSBXb3JkIDMgWzYzOjQ4XSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIwN19MRU5HVEgJCTB4RkZDMDJDRjAJLyogTWFpbGJveCA3IERhdGEgTGVuZ3RoIENvZGUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMDdfVElNRVNUQU1QCTB4RkZDMDJDRjQJLyogTWFpbGJveCA3IFRpbWUgU3RhbXAJVmFsdWUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMDdfSUQwCQkweEZGQzAyQ0Y4CS8qIE1haWxib3ggNyBJZGVudGlmaWVyCUxvdyBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIwN19JRDEJCTB4RkZDMDJDRkMJLyogTWFpbGJveCA3IElkZW50aWZpZXIJSGlnaCBSZWdpc3RlciAqLworCisjZGVmaW5lCUNBTl9NQjA4X0RBVEEwCQkweEZGQzAyRDAwCS8qIE1haWxib3ggOCBEYXRhIFdvcmQgMCBbMTU6MF0JUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMDhfREFUQTEJCTB4RkZDMDJEMDQJLyogTWFpbGJveCA4IERhdGEgV29yZCAxIFszMToxNl0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMDhfREFUQTIJCTB4RkZDMDJEMDgJLyogTWFpbGJveCA4IERhdGEgV29yZCAyIFs0NzozMl0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMDhfREFUQTMJCTB4RkZDMDJEMEMJLyogTWFpbGJveCA4IERhdGEgV29yZCAzIFs2Mzo0OF0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMDhfTEVOR1RICQkweEZGQzAyRDEwCS8qIE1haWxib3ggOCBEYXRhIExlbmd0aCBDb2RlIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjA4X1RJTUVTVEFNUAkweEZGQzAyRDE0CS8qIE1haWxib3ggOCBUaW1lIFN0YW1wCVZhbHVlIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjA4X0lEMAkJMHhGRkMwMkQxOAkvKiBNYWlsYm94IDggSWRlbnRpZmllcglMb3cgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMDhfSUQxCQkweEZGQzAyRDFDCS8qIE1haWxib3ggOCBJZGVudGlmaWVyCUhpZ2ggUmVnaXN0ZXIgKi8KKworI2RlZmluZQlDQU5fTUIwOV9EQVRBMAkJMHhGRkMwMkQyMAkvKiBNYWlsYm94IDkgRGF0YSBXb3JkIDAgWzE1OjBdCVJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjA5X0RBVEExCQkweEZGQzAyRDI0CS8qIE1haWxib3ggOSBEYXRhIFdvcmQgMSBbMzE6MTZdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjA5X0RBVEEyCQkweEZGQzAyRDI4CS8qIE1haWxib3ggOSBEYXRhIFdvcmQgMiBbNDc6MzJdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjA5X0RBVEEzCQkweEZGQzAyRDJDCS8qIE1haWxib3ggOSBEYXRhIFdvcmQgMyBbNjM6NDhdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjA5X0xFTkdUSAkJMHhGRkMwMkQzMAkvKiBNYWlsYm94IDkgRGF0YSBMZW5ndGggQ29kZSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIwOV9USU1FU1RBTVAJMHhGRkMwMkQzNAkvKiBNYWlsYm94IDkgVGltZSBTdGFtcAlWYWx1ZSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIwOV9JRDAJCTB4RkZDMDJEMzgJLyogTWFpbGJveCA5IElkZW50aWZpZXIJTG93IFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjA5X0lEMQkJMHhGRkMwMkQzQwkvKiBNYWlsYm94IDkgSWRlbnRpZmllcglIaWdoIFJlZ2lzdGVyICovCisKKyNkZWZpbmUJQ0FOX01CMTBfREFUQTAJCTB4RkZDMDJENDAJLyogTWFpbGJveCAxMCBEYXRhIFdvcmQJMCBbMTU6MF0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMTBfREFUQTEJCTB4RkZDMDJENDQJLyogTWFpbGJveCAxMCBEYXRhIFdvcmQJMSBbMzE6MTZdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjEwX0RBVEEyCQkweEZGQzAyRDQ4CS8qIE1haWxib3ggMTAgRGF0YSBXb3JkCTIgWzQ3OjMyXSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIxMF9EQVRBMwkJMHhGRkMwMkQ0QwkvKiBNYWlsYm94IDEwIERhdGEgV29yZAkzIFs2Mzo0OF0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMTBfTEVOR1RICQkweEZGQzAyRDUwCS8qIE1haWxib3ggMTAgRGF0YSBMZW5ndGggQ29kZSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIxMF9USU1FU1RBTVAJMHhGRkMwMkQ1NAkvKiBNYWlsYm94IDEwIFRpbWUgU3RhbXAgVmFsdWUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMTBfSUQwCQkweEZGQzAyRDU4CS8qIE1haWxib3ggMTAgSWRlbnRpZmllciBMb3cgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMTBfSUQxCQkweEZGQzAyRDVDCS8qIE1haWxib3ggMTAgSWRlbnRpZmllciBIaWdoIFJlZ2lzdGVyICovCisKKyNkZWZpbmUJQ0FOX01CMTFfREFUQTAJCTB4RkZDMDJENjAJLyogTWFpbGJveCAxMSBEYXRhIFdvcmQJMCBbMTU6MF0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMTFfREFUQTEJCTB4RkZDMDJENjQJLyogTWFpbGJveCAxMSBEYXRhIFdvcmQJMSBbMzE6MTZdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjExX0RBVEEyCQkweEZGQzAyRDY4CS8qIE1haWxib3ggMTEgRGF0YSBXb3JkCTIgWzQ3OjMyXSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIxMV9EQVRBMwkJMHhGRkMwMkQ2QwkvKiBNYWlsYm94IDExIERhdGEgV29yZAkzIFs2Mzo0OF0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMTFfTEVOR1RICQkweEZGQzAyRDcwCS8qIE1haWxib3ggMTEgRGF0YSBMZW5ndGggQ29kZSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIxMV9USU1FU1RBTVAJMHhGRkMwMkQ3NAkvKiBNYWlsYm94IDExIFRpbWUgU3RhbXAgVmFsdWUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMTFfSUQwCQkweEZGQzAyRDc4CS8qIE1haWxib3ggMTEgSWRlbnRpZmllciBMb3cgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMTFfSUQxCQkweEZGQzAyRDdDCS8qIE1haWxib3ggMTEgSWRlbnRpZmllciBIaWdoIFJlZ2lzdGVyICovCisKKyNkZWZpbmUJQ0FOX01CMTJfREFUQTAJCTB4RkZDMDJEODAJLyogTWFpbGJveCAxMiBEYXRhIFdvcmQJMCBbMTU6MF0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMTJfREFUQTEJCTB4RkZDMDJEODQJLyogTWFpbGJveCAxMiBEYXRhIFdvcmQJMSBbMzE6MTZdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjEyX0RBVEEyCQkweEZGQzAyRDg4CS8qIE1haWxib3ggMTIgRGF0YSBXb3JkCTIgWzQ3OjMyXSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIxMl9EQVRBMwkJMHhGRkMwMkQ4QwkvKiBNYWlsYm94IDEyIERhdGEgV29yZAkzIFs2Mzo0OF0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMTJfTEVOR1RICQkweEZGQzAyRDkwCS8qIE1haWxib3ggMTIgRGF0YSBMZW5ndGggQ29kZSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIxMl9USU1FU1RBTVAJMHhGRkMwMkQ5NAkvKiBNYWlsYm94IDEyIFRpbWUgU3RhbXAgVmFsdWUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMTJfSUQwCQkweEZGQzAyRDk4CS8qIE1haWxib3ggMTIgSWRlbnRpZmllciBMb3cgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMTJfSUQxCQkweEZGQzAyRDlDCS8qIE1haWxib3ggMTIgSWRlbnRpZmllciBIaWdoIFJlZ2lzdGVyICovCisKKyNkZWZpbmUJQ0FOX01CMTNfREFUQTAJCTB4RkZDMDJEQTAJLyogTWFpbGJveCAxMyBEYXRhIFdvcmQJMCBbMTU6MF0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMTNfREFUQTEJCTB4RkZDMDJEQTQJLyogTWFpbGJveCAxMyBEYXRhIFdvcmQJMSBbMzE6MTZdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjEzX0RBVEEyCQkweEZGQzAyREE4CS8qIE1haWxib3ggMTMgRGF0YSBXb3JkCTIgWzQ3OjMyXSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIxM19EQVRBMwkJMHhGRkMwMkRBQwkvKiBNYWlsYm94IDEzIERhdGEgV29yZAkzIFs2Mzo0OF0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMTNfTEVOR1RICQkweEZGQzAyREIwCS8qIE1haWxib3ggMTMgRGF0YSBMZW5ndGggQ29kZSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIxM19USU1FU1RBTVAJMHhGRkMwMkRCNAkvKiBNYWlsYm94IDEzIFRpbWUgU3RhbXAgVmFsdWUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMTNfSUQwCQkweEZGQzAyREI4CS8qIE1haWxib3ggMTMgSWRlbnRpZmllciBMb3cgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMTNfSUQxCQkweEZGQzAyREJDCS8qIE1haWxib3ggMTMgSWRlbnRpZmllciBIaWdoIFJlZ2lzdGVyICovCisKKyNkZWZpbmUJQ0FOX01CMTRfREFUQTAJCTB4RkZDMDJEQzAJLyogTWFpbGJveCAxNCBEYXRhIFdvcmQJMCBbMTU6MF0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMTRfREFUQTEJCTB4RkZDMDJEQzQJLyogTWFpbGJveCAxNCBEYXRhIFdvcmQJMSBbMzE6MTZdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjE0X0RBVEEyCQkweEZGQzAyREM4CS8qIE1haWxib3ggMTQgRGF0YSBXb3JkCTIgWzQ3OjMyXSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIxNF9EQVRBMwkJMHhGRkMwMkRDQwkvKiBNYWlsYm94IDE0IERhdGEgV29yZAkzIFs2Mzo0OF0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMTRfTEVOR1RICQkweEZGQzAyREQwCS8qIE1haWxib3ggMTQgRGF0YSBMZW5ndGggQ29kZSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIxNF9USU1FU1RBTVAJMHhGRkMwMkRENAkvKiBNYWlsYm94IDE0IFRpbWUgU3RhbXAgVmFsdWUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMTRfSUQwCQkweEZGQzAyREQ4CS8qIE1haWxib3ggMTQgSWRlbnRpZmllciBMb3cgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMTRfSUQxCQkweEZGQzAyRERDCS8qIE1haWxib3ggMTQgSWRlbnRpZmllciBIaWdoIFJlZ2lzdGVyICovCisKKyNkZWZpbmUJQ0FOX01CMTVfREFUQTAJCTB4RkZDMDJERTAJLyogTWFpbGJveCAxNSBEYXRhIFdvcmQJMCBbMTU6MF0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMTVfREFUQTEJCTB4RkZDMDJERTQJLyogTWFpbGJveCAxNSBEYXRhIFdvcmQJMSBbMzE6MTZdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjE1X0RBVEEyCQkweEZGQzAyREU4CS8qIE1haWxib3ggMTUgRGF0YSBXb3JkCTIgWzQ3OjMyXSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIxNV9EQVRBMwkJMHhGRkMwMkRFQwkvKiBNYWlsYm94IDE1IERhdGEgV29yZAkzIFs2Mzo0OF0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMTVfTEVOR1RICQkweEZGQzAyREYwCS8qIE1haWxib3ggMTUgRGF0YSBMZW5ndGggQ29kZSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIxNV9USU1FU1RBTVAJMHhGRkMwMkRGNAkvKiBNYWlsYm94IDE1IFRpbWUgU3RhbXAgVmFsdWUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMTVfSUQwCQkweEZGQzAyREY4CS8qIE1haWxib3ggMTUgSWRlbnRpZmllciBMb3cgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMTVfSUQxCQkweEZGQzAyREZDCS8qIE1haWxib3ggMTUgSWRlbnRpZmllciBIaWdoIFJlZ2lzdGVyICovCisKKyNkZWZpbmUJQ0FOX01CMTZfREFUQTAJCTB4RkZDMDJFMDAJLyogTWFpbGJveCAxNiBEYXRhIFdvcmQJMCBbMTU6MF0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMTZfREFUQTEJCTB4RkZDMDJFMDQJLyogTWFpbGJveCAxNiBEYXRhIFdvcmQJMSBbMzE6MTZdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjE2X0RBVEEyCQkweEZGQzAyRTA4CS8qIE1haWxib3ggMTYgRGF0YSBXb3JkCTIgWzQ3OjMyXSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIxNl9EQVRBMwkJMHhGRkMwMkUwQwkvKiBNYWlsYm94IDE2IERhdGEgV29yZAkzIFs2Mzo0OF0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMTZfTEVOR1RICQkweEZGQzAyRTEwCS8qIE1haWxib3ggMTYgRGF0YSBMZW5ndGggQ29kZSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIxNl9USU1FU1RBTVAJMHhGRkMwMkUxNAkvKiBNYWlsYm94IDE2IFRpbWUgU3RhbXAgVmFsdWUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMTZfSUQwCQkweEZGQzAyRTE4CS8qIE1haWxib3ggMTYgSWRlbnRpZmllciBMb3cgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMTZfSUQxCQkweEZGQzAyRTFDCS8qIE1haWxib3ggMTYgSWRlbnRpZmllciBIaWdoIFJlZ2lzdGVyICovCisKKyNkZWZpbmUJQ0FOX01CMTdfREFUQTAJCTB4RkZDMDJFMjAJLyogTWFpbGJveCAxNyBEYXRhIFdvcmQJMCBbMTU6MF0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMTdfREFUQTEJCTB4RkZDMDJFMjQJLyogTWFpbGJveCAxNyBEYXRhIFdvcmQJMSBbMzE6MTZdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjE3X0RBVEEyCQkweEZGQzAyRTI4CS8qIE1haWxib3ggMTcgRGF0YSBXb3JkCTIgWzQ3OjMyXSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIxN19EQVRBMwkJMHhGRkMwMkUyQwkvKiBNYWlsYm94IDE3IERhdGEgV29yZAkzIFs2Mzo0OF0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMTdfTEVOR1RICQkweEZGQzAyRTMwCS8qIE1haWxib3ggMTcgRGF0YSBMZW5ndGggQ29kZSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIxN19USU1FU1RBTVAJMHhGRkMwMkUzNAkvKiBNYWlsYm94IDE3IFRpbWUgU3RhbXAgVmFsdWUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMTdfSUQwCQkweEZGQzAyRTM4CS8qIE1haWxib3ggMTcgSWRlbnRpZmllciBMb3cgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMTdfSUQxCQkweEZGQzAyRTNDCS8qIE1haWxib3ggMTcgSWRlbnRpZmllciBIaWdoIFJlZ2lzdGVyICovCisKKyNkZWZpbmUJQ0FOX01CMThfREFUQTAJCTB4RkZDMDJFNDAJLyogTWFpbGJveCAxOCBEYXRhIFdvcmQJMCBbMTU6MF0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMThfREFUQTEJCTB4RkZDMDJFNDQJLyogTWFpbGJveCAxOCBEYXRhIFdvcmQJMSBbMzE6MTZdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjE4X0RBVEEyCQkweEZGQzAyRTQ4CS8qIE1haWxib3ggMTggRGF0YSBXb3JkCTIgWzQ3OjMyXSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIxOF9EQVRBMwkJMHhGRkMwMkU0QwkvKiBNYWlsYm94IDE4IERhdGEgV29yZAkzIFs2Mzo0OF0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMThfTEVOR1RICQkweEZGQzAyRTUwCS8qIE1haWxib3ggMTggRGF0YSBMZW5ndGggQ29kZSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIxOF9USU1FU1RBTVAJMHhGRkMwMkU1NAkvKiBNYWlsYm94IDE4IFRpbWUgU3RhbXAgVmFsdWUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMThfSUQwCQkweEZGQzAyRTU4CS8qIE1haWxib3ggMTggSWRlbnRpZmllciBMb3cgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMThfSUQxCQkweEZGQzAyRTVDCS8qIE1haWxib3ggMTggSWRlbnRpZmllciBIaWdoIFJlZ2lzdGVyICovCisKKyNkZWZpbmUJQ0FOX01CMTlfREFUQTAJCTB4RkZDMDJFNjAJLyogTWFpbGJveCAxOSBEYXRhIFdvcmQJMCBbMTU6MF0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMTlfREFUQTEJCTB4RkZDMDJFNjQJLyogTWFpbGJveCAxOSBEYXRhIFdvcmQJMSBbMzE6MTZdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjE5X0RBVEEyCQkweEZGQzAyRTY4CS8qIE1haWxib3ggMTkgRGF0YSBXb3JkCTIgWzQ3OjMyXSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIxOV9EQVRBMwkJMHhGRkMwMkU2QwkvKiBNYWlsYm94IDE5IERhdGEgV29yZAkzIFs2Mzo0OF0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMTlfTEVOR1RICQkweEZGQzAyRTcwCS8qIE1haWxib3ggMTkgRGF0YSBMZW5ndGggQ29kZSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIxOV9USU1FU1RBTVAJMHhGRkMwMkU3NAkvKiBNYWlsYm94IDE5IFRpbWUgU3RhbXAgVmFsdWUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMTlfSUQwCQkweEZGQzAyRTc4CS8qIE1haWxib3ggMTkgSWRlbnRpZmllciBMb3cgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMTlfSUQxCQkweEZGQzAyRTdDCS8qIE1haWxib3ggMTkgSWRlbnRpZmllciBIaWdoIFJlZ2lzdGVyICovCisKKyNkZWZpbmUJQ0FOX01CMjBfREFUQTAJCTB4RkZDMDJFODAJLyogTWFpbGJveCAyMCBEYXRhIFdvcmQJMCBbMTU6MF0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMjBfREFUQTEJCTB4RkZDMDJFODQJLyogTWFpbGJveCAyMCBEYXRhIFdvcmQJMSBbMzE6MTZdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjIwX0RBVEEyCQkweEZGQzAyRTg4CS8qIE1haWxib3ggMjAgRGF0YSBXb3JkCTIgWzQ3OjMyXSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIyMF9EQVRBMwkJMHhGRkMwMkU4QwkvKiBNYWlsYm94IDIwIERhdGEgV29yZAkzIFs2Mzo0OF0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMjBfTEVOR1RICQkweEZGQzAyRTkwCS8qIE1haWxib3ggMjAgRGF0YSBMZW5ndGggQ29kZSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIyMF9USU1FU1RBTVAJMHhGRkMwMkU5NAkvKiBNYWlsYm94IDIwIFRpbWUgU3RhbXAgVmFsdWUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMjBfSUQwCQkweEZGQzAyRTk4CS8qIE1haWxib3ggMjAgSWRlbnRpZmllciBMb3cgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMjBfSUQxCQkweEZGQzAyRTlDCS8qIE1haWxib3ggMjAgSWRlbnRpZmllciBIaWdoIFJlZ2lzdGVyICovCisKKyNkZWZpbmUJQ0FOX01CMjFfREFUQTAJCTB4RkZDMDJFQTAJLyogTWFpbGJveCAyMSBEYXRhIFdvcmQJMCBbMTU6MF0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMjFfREFUQTEJCTB4RkZDMDJFQTQJLyogTWFpbGJveCAyMSBEYXRhIFdvcmQJMSBbMzE6MTZdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjIxX0RBVEEyCQkweEZGQzAyRUE4CS8qIE1haWxib3ggMjEgRGF0YSBXb3JkCTIgWzQ3OjMyXSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIyMV9EQVRBMwkJMHhGRkMwMkVBQwkvKiBNYWlsYm94IDIxIERhdGEgV29yZAkzIFs2Mzo0OF0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMjFfTEVOR1RICQkweEZGQzAyRUIwCS8qIE1haWxib3ggMjEgRGF0YSBMZW5ndGggQ29kZSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIyMV9USU1FU1RBTVAJMHhGRkMwMkVCNAkvKiBNYWlsYm94IDIxIFRpbWUgU3RhbXAgVmFsdWUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMjFfSUQwCQkweEZGQzAyRUI4CS8qIE1haWxib3ggMjEgSWRlbnRpZmllciBMb3cgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMjFfSUQxCQkweEZGQzAyRUJDCS8qIE1haWxib3ggMjEgSWRlbnRpZmllciBIaWdoIFJlZ2lzdGVyICovCisKKyNkZWZpbmUJQ0FOX01CMjJfREFUQTAJCTB4RkZDMDJFQzAJLyogTWFpbGJveCAyMiBEYXRhIFdvcmQJMCBbMTU6MF0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMjJfREFUQTEJCTB4RkZDMDJFQzQJLyogTWFpbGJveCAyMiBEYXRhIFdvcmQJMSBbMzE6MTZdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjIyX0RBVEEyCQkweEZGQzAyRUM4CS8qIE1haWxib3ggMjIgRGF0YSBXb3JkCTIgWzQ3OjMyXSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIyMl9EQVRBMwkJMHhGRkMwMkVDQwkvKiBNYWlsYm94IDIyIERhdGEgV29yZAkzIFs2Mzo0OF0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMjJfTEVOR1RICQkweEZGQzAyRUQwCS8qIE1haWxib3ggMjIgRGF0YSBMZW5ndGggQ29kZSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIyMl9USU1FU1RBTVAJMHhGRkMwMkVENAkvKiBNYWlsYm94IDIyIFRpbWUgU3RhbXAgVmFsdWUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMjJfSUQwCQkweEZGQzAyRUQ4CS8qIE1haWxib3ggMjIgSWRlbnRpZmllciBMb3cgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMjJfSUQxCQkweEZGQzAyRURDCS8qIE1haWxib3ggMjIgSWRlbnRpZmllciBIaWdoIFJlZ2lzdGVyICovCisKKyNkZWZpbmUJQ0FOX01CMjNfREFUQTAJCTB4RkZDMDJFRTAJLyogTWFpbGJveCAyMyBEYXRhIFdvcmQJMCBbMTU6MF0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMjNfREFUQTEJCTB4RkZDMDJFRTQJLyogTWFpbGJveCAyMyBEYXRhIFdvcmQJMSBbMzE6MTZdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjIzX0RBVEEyCQkweEZGQzAyRUU4CS8qIE1haWxib3ggMjMgRGF0YSBXb3JkCTIgWzQ3OjMyXSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIyM19EQVRBMwkJMHhGRkMwMkVFQwkvKiBNYWlsYm94IDIzIERhdGEgV29yZAkzIFs2Mzo0OF0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMjNfTEVOR1RICQkweEZGQzAyRUYwCS8qIE1haWxib3ggMjMgRGF0YSBMZW5ndGggQ29kZSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIyM19USU1FU1RBTVAJMHhGRkMwMkVGNAkvKiBNYWlsYm94IDIzIFRpbWUgU3RhbXAgVmFsdWUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMjNfSUQwCQkweEZGQzAyRUY4CS8qIE1haWxib3ggMjMgSWRlbnRpZmllciBMb3cgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMjNfSUQxCQkweEZGQzAyRUZDCS8qIE1haWxib3ggMjMgSWRlbnRpZmllciBIaWdoIFJlZ2lzdGVyICovCisKKyNkZWZpbmUJQ0FOX01CMjRfREFUQTAJCTB4RkZDMDJGMDAJLyogTWFpbGJveCAyNCBEYXRhIFdvcmQJMCBbMTU6MF0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMjRfREFUQTEJCTB4RkZDMDJGMDQJLyogTWFpbGJveCAyNCBEYXRhIFdvcmQJMSBbMzE6MTZdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjI0X0RBVEEyCQkweEZGQzAyRjA4CS8qIE1haWxib3ggMjQgRGF0YSBXb3JkCTIgWzQ3OjMyXSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIyNF9EQVRBMwkJMHhGRkMwMkYwQwkvKiBNYWlsYm94IDI0IERhdGEgV29yZAkzIFs2Mzo0OF0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMjRfTEVOR1RICQkweEZGQzAyRjEwCS8qIE1haWxib3ggMjQgRGF0YSBMZW5ndGggQ29kZSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIyNF9USU1FU1RBTVAJMHhGRkMwMkYxNAkvKiBNYWlsYm94IDI0IFRpbWUgU3RhbXAgVmFsdWUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMjRfSUQwCQkweEZGQzAyRjE4CS8qIE1haWxib3ggMjQgSWRlbnRpZmllciBMb3cgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMjRfSUQxCQkweEZGQzAyRjFDCS8qIE1haWxib3ggMjQgSWRlbnRpZmllciBIaWdoIFJlZ2lzdGVyICovCisKKyNkZWZpbmUJQ0FOX01CMjVfREFUQTAJCTB4RkZDMDJGMjAJLyogTWFpbGJveCAyNSBEYXRhIFdvcmQJMCBbMTU6MF0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMjVfREFUQTEJCTB4RkZDMDJGMjQJLyogTWFpbGJveCAyNSBEYXRhIFdvcmQJMSBbMzE6MTZdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjI1X0RBVEEyCQkweEZGQzAyRjI4CS8qIE1haWxib3ggMjUgRGF0YSBXb3JkCTIgWzQ3OjMyXSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIyNV9EQVRBMwkJMHhGRkMwMkYyQwkvKiBNYWlsYm94IDI1IERhdGEgV29yZAkzIFs2Mzo0OF0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMjVfTEVOR1RICQkweEZGQzAyRjMwCS8qIE1haWxib3ggMjUgRGF0YSBMZW5ndGggQ29kZSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIyNV9USU1FU1RBTVAJMHhGRkMwMkYzNAkvKiBNYWlsYm94IDI1IFRpbWUgU3RhbXAgVmFsdWUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMjVfSUQwCQkweEZGQzAyRjM4CS8qIE1haWxib3ggMjUgSWRlbnRpZmllciBMb3cgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMjVfSUQxCQkweEZGQzAyRjNDCS8qIE1haWxib3ggMjUgSWRlbnRpZmllciBIaWdoIFJlZ2lzdGVyICovCisKKyNkZWZpbmUJQ0FOX01CMjZfREFUQTAJCTB4RkZDMDJGNDAJLyogTWFpbGJveCAyNiBEYXRhIFdvcmQJMCBbMTU6MF0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMjZfREFUQTEJCTB4RkZDMDJGNDQJLyogTWFpbGJveCAyNiBEYXRhIFdvcmQJMSBbMzE6MTZdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjI2X0RBVEEyCQkweEZGQzAyRjQ4CS8qIE1haWxib3ggMjYgRGF0YSBXb3JkCTIgWzQ3OjMyXSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIyNl9EQVRBMwkJMHhGRkMwMkY0QwkvKiBNYWlsYm94IDI2IERhdGEgV29yZAkzIFs2Mzo0OF0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMjZfTEVOR1RICQkweEZGQzAyRjUwCS8qIE1haWxib3ggMjYgRGF0YSBMZW5ndGggQ29kZSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIyNl9USU1FU1RBTVAJMHhGRkMwMkY1NAkvKiBNYWlsYm94IDI2IFRpbWUgU3RhbXAgVmFsdWUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMjZfSUQwCQkweEZGQzAyRjU4CS8qIE1haWxib3ggMjYgSWRlbnRpZmllciBMb3cgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMjZfSUQxCQkweEZGQzAyRjVDCS8qIE1haWxib3ggMjYgSWRlbnRpZmllciBIaWdoIFJlZ2lzdGVyICovCisKKyNkZWZpbmUJQ0FOX01CMjdfREFUQTAJCTB4RkZDMDJGNjAJLyogTWFpbGJveCAyNyBEYXRhIFdvcmQJMCBbMTU6MF0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMjdfREFUQTEJCTB4RkZDMDJGNjQJLyogTWFpbGJveCAyNyBEYXRhIFdvcmQJMSBbMzE6MTZdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjI3X0RBVEEyCQkweEZGQzAyRjY4CS8qIE1haWxib3ggMjcgRGF0YSBXb3JkCTIgWzQ3OjMyXSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIyN19EQVRBMwkJMHhGRkMwMkY2QwkvKiBNYWlsYm94IDI3IERhdGEgV29yZAkzIFs2Mzo0OF0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMjdfTEVOR1RICQkweEZGQzAyRjcwCS8qIE1haWxib3ggMjcgRGF0YSBMZW5ndGggQ29kZSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIyN19USU1FU1RBTVAJMHhGRkMwMkY3NAkvKiBNYWlsYm94IDI3IFRpbWUgU3RhbXAgVmFsdWUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMjdfSUQwCQkweEZGQzAyRjc4CS8qIE1haWxib3ggMjcgSWRlbnRpZmllciBMb3cgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMjdfSUQxCQkweEZGQzAyRjdDCS8qIE1haWxib3ggMjcgSWRlbnRpZmllciBIaWdoIFJlZ2lzdGVyICovCisKKyNkZWZpbmUJQ0FOX01CMjhfREFUQTAJCTB4RkZDMDJGODAJLyogTWFpbGJveCAyOCBEYXRhIFdvcmQJMCBbMTU6MF0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMjhfREFUQTEJCTB4RkZDMDJGODQJLyogTWFpbGJveCAyOCBEYXRhIFdvcmQJMSBbMzE6MTZdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjI4X0RBVEEyCQkweEZGQzAyRjg4CS8qIE1haWxib3ggMjggRGF0YSBXb3JkCTIgWzQ3OjMyXSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIyOF9EQVRBMwkJMHhGRkMwMkY4QwkvKiBNYWlsYm94IDI4IERhdGEgV29yZAkzIFs2Mzo0OF0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMjhfTEVOR1RICQkweEZGQzAyRjkwCS8qIE1haWxib3ggMjggRGF0YSBMZW5ndGggQ29kZSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIyOF9USU1FU1RBTVAJMHhGRkMwMkY5NAkvKiBNYWlsYm94IDI4IFRpbWUgU3RhbXAgVmFsdWUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMjhfSUQwCQkweEZGQzAyRjk4CS8qIE1haWxib3ggMjggSWRlbnRpZmllciBMb3cgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMjhfSUQxCQkweEZGQzAyRjlDCS8qIE1haWxib3ggMjggSWRlbnRpZmllciBIaWdoIFJlZ2lzdGVyICovCisKKyNkZWZpbmUJQ0FOX01CMjlfREFUQTAJCTB4RkZDMDJGQTAJLyogTWFpbGJveCAyOSBEYXRhIFdvcmQJMCBbMTU6MF0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMjlfREFUQTEJCTB4RkZDMDJGQTQJLyogTWFpbGJveCAyOSBEYXRhIFdvcmQJMSBbMzE6MTZdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjI5X0RBVEEyCQkweEZGQzAyRkE4CS8qIE1haWxib3ggMjkgRGF0YSBXb3JkCTIgWzQ3OjMyXSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIyOV9EQVRBMwkJMHhGRkMwMkZBQwkvKiBNYWlsYm94IDI5IERhdGEgV29yZAkzIFs2Mzo0OF0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMjlfTEVOR1RICQkweEZGQzAyRkIwCS8qIE1haWxib3ggMjkgRGF0YSBMZW5ndGggQ29kZSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIyOV9USU1FU1RBTVAJMHhGRkMwMkZCNAkvKiBNYWlsYm94IDI5IFRpbWUgU3RhbXAgVmFsdWUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMjlfSUQwCQkweEZGQzAyRkI4CS8qIE1haWxib3ggMjkgSWRlbnRpZmllciBMb3cgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMjlfSUQxCQkweEZGQzAyRkJDCS8qIE1haWxib3ggMjkgSWRlbnRpZmllciBIaWdoIFJlZ2lzdGVyICovCisKKyNkZWZpbmUJQ0FOX01CMzBfREFUQTAJCTB4RkZDMDJGQzAJLyogTWFpbGJveCAzMCBEYXRhIFdvcmQJMCBbMTU6MF0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMzBfREFUQTEJCTB4RkZDMDJGQzQJLyogTWFpbGJveCAzMCBEYXRhIFdvcmQJMSBbMzE6MTZdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjMwX0RBVEEyCQkweEZGQzAyRkM4CS8qIE1haWxib3ggMzAgRGF0YSBXb3JkCTIgWzQ3OjMyXSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIzMF9EQVRBMwkJMHhGRkMwMkZDQwkvKiBNYWlsYm94IDMwIERhdGEgV29yZAkzIFs2Mzo0OF0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMzBfTEVOR1RICQkweEZGQzAyRkQwCS8qIE1haWxib3ggMzAgRGF0YSBMZW5ndGggQ29kZSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIzMF9USU1FU1RBTVAJMHhGRkMwMkZENAkvKiBNYWlsYm94IDMwIFRpbWUgU3RhbXAgVmFsdWUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMzBfSUQwCQkweEZGQzAyRkQ4CS8qIE1haWxib3ggMzAgSWRlbnRpZmllciBMb3cgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMzBfSUQxCQkweEZGQzAyRkRDCS8qIE1haWxib3ggMzAgSWRlbnRpZmllciBIaWdoIFJlZ2lzdGVyICovCisKKyNkZWZpbmUJQ0FOX01CMzFfREFUQTAJCTB4RkZDMDJGRTAJLyogTWFpbGJveCAzMSBEYXRhIFdvcmQJMCBbMTU6MF0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMzFfREFUQTEJCTB4RkZDMDJGRTQJLyogTWFpbGJveCAzMSBEYXRhIFdvcmQJMSBbMzE6MTZdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjMxX0RBVEEyCQkweEZGQzAyRkU4CS8qIE1haWxib3ggMzEgRGF0YSBXb3JkCTIgWzQ3OjMyXSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIzMV9EQVRBMwkJMHhGRkMwMkZFQwkvKiBNYWlsYm94IDMxIERhdGEgV29yZAkzIFs2Mzo0OF0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMzFfTEVOR1RICQkweEZGQzAyRkYwCS8qIE1haWxib3ggMzEgRGF0YSBMZW5ndGggQ29kZSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIzMV9USU1FU1RBTVAJMHhGRkMwMkZGNAkvKiBNYWlsYm94IDMxIFRpbWUgU3RhbXAgVmFsdWUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMzFfSUQwCQkweEZGQzAyRkY4CS8qIE1haWxib3ggMzEgSWRlbnRpZmllciBMb3cgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMzFfSUQxCQkweEZGQzAyRkZDCS8qIE1haWxib3ggMzEgSWRlbnRpZmllciBIaWdoIFJlZ2lzdGVyICovCisKKy8qIENBTiBNYWlsYm94IEFyZWEgTWFjcm9zICovCisjZGVmaW5lCUNBTl9NQl9JRDEoeCkJCShDQU5fTUIwMF9JRDErKCh4KSoweDIwKSkKKyNkZWZpbmUJQ0FOX01CX0lEMCh4KQkJKENBTl9NQjAwX0lEMCsoKHgpKjB4MjApKQorI2RlZmluZQlDQU5fTUJfVElNRVNUQU1QKHgpCShDQU5fTUIwMF9USU1FU1RBTVArKCh4KSoweDIwKSkKKyNkZWZpbmUJQ0FOX01CX0xFTkdUSCh4KQkoQ0FOX01CMDBfTEVOR1RIKygoeCkqMHgyMCkpCisjZGVmaW5lCUNBTl9NQl9EQVRBMyh4KQkJKENBTl9NQjAwX0RBVEEzKygoeCkqMHgyMCkpCisjZGVmaW5lCUNBTl9NQl9EQVRBMih4KQkJKENBTl9NQjAwX0RBVEEyKygoeCkqMHgyMCkpCisjZGVmaW5lCUNBTl9NQl9EQVRBMSh4KQkJKENBTl9NQjAwX0RBVEExKygoeCkqMHgyMCkpCisjZGVmaW5lCUNBTl9NQl9EQVRBMCh4KQkJKENBTl9NQjAwX0RBVEEwKygoeCkqMHgyMCkpCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiBTeXN0ZW0gTU1SIFJlZ2lzdGVyIEJpdHMgYW5kCU1hY3JvcyAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworLyogU1dSU1QgTWFzayAqLworI2RlZmluZQlTWVNURU1fUkVTRVQJMHgwMDA3CS8qIEluaXRpYXRlcyBBIFN5c3RlbSBTb2Z0d2FyZSBSZXNldCAqLworI2RlZmluZQlET1VCTEVfRkFVTFQJMHgwMDA4CS8qIENvcmUJRG91YmxlIEZhdWx0IENhdXNlcyBSZXNldCAqLworI2RlZmluZQlSRVNFVF9ET1VCTEUJMHgyMDAwCS8qIFNXIFJlc2V0IEdlbmVyYXRlZCBCeSBDb3JlIERvdWJsZS1GYXVsdCAqLworI2RlZmluZQlSRVNFVF9XRE9HCQkweDQwMDAJLyogU1cgUmVzZXQgR2VuZXJhdGVkIEJ5IFdhdGNoZG9nIFRpbWVyICovCisjZGVmaW5lCVJFU0VUX1NPRlRXQVJFCTB4ODAwMAkvKiBTVyBSZXNldCBPY2N1cnJlZCBTaW5jZSBMYXN0CVJlYWQgT2YJU1dSU1QgKi8KKworLyogU1lTQ1IgTWFza3MJCQkJCQkJCQkJCQkJICovCisjZGVmaW5lCUJNT0RFCQkJMHgwMDA2CS8qIEJvb3QJTW9kZSAtIExhdGNoZWQgRHVyaW5nIEhXIFJlc2V0IEZyb20gTW9kZSBQaW5zICovCisjZGVmaW5lCU5PQk9PVAkJCTB4MDAxMAkvKiBFeGVjdXRlIEZyb20JTDEgb3IgQVNZTkMgQmFuayAwIFdoZW4JQk1PREUgPQkwICovCisKKworLyogKioqKioqKioqKioqKiAgU1lTVEVNIElOVEVSUlVQVCBDT05UUk9MTEVSIE1BU0tTICoqKioqKioqKioqKioqKioqICovCisKKy8qIFBlcmlwaGVyYWwgTWFza3MgRm9yCVNJQzBfSVNSLCBTSUMwX0lXUiwgU0lDMF9JTUFTSyAqLworI2RlZmluZQlQTExfV0FLRVVQX0lSUQkJMHgwMDAwMDAwMQkvKiBQTEwgV2FrZXVwIEludGVycnVwdAlSZXF1ZXN0ICovCisjZGVmaW5lCURNQUMwX0VSUl9JUlEJCTB4MDAwMDAwMDIJLyogRE1BIENvbnRyb2xsZXIgMCBFcnJvciBJbnRlcnJ1cHQgUmVxdWVzdCAqLworI2RlZmluZQlQUElfRVJSX0lSUQkJMHgwMDAwMDAwNAkvKiBQUEkgRXJyb3IgSW50ZXJydXB0IFJlcXVlc3QgKi8KKyNkZWZpbmUJU1BPUlQwX0VSUl9JUlEJCTB4MDAwMDAwMDgJLyogU1BPUlQwIEVycm9yCUludGVycnVwdCBSZXF1ZXN0ICovCisjZGVmaW5lCVNQT1JUMV9FUlJfSVJRCQkweDAwMDAwMDEwCS8qIFNQT1JUMSBFcnJvcglJbnRlcnJ1cHQgUmVxdWVzdCAqLworI2RlZmluZQlTUEkwX0VSUl9JUlEJCTB4MDAwMDAwMjAJLyogU1BJMAlFcnJvciBJbnRlcnJ1cHQJUmVxdWVzdCAqLworI2RlZmluZQlVQVJUMF9FUlJfSVJRCQkweDAwMDAwMDQwCS8qIFVBUlQwIEVycm9yIEludGVycnVwdCBSZXF1ZXN0ICovCisjZGVmaW5lCVJUQ19JUlEJCQkweDAwMDAwMDgwCS8qIFJlYWwtVGltZSBDbG9jayBJbnRlcnJ1cHQgUmVxdWVzdCAqLworI2RlZmluZQlETUEwX0lSUQkJMHgwMDAwMDEwMAkvKiBETUEgQ2hhbm5lbCAwIChQUEkpIEludGVycnVwdCBSZXF1ZXN0ICovCisjZGVmaW5lCURNQTFfSVJRCQkweDAwMDAwMjAwCS8qIERNQSBDaGFubmVsIDEgKFNQT1JUMCBSWCkgSW50ZXJydXB0IFJlcXVlc3QgKi8KKyNkZWZpbmUJRE1BMl9JUlEJCTB4MDAwMDA0MDAJLyogRE1BIENoYW5uZWwgMiAoU1BPUlQwIFRYKSBJbnRlcnJ1cHQgUmVxdWVzdCAqLworI2RlZmluZQlETUEzX0lSUQkJMHgwMDAwMDgwMAkvKiBETUEgQ2hhbm5lbCAzIChTUE9SVDEgUlgpIEludGVycnVwdCBSZXF1ZXN0ICovCisjZGVmaW5lCURNQTRfSVJRCQkweDAwMDAxMDAwCS8qIERNQSBDaGFubmVsIDQgKFNQT1JUMSBUWCkgSW50ZXJydXB0IFJlcXVlc3QgKi8KKyNkZWZpbmUJRE1BNV9JUlEJCTB4MDAwMDIwMDAJLyogRE1BIENoYW5uZWwgNSAoU1BJKSBJbnRlcnJ1cHQgUmVxdWVzdCAqLworI2RlZmluZQlETUE2X0lSUQkJMHgwMDAwNDAwMAkvKiBETUEgQ2hhbm5lbCA2IChVQVJUIFJYKSBJbnRlcnJ1cHQgUmVxdWVzdCAqLworI2RlZmluZQlETUE3X0lSUQkJMHgwMDAwODAwMAkvKiBETUEgQ2hhbm5lbCA3IChVQVJUIFRYKSBJbnRlcnJ1cHQgUmVxdWVzdCAqLworI2RlZmluZQlUSU1FUjBfSVJRCQkweDAwMDEwMDAwCS8qIFRpbWVyIDAgSW50ZXJydXB0IFJlcXVlc3QgKi8KKyNkZWZpbmUJVElNRVIxX0lSUQkJMHgwMDAyMDAwMAkvKiBUaW1lciAxIEludGVycnVwdCBSZXF1ZXN0ICovCisjZGVmaW5lCVRJTUVSMl9JUlEJCTB4MDAwNDAwMDAJLyogVGltZXIgMiBJbnRlcnJ1cHQgUmVxdWVzdCAqLworI2RlZmluZQlQRkFfSVJRCQkJMHgwMDA4MDAwMAkvKiBQcm9ncmFtbWFibGUJRmxhZyBJbnRlcnJ1cHQgUmVxdWVzdCBBICovCisjZGVmaW5lCVBGQl9JUlEJCQkweDAwMTAwMDAwCS8qIFByb2dyYW1tYWJsZQlGbGFnIEludGVycnVwdCBSZXF1ZXN0IEIgKi8KKyNkZWZpbmUJTURNQTBfMF9JUlEJCTB4MDAyMDAwMDAJLyogTWVtRE1BMCBTdHJlYW0gMCBJbnRlcnJ1cHQgUmVxdWVzdCAqLworI2RlZmluZQlNRE1BMF8xX0lSUQkJMHgwMDQwMDAwMAkvKiBNZW1ETUEwIFN0cmVhbSAxIEludGVycnVwdCBSZXF1ZXN0ICovCisjZGVmaW5lCVdET0dfSVJRCQkweDAwODAwMDAwCS8qIFNvZnR3YXJlIFdhdGNoZG9nIFRpbWVyIEludGVycnVwdCBSZXF1ZXN0ICovCisjZGVmaW5lCURNQUMxX0VSUl9JUlEJCTB4MDEwMDAwMDAJLyogRE1BIENvbnRyb2xsZXIgMSBFcnJvciBJbnRlcnJ1cHQgUmVxdWVzdCAqLworI2RlZmluZQlTUE9SVDJfRVJSX0lSUQkJMHgwMjAwMDAwMAkvKiBTUE9SVDIgRXJyb3IJSW50ZXJydXB0IFJlcXVlc3QgKi8KKyNkZWZpbmUJU1BPUlQzX0VSUl9JUlEJCTB4MDQwMDAwMDAJLyogU1BPUlQzIEVycm9yCUludGVycnVwdCBSZXF1ZXN0ICovCisjZGVmaW5lCU1YVlJfU0RfSVJRCQkweDA4MDAwMDAwCS8qIE1YVlIJU3luY2hyb25vdXMgRGF0YSBJbnRlcnJ1cHQgUmVxdWVzdCAqLworI2RlZmluZQlTUEkxX0VSUl9JUlEJCTB4MTAwMDAwMDAJLyogU1BJMQlFcnJvciBJbnRlcnJ1cHQJUmVxdWVzdCAqLworI2RlZmluZQlTUEkyX0VSUl9JUlEJCTB4MjAwMDAwMDAJLyogU1BJMglFcnJvciBJbnRlcnJ1cHQJUmVxdWVzdCAqLworI2RlZmluZQlVQVJUMV9FUlJfSVJRCQkweDQwMDAwMDAwCS8qIFVBUlQxIEVycm9yIEludGVycnVwdCBSZXF1ZXN0ICovCisjZGVmaW5lCVVBUlQyX0VSUl9JUlEJCTB4ODAwMDAwMDAJLyogVUFSVDIgRXJyb3IgSW50ZXJydXB0IFJlcXVlc3QgKi8KKworLyogdGhlIGZvbGxvd2luZyBhcmUgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5ICovCisjZGVmaW5lCURNQTBfRVJSX0lSUQkJRE1BQzBfRVJSX0lSUQorI2RlZmluZQlETUExX0VSUl9JUlEJCURNQUMxX0VSUl9JUlEKKworCisvKiBQZXJpcGhlcmFsIE1hc2tzIEZvcglTSUNfSVNSMSwgU0lDX0lXUjEsIFNJQ19JTUFTSzEJICovCisjZGVmaW5lCUNBTl9FUlJfSVJRCQkJMHgwMDAwMDAwMQkvKiBDQU4gRXJyb3IgSW50ZXJydXB0IFJlcXVlc3QgKi8KKyNkZWZpbmUJRE1BOF9JUlEJCQkweDAwMDAwMDAyCS8qIERNQSBDaGFubmVsIDggKFNQT1JUMiBSWCkgSW50ZXJydXB0IFJlcXVlc3QgKi8KKyNkZWZpbmUJRE1BOV9JUlEJCQkweDAwMDAwMDA0CS8qIERNQSBDaGFubmVsIDkgKFNQT1JUMiBUWCkgSW50ZXJydXB0IFJlcXVlc3QgKi8KKyNkZWZpbmUJRE1BMTBfSVJRCQkJMHgwMDAwMDAwOAkvKiBETUEgQ2hhbm5lbCAxMCAoU1BPUlQzIFJYKSBJbnRlcnJ1cHQJUmVxdWVzdCAqLworI2RlZmluZQlETUExMV9JUlEJCQkweDAwMDAwMDEwCS8qIERNQSBDaGFubmVsIDExIChTUE9SVDMgVFgpIEludGVycnVwdAlSZXF1ZXN0ICovCisjZGVmaW5lCURNQTEyX0lSUQkJCTB4MDAwMDAwMjAJLyogRE1BIENoYW5uZWwgMTIgSW50ZXJydXB0IFJlcXVlc3QgKi8KKyNkZWZpbmUJRE1BMTNfSVJRCQkJMHgwMDAwMDA0MAkvKiBETUEgQ2hhbm5lbCAxMyBJbnRlcnJ1cHQgUmVxdWVzdCAqLworI2RlZmluZQlETUExNF9JUlEJCQkweDAwMDAwMDgwCS8qIERNQSBDaGFubmVsIDE0IChTUEkxKSBJbnRlcnJ1cHQgUmVxdWVzdCAqLworI2RlZmluZQlETUExNV9JUlEJCQkweDAwMDAwMTAwCS8qIERNQSBDaGFubmVsIDE1IChTUEkyKSBJbnRlcnJ1cHQgUmVxdWVzdCAqLworI2RlZmluZQlETUExNl9JUlEJCQkweDAwMDAwMjAwCS8qIERNQSBDaGFubmVsIDE2IChVQVJUMSBSWCkgSW50ZXJydXB0IFJlcXVlc3QgKi8KKyNkZWZpbmUJRE1BMTdfSVJRCQkJMHgwMDAwMDQwMAkvKiBETUEgQ2hhbm5lbCAxNyAoVUFSVDEgVFgpIEludGVycnVwdCBSZXF1ZXN0ICovCisjZGVmaW5lCURNQTE4X0lSUQkJCTB4MDAwMDA4MDAJLyogRE1BIENoYW5uZWwgMTggKFVBUlQyIFJYKSBJbnRlcnJ1cHQgUmVxdWVzdCAqLworI2RlZmluZQlETUExOV9JUlEJCQkweDAwMDAxMDAwCS8qIERNQSBDaGFubmVsIDE5IChVQVJUMiBUWCkgSW50ZXJydXB0IFJlcXVlc3QgKi8KKyNkZWZpbmUJVFdJMF9JUlEJCQkweDAwMDAyMDAwCS8qIFRXSTAJSW50ZXJydXB0IFJlcXVlc3QgKi8KKyNkZWZpbmUJVFdJMV9JUlEJCQkweDAwMDA0MDAwCS8qIFRXSTEJSW50ZXJydXB0IFJlcXVlc3QgKi8KKyNkZWZpbmUJQ0FOX1JYX0lSUQkJCTB4MDAwMDgwMDAJLyogQ0FOIFJlY2VpdmUgSW50ZXJydXB0IFJlcXVlc3QgKi8KKyNkZWZpbmUJQ0FOX1RYX0lSUQkJCTB4MDAwMTAwMDAJLyogQ0FOIFRyYW5zbWl0CUludGVycnVwdCBSZXF1ZXN0ICovCisjZGVmaW5lCU1ETUExXzBfSVJRCQkJMHgwMDAyMDAwMAkvKiBNZW1ETUExIFN0cmVhbSAwIEludGVycnVwdCBSZXF1ZXN0ICovCisjZGVmaW5lCU1ETUExXzFfSVJRCQkJMHgwMDA0MDAwMAkvKiBNZW1ETUExIFN0cmVhbSAxIEludGVycnVwdCBSZXF1ZXN0ICovCisjZGVmaW5lCU1YVlJfU1RBVF9JUlEJCQkweDAwMDgwMDAwCS8qIE1YVlIJU3RhdHVzIEludGVycnVwdCBSZXF1ZXN0ICovCisjZGVmaW5lCU1YVlJfQ01fSVJRCQkJMHgwMDEwMDAwMAkvKiBNWFZSCUNvbnRyb2wJTWVzc2FnZQlJbnRlcnJ1cHQgUmVxdWVzdCAqLworI2RlZmluZQlNWFZSX0FQX0lSUQkJCTB4MDAyMDAwMDAJLyogTVhWUglBc3luY2hyb25vdXMgUGFja2V0IEludGVycnVwdCAqLworCisvKiB0aGUgZm9sbG93aW5nIGFyZSBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgKi8KKyNkZWZpbmUJTURNQTBfSVJRCQlNRE1BMV8wX0lSUQorI2RlZmluZQlNRE1BMV9JUlEJCU1ETUExXzFfSVJRCisKKyNpZmRlZiBfTUlTUkFfUlVMRVMKKyNkZWZpbmUJX01GMTUgMHhGdQorI2RlZmluZQlfTUY3IDd1CisjZWxzZQorI2RlZmluZQlfTUYxNSAweEYKKyNkZWZpbmUJX01GNyA3CisjZW5kaWYgLyogX01JU1JBX1JVTEVTICovCisKKy8qIFNJQ19JTUFTS3ggTWFza3MJCQkJCQkJCQkJCSAqLworI2RlZmluZQlTSUNfVU5NQVNLX0FMTAkweDAwMDAwMDAwCQkJCQkvKiBVbm1hc2sgYWxsIHBlcmlwaGVyYWwgaW50ZXJydXB0cyAqLworI2RlZmluZQlTSUNfTUFTS19BTEwJMHhGRkZGRkZGRgkJCQkJLyogTWFzawlhbGwgcGVyaXBoZXJhbCBpbnRlcnJ1cHRzICovCisjaWZkZWYgX01JU1JBX1JVTEVTCisjZGVmaW5lCVNJQ19NQVNLKHgpCQkoMSA8PCAoKHgpJjB4MUZ1KSkJCQkJCS8qIE1hc2sJUGVyaXBoZXJhbCAjeCBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUJU0lDX1VOTUFTSyh4KQkoMHhGRkZGRkZGRnUgXiAoMSA8PCAoKHgpJjB4MUZ1KSkpCS8qIFVubWFzayBQZXJpcGhlcmFsICN4CWludGVycnVwdCAqLworI2Vsc2UKKyNkZWZpbmUJU0lDX01BU0soeCkJCSgxIDw8ICgoeCkmMHgxRikpCQkJCQkvKiBNYXNrCVBlcmlwaGVyYWwgI3ggaW50ZXJydXB0ICovCisjZGVmaW5lCVNJQ19VTk1BU0soeCkJKDB4RkZGRkZGRkYgXiAoMSA8PCAoKHgpJjB4MUYpKSkJLyogVW5tYXNrIFBlcmlwaGVyYWwgI3gJaW50ZXJydXB0ICovCisjZW5kaWYgLyogX01JU1JBX1JVTEVTICovCisKKy8qIFNJQ19JV1J4IE1hc2tzCQkJCQkJCQkJCQkgKi8KKyNkZWZpbmUJSVdSX0RJU0FCTEVfQUxMCTB4MDAwMDAwMDAJCQkJCS8qIFdha2V1cCBEaXNhYmxlIGFsbCBwZXJpcGhlcmFscyAqLworI2RlZmluZQlJV1JfRU5BQkxFX0FMTAkweEZGRkZGRkZGCQkJCQkvKiBXYWtldXAgRW5hYmxlIGFsbCBwZXJpcGhlcmFscyAqLworI2lmZGVmIF9NSVNSQV9SVUxFUworI2RlZmluZQlJV1JfRU5BQkxFKHgpCSgxIDw8ICgoeCkmMHgxRnUpKQkJCQkJLyogV2FrZXVwIEVuYWJsZSBQZXJpcGhlcmFsICN4ICovCisjZGVmaW5lCUlXUl9ESVNBQkxFKHgpCSgweEZGRkZGRkZGdSBeICgxIDw8ICgoeCkmMHgxRnUpKSkJLyogV2FrZXVwIERpc2FibGUgUGVyaXBoZXJhbCAjeCAqLworI2Vsc2UKKyNkZWZpbmUJSVdSX0VOQUJMRSh4KQkoMSA8PCAoKHgpJjB4MUYpKQkJCQkJLyogV2FrZXVwIEVuYWJsZSBQZXJpcGhlcmFsICN4ICovCisjZGVmaW5lCUlXUl9ESVNBQkxFKHgpCSgweEZGRkZGRkZGIF4gKDEgPDwgKCh4KSYweDFGKSkpCS8qIFdha2V1cCBEaXNhYmxlIFBlcmlwaGVyYWwgI3ggKi8KKyNlbmRpZiAvKiBfTUlTUkFfUlVMRVMgKi8KKworLyogICoqKioqKioqKiAgUEFSQUxMRUwJUEVSSVBIRVJBTCBJTlRFUkZBQ0UgKFBQSSkgTUFTS1MgKioqKioqKioqKioqKioqKiAgICovCisvKiAgUFBJX0NPTlRST0wJTWFza3MJICAgICAgKi8KKyNkZWZpbmUJUE9SVF9FTgkJMHgwMDAxCS8qIFBQSSBQb3J0IEVuYWJsZSAgKi8KKyNkZWZpbmUJUE9SVF9ESVIJMHgwMDAyCS8qIFBQSSBQb3J0IERpcmVjdGlvbgkgICAgKi8KKyNkZWZpbmUJWEZSX1RZUEUJMHgwMDBDCS8qIFBQSSBUcmFuc2ZlcglUeXBlICAqLworI2RlZmluZQlQT1JUX0NGRwkweDAwMzAJLyogUFBJIFBvcnQgQ29uZmlndXJhdGlvbiAqLworI2RlZmluZQlGTERfU0VMCQkweDAwNDAJLyogUFBJIEFjdGl2ZSBGaWVsZCBTZWxlY3QgKi8KKyNkZWZpbmUJUEFDS19FTgkJMHgwMDgwCS8qIFBQSSBQYWNraW5nIE1vZGUgKi8KKy8qIHByZXZpb3VzIHZlcnNpb25zIG9mCWRlZkJGNTM5LmggZXJyb25lb3VzbHkgaW5jbHVkZWQJRE1BMzIgKFBQSSAzMi1iaXQgRE1BIEVuYWJsZSkgKi8KKyNkZWZpbmUJU0tJUF9FTgkJMHgwMjAwCS8qIFBQSSBTa2lwIEVsZW1lbnQgRW5hYmxlICovCisjZGVmaW5lCVNLSVBfRU8JCTB4MDQwMAkvKiBQUEkgU2tpcCBFdmVuL09kZCBFbGVtZW50cyAqLworI2RlZmluZQlETEVOR1RICQkweDM4MDAJLyogUFBJIERhdGEgTGVuZ3RoICAqLworI2RlZmluZQlETEVOXzgJCTB4MAkgICAgIC8qCVBQSSBEYXRhIExlbmd0aAltYXNrIGZvciBETEVOPTggKi8KKyNkZWZpbmUJRExFTl8xMAkJMHgwODAwCQkvKiBEYXRhCUxlbmd0aCA9IDEwIEJpdHMgKi8KKyNkZWZpbmUJRExFTl8xMQkJMHgxMDAwCQkvKiBEYXRhCUxlbmd0aCA9IDExIEJpdHMgKi8KKyNkZWZpbmUJRExFTl8xMgkJMHgxODAwCQkvKiBEYXRhCUxlbmd0aCA9IDEyIEJpdHMgKi8KKyNkZWZpbmUJRExFTl8xMwkJMHgyMDAwCQkvKiBEYXRhCUxlbmd0aCA9IDEzIEJpdHMgKi8KKyNkZWZpbmUJRExFTl8xNAkJMHgyODAwCQkvKiBEYXRhCUxlbmd0aCA9IDE0IEJpdHMgKi8KKyNkZWZpbmUJRExFTl8xNQkJMHgzMDAwCQkvKiBEYXRhCUxlbmd0aCA9IDE1IEJpdHMgKi8KKyNkZWZpbmUJRExFTl8xNgkJMHgzODAwCQkvKiBEYXRhCUxlbmd0aCA9IDE2IEJpdHMgKi8KKyNpZmRlZiBfTUlTUkFfUlVMRVMKKyNkZWZpbmUJRExFTih4KQkJKCgoKHgpLTl1KSAmIDB4MDd1KSA8PCAxMSkgIC8qIFBQSSBEYXRhCUxlbmd0aCAob25seSB3b3JrcyBmb3IgeD0xMC0tPng9MTYpICovCisjZWxzZQorI2RlZmluZQlETEVOKHgpCQkoKCgoeCktOSkgJiAweDA3KSA8PCAxMSkgIC8qIFBQSSBEYXRhIExlbmd0aCAob25seSB3b3JrcyBmb3IgeD0xMC0tPng9MTYpICovCisjZW5kaWYgLyogX01JU1JBX1JVTEVTICovCisjZGVmaW5lCVBPTAkJCTB4QzAwMAkvKiBQUEkgU2lnbmFsIFBvbGFyaXRpZXMgICAgICAgKi8KKyNkZWZpbmUJUE9MQwkJMHg0MDAwCQkvKiBQUEkgQ2xvY2sgUG9sYXJpdHkgKi8KKyNkZWZpbmUJUE9MUwkJMHg4MDAwCQkvKiBQUEkgRnJhbWUgU3luYyBQb2xhcml0eSAqLworCisKKy8qIFBQSV9TVEFUVVMgTWFza3MJCQkJCSAgICAgKi8KKyNkZWZpbmUJRkxECQkJMHgwNDAwCS8qIEZpZWxkIEluZGljYXRvciAgICovCisjZGVmaW5lCUZUX0VSUgkJMHgwODAwCS8qIEZyYW1lIFRyYWNrIEVycm9yICovCisjZGVmaW5lCU9WUgkJCTB4MTAwMAkvKiBGSUZPCU92ZXJmbG93IEVycm9yICovCisjZGVmaW5lCVVORFIJCTB4MjAwMAkvKiBGSUZPCVVuZGVycnVuIEVycm9yICovCisjZGVmaW5lCUVSUl9ERVQJCTB4NDAwMAkvKiBFcnJvciBEZXRlY3RlZCBJbmRpY2F0b3IgKi8KKyNkZWZpbmUJRVJSX05DT1IJMHg4MDAwCS8qIEVycm9yIE5vdCBDb3JyZWN0ZWQgSW5kaWNhdG9yICovCisKKworLyogKioqKioqKioqKiAgRE1BIENPTlRST0xMRVIgTUFTS1MgICoqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBETUF4X1BFUklQSEVSQUxfTUFQLAlNRE1BX3l5X1BFUklQSEVSQUxfTUFQIE1hc2tzICovCisKKyNkZWZpbmUJQ1RZUEUJCQkweDAwNDAJLyogRE1BIENoYW5uZWwgVHlwZSBJbmRpY2F0b3IgKi8KKyNkZWZpbmUJQ1RZUEVfUAkJCTB4NgkJLyogRE1BIENoYW5uZWwgVHlwZSBJbmRpY2F0b3IgQklUIFBPU0lUSU9OICovCisjZGVmaW5lCVBDQVA4CQkJMHgwMDgwCS8qIERNQSA4LWJpdCBPcGVyYXRpb24gSW5kaWNhdG9yICAgKi8KKyNkZWZpbmUJUENBUDE2CQkJMHgwMTAwCS8qIERNQSAxNi1iaXQgT3BlcmF0aW9uCUluZGljYXRvciAqLworI2RlZmluZQlQQ0FQMzIJCQkweDAyMDAJLyogRE1BIDMyLWJpdCBPcGVyYXRpb24JSW5kaWNhdG9yICovCisjZGVmaW5lCVBDQVBXUgkJCTB4MDQwMAkvKiBETUEgV3JpdGUgT3BlcmF0aW9uIEluZGljYXRvciAqLworI2RlZmluZQlQQ0FQUkQJCQkweDA4MDAJLyogRE1BIFJlYWQgT3BlcmF0aW9uIEluZGljYXRvciAqLworI2RlZmluZQlQTUFQCQkJMHhGMDAwCS8qIERNQSBQZXJpcGhlcmFsIE1hcCBGaWVsZCAqLworCisvKiBQTUFQCUVuY29kaW5ncyBGb3IgRE1BIENvbnRyb2xsZXIgMCAqLworI2RlZmluZQlQTUFQX1BQSQkJMHgwMDAwCS8qIFBNQVAJUFBJIFBvcnQgRE1BICovCisjZGVmaW5lCVBNQVBfU1BPUlQwUlgJMHgxMDAwCS8qIFBNQVAJU1BPUlQwIFJlY2VpdmUgRE1BICovCisjZGVmaW5lCVBNQVBfU1BPUlQwVFgJMHgyMDAwCS8qIFBNQVAJU1BPUlQwIFRyYW5zbWl0CURNQSAqLworI2RlZmluZQlQTUFQX1NQT1JUMVJYCTB4MzAwMAkvKiBQTUFQCVNQT1JUMSBSZWNlaXZlIERNQSAqLworI2RlZmluZQlQTUFQX1NQT1JUMVRYCTB4NDAwMAkvKiBQTUFQCVNQT1JUMSBUcmFuc21pdAlETUEgKi8KKyNkZWZpbmUJUE1BUF9TUEkwCQkweDUwMDAJLyogUE1BUAlTUEkgRE1BICovCisjZGVmaW5lCVBNQVBfVUFSVDBSWAkJMHg2MDAwCS8qIFBNQVAJVUFSVCBSZWNlaXZlIERNQSAqLworI2RlZmluZQlQTUFQX1VBUlQwVFgJCTB4NzAwMAkvKiBQTUFQCVVBUlQgVHJhbnNtaXQgRE1BICovCisKKy8qIFBNQVAJRW5jb2RpbmdzIEZvciBETUEgQ29udHJvbGxlciAxICovCisjZGVmaW5lCVBNQVBfU1BPUlQyUlgJICAgIDB4MDAwMCAgLyogUE1BUCBTUE9SVDIgUmVjZWl2ZSBETUEgKi8KKyNkZWZpbmUJUE1BUF9TUE9SVDJUWAkgICAgMHgxMDAwICAvKiBQTUFQIFNQT1JUMiBUcmFuc21pdCBETUEgKi8KKyNkZWZpbmUJUE1BUF9TUE9SVDNSWAkgICAgMHgyMDAwICAvKiBQTUFQIFNQT1JUMyBSZWNlaXZlIERNQSAqLworI2RlZmluZQlQTUFQX1NQT1JUM1RYCSAgICAweDMwMDAgIC8qIFBNQVAgU1BPUlQzIFRyYW5zbWl0IERNQSAqLworI2RlZmluZQlQTUFQX1NQSTEJICAgIDB4NjAwMCAgLyogUE1BUCBTUEkxIERNQSAqLworI2RlZmluZQlQTUFQX1NQSTIJICAgIDB4NzAwMCAgLyogUE1BUCBTUEkyIERNQSAqLworI2RlZmluZQlQTUFQX1VBUlQxUlgJICAgIDB4ODAwMCAgLyogUE1BUCBVQVJUMSBSZWNlaXZlIERNQSAqLworI2RlZmluZQlQTUFQX1VBUlQxVFgJICAgIDB4OTAwMCAgLyogUE1BUCBVQVJUMSBUcmFuc21pdCBETUEgKi8KKyNkZWZpbmUJUE1BUF9VQVJUMlJYCSAgICAweEEwMDAgIC8qIFBNQVAgVUFSVDIgUmVjZWl2ZSBETUEgKi8KKyNkZWZpbmUJUE1BUF9VQVJUMlRYCSAgICAweEIwMDAgIC8qIFBNQVAgVUFSVDIgVHJhbnNtaXQgRE1BICovCisKKworLyogICoqKioqKioqKioqKiogIEdFTkVSQUwgUFVSUE9TRSBUSU1FUiBNQVNLUwkqKioqKioqKioqKioqKioqKioqKiAqLworLyogUFdNIFRpbWVyIGJpdCBkZWZpbml0aW9ucyAqLworLyogVElNRVJfRU5BQkxFCVJlZ2lzdGVyICovCisjZGVmaW5lCVRJTUVOMAkJCTB4MDAwMQkvKiBFbmFibGUgVGltZXIJMCAqLworI2RlZmluZQlUSU1FTjEJCQkweDAwMDIJLyogRW5hYmxlIFRpbWVyCTEgKi8KKyNkZWZpbmUJVElNRU4yCQkJMHgwMDA0CS8qIEVuYWJsZSBUaW1lcgkyICovCisKKyNkZWZpbmUJVElNRU4wX1AJCTB4MDAKKyNkZWZpbmUJVElNRU4xX1AJCTB4MDEKKyNkZWZpbmUJVElNRU4yX1AJCTB4MDIKKworLyogVElNRVJfRElTQUJMRSBSZWdpc3RlciAqLworI2RlZmluZQlUSU1ESVMwCQkJMHgwMDAxCS8qIERpc2FibGUgVGltZXIgMCAqLworI2RlZmluZQlUSU1ESVMxCQkJMHgwMDAyCS8qIERpc2FibGUgVGltZXIgMSAqLworI2RlZmluZQlUSU1ESVMyCQkJMHgwMDA0CS8qIERpc2FibGUgVGltZXIgMiAqLworCisjZGVmaW5lCVRJTURJUzBfUAkJMHgwMAorI2RlZmluZQlUSU1ESVMxX1AJCTB4MDEKKyNkZWZpbmUJVElNRElTMl9QCQkweDAyCisKKy8qIFRJTUVSX1NUQVRVUwlSZWdpc3RlciAqLworI2RlZmluZQlUSU1JTDAJCQkweDAwMDEJLyogVGltZXIgMCBJbnRlcnJ1cHQgKi8KKyNkZWZpbmUJVElNSUwxCQkJMHgwMDAyCS8qIFRpbWVyIDEgSW50ZXJydXB0ICovCisjZGVmaW5lCVRJTUlMMgkJCTB4MDAwNAkvKiBUaW1lciAyIEludGVycnVwdCAqLworI2RlZmluZQlUT1ZGX0VSUjAJCTB4MDAxMAkvKiBUaW1lciAwIENvdW50ZXIgT3ZlcmZsb3cgKi8KKyNkZWZpbmUJVE9WRl9FUlIxCQkweDAwMjAJLyogVGltZXIgMSBDb3VudGVyIE92ZXJmbG93ICovCisjZGVmaW5lCVRPVkZfRVJSMgkJMHgwMDQwCS8qIFRpbWVyIDIgQ291bnRlciBPdmVyZmxvdyAqLworI2RlZmluZQlUUlVOMAkJCTB4MTAwMAkvKiBUaW1lciAwIFNsYXZlIEVuYWJsZQlTdGF0dXMgKi8KKyNkZWZpbmUJVFJVTjEJCQkweDIwMDAJLyogVGltZXIgMSBTbGF2ZSBFbmFibGUJU3RhdHVzICovCisjZGVmaW5lCVRSVU4yCQkJMHg0MDAwCS8qIFRpbWVyIDIgU2xhdmUgRW5hYmxlCVN0YXR1cyAqLworCisjZGVmaW5lCVRJTUlMMF9QCQkweDAwCisjZGVmaW5lCVRJTUlMMV9QCQkweDAxCisjZGVmaW5lCVRJTUlMMl9QCQkweDAyCisjZGVmaW5lCVRPVkZfRVJSMF9QCQkweDA0CisjZGVmaW5lCVRPVkZfRVJSMV9QCQkweDA1CisjZGVmaW5lCVRPVkZfRVJSMl9QCQkweDA2CisjZGVmaW5lCVRSVU4wX1AJCQkweDBDCisjZGVmaW5lCVRSVU4xX1AJCQkweDBECisjZGVmaW5lCVRSVU4yX1AJCQkweDBFCisKKy8qIEFsdGVybmF0ZSBEZXByZWNhdGVkCU1hY3JvcyBQcm92aWRlZAlGb3IgQmFja3dhcmRzIENvZGUgQ29tcGF0aWJpbGl0eSAqLworI2RlZmluZQlUT1ZMX0VSUjAJCVRPVkZfRVJSMAorI2RlZmluZQlUT1ZMX0VSUjEJCVRPVkZfRVJSMQorI2RlZmluZQlUT1ZMX0VSUjIJCVRPVkZfRVJSMgorI2RlZmluZQlUT1ZMX0VSUjBfUAkJVE9WRl9FUlIwX1AKKyNkZWZpbmUJVE9WTF9FUlIxX1AJVE9WRl9FUlIxX1AKKyNkZWZpbmUJVE9WTF9FUlIyX1AJVE9WRl9FUlIyX1AKKworLyogVElNRVJ4X0NPTkZJRyBSZWdpc3RlcnMgKi8KKyNkZWZpbmUJUFdNX09VVAkJCTB4MDAwMQorI2RlZmluZQlXRFRIX0NBUAkJMHgwMDAyCisjZGVmaW5lCUVYVF9DTEsJCQkweDAwMDMKKyNkZWZpbmUJUFVMU0VfSEkJCTB4MDAwNAorI2RlZmluZQlQRVJJT0RfQ05UCQkweDAwMDgKKyNkZWZpbmUJSVJRX0VOQQkJCTB4MDAxMAorI2RlZmluZQlUSU5fU0VMCQkJMHgwMDIwCisjZGVmaW5lCU9VVF9ESVMJCQkweDAwNDAKKyNkZWZpbmUJQ0xLX1NFTAkJCTB4MDA4MAorI2RlZmluZQlUT0dHTEVfSEkJCTB4MDEwMAorI2RlZmluZQlFTVVfUlVOCQkJMHgwMjAwCisjaWZkZWYgX01JU1JBX1JVTEVTCisjZGVmaW5lCUVSUl9UWVAoeCkJCSgoKHgpICYJMHgwM3UpIDw8IDE0KQorI2Vsc2UKKyNkZWZpbmUJRVJSX1RZUCh4KQkJKCgoeCkgJgkweDAzKSA8PCAxNCkKKyNlbmRpZiAvKiBfTUlTUkFfUlVMRVMgKi8KKworI2RlZmluZQlUTU9ERV9QMAkJMHgwMAorI2RlZmluZQlUTU9ERV9QMQkJMHgwMQorI2RlZmluZQlQVUxTRV9ISV9QCQkweDAyCisjZGVmaW5lCVBFUklPRF9DTlRfUAkweDAzCisjZGVmaW5lCUlSUV9FTkFfUAkJMHgwNAorI2RlZmluZQlUSU5fU0VMX1AJCTB4MDUKKyNkZWZpbmUJT1VUX0RJU19QCQkweDA2CisjZGVmaW5lCUNMS19TRUxfUAkJMHgwNworI2RlZmluZQlUT0dHTEVfSElfUAkJMHgwOAorI2RlZmluZQlFTVVfUlVOX1AJCTB4MDkKKyNkZWZpbmUJRVJSX1RZUF9QMAkJMHgwRQorI2RlZmluZQlFUlJfVFlQX1AxCQkweDBGCisKKy8qICoqKioqKioqKioqKioqKioqKioqKiAgQVNZTkNIUk9OT1VTIE1FTU9SWSBDT05UUk9MTEVSIE1BU0tTCSoqKioqKioqKioqKiogKi8KKy8qIEVCSVVfQU1HQ1RMIE1hc2tzICovCisjZGVmaW5lCUFNQ0tFTgkJMHgwMDAxCS8qIEVuYWJsZSBDTEtPVVQgKi8KKyNkZWZpbmUJQU1CRU5fTk9ORQkweDAwMDAJLyogQWxsIEJhbmtzIERpc2FibGVkICovCisjZGVmaW5lCUFNQkVOX0IwCTB4MDAwMgkvKiBFbmFibGUgQXN5bmNocm9ub3VzIE1lbW9yeSBCYW5rIDAgb25seSAqLworI2RlZmluZQlBTUJFTl9CMF9CMQkweDAwMDQJLyogRW5hYmxlIEFzeW5jaHJvbm91cyBNZW1vcnkgQmFua3MgMCAmCTEgb25seSAqLworI2RlZmluZQlBTUJFTl9CMF9CMV9CMgkweDAwMDYJLyogRW5hYmxlIEFzeW5jaHJvbm91cyBNZW1vcnkgQmFua3MgMCwgMSwgYW5kIDIgKi8KKyNkZWZpbmUJQU1CRU5fQUxMCTB4MDAwOAkvKiBFbmFibGUgQXN5bmNocm9ub3VzIE1lbW9yeSBCYW5rcyAoYWxsKSAwLCAxLAkyLCBhbmQgMyAqLworI2RlZmluZQlDRFBSSU8JCTB4MDEwMAkvKiBETUEgaGFzIHByaW9yaXR5IG92ZXIgY29yZSBmb3IgZXh0ZXJuYWwgYWNjZXNzZXMgKi8KKworLyogRUJJVV9BTUdDVEwgQml0IFBvc2l0aW9ucyAqLworI2RlZmluZQlBTUNLRU5fUAkJMHgwMDAwCS8qIEVuYWJsZSBDTEtPVVQgKi8KKyNkZWZpbmUJQU1CRU5fUDAJCTB4MDAwMQkvKiBBc3luY2hyb25vdXMJTWVtb3J5IEVuYWJsZSwgMDAwIC0gYmFua3MgMC0zIGRpc2FibGVkLCAwMDEgLSBCYW5rIDAgZW5hYmxlZCAqLworI2RlZmluZQlBTUJFTl9QMQkJMHgwMDAyCS8qIEFzeW5jaHJvbm91cwlNZW1vcnkgRW5hYmxlLCAwMTAgLSBiYW5rcyAwJjEgZW5hYmxlZCwJIDAxMSAtIGJhbmtzIDAtMyBlbmFibGVkICovCisjZGVmaW5lCUFNQkVOX1AyCQkweDAwMDMJLyogQXN5bmNocm9ub3VzCU1lbW9yeSBFbmFibGUsIDF4eCAtIEFsbCBiYW5rcyAoYmFuayAwLAkxLCAyLCBhbmQgMykgZW5hYmxlZCAqLworCisvKiBFQklVX0FNQkNUTDAJTWFza3MgKi8KKyNkZWZpbmUJQjBSRFlFTgkJCTB4MDAwMDAwMDEgIC8qIEJhbmsgMCBSRFkgRW5hYmxlLCAwPWRpc2FibGUsIDE9ZW5hYmxlICovCisjZGVmaW5lCUIwUkRZUE9MCQkweDAwMDAwMDAyICAvKiBCYW5rIDAgUkRZIEFjdGl2ZSBoaWdoLCAwPWFjdGl2ZQlsb3csIDE9YWN0aXZlIGhpZ2ggKi8KKyNkZWZpbmUJQjBUVF8xCQkJMHgwMDAwMDAwNCAgLyogQmFuayAwIFRyYW5zaXRpb24gVGltZSBmcm9tIFJlYWQJdG8gV3JpdGUgPSAxIGN5Y2xlICovCisjZGVmaW5lCUIwVFRfMgkJCTB4MDAwMDAwMDggIC8qIEJhbmsgMCBUcmFuc2l0aW9uIFRpbWUgZnJvbSBSZWFkCXRvIFdyaXRlID0gMiBjeWNsZXMgKi8KKyNkZWZpbmUJQjBUVF8zCQkJMHgwMDAwMDAwQyAgLyogQmFuayAwIFRyYW5zaXRpb24gVGltZSBmcm9tIFJlYWQJdG8gV3JpdGUgPSAzIGN5Y2xlcyAqLworI2RlZmluZQlCMFRUXzQJCQkweDAwMDAwMDAwICAvKiBCYW5rIDAgVHJhbnNpdGlvbiBUaW1lIGZyb20gUmVhZAl0byBXcml0ZSA9IDQgY3ljbGVzICovCisjZGVmaW5lCUIwU1RfMQkJCTB4MDAwMDAwMTAgIC8qIEJhbmsgMCBTZXR1cCBUaW1lIGZyb20gQU9FIGFzc2VydGVkIHRvIFJlYWQvV3JpdGUgYXNzZXJ0ZWQ9MSBjeWNsZSAqLworI2RlZmluZQlCMFNUXzIJCQkweDAwMDAwMDIwICAvKiBCYW5rIDAgU2V0dXAgVGltZSBmcm9tIEFPRSBhc3NlcnRlZCB0byBSZWFkL1dyaXRlIGFzc2VydGVkPTIgY3ljbGVzICovCisjZGVmaW5lCUIwU1RfMwkJCTB4MDAwMDAwMzAgIC8qIEJhbmsgMCBTZXR1cCBUaW1lIGZyb20gQU9FIGFzc2VydGVkIHRvIFJlYWQvV3JpdGUgYXNzZXJ0ZWQ9MyBjeWNsZXMgKi8KKyNkZWZpbmUJQjBTVF80CQkJMHgwMDAwMDAwMCAgLyogQmFuayAwIFNldHVwIFRpbWUgZnJvbSBBT0UgYXNzZXJ0ZWQgdG8gUmVhZC9Xcml0ZSBhc3NlcnRlZD00IGN5Y2xlcyAqLworI2RlZmluZQlCMEhUXzEJCQkweDAwMDAwMDQwICAvKiBCYW5rIDAgSG9sZCBUaW1lCWZyb20gUmVhZC9Xcml0ZQlkZWFzc2VydGVkIHRvIEFPRSBkZWFzc2VydGVkID0gMSBjeWNsZSAqLworI2RlZmluZQlCMEhUXzIJCQkweDAwMDAwMDgwICAvKiBCYW5rIDAgSG9sZCBUaW1lCWZyb20gUmVhZC9Xcml0ZQlkZWFzc2VydGVkIHRvIEFPRSBkZWFzc2VydGVkID0gMiBjeWNsZXMgKi8KKyNkZWZpbmUJQjBIVF8zCQkJMHgwMDAwMDBDMCAgLyogQmFuayAwIEhvbGQgVGltZQlmcm9tIFJlYWQvV3JpdGUJZGVhc3NlcnRlZCB0byBBT0UgZGVhc3NlcnRlZCA9IDMgY3ljbGVzICovCisjZGVmaW5lCUIwSFRfMAkJCTB4MDAwMDAwMDAgIC8qIEJhbmsgMCBIb2xkIFRpbWUJZnJvbSBSZWFkL1dyaXRlCWRlYXNzZXJ0ZWQgdG8gQU9FIGRlYXNzZXJ0ZWQgPSAwIGN5Y2xlcyAqLworI2RlZmluZQlCMFJBVF8xCQkJMHgwMDAwMDEwMCAgLyogQmFuayAwIFJlYWQgQWNjZXNzIFRpbWUgPSAxIGN5Y2xlICovCisjZGVmaW5lCUIwUkFUXzIJCQkweDAwMDAwMjAwICAvKiBCYW5rIDAgUmVhZCBBY2Nlc3MgVGltZSA9IDIgY3ljbGVzICovCisjZGVmaW5lCUIwUkFUXzMJCQkweDAwMDAwMzAwICAvKiBCYW5rIDAgUmVhZCBBY2Nlc3MgVGltZSA9IDMgY3ljbGVzICovCisjZGVmaW5lCUIwUkFUXzQJCQkweDAwMDAwNDAwICAvKiBCYW5rIDAgUmVhZCBBY2Nlc3MgVGltZSA9IDQgY3ljbGVzICovCisjZGVmaW5lCUIwUkFUXzUJCQkweDAwMDAwNTAwICAvKiBCYW5rIDAgUmVhZCBBY2Nlc3MgVGltZSA9IDUgY3ljbGVzICovCisjZGVmaW5lCUIwUkFUXzYJCQkweDAwMDAwNjAwICAvKiBCYW5rIDAgUmVhZCBBY2Nlc3MgVGltZSA9IDYgY3ljbGVzICovCisjZGVmaW5lCUIwUkFUXzcJCQkweDAwMDAwNzAwICAvKiBCYW5rIDAgUmVhZCBBY2Nlc3MgVGltZSA9IDcgY3ljbGVzICovCisjZGVmaW5lCUIwUkFUXzgJCQkweDAwMDAwODAwICAvKiBCYW5rIDAgUmVhZCBBY2Nlc3MgVGltZSA9IDggY3ljbGVzICovCisjZGVmaW5lCUIwUkFUXzkJCQkweDAwMDAwOTAwICAvKiBCYW5rIDAgUmVhZCBBY2Nlc3MgVGltZSA9IDkgY3ljbGVzICovCisjZGVmaW5lCUIwUkFUXzEwCQkweDAwMDAwQTAwICAvKiBCYW5rIDAgUmVhZCBBY2Nlc3MgVGltZSA9IDEwIGN5Y2xlcyAqLworI2RlZmluZQlCMFJBVF8xMQkJMHgwMDAwMEIwMCAgLyogQmFuayAwIFJlYWQgQWNjZXNzIFRpbWUgPSAxMSBjeWNsZXMgKi8KKyNkZWZpbmUJQjBSQVRfMTIJCTB4MDAwMDBDMDAgIC8qIEJhbmsgMCBSZWFkIEFjY2VzcyBUaW1lID0gMTIgY3ljbGVzICovCisjZGVmaW5lCUIwUkFUXzEzCQkweDAwMDAwRDAwICAvKiBCYW5rIDAgUmVhZCBBY2Nlc3MgVGltZSA9IDEzIGN5Y2xlcyAqLworI2RlZmluZQlCMFJBVF8xNAkJMHgwMDAwMEUwMCAgLyogQmFuayAwIFJlYWQgQWNjZXNzIFRpbWUgPSAxNCBjeWNsZXMgKi8KKyNkZWZpbmUJQjBSQVRfMTUJCTB4MDAwMDBGMDAgIC8qIEJhbmsgMCBSZWFkIEFjY2VzcyBUaW1lID0gMTUgY3ljbGVzICovCisjZGVmaW5lCUIwV0FUXzEJCQkweDAwMDAxMDAwICAvKiBCYW5rIDAgV3JpdGUgQWNjZXNzIFRpbWUJPSAxIGN5Y2xlICovCisjZGVmaW5lCUIwV0FUXzIJCQkweDAwMDAyMDAwICAvKiBCYW5rIDAgV3JpdGUgQWNjZXNzIFRpbWUJPSAyIGN5Y2xlcyAqLworI2RlZmluZQlCMFdBVF8zCQkJMHgwMDAwMzAwMCAgLyogQmFuayAwIFdyaXRlIEFjY2VzcyBUaW1lCT0gMyBjeWNsZXMgKi8KKyNkZWZpbmUJQjBXQVRfNAkJCTB4MDAwMDQwMDAgIC8qIEJhbmsgMCBXcml0ZSBBY2Nlc3MgVGltZQk9IDQgY3ljbGVzICovCisjZGVmaW5lCUIwV0FUXzUJCQkweDAwMDA1MDAwICAvKiBCYW5rIDAgV3JpdGUgQWNjZXNzIFRpbWUJPSA1IGN5Y2xlcyAqLworI2RlZmluZQlCMFdBVF82CQkJMHgwMDAwNjAwMCAgLyogQmFuayAwIFdyaXRlIEFjY2VzcyBUaW1lCT0gNiBjeWNsZXMgKi8KKyNkZWZpbmUJQjBXQVRfNwkJCTB4MDAwMDcwMDAgIC8qIEJhbmsgMCBXcml0ZSBBY2Nlc3MgVGltZQk9IDcgY3ljbGVzICovCisjZGVmaW5lCUIwV0FUXzgJCQkweDAwMDA4MDAwICAvKiBCYW5rIDAgV3JpdGUgQWNjZXNzIFRpbWUJPSA4IGN5Y2xlcyAqLworI2RlZmluZQlCMFdBVF85CQkJMHgwMDAwOTAwMCAgLyogQmFuayAwIFdyaXRlIEFjY2VzcyBUaW1lCT0gOSBjeWNsZXMgKi8KKyNkZWZpbmUJQjBXQVRfMTAJCTB4MDAwMEEwMDAgIC8qIEJhbmsgMCBXcml0ZSBBY2Nlc3MgVGltZQk9IDEwIGN5Y2xlcyAqLworI2RlZmluZQlCMFdBVF8xMQkJMHgwMDAwQjAwMCAgLyogQmFuayAwIFdyaXRlIEFjY2VzcyBUaW1lCT0gMTEgY3ljbGVzICovCisjZGVmaW5lCUIwV0FUXzEyCQkweDAwMDBDMDAwICAvKiBCYW5rIDAgV3JpdGUgQWNjZXNzIFRpbWUJPSAxMiBjeWNsZXMgKi8KKyNkZWZpbmUJQjBXQVRfMTMJCTB4MDAwMEQwMDAgIC8qIEJhbmsgMCBXcml0ZSBBY2Nlc3MgVGltZQk9IDEzIGN5Y2xlcyAqLworI2RlZmluZQlCMFdBVF8xNAkJMHgwMDAwRTAwMCAgLyogQmFuayAwIFdyaXRlIEFjY2VzcyBUaW1lCT0gMTQgY3ljbGVzICovCisjZGVmaW5lCUIwV0FUXzE1CQkweDAwMDBGMDAwICAvKiBCYW5rIDAgV3JpdGUgQWNjZXNzIFRpbWUJPSAxNSBjeWNsZXMgKi8KKyNkZWZpbmUJQjFSRFlFTgkJCTB4MDAwMTAwMDAgIC8qIEJhbmsgMSBSRFkgZW5hYmxlLCAwPWRpc2FibGUsIDE9ZW5hYmxlICovCisjZGVmaW5lCUIxUkRZUE9MCQkweDAwMDIwMDAwICAvKiBCYW5rIDEgUkRZIEFjdGl2ZSBoaWdoLCAwPWFjdGl2ZQlsb3csIDE9YWN0aXZlIGhpZ2ggKi8KKyNkZWZpbmUJQjFUVF8xCQkJMHgwMDA0MDAwMCAgLyogQmFuayAxIFRyYW5zaXRpb24gVGltZSBmcm9tIFJlYWQJdG8gV3JpdGUgPSAxIGN5Y2xlICovCisjZGVmaW5lCUIxVFRfMgkJCTB4MDAwODAwMDAgIC8qIEJhbmsgMSBUcmFuc2l0aW9uIFRpbWUgZnJvbSBSZWFkCXRvIFdyaXRlID0gMiBjeWNsZXMgKi8KKyNkZWZpbmUJQjFUVF8zCQkJMHgwMDBDMDAwMCAgLyogQmFuayAxIFRyYW5zaXRpb24gVGltZSBmcm9tIFJlYWQJdG8gV3JpdGUgPSAzIGN5Y2xlcyAqLworI2RlZmluZQlCMVRUXzQJCQkweDAwMDAwMDAwICAvKiBCYW5rIDEgVHJhbnNpdGlvbiBUaW1lIGZyb20gUmVhZAl0byBXcml0ZSA9IDQgY3ljbGVzICovCisjZGVmaW5lCUIxU1RfMQkJCTB4MDAxMDAwMDAgIC8qIEJhbmsgMSBTZXR1cCBUaW1lIGZyb20gQU9FIGFzc2VydGVkIHRvIFJlYWQgb3IgV3JpdGUgYXNzZXJ0ZWQgPSAxIGN5Y2xlICovCisjZGVmaW5lCUIxU1RfMgkJCTB4MDAyMDAwMDAgIC8qIEJhbmsgMSBTZXR1cCBUaW1lIGZyb20gQU9FIGFzc2VydGVkIHRvIFJlYWQgb3IgV3JpdGUgYXNzZXJ0ZWQgPSAyIGN5Y2xlcyAqLworI2RlZmluZQlCMVNUXzMJCQkweDAwMzAwMDAwICAvKiBCYW5rIDEgU2V0dXAgVGltZSBmcm9tIEFPRSBhc3NlcnRlZCB0byBSZWFkIG9yIFdyaXRlIGFzc2VydGVkID0gMyBjeWNsZXMgKi8KKyNkZWZpbmUJQjFTVF80CQkJMHgwMDAwMDAwMCAgLyogQmFuayAxIFNldHVwIFRpbWUgZnJvbSBBT0UgYXNzZXJ0ZWQgdG8gUmVhZCBvciBXcml0ZSBhc3NlcnRlZCA9IDQgY3ljbGVzICovCisjZGVmaW5lCUIxSFRfMQkJCTB4MDA0MDAwMDAgIC8qIEJhbmsgMSBIb2xkIFRpbWUJZnJvbSBSZWFkIG9yIFdyaXRlIGRlYXNzZXJ0ZWQgdG8gQU9FIGRlYXNzZXJ0ZWQJPSAxIGN5Y2xlICovCisjZGVmaW5lCUIxSFRfMgkJCTB4MDA4MDAwMDAgIC8qIEJhbmsgMSBIb2xkIFRpbWUJZnJvbSBSZWFkIG9yIFdyaXRlIGRlYXNzZXJ0ZWQgdG8gQU9FIGRlYXNzZXJ0ZWQJPSAyIGN5Y2xlcyAqLworI2RlZmluZQlCMUhUXzMJCQkweDAwQzAwMDAwICAvKiBCYW5rIDEgSG9sZCBUaW1lCWZyb20gUmVhZCBvciBXcml0ZSBkZWFzc2VydGVkIHRvIEFPRSBkZWFzc2VydGVkCT0gMyBjeWNsZXMgKi8KKyNkZWZpbmUJQjFIVF8wCQkJMHgwMDAwMDAwMCAgLyogQmFuayAxIEhvbGQgVGltZQlmcm9tIFJlYWQgb3IgV3JpdGUgZGVhc3NlcnRlZCB0byBBT0UgZGVhc3NlcnRlZAk9IDAgY3ljbGVzICovCisjZGVmaW5lCUIxUkFUXzEJCQkweDAxMDAwMDAwICAvKiBCYW5rIDEgUmVhZCBBY2Nlc3MgVGltZSA9IDEgY3ljbGUgKi8KKyNkZWZpbmUJQjFSQVRfMgkJCTB4MDIwMDAwMDAgIC8qIEJhbmsgMSBSZWFkIEFjY2VzcyBUaW1lID0gMiBjeWNsZXMgKi8KKyNkZWZpbmUJQjFSQVRfMwkJCTB4MDMwMDAwMDAgIC8qIEJhbmsgMSBSZWFkIEFjY2VzcyBUaW1lID0gMyBjeWNsZXMgKi8KKyNkZWZpbmUJQjFSQVRfNAkJCTB4MDQwMDAwMDAgIC8qIEJhbmsgMSBSZWFkIEFjY2VzcyBUaW1lID0gNCBjeWNsZXMgKi8KKyNkZWZpbmUJQjFSQVRfNQkJCTB4MDUwMDAwMDAgIC8qIEJhbmsgMSBSZWFkIEFjY2VzcyBUaW1lID0gNSBjeWNsZXMgKi8KKyNkZWZpbmUJQjFSQVRfNgkJCTB4MDYwMDAwMDAgIC8qIEJhbmsgMSBSZWFkIEFjY2VzcyBUaW1lID0gNiBjeWNsZXMgKi8KKyNkZWZpbmUJQjFSQVRfNwkJCTB4MDcwMDAwMDAgIC8qIEJhbmsgMSBSZWFkIEFjY2VzcyBUaW1lID0gNyBjeWNsZXMgKi8KKyNkZWZpbmUJQjFSQVRfOAkJCTB4MDgwMDAwMDAgIC8qIEJhbmsgMSBSZWFkIEFjY2VzcyBUaW1lID0gOCBjeWNsZXMgKi8KKyNkZWZpbmUJQjFSQVRfOQkJCTB4MDkwMDAwMDAgIC8qIEJhbmsgMSBSZWFkIEFjY2VzcyBUaW1lID0gOSBjeWNsZXMgKi8KKyNkZWZpbmUJQjFSQVRfMTAJCTB4MEEwMDAwMDAgIC8qIEJhbmsgMSBSZWFkIEFjY2VzcyBUaW1lID0gMTAgY3ljbGVzICovCisjZGVmaW5lCUIxUkFUXzExCQkweDBCMDAwMDAwICAvKiBCYW5rIDEgUmVhZCBBY2Nlc3MgVGltZSA9IDExIGN5Y2xlcyAqLworI2RlZmluZQlCMVJBVF8xMgkJMHgwQzAwMDAwMCAgLyogQmFuayAxIFJlYWQgQWNjZXNzIFRpbWUgPSAxMiBjeWNsZXMgKi8KKyNkZWZpbmUJQjFSQVRfMTMJCTB4MEQwMDAwMDAgIC8qIEJhbmsgMSBSZWFkIEFjY2VzcyBUaW1lID0gMTMgY3ljbGVzICovCisjZGVmaW5lCUIxUkFUXzE0CQkweDBFMDAwMDAwICAvKiBCYW5rIDEgUmVhZCBBY2Nlc3MgVGltZSA9IDE0IGN5Y2xlcyAqLworI2RlZmluZQlCMVJBVF8xNQkJMHgwRjAwMDAwMCAgLyogQmFuayAxIFJlYWQgQWNjZXNzIFRpbWUgPSAxNSBjeWNsZXMgKi8KKyNkZWZpbmUJQjFXQVRfMQkJCTB4MTAwMDAwMDAgLyogQmFuayAxIFdyaXRlIEFjY2VzcyBUaW1lID0gMSBjeWNsZSAqLworI2RlZmluZQlCMVdBVF8yCQkJMHgyMDAwMDAwMCAgLyogQmFuayAxIFdyaXRlIEFjY2VzcyBUaW1lCT0gMiBjeWNsZXMgKi8KKyNkZWZpbmUJQjFXQVRfMwkJCTB4MzAwMDAwMDAgIC8qIEJhbmsgMSBXcml0ZSBBY2Nlc3MgVGltZQk9IDMgY3ljbGVzICovCisjZGVmaW5lCUIxV0FUXzQJCQkweDQwMDAwMDAwICAvKiBCYW5rIDEgV3JpdGUgQWNjZXNzIFRpbWUJPSA0IGN5Y2xlcyAqLworI2RlZmluZQlCMVdBVF81CQkJMHg1MDAwMDAwMCAgLyogQmFuayAxIFdyaXRlIEFjY2VzcyBUaW1lCT0gNSBjeWNsZXMgKi8KKyNkZWZpbmUJQjFXQVRfNgkJCTB4NjAwMDAwMDAgIC8qIEJhbmsgMSBXcml0ZSBBY2Nlc3MgVGltZQk9IDYgY3ljbGVzICovCisjZGVmaW5lCUIxV0FUXzcJCQkweDcwMDAwMDAwICAvKiBCYW5rIDEgV3JpdGUgQWNjZXNzIFRpbWUJPSA3IGN5Y2xlcyAqLworI2RlZmluZQlCMVdBVF84CQkJMHg4MDAwMDAwMCAgLyogQmFuayAxIFdyaXRlIEFjY2VzcyBUaW1lCT0gOCBjeWNsZXMgKi8KKyNkZWZpbmUJQjFXQVRfOQkJCTB4OTAwMDAwMDAgIC8qIEJhbmsgMSBXcml0ZSBBY2Nlc3MgVGltZQk9IDkgY3ljbGVzICovCisjZGVmaW5lCUIxV0FUXzEwCQkweEEwMDAwMDAwICAvKiBCYW5rIDEgV3JpdGUgQWNjZXNzIFRpbWUJPSAxMCBjeWNsZXMgKi8KKyNkZWZpbmUJQjFXQVRfMTEJCTB4QjAwMDAwMDAgIC8qIEJhbmsgMSBXcml0ZSBBY2Nlc3MgVGltZQk9IDExIGN5Y2xlcyAqLworI2RlZmluZQlCMVdBVF8xMgkJMHhDMDAwMDAwMCAgLyogQmFuayAxIFdyaXRlIEFjY2VzcyBUaW1lCT0gMTIgY3ljbGVzICovCisjZGVmaW5lCUIxV0FUXzEzCQkweEQwMDAwMDAwICAvKiBCYW5rIDEgV3JpdGUgQWNjZXNzIFRpbWUJPSAxMyBjeWNsZXMgKi8KKyNkZWZpbmUJQjFXQVRfMTQJCTB4RTAwMDAwMDAgIC8qIEJhbmsgMSBXcml0ZSBBY2Nlc3MgVGltZQk9IDE0IGN5Y2xlcyAqLworI2RlZmluZQlCMVdBVF8xNQkJMHhGMDAwMDAwMCAgLyogQmFuayAxIFdyaXRlIEFjY2VzcyBUaW1lCT0gMTUgY3ljbGVzICovCisKKy8qIEVCSVVfQU1CQ1RMMQlNYXNrcyAqLworI2RlZmluZQlCMlJEWUVOCQkJMHgwMDAwMDAwMSAgLyogQmFuayAyIFJEWSBFbmFibGUsIDA9ZGlzYWJsZSwgMT1lbmFibGUgKi8KKyNkZWZpbmUJQjJSRFlQT0wJCTB4MDAwMDAwMDIgIC8qIEJhbmsgMiBSRFkgQWN0aXZlIGhpZ2gsIDA9YWN0aXZlCWxvdywgMT1hY3RpdmUgaGlnaCAqLworI2RlZmluZQlCMlRUXzEJCQkweDAwMDAwMDA0ICAvKiBCYW5rIDIgVHJhbnNpdGlvbiBUaW1lIGZyb20gUmVhZAl0byBXcml0ZSA9IDEgY3ljbGUgKi8KKyNkZWZpbmUJQjJUVF8yCQkJMHgwMDAwMDAwOCAgLyogQmFuayAyIFRyYW5zaXRpb24gVGltZSBmcm9tIFJlYWQJdG8gV3JpdGUgPSAyIGN5Y2xlcyAqLworI2RlZmluZQlCMlRUXzMJCQkweDAwMDAwMDBDICAvKiBCYW5rIDIgVHJhbnNpdGlvbiBUaW1lIGZyb20gUmVhZAl0byBXcml0ZSA9IDMgY3ljbGVzICovCisjZGVmaW5lCUIyVFRfNAkJCTB4MDAwMDAwMDAgIC8qIEJhbmsgMiBUcmFuc2l0aW9uIFRpbWUgZnJvbSBSZWFkCXRvIFdyaXRlID0gNCBjeWNsZXMgKi8KKyNkZWZpbmUJQjJTVF8xCQkJMHgwMDAwMDAxMCAgLyogQmFuayAyIFNldHVwIFRpbWUgZnJvbSBBT0UgYXNzZXJ0ZWQgdG8gUmVhZCBvciBXcml0ZSBhc3NlcnRlZCA9IDEgY3ljbGUgKi8KKyNkZWZpbmUJQjJTVF8yCQkJMHgwMDAwMDAyMCAgLyogQmFuayAyIFNldHVwIFRpbWUgZnJvbSBBT0UgYXNzZXJ0ZWQgdG8gUmVhZCBvciBXcml0ZSBhc3NlcnRlZCA9IDIgY3ljbGVzICovCisjZGVmaW5lCUIyU1RfMwkJCTB4MDAwMDAwMzAgIC8qIEJhbmsgMiBTZXR1cCBUaW1lIGZyb20gQU9FIGFzc2VydGVkIHRvIFJlYWQgb3IgV3JpdGUgYXNzZXJ0ZWQgPSAzIGN5Y2xlcyAqLworI2RlZmluZQlCMlNUXzQJCQkweDAwMDAwMDAwICAvKiBCYW5rIDIgU2V0dXAgVGltZSBmcm9tIEFPRSBhc3NlcnRlZCB0byBSZWFkIG9yIFdyaXRlIGFzc2VydGVkID0gNCBjeWNsZXMgKi8KKyNkZWZpbmUJQjJIVF8xCQkJMHgwMDAwMDA0MCAgLyogQmFuayAyIEhvbGQgVGltZQlmcm9tIFJlYWQgb3IgV3JpdGUgZGVhc3NlcnRlZCB0byBBT0UgZGVhc3NlcnRlZAk9IDEgY3ljbGUgKi8KKyNkZWZpbmUJQjJIVF8yCQkJMHgwMDAwMDA4MCAgLyogQmFuayAyIEhvbGQgVGltZQlmcm9tIFJlYWQgb3IgV3JpdGUgZGVhc3NlcnRlZCB0byBBT0UgZGVhc3NlcnRlZAk9IDIgY3ljbGVzICovCisjZGVmaW5lCUIySFRfMwkJCTB4MDAwMDAwQzAgIC8qIEJhbmsgMiBIb2xkIFRpbWUJZnJvbSBSZWFkIG9yIFdyaXRlIGRlYXNzZXJ0ZWQgdG8gQU9FIGRlYXNzZXJ0ZWQJPSAzIGN5Y2xlcyAqLworI2RlZmluZQlCMkhUXzAJCQkweDAwMDAwMDAwICAvKiBCYW5rIDIgSG9sZCBUaW1lCWZyb20gUmVhZCBvciBXcml0ZSBkZWFzc2VydGVkIHRvIEFPRSBkZWFzc2VydGVkCT0gMCBjeWNsZXMgKi8KKyNkZWZpbmUJQjJSQVRfMQkJCTB4MDAwMDAxMDAgIC8qIEJhbmsgMiBSZWFkIEFjY2VzcyBUaW1lID0gMSBjeWNsZSAqLworI2RlZmluZQlCMlJBVF8yCQkJMHgwMDAwMDIwMCAgLyogQmFuayAyIFJlYWQgQWNjZXNzIFRpbWUgPSAyIGN5Y2xlcyAqLworI2RlZmluZQlCMlJBVF8zCQkJMHgwMDAwMDMwMCAgLyogQmFuayAyIFJlYWQgQWNjZXNzIFRpbWUgPSAzIGN5Y2xlcyAqLworI2RlZmluZQlCMlJBVF80CQkJMHgwMDAwMDQwMCAgLyogQmFuayAyIFJlYWQgQWNjZXNzIFRpbWUgPSA0IGN5Y2xlcyAqLworI2RlZmluZQlCMlJBVF81CQkJMHgwMDAwMDUwMCAgLyogQmFuayAyIFJlYWQgQWNjZXNzIFRpbWUgPSA1IGN5Y2xlcyAqLworI2RlZmluZQlCMlJBVF82CQkJMHgwMDAwMDYwMCAgLyogQmFuayAyIFJlYWQgQWNjZXNzIFRpbWUgPSA2IGN5Y2xlcyAqLworI2RlZmluZQlCMlJBVF83CQkJMHgwMDAwMDcwMCAgLyogQmFuayAyIFJlYWQgQWNjZXNzIFRpbWUgPSA3IGN5Y2xlcyAqLworI2RlZmluZQlCMlJBVF84CQkJMHgwMDAwMDgwMCAgLyogQmFuayAyIFJlYWQgQWNjZXNzIFRpbWUgPSA4IGN5Y2xlcyAqLworI2RlZmluZQlCMlJBVF85CQkJMHgwMDAwMDkwMCAgLyogQmFuayAyIFJlYWQgQWNjZXNzIFRpbWUgPSA5IGN5Y2xlcyAqLworI2RlZmluZQlCMlJBVF8xMAkJMHgwMDAwMEEwMCAgLyogQmFuayAyIFJlYWQgQWNjZXNzIFRpbWUgPSAxMCBjeWNsZXMgKi8KKyNkZWZpbmUJQjJSQVRfMTEJCTB4MDAwMDBCMDAgIC8qIEJhbmsgMiBSZWFkIEFjY2VzcyBUaW1lID0gMTEgY3ljbGVzICovCisjZGVmaW5lCUIyUkFUXzEyCQkweDAwMDAwQzAwICAvKiBCYW5rIDIgUmVhZCBBY2Nlc3MgVGltZSA9IDEyIGN5Y2xlcyAqLworI2RlZmluZQlCMlJBVF8xMwkJMHgwMDAwMEQwMCAgLyogQmFuayAyIFJlYWQgQWNjZXNzIFRpbWUgPSAxMyBjeWNsZXMgKi8KKyNkZWZpbmUJQjJSQVRfMTQJCTB4MDAwMDBFMDAgIC8qIEJhbmsgMiBSZWFkIEFjY2VzcyBUaW1lID0gMTQgY3ljbGVzICovCisjZGVmaW5lCUIyUkFUXzE1CQkweDAwMDAwRjAwICAvKiBCYW5rIDIgUmVhZCBBY2Nlc3MgVGltZSA9IDE1IGN5Y2xlcyAqLworI2RlZmluZQlCMldBVF8xCQkJMHgwMDAwMTAwMCAgLyogQmFuayAyIFdyaXRlIEFjY2VzcyBUaW1lCT0gMSBjeWNsZSAqLworI2RlZmluZQlCMldBVF8yCQkJMHgwMDAwMjAwMCAgLyogQmFuayAyIFdyaXRlIEFjY2VzcyBUaW1lCT0gMiBjeWNsZXMgKi8KKyNkZWZpbmUJQjJXQVRfMwkJCTB4MDAwMDMwMDAgIC8qIEJhbmsgMiBXcml0ZSBBY2Nlc3MgVGltZQk9IDMgY3ljbGVzICovCisjZGVmaW5lCUIyV0FUXzQJCQkweDAwMDA0MDAwICAvKiBCYW5rIDIgV3JpdGUgQWNjZXNzIFRpbWUJPSA0IGN5Y2xlcyAqLworI2RlZmluZQlCMldBVF81CQkJMHgwMDAwNTAwMCAgLyogQmFuayAyIFdyaXRlIEFjY2VzcyBUaW1lCT0gNSBjeWNsZXMgKi8KKyNkZWZpbmUJQjJXQVRfNgkJCTB4MDAwMDYwMDAgIC8qIEJhbmsgMiBXcml0ZSBBY2Nlc3MgVGltZQk9IDYgY3ljbGVzICovCisjZGVmaW5lCUIyV0FUXzcJCQkweDAwMDA3MDAwICAvKiBCYW5rIDIgV3JpdGUgQWNjZXNzIFRpbWUJPSA3IGN5Y2xlcyAqLworI2RlZmluZQlCMldBVF84CQkJMHgwMDAwODAwMCAgLyogQmFuayAyIFdyaXRlIEFjY2VzcyBUaW1lCT0gOCBjeWNsZXMgKi8KKyNkZWZpbmUJQjJXQVRfOQkJCTB4MDAwMDkwMDAgIC8qIEJhbmsgMiBXcml0ZSBBY2Nlc3MgVGltZQk9IDkgY3ljbGVzICovCisjZGVmaW5lCUIyV0FUXzEwCQkweDAwMDBBMDAwICAvKiBCYW5rIDIgV3JpdGUgQWNjZXNzIFRpbWUJPSAxMCBjeWNsZXMgKi8KKyNkZWZpbmUJQjJXQVRfMTEJCTB4MDAwMEIwMDAgIC8qIEJhbmsgMiBXcml0ZSBBY2Nlc3MgVGltZQk9IDExIGN5Y2xlcyAqLworI2RlZmluZQlCMldBVF8xMgkJMHgwMDAwQzAwMCAgLyogQmFuayAyIFdyaXRlIEFjY2VzcyBUaW1lCT0gMTIgY3ljbGVzICovCisjZGVmaW5lCUIyV0FUXzEzCQkweDAwMDBEMDAwICAvKiBCYW5rIDIgV3JpdGUgQWNjZXNzIFRpbWUJPSAxMyBjeWNsZXMgKi8KKyNkZWZpbmUJQjJXQVRfMTQJCTB4MDAwMEUwMDAgIC8qIEJhbmsgMiBXcml0ZSBBY2Nlc3MgVGltZQk9IDE0IGN5Y2xlcyAqLworI2RlZmluZQlCMldBVF8xNQkJMHgwMDAwRjAwMCAgLyogQmFuayAyIFdyaXRlIEFjY2VzcyBUaW1lCT0gMTUgY3ljbGVzICovCisjZGVmaW5lCUIzUkRZRU4JCQkweDAwMDEwMDAwICAvKiBCYW5rIDMgUkRZIGVuYWJsZSwgMD1kaXNhYmxlLCAxPWVuYWJsZSAqLworI2RlZmluZQlCM1JEWVBPTAkJMHgwMDAyMDAwMCAgLyogQmFuayAzIFJEWSBBY3RpdmUgaGlnaCwgMD1hY3RpdmUJbG93LCAxPWFjdGl2ZSBoaWdoICovCisjZGVmaW5lCUIzVFRfMQkJCTB4MDAwNDAwMDAgIC8qIEJhbmsgMyBUcmFuc2l0aW9uIFRpbWUgZnJvbSBSZWFkCXRvIFdyaXRlID0gMSBjeWNsZSAqLworI2RlZmluZQlCM1RUXzIJCQkweDAwMDgwMDAwICAvKiBCYW5rIDMgVHJhbnNpdGlvbiBUaW1lIGZyb20gUmVhZAl0byBXcml0ZSA9IDIgY3ljbGVzICovCisjZGVmaW5lCUIzVFRfMwkJCTB4MDAwQzAwMDAgIC8qIEJhbmsgMyBUcmFuc2l0aW9uIFRpbWUgZnJvbSBSZWFkCXRvIFdyaXRlID0gMyBjeWNsZXMgKi8KKyNkZWZpbmUJQjNUVF80CQkJMHgwMDAwMDAwMCAgLyogQmFuayAzIFRyYW5zaXRpb24gVGltZSBmcm9tIFJlYWQJdG8gV3JpdGUgPSA0IGN5Y2xlcyAqLworI2RlZmluZQlCM1NUXzEJCQkweDAwMTAwMDAwICAvKiBCYW5rIDMgU2V0dXAgVGltZSBmcm9tIEFPRSBhc3NlcnRlZCB0byBSZWFkIG9yIFdyaXRlIGFzc2VydGVkID0gMSBjeWNsZSAqLworI2RlZmluZQlCM1NUXzIJCQkweDAwMjAwMDAwICAvKiBCYW5rIDMgU2V0dXAgVGltZSBmcm9tIEFPRSBhc3NlcnRlZCB0byBSZWFkIG9yIFdyaXRlIGFzc2VydGVkID0gMiBjeWNsZXMgKi8KKyNkZWZpbmUJQjNTVF8zCQkJMHgwMDMwMDAwMCAgLyogQmFuayAzIFNldHVwIFRpbWUgZnJvbSBBT0UgYXNzZXJ0ZWQgdG8gUmVhZCBvciBXcml0ZSBhc3NlcnRlZCA9IDMgY3ljbGVzICovCisjZGVmaW5lCUIzU1RfNAkJCTB4MDAwMDAwMDAgIC8qIEJhbmsgMyBTZXR1cCBUaW1lIGZyb20gQU9FIGFzc2VydGVkIHRvIFJlYWQgb3IgV3JpdGUgYXNzZXJ0ZWQgPSA0IGN5Y2xlcyAqLworI2RlZmluZQlCM0hUXzEJCQkweDAwNDAwMDAwICAvKiBCYW5rIDMgSG9sZCBUaW1lCWZyb20gUmVhZCBvciBXcml0ZSBkZWFzc2VydGVkIHRvIEFPRSBkZWFzc2VydGVkCT0gMSBjeWNsZSAqLworI2RlZmluZQlCM0hUXzIJCQkweDAwODAwMDAwICAvKiBCYW5rIDMgSG9sZCBUaW1lCWZyb20gUmVhZCBvciBXcml0ZSBkZWFzc2VydGVkIHRvIEFPRSBkZWFzc2VydGVkCT0gMiBjeWNsZXMgKi8KKyNkZWZpbmUJQjNIVF8zCQkJMHgwMEMwMDAwMCAgLyogQmFuayAzIEhvbGQgVGltZQlmcm9tIFJlYWQgb3IgV3JpdGUgZGVhc3NlcnRlZCB0byBBT0UgZGVhc3NlcnRlZAk9IDMgY3ljbGVzICovCisjZGVmaW5lCUIzSFRfMAkJCTB4MDAwMDAwMDAgIC8qIEJhbmsgMyBIb2xkIFRpbWUJZnJvbSBSZWFkIG9yIFdyaXRlIGRlYXNzZXJ0ZWQgdG8gQU9FIGRlYXNzZXJ0ZWQJPSAwIGN5Y2xlcyAqLworI2RlZmluZQlCM1JBVF8xCQkJMHgwMTAwMDAwMCAvKiBCYW5rIDMgUmVhZCBBY2Nlc3MgVGltZSA9CTEgY3ljbGUgKi8KKyNkZWZpbmUJQjNSQVRfMgkJCTB4MDIwMDAwMDAgIC8qIEJhbmsgMyBSZWFkIEFjY2VzcyBUaW1lID0gMiBjeWNsZXMgKi8KKyNkZWZpbmUJQjNSQVRfMwkJCTB4MDMwMDAwMDAgIC8qIEJhbmsgMyBSZWFkIEFjY2VzcyBUaW1lID0gMyBjeWNsZXMgKi8KKyNkZWZpbmUJQjNSQVRfNAkJCTB4MDQwMDAwMDAgIC8qIEJhbmsgMyBSZWFkIEFjY2VzcyBUaW1lID0gNCBjeWNsZXMgKi8KKyNkZWZpbmUJQjNSQVRfNQkJCTB4MDUwMDAwMDAgIC8qIEJhbmsgMyBSZWFkIEFjY2VzcyBUaW1lID0gNSBjeWNsZXMgKi8KKyNkZWZpbmUJQjNSQVRfNgkJCTB4MDYwMDAwMDAgIC8qIEJhbmsgMyBSZWFkIEFjY2VzcyBUaW1lID0gNiBjeWNsZXMgKi8KKyNkZWZpbmUJQjNSQVRfNwkJCTB4MDcwMDAwMDAgIC8qIEJhbmsgMyBSZWFkIEFjY2VzcyBUaW1lID0gNyBjeWNsZXMgKi8KKyNkZWZpbmUJQjNSQVRfOAkJCTB4MDgwMDAwMDAgIC8qIEJhbmsgMyBSZWFkIEFjY2VzcyBUaW1lID0gOCBjeWNsZXMgKi8KKyNkZWZpbmUJQjNSQVRfOQkJCTB4MDkwMDAwMDAgIC8qIEJhbmsgMyBSZWFkIEFjY2VzcyBUaW1lID0gOSBjeWNsZXMgKi8KKyNkZWZpbmUJQjNSQVRfMTAJCTB4MEEwMDAwMDAgIC8qIEJhbmsgMyBSZWFkIEFjY2VzcyBUaW1lID0gMTAgY3ljbGVzICovCisjZGVmaW5lCUIzUkFUXzExCQkweDBCMDAwMDAwICAvKiBCYW5rIDMgUmVhZCBBY2Nlc3MgVGltZSA9IDExIGN5Y2xlcyAqLworI2RlZmluZQlCM1JBVF8xMgkJMHgwQzAwMDAwMCAgLyogQmFuayAzIFJlYWQgQWNjZXNzIFRpbWUgPSAxMiBjeWNsZXMgKi8KKyNkZWZpbmUJQjNSQVRfMTMJCTB4MEQwMDAwMDAgIC8qIEJhbmsgMyBSZWFkIEFjY2VzcyBUaW1lID0gMTMgY3ljbGVzICovCisjZGVmaW5lCUIzUkFUXzE0CQkweDBFMDAwMDAwICAvKiBCYW5rIDMgUmVhZCBBY2Nlc3MgVGltZSA9IDE0IGN5Y2xlcyAqLworI2RlZmluZQlCM1JBVF8xNQkJMHgwRjAwMDAwMCAgLyogQmFuayAzIFJlYWQgQWNjZXNzIFRpbWUgPSAxNSBjeWNsZXMgKi8KKyNkZWZpbmUJQjNXQVRfMQkJCTB4MTAwMDAwMDAgLyogQmFuayAzIFdyaXRlIEFjY2VzcyBUaW1lID0gMSBjeWNsZSAqLworI2RlZmluZQlCM1dBVF8yCQkJMHgyMDAwMDAwMCAgLyogQmFuayAzIFdyaXRlIEFjY2VzcyBUaW1lCT0gMiBjeWNsZXMgKi8KKyNkZWZpbmUJQjNXQVRfMwkJCTB4MzAwMDAwMDAgIC8qIEJhbmsgMyBXcml0ZSBBY2Nlc3MgVGltZQk9IDMgY3ljbGVzICovCisjZGVmaW5lCUIzV0FUXzQJCQkweDQwMDAwMDAwICAvKiBCYW5rIDMgV3JpdGUgQWNjZXNzIFRpbWUJPSA0IGN5Y2xlcyAqLworI2RlZmluZQlCM1dBVF81CQkJMHg1MDAwMDAwMCAgLyogQmFuayAzIFdyaXRlIEFjY2VzcyBUaW1lCT0gNSBjeWNsZXMgKi8KKyNkZWZpbmUJQjNXQVRfNgkJCTB4NjAwMDAwMDAgIC8qIEJhbmsgMyBXcml0ZSBBY2Nlc3MgVGltZQk9IDYgY3ljbGVzICovCisjZGVmaW5lCUIzV0FUXzcJCQkweDcwMDAwMDAwICAvKiBCYW5rIDMgV3JpdGUgQWNjZXNzIFRpbWUJPSA3IGN5Y2xlcyAqLworI2RlZmluZQlCM1dBVF84CQkJMHg4MDAwMDAwMCAgLyogQmFuayAzIFdyaXRlIEFjY2VzcyBUaW1lCT0gOCBjeWNsZXMgKi8KKyNkZWZpbmUJQjNXQVRfOQkJCTB4OTAwMDAwMDAgIC8qIEJhbmsgMyBXcml0ZSBBY2Nlc3MgVGltZQk9IDkgY3ljbGVzICovCisjZGVmaW5lCUIzV0FUXzEwCQkweEEwMDAwMDAwICAvKiBCYW5rIDMgV3JpdGUgQWNjZXNzIFRpbWUJPSAxMCBjeWNsZXMgKi8KKyNkZWZpbmUJQjNXQVRfMTEJCTB4QjAwMDAwMDAgIC8qIEJhbmsgMyBXcml0ZSBBY2Nlc3MgVGltZQk9IDExIGN5Y2xlcyAqLworI2RlZmluZQlCM1dBVF8xMgkJMHhDMDAwMDAwMCAgLyogQmFuayAzIFdyaXRlIEFjY2VzcyBUaW1lCT0gMTIgY3ljbGVzICovCisjZGVmaW5lCUIzV0FUXzEzCQkweEQwMDAwMDAwICAvKiBCYW5rIDMgV3JpdGUgQWNjZXNzIFRpbWUJPSAxMyBjeWNsZXMgKi8KKyNkZWZpbmUJQjNXQVRfMTQJCTB4RTAwMDAwMDAgIC8qIEJhbmsgMyBXcml0ZSBBY2Nlc3MgVGltZQk9IDE0IGN5Y2xlcyAqLworI2RlZmluZQlCM1dBVF8xNQkJMHhGMDAwMDAwMCAgLyogQmFuayAzIFdyaXRlIEFjY2VzcyBUaW1lCT0gMTUgY3ljbGVzICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKiogIFNEUkFNIENPTlRST0xMRVIgTUFTS1MgICoqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogRUJJVV9TREdDVEwgTWFza3MgKi8KKyNkZWZpbmUJU0NUTEUJCQkweDAwMDAwMDAxIC8qIEVuYWJsZSBTQ0xLWzBdLCAvU1JBUywgL1NDQVMsIC9TV0UsIFNEUU1bMzowXSAqLworI2RlZmluZQlDTF8yCQkJMHgwMDAwMDAwOCAvKiBTRFJBTSBDQVMJbGF0ZW5jeQk9IDIgY3ljbGVzICovCisjZGVmaW5lCUNMXzMJCQkweDAwMDAwMDBDIC8qIFNEUkFNIENBUwlsYXRlbmN5CT0gMyBjeWNsZXMgKi8KKyNkZWZpbmUJUEZFCQkJCTB4MDAwMDAwMTAgLyogRW5hYmxlIFNEUkFNIHByZWZldGNoICovCisjZGVmaW5lCVBGUAkJCQkweDAwMDAwMDIwIC8qIFByZWZldGNoIGhhcyBwcmlvcml0eSBvdmVyIEFNQyByZXF1ZXN0cyAqLworI2RlZmluZQlQQVNSX0FMTAkJMHgwMDAwMDAwMAkvKiBBbGwgNCBTRFJBTSBCYW5rcyBSZWZyZXNoZWQgSW4gU2VsZi1SZWZyZXNoICovCisjZGVmaW5lCVBBU1JfQjBfQjEJCTB4MDAwMDAwMTAJLyogU0RSQU0gQmFua3MgMCBhbmQgMSBBcmUgUmVmcmVzaGVkIEluCVNlbGYtUmVmcmVzaCAqLworI2RlZmluZQlQQVNSX0IwCQkJMHgwMDAwMDAyMAkvKiBPbmx5CVNEUkFNIEJhbmsgMCBJcwlSZWZyZXNoZWQgSW4gU2VsZi1SZWZyZXNoICovCisjZGVmaW5lCVRSQVNfMQkJCTB4MDAwMDAwNDAgLyogU0RSQU0gdFJBUyA9IDEgY3ljbGUgKi8KKyNkZWZpbmUJVFJBU18yCQkJMHgwMDAwMDA4MCAvKiBTRFJBTSB0UkFTID0gMiBjeWNsZXMgKi8KKyNkZWZpbmUJVFJBU18zCQkJMHgwMDAwMDBDMCAvKiBTRFJBTSB0UkFTID0gMyBjeWNsZXMgKi8KKyNkZWZpbmUJVFJBU180CQkJMHgwMDAwMDEwMCAvKiBTRFJBTSB0UkFTID0gNCBjeWNsZXMgKi8KKyNkZWZpbmUJVFJBU181CQkJMHgwMDAwMDE0MCAvKiBTRFJBTSB0UkFTID0gNSBjeWNsZXMgKi8KKyNkZWZpbmUJVFJBU182CQkJMHgwMDAwMDE4MCAvKiBTRFJBTSB0UkFTID0gNiBjeWNsZXMgKi8KKyNkZWZpbmUJVFJBU183CQkJMHgwMDAwMDFDMCAvKiBTRFJBTSB0UkFTID0gNyBjeWNsZXMgKi8KKyNkZWZpbmUJVFJBU184CQkJMHgwMDAwMDIwMCAvKiBTRFJBTSB0UkFTID0gOCBjeWNsZXMgKi8KKyNkZWZpbmUJVFJBU185CQkJMHgwMDAwMDI0MCAvKiBTRFJBTSB0UkFTID0gOSBjeWNsZXMgKi8KKyNkZWZpbmUJVFJBU18xMAkJCTB4MDAwMDAyODAgLyogU0RSQU0gdFJBUyA9IDEwIGN5Y2xlcyAqLworI2RlZmluZQlUUkFTXzExCQkJMHgwMDAwMDJDMCAvKiBTRFJBTSB0UkFTID0gMTEgY3ljbGVzICovCisjZGVmaW5lCVRSQVNfMTIJCQkweDAwMDAwMzAwIC8qIFNEUkFNIHRSQVMgPSAxMiBjeWNsZXMgKi8KKyNkZWZpbmUJVFJBU18xMwkJCTB4MDAwMDAzNDAgLyogU0RSQU0gdFJBUyA9IDEzIGN5Y2xlcyAqLworI2RlZmluZQlUUkFTXzE0CQkJMHgwMDAwMDM4MCAvKiBTRFJBTSB0UkFTID0gMTQgY3ljbGVzICovCisjZGVmaW5lCVRSQVNfMTUJCQkweDAwMDAwM0MwIC8qIFNEUkFNIHRSQVMgPSAxNSBjeWNsZXMgKi8KKyNkZWZpbmUJVFJQXzEJCQkweDAwMDAwODAwIC8qIFNEUkFNIHRSUAk9IDEgY3ljbGUgKi8KKyNkZWZpbmUJVFJQXzIJCQkweDAwMDAxMDAwIC8qIFNEUkFNIHRSUAk9IDIgY3ljbGVzICovCisjZGVmaW5lCVRSUF8zCQkJMHgwMDAwMTgwMCAvKiBTRFJBTSB0UlAJPSAzIGN5Y2xlcyAqLworI2RlZmluZQlUUlBfNAkJCTB4MDAwMDIwMDAgLyogU0RSQU0gdFJQCT0gNCBjeWNsZXMgKi8KKyNkZWZpbmUJVFJQXzUJCQkweDAwMDAyODAwIC8qIFNEUkFNIHRSUAk9IDUgY3ljbGVzICovCisjZGVmaW5lCVRSUF82CQkJMHgwMDAwMzAwMCAvKiBTRFJBTSB0UlAJPSA2IGN5Y2xlcyAqLworI2RlZmluZQlUUlBfNwkJCTB4MDAwMDM4MDAgLyogU0RSQU0gdFJQCT0gNyBjeWNsZXMgKi8KKyNkZWZpbmUJVFJDRF8xCQkJMHgwMDAwODAwMCAvKiBTRFJBTSB0UkNEID0gMSBjeWNsZSAqLworI2RlZmluZQlUUkNEXzIJCQkweDAwMDEwMDAwIC8qIFNEUkFNIHRSQ0QgPSAyIGN5Y2xlcyAqLworI2RlZmluZQlUUkNEXzMJCQkweDAwMDE4MDAwIC8qIFNEUkFNIHRSQ0QgPSAzIGN5Y2xlcyAqLworI2RlZmluZQlUUkNEXzQJCQkweDAwMDIwMDAwIC8qIFNEUkFNIHRSQ0QgPSA0IGN5Y2xlcyAqLworI2RlZmluZQlUUkNEXzUJCQkweDAwMDI4MDAwIC8qIFNEUkFNIHRSQ0QgPSA1IGN5Y2xlcyAqLworI2RlZmluZQlUUkNEXzYJCQkweDAwMDMwMDAwIC8qIFNEUkFNIHRSQ0QgPSA2IGN5Y2xlcyAqLworI2RlZmluZQlUUkNEXzcJCQkweDAwMDM4MDAwIC8qIFNEUkFNIHRSQ0QgPSA3IGN5Y2xlcyAqLworI2RlZmluZQlUV1JfMQkJCTB4MDAwODAwMDAgLyogU0RSQU0gdFdSCT0gMSBjeWNsZSAqLworI2RlZmluZQlUV1JfMgkJCTB4MDAxMDAwMDAgLyogU0RSQU0gdFdSCT0gMiBjeWNsZXMgKi8KKyNkZWZpbmUJVFdSXzMJCQkweDAwMTgwMDAwIC8qIFNEUkFNIHRXUgk9IDMgY3ljbGVzICovCisjZGVmaW5lCVBVUFNECQkJMHgwMDIwMDAwMCAvKlBvd2VyLXVwIHN0YXJ0IGRlbGF5ICovCisjZGVmaW5lCVBTTQkJCQkweDAwNDAwMDAwIC8qIFNEUkFNIHBvd2VyLXVwIHNlcXVlbmNlID0JUHJlY2hhcmdlLCBtb2RlCXJlZ2lzdGVyIHNldCwgOAlDQlIgcmVmcmVzaCBjeWNsZXMgKi8KKyNkZWZpbmUJUFNTCQkJCTB4MDA4MDAwMDAgLyogZW5hYmxlIFNEUkFNIHBvd2VyLXVwIHNlcXVlbmNlIG9uCW5leHQgU0RSQU0gYWNjZXNzICovCisjZGVmaW5lCVNSRlMJCQkweDAxMDAwMDAwIC8qIFN0YXJ0IFNEUkFNIHNlbGYtcmVmcmVzaCBtb2RlICovCisjZGVmaW5lCUVCVUZFCQkJMHgwMjAwMDAwMCAvKiBFbmFibGUgZXh0ZXJuYWwgYnVmZmVyaW5nCXRpbWluZyAqLworI2RlZmluZQlGQkJSVwkJCTB4MDQwMDAwMDAgLyogRmFzdCBiYWNrLXRvLWJhY2sJcmVhZCB3cml0ZSBlbmFibGUgKi8KKyNkZWZpbmUJRU1SRU4JCQkweDEwMDAwMDAwIC8qIEV4dGVuZGVkIG1vZGUgcmVnaXN0ZXIgZW5hYmxlICovCisjZGVmaW5lCVRDU1IJCQkweDIwMDAwMDAwIC8qIFRlbXAgY29tcGVuc2F0ZWQgc2VsZiByZWZyZXNoIHZhbHVlIDg1IGRlZyBDICovCisjZGVmaW5lCUNEREJHCQkJMHg0MDAwMDAwMCAvKiBUcmlzdGF0ZSBTRFJBTSBjb250cm9scyBkdXJpbmcgYnVzIGdyYW50ICovCisKKy8qIEVCSVVfU0RCQ1RMIE1hc2tzICovCisjZGVmaW5lCUVCRQkJCQkweDAwMDAwMDAxIC8qIEVuYWJsZSBTRFJBTSBleHRlcm5hbCBiYW5rICovCisjZGVmaW5lCUVCU1pfMTYJCQkweDAwMDAwMDAwIC8qIFNEUkFNIGV4dGVybmFsIGJhbmsgc2l6ZSA9IDE2TUIgKi8KKyNkZWZpbmUJRUJTWl8zMgkJCTB4MDAwMDAwMDIgLyogU0RSQU0gZXh0ZXJuYWwgYmFuayBzaXplID0gMzJNQiAqLworI2RlZmluZQlFQlNaXzY0CQkJMHgwMDAwMDAwNCAvKiBTRFJBTSBleHRlcm5hbCBiYW5rIHNpemUgPSA2NE1CICovCisjZGVmaW5lCUVCU1pfMTI4CQkweDAwMDAwMDA2IC8qIFNEUkFNIGV4dGVybmFsIGJhbmsgc2l6ZSA9IDEyOE1CICovCisjZGVmaW5lCUVCU1pfMjU2CQkweDAwMDAwMDA4IC8qIFNEUkFNIEV4dGVybmFsIEJhbmsgU2l6ZSA9IDI1Nk1CICovCisjZGVmaW5lCUVCU1pfNTEyCQkweDAwMDAwMDBBIC8qIFNEUkFNIEV4dGVybmFsIEJhbmsgU2l6ZSA9IDUxMk1CICovCisjZGVmaW5lCUVCQ0FXXzgJCQkweDAwMDAwMDAwIC8qIFNEUkFNIGV4dGVybmFsIGJhbmsgY29sdW1uIGFkZHJlc3Mgd2lkdGggPSA4IGJpdHMgKi8KKyNkZWZpbmUJRUJDQVdfOQkJCTB4MDAwMDAwMTAgLyogU0RSQU0gZXh0ZXJuYWwgYmFuayBjb2x1bW4gYWRkcmVzcyB3aWR0aCA9IDkgYml0cyAqLworI2RlZmluZQlFQkNBV18xMAkJMHgwMDAwMDAyMCAvKiBTRFJBTSBleHRlcm5hbCBiYW5rIGNvbHVtbiBhZGRyZXNzIHdpZHRoID0gOSBiaXRzICovCisjZGVmaW5lCUVCQ0FXXzExCQkweDAwMDAwMDMwIC8qIFNEUkFNIGV4dGVybmFsIGJhbmsgY29sdW1uIGFkZHJlc3Mgd2lkdGggPSA5IGJpdHMgKi8KKworLyogRUJJVV9TRFNUQVQgTWFza3MgKi8KKyNkZWZpbmUJU0RDSQkJCTB4MDAwMDAwMDEgLyogU0RSQU0gY29udHJvbGxlciBpcyBpZGxlICovCisjZGVmaW5lCVNEU1JBCQkJMHgwMDAwMDAwMiAvKiBTRFJBTSBTRFJBTSBzZWxmIHJlZnJlc2ggaXMgYWN0aXZlICovCisjZGVmaW5lCVNEUFVBCQkJMHgwMDAwMDAwNCAvKiBTRFJBTSBwb3dlciB1cCBhY3RpdmUgICovCisjZGVmaW5lCVNEUlMJCQkweDAwMDAwMDA4IC8qIFNEUkFNIGlzIGluIHJlc2V0CXN0YXRlICovCisjZGVmaW5lCVNERUFTRQkJCTB4MDAwMDAwMTAgLyogU0RSQU0gRUFCCXN0aWNreSBlcnJvciBzdGF0dXMgLSBXMUMgKi8KKyNkZWZpbmUJQkdTVEFUCQkJMHgwMDAwMDAyMCAvKiBCdXMgZ3JhbnRlZCAqLworCisKKy8qICAqKioqKioqKioqKioqKioqKioqKiAgVFdPLVdJUkUgSU5URVJGQUNFIChUV0l4KSBNQVNLUyAgKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBUV0l4X0NMS0RJViBNYWNyb3MgKFVzZTogKnBUV0l4X0NMS0RJViA9IENMS0xPVyh4KXxDTEtISSh5KTsJICkgKi8KKyNpZmRlZiBfTUlTUkFfUlVMRVMKKyNkZWZpbmUJQ0xLTE9XKHgpCSgoeCkgJiAweEZGdSkJCS8qIFBlcmlvZHMgQ2xvY2sgSXMgSGVsZCBMb3cgKi8KKyNkZWZpbmUJQ0xLSEkoeSkJKCgoeSkmMHhGRnUpPDwweDgpCS8qIFBlcmlvZHMgQmVmb3JlIE5ldyBDbG9jayBMb3cgKi8KKyNlbHNlCisjZGVmaW5lCUNMS0xPVyh4KQkoKHgpICYgMHhGRikJCS8qIFBlcmlvZHMgQ2xvY2sgSXMgSGVsZCBMb3cgKi8KKyNkZWZpbmUJQ0xLSEkoeSkJKCgoeSkmMHhGRik8PDB4OCkJLyogUGVyaW9kcyBCZWZvcmUgTmV3IENsb2NrIExvdyAqLworI2VuZGlmIC8qIF9NSVNSQV9SVUxFUyAqLworCisvKiBUV0l4X1BSRVNDQUxFIE1hc2tzCQkJCQkJCQkgKi8KKyNkZWZpbmUJUFJFU0NBTEUJMHgwMDdGCQkvKiBTQ0xLcyBQZXIgSW50ZXJuYWwgVGltZSBSZWZlcmVuY2UgKDEwTUh6KSAqLworI2RlZmluZQlUV0lfRU5BCQkweDAwODAJCS8qIFRXSSBFbmFibGUJCSAqLworI2RlZmluZQlTQ0NCCQkweDAyMDAJCS8qIFNDQ0IJQ29tcGF0aWJpbGl0eSBFbmFibGUgKi8KKworLyogVFdJeF9TTEFWRV9DVFJMIE1hc2tzCQkJCQkJCQkgKi8KKyNkZWZpbmUJU0VOCQkJMHgwMDAxCQkvKiBTbGF2ZSBFbmFibGUJCSAqLworI2RlZmluZQlTQUREX0xFTgkweDAwMDIJCS8qIFNsYXZlIEFkZHJlc3MgTGVuZ3RoICovCisjZGVmaW5lCVNURFZBTAkJMHgwMDA0CQkvKiBTbGF2ZSBUcmFuc21pdCBEYXRhIFZhbGlkICovCisjZGVmaW5lCU5BSwkJCTB4MDAwOAkJLyogTkFLL0FDSyogR2VuZXJhdGVkIEF0IENvbmNsdXNpb24gT2YgVHJhbnNmZXIgKi8KKyNkZWZpbmUJR0VOCQkJMHgwMDEwCQkvKiBHZW5lcmFsIENhbGwJQWRycmVzcwlNYXRjaGluZyBFbmFibGVkICovCisKKy8qIFRXSXhfU0xBVkVfU1RBVCBNYXNrcwkJCQkJCQkJICovCisjZGVmaW5lCVNESVIJCTB4MDAwMQkJLyogU2xhdmUgVHJhbnNmZXIgRGlyZWN0aW9uIChUcmFuc21pdC9SZWNlaXZlKikgKi8KKyNkZWZpbmUJR0NBTEwJCTB4MDAwMgkJLyogR2VuZXJhbCBDYWxsCUluZGljYXRvciAqLworCisvKiBUV0l4X01BU1RFUl9DVFJMIE1hc2tzCQkJCQkJICovCisjZGVmaW5lCU1FTgkJCTB4MDAwMQkJLyogTWFzdGVyIE1vZGUgRW5hYmxlICovCisjZGVmaW5lCU1BRERfTEVOCTB4MDAwMgkJLyogTWFzdGVyIEFkZHJlc3MgTGVuZ3RoICovCisjZGVmaW5lCU1ESVIJCTB4MDAwNAkJLyogTWFzdGVyIFRyYW5zbWl0IERpcmVjdGlvbiAoUlgvVFgqKSAqLworI2RlZmluZQlGQVNUCQkweDAwMDgJCS8qIFVzZSBGYXN0IE1vZGUgVGltaW5nCVNwZWNzICovCisjZGVmaW5lCVNUT1AJCTB4MDAxMAkJLyogSXNzdWUgU3RvcCBDb25kaXRpb24gKi8KKyNkZWZpbmUJUlNUQVJUCQkweDAwMjAJCS8qIFJlcGVhdCBTdGFydAlvciBTdG9wKiBBdCBFbmQJT2YgVHJhbnNmZXIgKi8KKyNkZWZpbmUJRENOVAkJMHgzRkMwCQkvKiBEYXRhCUJ5dGVzIFRvIFRyYW5zZmVyICovCisjZGVmaW5lCVNEQU9WUgkJMHg0MDAwCQkvKiBTZXJpYWwgRGF0YSBPdmVycmlkZSAqLworI2RlZmluZQlTQ0xPVlIJCTB4ODAwMAkJLyogU2VyaWFsIENsb2NrCU92ZXJyaWRlICovCisKKy8qIFRXSXhfTUFTVEVSX1NUQVQgTWFza3MJCQkJCQkJICovCisjZGVmaW5lCU1QUk9HCQkweDAwMDEJCS8qIE1hc3RlciBUcmFuc2ZlciBJbiBQcm9ncmVzcyAqLworI2RlZmluZQlMT1NUQVJCCQkweDAwMDIJCS8qIExvc3QJQXJiaXRyYXRpb24gSW5kaWNhdG9yIChYZmVyIEFib3J0ZWQpICovCisjZGVmaW5lCUFOQUsJCTB4MDAwNAkJLyogQWRkcmVzcyBOb3QgQWNrbm93bGVkZ2VkICovCisjZGVmaW5lCUROQUsJCTB4MDAwOAkJLyogRGF0YQlOb3QgQWNrbm93bGVkZ2VkICovCisjZGVmaW5lCUJVRlJERVJSCTB4MDAxMAkJLyogQnVmZmVyIFJlYWQgRXJyb3IgKi8KKyNkZWZpbmUJQlVGV1JFUlIJMHgwMDIwCQkvKiBCdWZmZXIgV3JpdGUJRXJyb3IgKi8KKyNkZWZpbmUJU0RBU0VOCQkweDAwNDAJCS8qIFNlcmlhbCBEYXRhIFNlbnNlICovCisjZGVmaW5lCVNDTFNFTgkJMHgwMDgwCQkvKiBTZXJpYWwgQ2xvY2sJU2Vuc2UgKi8KKyNkZWZpbmUJQlVTQlVTWQkJMHgwMTAwCQkvKiBCdXMgQnVzeSBJbmRpY2F0b3IgKi8KKworLyogVFdJeF9JTlRfU1JDCWFuZCBUV0l4X0lOVF9FTkFCTEUgTWFza3MgKi8KKyNkZWZpbmUJU0lOSVQJCTB4MDAwMQkJLyogU2xhdmUgVHJhbnNmZXIgSW5pdGlhdGVkICovCisjZGVmaW5lCVNDT01QCQkweDAwMDIJCS8qIFNsYXZlIFRyYW5zZmVyIENvbXBsZXRlICovCisjZGVmaW5lCVNFUlIJCTB4MDAwNAkJLyogU2xhdmUgVHJhbnNmZXIgRXJyb3IgKi8KKyNkZWZpbmUJU09WRgkJMHgwMDA4CQkvKiBTbGF2ZSBPdmVyZmxvdyAqLworI2RlZmluZQlNQ09NUAkJMHgwMDEwCQkvKiBNYXN0ZXIgVHJhbnNmZXIgQ29tcGxldGUgKi8KKyNkZWZpbmUJTUVSUgkJMHgwMDIwCQkvKiBNYXN0ZXIgVHJhbnNmZXIgRXJyb3IgKi8KKyNkZWZpbmUJWE1UU0VSVgkJMHgwMDQwCQkvKiBUcmFuc21pdCBGSUZPIFNlcnZpY2UgKi8KKyNkZWZpbmUJUkNWU0VSVgkJMHgwMDgwCQkvKiBSZWNlaXZlIEZJRk8JU2VydmljZSAqLworCisvKiBUV0l4X0ZJRk9fQ1RMIE1hc2tzCQkJCQkgKi8KKyNkZWZpbmUJWE1URkxVU0gJMHgwMDAxCQkvKiBUcmFuc21pdCBCdWZmZXIgRmx1c2ggKi8KKyNkZWZpbmUJUkNWRkxVU0gJMHgwMDAyCQkvKiBSZWNlaXZlIEJ1ZmZlciBGbHVzaCAqLworI2RlZmluZQlYTVRJTlRMRU4JMHgwMDA0CQkvKiBUcmFuc21pdCBCdWZmZXIgSW50ZXJydXB0IExlbmd0aCAqLworI2RlZmluZQlSQ1ZJTlRMRU4JMHgwMDA4CQkvKiBSZWNlaXZlIEJ1ZmZlciBJbnRlcnJ1cHQgTGVuZ3RoICovCisKKy8qIFRXSXhfRklGT19TVEFUIE1hc2tzCQkJCQkJCQkgKi8KKyNkZWZpbmUJWE1UU1RBVAkJMHgwMDAzCQkvKiBUcmFuc21pdCBGSUZPIFN0YXR1cyAqLworI2RlZmluZQlYTVRfRU1QVFkJMHgwMDAwCQkvKgkJVHJhbnNtaXQgRklGTyBFbXB0eSAqLworI2RlZmluZQlYTVRfSEFMRgkweDAwMDEJCS8qCQlUcmFuc21pdCBGSUZPIEhhcyAxIEJ5dGUgVG8gV3JpdGUgKi8KKyNkZWZpbmUJWE1UX0ZVTEwJMHgwMDAzCQkvKgkJVHJhbnNtaXQgRklGTyBGdWxsICgyIEJ5dGVzIFRvIFdyaXRlKSAqLworCisjZGVmaW5lCVJDVlNUQVQJCTB4MDAwQwkJLyogUmVjZWl2ZSBGSUZPCVN0YXR1cyAqLworI2RlZmluZQlSQ1ZfRU1QVFkJMHgwMDAwCQkvKgkJUmVjZWl2ZQlGSUZPIEVtcHR5ICovCisjZGVmaW5lCVJDVl9IQUxGCTB4MDAwNAkJLyoJCVJlY2VpdmUJRklGTyBIYXMgMSBCeXRlCVRvIFJlYWQgKi8KKyNkZWZpbmUJUkNWX0ZVTEwJMHgwMDBDCQkvKgkJUmVjZWl2ZQlGSUZPIEZ1bGwgKDIgQnl0ZXMgVG8gUmVhZCkgKi8KKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzgvaW5jbHVkZS9tYWNoL2RlZkJGNTM5LmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzgvaW5jbHVkZS9tYWNoL2RlZkJGNTM5LmgKaW5kZXggN2E4YWM1Zi4uODEwMGJjZCAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM4L2luY2x1ZGUvbWFjaC9kZWZCRjUzOS5oCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzOC9pbmNsdWRlL21hY2gvZGVmQkY1MzkuaApAQCAtMSw4NTkgKzEsMTMgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwOC0yMDA5IEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqIENvcHlyaWdodCAyMDA4LTIwMTAgQW5hbG9nIERldmljZXMgSW5jLgogICoKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBREkgQlNEIGxpY2Vuc2Ugb3IgdGhlIEdQTC0yIChvciBsYXRlcikKICAqLwogCi0vKiBTWVNURU0gJiBNTSBSRUdJU1RFUiBCSVQgJiBBRERSRVNTIERFRklOSVRJT05TIEZPUiBBRFNQLUJGNTM4LzkgKi8KLQogI2lmbmRlZiBfREVGX0JGNTM5X0gKICNkZWZpbmUgX0RFRl9CRjUzOV9ICiAKLS8qIGluY2x1ZGUgYWxsIENvcmUgcmVnaXN0ZXJzIGFuZCBiaXQgZGVmaW5pdGlvbnMgKi8KLSNpbmNsdWRlIDxhc20vZGVmX0xQQmxhY2tmaW4uaD4KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLS8qIFN5c3RlbSBNTVIgUmVnaXN0ZXIgTWFwICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLS8qIENsb2NrL1JlZ3VsYXRvciBDb250cm9sICgweEZGQzAwMDAwIC0gMHhGRkMwMDBGRikgKi8KLSNkZWZpbmUJUExMX0NUTAkJCTB4RkZDMDAwMDAJLyogUExMIENvbnRyb2wgcmVnaXN0ZXIgKDE2LWJpdCkgKi8KLSNkZWZpbmUJUExMX0RJVgkJCTB4RkZDMDAwMDQJLyogUExMIERpdmlkZSBSZWdpc3RlciAoMTYtYml0KSAqLwotI2RlZmluZQlWUl9DVEwJCQkweEZGQzAwMDA4CS8qIFZvbHRhZ2UgUmVndWxhdG9yIENvbnRyb2wgUmVnaXN0ZXIgKDE2LWJpdCkgKi8KLSNkZWZpbmUJUExMX1NUQVQJCTB4RkZDMDAwMEMJLyogUExMIFN0YXR1cyByZWdpc3RlciAoMTYtYml0KSAqLwotI2RlZmluZQlQTExfTE9DS0NOVAkJMHhGRkMwMDAxMAkvKiBQTEwgTG9jawlDb3VudCByZWdpc3RlciAoMTYtYml0KSAqLwotI2RlZmluZQlDSElQSUQJCQkweEZGQzAwMDE0CS8qIENoaXAJSUQgUmVnaXN0ZXIgKi8KLQotLyogQ0hJUElEIE1hc2tzICovCi0jZGVmaW5lIENISVBJRF9WRVJTSU9OICAgICAgICAgMHhGMDAwMDAwMAotI2RlZmluZSBDSElQSURfRkFNSUxZICAgICAgICAgIDB4MEZGRkYwMDAKLSNkZWZpbmUgQ0hJUElEX01BTlVGQUNUVVJFICAgICAweDAwMDAwRkZFCi0KLS8qIFN5c3RlbSBJbnRlcnJ1cHQgQ29udHJvbGxlciAoMHhGRkMwMDEwMCAtIDB4RkZDMDAxRkYpICovCi0jZGVmaW5lCVNXUlNUCQkJMHhGRkMwMDEwMCAgLyogU29mdHdhcmUJUmVzZXQgUmVnaXN0ZXIgKDE2LWJpdCkgKi8KLSNkZWZpbmUJU1lTQ1IJCQkweEZGQzAwMTA0ICAvKiBTeXN0ZW0gQ29uZmlndXJhdGlvbiByZWdpc3RlICovCi0jZGVmaW5lCVNJQ19SVkVDVAkJMHhGRkMwMDEwOAotI2RlZmluZQlTSUNfSU1BU0swCQkweEZGQzAwMTBDICAvKiBJbnRlcnJ1cHQgTWFzayBSZWdpc3RlciAqLwotI2RlZmluZQlTSUNfSUFSMAkJMHhGRkMwMDExMCAgLyogSW50ZXJydXB0IEFzc2lnbm1lbnQgUmVnaXN0ZXIgMCAqLwotI2RlZmluZQlTSUNfSUFSMQkJMHhGRkMwMDExNCAgLyogSW50ZXJydXB0IEFzc2lnbm1lbnQgUmVnaXN0ZXIgMSAqLwotI2RlZmluZQlTSUNfSUFSMgkJMHhGRkMwMDExOCAgLyogSW50ZXJydXB0IEFzc2lnbm1lbnQgUmVnaXN0ZXIgMiAqLwotI2RlZmluZQlTSUNfSUFSMwkJCTB4RkZDMDAxMUMJLyogSW50ZXJydXB0IEFzc2lnbm1lbnQJUmVnaXN0ZXIgMyAqLwotI2RlZmluZQlTSUNfSVNSMAkJCTB4RkZDMDAxMjAgIC8qIEludGVycnVwdCBTdGF0dXMJUmVnaXN0ZXIgKi8KLSNkZWZpbmUJU0lDX0lXUjAJCQkweEZGQzAwMTI0ICAvKiBJbnRlcnJ1cHQgV2FrZXVwCVJlZ2lzdGVyICovCi0jZGVmaW5lCVNJQ19JTUFTSzEJCQkweEZGQzAwMTI4CS8qIEludGVycnVwdCBNYXNrIFJlZ2lzdGVyIDEgKi8KLSNkZWZpbmUJU0lDX0lTUjEJCQkweEZGQzAwMTJDCS8qIEludGVycnVwdCBTdGF0dXMgUmVnaXN0ZXIgMSAqLwotI2RlZmluZQlTSUNfSVdSMQkJCTB4RkZDMDAxMzAJLyogSW50ZXJydXB0IFdha2V1cCBSZWdpc3RlciAxICovCi0jZGVmaW5lCVNJQ19JQVI0CQkJMHhGRkMwMDEzNAkvKiBJbnRlcnJ1cHQgQXNzaWdubWVudAlSZWdpc3RlciA0ICovCi0jZGVmaW5lCVNJQ19JQVI1CQkJMHhGRkMwMDEzOAkvKiBJbnRlcnJ1cHQgQXNzaWdubWVudAlSZWdpc3RlciA1ICovCi0jZGVmaW5lCVNJQ19JQVI2CQkJMHhGRkMwMDEzQwkvKiBJbnRlcnJ1cHQgQXNzaWdubWVudAlSZWdpc3RlciA2ICovCi0KLQotLyogV2F0Y2hkb2cgVGltZXIgKDB4RkZDMDAyMDAgLQkweEZGQzAwMkZGKSAqLwotI2RlZmluZQlXRE9HX0NUTAkweEZGQzAwMjAwICAvKiBXYXRjaGRvZwlDb250cm9sCVJlZ2lzdGVyICovCi0jZGVmaW5lCVdET0dfQ05UCTB4RkZDMDAyMDQgIC8qIFdhdGNoZG9nCUNvdW50IFJlZ2lzdGVyICovCi0jZGVmaW5lCVdET0dfU1RBVAkweEZGQzAwMjA4ICAvKiBXYXRjaGRvZwlTdGF0dXMgUmVnaXN0ZXIgKi8KLQotCi0vKiBSZWFsCVRpbWUgQ2xvY2sgKDB4RkZDMDAzMDAgLSAweEZGQzAwM0ZGKSAqLwotI2RlZmluZQlSVENfU1RBVAkweEZGQzAwMzAwICAvKiBSVEMgU3RhdHVzIFJlZ2lzdGVyICovCi0jZGVmaW5lCVJUQ19JQ1RMCTB4RkZDMDAzMDQgIC8qIFJUQyBJbnRlcnJ1cHQgQ29udHJvbCBSZWdpc3RlciAqLwotI2RlZmluZQlSVENfSVNUQVQJMHhGRkMwMDMwOCAgLyogUlRDIEludGVycnVwdCBTdGF0dXMgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJUlRDX1NXQ05UCTB4RkZDMDAzMEMgIC8qIFJUQyBTdG9wd2F0Y2ggQ291bnQgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJUlRDX0FMQVJNCTB4RkZDMDAzMTAgIC8qIFJUQyBBbGFybSBUaW1lIFJlZ2lzdGVyICovCi0jZGVmaW5lCVJUQ19GQVNUCTB4RkZDMDAzMTQgIC8qIFJUQyBQcmVzY2FsZXIgRW5hYmxlIFJlZ2lzdGVyICovCi0jZGVmaW5lCVJUQ19QUkVOCQkweEZGQzAwMzE0ICAvKiBSVEMgUHJlc2NhbGVyIEVuYWJsZSBSZWdpc3RlciAoYWx0ZXJuYXRlCW1hY3JvKSAqLwotCi0KLS8qIFVBUlQwIENvbnRyb2xsZXIgKDB4RkZDMDA0MDAJLSAweEZGQzAwNEZGKSAqLwotI2RlZmluZQlVQVJUMF9USFIJICAgICAgMHhGRkMwMDQwMCAgLyogVHJhbnNtaXQgSG9sZGluZyByZWdpc3RlciAqLwotI2RlZmluZQlVQVJUMF9SQlIJICAgICAgMHhGRkMwMDQwMCAgLyogUmVjZWl2ZSBCdWZmZXIgcmVnaXN0ZXIgKi8KLSNkZWZpbmUJVUFSVDBfRExMCSAgICAgIDB4RkZDMDA0MDAgIC8qIERpdmlzb3IgTGF0Y2ggKExvdy1CeXRlKSAqLwotI2RlZmluZQlVQVJUMF9JRVIJICAgICAgMHhGRkMwMDQwNCAgLyogSW50ZXJydXB0IEVuYWJsZSBSZWdpc3RlciAqLwotI2RlZmluZQlVQVJUMF9ETEgJICAgICAgMHhGRkMwMDQwNCAgLyogRGl2aXNvciBMYXRjaCAoSGlnaC1CeXRlKSAqLwotI2RlZmluZQlVQVJUMF9JSVIJICAgICAgMHhGRkMwMDQwOCAgLyogSW50ZXJydXB0IElkZW50aWZpY2F0aW9uIFJlZ2lzdGVyICovCi0jZGVmaW5lCVVBUlQwX0xDUgkgICAgICAweEZGQzAwNDBDICAvKiBMaW5lIENvbnRyb2wgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJVUFSVDBfTUNSCQkJIDB4RkZDMDA0MTAgIC8qCU1vZGVtIENvbnRyb2wgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJVUFSVDBfTFNSCSAgICAgIDB4RkZDMDA0MTQgIC8qIExpbmUgU3RhdHVzIFJlZ2lzdGVyICovCi0jZGVmaW5lCVVBUlQwX1NDUgkgICAgICAweEZGQzAwNDFDICAvKiBTQ1IgU2NyYXRjaCBSZWdpc3RlciAqLwotI2RlZmluZQlVQVJUMF9HQ1RMCQkgICAgIDB4RkZDMDA0MjQJIC8qIEdsb2JhbCBDb250cm9sIFJlZ2lzdGVyICovCi0KLQotLyogU1BJMAlDb250cm9sbGVyICgweEZGQzAwNTAwIC0gMHhGRkMwMDVGRikgKi8KLQotI2RlZmluZQlTUEkwX0NUTAkJCTB4RkZDMDA1MDAgIC8qIFNQSTAgQ29udHJvbCBSZWdpc3RlciAqLwotI2RlZmluZQlTUEkwX0ZMRwkJCTB4RkZDMDA1MDQgIC8qIFNQSTAgRmxhZyByZWdpc3RlciAqLwotI2RlZmluZQlTUEkwX1NUQVQJCQkweEZGQzAwNTA4ICAvKiBTUEkwIFN0YXR1cyByZWdpc3RlciAqLwotI2RlZmluZQlTUEkwX1REQlIJCQkweEZGQzAwNTBDICAvKiBTUEkwIFRyYW5zbWl0IERhdGEgQnVmZmVyIFJlZ2lzdGVyICovCi0jZGVmaW5lCVNQSTBfUkRCUgkJCTB4RkZDMDA1MTAgIC8qIFNQSTAgUmVjZWl2ZSBEYXRhIEJ1ZmZlcglSZWdpc3RlciAqLwotI2RlZmluZQlTUEkwX0JBVUQJCQkweEZGQzAwNTE0ICAvKiBTUEkwIEJhdWQgcmF0ZSBSZWdpc3RlciAqLwotI2RlZmluZQlTUEkwX1NIQURPVwkJCTB4RkZDMDA1MTggIC8qIFNQSTBfUkRCUiBTaGFkb3cJUmVnaXN0ZXIgKi8KLSNkZWZpbmUgU1BJMF9SRUdCQVNFCQkJU1BJMF9DVEwKLQotCi0vKiBUSU1FUiAwLCAxLCAyIFJlZ2lzdGVycyAoMHhGRkMwMDYwMCAtIDB4RkZDMDA2RkYpICovCi0jZGVmaW5lCVRJTUVSMF9DT05GSUcJCQkweEZGQzAwNjAwICAgICAvKiBUaW1lcgkwIENvbmZpZ3VyYXRpb24JUmVnaXN0ZXIgKi8KLSNkZWZpbmUJVElNRVIwX0NPVU5URVIJCQkJMHhGRkMwMDYwNCAgICAgLyogVGltZXIJMCBDb3VudGVyIFJlZ2lzdGVyICovCi0jZGVmaW5lCVRJTUVSMF9QRVJJT0QJCQkweEZGQzAwNjA4ICAgICAvKiBUaW1lcgkwIFBlcmlvZCBSZWdpc3RlciAqLwotI2RlZmluZQlUSU1FUjBfV0lEVEgJCQkweEZGQzAwNjBDICAgICAvKiBUaW1lcgkwIFdpZHRoCVJlZ2lzdGVyICovCi0KLSNkZWZpbmUJVElNRVIxX0NPTkZJRwkJCTB4RkZDMDA2MTAJLyogIFRpbWVyIDEgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAgICovCi0jZGVmaW5lCVRJTUVSMV9DT1VOVEVSCQkJMHhGRkMwMDYxNAkvKiAgVGltZXIgMSBDb3VudGVyIFJlZ2lzdGVyCSAgICAgKi8KLSNkZWZpbmUJVElNRVIxX1BFUklPRAkJCTB4RkZDMDA2MTgJLyogIFRpbWVyIDEgUGVyaW9kIFJlZ2lzdGVyCSAgICAgKi8KLSNkZWZpbmUJVElNRVIxX1dJRFRICQkJMHhGRkMwMDYxQwkvKiAgVGltZXIgMSBXaWR0aCBSZWdpc3RlcgkgICAgICovCi0KLSNkZWZpbmUJVElNRVIyX0NPTkZJRwkJCTB4RkZDMDA2MjAJLyogVGltZXIgMiBDb25maWd1cmF0aW9uIFJlZ2lzdGVyICAgKi8KLSNkZWZpbmUJVElNRVIyX0NPVU5URVIJCQkweEZGQzAwNjI0CS8qIFRpbWVyIDIgQ291bnRlciBSZWdpc3RlcgkgICAgKi8KLSNkZWZpbmUJVElNRVIyX1BFUklPRAkJCTB4RkZDMDA2MjgJLyogVGltZXIgMiBQZXJpb2QgUmVnaXN0ZXIJICAgICovCi0jZGVmaW5lCVRJTUVSMl9XSURUSAkJCTB4RkZDMDA2MkMJLyogVGltZXIgMiBXaWR0aCBSZWdpc3RlcgkgICAgKi8KLQotI2RlZmluZQlUSU1FUl9FTkFCTEUJCQkJMHhGRkMwMDY0MAkvKiBUaW1lciBFbmFibGUJUmVnaXN0ZXIgKi8KLSNkZWZpbmUJVElNRVJfRElTQUJMRQkJCQkweEZGQzAwNjQ0CS8qIFRpbWVyIERpc2FibGUgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJVElNRVJfU1RBVFVTCQkJCTB4RkZDMDA2NDgJLyogVGltZXIgU3RhdHVzCVJlZ2lzdGVyICovCi0KLQotLyogUHJvZ3JhbW1hYmxlCUZsYWdzICgweEZGQzAwNzAwIC0gMHhGRkMwMDdGRikgKi8KLSNkZWZpbmUJRklPX0ZMQUdfRAkJCQkweEZGQzAwNzAwICAvKiBGbGFnIE1hc2sgdG8gZGlyZWN0bHkgc3BlY2lmeSBzdGF0ZSBvZiBwaW5zICovCi0jZGVmaW5lCUZJT19GTEFHX0MJCQkweEZGQzAwNzA0ICAvKiBQZXJpcGhlcmFsIEludGVycnVwdCBGbGFnIFJlZ2lzdGVyIChjbGVhcikgKi8KLSNkZWZpbmUJRklPX0ZMQUdfUwkJCTB4RkZDMDA3MDggIC8qIFBlcmlwaGVyYWwgSW50ZXJydXB0IEZsYWcgUmVnaXN0ZXIgKHNldCkgKi8KLSNkZWZpbmUJRklPX0ZMQUdfVAkJCQkJMHhGRkMwMDcwQyAgLyogRmxhZyBNYXNrIHRvIGRpcmVjdGx5IHRvZ2dsZSBzdGF0ZSBvZiBwaW5zICovCi0jZGVmaW5lCUZJT19NQVNLQV9ECQkJMHhGRkMwMDcxMCAgLyogRmxhZyBNYXNrIEludGVycnVwdCBBIFJlZ2lzdGVyIChzZXQgZGlyZWN0bHkpICovCi0jZGVmaW5lCUZJT19NQVNLQV9DCQkJMHhGRkMwMDcxNCAgLyogRmxhZyBNYXNrIEludGVycnVwdCBBIFJlZ2lzdGVyIChjbGVhcikgKi8KLSNkZWZpbmUJRklPX01BU0tBX1MJCQkweEZGQzAwNzE4ICAvKiBGbGFnIE1hc2sgSW50ZXJydXB0IEEgUmVnaXN0ZXIgKHNldCkgKi8KLSNkZWZpbmUJRklPX01BU0tBX1QJCQkweEZGQzAwNzFDICAvKiBGbGFnIE1hc2sgSW50ZXJydXB0IEEgUmVnaXN0ZXIgKHRvZ2dsZSkgKi8KLSNkZWZpbmUJRklPX01BU0tCX0QJCQkweEZGQzAwNzIwICAvKiBGbGFnIE1hc2sgSW50ZXJydXB0IEIgUmVnaXN0ZXIgKHNldCBkaXJlY3RseSkgKi8KLSNkZWZpbmUJRklPX01BU0tCX0MJCQkweEZGQzAwNzI0ICAvKiBGbGFnIE1hc2sgSW50ZXJydXB0IEIgUmVnaXN0ZXIgKGNsZWFyKSAqLwotI2RlZmluZQlGSU9fTUFTS0JfUwkJCTB4RkZDMDA3MjggIC8qIEZsYWcgTWFzayBJbnRlcnJ1cHQgQiBSZWdpc3RlciAoc2V0KSAqLwotI2RlZmluZQlGSU9fTUFTS0JfVAkJCTB4RkZDMDA3MkMgIC8qIEZsYWcgTWFzayBJbnRlcnJ1cHQgQiBSZWdpc3RlciAodG9nZ2xlKSAqLwotI2RlZmluZQlGSU9fRElSCQkJCTB4RkZDMDA3MzAgIC8qIFBlcmlwaGVyYWwgRmxhZyBEaXJlY3Rpb24gUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRklPX1BPTEFSCQkJMHhGRkMwMDczNCAgLyogRmxhZyBTb3VyY2UgUG9sYXJpdHkgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRklPX0VER0UJCQkweEZGQzAwNzM4ICAvKiBGbGFnIFNvdXJjZSBTZW5zaXRpdml0eSBSZWdpc3RlciAqLwotI2RlZmluZQlGSU9fQk9USAkJCTB4RkZDMDA3M0MgIC8qIEZsYWcgU2V0CW9uIEJPVEgJRWRnZXMgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRklPX0lORU4JCQkJCTB4RkZDMDA3NDAgIC8qIEZsYWcgSW5wdXQgRW5hYmxlIFJlZ2lzdGVyICAqLwotCi0KLS8qIFNQT1JUMCBDb250cm9sbGVyICgweEZGQzAwODAwIC0gMHhGRkMwMDhGRikgKi8KLSNkZWZpbmUJU1BPUlQwX1RDUjEJCQkJMHhGRkMwMDgwMCAgLyogU1BPUlQwIFRyYW5zbWl0IENvbmZpZ3VyYXRpb24gMSBSZWdpc3RlciAqLwotI2RlZmluZQlTUE9SVDBfVENSMgkJCQkweEZGQzAwODA0ICAvKiBTUE9SVDAgVHJhbnNtaXQgQ29uZmlndXJhdGlvbiAyIFJlZ2lzdGVyICovCi0jZGVmaW5lCVNQT1JUMF9UQ0xLRElWCQkJMHhGRkMwMDgwOCAgLyogU1BPUlQwIFRyYW5zbWl0IENsb2NrIERpdmlkZXIgKi8KLSNkZWZpbmUJU1BPUlQwX1RGU0RJVgkJCTB4RkZDMDA4MEMgIC8qIFNQT1JUMCBUcmFuc21pdCBGcmFtZSBTeW5jIERpdmlkZXIgKi8KLSNkZWZpbmUJU1BPUlQwX1RYCQkJMHhGRkMwMDgxMCAgLyogU1BPUlQwIFRYIERhdGEgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJU1BPUlQwX1JYCQkJMHhGRkMwMDgxOCAgLyogU1BPUlQwIFJYIERhdGEgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJU1BPUlQwX1JDUjEJCQkJMHhGRkMwMDgyMCAgLyogU1BPUlQwIFRyYW5zbWl0IENvbmZpZ3VyYXRpb24gMSBSZWdpc3RlciAqLwotI2RlZmluZQlTUE9SVDBfUkNSMgkJCQkweEZGQzAwODI0ICAvKiBTUE9SVDAgVHJhbnNtaXQgQ29uZmlndXJhdGlvbiAyIFJlZ2lzdGVyICovCi0jZGVmaW5lCVNQT1JUMF9SQ0xLRElWCQkJMHhGRkMwMDgyOCAgLyogU1BPUlQwIFJlY2VpdmUgQ2xvY2sgRGl2aWRlciAqLwotI2RlZmluZQlTUE9SVDBfUkZTRElWCQkJMHhGRkMwMDgyQyAgLyogU1BPUlQwIFJlY2VpdmUgRnJhbWUgU3luYyBEaXZpZGVyICovCi0jZGVmaW5lCVNQT1JUMF9TVEFUCQkJMHhGRkMwMDgzMCAgLyogU1BPUlQwIFN0YXR1cyBSZWdpc3RlciAqLwotI2RlZmluZQlTUE9SVDBfQ0hOTAkJCTB4RkZDMDA4MzQgIC8qIFNQT1JUMCBDdXJyZW50IENoYW5uZWwgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJU1BPUlQwX01DTUMxCQkJMHhGRkMwMDgzOCAgLyogU1BPUlQwIE11bHRpLUNoYW5uZWwgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAxICovCi0jZGVmaW5lCVNQT1JUMF9NQ01DMgkJCTB4RkZDMDA4M0MgIC8qIFNQT1JUMCBNdWx0aS1DaGFubmVsIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgMiAqLwotI2RlZmluZQlTUE9SVDBfTVRDUzAJCQkweEZGQzAwODQwICAvKiBTUE9SVDAgTXVsdGktQ2hhbm5lbCBUcmFuc21pdCBTZWxlY3QgUmVnaXN0ZXIgMCAqLwotI2RlZmluZQlTUE9SVDBfTVRDUzEJCQkweEZGQzAwODQ0ICAvKiBTUE9SVDAgTXVsdGktQ2hhbm5lbCBUcmFuc21pdCBTZWxlY3QgUmVnaXN0ZXIgMSAqLwotI2RlZmluZQlTUE9SVDBfTVRDUzIJCQkweEZGQzAwODQ4ICAvKiBTUE9SVDAgTXVsdGktQ2hhbm5lbCBUcmFuc21pdCBTZWxlY3QgUmVnaXN0ZXIgMiAqLwotI2RlZmluZQlTUE9SVDBfTVRDUzMJCQkweEZGQzAwODRDICAvKiBTUE9SVDAgTXVsdGktQ2hhbm5lbCBUcmFuc21pdCBTZWxlY3QgUmVnaXN0ZXIgMyAqLwotI2RlZmluZQlTUE9SVDBfTVJDUzAJCQkweEZGQzAwODUwICAvKiBTUE9SVDAgTXVsdGktQ2hhbm5lbCBSZWNlaXZlIFNlbGVjdCBSZWdpc3RlciAwICovCi0jZGVmaW5lCVNQT1JUMF9NUkNTMQkJCTB4RkZDMDA4NTQgIC8qIFNQT1JUMCBNdWx0aS1DaGFubmVsIFJlY2VpdmUgU2VsZWN0IFJlZ2lzdGVyIDEgKi8KLSNkZWZpbmUJU1BPUlQwX01SQ1MyCQkJMHhGRkMwMDg1OCAgLyogU1BPUlQwIE11bHRpLUNoYW5uZWwgUmVjZWl2ZSBTZWxlY3QgUmVnaXN0ZXIgMiAqLwotI2RlZmluZQlTUE9SVDBfTVJDUzMJCQkweEZGQzAwODVDICAvKiBTUE9SVDAgTXVsdGktQ2hhbm5lbCBSZWNlaXZlIFNlbGVjdCBSZWdpc3RlciAzICovCi0KLQotLyogU1BPUlQxIENvbnRyb2xsZXIgKDB4RkZDMDA5MDAgLSAweEZGQzAwOUZGKSAqLwotI2RlZmluZQlTUE9SVDFfVENSMQkJCQkweEZGQzAwOTAwICAvKiBTUE9SVDEgVHJhbnNtaXQgQ29uZmlndXJhdGlvbiAxIFJlZ2lzdGVyICovCi0jZGVmaW5lCVNQT1JUMV9UQ1IyCQkJCTB4RkZDMDA5MDQgIC8qIFNQT1JUMSBUcmFuc21pdCBDb25maWd1cmF0aW9uIDIgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJU1BPUlQxX1RDTEtESVYJCQkweEZGQzAwOTA4ICAvKiBTUE9SVDEgVHJhbnNtaXQgQ2xvY2sgRGl2aWRlciAqLwotI2RlZmluZQlTUE9SVDFfVEZTRElWCQkJMHhGRkMwMDkwQyAgLyogU1BPUlQxIFRyYW5zbWl0IEZyYW1lIFN5bmMgRGl2aWRlciAqLwotI2RlZmluZQlTUE9SVDFfVFgJCQkweEZGQzAwOTEwICAvKiBTUE9SVDEgVFggRGF0YSBSZWdpc3RlciAqLwotI2RlZmluZQlTUE9SVDFfUlgJCQkweEZGQzAwOTE4ICAvKiBTUE9SVDEgUlggRGF0YSBSZWdpc3RlciAqLwotI2RlZmluZQlTUE9SVDFfUkNSMQkJCQkweEZGQzAwOTIwICAvKiBTUE9SVDEgVHJhbnNtaXQgQ29uZmlndXJhdGlvbiAxIFJlZ2lzdGVyICovCi0jZGVmaW5lCVNQT1JUMV9SQ1IyCQkJCTB4RkZDMDA5MjQgIC8qIFNQT1JUMSBUcmFuc21pdCBDb25maWd1cmF0aW9uIDIgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJU1BPUlQxX1JDTEtESVYJCQkweEZGQzAwOTI4ICAvKiBTUE9SVDEgUmVjZWl2ZSBDbG9jayBEaXZpZGVyICovCi0jZGVmaW5lCVNQT1JUMV9SRlNESVYJCQkweEZGQzAwOTJDICAvKiBTUE9SVDEgUmVjZWl2ZSBGcmFtZSBTeW5jIERpdmlkZXIgKi8KLSNkZWZpbmUJU1BPUlQxX1NUQVQJCQkweEZGQzAwOTMwICAvKiBTUE9SVDEgU3RhdHVzIFJlZ2lzdGVyICovCi0jZGVmaW5lCVNQT1JUMV9DSE5MCQkJMHhGRkMwMDkzNCAgLyogU1BPUlQxIEN1cnJlbnQgQ2hhbm5lbCBSZWdpc3RlciAqLwotI2RlZmluZQlTUE9SVDFfTUNNQzEJCQkweEZGQzAwOTM4ICAvKiBTUE9SVDEgTXVsdGktQ2hhbm5lbCBDb25maWd1cmF0aW9uIFJlZ2lzdGVyIDEgKi8KLSNkZWZpbmUJU1BPUlQxX01DTUMyCQkJMHhGRkMwMDkzQyAgLyogU1BPUlQxIE11bHRpLUNoYW5uZWwgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAyICovCi0jZGVmaW5lCVNQT1JUMV9NVENTMAkJCTB4RkZDMDA5NDAgIC8qIFNQT1JUMSBNdWx0aS1DaGFubmVsIFRyYW5zbWl0IFNlbGVjdCBSZWdpc3RlciAwICovCi0jZGVmaW5lCVNQT1JUMV9NVENTMQkJCTB4RkZDMDA5NDQgIC8qIFNQT1JUMSBNdWx0aS1DaGFubmVsIFRyYW5zbWl0IFNlbGVjdCBSZWdpc3RlciAxICovCi0jZGVmaW5lCVNQT1JUMV9NVENTMgkJCTB4RkZDMDA5NDggIC8qIFNQT1JUMSBNdWx0aS1DaGFubmVsIFRyYW5zbWl0IFNlbGVjdCBSZWdpc3RlciAyICovCi0jZGVmaW5lCVNQT1JUMV9NVENTMwkJCTB4RkZDMDA5NEMgIC8qIFNQT1JUMSBNdWx0aS1DaGFubmVsIFRyYW5zbWl0IFNlbGVjdCBSZWdpc3RlciAzICovCi0jZGVmaW5lCVNQT1JUMV9NUkNTMAkJCTB4RkZDMDA5NTAgIC8qIFNQT1JUMSBNdWx0aS1DaGFubmVsIFJlY2VpdmUgU2VsZWN0IFJlZ2lzdGVyIDAgKi8KLSNkZWZpbmUJU1BPUlQxX01SQ1MxCQkJMHhGRkMwMDk1NCAgLyogU1BPUlQxIE11bHRpLUNoYW5uZWwgUmVjZWl2ZSBTZWxlY3QgUmVnaXN0ZXIgMSAqLwotI2RlZmluZQlTUE9SVDFfTVJDUzIJCQkweEZGQzAwOTU4ICAvKiBTUE9SVDEgTXVsdGktQ2hhbm5lbCBSZWNlaXZlIFNlbGVjdCBSZWdpc3RlciAyICovCi0jZGVmaW5lCVNQT1JUMV9NUkNTMwkJCTB4RkZDMDA5NUMgIC8qIFNQT1JUMSBNdWx0aS1DaGFubmVsIFJlY2VpdmUgU2VsZWN0IFJlZ2lzdGVyIDMgKi8KLQotCi0vKiBFeHRlcm5hbCBCdXMJSW50ZXJmYWNlIFVuaXQgKDB4RkZDMDBBMDAgLSAweEZGQzAwQUZGKSAqLwotLyogQXN5bmNocm9ub3VzCU1lbW9yeSBDb250cm9sbGVyICAqLwotI2RlZmluZQlFQklVX0FNR0NUTAkJCTB4RkZDMDBBMDAgIC8qIEFzeW5jaHJvbm91cyBNZW1vcnkgR2xvYmFsIENvbnRyb2wgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRUJJVV9BTUJDVEwwCQkweEZGQzAwQTA0ICAvKiBBc3luY2hyb25vdXMgTWVtb3J5IEJhbmsJQ29udHJvbAlSZWdpc3RlciAwICovCi0jZGVmaW5lCUVCSVVfQU1CQ1RMMQkJMHhGRkMwMEEwOCAgLyogQXN5bmNocm9ub3VzIE1lbW9yeSBCYW5rCUNvbnRyb2wJUmVnaXN0ZXIgMSAqLwotCi0vKiBTRFJBTSBDb250cm9sbGVyICovCi0jZGVmaW5lCUVCSVVfU0RHQ1RMCQkJMHhGRkMwMEExMCAgLyogU0RSQU0gR2xvYmFsIENvbnRyb2wgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRUJJVV9TREJDVEwJCQkweEZGQzAwQTE0ICAvKiBTRFJBTSBCYW5rIENvbnRyb2wgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRUJJVV9TRFJSQwkJCTB4RkZDMDBBMTggIC8qIFNEUkFNIFJlZnJlc2ggUmF0ZSBDb250cm9sIFJlZ2lzdGVyICovCi0jZGVmaW5lCUVCSVVfU0RTVEFUCQkJMHhGRkMwMEExQyAgLyogU0RSQU0gU3RhdHVzIFJlZ2lzdGVyICovCi0KLQotCi0vKiBETUEgQ29udHJvbGxlciAwIFRyYWZmaWMgQ29udHJvbCBSZWdpc3RlcnMgKDB4RkZDMDBCMDAgLSAweEZGQzAwQkZGKSAqLwotCi0jZGVmaW5lCURNQUMwX1RDX1BFUgkJCTB4RkZDMDBCMEMJLyogRE1BIENvbnRyb2xsZXIgMCBUcmFmZmljIENvbnRyb2wgUGVyaW9kcyBSZWdpc3RlciAqLwotI2RlZmluZQlETUFDMF9UQ19DTlQJCQkweEZGQzAwQjEwCS8qIERNQSBDb250cm9sbGVyIDAgVHJhZmZpYyBDb250cm9sIEN1cnJlbnQgQ291bnRzIFJlZ2lzdGVyICovCi0KLS8qIEFsdGVybmF0ZSBkZXByZWNhdGVkCXJlZ2lzdGVyIG5hbWVzIChiZWxvdykgcHJvdmlkZWQJZm9yIGJhY2t3YXJkcyBjb2RlIGNvbXBhdGliaWxpdHkgKi8KLSNkZWZpbmUJRE1BMF9UQ1BFUgkJCURNQUMwX1RDX1BFUgotI2RlZmluZQlETUEwX1RDQ05UCQkJRE1BQzBfVENfQ05UCi0KLQotLyogRE1BIENvbnRyb2xsZXIgMCAoMHhGRkMwMEMwMAktIDB4RkZDMDBGRkYpCQkJCQkJCSAqLwotCi0jZGVmaW5lCURNQTBfTkVYVF9ERVNDX1BUUgkJMHhGRkMwMEMwMAkvKiBETUEgQ2hhbm5lbCAwIE5leHQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyICovCi0jZGVmaW5lCURNQTBfU1RBUlRfQUREUgkJCTB4RkZDMDBDMDQJLyogRE1BIENoYW5uZWwgMCBTdGFydCBBZGRyZXNzIFJlZ2lzdGVyICovCi0jZGVmaW5lCURNQTBfQ09ORklHCQkJCTB4RkZDMDBDMDgJLyogRE1BIENoYW5uZWwgMCBDb25maWd1cmF0aW9uIFJlZ2lzdGVyICovCi0jZGVmaW5lCURNQTBfWF9DT1VOVAkJCTB4RkZDMDBDMTAJLyogRE1BIENoYW5uZWwgMCBYIENvdW50IFJlZ2lzdGVyICovCi0jZGVmaW5lCURNQTBfWF9NT0RJRlkJCQkweEZGQzAwQzE0CS8qIERNQSBDaGFubmVsIDAgWCBNb2RpZnkgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BMF9ZX0NPVU5UCQkJMHhGRkMwMEMxOAkvKiBETUEgQ2hhbm5lbCAwIFkgQ291bnQgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BMF9ZX01PRElGWQkJCTB4RkZDMDBDMUMJLyogRE1BIENoYW5uZWwgMCBZIE1vZGlmeSBSZWdpc3RlciAqLwotI2RlZmluZQlETUEwX0NVUlJfREVTQ19QVFIJCTB4RkZDMDBDMjAJLyogRE1BIENoYW5uZWwgMCBDdXJyZW50IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlciAqLwotI2RlZmluZQlETUEwX0NVUlJfQUREUgkJCTB4RkZDMDBDMjQJLyogRE1BIENoYW5uZWwgMCBDdXJyZW50IEFkZHJlc3MgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BMF9JUlFfU1RBVFVTCQkJMHhGRkMwMEMyOAkvKiBETUEgQ2hhbm5lbCAwIEludGVycnVwdC9TdGF0dXMgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BMF9QRVJJUEhFUkFMX01BUAkJMHhGRkMwMEMyQwkvKiBETUEgQ2hhbm5lbCAwIFBlcmlwaGVyYWwgTWFwCVJlZ2lzdGVyICovCi0jZGVmaW5lCURNQTBfQ1VSUl9YX0NPVU5UCQkweEZGQzAwQzMwCS8qIERNQSBDaGFubmVsIDAgQ3VycmVudCBYIENvdW50IFJlZ2lzdGVyICovCi0jZGVmaW5lCURNQTBfQ1VSUl9ZX0NPVU5UCQkweEZGQzAwQzM4CS8qIERNQSBDaGFubmVsIDAgQ3VycmVudCBZIENvdW50IFJlZ2lzdGVyICovCi0KLSNkZWZpbmUJRE1BMV9ORVhUX0RFU0NfUFRSCQkweEZGQzAwQzQwCS8qIERNQSBDaGFubmVsIDEgTmV4dCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BMV9TVEFSVF9BRERSCQkJMHhGRkMwMEM0NAkvKiBETUEgQ2hhbm5lbCAxIFN0YXJ0IEFkZHJlc3MgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BMV9DT05GSUcJCQkJMHhGRkMwMEM0OAkvKiBETUEgQ2hhbm5lbCAxIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BMV9YX0NPVU5UCQkJMHhGRkMwMEM1MAkvKiBETUEgQ2hhbm5lbCAxIFggQ291bnQgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BMV9YX01PRElGWQkJCTB4RkZDMDBDNTQJLyogRE1BIENoYW5uZWwgMSBYIE1vZGlmeSBSZWdpc3RlciAqLwotI2RlZmluZQlETUExX1lfQ09VTlQJCQkweEZGQzAwQzU4CS8qIERNQSBDaGFubmVsIDEgWSBDb3VudCBSZWdpc3RlciAqLwotI2RlZmluZQlETUExX1lfTU9ESUZZCQkJMHhGRkMwMEM1QwkvKiBETUEgQ2hhbm5lbCAxIFkgTW9kaWZ5IFJlZ2lzdGVyICovCi0jZGVmaW5lCURNQTFfQ1VSUl9ERVNDX1BUUgkJMHhGRkMwMEM2MAkvKiBETUEgQ2hhbm5lbCAxIEN1cnJlbnQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyICovCi0jZGVmaW5lCURNQTFfQ1VSUl9BRERSCQkJMHhGRkMwMEM2NAkvKiBETUEgQ2hhbm5lbCAxIEN1cnJlbnQgQWRkcmVzcyBSZWdpc3RlciAqLwotI2RlZmluZQlETUExX0lSUV9TVEFUVVMJCQkweEZGQzAwQzY4CS8qIERNQSBDaGFubmVsIDEgSW50ZXJydXB0L1N0YXR1cyBSZWdpc3RlciAqLwotI2RlZmluZQlETUExX1BFUklQSEVSQUxfTUFQCQkweEZGQzAwQzZDCS8qIERNQSBDaGFubmVsIDEgUGVyaXBoZXJhbCBNYXAJUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BMV9DVVJSX1hfQ09VTlQJCTB4RkZDMDBDNzAJLyogRE1BIENoYW5uZWwgMSBDdXJyZW50IFggQ291bnQgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BMV9DVVJSX1lfQ09VTlQJCTB4RkZDMDBDNzgJLyogRE1BIENoYW5uZWwgMSBDdXJyZW50IFkgQ291bnQgUmVnaXN0ZXIgKi8KLQotI2RlZmluZQlETUEyX05FWFRfREVTQ19QVFIJCTB4RkZDMDBDODAJLyogRE1BIENoYW5uZWwgMiBOZXh0IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlciAqLwotI2RlZmluZQlETUEyX1NUQVJUX0FERFIJCQkweEZGQzAwQzg0CS8qIERNQSBDaGFubmVsIDIgU3RhcnQgQWRkcmVzcyBSZWdpc3RlciAqLwotI2RlZmluZQlETUEyX0NPTkZJRwkJCQkweEZGQzAwQzg4CS8qIERNQSBDaGFubmVsIDIgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAqLwotI2RlZmluZQlETUEyX1hfQ09VTlQJCQkweEZGQzAwQzkwCS8qIERNQSBDaGFubmVsIDIgWCBDb3VudCBSZWdpc3RlciAqLwotI2RlZmluZQlETUEyX1hfTU9ESUZZCQkJMHhGRkMwMEM5NAkvKiBETUEgQ2hhbm5lbCAyIFggTW9kaWZ5IFJlZ2lzdGVyICovCi0jZGVmaW5lCURNQTJfWV9DT1VOVAkJCTB4RkZDMDBDOTgJLyogRE1BIENoYW5uZWwgMiBZIENvdW50IFJlZ2lzdGVyICovCi0jZGVmaW5lCURNQTJfWV9NT0RJRlkJCQkweEZGQzAwQzlDCS8qIERNQSBDaGFubmVsIDIgWSBNb2RpZnkgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BMl9DVVJSX0RFU0NfUFRSCQkweEZGQzAwQ0EwCS8qIERNQSBDaGFubmVsIDIgQ3VycmVudCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BMl9DVVJSX0FERFIJCQkweEZGQzAwQ0E0CS8qIERNQSBDaGFubmVsIDIgQ3VycmVudCBBZGRyZXNzIFJlZ2lzdGVyICovCi0jZGVmaW5lCURNQTJfSVJRX1NUQVRVUwkJCTB4RkZDMDBDQTgJLyogRE1BIENoYW5uZWwgMiBJbnRlcnJ1cHQvU3RhdHVzIFJlZ2lzdGVyICovCi0jZGVmaW5lCURNQTJfUEVSSVBIRVJBTF9NQVAJCTB4RkZDMDBDQUMJLyogRE1BIENoYW5uZWwgMiBQZXJpcGhlcmFsIE1hcAlSZWdpc3RlciAqLwotI2RlZmluZQlETUEyX0NVUlJfWF9DT1VOVAkJMHhGRkMwMENCMAkvKiBETUEgQ2hhbm5lbCAyIEN1cnJlbnQgWCBDb3VudCBSZWdpc3RlciAqLwotI2RlZmluZQlETUEyX0NVUlJfWV9DT1VOVAkJMHhGRkMwMENCOAkvKiBETUEgQ2hhbm5lbCAyIEN1cnJlbnQgWSBDb3VudCBSZWdpc3RlciAqLwotCi0jZGVmaW5lCURNQTNfTkVYVF9ERVNDX1BUUgkJMHhGRkMwMENDMAkvKiBETUEgQ2hhbm5lbCAzIE5leHQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyICovCi0jZGVmaW5lCURNQTNfU1RBUlRfQUREUgkJCTB4RkZDMDBDQzQJLyogRE1BIENoYW5uZWwgMyBTdGFydCBBZGRyZXNzIFJlZ2lzdGVyICovCi0jZGVmaW5lCURNQTNfQ09ORklHCQkJCTB4RkZDMDBDQzgJLyogRE1BIENoYW5uZWwgMyBDb25maWd1cmF0aW9uIFJlZ2lzdGVyICovCi0jZGVmaW5lCURNQTNfWF9DT1VOVAkJCTB4RkZDMDBDRDAJLyogRE1BIENoYW5uZWwgMyBYIENvdW50IFJlZ2lzdGVyICovCi0jZGVmaW5lCURNQTNfWF9NT0RJRlkJCQkweEZGQzAwQ0Q0CS8qIERNQSBDaGFubmVsIDMgWCBNb2RpZnkgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BM19ZX0NPVU5UCQkJMHhGRkMwMENEOAkvKiBETUEgQ2hhbm5lbCAzIFkgQ291bnQgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BM19ZX01PRElGWQkJCTB4RkZDMDBDREMJLyogRE1BIENoYW5uZWwgMyBZIE1vZGlmeSBSZWdpc3RlciAqLwotI2RlZmluZQlETUEzX0NVUlJfREVTQ19QVFIJCTB4RkZDMDBDRTAJLyogRE1BIENoYW5uZWwgMyBDdXJyZW50IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlciAqLwotI2RlZmluZQlETUEzX0NVUlJfQUREUgkJCTB4RkZDMDBDRTQJLyogRE1BIENoYW5uZWwgMyBDdXJyZW50IEFkZHJlc3MgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BM19JUlFfU1RBVFVTCQkJMHhGRkMwMENFOAkvKiBETUEgQ2hhbm5lbCAzIEludGVycnVwdC9TdGF0dXMgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BM19QRVJJUEhFUkFMX01BUAkJMHhGRkMwMENFQwkvKiBETUEgQ2hhbm5lbCAzIFBlcmlwaGVyYWwgTWFwCVJlZ2lzdGVyICovCi0jZGVmaW5lCURNQTNfQ1VSUl9YX0NPVU5UCQkweEZGQzAwQ0YwCS8qIERNQSBDaGFubmVsIDMgQ3VycmVudCBYIENvdW50IFJlZ2lzdGVyICovCi0jZGVmaW5lCURNQTNfQ1VSUl9ZX0NPVU5UCQkweEZGQzAwQ0Y4CS8qIERNQSBDaGFubmVsIDMgQ3VycmVudCBZIENvdW50IFJlZ2lzdGVyICovCi0KLSNkZWZpbmUJRE1BNF9ORVhUX0RFU0NfUFRSCQkweEZGQzAwRDAwCS8qIERNQSBDaGFubmVsIDQgTmV4dCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BNF9TVEFSVF9BRERSCQkJMHhGRkMwMEQwNAkvKiBETUEgQ2hhbm5lbCA0IFN0YXJ0IEFkZHJlc3MgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BNF9DT05GSUcJCQkJMHhGRkMwMEQwOAkvKiBETUEgQ2hhbm5lbCA0IENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BNF9YX0NPVU5UCQkJMHhGRkMwMEQxMAkvKiBETUEgQ2hhbm5lbCA0IFggQ291bnQgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BNF9YX01PRElGWQkJCTB4RkZDMDBEMTQJLyogRE1BIENoYW5uZWwgNCBYIE1vZGlmeSBSZWdpc3RlciAqLwotI2RlZmluZQlETUE0X1lfQ09VTlQJCQkweEZGQzAwRDE4CS8qIERNQSBDaGFubmVsIDQgWSBDb3VudCBSZWdpc3RlciAqLwotI2RlZmluZQlETUE0X1lfTU9ESUZZCQkJMHhGRkMwMEQxQwkvKiBETUEgQ2hhbm5lbCA0IFkgTW9kaWZ5IFJlZ2lzdGVyICovCi0jZGVmaW5lCURNQTRfQ1VSUl9ERVNDX1BUUgkJMHhGRkMwMEQyMAkvKiBETUEgQ2hhbm5lbCA0IEN1cnJlbnQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyICovCi0jZGVmaW5lCURNQTRfQ1VSUl9BRERSCQkJMHhGRkMwMEQyNAkvKiBETUEgQ2hhbm5lbCA0IEN1cnJlbnQgQWRkcmVzcyBSZWdpc3RlciAqLwotI2RlZmluZQlETUE0X0lSUV9TVEFUVVMJCQkweEZGQzAwRDI4CS8qIERNQSBDaGFubmVsIDQgSW50ZXJydXB0L1N0YXR1cyBSZWdpc3RlciAqLwotI2RlZmluZQlETUE0X1BFUklQSEVSQUxfTUFQCQkweEZGQzAwRDJDCS8qIERNQSBDaGFubmVsIDQgUGVyaXBoZXJhbCBNYXAJUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BNF9DVVJSX1hfQ09VTlQJCTB4RkZDMDBEMzAJLyogRE1BIENoYW5uZWwgNCBDdXJyZW50IFggQ291bnQgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BNF9DVVJSX1lfQ09VTlQJCTB4RkZDMDBEMzgJLyogRE1BIENoYW5uZWwgNCBDdXJyZW50IFkgQ291bnQgUmVnaXN0ZXIgKi8KLQotI2RlZmluZQlETUE1X05FWFRfREVTQ19QVFIJCTB4RkZDMDBENDAJLyogRE1BIENoYW5uZWwgNSBOZXh0IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlciAqLwotI2RlZmluZQlETUE1X1NUQVJUX0FERFIJCQkweEZGQzAwRDQ0CS8qIERNQSBDaGFubmVsIDUgU3RhcnQgQWRkcmVzcyBSZWdpc3RlciAqLwotI2RlZmluZQlETUE1X0NPTkZJRwkJCQkweEZGQzAwRDQ4CS8qIERNQSBDaGFubmVsIDUgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAqLwotI2RlZmluZQlETUE1X1hfQ09VTlQJCQkweEZGQzAwRDUwCS8qIERNQSBDaGFubmVsIDUgWCBDb3VudCBSZWdpc3RlciAqLwotI2RlZmluZQlETUE1X1hfTU9ESUZZCQkJMHhGRkMwMEQ1NAkvKiBETUEgQ2hhbm5lbCA1IFggTW9kaWZ5IFJlZ2lzdGVyICovCi0jZGVmaW5lCURNQTVfWV9DT1VOVAkJCTB4RkZDMDBENTgJLyogRE1BIENoYW5uZWwgNSBZIENvdW50IFJlZ2lzdGVyICovCi0jZGVmaW5lCURNQTVfWV9NT0RJRlkJCQkweEZGQzAwRDVDCS8qIERNQSBDaGFubmVsIDUgWSBNb2RpZnkgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BNV9DVVJSX0RFU0NfUFRSCQkweEZGQzAwRDYwCS8qIERNQSBDaGFubmVsIDUgQ3VycmVudCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BNV9DVVJSX0FERFIJCQkweEZGQzAwRDY0CS8qIERNQSBDaGFubmVsIDUgQ3VycmVudCBBZGRyZXNzIFJlZ2lzdGVyICovCi0jZGVmaW5lCURNQTVfSVJRX1NUQVRVUwkJCTB4RkZDMDBENjgJLyogRE1BIENoYW5uZWwgNSBJbnRlcnJ1cHQvU3RhdHVzIFJlZ2lzdGVyICovCi0jZGVmaW5lCURNQTVfUEVSSVBIRVJBTF9NQVAJCTB4RkZDMDBENkMJLyogRE1BIENoYW5uZWwgNSBQZXJpcGhlcmFsIE1hcAlSZWdpc3RlciAqLwotI2RlZmluZQlETUE1X0NVUlJfWF9DT1VOVAkJMHhGRkMwMEQ3MAkvKiBETUEgQ2hhbm5lbCA1IEN1cnJlbnQgWCBDb3VudCBSZWdpc3RlciAqLwotI2RlZmluZQlETUE1X0NVUlJfWV9DT1VOVAkJMHhGRkMwMEQ3OAkvKiBETUEgQ2hhbm5lbCA1IEN1cnJlbnQgWSBDb3VudCBSZWdpc3RlciAqLwotCi0jZGVmaW5lCURNQTZfTkVYVF9ERVNDX1BUUgkJMHhGRkMwMEQ4MAkvKiBETUEgQ2hhbm5lbCA2IE5leHQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyICovCi0jZGVmaW5lCURNQTZfU1RBUlRfQUREUgkJCTB4RkZDMDBEODQJLyogRE1BIENoYW5uZWwgNiBTdGFydCBBZGRyZXNzIFJlZ2lzdGVyICovCi0jZGVmaW5lCURNQTZfQ09ORklHCQkJCTB4RkZDMDBEODgJLyogRE1BIENoYW5uZWwgNiBDb25maWd1cmF0aW9uIFJlZ2lzdGVyICovCi0jZGVmaW5lCURNQTZfWF9DT1VOVAkJCTB4RkZDMDBEOTAJLyogRE1BIENoYW5uZWwgNiBYIENvdW50IFJlZ2lzdGVyICovCi0jZGVmaW5lCURNQTZfWF9NT0RJRlkJCQkweEZGQzAwRDk0CS8qIERNQSBDaGFubmVsIDYgWCBNb2RpZnkgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BNl9ZX0NPVU5UCQkJMHhGRkMwMEQ5OAkvKiBETUEgQ2hhbm5lbCA2IFkgQ291bnQgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BNl9ZX01PRElGWQkJCTB4RkZDMDBEOUMJLyogRE1BIENoYW5uZWwgNiBZIE1vZGlmeSBSZWdpc3RlciAqLwotI2RlZmluZQlETUE2X0NVUlJfREVTQ19QVFIJCTB4RkZDMDBEQTAJLyogRE1BIENoYW5uZWwgNiBDdXJyZW50IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlciAqLwotI2RlZmluZQlETUE2X0NVUlJfQUREUgkJCTB4RkZDMDBEQTQJLyogRE1BIENoYW5uZWwgNiBDdXJyZW50IEFkZHJlc3MgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BNl9JUlFfU1RBVFVTCQkJMHhGRkMwMERBOAkvKiBETUEgQ2hhbm5lbCA2IEludGVycnVwdC9TdGF0dXMgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BNl9QRVJJUEhFUkFMX01BUAkJMHhGRkMwMERBQwkvKiBETUEgQ2hhbm5lbCA2IFBlcmlwaGVyYWwgTWFwCVJlZ2lzdGVyICovCi0jZGVmaW5lCURNQTZfQ1VSUl9YX0NPVU5UCQkweEZGQzAwREIwCS8qIERNQSBDaGFubmVsIDYgQ3VycmVudCBYIENvdW50IFJlZ2lzdGVyICovCi0jZGVmaW5lCURNQTZfQ1VSUl9ZX0NPVU5UCQkweEZGQzAwREI4CS8qIERNQSBDaGFubmVsIDYgQ3VycmVudCBZIENvdW50IFJlZ2lzdGVyICovCi0KLSNkZWZpbmUJRE1BN19ORVhUX0RFU0NfUFRSCQkweEZGQzAwREMwCS8qIERNQSBDaGFubmVsIDcgTmV4dCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BN19TVEFSVF9BRERSCQkJMHhGRkMwMERDNAkvKiBETUEgQ2hhbm5lbCA3IFN0YXJ0IEFkZHJlc3MgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BN19DT05GSUcJCQkJMHhGRkMwMERDOAkvKiBETUEgQ2hhbm5lbCA3IENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BN19YX0NPVU5UCQkJMHhGRkMwMEREMAkvKiBETUEgQ2hhbm5lbCA3IFggQ291bnQgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BN19YX01PRElGWQkJCTB4RkZDMDBERDQJLyogRE1BIENoYW5uZWwgNyBYIE1vZGlmeSBSZWdpc3RlciAqLwotI2RlZmluZQlETUE3X1lfQ09VTlQJCQkweEZGQzAwREQ4CS8qIERNQSBDaGFubmVsIDcgWSBDb3VudCBSZWdpc3RlciAqLwotI2RlZmluZQlETUE3X1lfTU9ESUZZCQkJMHhGRkMwMEREQwkvKiBETUEgQ2hhbm5lbCA3IFkgTW9kaWZ5IFJlZ2lzdGVyICovCi0jZGVmaW5lCURNQTdfQ1VSUl9ERVNDX1BUUgkJMHhGRkMwMERFMAkvKiBETUEgQ2hhbm5lbCA3IEN1cnJlbnQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyICovCi0jZGVmaW5lCURNQTdfQ1VSUl9BRERSCQkJMHhGRkMwMERFNAkvKiBETUEgQ2hhbm5lbCA3IEN1cnJlbnQgQWRkcmVzcyBSZWdpc3RlciAqLwotI2RlZmluZQlETUE3X0lSUV9TVEFUVVMJCQkweEZGQzAwREU4CS8qIERNQSBDaGFubmVsIDcgSW50ZXJydXB0L1N0YXR1cyBSZWdpc3RlciAqLwotI2RlZmluZQlETUE3X1BFUklQSEVSQUxfTUFQCQkweEZGQzAwREVDCS8qIERNQSBDaGFubmVsIDcgUGVyaXBoZXJhbCBNYXAJUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BN19DVVJSX1hfQ09VTlQJCTB4RkZDMDBERjAJLyogRE1BIENoYW5uZWwgNyBDdXJyZW50IFggQ291bnQgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BN19DVVJSX1lfQ09VTlQJCTB4RkZDMDBERjgJLyogRE1BIENoYW5uZWwgNyBDdXJyZW50IFkgQ291bnQgUmVnaXN0ZXIgKi8KLQotI2RlZmluZQlNRE1BMF9EMF9ORVhUX0RFU0NfUFRSCTB4RkZDMDBFMDAJLyogTWVtRE1BMCBTdHJlYW0gMCBEZXN0aW5hdGlvbglOZXh0IERlc2NyaXB0b3IJUG9pbnRlcglSZWdpc3RlciAqLwotI2RlZmluZQlNRE1BMF9EMF9TVEFSVF9BRERSCQkweEZGQzAwRTA0CS8qIE1lbURNQTAgU3RyZWFtIDAgRGVzdGluYXRpb24JU3RhcnQgQWRkcmVzcyBSZWdpc3RlciAqLwotI2RlZmluZQlNRE1BMF9EMF9DT05GSUcJCQkweEZGQzAwRTA4CS8qIE1lbURNQTAgU3RyZWFtIDAgRGVzdGluYXRpb24JQ29uZmlndXJhdGlvbiBSZWdpc3RlciAqLwotI2RlZmluZQlNRE1BMF9EMF9YX0NPVU5UCQkweEZGQzAwRTEwCS8qIE1lbURNQTAgU3RyZWFtIDAgRGVzdGluYXRpb24JWCBDb3VudAlSZWdpc3RlciAqLwotI2RlZmluZQlNRE1BMF9EMF9YX01PRElGWQkJMHhGRkMwMEUxNAkvKiBNZW1ETUEwIFN0cmVhbSAwIERlc3RpbmF0aW9uCVggTW9kaWZ5IFJlZ2lzdGVyICovCi0jZGVmaW5lCU1ETUEwX0QwX1lfQ09VTlQJCTB4RkZDMDBFMTgJLyogTWVtRE1BMCBTdHJlYW0gMCBEZXN0aW5hdGlvbglZIENvdW50CVJlZ2lzdGVyICovCi0jZGVmaW5lCU1ETUEwX0QwX1lfTU9ESUZZCQkweEZGQzAwRTFDCS8qIE1lbURNQTAgU3RyZWFtIDAgRGVzdGluYXRpb24JWSBNb2RpZnkgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJTURNQTBfRDBfQ1VSUl9ERVNDX1BUUgkweEZGQzAwRTIwCS8qIE1lbURNQTAgU3RyZWFtIDAgRGVzdGluYXRpb24JQ3VycmVudAlEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJTURNQTBfRDBfQ1VSUl9BRERSCQkweEZGQzAwRTI0CS8qIE1lbURNQTAgU3RyZWFtIDAgRGVzdGluYXRpb24JQ3VycmVudAlBZGRyZXNzCVJlZ2lzdGVyICovCi0jZGVmaW5lCU1ETUEwX0QwX0lSUV9TVEFUVVMJCTB4RkZDMDBFMjgJLyogTWVtRE1BMCBTdHJlYW0gMCBEZXN0aW5hdGlvbglJbnRlcnJ1cHQvU3RhdHVzIFJlZ2lzdGVyICovCi0jZGVmaW5lCU1ETUEwX0QwX1BFUklQSEVSQUxfTUFQCTB4RkZDMDBFMkMJLyogTWVtRE1BMCBTdHJlYW0gMCBEZXN0aW5hdGlvbglQZXJpcGhlcmFsIE1hcCBSZWdpc3RlciAqLwotI2RlZmluZQlNRE1BMF9EMF9DVVJSX1hfQ09VTlQJMHhGRkMwMEUzMAkvKiBNZW1ETUEwIFN0cmVhbSAwIERlc3RpbmF0aW9uCUN1cnJlbnQJWCBDb3VudAlSZWdpc3RlciAqLwotI2RlZmluZQlNRE1BMF9EMF9DVVJSX1lfQ09VTlQJMHhGRkMwMEUzOAkvKiBNZW1ETUEwIFN0cmVhbSAwIERlc3RpbmF0aW9uCUN1cnJlbnQJWSBDb3VudAlSZWdpc3RlciAqLwotCi0jZGVmaW5lCU1ETUEwX1MwX05FWFRfREVTQ19QVFIJMHhGRkMwMEU0MAkvKiBNZW1ETUEwIFN0cmVhbSAwIFNvdXJjZSBOZXh0CURlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlciAqLwotI2RlZmluZQlNRE1BMF9TMF9TVEFSVF9BRERSCQkweEZGQzAwRTQ0CS8qIE1lbURNQTAgU3RyZWFtIDAgU291cmNlIFN0YXJ0IEFkZHJlc3MgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJTURNQTBfUzBfQ09ORklHCQkJMHhGRkMwMEU0OAkvKiBNZW1ETUEwIFN0cmVhbSAwIFNvdXJjZSBDb25maWd1cmF0aW9uIFJlZ2lzdGVyICovCi0jZGVmaW5lCU1ETUEwX1MwX1hfQ09VTlQJCTB4RkZDMDBFNTAJLyogTWVtRE1BMCBTdHJlYW0gMCBTb3VyY2UgWCBDb3VudCBSZWdpc3RlciAqLwotI2RlZmluZQlNRE1BMF9TMF9YX01PRElGWQkJMHhGRkMwMEU1NAkvKiBNZW1ETUEwIFN0cmVhbSAwIFNvdXJjZSBYIE1vZGlmeSBSZWdpc3RlciAqLwotI2RlZmluZQlNRE1BMF9TMF9ZX0NPVU5UCQkweEZGQzAwRTU4CS8qIE1lbURNQTAgU3RyZWFtIDAgU291cmNlIFkgQ291bnQgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJTURNQTBfUzBfWV9NT0RJRlkJCTB4RkZDMDBFNUMJLyogTWVtRE1BMCBTdHJlYW0gMCBTb3VyY2UgWSBNb2RpZnkgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJTURNQTBfUzBfQ1VSUl9ERVNDX1BUUgkweEZGQzAwRTYwCS8qIE1lbURNQTAgU3RyZWFtIDAgU291cmNlIEN1cnJlbnQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyICovCi0jZGVmaW5lCU1ETUEwX1MwX0NVUlJfQUREUgkJMHhGRkMwMEU2NAkvKiBNZW1ETUEwIFN0cmVhbSAwIFNvdXJjZSBDdXJyZW50IEFkZHJlc3MgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJTURNQTBfUzBfSVJRX1NUQVRVUwkJMHhGRkMwMEU2OAkvKiBNZW1ETUEwIFN0cmVhbSAwIFNvdXJjZSBJbnRlcnJ1cHQvU3RhdHVzIFJlZ2lzdGVyICovCi0jZGVmaW5lCU1ETUEwX1MwX1BFUklQSEVSQUxfTUFQCTB4RkZDMDBFNkMJLyogTWVtRE1BMCBTdHJlYW0gMCBTb3VyY2UgUGVyaXBoZXJhbCBNYXAgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJTURNQTBfUzBfQ1VSUl9YX0NPVU5UCTB4RkZDMDBFNzAJLyogTWVtRE1BMCBTdHJlYW0gMCBTb3VyY2UgQ3VycmVudCBYIENvdW50IFJlZ2lzdGVyICovCi0jZGVmaW5lCU1ETUEwX1MwX0NVUlJfWV9DT1VOVAkweEZGQzAwRTc4CS8qIE1lbURNQTAgU3RyZWFtIDAgU291cmNlIEN1cnJlbnQgWSBDb3VudCBSZWdpc3RlciAqLwotCi0jZGVmaW5lCU1ETUEwX0QxX05FWFRfREVTQ19QVFIJMHhGRkMwMEU4MAkvKiBNZW1ETUEwIFN0cmVhbSAxIERlc3RpbmF0aW9uCU5leHQgRGVzY3JpcHRvcglQb2ludGVyCVJlZ2lzdGVyICovCi0jZGVmaW5lCU1ETUEwX0QxX1NUQVJUX0FERFIJCTB4RkZDMDBFODQJLyogTWVtRE1BMCBTdHJlYW0gMSBEZXN0aW5hdGlvbglTdGFydCBBZGRyZXNzIFJlZ2lzdGVyICovCi0jZGVmaW5lCU1ETUEwX0QxX0NPTkZJRwkJCTB4RkZDMDBFODgJLyogTWVtRE1BMCBTdHJlYW0gMSBEZXN0aW5hdGlvbglDb25maWd1cmF0aW9uIFJlZ2lzdGVyICovCi0jZGVmaW5lCU1ETUEwX0QxX1hfQ09VTlQJCTB4RkZDMDBFOTAJLyogTWVtRE1BMCBTdHJlYW0gMSBEZXN0aW5hdGlvbglYIENvdW50CVJlZ2lzdGVyICovCi0jZGVmaW5lCU1ETUEwX0QxX1hfTU9ESUZZCQkweEZGQzAwRTk0CS8qIE1lbURNQTAgU3RyZWFtIDEgRGVzdGluYXRpb24JWCBNb2RpZnkgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJTURNQTBfRDFfWV9DT1VOVAkJMHhGRkMwMEU5OAkvKiBNZW1ETUEwIFN0cmVhbSAxIERlc3RpbmF0aW9uCVkgQ291bnQJUmVnaXN0ZXIgKi8KLSNkZWZpbmUJTURNQTBfRDFfWV9NT0RJRlkJCTB4RkZDMDBFOUMJLyogTWVtRE1BMCBTdHJlYW0gMSBEZXN0aW5hdGlvbglZIE1vZGlmeSBSZWdpc3RlciAqLwotI2RlZmluZQlNRE1BMF9EMV9DVVJSX0RFU0NfUFRSCTB4RkZDMDBFQTAJLyogTWVtRE1BMCBTdHJlYW0gMSBEZXN0aW5hdGlvbglDdXJyZW50CURlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlciAqLwotI2RlZmluZQlNRE1BMF9EMV9DVVJSX0FERFIJCTB4RkZDMDBFQTQJLyogTWVtRE1BMCBTdHJlYW0gMSBEZXN0aW5hdGlvbglDdXJyZW50CUFkZHJlc3MJUmVnaXN0ZXIgKi8KLSNkZWZpbmUJTURNQTBfRDFfSVJRX1NUQVRVUwkJMHhGRkMwMEVBOAkvKiBNZW1ETUEwIFN0cmVhbSAxIERlc3RpbmF0aW9uCUludGVycnVwdC9TdGF0dXMgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJTURNQTBfRDFfUEVSSVBIRVJBTF9NQVAJMHhGRkMwMEVBQwkvKiBNZW1ETUEwIFN0cmVhbSAxIERlc3RpbmF0aW9uCVBlcmlwaGVyYWwgTWFwIFJlZ2lzdGVyICovCi0jZGVmaW5lCU1ETUEwX0QxX0NVUlJfWF9DT1VOVAkweEZGQzAwRUIwCS8qIE1lbURNQTAgU3RyZWFtIDEgRGVzdGluYXRpb24JQ3VycmVudAlYIENvdW50CVJlZ2lzdGVyICovCi0jZGVmaW5lCU1ETUEwX0QxX0NVUlJfWV9DT1VOVAkweEZGQzAwRUI4CS8qIE1lbURNQTAgU3RyZWFtIDEgRGVzdGluYXRpb24JQ3VycmVudAlZIENvdW50CVJlZ2lzdGVyICovCi0KLSNkZWZpbmUJTURNQTBfUzFfTkVYVF9ERVNDX1BUUgkweEZGQzAwRUMwCS8qIE1lbURNQTAgU3RyZWFtIDEgU291cmNlIE5leHQJRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyICovCi0jZGVmaW5lCU1ETUEwX1MxX1NUQVJUX0FERFIJCTB4RkZDMDBFQzQJLyogTWVtRE1BMCBTdHJlYW0gMSBTb3VyY2UgU3RhcnQgQWRkcmVzcyBSZWdpc3RlciAqLwotI2RlZmluZQlNRE1BMF9TMV9DT05GSUcJCQkweEZGQzAwRUM4CS8qIE1lbURNQTAgU3RyZWFtIDEgU291cmNlIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgKi8KLSNkZWZpbmUJTURNQTBfUzFfWF9DT1VOVAkJMHhGRkMwMEVEMAkvKiBNZW1ETUEwIFN0cmVhbSAxIFNvdXJjZSBYIENvdW50IFJlZ2lzdGVyICovCi0jZGVmaW5lCU1ETUEwX1MxX1hfTU9ESUZZCQkweEZGQzAwRUQ0CS8qIE1lbURNQTAgU3RyZWFtIDEgU291cmNlIFggTW9kaWZ5IFJlZ2lzdGVyICovCi0jZGVmaW5lCU1ETUEwX1MxX1lfQ09VTlQJCTB4RkZDMDBFRDgJLyogTWVtRE1BMCBTdHJlYW0gMSBTb3VyY2UgWSBDb3VudCBSZWdpc3RlciAqLwotI2RlZmluZQlNRE1BMF9TMV9ZX01PRElGWQkJMHhGRkMwMEVEQwkvKiBNZW1ETUEwIFN0cmVhbSAxIFNvdXJjZSBZIE1vZGlmeSBSZWdpc3RlciAqLwotI2RlZmluZQlNRE1BMF9TMV9DVVJSX0RFU0NfUFRSCTB4RkZDMDBFRTAJLyogTWVtRE1BMCBTdHJlYW0gMSBTb3VyY2UgQ3VycmVudCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJTURNQTBfUzFfQ1VSUl9BRERSCQkweEZGQzAwRUU0CS8qIE1lbURNQTAgU3RyZWFtIDEgU291cmNlIEN1cnJlbnQgQWRkcmVzcyBSZWdpc3RlciAqLwotI2RlZmluZQlNRE1BMF9TMV9JUlFfU1RBVFVTCQkweEZGQzAwRUU4CS8qIE1lbURNQTAgU3RyZWFtIDEgU291cmNlIEludGVycnVwdC9TdGF0dXMgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJTURNQTBfUzFfUEVSSVBIRVJBTF9NQVAJMHhGRkMwMEVFQwkvKiBNZW1ETUEwIFN0cmVhbSAxIFNvdXJjZSBQZXJpcGhlcmFsIE1hcCBSZWdpc3RlciAqLwotI2RlZmluZQlNRE1BMF9TMV9DVVJSX1hfQ09VTlQJMHhGRkMwMEVGMAkvKiBNZW1ETUEwIFN0cmVhbSAxIFNvdXJjZSBDdXJyZW50IFggQ291bnQgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJTURNQTBfUzFfQ1VSUl9ZX0NPVU5UCTB4RkZDMDBFRjgJLyogTWVtRE1BMCBTdHJlYW0gMSBTb3VyY2UgQ3VycmVudCBZIENvdW50IFJlZ2lzdGVyICovCi0KLSNkZWZpbmUgTURNQV9EMF9ORVhUX0RFU0NfUFRSIE1ETUEwX0QwX05FWFRfREVTQ19QVFIKLSNkZWZpbmUgTURNQV9EMF9TVEFSVF9BRERSIE1ETUEwX0QwX1NUQVJUX0FERFIKLSNkZWZpbmUgTURNQV9EMF9DT05GSUcgTURNQTBfRDBfQ09ORklHCi0jZGVmaW5lIE1ETUFfRDBfWF9DT1VOVCBNRE1BMF9EMF9YX0NPVU5UCi0jZGVmaW5lIE1ETUFfRDBfWF9NT0RJRlkgTURNQTBfRDBfWF9NT0RJRlkKLSNkZWZpbmUgTURNQV9EMF9ZX0NPVU5UIE1ETUEwX0QwX1lfQ09VTlQKLSNkZWZpbmUgTURNQV9EMF9ZX01PRElGWSBNRE1BMF9EMF9ZX01PRElGWQotI2RlZmluZSBNRE1BX0QwX0NVUlJfREVTQ19QVFIgTURNQTBfRDBfQ1VSUl9ERVNDX1BUUgotI2RlZmluZSBNRE1BX0QwX0NVUlJfQUREUiBNRE1BMF9EMF9DVVJSX0FERFIKLSNkZWZpbmUgTURNQV9EMF9JUlFfU1RBVFVTIE1ETUEwX0QwX0lSUV9TVEFUVVMKLSNkZWZpbmUgTURNQV9EMF9QRVJJUEhFUkFMX01BUCBNRE1BMF9EMF9QRVJJUEhFUkFMX01BUAotI2RlZmluZSBNRE1BX0QwX0NVUlJfWF9DT1VOVCBNRE1BMF9EMF9DVVJSX1hfQ09VTlQKLSNkZWZpbmUgTURNQV9EMF9DVVJSX1lfQ09VTlQgTURNQTBfRDBfQ1VSUl9ZX0NPVU5UCi0KLSNkZWZpbmUgTURNQV9TMF9ORVhUX0RFU0NfUFRSIE1ETUEwX1MwX05FWFRfREVTQ19QVFIKLSNkZWZpbmUgTURNQV9TMF9TVEFSVF9BRERSIE1ETUEwX1MwX1NUQVJUX0FERFIKLSNkZWZpbmUgTURNQV9TMF9DT05GSUcgTURNQTBfUzBfQ09ORklHCi0jZGVmaW5lIE1ETUFfUzBfWF9DT1VOVCBNRE1BMF9TMF9YX0NPVU5UCi0jZGVmaW5lIE1ETUFfUzBfWF9NT0RJRlkgTURNQTBfUzBfWF9NT0RJRlkKLSNkZWZpbmUgTURNQV9TMF9ZX0NPVU5UIE1ETUEwX1MwX1lfQ09VTlQKLSNkZWZpbmUgTURNQV9TMF9ZX01PRElGWSBNRE1BMF9TMF9ZX01PRElGWQotI2RlZmluZSBNRE1BX1MwX0NVUlJfREVTQ19QVFIgTURNQTBfUzBfQ1VSUl9ERVNDX1BUUgotI2RlZmluZSBNRE1BX1MwX0NVUlJfQUREUiBNRE1BMF9TMF9DVVJSX0FERFIKLSNkZWZpbmUgTURNQV9TMF9JUlFfU1RBVFVTIE1ETUEwX1MwX0lSUV9TVEFUVVMKLSNkZWZpbmUgTURNQV9TMF9QRVJJUEhFUkFMX01BUCBNRE1BMF9TMF9QRVJJUEhFUkFMX01BUAotI2RlZmluZSBNRE1BX1MwX0NVUlJfWF9DT1VOVCBNRE1BMF9TMF9DVVJSX1hfQ09VTlQKLSNkZWZpbmUgTURNQV9TMF9DVVJSX1lfQ09VTlQgTURNQTBfUzBfQ1VSUl9ZX0NPVU5UCi0KLSNkZWZpbmUgTURNQV9EMV9ORVhUX0RFU0NfUFRSIE1ETUEwX0QxX05FWFRfREVTQ19QVFIKLSNkZWZpbmUgTURNQV9EMV9TVEFSVF9BRERSIE1ETUEwX0QxX1NUQVJUX0FERFIKLSNkZWZpbmUgTURNQV9EMV9DT05GSUcgTURNQTBfRDFfQ09ORklHCi0jZGVmaW5lIE1ETUFfRDFfWF9DT1VOVCBNRE1BMF9EMV9YX0NPVU5UCi0jZGVmaW5lIE1ETUFfRDFfWF9NT0RJRlkgTURNQTBfRDFfWF9NT0RJRlkKLSNkZWZpbmUgTURNQV9EMV9ZX0NPVU5UIE1ETUEwX0QxX1lfQ09VTlQKLSNkZWZpbmUgTURNQV9EMV9ZX01PRElGWSBNRE1BMF9EMV9ZX01PRElGWQotI2RlZmluZSBNRE1BX0QxX0NVUlJfREVTQ19QVFIgTURNQTBfRDFfQ1VSUl9ERVNDX1BUUgotI2RlZmluZSBNRE1BX0QxX0NVUlJfQUREUiBNRE1BMF9EMV9DVVJSX0FERFIKLSNkZWZpbmUgTURNQV9EMV9JUlFfU1RBVFVTIE1ETUEwX0QxX0lSUV9TVEFUVVMKLSNkZWZpbmUgTURNQV9EMV9QRVJJUEhFUkFMX01BUCBNRE1BMF9EMV9QRVJJUEhFUkFMX01BUAotI2RlZmluZSBNRE1BX0QxX0NVUlJfWF9DT1VOVCBNRE1BMF9EMV9DVVJSX1hfQ09VTlQKLSNkZWZpbmUgTURNQV9EMV9DVVJSX1lfQ09VTlQgTURNQTBfRDFfQ1VSUl9ZX0NPVU5UCi0KLSNkZWZpbmUgTURNQV9TMV9ORVhUX0RFU0NfUFRSIE1ETUEwX1MxX05FWFRfREVTQ19QVFIKLSNkZWZpbmUgTURNQV9TMV9TVEFSVF9BRERSIE1ETUEwX1MxX1NUQVJUX0FERFIKLSNkZWZpbmUgTURNQV9TMV9DT05GSUcgTURNQTBfUzFfQ09ORklHCi0jZGVmaW5lIE1ETUFfUzFfWF9DT1VOVCBNRE1BMF9TMV9YX0NPVU5UCi0jZGVmaW5lIE1ETUFfUzFfWF9NT0RJRlkgTURNQTBfUzFfWF9NT0RJRlkKLSNkZWZpbmUgTURNQV9TMV9ZX0NPVU5UIE1ETUEwX1MxX1lfQ09VTlQKLSNkZWZpbmUgTURNQV9TMV9ZX01PRElGWSBNRE1BMF9TMV9ZX01PRElGWQotI2RlZmluZSBNRE1BX1MxX0NVUlJfREVTQ19QVFIgTURNQTBfUzFfQ1VSUl9ERVNDX1BUUgotI2RlZmluZSBNRE1BX1MxX0NVUlJfQUREUiBNRE1BMF9TMV9DVVJSX0FERFIKLSNkZWZpbmUgTURNQV9TMV9JUlFfU1RBVFVTIE1ETUEwX1MxX0lSUV9TVEFUVVMKLSNkZWZpbmUgTURNQV9TMV9QRVJJUEhFUkFMX01BUCBNRE1BMF9TMV9QRVJJUEhFUkFMX01BUAotI2RlZmluZSBNRE1BX1MxX0NVUlJfWF9DT1VOVCBNRE1BMF9TMV9DVVJSX1hfQ09VTlQKLSNkZWZpbmUgTURNQV9TMV9DVVJSX1lfQ09VTlQgTURNQTBfUzFfQ1VSUl9ZX0NPVU5UCi0KLQotLyogUGFyYWxsZWwgUGVyaXBoZXJhbCBJbnRlcmZhY2UgKFBQSSkgKDB4RkZDMDEwMDAgLSAweEZGQzAxMEZGKSAqLwotI2RlZmluZQlQUElfQ09OVFJPTAkJCTB4RkZDMDEwMDAJLyogUFBJIENvbnRyb2wgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJUFBJX1NUQVRVUwkJCTB4RkZDMDEwMDQJLyogUFBJIFN0YXR1cyBSZWdpc3RlciAqLwotI2RlZmluZQlQUElfQ09VTlQJCQkweEZGQzAxMDA4CS8qIFBQSSBUcmFuc2ZlcglDb3VudCBSZWdpc3RlciAqLwotI2RlZmluZQlQUElfREVMQVkJCQkweEZGQzAxMDBDCS8qIFBQSSBEZWxheSBDb3VudCBSZWdpc3RlciAqLwotI2RlZmluZQlQUElfRlJBTUUJCQkweEZGQzAxMDEwCS8qIFBQSSBGcmFtZSBMZW5ndGggUmVnaXN0ZXIgKi8KLQotCi0vKiBUd28tV2lyZSBJbnRlcmZhY2UgMAkoMHhGRkMwMTQwMCAtIDB4RkZDMDE0RkYpCQkJICovCi0jZGVmaW5lCVRXSTBfQ0xLRElWCQkJMHhGRkMwMTQwMAkvKiBTZXJpYWwgQ2xvY2sJRGl2aWRlcglSZWdpc3RlciAqLwotI2RlZmluZQlUV0kwX0NPTlRST0wJCTB4RkZDMDE0MDQJLyogVFdJMAlNYXN0ZXIgSW50ZXJuYWwJVGltZSBSZWZlcmVuY2UgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJVFdJMF9TTEFWRV9DVEwJCTB4RkZDMDE0MDgJLyogU2xhdmUgTW9kZSBDb250cm9sIFJlZ2lzdGVyICovCi0jZGVmaW5lCVRXSTBfU0xBVkVfU1RBVAkJMHhGRkMwMTQwQwkvKiBTbGF2ZSBNb2RlIFN0YXR1cyBSZWdpc3RlciAqLwotI2RlZmluZQlUV0kwX1NMQVZFX0FERFIJCTB4RkZDMDE0MTAJLyogU2xhdmUgTW9kZSBBZGRyZXNzIFJlZ2lzdGVyICovCi0jZGVmaW5lCVRXSTBfTUFTVEVSX0NUTAkweEZGQzAxNDE0CS8qIE1hc3RlciBNb2RlIENvbnRyb2wgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJVFdJMF9NQVNURVJfU1RBVAkweEZGQzAxNDE4CS8qIE1hc3RlciBNb2RlIFN0YXR1cyBSZWdpc3RlciAqLwotI2RlZmluZQlUV0kwX01BU1RFUl9BRERSCTB4RkZDMDE0MUMJLyogTWFzdGVyIE1vZGUgQWRkcmVzcyBSZWdpc3RlciAqLwotI2RlZmluZQlUV0kwX0lOVF9TVEFUCQkweEZGQzAxNDIwCS8qIFRXSTAJTWFzdGVyIEludGVycnVwdCBSZWdpc3RlciAqLwotI2RlZmluZQlUV0kwX0lOVF9NQVNLCQkweEZGQzAxNDI0CS8qIFRXSTAJTWFzdGVyIEludGVycnVwdCBNYXNrIFJlZ2lzdGVyICovCi0jZGVmaW5lCVRXSTBfRklGT19DVEwJCTB4RkZDMDE0MjgJLyogRklGTwlDb250cm9sCVJlZ2lzdGVyICovCi0jZGVmaW5lCVRXSTBfRklGT19TVEFUCQkweEZGQzAxNDJDCS8qIEZJRk8JU3RhdHVzIFJlZ2lzdGVyICovCi0jZGVmaW5lCVRXSTBfWE1UX0RBVEE4CQkweEZGQzAxNDgwCS8qIEZJRk8JVHJhbnNtaXQgRGF0YSBTaW5nbGUgQnl0ZSBSZWdpc3RlciAqLwotI2RlZmluZQlUV0kwX1hNVF9EQVRBMTYJCTB4RkZDMDE0ODQJLyogRklGTwlUcmFuc21pdCBEYXRhIERvdWJsZSBCeXRlIFJlZ2lzdGVyICovCi0jZGVmaW5lCVRXSTBfUkNWX0RBVEE4CQkweEZGQzAxNDg4CS8qIEZJRk8JUmVjZWl2ZQlEYXRhIFNpbmdsZSBCeXRlIFJlZ2lzdGVyICovCi0jZGVmaW5lCVRXSTBfUkNWX0RBVEExNgkJMHhGRkMwMTQ4QwkvKiBGSUZPCVJlY2VpdmUJRGF0YSBEb3VibGUgQnl0ZSBSZWdpc3RlciAqLwotCi0jZGVmaW5lIFRXSTBfUkVHQkFTRQkJVFdJMF9DTEtESVYKLQotLyogdGhlIGZvbGxvd2luZyBhcmUgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5ICovCi0jZGVmaW5lCVRXSTBfUFJFU0NBTEUJIFRXSTBfQ09OVFJPTAotI2RlZmluZQlUV0kwX0lOVF9TUkMJIFRXSTBfSU5UX1NUQVQKLSNkZWZpbmUJVFdJMF9JTlRfRU5BQkxFCSBUV0kwX0lOVF9NQVNLCi0KLQotLyogR2VuZXJhbC1QdXJwb3NlIFBvcnRzICAoMHhGRkMwMTUwMCAtCTB4RkZDMDE1RkYpCSAqLwotCi0vKiBHUElPCVBvcnQgQyBSZWdpc3RlcglOYW1lcyAqLwotI2RlZmluZSBQT1JUQ0lPX0ZFUgkJCTB4RkZDMDE1MDAJLyogR1BJTwlQaW4gUG9ydCBDIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgKi8KLSNkZWZpbmUgUE9SVENJTwkJCQkweEZGQzAxNTEwCS8qIEdQSU8JUGluIFBvcnQgQyBEYXRhCVJlZ2lzdGVyICovCi0jZGVmaW5lIFBPUlRDSU9fQ0xFQVIJCQkweEZGQzAxNTIwCS8qIENsZWFyIEdQSU8gUGluIFBvcnQgQyBSZWdpc3RlciAqLwotI2RlZmluZSBQT1JUQ0lPX1NFVAkJCTB4RkZDMDE1MzAJLyogU2V0IEdQSU8gUGluCVBvcnQgQyBSZWdpc3RlciAqLwotI2RlZmluZSBQT1JUQ0lPX1RPR0dMRQkJCTB4RkZDMDE1NDAJLyogVG9nZ2xlIEdQSU8gUGluIFBvcnQJQyBSZWdpc3RlciAqLwotI2RlZmluZSBQT1JUQ0lPX0RJUgkJCTB4RkZDMDE1NTAJLyogR1BJTwlQaW4gUG9ydCBDIERpcmVjdGlvbiBSZWdpc3RlciAqLwotI2RlZmluZSBQT1JUQ0lPX0lORU4JCQkweEZGQzAxNTYwCS8qIEdQSU8JUGluIFBvcnQgQyBJbnB1dCBFbmFibGUJUmVnaXN0ZXIgKi8KLQotLyogR1BJTwlQb3J0IEQgUmVnaXN0ZXIJTmFtZXMgKi8KLSNkZWZpbmUgUE9SVERJT19GRVIJCQkweEZGQzAxNTA0CS8qIEdQSU8JUGluIFBvcnQgRCBDb25maWd1cmF0aW9uIFJlZ2lzdGVyICovCi0jZGVmaW5lIFBPUlRESU8JCQkJMHhGRkMwMTUxNAkvKiBHUElPCVBpbiBQb3J0IEQgRGF0YQlSZWdpc3RlciAqLwotI2RlZmluZSBQT1JURElPX0NMRUFSCQkJMHhGRkMwMTUyNAkvKiBDbGVhciBHUElPIFBpbiBQb3J0IEQgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgUE9SVERJT19TRVQJCQkweEZGQzAxNTM0CS8qIFNldCBHUElPIFBpbglQb3J0IEQgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgUE9SVERJT19UT0dHTEUJCQkweEZGQzAxNTQ0CS8qIFRvZ2dsZSBHUElPIFBpbiBQb3J0CUQgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgUE9SVERJT19ESVIJCQkweEZGQzAxNTU0CS8qIEdQSU8JUGluIFBvcnQgRCBEaXJlY3Rpb24gUmVnaXN0ZXIgKi8KLSNkZWZpbmUgUE9SVERJT19JTkVOCQkJMHhGRkMwMTU2NAkvKiBHUElPCVBpbiBQb3J0IEQgSW5wdXQgRW5hYmxlCVJlZ2lzdGVyICovCi0KLS8qIEdQSU8JUG9ydCBFIFJlZ2lzdGVyCU5hbWVzICovCi0jZGVmaW5lIFBPUlRFSU9fRkVSCQkJMHhGRkMwMTUwOAkvKiBHUElPCVBpbiBQb3J0IEUgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAqLwotI2RlZmluZSBQT1JURUlPCQkJCTB4RkZDMDE1MTgJLyogR1BJTwlQaW4gUG9ydCBFIERhdGEJUmVnaXN0ZXIgKi8KLSNkZWZpbmUgUE9SVEVJT19DTEVBUgkJCTB4RkZDMDE1MjgJLyogQ2xlYXIgR1BJTyBQaW4gUG9ydCBFIFJlZ2lzdGVyICovCi0jZGVmaW5lIFBPUlRFSU9fU0VUCQkJMHhGRkMwMTUzOAkvKiBTZXQgR1BJTyBQaW4JUG9ydCBFIFJlZ2lzdGVyICovCi0jZGVmaW5lIFBPUlRFSU9fVE9HR0xFCQkJMHhGRkMwMTU0OAkvKiBUb2dnbGUgR1BJTyBQaW4gUG9ydAlFIFJlZ2lzdGVyICovCi0jZGVmaW5lIFBPUlRFSU9fRElSCQkJMHhGRkMwMTU1OAkvKiBHUElPCVBpbiBQb3J0IEUgRGlyZWN0aW9uIFJlZ2lzdGVyICovCi0jZGVmaW5lIFBPUlRFSU9fSU5FTgkJCTB4RkZDMDE1NjgJLyogR1BJTwlQaW4gUG9ydCBFIElucHV0IEVuYWJsZQlSZWdpc3RlciAqLwotCi0vKiBETUEgQ29udHJvbGxlciAxIFRyYWZmaWMgQ29udHJvbCBSZWdpc3RlcnMgKDB4RkZDMDFCMDAgLSAweEZGQzAxQkZGKSAqLwotCi0jZGVmaW5lCURNQUMxX1RDX1BFUgkJCTB4RkZDMDFCMEMJLyogRE1BIENvbnRyb2xsZXIgMSBUcmFmZmljIENvbnRyb2wgUGVyaW9kcyBSZWdpc3RlciAqLwotI2RlZmluZQlETUFDMV9UQ19DTlQJCQkweEZGQzAxQjEwCS8qIERNQSBDb250cm9sbGVyIDEgVHJhZmZpYyBDb250cm9sIEN1cnJlbnQgQ291bnRzIFJlZ2lzdGVyICovCi0KLS8qIEFsdGVybmF0ZSBkZXByZWNhdGVkCXJlZ2lzdGVyIG5hbWVzIChiZWxvdykgcHJvdmlkZWQJZm9yIGJhY2t3YXJkcyBjb2RlIGNvbXBhdGliaWxpdHkgKi8KLSNkZWZpbmUJRE1BMV9UQ1BFUgkJCURNQUMxX1RDX1BFUgotI2RlZmluZQlETUExX1RDQ05UCQkJRE1BQzFfVENfQ05UCi0KLQotLyogRE1BIENvbnRyb2xsZXIgMSAoMHhGRkMwMUMwMAktIDB4RkZDMDFGRkYpCQkJCQkJCSAqLwotI2RlZmluZQlETUE4X05FWFRfREVTQ19QVFIJCTB4RkZDMDFDMDAJLyogRE1BIENoYW5uZWwgOCBOZXh0IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlciAqLwotI2RlZmluZQlETUE4X1NUQVJUX0FERFIJCQkweEZGQzAxQzA0CS8qIERNQSBDaGFubmVsIDggU3RhcnQgQWRkcmVzcyBSZWdpc3RlciAqLwotI2RlZmluZQlETUE4X0NPTkZJRwkJCQkweEZGQzAxQzA4CS8qIERNQSBDaGFubmVsIDggQ29uZmlndXJhdGlvbiBSZWdpc3RlciAqLwotI2RlZmluZQlETUE4X1hfQ09VTlQJCQkweEZGQzAxQzEwCS8qIERNQSBDaGFubmVsIDggWCBDb3VudCBSZWdpc3RlciAqLwotI2RlZmluZQlETUE4X1hfTU9ESUZZCQkJMHhGRkMwMUMxNAkvKiBETUEgQ2hhbm5lbCA4IFggTW9kaWZ5IFJlZ2lzdGVyICovCi0jZGVmaW5lCURNQThfWV9DT1VOVAkJCTB4RkZDMDFDMTgJLyogRE1BIENoYW5uZWwgOCBZIENvdW50IFJlZ2lzdGVyICovCi0jZGVmaW5lCURNQThfWV9NT0RJRlkJCQkweEZGQzAxQzFDCS8qIERNQSBDaGFubmVsIDggWSBNb2RpZnkgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BOF9DVVJSX0RFU0NfUFRSCQkweEZGQzAxQzIwCS8qIERNQSBDaGFubmVsIDggQ3VycmVudCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BOF9DVVJSX0FERFIJCQkweEZGQzAxQzI0CS8qIERNQSBDaGFubmVsIDggQ3VycmVudCBBZGRyZXNzIFJlZ2lzdGVyICovCi0jZGVmaW5lCURNQThfSVJRX1NUQVRVUwkJCTB4RkZDMDFDMjgJLyogRE1BIENoYW5uZWwgOCBJbnRlcnJ1cHQvU3RhdHVzIFJlZ2lzdGVyICovCi0jZGVmaW5lCURNQThfUEVSSVBIRVJBTF9NQVAJCTB4RkZDMDFDMkMJLyogRE1BIENoYW5uZWwgOCBQZXJpcGhlcmFsIE1hcAlSZWdpc3RlciAqLwotI2RlZmluZQlETUE4X0NVUlJfWF9DT1VOVAkJMHhGRkMwMUMzMAkvKiBETUEgQ2hhbm5lbCA4IEN1cnJlbnQgWCBDb3VudCBSZWdpc3RlciAqLwotI2RlZmluZQlETUE4X0NVUlJfWV9DT1VOVAkJMHhGRkMwMUMzOAkvKiBETUEgQ2hhbm5lbCA4IEN1cnJlbnQgWSBDb3VudCBSZWdpc3RlciAqLwotCi0jZGVmaW5lCURNQTlfTkVYVF9ERVNDX1BUUgkJMHhGRkMwMUM0MAkvKiBETUEgQ2hhbm5lbCA5IE5leHQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyICovCi0jZGVmaW5lCURNQTlfU1RBUlRfQUREUgkJCTB4RkZDMDFDNDQJLyogRE1BIENoYW5uZWwgOSBTdGFydCBBZGRyZXNzIFJlZ2lzdGVyICovCi0jZGVmaW5lCURNQTlfQ09ORklHCQkJCTB4RkZDMDFDNDgJLyogRE1BIENoYW5uZWwgOSBDb25maWd1cmF0aW9uIFJlZ2lzdGVyICovCi0jZGVmaW5lCURNQTlfWF9DT1VOVAkJCTB4RkZDMDFDNTAJLyogRE1BIENoYW5uZWwgOSBYIENvdW50IFJlZ2lzdGVyICovCi0jZGVmaW5lCURNQTlfWF9NT0RJRlkJCQkweEZGQzAxQzU0CS8qIERNQSBDaGFubmVsIDkgWCBNb2RpZnkgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BOV9ZX0NPVU5UCQkJMHhGRkMwMUM1OAkvKiBETUEgQ2hhbm5lbCA5IFkgQ291bnQgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BOV9ZX01PRElGWQkJCTB4RkZDMDFDNUMJLyogRE1BIENoYW5uZWwgOSBZIE1vZGlmeSBSZWdpc3RlciAqLwotI2RlZmluZQlETUE5X0NVUlJfREVTQ19QVFIJCTB4RkZDMDFDNjAJLyogRE1BIENoYW5uZWwgOSBDdXJyZW50IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlciAqLwotI2RlZmluZQlETUE5X0NVUlJfQUREUgkJCTB4RkZDMDFDNjQJLyogRE1BIENoYW5uZWwgOSBDdXJyZW50IEFkZHJlc3MgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BOV9JUlFfU1RBVFVTCQkJMHhGRkMwMUM2OAkvKiBETUEgQ2hhbm5lbCA5IEludGVycnVwdC9TdGF0dXMgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BOV9QRVJJUEhFUkFMX01BUAkJMHhGRkMwMUM2QwkvKiBETUEgQ2hhbm5lbCA5IFBlcmlwaGVyYWwgTWFwCVJlZ2lzdGVyICovCi0jZGVmaW5lCURNQTlfQ1VSUl9YX0NPVU5UCQkweEZGQzAxQzcwCS8qIERNQSBDaGFubmVsIDkgQ3VycmVudCBYIENvdW50IFJlZ2lzdGVyICovCi0jZGVmaW5lCURNQTlfQ1VSUl9ZX0NPVU5UCQkweEZGQzAxQzc4CS8qIERNQSBDaGFubmVsIDkgQ3VycmVudCBZIENvdW50IFJlZ2lzdGVyICovCi0KLSNkZWZpbmUJRE1BMTBfTkVYVF9ERVNDX1BUUgkJMHhGRkMwMUM4MAkvKiBETUEgQ2hhbm5lbCAxMCBOZXh0IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlciAqLwotI2RlZmluZQlETUExMF9TVEFSVF9BRERSCQkweEZGQzAxQzg0CS8qIERNQSBDaGFubmVsIDEwIFN0YXJ0CUFkZHJlc3MJUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BMTBfQ09ORklHCQkJMHhGRkMwMUM4OAkvKiBETUEgQ2hhbm5lbCAxMCBDb25maWd1cmF0aW9uCVJlZ2lzdGVyICovCi0jZGVmaW5lCURNQTEwX1hfQ09VTlQJCQkweEZGQzAxQzkwCS8qIERNQSBDaGFubmVsIDEwIFggQ291bnQgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BMTBfWF9NT0RJRlkJCQkweEZGQzAxQzk0CS8qIERNQSBDaGFubmVsIDEwIFggTW9kaWZ5IFJlZ2lzdGVyICovCi0jZGVmaW5lCURNQTEwX1lfQ09VTlQJCQkweEZGQzAxQzk4CS8qIERNQSBDaGFubmVsIDEwIFkgQ291bnQgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BMTBfWV9NT0RJRlkJCQkweEZGQzAxQzlDCS8qIERNQSBDaGFubmVsIDEwIFkgTW9kaWZ5IFJlZ2lzdGVyICovCi0jZGVmaW5lCURNQTEwX0NVUlJfREVTQ19QVFIJCTB4RkZDMDFDQTAJLyogRE1BIENoYW5uZWwgMTAgQ3VycmVudCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BMTBfQ1VSUl9BRERSCQkJMHhGRkMwMUNBNAkvKiBETUEgQ2hhbm5lbCAxMCBDdXJyZW50IEFkZHJlc3MgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BMTBfSVJRX1NUQVRVUwkJMHhGRkMwMUNBOAkvKiBETUEgQ2hhbm5lbCAxMCBJbnRlcnJ1cHQvU3RhdHVzIFJlZ2lzdGVyICovCi0jZGVmaW5lCURNQTEwX1BFUklQSEVSQUxfTUFQCTB4RkZDMDFDQUMJLyogRE1BIENoYW5uZWwgMTAgUGVyaXBoZXJhbCBNYXAgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BMTBfQ1VSUl9YX0NPVU5UCQkweEZGQzAxQ0IwCS8qIERNQSBDaGFubmVsIDEwIEN1cnJlbnQgWCBDb3VudCBSZWdpc3RlciAqLwotI2RlZmluZQlETUExMF9DVVJSX1lfQ09VTlQJCTB4RkZDMDFDQjgJLyogRE1BIENoYW5uZWwgMTAgQ3VycmVudCBZIENvdW50IFJlZ2lzdGVyICovCi0KLSNkZWZpbmUJRE1BMTFfTkVYVF9ERVNDX1BUUgkJMHhGRkMwMUNDMAkvKiBETUEgQ2hhbm5lbCAxMSBOZXh0IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlciAqLwotI2RlZmluZQlETUExMV9TVEFSVF9BRERSCQkweEZGQzAxQ0M0CS8qIERNQSBDaGFubmVsIDExIFN0YXJ0CUFkZHJlc3MJUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BMTFfQ09ORklHCQkJMHhGRkMwMUNDOAkvKiBETUEgQ2hhbm5lbCAxMSBDb25maWd1cmF0aW9uCVJlZ2lzdGVyICovCi0jZGVmaW5lCURNQTExX1hfQ09VTlQJCQkweEZGQzAxQ0QwCS8qIERNQSBDaGFubmVsIDExIFggQ291bnQgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BMTFfWF9NT0RJRlkJCQkweEZGQzAxQ0Q0CS8qIERNQSBDaGFubmVsIDExIFggTW9kaWZ5IFJlZ2lzdGVyICovCi0jZGVmaW5lCURNQTExX1lfQ09VTlQJCQkweEZGQzAxQ0Q4CS8qIERNQSBDaGFubmVsIDExIFkgQ291bnQgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BMTFfWV9NT0RJRlkJCQkweEZGQzAxQ0RDCS8qIERNQSBDaGFubmVsIDExIFkgTW9kaWZ5IFJlZ2lzdGVyICovCi0jZGVmaW5lCURNQTExX0NVUlJfREVTQ19QVFIJCTB4RkZDMDFDRTAJLyogRE1BIENoYW5uZWwgMTEgQ3VycmVudCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BMTFfQ1VSUl9BRERSCQkJMHhGRkMwMUNFNAkvKiBETUEgQ2hhbm5lbCAxMSBDdXJyZW50IEFkZHJlc3MgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BMTFfSVJRX1NUQVRVUwkJMHhGRkMwMUNFOAkvKiBETUEgQ2hhbm5lbCAxMSBJbnRlcnJ1cHQvU3RhdHVzIFJlZ2lzdGVyICovCi0jZGVmaW5lCURNQTExX1BFUklQSEVSQUxfTUFQCTB4RkZDMDFDRUMJLyogRE1BIENoYW5uZWwgMTEgUGVyaXBoZXJhbCBNYXAgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BMTFfQ1VSUl9YX0NPVU5UCQkweEZGQzAxQ0YwCS8qIERNQSBDaGFubmVsIDExIEN1cnJlbnQgWCBDb3VudCBSZWdpc3RlciAqLwotI2RlZmluZQlETUExMV9DVVJSX1lfQ09VTlQJCTB4RkZDMDFDRjgJLyogRE1BIENoYW5uZWwgMTEgQ3VycmVudCBZIENvdW50IFJlZ2lzdGVyICovCi0KLSNkZWZpbmUJRE1BMTJfTkVYVF9ERVNDX1BUUgkJMHhGRkMwMUQwMAkvKiBETUEgQ2hhbm5lbCAxMiBOZXh0IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlciAqLwotI2RlZmluZQlETUExMl9TVEFSVF9BRERSCQkweEZGQzAxRDA0CS8qIERNQSBDaGFubmVsIDEyIFN0YXJ0CUFkZHJlc3MJUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BMTJfQ09ORklHCQkJMHhGRkMwMUQwOAkvKiBETUEgQ2hhbm5lbCAxMiBDb25maWd1cmF0aW9uCVJlZ2lzdGVyICovCi0jZGVmaW5lCURNQTEyX1hfQ09VTlQJCQkweEZGQzAxRDEwCS8qIERNQSBDaGFubmVsIDEyIFggQ291bnQgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BMTJfWF9NT0RJRlkJCQkweEZGQzAxRDE0CS8qIERNQSBDaGFubmVsIDEyIFggTW9kaWZ5IFJlZ2lzdGVyICovCi0jZGVmaW5lCURNQTEyX1lfQ09VTlQJCQkweEZGQzAxRDE4CS8qIERNQSBDaGFubmVsIDEyIFkgQ291bnQgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BMTJfWV9NT0RJRlkJCQkweEZGQzAxRDFDCS8qIERNQSBDaGFubmVsIDEyIFkgTW9kaWZ5IFJlZ2lzdGVyICovCi0jZGVmaW5lCURNQTEyX0NVUlJfREVTQ19QVFIJCTB4RkZDMDFEMjAJLyogRE1BIENoYW5uZWwgMTIgQ3VycmVudCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BMTJfQ1VSUl9BRERSCQkJMHhGRkMwMUQyNAkvKiBETUEgQ2hhbm5lbCAxMiBDdXJyZW50IEFkZHJlc3MgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BMTJfSVJRX1NUQVRVUwkJMHhGRkMwMUQyOAkvKiBETUEgQ2hhbm5lbCAxMiBJbnRlcnJ1cHQvU3RhdHVzIFJlZ2lzdGVyICovCi0jZGVmaW5lCURNQTEyX1BFUklQSEVSQUxfTUFQCTB4RkZDMDFEMkMJLyogRE1BIENoYW5uZWwgMTIgUGVyaXBoZXJhbCBNYXAgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BMTJfQ1VSUl9YX0NPVU5UCQkweEZGQzAxRDMwCS8qIERNQSBDaGFubmVsIDEyIEN1cnJlbnQgWCBDb3VudCBSZWdpc3RlciAqLwotI2RlZmluZQlETUExMl9DVVJSX1lfQ09VTlQJCTB4RkZDMDFEMzgJLyogRE1BIENoYW5uZWwgMTIgQ3VycmVudCBZIENvdW50IFJlZ2lzdGVyICovCi0KLSNkZWZpbmUJRE1BMTNfTkVYVF9ERVNDX1BUUgkJMHhGRkMwMUQ0MAkvKiBETUEgQ2hhbm5lbCAxMyBOZXh0IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlciAqLwotI2RlZmluZQlETUExM19TVEFSVF9BRERSCQkweEZGQzAxRDQ0CS8qIERNQSBDaGFubmVsIDEzIFN0YXJ0CUFkZHJlc3MJUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BMTNfQ09ORklHCQkJMHhGRkMwMUQ0OAkvKiBETUEgQ2hhbm5lbCAxMyBDb25maWd1cmF0aW9uCVJlZ2lzdGVyICovCi0jZGVmaW5lCURNQTEzX1hfQ09VTlQJCQkweEZGQzAxRDUwCS8qIERNQSBDaGFubmVsIDEzIFggQ291bnQgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BMTNfWF9NT0RJRlkJCQkweEZGQzAxRDU0CS8qIERNQSBDaGFubmVsIDEzIFggTW9kaWZ5IFJlZ2lzdGVyICovCi0jZGVmaW5lCURNQTEzX1lfQ09VTlQJCQkweEZGQzAxRDU4CS8qIERNQSBDaGFubmVsIDEzIFkgQ291bnQgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BMTNfWV9NT0RJRlkJCQkweEZGQzAxRDVDCS8qIERNQSBDaGFubmVsIDEzIFkgTW9kaWZ5IFJlZ2lzdGVyICovCi0jZGVmaW5lCURNQTEzX0NVUlJfREVTQ19QVFIJCTB4RkZDMDFENjAJLyogRE1BIENoYW5uZWwgMTMgQ3VycmVudCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BMTNfQ1VSUl9BRERSCQkJMHhGRkMwMUQ2NAkvKiBETUEgQ2hhbm5lbCAxMyBDdXJyZW50IEFkZHJlc3MgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BMTNfSVJRX1NUQVRVUwkJMHhGRkMwMUQ2OAkvKiBETUEgQ2hhbm5lbCAxMyBJbnRlcnJ1cHQvU3RhdHVzIFJlZ2lzdGVyICovCi0jZGVmaW5lCURNQTEzX1BFUklQSEVSQUxfTUFQCTB4RkZDMDFENkMJLyogRE1BIENoYW5uZWwgMTMgUGVyaXBoZXJhbCBNYXAgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BMTNfQ1VSUl9YX0NPVU5UCQkweEZGQzAxRDcwCS8qIERNQSBDaGFubmVsIDEzIEN1cnJlbnQgWCBDb3VudCBSZWdpc3RlciAqLwotI2RlZmluZQlETUExM19DVVJSX1lfQ09VTlQJCTB4RkZDMDFENzgJLyogRE1BIENoYW5uZWwgMTMgQ3VycmVudCBZIENvdW50IFJlZ2lzdGVyICovCi0KLSNkZWZpbmUJRE1BMTRfTkVYVF9ERVNDX1BUUgkJMHhGRkMwMUQ4MAkvKiBETUEgQ2hhbm5lbCAxNCBOZXh0IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlciAqLwotI2RlZmluZQlETUExNF9TVEFSVF9BRERSCQkweEZGQzAxRDg0CS8qIERNQSBDaGFubmVsIDE0IFN0YXJ0CUFkZHJlc3MJUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BMTRfQ09ORklHCQkJMHhGRkMwMUQ4OAkvKiBETUEgQ2hhbm5lbCAxNCBDb25maWd1cmF0aW9uCVJlZ2lzdGVyICovCi0jZGVmaW5lCURNQTE0X1hfQ09VTlQJCQkweEZGQzAxRDkwCS8qIERNQSBDaGFubmVsIDE0IFggQ291bnQgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BMTRfWF9NT0RJRlkJCQkweEZGQzAxRDk0CS8qIERNQSBDaGFubmVsIDE0IFggTW9kaWZ5IFJlZ2lzdGVyICovCi0jZGVmaW5lCURNQTE0X1lfQ09VTlQJCQkweEZGQzAxRDk4CS8qIERNQSBDaGFubmVsIDE0IFkgQ291bnQgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BMTRfWV9NT0RJRlkJCQkweEZGQzAxRDlDCS8qIERNQSBDaGFubmVsIDE0IFkgTW9kaWZ5IFJlZ2lzdGVyICovCi0jZGVmaW5lCURNQTE0X0NVUlJfREVTQ19QVFIJCTB4RkZDMDFEQTAJLyogRE1BIENoYW5uZWwgMTQgQ3VycmVudCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BMTRfQ1VSUl9BRERSCQkJMHhGRkMwMURBNAkvKiBETUEgQ2hhbm5lbCAxNCBDdXJyZW50IEFkZHJlc3MgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BMTRfSVJRX1NUQVRVUwkJMHhGRkMwMURBOAkvKiBETUEgQ2hhbm5lbCAxNCBJbnRlcnJ1cHQvU3RhdHVzIFJlZ2lzdGVyICovCi0jZGVmaW5lCURNQTE0X1BFUklQSEVSQUxfTUFQCTB4RkZDMDFEQUMJLyogRE1BIENoYW5uZWwgMTQgUGVyaXBoZXJhbCBNYXAgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BMTRfQ1VSUl9YX0NPVU5UCQkweEZGQzAxREIwCS8qIERNQSBDaGFubmVsIDE0IEN1cnJlbnQgWCBDb3VudCBSZWdpc3RlciAqLwotI2RlZmluZQlETUExNF9DVVJSX1lfQ09VTlQJCTB4RkZDMDFEQjgJLyogRE1BIENoYW5uZWwgMTQgQ3VycmVudCBZIENvdW50IFJlZ2lzdGVyICovCi0KLSNkZWZpbmUJRE1BMTVfTkVYVF9ERVNDX1BUUgkJMHhGRkMwMURDMAkvKiBETUEgQ2hhbm5lbCAxNSBOZXh0IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlciAqLwotI2RlZmluZQlETUExNV9TVEFSVF9BRERSCQkweEZGQzAxREM0CS8qIERNQSBDaGFubmVsIDE1IFN0YXJ0CUFkZHJlc3MJUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BMTVfQ09ORklHCQkJMHhGRkMwMURDOAkvKiBETUEgQ2hhbm5lbCAxNSBDb25maWd1cmF0aW9uCVJlZ2lzdGVyICovCi0jZGVmaW5lCURNQTE1X1hfQ09VTlQJCQkweEZGQzAxREQwCS8qIERNQSBDaGFubmVsIDE1IFggQ291bnQgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BMTVfWF9NT0RJRlkJCQkweEZGQzAxREQ0CS8qIERNQSBDaGFubmVsIDE1IFggTW9kaWZ5IFJlZ2lzdGVyICovCi0jZGVmaW5lCURNQTE1X1lfQ09VTlQJCQkweEZGQzAxREQ4CS8qIERNQSBDaGFubmVsIDE1IFkgQ291bnQgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BMTVfWV9NT0RJRlkJCQkweEZGQzAxRERDCS8qIERNQSBDaGFubmVsIDE1IFkgTW9kaWZ5IFJlZ2lzdGVyICovCi0jZGVmaW5lCURNQTE1X0NVUlJfREVTQ19QVFIJCTB4RkZDMDFERTAJLyogRE1BIENoYW5uZWwgMTUgQ3VycmVudCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BMTVfQ1VSUl9BRERSCQkJMHhGRkMwMURFNAkvKiBETUEgQ2hhbm5lbCAxNSBDdXJyZW50IEFkZHJlc3MgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BMTVfSVJRX1NUQVRVUwkJMHhGRkMwMURFOAkvKiBETUEgQ2hhbm5lbCAxNSBJbnRlcnJ1cHQvU3RhdHVzIFJlZ2lzdGVyICovCi0jZGVmaW5lCURNQTE1X1BFUklQSEVSQUxfTUFQCTB4RkZDMDFERUMJLyogRE1BIENoYW5uZWwgMTUgUGVyaXBoZXJhbCBNYXAgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BMTVfQ1VSUl9YX0NPVU5UCQkweEZGQzAxREYwCS8qIERNQSBDaGFubmVsIDE1IEN1cnJlbnQgWCBDb3VudCBSZWdpc3RlciAqLwotI2RlZmluZQlETUExNV9DVVJSX1lfQ09VTlQJCTB4RkZDMDFERjgJLyogRE1BIENoYW5uZWwgMTUgQ3VycmVudCBZIENvdW50IFJlZ2lzdGVyICovCi0KLSNkZWZpbmUJRE1BMTZfTkVYVF9ERVNDX1BUUgkJMHhGRkMwMUUwMAkvKiBETUEgQ2hhbm5lbCAxNiBOZXh0IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlciAqLwotI2RlZmluZQlETUExNl9TVEFSVF9BRERSCQkweEZGQzAxRTA0CS8qIERNQSBDaGFubmVsIDE2IFN0YXJ0CUFkZHJlc3MJUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BMTZfQ09ORklHCQkJMHhGRkMwMUUwOAkvKiBETUEgQ2hhbm5lbCAxNiBDb25maWd1cmF0aW9uCVJlZ2lzdGVyICovCi0jZGVmaW5lCURNQTE2X1hfQ09VTlQJCQkweEZGQzAxRTEwCS8qIERNQSBDaGFubmVsIDE2IFggQ291bnQgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BMTZfWF9NT0RJRlkJCQkweEZGQzAxRTE0CS8qIERNQSBDaGFubmVsIDE2IFggTW9kaWZ5IFJlZ2lzdGVyICovCi0jZGVmaW5lCURNQTE2X1lfQ09VTlQJCQkweEZGQzAxRTE4CS8qIERNQSBDaGFubmVsIDE2IFkgQ291bnQgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BMTZfWV9NT0RJRlkJCQkweEZGQzAxRTFDCS8qIERNQSBDaGFubmVsIDE2IFkgTW9kaWZ5IFJlZ2lzdGVyICovCi0jZGVmaW5lCURNQTE2X0NVUlJfREVTQ19QVFIJCTB4RkZDMDFFMjAJLyogRE1BIENoYW5uZWwgMTYgQ3VycmVudCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BMTZfQ1VSUl9BRERSCQkJMHhGRkMwMUUyNAkvKiBETUEgQ2hhbm5lbCAxNiBDdXJyZW50IEFkZHJlc3MgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BMTZfSVJRX1NUQVRVUwkJMHhGRkMwMUUyOAkvKiBETUEgQ2hhbm5lbCAxNiBJbnRlcnJ1cHQvU3RhdHVzIFJlZ2lzdGVyICovCi0jZGVmaW5lCURNQTE2X1BFUklQSEVSQUxfTUFQCTB4RkZDMDFFMkMJLyogRE1BIENoYW5uZWwgMTYgUGVyaXBoZXJhbCBNYXAgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BMTZfQ1VSUl9YX0NPVU5UCQkweEZGQzAxRTMwCS8qIERNQSBDaGFubmVsIDE2IEN1cnJlbnQgWCBDb3VudCBSZWdpc3RlciAqLwotI2RlZmluZQlETUExNl9DVVJSX1lfQ09VTlQJCTB4RkZDMDFFMzgJLyogRE1BIENoYW5uZWwgMTYgQ3VycmVudCBZIENvdW50IFJlZ2lzdGVyICovCi0KLSNkZWZpbmUJRE1BMTdfTkVYVF9ERVNDX1BUUgkJMHhGRkMwMUU0MAkvKiBETUEgQ2hhbm5lbCAxNyBOZXh0IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlciAqLwotI2RlZmluZQlETUExN19TVEFSVF9BRERSCQkweEZGQzAxRTQ0CS8qIERNQSBDaGFubmVsIDE3IFN0YXJ0CUFkZHJlc3MJUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BMTdfQ09ORklHCQkJMHhGRkMwMUU0OAkvKiBETUEgQ2hhbm5lbCAxNyBDb25maWd1cmF0aW9uCVJlZ2lzdGVyICovCi0jZGVmaW5lCURNQTE3X1hfQ09VTlQJCQkweEZGQzAxRTUwCS8qIERNQSBDaGFubmVsIDE3IFggQ291bnQgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BMTdfWF9NT0RJRlkJCQkweEZGQzAxRTU0CS8qIERNQSBDaGFubmVsIDE3IFggTW9kaWZ5IFJlZ2lzdGVyICovCi0jZGVmaW5lCURNQTE3X1lfQ09VTlQJCQkweEZGQzAxRTU4CS8qIERNQSBDaGFubmVsIDE3IFkgQ291bnQgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BMTdfWV9NT0RJRlkJCQkweEZGQzAxRTVDCS8qIERNQSBDaGFubmVsIDE3IFkgTW9kaWZ5IFJlZ2lzdGVyICovCi0jZGVmaW5lCURNQTE3X0NVUlJfREVTQ19QVFIJCTB4RkZDMDFFNjAJLyogRE1BIENoYW5uZWwgMTcgQ3VycmVudCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BMTdfQ1VSUl9BRERSCQkJMHhGRkMwMUU2NAkvKiBETUEgQ2hhbm5lbCAxNyBDdXJyZW50IEFkZHJlc3MgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BMTdfSVJRX1NUQVRVUwkJMHhGRkMwMUU2OAkvKiBETUEgQ2hhbm5lbCAxNyBJbnRlcnJ1cHQvU3RhdHVzIFJlZ2lzdGVyICovCi0jZGVmaW5lCURNQTE3X1BFUklQSEVSQUxfTUFQCTB4RkZDMDFFNkMJLyogRE1BIENoYW5uZWwgMTcgUGVyaXBoZXJhbCBNYXAgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BMTdfQ1VSUl9YX0NPVU5UCQkweEZGQzAxRTcwCS8qIERNQSBDaGFubmVsIDE3IEN1cnJlbnQgWCBDb3VudCBSZWdpc3RlciAqLwotI2RlZmluZQlETUExN19DVVJSX1lfQ09VTlQJCTB4RkZDMDFFNzgJLyogRE1BIENoYW5uZWwgMTcgQ3VycmVudCBZIENvdW50IFJlZ2lzdGVyICovCi0KLSNkZWZpbmUJRE1BMThfTkVYVF9ERVNDX1BUUgkJMHhGRkMwMUU4MAkvKiBETUEgQ2hhbm5lbCAxOCBOZXh0IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlciAqLwotI2RlZmluZQlETUExOF9TVEFSVF9BRERSCQkweEZGQzAxRTg0CS8qIERNQSBDaGFubmVsIDE4IFN0YXJ0CUFkZHJlc3MJUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BMThfQ09ORklHCQkJMHhGRkMwMUU4OAkvKiBETUEgQ2hhbm5lbCAxOCBDb25maWd1cmF0aW9uCVJlZ2lzdGVyICovCi0jZGVmaW5lCURNQTE4X1hfQ09VTlQJCQkweEZGQzAxRTkwCS8qIERNQSBDaGFubmVsIDE4IFggQ291bnQgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BMThfWF9NT0RJRlkJCQkweEZGQzAxRTk0CS8qIERNQSBDaGFubmVsIDE4IFggTW9kaWZ5IFJlZ2lzdGVyICovCi0jZGVmaW5lCURNQTE4X1lfQ09VTlQJCQkweEZGQzAxRTk4CS8qIERNQSBDaGFubmVsIDE4IFkgQ291bnQgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BMThfWV9NT0RJRlkJCQkweEZGQzAxRTlDCS8qIERNQSBDaGFubmVsIDE4IFkgTW9kaWZ5IFJlZ2lzdGVyICovCi0jZGVmaW5lCURNQTE4X0NVUlJfREVTQ19QVFIJCTB4RkZDMDFFQTAJLyogRE1BIENoYW5uZWwgMTggQ3VycmVudCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BMThfQ1VSUl9BRERSCQkJMHhGRkMwMUVBNAkvKiBETUEgQ2hhbm5lbCAxOCBDdXJyZW50IEFkZHJlc3MgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BMThfSVJRX1NUQVRVUwkJMHhGRkMwMUVBOAkvKiBETUEgQ2hhbm5lbCAxOCBJbnRlcnJ1cHQvU3RhdHVzIFJlZ2lzdGVyICovCi0jZGVmaW5lCURNQTE4X1BFUklQSEVSQUxfTUFQCTB4RkZDMDFFQUMJLyogRE1BIENoYW5uZWwgMTggUGVyaXBoZXJhbCBNYXAgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BMThfQ1VSUl9YX0NPVU5UCQkweEZGQzAxRUIwCS8qIERNQSBDaGFubmVsIDE4IEN1cnJlbnQgWCBDb3VudCBSZWdpc3RlciAqLwotI2RlZmluZQlETUExOF9DVVJSX1lfQ09VTlQJCTB4RkZDMDFFQjgJLyogRE1BIENoYW5uZWwgMTggQ3VycmVudCBZIENvdW50IFJlZ2lzdGVyICovCi0KLSNkZWZpbmUJRE1BMTlfTkVYVF9ERVNDX1BUUgkJMHhGRkMwMUVDMAkvKiBETUEgQ2hhbm5lbCAxOSBOZXh0IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlciAqLwotI2RlZmluZQlETUExOV9TVEFSVF9BRERSCQkweEZGQzAxRUM0CS8qIERNQSBDaGFubmVsIDE5IFN0YXJ0CUFkZHJlc3MJUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BMTlfQ09ORklHCQkJMHhGRkMwMUVDOAkvKiBETUEgQ2hhbm5lbCAxOSBDb25maWd1cmF0aW9uCVJlZ2lzdGVyICovCi0jZGVmaW5lCURNQTE5X1hfQ09VTlQJCQkweEZGQzAxRUQwCS8qIERNQSBDaGFubmVsIDE5IFggQ291bnQgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BMTlfWF9NT0RJRlkJCQkweEZGQzAxRUQ0CS8qIERNQSBDaGFubmVsIDE5IFggTW9kaWZ5IFJlZ2lzdGVyICovCi0jZGVmaW5lCURNQTE5X1lfQ09VTlQJCQkweEZGQzAxRUQ4CS8qIERNQSBDaGFubmVsIDE5IFkgQ291bnQgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BMTlfWV9NT0RJRlkJCQkweEZGQzAxRURDCS8qIERNQSBDaGFubmVsIDE5IFkgTW9kaWZ5IFJlZ2lzdGVyICovCi0jZGVmaW5lCURNQTE5X0NVUlJfREVTQ19QVFIJCTB4RkZDMDFFRTAJLyogRE1BIENoYW5uZWwgMTkgQ3VycmVudCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BMTlfQ1VSUl9BRERSCQkJMHhGRkMwMUVFNAkvKiBETUEgQ2hhbm5lbCAxOSBDdXJyZW50IEFkZHJlc3MgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BMTlfSVJRX1NUQVRVUwkJMHhGRkMwMUVFOAkvKiBETUEgQ2hhbm5lbCAxOSBJbnRlcnJ1cHQvU3RhdHVzIFJlZ2lzdGVyICovCi0jZGVmaW5lCURNQTE5X1BFUklQSEVSQUxfTUFQCTB4RkZDMDFFRUMJLyogRE1BIENoYW5uZWwgMTkgUGVyaXBoZXJhbCBNYXAgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRE1BMTlfQ1VSUl9YX0NPVU5UCQkweEZGQzAxRUYwCS8qIERNQSBDaGFubmVsIDE5IEN1cnJlbnQgWCBDb3VudCBSZWdpc3RlciAqLwotI2RlZmluZQlETUExOV9DVVJSX1lfQ09VTlQJCTB4RkZDMDFFRjgJLyogRE1BIENoYW5uZWwgMTkgQ3VycmVudCBZIENvdW50IFJlZ2lzdGVyICovCi0KLSNkZWZpbmUJTURNQTFfRDBfTkVYVF9ERVNDX1BUUgkweEZGQzAxRjAwCS8qIE1lbURNQTEgU3RyZWFtIDAgRGVzdGluYXRpb24JTmV4dCBEZXNjcmlwdG9yCVBvaW50ZXIJUmVnaXN0ZXIgKi8KLSNkZWZpbmUJTURNQTFfRDBfU1RBUlRfQUREUgkJMHhGRkMwMUYwNAkvKiBNZW1ETUExIFN0cmVhbSAwIERlc3RpbmF0aW9uCVN0YXJ0IEFkZHJlc3MgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJTURNQTFfRDBfQ09ORklHCQkJMHhGRkMwMUYwOAkvKiBNZW1ETUExIFN0cmVhbSAwIERlc3RpbmF0aW9uCUNvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgKi8KLSNkZWZpbmUJTURNQTFfRDBfWF9DT1VOVAkJMHhGRkMwMUYxMAkvKiBNZW1ETUExIFN0cmVhbSAwIERlc3RpbmF0aW9uCVggQ291bnQJUmVnaXN0ZXIgKi8KLSNkZWZpbmUJTURNQTFfRDBfWF9NT0RJRlkJCTB4RkZDMDFGMTQJLyogTWVtRE1BMSBTdHJlYW0gMCBEZXN0aW5hdGlvbglYIE1vZGlmeSBSZWdpc3RlciAqLwotI2RlZmluZQlNRE1BMV9EMF9ZX0NPVU5UCQkweEZGQzAxRjE4CS8qIE1lbURNQTEgU3RyZWFtIDAgRGVzdGluYXRpb24JWSBDb3VudAlSZWdpc3RlciAqLwotI2RlZmluZQlNRE1BMV9EMF9ZX01PRElGWQkJMHhGRkMwMUYxQwkvKiBNZW1ETUExIFN0cmVhbSAwIERlc3RpbmF0aW9uCVkgTW9kaWZ5IFJlZ2lzdGVyICovCi0jZGVmaW5lCU1ETUExX0QwX0NVUlJfREVTQ19QVFIJMHhGRkMwMUYyMAkvKiBNZW1ETUExIFN0cmVhbSAwIERlc3RpbmF0aW9uCUN1cnJlbnQJRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyICovCi0jZGVmaW5lCU1ETUExX0QwX0NVUlJfQUREUgkJMHhGRkMwMUYyNAkvKiBNZW1ETUExIFN0cmVhbSAwIERlc3RpbmF0aW9uCUN1cnJlbnQJQWRkcmVzcwlSZWdpc3RlciAqLwotI2RlZmluZQlNRE1BMV9EMF9JUlFfU1RBVFVTCQkweEZGQzAxRjI4CS8qIE1lbURNQTEgU3RyZWFtIDAgRGVzdGluYXRpb24JSW50ZXJydXB0L1N0YXR1cyBSZWdpc3RlciAqLwotI2RlZmluZQlNRE1BMV9EMF9QRVJJUEhFUkFMX01BUAkweEZGQzAxRjJDCS8qIE1lbURNQTEgU3RyZWFtIDAgRGVzdGluYXRpb24JUGVyaXBoZXJhbCBNYXAgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJTURNQTFfRDBfQ1VSUl9YX0NPVU5UCTB4RkZDMDFGMzAJLyogTWVtRE1BMSBTdHJlYW0gMCBEZXN0aW5hdGlvbglDdXJyZW50CVggQ291bnQJUmVnaXN0ZXIgKi8KLSNkZWZpbmUJTURNQTFfRDBfQ1VSUl9ZX0NPVU5UCTB4RkZDMDFGMzgJLyogTWVtRE1BMSBTdHJlYW0gMCBEZXN0aW5hdGlvbglDdXJyZW50CVkgQ291bnQJUmVnaXN0ZXIgKi8KLQotI2RlZmluZQlNRE1BMV9TMF9ORVhUX0RFU0NfUFRSCTB4RkZDMDFGNDAJLyogTWVtRE1BMSBTdHJlYW0gMCBTb3VyY2UgTmV4dAlEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJTURNQTFfUzBfU1RBUlRfQUREUgkJMHhGRkMwMUY0NAkvKiBNZW1ETUExIFN0cmVhbSAwIFNvdXJjZSBTdGFydCBBZGRyZXNzIFJlZ2lzdGVyICovCi0jZGVmaW5lCU1ETUExX1MwX0NPTkZJRwkJCTB4RkZDMDFGNDgJLyogTWVtRE1BMSBTdHJlYW0gMCBTb3VyY2UgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAqLwotI2RlZmluZQlNRE1BMV9TMF9YX0NPVU5UCQkweEZGQzAxRjUwCS8qIE1lbURNQTEgU3RyZWFtIDAgU291cmNlIFggQ291bnQgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJTURNQTFfUzBfWF9NT0RJRlkJCTB4RkZDMDFGNTQJLyogTWVtRE1BMSBTdHJlYW0gMCBTb3VyY2UgWCBNb2RpZnkgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJTURNQTFfUzBfWV9DT1VOVAkJMHhGRkMwMUY1OAkvKiBNZW1ETUExIFN0cmVhbSAwIFNvdXJjZSBZIENvdW50IFJlZ2lzdGVyICovCi0jZGVmaW5lCU1ETUExX1MwX1lfTU9ESUZZCQkweEZGQzAxRjVDCS8qIE1lbURNQTEgU3RyZWFtIDAgU291cmNlIFkgTW9kaWZ5IFJlZ2lzdGVyICovCi0jZGVmaW5lCU1ETUExX1MwX0NVUlJfREVTQ19QVFIJMHhGRkMwMUY2MAkvKiBNZW1ETUExIFN0cmVhbSAwIFNvdXJjZSBDdXJyZW50IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlciAqLwotI2RlZmluZQlNRE1BMV9TMF9DVVJSX0FERFIJCTB4RkZDMDFGNjQJLyogTWVtRE1BMSBTdHJlYW0gMCBTb3VyY2UgQ3VycmVudCBBZGRyZXNzIFJlZ2lzdGVyICovCi0jZGVmaW5lCU1ETUExX1MwX0lSUV9TVEFUVVMJCTB4RkZDMDFGNjgJLyogTWVtRE1BMSBTdHJlYW0gMCBTb3VyY2UgSW50ZXJydXB0L1N0YXR1cyBSZWdpc3RlciAqLwotI2RlZmluZQlNRE1BMV9TMF9QRVJJUEhFUkFMX01BUAkweEZGQzAxRjZDCS8qIE1lbURNQTEgU3RyZWFtIDAgU291cmNlIFBlcmlwaGVyYWwgTWFwIFJlZ2lzdGVyICovCi0jZGVmaW5lCU1ETUExX1MwX0NVUlJfWF9DT1VOVAkweEZGQzAxRjcwCS8qIE1lbURNQTEgU3RyZWFtIDAgU291cmNlIEN1cnJlbnQgWCBDb3VudCBSZWdpc3RlciAqLwotI2RlZmluZQlNRE1BMV9TMF9DVVJSX1lfQ09VTlQJMHhGRkMwMUY3OAkvKiBNZW1ETUExIFN0cmVhbSAwIFNvdXJjZSBDdXJyZW50IFkgQ291bnQgUmVnaXN0ZXIgKi8KLQotI2RlZmluZQlNRE1BMV9EMV9ORVhUX0RFU0NfUFRSCTB4RkZDMDFGODAJLyogTWVtRE1BMSBTdHJlYW0gMSBEZXN0aW5hdGlvbglOZXh0IERlc2NyaXB0b3IJUG9pbnRlcglSZWdpc3RlciAqLwotI2RlZmluZQlNRE1BMV9EMV9TVEFSVF9BRERSCQkweEZGQzAxRjg0CS8qIE1lbURNQTEgU3RyZWFtIDEgRGVzdGluYXRpb24JU3RhcnQgQWRkcmVzcyBSZWdpc3RlciAqLwotI2RlZmluZQlNRE1BMV9EMV9DT05GSUcJCQkweEZGQzAxRjg4CS8qIE1lbURNQTEgU3RyZWFtIDEgRGVzdGluYXRpb24JQ29uZmlndXJhdGlvbiBSZWdpc3RlciAqLwotI2RlZmluZQlNRE1BMV9EMV9YX0NPVU5UCQkweEZGQzAxRjkwCS8qIE1lbURNQTEgU3RyZWFtIDEgRGVzdGluYXRpb24JWCBDb3VudAlSZWdpc3RlciAqLwotI2RlZmluZQlNRE1BMV9EMV9YX01PRElGWQkJMHhGRkMwMUY5NAkvKiBNZW1ETUExIFN0cmVhbSAxIERlc3RpbmF0aW9uCVggTW9kaWZ5IFJlZ2lzdGVyICovCi0jZGVmaW5lCU1ETUExX0QxX1lfQ09VTlQJCTB4RkZDMDFGOTgJLyogTWVtRE1BMSBTdHJlYW0gMSBEZXN0aW5hdGlvbglZIENvdW50CVJlZ2lzdGVyICovCi0jZGVmaW5lCU1ETUExX0QxX1lfTU9ESUZZCQkweEZGQzAxRjlDCS8qIE1lbURNQTEgU3RyZWFtIDEgRGVzdGluYXRpb24JWSBNb2RpZnkgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJTURNQTFfRDFfQ1VSUl9ERVNDX1BUUgkweEZGQzAxRkEwCS8qIE1lbURNQTEgU3RyZWFtIDEgRGVzdGluYXRpb24JQ3VycmVudAlEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJTURNQTFfRDFfQ1VSUl9BRERSCQkweEZGQzAxRkE0CS8qIE1lbURNQTEgU3RyZWFtIDEgRGVzdGluYXRpb24JQ3VycmVudAlBZGRyZXNzCVJlZ2lzdGVyICovCi0jZGVmaW5lCU1ETUExX0QxX0lSUV9TVEFUVVMJCTB4RkZDMDFGQTgJLyogTWVtRE1BMSBTdHJlYW0gMSBEZXN0aW5hdGlvbglJbnRlcnJ1cHQvU3RhdHVzIFJlZ2lzdGVyICovCi0jZGVmaW5lCU1ETUExX0QxX1BFUklQSEVSQUxfTUFQCTB4RkZDMDFGQUMJLyogTWVtRE1BMSBTdHJlYW0gMSBEZXN0aW5hdGlvbglQZXJpcGhlcmFsIE1hcCBSZWdpc3RlciAqLwotI2RlZmluZQlNRE1BMV9EMV9DVVJSX1hfQ09VTlQJMHhGRkMwMUZCMAkvKiBNZW1ETUExIFN0cmVhbSAxIERlc3RpbmF0aW9uCUN1cnJlbnQJWCBDb3VudAlSZWdpc3RlciAqLwotI2RlZmluZQlNRE1BMV9EMV9DVVJSX1lfQ09VTlQJMHhGRkMwMUZCOAkvKiBNZW1ETUExIFN0cmVhbSAxIERlc3RpbmF0aW9uCUN1cnJlbnQJWSBDb3VudAlSZWdpc3RlciAqLwotCi0jZGVmaW5lCU1ETUExX1MxX05FWFRfREVTQ19QVFIJMHhGRkMwMUZDMAkvKiBNZW1ETUExIFN0cmVhbSAxIFNvdXJjZSBOZXh0CURlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlciAqLwotI2RlZmluZQlNRE1BMV9TMV9TVEFSVF9BRERSCQkweEZGQzAxRkM0CS8qIE1lbURNQTEgU3RyZWFtIDEgU291cmNlIFN0YXJ0IEFkZHJlc3MgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJTURNQTFfUzFfQ09ORklHCQkJMHhGRkMwMUZDOAkvKiBNZW1ETUExIFN0cmVhbSAxIFNvdXJjZSBDb25maWd1cmF0aW9uIFJlZ2lzdGVyICovCi0jZGVmaW5lCU1ETUExX1MxX1hfQ09VTlQJCTB4RkZDMDFGRDAJLyogTWVtRE1BMSBTdHJlYW0gMSBTb3VyY2UgWCBDb3VudCBSZWdpc3RlciAqLwotI2RlZmluZQlNRE1BMV9TMV9YX01PRElGWQkJMHhGRkMwMUZENAkvKiBNZW1ETUExIFN0cmVhbSAxIFNvdXJjZSBYIE1vZGlmeSBSZWdpc3RlciAqLwotI2RlZmluZQlNRE1BMV9TMV9ZX0NPVU5UCQkweEZGQzAxRkQ4CS8qIE1lbURNQTEgU3RyZWFtIDEgU291cmNlIFkgQ291bnQgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJTURNQTFfUzFfWV9NT0RJRlkJCTB4RkZDMDFGREMJLyogTWVtRE1BMSBTdHJlYW0gMSBTb3VyY2UgWSBNb2RpZnkgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJTURNQTFfUzFfQ1VSUl9ERVNDX1BUUgkweEZGQzAxRkUwCS8qIE1lbURNQTEgU3RyZWFtIDEgU291cmNlIEN1cnJlbnQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyICovCi0jZGVmaW5lCU1ETUExX1MxX0NVUlJfQUREUgkJMHhGRkMwMUZFNAkvKiBNZW1ETUExIFN0cmVhbSAxIFNvdXJjZSBDdXJyZW50IEFkZHJlc3MgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJTURNQTFfUzFfSVJRX1NUQVRVUwkJMHhGRkMwMUZFOAkvKiBNZW1ETUExIFN0cmVhbSAxIFNvdXJjZSBJbnRlcnJ1cHQvU3RhdHVzIFJlZ2lzdGVyICovCi0jZGVmaW5lCU1ETUExX1MxX1BFUklQSEVSQUxfTUFQCTB4RkZDMDFGRUMJLyogTWVtRE1BMSBTdHJlYW0gMSBTb3VyY2UgUGVyaXBoZXJhbCBNYXAgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJTURNQTFfUzFfQ1VSUl9YX0NPVU5UCTB4RkZDMDFGRjAJLyogTWVtRE1BMSBTdHJlYW0gMSBTb3VyY2UgQ3VycmVudCBYIENvdW50IFJlZ2lzdGVyICovCi0jZGVmaW5lCU1ETUExX1MxX0NVUlJfWV9DT1VOVAkweEZGQzAxRkY4CS8qIE1lbURNQTEgU3RyZWFtIDEgU291cmNlIEN1cnJlbnQgWSBDb3VudCBSZWdpc3RlciAqLwotCi0KLS8qIFVBUlQxIENvbnRyb2xsZXIJCSgweEZGQzAyMDAwIC0gMHhGRkMwMjBGRikJICovCi0jZGVmaW5lCVVBUlQxX1RIUgkJCTB4RkZDMDIwMDAJLyogVHJhbnNtaXQgSG9sZGluZyByZWdpc3RlciAqLwotI2RlZmluZQlVQVJUMV9SQlIJCQkweEZGQzAyMDAwCS8qIFJlY2VpdmUgQnVmZmVyIHJlZ2lzdGVyICovCi0jZGVmaW5lCVVBUlQxX0RMTAkJCTB4RkZDMDIwMDAJLyogRGl2aXNvciBMYXRjaCAoTG93LUJ5dGUpICovCi0jZGVmaW5lCVVBUlQxX0lFUgkJCTB4RkZDMDIwMDQJLyogSW50ZXJydXB0IEVuYWJsZSBSZWdpc3RlciAqLwotI2RlZmluZQlVQVJUMV9ETEgJCQkweEZGQzAyMDA0CS8qIERpdmlzb3IgTGF0Y2ggKEhpZ2gtQnl0ZSkgKi8KLSNkZWZpbmUJVUFSVDFfSUlSCQkJMHhGRkMwMjAwOAkvKiBJbnRlcnJ1cHQgSWRlbnRpZmljYXRpb24gUmVnaXN0ZXIgKi8KLSNkZWZpbmUJVUFSVDFfTENSCQkJMHhGRkMwMjAwQwkvKiBMaW5lCUNvbnRyb2wJUmVnaXN0ZXIgKi8KLSNkZWZpbmUJVUFSVDFfTUNSCQkJMHhGRkMwMjAxMAkvKiBNb2RlbSBDb250cm9sIFJlZ2lzdGVyICovCi0jZGVmaW5lCVVBUlQxX0xTUgkJCTB4RkZDMDIwMTQJLyogTGluZQlTdGF0dXMgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJVUFSVDFfU0NSCQkJMHhGRkMwMjAxQwkvKiBTQ1IgU2NyYXRjaCBSZWdpc3RlciAqLwotI2RlZmluZQlVQVJUMV9HQ1RMCQkJMHhGRkMwMjAyNAkvKiBHbG9iYWwgQ29udHJvbCBSZWdpc3RlciAqLwotCi0KLS8qIFVBUlQyIENvbnRyb2xsZXIJCSgweEZGQzAyMTAwIC0gMHhGRkMwMjFGRikJICovCi0jZGVmaW5lCVVBUlQyX1RIUgkJCTB4RkZDMDIxMDAJLyogVHJhbnNtaXQgSG9sZGluZyByZWdpc3RlciAqLwotI2RlZmluZQlVQVJUMl9SQlIJCQkweEZGQzAyMTAwCS8qIFJlY2VpdmUgQnVmZmVyIHJlZ2lzdGVyICovCi0jZGVmaW5lCVVBUlQyX0RMTAkJCTB4RkZDMDIxMDAJLyogRGl2aXNvciBMYXRjaCAoTG93LUJ5dGUpICovCi0jZGVmaW5lCVVBUlQyX0lFUgkJCTB4RkZDMDIxMDQJLyogSW50ZXJydXB0IEVuYWJsZSBSZWdpc3RlciAqLwotI2RlZmluZQlVQVJUMl9ETEgJCQkweEZGQzAyMTA0CS8qIERpdmlzb3IgTGF0Y2ggKEhpZ2gtQnl0ZSkgKi8KLSNkZWZpbmUJVUFSVDJfSUlSCQkJMHhGRkMwMjEwOAkvKiBJbnRlcnJ1cHQgSWRlbnRpZmljYXRpb24gUmVnaXN0ZXIgKi8KLSNkZWZpbmUJVUFSVDJfTENSCQkJMHhGRkMwMjEwQwkvKiBMaW5lCUNvbnRyb2wJUmVnaXN0ZXIgKi8KLSNkZWZpbmUJVUFSVDJfTUNSCQkJMHhGRkMwMjExMAkvKiBNb2RlbSBDb250cm9sIFJlZ2lzdGVyICovCi0jZGVmaW5lCVVBUlQyX0xTUgkJCTB4RkZDMDIxMTQJLyogTGluZQlTdGF0dXMgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJVUFSVDJfU0NSCQkJMHhGRkMwMjExQwkvKiBTQ1IgU2NyYXRjaCBSZWdpc3RlciAqLwotI2RlZmluZQlVQVJUMl9HQ1RMCQkJMHhGRkMwMjEyNAkvKiBHbG9iYWwgQ29udHJvbCBSZWdpc3RlciAqLwotCi0KLS8qIFR3by1XaXJlIEludGVyZmFjZSAxCSgweEZGQzAyMjAwIC0gMHhGRkMwMjJGRikJCQkgKi8KLSNkZWZpbmUJVFdJMV9DTEtESVYJCQkweEZGQzAyMjAwCS8qIFNlcmlhbCBDbG9jawlEaXZpZGVyCVJlZ2lzdGVyICovCi0jZGVmaW5lCVRXSTFfQ09OVFJPTAkJMHhGRkMwMjIwNAkvKiBUV0kxCU1hc3RlciBJbnRlcm5hbAlUaW1lIFJlZmVyZW5jZSBSZWdpc3RlciAqLwotI2RlZmluZQlUV0kxX1NMQVZFX0NUTAkJMHhGRkMwMjIwOAkvKiBTbGF2ZSBNb2RlIENvbnRyb2wgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJVFdJMV9TTEFWRV9TVEFUCQkweEZGQzAyMjBDCS8qIFNsYXZlIE1vZGUgU3RhdHVzIFJlZ2lzdGVyICovCi0jZGVmaW5lCVRXSTFfU0xBVkVfQUREUgkJMHhGRkMwMjIxMAkvKiBTbGF2ZSBNb2RlIEFkZHJlc3MgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJVFdJMV9NQVNURVJfQ1RMCTB4RkZDMDIyMTQJLyogTWFzdGVyIE1vZGUgQ29udHJvbCBSZWdpc3RlciAqLwotI2RlZmluZQlUV0kxX01BU1RFUl9TVEFUCTB4RkZDMDIyMTgJLyogTWFzdGVyIE1vZGUgU3RhdHVzIFJlZ2lzdGVyICovCi0jZGVmaW5lCVRXSTFfTUFTVEVSX0FERFIJMHhGRkMwMjIxQwkvKiBNYXN0ZXIgTW9kZSBBZGRyZXNzIFJlZ2lzdGVyICovCi0jZGVmaW5lCVRXSTFfSU5UX1NUQVQJCTB4RkZDMDIyMjAJLyogVFdJMQlNYXN0ZXIgSW50ZXJydXB0IFJlZ2lzdGVyICovCi0jZGVmaW5lCVRXSTFfSU5UX01BU0sJCTB4RkZDMDIyMjQJLyogVFdJMQlNYXN0ZXIgSW50ZXJydXB0IE1hc2sgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJVFdJMV9GSUZPX0NUTAkJMHhGRkMwMjIyOAkvKiBGSUZPCUNvbnRyb2wJUmVnaXN0ZXIgKi8KLSNkZWZpbmUJVFdJMV9GSUZPX1NUQVQJCTB4RkZDMDIyMkMJLyogRklGTwlTdGF0dXMgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJVFdJMV9YTVRfREFUQTgJCTB4RkZDMDIyODAJLyogRklGTwlUcmFuc21pdCBEYXRhIFNpbmdsZSBCeXRlIFJlZ2lzdGVyICovCi0jZGVmaW5lCVRXSTFfWE1UX0RBVEExNgkJMHhGRkMwMjI4NAkvKiBGSUZPCVRyYW5zbWl0IERhdGEgRG91YmxlIEJ5dGUgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJVFdJMV9SQ1ZfREFUQTgJCTB4RkZDMDIyODgJLyogRklGTwlSZWNlaXZlCURhdGEgU2luZ2xlIEJ5dGUgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJVFdJMV9SQ1ZfREFUQTE2CQkweEZGQzAyMjhDCS8qIEZJRk8JUmVjZWl2ZQlEYXRhIERvdWJsZSBCeXRlIFJlZ2lzdGVyICovCi0jZGVmaW5lIFRXSTFfUkVHQkFTRQkJVFdJMV9DTEtESVYKLQotCi0vKiB0aGUgZm9sbG93aW5nIGFyZSBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgKi8KLSNkZWZpbmUJVFdJMV9QUkVTQ0FMRQkgIFRXSTFfQ09OVFJPTAotI2RlZmluZQlUV0kxX0lOVF9TUkMJICBUV0kxX0lOVF9TVEFUCi0jZGVmaW5lCVRXSTFfSU5UX0VOQUJMRQkgIFRXSTFfSU5UX01BU0sKLQotCi0vKiBTUEkxCUNvbnRyb2xsZXIJCSgweEZGQzAyMzAwIC0gMHhGRkMwMjNGRikJICovCi0jZGVmaW5lCVNQSTFfQ1RMCQkJMHhGRkMwMjMwMCAgLyogU1BJMSBDb250cm9sIFJlZ2lzdGVyICovCi0jZGVmaW5lCVNQSTFfRkxHCQkJMHhGRkMwMjMwNCAgLyogU1BJMSBGbGFnIHJlZ2lzdGVyICovCi0jZGVmaW5lCVNQSTFfU1RBVAkJCTB4RkZDMDIzMDggIC8qIFNQSTEgU3RhdHVzIHJlZ2lzdGVyICovCi0jZGVmaW5lCVNQSTFfVERCUgkJCTB4RkZDMDIzMEMgIC8qIFNQSTEgVHJhbnNtaXQgRGF0YSBCdWZmZXIgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJU1BJMV9SREJSCQkJMHhGRkMwMjMxMCAgLyogU1BJMSBSZWNlaXZlIERhdGEgQnVmZmVyCVJlZ2lzdGVyICovCi0jZGVmaW5lCVNQSTFfQkFVRAkJCTB4RkZDMDIzMTQgIC8qIFNQSTEgQmF1ZCByYXRlIFJlZ2lzdGVyICovCi0jZGVmaW5lCVNQSTFfU0hBRE9XCQkJMHhGRkMwMjMxOCAgLyogU1BJMV9SREJSIFNoYWRvdwlSZWdpc3RlciAqLwotI2RlZmluZSBTUEkxX1JFR0JBU0UJCQlTUEkxX0NUTAotCi0vKiBTUEkyCUNvbnRyb2xsZXIJCSgweEZGQzAyNDAwIC0gMHhGRkMwMjRGRikJICovCi0jZGVmaW5lCVNQSTJfQ1RMCQkJMHhGRkMwMjQwMCAgLyogU1BJMiBDb250cm9sIFJlZ2lzdGVyICovCi0jZGVmaW5lCVNQSTJfRkxHCQkJMHhGRkMwMjQwNCAgLyogU1BJMiBGbGFnIHJlZ2lzdGVyICovCi0jZGVmaW5lCVNQSTJfU1RBVAkJCTB4RkZDMDI0MDggIC8qIFNQSTIgU3RhdHVzIHJlZ2lzdGVyICovCi0jZGVmaW5lCVNQSTJfVERCUgkJCTB4RkZDMDI0MEMgIC8qIFNQSTIgVHJhbnNtaXQgRGF0YSBCdWZmZXIgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJU1BJMl9SREJSCQkJMHhGRkMwMjQxMCAgLyogU1BJMiBSZWNlaXZlIERhdGEgQnVmZmVyCVJlZ2lzdGVyICovCi0jZGVmaW5lCVNQSTJfQkFVRAkJCTB4RkZDMDI0MTQgIC8qIFNQSTIgQmF1ZCByYXRlIFJlZ2lzdGVyICovCi0jZGVmaW5lCVNQSTJfU0hBRE9XCQkJMHhGRkMwMjQxOCAgLyogU1BJMl9SREJSIFNoYWRvdwlSZWdpc3RlciAqLwotI2RlZmluZSBTUEkyX1JFR0JBU0UJCQlTUEkyX0NUTAotCi0vKiBTUE9SVDIgQ29udHJvbGxlcgkJKDB4RkZDMDI1MDAgLSAweEZGQzAyNUZGKQkJCSAqLwotI2RlZmluZQlTUE9SVDJfVENSMQkJCTB4RkZDMDI1MDAJLyogU1BPUlQyIFRyYW5zbWl0IENvbmZpZ3VyYXRpb24gMSBSZWdpc3RlciAqLwotI2RlZmluZQlTUE9SVDJfVENSMgkJCTB4RkZDMDI1MDQJLyogU1BPUlQyIFRyYW5zbWl0IENvbmZpZ3VyYXRpb24gMiBSZWdpc3RlciAqLwotI2RlZmluZQlTUE9SVDJfVENMS0RJVgkJMHhGRkMwMjUwOAkvKiBTUE9SVDIgVHJhbnNtaXQgQ2xvY2sgRGl2aWRlciAqLwotI2RlZmluZQlTUE9SVDJfVEZTRElWCQkweEZGQzAyNTBDCS8qIFNQT1JUMiBUcmFuc21pdCBGcmFtZSBTeW5jIERpdmlkZXIgKi8KLSNkZWZpbmUJU1BPUlQyX1RYCQkJMHhGRkMwMjUxMAkvKiBTUE9SVDIgVFggRGF0YSBSZWdpc3RlciAqLwotI2RlZmluZQlTUE9SVDJfUlgJCQkweEZGQzAyNTE4CS8qIFNQT1JUMiBSWCBEYXRhIFJlZ2lzdGVyICovCi0jZGVmaW5lCVNQT1JUMl9SQ1IxCQkJMHhGRkMwMjUyMAkvKiBTUE9SVDIgVHJhbnNtaXQgQ29uZmlndXJhdGlvbiAxIFJlZ2lzdGVyICovCi0jZGVmaW5lCVNQT1JUMl9SQ1IyCQkJMHhGRkMwMjUyNAkvKiBTUE9SVDIgVHJhbnNtaXQgQ29uZmlndXJhdGlvbiAyIFJlZ2lzdGVyICovCi0jZGVmaW5lCVNQT1JUMl9SQ0xLRElWCQkweEZGQzAyNTI4CS8qIFNQT1JUMiBSZWNlaXZlIENsb2NrCURpdmlkZXIgKi8KLSNkZWZpbmUJU1BPUlQyX1JGU0RJVgkJMHhGRkMwMjUyQwkvKiBTUE9SVDIgUmVjZWl2ZSBGcmFtZQlTeW5jIERpdmlkZXIgKi8KLSNkZWZpbmUJU1BPUlQyX1NUQVQJCQkweEZGQzAyNTMwCS8qIFNQT1JUMiBTdGF0dXMgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJU1BPUlQyX0NITkwJCQkweEZGQzAyNTM0CS8qIFNQT1JUMiBDdXJyZW50IENoYW5uZWwgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJU1BPUlQyX01DTUMxCQkweEZGQzAyNTM4CS8qIFNQT1JUMiBNdWx0aS1DaGFubmVsCUNvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgMSAqLwotI2RlZmluZQlTUE9SVDJfTUNNQzIJCTB4RkZDMDI1M0MJLyogU1BPUlQyIE11bHRpLUNoYW5uZWwJQ29uZmlndXJhdGlvbiBSZWdpc3RlciAyICovCi0jZGVmaW5lCVNQT1JUMl9NVENTMAkJMHhGRkMwMjU0MAkvKiBTUE9SVDIgTXVsdGktQ2hhbm5lbAlUcmFuc21pdCBTZWxlY3QJUmVnaXN0ZXIgMCAqLwotI2RlZmluZQlTUE9SVDJfTVRDUzEJCTB4RkZDMDI1NDQJLyogU1BPUlQyIE11bHRpLUNoYW5uZWwJVHJhbnNtaXQgU2VsZWN0CVJlZ2lzdGVyIDEgKi8KLSNkZWZpbmUJU1BPUlQyX01UQ1MyCQkweEZGQzAyNTQ4CS8qIFNQT1JUMiBNdWx0aS1DaGFubmVsCVRyYW5zbWl0IFNlbGVjdAlSZWdpc3RlciAyICovCi0jZGVmaW5lCVNQT1JUMl9NVENTMwkJMHhGRkMwMjU0QwkvKiBTUE9SVDIgTXVsdGktQ2hhbm5lbAlUcmFuc21pdCBTZWxlY3QJUmVnaXN0ZXIgMyAqLwotI2RlZmluZQlTUE9SVDJfTVJDUzAJCTB4RkZDMDI1NTAJLyogU1BPUlQyIE11bHRpLUNoYW5uZWwJUmVjZWl2ZQlTZWxlY3QgUmVnaXN0ZXIJMCAqLwotI2RlZmluZQlTUE9SVDJfTVJDUzEJCTB4RkZDMDI1NTQJLyogU1BPUlQyIE11bHRpLUNoYW5uZWwJUmVjZWl2ZQlTZWxlY3QgUmVnaXN0ZXIJMSAqLwotI2RlZmluZQlTUE9SVDJfTVJDUzIJCTB4RkZDMDI1NTgJLyogU1BPUlQyIE11bHRpLUNoYW5uZWwJUmVjZWl2ZQlTZWxlY3QgUmVnaXN0ZXIJMiAqLwotI2RlZmluZQlTUE9SVDJfTVJDUzMJCTB4RkZDMDI1NUMJLyogU1BPUlQyIE11bHRpLUNoYW5uZWwJUmVjZWl2ZQlTZWxlY3QgUmVnaXN0ZXIJMyAqLwotCi0KLS8qIFNQT1JUMyBDb250cm9sbGVyCQkoMHhGRkMwMjYwMCAtIDB4RkZDMDI2RkYpCQkJICovCi0jZGVmaW5lCVNQT1JUM19UQ1IxCQkJMHhGRkMwMjYwMAkvKiBTUE9SVDMgVHJhbnNtaXQgQ29uZmlndXJhdGlvbiAxIFJlZ2lzdGVyICovCi0jZGVmaW5lCVNQT1JUM19UQ1IyCQkJMHhGRkMwMjYwNAkvKiBTUE9SVDMgVHJhbnNtaXQgQ29uZmlndXJhdGlvbiAyIFJlZ2lzdGVyICovCi0jZGVmaW5lCVNQT1JUM19UQ0xLRElWCQkweEZGQzAyNjA4CS8qIFNQT1JUMyBUcmFuc21pdCBDbG9jayBEaXZpZGVyICovCi0jZGVmaW5lCVNQT1JUM19URlNESVYJCTB4RkZDMDI2MEMJLyogU1BPUlQzIFRyYW5zbWl0IEZyYW1lIFN5bmMgRGl2aWRlciAqLwotI2RlZmluZQlTUE9SVDNfVFgJCQkweEZGQzAyNjEwCS8qIFNQT1JUMyBUWCBEYXRhIFJlZ2lzdGVyICovCi0jZGVmaW5lCVNQT1JUM19SWAkJCTB4RkZDMDI2MTgJLyogU1BPUlQzIFJYIERhdGEgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJU1BPUlQzX1JDUjEJCQkweEZGQzAyNjIwCS8qIFNQT1JUMyBUcmFuc21pdCBDb25maWd1cmF0aW9uIDEgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJU1BPUlQzX1JDUjIJCQkweEZGQzAyNjI0CS8qIFNQT1JUMyBUcmFuc21pdCBDb25maWd1cmF0aW9uIDIgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJU1BPUlQzX1JDTEtESVYJCTB4RkZDMDI2MjgJLyogU1BPUlQzIFJlY2VpdmUgQ2xvY2sJRGl2aWRlciAqLwotI2RlZmluZQlTUE9SVDNfUkZTRElWCQkweEZGQzAyNjJDCS8qIFNQT1JUMyBSZWNlaXZlIEZyYW1lCVN5bmMgRGl2aWRlciAqLwotI2RlZmluZQlTUE9SVDNfU1RBVAkJCTB4RkZDMDI2MzAJLyogU1BPUlQzIFN0YXR1cyBSZWdpc3RlciAqLwotI2RlZmluZQlTUE9SVDNfQ0hOTAkJCTB4RkZDMDI2MzQJLyogU1BPUlQzIEN1cnJlbnQgQ2hhbm5lbCBSZWdpc3RlciAqLwotI2RlZmluZQlTUE9SVDNfTUNNQzEJCTB4RkZDMDI2MzgJLyogU1BPUlQzIE11bHRpLUNoYW5uZWwJQ29uZmlndXJhdGlvbiBSZWdpc3RlciAxICovCi0jZGVmaW5lCVNQT1JUM19NQ01DMgkJMHhGRkMwMjYzQwkvKiBTUE9SVDMgTXVsdGktQ2hhbm5lbAlDb25maWd1cmF0aW9uIFJlZ2lzdGVyIDIgKi8KLSNkZWZpbmUJU1BPUlQzX01UQ1MwCQkweEZGQzAyNjQwCS8qIFNQT1JUMyBNdWx0aS1DaGFubmVsCVRyYW5zbWl0IFNlbGVjdAlSZWdpc3RlciAwICovCi0jZGVmaW5lCVNQT1JUM19NVENTMQkJMHhGRkMwMjY0NAkvKiBTUE9SVDMgTXVsdGktQ2hhbm5lbAlUcmFuc21pdCBTZWxlY3QJUmVnaXN0ZXIgMSAqLwotI2RlZmluZQlTUE9SVDNfTVRDUzIJCTB4RkZDMDI2NDgJLyogU1BPUlQzIE11bHRpLUNoYW5uZWwJVHJhbnNtaXQgU2VsZWN0CVJlZ2lzdGVyIDIgKi8KLSNkZWZpbmUJU1BPUlQzX01UQ1MzCQkweEZGQzAyNjRDCS8qIFNQT1JUMyBNdWx0aS1DaGFubmVsCVRyYW5zbWl0IFNlbGVjdAlSZWdpc3RlciAzICovCi0jZGVmaW5lCVNQT1JUM19NUkNTMAkJMHhGRkMwMjY1MAkvKiBTUE9SVDMgTXVsdGktQ2hhbm5lbAlSZWNlaXZlCVNlbGVjdCBSZWdpc3RlcgkwICovCi0jZGVmaW5lCVNQT1JUM19NUkNTMQkJMHhGRkMwMjY1NAkvKiBTUE9SVDMgTXVsdGktQ2hhbm5lbAlSZWNlaXZlCVNlbGVjdCBSZWdpc3RlcgkxICovCi0jZGVmaW5lCVNQT1JUM19NUkNTMgkJMHhGRkMwMjY1OAkvKiBTUE9SVDMgTXVsdGktQ2hhbm5lbAlSZWNlaXZlCVNlbGVjdCBSZWdpc3RlcgkyICovCi0jZGVmaW5lCVNQT1JUM19NUkNTMwkJMHhGRkMwMjY1QwkvKiBTUE9SVDMgTXVsdGktQ2hhbm5lbAlSZWNlaXZlCVNlbGVjdCBSZWdpc3RlcgkzICovCi0KKyNpbmNsdWRlICJkZWZCRjUzOC5oIgogCiAvKiBNZWRpYSBUcmFuc2NlaXZlciAoTVhWUikgICAoMHhGRkMwMjcwMCAtIDB4RkZDMDI4RkYpICovCiAKQEAgLTk5NSwxMjQ5ICsxNDksNCBAQAogI2RlZmluZQlNWFZSX0JMT0NLX0NOVAkgICAgICAweEZGQzAyOEMwICAvKiBNWFZSIEJsb2NrCUNvdW50ZXIgKi8KICNkZWZpbmUJTVhWUl9QTExfQ1RMXzIJICAgICAgMHhGRkMwMjhDNCAgLyogTVhWUiBQaGFzZQlMb2NrIExvb3AgQ29udHJvbCBSZWdpc3RlciAyICovCiAKLQotLyogQ0FOIENvbnRyb2xsZXIJCSgweEZGQzAyQTAwIC0gMHhGRkMwMkZGRikJCQkJICovCi0vKiBGb3IgTWFpbGJveGVzIDAtMTUJCQkJCQkJCQkJCSAqLwotI2RlZmluZQlDQU5fTUMxCQkJCTB4RkZDMDJBMDAJLyogTWFpbGJveCBjb25maWcgcmVnIDEJICovCi0jZGVmaW5lCUNBTl9NRDEJCQkJMHhGRkMwMkEwNAkvKiBNYWlsYm94IGRpcmVjdGlvbiByZWcgMSAqLwotI2RlZmluZQlDQU5fVFJTMQkJCTB4RkZDMDJBMDgJLyogVHJhbnNtaXQgUmVxdWVzdCBTZXQJcmVnIDEgKi8KLSNkZWZpbmUJQ0FOX1RSUjEJCQkweEZGQzAyQTBDCS8qIFRyYW5zbWl0IFJlcXVlc3QgUmVzZXQgcmVnIDEgKi8KLSNkZWZpbmUJQ0FOX1RBMQkJCQkweEZGQzAyQTEwCS8qIFRyYW5zbWl0IEFja25vd2xlZGdlCXJlZyAxICovCi0jZGVmaW5lCUNBTl9BQTEJCQkJMHhGRkMwMkExNAkvKiBUcmFuc21pdCBBYm9ydCBBY2tub3dsZWRnZSByZWcgMSAqLwotI2RlZmluZQlDQU5fUk1QMQkJCTB4RkZDMDJBMTgJLyogUmVjZWl2ZSBNZXNzYWdlIFBlbmRpbmcgcmVnIDEgKi8KLSNkZWZpbmUJQ0FOX1JNTDEJCQkweEZGQzAyQTFDCS8qIFJlY2VpdmUgTWVzc2FnZSBMb3N0CXJlZyAxICovCi0jZGVmaW5lCUNBTl9NQlRJRjEJCQkweEZGQzAyQTIwCS8qIE1haWxib3ggVHJhbnNtaXQgSW50ZXJydXB0IEZsYWcgcmVnIDEgKi8KLSNkZWZpbmUJQ0FOX01CUklGMQkJCTB4RkZDMDJBMjQJLyogTWFpbGJveCBSZWNlaXZlICBJbnRlcnJ1cHQgRmxhZyByZWcgMSAqLwotI2RlZmluZQlDQU5fTUJJTTEJCQkweEZGQzAyQTI4CS8qIE1haWxib3ggSW50ZXJydXB0IE1hc2sgcmVnIDEgKi8KLSNkZWZpbmUJQ0FOX1JGSDEJCQkweEZGQzAyQTJDCS8qIFJlbW90ZSBGcmFtZQlIYW5kbGluZyByZWcgMSAqLwotI2RlZmluZQlDQU5fT1BTUzEJCQkweEZGQzAyQTMwCS8qIE92ZXJ3cml0ZSBQcm90ZWN0aW9uCVNpbmdsZSBTaG90IFhtaXNzaW9uIHJlZyAxICovCi0KLS8qIEZvciBNYWlsYm94ZXMgMTYtMzEJCQkJCQkJCQkJCSAqLwotI2RlZmluZQlDQU5fTUMyCQkJCTB4RkZDMDJBNDAJLyogTWFpbGJveCBjb25maWcgcmVnIDIJICovCi0jZGVmaW5lCUNBTl9NRDIJCQkJMHhGRkMwMkE0NAkvKiBNYWlsYm94IGRpcmVjdGlvbiByZWcgMiAqLwotI2RlZmluZQlDQU5fVFJTMgkJCTB4RkZDMDJBNDgJLyogVHJhbnNtaXQgUmVxdWVzdCBTZXQJcmVnIDIgKi8KLSNkZWZpbmUJQ0FOX1RSUjIJCQkweEZGQzAyQTRDCS8qIFRyYW5zbWl0IFJlcXVlc3QgUmVzZXQgcmVnIDIgKi8KLSNkZWZpbmUJQ0FOX1RBMgkJCQkweEZGQzAyQTUwCS8qIFRyYW5zbWl0IEFja25vd2xlZGdlCXJlZyAyICovCi0jZGVmaW5lCUNBTl9BQTIJCQkJMHhGRkMwMkE1NAkvKiBUcmFuc21pdCBBYm9ydCBBY2tub3dsZWRnZSByZWcgMiAqLwotI2RlZmluZQlDQU5fUk1QMgkJCTB4RkZDMDJBNTgJLyogUmVjZWl2ZSBNZXNzYWdlIFBlbmRpbmcgcmVnIDIgKi8KLSNkZWZpbmUJQ0FOX1JNTDIJCQkweEZGQzAyQTVDCS8qIFJlY2VpdmUgTWVzc2FnZSBMb3N0CXJlZyAyICovCi0jZGVmaW5lCUNBTl9NQlRJRjIJCQkweEZGQzAyQTYwCS8qIE1haWxib3ggVHJhbnNtaXQgSW50ZXJydXB0IEZsYWcgcmVnIDIgKi8KLSNkZWZpbmUJQ0FOX01CUklGMgkJCTB4RkZDMDJBNjQJLyogTWFpbGJveCBSZWNlaXZlICBJbnRlcnJ1cHQgRmxhZyByZWcgMiAqLwotI2RlZmluZQlDQU5fTUJJTTIJCQkweEZGQzAyQTY4CS8qIE1haWxib3ggSW50ZXJydXB0IE1hc2sgcmVnIDIgKi8KLSNkZWZpbmUJQ0FOX1JGSDIJCQkweEZGQzAyQTZDCS8qIFJlbW90ZSBGcmFtZQlIYW5kbGluZyByZWcgMiAqLwotI2RlZmluZQlDQU5fT1BTUzIJCQkweEZGQzAyQTcwCS8qIE92ZXJ3cml0ZSBQcm90ZWN0aW9uCVNpbmdsZSBTaG90IFhtaXNzaW9uIHJlZyAyICovCi0KLSNkZWZpbmUJQ0FOX0NMT0NLCQkJMHhGRkMwMkE4MAkvKiBCaXQgVGltaW5nIENvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgMCAqLwotI2RlZmluZQlDQU5fVElNSU5HCQkJMHhGRkMwMkE4NAkvKiBCaXQgVGltaW5nIENvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgMSAqLwotCi0jZGVmaW5lCUNBTl9ERUJVRwkJCTB4RkZDMDJBODgJLyogRGVidWcgUmVnaXN0ZXIJCSAqLwotLyogdGhlIGZvbGxvd2luZyBpcyBmb3IJYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgKi8KLSNkZWZpbmUJQ0FOX0NORgkJIENBTl9ERUJVRwotCi0jZGVmaW5lCUNBTl9TVEFUVVMJCQkweEZGQzAyQThDCS8qIEdsb2JhbCBTdGF0dXMgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJQ0FOX0NFQwkJCQkweEZGQzAyQTkwCS8qIEVycm9yIENvdW50ZXIgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJQ0FOX0dJUwkJCQkweEZGQzAyQTk0CS8qIEdsb2JhbCBJbnRlcnJ1cHQgU3RhdHVzIFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9HSU0JCQkJMHhGRkMwMkE5OAkvKiBHbG9iYWwgSW50ZXJydXB0IE1hc2sgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJQ0FOX0dJRgkJCQkweEZGQzAyQTlDCS8qIEdsb2JhbCBJbnRlcnJ1cHQgRmxhZyBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fQ09OVFJPTAkJCTB4RkZDMDJBQTAJLyogTWFzdGVyIENvbnRyb2wgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJQ0FOX0lOVFIJCQkweEZGQzAyQUE0CS8qIEludGVycnVwdCBQZW5kaW5nIFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQlRECQkJMHhGRkMwMkFBQwkvKiBNYWlsYm94IFRlbXBvcmFyeSBEaXNhYmxlIEZlYXR1cmUgKi8KLSNkZWZpbmUJQ0FOX0VXUgkJCQkweEZGQzAyQUIwCS8qIFByb2dyYW1tYWJsZQlXYXJuaW5nCUxldmVsICovCi0jZGVmaW5lCUNBTl9FU1IJCQkJMHhGRkMwMkFCNAkvKiBFcnJvciBTdGF0dXMJUmVnaXN0ZXIgKi8KLSNkZWZpbmUJQ0FOX1VDQ05UCQkJMHhGRkMwMkFDNAkvKiBVbml2ZXJzYWwgQ291bnRlcgkgKi8KLSNkZWZpbmUJQ0FOX1VDUkMJCQkweEZGQzAyQUM4CS8qIFVuaXZlcnNhbCBDb3VudGVyIFJlbG9hZC9DYXB0dXJlIFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9VQ0NORgkJCTB4RkZDMDJBQ0MJLyogVW5pdmVyc2FsIENvdW50ZXIgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAqLwotCi0vKiBNYWlsYm94IEFjY2VwdGFuY2UgTWFza3MJCQkJCSAqLwotI2RlZmluZQlDQU5fQU0wMEwJCQkweEZGQzAyQjAwCS8qIE1haWxib3ggMCBMb3cgQWNjZXB0YW5jZSBNYXNrICovCi0jZGVmaW5lCUNBTl9BTTAwSAkJCTB4RkZDMDJCMDQJLyogTWFpbGJveCAwIEhpZ2ggQWNjZXB0YW5jZSBNYXNrICovCi0jZGVmaW5lCUNBTl9BTTAxTAkJCTB4RkZDMDJCMDgJLyogTWFpbGJveCAxIExvdyBBY2NlcHRhbmNlIE1hc2sgKi8KLSNkZWZpbmUJQ0FOX0FNMDFICQkJMHhGRkMwMkIwQwkvKiBNYWlsYm94IDEgSGlnaCBBY2NlcHRhbmNlIE1hc2sgKi8KLSNkZWZpbmUJQ0FOX0FNMDJMCQkJMHhGRkMwMkIxMAkvKiBNYWlsYm94IDIgTG93IEFjY2VwdGFuY2UgTWFzayAqLwotI2RlZmluZQlDQU5fQU0wMkgJCQkweEZGQzAyQjE0CS8qIE1haWxib3ggMiBIaWdoIEFjY2VwdGFuY2UgTWFzayAqLwotI2RlZmluZQlDQU5fQU0wM0wJCQkweEZGQzAyQjE4CS8qIE1haWxib3ggMyBMb3cgQWNjZXB0YW5jZSBNYXNrICovCi0jZGVmaW5lCUNBTl9BTTAzSAkJCTB4RkZDMDJCMUMJLyogTWFpbGJveCAzIEhpZ2ggQWNjZXB0YW5jZSBNYXNrICovCi0jZGVmaW5lCUNBTl9BTTA0TAkJCTB4RkZDMDJCMjAJLyogTWFpbGJveCA0IExvdyBBY2NlcHRhbmNlIE1hc2sgKi8KLSNkZWZpbmUJQ0FOX0FNMDRICQkJMHhGRkMwMkIyNAkvKiBNYWlsYm94IDQgSGlnaCBBY2NlcHRhbmNlIE1hc2sgKi8KLSNkZWZpbmUJQ0FOX0FNMDVMCQkJMHhGRkMwMkIyOAkvKiBNYWlsYm94IDUgTG93IEFjY2VwdGFuY2UgTWFzayAqLwotI2RlZmluZQlDQU5fQU0wNUgJCQkweEZGQzAyQjJDCS8qIE1haWxib3ggNSBIaWdoIEFjY2VwdGFuY2UgTWFzayAqLwotI2RlZmluZQlDQU5fQU0wNkwJCQkweEZGQzAyQjMwCS8qIE1haWxib3ggNiBMb3cgQWNjZXB0YW5jZSBNYXNrICovCi0jZGVmaW5lCUNBTl9BTTA2SAkJCTB4RkZDMDJCMzQJLyogTWFpbGJveCA2IEhpZ2ggQWNjZXB0YW5jZSBNYXNrICovCi0jZGVmaW5lCUNBTl9BTTA3TAkJCTB4RkZDMDJCMzgJLyogTWFpbGJveCA3IExvdyBBY2NlcHRhbmNlIE1hc2sgKi8KLSNkZWZpbmUJQ0FOX0FNMDdICQkJMHhGRkMwMkIzQwkvKiBNYWlsYm94IDcgSGlnaCBBY2NlcHRhbmNlIE1hc2sgKi8KLSNkZWZpbmUJQ0FOX0FNMDhMCQkJMHhGRkMwMkI0MAkvKiBNYWlsYm94IDggTG93IEFjY2VwdGFuY2UgTWFzayAqLwotI2RlZmluZQlDQU5fQU0wOEgJCQkweEZGQzAyQjQ0CS8qIE1haWxib3ggOCBIaWdoIEFjY2VwdGFuY2UgTWFzayAqLwotI2RlZmluZQlDQU5fQU0wOUwJCQkweEZGQzAyQjQ4CS8qIE1haWxib3ggOSBMb3cgQWNjZXB0YW5jZSBNYXNrICovCi0jZGVmaW5lCUNBTl9BTTA5SAkJCTB4RkZDMDJCNEMJLyogTWFpbGJveCA5IEhpZ2ggQWNjZXB0YW5jZSBNYXNrICovCi0jZGVmaW5lCUNBTl9BTTEwTAkJCTB4RkZDMDJCNTAJLyogTWFpbGJveCAxMCBMb3cgQWNjZXB0YW5jZSBNYXNrICovCi0jZGVmaW5lCUNBTl9BTTEwSAkJCTB4RkZDMDJCNTQJLyogTWFpbGJveCAxMCBIaWdoIEFjY2VwdGFuY2UgTWFzayAqLwotI2RlZmluZQlDQU5fQU0xMUwJCQkweEZGQzAyQjU4CS8qIE1haWxib3ggMTEgTG93IEFjY2VwdGFuY2UgTWFzayAqLwotI2RlZmluZQlDQU5fQU0xMUgJCQkweEZGQzAyQjVDCS8qIE1haWxib3ggMTEgSGlnaCBBY2NlcHRhbmNlIE1hc2sgKi8KLSNkZWZpbmUJQ0FOX0FNMTJMCQkJMHhGRkMwMkI2MAkvKiBNYWlsYm94IDEyIExvdyBBY2NlcHRhbmNlIE1hc2sgKi8KLSNkZWZpbmUJQ0FOX0FNMTJICQkJMHhGRkMwMkI2NAkvKiBNYWlsYm94IDEyIEhpZ2ggQWNjZXB0YW5jZSBNYXNrICovCi0jZGVmaW5lCUNBTl9BTTEzTAkJCTB4RkZDMDJCNjgJLyogTWFpbGJveCAxMyBMb3cgQWNjZXB0YW5jZSBNYXNrICovCi0jZGVmaW5lCUNBTl9BTTEzSAkJCTB4RkZDMDJCNkMJLyogTWFpbGJveCAxMyBIaWdoIEFjY2VwdGFuY2UgTWFzayAqLwotI2RlZmluZQlDQU5fQU0xNEwJCQkweEZGQzAyQjcwCS8qIE1haWxib3ggMTQgTG93IEFjY2VwdGFuY2UgTWFzayAqLwotI2RlZmluZQlDQU5fQU0xNEgJCQkweEZGQzAyQjc0CS8qIE1haWxib3ggMTQgSGlnaCBBY2NlcHRhbmNlIE1hc2sgKi8KLSNkZWZpbmUJQ0FOX0FNMTVMCQkJMHhGRkMwMkI3OAkvKiBNYWlsYm94IDE1IExvdyBBY2NlcHRhbmNlIE1hc2sgKi8KLSNkZWZpbmUJQ0FOX0FNMTVICQkJMHhGRkMwMkI3QwkvKiBNYWlsYm94IDE1IEhpZ2ggQWNjZXB0YW5jZSBNYXNrICovCi0KLSNkZWZpbmUJQ0FOX0FNMTZMCQkJMHhGRkMwMkI4MAkvKiBNYWlsYm94IDE2IExvdyBBY2NlcHRhbmNlIE1hc2sgKi8KLSNkZWZpbmUJQ0FOX0FNMTZICQkJMHhGRkMwMkI4NAkvKiBNYWlsYm94IDE2IEhpZ2ggQWNjZXB0YW5jZSBNYXNrICovCi0jZGVmaW5lCUNBTl9BTTE3TAkJCTB4RkZDMDJCODgJLyogTWFpbGJveCAxNyBMb3cgQWNjZXB0YW5jZSBNYXNrICovCi0jZGVmaW5lCUNBTl9BTTE3SAkJCTB4RkZDMDJCOEMJLyogTWFpbGJveCAxNyBIaWdoIEFjY2VwdGFuY2UgTWFzayAqLwotI2RlZmluZQlDQU5fQU0xOEwJCQkweEZGQzAyQjkwCS8qIE1haWxib3ggMTggTG93IEFjY2VwdGFuY2UgTWFzayAqLwotI2RlZmluZQlDQU5fQU0xOEgJCQkweEZGQzAyQjk0CS8qIE1haWxib3ggMTggSGlnaCBBY2NlcHRhbmNlIE1hc2sgKi8KLSNkZWZpbmUJQ0FOX0FNMTlMCQkJMHhGRkMwMkI5OAkvKiBNYWlsYm94IDE5IExvdyBBY2NlcHRhbmNlIE1hc2sgKi8KLSNkZWZpbmUJQ0FOX0FNMTlICQkJMHhGRkMwMkI5QwkvKiBNYWlsYm94IDE5IEhpZ2ggQWNjZXB0YW5jZSBNYXNrICovCi0jZGVmaW5lCUNBTl9BTTIwTAkJCTB4RkZDMDJCQTAJLyogTWFpbGJveCAyMCBMb3cgQWNjZXB0YW5jZSBNYXNrICovCi0jZGVmaW5lCUNBTl9BTTIwSAkJCTB4RkZDMDJCQTQJLyogTWFpbGJveCAyMCBIaWdoIEFjY2VwdGFuY2UgTWFzayAqLwotI2RlZmluZQlDQU5fQU0yMUwJCQkweEZGQzAyQkE4CS8qIE1haWxib3ggMjEgTG93IEFjY2VwdGFuY2UgTWFzayAqLwotI2RlZmluZQlDQU5fQU0yMUgJCQkweEZGQzAyQkFDCS8qIE1haWxib3ggMjEgSGlnaCBBY2NlcHRhbmNlIE1hc2sgKi8KLSNkZWZpbmUJQ0FOX0FNMjJMCQkJMHhGRkMwMkJCMAkvKiBNYWlsYm94IDIyIExvdyBBY2NlcHRhbmNlIE1hc2sgKi8KLSNkZWZpbmUJQ0FOX0FNMjJICQkJMHhGRkMwMkJCNAkvKiBNYWlsYm94IDIyIEhpZ2ggQWNjZXB0YW5jZSBNYXNrICovCi0jZGVmaW5lCUNBTl9BTTIzTAkJCTB4RkZDMDJCQjgJLyogTWFpbGJveCAyMyBMb3cgQWNjZXB0YW5jZSBNYXNrICovCi0jZGVmaW5lCUNBTl9BTTIzSAkJCTB4RkZDMDJCQkMJLyogTWFpbGJveCAyMyBIaWdoIEFjY2VwdGFuY2UgTWFzayAqLwotI2RlZmluZQlDQU5fQU0yNEwJCQkweEZGQzAyQkMwCS8qIE1haWxib3ggMjQgTG93IEFjY2VwdGFuY2UgTWFzayAqLwotI2RlZmluZQlDQU5fQU0yNEgJCQkweEZGQzAyQkM0CS8qIE1haWxib3ggMjQgSGlnaCBBY2NlcHRhbmNlIE1hc2sgKi8KLSNkZWZpbmUJQ0FOX0FNMjVMCQkJMHhGRkMwMkJDOAkvKiBNYWlsYm94IDI1IExvdyBBY2NlcHRhbmNlIE1hc2sgKi8KLSNkZWZpbmUJQ0FOX0FNMjVICQkJMHhGRkMwMkJDQwkvKiBNYWlsYm94IDI1IEhpZ2ggQWNjZXB0YW5jZSBNYXNrICovCi0jZGVmaW5lCUNBTl9BTTI2TAkJCTB4RkZDMDJCRDAJLyogTWFpbGJveCAyNiBMb3cgQWNjZXB0YW5jZSBNYXNrICovCi0jZGVmaW5lCUNBTl9BTTI2SAkJCTB4RkZDMDJCRDQJLyogTWFpbGJveCAyNiBIaWdoIEFjY2VwdGFuY2UgTWFzayAqLwotI2RlZmluZQlDQU5fQU0yN0wJCQkweEZGQzAyQkQ4CS8qIE1haWxib3ggMjcgTG93IEFjY2VwdGFuY2UgTWFzayAqLwotI2RlZmluZQlDQU5fQU0yN0gJCQkweEZGQzAyQkRDCS8qIE1haWxib3ggMjcgSGlnaCBBY2NlcHRhbmNlIE1hc2sgKi8KLSNkZWZpbmUJQ0FOX0FNMjhMCQkJMHhGRkMwMkJFMAkvKiBNYWlsYm94IDI4IExvdyBBY2NlcHRhbmNlIE1hc2sgKi8KLSNkZWZpbmUJQ0FOX0FNMjhICQkJMHhGRkMwMkJFNAkvKiBNYWlsYm94IDI4IEhpZ2ggQWNjZXB0YW5jZSBNYXNrICovCi0jZGVmaW5lCUNBTl9BTTI5TAkJCTB4RkZDMDJCRTgJLyogTWFpbGJveCAyOSBMb3cgQWNjZXB0YW5jZSBNYXNrICovCi0jZGVmaW5lCUNBTl9BTTI5SAkJCTB4RkZDMDJCRUMJLyogTWFpbGJveCAyOSBIaWdoIEFjY2VwdGFuY2UgTWFzayAqLwotI2RlZmluZQlDQU5fQU0zMEwJCQkweEZGQzAyQkYwCS8qIE1haWxib3ggMzAgTG93IEFjY2VwdGFuY2UgTWFzayAqLwotI2RlZmluZQlDQU5fQU0zMEgJCQkweEZGQzAyQkY0CS8qIE1haWxib3ggMzAgSGlnaCBBY2NlcHRhbmNlIE1hc2sgKi8KLSNkZWZpbmUJQ0FOX0FNMzFMCQkJMHhGRkMwMkJGOAkvKiBNYWlsYm94IDMxIExvdyBBY2NlcHRhbmNlIE1hc2sgKi8KLSNkZWZpbmUJQ0FOX0FNMzFICQkJMHhGRkMwMkJGQwkvKiBNYWlsYm94IDMxIEhpZ2ggQWNjZXB0YW5jZSBNYXNrICovCi0KLS8qIENBTiBBY2NlcHRhbmNlIE1hc2sgTWFjcm9zICovCi0jZGVmaW5lCUNBTl9BTV9MKHgpCQkJKENBTl9BTTAwTCsoKHgpKjB4OCkpCi0jZGVmaW5lCUNBTl9BTV9IKHgpCQkJKENBTl9BTTAwSCsoKHgpKjB4OCkpCi0KLS8qIE1haWxib3ggUmVnaXN0ZXJzCQkJCQkJCQkJICovCi0jZGVmaW5lCUNBTl9NQjAwX0RBVEEwCQkweEZGQzAyQzAwCS8qIE1haWxib3ggMCBEYXRhIFdvcmQgMCBbMTU6MF0JUmVnaXN0ZXIgKi8KLSNkZWZpbmUJQ0FOX01CMDBfREFUQTEJCTB4RkZDMDJDMDQJLyogTWFpbGJveCAwIERhdGEgV29yZCAxIFszMToxNl0gUmVnaXN0ZXIgKi8KLSNkZWZpbmUJQ0FOX01CMDBfREFUQTIJCTB4RkZDMDJDMDgJLyogTWFpbGJveCAwIERhdGEgV29yZCAyIFs0NzozMl0gUmVnaXN0ZXIgKi8KLSNkZWZpbmUJQ0FOX01CMDBfREFUQTMJCTB4RkZDMDJDMEMJLyogTWFpbGJveCAwIERhdGEgV29yZCAzIFs2Mzo0OF0gUmVnaXN0ZXIgKi8KLSNkZWZpbmUJQ0FOX01CMDBfTEVOR1RICQkweEZGQzAyQzEwCS8qIE1haWxib3ggMCBEYXRhIExlbmd0aCBDb2RlIFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjAwX1RJTUVTVEFNUAkweEZGQzAyQzE0CS8qIE1haWxib3ggMCBUaW1lIFN0YW1wCVZhbHVlIFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjAwX0lEMAkJMHhGRkMwMkMxOAkvKiBNYWlsYm94IDAgSWRlbnRpZmllcglMb3cgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJQ0FOX01CMDBfSUQxCQkweEZGQzAyQzFDCS8qIE1haWxib3ggMCBJZGVudGlmaWVyCUhpZ2ggUmVnaXN0ZXIgKi8KLQotI2RlZmluZQlDQU5fTUIwMV9EQVRBMAkJMHhGRkMwMkMyMAkvKiBNYWlsYm94IDEgRGF0YSBXb3JkIDAgWzE1OjBdCVJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjAxX0RBVEExCQkweEZGQzAyQzI0CS8qIE1haWxib3ggMSBEYXRhIFdvcmQgMSBbMzE6MTZdIFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjAxX0RBVEEyCQkweEZGQzAyQzI4CS8qIE1haWxib3ggMSBEYXRhIFdvcmQgMiBbNDc6MzJdIFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjAxX0RBVEEzCQkweEZGQzAyQzJDCS8qIE1haWxib3ggMSBEYXRhIFdvcmQgMyBbNjM6NDhdIFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjAxX0xFTkdUSAkJMHhGRkMwMkMzMAkvKiBNYWlsYm94IDEgRGF0YSBMZW5ndGggQ29kZSBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIwMV9USU1FU1RBTVAJMHhGRkMwMkMzNAkvKiBNYWlsYm94IDEgVGltZSBTdGFtcAlWYWx1ZSBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIwMV9JRDAJCTB4RkZDMDJDMzgJLyogTWFpbGJveCAxIElkZW50aWZpZXIJTG93IFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjAxX0lEMQkJMHhGRkMwMkMzQwkvKiBNYWlsYm94IDEgSWRlbnRpZmllcglIaWdoIFJlZ2lzdGVyICovCi0KLSNkZWZpbmUJQ0FOX01CMDJfREFUQTAJCTB4RkZDMDJDNDAJLyogTWFpbGJveCAyIERhdGEgV29yZCAwIFsxNTowXQlSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIwMl9EQVRBMQkJMHhGRkMwMkM0NAkvKiBNYWlsYm94IDIgRGF0YSBXb3JkIDEgWzMxOjE2XSBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIwMl9EQVRBMgkJMHhGRkMwMkM0OAkvKiBNYWlsYm94IDIgRGF0YSBXb3JkIDIgWzQ3OjMyXSBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIwMl9EQVRBMwkJMHhGRkMwMkM0QwkvKiBNYWlsYm94IDIgRGF0YSBXb3JkIDMgWzYzOjQ4XSBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIwMl9MRU5HVEgJCTB4RkZDMDJDNTAJLyogTWFpbGJveCAyIERhdGEgTGVuZ3RoIENvZGUgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJQ0FOX01CMDJfVElNRVNUQU1QCTB4RkZDMDJDNTQJLyogTWFpbGJveCAyIFRpbWUgU3RhbXAJVmFsdWUgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJQ0FOX01CMDJfSUQwCQkweEZGQzAyQzU4CS8qIE1haWxib3ggMiBJZGVudGlmaWVyCUxvdyBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIwMl9JRDEJCTB4RkZDMDJDNUMJLyogTWFpbGJveCAyIElkZW50aWZpZXIJSGlnaCBSZWdpc3RlciAqLwotCi0jZGVmaW5lCUNBTl9NQjAzX0RBVEEwCQkweEZGQzAyQzYwCS8qIE1haWxib3ggMyBEYXRhIFdvcmQgMCBbMTU6MF0JUmVnaXN0ZXIgKi8KLSNkZWZpbmUJQ0FOX01CMDNfREFUQTEJCTB4RkZDMDJDNjQJLyogTWFpbGJveCAzIERhdGEgV29yZCAxIFszMToxNl0gUmVnaXN0ZXIgKi8KLSNkZWZpbmUJQ0FOX01CMDNfREFUQTIJCTB4RkZDMDJDNjgJLyogTWFpbGJveCAzIERhdGEgV29yZCAyIFs0NzozMl0gUmVnaXN0ZXIgKi8KLSNkZWZpbmUJQ0FOX01CMDNfREFUQTMJCTB4RkZDMDJDNkMJLyogTWFpbGJveCAzIERhdGEgV29yZCAzIFs2Mzo0OF0gUmVnaXN0ZXIgKi8KLSNkZWZpbmUJQ0FOX01CMDNfTEVOR1RICQkweEZGQzAyQzcwCS8qIE1haWxib3ggMyBEYXRhIExlbmd0aCBDb2RlIFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjAzX1RJTUVTVEFNUAkweEZGQzAyQzc0CS8qIE1haWxib3ggMyBUaW1lIFN0YW1wCVZhbHVlIFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjAzX0lEMAkJMHhGRkMwMkM3OAkvKiBNYWlsYm94IDMgSWRlbnRpZmllcglMb3cgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJQ0FOX01CMDNfSUQxCQkweEZGQzAyQzdDCS8qIE1haWxib3ggMyBJZGVudGlmaWVyCUhpZ2ggUmVnaXN0ZXIgKi8KLQotI2RlZmluZQlDQU5fTUIwNF9EQVRBMAkJMHhGRkMwMkM4MAkvKiBNYWlsYm94IDQgRGF0YSBXb3JkIDAgWzE1OjBdCVJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjA0X0RBVEExCQkweEZGQzAyQzg0CS8qIE1haWxib3ggNCBEYXRhIFdvcmQgMSBbMzE6MTZdIFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjA0X0RBVEEyCQkweEZGQzAyQzg4CS8qIE1haWxib3ggNCBEYXRhIFdvcmQgMiBbNDc6MzJdIFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjA0X0RBVEEzCQkweEZGQzAyQzhDCS8qIE1haWxib3ggNCBEYXRhIFdvcmQgMyBbNjM6NDhdIFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjA0X0xFTkdUSAkJMHhGRkMwMkM5MAkvKiBNYWlsYm94IDQgRGF0YSBMZW5ndGggQ29kZSBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIwNF9USU1FU1RBTVAJMHhGRkMwMkM5NAkvKiBNYWlsYm94IDQgVGltZSBTdGFtcAlWYWx1ZSBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIwNF9JRDAJCTB4RkZDMDJDOTgJLyogTWFpbGJveCA0IElkZW50aWZpZXIJTG93IFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjA0X0lEMQkJMHhGRkMwMkM5QwkvKiBNYWlsYm94IDQgSWRlbnRpZmllcglIaWdoIFJlZ2lzdGVyICovCi0KLSNkZWZpbmUJQ0FOX01CMDVfREFUQTAJCTB4RkZDMDJDQTAJLyogTWFpbGJveCA1IERhdGEgV29yZCAwIFsxNTowXQlSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIwNV9EQVRBMQkJMHhGRkMwMkNBNAkvKiBNYWlsYm94IDUgRGF0YSBXb3JkIDEgWzMxOjE2XSBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIwNV9EQVRBMgkJMHhGRkMwMkNBOAkvKiBNYWlsYm94IDUgRGF0YSBXb3JkIDIgWzQ3OjMyXSBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIwNV9EQVRBMwkJMHhGRkMwMkNBQwkvKiBNYWlsYm94IDUgRGF0YSBXb3JkIDMgWzYzOjQ4XSBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIwNV9MRU5HVEgJCTB4RkZDMDJDQjAJLyogTWFpbGJveCA1IERhdGEgTGVuZ3RoIENvZGUgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJQ0FOX01CMDVfVElNRVNUQU1QCTB4RkZDMDJDQjQJLyogTWFpbGJveCA1IFRpbWUgU3RhbXAJVmFsdWUgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJQ0FOX01CMDVfSUQwCQkweEZGQzAyQ0I4CS8qIE1haWxib3ggNSBJZGVudGlmaWVyCUxvdyBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIwNV9JRDEJCTB4RkZDMDJDQkMJLyogTWFpbGJveCA1IElkZW50aWZpZXIJSGlnaCBSZWdpc3RlciAqLwotCi0jZGVmaW5lCUNBTl9NQjA2X0RBVEEwCQkweEZGQzAyQ0MwCS8qIE1haWxib3ggNiBEYXRhIFdvcmQgMCBbMTU6MF0JUmVnaXN0ZXIgKi8KLSNkZWZpbmUJQ0FOX01CMDZfREFUQTEJCTB4RkZDMDJDQzQJLyogTWFpbGJveCA2IERhdGEgV29yZCAxIFszMToxNl0gUmVnaXN0ZXIgKi8KLSNkZWZpbmUJQ0FOX01CMDZfREFUQTIJCTB4RkZDMDJDQzgJLyogTWFpbGJveCA2IERhdGEgV29yZCAyIFs0NzozMl0gUmVnaXN0ZXIgKi8KLSNkZWZpbmUJQ0FOX01CMDZfREFUQTMJCTB4RkZDMDJDQ0MJLyogTWFpbGJveCA2IERhdGEgV29yZCAzIFs2Mzo0OF0gUmVnaXN0ZXIgKi8KLSNkZWZpbmUJQ0FOX01CMDZfTEVOR1RICQkweEZGQzAyQ0QwCS8qIE1haWxib3ggNiBEYXRhIExlbmd0aCBDb2RlIFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjA2X1RJTUVTVEFNUAkweEZGQzAyQ0Q0CS8qIE1haWxib3ggNiBUaW1lIFN0YW1wCVZhbHVlIFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjA2X0lEMAkJMHhGRkMwMkNEOAkvKiBNYWlsYm94IDYgSWRlbnRpZmllcglMb3cgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJQ0FOX01CMDZfSUQxCQkweEZGQzAyQ0RDCS8qIE1haWxib3ggNiBJZGVudGlmaWVyCUhpZ2ggUmVnaXN0ZXIgKi8KLQotI2RlZmluZQlDQU5fTUIwN19EQVRBMAkJMHhGRkMwMkNFMAkvKiBNYWlsYm94IDcgRGF0YSBXb3JkIDAgWzE1OjBdCVJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjA3X0RBVEExCQkweEZGQzAyQ0U0CS8qIE1haWxib3ggNyBEYXRhIFdvcmQgMSBbMzE6MTZdIFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjA3X0RBVEEyCQkweEZGQzAyQ0U4CS8qIE1haWxib3ggNyBEYXRhIFdvcmQgMiBbNDc6MzJdIFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjA3X0RBVEEzCQkweEZGQzAyQ0VDCS8qIE1haWxib3ggNyBEYXRhIFdvcmQgMyBbNjM6NDhdIFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjA3X0xFTkdUSAkJMHhGRkMwMkNGMAkvKiBNYWlsYm94IDcgRGF0YSBMZW5ndGggQ29kZSBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIwN19USU1FU1RBTVAJMHhGRkMwMkNGNAkvKiBNYWlsYm94IDcgVGltZSBTdGFtcAlWYWx1ZSBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIwN19JRDAJCTB4RkZDMDJDRjgJLyogTWFpbGJveCA3IElkZW50aWZpZXIJTG93IFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjA3X0lEMQkJMHhGRkMwMkNGQwkvKiBNYWlsYm94IDcgSWRlbnRpZmllcglIaWdoIFJlZ2lzdGVyICovCi0KLSNkZWZpbmUJQ0FOX01CMDhfREFUQTAJCTB4RkZDMDJEMDAJLyogTWFpbGJveCA4IERhdGEgV29yZCAwIFsxNTowXQlSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIwOF9EQVRBMQkJMHhGRkMwMkQwNAkvKiBNYWlsYm94IDggRGF0YSBXb3JkIDEgWzMxOjE2XSBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIwOF9EQVRBMgkJMHhGRkMwMkQwOAkvKiBNYWlsYm94IDggRGF0YSBXb3JkIDIgWzQ3OjMyXSBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIwOF9EQVRBMwkJMHhGRkMwMkQwQwkvKiBNYWlsYm94IDggRGF0YSBXb3JkIDMgWzYzOjQ4XSBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIwOF9MRU5HVEgJCTB4RkZDMDJEMTAJLyogTWFpbGJveCA4IERhdGEgTGVuZ3RoIENvZGUgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJQ0FOX01CMDhfVElNRVNUQU1QCTB4RkZDMDJEMTQJLyogTWFpbGJveCA4IFRpbWUgU3RhbXAJVmFsdWUgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJQ0FOX01CMDhfSUQwCQkweEZGQzAyRDE4CS8qIE1haWxib3ggOCBJZGVudGlmaWVyCUxvdyBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIwOF9JRDEJCTB4RkZDMDJEMUMJLyogTWFpbGJveCA4IElkZW50aWZpZXIJSGlnaCBSZWdpc3RlciAqLwotCi0jZGVmaW5lCUNBTl9NQjA5X0RBVEEwCQkweEZGQzAyRDIwCS8qIE1haWxib3ggOSBEYXRhIFdvcmQgMCBbMTU6MF0JUmVnaXN0ZXIgKi8KLSNkZWZpbmUJQ0FOX01CMDlfREFUQTEJCTB4RkZDMDJEMjQJLyogTWFpbGJveCA5IERhdGEgV29yZCAxIFszMToxNl0gUmVnaXN0ZXIgKi8KLSNkZWZpbmUJQ0FOX01CMDlfREFUQTIJCTB4RkZDMDJEMjgJLyogTWFpbGJveCA5IERhdGEgV29yZCAyIFs0NzozMl0gUmVnaXN0ZXIgKi8KLSNkZWZpbmUJQ0FOX01CMDlfREFUQTMJCTB4RkZDMDJEMkMJLyogTWFpbGJveCA5IERhdGEgV29yZCAzIFs2Mzo0OF0gUmVnaXN0ZXIgKi8KLSNkZWZpbmUJQ0FOX01CMDlfTEVOR1RICQkweEZGQzAyRDMwCS8qIE1haWxib3ggOSBEYXRhIExlbmd0aCBDb2RlIFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjA5X1RJTUVTVEFNUAkweEZGQzAyRDM0CS8qIE1haWxib3ggOSBUaW1lIFN0YW1wCVZhbHVlIFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjA5X0lEMAkJMHhGRkMwMkQzOAkvKiBNYWlsYm94IDkgSWRlbnRpZmllcglMb3cgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJQ0FOX01CMDlfSUQxCQkweEZGQzAyRDNDCS8qIE1haWxib3ggOSBJZGVudGlmaWVyCUhpZ2ggUmVnaXN0ZXIgKi8KLQotI2RlZmluZQlDQU5fTUIxMF9EQVRBMAkJMHhGRkMwMkQ0MAkvKiBNYWlsYm94IDEwIERhdGEgV29yZAkwIFsxNTowXSBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIxMF9EQVRBMQkJMHhGRkMwMkQ0NAkvKiBNYWlsYm94IDEwIERhdGEgV29yZAkxIFszMToxNl0gUmVnaXN0ZXIgKi8KLSNkZWZpbmUJQ0FOX01CMTBfREFUQTIJCTB4RkZDMDJENDgJLyogTWFpbGJveCAxMCBEYXRhIFdvcmQJMiBbNDc6MzJdIFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjEwX0RBVEEzCQkweEZGQzAyRDRDCS8qIE1haWxib3ggMTAgRGF0YSBXb3JkCTMgWzYzOjQ4XSBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIxMF9MRU5HVEgJCTB4RkZDMDJENTAJLyogTWFpbGJveCAxMCBEYXRhIExlbmd0aCBDb2RlIFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjEwX1RJTUVTVEFNUAkweEZGQzAyRDU0CS8qIE1haWxib3ggMTAgVGltZSBTdGFtcCBWYWx1ZSBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIxMF9JRDAJCTB4RkZDMDJENTgJLyogTWFpbGJveCAxMCBJZGVudGlmaWVyIExvdyBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIxMF9JRDEJCTB4RkZDMDJENUMJLyogTWFpbGJveCAxMCBJZGVudGlmaWVyIEhpZ2ggUmVnaXN0ZXIgKi8KLQotI2RlZmluZQlDQU5fTUIxMV9EQVRBMAkJMHhGRkMwMkQ2MAkvKiBNYWlsYm94IDExIERhdGEgV29yZAkwIFsxNTowXSBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIxMV9EQVRBMQkJMHhGRkMwMkQ2NAkvKiBNYWlsYm94IDExIERhdGEgV29yZAkxIFszMToxNl0gUmVnaXN0ZXIgKi8KLSNkZWZpbmUJQ0FOX01CMTFfREFUQTIJCTB4RkZDMDJENjgJLyogTWFpbGJveCAxMSBEYXRhIFdvcmQJMiBbNDc6MzJdIFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjExX0RBVEEzCQkweEZGQzAyRDZDCS8qIE1haWxib3ggMTEgRGF0YSBXb3JkCTMgWzYzOjQ4XSBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIxMV9MRU5HVEgJCTB4RkZDMDJENzAJLyogTWFpbGJveCAxMSBEYXRhIExlbmd0aCBDb2RlIFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjExX1RJTUVTVEFNUAkweEZGQzAyRDc0CS8qIE1haWxib3ggMTEgVGltZSBTdGFtcCBWYWx1ZSBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIxMV9JRDAJCTB4RkZDMDJENzgJLyogTWFpbGJveCAxMSBJZGVudGlmaWVyIExvdyBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIxMV9JRDEJCTB4RkZDMDJEN0MJLyogTWFpbGJveCAxMSBJZGVudGlmaWVyIEhpZ2ggUmVnaXN0ZXIgKi8KLQotI2RlZmluZQlDQU5fTUIxMl9EQVRBMAkJMHhGRkMwMkQ4MAkvKiBNYWlsYm94IDEyIERhdGEgV29yZAkwIFsxNTowXSBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIxMl9EQVRBMQkJMHhGRkMwMkQ4NAkvKiBNYWlsYm94IDEyIERhdGEgV29yZAkxIFszMToxNl0gUmVnaXN0ZXIgKi8KLSNkZWZpbmUJQ0FOX01CMTJfREFUQTIJCTB4RkZDMDJEODgJLyogTWFpbGJveCAxMiBEYXRhIFdvcmQJMiBbNDc6MzJdIFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjEyX0RBVEEzCQkweEZGQzAyRDhDCS8qIE1haWxib3ggMTIgRGF0YSBXb3JkCTMgWzYzOjQ4XSBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIxMl9MRU5HVEgJCTB4RkZDMDJEOTAJLyogTWFpbGJveCAxMiBEYXRhIExlbmd0aCBDb2RlIFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjEyX1RJTUVTVEFNUAkweEZGQzAyRDk0CS8qIE1haWxib3ggMTIgVGltZSBTdGFtcCBWYWx1ZSBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIxMl9JRDAJCTB4RkZDMDJEOTgJLyogTWFpbGJveCAxMiBJZGVudGlmaWVyIExvdyBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIxMl9JRDEJCTB4RkZDMDJEOUMJLyogTWFpbGJveCAxMiBJZGVudGlmaWVyIEhpZ2ggUmVnaXN0ZXIgKi8KLQotI2RlZmluZQlDQU5fTUIxM19EQVRBMAkJMHhGRkMwMkRBMAkvKiBNYWlsYm94IDEzIERhdGEgV29yZAkwIFsxNTowXSBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIxM19EQVRBMQkJMHhGRkMwMkRBNAkvKiBNYWlsYm94IDEzIERhdGEgV29yZAkxIFszMToxNl0gUmVnaXN0ZXIgKi8KLSNkZWZpbmUJQ0FOX01CMTNfREFUQTIJCTB4RkZDMDJEQTgJLyogTWFpbGJveCAxMyBEYXRhIFdvcmQJMiBbNDc6MzJdIFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjEzX0RBVEEzCQkweEZGQzAyREFDCS8qIE1haWxib3ggMTMgRGF0YSBXb3JkCTMgWzYzOjQ4XSBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIxM19MRU5HVEgJCTB4RkZDMDJEQjAJLyogTWFpbGJveCAxMyBEYXRhIExlbmd0aCBDb2RlIFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjEzX1RJTUVTVEFNUAkweEZGQzAyREI0CS8qIE1haWxib3ggMTMgVGltZSBTdGFtcCBWYWx1ZSBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIxM19JRDAJCTB4RkZDMDJEQjgJLyogTWFpbGJveCAxMyBJZGVudGlmaWVyIExvdyBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIxM19JRDEJCTB4RkZDMDJEQkMJLyogTWFpbGJveCAxMyBJZGVudGlmaWVyIEhpZ2ggUmVnaXN0ZXIgKi8KLQotI2RlZmluZQlDQU5fTUIxNF9EQVRBMAkJMHhGRkMwMkRDMAkvKiBNYWlsYm94IDE0IERhdGEgV29yZAkwIFsxNTowXSBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIxNF9EQVRBMQkJMHhGRkMwMkRDNAkvKiBNYWlsYm94IDE0IERhdGEgV29yZAkxIFszMToxNl0gUmVnaXN0ZXIgKi8KLSNkZWZpbmUJQ0FOX01CMTRfREFUQTIJCTB4RkZDMDJEQzgJLyogTWFpbGJveCAxNCBEYXRhIFdvcmQJMiBbNDc6MzJdIFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjE0X0RBVEEzCQkweEZGQzAyRENDCS8qIE1haWxib3ggMTQgRGF0YSBXb3JkCTMgWzYzOjQ4XSBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIxNF9MRU5HVEgJCTB4RkZDMDJERDAJLyogTWFpbGJveCAxNCBEYXRhIExlbmd0aCBDb2RlIFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjE0X1RJTUVTVEFNUAkweEZGQzAyREQ0CS8qIE1haWxib3ggMTQgVGltZSBTdGFtcCBWYWx1ZSBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIxNF9JRDAJCTB4RkZDMDJERDgJLyogTWFpbGJveCAxNCBJZGVudGlmaWVyIExvdyBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIxNF9JRDEJCTB4RkZDMDJEREMJLyogTWFpbGJveCAxNCBJZGVudGlmaWVyIEhpZ2ggUmVnaXN0ZXIgKi8KLQotI2RlZmluZQlDQU5fTUIxNV9EQVRBMAkJMHhGRkMwMkRFMAkvKiBNYWlsYm94IDE1IERhdGEgV29yZAkwIFsxNTowXSBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIxNV9EQVRBMQkJMHhGRkMwMkRFNAkvKiBNYWlsYm94IDE1IERhdGEgV29yZAkxIFszMToxNl0gUmVnaXN0ZXIgKi8KLSNkZWZpbmUJQ0FOX01CMTVfREFUQTIJCTB4RkZDMDJERTgJLyogTWFpbGJveCAxNSBEYXRhIFdvcmQJMiBbNDc6MzJdIFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjE1X0RBVEEzCQkweEZGQzAyREVDCS8qIE1haWxib3ggMTUgRGF0YSBXb3JkCTMgWzYzOjQ4XSBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIxNV9MRU5HVEgJCTB4RkZDMDJERjAJLyogTWFpbGJveCAxNSBEYXRhIExlbmd0aCBDb2RlIFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjE1X1RJTUVTVEFNUAkweEZGQzAyREY0CS8qIE1haWxib3ggMTUgVGltZSBTdGFtcCBWYWx1ZSBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIxNV9JRDAJCTB4RkZDMDJERjgJLyogTWFpbGJveCAxNSBJZGVudGlmaWVyIExvdyBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIxNV9JRDEJCTB4RkZDMDJERkMJLyogTWFpbGJveCAxNSBJZGVudGlmaWVyIEhpZ2ggUmVnaXN0ZXIgKi8KLQotI2RlZmluZQlDQU5fTUIxNl9EQVRBMAkJMHhGRkMwMkUwMAkvKiBNYWlsYm94IDE2IERhdGEgV29yZAkwIFsxNTowXSBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIxNl9EQVRBMQkJMHhGRkMwMkUwNAkvKiBNYWlsYm94IDE2IERhdGEgV29yZAkxIFszMToxNl0gUmVnaXN0ZXIgKi8KLSNkZWZpbmUJQ0FOX01CMTZfREFUQTIJCTB4RkZDMDJFMDgJLyogTWFpbGJveCAxNiBEYXRhIFdvcmQJMiBbNDc6MzJdIFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjE2X0RBVEEzCQkweEZGQzAyRTBDCS8qIE1haWxib3ggMTYgRGF0YSBXb3JkCTMgWzYzOjQ4XSBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIxNl9MRU5HVEgJCTB4RkZDMDJFMTAJLyogTWFpbGJveCAxNiBEYXRhIExlbmd0aCBDb2RlIFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjE2X1RJTUVTVEFNUAkweEZGQzAyRTE0CS8qIE1haWxib3ggMTYgVGltZSBTdGFtcCBWYWx1ZSBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIxNl9JRDAJCTB4RkZDMDJFMTgJLyogTWFpbGJveCAxNiBJZGVudGlmaWVyIExvdyBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIxNl9JRDEJCTB4RkZDMDJFMUMJLyogTWFpbGJveCAxNiBJZGVudGlmaWVyIEhpZ2ggUmVnaXN0ZXIgKi8KLQotI2RlZmluZQlDQU5fTUIxN19EQVRBMAkJMHhGRkMwMkUyMAkvKiBNYWlsYm94IDE3IERhdGEgV29yZAkwIFsxNTowXSBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIxN19EQVRBMQkJMHhGRkMwMkUyNAkvKiBNYWlsYm94IDE3IERhdGEgV29yZAkxIFszMToxNl0gUmVnaXN0ZXIgKi8KLSNkZWZpbmUJQ0FOX01CMTdfREFUQTIJCTB4RkZDMDJFMjgJLyogTWFpbGJveCAxNyBEYXRhIFdvcmQJMiBbNDc6MzJdIFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjE3X0RBVEEzCQkweEZGQzAyRTJDCS8qIE1haWxib3ggMTcgRGF0YSBXb3JkCTMgWzYzOjQ4XSBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIxN19MRU5HVEgJCTB4RkZDMDJFMzAJLyogTWFpbGJveCAxNyBEYXRhIExlbmd0aCBDb2RlIFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjE3X1RJTUVTVEFNUAkweEZGQzAyRTM0CS8qIE1haWxib3ggMTcgVGltZSBTdGFtcCBWYWx1ZSBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIxN19JRDAJCTB4RkZDMDJFMzgJLyogTWFpbGJveCAxNyBJZGVudGlmaWVyIExvdyBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIxN19JRDEJCTB4RkZDMDJFM0MJLyogTWFpbGJveCAxNyBJZGVudGlmaWVyIEhpZ2ggUmVnaXN0ZXIgKi8KLQotI2RlZmluZQlDQU5fTUIxOF9EQVRBMAkJMHhGRkMwMkU0MAkvKiBNYWlsYm94IDE4IERhdGEgV29yZAkwIFsxNTowXSBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIxOF9EQVRBMQkJMHhGRkMwMkU0NAkvKiBNYWlsYm94IDE4IERhdGEgV29yZAkxIFszMToxNl0gUmVnaXN0ZXIgKi8KLSNkZWZpbmUJQ0FOX01CMThfREFUQTIJCTB4RkZDMDJFNDgJLyogTWFpbGJveCAxOCBEYXRhIFdvcmQJMiBbNDc6MzJdIFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjE4X0RBVEEzCQkweEZGQzAyRTRDCS8qIE1haWxib3ggMTggRGF0YSBXb3JkCTMgWzYzOjQ4XSBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIxOF9MRU5HVEgJCTB4RkZDMDJFNTAJLyogTWFpbGJveCAxOCBEYXRhIExlbmd0aCBDb2RlIFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjE4X1RJTUVTVEFNUAkweEZGQzAyRTU0CS8qIE1haWxib3ggMTggVGltZSBTdGFtcCBWYWx1ZSBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIxOF9JRDAJCTB4RkZDMDJFNTgJLyogTWFpbGJveCAxOCBJZGVudGlmaWVyIExvdyBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIxOF9JRDEJCTB4RkZDMDJFNUMJLyogTWFpbGJveCAxOCBJZGVudGlmaWVyIEhpZ2ggUmVnaXN0ZXIgKi8KLQotI2RlZmluZQlDQU5fTUIxOV9EQVRBMAkJMHhGRkMwMkU2MAkvKiBNYWlsYm94IDE5IERhdGEgV29yZAkwIFsxNTowXSBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIxOV9EQVRBMQkJMHhGRkMwMkU2NAkvKiBNYWlsYm94IDE5IERhdGEgV29yZAkxIFszMToxNl0gUmVnaXN0ZXIgKi8KLSNkZWZpbmUJQ0FOX01CMTlfREFUQTIJCTB4RkZDMDJFNjgJLyogTWFpbGJveCAxOSBEYXRhIFdvcmQJMiBbNDc6MzJdIFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjE5X0RBVEEzCQkweEZGQzAyRTZDCS8qIE1haWxib3ggMTkgRGF0YSBXb3JkCTMgWzYzOjQ4XSBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIxOV9MRU5HVEgJCTB4RkZDMDJFNzAJLyogTWFpbGJveCAxOSBEYXRhIExlbmd0aCBDb2RlIFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjE5X1RJTUVTVEFNUAkweEZGQzAyRTc0CS8qIE1haWxib3ggMTkgVGltZSBTdGFtcCBWYWx1ZSBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIxOV9JRDAJCTB4RkZDMDJFNzgJLyogTWFpbGJveCAxOSBJZGVudGlmaWVyIExvdyBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIxOV9JRDEJCTB4RkZDMDJFN0MJLyogTWFpbGJveCAxOSBJZGVudGlmaWVyIEhpZ2ggUmVnaXN0ZXIgKi8KLQotI2RlZmluZQlDQU5fTUIyMF9EQVRBMAkJMHhGRkMwMkU4MAkvKiBNYWlsYm94IDIwIERhdGEgV29yZAkwIFsxNTowXSBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIyMF9EQVRBMQkJMHhGRkMwMkU4NAkvKiBNYWlsYm94IDIwIERhdGEgV29yZAkxIFszMToxNl0gUmVnaXN0ZXIgKi8KLSNkZWZpbmUJQ0FOX01CMjBfREFUQTIJCTB4RkZDMDJFODgJLyogTWFpbGJveCAyMCBEYXRhIFdvcmQJMiBbNDc6MzJdIFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjIwX0RBVEEzCQkweEZGQzAyRThDCS8qIE1haWxib3ggMjAgRGF0YSBXb3JkCTMgWzYzOjQ4XSBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIyMF9MRU5HVEgJCTB4RkZDMDJFOTAJLyogTWFpbGJveCAyMCBEYXRhIExlbmd0aCBDb2RlIFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjIwX1RJTUVTVEFNUAkweEZGQzAyRTk0CS8qIE1haWxib3ggMjAgVGltZSBTdGFtcCBWYWx1ZSBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIyMF9JRDAJCTB4RkZDMDJFOTgJLyogTWFpbGJveCAyMCBJZGVudGlmaWVyIExvdyBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIyMF9JRDEJCTB4RkZDMDJFOUMJLyogTWFpbGJveCAyMCBJZGVudGlmaWVyIEhpZ2ggUmVnaXN0ZXIgKi8KLQotI2RlZmluZQlDQU5fTUIyMV9EQVRBMAkJMHhGRkMwMkVBMAkvKiBNYWlsYm94IDIxIERhdGEgV29yZAkwIFsxNTowXSBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIyMV9EQVRBMQkJMHhGRkMwMkVBNAkvKiBNYWlsYm94IDIxIERhdGEgV29yZAkxIFszMToxNl0gUmVnaXN0ZXIgKi8KLSNkZWZpbmUJQ0FOX01CMjFfREFUQTIJCTB4RkZDMDJFQTgJLyogTWFpbGJveCAyMSBEYXRhIFdvcmQJMiBbNDc6MzJdIFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjIxX0RBVEEzCQkweEZGQzAyRUFDCS8qIE1haWxib3ggMjEgRGF0YSBXb3JkCTMgWzYzOjQ4XSBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIyMV9MRU5HVEgJCTB4RkZDMDJFQjAJLyogTWFpbGJveCAyMSBEYXRhIExlbmd0aCBDb2RlIFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjIxX1RJTUVTVEFNUAkweEZGQzAyRUI0CS8qIE1haWxib3ggMjEgVGltZSBTdGFtcCBWYWx1ZSBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIyMV9JRDAJCTB4RkZDMDJFQjgJLyogTWFpbGJveCAyMSBJZGVudGlmaWVyIExvdyBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIyMV9JRDEJCTB4RkZDMDJFQkMJLyogTWFpbGJveCAyMSBJZGVudGlmaWVyIEhpZ2ggUmVnaXN0ZXIgKi8KLQotI2RlZmluZQlDQU5fTUIyMl9EQVRBMAkJMHhGRkMwMkVDMAkvKiBNYWlsYm94IDIyIERhdGEgV29yZAkwIFsxNTowXSBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIyMl9EQVRBMQkJMHhGRkMwMkVDNAkvKiBNYWlsYm94IDIyIERhdGEgV29yZAkxIFszMToxNl0gUmVnaXN0ZXIgKi8KLSNkZWZpbmUJQ0FOX01CMjJfREFUQTIJCTB4RkZDMDJFQzgJLyogTWFpbGJveCAyMiBEYXRhIFdvcmQJMiBbNDc6MzJdIFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjIyX0RBVEEzCQkweEZGQzAyRUNDCS8qIE1haWxib3ggMjIgRGF0YSBXb3JkCTMgWzYzOjQ4XSBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIyMl9MRU5HVEgJCTB4RkZDMDJFRDAJLyogTWFpbGJveCAyMiBEYXRhIExlbmd0aCBDb2RlIFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjIyX1RJTUVTVEFNUAkweEZGQzAyRUQ0CS8qIE1haWxib3ggMjIgVGltZSBTdGFtcCBWYWx1ZSBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIyMl9JRDAJCTB4RkZDMDJFRDgJLyogTWFpbGJveCAyMiBJZGVudGlmaWVyIExvdyBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIyMl9JRDEJCTB4RkZDMDJFREMJLyogTWFpbGJveCAyMiBJZGVudGlmaWVyIEhpZ2ggUmVnaXN0ZXIgKi8KLQotI2RlZmluZQlDQU5fTUIyM19EQVRBMAkJMHhGRkMwMkVFMAkvKiBNYWlsYm94IDIzIERhdGEgV29yZAkwIFsxNTowXSBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIyM19EQVRBMQkJMHhGRkMwMkVFNAkvKiBNYWlsYm94IDIzIERhdGEgV29yZAkxIFszMToxNl0gUmVnaXN0ZXIgKi8KLSNkZWZpbmUJQ0FOX01CMjNfREFUQTIJCTB4RkZDMDJFRTgJLyogTWFpbGJveCAyMyBEYXRhIFdvcmQJMiBbNDc6MzJdIFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjIzX0RBVEEzCQkweEZGQzAyRUVDCS8qIE1haWxib3ggMjMgRGF0YSBXb3JkCTMgWzYzOjQ4XSBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIyM19MRU5HVEgJCTB4RkZDMDJFRjAJLyogTWFpbGJveCAyMyBEYXRhIExlbmd0aCBDb2RlIFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjIzX1RJTUVTVEFNUAkweEZGQzAyRUY0CS8qIE1haWxib3ggMjMgVGltZSBTdGFtcCBWYWx1ZSBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIyM19JRDAJCTB4RkZDMDJFRjgJLyogTWFpbGJveCAyMyBJZGVudGlmaWVyIExvdyBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIyM19JRDEJCTB4RkZDMDJFRkMJLyogTWFpbGJveCAyMyBJZGVudGlmaWVyIEhpZ2ggUmVnaXN0ZXIgKi8KLQotI2RlZmluZQlDQU5fTUIyNF9EQVRBMAkJMHhGRkMwMkYwMAkvKiBNYWlsYm94IDI0IERhdGEgV29yZAkwIFsxNTowXSBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIyNF9EQVRBMQkJMHhGRkMwMkYwNAkvKiBNYWlsYm94IDI0IERhdGEgV29yZAkxIFszMToxNl0gUmVnaXN0ZXIgKi8KLSNkZWZpbmUJQ0FOX01CMjRfREFUQTIJCTB4RkZDMDJGMDgJLyogTWFpbGJveCAyNCBEYXRhIFdvcmQJMiBbNDc6MzJdIFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjI0X0RBVEEzCQkweEZGQzAyRjBDCS8qIE1haWxib3ggMjQgRGF0YSBXb3JkCTMgWzYzOjQ4XSBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIyNF9MRU5HVEgJCTB4RkZDMDJGMTAJLyogTWFpbGJveCAyNCBEYXRhIExlbmd0aCBDb2RlIFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjI0X1RJTUVTVEFNUAkweEZGQzAyRjE0CS8qIE1haWxib3ggMjQgVGltZSBTdGFtcCBWYWx1ZSBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIyNF9JRDAJCTB4RkZDMDJGMTgJLyogTWFpbGJveCAyNCBJZGVudGlmaWVyIExvdyBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIyNF9JRDEJCTB4RkZDMDJGMUMJLyogTWFpbGJveCAyNCBJZGVudGlmaWVyIEhpZ2ggUmVnaXN0ZXIgKi8KLQotI2RlZmluZQlDQU5fTUIyNV9EQVRBMAkJMHhGRkMwMkYyMAkvKiBNYWlsYm94IDI1IERhdGEgV29yZAkwIFsxNTowXSBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIyNV9EQVRBMQkJMHhGRkMwMkYyNAkvKiBNYWlsYm94IDI1IERhdGEgV29yZAkxIFszMToxNl0gUmVnaXN0ZXIgKi8KLSNkZWZpbmUJQ0FOX01CMjVfREFUQTIJCTB4RkZDMDJGMjgJLyogTWFpbGJveCAyNSBEYXRhIFdvcmQJMiBbNDc6MzJdIFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjI1X0RBVEEzCQkweEZGQzAyRjJDCS8qIE1haWxib3ggMjUgRGF0YSBXb3JkCTMgWzYzOjQ4XSBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIyNV9MRU5HVEgJCTB4RkZDMDJGMzAJLyogTWFpbGJveCAyNSBEYXRhIExlbmd0aCBDb2RlIFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjI1X1RJTUVTVEFNUAkweEZGQzAyRjM0CS8qIE1haWxib3ggMjUgVGltZSBTdGFtcCBWYWx1ZSBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIyNV9JRDAJCTB4RkZDMDJGMzgJLyogTWFpbGJveCAyNSBJZGVudGlmaWVyIExvdyBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIyNV9JRDEJCTB4RkZDMDJGM0MJLyogTWFpbGJveCAyNSBJZGVudGlmaWVyIEhpZ2ggUmVnaXN0ZXIgKi8KLQotI2RlZmluZQlDQU5fTUIyNl9EQVRBMAkJMHhGRkMwMkY0MAkvKiBNYWlsYm94IDI2IERhdGEgV29yZAkwIFsxNTowXSBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIyNl9EQVRBMQkJMHhGRkMwMkY0NAkvKiBNYWlsYm94IDI2IERhdGEgV29yZAkxIFszMToxNl0gUmVnaXN0ZXIgKi8KLSNkZWZpbmUJQ0FOX01CMjZfREFUQTIJCTB4RkZDMDJGNDgJLyogTWFpbGJveCAyNiBEYXRhIFdvcmQJMiBbNDc6MzJdIFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjI2X0RBVEEzCQkweEZGQzAyRjRDCS8qIE1haWxib3ggMjYgRGF0YSBXb3JkCTMgWzYzOjQ4XSBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIyNl9MRU5HVEgJCTB4RkZDMDJGNTAJLyogTWFpbGJveCAyNiBEYXRhIExlbmd0aCBDb2RlIFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjI2X1RJTUVTVEFNUAkweEZGQzAyRjU0CS8qIE1haWxib3ggMjYgVGltZSBTdGFtcCBWYWx1ZSBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIyNl9JRDAJCTB4RkZDMDJGNTgJLyogTWFpbGJveCAyNiBJZGVudGlmaWVyIExvdyBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIyNl9JRDEJCTB4RkZDMDJGNUMJLyogTWFpbGJveCAyNiBJZGVudGlmaWVyIEhpZ2ggUmVnaXN0ZXIgKi8KLQotI2RlZmluZQlDQU5fTUIyN19EQVRBMAkJMHhGRkMwMkY2MAkvKiBNYWlsYm94IDI3IERhdGEgV29yZAkwIFsxNTowXSBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIyN19EQVRBMQkJMHhGRkMwMkY2NAkvKiBNYWlsYm94IDI3IERhdGEgV29yZAkxIFszMToxNl0gUmVnaXN0ZXIgKi8KLSNkZWZpbmUJQ0FOX01CMjdfREFUQTIJCTB4RkZDMDJGNjgJLyogTWFpbGJveCAyNyBEYXRhIFdvcmQJMiBbNDc6MzJdIFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjI3X0RBVEEzCQkweEZGQzAyRjZDCS8qIE1haWxib3ggMjcgRGF0YSBXb3JkCTMgWzYzOjQ4XSBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIyN19MRU5HVEgJCTB4RkZDMDJGNzAJLyogTWFpbGJveCAyNyBEYXRhIExlbmd0aCBDb2RlIFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjI3X1RJTUVTVEFNUAkweEZGQzAyRjc0CS8qIE1haWxib3ggMjcgVGltZSBTdGFtcCBWYWx1ZSBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIyN19JRDAJCTB4RkZDMDJGNzgJLyogTWFpbGJveCAyNyBJZGVudGlmaWVyIExvdyBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIyN19JRDEJCTB4RkZDMDJGN0MJLyogTWFpbGJveCAyNyBJZGVudGlmaWVyIEhpZ2ggUmVnaXN0ZXIgKi8KLQotI2RlZmluZQlDQU5fTUIyOF9EQVRBMAkJMHhGRkMwMkY4MAkvKiBNYWlsYm94IDI4IERhdGEgV29yZAkwIFsxNTowXSBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIyOF9EQVRBMQkJMHhGRkMwMkY4NAkvKiBNYWlsYm94IDI4IERhdGEgV29yZAkxIFszMToxNl0gUmVnaXN0ZXIgKi8KLSNkZWZpbmUJQ0FOX01CMjhfREFUQTIJCTB4RkZDMDJGODgJLyogTWFpbGJveCAyOCBEYXRhIFdvcmQJMiBbNDc6MzJdIFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjI4X0RBVEEzCQkweEZGQzAyRjhDCS8qIE1haWxib3ggMjggRGF0YSBXb3JkCTMgWzYzOjQ4XSBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIyOF9MRU5HVEgJCTB4RkZDMDJGOTAJLyogTWFpbGJveCAyOCBEYXRhIExlbmd0aCBDb2RlIFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjI4X1RJTUVTVEFNUAkweEZGQzAyRjk0CS8qIE1haWxib3ggMjggVGltZSBTdGFtcCBWYWx1ZSBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIyOF9JRDAJCTB4RkZDMDJGOTgJLyogTWFpbGJveCAyOCBJZGVudGlmaWVyIExvdyBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIyOF9JRDEJCTB4RkZDMDJGOUMJLyogTWFpbGJveCAyOCBJZGVudGlmaWVyIEhpZ2ggUmVnaXN0ZXIgKi8KLQotI2RlZmluZQlDQU5fTUIyOV9EQVRBMAkJMHhGRkMwMkZBMAkvKiBNYWlsYm94IDI5IERhdGEgV29yZAkwIFsxNTowXSBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIyOV9EQVRBMQkJMHhGRkMwMkZBNAkvKiBNYWlsYm94IDI5IERhdGEgV29yZAkxIFszMToxNl0gUmVnaXN0ZXIgKi8KLSNkZWZpbmUJQ0FOX01CMjlfREFUQTIJCTB4RkZDMDJGQTgJLyogTWFpbGJveCAyOSBEYXRhIFdvcmQJMiBbNDc6MzJdIFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjI5X0RBVEEzCQkweEZGQzAyRkFDCS8qIE1haWxib3ggMjkgRGF0YSBXb3JkCTMgWzYzOjQ4XSBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIyOV9MRU5HVEgJCTB4RkZDMDJGQjAJLyogTWFpbGJveCAyOSBEYXRhIExlbmd0aCBDb2RlIFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjI5X1RJTUVTVEFNUAkweEZGQzAyRkI0CS8qIE1haWxib3ggMjkgVGltZSBTdGFtcCBWYWx1ZSBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIyOV9JRDAJCTB4RkZDMDJGQjgJLyogTWFpbGJveCAyOSBJZGVudGlmaWVyIExvdyBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIyOV9JRDEJCTB4RkZDMDJGQkMJLyogTWFpbGJveCAyOSBJZGVudGlmaWVyIEhpZ2ggUmVnaXN0ZXIgKi8KLQotI2RlZmluZQlDQU5fTUIzMF9EQVRBMAkJMHhGRkMwMkZDMAkvKiBNYWlsYm94IDMwIERhdGEgV29yZAkwIFsxNTowXSBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIzMF9EQVRBMQkJMHhGRkMwMkZDNAkvKiBNYWlsYm94IDMwIERhdGEgV29yZAkxIFszMToxNl0gUmVnaXN0ZXIgKi8KLSNkZWZpbmUJQ0FOX01CMzBfREFUQTIJCTB4RkZDMDJGQzgJLyogTWFpbGJveCAzMCBEYXRhIFdvcmQJMiBbNDc6MzJdIFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjMwX0RBVEEzCQkweEZGQzAyRkNDCS8qIE1haWxib3ggMzAgRGF0YSBXb3JkCTMgWzYzOjQ4XSBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIzMF9MRU5HVEgJCTB4RkZDMDJGRDAJLyogTWFpbGJveCAzMCBEYXRhIExlbmd0aCBDb2RlIFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjMwX1RJTUVTVEFNUAkweEZGQzAyRkQ0CS8qIE1haWxib3ggMzAgVGltZSBTdGFtcCBWYWx1ZSBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIzMF9JRDAJCTB4RkZDMDJGRDgJLyogTWFpbGJveCAzMCBJZGVudGlmaWVyIExvdyBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIzMF9JRDEJCTB4RkZDMDJGREMJLyogTWFpbGJveCAzMCBJZGVudGlmaWVyIEhpZ2ggUmVnaXN0ZXIgKi8KLQotI2RlZmluZQlDQU5fTUIzMV9EQVRBMAkJMHhGRkMwMkZFMAkvKiBNYWlsYm94IDMxIERhdGEgV29yZAkwIFsxNTowXSBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIzMV9EQVRBMQkJMHhGRkMwMkZFNAkvKiBNYWlsYm94IDMxIERhdGEgV29yZAkxIFszMToxNl0gUmVnaXN0ZXIgKi8KLSNkZWZpbmUJQ0FOX01CMzFfREFUQTIJCTB4RkZDMDJGRTgJLyogTWFpbGJveCAzMSBEYXRhIFdvcmQJMiBbNDc6MzJdIFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjMxX0RBVEEzCQkweEZGQzAyRkVDCS8qIE1haWxib3ggMzEgRGF0YSBXb3JkCTMgWzYzOjQ4XSBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIzMV9MRU5HVEgJCTB4RkZDMDJGRjAJLyogTWFpbGJveCAzMSBEYXRhIExlbmd0aCBDb2RlIFJlZ2lzdGVyICovCi0jZGVmaW5lCUNBTl9NQjMxX1RJTUVTVEFNUAkweEZGQzAyRkY0CS8qIE1haWxib3ggMzEgVGltZSBTdGFtcCBWYWx1ZSBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIzMV9JRDAJCTB4RkZDMDJGRjgJLyogTWFpbGJveCAzMSBJZGVudGlmaWVyIExvdyBSZWdpc3RlciAqLwotI2RlZmluZQlDQU5fTUIzMV9JRDEJCTB4RkZDMDJGRkMJLyogTWFpbGJveCAzMSBJZGVudGlmaWVyIEhpZ2ggUmVnaXN0ZXIgKi8KLQotLyogQ0FOIE1haWxib3ggQXJlYSBNYWNyb3MgKi8KLSNkZWZpbmUJQ0FOX01CX0lEMSh4KQkJKENBTl9NQjAwX0lEMSsoKHgpKjB4MjApKQotI2RlZmluZQlDQU5fTUJfSUQwKHgpCQkoQ0FOX01CMDBfSUQwKygoeCkqMHgyMCkpCi0jZGVmaW5lCUNBTl9NQl9USU1FU1RBTVAoeCkJKENBTl9NQjAwX1RJTUVTVEFNUCsoKHgpKjB4MjApKQotI2RlZmluZQlDQU5fTUJfTEVOR1RIKHgpCShDQU5fTUIwMF9MRU5HVEgrKCh4KSoweDIwKSkKLSNkZWZpbmUJQ0FOX01CX0RBVEEzKHgpCQkoQ0FOX01CMDBfREFUQTMrKCh4KSoweDIwKSkKLSNkZWZpbmUJQ0FOX01CX0RBVEEyKHgpCQkoQ0FOX01CMDBfREFUQTIrKCh4KSoweDIwKSkKLSNkZWZpbmUJQ0FOX01CX0RBVEExKHgpCQkoQ0FOX01CMDBfREFUQTErKCh4KSoweDIwKSkKLSNkZWZpbmUJQ0FOX01CX0RBVEEwKHgpCQkoQ0FOX01CMDBfREFUQTArKCh4KSoweDIwKSkKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLS8qIFN5c3RlbSBNTVIgUmVnaXN0ZXIgQml0cyBhbmQJTWFjcm9zICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotCi0vKiBTV1JTVCBNYXNrICovCi0jZGVmaW5lCVNZU1RFTV9SRVNFVAkweDAwMDcJLyogSW5pdGlhdGVzIEEgU3lzdGVtIFNvZnR3YXJlIFJlc2V0ICovCi0jZGVmaW5lCURPVUJMRV9GQVVMVAkweDAwMDgJLyogQ29yZQlEb3VibGUgRmF1bHQgQ2F1c2VzIFJlc2V0ICovCi0jZGVmaW5lCVJFU0VUX0RPVUJMRQkweDIwMDAJLyogU1cgUmVzZXQgR2VuZXJhdGVkIEJ5IENvcmUgRG91YmxlLUZhdWx0ICovCi0jZGVmaW5lCVJFU0VUX1dET0cJCTB4NDAwMAkvKiBTVyBSZXNldCBHZW5lcmF0ZWQgQnkgV2F0Y2hkb2cgVGltZXIgKi8KLSNkZWZpbmUJUkVTRVRfU09GVFdBUkUJMHg4MDAwCS8qIFNXIFJlc2V0IE9jY3VycmVkIFNpbmNlIExhc3QJUmVhZCBPZglTV1JTVCAqLwotCi0vKiBTWVNDUiBNYXNrcwkJCQkJCQkJCQkJCQkgKi8KLSNkZWZpbmUJQk1PREUJCQkweDAwMDYJLyogQm9vdAlNb2RlIC0gTGF0Y2hlZCBEdXJpbmcgSFcgUmVzZXQgRnJvbSBNb2RlIFBpbnMgKi8KLSNkZWZpbmUJTk9CT09UCQkJMHgwMDEwCS8qIEV4ZWN1dGUgRnJvbQlMMSBvciBBU1lOQyBCYW5rIDAgV2hlbglCTU9ERSA9CTAgKi8KLQotCi0vKiAqKioqKioqKioqKioqICBTWVNURU0gSU5URVJSVVBUIENPTlRST0xMRVIgTUFTS1MgKioqKioqKioqKioqKioqKiogKi8KLQotLyogUGVyaXBoZXJhbCBNYXNrcyBGb3IJU0lDMF9JU1IsIFNJQzBfSVdSLCBTSUMwX0lNQVNLICovCi0jZGVmaW5lCVBMTF9XQUtFVVBfSVJRCQkweDAwMDAwMDAxCS8qIFBMTCBXYWtldXAgSW50ZXJydXB0CVJlcXVlc3QgKi8KLSNkZWZpbmUJRE1BQzBfRVJSX0lSUQkJMHgwMDAwMDAwMgkvKiBETUEgQ29udHJvbGxlciAwIEVycm9yIEludGVycnVwdCBSZXF1ZXN0ICovCi0jZGVmaW5lCVBQSV9FUlJfSVJRCQkweDAwMDAwMDA0CS8qIFBQSSBFcnJvciBJbnRlcnJ1cHQgUmVxdWVzdCAqLwotI2RlZmluZQlTUE9SVDBfRVJSX0lSUQkJMHgwMDAwMDAwOAkvKiBTUE9SVDAgRXJyb3IJSW50ZXJydXB0IFJlcXVlc3QgKi8KLSNkZWZpbmUJU1BPUlQxX0VSUl9JUlEJCTB4MDAwMDAwMTAJLyogU1BPUlQxIEVycm9yCUludGVycnVwdCBSZXF1ZXN0ICovCi0jZGVmaW5lCVNQSTBfRVJSX0lSUQkJMHgwMDAwMDAyMAkvKiBTUEkwCUVycm9yIEludGVycnVwdAlSZXF1ZXN0ICovCi0jZGVmaW5lCVVBUlQwX0VSUl9JUlEJCTB4MDAwMDAwNDAJLyogVUFSVDAgRXJyb3IgSW50ZXJydXB0IFJlcXVlc3QgKi8KLSNkZWZpbmUJUlRDX0lSUQkJCTB4MDAwMDAwODAJLyogUmVhbC1UaW1lIENsb2NrIEludGVycnVwdCBSZXF1ZXN0ICovCi0jZGVmaW5lCURNQTBfSVJRCQkweDAwMDAwMTAwCS8qIERNQSBDaGFubmVsIDAgKFBQSSkgSW50ZXJydXB0IFJlcXVlc3QgKi8KLSNkZWZpbmUJRE1BMV9JUlEJCTB4MDAwMDAyMDAJLyogRE1BIENoYW5uZWwgMSAoU1BPUlQwIFJYKSBJbnRlcnJ1cHQgUmVxdWVzdCAqLwotI2RlZmluZQlETUEyX0lSUQkJMHgwMDAwMDQwMAkvKiBETUEgQ2hhbm5lbCAyIChTUE9SVDAgVFgpIEludGVycnVwdCBSZXF1ZXN0ICovCi0jZGVmaW5lCURNQTNfSVJRCQkweDAwMDAwODAwCS8qIERNQSBDaGFubmVsIDMgKFNQT1JUMSBSWCkgSW50ZXJydXB0IFJlcXVlc3QgKi8KLSNkZWZpbmUJRE1BNF9JUlEJCTB4MDAwMDEwMDAJLyogRE1BIENoYW5uZWwgNCAoU1BPUlQxIFRYKSBJbnRlcnJ1cHQgUmVxdWVzdCAqLwotI2RlZmluZQlETUE1X0lSUQkJMHgwMDAwMjAwMAkvKiBETUEgQ2hhbm5lbCA1IChTUEkpIEludGVycnVwdCBSZXF1ZXN0ICovCi0jZGVmaW5lCURNQTZfSVJRCQkweDAwMDA0MDAwCS8qIERNQSBDaGFubmVsIDYgKFVBUlQgUlgpIEludGVycnVwdCBSZXF1ZXN0ICovCi0jZGVmaW5lCURNQTdfSVJRCQkweDAwMDA4MDAwCS8qIERNQSBDaGFubmVsIDcgKFVBUlQgVFgpIEludGVycnVwdCBSZXF1ZXN0ICovCi0jZGVmaW5lCVRJTUVSMF9JUlEJCTB4MDAwMTAwMDAJLyogVGltZXIgMCBJbnRlcnJ1cHQgUmVxdWVzdCAqLwotI2RlZmluZQlUSU1FUjFfSVJRCQkweDAwMDIwMDAwCS8qIFRpbWVyIDEgSW50ZXJydXB0IFJlcXVlc3QgKi8KLSNkZWZpbmUJVElNRVIyX0lSUQkJMHgwMDA0MDAwMAkvKiBUaW1lciAyIEludGVycnVwdCBSZXF1ZXN0ICovCi0jZGVmaW5lCVBGQV9JUlEJCQkweDAwMDgwMDAwCS8qIFByb2dyYW1tYWJsZQlGbGFnIEludGVycnVwdCBSZXF1ZXN0IEEgKi8KLSNkZWZpbmUJUEZCX0lSUQkJCTB4MDAxMDAwMDAJLyogUHJvZ3JhbW1hYmxlCUZsYWcgSW50ZXJydXB0IFJlcXVlc3QgQiAqLwotI2RlZmluZQlNRE1BMF8wX0lSUQkJMHgwMDIwMDAwMAkvKiBNZW1ETUEwIFN0cmVhbSAwIEludGVycnVwdCBSZXF1ZXN0ICovCi0jZGVmaW5lCU1ETUEwXzFfSVJRCQkweDAwNDAwMDAwCS8qIE1lbURNQTAgU3RyZWFtIDEgSW50ZXJydXB0IFJlcXVlc3QgKi8KLSNkZWZpbmUJV0RPR19JUlEJCTB4MDA4MDAwMDAJLyogU29mdHdhcmUgV2F0Y2hkb2cgVGltZXIgSW50ZXJydXB0IFJlcXVlc3QgKi8KLSNkZWZpbmUJRE1BQzFfRVJSX0lSUQkJMHgwMTAwMDAwMAkvKiBETUEgQ29udHJvbGxlciAxIEVycm9yIEludGVycnVwdCBSZXF1ZXN0ICovCi0jZGVmaW5lCVNQT1JUMl9FUlJfSVJRCQkweDAyMDAwMDAwCS8qIFNQT1JUMiBFcnJvcglJbnRlcnJ1cHQgUmVxdWVzdCAqLwotI2RlZmluZQlTUE9SVDNfRVJSX0lSUQkJMHgwNDAwMDAwMAkvKiBTUE9SVDMgRXJyb3IJSW50ZXJydXB0IFJlcXVlc3QgKi8KLSNkZWZpbmUJTVhWUl9TRF9JUlEJCTB4MDgwMDAwMDAJLyogTVhWUglTeW5jaHJvbm91cyBEYXRhIEludGVycnVwdCBSZXF1ZXN0ICovCi0jZGVmaW5lCVNQSTFfRVJSX0lSUQkJMHgxMDAwMDAwMAkvKiBTUEkxCUVycm9yIEludGVycnVwdAlSZXF1ZXN0ICovCi0jZGVmaW5lCVNQSTJfRVJSX0lSUQkJMHgyMDAwMDAwMAkvKiBTUEkyCUVycm9yIEludGVycnVwdAlSZXF1ZXN0ICovCi0jZGVmaW5lCVVBUlQxX0VSUl9JUlEJCTB4NDAwMDAwMDAJLyogVUFSVDEgRXJyb3IgSW50ZXJydXB0IFJlcXVlc3QgKi8KLSNkZWZpbmUJVUFSVDJfRVJSX0lSUQkJMHg4MDAwMDAwMAkvKiBVQVJUMiBFcnJvciBJbnRlcnJ1cHQgUmVxdWVzdCAqLwotCi0vKiB0aGUgZm9sbG93aW5nIGFyZSBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgKi8KLSNkZWZpbmUJRE1BMF9FUlJfSVJRCQlETUFDMF9FUlJfSVJRCi0jZGVmaW5lCURNQTFfRVJSX0lSUQkJRE1BQzFfRVJSX0lSUQotCi0KLS8qIFBlcmlwaGVyYWwgTWFza3MgRm9yCVNJQ19JU1IxLCBTSUNfSVdSMSwgU0lDX0lNQVNLMQkgKi8KLSNkZWZpbmUJQ0FOX0VSUl9JUlEJCQkweDAwMDAwMDAxCS8qIENBTiBFcnJvciBJbnRlcnJ1cHQgUmVxdWVzdCAqLwotI2RlZmluZQlETUE4X0lSUQkJCTB4MDAwMDAwMDIJLyogRE1BIENoYW5uZWwgOCAoU1BPUlQyIFJYKSBJbnRlcnJ1cHQgUmVxdWVzdCAqLwotI2RlZmluZQlETUE5X0lSUQkJCTB4MDAwMDAwMDQJLyogRE1BIENoYW5uZWwgOSAoU1BPUlQyIFRYKSBJbnRlcnJ1cHQgUmVxdWVzdCAqLwotI2RlZmluZQlETUExMF9JUlEJCQkweDAwMDAwMDA4CS8qIERNQSBDaGFubmVsIDEwIChTUE9SVDMgUlgpIEludGVycnVwdAlSZXF1ZXN0ICovCi0jZGVmaW5lCURNQTExX0lSUQkJCTB4MDAwMDAwMTAJLyogRE1BIENoYW5uZWwgMTEgKFNQT1JUMyBUWCkgSW50ZXJydXB0CVJlcXVlc3QgKi8KLSNkZWZpbmUJRE1BMTJfSVJRCQkJMHgwMDAwMDAyMAkvKiBETUEgQ2hhbm5lbCAxMiBJbnRlcnJ1cHQgUmVxdWVzdCAqLwotI2RlZmluZQlETUExM19JUlEJCQkweDAwMDAwMDQwCS8qIERNQSBDaGFubmVsIDEzIEludGVycnVwdCBSZXF1ZXN0ICovCi0jZGVmaW5lCURNQTE0X0lSUQkJCTB4MDAwMDAwODAJLyogRE1BIENoYW5uZWwgMTQgKFNQSTEpIEludGVycnVwdCBSZXF1ZXN0ICovCi0jZGVmaW5lCURNQTE1X0lSUQkJCTB4MDAwMDAxMDAJLyogRE1BIENoYW5uZWwgMTUgKFNQSTIpIEludGVycnVwdCBSZXF1ZXN0ICovCi0jZGVmaW5lCURNQTE2X0lSUQkJCTB4MDAwMDAyMDAJLyogRE1BIENoYW5uZWwgMTYgKFVBUlQxIFJYKSBJbnRlcnJ1cHQgUmVxdWVzdCAqLwotI2RlZmluZQlETUExN19JUlEJCQkweDAwMDAwNDAwCS8qIERNQSBDaGFubmVsIDE3IChVQVJUMSBUWCkgSW50ZXJydXB0IFJlcXVlc3QgKi8KLSNkZWZpbmUJRE1BMThfSVJRCQkJMHgwMDAwMDgwMAkvKiBETUEgQ2hhbm5lbCAxOCAoVUFSVDIgUlgpIEludGVycnVwdCBSZXF1ZXN0ICovCi0jZGVmaW5lCURNQTE5X0lSUQkJCTB4MDAwMDEwMDAJLyogRE1BIENoYW5uZWwgMTkgKFVBUlQyIFRYKSBJbnRlcnJ1cHQgUmVxdWVzdCAqLwotI2RlZmluZQlUV0kwX0lSUQkJCTB4MDAwMDIwMDAJLyogVFdJMAlJbnRlcnJ1cHQgUmVxdWVzdCAqLwotI2RlZmluZQlUV0kxX0lSUQkJCTB4MDAwMDQwMDAJLyogVFdJMQlJbnRlcnJ1cHQgUmVxdWVzdCAqLwotI2RlZmluZQlDQU5fUlhfSVJRCQkJMHgwMDAwODAwMAkvKiBDQU4gUmVjZWl2ZSBJbnRlcnJ1cHQgUmVxdWVzdCAqLwotI2RlZmluZQlDQU5fVFhfSVJRCQkJMHgwMDAxMDAwMAkvKiBDQU4gVHJhbnNtaXQJSW50ZXJydXB0IFJlcXVlc3QgKi8KLSNkZWZpbmUJTURNQTFfMF9JUlEJCQkweDAwMDIwMDAwCS8qIE1lbURNQTEgU3RyZWFtIDAgSW50ZXJydXB0IFJlcXVlc3QgKi8KLSNkZWZpbmUJTURNQTFfMV9JUlEJCQkweDAwMDQwMDAwCS8qIE1lbURNQTEgU3RyZWFtIDEgSW50ZXJydXB0IFJlcXVlc3QgKi8KLSNkZWZpbmUJTVhWUl9TVEFUX0lSUQkJCTB4MDAwODAwMDAJLyogTVhWUglTdGF0dXMgSW50ZXJydXB0IFJlcXVlc3QgKi8KLSNkZWZpbmUJTVhWUl9DTV9JUlEJCQkweDAwMTAwMDAwCS8qIE1YVlIJQ29udHJvbAlNZXNzYWdlCUludGVycnVwdCBSZXF1ZXN0ICovCi0jZGVmaW5lCU1YVlJfQVBfSVJRCQkJMHgwMDIwMDAwMAkvKiBNWFZSCUFzeW5jaHJvbm91cyBQYWNrZXQgSW50ZXJydXB0ICovCi0KLS8qIHRoZSBmb2xsb3dpbmcgYXJlIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSAqLwotI2RlZmluZQlNRE1BMF9JUlEJCU1ETUExXzBfSVJRCi0jZGVmaW5lCU1ETUExX0lSUQkJTURNQTFfMV9JUlEKLQotI2lmZGVmIF9NSVNSQV9SVUxFUwotI2RlZmluZQlfTUYxNSAweEZ1Ci0jZGVmaW5lCV9NRjcgN3UKLSNlbHNlCi0jZGVmaW5lCV9NRjE1IDB4RgotI2RlZmluZQlfTUY3IDcKLSNlbmRpZiAvKiBfTUlTUkFfUlVMRVMgKi8KLQotLyogU0lDX0lNQVNLeCBNYXNrcwkJCQkJCQkJCQkJICovCi0jZGVmaW5lCVNJQ19VTk1BU0tfQUxMCTB4MDAwMDAwMDAJCQkJCS8qIFVubWFzayBhbGwgcGVyaXBoZXJhbCBpbnRlcnJ1cHRzICovCi0jZGVmaW5lCVNJQ19NQVNLX0FMTAkweEZGRkZGRkZGCQkJCQkvKiBNYXNrCWFsbCBwZXJpcGhlcmFsIGludGVycnVwdHMgKi8KLSNpZmRlZiBfTUlTUkFfUlVMRVMKLSNkZWZpbmUJU0lDX01BU0soeCkJCSgxIDw8ICgoeCkmMHgxRnUpKQkJCQkJLyogTWFzawlQZXJpcGhlcmFsICN4IGludGVycnVwdCAqLwotI2RlZmluZQlTSUNfVU5NQVNLKHgpCSgweEZGRkZGRkZGdSBeICgxIDw8ICgoeCkmMHgxRnUpKSkJLyogVW5tYXNrIFBlcmlwaGVyYWwgI3gJaW50ZXJydXB0ICovCi0jZWxzZQotI2RlZmluZQlTSUNfTUFTSyh4KQkJKDEgPDwgKCh4KSYweDFGKSkJCQkJCS8qIE1hc2sJUGVyaXBoZXJhbCAjeCBpbnRlcnJ1cHQgKi8KLSNkZWZpbmUJU0lDX1VOTUFTSyh4KQkoMHhGRkZGRkZGRiBeICgxIDw8ICgoeCkmMHgxRikpKQkvKiBVbm1hc2sgUGVyaXBoZXJhbCAjeAlpbnRlcnJ1cHQgKi8KLSNlbmRpZiAvKiBfTUlTUkFfUlVMRVMgKi8KLQotLyogU0lDX0lXUnggTWFza3MJCQkJCQkJCQkJCSAqLwotI2RlZmluZQlJV1JfRElTQUJMRV9BTEwJMHgwMDAwMDAwMAkJCQkJLyogV2FrZXVwIERpc2FibGUgYWxsIHBlcmlwaGVyYWxzICovCi0jZGVmaW5lCUlXUl9FTkFCTEVfQUxMCTB4RkZGRkZGRkYJCQkJCS8qIFdha2V1cCBFbmFibGUgYWxsIHBlcmlwaGVyYWxzICovCi0jaWZkZWYgX01JU1JBX1JVTEVTCi0jZGVmaW5lCUlXUl9FTkFCTEUoeCkJKDEgPDwgKCh4KSYweDFGdSkpCQkJCQkvKiBXYWtldXAgRW5hYmxlIFBlcmlwaGVyYWwgI3ggKi8KLSNkZWZpbmUJSVdSX0RJU0FCTEUoeCkJKDB4RkZGRkZGRkZ1IF4gKDEgPDwgKCh4KSYweDFGdSkpKQkvKiBXYWtldXAgRGlzYWJsZSBQZXJpcGhlcmFsICN4ICovCi0jZWxzZQotI2RlZmluZQlJV1JfRU5BQkxFKHgpCSgxIDw8ICgoeCkmMHgxRikpCQkJCQkvKiBXYWtldXAgRW5hYmxlIFBlcmlwaGVyYWwgI3ggKi8KLSNkZWZpbmUJSVdSX0RJU0FCTEUoeCkJKDB4RkZGRkZGRkYgXiAoMSA8PCAoKHgpJjB4MUYpKSkJLyogV2FrZXVwIERpc2FibGUgUGVyaXBoZXJhbCAjeCAqLwotI2VuZGlmIC8qIF9NSVNSQV9SVUxFUyAqLwotCi0KLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqIFVBUlQgQ09OVFJPTExFUiBNQVNLUyAqKioqKioqKioqKioqKioqKioqKioqICovCi0vKiBVQVJUeF9MQ1IgUmVnaXN0ZXIgKi8KLSNpZmRlZiBfTUlTUkFfUlVMRVMKLSNkZWZpbmUJV0xTKHgpCQkoKCh4KS01dSkgJiAweDAzdSkJLyogV29yZAlMZW5ndGggU2VsZWN0ICovCi0jZWxzZQotI2RlZmluZQlXTFMoeCkJCSgoKHgpLTUpICYgMHgwMykJLyogV29yZAlMZW5ndGggU2VsZWN0ICovCi0jZW5kaWYgLyogX01JU1JBX1JVTEVTICovCi0jZGVmaW5lCVNUQgkJCTB4MDQJCQkJLyogU3RvcAlCaXRzICovCi0jZGVmaW5lCVBFTgkJCTB4MDgJCQkJLyogUGFyaXR5IEVuYWJsZSAqLwotI2RlZmluZQlFUFMJCQkweDEwCQkJCS8qIEV2ZW4JUGFyaXR5IFNlbGVjdCAqLwotI2RlZmluZQlTVFAJCQkweDIwCQkJCS8qIFN0aWNrIFBhcml0eSAqLwotI2RlZmluZQlTQgkJCTB4NDAJCQkJLyogU2V0IEJyZWFrICovCi0jZGVmaW5lCURMQUIJCTB4ODAJCQkJLyogRGl2aXNvciBMYXRjaCBBY2Nlc3MgKi8KLQotI2RlZmluZQlETEFCX1AJCTB4MDcKLSNkZWZpbmUJU0JfUAkJMHgwNgotI2RlZmluZQlTVFBfUAkJMHgwNQotI2RlZmluZQlFUFNfUAkJMHgwNAotI2RlZmluZQlQRU5fUAkJMHgwMwotI2RlZmluZQlTVEJfUAkJMHgwMgotI2RlZmluZQlXTFNfUDEJCTB4MDEKLSNkZWZpbmUJV0xTX1AwCQkweDAwCi0KLS8qIFVBUlR4X01DUiBSZWdpc3RlciAqLwotI2RlZmluZQlMT09QX0VOQQkweDEwCS8qIExvb3BiYWNrIE1vZGUgRW5hYmxlICovCi0jZGVmaW5lCUxPT1BfRU5BX1AJMHgwNAotLyogRGVwcmVjYXRlZCBVQVJUeF9NQ1IJTWFzawkJCSAqLwotCi0vKiBVQVJUeF9MU1IgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJRFIJCQkweDAxCS8qIERhdGEJUmVhZHkgKi8KLSNkZWZpbmUJT0UJCQkweDAyCS8qIE92ZXJydW4gRXJyb3IgKi8KLSNkZWZpbmUJUEUJCQkweDA0CS8qIFBhcml0eSBFcnJvciAqLwotI2RlZmluZQlGRQkJCTB4MDgJLyogRnJhbWluZyBFcnJvciAqLwotI2RlZmluZQlCSQkJCTB4MTAJLyogQnJlYWsgSW50ZXJydXB0ICovCi0jZGVmaW5lCVRIUkUJCTB4MjAJLyogVEhSIEVtcHR5ICovCi0jZGVmaW5lCVRFTVQJCTB4NDAJLyogVFNSIGFuZCBVQVJUX1RIUiBFbXB0eSAqLwotCi0jZGVmaW5lCVRFTVBfUAkJMHgwNgotI2RlZmluZQlUSFJFX1AJCTB4MDUKLSNkZWZpbmUJQklfUAkJMHgwNAotI2RlZmluZQlGRV9QCQkweDAzCi0jZGVmaW5lCVBFX1AJCTB4MDIKLSNkZWZpbmUJT0VfUAkJMHgwMQotI2RlZmluZQlEUl9QCQkweDAwCi0KLS8qIFVBUlR4X0lFUiBSZWdpc3RlciAqLwotI2RlZmluZQlFUkJGSQkJMHgwMQkJLyogRW5hYmxlIFJlY2VpdmUgQnVmZmVyIEZ1bGwgSW50ZXJydXB0ICovCi0jZGVmaW5lCUVUQkVJCQkweDAyCQkvKiBFbmFibGUgVHJhbnNtaXQgQnVmZmVyIEVtcHR5CUludGVycnVwdCAqLwotI2RlZmluZQlFTFNJCQkweDA0CQkvKiBFbmFibGUgUlggU3RhdHVzIEludGVycnVwdCAqLwotCi0jZGVmaW5lCUVMU0lfUAkJMHgwMgotI2RlZmluZQlFVEJFSV9QCQkweDAxCi0jZGVmaW5lCUVSQkZJX1AJCTB4MDAKLQotLyogVUFSVHhfSUlSIFJlZ2lzdGVyICovCi0jZGVmaW5lCU5JTlQJCTB4MDEKLSNkZWZpbmUJU1RBVFVTX1AxCTB4MDIKLSNkZWZpbmUJU1RBVFVTX1AwCTB4MDEKLSNkZWZpbmUJTklOVF9QCQkweDAwCi0KLS8qIFVBUlR4X0dDVEwgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJVUNFTgkJMHgwMQkJLyogRW5hYmxlIFVBUlR4CUNsb2NrcyAqLwotI2RlZmluZQlJUkVOCQkweDAyCQkvKiBFbmFibGUgSXJEQSBNb2RlICovCi0jZGVmaW5lCVRQT0xDCQkweDA0CQkvKiBJckRBCVRYIFBvbGFyaXR5IENoYW5nZSAqLwotI2RlZmluZQlSUE9MQwkJMHgwOAkJLyogSXJEQQlSWCBQb2xhcml0eSBDaGFuZ2UgKi8KLSNkZWZpbmUJRlBFCQkJMHgxMAkJLyogRm9yY2UgUGFyaXR5CUVycm9yIE9uIFRyYW5zbWl0ICovCi0jZGVmaW5lCUZGRQkJCTB4MjAJCS8qIEZvcmNlIEZyYW1pbmcgRXJyb3IgT24gVHJhbnNtaXQgKi8KLQotI2RlZmluZQlGRkVfUAkJMHgwNQotI2RlZmluZQlGUEVfUAkJMHgwNAotI2RlZmluZQlSUE9MQ19QCQkweDAzCi0jZGVmaW5lCVRQT0xDX1AJCTB4MDIKLSNkZWZpbmUJSVJFTl9QCQkweDAxCi0jZGVmaW5lCVVDRU5fUAkJMHgwMAotCi0KLS8qICAqKioqKioqKiogIFBBUkFMTEVMCVBFUklQSEVSQUwgSU5URVJGQUNFIChQUEkpIE1BU0tTICoqKioqKioqKioqKioqKiogICAqLwotLyogIFBQSV9DT05UUk9MCU1hc2tzCSAgICAgICovCi0jZGVmaW5lCVBPUlRfRU4JCTB4MDAwMQkvKiBQUEkgUG9ydCBFbmFibGUgICovCi0jZGVmaW5lCVBPUlRfRElSCTB4MDAwMgkvKiBQUEkgUG9ydCBEaXJlY3Rpb24JICAgICovCi0jZGVmaW5lCVhGUl9UWVBFCTB4MDAwQwkvKiBQUEkgVHJhbnNmZXIJVHlwZSAgKi8KLSNkZWZpbmUJUE9SVF9DRkcJMHgwMDMwCS8qIFBQSSBQb3J0IENvbmZpZ3VyYXRpb24gKi8KLSNkZWZpbmUJRkxEX1NFTAkJMHgwMDQwCS8qIFBQSSBBY3RpdmUgRmllbGQgU2VsZWN0ICovCi0jZGVmaW5lCVBBQ0tfRU4JCTB4MDA4MAkvKiBQUEkgUGFja2luZyBNb2RlICovCi0vKiBwcmV2aW91cyB2ZXJzaW9ucyBvZglkZWZCRjUzOS5oIGVycm9uZW91c2x5IGluY2x1ZGVkCURNQTMyIChQUEkgMzItYml0IERNQSBFbmFibGUpICovCi0jZGVmaW5lCVNLSVBfRU4JCTB4MDIwMAkvKiBQUEkgU2tpcCBFbGVtZW50IEVuYWJsZSAqLwotI2RlZmluZQlTS0lQX0VPCQkweDA0MDAJLyogUFBJIFNraXAgRXZlbi9PZGQgRWxlbWVudHMgKi8KLSNkZWZpbmUJRExFTkdUSAkJMHgzODAwCS8qIFBQSSBEYXRhIExlbmd0aCAgKi8KLSNkZWZpbmUJRExFTl84CQkweDAJICAgICAvKglQUEkgRGF0YSBMZW5ndGgJbWFzayBmb3IgRExFTj04ICovCi0jZGVmaW5lCURMRU5fMTAJCTB4MDgwMAkJLyogRGF0YQlMZW5ndGggPSAxMCBCaXRzICovCi0jZGVmaW5lCURMRU5fMTEJCTB4MTAwMAkJLyogRGF0YQlMZW5ndGggPSAxMSBCaXRzICovCi0jZGVmaW5lCURMRU5fMTIJCTB4MTgwMAkJLyogRGF0YQlMZW5ndGggPSAxMiBCaXRzICovCi0jZGVmaW5lCURMRU5fMTMJCTB4MjAwMAkJLyogRGF0YQlMZW5ndGggPSAxMyBCaXRzICovCi0jZGVmaW5lCURMRU5fMTQJCTB4MjgwMAkJLyogRGF0YQlMZW5ndGggPSAxNCBCaXRzICovCi0jZGVmaW5lCURMRU5fMTUJCTB4MzAwMAkJLyogRGF0YQlMZW5ndGggPSAxNSBCaXRzICovCi0jZGVmaW5lCURMRU5fMTYJCTB4MzgwMAkJLyogRGF0YQlMZW5ndGggPSAxNiBCaXRzICovCi0jaWZkZWYgX01JU1JBX1JVTEVTCi0jZGVmaW5lCURMRU4oeCkJCSgoKCh4KS05dSkgJiAweDA3dSkgPDwgMTEpICAvKiBQUEkgRGF0YQlMZW5ndGggKG9ubHkgd29ya3MgZm9yIHg9MTAtLT54PTE2KSAqLwotI2Vsc2UKLSNkZWZpbmUJRExFTih4KQkJKCgoKHgpLTkpICYgMHgwNykgPDwgMTEpICAvKiBQUEkgRGF0YSBMZW5ndGggKG9ubHkgd29ya3MgZm9yIHg9MTAtLT54PTE2KSAqLwotI2VuZGlmIC8qIF9NSVNSQV9SVUxFUyAqLwotI2RlZmluZQlQT0wJCQkweEMwMDAJLyogUFBJIFNpZ25hbCBQb2xhcml0aWVzICAgICAgICovCi0jZGVmaW5lCVBPTEMJCTB4NDAwMAkJLyogUFBJIENsb2NrIFBvbGFyaXR5ICovCi0jZGVmaW5lCVBPTFMJCTB4ODAwMAkJLyogUFBJIEZyYW1lIFN5bmMgUG9sYXJpdHkgKi8KLQotCi0vKiBQUElfU1RBVFVTIE1hc2tzCQkJCQkgICAgICovCi0jZGVmaW5lCUZMRAkJCTB4MDQwMAkvKiBGaWVsZCBJbmRpY2F0b3IgICAqLwotI2RlZmluZQlGVF9FUlIJCTB4MDgwMAkvKiBGcmFtZSBUcmFjayBFcnJvciAqLwotI2RlZmluZQlPVlIJCQkweDEwMDAJLyogRklGTwlPdmVyZmxvdyBFcnJvciAqLwotI2RlZmluZQlVTkRSCQkweDIwMDAJLyogRklGTwlVbmRlcnJ1biBFcnJvciAqLwotI2RlZmluZQlFUlJfREVUCQkweDQwMDAJLyogRXJyb3IgRGV0ZWN0ZWQgSW5kaWNhdG9yICovCi0jZGVmaW5lCUVSUl9OQ09SCTB4ODAwMAkvKiBFcnJvciBOb3QgQ29ycmVjdGVkIEluZGljYXRvciAqLwotCi0KLS8qICoqKioqKioqKiogIERNQSBDT05UUk9MTEVSIE1BU0tTICAqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogRE1BeF9QRVJJUEhFUkFMX01BUCwJTURNQV95eV9QRVJJUEhFUkFMX01BUCBNYXNrcyAqLwotCi0jZGVmaW5lCUNUWVBFCQkJMHgwMDQwCS8qIERNQSBDaGFubmVsIFR5cGUgSW5kaWNhdG9yICovCi0jZGVmaW5lCUNUWVBFX1AJCQkweDYJCS8qIERNQSBDaGFubmVsIFR5cGUgSW5kaWNhdG9yIEJJVCBQT1NJVElPTiAqLwotI2RlZmluZQlQQ0FQOAkJCTB4MDA4MAkvKiBETUEgOC1iaXQgT3BlcmF0aW9uIEluZGljYXRvciAgICovCi0jZGVmaW5lCVBDQVAxNgkJCTB4MDEwMAkvKiBETUEgMTYtYml0IE9wZXJhdGlvbglJbmRpY2F0b3IgKi8KLSNkZWZpbmUJUENBUDMyCQkJMHgwMjAwCS8qIERNQSAzMi1iaXQgT3BlcmF0aW9uCUluZGljYXRvciAqLwotI2RlZmluZQlQQ0FQV1IJCQkweDA0MDAJLyogRE1BIFdyaXRlIE9wZXJhdGlvbiBJbmRpY2F0b3IgKi8KLSNkZWZpbmUJUENBUFJECQkJMHgwODAwCS8qIERNQSBSZWFkIE9wZXJhdGlvbiBJbmRpY2F0b3IgKi8KLSNkZWZpbmUJUE1BUAkJCTB4RjAwMAkvKiBETUEgUGVyaXBoZXJhbCBNYXAgRmllbGQgKi8KLQotLyogUE1BUAlFbmNvZGluZ3MgRm9yIERNQSBDb250cm9sbGVyIDAgKi8KLSNkZWZpbmUJUE1BUF9QUEkJCTB4MDAwMAkvKiBQTUFQCVBQSSBQb3J0IERNQSAqLwotI2RlZmluZQlQTUFQX1NQT1JUMFJYCTB4MTAwMAkvKiBQTUFQCVNQT1JUMCBSZWNlaXZlIERNQSAqLwotI2RlZmluZQlQTUFQX1NQT1JUMFRYCTB4MjAwMAkvKiBQTUFQCVNQT1JUMCBUcmFuc21pdAlETUEgKi8KLSNkZWZpbmUJUE1BUF9TUE9SVDFSWAkweDMwMDAJLyogUE1BUAlTUE9SVDEgUmVjZWl2ZSBETUEgKi8KLSNkZWZpbmUJUE1BUF9TUE9SVDFUWAkweDQwMDAJLyogUE1BUAlTUE9SVDEgVHJhbnNtaXQJRE1BICovCi0jZGVmaW5lCVBNQVBfU1BJMAkJMHg1MDAwCS8qIFBNQVAJU1BJIERNQSAqLwotI2RlZmluZQlQTUFQX1VBUlQwUlgJCTB4NjAwMAkvKiBQTUFQCVVBUlQgUmVjZWl2ZSBETUEgKi8KLSNkZWZpbmUJUE1BUF9VQVJUMFRYCQkweDcwMDAJLyogUE1BUAlVQVJUIFRyYW5zbWl0IERNQSAqLwotCi0vKiBQTUFQCUVuY29kaW5ncyBGb3IgRE1BIENvbnRyb2xsZXIgMSAqLwotI2RlZmluZQlQTUFQX1NQT1JUMlJYCSAgICAweDAwMDAgIC8qIFBNQVAgU1BPUlQyIFJlY2VpdmUgRE1BICovCi0jZGVmaW5lCVBNQVBfU1BPUlQyVFgJICAgIDB4MTAwMCAgLyogUE1BUCBTUE9SVDIgVHJhbnNtaXQgRE1BICovCi0jZGVmaW5lCVBNQVBfU1BPUlQzUlgJICAgIDB4MjAwMCAgLyogUE1BUCBTUE9SVDMgUmVjZWl2ZSBETUEgKi8KLSNkZWZpbmUJUE1BUF9TUE9SVDNUWAkgICAgMHgzMDAwICAvKiBQTUFQIFNQT1JUMyBUcmFuc21pdCBETUEgKi8KLSNkZWZpbmUJUE1BUF9TUEkxCSAgICAweDYwMDAgIC8qIFBNQVAgU1BJMSBETUEgKi8KLSNkZWZpbmUJUE1BUF9TUEkyCSAgICAweDcwMDAgIC8qIFBNQVAgU1BJMiBETUEgKi8KLSNkZWZpbmUJUE1BUF9VQVJUMVJYCSAgICAweDgwMDAgIC8qIFBNQVAgVUFSVDEgUmVjZWl2ZSBETUEgKi8KLSNkZWZpbmUJUE1BUF9VQVJUMVRYCSAgICAweDkwMDAgIC8qIFBNQVAgVUFSVDEgVHJhbnNtaXQgRE1BICovCi0jZGVmaW5lCVBNQVBfVUFSVDJSWAkgICAgMHhBMDAwICAvKiBQTUFQIFVBUlQyIFJlY2VpdmUgRE1BICovCi0jZGVmaW5lCVBNQVBfVUFSVDJUWAkgICAgMHhCMDAwICAvKiBQTUFQIFVBUlQyIFRyYW5zbWl0IERNQSAqLwotCi0KLS8qICAqKioqKioqKioqKioqICBHRU5FUkFMIFBVUlBPU0UgVElNRVIgTUFTS1MJKioqKioqKioqKioqKioqKioqKiogKi8KLS8qIFBXTSBUaW1lciBiaXQgZGVmaW5pdGlvbnMgKi8KLS8qIFRJTUVSX0VOQUJMRQlSZWdpc3RlciAqLwotI2RlZmluZQlUSU1FTjAJCQkweDAwMDEJLyogRW5hYmxlIFRpbWVyCTAgKi8KLSNkZWZpbmUJVElNRU4xCQkJMHgwMDAyCS8qIEVuYWJsZSBUaW1lcgkxICovCi0jZGVmaW5lCVRJTUVOMgkJCTB4MDAwNAkvKiBFbmFibGUgVGltZXIJMiAqLwotCi0jZGVmaW5lCVRJTUVOMF9QCQkweDAwCi0jZGVmaW5lCVRJTUVOMV9QCQkweDAxCi0jZGVmaW5lCVRJTUVOMl9QCQkweDAyCi0KLS8qIFRJTUVSX0RJU0FCTEUgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJVElNRElTMAkJCTB4MDAwMQkvKiBEaXNhYmxlIFRpbWVyIDAgKi8KLSNkZWZpbmUJVElNRElTMQkJCTB4MDAwMgkvKiBEaXNhYmxlIFRpbWVyIDEgKi8KLSNkZWZpbmUJVElNRElTMgkJCTB4MDAwNAkvKiBEaXNhYmxlIFRpbWVyIDIgKi8KLQotI2RlZmluZQlUSU1ESVMwX1AJCTB4MDAKLSNkZWZpbmUJVElNRElTMV9QCQkweDAxCi0jZGVmaW5lCVRJTURJUzJfUAkJMHgwMgotCi0vKiBUSU1FUl9TVEFUVVMJUmVnaXN0ZXIgKi8KLSNkZWZpbmUJVElNSUwwCQkJMHgwMDAxCS8qIFRpbWVyIDAgSW50ZXJydXB0ICovCi0jZGVmaW5lCVRJTUlMMQkJCTB4MDAwMgkvKiBUaW1lciAxIEludGVycnVwdCAqLwotI2RlZmluZQlUSU1JTDIJCQkweDAwMDQJLyogVGltZXIgMiBJbnRlcnJ1cHQgKi8KLSNkZWZpbmUJVE9WRl9FUlIwCQkweDAwMTAJLyogVGltZXIgMCBDb3VudGVyIE92ZXJmbG93ICovCi0jZGVmaW5lCVRPVkZfRVJSMQkJMHgwMDIwCS8qIFRpbWVyIDEgQ291bnRlciBPdmVyZmxvdyAqLwotI2RlZmluZQlUT1ZGX0VSUjIJCTB4MDA0MAkvKiBUaW1lciAyIENvdW50ZXIgT3ZlcmZsb3cgKi8KLSNkZWZpbmUJVFJVTjAJCQkweDEwMDAJLyogVGltZXIgMCBTbGF2ZSBFbmFibGUJU3RhdHVzICovCi0jZGVmaW5lCVRSVU4xCQkJMHgyMDAwCS8qIFRpbWVyIDEgU2xhdmUgRW5hYmxlCVN0YXR1cyAqLwotI2RlZmluZQlUUlVOMgkJCTB4NDAwMAkvKiBUaW1lciAyIFNsYXZlIEVuYWJsZQlTdGF0dXMgKi8KLQotI2RlZmluZQlUSU1JTDBfUAkJMHgwMAotI2RlZmluZQlUSU1JTDFfUAkJMHgwMQotI2RlZmluZQlUSU1JTDJfUAkJMHgwMgotI2RlZmluZQlUT1ZGX0VSUjBfUAkJMHgwNAotI2RlZmluZQlUT1ZGX0VSUjFfUAkJMHgwNQotI2RlZmluZQlUT1ZGX0VSUjJfUAkJMHgwNgotI2RlZmluZQlUUlVOMF9QCQkJMHgwQwotI2RlZmluZQlUUlVOMV9QCQkJMHgwRAotI2RlZmluZQlUUlVOMl9QCQkJMHgwRQotCi0vKiBBbHRlcm5hdGUgRGVwcmVjYXRlZAlNYWNyb3MgUHJvdmlkZWQJRm9yIEJhY2t3YXJkcyBDb2RlIENvbXBhdGliaWxpdHkgKi8KLSNkZWZpbmUJVE9WTF9FUlIwCQlUT1ZGX0VSUjAKLSNkZWZpbmUJVE9WTF9FUlIxCQlUT1ZGX0VSUjEKLSNkZWZpbmUJVE9WTF9FUlIyCQlUT1ZGX0VSUjIKLSNkZWZpbmUJVE9WTF9FUlIwX1AJCVRPVkZfRVJSMF9QCi0jZGVmaW5lCVRPVkxfRVJSMV9QCVRPVkZfRVJSMV9QCi0jZGVmaW5lCVRPVkxfRVJSMl9QCVRPVkZfRVJSMl9QCi0KLS8qIFRJTUVSeF9DT05GSUcgUmVnaXN0ZXJzICovCi0jZGVmaW5lCVBXTV9PVVQJCQkweDAwMDEKLSNkZWZpbmUJV0RUSF9DQVAJCTB4MDAwMgotI2RlZmluZQlFWFRfQ0xLCQkJMHgwMDAzCi0jZGVmaW5lCVBVTFNFX0hJCQkweDAwMDQKLSNkZWZpbmUJUEVSSU9EX0NOVAkJMHgwMDA4Ci0jZGVmaW5lCUlSUV9FTkEJCQkweDAwMTAKLSNkZWZpbmUJVElOX1NFTAkJCTB4MDAyMAotI2RlZmluZQlPVVRfRElTCQkJMHgwMDQwCi0jZGVmaW5lCUNMS19TRUwJCQkweDAwODAKLSNkZWZpbmUJVE9HR0xFX0hJCQkweDAxMDAKLSNkZWZpbmUJRU1VX1JVTgkJCTB4MDIwMAotI2lmZGVmIF9NSVNSQV9SVUxFUwotI2RlZmluZQlFUlJfVFlQKHgpCQkoKCh4KSAmCTB4MDN1KSA8PCAxNCkKLSNlbHNlCi0jZGVmaW5lCUVSUl9UWVAoeCkJCSgoKHgpICYJMHgwMykgPDwgMTQpCi0jZW5kaWYgLyogX01JU1JBX1JVTEVTICovCi0KLSNkZWZpbmUJVE1PREVfUDAJCTB4MDAKLSNkZWZpbmUJVE1PREVfUDEJCTB4MDEKLSNkZWZpbmUJUFVMU0VfSElfUAkJMHgwMgotI2RlZmluZQlQRVJJT0RfQ05UX1AJMHgwMwotI2RlZmluZQlJUlFfRU5BX1AJCTB4MDQKLSNkZWZpbmUJVElOX1NFTF9QCQkweDA1Ci0jZGVmaW5lCU9VVF9ESVNfUAkJMHgwNgotI2RlZmluZQlDTEtfU0VMX1AJCTB4MDcKLSNkZWZpbmUJVE9HR0xFX0hJX1AJCTB4MDgKLSNkZWZpbmUJRU1VX1JVTl9QCQkweDA5Ci0jZGVmaW5lCUVSUl9UWVBfUDAJCTB4MEUKLSNkZWZpbmUJRVJSX1RZUF9QMQkJMHgwRgotCi0KLS8qLyAqKioqKioqKioqKioqKioqKioJIEdFTkVSQUwtUFVSUE9TRSBJL08gICoqKioqKioqKioqKioqKioqKioqKiAqLwotLyogIEZsYWcgSS9PIChGSU9fKSBNYXNrcyAqLwotI2RlZmluZQlQRjAJCQkweDAwMDEKLSNkZWZpbmUJUEYxCQkJMHgwMDAyCi0jZGVmaW5lCVBGMgkJCTB4MDAwNAotI2RlZmluZQlQRjMJCQkweDAwMDgKLSNkZWZpbmUJUEY0CQkJMHgwMDEwCi0jZGVmaW5lCVBGNQkJCTB4MDAyMAotI2RlZmluZQlQRjYJCQkweDAwNDAKLSNkZWZpbmUJUEY3CQkJMHgwMDgwCi0jZGVmaW5lCVBGOAkJCTB4MDEwMAotI2RlZmluZQlQRjkJCQkweDAyMDAKLSNkZWZpbmUJUEYxMAkJMHgwNDAwCi0jZGVmaW5lCVBGMTEJCTB4MDgwMAotI2RlZmluZQlQRjEyCQkweDEwMDAKLSNkZWZpbmUJUEYxMwkJMHgyMDAwCi0jZGVmaW5lCVBGMTQJCTB4NDAwMAotI2RlZmluZQlQRjE1CQkweDgwMDAKLQotLyogIFBPUlQgRiBCSVQgUE9TSVRJT05TICovCi0jZGVmaW5lCVBGMF9QCQkweDAKLSNkZWZpbmUJUEYxX1AJCTB4MQotI2RlZmluZQlQRjJfUAkJMHgyCi0jZGVmaW5lCVBGM19QCQkweDMKLSNkZWZpbmUJUEY0X1AJCTB4NAotI2RlZmluZQlQRjVfUAkJMHg1Ci0jZGVmaW5lCVBGNl9QCQkweDYKLSNkZWZpbmUJUEY3X1AJCTB4NwotI2RlZmluZQlQRjhfUAkJMHg4Ci0jZGVmaW5lCVBGOV9QCQkweDkKLSNkZWZpbmUJUEYxMF9QCQkweEEKLSNkZWZpbmUJUEYxMV9QCQkweEIKLSNkZWZpbmUJUEYxMl9QCQkweEMKLSNkZWZpbmUJUEYxM19QCQkweEQKLSNkZWZpbmUJUEYxNF9QCQkweEUKLSNkZWZpbmUJUEYxNV9QCQkweEYKLQotCi0vKioqKioqKioqKioqKioqKioqKiAgIEdQSU8gTUFTS1MgICoqKioqKioqKioqKioqKioqKioqKi8KLS8qIFBvcnQJQyBNYXNrcyAqLwotI2RlZmluZQlQQzAJCTB4MDAwMQotI2RlZmluZQlQQzEJCTB4MDAwMgotI2RlZmluZQlQQzQJCTB4MDAxMAotI2RlZmluZQlQQzUJCTB4MDAyMAotI2RlZmluZQlQQzYJCTB4MDA0MAotI2RlZmluZQlQQzcJCTB4MDA4MAotI2RlZmluZQlQQzgJCTB4MDEwMAotI2RlZmluZQlQQzkJCTB4MDIwMAotLyogUG9ydAlDIEJpdCBQb3NpdGlvbnMgKi8KLSNkZWZpbmUJUEMwX1AJMHgwCi0jZGVmaW5lCVBDMV9QCTB4MQotI2RlZmluZQlQQzRfUAkweDQKLSNkZWZpbmUJUEM1X1AJMHg1Ci0jZGVmaW5lCVBDNl9QCTB4NgotI2RlZmluZQlQQzdfUAkweDcKLSNkZWZpbmUJUEM4X1AJMHg4Ci0jZGVmaW5lCVBDOV9QCTB4OQotCi0vKiBQb3J0CUQgKi8KLSNkZWZpbmUJUEQwCQkweDAwMDEKLSNkZWZpbmUJUEQxCQkweDAwMDIKLSNkZWZpbmUJUEQyCQkweDAwMDQKLSNkZWZpbmUJUEQzCQkweDAwMDgKLSNkZWZpbmUJUEQ0CQkweDAwMTAKLSNkZWZpbmUJUEQ1CQkweDAwMjAKLSNkZWZpbmUJUEQ2CQkweDAwNDAKLSNkZWZpbmUJUEQ3CQkweDAwODAKLSNkZWZpbmUJUEQ4CQkweDAxMDAKLSNkZWZpbmUJUEQ5CQkweDAyMDAKLSNkZWZpbmUJUEQxMAkweDA0MDAKLSNkZWZpbmUJUEQxMQkweDA4MDAKLSNkZWZpbmUJUEQxMgkweDEwMDAKLSNkZWZpbmUJUEQxMwkweDIwMDAKLSNkZWZpbmUJUEQxNAkweDQwMDAKLSNkZWZpbmUJUEQxNQkweDgwMDAKLS8qIFBvcnQJRCBCaXQgUG9zaXRpb25zICovCi0jZGVmaW5lCVBEMF9QCTB4MAotI2RlZmluZQlQRDFfUAkweDEKLSNkZWZpbmUJUEQyX1AJMHgyCi0jZGVmaW5lCVBEM19QCTB4MwotI2RlZmluZQlQRDRfUAkweDQKLSNkZWZpbmUJUEQ1X1AJMHg1Ci0jZGVmaW5lCVBENl9QCTB4NgotI2RlZmluZQlQRDdfUAkweDcKLSNkZWZpbmUJUEQ4X1AJMHg4Ci0jZGVmaW5lCVBEOV9QCTB4OQotI2RlZmluZQlQRDEwX1AJMHhBCi0jZGVmaW5lCVBEMTFfUAkweEIKLSNkZWZpbmUJUEQxMl9QCTB4QwotI2RlZmluZQlQRDEzX1AJMHhECi0jZGVmaW5lCVBEMTRfUAkweEUKLSNkZWZpbmUJUEQxNV9QCTB4RgotCi0vKiBQb3J0CUUgKi8KLSNkZWZpbmUJUEUwCQkweDAwMDEKLSNkZWZpbmUJUEUxCQkweDAwMDIKLSNkZWZpbmUJUEUyCQkweDAwMDQKLSNkZWZpbmUJUEUzCQkweDAwMDgKLSNkZWZpbmUJUEU0CQkweDAwMTAKLSNkZWZpbmUJUEU1CQkweDAwMjAKLSNkZWZpbmUJUEU2CQkweDAwNDAKLSNkZWZpbmUJUEU3CQkweDAwODAKLSNkZWZpbmUJUEU4CQkweDAxMDAKLSNkZWZpbmUJUEU5CQkweDAyMDAKLSNkZWZpbmUJUEUxMAkweDA0MDAKLSNkZWZpbmUJUEUxMQkweDA4MDAKLSNkZWZpbmUJUEUxMgkweDEwMDAKLSNkZWZpbmUJUEUxMwkweDIwMDAKLSNkZWZpbmUJUEUxNAkweDQwMDAKLSNkZWZpbmUJUEUxNQkweDgwMDAKLS8qIFBvcnQJRSBCaXQgUG9zaXRpb25zICovCi0jZGVmaW5lCVBFMF9QCTB4MAotI2RlZmluZQlQRTFfUAkweDEKLSNkZWZpbmUJUEUyX1AJMHgyCi0jZGVmaW5lCVBFM19QCTB4MwotI2RlZmluZQlQRTRfUAkweDQKLSNkZWZpbmUJUEU1X1AJMHg1Ci0jZGVmaW5lCVBFNl9QCTB4NgotI2RlZmluZQlQRTdfUAkweDcKLSNkZWZpbmUJUEU4X1AJMHg4Ci0jZGVmaW5lCVBFOV9QCTB4OQotI2RlZmluZQlQRTEwX1AJMHhBCi0jZGVmaW5lCVBFMTFfUAkweEIKLSNkZWZpbmUJUEUxMl9QCTB4QwotI2RlZmluZQlQRTEzX1AJMHhECi0jZGVmaW5lCVBFMTRfUAkweEUKLSNkZWZpbmUJUEUxNV9QCTB4RgotCi0vKiAqKioqKioqKioqKioqKioqKioqKiogIEFTWU5DSFJPTk9VUyBNRU1PUlkgQ09OVFJPTExFUiBNQVNLUwkqKioqKioqKioqKioqICovCi0vKiBFQklVX0FNR0NUTCBNYXNrcyAqLwotI2RlZmluZQlBTUNLRU4JCTB4MDAwMQkvKiBFbmFibGUgQ0xLT1VUICovCi0jZGVmaW5lCUFNQkVOX05PTkUJMHgwMDAwCS8qIEFsbCBCYW5rcyBEaXNhYmxlZCAqLwotI2RlZmluZQlBTUJFTl9CMAkweDAwMDIJLyogRW5hYmxlIEFzeW5jaHJvbm91cyBNZW1vcnkgQmFuayAwIG9ubHkgKi8KLSNkZWZpbmUJQU1CRU5fQjBfQjEJMHgwMDA0CS8qIEVuYWJsZSBBc3luY2hyb25vdXMgTWVtb3J5IEJhbmtzIDAgJgkxIG9ubHkgKi8KLSNkZWZpbmUJQU1CRU5fQjBfQjFfQjIJMHgwMDA2CS8qIEVuYWJsZSBBc3luY2hyb25vdXMgTWVtb3J5IEJhbmtzIDAsIDEsIGFuZCAyICovCi0jZGVmaW5lCUFNQkVOX0FMTAkweDAwMDgJLyogRW5hYmxlIEFzeW5jaHJvbm91cyBNZW1vcnkgQmFua3MgKGFsbCkgMCwgMSwJMiwgYW5kIDMgKi8KLSNkZWZpbmUJQ0RQUklPCQkweDAxMDAJLyogRE1BIGhhcyBwcmlvcml0eSBvdmVyIGNvcmUgZm9yIGV4dGVybmFsIGFjY2Vzc2VzICovCi0KLS8qIEVCSVVfQU1HQ1RMIEJpdCBQb3NpdGlvbnMgKi8KLSNkZWZpbmUJQU1DS0VOX1AJCTB4MDAwMAkvKiBFbmFibGUgQ0xLT1VUICovCi0jZGVmaW5lCUFNQkVOX1AwCQkweDAwMDEJLyogQXN5bmNocm9ub3VzCU1lbW9yeSBFbmFibGUsIDAwMCAtIGJhbmtzIDAtMyBkaXNhYmxlZCwgMDAxIC0gQmFuayAwIGVuYWJsZWQgKi8KLSNkZWZpbmUJQU1CRU5fUDEJCTB4MDAwMgkvKiBBc3luY2hyb25vdXMJTWVtb3J5IEVuYWJsZSwgMDEwIC0gYmFua3MgMCYxIGVuYWJsZWQsCSAwMTEgLSBiYW5rcyAwLTMgZW5hYmxlZCAqLwotI2RlZmluZQlBTUJFTl9QMgkJMHgwMDAzCS8qIEFzeW5jaHJvbm91cwlNZW1vcnkgRW5hYmxlLCAxeHggLSBBbGwgYmFua3MgKGJhbmsgMCwJMSwgMiwgYW5kIDMpIGVuYWJsZWQgKi8KLQotLyogRUJJVV9BTUJDVEwwCU1hc2tzICovCi0jZGVmaW5lCUIwUkRZRU4JCQkweDAwMDAwMDAxICAvKiBCYW5rIDAgUkRZIEVuYWJsZSwgMD1kaXNhYmxlLCAxPWVuYWJsZSAqLwotI2RlZmluZQlCMFJEWVBPTAkJMHgwMDAwMDAwMiAgLyogQmFuayAwIFJEWSBBY3RpdmUgaGlnaCwgMD1hY3RpdmUJbG93LCAxPWFjdGl2ZSBoaWdoICovCi0jZGVmaW5lCUIwVFRfMQkJCTB4MDAwMDAwMDQgIC8qIEJhbmsgMCBUcmFuc2l0aW9uIFRpbWUgZnJvbSBSZWFkCXRvIFdyaXRlID0gMSBjeWNsZSAqLwotI2RlZmluZQlCMFRUXzIJCQkweDAwMDAwMDA4ICAvKiBCYW5rIDAgVHJhbnNpdGlvbiBUaW1lIGZyb20gUmVhZAl0byBXcml0ZSA9IDIgY3ljbGVzICovCi0jZGVmaW5lCUIwVFRfMwkJCTB4MDAwMDAwMEMgIC8qIEJhbmsgMCBUcmFuc2l0aW9uIFRpbWUgZnJvbSBSZWFkCXRvIFdyaXRlID0gMyBjeWNsZXMgKi8KLSNkZWZpbmUJQjBUVF80CQkJMHgwMDAwMDAwMCAgLyogQmFuayAwIFRyYW5zaXRpb24gVGltZSBmcm9tIFJlYWQJdG8gV3JpdGUgPSA0IGN5Y2xlcyAqLwotI2RlZmluZQlCMFNUXzEJCQkweDAwMDAwMDEwICAvKiBCYW5rIDAgU2V0dXAgVGltZSBmcm9tIEFPRSBhc3NlcnRlZCB0byBSZWFkL1dyaXRlIGFzc2VydGVkPTEgY3ljbGUgKi8KLSNkZWZpbmUJQjBTVF8yCQkJMHgwMDAwMDAyMCAgLyogQmFuayAwIFNldHVwIFRpbWUgZnJvbSBBT0UgYXNzZXJ0ZWQgdG8gUmVhZC9Xcml0ZSBhc3NlcnRlZD0yIGN5Y2xlcyAqLwotI2RlZmluZQlCMFNUXzMJCQkweDAwMDAwMDMwICAvKiBCYW5rIDAgU2V0dXAgVGltZSBmcm9tIEFPRSBhc3NlcnRlZCB0byBSZWFkL1dyaXRlIGFzc2VydGVkPTMgY3ljbGVzICovCi0jZGVmaW5lCUIwU1RfNAkJCTB4MDAwMDAwMDAgIC8qIEJhbmsgMCBTZXR1cCBUaW1lIGZyb20gQU9FIGFzc2VydGVkIHRvIFJlYWQvV3JpdGUgYXNzZXJ0ZWQ9NCBjeWNsZXMgKi8KLSNkZWZpbmUJQjBIVF8xCQkJMHgwMDAwMDA0MCAgLyogQmFuayAwIEhvbGQgVGltZQlmcm9tIFJlYWQvV3JpdGUJZGVhc3NlcnRlZCB0byBBT0UgZGVhc3NlcnRlZCA9IDEgY3ljbGUgKi8KLSNkZWZpbmUJQjBIVF8yCQkJMHgwMDAwMDA4MCAgLyogQmFuayAwIEhvbGQgVGltZQlmcm9tIFJlYWQvV3JpdGUJZGVhc3NlcnRlZCB0byBBT0UgZGVhc3NlcnRlZCA9IDIgY3ljbGVzICovCi0jZGVmaW5lCUIwSFRfMwkJCTB4MDAwMDAwQzAgIC8qIEJhbmsgMCBIb2xkIFRpbWUJZnJvbSBSZWFkL1dyaXRlCWRlYXNzZXJ0ZWQgdG8gQU9FIGRlYXNzZXJ0ZWQgPSAzIGN5Y2xlcyAqLwotI2RlZmluZQlCMEhUXzAJCQkweDAwMDAwMDAwICAvKiBCYW5rIDAgSG9sZCBUaW1lCWZyb20gUmVhZC9Xcml0ZQlkZWFzc2VydGVkIHRvIEFPRSBkZWFzc2VydGVkID0gMCBjeWNsZXMgKi8KLSNkZWZpbmUJQjBSQVRfMQkJCTB4MDAwMDAxMDAgIC8qIEJhbmsgMCBSZWFkIEFjY2VzcyBUaW1lID0gMSBjeWNsZSAqLwotI2RlZmluZQlCMFJBVF8yCQkJMHgwMDAwMDIwMCAgLyogQmFuayAwIFJlYWQgQWNjZXNzIFRpbWUgPSAyIGN5Y2xlcyAqLwotI2RlZmluZQlCMFJBVF8zCQkJMHgwMDAwMDMwMCAgLyogQmFuayAwIFJlYWQgQWNjZXNzIFRpbWUgPSAzIGN5Y2xlcyAqLwotI2RlZmluZQlCMFJBVF80CQkJMHgwMDAwMDQwMCAgLyogQmFuayAwIFJlYWQgQWNjZXNzIFRpbWUgPSA0IGN5Y2xlcyAqLwotI2RlZmluZQlCMFJBVF81CQkJMHgwMDAwMDUwMCAgLyogQmFuayAwIFJlYWQgQWNjZXNzIFRpbWUgPSA1IGN5Y2xlcyAqLwotI2RlZmluZQlCMFJBVF82CQkJMHgwMDAwMDYwMCAgLyogQmFuayAwIFJlYWQgQWNjZXNzIFRpbWUgPSA2IGN5Y2xlcyAqLwotI2RlZmluZQlCMFJBVF83CQkJMHgwMDAwMDcwMCAgLyogQmFuayAwIFJlYWQgQWNjZXNzIFRpbWUgPSA3IGN5Y2xlcyAqLwotI2RlZmluZQlCMFJBVF84CQkJMHgwMDAwMDgwMCAgLyogQmFuayAwIFJlYWQgQWNjZXNzIFRpbWUgPSA4IGN5Y2xlcyAqLwotI2RlZmluZQlCMFJBVF85CQkJMHgwMDAwMDkwMCAgLyogQmFuayAwIFJlYWQgQWNjZXNzIFRpbWUgPSA5IGN5Y2xlcyAqLwotI2RlZmluZQlCMFJBVF8xMAkJMHgwMDAwMEEwMCAgLyogQmFuayAwIFJlYWQgQWNjZXNzIFRpbWUgPSAxMCBjeWNsZXMgKi8KLSNkZWZpbmUJQjBSQVRfMTEJCTB4MDAwMDBCMDAgIC8qIEJhbmsgMCBSZWFkIEFjY2VzcyBUaW1lID0gMTEgY3ljbGVzICovCi0jZGVmaW5lCUIwUkFUXzEyCQkweDAwMDAwQzAwICAvKiBCYW5rIDAgUmVhZCBBY2Nlc3MgVGltZSA9IDEyIGN5Y2xlcyAqLwotI2RlZmluZQlCMFJBVF8xMwkJMHgwMDAwMEQwMCAgLyogQmFuayAwIFJlYWQgQWNjZXNzIFRpbWUgPSAxMyBjeWNsZXMgKi8KLSNkZWZpbmUJQjBSQVRfMTQJCTB4MDAwMDBFMDAgIC8qIEJhbmsgMCBSZWFkIEFjY2VzcyBUaW1lID0gMTQgY3ljbGVzICovCi0jZGVmaW5lCUIwUkFUXzE1CQkweDAwMDAwRjAwICAvKiBCYW5rIDAgUmVhZCBBY2Nlc3MgVGltZSA9IDE1IGN5Y2xlcyAqLwotI2RlZmluZQlCMFdBVF8xCQkJMHgwMDAwMTAwMCAgLyogQmFuayAwIFdyaXRlIEFjY2VzcyBUaW1lCT0gMSBjeWNsZSAqLwotI2RlZmluZQlCMFdBVF8yCQkJMHgwMDAwMjAwMCAgLyogQmFuayAwIFdyaXRlIEFjY2VzcyBUaW1lCT0gMiBjeWNsZXMgKi8KLSNkZWZpbmUJQjBXQVRfMwkJCTB4MDAwMDMwMDAgIC8qIEJhbmsgMCBXcml0ZSBBY2Nlc3MgVGltZQk9IDMgY3ljbGVzICovCi0jZGVmaW5lCUIwV0FUXzQJCQkweDAwMDA0MDAwICAvKiBCYW5rIDAgV3JpdGUgQWNjZXNzIFRpbWUJPSA0IGN5Y2xlcyAqLwotI2RlZmluZQlCMFdBVF81CQkJMHgwMDAwNTAwMCAgLyogQmFuayAwIFdyaXRlIEFjY2VzcyBUaW1lCT0gNSBjeWNsZXMgKi8KLSNkZWZpbmUJQjBXQVRfNgkJCTB4MDAwMDYwMDAgIC8qIEJhbmsgMCBXcml0ZSBBY2Nlc3MgVGltZQk9IDYgY3ljbGVzICovCi0jZGVmaW5lCUIwV0FUXzcJCQkweDAwMDA3MDAwICAvKiBCYW5rIDAgV3JpdGUgQWNjZXNzIFRpbWUJPSA3IGN5Y2xlcyAqLwotI2RlZmluZQlCMFdBVF84CQkJMHgwMDAwODAwMCAgLyogQmFuayAwIFdyaXRlIEFjY2VzcyBUaW1lCT0gOCBjeWNsZXMgKi8KLSNkZWZpbmUJQjBXQVRfOQkJCTB4MDAwMDkwMDAgIC8qIEJhbmsgMCBXcml0ZSBBY2Nlc3MgVGltZQk9IDkgY3ljbGVzICovCi0jZGVmaW5lCUIwV0FUXzEwCQkweDAwMDBBMDAwICAvKiBCYW5rIDAgV3JpdGUgQWNjZXNzIFRpbWUJPSAxMCBjeWNsZXMgKi8KLSNkZWZpbmUJQjBXQVRfMTEJCTB4MDAwMEIwMDAgIC8qIEJhbmsgMCBXcml0ZSBBY2Nlc3MgVGltZQk9IDExIGN5Y2xlcyAqLwotI2RlZmluZQlCMFdBVF8xMgkJMHgwMDAwQzAwMCAgLyogQmFuayAwIFdyaXRlIEFjY2VzcyBUaW1lCT0gMTIgY3ljbGVzICovCi0jZGVmaW5lCUIwV0FUXzEzCQkweDAwMDBEMDAwICAvKiBCYW5rIDAgV3JpdGUgQWNjZXNzIFRpbWUJPSAxMyBjeWNsZXMgKi8KLSNkZWZpbmUJQjBXQVRfMTQJCTB4MDAwMEUwMDAgIC8qIEJhbmsgMCBXcml0ZSBBY2Nlc3MgVGltZQk9IDE0IGN5Y2xlcyAqLwotI2RlZmluZQlCMFdBVF8xNQkJMHgwMDAwRjAwMCAgLyogQmFuayAwIFdyaXRlIEFjY2VzcyBUaW1lCT0gMTUgY3ljbGVzICovCi0jZGVmaW5lCUIxUkRZRU4JCQkweDAwMDEwMDAwICAvKiBCYW5rIDEgUkRZIGVuYWJsZSwgMD1kaXNhYmxlLCAxPWVuYWJsZSAqLwotI2RlZmluZQlCMVJEWVBPTAkJMHgwMDAyMDAwMCAgLyogQmFuayAxIFJEWSBBY3RpdmUgaGlnaCwgMD1hY3RpdmUJbG93LCAxPWFjdGl2ZSBoaWdoICovCi0jZGVmaW5lCUIxVFRfMQkJCTB4MDAwNDAwMDAgIC8qIEJhbmsgMSBUcmFuc2l0aW9uIFRpbWUgZnJvbSBSZWFkCXRvIFdyaXRlID0gMSBjeWNsZSAqLwotI2RlZmluZQlCMVRUXzIJCQkweDAwMDgwMDAwICAvKiBCYW5rIDEgVHJhbnNpdGlvbiBUaW1lIGZyb20gUmVhZAl0byBXcml0ZSA9IDIgY3ljbGVzICovCi0jZGVmaW5lCUIxVFRfMwkJCTB4MDAwQzAwMDAgIC8qIEJhbmsgMSBUcmFuc2l0aW9uIFRpbWUgZnJvbSBSZWFkCXRvIFdyaXRlID0gMyBjeWNsZXMgKi8KLSNkZWZpbmUJQjFUVF80CQkJMHgwMDAwMDAwMCAgLyogQmFuayAxIFRyYW5zaXRpb24gVGltZSBmcm9tIFJlYWQJdG8gV3JpdGUgPSA0IGN5Y2xlcyAqLwotI2RlZmluZQlCMVNUXzEJCQkweDAwMTAwMDAwICAvKiBCYW5rIDEgU2V0dXAgVGltZSBmcm9tIEFPRSBhc3NlcnRlZCB0byBSZWFkIG9yIFdyaXRlIGFzc2VydGVkID0gMSBjeWNsZSAqLwotI2RlZmluZQlCMVNUXzIJCQkweDAwMjAwMDAwICAvKiBCYW5rIDEgU2V0dXAgVGltZSBmcm9tIEFPRSBhc3NlcnRlZCB0byBSZWFkIG9yIFdyaXRlIGFzc2VydGVkID0gMiBjeWNsZXMgKi8KLSNkZWZpbmUJQjFTVF8zCQkJMHgwMDMwMDAwMCAgLyogQmFuayAxIFNldHVwIFRpbWUgZnJvbSBBT0UgYXNzZXJ0ZWQgdG8gUmVhZCBvciBXcml0ZSBhc3NlcnRlZCA9IDMgY3ljbGVzICovCi0jZGVmaW5lCUIxU1RfNAkJCTB4MDAwMDAwMDAgIC8qIEJhbmsgMSBTZXR1cCBUaW1lIGZyb20gQU9FIGFzc2VydGVkIHRvIFJlYWQgb3IgV3JpdGUgYXNzZXJ0ZWQgPSA0IGN5Y2xlcyAqLwotI2RlZmluZQlCMUhUXzEJCQkweDAwNDAwMDAwICAvKiBCYW5rIDEgSG9sZCBUaW1lCWZyb20gUmVhZCBvciBXcml0ZSBkZWFzc2VydGVkIHRvIEFPRSBkZWFzc2VydGVkCT0gMSBjeWNsZSAqLwotI2RlZmluZQlCMUhUXzIJCQkweDAwODAwMDAwICAvKiBCYW5rIDEgSG9sZCBUaW1lCWZyb20gUmVhZCBvciBXcml0ZSBkZWFzc2VydGVkIHRvIEFPRSBkZWFzc2VydGVkCT0gMiBjeWNsZXMgKi8KLSNkZWZpbmUJQjFIVF8zCQkJMHgwMEMwMDAwMCAgLyogQmFuayAxIEhvbGQgVGltZQlmcm9tIFJlYWQgb3IgV3JpdGUgZGVhc3NlcnRlZCB0byBBT0UgZGVhc3NlcnRlZAk9IDMgY3ljbGVzICovCi0jZGVmaW5lCUIxSFRfMAkJCTB4MDAwMDAwMDAgIC8qIEJhbmsgMSBIb2xkIFRpbWUJZnJvbSBSZWFkIG9yIFdyaXRlIGRlYXNzZXJ0ZWQgdG8gQU9FIGRlYXNzZXJ0ZWQJPSAwIGN5Y2xlcyAqLwotI2RlZmluZQlCMVJBVF8xCQkJMHgwMTAwMDAwMCAgLyogQmFuayAxIFJlYWQgQWNjZXNzIFRpbWUgPSAxIGN5Y2xlICovCi0jZGVmaW5lCUIxUkFUXzIJCQkweDAyMDAwMDAwICAvKiBCYW5rIDEgUmVhZCBBY2Nlc3MgVGltZSA9IDIgY3ljbGVzICovCi0jZGVmaW5lCUIxUkFUXzMJCQkweDAzMDAwMDAwICAvKiBCYW5rIDEgUmVhZCBBY2Nlc3MgVGltZSA9IDMgY3ljbGVzICovCi0jZGVmaW5lCUIxUkFUXzQJCQkweDA0MDAwMDAwICAvKiBCYW5rIDEgUmVhZCBBY2Nlc3MgVGltZSA9IDQgY3ljbGVzICovCi0jZGVmaW5lCUIxUkFUXzUJCQkweDA1MDAwMDAwICAvKiBCYW5rIDEgUmVhZCBBY2Nlc3MgVGltZSA9IDUgY3ljbGVzICovCi0jZGVmaW5lCUIxUkFUXzYJCQkweDA2MDAwMDAwICAvKiBCYW5rIDEgUmVhZCBBY2Nlc3MgVGltZSA9IDYgY3ljbGVzICovCi0jZGVmaW5lCUIxUkFUXzcJCQkweDA3MDAwMDAwICAvKiBCYW5rIDEgUmVhZCBBY2Nlc3MgVGltZSA9IDcgY3ljbGVzICovCi0jZGVmaW5lCUIxUkFUXzgJCQkweDA4MDAwMDAwICAvKiBCYW5rIDEgUmVhZCBBY2Nlc3MgVGltZSA9IDggY3ljbGVzICovCi0jZGVmaW5lCUIxUkFUXzkJCQkweDA5MDAwMDAwICAvKiBCYW5rIDEgUmVhZCBBY2Nlc3MgVGltZSA9IDkgY3ljbGVzICovCi0jZGVmaW5lCUIxUkFUXzEwCQkweDBBMDAwMDAwICAvKiBCYW5rIDEgUmVhZCBBY2Nlc3MgVGltZSA9IDEwIGN5Y2xlcyAqLwotI2RlZmluZQlCMVJBVF8xMQkJMHgwQjAwMDAwMCAgLyogQmFuayAxIFJlYWQgQWNjZXNzIFRpbWUgPSAxMSBjeWNsZXMgKi8KLSNkZWZpbmUJQjFSQVRfMTIJCTB4MEMwMDAwMDAgIC8qIEJhbmsgMSBSZWFkIEFjY2VzcyBUaW1lID0gMTIgY3ljbGVzICovCi0jZGVmaW5lCUIxUkFUXzEzCQkweDBEMDAwMDAwICAvKiBCYW5rIDEgUmVhZCBBY2Nlc3MgVGltZSA9IDEzIGN5Y2xlcyAqLwotI2RlZmluZQlCMVJBVF8xNAkJMHgwRTAwMDAwMCAgLyogQmFuayAxIFJlYWQgQWNjZXNzIFRpbWUgPSAxNCBjeWNsZXMgKi8KLSNkZWZpbmUJQjFSQVRfMTUJCTB4MEYwMDAwMDAgIC8qIEJhbmsgMSBSZWFkIEFjY2VzcyBUaW1lID0gMTUgY3ljbGVzICovCi0jZGVmaW5lCUIxV0FUXzEJCQkweDEwMDAwMDAwIC8qIEJhbmsgMSBXcml0ZSBBY2Nlc3MgVGltZSA9IDEgY3ljbGUgKi8KLSNkZWZpbmUJQjFXQVRfMgkJCTB4MjAwMDAwMDAgIC8qIEJhbmsgMSBXcml0ZSBBY2Nlc3MgVGltZQk9IDIgY3ljbGVzICovCi0jZGVmaW5lCUIxV0FUXzMJCQkweDMwMDAwMDAwICAvKiBCYW5rIDEgV3JpdGUgQWNjZXNzIFRpbWUJPSAzIGN5Y2xlcyAqLwotI2RlZmluZQlCMVdBVF80CQkJMHg0MDAwMDAwMCAgLyogQmFuayAxIFdyaXRlIEFjY2VzcyBUaW1lCT0gNCBjeWNsZXMgKi8KLSNkZWZpbmUJQjFXQVRfNQkJCTB4NTAwMDAwMDAgIC8qIEJhbmsgMSBXcml0ZSBBY2Nlc3MgVGltZQk9IDUgY3ljbGVzICovCi0jZGVmaW5lCUIxV0FUXzYJCQkweDYwMDAwMDAwICAvKiBCYW5rIDEgV3JpdGUgQWNjZXNzIFRpbWUJPSA2IGN5Y2xlcyAqLwotI2RlZmluZQlCMVdBVF83CQkJMHg3MDAwMDAwMCAgLyogQmFuayAxIFdyaXRlIEFjY2VzcyBUaW1lCT0gNyBjeWNsZXMgKi8KLSNkZWZpbmUJQjFXQVRfOAkJCTB4ODAwMDAwMDAgIC8qIEJhbmsgMSBXcml0ZSBBY2Nlc3MgVGltZQk9IDggY3ljbGVzICovCi0jZGVmaW5lCUIxV0FUXzkJCQkweDkwMDAwMDAwICAvKiBCYW5rIDEgV3JpdGUgQWNjZXNzIFRpbWUJPSA5IGN5Y2xlcyAqLwotI2RlZmluZQlCMVdBVF8xMAkJMHhBMDAwMDAwMCAgLyogQmFuayAxIFdyaXRlIEFjY2VzcyBUaW1lCT0gMTAgY3ljbGVzICovCi0jZGVmaW5lCUIxV0FUXzExCQkweEIwMDAwMDAwICAvKiBCYW5rIDEgV3JpdGUgQWNjZXNzIFRpbWUJPSAxMSBjeWNsZXMgKi8KLSNkZWZpbmUJQjFXQVRfMTIJCTB4QzAwMDAwMDAgIC8qIEJhbmsgMSBXcml0ZSBBY2Nlc3MgVGltZQk9IDEyIGN5Y2xlcyAqLwotI2RlZmluZQlCMVdBVF8xMwkJMHhEMDAwMDAwMCAgLyogQmFuayAxIFdyaXRlIEFjY2VzcyBUaW1lCT0gMTMgY3ljbGVzICovCi0jZGVmaW5lCUIxV0FUXzE0CQkweEUwMDAwMDAwICAvKiBCYW5rIDEgV3JpdGUgQWNjZXNzIFRpbWUJPSAxNCBjeWNsZXMgKi8KLSNkZWZpbmUJQjFXQVRfMTUJCTB4RjAwMDAwMDAgIC8qIEJhbmsgMSBXcml0ZSBBY2Nlc3MgVGltZQk9IDE1IGN5Y2xlcyAqLwotCi0vKiBFQklVX0FNQkNUTDEJTWFza3MgKi8KLSNkZWZpbmUJQjJSRFlFTgkJCTB4MDAwMDAwMDEgIC8qIEJhbmsgMiBSRFkgRW5hYmxlLCAwPWRpc2FibGUsIDE9ZW5hYmxlICovCi0jZGVmaW5lCUIyUkRZUE9MCQkweDAwMDAwMDAyICAvKiBCYW5rIDIgUkRZIEFjdGl2ZSBoaWdoLCAwPWFjdGl2ZQlsb3csIDE9YWN0aXZlIGhpZ2ggKi8KLSNkZWZpbmUJQjJUVF8xCQkJMHgwMDAwMDAwNCAgLyogQmFuayAyIFRyYW5zaXRpb24gVGltZSBmcm9tIFJlYWQJdG8gV3JpdGUgPSAxIGN5Y2xlICovCi0jZGVmaW5lCUIyVFRfMgkJCTB4MDAwMDAwMDggIC8qIEJhbmsgMiBUcmFuc2l0aW9uIFRpbWUgZnJvbSBSZWFkCXRvIFdyaXRlID0gMiBjeWNsZXMgKi8KLSNkZWZpbmUJQjJUVF8zCQkJMHgwMDAwMDAwQyAgLyogQmFuayAyIFRyYW5zaXRpb24gVGltZSBmcm9tIFJlYWQJdG8gV3JpdGUgPSAzIGN5Y2xlcyAqLwotI2RlZmluZQlCMlRUXzQJCQkweDAwMDAwMDAwICAvKiBCYW5rIDIgVHJhbnNpdGlvbiBUaW1lIGZyb20gUmVhZAl0byBXcml0ZSA9IDQgY3ljbGVzICovCi0jZGVmaW5lCUIyU1RfMQkJCTB4MDAwMDAwMTAgIC8qIEJhbmsgMiBTZXR1cCBUaW1lIGZyb20gQU9FIGFzc2VydGVkIHRvIFJlYWQgb3IgV3JpdGUgYXNzZXJ0ZWQgPSAxIGN5Y2xlICovCi0jZGVmaW5lCUIyU1RfMgkJCTB4MDAwMDAwMjAgIC8qIEJhbmsgMiBTZXR1cCBUaW1lIGZyb20gQU9FIGFzc2VydGVkIHRvIFJlYWQgb3IgV3JpdGUgYXNzZXJ0ZWQgPSAyIGN5Y2xlcyAqLwotI2RlZmluZQlCMlNUXzMJCQkweDAwMDAwMDMwICAvKiBCYW5rIDIgU2V0dXAgVGltZSBmcm9tIEFPRSBhc3NlcnRlZCB0byBSZWFkIG9yIFdyaXRlIGFzc2VydGVkID0gMyBjeWNsZXMgKi8KLSNkZWZpbmUJQjJTVF80CQkJMHgwMDAwMDAwMCAgLyogQmFuayAyIFNldHVwIFRpbWUgZnJvbSBBT0UgYXNzZXJ0ZWQgdG8gUmVhZCBvciBXcml0ZSBhc3NlcnRlZCA9IDQgY3ljbGVzICovCi0jZGVmaW5lCUIySFRfMQkJCTB4MDAwMDAwNDAgIC8qIEJhbmsgMiBIb2xkIFRpbWUJZnJvbSBSZWFkIG9yIFdyaXRlIGRlYXNzZXJ0ZWQgdG8gQU9FIGRlYXNzZXJ0ZWQJPSAxIGN5Y2xlICovCi0jZGVmaW5lCUIySFRfMgkJCTB4MDAwMDAwODAgIC8qIEJhbmsgMiBIb2xkIFRpbWUJZnJvbSBSZWFkIG9yIFdyaXRlIGRlYXNzZXJ0ZWQgdG8gQU9FIGRlYXNzZXJ0ZWQJPSAyIGN5Y2xlcyAqLwotI2RlZmluZQlCMkhUXzMJCQkweDAwMDAwMEMwICAvKiBCYW5rIDIgSG9sZCBUaW1lCWZyb20gUmVhZCBvciBXcml0ZSBkZWFzc2VydGVkIHRvIEFPRSBkZWFzc2VydGVkCT0gMyBjeWNsZXMgKi8KLSNkZWZpbmUJQjJIVF8wCQkJMHgwMDAwMDAwMCAgLyogQmFuayAyIEhvbGQgVGltZQlmcm9tIFJlYWQgb3IgV3JpdGUgZGVhc3NlcnRlZCB0byBBT0UgZGVhc3NlcnRlZAk9IDAgY3ljbGVzICovCi0jZGVmaW5lCUIyUkFUXzEJCQkweDAwMDAwMTAwICAvKiBCYW5rIDIgUmVhZCBBY2Nlc3MgVGltZSA9IDEgY3ljbGUgKi8KLSNkZWZpbmUJQjJSQVRfMgkJCTB4MDAwMDAyMDAgIC8qIEJhbmsgMiBSZWFkIEFjY2VzcyBUaW1lID0gMiBjeWNsZXMgKi8KLSNkZWZpbmUJQjJSQVRfMwkJCTB4MDAwMDAzMDAgIC8qIEJhbmsgMiBSZWFkIEFjY2VzcyBUaW1lID0gMyBjeWNsZXMgKi8KLSNkZWZpbmUJQjJSQVRfNAkJCTB4MDAwMDA0MDAgIC8qIEJhbmsgMiBSZWFkIEFjY2VzcyBUaW1lID0gNCBjeWNsZXMgKi8KLSNkZWZpbmUJQjJSQVRfNQkJCTB4MDAwMDA1MDAgIC8qIEJhbmsgMiBSZWFkIEFjY2VzcyBUaW1lID0gNSBjeWNsZXMgKi8KLSNkZWZpbmUJQjJSQVRfNgkJCTB4MDAwMDA2MDAgIC8qIEJhbmsgMiBSZWFkIEFjY2VzcyBUaW1lID0gNiBjeWNsZXMgKi8KLSNkZWZpbmUJQjJSQVRfNwkJCTB4MDAwMDA3MDAgIC8qIEJhbmsgMiBSZWFkIEFjY2VzcyBUaW1lID0gNyBjeWNsZXMgKi8KLSNkZWZpbmUJQjJSQVRfOAkJCTB4MDAwMDA4MDAgIC8qIEJhbmsgMiBSZWFkIEFjY2VzcyBUaW1lID0gOCBjeWNsZXMgKi8KLSNkZWZpbmUJQjJSQVRfOQkJCTB4MDAwMDA5MDAgIC8qIEJhbmsgMiBSZWFkIEFjY2VzcyBUaW1lID0gOSBjeWNsZXMgKi8KLSNkZWZpbmUJQjJSQVRfMTAJCTB4MDAwMDBBMDAgIC8qIEJhbmsgMiBSZWFkIEFjY2VzcyBUaW1lID0gMTAgY3ljbGVzICovCi0jZGVmaW5lCUIyUkFUXzExCQkweDAwMDAwQjAwICAvKiBCYW5rIDIgUmVhZCBBY2Nlc3MgVGltZSA9IDExIGN5Y2xlcyAqLwotI2RlZmluZQlCMlJBVF8xMgkJMHgwMDAwMEMwMCAgLyogQmFuayAyIFJlYWQgQWNjZXNzIFRpbWUgPSAxMiBjeWNsZXMgKi8KLSNkZWZpbmUJQjJSQVRfMTMJCTB4MDAwMDBEMDAgIC8qIEJhbmsgMiBSZWFkIEFjY2VzcyBUaW1lID0gMTMgY3ljbGVzICovCi0jZGVmaW5lCUIyUkFUXzE0CQkweDAwMDAwRTAwICAvKiBCYW5rIDIgUmVhZCBBY2Nlc3MgVGltZSA9IDE0IGN5Y2xlcyAqLwotI2RlZmluZQlCMlJBVF8xNQkJMHgwMDAwMEYwMCAgLyogQmFuayAyIFJlYWQgQWNjZXNzIFRpbWUgPSAxNSBjeWNsZXMgKi8KLSNkZWZpbmUJQjJXQVRfMQkJCTB4MDAwMDEwMDAgIC8qIEJhbmsgMiBXcml0ZSBBY2Nlc3MgVGltZQk9IDEgY3ljbGUgKi8KLSNkZWZpbmUJQjJXQVRfMgkJCTB4MDAwMDIwMDAgIC8qIEJhbmsgMiBXcml0ZSBBY2Nlc3MgVGltZQk9IDIgY3ljbGVzICovCi0jZGVmaW5lCUIyV0FUXzMJCQkweDAwMDAzMDAwICAvKiBCYW5rIDIgV3JpdGUgQWNjZXNzIFRpbWUJPSAzIGN5Y2xlcyAqLwotI2RlZmluZQlCMldBVF80CQkJMHgwMDAwNDAwMCAgLyogQmFuayAyIFdyaXRlIEFjY2VzcyBUaW1lCT0gNCBjeWNsZXMgKi8KLSNkZWZpbmUJQjJXQVRfNQkJCTB4MDAwMDUwMDAgIC8qIEJhbmsgMiBXcml0ZSBBY2Nlc3MgVGltZQk9IDUgY3ljbGVzICovCi0jZGVmaW5lCUIyV0FUXzYJCQkweDAwMDA2MDAwICAvKiBCYW5rIDIgV3JpdGUgQWNjZXNzIFRpbWUJPSA2IGN5Y2xlcyAqLwotI2RlZmluZQlCMldBVF83CQkJMHgwMDAwNzAwMCAgLyogQmFuayAyIFdyaXRlIEFjY2VzcyBUaW1lCT0gNyBjeWNsZXMgKi8KLSNkZWZpbmUJQjJXQVRfOAkJCTB4MDAwMDgwMDAgIC8qIEJhbmsgMiBXcml0ZSBBY2Nlc3MgVGltZQk9IDggY3ljbGVzICovCi0jZGVmaW5lCUIyV0FUXzkJCQkweDAwMDA5MDAwICAvKiBCYW5rIDIgV3JpdGUgQWNjZXNzIFRpbWUJPSA5IGN5Y2xlcyAqLwotI2RlZmluZQlCMldBVF8xMAkJMHgwMDAwQTAwMCAgLyogQmFuayAyIFdyaXRlIEFjY2VzcyBUaW1lCT0gMTAgY3ljbGVzICovCi0jZGVmaW5lCUIyV0FUXzExCQkweDAwMDBCMDAwICAvKiBCYW5rIDIgV3JpdGUgQWNjZXNzIFRpbWUJPSAxMSBjeWNsZXMgKi8KLSNkZWZpbmUJQjJXQVRfMTIJCTB4MDAwMEMwMDAgIC8qIEJhbmsgMiBXcml0ZSBBY2Nlc3MgVGltZQk9IDEyIGN5Y2xlcyAqLwotI2RlZmluZQlCMldBVF8xMwkJMHgwMDAwRDAwMCAgLyogQmFuayAyIFdyaXRlIEFjY2VzcyBUaW1lCT0gMTMgY3ljbGVzICovCi0jZGVmaW5lCUIyV0FUXzE0CQkweDAwMDBFMDAwICAvKiBCYW5rIDIgV3JpdGUgQWNjZXNzIFRpbWUJPSAxNCBjeWNsZXMgKi8KLSNkZWZpbmUJQjJXQVRfMTUJCTB4MDAwMEYwMDAgIC8qIEJhbmsgMiBXcml0ZSBBY2Nlc3MgVGltZQk9IDE1IGN5Y2xlcyAqLwotI2RlZmluZQlCM1JEWUVOCQkJMHgwMDAxMDAwMCAgLyogQmFuayAzIFJEWSBlbmFibGUsIDA9ZGlzYWJsZSwgMT1lbmFibGUgKi8KLSNkZWZpbmUJQjNSRFlQT0wJCTB4MDAwMjAwMDAgIC8qIEJhbmsgMyBSRFkgQWN0aXZlIGhpZ2gsIDA9YWN0aXZlCWxvdywgMT1hY3RpdmUgaGlnaCAqLwotI2RlZmluZQlCM1RUXzEJCQkweDAwMDQwMDAwICAvKiBCYW5rIDMgVHJhbnNpdGlvbiBUaW1lIGZyb20gUmVhZAl0byBXcml0ZSA9IDEgY3ljbGUgKi8KLSNkZWZpbmUJQjNUVF8yCQkJMHgwMDA4MDAwMCAgLyogQmFuayAzIFRyYW5zaXRpb24gVGltZSBmcm9tIFJlYWQJdG8gV3JpdGUgPSAyIGN5Y2xlcyAqLwotI2RlZmluZQlCM1RUXzMJCQkweDAwMEMwMDAwICAvKiBCYW5rIDMgVHJhbnNpdGlvbiBUaW1lIGZyb20gUmVhZAl0byBXcml0ZSA9IDMgY3ljbGVzICovCi0jZGVmaW5lCUIzVFRfNAkJCTB4MDAwMDAwMDAgIC8qIEJhbmsgMyBUcmFuc2l0aW9uIFRpbWUgZnJvbSBSZWFkCXRvIFdyaXRlID0gNCBjeWNsZXMgKi8KLSNkZWZpbmUJQjNTVF8xCQkJMHgwMDEwMDAwMCAgLyogQmFuayAzIFNldHVwIFRpbWUgZnJvbSBBT0UgYXNzZXJ0ZWQgdG8gUmVhZCBvciBXcml0ZSBhc3NlcnRlZCA9IDEgY3ljbGUgKi8KLSNkZWZpbmUJQjNTVF8yCQkJMHgwMDIwMDAwMCAgLyogQmFuayAzIFNldHVwIFRpbWUgZnJvbSBBT0UgYXNzZXJ0ZWQgdG8gUmVhZCBvciBXcml0ZSBhc3NlcnRlZCA9IDIgY3ljbGVzICovCi0jZGVmaW5lCUIzU1RfMwkJCTB4MDAzMDAwMDAgIC8qIEJhbmsgMyBTZXR1cCBUaW1lIGZyb20gQU9FIGFzc2VydGVkIHRvIFJlYWQgb3IgV3JpdGUgYXNzZXJ0ZWQgPSAzIGN5Y2xlcyAqLwotI2RlZmluZQlCM1NUXzQJCQkweDAwMDAwMDAwICAvKiBCYW5rIDMgU2V0dXAgVGltZSBmcm9tIEFPRSBhc3NlcnRlZCB0byBSZWFkIG9yIFdyaXRlIGFzc2VydGVkID0gNCBjeWNsZXMgKi8KLSNkZWZpbmUJQjNIVF8xCQkJMHgwMDQwMDAwMCAgLyogQmFuayAzIEhvbGQgVGltZQlmcm9tIFJlYWQgb3IgV3JpdGUgZGVhc3NlcnRlZCB0byBBT0UgZGVhc3NlcnRlZAk9IDEgY3ljbGUgKi8KLSNkZWZpbmUJQjNIVF8yCQkJMHgwMDgwMDAwMCAgLyogQmFuayAzIEhvbGQgVGltZQlmcm9tIFJlYWQgb3IgV3JpdGUgZGVhc3NlcnRlZCB0byBBT0UgZGVhc3NlcnRlZAk9IDIgY3ljbGVzICovCi0jZGVmaW5lCUIzSFRfMwkJCTB4MDBDMDAwMDAgIC8qIEJhbmsgMyBIb2xkIFRpbWUJZnJvbSBSZWFkIG9yIFdyaXRlIGRlYXNzZXJ0ZWQgdG8gQU9FIGRlYXNzZXJ0ZWQJPSAzIGN5Y2xlcyAqLwotI2RlZmluZQlCM0hUXzAJCQkweDAwMDAwMDAwICAvKiBCYW5rIDMgSG9sZCBUaW1lCWZyb20gUmVhZCBvciBXcml0ZSBkZWFzc2VydGVkIHRvIEFPRSBkZWFzc2VydGVkCT0gMCBjeWNsZXMgKi8KLSNkZWZpbmUJQjNSQVRfMQkJCTB4MDEwMDAwMDAgLyogQmFuayAzIFJlYWQgQWNjZXNzIFRpbWUgPQkxIGN5Y2xlICovCi0jZGVmaW5lCUIzUkFUXzIJCQkweDAyMDAwMDAwICAvKiBCYW5rIDMgUmVhZCBBY2Nlc3MgVGltZSA9IDIgY3ljbGVzICovCi0jZGVmaW5lCUIzUkFUXzMJCQkweDAzMDAwMDAwICAvKiBCYW5rIDMgUmVhZCBBY2Nlc3MgVGltZSA9IDMgY3ljbGVzICovCi0jZGVmaW5lCUIzUkFUXzQJCQkweDA0MDAwMDAwICAvKiBCYW5rIDMgUmVhZCBBY2Nlc3MgVGltZSA9IDQgY3ljbGVzICovCi0jZGVmaW5lCUIzUkFUXzUJCQkweDA1MDAwMDAwICAvKiBCYW5rIDMgUmVhZCBBY2Nlc3MgVGltZSA9IDUgY3ljbGVzICovCi0jZGVmaW5lCUIzUkFUXzYJCQkweDA2MDAwMDAwICAvKiBCYW5rIDMgUmVhZCBBY2Nlc3MgVGltZSA9IDYgY3ljbGVzICovCi0jZGVmaW5lCUIzUkFUXzcJCQkweDA3MDAwMDAwICAvKiBCYW5rIDMgUmVhZCBBY2Nlc3MgVGltZSA9IDcgY3ljbGVzICovCi0jZGVmaW5lCUIzUkFUXzgJCQkweDA4MDAwMDAwICAvKiBCYW5rIDMgUmVhZCBBY2Nlc3MgVGltZSA9IDggY3ljbGVzICovCi0jZGVmaW5lCUIzUkFUXzkJCQkweDA5MDAwMDAwICAvKiBCYW5rIDMgUmVhZCBBY2Nlc3MgVGltZSA9IDkgY3ljbGVzICovCi0jZGVmaW5lCUIzUkFUXzEwCQkweDBBMDAwMDAwICAvKiBCYW5rIDMgUmVhZCBBY2Nlc3MgVGltZSA9IDEwIGN5Y2xlcyAqLwotI2RlZmluZQlCM1JBVF8xMQkJMHgwQjAwMDAwMCAgLyogQmFuayAzIFJlYWQgQWNjZXNzIFRpbWUgPSAxMSBjeWNsZXMgKi8KLSNkZWZpbmUJQjNSQVRfMTIJCTB4MEMwMDAwMDAgIC8qIEJhbmsgMyBSZWFkIEFjY2VzcyBUaW1lID0gMTIgY3ljbGVzICovCi0jZGVmaW5lCUIzUkFUXzEzCQkweDBEMDAwMDAwICAvKiBCYW5rIDMgUmVhZCBBY2Nlc3MgVGltZSA9IDEzIGN5Y2xlcyAqLwotI2RlZmluZQlCM1JBVF8xNAkJMHgwRTAwMDAwMCAgLyogQmFuayAzIFJlYWQgQWNjZXNzIFRpbWUgPSAxNCBjeWNsZXMgKi8KLSNkZWZpbmUJQjNSQVRfMTUJCTB4MEYwMDAwMDAgIC8qIEJhbmsgMyBSZWFkIEFjY2VzcyBUaW1lID0gMTUgY3ljbGVzICovCi0jZGVmaW5lCUIzV0FUXzEJCQkweDEwMDAwMDAwIC8qIEJhbmsgMyBXcml0ZSBBY2Nlc3MgVGltZSA9IDEgY3ljbGUgKi8KLSNkZWZpbmUJQjNXQVRfMgkJCTB4MjAwMDAwMDAgIC8qIEJhbmsgMyBXcml0ZSBBY2Nlc3MgVGltZQk9IDIgY3ljbGVzICovCi0jZGVmaW5lCUIzV0FUXzMJCQkweDMwMDAwMDAwICAvKiBCYW5rIDMgV3JpdGUgQWNjZXNzIFRpbWUJPSAzIGN5Y2xlcyAqLwotI2RlZmluZQlCM1dBVF80CQkJMHg0MDAwMDAwMCAgLyogQmFuayAzIFdyaXRlIEFjY2VzcyBUaW1lCT0gNCBjeWNsZXMgKi8KLSNkZWZpbmUJQjNXQVRfNQkJCTB4NTAwMDAwMDAgIC8qIEJhbmsgMyBXcml0ZSBBY2Nlc3MgVGltZQk9IDUgY3ljbGVzICovCi0jZGVmaW5lCUIzV0FUXzYJCQkweDYwMDAwMDAwICAvKiBCYW5rIDMgV3JpdGUgQWNjZXNzIFRpbWUJPSA2IGN5Y2xlcyAqLwotI2RlZmluZQlCM1dBVF83CQkJMHg3MDAwMDAwMCAgLyogQmFuayAzIFdyaXRlIEFjY2VzcyBUaW1lCT0gNyBjeWNsZXMgKi8KLSNkZWZpbmUJQjNXQVRfOAkJCTB4ODAwMDAwMDAgIC8qIEJhbmsgMyBXcml0ZSBBY2Nlc3MgVGltZQk9IDggY3ljbGVzICovCi0jZGVmaW5lCUIzV0FUXzkJCQkweDkwMDAwMDAwICAvKiBCYW5rIDMgV3JpdGUgQWNjZXNzIFRpbWUJPSA5IGN5Y2xlcyAqLwotI2RlZmluZQlCM1dBVF8xMAkJMHhBMDAwMDAwMCAgLyogQmFuayAzIFdyaXRlIEFjY2VzcyBUaW1lCT0gMTAgY3ljbGVzICovCi0jZGVmaW5lCUIzV0FUXzExCQkweEIwMDAwMDAwICAvKiBCYW5rIDMgV3JpdGUgQWNjZXNzIFRpbWUJPSAxMSBjeWNsZXMgKi8KLSNkZWZpbmUJQjNXQVRfMTIJCTB4QzAwMDAwMDAgIC8qIEJhbmsgMyBXcml0ZSBBY2Nlc3MgVGltZQk9IDEyIGN5Y2xlcyAqLwotI2RlZmluZQlCM1dBVF8xMwkJMHhEMDAwMDAwMCAgLyogQmFuayAzIFdyaXRlIEFjY2VzcyBUaW1lCT0gMTMgY3ljbGVzICovCi0jZGVmaW5lCUIzV0FUXzE0CQkweEUwMDAwMDAwICAvKiBCYW5rIDMgV3JpdGUgQWNjZXNzIFRpbWUJPSAxNCBjeWNsZXMgKi8KLSNkZWZpbmUJQjNXQVRfMTUJCTB4RjAwMDAwMDAgIC8qIEJhbmsgMyBXcml0ZSBBY2Nlc3MgVGltZQk9IDE1IGN5Y2xlcyAqLwotCi0vKiAqKioqKioqKioqKioqKioqKioqKioqICBTRFJBTSBDT05UUk9MTEVSIE1BU0tTICAqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLS8qIEVCSVVfU0RHQ1RMIE1hc2tzICovCi0jZGVmaW5lCVNDVExFCQkJMHgwMDAwMDAwMSAvKiBFbmFibGUgU0NMS1swXSwgL1NSQVMsIC9TQ0FTLCAvU1dFLCBTRFFNWzM6MF0gKi8KLSNkZWZpbmUJQ0xfMgkJCTB4MDAwMDAwMDggLyogU0RSQU0gQ0FTCWxhdGVuY3kJPSAyIGN5Y2xlcyAqLwotI2RlZmluZQlDTF8zCQkJMHgwMDAwMDAwQyAvKiBTRFJBTSBDQVMJbGF0ZW5jeQk9IDMgY3ljbGVzICovCi0jZGVmaW5lCVBGRQkJCQkweDAwMDAwMDEwIC8qIEVuYWJsZSBTRFJBTSBwcmVmZXRjaCAqLwotI2RlZmluZQlQRlAJCQkJMHgwMDAwMDAyMCAvKiBQcmVmZXRjaCBoYXMgcHJpb3JpdHkgb3ZlciBBTUMgcmVxdWVzdHMgKi8KLSNkZWZpbmUJUEFTUl9BTEwJCTB4MDAwMDAwMDAJLyogQWxsIDQgU0RSQU0gQmFua3MgUmVmcmVzaGVkIEluIFNlbGYtUmVmcmVzaCAqLwotI2RlZmluZQlQQVNSX0IwX0IxCQkweDAwMDAwMDEwCS8qIFNEUkFNIEJhbmtzIDAgYW5kIDEgQXJlIFJlZnJlc2hlZCBJbglTZWxmLVJlZnJlc2ggKi8KLSNkZWZpbmUJUEFTUl9CMAkJCTB4MDAwMDAwMjAJLyogT25seQlTRFJBTSBCYW5rIDAgSXMJUmVmcmVzaGVkIEluIFNlbGYtUmVmcmVzaCAqLwotI2RlZmluZQlUUkFTXzEJCQkweDAwMDAwMDQwIC8qIFNEUkFNIHRSQVMgPSAxIGN5Y2xlICovCi0jZGVmaW5lCVRSQVNfMgkJCTB4MDAwMDAwODAgLyogU0RSQU0gdFJBUyA9IDIgY3ljbGVzICovCi0jZGVmaW5lCVRSQVNfMwkJCTB4MDAwMDAwQzAgLyogU0RSQU0gdFJBUyA9IDMgY3ljbGVzICovCi0jZGVmaW5lCVRSQVNfNAkJCTB4MDAwMDAxMDAgLyogU0RSQU0gdFJBUyA9IDQgY3ljbGVzICovCi0jZGVmaW5lCVRSQVNfNQkJCTB4MDAwMDAxNDAgLyogU0RSQU0gdFJBUyA9IDUgY3ljbGVzICovCi0jZGVmaW5lCVRSQVNfNgkJCTB4MDAwMDAxODAgLyogU0RSQU0gdFJBUyA9IDYgY3ljbGVzICovCi0jZGVmaW5lCVRSQVNfNwkJCTB4MDAwMDAxQzAgLyogU0RSQU0gdFJBUyA9IDcgY3ljbGVzICovCi0jZGVmaW5lCVRSQVNfOAkJCTB4MDAwMDAyMDAgLyogU0RSQU0gdFJBUyA9IDggY3ljbGVzICovCi0jZGVmaW5lCVRSQVNfOQkJCTB4MDAwMDAyNDAgLyogU0RSQU0gdFJBUyA9IDkgY3ljbGVzICovCi0jZGVmaW5lCVRSQVNfMTAJCQkweDAwMDAwMjgwIC8qIFNEUkFNIHRSQVMgPSAxMCBjeWNsZXMgKi8KLSNkZWZpbmUJVFJBU18xMQkJCTB4MDAwMDAyQzAgLyogU0RSQU0gdFJBUyA9IDExIGN5Y2xlcyAqLwotI2RlZmluZQlUUkFTXzEyCQkJMHgwMDAwMDMwMCAvKiBTRFJBTSB0UkFTID0gMTIgY3ljbGVzICovCi0jZGVmaW5lCVRSQVNfMTMJCQkweDAwMDAwMzQwIC8qIFNEUkFNIHRSQVMgPSAxMyBjeWNsZXMgKi8KLSNkZWZpbmUJVFJBU18xNAkJCTB4MDAwMDAzODAgLyogU0RSQU0gdFJBUyA9IDE0IGN5Y2xlcyAqLwotI2RlZmluZQlUUkFTXzE1CQkJMHgwMDAwMDNDMCAvKiBTRFJBTSB0UkFTID0gMTUgY3ljbGVzICovCi0jZGVmaW5lCVRSUF8xCQkJMHgwMDAwMDgwMCAvKiBTRFJBTSB0UlAJPSAxIGN5Y2xlICovCi0jZGVmaW5lCVRSUF8yCQkJMHgwMDAwMTAwMCAvKiBTRFJBTSB0UlAJPSAyIGN5Y2xlcyAqLwotI2RlZmluZQlUUlBfMwkJCTB4MDAwMDE4MDAgLyogU0RSQU0gdFJQCT0gMyBjeWNsZXMgKi8KLSNkZWZpbmUJVFJQXzQJCQkweDAwMDAyMDAwIC8qIFNEUkFNIHRSUAk9IDQgY3ljbGVzICovCi0jZGVmaW5lCVRSUF81CQkJMHgwMDAwMjgwMCAvKiBTRFJBTSB0UlAJPSA1IGN5Y2xlcyAqLwotI2RlZmluZQlUUlBfNgkJCTB4MDAwMDMwMDAgLyogU0RSQU0gdFJQCT0gNiBjeWNsZXMgKi8KLSNkZWZpbmUJVFJQXzcJCQkweDAwMDAzODAwIC8qIFNEUkFNIHRSUAk9IDcgY3ljbGVzICovCi0jZGVmaW5lCVRSQ0RfMQkJCTB4MDAwMDgwMDAgLyogU0RSQU0gdFJDRCA9IDEgY3ljbGUgKi8KLSNkZWZpbmUJVFJDRF8yCQkJMHgwMDAxMDAwMCAvKiBTRFJBTSB0UkNEID0gMiBjeWNsZXMgKi8KLSNkZWZpbmUJVFJDRF8zCQkJMHgwMDAxODAwMCAvKiBTRFJBTSB0UkNEID0gMyBjeWNsZXMgKi8KLSNkZWZpbmUJVFJDRF80CQkJMHgwMDAyMDAwMCAvKiBTRFJBTSB0UkNEID0gNCBjeWNsZXMgKi8KLSNkZWZpbmUJVFJDRF81CQkJMHgwMDAyODAwMCAvKiBTRFJBTSB0UkNEID0gNSBjeWNsZXMgKi8KLSNkZWZpbmUJVFJDRF82CQkJMHgwMDAzMDAwMCAvKiBTRFJBTSB0UkNEID0gNiBjeWNsZXMgKi8KLSNkZWZpbmUJVFJDRF83CQkJMHgwMDAzODAwMCAvKiBTRFJBTSB0UkNEID0gNyBjeWNsZXMgKi8KLSNkZWZpbmUJVFdSXzEJCQkweDAwMDgwMDAwIC8qIFNEUkFNIHRXUgk9IDEgY3ljbGUgKi8KLSNkZWZpbmUJVFdSXzIJCQkweDAwMTAwMDAwIC8qIFNEUkFNIHRXUgk9IDIgY3ljbGVzICovCi0jZGVmaW5lCVRXUl8zCQkJMHgwMDE4MDAwMCAvKiBTRFJBTSB0V1IJPSAzIGN5Y2xlcyAqLwotI2RlZmluZQlQVVBTRAkJCTB4MDAyMDAwMDAgLypQb3dlci11cCBzdGFydCBkZWxheSAqLwotI2RlZmluZQlQU00JCQkJMHgwMDQwMDAwMCAvKiBTRFJBTSBwb3dlci11cCBzZXF1ZW5jZSA9CVByZWNoYXJnZSwgbW9kZQlyZWdpc3RlciBzZXQsIDgJQ0JSIHJlZnJlc2ggY3ljbGVzICovCi0jZGVmaW5lCVBTUwkJCQkweDAwODAwMDAwIC8qIGVuYWJsZSBTRFJBTSBwb3dlci11cCBzZXF1ZW5jZSBvbgluZXh0IFNEUkFNIGFjY2VzcyAqLwotI2RlZmluZQlTUkZTCQkJMHgwMTAwMDAwMCAvKiBTdGFydCBTRFJBTSBzZWxmLXJlZnJlc2ggbW9kZSAqLwotI2RlZmluZQlFQlVGRQkJCTB4MDIwMDAwMDAgLyogRW5hYmxlIGV4dGVybmFsIGJ1ZmZlcmluZwl0aW1pbmcgKi8KLSNkZWZpbmUJRkJCUlcJCQkweDA0MDAwMDAwIC8qIEZhc3QgYmFjay10by1iYWNrCXJlYWQgd3JpdGUgZW5hYmxlICovCi0jZGVmaW5lCUVNUkVOCQkJMHgxMDAwMDAwMCAvKiBFeHRlbmRlZCBtb2RlIHJlZ2lzdGVyIGVuYWJsZSAqLwotI2RlZmluZQlUQ1NSCQkJMHgyMDAwMDAwMCAvKiBUZW1wIGNvbXBlbnNhdGVkIHNlbGYgcmVmcmVzaCB2YWx1ZSA4NSBkZWcgQyAqLwotI2RlZmluZQlDRERCRwkJCTB4NDAwMDAwMDAgLyogVHJpc3RhdGUgU0RSQU0gY29udHJvbHMgZHVyaW5nIGJ1cyBncmFudCAqLwotCi0vKiBFQklVX1NEQkNUTCBNYXNrcyAqLwotI2RlZmluZQlFQkUJCQkJMHgwMDAwMDAwMSAvKiBFbmFibGUgU0RSQU0gZXh0ZXJuYWwgYmFuayAqLwotI2RlZmluZQlFQlNaXzE2CQkJMHgwMDAwMDAwMCAvKiBTRFJBTSBleHRlcm5hbCBiYW5rIHNpemUgPSAxNk1CICovCi0jZGVmaW5lCUVCU1pfMzIJCQkweDAwMDAwMDAyIC8qIFNEUkFNIGV4dGVybmFsIGJhbmsgc2l6ZSA9IDMyTUIgKi8KLSNkZWZpbmUJRUJTWl82NAkJCTB4MDAwMDAwMDQgLyogU0RSQU0gZXh0ZXJuYWwgYmFuayBzaXplID0gNjRNQiAqLwotI2RlZmluZQlFQlNaXzEyOAkJMHgwMDAwMDAwNiAvKiBTRFJBTSBleHRlcm5hbCBiYW5rIHNpemUgPSAxMjhNQiAqLwotI2RlZmluZQlFQlNaXzI1NgkJMHgwMDAwMDAwOCAvKiBTRFJBTSBFeHRlcm5hbCBCYW5rIFNpemUgPSAyNTZNQiAqLwotI2RlZmluZQlFQlNaXzUxMgkJMHgwMDAwMDAwQSAvKiBTRFJBTSBFeHRlcm5hbCBCYW5rIFNpemUgPSA1MTJNQiAqLwotI2RlZmluZQlFQkNBV184CQkJMHgwMDAwMDAwMCAvKiBTRFJBTSBleHRlcm5hbCBiYW5rIGNvbHVtbiBhZGRyZXNzIHdpZHRoID0gOCBiaXRzICovCi0jZGVmaW5lCUVCQ0FXXzkJCQkweDAwMDAwMDEwIC8qIFNEUkFNIGV4dGVybmFsIGJhbmsgY29sdW1uIGFkZHJlc3Mgd2lkdGggPSA5IGJpdHMgKi8KLSNkZWZpbmUJRUJDQVdfMTAJCTB4MDAwMDAwMjAgLyogU0RSQU0gZXh0ZXJuYWwgYmFuayBjb2x1bW4gYWRkcmVzcyB3aWR0aCA9IDkgYml0cyAqLwotI2RlZmluZQlFQkNBV18xMQkJMHgwMDAwMDAzMCAvKiBTRFJBTSBleHRlcm5hbCBiYW5rIGNvbHVtbiBhZGRyZXNzIHdpZHRoID0gOSBiaXRzICovCi0KLS8qIEVCSVVfU0RTVEFUIE1hc2tzICovCi0jZGVmaW5lCVNEQ0kJCQkweDAwMDAwMDAxIC8qIFNEUkFNIGNvbnRyb2xsZXIgaXMgaWRsZSAqLwotI2RlZmluZQlTRFNSQQkJCTB4MDAwMDAwMDIgLyogU0RSQU0gU0RSQU0gc2VsZiByZWZyZXNoIGlzIGFjdGl2ZSAqLwotI2RlZmluZQlTRFBVQQkJCTB4MDAwMDAwMDQgLyogU0RSQU0gcG93ZXIgdXAgYWN0aXZlICAqLwotI2RlZmluZQlTRFJTCQkJMHgwMDAwMDAwOCAvKiBTRFJBTSBpcyBpbiByZXNldAlzdGF0ZSAqLwotI2RlZmluZQlTREVBU0UJCQkweDAwMDAwMDEwIC8qIFNEUkFNIEVBQglzdGlja3kgZXJyb3Igc3RhdHVzIC0gVzFDICovCi0jZGVmaW5lCUJHU1RBVAkJCTB4MDAwMDAwMjAgLyogQnVzIGdyYW50ZWQgKi8KLQotCi0vKiAgKioqKioqKioqKioqKioqKioqKiogIFRXTy1XSVJFIElOVEVSRkFDRSAoVFdJeCkgTUFTS1MgICoqKioqKioqKioqKioqKioqKioqKioqLwotLyogVFdJeF9DTEtESVYgTWFjcm9zIChVc2U6ICpwVFdJeF9DTEtESVYgPSBDTEtMT1coeCl8Q0xLSEkoeSk7CSApICovCi0jaWZkZWYgX01JU1JBX1JVTEVTCi0jZGVmaW5lCUNMS0xPVyh4KQkoKHgpICYgMHhGRnUpCQkvKiBQZXJpb2RzIENsb2NrIElzIEhlbGQgTG93ICovCi0jZGVmaW5lCUNMS0hJKHkpCSgoKHkpJjB4RkZ1KTw8MHg4KQkvKiBQZXJpb2RzIEJlZm9yZSBOZXcgQ2xvY2sgTG93ICovCi0jZWxzZQotI2RlZmluZQlDTEtMT1coeCkJKCh4KSAmIDB4RkYpCQkvKiBQZXJpb2RzIENsb2NrIElzIEhlbGQgTG93ICovCi0jZGVmaW5lCUNMS0hJKHkpCSgoKHkpJjB4RkYpPDwweDgpCS8qIFBlcmlvZHMgQmVmb3JlIE5ldyBDbG9jayBMb3cgKi8KLSNlbmRpZiAvKiBfTUlTUkFfUlVMRVMgKi8KLQotLyogVFdJeF9QUkVTQ0FMRSBNYXNrcwkJCQkJCQkJICovCi0jZGVmaW5lCVBSRVNDQUxFCTB4MDA3RgkJLyogU0NMS3MgUGVyIEludGVybmFsIFRpbWUgUmVmZXJlbmNlICgxME1IeikgKi8KLSNkZWZpbmUJVFdJX0VOQQkJMHgwMDgwCQkvKiBUV0kgRW5hYmxlCQkgKi8KLSNkZWZpbmUJU0NDQgkJMHgwMjAwCQkvKiBTQ0NCCUNvbXBhdGliaWxpdHkgRW5hYmxlICovCi0KLS8qIFRXSXhfU0xBVkVfQ1RSTCBNYXNrcwkJCQkJCQkJICovCi0jZGVmaW5lCVNFTgkJCTB4MDAwMQkJLyogU2xhdmUgRW5hYmxlCQkgKi8KLSNkZWZpbmUJU0FERF9MRU4JMHgwMDAyCQkvKiBTbGF2ZSBBZGRyZXNzIExlbmd0aCAqLwotI2RlZmluZQlTVERWQUwJCTB4MDAwNAkJLyogU2xhdmUgVHJhbnNtaXQgRGF0YSBWYWxpZCAqLwotI2RlZmluZQlOQUsJCQkweDAwMDgJCS8qIE5BSy9BQ0sqIEdlbmVyYXRlZCBBdCBDb25jbHVzaW9uIE9mIFRyYW5zZmVyICovCi0jZGVmaW5lCUdFTgkJCTB4MDAxMAkJLyogR2VuZXJhbCBDYWxsCUFkcnJlc3MJTWF0Y2hpbmcgRW5hYmxlZCAqLwotCi0vKiBUV0l4X1NMQVZFX1NUQVQgTWFza3MJCQkJCQkJCSAqLwotI2RlZmluZQlTRElSCQkweDAwMDEJCS8qIFNsYXZlIFRyYW5zZmVyIERpcmVjdGlvbiAoVHJhbnNtaXQvUmVjZWl2ZSopICovCi0jZGVmaW5lCUdDQUxMCQkweDAwMDIJCS8qIEdlbmVyYWwgQ2FsbAlJbmRpY2F0b3IgKi8KLQotLyogVFdJeF9NQVNURVJfQ1RSTCBNYXNrcwkJCQkJCSAqLwotI2RlZmluZQlNRU4JCQkweDAwMDEJCS8qIE1hc3RlciBNb2RlIEVuYWJsZSAqLwotI2RlZmluZQlNQUREX0xFTgkweDAwMDIJCS8qIE1hc3RlciBBZGRyZXNzIExlbmd0aCAqLwotI2RlZmluZQlNRElSCQkweDAwMDQJCS8qIE1hc3RlciBUcmFuc21pdCBEaXJlY3Rpb24gKFJYL1RYKikgKi8KLSNkZWZpbmUJRkFTVAkJMHgwMDA4CQkvKiBVc2UgRmFzdCBNb2RlIFRpbWluZwlTcGVjcyAqLwotI2RlZmluZQlTVE9QCQkweDAwMTAJCS8qIElzc3VlIFN0b3AgQ29uZGl0aW9uICovCi0jZGVmaW5lCVJTVEFSVAkJMHgwMDIwCQkvKiBSZXBlYXQgU3RhcnQJb3IgU3RvcCogQXQgRW5kCU9mIFRyYW5zZmVyICovCi0jZGVmaW5lCURDTlQJCTB4M0ZDMAkJLyogRGF0YQlCeXRlcyBUbyBUcmFuc2ZlciAqLwotI2RlZmluZQlTREFPVlIJCTB4NDAwMAkJLyogU2VyaWFsIERhdGEgT3ZlcnJpZGUgKi8KLSNkZWZpbmUJU0NMT1ZSCQkweDgwMDAJCS8qIFNlcmlhbCBDbG9jawlPdmVycmlkZSAqLwotCi0vKiBUV0l4X01BU1RFUl9TVEFUIE1hc2tzCQkJCQkJCSAqLwotI2RlZmluZQlNUFJPRwkJMHgwMDAxCQkvKiBNYXN0ZXIgVHJhbnNmZXIgSW4gUHJvZ3Jlc3MgKi8KLSNkZWZpbmUJTE9TVEFSQgkJMHgwMDAyCQkvKiBMb3N0CUFyYml0cmF0aW9uIEluZGljYXRvciAoWGZlciBBYm9ydGVkKSAqLwotI2RlZmluZQlBTkFLCQkweDAwMDQJCS8qIEFkZHJlc3MgTm90IEFja25vd2xlZGdlZCAqLwotI2RlZmluZQlETkFLCQkweDAwMDgJCS8qIERhdGEJTm90IEFja25vd2xlZGdlZCAqLwotI2RlZmluZQlCVUZSREVSUgkweDAwMTAJCS8qIEJ1ZmZlciBSZWFkIEVycm9yICovCi0jZGVmaW5lCUJVRldSRVJSCTB4MDAyMAkJLyogQnVmZmVyIFdyaXRlCUVycm9yICovCi0jZGVmaW5lCVNEQVNFTgkJMHgwMDQwCQkvKiBTZXJpYWwgRGF0YSBTZW5zZSAqLwotI2RlZmluZQlTQ0xTRU4JCTB4MDA4MAkJLyogU2VyaWFsIENsb2NrCVNlbnNlICovCi0jZGVmaW5lCUJVU0JVU1kJCTB4MDEwMAkJLyogQnVzIEJ1c3kgSW5kaWNhdG9yICovCi0KLS8qIFRXSXhfSU5UX1NSQwlhbmQgVFdJeF9JTlRfRU5BQkxFIE1hc2tzICovCi0jZGVmaW5lCVNJTklUCQkweDAwMDEJCS8qIFNsYXZlIFRyYW5zZmVyIEluaXRpYXRlZCAqLwotI2RlZmluZQlTQ09NUAkJMHgwMDAyCQkvKiBTbGF2ZSBUcmFuc2ZlciBDb21wbGV0ZSAqLwotI2RlZmluZQlTRVJSCQkweDAwMDQJCS8qIFNsYXZlIFRyYW5zZmVyIEVycm9yICovCi0jZGVmaW5lCVNPVkYJCTB4MDAwOAkJLyogU2xhdmUgT3ZlcmZsb3cgKi8KLSNkZWZpbmUJTUNPTVAJCTB4MDAxMAkJLyogTWFzdGVyIFRyYW5zZmVyIENvbXBsZXRlICovCi0jZGVmaW5lCU1FUlIJCTB4MDAyMAkJLyogTWFzdGVyIFRyYW5zZmVyIEVycm9yICovCi0jZGVmaW5lCVhNVFNFUlYJCTB4MDA0MAkJLyogVHJhbnNtaXQgRklGTyBTZXJ2aWNlICovCi0jZGVmaW5lCVJDVlNFUlYJCTB4MDA4MAkJLyogUmVjZWl2ZSBGSUZPCVNlcnZpY2UgKi8KLQotLyogVFdJeF9GSUZPX0NUTCBNYXNrcwkJCQkJICovCi0jZGVmaW5lCVhNVEZMVVNICTB4MDAwMQkJLyogVHJhbnNtaXQgQnVmZmVyIEZsdXNoICovCi0jZGVmaW5lCVJDVkZMVVNICTB4MDAwMgkJLyogUmVjZWl2ZSBCdWZmZXIgRmx1c2ggKi8KLSNkZWZpbmUJWE1USU5UTEVOCTB4MDAwNAkJLyogVHJhbnNtaXQgQnVmZmVyIEludGVycnVwdCBMZW5ndGggKi8KLSNkZWZpbmUJUkNWSU5UTEVOCTB4MDAwOAkJLyogUmVjZWl2ZSBCdWZmZXIgSW50ZXJydXB0IExlbmd0aCAqLwotCi0vKiBUV0l4X0ZJRk9fU1RBVCBNYXNrcwkJCQkJCQkJICovCi0jZGVmaW5lCVhNVFNUQVQJCTB4MDAwMwkJLyogVHJhbnNtaXQgRklGTyBTdGF0dXMgKi8KLSNkZWZpbmUJWE1UX0VNUFRZCTB4MDAwMAkJLyoJCVRyYW5zbWl0IEZJRk8gRW1wdHkgKi8KLSNkZWZpbmUJWE1UX0hBTEYJMHgwMDAxCQkvKgkJVHJhbnNtaXQgRklGTyBIYXMgMSBCeXRlIFRvIFdyaXRlICovCi0jZGVmaW5lCVhNVF9GVUxMCTB4MDAwMwkJLyoJCVRyYW5zbWl0IEZJRk8gRnVsbCAoMiBCeXRlcyBUbyBXcml0ZSkgKi8KLQotI2RlZmluZQlSQ1ZTVEFUCQkweDAwMEMJCS8qIFJlY2VpdmUgRklGTwlTdGF0dXMgKi8KLSNkZWZpbmUJUkNWX0VNUFRZCTB4MDAwMAkJLyoJCVJlY2VpdmUJRklGTyBFbXB0eSAqLwotI2RlZmluZQlSQ1ZfSEFMRgkweDAwMDQJCS8qCQlSZWNlaXZlCUZJRk8gSGFzIDEgQnl0ZQlUbyBSZWFkICovCi0jZGVmaW5lCVJDVl9GVUxMCTB4MDAwQwkJLyoJCVJlY2VpdmUJRklGTyBGdWxsICgyIEJ5dGVzIFRvIFJlYWQpICovCi0KICNlbmRpZiAvKiBfREVGX0JGNTM5X0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzOC9pbmNsdWRlL21hY2gvZ3Bpby5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM4L2luY2x1ZGUvbWFjaC9ncGlvLmgKaW5kZXggYmQ5YWRiNy4uOGE1YmVlZSAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM4L2luY2x1ZGUvbWFjaC9ncGlvLmgKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM4L2luY2x1ZGUvbWFjaC9ncGlvLmgKQEAgLTcwLDQgKzcwLDkgQEAKICNkZWZpbmUgUE9SVF9EIEdQSU9fUEQwCiAjZGVmaW5lIFBPUlRfRSBHUElPX1BFMAogCisjaW5jbHVkZSA8bWFjaC1jb21tb24vcG9ydHMtYy5oPgorI2luY2x1ZGUgPG1hY2gtY29tbW9uL3BvcnRzLWQuaD4KKyNpbmNsdWRlIDxtYWNoLWNvbW1vbi9wb3J0cy1lLmg+CisjaW5jbHVkZSA8bWFjaC1jb21tb24vcG9ydHMtZi5oPgorCiAjZW5kaWYgLyogX01BQ0hfR1BJT19IXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM4L2luY2x1ZGUvbWFjaC9wbGwuaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzOC9pbmNsdWRlL21hY2gvcGxsLmgKaW5kZXggYjMwYmJjZC4uOTRjY2E2NyAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM4L2luY2x1ZGUvbWFjaC9wbGwuaAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzgvaW5jbHVkZS9tYWNoL3BsbC5oCkBAIC0xLDYzICsxIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDgtMjAwOSBBbmFsb2cgRGV2aWNlcyBJbmMuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgotICovCi0KLSNpZm5kZWYgX01BQ0hfUExMX0gKLSNkZWZpbmUgX01BQ0hfUExMX0gKLQotI2luY2x1ZGUgPGFzbS9ibGFja2Zpbi5oPgotI2luY2x1ZGUgPGFzbS9pcnFmbGFncy5oPgotCi0vKiBXcml0aW5nIHRvIFBMTF9DVEwgaW5pdGlhdGVzIGEgUExMIHJlbG9jayBzZXF1ZW5jZS4gKi8KLXN0YXRpYyBfX2lubGluZV9fIHZvaWQgYmZpbl93cml0ZV9QTExfQ1RMKHVuc2lnbmVkIGludCB2YWwpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFncywgaXdyMCwgaXdyMTsKLQotCWlmICh2YWwgPT0gYmZpbl9yZWFkX1BMTF9DVEwoKSkKLQkJcmV0dXJuOwotCi0JZmxhZ3MgPSBoYXJkX2xvY2FsX2lycV9zYXZlKCk7Ci0JLyogRW5hYmxlIHRoZSBQTEwgV2FrZXVwIGJpdCBpbiBTSUMgSVdSICovCi0JaXdyMCA9IGJmaW5fcmVhZDMyKFNJQ19JV1IwKTsKLQlpd3IxID0gYmZpbl9yZWFkMzIoU0lDX0lXUjEpOwotCS8qIE9ubHkgYWxsb3cgUFBMIFdha2V1cCkgKi8KLQliZmluX3dyaXRlMzIoU0lDX0lXUjAsIElXUl9FTkFCTEUoMCkpOwotCWJmaW5fd3JpdGUzMihTSUNfSVdSMSwgMCk7Ci0KLQliZmluX3dyaXRlMTYoUExMX0NUTCwgdmFsKTsKLQlTU1lOQygpOwotCWFzbSgiSURMRTsiKTsKLQotCWJmaW5fd3JpdGUzMihTSUNfSVdSMCwgaXdyMCk7Ci0JYmZpbl93cml0ZTMyKFNJQ19JV1IxLCBpd3IxKTsKLQloYXJkX2xvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLX0KLQotLyogV3JpdGluZyB0byBWUl9DVEwgaW5pdGlhdGVzIGEgUExMIHJlbG9jayBzZXF1ZW5jZS4gKi8KLXN0YXRpYyBfX2lubGluZV9fIHZvaWQgYmZpbl93cml0ZV9WUl9DVEwodW5zaWduZWQgaW50IHZhbCkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzLCBpd3IwLCBpd3IxOwotCi0JaWYgKHZhbCA9PSBiZmluX3JlYWRfVlJfQ1RMKCkpCi0JCXJldHVybjsKLQotCWZsYWdzID0gaGFyZF9sb2NhbF9pcnFfc2F2ZSgpOwotCS8qIEVuYWJsZSB0aGUgUExMIFdha2V1cCBiaXQgaW4gU0lDIElXUiAqLwotCWl3cjAgPSBiZmluX3JlYWQzMihTSUNfSVdSMCk7Ci0JaXdyMSA9IGJmaW5fcmVhZDMyKFNJQ19JV1IxKTsKLQkvKiBPbmx5IGFsbG93IFBQTCBXYWtldXApICovCi0JYmZpbl93cml0ZTMyKFNJQ19JV1IwLCBJV1JfRU5BQkxFKDApKTsKLQliZmluX3dyaXRlMzIoU0lDX0lXUjEsIDApOwotCi0JYmZpbl93cml0ZTE2KFZSX0NUTCwgdmFsKTsKLQlTU1lOQygpOwotCWFzbSgiSURMRTsiKTsKLQotCWJmaW5fd3JpdGUzMihTSUNfSVdSMCwgaXdyMCk7Ci0JYmZpbl93cml0ZTMyKFNJQ19JV1IxLCBpd3IxKTsKLQloYXJkX2xvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLX0KLQotI2VuZGlmIC8qIF9NQUNIX1BMTF9IICovCisjaW5jbHVkZSA8bWFjaC1jb21tb24vcGxsLmg+CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvYm9hcmRzL2NtX2JmNTQ4LmMgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvYm9hcmRzL2NtX2JmNTQ4LmMKaW5kZXggNGMyZWU2Ny4uZDExNTAyYSAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2JvYXJkcy9jbV9iZjU0OC5jCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9ib2FyZHMvY21fYmY1NDguYwpAQCAtMTU2LDcgKzE1Niw3IEBACiAJfSwKIH07CiAKLXVuc2lnbmVkIHNob3J0IGJmaW5fdWFydDBfcGVyaXBoZXJhbHNbXSA9IHsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBiZmluX3VhcnQwX3BlcmlwaGVyYWxzW10gPSB7CiAJUF9VQVJUMF9UWCwgUF9VQVJUMF9SWCwgMAogfTsKIApAQCAtMjExLDcgKzIxMSw3IEBACiAjZW5kaWYKIH07CiAKLXVuc2lnbmVkIHNob3J0IGJmaW5fdWFydDFfcGVyaXBoZXJhbHNbXSA9IHsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBiZmluX3VhcnQxX3BlcmlwaGVyYWxzW10gPSB7CiAJUF9VQVJUMV9UWCwgUF9VQVJUMV9SWCwKICNpZmRlZiBDT05GSUdfQkZJTl9VQVJUMV9DVFNSVFMKIAlQX1VBUlQxX1JUUywgUF9VQVJUMV9DVFMsCkBAIC0yNTgsNyArMjU4LDcgQEAKIAl9LAogfTsKIAotdW5zaWduZWQgc2hvcnQgYmZpbl91YXJ0Ml9wZXJpcGhlcmFsc1tdID0geworc3RhdGljIHVuc2lnbmVkIHNob3J0IGJmaW5fdWFydDJfcGVyaXBoZXJhbHNbXSA9IHsKIAlQX1VBUlQyX1RYLCBQX1VBUlQyX1JYLCAwCiB9OwogCkBAIC0zMTMsNyArMzEzLDcgQEAKICNlbmRpZgogfTsKIAotdW5zaWduZWQgc2hvcnQgYmZpbl91YXJ0M19wZXJpcGhlcmFsc1tdID0geworc3RhdGljIHVuc2lnbmVkIHNob3J0IGJmaW5fdWFydDNfcGVyaXBoZXJhbHNbXSA9IHsKIAlQX1VBUlQzX1RYLCBQX1VBUlQzX1JYLAogI2lmZGVmIENPTkZJR19CRklOX1VBUlQzX0NUU1JUUwogCVBfVUFSVDNfUlRTLCBQX1VBUlQzX0NUUywKQEAgLTUwNCw2ICs1MDQsNyBAQAogCSAqIGlmIGl0IGlzIHRoZSBjYXNlLgogCSAqLwogCS5ncGlvX3Zyc2VsX2FjdGl2ZQk9IDEsCisJLmNsa2luICAgICAgICAgID0gMjQsICAgICAgICAgICAvKiBtdXNiIENMS0lOIGluIE1IWiAqLwogfTsKIAogc3RhdGljIHN0cnVjdCBtdXNiX2hkcmNfcGxhdGZvcm1fZGF0YSBtdXNiX3BsYXQgPSB7CkBAIC01NTIsOSArNTUzLDkgQEAKIAl9LAogfTsKIAotdW5zaWduZWQgc2hvcnQgYmZpbl9zcG9ydDBfcGVyaXBoZXJhbHNbXSA9IHsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBiZmluX3Nwb3J0MF9wZXJpcGhlcmFsc1tdID0gewogCVBfU1BPUlQwX1RGUywgUF9TUE9SVDBfRFRQUkksIFBfU1BPUlQwX1RTQ0xLLCBQX1NQT1JUMF9SRlMsCi0JUF9TUE9SVDBfRFJQUkksIFBfU1BPUlQwX1JTQ0xLLCBQX1NQT1JUMF9EUlNFQywgUF9TUE9SVDBfRFRTRUMsIDAKKwlQX1NQT1JUMF9EUlBSSSwgUF9TUE9SVDBfUlNDTEssIDAKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGJmaW5fc3BvcnQwX3VhcnRfZGV2aWNlID0gewpAQCAtNTg2LDkgKzU4Nyw5IEBACiAJfSwKIH07CiAKLXVuc2lnbmVkIHNob3J0IGJmaW5fc3BvcnQxX3BlcmlwaGVyYWxzW10gPSB7CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgYmZpbl9zcG9ydDFfcGVyaXBoZXJhbHNbXSA9IHsKIAlQX1NQT1JUMV9URlMsIFBfU1BPUlQxX0RUUFJJLCBQX1NQT1JUMV9UU0NMSywgUF9TUE9SVDFfUkZTLAotCVBfU1BPUlQxX0RSUFJJLCBQX1NQT1JUMV9SU0NMSywgUF9TUE9SVDFfRFJTRUMsIFBfU1BPUlQxX0RUU0VDLCAwCisJUF9TUE9SVDFfRFJQUkksIFBfU1BPUlQxX1JTQ0xLLCAwCiB9OwogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZmluX3Nwb3J0MV91YXJ0X2RldmljZSA9IHsKQEAgLTYyMCw3ICs2MjEsNyBAQAogCX0sCiB9OwogCi11bnNpZ25lZCBzaG9ydCBiZmluX3Nwb3J0Ml9wZXJpcGhlcmFsc1tdID0geworc3RhdGljIHVuc2lnbmVkIHNob3J0IGJmaW5fc3BvcnQyX3BlcmlwaGVyYWxzW10gPSB7CiAJUF9TUE9SVDJfVEZTLCBQX1NQT1JUMl9EVFBSSSwgUF9TUE9SVDJfVFNDTEssIFBfU1BPUlQyX1JGUywKIAlQX1NQT1JUMl9EUlBSSSwgUF9TUE9SVDJfUlNDTEssIFBfU1BPUlQyX0RSU0VDLCBQX1NQT1JUMl9EVFNFQywgMAogfTsKQEAgLTY1NCw3ICs2NTUsNyBAQAogCX0sCiB9OwogCi11bnNpZ25lZCBzaG9ydCBiZmluX3Nwb3J0M19wZXJpcGhlcmFsc1tdID0geworc3RhdGljIHVuc2lnbmVkIHNob3J0IGJmaW5fc3BvcnQzX3BlcmlwaGVyYWxzW10gPSB7CiAJUF9TUE9SVDNfVEZTLCBQX1NQT1JUM19EVFBSSSwgUF9TUE9SVDNfVFNDTEssIFBfU1BPUlQzX1JGUywKIAlQX1NQT1JUM19EUlBSSSwgUF9TUE9SVDNfUlNDTEssIFBfU1BPUlQzX0RSU0VDLCBQX1NQT1JUM19EVFNFQywgMAogfTsKQEAgLTc1Niw3ICs3NTcsNyBAQAogI2VuZGlmCiAKICNpZiBkZWZpbmVkKENPTkZJR19DQU5fQkZJTikgfHwgZGVmaW5lZChDT05GSUdfQ0FOX0JGSU5fTU9EVUxFKQotdW5zaWduZWQgc2hvcnQgYmZpbl9jYW5fcGVyaXBoZXJhbHNbXSA9IHsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBiZmluX2Nhbl9wZXJpcGhlcmFsc1tdID0gewogCVBfQ0FOMF9SWCwgUF9DQU4wX1RYLCAwCiB9OwogCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvYm9hcmRzL2V6a2l0LmMgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvYm9hcmRzL2V6a2l0LmMKaW5kZXggNGYwM2ZiYy4uY2U1YTJiYiAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2JvYXJkcy9lemtpdC5jCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9ib2FyZHMvZXpraXQuYwpAQCAtMjYxLDcgKzI2MSw3IEBACiAJfSwKIH07CiAKLXVuc2lnbmVkIHNob3J0IGJmaW5fdWFydDBfcGVyaXBoZXJhbHNbXSA9IHsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBiZmluX3VhcnQwX3BlcmlwaGVyYWxzW10gPSB7CiAJUF9VQVJUMF9UWCwgUF9VQVJUMF9SWCwgMAogfTsKIApAQCAtMzE2LDcgKzMxNiw3IEBACiAjZW5kaWYKIH07CiAKLXVuc2lnbmVkIHNob3J0IGJmaW5fdWFydDFfcGVyaXBoZXJhbHNbXSA9IHsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBiZmluX3VhcnQxX3BlcmlwaGVyYWxzW10gPSB7CiAJUF9VQVJUMV9UWCwgUF9VQVJUMV9SWCwKICNpZmRlZiBDT05GSUdfQkZJTl9VQVJUMV9DVFNSVFMKIAlQX1VBUlQxX1JUUywgUF9VQVJUMV9DVFMsCkBAIC0zNjMsNyArMzYzLDcgQEAKIAl9LAogfTsKIAotdW5zaWduZWQgc2hvcnQgYmZpbl91YXJ0Ml9wZXJpcGhlcmFsc1tdID0geworc3RhdGljIHVuc2lnbmVkIHNob3J0IGJmaW5fdWFydDJfcGVyaXBoZXJhbHNbXSA9IHsKIAlQX1VBUlQyX1RYLCBQX1VBUlQyX1JYLCAwCiB9OwogCkBAIC00MTgsNyArNDE4LDcgQEAKICNlbmRpZgogfTsKIAotdW5zaWduZWQgc2hvcnQgYmZpbl91YXJ0M19wZXJpcGhlcmFsc1tdID0geworc3RhdGljIHVuc2lnbmVkIHNob3J0IGJmaW5fdWFydDNfcGVyaXBoZXJhbHNbXSA9IHsKIAlQX1VBUlQzX1RYLCBQX1VBUlQzX1JYLAogI2lmZGVmIENPTkZJR19CRklOX1VBUlQzX0NUU1JUUwogCVBfVUFSVDNfUlRTLCBQX1VBUlQzX0NUUywKQEAgLTYwOSw2ICs2MDksNyBAQAogCSAqIGlmIGl0IGlzIHRoZSBjYXNlLgogCSAqLwogCS5ncGlvX3Zyc2VsX2FjdGl2ZQk9IDEsCisJLmNsa2luICAgICAgICAgID0gMjQsICAgICAgICAgICAvKiBtdXNiIENMS0lOIGluIE1IWiAqLwogfTsKIAogc3RhdGljIHN0cnVjdCBtdXNiX2hkcmNfcGxhdGZvcm1fZGF0YSBtdXNiX3BsYXQgPSB7CkBAIC02NTcsOSArNjU4LDkgQEAKIAl9LAogfTsKIAotdW5zaWduZWQgc2hvcnQgYmZpbl9zcG9ydDBfcGVyaXBoZXJhbHNbXSA9IHsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBiZmluX3Nwb3J0MF9wZXJpcGhlcmFsc1tdID0gewogCVBfU1BPUlQwX1RGUywgUF9TUE9SVDBfRFRQUkksIFBfU1BPUlQwX1RTQ0xLLCBQX1NQT1JUMF9SRlMsCi0JUF9TUE9SVDBfRFJQUkksIFBfU1BPUlQwX1JTQ0xLLCBQX1NQT1JUMF9EUlNFQywgUF9TUE9SVDBfRFRTRUMsIDAKKwlQX1NQT1JUMF9EUlBSSSwgUF9TUE9SVDBfUlNDTEssIDAKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGJmaW5fc3BvcnQwX3VhcnRfZGV2aWNlID0gewpAQCAtNjkxLDkgKzY5Miw5IEBACiAJfSwKIH07CiAKLXVuc2lnbmVkIHNob3J0IGJmaW5fc3BvcnQxX3BlcmlwaGVyYWxzW10gPSB7CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgYmZpbl9zcG9ydDFfcGVyaXBoZXJhbHNbXSA9IHsKIAlQX1NQT1JUMV9URlMsIFBfU1BPUlQxX0RUUFJJLCBQX1NQT1JUMV9UU0NMSywgUF9TUE9SVDFfUkZTLAotCVBfU1BPUlQxX0RSUFJJLCBQX1NQT1JUMV9SU0NMSywgUF9TUE9SVDFfRFJTRUMsIFBfU1BPUlQxX0RUU0VDLCAwCisJUF9TUE9SVDFfRFJQUkksIFBfU1BPUlQxX1JTQ0xLLCAwCiB9OwogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZmluX3Nwb3J0MV91YXJ0X2RldmljZSA9IHsKQEAgLTcyNSw3ICs3MjYsNyBAQAogCX0sCiB9OwogCi11bnNpZ25lZCBzaG9ydCBiZmluX3Nwb3J0Ml9wZXJpcGhlcmFsc1tdID0geworc3RhdGljIHVuc2lnbmVkIHNob3J0IGJmaW5fc3BvcnQyX3BlcmlwaGVyYWxzW10gPSB7CiAJUF9TUE9SVDJfVEZTLCBQX1NQT1JUMl9EVFBSSSwgUF9TUE9SVDJfVFNDTEssIFBfU1BPUlQyX1JGUywKIAlQX1NQT1JUMl9EUlBSSSwgUF9TUE9SVDJfUlNDTEssIFBfU1BPUlQyX0RSU0VDLCBQX1NQT1JUMl9EVFNFQywgMAogfTsKQEAgLTc1OSw3ICs3NjAsNyBAQAogCX0sCiB9OwogCi11bnNpZ25lZCBzaG9ydCBiZmluX3Nwb3J0M19wZXJpcGhlcmFsc1tdID0geworc3RhdGljIHVuc2lnbmVkIHNob3J0IGJmaW5fc3BvcnQzX3BlcmlwaGVyYWxzW10gPSB7CiAJUF9TUE9SVDNfVEZTLCBQX1NQT1JUM19EVFBSSSwgUF9TUE9SVDNfVFNDTEssIFBfU1BPUlQzX1JGUywKIAlQX1NQT1JUM19EUlBSSSwgUF9TUE9SVDNfUlNDTEssIFBfU1BPUlQzX0RSU0VDLCBQX1NQT1JUM19EVFNFQywgMAogfTsKQEAgLTc3Nyw3ICs3NzgsNyBAQAogI2VuZGlmCiAKICNpZiBkZWZpbmVkKENPTkZJR19DQU5fQkZJTikgfHwgZGVmaW5lZChDT05GSUdfQ0FOX0JGSU5fTU9EVUxFKQotdW5zaWduZWQgc2hvcnQgYmZpbl9jYW5fcGVyaXBoZXJhbHNbXSA9IHsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBiZmluX2Nhbl9wZXJpcGhlcmFsc1tdID0gewogCVBfQ0FOMF9SWCwgUF9DQU4wX1RYLCAwCiB9OwogCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvZG1hLmMgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvZG1hLmMKaW5kZXggODg4YjljYy4uNjllYWQzMyAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2RtYS5jCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9kbWEuYwpAQCAtMTEsNyArMTEsNyBAQAogI2luY2x1ZGUgPGFzbS9ibGFja2Zpbi5oPgogI2luY2x1ZGUgPGFzbS9kbWEuaD4KIAotc3RydWN0IGRtYV9yZWdpc3RlciAqZG1hX2lvX2Jhc2VfYWRkcltNQVhfRE1BX0NIQU5ORUxTXSA9IHsKK3N0cnVjdCBkbWFfcmVnaXN0ZXIgKiBjb25zdCBkbWFfaW9fYmFzZV9hZGRyW01BWF9ETUFfQ0hBTk5FTFNdID0gewogCShzdHJ1Y3QgZG1hX3JlZ2lzdGVyICopIERNQTBfTkVYVF9ERVNDX1BUUiwKIAkoc3RydWN0IGRtYV9yZWdpc3RlciAqKSBETUExX05FWFRfREVTQ19QVFIsCiAJKHN0cnVjdCBkbWFfcmVnaXN0ZXIgKikgRE1BMl9ORVhUX0RFU0NfUFRSLApkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2luY2x1ZGUvbWFjaC9iZmluX3NlcmlhbC5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2luY2x1ZGUvbWFjaC9iZmluX3NlcmlhbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3NzEwOWYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvaW5jbHVkZS9tYWNoL2JmaW5fc2VyaWFsLmgKQEAgLTAsMCArMSwxNiBAQAorLyoKKyAqIG1hY2gvYmZpbl9zZXJpYWwuaCAtIEJsYWNrZmluIFVBUlQvU2VyaWFsIGRlZmluaXRpb25zCisgKgorICogQ29weXJpZ2h0IDIwMDYtMjAxMCBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgorICovCisKKyNpZm5kZWYgX19CRklOX01BQ0hfU0VSSUFMX0hfXworI2RlZmluZSBfX0JGSU5fTUFDSF9TRVJJQUxfSF9fCisKKyNkZWZpbmUgQkZJTl9VQVJUX05SX1BPUlRTCTQKKworI2RlZmluZSBCRklOX1VBUlRfQkY1NFhfU1RZTEUKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvaW5jbHVkZS9tYWNoL2JmaW5fc2VyaWFsXzV4eC5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2luY2x1ZGUvbWFjaC9iZmluX3NlcmlhbF81eHguaAppbmRleCBkZDQ0YWE3Li4wZDk0ZWRhIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvaW5jbHVkZS9tYWNoL2JmaW5fc2VyaWFsXzV4eC5oCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9pbmNsdWRlL21hY2gvYmZpbl9zZXJpYWxfNXh4LmgKQEAgLTQsNzIgKzQsMTQgQEAKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KICAqLwogCi0jaW5jbHVkZSA8bGludXgvc2VyaWFsLmg+CiAjaW5jbHVkZSA8YXNtL2RtYS5oPgogI2luY2x1ZGUgPGFzbS9wb3J0bXV4Lmg+CiAKLSNkZWZpbmUgVUFSVF9HRVRfQ0hBUih1YXJ0KSAgICAgYmZpbl9yZWFkMTYoKCh1YXJ0KS0+cG9ydC5tZW1iYXNlICsgT0ZGU0VUX1JCUikpCi0jZGVmaW5lIFVBUlRfR0VUX0RMTCh1YXJ0KQliZmluX3JlYWQxNigoKHVhcnQpLT5wb3J0Lm1lbWJhc2UgKyBPRkZTRVRfRExMKSkKLSNkZWZpbmUgVUFSVF9HRVRfRExIKHVhcnQpCWJmaW5fcmVhZDE2KCgodWFydCktPnBvcnQubWVtYmFzZSArIE9GRlNFVF9ETEgpKQotI2RlZmluZSBVQVJUX0dFVF9JRVIodWFydCkgICAgICBiZmluX3JlYWQxNigoKHVhcnQpLT5wb3J0Lm1lbWJhc2UgKyBPRkZTRVRfSUVSX1NFVCkpCi0jZGVmaW5lIFVBUlRfR0VUX0xDUih1YXJ0KSAgICAgIGJmaW5fcmVhZDE2KCgodWFydCktPnBvcnQubWVtYmFzZSArIE9GRlNFVF9MQ1IpKQotI2RlZmluZSBVQVJUX0dFVF9MU1IodWFydCkgICAgICBiZmluX3JlYWQxNigoKHVhcnQpLT5wb3J0Lm1lbWJhc2UgKyBPRkZTRVRfTFNSKSkKLSNkZWZpbmUgVUFSVF9HRVRfR0NUTCh1YXJ0KSAgICAgYmZpbl9yZWFkMTYoKCh1YXJ0KS0+cG9ydC5tZW1iYXNlICsgT0ZGU0VUX0dDVEwpKQotI2RlZmluZSBVQVJUX0dFVF9NU1IodWFydCkgICAgICBiZmluX3JlYWQxNigoKHVhcnQpLT5wb3J0Lm1lbWJhc2UgKyBPRkZTRVRfTVNSKSkKLSNkZWZpbmUgVUFSVF9HRVRfTUNSKHVhcnQpICAgICAgYmZpbl9yZWFkMTYoKCh1YXJ0KS0+cG9ydC5tZW1iYXNlICsgT0ZGU0VUX01DUikpCi0KLSNkZWZpbmUgVUFSVF9QVVRfQ0hBUih1YXJ0LHYpICAgYmZpbl93cml0ZTE2KCgodWFydCktPnBvcnQubWVtYmFzZSArIE9GRlNFVF9USFIpLHYpCi0jZGVmaW5lIFVBUlRfUFVUX0RMTCh1YXJ0LHYpICAgIGJmaW5fd3JpdGUxNigoKHVhcnQpLT5wb3J0Lm1lbWJhc2UgKyBPRkZTRVRfRExMKSx2KQotI2RlZmluZSBVQVJUX1NFVF9JRVIodWFydCx2KSAgICBiZmluX3dyaXRlMTYoKCh1YXJ0KS0+cG9ydC5tZW1iYXNlICsgT0ZGU0VUX0lFUl9TRVQpLHYpCi0jZGVmaW5lIFVBUlRfQ0xFQVJfSUVSKHVhcnQsdikgIGJmaW5fd3JpdGUxNigoKHVhcnQpLT5wb3J0Lm1lbWJhc2UgKyBPRkZTRVRfSUVSX0NMRUFSKSx2KQotI2RlZmluZSBVQVJUX1BVVF9ETEgodWFydCx2KSAgICBiZmluX3dyaXRlMTYoKCh1YXJ0KS0+cG9ydC5tZW1iYXNlICsgT0ZGU0VUX0RMSCksdikKLSNkZWZpbmUgVUFSVF9QVVRfTFNSKHVhcnQsdikJYmZpbl93cml0ZTE2KCgodWFydCktPnBvcnQubWVtYmFzZSArIE9GRlNFVF9MU1IpLHYpCi0jZGVmaW5lIFVBUlRfUFVUX0xDUih1YXJ0LHYpICAgIGJmaW5fd3JpdGUxNigoKHVhcnQpLT5wb3J0Lm1lbWJhc2UgKyBPRkZTRVRfTENSKSx2KQotI2RlZmluZSBVQVJUX0NMRUFSX0xTUih1YXJ0KSAgICBiZmluX3dyaXRlMTYoKCh1YXJ0KS0+cG9ydC5tZW1iYXNlICsgT0ZGU0VUX0xTUiksIC0xKQotI2RlZmluZSBVQVJUX1BVVF9HQ1RMKHVhcnQsdikgICBiZmluX3dyaXRlMTYoKCh1YXJ0KS0+cG9ydC5tZW1iYXNlICsgT0ZGU0VUX0dDVEwpLHYpCi0jZGVmaW5lIFVBUlRfUFVUX01DUih1YXJ0LHYpICAgIGJmaW5fd3JpdGUxNigoKHVhcnQpLT5wb3J0Lm1lbWJhc2UgKyBPRkZTRVRfTUNSKSx2KQotI2RlZmluZSBVQVJUX0NMRUFSX1NDVFModWFydCkgICBiZmluX3dyaXRlMTYoKCh1YXJ0KS0+cG9ydC5tZW1iYXNlICsgT0ZGU0VUX01TUiksU0NUUykKLQotI2RlZmluZSBVQVJUX1NFVF9ETEFCKHVhcnQpICAgICAvKiBNTVJzIG5vdCBtdXhlZCBvbiBCRjU0eCAqLwotI2RlZmluZSBVQVJUX0NMRUFSX0RMQUIodWFydCkgICAvKiBNTVJzIG5vdCBtdXhlZCBvbiBCRjU0eCAqLwotCi0jZGVmaW5lIFVBUlRfR0VUX0NUUyh4KSAoVUFSVF9HRVRfTVNSKHgpICYgQ1RTKQotI2RlZmluZSBVQVJUX0RJU0FCTEVfUlRTKHgpIFVBUlRfUFVUX01DUih4LCBVQVJUX0dFVF9NQ1IoeCkgJiB+KEFSVFN8TVJUUykpCi0jZGVmaW5lIFVBUlRfRU5BQkxFX1JUUyh4KSBVQVJUX1BVVF9NQ1IoeCwgVUFSVF9HRVRfTUNSKHgpIHwgTVJUUyB8IEFSVFMpCi0jZGVmaW5lIFVBUlRfRU5BQkxFX0lOVFMoeCwgdikgVUFSVF9TRVRfSUVSKHgsIHYpCi0jZGVmaW5lIFVBUlRfRElTQUJMRV9JTlRTKHgpIFVBUlRfQ0xFQVJfSUVSKHgsIDB4RikKLQogI2lmIGRlZmluZWQoQ09ORklHX0JGSU5fVUFSVDBfQ1RTUlRTKSB8fCBkZWZpbmVkKENPTkZJR19CRklOX1VBUlQxX0NUU1JUUykgfHwgXAogCWRlZmluZWQoQ09ORklHX0JGSU5fVUFSVDJfQ1RTUlRTKSB8fCBkZWZpbmVkKENPTkZJR19CRklOX1VBUlQzX0NUU1JUUykKICMgZGVmaW5lIENPTkZJR19TRVJJQUxfQkZJTl9IQVJEX0NUU1JUUwogI2VuZGlmCiAKLSNkZWZpbmUgQkZJTl9VQVJUX1RYX0ZJRk9fU0laRQkyCi0KLS8qCi0gKiBUaGUgcGluIGNvbmZpZ3VyYXRpb24gaXMgZGlmZmVyZW50IGZyb20gc2NoZW1hdGljCi0gKi8KLXN0cnVjdCBiZmluX3NlcmlhbF9wb3J0IHsKLSAgICAgICAgc3RydWN0IHVhcnRfcG9ydCAgICAgICAgcG9ydDsKLSAgICAgICAgdW5zaWduZWQgaW50ICAgICAgICAgICAgb2xkX3N0YXR1czsKLQlpbnQJCQlzdGF0dXNfaXJxOwotI2lmZGVmIENPTkZJR19TRVJJQUxfQkZJTl9ETUEKLQlpbnQJCQl0eF9kb25lOwotCWludAkJCXR4X2NvdW50OwotCXN0cnVjdCBjaXJjX2J1ZgkJcnhfZG1hX2J1ZjsKLQlzdHJ1Y3QgdGltZXJfbGlzdCAgICAgICByeF9kbWFfdGltZXI7Ci0JaW50CQkJcnhfZG1hX25yb3dzOwotCXVuc2lnbmVkIGludAkJdHhfZG1hX2NoYW5uZWw7Ci0JdW5zaWduZWQgaW50CQlyeF9kbWFfY2hhbm5lbDsKLQlzdHJ1Y3Qgd29ya19zdHJ1Y3QJdHhfZG1hX3dvcmtxdWV1ZTsKLSNlbmRpZgotI2lmZGVmIENPTkZJR19TRVJJQUxfQkZJTl9IQVJEX0NUU1JUUwotCWludAkJCXNjdHM7Ci0JaW50CQkJY3RzX3BpbjsKLQlpbnQJCQlydHNfcGluOwotI2VuZGlmCi19OwotCiBzdHJ1Y3QgYmZpbl9zZXJpYWxfcmVzIHsKIAl1bnNpZ25lZCBsb25nCXVhcnRfYmFzZV9hZGRyOwogCWludAkJdWFydF9pcnE7CkBAIC0xNDgsMyArOTAsNSBAQAogfTsKIAogI2RlZmluZSBEUklWRVJfTkFNRSAiYmZpbi11YXJ0IgorCisjaW5jbHVkZSA8YXNtL2JmaW5fc2VyaWFsLmg+CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvaW5jbHVkZS9tYWNoL2JsYWNrZmluLmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvaW5jbHVkZS9tYWNoL2JsYWNrZmluLmgKaW5kZXggNTY4NDAzMC4uNzJkYTcyMSAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2luY2x1ZGUvbWFjaC9ibGFja2Zpbi5oCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9pbmNsdWRlL21hY2gvYmxhY2tmaW4uaApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNy0yMDA5IEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqIENvcHlyaWdodCAyMDA3LTIwMTAgQW5hbG9nIERldmljZXMgSW5jLgogICoKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KICAqLwpAQCAtMTAsNTggKzEwLDQwIEBACiAjaW5jbHVkZSAiYmY1NDguaCIKICNpbmNsdWRlICJhbm9tYWx5LmgiCiAKKyNpbmNsdWRlIDxhc20vZGVmX0xQQmxhY2tmaW4uaD4KICNpZmRlZiBDT05GSUdfQkY1NDIKLSNpbmNsdWRlICJkZWZCRjU0Mi5oIgotI2VuZGlmCi0KLSNpZmRlZiBDT05GSUdfQkY1NDQKLSNpbmNsdWRlICJkZWZCRjU0NC5oIgotI2VuZGlmCi0KLSNpZmRlZiBDT05GSUdfQkY1NDcKLSNpbmNsdWRlICJkZWZCRjU0Ny5oIgotI2VuZGlmCi0KLSNpZmRlZiBDT05GSUdfQkY1NDgKLSNpbmNsdWRlICJkZWZCRjU0OC5oIgotI2VuZGlmCi0KLSNpZmRlZiBDT05GSUdfQkY1NDkKLSNpbmNsdWRlICJkZWZCRjU0OS5oIgotI2VuZGlmCi0KLSNpZiAhZGVmaW5lZChfX0FTU0VNQkxZX18pCi0jaWZkZWYgQ09ORklHX0JGNTQyCi0jaW5jbHVkZSAiY2RlZkJGNTQyLmgiCisjIGluY2x1ZGUgImRlZkJGNTQyLmgiCiAjZW5kaWYKICNpZmRlZiBDT05GSUdfQkY1NDQKLSNpbmNsdWRlICJjZGVmQkY1NDQuaCIKKyMgaW5jbHVkZSAiZGVmQkY1NDQuaCIKICNlbmRpZgogI2lmZGVmIENPTkZJR19CRjU0NwotI2luY2x1ZGUgImNkZWZCRjU0Ny5oIgorIyBpbmNsdWRlICJkZWZCRjU0Ny5oIgogI2VuZGlmCiAjaWZkZWYgQ09ORklHX0JGNTQ4Ci0jaW5jbHVkZSAiY2RlZkJGNTQ4LmgiCisjIGluY2x1ZGUgImRlZkJGNTQ4LmgiCiAjZW5kaWYKICNpZmRlZiBDT05GSUdfQkY1NDkKLSNpbmNsdWRlICJjZGVmQkY1NDkuaCIKKyMgaW5jbHVkZSAiZGVmQkY1NDkuaCIKICNlbmRpZgogCisjaWZuZGVmIF9fQVNTRU1CTFlfXworIyBpbmNsdWRlIDxhc20vY2RlZl9MUEJsYWNrZmluLmg+CisjIGlmZGVmIENPTkZJR19CRjU0MgorIyAgaW5jbHVkZSAiY2RlZkJGNTQyLmgiCisjIGVuZGlmCisjIGlmZGVmIENPTkZJR19CRjU0NAorIyAgaW5jbHVkZSAiY2RlZkJGNTQ0LmgiCisjIGVuZGlmCisjIGlmZGVmIENPTkZJR19CRjU0NworIyAgaW5jbHVkZSAiY2RlZkJGNTQ3LmgiCisjIGVuZGlmCisjIGlmZGVmIENPTkZJR19CRjU0OAorIyAgaW5jbHVkZSAiY2RlZkJGNTQ4LmgiCisjIGVuZGlmCisjIGlmZGVmIENPTkZJR19CRjU0OQorIyAgaW5jbHVkZSAiY2RlZkJGNTQ5LmgiCisjIGVuZGlmCiAjZW5kaWYKIAotI2RlZmluZSBCRklOX1VBUlRfTlJfUE9SVFMJNAotCi0jZGVmaW5lIE9GRlNFVF9ETEwgICAgICAgICAgICAgIDB4MDAJLyogRGl2aXNvciBMYXRjaCAoTG93LUJ5dGUpICAgICAgICAgICAgICovCi0jZGVmaW5lIE9GRlNFVF9ETEggICAgICAgICAgICAgIDB4MDQJLyogRGl2aXNvciBMYXRjaCAoSGlnaC1CeXRlKSAgICAgICAgICAgICovCi0jZGVmaW5lIE9GRlNFVF9HQ1RMICAgICAgICAgICAgIDB4MDgJLyogR2xvYmFsIENvbnRyb2wgUmVnaXN0ZXIgICAgICAgICAgICAgICovCi0jZGVmaW5lIE9GRlNFVF9MQ1IgICAgICAgICAgICAgIDB4MEMJLyogTGluZSBDb250cm9sIFJlZ2lzdGVyICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIE9GRlNFVF9NQ1IgICAgICAgICAgICAgIDB4MTAJLyogTW9kZW0gQ29udHJvbCBSZWdpc3RlciAgICAgICAgICAgICAgICovCi0jZGVmaW5lIE9GRlNFVF9MU1IgICAgICAgICAgICAgIDB4MTQJLyogTGluZSBTdGF0dXMgUmVnaXN0ZXIgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIE9GRlNFVF9NU1IgICAgICAgICAgICAgIDB4MTgJLyogTW9kZW0gU3RhdHVzIFJlZ2lzdGVyICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIE9GRlNFVF9TQ1IgICAgICAgICAgICAgIDB4MUMJLyogU0NSIFNjcmF0Y2ggUmVnaXN0ZXIgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIE9GRlNFVF9JRVJfU0VUICAgICAgICAgIDB4MjAJLyogU2V0IEludGVycnVwdCBFbmFibGUgUmVnaXN0ZXIgICAgICAgICovCi0jZGVmaW5lIE9GRlNFVF9JRVJfQ0xFQVIgICAgICAgIDB4MjQJLyogQ2xlYXIgSW50ZXJydXB0IEVuYWJsZSBSZWdpc3RlciAgICAgICovCi0jZGVmaW5lIE9GRlNFVF9USFIgICAgICAgICAgICAgIDB4MjgJLyogVHJhbnNtaXQgSG9sZGluZyByZWdpc3RlciAgICAgICAgICAgICovCi0jZGVmaW5lIE9GRlNFVF9SQlIgICAgICAgICAgICAgIDB4MkMJLyogUmVjZWl2ZSBCdWZmZXIgcmVnaXN0ZXIgICAgICAgICAgICAgICovCi0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2luY2x1ZGUvbWFjaC9jZGVmQkY1NDIuaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9pbmNsdWRlL21hY2gvY2RlZkJGNTQyLmgKaW5kZXggNDJmNGE5NC4uZDA5YzE5YyAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2luY2x1ZGUvbWFjaC9jZGVmQkY1NDIuaAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvaW5jbHVkZS9tYWNoL2NkZWZCRjU0Mi5oCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA3LTIwMDggQW5hbG9nIERldmljZXMgSW5jLgorICogQ29weXJpZ2h0IDIwMDctMjAxMCBBbmFsb2cgRGV2aWNlcyBJbmMuCiAgKgogICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgogICovCkBAIC03LDE0ICs3LDYgQEAKICNpZm5kZWYgX0NERUZfQkY1NDJfSAogI2RlZmluZSBfQ0RFRl9CRjU0Ml9ICiAKLS8qIGluY2x1ZGUgYWxsIENvcmUgcmVnaXN0ZXJzIGFuZCBiaXQgZGVmaW5pdGlvbnMgKi8KLSNpbmNsdWRlICJkZWZCRjU0Mi5oIgotCi0vKiBpbmNsdWRlIGNvcmUgc2JmaW5fcmVhZF8oKWVjaWZpYyByZWdpc3RlciBwb2ludGVyIGRlZmluaXRpb25zICovCi0jaW5jbHVkZSA8YXNtL2NkZWZfTFBCbGFja2Zpbi5oPgotCi0vKiBTWVNURU0gJiBNTVIgQUREUkVTUyBERUZJTklUSU9OUyBGT1IgQURTUC1CRjU0MiAqLwotCiAvKiBpbmNsdWRlIGNkZWZCRjU0eF9iYXNlLmggZm9yIHRoZSBzZXQgb2YgI2RlZmluZXMgdGhhdCBhcmUgY29tbW9uIHRvIGFsbCBBRFNQLUJGNTR4IGJmaW5fcmVhZF8oKXJvY2Vzc29ycyAqLwogI2luY2x1ZGUgImNkZWZCRjU0eF9iYXNlLmgiCiAKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9pbmNsdWRlL21hY2gvY2RlZkJGNTQ0LmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvaW5jbHVkZS9tYWNoL2NkZWZCRjU0NC5oCmluZGV4IDIyMDc3OTkuLjMzZWM4MTAgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9pbmNsdWRlL21hY2gvY2RlZkJGNTQ0LmgKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2luY2x1ZGUvbWFjaC9jZGVmQkY1NDQuaApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNy0yMDA4IEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqIENvcHlyaWdodCAyMDA3LTIwMTAgQW5hbG9nIERldmljZXMgSW5jLgogICoKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KICAqLwpAQCAtNywxNCArNyw2IEBACiAjaWZuZGVmIF9DREVGX0JGNTQ0X0gKICNkZWZpbmUgX0NERUZfQkY1NDRfSAogCi0vKiBpbmNsdWRlIGFsbCBDb3JlIHJlZ2lzdGVycyBhbmQgYml0IGRlZmluaXRpb25zICovCi0jaW5jbHVkZSAiZGVmQkY1NDQuaCIKLQotLyogaW5jbHVkZSBjb3JlIHNiZmluX3JlYWRfKCllY2lmaWMgcmVnaXN0ZXIgcG9pbnRlciBkZWZpbml0aW9ucyAqLwotI2luY2x1ZGUgPGFzbS9jZGVmX0xQQmxhY2tmaW4uaD4KLQotLyogU1lTVEVNICYgTU1SIEFERFJFU1MgREVGSU5JVElPTlMgRk9SIEFEU1AtQkY1NDQgKi8KLQogLyogaW5jbHVkZSBjZGVmQkY1NHhfYmFzZS5oIGZvciB0aGUgc2V0IG9mICNkZWZpbmVzIHRoYXQgYXJlIGNvbW1vbiB0byBhbGwgQURTUC1CRjU0eCBiZmluX3JlYWRfKClyb2Nlc3NvcnMgKi8KICNpbmNsdWRlICJjZGVmQkY1NHhfYmFzZS5oIgogCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvaW5jbHVkZS9tYWNoL2NkZWZCRjU0Ny5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2luY2x1ZGUvbWFjaC9jZGVmQkY1NDcuaAppbmRleCBiYzY1MGU2Li5iY2I5NzI2IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvaW5jbHVkZS9tYWNoL2NkZWZCRjU0Ny5oCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9pbmNsdWRlL21hY2gvY2RlZkJGNTQ3LmgKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDggQW5hbG9nIERldmljZXMgSW5jLgorICogQ29weXJpZ2h0IDIwMDgtMjAxMCBBbmFsb2cgRGV2aWNlcyBJbmMuCiAgKgogICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgogICovCkBAIC03LDE0ICs3LDYgQEAKICNpZm5kZWYgX0NERUZfQkY1NDdfSAogI2RlZmluZSBfQ0RFRl9CRjU0N19ICiAKLS8qIGluY2x1ZGUgYWxsIENvcmUgcmVnaXN0ZXJzIGFuZCBiaXQgZGVmaW5pdGlvbnMgKi8KLSNpbmNsdWRlICJkZWZCRjU0Ny5oIgotCi0vKiBpbmNsdWRlIGNvcmUgc2JmaW5fcmVhZF8oKWVjaWZpYyByZWdpc3RlciBwb2ludGVyIGRlZmluaXRpb25zICovCi0jaW5jbHVkZSA8YXNtL2NkZWZfTFBCbGFja2Zpbi5oPgotCi0vKiBTWVNURU0gJiBNTVIgQUREUkVTUyBERUZJTklUSU9OUyBGT1IgQURTUC1CRjU0NyAqLwotCiAvKiBpbmNsdWRlIGNkZWZCRjU0eF9iYXNlLmggZm9yIHRoZSBzZXQgb2YgI2RlZmluZXMgdGhhdCBhcmUgY29tbW9uIHRvIGFsbCBBRFNQLUJGNTR4IGJmaW5fcmVhZF8oKXJvY2Vzc29ycyAqLwogI2luY2x1ZGUgImNkZWZCRjU0eF9iYXNlLmgiCiAKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9pbmNsdWRlL21hY2gvY2RlZkJGNTQ4LmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvaW5jbHVkZS9tYWNoL2NkZWZCRjU0OC5oCmluZGV4IDM1MjNlMDguLmJhZTY3YTYgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9pbmNsdWRlL21hY2gvY2RlZkJGNTQ4LmgKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2luY2x1ZGUvbWFjaC9jZGVmQkY1NDguaApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNy0yMDA4IEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqIENvcHlyaWdodCAyMDA3LTIwMTAgQW5hbG9nIERldmljZXMgSW5jLgogICoKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KICAqLwpAQCAtNywxNCArNyw2IEBACiAjaWZuZGVmIF9DREVGX0JGNTQ4X0gKICNkZWZpbmUgX0NERUZfQkY1NDhfSAogCi0vKiBpbmNsdWRlIGFsbCBDb3JlIHJlZ2lzdGVycyBhbmQgYml0IGRlZmluaXRpb25zICovCi0jaW5jbHVkZSAiZGVmQkY1NDguaCIKLQotLyogaW5jbHVkZSBjb3JlIHNiZmluX3JlYWRfKCllY2lmaWMgcmVnaXN0ZXIgcG9pbnRlciBkZWZpbml0aW9ucyAqLwotI2luY2x1ZGUgPGFzbS9jZGVmX0xQQmxhY2tmaW4uaD4KLQotLyogU1lTVEVNICYgTU1SIEFERFJFU1MgREVGSU5JVElPTlMgRk9SIEFEU1AtQkY1NDggKi8KLQogLyogaW5jbHVkZSBjZGVmQkY1NHhfYmFzZS5oIGZvciB0aGUgc2V0IG9mICNkZWZpbmVzIHRoYXQgYXJlIGNvbW1vbiB0byBhbGwgQURTUC1CRjU0eCBiZmluX3JlYWRfKClyb2Nlc3NvcnMgKi8KICNpbmNsdWRlICJjZGVmQkY1NHhfYmFzZS5oIgogCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvaW5jbHVkZS9tYWNoL2NkZWZCRjU0OS5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2luY2x1ZGUvbWFjaC9jZGVmQkY1NDkuaAppbmRleCA4MDIwMWVkLi4wMDIxMzZhIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvaW5jbHVkZS9tYWNoL2NkZWZCRjU0OS5oCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9pbmNsdWRlL21hY2gvY2RlZkJGNTQ5LmgKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDctMjAwOCBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKiBDb3B5cmlnaHQgMjAwNy0yMDEwIEFuYWxvZyBEZXZpY2VzIEluYy4KICAqCiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCiAgKi8KQEAgLTcsMTQgKzcsNiBAQAogI2lmbmRlZiBfQ0RFRl9CRjU0OV9ICiAjZGVmaW5lIF9DREVGX0JGNTQ5X0gKIAotLyogaW5jbHVkZSBhbGwgQ29yZSByZWdpc3RlcnMgYW5kIGJpdCBkZWZpbml0aW9ucyAqLwotI2luY2x1ZGUgImRlZkJGNTQ5LmgiCi0KLS8qIGluY2x1ZGUgY29yZSBzYmZpbl9yZWFkXygpZWNpZmljIHJlZ2lzdGVyIHBvaW50ZXIgZGVmaW5pdGlvbnMgKi8KLSNpbmNsdWRlIDxhc20vY2RlZl9MUEJsYWNrZmluLmg+Ci0KLS8qIFNZU1RFTSAmIE1NUiBBRERSRVNTIERFRklOSVRJT05TIEZPUiBBRFNQLUJGNTQ5ICovCi0KIC8qIGluY2x1ZGUgY2RlZkJGNTR4X2Jhc2UuaCBmb3IgdGhlIHNldCBvZiAjZGVmaW5lcyB0aGF0IGFyZSBjb21tb24gdG8gYWxsIEFEU1AtQkY1NHggYmZpbl9yZWFkXygpcm9jZXNzb3JzICovCiAjaW5jbHVkZSAiY2RlZkJGNTR4X2Jhc2UuaCIKIApkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2luY2x1ZGUvbWFjaC9jZGVmQkY1NHhfYmFzZS5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2luY2x1ZGUvbWFjaC9jZGVmQkY1NHhfYmFzZS5oCmluZGV4IGRlYWY1ZDYuLjUwYzg5YzggMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9pbmNsdWRlL21hY2gvY2RlZkJGNTR4X2Jhc2UuaAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvaW5jbHVkZS9tYWNoL2NkZWZCRjU0eF9iYXNlLmgKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDctMjAwOCBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKiBDb3B5cmlnaHQgMjAwNy0yMDEwIEFuYWxvZyBEZXZpY2VzIEluYy4KICAqCiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCiAgKi8KQEAgLTcsMTAgKzcsNiBAQAogI2lmbmRlZiBfQ0RFRl9CRjU0WF9ICiAjZGVmaW5lIF9DREVGX0JGNTRYX0gKIAotI2luY2x1ZGUgPGFzbS9ibGFja2Zpbi5oPgotCi0jaW5jbHVkZSAiZGVmQkY1NHhfYmFzZS5oIgotCiAvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwogLyogU1lTVEVNICYgTU1SIEFERFJFU1MgREVGSU5JVElPTlMgQ09NTU9OIFRPIEFMTCBBRFNQLUJGNTR4ICAgICovCiAvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwpAQCAtMjYzMywyMiArMjYyOSw1IEBACiAKIC8qIEhhbmRzaGFrZSBNRE1BIGlzIG5vdCBkZWZpbmVkIGluIHRoZSBzaGFyZWQgZmlsZSBiZWNhdXNlIGl0IGlzIG5vdCBhdmFpbGFibGUgb24gdGhlIEFEU1AtQkY1NDIgYmZpbl9yZWFkXygpcm9jZXNzb3IgKi8KIAotLyogbGVnYWN5IGRlZmluaXRpb25zICovCi0jZGVmaW5lIGJmaW5fcmVhZF9FQklVX0FNQ0JDVEwwCQliZmluX3JlYWRfRUJJVV9BTUJDVEwwCi0jZGVmaW5lIGJmaW5fd3JpdGVfRUJJVV9BTUNCQ1RMMAliZmluX3dyaXRlX0VCSVVfQU1CQ1RMMAotI2RlZmluZSBiZmluX3JlYWRfRUJJVV9BTUNCQ1RMMQkJYmZpbl9yZWFkX0VCSVVfQU1CQ1RMMQotI2RlZmluZSBiZmluX3dyaXRlX0VCSVVfQU1DQkNUTDEJYmZpbl93cml0ZV9FQklVX0FNQkNUTDEKLSNkZWZpbmUgYmZpbl9yZWFkX1BJTlQwX0lSUQkJYmZpbl9yZWFkX1BJTlQwX1JFUVVFU1QKLSNkZWZpbmUgYmZpbl93cml0ZV9QSU5UMF9JUlEJCWJmaW5fd3JpdGVfUElOVDBfUkVRVUVTVAotI2RlZmluZSBiZmluX3JlYWRfUElOVDFfSVJRCQliZmluX3JlYWRfUElOVDFfUkVRVUVTVAotI2RlZmluZSBiZmluX3dyaXRlX1BJTlQxX0lSUQkJYmZpbl93cml0ZV9QSU5UMV9SRVFVRVNUCi0jZGVmaW5lIGJmaW5fcmVhZF9QSU5UMl9JUlEJCWJmaW5fcmVhZF9QSU5UMl9SRVFVRVNUCi0jZGVmaW5lIGJmaW5fd3JpdGVfUElOVDJfSVJRCQliZmluX3dyaXRlX1BJTlQyX1JFUVVFU1QKLSNkZWZpbmUgYmZpbl9yZWFkX1BJTlQzX0lSUQkJYmZpbl9yZWFkX1BJTlQzX1JFUVVFU1QKLSNkZWZpbmUgYmZpbl93cml0ZV9QSU5UM19JUlEJCWJmaW5fd3JpdGVfUElOVDNfUkVRVUVTVAotCi0vKiBUaGVzZSBuZWVkIHRvIGJlIGxhc3QgZHVlIHRvIHRoZSBjZGVmL2xpbnV4IGludGVyLWRlcGVuZGVuY2llcyAqLwotI2luY2x1ZGUgPGFzbS9pcnEuaD4KLQogI2VuZGlmIC8qIF9DREVGX0JGNTRYX0ggKi8KIApkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2luY2x1ZGUvbWFjaC9kZWZCRjU0Mi5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2luY2x1ZGUvbWFjaC9kZWZCRjU0Mi5oCmluZGV4IGFiZjVmNzUuLjYyOWJmMjEgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9pbmNsdWRlL21hY2gvZGVmQkY1NDIuaAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvaW5jbHVkZS9tYWNoL2RlZkJGNTQyLmgKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDctMjAwOCBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKiBDb3B5cmlnaHQgMjAwNy0yMDEwIEFuYWxvZyBEZXZpY2VzIEluYy4KICAqCiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgQURJIEJTRCBsaWNlbnNlIG9yIHRoZSBHUEwtMiAob3IgbGF0ZXIpCiAgKi8KQEAgLTcsMTEgKzcsNiBAQAogI2lmbmRlZiBfREVGX0JGNTQyX0gKICNkZWZpbmUgX0RFRl9CRjU0Ml9ICiAKLS8qIEluY2x1ZGUgYWxsIENvcmUgcmVnaXN0ZXJzIGFuZCBiaXQgZGVmaW5pdGlvbnMgKi8KLSNpbmNsdWRlIDxhc20vZGVmX0xQQmxhY2tmaW4uaD4KLQotLyogU1lTVEVNICYgTU1SIEFERFJFU1MgREVGSU5JVElPTlMgRk9SIEFEU1AtQkY1NDIgKi8KLQogLyogSW5jbHVkZSBkZWZCRjU0eF9iYXNlLmggZm9yIHRoZSBzZXQgb2YgI2RlZmluZXMgdGhhdCBhcmUgY29tbW9uIHRvIGFsbCBBRFNQLUJGNTR4IHByb2Nlc3NvcnMgKi8KICNpbmNsdWRlICJkZWZCRjU0eF9iYXNlLmgiCiAKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9pbmNsdWRlL21hY2gvZGVmQkY1NDQuaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9pbmNsdWRlL21hY2gvZGVmQkY1NDQuaAppbmRleCBlMjc3MTA5Li42NDI0NjhjIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvaW5jbHVkZS9tYWNoL2RlZkJGNTQ0LmgKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2luY2x1ZGUvbWFjaC9kZWZCRjU0NC5oCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA3LTIwMDggQW5hbG9nIERldmljZXMgSW5jLgorICogQ29weXJpZ2h0IDIwMDctMjAxMCBBbmFsb2cgRGV2aWNlcyBJbmMuCiAgKgogICogTGljZW5zZWQgdW5kZXIgdGhlIEFESSBCU0QgbGljZW5zZSBvciB0aGUgR1BMLTIgKG9yIGxhdGVyKQogICovCkBAIC03LDExICs3LDYgQEAKICNpZm5kZWYgX0RFRl9CRjU0NF9ICiAjZGVmaW5lIF9ERUZfQkY1NDRfSAogCi0vKiBJbmNsdWRlIGFsbCBDb3JlIHJlZ2lzdGVycyBhbmQgYml0IGRlZmluaXRpb25zICovCi0jaW5jbHVkZSA8YXNtL2RlZl9MUEJsYWNrZmluLmg+Ci0KLS8qIFNZU1RFTSAmIE1NUiBBRERSRVNTIERFRklOSVRJT05TIEZPUiBBRFNQLUJGNTQ0ICovCi0KIC8qIEluY2x1ZGUgZGVmQkY1NHhfYmFzZS5oIGZvciB0aGUgc2V0IG9mICNkZWZpbmVzIHRoYXQgYXJlIGNvbW1vbiB0byBhbGwgQURTUC1CRjU0eCBwcm9jZXNzb3JzICovCiAjaW5jbHVkZSAiZGVmQkY1NHhfYmFzZS5oIgogCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvaW5jbHVkZS9tYWNoL2RlZkJGNTQ3LmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvaW5jbHVkZS9tYWNoL2RlZkJGNTQ3LmgKaW5kZXggYmUyMWJhNS4uMmYzMzM3YyAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2luY2x1ZGUvbWFjaC9kZWZCRjU0Ny5oCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9pbmNsdWRlL21hY2gvZGVmQkY1NDcuaApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwOCBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKiBDb3B5cmlnaHQgMjAwOC0yMDEwIEFuYWxvZyBEZXZpY2VzIEluYy4KICAqCiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgQURJIEJTRCBsaWNlbnNlIG9yIHRoZSBHUEwtMiAob3IgbGF0ZXIpCiAgKi8KQEAgLTcsMTEgKzcsNiBAQAogI2lmbmRlZiBfREVGX0JGNTQ3X0gKICNkZWZpbmUgX0RFRl9CRjU0N19ICiAKLS8qIEluY2x1ZGUgYWxsIENvcmUgcmVnaXN0ZXJzIGFuZCBiaXQgZGVmaW5pdGlvbnMgKi8KLSNpbmNsdWRlIDxhc20vZGVmX0xQQmxhY2tmaW4uaD4KLQotLyogU1lTVEVNICYgTU1SIEFERFJFU1MgREVGSU5JVElPTlMgRk9SIEFEU1AtQkY1NDcgKi8KLQogLyogSW5jbHVkZSBkZWZCRjU0eF9iYXNlLmggZm9yIHRoZSBzZXQgb2YgI2RlZmluZXMgdGhhdCBhcmUgY29tbW9uIHRvIGFsbCBBRFNQLUJGNTR4IHByb2Nlc3NvcnMgKi8KICNpbmNsdWRlICJkZWZCRjU0eF9iYXNlLmgiCiAKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9pbmNsdWRlL21hY2gvZGVmQkY1NDguaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9pbmNsdWRlL21hY2gvZGVmQkY1NDguaAppbmRleCAzZmIzM2IwLi4zYzdmMWI2IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvaW5jbHVkZS9tYWNoL2RlZkJGNTQ4LmgKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2luY2x1ZGUvbWFjaC9kZWZCRjU0OC5oCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDA3LTIwMDggQW5hbG9nIERldmljZXMgSW5jLgorICogQ29weXJpZ2h0IDIwMDctMjAxMCBBbmFsb2cgRGV2aWNlcyBJbmMuCiAgKgogICogTGljZW5zZWQgdW5kZXIgdGhlIEFESSBCU0QgbGljZW5zZSBvciB0aGUgR1BMLTIgKG9yIGxhdGVyKQogICovCkBAIC03LDExICs3LDYgQEAKICNpZm5kZWYgX0RFRl9CRjU0OF9ICiAjZGVmaW5lIF9ERUZfQkY1NDhfSAogCi0vKiBJbmNsdWRlIGFsbCBDb3JlIHJlZ2lzdGVycyBhbmQgYml0IGRlZmluaXRpb25zICovCi0jaW5jbHVkZSA8YXNtL2RlZl9MUEJsYWNrZmluLmg+Ci0KLS8qIFNZU1RFTSAmIE1NUiBBRERSRVNTIERFRklOSVRJT05TIEZPUiBBRFNQLUJGNTQ4ICovCi0KIC8qIEluY2x1ZGUgZGVmQkY1NHhfYmFzZS5oIGZvciB0aGUgc2V0IG9mICNkZWZpbmVzIHRoYXQgYXJlIGNvbW1vbiB0byBhbGwgQURTUC1CRjU0eCBwcm9jZXNzb3JzICovCiAjaW5jbHVkZSAiZGVmQkY1NHhfYmFzZS5oIgogCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvaW5jbHVkZS9tYWNoL2RlZkJGNTQ5LmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvaW5jbHVkZS9tYWNoL2RlZkJGNTQ5LmgKaW5kZXggNWEwNGU2ZC4uOWE0NWNiNiAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2luY2x1ZGUvbWFjaC9kZWZCRjU0OS5oCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9pbmNsdWRlL21hY2gvZGVmQkY1NDkuaApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNy0yMDA4IEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqIENvcHlyaWdodCAyMDA3LTIwMTAgQW5hbG9nIERldmljZXMgSW5jLgogICoKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBREkgQlNEIGxpY2Vuc2Ugb3IgdGhlIEdQTC0yIChvciBsYXRlcikKICAqLwpAQCAtNywxMSArNyw2IEBACiAjaWZuZGVmIF9ERUZfQkY1NDlfSAogI2RlZmluZSBfREVGX0JGNTQ5X0gKIAotLyogSW5jbHVkZSBhbGwgQ29yZSByZWdpc3RlcnMgYW5kIGJpdCBkZWZpbml0aW9ucyAqLwotI2luY2x1ZGUgPGFzbS9kZWZfTFBCbGFja2Zpbi5oPgotCi0vKiBTWVNURU0gJiBNTVIgQUREUkVTUyBERUZJTklUSU9OUyBGT1IgQURTUC1CRjU0OSAqLwotCiAvKiBJbmNsdWRlIGRlZkJGNTR4X2Jhc2UuaCBmb3IgdGhlIHNldCBvZiAjZGVmaW5lcyB0aGF0IGFyZSBjb21tb24gdG8gYWxsIEFEU1AtQkY1NHggcHJvY2Vzc29ycyAqLwogI2luY2x1ZGUgImRlZkJGNTR4X2Jhc2UuaCIKIApkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2luY2x1ZGUvbWFjaC9kZWZCRjU0eF9iYXNlLmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvaW5jbHVkZS9tYWNoL2RlZkJGNTR4X2Jhc2UuaAppbmRleCA3OGY5MTEwLi4wODY3YzJiIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvaW5jbHVkZS9tYWNoL2RlZkJGNTR4X2Jhc2UuaAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvaW5jbHVkZS9tYWNoL2RlZkJGNTR4X2Jhc2UuaApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNy0yMDA4IEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqIENvcHlyaWdodCAyMDA3LTIwMTAgQW5hbG9nIERldmljZXMgSW5jLgogICoKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBREkgQlNEIGxpY2Vuc2Ugb3IgdGhlIEdQTC0yIChvciBsYXRlcikKICAqLwpAQCAtMTYxNSwxNCArMTYxNSwxNCBAQAogI2RlZmluZSAgICAgICAgICAgICAgICAgICAgIENUWVBFICAweDQwICAgICAgIC8qIERNQSBDaGFubmVsIFR5cGUgKi8KICNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgUE1BUCAgMHhmMDAwICAgICAvKiBQZXJpcGhlcmFsIE1hcHBlZCBUbyBUaGlzIENoYW5uZWwgKi8KIAotLyogQml0IG1hc2tzIGZvciBETUFDeF9UQ1BFUiAqLworLyogQml0IG1hc2tzIGZvciBETUFDeF9UQ19QRVIgKi8KIAogI2RlZmluZSAgICAgICAgRENCX1RSQUZGSUNfUEVSSU9EICAweGYgICAgICAgIC8qIERDQiBUcmFmZmljIENvbnRyb2wgUGVyaW9kICovCiAjZGVmaW5lICAgICAgICBERUJfVFJBRkZJQ19QRVJJT0QgIDB4ZjAgICAgICAgLyogREVCIFRyYWZmaWMgQ29udHJvbCBQZXJpb2QgKi8KICNkZWZpbmUgICAgICAgIERBQl9UUkFGRklDX1BFUklPRCAgMHg3MDAgICAgICAvKiBEQUIgVHJhZmZpYyBDb250cm9sIFBlcmlvZCAqLwogI2RlZmluZSAgIE1ETUFfUk9VTkRfUk9CSU5fUEVSSU9EICAweGY4MDAgICAgIC8qIE1ETUEgUm91bmQgUm9iaW4gUGVyaW9kICovCiAKLS8qIEJpdCBtYXNrcyBmb3IgRE1BQ3hfVENDTlQgKi8KKy8qIEJpdCBtYXNrcyBmb3IgRE1BQ3hfVENfQ05UICovCiAKICNkZWZpbmUgICAgICAgICBEQ0JfVFJBRkZJQ19DT1VOVCAgMHhmICAgICAgICAvKiBEQ0IgVHJhZmZpYyBDb250cm9sIENvdW50ICovCiAjZGVmaW5lICAgICAgICAgREVCX1RSQUZGSUNfQ09VTlQgIDB4ZjAgICAgICAgLyogREVCIFRyYWZmaWMgQ29udHJvbCBDb3VudCAqLwpAQCAtMjE3Miw2OCArMjE3Miw2IEBACiAKICNkZWZpbmUgICAgICAgICAgICAgICAgIFJDVkRBVEExNiAgMHhmZmZmICAgICAvKiBSZWNlaXZlIEZJRk8gMTYtQml0IERhdGEgKi8KIAotLyogQml0IG1hc2tzIGZvciBVQVJUeF9MQ1IgKi8KLQotI2lmIDAKLS8qIGNvbmZsaWN0cyB3aXRoIGxlZ2FjeSBvbmUgaW4gbGFzdCBzZWN0aW9uICovCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICBXTFMgIDB4MyAgICAgICAgLyogV29yZCBMZW5ndGggU2VsZWN0ICovCi0jZW5kaWYKLSNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgIFNUQiAgMHg0ICAgICAgICAvKiBTdG9wIEJpdHMgKi8KLSNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgIFBFTiAgMHg4ICAgICAgICAvKiBQYXJpdHkgRW5hYmxlICovCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICBFUFMgIDB4MTAgICAgICAgLyogRXZlbiBQYXJpdHkgU2VsZWN0ICovCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICBTVFAgIDB4MjAgICAgICAgLyogU3RpY2t5IFBhcml0eSAqLwotI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgIFNCICAweDQwICAgICAgIC8qIFNldCBCcmVhayAqLwotCi0vKiBCaXQgbWFza3MgZm9yIFVBUlR4X01DUiAqLwotCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgICAgIFhPRkYgIDB4MSAgICAgICAgLyogVHJhbnNtaXR0ZXIgT2ZmICovCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgICAgIE1SVFMgIDB4MiAgICAgICAgLyogTWFudWFsIFJlcXVlc3QgVG8gU2VuZCAqLwotI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICBSRklUICAweDQgICAgICAgIC8qIFJlY2VpdmUgRklGTyBJUlEgVGhyZXNob2xkICovCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgICAgIFJGUlQgIDB4OCAgICAgICAgLyogUmVjZWl2ZSBGSUZPIFJUUyBUaHJlc2hvbGQgKi8KLSNkZWZpbmUgICAgICAgICAgICAgICAgICBMT09QX0VOQSAgMHgxMCAgICAgICAvKiBMb29wYmFjayBNb2RlIEVuYWJsZSAqLwotI2RlZmluZSAgICAgICAgICAgICAgICAgICAgIEZDUE9MICAweDIwICAgICAgIC8qIEZsb3cgQ29udHJvbCBQaW4gUG9sYXJpdHkgKi8KLSNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgQVJUUyAgMHg0MCAgICAgICAvKiBBdXRvbWF0aWMgUmVxdWVzdCBUbyBTZW5kICovCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgICAgIEFDVFMgIDB4ODAgICAgICAgLyogQXV0b21hdGljIENsZWFyIFRvIFNlbmQgKi8KLQotLyogQml0IG1hc2tzIGZvciBVQVJUeF9MU1IgKi8KLQotI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgIERSICAweDEgICAgICAgIC8qIERhdGEgUmVhZHkgKi8KLSNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgICBPRSAgMHgyICAgICAgICAvKiBPdmVycnVuIEVycm9yICovCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICAgUEUgIDB4NCAgICAgICAgLyogUGFyaXR5IEVycm9yICovCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICAgRkUgIDB4OCAgICAgICAgLyogRnJhbWluZyBFcnJvciAqLwotI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgIEJJICAweDEwICAgICAgIC8qIEJyZWFrIEludGVycnVwdCAqLwotI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICBUSFJFICAweDIwICAgICAgIC8qIFRIUiBFbXB0eSAqLwotI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICBURU1UICAweDQwICAgICAgIC8qIFRyYW5zbWl0dGVyIEVtcHR5ICovCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICBURkkgIDB4ODAgICAgICAgLyogVHJhbnNtaXNzaW9uIEZpbmlzaGVkIEluZGljYXRvciAqLwotCi0vKiBCaXQgbWFza3MgZm9yIFVBUlR4X01TUiAqLwotCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgICAgIFNDVFMgIDB4MSAgICAgICAgLyogU3RpY2t5IENUUyAqLwotI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgQ1RTICAweDEwICAgICAgIC8qIENsZWFyIFRvIFNlbmQgKi8KLSNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgUkZDUyAgMHgyMCAgICAgICAvKiBSZWNlaXZlIEZJRk8gQ291bnQgU3RhdHVzICovCi0KLS8qIEJpdCBtYXNrcyBmb3IgVUFSVHhfSUVSX1NFVCAmIFVBUlR4X0lFUl9DTEVBUiAqLwotCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgIEVSQkZJICAweDEgICAgICAgIC8qIEVuYWJsZSBSZWNlaXZlIEJ1ZmZlciBGdWxsIEludGVycnVwdCAqLwotI2RlZmluZSAgICAgICAgICAgICAgICAgICBFVEJFSSAgMHgyICAgICAgICAvKiBFbmFibGUgVHJhbnNtaXQgQnVmZmVyIEVtcHR5IEludGVycnVwdCAqLwotI2RlZmluZSAgICAgICAgICAgICAgICAgICAgRUxTSSAgMHg0ICAgICAgICAvKiBFbmFibGUgUmVjZWl2ZSBTdGF0dXMgSW50ZXJydXB0ICovCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgIEVEU1NJICAweDggICAgICAgIC8qIEVuYWJsZSBNb2RlbSBTdGF0dXMgSW50ZXJydXB0ICovCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgRURUUFRJICAweDEwICAgICAgIC8qIEVuYWJsZSBETUEgVHJhbnNtaXQgUElSUSBJbnRlcnJ1cHQgKi8KLSNkZWZpbmUgICAgICAgICAgICAgICAgICAgIEVURkkgIDB4MjAgICAgICAgLyogRW5hYmxlIFRyYW5zbWlzc2lvbiBGaW5pc2hlZCBJbnRlcnJ1cHQgKi8KLSNkZWZpbmUgICAgICAgICAgICAgICAgICAgRVJGQ0kgIDB4NDAgICAgICAgLyogRW5hYmxlIFJlY2VpdmUgRklGTyBDb3VudCBJbnRlcnJ1cHQgKi8KLQotLyogQml0IG1hc2tzIGZvciBVQVJUeF9HQ1RMICovCi0KLSNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgVUNFTiAgMHgxICAgICAgICAvKiBVQVJUIEVuYWJsZSAqLwotI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICBJUkVOICAweDIgICAgICAgIC8qIElyREEgTW9kZSBFbmFibGUgKi8KLSNkZWZpbmUgICAgICAgICAgICAgICAgICAgICBUUE9MQyAgMHg0ICAgICAgICAvKiBJckRBIFRYIFBvbGFyaXR5IENoYW5nZSAqLwotI2RlZmluZSAgICAgICAgICAgICAgICAgICAgIFJQT0xDICAweDggICAgICAgIC8qIElyREEgUlggUG9sYXJpdHkgQ2hhbmdlICovCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICBGUEUgIDB4MTAgICAgICAgLyogRm9yY2UgUGFyaXR5IEVycm9yICovCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICBGRkUgIDB4MjAgICAgICAgLyogRm9yY2UgRnJhbWluZyBFcnJvciAqLwotI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICBFREJPICAweDQwICAgICAgIC8qIEVuYWJsZSBEaXZpZGUtYnktT25lICovCi0jZGVmaW5lICAgICAgICAgICAgICAgICAgICAgRUdMU0kgIDB4ODAgICAgICAgLyogRW5hYmxlIEdsb2JhbCBMUyBJbnRlcnJ1cHQgKi8KLQotCiAvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCiAvKiAgICAgTVVMVEkgQklUIE1BQ1JPIEVOVU1FUkFUSU9OUyAgICAgICAgICAgICovCiAvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCkBAIC0yMjUxLDEzICsyMTg5LDYgQEAKICNkZWZpbmUgV0RUSF9DQVAgMHgwMDAyCiAjZGVmaW5lIEVYVF9DTEsgIDB4MDAwMwogCi0vKiBVQVJUeF9MQ1IgYml0IGZpZWxkIG9wdGlvbnMgKi8KLQotI2RlZmluZSBXTFNfNSAgIDB4MDAwMCAgICAvKiA1IGRhdGEgYml0cyAqLwotI2RlZmluZSBXTFNfNiAgIDB4MDAwMSAgICAvKiA2IGRhdGEgYml0cyAqLwotI2RlZmluZSBXTFNfNyAgIDB4MDAwMiAgICAvKiA3IGRhdGEgYml0cyAqLwotI2RlZmluZSBXTFNfOCAgIDB4MDAwMyAgICAvKiA4IGRhdGEgYml0cyAqLwotCiAvKiBQSU5UeCBSZWdpc3RlciBCaXQgRGVmaW5pdGlvbnMgKi8KIAogI2RlZmluZSBQSVEwIDB4MDAwMDAwMDEKQEAgLTIzMDAsMjQwICsyMjMxLDYgQEAKICNkZWZpbmUgUElRMzAgMHg0MDAwMDAwMAogI2RlZmluZSBQSVEzMSAweDgwMDAwMDAwCiAKLS8qIFBPUlQgQSBCaXQgRGVmaW5pdGlvbnMgZm9yIHRoZSByZWdpc3RlcnMKLVBPUlRBLCBQT1JUQV9TRVQsIFBPUlRBX0NMRUFSLAotUE9SVEFfRElSX1NFVCwgUE9SVEFfRElSX0NMRUFSLCBQT1JUQV9JTkVOLAotUE9SVEFfRkVSIHJlZ2lzdGVycwotKi8KLQotI2RlZmluZSBQQTAgMHgwMDAxCi0jZGVmaW5lIFBBMSAweDAwMDIKLSNkZWZpbmUgUEEyIDB4MDAwNAotI2RlZmluZSBQQTMgMHgwMDA4Ci0jZGVmaW5lIFBBNCAweDAwMTAKLSNkZWZpbmUgUEE1IDB4MDAyMAotI2RlZmluZSBQQTYgMHgwMDQwCi0jZGVmaW5lIFBBNyAweDAwODAKLSNkZWZpbmUgUEE4IDB4MDEwMAotI2RlZmluZSBQQTkgMHgwMjAwCi0jZGVmaW5lIFBBMTAgMHgwNDAwCi0jZGVmaW5lIFBBMTEgMHgwODAwCi0jZGVmaW5lIFBBMTIgMHgxMDAwCi0jZGVmaW5lIFBBMTMgMHgyMDAwCi0jZGVmaW5lIFBBMTQgMHg0MDAwCi0jZGVmaW5lIFBBMTUgMHg4MDAwCi0KLS8qIFBPUlQgQiBCaXQgRGVmaW5pdGlvbnMgZm9yIHRoZSByZWdpc3RlcnMKLVBPUlRCLCBQT1JUQl9TRVQsIFBPUlRCX0NMRUFSLAotUE9SVEJfRElSX1NFVCwgUE9SVEJfRElSX0NMRUFSLCBQT1JUQl9JTkVOLAotUE9SVEJfRkVSIHJlZ2lzdGVycwotKi8KLQotI2RlZmluZSBQQjAgMHgwMDAxCi0jZGVmaW5lIFBCMSAweDAwMDIKLSNkZWZpbmUgUEIyIDB4MDAwNAotI2RlZmluZSBQQjMgMHgwMDA4Ci0jZGVmaW5lIFBCNCAweDAwMTAKLSNkZWZpbmUgUEI1IDB4MDAyMAotI2RlZmluZSBQQjYgMHgwMDQwCi0jZGVmaW5lIFBCNyAweDAwODAKLSNkZWZpbmUgUEI4IDB4MDEwMAotI2RlZmluZSBQQjkgMHgwMjAwCi0jZGVmaW5lIFBCMTAgMHgwNDAwCi0jZGVmaW5lIFBCMTEgMHgwODAwCi0jZGVmaW5lIFBCMTIgMHgxMDAwCi0jZGVmaW5lIFBCMTMgMHgyMDAwCi0jZGVmaW5lIFBCMTQgMHg0MDAwCi0KLQotLyogUE9SVCBDIEJpdCBEZWZpbml0aW9ucyBmb3IgdGhlIHJlZ2lzdGVycwotUE9SVEMsIFBPUlRDX1NFVCwgUE9SVENfQ0xFQVIsCi1QT1JUQ19ESVJfU0VULCBQT1JUQ19ESVJfQ0xFQVIsIFBPUlRDX0lORU4sCi1QT1JUQ19GRVIgcmVnaXN0ZXJzCi0qLwotCi0KLSNkZWZpbmUgUEMwIDB4MDAwMQotI2RlZmluZSBQQzEgMHgwMDAyCi0jZGVmaW5lIFBDMiAweDAwMDQKLSNkZWZpbmUgUEMzIDB4MDAwOAotI2RlZmluZSBQQzQgMHgwMDEwCi0jZGVmaW5lIFBDNSAweDAwMjAKLSNkZWZpbmUgUEM2IDB4MDA0MAotI2RlZmluZSBQQzcgMHgwMDgwCi0jZGVmaW5lIFBDOCAweDAxMDAKLSNkZWZpbmUgUEM5IDB4MDIwMAotI2RlZmluZSBQQzEwIDB4MDQwMAotI2RlZmluZSBQQzExIDB4MDgwMAotI2RlZmluZSBQQzEyIDB4MTAwMAotI2RlZmluZSBQQzEzIDB4MjAwMAotCi0KLS8qIFBPUlQgRCBCaXQgRGVmaW5pdGlvbnMgZm9yIHRoZSByZWdpc3RlcnMKLVBPUlRELCBQT1JURF9TRVQsIFBPUlREX0NMRUFSLAotUE9SVERfRElSX1NFVCwgUE9SVERfRElSX0NMRUFSLCBQT1JURF9JTkVOLAotUE9SVERfRkVSIHJlZ2lzdGVycwotKi8KLQotI2RlZmluZSBQRDAgMHgwMDAxCi0jZGVmaW5lIFBEMSAweDAwMDIKLSNkZWZpbmUgUEQyIDB4MDAwNAotI2RlZmluZSBQRDMgMHgwMDA4Ci0jZGVmaW5lIFBENCAweDAwMTAKLSNkZWZpbmUgUEQ1IDB4MDAyMAotI2RlZmluZSBQRDYgMHgwMDQwCi0jZGVmaW5lIFBENyAweDAwODAKLSNkZWZpbmUgUEQ4IDB4MDEwMAotI2RlZmluZSBQRDkgMHgwMjAwCi0jZGVmaW5lIFBEMTAgMHgwNDAwCi0jZGVmaW5lIFBEMTEgMHgwODAwCi0jZGVmaW5lIFBEMTIgMHgxMDAwCi0jZGVmaW5lIFBEMTMgMHgyMDAwCi0jZGVmaW5lIFBEMTQgMHg0MDAwCi0jZGVmaW5lIFBEMTUgMHg4MDAwCi0KLS8qIFBPUlQgRSBCaXQgRGVmaW5pdGlvbnMgZm9yIHRoZSByZWdpc3RlcnMKLVBPUlRFLCBQT1JURV9TRVQsIFBPUlRFX0NMRUFSLAotUE9SVEVfRElSX1NFVCwgUE9SVEVfRElSX0NMRUFSLCBQT1JURV9JTkVOLAotUE9SVEVfRkVSIHJlZ2lzdGVycwotKi8KLQotCi0jZGVmaW5lIFBFMCAweDAwMDEKLSNkZWZpbmUgUEUxIDB4MDAwMgotI2RlZmluZSBQRTIgMHgwMDA0Ci0jZGVmaW5lIFBFMyAweDAwMDgKLSNkZWZpbmUgUEU0IDB4MDAxMAotI2RlZmluZSBQRTUgMHgwMDIwCi0jZGVmaW5lIFBFNiAweDAwNDAKLSNkZWZpbmUgUEU3IDB4MDA4MAotI2RlZmluZSBQRTggMHgwMTAwCi0jZGVmaW5lIFBFOSAweDAyMDAKLSNkZWZpbmUgUEUxMCAweDA0MDAKLSNkZWZpbmUgUEUxMSAweDA4MDAKLSNkZWZpbmUgUEUxMiAweDEwMDAKLSNkZWZpbmUgUEUxMyAweDIwMDAKLSNkZWZpbmUgUEUxNCAweDQwMDAKLSNkZWZpbmUgUEUxNSAweDgwMDAKLQotLyogUE9SVCBGIEJpdCBEZWZpbml0aW9ucyBmb3IgdGhlIHJlZ2lzdGVycwotUE9SVEYsIFBPUlRGX1NFVCwgUE9SVEZfQ0xFQVIsCi1QT1JURl9ESVJfU0VULCBQT1JURl9ESVJfQ0xFQVIsIFBPUlRGX0lORU4sCi1QT1JURl9GRVIgcmVnaXN0ZXJzCi0qLwotCi0KLSNkZWZpbmUgUEYwIDB4MDAwMQotI2RlZmluZSBQRjEgMHgwMDAyCi0jZGVmaW5lIFBGMiAweDAwMDQKLSNkZWZpbmUgUEYzIDB4MDAwOAotI2RlZmluZSBQRjQgMHgwMDEwCi0jZGVmaW5lIFBGNSAweDAwMjAKLSNkZWZpbmUgUEY2IDB4MDA0MAotI2RlZmluZSBQRjcgMHgwMDgwCi0jZGVmaW5lIFBGOCAweDAxMDAKLSNkZWZpbmUgUEY5IDB4MDIwMAotI2RlZmluZSBQRjEwIDB4MDQwMAotI2RlZmluZSBQRjExIDB4MDgwMAotI2RlZmluZSBQRjEyIDB4MTAwMAotI2RlZmluZSBQRjEzIDB4MjAwMAotI2RlZmluZSBQRjE0IDB4NDAwMAotI2RlZmluZSBQRjE1IDB4ODAwMAotCi0vKiBQT1JUIEcgQml0IERlZmluaXRpb25zIGZvciB0aGUgcmVnaXN0ZXJzCi1QT1JURywgUE9SVEdfU0VULCBQT1JUR19DTEVBUiwKLVBPUlRHX0RJUl9TRVQsIFBPUlRHX0RJUl9DTEVBUiwgUE9SVEdfSU5FTiwKLVBPUlRHX0ZFUiByZWdpc3RlcnMKLSovCi0KLQotI2RlZmluZSBQRzAgMHgwMDAxCi0jZGVmaW5lIFBHMSAweDAwMDIKLSNkZWZpbmUgUEcyIDB4MDAwNAotI2RlZmluZSBQRzMgMHgwMDA4Ci0jZGVmaW5lIFBHNCAweDAwMTAKLSNkZWZpbmUgUEc1IDB4MDAyMAotI2RlZmluZSBQRzYgMHgwMDQwCi0jZGVmaW5lIFBHNyAweDAwODAKLSNkZWZpbmUgUEc4IDB4MDEwMAotI2RlZmluZSBQRzkgMHgwMjAwCi0jZGVmaW5lIFBHMTAgMHgwNDAwCi0jZGVmaW5lIFBHMTEgMHgwODAwCi0jZGVmaW5lIFBHMTIgMHgxMDAwCi0jZGVmaW5lIFBHMTMgMHgyMDAwCi0jZGVmaW5lIFBHMTQgMHg0MDAwCi0jZGVmaW5lIFBHMTUgMHg4MDAwCi0KLS8qIFBPUlQgSCBCaXQgRGVmaW5pdGlvbnMgZm9yIHRoZSByZWdpc3RlcnMKLVBPUlRILCBQT1JUSF9TRVQsIFBPUlRIX0NMRUFSLAotUE9SVEhfRElSX1NFVCwgUE9SVEhfRElSX0NMRUFSLCBQT1JUSF9JTkVOLAotUE9SVEhfRkVSIHJlZ2lzdGVycwotKi8KLQotCi0jZGVmaW5lIFBIMCAweDAwMDEKLSNkZWZpbmUgUEgxIDB4MDAwMgotI2RlZmluZSBQSDIgMHgwMDA0Ci0jZGVmaW5lIFBIMyAweDAwMDgKLSNkZWZpbmUgUEg0IDB4MDAxMAotI2RlZmluZSBQSDUgMHgwMDIwCi0jZGVmaW5lIFBINiAweDAwNDAKLSNkZWZpbmUgUEg3IDB4MDA4MAotI2RlZmluZSBQSDggMHgwMTAwCi0jZGVmaW5lIFBIOSAweDAyMDAKLSNkZWZpbmUgUEgxMCAweDA0MDAKLSNkZWZpbmUgUEgxMSAweDA4MDAKLSNkZWZpbmUgUEgxMiAweDEwMDAKLSNkZWZpbmUgUEgxMyAweDIwMDAKLQotCi0vKiBQT1JUIEkgQml0IERlZmluaXRpb25zIGZvciB0aGUgcmVnaXN0ZXJzCi1QT1JUSSwgUE9SVElfU0VULCBQT1JUSV9DTEVBUiwKLVBPUlRJX0RJUl9TRVQsIFBPUlRJX0RJUl9DTEVBUiwgUE9SVElfSU5FTiwKLVBPUlRJX0ZFUiByZWdpc3RlcnMKLSovCi0KLQotI2RlZmluZSBQSTAgMHgwMDAxCi0jZGVmaW5lIFBJMSAweDAwMDIKLSNkZWZpbmUgUEkyIDB4MDAwNAotI2RlZmluZSBQSTMgMHgwMDA4Ci0jZGVmaW5lIFBJNCAweDAwMTAKLSNkZWZpbmUgUEk1IDB4MDAyMAotI2RlZmluZSBQSTYgMHgwMDQwCi0jZGVmaW5lIFBJNyAweDAwODAKLSNkZWZpbmUgUEk4IDB4MDEwMAotI2RlZmluZSBQSTkgMHgwMjAwCi0jZGVmaW5lIFBJMTAgMHgwNDAwCi0jZGVmaW5lIFBJMTEgMHgwODAwCi0jZGVmaW5lIFBJMTIgMHgxMDAwCi0jZGVmaW5lIFBJMTMgMHgyMDAwCi0jZGVmaW5lIFBJMTQgMHg0MDAwCi0jZGVmaW5lIFBJMTUgMHg4MDAwCi0KLS8qIFBPUlQgSiBCaXQgRGVmaW5pdGlvbnMgZm9yIHRoZSByZWdpc3RlcnMKLVBPUlRKLCBQT1JUSl9TRVQsIFBPUlRKX0NMRUFSLAotUE9SVEpfRElSX1NFVCwgUE9SVEpfRElSX0NMRUFSLCBQT1JUSl9JTkVOLAotUE9SVEpfRkVSIHJlZ2lzdGVycwotKi8KLQotCi0jZGVmaW5lIFBKMCAweDAwMDEKLSNkZWZpbmUgUEoxIDB4MDAwMgotI2RlZmluZSBQSjIgMHgwMDA0Ci0jZGVmaW5lIFBKMyAweDAwMDgKLSNkZWZpbmUgUEo0IDB4MDAxMAotI2RlZmluZSBQSjUgMHgwMDIwCi0jZGVmaW5lIFBKNiAweDAwNDAKLSNkZWZpbmUgUEo3IDB4MDA4MAotI2RlZmluZSBQSjggMHgwMTAwCi0jZGVmaW5lIFBKOSAweDAyMDAKLSNkZWZpbmUgUEoxMCAweDA0MDAKLSNkZWZpbmUgUEoxMSAweDA4MDAKLSNkZWZpbmUgUEoxMiAweDEwMDAKLSNkZWZpbmUgUEoxMyAweDIwMDAKLQotCiAvKiBQb3J0IE11eGluZyBCaXQgRmllbGRzIGZvciBQT1JUeF9NVVggUmVnaXN0ZXJzICovCiAKICNkZWZpbmUgTVVYMCAweDAwMDAwMDAzCkBAIC0yNzAzLDE2ICsyNDAwLDQgQEAKICNkZWZpbmUgQjNNQVBfUElIIDB4MDYwMDAwMDAgLyogTWFwIFBvcnQgSSBIaWdoIHRvIEJ5dGUgMyAqLwogI2RlZmluZSBCM01BUF9QSkggMHgwNzAwMDAwMCAvKiBNYXAgUG9ydCBKIEhpZ2ggdG8gQnl0ZSAzICovCiAKLQotLyogZm9yIGxlZ2FjeSBjb21wYXRpYmlsaXR5ICovCi0KLSNkZWZpbmUgV0xTKHgpICAoKCh4KS01KSAmIDB4MDMpIC8qIFdvcmQgTGVuZ3RoIFNlbGVjdCAqLwotI2RlZmluZSBXMUxNQVhfTUFYIFcxTE1BWF9NSU4KLSNkZWZpbmUgRUJJVV9BTUNCQ1RMMCBFQklVX0FNQkNUTDAKLSNkZWZpbmUgRUJJVV9BTUNCQ1RMMSBFQklVX0FNQkNUTDEKLSNkZWZpbmUgUElOVDBfSVJRIFBJTlQwX1JFUVVFU1QKLSNkZWZpbmUgUElOVDFfSVJRIFBJTlQxX1JFUVVFU1QKLSNkZWZpbmUgUElOVDJfSVJRIFBJTlQyX1JFUVVFU1QKLSNkZWZpbmUgUElOVDNfSVJRIFBJTlQzX1JFUVVFU1QKLQogI2VuZGlmIC8qIF9ERUZfQkY1NFhfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2luY2x1ZGUvbWFjaC9ncGlvLmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvaW5jbHVkZS9tYWNoL2dwaW8uaAppbmRleCAyODAzN2UzLi43ZGI0MzM1IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvaW5jbHVkZS9tYWNoL2dwaW8uaAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvaW5jbHVkZS9tYWNoL2dwaW8uaApAQCAtMjAwLDQgKzIwMCwxNSBAQAogCiAjZW5kaWYKIAorI2luY2x1ZGUgPG1hY2gtY29tbW9uL3BvcnRzLWEuaD4KKyNpbmNsdWRlIDxtYWNoLWNvbW1vbi9wb3J0cy1iLmg+CisjaW5jbHVkZSA8bWFjaC1jb21tb24vcG9ydHMtYy5oPgorI2luY2x1ZGUgPG1hY2gtY29tbW9uL3BvcnRzLWQuaD4KKyNpbmNsdWRlIDxtYWNoLWNvbW1vbi9wb3J0cy1lLmg+CisjaW5jbHVkZSA8bWFjaC1jb21tb24vcG9ydHMtZi5oPgorI2luY2x1ZGUgPG1hY2gtY29tbW9uL3BvcnRzLWcuaD4KKyNpbmNsdWRlIDxtYWNoLWNvbW1vbi9wb3J0cy1oLmg+CisjaW5jbHVkZSA8bWFjaC1jb21tb24vcG9ydHMtaS5oPgorI2luY2x1ZGUgPG1hY2gtY29tbW9uL3BvcnRzLWouaD4KKwogI2VuZGlmIC8qIF9NQUNIX0dQSU9fSF8gKi8KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9pbmNsdWRlL21hY2gvaXJxLmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvaW5jbHVkZS9tYWNoL2lycS5oCmluZGV4IDFmOTliNTEuLjk5ZmQxYjIgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9pbmNsdWRlL21hY2gvaXJxLmgKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2luY2x1ZGUvbWFjaC9pcnEuaApAQCAtNDc0LDQgKzQ3NCwyNiBAQAogI2RlZmluZSBJUlFfUElOVDJfUE9TCQkyNAogI2RlZmluZSBJUlFfUElOVDNfUE9TCQkyOAogCisjaWZuZGVmIF9fQVNTRU1CTFlfXworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKy8qCisgKiBiZmluIHBpbnQgcmVnaXN0ZXJzIGxheW91dAorICovCitzdHJ1Y3QgYmZpbl9waW50X3JlZ3MgeworCXUzMiBtYXNrX3NldDsKKwl1MzIgbWFza19jbGVhcjsKKwl1MzIgaXJxOworCXUzMiBhc3NpZ247CisJdTMyIGVkZ2Vfc2V0OworCXUzMiBlZGdlX2NsZWFyOworCXUzMiBpbnZlcnRfc2V0OworCXUzMiBpbnZlcnRfY2xlYXI7CisJdTMyIHBpbnN0YXRlOworCXUzMiBsYXRjaDsKKwl1MzIgX19wYWQwWzJdOworfTsKKworI2VuZGlmCisKICNlbmRpZiAvKiBfQkY1NDhfSVJRX0hfICovCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvaW5jbHVkZS9tYWNoL3BsbC5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2luY2x1ZGUvbWFjaC9wbGwuaAppbmRleCA3ODY1YTA5Li45NGNjYTY3IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvaW5jbHVkZS9tYWNoL3BsbC5oCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9pbmNsdWRlL21hY2gvcGxsLmgKQEAgLTEsNjkgKzEgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwNy0yMDA4IEFuYWxvZyBEZXZpY2VzIEluYy4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCi0gKi8KLQotI2lmbmRlZiBfTUFDSF9QTExfSAotI2RlZmluZSBfTUFDSF9QTExfSAotCi0jaW5jbHVkZSA8YXNtL2JsYWNrZmluLmg+Ci0jaW5jbHVkZSA8YXNtL2lycWZsYWdzLmg+Ci0KLS8qIFdyaXRpbmcgdG8gUExMX0NUTCBpbml0aWF0ZXMgYSBQTEwgcmVsb2NrIHNlcXVlbmNlLiAqLwotc3RhdGljIF9faW5saW5lX18gdm9pZCBiZmluX3dyaXRlX1BMTF9DVEwodW5zaWduZWQgaW50IHZhbCkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzLCBpd3IwLCBpd3IxLCBpd3IyOwotCi0JaWYgKHZhbCA9PSBiZmluX3JlYWRfUExMX0NUTCgpKQotCQlyZXR1cm47Ci0KLQlmbGFncyA9IGhhcmRfbG9jYWxfaXJxX3NhdmUoKTsKLQkvKiBFbmFibGUgdGhlIFBMTCBXYWtldXAgYml0IGluIFNJQyBJV1IgKi8KLQlpd3IwID0gYmZpbl9yZWFkMzIoU0lDX0lXUjApOwotCWl3cjEgPSBiZmluX3JlYWQzMihTSUNfSVdSMSk7Ci0JaXdyMiA9IGJmaW5fcmVhZDMyKFNJQ19JV1IyKTsKLQkvKiBPbmx5IGFsbG93IFBQTCBXYWtldXApICovCi0JYmZpbl93cml0ZTMyKFNJQ19JV1IwLCBJV1JfRU5BQkxFKDApKTsKLQliZmluX3dyaXRlMzIoU0lDX0lXUjEsIDApOwotCWJmaW5fd3JpdGUzMihTSUNfSVdSMiwgMCk7Ci0KLQliZmluX3dyaXRlMTYoUExMX0NUTCwgdmFsKTsKLQlTU1lOQygpOwotCWFzbSgiSURMRTsiKTsKLQotCWJmaW5fd3JpdGUzMihTSUNfSVdSMCwgaXdyMCk7Ci0JYmZpbl93cml0ZTMyKFNJQ19JV1IxLCBpd3IxKTsKLQliZmluX3dyaXRlMzIoU0lDX0lXUjIsIGl3cjIpOwotCWhhcmRfbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotfQotCi0vKiBXcml0aW5nIHRvIFZSX0NUTCBpbml0aWF0ZXMgYSBQTEwgcmVsb2NrIHNlcXVlbmNlLiAqLwotc3RhdGljIF9faW5saW5lX18gdm9pZCBiZmluX3dyaXRlX1ZSX0NUTCh1bnNpZ25lZCBpbnQgdmFsKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIGl3cjAsIGl3cjEsIGl3cjI7Ci0KLQlpZiAodmFsID09IGJmaW5fcmVhZF9WUl9DVEwoKSkKLQkJcmV0dXJuOwotCi0JZmxhZ3MgPSBoYXJkX2xvY2FsX2lycV9zYXZlKCk7Ci0JLyogRW5hYmxlIHRoZSBQTEwgV2FrZXVwIGJpdCBpbiBTSUMgSVdSICovCi0JaXdyMCA9IGJmaW5fcmVhZDMyKFNJQ19JV1IwKTsKLQlpd3IxID0gYmZpbl9yZWFkMzIoU0lDX0lXUjEpOwotCWl3cjIgPSBiZmluX3JlYWQzMihTSUNfSVdSMik7Ci0JLyogT25seSBhbGxvdyBQUEwgV2FrZXVwKSAqLwotCWJmaW5fd3JpdGUzMihTSUNfSVdSMCwgSVdSX0VOQUJMRSgwKSk7Ci0JYmZpbl93cml0ZTMyKFNJQ19JV1IxLCAwKTsKLQliZmluX3dyaXRlMzIoU0lDX0lXUjIsIDApOwotCi0JYmZpbl93cml0ZTE2KFZSX0NUTCwgdmFsKTsKLQlTU1lOQygpOwotCWFzbSgiSURMRTsiKTsKLQotCWJmaW5fd3JpdGUzMihTSUNfSVdSMCwgaXdyMCk7Ci0JYmZpbl93cml0ZTMyKFNJQ19JV1IxLCBpd3IxKTsKLQliZmluX3dyaXRlMzIoU0lDX0lXUjIsIGl3cjIpOwotCWhhcmRfbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotfQotCi0jZW5kaWYgLyogX01BQ0hfUExMX0ggKi8KKyNpbmNsdWRlIDxtYWNoLWNvbW1vbi9wbGwuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9hdG9taWMuUyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9hdG9taWMuUwppbmRleCBmOTlmMTc0Li41MmQ2ZjczIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvYXRvbWljLlMKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2F0b21pYy5TCkBAIC00OSw2ICs0OSw3IEBACiAJanVtcCAuTHJldHJ5X2NvcmVsb2NrCiAuTGRvbmVfY29yZWxvY2s6CiAJcDAgPSByMTsKKwkvKiBmbHVzaCBjb3JlIGludGVybmFsIHdyaXRlIGJ1ZmZlciBiZWZvcmUgaW52YWxpZGF0ZSBkY2FjaGUgKi8KIAlDU1lOQyhyMik7CiAJZmx1c2hpbnZbcDBdOwogCVNTWU5DKHIyKTsKQEAgLTY4NSw2ICs2ODYsOCBAQAogCXIxID0gLUwxX0NBQ0hFX0JZVEVTOwogCXIxID0gcjAgJiByMTsKIAlwMCA9IHIxOworCS8qIGZsdXNoIGNvcmUgaW50ZXJuYWwgd3JpdGUgYnVmZmVyIGJlZm9yZSBpbnZhbGlkYXRlIGRjYWNoZSAqLworCUNTWU5DKHIyKTsKIAlmbHVzaGludltwMF07CiAJU1NZTkMocjIpOwogCXIwID0gW3AxXTsKQEAgLTkwNyw2ICs5MTAsOCBAQAogCXIxID0gLUwxX0NBQ0hFX0JZVEVTOwogCXIxID0gcjAgJiByMTsKIAlwMCA9IHIxOworCS8qIGZsdXNoIGNvcmUgaW50ZXJuYWwgd3JpdGUgYnVmZmVyIGJlZm9yZSBpbnZhbGlkYXRlIGRjYWNoZSAqLworCUNTWU5DKHIyKTsKIAlmbHVzaGludltwMF07CiAJU1NZTkMocjIpOwogCXIwID0gW3AxXTsKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9ib2FyZHMvYWN2aWxvbi5jIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2JvYXJkcy9hY3ZpbG9uLmMKaW5kZXggMGIxYzIwZi4uMzkyNmNkOSAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2JvYXJkcy9hY3ZpbG9uLmMKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2JvYXJkcy9hY3ZpbG9uLmMKQEAgLTIyNCw3ICsyMjQsNyBAQAogCSB9LAogfTsKIAotdW5zaWduZWQgc2hvcnQgYmZpbl91YXJ0MF9wZXJpcGhlcmFsc1tdID0geworc3RhdGljIHVuc2lnbmVkIHNob3J0IGJmaW5fdWFydDBfcGVyaXBoZXJhbHNbXSA9IHsKIAlQX1VBUlQwX1RYLCBQX1VBUlQwX1JYLCAwCiB9OwogCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvYm9hcmRzL2NtX2JmNTYxLmMgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvYm9hcmRzL2NtX2JmNTYxLmMKaW5kZXggMDg3YjZiMC4uM2I2NzkyOSAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2JvYXJkcy9jbV9iZjU2MS5jCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9ib2FyZHMvY21fYmY1NjEuYwpAQCAtMzM0LDcgKzMzNCw3IEBACiAJfSwKIH07CiAKLXVuc2lnbmVkIHNob3J0IGJmaW5fdWFydDBfcGVyaXBoZXJhbHNbXSA9IHsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBiZmluX3VhcnQwX3BlcmlwaGVyYWxzW10gPSB7CiAJUF9VQVJUMF9UWCwgUF9VQVJUMF9SWCwgMAogfTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2JvYXJkcy9lemtpdC5jIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2JvYXJkcy9lemtpdC5jCmluZGV4IGFiN2E0ODcuLmY2NjdlNzcgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9ib2FyZHMvZXpraXQuYworKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvYm9hcmRzL2V6a2l0LmMKQEAgLTE5MCw3ICsxOTAsNyBAQAogCX0sCiB9OwogCi11bnNpZ25lZCBzaG9ydCBiZmluX3VhcnQwX3BlcmlwaGVyYWxzW10gPSB7CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgYmZpbl91YXJ0MF9wZXJpcGhlcmFsc1tdID0gewogCVBfVUFSVDBfVFgsIFBfVUFSVDBfUlgsIDAKIH07CiAKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9ib2FyZHMvdGVwbGEuYyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9ib2FyZHMvdGVwbGEuYwppbmRleCBkMzAxN2U1Li5iYjA1NmU2IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvYm9hcmRzL3RlcGxhLmMKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2JvYXJkcy90ZXBsYS5jCkBAIC03Miw3ICs3Miw3IEBACiAJfSwKIH07CiAKLXVuc2lnbmVkIHNob3J0IGJmaW5fdWFydDBfcGVyaXBoZXJhbHNbXSA9IHsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBiZmluX3VhcnQwX3BlcmlwaGVyYWxzW10gPSB7CiAJUF9VQVJUMF9UWCwgUF9VQVJUMF9SWCwgMAogfTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2RtYS5jIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2RtYS5jCmluZGV4IGM5MzhjM2MuLjhmZmRkNmIgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9kbWEuYworKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvZG1hLmMKQEAgLTExLDcgKzExLDcgQEAKICNpbmNsdWRlIDxhc20vYmxhY2tmaW4uaD4KICNpbmNsdWRlIDxhc20vZG1hLmg+CiAKLXN0cnVjdCBkbWFfcmVnaXN0ZXIgKmRtYV9pb19iYXNlX2FkZHJbTUFYX0RNQV9DSEFOTkVMU10gPSB7CitzdHJ1Y3QgZG1hX3JlZ2lzdGVyICogY29uc3QgZG1hX2lvX2Jhc2VfYWRkcltNQVhfRE1BX0NIQU5ORUxTXSA9IHsKIAkoc3RydWN0IGRtYV9yZWdpc3RlciAqKSBETUExXzBfTkVYVF9ERVNDX1BUUiwKIAkoc3RydWN0IGRtYV9yZWdpc3RlciAqKSBETUExXzFfTkVYVF9ERVNDX1BUUiwKIAkoc3RydWN0IGRtYV9yZWdpc3RlciAqKSBETUExXzJfTkVYVF9ERVNDX1BUUiwKQEAgLTM2LDE0ICszNiwxNCBAQAogCShzdHJ1Y3QgZG1hX3JlZ2lzdGVyICopIERNQTJfOV9ORVhUX0RFU0NfUFRSLAogCShzdHJ1Y3QgZG1hX3JlZ2lzdGVyICopIERNQTJfMTBfTkVYVF9ERVNDX1BUUiwKIAkoc3RydWN0IGRtYV9yZWdpc3RlciAqKSBETUEyXzExX05FWFRfREVTQ19QVFIsCi0JKHN0cnVjdCBkbWFfcmVnaXN0ZXIgKikgTURNQTFfRDBfTkVYVF9ERVNDX1BUUiwKLQkoc3RydWN0IGRtYV9yZWdpc3RlciAqKSBNRE1BMV9TMF9ORVhUX0RFU0NfUFRSLAotCShzdHJ1Y3QgZG1hX3JlZ2lzdGVyICopIE1ETUExX0QxX05FWFRfREVTQ19QVFIsCi0JKHN0cnVjdCBkbWFfcmVnaXN0ZXIgKikgTURNQTFfUzFfTkVYVF9ERVNDX1BUUiwKLQkoc3RydWN0IGRtYV9yZWdpc3RlciAqKSBNRE1BMl9EMF9ORVhUX0RFU0NfUFRSLAotCShzdHJ1Y3QgZG1hX3JlZ2lzdGVyICopIE1ETUEyX1MwX05FWFRfREVTQ19QVFIsCi0JKHN0cnVjdCBkbWFfcmVnaXN0ZXIgKikgTURNQTJfRDFfTkVYVF9ERVNDX1BUUiwKLQkoc3RydWN0IGRtYV9yZWdpc3RlciAqKSBNRE1BMl9TMV9ORVhUX0RFU0NfUFRSLAorCShzdHJ1Y3QgZG1hX3JlZ2lzdGVyICopIE1ETUFfRDBfTkVYVF9ERVNDX1BUUiwKKwkoc3RydWN0IGRtYV9yZWdpc3RlciAqKSBNRE1BX1MwX05FWFRfREVTQ19QVFIsCisJKHN0cnVjdCBkbWFfcmVnaXN0ZXIgKikgTURNQV9EMV9ORVhUX0RFU0NfUFRSLAorCShzdHJ1Y3QgZG1hX3JlZ2lzdGVyICopIE1ETUFfUzFfTkVYVF9ERVNDX1BUUiwKKwkoc3RydWN0IGRtYV9yZWdpc3RlciAqKSBNRE1BX0QyX05FWFRfREVTQ19QVFIsCisJKHN0cnVjdCBkbWFfcmVnaXN0ZXIgKikgTURNQV9TMl9ORVhUX0RFU0NfUFRSLAorCShzdHJ1Y3QgZG1hX3JlZ2lzdGVyICopIE1ETUFfRDNfTkVYVF9ERVNDX1BUUiwKKwkoc3RydWN0IGRtYV9yZWdpc3RlciAqKSBNRE1BX1MzX05FWFRfREVTQ19QVFIsCiAJKHN0cnVjdCBkbWFfcmVnaXN0ZXIgKikgSU1ETUFfRDBfTkVYVF9ERVNDX1BUUiwKIAkoc3RydWN0IGRtYV9yZWdpc3RlciAqKSBJTURNQV9TMF9ORVhUX0RFU0NfUFRSLAogCShzdHJ1Y3QgZG1hX3JlZ2lzdGVyICopIElNRE1BX0QxX05FWFRfREVTQ19QVFIsCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvaG90cGx1Zy5jIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2hvdHBsdWcuYwppbmRleCBjOTUxNjliLi40Y2QzYjI4IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvaG90cGx1Zy5jCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9ob3RwbHVnLmMKQEAgLTYsNyArNiw5IEBACiAgKi8KIAogI2luY2x1ZGUgPGFzbS9ibGFja2Zpbi5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxhc20vc21wLmg+CisKICNkZWZpbmUgU0lDX1NZU0lSUShpcnEpCShpcnEgLSAoSVJRX0NPUkVUTVIgKyAxKSkKIAogaW50IGhvdHBsdWdfY29yZWI7CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvaW5jbHVkZS9tYWNoL2Fub21hbHkuaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9pbmNsdWRlL21hY2gvYW5vbWFseS5oCmluZGV4IDRjMTA4YzkuLjZhMzQ5OWIgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9pbmNsdWRlL21hY2gvYW5vbWFseS5oCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9pbmNsdWRlL21hY2gvYW5vbWFseS5oCkBAIC0xODEsNyArMTgxLDExIEBACiAvKiBJbmNvcnJlY3QgVGltZXIgUHVsc2UgV2lkdGggaW4gU2luZ2xlLVNob3QgUFdNX09VVCBNb2RlIHdpdGggRXh0ZXJuYWwgQ2xvY2sgKi8KICNkZWZpbmUgQU5PTUFMWV8wNTAwMDI1NCAoX19TSUxJQ09OX1JFVklTSU9OX18gPiAzKQogLyogSW50ZXJydXB0L0V4Y2VwdGlvbiBEdXJpbmcgU2hvcnQgSGFyZHdhcmUgTG9vcCBNYXkgQ2F1c2UgQmFkIEluc3RydWN0aW9uIEZldGNoZXMgKi8KLSNkZWZpbmUgQU5PTUFMWV8wNTAwMDI1NyAoX19TSUxJQ09OX1JFVklTSU9OX18gPCA1KQorLyogVGVtcG9hcnkgd29yayBhcm91bmQgZm9yIGtnZGIgYnVnIDYzMzMgaW4gU01QIGtlcm5lbC4gSXQgbG9va3MgY29yZWIgaGFuZ3MgaW4gZXhjZXB0aW9uCisgKiB3aXRob3V0IGhhbmRsaW5nIGFub21hbHkgMDUwMDAyNTcgcHJvcGVybHkgb24gYmY1NjEgdjAuNS4gVGhpcyB3b3JrIGFyb3VuZCBtYXkgY2hhbmdlCisgKiBhZnRlciB0aGUgYmVoYXZpb3IgYW5kIHRoZSByb290IGNhdXNlIGFyZSBjb25maXJtZWQgd2l0aCBoYXJkd2FyZSB0ZWFtLgorICovCisjZGVmaW5lIEFOT01BTFlfMDUwMDAyNTcgKF9fU0lMSUNPTl9SRVZJU0lPTl9fIDwgNSB8fCAoX19TSUxJQ09OX1JFVklTSU9OX18gPT0gNSAmJiBDT05GSUdfU01QKSkKIC8qIEluc3RydWN0aW9uIENhY2hlIElzIENvcnJ1cHRlZCBXaGVuIEJpdHMgOSBhbmQgMTIgb2YgdGhlIElDUExCIERhdGEgUmVnaXN0ZXJzIERpZmZlciAqLwogI2RlZmluZSBBTk9NQUxZXzA1MDAwMjU4IChfX1NJTElDT05fUkVWSVNJT05fXyA8IDUpCiAvKiBJQ1BMQl9TVEFUVVMgTU1SIFJlZ2lzdGVyIE1heSBCZSBDb3JydXB0ZWQgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9pbmNsdWRlL21hY2gvYmZpbl9zZXJpYWwuaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9pbmNsdWRlL21hY2gvYmZpbl9zZXJpYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODA3MmM4Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2luY2x1ZGUvbWFjaC9iZmluX3NlcmlhbC5oCkBAIC0wLDAgKzEsMTQgQEAKKy8qCisgKiBtYWNoL2JmaW5fc2VyaWFsLmggLSBCbGFja2ZpbiBVQVJUL1NlcmlhbCBkZWZpbml0aW9ucworICoKKyAqIENvcHlyaWdodCAyMDA2LTIwMTAgQW5hbG9nIERldmljZXMgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KKyAqLworCisjaWZuZGVmIF9fQkZJTl9NQUNIX1NFUklBTF9IX18KKyNkZWZpbmUgX19CRklOX01BQ0hfU0VSSUFMX0hfXworCisjZGVmaW5lIEJGSU5fVUFSVF9OUl9QT1JUUwkxCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2luY2x1ZGUvbWFjaC9iZmluX3NlcmlhbF81eHguaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9pbmNsdWRlL21hY2gvYmZpbl9zZXJpYWxfNXh4LmgKaW5kZXggZTMzZTE1OC4uM2E2OTQ3NCAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2luY2x1ZGUvbWFjaC9iZmluX3NlcmlhbF81eHguaAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvaW5jbHVkZS9tYWNoL2JmaW5fc2VyaWFsXzV4eC5oCkBAIC00LDM2ICs0LDkgQEAKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KICAqLwogCi0jaW5jbHVkZSA8bGludXgvc2VyaWFsLmg+CiAjaW5jbHVkZSA8YXNtL2RtYS5oPgogI2luY2x1ZGUgPGFzbS9wb3J0bXV4Lmg+CiAKLSNkZWZpbmUgVUFSVF9HRVRfQ0hBUih1YXJ0KSAgICAgYmZpbl9yZWFkMTYoKCh1YXJ0KS0+cG9ydC5tZW1iYXNlICsgT0ZGU0VUX1JCUikpCi0jZGVmaW5lIFVBUlRfR0VUX0RMTCh1YXJ0KQliZmluX3JlYWQxNigoKHVhcnQpLT5wb3J0Lm1lbWJhc2UgKyBPRkZTRVRfRExMKSkKLSNkZWZpbmUgVUFSVF9HRVRfSUVSKHVhcnQpICAgICAgYmZpbl9yZWFkMTYoKCh1YXJ0KS0+cG9ydC5tZW1iYXNlICsgT0ZGU0VUX0lFUikpCi0jZGVmaW5lIFVBUlRfR0VUX0RMSCh1YXJ0KQliZmluX3JlYWQxNigoKHVhcnQpLT5wb3J0Lm1lbWJhc2UgKyBPRkZTRVRfRExIKSkKLSNkZWZpbmUgVUFSVF9HRVRfSUlSKHVhcnQpICAgICAgYmZpbl9yZWFkMTYoKCh1YXJ0KS0+cG9ydC5tZW1iYXNlICsgT0ZGU0VUX0lJUikpCi0jZGVmaW5lIFVBUlRfR0VUX0xDUih1YXJ0KSAgICAgIGJmaW5fcmVhZDE2KCgodWFydCktPnBvcnQubWVtYmFzZSArIE9GRlNFVF9MQ1IpKQotI2RlZmluZSBVQVJUX0dFVF9HQ1RMKHVhcnQpICAgICBiZmluX3JlYWQxNigoKHVhcnQpLT5wb3J0Lm1lbWJhc2UgKyBPRkZTRVRfR0NUTCkpCi0KLSNkZWZpbmUgVUFSVF9QVVRfQ0hBUih1YXJ0LHYpICAgYmZpbl93cml0ZTE2KCgodWFydCktPnBvcnQubWVtYmFzZSArIE9GRlNFVF9USFIpLHYpCi0jZGVmaW5lIFVBUlRfUFVUX0RMTCh1YXJ0LHYpICAgIGJmaW5fd3JpdGUxNigoKHVhcnQpLT5wb3J0Lm1lbWJhc2UgKyBPRkZTRVRfRExMKSx2KQotI2RlZmluZSBVQVJUX1BVVF9JRVIodWFydCx2KSAgICBiZmluX3dyaXRlMTYoKCh1YXJ0KS0+cG9ydC5tZW1iYXNlICsgT0ZGU0VUX0lFUiksdikKLSNkZWZpbmUgVUFSVF9TRVRfSUVSKHVhcnQsdikgICAgVUFSVF9QVVRfSUVSKHVhcnQsIFVBUlRfR0VUX0lFUih1YXJ0KSB8ICh2KSkKLSNkZWZpbmUgVUFSVF9DTEVBUl9JRVIodWFydCx2KSAgVUFSVF9QVVRfSUVSKHVhcnQsIFVBUlRfR0VUX0lFUih1YXJ0KSAmIH4odikpCi0jZGVmaW5lIFVBUlRfUFVUX0RMSCh1YXJ0LHYpICAgIGJmaW5fd3JpdGUxNigoKHVhcnQpLT5wb3J0Lm1lbWJhc2UgKyBPRkZTRVRfRExIKSx2KQotI2RlZmluZSBVQVJUX1BVVF9MQ1IodWFydCx2KSAgICBiZmluX3dyaXRlMTYoKCh1YXJ0KS0+cG9ydC5tZW1iYXNlICsgT0ZGU0VUX0xDUiksdikKLSNkZWZpbmUgVUFSVF9QVVRfR0NUTCh1YXJ0LHYpICAgYmZpbl93cml0ZTE2KCgodWFydCktPnBvcnQubWVtYmFzZSArIE9GRlNFVF9HQ1RMKSx2KQotCi0jZGVmaW5lIFVBUlRfU0VUX0RMQUIodWFydCkgICAgIGRvIHsgVUFSVF9QVVRfTENSKHVhcnQsIFVBUlRfR0VUX0xDUih1YXJ0KSB8IERMQUIpOyBTU1lOQygpOyB9IHdoaWxlICgwKQotI2RlZmluZSBVQVJUX0NMRUFSX0RMQUIodWFydCkgICBkbyB7IFVBUlRfUFVUX0xDUih1YXJ0LCBVQVJUX0dFVF9MQ1IodWFydCkgJiB+RExBQik7IFNTWU5DKCk7IH0gd2hpbGUgKDApCi0KLSNkZWZpbmUgVUFSVF9HRVRfQ1RTKHgpIGdwaW9fZ2V0X3ZhbHVlKHgtPmN0c19waW4pCi0jZGVmaW5lIFVBUlRfRElTQUJMRV9SVFMoeCkgZ3Bpb19zZXRfdmFsdWUoeC0+cnRzX3BpbiwgMSkKLSNkZWZpbmUgVUFSVF9FTkFCTEVfUlRTKHgpIGdwaW9fc2V0X3ZhbHVlKHgtPnJ0c19waW4sIDApCi0jZGVmaW5lIFVBUlRfRU5BQkxFX0lOVFMoeCwgdikgVUFSVF9QVVRfSUVSKHgsIHYpCi0jZGVmaW5lIFVBUlRfRElTQUJMRV9JTlRTKHgpIFVBUlRfUFVUX0lFUih4LCAwKQotCiAjaWZkZWYgQ09ORklHX0JGSU5fVUFSVDBfQ1RTUlRTCiAjIGRlZmluZSBDT05GSUdfU0VSSUFMX0JGSU5fQ1RTUlRTCiAjIGlmbmRlZiBDT05GSUdfVUFSVDBfQ1RTX1BJTgpAQCAtNDQsNTEgKzE3LDYgQEAKICMgZW5kaWYKICNlbmRpZgogCi0jZGVmaW5lIEJGSU5fVUFSVF9UWF9GSUZPX1NJWkUJMgotCi1zdHJ1Y3QgYmZpbl9zZXJpYWxfcG9ydCB7Ci0gICAgICAgIHN0cnVjdCB1YXJ0X3BvcnQgICAgICAgIHBvcnQ7Ci0gICAgICAgIHVuc2lnbmVkIGludCAgICAgICAgICAgIG9sZF9zdGF0dXM7Ci0JaW50CQkJc3RhdHVzX2lycTsKLQl1bnNpZ25lZCBpbnQgbHNyOwotI2lmZGVmIENPTkZJR19TRVJJQUxfQkZJTl9ETUEKLQlpbnQJCQl0eF9kb25lOwotCWludAkJCXR4X2NvdW50OwotCXN0cnVjdCBjaXJjX2J1ZgkJcnhfZG1hX2J1ZjsKLQlzdHJ1Y3QgdGltZXJfbGlzdCAgICAgICByeF9kbWFfdGltZXI7Ci0JaW50CQkJcnhfZG1hX25yb3dzOwotCXVuc2lnbmVkIGludAkJdHhfZG1hX2NoYW5uZWw7Ci0JdW5zaWduZWQgaW50CQlyeF9kbWFfY2hhbm5lbDsKLQlzdHJ1Y3Qgd29ya19zdHJ1Y3QJdHhfZG1hX3dvcmtxdWV1ZTsKLSNlbHNlCi0jIGlmIEFOT01BTFlfMDUwMDAzNjMKLQl1bnNpZ25lZCBpbnQgYW5vbWFseV90aHJlc2hvbGQ7Ci0jIGVuZGlmCi0jZW5kaWYKLSNpZmRlZiBDT05GSUdfU0VSSUFMX0JGSU5fQ1RTUlRTCi0Jc3RydWN0IHRpbWVyX2xpc3QgICAgICAgY3RzX3RpbWVyOwotCWludAkJCWN0c19waW47Ci0JaW50CQkJcnRzX3BpbjsKLSNlbmRpZgotfTsKLQotLyogVGhlIGhhcmR3YXJlIGNsZWFycyB0aGUgTFNSIGJpdHMgdXBvbiByZWFkLCBzbyB3ZSBuZWVkIHRvIGNhY2hlCi0gKiBzb21lIG9mIHRoZSBtb3JlIGZ1biBiaXRzIGluIHNvZnR3YXJlIHNvIHRoZXkgZG9uJ3QgZ2V0IGxvc3QKLSAqIHdoZW4gY2hlY2tpbmcgdGhlIExTUiBpbiBvdGhlciBjb2RlIHBhdGhzIChUWCkuCi0gKi8KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IFVBUlRfR0VUX0xTUihzdHJ1Y3QgYmZpbl9zZXJpYWxfcG9ydCAqdWFydCkKLXsKLQl1bnNpZ25lZCBpbnQgbHNyID0gYmZpbl9yZWFkMTYodWFydC0+cG9ydC5tZW1iYXNlICsgT0ZGU0VUX0xTUik7Ci0JdWFydC0+bHNyIHw9IChsc3IgJiAoQkl8RkV8UEV8T0UpKTsKLQlyZXR1cm4gbHNyIHwgdWFydC0+bHNyOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgVUFSVF9DTEVBUl9MU1Ioc3RydWN0IGJmaW5fc2VyaWFsX3BvcnQgKnVhcnQpCi17Ci0JdWFydC0+bHNyID0gMDsKLQliZmluX3dyaXRlMTYodWFydC0+cG9ydC5tZW1iYXNlICsgT0ZGU0VUX0xTUiwgLTEpOwotfQotCiBzdHJ1Y3QgYmZpbl9zZXJpYWxfcmVzIHsKIAl1bnNpZ25lZCBsb25nCXVhcnRfYmFzZV9hZGRyOwogCWludAkJdWFydF9pcnE7CkBAIC0xMjAsMyArNDgsNSBAQAogfTsKIAogI2RlZmluZSBEUklWRVJfTkFNRSAiYmZpbi11YXJ0IgorCisjaW5jbHVkZSA8YXNtL2JmaW5fc2VyaWFsLmg+CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvaW5jbHVkZS9tYWNoL2JsYWNrZmluLmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvaW5jbHVkZS9tYWNoL2JsYWNrZmluLmgKaW5kZXggNmM3ZGM1OC4uZGM0NzA1MyAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2luY2x1ZGUvbWFjaC9ibGFja2Zpbi5oCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9pbmNsdWRlL21hY2gvYmxhY2tmaW4uaApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNS0yMDA5IEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqIENvcHlyaWdodCAyMDA1LTIwMTAgQW5hbG9nIERldmljZXMgSW5jLgogICoKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KICAqLwpAQCAtMTAsMTEgKzEwLDE0IEBACiAjZGVmaW5lIEJGNTYxX0ZBTUlMWQogCiAjaW5jbHVkZSAiYmY1NjEuaCIKLSNpbmNsdWRlICJkZWZCRjU2MS5oIgogI2luY2x1ZGUgImFub21hbHkuaCIKIAotI2lmICFkZWZpbmVkKF9fQVNTRU1CTFlfXykKLSNpbmNsdWRlICJjZGVmQkY1NjEuaCIKKyNpbmNsdWRlIDxhc20vZGVmX0xQQmxhY2tmaW4uaD4KKyNpbmNsdWRlICJkZWZCRjU2MS5oIgorCisjaWZuZGVmIF9fQVNTRU1CTFlfXworIyBpbmNsdWRlIDxhc20vY2RlZl9MUEJsYWNrZmluLmg+CisjIGluY2x1ZGUgImNkZWZCRjU2MS5oIgogI2VuZGlmCiAKICNkZWZpbmUgYmZpbl9yZWFkX0ZJT19GTEFHX0QoKSBiZmluX3JlYWRfRklPMF9GTEFHX0QoKQpAQCAtMzUsMTkgKzM4LDQgQEAKICNkZWZpbmUgYmZpbl9yZWFkX1NJQ0JfSVNSKHgpCQliZmluX3JlYWQzMihfX1NJQ19NVVgoU0lDQl9JU1IwLCB4KSkKICNkZWZpbmUgYmZpbl93cml0ZV9TSUNCX0lTUih4LCB2YWwpCWJmaW5fd3JpdGUzMihfX1NJQ19NVVgoU0lDQl9JU1IwLCB4KSwgdmFsKQogCi0jZGVmaW5lIEJGSU5fVUFSVF9OUl9QT1JUUyAgICAgIDEKLQotI2RlZmluZSBPRkZTRVRfVEhSICAgICAgICAgICAgICAweDAwCS8qIFRyYW5zbWl0IEhvbGRpbmcgcmVnaXN0ZXIgICAgICAgICAgICAqLwotI2RlZmluZSBPRkZTRVRfUkJSICAgICAgICAgICAgICAweDAwCS8qIFJlY2VpdmUgQnVmZmVyIHJlZ2lzdGVyICAgICAgICAgICAgICAqLwotI2RlZmluZSBPRkZTRVRfRExMICAgICAgICAgICAgICAweDAwCS8qIERpdmlzb3IgTGF0Y2ggKExvdy1CeXRlKSAgICAgICAgICAgICAqLwotI2RlZmluZSBPRkZTRVRfSUVSICAgICAgICAgICAgICAweDA0CS8qIEludGVycnVwdCBFbmFibGUgUmVnaXN0ZXIgICAgICAgICAgICAqLwotI2RlZmluZSBPRkZTRVRfRExIICAgICAgICAgICAgICAweDA0CS8qIERpdmlzb3IgTGF0Y2ggKEhpZ2gtQnl0ZSkgICAgICAgICAgICAqLwotI2RlZmluZSBPRkZTRVRfSUlSICAgICAgICAgICAgICAweDA4CS8qIEludGVycnVwdCBJZGVudGlmaWNhdGlvbiBSZWdpc3RlciAgICAqLwotI2RlZmluZSBPRkZTRVRfTENSICAgICAgICAgICAgICAweDBDCS8qIExpbmUgQ29udHJvbCBSZWdpc3RlciAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBPRkZTRVRfTUNSICAgICAgICAgICAgICAweDEwCS8qIE1vZGVtIENvbnRyb2wgUmVnaXN0ZXIgICAgICAgICAgICAgICAqLwotI2RlZmluZSBPRkZTRVRfTFNSICAgICAgICAgICAgICAweDE0CS8qIExpbmUgU3RhdHVzIFJlZ2lzdGVyICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBPRkZTRVRfTVNSICAgICAgICAgICAgICAweDE4CS8qIE1vZGVtIFN0YXR1cyBSZWdpc3RlciAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBPRkZTRVRfU0NSICAgICAgICAgICAgICAweDFDCS8qIFNDUiBTY3JhdGNoIFJlZ2lzdGVyICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBPRkZTRVRfR0NUTCAgICAgICAgICAgICAweDI0CS8qIEdsb2JhbCBDb250cm9sIFJlZ2lzdGVyICAgICAgICAgICAgICAqLwotCiAjZW5kaWYJCQkJLyogX01BQ0hfQkxBQ0tGSU5fSF8gKi8KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9pbmNsdWRlL21hY2gvY2RlZkJGNTYxLmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvaW5jbHVkZS9tYWNoL2NkZWZCRjU2MS5oCmluZGV4IDJiYWI5OTEuLjc1MzMzMTUgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9pbmNsdWRlL21hY2gvY2RlZkJGNTYxLmgKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2luY2x1ZGUvbWFjaC9jZGVmQkY1NjEuaApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNS0yMDA5IEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqIENvcHlyaWdodCAyMDA1LTIwMTAgQW5hbG9nIERldmljZXMgSW5jLgogICoKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KICAqLwpAQCAtNywxNCArNyw2IEBACiAjaWZuZGVmIF9DREVGX0JGNTYxX0gKICNkZWZpbmUgX0NERUZfQkY1NjFfSAogCi0jaW5jbHVkZSA8YXNtL2JsYWNrZmluLmg+Ci0KLS8qIGluY2x1ZGUgYWxsIENvcmUgcmVnaXN0ZXJzIGFuZCBiaXQgZGVmaW5pdGlvbnMgKi8KLSNpbmNsdWRlICJkZWZCRjU2MS5oIgotCi0vKmluY2x1ZGUgY29yZSBzcGVjaWZpYyByZWdpc3RlciBwb2ludGVyIGRlZmluaXRpb25zKi8KLSNpbmNsdWRlIDxhc20vY2RlZl9MUEJsYWNrZmluLmg+Ci0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwogLyogU3lzdGVtIE1NUiBSZWdpc3RlciBNYXAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwpAQCAtNTIzLDE0ICs1MTUsMTQgQEAKICNkZWZpbmUgYmZpbl9yZWFkX1BQSTFfRlJBTUUoKSAgICAgICAgICAgICAgIGJmaW5fcmVhZDE2KFBQSTFfRlJBTUUpCiAjZGVmaW5lIGJmaW5fd3JpdGVfUFBJMV9GUkFNRSh2YWwpICAgICAgICAgICBiZmluX3dyaXRlMTYoUFBJMV9GUkFNRSx2YWwpCiAvKkRNQSB0cmFmZmljIGNvbnRyb2wgcmVnaXN0ZXJzICovCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUExX1RDX1BFUigpICAgICAgICAgICAgICBiZmluX3JlYWQxNihETUExX1RDX1BFUikKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUExX1RDX1BFUih2YWwpICAgICAgICAgIGJmaW5fd3JpdGUxNihETUExX1RDX1BFUix2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUExX1RDX0NOVCgpICAgICAgICAgICAgICBiZmluX3JlYWQxNihETUExX1RDX0NOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUExX1RDX0NOVCh2YWwpICAgICAgICAgIGJmaW5fd3JpdGUxNihETUExX1RDX0NOVCx2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUEyX1RDX1BFUigpICAgICAgICAgICAgICBiZmluX3JlYWQxNihETUEyX1RDX1BFUikKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUEyX1RDX1BFUih2YWwpICAgICAgICAgIGJmaW5fd3JpdGUxNihETUEyX1RDX1BFUix2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9ETUEyX1RDX0NOVCgpICAgICAgICAgICAgICBiZmluX3JlYWQxNihETUEyX1RDX0NOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9ETUEyX1RDX0NOVCh2YWwpICAgICAgICAgIGJmaW5fd3JpdGUxNihETUEyX1RDX0NOVCx2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUFDMF9UQ19QRVIoKSAgICAgICAgICAgICBiZmluX3JlYWQxNihETUFDMF9UQ19QRVIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BQzBfVENfUEVSKHZhbCkgICAgICAgICBiZmluX3dyaXRlMTYoRE1BQzBfVENfUEVSLHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQUMwX1RDX0NOVCgpICAgICAgICAgICAgIGJmaW5fcmVhZDE2KERNQUMwX1RDX0NOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUFDMF9UQ19DTlQodmFsKSAgICAgICAgIGJmaW5fd3JpdGUxNihETUFDMF9UQ19DTlQsdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BQzFfVENfUEVSKCkgICAgICAgICAgICAgYmZpbl9yZWFkMTYoRE1BQzFfVENfUEVSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQUMxX1RDX1BFUih2YWwpICAgICAgICAgYmZpbl93cml0ZTE2KERNQUMxX1RDX1BFUix2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUFDMV9UQ19DTlQoKSAgICAgICAgICAgICBiZmluX3JlYWQxNihETUFDMV9UQ19DTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BQzFfVENfQ05UKHZhbCkgICAgICAgICBiZmluX3dyaXRlMTYoRE1BQzFfVENfQ05ULHZhbCkKIC8qIERNQTEgQ29udHJvbGxlciByZWdpc3RlcnMgKDB4RkZDMCAxQzAwLTB4RkZDMCAxRkZGKSAqLwogI2RlZmluZSBiZmluX3JlYWRfRE1BMV8wX0NPTkZJRygpICAgICAgICAgICAgYmZpbl9yZWFkMTYoRE1BMV8wX0NPTkZJRykKICNkZWZpbmUgYmZpbl93cml0ZV9ETUExXzBfQ09ORklHKHZhbCkgICAgICAgIGJmaW5fd3JpdGUxNihETUExXzBfQ09ORklHLHZhbCkKQEAgLTg0NSwxMTAgKzgzNywxMTAgQEAKICNkZWZpbmUgYmZpbl9yZWFkX0RNQTFfMTFfUEVSSVBIRVJBTF9NQVAoKSAgIGJmaW5fcmVhZDE2KERNQTFfMTFfUEVSSVBIRVJBTF9NQVApCiAjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMV8xMV9QRVJJUEhFUkFMX01BUCh2YWwpIGJmaW5fd3JpdGUxNihETUExXzExX1BFUklQSEVSQUxfTUFQLHZhbCkKIC8qIE1lbW9yeSBETUExIENvbnRyb2xsZXIgcmVnaXN0ZXJzICgweEZGQzAgMUU4MC0weEZGQzAgMUZGRikgKi8KLSNkZWZpbmUgYmZpbl9yZWFkX01ETUExX0QwX0NPTkZJRygpICAgICAgICAgIGJmaW5fcmVhZDE2KE1ETUExX0QwX0NPTkZJRykKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMV9EMF9DT05GSUcodmFsKSAgICAgIGJmaW5fd3JpdGUxNihNRE1BMV9EMF9DT05GSUcsdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQTFfRDBfTkVYVF9ERVNDX1BUUigpICAgYmZpbl9yZWFkMzIoTURNQTFfRDBfTkVYVF9ERVNDX1BUUikKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMV9EMF9ORVhUX0RFU0NfUFRSKHZhbCkgYmZpbl93cml0ZTMyKE1ETUExX0QwX05FWFRfREVTQ19QVFIsdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQTFfRDBfU1RBUlRfQUREUigpICAgICAgYmZpbl9yZWFkMzIoTURNQTFfRDBfU1RBUlRfQUREUikKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMV9EMF9TVEFSVF9BRERSKHZhbCkgIGJmaW5fd3JpdGUzMihNRE1BMV9EMF9TVEFSVF9BRERSLHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUExX0QwX1hfQ09VTlQoKSAgICAgICAgIGJmaW5fcmVhZDE2KE1ETUExX0QwX1hfQ09VTlQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQTFfRDBfWF9DT1VOVCh2YWwpICAgICBiZmluX3dyaXRlMTYoTURNQTFfRDBfWF9DT1VOVCx2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BMV9EMF9ZX0NPVU5UKCkgICAgICAgICBiZmluX3JlYWQxNihNRE1BMV9EMF9ZX0NPVU5UKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUExX0QwX1lfQ09VTlQodmFsKSAgICAgYmZpbl93cml0ZTE2KE1ETUExX0QwX1lfQ09VTlQsdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQTFfRDBfWF9NT0RJRlkoKSAgICAgICAgYmZpbl9yZWFkMTYoTURNQTFfRDBfWF9NT0RJRlkpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQTFfRDBfWF9NT0RJRlkodmFsKSAgICBiZmluX3dyaXRlMTYoTURNQTFfRDBfWF9NT0RJRlksdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQTFfRDBfWV9NT0RJRlkoKSAgICAgICAgYmZpbl9yZWFkMTYoTURNQTFfRDBfWV9NT0RJRlkpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQTFfRDBfWV9NT0RJRlkodmFsKSAgICBiZmluX3dyaXRlMTYoTURNQTFfRDBfWV9NT0RJRlksdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQTFfRDBfQ1VSUl9ERVNDX1BUUigpICAgYmZpbl9yZWFkMzIoTURNQTFfRDBfQ1VSUl9ERVNDX1BUUikKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMV9EMF9DVVJSX0RFU0NfUFRSKHZhbCkgYmZpbl93cml0ZTMyKE1ETUExX0QwX0NVUlJfREVTQ19QVFIsdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQTFfRDBfQ1VSUl9BRERSKCkgICAgICAgYmZpbl9yZWFkMzIoTURNQTFfRDBfQ1VSUl9BRERSKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUExX0QwX0NVUlJfQUREUih2YWwpICAgYmZpbl93cml0ZTMyKE1ETUExX0QwX0NVUlJfQUREUix2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BMV9EMF9DVVJSX1hfQ09VTlQoKSAgICBiZmluX3JlYWQxNihNRE1BMV9EMF9DVVJSX1hfQ09VTlQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQTFfRDBfQ1VSUl9YX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KE1ETUExX0QwX0NVUlJfWF9DT1VOVCx2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BMV9EMF9DVVJSX1lfQ09VTlQoKSAgICBiZmluX3JlYWQxNihNRE1BMV9EMF9DVVJSX1lfQ09VTlQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQTFfRDBfQ1VSUl9ZX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KE1ETUExX0QwX0NVUlJfWV9DT1VOVCx2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BMV9EMF9JUlFfU1RBVFVTKCkgICAgICBiZmluX3JlYWQxNihNRE1BMV9EMF9JUlFfU1RBVFVTKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUExX0QwX0lSUV9TVEFUVVModmFsKSAgYmZpbl93cml0ZTE2KE1ETUExX0QwX0lSUV9TVEFUVVMsdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQTFfRDBfUEVSSVBIRVJBTF9NQVAoKSAgYmZpbl9yZWFkMTYoTURNQTFfRDBfUEVSSVBIRVJBTF9NQVApCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQTFfRDBfUEVSSVBIRVJBTF9NQVAodmFsKSBiZmluX3dyaXRlMTYoTURNQTFfRDBfUEVSSVBIRVJBTF9NQVAsdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQTFfUzBfQ09ORklHKCkgICAgICAgICAgYmZpbl9yZWFkMTYoTURNQTFfUzBfQ09ORklHKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUExX1MwX0NPTkZJRyh2YWwpICAgICAgYmZpbl93cml0ZTE2KE1ETUExX1MwX0NPTkZJRyx2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BMV9TMF9ORVhUX0RFU0NfUFRSKCkgICBiZmluX3JlYWQzMihNRE1BMV9TMF9ORVhUX0RFU0NfUFRSKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUExX1MwX05FWFRfREVTQ19QVFIodmFsKSBiZmluX3dyaXRlMzIoTURNQTFfUzBfTkVYVF9ERVNDX1BUUix2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BMV9TMF9TVEFSVF9BRERSKCkgICAgICBiZmluX3JlYWQzMihNRE1BMV9TMF9TVEFSVF9BRERSKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUExX1MwX1NUQVJUX0FERFIodmFsKSAgYmZpbl93cml0ZTMyKE1ETUExX1MwX1NUQVJUX0FERFIsdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQTFfUzBfWF9DT1VOVCgpICAgICAgICAgYmZpbl9yZWFkMTYoTURNQTFfUzBfWF9DT1VOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMV9TMF9YX0NPVU5UKHZhbCkgICAgIGJmaW5fd3JpdGUxNihNRE1BMV9TMF9YX0NPVU5ULHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUExX1MwX1lfQ09VTlQoKSAgICAgICAgIGJmaW5fcmVhZDE2KE1ETUExX1MwX1lfQ09VTlQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQTFfUzBfWV9DT1VOVCh2YWwpICAgICBiZmluX3dyaXRlMTYoTURNQTFfUzBfWV9DT1VOVCx2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BMV9TMF9YX01PRElGWSgpICAgICAgICBiZmluX3JlYWQxNihNRE1BMV9TMF9YX01PRElGWSkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMV9TMF9YX01PRElGWSh2YWwpICAgIGJmaW5fd3JpdGUxNihNRE1BMV9TMF9YX01PRElGWSx2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BMV9TMF9ZX01PRElGWSgpICAgICAgICBiZmluX3JlYWQxNihNRE1BMV9TMF9ZX01PRElGWSkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMV9TMF9ZX01PRElGWSh2YWwpICAgIGJmaW5fd3JpdGUxNihNRE1BMV9TMF9ZX01PRElGWSx2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BMV9TMF9DVVJSX0RFU0NfUFRSKCkgICBiZmluX3JlYWQzMihNRE1BMV9TMF9DVVJSX0RFU0NfUFRSKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUExX1MwX0NVUlJfREVTQ19QVFIodmFsKSBiZmluX3dyaXRlMzIoTURNQTFfUzBfQ1VSUl9ERVNDX1BUUix2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BMV9TMF9DVVJSX0FERFIoKSAgICAgICBiZmluX3JlYWQzMihNRE1BMV9TMF9DVVJSX0FERFIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQTFfUzBfQ1VSUl9BRERSKHZhbCkgICBiZmluX3dyaXRlMzIoTURNQTFfUzBfQ1VSUl9BRERSLHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUExX1MwX0NVUlJfWF9DT1VOVCgpICAgIGJmaW5fcmVhZDE2KE1ETUExX1MwX0NVUlJfWF9DT1VOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMV9TMF9DVVJSX1hfQ09VTlQodmFsKSBiZmluX3dyaXRlMTYoTURNQTFfUzBfQ1VSUl9YX0NPVU5ULHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUExX1MwX0NVUlJfWV9DT1VOVCgpICAgIGJmaW5fcmVhZDE2KE1ETUExX1MwX0NVUlJfWV9DT1VOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMV9TMF9DVVJSX1lfQ09VTlQodmFsKSBiZmluX3dyaXRlMTYoTURNQTFfUzBfQ1VSUl9ZX0NPVU5ULHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUExX1MwX0lSUV9TVEFUVVMoKSAgICAgIGJmaW5fcmVhZDE2KE1ETUExX1MwX0lSUV9TVEFUVVMpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQTFfUzBfSVJRX1NUQVRVUyh2YWwpICBiZmluX3dyaXRlMTYoTURNQTFfUzBfSVJRX1NUQVRVUyx2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BMV9TMF9QRVJJUEhFUkFMX01BUCgpICBiZmluX3JlYWQxNihNRE1BMV9TMF9QRVJJUEhFUkFMX01BUCkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMV9TMF9QRVJJUEhFUkFMX01BUCh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMV9TMF9QRVJJUEhFUkFMX01BUCx2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BMV9EMV9DT05GSUcoKSAgICAgICAgICBiZmluX3JlYWQxNihNRE1BMV9EMV9DT05GSUcpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQTFfRDFfQ09ORklHKHZhbCkgICAgICBiZmluX3dyaXRlMTYoTURNQTFfRDFfQ09ORklHLHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUExX0QxX05FWFRfREVTQ19QVFIoKSAgIGJmaW5fcmVhZDMyKE1ETUExX0QxX05FWFRfREVTQ19QVFIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQTFfRDFfTkVYVF9ERVNDX1BUUih2YWwpIGJmaW5fd3JpdGUzMihNRE1BMV9EMV9ORVhUX0RFU0NfUFRSLHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUExX0QxX1NUQVJUX0FERFIoKSAgICAgIGJmaW5fcmVhZDMyKE1ETUExX0QxX1NUQVJUX0FERFIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQTFfRDFfU1RBUlRfQUREUih2YWwpICBiZmluX3dyaXRlMzIoTURNQTFfRDFfU1RBUlRfQUREUix2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BMV9EMV9YX0NPVU5UKCkgICAgICAgICBiZmluX3JlYWQxNihNRE1BMV9EMV9YX0NPVU5UKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUExX0QxX1hfQ09VTlQodmFsKSAgICAgYmZpbl93cml0ZTE2KE1ETUExX0QxX1hfQ09VTlQsdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQTFfRDFfWV9DT1VOVCgpICAgICAgICAgYmZpbl9yZWFkMTYoTURNQTFfRDFfWV9DT1VOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMV9EMV9ZX0NPVU5UKHZhbCkgICAgIGJmaW5fd3JpdGUxNihNRE1BMV9EMV9ZX0NPVU5ULHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUExX0QxX1hfTU9ESUZZKCkgICAgICAgIGJmaW5fcmVhZDE2KE1ETUExX0QxX1hfTU9ESUZZKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUExX0QxX1hfTU9ESUZZKHZhbCkgICAgYmZpbl93cml0ZTE2KE1ETUExX0QxX1hfTU9ESUZZLHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUExX0QxX1lfTU9ESUZZKCkgICAgICAgIGJmaW5fcmVhZDE2KE1ETUExX0QxX1lfTU9ESUZZKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUExX0QxX1lfTU9ESUZZKHZhbCkgICAgYmZpbl93cml0ZTE2KE1ETUExX0QxX1lfTU9ESUZZLHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUExX0QxX0NVUlJfREVTQ19QVFIoKSAgIGJmaW5fcmVhZDMyKE1ETUExX0QxX0NVUlJfREVTQ19QVFIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQTFfRDFfQ1VSUl9ERVNDX1BUUih2YWwpIGJmaW5fd3JpdGUzMihNRE1BMV9EMV9DVVJSX0RFU0NfUFRSLHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUExX0QxX0NVUlJfQUREUigpICAgICAgIGJmaW5fcmVhZDMyKE1ETUExX0QxX0NVUlJfQUREUikKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMV9EMV9DVVJSX0FERFIodmFsKSAgIGJmaW5fd3JpdGUzMihNRE1BMV9EMV9DVVJSX0FERFIsdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQTFfRDFfQ1VSUl9YX0NPVU5UKCkgICAgYmZpbl9yZWFkMTYoTURNQTFfRDFfQ1VSUl9YX0NPVU5UKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUExX0QxX0NVUlJfWF9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMV9EMV9DVVJSX1hfQ09VTlQsdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQTFfRDFfQ1VSUl9ZX0NPVU5UKCkgICAgYmZpbl9yZWFkMTYoTURNQTFfRDFfQ1VSUl9ZX0NPVU5UKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUExX0QxX0NVUlJfWV9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMV9EMV9DVVJSX1lfQ09VTlQsdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQTFfRDFfSVJRX1NUQVRVUygpICAgICAgYmZpbl9yZWFkMTYoTURNQTFfRDFfSVJRX1NUQVRVUykKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMV9EMV9JUlFfU1RBVFVTKHZhbCkgIGJmaW5fd3JpdGUxNihNRE1BMV9EMV9JUlFfU1RBVFVTLHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUExX0QxX1BFUklQSEVSQUxfTUFQKCkgIGJmaW5fcmVhZDE2KE1ETUExX0QxX1BFUklQSEVSQUxfTUFQKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUExX0QxX1BFUklQSEVSQUxfTUFQKHZhbCkgYmZpbl93cml0ZTE2KE1ETUExX0QxX1BFUklQSEVSQUxfTUFQLHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUExX1MxX0NPTkZJRygpICAgICAgICAgIGJmaW5fcmVhZDE2KE1ETUExX1MxX0NPTkZJRykKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMV9TMV9DT05GSUcodmFsKSAgICAgIGJmaW5fd3JpdGUxNihNRE1BMV9TMV9DT05GSUcsdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQTFfUzFfTkVYVF9ERVNDX1BUUigpICAgYmZpbl9yZWFkMzIoTURNQTFfUzFfTkVYVF9ERVNDX1BUUikKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMV9TMV9ORVhUX0RFU0NfUFRSKHZhbCkgYmZpbl93cml0ZTMyKE1ETUExX1MxX05FWFRfREVTQ19QVFIsdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQTFfUzFfU1RBUlRfQUREUigpICAgICAgYmZpbl9yZWFkMzIoTURNQTFfUzFfU1RBUlRfQUREUikKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMV9TMV9TVEFSVF9BRERSKHZhbCkgIGJmaW5fd3JpdGUzMihNRE1BMV9TMV9TVEFSVF9BRERSLHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUExX1MxX1hfQ09VTlQoKSAgICAgICAgIGJmaW5fcmVhZDE2KE1ETUExX1MxX1hfQ09VTlQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQTFfUzFfWF9DT1VOVCh2YWwpICAgICBiZmluX3dyaXRlMTYoTURNQTFfUzFfWF9DT1VOVCx2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BMV9TMV9ZX0NPVU5UKCkgICAgICAgICBiZmluX3JlYWQxNihNRE1BMV9TMV9ZX0NPVU5UKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUExX1MxX1lfQ09VTlQodmFsKSAgICAgYmZpbl93cml0ZTE2KE1ETUExX1MxX1lfQ09VTlQsdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQTFfUzFfWF9NT0RJRlkoKSAgICAgICAgYmZpbl9yZWFkMTYoTURNQTFfUzFfWF9NT0RJRlkpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQTFfUzFfWF9NT0RJRlkodmFsKSAgICBiZmluX3dyaXRlMTYoTURNQTFfUzFfWF9NT0RJRlksdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQTFfUzFfWV9NT0RJRlkoKSAgICAgICAgYmZpbl9yZWFkMTYoTURNQTFfUzFfWV9NT0RJRlkpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQTFfUzFfWV9NT0RJRlkodmFsKSAgICBiZmluX3dyaXRlMTYoTURNQTFfUzFfWV9NT0RJRlksdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQTFfUzFfQ1VSUl9ERVNDX1BUUigpICAgYmZpbl9yZWFkMzIoTURNQTFfUzFfQ1VSUl9ERVNDX1BUUikKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMV9TMV9DVVJSX0RFU0NfUFRSKHZhbCkgYmZpbl93cml0ZTMyKE1ETUExX1MxX0NVUlJfREVTQ19QVFIsdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQTFfUzFfQ1VSUl9BRERSKCkgICAgICAgYmZpbl9yZWFkMzIoTURNQTFfUzFfQ1VSUl9BRERSKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUExX1MxX0NVUlJfQUREUih2YWwpICAgYmZpbl93cml0ZTMyKE1ETUExX1MxX0NVUlJfQUREUix2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BMV9TMV9DVVJSX1hfQ09VTlQoKSAgICBiZmluX3JlYWQxNihNRE1BMV9TMV9DVVJSX1hfQ09VTlQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQTFfUzFfQ1VSUl9YX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KE1ETUExX1MxX0NVUlJfWF9DT1VOVCx2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BMV9TMV9DVVJSX1lfQ09VTlQoKSAgICBiZmluX3JlYWQxNihNRE1BMV9TMV9DVVJSX1lfQ09VTlQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQTFfUzFfQ1VSUl9ZX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KE1ETUExX1MxX0NVUlJfWV9DT1VOVCx2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BMV9TMV9JUlFfU1RBVFVTKCkgICAgICBiZmluX3JlYWQxNihNRE1BMV9TMV9JUlFfU1RBVFVTKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUExX1MxX0lSUV9TVEFUVVModmFsKSAgYmZpbl93cml0ZTE2KE1ETUExX1MxX0lSUV9TVEFUVVMsdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQTFfUzFfUEVSSVBIRVJBTF9NQVAoKSAgYmZpbl9yZWFkMTYoTURNQTFfUzFfUEVSSVBIRVJBTF9NQVApCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQTFfUzFfUEVSSVBIRVJBTF9NQVAodmFsKSBiZmluX3dyaXRlMTYoTURNQTFfUzFfUEVSSVBIRVJBTF9NQVAsdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMl9DT05GSUcoKSAgICAgICAgICBiZmluX3JlYWQxNihNRE1BX0QyX0NPTkZJRykKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QyX0NPTkZJRyh2YWwpICAgICAgYmZpbl93cml0ZTE2KE1ETUFfRDJfQ09ORklHLHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDJfTkVYVF9ERVNDX1BUUigpICAgYmZpbl9yZWFkMzIoTURNQV9EMl9ORVhUX0RFU0NfUFRSKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDJfTkVYVF9ERVNDX1BUUih2YWwpIGJmaW5fd3JpdGUzMihNRE1BX0QyX05FWFRfREVTQ19QVFIsdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMl9TVEFSVF9BRERSKCkgICAgICBiZmluX3JlYWQzMihNRE1BX0QyX1NUQVJUX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMl9TVEFSVF9BRERSKHZhbCkgIGJmaW5fd3JpdGUzMihNRE1BX0QyX1NUQVJUX0FERFIsdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMl9YX0NPVU5UKCkgICAgICAgICBiZmluX3JlYWQxNihNRE1BX0QyX1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMl9YX0NPVU5UKHZhbCkgICAgIGJmaW5fd3JpdGUxNihNRE1BX0QyX1hfQ09VTlQsdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMl9ZX0NPVU5UKCkgICAgICAgICBiZmluX3JlYWQxNihNRE1BX0QyX1lfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMl9ZX0NPVU5UKHZhbCkgICAgIGJmaW5fd3JpdGUxNihNRE1BX0QyX1lfQ09VTlQsdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMl9YX01PRElGWSgpICAgICAgICBiZmluX3JlYWQxNihNRE1BX0QyX1hfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDJfWF9NT0RJRlkodmFsKSAgICBiZmluX3dyaXRlMTYoTURNQV9EMl9YX01PRElGWSx2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QyX1lfTU9ESUZZKCkgICAgICAgIGJmaW5fcmVhZDE2KE1ETUFfRDJfWV9NT0RJRlkpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMl9ZX01PRElGWSh2YWwpICAgIGJmaW5fd3JpdGUxNihNRE1BX0QyX1lfTU9ESUZZLHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDJfQ1VSUl9ERVNDX1BUUigpICAgYmZpbl9yZWFkMzIoTURNQV9EMl9DVVJSX0RFU0NfUFRSKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDJfQ1VSUl9ERVNDX1BUUih2YWwpIGJmaW5fd3JpdGUzMihNRE1BX0QyX0NVUlJfREVTQ19QVFIsdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMl9DVVJSX0FERFIoKSAgICAgICBiZmluX3JlYWQzMihNRE1BX0QyX0NVUlJfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QyX0NVUlJfQUREUih2YWwpICAgYmZpbl93cml0ZTMyKE1ETUFfRDJfQ1VSUl9BRERSLHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDJfQ1VSUl9YX0NPVU5UKCkgICAgYmZpbl9yZWFkMTYoTURNQV9EMl9DVVJSX1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMl9DVVJSX1hfQ09VTlQodmFsKSBiZmluX3dyaXRlMTYoTURNQV9EMl9DVVJSX1hfQ09VTlQsdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMl9DVVJSX1lfQ09VTlQoKSAgICBiZmluX3JlYWQxNihNRE1BX0QyX0NVUlJfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QyX0NVUlJfWV9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihNRE1BX0QyX0NVUlJfWV9DT1VOVCx2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QyX0lSUV9TVEFUVVMoKSAgICAgIGJmaW5fcmVhZDE2KE1ETUFfRDJfSVJRX1NUQVRVUykKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QyX0lSUV9TVEFUVVModmFsKSAgYmZpbl93cml0ZTE2KE1ETUFfRDJfSVJRX1NUQVRVUyx2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QyX1BFUklQSEVSQUxfTUFQKCkgIGJmaW5fcmVhZDE2KE1ETUFfRDJfUEVSSVBIRVJBTF9NQVApCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMl9QRVJJUEhFUkFMX01BUCh2YWwpIGJmaW5fd3JpdGUxNihNRE1BX0QyX1BFUklQSEVSQUxfTUFQLHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzJfQ09ORklHKCkgICAgICAgICAgYmZpbl9yZWFkMTYoTURNQV9TMl9DT05GSUcpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMl9DT05GSUcodmFsKSAgICAgIGJmaW5fd3JpdGUxNihNRE1BX1MyX0NPTkZJRyx2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MyX05FWFRfREVTQ19QVFIoKSAgIGJmaW5fcmVhZDMyKE1ETUFfUzJfTkVYVF9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MyX05FWFRfREVTQ19QVFIodmFsKSBiZmluX3dyaXRlMzIoTURNQV9TMl9ORVhUX0RFU0NfUFRSLHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzJfU1RBUlRfQUREUigpICAgICAgYmZpbl9yZWFkMzIoTURNQV9TMl9TVEFSVF9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzJfU1RBUlRfQUREUih2YWwpICBiZmluX3dyaXRlMzIoTURNQV9TMl9TVEFSVF9BRERSLHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzJfWF9DT1VOVCgpICAgICAgICAgYmZpbl9yZWFkMTYoTURNQV9TMl9YX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzJfWF9DT1VOVCh2YWwpICAgICBiZmluX3dyaXRlMTYoTURNQV9TMl9YX0NPVU5ULHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzJfWV9DT1VOVCgpICAgICAgICAgYmZpbl9yZWFkMTYoTURNQV9TMl9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzJfWV9DT1VOVCh2YWwpICAgICBiZmluX3dyaXRlMTYoTURNQV9TMl9ZX0NPVU5ULHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzJfWF9NT0RJRlkoKSAgICAgICAgYmZpbl9yZWFkMTYoTURNQV9TMl9YX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MyX1hfTU9ESUZZKHZhbCkgICAgYmZpbl93cml0ZTE2KE1ETUFfUzJfWF9NT0RJRlksdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMl9ZX01PRElGWSgpICAgICAgICBiZmluX3JlYWQxNihNRE1BX1MyX1lfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzJfWV9NT0RJRlkodmFsKSAgICBiZmluX3dyaXRlMTYoTURNQV9TMl9ZX01PRElGWSx2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MyX0NVUlJfREVTQ19QVFIoKSAgIGJmaW5fcmVhZDMyKE1ETUFfUzJfQ1VSUl9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MyX0NVUlJfREVTQ19QVFIodmFsKSBiZmluX3dyaXRlMzIoTURNQV9TMl9DVVJSX0RFU0NfUFRSLHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzJfQ1VSUl9BRERSKCkgICAgICAgYmZpbl9yZWFkMzIoTURNQV9TMl9DVVJSX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMl9DVVJSX0FERFIodmFsKSAgIGJmaW5fd3JpdGUzMihNRE1BX1MyX0NVUlJfQUREUix2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MyX0NVUlJfWF9DT1VOVCgpICAgIGJmaW5fcmVhZDE2KE1ETUFfUzJfQ1VSUl9YX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzJfQ1VSUl9YX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KE1ETUFfUzJfQ1VSUl9YX0NPVU5ULHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzJfQ1VSUl9ZX0NPVU5UKCkgICAgYmZpbl9yZWFkMTYoTURNQV9TMl9DVVJSX1lfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMl9DVVJSX1lfQ09VTlQodmFsKSBiZmluX3dyaXRlMTYoTURNQV9TMl9DVVJSX1lfQ09VTlQsdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMl9JUlFfU1RBVFVTKCkgICAgICBiZmluX3JlYWQxNihNRE1BX1MyX0lSUV9TVEFUVVMpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMl9JUlFfU1RBVFVTKHZhbCkgIGJmaW5fd3JpdGUxNihNRE1BX1MyX0lSUV9TVEFUVVMsdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMl9QRVJJUEhFUkFMX01BUCgpICBiZmluX3JlYWQxNihNRE1BX1MyX1BFUklQSEVSQUxfTUFQKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzJfUEVSSVBIRVJBTF9NQVAodmFsKSBiZmluX3dyaXRlMTYoTURNQV9TMl9QRVJJUEhFUkFMX01BUCx2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QzX0NPTkZJRygpICAgICAgICAgIGJmaW5fcmVhZDE2KE1ETUFfRDNfQ09ORklHKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDNfQ09ORklHKHZhbCkgICAgICBiZmluX3dyaXRlMTYoTURNQV9EM19DT05GSUcsdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9EM19ORVhUX0RFU0NfUFRSKCkgICBiZmluX3JlYWQzMihNRE1BX0QzX05FWFRfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EM19ORVhUX0RFU0NfUFRSKHZhbCkgYmZpbl93cml0ZTMyKE1ETUFfRDNfTkVYVF9ERVNDX1BUUix2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QzX1NUQVJUX0FERFIoKSAgICAgIGJmaW5fcmVhZDMyKE1ETUFfRDNfU1RBUlRfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QzX1NUQVJUX0FERFIodmFsKSAgYmZpbl93cml0ZTMyKE1ETUFfRDNfU1RBUlRfQUREUix2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QzX1hfQ09VTlQoKSAgICAgICAgIGJmaW5fcmVhZDE2KE1ETUFfRDNfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QzX1hfQ09VTlQodmFsKSAgICAgYmZpbl93cml0ZTE2KE1ETUFfRDNfWF9DT1VOVCx2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QzX1lfQ09VTlQoKSAgICAgICAgIGJmaW5fcmVhZDE2KE1ETUFfRDNfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QzX1lfQ09VTlQodmFsKSAgICAgYmZpbl93cml0ZTE2KE1ETUFfRDNfWV9DT1VOVCx2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QzX1hfTU9ESUZZKCkgICAgICAgIGJmaW5fcmVhZDE2KE1ETUFfRDNfWF9NT0RJRlkpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EM19YX01PRElGWSh2YWwpICAgIGJmaW5fd3JpdGUxNihNRE1BX0QzX1hfTU9ESUZZLHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDNfWV9NT0RJRlkoKSAgICAgICAgYmZpbl9yZWFkMTYoTURNQV9EM19ZX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QzX1lfTU9ESUZZKHZhbCkgICAgYmZpbl93cml0ZTE2KE1ETUFfRDNfWV9NT0RJRlksdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9EM19DVVJSX0RFU0NfUFRSKCkgICBiZmluX3JlYWQzMihNRE1BX0QzX0NVUlJfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EM19DVVJSX0RFU0NfUFRSKHZhbCkgYmZpbl93cml0ZTMyKE1ETUFfRDNfQ1VSUl9ERVNDX1BUUix2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QzX0NVUlJfQUREUigpICAgICAgIGJmaW5fcmVhZDMyKE1ETUFfRDNfQ1VSUl9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDNfQ1VSUl9BRERSKHZhbCkgICBiZmluX3dyaXRlMzIoTURNQV9EM19DVVJSX0FERFIsdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9EM19DVVJSX1hfQ09VTlQoKSAgICBiZmluX3JlYWQxNihNRE1BX0QzX0NVUlJfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QzX0NVUlJfWF9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihNRE1BX0QzX0NVUlJfWF9DT1VOVCx2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QzX0NVUlJfWV9DT1VOVCgpICAgIGJmaW5fcmVhZDE2KE1ETUFfRDNfQ1VSUl9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDNfQ1VSUl9ZX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KE1ETUFfRDNfQ1VSUl9ZX0NPVU5ULHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDNfSVJRX1NUQVRVUygpICAgICAgYmZpbl9yZWFkMTYoTURNQV9EM19JUlFfU1RBVFVTKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDNfSVJRX1NUQVRVUyh2YWwpICBiZmluX3dyaXRlMTYoTURNQV9EM19JUlFfU1RBVFVTLHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDNfUEVSSVBIRVJBTF9NQVAoKSAgYmZpbl9yZWFkMTYoTURNQV9EM19QRVJJUEhFUkFMX01BUCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QzX1BFUklQSEVSQUxfTUFQKHZhbCkgYmZpbl93cml0ZTE2KE1ETUFfRDNfUEVSSVBIRVJBTF9NQVAsdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9TM19DT05GSUcoKSAgICAgICAgICBiZmluX3JlYWQxNihNRE1BX1MzX0NPTkZJRykKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MzX0NPTkZJRyh2YWwpICAgICAgYmZpbl93cml0ZTE2KE1ETUFfUzNfQ09ORklHLHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzNfTkVYVF9ERVNDX1BUUigpICAgYmZpbl9yZWFkMzIoTURNQV9TM19ORVhUX0RFU0NfUFRSKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzNfTkVYVF9ERVNDX1BUUih2YWwpIGJmaW5fd3JpdGUzMihNRE1BX1MzX05FWFRfREVTQ19QVFIsdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9TM19TVEFSVF9BRERSKCkgICAgICBiZmluX3JlYWQzMihNRE1BX1MzX1NUQVJUX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TM19TVEFSVF9BRERSKHZhbCkgIGJmaW5fd3JpdGUzMihNRE1BX1MzX1NUQVJUX0FERFIsdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9TM19YX0NPVU5UKCkgICAgICAgICBiZmluX3JlYWQxNihNRE1BX1MzX1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TM19YX0NPVU5UKHZhbCkgICAgIGJmaW5fd3JpdGUxNihNRE1BX1MzX1hfQ09VTlQsdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9TM19ZX0NPVU5UKCkgICAgICAgICBiZmluX3JlYWQxNihNRE1BX1MzX1lfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TM19ZX0NPVU5UKHZhbCkgICAgIGJmaW5fd3JpdGUxNihNRE1BX1MzX1lfQ09VTlQsdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9TM19YX01PRElGWSgpICAgICAgICBiZmluX3JlYWQxNihNRE1BX1MzX1hfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzNfWF9NT0RJRlkodmFsKSAgICBiZmluX3dyaXRlMTYoTURNQV9TM19YX01PRElGWSx2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MzX1lfTU9ESUZZKCkgICAgICAgIGJmaW5fcmVhZDE2KE1ETUFfUzNfWV9NT0RJRlkpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TM19ZX01PRElGWSh2YWwpICAgIGJmaW5fd3JpdGUxNihNRE1BX1MzX1lfTU9ESUZZLHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzNfQ1VSUl9ERVNDX1BUUigpICAgYmZpbl9yZWFkMzIoTURNQV9TM19DVVJSX0RFU0NfUFRSKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzNfQ1VSUl9ERVNDX1BUUih2YWwpIGJmaW5fd3JpdGUzMihNRE1BX1MzX0NVUlJfREVTQ19QVFIsdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9TM19DVVJSX0FERFIoKSAgICAgICBiZmluX3JlYWQzMihNRE1BX1MzX0NVUlJfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MzX0NVUlJfQUREUih2YWwpICAgYmZpbl93cml0ZTMyKE1ETUFfUzNfQ1VSUl9BRERSLHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzNfQ1VSUl9YX0NPVU5UKCkgICAgYmZpbl9yZWFkMTYoTURNQV9TM19DVVJSX1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TM19DVVJSX1hfQ09VTlQodmFsKSBiZmluX3dyaXRlMTYoTURNQV9TM19DVVJSX1hfQ09VTlQsdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9TM19DVVJSX1lfQ09VTlQoKSAgICBiZmluX3JlYWQxNihNRE1BX1MzX0NVUlJfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MzX0NVUlJfWV9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihNRE1BX1MzX0NVUlJfWV9DT1VOVCx2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MzX0lSUV9TVEFUVVMoKSAgICAgIGJmaW5fcmVhZDE2KE1ETUFfUzNfSVJRX1NUQVRVUykKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MzX0lSUV9TVEFUVVModmFsKSAgYmZpbl93cml0ZTE2KE1ETUFfUzNfSVJRX1NUQVRVUyx2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MzX1BFUklQSEVSQUxfTUFQKCkgIGJmaW5fcmVhZDE2KE1ETUFfUzNfUEVSSVBIRVJBTF9NQVApCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TM19QRVJJUEhFUkFMX01BUCh2YWwpIGJmaW5fd3JpdGUxNihNRE1BX1MzX1BFUklQSEVSQUxfTUFQLHZhbCkKIC8qIERNQTIgQ29udHJvbGxlciByZWdpc3RlcnMgKDB4RkZDMCAwQzAwLTB4RkZDMCAwREZGKSAqLwogI2RlZmluZSBiZmluX3JlYWRfRE1BMl8wX0NPTkZJRygpICAgICAgICAgICAgYmZpbl9yZWFkMTYoRE1BMl8wX0NPTkZJRykKICNkZWZpbmUgYmZpbl93cml0ZV9ETUEyXzBfQ09ORklHKHZhbCkgICAgICAgIGJmaW5fd3JpdGUxNihETUEyXzBfQ09ORklHLHZhbCkKQEAgLTEyNjMsMTEwICsxMjU1LDExMCBAQAogI2RlZmluZSBiZmluX3JlYWRfRE1BMl8xMV9QRVJJUEhFUkFMX01BUCgpICAgYmZpbl9yZWFkMTYoRE1BMl8xMV9QRVJJUEhFUkFMX01BUCkKICNkZWZpbmUgYmZpbl93cml0ZV9ETUEyXzExX1BFUklQSEVSQUxfTUFQKHZhbCkgYmZpbl93cml0ZTE2KERNQTJfMTFfUEVSSVBIRVJBTF9NQVAsdmFsKQogLyogTWVtb3J5IERNQTIgQ29udHJvbGxlciByZWdpc3RlcnMgKDB4RkZDMCAwRTgwLTB4RkZDMCAwRkZGKSAqLwotI2RlZmluZSBiZmluX3JlYWRfTURNQTJfRDBfQ09ORklHKCkgICAgICAgICAgYmZpbl9yZWFkMTYoTURNQTJfRDBfQ09ORklHKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUEyX0QwX0NPTkZJRyh2YWwpICAgICAgYmZpbl93cml0ZTE2KE1ETUEyX0QwX0NPTkZJRyx2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BMl9EMF9ORVhUX0RFU0NfUFRSKCkgICBiZmluX3JlYWQzMihNRE1BMl9EMF9ORVhUX0RFU0NfUFRSKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUEyX0QwX05FWFRfREVTQ19QVFIodmFsKSBiZmluX3dyaXRlMzIoTURNQTJfRDBfTkVYVF9ERVNDX1BUUix2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BMl9EMF9TVEFSVF9BRERSKCkgICAgICBiZmluX3JlYWQzMihNRE1BMl9EMF9TVEFSVF9BRERSKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUEyX0QwX1NUQVJUX0FERFIodmFsKSAgYmZpbl93cml0ZTMyKE1ETUEyX0QwX1NUQVJUX0FERFIsdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQTJfRDBfWF9DT1VOVCgpICAgICAgICAgYmZpbl9yZWFkMTYoTURNQTJfRDBfWF9DT1VOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMl9EMF9YX0NPVU5UKHZhbCkgICAgIGJmaW5fd3JpdGUxNihNRE1BMl9EMF9YX0NPVU5ULHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUEyX0QwX1lfQ09VTlQoKSAgICAgICAgIGJmaW5fcmVhZDE2KE1ETUEyX0QwX1lfQ09VTlQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQTJfRDBfWV9DT1VOVCh2YWwpICAgICBiZmluX3dyaXRlMTYoTURNQTJfRDBfWV9DT1VOVCx2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BMl9EMF9YX01PRElGWSgpICAgICAgICBiZmluX3JlYWQxNihNRE1BMl9EMF9YX01PRElGWSkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMl9EMF9YX01PRElGWSh2YWwpICAgIGJmaW5fd3JpdGUxNihNRE1BMl9EMF9YX01PRElGWSx2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BMl9EMF9ZX01PRElGWSgpICAgICAgICBiZmluX3JlYWQxNihNRE1BMl9EMF9ZX01PRElGWSkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMl9EMF9ZX01PRElGWSh2YWwpICAgIGJmaW5fd3JpdGUxNihNRE1BMl9EMF9ZX01PRElGWSx2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BMl9EMF9DVVJSX0RFU0NfUFRSKCkgICBiZmluX3JlYWQzMihNRE1BMl9EMF9DVVJSX0RFU0NfUFRSKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUEyX0QwX0NVUlJfREVTQ19QVFIodmFsKSBiZmluX3dyaXRlMzIoTURNQTJfRDBfQ1VSUl9ERVNDX1BUUix2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BMl9EMF9DVVJSX0FERFIoKSAgICAgICBiZmluX3JlYWQzMihNRE1BMl9EMF9DVVJSX0FERFIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQTJfRDBfQ1VSUl9BRERSKHZhbCkgICBiZmluX3dyaXRlMzIoTURNQTJfRDBfQ1VSUl9BRERSLHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUEyX0QwX0NVUlJfWF9DT1VOVCgpICAgIGJmaW5fcmVhZDE2KE1ETUEyX0QwX0NVUlJfWF9DT1VOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMl9EMF9DVVJSX1hfQ09VTlQodmFsKSBiZmluX3dyaXRlMTYoTURNQTJfRDBfQ1VSUl9YX0NPVU5ULHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUEyX0QwX0NVUlJfWV9DT1VOVCgpICAgIGJmaW5fcmVhZDE2KE1ETUEyX0QwX0NVUlJfWV9DT1VOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMl9EMF9DVVJSX1lfQ09VTlQodmFsKSBiZmluX3dyaXRlMTYoTURNQTJfRDBfQ1VSUl9ZX0NPVU5ULHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUEyX0QwX0lSUV9TVEFUVVMoKSAgICAgIGJmaW5fcmVhZDE2KE1ETUEyX0QwX0lSUV9TVEFUVVMpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQTJfRDBfSVJRX1NUQVRVUyh2YWwpICBiZmluX3dyaXRlMTYoTURNQTJfRDBfSVJRX1NUQVRVUyx2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BMl9EMF9QRVJJUEhFUkFMX01BUCgpICBiZmluX3JlYWQxNihNRE1BMl9EMF9QRVJJUEhFUkFMX01BUCkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMl9EMF9QRVJJUEhFUkFMX01BUCh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMl9EMF9QRVJJUEhFUkFMX01BUCx2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BMl9TMF9DT05GSUcoKSAgICAgICAgICBiZmluX3JlYWQxNihNRE1BMl9TMF9DT05GSUcpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQTJfUzBfQ09ORklHKHZhbCkgICAgICBiZmluX3dyaXRlMTYoTURNQTJfUzBfQ09ORklHLHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUEyX1MwX05FWFRfREVTQ19QVFIoKSAgIGJmaW5fcmVhZDMyKE1ETUEyX1MwX05FWFRfREVTQ19QVFIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQTJfUzBfTkVYVF9ERVNDX1BUUih2YWwpIGJmaW5fd3JpdGUzMihNRE1BMl9TMF9ORVhUX0RFU0NfUFRSLHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUEyX1MwX1NUQVJUX0FERFIoKSAgICAgIGJmaW5fcmVhZDMyKE1ETUEyX1MwX1NUQVJUX0FERFIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQTJfUzBfU1RBUlRfQUREUih2YWwpICBiZmluX3dyaXRlMzIoTURNQTJfUzBfU1RBUlRfQUREUix2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BMl9TMF9YX0NPVU5UKCkgICAgICAgICBiZmluX3JlYWQxNihNRE1BMl9TMF9YX0NPVU5UKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUEyX1MwX1hfQ09VTlQodmFsKSAgICAgYmZpbl93cml0ZTE2KE1ETUEyX1MwX1hfQ09VTlQsdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQTJfUzBfWV9DT1VOVCgpICAgICAgICAgYmZpbl9yZWFkMTYoTURNQTJfUzBfWV9DT1VOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMl9TMF9ZX0NPVU5UKHZhbCkgICAgIGJmaW5fd3JpdGUxNihNRE1BMl9TMF9ZX0NPVU5ULHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUEyX1MwX1hfTU9ESUZZKCkgICAgICAgIGJmaW5fcmVhZDE2KE1ETUEyX1MwX1hfTU9ESUZZKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUEyX1MwX1hfTU9ESUZZKHZhbCkgICAgYmZpbl93cml0ZTE2KE1ETUEyX1MwX1hfTU9ESUZZLHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUEyX1MwX1lfTU9ESUZZKCkgICAgICAgIGJmaW5fcmVhZDE2KE1ETUEyX1MwX1lfTU9ESUZZKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUEyX1MwX1lfTU9ESUZZKHZhbCkgICAgYmZpbl93cml0ZTE2KE1ETUEyX1MwX1lfTU9ESUZZLHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUEyX1MwX0NVUlJfREVTQ19QVFIoKSAgIGJmaW5fcmVhZDMyKE1ETUEyX1MwX0NVUlJfREVTQ19QVFIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQTJfUzBfQ1VSUl9ERVNDX1BUUih2YWwpIGJmaW5fd3JpdGUzMihNRE1BMl9TMF9DVVJSX0RFU0NfUFRSLHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUEyX1MwX0NVUlJfQUREUigpICAgICAgIGJmaW5fcmVhZDMyKE1ETUEyX1MwX0NVUlJfQUREUikKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMl9TMF9DVVJSX0FERFIodmFsKSAgIGJmaW5fd3JpdGUzMihNRE1BMl9TMF9DVVJSX0FERFIsdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQTJfUzBfQ1VSUl9YX0NPVU5UKCkgICAgYmZpbl9yZWFkMTYoTURNQTJfUzBfQ1VSUl9YX0NPVU5UKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUEyX1MwX0NVUlJfWF9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMl9TMF9DVVJSX1hfQ09VTlQsdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQTJfUzBfQ1VSUl9ZX0NPVU5UKCkgICAgYmZpbl9yZWFkMTYoTURNQTJfUzBfQ1VSUl9ZX0NPVU5UKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUEyX1MwX0NVUlJfWV9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMl9TMF9DVVJSX1lfQ09VTlQsdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQTJfUzBfSVJRX1NUQVRVUygpICAgICAgYmZpbl9yZWFkMTYoTURNQTJfUzBfSVJRX1NUQVRVUykKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMl9TMF9JUlFfU1RBVFVTKHZhbCkgIGJmaW5fd3JpdGUxNihNRE1BMl9TMF9JUlFfU1RBVFVTLHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUEyX1MwX1BFUklQSEVSQUxfTUFQKCkgIGJmaW5fcmVhZDE2KE1ETUEyX1MwX1BFUklQSEVSQUxfTUFQKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUEyX1MwX1BFUklQSEVSQUxfTUFQKHZhbCkgYmZpbl93cml0ZTE2KE1ETUEyX1MwX1BFUklQSEVSQUxfTUFQLHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUEyX0QxX0NPTkZJRygpICAgICAgICAgIGJmaW5fcmVhZDE2KE1ETUEyX0QxX0NPTkZJRykKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMl9EMV9DT05GSUcodmFsKSAgICAgIGJmaW5fd3JpdGUxNihNRE1BMl9EMV9DT05GSUcsdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQTJfRDFfTkVYVF9ERVNDX1BUUigpICAgYmZpbl9yZWFkMzIoTURNQTJfRDFfTkVYVF9ERVNDX1BUUikKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMl9EMV9ORVhUX0RFU0NfUFRSKHZhbCkgYmZpbl93cml0ZTMyKE1ETUEyX0QxX05FWFRfREVTQ19QVFIsdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQTJfRDFfU1RBUlRfQUREUigpICAgICAgYmZpbl9yZWFkMzIoTURNQTJfRDFfU1RBUlRfQUREUikKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMl9EMV9TVEFSVF9BRERSKHZhbCkgIGJmaW5fd3JpdGUzMihNRE1BMl9EMV9TVEFSVF9BRERSLHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUEyX0QxX1hfQ09VTlQoKSAgICAgICAgIGJmaW5fcmVhZDE2KE1ETUEyX0QxX1hfQ09VTlQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQTJfRDFfWF9DT1VOVCh2YWwpICAgICBiZmluX3dyaXRlMTYoTURNQTJfRDFfWF9DT1VOVCx2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BMl9EMV9ZX0NPVU5UKCkgICAgICAgICBiZmluX3JlYWQxNihNRE1BMl9EMV9ZX0NPVU5UKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUEyX0QxX1lfQ09VTlQodmFsKSAgICAgYmZpbl93cml0ZTE2KE1ETUEyX0QxX1lfQ09VTlQsdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQTJfRDFfWF9NT0RJRlkoKSAgICAgICAgYmZpbl9yZWFkMTYoTURNQTJfRDFfWF9NT0RJRlkpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQTJfRDFfWF9NT0RJRlkodmFsKSAgICBiZmluX3dyaXRlMTYoTURNQTJfRDFfWF9NT0RJRlksdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQTJfRDFfWV9NT0RJRlkoKSAgICAgICAgYmZpbl9yZWFkMTYoTURNQTJfRDFfWV9NT0RJRlkpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQTJfRDFfWV9NT0RJRlkodmFsKSAgICBiZmluX3dyaXRlMTYoTURNQTJfRDFfWV9NT0RJRlksdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQTJfRDFfQ1VSUl9ERVNDX1BUUigpICAgYmZpbl9yZWFkMzIoTURNQTJfRDFfQ1VSUl9ERVNDX1BUUikKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMl9EMV9DVVJSX0RFU0NfUFRSKHZhbCkgYmZpbl93cml0ZTMyKE1ETUEyX0QxX0NVUlJfREVTQ19QVFIsdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQTJfRDFfQ1VSUl9BRERSKCkgICAgICAgYmZpbl9yZWFkMzIoTURNQTJfRDFfQ1VSUl9BRERSKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUEyX0QxX0NVUlJfQUREUih2YWwpICAgYmZpbl93cml0ZTMyKE1ETUEyX0QxX0NVUlJfQUREUix2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BMl9EMV9DVVJSX1hfQ09VTlQoKSAgICBiZmluX3JlYWQxNihNRE1BMl9EMV9DVVJSX1hfQ09VTlQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQTJfRDFfQ1VSUl9YX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KE1ETUEyX0QxX0NVUlJfWF9DT1VOVCx2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BMl9EMV9DVVJSX1lfQ09VTlQoKSAgICBiZmluX3JlYWQxNihNRE1BMl9EMV9DVVJSX1lfQ09VTlQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQTJfRDFfQ1VSUl9ZX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KE1ETUEyX0QxX0NVUlJfWV9DT1VOVCx2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BMl9EMV9JUlFfU1RBVFVTKCkgICAgICBiZmluX3JlYWQxNihNRE1BMl9EMV9JUlFfU1RBVFVTKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUEyX0QxX0lSUV9TVEFUVVModmFsKSAgYmZpbl93cml0ZTE2KE1ETUEyX0QxX0lSUV9TVEFUVVMsdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQTJfRDFfUEVSSVBIRVJBTF9NQVAoKSAgYmZpbl9yZWFkMTYoTURNQTJfRDFfUEVSSVBIRVJBTF9NQVApCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQTJfRDFfUEVSSVBIRVJBTF9NQVAodmFsKSBiZmluX3dyaXRlMTYoTURNQTJfRDFfUEVSSVBIRVJBTF9NQVAsdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQTJfUzFfQ09ORklHKCkgICAgICAgICAgYmZpbl9yZWFkMTYoTURNQTJfUzFfQ09ORklHKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUEyX1MxX0NPTkZJRyh2YWwpICAgICAgYmZpbl93cml0ZTE2KE1ETUEyX1MxX0NPTkZJRyx2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BMl9TMV9ORVhUX0RFU0NfUFRSKCkgICBiZmluX3JlYWQzMihNRE1BMl9TMV9ORVhUX0RFU0NfUFRSKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUEyX1MxX05FWFRfREVTQ19QVFIodmFsKSBiZmluX3dyaXRlMzIoTURNQTJfUzFfTkVYVF9ERVNDX1BUUix2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BMl9TMV9TVEFSVF9BRERSKCkgICAgICBiZmluX3JlYWQzMihNRE1BMl9TMV9TVEFSVF9BRERSKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUEyX1MxX1NUQVJUX0FERFIodmFsKSAgYmZpbl93cml0ZTMyKE1ETUEyX1MxX1NUQVJUX0FERFIsdmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQTJfUzFfWF9DT1VOVCgpICAgICAgICAgYmZpbl9yZWFkMTYoTURNQTJfUzFfWF9DT1VOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMl9TMV9YX0NPVU5UKHZhbCkgICAgIGJmaW5fd3JpdGUxNihNRE1BMl9TMV9YX0NPVU5ULHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUEyX1MxX1lfQ09VTlQoKSAgICAgICAgIGJmaW5fcmVhZDE2KE1ETUEyX1MxX1lfQ09VTlQpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQTJfUzFfWV9DT1VOVCh2YWwpICAgICBiZmluX3dyaXRlMTYoTURNQTJfUzFfWV9DT1VOVCx2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BMl9TMV9YX01PRElGWSgpICAgICAgICBiZmluX3JlYWQxNihNRE1BMl9TMV9YX01PRElGWSkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMl9TMV9YX01PRElGWSh2YWwpICAgIGJmaW5fd3JpdGUxNihNRE1BMl9TMV9YX01PRElGWSx2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BMl9TMV9ZX01PRElGWSgpICAgICAgICBiZmluX3JlYWQxNihNRE1BMl9TMV9ZX01PRElGWSkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMl9TMV9ZX01PRElGWSh2YWwpICAgIGJmaW5fd3JpdGUxNihNRE1BMl9TMV9ZX01PRElGWSx2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BMl9TMV9DVVJSX0RFU0NfUFRSKCkgICBiZmluX3JlYWQzMihNRE1BMl9TMV9DVVJSX0RFU0NfUFRSKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUEyX1MxX0NVUlJfREVTQ19QVFIodmFsKSBiZmluX3dyaXRlMzIoTURNQTJfUzFfQ1VSUl9ERVNDX1BUUix2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BMl9TMV9DVVJSX0FERFIoKSAgICAgICBiZmluX3JlYWQzMihNRE1BMl9TMV9DVVJSX0FERFIpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQTJfUzFfQ1VSUl9BRERSKHZhbCkgICBiZmluX3dyaXRlMzIoTURNQTJfUzFfQ1VSUl9BRERSLHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUEyX1MxX0NVUlJfWF9DT1VOVCgpICAgIGJmaW5fcmVhZDE2KE1ETUEyX1MxX0NVUlJfWF9DT1VOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMl9TMV9DVVJSX1hfQ09VTlQodmFsKSBiZmluX3dyaXRlMTYoTURNQTJfUzFfQ1VSUl9YX0NPVU5ULHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUEyX1MxX0NVUlJfWV9DT1VOVCgpICAgIGJmaW5fcmVhZDE2KE1ETUEyX1MxX0NVUlJfWV9DT1VOVCkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMl9TMV9DVVJSX1lfQ09VTlQodmFsKSBiZmluX3dyaXRlMTYoTURNQTJfUzFfQ1VSUl9ZX0NPVU5ULHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUEyX1MxX0lSUV9TVEFUVVMoKSAgICAgIGJmaW5fcmVhZDE2KE1ETUEyX1MxX0lSUV9TVEFUVVMpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQTJfUzFfSVJRX1NUQVRVUyh2YWwpICBiZmluX3dyaXRlMTYoTURNQTJfUzFfSVJRX1NUQVRVUyx2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BMl9TMV9QRVJJUEhFUkFMX01BUCgpICBiZmluX3JlYWQxNihNRE1BMl9TMV9QRVJJUEhFUkFMX01BUCkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMl9TMV9QRVJJUEhFUkFMX01BUCh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMl9TMV9QRVJJUEhFUkFMX01BUCx2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QwX0NPTkZJRygpICAgICAgICAgIGJmaW5fcmVhZDE2KE1ETUFfRDBfQ09ORklHKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDBfQ09ORklHKHZhbCkgICAgICBiZmluX3dyaXRlMTYoTURNQV9EMF9DT05GSUcsdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMF9ORVhUX0RFU0NfUFRSKCkgICBiZmluX3JlYWQzMihNRE1BX0QwX05FWFRfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMF9ORVhUX0RFU0NfUFRSKHZhbCkgYmZpbl93cml0ZTMyKE1ETUFfRDBfTkVYVF9ERVNDX1BUUix2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QwX1NUQVJUX0FERFIoKSAgICAgIGJmaW5fcmVhZDMyKE1ETUFfRDBfU1RBUlRfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QwX1NUQVJUX0FERFIodmFsKSAgYmZpbl93cml0ZTMyKE1ETUFfRDBfU1RBUlRfQUREUix2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QwX1hfQ09VTlQoKSAgICAgICAgIGJmaW5fcmVhZDE2KE1ETUFfRDBfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QwX1hfQ09VTlQodmFsKSAgICAgYmZpbl93cml0ZTE2KE1ETUFfRDBfWF9DT1VOVCx2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QwX1lfQ09VTlQoKSAgICAgICAgIGJmaW5fcmVhZDE2KE1ETUFfRDBfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QwX1lfQ09VTlQodmFsKSAgICAgYmZpbl93cml0ZTE2KE1ETUFfRDBfWV9DT1VOVCx2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QwX1hfTU9ESUZZKCkgICAgICAgIGJmaW5fcmVhZDE2KE1ETUFfRDBfWF9NT0RJRlkpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMF9YX01PRElGWSh2YWwpICAgIGJmaW5fd3JpdGUxNihNRE1BX0QwX1hfTU9ESUZZLHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDBfWV9NT0RJRlkoKSAgICAgICAgYmZpbl9yZWFkMTYoTURNQV9EMF9ZX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QwX1lfTU9ESUZZKHZhbCkgICAgYmZpbl93cml0ZTE2KE1ETUFfRDBfWV9NT0RJRlksdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMF9DVVJSX0RFU0NfUFRSKCkgICBiZmluX3JlYWQzMihNRE1BX0QwX0NVUlJfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMF9DVVJSX0RFU0NfUFRSKHZhbCkgYmZpbl93cml0ZTMyKE1ETUFfRDBfQ1VSUl9ERVNDX1BUUix2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QwX0NVUlJfQUREUigpICAgICAgIGJmaW5fcmVhZDMyKE1ETUFfRDBfQ1VSUl9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDBfQ1VSUl9BRERSKHZhbCkgICBiZmluX3dyaXRlMzIoTURNQV9EMF9DVVJSX0FERFIsdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMF9DVVJSX1hfQ09VTlQoKSAgICBiZmluX3JlYWQxNihNRE1BX0QwX0NVUlJfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QwX0NVUlJfWF9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihNRE1BX0QwX0NVUlJfWF9DT1VOVCx2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QwX0NVUlJfWV9DT1VOVCgpICAgIGJmaW5fcmVhZDE2KE1ETUFfRDBfQ1VSUl9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDBfQ1VSUl9ZX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KE1ETUFfRDBfQ1VSUl9ZX0NPVU5ULHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDBfSVJRX1NUQVRVUygpICAgICAgYmZpbl9yZWFkMTYoTURNQV9EMF9JUlFfU1RBVFVTKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDBfSVJRX1NUQVRVUyh2YWwpICBiZmluX3dyaXRlMTYoTURNQV9EMF9JUlFfU1RBVFVTLHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDBfUEVSSVBIRVJBTF9NQVAoKSAgYmZpbl9yZWFkMTYoTURNQV9EMF9QRVJJUEhFUkFMX01BUCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QwX1BFUklQSEVSQUxfTUFQKHZhbCkgYmZpbl93cml0ZTE2KE1ETUFfRDBfUEVSSVBIRVJBTF9NQVAsdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMF9DT05GSUcoKSAgICAgICAgICBiZmluX3JlYWQxNihNRE1BX1MwX0NPTkZJRykKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MwX0NPTkZJRyh2YWwpICAgICAgYmZpbl93cml0ZTE2KE1ETUFfUzBfQ09ORklHLHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzBfTkVYVF9ERVNDX1BUUigpICAgYmZpbl9yZWFkMzIoTURNQV9TMF9ORVhUX0RFU0NfUFRSKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzBfTkVYVF9ERVNDX1BUUih2YWwpIGJmaW5fd3JpdGUzMihNRE1BX1MwX05FWFRfREVTQ19QVFIsdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMF9TVEFSVF9BRERSKCkgICAgICBiZmluX3JlYWQzMihNRE1BX1MwX1NUQVJUX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMF9TVEFSVF9BRERSKHZhbCkgIGJmaW5fd3JpdGUzMihNRE1BX1MwX1NUQVJUX0FERFIsdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMF9YX0NPVU5UKCkgICAgICAgICBiZmluX3JlYWQxNihNRE1BX1MwX1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMF9YX0NPVU5UKHZhbCkgICAgIGJmaW5fd3JpdGUxNihNRE1BX1MwX1hfQ09VTlQsdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMF9ZX0NPVU5UKCkgICAgICAgICBiZmluX3JlYWQxNihNRE1BX1MwX1lfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMF9ZX0NPVU5UKHZhbCkgICAgIGJmaW5fd3JpdGUxNihNRE1BX1MwX1lfQ09VTlQsdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMF9YX01PRElGWSgpICAgICAgICBiZmluX3JlYWQxNihNRE1BX1MwX1hfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzBfWF9NT0RJRlkodmFsKSAgICBiZmluX3dyaXRlMTYoTURNQV9TMF9YX01PRElGWSx2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MwX1lfTU9ESUZZKCkgICAgICAgIGJmaW5fcmVhZDE2KE1ETUFfUzBfWV9NT0RJRlkpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMF9ZX01PRElGWSh2YWwpICAgIGJmaW5fd3JpdGUxNihNRE1BX1MwX1lfTU9ESUZZLHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzBfQ1VSUl9ERVNDX1BUUigpICAgYmZpbl9yZWFkMzIoTURNQV9TMF9DVVJSX0RFU0NfUFRSKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzBfQ1VSUl9ERVNDX1BUUih2YWwpIGJmaW5fd3JpdGUzMihNRE1BX1MwX0NVUlJfREVTQ19QVFIsdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMF9DVVJSX0FERFIoKSAgICAgICBiZmluX3JlYWQzMihNRE1BX1MwX0NVUlJfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MwX0NVUlJfQUREUih2YWwpICAgYmZpbl93cml0ZTMyKE1ETUFfUzBfQ1VSUl9BRERSLHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzBfQ1VSUl9YX0NPVU5UKCkgICAgYmZpbl9yZWFkMTYoTURNQV9TMF9DVVJSX1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMF9DVVJSX1hfQ09VTlQodmFsKSBiZmluX3dyaXRlMTYoTURNQV9TMF9DVVJSX1hfQ09VTlQsdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMF9DVVJSX1lfQ09VTlQoKSAgICBiZmluX3JlYWQxNihNRE1BX1MwX0NVUlJfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MwX0NVUlJfWV9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihNRE1BX1MwX0NVUlJfWV9DT1VOVCx2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MwX0lSUV9TVEFUVVMoKSAgICAgIGJmaW5fcmVhZDE2KE1ETUFfUzBfSVJRX1NUQVRVUykKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MwX0lSUV9TVEFUVVModmFsKSAgYmZpbl93cml0ZTE2KE1ETUFfUzBfSVJRX1NUQVRVUyx2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MwX1BFUklQSEVSQUxfTUFQKCkgIGJmaW5fcmVhZDE2KE1ETUFfUzBfUEVSSVBIRVJBTF9NQVApCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMF9QRVJJUEhFUkFMX01BUCh2YWwpIGJmaW5fd3JpdGUxNihNRE1BX1MwX1BFUklQSEVSQUxfTUFQLHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDFfQ09ORklHKCkgICAgICAgICAgYmZpbl9yZWFkMTYoTURNQV9EMV9DT05GSUcpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMV9DT05GSUcodmFsKSAgICAgIGJmaW5fd3JpdGUxNihNRE1BX0QxX0NPTkZJRyx2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QxX05FWFRfREVTQ19QVFIoKSAgIGJmaW5fcmVhZDMyKE1ETUFfRDFfTkVYVF9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QxX05FWFRfREVTQ19QVFIodmFsKSBiZmluX3dyaXRlMzIoTURNQV9EMV9ORVhUX0RFU0NfUFRSLHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDFfU1RBUlRfQUREUigpICAgICAgYmZpbl9yZWFkMzIoTURNQV9EMV9TVEFSVF9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDFfU1RBUlRfQUREUih2YWwpICBiZmluX3dyaXRlMzIoTURNQV9EMV9TVEFSVF9BRERSLHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDFfWF9DT1VOVCgpICAgICAgICAgYmZpbl9yZWFkMTYoTURNQV9EMV9YX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDFfWF9DT1VOVCh2YWwpICAgICBiZmluX3dyaXRlMTYoTURNQV9EMV9YX0NPVU5ULHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDFfWV9DT1VOVCgpICAgICAgICAgYmZpbl9yZWFkMTYoTURNQV9EMV9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDFfWV9DT1VOVCh2YWwpICAgICBiZmluX3dyaXRlMTYoTURNQV9EMV9ZX0NPVU5ULHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDFfWF9NT0RJRlkoKSAgICAgICAgYmZpbl9yZWFkMTYoTURNQV9EMV9YX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QxX1hfTU9ESUZZKHZhbCkgICAgYmZpbl93cml0ZTE2KE1ETUFfRDFfWF9NT0RJRlksdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMV9ZX01PRElGWSgpICAgICAgICBiZmluX3JlYWQxNihNRE1BX0QxX1lfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDFfWV9NT0RJRlkodmFsKSAgICBiZmluX3dyaXRlMTYoTURNQV9EMV9ZX01PRElGWSx2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QxX0NVUlJfREVTQ19QVFIoKSAgIGJmaW5fcmVhZDMyKE1ETUFfRDFfQ1VSUl9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QxX0NVUlJfREVTQ19QVFIodmFsKSBiZmluX3dyaXRlMzIoTURNQV9EMV9DVVJSX0RFU0NfUFRSLHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDFfQ1VSUl9BRERSKCkgICAgICAgYmZpbl9yZWFkMzIoTURNQV9EMV9DVVJSX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMV9DVVJSX0FERFIodmFsKSAgIGJmaW5fd3JpdGUzMihNRE1BX0QxX0NVUlJfQUREUix2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QxX0NVUlJfWF9DT1VOVCgpICAgIGJmaW5fcmVhZDE2KE1ETUFfRDFfQ1VSUl9YX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDFfQ1VSUl9YX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KE1ETUFfRDFfQ1VSUl9YX0NPVU5ULHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDFfQ1VSUl9ZX0NPVU5UKCkgICAgYmZpbl9yZWFkMTYoTURNQV9EMV9DVVJSX1lfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMV9DVVJSX1lfQ09VTlQodmFsKSBiZmluX3dyaXRlMTYoTURNQV9EMV9DVVJSX1lfQ09VTlQsdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMV9JUlFfU1RBVFVTKCkgICAgICBiZmluX3JlYWQxNihNRE1BX0QxX0lSUV9TVEFUVVMpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMV9JUlFfU1RBVFVTKHZhbCkgIGJmaW5fd3JpdGUxNihNRE1BX0QxX0lSUV9TVEFUVVMsdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMV9QRVJJUEhFUkFMX01BUCgpICBiZmluX3JlYWQxNihNRE1BX0QxX1BFUklQSEVSQUxfTUFQKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDFfUEVSSVBIRVJBTF9NQVAodmFsKSBiZmluX3dyaXRlMTYoTURNQV9EMV9QRVJJUEhFUkFMX01BUCx2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MxX0NPTkZJRygpICAgICAgICAgIGJmaW5fcmVhZDE2KE1ETUFfUzFfQ09ORklHKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzFfQ09ORklHKHZhbCkgICAgICBiZmluX3dyaXRlMTYoTURNQV9TMV9DT05GSUcsdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMV9ORVhUX0RFU0NfUFRSKCkgICBiZmluX3JlYWQzMihNRE1BX1MxX05FWFRfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMV9ORVhUX0RFU0NfUFRSKHZhbCkgYmZpbl93cml0ZTMyKE1ETUFfUzFfTkVYVF9ERVNDX1BUUix2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MxX1NUQVJUX0FERFIoKSAgICAgIGJmaW5fcmVhZDMyKE1ETUFfUzFfU1RBUlRfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MxX1NUQVJUX0FERFIodmFsKSAgYmZpbl93cml0ZTMyKE1ETUFfUzFfU1RBUlRfQUREUix2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MxX1hfQ09VTlQoKSAgICAgICAgIGJmaW5fcmVhZDE2KE1ETUFfUzFfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MxX1hfQ09VTlQodmFsKSAgICAgYmZpbl93cml0ZTE2KE1ETUFfUzFfWF9DT1VOVCx2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MxX1lfQ09VTlQoKSAgICAgICAgIGJmaW5fcmVhZDE2KE1ETUFfUzFfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MxX1lfQ09VTlQodmFsKSAgICAgYmZpbl93cml0ZTE2KE1ETUFfUzFfWV9DT1VOVCx2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MxX1hfTU9ESUZZKCkgICAgICAgIGJmaW5fcmVhZDE2KE1ETUFfUzFfWF9NT0RJRlkpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMV9YX01PRElGWSh2YWwpICAgIGJmaW5fd3JpdGUxNihNRE1BX1MxX1hfTU9ESUZZLHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzFfWV9NT0RJRlkoKSAgICAgICAgYmZpbl9yZWFkMTYoTURNQV9TMV9ZX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MxX1lfTU9ESUZZKHZhbCkgICAgYmZpbl93cml0ZTE2KE1ETUFfUzFfWV9NT0RJRlksdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMV9DVVJSX0RFU0NfUFRSKCkgICBiZmluX3JlYWQzMihNRE1BX1MxX0NVUlJfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMV9DVVJSX0RFU0NfUFRSKHZhbCkgYmZpbl93cml0ZTMyKE1ETUFfUzFfQ1VSUl9ERVNDX1BUUix2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MxX0NVUlJfQUREUigpICAgICAgIGJmaW5fcmVhZDMyKE1ETUFfUzFfQ1VSUl9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzFfQ1VSUl9BRERSKHZhbCkgICBiZmluX3dyaXRlMzIoTURNQV9TMV9DVVJSX0FERFIsdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMV9DVVJSX1hfQ09VTlQoKSAgICBiZmluX3JlYWQxNihNRE1BX1MxX0NVUlJfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MxX0NVUlJfWF9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihNRE1BX1MxX0NVUlJfWF9DT1VOVCx2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MxX0NVUlJfWV9DT1VOVCgpICAgIGJmaW5fcmVhZDE2KE1ETUFfUzFfQ1VSUl9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzFfQ1VSUl9ZX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KE1ETUFfUzFfQ1VSUl9ZX0NPVU5ULHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzFfSVJRX1NUQVRVUygpICAgICAgYmZpbl9yZWFkMTYoTURNQV9TMV9JUlFfU1RBVFVTKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzFfSVJRX1NUQVRVUyh2YWwpICBiZmluX3dyaXRlMTYoTURNQV9TMV9JUlFfU1RBVFVTLHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzFfUEVSSVBIRVJBTF9NQVAoKSAgYmZpbl9yZWFkMTYoTURNQV9TMV9QRVJJUEhFUkFMX01BUCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MxX1BFUklQSEVSQUxfTUFQKHZhbCkgYmZpbl93cml0ZTE2KE1ETUFfUzFfUEVSSVBIRVJBTF9NQVAsdmFsKQogLyogSW50ZXJuYWwgTWVtb3J5IERNQSBSZWdpc3RlcnMgKDB4RkZDMF8xODAwIC0gMHhGRkMwXzE5RkYpICovCiAjZGVmaW5lIGJmaW5fcmVhZF9JTURNQV9EMF9DT05GSUcoKSAgICAgICAgICBiZmluX3JlYWQxNihJTURNQV9EMF9DT05GSUcpCiAjZGVmaW5lIGJmaW5fd3JpdGVfSU1ETUFfRDBfQ09ORklHKHZhbCkgICAgICBiZmluX3dyaXRlMTYoSU1ETUFfRDBfQ09ORklHLHZhbCkKQEAgLTE0NjUsNjUgKzE0NTcsNCBAQAogI2RlZmluZSBiZmluX3JlYWRfSU1ETUFfUzFfSVJRX1NUQVRVUygpICAgICAgYmZpbl9yZWFkMTYoSU1ETUFfUzFfSVJRX1NUQVRVUykKICNkZWZpbmUgYmZpbl93cml0ZV9JTURNQV9TMV9JUlFfU1RBVFVTKHZhbCkgIGJmaW5fd3JpdGUxNihJTURNQV9TMV9JUlFfU1RBVFVTLHZhbCkKIAotI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMF9DT05GSUcoKSAgYmZpbl9yZWFkX01ETUExX1MwX0NPTkZJRygpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMF9DT05GSUcodmFsKSBiZmluX3dyaXRlX01ETUExX1MwX0NPTkZJRyh2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MwX0lSUV9TVEFUVVMoKSAgYmZpbl9yZWFkX01ETUExX1MwX0lSUV9TVEFUVVMoKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzBfSVJRX1NUQVRVUyh2YWwpIGJmaW5fd3JpdGVfTURNQTFfUzBfSVJRX1NUQVRVUyh2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MwX1hfTU9ESUZZKCkgIGJmaW5fcmVhZF9NRE1BMV9TMF9YX01PRElGWSgpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMF9YX01PRElGWSh2YWwpIGJmaW5fd3JpdGVfTURNQTFfUzBfWF9NT0RJRlkodmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMF9ZX01PRElGWSgpICBiZmluX3JlYWRfTURNQTFfUzBfWV9NT0RJRlkoKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzBfWV9NT0RJRlkodmFsKSBiZmluX3dyaXRlX01ETUExX1MwX1lfTU9ESUZZKHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzBfWF9DT1VOVCgpICBiZmluX3JlYWRfTURNQTFfUzBfWF9DT1VOVCgpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMF9YX0NPVU5UKHZhbCkgYmZpbl93cml0ZV9NRE1BMV9TMF9YX0NPVU5UKHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzBfWV9DT1VOVCgpICBiZmluX3JlYWRfTURNQTFfUzBfWV9DT1VOVCgpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMF9ZX0NPVU5UKHZhbCkgYmZpbl93cml0ZV9NRE1BMV9TMF9ZX0NPVU5UKHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzBfU1RBUlRfQUREUigpICBiZmluX3JlYWRfTURNQTFfUzBfU1RBUlRfQUREUigpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMF9TVEFSVF9BRERSKHZhbCkgYmZpbl93cml0ZV9NRE1BMV9TMF9TVEFSVF9BRERSKHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDBfQ09ORklHKCkgIGJmaW5fcmVhZF9NRE1BMV9EMF9DT05GSUcoKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDBfQ09ORklHKHZhbCkgYmZpbl93cml0ZV9NRE1BMV9EMF9DT05GSUcodmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMF9JUlFfU1RBVFVTKCkgIGJmaW5fcmVhZF9NRE1BMV9EMF9JUlFfU1RBVFVTKCkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QwX0lSUV9TVEFUVVModmFsKSBiZmluX3dyaXRlX01ETUExX0QwX0lSUV9TVEFUVVModmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMF9YX01PRElGWSgpICBiZmluX3JlYWRfTURNQTFfRDBfWF9NT0RJRlkoKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDBfWF9NT0RJRlkodmFsKSBiZmluX3dyaXRlX01ETUExX0QwX1hfTU9ESUZZKHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDBfWV9NT0RJRlkoKSAgYmZpbl9yZWFkX01ETUExX0QwX1lfTU9ESUZZKCkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QwX1lfTU9ESUZZKHZhbCkgYmZpbl93cml0ZV9NRE1BMV9EMF9ZX01PRElGWSh2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QwX1hfQ09VTlQoKSAgYmZpbl9yZWFkX01ETUExX0QwX1hfQ09VTlQoKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDBfWF9DT1VOVCh2YWwpIGJmaW5fd3JpdGVfTURNQTFfRDBfWF9DT1VOVCh2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QwX1lfQ09VTlQoKSAgYmZpbl9yZWFkX01ETUExX0QwX1lfQ09VTlQoKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDBfWV9DT1VOVCh2YWwpIGJmaW5fd3JpdGVfTURNQTFfRDBfWV9DT1VOVCh2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QwX1NUQVJUX0FERFIoKSAgYmZpbl9yZWFkX01ETUExX0QwX1NUQVJUX0FERFIoKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDBfU1RBUlRfQUREUih2YWwpIGJmaW5fd3JpdGVfTURNQTFfRDBfU1RBUlRfQUREUih2YWwpCi0KLSNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzFfQ09ORklHKCkgIGJmaW5fcmVhZF9NRE1BMV9TMV9DT05GSUcoKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzFfQ09ORklHKHZhbCkgYmZpbl93cml0ZV9NRE1BMV9TMV9DT05GSUcodmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMV9JUlFfU1RBVFVTKCkgIGJmaW5fcmVhZF9NRE1BMV9TMV9JUlFfU1RBVFVTKCkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MxX0lSUV9TVEFUVVModmFsKSBiZmluX3dyaXRlX01ETUExX1MxX0lSUV9TVEFUVVModmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMV9YX01PRElGWSgpICBiZmluX3JlYWRfTURNQTFfUzFfWF9NT0RJRlkoKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzFfWF9NT0RJRlkodmFsKSBiZmluX3dyaXRlX01ETUExX1MxX1hfTU9ESUZZKHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzFfWV9NT0RJRlkoKSAgYmZpbl9yZWFkX01ETUExX1MxX1lfTU9ESUZZKCkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MxX1lfTU9ESUZZKHZhbCkgYmZpbl93cml0ZV9NRE1BMV9TMV9ZX01PRElGWSh2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MxX1hfQ09VTlQoKSAgYmZpbl9yZWFkX01ETUExX1MxX1hfQ09VTlQoKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzFfWF9DT1VOVCh2YWwpIGJmaW5fd3JpdGVfTURNQTFfUzFfWF9DT1VOVCh2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MxX1lfQ09VTlQoKSAgYmZpbl9yZWFkX01ETUExX1MxX1lfQ09VTlQoKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzFfWV9DT1VOVCh2YWwpIGJmaW5fd3JpdGVfTURNQTFfUzFfWV9DT1VOVCh2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MxX1NUQVJUX0FERFIoKSAgYmZpbl9yZWFkX01ETUExX1MxX1NUQVJUX0FERFIoKQotI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzFfU1RBUlRfQUREUih2YWwpIGJmaW5fd3JpdGVfTURNQTFfUzFfU1RBUlRfQUREUih2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QxX0NPTkZJRygpICBiZmluX3JlYWRfTURNQTFfRDFfQ09ORklHKCkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QxX0NPTkZJRyh2YWwpIGJmaW5fd3JpdGVfTURNQTFfRDFfQ09ORklHKHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDFfSVJRX1NUQVRVUygpICBiZmluX3JlYWRfTURNQTFfRDFfSVJRX1NUQVRVUygpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMV9JUlFfU1RBVFVTKHZhbCkgYmZpbl93cml0ZV9NRE1BMV9EMV9JUlFfU1RBVFVTKHZhbCkKLSNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDFfWF9NT0RJRlkoKSAgYmZpbl9yZWFkX01ETUExX0QxX1hfTU9ESUZZKCkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QxX1hfTU9ESUZZKHZhbCkgYmZpbl93cml0ZV9NRE1BMV9EMV9YX01PRElGWSh2YWwpCi0jZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QxX1lfTU9ESUZZKCkgIGJmaW5fcmVhZF9NRE1BMV9EMV9ZX01PRElGWSgpCi0jZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMV9ZX01PRElGWSh2YWwpIGJmaW5fd3JpdGVfTURNQTFfRDFfWV9NT0RJRlkodmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMV9YX0NPVU5UKCkgIGJmaW5fcmVhZF9NRE1BMV9EMV9YX0NPVU5UKCkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QxX1hfQ09VTlQodmFsKSBiZmluX3dyaXRlX01ETUExX0QxX1hfQ09VTlQodmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMV9ZX0NPVU5UKCkgIGJmaW5fcmVhZF9NRE1BMV9EMV9ZX0NPVU5UKCkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QxX1lfQ09VTlQodmFsKSBiZmluX3dyaXRlX01ETUExX0QxX1lfQ09VTlQodmFsKQotI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMV9TVEFSVF9BRERSKCkgIGJmaW5fcmVhZF9NRE1BMV9EMV9TVEFSVF9BRERSKCkKLSNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QxX1NUQVJUX0FERFIodmFsKSBiZmluX3dyaXRlX01ETUExX0QxX1NUQVJUX0FERFIodmFsKQotCi0vKiBUaGVzZSBuZWVkIHRvIGJlIGxhc3QgZHVlIHRvIHRoZSBjZGVmL2xpbnV4IGludGVyLWRlcGVuZGVuY2llcyAqLwotI2luY2x1ZGUgPGFzbS9pcnEuaD4KLQogI2VuZGlmCQkJCS8qIF9DREVGX0JGNTYxX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9pbmNsdWRlL21hY2gvZGVmQkY1NjEuaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9pbmNsdWRlL21hY2gvZGVmQkY1NjEuaAppbmRleCA3OWUwNDhkLi43MWU4MDVlIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvaW5jbHVkZS9tYWNoL2RlZkJGNTYxLmgKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2luY2x1ZGUvbWFjaC9kZWZCRjU2MS5oCkBAIC0xLDE4ICsxLDExIEBACiAvKgotICogQ29weXJpZ2h0IDIwMDUtMjAwOSBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKiBDb3B5cmlnaHQgMjAwNS0yMDEwIEFuYWxvZyBEZXZpY2VzIEluYy4KICAqCiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgQURJIEJTRCBsaWNlbnNlIG9yIHRoZSBHUEwtMiAob3IgbGF0ZXIpCiAgKi8KIAogI2lmbmRlZiBfREVGX0JGNTYxX0gKICNkZWZpbmUgX0RFRl9CRjU2MV9ICi0vKgotI2lmICFkZWZpbmVkKF9fQURTUEJGNTYxX18pCi0jd2FybmluZyBkZWZCRjU2MS5oIHNob3VsZCBvbmx5IGJlIGluY2x1ZGVkIGZvciBCRjU2MSBjaGlwLgotI2VuZGlmCi0qLwotLyogaW5jbHVkZSBhbGwgQ29yZSByZWdpc3RlcnMgYW5kIGJpdCBkZWZpbml0aW9ucyAqLwotI2luY2x1ZGUgPGFzbS9kZWZfTFBCbGFja2Zpbi5oPgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KIC8qIFN5c3RlbSBNTVIgUmVnaXN0ZXIgTWFwICovCkBAIC0zMTEsMTAgKzMwNCwxMCBAQAogI2RlZmluZSBQUEkxX0ZSQU1FIAkJCQkJMHhGRkMwMTMxMAkvKiBQUEkxIEZyYW1lIExlbmd0aCByZWdpc3RlciAqLwogCiAvKkRNQSB0cmFmZmljIGNvbnRyb2wgcmVnaXN0ZXJzICovCi0jZGVmaW5lCURNQTFfVENfUEVSICAweEZGQzAxQjBDCS8qIFRyYWZmaWMgY29udHJvbCBwZXJpb2RzICovCi0jZGVmaW5lCURNQTFfVENfQ05UICAweEZGQzAxQjEwCS8qIFRyYWZmaWMgY29udHJvbCBjdXJyZW50IGNvdW50cyAqLwotI2RlZmluZQlETUEyX1RDX1BFUiAgMHhGRkMwMEIwQwkvKiBUcmFmZmljIGNvbnRyb2wgcGVyaW9kcyAqLwotI2RlZmluZQlETUEyX1RDX0NOVCAgMHhGRkMwMEIxMAkvKiBUcmFmZmljIGNvbnRyb2wgY3VycmVudCBjb3VudHMgICAgICAgICovCisjZGVmaW5lCURNQUMwX1RDX1BFUiAgMHhGRkMwMEIwQwkvKiBUcmFmZmljIGNvbnRyb2wgcGVyaW9kcyAqLworI2RlZmluZQlETUFDMF9UQ19DTlQgIDB4RkZDMDBCMTAJLyogVHJhZmZpYyBjb250cm9sIGN1cnJlbnQgY291bnRzICAgICAgICAqLworI2RlZmluZQlETUFDMV9UQ19QRVIgIDB4RkZDMDFCMEMJLyogVHJhZmZpYyBjb250cm9sIHBlcmlvZHMgKi8KKyNkZWZpbmUJRE1BQzFfVENfQ05UICAweEZGQzAxQjEwCS8qIFRyYWZmaWMgY29udHJvbCBjdXJyZW50IGNvdW50cyAqLwogCiAvKiBETUExIENvbnRyb2xsZXIgcmVnaXN0ZXJzICgweEZGQzAgMUMwMC0weEZGQzAgMUZGRikgKi8KICNkZWZpbmUgRE1BMV8wX0NPTkZJRyAweEZGQzAxQzA4CS8qIERNQTEgQ2hhbm5lbCAwIENvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgKi8KQEAgLTQ4Niw2MSArNDc5LDYxIEBACiAjZGVmaW5lIERNQTFfMTFfUEVSSVBIRVJBTF9NQVAgMHhGRkMwMUVFQwkvKiBETUExIENoYW5uZWwgMTEgUGVyaXBoZXJhbCBNYXAgUmVnaXN0ZXIgKi8KIAogLyogTWVtb3J5IERNQTEgQ29udHJvbGxlciByZWdpc3RlcnMgKDB4RkZDMCAxRTgwLTB4RkZDMCAxRkZGKSAqLwotI2RlZmluZSBNRE1BMV9EMF9DT05GSUcgMHhGRkMwMUYwOAkvKk1lbURNQTEgU3RyZWFtIDAgRGVzdGluYXRpb24gQ29uZmlndXJhdGlvbiAqLwotI2RlZmluZSBNRE1BMV9EMF9ORVhUX0RFU0NfUFRSIDB4RkZDMDFGMDAJLypNZW1ETUExIFN0cmVhbSAwIERlc3RpbmF0aW9uIE5leHQgRGVzY3JpcHRvciBQdHIgUmVnICovCi0jZGVmaW5lIE1ETUExX0QwX1NUQVJUX0FERFIgMHhGRkMwMUYwNAkvKk1lbURNQTEgU3RyZWFtIDAgRGVzdGluYXRpb24gU3RhcnQgQWRkcmVzcyAqLwotI2RlZmluZSBNRE1BMV9EMF9YX0NPVU5UIDB4RkZDMDFGMTAJLypNZW1ETUExIFN0cmVhbSAwIERlc3RpbmF0aW9uIElubmVyLUxvb3AgQ291bnQgKi8KLSNkZWZpbmUgTURNQTFfRDBfWV9DT1VOVCAweEZGQzAxRjE4CS8qTWVtRE1BMSBTdHJlYW0gMCBEZXN0aW5hdGlvbiBPdXRlci1Mb29wIENvdW50ICovCi0jZGVmaW5lIE1ETUExX0QwX1hfTU9ESUZZIDB4RkZDMDFGMTQJLypNZW1ETUExIFN0cmVhbSAwIERlc3QgSW5uZXItTG9vcCBBZGRyZXNzLUluY3JlbWVudCAqLwotI2RlZmluZSBNRE1BMV9EMF9ZX01PRElGWSAweEZGQzAxRjFDCS8qTWVtRE1BMSBTdHJlYW0gMCBEZXN0IE91dGVyLUxvb3AgQWRkcmVzcy1JbmNyZW1lbnQgKi8KLSNkZWZpbmUgTURNQTFfRDBfQ1VSUl9ERVNDX1BUUiAweEZGQzAxRjIwCS8qTWVtRE1BMSBTdHJlYW0gMCBEZXN0IEN1cnJlbnQgRGVzY3JpcHRvciBQdHIgcmVnICovCi0jZGVmaW5lIE1ETUExX0QwX0NVUlJfQUREUiAweEZGQzAxRjI0CS8qTWVtRE1BMSBTdHJlYW0gMCBEZXN0aW5hdGlvbiBDdXJyZW50IEFkZHJlc3MgKi8KLSNkZWZpbmUgTURNQTFfRDBfQ1VSUl9YX0NPVU5UIDB4RkZDMDFGMzAJLypNZW1ETUExIFN0cmVhbSAwIERlc3QgQ3VycmVudCBJbm5lci1Mb29wIENvdW50ICovCi0jZGVmaW5lIE1ETUExX0QwX0NVUlJfWV9DT1VOVCAweEZGQzAxRjM4CS8qTWVtRE1BMSBTdHJlYW0gMCBEZXN0IEN1cnJlbnQgT3V0ZXItTG9vcCBDb3VudCAqLwotI2RlZmluZSBNRE1BMV9EMF9JUlFfU1RBVFVTIDB4RkZDMDFGMjgJLypNZW1ETUExIFN0cmVhbSAwIERlc3RpbmF0aW9uIEludGVycnVwdC9TdGF0dXMgKi8KLSNkZWZpbmUgTURNQTFfRDBfUEVSSVBIRVJBTF9NQVAgMHhGRkMwMUYyQwkvKk1lbURNQTEgU3RyZWFtIDAgRGVzdGluYXRpb24gUGVyaXBoZXJhbCBNYXAgKi8KKyNkZWZpbmUgTURNQV9EMl9DT05GSUcgMHhGRkMwMUYwOAkvKk1lbURNQTEgU3RyZWFtIDAgRGVzdGluYXRpb24gQ29uZmlndXJhdGlvbiAqLworI2RlZmluZSBNRE1BX0QyX05FWFRfREVTQ19QVFIgMHhGRkMwMUYwMAkvKk1lbURNQTEgU3RyZWFtIDAgRGVzdGluYXRpb24gTmV4dCBEZXNjcmlwdG9yIFB0ciBSZWcgKi8KKyNkZWZpbmUgTURNQV9EMl9TVEFSVF9BRERSIDB4RkZDMDFGMDQJLypNZW1ETUExIFN0cmVhbSAwIERlc3RpbmF0aW9uIFN0YXJ0IEFkZHJlc3MgKi8KKyNkZWZpbmUgTURNQV9EMl9YX0NPVU5UIDB4RkZDMDFGMTAJLypNZW1ETUExIFN0cmVhbSAwIERlc3RpbmF0aW9uIElubmVyLUxvb3AgQ291bnQgKi8KKyNkZWZpbmUgTURNQV9EMl9ZX0NPVU5UIDB4RkZDMDFGMTgJLypNZW1ETUExIFN0cmVhbSAwIERlc3RpbmF0aW9uIE91dGVyLUxvb3AgQ291bnQgKi8KKyNkZWZpbmUgTURNQV9EMl9YX01PRElGWSAweEZGQzAxRjE0CS8qTWVtRE1BMSBTdHJlYW0gMCBEZXN0IElubmVyLUxvb3AgQWRkcmVzcy1JbmNyZW1lbnQgKi8KKyNkZWZpbmUgTURNQV9EMl9ZX01PRElGWSAweEZGQzAxRjFDCS8qTWVtRE1BMSBTdHJlYW0gMCBEZXN0IE91dGVyLUxvb3AgQWRkcmVzcy1JbmNyZW1lbnQgKi8KKyNkZWZpbmUgTURNQV9EMl9DVVJSX0RFU0NfUFRSIDB4RkZDMDFGMjAJLypNZW1ETUExIFN0cmVhbSAwIERlc3QgQ3VycmVudCBEZXNjcmlwdG9yIFB0ciByZWcgKi8KKyNkZWZpbmUgTURNQV9EMl9DVVJSX0FERFIgMHhGRkMwMUYyNAkvKk1lbURNQTEgU3RyZWFtIDAgRGVzdGluYXRpb24gQ3VycmVudCBBZGRyZXNzICovCisjZGVmaW5lIE1ETUFfRDJfQ1VSUl9YX0NPVU5UIDB4RkZDMDFGMzAJLypNZW1ETUExIFN0cmVhbSAwIERlc3QgQ3VycmVudCBJbm5lci1Mb29wIENvdW50ICovCisjZGVmaW5lIE1ETUFfRDJfQ1VSUl9ZX0NPVU5UIDB4RkZDMDFGMzgJLypNZW1ETUExIFN0cmVhbSAwIERlc3QgQ3VycmVudCBPdXRlci1Mb29wIENvdW50ICovCisjZGVmaW5lIE1ETUFfRDJfSVJRX1NUQVRVUyAweEZGQzAxRjI4CS8qTWVtRE1BMSBTdHJlYW0gMCBEZXN0aW5hdGlvbiBJbnRlcnJ1cHQvU3RhdHVzICovCisjZGVmaW5lIE1ETUFfRDJfUEVSSVBIRVJBTF9NQVAgMHhGRkMwMUYyQwkvKk1lbURNQTEgU3RyZWFtIDAgRGVzdGluYXRpb24gUGVyaXBoZXJhbCBNYXAgKi8KIAotI2RlZmluZSBNRE1BMV9TMF9DT05GSUcgMHhGRkMwMUY0OAkvKk1lbURNQTEgU3RyZWFtIDAgU291cmNlIENvbmZpZ3VyYXRpb24gKi8KLSNkZWZpbmUgTURNQTFfUzBfTkVYVF9ERVNDX1BUUiAweEZGQzAxRjQwCS8qTWVtRE1BMSBTdHJlYW0gMCBTb3VyY2UgTmV4dCBEZXNjcmlwdG9yIFB0ciBSZWcgKi8KLSNkZWZpbmUgTURNQTFfUzBfU1RBUlRfQUREUiAweEZGQzAxRjQ0CS8qTWVtRE1BMSBTdHJlYW0gMCBTb3VyY2UgU3RhcnQgQWRkcmVzcyAqLwotI2RlZmluZSBNRE1BMV9TMF9YX0NPVU5UIDB4RkZDMDFGNTAJLypNZW1ETUExIFN0cmVhbSAwIFNvdXJjZSBJbm5lci1Mb29wIENvdW50ICovCi0jZGVmaW5lIE1ETUExX1MwX1lfQ09VTlQgMHhGRkMwMUY1OAkvKk1lbURNQTEgU3RyZWFtIDAgU291cmNlIE91dGVyLUxvb3AgQ291bnQgKi8KLSNkZWZpbmUgTURNQTFfUzBfWF9NT0RJRlkgMHhGRkMwMUY1NAkvKk1lbURNQTEgU3RyZWFtIDAgU291cmNlIElubmVyLUxvb3AgQWRkcmVzcy1JbmNyZW1lbnQgKi8KLSNkZWZpbmUgTURNQTFfUzBfWV9NT0RJRlkgMHhGRkMwMUY1QwkvKk1lbURNQTEgU3RyZWFtIDAgU291cmNlIE91dGVyLUxvb3AgQWRkcmVzcy1JbmNyZW1lbnQgKi8KLSNkZWZpbmUgTURNQTFfUzBfQ1VSUl9ERVNDX1BUUiAweEZGQzAxRjYwCS8qTWVtRE1BMSBTdHJlYW0gMCBTb3VyY2UgQ3VycmVudCBEZXNjcmlwdG9yIFB0ciByZWcgKi8KLSNkZWZpbmUgTURNQTFfUzBfQ1VSUl9BRERSIDB4RkZDMDFGNjQJLypNZW1ETUExIFN0cmVhbSAwIFNvdXJjZSBDdXJyZW50IEFkZHJlc3MgKi8KLSNkZWZpbmUgTURNQTFfUzBfQ1VSUl9YX0NPVU5UIDB4RkZDMDFGNzAJLypNZW1ETUExIFN0cmVhbSAwIFNvdXJjZSBDdXJyZW50IElubmVyLUxvb3AgQ291bnQgKi8KLSNkZWZpbmUgTURNQTFfUzBfQ1VSUl9ZX0NPVU5UIDB4RkZDMDFGNzgJLypNZW1ETUExIFN0cmVhbSAwIFNvdXJjZSBDdXJyZW50IE91dGVyLUxvb3AgQ291bnQgKi8KLSNkZWZpbmUgTURNQTFfUzBfSVJRX1NUQVRVUyAweEZGQzAxRjY4CS8qTWVtRE1BMSBTdHJlYW0gMCBTb3VyY2UgSW50ZXJydXB0L1N0YXR1cyAqLwotI2RlZmluZSBNRE1BMV9TMF9QRVJJUEhFUkFMX01BUCAweEZGQzAxRjZDCS8qTWVtRE1BMSBTdHJlYW0gMCBTb3VyY2UgUGVyaXBoZXJhbCBNYXAgKi8KKyNkZWZpbmUgTURNQV9TMl9DT05GSUcgMHhGRkMwMUY0OAkvKk1lbURNQTEgU3RyZWFtIDAgU291cmNlIENvbmZpZ3VyYXRpb24gKi8KKyNkZWZpbmUgTURNQV9TMl9ORVhUX0RFU0NfUFRSIDB4RkZDMDFGNDAJLypNZW1ETUExIFN0cmVhbSAwIFNvdXJjZSBOZXh0IERlc2NyaXB0b3IgUHRyIFJlZyAqLworI2RlZmluZSBNRE1BX1MyX1NUQVJUX0FERFIgMHhGRkMwMUY0NAkvKk1lbURNQTEgU3RyZWFtIDAgU291cmNlIFN0YXJ0IEFkZHJlc3MgKi8KKyNkZWZpbmUgTURNQV9TMl9YX0NPVU5UIDB4RkZDMDFGNTAJLypNZW1ETUExIFN0cmVhbSAwIFNvdXJjZSBJbm5lci1Mb29wIENvdW50ICovCisjZGVmaW5lIE1ETUFfUzJfWV9DT1VOVCAweEZGQzAxRjU4CS8qTWVtRE1BMSBTdHJlYW0gMCBTb3VyY2UgT3V0ZXItTG9vcCBDb3VudCAqLworI2RlZmluZSBNRE1BX1MyX1hfTU9ESUZZIDB4RkZDMDFGNTQJLypNZW1ETUExIFN0cmVhbSAwIFNvdXJjZSBJbm5lci1Mb29wIEFkZHJlc3MtSW5jcmVtZW50ICovCisjZGVmaW5lIE1ETUFfUzJfWV9NT0RJRlkgMHhGRkMwMUY1QwkvKk1lbURNQTEgU3RyZWFtIDAgU291cmNlIE91dGVyLUxvb3AgQWRkcmVzcy1JbmNyZW1lbnQgKi8KKyNkZWZpbmUgTURNQV9TMl9DVVJSX0RFU0NfUFRSIDB4RkZDMDFGNjAJLypNZW1ETUExIFN0cmVhbSAwIFNvdXJjZSBDdXJyZW50IERlc2NyaXB0b3IgUHRyIHJlZyAqLworI2RlZmluZSBNRE1BX1MyX0NVUlJfQUREUiAweEZGQzAxRjY0CS8qTWVtRE1BMSBTdHJlYW0gMCBTb3VyY2UgQ3VycmVudCBBZGRyZXNzICovCisjZGVmaW5lIE1ETUFfUzJfQ1VSUl9YX0NPVU5UIDB4RkZDMDFGNzAJLypNZW1ETUExIFN0cmVhbSAwIFNvdXJjZSBDdXJyZW50IElubmVyLUxvb3AgQ291bnQgKi8KKyNkZWZpbmUgTURNQV9TMl9DVVJSX1lfQ09VTlQgMHhGRkMwMUY3OAkvKk1lbURNQTEgU3RyZWFtIDAgU291cmNlIEN1cnJlbnQgT3V0ZXItTG9vcCBDb3VudCAqLworI2RlZmluZSBNRE1BX1MyX0lSUV9TVEFUVVMgMHhGRkMwMUY2OAkvKk1lbURNQTEgU3RyZWFtIDAgU291cmNlIEludGVycnVwdC9TdGF0dXMgKi8KKyNkZWZpbmUgTURNQV9TMl9QRVJJUEhFUkFMX01BUCAweEZGQzAxRjZDCS8qTWVtRE1BMSBTdHJlYW0gMCBTb3VyY2UgUGVyaXBoZXJhbCBNYXAgKi8KIAotI2RlZmluZSBNRE1BMV9EMV9DT05GSUcgMHhGRkMwMUY4OAkvKk1lbURNQTEgU3RyZWFtIDEgRGVzdGluYXRpb24gQ29uZmlndXJhdGlvbiAqLwotI2RlZmluZSBNRE1BMV9EMV9ORVhUX0RFU0NfUFRSIDB4RkZDMDFGODAJLypNZW1ETUExIFN0cmVhbSAxIERlc3RpbmF0aW9uIE5leHQgRGVzY3JpcHRvciBQdHIgUmVnICovCi0jZGVmaW5lIE1ETUExX0QxX1NUQVJUX0FERFIgMHhGRkMwMUY4NAkvKk1lbURNQTEgU3RyZWFtIDEgRGVzdGluYXRpb24gU3RhcnQgQWRkcmVzcyAqLwotI2RlZmluZSBNRE1BMV9EMV9YX0NPVU5UIDB4RkZDMDFGOTAJLypNZW1ETUExIFN0cmVhbSAxIERlc3RpbmF0aW9uIElubmVyLUxvb3AgQ291bnQgKi8KLSNkZWZpbmUgTURNQTFfRDFfWV9DT1VOVCAweEZGQzAxRjk4CS8qTWVtRE1BMSBTdHJlYW0gMSBEZXN0aW5hdGlvbiBPdXRlci1Mb29wIENvdW50ICovCi0jZGVmaW5lIE1ETUExX0QxX1hfTU9ESUZZIDB4RkZDMDFGOTQJLypNZW1ETUExIFN0cmVhbSAxIERlc3QgSW5uZXItTG9vcCBBZGRyZXNzLUluY3JlbWVudCAqLwotI2RlZmluZSBNRE1BMV9EMV9ZX01PRElGWSAweEZGQzAxRjlDCS8qTWVtRE1BMSBTdHJlYW0gMSBEZXN0IE91dGVyLUxvb3AgQWRkcmVzcy1JbmNyZW1lbnQgKi8KLSNkZWZpbmUgTURNQTFfRDFfQ1VSUl9ERVNDX1BUUiAweEZGQzAxRkEwCS8qTWVtRE1BMSBTdHJlYW0gMSBEZXN0IEN1cnJlbnQgRGVzY3JpcHRvciBQdHIgcmVnICovCi0jZGVmaW5lIE1ETUExX0QxX0NVUlJfQUREUiAweEZGQzAxRkE0CS8qTWVtRE1BMSBTdHJlYW0gMSBEZXN0IEN1cnJlbnQgQWRkcmVzcyAqLwotI2RlZmluZSBNRE1BMV9EMV9DVVJSX1hfQ09VTlQgMHhGRkMwMUZCMAkvKk1lbURNQTEgU3RyZWFtIDEgRGVzdCBDdXJyZW50IElubmVyLUxvb3AgQ291bnQgKi8KLSNkZWZpbmUgTURNQTFfRDFfQ1VSUl9ZX0NPVU5UIDB4RkZDMDFGQjgJLypNZW1ETUExIFN0cmVhbSAxIERlc3QgQ3VycmVudCBPdXRlci1Mb29wIENvdW50ICovCi0jZGVmaW5lIE1ETUExX0QxX0lSUV9TVEFUVVMgMHhGRkMwMUZBOAkvKk1lbURNQTEgU3RyZWFtIDEgRGVzdCBJbnRlcnJ1cHQvU3RhdHVzICovCi0jZGVmaW5lIE1ETUExX0QxX1BFUklQSEVSQUxfTUFQIDB4RkZDMDFGQUMJLypNZW1ETUExIFN0cmVhbSAxIERlc3QgUGVyaXBoZXJhbCBNYXAgKi8KKyNkZWZpbmUgTURNQV9EM19DT05GSUcgMHhGRkMwMUY4OAkvKk1lbURNQTEgU3RyZWFtIDEgRGVzdGluYXRpb24gQ29uZmlndXJhdGlvbiAqLworI2RlZmluZSBNRE1BX0QzX05FWFRfREVTQ19QVFIgMHhGRkMwMUY4MAkvKk1lbURNQTEgU3RyZWFtIDEgRGVzdGluYXRpb24gTmV4dCBEZXNjcmlwdG9yIFB0ciBSZWcgKi8KKyNkZWZpbmUgTURNQV9EM19TVEFSVF9BRERSIDB4RkZDMDFGODQJLypNZW1ETUExIFN0cmVhbSAxIERlc3RpbmF0aW9uIFN0YXJ0IEFkZHJlc3MgKi8KKyNkZWZpbmUgTURNQV9EM19YX0NPVU5UIDB4RkZDMDFGOTAJLypNZW1ETUExIFN0cmVhbSAxIERlc3RpbmF0aW9uIElubmVyLUxvb3AgQ291bnQgKi8KKyNkZWZpbmUgTURNQV9EM19ZX0NPVU5UIDB4RkZDMDFGOTgJLypNZW1ETUExIFN0cmVhbSAxIERlc3RpbmF0aW9uIE91dGVyLUxvb3AgQ291bnQgKi8KKyNkZWZpbmUgTURNQV9EM19YX01PRElGWSAweEZGQzAxRjk0CS8qTWVtRE1BMSBTdHJlYW0gMSBEZXN0IElubmVyLUxvb3AgQWRkcmVzcy1JbmNyZW1lbnQgKi8KKyNkZWZpbmUgTURNQV9EM19ZX01PRElGWSAweEZGQzAxRjlDCS8qTWVtRE1BMSBTdHJlYW0gMSBEZXN0IE91dGVyLUxvb3AgQWRkcmVzcy1JbmNyZW1lbnQgKi8KKyNkZWZpbmUgTURNQV9EM19DVVJSX0RFU0NfUFRSIDB4RkZDMDFGQTAJLypNZW1ETUExIFN0cmVhbSAxIERlc3QgQ3VycmVudCBEZXNjcmlwdG9yIFB0ciByZWcgKi8KKyNkZWZpbmUgTURNQV9EM19DVVJSX0FERFIgMHhGRkMwMUZBNAkvKk1lbURNQTEgU3RyZWFtIDEgRGVzdCBDdXJyZW50IEFkZHJlc3MgKi8KKyNkZWZpbmUgTURNQV9EM19DVVJSX1hfQ09VTlQgMHhGRkMwMUZCMAkvKk1lbURNQTEgU3RyZWFtIDEgRGVzdCBDdXJyZW50IElubmVyLUxvb3AgQ291bnQgKi8KKyNkZWZpbmUgTURNQV9EM19DVVJSX1lfQ09VTlQgMHhGRkMwMUZCOAkvKk1lbURNQTEgU3RyZWFtIDEgRGVzdCBDdXJyZW50IE91dGVyLUxvb3AgQ291bnQgKi8KKyNkZWZpbmUgTURNQV9EM19JUlFfU1RBVFVTIDB4RkZDMDFGQTgJLypNZW1ETUExIFN0cmVhbSAxIERlc3QgSW50ZXJydXB0L1N0YXR1cyAqLworI2RlZmluZSBNRE1BX0QzX1BFUklQSEVSQUxfTUFQIDB4RkZDMDFGQUMJLypNZW1ETUExIFN0cmVhbSAxIERlc3QgUGVyaXBoZXJhbCBNYXAgKi8KIAotI2RlZmluZSBNRE1BMV9TMV9DT05GSUcgMHhGRkMwMUZDOAkvKk1lbURNQTEgU3RyZWFtIDEgU291cmNlIENvbmZpZ3VyYXRpb24gKi8KLSNkZWZpbmUgTURNQTFfUzFfTkVYVF9ERVNDX1BUUiAweEZGQzAxRkMwCS8qTWVtRE1BMSBTdHJlYW0gMSBTb3VyY2UgTmV4dCBEZXNjcmlwdG9yIFB0ciBSZWcgKi8KLSNkZWZpbmUgTURNQTFfUzFfU1RBUlRfQUREUiAweEZGQzAxRkM0CS8qTWVtRE1BMSBTdHJlYW0gMSBTb3VyY2UgU3RhcnQgQWRkcmVzcyAqLwotI2RlZmluZSBNRE1BMV9TMV9YX0NPVU5UIDB4RkZDMDFGRDAJLypNZW1ETUExIFN0cmVhbSAxIFNvdXJjZSBJbm5lci1Mb29wIENvdW50ICovCi0jZGVmaW5lIE1ETUExX1MxX1lfQ09VTlQgMHhGRkMwMUZEOAkvKk1lbURNQTEgU3RyZWFtIDEgU291cmNlIE91dGVyLUxvb3AgQ291bnQgKi8KLSNkZWZpbmUgTURNQTFfUzFfWF9NT0RJRlkgMHhGRkMwMUZENAkvKk1lbURNQTEgU3RyZWFtIDEgU291cmNlIElubmVyLUxvb3AgQWRkcmVzcy1JbmNyZW1lbnQgKi8KLSNkZWZpbmUgTURNQTFfUzFfWV9NT0RJRlkgMHhGRkMwMUZEQwkvKk1lbURNQTEgU3RyZWFtIDEgU291cmNlIE91dGVyLUxvb3AgQWRkcmVzcy1JbmNyZW1lbnQgKi8KLSNkZWZpbmUgTURNQTFfUzFfQ1VSUl9ERVNDX1BUUiAweEZGQzAxRkUwCS8qTWVtRE1BMSBTdHJlYW0gMSBTb3VyY2UgQ3VycmVudCBEZXNjcmlwdG9yIFB0ciByZWcgKi8KLSNkZWZpbmUgTURNQTFfUzFfQ1VSUl9BRERSIDB4RkZDMDFGRTQJLypNZW1ETUExIFN0cmVhbSAxIFNvdXJjZSBDdXJyZW50IEFkZHJlc3MgKi8KLSNkZWZpbmUgTURNQTFfUzFfQ1VSUl9YX0NPVU5UIDB4RkZDMDFGRjAJLypNZW1ETUExIFN0cmVhbSAxIFNvdXJjZSBDdXJyZW50IElubmVyLUxvb3AgQ291bnQgKi8KLSNkZWZpbmUgTURNQTFfUzFfQ1VSUl9ZX0NPVU5UIDB4RkZDMDFGRjgJLypNZW1ETUExIFN0cmVhbSAxIFNvdXJjZSBDdXJyZW50IE91dGVyLUxvb3AgQ291bnQgKi8KLSNkZWZpbmUgTURNQTFfUzFfSVJRX1NUQVRVUyAweEZGQzAxRkU4CS8qTWVtRE1BMSBTdHJlYW0gMSBTb3VyY2UgSW50ZXJydXB0L1N0YXR1cyAqLwotI2RlZmluZSBNRE1BMV9TMV9QRVJJUEhFUkFMX01BUCAweEZGQzAxRkVDCS8qTWVtRE1BMSBTdHJlYW0gMSBTb3VyY2UgUGVyaXBoZXJhbCBNYXAgKi8KKyNkZWZpbmUgTURNQV9TM19DT05GSUcgMHhGRkMwMUZDOAkvKk1lbURNQTEgU3RyZWFtIDEgU291cmNlIENvbmZpZ3VyYXRpb24gKi8KKyNkZWZpbmUgTURNQV9TM19ORVhUX0RFU0NfUFRSIDB4RkZDMDFGQzAJLypNZW1ETUExIFN0cmVhbSAxIFNvdXJjZSBOZXh0IERlc2NyaXB0b3IgUHRyIFJlZyAqLworI2RlZmluZSBNRE1BX1MzX1NUQVJUX0FERFIgMHhGRkMwMUZDNAkvKk1lbURNQTEgU3RyZWFtIDEgU291cmNlIFN0YXJ0IEFkZHJlc3MgKi8KKyNkZWZpbmUgTURNQV9TM19YX0NPVU5UIDB4RkZDMDFGRDAJLypNZW1ETUExIFN0cmVhbSAxIFNvdXJjZSBJbm5lci1Mb29wIENvdW50ICovCisjZGVmaW5lIE1ETUFfUzNfWV9DT1VOVCAweEZGQzAxRkQ4CS8qTWVtRE1BMSBTdHJlYW0gMSBTb3VyY2UgT3V0ZXItTG9vcCBDb3VudCAqLworI2RlZmluZSBNRE1BX1MzX1hfTU9ESUZZIDB4RkZDMDFGRDQJLypNZW1ETUExIFN0cmVhbSAxIFNvdXJjZSBJbm5lci1Mb29wIEFkZHJlc3MtSW5jcmVtZW50ICovCisjZGVmaW5lIE1ETUFfUzNfWV9NT0RJRlkgMHhGRkMwMUZEQwkvKk1lbURNQTEgU3RyZWFtIDEgU291cmNlIE91dGVyLUxvb3AgQWRkcmVzcy1JbmNyZW1lbnQgKi8KKyNkZWZpbmUgTURNQV9TM19DVVJSX0RFU0NfUFRSIDB4RkZDMDFGRTAJLypNZW1ETUExIFN0cmVhbSAxIFNvdXJjZSBDdXJyZW50IERlc2NyaXB0b3IgUHRyIHJlZyAqLworI2RlZmluZSBNRE1BX1MzX0NVUlJfQUREUiAweEZGQzAxRkU0CS8qTWVtRE1BMSBTdHJlYW0gMSBTb3VyY2UgQ3VycmVudCBBZGRyZXNzICovCisjZGVmaW5lIE1ETUFfUzNfQ1VSUl9YX0NPVU5UIDB4RkZDMDFGRjAJLypNZW1ETUExIFN0cmVhbSAxIFNvdXJjZSBDdXJyZW50IElubmVyLUxvb3AgQ291bnQgKi8KKyNkZWZpbmUgTURNQV9TM19DVVJSX1lfQ09VTlQgMHhGRkMwMUZGOAkvKk1lbURNQTEgU3RyZWFtIDEgU291cmNlIEN1cnJlbnQgT3V0ZXItTG9vcCBDb3VudCAqLworI2RlZmluZSBNRE1BX1MzX0lSUV9TVEFUVVMgMHhGRkMwMUZFOAkvKk1lbURNQTEgU3RyZWFtIDEgU291cmNlIEludGVycnVwdC9TdGF0dXMgKi8KKyNkZWZpbmUgTURNQV9TM19QRVJJUEhFUkFMX01BUCAweEZGQzAxRkVDCS8qTWVtRE1BMSBTdHJlYW0gMSBTb3VyY2UgUGVyaXBoZXJhbCBNYXAgKi8KIAogLyogRE1BMiBDb250cm9sbGVyIHJlZ2lzdGVycyAoMHhGRkMwIDBDMDAtMHhGRkMwIDBERkYpICovCiAjZGVmaW5lIERNQTJfMF9DT05GSUcgMHhGRkMwMEMwOAkvKiBETUEyIENoYW5uZWwgMCBDb25maWd1cmF0aW9uIHJlZ2lzdGVyICovCkBAIC03MTIsMTE3ICs3MDUsNjEgQEAKICNkZWZpbmUgRE1BMl8xMV9QRVJJUEhFUkFMX01BUCAweEZGQzAwRUVDCS8qIERNQTIgQ2hhbm5lbCAxMSBQZXJpcGhlcmFsIE1hcCBSZWdpc3RlciAqLwogCiAvKiBNZW1vcnkgRE1BMiBDb250cm9sbGVyIHJlZ2lzdGVycyAoMHhGRkMwIDBFODAtMHhGRkMwIDBGRkYpICovCi0jZGVmaW5lIE1ETUEyX0QwX0NPTkZJRyAweEZGQzAwRjA4CS8qTWVtRE1BMiBTdHJlYW0gMCBEZXN0aW5hdGlvbiBDb25maWd1cmF0aW9uIHJlZ2lzdGVyICovCi0jZGVmaW5lIE1ETUEyX0QwX05FWFRfREVTQ19QVFIgMHhGRkMwMEYwMAkvKk1lbURNQTIgU3RyZWFtIDAgRGVzdGluYXRpb24gTmV4dCBEZXNjcmlwdG9yIFB0ciBSZWcgKi8KLSNkZWZpbmUgTURNQTJfRDBfU1RBUlRfQUREUiAweEZGQzAwRjA0CS8qTWVtRE1BMiBTdHJlYW0gMCBEZXN0aW5hdGlvbiBTdGFydCBBZGRyZXNzICovCi0jZGVmaW5lIE1ETUEyX0QwX1hfQ09VTlQgMHhGRkMwMEYxMAkvKk1lbURNQTIgU3RyZWFtIDAgRGVzdCBJbm5lci1Mb29wIENvdW50IHJlZ2lzdGVyICovCi0jZGVmaW5lIE1ETUEyX0QwX1lfQ09VTlQgMHhGRkMwMEYxOAkvKk1lbURNQTIgU3RyZWFtIDAgRGVzdCBPdXRlci1Mb29wIENvdW50IHJlZ2lzdGVyICovCi0jZGVmaW5lIE1ETUEyX0QwX1hfTU9ESUZZIDB4RkZDMDBGMTQJLypNZW1ETUEyIFN0cmVhbSAwIERlc3QgSW5uZXItTG9vcCBBZGRyZXNzLUluY3JlbWVudCAqLwotI2RlZmluZSBNRE1BMl9EMF9ZX01PRElGWSAweEZGQzAwRjFDCS8qTWVtRE1BMiBTdHJlYW0gMCBEZXN0IE91dGVyLUxvb3AgQWRkcmVzcy1JbmNyZW1lbnQgKi8KLSNkZWZpbmUgTURNQTJfRDBfQ1VSUl9ERVNDX1BUUiAweEZGQzAwRjIwCS8qTWVtRE1BMiBTdHJlYW0gMCBEZXN0IEN1cnJlbnQgRGVzY3JpcHRvciBQdHIgcmVnICovCi0jZGVmaW5lIE1ETUEyX0QwX0NVUlJfQUREUiAweEZGQzAwRjI0CS8qTWVtRE1BMiBTdHJlYW0gMCBEZXN0aW5hdGlvbiBDdXJyZW50IEFkZHJlc3MgKi8KLSNkZWZpbmUgTURNQTJfRDBfQ1VSUl9YX0NPVU5UIDB4RkZDMDBGMzAJLypNZW1ETUEyIFN0cmVhbSAwIERlc3QgQ3VycmVudCBJbm5lci1Mb29wIENvdW50IHJlZyAqLwotI2RlZmluZSBNRE1BMl9EMF9DVVJSX1lfQ09VTlQgMHhGRkMwMEYzOAkvKk1lbURNQTIgU3RyZWFtIDAgRGVzdCBDdXJyZW50IE91dGVyLUxvb3AgQ291bnQgcmVnICovCi0jZGVmaW5lIE1ETUEyX0QwX0lSUV9TVEFUVVMgMHhGRkMwMEYyOAkvKk1lbURNQTIgU3RyZWFtIDAgRGVzdCBJbnRlcnJ1cHQvU3RhdHVzIFJlZ2lzdGVyICovCi0jZGVmaW5lIE1ETUEyX0QwX1BFUklQSEVSQUxfTUFQIDB4RkZDMDBGMkMJLypNZW1ETUEyIFN0cmVhbSAwIERlc3RpbmF0aW9uIFBlcmlwaGVyYWwgTWFwIHJlZ2lzdGVyICovCisjZGVmaW5lIE1ETUFfRDBfQ09ORklHIDB4RkZDMDBGMDgJLypNZW1ETUEyIFN0cmVhbSAwIERlc3RpbmF0aW9uIENvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgKi8KKyNkZWZpbmUgTURNQV9EMF9ORVhUX0RFU0NfUFRSIDB4RkZDMDBGMDAJLypNZW1ETUEyIFN0cmVhbSAwIERlc3RpbmF0aW9uIE5leHQgRGVzY3JpcHRvciBQdHIgUmVnICovCisjZGVmaW5lIE1ETUFfRDBfU1RBUlRfQUREUiAweEZGQzAwRjA0CS8qTWVtRE1BMiBTdHJlYW0gMCBEZXN0aW5hdGlvbiBTdGFydCBBZGRyZXNzICovCisjZGVmaW5lIE1ETUFfRDBfWF9DT1VOVCAweEZGQzAwRjEwCS8qTWVtRE1BMiBTdHJlYW0gMCBEZXN0IElubmVyLUxvb3AgQ291bnQgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgTURNQV9EMF9ZX0NPVU5UIDB4RkZDMDBGMTgJLypNZW1ETUEyIFN0cmVhbSAwIERlc3QgT3V0ZXItTG9vcCBDb3VudCByZWdpc3RlciAqLworI2RlZmluZSBNRE1BX0QwX1hfTU9ESUZZIDB4RkZDMDBGMTQJLypNZW1ETUEyIFN0cmVhbSAwIERlc3QgSW5uZXItTG9vcCBBZGRyZXNzLUluY3JlbWVudCAqLworI2RlZmluZSBNRE1BX0QwX1lfTU9ESUZZIDB4RkZDMDBGMUMJLypNZW1ETUEyIFN0cmVhbSAwIERlc3QgT3V0ZXItTG9vcCBBZGRyZXNzLUluY3JlbWVudCAqLworI2RlZmluZSBNRE1BX0QwX0NVUlJfREVTQ19QVFIgMHhGRkMwMEYyMAkvKk1lbURNQTIgU3RyZWFtIDAgRGVzdCBDdXJyZW50IERlc2NyaXB0b3IgUHRyIHJlZyAqLworI2RlZmluZSBNRE1BX0QwX0NVUlJfQUREUiAweEZGQzAwRjI0CS8qTWVtRE1BMiBTdHJlYW0gMCBEZXN0aW5hdGlvbiBDdXJyZW50IEFkZHJlc3MgKi8KKyNkZWZpbmUgTURNQV9EMF9DVVJSX1hfQ09VTlQgMHhGRkMwMEYzMAkvKk1lbURNQTIgU3RyZWFtIDAgRGVzdCBDdXJyZW50IElubmVyLUxvb3AgQ291bnQgcmVnICovCisjZGVmaW5lIE1ETUFfRDBfQ1VSUl9ZX0NPVU5UIDB4RkZDMDBGMzgJLypNZW1ETUEyIFN0cmVhbSAwIERlc3QgQ3VycmVudCBPdXRlci1Mb29wIENvdW50IHJlZyAqLworI2RlZmluZSBNRE1BX0QwX0lSUV9TVEFUVVMgMHhGRkMwMEYyOAkvKk1lbURNQTIgU3RyZWFtIDAgRGVzdCBJbnRlcnJ1cHQvU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lIE1ETUFfRDBfUEVSSVBIRVJBTF9NQVAgMHhGRkMwMEYyQwkvKk1lbURNQTIgU3RyZWFtIDAgRGVzdGluYXRpb24gUGVyaXBoZXJhbCBNYXAgcmVnaXN0ZXIgKi8KIAotI2RlZmluZSBNRE1BMl9TMF9DT05GSUcgMHhGRkMwMEY0OAkvKk1lbURNQTIgU3RyZWFtIDAgU291cmNlIENvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgKi8KLSNkZWZpbmUgTURNQTJfUzBfTkVYVF9ERVNDX1BUUiAweEZGQzAwRjQwCS8qTWVtRE1BMiBTdHJlYW0gMCBTb3VyY2UgTmV4dCBEZXNjcmlwdG9yIFB0ciBSZWcgKi8KLSNkZWZpbmUgTURNQTJfUzBfU1RBUlRfQUREUiAweEZGQzAwRjQ0CS8qTWVtRE1BMiBTdHJlYW0gMCBTb3VyY2UgU3RhcnQgQWRkcmVzcyAqLwotI2RlZmluZSBNRE1BMl9TMF9YX0NPVU5UIDB4RkZDMDBGNTAJLypNZW1ETUEyIFN0cmVhbSAwIFNvdXJjZSBJbm5lci1Mb29wIENvdW50IHJlZ2lzdGVyICovCi0jZGVmaW5lIE1ETUEyX1MwX1lfQ09VTlQgMHhGRkMwMEY1OAkvKk1lbURNQTIgU3RyZWFtIDAgU291cmNlIE91dGVyLUxvb3AgQ291bnQgcmVnaXN0ZXIgKi8KLSNkZWZpbmUgTURNQTJfUzBfWF9NT0RJRlkgMHhGRkMwMEY1NAkvKk1lbURNQTIgU3RyZWFtIDAgU3JjIElubmVyLUxvb3AgQWRkci1JbmNyZW1lbnQgcmVnICovCi0jZGVmaW5lIE1ETUEyX1MwX1lfTU9ESUZZIDB4RkZDMDBGNUMJLypNZW1ETUEyIFN0cmVhbSAwIFNyYyBPdXRlci1Mb29wIEFkZHItSW5jcmVtZW50IHJlZyAqLwotI2RlZmluZSBNRE1BMl9TMF9DVVJSX0RFU0NfUFRSIDB4RkZDMDBGNjAJLypNZW1ETUEyIFN0cmVhbSAwIFNvdXJjZSBDdXJyZW50IERlc2NyaXB0b3IgUHRyIHJlZyAqLwotI2RlZmluZSBNRE1BMl9TMF9DVVJSX0FERFIgMHhGRkMwMEY2NAkvKk1lbURNQTIgU3RyZWFtIDAgU291cmNlIEN1cnJlbnQgQWRkcmVzcyAqLwotI2RlZmluZSBNRE1BMl9TMF9DVVJSX1hfQ09VTlQgMHhGRkMwMEY3MAkvKk1lbURNQTIgU3RyZWFtIDAgU3JjIEN1cnJlbnQgSW5uZXItTG9vcCBDb3VudCByZWcgKi8KLSNkZWZpbmUgTURNQTJfUzBfQ1VSUl9ZX0NPVU5UIDB4RkZDMDBGNzgJLypNZW1ETUEyIFN0cmVhbSAwIFNyYyBDdXJyZW50IE91dGVyLUxvb3AgQ291bnQgcmVnICovCi0jZGVmaW5lIE1ETUEyX1MwX0lSUV9TVEFUVVMgMHhGRkMwMEY2OAkvKk1lbURNQTIgU3RyZWFtIDAgU291cmNlIEludGVycnVwdC9TdGF0dXMgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgTURNQTJfUzBfUEVSSVBIRVJBTF9NQVAgMHhGRkMwMEY2QwkvKk1lbURNQTIgU3RyZWFtIDAgU291cmNlIFBlcmlwaGVyYWwgTWFwIHJlZ2lzdGVyICovCisjZGVmaW5lIE1ETUFfUzBfQ09ORklHIDB4RkZDMDBGNDgJLypNZW1ETUEyIFN0cmVhbSAwIFNvdXJjZSBDb25maWd1cmF0aW9uIHJlZ2lzdGVyICovCisjZGVmaW5lIE1ETUFfUzBfTkVYVF9ERVNDX1BUUiAweEZGQzAwRjQwCS8qTWVtRE1BMiBTdHJlYW0gMCBTb3VyY2UgTmV4dCBEZXNjcmlwdG9yIFB0ciBSZWcgKi8KKyNkZWZpbmUgTURNQV9TMF9TVEFSVF9BRERSIDB4RkZDMDBGNDQJLypNZW1ETUEyIFN0cmVhbSAwIFNvdXJjZSBTdGFydCBBZGRyZXNzICovCisjZGVmaW5lIE1ETUFfUzBfWF9DT1VOVCAweEZGQzAwRjUwCS8qTWVtRE1BMiBTdHJlYW0gMCBTb3VyY2UgSW5uZXItTG9vcCBDb3VudCByZWdpc3RlciAqLworI2RlZmluZSBNRE1BX1MwX1lfQ09VTlQgMHhGRkMwMEY1OAkvKk1lbURNQTIgU3RyZWFtIDAgU291cmNlIE91dGVyLUxvb3AgQ291bnQgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgTURNQV9TMF9YX01PRElGWSAweEZGQzAwRjU0CS8qTWVtRE1BMiBTdHJlYW0gMCBTcmMgSW5uZXItTG9vcCBBZGRyLUluY3JlbWVudCByZWcgKi8KKyNkZWZpbmUgTURNQV9TMF9ZX01PRElGWSAweEZGQzAwRjVDCS8qTWVtRE1BMiBTdHJlYW0gMCBTcmMgT3V0ZXItTG9vcCBBZGRyLUluY3JlbWVudCByZWcgKi8KKyNkZWZpbmUgTURNQV9TMF9DVVJSX0RFU0NfUFRSIDB4RkZDMDBGNjAJLypNZW1ETUEyIFN0cmVhbSAwIFNvdXJjZSBDdXJyZW50IERlc2NyaXB0b3IgUHRyIHJlZyAqLworI2RlZmluZSBNRE1BX1MwX0NVUlJfQUREUiAweEZGQzAwRjY0CS8qTWVtRE1BMiBTdHJlYW0gMCBTb3VyY2UgQ3VycmVudCBBZGRyZXNzICovCisjZGVmaW5lIE1ETUFfUzBfQ1VSUl9YX0NPVU5UIDB4RkZDMDBGNzAJLypNZW1ETUEyIFN0cmVhbSAwIFNyYyBDdXJyZW50IElubmVyLUxvb3AgQ291bnQgcmVnICovCisjZGVmaW5lIE1ETUFfUzBfQ1VSUl9ZX0NPVU5UIDB4RkZDMDBGNzgJLypNZW1ETUEyIFN0cmVhbSAwIFNyYyBDdXJyZW50IE91dGVyLUxvb3AgQ291bnQgcmVnICovCisjZGVmaW5lIE1ETUFfUzBfSVJRX1NUQVRVUyAweEZGQzAwRjY4CS8qTWVtRE1BMiBTdHJlYW0gMCBTb3VyY2UgSW50ZXJydXB0L1N0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZSBNRE1BX1MwX1BFUklQSEVSQUxfTUFQIDB4RkZDMDBGNkMJLypNZW1ETUEyIFN0cmVhbSAwIFNvdXJjZSBQZXJpcGhlcmFsIE1hcCByZWdpc3RlciAqLwogCi0jZGVmaW5lIE1ETUEyX0QxX0NPTkZJRyAweEZGQzAwRjg4CS8qTWVtRE1BMiBTdHJlYW0gMSBEZXN0aW5hdGlvbiBDb25maWd1cmF0aW9uIHJlZ2lzdGVyICovCi0jZGVmaW5lIE1ETUEyX0QxX05FWFRfREVTQ19QVFIgMHhGRkMwMEY4MAkvKk1lbURNQTIgU3RyZWFtIDEgRGVzdGluYXRpb24gTmV4dCBEZXNjcmlwdG9yIFB0ciBSZWcgKi8KLSNkZWZpbmUgTURNQTJfRDFfU1RBUlRfQUREUiAweEZGQzAwRjg0CS8qTWVtRE1BMiBTdHJlYW0gMSBEZXN0aW5hdGlvbiBTdGFydCBBZGRyZXNzICovCi0jZGVmaW5lIE1ETUEyX0QxX1hfQ09VTlQgMHhGRkMwMEY5MAkvKk1lbURNQTIgU3RyZWFtIDEgRGVzdCBJbm5lci1Mb29wIENvdW50IHJlZ2lzdGVyICovCi0jZGVmaW5lIE1ETUEyX0QxX1lfQ09VTlQgMHhGRkMwMEY5OAkvKk1lbURNQTIgU3RyZWFtIDEgRGVzdCBPdXRlci1Mb29wIENvdW50IHJlZ2lzdGVyICovCi0jZGVmaW5lIE1ETUEyX0QxX1hfTU9ESUZZIDB4RkZDMDBGOTQJLypNZW1ETUEyIFN0cmVhbSAxIERlc3QgSW5uZXItTG9vcCBBZGRyZXNzLUluY3JlbWVudCAqLwotI2RlZmluZSBNRE1BMl9EMV9ZX01PRElGWSAweEZGQzAwRjlDCS8qTWVtRE1BMiBTdHJlYW0gMSBEZXN0IE91dGVyLUxvb3AgQWRkcmVzcy1JbmNyZW1lbnQgKi8KLSNkZWZpbmUgTURNQTJfRDFfQ1VSUl9ERVNDX1BUUiAweEZGQzAwRkEwCS8qTWVtRE1BMiBTdHJlYW0gMSBEZXN0aW5hdGlvbiBDdXJyZW50IERlc2NyaXB0b3IgUHRyICovCi0jZGVmaW5lIE1ETUEyX0QxX0NVUlJfQUREUiAweEZGQzAwRkE0CS8qTWVtRE1BMiBTdHJlYW0gMSBEZXN0aW5hdGlvbiBDdXJyZW50IEFkZHJlc3MgcmVnICovCi0jZGVmaW5lIE1ETUEyX0QxX0NVUlJfWF9DT1VOVCAweEZGQzAwRkIwCS8qTWVtRE1BMiBTdHJlYW0gMSBEZXN0IEN1cnJlbnQgSW5uZXItTG9vcCBDb3VudCByZWcgKi8KLSNkZWZpbmUgTURNQTJfRDFfQ1VSUl9ZX0NPVU5UIDB4RkZDMDBGQjgJLypNZW1ETUEyIFN0cmVhbSAxIERlc3QgQ3VycmVudCBPdXRlci1Mb29wIENvdW50IHJlZyAqLwotI2RlZmluZSBNRE1BMl9EMV9JUlFfU1RBVFVTIDB4RkZDMDBGQTgJLypNZW1ETUEyIFN0cmVhbSAxIERlc3RpbmF0aW9uIEludGVycnVwdC9TdGF0dXMgUmVnICovCi0jZGVmaW5lIE1ETUEyX0QxX1BFUklQSEVSQUxfTUFQIDB4RkZDMDBGQUMJLypNZW1ETUEyIFN0cmVhbSAxIERlc3RpbmF0aW9uIFBlcmlwaGVyYWwgTWFwIHJlZ2lzdGVyICovCisjZGVmaW5lIE1ETUFfRDFfQ09ORklHIDB4RkZDMDBGODgJLypNZW1ETUEyIFN0cmVhbSAxIERlc3RpbmF0aW9uIENvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgKi8KKyNkZWZpbmUgTURNQV9EMV9ORVhUX0RFU0NfUFRSIDB4RkZDMDBGODAJLypNZW1ETUEyIFN0cmVhbSAxIERlc3RpbmF0aW9uIE5leHQgRGVzY3JpcHRvciBQdHIgUmVnICovCisjZGVmaW5lIE1ETUFfRDFfU1RBUlRfQUREUiAweEZGQzAwRjg0CS8qTWVtRE1BMiBTdHJlYW0gMSBEZXN0aW5hdGlvbiBTdGFydCBBZGRyZXNzICovCisjZGVmaW5lIE1ETUFfRDFfWF9DT1VOVCAweEZGQzAwRjkwCS8qTWVtRE1BMiBTdHJlYW0gMSBEZXN0IElubmVyLUxvb3AgQ291bnQgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgTURNQV9EMV9ZX0NPVU5UIDB4RkZDMDBGOTgJLypNZW1ETUEyIFN0cmVhbSAxIERlc3QgT3V0ZXItTG9vcCBDb3VudCByZWdpc3RlciAqLworI2RlZmluZSBNRE1BX0QxX1hfTU9ESUZZIDB4RkZDMDBGOTQJLypNZW1ETUEyIFN0cmVhbSAxIERlc3QgSW5uZXItTG9vcCBBZGRyZXNzLUluY3JlbWVudCAqLworI2RlZmluZSBNRE1BX0QxX1lfTU9ESUZZIDB4RkZDMDBGOUMJLypNZW1ETUEyIFN0cmVhbSAxIERlc3QgT3V0ZXItTG9vcCBBZGRyZXNzLUluY3JlbWVudCAqLworI2RlZmluZSBNRE1BX0QxX0NVUlJfREVTQ19QVFIgMHhGRkMwMEZBMAkvKk1lbURNQTIgU3RyZWFtIDEgRGVzdGluYXRpb24gQ3VycmVudCBEZXNjcmlwdG9yIFB0ciAqLworI2RlZmluZSBNRE1BX0QxX0NVUlJfQUREUiAweEZGQzAwRkE0CS8qTWVtRE1BMiBTdHJlYW0gMSBEZXN0aW5hdGlvbiBDdXJyZW50IEFkZHJlc3MgcmVnICovCisjZGVmaW5lIE1ETUFfRDFfQ1VSUl9YX0NPVU5UIDB4RkZDMDBGQjAJLypNZW1ETUEyIFN0cmVhbSAxIERlc3QgQ3VycmVudCBJbm5lci1Mb29wIENvdW50IHJlZyAqLworI2RlZmluZSBNRE1BX0QxX0NVUlJfWV9DT1VOVCAweEZGQzAwRkI4CS8qTWVtRE1BMiBTdHJlYW0gMSBEZXN0IEN1cnJlbnQgT3V0ZXItTG9vcCBDb3VudCByZWcgKi8KKyNkZWZpbmUgTURNQV9EMV9JUlFfU1RBVFVTIDB4RkZDMDBGQTgJLypNZW1ETUEyIFN0cmVhbSAxIERlc3RpbmF0aW9uIEludGVycnVwdC9TdGF0dXMgUmVnICovCisjZGVmaW5lIE1ETUFfRDFfUEVSSVBIRVJBTF9NQVAgMHhGRkMwMEZBQwkvKk1lbURNQTIgU3RyZWFtIDEgRGVzdGluYXRpb24gUGVyaXBoZXJhbCBNYXAgcmVnaXN0ZXIgKi8KIAotI2RlZmluZSBNRE1BMl9TMV9DT05GSUcgMHhGRkMwMEZDOAkvKk1lbURNQTIgU3RyZWFtIDEgU291cmNlIENvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgKi8KLSNkZWZpbmUgTURNQTJfUzFfTkVYVF9ERVNDX1BUUiAweEZGQzAwRkMwCS8qTWVtRE1BMiBTdHJlYW0gMSBTb3VyY2UgTmV4dCBEZXNjcmlwdG9yIFB0ciBSZWcgKi8KLSNkZWZpbmUgTURNQTJfUzFfU1RBUlRfQUREUiAweEZGQzAwRkM0CS8qTWVtRE1BMiBTdHJlYW0gMSBTb3VyY2UgU3RhcnQgQWRkcmVzcyAqLwotI2RlZmluZSBNRE1BMl9TMV9YX0NPVU5UIDB4RkZDMDBGRDAJLypNZW1ETUEyIFN0cmVhbSAxIFNvdXJjZSBJbm5lci1Mb29wIENvdW50IHJlZ2lzdGVyICovCi0jZGVmaW5lIE1ETUEyX1MxX1lfQ09VTlQgMHhGRkMwMEZEOAkvKk1lbURNQTIgU3RyZWFtIDEgU291cmNlIE91dGVyLUxvb3AgQ291bnQgcmVnaXN0ZXIgKi8KLSNkZWZpbmUgTURNQTJfUzFfWF9NT0RJRlkgMHhGRkMwMEZENAkvKk1lbURNQTIgU3RyZWFtIDEgU3JjIElubmVyLUxvb3AgQWRkcmVzcy1JbmNyZW1lbnQgKi8KLSNkZWZpbmUgTURNQTJfUzFfWV9NT0RJRlkgMHhGRkMwMEZEQwkvKk1lbURNQTIgU3RyZWFtIDEgU291cmNlIE91dGVyLUxvb3AgQWRkcmVzcy1JbmNyZW1lbnQgKi8KLSNkZWZpbmUgTURNQTJfUzFfQ1VSUl9ERVNDX1BUUiAweEZGQzAwRkUwCS8qTWVtRE1BMiBTdHJlYW0gMSBTb3VyY2UgQ3VycmVudCBEZXNjcmlwdG9yIFB0ciByZWcgKi8KLSNkZWZpbmUgTURNQTJfUzFfQ1VSUl9BRERSIDB4RkZDMDBGRTQJLypNZW1ETUEyIFN0cmVhbSAxIFNvdXJjZSBDdXJyZW50IEFkZHJlc3MgKi8KLSNkZWZpbmUgTURNQTJfUzFfQ1VSUl9YX0NPVU5UIDB4RkZDMDBGRjAJLypNZW1ETUEyIFN0cmVhbSAxIFNvdXJjZSBDdXJyZW50IElubmVyLUxvb3AgQ291bnQgKi8KLSNkZWZpbmUgTURNQTJfUzFfQ1VSUl9ZX0NPVU5UIDB4RkZDMDBGRjgJLypNZW1ETUEyIFN0cmVhbSAxIFNvdXJjZSBDdXJyZW50IE91dGVyLUxvb3AgQ291bnQgKi8KLSNkZWZpbmUgTURNQTJfUzFfSVJRX1NUQVRVUyAweEZGQzAwRkU4CS8qTWVtRE1BMiBTdHJlYW0gMSBTb3VyY2UgSW50ZXJydXB0L1N0YXR1cyBSZWdpc3RlciAqLwotI2RlZmluZSBNRE1BMl9TMV9QRVJJUEhFUkFMX01BUCAweEZGQzAwRkVDCS8qTWVtRE1BMiBTdHJlYW0gMSBTb3VyY2UgUGVyaXBoZXJhbCBNYXAgcmVnaXN0ZXIgKi8KLQotI2RlZmluZSBNRE1BX0QwX05FWFRfREVTQ19QVFIgTURNQTFfRDBfTkVYVF9ERVNDX1BUUgotI2RlZmluZSBNRE1BX0QwX1NUQVJUX0FERFIgTURNQTFfRDBfU1RBUlRfQUREUgotI2RlZmluZSBNRE1BX0QwX0NPTkZJRyBNRE1BMV9EMF9DT05GSUcKLSNkZWZpbmUgTURNQV9EMF9YX0NPVU5UIE1ETUExX0QwX1hfQ09VTlQKLSNkZWZpbmUgTURNQV9EMF9YX01PRElGWSBNRE1BMV9EMF9YX01PRElGWQotI2RlZmluZSBNRE1BX0QwX1lfQ09VTlQgTURNQTFfRDBfWV9DT1VOVAotI2RlZmluZSBNRE1BX0QwX1lfTU9ESUZZIE1ETUExX0QwX1lfTU9ESUZZCi0jZGVmaW5lIE1ETUFfRDBfQ1VSUl9ERVNDX1BUUiBNRE1BMV9EMF9DVVJSX0RFU0NfUFRSCi0jZGVmaW5lIE1ETUFfRDBfQ1VSUl9BRERSIE1ETUExX0QwX0NVUlJfQUREUgotI2RlZmluZSBNRE1BX0QwX0lSUV9TVEFUVVMgTURNQTFfRDBfSVJRX1NUQVRVUwotI2RlZmluZSBNRE1BX0QwX1BFUklQSEVSQUxfTUFQIE1ETUExX0QwX1BFUklQSEVSQUxfTUFQCi0jZGVmaW5lIE1ETUFfRDBfQ1VSUl9YX0NPVU5UIE1ETUExX0QwX0NVUlJfWF9DT1VOVAotI2RlZmluZSBNRE1BX0QwX0NVUlJfWV9DT1VOVCBNRE1BMV9EMF9DVVJSX1lfQ09VTlQKLQotI2RlZmluZSBNRE1BX1MwX05FWFRfREVTQ19QVFIgTURNQTFfUzBfTkVYVF9ERVNDX1BUUgotI2RlZmluZSBNRE1BX1MwX1NUQVJUX0FERFIgTURNQTFfUzBfU1RBUlRfQUREUgotI2RlZmluZSBNRE1BX1MwX0NPTkZJRyBNRE1BMV9TMF9DT05GSUcKLSNkZWZpbmUgTURNQV9TMF9YX0NPVU5UIE1ETUExX1MwX1hfQ09VTlQKLSNkZWZpbmUgTURNQV9TMF9YX01PRElGWSBNRE1BMV9TMF9YX01PRElGWQotI2RlZmluZSBNRE1BX1MwX1lfQ09VTlQgTURNQTFfUzBfWV9DT1VOVAotI2RlZmluZSBNRE1BX1MwX1lfTU9ESUZZIE1ETUExX1MwX1lfTU9ESUZZCi0jZGVmaW5lIE1ETUFfUzBfQ1VSUl9ERVNDX1BUUiBNRE1BMV9TMF9DVVJSX0RFU0NfUFRSCi0jZGVmaW5lIE1ETUFfUzBfQ1VSUl9BRERSIE1ETUExX1MwX0NVUlJfQUREUgotI2RlZmluZSBNRE1BX1MwX0lSUV9TVEFUVVMgTURNQTFfUzBfSVJRX1NUQVRVUwotI2RlZmluZSBNRE1BX1MwX1BFUklQSEVSQUxfTUFQIE1ETUExX1MwX1BFUklQSEVSQUxfTUFQCi0jZGVmaW5lIE1ETUFfUzBfQ1VSUl9YX0NPVU5UIE1ETUExX1MwX0NVUlJfWF9DT1VOVAotI2RlZmluZSBNRE1BX1MwX0NVUlJfWV9DT1VOVCBNRE1BMV9TMF9DVVJSX1lfQ09VTlQKLQotI2RlZmluZSBNRE1BX0QxX05FWFRfREVTQ19QVFIgTURNQTFfRDFfTkVYVF9ERVNDX1BUUgotI2RlZmluZSBNRE1BX0QxX1NUQVJUX0FERFIgTURNQTFfRDFfU1RBUlRfQUREUgotI2RlZmluZSBNRE1BX0QxX0NPTkZJRyBNRE1BMV9EMV9DT05GSUcKLSNkZWZpbmUgTURNQV9EMV9YX0NPVU5UIE1ETUExX0QxX1hfQ09VTlQKLSNkZWZpbmUgTURNQV9EMV9YX01PRElGWSBNRE1BMV9EMV9YX01PRElGWQotI2RlZmluZSBNRE1BX0QxX1lfQ09VTlQgTURNQTFfRDFfWV9DT1VOVAotI2RlZmluZSBNRE1BX0QxX1lfTU9ESUZZIE1ETUExX0QxX1lfTU9ESUZZCi0jZGVmaW5lIE1ETUFfRDFfQ1VSUl9ERVNDX1BUUiBNRE1BMV9EMV9DVVJSX0RFU0NfUFRSCi0jZGVmaW5lIE1ETUFfRDFfQ1VSUl9BRERSIE1ETUExX0QxX0NVUlJfQUREUgotI2RlZmluZSBNRE1BX0QxX0lSUV9TVEFUVVMgTURNQTFfRDFfSVJRX1NUQVRVUwotI2RlZmluZSBNRE1BX0QxX1BFUklQSEVSQUxfTUFQIE1ETUExX0QxX1BFUklQSEVSQUxfTUFQCi0jZGVmaW5lIE1ETUFfRDFfQ1VSUl9YX0NPVU5UIE1ETUExX0QxX0NVUlJfWF9DT1VOVAotI2RlZmluZSBNRE1BX0QxX0NVUlJfWV9DT1VOVCBNRE1BMV9EMV9DVVJSX1lfQ09VTlQKLQotI2RlZmluZSBNRE1BX1MxX05FWFRfREVTQ19QVFIgTURNQTFfUzFfTkVYVF9ERVNDX1BUUgotI2RlZmluZSBNRE1BX1MxX1NUQVJUX0FERFIgTURNQTFfUzFfU1RBUlRfQUREUgotI2RlZmluZSBNRE1BX1MxX0NPTkZJRyBNRE1BMV9TMV9DT05GSUcKLSNkZWZpbmUgTURNQV9TMV9YX0NPVU5UIE1ETUExX1MxX1hfQ09VTlQKLSNkZWZpbmUgTURNQV9TMV9YX01PRElGWSBNRE1BMV9TMV9YX01PRElGWQotI2RlZmluZSBNRE1BX1MxX1lfQ09VTlQgTURNQTFfUzFfWV9DT1VOVAotI2RlZmluZSBNRE1BX1MxX1lfTU9ESUZZIE1ETUExX1MxX1lfTU9ESUZZCi0jZGVmaW5lIE1ETUFfUzFfQ1VSUl9ERVNDX1BUUiBNRE1BMV9TMV9DVVJSX0RFU0NfUFRSCi0jZGVmaW5lIE1ETUFfUzFfQ1VSUl9BRERSIE1ETUExX1MxX0NVUlJfQUREUgotI2RlZmluZSBNRE1BX1MxX0lSUV9TVEFUVVMgTURNQTFfUzFfSVJRX1NUQVRVUwotI2RlZmluZSBNRE1BX1MxX1BFUklQSEVSQUxfTUFQIE1ETUExX1MxX1BFUklQSEVSQUxfTUFQCi0jZGVmaW5lIE1ETUFfUzFfQ1VSUl9YX0NPVU5UIE1ETUExX1MxX0NVUlJfWF9DT1VOVAotI2RlZmluZSBNRE1BX1MxX0NVUlJfWV9DT1VOVCBNRE1BMV9TMV9DVVJSX1lfQ09VTlQKKyNkZWZpbmUgTURNQV9TMV9DT05GSUcgMHhGRkMwMEZDOAkvKk1lbURNQTIgU3RyZWFtIDEgU291cmNlIENvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgKi8KKyNkZWZpbmUgTURNQV9TMV9ORVhUX0RFU0NfUFRSIDB4RkZDMDBGQzAJLypNZW1ETUEyIFN0cmVhbSAxIFNvdXJjZSBOZXh0IERlc2NyaXB0b3IgUHRyIFJlZyAqLworI2RlZmluZSBNRE1BX1MxX1NUQVJUX0FERFIgMHhGRkMwMEZDNAkvKk1lbURNQTIgU3RyZWFtIDEgU291cmNlIFN0YXJ0IEFkZHJlc3MgKi8KKyNkZWZpbmUgTURNQV9TMV9YX0NPVU5UIDB4RkZDMDBGRDAJLypNZW1ETUEyIFN0cmVhbSAxIFNvdXJjZSBJbm5lci1Mb29wIENvdW50IHJlZ2lzdGVyICovCisjZGVmaW5lIE1ETUFfUzFfWV9DT1VOVCAweEZGQzAwRkQ4CS8qTWVtRE1BMiBTdHJlYW0gMSBTb3VyY2UgT3V0ZXItTG9vcCBDb3VudCByZWdpc3RlciAqLworI2RlZmluZSBNRE1BX1MxX1hfTU9ESUZZIDB4RkZDMDBGRDQJLypNZW1ETUEyIFN0cmVhbSAxIFNyYyBJbm5lci1Mb29wIEFkZHJlc3MtSW5jcmVtZW50ICovCisjZGVmaW5lIE1ETUFfUzFfWV9NT0RJRlkgMHhGRkMwMEZEQwkvKk1lbURNQTIgU3RyZWFtIDEgU291cmNlIE91dGVyLUxvb3AgQWRkcmVzcy1JbmNyZW1lbnQgKi8KKyNkZWZpbmUgTURNQV9TMV9DVVJSX0RFU0NfUFRSIDB4RkZDMDBGRTAJLypNZW1ETUEyIFN0cmVhbSAxIFNvdXJjZSBDdXJyZW50IERlc2NyaXB0b3IgUHRyIHJlZyAqLworI2RlZmluZSBNRE1BX1MxX0NVUlJfQUREUiAweEZGQzAwRkU0CS8qTWVtRE1BMiBTdHJlYW0gMSBTb3VyY2UgQ3VycmVudCBBZGRyZXNzICovCisjZGVmaW5lIE1ETUFfUzFfQ1VSUl9YX0NPVU5UIDB4RkZDMDBGRjAJLypNZW1ETUEyIFN0cmVhbSAxIFNvdXJjZSBDdXJyZW50IElubmVyLUxvb3AgQ291bnQgKi8KKyNkZWZpbmUgTURNQV9TMV9DVVJSX1lfQ09VTlQgMHhGRkMwMEZGOAkvKk1lbURNQTIgU3RyZWFtIDEgU291cmNlIEN1cnJlbnQgT3V0ZXItTG9vcCBDb3VudCAqLworI2RlZmluZSBNRE1BX1MxX0lSUV9TVEFUVVMgMHhGRkMwMEZFOAkvKk1lbURNQTIgU3RyZWFtIDEgU291cmNlIEludGVycnVwdC9TdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgTURNQV9TMV9QRVJJUEhFUkFMX01BUCAweEZGQzAwRkVDCS8qTWVtRE1BMiBTdHJlYW0gMSBTb3VyY2UgUGVyaXBoZXJhbCBNYXAgcmVnaXN0ZXIgKi8KIAogLyogSW50ZXJuYWwgTWVtb3J5IERNQSBSZWdpc3RlcnMgKDB4RkZDMF8xODAwIC0gMHhGRkMwXzE5RkYpICovCiAjZGVmaW5lIElNRE1BX0QwX0NPTkZJRyAweEZGQzAxODA4CS8qSU1ETUEgU3RyZWFtIDAgRGVzdGluYXRpb24gQ29uZmlndXJhdGlvbiAqLwpAQCAtOTI3LDgzICs4NjQsNiBAQAogI2RlZmluZSBJV1JfRU5BQkxFKHgpCSAgICAgICAoMSA8PCAoeCkpCS8qIFdha2V1cCBFbmFibGUgUGVyaXBoZXJhbCAjeCAqLwogI2RlZmluZSBJV1JfRElTQUJMRSh4KSAoMHhGRkZGRkZGRiBeICgxIDw8ICh4KSkpCS8qIFdha2V1cCBEaXNhYmxlIFBlcmlwaGVyYWwgI3ggKi8KIAotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogVUFSVCBDT05UUk9MTEVSIE1BU0tTICoqKioqKioqKioqKioqKioqKioqKiogKi8KLQotLyogVUFSVF9MQ1IgUmVnaXN0ZXIgKi8KLQotI2RlZmluZSBETEFCCTB4ODAKLSNkZWZpbmUgU0IgICAgICAweDQwCi0jZGVmaW5lIFNUUCAgICAgIDB4MjAKLSNkZWZpbmUgRVBTICAgICAweDEwCi0jZGVmaW5lIFBFTgkweDA4Ci0jZGVmaW5lIFNUQgkweDA0Ci0jZGVmaW5lIFdMUyh4KQkoKHgtNSkgJiAweDAzKQotCi0jZGVmaW5lIERMQUJfUAkweDA3Ci0jZGVmaW5lIFNCX1AJMHgwNgotI2RlZmluZSBTVFBfUAkweDA1Ci0jZGVmaW5lIEVQU19QCTB4MDQKLSNkZWZpbmUgUEVOX1AJMHgwMwotI2RlZmluZSBTVEJfUAkweDAyCi0jZGVmaW5lIFdMU19QMQkweDAxCi0jZGVmaW5lIFdMU19QMAkweDAwCi0KLS8qIFVBUlRfTUNSIFJlZ2lzdGVyICovCi0jZGVmaW5lIExPT1BfRU5BCTB4MTAKLSNkZWZpbmUgTE9PUF9FTkFfUAkweDA0Ci0KLS8qIFVBUlRfTFNSIFJlZ2lzdGVyICovCi0jZGVmaW5lIFRFTVQJMHg0MAotI2RlZmluZSBUSFJFCTB4MjAKLSNkZWZpbmUgQkkJMHgxMAotI2RlZmluZSBGRQkweDA4Ci0jZGVmaW5lIFBFCTB4MDQKLSNkZWZpbmUgT0UJMHgwMgotI2RlZmluZSBEUgkweDAxCi0KLSNkZWZpbmUgVEVNUF9QCTB4MDYKLSNkZWZpbmUgVEhSRV9QCTB4MDUKLSNkZWZpbmUgQklfUAkweDA0Ci0jZGVmaW5lIEZFX1AJMHgwMwotI2RlZmluZSBQRV9QCTB4MDIKLSNkZWZpbmUgT0VfUAkweDAxCi0jZGVmaW5lIERSX1AJMHgwMAotCi0vKiBVQVJUX0lFUiBSZWdpc3RlciAqLwotI2RlZmluZSBFTFNJCTB4MDQKLSNkZWZpbmUgRVRCRUkJMHgwMgotI2RlZmluZSBFUkJGSQkweDAxCi0KLSNkZWZpbmUgRUxTSV9QCTB4MDIKLSNkZWZpbmUgRVRCRUlfUAkweDAxCi0jZGVmaW5lIEVSQkZJX1AJMHgwMAotCi0vKiBVQVJUX0lJUiBSZWdpc3RlciAqLwotI2RlZmluZSBTVEFUVVMoeCkJKCh4IDw8IDEpICYgMHgwNikKLSNkZWZpbmUgTklOVAkJMHgwMQotI2RlZmluZSBTVEFUVVNfUDEJMHgwMgotI2RlZmluZSBTVEFUVVNfUDAJMHgwMQotI2RlZmluZSBOSU5UX1AJCTB4MDAKLSNkZWZpbmUgSUlSX1RYX1JFQURZICAgIDB4MDIJLyogVUFSVF9USFIgZW1wdHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgSUlSX1JYX1JFQURZICAgIDB4MDQJLyogUmVjZWl2ZSBkYXRhIHJlYWR5ICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgSUlSX0xJTkVfQ0hBTkdFIDB4MDYJLyogUmVjZWl2ZSBsaW5lIHN0YXR1cyAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgSUlSX1NUQVRVUwkweDA2Ci0KLS8qIFVBUlRfR0NUTCBSZWdpc3RlciAqLwotI2RlZmluZSBGRkUJMHgyMAotI2RlZmluZSBGUEUJMHgxMAotI2RlZmluZSBSUE9MQwkweDA4Ci0jZGVmaW5lIFRQT0xDCTB4MDQKLSNkZWZpbmUgSVJFTgkweDAyCi0jZGVmaW5lIFVDRU4JMHgwMQotCi0jZGVmaW5lIEZGRV9QCTB4MDUKLSNkZWZpbmUgRlBFX1AJMHgwNAotI2RlZmluZSBSUE9MQ19QCTB4MDMKLSNkZWZpbmUgVFBPTENfUAkweDAyCi0jZGVmaW5lIElSRU5fUAkweDAxCi0jZGVmaW5lIFVDRU5fUAkweDAwCi0KIC8qICAqKioqKioqKiogIFBBUkFMTEVMIFBFUklQSEVSQUwgSU5URVJGQUNFIChQUEkpIE1BU0tTICoqKioqKioqKioqKioqKiogICAqLwogCiAvKiAgUFBJX0NPTlRST0wgTWFza3MgICAgICAgICAqLwpAQCAtMTIzMCw0NCArMTA5MCw2IEBACiAjZGVmaW5lIEVSUl9UWVBfUDAJCTB4MEUKICNkZWZpbmUgRVJSX1RZUF9QMQkJMHgwRgogCi0vKi8gKioqKioqKioqKioqKioqKioqICAgUFJPR1JBTU1BQkxFIEZMQUcgTUFTS1MgICoqKioqKioqKioqKioqKioqKioqKiAqLwotCi0vKiAgR2VuZXJhbCBQdXJwb3NlIElPICgweEZGQzAwNzAwIC0gMHhGRkMwMDdGRikgIE1hc2tzICovCi0jZGVmaW5lIFBGMCAgICAgICAgIDB4MDAwMQotI2RlZmluZSBQRjEgICAgICAgICAweDAwMDIKLSNkZWZpbmUgUEYyICAgICAgICAgMHgwMDA0Ci0jZGVmaW5lIFBGMyAgICAgICAgIDB4MDAwOAotI2RlZmluZSBQRjQgICAgICAgICAweDAwMTAKLSNkZWZpbmUgUEY1ICAgICAgICAgMHgwMDIwCi0jZGVmaW5lIFBGNiAgICAgICAgIDB4MDA0MAotI2RlZmluZSBQRjcgICAgICAgICAweDAwODAKLSNkZWZpbmUgUEY4ICAgICAgICAgMHgwMTAwCi0jZGVmaW5lIFBGOSAgICAgICAgIDB4MDIwMAotI2RlZmluZSBQRjEwICAgICAgICAweDA0MDAKLSNkZWZpbmUgUEYxMSAgICAgICAgMHgwODAwCi0jZGVmaW5lIFBGMTIgICAgICAgIDB4MTAwMAotI2RlZmluZSBQRjEzICAgICAgICAweDIwMDAKLSNkZWZpbmUgUEYxNCAgICAgICAgMHg0MDAwCi0jZGVmaW5lIFBGMTUgICAgICAgIDB4ODAwMAotCi0vKiAgR2VuZXJhbCBQdXJwb3NlIElPICgweEZGQzAwNzAwIC0gMHhGRkMwMDdGRikgIEJJVCBQT1NJVElPTlMgKi8KLSNkZWZpbmUgUEYwX1AgICAgICAgICAwCi0jZGVmaW5lIFBGMV9QICAgICAgICAgMQotI2RlZmluZSBQRjJfUCAgICAgICAgIDIKLSNkZWZpbmUgUEYzX1AgICAgICAgICAzCi0jZGVmaW5lIFBGNF9QICAgICAgICAgNAotI2RlZmluZSBQRjVfUCAgICAgICAgIDUKLSNkZWZpbmUgUEY2X1AgICAgICAgICA2Ci0jZGVmaW5lIFBGN19QICAgICAgICAgNwotI2RlZmluZSBQRjhfUCAgICAgICAgIDgKLSNkZWZpbmUgUEY5X1AgICAgICAgICA5Ci0jZGVmaW5lIFBGMTBfUCAgICAgICAgMTAKLSNkZWZpbmUgUEYxMV9QICAgICAgICAxMQotI2RlZmluZSBQRjEyX1AgICAgICAgIDEyCi0jZGVmaW5lIFBGMTNfUCAgICAgICAgMTMKLSNkZWZpbmUgUEYxNF9QICAgICAgICAxNAotI2RlZmluZSBQRjE1X1AgICAgICAgIDE1Ci0KIC8qICoqKioqKioqKioqKioqKioqKioqKiAgQVNZTkNIUk9OT1VTIE1FTU9SWSBDT05UUk9MTEVSIE1BU0tTICAqKioqKioqKioqKioqICovCiAKIC8qIEFNR0NUTCBNYXNrcyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2luY2x1ZGUvbWFjaC9ncGlvLmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvaW5jbHVkZS9tYWNoL2dwaW8uaAppbmRleCA0ZjhhYTVkLi41N2Q1ZWFiIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvaW5jbHVkZS9tYWNoL2dwaW8uaAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvaW5jbHVkZS9tYWNoL2dwaW8uaApAQCAtNjIsNCArNjIsNiBAQAogI2RlZmluZSBQT1JUX0ZJTzEgR1BJT18xNgogI2RlZmluZSBQT1JUX0ZJTzIgR1BJT18zMgogCisjaW5jbHVkZSA8bWFjaC1jb21tb24vcG9ydHMtZi5oPgorCiAjZW5kaWYgLyogX01BQ0hfR1BJT19IXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2luY2x1ZGUvbWFjaC9tZW1fbWFwLmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvaW5jbHVkZS9tYWNoL21lbV9tYXAuaAppbmRleCA1Yjk2ZWE1Li40Y2M5MTk5IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvaW5jbHVkZS9tYWNoL21lbV9tYXAuaAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvaW5jbHVkZS9tYWNoL21lbV9tYXAuaApAQCAtMTA2LDcgKzEwNiw3IEBACiAjZGVmaW5lIENPUkVBX0wxX1NDUkFUQ0hfU1RBUlQJMHhGRkIwMDAwMAogI2RlZmluZSBDT1JFQl9MMV9TQ1JBVENIX1NUQVJUCTB4RkY3MDAwMDAKIAotI2lmZGVmIF9fQVNTRU1CTFlfXworI2lmZGVmIENPTkZJR19TTVAKIAogLyoKICAqIFRoZSBmb2xsb3dpbmcgbWFjcm9zIGJvdGggcmV0dXJuIHRoZSBhZGRyZXNzIG9mIHRoZSBQREEgZm9yIHRoZQpAQCAtMTIxLDggKzEyMSw3IEBACiAgKiBpcyBhbGxvd2VkIHRvIHVzZSB0aGUgc3BlY2lmaWVkIERyZWcgZm9yIGRldGVybWluaW5nIHRoZSBQREEKICAqIGFkZHJlc3MgdG8gYmUgcmV0dXJuZWQgaW50byBQcmVnLgogICovCi0jaWZkZWYgQ09ORklHX1NNUAotI2RlZmluZSBHRVRfUERBX1NBRkUocHJlZykJCVwKKyMgZGVmaW5lIEdFVF9QREFfU0FGRShwcmVnKQkJXAogCXByZWcubCA9IGxvKERTUElEKTsJCVwKIAlwcmVnLmggPSBoaShEU1BJRCk7CQlcCiAJcHJlZyA9IFtwcmVnXTsJCQlcCkBAIC0xNTgsNyArMTU3LDcgQEAKIAlwcmVnID0gW3ByZWddOwkJCVwKIDQ6CiAKLSNkZWZpbmUgR0VUX1BEQShwcmVnLCBkcmVnKQkJXAorIyBkZWZpbmUgR0VUX1BEQShwcmVnLCBkcmVnKQkJXAogCXByZWcubCA9IGxvKERTUElEKTsJCVwKIAlwcmVnLmggPSBoaShEU1BJRCk7CQlcCiAJZHJlZyA9IFtwcmVnXTsJCQlcCkBAIC0xNjksMTMgKzE2OCwxNyBAQAogCXByZWcgPSBbcHJlZ107CQkJXAogMToJCQkJCVwKIAotI2RlZmluZSBHRVRfQ1BVSUQocHJlZywgZHJlZykJCVwKKyMgZGVmaW5lIEdFVF9DUFVJRChwcmVnLCBkcmVnKQkJXAogCXByZWcubCA9IGxvKERTUElEKTsJCVwKIAlwcmVnLmggPSBoaShEU1BJRCk7CQlcCiAJZHJlZyA9IFtwcmVnXTsJCQlcCiAJZHJlZyA9IFJPVCBkcmVnIEJZIC0xOwkJXAogCWRyZWcgPSBDQzsKIAorIyBpZm5kZWYgX19BU1NFTUJMWV9fCisKKyMgIGluY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKwogc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGdldF9sMV9zY3JhdGNoX3N0YXJ0X2NwdShpbnQgY3B1KQogewogCXJldHVybiBjcHUgPyBDT1JFQl9MMV9TQ1JBVENIX1NUQVJUIDogQ09SRUFfTDFfU0NSQVRDSF9TVEFSVDsKQEAgLTIxMCw4ICsyMTMsNyBAQAogCXJldHVybiBnZXRfbDFfZGF0YV9iX3N0YXJ0X2NwdShibGFja2Zpbl9jb3JlX2lkKCkpOwogfQogCisjIGVuZGlmIC8qIF9fQVNTRU1CTFlfXyAqLwogI2VuZGlmIC8qIENPTkZJR19TTVAgKi8KIAotI2VuZGlmIC8qIF9fQVNTRU1CTFlfXyAqLwotCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9pbmNsdWRlL21hY2gvcGxsLmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvaW5jbHVkZS9tYWNoL3BsbC5oCmluZGV4IGYyYjFmYmQuLjc5NzdkYjIgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9pbmNsdWRlL21hY2gvcGxsLmgKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2luY2x1ZGUvbWFjaC9wbGwuaApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNS0yMDA5IEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqIENvcHlyaWdodCAyMDA1LTIwMTAgQW5hbG9nIERldmljZXMgSW5jLgogICoKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KICAqLwpAQCAtNyw1NyArNyw0OCBAQAogI2lmbmRlZiBfTUFDSF9QTExfSAogI2RlZmluZSBfTUFDSF9QTExfSAogCisjaWZuZGVmIF9fQVNTRU1CTFlfXworCisjaWZkZWYgQ09ORklHX1NNUAorCiAjaW5jbHVkZSA8YXNtL2JsYWNrZmluLmg+CiAjaW5jbHVkZSA8YXNtL2lycWZsYWdzLmg+CisjaW5jbHVkZSA8bWFjaC9pcnEuaD4KIAotLyogV3JpdGluZyB0byBQTExfQ1RMIGluaXRpYXRlcyBhIFBMTCByZWxvY2sgc2VxdWVuY2UuICovCi1zdGF0aWMgX19pbmxpbmVfXyB2b2lkIGJmaW5fd3JpdGVfUExMX0NUTCh1bnNpZ25lZCBpbnQgdmFsKQorI2RlZmluZSBTVVBQTEVfMF9XQUtFVVAgKChJUlFfU1VQUExFXzAgLSAoSVJRX0NPUkVUTVIgKyAxKSkgJSAzMikKKworc3RhdGljIGlubGluZSB2b2lkCitiZmluX2l3cl9yZXN0b3JlKHVuc2lnbmVkIGxvbmcgaXdyMCwgdW5zaWduZWQgbG9uZyBpd3IxLCB1bnNpZ25lZCBsb25nIGl3cjIpCiB7Ci0JdW5zaWduZWQgbG9uZyBmbGFncywgaXdyMCwgaXdyMTsKKwl1bnNpZ25lZCBsb25nIFNJQ0FfU0lDQl9PRkYgPSAoKGJmaW5fcmVhZF9EU1BJRCgpICYgMHhmZikgPyAweDEwMDAgOiAwKTsKIAotCWlmICh2YWwgPT0gYmZpbl9yZWFkX1BMTF9DVEwoKSkKLQkJcmV0dXJuOworCWJmaW5fd3JpdGUzMihTSUNfSVdSMCArIFNJQ0FfU0lDQl9PRkYsIGl3cjApOworCWJmaW5fd3JpdGUzMihTSUNfSVdSMSArIFNJQ0FfU0lDQl9PRkYsIGl3cjEpOworfQorI2RlZmluZSBiZmluX2l3cl9yZXN0b3JlIGJmaW5faXdyX3Jlc3RvcmUKIAotCWZsYWdzID0gaGFyZF9sb2NhbF9pcnFfc2F2ZSgpOwotCS8qIEVuYWJsZSB0aGUgUExMIFdha2V1cCBiaXQgaW4gU0lDIElXUiAqLwotCWl3cjAgPSBiZmluX3JlYWQzMihTSUNBX0lXUjApOwotCWl3cjEgPSBiZmluX3JlYWQzMihTSUNBX0lXUjEpOwotCS8qIE9ubHkgYWxsb3cgUFBMIFdha2V1cCkgKi8KLQliZmluX3dyaXRlMzIoU0lDQV9JV1IwLCBJV1JfRU5BQkxFKDApKTsKLQliZmluX3dyaXRlMzIoU0lDQV9JV1IxLCAwKTsKK3N0YXRpYyBpbmxpbmUgdm9pZAorYmZpbl9pd3Jfc2F2ZSh1bnNpZ25lZCBsb25nIG5pd3IwLCB1bnNpZ25lZCBsb25nIG5pd3IxLCB1bnNpZ25lZCBsb25nIG5pd3IyLAorICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nICppd3IwLCB1bnNpZ25lZCBsb25nICppd3IxLCB1bnNpZ25lZCBsb25nICppd3IyKQoreworCXVuc2lnbmVkIGxvbmcgU0lDQV9TSUNCX09GRiA9ICgoYmZpbl9yZWFkX0RTUElEKCkgJiAweGZmKSA/IDB4MTAwMCA6IDApOwogCi0JYmZpbl93cml0ZTE2KFBMTF9DVEwsIHZhbCk7Ci0JU1NZTkMoKTsKLQlhc20oIklETEU7Iik7CisJKml3cjAgPSBiZmluX3JlYWQzMihTSUNfSVdSMCArIFNJQ0FfU0lDQl9PRkYpOworCSppd3IxID0gYmZpbl9yZWFkMzIoU0lDX0lXUjEgKyBTSUNBX1NJQ0JfT0ZGKTsKKwliZmluX2l3cl9yZXN0b3JlKG5pd3IwLCBuaXdyMSwgbml3cjIpOworfQorI2RlZmluZSBiZmluX2l3cl9zYXZlIGJmaW5faXdyX3NhdmUKIAotCWJmaW5fd3JpdGUzMihTSUNBX0lXUjAsIGl3cjApOwotCWJmaW5fd3JpdGUzMihTSUNBX0lXUjEsIGl3cjEpOwotCWhhcmRfbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworc3RhdGljIGlubGluZSB2b2lkCitiZmluX2l3cl9zZXRfc3VwMCh1bnNpZ25lZCBsb25nICppd3IwLCB1bnNpZ25lZCBsb25nICppd3IxLCB1bnNpZ25lZCBsb25nICppd3IyKQoreworCWJmaW5faXdyX3NhdmUoMCwgSVdSX0VOQUJMRShTVVBQTEVfMF9XQUtFVVApLCAwLCBpd3IwLCBpd3IxLCBpd3IyKTsKIH0KIAotLyogV3JpdGluZyB0byBWUl9DVEwgaW5pdGlhdGVzIGEgUExMIHJlbG9jayBzZXF1ZW5jZS4gKi8KLXN0YXRpYyBfX2lubGluZV9fIHZvaWQgYmZpbl93cml0ZV9WUl9DVEwodW5zaWduZWQgaW50IHZhbCkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzLCBpd3IwLCBpd3IxOworI2VuZGlmCiAKLQlpZiAodmFsID09IGJmaW5fcmVhZF9WUl9DVEwoKSkKLQkJcmV0dXJuOworI2VuZGlmCiAKLQlmbGFncyA9IGhhcmRfbG9jYWxfaXJxX3NhdmUoKTsKLQkvKiBFbmFibGUgdGhlIFBMTCBXYWtldXAgYml0IGluIFNJQyBJV1IgKi8KLQlpd3IwID0gYmZpbl9yZWFkMzIoU0lDQV9JV1IwKTsKLQlpd3IxID0gYmZpbl9yZWFkMzIoU0lDQV9JV1IxKTsKLQkvKiBPbmx5IGFsbG93IFBQTCBXYWtldXApICovCi0JYmZpbl93cml0ZTMyKFNJQ0FfSVdSMCwgSVdSX0VOQUJMRSgwKSk7Ci0JYmZpbl93cml0ZTMyKFNJQ0FfSVdSMSwgMCk7CisjaW5jbHVkZSA8bWFjaC1jb21tb24vcGxsLmg+CiAKLQliZmluX3dyaXRlMTYoVlJfQ1RMLCB2YWwpOwotCVNTWU5DKCk7Ci0JYXNtKCJJRExFOyIpOwotCi0JYmZpbl93cml0ZTMyKFNJQ0FfSVdSMCwgaXdyMCk7Ci0JYmZpbl93cml0ZTMyKFNJQ0FfSVdSMSwgaXdyMSk7Ci0JaGFyZF9sb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci19Ci0KLSNlbmRpZiAvKiBfTUFDSF9QTExfSCAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvaW5jbHVkZS9tYWNoL3NtcC5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2luY2x1ZGUvbWFjaC9zbXAuaAppbmRleCAyYzhjNTE0Li4zNDZjNjA1IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvaW5jbHVkZS9tYWNoL3NtcC5oCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9pbmNsdWRlL21hY2gvc21wLmgKQEAgLTcsNiArNyw4IEBACiAjaWZuZGVmIF9NQUNIX0JGNTYxX1NNUAogI2RlZmluZSBfTUFDSF9CRjU2MV9TTVAKIAorLyogVGhpcyBoZWFkZXIgaGFzIHRvIHN0YW5kIGFsb25lIHRvIGF2b2lkIGNpcmN1bGFyIGRlcHMgKi8KKwogc3RydWN0IHRhc2tfc3RydWN0OwogCiB2b2lkIHBsYXRmb3JtX2luaXRfY3B1cyh2b2lkKTsKQEAgLTE3LDEzICsxOSwxMyBAQAogCiB2b2lkIHBsYXRmb3JtX3NlY29uZGFyeV9pbml0KHVuc2lnbmVkIGludCBjcHUpOwogCi12b2lkIHBsYXRmb3JtX3JlcXVlc3RfaXBpKGludCAoKmhhbmRsZXIpKGludCwgdm9pZCAqKSk7Cit2b2lkIHBsYXRmb3JtX3JlcXVlc3RfaXBpKGludCBpcnEsIC8qaXJxX2hhbmRsZXJfdCovIHZvaWQgKmhhbmRsZXIpOwogCi12b2lkIHBsYXRmb3JtX3NlbmRfaXBpKGNwdW1hc2tfdCBjYWxsbWFwKTsKK3ZvaWQgcGxhdGZvcm1fc2VuZF9pcGkoY3B1bWFza190IGNhbGxtYXAsIGludCBpcnEpOwogCi12b2lkIHBsYXRmb3JtX3NlbmRfaXBpX2NwdSh1bnNpZ25lZCBpbnQgY3B1KTsKK3ZvaWQgcGxhdGZvcm1fc2VuZF9pcGlfY3B1KHVuc2lnbmVkIGludCBjcHUsIGludCBpcnEpOwogCi12b2lkIHBsYXRmb3JtX2NsZWFyX2lwaSh1bnNpZ25lZCBpbnQgY3B1KTsKK3ZvaWQgcGxhdGZvcm1fY2xlYXJfaXBpKHVuc2lnbmVkIGludCBjcHUsIGludCBpcnEpOwogCiB2b2lkIGJmaW5fbG9jYWxfdGltZXJfc2V0dXAodm9pZCk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9zbXAuYyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9zbXAuYwppbmRleCBmNTQwZWQxLi4xMDc0YTdlIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvc21wLmMKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL3NtcC5jCkBAIC04NiwxMiArODYsMTIgQEAKIAogCXNwaW5fbG9jaygmYm9vdF9sb2NrKTsKIAotCWlmICgoYmZpbl9yZWFkX1NJQ19TWVNDUigpICYgQ09SRUJfU1JBTV9JTklUKSA9PSAwKSB7CisJaWYgKChiZmluX3JlYWRfU1lTQ1IoKSAmIENPUkVCX1NSQU1fSU5JVCkgPT0gMCkgewogCQkvKiBDb3JlQiBhbHJlYWR5IHJ1bm5pbmcsIHNlbmRpbmcgaXBpIHRvIHdha2V1cCBpdCAqLwogCQlwbGF0Zm9ybV9zZW5kX2lwaV9jcHUoY3B1LCBJUlFfU1VQUExFXzApOwogCX0gZWxzZSB7CiAJCS8qIEtpY2sgQ29yZUIsIHdoaWNoIHNob3VsZCBzdGFydCBleGVjdXRpb24gZnJvbSBDT1JFX1NSQU1fQkFTRS4gKi8KLQkJYmZpbl93cml0ZV9TSUNfU1lTQ1IoYmZpbl9yZWFkX1NJQ19TWVNDUigpICYgfkNPUkVCX1NSQU1fSU5JVCk7CisJCWJmaW5fd3JpdGVfU1lTQ1IoYmZpbl9yZWFkX1NZU0NSKCkgJiB+Q09SRUJfU1JBTV9JTklUKTsKIAkJU1NZTkMoKTsKIAl9CiAKQEAgLTExMSw0MSArMTExLDQ2IEBACiAJCXBhbmljKCJDUFUldTogcHJvY2Vzc29yIGZhaWxlZCB0byBib290XG4iLCBjcHUpOwogfQogCi12b2lkIF9faW5pdCBwbGF0Zm9ybV9yZXF1ZXN0X2lwaShpcnFfaGFuZGxlcl90IGhhbmRsZXIpCitzdGF0aWMgY29uc3QgY2hhciBzdXBwbGUwW10gPSAiSVJRX1NVUFBMRV8wIjsKK3N0YXRpYyBjb25zdCBjaGFyIHN1cHBsZTFbXSA9ICJJUlFfU1VQUExFXzEiOwordm9pZCBfX2luaXQgcGxhdGZvcm1fcmVxdWVzdF9pcGkoaW50IGlycSwgdm9pZCAqaGFuZGxlcikKIHsKIAlpbnQgcmV0OworCWNvbnN0IGNoYXIgKm5hbWUgPSAoaXJxID09IElSUV9TVVBQTEVfMCkgPyBzdXBwbGUwIDogc3VwcGxlMTsKIAotCXJldCA9IHJlcXVlc3RfaXJxKElSUV9TVVBQTEVfMCwgaGFuZGxlciwgSVJRRl9ESVNBQkxFRCwKLQkJCSAgIlN1cHBsZW1lbnRhbCBJbnRlcnJ1cHQwIiwgaGFuZGxlcik7CisJcmV0ID0gcmVxdWVzdF9pcnEoaXJxLCBoYW5kbGVyLCBJUlFGX0RJU0FCTEVEIHwgSVJRRl9QRVJDUFUsIG5hbWUsIGhhbmRsZXIpOwogCWlmIChyZXQpCi0JCXBhbmljKCJDYW5ub3QgcmVxdWVzdCBzdXBwbGVtZW50YWwgaW50ZXJydXB0IDAgZm9yIElQSSBzZXJ2aWNlIik7CisJCXBhbmljKCJDYW5ub3QgcmVxdWVzdCAlcyBmb3IgSVBJIHNlcnZpY2UiLCBuYW1lKTsKIH0KIAotdm9pZCBwbGF0Zm9ybV9zZW5kX2lwaShjcHVtYXNrX3QgY2FsbG1hcCkKK3ZvaWQgcGxhdGZvcm1fc2VuZF9pcGkoY3B1bWFza190IGNhbGxtYXAsIGludCBpcnEpCiB7CiAJdW5zaWduZWQgaW50IGNwdTsKKwlpbnQgb2Zmc2V0ID0gKGlycSA9PSBJUlFfU1VQUExFXzApID8gNiA6IDg7CiAKIAlmb3JfZWFjaF9jcHVfbWFzayhjcHUsIGNhbGxtYXApIHsKIAkJQlVHX09OKGNwdSA+PSAyKTsKIAkJU1NZTkMoKTsKLQkJYmZpbl93cml0ZV9TSUNCX1NZU0NSKGJmaW5fcmVhZF9TSUNCX1NZU0NSKCkgfCAoMSA8PCAoNiArIGNwdSkpKTsKKwkJYmZpbl93cml0ZV9TSUNCX1NZU0NSKGJmaW5fcmVhZF9TSUNCX1NZU0NSKCkgfCAoMSA8PCAob2Zmc2V0ICsgY3B1KSkpOwogCQlTU1lOQygpOwogCX0KIH0KIAotdm9pZCBwbGF0Zm9ybV9zZW5kX2lwaV9jcHUodW5zaWduZWQgaW50IGNwdSkKK3ZvaWQgcGxhdGZvcm1fc2VuZF9pcGlfY3B1KHVuc2lnbmVkIGludCBjcHUsIGludCBpcnEpCiB7CisJaW50IG9mZnNldCA9IChpcnEgPT0gSVJRX1NVUFBMRV8wKSA/IDYgOiA4OwogCUJVR19PTihjcHUgPj0gMik7CiAJU1NZTkMoKTsKLQliZmluX3dyaXRlX1NJQ0JfU1lTQ1IoYmZpbl9yZWFkX1NJQ0JfU1lTQ1IoKSB8ICgxIDw8ICg2ICsgY3B1KSkpOworCWJmaW5fd3JpdGVfU0lDQl9TWVNDUihiZmluX3JlYWRfU0lDQl9TWVNDUigpIHwgKDEgPDwgKG9mZnNldCArIGNwdSkpKTsKIAlTU1lOQygpOwogfQogCi12b2lkIHBsYXRmb3JtX2NsZWFyX2lwaSh1bnNpZ25lZCBpbnQgY3B1KQordm9pZCBwbGF0Zm9ybV9jbGVhcl9pcGkodW5zaWduZWQgaW50IGNwdSwgaW50IGlycSkKIHsKKwlpbnQgb2Zmc2V0ID0gKGlycSA9PSBJUlFfU1VQUExFXzApID8gMTAgOiAxMjsKIAlCVUdfT04oY3B1ID49IDIpOwogCVNTWU5DKCk7Ci0JYmZpbl93cml0ZV9TSUNCX1NZU0NSKGJmaW5fcmVhZF9TSUNCX1NZU0NSKCkgfCAoMSA8PCAoMTAgKyBjcHUpKSk7CisJYmZpbl93cml0ZV9TSUNCX1NZU0NSKGJmaW5fcmVhZF9TSUNCX1NZU0NSKCkgfCAoMSA8PCAob2Zmc2V0ICsgY3B1KSkpOwogCVNTWU5DKCk7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1jb21tb24vZW50cnkuUyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1jb21tb24vZW50cnkuUwppbmRleCAyY2E5MTVlLi5iYzA4Yzk4IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtY29tbW9uL2VudHJ5LlMKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWNvbW1vbi9lbnRyeS5TCkBAIC02MTUsNyArNjE1LDcgQEAKICNpZmRlZiBDT05GSUdfSVBJUEUKIAlyMCA9IHNwOwogCVNQICs9IC0xMjsKLQljYWxsIF9fX2lwaXBlX3N5c2NhbGxfcm9vdDsKKwlwc2V1ZG9fbG9uZ19jYWxsIF9fX2lwaXBlX3N5c2NhbGxfcm9vdCwgcDA7CiAJU1AgKz0gMTI7CiAJY2MgPSByMCA9PSAxOwogCWlmIGNjIGp1bXAgLkxzeXNjYWxsX3JlYWxseV9leGl0OwpAQCAtNjkyLDcgKzY5Miw3IEBACiAJWy0tc3BdID0gcmV0aTsKIAlTUCArPSA0OyAvKiBkb24ndCBtZXJnZSB3aXRoIG5leHQgaW5zbiB0byBrZWVwIHRoZSBwYXR0ZXJuIG9idmlvdXMgKi8KIAlTUCArPSAtMTI7Ci0JY2FsbCBfX19pcGlwZV9zeW5jX3Jvb3Q7CisJcHNldWRvX2xvbmdfY2FsbCBfX19pcGlwZV9zeW5jX3Jvb3QsIHA0OwogCVNQICs9IDEyOwogCWp1bXAgLkxyZXN1bWVfdXNlcnNwYWNlXzE7CiAuTHN5c2NhbGxfbm9faXJxc3luYzoKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1jb21tb24vaW50cy1wcmlvcml0eS5jIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWNvbW1vbi9pbnRzLXByaW9yaXR5LmMKaW5kZXggZGE3ZTNjNi4uYTYwNGYxOSAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWNvbW1vbi9pbnRzLXByaW9yaXR5LmMKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWNvbW1vbi9pbnRzLXByaW9yaXR5LmMKQEAgLTg2Niw3ICs4NjYsNiBAQAogCXUzMiBwaW50Yml0ID0gUElOVF9CSVQocGludF92YWwpOwogCXUzMiBiYW5rID0gUElOVF8yX0JBTksocGludF92YWwpOwogCi0JcGludFtiYW5rXS0+cmVxdWVzdCA9IHBpbnRiaXQ7CiAJcGludFtiYW5rXS0+bWFza19zZXQgPSBwaW50Yml0OwogfQogCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtY29tbW9uL3BtLmMgYi9hcmNoL2JsYWNrZmluL21hY2gtY29tbW9uL3BtLmMKaW5kZXggODA4ODRiMS4uNDJmYTg3ZSAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWNvbW1vbi9wbS5jCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1jb21tb24vcG0uYwpAQCAtMjMsOSArMjMsNiBAQAogCiB2b2lkIGJmaW5fcG1fc3VzcGVuZF9zdGFuZGJ5X2VudGVyKHZvaWQpCiB7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWZsYWdzID0gaGFyZF9sb2NhbF9pcnFfc2F2ZSgpOwogCWJmaW5fcG1fc3RhbmRieV9zZXR1cCgpOwogCiAjaWZkZWYgQ09ORklHX1BNX0JGSU5fU0xFRVBfREVFUEVSCkBAIC01NSw4ICs1Miw2IEBACiAjZWxzZQogCWJmaW5fd3JpdGVfU0lDX0lXUihJV1JfRElTQUJMRV9BTEwpOwogI2VuZGlmCi0KLQloYXJkX2xvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIH0KIAogaW50IGJmNTN4X3N1c3BlbmRfbDFfbWVtKHVuc2lnbmVkIGNoYXIgKm1lbXB0cikKQEAgLTEyNyw3ICsxMjIsNiBAQAogCiBpbnQgYmZpbl9wbV9zdXNwZW5kX21lbV9lbnRlcih2b2lkKQogewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IHdha2V1cCwgcmV0OwogCiAJdW5zaWduZWQgY2hhciAqbWVtcHRyID0ga21hbGxvYyhMMV9DT0RFX0xFTkdUSCArIEwxX0RBVEFfQV9MRU5HVEgKQEAgLTE0OSwxMiArMTQzLDkgQEAKIAl3YWtldXAgfD0gR1BXRTsKICNlbmRpZgogCi0JZmxhZ3MgPSBoYXJkX2xvY2FsX2lycV9zYXZlKCk7Ci0KIAlyZXQgPSBibGFja2Zpbl9kbWFfc3VzcGVuZCgpOwogCiAJaWYgKHJldCkgewotCQloYXJkX2xvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIAkJa2ZyZWUobWVtcHRyKTsKIAkJcmV0dXJuIHJldDsKIAl9CkBAIC0xNzgsNyArMTY5LDYgQEAKIAliZmluX2dwaW9fcG1faGliZXJuYXRlX3Jlc3RvcmUoKTsKIAlibGFja2Zpbl9kbWFfcmVzdW1lKCk7CiAKLQloYXJkX2xvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIAlrZnJlZShtZW1wdHIpOwogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtY29tbW9uL3NtcC5jIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWNvbW1vbi9zbXAuYwppbmRleCBhMTcxMDdhLi45ZjI1MTQwIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtY29tbW9uL3NtcC5jCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1jb21tb24vc21wLmMKQEAgLTE5LDYgKzE5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L2NwdS5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgorI2luY2x1ZGUgPGxpbnV4L2NwdW1hc2suaD4KICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KQEAgLTQzLDEyICs0NCw2IEBACiAJKmluaXRfc2F2ZWRfc2Vxc3RhdF9jb3JlYiwgKmluaXRfc2F2ZWRfaWNwbGJfZmF1bHRfYWRkcl9jb3JlYiwKIAkqaW5pdF9zYXZlZF9kY3BsYl9mYXVsdF9hZGRyX2NvcmViOwogCi1jcHVtYXNrX3QgY3B1X3Bvc3NpYmxlX21hcDsKLUVYUE9SVF9TWU1CT0woY3B1X3Bvc3NpYmxlX21hcCk7Ci0KLWNwdW1hc2tfdCBjcHVfb25saW5lX21hcDsKLUVYUE9SVF9TWU1CT0woY3B1X29ubGluZV9tYXApOwotCiAjZGVmaW5lIEJGSU5fSVBJX1JFU0NIRURVTEUgICAwCiAjZGVmaW5lIEJGSU5fSVBJX0NBTExfRlVOQyAgICAxCiAjZGVmaW5lIEJGSU5fSVBJX0NQVV9TVE9QICAgICAyCkBAIC02NSw4ICs2MCw3IEBACiAJdm9pZCAoKmZ1bmMpKHZvaWQgKmluZm8pOwogCXZvaWQgKmluZm87CiAJaW50IHdhaXQ7Ci0JY3B1bWFza190IHBlbmRpbmc7Ci0JY3B1bWFza190IHdhaXRtYXNrOworCWNwdW1hc2tfdCAqd2FpdG1hc2s7CiB9OwogCiBzdGF0aWMgc3RydWN0IGJsYWNrZmluX2ZsdXNoX2RhdGEgc21wX2ZsdXNoX2RhdGE7CkBAIC03NCwxNSArNjgsMTkgQEAKIHN0YXRpYyBERUZJTkVfU1BJTkxPQ0soc3RvcF9sb2NrKTsKIAogc3RydWN0IGlwaV9tZXNzYWdlIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CiAJdW5zaWduZWQgbG9uZyB0eXBlOwogCXN0cnVjdCBzbXBfY2FsbF9zdHJ1Y3QgY2FsbF9zdHJ1Y3Q7CiB9OwogCisvKiBBIG1hZ2ljIG51bWJlciAtIHN0cmVzcyB0ZXN0IHNob3dzIHRoaXMgaXMgc2FmZSBmb3IgY29tbW9uIGNhc2VzICovCisjZGVmaW5lIEJGSU5fSVBJX01TR1FfTEVOIDUKKworLyogU2ltcGxlIEZJRk8gYnVmZmVyLCBvdmVyZmxvdyBsZWFkcyB0byBwYW5pYyAqLwogc3RydWN0IGlwaV9tZXNzYWdlX3F1ZXVlIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGhlYWQ7CiAJc3BpbmxvY2tfdCBsb2NrOwogCXVuc2lnbmVkIGxvbmcgY291bnQ7CisJdW5zaWduZWQgbG9uZyBoZWFkOyAvKiBoZWFkIG9mIHRoZSBxdWV1ZSAqLworCXN0cnVjdCBpcGlfbWVzc2FnZSBpcGlfbWVzc2FnZVtCRklOX0lQSV9NU0dRX0xFTl07CiB9OwogCiBzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IGlwaV9tZXNzYWdlX3F1ZXVlLCBpcGlfbXNnX3F1ZXVlKTsKQEAgLTEyMSw3ICsxMTksNiBAQAogCWZ1bmMgPSBtc2ctPmNhbGxfc3RydWN0LmZ1bmM7CiAJaW5mbyA9IG1zZy0+Y2FsbF9zdHJ1Y3QuaW5mbzsKIAl3YWl0ID0gbXNnLT5jYWxsX3N0cnVjdC53YWl0OwotCWNwdV9jbGVhcihjcHUsIG1zZy0+Y2FsbF9zdHJ1Y3QucGVuZGluZyk7CiAJZnVuYyhpbmZvKTsKIAlpZiAod2FpdCkgewogI2lmZGVmIF9fQVJDSF9TWU5DX0NPUkVfRENBQ0hFCkBAIC0xMzIsNTEgKzEyOSw1NyBAQAogCQkgKi8KIAkJcmVzeW5jX2NvcmVfZGNhY2hlKCk7CiAjZW5kaWYKLQkJY3B1X2NsZWFyKGNwdSwgbXNnLT5jYWxsX3N0cnVjdC53YWl0bWFzayk7Ci0JfSBlbHNlCi0JCWtmcmVlKG1zZyk7CisJCWNwdV9jbGVhcihjcHUsICptc2ctPmNhbGxfc3RydWN0LndhaXRtYXNrKTsKKwl9CiB9CiAKLXN0YXRpYyBpcnFyZXR1cm5fdCBpcGlfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpkZXZfaW5zdGFuY2UpCisvKiBVc2UgSVJRX1NVUFBMRV8wIHRvIHJlcXVlc3QgcmVzY2hlZHVsZS4KKyAqIFdoZW4gcmV0dXJuaW5nIGZyb20gaW50ZXJydXB0IHRvIHVzZXIgc3BhY2UsCisgKiB0aGVyZSBpcyBjaGFuY2UgdG8gcmVzY2hlZHVsZSAqLworc3RhdGljIGlycXJldHVybl90IGlwaV9oYW5kbGVyX2ludDAoaW50IGlycSwgdm9pZCAqZGV2X2luc3RhbmNlKQoreworCXVuc2lnbmVkIGludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisKKwlwbGF0Zm9ybV9jbGVhcl9pcGkoY3B1LCBJUlFfU1VQUExFXzApOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGlycXJldHVybl90IGlwaV9oYW5kbGVyX2ludDEoaW50IGlycSwgdm9pZCAqZGV2X2luc3RhbmNlKQogewogCXN0cnVjdCBpcGlfbWVzc2FnZSAqbXNnOwogCXN0cnVjdCBpcGlfbWVzc2FnZV9xdWV1ZSAqbXNnX3F1ZXVlOwogCXVuc2lnbmVkIGludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCXBsYXRmb3JtX2NsZWFyX2lwaShjcHUpOworCXBsYXRmb3JtX2NsZWFyX2lwaShjcHUsIElSUV9TVVBQTEVfMSk7CiAKIAltc2dfcXVldWUgPSAmX19nZXRfY3B1X3ZhcihpcGlfbXNnX3F1ZXVlKTsKLQltc2dfcXVldWUtPmNvdW50Kys7CiAKLQlzcGluX2xvY2soJm1zZ19xdWV1ZS0+bG9jayk7Ci0Jd2hpbGUgKCFsaXN0X2VtcHR5KCZtc2dfcXVldWUtPmhlYWQpKSB7Ci0JCW1zZyA9IGxpc3RfZW50cnkobXNnX3F1ZXVlLT5oZWFkLm5leHQsIHR5cGVvZigqbXNnKSwgbGlzdCk7Ci0JCWxpc3RfZGVsKCZtc2ctPmxpc3QpOworCXNwaW5fbG9ja19pcnFzYXZlKCZtc2dfcXVldWUtPmxvY2ssIGZsYWdzKTsKKworCXdoaWxlIChtc2dfcXVldWUtPmNvdW50KSB7CisJCW1zZyA9ICZtc2dfcXVldWUtPmlwaV9tZXNzYWdlW21zZ19xdWV1ZS0+aGVhZF07CiAJCXN3aXRjaCAobXNnLT50eXBlKSB7Ci0JCWNhc2UgQkZJTl9JUElfUkVTQ0hFRFVMRToKLQkJCS8qIFRoYXQncyB0aGUgZWFzaWVzdCBvbmU7IGxlYXZlIGl0IHRvCi0JCQkgKiByZXR1cm5fZnJvbV9pbnQuICovCi0JCQlrZnJlZShtc2cpOwotCQkJYnJlYWs7CiAJCWNhc2UgQkZJTl9JUElfQ0FMTF9GVU5DOgotCQkJc3Bpbl91bmxvY2soJm1zZ19xdWV1ZS0+bG9jayk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtc2dfcXVldWUtPmxvY2ssIGZsYWdzKTsKIAkJCWlwaV9jYWxsX2Z1bmN0aW9uKGNwdSwgbXNnKTsKLQkJCXNwaW5fbG9jaygmbXNnX3F1ZXVlLT5sb2NrKTsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZtc2dfcXVldWUtPmxvY2ssIGZsYWdzKTsKIAkJCWJyZWFrOwogCQljYXNlIEJGSU5fSVBJX0NQVV9TVE9QOgotCQkJc3Bpbl91bmxvY2soJm1zZ19xdWV1ZS0+bG9jayk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtc2dfcXVldWUtPmxvY2ssIGZsYWdzKTsKIAkJCWlwaV9jcHVfc3RvcChjcHUpOwotCQkJc3Bpbl9sb2NrKCZtc2dfcXVldWUtPmxvY2spOwotCQkJa2ZyZWUobXNnKTsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZtc2dfcXVldWUtPmxvY2ssIGZsYWdzKTsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJcHJpbnRrKEtFUk5fQ1JJVCAiQ1BVJXU6IFVua25vd24gSVBJIG1lc3NhZ2UgMHglbHhcbiIsCiAJCQkgICAgICAgY3B1LCBtc2ctPnR5cGUpOwotCQkJa2ZyZWUobXNnKTsKIAkJCWJyZWFrOwogCQl9CisJCW1zZ19xdWV1ZS0+aGVhZCsrOworCQltc2dfcXVldWUtPmhlYWQgJT0gQkZJTl9JUElfTVNHUV9MRU47CisJCW1zZ19xdWV1ZS0+Y291bnQtLTsKIAl9Ci0Jc3Bpbl91bmxvY2soJm1zZ19xdWV1ZS0+bG9jayk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbXNnX3F1ZXVlLT5sb2NrLCBmbGFncyk7CiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCkBAIC0xODYsNDggKzE4OSw0NyBAQAogCXN0cnVjdCBpcGlfbWVzc2FnZV9xdWV1ZSAqbXNnX3F1ZXVlOwogCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShjcHUpIHsKIAkJbXNnX3F1ZXVlID0gJnBlcl9jcHUoaXBpX21zZ19xdWV1ZSwgY3B1KTsKLQkJSU5JVF9MSVNUX0hFQUQoJm1zZ19xdWV1ZS0+aGVhZCk7CiAJCXNwaW5fbG9ja19pbml0KCZtc2dfcXVldWUtPmxvY2spOwogCQltc2dfcXVldWUtPmNvdW50ID0gMDsKKwkJbXNnX3F1ZXVlLT5oZWFkID0gMDsKIAl9CiB9CiAKLWludCBzbXBfY2FsbF9mdW5jdGlvbih2b2lkICgqZnVuYykodm9pZCAqaW5mbyksIHZvaWQgKmluZm8sIGludCB3YWl0KQorc3RhdGljIGlubGluZSB2b2lkIHNtcF9zZW5kX21lc3NhZ2UoY3B1bWFza190IGNhbGxtYXAsIHVuc2lnbmVkIGxvbmcgdHlwZSwKKwkJCQkJdm9pZCAoKmZ1bmMpICh2b2lkICppbmZvKSwgdm9pZCAqaW5mbywgaW50IHdhaXQpCiB7CiAJdW5zaWduZWQgaW50IGNwdTsKLQljcHVtYXNrX3QgY2FsbG1hcDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXN0cnVjdCBpcGlfbWVzc2FnZV9xdWV1ZSAqbXNnX3F1ZXVlOwogCXN0cnVjdCBpcGlfbWVzc2FnZSAqbXNnOwotCi0JY2FsbG1hcCA9IGNwdV9vbmxpbmVfbWFwOwotCWNwdV9jbGVhcihzbXBfcHJvY2Vzc29yX2lkKCksIGNhbGxtYXApOwotCWlmIChjcHVzX2VtcHR5KGNhbGxtYXApKQotCQlyZXR1cm4gMDsKLQotCW1zZyA9IGttYWxsb2Moc2l6ZW9mKCptc2cpLCBHRlBfQVRPTUlDKTsKLQlpZiAoIW1zZykKLQkJcmV0dXJuIC1FTk9NRU07Ci0JSU5JVF9MSVNUX0hFQUQoJm1zZy0+bGlzdCk7Ci0JbXNnLT5jYWxsX3N0cnVjdC5mdW5jID0gZnVuYzsKLQltc2ctPmNhbGxfc3RydWN0LmluZm8gPSBpbmZvOwotCW1zZy0+Y2FsbF9zdHJ1Y3Qud2FpdCA9IHdhaXQ7Ci0JbXNnLT5jYWxsX3N0cnVjdC5wZW5kaW5nID0gY2FsbG1hcDsKLQltc2ctPmNhbGxfc3RydWN0LndhaXRtYXNrID0gY2FsbG1hcDsKLQltc2ctPnR5cGUgPSBCRklOX0lQSV9DQUxMX0ZVTkM7CisJdW5zaWduZWQgbG9uZyBmbGFncywgbmV4dF9tc2c7CisJY3B1bWFza190IHdhaXRtYXNrID0gY2FsbG1hcDsgLyogd2FpdG1hc2sgaXMgc2hhcmVkIGJ5IGFsbCBjcHVzICovCiAKIAlmb3JfZWFjaF9jcHVfbWFzayhjcHUsIGNhbGxtYXApIHsKIAkJbXNnX3F1ZXVlID0gJnBlcl9jcHUoaXBpX21zZ19xdWV1ZSwgY3B1KTsKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJm1zZ19xdWV1ZS0+bG9jaywgZmxhZ3MpOwotCQlsaXN0X2FkZF90YWlsKCZtc2ctPmxpc3QsICZtc2dfcXVldWUtPmhlYWQpOworCQlpZiAobXNnX3F1ZXVlLT5jb3VudCA8IEJGSU5fSVBJX01TR1FfTEVOKSB7CisJCQluZXh0X21zZyA9IChtc2dfcXVldWUtPmhlYWQgKyBtc2dfcXVldWUtPmNvdW50KQorCQkJCQklIEJGSU5fSVBJX01TR1FfTEVOOworCQkJbXNnID0gJm1zZ19xdWV1ZS0+aXBpX21lc3NhZ2VbbmV4dF9tc2ddOworCQkJbXNnLT50eXBlID0gdHlwZTsKKwkJCWlmICh0eXBlID09IEJGSU5fSVBJX0NBTExfRlVOQykgeworCQkJCW1zZy0+Y2FsbF9zdHJ1Y3QuZnVuYyA9IGZ1bmM7CisJCQkJbXNnLT5jYWxsX3N0cnVjdC5pbmZvID0gaW5mbzsKKwkJCQltc2ctPmNhbGxfc3RydWN0LndhaXQgPSB3YWl0OworCQkJCW1zZy0+Y2FsbF9zdHJ1Y3Qud2FpdG1hc2sgPSAmd2FpdG1hc2s7CisJCQl9CisJCQltc2dfcXVldWUtPmNvdW50Kys7CisJCX0gZWxzZQorCQkJcGFuaWMoIklQSSBtZXNzYWdlIHF1ZXVlIG92ZXJmbG93XG4iKTsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbXNnX3F1ZXVlLT5sb2NrLCBmbGFncyk7Ci0JCXBsYXRmb3JtX3NlbmRfaXBpX2NwdShjcHUpOworCQlwbGF0Zm9ybV9zZW5kX2lwaV9jcHUoY3B1LCBJUlFfU1VQUExFXzEpOwogCX0KKwogCWlmICh3YWl0KSB7Ci0JCXdoaWxlICghY3B1c19lbXB0eShtc2ctPmNhbGxfc3RydWN0LndhaXRtYXNrKSkKKwkJd2hpbGUgKCFjcHVzX2VtcHR5KHdhaXRtYXNrKSkKIAkJCWJsYWNrZmluX2RjYWNoZV9pbnZhbGlkYXRlX3JhbmdlKAotCQkJCSh1bnNpZ25lZCBsb25nKSgmbXNnLT5jYWxsX3N0cnVjdC53YWl0bWFzayksCi0JCQkJKHVuc2lnbmVkIGxvbmcpKCZtc2ctPmNhbGxfc3RydWN0LndhaXRtYXNrKSk7CisJCQkJKHVuc2lnbmVkIGxvbmcpKCZ3YWl0bWFzayksCisJCQkJKHVuc2lnbmVkIGxvbmcpKCZ3YWl0bWFzaykpOwogI2lmZGVmIF9fQVJDSF9TWU5DX0NPUkVfRENBQ0hFCiAJCS8qCiAJCSAqIEludmFsaWRhdGUgRCBjYWNoZSBpbiBjYXNlIHNoYXJlZCBkYXRhIHdhcyBjaGFuZ2VkIGJ5CkBAIC0yMzUsOCArMjM3LDIwIEBACiAJCSAqLwogCQlyZXN5bmNfY29yZV9kY2FjaGUoKTsKICNlbmRpZgotCQlrZnJlZShtc2cpOwogCX0KK30KKworaW50IHNtcF9jYWxsX2Z1bmN0aW9uKHZvaWQgKCpmdW5jKSh2b2lkICppbmZvKSwgdm9pZCAqaW5mbywgaW50IHdhaXQpCit7CisJY3B1bWFza190IGNhbGxtYXA7CisKKwljYWxsbWFwID0gY3B1X29ubGluZV9tYXA7CisJY3B1X2NsZWFyKHNtcF9wcm9jZXNzb3JfaWQoKSwgY2FsbG1hcCk7CisJaWYgKGNwdXNfZW1wdHkoY2FsbG1hcCkpCisJCXJldHVybiAwOworCisJc21wX3NlbmRfbWVzc2FnZShjYWxsbWFwLCBCRklOX0lQSV9DQUxMX0ZVTkMsIGZ1bmMsIGluZm8sIHdhaXQpOworCiAJcmV0dXJuIDA7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChzbXBfY2FsbF9mdW5jdGlvbik7CkBAIC0yNDYsMTAwICsyNjAsMzkgQEAKIHsKIAl1bnNpZ25lZCBpbnQgY3B1ID0gY3B1aWQ7CiAJY3B1bWFza190IGNhbGxtYXA7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzdHJ1Y3QgaXBpX21lc3NhZ2VfcXVldWUgKm1zZ19xdWV1ZTsKLQlzdHJ1Y3QgaXBpX21lc3NhZ2UgKm1zZzsKIAogCWlmIChjcHVfaXNfb2ZmbGluZShjcHUpKQogCQlyZXR1cm4gMDsKIAljcHVzX2NsZWFyKGNhbGxtYXApOwogCWNwdV9zZXQoY3B1LCBjYWxsbWFwKTsKIAotCW1zZyA9IGttYWxsb2Moc2l6ZW9mKCptc2cpLCBHRlBfQVRPTUlDKTsKLQlpZiAoIW1zZykKLQkJcmV0dXJuIC1FTk9NRU07Ci0JSU5JVF9MSVNUX0hFQUQoJm1zZy0+bGlzdCk7Ci0JbXNnLT5jYWxsX3N0cnVjdC5mdW5jID0gZnVuYzsKLQltc2ctPmNhbGxfc3RydWN0LmluZm8gPSBpbmZvOwotCW1zZy0+Y2FsbF9zdHJ1Y3Qud2FpdCA9IHdhaXQ7Ci0JbXNnLT5jYWxsX3N0cnVjdC5wZW5kaW5nID0gY2FsbG1hcDsKLQltc2ctPmNhbGxfc3RydWN0LndhaXRtYXNrID0gY2FsbG1hcDsKLQltc2ctPnR5cGUgPSBCRklOX0lQSV9DQUxMX0ZVTkM7CisJc21wX3NlbmRfbWVzc2FnZShjYWxsbWFwLCBCRklOX0lQSV9DQUxMX0ZVTkMsIGZ1bmMsIGluZm8sIHdhaXQpOwogCi0JbXNnX3F1ZXVlID0gJnBlcl9jcHUoaXBpX21zZ19xdWV1ZSwgY3B1KTsKLQlzcGluX2xvY2tfaXJxc2F2ZSgmbXNnX3F1ZXVlLT5sb2NrLCBmbGFncyk7Ci0JbGlzdF9hZGRfdGFpbCgmbXNnLT5saXN0LCAmbXNnX3F1ZXVlLT5oZWFkKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtc2dfcXVldWUtPmxvY2ssIGZsYWdzKTsKLQlwbGF0Zm9ybV9zZW5kX2lwaV9jcHUoY3B1KTsKLQotCWlmICh3YWl0KSB7Ci0JCXdoaWxlICghY3B1c19lbXB0eShtc2ctPmNhbGxfc3RydWN0LndhaXRtYXNrKSkKLQkJCWJsYWNrZmluX2RjYWNoZV9pbnZhbGlkYXRlX3JhbmdlKAotCQkJCSh1bnNpZ25lZCBsb25nKSgmbXNnLT5jYWxsX3N0cnVjdC53YWl0bWFzayksCi0JCQkJKHVuc2lnbmVkIGxvbmcpKCZtc2ctPmNhbGxfc3RydWN0LndhaXRtYXNrKSk7Ci0jaWZkZWYgX19BUkNIX1NZTkNfQ09SRV9EQ0FDSEUKLQkJLyoKLQkJICogSW52YWxpZGF0ZSBEIGNhY2hlIGluIGNhc2Ugc2hhcmVkIGRhdGEgd2FzIGNoYW5nZWQgYnkKLQkJICogb3RoZXIgcHJvY2Vzc29ycyB0byBlbnN1cmUgY2FjaGUgY29oZXJlbmNlLgotCQkgKi8KLQkJcmVzeW5jX2NvcmVfZGNhY2hlKCk7Ci0jZW5kaWYKLQkJa2ZyZWUobXNnKTsKLQl9CiAJcmV0dXJuIDA7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChzbXBfY2FsbF9mdW5jdGlvbl9zaW5nbGUpOwogCiB2b2lkIHNtcF9zZW5kX3Jlc2NoZWR1bGUoaW50IGNwdSkKIHsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXN0cnVjdCBpcGlfbWVzc2FnZV9xdWV1ZSAqbXNnX3F1ZXVlOwotCXN0cnVjdCBpcGlfbWVzc2FnZSAqbXNnOwotCisJLyogc2ltcGx5IHRyaWdnZXIgYW4gaXBpICovCiAJaWYgKGNwdV9pc19vZmZsaW5lKGNwdSkpCiAJCXJldHVybjsKLQotCW1zZyA9IGt6YWxsb2Moc2l6ZW9mKCptc2cpLCBHRlBfQVRPTUlDKTsKLQlpZiAoIW1zZykKLQkJcmV0dXJuOwotCUlOSVRfTElTVF9IRUFEKCZtc2ctPmxpc3QpOwotCW1zZy0+dHlwZSA9IEJGSU5fSVBJX1JFU0NIRURVTEU7Ci0KLQltc2dfcXVldWUgPSAmcGVyX2NwdShpcGlfbXNnX3F1ZXVlLCBjcHUpOwotCXNwaW5fbG9ja19pcnFzYXZlKCZtc2dfcXVldWUtPmxvY2ssIGZsYWdzKTsKLQlsaXN0X2FkZF90YWlsKCZtc2ctPmxpc3QsICZtc2dfcXVldWUtPmhlYWQpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1zZ19xdWV1ZS0+bG9jaywgZmxhZ3MpOwotCXBsYXRmb3JtX3NlbmRfaXBpX2NwdShjcHUpOworCXBsYXRmb3JtX3NlbmRfaXBpX2NwdShjcHUsIElSUV9TVVBQTEVfMCk7CiAKIAlyZXR1cm47CiB9CiAKIHZvaWQgc21wX3NlbmRfc3RvcCh2b2lkKQogewotCXVuc2lnbmVkIGludCBjcHU7CiAJY3B1bWFza190IGNhbGxtYXA7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzdHJ1Y3QgaXBpX21lc3NhZ2VfcXVldWUgKm1zZ19xdWV1ZTsKLQlzdHJ1Y3QgaXBpX21lc3NhZ2UgKm1zZzsKIAogCWNhbGxtYXAgPSBjcHVfb25saW5lX21hcDsKIAljcHVfY2xlYXIoc21wX3Byb2Nlc3Nvcl9pZCgpLCBjYWxsbWFwKTsKIAlpZiAoY3B1c19lbXB0eShjYWxsbWFwKSkKIAkJcmV0dXJuOwogCi0JbXNnID0ga3phbGxvYyhzaXplb2YoKm1zZyksIEdGUF9BVE9NSUMpOwotCWlmICghbXNnKQotCQlyZXR1cm47Ci0JSU5JVF9MSVNUX0hFQUQoJm1zZy0+bGlzdCk7Ci0JbXNnLT50eXBlID0gQkZJTl9JUElfQ1BVX1NUT1A7CisJc21wX3NlbmRfbWVzc2FnZShjYWxsbWFwLCBCRklOX0lQSV9DUFVfU1RPUCwgTlVMTCwgTlVMTCwgMCk7CiAKLQlmb3JfZWFjaF9jcHVfbWFzayhjcHUsIGNhbGxtYXApIHsKLQkJbXNnX3F1ZXVlID0gJnBlcl9jcHUoaXBpX21zZ19xdWV1ZSwgY3B1KTsKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJm1zZ19xdWV1ZS0+bG9jaywgZmxhZ3MpOwotCQlsaXN0X2FkZF90YWlsKCZtc2ctPmxpc3QsICZtc2dfcXVldWUtPmhlYWQpOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtc2dfcXVldWUtPmxvY2ssIGZsYWdzKTsKLQkJcGxhdGZvcm1fc2VuZF9pcGlfY3B1KGNwdSk7Ci0JfQogCXJldHVybjsKIH0KIApAQCAtNDQ2LDcgKzM5OSw4IEBACiB7CiAJcGxhdGZvcm1fcHJlcGFyZV9jcHVzKG1heF9jcHVzKTsKIAlpcGlfcXVldWVfaW5pdCgpOwotCXBsYXRmb3JtX3JlcXVlc3RfaXBpKCZpcGlfaGFuZGxlcik7CisJcGxhdGZvcm1fcmVxdWVzdF9pcGkoSVJRX1NVUFBMRV8wLCBpcGlfaGFuZGxlcl9pbnQwKTsKKwlwbGF0Zm9ybV9yZXF1ZXN0X2lwaShJUlFfU1VQUExFXzEsIGlwaV9oYW5kbGVyX2ludDEpOwogfQogCiB2b2lkIF9faW5pdCBzbXBfY3B1c19kb25lKHVuc2lnbmVkIGludCBtYXhfY3B1cykKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbW0vc3JhbS1hbGxvYy5jIGIvYXJjaC9ibGFja2Zpbi9tbS9zcmFtLWFsbG9jLmMKaW5kZXggNjI3ZTA0Yi4uZGZkMzA0YSAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tbS9zcmFtLWFsbG9jLmMKKysrIGIvYXJjaC9ibGFja2Zpbi9tbS9zcmFtLWFsbG9jLmMKQEAgLTcwNCwxOCArNzA0LDE4IEBACiB7CiAJc3RydWN0IHNyYW1fbGlzdF9zdHJ1Y3QgKmxzbCwgKip0bXA7CiAJc3RydWN0IG1tX3N0cnVjdCAqbW0gPSBjdXJyZW50LT5tbTsKKwlpbnQgcmV0ID0gLTE7CiAKIAlmb3IgKHRtcCA9ICZtbS0+Y29udGV4dC5zcmFtX2xpc3Q7ICp0bXA7IHRtcCA9ICYoKnRtcCktPm5leHQpCi0JCWlmICgoKnRtcCktPmFkZHIgPT0gYWRkcikKLQkJCWdvdG8gZm91bmQ7Ci0JcmV0dXJuIC0xOwotZm91bmQ6Ci0JbHNsID0gKnRtcDsKLQlzcmFtX2ZyZWUoYWRkcik7Ci0JKnRtcCA9IGxzbC0+bmV4dDsKLQlrZnJlZShsc2wpOworCQlpZiAoKCp0bXApLT5hZGRyID09IGFkZHIpIHsKKwkJCWxzbCA9ICp0bXA7CisJCQlyZXQgPSBzcmFtX2ZyZWUoYWRkcik7CisJCQkqdG1wID0gbHNsLT5uZXh0OworCQkJa2ZyZWUobHNsKTsKKwkJCWJyZWFrOworCQl9CiAKLQlyZXR1cm4gMDsKKwlyZXR1cm4gcmV0OwogfQogRVhQT1JUX1NZTUJPTChzcmFtX2ZyZWVfd2l0aF9sc2wpOwogCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQva2VybmVsL2FjcGkuYyBiL2FyY2gvaWE2NC9rZXJuZWwvYWNwaS5jCmluZGV4IGM2YzkwZjMuLjdiODk3YjcgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9rZXJuZWwvYWNwaS5jCisrKyBiL2FyY2gvaWE2NC9rZXJuZWwvYWNwaS5jCkBAIC00NzcsNiArNDc3LDEyIEBACiAJaWYgKCEocGEtPmZsYWdzICYgQUNQSV9TUkFUX0NQVV9FTkFCTEVEKSkKIAkJcmV0dXJuOwogCisJaWYgKHNyYXRfbnVtX2NwdXMgPj0gQVJSQVlfU0laRShub2RlX2NwdWlkKSkgeworCQlwcmludGtfb25jZShLRVJOX1dBUk5JTkcKKwkJCSAgICAibm9kZV9jcHVpZFslZF0gaXMgdG9vIHNtYWxsLCBtYXkgbm90IGJlIGFibGUgdG8gdXNlIGFsbCBjcHVzXG4iLAorCQkJICAgIEFSUkFZX1NJWkUobm9kZV9jcHVpZCkpOworCQlyZXR1cm47CisJfQogCXB4bSA9IGdldF9wcm9jZXNzb3JfcHJveGltaXR5X2RvbWFpbihwYSk7CiAKIAkvKiByZWNvcmQgdGhpcyBub2RlIGluIHByb3hpbWl0eSBiaXRtYXAgKi8KZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9rZXJuZWwvaXJxX2lhNjQuYyBiL2FyY2gvaWE2NC9rZXJuZWwvaXJxX2lhNjQuYwppbmRleCA5YTI2MDE1Li4zOGMwN2I4IDEwMDY0NAotLS0gYS9hcmNoL2lhNjQva2VybmVsL2lycV9pYTY0LmMKKysrIGIvYXJjaC9pYTY0L2tlcm5lbC9pcnFfaWE2NC5jCkBAIC02MzMsNyArNjMzLDcgQEAKIAlCVUdfT04oYmluZF9pcnFfdmVjdG9yKGlycSwgdmVjLCBDUFVfTUFTS19BTEwpKTsKIAlkZXNjID0gaXJxX2Rlc2MgKyBpcnE7CiAJZGVzYy0+c3RhdHVzIHw9IElSUV9QRVJfQ1BVOwotCWRlc2MtPmNoaXAgPSAmaXJxX3R5cGVfaWE2NF9sc2FwaWM7CisJc2V0X2lycV9jaGlwKGlycSwgJmlycV90eXBlX2lhNjRfbHNhcGljKTsKIAlpZiAoYWN0aW9uKQogCQlzZXR1cF9pcnEoaXJxLCBhY3Rpb24pOwogCXNldF9pcnFfaGFuZGxlcihpcnEsIGhhbmRsZV9wZXJjcHVfaXJxKTsKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9rZXJuZWwvcGVyZm1vbi5jIGIvYXJjaC9pYTY0L2tlcm5lbC9wZXJmbW9uLmMKaW5kZXggZjA5OWI4Mi4uZDkyZDViNSAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2tlcm5lbC9wZXJmbW9uLmMKKysrIGIvYXJjaC9pYTY0L2tlcm5lbC9wZXJmbW9uLmMKQEAgLTgyOSwxMCArODI5LDkgQEAKIAl1bnNpZ25lZCBsb25nIGFkZHI7CiAKIAlzaXplID0gUEFHRV9BTElHTihzaXplKTsKLQltZW0gID0gdm1hbGxvYyhzaXplKTsKKwltZW0gID0gdnphbGxvYyhzaXplKTsKIAlpZiAobWVtKSB7CiAJCS8vcHJpbnRrKCJwZXJmbW9uOiBDUFUlZCBwZm1fcnZtYWxsb2MoJWxkKT0lcFxuIiwgc21wX3Byb2Nlc3Nvcl9pZCgpLCBzaXplLCBtZW0pOwotCQltZW1zZXQobWVtLCAwLCBzaXplKTsKIAkJYWRkciA9ICh1bnNpZ25lZCBsb25nKW1lbTsKIAkJd2hpbGUgKHNpemUgPiAwKSB7CiAJCQlwZm1fcmVzZXJ2ZV9wYWdlKGFkZHIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2tlcm5lbC9zbXAuYyBiL2FyY2gvaWE2NC9rZXJuZWwvc21wLmMKaW5kZXggZGFiZWVmZS4uYmU0NTBhMyAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2tlcm5lbC9zbXAuYworKysgYi9hcmNoL2lhNjQva2VybmVsL3NtcC5jCkBAIC0yOTMsNiArMjkzLDcgQEAKIHZvaWQKIHNtcF9mbHVzaF90bGJfbW0gKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKQogeworCWNwdW1hc2tfdmFyX3QgY3B1czsKIAlwcmVlbXB0X2Rpc2FibGUoKTsKIAkvKiB0aGlzIGhhcHBlbnMgZm9yIHRoZSBjb21tb24gY2FzZSBvZiBhIHNpbmdsZS10aHJlYWRlZCBmb3JrKCk6ICAqLwogCWlmIChsaWtlbHkobW0gPT0gY3VycmVudC0+YWN0aXZlX21tICYmIGF0b21pY19yZWFkKCZtbS0+bW1fdXNlcnMpID09IDEpKQpAQCAtMzAxLDkgKzMwMiwxNSBAQAogCQlwcmVlbXB0X2VuYWJsZSgpOwogCQlyZXR1cm47CiAJfQotCi0Jc21wX2NhbGxfZnVuY3Rpb25fbWFueShtbV9jcHVtYXNrKG1tKSwKLQkJKHZvaWQgKCopKHZvaWQgKikpbG9jYWxfZmluaXNoX2ZsdXNoX3RsYl9tbSwgbW0sIDEpOworCWlmICghYWxsb2NfY3B1bWFza192YXIoJmNwdXMsIEdGUF9BVE9NSUMpKSB7CisJCXNtcF9jYWxsX2Z1bmN0aW9uKCh2b2lkICgqKSh2b2lkICopKWxvY2FsX2ZpbmlzaF9mbHVzaF90bGJfbW0sCisJCQltbSwgMSk7CisJfSBlbHNlIHsKKwkJY3B1bWFza19jb3B5KGNwdXMsIG1tX2NwdW1hc2sobW0pKTsKKwkJc21wX2NhbGxfZnVuY3Rpb25fbWFueShjcHVzLAorCQkJKHZvaWQgKCopKHZvaWQgKikpbG9jYWxfZmluaXNoX2ZsdXNoX3RsYl9tbSwgbW0sIDEpOworCQlmcmVlX2NwdW1hc2tfdmFyKGNwdXMpOworCX0KIAlsb2NhbF9pcnFfZGlzYWJsZSgpOwogCWxvY2FsX2ZpbmlzaF9mbHVzaF90bGJfbW0obW0pOwogCWxvY2FsX2lycV9lbmFibGUoKTsKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9rZXJuZWwvdGltZS5jIGIvYXJjaC9pYTY0L2tlcm5lbC90aW1lLmMKaW5kZXggZWQ2ZjIyZS4uOTcwMmZhOSAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2tlcm5lbC90aW1lLmMKKysrIGIvYXJjaC9pYTY0L2tlcm5lbC90aW1lLmMKQEAgLTE2OCw3ICsxNjgsNyBAQAogewogCXVuc2lnbmVkIGxvbmcgbmV3X2l0bTsKIAotCWlmICh1bmxpa2VseShjcHVfaXNfb2ZmbGluZShzbXBfcHJvY2Vzc29yX2lkKCkpKSkgeworCWlmIChjcHVfaXNfb2ZmbGluZShzbXBfcHJvY2Vzc29yX2lkKCkpKSB7CiAJCXJldHVybiBJUlFfSEFORExFRDsKIAl9CiAKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9pbmNsdWRlL2FzbS9zdW4zX3BndGFibGUuaCBiL2FyY2gvbTY4ay9pbmNsdWRlL2FzbS9zdW4zX3BndGFibGUuaAppbmRleCBjZjVmYWQ5Li5mNTVhYTA0IDEwMDY0NAotLS0gYS9hcmNoL202OGsvaW5jbHVkZS9hc20vc3VuM19wZ3RhYmxlLmgKKysrIGIvYXJjaC9tNjhrL2luY2x1ZGUvYXNtL3N1bjNfcGd0YWJsZS5oCkBAIC0yMTcsOSArMjE3LDggQEAKIC8qIEZpbmQgYW4gZW50cnkgaW4gdGhlIHRoaXJkLWxldmVsIHBhZ2V0YWJsZS4gKi8KICNkZWZpbmUgcHRlX2luZGV4KGFkZHJlc3MpICgoYWRkcmVzcyA+PiBQQUdFX1NISUZUKSAmIChQVFJTX1BFUl9QVEUtMSkpCiAjZGVmaW5lIHB0ZV9vZmZzZXRfa2VybmVsKHBtZCwgYWRkcmVzcykgKChwdGVfdCAqKSBfX3BtZF9wYWdlKCpwbWQpICsgcHRlX2luZGV4KGFkZHJlc3MpKQotLyogRklYTUU6IHNob3VsZCB3ZSBib3RoZXIgd2l0aCBrbWFwKCkgaGVyZT8gKi8KLSNkZWZpbmUgcHRlX29mZnNldF9tYXAocG1kLCBhZGRyZXNzKSAoKHB0ZV90ICopa21hcChwbWRfcGFnZSgqcG1kKSkgKyBwdGVfaW5kZXgoYWRkcmVzcykpCi0jZGVmaW5lIHB0ZV91bm1hcChwdGUpIGt1bm1hcChwdGUpCisjZGVmaW5lIHB0ZV9vZmZzZXRfbWFwKHBtZCwgYWRkcmVzcykgKChwdGVfdCAqKXBhZ2VfYWRkcmVzcyhwbWRfcGFnZSgqcG1kKSkgKyBwdGVfaW5kZXgoYWRkcmVzcykpCisjZGVmaW5lIHB0ZV91bm1hcChwdGUpIGRvIHsgfSB3aGlsZSAoMCkKIAogLyogTWFjcm9zIHRvIChkZSljb25zdHJ1Y3QgdGhlIGZha2UgUFRFcyByZXByZXNlbnRpbmcgc3dhcCBwYWdlcy4gKi8KICNkZWZpbmUgX19zd3BfdHlwZSh4KQkJKCh4KS52YWwgJiAweDdGKQpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2luY2x1ZGUvYXNtL3RocmVhZF9pbmZvLmggYi9hcmNoL202OGsvaW5jbHVkZS9hc20vdGhyZWFkX2luZm8uaAppbmRleCAxZGE1ZDUzLi43OTA5ODg5IDEwMDY0NAotLS0gYS9hcmNoL202OGsvaW5jbHVkZS9hc20vdGhyZWFkX2luZm8uaAorKysgYi9hcmNoL202OGsvaW5jbHVkZS9hc20vdGhyZWFkX2luZm8uaApAQCAtMTA0LDUgKzEwNCw2IEBACiAjZGVmaW5lIFRJRl9TWVNDQUxMX1RSQUNFCTE1CS8qIHN5c2NhbGwgdHJhY2UgYWN0aXZlICovCiAjZGVmaW5lIFRJRl9NRU1ESUUJCTE2CS8qIGlzIHRlcm1pbmF0aW5nIGR1ZSB0byBPT00ga2lsbGVyICovCiAjZGVmaW5lIFRJRl9GUkVFWkUJCTE3CS8qIHRocmVhZCBpcyBmcmVlemluZyBmb3Igc3VzcGVuZCAqLworI2RlZmluZSBUSUZfUkVTVE9SRV9TSUdNQVNLCTE4CS8qIHJlc3RvcmUgc2lnbmFsIG1hc2sgaW4gZG9fc2lnbmFsICovCiAKICNlbmRpZgkvKiBfQVNNX002OEtfVEhSRUFEX0lORk9fSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2luY2x1ZGUvYXNtL3VuaXN0ZC5oIGIvYXJjaC9tNjhrL2luY2x1ZGUvYXNtL3VuaXN0ZC5oCmluZGV4IGI0M2IzNmIuLjI2ZDg1MWQgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9pbmNsdWRlL2FzbS91bmlzdGQuaAorKysgYi9hcmNoL202OGsvaW5jbHVkZS9hc20vdW5pc3RkLmgKQEAgLTM3Myw2ICszNzMsNyBAQAogI2RlZmluZSBfX0FSQ0hfV0FOVF9TWVNfU0lHUEVORElORwogI2RlZmluZSBfX0FSQ0hfV0FOVF9TWVNfU0lHUFJPQ01BU0sKICNkZWZpbmUgX19BUkNIX1dBTlRfU1lTX1JUX1NJR0FDVElPTgorI2RlZmluZSBfX0FSQ0hfV0FOVF9TWVNfUlRfU0lHU1VTUEVORAogCiAvKgogICogIkNvbmRpdGlvbmFsIiBzeXNjYWxscwpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2tlcm5lbC9lbnRyeS5TIGIvYXJjaC9tNjhrL2tlcm5lbC9lbnRyeS5TCmluZGV4IDYzNjBjNDMuLjE1NTlkZWEgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9rZXJuZWwvZW50cnkuUworKysgYi9hcmNoL202OGsva2VybmVsL2VudHJ5LlMKQEAgLTk5LDcgKzk5LDEwIEBACiAJanJhCS5McmV0X2Zyb21fZXhjZXB0aW9uCiAKIEVOVFJZKHJldF9mcm9tX3NpZ25hbCkKLQlSRVNUT1JFX1NXSVRDSF9TVEFDSworCXRzdGIJJWN1cnB0ckAoVEFTS19JTkZPK1RJTkZPX0ZMQUdTKzIpCisJamdlCTFmCisJamJzcglzeXNjYWxsX3RyYWNlCisxOglSRVNUT1JFX1NXSVRDSF9TVEFDSwogCWFkZHFsCSM0LCVzcAogLyogb24gNjgwNDAgY29tcGxldGUgcGVuZGluZyB3cml0ZWJhY2tzIGlmIGFueSAqLwogI2lmZGVmIENPTkZJR19NNjgwNDAKQEAgLTE3NCwxNiArMTc3LDExIEBACiAJc3VicWwJIzQsJXNwCQkJfCBkdW1teSByZXR1cm4gYWRkcmVzcwogCVNBVkVfU1dJVENIX1NUQUNLCiAJcGVhCSVzcEAoU1dJVENIX1NUQUNLX1NJWkUpCi0JY2xybAklc3BALQogCWJzcmwJZG9fc2lnbmFsCi0JYWRkcWwJIzgsJXNwCisJYWRkcWwJIzQsJXNwCiAJUkVTVE9SRV9TV0lUQ0hfU1RBQ0sKIAlhZGRxbAkjNCwlc3AKLQl0c3RsCSVkMAotCWplcQlyZXN1bWVfdXNlcnNwYWNlCi0JfCB3aGVuIHNpbmdsZSBzdGVwcGluZyBpbnRvIGhhbmRsZXIgc3RvcCBhdCB0aGUgZmlyc3QgaW5zbgotCWJ0c3QJIzYsJWN1cnB0ckAoVEFTS19JTkZPK1RJTkZPX0ZMQUdTKzIpCi0JamVxCXJlc3VtZV91c2Vyc3BhY2UKKwlqYnJhCXJlc3VtZV91c2Vyc3BhY2UKIAogZG9fZGVsYXllZF90cmFjZToKIAliY2xyCSM3LCVzcEAoUFRfT0ZGX1NSKQl8IGNsZWFyIHRyYWNlIGJpdCBpbiBTUgpAQCAtMjkwLDIyICsyODgsNiBAQAogCVJFU1RPUkVfU1dJVENIX1NUQUNLCiAJcnRzCiAKLUVOVFJZKHN5c19zaWdzdXNwZW5kKQotCVNBVkVfU1dJVENIX1NUQUNLCi0JcGVhCSVzcEAoU1dJVENIX1NUQUNLX1NJWkUpCi0JamJzcglkb19zaWdzdXNwZW5kCi0JYWRkcWwJIzQsJXNwCi0JUkVTVE9SRV9TV0lUQ0hfU1RBQ0sKLQlydHMKLQotRU5UUlkoc3lzX3J0X3NpZ3N1c3BlbmQpCi0JU0FWRV9TV0lUQ0hfU1RBQ0sKLQlwZWEJJXNwQChTV0lUQ0hfU1RBQ0tfU0laRSkKLQlqYnNyCWRvX3J0X3NpZ3N1c3BlbmQKLQlhZGRxbAkjNCwlc3AKLQlSRVNUT1JFX1NXSVRDSF9TVEFDSwotCXJ0cwotCiBFTlRSWShzeXNfc2lncmV0dXJuKQogCVNBVkVfU1dJVENIX1NUQUNLCiAJamJzcglkb19zaWdyZXR1cm4KZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9rZXJuZWwvc2lnbmFsLmMgYi9hcmNoL202OGsva2VybmVsL3NpZ25hbC5jCmluZGV4IDRiMzg3NTMuLmQxMmMzYjAgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9rZXJuZWwvc2lnbmFsLmMKKysrIGIvYXJjaC9tNjhrL2tlcm5lbC9zaWduYWwuYwpAQCAtNTEsOCArNTEsNiBAQAogCiAjZGVmaW5lIF9CTE9DS0FCTEUgKH4oc2lnbWFzayhTSUdLSUxMKSB8IHNpZ21hc2soU0lHU1RPUCkpKQogCi1hc21saW5rYWdlIGludCBkb19zaWduYWwoc2lnc2V0X3QgKm9sZHNldCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOwotCiBjb25zdCBpbnQgZnJhbWVfZXh0cmFfc2l6ZXNbMTZdID0gewogICBbMV0JPSAtMSwgLyogc2l6ZW9mKCgoc3RydWN0IGZyYW1lICopMCktPnVuLmZtdDEpLCAqLwogICBbMl0JPSBzaXplb2YoKChzdHJ1Y3QgZnJhbWUgKikwKS0+dW4uZm10MiksCkBAIC03NCw1MSArNzIsMjEgQEAKIC8qCiAgKiBBdG9taWNhbGx5IHN3YXAgaW4gdGhlIG5ldyBzaWduYWwgbWFzaywgYW5kIHdhaXQgZm9yIGEgc2lnbmFsLgogICovCi1hc21saW5rYWdlIGludCBkb19zaWdzdXNwZW5kKHN0cnVjdCBwdF9yZWdzICpyZWdzKQorYXNtbGlua2FnZSBpbnQKK3N5c19zaWdzdXNwZW5kKGludCB1bnVzZWQwLCBpbnQgdW51c2VkMSwgb2xkX3NpZ3NldF90IG1hc2spCiB7Ci0Jb2xkX3NpZ3NldF90IG1hc2sgPSByZWdzLT5kMzsKLQlzaWdzZXRfdCBzYXZlc2V0OwotCiAJbWFzayAmPSBfQkxPQ0tBQkxFOwotCXNhdmVzZXQgPSBjdXJyZW50LT5ibG9ja2VkOworCXNwaW5fbG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOworCWN1cnJlbnQtPnNhdmVkX3NpZ21hc2sgPSBjdXJyZW50LT5ibG9ja2VkOwogCXNpZ2luaXRzZXQoJmN1cnJlbnQtPmJsb2NrZWQsIG1hc2spOwogCXJlY2FsY19zaWdwZW5kaW5nKCk7CisJc3Bpbl91bmxvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKIAotCXJlZ3MtPmQwID0gLUVJTlRSOwotCXdoaWxlICgxKSB7Ci0JCWN1cnJlbnQtPnN0YXRlID0gVEFTS19JTlRFUlJVUFRJQkxFOwotCQlzY2hlZHVsZSgpOwotCQlpZiAoZG9fc2lnbmFsKCZzYXZlc2V0LCByZWdzKSkKLQkJCXJldHVybiAtRUlOVFI7Ci0JfQotfQorCWN1cnJlbnQtPnN0YXRlID0gVEFTS19JTlRFUlJVUFRJQkxFOworCXNjaGVkdWxlKCk7CisJc2V0X3Jlc3RvcmVfc2lnbWFzaygpOwogCi1hc21saW5rYWdlIGludAotZG9fcnRfc2lnc3VzcGVuZChzdHJ1Y3QgcHRfcmVncyAqcmVncykKLXsKLQlzaWdzZXRfdCBfX3VzZXIgKnVuZXdzZXQgPSAoc2lnc2V0X3QgX191c2VyICopcmVncy0+ZDE7Ci0Jc2l6ZV90IHNpZ3NldHNpemUgPSAoc2l6ZV90KXJlZ3MtPmQyOwotCXNpZ3NldF90IHNhdmVzZXQsIG5ld3NldDsKLQotCS8qIFhYWDogRG9uJ3QgcHJlY2x1ZGUgaGFuZGxpbmcgZGlmZmVyZW50IHNpemVkIHNpZ3NldF90J3MuICAqLwotCWlmIChzaWdzZXRzaXplICE9IHNpemVvZihzaWdzZXRfdCkpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKGNvcHlfZnJvbV91c2VyKCZuZXdzZXQsIHVuZXdzZXQsIHNpemVvZihuZXdzZXQpKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0Jc2lnZGVsc2V0bWFzaygmbmV3c2V0LCB+X0JMT0NLQUJMRSk7Ci0KLQlzYXZlc2V0ID0gY3VycmVudC0+YmxvY2tlZDsKLQljdXJyZW50LT5ibG9ja2VkID0gbmV3c2V0OwotCXJlY2FsY19zaWdwZW5kaW5nKCk7Ci0KLQlyZWdzLT5kMCA9IC1FSU5UUjsKLQl3aGlsZSAoMSkgewotCQljdXJyZW50LT5zdGF0ZSA9IFRBU0tfSU5URVJSVVBUSUJMRTsKLQkJc2NoZWR1bGUoKTsKLQkJaWYgKGRvX3NpZ25hbCgmc2F2ZXNldCwgcmVncykpCi0JCQlyZXR1cm4gLUVJTlRSOwotCX0KKwlyZXR1cm4gLUVSRVNUQVJUTk9IQU5EOwogfQogCiBhc21saW5rYWdlIGludApAQCAtMTMyLDEwICsxMDAsMTAgQEAKIAkJb2xkX3NpZ3NldF90IG1hc2s7CiAJCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCBhY3QsIHNpemVvZigqYWN0KSkgfHwKIAkJICAgIF9fZ2V0X3VzZXIobmV3X2thLnNhLnNhX2hhbmRsZXIsICZhY3QtPnNhX2hhbmRsZXIpIHx8Ci0JCSAgICBfX2dldF91c2VyKG5ld19rYS5zYS5zYV9yZXN0b3JlciwgJmFjdC0+c2FfcmVzdG9yZXIpKQorCQkgICAgX19nZXRfdXNlcihuZXdfa2Euc2Euc2FfcmVzdG9yZXIsICZhY3QtPnNhX3Jlc3RvcmVyKSB8fAorCQkgICAgX19nZXRfdXNlcihuZXdfa2Euc2Euc2FfZmxhZ3MsICZhY3QtPnNhX2ZsYWdzKSB8fAorCQkgICAgX19nZXRfdXNlcihtYXNrLCAmYWN0LT5zYV9tYXNrKSkKIAkJCXJldHVybiAtRUZBVUxUOwotCQlfX2dldF91c2VyKG5ld19rYS5zYS5zYV9mbGFncywgJmFjdC0+c2FfZmxhZ3MpOwotCQlfX2dldF91c2VyKG1hc2ssICZhY3QtPnNhX21hc2spOwogCQlzaWdpbml0c2V0KCZuZXdfa2Euc2Euc2FfbWFzaywgbWFzayk7CiAJfQogCkBAIC0xNDQsMTAgKzExMiwxMCBAQAogCWlmICghcmV0ICYmIG9hY3QpIHsKIAkJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBvYWN0LCBzaXplb2YoKm9hY3QpKSB8fAogCQkgICAgX19wdXRfdXNlcihvbGRfa2Euc2Euc2FfaGFuZGxlciwgJm9hY3QtPnNhX2hhbmRsZXIpIHx8Ci0JCSAgICBfX3B1dF91c2VyKG9sZF9rYS5zYS5zYV9yZXN0b3JlciwgJm9hY3QtPnNhX3Jlc3RvcmVyKSkKKwkJICAgIF9fcHV0X3VzZXIob2xkX2thLnNhLnNhX3Jlc3RvcmVyLCAmb2FjdC0+c2FfcmVzdG9yZXIpIHx8CisJCSAgICBfX3B1dF91c2VyKG9sZF9rYS5zYS5zYV9mbGFncywgJm9hY3QtPnNhX2ZsYWdzKSB8fAorCQkgICAgX19wdXRfdXNlcihvbGRfa2Euc2Euc2FfbWFzay5zaWdbMF0sICZvYWN0LT5zYV9tYXNrKSkKIAkJCXJldHVybiAtRUZBVUxUOwotCQlfX3B1dF91c2VyKG9sZF9rYS5zYS5zYV9mbGFncywgJm9hY3QtPnNhX2ZsYWdzKTsKLQkJX19wdXRfdXNlcihvbGRfa2Euc2Euc2FfbWFzay5zaWdbMF0sICZvYWN0LT5zYV9tYXNrKTsKIAl9CiAKIAlyZXR1cm4gcmV0OwpAQCAtMzE4LDM2ICsyODYsMTAgQEAKIAlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgaW5saW5lIGludAotcmVzdG9yZV9zaWdjb250ZXh0KHN0cnVjdCBwdF9yZWdzICpyZWdzLCBzdHJ1Y3Qgc2lnY29udGV4dCBfX3VzZXIgKnVzYywgdm9pZCBfX3VzZXIgKmZwLAotCQkgICBpbnQgKnBkMCkKK3N0YXRpYyBpbnQgbWFuZ2xlX2tlcm5lbF9zdGFjayhzdHJ1Y3QgcHRfcmVncyAqcmVncywgaW50IGZvcm1hdHZlYywKKwkJCSAgICAgICB2b2lkIF9fdXNlciAqZnApCiB7Ci0JaW50IGZzaXplLCBmb3JtYXR2ZWM7Ci0Jc3RydWN0IHNpZ2NvbnRleHQgY29udGV4dDsKLQlpbnQgZXJyOwotCi0JLyogQWx3YXlzIG1ha2UgYW55IHBlbmRpbmcgcmVzdGFydGVkIHN5c3RlbSBjYWxscyByZXR1cm4gLUVJTlRSICovCi0JY3VycmVudF90aHJlYWRfaW5mbygpLT5yZXN0YXJ0X2Jsb2NrLmZuID0gZG9fbm9fcmVzdGFydF9zeXNjYWxsOwotCi0JLyogZ2V0IHByZXZpb3VzIGNvbnRleHQgKi8KLQlpZiAoY29weV9mcm9tX3VzZXIoJmNvbnRleHQsIHVzYywgc2l6ZW9mKGNvbnRleHQpKSkKLQkJZ290byBiYWRmcmFtZTsKLQotCS8qIHJlc3RvcmUgcGFzc2VkIHJlZ2lzdGVycyAqLwotCXJlZ3MtPmQxID0gY29udGV4dC5zY19kMTsKLQlyZWdzLT5hMCA9IGNvbnRleHQuc2NfYTA7Ci0JcmVncy0+YTEgPSBjb250ZXh0LnNjX2ExOwotCXJlZ3MtPnNyID0gKHJlZ3MtPnNyICYgMHhmZjAwKSB8IChjb250ZXh0LnNjX3NyICYgMHhmZik7Ci0JcmVncy0+cGMgPSBjb250ZXh0LnNjX3BjOwotCXJlZ3MtPm9yaWdfZDAgPSAtMTsJCS8qIGRpc2FibGUgc3lzY2FsbCBjaGVja3MgKi8KLQl3cnVzcChjb250ZXh0LnNjX3VzcCk7Ci0JZm9ybWF0dmVjID0gY29udGV4dC5zY19mb3JtYXR2ZWM7Ci0JcmVncy0+Zm9ybWF0ID0gZm9ybWF0dmVjID4+IDEyOwotCXJlZ3MtPnZlY3RvciA9IGZvcm1hdHZlYyAmIDB4ZmZmOwotCi0JZXJyID0gcmVzdG9yZV9mcHVfc3RhdGUoJmNvbnRleHQpOwotCi0JZnNpemUgPSBmcmFtZV9leHRyYV9zaXplc1tyZWdzLT5mb3JtYXRdOworCWludCBmc2l6ZSA9IGZyYW1lX2V4dHJhX3NpemVzW2Zvcm1hdHZlYyA+PiAxMl07CiAJaWYgKGZzaXplIDwgMCkgewogCQkvKgogCQkgKiB1c2VyIHByb2Nlc3MgdHJ5aW5nIHRvIHJldHVybiB3aXRoIHdlaXJkIGZyYW1lIGZvcm1hdApAQCAtMzU1LDE2ICsyOTcsMjIgQEAKICNpZmRlZiBERUJVRwogCQlwcmludGsoInVzZXIgcHJvY2VzcyByZXR1cm5pbmcgd2l0aCB3ZWlyZCBmcmFtZSBmb3JtYXRcbiIpOwogI2VuZGlmCi0JCWdvdG8gYmFkZnJhbWU7CisJCXJldHVybiAxOwogCX0KLQotCS8qIE9LLglNYWtlIHJvb20gb24gdGhlIHN1cGVydmlzb3Igc3RhY2sgZm9yIHRoZSBleHRyYSBqdW5rLAotCSAqIGlmIG5lY2Vzc2FyeS4KLQkgKi8KLQotCWlmIChmc2l6ZSkgeworCWlmICghZnNpemUpIHsKKwkJcmVncy0+Zm9ybWF0ID0gZm9ybWF0dmVjID4+IDEyOworCQlyZWdzLT52ZWN0b3IgPSBmb3JtYXR2ZWMgJiAweGZmZjsKKwl9IGVsc2UgewogCQlzdHJ1Y3Qgc3dpdGNoX3N0YWNrICpzdyA9IChzdHJ1Y3Qgc3dpdGNoX3N0YWNrICopcmVncyAtIDE7Ci0JCXJlZ3MtPmQwID0gY29udGV4dC5zY19kMDsKKwkJdW5zaWduZWQgbG9uZyBidWZbZnNpemUgLyAyXTsgLyogeWVzLCB0d2ljZSBhcyBtdWNoICovCisKKwkJLyogdGhhdCdsbCBtYWtlIHN1cmUgdGhhdCBleHBhbnNpb24gd29uJ3QgY3JhcCBvdmVyIGRhdGEgKi8KKwkJaWYgKGNvcHlfZnJvbV91c2VyKGJ1ZiArIGZzaXplIC8gNCwgZnAsIGZzaXplKSkKKwkJCXJldHVybiAxOworCisJCS8qIHBvaW50IG9mIG5vIHJldHVybiAqLworCQlyZWdzLT5mb3JtYXQgPSBmb3JtYXR2ZWMgPj4gMTI7CisJCXJlZ3MtPnZlY3RvciA9IGZvcm1hdHZlYyAmIDB4ZmZmOwogI2RlZmluZSBmcmFtZV9vZmZzZXQgKHNpemVvZihzdHJ1Y3QgcHRfcmVncykrc2l6ZW9mKHN0cnVjdCBzd2l0Y2hfc3RhY2spKQogCQlfX2FzbV9fIF9fdm9sYXRpbGVfXwogCQkJKCIgICBtb3ZlbCAlMCwlL2EwXG5cdCIKQEAgLTM3NiwzMCArMzI0LDUwIEBACiAJCQkgIiAgIGxlYSAlL3NwQCglYzMpLCUvYTBcblx0IiAvKiBhZGQgb2Zmc2V0IG9mIGZtdCAqLwogCQkJICIgICBsc3JsICAjMiwlMVxuXHQiCiAJCQkgIiAgIHN1YnFsICMxLCUxXG5cdCIKLQkJCSAiMjogbW92ZXNsICU0QCssJTJcblx0IgotCQkJICIzOiBtb3ZlbCAlMiwlL2EwQCtcblx0IgorCQkJIC8qIGNvcHkgdG8gdGhlIGdhcCB3ZSdkIG1hZGUgKi8KKwkJCSAiMjogbW92ZWwgJTRAKywlL2EwQCtcblx0IgogCQkJICIgICBkYnJhICUxLDJiXG5cdCIKIAkJCSAiICAgYnJhbCByZXRfZnJvbV9zaWduYWxcbiIKLQkJCSAiNDpcbiIKLQkJCSAiLnNlY3Rpb24gX19leF90YWJsZSxcImFcIlxuIgotCQkJICIgICAuYWxpZ24gNFxuIgotCQkJICIgICAubG9uZyAyYiw0YlxuIgotCQkJICIgICAubG9uZyAzYiw0YlxuIgotCQkJICIucHJldmlvdXMiCiAJCQkgOiAvKiBubyBvdXRwdXRzLCBpdCBkb2Vzbid0IGV2ZXIgcmV0dXJuICovCiAJCQkgOiAiYSIgKHN3KSwgImQiIChmc2l6ZSksICJkIiAoZnJhbWVfb2Zmc2V0LzQtMSksCi0JCQkgICAibiIgKGZyYW1lX29mZnNldCksICJhIiAoZnApCisJCQkgICAibiIgKGZyYW1lX29mZnNldCksICJhIiAoYnVmICsgZnNpemUvNCkKIAkJCSA6ICJhMCIpOwogI3VuZGVmIGZyYW1lX29mZnNldAotCQkvKgotCQkgKiBJZiB3ZSBldmVyIGdldCBoZXJlIGFuIGV4Y2VwdGlvbiBvY2N1cnJlZCB3aGlsZQotCQkgKiBidWlsZGluZyB0aGUgYWJvdmUgc3RhY2stZnJhbWUuCi0JCSAqLwotCQlnb3RvIGJhZGZyYW1lOwogCX0KKwlyZXR1cm4gMDsKK30KIAotCSpwZDAgPSBjb250ZXh0LnNjX2QwOwotCXJldHVybiBlcnI7CitzdGF0aWMgaW5saW5lIGludAorcmVzdG9yZV9zaWdjb250ZXh0KHN0cnVjdCBwdF9yZWdzICpyZWdzLCBzdHJ1Y3Qgc2lnY29udGV4dCBfX3VzZXIgKnVzYywgdm9pZCBfX3VzZXIgKmZwKQoreworCWludCBmb3JtYXR2ZWM7CisJc3RydWN0IHNpZ2NvbnRleHQgY29udGV4dDsKKwlpbnQgZXJyOworCisJLyogQWx3YXlzIG1ha2UgYW55IHBlbmRpbmcgcmVzdGFydGVkIHN5c3RlbSBjYWxscyByZXR1cm4gLUVJTlRSICovCisJY3VycmVudF90aHJlYWRfaW5mbygpLT5yZXN0YXJ0X2Jsb2NrLmZuID0gZG9fbm9fcmVzdGFydF9zeXNjYWxsOworCisJLyogZ2V0IHByZXZpb3VzIGNvbnRleHQgKi8KKwlpZiAoY29weV9mcm9tX3VzZXIoJmNvbnRleHQsIHVzYywgc2l6ZW9mKGNvbnRleHQpKSkKKwkJZ290byBiYWRmcmFtZTsKKworCS8qIHJlc3RvcmUgcGFzc2VkIHJlZ2lzdGVycyAqLworCXJlZ3MtPmQwID0gY29udGV4dC5zY19kMDsKKwlyZWdzLT5kMSA9IGNvbnRleHQuc2NfZDE7CisJcmVncy0+YTAgPSBjb250ZXh0LnNjX2EwOworCXJlZ3MtPmExID0gY29udGV4dC5zY19hMTsKKwlyZWdzLT5zciA9IChyZWdzLT5zciAmIDB4ZmYwMCkgfCAoY29udGV4dC5zY19zciAmIDB4ZmYpOworCXJlZ3MtPnBjID0gY29udGV4dC5zY19wYzsKKwlyZWdzLT5vcmlnX2QwID0gLTE7CQkvKiBkaXNhYmxlIHN5c2NhbGwgY2hlY2tzICovCisJd3J1c3AoY29udGV4dC5zY191c3ApOworCWZvcm1hdHZlYyA9IGNvbnRleHQuc2NfZm9ybWF0dmVjOworCisJZXJyID0gcmVzdG9yZV9mcHVfc3RhdGUoJmNvbnRleHQpOworCisJaWYgKGVyciB8fCBtYW5nbGVfa2VybmVsX3N0YWNrKHJlZ3MsIGZvcm1hdHZlYywgZnApKQorCQlnb3RvIGJhZGZyYW1lOworCisJcmV0dXJuIDA7CiAKIGJhZGZyYW1lOgogCXJldHVybiAxOwpAQCAtNDA3LDkgKzM3NSw5IEBACiAKIHN0YXRpYyBpbmxpbmUgaW50CiBydF9yZXN0b3JlX3Vjb250ZXh0KHN0cnVjdCBwdF9yZWdzICpyZWdzLCBzdHJ1Y3Qgc3dpdGNoX3N0YWNrICpzdywKLQkJICAgIHN0cnVjdCB1Y29udGV4dCBfX3VzZXIgKnVjLCBpbnQgKnBkMCkKKwkJICAgIHN0cnVjdCB1Y29udGV4dCBfX3VzZXIgKnVjKQogewotCWludCBmc2l6ZSwgdGVtcDsKKwlpbnQgdGVtcDsKIAlncmVnX3QgX191c2VyICpncmVncyA9IHVjLT51Y19tY29udGV4dC5ncmVnczsKIAl1bnNpZ25lZCBsb25nIHVzcDsKIAlpbnQgZXJyOwpAQCAtNDQzLDY1ICs0MTEsMTYgQEAKIAlyZWdzLT5zciA9IChyZWdzLT5zciAmIDB4ZmYwMCkgfCAodGVtcCAmIDB4ZmYpOwogCXJlZ3MtPm9yaWdfZDAgPSAtMTsJCS8qIGRpc2FibGUgc3lzY2FsbCBjaGVja3MgKi8KIAllcnIgfD0gX19nZXRfdXNlcih0ZW1wLCAmdWMtPnVjX2Zvcm1hdHZlYyk7Ci0JcmVncy0+Zm9ybWF0ID0gdGVtcCA+PiAxMjsKLQlyZWdzLT52ZWN0b3IgPSB0ZW1wICYgMHhmZmY7CiAKIAllcnIgfD0gcnRfcmVzdG9yZV9mcHVfc3RhdGUodWMpOwogCi0JaWYgKGRvX3NpZ2FsdHN0YWNrKCZ1Yy0+dWNfc3RhY2ssIE5VTEwsIHVzcCkgPT0gLUVGQVVMVCkKKwlpZiAoZXJyIHx8IGRvX3NpZ2FsdHN0YWNrKCZ1Yy0+dWNfc3RhY2ssIE5VTEwsIHVzcCkgPT0gLUVGQVVMVCkKIAkJZ290byBiYWRmcmFtZTsKIAotCWZzaXplID0gZnJhbWVfZXh0cmFfc2l6ZXNbcmVncy0+Zm9ybWF0XTsKLQlpZiAoZnNpemUgPCAwKSB7Ci0JCS8qCi0JCSAqIHVzZXIgcHJvY2VzcyB0cnlpbmcgdG8gcmV0dXJuIHdpdGggd2VpcmQgZnJhbWUgZm9ybWF0Ci0JCSAqLwotI2lmZGVmIERFQlVHCi0JCXByaW50aygidXNlciBwcm9jZXNzIHJldHVybmluZyB3aXRoIHdlaXJkIGZyYW1lIGZvcm1hdFxuIik7Ci0jZW5kaWYKKwlpZiAobWFuZ2xlX2tlcm5lbF9zdGFjayhyZWdzLCB0ZW1wLCAmdWMtPnVjX2V4dHJhKSkKIAkJZ290byBiYWRmcmFtZTsKLQl9CiAKLQkvKiBPSy4JTWFrZSByb29tIG9uIHRoZSBzdXBlcnZpc29yIHN0YWNrIGZvciB0aGUgZXh0cmEganVuaywKLQkgKiBpZiBuZWNlc3NhcnkuCi0JICovCi0KLQlpZiAoZnNpemUpIHsKLSNkZWZpbmUgZnJhbWVfb2Zmc2V0IChzaXplb2Yoc3RydWN0IHB0X3JlZ3MpK3NpemVvZihzdHJ1Y3Qgc3dpdGNoX3N0YWNrKSkKLQkJX19hc21fXyBfX3ZvbGF0aWxlX18KLQkJCSgiICAgbW92ZWwgJTAsJS9hMFxuXHQiCi0JCQkgIiAgIHN1YmwgJTEsJS9hMFxuXHQiICAgICAvKiBtYWtlIHJvb20gb24gc3RhY2sgKi8KLQkJCSAiICAgbW92ZWwgJS9hMCwlL3NwXG5cdCIgIC8qIHNldCBzdGFjayBwb2ludGVyICovCi0JCQkgLyogbW92ZSBzd2l0Y2hfc3RhY2sgYW5kIHB0X3JlZ3MgKi8KLQkJCSAiMTogbW92ZWwgJTBAKywlL2EwQCtcblx0IgotCQkJICIgICBkYnJhICUyLDFiXG5cdCIKLQkJCSAiICAgbGVhICUvc3BAKCVjMyksJS9hMFxuXHQiIC8qIGFkZCBvZmZzZXQgb2YgZm10ICovCi0JCQkgIiAgIGxzcmwgICMyLCUxXG5cdCIKLQkJCSAiICAgc3VicWwgIzEsJTFcblx0IgotCQkJICIyOiBtb3Zlc2wgJTRAKywlMlxuXHQiCi0JCQkgIjM6IG1vdmVsICUyLCUvYTBAK1xuXHQiCi0JCQkgIiAgIGRicmEgJTEsMmJcblx0IgotCQkJICIgICBicmFsIHJldF9mcm9tX3NpZ25hbFxuIgotCQkJICI0OlxuIgotCQkJICIuc2VjdGlvbiBfX2V4X3RhYmxlLFwiYVwiXG4iCi0JCQkgIiAgIC5hbGlnbiA0XG4iCi0JCQkgIiAgIC5sb25nIDJiLDRiXG4iCi0JCQkgIiAgIC5sb25nIDNiLDRiXG4iCi0JCQkgIi5wcmV2aW91cyIKLQkJCSA6IC8qIG5vIG91dHB1dHMsIGl0IGRvZXNuJ3QgZXZlciByZXR1cm4gKi8KLQkJCSA6ICJhIiAoc3cpLCAiZCIgKGZzaXplKSwgImQiIChmcmFtZV9vZmZzZXQvNC0xKSwKLQkJCSAgICJuIiAoZnJhbWVfb2Zmc2V0KSwgImEiICgmdWMtPnVjX2V4dHJhKQotCQkJIDogImEwIik7Ci0jdW5kZWYgZnJhbWVfb2Zmc2V0Ci0JCS8qCi0JCSAqIElmIHdlIGV2ZXIgZ2V0IGhlcmUgYW4gZXhjZXB0aW9uIG9jY3VycmVkIHdoaWxlCi0JCSAqIGJ1aWxkaW5nIHRoZSBhYm92ZSBzdGFjay1mcmFtZS4KLQkJICovCi0JCWdvdG8gYmFkZnJhbWU7Ci0JfQotCi0JKnBkMCA9IHJlZ3MtPmQwOwotCXJldHVybiBlcnI7CisJcmV0dXJuIDA7CiAKIGJhZGZyYW1lOgogCXJldHVybiAxOwpAQCAtNTE0LDcgKzQzMyw2IEBACiAJdW5zaWduZWQgbG9uZyB1c3AgPSByZHVzcCgpOwogCXN0cnVjdCBzaWdmcmFtZSBfX3VzZXIgKmZyYW1lID0gKHN0cnVjdCBzaWdmcmFtZSBfX3VzZXIgKikodXNwIC0gNCk7CiAJc2lnc2V0X3Qgc2V0OwotCWludCBkMDsKIAogCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCBmcmFtZSwgc2l6ZW9mKCpmcmFtZSkpKQogCQlnb3RvIGJhZGZyYW1lOwpAQCAtNTI4LDkgKzQ0Niw5IEBACiAJY3VycmVudC0+YmxvY2tlZCA9IHNldDsKIAlyZWNhbGNfc2lncGVuZGluZygpOwogCi0JaWYgKHJlc3RvcmVfc2lnY29udGV4dChyZWdzLCAmZnJhbWUtPnNjLCBmcmFtZSArIDEsICZkMCkpCisJaWYgKHJlc3RvcmVfc2lnY29udGV4dChyZWdzLCAmZnJhbWUtPnNjLCBmcmFtZSArIDEpKQogCQlnb3RvIGJhZGZyYW1lOwotCXJldHVybiBkMDsKKwlyZXR1cm4gcmVncy0+ZDA7CiAKIGJhZGZyYW1lOgogCWZvcmNlX3NpZyhTSUdTRUdWLCBjdXJyZW50KTsKQEAgLTU0NCw3ICs0NjIsNiBAQAogCXVuc2lnbmVkIGxvbmcgdXNwID0gcmR1c3AoKTsKIAlzdHJ1Y3QgcnRfc2lnZnJhbWUgX191c2VyICpmcmFtZSA9IChzdHJ1Y3QgcnRfc2lnZnJhbWUgX191c2VyICopKHVzcCAtIDQpOwogCXNpZ3NldF90IHNldDsKLQlpbnQgZDA7CiAKIAlpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgZnJhbWUsIHNpemVvZigqZnJhbWUpKSkKIAkJZ290byBiYWRmcmFtZTsKQEAgLTU1NSw5ICs0NzIsOSBAQAogCWN1cnJlbnQtPmJsb2NrZWQgPSBzZXQ7CiAJcmVjYWxjX3NpZ3BlbmRpbmcoKTsKIAotCWlmIChydF9yZXN0b3JlX3Vjb250ZXh0KHJlZ3MsIHN3LCAmZnJhbWUtPnVjLCAmZDApKQorCWlmIChydF9yZXN0b3JlX3Vjb250ZXh0KHJlZ3MsIHN3LCAmZnJhbWUtPnVjKSkKIAkJZ290byBiYWRmcmFtZTsKLQlyZXR1cm4gZDA7CisJcmV0dXJuIHJlZ3MtPmQwOwogCiBiYWRmcmFtZToKIAlmb3JjZV9zaWcoU0lHU0VHViwgY3VycmVudCk7CkBAIC03NzUsNyArNjkyLDcgQEAKIAlyZXR1cm4gKHZvaWQgX191c2VyICopKCh1c3AgLSBmcmFtZV9zaXplKSAmIC04VUwpOwogfQogCi1zdGF0aWMgdm9pZCBzZXR1cF9mcmFtZSAoaW50IHNpZywgc3RydWN0IGtfc2lnYWN0aW9uICprYSwKK3N0YXRpYyBpbnQgc2V0dXBfZnJhbWUgKGludCBzaWcsIHN0cnVjdCBrX3NpZ2FjdGlvbiAqa2EsCiAJCQkgc2lnc2V0X3QgKnNldCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJc3RydWN0IHNpZ2ZyYW1lIF9fdXNlciAqZnJhbWU7CkBAIC03OTMsMTAgKzcxMCw4IEBACiAKIAlmcmFtZSA9IGdldF9zaWdmcmFtZShrYSwgcmVncywgc2l6ZW9mKCpmcmFtZSkgKyBmc2l6ZSk7CiAKLQlpZiAoZnNpemUpIHsKKwlpZiAoZnNpemUpCiAJCWVyciB8PSBjb3B5X3RvX3VzZXIgKGZyYW1lICsgMSwgcmVncyArIDEsIGZzaXplKTsKLQkJcmVncy0+c3RrYWRqID0gZnNpemU7Ci0JfQogCiAJZXJyIHw9IF9fcHV0X3VzZXIoKGN1cnJlbnRfdGhyZWFkX2luZm8oKS0+ZXhlY19kb21haW4KIAkJCSAgICYmIGN1cnJlbnRfdGhyZWFkX2luZm8oKS0+ZXhlY19kb21haW4tPnNpZ25hbF9pbnZtYXAKQEAgLTgyNiwxMSArNzQxLDIxIEBACiAKIAlwdXNoX2NhY2hlICgodW5zaWduZWQgbG9uZykgJmZyYW1lLT5yZXRjb2RlKTsKIAotCS8qIFNldCB1cCByZWdpc3RlcnMgZm9yIHNpZ25hbCBoYW5kbGVyICovCisJLyoKKwkgKiBTZXQgdXAgcmVnaXN0ZXJzIGZvciBzaWduYWwgaGFuZGxlci4gIEFsbCB0aGUgc3RhdGUgd2UgYXJlIGFib3V0CisJICogdG8gZGVzdHJveSBpcyBzdWNjZXNzZnVsbHkgY29waWVkIHRvIHNpZ2ZyYW1lLgorCSAqLwogCXdydXNwICgodW5zaWduZWQgbG9uZykgZnJhbWUpOwogCXJlZ3MtPnBjID0gKHVuc2lnbmVkIGxvbmcpIGthLT5zYS5zYV9oYW5kbGVyOwogCi1hZGp1c3Rfc3RhY2s6CisJLyoKKwkgKiBUaGlzIGlzIHN1YnRsZTsgaWYgd2UgYnVpbGQgbW9yZSB0aGFuIG9uZSBzaWdmcmFtZSwgYWxsIGJ1dCB0aGUKKwkgKiBmaXJzdCBvbmUgd2lsbCBzZWUgZnJhbWUgZm9ybWF0IDAgYW5kIGhhdmUgZnNpemUgPT0gMCwgc28gd2Ugd29uJ3QKKwkgKiBzY3JldyBzdGthZGouCisJICovCisJaWYgKGZzaXplKQorCQlyZWdzLT5zdGthZGogPSBmc2l6ZTsKKwogCS8qIFByZXBhcmUgdG8gc2tpcCBvdmVyIHRoZSBleHRyYSBzdHVmZiBpbiB0aGUgZXhjZXB0aW9uIGZyYW1lLiAgKi8KIAlpZiAocmVncy0+c3RrYWRqKSB7CiAJCXN0cnVjdCBwdF9yZWdzICp0cmVncyA9CkBAIC04NDUsMTQgKzc3MCwxNCBAQAogCQl0cmVncy0+cGMgPSByZWdzLT5wYzsKIAkJdHJlZ3MtPnNyID0gcmVncy0+c3I7CiAJfQotCXJldHVybjsKKwlyZXR1cm4gMDsKIAogZ2l2ZV9zaWdzZWd2OgogCWZvcmNlX3NpZ3NlZ3Yoc2lnLCBjdXJyZW50KTsKLQlnb3RvIGFkanVzdF9zdGFjazsKKwlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgdm9pZCBzZXR1cF9ydF9mcmFtZSAoaW50IHNpZywgc3RydWN0IGtfc2lnYWN0aW9uICprYSwgc2lnaW5mb190ICppbmZvLAorc3RhdGljIGludCBzZXR1cF9ydF9mcmFtZSAoaW50IHNpZywgc3RydWN0IGtfc2lnYWN0aW9uICprYSwgc2lnaW5mb190ICppbmZvLAogCQkJICAgIHNpZ3NldF90ICpzZXQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogCXN0cnVjdCBydF9zaWdmcmFtZSBfX3VzZXIgKmZyYW1lOwpAQCAtODY5LDEwICs3OTQsOCBAQAogCiAJZnJhbWUgPSBnZXRfc2lnZnJhbWUoa2EsIHJlZ3MsIHNpemVvZigqZnJhbWUpKTsKIAotCWlmIChmc2l6ZSkgeworCWlmIChmc2l6ZSkKIAkJZXJyIHw9IGNvcHlfdG9fdXNlciAoJmZyYW1lLT51Yy51Y19leHRyYSwgcmVncyArIDEsIGZzaXplKTsKLQkJcmVncy0+c3RrYWRqID0gZnNpemU7Ci0JfQogCiAJZXJyIHw9IF9fcHV0X3VzZXIoKGN1cnJlbnRfdGhyZWFkX2luZm8oKS0+ZXhlY19kb21haW4KIAkJCSAgICYmIGN1cnJlbnRfdGhyZWFkX2luZm8oKS0+ZXhlY19kb21haW4tPnNpZ25hbF9pbnZtYXAKQEAgLTkxNCwxMSArODM3LDIxIEBACiAKIAlwdXNoX2NhY2hlICgodW5zaWduZWQgbG9uZykgJmZyYW1lLT5yZXRjb2RlKTsKIAotCS8qIFNldCB1cCByZWdpc3RlcnMgZm9yIHNpZ25hbCBoYW5kbGVyICovCisJLyoKKwkgKiBTZXQgdXAgcmVnaXN0ZXJzIGZvciBzaWduYWwgaGFuZGxlci4gIEFsbCB0aGUgc3RhdGUgd2UgYXJlIGFib3V0CisJICogdG8gZGVzdHJveSBpcyBzdWNjZXNzZnVsbHkgY29waWVkIHRvIHNpZ2ZyYW1lLgorCSAqLwogCXdydXNwICgodW5zaWduZWQgbG9uZykgZnJhbWUpOwogCXJlZ3MtPnBjID0gKHVuc2lnbmVkIGxvbmcpIGthLT5zYS5zYV9oYW5kbGVyOwogCi1hZGp1c3Rfc3RhY2s6CisJLyoKKwkgKiBUaGlzIGlzIHN1YnRsZTsgaWYgd2UgYnVpbGQgbW9yZSB0aGFuIG9uZSBzaWdmcmFtZSwgYWxsIGJ1dCB0aGUKKwkgKiBmaXJzdCBvbmUgd2lsbCBzZWUgZnJhbWUgZm9ybWF0IDAgYW5kIGhhdmUgZnNpemUgPT0gMCwgc28gd2Ugd29uJ3QKKwkgKiBzY3JldyBzdGthZGouCisJICovCisJaWYgKGZzaXplKQorCQlyZWdzLT5zdGthZGogPSBmc2l6ZTsKKwogCS8qIFByZXBhcmUgdG8gc2tpcCBvdmVyIHRoZSBleHRyYSBzdHVmZiBpbiB0aGUgZXhjZXB0aW9uIGZyYW1lLiAgKi8KIAlpZiAocmVncy0+c3RrYWRqKSB7CiAJCXN0cnVjdCBwdF9yZWdzICp0cmVncyA9CkBAIC05MzMsMTEgKzg2NiwxMSBAQAogCQl0cmVncy0+cGMgPSByZWdzLT5wYzsKIAkJdHJlZ3MtPnNyID0gcmVncy0+c3I7CiAJfQotCXJldHVybjsKKwlyZXR1cm4gMDsKIAogZ2l2ZV9zaWdzZWd2OgogCWZvcmNlX3NpZ3NlZ3Yoc2lnLCBjdXJyZW50KTsKLQlnb3RvIGFkanVzdF9zdGFjazsKKwlyZXR1cm4gZXJyOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQKQEAgLTk5NSw2ICs5MjgsNyBAQAogaGFuZGxlX3NpZ25hbChpbnQgc2lnLCBzdHJ1Y3Qga19zaWdhY3Rpb24gKmthLCBzaWdpbmZvX3QgKmluZm8sCiAJICAgICAgc2lnc2V0X3QgKm9sZHNldCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CisJaW50IGVycjsKIAkvKiBhcmUgd2UgZnJvbSBhIHN5c3RlbSBjYWxsPyAqLwogCWlmIChyZWdzLT5vcmlnX2QwID49IDApCiAJCS8qIElmIHNvLCBjaGVjayBzeXN0ZW0gY2FsbCByZXN0YXJ0aW5nLi4gKi8KQEAgLTEwMDIsMTcgKzkzNiwyNCBAQAogCiAJLyogc2V0IHVwIHRoZSBzdGFjayBmcmFtZSAqLwogCWlmIChrYS0+c2Euc2FfZmxhZ3MgJiBTQV9TSUdJTkZPKQotCQlzZXR1cF9ydF9mcmFtZShzaWcsIGthLCBpbmZvLCBvbGRzZXQsIHJlZ3MpOworCQllcnIgPSBzZXR1cF9ydF9mcmFtZShzaWcsIGthLCBpbmZvLCBvbGRzZXQsIHJlZ3MpOwogCWVsc2UKLQkJc2V0dXBfZnJhbWUoc2lnLCBrYSwgb2xkc2V0LCByZWdzKTsKKwkJZXJyID0gc2V0dXBfZnJhbWUoc2lnLCBrYSwgb2xkc2V0LCByZWdzKTsKIAotCWlmIChrYS0+c2Euc2FfZmxhZ3MgJiBTQV9PTkVTSE9UKQotCQlrYS0+c2Euc2FfaGFuZGxlciA9IFNJR19ERkw7CisJaWYgKGVycikKKwkJcmV0dXJuOwogCiAJc2lnb3JzZXRzKCZjdXJyZW50LT5ibG9ja2VkLCZjdXJyZW50LT5ibG9ja2VkLCZrYS0+c2Euc2FfbWFzayk7CiAJaWYgKCEoa2EtPnNhLnNhX2ZsYWdzICYgU0FfTk9ERUZFUikpCiAJCXNpZ2FkZHNldCgmY3VycmVudC0+YmxvY2tlZCxzaWcpOwogCXJlY2FsY19zaWdwZW5kaW5nKCk7CisKKwlpZiAodGVzdF90aHJlYWRfZmxhZyhUSUZfREVMQVlFRF9UUkFDRSkpIHsKKwkJcmVncy0+c3IgJj0gfjB4ODAwMDsKKwkJc2VuZF9zaWcoU0lHVFJBUCwgY3VycmVudCwgMSk7CisJfQorCisJY2xlYXJfdGhyZWFkX2ZsYWcoVElGX1JFU1RPUkVfU0lHTUFTSyk7CiB9CiAKIC8qCkBAIC0xMDIwLDIyICs5NjEsMjUgQEAKICAqIHdhbnQgdG8gaGFuZGxlLiBUaHVzIHlvdSBjYW5ub3Qga2lsbCBpbml0IGV2ZW4gd2l0aCBhIFNJR0tJTEwgZXZlbiBieQogICogbWlzdGFrZS4KICAqLwotYXNtbGlua2FnZSBpbnQgZG9fc2lnbmFsKHNpZ3NldF90ICpvbGRzZXQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQorYXNtbGlua2FnZSB2b2lkIGRvX3NpZ25hbChzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAlzaWdpbmZvX3QgaW5mbzsKIAlzdHJ1Y3Qga19zaWdhY3Rpb24ga2E7CiAJaW50IHNpZ25yOworCXNpZ3NldF90ICpvbGRzZXQ7CiAKIAljdXJyZW50LT50aHJlYWQuZXNwMCA9ICh1bnNpZ25lZCBsb25nKSByZWdzOwogCi0JaWYgKCFvbGRzZXQpCisJaWYgKHRlc3RfdGhyZWFkX2ZsYWcoVElGX1JFU1RPUkVfU0lHTUFTSykpCisJCW9sZHNldCA9ICZjdXJyZW50LT5zYXZlZF9zaWdtYXNrOworCWVsc2UKIAkJb2xkc2V0ID0gJmN1cnJlbnQtPmJsb2NrZWQ7CiAKIAlzaWduciA9IGdldF9zaWduYWxfdG9fZGVsaXZlcigmaW5mbywgJmthLCByZWdzLCBOVUxMKTsKIAlpZiAoc2lnbnIgPiAwKSB7CiAJCS8qIFdoZWUhICBBY3R1YWxseSBkZWxpdmVyIHRoZSBzaWduYWwuICAqLwogCQloYW5kbGVfc2lnbmFsKHNpZ25yLCAma2EsICZpbmZvLCBvbGRzZXQsIHJlZ3MpOwotCQlyZXR1cm4gMTsKKwkJcmV0dXJuOwogCX0KIAogCS8qIERpZCB3ZSBjb21lIGZyb20gYSBzeXN0ZW0gY2FsbD8gKi8KQEAgLTEwNDMsNSArOTg3LDkgQEAKIAkJLyogUmVzdGFydCB0aGUgc3lzdGVtIGNhbGwgLSBubyBoYW5kbGVycyBwcmVzZW50ICovCiAJCWhhbmRsZV9yZXN0YXJ0KHJlZ3MsIE5VTEwsIDApOwogCi0JcmV0dXJuIDA7CisJLyogSWYgdGhlcmUncyBubyBzaWduYWwgdG8gZGVsaXZlciwgd2UganVzdCByZXN0b3JlIHRoZSBzYXZlZCBtYXNrLiAgKi8KKwlpZiAodGVzdF90aHJlYWRfZmxhZyhUSUZfUkVTVE9SRV9TSUdNQVNLKSkgeworCQljbGVhcl90aHJlYWRfZmxhZyhUSUZfUkVTVE9SRV9TSUdNQVNLKTsKKwkJc2lncHJvY21hc2soU0lHX1NFVE1BU0ssICZjdXJyZW50LT5zYXZlZF9zaWdtYXNrLCBOVUxMKTsKKwl9CiB9CmRpZmYgLS1naXQgYS9hcmNoL202OGtub21tdS9rZXJuZWwvZW50cnkuUyBiL2FyY2gvbTY4a25vbW11L2tlcm5lbC9lbnRyeS5TCmluZGV4IGFmZjZmNTcuLjI3ODNmMjUgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4a25vbW11L2tlcm5lbC9lbnRyeS5TCisrKyBiL2FyY2gvbTY4a25vbW11L2tlcm5lbC9lbnRyeS5TCkBAIC0xMTIsMjIgKzExMiw2IEBACiAJUkVTVE9SRV9TV0lUQ0hfU1RBQ0sKIAlydHMKIAotRU5UUlkoc3lzX3NpZ3N1c3BlbmQpCi0JU0FWRV9TV0lUQ0hfU1RBQ0sKLQlwZWEJJXNwQChTV0lUQ0hfU1RBQ0tfU0laRSkKLQlqYnNyCWRvX3NpZ3N1c3BlbmQKLQlhZGRxbAkjNCwlc3AKLQlSRVNUT1JFX1NXSVRDSF9TVEFDSwotCXJ0cwotCi1FTlRSWShzeXNfcnRfc2lnc3VzcGVuZCkKLQlTQVZFX1NXSVRDSF9TVEFDSwotCXBlYQklc3BAKFNXSVRDSF9TVEFDS19TSVpFKQotCWpic3IJZG9fcnRfc2lnc3VzcGVuZAotCWFkZHFsCSM0LCVzcAotCVJFU1RPUkVfU1dJVENIX1NUQUNLCi0JcnRzCi0KIEVOVFJZKHN5c19zaWdyZXR1cm4pCiAJU0FWRV9TV0lUQ0hfU1RBQ0sKIAlqYnNyCWRvX3NpZ3JldHVybgpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrbm9tbXUva2VybmVsL3NpZ25hbC5jIGIvYXJjaC9tNjhrbm9tbXUva2VybmVsL3NpZ25hbC5jCmluZGV4IDVhYjZhMDQuLjM2YTgxYmIgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4a25vbW11L2tlcm5lbC9zaWduYWwuYworKysgYi9hcmNoL202OGtub21tdS9rZXJuZWwvc2lnbmFsLmMKQEAgLTUzLDY1ICs1MywzMCBAQAogCiB2b2lkIHJldF9mcm9tX3VzZXJfc2lnbmFsKHZvaWQpOwogdm9pZCByZXRfZnJvbV91c2VyX3J0X3NpZ25hbCh2b2lkKTsKLWFzbWxpbmthZ2UgaW50IGRvX3NpZ25hbChzaWdzZXRfdCAqb2xkc2V0LCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CiAKIC8qCiAgKiBBdG9taWNhbGx5IHN3YXAgaW4gdGhlIG5ldyBzaWduYWwgbWFzaywgYW5kIHdhaXQgZm9yIGEgc2lnbmFsLgogICovCi1hc21saW5rYWdlIGludCBkb19zaWdzdXNwZW5kKHN0cnVjdCBwdF9yZWdzICpyZWdzKQorYXNtbGlua2FnZSBpbnQKK3N5c19zaWdzdXNwZW5kKGludCB1bnVzZWQwLCBpbnQgdW51c2VkMSwgb2xkX3NpZ3NldF90IG1hc2spCiB7Ci0Jb2xkX3NpZ3NldF90IG1hc2sgPSByZWdzLT5kMzsKLQlzaWdzZXRfdCBzYXZlc2V0OwotCiAJbWFzayAmPSBfQkxPQ0tBQkxFOwogCXNwaW5fbG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOwotCXNhdmVzZXQgPSBjdXJyZW50LT5ibG9ja2VkOworCWN1cnJlbnQtPnNhdmVkX3NpZ21hc2sgPSBjdXJyZW50LT5ibG9ja2VkOwogCXNpZ2luaXRzZXQoJmN1cnJlbnQtPmJsb2NrZWQsIG1hc2spOwogCXJlY2FsY19zaWdwZW5kaW5nKCk7CiAJc3Bpbl91bmxvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKIAotCXJlZ3MtPmQwID0gLUVJTlRSOwotCXdoaWxlICgxKSB7Ci0JCWN1cnJlbnQtPnN0YXRlID0gVEFTS19JTlRFUlJVUFRJQkxFOwotCQlzY2hlZHVsZSgpOwotCQlpZiAoZG9fc2lnbmFsKCZzYXZlc2V0LCByZWdzKSkKLQkJCXJldHVybiAtRUlOVFI7Ci0JfQorCWN1cnJlbnQtPnN0YXRlID0gVEFTS19JTlRFUlJVUFRJQkxFOworCXNjaGVkdWxlKCk7CisJc2V0X3Jlc3RvcmVfc2lnbWFzaygpOworCisJcmV0dXJuIC1FUkVTVEFSVE5PSEFORDsKIH0KIAogYXNtbGlua2FnZSBpbnQKLWRvX3J0X3NpZ3N1c3BlbmQoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCi17Ci0Jc2lnc2V0X3QgKnVuZXdzZXQgPSAoc2lnc2V0X3QgKilyZWdzLT5kMTsKLQlzaXplX3Qgc2lnc2V0c2l6ZSA9IChzaXplX3QpcmVncy0+ZDI7Ci0Jc2lnc2V0X3Qgc2F2ZXNldCwgbmV3c2V0OwotCi0JLyogWFhYOiBEb24ndCBwcmVjbHVkZSBoYW5kbGluZyBkaWZmZXJlbnQgc2l6ZWQgc2lnc2V0X3Qncy4gICovCi0JaWYgKHNpZ3NldHNpemUgIT0gc2l6ZW9mKHNpZ3NldF90KSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlpZiAoY29weV9mcm9tX3VzZXIoJm5ld3NldCwgdW5ld3NldCwgc2l6ZW9mKG5ld3NldCkpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQlzaWdkZWxzZXRtYXNrKCZuZXdzZXQsIH5fQkxPQ0tBQkxFKTsKLQotCXNwaW5fbG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOwotCXNhdmVzZXQgPSBjdXJyZW50LT5ibG9ja2VkOwotCWN1cnJlbnQtPmJsb2NrZWQgPSBuZXdzZXQ7Ci0JcmVjYWxjX3NpZ3BlbmRpbmcoKTsKLQlzcGluX3VubG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOwotCi0JcmVncy0+ZDAgPSAtRUlOVFI7Ci0Jd2hpbGUgKDEpIHsKLQkJY3VycmVudC0+c3RhdGUgPSBUQVNLX0lOVEVSUlVQVElCTEU7Ci0JCXNjaGVkdWxlKCk7Ci0JCWlmIChkb19zaWduYWwoJnNhdmVzZXQsIHJlZ3MpKQotCQkJcmV0dXJuIC1FSU5UUjsKLQl9Ci19Ci0KLWFzbWxpbmthZ2UgaW50IAotc3lzX3NpZ2FjdGlvbihpbnQgc2lnLCBjb25zdCBzdHJ1Y3Qgb2xkX3NpZ2FjdGlvbiAqYWN0LAotCSAgICAgIHN0cnVjdCBvbGRfc2lnYWN0aW9uICpvYWN0KQorc3lzX3NpZ2FjdGlvbihpbnQgc2lnLCBjb25zdCBzdHJ1Y3Qgb2xkX3NpZ2FjdGlvbiBfX3VzZXIgKmFjdCwKKwkgICAgICBzdHJ1Y3Qgb2xkX3NpZ2FjdGlvbiBfX3VzZXIgKm9hY3QpCiB7CiAJc3RydWN0IGtfc2lnYWN0aW9uIG5ld19rYSwgb2xkX2thOwogCWludCByZXQ7CkBAIC0xMjAsMTAgKzg1LDEwIEBACiAJCW9sZF9zaWdzZXRfdCBtYXNrOwogCQlpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgYWN0LCBzaXplb2YoKmFjdCkpIHx8CiAJCSAgICBfX2dldF91c2VyKG5ld19rYS5zYS5zYV9oYW5kbGVyLCAmYWN0LT5zYV9oYW5kbGVyKSB8fAotCQkgICAgX19nZXRfdXNlcihuZXdfa2Euc2Euc2FfcmVzdG9yZXIsICZhY3QtPnNhX3Jlc3RvcmVyKSkKKwkJICAgIF9fZ2V0X3VzZXIobmV3X2thLnNhLnNhX3Jlc3RvcmVyLCAmYWN0LT5zYV9yZXN0b3JlcikgfHwKKwkJICAgIF9fZ2V0X3VzZXIobmV3X2thLnNhLnNhX2ZsYWdzLCAmYWN0LT5zYV9mbGFncykgfHwKKwkJICAgIF9fZ2V0X3VzZXIobWFzaywgJmFjdC0+c2FfbWFzaykpCiAJCQlyZXR1cm4gLUVGQVVMVDsKLQkJX19nZXRfdXNlcihuZXdfa2Euc2Euc2FfZmxhZ3MsICZhY3QtPnNhX2ZsYWdzKTsKLQkJX19nZXRfdXNlcihtYXNrLCAmYWN0LT5zYV9tYXNrKTsKIAkJc2lnaW5pdHNldCgmbmV3X2thLnNhLnNhX21hc2ssIG1hc2spOwogCX0KIApAQCAtMTMyLDE3ICs5NywxNyBAQAogCWlmICghcmV0ICYmIG9hY3QpIHsKIAkJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBvYWN0LCBzaXplb2YoKm9hY3QpKSB8fAogCQkgICAgX19wdXRfdXNlcihvbGRfa2Euc2Euc2FfaGFuZGxlciwgJm9hY3QtPnNhX2hhbmRsZXIpIHx8Ci0JCSAgICBfX3B1dF91c2VyKG9sZF9rYS5zYS5zYV9yZXN0b3JlciwgJm9hY3QtPnNhX3Jlc3RvcmVyKSkKKwkJICAgIF9fcHV0X3VzZXIob2xkX2thLnNhLnNhX3Jlc3RvcmVyLCAmb2FjdC0+c2FfcmVzdG9yZXIpIHx8CisJCSAgICBfX3B1dF91c2VyKG9sZF9rYS5zYS5zYV9mbGFncywgJm9hY3QtPnNhX2ZsYWdzKSB8fAorCQkgICAgX19wdXRfdXNlcihvbGRfa2Euc2Euc2FfbWFzay5zaWdbMF0sICZvYWN0LT5zYV9tYXNrKSkKIAkJCXJldHVybiAtRUZBVUxUOwotCQlfX3B1dF91c2VyKG9sZF9rYS5zYS5zYV9mbGFncywgJm9hY3QtPnNhX2ZsYWdzKTsKLQkJX19wdXRfdXNlcihvbGRfa2Euc2Euc2FfbWFzay5zaWdbMF0sICZvYWN0LT5zYV9tYXNrKTsKIAl9CiAKIAlyZXR1cm4gcmV0OwogfQogCiBhc21saW5rYWdlIGludAotc3lzX3NpZ2FsdHN0YWNrKGNvbnN0IHN0YWNrX3QgKnVzcywgc3RhY2tfdCAqdW9zcykKK3N5c19zaWdhbHRzdGFjayhjb25zdCBzdGFja190IF9fdXNlciAqdXNzLCBzdGFja190IF9fdXNlciAqdW9zcykKIHsKIAlyZXR1cm4gZG9fc2lnYWx0c3RhY2sodXNzLCB1b3NzLCByZHVzcCgpKTsKIH0KQEAgLTE1NywxMCArMTIyLDEwIEBACiAKIHN0cnVjdCBzaWdmcmFtZQogewotCWNoYXIgKnByZXRjb2RlOworCWNoYXIgX191c2VyICpwcmV0Y29kZTsKIAlpbnQgc2lnOwogCWludCBjb2RlOwotCXN0cnVjdCBzaWdjb250ZXh0ICpwc2M7CisJc3RydWN0IHNpZ2NvbnRleHQgX191c2VyICpwc2M7CiAJY2hhciByZXRjb2RlWzhdOwogCXVuc2lnbmVkIGxvbmcgZXh0cmFtYXNrW19OU0lHX1dPUkRTLTFdOwogCXN0cnVjdCBzaWdjb250ZXh0IHNjOwpAQCAtMTY4LDEwICsxMzMsMTAgQEAKIAogc3RydWN0IHJ0X3NpZ2ZyYW1lCiB7Ci0JY2hhciAqcHJldGNvZGU7CisJY2hhciBfX3VzZXIgKnByZXRjb2RlOwogCWludCBzaWc7Ci0Jc3RydWN0IHNpZ2luZm8gKnBpbmZvOwotCXZvaWQgKnB1YzsKKwlzdHJ1Y3Qgc2lnaW5mbyBfX3VzZXIgKnBpbmZvOworCXZvaWQgX191c2VyICpwdWM7CiAJY2hhciByZXRjb2RlWzhdOwogCXN0cnVjdCBzaWdpbmZvIGluZm87CiAJc3RydWN0IHVjb250ZXh0IHVjOwpAQCAtMTk4LDggKzE2Myw4IEBACiAJCWdvdG8gb3V0OwogCiAJICAgIF9fYXNtX18gdm9sYXRpbGUgKCIuY2hpcCA2OGsvNjg4ODFcblx0IgotCQkJICAgICAgImZtb3ZlbXggJTAsJS9mcDAtJS9mcDFcblx0IgotCQkJICAgICAgImZtb3ZlbWwgJTEsJS9mcGNyLyUvZnBzci8lL2ZwaWFyXG5cdCIKKwkJCSAgICAgICJmbW92ZW14ICUwLCUlZnAwLSUlZnAxXG5cdCIKKwkJCSAgICAgICJmbW92ZW1sICUxLCUlZnBjci8lJWZwc3IvJSVmcGlhclxuXHQiCiAJCQkgICAgICAiLmNoaXAgNjhrIgogCQkJICAgICAgOiAvKiBubyBvdXRwdXRzICovCiAJCQkgICAgICA6ICJtIiAoKnNjLT5zY19mcHJlZ3MpLCAibSIgKCpzYy0+c2NfZnBjbnRsKSk7CkBAIC0yMTgsNyArMTgzLDcgQEAKICNkZWZpbmUgdWNfZm9ybWF0dmVjCXVjX2ZpbGxlcltGUENPTlRFWFRfU0laRS80XQogI2RlZmluZSB1Y19leHRyYQl1Y19maWxsZXJbRlBDT05URVhUX1NJWkUvNCsxXQogCi1zdGF0aWMgaW5saW5lIGludCBydF9yZXN0b3JlX2ZwdV9zdGF0ZShzdHJ1Y3QgdWNvbnRleHQgKnVjKQorc3RhdGljIGlubGluZSBpbnQgcnRfcmVzdG9yZV9mcHVfc3RhdGUoc3RydWN0IHVjb250ZXh0IF9fdXNlciAqdWMpCiB7CiAJdW5zaWduZWQgY2hhciBmcHN0YXRlW0ZQQ09OVEVYVF9TSVpFXTsKIAlpbnQgY29udGV4dF9zaXplID0gMDsKQEAgLTIyOCw3ICsxOTMsNyBAQAogCWlmIChGUFVfSVNfRU1VKSB7CiAJCS8qIHJlc3RvcmUgZnB1IGNvbnRyb2wgcmVnaXN0ZXIgKi8KIAkJaWYgKF9fY29weV9mcm9tX3VzZXIoY3VycmVudC0+dGhyZWFkLmZwY250bCwKLQkJCQkmdWMtPnVjX21jb250ZXh0LmZwcmVncy5mX3BjciwgMTIpKQorCQkJCXVjLT51Y19tY29udGV4dC5mcHJlZ3MuZl9mcGNudGwsIDEyKSkKIAkJCWdvdG8gb3V0OwogCQkvKiByZXN0b3JlIGFsbCBvdGhlciBmcHUgcmVnaXN0ZXIgKi8KIAkJaWYgKF9fY29weV9mcm9tX3VzZXIoY3VycmVudC0+dGhyZWFkLmZwLApAQCAtMjM3LDcgKzIwMiw3IEBACiAJCXJldHVybiAwOwogCX0KIAotCWlmIChfX2dldF91c2VyKCoobG9uZyAqKWZwc3RhdGUsIChsb25nICopJnVjLT51Y19mcHN0YXRlKSkKKwlpZiAoX19nZXRfdXNlcigqKGxvbmcgKilmcHN0YXRlLCAobG9uZyBfX3VzZXIgKikmdWMtPnVjX2Zwc3RhdGUpKQogCQlnb3RvIG91dDsKIAlpZiAoZnBzdGF0ZVswXSkgewogCQljb250ZXh0X3NpemUgPSBmcHN0YXRlWzFdOwpAQCAtMjQ5LDE1ICsyMTQsMTUgQEAKIAkJICAgICBzaXplb2YoZnByZWdzKSkpCiAJCQlnb3RvIG91dDsKIAkJX19hc21fXyB2b2xhdGlsZSAoIi5jaGlwIDY4ay82ODg4MVxuXHQiCi0JCQkJICAiZm1vdmVteCAlMCwlL2ZwMC0lL2ZwN1xuXHQiCi0JCQkJICAiZm1vdmVtbCAlMSwlL2ZwY3IvJS9mcHNyLyUvZnBpYXJcblx0IgorCQkJCSAgImZtb3ZlbXggJTAsJSVmcDAtJSVmcDdcblx0IgorCQkJCSAgImZtb3ZlbWwgJTEsJSVmcGNyLyUlZnBzci8lJWZwaWFyXG5cdCIKIAkJCQkgICIuY2hpcCA2OGsiCiAJCQkJICA6IC8qIG5vIG91dHB1dHMgKi8KIAkJCQkgIDogIm0iICgqZnByZWdzLmZfZnByZWdzKSwKLQkJCQkgICAgIm0iIChmcHJlZ3MuZl9wY3IpKTsKKwkJCQkgICAgIm0iICgqZnByZWdzLmZfZnBjbnRsKSk7CiAJfQogCWlmIChjb250ZXh0X3NpemUgJiYKLQkgICAgX19jb3B5X2Zyb21fdXNlcihmcHN0YXRlICsgNCwgKGxvbmcgKikmdWMtPnVjX2Zwc3RhdGUgKyAxLAorCSAgICBfX2NvcHlfZnJvbV91c2VyKGZwc3RhdGUgKyA0LCAobG9uZyBfX3VzZXIgKikmdWMtPnVjX2Zwc3RhdGUgKyAxLAogCQkJICAgICBjb250ZXh0X3NpemUpKQogCQlnb3RvIG91dDsKIAlfX2FzbV9fIHZvbGF0aWxlICgiLmNoaXAgNjhrLzY4ODgxXG5cdCIKQEAgLTI3Miw3ICsyMzcsNyBAQAogI2VuZGlmCiAKIHN0YXRpYyBpbmxpbmUgaW50Ci1yZXN0b3JlX3NpZ2NvbnRleHQoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHN0cnVjdCBzaWdjb250ZXh0ICp1c2MsIHZvaWQgKmZwLAorcmVzdG9yZV9zaWdjb250ZXh0KHN0cnVjdCBwdF9yZWdzICpyZWdzLCBzdHJ1Y3Qgc2lnY29udGV4dCBfX3VzZXIgKnVzYywgdm9pZCBfX3VzZXIgKmZwLAogCQkgICBpbnQgKnBkMCkKIHsKIAlpbnQgZm9ybWF0dmVjOwpAQCAtMzEyLDEwICsyNzcsMTAgQEAKIAogc3RhdGljIGlubGluZSBpbnQKIHJ0X3Jlc3RvcmVfdWNvbnRleHQoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHN0cnVjdCBzd2l0Y2hfc3RhY2sgKnN3LAotCQkgICAgc3RydWN0IHVjb250ZXh0ICp1YywgaW50ICpwZDApCisJCSAgICBzdHJ1Y3QgdWNvbnRleHQgX191c2VyICp1YywgaW50ICpwZDApCiB7CiAJaW50IHRlbXA7Ci0JZ3JlZ190ICpncmVncyA9IHVjLT51Y19tY29udGV4dC5ncmVnczsKKwlncmVnX3QgX191c2VyICpncmVncyA9IHVjLT51Y19tY29udGV4dC5ncmVnczsKIAl1bnNpZ25lZCBsb25nIHVzcDsKIAlpbnQgZXJyOwogCkBAIC0zNjUsNyArMzMwLDcgQEAKIAlzdHJ1Y3Qgc3dpdGNoX3N0YWNrICpzdyA9IChzdHJ1Y3Qgc3dpdGNoX3N0YWNrICopICZfX3VudXNlZDsKIAlzdHJ1Y3QgcHRfcmVncyAqcmVncyA9IChzdHJ1Y3QgcHRfcmVncyAqKSAoc3cgKyAxKTsKIAl1bnNpZ25lZCBsb25nIHVzcCA9IHJkdXNwKCk7Ci0Jc3RydWN0IHNpZ2ZyYW1lICpmcmFtZSA9IChzdHJ1Y3Qgc2lnZnJhbWUgKikodXNwIC0gNCk7CisJc3RydWN0IHNpZ2ZyYW1lIF9fdXNlciAqZnJhbWUgPSAoc3RydWN0IHNpZ2ZyYW1lIF9fdXNlciAqKSh1c3AgLSA0KTsKIAlzaWdzZXRfdCBzZXQ7CiAJaW50IGQwOwogCkBAIC0zOTcsNyArMzYyLDcgQEAKIAlzdHJ1Y3Qgc3dpdGNoX3N0YWNrICpzdyA9IChzdHJ1Y3Qgc3dpdGNoX3N0YWNrICopICZfX3VudXNlZDsKIAlzdHJ1Y3QgcHRfcmVncyAqcmVncyA9IChzdHJ1Y3QgcHRfcmVncyAqKSAoc3cgKyAxKTsKIAl1bnNpZ25lZCBsb25nIHVzcCA9IHJkdXNwKCk7Ci0Jc3RydWN0IHJ0X3NpZ2ZyYW1lICpmcmFtZSA9IChzdHJ1Y3QgcnRfc2lnZnJhbWUgKikodXNwIC0gNCk7CisJc3RydWN0IHJ0X3NpZ2ZyYW1lIF9fdXNlciAqZnJhbWUgPSAoc3RydWN0IHJ0X3NpZ2ZyYW1lIF9fdXNlciAqKSh1c3AgLSA0KTsKIAlzaWdzZXRfdCBzZXQ7CiAJaW50IGQwOwogCkBAIC00NDMsMTcgKzQwOCwxNyBAQAogCWlmIChzYy0+c2NfZnBzdGF0ZVswXSkgewogCQlmcHVfdmVyc2lvbiA9IHNjLT5zY19mcHN0YXRlWzBdOwogCQlfX2FzbV9fIHZvbGF0aWxlICgiLmNoaXAgNjhrLzY4ODgxXG5cdCIKLQkJCQkgICJmbW92ZW14ICUvZnAwLSUvZnAxLCUwXG5cdCIKLQkJCQkgICJmbW92ZW1sICUvZnBjci8lL2Zwc3IvJS9mcGlhciwlMVxuXHQiCisJCQkJICAiZm1vdmVteCAlJWZwMC0lJWZwMSwlMFxuXHQiCisJCQkJICAiZm1vdmVtbCAlJWZwY3IvJSVmcHNyLyUlZnBpYXIsJTFcblx0IgogCQkJCSAgIi5jaGlwIDY4ayIKLQkJCQkgIDogLyogbm8gb3V0cHV0cyAqLwotCQkJCSAgOiAibSIgKCpzYy0+c2NfZnByZWdzKSwKLQkJCQkgICAgIm0iICgqc2MtPnNjX2ZwY250bCkKKwkJCQkgIDogIj1tIiAoKnNjLT5zY19mcHJlZ3MpLAorCQkJCSAgICAiPW0iICgqc2MtPnNjX2ZwY250bCkKKwkJCQkgIDogLyogbm8gaW5wdXRzICovCiAJCQkJICA6ICJtZW1vcnkiKTsKIAl9CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IHJ0X3NhdmVfZnB1X3N0YXRlKHN0cnVjdCB1Y29udGV4dCAqdWMsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQorc3RhdGljIGlubGluZSBpbnQgcnRfc2F2ZV9mcHVfc3RhdGUoc3RydWN0IHVjb250ZXh0IF9fdXNlciAqdWMsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogCXVuc2lnbmVkIGNoYXIgZnBzdGF0ZVtGUENPTlRFWFRfU0laRV07CiAJaW50IGNvbnRleHRfc2l6ZSA9IDA7CkBAIC00NjEsNyArNDI2LDcgQEAKIAogCWlmIChGUFVfSVNfRU1VKSB7CiAJCS8qIHNhdmUgZnB1IGNvbnRyb2wgcmVnaXN0ZXIgKi8KLQkJZXJyIHw9IGNvcHlfdG9fdXNlcigmdWMtPnVjX21jb250ZXh0LmZwcmVncy5mX3BjciwKKwkJZXJyIHw9IGNvcHlfdG9fdXNlcih1Yy0+dWNfbWNvbnRleHQuZnByZWdzLmZfcGNudGwsCiAJCQkJY3VycmVudC0+dGhyZWFkLmZwY250bCwgMTIpOwogCQkvKiBzYXZlIGFsbCBvdGhlciBmcHUgcmVnaXN0ZXIgKi8KIAkJZXJyIHw9IGNvcHlfdG9fdXNlcih1Yy0+dWNfbWNvbnRleHQuZnByZWdzLmZfZnByZWdzLApAQCAtNDc0LDI0ICs0MzksMjQgQEAKIAkJCSAgIi5jaGlwIDY4ayIKIAkJCSAgOiA6ICJtIiAoKmZwc3RhdGUpIDogIm1lbW9yeSIpOwogCi0JZXJyIHw9IF9fcHV0X3VzZXIoKihsb25nICopZnBzdGF0ZSwgKGxvbmcgKikmdWMtPnVjX2Zwc3RhdGUpOworCWVyciB8PSBfX3B1dF91c2VyKCoobG9uZyAqKWZwc3RhdGUsIChsb25nIF9fdXNlciAqKSZ1Yy0+dWNfZnBzdGF0ZSk7CiAJaWYgKGZwc3RhdGVbMF0pIHsKIAkJZnByZWdzZXRfdCBmcHJlZ3M7CiAJCWNvbnRleHRfc2l6ZSA9IGZwc3RhdGVbMV07CiAJCWZwdV92ZXJzaW9uID0gZnBzdGF0ZVswXTsKIAkJX19hc21fXyB2b2xhdGlsZSAoIi5jaGlwIDY4ay82ODg4MVxuXHQiCi0JCQkJICAiZm1vdmVteCAlL2ZwMC0lL2ZwNywlMFxuXHQiCi0JCQkJICAiZm1vdmVtbCAlL2ZwY3IvJS9mcHNyLyUvZnBpYXIsJTFcblx0IgorCQkJCSAgImZtb3ZlbXggJSVmcDAtJSVmcDcsJTBcblx0IgorCQkJCSAgImZtb3ZlbWwgJSVmcGNyLyUlZnBzci8lJWZwaWFyLCUxXG5cdCIKIAkJCQkgICIuY2hpcCA2OGsiCi0JCQkJICA6IC8qIG5vIG91dHB1dHMgKi8KLQkJCQkgIDogIm0iICgqZnByZWdzLmZfZnByZWdzKSwKLQkJCQkgICAgIm0iIChmcHJlZ3MuZl9wY3IpCisJCQkJICA6ICI9bSIgKCpmcHJlZ3MuZl9mcHJlZ3MpLAorCQkJCSAgICAiPW0iICgqZnByZWdzLmZfZnBjbnRsKQorCQkJCSAgOiAvKiBubyBpbnB1dHMgKi8KIAkJCQkgIDogIm1lbW9yeSIpOwogCQllcnIgfD0gY29weV90b191c2VyKCZ1Yy0+dWNfbWNvbnRleHQuZnByZWdzLCAmZnByZWdzLAogCQkJCSAgICBzaXplb2YoZnByZWdzKSk7CiAJfQogCWlmIChjb250ZXh0X3NpemUpCi0JCWVyciB8PSBjb3B5X3RvX3VzZXIoKGxvbmcgKikmdWMtPnVjX2Zwc3RhdGUgKyAxLCBmcHN0YXRlICsgNCwKKwkJZXJyIHw9IGNvcHlfdG9fdXNlcigobG9uZyBfX3VzZXIgKikmdWMtPnVjX2Zwc3RhdGUgKyAxLCBmcHN0YXRlICsgNCwKIAkJCQkgICAgY29udGV4dF9zaXplKTsKIAlyZXR1cm4gZXJyOwogfQpAQCAtNTE2LDEwICs0ODEsMTAgQEAKICNlbmRpZgogfQogCi1zdGF0aWMgaW5saW5lIGludCBydF9zZXR1cF91Y29udGV4dChzdHJ1Y3QgdWNvbnRleHQgKnVjLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3N0YXRpYyBpbmxpbmUgaW50IHJ0X3NldHVwX3Vjb250ZXh0KHN0cnVjdCB1Y29udGV4dCBfX3VzZXIgKnVjLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAlzdHJ1Y3Qgc3dpdGNoX3N0YWNrICpzdyA9IChzdHJ1Y3Qgc3dpdGNoX3N0YWNrICopcmVncyAtIDE7Ci0JZ3JlZ190ICpncmVncyA9IHVjLT51Y19tY29udGV4dC5ncmVnczsKKwlncmVnX3QgX191c2VyICpncmVncyA9IHVjLT51Y19tY29udGV4dC5ncmVnczsKIAlpbnQgZXJyID0gMDsKIAogCWVyciB8PSBfX3B1dF91c2VyKE1DT05URVhUX1ZFUlNJT04sICZ1Yy0+dWNfbWNvbnRleHQudmVyc2lvbik7CkBAIC01NDcsNyArNTEyLDcgQEAKIAlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgKgorc3RhdGljIGlubGluZSB2b2lkIF9fdXNlciAqCiBnZXRfc2lnZnJhbWUoc3RydWN0IGtfc2lnYWN0aW9uICprYSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHNpemVfdCBmcmFtZV9zaXplKQogewogCXVuc2lnbmVkIGxvbmcgdXNwOwpAQCAtNTYwLDEzICs1MjUsMTMgQEAKIAkJaWYgKCFzYXNfc3NfZmxhZ3ModXNwKSkKIAkJCXVzcCA9IGN1cnJlbnQtPnNhc19zc19zcCArIGN1cnJlbnQtPnNhc19zc19zaXplOwogCX0KLQlyZXR1cm4gKHZvaWQgKikoKHVzcCAtIGZyYW1lX3NpemUpICYgLThVTCk7CisJcmV0dXJuICh2b2lkIF9fdXNlciAqKSgodXNwIC0gZnJhbWVfc2l6ZSkgJiAtOFVMKTsKIH0KIAotc3RhdGljIHZvaWQgc2V0dXBfZnJhbWUgKGludCBzaWcsIHN0cnVjdCBrX3NpZ2FjdGlvbiAqa2EsCitzdGF0aWMgaW50IHNldHVwX2ZyYW1lIChpbnQgc2lnLCBzdHJ1Y3Qga19zaWdhY3Rpb24gKmthLAogCQkJIHNpZ3NldF90ICpzZXQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewotCXN0cnVjdCBzaWdmcmFtZSAqZnJhbWU7CisJc3RydWN0IHNpZ2ZyYW1lIF9fdXNlciAqZnJhbWU7CiAJc3RydWN0IHNpZ2NvbnRleHQgY29udGV4dDsKIAlpbnQgZXJyID0gMDsKIApAQCAtNjE3LDE3ICs1ODIsMTcgQEAKIAkJdHJlZ3MtPnBjID0gcmVncy0+cGM7CiAJCXRyZWdzLT5zciA9IHJlZ3MtPnNyOwogCX0KLQlyZXR1cm47CisJcmV0dXJuIGVycjsKIAogZ2l2ZV9zaWdzZWd2OgogCWZvcmNlX3NpZ3NlZ3Yoc2lnLCBjdXJyZW50KTsKIAlnb3RvIGFkanVzdF9zdGFjazsKIH0KIAotc3RhdGljIHZvaWQgc2V0dXBfcnRfZnJhbWUgKGludCBzaWcsIHN0cnVjdCBrX3NpZ2FjdGlvbiAqa2EsIHNpZ2luZm9fdCAqaW5mbywKK3N0YXRpYyBpbnQgc2V0dXBfcnRfZnJhbWUgKGludCBzaWcsIHN0cnVjdCBrX3NpZ2FjdGlvbiAqa2EsIHNpZ2luZm9fdCAqaW5mbywKIAkJCSAgICBzaWdzZXRfdCAqc2V0LCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKLQlzdHJ1Y3QgcnRfc2lnZnJhbWUgKmZyYW1lOworCXN0cnVjdCBydF9zaWdmcmFtZSBfX3VzZXIgKmZyYW1lOwogCWludCBlcnIgPSAwOwogCiAJZnJhbWUgPSBnZXRfc2lnZnJhbWUoa2EsIHJlZ3MsIHNpemVvZigqZnJhbWUpKTsKQEAgLTY0NCw4ICs2MDksOCBAQAogCiAJLyogQ3JlYXRlIHRoZSB1Y29udGV4dC4gICovCiAJZXJyIHw9IF9fcHV0X3VzZXIoMCwgJmZyYW1lLT51Yy51Y19mbGFncyk7Ci0JZXJyIHw9IF9fcHV0X3VzZXIoMCwgJmZyYW1lLT51Yy51Y19saW5rKTsKLQllcnIgfD0gX19wdXRfdXNlcigodm9pZCAqKWN1cnJlbnQtPnNhc19zc19zcCwKKwllcnIgfD0gX19wdXRfdXNlcihOVUxMLCAmZnJhbWUtPnVjLnVjX2xpbmspOworCWVyciB8PSBfX3B1dF91c2VyKCh2b2lkIF9fdXNlciAqKWN1cnJlbnQtPnNhc19zc19zcCwKIAkJCSAgJmZyYW1lLT51Yy51Y19zdGFjay5zc19zcCk7CiAJZXJyIHw9IF9fcHV0X3VzZXIoc2FzX3NzX2ZsYWdzKHJkdXNwKCkpLAogCQkJICAmZnJhbWUtPnVjLnVjX3N0YWNrLnNzX2ZsYWdzKTsKQEAgLTY4MSw3ICs2NDYsNyBAQAogCQl0cmVncy0+cGMgPSByZWdzLT5wYzsKIAkJdHJlZ3MtPnNyID0gcmVncy0+c3I7CiAJfQotCXJldHVybjsKKwlyZXR1cm4gZXJyOwogCiBnaXZlX3NpZ3NlZ3Y6CiAJZm9yY2Vfc2lnc2VndihzaWcsIGN1cnJlbnQpOwpAQCAtNzI4LDYgKzY5Myw3IEBACiBoYW5kbGVfc2lnbmFsKGludCBzaWcsIHN0cnVjdCBrX3NpZ2FjdGlvbiAqa2EsIHNpZ2luZm9fdCAqaW5mbywKIAkgICAgICBzaWdzZXRfdCAqb2xkc2V0LCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKKwlpbnQgZXJyOwogCS8qIGFyZSB3ZSBmcm9tIGEgc3lzdGVtIGNhbGw/ICovCiAJaWYgKHJlZ3MtPm9yaWdfZDAgPj0gMCkKIAkJLyogSWYgc28sIGNoZWNrIHN5c3RlbSBjYWxsIHJlc3RhcnRpbmcuLiAqLwpAQCAtNzM1LDEyICs3MDEsMTIgQEAKIAogCS8qIHNldCB1cCB0aGUgc3RhY2sgZnJhbWUgKi8KIAlpZiAoa2EtPnNhLnNhX2ZsYWdzICYgU0FfU0lHSU5GTykKLQkJc2V0dXBfcnRfZnJhbWUoc2lnLCBrYSwgaW5mbywgb2xkc2V0LCByZWdzKTsKKwkJZXJyID0gc2V0dXBfcnRfZnJhbWUoc2lnLCBrYSwgaW5mbywgb2xkc2V0LCByZWdzKTsKIAllbHNlCi0JCXNldHVwX2ZyYW1lKHNpZywga2EsIG9sZHNldCwgcmVncyk7CisJCWVyciA9IHNldHVwX2ZyYW1lKHNpZywga2EsIG9sZHNldCwgcmVncyk7CiAKLQlpZiAoa2EtPnNhLnNhX2ZsYWdzICYgU0FfT05FU0hPVCkKLQkJa2EtPnNhLnNhX2hhbmRsZXIgPSBTSUdfREZMOworCWlmIChlcnIpCisJCXJldHVybjsKIAogCXNwaW5fbG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOwogCXNpZ29yc2V0cygmY3VycmVudC0+YmxvY2tlZCwmY3VycmVudC0+YmxvY2tlZCwma2EtPnNhLnNhX21hc2spOwpAQCAtNzQ4LDYgKzcxNCw4IEBACiAJCXNpZ2FkZHNldCgmY3VycmVudC0+YmxvY2tlZCxzaWcpOwogCXJlY2FsY19zaWdwZW5kaW5nKCk7CiAJc3Bpbl91bmxvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKKworCWNsZWFyX3RocmVhZF9mbGFnKFRJRl9SRVNUT1JFX1NJR01BU0spOwogfQogCiAvKgpAQCAtNzU1LDExICs3MjMsMTIgQEAKICAqIHdhbnQgdG8gaGFuZGxlLiBUaHVzIHlvdSBjYW5ub3Qga2lsbCBpbml0IGV2ZW4gd2l0aCBhIFNJR0tJTEwgZXZlbiBieQogICogbWlzdGFrZS4KICAqLwotYXNtbGlua2FnZSBpbnQgZG9fc2lnbmFsKHNpZ3NldF90ICpvbGRzZXQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQorYXNtbGlua2FnZSB2b2lkIGRvX3NpZ25hbChzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAlzdHJ1Y3Qga19zaWdhY3Rpb24ga2E7CiAJc2lnaW5mb190IGluZm87CiAJaW50IHNpZ25yOworCXNpZ3NldF90ICpvbGRzZXQ7CiAKIAkvKgogCSAqIFdlIHdhbnQgdGhlIGNvbW1vbiBjYXNlIHRvIGdvIGZhc3QsIHdoaWNoCkBAIC03NjgsMTYgKzczNywxOCBAQAogCSAqIGlmIHNvLgogCSAqLwogCWlmICghdXNlcl9tb2RlKHJlZ3MpKQotCQlyZXR1cm4gMTsKKwkJcmV0dXJuOwogCi0JaWYgKCFvbGRzZXQpCisJaWYgKHRlc3RfdGhyZWFkX2ZsYWcoVElGX1JFU1RPUkVfU0lHTUFTSykpCisJCW9sZHNldCA9ICZjdXJyZW50LT5zYXZlZF9zaWdtYXNrOworCWVsc2UKIAkJb2xkc2V0ID0gJmN1cnJlbnQtPmJsb2NrZWQ7CiAKIAlzaWduciA9IGdldF9zaWduYWxfdG9fZGVsaXZlcigmaW5mbywgJmthLCByZWdzLCBOVUxMKTsKIAlpZiAoc2lnbnIgPiAwKSB7CiAJCS8qIFdoZWUhICBBY3R1YWxseSBkZWxpdmVyIHRoZSBzaWduYWwuICAqLwogCQloYW5kbGVfc2lnbmFsKHNpZ25yLCAma2EsICZpbmZvLCBvbGRzZXQsIHJlZ3MpOwotCQlyZXR1cm4gMTsKKwkJcmV0dXJuOwogCX0KIAogCS8qIERpZCB3ZSBjb21lIGZyb20gYSBzeXN0ZW0gY2FsbD8gKi8KQEAgLTc4NSw1ICs3NTYsMTAgQEAKIAkJLyogUmVzdGFydCB0aGUgc3lzdGVtIGNhbGwgLSBubyBoYW5kbGVycyBwcmVzZW50ICovCiAJCWhhbmRsZV9yZXN0YXJ0KHJlZ3MsIE5VTEwsIDApOwogCX0KLQlyZXR1cm4gMDsKKworCS8qIElmIHRoZXJlJ3Mgbm8gc2lnbmFsIHRvIGRlbGl2ZXIsIHdlIGp1c3QgcmVzdG9yZSB0aGUgc2F2ZWQgbWFzay4gICovCisJaWYgKHRlc3RfdGhyZWFkX2ZsYWcoVElGX1JFU1RPUkVfU0lHTUFTSykpIHsKKwkJY2xlYXJfdGhyZWFkX2ZsYWcoVElGX1JFU1RPUkVfU0lHTUFTSyk7CisJCXNpZ3Byb2NtYXNrKFNJR19TRVRNQVNLLCAmY3VycmVudC0+c2F2ZWRfc2lnbWFzaywgTlVMTCk7CisJfQogfQpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrbm9tbXUvcGxhdGZvcm0vNjgzMjgvZW50cnkuUyBiL2FyY2gvbTY4a25vbW11L3BsYXRmb3JtLzY4MzI4L2VudHJ5LlMKaW5kZXggMjcyNDFlMS4uMjQwYTdhNiAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrbm9tbXUvcGxhdGZvcm0vNjgzMjgvZW50cnkuUworKysgYi9hcmNoL202OGtub21tdS9wbGF0Zm9ybS82ODMyOC9lbnRyeS5TCkBAIC0xMDYsNiArMTA2LDcgQEAKIAltb3ZlbAklc3AsJWQxCQkJLyogZ2V0IHRocmVhZF9pbmZvIHBvaW50ZXIgKi8KIAlhbmRsCSMtVEhSRUFEX1NJWkUsJWQxCiAJbW92ZWwJJWQxLCVhMgorMToKIAltb3ZlCSVhMkAoVElfRkxBR1MpLCVkMQkvKiB0aHJlYWRfaW5mby0+ZmxhZ3MgKi8KIAlhbmRsCSNfVElGX1dPUktfTUFTSywlZDEKIAlqbmUJTHdvcmtfdG9fZG8KQEAgLTEyMCwxMyArMTIxLDExIEBACiAJc3VicWwJIzQsJXNwCQkJLyogZHVtbXkgcmV0dXJuIGFkZHJlc3MqLwogCVNBVkVfU1dJVENIX1NUQUNLCiAJcGVhCSVzcEAoU1dJVENIX1NUQUNLX1NJWkUpCi0JY2xybAklc3BALQogCWJzcncJZG9fc2lnbmFsCi0JYWRkcWwJIzgsJXNwCisJYWRkcWwJIzQsJXNwCiAJUkVTVE9SRV9TV0lUQ0hfU1RBQ0sKIAlhZGRxbAkjNCwlc3AKLUxyZXR1cm46Ci0JUkVTVE9SRV9BTEwKKwlqcmEJMWIKIAogLyoKICAqIFRoaXMgaXMgdGhlIG1haW4gaW50ZXJydXB0IGhhbmRsZXIsIHJlc3BvbnNpYmxlIGZvciBjYWxsaW5nIHByb2Nlc3NfaW50KCkKZGlmZiAtLWdpdCBhL2FyY2gvbTY4a25vbW11L3BsYXRmb3JtLzY4MzYwL2VudHJ5LlMgYi9hcmNoL202OGtub21tdS9wbGF0Zm9ybS82ODM2MC9lbnRyeS5TCmluZGV4IGMxMzFjNmUuLjhhMjg3ODggMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4a25vbW11L3BsYXRmb3JtLzY4MzYwL2VudHJ5LlMKKysrIGIvYXJjaC9tNjhrbm9tbXUvcGxhdGZvcm0vNjgzNjAvZW50cnkuUwpAQCAtMTAyLDYgKzEwMiw3IEBACiAJbW92ZWwJJXNwLCVkMQkJCS8qIGdldCB0aHJlYWRfaW5mbyBwb2ludGVyICovCiAJYW5kbAkjLVRIUkVBRF9TSVpFLCVkMQogCW1vdmVsCSVkMSwlYTIKKzE6CiAJbW92ZQklYTJAKFRJX0ZMQUdTKSwlZDEJLyogdGhyZWFkX2luZm8tPmZsYWdzICovCiAJYW5kbAkjX1RJRl9XT1JLX01BU0ssJWQxCiAJam5lCUx3b3JrX3RvX2RvCkBAIC0xMTYsMTMgKzExNywxMSBAQAogCXN1YnFsCSM0LCVzcAkJCS8qIGR1bW15IHJldHVybiBhZGRyZXNzKi8KIAlTQVZFX1NXSVRDSF9TVEFDSwogCXBlYQklc3BAKFNXSVRDSF9TVEFDS19TSVpFKQotCWNscmwJJXNwQC0KIAlic3J3CWRvX3NpZ25hbAotCWFkZHFsCSM4LCVzcAorCWFkZHFsCSM0LCVzcAogCVJFU1RPUkVfU1dJVENIX1NUQUNLCiAJYWRkcWwJIzQsJXNwCi1McmV0dXJuOgotCVJFU1RPUkVfQUxMCisJanJhCTFiCiAKIC8qCiAgKiBUaGlzIGlzIHRoZSBtYWluIGludGVycnVwdCBoYW5kbGVyLCByZXNwb25zaWJsZSBmb3IgY2FsbGluZyBkb19JUlEoKQpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrbm9tbXUvcGxhdGZvcm0vY29sZGZpcmUvZW50cnkuUyBiL2FyY2gvbTY4a25vbW11L3BsYXRmb3JtL2NvbGRmaXJlL2VudHJ5LlMKaW5kZXggNWU5MmJlZC4uZTFkZWJjOCAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrbm9tbXUvcGxhdGZvcm0vY29sZGZpcmUvZW50cnkuUworKysgYi9hcmNoL202OGtub21tdS9wbGF0Zm9ybS9jb2xkZmlyZS9lbnRyeS5TCkBAIC0xNjcsMTIgKzE2NywxMSBAQAogCXN1YnFsCSM0LCVzcAkJCS8qIGR1bW15IHJldHVybiBhZGRyZXNzICovCiAJU0FWRV9TV0lUQ0hfU1RBQ0sKIAlwZWEJJXNwQChTV0lUQ0hfU1RBQ0tfU0laRSkKLQljbHJsCSVzcEAtCiAJanNyCWRvX3NpZ25hbAotCWFkZHFsCSM4LCVzcAorCWFkZHFsCSM0LCVzcAogCVJFU1RPUkVfU1dJVENIX1NUQUNLCiAJYWRkcWwJIzQsJXNwCi0Jam1wCUxyZXR1cm4KKwlqbXAJTHVzZXJfcmV0dXJuCiAKIC8qCiAgKiBUaGlzIGlzIHRoZSBnZW5lcmljIGludGVycnVwdCBoYW5kbGVyIChmb3IgYWxsIGhhcmR3YXJlIGludGVycnVwdApkaWZmIC0tZ2l0IGEvYXJjaC9taWNyb2JsYXplL0tjb25maWcgYi9hcmNoL21pY3JvYmxhemUvS2NvbmZpZwppbmRleCAzODdkNWZmLi41ZjUwMThhIDEwMDY0NAotLS0gYS9hcmNoL21pY3JvYmxhemUvS2NvbmZpZworKysgYi9hcmNoL21pY3JvYmxhemUvS2NvbmZpZwpAQCAtMTQsNyArMTQsNyBAQAogCXNlbGVjdCBIQVZFX0RNQV9BUElfREVCVUcKIAlzZWxlY3QgVFJBQ0lOR19TVVBQT1JUCiAJc2VsZWN0IE9GCi0Jc2VsZWN0IE9GX0ZMQVRUUkVFCisJc2VsZWN0IE9GX0VBUkxZX0ZMQVRUUkVFCiAKIGNvbmZpZyBTV0FQCiAJZGVmX2Jvb2wgbgpkaWZmIC0tZ2l0IGEvYXJjaC9taWNyb2JsYXplL0tjb25maWcuZGVidWcgYi9hcmNoL21pY3JvYmxhemUvS2NvbmZpZy5kZWJ1ZwppbmRleCBlNjZlMjVjLi4wMTJlMzc3IDEwMDY0NAotLS0gYS9hcmNoL21pY3JvYmxhemUvS2NvbmZpZy5kZWJ1ZworKysgYi9hcmNoL21pY3JvYmxhemUvS2NvbmZpZy5kZWJ1ZwpAQCAtMjMsOCArMjMsNCBAQAogCSAgVGhpcyBvcHRpb24gdHVybnMgb24vb2ZmIGhlYXJ0IGJlYXQga2VybmVsIGZ1bmN0aW9uYWxpdHkuCiAJICBGaXJzdCBHUElPIG5vZGUgaXMgdGFrZW4uCiAKLWNvbmZpZyBERUJVR19CT09UTUVNCi0JZGVwZW5kcyBvbiBERUJVR19LRVJORUwKLQlib29sICJEZWJ1ZyBCT09UTUVNIGluaXRpYWxpemF0aW9uIgotCiBlbmRtZW51CmRpZmYgLS1naXQgYS9hcmNoL21pY3JvYmxhemUvTWFrZWZpbGUgYi9hcmNoL21pY3JvYmxhemUvTWFrZWZpbGUKaW5kZXggMTVmMWYxZC4uNmY0MzJlNiAxMDA2NDQKLS0tIGEvYXJjaC9taWNyb2JsYXplL01ha2VmaWxlCisrKyBiL2FyY2gvbWljcm9ibGF6ZS9NYWtlZmlsZQpAQCAtMTcsNyArMTcsNyBAQAogIyBUaGUgdmFyaW91cyBDT05GSUdfWElMSU5YIGNwdSBmZWF0dXJlcyBvcHRpb25zIGFyZSBpbnRlZ2VycyAwLzEvMi4uLgogIyByYXRoZXIgdGhhbiBib29scyB5L24KIAotIyBXb3JrIG91dCBIVyBtdWx0aXBsZXIgc3VwcG9ydC4gIFRoaXMgaXMgaWNreS4KKyMgV29yayBvdXQgSFcgbXVsdGlwbGVyIHN1cHBvcnQuIFRoaXMgaXMgdHJpY2t5LgogIyAxLiBTcGFydGFuMiBoYXMgbm8gSFcgbXVsdGlwbGVycy4KICMgMi4gTWljcm9CbGF6ZSB2My54IGFsd2F5cyB1c2VzIHRoZW0sIGV4Y2VwdCBpbiBTcGFydGFuIDIKICMgMy4gQWxsIG90aGVyIEZQR2EvQ1BVIHZlciBjb21ib3MsIHdlIGNhbiB0cnVzdCB0aGUgQ09ORklHXyBzZXR0aW5ncwpkaWZmIC0tZ2l0IGEvYXJjaC9taWNyb2JsYXplL2Jvb3QvTWFrZWZpbGUgYi9hcmNoL21pY3JvYmxhemUvYm9vdC9NYWtlZmlsZQppbmRleCBiZTAxZDc4Li40YzRlNThlIDEwMDY0NAotLS0gYS9hcmNoL21pY3JvYmxhemUvYm9vdC9NYWtlZmlsZQorKysgYi9hcmNoL21pY3JvYmxhemUvYm9vdC9NYWtlZmlsZQpAQCAtMTAsOSArMTAsNiBAQAogCiBPQkpDT1BZRkxBR1MgOj0gLU8gYmluYXJ5CiAKLSMgV2hlcmUgdGhlIERUUyBmaWxlcyBsaXZlCi1kdHN0cmVlICAgICAgICAgOj0gJChzcmN0cmVlKS8kKHNyYykvZHRzCi0KICMgRW5zdXJlIHN5c3RlbS5kdGIgZXhpc3RzCiAkKG9iaikvbGlua2VkX2R0Yi5vOiAkKG9iaikvc3lzdGVtLmR0YgogCkBAIC01MSwxNCArNDgsMTEgQEAKIAkkKGNhbGwgaWZfY2hhbmdlZCxzdHJpcCkKIAlAZWNobyAnS2VybmVsOiAkQCBpcyByZWFkeScgJyAoIydgY2F0IC52ZXJzaW9uYCcpJwogCi0jIFJ1bGUgdG8gYnVpbGQgZGV2aWNlIHRyZWUgYmxvYnMKLURUQyA9ICQob2JqdHJlZSkvc2NyaXB0cy9kdGMvZHRjCiAKICMgUnVsZSB0byBidWlsZCBkZXZpY2UgdHJlZSBibG9icwotcXVpZXRfY21kX2R0YyA9IERUQyAgICAgJEAKLQljbWRfZHRjID0gJChEVEMpIC1PIGR0YiAtbyAkKG9iaikvJCouZHRiIC1iIDAgLXAgMTAyNCAkKGR0c3RyZWUpLyQqLmR0cworRFRDX0ZMQUdTIDo9IC1wIDEwMjQKIAotJChvYmopLyUuZHRiOiAkKGR0c3RyZWUpLyUuZHRzIEZPUkNFCi0JJChjYWxsIGlmX2NoYW5nZWQsZHRjKQorJChvYmopLyUuZHRiOiAkKHNyYykvZHRzLyUuZHRzIEZPUkNFCisJJChjYWxsIGNtZCxkdGMpCiAKIGNsZWFuLWZpbGVzICs9ICouZHRiIHNpbXBsZUltYWdlLioudW5zdHJpcCBsaW51eC5iaW4udWIKZGlmZiAtLWdpdCBhL2FyY2gvbWljcm9ibGF6ZS9jb25maWdzL21tdV9kZWZjb25maWcgYi9hcmNoL21pY3JvYmxhemUvY29uZmlncy9tbXVfZGVmY29uZmlnCmluZGV4IDhiNDIyYjEuLmFiOGZiZTcgMTAwNjQ0Ci0tLSBhL2FyY2gvbWljcm9ibGF6ZS9jb25maWdzL21tdV9kZWZjb25maWcKKysrIGIvYXJjaC9taWNyb2JsYXplL2NvbmZpZ3MvbW11X2RlZmNvbmZpZwpAQCAtNjYsNSArNjYsNCBAQAogQ09ORklHX0RFQlVHX0lORk89eQogIyBDT05GSUdfUkNVX0NQVV9TVEFMTF9ERVRFQ1RPUiBpcyBub3Qgc2V0CiBDT05GSUdfRUFSTFlfUFJJTlRLPXkKLUNPTkZJR19ERUJVR19CT09UTUVNPXkKICMgQ09ORklHX0NSWVBUT19BTlNJX0NQUk5HIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvbWljcm9ibGF6ZS9pbmNsdWRlL2FzbS9wcm9tLmggYi9hcmNoL21pY3JvYmxhemUvaW5jbHVkZS9hc20vcHJvbS5oCmluZGV4IGJkYzM4MzEuLjJlNzJhZjAgMTAwNjQ0Ci0tLSBhL2FyY2gvbWljcm9ibGF6ZS9pbmNsdWRlL2FzbS9wcm9tLmgKKysrIGIvYXJjaC9taWNyb2JsYXplL2luY2x1ZGUvYXNtL3Byb20uaApAQCAtNjQsOSArNjQsNiBAQAogLyogQ1BVIE9GIG5vZGUgbWF0Y2hpbmcgKi8KIHN0cnVjdCBkZXZpY2Vfbm9kZSAqb2ZfZ2V0X2NwdV9ub2RlKGludCBjcHUsIHVuc2lnbmVkIGludCAqdGhyZWFkKTsKIAotLyogR2V0IHRoZSBNQUMgYWRkcmVzcyAqLwotZXh0ZXJuIGNvbnN0IHZvaWQgKm9mX2dldF9tYWNfYWRkcmVzcyhzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKTsKLQogLyoqCiAgKiBvZl9pcnFfbWFwX3BjaSAtIFJlc29sdmUgdGhlIGludGVycnVwdCBmb3IgYSBQQ0kgZGV2aWNlCiAgKiBAcGRldjoJdGhlIGRldmljZSB3aG9zZSBpbnRlcnJ1cHQgaXMgdG8gYmUgcmVzb2x2ZWQKZGlmZiAtLWdpdCBhL2FyY2gvbWljcm9ibGF6ZS9pbmNsdWRlL2FzbS9wdnIuaCBiL2FyY2gvbWljcm9ibGF6ZS9pbmNsdWRlL2FzbS9wdnIuaAppbmRleCAzN2RiOTZhLi5hMTBiZWM2IDEwMDY0NAotLS0gYS9hcmNoL21pY3JvYmxhemUvaW5jbHVkZS9hc20vcHZyLmgKKysrIGIvYXJjaC9taWNyb2JsYXplL2luY2x1ZGUvYXNtL3B2ci5oCkBAIC0xLDkgKzEsOSBAQAogLyoKICAqIFN1cHBvcnQgZm9yIHRoZSBNaWNyb0JsYXplIFBWUiAoUHJvY2Vzc29yIFZlcnNpb24gUmVnaXN0ZXIpCiAgKgotICogQ29weXJpZ2h0IChDKSAyMDA5IE1pY2hhbCBTaW1layA8bW9uc3RyQG1vbnN0ci5ldT4KKyAqIENvcHlyaWdodCAoQykgMjAwOSAtIDIwMTEgTWljaGFsIFNpbWVrIDxtb25zdHJAbW9uc3RyLmV1PgogICogQ29weXJpZ2h0IChDKSAyMDA3IEpvaG4gV2lsbGlhbXMgPGpvaG4ud2lsbGlhbXNAcGV0YWxvZ2l4LmNvbT4KLSAqIENvcHlyaWdodCAoQykgMjAwNyAtIDIwMDkgUGV0YUxvZ2l4CisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgLSAyMDExIFBldGFMb2dpeAogICoKICAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwKICAqIFB1YmxpYyBMaWNlbnNlLiBTZWUgdGhlIGZpbGUgQ09QWUlORyBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcwpAQCAtNDYsMTEgKzQ2LDExIEBACiAjZGVmaW5lIFBWUjJfSV9MTUJfTUFTSwkJCTB4MTAwMDAwMDAKICNkZWZpbmUgUFZSMl9JTlRFUlJVUFRfSVNfRURHRV9NQVNLCTB4MDgwMDAwMDAKICNkZWZpbmUgUFZSMl9FREdFX0lTX1BPU0lUSVZFX01BU0sJMHgwNDAwMDAwMAotI2RlZmluZSBQVlIyX0RfUExCX01BU0sJCQkweDAyMDAwMDAwCS8qIG5ldyAqLwotI2RlZmluZSBQVlIyX0lfUExCX01BU0sJCQkweDAxMDAwMDAwCS8qIG5ldyAqLwotI2RlZmluZSBQVlIyX0lOVEVSQ09OTkVDVAkJMHgwMDgwMDAwMAkvKiBuZXcgKi8KLSNkZWZpbmUgUFZSMl9VU0VfRVhURU5EX0ZTTAkJMHgwMDA4MDAwMAkvKiBuZXcgKi8KLSNkZWZpbmUgUFZSMl9VU0VfRlNMX0VYQwkJMHgwMDA0MDAwMAkvKiBuZXcgKi8KKyNkZWZpbmUgUFZSMl9EX1BMQl9NQVNLCQkJMHgwMjAwMDAwMCAvKiBuZXcgKi8KKyNkZWZpbmUgUFZSMl9JX1BMQl9NQVNLCQkJMHgwMTAwMDAwMCAvKiBuZXcgKi8KKyNkZWZpbmUgUFZSMl9JTlRFUkNPTk5FQ1QJCTB4MDA4MDAwMDAgLyogbmV3ICovCisjZGVmaW5lIFBWUjJfVVNFX0VYVEVORF9GU0wJCTB4MDAwODAwMDAgLyogbmV3ICovCisjZGVmaW5lIFBWUjJfVVNFX0ZTTF9FWEMJCTB4MDAwNDAwMDAgLyogbmV3ICovCiAjZGVmaW5lIFBWUjJfVVNFX01TUl9JTlNUUgkJMHgwMDAyMDAwMAogI2RlZmluZSBQVlIyX1VTRV9QQ01QX0lOU1RSCQkweDAwMDEwMDAwCiAjZGVmaW5lIFBWUjJfQVJFQV9PUFRJTUlTRUQJCTB4MDAwMDgwMDAKQEAgLTU5LDcgKzU5LDcgQEAKICNkZWZpbmUgUFZSMl9VU0VfSFdfTVVMX01BU0sJCTB4MDAwMDEwMDAKICNkZWZpbmUgUFZSMl9VU0VfRlBVX01BU0sJCTB4MDAwMDA4MDAKICNkZWZpbmUgUFZSMl9VU0VfTVVMNjRfTUFTSwkJMHgwMDAwMDQwMAotI2RlZmluZSBQVlIyX1VTRV9GUFUyX01BU0sJCTB4MDAwMDAyMDAJLyogbmV3ICovCisjZGVmaW5lIFBWUjJfVVNFX0ZQVTJfTUFTSwkJMHgwMDAwMDIwMCAvKiBuZXcgKi8KICNkZWZpbmUgUFZSMl9VU0VfSVBMQkVYQyAJCTB4MDAwMDAxMDAKICNkZWZpbmUgUFZSMl9VU0VfRFBMQkVYQwkJMHgwMDAwMDA4MAogI2RlZmluZSBQVlIyX09QQ09ERV8weDBfSUxMX01BU0sJMHgwMDAwMDA0MApAQCAtMTIyLDk2ICsxMjIsMTAzIEBACiAKIAogLyogUFZSIGFjY2VzcyBtYWNyb3MgKi8KLSNkZWZpbmUgUFZSX0lTX0ZVTEwocHZyKQkJKHB2ci5wdnJbMF0gJiBQVlIwX1BWUl9GVUxMX01BU0spCi0jZGVmaW5lIFBWUl9VU0VfQkFSUkVMKHB2cikJCShwdnIucHZyWzBdICYgUFZSMF9VU0VfQkFSUkVMX01BU0spCi0jZGVmaW5lIFBWUl9VU0VfRElWKHB2cikJCShwdnIucHZyWzBdICYgUFZSMF9VU0VfRElWX01BU0spCi0jZGVmaW5lIFBWUl9VU0VfSFdfTVVMKHB2cikJCShwdnIucHZyWzBdICYgUFZSMF9VU0VfSFdfTVVMX01BU0spCi0jZGVmaW5lIFBWUl9VU0VfRlBVKHB2cikJCShwdnIucHZyWzBdICYgUFZSMF9VU0VfRlBVX01BU0spCi0jZGVmaW5lIFBWUl9VU0VfRlBVMihwdnIpCQkocHZyLnB2clsyXSAmIFBWUjJfVVNFX0ZQVTJfTUFTSykKLSNkZWZpbmUgUFZSX1VTRV9JQ0FDSEUocHZyKQkJKHB2ci5wdnJbMF0gJiBQVlIwX1VTRV9JQ0FDSEVfTUFTSykKLSNkZWZpbmUgUFZSX1VTRV9EQ0FDSEUocHZyKQkJKHB2ci5wdnJbMF0gJiBQVlIwX1VTRV9EQ0FDSEVfTUFTSykKLSNkZWZpbmUgUFZSX1ZFUlNJT04ocHZyKQkoKHB2ci5wdnJbMF0gJiBQVlIwX1ZFUlNJT05fTUFTSykgPj4gOCkKLSNkZWZpbmUgUFZSX1VTRVIxKHB2cikJCQkocHZyLnB2clswXSAmIFBWUjBfVVNFUjFfTUFTSykKLSNkZWZpbmUgUFZSX1VTRVIyKHB2cikJCQkocHZyLnB2clsxXSAmIFBWUjFfVVNFUjJfTUFTSykKKyNkZWZpbmUgUFZSX0lTX0ZVTEwoX3B2cikJKF9wdnIucHZyWzBdICYgUFZSMF9QVlJfRlVMTF9NQVNLKQorI2RlZmluZSBQVlJfVVNFX0JBUlJFTChfcHZyKQkoX3B2ci5wdnJbMF0gJiBQVlIwX1VTRV9CQVJSRUxfTUFTSykKKyNkZWZpbmUgUFZSX1VTRV9ESVYoX3B2cikJKF9wdnIucHZyWzBdICYgUFZSMF9VU0VfRElWX01BU0spCisjZGVmaW5lIFBWUl9VU0VfSFdfTVVMKF9wdnIpCShfcHZyLnB2clswXSAmIFBWUjBfVVNFX0hXX01VTF9NQVNLKQorI2RlZmluZSBQVlJfVVNFX0ZQVShfcHZyKQkoX3B2ci5wdnJbMF0gJiBQVlIwX1VTRV9GUFVfTUFTSykKKyNkZWZpbmUgUFZSX1VTRV9GUFUyKF9wdnIpCShfcHZyLnB2clsyXSAmIFBWUjJfVVNFX0ZQVTJfTUFTSykKKyNkZWZpbmUgUFZSX1VTRV9JQ0FDSEUoX3B2cikJKF9wdnIucHZyWzBdICYgUFZSMF9VU0VfSUNBQ0hFX01BU0spCisjZGVmaW5lIFBWUl9VU0VfRENBQ0hFKF9wdnIpCShfcHZyLnB2clswXSAmIFBWUjBfVVNFX0RDQUNIRV9NQVNLKQorI2RlZmluZSBQVlJfVkVSU0lPTihfcHZyKQkoKF9wdnIucHZyWzBdICYgUFZSMF9WRVJTSU9OX01BU0spID4+IDgpCisjZGVmaW5lIFBWUl9VU0VSMShfcHZyKQkJKF9wdnIucHZyWzBdICYgUFZSMF9VU0VSMV9NQVNLKQorI2RlZmluZSBQVlJfVVNFUjIoX3B2cikJCShfcHZyLnB2clsxXSAmIFBWUjFfVVNFUjJfTUFTSykKIAotI2RlZmluZSBQVlJfRF9PUEIocHZyKQkJCShwdnIucHZyWzJdICYgUFZSMl9EX09QQl9NQVNLKQotI2RlZmluZSBQVlJfRF9MTUIocHZyKQkJCShwdnIucHZyWzJdICYgUFZSMl9EX0xNQl9NQVNLKQotI2RlZmluZSBQVlJfSV9PUEIocHZyKQkJCShwdnIucHZyWzJdICYgUFZSMl9JX09QQl9NQVNLKQotI2RlZmluZSBQVlJfSV9MTUIocHZyKQkJCShwdnIucHZyWzJdICYgUFZSMl9JX0xNQl9NQVNLKQotI2RlZmluZSBQVlJfSU5URVJSVVBUX0lTX0VER0UocHZyKSBcCi0JCQkocHZyLnB2clsyXSAmIFBWUjJfSU5URVJSVVBUX0lTX0VER0VfTUFTSykKLSNkZWZpbmUgUFZSX0VER0VfSVNfUE9TSVRJVkUocHZyKSBcCi0JCQkocHZyLnB2clsyXSAmIFBWUjJfRURHRV9JU19QT1NJVElWRV9NQVNLKQotI2RlZmluZSBQVlJfVVNFX01TUl9JTlNUUihwdnIpCQkocHZyLnB2clsyXSAmIFBWUjJfVVNFX01TUl9JTlNUUikKLSNkZWZpbmUgUFZSX1VTRV9QQ01QX0lOU1RSKHB2cikJCShwdnIucHZyWzJdICYgUFZSMl9VU0VfUENNUF9JTlNUUikKLSNkZWZpbmUgUFZSX0FSRUFfT1BUSU1JU0VEKHB2cikJCShwdnIucHZyWzJdICYgUFZSMl9BUkVBX09QVElNSVNFRCkKLSNkZWZpbmUgUFZSX1VTRV9NVUw2NChwdnIpCQkocHZyLnB2clsyXSAmIFBWUjJfVVNFX01VTDY0X01BU0spCi0jZGVmaW5lIFBWUl9PUENPREVfMHgwX0lMTEVHQUwocHZyKSBcCi0JCQkocHZyLnB2clsyXSAmIFBWUjJfT1BDT0RFXzB4MF9JTExfTUFTSykKLSNkZWZpbmUgUFZSX1VOQUxJR05FRF9FWENFUFRJT04ocHZyKSBcCi0JCQkocHZyLnB2clsyXSAmIFBWUjJfVU5BTElHTkVEX0VYQ19NQVNLKQotI2RlZmluZSBQVlJfSUxMX09QQ09ERV9FWENFUFRJT04ocHZyKSBcCi0JCQkocHZyLnB2clsyXSAmIFBWUjJfSUxMX09QQ09ERV9FWENfTUFTSykKLSNkZWZpbmUgUFZSX0lPUEJfQlVTX0VYQ0VQVElPTihwdnIpIFwKLQkJCShwdnIucHZyWzJdICYgUFZSMl9JT1BCX0JVU19FWENfTUFTSykKLSNkZWZpbmUgUFZSX0RPUEJfQlVTX0VYQ0VQVElPTihwdnIpIFwKLQkJCShwdnIucHZyWzJdICYgUFZSMl9ET1BCX0JVU19FWENfTUFTSykKLSNkZWZpbmUgUFZSX0RJVl9aRVJPX0VYQ0VQVElPTihwdnIpIFwKLQkJCShwdnIucHZyWzJdICYgUFZSMl9ESVZfWkVST19FWENfTUFTSykKLSNkZWZpbmUgUFZSX0ZQVV9FWENFUFRJT04ocHZyKQkJKHB2ci5wdnJbMl0gJiBQVlIyX0ZQVV9FWENfTUFTSykKLSNkZWZpbmUgUFZSX0ZTTF9FWENFUFRJT04ocHZyKQkJKHB2ci5wdnJbMl0gJiBQVlIyX1VTRV9FWFRFTkRfRlNMKQorI2RlZmluZSBQVlJfRF9PUEIoX3B2cikJCShfcHZyLnB2clsyXSAmIFBWUjJfRF9PUEJfTUFTSykKKyNkZWZpbmUgUFZSX0RfTE1CKF9wdnIpCQkoX3B2ci5wdnJbMl0gJiBQVlIyX0RfTE1CX01BU0spCisjZGVmaW5lIFBWUl9JX09QQihfcHZyKQkJKF9wdnIucHZyWzJdICYgUFZSMl9JX09QQl9NQVNLKQorI2RlZmluZSBQVlJfSV9MTUIoX3B2cikJCShfcHZyLnB2clsyXSAmIFBWUjJfSV9MTUJfTUFTSykKKyNkZWZpbmUgUFZSX0lOVEVSUlVQVF9JU19FREdFKF9wdnIpIFwKKwkJCShfcHZyLnB2clsyXSAmIFBWUjJfSU5URVJSVVBUX0lTX0VER0VfTUFTSykKKyNkZWZpbmUgUFZSX0VER0VfSVNfUE9TSVRJVkUoX3B2cikgXAorCQkJKF9wdnIucHZyWzJdICYgUFZSMl9FREdFX0lTX1BPU0lUSVZFX01BU0spCisjZGVmaW5lIFBWUl9VU0VfTVNSX0lOU1RSKF9wdnIpCQkoX3B2ci5wdnJbMl0gJiBQVlIyX1VTRV9NU1JfSU5TVFIpCisjZGVmaW5lIFBWUl9VU0VfUENNUF9JTlNUUihfcHZyKQkoX3B2ci5wdnJbMl0gJiBQVlIyX1VTRV9QQ01QX0lOU1RSKQorI2RlZmluZSBQVlJfQVJFQV9PUFRJTUlTRUQoX3B2cikJKF9wdnIucHZyWzJdICYgUFZSMl9BUkVBX09QVElNSVNFRCkKKyNkZWZpbmUgUFZSX1VTRV9NVUw2NChfcHZyKQkJKF9wdnIucHZyWzJdICYgUFZSMl9VU0VfTVVMNjRfTUFTSykKKyNkZWZpbmUgUFZSX09QQ09ERV8weDBfSUxMRUdBTChfcHZyKSBcCisJCQkoX3B2ci5wdnJbMl0gJiBQVlIyX09QQ09ERV8weDBfSUxMX01BU0spCisjZGVmaW5lIFBWUl9VTkFMSUdORURfRVhDRVBUSU9OKF9wdnIpIFwKKwkJCShfcHZyLnB2clsyXSAmIFBWUjJfVU5BTElHTkVEX0VYQ19NQVNLKQorI2RlZmluZSBQVlJfSUxMX09QQ09ERV9FWENFUFRJT04oX3B2cikgXAorCQkJKF9wdnIucHZyWzJdICYgUFZSMl9JTExfT1BDT0RFX0VYQ19NQVNLKQorI2RlZmluZSBQVlJfSU9QQl9CVVNfRVhDRVBUSU9OKF9wdnIpIFwKKwkJCShfcHZyLnB2clsyXSAmIFBWUjJfSU9QQl9CVVNfRVhDX01BU0spCisjZGVmaW5lIFBWUl9ET1BCX0JVU19FWENFUFRJT04oX3B2cikgXAorCQkJKF9wdnIucHZyWzJdICYgUFZSMl9ET1BCX0JVU19FWENfTUFTSykKKyNkZWZpbmUgUFZSX0RJVl9aRVJPX0VYQ0VQVElPTihfcHZyKSBcCisJCQkoX3B2ci5wdnJbMl0gJiBQVlIyX0RJVl9aRVJPX0VYQ19NQVNLKQorI2RlZmluZSBQVlJfRlBVX0VYQ0VQVElPTihfcHZyKQkJKF9wdnIucHZyWzJdICYgUFZSMl9GUFVfRVhDX01BU0spCisjZGVmaW5lIFBWUl9GU0xfRVhDRVBUSU9OKF9wdnIpCQkoX3B2ci5wdnJbMl0gJiBQVlIyX1VTRV9FWFRFTkRfRlNMKQogCi0jZGVmaW5lIFBWUl9ERUJVR19FTkFCTEVEKHB2cikJCShwdnIucHZyWzNdICYgUFZSM19ERUJVR19FTkFCTEVEX01BU0spCi0jZGVmaW5lIFBWUl9OVU1CRVJfT0ZfUENfQlJLKHB2cikgXAotCQkJKChwdnIucHZyWzNdICYgUFZSM19OVU1CRVJfT0ZfUENfQlJLX01BU0spID4+IDI1KQotI2RlZmluZSBQVlJfTlVNQkVSX09GX1JEX0FERFJfQlJLKHB2cikgXAotCQkJKChwdnIucHZyWzNdICYgUFZSM19OVU1CRVJfT0ZfUkRfQUREUl9CUktfTUFTSykgPj4gMTkpCi0jZGVmaW5lIFBWUl9OVU1CRVJfT0ZfV1JfQUREUl9CUksocHZyKSBcCi0JCQkoKHB2ci5wdnJbM10gJiBQVlIzX05VTUJFUl9PRl9XUl9BRERSX0JSS19NQVNLKSA+PiAxMykKLSNkZWZpbmUgUFZSX0ZTTF9MSU5LUyhwdnIpCSgocHZyLnB2clszXSAmIFBWUjNfRlNMX0xJTktTX01BU0spID4+IDcpCisjZGVmaW5lIFBWUl9ERUJVR19FTkFCTEVEKF9wdnIpCQkoX3B2ci5wdnJbM10gJiBQVlIzX0RFQlVHX0VOQUJMRURfTUFTSykKKyNkZWZpbmUgUFZSX05VTUJFUl9PRl9QQ19CUksoX3B2cikgXAorCQkJKChfcHZyLnB2clszXSAmIFBWUjNfTlVNQkVSX09GX1BDX0JSS19NQVNLKSA+PiAyNSkKKyNkZWZpbmUgUFZSX05VTUJFUl9PRl9SRF9BRERSX0JSSyhfcHZyKSBcCisJCQkoKF9wdnIucHZyWzNdICYgUFZSM19OVU1CRVJfT0ZfUkRfQUREUl9CUktfTUFTSykgPj4gMTkpCisjZGVmaW5lIFBWUl9OVU1CRVJfT0ZfV1JfQUREUl9CUksoX3B2cikgXAorCQkJKChfcHZyLnB2clszXSAmIFBWUjNfTlVNQkVSX09GX1dSX0FERFJfQlJLX01BU0spID4+IDEzKQorI2RlZmluZSBQVlJfRlNMX0xJTktTKF9wdnIpCSgoX3B2ci5wdnJbM10gJiBQVlIzX0ZTTF9MSU5LU19NQVNLKSA+PiA3KQogCi0jZGVmaW5lIFBWUl9JQ0FDSEVfQUREUl9UQUdfQklUUyhwdnIpIFwKLQkJCSgocHZyLnB2cls0XSAmIFBWUjRfSUNBQ0hFX0FERFJfVEFHX0JJVFNfTUFTSykgPj4gMjYpCi0jZGVmaW5lIFBWUl9JQ0FDSEVfVVNFX0ZTTChwdnIpCQkocHZyLnB2cls0XSAmIFBWUjRfSUNBQ0hFX1VTRV9GU0xfTUFTSykKLSNkZWZpbmUgUFZSX0lDQUNIRV9BTExPV19XUihwdnIpCShwdnIucHZyWzRdICYgUFZSNF9JQ0FDSEVfQUxMT1dfV1JfTUFTSykKLSNkZWZpbmUgUFZSX0lDQUNIRV9MSU5FX0xFTihwdnIpIFwKLQkJCSgxIDw8ICgocHZyLnB2cls0XSAmIFBWUjRfSUNBQ0hFX0xJTkVfTEVOX01BU0spID4+IDIxKSkKLSNkZWZpbmUgUFZSX0lDQUNIRV9CWVRFX1NJWkUocHZyKSBcCi0JCQkoMSA8PCAoKHB2ci5wdnJbNF0gJiBQVlI0X0lDQUNIRV9CWVRFX1NJWkVfTUFTSykgPj4gMTYpKQorI2RlZmluZSBQVlJfSUNBQ0hFX0FERFJfVEFHX0JJVFMoX3B2cikgXAorCQkoKF9wdnIucHZyWzRdICYgUFZSNF9JQ0FDSEVfQUREUl9UQUdfQklUU19NQVNLKSA+PiAyNikKKyNkZWZpbmUgUFZSX0lDQUNIRV9VU0VfRlNMKF9wdnIpIFwKKwkJKF9wdnIucHZyWzRdICYgUFZSNF9JQ0FDSEVfVVNFX0ZTTF9NQVNLKQorI2RlZmluZSBQVlJfSUNBQ0hFX0FMTE9XX1dSKF9wdnIpIFwKKwkJKF9wdnIucHZyWzRdICYgUFZSNF9JQ0FDSEVfQUxMT1dfV1JfTUFTSykKKyNkZWZpbmUgUFZSX0lDQUNIRV9MSU5FX0xFTihfcHZyKSBcCisJCSgxIDw8ICgoX3B2ci5wdnJbNF0gJiBQVlI0X0lDQUNIRV9MSU5FX0xFTl9NQVNLKSA+PiAyMSkpCisjZGVmaW5lIFBWUl9JQ0FDSEVfQllURV9TSVpFKF9wdnIpIFwKKwkJKDEgPDwgKChfcHZyLnB2cls0XSAmIFBWUjRfSUNBQ0hFX0JZVEVfU0laRV9NQVNLKSA+PiAxNikpCiAKLSNkZWZpbmUgUFZSX0RDQUNIRV9BRERSX1RBR19CSVRTKHB2cikgXAotCQkJKChwdnIucHZyWzVdICYgUFZSNV9EQ0FDSEVfQUREUl9UQUdfQklUU19NQVNLKSA+PiAyNikKLSNkZWZpbmUgUFZSX0RDQUNIRV9VU0VfRlNMKHB2cikJCShwdnIucHZyWzVdICYgUFZSNV9EQ0FDSEVfVVNFX0ZTTF9NQVNLKQotI2RlZmluZSBQVlJfRENBQ0hFX0FMTE9XX1dSKHB2cikJKHB2ci5wdnJbNV0gJiBQVlI1X0RDQUNIRV9BTExPV19XUl9NQVNLKQorI2RlZmluZSBQVlJfRENBQ0hFX0FERFJfVEFHX0JJVFMoX3B2cikgXAorCQkJKChfcHZyLnB2cls1XSAmIFBWUjVfRENBQ0hFX0FERFJfVEFHX0JJVFNfTUFTSykgPj4gMjYpCisjZGVmaW5lIFBWUl9EQ0FDSEVfVVNFX0ZTTChfcHZyKQkoX3B2ci5wdnJbNV0gJiBQVlI1X0RDQUNIRV9VU0VfRlNMX01BU0spCisjZGVmaW5lIFBWUl9EQ0FDSEVfQUxMT1dfV1IoX3B2cikgXAorCQkJKF9wdnIucHZyWzVdICYgUFZSNV9EQ0FDSEVfQUxMT1dfV1JfTUFTSykKIC8qIEZJWE1FIHR3byBzaGlmdHMgb24gb25lIGxpbmUgbmVlZHMgYW55IGNvbW1lbnQgKi8KLSNkZWZpbmUgUFZSX0RDQUNIRV9MSU5FX0xFTihwdnIpIFwKLQkJCSgxIDw8ICgocHZyLnB2cls1XSAmIFBWUjVfRENBQ0hFX0xJTkVfTEVOX01BU0spID4+IDIxKSkKLSNkZWZpbmUgUFZSX0RDQUNIRV9CWVRFX1NJWkUocHZyKSBcCi0JCQkoMSA8PCAoKHB2ci5wdnJbNV0gJiBQVlI1X0RDQUNIRV9CWVRFX1NJWkVfTUFTSykgPj4gMTYpKQorI2RlZmluZSBQVlJfRENBQ0hFX0xJTkVfTEVOKF9wdnIpIFwKKwkJKDEgPDwgKChfcHZyLnB2cls1XSAmIFBWUjVfRENBQ0hFX0xJTkVfTEVOX01BU0spID4+IDIxKSkKKyNkZWZpbmUgUFZSX0RDQUNIRV9CWVRFX1NJWkUoX3B2cikgXAorCQkoMSA8PCAoKF9wdnIucHZyWzVdICYgUFZSNV9EQ0FDSEVfQllURV9TSVpFX01BU0spID4+IDE2KSkKIAotI2RlZmluZSBQVlJfRENBQ0hFX1VTRV9XUklURUJBQ0socHZyKSBcCi0JCQkoKHB2ci5wdnJbNV0gJiBQVlI1X0RDQUNIRV9VU0VfV1JJVEVCQUNLKSA+PiAxNCkKKyNkZWZpbmUgUFZSX0RDQUNIRV9VU0VfV1JJVEVCQUNLKF9wdnIpIFwKKwkJCSgoX3B2ci5wdnJbNV0gJiBQVlI1X0RDQUNIRV9VU0VfV1JJVEVCQUNLKSA+PiAxNCkKIAotI2RlZmluZSBQVlJfSUNBQ0hFX0JBU0VBRERSKHB2cikJKHB2ci5wdnJbNl0gJiBQVlI2X0lDQUNIRV9CQVNFQUREUl9NQVNLKQotI2RlZmluZSBQVlJfSUNBQ0hFX0hJR0hBRERSKHB2cikJKHB2ci5wdnJbN10gJiBQVlI3X0lDQUNIRV9ISUdIQUREUl9NQVNLKQorI2RlZmluZSBQVlJfSUNBQ0hFX0JBU0VBRERSKF9wdnIpIFwKKwkJCShfcHZyLnB2cls2XSAmIFBWUjZfSUNBQ0hFX0JBU0VBRERSX01BU0spCisjZGVmaW5lIFBWUl9JQ0FDSEVfSElHSEFERFIoX3B2cikgXAorCQkJKF9wdnIucHZyWzddICYgUFZSN19JQ0FDSEVfSElHSEFERFJfTUFTSykKKyNkZWZpbmUgUFZSX0RDQUNIRV9CQVNFQUREUihfcHZyKSBcCisJCQkoX3B2ci5wdnJbOF0gJiBQVlI4X0RDQUNIRV9CQVNFQUREUl9NQVNLKQorI2RlZmluZSBQVlJfRENBQ0hFX0hJR0hBRERSKF9wdnIpIFwKKwkJCShfcHZyLnB2cls5XSAmIFBWUjlfRENBQ0hFX0hJR0hBRERSX01BU0spCiAKLSNkZWZpbmUgUFZSX0RDQUNIRV9CQVNFQUREUihwdnIpCShwdnIucHZyWzhdICYgUFZSOF9EQ0FDSEVfQkFTRUFERFJfTUFTSykKLSNkZWZpbmUgUFZSX0RDQUNIRV9ISUdIQUREUihwdnIpCShwdnIucHZyWzldICYgUFZSOV9EQ0FDSEVfSElHSEFERFJfTUFTSykKKyNkZWZpbmUgUFZSX1RBUkdFVF9GQU1JTFkoX3B2cikgXAorCQkJKChfcHZyLnB2clsxMF0gJiBQVlIxMF9UQVJHRVRfRkFNSUxZX01BU0spID4+IDI0KQogCi0jZGVmaW5lIFBWUl9UQVJHRVRfRkFNSUxZKHB2cikJKChwdnIucHZyWzEwXSAmIFBWUjEwX1RBUkdFVF9GQU1JTFlfTUFTSykgPj4gMjQpCi0KLSNkZWZpbmUgUFZSX01TUl9SRVNFVF9WQUxVRShwdnIpIFwKLQkJCQkocHZyLnB2clsxMV0gJiBQVlIxMV9NU1JfUkVTRVRfVkFMVUVfTUFTSykKKyNkZWZpbmUgUFZSX01TUl9SRVNFVF9WQUxVRShfcHZyKSBcCisJCQkoX3B2ci5wdnJbMTFdICYgUFZSMTFfTVNSX1JFU0VUX1ZBTFVFX01BU0spCiAKIC8qIG1tdSAqLwotI2RlZmluZSBQVlJfVVNFX01NVShwdnIpCSgocHZyLnB2clsxMV0gJiBQVlIxMV9VU0VfTU1VKSA+PiAzMCkKLSNkZWZpbmUgUFZSX01NVV9JVExCX1NJWkUocHZyKQkocHZyLnB2clsxMV0gJiBQVlIxMV9NTVVfSVRMQl9TSVpFKQotI2RlZmluZSBQVlJfTU1VX0RUTEJfU0laRShwdnIpCShwdnIucHZyWzExXSAmIFBWUjExX01NVV9EVExCX1NJWkUpCi0jZGVmaW5lIFBWUl9NTVVfVExCX0FDQ0VTUyhwdnIpCShwdnIucHZyWzExXSAmIFBWUjExX01NVV9UTEJfQUNDRVNTKQotI2RlZmluZSBQVlJfTU1VX1pPTkVTKHB2cikJKHB2ci5wdnJbMTFdICYgUFZSMTFfTU1VX1pPTkVTKQorI2RlZmluZSBQVlJfVVNFX01NVShfcHZyKQkJKChfcHZyLnB2clsxMV0gJiBQVlIxMV9VU0VfTU1VKSA+PiAzMCkKKyNkZWZpbmUgUFZSX01NVV9JVExCX1NJWkUoX3B2cikJCShfcHZyLnB2clsxMV0gJiBQVlIxMV9NTVVfSVRMQl9TSVpFKQorI2RlZmluZSBQVlJfTU1VX0RUTEJfU0laRShfcHZyKQkJKF9wdnIucHZyWzExXSAmIFBWUjExX01NVV9EVExCX1NJWkUpCisjZGVmaW5lIFBWUl9NTVVfVExCX0FDQ0VTUyhfcHZyKQkoX3B2ci5wdnJbMTFdICYgUFZSMTFfTU1VX1RMQl9BQ0NFU1MpCisjZGVmaW5lIFBWUl9NTVVfWk9ORVMoX3B2cikJCShfcHZyLnB2clsxMV0gJiBQVlIxMV9NTVVfWk9ORVMpCiAKIC8qIGVuZGlhbiAqLwotI2RlZmluZSBQVlJfRU5ESUFOKHB2cikJKHB2ci5wdnJbMF0gJiBQVlIwX0VOREkpCisjZGVmaW5lIFBWUl9FTkRJQU4oX3B2cikJKF9wdnIucHZyWzBdICYgUFZSMF9FTkRJKQogCiBpbnQgY3B1X2hhc19wdnIodm9pZCk7CiB2b2lkIGdldF9wdnIoc3RydWN0IHB2cl9zICpwdnIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9taWNyb2JsYXplL2tlcm5lbC9jcHUvY3B1aW5mby5jIGIvYXJjaC9taWNyb2JsYXplL2tlcm5lbC9jcHUvY3B1aW5mby5jCmluZGV4IDg3Yzc5ZmEuLjJjMzA5ZmMgMTAwNjQ0Ci0tLSBhL2FyY2gvbWljcm9ibGF6ZS9rZXJuZWwvY3B1L2NwdWluZm8uYworKysgYi9hcmNoL21pY3JvYmxhemUva2VybmVsL2NwdS9jcHVpbmZvLmMKQEAgLTMyLDYgKzMyLDcgQEAKIAl7IjcuMzAuYSIsIDB4MTB9LAogCXsiNy4zMC5iIiwgMHgxMX0sCiAJeyI4LjAwLmEiLCAweDEyfSwKKwl7IjguMDAuYiIsIDB4MTN9LAogCXtOVUxMLCAwfSwKIH07CiAKZGlmZiAtLWdpdCBhL2FyY2gvbWljcm9ibGF6ZS9rZXJuZWwvZW50cnkuUyBiL2FyY2gvbWljcm9ibGF6ZS9rZXJuZWwvZW50cnkuUwppbmRleCA4MTkyMzhiLi40MWMzMGNkIDEwMDY0NAotLS0gYS9hcmNoL21pY3JvYmxhemUva2VybmVsL2VudHJ5LlMKKysrIGIvYXJjaC9taWNyb2JsYXplL2tlcm5lbC9lbnRyeS5TCkBAIC0yODcsMjUgKzI4Nyw0NCBAQAogICogYXJlIG1hc2tlZC4gVGhpcyBpcyBuaWNlLCBtZWFucyB3ZSBkb24ndCBoYXZlIHRvIENMSSBiZWZvcmUgc3RhdGUgc2F2ZQogICovCiBDX0VOVFJZKF91c2VyX2V4Y2VwdGlvbik6Ci0JYWRkaQlyMTQsIHIxNCwgNAkvKiByZXR1cm4gYWRkcmVzcyBpcyA0IGJ5dGUgYWZ0ZXIgY2FsbCAqLwogCXN3aQlyMSwgcjAsIFRPUEhZUyhQRVJfQ1BVKEVOVFJZX1NQKSkgLyogc2F2ZSBzdGFjayAqLworCWFkZGkJcjE0LCByMTQsIDQJLyogcmV0dXJuIGFkZHJlc3MgaXMgNCBieXRlIGFmdGVyIGNhbGwgKi8KIAorCW1mcwlyMSwgcm1zcgorCW5vcAorCWFuZGkJcjEsIHIxLCBNU1JfVU1TCisJYm5laQlyMSwgMWYKKworLyogS2VybmVsLW1vZGUgc3RhdGUgc2F2ZSAtIGtlcm5lbCBleGVjdmUgKi8KKwlsd2kJcjEsIHIwLCBUT1BIWVMoUEVSX0NQVShFTlRSWV9TUCkpOyAvKiBSZWxvYWQga2VybmVsIHN0YWNrLXB0ciovCisJdG9waHlzKHIxLHIxKTsKKworCWFkZGlrCXIxLCByMSwgLVNUQVRFX1NBVkVfU0laRTsgLyogTWFrZSByb29tIG9uIHRoZSBzdGFjay4gKi8KKwlTQVZFX1JFR1MKKworCXN3aQlyMSwgcjEsIFBUTyArIFBUX01PREU7IC8qIHB0X3JlZ3MgLT4ga2VybmVsIG1vZGUgKi8KKwlicmlkCTJmOworCW5vcDsJCQkJLyogRmlsbCBkZWxheSBzbG90ICovCisKKy8qIFVzZXItbW9kZSBzdGF0ZSBzYXZlLiAgKi8KKzE6CiAJbHdpCXIxLCByMCwgVE9QSFlTKFBFUl9DUFUoQ1VSUkVOVF9TQVZFKSk7IC8qIGdldCBzYXZlZCBjdXJyZW50ICovCiAJdG9waHlzKHIxLHIxKTsKIAlsd2kJcjEsIHIxLCBUU19USFJFQURfSU5GTzsJLyogZ2V0IHN0YWNrIGZyb20gdGFza19zdHJ1Y3QgKi8KLQkvKiBNUyB0aGVzZSB0aHJlZSBpbnN0cnVjdGlvbnMgY2FuIGJlIGFkZGVkIHRvIG9uZSAqLwotCS8qIGFkZGlrCXIxLCByMSwgVEhSRUFEX1NJWkU7ICovCi0JLyogdG9waHlzKHIxLHIxKTsgKi8KLQkvKiBhZGRpawlyMSwgcjEsIC1TVEFURV9TQVZFX1NJWkU7ICovCi0JYWRkaWsgcjEsIHIxLCBUSFJFQURfU0laRSArIENPTkZJR19LRVJORUxfQkFTRV9BRERSIC0gQ09ORklHX0tFUk5FTF9TVEFSVCAtIFNUQVRFX1NBVkVfU0laRTsKKy8qIGNhbGN1bGF0ZSBrZXJuZWwgc3RhY2sgcG9pbnRlciBmcm9tIHRhc2sgc3RydWN0IDhrICovCisJYWRkaWsJcjEsIHIxLCBUSFJFQURfU0laRTsKKwl0b3BoeXMocjEscjEpOworCisJYWRkaWsJcjEsIHIxLCAtU1RBVEVfU0FWRV9TSVpFOyAvKiBNYWtlIHJvb20gb24gdGhlIHN0YWNrLiAgKi8KIAlTQVZFX1JFR1MKIAlzd2kJcjAsIHIxLCBQVE8gKyBQVF9SMwogCXN3aQlyMCwgcjEsIFBUTyArIFBUX1I0CiAKKwlzd2kJcjAsIHIxLCBQVE8gKyBQVF9NT0RFOwkJCS8qIFdhcyBpbiB1c2VyLW1vZGUuICovCiAJbHdpCXIxMSwgcjAsIFRPUEhZUyhQRVJfQ1BVKEVOVFJZX1NQKSk7CiAJc3dpCXIxMSwgcjEsIFBUTytQVF9SMTsJCS8qIFN0b3JlIHVzZXIgU1AuICAqLwogCWNsZWFyX3VtczsKLQlsd2kJQ1VSUkVOVF9UQVNLLCByMCwgVE9QSFlTKFBFUl9DUFUoQ1VSUkVOVF9TQVZFKSk7CisyOglsd2kJQ1VSUkVOVF9UQVNLLCByMCwgVE9QSFlTKFBFUl9DUFUoQ1VSUkVOVF9TQVZFKSk7CiAJLyogU2F2ZSBhd2F5IHRoZSBzeXNjYWxsIG51bWJlci4gICovCiAJc3dpCXIxMiwgcjEsIFBUTytQVF9SMDsKIAl0b3ZpcnQocjEscjEpCkBAIC0zNzUsNiArMzk0LDkgQEAKIAlzd2kJcjMsIHIxLCBQVE8gKyBQVF9SMwogCXN3aQlyNCwgcjEsIFBUTyArIFBUX1I0CiAKKwlsd2kJcjExLCByMSwgUFRPICsgUFRfTU9ERTsKKy8qIFNlZSBpZiByZXR1cm5pbmcgdG8ga2VybmVsIG1vZGUsIGlmIHNvLCBza2lwIHJlc2NoZWQgJmMuICAqLworCWJuZWkJcjExLCAyZjsKIAkvKiBXZSdyZSByZXR1cm5pbmcgdG8gdXNlciBtb2RlLCBzbyBjaGVjayBmb3IgdmFyaW91cyBjb25kaXRpb25zIHRoYXQKIAkgKiB0cmlnZ2VyIHJlc2NoZWR1bGluZy4gKi8KIAkvKiBGSVhNRTogUmVzdHJ1Y3R1cmUgYWxsIHRoZXNlIGZsYWcgY2hlY2tzLiAqLwpAQCAtNDE3LDYgKzQzOSwxNiBAQAogCVJFU1RPUkVfUkVHUzsKIAlhZGRpawlyMSwgcjEsIFNUQVRFX1NBVkVfU0laRQkJLyogQ2xlYW4gdXAgc3RhY2sgc3BhY2UuICAqLwogCWx3aQlyMSwgcjEsIFBUX1IxIC0gUFRfU0laRTsvKiBSZXN0b3JlIHVzZXIgc3RhY2sgcG9pbnRlci4gKi8KKwlicmkJNmY7CisKKy8qIFJldHVybiB0byBrZXJuZWwgc3RhdGUuICAqLworMjoJc2V0X2JpcDsJCQkvKiAgSW50cyBtYXNrZWQgZm9yIHN0YXRlIHJlc3RvcmUgKi8KKwlWTV9PRkY7CisJdG9waHlzKHIxLHIxKTsKKwlSRVNUT1JFX1JFR1M7CisJYWRkaWsJcjEsIHIxLCBTVEFURV9TQVZFX1NJWkUJCS8qIENsZWFuIHVwIHN0YWNrIHNwYWNlLiAgKi8KKwl0b3ZpcnQocjEscjEpOworNjoKIFRSQVBfcmV0dXJuOgkJLyogTWFrZSBnbG9iYWwgc3ltYm9sIGZvciBkZWJ1Z2dpbmcgKi8KIAlydGJkCXIxNCwgMDsJLyogSW5zdHJ1Y3Rpb25zIHRvIHJldHVybiBmcm9tIGFuIElSUSAqLwogCW5vcDsKZGlmZiAtLWdpdCBhL2FyY2gvbWljcm9ibGF6ZS9rZXJuZWwvZXhjZXB0aW9ucy5jIGIvYXJjaC9taWNyb2JsYXplL2tlcm5lbC9leGNlcHRpb25zLmMKaW5kZXggNDc4ZjI5NC4uYTdmYTZhZSAxMDA2NDQKLS0tIGEvYXJjaC9taWNyb2JsYXplL2tlcm5lbC9leGNlcHRpb25zLmMKKysrIGIvYXJjaC9taWNyb2JsYXplL2tlcm5lbC9leGNlcHRpb25zLmMKQEAgLTI1LDYgKzI1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgogI2luY2x1ZGUgPGFzbS9jdXJyZW50Lmg+CisjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KIAogI2RlZmluZSBNSUNST0JMQVpFX0lMTF9PUENPREVfRVhDRVBUSU9OCTB4MDIKICNkZWZpbmUgTUlDUk9CTEFaRV9JQlVTX0VYQ0VQVElPTgkweDAzCkBAIC01Miw2ICs1Myw4IEBACiB2b2lkIHN3X2V4Y2VwdGlvbihzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAlfZXhjZXB0aW9uKFNJR1RSQVAsIHJlZ3MsIFRSQVBfQlJLUFQsIHJlZ3MtPnIxNik7CisJZmx1c2hfZGNhY2hlX3JhbmdlKHJlZ3MtPnIxNiwgcmVncy0+cjE2ICsgMHg0KTsKKwlmbHVzaF9pY2FjaGVfcmFuZ2UocmVncy0+cjE2LCByZWdzLT5yMTYgKyAweDQpOwogfQogCiB2b2lkIF9leGNlcHRpb24oaW50IHNpZ25yLCBzdHJ1Y3QgcHRfcmVncyAqcmVncywgaW50IGNvZGUsIHVuc2lnbmVkIGxvbmcgYWRkcikKZGlmZiAtLWdpdCBhL2FyY2gvbWljcm9ibGF6ZS9rZXJuZWwvaHdfZXhjZXB0aW9uX2hhbmRsZXIuUyBiL2FyY2gvbWljcm9ibGF6ZS9rZXJuZWwvaHdfZXhjZXB0aW9uX2hhbmRsZXIuUwppbmRleCA3ODExOTU0Li4yNWY2ZTA3IDEwMDY0NAotLS0gYS9hcmNoL21pY3JvYmxhemUva2VybmVsL2h3X2V4Y2VwdGlvbl9oYW5kbGVyLlMKKysrIGIvYXJjaC9taWNyb2JsYXplL2tlcm5lbC9od19leGNlcHRpb25faGFuZGxlci5TCkBAIC05NDUsMTEgKzk0NSwyMCBAQAogc3RvcmU0OglzYmkJcjMsIHI0LCAzOwkvKiBEZWxheSBzbG90ICovCiBleF9zaHdfdm06CiAJLyogU3RvcmUgdGhlIGxvd2VyIGhhbGYtd29yZCwgYnl0ZS1ieS1ieXRlIGludG8gZGVzdGluYXRpb24gYWRkcmVzcyAqLworI2lmZGVmIF9fTUlDUk9CTEFaRUVMX18KKwlsYnVpCXIzLCByNSwgMDsKK3N0b3JlNToJc2JpCXIzLCByNCwgMDsKKwlsYnVpCXIzLCByNSwgMTsKKwlicmlkCXJldF9mcm9tX2V4YzsKK3N0b3JlNjoJc2JpCXIzLCByNCwgMTsJLyogRGVsYXkgc2xvdCAqLworI2Vsc2UKIAlsYnVpCXIzLCByNSwgMjsKIHN0b3JlNToJc2JpCXIzLCByNCwgMDsKIAlsYnVpCXIzLCByNSwgMzsKIAlicmlkCXJldF9mcm9tX2V4YzsKIHN0b3JlNjoJc2JpCXIzLCByNCwgMTsJLyogRGVsYXkgc2xvdCAqLworI2VuZGlmCisKIGV4X3N3X2VuZF92bToJCQkvKiBFeGNlcHRpb24gaGFuZGxpbmcgb2Ygc3RvcmUgd29yZCwgZW5kcy4gKi8KIAogLyogV2UgaGF2ZSB0byBwcmV2ZW50IGNhc2VzIHRoYXQgZ2V0L3B1dF91c2VyIG1hY3JvcyBnZXQgdW5hbGlnbmVkIHBvaW50ZXIKZGlmZiAtLWdpdCBhL2FyY2gvbWljcm9ibGF6ZS9rZXJuZWwvcHJvbS5jIGIvYXJjaC9taWNyb2JsYXplL2tlcm5lbC9wcm9tLmMKaW5kZXggYTEwNTMwMS4uYzg4MTM5MyAxMDA2NDQKLS0tIGEvYXJjaC9taWNyb2JsYXplL2tlcm5lbC9wcm9tLmMKKysrIGIvYXJjaC9taWNyb2JsYXplL2tlcm5lbC9wcm9tLmMKQEAgLTYxLDE0ICs2MSwxMiBAQAogCWNoYXIgKnA7CiAJaW50ICphZGRyOwogCi0JcHJfZGVidWcoInNlYXJjaCBcImNob3NlblwiLCBkZXB0aDogJWQsIHVuYW1lOiAlc1xuIiwgZGVwdGgsIHVuYW1lKTsKKwlwcl9kZWJ1Zygic2VhcmNoIFwic2VyaWFsXCIsIGRlcHRoOiAlZCwgdW5hbWU6ICVzXG4iLCBkZXB0aCwgdW5hbWUpOwogCiAvKiBmaW5kIGFsbCBzZXJpYWwgbm9kZXMgKi8KIAlpZiAoc3RybmNtcCh1bmFtZSwgInNlcmlhbCIsIDYpICE9IDApCiAJCXJldHVybiAwOwogCi0JZWFybHlfaW5pdF9kdF9jaGVja19mb3JfaW5pdHJkKG5vZGUpOwotCiAvKiBmaW5kIGNvbXBhdGlibGUgbm9kZSB3aXRoIHVhcnRsaXRlICovCiAJcCA9IG9mX2dldF9mbGF0X2R0X3Byb3Aobm9kZSwgImNvbXBhdGlibGUiLCAmbCk7CiAJaWYgKChzdHJuY21wKHAsICJ4bG54LHhwcy11YXJ0bGl0ZSIsIDE3KSAhPSAwKSAmJgpkaWZmIC0tZ2l0IGEvYXJjaC9taWNyb2JsYXplL2tlcm5lbC9wcm9tX3BhcnNlLmMgYi9hcmNoL21pY3JvYmxhemUva2VybmVsL3Byb21fcGFyc2UuYwppbmRleCA5OWQ5YjYxLi45YWUyNGY0IDEwMDY0NAotLS0gYS9hcmNoL21pY3JvYmxhemUva2VybmVsL3Byb21fcGFyc2UuYworKysgYi9hcmNoL21pY3JvYmxhemUva2VybmVsL3Byb21fcGFyc2UuYwpAQCAtMTEwLDQxICsxMTAsMyBAQAogCWNlbGxzID0gcHJvcCA/ICoodTMyICopcHJvcCA6IG9mX25fc2l6ZV9jZWxscyhkbik7CiAJKnNpemUgPSBvZl9yZWFkX251bWJlcihkbWFfd2luZG93LCBjZWxscyk7CiB9Ci0KLS8qKgotICogU2VhcmNoIHRoZSBkZXZpY2UgdHJlZSBmb3IgdGhlIGJlc3QgTUFDIGFkZHJlc3MgdG8gdXNlLiAgJ21hYy1hZGRyZXNzJyBpcwotICogY2hlY2tlZCBmaXJzdCwgYmVjYXVzZSB0aGF0IGlzIHN1cHBvc2VkIHRvIGNvbnRhaW4gdG8gIm1vc3QgcmVjZW50IiBNQUMKLSAqIGFkZHJlc3MuIElmIHRoYXQgaXNuJ3Qgc2V0LCB0aGVuICdsb2NhbC1tYWMtYWRkcmVzcycgaXMgY2hlY2tlZCBuZXh0LAotICogYmVjYXVzZSB0aGF0IGlzIHRoZSBkZWZhdWx0IGFkZHJlc3MuICBJZiB0aGF0IGlzbid0IHNldCwgdGhlbiB0aGUgb2Jzb2xldGUKLSAqICdhZGRyZXNzJyBpcyBjaGVja2VkLCBqdXN0IGluIGNhc2Ugd2UncmUgdXNpbmcgYW4gb2xkIGRldmljZSB0cmVlLgotICoKLSAqIE5vdGUgdGhhdCB0aGUgJ2FkZHJlc3MnIHByb3BlcnR5IGlzIHN1cHBvc2VkIHRvIGNvbnRhaW4gYSB2aXJ0dWFsIGFkZHJlc3Mgb2YKLSAqIHRoZSByZWdpc3RlciBzZXQsIGJ1dCBzb21lIERUUyBmaWxlcyBoYXZlIHJlZGVmaW5lZCB0aGF0IHByb3BlcnR5IHRvIGJlIHRoZQotICogTUFDIGFkZHJlc3MuCi0gKgotICogQWxsLXplcm8gTUFDIGFkZHJlc3NlcyBhcmUgcmVqZWN0ZWQsIGJlY2F1c2UgdGhvc2UgY291bGQgYmUgcHJvcGVydGllcyB0aGF0Ci0gKiBleGlzdCBpbiB0aGUgZGV2aWNlIHRyZWUsIGJ1dCB3ZXJlIG5vdCBzZXQgYnkgVS1Cb290LiAgRm9yIGV4YW1wbGUsIHRoZQotICogRFRTIGNvdWxkIGRlZmluZSAnbWFjLWFkZHJlc3MnIGFuZCAnbG9jYWwtbWFjLWFkZHJlc3MnLCB3aXRoIHplcm8gTUFDCi0gKiBhZGRyZXNzZXMuICBTb21lIG9sZGVyIFUtQm9vdHMgb25seSBpbml0aWFsaXplZCAnbG9jYWwtbWFjLWFkZHJlc3MnLiAgSW4KLSAqIHRoaXMgY2FzZSwgdGhlIHJlYWwgTUFDIGlzIGluICdsb2NhbC1tYWMtYWRkcmVzcycsIGFuZCAnbWFjLWFkZHJlc3MnIGV4aXN0cwotICogYnV0IGlzIGFsbCB6ZXJvcy4KLSovCi1jb25zdCB2b2lkICpvZl9nZXRfbWFjX2FkZHJlc3Moc3RydWN0IGRldmljZV9ub2RlICpucCkKLXsKLQlzdHJ1Y3QgcHJvcGVydHkgKnBwOwotCi0JcHAgPSBvZl9maW5kX3Byb3BlcnR5KG5wLCAibWFjLWFkZHJlc3MiLCBOVUxMKTsKLQlpZiAocHAgJiYgKHBwLT5sZW5ndGggPT0gNikgJiYgaXNfdmFsaWRfZXRoZXJfYWRkcihwcC0+dmFsdWUpKQotCQlyZXR1cm4gcHAtPnZhbHVlOwotCi0JcHAgPSBvZl9maW5kX3Byb3BlcnR5KG5wLCAibG9jYWwtbWFjLWFkZHJlc3MiLCBOVUxMKTsKLQlpZiAocHAgJiYgKHBwLT5sZW5ndGggPT0gNikgJiYgaXNfdmFsaWRfZXRoZXJfYWRkcihwcC0+dmFsdWUpKQotCQlyZXR1cm4gcHAtPnZhbHVlOwotCi0JcHAgPSBvZl9maW5kX3Byb3BlcnR5KG5wLCAiYWRkcmVzcyIsIE5VTEwpOwotCWlmIChwcCAmJiAocHAtPmxlbmd0aCA9PSA2KSAmJiBpc192YWxpZF9ldGhlcl9hZGRyKHBwLT52YWx1ZSkpCi0JCXJldHVybiBwcC0+dmFsdWU7Ci0KLQlyZXR1cm4gTlVMTDsKLX0KLUVYUE9SVF9TWU1CT0wob2ZfZ2V0X21hY19hZGRyZXNzKTsKZGlmZiAtLWdpdCBhL2FyY2gvbWljcm9ibGF6ZS9rZXJuZWwvdm1saW51eC5sZHMuUyBiL2FyY2gvbWljcm9ibGF6ZS9rZXJuZWwvdm1saW51eC5sZHMuUwppbmRleCA5NmE4OGMzLi4zNDUxYmRlIDEwMDY0NAotLS0gYS9hcmNoL21pY3JvYmxhemUva2VybmVsL3ZtbGludXgubGRzLlMKKysrIGIvYXJjaC9taWNyb2JsYXplL2tlcm5lbC92bWxpbnV4Lmxkcy5TCkBAIC0xMjMsMjAgKzEyMywxMCBAQAogCiAJX19pbml0X2VuZF9iZWZvcmVfaW5pdHJhbWZzID0gLjsKIAotCS5pbml0LnJhbWZzIEFMSUdOKFBBR0VfU0laRSkgOiBBVChBRERSKC5pbml0LnJhbWZzKSAtIExPQURfT0ZGU0VUKSB7Ci0JCV9faW5pdHJhbWZzX3N0YXJ0ID0gLjsKLQkJKiguaW5pdC5yYW1mcykKLQkJX19pbml0cmFtZnNfZW5kID0gLjsKLQkJLiA9IEFMSUdOKDQpOwotCQlMT05HKDApOwotLyoKLSAqIEZJWE1FIHRoaXMgY2FuIGJyZWFrIGluaXRyYW1mcyBmb3IgTU1VLgotICogUGFkIGluaXQucmFtZnMgdXAgdG8gcGFnZSBib3VuZGFyeSwKLSAqIHNvIHRoYXQgX19pbml0X2VuZCA9PSBfX2Jzc19zdGFydC4gVGhpcyB3aWxsIG1ha2UgaW1hZ2UuZWxmCi0gKiBjb25zaXN0ZW50IHdpdGggdGhlIGltYWdlLmJpbgotICovCi0JCS8qIC4gPSBBTElHTihQQUdFX1NJWkUpOyAqLworCS5pbml0LnJhbWZzIDogQVQoQUREUiguaW5pdC5yYW1mcykgLSBMT0FEX09GRlNFVCkgeworCQlJTklUX1JBTV9GUwogCX0KKwogCV9faW5pdF9lbmQgPSAuOwogCiAJLmJzcyBBTElHTiAoUEFHRV9TSVpFKSA6IEFUKEFERFIoLmJzcykgLSBMT0FEX09GRlNFVCkgewpkaWZmIC0tZ2l0IGEvYXJjaC9taWNyb2JsYXplL2xpYi9tZW1tb3ZlLmMgYi9hcmNoL21pY3JvYmxhemUvbGliL21lbW1vdmUuYwppbmRleCAxMjNlMzYxLi44MTBmZDY4IDEwMDY0NAotLS0gYS9hcmNoL21pY3JvYmxhemUvbGliL21lbW1vdmUuYworKysgYi9hcmNoL21pY3JvYmxhemUvbGliL21lbW1vdmUuYwpAQCAtMTgyLDcgKzE4Miw3IEBACiAJCQlmb3IgKDsgYyA+PSA0OyBjIC09IDQpIHsKIAkJCQl2YWx1ZSA9ICotLWlfc3JjOwogCQkJCSotLWlfZHN0ID0gYnVmX2hvbGQgfCAoKHZhbHVlICYgMHhGRjAwMDAwMCk+PiAyNCk7Ci0JCQkJYnVmX2hvbGQgPSAodmFsdWUgJiAweEZGRkZGRikgPDwgODs7CisJCQkJYnVmX2hvbGQgPSAodmFsdWUgJiAweEZGRkZGRikgPDwgODsKIAkJCX0KICNlbmRpZgogCQkJLyogUmVhbGlnbiB0aGUgc291cmNlICovCmRpZmYgLS1naXQgYS9hcmNoL21pY3JvYmxhemUvbGliL211bGRpMy5TIGIvYXJjaC9taWNyb2JsYXplL2xpYi9tdWxkaTMuUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2VlYWE4Yy4uMDAwMDAwMAotLS0gYS9hcmNoL21pY3JvYmxhemUvbGliL211bGRpMy5TCisrKyAvZGV2L251bGwKQEAgLTEsMTIxICswLDAgQEAKLSNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+Ci0KLS8qCi0gKiBNdWx0aXBseSBvcGVyYXRpb24gZm9yIDY0IGJpdCBpbnRlZ2VycywgZm9yIGRldmljZXMgd2l0aCBoYXJkIG11bHRpcGx5Ci0gKglJbnB1dCA6CU9wZXJhbmQxW0hdIGluIFJlZyByNQotICoJCU9wZXJhbmQxW0xdIGluIFJlZyByNgotICoJCU9wZXJhbmQyW0hdIGluIFJlZyByNwotICoJCU9wZXJhbmQyW0xdIGluIFJlZyByOAotICoJT3V0cHV0OiBSZXN1bHRbSF0gaW4gUmVnIHIzCi0gKgkJUmVzdWx0W0xdIGluIFJlZyByNAotICoKLSAqIEV4cGxhaW5hdGlvbjoKLSAqCi0gKglCb3RoIHRoZSBpbnB1dCBudW1iZXJzIGFyZSBkaXZpZGVkIGludG8gMTYgYml0IG51bWJlciBhcyBmb2xsb3dzCi0gKgkJb3AxID0gQSBCIEMgRAotICoJCW9wMiA9IEUgRiBHIEgKLSAqCXJlc3VsdCA9IEQgKiBICi0gKgkJICsgKEMgKiBIICsgRCAqIEcpIDw8IDE2Ci0gKgkJICsgKEIgKiBIICsgQyAqIEcgKyBEICogRikgPDwgMzIKLSAqCQkgKyAoQSAqIEggKyBCICogRyArIEMgKiBGICsgRCAqIEUpIDw8IDQ4Ci0gKgotICoJT25seSA2NCBiaXRzIG9mIHRoZSBvdXRwdXQgYXJlIGNvbnNpZGVyZWQKLSAqLwotCi0JLnRleHQKLQkuZ2xvYmwJX19tdWxkaTMKLQkudHlwZSBfX211bGRpMywgQGZ1bmN0aW9uCi0JLmVudCBfX211bGRpMwotCi1fX211bGRpMzoKLQlhZGRpCXIxLCByMSwgLTQwCi0KLS8qIFNhdmUgdGhlIGlucHV0IG9wZXJhbmRzIG9uIHRoZSBjYWxsZXIncyBzdGFjayAqLwotCXN3aQlyNSwgcjEsIDQ0Ci0Jc3dpCXI2LCByMSwgNDgKLQlzd2kJcjcsIHIxLCA1MgotCXN3aQlyOCwgcjEsIDU2Ci0KLS8qIFN0b3JlIGFsbCB0aGUgY2FsbGVlIHNhdmVkIHJlZ2lzdGVycyAqLwotCXN3CXIyMCwgcjEsIHIwCi0Jc3dpCXIyMSwgcjEsIDQKLQlzd2kJcjIyLCByMSwgOAotCXN3aQlyMjMsIHIxLCAxMgotCXN3aQlyMjQsIHIxLCAxNgotCXN3aQlyMjUsIHIxLCAyMAotCXN3aQlyMjYsIHIxLCAyNAotCXN3aQlyMjcsIHIxLCAyOAotCi0vKiBMb2FkIGFsbCB0aGUgMTYgYml0IHZhbHVlcyBmb3IgQSB0aHJ1IEggKi8KLQlsaHVpCXIyMCwgcjEsIDQ0IC8qIEEgKi8KLQlsaHVpCXIyMSwgcjEsIDQ2IC8qIEIgKi8KLQlsaHVpCXIyMiwgcjEsIDQ4IC8qIEMgKi8KLQlsaHVpCXIyMywgcjEsIDUwIC8qIEQgKi8KLQlsaHVpCXIyNCwgcjEsIDUyIC8qIEUgKi8KLQlsaHVpCXIyNSwgcjEsIDU0IC8qIEYgKi8KLQlsaHVpCXIyNiwgcjEsIDU2IC8qIEcgKi8KLQlsaHVpCXIyNywgcjEsIDU4IC8qIEggKi8KLQotLyogRCAqIEggPT0+IExTQiBvZiB0aGUgcmVzdWx0IG9uIHN0YWNrID09PiBTdG9yZTEgKi8KLQltdWwJcjksIHIyMywgcjI3Ci0Jc3dpCXI5LCByMSwgMzYgLyogUG9zMiBhbmQgUG9zMyAqLwotCi0vKiBIaSAoU3RvcmUxKSArIEMgKiBIICsgRCAqIEcgPT0+IFN0b3JlMiA9PT4gUG9zMSBhbmQgUG9zMiAqLwotLyogU3RvcmUgdGhlIGNhcnJ5IGdlbmVyYXRlZCBpbiBwb3NpdGlvbiAyIGZvciBQb3MgMyAqLwotCWxodWkJcjExLCByMSwgMzYgLyogUG9zMiAqLwotCW11bAlyOSwgcjIyLCByMjcgLyogQyAqIEggKi8KLQltdWwJcjEwLCByMjMsIHIyNiAvKiBEICogRyAqLwotCWFkZAlyOSwgcjksIHIxMAotCWFkZGMJcjEyLCByMCwgcjAKLQlhZGQJcjksIHI5LCByMTEKLQlhZGRjCXIxMiwgcjEyLCByMCAvKiBTdG9yZSB0aGUgQ2FycnkgKi8KLQlzaGkJcjksIHIxLCAzNiAvKiBTdG9yZSBQb3MyICovCi0Jc3dpCXI5LCByMSwgMzIKLQlsaHVpCXIxMSwgcjEsIDMyCi0Jc2hpCXIxMSwgcjEsIDM0IC8qIFN0b3JlIFBvczEgKi8KLQotLyogSGkgKFN0b3JlMikgKyBCICogSCArIEMgKiBHICsgRCAqIEYgPT0+IFN0b3JlMyA9PT4gUG9zMCBhbmQgUG9zMSAqLwotCW11bAlyOSwgcjIxLCByMjcgLyogQiAqIEggKi8KLQltdWwJcjEwLCByMjIsIHIyNiAvKiBDICogRyAqLwotCW11bAlyNywgcjIzLCByMjUgLyogRCAqIEYgKi8KLQlhZGQJcjksIHI5LCByMTEKLQlhZGQJcjksIHI5LCByMTAKLQlhZGQJcjksIHI5LCByNwotCXN3aQlyOSwgcjEsIDMyIC8qIFBvczAgYW5kIFBvczEgKi8KLQotLyogSGkgKFN0b3JlMykgKyBBICogSCArIEIgKiBHICsgQyAqIEYgKyBEICogRSA9PT4gU3RvcmUzID09PiBQb3MwICovCi0JbGh1aQlyMTEsIHIxLCAzMiAvKiBQb3MwICovCi0JbXVsCXI5LCByMjAsIHIyNyAvKiBBICogSCAqLwotCW11bAlyMTAsIHIyMSwgcjI2IC8qIEIgKiBHICovCi0JbXVsCXI3LCByMjIsIHIyNSAvKiBDICogRiAqLwotCW11bAlyOCwgcjIzLCByMjQgLyogRCAqIEUgKi8KLQlhZGQJcjksIHI5LCByMTEKLQlhZGQgCXI5LCByOSwgcjEwCi0JYWRkCXI5LCByOSwgcjcKLQlhZGQJcjksIHI5LCByOAotCXNleHQxNglyOSwgcjkgLyogU2lnbiBleHRlbmQgdGhlIE1TQiAqLwotCXNoaQlyOSwgcjEsIDMyCi0KLS8qIE1vdmUgcmVzdWx0cyB0byByMyBhbmQgcjQgKi8KLQlsaHVpCXIzLCByMSwgMzIKLQlhZGQJcjMsIHIzLCByMTIKLQlzaGkJcjMsIHIxLCAzMgotCWx3aQlyMywgcjEsIDMyIC8qIEhpIFBhcnQgKi8KLQlsd2kJcjQsIHIxLCAzNiAvKiBMbyBQYXJ0ICovCi0KLS8qIFJlc3RvcmUgQ2FsbGVlIHNhdmVkIHJlZ2lzdGVycyAqLwotCWx3CXIyMCwgcjEsIHIwCi0JbHdpCXIyMSwgcjEsIDQKLQlsd2kJcjIyLCByMSwgOAotCWx3aQlyMjMsIHIxLCAxMgotCWx3aQlyMjQsIHIxLCAxNgotCWx3aQlyMjUsIHIxLCAyMAotCWx3aQlyMjYsIHIxLCAyNAotCWx3aQlyMjcsIHIxLCAyOAotCi0vKiBSZXN0b3JlIEZyYW1lIGFuZCByZXR1cm4gKi8KLQlydHNkCXIxNSwgOAotCWFkZGkJcjEsIHIxLCA0MAotCi0uc2l6ZSBfX211bGRpMywgLiAtIF9fbXVsZGkzCi0uZW5kIF9fbXVsZGkzCmRpZmYgLS1naXQgYS9hcmNoL21pY3JvYmxhemUvbGliL211bGRpMy5jIGIvYXJjaC9taWNyb2JsYXplL2xpYi9tdWxkaTMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDg2MGUxCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9taWNyb2JsYXplL2xpYi9tdWxkaTMuYwpAQCAtMCwwICsxLDYwIEBACisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlICJsaWJnY2MuaCIKKworI2RlZmluZSBEV3R5cGUgbG9uZyBsb25nCisjZGVmaW5lIFVXdHlwZSB1bnNpZ25lZCBsb25nCisjZGVmaW5lIFVIV3R5cGUgdW5zaWduZWQgc2hvcnQKKworI2RlZmluZSBXX1RZUEVfU0laRSAzMgorCisjZGVmaW5lIF9fbGxfQiAoKFVXdHlwZSkgMSA8PCAoV19UWVBFX1NJWkUgLyAyKSkKKyNkZWZpbmUgX19sbF9sb3dwYXJ0KHQpICgoVVd0eXBlKSAodCkgJiAoX19sbF9CIC0gMSkpCisjZGVmaW5lIF9fbGxfaGlnaHBhcnQodCkgKChVV3R5cGUpICh0KSA+PiAoV19UWVBFX1NJWkUgLyAyKSkKKworLyogSWYgd2Ugc3RpbGwgZG9uJ3QgaGF2ZSB1bXVsX3BwbW0sIGRlZmluZSBpdCB1c2luZyBwbGFpbiBDLiAgKi8KKyNpZiAhZGVmaW5lZCh1bXVsX3BwbW0pCisjZGVmaW5lIHVtdWxfcHBtbSh3MSwgdzAsIHUsIHYpCQkJCQkJXAorCWRvIHsJCQkJCQkJCVwKKwkJVVd0eXBlIF9feDAsIF9feDEsIF9feDIsIF9feDM7CQkJCVwKKwkJVUhXdHlwZSBfX3VsLCBfX3ZsLCBfX3VoLCBfX3ZoOwkJCQlcCisJCQkJCQkJCQlcCisJCV9fdWwgPSBfX2xsX2xvd3BhcnQodSk7CQkJCQlcCisJCV9fdWggPSBfX2xsX2hpZ2hwYXJ0KHUpOwkJCQlcCisJCV9fdmwgPSBfX2xsX2xvd3BhcnQodik7CQkJCQlcCisJCV9fdmggPSBfX2xsX2hpZ2hwYXJ0KHYpOwkJCQlcCisJCQkJCQkJCQlcCisJCV9feDAgPSAoVVd0eXBlKSBfX3VsICogX192bDsJCQkJXAorCQlfX3gxID0gKFVXdHlwZSkgX191bCAqIF9fdmg7CQkJCVwKKwkJX194MiA9IChVV3R5cGUpIF9fdWggKiBfX3ZsOwkJCQlcCisJCV9feDMgPSAoVVd0eXBlKSBfX3VoICogX192aDsJCQkJXAorCQkJCQkJCQkJXAorCQlfX3gxICs9IF9fbGxfaGlnaHBhcnQoX194MCk7IC8qIHRoaXMgY2FuJ3QgZ2l2ZSBjYXJyeSAqL1wKKwkJX194MSArPSBfX3gyOyAvKiBidXQgdGhpcyBpbmRlZWQgY2FuICovCQkJXAorCQlpZiAoX194MSA8IF9feDIpIC8qIGRpZCB3ZSBnZXQgaXQ/ICovCQkJXAorCQlfX3gzICs9IF9fbGxfQjsgLyogeWVzLCBhZGQgaXQgaW4gdGhlIHByb3BlciBwb3MgKi8JXAorCQkJCQkJCQkJXAorCQkodzEpID0gX194MyArIF9fbGxfaGlnaHBhcnQoX194MSk7CQkJXAorCQkodzApID0gX19sbF9sb3dwYXJ0KF9feDEpICogX19sbF9CICsgX19sbF9sb3dwYXJ0KF9feDApO1wKKwl9IHdoaWxlICgwKQorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChfX3VtdWxzaWRpMykKKyNkZWZpbmUgX191bXVsc2lkaTModSwgdikgKHsJCQkJXAorCURXdW5pb24gX193OwkJCQkJXAorCXVtdWxfcHBtbShfX3cucy5oaWdoLCBfX3cucy5sb3csIHUsIHYpOwkJXAorCV9fdy5sbDsJCQkJCQlcCisJfSkKKyNlbmRpZgorCitEV3R5cGUgX19tdWxkaTMoRFd0eXBlIHUsIERXdHlwZSB2KQoreworCWNvbnN0IERXdW5pb24gdXUgPSB7LmxsID0gdX07CisJY29uc3QgRFd1bmlvbiB2diA9IHsubGwgPSB2fTsKKwlEV3VuaW9uIHcgPSB7LmxsID0gX191bXVsc2lkaTModXUucy5sb3csIHZ2LnMubG93KX07CisKKwl3LnMuaGlnaCArPSAoKFVXdHlwZSkgdXUucy5sb3cgKiAoVVd0eXBlKSB2di5zLmhpZ2gKKwkJKyAoVVd0eXBlKSB1dS5zLmhpZ2ggKiAoVVd0eXBlKSB2di5zLmxvdyk7CisKKwlyZXR1cm4gdy5sbDsKK30KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9LY29uZmlnIGIvYXJjaC9taXBzL0tjb25maWcKaW5kZXggMGE5YjViOC4uZjQ4OWVjMyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL0tjb25maWcKKysrIGIvYXJjaC9taXBzL0tjb25maWcKQEAgLTIyMTgsNyArMjIxOCw3IEBACiBjb25maWcgVVNFX09GCiAJYm9vbCAiRmxhdHRlbmVkIERldmljZSBUcmVlIHN1cHBvcnQiCiAJc2VsZWN0IE9GCi0Jc2VsZWN0IE9GX0ZMQVRUUkVFCisJc2VsZWN0IE9GX0VBUkxZX0ZMQVRUUkVFCiAJaGVscAogCSAgSW5jbHVkZSBzdXBwb3J0IGZvciBmbGF0dGVuZWQgZGV2aWNlIHRyZWUgbWFjaGluZSBkZXNjcmlwdGlvbnMuCiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9LY29uZmlnIGIvYXJjaC9wb3dlcnBjL0tjb25maWcKaW5kZXggZTYyNWU5ZS4uOTU5ZjM4YyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL0tjb25maWcKKysrIGIvYXJjaC9wb3dlcnBjL0tjb25maWcKQEAgLTIwLDYgKzIwLDkgQEAKIGNvbmZpZyBBUkNIX1BIWVNfQUREUl9UXzY0QklUCiAgICAgICAgZGVmX2Jvb2wgUFBDNjQgfHwgUEhZU182NEJJVAogCitjb25maWcgQVJDSF9ETUFfQUREUl9UXzY0QklUCisJZGVmX2Jvb2wgQVJDSF9QSFlTX0FERFJfVF82NEJJVAorCiBjb25maWcgTU1VCiAJYm9vbAogCWRlZmF1bHQgeQpAQCAtMTE2LDcgKzExOSw3IEBACiAJYm9vbAogCWRlZmF1bHQgeQogCXNlbGVjdCBPRgotCXNlbGVjdCBPRl9GTEFUVFJFRQorCXNlbGVjdCBPRl9FQVJMWV9GTEFUVFJFRQogCXNlbGVjdCBIQVZFX0ZUUkFDRV9NQ09VTlRfUkVDT1JECiAJc2VsZWN0IEhBVkVfRFlOQU1JQ19GVFJBQ0UKIAlzZWxlY3QgSEFWRV9GVU5DVElPTl9UUkFDRVIKQEAgLTIwOSw3ICsyMTIsNyBAQAogY29uZmlnIEFSQ0hfU1VTUEVORF9QT1NTSUJMRQogCWRlZl9ib29sIHkKIAlkZXBlbmRzIG9uIEFEQl9QTVUgfHwgUFBDX0VGSUtBIHx8IFBQQ19MSVRFNTIwMCB8fCBQUENfODN4eCB8fCBcCi0JCSAgIFBQQ184NXh4IHx8IFBQQ184Nnh4IHx8IFBQQ19QU0VSSUVTCisJCSAgIFBQQ184NXh4IHx8IFBQQ184Nnh4IHx8IFBQQ19QU0VSSUVTIHx8IDQ0eCB8fCA0MHgKIAogY29uZmlnIFBQQ19EQ1JfTkFUSVZFCiAJYm9vbApAQCAtNTk1LDEzICs1OTgsMTEgQEAKIAogCSAgSWYgdW5zdXJlLCBsZWF2ZSBibGFuawogCi1pZiAhNDR4IHx8IEJST0tFTgogY29uZmlnIEFSQ0hfV0FOVFNfRlJFRVpFUl9DT05UUk9MCiAJZGVmX2Jvb2wgeQogCWRlcGVuZHMgb24gQURCX1BNVQogCiBzb3VyY2Uga2VybmVsL3Bvd2VyL0tjb25maWcKLWVuZGlmCiAKIGNvbmZpZyBTRUNDT01QCiAJYm9vbCAiRW5hYmxlIHNlY2NvbXAgdG8gc2FmZWx5IGNvbXB1dGUgdW50cnVzdGVkIGJ5dGVjb2RlIgpAQCAtNjgyLDYgKzY4MywxNSBAQAogCSAgRnJlZXNjYWxlIE1QQzg1eHgvTVBDODZ4eCBwb3dlciBtYW5hZ2VtZW50IGNvbnRyb2xsZXIgc3VwcG9ydAogCSAgKHN1c3BlbmQvcmVzdW1lKS4gRm9yIE1QQzgzeHggc2VlIHBsYXRmb3Jtcy84M3h4L3N1c3BlbmQuYwogCitjb25maWcgUFBDNHh4X0NQTQorCWJvb2wKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIFNVU1BFTkQgJiYgKDQ0eCB8fCA0MHgpCisJaGVscAorCSAgUFBDNHh4IENsb2NrIFBvd2VyIE1hbmFnZW1lbnQgKENQTSkgc3VwcG9ydCAoc3VzcGVuZC9yZXN1bWUpLgorCSAgSXQgYWxzbyBlbmFibGVzIHN1cHBvcnQgZm9yIHR3byBkaWZmZXJlbnQgaWRsZSBzdGF0ZXMgKGlkbGUtd2FpdAorCSAgYW5kIGlkbGUtZG96ZSkuCisKIGNvbmZpZyA0eHhfU09DCiAJYm9vbAogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9NYWtlZmlsZSBiL2FyY2gvcG93ZXJwYy9ib290L01ha2VmaWxlCmluZGV4IGZhZTgxOTIuLjk2ZGVlYzYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L01ha2VmaWxlCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L01ha2VmaWxlCkBAIC0zNSw3ICszNSw3IEBACiAKIEJPT1RDRkxBR1MJKz0gLUkkKG9iaikgLUkkKHNyY3RyZWUpLyQob2JqKQogCi1EVFNfRkxBR1MJPz0gLXAgMTAyNAorRFRDX0ZMQUdTCT89IC1wIDEwMjQKIAogJChvYmopLzR4eC5vOiBCT09UQ0ZMQUdTICs9IC1tY3B1PTQwNQogJChvYmopL2Vib255Lm86IEJPT1RDRkxBR1MgKz0gLW1jcHU9NDA1CkBAIC0zMzIsMTAgKzMzMiw4IEBACiAJJChjYWxsIGlmX2NoYW5nZWQsd3JhcCx0cmVlYm9vdC0kKiwsJChvYmopLyQqLmR0YikKIAogIyBSdWxlIHRvIGJ1aWxkIGRldmljZSB0cmVlIGJsb2JzCi1EVEMgPSAkKG9ianRyZWUpL3NjcmlwdHMvZHRjL2R0YwotCi0kKG9iaikvJS5kdGI6ICQoZHRzdHJlZSkvJS5kdHMKLQkkKERUQykgLU8gZHRiIC1vICQob2JqKS8kKi5kdGIgLWIgMCAkKERUU19GTEFHUykgJChkdHN0cmVlKS8kKi5kdHMKKyQob2JqKS8lLmR0YjogJChzcmMpL2R0cy8lLmR0cworCSQoY2FsbCBjbWQsZHRjKQogCiAjIElmIHRoZXJlIGlzbid0IGEgcGxhdGZvcm0gc2VsZWN0ZWQgdGhlbiBqdXN0IHN0cmlwIHRoZSB2bWxpbnV4LgogaWZlcSAoLCQoaW1hZ2UteSkpCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvYmx1ZXN0b25lLmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9ibHVlc3RvbmUuZHRzCmluZGV4IDliYjNkNzIuLjJhNTZhMGQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9ibHVlc3RvbmUuZHRzCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9ibHVlc3RvbmUuZHRzCkBAIC0zMyw3ICszMyw3IEBACiAJYWxpYXNlcyB7CiAJCWV0aGVybmV0MCA9ICZFTUFDMDsKIAkJc2VyaWFsMCA9ICZVQVJUMDsKLQkJc2VyaWFsMSA9ICZVQVJUMTsKKwkJLy9zZXJpYWwxID0gJlVBUlQxOyAtLWdjbCBtaXNzaW5nIFVBUlQxIGxhYmVsCiAJfTsKIAogCWNwdXMgewpAQCAtNTIsNyArNTIsNyBAQAogCQkJZC1jYWNoZS1zaXplID0gPDMyNzY4PjsKIAkJCWRjci1jb250cm9sbGVyOwogCQkJZGNyLWFjY2Vzcy1tZXRob2QgPSAibmF0aXZlIjsKLQkJCW5leHQtbGV2ZWwtY2FjaGUgPSA8JkwyQzA+OworCQkJLy9uZXh0LWxldmVsLWNhY2hlID0gPCZMMkMwPjsgLS1nY2wgbWlzc2luZyBMMkMwIGxhYmVsCiAJCX07CiAJfTsKIApAQCAtMTQyLDcgKzE0Miw3IEBACiAJCQkJCS8qUlhFT0IqLyAweDcgMHg0CiAJCQkJCS8qU0VSUiovICAweDMgMHg0CiAJCQkJCS8qVFhERSovICAweDQgMHg0Ci0JCQkJCS8qUlhERSovICAweDUgMHg0CisJCQkJCS8qUlhERSovICAweDUgMHg0PjsKIAkJfTsKIAogCQlQT0IwOiBvcGIgewpAQCAtMTgyLDcgKzE4Miw3IEBACiAJCQkJCQlyZWcgPSA8MHgwMDFhMDAwMCAweDAwMDYwMDAwPjsKIAkJCQkJfTsKIAkJCQl9OwotCQkJfQorCQkJfTsKIAogCQkJVUFSVDA6IHNlcmlhbEBlZjYwMDMwMCB7CiAJCQkJZGV2aWNlX3R5cGUgPSAic2VyaWFsIjsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9jYW55b25sYW5kcy5kdHMgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvY2FueW9ubGFuZHMuZHRzCmluZGV4IGEzMDM3MDMuLjViMjdhNGIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9jYW55b25sYW5kcy5kdHMKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2NhbnlvbmxhbmRzLmR0cwpAQCAtMTA1LDYgKzEwNSwxNSBAQAogCQlkY3ItcmVnID0gPDB4MDBjIDB4MDAyPjsKIAl9OwogCisJQ1BNMDogY3BtIHsKKwkJY29tcGF0aWJsZSA9ICJpYm0sY3BtIjsKKwkJZGNyLWFjY2Vzcy1tZXRob2QgPSAibmF0aXZlIjsKKwkJZGNyLXJlZyA9IDwweDE2MCAweDAwMz47CisJCXVudXNlZC11bml0cyA9IDwweDAwMDAwMTAwPjsKKwkJaWRsZS1kb3plID0gPDB4MDIwMDAwMDA+OworCQlzdGFuZGJ5ID0gPDB4ZmVmZjc5MWQ+OworCX07CisKIAlMMkMwOiBsMmMgewogCQljb21wYXRpYmxlID0gImlibSxsMi1jYWNoZS00NjBleCIsICJpYm0sbDItY2FjaGUiOwogCQlkY3ItcmVnID0gPDB4MDIwIDB4MDA4CQkvKiBJbnRlcm5hbCBTUkFNIERDUidzICovCkBAIC0yNzAsMjggKzI3OSw2IEBACiAJCQkJaW50ZXJydXB0cyA9IDwweDEgMHg0PjsKIAkJCX07CiAKLQkJCVVBUlQyOiBzZXJpYWxAZWY2MDA1MDAgewotCQkJCWRldmljZV90eXBlID0gInNlcmlhbCI7Ci0JCQkJY29tcGF0aWJsZSA9ICJuczE2NTUwIjsKLQkJCQlyZWcgPSA8MHhlZjYwMDUwMCAweDAwMDAwMDA4PjsKLQkJCQl2aXJ0dWFsLXJlZyA9IDwweGVmNjAwNTAwPjsKLQkJCQljbG9jay1mcmVxdWVuY3kgPSA8MD47IC8qIEZpbGxlZCBpbiBieSBVLUJvb3QgKi8KLQkJCQljdXJyZW50LXNwZWVkID0gPDA+OyAvKiBGaWxsZWQgaW4gYnkgVS1Cb290ICovCi0JCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmVUlDMT47Ci0JCQkJaW50ZXJydXB0cyA9IDwyOCAweDQ+OwotCQkJfTsKLQotCQkJVUFSVDM6IHNlcmlhbEBlZjYwMDYwMCB7Ci0JCQkJZGV2aWNlX3R5cGUgPSAic2VyaWFsIjsKLQkJCQljb21wYXRpYmxlID0gIm5zMTY1NTAiOwotCQkJCXJlZyA9IDwweGVmNjAwNjAwIDB4MDAwMDAwMDg+OwotCQkJCXZpcnR1YWwtcmVnID0gPDB4ZWY2MDA2MDA+OwotCQkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsgLyogRmlsbGVkIGluIGJ5IFUtQm9vdCAqLwotCQkJCWN1cnJlbnQtc3BlZWQgPSA8MD47IC8qIEZpbGxlZCBpbiBieSBVLUJvb3QgKi8KLQkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZVSUMxPjsKLQkJCQlpbnRlcnJ1cHRzID0gPDI5IDB4ND47Ci0JCQl9OwotCiAJCQlJSUMwOiBpMmNAZWY2MDA3MDAgewogCQkJCWNvbXBhdGlibGUgPSAiaWJtLGlpYy00NjBleCIsICJpYm0saWljIjsKIAkJCQlyZWcgPSA8MHhlZjYwMDcwMCAweDAwMDAwMDE0PjsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9jbTUyMDAuZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2NtNTIwMC5kdHMKaW5kZXggZGQzODYwOC4uYWQzYTRmNCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2NtNTIwMC5kdHMKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2NtNTIwMC5kdHMKQEAgLTEwLDIyMCArMTAsNzQgQEAKICAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAgKi8KIAotL2R0cy12MS87CisvaW5jbHVkZS8gIm1wYzUyMDBiLmR0c2kiCiAKIC8gewogCW1vZGVsID0gInNjaGluZGxlcixjbTUyMDAiOwogCWNvbXBhdGlibGUgPSAic2NoaW5kbGVyLGNtNTIwMCI7Ci0JI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JI3NpemUtY2VsbHMgPSA8MT47Ci0JaW50ZXJydXB0LXBhcmVudCA9IDwmbXBjNTIwMF9waWM+OwotCi0JY3B1cyB7Ci0JCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCQkjc2l6ZS1jZWxscyA9IDwwPjsKLQotCQlQb3dlclBDLDUyMDBAMCB7Ci0JCQlkZXZpY2VfdHlwZSA9ICJjcHUiOwotCQkJcmVnID0gPDA+OwotCQkJZC1jYWNoZS1saW5lLXNpemUgPSA8MzI+OwotCQkJaS1jYWNoZS1saW5lLXNpemUgPSA8MzI+OwotCQkJZC1jYWNoZS1zaXplID0gPDB4NDAwMD47CQkvLyBMMSwgMTZLCi0JCQlpLWNhY2hlLXNpemUgPSA8MHg0MDAwPjsJCS8vIEwxLCAxNksKLQkJCXRpbWViYXNlLWZyZXF1ZW5jeSA9IDwwPjsJLy8gZnJvbSBib290bG9hZGVyCi0JCQlidXMtZnJlcXVlbmN5ID0gPDA+OwkJLy8gZnJvbSBib290bG9hZGVyCi0JCQljbG9jay1mcmVxdWVuY3kgPSA8MD47CQkvLyBmcm9tIGJvb3Rsb2FkZXIKLQkJfTsKLQl9OwotCi0JbWVtb3J5IHsKLQkJZGV2aWNlX3R5cGUgPSAibWVtb3J5IjsKLQkJcmVnID0gPDB4MDAwMDAwMDAgMHgwNDAwMDAwMD47CS8vIDY0TUIKLQl9OwogCiAJc29jNTIwMEBmMDAwMDAwMCB7Ci0JCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCQkjc2l6ZS1jZWxscyA9IDwxPjsKLQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItaW1tciI7Ci0JCXJhbmdlcyA9IDwwIDB4ZjAwMDAwMDAgMHgwMDAwYzAwMD47Ci0JCXJlZyA9IDwweGYwMDAwMDAwIDB4MDAwMDAxMDA+OwotCQlidXMtZnJlcXVlbmN5ID0gPDA+OwkJLy8gZnJvbSBib290bG9hZGVyCi0JCXN5c3RlbS1mcmVxdWVuY3kgPSA8MD47CQkvLyBmcm9tIGJvb3Rsb2FkZXIKLQotCQljZG1AMjAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWNkbSIsImZzbCxtcGM1MjAwLWNkbSI7Ci0JCQlyZWcgPSA8MHgyMDAgMHgzOD47Ci0JCX07Ci0KLQkJbXBjNTIwMF9waWM6IGludGVycnVwdC1jb250cm9sbGVyQDUwMCB7Ci0JCQkvLyA1MjAwIGludGVycnVwdHMgYXJlIGVuY29kZWQgaW50byB0d28gbGV2ZWxzOwotCQkJaW50ZXJydXB0LWNvbnRyb2xsZXI7Ci0JCQkjaW50ZXJydXB0LWNlbGxzID0gPDM+OwotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItcGljIiwiZnNsLG1wYzUyMDAtcGljIjsKLQkJCXJlZyA9IDwweDUwMCAweDgwPjsKLQkJfTsKLQogCQl0aW1lckA2MDAgewkvLyBHZW5lcmFsIFB1cnBvc2UgVGltZXIKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWdwdCIsImZzbCxtcGM1MjAwLWdwdCI7Ci0JCQlyZWcgPSA8MHg2MDAgMHgxMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDEgOSAwPjsKIAkJCWZzbCxoYXMtd2R0OwogCQl9OwogCi0JCXRpbWVyQDYxMCB7CS8vIEdlbmVyYWwgUHVycG9zZSBUaW1lcgotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItZ3B0IiwiZnNsLG1wYzUyMDAtZ3B0IjsKLQkJCXJlZyA9IDwweDYxMCAweDEwPjsKLQkJCWludGVycnVwdHMgPSA8MSAxMCAwPjsKKwkJY2FuQDkwMCB7CisJCQlzdGF0dXMgPSAiZGlzYWJsZWQiOwogCQl9OwogCi0JCXRpbWVyQDYyMCB7CS8vIEdlbmVyYWwgUHVycG9zZSBUaW1lcgotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItZ3B0IiwiZnNsLG1wYzUyMDAtZ3B0IjsKLQkJCXJlZyA9IDwweDYyMCAweDEwPjsKLQkJCWludGVycnVwdHMgPSA8MSAxMSAwPjsKKwkJY2FuQDk4MCB7CisJCQlzdGF0dXMgPSAiZGlzYWJsZWQiOwogCQl9OwogCi0JCXRpbWVyQDYzMCB7CS8vIEdlbmVyYWwgUHVycG9zZSBUaW1lcgotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItZ3B0IiwiZnNsLG1wYzUyMDAtZ3B0IjsKLQkJCXJlZyA9IDwweDYzMCAweDEwPjsKLQkJCWludGVycnVwdHMgPSA8MSAxMiAwPjsKLQkJfTsKLQotCQl0aW1lckA2NDAgewkvLyBHZW5lcmFsIFB1cnBvc2UgVGltZXIKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWdwdCIsImZzbCxtcGM1MjAwLWdwdCI7Ci0JCQlyZWcgPSA8MHg2NDAgMHgxMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDEgMTMgMD47Ci0JCX07Ci0KLQkJdGltZXJANjUwIHsJLy8gR2VuZXJhbCBQdXJwb3NlIFRpbWVyCi0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1ncHQiLCJmc2wsbXBjNTIwMC1ncHQiOwotCQkJcmVnID0gPDB4NjUwIDB4MTA+OwotCQkJaW50ZXJydXB0cyA9IDwxIDE0IDA+OwotCQl9OwotCi0JCXRpbWVyQDY2MCB7CS8vIEdlbmVyYWwgUHVycG9zZSBUaW1lcgotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItZ3B0IiwiZnNsLG1wYzUyMDAtZ3B0IjsKLQkJCXJlZyA9IDwweDY2MCAweDEwPjsKLQkJCWludGVycnVwdHMgPSA8MSAxNSAwPjsKLQkJfTsKLQotCQl0aW1lckA2NzAgewkvLyBHZW5lcmFsIFB1cnBvc2UgVGltZXIKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWdwdCIsImZzbCxtcGM1MjAwLWdwdCI7Ci0JCQlyZWcgPSA8MHg2NzAgMHgxMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDEgMTYgMD47Ci0JCX07Ci0KLQkJcnRjQDgwMCB7CS8vIFJlYWwgdGltZSBjbG9jawotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItcnRjIiwiZnNsLG1wYzUyMDAtcnRjIjsKLQkJCXJlZyA9IDwweDgwMCAweDEwMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDEgNSAwIDEgNiAwPjsKLQkJfTsKLQotCQlncGlvX3NpbXBsZTogZ3Bpb0BiMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItZ3BpbyIsImZzbCxtcGM1MjAwLWdwaW8iOwotCQkJcmVnID0gPDB4YjAwIDB4NDA+OwotCQkJaW50ZXJydXB0cyA9IDwxIDcgMD47Ci0JCQlncGlvLWNvbnRyb2xsZXI7Ci0JCQkjZ3Bpby1jZWxscyA9IDwyPjsKLQkJfTsKLQotCQlncGlvX3drdXA6IGdwaW9AYzAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWdwaW8td2t1cCIsImZzbCxtcGM1MjAwLWdwaW8td2t1cCI7Ci0JCQlyZWcgPSA8MHhjMDAgMHg0MD47Ci0JCQlpbnRlcnJ1cHRzID0gPDEgOCAwIDAgMyAwPjsKLQkJCWdwaW8tY29udHJvbGxlcjsKLQkJCSNncGlvLWNlbGxzID0gPDI+OwotCQl9OwotCi0JCXNwaUBmMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItc3BpIiwiZnNsLG1wYzUyMDAtc3BpIjsKLQkJCXJlZyA9IDwweGYwMCAweDIwPjsKLQkJCWludGVycnVwdHMgPSA8MiAxMyAwIDIgMTQgMD47Ci0JCX07Ci0KLQkJdXNiQDEwMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItb2hjaSIsImZzbCxtcGM1MjAwLW9oY2kiLCJvaGNpLWJlIjsKLQkJCXJlZyA9IDwweDEwMDAgMHhmZj47Ci0JCQlpbnRlcnJ1cHRzID0gPDIgNiAwPjsKLQkJfTsKLQotCQlkbWEtY29udHJvbGxlckAxMjAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWJlc3Rjb21tIiwiZnNsLG1wYzUyMDAtYmVzdGNvbW0iOwotCQkJcmVnID0gPDB4MTIwMCAweDgwPjsKLQkJCWludGVycnVwdHMgPSA8MyAwIDAgIDMgMSAwICAzIDIgMCAgMyAzIDAKLQkJCSAgICAgICAgICAgICAgMyA0IDAgIDMgNSAwICAzIDYgMCAgMyA3IDAKLQkJCSAgICAgICAgICAgICAgMyA4IDAgIDMgOSAwICAzIDEwIDAgIDMgMTEgMAotCQkJICAgICAgICAgICAgICAzIDEyIDAgIDMgMTMgMCAgMyAxNCAwICAzIDE1IDA+OwotCQl9OwotCi0JCXhsYkAxZjAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLXhsYiIsImZzbCxtcGM1MjAwLXhsYiI7Ci0JCQlyZWcgPSA8MHgxZjAwIDB4MTAwPjsKLQkJfTsKLQotCQlzZXJpYWxAMjAwMCB7CQkvLyBQU0MxCisJCXBzY0AyMDAwIHsJCS8vIFBTQzEKIAkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLXBzYy11YXJ0IiwiZnNsLG1wYzUyMDAtcHNjLXVhcnQiOwotCQkJcmVnID0gPDB4MjAwMCAweDEwMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDIgMSAwPjsKIAkJfTsKIAotCQlzZXJpYWxAMjIwMCB7CQkvLyBQU0MyCisJCXBzY0AyMjAwIHsJCS8vIFBTQzIKIAkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLXBzYy11YXJ0IiwiZnNsLG1wYzUyMDAtcHNjLXVhcnQiOwotCQkJcmVnID0gPDB4MjIwMCAweDEwMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDIgMiAwPjsKIAkJfTsKIAotCQlzZXJpYWxAMjQwMCB7CQkvLyBQU0MzCisJCXBzY0AyNDAwIHsJCS8vIFBTQzMKIAkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLXBzYy11YXJ0IiwiZnNsLG1wYzUyMDAtcHNjLXVhcnQiOwotCQkJcmVnID0gPDB4MjQwMCAweDEwMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDIgMyAwPjsKIAkJfTsKIAotCQlzZXJpYWxAMmMwMCB7CQkvLyBQU0M2CisJCXBzY0AyNjAwIHsJCS8vIFBTQzQKKwkJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CisJCX07CisKKwkJcHNjQDI4MDAgewkJLy8gUFNDNQorCQkJc3RhdHVzID0gImRpc2FibGVkIjsKKwkJfTsKKworCQlwc2NAMmMwMCB7CQkvLyBQU0M2CiAJCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1wc2MtdWFydCIsImZzbCxtcGM1MjAwLXBzYy11YXJ0IjsKLQkJCXJlZyA9IDwweDJjMDAgMHgxMDA+OwotCQkJaW50ZXJydXB0cyA9IDwyIDQgMD47CiAJCX07CiAKIAkJZXRoZXJuZXRAMzAwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1mZWMiLCJmc2wsbXBjNTIwMC1mZWMiOwotCQkJcmVnID0gPDB4MzAwMCAweDQwMD47Ci0JCQlsb2NhbC1tYWMtYWRkcmVzcyA9IFsgMDAgMDAgMDAgMDAgMDAgMDAgXTsKLQkJCWludGVycnVwdHMgPSA8MiA1IDA+OwogCQkJcGh5LWhhbmRsZSA9IDwmcGh5MD47CiAJCX07CiAKIAkJbWRpb0AzMDAwIHsKLQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCQkJI3NpemUtY2VsbHMgPSA8MD47Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1tZGlvIiwiZnNsLG1wYzUyMDAtbWRpbyI7Ci0JCQlyZWcgPSA8MHgzMDAwIDB4NDAwPjsgICAgICAgLy8gZmVjIHJhbmdlLCBzaW5jZSB3ZSBuZWVkIHRvIHNldHVwIGZlYyBpbnRlcnJ1cHRzCi0JCQlpbnRlcnJ1cHRzID0gPDIgNSAwPjsgICAvLyB0aGVzZSBhcmUgZm9yICJtaWkgY29tbWFuZCBmaW5pc2hlZCIsIG5vdCBsaW5rIGNoYW5nZXMgJiBjby4KLQogCQkJcGh5MDogZXRoZXJuZXQtcGh5QDAgewogCQkJCXJlZyA9IDwwPjsKIAkJCX07CiAJCX07CiAKLQkJaTJjQDNkNDAgewotCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCQkjc2l6ZS1jZWxscyA9IDwwPjsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWkyYyIsImZzbCxtcGM1MjAwLWkyYyIsImZzbC1pMmMiOwotCQkJcmVnID0gPDB4M2Q0MCAweDQwPjsKLQkJCWludGVycnVwdHMgPSA8MiAxNiAwPjsKKwkJYXRhQDNhMDAgeworCQkJc3RhdHVzID0gImRpc2FibGVkIjsKIAkJfTsKIAotCQlzcmFtQDgwMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItc3JhbSIsImZzbCxtcGM1MjAwLXNyYW0iOwotCQkJcmVnID0gPDB4ODAwMCAweDQwMDA+OworCQlpMmNAM2QwMCB7CisJCQlzdGF0dXMgPSAiZGlzYWJsZWQiOwogCQl9OworCisJfTsKKworCXBjaUBmMDAwMGQwMCB7CisJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CiAJfTsKIAogCWxvY2FsYnVzIHsKLQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItbHBiIiwic2ltcGxlLWJ1cyI7Ci0JCSNhZGRyZXNzLWNlbGxzID0gPDI+OwotCQkjc2l6ZS1jZWxscyA9IDwxPjsKLQkJcmFuZ2VzID0gPDAgMCAweGZjMDAwMDAwIDB4MjAwMDAwMD47Ci0KIAkJLy8gMTYtYml0IGZsYXNoIGRldmljZSBhdCBMb2NhbFBsdXMgQnVzIENTMAogCQlmbGFzaEAwLDAgewogCQkJY29tcGF0aWJsZSA9ICJjZmktZmxhc2giOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2RpZ3N5X210Yy5kdHMgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZGlnc3lfbXRjLmR0cwppbmRleCA4ZTliZTZiLi4yN2JkMjY3IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZGlnc3lfbXRjLmR0cworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZGlnc3lfbXRjLmR0cwpAQCAtMTEsMTk1ICsxMSw2OCBAQAogICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICAqLwogCi0vZHRzLXYxLzsKKy9pbmNsdWRlLyAibXBjNTIwMGIuZHRzaSIKIAogLyB7CiAJbW9kZWwgPSAiaW50ZXJjb250cm9sLGRpZ3N5LW10YyI7CiAJY29tcGF0aWJsZSA9ICJpbnRlcmNvbnRyb2wsZGlnc3ktbXRjIjsKLQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkjc2l6ZS1jZWxscyA9IDwxPjsKLQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGM1MjAwX3BpYz47Ci0KLQljcHVzIHsKLQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCSNzaXplLWNlbGxzID0gPDA+OwotCi0JCVBvd2VyUEMsNTIwMEAwIHsKLQkJCWRldmljZV90eXBlID0gImNwdSI7Ci0JCQlyZWcgPSA8MD47Ci0JCQlkLWNhY2hlLWxpbmUtc2l6ZSA9IDwzMj47Ci0JCQlpLWNhY2hlLWxpbmUtc2l6ZSA9IDwzMj47Ci0JCQlkLWNhY2hlLXNpemUgPSA8MHg0MDAwPjsJCS8vIEwxLCAxNksKLQkJCWktY2FjaGUtc2l6ZSA9IDwweDQwMDA+OwkJLy8gTDEsIDE2SwotCQkJdGltZWJhc2UtZnJlcXVlbmN5ID0gPDA+OwkvLyBmcm9tIGJvb3Rsb2FkZXIKLQkJCWJ1cy1mcmVxdWVuY3kgPSA8MD47CQkvLyBmcm9tIGJvb3Rsb2FkZXIKLQkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsJCS8vIGZyb20gYm9vdGxvYWRlcgotCQl9OwotCX07CiAKIAltZW1vcnkgewotCQlkZXZpY2VfdHlwZSA9ICJtZW1vcnkiOwogCQlyZWcgPSA8MHgwMDAwMDAwMCAweDAyMDAwMDAwPjsJLy8gMzJNQgogCX07CiAKIAlzb2M1MjAwQGYwMDAwMDAwIHsKLQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCSNzaXplLWNlbGxzID0gPDE+OwotCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1pbW1yIjsKLQkJcmFuZ2VzID0gPDAgMHhmMDAwMDAwMCAweDAwMDBjMDAwPjsKLQkJcmVnID0gPDB4ZjAwMDAwMDAgMHgwMDAwMDEwMD47Ci0JCWJ1cy1mcmVxdWVuY3kgPSA8MD47CQkvLyBmcm9tIGJvb3Rsb2FkZXIKLQkJc3lzdGVtLWZyZXF1ZW5jeSA9IDwwPjsJCS8vIGZyb20gYm9vdGxvYWRlcgotCi0JCWNkbUAyMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItY2RtIiwiZnNsLG1wYzUyMDAtY2RtIjsKLQkJCXJlZyA9IDwweDIwMCAweDM4PjsKLQkJfTsKLQotCQltcGM1MjAwX3BpYzogaW50ZXJydXB0LWNvbnRyb2xsZXJANTAwIHsKLQkJCS8vIDUyMDAgaW50ZXJydXB0cyBhcmUgZW5jb2RlZCBpbnRvIHR3byBsZXZlbHM7Ci0JCQlpbnRlcnJ1cHQtY29udHJvbGxlcjsKLQkJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8Mz47Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1waWMiLCJmc2wsbXBjNTIwMC1waWMiOwotCQkJcmVnID0gPDB4NTAwIDB4ODA+OwotCQl9OwotCiAJCXRpbWVyQDYwMCB7CS8vIEdlbmVyYWwgUHVycG9zZSBUaW1lcgotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItZ3B0IiwiZnNsLG1wYzUyMDAtZ3B0IjsKLQkJCXJlZyA9IDwweDYwMCAweDEwPjsKLQkJCWludGVycnVwdHMgPSA8MSA5IDA+OwogCQkJZnNsLGhhcy13ZHQ7CiAJCX07CiAKLQkJdGltZXJANjEwIHsJLy8gR2VuZXJhbCBQdXJwb3NlIFRpbWVyCi0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1ncHQiLCJmc2wsbXBjNTIwMC1ncHQiOwotCQkJcmVnID0gPDB4NjEwIDB4MTA+OwotCQkJaW50ZXJydXB0cyA9IDwxIDEwIDA+OworCQlydGNAODAwIHsKKwkJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CiAJCX07CiAKLQkJdGltZXJANjIwIHsJLy8gR2VuZXJhbCBQdXJwb3NlIFRpbWVyCi0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1ncHQiLCJmc2wsbXBjNTIwMC1ncHQiOwotCQkJcmVnID0gPDB4NjIwIDB4MTA+OwotCQkJaW50ZXJydXB0cyA9IDwxIDExIDA+OworCQljYW5AOTAwIHsKKwkJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CiAJCX07CiAKLQkJdGltZXJANjMwIHsJLy8gR2VuZXJhbCBQdXJwb3NlIFRpbWVyCi0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1ncHQiLCJmc2wsbXBjNTIwMC1ncHQiOwotCQkJcmVnID0gPDB4NjMwIDB4MTA+OwotCQkJaW50ZXJydXB0cyA9IDwxIDEyIDA+OworCQljYW5AOTgwIHsKKwkJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CiAJCX07CiAKLQkJdGltZXJANjQwIHsJLy8gR2VuZXJhbCBQdXJwb3NlIFRpbWVyCi0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1ncHQiLCJmc2wsbXBjNTIwMC1ncHQiOwotCQkJcmVnID0gPDB4NjQwIDB4MTA+OwotCQkJaW50ZXJydXB0cyA9IDwxIDEzIDA+OworCQlwc2NAMjAwMCB7CQkvLyBQU0MxCisJCQlzdGF0dXMgPSAiZGlzYWJsZWQiOwogCQl9OwogCi0JCXRpbWVyQDY1MCB7CS8vIEdlbmVyYWwgUHVycG9zZSBUaW1lcgotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItZ3B0IiwiZnNsLG1wYzUyMDAtZ3B0IjsKLQkJCXJlZyA9IDwweDY1MCAweDEwPjsKLQkJCWludGVycnVwdHMgPSA8MSAxNCAwPjsKKwkJcHNjQDIyMDAgewkJLy8gUFNDMgorCQkJc3RhdHVzID0gImRpc2FibGVkIjsKIAkJfTsKIAotCQl0aW1lckA2NjAgewkvLyBHZW5lcmFsIFB1cnBvc2UgVGltZXIKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWdwdCIsImZzbCxtcGM1MjAwLWdwdCI7Ci0JCQlyZWcgPSA8MHg2NjAgMHgxMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDEgMTUgMD47CisJCXBzY0AyNDAwIHsJCS8vIFBTQzMKKwkJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CiAJCX07CiAKLQkJdGltZXJANjcwIHsJLy8gR2VuZXJhbCBQdXJwb3NlIFRpbWVyCi0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1ncHQiLCJmc2wsbXBjNTIwMC1ncHQiOwotCQkJcmVnID0gPDB4NjcwIDB4MTA+OwotCQkJaW50ZXJydXB0cyA9IDwxIDE2IDA+OwotCQl9OwotCi0JCWdwaW9fc2ltcGxlOiBncGlvQGIwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1ncGlvIiwiZnNsLG1wYzUyMDAtZ3BpbyI7Ci0JCQlyZWcgPSA8MHhiMDAgMHg0MD47Ci0JCQlpbnRlcnJ1cHRzID0gPDEgNyAwPjsKLQkJCWdwaW8tY29udHJvbGxlcjsKLQkJCSNncGlvLWNlbGxzID0gPDI+OwotCQl9OwotCi0JCWdwaW9fd2t1cDogZ3Bpb0BjMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItZ3Bpby13a3VwIiwiZnNsLG1wYzUyMDAtZ3Bpby13a3VwIjsKLQkJCXJlZyA9IDwweGMwMCAweDQwPjsKLQkJCWludGVycnVwdHMgPSA8MSA4IDAgMCAzIDA+OwotCQkJZ3Bpby1jb250cm9sbGVyOwotCQkJI2dwaW8tY2VsbHMgPSA8Mj47Ci0JCX07Ci0KLQkJc3BpQGYwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1zcGkiLCJmc2wsbXBjNTIwMC1zcGkiOwotCQkJcmVnID0gPDB4ZjAwIDB4MjA+OwotCQkJaW50ZXJydXB0cyA9IDwyIDEzIDAgMiAxNCAwPjsKLQkJfTsKLQotCQl1c2JAMTAwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1vaGNpIiwiZnNsLG1wYzUyMDAtb2hjaSIsIm9oY2ktYmUiOwotCQkJcmVnID0gPDB4MTAwMCAweGZmPjsKLQkJCWludGVycnVwdHMgPSA8MiA2IDA+OwotCQl9OwotCi0JCWRtYS1jb250cm9sbGVyQDEyMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItYmVzdGNvbW0iLCJmc2wsbXBjNTIwMC1iZXN0Y29tbSI7Ci0JCQlyZWcgPSA8MHgxMjAwIDB4ODA+OwotCQkJaW50ZXJydXB0cyA9IDwzIDAgMCAgMyAxIDAgIDMgMiAwICAzIDMgMAotCQkJICAgICAgICAgICAgICAzIDQgMCAgMyA1IDAgIDMgNiAwICAzIDcgMAotCQkJICAgICAgICAgICAgICAzIDggMCAgMyA5IDAgIDMgMTAgMCAgMyAxMSAwCi0JCQkgICAgICAgICAgICAgIDMgMTIgMCAgMyAxMyAwICAzIDE0IDAgIDMgMTUgMD47Ci0JCX07Ci0KLQkJeGxiQDFmMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGIteGxiIiwiZnNsLG1wYzUyMDAteGxiIjsKLQkJCXJlZyA9IDwweDFmMDAgMHgxMDA+OwotCQl9OwotCi0JCXNlcmlhbEAyNjAwIHsJCS8vIFBTQzQKKwkJcHNjQDI2MDAgewkJLy8gUFNDNAogCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItcHNjLXVhcnQiLCJmc2wsbXBjNTIwMC1wc2MtdWFydCI7Ci0JCQlyZWcgPSA8MHgyNjAwIDB4MTAwPjsKLQkJCWludGVycnVwdHMgPSA8MiAxMSAwPjsKIAkJfTsKIAotCQlzZXJpYWxAMjgwMCB7CQkvLyBQU0M1CisJCXBzY0AyODAwIHsJCS8vIFBTQzUKIAkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLXBzYy11YXJ0IiwiZnNsLG1wYzUyMDAtcHNjLXVhcnQiOwotCQkJcmVnID0gPDB4MjgwMCAweDEwMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDIgMTIgMD47CisJCX07CisKKwkJcHNjQDJjMDAgewkJLy8gUFNDNgorCQkJc3RhdHVzID0gImRpc2FibGVkIjsKIAkJfTsKIAogCQlldGhlcm5ldEAzMDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWZlYyIsImZzbCxtcGM1MjAwLWZlYyI7Ci0JCQlyZWcgPSA8MHgzMDAwIDB4NDAwPjsKLQkJCWxvY2FsLW1hYy1hZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOwotCQkJaW50ZXJydXB0cyA9IDwyIDUgMD47CiAJCQlwaHktaGFuZGxlID0gPCZwaHkwPjsKIAkJfTsKIAogCQltZGlvQDMwMDAgewotCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCQkjc2l6ZS1jZWxscyA9IDwwPjsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLW1kaW8iLCJmc2wsbXBjNTIwMC1tZGlvIjsKLQkJCXJlZyA9IDwweDMwMDAgMHg0MDA+OyAgICAgICAvLyBmZWMgcmFuZ2UsIHNpbmNlIHdlIG5lZWQgdG8gc2V0dXAgZmVjIGludGVycnVwdHMKLQkJCWludGVycnVwdHMgPSA8MiA1IDA+OyAgIC8vIHRoZXNlIGFyZSBmb3IgIm1paSBjb21tYW5kIGZpbmlzaGVkIiwgbm90IGxpbmsgY2hhbmdlcyAmIGNvLgotCiAJCQlwaHkwOiBldGhlcm5ldC1waHlAMCB7CiAJCQkJcmVnID0gPDA+OwogCQkJfTsKIAkJfTsKIAotCQlhdGFAM2EwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1hdGEiLCJmc2wsbXBjNTIwMC1hdGEiOwotCQkJcmVnID0gPDB4M2EwMCAweDEwMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDIgNyAwPjsKLQkJfTsKLQogCQlpMmNAM2QwMCB7Ci0JCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJCSNzaXplLWNlbGxzID0gPDA+OwotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItaTJjIiwiZnNsLG1wYzUyMDAtaTJjIiwiZnNsLWkyYyI7Ci0JCQlyZWcgPSA8MHgzZDAwIDB4NDA+OwotCQkJaW50ZXJydXB0cyA9IDwyIDE1IDA+OwotCiAJCQlydGNANTAgewogCQkJCWNvbXBhdGlibGUgPSAiYXQsMjRjMDgiOwogCQkJCXJlZyA9IDwweDUwPjsKQEAgLTIxMSwxNiArODQsMTYgQEAKIAkJCX07CiAJCX07CiAKLQkJc3JhbUA4MDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLXNyYW0iLCJmc2wsbXBjNTIwMC1zcmFtIjsKLQkJCXJlZyA9IDwweDgwMDAgMHg0MDAwPjsKKwkJaTJjQDNkNDAgeworCQkJc3RhdHVzID0gImRpc2FibGVkIjsKIAkJfTsKIAl9OwogCi0JbHBiIHsKLQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItbHBiIiwic2ltcGxlLWJ1cyI7Ci0JCSNhZGRyZXNzLWNlbGxzID0gPDI+OwotCQkjc2l6ZS1jZWxscyA9IDwxPjsKKwlwY2lAZjAwMDBkMDAgeworCQlzdGF0dXMgPSAiZGlzYWJsZWQiOworCX07CisKKwlsb2NhbGJ1cyB7CiAJCXJhbmdlcyA9IDwwIDAgMHhmZjAwMDAwMCAweDEwMDAwMDA+OwogCiAJCS8vIDE2LWJpdCBmbGFzaCBkZXZpY2UgYXQgTG9jYWxQbHVzIEJ1cyBDUzAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9ob3Rmb290LmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9ob3Rmb290LmR0cwppbmRleCBjYWQ5YzM4Li43MWQzYmI0IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvaG90Zm9vdC5kdHMKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2hvdGZvb3QuZHRzCkBAIC0xMTcsNiArMTE3LDggQEAKIAkJCX07CiAKIAkJCUlJQzogaTJjQGVmNjAwNTAwIHsKKwkJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCQkjc2l6ZS1jZWxscyA9IDwwPjsKIAkJCQljb21wYXRpYmxlID0gImlibSxpaWMtNDA1ZXAiLCAiaWJtLGlpYyI7CiAJCQkJcmVnID0gPDB4ZWY2MDA1MDAgMHgwMDAwMDAxMT47CiAJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmVUlDMD47CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMva2lsYXVlYS5kdHMgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMva2lsYXVlYS5kdHMKaW5kZXggMDgzZTY4ZS4uODllZGIxNiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2tpbGF1ZWEuZHRzCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9raWxhdWVhLmR0cwpAQCAtODIsNiArODIsMTUgQEAKIAkJaW50ZXJydXB0LXBhcmVudCA9IDwmVUlDMD47CiAJfTsKIAorCUNQTTA6IGNwbSB7CisJCWNvbXBhdGlibGUgPSAiaWJtLGNwbSI7CisJCWRjci1hY2Nlc3MtbWV0aG9kID0gIm5hdGl2ZSI7CisJCWRjci1yZWcgPSA8MHgwYjAgMHgwMDM+OworCQl1bnVzZWQtdW5pdHMgPSA8MHgwMDAwMDAwMD47CisJCWlkbGUtZG96ZSA9IDwweDAyMDAwMDAwPjsKKwkJc3RhbmRieSA9IDwweGUzZTc0ODAwPjsKKwl9OworCiAJcGxiIHsKIAkJY29tcGF0aWJsZSA9ICJpYm0scGxiLTQwNWV4IiwgImlibSxwbGI0IjsKIAkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbGl0ZTUyMDBiLmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9saXRlNTIwMGIuZHRzCmluZGV4IDU5NzAyYWMuLmZiMjg4YmIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9saXRlNTIwMGIuZHRzCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9saXRlNTIwMGIuZHRzCkBAIC0xMCwyNTYgKzEwLDc1IEBACiAgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogICovCiAKLS9kdHMtdjEvOworL2luY2x1ZGUvICJtcGM1MjAwYi5kdHNpIgogCiAvIHsKIAltb2RlbCA9ICJmc2wsbGl0ZTUyMDBiIjsKIAljb21wYXRpYmxlID0gImZzbCxsaXRlNTIwMGIiOwotCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCSNzaXplLWNlbGxzID0gPDE+OwotCWludGVycnVwdC1wYXJlbnQgPSA8Jm1wYzUyMDBfcGljPjsKLQotCWNwdXMgewotCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJI3NpemUtY2VsbHMgPSA8MD47Ci0KLQkJUG93ZXJQQyw1MjAwQDAgewotCQkJZGV2aWNlX3R5cGUgPSAiY3B1IjsKLQkJCXJlZyA9IDwwPjsKLQkJCWQtY2FjaGUtbGluZS1zaXplID0gPDMyPjsKLQkJCWktY2FjaGUtbGluZS1zaXplID0gPDMyPjsKLQkJCWQtY2FjaGUtc2l6ZSA9IDwweDQwMDA+OwkvLyBMMSwgMTZLCi0JCQlpLWNhY2hlLXNpemUgPSA8MHg0MDAwPjsJLy8gTDEsIDE2SwotCQkJdGltZWJhc2UtZnJlcXVlbmN5ID0gPDA+OwkvLyBmcm9tIGJvb3Rsb2FkZXIKLQkJCWJ1cy1mcmVxdWVuY3kgPSA8MD47CQkvLyBmcm9tIGJvb3Rsb2FkZXIKLQkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsJCS8vIGZyb20gYm9vdGxvYWRlcgotCQl9OwotCX07CiAKIAltZW1vcnkgewotCQlkZXZpY2VfdHlwZSA9ICJtZW1vcnkiOwogCQlyZWcgPSA8MHgwMDAwMDAwMCAweDEwMDAwMDAwPjsJLy8gMjU2TUIKIAl9OwogCiAJc29jNTIwMEBmMDAwMDAwMCB7Ci0JCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCQkjc2l6ZS1jZWxscyA9IDwxPjsKLQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItaW1tciI7Ci0JCXJhbmdlcyA9IDwwIDB4ZjAwMDAwMDAgMHgwMDAwYzAwMD47Ci0JCXJlZyA9IDwweGYwMDAwMDAwIDB4MDAwMDAxMDA+OwotCQlidXMtZnJlcXVlbmN5ID0gPDA+OwkJLy8gZnJvbSBib290bG9hZGVyCi0JCXN5c3RlbS1mcmVxdWVuY3kgPSA8MD47CQkvLyBmcm9tIGJvb3Rsb2FkZXIKLQotCQljZG1AMjAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWNkbSIsImZzbCxtcGM1MjAwLWNkbSI7Ci0JCQlyZWcgPSA8MHgyMDAgMHgzOD47Ci0JCX07Ci0KLQkJbXBjNTIwMF9waWM6IGludGVycnVwdC1jb250cm9sbGVyQDUwMCB7Ci0JCQkvLyA1MjAwIGludGVycnVwdHMgYXJlIGVuY29kZWQgaW50byB0d28gbGV2ZWxzOwotCQkJaW50ZXJydXB0LWNvbnRyb2xsZXI7Ci0JCQkjaW50ZXJydXB0LWNlbGxzID0gPDM+OwotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItcGljIiwiZnNsLG1wYzUyMDAtcGljIjsKLQkJCXJlZyA9IDwweDUwMCAweDgwPjsKLQkJfTsKLQogCQl0aW1lckA2MDAgewkvLyBHZW5lcmFsIFB1cnBvc2UgVGltZXIKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWdwdCIsImZzbCxtcGM1MjAwLWdwdCI7Ci0JCQlyZWcgPSA8MHg2MDAgMHgxMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDEgOSAwPjsKIAkJCWZzbCxoYXMtd2R0OwogCQl9OwogCi0JCXRpbWVyQDYxMCB7CS8vIEdlbmVyYWwgUHVycG9zZSBUaW1lcgotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItZ3B0IiwiZnNsLG1wYzUyMDAtZ3B0IjsKLQkJCXJlZyA9IDwweDYxMCAweDEwPjsKLQkJCWludGVycnVwdHMgPSA8MSAxMCAwPjsKLQkJfTsKLQotCQl0aW1lckA2MjAgewkvLyBHZW5lcmFsIFB1cnBvc2UgVGltZXIKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWdwdCIsImZzbCxtcGM1MjAwLWdwdCI7Ci0JCQlyZWcgPSA8MHg2MjAgMHgxMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDEgMTEgMD47Ci0JCX07Ci0KLQkJdGltZXJANjMwIHsJLy8gR2VuZXJhbCBQdXJwb3NlIFRpbWVyCi0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1ncHQiLCJmc2wsbXBjNTIwMC1ncHQiOwotCQkJcmVnID0gPDB4NjMwIDB4MTA+OwotCQkJaW50ZXJydXB0cyA9IDwxIDEyIDA+OwotCQl9OwotCi0JCXRpbWVyQDY0MCB7CS8vIEdlbmVyYWwgUHVycG9zZSBUaW1lcgotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItZ3B0IiwiZnNsLG1wYzUyMDAtZ3B0IjsKLQkJCXJlZyA9IDwweDY0MCAweDEwPjsKLQkJCWludGVycnVwdHMgPSA8MSAxMyAwPjsKLQkJfTsKLQotCQl0aW1lckA2NTAgewkvLyBHZW5lcmFsIFB1cnBvc2UgVGltZXIKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWdwdCIsImZzbCxtcGM1MjAwLWdwdCI7Ci0JCQlyZWcgPSA8MHg2NTAgMHgxMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDEgMTQgMD47Ci0JCX07Ci0KLQkJdGltZXJANjYwIHsJLy8gR2VuZXJhbCBQdXJwb3NlIFRpbWVyCi0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1ncHQiLCJmc2wsbXBjNTIwMC1ncHQiOwotCQkJcmVnID0gPDB4NjYwIDB4MTA+OwotCQkJaW50ZXJydXB0cyA9IDwxIDE1IDA+OwotCQl9OwotCi0JCXRpbWVyQDY3MCB7CS8vIEdlbmVyYWwgUHVycG9zZSBUaW1lcgotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItZ3B0IiwiZnNsLG1wYzUyMDAtZ3B0IjsKLQkJCXJlZyA9IDwweDY3MCAweDEwPjsKLQkJCWludGVycnVwdHMgPSA8MSAxNiAwPjsKLQkJfTsKLQotCQlydGNAODAwIHsJLy8gUmVhbCB0aW1lIGNsb2NrCi0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1ydGMiLCJmc2wsbXBjNTIwMC1ydGMiOwotCQkJcmVnID0gPDB4ODAwIDB4MTAwPjsKLQkJCWludGVycnVwdHMgPSA8MSA1IDAgMSA2IDA+OwotCQl9OwotCi0JCWNhbkA5MDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItbXNjYW4iLCJmc2wsbXBjNTIwMC1tc2NhbiI7Ci0JCQlpbnRlcnJ1cHRzID0gPDIgMTcgMD47Ci0JCQlyZWcgPSA8MHg5MDAgMHg4MD47Ci0JCX07Ci0KLQkJY2FuQDk4MCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1tc2NhbiIsImZzbCxtcGM1MjAwLW1zY2FuIjsKLQkJCWludGVycnVwdHMgPSA8MiAxOCAwPjsKLQkJCXJlZyA9IDwweDk4MCAweDgwPjsKLQkJfTsKLQotCQlncGlvX3NpbXBsZTogZ3Bpb0BiMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItZ3BpbyIsImZzbCxtcGM1MjAwLWdwaW8iOwotCQkJcmVnID0gPDB4YjAwIDB4NDA+OwotCQkJaW50ZXJydXB0cyA9IDwxIDcgMD47Ci0JCQlncGlvLWNvbnRyb2xsZXI7Ci0JCQkjZ3Bpby1jZWxscyA9IDwyPjsKLQkJfTsKLQotCQlncGlvX3drdXA6IGdwaW9AYzAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWdwaW8td2t1cCIsImZzbCxtcGM1MjAwLWdwaW8td2t1cCI7Ci0JCQlyZWcgPSA8MHhjMDAgMHg0MD47Ci0JCQlpbnRlcnJ1cHRzID0gPDEgOCAwIDAgMyAwPjsKLQkJCWdwaW8tY29udHJvbGxlcjsKLQkJCSNncGlvLWNlbGxzID0gPDI+OwotCQl9OwotCi0JCXNwaUBmMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItc3BpIiwiZnNsLG1wYzUyMDAtc3BpIjsKLQkJCXJlZyA9IDwweGYwMCAweDIwPjsKLQkJCWludGVycnVwdHMgPSA8MiAxMyAwIDIgMTQgMD47Ci0JCX07Ci0KLQkJdXNiQDEwMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItb2hjaSIsImZzbCxtcGM1MjAwLW9oY2kiLCJvaGNpLWJlIjsKLQkJCXJlZyA9IDwweDEwMDAgMHhmZj47Ci0JCQlpbnRlcnJ1cHRzID0gPDIgNiAwPjsKLQkJfTsKLQotCQlkbWEtY29udHJvbGxlckAxMjAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWJlc3Rjb21tIiwiZnNsLG1wYzUyMDAtYmVzdGNvbW0iOwotCQkJcmVnID0gPDB4MTIwMCAweDgwPjsKLQkJCWludGVycnVwdHMgPSA8MyAwIDAgIDMgMSAwICAzIDIgMCAgMyAzIDAKLQkJCSAgICAgICAgICAgICAgMyA0IDAgIDMgNSAwICAzIDYgMCAgMyA3IDAKLQkJCSAgICAgICAgICAgICAgMyA4IDAgIDMgOSAwICAzIDEwIDAgIDMgMTEgMAotCQkJICAgICAgICAgICAgICAzIDEyIDAgIDMgMTMgMCAgMyAxNCAwICAzIDE1IDA+OwotCQl9OwotCi0JCXhsYkAxZjAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLXhsYiIsImZzbCxtcGM1MjAwLXhsYiI7Ci0JCQlyZWcgPSA8MHgxZjAwIDB4MTAwPjsKLQkJfTsKLQotCQlzZXJpYWxAMjAwMCB7CQkvLyBQU0MxCisJCXBzY0AyMDAwIHsJCS8vIFBTQzEKIAkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLXBzYy11YXJ0IiwiZnNsLG1wYzUyMDAtcHNjLXVhcnQiOwogCQkJY2VsbC1pbmRleCA9IDwwPjsKLQkJCXJlZyA9IDwweDIwMDAgMHgxMDA+OwotCQkJaW50ZXJydXB0cyA9IDwyIDEgMD47CisJCX07CisKKwkJcHNjQDIyMDAgewkJLy8gUFNDMgorCQkJc3RhdHVzID0gImRpc2FibGVkIjsKKwkJfTsKKworCQlwc2NAMjQwMCB7CQkvLyBQU0MzCisJCQlzdGF0dXMgPSAiZGlzYWJsZWQiOworCQl9OworCisJCXBzY0AyNjAwIHsJCS8vIFBTQzQKKwkJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CisJCX07CisKKwkJcHNjQDI4MDAgewkJLy8gUFNDNQorCQkJc3RhdHVzID0gImRpc2FibGVkIjsKKwkJfTsKKworCQlwc2NAMmMwMCB7CQkvLyBQU0M2CisJCQlzdGF0dXMgPSAiZGlzYWJsZWQiOwogCQl9OwogCiAJCS8vIFBTQzIgaW4gYWM5NyBtb2RlIGV4YW1wbGUKIAkJLy9hYzk3QDIyMDAgewkJLy8gUFNDMgogCQkvLwljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1wc2MtYWM5NyIsImZzbCxtcGM1MjAwLXBzYy1hYzk3IjsKIAkJLy8JY2VsbC1pbmRleCA9IDwxPjsKLQkJLy8JcmVnID0gPDB4MjIwMCAweDEwMD47Ci0JCS8vCWludGVycnVwdHMgPSA8MiAyIDA+OwogCQkvL307CiAKIAkJLy8gUFNDMyBpbiBDT0RFQyBtb2RlIGV4YW1wbGUKIAkJLy9pMnNAMjQwMCB7CQkvLyBQU0MzCiAJCS8vCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLXBzYy1pMnMiOyAvL25vdCA1MjAwIGNvbXBhdGlibGUKIAkJLy8JY2VsbC1pbmRleCA9IDwyPjsKLQkJLy8JcmVnID0gPDB4MjQwMCAweDEwMD47Ci0JCS8vCWludGVycnVwdHMgPSA8MiAzIDA+OwotCQkvL307Ci0KLQkJLy8gUFNDNCBpbiB1YXJ0IG1vZGUgZXhhbXBsZQotCQkvL3NlcmlhbEAyNjAwIHsJCS8vIFBTQzQKLQkJLy8JY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItcHNjLXVhcnQiLCJmc2wsbXBjNTIwMC1wc2MtdWFydCI7Ci0JCS8vCWNlbGwtaW5kZXggPSA8Mz47Ci0JCS8vCXJlZyA9IDwweDI2MDAgMHgxMDA+OwotCQkvLwlpbnRlcnJ1cHRzID0gPDIgMTEgMD47Ci0JCS8vfTsKLQotCQkvLyBQU0M1IGluIHVhcnQgbW9kZSBleGFtcGxlCi0JCS8vc2VyaWFsQDI4MDAgewkJLy8gUFNDNQotCQkvLwljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1wc2MtdWFydCIsImZzbCxtcGM1MjAwLXBzYy11YXJ0IjsKLQkJLy8JY2VsbC1pbmRleCA9IDw0PjsKLQkJLy8JcmVnID0gPDB4MjgwMCAweDEwMD47Ci0JCS8vCWludGVycnVwdHMgPSA8MiAxMiAwPjsKIAkJLy99OwogCiAJCS8vIFBTQzYgaW4gc3BpIG1vZGUgZXhhbXBsZQogCQkvL3NwaUAyYzAwIHsJCS8vIFBTQzYKIAkJLy8JY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItcHNjLXNwaSIsImZzbCxtcGM1MjAwLXBzYy1zcGkiOwogCQkvLwljZWxsLWluZGV4ID0gPDU+OwotCQkvLwlyZWcgPSA8MHgyYzAwIDB4MTAwPjsKLQkJLy8JaW50ZXJydXB0cyA9IDwyIDQgMD47CiAJCS8vfTsKIAogCQlldGhlcm5ldEAzMDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWZlYyIsImZzbCxtcGM1MjAwLWZlYyI7Ci0JCQlyZWcgPSA8MHgzMDAwIDB4NDAwPjsKLQkJCWxvY2FsLW1hYy1hZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOwotCQkJaW50ZXJydXB0cyA9IDwyIDUgMD47CiAJCQlwaHktaGFuZGxlID0gPCZwaHkwPjsKIAkJfTsKIAogCQltZGlvQDMwMDAgewotCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCQkjc2l6ZS1jZWxscyA9IDwwPjsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLW1kaW8iLCJmc2wsbXBjNTIwMC1tZGlvIjsKLQkJCXJlZyA9IDwweDMwMDAgMHg0MDA+OwkvLyBmZWMgcmFuZ2UsIHNpbmNlIHdlIG5lZWQgdG8gc2V0dXAgZmVjIGludGVycnVwdHMKLQkJCWludGVycnVwdHMgPSA8MiA1IDA+OwkvLyB0aGVzZSBhcmUgZm9yICJtaWkgY29tbWFuZCBmaW5pc2hlZCIsIG5vdCBsaW5rIGNoYW5nZXMgJiBjby4KLQogCQkJcGh5MDogZXRoZXJuZXQtcGh5QDAgewogCQkJCXJlZyA9IDwwPjsKIAkJCX07CiAJCX07CiAKLQkJYXRhQDNhMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItYXRhIiwiZnNsLG1wYzUyMDAtYXRhIjsKLQkJCXJlZyA9IDwweDNhMDAgMHgxMDA+OwotCQkJaW50ZXJydXB0cyA9IDwyIDcgMD47Ci0JCX07Ci0KLQkJaTJjQDNkMDAgewotCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCQkjc2l6ZS1jZWxscyA9IDwwPjsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWkyYyIsImZzbCxtcGM1MjAwLWkyYyIsImZzbC1pMmMiOwotCQkJcmVnID0gPDB4M2QwMCAweDQwPjsKLQkJCWludGVycnVwdHMgPSA8MiAxNSAwPjsKLQkJfTsKLQogCQlpMmNAM2Q0MCB7Ci0JCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJCSNzaXplLWNlbGxzID0gPDA+OwotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItaTJjIiwiZnNsLG1wYzUyMDAtaTJjIiwiZnNsLWkyYyI7Ci0JCQlyZWcgPSA8MHgzZDQwIDB4NDA+OwotCQkJaW50ZXJydXB0cyA9IDwyIDE2IDA+OwotCiAJCQllZXByb21ANTAgewogCQkJCWNvbXBhdGlibGUgPSAiYXRtZWwsMjRjMDIiOwogCQkJCXJlZyA9IDwweDUwPjsKQEAgLTI3MywxMiArOTIsNiBAQAogCX07CiAKIAlwY2lAZjAwMDBkMDAgewotCQkjaW50ZXJydXB0LWNlbGxzID0gPDE+OwotCQkjc2l6ZS1jZWxscyA9IDwyPjsKLQkJI2FkZHJlc3MtY2VsbHMgPSA8Mz47Ci0JCWRldmljZV90eXBlID0gInBjaSI7Ci0JCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLXBjaSIsImZzbCxtcGM1MjAwLXBjaSI7Ci0JCXJlZyA9IDwweGYwMDAwZDAwIDB4MTAwPjsKIAkJaW50ZXJydXB0LW1hcC1tYXNrID0gPDB4ZjgwMCAwIDAgNz47CiAJCWludGVycnVwdC1tYXAgPSA8MHhjMDAwIDAgMCAxICZtcGM1MjAwX3BpYyAwIDAgMyAvLyAxc3Qgc2xvdAogCQkJCSAweGMwMDAgMCAwIDIgJm1wYzUyMDBfcGljIDEgMSAzCkBAIC0yOTgsMTEgKzExMSw2IEBACiAJfTsKIAogCWxvY2FsYnVzIHsKLQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItbHBiIiwiZnNsLG1wYzUyMDAtbHBiIiwic2ltcGxlLWJ1cyI7Ci0KLQkJI2FkZHJlc3MtY2VsbHMgPSA8Mj47Ci0JCSNzaXplLWNlbGxzID0gPDE+OwotCiAJCXJhbmdlcyA9IDwwIDAgMHhmZTAwMDAwMCAweDAyMDAwMDAwPjsKIAogCQlmbGFzaEAwLDAgewpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21lZGlhNTIwMC5kdHMgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbWVkaWE1MjAwLmR0cwppbmRleCAwYzM5MDJiLi40OGQ3MmYzIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbWVkaWE1MjAwLmR0cworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbWVkaWE1MjAwLmR0cwpAQCAtMTEsMTQgKzExLDExIEBACiAgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogICovCiAKLS9kdHMtdjEvOworL2luY2x1ZGUvICJtcGM1MjAwYi5kdHNpIgogCiAvIHsKIAltb2RlbCA9ICJmc2wsbWVkaWE1MjAwIjsKIAljb21wYXRpYmxlID0gImZzbCxtZWRpYTUyMDAiOwotCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCSNzaXplLWNlbGxzID0gPDE+OwotCWludGVycnVwdC1wYXJlbnQgPSA8Jm1wYzUyMDBfcGljPjsKIAogCWFsaWFzZXMgewogCQljb25zb2xlID0gJmNvbnNvbGU7CkBAIC0zMCwxNiArMjcsNyBAQAogCX07CiAKIAljcHVzIHsKLQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCSNzaXplLWNlbGxzID0gPDA+OwotCiAJCVBvd2VyUEMsNTIwMEAwIHsKLQkJCWRldmljZV90eXBlID0gImNwdSI7Ci0JCQlyZWcgPSA8MD47Ci0JCQlkLWNhY2hlLWxpbmUtc2l6ZSA9IDwzMj47Ci0JCQlpLWNhY2hlLWxpbmUtc2l6ZSA9IDwzMj47Ci0JCQlkLWNhY2hlLXNpemUgPSA8MHg0MDAwPjsJCS8vIEwxLCAxNksKLQkJCWktY2FjaGUtc2l6ZSA9IDwweDQwMDA+OwkJLy8gTDEsIDE2SwogCQkJdGltZWJhc2UtZnJlcXVlbmN5ID0gPDMzMDAwMDAwPjsJLy8gMzMgTUh6LCB0aGVzZSB3ZXJlIGNvbmZpZ3VyZWQgYnkgVS1Cb290CiAJCQlidXMtZnJlcXVlbmN5ID0gPDEzMjAwMDAwMD47CQkvLyAxMzIgTUh6CiAJCQljbG9jay1mcmVxdWVuY3kgPSA8Mzk2MDAwMDAwPjsJCS8vIDM5NiBNSHoKQEAgLTQ3LDIwNSArMzUsNTcgQEAKIAl9OwogCiAJbWVtb3J5IHsKLQkJZGV2aWNlX3R5cGUgPSAibWVtb3J5IjsKIAkJcmVnID0gPDB4MDAwMDAwMDAgMHgwODAwMDAwMD47CS8vIDEyOE1CIFJBTQogCX07CiAKLQlzb2NAZjAwMDAwMDAgewotCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJI3NpemUtY2VsbHMgPSA8MT47Ci0JCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWltbXIiOwotCQlyYW5nZXMgPSA8MCAweGYwMDAwMDAwIDB4MDAwMGMwMDA+OwotCQlyZWcgPSA8MHhmMDAwMDAwMCAweDAwMDAwMTAwPjsKKwlzb2M1MjAwQGYwMDAwMDAwIHsKIAkJYnVzLWZyZXF1ZW5jeSA9IDwxMzIwMDAwMDA+Oy8vIDEzMiBNSHoKLQkJc3lzdGVtLWZyZXF1ZW5jeSA9IDwwPjsJCS8vIGZyb20gYm9vdGxvYWRlcgotCi0JCWNkbUAyMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItY2RtIiwiZnNsLG1wYzUyMDAtY2RtIjsKLQkJCXJlZyA9IDwweDIwMCAweDM4PjsKLQkJfTsKLQotCQltcGM1MjAwX3BpYzogaW50ZXJydXB0LWNvbnRyb2xsZXJANTAwIHsKLQkJCS8vIDUyMDAgaW50ZXJydXB0cyBhcmUgZW5jb2RlZCBpbnRvIHR3byBsZXZlbHM7Ci0JCQlpbnRlcnJ1cHQtY29udHJvbGxlcjsKLQkJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8Mz47Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1waWMiLCJmc2wsbXBjNTIwMC1waWMiOwotCQkJcmVnID0gPDB4NTAwIDB4ODA+OwotCQl9OwogCiAJCXRpbWVyQDYwMCB7CS8vIEdlbmVyYWwgUHVycG9zZSBUaW1lcgotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItZ3B0IiwiZnNsLG1wYzUyMDAtZ3B0IjsKLQkJCXJlZyA9IDwweDYwMCAweDEwPjsKLQkJCWludGVycnVwdHMgPSA8MSA5IDA+OwogCQkJZnNsLGhhcy13ZHQ7CiAJCX07CiAKLQkJdGltZXJANjEwIHsJLy8gR2VuZXJhbCBQdXJwb3NlIFRpbWVyCi0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1ncHQiLCJmc2wsbXBjNTIwMC1ncHQiOwotCQkJcmVnID0gPDB4NjEwIDB4MTA+OwotCQkJaW50ZXJydXB0cyA9IDwxIDEwIDA+OworCQlwc2NAMjAwMCB7CS8vIFBTQzEKKwkJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CiAJCX07CiAKLQkJdGltZXJANjIwIHsJLy8gR2VuZXJhbCBQdXJwb3NlIFRpbWVyCi0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1ncHQiLCJmc2wsbXBjNTIwMC1ncHQiOwotCQkJcmVnID0gPDB4NjIwIDB4MTA+OwotCQkJaW50ZXJydXB0cyA9IDwxIDExIDA+OworCQlwc2NAMjIwMCB7CS8vIFBTQzIKKwkJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CiAJCX07CiAKLQkJdGltZXJANjMwIHsJLy8gR2VuZXJhbCBQdXJwb3NlIFRpbWVyCi0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1ncHQiLCJmc2wsbXBjNTIwMC1ncHQiOwotCQkJcmVnID0gPDB4NjMwIDB4MTA+OwotCQkJaW50ZXJydXB0cyA9IDwxIDEyIDA+OworCQlwc2NAMjQwMCB7CS8vIFBTQzMKKwkJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CiAJCX07CiAKLQkJdGltZXJANjQwIHsJLy8gR2VuZXJhbCBQdXJwb3NlIFRpbWVyCi0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1ncHQiLCJmc2wsbXBjNTIwMC1ncHQiOwotCQkJcmVnID0gPDB4NjQwIDB4MTA+OwotCQkJaW50ZXJydXB0cyA9IDwxIDEzIDA+OworCQlwc2NAMjYwMCB7CS8vIFBTQzQKKwkJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CiAJCX07CiAKLQkJdGltZXJANjUwIHsJLy8gR2VuZXJhbCBQdXJwb3NlIFRpbWVyCi0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1ncHQiLCJmc2wsbXBjNTIwMC1ncHQiOwotCQkJcmVnID0gPDB4NjUwIDB4MTA+OwotCQkJaW50ZXJydXB0cyA9IDwxIDE0IDA+OwotCQl9OwotCi0JCXRpbWVyQDY2MCB7CS8vIEdlbmVyYWwgUHVycG9zZSBUaW1lcgotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItZ3B0IiwiZnNsLG1wYzUyMDAtZ3B0IjsKLQkJCXJlZyA9IDwweDY2MCAweDEwPjsKLQkJCWludGVycnVwdHMgPSA8MSAxNSAwPjsKLQkJfTsKLQotCQl0aW1lckA2NzAgewkvLyBHZW5lcmFsIFB1cnBvc2UgVGltZXIKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWdwdCIsImZzbCxtcGM1MjAwLWdwdCI7Ci0JCQlyZWcgPSA8MHg2NzAgMHgxMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDEgMTYgMD47Ci0JCX07Ci0KLQkJcnRjQDgwMCB7CS8vIFJlYWwgdGltZSBjbG9jawotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItcnRjIiwiZnNsLG1wYzUyMDAtcnRjIjsKLQkJCXJlZyA9IDwweDgwMCAweDEwMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDEgNSAwIDEgNiAwPjsKLQkJfTsKLQotCQljYW5AOTAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLW1zY2FuIiwiZnNsLG1wYzUyMDAtbXNjYW4iOwotCQkJaW50ZXJydXB0cyA9IDwyIDE3IDA+OwotCQkJcmVnID0gPDB4OTAwIDB4ODA+OwotCQl9OwotCi0JCWNhbkA5ODAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItbXNjYW4iLCJmc2wsbXBjNTIwMC1tc2NhbiI7Ci0JCQlpbnRlcnJ1cHRzID0gPDIgMTggMD47Ci0JCQlyZWcgPSA8MHg5ODAgMHg4MD47Ci0JCX07Ci0KLQkJZ3Bpb19zaW1wbGU6IGdwaW9AYjAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWdwaW8iLCJmc2wsbXBjNTIwMC1ncGlvIjsKLQkJCXJlZyA9IDwweGIwMCAweDQwPjsKLQkJCWludGVycnVwdHMgPSA8MSA3IDA+OwotCQkJZ3Bpby1jb250cm9sbGVyOwotCQkJI2dwaW8tY2VsbHMgPSA8Mj47Ci0JCX07Ci0KLQkJZ3Bpb193a3VwOiBncGlvQGMwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1ncGlvLXdrdXAiLCJmc2wsbXBjNTIwMC1ncGlvLXdrdXAiOwotCQkJcmVnID0gPDB4YzAwIDB4NDA+OwotCQkJaW50ZXJydXB0cyA9IDwxIDggMCAwIDMgMD47Ci0JCQlncGlvLWNvbnRyb2xsZXI7Ci0JCQkjZ3Bpby1jZWxscyA9IDwyPjsKLQkJfTsKLQotCQlzcGlAZjAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLXNwaSIsImZzbCxtcGM1MjAwLXNwaSI7Ci0JCQlyZWcgPSA8MHhmMDAgMHgyMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDIgMTMgMCAyIDE0IDA+OwotCQl9OwotCi0JCXVzYkAxMDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLW9oY2kiLCJmc2wsbXBjNTIwMC1vaGNpIiwib2hjaS1iZSI7Ci0JCQlyZWcgPSA8MHgxMDAwIDB4MTAwPjsKLQkJCWludGVycnVwdHMgPSA8MiA2IDA+OwotCQl9OwotCi0JCWRtYS1jb250cm9sbGVyQDEyMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItYmVzdGNvbW0iLCJmc2wsbXBjNTIwMC1iZXN0Y29tbSI7Ci0JCQlyZWcgPSA8MHgxMjAwIDB4ODA+OwotCQkJaW50ZXJydXB0cyA9IDwzIDAgMCAgMyAxIDAgIDMgMiAwICAzIDMgMAotCQkJICAgICAgICAgICAgICAzIDQgMCAgMyA1IDAgIDMgNiAwICAzIDcgMAotCQkJICAgICAgICAgICAgICAzIDggMCAgMyA5IDAgIDMgMTAgMCAgMyAxMSAwCi0JCQkgICAgICAgICAgICAgIDMgMTIgMCAgMyAxMyAwICAzIDE0IDAgIDMgMTUgMD47Ci0JCX07Ci0KLQkJeGxiQDFmMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGIteGxiIiwiZnNsLG1wYzUyMDAteGxiIjsKLQkJCXJlZyA9IDwweDFmMDAgMHgxMDA+OworCQlwc2NAMjgwMCB7CS8vIFBTQzUKKwkJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CiAJCX07CiAKIAkJLy8gUFNDNiBpbiB1YXJ0IG1vZGUKLQkJY29uc29sZTogc2VyaWFsQDJjMDAgewkJLy8gUFNDNgorCQljb25zb2xlOiBwc2NAMmMwMCB7CQkvLyBQU0M2CiAJCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1wc2MtdWFydCIsImZzbCxtcGM1MjAwLXBzYy11YXJ0IjsKLQkJCWNlbGwtaW5kZXggPSA8NT47Ci0JCQlwb3J0LW51bWJlciA9IDwwPjsgIC8vIExvZ2ljYWwgcG9ydCBhc3NpZ25tZW50Ci0JCQlyZWcgPSA8MHgyYzAwIDB4MTAwPjsKLQkJCWludGVycnVwdHMgPSA8MiA0IDA+OwogCQl9OwogCi0JCWV0aDA6IGV0aGVybmV0QDMwMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItZmVjIiwiZnNsLG1wYzUyMDAtZmVjIjsKLQkJCXJlZyA9IDwweDMwMDAgMHg0MDA+OwotCQkJbG9jYWwtbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07Ci0JCQlpbnRlcnJ1cHRzID0gPDIgNSAwPjsKKwkJZXRoZXJuZXRAMzAwMCB7CiAJCQlwaHktaGFuZGxlID0gPCZwaHkwPjsKIAkJfTsKIAogCQltZGlvQDMwMDAgewotCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCQkjc2l6ZS1jZWxscyA9IDwwPjsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLW1kaW8iLCJmc2wsbXBjNTIwMC1tZGlvIjsKLQkJCXJlZyA9IDwweDMwMDAgMHg0MDA+OwkvLyBmZWMgcmFuZ2UsIHNpbmNlIHdlIG5lZWQgdG8gc2V0dXAgZmVjIGludGVycnVwdHMKLQkJCWludGVycnVwdHMgPSA8MiA1IDA+OwkvLyB0aGVzZSBhcmUgZm9yICJtaWkgY29tbWFuZCBmaW5pc2hlZCIsIG5vdCBsaW5rIGNoYW5nZXMgJiBjby4KLQogCQkJcGh5MDogZXRoZXJuZXQtcGh5QDAgewogCQkJCXJlZyA9IDwwPjsKIAkJCX07CiAJCX07CiAKLQkJYXRhQDNhMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItYXRhIiwiZnNsLG1wYzUyMDAtYXRhIjsKLQkJCXJlZyA9IDwweDNhMDAgMHgxMDA+OwotCQkJaW50ZXJydXB0cyA9IDwyIDcgMD47Ci0JCX07Ci0KLQkJaTJjQDNkMDAgewotCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCQkjc2l6ZS1jZWxscyA9IDwwPjsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWkyYyIsImZzbCxtcGM1MjAwLWkyYyIsImZzbC1pMmMiOwotCQkJcmVnID0gPDB4M2QwMCAweDQwPjsKLQkJCWludGVycnVwdHMgPSA8MiAxNSAwPjsKLQkJfTsKLQotCQlpMmNAM2Q0MCB7Ci0JCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJCSNzaXplLWNlbGxzID0gPDA+OwotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItaTJjIiwiZnNsLG1wYzUyMDAtaTJjIiwiZnNsLWkyYyI7Ci0JCQlyZWcgPSA8MHgzZDQwIDB4NDA+OwotCQkJaW50ZXJydXB0cyA9IDwyIDE2IDA+OwotCQl9OwotCi0JCXNyYW1AODAwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1zcmFtIiwiZnNsLG1wYzUyMDAtc3JhbSI7Ci0JCQlyZWcgPSA8MHg4MDAwIDB4NDAwMD47CisJCXVzYkAxMDAwIHsKKwkJCXJlZyA9IDwweDEwMDAgMHgxMDA+OwogCQl9OwogCX07CiAKIAlwY2lAZjAwMDBkMDAgewotCQkjaW50ZXJydXB0LWNlbGxzID0gPDE+OwotCQkjc2l6ZS1jZWxscyA9IDwyPjsKLQkJI2FkZHJlc3MtY2VsbHMgPSA8Mz47Ci0JCWRldmljZV90eXBlID0gInBjaSI7Ci0JCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLXBjaSIsImZzbCxtcGM1MjAwLXBjaSI7Ci0JCXJlZyA9IDwweGYwMDAwZDAwIDB4MTAwPjsKIAkJaW50ZXJydXB0LW1hcC1tYXNrID0gPDB4ZjgwMCAwIDAgNz47CiAJCWludGVycnVwdC1tYXAgPSA8MHhjMDAwIDAgMCAxICZtZWRpYTUyMDBfZnBnYSAwIDIgLy8gMXN0IHNsb3QKIAkJCQkgMHhjMDAwIDAgMCAyICZtZWRpYTUyMDBfZnBnYSAwIDMKQEAgLTI2MiwzNyArMTAyLDI5IEBACiAKIAkJCQkgMHhlMDAwIDAgMCAxICZtZWRpYTUyMDBfZnBnYSAwIDUgLy8gQ29yYWxJUAogCQkJCT47Ci0JCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsgLy8gRnJvbSBib290IGxvYWRlcgotCQlpbnRlcnJ1cHRzID0gPDIgOCAwIDIgOSAwIDIgMTAgMD47Ci0JCWludGVycnVwdC1wYXJlbnQgPSA8Jm1wYzUyMDBfcGljPjsKLQkJYnVzLXJhbmdlID0gPDAgMD47CiAJCXJhbmdlcyA9IDwweDQyMDAwMDAwIDAgMHg4MDAwMDAwMCAweDgwMDAwMDAwIDAgMHgyMDAwMDAwMAogCQkJICAweDAyMDAwMDAwIDAgMHhhMDAwMDAwMCAweGEwMDAwMDAwIDAgMHgxMDAwMDAwMAogCQkJICAweDAxMDAwMDAwIDAgMHgwMDAwMDAwMCAweGIwMDAwMDAwIDAgMHgwMTAwMDAwMD47CisJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1wYzUyMDBfcGljPjsKIAl9OwogCiAJbG9jYWxidXMgewotCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1scGIiLCJzaW1wbGUtYnVzIjsKLQkJI2FkZHJlc3MtY2VsbHMgPSA8Mj47Ci0JCSNzaXplLWNlbGxzID0gPDE+OwotCiAJCXJhbmdlcyA9IDwgMCAwIDB4ZmMwMDAwMDAgMHgwMjAwMDAwMAogCQkJICAgMSAwIDB4ZmUwMDAwMDAgMHgwMjAwMDAwMAogCQkJICAgMiAwIDB4ZjAwMTAwMDAgMHgwMDAxMDAwMAogCQkJICAgMyAwIDB4ZjAwMjAwMDAgMHgwMDAxMDAwMCA+OwotCiAJCWZsYXNoQDAsMCB7CiAJCQljb21wYXRpYmxlID0gImFtZCxhbTI5bHYyOG1sIiwgImNmaS1mbGFzaCI7Ci0JCQlyZWcgPSA8MCAweDAgMHgyMDAwMDAwPjsJCS8vIDMyIE1CCi0JCQliYW5rLXdpZHRoID0gPDQ+OwkJCS8vIFdpZHRoIGluIGJ5dGVzIG9mIHRoZSBmbGFzaCBiYW5rCi0JCQlkZXZpY2Utd2lkdGggPSA8Mj47CQkJLy8gVHdvIGRldmljZXMgb24gZWFjaCBiYW5rCisJCQlyZWcgPSA8MCAweDAgMHgyMDAwMDAwPjsgICAgICAgICAgICAgICAgLy8gMzIgTUIKKwkJCWJhbmstd2lkdGggPSA8ND47ICAgICAgICAgICAgICAgICAgICAgICAvLyBXaWR0aCBpbiBieXRlcyBvZiB0aGUgZmxhc2ggYmFuaworCQkJZGV2aWNlLXdpZHRoID0gPDI+OyAgICAgICAgICAgICAgICAgICAgIC8vIFR3byBkZXZpY2VzIG9uIGVhY2ggYmFuawogCQl9OwogCiAJCWZsYXNoQDEsMCB7CiAJCQljb21wYXRpYmxlID0gImFtZCxhbTI5bHYyOG1sIiwgImNmaS1mbGFzaCI7Ci0JCQlyZWcgPSA8MSAwIDB4MjAwMDAwMD47CQkJLy8gMzIgTUIKLQkJCWJhbmstd2lkdGggPSA8ND47CQkJLy8gV2lkdGggaW4gYnl0ZXMgb2YgdGhlIGZsYXNoIGJhbmsKLQkJCWRldmljZS13aWR0aCA9IDwyPjsJCQkvLyBUd28gZGV2aWNlcyBvbiBlYWNoIGJhbmsKKwkJCXJlZyA9IDwxIDAgMHgyMDAwMDAwPjsgICAgICAgICAgICAgICAgICAvLyAzMiBNQgorCQkJYmFuay13aWR0aCA9IDw0PjsgICAgICAgICAgICAgICAgICAgICAgIC8vIFdpZHRoIGluIGJ5dGVzIG9mIHRoZSBmbGFzaCBiYW5rCisJCQlkZXZpY2Utd2lkdGggPSA8Mj47ICAgICAgICAgICAgICAgICAgICAgLy8gVHdvIGRldmljZXMgb24gZWFjaCBiYW5rCiAJCX07CiAKIAkJbWVkaWE1MjAwX2ZwZ2E6IGZwZ2FAMiwwIHsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tb3Rpb25wcm8uZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21vdGlvbnByby5kdHMKaW5kZXggNmNhNGZjMS4uMGI3OGU4OSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21vdGlvbnByby5kdHMKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21vdGlvbnByby5kdHMKQEAgLTEwLDIxOSArMTAsNzMgQEAKICAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAgKi8KIAotL2R0cy12MS87CisvaW5jbHVkZS8gIm1wYzUyMDBiLmR0c2kiCiAKIC8gewogCW1vZGVsID0gInByb21lc3MsbW90aW9ucHJvIjsKIAljb21wYXRpYmxlID0gInByb21lc3MsbW90aW9ucHJvIjsKLQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkjc2l6ZS1jZWxscyA9IDwxPjsKLQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGM1MjAwX3BpYz47Ci0KLQljcHVzIHsKLQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCSNzaXplLWNlbGxzID0gPDA+OwotCi0JCVBvd2VyUEMsNTIwMEAwIHsKLQkJCWRldmljZV90eXBlID0gImNwdSI7Ci0JCQlyZWcgPSA8MD47Ci0JCQlkLWNhY2hlLWxpbmUtc2l6ZSA9IDwzMj47Ci0JCQlpLWNhY2hlLWxpbmUtc2l6ZSA9IDwzMj47Ci0JCQlkLWNhY2hlLXNpemUgPSA8MHg0MDAwPjsJLy8gTDEsIDE2SwotCQkJaS1jYWNoZS1zaXplID0gPDB4NDAwMD47CS8vIEwxLCAxNksKLQkJCXRpbWViYXNlLWZyZXF1ZW5jeSA9IDwwPjsJLy8gZnJvbSBib290bG9hZGVyCi0JCQlidXMtZnJlcXVlbmN5ID0gPDA+OwkJLy8gZnJvbSBib290bG9hZGVyCi0JCQljbG9jay1mcmVxdWVuY3kgPSA8MD47CQkvLyBmcm9tIGJvb3Rsb2FkZXIKLQkJfTsKLQl9OwotCi0JbWVtb3J5IHsKLQkJZGV2aWNlX3R5cGUgPSAibWVtb3J5IjsKLQkJcmVnID0gPDB4MDAwMDAwMDAgMHgwNDAwMDAwMD47CS8vIDY0TUIKLQl9OwogCiAJc29jNTIwMEBmMDAwMDAwMCB7Ci0JCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCQkjc2l6ZS1jZWxscyA9IDwxPjsKLQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItaW1tciI7Ci0JCXJhbmdlcyA9IDwwIDB4ZjAwMDAwMDAgMHgwMDAwYzAwMD47Ci0JCXJlZyA9IDwweGYwMDAwMDAwIDB4MDAwMDAxMDA+OwotCQlidXMtZnJlcXVlbmN5ID0gPDA+OwkJLy8gZnJvbSBib290bG9hZGVyCi0JCXN5c3RlbS1mcmVxdWVuY3kgPSA8MD47CQkvLyBmcm9tIGJvb3Rsb2FkZXIKLQotCQljZG1AMjAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWNkbSIsImZzbCxtcGM1MjAwLWNkbSI7Ci0JCQlyZWcgPSA8MHgyMDAgMHgzOD47Ci0JCX07Ci0KLQkJbXBjNTIwMF9waWM6IGludGVycnVwdC1jb250cm9sbGVyQDUwMCB7Ci0JCQkvLyA1MjAwIGludGVycnVwdHMgYXJlIGVuY29kZWQgaW50byB0d28gbGV2ZWxzOwotCQkJaW50ZXJydXB0LWNvbnRyb2xsZXI7Ci0JCQkjaW50ZXJydXB0LWNlbGxzID0gPDM+OwotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItcGljIiwiZnNsLG1wYzUyMDAtcGljIjsKLQkJCXJlZyA9IDwweDUwMCAweDgwPjsKLQkJfTsKLQogCQl0aW1lckA2MDAgewkvLyBHZW5lcmFsIFB1cnBvc2UgVGltZXIKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWdwdCIsImZzbCxtcGM1MjAwLWdwdCI7Ci0JCQlyZWcgPSA8MHg2MDAgMHgxMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDEgOSAwPjsKIAkJCWZzbCxoYXMtd2R0OwogCQl9OwogCi0JCXRpbWVyQDYxMCB7CS8vIEdlbmVyYWwgUHVycG9zZSBUaW1lcgotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItZ3B0IiwiZnNsLG1wYzUyMDAtZ3B0IjsKLQkJCXJlZyA9IDwweDYxMCAweDEwPjsKLQkJCWludGVycnVwdHMgPSA8MSAxMCAwPjsKLQkJfTsKLQotCQl0aW1lckA2MjAgewkvLyBHZW5lcmFsIFB1cnBvc2UgVGltZXIKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWdwdCIsImZzbCxtcGM1MjAwLWdwdCI7Ci0JCQlyZWcgPSA8MHg2MjAgMHgxMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDEgMTEgMD47Ci0JCX07Ci0KLQkJdGltZXJANjMwIHsJLy8gR2VuZXJhbCBQdXJwb3NlIFRpbWVyCi0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1ncHQiLCJmc2wsbXBjNTIwMC1ncHQiOwotCQkJcmVnID0gPDB4NjMwIDB4MTA+OwotCQkJaW50ZXJydXB0cyA9IDwxIDEyIDA+OwotCQl9OwotCi0JCXRpbWVyQDY0MCB7CS8vIEdlbmVyYWwgUHVycG9zZSBUaW1lcgotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItZ3B0IiwiZnNsLG1wYzUyMDAtZ3B0IjsKLQkJCXJlZyA9IDwweDY0MCAweDEwPjsKLQkJCWludGVycnVwdHMgPSA8MSAxMyAwPjsKLQkJfTsKLQotCQl0aW1lckA2NTAgewkvLyBHZW5lcmFsIFB1cnBvc2UgVGltZXIKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWdwdCIsImZzbCxtcGM1MjAwLWdwdCI7Ci0JCQlyZWcgPSA8MHg2NTAgMHgxMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDEgMTQgMD47Ci0JCX07Ci0KLQkJbW90aW9ucHJvLWxlZEA2NjAgewkvLyBNb3Rpb24tUFJPIHN0YXR1cyBMRUQKKwkJdGltZXJANjYwIHsJLy8gTW90aW9uLVBSTyBzdGF0dXMgTEVECiAJCQljb21wYXRpYmxlID0gInByb21lc3MsbW90aW9ucHJvLWxlZCI7CiAJCQlsYWJlbCA9ICJtb3Rpb25wcm8tc3RhdHVzbGVkIjsKLQkJCXJlZyA9IDwweDY2MCAweDEwPjsKLQkJCWludGVycnVwdHMgPSA8MSAxNSAwPjsKIAkJCWJsaW5rLWRlbGF5ID0gPDEwMD47IC8vIDEwMCBtc2VjCiAJCX07CiAKLQkJbW90aW9ucHJvLWxlZEA2NzAgewkvLyBNb3Rpb24tUFJPIHJlYWR5IExFRAorCQl0aW1lckA2NzAgewkvLyBNb3Rpb24tUFJPIHJlYWR5IExFRAogCQkJY29tcGF0aWJsZSA9ICJwcm9tZXNzLG1vdGlvbnByby1sZWQiOwogCQkJbGFiZWwgPSAibW90aW9ucHJvLXJlYWR5bGVkIjsKLQkJCXJlZyA9IDwweDY3MCAweDEwPjsKLQkJCWludGVycnVwdHMgPSA8MSAxNiAwPjsKIAkJfTsKIAotCQlydGNAODAwIHsJLy8gUmVhbCB0aW1lIGNsb2NrCi0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1ydGMiLCJmc2wsbXBjNTIwMC1ydGMiOwotCQkJcmVnID0gPDB4ODAwIDB4MTAwPjsKLQkJCWludGVycnVwdHMgPSA8MSA1IDAgMSA2IDA+OworCQljYW5AOTAwIHsKKwkJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CiAJCX07CiAKLQkJY2FuQDk4MCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1tc2NhbiIsImZzbCxtcGM1MjAwLW1zY2FuIjsKLQkJCWludGVycnVwdHMgPSA8MiAxOCAwPjsKLQkJCXJlZyA9IDwweDk4MCAweDgwPjsKLQkJfTsKLQotCQlncGlvX3NpbXBsZTogZ3Bpb0BiMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItZ3BpbyIsImZzbCxtcGM1MjAwLWdwaW8iOwotCQkJcmVnID0gPDB4YjAwIDB4NDA+OwotCQkJaW50ZXJydXB0cyA9IDwxIDcgMD47Ci0JCQlncGlvLWNvbnRyb2xsZXI7Ci0JCQkjZ3Bpby1jZWxscyA9IDwyPjsKLQkJfTsKLQotCQlncGlvX3drdXA6IGdwaW9AYzAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWdwaW8td2t1cCIsImZzbCxtcGM1MjAwLWdwaW8td2t1cCI7Ci0JCQlyZWcgPSA8MHhjMDAgMHg0MD47Ci0JCQlpbnRlcnJ1cHRzID0gPDEgOCAwIDAgMyAwPjsKLQkJCWdwaW8tY29udHJvbGxlcjsKLQkJCSNncGlvLWNlbGxzID0gPDI+OwotCQl9OwotCi0JCXNwaUBmMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItc3BpIiwiZnNsLG1wYzUyMDAtc3BpIjsKLQkJCXJlZyA9IDwweGYwMCAweDIwPjsKLQkJCWludGVycnVwdHMgPSA8MiAxMyAwIDIgMTQgMD47Ci0JCX07Ci0KLQkJdXNiQDEwMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItb2hjaSIsImZzbCxtcGM1MjAwLW9oY2kiLCJvaGNpLWJlIjsKLQkJCXJlZyA9IDwweDEwMDAgMHhmZj47Ci0JCQlpbnRlcnJ1cHRzID0gPDIgNiAwPjsKLQkJfTsKLQotCQlkbWEtY29udHJvbGxlckAxMjAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWJlc3Rjb21tIiwiZnNsLG1wYzUyMDAtYmVzdGNvbW0iOwotCQkJcmVnID0gPDB4MTIwMCAweDgwPjsKLQkJCWludGVycnVwdHMgPSA8MyAwIDAgIDMgMSAwICAzIDIgMCAgMyAzIDAKLQkJCSAgICAgICAgICAgICAgMyA0IDAgIDMgNSAwICAzIDYgMCAgMyA3IDAKLQkJCSAgICAgICAgICAgICAgMyA4IDAgIDMgOSAwICAzIDEwIDAgIDMgMTEgMAotCQkJICAgICAgICAgICAgICAzIDEyIDAgIDMgMTMgMCAgMyAxNCAwICAzIDE1IDA+OwotCQl9OwotCi0JCXhsYkAxZjAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLXhsYiIsImZzbCxtcGM1MjAwLXhsYiI7Ci0JCQlyZWcgPSA8MHgxZjAwIDB4MTAwPjsKLQkJfTsKLQotCQlzZXJpYWxAMjAwMCB7CQkvLyBQU0MxCisJCXBzY0AyMDAwIHsJCS8vIFBTQzEKIAkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLXBzYy11YXJ0IiwiZnNsLG1wYzUyMDAtcHNjLXVhcnQiOwotCQkJcmVnID0gPDB4MjAwMCAweDEwMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDIgMSAwPjsKIAkJfTsKIAogCQkvLyBQU0MyIGluIHNwaSBtYXN0ZXIgbW9kZSAKLQkJc3BpQDIyMDAgewkJLy8gUFNDMgorCQlwc2NAMjIwMCB7CQkvLyBQU0MyCiAJCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1wc2Mtc3BpIiwiZnNsLG1wYzUyMDAtcHNjLXNwaSI7CiAJCQljZWxsLWluZGV4ID0gPDE+OwotCQkJcmVnID0gPDB4MjIwMCAweDEwMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDIgMiAwPjsKIAkJfTsKIAotCQkvLyBQU0M1IGluIHVhcnQgbW9kZQotCQlzZXJpYWxAMjgwMCB7CQkvLyBQU0M1CisJCXBzY0AyNDAwIHsJCS8vIFBTQzMKKwkJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CisJCX07CisKKwkJcHNjQDI2MDAgewkJLy8gUFNDNAorCQkJc3RhdHVzID0gImRpc2FibGVkIjsKKwkJfTsKKworCQlwc2NAMjgwMCB7CQkvLyBQU0M1CiAJCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1wc2MtdWFydCIsImZzbCxtcGM1MjAwLXBzYy11YXJ0IjsKLQkJCXJlZyA9IDwweDI4MDAgMHgxMDA+OwotCQkJaW50ZXJydXB0cyA9IDwyIDEyIDA+OworCQl9OworCisJCXBzY0AyYzAwIHsJCS8vIFBTQzYKKwkJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CiAJCX07CiAKIAkJZXRoZXJuZXRAMzAwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1mZWMiLCJmc2wsbXBjNTIwMC1mZWMiOwotCQkJcmVnID0gPDB4MzAwMCAweDQwMD47Ci0JCQlsb2NhbC1tYWMtYWRkcmVzcyA9IFsgMDAgMDAgMDAgMDAgMDAgMDAgXTsKLQkJCWludGVycnVwdHMgPSA8MiA1IDA+OwogCQkJcGh5LWhhbmRsZSA9IDwmcGh5MD47CiAJCX07CiAKIAkJbWRpb0AzMDAwIHsKLQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCQkJI3NpemUtY2VsbHMgPSA8MD47Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1tZGlvIiwiZnNsLG1wYzUyMDAtbWRpbyI7Ci0JCQlyZWcgPSA8MHgzMDAwIDB4NDAwPjsgICAgICAgLy8gZmVjIHJhbmdlLCBzaW5jZSB3ZSBuZWVkIHRvIHNldHVwIGZlYyBpbnRlcnJ1cHRzCi0JCQlpbnRlcnJ1cHRzID0gPDIgNSAwPjsgICAvLyB0aGVzZSBhcmUgZm9yICJtaWkgY29tbWFuZCBmaW5pc2hlZCIsIG5vdCBsaW5rIGNoYW5nZXMgJiBjby4KLQogCQkJcGh5MDogZXRoZXJuZXQtcGh5QDIgewogCQkJCXJlZyA9IDwyPjsKIAkJCX07CiAJCX07CiAKLQkJYXRhQDNhMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItYXRhIiwiZnNsLG1wYzUyMDAtYXRhIjsKLQkJCXJlZyA9IDwweDNhMDAgMHgxMDA+OwotCQkJaW50ZXJydXB0cyA9IDwyIDcgMD47CisJCWkyY0AzZDAwIHsKKwkJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CiAJCX07CiAKIAkJaTJjQDNkNDAgewotCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCQkjc2l6ZS1jZWxscyA9IDwwPjsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWkyYyIsImZzbCxtcGM1MjAwLWkyYyIsImZzbC1pMmMiOwotCQkJcmVnID0gPDB4M2Q0MCAweDQwPjsKLQkJCWludGVycnVwdHMgPSA8MiAxNiAwPjsKLQogCQkJcnRjQDY4IHsKIAkJCQljb21wYXRpYmxlID0gImRhbGxhcyxkczEzMzkiOwogCQkJCXJlZyA9IDwweDY4PjsKQEAgLTIzNSwxMCArODksMTEgQEAKIAkJfTsKIAl9OwogCisJcGNpQGYwMDAwZDAwIHsKKwkJc3RhdHVzID0gImRpc2FibGVkIjsKKwl9OworCiAJbG9jYWxidXMgewotCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1scGIiLCJzaW1wbGUtYnVzIjsKLQkJI2FkZHJlc3MtY2VsbHMgPSA8Mj47Ci0JCSNzaXplLWNlbGxzID0gPDE+OwogCQlyYW5nZXMgPSA8MCAwIDB4ZmYwMDAwMDAgMHgwMTAwMDAwMAogCQkJICAxIDAgMHg1MDAwMDAwMCAweDAwMDEwMDAwCiAJCQkgIDIgMCAweDUwMDEwMDAwIDB4MDAwMTAwMDAKQEAgLTI4MCw1ICsxMzUsNiBAQAogCQkJI3NpemUtY2VsbHMgPSA8MT47CiAJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKIAkJfTsKKwogCX07CiB9OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzUyMDBiLmR0c2kgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjNTIwMGIuZHRzaQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzI3NTQ4Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzUyMDBiLmR0c2kKQEAgLTAsMCArMSwyNzUgQEAKKy8qCisgKiBiYXNlIE1QQzUyMDBiIERldmljZSBUcmVlIFNvdXJjZQorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBTZWNyZXRMYWIKKyAqIEdyYW50IExpa2VseSA8Z3JhbnRAc2VjcmV0bGFiLmNhPgorICogSm9obiBCb25lc2lvIDxib25lc0BzZWNyZXRsYWIuY2E+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisvZHRzLXYxLzsKKworLyB7CisJbW9kZWwgPSAiZnNsLG1wYzUyMDBiIjsKKwljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYiI7CisJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJI3NpemUtY2VsbHMgPSA8MT47CisJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBjNTIwMF9waWM+OworCisJY3B1cyB7CisJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkjc2l6ZS1jZWxscyA9IDwwPjsKKworCQlwb3dlcnBjOiBQb3dlclBDLDUyMDBAMCB7CisJCQlkZXZpY2VfdHlwZSA9ICJjcHUiOworCQkJcmVnID0gPDA+OworCQkJZC1jYWNoZS1saW5lLXNpemUgPSA8MzI+OworCQkJaS1jYWNoZS1saW5lLXNpemUgPSA8MzI+OworCQkJZC1jYWNoZS1zaXplID0gPDB4NDAwMD47CS8vIEwxLCAxNksKKwkJCWktY2FjaGUtc2l6ZSA9IDwweDQwMDA+OwkvLyBMMSwgMTZLCisJCQl0aW1lYmFzZS1mcmVxdWVuY3kgPSA8MD47CS8vIGZyb20gYm9vdGxvYWRlcgorCQkJYnVzLWZyZXF1ZW5jeSA9IDwwPjsJCS8vIGZyb20gYm9vdGxvYWRlcgorCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OwkJLy8gZnJvbSBib290bG9hZGVyCisJCX07CisJfTsKKworCW1lbW9yeTogbWVtb3J5IHsKKwkJZGV2aWNlX3R5cGUgPSAibWVtb3J5IjsKKwkJcmVnID0gPDB4MDAwMDAwMDAgMHgwNDAwMDAwMD47CS8vIDY0TUIKKwl9OworCisJc29jOiBzb2M1MjAwQGYwMDAwMDAwIHsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCSNzaXplLWNlbGxzID0gPDE+OworCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1pbW1yIjsKKwkJcmFuZ2VzID0gPDAgMHhmMDAwMDAwMCAweDAwMDBjMDAwPjsKKwkJcmVnID0gPDB4ZjAwMDAwMDAgMHgwMDAwMDEwMD47CisJCWJ1cy1mcmVxdWVuY3kgPSA8MD47CQkvLyBmcm9tIGJvb3Rsb2FkZXIKKwkJc3lzdGVtLWZyZXF1ZW5jeSA9IDwwPjsJCS8vIGZyb20gYm9vdGxvYWRlcgorCisJCWNkbUAyMDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItY2RtIiwiZnNsLG1wYzUyMDAtY2RtIjsKKwkJCXJlZyA9IDwweDIwMCAweDM4PjsKKwkJfTsKKworCQltcGM1MjAwX3BpYzogaW50ZXJydXB0LWNvbnRyb2xsZXJANTAwIHsKKwkJCS8vIDUyMDAgaW50ZXJydXB0cyBhcmUgZW5jb2RlZCBpbnRvIHR3byBsZXZlbHM7CisJCQlpbnRlcnJ1cHQtY29udHJvbGxlcjsKKwkJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8Mz47CisJCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1waWMiLCJmc2wsbXBjNTIwMC1waWMiOworCQkJcmVnID0gPDB4NTAwIDB4ODA+OworCQl9OworCisJCXRpbWVyQDYwMCB7CS8vIEdlbmVyYWwgUHVycG9zZSBUaW1lcgorCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItZ3B0IiwiZnNsLG1wYzUyMDAtZ3B0IjsKKwkJCXJlZyA9IDwweDYwMCAweDEwPjsKKwkJCWludGVycnVwdHMgPSA8MSA5IDA+OworCQl9OworCisJCXRpbWVyQDYxMCB7CS8vIEdlbmVyYWwgUHVycG9zZSBUaW1lcgorCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItZ3B0IiwiZnNsLG1wYzUyMDAtZ3B0IjsKKwkJCXJlZyA9IDwweDYxMCAweDEwPjsKKwkJCWludGVycnVwdHMgPSA8MSAxMCAwPjsKKwkJfTsKKworCQl0aW1lckA2MjAgewkvLyBHZW5lcmFsIFB1cnBvc2UgVGltZXIKKwkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWdwdCIsImZzbCxtcGM1MjAwLWdwdCI7CisJCQlyZWcgPSA8MHg2MjAgMHgxMD47CisJCQlpbnRlcnJ1cHRzID0gPDEgMTEgMD47CisJCX07CisKKwkJdGltZXJANjMwIHsJLy8gR2VuZXJhbCBQdXJwb3NlIFRpbWVyCisJCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1ncHQiLCJmc2wsbXBjNTIwMC1ncHQiOworCQkJcmVnID0gPDB4NjMwIDB4MTA+OworCQkJaW50ZXJydXB0cyA9IDwxIDEyIDA+OworCQl9OworCisJCXRpbWVyQDY0MCB7CS8vIEdlbmVyYWwgUHVycG9zZSBUaW1lcgorCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItZ3B0IiwiZnNsLG1wYzUyMDAtZ3B0IjsKKwkJCXJlZyA9IDwweDY0MCAweDEwPjsKKwkJCWludGVycnVwdHMgPSA8MSAxMyAwPjsKKwkJfTsKKworCQl0aW1lckA2NTAgewkvLyBHZW5lcmFsIFB1cnBvc2UgVGltZXIKKwkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWdwdCIsImZzbCxtcGM1MjAwLWdwdCI7CisJCQlyZWcgPSA8MHg2NTAgMHgxMD47CisJCQlpbnRlcnJ1cHRzID0gPDEgMTQgMD47CisJCX07CisKKwkJdGltZXJANjYwIHsJLy8gR2VuZXJhbCBQdXJwb3NlIFRpbWVyCisJCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1ncHQiLCJmc2wsbXBjNTIwMC1ncHQiOworCQkJcmVnID0gPDB4NjYwIDB4MTA+OworCQkJaW50ZXJydXB0cyA9IDwxIDE1IDA+OworCQl9OworCisJCXRpbWVyQDY3MCB7CS8vIEdlbmVyYWwgUHVycG9zZSBUaW1lcgorCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItZ3B0IiwiZnNsLG1wYzUyMDAtZ3B0IjsKKwkJCXJlZyA9IDwweDY3MCAweDEwPjsKKwkJCWludGVycnVwdHMgPSA8MSAxNiAwPjsKKwkJfTsKKworCQlydGNAODAwIHsJLy8gUmVhbCB0aW1lIGNsb2NrCisJCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1ydGMiLCJmc2wsbXBjNTIwMC1ydGMiOworCQkJcmVnID0gPDB4ODAwIDB4MTAwPjsKKwkJCWludGVycnVwdHMgPSA8MSA1IDAgMSA2IDA+OworCQl9OworCisJCWNhbkA5MDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItbXNjYW4iLCJmc2wsbXBjNTIwMC1tc2NhbiI7CisJCQlpbnRlcnJ1cHRzID0gPDIgMTcgMD47CisJCQlyZWcgPSA8MHg5MDAgMHg4MD47CisJCX07CisKKwkJY2FuQDk4MCB7CisJCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1tc2NhbiIsImZzbCxtcGM1MjAwLW1zY2FuIjsKKwkJCWludGVycnVwdHMgPSA8MiAxOCAwPjsKKwkJCXJlZyA9IDwweDk4MCAweDgwPjsKKwkJfTsKKworCQlncGlvX3NpbXBsZTogZ3Bpb0BiMDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItZ3BpbyIsImZzbCxtcGM1MjAwLWdwaW8iOworCQkJcmVnID0gPDB4YjAwIDB4NDA+OworCQkJaW50ZXJydXB0cyA9IDwxIDcgMD47CisJCQlncGlvLWNvbnRyb2xsZXI7CisJCQkjZ3Bpby1jZWxscyA9IDwyPjsKKwkJfTsKKworCQlncGlvX3drdXA6IGdwaW9AYzAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWdwaW8td2t1cCIsImZzbCxtcGM1MjAwLWdwaW8td2t1cCI7CisJCQlyZWcgPSA8MHhjMDAgMHg0MD47CisJCQlpbnRlcnJ1cHRzID0gPDEgOCAwIDAgMyAwPjsKKwkJCWdwaW8tY29udHJvbGxlcjsKKwkJCSNncGlvLWNlbGxzID0gPDI+OworCQl9OworCisJCXNwaUBmMDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItc3BpIiwiZnNsLG1wYzUyMDAtc3BpIjsKKwkJCXJlZyA9IDwweGYwMCAweDIwPjsKKwkJCWludGVycnVwdHMgPSA8MiAxMyAwIDIgMTQgMD47CisJCX07CisKKwkJdXNiOiB1c2JAMTAwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1vaGNpIiwiZnNsLG1wYzUyMDAtb2hjaSIsIm9oY2ktYmUiOworCQkJcmVnID0gPDB4MTAwMCAweGZmPjsKKwkJCWludGVycnVwdHMgPSA8MiA2IDA+OworCQl9OworCisJCWRtYS1jb250cm9sbGVyQDEyMDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItYmVzdGNvbW0iLCJmc2wsbXBjNTIwMC1iZXN0Y29tbSI7CisJCQlyZWcgPSA8MHgxMjAwIDB4ODA+OworCQkJaW50ZXJydXB0cyA9IDwzIDAgMCAgMyAxIDAgIDMgMiAwICAzIDMgMAorCQkJICAgICAgICAgICAgICAzIDQgMCAgMyA1IDAgIDMgNiAwICAzIDcgMAorCQkJICAgICAgICAgICAgICAzIDggMCAgMyA5IDAgIDMgMTAgMCAgMyAxMSAwCisJCQkgICAgICAgICAgICAgIDMgMTIgMCAgMyAxMyAwICAzIDE0IDAgIDMgMTUgMD47CisJCX07CisKKwkJeGxiQDFmMDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGIteGxiIiwiZnNsLG1wYzUyMDAteGxiIjsKKwkJCXJlZyA9IDwweDFmMDAgMHgxMDA+OworCQl9OworCisJCXBzYzE6IHBzY0AyMDAwIHsJCS8vIFBTQzEKKwkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLXBzYyIsImZzbCxtcGM1MjAwLXBzYyI7CisJCQlyZWcgPSA8MHgyMDAwIDB4MTAwPjsKKwkJCWludGVycnVwdHMgPSA8MiAxIDA+OworCQl9OworCisJCXBzYzI6IHBzY0AyMjAwIHsJCS8vIFBTQzIKKwkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLXBzYyIsImZzbCxtcGM1MjAwLXBzYyI7CisJCQlyZWcgPSA8MHgyMjAwIDB4MTAwPjsKKwkJCWludGVycnVwdHMgPSA8MiAyIDA+OworCQl9OworCisJCXBzYzM6IHBzY0AyNDAwIHsJCS8vIFBTQzMKKwkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLXBzYyIsImZzbCxtcGM1MjAwLXBzYyI7CisJCQlyZWcgPSA8MHgyNDAwIDB4MTAwPjsKKwkJCWludGVycnVwdHMgPSA8MiAzIDA+OworCQl9OworCisJCXBzYzQ6IHBzY0AyNjAwIHsJCS8vIFBTQzQKKwkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLXBzYyIsImZzbCxtcGM1MjAwLXBzYyI7CisJCQlyZWcgPSA8MHgyNjAwIDB4MTAwPjsKKwkJCWludGVycnVwdHMgPSA8MiAxMSAwPjsKKwkJfTsKKworCQlwc2M1OiBwc2NAMjgwMCB7CQkvLyBQU0M1CisJCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1wc2MiLCJmc2wsbXBjNTIwMC1wc2MiOworCQkJcmVnID0gPDB4MjgwMCAweDEwMD47CisJCQlpbnRlcnJ1cHRzID0gPDIgMTIgMD47CisJCX07CisKKwkJcHNjNjogcHNjQDJjMDAgewkJLy8gUFNDNgorCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItcHNjIiwiZnNsLG1wYzUyMDAtcHNjIjsKKwkJCXJlZyA9IDwweDJjMDAgMHgxMDA+OworCQkJaW50ZXJydXB0cyA9IDwyIDQgMD47CisJCX07CisKKwkJZXRoMDogZXRoZXJuZXRAMzAwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1mZWMiLCJmc2wsbXBjNTIwMC1mZWMiOworCQkJcmVnID0gPDB4MzAwMCAweDQwMD47CisJCQlsb2NhbC1tYWMtYWRkcmVzcyA9IFsgMDAgMDAgMDAgMDAgMDAgMDAgXTsKKwkJCWludGVycnVwdHMgPSA8MiA1IDA+OworCQl9OworCisJCW1kaW9AMzAwMCB7CisJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCSNzaXplLWNlbGxzID0gPDA+OworCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItbWRpbyIsImZzbCxtcGM1MjAwLW1kaW8iOworCQkJcmVnID0gPDB4MzAwMCAweDQwMD47CS8vIGZlYyByYW5nZSwgc2luY2Ugd2UgbmVlZCB0byBzZXR1cCBmZWMgaW50ZXJydXB0cworCQkJaW50ZXJydXB0cyA9IDwyIDUgMD47CS8vIHRoZXNlIGFyZSBmb3IgIm1paSBjb21tYW5kIGZpbmlzaGVkIiwgbm90IGxpbmsgY2hhbmdlcyAmIGNvLgorCQl9OworCisJCWF0YUAzYTAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWF0YSIsImZzbCxtcGM1MjAwLWF0YSI7CisJCQlyZWcgPSA8MHgzYTAwIDB4MTAwPjsKKwkJCWludGVycnVwdHMgPSA8MiA3IDA+OworCQl9OworCisJCWkyY0AzZDAwIHsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJI3NpemUtY2VsbHMgPSA8MD47CisJCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1pMmMiLCJmc2wsbXBjNTIwMC1pMmMiLCJmc2wtaTJjIjsKKwkJCXJlZyA9IDwweDNkMDAgMHg0MD47CisJCQlpbnRlcnJ1cHRzID0gPDIgMTUgMD47CisJCX07CisKKwkJaTJjQDNkNDAgeworCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkjc2l6ZS1jZWxscyA9IDwwPjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWkyYyIsImZzbCxtcGM1MjAwLWkyYyIsImZzbC1pMmMiOworCQkJcmVnID0gPDB4M2Q0MCAweDQwPjsKKwkJCWludGVycnVwdHMgPSA8MiAxNiAwPjsKKwkJfTsKKworCQlzcmFtQDgwMDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItc3JhbSIsImZzbCxtcGM1MjAwLXNyYW0iOworCQkJcmVnID0gPDB4ODAwMCAweDQwMDA+OworCQl9OworCX07CisKKwlwY2k6IHBjaUBmMDAwMGQwMCB7CisJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8MT47CisJCSNzaXplLWNlbGxzID0gPDI+OworCQkjYWRkcmVzcy1jZWxscyA9IDwzPjsKKwkJZGV2aWNlX3R5cGUgPSAicGNpIjsKKwkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItcGNpIiwiZnNsLG1wYzUyMDAtcGNpIjsKKwkJcmVnID0gPDB4ZjAwMDBkMDAgMHgxMDA+OworCQkvLyBpbnRlcnJ1cHQtbWFwLW1hc2sgPSBuZWVkIHRvIGFkZAorCQkvLyBpbnRlcnJ1cHQtbWFwID0gbmVlZCB0byBhZGQKKwkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OyAvLyBGcm9tIGJvb3QgbG9hZGVyCisJCWludGVycnVwdHMgPSA8MiA4IDAgMiA5IDAgMiAxMCAwPjsKKwkJYnVzLXJhbmdlID0gPDAgMD47CisJCS8vIHJhbmdlcyA9IG5lZWQgdG8gYWRkCisJfTsKKworCWxvY2FsYnVzOiBsb2NhbGJ1cyB7CisJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWxwYiIsImZzbCxtcGM1MjAwLWxwYiIsInNpbXBsZS1idXMiOworCQkjYWRkcmVzcy1jZWxscyA9IDwyPjsKKwkJI3NpemUtY2VsbHMgPSA8MT47CisJCXJhbmdlcyA9IDwwIDAgMHhmYzAwMDAwMCAweDIwMDAwMDA+OworCX07Cit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzgzMDhfcDFtLmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4MzA4X3AxbS5kdHMKaW5kZXggMDVhNzZjYy4uNjk3YjNmNiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzgzMDhfcDFtLmR0cworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODMwOF9wMW0uZHRzCkBAIC0yOTcsNiArMjk3LDE0IEBACiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCAmaXBpYyA+OwogCQl9OwogCisJCWRtYUAyYzAwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxtcGM4MzA4LWRtYSIsICJmc2wsbXBjNTEyMS1kbWEiOworCQkJcmVnID0gPDB4MmMwMDAgMHgxODAwPjsKKwkJCWludGVycnVwdHMgPSA8MyAweDgKKwkJCQkJOTQgMHg4PjsKKwkJCWludGVycnVwdC1wYXJlbnQgPSA8ICZpcGljID47CisJCX07CisKIAl9OwogCiAJcGNpMDogcGNpZUBlMDAwOTAwMCB7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODMwOHJkYi5kdHMgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODMwOHJkYi5kdHMKaW5kZXggYTk3ZWIyZC4uZDNkYjAyZiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzgzMDhyZGIuZHRzCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4MzA4cmRiLmR0cwpAQCAtMjY1LDYgKzI2NSwxNCBAQAogCQkJaW50ZXJydXB0LXBhcmVudCA9IDwgJmlwaWMgPjsKIAkJfTsKIAorCQlkbWFAMmMwMDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODMwOC1kbWEiLCAiZnNsLG1wYzUxMjEtZG1hIjsKKwkJCXJlZyA9IDwweDJjMDAwIDB4MTgwMD47CisJCQlpbnRlcnJ1cHRzID0gPDMgMHg4CisJCQkJCTk0IDB4OD47CisJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCAmaXBpYyA+OworCQl9OworCiAJfTsKIAogCXBjaTA6IHBjaWVAZTAwMDkwMDAgewpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL211Y21jNTIuZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL211Y21jNTIuZHRzCmluZGV4IGI3MmE3NTguLjIxZDM0NzIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tdWNtYzUyLmR0cworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXVjbWM1Mi5kdHMKQEAgLTExLDE3MiArMTEsMTA5IEBACiAgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogICovCiAKLS9kdHMtdjEvOworL2luY2x1ZGUvICJtcGM1MjAwYi5kdHNpIgogCiAvIHsKIAltb2RlbCA9ICJtYW5yb2xhbmQsbXVjbWM1MiI7CiAJY29tcGF0aWJsZSA9ICJtYW5yb2xhbmQsbXVjbWM1MiI7Ci0JI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JI3NpemUtY2VsbHMgPSA8MT47Ci0JaW50ZXJydXB0LXBhcmVudCA9IDwmbXBjNTIwMF9waWM+OwotCi0JY3B1cyB7Ci0JCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCQkjc2l6ZS1jZWxscyA9IDwwPjsKLQotCQlQb3dlclBDLDUyMDBAMCB7Ci0JCQlkZXZpY2VfdHlwZSA9ICJjcHUiOwotCQkJcmVnID0gPDA+OwotCQkJZC1jYWNoZS1saW5lLXNpemUgPSA8MzI+OwotCQkJaS1jYWNoZS1saW5lLXNpemUgPSA8MzI+OwotCQkJZC1jYWNoZS1zaXplID0gPDB4NDAwMD47CS8vIEwxLCAxNksKLQkJCWktY2FjaGUtc2l6ZSA9IDwweDQwMDA+OwkvLyBMMSwgMTZLCi0JCQl0aW1lYmFzZS1mcmVxdWVuY3kgPSA8MD47CS8vIGZyb20gYm9vdGxvYWRlcgotCQkJYnVzLWZyZXF1ZW5jeSA9IDwwPjsJCS8vIGZyb20gYm9vdGxvYWRlcgotCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OwkJLy8gZnJvbSBib290bG9hZGVyCi0JCX07Ci0JfTsKLQotCW1lbW9yeSB7Ci0JCWRldmljZV90eXBlID0gIm1lbW9yeSI7Ci0JCXJlZyA9IDwweDAwMDAwMDAwIDB4MDQwMDAwMDA+OwkvLyA2NE1CCi0JfTsKIAogCXNvYzUyMDBAZjAwMDAwMDAgewotCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJI3NpemUtY2VsbHMgPSA8MT47Ci0JCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWltbXIiOwotCQlyYW5nZXMgPSA8MCAweGYwMDAwMDAwIDB4MDAwMGMwMDA+OwotCQlyZWcgPSA8MHhmMDAwMDAwMCAweDAwMDAwMTAwPjsKLQkJYnVzLWZyZXF1ZW5jeSA9IDwwPjsJCS8vIGZyb20gYm9vdGxvYWRlcgotCQlzeXN0ZW0tZnJlcXVlbmN5ID0gPDA+OwkJLy8gZnJvbSBib290bG9hZGVyCi0KLQkJY2RtQDIwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1jZG0iLCJmc2wsbXBjNTIwMC1jZG0iOwotCQkJcmVnID0gPDB4MjAwIDB4Mzg+OwotCQl9OwotCi0JCW1wYzUyMDBfcGljOiBpbnRlcnJ1cHQtY29udHJvbGxlckA1MDAgewotCQkJLy8gNTIwMCBpbnRlcnJ1cHRzIGFyZSBlbmNvZGVkIGludG8gdHdvIGxldmVsczsKLQkJCWludGVycnVwdC1jb250cm9sbGVyOwotCQkJI2ludGVycnVwdC1jZWxscyA9IDwzPjsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLXBpYyIsImZzbCxtcGM1MjAwLXBpYyI7Ci0JCQlyZWcgPSA8MHg1MDAgMHg4MD47Ci0JCX07Ci0KIAkJZ3B0MDogdGltZXJANjAwIHsJLy8gR1BUIDAgaW4gR1BJTyBtb2RlCi0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1ncHQiLCJmc2wsbXBjNTIwMC1ncHQiOwotCQkJcmVnID0gPDB4NjAwIDB4MTA+OwotCQkJaW50ZXJydXB0cyA9IDwxIDkgMD47CiAJCQlncGlvLWNvbnRyb2xsZXI7CiAJCQkjZ3Bpby1jZWxscyA9IDwyPjsKIAkJfTsKIAogCQlncHQxOiB0aW1lckA2MTAgewkvLyBHZW5lcmFsIFB1cnBvc2UgVGltZXIgaW4gR1BJTyBtb2RlCi0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1ncHQiLCJmc2wsbXBjNTIwMC1ncHQiOwotCQkJcmVnID0gPDB4NjEwIDB4MTA+OwotCQkJaW50ZXJydXB0cyA9IDwxIDEwIDA+OwogCQkJZ3Bpby1jb250cm9sbGVyOwogCQkJI2dwaW8tY2VsbHMgPSA8Mj47CiAJCX07CiAKIAkJZ3B0MjogdGltZXJANjIwIHsJLy8gR2VuZXJhbCBQdXJwb3NlIFRpbWVyIGluIEdQSU8gbW9kZQotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItZ3B0IiwiZnNsLG1wYzUyMDAtZ3B0IjsKLQkJCXJlZyA9IDwweDYyMCAweDEwPjsKLQkJCWludGVycnVwdHMgPSA8MSAxMSAwPjsKIAkJCWdwaW8tY29udHJvbGxlcjsKIAkJCSNncGlvLWNlbGxzID0gPDI+OwogCQl9OwogCiAJCWdwdDM6IHRpbWVyQDYzMCB7CS8vIEdlbmVyYWwgUHVycG9zZSBUaW1lciBpbiBHUElPIG1vZGUKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWdwdCIsImZzbCxtcGM1MjAwLWdwdCI7Ci0JCQlyZWcgPSA8MHg2MzAgMHgxMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDEgMTIgMD47CiAJCQlncGlvLWNvbnRyb2xsZXI7CiAJCQkjZ3Bpby1jZWxscyA9IDwyPjsKIAkJfTsKIAotCQlncGlvX3NpbXBsZTogZ3Bpb0BiMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItZ3BpbyIsImZzbCxtcGM1MjAwLWdwaW8iOwotCQkJcmVnID0gPDB4YjAwIDB4NDA+OwotCQkJaW50ZXJydXB0cyA9IDwxIDcgMD47Ci0JCQlncGlvLWNvbnRyb2xsZXI7Ci0JCQkjZ3Bpby1jZWxscyA9IDwyPjsKKwkJdGltZXJANjQwIHsKKwkJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CiAJCX07CiAKLQkJZ3Bpb193a3VwOiBncGlvQGMwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1ncGlvLXdrdXAiLCJmc2wsbXBjNTIwMC1ncGlvLXdrdXAiOwotCQkJcmVnID0gPDB4YzAwIDB4NDA+OwotCQkJaW50ZXJydXB0cyA9IDwxIDggMCAwIDMgMD47Ci0JCQlncGlvLWNvbnRyb2xsZXI7Ci0JCQkjZ3Bpby1jZWxscyA9IDwyPjsKKwkJdGltZXJANjUwIHsKKwkJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CiAJCX07CiAKLQkJZG1hLWNvbnRyb2xsZXJAMTIwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1iZXN0Y29tbSIsImZzbCxtcGM1MjAwLWJlc3Rjb21tIjsKLQkJCXJlZyA9IDwweDEyMDAgMHg4MD47Ci0JCQlpbnRlcnJ1cHRzID0gPDMgMCAwICAzIDEgMCAgMyAyIDAgIDMgMyAwCi0JCQkgICAgICAgICAgICAgIDMgNCAwICAzIDUgMCAgMyA2IDAgIDMgNyAwCi0JCQkgICAgICAgICAgICAgIDMgOCAwICAzIDkgMCAgMyAxMCAwICAzIDExIDAKLQkJCSAgICAgICAgICAgICAgMyAxMiAwICAzIDEzIDAgIDMgMTQgMCAgMyAxNSAwPjsKKwkJdGltZXJANjYwIHsKKwkJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CiAJCX07CiAKLQkJeGxiQDFmMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGIteGxiIiwiZnNsLG1wYzUyMDAteGxiIjsKLQkJCXJlZyA9IDwweDFmMDAgMHgxMDA+OworCQl0aW1lckA2NzAgeworCQkJc3RhdHVzID0gImRpc2FibGVkIjsKIAkJfTsKIAotCQlzZXJpYWxAMjAwMCB7IC8qIFBTQzEgaW4gVUFSVCBtb2RlICovCisJCXJ0Y0A4MDAgeworCQkJc3RhdHVzID0gImRpc2FibGVkIjsKKwkJfTsKKworCQljYW5AOTAwIHsKKwkJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CisJCX07CisKKwkJY2FuQDk4MCB7CisJCQlzdGF0dXMgPSAiZGlzYWJsZWQiOworCQl9OworCisJCXNwaUBmMDAgeworCQkJc3RhdHVzID0gImRpc2FibGVkIjsKKwkJfTsKKworCQl1c2JAMTAwMCB7CisJCQlzdGF0dXMgPSAiZGlzYWJsZWQiOworCQl9OworCisJCXBzY0AyMDAwIHsJCS8vIFBTQzEKIAkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLXBzYy11YXJ0IiwiZnNsLG1wYzUyMDAtcHNjLXVhcnQiOwotCQkJcmVnID0gPDB4MjAwMCAweDEwMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDIgMSAwPjsKIAkJfTsKIAotCQlzZXJpYWxAMjIwMCB7IC8qIFBTQzIgaW4gVUFSVCBtb2RlICovCisJCXBzY0AyMjAwIHsJCS8vIFBTQzIKIAkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLXBzYy11YXJ0IiwiZnNsLG1wYzUyMDAtcHNjLXVhcnQiOwotCQkJcmVnID0gPDB4MjIwMCAweDEwMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDIgMiAwPjsKIAkJfTsKIAotCQlzZXJpYWxAMmMwMCB7IC8qIFBTQzYgaW4gVUFSVCBtb2RlICovCisJCXBzY0AyNDAwIHsJCS8vIFBTQzMKKwkJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CisJCX07CisKKwkJcHNjQDI2MDAgewkJLy8gUFNDNAorCQkJc3RhdHVzID0gImRpc2FibGVkIjsKKwkJfTsKKworCQlwc2NAMjgwMCB7CQkvLyBQU0M1CisJCQlzdGF0dXMgPSAiZGlzYWJsZWQiOworCQl9OworCisJCXBzY0AyYzAwIHsJCS8vIFBTQzYKIAkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLXBzYy11YXJ0IiwiZnNsLG1wYzUyMDAtcHNjLXVhcnQiOwotCQkJcmVnID0gPDB4MmMwMCAweDEwMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDIgNCAwPjsKIAkJfTsKIAogCQlldGhlcm5ldEAzMDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWZlYyIsImZzbCxtcGM1MjAwLWZlYyI7Ci0JCQlyZWcgPSA8MHgzMDAwIDB4NDAwPjsKLQkJCWxvY2FsLW1hYy1hZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOwotCQkJaW50ZXJydXB0cyA9IDwyIDUgMD47CiAJCQlwaHktaGFuZGxlID0gPCZwaHkwPjsKIAkJfTsKIAogCQltZGlvQDMwMDAgewotCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCQkjc2l6ZS1jZWxscyA9IDwwPjsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLW1kaW8iLCJmc2wsbXBjNTIwMC1tZGlvIjsKLQkJCXJlZyA9IDwweDMwMDAgMHg0MDA+OyAJLy8gZmVjIHJhbmdlLCBzaW5jZSB3ZSBuZWVkIHRvIHNldHVwIGZlYyBpbnRlcnJ1cHRzCi0JCQlpbnRlcnJ1cHRzID0gPDIgNSAwPjsgCS8vIHRoZXNlIGFyZSBmb3IgIm1paSBjb21tYW5kIGZpbmlzaGVkIiwgbm90IGxpbmsgY2hhbmdlcyAmIGNvLgotCiAJCQlwaHkwOiBldGhlcm5ldC1waHlAMCB7CiAJCQkJY29tcGF0aWJsZSA9ICJpbnRlbCxseHQ5NzEiOwogCQkJCXJlZyA9IDwwPjsKIAkJCX07CiAJCX07CiAKLQkJYXRhQDNhMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItYXRhIiwiZnNsLG1wYzUyMDAtYXRhIjsKLQkJCXJlZyA9IDwweDNhMDAgMHgxMDA+OwotCQkJaW50ZXJydXB0cyA9IDwyIDcgMD47CisJCWkyY0AzZDAwIHsKKwkJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CiAJCX07CiAKIAkJaTJjQDNkNDAgewotCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCQkjc2l6ZS1jZWxscyA9IDwwPjsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWkyYyIsImZzbCxtcGM1MjAwLWkyYyIsImZzbC1pMmMiOwotCQkJcmVnID0gPDB4M2Q0MCAweDQwPjsKLQkJCWludGVycnVwdHMgPSA8MiAxNiAwPjsKIAkJCWh3bW9uQDJjIHsKIAkJCQljb21wYXRpYmxlID0gImFkLGFkbTkyNDAiOwogCQkJCXJlZyA9IDwweDJjPjsKQEAgLTE4NiwyMCArMTIzLDkgQEAKIAkJCQlyZWcgPSA8MHg1MT47CiAJCQl9OwogCQl9OwotCi0JCXNyYW1AODAwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1zcmFtIiwiZnNsLG1wYzUyMDAtc3JhbSI7Ci0JCQlyZWcgPSA8MHg4MDAwIDB4NDAwMD47Ci0JCX07CiAJfTsKIAogCXBjaUBmMDAwMGQwMCB7Ci0JCSNpbnRlcnJ1cHQtY2VsbHMgPSA8MT47Ci0JCSNzaXplLWNlbGxzID0gPDI+OwotCQkjYWRkcmVzcy1jZWxscyA9IDwzPjsKLQkJZGV2aWNlX3R5cGUgPSAicGNpIjsKLQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItcGNpIiwiZnNsLG1wYzUyMDAtcGNpIjsKLQkJcmVnID0gPDB4ZjAwMDBkMDAgMHgxMDA+OwogCQlpbnRlcnJ1cHQtbWFwLW1hc2sgPSA8MHhmODAwIDAgMCA3PjsKIAkJaW50ZXJydXB0LW1hcCA9IDwKIAkJCQkvKiBJRFNFTCAweDEwICovCkBAIC0yMDgsMjAgKzEzNCwxMiBAQAogCQkJCTB4ODAwMCAwIDAgMyAmbXBjNTIwMF9waWMgMCAyIDMKIAkJCQkweDgwMDAgMCAwIDQgJm1wYzUyMDBfcGljIDAgMSAzCiAJCQkJPjsKLQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OyAvLyBGcm9tIGJvb3QgbG9hZGVyCi0JCWludGVycnVwdHMgPSA8MiA4IDAgMiA5IDAgMiAxMCAwPjsKLQkJYnVzLXJhbmdlID0gPDAgMD47CiAJCXJhbmdlcyA9IDwweDQyMDAwMDAwIDAgMHg2MDAwMDAwMCAweDYwMDAwMDAwIDAgMHgxMDAwMDAwMAogCQkJICAweDAyMDAwMDAwIDAgMHg5MDAwMDAwMCAweDkwMDAwMDAwIDAgMHgxMDAwMDAwMAogCQkJICAweDAxMDAwMDAwIDAgMHgwMDAwMDAwMCAweGEwMDAwMDAwIDAgMHgwMTAwMDAwMD47CiAJfTsKIAogCWxvY2FsYnVzIHsKLQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItbHBiIiwiZnNsLG1wYzUyMDAtbHBiIiwic2ltcGxlLWJ1cyI7Ci0KLQkJI2FkZHJlc3MtY2VsbHMgPSA8Mj47Ci0JCSNzaXplLWNlbGxzID0gPDE+OwotCiAJCXJhbmdlcyA9IDwwIDAgMHhmZjgwMDAwMCAweDAwODAwMDAwCiAJCQkgIDEgMCAweDgwMDAwMDAwIDB4MDA4MDAwMDAKIAkJCSAgMyAwIDB4ODAwMDAwMDAgMHgwMDgwMDAwMD47CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvcGNtMDMwLmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9wY20wMzAuZHRzCmluZGV4IDhhNGVjMzAuLjllMzU0OTkgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9wY20wMzAuZHRzCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9wY20wMzAuZHRzCkBAIC0xMiwyNDYgKzEyLDkyIEBACiAgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogICovCiAKLS9kdHMtdjEvOworL2luY2x1ZGUvICJtcGM1MjAwYi5kdHNpIgogCiAvIHsKIAltb2RlbCA9ICJwaHl0ZWMscGNtMDMwIjsKIAljb21wYXRpYmxlID0gInBoeXRlYyxwY20wMzAiOwotCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCSNzaXplLWNlbGxzID0gPDE+OwotCWludGVycnVwdC1wYXJlbnQgPSA8Jm1wYzUyMDBfcGljPjsKLQotCWNwdXMgewotCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJI3NpemUtY2VsbHMgPSA8MD47Ci0KLQkJUG93ZXJQQyw1MjAwQDAgewotCQkJZGV2aWNlX3R5cGUgPSAiY3B1IjsKLQkJCXJlZyA9IDwwPjsKLQkJCWQtY2FjaGUtbGluZS1zaXplID0gPDMyPjsKLQkJCWktY2FjaGUtbGluZS1zaXplID0gPDMyPjsKLQkJCWQtY2FjaGUtc2l6ZSA9IDwweDQwMDA+OwkvLyBMMSwgMTZLCi0JCQlpLWNhY2hlLXNpemUgPSA8MHg0MDAwPjsJLy8gTDEsIDE2SwotCQkJdGltZWJhc2UtZnJlcXVlbmN5ID0gPDA+OwkvLyBmcm9tIGJvb3Rsb2FkZXIKLQkJCWJ1cy1mcmVxdWVuY3kgPSA8MD47CQkvLyBmcm9tIGJvb3Rsb2FkZXIKLQkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsJCS8vIGZyb20gYm9vdGxvYWRlcgotCQl9OwotCX07Ci0KLQltZW1vcnkgewotCQlkZXZpY2VfdHlwZSA9ICJtZW1vcnkiOwotCQlyZWcgPSA8MHgwMDAwMDAwMCAweDA0MDAwMDAwPjsJLy8gNjRNQgotCX07CiAKIAlzb2M1MjAwQGYwMDAwMDAwIHsKLQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCSNzaXplLWNlbGxzID0gPDE+OwotCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1pbW1yIjsKLQkJcmFuZ2VzID0gPDAgMHhmMDAwMDAwMCAweDAwMDBjMDAwPjsKLQkJYnVzLWZyZXF1ZW5jeSA9IDwwPjsJCS8vIGZyb20gYm9vdGxvYWRlcgotCQlzeXN0ZW0tZnJlcXVlbmN5ID0gPDA+OwkJLy8gZnJvbSBib290bG9hZGVyCi0KLQkJY2RtQDIwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1jZG0iLCJmc2wsbXBjNTIwMC1jZG0iOwotCQkJcmVnID0gPDB4MjAwIDB4Mzg+OwotCQl9OwotCi0JCW1wYzUyMDBfcGljOiBpbnRlcnJ1cHQtY29udHJvbGxlckA1MDAgewotCQkJLy8gNTIwMCBpbnRlcnJ1cHRzIGFyZSBlbmNvZGVkIGludG8gdHdvIGxldmVsczsKLQkJCWludGVycnVwdC1jb250cm9sbGVyOwotCQkJI2ludGVycnVwdC1jZWxscyA9IDwzPjsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLXBpYyIsImZzbCxtcGM1MjAwLXBpYyI7Ci0JCQlyZWcgPSA8MHg1MDAgMHg4MD47Ci0JCX07Ci0KLQkJdGltZXJANjAwIHsJLy8gR2VuZXJhbCBQdXJwb3NlIFRpbWVyCi0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1ncHQiLCJmc2wsbXBjNTIwMC1ncHQiOwotCQkJcmVnID0gPDB4NjAwIDB4MTA+OwotCQkJaW50ZXJydXB0cyA9IDwxIDkgMD47CisJCXRpbWVyQDYwMCB7CQkvLyBHZW5lcmFsIFB1cnBvc2UgVGltZXIKIAkJCWZzbCxoYXMtd2R0OwogCQl9OwogCi0JCXRpbWVyQDYxMCB7CS8vIEdlbmVyYWwgUHVycG9zZSBUaW1lcgotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItZ3B0IiwiZnNsLG1wYzUyMDAtZ3B0IjsKLQkJCXJlZyA9IDwweDYxMCAweDEwPjsKLQkJCWludGVycnVwdHMgPSA8MSAxMCAwPjsKLQkJfTsKLQogCQlncHQyOiB0aW1lckA2MjAgewkvLyBHZW5lcmFsIFB1cnBvc2UgVGltZXIgaW4gR1BJTyBtb2RlCiAJCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1ncHQtZ3BpbyIsImZzbCxtcGM1MjAwLWdwdC1ncGlvIjsKLQkJCXJlZyA9IDwweDYyMCAweDEwPjsKLQkJCWludGVycnVwdHMgPSA8MSAxMSAwPjsKIAkJCWdwaW8tY29udHJvbGxlcjsKIAkJCSNncGlvLWNlbGxzID0gPDI+OwogCQl9OwogCiAJCWdwdDM6IHRpbWVyQDYzMCB7CS8vIEdlbmVyYWwgUHVycG9zZSBUaW1lciBpbiBHUElPIG1vZGUKIAkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWdwdC1ncGlvIiwiZnNsLG1wYzUyMDAtZ3B0LWdwaW8iOwotCQkJcmVnID0gPDB4NjMwIDB4MTA+OwotCQkJaW50ZXJydXB0cyA9IDwxIDEyIDA+OwogCQkJZ3Bpby1jb250cm9sbGVyOwogCQkJI2dwaW8tY2VsbHMgPSA8Mj47CiAJCX07CiAKIAkJZ3B0NDogdGltZXJANjQwIHsJLy8gR2VuZXJhbCBQdXJwb3NlIFRpbWVyIGluIEdQSU8gbW9kZQogCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItZ3B0LWdwaW8iLCJmc2wsbXBjNTIwMC1ncHQtZ3BpbyI7Ci0JCQlyZWcgPSA8MHg2NDAgMHgxMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDEgMTMgMD47CiAJCQlncGlvLWNvbnRyb2xsZXI7CiAJCQkjZ3Bpby1jZWxscyA9IDwyPjsKIAkJfTsKIAogCQlncHQ1OiB0aW1lckA2NTAgewkvLyBHZW5lcmFsIFB1cnBvc2UgVGltZXIgaW4gR1BJTyBtb2RlCiAJCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1ncHQtZ3BpbyIsImZzbCxtcGM1MjAwLWdwdC1ncGlvIjsKLQkJCXJlZyA9IDwweDY1MCAweDEwPjsKLQkJCWludGVycnVwdHMgPSA8MSAxNCAwPjsKIAkJCWdwaW8tY29udHJvbGxlcjsKIAkJCSNncGlvLWNlbGxzID0gPDI+OwogCQl9OwogCiAJCWdwdDY6IHRpbWVyQDY2MCB7CS8vIEdlbmVyYWwgUHVycG9zZSBUaW1lciBpbiBHUElPIG1vZGUKIAkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWdwdC1ncGlvIiwiZnNsLG1wYzUyMDAtZ3B0LWdwaW8iOwotCQkJcmVnID0gPDB4NjYwIDB4MTA+OwotCQkJaW50ZXJydXB0cyA9IDwxIDE1IDA+OwogCQkJZ3Bpby1jb250cm9sbGVyOwogCQkJI2dwaW8tY2VsbHMgPSA8Mj47CiAJCX07CiAKIAkJZ3B0NzogdGltZXJANjcwIHsJLy8gR2VuZXJhbCBQdXJwb3NlIFRpbWVyIGluIEdQSU8gbW9kZQogCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItZ3B0LWdwaW8iLCJmc2wsbXBjNTIwMC1ncHQtZ3BpbyI7Ci0JCQlyZWcgPSA8MHg2NzAgMHgxMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDEgMTYgMD47CiAJCQlncGlvLWNvbnRyb2xsZXI7CiAJCQkjZ3Bpby1jZWxscyA9IDwyPjsKIAkJfTsKIAotCQlydGNAODAwIHsJLy8gUmVhbCB0aW1lIGNsb2NrCi0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1ydGMiLCJmc2wsbXBjNTIwMC1ydGMiOwotCQkJcmVnID0gPDB4ODAwIDB4MTAwPjsKLQkJCWludGVycnVwdHMgPSA8MSA1IDAgMSA2IDA+OwotCQl9OwotCi0JCWNhbkA5MDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItbXNjYW4iLCJmc2wsbXBjNTIwMC1tc2NhbiI7Ci0JCQlpbnRlcnJ1cHRzID0gPDIgMTcgMD47Ci0JCQlyZWcgPSA8MHg5MDAgMHg4MD47Ci0JCX07Ci0KLQkJY2FuQDk4MCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1tc2NhbiIsImZzbCxtcGM1MjAwLW1zY2FuIjsKLQkJCWludGVycnVwdHMgPSA8MiAxOCAwPjsKLQkJCXJlZyA9IDwweDk4MCAweDgwPjsKLQkJfTsKLQotCQlncGlvX3NpbXBsZTogZ3Bpb0BiMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItZ3BpbyIsImZzbCxtcGM1MjAwLWdwaW8iOwotCQkJcmVnID0gPDB4YjAwIDB4NDA+OwotCQkJaW50ZXJydXB0cyA9IDwxIDcgMD47Ci0JCQlncGlvLWNvbnRyb2xsZXI7Ci0JCQkjZ3Bpby1jZWxscyA9IDwyPjsKLQkJfTsKLQotCQlncGlvX3drdXA6IGdwaW9AYzAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWdwaW8td2t1cCIsImZzbCxtcGM1MjAwLWdwaW8td2t1cCI7Ci0JCQlyZWcgPSA8MHhjMDAgMHg0MD47Ci0JCQlpbnRlcnJ1cHRzID0gPDEgOCAwIDAgMyAwPjsKLQkJCWdwaW8tY29udHJvbGxlcjsKLQkJCSNncGlvLWNlbGxzID0gPDI+OwotCQl9OwotCi0JCXNwaUBmMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItc3BpIiwiZnNsLG1wYzUyMDAtc3BpIjsKLQkJCXJlZyA9IDwweGYwMCAweDIwPjsKLQkJCWludGVycnVwdHMgPSA8MiAxMyAwIDIgMTQgMD47Ci0JCX07Ci0KLQkJdXNiQDEwMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItb2hjaSIsImZzbCxtcGM1MjAwLW9oY2kiLCJvaGNpLWJlIjsKLQkJCXJlZyA9IDwweDEwMDAgMHhmZj47Ci0JCQlpbnRlcnJ1cHRzID0gPDIgNiAwPjsKLQkJfTsKLQotCQlkbWEtY29udHJvbGxlckAxMjAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWJlc3Rjb21tIiwiZnNsLG1wYzUyMDAtYmVzdGNvbW0iOwotCQkJcmVnID0gPDB4MTIwMCAweDgwPjsKLQkJCWludGVycnVwdHMgPSA8MyAwIDAgIDMgMSAwICAzIDIgMCAgMyAzIDAKLQkJCSAgICAgICAgICAgICAgMyA0IDAgIDMgNSAwICAzIDYgMCAgMyA3IDAKLQkJCSAgICAgICAgICAgICAgMyA4IDAgIDMgOSAwICAzIDEwIDAgIDMgMTEgMAotCQkJICAgICAgICAgICAgICAzIDEyIDAgIDMgMTMgMCAgMyAxNCAwICAzIDE1IDA+OwotCQl9OwotCi0JCXhsYkAxZjAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLXhsYiIsImZzbCxtcGM1MjAwLXhsYiI7Ci0JCQlyZWcgPSA8MHgxZjAwIDB4MTAwPjsKLQkJfTsKLQotCQlhYzk3QDIwMDAgeyAvKiBQU0MxIGluIGFjOTcgbW9kZSAqLworCQlwc2NAMjAwMCB7IC8qIFBTQzEgaW4gYWM5NyBtb2RlICovCiAJCQljb21wYXRpYmxlID0gIm1wYzUyMDBiLXBzYy1hYzk3IiwiZnNsLG1wYzUyMDBiLXBzYy1hYzk3IjsKIAkJCWNlbGwtaW5kZXggPSA8MD47Ci0JCQlyZWcgPSA8MHgyMDAwIDB4MTAwPjsKLQkJCWludGVycnVwdHMgPSA8MiAxIDA+OwogCQl9OwogCiAJCS8qIFBTQzIgcG9ydCBpcyB1c2VkIGJ5IENBTjEvMiAqLworCQlwc2NAMjIwMCB7CisJCQlzdGF0dXMgPSAiZGlzYWJsZWQiOworCQl9OwogCi0JCXNlcmlhbEAyNDAwIHsgLyogUFNDMyBpbiBVQVJUIG1vZGUgKi8KKwkJcHNjQDI0MDAgeyAvKiBQU0MzIGluIFVBUlQgbW9kZSAqLwogCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItcHNjLXVhcnQiLCJmc2wsbXBjNTIwMC1wc2MtdWFydCI7Ci0JCQljZWxsLWluZGV4ID0gPDI+OwotCQkJcmVnID0gPDB4MjQwMCAweDEwMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDIgMyAwPjsKIAkJfTsKIAogCQkvKiBQU0M0IGlzID8/PyAqLworCQlwc2NAMjYwMCB7CisJCQlzdGF0dXMgPSAiZGlzYWJsZWQiOworCQl9OwogCiAJCS8qIFBTQzUgaXMgPz8/ICovCisJCXBzY0AyODAwIHsKKwkJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CisJCX07CiAKLQkJc2VyaWFsQDJjMDAgeyAvKiBQU0M2IGluIFVBUlQgbW9kZSAqLworCQlwc2NAMmMwMCB7IC8qIFBTQzYgaW4gVUFSVCBtb2RlICovCiAJCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1wc2MtdWFydCIsImZzbCxtcGM1MjAwLXBzYy11YXJ0IjsKLQkJCWNlbGwtaW5kZXggPSA8NT47Ci0JCQlyZWcgPSA8MHgyYzAwIDB4MTAwPjsKLQkJCWludGVycnVwdHMgPSA8MiA0IDA+OwogCQl9OwogCiAJCWV0aGVybmV0QDMwMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItZmVjIiwiZnNsLG1wYzUyMDAtZmVjIjsKLQkJCXJlZyA9IDwweDMwMDAgMHg0MDA+OwotCQkJbG9jYWwtbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07Ci0JCQlpbnRlcnJ1cHRzID0gPDIgNSAwPjsKIAkJCXBoeS1oYW5kbGUgPSA8JnBoeTA+OwogCQl9OwogCiAJCW1kaW9AMzAwMCB7Ci0JCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJCSNzaXplLWNlbGxzID0gPDA+OwotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItbWRpbyIsImZzbCxtcGM1MjAwLW1kaW8iOwotCQkJcmVnID0gPDB4MzAwMCAweDQwMD47CS8vIGZlYyByYW5nZSwgc2luY2Ugd2UgbmVlZCB0byBzZXR1cCBmZWMgaW50ZXJydXB0cwotCQkJaW50ZXJydXB0cyA9IDwyIDUgMD47CS8vIHRoZXNlIGFyZSBmb3IgIm1paSBjb21tYW5kIGZpbmlzaGVkIiwgbm90IGxpbmsgY2hhbmdlcyAmIGNvLgotCiAJCQlwaHkwOiBldGhlcm5ldC1waHlAMCB7CiAJCQkJcmVnID0gPDA+OwogCQkJfTsKIAkJfTsKIAotCQlhdGFAM2EwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1hdGEiLCJmc2wsbXBjNTIwMC1hdGEiOwotCQkJcmVnID0gPDB4M2EwMCAweDEwMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDIgNyAwPjsKLQkJfTsKLQotCQlpMmNAM2QwMCB7Ci0JCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJCSNzaXplLWNlbGxzID0gPDA+OwotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItaTJjIiwiZnNsLG1wYzUyMDAtaTJjIiwiZnNsLWkyYyI7Ci0JCQlyZWcgPSA8MHgzZDAwIDB4NDA+OwotCQkJaW50ZXJydXB0cyA9IDwyIDE1IDA+OwotCQl9OwotCiAJCWkyY0AzZDQwIHsKLQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCQkJI3NpemUtY2VsbHMgPSA8MD47Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1pMmMiLCJmc2wsbXBjNTIwMC1pMmMiLCJmc2wtaTJjIjsKLQkJCXJlZyA9IDwweDNkNDAgMHg0MD47Ci0JCQlpbnRlcnJ1cHRzID0gPDIgMTYgMD47CiAJCQlydGNANTEgewogCQkJCWNvbXBhdGlibGUgPSAibnhwLHBjZjg1NjMiOwogCQkJCXJlZyA9IDwweDUxPjsKQEAgLTI1OSw2ICsxMDUsNyBAQAogCQkJZWVwcm9tQDUyIHsKIAkJCQljb21wYXRpYmxlID0gImNhdGFseXN0LDI0YzMyIjsKIAkJCQlyZWcgPSA8MHg1Mj47CisJCQkJcGFnZXNpemUgPSA8MzI+OwogCQkJfTsKIAkJfTsKIApAQCAtMjY5LDEyICsxMTYsNiBAQAogCX07CiAKIAlwY2lAZjAwMDBkMDAgewotCQkjaW50ZXJydXB0LWNlbGxzID0gPDE+OwotCQkjc2l6ZS1jZWxscyA9IDwyPjsKLQkJI2FkZHJlc3MtY2VsbHMgPSA8Mz47Ci0JCWRldmljZV90eXBlID0gInBjaSI7Ci0JCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLXBjaSIsImZzbCxtcGM1MjAwLXBjaSI7Ci0JCXJlZyA9IDwweGYwMDAwZDAwIDB4MTAwPjsKIAkJaW50ZXJydXB0LW1hcC1tYXNrID0gPDB4ZjgwMCAwIDAgNz47CiAJCWludGVycnVwdC1tYXAgPSA8MHhjMDAwIDAgMCAxICZtcGM1MjAwX3BpYyAwIDAgMyAvLyAxc3Qgc2xvdAogCQkJCSAweGMwMDAgMCAwIDIgJm1wYzUyMDBfcGljIDEgMSAzCkBAIC0yODUsMTEgKzEyNiwxMiBAQAogCQkJCSAweGM4MDAgMCAwIDIgJm1wYzUyMDBfcGljIDEgMiAzCiAJCQkJIDB4YzgwMCAwIDAgMyAmbXBjNTIwMF9waWMgMSAzIDMKIAkJCQkgMHhjODAwIDAgMCA0ICZtcGM1MjAwX3BpYyAwIDAgMz47Ci0JCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsgLy8gRnJvbSBib290IGxvYWRlcgotCQlpbnRlcnJ1cHRzID0gPDIgOCAwIDIgOSAwIDIgMTAgMD47Ci0JCWJ1cy1yYW5nZSA9IDwwIDA+OwogCQlyYW5nZXMgPSA8MHg0MjAwMDAwMCAwIDB4ODAwMDAwMDAgMHg4MDAwMDAwMCAwIDB4MjAwMDAwMDAKIAkJCSAgMHgwMjAwMDAwMCAwIDB4YTAwMDAwMDAgMHhhMDAwMDAwMCAwIDB4MTAwMDAwMDAKIAkJCSAgMHgwMTAwMDAwMCAwIDB4MDAwMDAwMDAgMHhiMDAwMDAwMCAwIDB4MDEwMDAwMDA+OwogCX07CisKKwlsb2NhbGJ1cyB7CisJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CisJfTsKIH07CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvcGNtMDMyLmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9wY20wMzIuZHRzCmluZGV4IDg1ZDg1N2EuLjFkZDQ3OGIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9wY20wMzIuZHRzCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9wY20wMzIuZHRzCkBAIC0xMiw5OSArMTIsMzcgQEAKICAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAgKi8KIAotL2R0cy12MS87CisvaW5jbHVkZS8gIm1wYzUyMDBiLmR0c2kiCiAKIC8gewogCW1vZGVsID0gInBoeXRlYyxwY20wMzIiOwogCWNvbXBhdGlibGUgPSAicGh5dGVjLHBjbTAzMiI7Ci0JI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JI3NpemUtY2VsbHMgPSA8MT47Ci0JaW50ZXJydXB0LXBhcmVudCA9IDwmbXBjNTIwMF9waWM+OwotCi0JY3B1cyB7Ci0JCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCQkjc2l6ZS1jZWxscyA9IDwwPjsKLQotCQlQb3dlclBDLDUyMDBAMCB7Ci0JCQlkZXZpY2VfdHlwZSA9ICJjcHUiOwotCQkJcmVnID0gPDA+OwotCQkJZC1jYWNoZS1saW5lLXNpemUgPSA8MzI+OwotCQkJaS1jYWNoZS1saW5lLXNpemUgPSA8MzI+OwotCQkJZC1jYWNoZS1zaXplID0gPDB4NDAwMD47CS8vIEwxLCAxNksKLQkJCWktY2FjaGUtc2l6ZSA9IDwweDQwMDA+OwkvLyBMMSwgMTZLCi0JCQl0aW1lYmFzZS1mcmVxdWVuY3kgPSA8MD47CS8vIGZyb20gYm9vdGxvYWRlcgotCQkJYnVzLWZyZXF1ZW5jeSA9IDwwPjsJCS8vIGZyb20gYm9vdGxvYWRlcgotCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OwkJLy8gZnJvbSBib290bG9hZGVyCi0JCX07Ci0JfTsKIAogCW1lbW9yeSB7Ci0JCWRldmljZV90eXBlID0gIm1lbW9yeSI7CiAJCXJlZyA9IDwweDAwMDAwMDAwIDB4MDgwMDAwMDA+OwkvLyAxMjhNQgogCX07CiAKIAlzb2M1MjAwQGYwMDAwMDAwIHsKLQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCSNzaXplLWNlbGxzID0gPDE+OwotCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1pbW1yIjsKLQkJcmFuZ2VzID0gPDAgMHhmMDAwMDAwMCAweDAwMDBjMDAwPjsKLQkJYnVzLWZyZXF1ZW5jeSA9IDwwPjsJCS8vIGZyb20gYm9vdGxvYWRlcgotCQlzeXN0ZW0tZnJlcXVlbmN5ID0gPDA+OwkJLy8gZnJvbSBib290bG9hZGVyCi0KLQkJY2RtQDIwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1jZG0iLCJmc2wsbXBjNTIwMC1jZG0iOwotCQkJcmVnID0gPDB4MjAwIDB4Mzg+OwotCQl9OwotCi0JCW1wYzUyMDBfcGljOiBpbnRlcnJ1cHQtY29udHJvbGxlckA1MDAgewotCQkJLy8gNTIwMCBpbnRlcnJ1cHRzIGFyZSBlbmNvZGVkIGludG8gdHdvIGxldmVsczsKLQkJCWludGVycnVwdC1jb250cm9sbGVyOwotCQkJI2ludGVycnVwdC1jZWxscyA9IDwzPjsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLXBpYyIsImZzbCxtcGM1MjAwLXBpYyI7Ci0JCQlyZWcgPSA8MHg1MDAgMHg4MD47Ci0JCX07Ci0KLQkJdGltZXJANjAwIHsJLy8gR2VuZXJhbCBQdXJwb3NlIFRpbWVyCi0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1ncHQiLCJmc2wsbXBjNTIwMC1ncHQiOwotCQkJcmVnID0gPDB4NjAwIDB4MTA+OwotCQkJaW50ZXJydXB0cyA9IDwxIDkgMD47CisJCXRpbWVyQDYwMCB7CQkvLyBHZW5lcmFsIFB1cnBvc2UgVGltZXIKIAkJCWZzbCxoYXMtd2R0OwogCQl9OwogCi0JCXRpbWVyQDYxMCB7CS8vIEdlbmVyYWwgUHVycG9zZSBUaW1lcgotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItZ3B0IiwiZnNsLG1wYzUyMDAtZ3B0IjsKLQkJCXJlZyA9IDwweDYxMCAweDEwPjsKLQkJCWludGVycnVwdHMgPSA8MSAxMCAwPjsKLQkJfTsKLQogCQlncHQyOiB0aW1lckA2MjAgewkvLyBHZW5lcmFsIFB1cnBvc2UgVGltZXIgaW4gR1BJTyBtb2RlCi0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1ncHQiLCJmc2wsbXBjNTIwMC1ncHQiOwotCQkJcmVnID0gPDB4NjIwIDB4MTA+OwotCQkJaW50ZXJydXB0cyA9IDwxIDExIDA+OwogCQkJZ3Bpby1jb250cm9sbGVyOwogCQkJI2dwaW8tY2VsbHMgPSA8Mj47CiAJCX07CiAKIAkJZ3B0MzogdGltZXJANjMwIHsJLy8gR2VuZXJhbCBQdXJwb3NlIFRpbWVyIGluIEdQSU8gbW9kZQotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItZ3B0IiwiZnNsLG1wYzUyMDAtZ3B0IjsKLQkJCXJlZyA9IDwweDYzMCAweDEwPjsKLQkJCWludGVycnVwdHMgPSA8MSAxMiAwPjsKIAkJCWdwaW8tY29udHJvbGxlcjsKIAkJCSNncGlvLWNlbGxzID0gPDI+OwogCQl9OwogCiAJCWdwdDQ6IHRpbWVyQDY0MCB7CS8vIEdlbmVyYWwgUHVycG9zZSBUaW1lciBpbiBHUElPIG1vZGUKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWdwdCIsImZzbCxtcGM1MjAwLWdwdCI7Ci0JCQlyZWcgPSA8MHg2NDAgMHgxMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDEgMTMgMD47CiAJCQlncGlvLWNvbnRyb2xsZXI7CiAJCQkjZ3Bpby1jZWxscyA9IDwyPjsKIAkJfTsKIAogCQlncHQ1OiB0aW1lckA2NTAgewkvLyBHZW5lcmFsIFB1cnBvc2UgVGltZXIgaW4gR1BJTyBtb2RlCi0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1ncHQiLCJmc2wsbXBjNTIwMC1ncHQiOwotCQkJcmVnID0gPDB4NjUwIDB4MTA+OwotCQkJaW50ZXJydXB0cyA9IDwxIDE0IDA+OwogCQkJZ3Bpby1jb250cm9sbGVyOwogCQkJI2dwaW8tY2VsbHMgPSA8Mj47CiAJCX07CkBAIC0xMTgsMTYzICs1Niw2MiBAQAogCQl9OwogCiAJCWdwdDc6IHRpbWVyQDY3MCB7CS8vIEdlbmVyYWwgUHVycG9zZSBUaW1lciBpbiBHUElPIG1vZGUKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWdwdCIsImZzbCxtcGM1MjAwLWdwdCI7Ci0JCQlyZWcgPSA8MHg2NzAgMHgxMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDEgMTYgMD47CiAJCQlncGlvLWNvbnRyb2xsZXI7CiAJCQkjZ3Bpby1jZWxscyA9IDwyPjsKIAkJfTsKIAotCQlydGNAODAwIHsJLy8gUmVhbCB0aW1lIGNsb2NrCi0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1ydGMiLCJmc2wsbXBjNTIwMC1ydGMiOwotCQkJcmVnID0gPDB4ODAwIDB4MTAwPjsKLQkJCWludGVycnVwdHMgPSA8MSA1IDAgMSA2IDA+OwotCQl9OwotCi0JCWNhbkA5MDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItbXNjYW4iLCJmc2wsbXBjNTIwMC1tc2NhbiI7Ci0JCQlpbnRlcnJ1cHRzID0gPDIgMTcgMD47Ci0JCQlyZWcgPSA8MHg5MDAgMHg4MD47Ci0JCX07Ci0KLQkJY2FuQDk4MCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1tc2NhbiIsImZzbCxtcGM1MjAwLW1zY2FuIjsKLQkJCWludGVycnVwdHMgPSA8MiAxOCAwPjsKLQkJCXJlZyA9IDwweDk4MCAweDgwPjsKLQkJfTsKLQotCQlncGlvX3NpbXBsZTogZ3Bpb0BiMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItZ3BpbyIsImZzbCxtcGM1MjAwLWdwaW8iOwotCQkJcmVnID0gPDB4YjAwIDB4NDA+OwotCQkJaW50ZXJydXB0cyA9IDwxIDcgMD47Ci0JCQlncGlvLWNvbnRyb2xsZXI7Ci0JCQkjZ3Bpby1jZWxscyA9IDwyPjsKLQkJfTsKLQotCQlncGlvX3drdXA6IGdwaW9AYzAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWdwaW8td2t1cCIsImZzbCxtcGM1MjAwLWdwaW8td2t1cCI7Ci0JCQlyZWcgPSA8MHhjMDAgMHg0MD47Ci0JCQlpbnRlcnJ1cHRzID0gPDEgOCAwIDAgMyAwPjsKLQkJCWdwaW8tY29udHJvbGxlcjsKLQkJCSNncGlvLWNlbGxzID0gPDI+OwotCQl9OwotCi0JCXNwaUBmMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItc3BpIiwiZnNsLG1wYzUyMDAtc3BpIjsKLQkJCXJlZyA9IDwweGYwMCAweDIwPjsKLQkJCWludGVycnVwdHMgPSA8MiAxMyAwIDIgMTQgMD47Ci0JCX07Ci0KLQkJdXNiQDEwMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItb2hjaSIsImZzbCxtcGM1MjAwLW9oY2kiLCJvaGNpLWJlIjsKLQkJCXJlZyA9IDwweDEwMDAgMHhmZj47Ci0JCQlpbnRlcnJ1cHRzID0gPDIgNiAwPjsKLQkJfTsKLQotCQlkbWEtY29udHJvbGxlckAxMjAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWJlc3Rjb21tIiwiZnNsLG1wYzUyMDAtYmVzdGNvbW0iOwotCQkJcmVnID0gPDB4MTIwMCAweDgwPjsKLQkJCWludGVycnVwdHMgPSA8MyAwIDAgIDMgMSAwICAzIDIgMCAgMyAzIDAKLQkJCSAgICAgICAgICAgICAgMyA0IDAgIDMgNSAwICAzIDYgMCAgMyA3IDAKLQkJCSAgICAgICAgICAgICAgMyA4IDAgIDMgOSAwICAzIDEwIDAgIDMgMTEgMAotCQkJICAgICAgICAgICAgICAzIDEyIDAgIDMgMTMgMCAgMyAxNCAwICAzIDE1IDA+OwotCQl9OwotCi0JCXhsYkAxZjAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLXhsYiIsImZzbCxtcGM1MjAwLXhsYiI7Ci0JCQlyZWcgPSA8MHgxZjAwIDB4MTAwPjsKLQkJfTsKLQotCQlhYzk3QDIwMDAgewkvKiBQU0MxIGlzIGFjOTcgKi8KKwkJcHNjQDIwMDAgewkvKiBQU0MxIGlzIGFjOTcgKi8KIAkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLXBzYy1hYzk3IiwiZnNsLG1wYzUyMDAtcHNjLWFjOTciOwogCQkJY2VsbC1pbmRleCA9IDwwPjsKLQkJCXJlZyA9IDwweDIwMDAgMHgxMDA+OwotCQkJaW50ZXJydXB0cyA9IDwyIDEgMD47CiAJCX07CiAKIAkJLyogUFNDMiBwb3J0IGlzIHVzZWQgYnkgQ0FOMS8yICovCisJCXBzY0AyMjAwIHsKKwkJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CisJCX07CiAKLQkJc2VyaWFsQDI0MDAgeyAvKiBQU0MzIGluIFVBUlQgbW9kZSAqLworCQlwc2NAMjQwMCB7IC8qIFBTQzMgaW4gVUFSVCBtb2RlICovCiAJCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1wc2MtdWFydCIsImZzbCxtcGM1MjAwLXBzYy11YXJ0IjsKLQkJCWNlbGwtaW5kZXggPSA8Mj47Ci0JCQlyZWcgPSA8MHgyNDAwIDB4MTAwPjsKLQkJCWludGVycnVwdHMgPSA8MiAzIDA+OwogCQl9OwogCiAJCS8qIFBTQzQgaXMgPz8/ICovCisJCXBzY0AyNjAwIHsKKwkJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CisJCX07CiAKIAkJLyogUFNDNSBpcyA/Pz8gKi8KKwkJcHNjQDI4MDAgeworCQkJc3RhdHVzID0gImRpc2FibGVkIjsKKwkJfTsKIAotCQlzZXJpYWxAMmMwMCB7IC8qIFBTQzYgaW4gVUFSVCBtb2RlICovCisJCXBzY0AyYzAwIHsgLyogUFNDNiBpbiBVQVJUIG1vZGUgKi8KIAkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLXBzYy11YXJ0IiwiZnNsLG1wYzUyMDAtcHNjLXVhcnQiOwotCQkJY2VsbC1pbmRleCA9IDw1PjsKLQkJCXJlZyA9IDwweDJjMDAgMHgxMDA+OwotCQkJaW50ZXJydXB0cyA9IDwyIDQgMD47CiAJCX07CiAKIAkJZXRoZXJuZXRAMzAwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1mZWMiLCJmc2wsbXBjNTIwMC1mZWMiOwotCQkJcmVnID0gPDB4MzAwMCAweDQwMD47Ci0JCQlsb2NhbC1tYWMtYWRkcmVzcyA9IFsgMDAgMDAgMDAgMDAgMDAgMDAgXTsKLQkJCWludGVycnVwdHMgPSA8MiA1IDA+OwogCQkJcGh5LWhhbmRsZSA9IDwmcGh5MD47CiAJCX07CiAKIAkJbWRpb0AzMDAwIHsKLQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCQkJI3NpemUtY2VsbHMgPSA8MD47Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1tZGlvIiwiZnNsLG1wYzUyMDAtbWRpbyI7Ci0JCQlyZWcgPSA8MHgzMDAwIDB4NDAwPjsJLy8gZmVjIHJhbmdlLCBzaW5jZSB3ZSBuZWVkIHRvIHNldHVwIGZlYyBpbnRlcnJ1cHRzCi0JCQlpbnRlcnJ1cHRzID0gPDIgNSAwPjsJLy8gdGhlc2UgYXJlIGZvciAibWlpIGNvbW1hbmQgZmluaXNoZWQiLCBub3QgbGluayBjaGFuZ2VzICYgY28uCi0KIAkJCXBoeTA6IGV0aGVybmV0LXBoeUAwIHsKIAkJCQlyZWcgPSA8MD47CiAJCQl9OwogCQl9OwogCi0JCWF0YUAzYTAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWF0YSIsImZzbCxtcGM1MjAwLWF0YSI7Ci0JCQlyZWcgPSA8MHgzYTAwIDB4MTAwPjsKLQkJCWludGVycnVwdHMgPSA8MiA3IDA+OwotCQl9OwotCi0JCWkyY0AzZDAwIHsKLQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCQkJI3NpemUtY2VsbHMgPSA8MD47Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1pMmMiLCJmc2wsbXBjNTIwMC1pMmMiLCJmc2wtaTJjIjsKLQkJCXJlZyA9IDwweDNkMDAgMHg0MD47Ci0JCQlpbnRlcnJ1cHRzID0gPDIgMTUgMD47Ci0JCX07Ci0KIAkJaTJjQDNkNDAgewotCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCQkjc2l6ZS1jZWxscyA9IDwwPjsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWkyYyIsImZzbCxtcGM1MjAwLWkyYyIsImZzbC1pMmMiOwotCQkJcmVnID0gPDB4M2Q0MCAweDQwPjsKLQkJCWludGVycnVwdHMgPSA8MiAxNiAwPjsKIAkJCXJ0Y0A1MSB7CiAJCQkJY29tcGF0aWJsZSA9ICJueHAscGNmODU2MyI7CiAJCQkJcmVnID0gPDB4NTE+OwogCQkJfTsKIAkJCWVlcHJvbUA1MiB7Ci0JCQkJY29tcGF0aWJsZSA9ICJhdDI0LDI0YzMyIjsKKwkJCQljb21wYXRpYmxlID0gImNhdGFseXN0LDI0YzMyIjsKIAkJCQlyZWcgPSA8MHg1Mj47CisJCQkJcGFnZXNpemUgPSA8MzI+OwogCQkJfTsKIAkJfTsKLQotCQlzcmFtQDgwMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItc3JhbSIsImZzbCxtcGM1MjAwLXNyYW0iOwotCQkJcmVnID0gPDB4ODAwMCAweDQwMDA+OwotCQl9OwogCX07CiAKIAlwY2lAZjAwMDBkMDAgewotCQkjaW50ZXJydXB0LWNlbGxzID0gPDE+OwotCQkjc2l6ZS1jZWxscyA9IDwyPjsKLQkJI2FkZHJlc3MtY2VsbHMgPSA8Mz47Ci0JCWRldmljZV90eXBlID0gInBjaSI7Ci0JCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLXBjaSIsImZzbCxtcGM1MjAwLXBjaSI7Ci0JCXJlZyA9IDwweGYwMDAwZDAwIDB4MTAwPjsKIAkJaW50ZXJydXB0LW1hcC1tYXNrID0gPDB4ZjgwMCAwIDAgNz47CiAJCWludGVycnVwdC1tYXAgPSA8MHhjMDAwIDAgMCAxICZtcGM1MjAwX3BpYyAwIDAgMyAvLyAxc3Qgc2xvdAogCQkJCSAweGMwMDAgMCAwIDIgJm1wYzUyMDBfcGljIDEgMSAzCkBAIC0yODUsMjAgKzEyMiwxMiBAQAogCQkJCSAweGM4MDAgMCAwIDIgJm1wYzUyMDBfcGljIDEgMiAzCiAJCQkJIDB4YzgwMCAwIDAgMyAmbXBjNTIwMF9waWMgMSAzIDMKIAkJCQkgMHhjODAwIDAgMCA0ICZtcGM1MjAwX3BpYyAwIDAgMz47Ci0JCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsgLy8gRnJvbSBib290IGxvYWRlcgotCQlpbnRlcnJ1cHRzID0gPDIgOCAwIDIgOSAwIDIgMTAgMD47Ci0JCWJ1cy1yYW5nZSA9IDwwIDA+OwogCQlyYW5nZXMgPSA8MHg0MjAwMDAwMCAwIDB4ODAwMDAwMDAgMHg4MDAwMDAwMCAwIDB4MjAwMDAwMDAKIAkJCSAgMHgwMjAwMDAwMCAwIDB4YTAwMDAwMDAgMHhhMDAwMDAwMCAwIDB4MTAwMDAwMDAKIAkJCSAgMHgwMTAwMDAwMCAwIDB4MDAwMDAwMDAgMHhiMDAwMDAwMCAwIDB4MDEwMDAwMDA+OwogCX07CiAKIAlsb2NhbGJ1cyB7Ci0JCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWxwYiIsImZzbCxtcGM1MjAwLWxwYiIsInNpbXBsZS1idXMiOwotCi0JCSNhZGRyZXNzLWNlbGxzID0gPDI+OwotCQkjc2l6ZS1jZWxscyA9IDwxPjsKLQogCQlyYW5nZXMgPSA8MCAwIDB4ZmUwMDAwMDAgMHgwMjAwMDAwMAogCQkJICAxIDAgMHhmYzAwMDAwMCAweDAyMDAwMDAwCiAJCQkgIDIgMCAweGZiZTAwMDAwIDB4MDAyMDAwMDAKQEAgLTM1MSw0MCArMTgwLDM5IEBACiAJCQliYW5rLXdpZHRoID0gPDI+OwogCQl9OwogCi0gICAgICAgICAgICAgICAgLyoKKwkJLyoKIAkJICogZXhhbXBsZSBzbmlwcGV0cyBmb3IgRlBHQQogCQkgKgogCQkgKiBmcGdhQDMsMCB7Ci0JCSAqICAgICAgICAgY29tcGF0aWJsZSA9ICJmcGdhX2RyaXZlciI7Ci0JCSAqICAgICAgICAgcmVnID0gPDMgMCAweDAyMDAwMDAwPjsKLQkJICogICAgICAgICBiYW5rLXdpZHRoID0gPDQ+OworCQkgKgkgY29tcGF0aWJsZSA9ICJmcGdhX2RyaXZlciI7CisJCSAqCSByZWcgPSA8MyAwIDB4MDIwMDAwMDA+OworCQkgKgkgYmFuay13aWR0aCA9IDw0PjsKIAkJICogfTsKIAkJICoKIAkJICogZnBnYUA0LDAgewotCQkgKiAgICAgICAgIGNvbXBhdGlibGUgPSAiZnBnYV9kcml2ZXIiOwotCQkgKiAgICAgICAgIHJlZyA9IDw0IDAgMHgwMjAwMDAwMD47Ci0JCSAqICAgICAgICAgYmFuay13aWR0aCA9IDw0PjsKKwkJICoJIGNvbXBhdGlibGUgPSAiZnBnYV9kcml2ZXIiOworCQkgKgkgcmVnID0gPDQgMCAweDAyMDAwMDAwPjsKKwkJICoJIGJhbmstd2lkdGggPSA8ND47CiAJCSAqIH07Ci0gICAgICAgICAgICAgICAgICovCisJCSAqLwogCi0gICAgICAgICAgICAgICAgLyoKKwkJLyoKIAkJICogZXhhbXBsZSBzbmlwcGV0cyBmb3IgZnJlZSBjaGlwc2VsZWN0cwotICAgICAgICAgICAgICAgICAqCisJCSAqCiAJCSAqIGRldmljZUA1LDAgewotCQkgKiAgICAgICAgIGNvbXBhdGlibGUgPSAiY3VzdG9tX2RyaXZlciI7Ci0JCSAqICAgICAgICAgcmVnID0gPDUgMCAweDAyMDAwMDAwPjsKKwkJICoJIGNvbXBhdGlibGUgPSAiY3VzdG9tX2RyaXZlciI7CisJCSAqCSByZWcgPSA8NSAwIDB4MDIwMDAwMDA+OwogCQkgKiB9OwotICAgICAgICAgICAgICAgICAqCisJCSAqCiAJCSAqIGRldmljZUA2LDAgewotCQkgKiAgICAgICAgIGNvbXBhdGlibGUgPSAiY3VzdG9tX2RyaXZlciI7Ci0JCSAqICAgICAgICAgcmVnID0gPDYgMCAweDAyMDAwMDAwPjsKKwkJICoJIGNvbXBhdGlibGUgPSAiY3VzdG9tX2RyaXZlciI7CisJCSAqCSByZWcgPSA8NiAwIDB4MDIwMDAwMDA+OwogCQkgKiB9OwotICAgICAgICAgICAgICAgICAqCisJCSAqCiAJCSAqIGRldmljZUA3LDAgewotCQkgKiAgICAgICAgIGNvbXBhdGlibGUgPSAiY3VzdG9tX2RyaXZlciI7Ci0JCSAqICAgICAgICAgcmVnID0gPDcgMCAweDAyMDAwMDAwPjsKKwkJICoJIGNvbXBhdGlibGUgPSAiY3VzdG9tX2RyaXZlciI7CisJCSAqCSByZWcgPSA8NyAwIDB4MDIwMDAwMDA+OwogCQkgKiB9OwotICAgICAgICAgICAgICAgICAqLworCQkgKi8KIAl9OwogfTsKLQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3VjMTAxLmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy91YzEwMS5kdHMKaW5kZXggMDE5MjY0Yy4uYmE4M2Q1NCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3VjMTAxLmR0cworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvdWMxMDEuZHRzCkBAIC0xMSw3OSArMTEsMjQgQEAKICAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAgKi8KIAotL2R0cy12MS87CisvaW5jbHVkZS8gIm1wYzUyMDBiLmR0c2kiCiAKIC8gewogCW1vZGVsID0gIm1hbnJvbGFuZCx1YzEwMSI7CiAJY29tcGF0aWJsZSA9ICJtYW5yb2xhbmQsdWMxMDEiOwotCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCSNzaXplLWNlbGxzID0gPDE+OwotCWludGVycnVwdC1wYXJlbnQgPSA8Jm1wYzUyMDBfcGljPjsKLQotCWNwdXMgewotCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJI3NpemUtY2VsbHMgPSA8MD47Ci0KLQkJUG93ZXJQQyw1MjAwQDAgewotCQkJZGV2aWNlX3R5cGUgPSAiY3B1IjsKLQkJCXJlZyA9IDwwPjsKLQkJCWQtY2FjaGUtbGluZS1zaXplID0gPDMyPjsKLQkJCWktY2FjaGUtbGluZS1zaXplID0gPDMyPjsKLQkJCWQtY2FjaGUtc2l6ZSA9IDwweDQwMDA+OwkvLyBMMSwgMTZLCi0JCQlpLWNhY2hlLXNpemUgPSA8MHg0MDAwPjsJLy8gTDEsIDE2SwotCQkJdGltZWJhc2UtZnJlcXVlbmN5ID0gPDA+OwkvLyBmcm9tIGJvb3Rsb2FkZXIKLQkJCWJ1cy1mcmVxdWVuY3kgPSA8MD47CQkvLyBmcm9tIGJvb3Rsb2FkZXIKLQkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsJCS8vIGZyb20gYm9vdGxvYWRlcgotCQl9OwotCX07Ci0KLQltZW1vcnkgewotCQlkZXZpY2VfdHlwZSA9ICJtZW1vcnkiOwotCQlyZWcgPSA8MHgwMDAwMDAwMCAweDA0MDAwMDAwPjsJLy8gNjRNQgotCX07CiAKIAlzb2M1MjAwQGYwMDAwMDAwIHsKLQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCSNzaXplLWNlbGxzID0gPDE+OwotCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1pbW1yIjsKLQkJcmFuZ2VzID0gPDAgMHhmMDAwMDAwMCAweDAwMDBjMDAwPjsKLQkJcmVnID0gPDB4ZjAwMDAwMDAgMHgwMDAwMDEwMD47Ci0JCWJ1cy1mcmVxdWVuY3kgPSA8MD47CQkvLyBmcm9tIGJvb3Rsb2FkZXIKLQkJc3lzdGVtLWZyZXF1ZW5jeSA9IDwwPjsJCS8vIGZyb20gYm9vdGxvYWRlcgotCi0JCWNkbUAyMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItY2RtIiwiZnNsLG1wYzUyMDAtY2RtIjsKLQkJCXJlZyA9IDwweDIwMCAweDM4PjsKLQkJfTsKLQotCQltcGM1MjAwX3BpYzogaW50ZXJydXB0LWNvbnRyb2xsZXJANTAwIHsKLQkJCS8vIDUyMDAgaW50ZXJydXB0cyBhcmUgZW5jb2RlZCBpbnRvIHR3byBsZXZlbHM7Ci0JCQlpbnRlcnJ1cHQtY29udHJvbGxlcjsKLQkJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8Mz47Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1waWMiLCJmc2wsbXBjNTIwMC1waWMiOwotCQkJcmVnID0gPDB4NTAwIDB4ODA+OwotCQl9OwotCiAJCWdwdDA6IHRpbWVyQDYwMCB7CS8vIEdlbmVyYWwgUHVycG9zZSBUaW1lciBpbiBHUElPIG1vZGUKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWdwdCIsImZzbCxtcGM1MjAwLWdwdCI7Ci0JCQlyZWcgPSA8MHg2MDAgMHgxMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDEgOSAwPjsKIAkJCWdwaW8tY29udHJvbGxlcjsKIAkJCSNncGlvLWNlbGxzID0gPDI+OwogCQl9OwogCiAJCWdwdDE6IHRpbWVyQDYxMCB7CS8vIEdlbmVyYWwgUHVycG9zZSBUaW1lciBpbiBHUElPIG1vZGUKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWdwdCIsImZzbCxtcGM1MjAwLWdwdCI7Ci0JCQlyZWcgPSA8MHg2MTAgMHgxMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDEgMTAgMD47CiAJCQlncGlvLWNvbnRyb2xsZXI7CiAJCQkjZ3Bpby1jZWxscyA9IDwyPjsKIAkJfTsKIAogCQlncHQyOiB0aW1lckA2MjAgewkvLyBHZW5lcmFsIFB1cnBvc2UgVGltZXIgaW4gR1BJTyBtb2RlCi0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1ncHQiLCJmc2wsbXBjNTIwMC1ncHQiOwotCQkJcmVnID0gPDB4NjIwIDB4MTA+OwotCQkJaW50ZXJydXB0cyA9IDwxIDExIDA+OwogCQkJZ3Bpby1jb250cm9sbGVyOwogCQkJI2dwaW8tY2VsbHMgPSA8Mj47CiAJCX07CkBAIC05NywxMTggKzQyLDg1IEBACiAJCX07CiAKIAkJZ3B0NDogdGltZXJANjQwIHsJLy8gR2VuZXJhbCBQdXJwb3NlIFRpbWVyIGluIEdQSU8gbW9kZQotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItZ3B0IiwiZnNsLG1wYzUyMDAtZ3B0IjsKLQkJCXJlZyA9IDwweDY0MCAweDEwPjsKLQkJCWludGVycnVwdHMgPSA8MSAxMyAwPjsKIAkJCWdwaW8tY29udHJvbGxlcjsKIAkJCSNncGlvLWNlbGxzID0gPDI+OwogCQl9OwogCiAJCWdwdDU6IHRpbWVyQDY1MCB7CS8vIEdlbmVyYWwgUHVycG9zZSBUaW1lciBpbiBHUElPIG1vZGUKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWdwdCIsImZzbCxtcGM1MjAwLWdwdCI7Ci0JCQlyZWcgPSA8MHg2NTAgMHgxMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDEgMTQgMD47CiAJCQlncGlvLWNvbnRyb2xsZXI7CiAJCQkjZ3Bpby1jZWxscyA9IDwyPjsKIAkJfTsKIAogCQlncHQ2OiB0aW1lckA2NjAgewkvLyBHZW5lcmFsIFB1cnBvc2UgVGltZXIgaW4gR1BJTyBtb2RlCi0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1ncHQiLCJmc2wsbXBjNTIwMC1ncHQiOwotCQkJcmVnID0gPDB4NjYwIDB4MTA+OwotCQkJaW50ZXJydXB0cyA9IDwxIDE1IDA+OwogCQkJZ3Bpby1jb250cm9sbGVyOwogCQkJI2dwaW8tY2VsbHMgPSA8Mj47CiAJCX07CiAKIAkJZ3B0NzogdGltZXJANjcwIHsJLy8gR2VuZXJhbCBQdXJwb3NlIFRpbWVyIGluIEdQSU8gbW9kZQotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItZ3B0IiwiZnNsLG1wYzUyMDAtZ3B0IjsKLQkJCXJlZyA9IDwweDY3MCAweDEwPjsKLQkJCWludGVycnVwdHMgPSA8MSAxNiAwPjsKIAkJCWdwaW8tY29udHJvbGxlcjsKIAkJCSNncGlvLWNlbGxzID0gPDI+OwogCQl9OwogCi0JCWdwaW9fc2ltcGxlOiBncGlvQGIwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1ncGlvIiwiZnNsLG1wYzUyMDAtZ3BpbyI7Ci0JCQlyZWcgPSA8MHhiMDAgMHg0MD47Ci0JCQlpbnRlcnJ1cHRzID0gPDEgNyAwPjsKLQkJCWdwaW8tY29udHJvbGxlcjsKLQkJCSNncGlvLWNlbGxzID0gPDI+OworCQlydGNAODAwIHsKKwkJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CiAJCX07CiAKLQkJZ3Bpb193a3VwOiBncGlvQGMwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1ncGlvLXdrdXAiLCJmc2wsbXBjNTIwMC1ncGlvLXdrdXAiOwotCQkJcmVnID0gPDB4YzAwIDB4NDA+OwotCQkJaW50ZXJydXB0cyA9IDwxIDggMCAwIDMgMD47Ci0JCQlncGlvLWNvbnRyb2xsZXI7Ci0JCQkjZ3Bpby1jZWxscyA9IDwyPjsKKwkJY2FuQDkwMCB7CisJCQlzdGF0dXMgPSAiZGlzYWJsZWQiOwogCQl9OwogCi0JCWRtYS1jb250cm9sbGVyQDEyMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItYmVzdGNvbW0iLCJmc2wsbXBjNTIwMC1iZXN0Y29tbSI7Ci0JCQlyZWcgPSA8MHgxMjAwIDB4ODA+OwotCQkJaW50ZXJydXB0cyA9IDwzIDAgMCAgMyAxIDAgIDMgMiAwICAzIDMgMAotCQkJICAgICAgICAgICAgICAzIDQgMCAgMyA1IDAgIDMgNiAwICAzIDcgMAotCQkJICAgICAgICAgICAgICAzIDggMCAgMyA5IDAgIDMgMTAgMCAgMyAxMSAwCi0JCQkgICAgICAgICAgICAgIDMgMTIgMCAgMyAxMyAwICAzIDE0IDAgIDMgMTUgMD47CisJCWNhbkA5ODAgeworCQkJc3RhdHVzID0gImRpc2FibGVkIjsKIAkJfTsKIAotCQl4bGJAMWYwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi14bGIiLCJmc2wsbXBjNTIwMC14bGIiOwotCQkJcmVnID0gPDB4MWYwMCAweDEwMD47CisJCXNwaUBmMDAgeworCQkJc3RhdHVzID0gImRpc2FibGVkIjsKIAkJfTsKIAotCQlzZXJpYWxAMjAwMCB7IC8qIFBTQzEgaW4gVUFSVCBtb2RlICovCisJCXVzYkAxMDAwIHsKKwkJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CisJCX07CisKKwkJcHNjQDIwMDAgewkvLyBQU0MxCiAJCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1wc2MtdWFydCIsImZzbCxtcGM1MjAwLXBzYy11YXJ0IjsKLQkJCXJlZyA9IDwweDIwMDAgMHgxMDA+OwotCQkJaW50ZXJydXB0cyA9IDwyIDEgMD47CiAJCX07CiAKLQkJc2VyaWFsQDIyMDAgeyAvKiBQU0MyIGluIFVBUlQgbW9kZSAqLworCQlwc2NAMjIwMCB7CS8vIFBTQzIKIAkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLXBzYy11YXJ0IiwiZnNsLG1wYzUyMDAtcHNjLXVhcnQiOwotCQkJcmVnID0gPDB4MjIwMCAweDEwMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDIgMiAwPjsKIAkJfTsKIAotCQlzZXJpYWxAMmMwMCB7CQkvKiBQU0M2IGluIFVBUlQgbW9kZSAqLworCQlwc2NAMjQwMCB7CS8vIFBTQzMKKwkJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CisJCX07CisKKwkJcHNjQDI2MDAgewkvLyBQU0M0CisJCQlzdGF0dXMgPSAiZGlzYWJsZWQiOworCQl9OworCisJCXBzY0AyODAwIHsJLy8gUFNDNQorCQkJc3RhdHVzID0gImRpc2FibGVkIjsKKwkJfTsKKworCQlwc2NAMmMwMCB7CS8vIFBTQzYKIAkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLXBzYy11YXJ0IiwiZnNsLG1wYzUyMDAtcHNjLXVhcnQiOwotCQkJcmVnID0gPDB4MmMwMCAweDEwMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDIgNCAwPjsKIAkJfTsKIAogCQlldGhlcm5ldEAzMDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWZlYyIsImZzbCxtcGM1MjAwLWZlYyI7Ci0JCQlyZWcgPSA8MHgzMDAwIDB4NDAwPjsKLQkJCWxvY2FsLW1hYy1hZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOwotCQkJaW50ZXJydXB0cyA9IDwyIDUgMD47CiAJCQlwaHktaGFuZGxlID0gPCZwaHkwPjsKIAkJfTsKIAogCQltZGlvQDMwMDAgewotCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCQkjc2l6ZS1jZWxscyA9IDwwPjsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLW1kaW8iLCJmc2wsbXBjNTIwMC1tZGlvIjsKLQkJCXJlZyA9IDwweDMwMDAgMHg0MDA+OwkvLyBmZWMgcmFuZ2UsIHNpbmNlIHdlIG5lZWQgdG8gc2V0dXAgZmVjIGludGVycnVwdHMKLQkJCWludGVycnVwdHMgPSA8MiA1IDA+OwkvLyB0aGVzZSBhcmUgZm9yICJtaWkgY29tbWFuZCBmaW5pc2hlZCIsIG5vdCBsaW5rIGNoYW5nZXMgJiBjby4KLQogCQkJcGh5MDogZXRoZXJuZXQtcGh5QDAgewogCQkJCWNvbXBhdGlibGUgPSAiaW50ZWwsbHh0OTcxIjsKIAkJCQlyZWcgPSA8MD47CiAJCQl9OwogCQl9OwogCi0JCWF0YUAzYTAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWF0YSIsImZzbCxtcGM1MjAwLWF0YSI7Ci0JCQlyZWcgPSA8MHgzYTAwIDB4MTAwPjsKLQkJCWludGVycnVwdHMgPSA8MiA3IDA+OworCQlpMmNAM2QwMCB7CisJCQlzdGF0dXMgPSAiZGlzYWJsZWQiOwogCQl9OwogCiAJCWkyY0AzZDQwIHsKLQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCQkJI3NpemUtY2VsbHMgPSA8MD47Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM1MjAwYi1pMmMiLCJmc2wsbXBjNTIwMC1pMmMiLCJmc2wtaTJjIjsKLQkJCXJlZyA9IDwweDNkNDAgMHg0MD47Ci0JCQlpbnRlcnJ1cHRzID0gPDIgMTYgMD47CiAJCQlmc2wscHJlc2VydmUtY2xvY2tpbmc7CiAJCQljbG9jay1mcmVxdWVuY3kgPSA8NDAwMDAwPjsKIApAQCAtMjIxLDE5ICsxMzMsMTMgQEAKIAkJCQlyZWcgPSA8MHg1MT47CiAJCQl9OwogCQl9OworCX07CiAKLQkJc3JhbUA4MDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLXNyYW0iLCJmc2wsbXBjNTIwMC1zcmFtIjsKLQkJCXJlZyA9IDwweDgwMDAgMHg0MDAwPjsKLQkJfTsKKwlwY2lAZjAwMDBkMDAgeworCQlzdGF0dXMgPSAiZGlzYWJsZWQiOwogCX07CiAKIAlsb2NhbGJ1cyB7Ci0JCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWxwYiIsImZzbCxtcGM1MjAwLWxwYiIsInNpbXBsZS1idXMiOwotCi0JCSNhZGRyZXNzLWNlbGxzID0gPDI+OwotCQkjc2l6ZS1jZWxscyA9IDwxPjsKLQogCQlyYW5nZXMgPSA8MCAwIDB4ZmY4MDAwMDAgMHgwMDgwMDAwMAogCQkJICAxIDAgMHg4MDAwMDAwMCAweDAwODAwMDAwCiAJCQkgIDMgMCAweDgwMDAwMDAwIDB4MDA4MDAwMDA+OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvNDB4L2tpbGF1ZWFfZGVmY29uZmlnIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvNDB4L2tpbGF1ZWFfZGVmY29uZmlnCmluZGV4IDRlMTllZTcuLjM0YjhjMWEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9jb25maWdzLzQweC9raWxhdWVhX2RlZmNvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvY29uZmlncy80MHgva2lsYXVlYV9kZWZjb25maWcKQEAgLTEyLDYgKzEyLDggQEAKIENPTkZJR19NT0RVTEVfVU5MT0FEPXkKICMgQ09ORklHX0JMS19ERVZfQlNHIGlzIG5vdCBzZXQKIENPTkZJR19LSUxBVUVBPXkKK0NPTkZJR19OT19IWj15CitDT05GSUdfSElHSF9SRVNfVElNRVJTPXkKICMgQ09ORklHX1dBTE5VVCBpcyBub3Qgc2V0CiBDT05GSUdfU1BBUlNFX0lSUT15CiBDT05GSUdfUENJPXkKQEAgLTQyLDYgKzQ0LDkgQEAKIENPTkZJR19NVERfTkFORD15CiBDT05GSUdfTVREX05BTkRfTkRGQz15CiBDT05GSUdfUFJPQ19ERVZJQ0VUUkVFPXkKK0NPTkZJR19QTT15CitDT05GSUdfU1VTUEVORD15CitDT05GSUdfUFBDNHh4X0NQTT15CiBDT05GSUdfQkxLX0RFVl9SQU09eQogQ09ORklHX0JMS19ERVZfUkFNX1NJWkU9MzUwMDAKICMgQ09ORklHX01JU0NfREVWSUNFUyBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY29uZmlncy80NHgvY2FueW9ubGFuZHNfZGVmY29uZmlnIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvNDR4L2NhbnlvbmxhbmRzX2RlZmNvbmZpZwppbmRleCA0NWM2NGQ4Li4xN2U0ZGQ5IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvY29uZmlncy80NHgvY2FueW9ubGFuZHNfZGVmY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9jb25maWdzLzQ0eC9jYW55b25sYW5kc19kZWZjb25maWcKQEAgLTQyLDYgKzQyLDkgQEAKIENPTkZJR19NVERfTkFORD15CiBDT05GSUdfTVREX05BTkRfTkRGQz15CiBDT05GSUdfUFJPQ19ERVZJQ0VUUkVFPXkKK0NPTkZJR19QTT15CitDT05GSUdfU1VTUEVORD15CitDT05GSUdfUFBDNHh4X0NQTT15CiBDT05GSUdfQkxLX0RFVl9SQU09eQogQ09ORklHX0JMS19ERVZfUkFNX1NJWkU9MzUwMDAKICMgQ09ORklHX01JU0NfREVWSUNFUyBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vYml0b3BzLmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vYml0b3BzLmgKaW5kZXggMzA5NjRhZS4uOGE3ZTkzMTQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9iaXRvcHMuaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vYml0b3BzLmgKQEAgLTI2Nyw3ICsyNjcsMTYgQEAKICNpbmNsdWRlIDxhc20tZ2VuZXJpYy9iaXRvcHMvZmxzNjQuaD4KICNlbmRpZiAvKiBfX3Bvd2VycGM2NF9fICovCiAKKyNpZmRlZiBDT05GSUdfUFBDNjQKK3Vuc2lnbmVkIGludCBfX2FyY2hfaHdlaWdodDgodW5zaWduZWQgaW50IHcpOwordW5zaWduZWQgaW50IF9fYXJjaF9od2VpZ2h0MTYodW5zaWduZWQgaW50IHcpOwordW5zaWduZWQgaW50IF9fYXJjaF9od2VpZ2h0MzIodW5zaWduZWQgaW50IHcpOwordW5zaWduZWQgbG9uZyBfX2FyY2hfaHdlaWdodDY0KF9fdTY0IHcpOworI2luY2x1ZGUgPGFzbS1nZW5lcmljL2JpdG9wcy9jb25zdF9od2VpZ2h0Lmg+CisjZWxzZQogI2luY2x1ZGUgPGFzbS1nZW5lcmljL2JpdG9wcy9od2VpZ2h0Lmg+CisjZW5kaWYKKwogI2luY2x1ZGUgPGFzbS1nZW5lcmljL2JpdG9wcy9maW5kLmg+CiAKIC8qIExpdHRsZS1lbmRpYW4gdmVyc2lvbnMgKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9jcHV0YWJsZS5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2NwdXRhYmxlLmgKaW5kZXggZjNhMWZkZC4uZjBhMjExZCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2NwdXRhYmxlLmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2NwdXRhYmxlLmgKQEAgLTE5OSw2ICsxOTksOCBAQAogI2RlZmluZSBDUFVfRlRSX1VOQUxJR05FRF9MRF9TVEQJTE9OR19BU01fQ09OU1QoMHgwMDgwMDAwMDAwMDAwMDAwKQogI2RlZmluZSBDUFVfRlRSX0FTWU1fU01UCQlMT05HX0FTTV9DT05TVCgweDAxMDAwMDAwMDAwMDAwMDApCiAjZGVmaW5lIENQVV9GVFJfU1RDWF9DSEVDS1NfQUREUkVTUwlMT05HX0FTTV9DT05TVCgweDAyMDAwMDAwMDAwMDAwMDApCisjZGVmaW5lIENQVV9GVFJfUE9QQ05UQgkJCUxPTkdfQVNNX0NPTlNUKDB4MDQwMDAwMDAwMDAwMDAwMCkKKyNkZWZpbmUgQ1BVX0ZUUl9QT1BDTlRECQkJTE9OR19BU01fQ09OU1QoMHgwODAwMDAwMDAwMDAwMDAwKQogCiAjaWZuZGVmIF9fQVNTRU1CTFlfXwogCkBAIC00MDMsMjEgKzQwNSwyMiBAQAogCSAgICBDUFVfRlRSX1BQQ0FTX0FSQ0hfVjIgfCBDUFVfRlRSX0NUUkwgfCBcCiAJICAgIENQVV9GVFJfTU1DUkEgfCBDUFVfRlRSX1NNVCB8IFwKIAkgICAgQ1BVX0ZUUl9DT0hFUkVOVF9JQ0FDSEUgfCBDUFVfRlRSX0xPQ0tMRVNTX1RMQklFIHwgXAotCSAgICBDUFVfRlRSX1BVUlIgfCBDUFVfRlRSX1NUQ1hfQ0hFQ0tTX0FERFJFU1MpCisJICAgIENQVV9GVFJfUFVSUiB8IENQVV9GVFJfU1RDWF9DSEVDS1NfQUREUkVTUyB8IFwKKwkgICAgQ1BVX0ZUUl9QT1BDTlRCKQogI2RlZmluZSBDUFVfRlRSU19QT1dFUjYgKENQVV9GVFJfVVNFX1RCIHwgQ1BVX0ZUUl9MV1NZTkMgfCBcCiAJICAgIENQVV9GVFJfUFBDQVNfQVJDSF9WMiB8IENQVV9GVFJfQ1RSTCB8IFwKIAkgICAgQ1BVX0ZUUl9NTUNSQSB8IENQVV9GVFJfU01UIHwgXAogCSAgICBDUFVfRlRSX0NPSEVSRU5UX0lDQUNIRSB8IENQVV9GVFJfTE9DS0xFU1NfVExCSUUgfCBcCiAJICAgIENQVV9GVFJfUFVSUiB8IENQVV9GVFJfU1BVUlIgfCBDUFVfRlRSX1JFQUxfTEUgfCBcCiAJICAgIENQVV9GVFJfRFNDUiB8IENQVV9GVFJfVU5BTElHTkVEX0xEX1NURCB8IFwKLQkgICAgQ1BVX0ZUUl9TVENYX0NIRUNLU19BRERSRVNTKQorCSAgICBDUFVfRlRSX1NUQ1hfQ0hFQ0tTX0FERFJFU1MgfCBDUFVfRlRSX1BPUENOVEIpCiAjZGVmaW5lIENQVV9GVFJTX1BPV0VSNyAoQ1BVX0ZUUl9VU0VfVEIgfCBDUFVfRlRSX0xXU1lOQyB8IFwKIAkgICAgQ1BVX0ZUUl9QUENBU19BUkNIX1YyIHwgQ1BVX0ZUUl9DVFJMIHwgXAogCSAgICBDUFVfRlRSX01NQ1JBIHwgQ1BVX0ZUUl9TTVQgfCBcCiAJICAgIENQVV9GVFJfQ09IRVJFTlRfSUNBQ0hFIHwgQ1BVX0ZUUl9MT0NLTEVTU19UTEJJRSB8IFwKIAkgICAgQ1BVX0ZUUl9QVVJSIHwgQ1BVX0ZUUl9TUFVSUiB8IENQVV9GVFJfUkVBTF9MRSB8IFwKIAkgICAgQ1BVX0ZUUl9EU0NSIHwgQ1BVX0ZUUl9TQU8gIHwgQ1BVX0ZUUl9BU1lNX1NNVCB8IFwKLQkgICAgQ1BVX0ZUUl9TVENYX0NIRUNLU19BRERSRVNTKQorCSAgICBDUFVfRlRSX1NUQ1hfQ0hFQ0tTX0FERFJFU1MgfCBDUFVfRlRSX1BPUENOVEIgfCBDUFVfRlRSX1BPUENOVEQpCiAjZGVmaW5lIENQVV9GVFJTX0NFTEwJKENQVV9GVFJfVVNFX1RCIHwgQ1BVX0ZUUl9MV1NZTkMgfCBcCiAJICAgIENQVV9GVFJfUFBDQVNfQVJDSF9WMiB8IENQVV9GVFJfQ1RSTCB8IFwKIAkgICAgQ1BVX0ZUUl9BTFRJVkVDX0NPTVAgfCBDUFVfRlRSX01NQ1JBIHwgQ1BVX0ZUUl9TTVQgfCBcCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vY3B1dGhyZWFkcy5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2NwdXRocmVhZHMuaAppbmRleCBhOGUxODQ0Li5mNzFiYjRjIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vY3B1dGhyZWFkcy5oCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9jcHV0aHJlYWRzLmgKQEAgLTYxLDIyICs2MSwyNSBAQAogCXJldHVybiBjcHVfdGhyZWFkX21hc2tfdG9fY29yZXMoY3B1X29ubGluZV9tYXApOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBjcHVfdGhyZWFkX3RvX2NvcmUoaW50IGNwdSkKLXsKLQlyZXR1cm4gY3B1ID4+IHRocmVhZHNfc2hpZnQ7Ci19CisjaWZkZWYgQ09ORklHX1NNUAoraW50IGNwdV9jb3JlX2luZGV4X29mX3RocmVhZChpbnQgY3B1KTsKK2ludCBjcHVfZmlyc3RfdGhyZWFkX29mX2NvcmUoaW50IGNvcmUpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgaW50IGNwdV9jb3JlX2luZGV4X29mX3RocmVhZChpbnQgY3B1KSB7IHJldHVybiBjcHU7IH0KK3N0YXRpYyBpbmxpbmUgaW50IGNwdV9maXJzdF90aHJlYWRfb2ZfY29yZShpbnQgY29yZSkgeyByZXR1cm4gY29yZTsgfQorI2VuZGlmCiAKIHN0YXRpYyBpbmxpbmUgaW50IGNwdV90aHJlYWRfaW5fY29yZShpbnQgY3B1KQogewogCXJldHVybiBjcHUgJiAodGhyZWFkc19wZXJfY29yZSAtIDEpOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBjcHVfZmlyc3RfdGhyZWFkX2luX2NvcmUoaW50IGNwdSkKK3N0YXRpYyBpbmxpbmUgaW50IGNwdV9maXJzdF90aHJlYWRfc2libGluZyhpbnQgY3B1KQogewogCXJldHVybiBjcHUgJiB+KHRocmVhZHNfcGVyX2NvcmUgLSAxKTsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgY3B1X2xhc3RfdGhyZWFkX2luX2NvcmUoaW50IGNwdSkKK3N0YXRpYyBpbmxpbmUgaW50IGNwdV9sYXN0X3RocmVhZF9zaWJsaW5nKGludCBjcHUpCiB7CiAJcmV0dXJuIGNwdSB8ICh0aHJlYWRzX3Blcl9jb3JlIC0gMSk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vZGV2aWNlLmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vZGV2aWNlLmgKaW5kZXggYTM5NTRlNC4uMTZkMjVjMCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2RldmljZS5oCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9kZXZpY2UuaApAQCAtOSw2ICs5LDEyIEBACiBzdHJ1Y3QgZG1hX21hcF9vcHM7CiBzdHJ1Y3QgZGV2aWNlX25vZGU7CiAKKy8qCisgKiBBcmNoIGV4dGVuc2lvbnMgdG8gc3RydWN0IGRldmljZS4KKyAqCisgKiBXaGVuIGFkZGluZyBmaWVsZHMsIGNvbnNpZGVyIG1hY2lvX2FkZF9vbmVfZGV2aWNlIGluCisgKiBkcml2ZXJzL21hY2ludG9zaC9tYWNpb19hc2ljLmMKKyAqLwogc3RydWN0IGRldl9hcmNoZGF0YSB7CiAJLyogRE1BIG9wZXJhdGlvbnMgb24gdGhhdCBkZXZpY2UgKi8KIAlzdHJ1Y3QgZG1hX21hcF9vcHMJKmRtYV9vcHM7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vZmlybXdhcmUuaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9maXJtd2FyZS5oCmluZGV4IDIwNzc4YTQuLjRlZjY2MmUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9maXJtd2FyZS5oCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9maXJtd2FyZS5oCkBAIC00Niw2ICs0Niw3IEBACiAjZGVmaW5lIEZXX0ZFQVRVUkVfUFMzX0xWMQlBU01fQ09OU1QoMHgwMDAwMDAwMDAwODAwMDAwKQogI2RlZmluZSBGV19GRUFUVVJFX0JFQVQJCUFTTV9DT05TVCgweDAwMDAwMDAwMDEwMDAwMDApCiAjZGVmaW5lIEZXX0ZFQVRVUkVfQ01PCQlBU01fQ09OU1QoMHgwMDAwMDAwMDAyMDAwMDAwKQorI2RlZmluZSBGV19GRUFUVVJFX1ZQSE4JCUFTTV9DT05TVCgweDAwMDAwMDAwMDQwMDAwMDApCiAKICNpZm5kZWYgX19BU1NFTUJMWV9fCiAKQEAgLTU5LDcgKzYwLDcgQEAKIAkJRldfRkVBVFVSRV9WSU8gfCBGV19GRUFUVVJFX1JETUEgfCBGV19GRUFUVVJFX0xMQU4gfAogCQlGV19GRUFUVVJFX0JVTEtfUkVNT1ZFIHwgRldfRkVBVFVSRV9YREFCUiB8CiAJCUZXX0ZFQVRVUkVfTVVMVElUQ0UgfCBGV19GRUFUVVJFX1NQTFBBUiB8IEZXX0ZFQVRVUkVfTFBBUiB8Ci0JCUZXX0ZFQVRVUkVfQ01PLAorCQlGV19GRUFUVVJFX0NNTyB8IEZXX0ZFQVRVUkVfVlBITiwKIAlGV19GRUFUVVJFX1BTRVJJRVNfQUxXQVlTID0gMCwKIAlGV19GRUFUVVJFX0lTRVJJRVNfUE9TU0lCTEUgPSBGV19GRUFUVVJFX0lTRVJJRVMgfCBGV19GRUFUVVJFX0xQQVIsCiAJRldfRkVBVFVSRV9JU0VSSUVTX0FMV0FZUyA9IEZXX0ZFQVRVUkVfSVNFUklFUyB8IEZXX0ZFQVRVUkVfTFBBUiwKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9odmNhbGwuaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9odmNhbGwuaAppbmRleCBkZTAzY2E1Li5lYzA4OWFjIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vaHZjYWxsLmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2h2Y2FsbC5oCkBAIC0yMzIsNyArMjMyLDkgQEAKICNkZWZpbmUgSF9HRVRfRU1fUEFSTVMJCTB4MkI4CiAjZGVmaW5lIEhfU0VUX01QUAkJMHgyRDAKICNkZWZpbmUgSF9HRVRfTVBQCQkweDJENAotI2RlZmluZSBNQVhfSENBTExfT1BDT0RFCUhfR0VUX01QUAorI2RlZmluZSBIX0hPTUVfTk9ERV9BU1NPQ0lBVElWSVRZIDB4MkVDCisjZGVmaW5lIEhfQkVTVF9FTkVSR1kJCTB4MkY0CisjZGVmaW5lIE1BWF9IQ0FMTF9PUENPREUJSF9CRVNUX0VORVJHWQogCiAjaWZuZGVmIF9fQVNTRU1CTFlfXwogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vbHBwYWNhLmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vbHBwYWNhLmgKaW5kZXggN2Y1ZTBmZS4uMzgwZDQ4YiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2xwcGFjYS5oCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9scHBhY2EuaApAQCAtNjIsNyArNjIsMTAgQEAKIAl2b2xhdGlsZSB1MzIgZHluX3BpcjsJCS8vIER5bmFtaWMgUHJvY0lkUmVnIHZhbHVlCXgyMC14MjMKIAl1MzIJZHNlaV9kYXRhOyAgICAgICAgICAgCS8vIERTRUkgZGF0YSAgICAgICAgICAgICAgICAgIAl4MjQteDI3CiAJdTY0CXNwcmczOyAgICAgICAgICAgICAgIAkvLyBTUFJHMyB2YWx1ZSAgICAgICAgICAgICAgICAJeDI4LXgyRgotCXU4CXJlc2VydmVkM1s4MF07CQkvLyBSZXNlcnZlZAkJCXgzMC14N0YKKwl1OAlyZXNlcnZlZDNbNDBdOwkJLy8gUmVzZXJ2ZWQJCQl4MzAteDU3CisJdm9sYXRpbGUgdTggdnBobl9hc3NvY19jb3VudHNbOF07IC8vIFZpcnR1YWwgcHJvY2Vzc29yIGhvbWUgbm9kZQorCQkJCQkvLyBhc3NvY2lhdGl2aXR5IGNoYW5nZSBjb3VudGVycyB4NTgteDVGCisJdTgJcmVzZXJ2ZWQ0WzMyXTsJCS8vIFJlc2VydmVkCQkJeDYwLXg3RgogCiAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAvLyBDQUNIRV9MSU5FXzIgMHgwMDgwIC0gMHgwMEZGIENvbnRhaW5zIGxvY2FsIHJlYWQtd3JpdGUgZGF0YQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL21hY2hkZXAuaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9tYWNoZGVwLmgKaW5kZXggZDA0NWIwMS4uODQzM2QzNiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL21hY2hkZXAuaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vbWFjaGRlcC5oCkBAIC0yNyw5ICsyNyw3IEBACiBzdHJ1Y3QgcnRjX3RpbWU7CiBzdHJ1Y3QgZmlsZTsKIHN0cnVjdCBwY2lfY29udHJvbGxlcjsKLSNpZmRlZiBDT05GSUdfS0VYRUMKIHN0cnVjdCBraW1hZ2U7Ci0jZW5kaWYKIAogI2lmZGVmIENPTkZJR19TTVAKIHN0cnVjdCBzbXBfb3BzX3QgewpAQCAtNzIsNyArNzAsNyBAQAogCQkJCQkgICAgIGludCBwc2l6ZSwgaW50IHNzaXplKTsKIAl2b2lkCQkoKmZsdXNoX2hhc2hfcmFuZ2UpKHVuc2lnbmVkIGxvbmcgbnVtYmVyLCBpbnQgbG9jYWwpOwogCi0JLyogc3BlY2lhbCBmb3Iga2V4ZWMsIHRvIGJlIGNhbGxlZCBpbiByZWFsIG1vZGUsIGxpbmFyIG1hcHBpbmcgaXMKKwkvKiBzcGVjaWFsIGZvciBrZXhlYywgdG8gYmUgY2FsbGVkIGluIHJlYWwgbW9kZSwgbGluZWFyIG1hcHBpbmcgaXMKIAkgKiBkZXN0cm95ZWQgYXMgd2VsbCAqLwogCXZvaWQJCSgqaHB0ZV9jbGVhcl9hbGwpKHZvaWQpOwogCkBAIC0zMjQsOCArMzIyLDYgQEAKIAogI2VuZGlmIC8qIENPTkZJR19QUENfUE1BQyAqLwogCi1leHRlcm4gdm9pZCBzZXR1cF9wY2lfcHRycyh2b2lkKTsKLQogI2lmZGVmIENPTkZJR19TTVAKIC8qIFBvb3IgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbnMgKi8KIGV4dGVybiB2b2lkIF9fZGV2aW5pdCBzbXBfZ2VuZXJpY19naXZlX3RpbWViYXNlKHZvaWQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL21tem9uZS5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL21tem9uZS5oCmluZGV4IGFhYzg3Y2IuLmZkM2ZkNTggMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9tbXpvbmUuaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vbW16b25lLmgKQEAgLTMzLDYgKzMzLDkgQEAKIGV4dGVybiBjcHVtYXNrX3Zhcl90IG5vZGVfdG9fY3B1bWFza19tYXBbXTsKICNpZmRlZiBDT05GSUdfTUVNT1JZX0hPVFBMVUcKIGV4dGVybiB1bnNpZ25lZCBsb25nIG1heF9wZm47Cit1NjQgbWVtb3J5X2hvdHBsdWdfbWF4KHZvaWQpOworI2Vsc2UKKyNkZWZpbmUgbWVtb3J5X2hvdHBsdWdfbWF4KCkgbWVtYmxvY2tfZW5kX29mX0RSQU0oKQogI2VuZGlmCiAKIC8qCkBAIC00Miw2ICs0NSw4IEBACiAjZGVmaW5lIG5vZGVfc3RhcnRfcGZuKG5pZCkJKE5PREVfREFUQShuaWQpLT5ub2RlX3N0YXJ0X3BmbikKICNkZWZpbmUgbm9kZV9lbmRfcGZuKG5pZCkJKE5PREVfREFUQShuaWQpLT5ub2RlX2VuZF9wZm4pCiAKKyNlbHNlCisjZGVmaW5lIG1lbW9yeV9ob3RwbHVnX21heCgpIG1lbWJsb2NrX2VuZF9vZl9EUkFNKCkKICNlbmRpZiAvKiBDT05GSUdfTkVFRF9NVUxUSVBMRV9OT0RFUyAqLwogCiAjZW5kaWYgLyogX19LRVJORUxfXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL252cmFtLmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vbnZyYW0uaAppbmRleCA4NTBiNzJmLi45MmVmZTY3IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vbnZyYW0uaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vbnZyYW0uaApAQCAtMTAsMzEgKzEwLDcgQEAKICNpZm5kZWYgX0FTTV9QT1dFUlBDX05WUkFNX0gKICNkZWZpbmUgX0FTTV9QT1dFUlBDX05WUkFNX0gKIAotI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+Ci0KLSNkZWZpbmUgTlZSV19DTlQgMHgyMAotI2RlZmluZSBOVlJBTV9IRUFERVJfTEVOIDE2IC8qIHNpemVvZihzdHJ1Y3QgbnZyYW1faGVhZGVyKSAqLwotI2RlZmluZSBOVlJBTV9CTE9DS19MRU4gMTYKLSNkZWZpbmUgTlZSQU1fTUFYX1JFUSAoMjA4MC9OVlJBTV9CTE9DS19MRU4pCi0jZGVmaW5lIE5WUkFNX01JTl9SRVEgKDEwNTYvTlZSQU1fQkxPQ0tfTEVOKQotCi0jZGVmaW5lIE5WUkFNX0FTMCAgMHg3NAotI2RlZmluZSBOVlJBTV9BUzEgIDB4NzUKLSNkZWZpbmUgTlZSQU1fREFUQSAweDc3Ci0KLQotLyogUlRDIE9mZnNldHMgKi8KLQotI2RlZmluZSBNT1RPX1JUQ19TRUNPTkRTCTB4MUZGOQotI2RlZmluZSBNT1RPX1JUQ19NSU5VVEVTCTB4MUZGQQotI2RlZmluZSBNT1RPX1JUQ19IT1VSUwkJMHgxRkZCCi0jZGVmaW5lIE1PVE9fUlRDX0RBWV9PRl9XRUVLCTB4MUZGQwotI2RlZmluZSBNT1RPX1JUQ19EQVlfT0ZfTU9OVEgJMHgxRkZECi0jZGVmaW5lIE1PVE9fUlRDX01PTlRICQkweDFGRkUKLSNkZWZpbmUgTU9UT19SVENfWUVBUgkJMHgxRkZGCi0jZGVmaW5lIE1PVE9fUlRDX0NPTlRST0xBICAgICAgIDB4MUZGOAotI2RlZmluZSBNT1RPX1JUQ19DT05UUk9MQiAgICAgICAweDFGRjkKLQorLyogU2lnbmF0dXJlcyBmb3IgbnZyYW0gcGFydGl0aW9ucyAqLwogI2RlZmluZSBOVlJBTV9TSUdfU1AJMHgwMgkvKiBzdXBwb3J0IHByb2Nlc3NvciAqLwogI2RlZmluZSBOVlJBTV9TSUdfT0YJMHg1MAkvKiBvcGVuIGZpcm13YXJlIGNvbmZpZyAqLwogI2RlZmluZSBOVlJBTV9TSUdfRlcJMHg1MQkvKiBnZW5lcmFsIGZpcm13YXJlICovCkBAIC00OSwzMiArMjUsMTkgQEAKICNkZWZpbmUgTlZSQU1fU0lHX09TCTB4YTAJLyogT1MgZGVmaW5lZCAqLwogI2RlZmluZSBOVlJBTV9TSUdfUEFOSUMJMHhhMQkvKiBBcHBsZSBPU1ggInBhbmljIiAqLwogCi0vKiBJZiBjaGFuZ2UgdGhpcyBzaXplLCB0aGVuIGNoYW5nZSB0aGUgc2l6ZSBvZiBOVk5BTUVfTEVOICovCi1zdHJ1Y3QgbnZyYW1faGVhZGVyIHsKLQl1bnNpZ25lZCBjaGFyIHNpZ25hdHVyZTsKLQl1bnNpZ25lZCBjaGFyIGNoZWNrc3VtOwotCXVuc2lnbmVkIHNob3J0IGxlbmd0aDsKLQljaGFyIG5hbWVbMTJdOwotfTsKLQogI2lmZGVmIF9fS0VSTkVMX18KIAorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogCi1zdHJ1Y3QgbnZyYW1fcGFydGl0aW9uIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkIHBhcnRpdGlvbjsKLQlzdHJ1Y3QgbnZyYW1faGVhZGVyIGhlYWRlcjsKLQl1bnNpZ25lZCBpbnQgaW5kZXg7Ci19OwotCi0KKyNpZmRlZiBDT05GSUdfUFBDX1BTRVJJRVMKIGV4dGVybiBpbnQgbnZyYW1fd3JpdGVfZXJyb3JfbG9nKGNoYXIgKiBidWZmLCBpbnQgbGVuZ3RoLAogCQkJCQkgdW5zaWduZWQgaW50IGVycl90eXBlLCB1bnNpZ25lZCBpbnQgZXJyX3NlcSk7CiBleHRlcm4gaW50IG52cmFtX3JlYWRfZXJyb3JfbG9nKGNoYXIgKiBidWZmLCBpbnQgbGVuZ3RoLAogCQkJCQkgdW5zaWduZWQgaW50ICogZXJyX3R5cGUsIHVuc2lnbmVkIGludCAqZXJyX3NlcSk7CiBleHRlcm4gaW50IG52cmFtX2NsZWFyX2Vycm9yX2xvZyh2b2lkKTsKLQogZXh0ZXJuIGludCBwU2VyaWVzX252cmFtX2luaXQodm9pZCk7CisjZW5kaWYgLyogQ09ORklHX1BQQ19QU0VSSUVTICovCiAKICNpZmRlZiBDT05GSUdfTU1JT19OVlJBTQogZXh0ZXJuIGludCBtbWlvX252cmFtX2luaXQodm9pZCk7CkBAIC04NSw2ICs0OCwxMyBAQAogfQogI2VuZGlmCiAKK2V4dGVybiBpbnQgX19pbml0IG52cmFtX3NjYW5fcGFydGl0aW9ucyh2b2lkKTsKK2V4dGVybiBsb2ZmX3QgbnZyYW1fY3JlYXRlX3BhcnRpdGlvbihjb25zdCBjaGFyICpuYW1lLCBpbnQgc2lnLAorCQkJCSAgICAgaW50IHJlcV9zaXplLCBpbnQgbWluX3NpemUpOworZXh0ZXJuIGludCBudnJhbV9yZW1vdmVfcGFydGl0aW9uKGNvbnN0IGNoYXIgKm5hbWUsIGludCBzaWcpOworZXh0ZXJuIGludCBudnJhbV9nZXRfcGFydGl0aW9uX3NpemUobG9mZl90IGRhdGFfaW5kZXgpOworZXh0ZXJuIGxvZmZfdCBudnJhbV9maW5kX3BhcnRpdGlvbihjb25zdCBjaGFyICpuYW1lLCBpbnQgc2lnLCBpbnQgKm91dF9zaXplKTsKKwogI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KIAogLyogUG93ZXJNYWMgc3BlY2lmaWMgbnZyYW0gc3R1ZmZzICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcHBjLW9wY29kZS5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3BwYy1vcGNvZGUuaAppbmRleCA0M2FkYzhiLi4xMjU1NTY5IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcHBjLW9wY29kZS5oCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9wcGMtb3Bjb2RlLmgKQEAgLTM2LDYgKzM2LDggQEAKICNkZWZpbmUgUFBDX0lOU1RfTk9QCQkJMHg2MDAwMDAwMAogI2RlZmluZSBQUENfSU5TVF9QT1BDTlRCCQkweDdjMDAwMGY0CiAjZGVmaW5lIFBQQ19JTlNUX1BPUENOVEJfTUFTSwkJMHhmYzAwMDdmZQorI2RlZmluZSBQUENfSU5TVF9QT1BDTlRECQkweDdjMDAwM2Y0CisjZGVmaW5lIFBQQ19JTlNUX1BPUENOVFcJCTB4N2MwMDAyZjQKICNkZWZpbmUgUFBDX0lOU1RfUkZDSQkJCTB4NGMwMDAwNjYKICNkZWZpbmUgUFBDX0lOU1RfUkZESQkJCTB4NGMwMDAwNGUKICNkZWZpbmUgUFBDX0lOU1RfUkZNQ0kJCQkweDRjMDAwMDRjCkBAIC04OCw2ICs5MCwxMiBAQAogCQkJCQlfX1BQQ19SQihiKSB8IF9fUFBDX0VIKGVoKSkKICNkZWZpbmUgUFBDX01TR1NORChiKQkJc3RyaW5naWZ5X2luX2MoLmxvbmcgUFBDX0lOU1RfTVNHU05EIHwgXAogCQkJCQlfX1BQQ19SQihiKSkKKyNkZWZpbmUgUFBDX1BPUENOVEIoYSwgcykJc3RyaW5naWZ5X2luX2MoLmxvbmcgUFBDX0lOU1RfUE9QQ05UQiB8IFwKKwkJCQkJX19QUENfUkEoYSkgfCBfX1BQQ19SUyhzKSkKKyNkZWZpbmUgUFBDX1BPUENOVEQoYSwgcykJc3RyaW5naWZ5X2luX2MoLmxvbmcgUFBDX0lOU1RfUE9QQ05URCB8IFwKKwkJCQkJX19QUENfUkEoYSkgfCBfX1BQQ19SUyhzKSkKKyNkZWZpbmUgUFBDX1BPUENOVFcoYSwgcykJc3RyaW5naWZ5X2luX2MoLmxvbmcgUFBDX0lOU1RfUE9QQ05UVyB8IFwKKwkJCQkJX19QUENfUkEoYSkgfCBfX1BQQ19SUyhzKSkKICNkZWZpbmUgUFBDX1JGQ0kJCXN0cmluZ2lmeV9pbl9jKC5sb25nIFBQQ19JTlNUX1JGQ0kpCiAjZGVmaW5lIFBQQ19SRkRJCQlzdHJpbmdpZnlfaW5fYygubG9uZyBQUENfSU5TVF9SRkRJKQogI2RlZmluZSBQUENfUkZNQ0kJCXN0cmluZ2lmeV9pbl9jKC5sb25nIFBQQ19JTlNUX1JGTUNJKQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3Byb2Nlc3Nvci5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3Byb2Nlc3Nvci5oCmluZGV4IDRjMTQxODcuLmRlMTk2N2EgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9wcm9jZXNzb3IuaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcHJvY2Vzc29yLmgKQEAgLTEyMiw3ICsxMjIsNiBAQAogCQlUQVNLX1VOTUFQUEVEX0JBU0VfVVNFUjMyIDogVEFTS19VTk1BUFBFRF9CQVNFX1VTRVI2NCApCiAjZW5kaWYKIAotI2lmZGVmIF9fS0VSTkVMX18KICNpZmRlZiBfX3Bvd2VycGM2NF9fCiAKICNkZWZpbmUgU1RBQ0tfVE9QX1VTRVI2NCBUQVNLX1NJWkVfVVNFUjY0CkBAIC0xMzksNyArMTM4LDYgQEAKICNkZWZpbmUgU1RBQ0tfVE9QX01BWAlTVEFDS19UT1AKIAogI2VuZGlmIC8qIF9fcG93ZXJwYzY0X18gKi8KLSNlbmRpZiAvKiBfX0tFUk5FTF9fICovCiAKIHR5cGVkZWYgc3RydWN0IHsKIAl1bnNpZ25lZCBsb25nIHNlZzsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9wcm9tLmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcHJvbS5oCmluZGV4IGFlMjZmMmUuLmQ3Mjc1NzUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9wcm9tLmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3Byb20uaApAQCAtNDIsNyArNDIsNyBAQAogCiAvKiBUcmFuc2xhdGUgYSBETUEgYWRkcmVzcyBmcm9tIGRldmljZSBzcGFjZSB0byBDUFUgc3BhY2UgKi8KIGV4dGVybiB1NjQgb2ZfdHJhbnNsYXRlX2RtYV9hZGRyZXNzKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZGV2LAotCQkJCSAgICBjb25zdCB1MzIgKmluX2FkZHIpOworCQkJCSAgICBjb25zdCBfX2JlMzIgKmluX2FkZHIpOwogCiAjaWZkZWYgQ09ORklHX1BDSQogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgcGNpX2FkZHJlc3NfdG9fcGlvKHBoeXNfYWRkcl90IGFkZHJlc3MpOwpAQCAtNjMsOSArNjMsNiBAQAogLyogY2FjaGUgbG9va3VwICovCiBzdHJ1Y3QgZGV2aWNlX25vZGUgKm9mX2ZpbmRfbmV4dF9jYWNoZV9ub2RlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApOwogCi0vKiBHZXQgdGhlIE1BQyBhZGRyZXNzICovCi1leHRlcm4gY29uc3Qgdm9pZCAqb2ZfZ2V0X21hY19hZGRyZXNzKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApOwotCiAjaWZkZWYgQ09ORklHX05VTUEKIGV4dGVybiBpbnQgb2Zfbm9kZV90b19uaWQoc3RydWN0IGRldmljZV9ub2RlICpkZXZpY2UpOwogI2Vsc2UKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS90b3BvbG9neS5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3RvcG9sb2d5LmgKaW5kZXggYWZlNGFhYS4uN2VmMGQ5MCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3RvcG9sb2d5LmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3RvcG9sb2d5LmgKQEAgLTEwNiw5ICsxMDYsMjIgQEAKIAkJCQkJCWludCBuaWQpCiB7CiB9Ci0KICNlbmRpZiAvKiBDT05GSUdfTlVNQSAqLwogCisjaWYgZGVmaW5lZChDT05GSUdfTlVNQSkgJiYgZGVmaW5lZChDT05GSUdfUFBDX1NQTFBBUikKK2V4dGVybiBpbnQgc3RhcnRfdG9wb2xvZ3lfdXBkYXRlKHZvaWQpOworZXh0ZXJuIGludCBzdG9wX3RvcG9sb2d5X3VwZGF0ZSh2b2lkKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIGludCBzdGFydF90b3BvbG9neV91cGRhdGUodm9pZCkKK3sKKwlyZXR1cm4gMDsKK30KK3N0YXRpYyBpbmxpbmUgaW50IHN0b3BfdG9wb2xvZ3lfdXBkYXRlKHZvaWQpCit7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYgLyogQ09ORklHX05VTUEgJiYgQ09ORklHX1BQQ19TUExQQVIgKi8KKwogI2luY2x1ZGUgPGFzbS1nZW5lcmljL3RvcG9sb2d5Lmg+CiAKICNpZmRlZiBDT05GSUdfU01QCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vdmRzb19kYXRhcGFnZS5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3Zkc29fZGF0YXBhZ2UuaAppbmRleCAwODY3OWM1Li4yNWUzOTIyIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vdmRzb19kYXRhcGFnZS5oCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS92ZHNvX2RhdGFwYWdlLmgKQEAgLTExNiw5ICsxMTYsNyBAQAogCiAjZW5kaWYgLyogQ09ORklHX1BQQzY0ICovCiAKLSNpZmRlZiBfX0tFUk5FTF9fCiBleHRlcm4gc3RydWN0IHZkc29fZGF0YSAqdmRzb19kYXRhOwotI2VuZGlmCiAKICNlbmRpZiAvKiBfX0FTU0VNQkxZX18gKi8KIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9NYWtlZmlsZSBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvTWFrZWZpbGUKaW5kZXggMzZjMzBmMy4uM2JiMmEzZSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9NYWtlZmlsZQorKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL01ha2VmaWxlCkBAIC0yOSw4ICsyOSwxMCBAQAogb2JqLXkJCQkJOj0gY3B1dGFibGUubyBwdHJhY2UubyBzeXNjYWxscy5vIFwKIAkJCQkgICBpcnEubyBhbGlnbi5vIHNpZ25hbF8zMi5vIHBtYy5vIHZkc28ubyBcCiAJCQkJICAgaW5pdF90YXNrLm8gcHJvY2Vzcy5vIHN5c3RibC5vIGlkbGUubyBcCi0JCQkJICAgc2lnbmFsLm8gc3lzZnMubyBjYWNoZWluZm8ubwotb2JqLXkJCQkJKz0gdmRzbzMyLworCQkJCSAgIHNpZ25hbC5vIHN5c2ZzLm8gY2FjaGVpbmZvLm8gdGltZS5vIFwKKwkJCQkgICBwcm9tLm8gdHJhcHMubyBzZXR1cC1jb21tb24ubyBcCisJCQkJICAgdWRiZy5vIG1pc2MubyBpby5vIGRtYS5vIFwKKwkJCQkgICBtaXNjXyQoQ09ORklHX1dPUkRfU0laRSkubyB2ZHNvMzIvCiBvYmotJChDT05GSUdfUFBDNjQpCQkrPSBzZXR1cF82NC5vIHN5c19wcGMzMi5vIFwKIAkJCQkgICBzaWduYWxfNjQubyBwdHJhY2UzMi5vIFwKIAkJCQkgICBwYWNhLm8gbnZyYW1fNjQubyBmaXJtd2FyZS5vCkBAIC04MCw5ICs4Miw2IEBACiBleHRyYS0kKENPTkZJR184eHgpCQk6PSBoZWFkXzh4eC5vCiBleHRyYS15CQkJCSs9IHZtbGludXgubGRzCiAKLW9iai15CQkJCSs9IHRpbWUubyBwcm9tLm8gdHJhcHMubyBzZXR1cC1jb21tb24ubyBcCi0JCQkJICAgdWRiZy5vIG1pc2MubyBpby5vIGRtYS5vIFwKLQkJCQkgICBtaXNjXyQoQ09ORklHX1dPUkRfU0laRSkubwogb2JqLSQoQ09ORklHX1BQQzMyKQkJKz0gZW50cnlfMzIubyBzZXR1cF8zMi5vCiBvYmotJChDT05GSUdfUFBDNjQpCQkrPSBkbWEtaW9tbXUubyBpb21tdS5vCiBvYmotJChDT05GSUdfS0dEQikJCSs9IGtnZGIubwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9hc20tb2Zmc2V0cy5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9hc20tb2Zmc2V0cy5jCmluZGV4IGJkMGRmMmUuLjIzZTZhOTMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvYXNtLW9mZnNldHMuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL2FzbS1vZmZzZXRzLmMKQEAgLTIwOSw3ICsyMDksNiBAQAogCURFRklORShSVEFTRU5UUlksIG9mZnNldG9mKHN0cnVjdCBydGFzX3QsIGVudHJ5KSk7CiAKIAkvKiBJbnRlcnJ1cHQgcmVnaXN0ZXIgZnJhbWUgKi8KLQlERUZJTkUoU1RBQ0tfRlJBTUVfT1ZFUkhFQUQsIFNUQUNLX0ZSQU1FX09WRVJIRUFEKTsKIAlERUZJTkUoSU5UX0ZSQU1FX1NJWkUsIFNUQUNLX0lOVF9GUkFNRV9TSVpFKTsKIAlERUZJTkUoU1dJVENIX0ZSQU1FX1NJWkUsIFNUQUNLX0ZSQU1FX09WRVJIRUFEICsgc2l6ZW9mKHN0cnVjdCBwdF9yZWdzKSk7CiAjaWZkZWYgQ09ORklHX1BQQzY0CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL2NwdXRhYmxlLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL2NwdXRhYmxlLmMKaW5kZXggOTZhOTA4Zi4uYmU1YWIxOCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9jcHV0YWJsZS5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvY3B1dGFibGUuYwpAQCAtNDU3LDE2ICs0NTcsMjYgQEAKIAkJLmRjYWNoZV9ic2l6ZQkJPSAxMjgsCiAJCS5udW1fcG1jcwkJPSA2LAogCQkucG1jX3R5cGUJCT0gUFBDX1BNQ19JQk0sCi0JCS5jcHVfc2V0dXAJCT0gX19zZXR1cF9jcHVfcG93ZXI3LAotCQkuY3B1X3Jlc3RvcmUJCT0gX19yZXN0b3JlX2NwdV9wb3dlcjcsCiAJCS5vcHJvZmlsZV9jcHVfdHlwZQk9ICJwcGM2NC9wb3dlcjciLAogCQkub3Byb2ZpbGVfdHlwZQkJPSBQUENfT1BST0ZJTEVfUE9XRVI0LAotCQkub3Byb2ZpbGVfbW1jcmFfc2lodgk9IFBPV0VSNl9NTUNSQV9TSUhWLAotCQkub3Byb2ZpbGVfbW1jcmFfc2lwcgk9IFBPV0VSNl9NTUNSQV9TSVBSLAotCQkub3Byb2ZpbGVfbW1jcmFfY2xlYXIJPSBQT1dFUjZfTU1DUkFfVEhSTSB8Ci0JCQlQT1dFUjZfTU1DUkFfT1RIRVIsCiAJCS5wbGF0Zm9ybQkJPSAicG93ZXI3IiwKIAl9LAorCXsJLyogUG93ZXI3KyAqLworCQkucHZyX21hc2sJCT0gMHhmZmZmMDAwMCwKKwkJLnB2cl92YWx1ZQkJPSAweDAwNEEwMDAwLAorCQkuY3B1X25hbWUJCT0gIlBPV0VSNysgKHJhdykiLAorCQkuY3B1X2ZlYXR1cmVzCQk9IENQVV9GVFJTX1BPV0VSNywKKwkJLmNwdV91c2VyX2ZlYXR1cmVzCT0gQ09NTU9OX1VTRVJfUE9XRVI3LAorCQkubW11X2ZlYXR1cmVzCQk9IE1NVV9GVFJfSFBURV9UQUJMRSB8CisJCQlNTVVfRlRSX1RMQklFXzIwNiwKKwkJLmljYWNoZV9ic2l6ZQkJPSAxMjgsCisJCS5kY2FjaGVfYnNpemUJCT0gMTI4LAorCQkubnVtX3BtY3MJCT0gNiwKKwkJLnBtY190eXBlCQk9IFBQQ19QTUNfSUJNLAorCQkub3Byb2ZpbGVfY3B1X3R5cGUJPSAicHBjNjQvcG93ZXI3IiwKKwkJLm9wcm9maWxlX3R5cGUJCT0gUFBDX09QUk9GSUxFX1BPV0VSNCwKKwkJLnBsYXRmb3JtCQk9ICJwb3dlcjcrIiwKKwl9LAogCXsJLyogQ2VsbCBCcm9hZGJhbmQgRW5naW5lICovCiAJCS5wdnJfbWFzawkJPSAweGZmZmYwMDAwLAogCQkucHZyX3ZhbHVlCQk9IDB4MDA3MDAwMDAsCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL2NyYXNoX2R1bXAuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvY3Jhc2hfZHVtcC5jCmluZGV4IDhlMDVjMTYuLjBhMmFmNTAgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvY3Jhc2hfZHVtcC5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvY3Jhc2hfZHVtcC5jCkBAIC0xOSw2ICsxOSw3IEBACiAjaW5jbHVkZSA8YXNtL3Byb20uaD4KICNpbmNsdWRlIDxhc20vZmlybXdhcmUuaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9ydGFzLmg+CiAKICNpZmRlZiBERUJVRwogI2luY2x1ZGUgPGFzbS91ZGJnLmg+CkBAIC0xNDEsMyArMTQyLDM1IEBACiAKIAlyZXR1cm4gY3NpemU7CiB9CisKKyNpZmRlZiBDT05GSUdfUFBDX1JUQVMKKy8qCisgKiBUaGUgY3Jhc2hrZXJuZWwgcmVnaW9uIHdpbGwgYWxtb3N0IGFsd2F5cyBvdmVybGFwIHRoZSBSVEFTIHJlZ2lvbiwgc28KKyAqIHdlIGhhdmUgdG8gYmUgY2FyZWZ1bCB3aGVuIHNocmlua2luZyB0aGUgY3Jhc2hrZXJuZWwgcmVnaW9uLgorICovCit2b2lkIGNyYXNoX2ZyZWVfcmVzZXJ2ZWRfcGh5c19yYW5nZSh1bnNpZ25lZCBsb25nIGJlZ2luLCB1bnNpZ25lZCBsb25nIGVuZCkKK3sKKwl1bnNpZ25lZCBsb25nIGFkZHI7CisJY29uc3QgdTMyICpiYXNlcCwgKnNpemVwOworCXVuc2lnbmVkIGludCBydGFzX3N0YXJ0ID0gMCwgcnRhc19lbmQgPSAwOworCisJYmFzZXAgPSBvZl9nZXRfcHJvcGVydHkocnRhcy5kZXYsICJsaW51eCxydGFzLWJhc2UiLCBOVUxMKTsKKwlzaXplcCA9IG9mX2dldF9wcm9wZXJ0eShydGFzLmRldiwgInJ0YXMtc2l6ZSIsIE5VTEwpOworCisJaWYgKGJhc2VwICYmIHNpemVwKSB7CisJCXJ0YXNfc3RhcnQgPSAqYmFzZXA7CisJCXJ0YXNfZW5kID0gKmJhc2VwICsgKnNpemVwOworCX0KKworCWZvciAoYWRkciA9IGJlZ2luOyBhZGRyIDwgZW5kOyBhZGRyICs9IFBBR0VfU0laRSkgeworCQkvKiBEb2VzIHRoaXMgcGFnZSBvdmVybGFwIHdpdGggdGhlIFJUQVMgcmVnaW9uPyAqLworCQlpZiAoYWRkciA8PSBydGFzX2VuZCAmJiAoKGFkZHIgKyBQQUdFX1NJWkUpID4gcnRhc19zdGFydCkpCisJCQljb250aW51ZTsKKworCQlDbGVhclBhZ2VSZXNlcnZlZChwZm5fdG9fcGFnZShhZGRyID4+IFBBR0VfU0hJRlQpKTsKKwkJaW5pdF9wYWdlX2NvdW50KHBmbl90b19wYWdlKGFkZHIgPj4gUEFHRV9TSElGVCkpOworCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpX192YShhZGRyKSk7CisJCXRvdGFscmFtX3BhZ2VzKys7CisJfQorfQorI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL2RtYS1pb21tdS5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9kbWEtaW9tbXUuYwppbmRleCA2ZTU0YTBmLi5lNzU1NDE1IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL2RtYS1pb21tdS5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvZG1hLWlvbW11LmMKQEAgLTE5LDcgKzE5LDcgQEAKIAkJCQkgICAgICBkbWFfYWRkcl90ICpkbWFfaGFuZGxlLCBnZnBfdCBmbGFnKQogewogCXJldHVybiBpb21tdV9hbGxvY19jb2hlcmVudChkZXYsIGdldF9pb21tdV90YWJsZV9iYXNlKGRldiksIHNpemUsCi0JCQkJICAgIGRtYV9oYW5kbGUsIGRldmljZV90b19tYXNrKGRldiksIGZsYWcsCisJCQkJICAgIGRtYV9oYW5kbGUsIGRldi0+Y29oZXJlbnRfZG1hX21hc2ssIGZsYWcsCiAJCQkJICAgIGRldl90b19ub2RlKGRldikpOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL2VudHJ5XzMyLlMgYi9hcmNoL3Bvd2VycGMva2VybmVsL2VudHJ5XzMyLlMKaW5kZXggZWQ0YWViOS4uYzIyZGMxZSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9lbnRyeV8zMi5TCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvZW50cnlfMzIuUwpAQCAtMzEsNiArMzEsNyBAQAogI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgogI2luY2x1ZGUgPGFzbS91bmlzdGQuaD4KICNpbmNsdWRlIDxhc20vZnRyYWNlLmg+CisjaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgogCiAjdW5kZWYgU0hPV19TWVNDQUxMUwogI3VuZGVmIFNIT1dfU1lTQ0FMTFNfVEFTSwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9leGNlcHRpb25zLTY0cy5TIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9leGNlcHRpb25zLTY0cy5TCmluZGV4IDlmOGIwMWQuLjhhODE3OTkgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvZXhjZXB0aW9ucy02NHMuUworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL2V4Y2VwdGlvbnMtNjRzLlMKQEAgLTEzLDYgKzEzLDcgQEAKICAqLwogCiAjaW5jbHVkZSA8YXNtL2V4Y2VwdGlvbi02NHMuaD4KKyNpbmNsdWRlIDxhc20vcHRyYWNlLmg+CiAKIC8qCiAgKiBXZSBsYXlvdXQgcGh5c2ljYWwgbWVtb3J5IGFzIGZvbGxvd3M6CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL2ZwdS5TIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9mcHUuUwppbmRleCBlODZjMDQwLi5kZTM2OTU1IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL2ZwdS5TCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvZnB1LlMKQEAgLTIzLDYgKzIzLDcgQEAKICNpbmNsdWRlIDxhc20vdGhyZWFkX2luZm8uaD4KICNpbmNsdWRlIDxhc20vcHBjX2FzbS5oPgogI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgorI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KIAogI2lmZGVmIENPTkZJR19WU1gKICNkZWZpbmUgUkVTVF8zMkZQVlNSUyhuLGMsYmFzZSkJCQkJCQlcCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL2hlYWRfNDB4LlMgYi9hcmNoL3Bvd2VycGMva2VybmVsL2hlYWRfNDB4LlMKaW5kZXggODI3OGU4Yi4uOWRkMjFhOCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9oZWFkXzQweC5TCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvaGVhZF80MHguUwpAQCAtNDAsNiArNDAsNyBAQAogI2luY2x1ZGUgPGFzbS90aHJlYWRfaW5mby5oPgogI2luY2x1ZGUgPGFzbS9wcGNfYXNtLmg+CiAjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CisjaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgogCiAvKiBBcyB3aXRoIHRoZSBvdGhlciBQb3dlclBDIHBvcnRzLCBpdCBpcyBleHBlY3RlZCB0aGF0IHdoZW4gY29kZQogICogZXhlY3V0aW9uIGJlZ2lucyBoZXJlLCB0aGUgZm9sbG93aW5nIHJlZ2lzdGVycyBjb250YWluIHZhbGlkLCB5ZXQKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvaGVhZF80NHguUyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvaGVhZF80NHguUwppbmRleCA1NjIzMDViLi5jYmIzNDM2IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL2hlYWRfNDR4LlMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9oZWFkXzQ0eC5TCkBAIC0zNyw2ICszNyw3IEBACiAjaW5jbHVkZSA8YXNtL3RocmVhZF9pbmZvLmg+CiAjaW5jbHVkZSA8YXNtL3BwY19hc20uaD4KICNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KKyNpbmNsdWRlIDxhc20vcHRyYWNlLmg+CiAjaW5jbHVkZSA8YXNtL3N5bmNoLmg+CiAjaW5jbHVkZSAiaGVhZF9ib29rZS5oIgogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL2hlYWRfNjQuUyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvaGVhZF82NC5TCmluZGV4IGYwZGQ1NzcuLjc4MmYyM2QgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvaGVhZF82NC5TCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvaGVhZF82NC5TCkBAIC0zOCw2ICszOCw3IEBACiAjaW5jbHVkZSA8YXNtL3BhZ2VfNjQuaD4KICNpbmNsdWRlIDxhc20vaXJxZmxhZ3MuaD4KICNpbmNsdWRlIDxhc20va3ZtX2Jvb2szc19hc20uaD4KKyNpbmNsdWRlIDxhc20vcHRyYWNlLmg+CiAKIC8qIFRoZSBwaHlzaWNhbCBtZW1vcnkgaXMgbGF5ZWQgb3V0IHN1Y2ggdGhhdCB0aGUgc2Vjb25kYXJ5IHByb2Nlc3NvcgogICogc3BpbiBjb2RlIHNpdHMgYXQgMHgwMDAwLi4uMHgwMGZmLiBPbiBzZXJ2ZXIsIHRoZSB2ZWN0b3JzIGZvbGxvdwpAQCAtOTYsNyArOTcsNyBAQAogCS5sbG9uZyBodlJlbGVhc2VEYXRhLUtFUk5FTEJBU0UKICNlbmRpZiAvKiBDT05GSUdfUFBDX0lTRVJJRVMgKi8KIAotI2lmZGVmIENPTkZJR19DUkFTSF9EVU1QCisjaWZkZWYgQ09ORklHX1JFTE9DQVRBQkxFCiAJLyogVGhpcyBmbGFnIGlzIHNldCB0byAxIGJ5IGEgbG9hZGVyIGlmIHRoZSBrZXJuZWwgc2hvdWxkIHJ1bgogCSAqIGF0IHRoZSBsb2FkZWQgYWRkcmVzcyBpbnN0ZWFkIG9mIHRoZSBsaW5rZWQgYWRkcmVzcy4gIFRoaXMKIAkgKiBpcyB1c2VkIGJ5IGtleGVjLXRvb2xzIHRvIGtlZXAgdGhlIHRoZSBrZHVtcCBrZXJuZWwgaW4gdGhlCkBAIC0zODQsMTIgKzM4NSwxMCBAQAogCS8qIHByb2Nlc3MgcmVsb2NhdGlvbnMgZm9yIHRoZSBmaW5hbCBhZGRyZXNzIG9mIHRoZSBrZXJuZWwgKi8KIAlsaXMJcjI1LFBBR0VfT0ZGU0VUQGhpZ2hlc3QJLyogY29tcHV0ZSB2aXJ0dWFsIGJhc2Ugb2Yga2VybmVsICovCiAJc2xkaQlyMjUscjI1LDMyCi0jaWZkZWYgQ09ORklHX0NSQVNIX0RVTVAKIAlsd3oJcjcsX19ydW5fYXRfbG9hZC1fc3RleHQocjI2KQotCWNtcGx3aQljcjAscjcsMQkvKiBrZHVtcCBrZXJuZWwgPyAtIHN0YXkgd2hlcmUgd2UgYXJlICovCisJY21wbHdpCWNyMCxyNywxCS8qIGZsYWdnZWQgdG8gc3RheSB3aGVyZSB3ZSBhcmUgPyAqLwogCWJuZQkxZgogCWFkZAlyMjUscjI1LHIyNgotI2VuZGlmCiAxOgltcglyMyxyMjUKIAlibAkucmVsb2NhdGUKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9oZWFkXzh4eC5TIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9oZWFkXzh4eC5TCmluZGV4IDFmMWEwNGIuLjFjYmY2NGUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvaGVhZF84eHguUworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL2hlYWRfOHh4LlMKQEAgLTI5LDYgKzI5LDcgQEAKICNpbmNsdWRlIDxhc20vdGhyZWFkX2luZm8uaD4KICNpbmNsdWRlIDxhc20vcHBjX2FzbS5oPgogI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgorI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KIAogLyogTWFjcm8gdG8gbWFrZSB0aGUgY29kZSBtb3JlIHJlYWRhYmxlLiAqLwogI2lmZGVmIENPTkZJR184eHhfQ1BVNgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9oZWFkX2ZzbF9ib29rZS5TIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9oZWFkX2ZzbF9ib29rZS5TCmluZGV4IDUyOWI4MTcuLjNlMDI3MTAgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvaGVhZF9mc2xfYm9va2UuUworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL2hlYWRfZnNsX2Jvb2tlLlMKQEAgLTQxLDYgKzQxLDcgQEAKICNpbmNsdWRlIDxhc20vcHBjX2FzbS5oPgogI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgogI2luY2x1ZGUgPGFzbS9jYWNoZS5oPgorI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KICNpbmNsdWRlICJoZWFkX2Jvb2tlLmgiCiAKIC8qIEFzIHdpdGggdGhlIG90aGVyIFBvd2VyUEMgcG9ydHMsIGl0IGlzIGV4cGVjdGVkIHRoYXQgd2hlbiBjb2RlCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL2lvbW11LmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL2lvbW11LmMKaW5kZXggZDU4MzkxNy4uOTYxYmIwMyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9pb21tdS5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvaW9tbXUuYwpAQCAtMzExLDggKzMxMSw5IEBACiAJCS8qIEhhbmRsZSBmYWlsdXJlICovCiAJCWlmICh1bmxpa2VseShlbnRyeSA9PSBETUFfRVJST1JfQ09ERSkpIHsKIAkJCWlmIChwcmludGtfcmF0ZWxpbWl0KCkpCi0JCQkJcHJpbnRrKEtFUk5fSU5GTyAiaW9tbXVfYWxsb2MgZmFpbGVkLCB0YmwgJXAgdmFkZHIgJWx4IgotCQkJCSAgICAgICAiIG5wYWdlcyAlbHhcbiIsIHRibCwgdmFkZHIsIG5wYWdlcyk7CisJCQkJZGV2X2luZm8oZGV2LCAiaW9tbXVfYWxsb2MgZmFpbGVkLCB0YmwgJXAgIgorCQkJCQkgInZhZGRyICVseCBucGFnZXMgJWx1XG4iLCB0YmwsIHZhZGRyLAorCQkJCQkgbnBhZ2VzKTsKIAkJCWdvdG8gZmFpbHVyZTsKIAkJfQogCkBAIC01NzksOSArNTgwLDkgQEAKIAkJCQkJIGF0dHJzKTsKIAkJaWYgKGRtYV9oYW5kbGUgPT0gRE1BX0VSUk9SX0NPREUpIHsKIAkJCWlmIChwcmludGtfcmF0ZWxpbWl0KCkpICB7Ci0JCQkJcHJpbnRrKEtFUk5fSU5GTyAiaW9tbXVfYWxsb2MgZmFpbGVkLCAiCi0JCQkJCQkidGJsICVwIHZhZGRyICVwIG5wYWdlcyAlZFxuIiwKLQkJCQkJCXRibCwgdmFkZHIsIG5wYWdlcyk7CisJCQkJZGV2X2luZm8oZGV2LCAiaW9tbXVfYWxsb2MgZmFpbGVkLCB0YmwgJXAgIgorCQkJCQkgInZhZGRyICVwIG5wYWdlcyAlZFxuIiwgdGJsLCB2YWRkciwKKwkJCQkJIG5wYWdlcyk7CiAJCQl9CiAJCX0gZWxzZQogCQkJZG1hX2hhbmRsZSB8PSAodWFkZHIgJiB+SU9NTVVfUEFHRV9NQVNLKTsKQEAgLTYyNyw3ICs2MjgsOCBAQAogCSAqIHRoZSB0Y2UgdGFibGVzLgogCSAqLwogCWlmIChvcmRlciA+PSBJT01BUF9NQVhfT1JERVIpIHsKLQkJcHJpbnRrKCJpb21tdV9hbGxvY19jb25zaXN0ZW50IHNpemUgdG9vIGxhcmdlOiAweCVseFxuIiwgc2l6ZSk7CisJCWRldl9pbmZvKGRldiwgImlvbW11X2FsbG9jX2NvbnNpc3RlbnQgc2l6ZSB0b28gbGFyZ2U6IDB4JWx4XG4iLAorCQkJIHNpemUpOwogCQlyZXR1cm4gTlVMTDsKIAl9CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvbWlzYy5TIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9taXNjLlMKaW5kZXggMmQyOTc1Mi4uYjY5NDYzZSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9taXNjLlMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9taXNjLlMKQEAgLTEyMiw4ICsxMjIsMyBAQAogCW10bHIJcjAKIAltcglyMyxyNAogCWJscgotCi1fR0xPQkFMKF9fc2V0dXBfY3B1X3Bvd2VyNykKLV9HTE9CQUwoX19yZXN0b3JlX2NwdV9wb3dlcjcpCi0JLyogcGxhY2UgaG9sZGVyICovCi0JYmxyCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL21pc2NfMzIuUyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvbWlzY18zMi5TCmluZGV4IGE3YTU3MGQuLjA5NGJkOTggMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvbWlzY18zMi5TCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvbWlzY18zMi5TCkBAIC0zMCw2ICszMCw3IEBACiAjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgogI2luY2x1ZGUgPGFzbS9rZXhlYy5oPgogI2luY2x1ZGUgPGFzbS9idWcuaD4KKyNpbmNsdWRlIDxhc20vcHRyYWNlLmg+CiAKIAkudGV4dAogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL21pc2NfNjQuUyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvbWlzY182NC5TCmluZGV4IGU1MTQ0OTAuLjIwNmEzMjEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvbWlzY182NC5TCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvbWlzY182NC5TCkBAIC0yNSw2ICsyNSw3IEBACiAjaW5jbHVkZSA8YXNtL2NwdXRhYmxlLmg+CiAjaW5jbHVkZSA8YXNtL3RocmVhZF9pbmZvLmg+CiAjaW5jbHVkZSA8YXNtL2tleGVjLmg+CisjaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgogCiAJLnRleHQKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9udnJhbV82NC5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9udnJhbV82NC5jCmluZGV4IDljZjE5N2YuLmJiMTJiMzIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvbnZyYW1fNjQuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL252cmFtXzY0LmMKQEAgLTM0LDE1ICszNCwyNiBAQAogCiAjdW5kZWYgREVCVUdfTlZSQU0KIAotc3RhdGljIHN0cnVjdCBudnJhbV9wYXJ0aXRpb24gKiBudnJhbV9wYXJ0Owotc3RhdGljIGxvbmcgbnZyYW1fZXJyb3JfbG9nX2luZGV4ID0gLTE7Ci1zdGF0aWMgbG9uZyBudnJhbV9lcnJvcl9sb2dfc2l6ZSA9IDA7CisjZGVmaW5lIE5WUkFNX0hFQURFUl9MRU4Jc2l6ZW9mKHN0cnVjdCBudnJhbV9oZWFkZXIpCisjZGVmaW5lIE5WUkFNX0JMT0NLX0xFTgkJTlZSQU1fSEVBREVSX0xFTgogCi1zdHJ1Y3QgZXJyX2xvZ19pbmZvIHsKLQlpbnQgZXJyb3JfdHlwZTsKLQl1bnNpZ25lZCBpbnQgc2VxX251bTsKKy8qIElmIGNoYW5nZSB0aGlzIHNpemUsIHRoZW4gY2hhbmdlIHRoZSBzaXplIG9mIE5WTkFNRV9MRU4gKi8KK3N0cnVjdCBudnJhbV9oZWFkZXIgeworCXVuc2lnbmVkIGNoYXIgc2lnbmF0dXJlOworCXVuc2lnbmVkIGNoYXIgY2hlY2tzdW07CisJdW5zaWduZWQgc2hvcnQgbGVuZ3RoOworCS8qIFRlcm1pbmF0aW5nIG51bGwgcmVxdWlyZWQgb25seSBmb3IgbmFtZXMgPCAxMiBjaGFycy4gKi8KKwljaGFyIG5hbWVbMTJdOwogfTsKIAorc3RydWN0IG52cmFtX3BhcnRpdGlvbiB7CisJc3RydWN0IGxpc3RfaGVhZCBwYXJ0aXRpb247CisJc3RydWN0IG52cmFtX2hlYWRlciBoZWFkZXI7CisJdW5zaWduZWQgaW50IGluZGV4OworfTsKKworc3RhdGljIExJU1RfSEVBRChudnJhbV9wYXJ0aXRpb25zKTsKKwogc3RhdGljIGxvZmZfdCBkZXZfbnZyYW1fbGxzZWVrKHN0cnVjdCBmaWxlICpmaWxlLCBsb2ZmX3Qgb2Zmc2V0LCBpbnQgb3JpZ2luKQogewogCWludCBzaXplOwpAQCAtMTg2LDE0ICsxOTcsMTIgQEAKICNpZmRlZiBERUJVR19OVlJBTQogc3RhdGljIHZvaWQgX19pbml0IG52cmFtX3ByaW50X3BhcnRpdGlvbnMoY2hhciAqIGxhYmVsKQogewotCXN0cnVjdCBsaXN0X2hlYWQgKiBwOwogCXN0cnVjdCBudnJhbV9wYXJ0aXRpb24gKiB0bXBfcGFydDsKIAkKIAlwcmludGsoS0VSTl9XQVJOSU5HICItLS0tLS0tLSVzLS0tLS0tLS0tXG4iLCBsYWJlbCk7CiAJcHJpbnRrKEtFUk5fV0FSTklORyAiaW5keFx0XHRzaWdcdGNoa3NcdGxlblx0bmFtZVxuIik7Ci0JbGlzdF9mb3JfZWFjaChwLCAmbnZyYW1fcGFydC0+cGFydGl0aW9uKSB7Ci0JCXRtcF9wYXJ0ID0gbGlzdF9lbnRyeShwLCBzdHJ1Y3QgbnZyYW1fcGFydGl0aW9uLCBwYXJ0aXRpb24pOwotCQlwcmludGsoS0VSTl9XQVJOSU5HICIlNGQgICAgXHQlMDJ4XHQlMDJ4XHQlZFx0JXNcbiIsCisJbGlzdF9mb3JfZWFjaF9lbnRyeSh0bXBfcGFydCwgJm52cmFtX3BhcnRpdGlvbnMsIHBhcnRpdGlvbikgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlNGQgICAgXHQlMDJ4XHQlMDJ4XHQlZFx0JTEyc1xuIiwKIAkJICAgICAgIHRtcF9wYXJ0LT5pbmRleCwgdG1wX3BhcnQtPmhlYWRlci5zaWduYXR1cmUsCiAJCSAgICAgICB0bXBfcGFydC0+aGVhZGVyLmNoZWNrc3VtLCB0bXBfcGFydC0+aGVhZGVyLmxlbmd0aCwKIAkJICAgICAgIHRtcF9wYXJ0LT5oZWFkZXIubmFtZSk7CkBAIC0yMjgsOTUgKzIzNywxMTMgQEAKIAlyZXR1cm4gY19zdW07CiB9CiAKLXN0YXRpYyBpbnQgX19pbml0IG52cmFtX3JlbW92ZV9vc19wYXJ0aXRpb24odm9pZCkKKy8qKgorICogbnZyYW1fcmVtb3ZlX3BhcnRpdGlvbiAtIFJlbW92ZSBvbmUgb3IgbW9yZSBwYXJ0aXRpb25zIGluIG52cmFtCisgKiBAbmFtZTogbmFtZSBvZiB0aGUgcGFydGl0aW9uIHRvIHJlbW92ZSwgb3IgTlVMTCBmb3IgYQorICogICAgICAgIHNpZ25hdHVyZSBvbmx5IG1hdGNoCisgKiBAc2lnOiBzaWduYXR1cmUgb2YgdGhlIHBhcnRpdGlvbihzKSB0byByZW1vdmUKKyAqLworCitpbnQgX19pbml0IG52cmFtX3JlbW92ZV9wYXJ0aXRpb24oY29uc3QgY2hhciAqbmFtZSwgaW50IHNpZykKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICppOwotCXN0cnVjdCBsaXN0X2hlYWQgKmo7Ci0Jc3RydWN0IG52cmFtX3BhcnRpdGlvbiAqIHBhcnQ7Ci0Jc3RydWN0IG52cmFtX3BhcnRpdGlvbiAqIGN1cl9wYXJ0OworCXN0cnVjdCBudnJhbV9wYXJ0aXRpb24gKnBhcnQsICpwcmV2LCAqdG1wOwogCWludCByYzsKIAotCWxpc3RfZm9yX2VhY2goaSwgJm52cmFtX3BhcnQtPnBhcnRpdGlvbikgewotCQlwYXJ0ID0gbGlzdF9lbnRyeShpLCBzdHJ1Y3QgbnZyYW1fcGFydGl0aW9uLCBwYXJ0aXRpb24pOwotCQlpZiAocGFydC0+aGVhZGVyLnNpZ25hdHVyZSAhPSBOVlJBTV9TSUdfT1MpCisJbGlzdF9mb3JfZWFjaF9lbnRyeShwYXJ0LCAmbnZyYW1fcGFydGl0aW9ucywgcGFydGl0aW9uKSB7CisJCWlmIChwYXJ0LT5oZWFkZXIuc2lnbmF0dXJlICE9IHNpZykKIAkJCWNvbnRpbnVlOwotCQkKLQkJLyogTWFrZSBvcyBwYXJ0aXRpb24gYSBmcmVlIHBhcnRpdGlvbiAqLworCQlpZiAobmFtZSAmJiBzdHJuY21wKG5hbWUsIHBhcnQtPmhlYWRlci5uYW1lLCAxMikpCisJCQljb250aW51ZTsKKworCQkvKiBNYWtlIHBhcnRpdGlvbiBhIGZyZWUgcGFydGl0aW9uICovCiAJCXBhcnQtPmhlYWRlci5zaWduYXR1cmUgPSBOVlJBTV9TSUdfRlJFRTsKLQkJc3ByaW50ZihwYXJ0LT5oZWFkZXIubmFtZSwgInd3d3d3d3d3d3d3dyIpOworCQlzdHJuY3B5KHBhcnQtPmhlYWRlci5uYW1lLCAid3d3d3d3d3d3d3d3IiwgMTIpOwogCQlwYXJ0LT5oZWFkZXIuY2hlY2tzdW0gPSBudnJhbV9jaGVja3N1bSgmcGFydC0+aGVhZGVyKTsKLQotCQkvKiBNZXJnZSBjb250aWd1b3VzIGZyZWUgcGFydGl0aW9ucyBiYWNrd2FyZHMgKi8KLQkJbGlzdF9mb3JfZWFjaF9wcmV2KGosICZwYXJ0LT5wYXJ0aXRpb24pIHsKLQkJCWN1cl9wYXJ0ID0gbGlzdF9lbnRyeShqLCBzdHJ1Y3QgbnZyYW1fcGFydGl0aW9uLCBwYXJ0aXRpb24pOwotCQkJaWYgKGN1cl9wYXJ0ID09IG52cmFtX3BhcnQgfHwgY3VyX3BhcnQtPmhlYWRlci5zaWduYXR1cmUgIT0gTlZSQU1fU0lHX0ZSRUUpIHsKLQkJCQlicmVhazsKLQkJCX0KLQkJCQotCQkJcGFydC0+aGVhZGVyLmxlbmd0aCArPSBjdXJfcGFydC0+aGVhZGVyLmxlbmd0aDsKLQkJCXBhcnQtPmhlYWRlci5jaGVja3N1bSA9IG52cmFtX2NoZWNrc3VtKCZwYXJ0LT5oZWFkZXIpOwotCQkJcGFydC0+aW5kZXggPSBjdXJfcGFydC0+aW5kZXg7Ci0KLQkJCWxpc3RfZGVsKCZjdXJfcGFydC0+cGFydGl0aW9uKTsKLQkJCWtmcmVlKGN1cl9wYXJ0KTsKLQkJCWogPSAmcGFydC0+cGFydGl0aW9uOyAvKiBmaXh1cCBvdXIgbG9vcCAqLwotCQl9Ci0JCQotCQkvKiBNZXJnZSBjb250aWd1b3VzIGZyZWUgcGFydGl0aW9ucyBmb3J3YXJkcyAqLwotCQlsaXN0X2Zvcl9lYWNoKGosICZwYXJ0LT5wYXJ0aXRpb24pIHsKLQkJCWN1cl9wYXJ0ID0gbGlzdF9lbnRyeShqLCBzdHJ1Y3QgbnZyYW1fcGFydGl0aW9uLCBwYXJ0aXRpb24pOwotCQkJaWYgKGN1cl9wYXJ0ID09IG52cmFtX3BhcnQgfHwgY3VyX3BhcnQtPmhlYWRlci5zaWduYXR1cmUgIT0gTlZSQU1fU0lHX0ZSRUUpIHsKLQkJCQlicmVhazsKLQkJCX0KLQotCQkJcGFydC0+aGVhZGVyLmxlbmd0aCArPSBjdXJfcGFydC0+aGVhZGVyLmxlbmd0aDsKLQkJCXBhcnQtPmhlYWRlci5jaGVja3N1bSA9IG52cmFtX2NoZWNrc3VtKCZwYXJ0LT5oZWFkZXIpOwotCi0JCQlsaXN0X2RlbCgmY3VyX3BhcnQtPnBhcnRpdGlvbik7Ci0JCQlrZnJlZShjdXJfcGFydCk7Ci0JCQlqID0gJnBhcnQtPnBhcnRpdGlvbjsgLyogZml4dXAgb3VyIGxvb3AgKi8KLQkJfQotCQkKIAkJcmMgPSBudnJhbV93cml0ZV9oZWFkZXIocGFydCk7CiAJCWlmIChyYyA8PSAwKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgIm52cmFtX3JlbW92ZV9vc19wYXJ0aXRpb246IG52cmFtX3dyaXRlIGZhaWxlZCAoJWQpXG4iLCByYyk7CisJCQlwcmludGsoS0VSTl9FUlIgIm52cmFtX3JlbW92ZV9wYXJ0aXRpb246IG52cmFtX3dyaXRlIGZhaWxlZCAoJWQpXG4iLCByYyk7CiAJCQlyZXR1cm4gcmM7CiAJCX0KKwl9CiAKKwkvKiBNZXJnZSBjb250aWd1b3VzIG9uZXMgKi8KKwlwcmV2ID0gTlVMTDsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocGFydCwgdG1wLCAmbnZyYW1fcGFydGl0aW9ucywgcGFydGl0aW9uKSB7CisJCWlmIChwYXJ0LT5oZWFkZXIuc2lnbmF0dXJlICE9IE5WUkFNX1NJR19GUkVFKSB7CisJCQlwcmV2ID0gTlVMTDsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChwcmV2KSB7CisJCQlwcmV2LT5oZWFkZXIubGVuZ3RoICs9IHBhcnQtPmhlYWRlci5sZW5ndGg7CisJCQlwcmV2LT5oZWFkZXIuY2hlY2tzdW0gPSBudnJhbV9jaGVja3N1bSgmcGFydC0+aGVhZGVyKTsKKwkJCXJjID0gbnZyYW1fd3JpdGVfaGVhZGVyKHBhcnQpOworCQkJaWYgKHJjIDw9IDApIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgIm52cmFtX3JlbW92ZV9wYXJ0aXRpb246IG52cmFtX3dyaXRlIGZhaWxlZCAoJWQpXG4iLCByYyk7CisJCQkJcmV0dXJuIHJjOworCQkJfQorCQkJbGlzdF9kZWwoJnBhcnQtPnBhcnRpdGlvbik7CisJCQlrZnJlZShwYXJ0KTsKKwkJfSBlbHNlCisJCQlwcmV2ID0gcGFydDsKIAl9CiAJCiAJcmV0dXJuIDA7CiB9CiAKLS8qIG52cmFtX2NyZWF0ZV9vc19wYXJ0aXRpb24KKy8qKgorICogbnZyYW1fY3JlYXRlX3BhcnRpdGlvbiAtIENyZWF0ZSBhIHBhcnRpdGlvbiBpbiBudnJhbQorICogQG5hbWU6IG5hbWUgb2YgdGhlIHBhcnRpdGlvbiB0byBjcmVhdGUKKyAqIEBzaWc6IHNpZ25hdHVyZSBvZiB0aGUgcGFydGl0aW9uIHRvIGNyZWF0ZQorICogQHJlcV9zaXplOiBzaXplIG9mIGRhdGEgdG8gYWxsb2NhdGUgaW4gYnl0ZXMKKyAqIEBtaW5fc2l6ZTogbWluaW11bSBhY2NlcHRhYmxlIHNpemUgKDAgbWVhbnMgcmVxX3NpemUpCiAgKgotICogQ3JlYXRlIGEgT1MgbGludXggcGFydGl0aW9uIHRvIGJ1ZmZlciBlcnJvciBsb2dzLgotICogV2lsbCBjcmVhdGUgYSBwYXJ0aXRpb24gc3RhcnRpbmcgYXQgdGhlIGZpcnN0IGZyZWUKLSAqIHNwYWNlIGZvdW5kIGlmIHNwYWNlIGhhcyBlbm91Z2ggcm9vbS4KKyAqIFJldHVybnMgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIG9yIGEgcG9zaXRpdmUgbnZyYW0gaW5kZXgKKyAqIG9mIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGRhdGEgYXJlYSBvZiB0aGUgbmV3bHkgY3JlYXRlZAorICogcGFydGl0aW9uLiBJZiB5b3UgcHJvdmlkZWQgYSBtaW5fc2l6ZSBzbWFsbGVyIHRoYW4gcmVxX3NpemUKKyAqIHlvdSBuZWVkIHRvIHF1ZXJ5IGZvciB0aGUgYWN0dWFsIHNpemUgeW91cnNlbGYgYWZ0ZXIgdGhlCisgKiBjYWxsIHVzaW5nIG52cmFtX3BhcnRpdGlvbl9nZXRfc2l6ZSgpLgogICovCi1zdGF0aWMgaW50IF9faW5pdCBudnJhbV9jcmVhdGVfb3NfcGFydGl0aW9uKHZvaWQpCitsb2ZmX3QgX19pbml0IG52cmFtX2NyZWF0ZV9wYXJ0aXRpb24oY29uc3QgY2hhciAqbmFtZSwgaW50IHNpZywKKwkJCQkgICAgIGludCByZXFfc2l6ZSwgaW50IG1pbl9zaXplKQogewogCXN0cnVjdCBudnJhbV9wYXJ0aXRpb24gKnBhcnQ7CiAJc3RydWN0IG52cmFtX3BhcnRpdGlvbiAqbmV3X3BhcnQ7CiAJc3RydWN0IG52cmFtX3BhcnRpdGlvbiAqZnJlZV9wYXJ0ID0gTlVMTDsKLQlpbnQgc2VxX2luaXRbMl0gPSB7IDAsIDAgfTsKKwlzdGF0aWMgY2hhciBudl9pbml0X3ZhbHNbMTZdOwogCWxvZmZfdCB0bXBfaW5kZXg7CiAJbG9uZyBzaXplID0gMDsKIAlpbnQgcmM7Ci0JCisKKwkvKiBDb252ZXJ0IHNpemVzIGZyb20gYnl0ZXMgdG8gYmxvY2tzICovCisJcmVxX3NpemUgPSBfQUxJR05fVVAocmVxX3NpemUsIE5WUkFNX0JMT0NLX0xFTikgLyBOVlJBTV9CTE9DS19MRU47CisJbWluX3NpemUgPSBfQUxJR05fVVAobWluX3NpemUsIE5WUkFNX0JMT0NLX0xFTikgLyBOVlJBTV9CTE9DS19MRU47CisKKwkvKiBJZiBubyBtaW5pbXVtIHNpemUgc3BlY2lmaWVkLCBtYWtlIGl0IHRoZSBzYW1lIGFzIHRoZQorCSAqIHJlcXVlc3RlZCBzaXplCisJICovCisJaWYgKG1pbl9zaXplID09IDApCisJCW1pbl9zaXplID0gcmVxX3NpemU7CisJaWYgKG1pbl9zaXplID4gcmVxX3NpemUpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogTm93IGFkZCBvbmUgYmxvY2sgdG8gZWFjaCBmb3IgdGhlIGhlYWRlciAqLworCXJlcV9zaXplICs9IDE7CisJbWluX3NpemUgKz0gMTsKKwogCS8qIEZpbmQgYSBmcmVlIHBhcnRpdGlvbiB0aGF0IHdpbGwgZ2l2ZSB1cyB0aGUgbWF4aW11bSBuZWVkZWQgc2l6ZSAKIAkgICBJZiBjYW4ndCBmaW5kIG9uZSB0aGF0IHdpbGwgZ2l2ZSB1cyB0aGUgbWluaW11bSBzaXplIG5lZWRlZCAqLwotCWxpc3RfZm9yX2VhY2hfZW50cnkocGFydCwgJm52cmFtX3BhcnQtPnBhcnRpdGlvbiwgcGFydGl0aW9uKSB7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShwYXJ0LCAmbnZyYW1fcGFydGl0aW9ucywgcGFydGl0aW9uKSB7CiAJCWlmIChwYXJ0LT5oZWFkZXIuc2lnbmF0dXJlICE9IE5WUkFNX1NJR19GUkVFKQogCQkJY29udGludWU7CiAKLQkJaWYgKHBhcnQtPmhlYWRlci5sZW5ndGggPj0gTlZSQU1fTUFYX1JFUSkgewotCQkJc2l6ZSA9IE5WUkFNX01BWF9SRVE7CisJCWlmIChwYXJ0LT5oZWFkZXIubGVuZ3RoID49IHJlcV9zaXplKSB7CisJCQlzaXplID0gcmVxX3NpemU7CiAJCQlmcmVlX3BhcnQgPSBwYXJ0OwogCQkJYnJlYWs7CiAJCX0KLQkJaWYgKCFzaXplICYmIHBhcnQtPmhlYWRlci5sZW5ndGggPj0gTlZSQU1fTUlOX1JFUSkgewotCQkJc2l6ZSA9IE5WUkFNX01JTl9SRVE7CisJCWlmIChwYXJ0LT5oZWFkZXIubGVuZ3RoID4gc2l6ZSAmJgorCQkgICAgcGFydC0+aGVhZGVyLmxlbmd0aCA+PSBtaW5fc2l6ZSkgeworCQkJc2l6ZSA9IHBhcnQtPmhlYWRlci5sZW5ndGg7CiAJCQlmcmVlX3BhcnQgPSBwYXJ0OwogCQl9CiAJfQpAQCAtMzI2LDEzNiArMzUzLDk1IEBACiAJLyogQ3JlYXRlIG91ciBPUyBwYXJ0aXRpb24gKi8KIAluZXdfcGFydCA9IGttYWxsb2Moc2l6ZW9mKCpuZXdfcGFydCksIEdGUF9LRVJORUwpOwogCWlmICghbmV3X3BhcnQpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJudnJhbV9jcmVhdGVfb3NfcGFydGl0aW9uOiBrbWFsbG9jIGZhaWxlZFxuIik7CisJCXByX2VycigibnZyYW1fY3JlYXRlX29zX3BhcnRpdGlvbjoga21hbGxvYyBmYWlsZWRcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKIAluZXdfcGFydC0+aW5kZXggPSBmcmVlX3BhcnQtPmluZGV4OwotCW5ld19wYXJ0LT5oZWFkZXIuc2lnbmF0dXJlID0gTlZSQU1fU0lHX09TOworCW5ld19wYXJ0LT5oZWFkZXIuc2lnbmF0dXJlID0gc2lnOwogCW5ld19wYXJ0LT5oZWFkZXIubGVuZ3RoID0gc2l6ZTsKLQlzdHJjcHkobmV3X3BhcnQtPmhlYWRlci5uYW1lLCAicHBjNjQsbGludXgiKTsKKwlzdHJuY3B5KG5ld19wYXJ0LT5oZWFkZXIubmFtZSwgbmFtZSwgMTIpOwogCW5ld19wYXJ0LT5oZWFkZXIuY2hlY2tzdW0gPSBudnJhbV9jaGVja3N1bSgmbmV3X3BhcnQtPmhlYWRlcik7CiAKIAlyYyA9IG52cmFtX3dyaXRlX2hlYWRlcihuZXdfcGFydCk7CiAJaWYgKHJjIDw9IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJudnJhbV9jcmVhdGVfb3NfcGFydGl0aW9uOiBudnJhbV93cml0ZV9oZWFkZXIgIgotCQkJCSJmYWlsZWQgKCVkKVxuIiwgcmMpOwotCQlyZXR1cm4gcmM7Ci0JfQotCi0JLyogbWFrZSBzdXJlIGFuZCBpbml0aWFsaXplIHRvIHplcm8gdGhlIHNlcXVlbmNlIG51bWJlciBhbmQgdGhlIGVycm9yCi0JICAgdHlwZSBsb2dnZWQgKi8KLQl0bXBfaW5kZXggPSBuZXdfcGFydC0+aW5kZXggKyBOVlJBTV9IRUFERVJfTEVOOwotCXJjID0gcHBjX21kLm52cmFtX3dyaXRlKChjaGFyICopJnNlcV9pbml0LCBzaXplb2Yoc2VxX2luaXQpLCAmdG1wX2luZGV4KTsKLQlpZiAocmMgPD0gMCkgewotCQlwcmludGsoS0VSTl9FUlIgIm52cmFtX2NyZWF0ZV9vc19wYXJ0aXRpb246IG52cmFtX3dyaXRlICIKKwkJcHJfZXJyKCJudnJhbV9jcmVhdGVfb3NfcGFydGl0aW9uOiBudnJhbV93cml0ZV9oZWFkZXIgIgogCQkgICAgICAgImZhaWxlZCAoJWQpXG4iLCByYyk7CiAJCXJldHVybiByYzsKIAl9Ci0JCi0JbnZyYW1fZXJyb3JfbG9nX2luZGV4ID0gbmV3X3BhcnQtPmluZGV4ICsgTlZSQU1fSEVBREVSX0xFTjsKLQludnJhbV9lcnJvcl9sb2dfc2l6ZSA9ICgocGFydC0+aGVhZGVyLmxlbmd0aCAtIDEpICoKLQkJCQlOVlJBTV9CTE9DS19MRU4pIC0gc2l6ZW9mKHN0cnVjdCBlcnJfbG9nX2luZm8pOwotCQogCWxpc3RfYWRkX3RhaWwoJm5ld19wYXJ0LT5wYXJ0aXRpb24sICZmcmVlX3BhcnQtPnBhcnRpdGlvbik7CiAKLQlpZiAoZnJlZV9wYXJ0LT5oZWFkZXIubGVuZ3RoIDw9IHNpemUpIHsKKwkvKiBBZGp1c3Qgb3IgcmVtb3ZlIHRoZSBwYXJ0aXRpb24gd2Ugc3RvbGUgdGhlIHNwYWNlIGZyb20gKi8KKwlpZiAoZnJlZV9wYXJ0LT5oZWFkZXIubGVuZ3RoID4gc2l6ZSkgeworCQlmcmVlX3BhcnQtPmluZGV4ICs9IHNpemUgKiBOVlJBTV9CTE9DS19MRU47CisJCWZyZWVfcGFydC0+aGVhZGVyLmxlbmd0aCAtPSBzaXplOworCQlmcmVlX3BhcnQtPmhlYWRlci5jaGVja3N1bSA9IG52cmFtX2NoZWNrc3VtKCZmcmVlX3BhcnQtPmhlYWRlcik7CisJCXJjID0gbnZyYW1fd3JpdGVfaGVhZGVyKGZyZWVfcGFydCk7CisJCWlmIChyYyA8PSAwKSB7CisJCQlwcl9lcnIoIm52cmFtX2NyZWF0ZV9vc19wYXJ0aXRpb246IG52cmFtX3dyaXRlX2hlYWRlciAiCisJCQkgICAgICAgImZhaWxlZCAoJWQpXG4iLCByYyk7CisJCQlyZXR1cm4gcmM7CisJCX0KKwl9IGVsc2UgewogCQlsaXN0X2RlbCgmZnJlZV9wYXJ0LT5wYXJ0aXRpb24pOwogCQlrZnJlZShmcmVlX3BhcnQpOwotCQlyZXR1cm4gMDsKIAl9IAogCi0JLyogQWRqdXN0IHRoZSBwYXJ0aXRpb24gd2Ugc3RvbGUgdGhlIHNwYWNlIGZyb20gKi8KLQlmcmVlX3BhcnQtPmluZGV4ICs9IHNpemUgKiBOVlJBTV9CTE9DS19MRU47Ci0JZnJlZV9wYXJ0LT5oZWFkZXIubGVuZ3RoIC09IHNpemU7Ci0JZnJlZV9wYXJ0LT5oZWFkZXIuY2hlY2tzdW0gPSBudnJhbV9jaGVja3N1bSgmZnJlZV9wYXJ0LT5oZWFkZXIpOwotCQotCXJjID0gbnZyYW1fd3JpdGVfaGVhZGVyKGZyZWVfcGFydCk7Ci0JaWYgKHJjIDw9IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJudnJhbV9jcmVhdGVfb3NfcGFydGl0aW9uOiBudnJhbV93cml0ZV9oZWFkZXIgIgotCQkgICAgICAgImZhaWxlZCAoJWQpXG4iLCByYyk7Ci0JCXJldHVybiByYzsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotCi0vKiBudnJhbV9zZXR1cF9wYXJ0aXRpb24KLSAqCi0gKiBUaGlzIHdpbGwgc2V0dXAgdGhlIHBhcnRpdGlvbiB3ZSBuZWVkIGZvciBidWZmZXJpbmcgdGhlCi0gKiBlcnJvciBsb2dzIGFuZCBjbGVhbnVwIHBhcnRpdGlvbnMgaWYgbmVlZGVkLgotICoKLSAqIFRoZSBnZW5lcmFsIHN0cmF0ZWd5IGlzIHRoZSBmb2xsb3dpbmc6Ci0gKiAxLikgSWYgdGhlcmUgaXMgcHBjNjQsbGludXggcGFydGl0aW9uIGxhcmdlIGVub3VnaCB0aGVuIHVzZSBpdC4KLSAqIDIuKSBJZiB0aGVyZSBpcyBub3QgYSBwcGM2NCxsaW51eCBwYXJ0aXRpb24gbGFyZ2UgZW5vdWdoLCBzZWFyY2gKLSAqIGZvciBhIGZyZWUgcGFydGl0aW9uIHRoYXQgaXMgbGFyZ2UgZW5vdWdoLgotICogMy4pIElmIHRoZXJlIGlzIG5vdCBhIGZyZWUgcGFydGl0aW9uIGxhcmdlIGVub3VnaCByZW1vdmUgCi0gKiBfYWxsXyBPUyBwYXJ0aXRpb25zIGFuZCBjb25zb2xpZGF0ZSB0aGUgc3BhY2UuCi0gKiA0LikgV2lsbCBmaXJzdCB0cnkgZ2V0dGluZyBhIGNodW5rIHRoYXQgd2lsbCBzYXRpc2Z5IHRoZSBtYXhpbXVtCi0gKiBlcnJvciBsb2cgc2l6ZSAoTlZSQU1fTUFYX1JFUSkuCi0gKiA1LikgSWYgdGhlIG1heCBjaHVuayBjYW5ub3QgYmUgYWxsb2NhdGVkIHRoZW4gdHJ5IGZpbmRpbmcgYSBjaHVuawotICogdGhhdCB3aWxsIHNhdGlzZnkgdGhlIG1pbnVtIG5lZWRlZCAoTlZSQU1fTUlOX1JFUSkuCi0gKi8KLXN0YXRpYyBpbnQgX19pbml0IG52cmFtX3NldHVwX3BhcnRpdGlvbih2b2lkKQotewotCXN0cnVjdCBsaXN0X2hlYWQgKiBwOwotCXN0cnVjdCBudnJhbV9wYXJ0aXRpb24gKiBwYXJ0OwotCWludCByYzsKLQotCS8qIEZvciBub3csIHdlIGRvbid0IGRvIGFueSBvZiB0aGlzIG9uIHBtYWMsIHVudGlsIEkKLQkgKiBoYXZlIGZpZ3VyZWQgb3V0IGlmIGl0J3Mgd29ydGgga2lsbGluZyBzb21lIHVudXNlZCBzdHVmZnMKLQkgKiBpbiBvdXIgbnZyYW0sIGFzIEFwcGxlIGRlZmluZWQgcGFydGl0aW9ucyB1c2UgcHJldHR5IG11Y2gKLQkgKiBhbGwgb2YgdGhlIHNwYWNlCi0JICovCi0JaWYgKG1hY2hpbmVfaXMocG93ZXJtYWMpKQotCQlyZXR1cm4gLUVOT1NQQzsKLQotCS8qIHNlZSBpZiB3ZSBoYXZlIGFuIE9TIHBhcnRpdGlvbiB0aGF0IG1lZXRzIG91ciBuZWVkcy4KLQkgICB3aWxsIHRyeSBnZXR0aW5nIHRoZSBtYXggd2UgbmVlZC4gIElmIG5vdCB3ZSdsbCBkZWxldGUKLQkgICBwYXJ0aXRpb25zIGFuZCB0cnkgYWdhaW4uICovCi0JbGlzdF9mb3JfZWFjaChwLCAmbnZyYW1fcGFydC0+cGFydGl0aW9uKSB7Ci0JCXBhcnQgPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCBudnJhbV9wYXJ0aXRpb24sIHBhcnRpdGlvbik7Ci0JCWlmIChwYXJ0LT5oZWFkZXIuc2lnbmF0dXJlICE9IE5WUkFNX1NJR19PUykKLQkJCWNvbnRpbnVlOwotCi0JCWlmIChzdHJjbXAocGFydC0+aGVhZGVyLm5hbWUsICJwcGM2NCxsaW51eCIpKQotCQkJY29udGludWU7Ci0KLQkJaWYgKHBhcnQtPmhlYWRlci5sZW5ndGggPj0gTlZSQU1fTUlOX1JFUSkgewotCQkJLyogZm91bmQgb3VyIHBhcnRpdGlvbiAqLwotCQkJbnZyYW1fZXJyb3JfbG9nX2luZGV4ID0gcGFydC0+aW5kZXggKyBOVlJBTV9IRUFERVJfTEVOOwotCQkJbnZyYW1fZXJyb3JfbG9nX3NpemUgPSAoKHBhcnQtPmhlYWRlci5sZW5ndGggLSAxKSAqCi0JCQkJCQlOVlJBTV9CTE9DS19MRU4pIC0gc2l6ZW9mKHN0cnVjdCBlcnJfbG9nX2luZm8pOwotCQkJcmV0dXJuIDA7CisJLyogQ2xlYXIgdGhlIG5ldyBwYXJ0aXRpb24gKi8KKwlmb3IgKHRtcF9pbmRleCA9IG5ld19wYXJ0LT5pbmRleCArIE5WUkFNX0hFQURFUl9MRU47CisJICAgICB0bXBfaW5kZXggPCAgKChzaXplIC0gMSkgKiBOVlJBTV9CTE9DS19MRU4pOworCSAgICAgdG1wX2luZGV4ICs9IE5WUkFNX0JMT0NLX0xFTikgeworCQlyYyA9IHBwY19tZC5udnJhbV93cml0ZShudl9pbml0X3ZhbHMsIE5WUkFNX0JMT0NLX0xFTiwgJnRtcF9pbmRleCk7CisJCWlmIChyYyA8PSAwKSB7CisJCQlwcl9lcnIoIm52cmFtX2NyZWF0ZV9wYXJ0aXRpb246IG52cmFtX3dyaXRlIGZhaWxlZCAoJWQpXG4iLCByYyk7CisJCQlyZXR1cm4gcmM7CiAJCX0KIAl9CiAJCi0JLyogdHJ5IGNyZWF0aW5nIGEgcGFydGl0aW9uIHdpdGggdGhlIGZyZWUgc3BhY2Ugd2UgaGF2ZSAqLwotCXJjID0gbnZyYW1fY3JlYXRlX29zX3BhcnRpdGlvbigpOwotCWlmICghcmMpIHsKLQkJcmV0dXJuIDA7Ci0JfQotCQkKLQkvKiBuZWVkIHRvIGZyZWUgdXAgc29tZSBzcGFjZSAqLwotCXJjID0gbnZyYW1fcmVtb3ZlX29zX3BhcnRpdGlvbigpOwotCWlmIChyYykgewotCQlyZXR1cm4gcmM7Ci0JfQorCXJldHVybiBuZXdfcGFydC0+aW5kZXggKyBOVlJBTV9IRUFERVJfTEVOOworfQorCisvKioKKyAqIG52cmFtX2dldF9wYXJ0aXRpb25fc2l6ZSAtIEdldCB0aGUgZGF0YSBzaXplIG9mIGFuIG52cmFtIHBhcnRpdGlvbgorICogQGRhdGFfaW5kZXg6IFRoaXMgaXMgdGhlIG9mZnNldCBvZiB0aGUgc3RhcnQgb2YgdGhlIGRhdGEgb2YKKyAqICAgICAgICAgICAgICB0aGUgcGFydGl0aW9uLiBUaGUgc2FtZSB2YWx1ZSB0aGF0IGlzIHJldHVybmVkIGJ5CisgKiAgICAgICAgICAgICAgbnZyYW1fY3JlYXRlX3BhcnRpdGlvbigpLgorICovCitpbnQgbnZyYW1fZ2V0X3BhcnRpdGlvbl9zaXplKGxvZmZfdCBkYXRhX2luZGV4KQoreworCXN0cnVjdCBudnJhbV9wYXJ0aXRpb24gKnBhcnQ7CiAJCi0JLyogY3JlYXRlIGEgcGFydGl0aW9uIGluIHRoaXMgbmV3IHNwYWNlICovCi0JcmMgPSBudnJhbV9jcmVhdGVfb3NfcGFydGl0aW9uKCk7Ci0JaWYgKHJjKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAibnZyYW1fY3JlYXRlX29zX3BhcnRpdGlvbjogQ291bGQgbm90IGZpbmQgYSAiCi0JCSAgICAgICAiTlZSQU0gcGFydGl0aW9uIGxhcmdlIGVub3VnaFxuIik7Ci0JCXJldHVybiByYzsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBhcnQsICZudnJhbV9wYXJ0aXRpb25zLCBwYXJ0aXRpb24pIHsKKwkJaWYgKHBhcnQtPmluZGV4ICsgTlZSQU1fSEVBREVSX0xFTiA9PSBkYXRhX2luZGV4KQorCQkJcmV0dXJuIChwYXJ0LT5oZWFkZXIubGVuZ3RoIC0gMSkgKiBOVlJBTV9CTE9DS19MRU47CiAJfQotCQotCXJldHVybiAwOworCXJldHVybiAtMTsKIH0KIAogCi1zdGF0aWMgaW50IF9faW5pdCBudnJhbV9zY2FuX3BhcnRpdGlvbnModm9pZCkKKy8qKgorICogbnZyYW1fZmluZF9wYXJ0aXRpb24gLSBGaW5kIGFuIG52cmFtIHBhcnRpdGlvbiBieSBzaWduYXR1cmUgYW5kIG5hbWUKKyAqIEBuYW1lOiBOYW1lIG9mIHRoZSBwYXJ0aXRpb24gb3IgTlVMTCBmb3IgYW55IG5hbWUKKyAqIEBzaWc6IFNpZ25hdHVyZSB0byB0ZXN0IGFnYWluc3QKKyAqIEBvdXRfc2l6ZTogaWYgbm9uLU5VTEwsIHJldHVybnMgdGhlIHNpemUgb2YgdGhlIGRhdGEgcGFydCBvZiB0aGUgcGFydGl0aW9uCisgKi8KK2xvZmZfdCBudnJhbV9maW5kX3BhcnRpdGlvbihjb25zdCBjaGFyICpuYW1lLCBpbnQgc2lnLCBpbnQgKm91dF9zaXplKQoreworCXN0cnVjdCBudnJhbV9wYXJ0aXRpb24gKnA7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHAsICZudnJhbV9wYXJ0aXRpb25zLCBwYXJ0aXRpb24pIHsKKwkJaWYgKHAtPmhlYWRlci5zaWduYXR1cmUgPT0gc2lnICYmCisJCSAgICAoIW5hbWUgfHwgIXN0cm5jbXAocC0+aGVhZGVyLm5hbWUsIG5hbWUsIDEyKSkpIHsKKwkJCWlmIChvdXRfc2l6ZSkKKwkJCQkqb3V0X3NpemUgPSAocC0+aGVhZGVyLmxlbmd0aCAtIDEpICoKKwkJCQkJTlZSQU1fQkxPQ0tfTEVOOworCQkJcmV0dXJuIHAtPmluZGV4ICsgTlZSQU1fSEVBREVSX0xFTjsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworaW50IF9faW5pdCBudnJhbV9zY2FuX3BhcnRpdGlvbnModm9pZCkKIHsKIAlsb2ZmX3QgY3VyX2luZGV4ID0gMDsKIAlzdHJ1Y3QgbnZyYW1faGVhZGVyIHBoZWFkOwpAQCAtNDY1LDcgKzQ1MSw3IEBACiAJaW50IHRvdGFsX3NpemU7CiAJaW50IGVycjsKIAotCWlmIChwcGNfbWQubnZyYW1fc2l6ZSA9PSBOVUxMKQorCWlmIChwcGNfbWQubnZyYW1fc2l6ZSA9PSBOVUxMIHx8IHBwY19tZC5udnJhbV9zaXplKCkgPD0gMCkKIAkJcmV0dXJuIC1FTk9ERVY7CiAJdG90YWxfc2l6ZSA9IHBwY19tZC5udnJhbV9zaXplKCk7CiAJCkBAIC01MTIsMTIgKzQ5OCwxNiBAQAogCQkKIAkJbWVtY3B5KCZ0bXBfcGFydC0+aGVhZGVyLCAmcGhlYWQsIE5WUkFNX0hFQURFUl9MRU4pOwogCQl0bXBfcGFydC0+aW5kZXggPSBjdXJfaW5kZXg7Ci0JCWxpc3RfYWRkX3RhaWwoJnRtcF9wYXJ0LT5wYXJ0aXRpb24sICZudnJhbV9wYXJ0LT5wYXJ0aXRpb24pOworCQlsaXN0X2FkZF90YWlsKCZ0bXBfcGFydC0+cGFydGl0aW9uLCAmbnZyYW1fcGFydGl0aW9ucyk7CiAJCQogCQljdXJfaW5kZXggKz0gcGhlYWQubGVuZ3RoICogTlZSQU1fQkxPQ0tfTEVOOwogCX0KIAllcnIgPSAwOwogCisjaWZkZWYgREVCVUdfTlZSQU0KKwludnJhbV9wcmludF9wYXJ0aXRpb25zKCJOVlJBTSBQYXJ0aXRpb25zIik7CisjZW5kaWYKKwogIG91dDoKIAlrZnJlZShoZWFkZXIpOwogCXJldHVybiBlcnI7CkBAIC01MjUsOSArNTE1LDEwIEBACiAKIHN0YXRpYyBpbnQgX19pbml0IG52cmFtX2luaXQodm9pZCkKIHsKLQlpbnQgZXJyb3I7CiAJaW50IHJjOwogCQorCUJVSUxEX0JVR19PTihOVlJBTV9CTE9DS19MRU4gIT0gMTYpOworCiAJaWYgKHBwY19tZC5udnJhbV9zaXplID09IE5VTEwgfHwgcHBjX21kLm52cmFtX3NpemUoKSA8PSAwKQogCQlyZXR1cm4gIC1FTk9ERVY7CiAKQEAgLTUzNywyOSArNTI4LDYgQEAKIAkJcmV0dXJuIHJjOwogCX0KICAgCQotICAJLyogaW5pdGlhbGl6ZSBvdXIgYW5jaG9yIGZvciB0aGUgbnZyYW0gcGFydGl0aW9uIGxpc3QgKi8KLSAgCW52cmFtX3BhcnQgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgbnZyYW1fcGFydGl0aW9uKSwgR0ZQX0tFUk5FTCk7Ci0gIAlpZiAoIW52cmFtX3BhcnQpIHsKLSAgCQlwcmludGsoS0VSTl9FUlIgIm52cmFtX2luaXQ6IEZhaWxlZCBrbWFsbG9jXG4iKTsKLSAgCQlyZXR1cm4gLUVOT01FTTsKLSAgCX0KLSAgCUlOSVRfTElTVF9IRUFEKCZudnJhbV9wYXJ0LT5wYXJ0aXRpb24pOwotICAKLSAgCS8qIEdldCBhbGwgdGhlIE5WUkFNIHBhcnRpdGlvbnMgKi8KLSAgCWVycm9yID0gbnZyYW1fc2Nhbl9wYXJ0aXRpb25zKCk7Ci0gIAlpZiAoZXJyb3IpIHsKLSAgCQlwcmludGsoS0VSTl9FUlIgIm52cmFtX2luaXQ6IEZhaWxlZCBudnJhbV9zY2FuX3BhcnRpdGlvbnNcbiIpOwotICAJCXJldHVybiBlcnJvcjsKLSAgCX0KLSAgCQkKLSAgCWlmKG52cmFtX3NldHVwX3BhcnRpdGlvbigpKSAKLSAgCQlwcmludGsoS0VSTl9XQVJOSU5HICJudnJhbV9pbml0OiBDb3VsZCBub3QgZmluZCBudnJhbSBwYXJ0aXRpb24iCi0gIAkJICAgICAgICIgZm9yIG52cmFtIGJ1ZmZlcmVkIGVycm9yIGxvZ2dpbmcuXG4iKTsKLSAgCi0jaWZkZWYgREVCVUdfTlZSQU0KLQludnJhbV9wcmludF9wYXJ0aXRpb25zKCJOVlJBTSBQYXJ0aXRpb25zIik7Ci0jZW5kaWYKLQogICAJcmV0dXJuIHJjOwogfQogCkBAIC01NjgsMTM1ICs1MzYsNiBAQAogICAgICAgICBtaXNjX2RlcmVnaXN0ZXIoICZudnJhbV9kZXYgKTsKIH0KIAotCi0jaWZkZWYgQ09ORklHX1BQQ19QU0VSSUVTCi0KLS8qIG52cmFtX3dyaXRlX2Vycm9yX2xvZwotICoKLSAqIFdlIG5lZWQgdG8gYnVmZmVyIHRoZSBlcnJvciBsb2dzIGludG8gbnZyYW0gdG8gZW5zdXJlIHRoYXQgd2UgaGF2ZQotICogdGhlIGZhaWx1cmUgaW5mb3JtYXRpb24gdG8gZGVjb2RlLiAgSWYgd2UgaGF2ZSBhIHNldmVyZSBlcnJvciB0aGVyZQotICogaXMgbm8gd2F5IHRvIGd1YXJhbnRlZSB0aGF0IHRoZSBPUyBvciB0aGUgbWFjaGluZSBpcyBpbiBhIHN0YXRlIHRvCi0gKiBnZXQgYmFjayB0byB1c2VyIGxhbmQgYW5kIHdyaXRlIHRoZSBlcnJvciB0byBkaXNrLiAgRm9yIGV4YW1wbGUgaWYKLSAqIHRoZSBTQ1NJIGRldmljZSBkcml2ZXIgY2F1c2VzIGEgTWFjaGluZSBDaGVjayBieSB3cml0aW5nIHRvIGEgYmFkCi0gKiBJTyBhZGRyZXNzLCB0aGVyZSBpcyBubyB3YXkgb2YgZ3VhcmFudGVlaW5nIHRoYXQgdGhlIGRldmljZSBkcml2ZXIKLSAqIGlzIGluIGFueSBzdGF0ZSB0aGF0IGlzIHdvdWxkIGFsc28gYmUgYWJsZSB0byB3cml0ZSB0aGUgZXJyb3IgZGF0YQotICogY2FwdHVyZWQgdG8gZGlzaywgdGh1cyB3ZSBidWZmZXIgaXQgaW4gTlZSQU0gZm9yIGFuYWx5c2lzIG9uIHRoZQotICogbmV4dCBib290LgotICoKLSAqIEluIE5WUkFNIHRoZSBwYXJ0aXRpb24gY29udGFpbmluZyB0aGUgZXJyb3IgbG9nIGJ1ZmZlciB3aWxsIGxvb2tzIGxpa2U6Ci0gKiBIZWFkZXIgKGluIGJ5dGVzKToKLSAqICstLS0tLS0tLS0tLSstLS0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0rCi0gKiB8IHNpZ25hdHVyZSB8IGNoZWNrc3VtIHwgbGVuZ3RoIHwgbmFtZSAgICAgICB8IGRhdGEgICAgICAgICAgICAgfAotICogfDAgICAgICAgICAgfDEgICAgICAgICB8MiAgICAgIDN8NCAgICAgICAgIDE1fDE2ICAgICAgICBsZW5ndGgtMXwKLSAqICstLS0tLS0tLS0tLSstLS0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0rCi0gKgotICogVGhlICdkYXRhJyBzZWN0aW9uIHdvdWxkIGxvb2sgbGlrZSAoaW4gYnl0ZXMpOgotICogKy0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLSAqIHwgZXZlbnRfbG9nZ2VkIHwgc2VxdWVuY2UgIyB8IGVycm9yIGxvZyAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8MCAgICAgICAgICAgIDN8NCAgICAgICAgICA3fDggICAgICAgICAgICBudnJhbV9lcnJvcl9sb2dfc2l6ZS0xfAotICogKy0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLSAqCi0gKiBldmVudF9sb2dnZWQ6IDAgaWYgZXZlbnQgaGFzIG5vdCBiZWVuIGxvZ2dlZCB0byBzeXNsb2csIDEgaWYgaXQgaGFzCi0gKiBzZXF1ZW5jZSAjOiBUaGUgdW5pcXVlIHNlcXVlbmNlICMgZm9yIGVhY2ggZXZlbnQuICh1bnRpbCBpdCB3cmFwcykKLSAqIGVycm9yIGxvZzogVGhlIGVycm9yIGxvZyBmcm9tIGV2ZW50X3NjYW4KLSAqLwotaW50IG52cmFtX3dyaXRlX2Vycm9yX2xvZyhjaGFyICogYnVmZiwgaW50IGxlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGVycl90eXBlLCB1bnNpZ25lZCBpbnQgZXJyb3JfbG9nX2NudCkKLXsKLQlpbnQgcmM7Ci0JbG9mZl90IHRtcF9pbmRleDsKLQlzdHJ1Y3QgZXJyX2xvZ19pbmZvIGluZm87Ci0JCi0JaWYgKG52cmFtX2Vycm9yX2xvZ19pbmRleCA9PSAtMSkgewotCQlyZXR1cm4gLUVTUElQRTsKLQl9Ci0KLQlpZiAobGVuZ3RoID4gbnZyYW1fZXJyb3JfbG9nX3NpemUpIHsKLQkJbGVuZ3RoID0gbnZyYW1fZXJyb3JfbG9nX3NpemU7Ci0JfQotCi0JaW5mby5lcnJvcl90eXBlID0gZXJyX3R5cGU7Ci0JaW5mby5zZXFfbnVtID0gZXJyb3JfbG9nX2NudDsKLQotCXRtcF9pbmRleCA9IG52cmFtX2Vycm9yX2xvZ19pbmRleDsKLQotCXJjID0gcHBjX21kLm52cmFtX3dyaXRlKChjaGFyICopJmluZm8sIHNpemVvZihzdHJ1Y3QgZXJyX2xvZ19pbmZvKSwgJnRtcF9pbmRleCk7Ci0JaWYgKHJjIDw9IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJudnJhbV93cml0ZV9lcnJvcl9sb2c6IEZhaWxlZCBudnJhbV93cml0ZSAoJWQpXG4iLCByYyk7Ci0JCXJldHVybiByYzsKLQl9Ci0KLQlyYyA9IHBwY19tZC5udnJhbV93cml0ZShidWZmLCBsZW5ndGgsICZ0bXBfaW5kZXgpOwotCWlmIChyYyA8PSAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAibnZyYW1fd3JpdGVfZXJyb3JfbG9nOiBGYWlsZWQgbnZyYW1fd3JpdGUgKCVkKVxuIiwgcmMpOwotCQlyZXR1cm4gcmM7Ci0JfQotCQotCXJldHVybiAwOwotfQotCi0vKiBudnJhbV9yZWFkX2Vycm9yX2xvZwotICoKLSAqIFJlYWRzIG52cmFtIGZvciBlcnJvciBsb2cgZm9yIGF0IG1vc3QgJ2xlbmd0aCcKLSAqLwotaW50IG52cmFtX3JlYWRfZXJyb3JfbG9nKGNoYXIgKiBidWZmLCBpbnQgbGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqIGVycl90eXBlLCB1bnNpZ25lZCBpbnQgKiBlcnJvcl9sb2dfY250KQotewotCWludCByYzsKLQlsb2ZmX3QgdG1wX2luZGV4OwotCXN0cnVjdCBlcnJfbG9nX2luZm8gaW5mbzsKLQkKLQlpZiAobnZyYW1fZXJyb3JfbG9nX2luZGV4ID09IC0xKQotCQlyZXR1cm4gLTE7Ci0KLQlpZiAobGVuZ3RoID4gbnZyYW1fZXJyb3JfbG9nX3NpemUpCi0JCWxlbmd0aCA9IG52cmFtX2Vycm9yX2xvZ19zaXplOwotCi0JdG1wX2luZGV4ID0gbnZyYW1fZXJyb3JfbG9nX2luZGV4OwotCi0JcmMgPSBwcGNfbWQubnZyYW1fcmVhZCgoY2hhciAqKSZpbmZvLCBzaXplb2Yoc3RydWN0IGVycl9sb2dfaW5mbyksICZ0bXBfaW5kZXgpOwotCWlmIChyYyA8PSAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAibnZyYW1fcmVhZF9lcnJvcl9sb2c6IEZhaWxlZCBudnJhbV9yZWFkICglZClcbiIsIHJjKTsKLQkJcmV0dXJuIHJjOwotCX0KLQotCXJjID0gcHBjX21kLm52cmFtX3JlYWQoYnVmZiwgbGVuZ3RoLCAmdG1wX2luZGV4KTsKLQlpZiAocmMgPD0gMCkgewotCQlwcmludGsoS0VSTl9FUlIgIm52cmFtX3JlYWRfZXJyb3JfbG9nOiBGYWlsZWQgbnZyYW1fcmVhZCAoJWQpXG4iLCByYyk7Ci0JCXJldHVybiByYzsKLQl9Ci0KLQkqZXJyb3JfbG9nX2NudCA9IGluZm8uc2VxX251bTsKLQkqZXJyX3R5cGUgPSBpbmZvLmVycm9yX3R5cGU7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyogVGhpcyBkb2Vzbid0IGFjdHVhbGx5IHplcm8gYW55dGhpbmcsIGJ1dCBpdCBzZXRzIHRoZSBldmVudF9sb2dnZWQKLSAqIHdvcmQgdG8gdGVsbCB0aGF0IHRoaXMgZXZlbnQgaXMgc2FmZWx5IGluIHN5c2xvZy4KLSAqLwotaW50IG52cmFtX2NsZWFyX2Vycm9yX2xvZyh2b2lkKQotewotCWxvZmZfdCB0bXBfaW5kZXg7Ci0JaW50IGNsZWFyX3dvcmQgPSBFUlJfRkxBR19BTFJFQURZX0xPR0dFRDsKLQlpbnQgcmM7Ci0KLQlpZiAobnZyYW1fZXJyb3JfbG9nX2luZGV4ID09IC0xKQotCQlyZXR1cm4gLTE7Ci0KLQl0bXBfaW5kZXggPSBudnJhbV9lcnJvcl9sb2dfaW5kZXg7Ci0JCi0JcmMgPSBwcGNfbWQubnZyYW1fd3JpdGUoKGNoYXIgKikmY2xlYXJfd29yZCwgc2l6ZW9mKGludCksICZ0bXBfaW5kZXgpOwotCWlmIChyYyA8PSAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAibnZyYW1fY2xlYXJfZXJyb3JfbG9nOiBGYWlsZWQgbnZyYW1fd3JpdGUgKCVkKVxuIiwgcmMpOwotCQlyZXR1cm4gcmM7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLSNlbmRpZiAvKiBDT05GSUdfUFBDX1BTRVJJRVMgKi8KLQogbW9kdWxlX2luaXQobnZyYW1faW5pdCk7CiBtb2R1bGVfZXhpdChudnJhbV9jbGVhbnVwKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcGNpXzY0LmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3BjaV82NC5jCmluZGV4IGQ0M2ZjNjUuLjg1MTU3NzYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcGNpXzY0LmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wY2lfNjQuYwpAQCAtMTkzLDggKzE5Myw3IEBACiAJaG9zZS0+aW9fcmVzb3VyY2Uuc3RhcnQgKz0gaW9fdmlydF9vZmZzZXQ7CiAJaG9zZS0+aW9fcmVzb3VyY2UuZW5kICs9IGlvX3ZpcnRfb2Zmc2V0OwogCi0JcHJfZGVidWcoIiAgaG9zZS0+aW9fcmVzb3VyY2U9MHglMDE2bGx4Li4uMHglMDE2bGx4XG4iLAotCQkgaG9zZS0+aW9fcmVzb3VyY2Uuc3RhcnQsIGhvc2UtPmlvX3Jlc291cmNlLmVuZCk7CisJcHJfZGVidWcoIiAgaG9zZS0+aW9fcmVzb3VyY2U9JXBSXG4iLCAmaG9zZS0+aW9fcmVzb3VyY2UpOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3BwY19rc3ltcy5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wcGNfa3N5bXMuYwppbmRleCBhYjNlMzkyLi5lZjNlZjU2IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3BwY19rc3ltcy5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHBjX2tzeW1zLmMKQEAgLTE4NiwzICsxODYsMTAgQEAKIEVYUE9SVF9TWU1CT0woX19tZmRjcik7CiAjZW5kaWYKIEVYUE9SVF9TWU1CT0woZW1wdHlfemVyb19wYWdlKTsKKworI2lmZGVmIENPTkZJR19QUEM2NAorRVhQT1JUX1NZTUJPTChfX2FyY2hfaHdlaWdodDgpOworRVhQT1JUX1NZTUJPTChfX2FyY2hfaHdlaWdodDE2KTsKK0VYUE9SVF9TWU1CT0woX19hcmNoX2h3ZWlnaHQzMik7CitFWFBPUlRfU1lNQk9MKF9fYXJjaF9od2VpZ2h0NjQpOworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3BwY19zYXZlX3JlZ3MuUyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHBjX3NhdmVfcmVncy5TCmluZGV4IDUxMTNiZDIuLmU4M2JhM2YgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHBjX3NhdmVfcmVncy5TCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHBjX3NhdmVfcmVncy5TCkBAIC0xMSw2ICsxMSw3IEBACiAjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgogI2luY2x1ZGUgPGFzbS9wcGNfYXNtLmg+CiAjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CisjaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgogCiAvKgogICogR3JhYiB0aGUgcmVnaXN0ZXIgdmFsdWVzIGFzIHRoZXkgYXJlIG5vdy4KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHJvbV9wYXJzZS5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wcm9tX3BhcnNlLmMKaW5kZXggODgzMzRhZi4uYzJiN2EwNyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wcm9tX3BhcnNlLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wcm9tX3BhcnNlLmMKQEAgLTExNyw0MSArMTE3LDMgQEAKIAljZWxscyA9IHByb3AgPyAqKHUzMiAqKXByb3AgOiBvZl9uX3NpemVfY2VsbHMoZG4pOwogCSpzaXplID0gb2ZfcmVhZF9udW1iZXIoZG1hX3dpbmRvdywgY2VsbHMpOwogfQotCi0vKioKLSAqIFNlYXJjaCB0aGUgZGV2aWNlIHRyZWUgZm9yIHRoZSBiZXN0IE1BQyBhZGRyZXNzIHRvIHVzZS4gICdtYWMtYWRkcmVzcycgaXMKLSAqIGNoZWNrZWQgZmlyc3QsIGJlY2F1c2UgdGhhdCBpcyBzdXBwb3NlZCB0byBjb250YWluIHRvICJtb3N0IHJlY2VudCIgTUFDCi0gKiBhZGRyZXNzLiBJZiB0aGF0IGlzbid0IHNldCwgdGhlbiAnbG9jYWwtbWFjLWFkZHJlc3MnIGlzIGNoZWNrZWQgbmV4dCwKLSAqIGJlY2F1c2UgdGhhdCBpcyB0aGUgZGVmYXVsdCBhZGRyZXNzLiAgSWYgdGhhdCBpc24ndCBzZXQsIHRoZW4gdGhlIG9ic29sZXRlCi0gKiAnYWRkcmVzcycgaXMgY2hlY2tlZCwganVzdCBpbiBjYXNlIHdlJ3JlIHVzaW5nIGFuIG9sZCBkZXZpY2UgdHJlZS4KLSAqCi0gKiBOb3RlIHRoYXQgdGhlICdhZGRyZXNzJyBwcm9wZXJ0eSBpcyBzdXBwb3NlZCB0byBjb250YWluIGEgdmlydHVhbCBhZGRyZXNzIG9mCi0gKiB0aGUgcmVnaXN0ZXIgc2V0LCBidXQgc29tZSBEVFMgZmlsZXMgaGF2ZSByZWRlZmluZWQgdGhhdCBwcm9wZXJ0eSB0byBiZSB0aGUKLSAqIE1BQyBhZGRyZXNzLgotICoKLSAqIEFsbC16ZXJvIE1BQyBhZGRyZXNzZXMgYXJlIHJlamVjdGVkLCBiZWNhdXNlIHRob3NlIGNvdWxkIGJlIHByb3BlcnRpZXMgdGhhdAotICogZXhpc3QgaW4gdGhlIGRldmljZSB0cmVlLCBidXQgd2VyZSBub3Qgc2V0IGJ5IFUtQm9vdC4gIEZvciBleGFtcGxlLCB0aGUKLSAqIERUUyBjb3VsZCBkZWZpbmUgJ21hYy1hZGRyZXNzJyBhbmQgJ2xvY2FsLW1hYy1hZGRyZXNzJywgd2l0aCB6ZXJvIE1BQwotICogYWRkcmVzc2VzLiAgU29tZSBvbGRlciBVLUJvb3RzIG9ubHkgaW5pdGlhbGl6ZWQgJ2xvY2FsLW1hYy1hZGRyZXNzJy4gIEluCi0gKiB0aGlzIGNhc2UsIHRoZSByZWFsIE1BQyBpcyBpbiAnbG9jYWwtbWFjLWFkZHJlc3MnLCBhbmQgJ21hYy1hZGRyZXNzJyBleGlzdHMKLSAqIGJ1dCBpcyBhbGwgemVyb3MuCi0qLwotY29uc3Qgdm9pZCAqb2ZfZ2V0X21hY19hZGRyZXNzKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApCi17Ci0Jc3RydWN0IHByb3BlcnR5ICpwcDsKLQotCXBwID0gb2ZfZmluZF9wcm9wZXJ0eShucCwgIm1hYy1hZGRyZXNzIiwgTlVMTCk7Ci0JaWYgKHBwICYmIChwcC0+bGVuZ3RoID09IDYpICYmIGlzX3ZhbGlkX2V0aGVyX2FkZHIocHAtPnZhbHVlKSkKLQkJcmV0dXJuIHBwLT52YWx1ZTsKLQotCXBwID0gb2ZfZmluZF9wcm9wZXJ0eShucCwgImxvY2FsLW1hYy1hZGRyZXNzIiwgTlVMTCk7Ci0JaWYgKHBwICYmIChwcC0+bGVuZ3RoID09IDYpICYmIGlzX3ZhbGlkX2V0aGVyX2FkZHIocHAtPnZhbHVlKSkKLQkJcmV0dXJuIHBwLT52YWx1ZTsKLQotCXBwID0gb2ZfZmluZF9wcm9wZXJ0eShucCwgImFkZHJlc3MiLCBOVUxMKTsKLQlpZiAocHAgJiYgKHBwLT5sZW5ndGggPT0gNikgJiYgaXNfdmFsaWRfZXRoZXJfYWRkcihwcC0+dmFsdWUpKQotCQlyZXR1cm4gcHAtPnZhbHVlOwotCi0JcmV0dXJuIE5VTEw7Ci19Ci1FWFBPUlRfU1lNQk9MKG9mX2dldF9tYWNfYWRkcmVzcyk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3B0cmFjZS5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wdHJhY2UuYwppbmRleCBhOWIzMjk2Li45MDY1MzY5IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3B0cmFjZS5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHRyYWNlLmMKQEAgLTEzMTYsNiArMTMxNiwxMCBAQAogc3RhdGljIGxvbmcgcHBjX3NldF9od2RlYnVnKHN0cnVjdCB0YXNrX3N0cnVjdCAqY2hpbGQsCiAJCSAgICAgc3RydWN0IHBwY19od19icmVha3BvaW50ICpicF9pbmZvKQogeworI2lmbmRlZiBDT05GSUdfUFBDX0FEVl9ERUJVR19SRUdTCisJdW5zaWduZWQgbG9uZyBkYWJyOworI2VuZGlmCisKIAlpZiAoYnBfaW5mby0+dmVyc2lvbiAhPSAxKQogCQlyZXR1cm4gLUVOT1RTVVBQOwogI2lmZGVmIENPTkZJR19QUENfQURWX0RFQlVHX1JFR1MKQEAgLTEzNTMsMTEgKzEzNTcsMTAgQEAKIAkvKgogCSAqIFdlIG9ubHkgc3VwcG9ydCBvbmUgZGF0YSBicmVha3BvaW50CiAJICovCi0JaWYgKCgoYnBfaW5mby0+dHJpZ2dlcl90eXBlICYgUFBDX0JSRUFLUE9JTlRfVFJJR0dFUl9SVykgPT0gMCkgfHwKLQkgICAgKChicF9pbmZvLT50cmlnZ2VyX3R5cGUgJiB+UFBDX0JSRUFLUE9JTlRfVFJJR0dFUl9SVykgIT0gMCkgfHwKLQkgICAgKGJwX2luZm8tPnRyaWdnZXJfdHlwZSAhPSBQUENfQlJFQUtQT0lOVF9UUklHR0VSX1dSSVRFKSB8fAotCSAgICAoYnBfaW5mby0+YWRkcl9tb2RlICE9IFBQQ19CUkVBS1BPSU5UX01PREVfRVhBQ1QpIHx8Ci0JICAgIChicF9pbmZvLT5jb25kaXRpb25fbW9kZSAhPSBQUENfQlJFQUtQT0lOVF9DT05ESVRJT05fTk9ORSkpCisJaWYgKChicF9pbmZvLT50cmlnZ2VyX3R5cGUgJiBQUENfQlJFQUtQT0lOVF9UUklHR0VSX1JXKSA9PSAwIHx8CisJICAgIChicF9pbmZvLT50cmlnZ2VyX3R5cGUgJiB+UFBDX0JSRUFLUE9JTlRfVFJJR0dFUl9SVykgIT0gMCB8fAorCSAgICBicF9pbmZvLT5hZGRyX21vZGUgIT0gUFBDX0JSRUFLUE9JTlRfTU9ERV9FWEFDVCB8fAorCSAgICBicF9pbmZvLT5jb25kaXRpb25fbW9kZSAhPSBQUENfQlJFQUtQT0lOVF9DT05ESVRJT05fTk9ORSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlpZiAoY2hpbGQtPnRocmVhZC5kYWJyKQpAQCAtMTM2Niw3ICsxMzY5LDE0IEBACiAJaWYgKCh1bnNpZ25lZCBsb25nKWJwX2luZm8tPmFkZHIgPj0gVEFTS19TSVpFKQogCQlyZXR1cm4gLUVJTzsKIAotCWNoaWxkLT50aHJlYWQuZGFiciA9ICh1bnNpZ25lZCBsb25nKWJwX2luZm8tPmFkZHI7CisJZGFiciA9ICh1bnNpZ25lZCBsb25nKWJwX2luZm8tPmFkZHIgJiB+N1VMOworCWRhYnIgfD0gREFCUl9UUkFOU0xBVElPTjsKKwlpZiAoYnBfaW5mby0+dHJpZ2dlcl90eXBlICYgUFBDX0JSRUFLUE9JTlRfVFJJR0dFUl9SRUFEKQorCQlkYWJyIHw9IERBQlJfREFUQV9SRUFEOworCWlmIChicF9pbmZvLT50cmlnZ2VyX3R5cGUgJiBQUENfQlJFQUtQT0lOVF9UUklHR0VSX1dSSVRFKQorCQlkYWJyIHw9IERBQlJfREFUQV9XUklURTsKKworCWNoaWxkLT50aHJlYWQuZGFiciA9IGRhYnI7CiAKIAlyZXR1cm4gMTsKICNlbmRpZiAvKiAhQ09ORklHX1BQQ19BRFZfREVCVUdfRFZDUyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wdHJhY2UzMi5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wdHJhY2UzMi5jCmluZGV4IDhhNmRhZjQuLjY5YzRiZTkgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHRyYWNlMzIuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3B0cmFjZTMyLmMKQEAgLTI4MCw3ICsyODAsMTEgQEAKIAkJLyogV2Ugb25seSBzdXBwb3J0IG9uZSBEQUJSIGFuZCBubyBJQUJSUyBhdCB0aGUgbW9tZW50ICovCiAJCWlmIChhZGRyID4gMCkKIAkJCWJyZWFrOworI2lmZGVmIENPTkZJR19QUENfQURWX0RFQlVHX1JFR1MKKwkJcmV0ID0gcHV0X3VzZXIoY2hpbGQtPnRocmVhZC5kYWMxLCAodTMyIF9fdXNlciAqKWRhdGEpOworI2Vsc2UKIAkJcmV0ID0gcHV0X3VzZXIoY2hpbGQtPnRocmVhZC5kYWJyLCAodTMyIF9fdXNlciAqKWRhdGEpOworI2VuZGlmCiAJCWJyZWFrOwogCX0KIApAQCAtMzEyLDYgKzMxNiw5IEBACiAJY2FzZSBQVFJBQ0VfU0VUX0RFQlVHUkVHOgogCWNhc2UgUFRSQUNFX1NZU0NBTEw6CiAJY2FzZSBQVFJBQ0VfQ09OVDoKKwljYXNlIFBQQ19QVFJBQ0VfR0VUSFdEQkdJTkZPOgorCWNhc2UgUFBDX1BUUkFDRV9TRVRIV0RFQlVHOgorCWNhc2UgUFBDX1BUUkFDRV9ERUxIV0RFQlVHOgogCQlyZXQgPSBhcmNoX3B0cmFjZShjaGlsZCwgcmVxdWVzdCwgYWRkciwgZGF0YSk7CiAJCWJyZWFrOwogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3J0YXMuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcnRhcy5jCmluZGV4IDhmZThiYzYuLjIwOTdmMmIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcnRhcy5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcnRhcy5jCkBAIC00MSw2ICs0MSw3IEBACiAjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgogI2luY2x1ZGUgPGFzbS90aW1lLmg+CiAjaW5jbHVkZSA8YXNtL21tdS5oPgorI2luY2x1ZGUgPGFzbS90b3BvbG9neS5oPgogCiBzdHJ1Y3QgcnRhc190IHJ0YXMgPSB7CiAJLmxvY2sgPSBfX0FSQ0hfU1BJTl9MT0NLX1VOTE9DS0VECkBAIC03MTMsNiArNzE0LDcgQEAKIAlpbnQgY3B1OwogCiAJc2xiX3NldF9zaXplKFNMQl9NSU5fU0laRSk7CisJc3RvcF90b3BvbG9neV91cGRhdGUoKTsKIAlwcmludGsoS0VSTl9ERUJVRyAiY2FsbGluZyBpYm0sc3VzcGVuZC1tZSBvbiBjcHUgJWlcbiIsIHNtcF9wcm9jZXNzb3JfaWQoKSk7CiAKIAl3aGlsZSAocmMgPT0gSF9NVUxUSV9USFJFQURTX0FDVElWRSAmJiAhYXRvbWljX3JlYWQoJmRhdGEtPmRvbmUpICYmCkBAIC03MjgsNiArNzMwLDcgQEAKIAkJcmMgPSBhdG9taWNfcmVhZCgmZGF0YS0+ZXJyb3IpOwogCiAJYXRvbWljX3NldCgmZGF0YS0+ZXJyb3IsIHJjKTsKKwlzdGFydF90b3BvbG9neV91cGRhdGUoKTsKIAogCWlmICh3YWtlX3doZW5fZG9uZSkgewogCQlhdG9taWNfc2V0KCZkYXRhLT5kb25lLCAxKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvc2V0dXBfNjQuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvc2V0dXBfNjQuYwppbmRleCBjZTZmNjFjLi41YTA0MDFmIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3NldHVwXzY0LmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9zZXR1cF82NC5jCkBAIC00MzcsOCArNDM3LDggQEAKIAl1bnNpZ25lZCBpbnQgaTsKIAogCS8qCi0JICogaW50ZXJydXB0IHN0YWNrcyBtdXN0IGJlIHVuZGVyIDI1Nk1CLCB3ZSBjYW5ub3QgYWZmb3JkIHRvIHRha2UKLQkgKiBTTEIgbWlzc2VzIG9uIHRoZW0uCisJICogSW50ZXJydXB0IHN0YWNrcyBtdXN0IGJlIGluIHRoZSBmaXJzdCBzZWdtZW50IHNpbmNlIHdlCisJICogY2Fubm90IGFmZm9yZCB0byB0YWtlIFNMQiBtaXNzZXMgb24gdGhlbS4KIAkgKi8KIAlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoaSkgewogCQlzb2Z0aXJxX2N0eFtpXSA9IChzdHJ1Y3QgdGhyZWFkX2luZm8gKikKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvc21wLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3NtcC5jCmluZGV4IDY4MDM0YmIuLjk4MTM2MDUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvc21wLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9zbXAuYwpAQCAtNDY2LDcgKzQ2NiwyMCBAQAogCXJldHVybiBpZDsKIH0KIAotLyogTXVzdCBiZSBjYWxsZWQgd2hlbiBubyBjaGFuZ2UgY2FuIG9jY3VyIHRvIGNwdV9wcmVzZW50X21hc2ssCisvKiBIZWxwZXIgcm91dGluZXMgZm9yIGNwdSB0byBjb3JlIG1hcHBpbmcgKi8KK2ludCBjcHVfY29yZV9pbmRleF9vZl90aHJlYWQoaW50IGNwdSkKK3sKKwlyZXR1cm4gY3B1ID4+IHRocmVhZHNfc2hpZnQ7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChjcHVfY29yZV9pbmRleF9vZl90aHJlYWQpOworCitpbnQgY3B1X2ZpcnN0X3RocmVhZF9vZl9jb3JlKGludCBjb3JlKQoreworCXJldHVybiBjb3JlIDw8IHRocmVhZHNfc2hpZnQ7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChjcHVfZmlyc3RfdGhyZWFkX29mX2NvcmUpOworCisvKiBNdXN0IGJlIGNhbGxlZCB3aGVuIG5vIGNoYW5nZSBjYW4gb2NjdXIgdG8gY3B1X3ByZXNlbnRfbWFwLAogICogaS5lLiBkdXJpbmcgY3B1IG9ubGluZSBvciBvZmZsaW5lLgogICovCiBzdGF0aWMgc3RydWN0IGRldmljZV9ub2RlICpjcHVfdG9fbDJjYWNoZShpbnQgY3B1KQpAQCAtNTE0LDcgKzUyNyw3IEBACiAJbm90aWZ5X2NwdV9zdGFydGluZyhjcHUpOwogCXNldF9jcHVfb25saW5lKGNwdSwgdHJ1ZSk7CiAJLyogVXBkYXRlIHNpYmxpbmcgbWFwcyAqLwotCWJhc2UgPSBjcHVfZmlyc3RfdGhyZWFkX2luX2NvcmUoY3B1KTsKKwliYXNlID0gY3B1X2ZpcnN0X3RocmVhZF9zaWJsaW5nKGNwdSk7CiAJZm9yIChpID0gMDsgaSA8IHRocmVhZHNfcGVyX2NvcmU7IGkrKykgewogCQlpZiAoY3B1X2lzX29mZmxpbmUoYmFzZSArIGkpKQogCQkJY29udGludWU7CkBAIC02MDAsNyArNjEzLDcgQEAKIAkJcmV0dXJuIGVycjsKIAogCS8qIFVwZGF0ZSBzaWJsaW5nIG1hcHMgKi8KLQliYXNlID0gY3B1X2ZpcnN0X3RocmVhZF9pbl9jb3JlKGNwdSk7CisJYmFzZSA9IGNwdV9maXJzdF90aHJlYWRfc2libGluZyhjcHUpOwogCWZvciAoaSA9IDA7IGkgPCB0aHJlYWRzX3Blcl9jb3JlOyBpKyspIHsKIAkJY3B1bWFza19jbGVhcl9jcHUoY3B1LCBjcHVfc2libGluZ19tYXNrKGJhc2UgKyBpKSk7CiAJCWNwdW1hc2tfY2xlYXJfY3B1KGJhc2UgKyBpLCBjcHVfc2libGluZ19tYXNrKGNwdSkpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC90aW1lLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3RpbWUuYwppbmRleCAwMTA0MDY5Li4wOWU0ZGVhIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3RpbWUuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3RpbWUuYwpAQCAtMTU1LDcgKzE1NSw3IEBACiAKIHN0YXRpYyB1NjQgdGJfdG9fbnNfc2NhbGUgX19yZWFkX21vc3RseTsKIHN0YXRpYyB1bnNpZ25lZCB0Yl90b19uc19zaGlmdCBfX3JlYWRfbW9zdGx5Owotc3RhdGljIHVuc2lnbmVkIGxvbmcgYm9vdF90YiBfX3JlYWRfbW9zdGx5Oworc3RhdGljIHU2NCBib290X3RiIF9fcmVhZF9tb3N0bHk7CiAKIGV4dGVybiBzdHJ1Y3QgdGltZXpvbmUgc3lzX3R6Owogc3RhdGljIGxvbmcgdGltZXpvbmVfb2Zmc2V0OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC92ZWN0b3IuUyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvdmVjdG9yLlMKaW5kZXggZmU0NjA0OC4uOWRlNmYzOSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC92ZWN0b3IuUworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3ZlY3Rvci5TCkBAIC01LDYgKzUsNyBAQAogI2luY2x1ZGUgPGFzbS9jcHV0YWJsZS5oPgogI2luY2x1ZGUgPGFzbS90aHJlYWRfaW5mby5oPgogI2luY2x1ZGUgPGFzbS9wYWdlLmg+CisjaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgogCiAvKgogICogbG9hZF91cF9hbHRpdmVjKHVudXNlZCwgdW51c2VkLCB0c2spCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3Zpby5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC92aW8uYwppbmRleCA0NDFkMmE3Li4xYjY5NWZkIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3Zpby5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvdmlvLmMKQEAgLTYwMCw2ICs2MDAsMTEgQEAKIAl2aW9fY21vX2RlYWxsb2ModmlvZGV2LCBhbGxvY19zaXplKTsKIH0KIAorc3RhdGljIGludCB2aW9fZG1hX2lvbW11X2RtYV9zdXBwb3J0ZWQoc3RydWN0IGRldmljZSAqZGV2LCB1NjQgbWFzaykKK3sKKyAgICAgICAgcmV0dXJuIGRtYV9pb21tdV9vcHMuZG1hX3N1cHBvcnRlZChkZXYsIG1hc2spOworfQorCiBzdHJ1Y3QgZG1hX21hcF9vcHMgdmlvX2RtYV9tYXBwaW5nX29wcyA9IHsKIAkuYWxsb2NfY29oZXJlbnQgPSB2aW9fZG1hX2lvbW11X2FsbG9jX2NvaGVyZW50LAogCS5mcmVlX2NvaGVyZW50ICA9IHZpb19kbWFfaW9tbXVfZnJlZV9jb2hlcmVudCwKQEAgLTYwNyw2ICs2MTIsNyBAQAogCS51bm1hcF9zZyAgICAgICA9IHZpb19kbWFfaW9tbXVfdW5tYXBfc2csCiAJLm1hcF9wYWdlICAgICAgID0gdmlvX2RtYV9pb21tdV9tYXBfcGFnZSwKIAkudW5tYXBfcGFnZSAgICAgPSB2aW9fZG1hX2lvbW11X3VubWFwX3BhZ2UsCisJLmRtYV9zdXBwb3J0ZWQgID0gdmlvX2RtYV9pb21tdV9kbWFfc3VwcG9ydGVkLAogCiB9OwogCkBAIC04NTgsOCArODY0LDcgQEAKIAogc3RhdGljIHZvaWQgdmlvX2Ntb19zZXRfZG1hX29wcyhzdHJ1Y3QgdmlvX2RldiAqdmlvZGV2KQogewotCXZpb19kbWFfbWFwcGluZ19vcHMuZG1hX3N1cHBvcnRlZCA9IGRtYV9pb21tdV9vcHMuZG1hX3N1cHBvcnRlZDsKLQl2aW9kZXYtPmRldi5hcmNoZGF0YS5kbWFfb3BzID0gJnZpb19kbWFfbWFwcGluZ19vcHM7CisJc2V0X2RtYV9vcHMoJnZpb2Rldi0+ZGV2LCAmdmlvX2RtYV9tYXBwaW5nX29wcyk7CiB9CiAKIC8qKgpAQCAtMTI0NCw3ICsxMjQ5LDcgQEAKIAlpZiAoZmlybXdhcmVfaGFzX2ZlYXR1cmUoRldfRkVBVFVSRV9DTU8pKQogCQl2aW9fY21vX3NldF9kbWFfb3BzKHZpb2Rldik7CiAJZWxzZQotCQl2aW9kZXYtPmRldi5hcmNoZGF0YS5kbWFfb3BzID0gJmRtYV9pb21tdV9vcHM7CisJCXNldF9kbWFfb3BzKCZ2aW9kZXYtPmRldiwgJmRtYV9pb21tdV9vcHMpOwogCXNldF9pb21tdV90YWJsZV9iYXNlKCZ2aW9kZXYtPmRldiwgdmlvX2J1aWxkX2lvbW11X3RhYmxlKHZpb2RldikpOwogCXNldF9kZXZfbm9kZSgmdmlvZGV2LT5kZXYsIG9mX25vZGVfdG9fbmlkKG9mX25vZGUpKTsKIApAQCAtMTI1Miw2ICsxMjU3LDEwIEBACiAJdmlvZGV2LT5kZXYucGFyZW50ID0gJnZpb19idXNfZGV2aWNlLmRldjsKIAl2aW9kZXYtPmRldi5idXMgPSAmdmlvX2J1c190eXBlOwogCXZpb2Rldi0+ZGV2LnJlbGVhc2UgPSB2aW9fZGV2X3JlbGVhc2U7CisgICAgICAgIC8qIG5lZWRlZCB0byBlbnN1cmUgcHJvcGVyIG9wZXJhdGlvbiBvZiBjb2hlcmVudCBhbGxvY2F0aW9ucworICAgICAgICAgKiBsYXRlciwgaW4gY2FzZSBkcml2ZXIgZG9lc24ndCBzZXQgaXQgZXhwbGljaXRseSAqLworICAgICAgICBkbWFfc2V0X21hc2soJnZpb2Rldi0+ZGV2LCBETUFfQklUX01BU0soNjQpKTsKKyAgICAgICAgZG1hX3NldF9jb2hlcmVudF9tYXNrKCZ2aW9kZXYtPmRldiwgRE1BX0JJVF9NQVNLKDY0KSk7CiAKIAkvKiByZWdpc3RlciB3aXRoIGdlbmVyaWMgZGV2aWNlIGZyYW1ld29yayAqLwogCWlmIChkZXZpY2VfcmVnaXN0ZXIoJnZpb2Rldi0+ZGV2KSkgewpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2xpYi9NYWtlZmlsZSBiL2FyY2gvcG93ZXJwYy9saWIvTWFrZWZpbGUKaW5kZXggODg5ZjJiYy4uMTY2YTZhMCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2xpYi9NYWtlZmlsZQorKysgYi9hcmNoL3Bvd2VycGMvbGliL01ha2VmaWxlCkBAIC0xNiw3ICsxNiw3IEBACiAKIG9iai0kKENPTkZJR19QUEM2NCkJKz0gY29weXBhZ2VfNjQubyBjb3B5dXNlcl82NC5vIFwKIAkJCSAgIG1lbWNweV82NC5vIHVzZXJjb3B5XzY0Lm8gbWVtXzY0Lm8gc3RyaW5nLm8gXAotCQkJICAgY2hlY2tzdW1fd3JhcHBlcnNfNjQubworCQkJICAgY2hlY2tzdW1fd3JhcHBlcnNfNjQubyBod2VpZ2h0XzY0Lm8KIG9iai0kKENPTkZJR19YTU9OKQkrPSBzc3RlcC5vIGxkc3RmcC5vCiBvYmotJChDT05GSUdfS1BST0JFUykJKz0gc3N0ZXAubyBsZHN0ZnAubwogb2JqLSQoQ09ORklHX0hBVkVfSFdfQlJFQUtQT0lOVCkJKz0gc3N0ZXAubyBsZHN0ZnAubwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2xpYi9od2VpZ2h0XzY0LlMgYi9hcmNoL3Bvd2VycGMvbGliL2h3ZWlnaHRfNjQuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZGEyNzg2Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2xpYi9od2VpZ2h0XzY0LlMKQEAgLTAsMCArMSwxMTAgQEAKKy8qCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIENvcHlyaWdodCAoQykgSUJNIENvcnBvcmF0aW9uLCAyMDEwCisgKgorICogQXV0aG9yOiBBbnRvbiBCbGFuY2hhcmQgPGFudG9uQGF1LmlibS5jb20+CisgKi8KKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8YXNtL3BwY19hc20uaD4KKworLyogTm90ZTogVGhpcyBjb2RlIHJlbGllcyBvbiAtbW1pbmltYWwtdG9jICovCisKK19HTE9CQUwoX19hcmNoX2h3ZWlnaHQ4KQorQkVHSU5fRlRSX1NFQ1RJT04KKwliIC5fX3N3X2h3ZWlnaHQ4CisJbm9wCisJbm9wCitGVFJfU0VDVElPTl9FTFNFCisJUFBDX1BPUENOVEIocjMscjMpCisJY2xybGRpCXIzLHIzLDY0LTgKKwlibHIKK0FMVF9GVFJfU0VDVElPTl9FTkRfSUZDTFIoQ1BVX0ZUUl9QT1BDTlRCKQorCitfR0xPQkFMKF9fYXJjaF9od2VpZ2h0MTYpCitCRUdJTl9GVFJfU0VDVElPTgorCWIgLl9fc3dfaHdlaWdodDE2CisJbm9wCisJbm9wCisJbm9wCisJbm9wCitGVFJfU0VDVElPTl9FTFNFCisgIEJFR0lOX0ZUUl9TRUNUSU9OX05FU1RFRCg1MCkKKwlQUENfUE9QQ05UQihyMyxyMykKKwlzcmRpCXI0LHIzLDgKKwlhZGQJcjMscjQscjMKKwljbHJsZGkJcjMscjMsNjQtOAorCWJscgorICBGVFJfU0VDVElPTl9FTFNFX05FU1RFRCg1MCkKKwljbHJsd2kgIHIzLHIzLDE2CisJUFBDX1BPUENOVFcocjMscjMpCisJY2xybGRpCXIzLHIzLDY0LTgKKwlibHIKKyAgQUxUX0ZUUl9TRUNUSU9OX0VORF9ORVNURURfSUZDTFIoQ1BVX0ZUUl9QT1BDTlRELCA1MCkKK0FMVF9GVFJfU0VDVElPTl9FTkRfSUZDTFIoQ1BVX0ZUUl9QT1BDTlRCKQorCitfR0xPQkFMKF9fYXJjaF9od2VpZ2h0MzIpCitCRUdJTl9GVFJfU0VDVElPTgorCWIgLl9fc3dfaHdlaWdodDMyCisJbm9wCisJbm9wCisJbm9wCisJbm9wCisJbm9wCisJbm9wCitGVFJfU0VDVElPTl9FTFNFCisgIEJFR0lOX0ZUUl9TRUNUSU9OX05FU1RFRCg1MSkKKwlQUENfUE9QQ05UQihyMyxyMykKKwlzcmRpCXI0LHIzLDE2CisJYWRkCXIzLHI0LHIzCisJc3JkaQlyNCxyMyw4CisJYWRkCXIzLHI0LHIzCisJY2xybGRpCXIzLHIzLDY0LTgKKwlibHIKKyAgRlRSX1NFQ1RJT05fRUxTRV9ORVNURUQoNTEpCisJUFBDX1BPUENOVFcocjMscjMpCisJY2xybGRpCXIzLHIzLDY0LTgKKwlibHIKKyAgQUxUX0ZUUl9TRUNUSU9OX0VORF9ORVNURURfSUZDTFIoQ1BVX0ZUUl9QT1BDTlRELCA1MSkKK0FMVF9GVFJfU0VDVElPTl9FTkRfSUZDTFIoQ1BVX0ZUUl9QT1BDTlRCKQorCitfR0xPQkFMKF9fYXJjaF9od2VpZ2h0NjQpCitCRUdJTl9GVFJfU0VDVElPTgorCWIgLl9fc3dfaHdlaWdodDY0CisJbm9wCisJbm9wCisJbm9wCisJbm9wCisJbm9wCisJbm9wCisJbm9wCisJbm9wCitGVFJfU0VDVElPTl9FTFNFCisgIEJFR0lOX0ZUUl9TRUNUSU9OX05FU1RFRCg1MikKKwlQUENfUE9QQ05UQihyMyxyMykKKwlzcmRpCXI0LHIzLDMyCisJYWRkCXIzLHI0LHIzCisJc3JkaQlyNCxyMywxNgorCWFkZAlyMyxyNCxyMworCXNyZGkJcjQscjMsOAorCWFkZAlyMyxyNCxyMworCWNscmxkaQlyMyxyMyw2NC04CisJYmxyCisgIEZUUl9TRUNUSU9OX0VMU0VfTkVTVEVEKDUyKQorCVBQQ19QT1BDTlREKHIzLHIzKQorCWNscmxkaQlyMyxyMyw2NC04CisJYmxyCisgIEFMVF9GVFJfU0VDVElPTl9FTkRfTkVTVEVEX0lGQ0xSKENQVV9GVFJfUE9QQ05URCwgNTIpCitBTFRfRlRSX1NFQ1RJT05fRU5EX0lGQ0xSKENQVV9GVFJfUE9QQ05UQikKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9tbS9oYXNoX3V0aWxzXzY0LmMgYi9hcmNoL3Bvd2VycGMvbW0vaGFzaF91dGlsc182NC5jCmluZGV4IDVlOTU4NDQuLmE1OTkxZmEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9tbS9oYXNoX3V0aWxzXzY0LmMKKysrIGIvYXJjaC9wb3dlcnBjL21tL2hhc2hfdXRpbHNfNjQuYwpAQCAtMTA3MCw3ICsxMDcwLDcgQEAKIAkJICB1bnNpZ25lZCBsb25nIGFjY2VzcywgdW5zaWduZWQgbG9uZyB0cmFwKQogewogCXVuc2lnbmVkIGxvbmcgdnNpZDsKLQl2b2lkICpwZ2RpcjsKKwlwZ2RfdCAqcGdkaXI7CiAJcHRlX3QgKnB0ZXA7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgcmMsIHNzaXplLCBsb2NhbCA9IDA7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbW0vbW11X2NvbnRleHRfbm9oYXNoLmMgYi9hcmNoL3Bvd2VycGMvbW0vbW11X2NvbnRleHRfbm9oYXNoLmMKaW5kZXggNWNlOTk4NC4uYzBhYWI1MiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL21tL21tdV9jb250ZXh0X25vaGFzaC5jCisrKyBiL2FyY2gvcG93ZXJwYy9tbS9tbXVfY29udGV4dF9ub2hhc2guYwpAQCAtMTExLDggKzExMSw4IEBACiAJCSAqIGEgY29yZSBtYXAgaW5zdGVhZCBidXQgdGhpcyB3aWxsIGRvIGZvciBub3cuCiAJCSAqLwogCQlmb3JfZWFjaF9jcHUoY3B1LCBtbV9jcHVtYXNrKG1tKSkgewotCQkJZm9yIChpID0gY3B1X2ZpcnN0X3RocmVhZF9pbl9jb3JlKGNwdSk7Ci0JCQkgICAgIGkgPD0gY3B1X2xhc3RfdGhyZWFkX2luX2NvcmUoY3B1KTsgaSsrKQorCQkJZm9yIChpID0gY3B1X2ZpcnN0X3RocmVhZF9zaWJsaW5nKGNwdSk7CisJCQkgICAgIGkgPD0gY3B1X2xhc3RfdGhyZWFkX3NpYmxpbmcoY3B1KTsgaSsrKQogCQkJCV9fc2V0X2JpdChpZCwgc3RhbGVfbWFwW2ldKTsKIAkJCWNwdSA9IGkgLSAxOwogCQl9CkBAIC0yNjQsMTQgKzI2NCwxNCBAQAogCSAqLwogCWlmICh0ZXN0X2JpdChpZCwgc3RhbGVfbWFwW2NwdV0pKSB7CiAJCXByX2hhcmRjb250KCIgfCBzdGFsZSBmbHVzaCAlZCBbJWQuLiVkXSIsCi0JCQkgICAgaWQsIGNwdV9maXJzdF90aHJlYWRfaW5fY29yZShjcHUpLAotCQkJICAgIGNwdV9sYXN0X3RocmVhZF9pbl9jb3JlKGNwdSkpOworCQkJICAgIGlkLCBjcHVfZmlyc3RfdGhyZWFkX3NpYmxpbmcoY3B1KSwKKwkJCSAgICBjcHVfbGFzdF90aHJlYWRfc2libGluZyhjcHUpKTsKIAogCQlsb2NhbF9mbHVzaF90bGJfbW0obmV4dCk7CiAKIAkJLyogWFhYIFRoaXMgY2xlYXIgc2hvdWxkIHVsdGltYXRlbHkgYmUgcGFydCBvZiBsb2NhbF9mbHVzaF90bGJfbW0gKi8KLQkJZm9yIChpID0gY3B1X2ZpcnN0X3RocmVhZF9pbl9jb3JlKGNwdSk7Ci0JCSAgICAgaSA8PSBjcHVfbGFzdF90aHJlYWRfaW5fY29yZShjcHUpOyBpKyspIHsKKwkJZm9yIChpID0gY3B1X2ZpcnN0X3RocmVhZF9zaWJsaW5nKGNwdSk7CisJCSAgICAgaSA8PSBjcHVfbGFzdF90aHJlYWRfc2libGluZyhjcHUpOyBpKyspIHsKIAkJCV9fY2xlYXJfYml0KGlkLCBzdGFsZV9tYXBbaV0pOwogCQl9CiAJfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL21tL251bWEuYyBiL2FyY2gvcG93ZXJwYy9tbS9udW1hLmMKaW5kZXggNzQ1MDViMi4uYmY1Y2I5MSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL21tL251bWEuYworKysgYi9hcmNoL3Bvd2VycGMvbW0vbnVtYS5jCkBAIC0yMCwxMCArMjAsMTUgQEAKICNpbmNsdWRlIDxsaW51eC9tZW1ibG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L29mLmg+CiAjaW5jbHVkZSA8bGludXgvcGZuLmg+CisjaW5jbHVkZSA8bGludXgvY3B1c2V0Lmg+CisjaW5jbHVkZSA8bGludXgvbm9kZS5oPgogI2luY2x1ZGUgPGFzbS9zcGFyc2VtZW0uaD4KICNpbmNsdWRlIDxhc20vcHJvbS5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KICNpbmNsdWRlIDxhc20vc21wLmg+CisjaW5jbHVkZSA8YXNtL2Zpcm13YXJlLmg+CisjaW5jbHVkZSA8YXNtL3BhY2EuaD4KKyNpbmNsdWRlIDxhc20vaHZjYWxsLmg+CiAKIHN0YXRpYyBpbnQgbnVtYV9lbmFibGVkID0gMTsKIApAQCAtMTYzLDcgKzE2OCw3IEBACiAJd29ya193aXRoX2FjdGl2ZV9yZWdpb25zKG5pZCwgZ2V0X2FjdGl2ZV9yZWdpb25fd29ya19mbiwgbm9kZV9hcik7CiB9CiAKLXN0YXRpYyB2b2lkIF9fY3B1aW5pdCBtYXBfY3B1X3RvX25vZGUoaW50IGNwdSwgaW50IG5vZGUpCitzdGF0aWMgdm9pZCBtYXBfY3B1X3RvX25vZGUoaW50IGNwdSwgaW50IG5vZGUpCiB7CiAJbnVtYV9jcHVfbG9va3VwX3RhYmxlW2NwdV0gPSBub2RlOwogCkBAIC0xNzMsNyArMTc4LDcgQEAKIAkJY3B1bWFza19zZXRfY3B1KGNwdSwgbm9kZV90b19jcHVtYXNrX21hcFtub2RlXSk7CiB9CiAKLSNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKKyNpZiBkZWZpbmVkKENPTkZJR19IT1RQTFVHX0NQVSkgfHwgZGVmaW5lZChDT05GSUdfUFBDX1NQTFBBUikKIHN0YXRpYyB2b2lkIHVubWFwX2NwdV9mcm9tX25vZGUodW5zaWduZWQgbG9uZyBjcHUpCiB7CiAJaW50IG5vZGUgPSBudW1hX2NwdV9sb29rdXBfdGFibGVbY3B1XTsKQEAgLTE4Nyw3ICsxOTIsNyBAQAogCQkgICAgICAgY3B1LCBub2RlKTsKIAl9CiB9Ci0jZW5kaWYgLyogQ09ORklHX0hPVFBMVUdfQ1BVICovCisjZW5kaWYgLyogQ09ORklHX0hPVFBMVUdfQ1BVIHx8IENPTkZJR19QUENfU1BMUEFSICovCiAKIC8qIG11c3QgaG9sZCByZWZlcmVuY2UgdG8gbm9kZSBkdXJpbmcgY2FsbCAqLwogc3RhdGljIGNvbnN0IGludCAqb2ZfZ2V0X2Fzc29jaWF0aXZpdHkoc3RydWN0IGRldmljZV9ub2RlICpkZXYpCkBAIC0yNDYsMzIgKzI1MSw0MSBAQAogLyogUmV0dXJucyBuaWQgaW4gdGhlIHJhbmdlIFswLi5NQVhfTlVNTk9ERVMtMV0sIG9yIC0xIGlmIG5vIHVzZWZ1bCBudW1hCiAgKiBpbmZvIGlzIGZvdW5kLgogICovCi1zdGF0aWMgaW50IG9mX25vZGVfdG9fbmlkX3NpbmdsZShzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldmljZSkKK3N0YXRpYyBpbnQgYXNzb2NpYXRpdml0eV90b19uaWQoY29uc3QgdW5zaWduZWQgaW50ICphc3NvY2lhdGl2aXR5KQogewogCWludCBuaWQgPSAtMTsKLQljb25zdCB1bnNpZ25lZCBpbnQgKnRtcDsKIAogCWlmIChtaW5fY29tbW9uX2RlcHRoID09IC0xKQogCQlnb3RvIG91dDsKIAotCXRtcCA9IG9mX2dldF9hc3NvY2lhdGl2aXR5KGRldmljZSk7Ci0JaWYgKCF0bXApCi0JCWdvdG8gb3V0OwotCi0JaWYgKHRtcFswXSA+PSBtaW5fY29tbW9uX2RlcHRoKQotCQluaWQgPSB0bXBbbWluX2NvbW1vbl9kZXB0aF07CisJaWYgKGFzc29jaWF0aXZpdHlbMF0gPj0gbWluX2NvbW1vbl9kZXB0aCkKKwkJbmlkID0gYXNzb2NpYXRpdml0eVttaW5fY29tbW9uX2RlcHRoXTsKIAogCS8qIFBPV0VSNCBMUEFSIHVzZXMgMHhmZmZmIGFzIGludmFsaWQgbm9kZSAqLwogCWlmIChuaWQgPT0gMHhmZmZmIHx8IG5pZCA+PSBNQVhfTlVNTk9ERVMpCiAJCW5pZCA9IC0xOwogCi0JaWYgKG5pZCA+IDAgJiYgdG1wWzBdID49IGRpc3RhbmNlX3JlZl9wb2ludHNfZGVwdGgpCi0JCWluaXRpYWxpemVfZGlzdGFuY2VfbG9va3VwX3RhYmxlKG5pZCwgdG1wKTsKKwlpZiAobmlkID4gMCAmJiBhc3NvY2lhdGl2aXR5WzBdID49IGRpc3RhbmNlX3JlZl9wb2ludHNfZGVwdGgpCisJCWluaXRpYWxpemVfZGlzdGFuY2VfbG9va3VwX3RhYmxlKG5pZCwgYXNzb2NpYXRpdml0eSk7CiAKIG91dDoKIAlyZXR1cm4gbmlkOwogfQogCisvKiBSZXR1cm5zIHRoZSBuaWQgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBkZXZpY2UgdHJlZSBub2RlLAorICogb3IgLTEgaWYgbm90IGZvdW5kLgorICovCitzdGF0aWMgaW50IG9mX25vZGVfdG9fbmlkX3NpbmdsZShzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldmljZSkKK3sKKwlpbnQgbmlkID0gLTE7CisJY29uc3QgdW5zaWduZWQgaW50ICp0bXA7CisKKwl0bXAgPSBvZl9nZXRfYXNzb2NpYXRpdml0eShkZXZpY2UpOworCWlmICh0bXApCisJCW5pZCA9IGFzc29jaWF0aXZpdHlfdG9fbmlkKHRtcCk7CisJcmV0dXJuIG5pZDsKK30KKwogLyogV2FsayB0aGUgZGV2aWNlIHRyZWUgdXB3YXJkcywgbG9va2luZyBmb3IgYW4gYXNzb2NpYXRpdml0eSBpZCAqLwogaW50IG9mX25vZGVfdG9fbmlkKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZGV2aWNlKQogewpAQCAtMTI0Nyw0ICsxMjYxLDI3NSBAQAogCXJldHVybiBuaWQ7CiB9CiAKK3N0YXRpYyB1NjQgaG90X2FkZF9kcmNvbmZfbWVtb3J5X21heCh2b2lkKQoreworICAgICAgICBzdHJ1Y3QgZGV2aWNlX25vZGUgKm1lbW9yeSA9IE5VTEw7CisgICAgICAgIHVuc2lnbmVkIGludCBkcmNvbmZfY2VsbF9jbnQgPSAwOworICAgICAgICB1NjQgbG1iX3NpemUgPSAwOworICAgICAgICBjb25zdCB1MzIgKmRtID0gMDsKKworICAgICAgICBtZW1vcnkgPSBvZl9maW5kX25vZGVfYnlfcGF0aCgiL2libSxkeW5hbWljLXJlY29uZmlndXJhdGlvbi1tZW1vcnkiKTsKKyAgICAgICAgaWYgKG1lbW9yeSkgeworICAgICAgICAgICAgICAgIGRyY29uZl9jZWxsX2NudCA9IG9mX2dldF9kcmNvbmZfbWVtb3J5KG1lbW9yeSwgJmRtKTsKKyAgICAgICAgICAgICAgICBsbWJfc2l6ZSA9IG9mX2dldF9sbWJfc2l6ZShtZW1vcnkpOworICAgICAgICAgICAgICAgIG9mX25vZGVfcHV0KG1lbW9yeSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGxtYl9zaXplICogZHJjb25mX2NlbGxfY250OworfQorCisvKgorICogbWVtb3J5X2hvdHBsdWdfbWF4IC0gcmV0dXJuIG1heCBhZGRyZXNzIG9mIG1lbW9yeSB0aGF0IG1heSBiZSBhZGRlZAorICoKKyAqIFRoaXMgaXMgY3VycmVudGx5IG9ubHkgdXNlZCBvbiBzeXN0ZW1zIHRoYXQgc3VwcG9ydCBkcmNvbmZpZyBtZW1vcnkKKyAqIGhvdHBsdWcuCisgKi8KK3U2NCBtZW1vcnlfaG90cGx1Z19tYXgodm9pZCkKK3sKKyAgICAgICAgcmV0dXJuIG1heChob3RfYWRkX2RyY29uZl9tZW1vcnlfbWF4KCksIG1lbWJsb2NrX2VuZF9vZl9EUkFNKCkpOworfQogI2VuZGlmIC8qIENPTkZJR19NRU1PUllfSE9UUExVRyAqLworCisvKiBWcnR1YWwgUHJvY2Vzc29yIEhvbWUgTm9kZSAoVlBITikgc3VwcG9ydCAqLworI2lmZGVmIENPTkZJR19QUENfU1BMUEFSCisjZGVmaW5lIFZQSE5fTlJfQ0hBTkdFX0NUUlMgKDgpCitzdGF0aWMgdTggdnBobl9jcHVfY2hhbmdlX2NvdW50c1tOUl9DUFVTXVtWUEhOX05SX0NIQU5HRV9DVFJTXTsKK3N0YXRpYyBjcHVtYXNrX3QgY3B1X2Fzc29jaWF0aXZpdHlfY2hhbmdlc19tYXNrOworc3RhdGljIGludCB2cGhuX2VuYWJsZWQ7CitzdGF0aWMgdm9pZCBzZXRfdG9wb2xvZ3lfdGltZXIodm9pZCk7CisKKy8qCisgKiBTdG9yZSB0aGUgY3VycmVudCB2YWx1ZXMgb2YgdGhlIGFzc29jaWF0aXZpdHkgY2hhbmdlIGNvdW50ZXJzIGluIHRoZQorICogaHlwZXJ2aXNvci4KKyAqLworc3RhdGljIHZvaWQgc2V0dXBfY3B1X2Fzc29jaWF0aXZpdHlfY2hhbmdlX2NvdW50ZXJzKHZvaWQpCit7CisJaW50IGNwdSA9IDA7CisKKwlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoY3B1KSB7CisJCWludCBpID0gMDsKKwkJdTggKmNvdW50cyA9IHZwaG5fY3B1X2NoYW5nZV9jb3VudHNbY3B1XTsKKwkJdm9sYXRpbGUgdTggKmh5cGVydmlzb3JfY291bnRzID0gbHBwYWNhW2NwdV0udnBobl9hc3NvY19jb3VudHM7CisKKwkJZm9yIChpID0gMDsgaSA8IFZQSE5fTlJfQ0hBTkdFX0NUUlM7IGkrKykgeworCQkJY291bnRzW2ldID0gaHlwZXJ2aXNvcl9jb3VudHNbaV07CisJCX0KKwl9Cit9CisKKy8qCisgKiBUaGUgaHlwZXJ2aXNvciBtYWludGFpbnMgYSBzZXQgb2YgOCBhc3NvY2lhdGl2aXR5IGNoYW5nZSBjb3VudGVycyBpbgorICogdGhlIFZQQSBvZiBlYWNoIGNwdSB0aGF0IGNvcnJlc3BvbmQgdG8gdGhlIGFzc29jaWF0aXZpdHkgbGV2ZWxzIGluIHRoZQorICogaWJtLGFzc29jaWF0aXZpdHktcmVmZXJlbmNlLXBvaW50cyBwcm9wZXJ0eS4gV2hlbiBhbiBhc3NvY2lhdGl2aXR5CisgKiBsZXZlbCBjaGFuZ2VzLCB0aGUgY29ycmVzcG9uZGluZyBjb3VudGVyIGlzIGluY3JlbWVudGVkLgorICoKKyAqIFNldCBhIGJpdCBpbiBjcHVfYXNzb2NpYXRpdml0eV9jaGFuZ2VzX21hc2sgZm9yIGVhY2ggY3B1IHdob3NlIGhvbWUKKyAqIG5vZGUgYXNzb2NpYXRpdml0eSBsZXZlbHMgaGF2ZSBjaGFuZ2VkLgorICoKKyAqIFJldHVybnMgdGhlIG51bWJlciBvZiBjcHVzIHdpdGggdW5oYW5kbGVkIGFzc29jaWF0aXZpdHkgY2hhbmdlcy4KKyAqLworc3RhdGljIGludCB1cGRhdGVfY3B1X2Fzc29jaWF0aXZpdHlfY2hhbmdlc19tYXNrKHZvaWQpCit7CisJaW50IGNwdSA9IDAsIG5yX2NwdXMgPSAwOworCWNwdW1hc2tfdCAqY2hhbmdlcyA9ICZjcHVfYXNzb2NpYXRpdml0eV9jaGFuZ2VzX21hc2s7CisKKwljcHVtYXNrX2NsZWFyKGNoYW5nZXMpOworCisJZm9yX2VhY2hfcG9zc2libGVfY3B1KGNwdSkgeworCQlpbnQgaSwgY2hhbmdlZCA9IDA7CisJCXU4ICpjb3VudHMgPSB2cGhuX2NwdV9jaGFuZ2VfY291bnRzW2NwdV07CisJCXZvbGF0aWxlIHU4ICpoeXBlcnZpc29yX2NvdW50cyA9IGxwcGFjYVtjcHVdLnZwaG5fYXNzb2NfY291bnRzOworCisJCWZvciAoaSA9IDA7IGkgPCBWUEhOX05SX0NIQU5HRV9DVFJTOyBpKyspIHsKKwkJCWlmIChoeXBlcnZpc29yX2NvdW50c1tpXSA+IGNvdW50c1tpXSkgeworCQkJCWNvdW50c1tpXSA9IGh5cGVydmlzb3JfY291bnRzW2ldOworCQkJCWNoYW5nZWQgPSAxOworCQkJfQorCQl9CisJCWlmIChjaGFuZ2VkKSB7CisJCQljcHVtYXNrX3NldF9jcHUoY3B1LCBjaGFuZ2VzKTsKKwkJCW5yX2NwdXMrKzsKKwkJfQorCX0KKworCXJldHVybiBucl9jcHVzOworfQorCisvKiA2IDY0LWJpdCByZWdpc3RlcnMgdW5wYWNrZWQgaW50byAxMiAzMi1iaXQgYXNzb2NpYXRpdml0eSB2YWx1ZXMgKi8KKyNkZWZpbmUgVlBITl9BU1NPQ19CVUZTSVpFICg2KnNpemVvZih1NjQpL3NpemVvZih1MzIpKQorCisvKgorICogQ29udmVydCB0aGUgYXNzb2NpYXRpdml0eSBkb21haW4gbnVtYmVycyByZXR1cm5lZCBmcm9tIHRoZSBoeXBlcnZpc29yCisgKiB0byB0aGUgc2VxdWVuY2UgdGhleSB3b3VsZCBhcHBlYXIgaW4gdGhlIGlibSxhc3NvY2lhdGl2aXR5IHByb3BlcnR5LgorICovCitzdGF0aWMgaW50IHZwaG5fdW5wYWNrX2Fzc29jaWF0aXZpdHkoY29uc3QgbG9uZyAqcGFja2VkLCB1bnNpZ25lZCBpbnQgKnVucGFja2VkKQoreworCWludCBpID0gMDsKKwlpbnQgbnJfYXNzb2NfZG9tcyA9IDA7CisJY29uc3QgdTE2ICpmaWVsZCA9IChjb25zdCB1MTYqKSBwYWNrZWQ7CisKKyNkZWZpbmUgVlBITl9GSUVMRF9VTlVTRUQJKDB4ZmZmZikKKyNkZWZpbmUgVlBITl9GSUVMRF9NU0IJCSgweDgwMDApCisjZGVmaW5lIFZQSE5fRklFTERfTUFTSwkJKH5WUEhOX0ZJRUxEX01TQikKKworCWZvciAoaSA9IDA7IGkgPCBWUEhOX0FTU09DX0JVRlNJWkU7IGkrKykgeworCQlpZiAoKmZpZWxkID09IFZQSE5fRklFTERfVU5VU0VEKSB7CisJCQkvKiBBbGwgc2lnbmlmaWNhbnQgZmllbGRzIHByb2Nlc3NlZCwgYW5kIHJlbWFpbmluZworCQkJICogZmllbGRzIGNvbnRhaW4gdGhlIHJlc2VydmVkIHZhbHVlIG9mIGFsbCAxJ3MuCisJCQkgKiBKdXN0IHN0b3JlIHRoZW0uCisJCQkgKi8KKwkJCXVucGFja2VkW2ldID0gKigodTMyKilmaWVsZCk7CisJCQlmaWVsZCArPSAyOworCQl9CisJCWVsc2UgaWYgKCpmaWVsZCAmIFZQSE5fRklFTERfTVNCKSB7CisJCQkvKiBEYXRhIGlzIGluIHRoZSBsb3dlciAxNSBiaXRzIG9mIHRoaXMgZmllbGQgKi8KKwkJCXVucGFja2VkW2ldID0gKmZpZWxkICYgVlBITl9GSUVMRF9NQVNLOworCQkJZmllbGQrKzsKKwkJCW5yX2Fzc29jX2RvbXMrKzsKKwkJfQorCQllbHNlIHsKKwkJCS8qIERhdGEgaXMgaW4gdGhlIGxvd2VyIDE1IGJpdHMgb2YgdGhpcyBmaWVsZAorCQkJICogY29uY2F0ZW5hdGVkIHdpdGggdGhlIG5leHQgMTYgYml0IGZpZWxkCisJCQkgKi8KKwkJCXVucGFja2VkW2ldID0gKigodTMyKilmaWVsZCk7CisJCQlmaWVsZCArPSAyOworCQkJbnJfYXNzb2NfZG9tcysrOworCQl9CisJfQorCisJcmV0dXJuIG5yX2Fzc29jX2RvbXM7Cit9CisKKy8qCisgKiBSZXRyaWV2ZSB0aGUgbmV3IGFzc29jaWF0aXZpdHkgaW5mb3JtYXRpb24gZm9yIGEgdmlydHVhbCBwcm9jZXNzb3IncworICogaG9tZSBub2RlLgorICovCitzdGF0aWMgbG9uZyBoY2FsbF92cGhuKHVuc2lnbmVkIGxvbmcgY3B1LCB1bnNpZ25lZCBpbnQgKmFzc29jaWF0aXZpdHkpCit7CisJbG9uZyByYyA9IDA7CisJbG9uZyByZXRidWZbUExQQVJfSENBTEw5X0JVRlNJWkVdID0gezB9OworCXU2NCBmbGFncyA9IDE7CisJaW50IGh3Y3B1ID0gZ2V0X2hhcmRfc21wX3Byb2Nlc3Nvcl9pZChjcHUpOworCisJcmMgPSBwbHBhcl9oY2FsbDkoSF9IT01FX05PREVfQVNTT0NJQVRJVklUWSwgcmV0YnVmLCBmbGFncywgaHdjcHUpOworCXZwaG5fdW5wYWNrX2Fzc29jaWF0aXZpdHkocmV0YnVmLCBhc3NvY2lhdGl2aXR5KTsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIGxvbmcgdnBobl9nZXRfYXNzb2NpYXRpdml0eSh1bnNpZ25lZCBsb25nIGNwdSwKKwkJCQkJdW5zaWduZWQgaW50ICphc3NvY2lhdGl2aXR5KQoreworCWxvbmcgcmMgPSAwOworCisJcmMgPSBoY2FsbF92cGhuKGNwdSwgYXNzb2NpYXRpdml0eSk7CisKKwlzd2l0Y2ggKHJjKSB7CisJY2FzZSBIX0ZVTkNUSU9OOgorCQlwcmludGsoS0VSTl9JTkZPCisJCQkiVlBITiBpcyBub3Qgc3VwcG9ydGVkLiBEaXNhYmxpbmcgcG9sbGluZy4uLlxuIik7CisJCXN0b3BfdG9wb2xvZ3lfdXBkYXRlKCk7CisJCWJyZWFrOworCWNhc2UgSF9IQVJEV0FSRToKKwkJcHJpbnRrKEtFUk5fRVJSCisJCQkiaGNhbGxfdnBobigpIGV4cGVyaWVuY2VkIGEgaGFyZHdhcmUgZmF1bHQgIgorCQkJInByZXZlbnRpbmcgVlBITi4gRGlzYWJsaW5nIHBvbGxpbmcuLi5cbiIpOworCQlzdG9wX3RvcG9sb2d5X3VwZGF0ZSgpOworCX0KKworCXJldHVybiByYzsKK30KKworLyoKKyAqIFVwZGF0ZSB0aGUgbm9kZSBtYXBzIGFuZCBzeXNmcyBlbnRyaWVzIGZvciBlYWNoIGNwdSB3aG9zZSBob21lIG5vZGUKKyAqIGhhcyBjaGFuZ2VkLgorICovCitpbnQgYXJjaF91cGRhdGVfY3B1X3RvcG9sb2d5KHZvaWQpCit7CisJaW50IGNwdSA9IDAsIG5pZCA9IDAsIG9sZF9uaWQgPSAwOworCXVuc2lnbmVkIGludCBhc3NvY2lhdGl2aXR5W1ZQSE5fQVNTT0NfQlVGU0laRV0gPSB7MH07CisJc3RydWN0IHN5c19kZXZpY2UgKnN5c2RldiA9IE5VTEw7CisKKwlmb3JfZWFjaF9jcHVfbWFzayhjcHUsIGNwdV9hc3NvY2lhdGl2aXR5X2NoYW5nZXNfbWFzaykgeworCQl2cGhuX2dldF9hc3NvY2lhdGl2aXR5KGNwdSwgYXNzb2NpYXRpdml0eSk7CisJCW5pZCA9IGFzc29jaWF0aXZpdHlfdG9fbmlkKGFzc29jaWF0aXZpdHkpOworCisJCWlmIChuaWQgPCAwIHx8ICFub2RlX29ubGluZShuaWQpKQorCQkJbmlkID0gZmlyc3Rfb25saW5lX25vZGU7CisKKwkJb2xkX25pZCA9IG51bWFfY3B1X2xvb2t1cF90YWJsZVtjcHVdOworCisJCS8qIERpc2FibGUgaG90cGx1ZyB3aGlsZSB3ZSB1cGRhdGUgdGhlIGNwdQorCQkgKiBtYXNrcyBhbmQgc3lzZnMuCisJCSAqLworCQlnZXRfb25saW5lX2NwdXMoKTsKKwkJdW5yZWdpc3Rlcl9jcHVfdW5kZXJfbm9kZShjcHUsIG9sZF9uaWQpOworCQl1bm1hcF9jcHVfZnJvbV9ub2RlKGNwdSk7CisJCW1hcF9jcHVfdG9fbm9kZShjcHUsIG5pZCk7CisJCXJlZ2lzdGVyX2NwdV91bmRlcl9ub2RlKGNwdSwgbmlkKTsKKwkJcHV0X29ubGluZV9jcHVzKCk7CisKKwkJc3lzZGV2ID0gZ2V0X2NwdV9zeXNkZXYoY3B1KTsKKwkJaWYgKHN5c2RldikKKwkJCWtvYmplY3RfdWV2ZW50KCZzeXNkZXYtPmtvYmosIEtPQkpfQ0hBTkdFKTsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgdG9wb2xvZ3lfd29ya19mbihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJcmVidWlsZF9zY2hlZF9kb21haW5zKCk7Cit9CitzdGF0aWMgREVDTEFSRV9XT1JLKHRvcG9sb2d5X3dvcmssIHRvcG9sb2d5X3dvcmtfZm4pOworCit2b2lkIHRvcG9sb2d5X3NjaGVkdWxlX3VwZGF0ZSh2b2lkKQoreworCXNjaGVkdWxlX3dvcmsoJnRvcG9sb2d5X3dvcmspOworfQorCitzdGF0aWMgdm9pZCB0b3BvbG9neV90aW1lcl9mbih1bnNpZ25lZCBsb25nIGlnbm9yZWQpCit7CisJaWYgKCF2cGhuX2VuYWJsZWQpCisJCXJldHVybjsKKwlpZiAodXBkYXRlX2NwdV9hc3NvY2lhdGl2aXR5X2NoYW5nZXNfbWFzaygpID4gMCkKKwkJdG9wb2xvZ3lfc2NoZWR1bGVfdXBkYXRlKCk7CisJc2V0X3RvcG9sb2d5X3RpbWVyKCk7Cit9CitzdGF0aWMgc3RydWN0IHRpbWVyX2xpc3QgdG9wb2xvZ3lfdGltZXIgPQorCVRJTUVSX0lOSVRJQUxJWkVSKHRvcG9sb2d5X3RpbWVyX2ZuLCAwLCAwKTsKKworc3RhdGljIHZvaWQgc2V0X3RvcG9sb2d5X3RpbWVyKHZvaWQpCit7CisJdG9wb2xvZ3lfdGltZXIuZGF0YSA9IDA7CisJdG9wb2xvZ3lfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyA2MCAqIEhaOworCWFkZF90aW1lcigmdG9wb2xvZ3lfdGltZXIpOworfQorCisvKgorICogU3RhcnQgcG9sbGluZyBmb3IgVlBITiBhc3NvY2lhdGl2aXR5IGNoYW5nZXMuCisgKi8KK2ludCBzdGFydF90b3BvbG9neV91cGRhdGUodm9pZCkKK3sKKwlpbnQgcmMgPSAwOworCisJaWYgKGZpcm13YXJlX2hhc19mZWF0dXJlKEZXX0ZFQVRVUkVfVlBITikpIHsKKwkJdnBobl9lbmFibGVkID0gMTsKKwkJc2V0dXBfY3B1X2Fzc29jaWF0aXZpdHlfY2hhbmdlX2NvdW50ZXJzKCk7CisJCWluaXRfdGltZXJfZGVmZXJyYWJsZSgmdG9wb2xvZ3lfdGltZXIpOworCQlzZXRfdG9wb2xvZ3lfdGltZXIoKTsKKwkJcmMgPSAxOworCX0KKworCXJldHVybiByYzsKK30KK19faW5pdGNhbGwoc3RhcnRfdG9wb2xvZ3lfdXBkYXRlKTsKKworLyoKKyAqIERpc2FibGUgcG9sbGluZyBmb3IgVlBITiBhc3NvY2lhdGl2aXR5IGNoYW5nZXMuCisgKi8KK2ludCBzdG9wX3RvcG9sb2d5X3VwZGF0ZSh2b2lkKQoreworCXZwaG5fZW5hYmxlZCA9IDA7CisJcmV0dXJuIGRlbF90aW1lcl9zeW5jKCZ0b3BvbG9neV90aW1lcik7Cit9CisjZW5kaWYgLyogQ09ORklHX1BQQ19TUExQQVIgKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9tbS9wZ3RhYmxlXzMyLmMgYi9hcmNoL3Bvd2VycGMvbW0vcGd0YWJsZV8zMi5jCmluZGV4IGE4N2VhZDAuLjhkYzQxYzAgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9tbS9wZ3RhYmxlXzMyLmMKKysrIGIvYXJjaC9wb3dlcnBjL21tL3BndGFibGVfMzIuYwpAQCAtNzgsNyArNzgsNyBAQAogCiAJLyogcGdkaXIgdGFrZSBwYWdlIG9yIHR3byB3aXRoIDRLIHBhZ2VzIGFuZCBhIHBhZ2UgZnJhY3Rpb24gb3RoZXJ3aXNlICovCiAjaWZuZGVmIENPTkZJR19QUENfNEtfUEFHRVMKLQlyZXQgPSAocGdkX3QgKilremFsbG9jKDEgPDwgUEdESVJfT1JERVIsIEdGUF9LRVJORUwpOworCXJldCA9IGt6YWxsb2MoMSA8PCBQR0RJUl9PUkRFUiwgR0ZQX0tFUk5FTCk7CiAjZWxzZQogCXJldCA9IChwZ2RfdCAqKV9fZ2V0X2ZyZWVfcGFnZXMoR0ZQX0tFUk5FTHxfX0dGUF9aRVJPLAogCQkJUEdESVJfT1JERVIgLSBQQUdFX1NISUZUKTsKQEAgLTIzMCw2ICsyMzAsNyBAQAogCQlhcmVhID0gZ2V0X3ZtX2FyZWFfY2FsbGVyKHNpemUsIFZNX0lPUkVNQVAsIGNhbGxlcik7CiAJCWlmIChhcmVhID09IDApCiAJCQlyZXR1cm4gTlVMTDsKKwkJYXJlYS0+cGh5c19hZGRyID0gcDsKIAkJdiA9ICh1bnNpZ25lZCBsb25nKSBhcmVhLT5hZGRyOwogCX0gZWxzZSB7CiAJCXYgPSAoaW9yZW1hcF9ib3QgLT0gc2l6ZSk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbW0vcGd0YWJsZV82NC5jIGIvYXJjaC9wb3dlcnBjL21tL3BndGFibGVfNjQuYwppbmRleCAyMWQ2ZGZhLi44ODkyN2EwIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvbW0vcGd0YWJsZV82NC5jCisrKyBiL2FyY2gvcG93ZXJwYy9tbS9wZ3RhYmxlXzY0LmMKQEAgLTIyMyw2ICsyMjMsOCBAQAogCQkJCQkgICAgY2FsbGVyKTsKIAkJaWYgKGFyZWEgPT0gTlVMTCkKIAkJCXJldHVybiBOVUxMOworCisJCWFyZWEtPnBoeXNfYWRkciA9IHBhbGlnbmVkOwogCQlyZXQgPSBfX2lvcmVtYXBfYXQocGFsaWduZWQsIGFyZWEtPmFkZHIsIHNpemUsIGZsYWdzKTsKIAkJaWYgKCFyZXQpCiAJCQl2dW5tYXAoYXJlYS0+YWRkcik7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzQweC9wcGM0MHhfc2ltcGxlLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzQweC9wcGM0MHhfc2ltcGxlLmMKaW5kZXggNTQ2YmJjMi4uMjUyMWQ5MyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy80MHgvcHBjNDB4X3NpbXBsZS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNDB4L3BwYzQweF9zaW1wbGUuYwpAQCAtNTAsNyArNTAsNyBAQAogICogQWdhaW4sIGlmIHlvdXIgYm9hcmQgbmVlZHMgdG8gZG8gdGhpbmdzIGRpZmZlcmVudGx5IHRoZW4gY3JlYXRlIGEKICAqIGJvYXJkLmMgZmlsZSBmb3IgaXQgcmF0aGVyIHRoYW4gYWRkaW5nIGl0IHRvIHRoaXMgbGlzdC4KICAqLwotc3RhdGljIGNoYXIgKmJvYXJkW10gX19pbml0ZGF0YSA9IHsKK3N0YXRpYyBjb25zdCBjaGFyICpib2FyZFtdIF9faW5pdGRhdGEgPSB7CiAJImFtY2MsYWNhZGlhIiwKIAkiYW1jYyxoYWxlYWthbGEiLAogCSJhbWNjLGtpbGF1ZWEiLApAQCAtNjAsMTQgKzYwLDkgQEAKIAogc3RhdGljIGludCBfX2luaXQgcHBjNDB4X3Byb2JlKHZvaWQpCiB7Ci0JdW5zaWduZWQgbG9uZyByb290ID0gb2ZfZ2V0X2ZsYXRfZHRfcm9vdCgpOwotCWludCBpID0gMDsKLQotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGJvYXJkKTsgaSsrKSB7Ci0JCWlmIChvZl9mbGF0X2R0X2lzX2NvbXBhdGlibGUocm9vdCwgYm9hcmRbaV0pKSB7Ci0JCQlwcGNfcGNpX3NldF9mbGFncyhQUENfUENJX1JFQVNTSUdOX0FMTF9SU1JDKTsKLQkJCXJldHVybiAxOwotCQl9CisJaWYgKG9mX2ZsYXRfZHRfbWF0Y2gob2ZfZ2V0X2ZsYXRfZHRfcm9vdCgpLCBib2FyZCkpIHsKKwkJcHBjX3BjaV9zZXRfZmxhZ3MoUFBDX1BDSV9SRUFTU0lHTl9BTExfUlNSQyk7CisJCXJldHVybiAxOwogCX0KIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy80NHgvTWFrZWZpbGUgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzQ0eC9NYWtlZmlsZQppbmRleCA4MmZmMzI2Li5jMDRkMTZkIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzQ0eC9NYWtlZmlsZQorKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzQ0eC9NYWtlZmlsZQpAQCAtMSw0ICsxLDcgQEAKLW9iai0kKENPTkZJR180NHgpCTo9IG1pc2NfNDR4Lm8gaWRsZS5vCitvYmotJChDT05GSUdfNDR4KQkrPSBtaXNjXzQ0eC5vCitpZm5lcSAoJChDT05GSUdfUFBDNHh4X0NQTSkseSkKK29iai0kKENPTkZJR180NHgpCSs9IGlkbGUubworZW5kaWYKIG9iai0kKENPTkZJR19QUEM0NHhfU0lNUExFKSArPSBwcGM0NHhfc2ltcGxlLm8KIG9iai0kKENPTkZJR19FQk9OWSkJKz0gZWJvbnkubwogb2JqLSQoQ09ORklHX1NBTTQ0MEVQKSAJKz0gc2FtNDQwZXAubwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy81MTJ4L21wYzUxMjFfZ2VuZXJpYy5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy81MTJ4L21wYzUxMjFfZ2VuZXJpYy5jCmluZGV4IGU0ODdlYjAuLjkyNjczMWYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTEyeC9tcGM1MTIxX2dlbmVyaWMuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzUxMngvbXBjNTEyMV9nZW5lcmljLmMKQEAgLTI2LDcgKzI2LDcgQEAKIC8qCiAgKiBsaXN0IG9mIHN1cHBvcnRlZCBib2FyZHMKICAqLwotc3RhdGljIGNoYXIgKmJvYXJkW10gX19pbml0ZGF0YSA9IHsKK3N0YXRpYyBjb25zdCBjaGFyICpib2FyZFtdIF9faW5pdGRhdGEgPSB7CiAJInBydCxwcnRsdnQiLAogCU5VTEwKIH07CkBAIC0zNiwxNiArMzYsNyBAQAogICovCiBzdGF0aWMgaW50IF9faW5pdCBtcGM1MTIxX2dlbmVyaWNfcHJvYmUodm9pZCkKIHsKLQl1bnNpZ25lZCBsb25nIG5vZGUgPSBvZl9nZXRfZmxhdF9kdF9yb290KCk7Ci0JaW50IGkgPSAwOwotCi0Jd2hpbGUgKGJvYXJkW2ldKSB7Ci0JCWlmIChvZl9mbGF0X2R0X2lzX2NvbXBhdGlibGUobm9kZSwgYm9hcmRbaV0pKQotCQkJYnJlYWs7Ci0JCWkrKzsKLQl9Ci0KLQlyZXR1cm4gYm9hcmRbaV0gIT0gTlVMTDsKKwlyZXR1cm4gb2ZfZmxhdF9kdF9tYXRjaChvZl9nZXRfZmxhdF9kdF9yb290KCksIGJvYXJkKTsKIH0KIAogZGVmaW5lX21hY2hpbmUobXBjNTEyMV9nZW5lcmljKSB7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzUyeHgvbGl0ZTUyMDAuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTJ4eC9saXRlNTIwMC5jCmluZGV4IGRlNTViYzAuLjAxZmZhNjQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTJ4eC9saXRlNTIwMC5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTJ4eC9saXRlNTIwMC5jCkBAIC0xNzIsMjAgKzE3MiwxOCBAQAogCW1wYzUyeHhfc2V0dXBfcGNpKCk7CiB9CiAKK3N0YXRpYyBjb25zdCBjaGFyICpib2FyZFtdIF9faW5pdGRhdGEgPSB7CisJImZzbCxsaXRlNTIwMCIsCisJImZzbCxsaXRlNTIwMGIiLAorCU5VTEwsCit9OworCiAvKgogICogQ2FsbGVkIHZlcnkgZWFybHksIE1NVSBpcyBvZmYsIGRldmljZS10cmVlIGlzbid0IHVuZmxhdHRlbmVkCiAgKi8KIHN0YXRpYyBpbnQgX19pbml0IGxpdGU1MjAwX3Byb2JlKHZvaWQpCiB7Ci0JdW5zaWduZWQgbG9uZyBub2RlID0gb2ZfZ2V0X2ZsYXRfZHRfcm9vdCgpOwotCWNvbnN0IGNoYXIgKm1vZGVsID0gb2ZfZ2V0X2ZsYXRfZHRfcHJvcChub2RlLCAibW9kZWwiLCBOVUxMKTsKLQotCWlmICghb2ZfZmxhdF9kdF9pc19jb21wYXRpYmxlKG5vZGUsICJmc2wsbGl0ZTUyMDAiKSAmJgotCSAgICAhb2ZfZmxhdF9kdF9pc19jb21wYXRpYmxlKG5vZGUsICJmc2wsbGl0ZTUyMDBiIikpCi0JCXJldHVybiAwOwotCXByX2RlYnVnKCIlcyBib2FyZCBmb3VuZFxuIiwgbW9kZWwgPyBtb2RlbCA6ICJ1bmtub3duIik7Ci0KLQlyZXR1cm4gMTsKKwlyZXR1cm4gb2ZfZmxhdF9kdF9tYXRjaChvZl9nZXRfZmxhdF9kdF9yb290KCksIGJvYXJkKTsKIH0KIAogZGVmaW5lX21hY2hpbmUobGl0ZTUyMDApIHsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTJ4eC9tZWRpYTUyMDAuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTJ4eC9tZWRpYTUyMDAuYwppbmRleCAwYmFjM2EzLi4yYzc3ODBjIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzUyeHgvbWVkaWE1MjAwLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy81Mnh4L21lZGlhNTIwMC5jCkBAIC0yMzksNyArMjM5LDcgQEAKIH0KIAogLyogbGlzdCBvZiB0aGUgc3VwcG9ydGVkIGJvYXJkcyAqLwotc3RhdGljIGNoYXIgKmJvYXJkW10gX19pbml0ZGF0YSA9IHsKK3N0YXRpYyBjb25zdCBjaGFyICpib2FyZFtdIF9faW5pdGRhdGEgPSB7CiAJImZzbCxtZWRpYTUyMDAiLAogCU5VTEwKIH07CkBAIC0yNDksMTYgKzI0OSw3IEBACiAgKi8KIHN0YXRpYyBpbnQgX19pbml0IG1lZGlhNTIwMF9wcm9iZSh2b2lkKQogewotCXVuc2lnbmVkIGxvbmcgbm9kZSA9IG9mX2dldF9mbGF0X2R0X3Jvb3QoKTsKLQlpbnQgaSA9IDA7Ci0KLQl3aGlsZSAoYm9hcmRbaV0pIHsKLQkJaWYgKG9mX2ZsYXRfZHRfaXNfY29tcGF0aWJsZShub2RlLCBib2FyZFtpXSkpCi0JCQlicmVhazsKLQkJaSsrOwotCX0KLQotCXJldHVybiAoYm9hcmRbaV0gIT0gTlVMTCk7CisJcmV0dXJuIG9mX2ZsYXRfZHRfbWF0Y2gob2ZfZ2V0X2ZsYXRfZHRfcm9vdCgpLCBib2FyZCk7CiB9CiAKIGRlZmluZV9tYWNoaW5lKG1lZGlhNTIwMF9wbGF0Zm9ybSkgewpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy81Mnh4L21wYzUyMDBfc2ltcGxlLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzUyeHgvbXBjNTIwMF9zaW1wbGUuYwppbmRleCBkNDViZTViLi5lMzZkNmUyIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzUyeHgvbXBjNTIwMF9zaW1wbGUuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzUyeHgvbXBjNTIwMF9zaW1wbGUuYwpAQCAtNDksNyArNDksNyBAQAogfQogCiAvKiBsaXN0IG9mIHRoZSBzdXBwb3J0ZWQgYm9hcmRzICovCi1zdGF0aWMgY2hhciAqYm9hcmRbXSBfX2luaXRkYXRhID0geworc3RhdGljIGNvbnN0IGNoYXIgKmJvYXJkW10gX19pbml0ZGF0YSA9IHsKIAkiaW50ZXJjb250cm9sLGRpZ3N5LW10YyIsCiAJIm1hbnJvbGFuZCxtdWNtYzUyIiwKIAkibWFucm9sYW5kLHVjMTAxIiwKQEAgLTY2LDE2ICs2Niw3IEBACiAgKi8KIHN0YXRpYyBpbnQgX19pbml0IG1wYzUyMDBfc2ltcGxlX3Byb2JlKHZvaWQpCiB7Ci0JdW5zaWduZWQgbG9uZyBub2RlID0gb2ZfZ2V0X2ZsYXRfZHRfcm9vdCgpOwotCWludCBpID0gMDsKLQotCXdoaWxlIChib2FyZFtpXSkgewotCQlpZiAob2ZfZmxhdF9kdF9pc19jb21wYXRpYmxlKG5vZGUsIGJvYXJkW2ldKSkKLQkJCWJyZWFrOwotCQlpKys7Ci0JfQotCQotCXJldHVybiAoYm9hcmRbaV0gIT0gTlVMTCk7CisJcmV0dXJuIG9mX2ZsYXRfZHRfbWF0Y2gob2ZfZ2V0X2ZsYXRfZHRfcm9vdCgpLCBib2FyZCk7CiB9CiAKIGRlZmluZV9tYWNoaW5lKG1wYzUyMDBfc2ltcGxlX3BsYXRmb3JtKSB7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvbXBjODMweF9yZGIuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9tcGM4MzB4X3JkYi5jCmluZGV4IDg0NjgzMWQuLjY2MWQzNTQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9tcGM4MzB4X3JkYi5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9tcGM4MzB4X3JkYi5jCkBAIC01NywxNiArNTcsMTkgQEAKIAlpcGljX3NldF9kZWZhdWx0X3ByaW9yaXR5KCk7CiB9CiAKK3N0cnVjdCBjb25zdCBjaGFyICpib2FyZFtdIF9faW5pdGRhdGEgPSB7CisJIk1QQzgzMDhSREIiLAorCSJmc2wsbXBjODMwOHJkYiIsCisJImRlbngsbXBjODMwOF9wMW0iLAorCU5VTEwKK30KKwogLyoKICAqIENhbGxlZCB2ZXJ5IGVhcmx5LCBNTVUgaXMgb2ZmLCBkZXZpY2UtdHJlZSBpc24ndCB1bmZsYXR0ZW5lZAogICovCiBzdGF0aWMgaW50IF9faW5pdCBtcGM4MzB4X3JkYl9wcm9iZSh2b2lkKQogewotCXVuc2lnbmVkIGxvbmcgcm9vdCA9IG9mX2dldF9mbGF0X2R0X3Jvb3QoKTsKLQotCXJldHVybiBvZl9mbGF0X2R0X2lzX2NvbXBhdGlibGUocm9vdCwgIk1QQzgzMDhSREIiKSB8fAotCSAgICAgICBvZl9mbGF0X2R0X2lzX2NvbXBhdGlibGUocm9vdCwgImZzbCxtcGM4MzA4cmRiIikgfHwKLQkgICAgICAgb2ZfZmxhdF9kdF9pc19jb21wYXRpYmxlKHJvb3QsICJkZW54LG1wYzgzMDhfcDFtIik7CisJcmV0dXJuIG9mX2ZsYXRfZHRfbWF0Y2gob2ZfZ2V0X2ZsYXRfZHRfcm9vdCgpLCBib2FyZCk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIF9faW5pdGRhdGEgb2ZfYnVzX2lkc1tdID0gewpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21wYzgzMXhfcmRiLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvbXBjODMxeF9yZGIuYwppbmRleCBhZTUyNWU0Li5iNTRjZDczIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvbXBjODMxeF9yZGIuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvbXBjODMxeF9yZGIuYwpAQCAtNjAsMTUgKzYwLDE4IEBACiAJaXBpY19zZXRfZGVmYXVsdF9wcmlvcml0eSgpOwogfQogCitzdHJ1Y3QgY29uc3QgY2hhciAqYm9hcmRbXSBfX2luaXRkYXRhID0geworCSJNUEM4MzEzRVJEQiIsCisJImZzbCxtcGM4MzE1ZXJkYiIsCisJTlVMTAorfQorCiAvKgogICogQ2FsbGVkIHZlcnkgZWFybHksIE1NVSBpcyBvZmYsIGRldmljZS10cmVlIGlzbid0IHVuZmxhdHRlbmVkCiAgKi8KIHN0YXRpYyBpbnQgX19pbml0IG1wYzgzMXhfcmRiX3Byb2JlKHZvaWQpCiB7Ci0JdW5zaWduZWQgbG9uZyByb290ID0gb2ZfZ2V0X2ZsYXRfZHRfcm9vdCgpOwotCi0JcmV0dXJuIG9mX2ZsYXRfZHRfaXNfY29tcGF0aWJsZShyb290LCAiTVBDODMxM0VSREIiKSB8fAotCSAgICAgICBvZl9mbGF0X2R0X2lzX2NvbXBhdGlibGUocm9vdCwgImZzbCxtcGM4MzE1ZXJkYiIpOworCXJldHVybiBvZl9mbGF0X2R0X21hdGNoKG9mX2dldF9mbGF0X2R0X3Jvb3QoKSwgYm9hcmQpOwogfQogCiBzdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCBfX2luaXRkYXRhIG9mX2J1c19pZHNbXSA9IHsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9tcGM4Mzd4X3JkYi5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21wYzgzN3hfcmRiLmMKaW5kZXggOTEwY2FhNi4uN2JhZmJmMiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21wYzgzN3hfcmRiLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21wYzgzN3hfcmRiLmMKQEAgLTEwMSwxNyArMTAxLDIwIEBACiAJaXBpY19zZXRfZGVmYXVsdF9wcmlvcml0eSgpOwogfQogCitzdGF0aWMgY29uc3QgY2hhciAqYm9hcmRbXSBfX2luaXRkYXRhID0geworCSJmc2wsbXBjODM3N3JkYiIsCisJImZzbCxtcGM4Mzc4cmRiIiwKKwkiZnNsLG1wYzgzNzlyZGIiLAorCSJmc2wsbXBjODM3N3dsYW4iLAorCU5VTEwKK307CisKIC8qCiAgKiBDYWxsZWQgdmVyeSBlYXJseSwgTU1VIGlzIG9mZiwgZGV2aWNlLXRyZWUgaXNuJ3QgdW5mbGF0dGVuZWQKICAqLwogc3RhdGljIGludCBfX2luaXQgbXBjODM3eF9yZGJfcHJvYmUodm9pZCkKIHsKLQl1bnNpZ25lZCBsb25nIHJvb3QgPSBvZl9nZXRfZmxhdF9kdF9yb290KCk7Ci0KLQlyZXR1cm4gb2ZfZmxhdF9kdF9pc19jb21wYXRpYmxlKHJvb3QsICJmc2wsbXBjODM3N3JkYiIpIHx8Ci0JICAgICAgIG9mX2ZsYXRfZHRfaXNfY29tcGF0aWJsZShyb290LCAiZnNsLG1wYzgzNzhyZGIiKSB8fAotCSAgICAgICBvZl9mbGF0X2R0X2lzX2NvbXBhdGlibGUocm9vdCwgImZzbCxtcGM4Mzc5cmRiIikgfHwKLQkgICAgICAgb2ZfZmxhdF9kdF9pc19jb21wYXRpYmxlKHJvb3QsICJmc2wsbXBjODM3N3dsYW4iKTsKKwlyZXR1cm4gb2ZfZmxhdF9kdF9tYXRjaChvZl9nZXRfZmxhdF9kdF9yb290KCksIGJvYXJkKTsKIH0KIAogZGVmaW5lX21hY2hpbmUobXBjODM3eF9yZGIpIHsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC90cW04NXh4LmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvdHFtODV4eC5jCmluZGV4IDhmMjliYmMuLjVlODQ3ZDAgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC90cW04NXh4LmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L3RxbTg1eHguYwpAQCAtMTg2LDIxICsxODYsMjEgQEAKIH0KIG1hY2hpbmVfZGV2aWNlX2luaXRjYWxsKHRxbTg1eHgsIGRlY2xhcmVfb2ZfcGxhdGZvcm1fZGV2aWNlcyk7CiAKK3N0YXRpYyBjb25zdCBjaGFyICpib2FyZFtdIF9faW5pdGRhdGEgPSB7CisJInRxYyx0cW04NTQwIiwKKwkidHFjLHRxbTg1NDEiLAorCSJ0cWMsdHFtODU0OCIsCisJInRxYyx0cW04NTU1IiwKKwkidHFjLHRxbTg1NjAiLAorCU5VTEwKK307CisKIC8qCiAgKiBDYWxsZWQgdmVyeSBlYXJseSwgZGV2aWNlLXRyZWUgaXNuJ3QgdW5mbGF0dGVuZWQKICAqLwogc3RhdGljIGludCBfX2luaXQgdHFtODV4eF9wcm9iZSh2b2lkKQogewotCXVuc2lnbmVkIGxvbmcgcm9vdCA9IG9mX2dldF9mbGF0X2R0X3Jvb3QoKTsKLQotCWlmICgob2ZfZmxhdF9kdF9pc19jb21wYXRpYmxlKHJvb3QsICJ0cWMsdHFtODU0MCIpKSB8fAotCSAgICAob2ZfZmxhdF9kdF9pc19jb21wYXRpYmxlKHJvb3QsICJ0cWMsdHFtODU0MSIpKSB8fAotCSAgICAob2ZfZmxhdF9kdF9pc19jb21wYXRpYmxlKHJvb3QsICJ0cWMsdHFtODU0OCIpKSB8fAotCSAgICAob2ZfZmxhdF9kdF9pc19jb21wYXRpYmxlKHJvb3QsICJ0cWMsdHFtODU1NSIpKSB8fAotCSAgICAob2ZfZmxhdF9kdF9pc19jb21wYXRpYmxlKHJvb3QsICJ0cWMsdHFtODU2MCIpKSkKLQkJcmV0dXJuIDE7Ci0KLQlyZXR1cm4gMDsKKwlyZXR1cm4gb2ZfZmxhdF9kdF9tYXRjaChvZl9nZXRfZmxhdF9kdF9yb290KCksIGJvYXJkKTsKIH0KIAogZGVmaW5lX21hY2hpbmUodHFtODV4eCkgewpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9LY29uZmlnIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9LY29uZmlnCmluZGV4IDk1NjE1NGYuLjIwNTc2ODIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvS2NvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL0tjb25maWcKQEAgLTMxMywxMyArMzEzLDE0IEBACiBzb3VyY2UgImFyY2gvcG93ZXJwYy9zeXNkZXYvYmVzdGNvbW0vS2NvbmZpZyIKIAogY29uZmlnIE1QQzh4eHhfR1BJTwotCWJvb2wgIk1QQzh4eHggR1BJTyBzdXBwb3J0IgotCWRlcGVuZHMgb24gUFBDX01QQzgzMXggfHwgUFBDX01QQzgzNHggfHwgUFBDX01QQzgzN3ggfHwgRlNMX1NPQ19CT09LRSB8fCBQUENfODZ4eAorCWJvb2wgIk1QQzUxMngvTVBDOHh4eCBHUElPIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBQUENfTVBDNTEyeCB8fCBQUENfTVBDODMxeCB8fCBQUENfTVBDODM0eCB8fCBQUENfTVBDODM3eCB8fCBcCisJCSAgIEZTTF9TT0NfQk9PS0UgfHwgUFBDXzg2eHgKIAlzZWxlY3QgR0VORVJJQ19HUElPCiAJc2VsZWN0IEFSQ0hfUkVRVUlSRV9HUElPTElCCiAJaGVscAogCSAgU2F5IFkgaGVyZSBpZiB5b3UncmUgZ29pbmcgdG8gdXNlIGhhcmR3YXJlIHRoYXQgY29ubmVjdHMgdG8gdGhlCi0JICBNUEM4MzF4LzgzNHgvODM3eC84NTcyLzg2MTAgR1BJT3MuCisJICBNUEM1MTJ4LzgzMXgvODM0eC84Mzd4Lzg1NzIvODYxMCBHUElPcy4KIAogY29uZmlnIFNJTVBMRV9HUElPCiAJYm9vbCAiU3VwcG9ydCBmb3Igc2ltcGxlLCBtZW1vcnktbWFwcGVkIEdQSU8gY29udHJvbGxlcnMiCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvYmVhdF9pb21tdS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2JlYXRfaW9tbXUuYwppbmRleCBiZWVjNDA1Li4zY2U2ODU1IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvYmVhdF9pb21tdS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9iZWF0X2lvbW11LmMKQEAgLTc2LDcgKzc2LDcgQEAKIAogc3RhdGljIHZvaWQgY2VsbGViX2RtYV9kZXZfc2V0dXAoc3RydWN0IGRldmljZSAqZGV2KQogewotCWRldi0+YXJjaGRhdGEuZG1hX29wcyA9IGdldF9wY2lfZG1hX29wcygpOworCXNldF9kbWFfb3BzKGRldiwgJmRtYV9kaXJlY3Rfb3BzKTsKIAlzZXRfZG1hX29mZnNldChkZXYsIGNlbGxlYl9kbWFfZGlyZWN0X29mZnNldCk7CiB9CiAKQEAgLTEwNiw3ICsxMDYsNiBAQAogc3RhdGljIGludCBfX2luaXQgY2VsbGViX2luaXRfaW9tbXUodm9pZCkKIHsKIAljZWxsZWJfaW5pdF9kaXJlY3RfbWFwcGluZygpOwotCXNldF9wY2lfZG1hX29wcygmZG1hX2RpcmVjdF9vcHMpOwogCXBwY19tZC5wY2lfZG1hX2Rldl9zZXR1cCA9IGNlbGxlYl9wY2lfZG1hX2Rldl9zZXR1cDsKIAlidXNfcmVnaXN0ZXJfbm90aWZpZXIoJnBsYXRmb3JtX2J1c190eXBlLCAmY2VsbGViX29mX2J1c19ub3RpZmllcik7CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9sc2NzYV9hbGxvYy5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL2xzY3NhX2FsbG9jLmMKaW5kZXggYTEwMWFiZi4uM2I4OTRmNSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL2xzY3NhX2FsbG9jLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL2xzY3NhX2FsbG9jLmMKQEAgLTM2LDEwICszNiw5IEBACiAJc3RydWN0IHNwdV9sc2NzYSAqbHNjc2E7CiAJdW5zaWduZWQgY2hhciAqcDsKIAotCWxzY3NhID0gdm1hbGxvYyhzaXplb2Yoc3RydWN0IHNwdV9sc2NzYSkpOworCWxzY3NhID0gdnphbGxvYyhzaXplb2Yoc3RydWN0IHNwdV9sc2NzYSkpOwogCWlmICghbHNjc2EpCiAJCXJldHVybiAtRU5PTUVNOwotCW1lbXNldChsc2NzYSwgMCwgc2l6ZW9mKHN0cnVjdCBzcHVfbHNjc2EpKTsKIAljc2EtPmxzY3NhID0gbHNjc2E7CiAKIAkvKiBTZXQgTFMgcGFnZXMgcmVzZXJ2ZWQgdG8gYWxsb3cgZm9yIHVzZXItc3BhY2UgbWFwcGluZy4gKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2hycC90aW1lLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NocnAvdGltZS5jCmluZGV4IDA1NGRmZTUuLmY4MDNmNGIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2hycC90aW1lLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jaHJwL3RpbWUuYwpAQCAtMjksNiArMjksMTAgQEAKIAogZXh0ZXJuIHNwaW5sb2NrX3QgcnRjX2xvY2s7CiAKKyNkZWZpbmUgTlZSQU1fQVMwICAweDc0CisjZGVmaW5lIE5WUkFNX0FTMSAgMHg3NQorI2RlZmluZSBOVlJBTV9EQVRBIDB4NzcKKwogc3RhdGljIGludCBudnJhbV9hczEgPSBOVlJBTV9BUzE7CiBzdGF0aWMgaW50IG52cmFtX2FzMCA9IE5WUkFNX0FTMDsKIHN0YXRpYyBpbnQgbnZyYW1fZGF0YSA9IE5WUkFNX0RBVEE7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvbWYuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy9tZi5jCmluZGV4IDQyZDBhODguLmI1ZTAyNmIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy9tZi5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy9tZi5jCkBAIC0xMDQ1LDcxICsxMDQ1LDkgQEAKIAkud3JpdGUJCT0gbWZfc2lkZV9wcm9jX3dyaXRlLAogfTsKIAotI2lmIDAKLXN0YXRpYyB2b2lkIG1mX2dldFNyY0hpc3RvcnkoY2hhciAqYnVmZmVyLCBpbnQgc2l6ZSkKLXsKLQlzdHJ1Y3QgSXBsVHlwZVJldHVyblN0dWZmIHJldHVybl9zdHVmZjsKLQlzdHJ1Y3QgcGVuZGluZ19ldmVudCAqZXYgPSBuZXdfcGVuZGluZ19ldmVudCgpOwotCWludCByYyA9IDA7Ci0JY2hhciAqcGFnZXNbNF07Ci0KLQlwYWdlc1swXSA9IGttYWxsb2MoNDA5NiwgR0ZQX0FUT01JQyk7Ci0JcGFnZXNbMV0gPSBrbWFsbG9jKDQwOTYsIEdGUF9BVE9NSUMpOwotCXBhZ2VzWzJdID0ga21hbGxvYyg0MDk2LCBHRlBfQVRPTUlDKTsKLQlwYWdlc1szXSA9IGttYWxsb2MoNDA5NiwgR0ZQX0FUT01JQyk7Ci0JaWYgKChldiA9PSBOVUxMKSB8fCAocGFnZXNbMF0gPT0gTlVMTCkgfHwgKHBhZ2VzWzFdID09IE5VTEwpCi0JCQkgfHwgKHBhZ2VzWzJdID09IE5VTEwpIHx8IChwYWdlc1szXSA9PSBOVUxMKSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlyZXR1cm5fc3R1ZmYueFR5cGUgPSAwOwotCXJldHVybl9zdHVmZi54UmMgPSAwOwotCXJldHVybl9zdHVmZi54RG9uZSA9IDA7Ci0JZXYtPmV2ZW50LmhwX2xwX2V2ZW50LnhTdWJ0eXBlID0gNjsKLQlldi0+ZXZlbnQuaHBfbHBfZXZlbnQueC54U3VidHlwZURhdGEgPQotCQlzdWJ0eXBlX2RhdGEoJ00nLCAnRicsICdWJywgJ0knKTsKLQlldi0+ZXZlbnQuZGF0YS52c3BfY21kLnhFdmVudCA9ICZyZXR1cm5fc3R1ZmY7Ci0JZXYtPmV2ZW50LmRhdGEudnNwX2NtZC5jbWQgPSA0OwotCWV2LT5ldmVudC5kYXRhLnZzcF9jbWQubHBfaW5kZXggPSBIdkxwQ29uZmlnX2dldExwSW5kZXgoKTsKLQlldi0+ZXZlbnQuZGF0YS52c3BfY21kLnJlc3VsdF9jb2RlID0gMHhGRjsKLQlldi0+ZXZlbnQuZGF0YS52c3BfY21kLnJlc2VydmVkID0gMDsKLQlldi0+ZXZlbnQuZGF0YS52c3BfY21kLnN1Yl9kYXRhLnBhZ2VbMF0gPSBpc2VyaWVzX2h2X2FkZHIocGFnZXNbMF0pOwotCWV2LT5ldmVudC5kYXRhLnZzcF9jbWQuc3ViX2RhdGEucGFnZVsxXSA9IGlzZXJpZXNfaHZfYWRkcihwYWdlc1sxXSk7Ci0JZXYtPmV2ZW50LmRhdGEudnNwX2NtZC5zdWJfZGF0YS5wYWdlWzJdID0gaXNlcmllc19odl9hZGRyKHBhZ2VzWzJdKTsKLQlldi0+ZXZlbnQuZGF0YS52c3BfY21kLnN1Yl9kYXRhLnBhZ2VbM10gPSBpc2VyaWVzX2h2X2FkZHIocGFnZXNbM10pOwotCW1iKCk7Ci0JaWYgKHNpZ25hbF9ldmVudChldikgIT0gMCkKLQkJcmV0dXJuOwotCi0gCXdoaWxlIChyZXR1cm5fc3R1ZmYueERvbmUgIT0gMSkKLSAJCXVkZWxheSgxMCk7Ci0gCWlmIChyZXR1cm5fc3R1ZmYueFJjID09IDApCi0gCQltZW1jcHkoYnVmZmVyLCBwYWdlc1swXSwgc2l6ZSk7Ci0Ja2ZyZWUocGFnZXNbMF0pOwotCWtmcmVlKHBhZ2VzWzFdKTsKLQlrZnJlZShwYWdlc1syXSk7Ci0Ja2ZyZWUocGFnZXNbM10pOwotfQotI2VuZGlmCi0KIHN0YXRpYyBpbnQgbWZfc3JjX3Byb2Nfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnYpCiB7Ci0jaWYgMAotCWludCBsZW47Ci0KLQltZl9nZXRTcmNIaXN0b3J5KHBhZ2UsIGNvdW50KTsKLQlsZW4gPSBjb3VudDsKLQlsZW4gLT0gb2ZmOwotCWlmIChsZW4gPCBjb3VudCkgewotCQkqZW9mID0gMTsKLQkJaWYgKGxlbiA8PSAwKQotCQkJcmV0dXJuIDA7Ci0JfSBlbHNlCi0JCWxlbiA9IGNvdW50OwotCSpzdGFydCA9IHBhZ2UgKyBvZmY7Ci0JcmV0dXJuIGxlbjsKLSNlbHNlCiAJcmV0dXJuIDA7Ci0jZW5kaWYKIH0KIAogc3RhdGljIGludCBtZl9zcmNfcHJvY19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wYXNlbWkvaW9tbXUuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcGFzZW1pL2lvbW11LmMKaW5kZXggMWY5ZmIyYy4uMTQ5NDNlZiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wYXNlbWkvaW9tbXUuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bhc2VtaS9pb21tdS5jCkBAIC0xNTYsMjAgKzE1NiwxMiBAQAogCiBzdGF0aWMgdm9pZCBwY2lfZG1hX2J1c19zZXR1cF9wYXNlbWkoc3RydWN0IHBjaV9idXMgKmJ1cykKIHsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRuOwotCiAJcHJfZGVidWcoInBjaV9kbWFfYnVzX3NldHVwLCBidXMgJXAsIGJ1cy0+c2VsZiAlcFxuIiwgYnVzLCBidXMtPnNlbGYpOwogCiAJaWYgKCFpb21tdV90YWJsZV9pb2JtYXBfaW5pdGVkKSB7CiAJCWlvbW11X3RhYmxlX2lvYm1hcF9pbml0ZWQgPSAxOwogCQlpb21tdV90YWJsZV9pb2JtYXBfc2V0dXAoKTsKIAl9Ci0KLQlkbiA9IHBjaV9idXNfdG9fT0Zfbm9kZShidXMpOwotCi0JaWYgKGRuKQotCQlQQ0lfRE4oZG4pLT5pb21tdV90YWJsZSA9ICZpb21tdV90YWJsZV9pb2JtYXA7Ci0KIH0KIAogCkBAIC0xOTIsOSArMTg0LDYgQEAKIAlzZXRfaW9tbXVfdGFibGVfYmFzZSgmZGV2LT5kZXYsICZpb21tdV90YWJsZV9pb2JtYXApOwogfQogCi1zdGF0aWMgdm9pZCBwY2lfZG1hX2J1c19zZXR1cF9udWxsKHN0cnVjdCBwY2lfYnVzICpiKSB7IH0KLXN0YXRpYyB2b2lkIHBjaV9kbWFfZGV2X3NldHVwX251bGwoc3RydWN0IHBjaV9kZXYgKmQpIHsgfQotCiBpbnQgX19pbml0IGlvYl9pbml0KHN0cnVjdCBkZXZpY2Vfbm9kZSAqZG4pCiB7CiAJdW5zaWduZWQgbG9uZyB0bXA7CkBAIC0yNTEsMTQgKzI0MCw4IEBACiAJaW9tbXVfb2ZmID0gb2ZfY2hvc2VuICYmCiAJCQlvZl9nZXRfcHJvcGVydHkob2ZfY2hvc2VuLCAibGludXgsaW9tbXUtb2ZmIiwgTlVMTCk7CiAjZW5kaWYKLQlpZiAoaW9tbXVfb2ZmKSB7Ci0JCS8qIERpcmVjdCBJL08sIElPTU1VIG9mZiAqLwotCQlwcGNfbWQucGNpX2RtYV9kZXZfc2V0dXAgPSBwY2lfZG1hX2Rldl9zZXR1cF9udWxsOwotCQlwcGNfbWQucGNpX2RtYV9idXNfc2V0dXAgPSBwY2lfZG1hX2J1c19zZXR1cF9udWxsOwotCQlzZXRfcGNpX2RtYV9vcHMoJmRtYV9kaXJlY3Rfb3BzKTsKLQorCWlmIChpb21tdV9vZmYpCiAJCXJldHVybjsKLQl9CiAKIAlpb2JfaW5pdChOVUxMKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm1hYy9zZXR1cC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm1hYy9zZXR1cC5jCmluZGV4IDlkZWIyNzQuLmQ1YWNlYjcgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvc2V0dXAuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL3NldHVwLmMKQEAgLTUwNiw2ICs1MDYsMTUgQEAKIAkJb2ZfcGxhdGZvcm1fZGV2aWNlX2NyZWF0ZShucCwgInNtdSIsIE5VTEwpOwogCQlvZl9ub2RlX3B1dChucCk7CiAJfQorCW5wID0gb2ZfZmluZF9ub2RlX2J5X3R5cGUoTlVMTCwgImZjdSIpOworCWlmIChucCA9PSBOVUxMKSB7CisJCS8qIFNvbWUgbWFjaGluZXMgaGF2ZSBzdHJhbmdlbHkgYnJva2VuIGRldmljZS10cmVlICovCisJCW5wID0gb2ZfZmluZF9ub2RlX2J5X3BhdGgoIi91M0AwLGY4MDAwMDAwL2kyY0BmODAwMTAwMC9mYW5AMTVlIik7CisJfQorCWlmIChucCkgeworCQlvZl9wbGF0Zm9ybV9kZXZpY2VfY3JlYXRlKG5wLCAidGVtcGVyYXR1cmUiLCBOVUxMKTsKKwkJb2Zfbm9kZV9wdXQobnApOworCX0KIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL0tjb25maWcgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvS2NvbmZpZwppbmRleCAzMTM5ODE0Li41ZDFiNzQzIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvS2NvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvS2NvbmZpZwpAQCAtMzMsNiArMzMsMTYgQEAKICAgICAgICBkZXBlbmRzIG9uIFBDSV9NU0kgJiYgRUVICiAgICAgICAgZGVmYXVsdCB5CiAKK2NvbmZpZyBQU0VSSUVTX0VORVJHWQorCXRyaXN0YXRlICJwU2VyaWVzIGVuZXJneSBtYW5hZ2VtZW50IGNhcGFiaWxpdGllcyBkcml2ZXIiCisJZGVwZW5kcyBvbiBQUENfUFNFUklFUworCWRlZmF1bHQgeQorCWhlbHAKKwkgIFByb3ZpZGVzIGludGVyZmFjZSB0byBwbGF0Zm9ybSBlbmVyZ3kgbWFuYWdlbWVudCBjYXBhYmlsaXRpZXMKKwkgIG9uIHN1cHBvcnRlZCBQU0VSSUVTIHBsYXRmb3Jtcy4KKwkgIFByb3ZpZGVzOiAvc3lzL2RldmljZXMvc3lzdGVtL2NwdS9wc2VyaWVzXyhkZSlhY3RpdmF0aW9uX2hpbnRfbGlzdAorCSAgYW5kIC9zeXMvZGV2aWNlcy9zeXN0ZW0vY3B1L2NwdU4vcHNlcmllc18oZGUpYWN0aXZhdGlvbl9oaW50CisKIGNvbmZpZyBTQ0FOTE9HCiAJdHJpc3RhdGUgIlNjYW5sb2cgZHVtcCBpbnRlcmZhY2UiCiAJZGVwZW5kcyBvbiBSVEFTX1BST0MgJiYgUFBDX1BTRVJJRVMKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9NYWtlZmlsZSBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9NYWtlZmlsZQppbmRleCA1OWViOGJkLi5mYzUyMzc4IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvTWFrZWZpbGUKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL01ha2VmaWxlCkBAIC0xMSw2ICsxMSw3IEBACiBvYmotJChDT05GSUdfS0VYRUMpCSs9IGtleGVjLm8KIG9iai0kKENPTkZJR19QQ0kpCSs9IHBjaS5vIHBjaV9kbHBhci5vCiBvYmotJChDT05GSUdfUFNFUklFU19NU0kpCSs9IG1zaS5vCitvYmotJChDT05GSUdfUFNFUklFU19FTkVSR1kpCSs9IHBzZXJpZXNfZW5lcmd5Lm8KIAogb2JqLSQoQ09ORklHX0hPVFBMVUdfQ1BVKQkrPSBob3RwbHVnLWNwdS5vCiBvYmotJChDT05GSUdfTUVNT1JZX0hPVFBMVUcpCSs9IGhvdHBsdWctbWVtb3J5Lm8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9lZWhfc3lzZnMuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9lZWhfc3lzZnMuYwppbmRleCAxNWUxM2I1Li4yMzk4MmM3IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvZWVoX3N5c2ZzLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2VlaF9zeXNmcy5jCkBAIC0yNSw3ICsyNSw2IEBACiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8YXNtL3BwYy1wY2kuaD4KICNpbmNsdWRlIDxhc20vcGNpLWJyaWRnZS5oPgotI2luY2x1ZGUgPGxpbnV4L2tvYmplY3QuaD4KIAogLyoqCiAgKiBFRUhfU0hPV19BVFRSIC0tIGNyZWF0ZSBzeXNmcyBlbnRyeSBmb3IgZWVoIHN0YXRpc3RpYwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2Zpcm13YXJlLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvZmlybXdhcmUuYwppbmRleCAwYTE0ZDhjLi4wYjBlZmYwIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvZmlybXdhcmUuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvZmlybXdhcmUuYwpAQCAtNTUsNiArNTUsNyBAQAogCXtGV19GRUFUVVJFX1hEQUJSLAkJImhjYWxsLXhkYWJyIn0sCiAJe0ZXX0ZFQVRVUkVfTVVMVElUQ0UsCQkiaGNhbGwtbXVsdGktdGNlIn0sCiAJe0ZXX0ZFQVRVUkVfU1BMUEFSLAkJImhjYWxsLXNwbHBhciJ9LAorCXtGV19GRUFUVVJFX1ZQSE4sCQkiaGNhbGwtdnBobiJ9LAogfTsKIAogLyogQnVpbGQgdXAgdGhlIGZpcm13YXJlIGZlYXR1cmVzIGJpdG1hc2sgdXNpbmcgdGhlIGNvbnRlbnRzIG9mCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvaHZDYWxsLlMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvaHZDYWxsLlMKaW5kZXggNDhkMjA1Ny4uZmQwNWZkZSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2h2Q2FsbC5TCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9odkNhbGwuUwpAQCAtMTEsNiArMTEsNyBAQAogI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KICNpbmNsdWRlIDxhc20vcHBjX2FzbS5oPgogI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgorI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KIAkKICNkZWZpbmUgU1RLX1BBUk0oaSkgICAgICg0OCArICgoaSktMykqOCkKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2lvbW11LmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvaW9tbXUuYwppbmRleCBhNzdiY2FlLi5lZGVhNjBiIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvaW9tbXUuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvaW9tbXUuYwpAQCAtMTQwLDcgKzE0MCw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIERFRklORV9QRVJfQ1BVKHU2NCAqLCB0Y2VfcGFnZSkgPSBOVUxMOworc3RhdGljIERFRklORV9QRVJfQ1BVKHU2NCAqLCB0Y2VfcGFnZSk7CiAKIHN0YXRpYyBpbnQgdGNlX2J1aWxkbXVsdGlfcFNlcmllc0xQKHN0cnVjdCBpb21tdV90YWJsZSAqdGJsLCBsb25nIHRjZW51bSwKIAkJCQkgICAgIGxvbmcgbnBhZ2VzLCB1bnNpZ25lZCBsb25nIHVhZGRyLApAQCAtMzIzLDE0ICszMjMsMTMgQEAKIHN0YXRpYyB2b2lkIGlvbW11X3RhYmxlX3NldHBhcm1zX2xwYXIoc3RydWN0IHBjaV9jb250cm9sbGVyICpwaGIsCiAJCQkJICAgICAgc3RydWN0IGRldmljZV9ub2RlICpkbiwKIAkJCQkgICAgICBzdHJ1Y3QgaW9tbXVfdGFibGUgKnRibCwKLQkJCQkgICAgICBjb25zdCB2b2lkICpkbWFfd2luZG93LAotCQkJCSAgICAgIGludCBidXNzdWJubykKKwkJCQkgICAgICBjb25zdCB2b2lkICpkbWFfd2luZG93KQogewogCXVuc2lnbmVkIGxvbmcgb2Zmc2V0LCBzaXplOwogCi0JdGJsLT5pdF9idXNubyAgPSBidXNzdWJubzsKIAlvZl9wYXJzZV9kbWFfd2luZG93KGRuLCBkbWFfd2luZG93LCAmdGJsLT5pdF9pbmRleCwgJm9mZnNldCwgJnNpemUpOwogCisJdGJsLT5pdF9idXNubyA9IHBoYi0+YnVzLT5udW1iZXI7CiAJdGJsLT5pdF9iYXNlICAgPSAwOwogCXRibC0+aXRfYmxvY2tzaXplICA9IDE2OwogCXRibC0+aXRfdHlwZSA9IFRDRV9QQ0k7CkBAIC00NTAsMTQgKzQ0OSwxMCBAQAogCWlmICghcHBjaS0+aW9tbXVfdGFibGUpIHsKIAkJdGJsID0ga3phbGxvY19ub2RlKHNpemVvZihzdHJ1Y3QgaW9tbXVfdGFibGUpLCBHRlBfS0VSTkVMLAogCQkJCSAgIHBwY2ktPnBoYi0+bm9kZSk7Ci0JCWlvbW11X3RhYmxlX3NldHBhcm1zX2xwYXIocHBjaS0+cGhiLCBwZG4sIHRibCwgZG1hX3dpbmRvdywKLQkJCWJ1cy0+bnVtYmVyKTsKKwkJaW9tbXVfdGFibGVfc2V0cGFybXNfbHBhcihwcGNpLT5waGIsIHBkbiwgdGJsLCBkbWFfd2luZG93KTsKIAkJcHBjaS0+aW9tbXVfdGFibGUgPSBpb21tdV9pbml0X3RhYmxlKHRibCwgcHBjaS0+cGhiLT5ub2RlKTsKIAkJcHJfZGVidWcoIiAgY3JlYXRlZCB0YWJsZTogJXBcbiIsIHBwY2ktPmlvbW11X3RhYmxlKTsKIAl9Ci0KLQlpZiAocGRuICE9IGRuKQotCQlQQ0lfRE4oZG4pLT5pb21tdV90YWJsZSA9IHBwY2ktPmlvbW11X3RhYmxlOwogfQogCiAKQEAgLTUzMywyMSArNTI4LDExIEBACiAJfQogCXByX2RlYnVnKCIgIHBhcmVudCBpcyAlc1xuIiwgcGRuLT5mdWxsX25hbWUpOwogCi0JLyogQ2hlY2sgZm9yIHBhcmVudCA9PSBOVUxMIHNvIHdlIGRvbid0IHRyeSB0byBzZXR1cCB0aGUgZW1wdHkgRUFEUwotCSAqIHNsb3RzIG9uIFBPV0VSNCBtYWNoaW5lcy4KLQkgKi8KLQlpZiAoZG1hX3dpbmRvdyA9PSBOVUxMIHx8IHBkbi0+cGFyZW50ID09IE5VTEwpIHsKLQkJcHJfZGVidWcoIiAgbm8gZG1hIHdpbmRvdyBmb3IgZGV2aWNlLCBsaW5raW5nIHRvIHBhcmVudFxuIik7Ci0JCXNldF9pb21tdV90YWJsZV9iYXNlKCZkZXYtPmRldiwgUENJX0ROKHBkbiktPmlvbW11X3RhYmxlKTsKLQkJcmV0dXJuOwotCX0KLQogCXBjaSA9IFBDSV9ETihwZG4pOwogCWlmICghcGNpLT5pb21tdV90YWJsZSkgewogCQl0YmwgPSBremFsbG9jX25vZGUoc2l6ZW9mKHN0cnVjdCBpb21tdV90YWJsZSksIEdGUF9LRVJORUwsCiAJCQkJICAgcGNpLT5waGItPm5vZGUpOwotCQlpb21tdV90YWJsZV9zZXRwYXJtc19scGFyKHBjaS0+cGhiLCBwZG4sIHRibCwgZG1hX3dpbmRvdywKLQkJCXBjaS0+cGhiLT5idXMtPm51bWJlcik7CisJCWlvbW11X3RhYmxlX3NldHBhcm1zX2xwYXIocGNpLT5waGIsIHBkbiwgdGJsLCBkbWFfd2luZG93KTsKIAkJcGNpLT5pb21tdV90YWJsZSA9IGlvbW11X2luaXRfdGFibGUodGJsLCBwY2ktPnBoYi0+bm9kZSk7CiAJCXByX2RlYnVnKCIgIGNyZWF0ZWQgdGFibGU6ICVwXG4iLCBwY2ktPmlvbW11X3RhYmxlKTsKIAl9IGVsc2UgewpAQCAtNTcxLDggKzU1Niw3IEBACiAKIAlzd2l0Y2ggKGFjdGlvbikgewogCWNhc2UgUFNFUklFU19SRUNPTkZJR19SRU1PVkU6Ci0JCWlmIChwY2kgJiYgcGNpLT5pb21tdV90YWJsZSAmJgotCQkgICAgb2ZfZ2V0X3Byb3BlcnR5KG5wLCAiaWJtLGRtYS13aW5kb3ciLCBOVUxMKSkKKwkJaWYgKHBjaSAmJiBwY2ktPmlvbW11X3RhYmxlKQogCQkJaW9tbXVfZnJlZV90YWJsZShwY2ktPmlvbW11X3RhYmxlLCBucC0+ZnVsbF9uYW1lKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKQEAgLTU4OSwxMyArNTczLDggQEAKIC8qIFRoZXNlIGFyZSBjYWxsZWQgdmVyeSBlYXJseS4gKi8KIHZvaWQgaW9tbXVfaW5pdF9lYXJseV9wU2VyaWVzKHZvaWQpCiB7Ci0JaWYgKG9mX2Nob3NlbiAmJiBvZl9nZXRfcHJvcGVydHkob2ZfY2hvc2VuLCAibGludXgsaW9tbXUtb2ZmIiwgTlVMTCkpIHsKLQkJLyogRGlyZWN0IEkvTywgSU9NTVUgb2ZmICovCi0JCXBwY19tZC5wY2lfZG1hX2Rldl9zZXR1cCA9IE5VTEw7Ci0JCXBwY19tZC5wY2lfZG1hX2J1c19zZXR1cCA9IE5VTEw7Ci0JCXNldF9wY2lfZG1hX29wcygmZG1hX2RpcmVjdF9vcHMpOworCWlmIChvZl9jaG9zZW4gJiYgb2ZfZ2V0X3Byb3BlcnR5KG9mX2Nob3NlbiwgImxpbnV4LGlvbW11LW9mZiIsIE5VTEwpKQogCQlyZXR1cm47Ci0JfQogCiAJaWYgKGZpcm13YXJlX2hhc19mZWF0dXJlKEZXX0ZFQVRVUkVfTFBBUikpIHsKIAkJaWYgKGZpcm13YXJlX2hhc19mZWF0dXJlKEZXX0ZFQVRVUkVfTVVMVElUQ0UpKSB7CkBAIC02MjIsMyArNjAxLDE3IEBACiAJc2V0X3BjaV9kbWFfb3BzKCZkbWFfaW9tbXVfb3BzKTsKIH0KIAorc3RhdGljIGludCBfX2luaXQgZGlzYWJsZV9tdWx0aXRjZShjaGFyICpzdHIpCit7CisJaWYgKHN0cmNtcChzdHIsICJvZmYiKSA9PSAwICYmCisJICAgIGZpcm13YXJlX2hhc19mZWF0dXJlKEZXX0ZFQVRVUkVfTFBBUikgJiYKKwkgICAgZmlybXdhcmVfaGFzX2ZlYXR1cmUoRldfRkVBVFVSRV9NVUxUSVRDRSkpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiRGlzYWJsaW5nIE1VTFRJVENFIGZpcm13YXJlIGZlYXR1cmVcbiIpOworCQlwcGNfbWQudGNlX2J1aWxkID0gdGNlX2J1aWxkX3BTZXJpZXNMUDsKKwkJcHBjX21kLnRjZV9mcmVlCSA9IHRjZV9mcmVlX3BTZXJpZXNMUDsKKwkJcG93ZXJwY19maXJtd2FyZV9mZWF0dXJlcyAmPSB+RldfRkVBVFVSRV9NVUxUSVRDRTsKKwl9CisJcmV0dXJuIDE7Cit9CisKK19fc2V0dXAoIm11bHRpdGNlPSIsIGRpc2FibGVfbXVsdGl0Y2UpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2xwYXIuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9scGFyLmMKaW5kZXggZjEyOTA0MC4uNWQzZWE5ZiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2xwYXIuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvbHBhci5jCkBAIC02MjcsNiArNjI3LDE4IEBACiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBTZXJpZXNfbHBhcl90bGJpZV9sb2NrLCBmbGFncyk7CiB9CiAKK3N0YXRpYyBpbnQgX19pbml0IGRpc2FibGVfYnVsa19yZW1vdmUoY2hhciAqc3RyKQoreworCWlmIChzdHJjbXAoc3RyLCAib2ZmIikgPT0gMCAmJgorCSAgICBmaXJtd2FyZV9oYXNfZmVhdHVyZShGV19GRUFUVVJFX0JVTEtfUkVNT1ZFKSkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiRGlzYWJsaW5nIEJVTEtfUkVNT1ZFIGZpcm13YXJlIGZlYXR1cmUiKTsKKwkJCXBvd2VycGNfZmlybXdhcmVfZmVhdHVyZXMgJj0gfkZXX0ZFQVRVUkVfQlVMS19SRU1PVkU7CisJfQorCXJldHVybiAxOworfQorCitfX3NldHVwKCJidWxrX3JlbW92ZT0iLCBkaXNhYmxlX2J1bGtfcmVtb3ZlKTsKKwogdm9pZCBfX2luaXQgaHB0ZV9pbml0X2xwYXIodm9pZCkKIHsKIAlwcGNfbWQuaHB0ZV9pbnZhbGlkYXRlCT0gcFNlcmllc19scGFyX2hwdGVfaW52YWxpZGF0ZTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9udnJhbS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL252cmFtLmMKaW5kZXggYmMzYzdmMi4uN2U4MjhiYSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL252cmFtLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL252cmFtLmMKQEAgLTIyLDExICsyMiwyNSBAQAogI2luY2x1ZGUgPGFzbS9wcm9tLmg+CiAjaW5jbHVkZSA8YXNtL21hY2hkZXAuaD4KIAorLyogTWF4IGJ5dGVzIHRvIHJlYWQvd3JpdGUgaW4gb25lIGdvICovCisjZGVmaW5lIE5WUldfQ05UIDB4MjAKKwogc3RhdGljIHVuc2lnbmVkIGludCBudnJhbV9zaXplOwogc3RhdGljIGludCBudnJhbV9mZXRjaCwgbnZyYW1fc3RvcmU7CiBzdGF0aWMgY2hhciBudnJhbV9idWZbTlZSV19DTlRdOwkvKiBhc3N1bWUgdGhpcyBpcyBpbiB0aGUgZmlyc3QgNEdCICovCiBzdGF0aWMgREVGSU5FX1NQSU5MT0NLKG52cmFtX2xvY2spOwogCitzdGF0aWMgbG9uZyBudnJhbV9lcnJvcl9sb2dfaW5kZXggPSAtMTsKK3N0YXRpYyBsb25nIG52cmFtX2Vycm9yX2xvZ19zaXplID0gMDsKKworc3RydWN0IGVycl9sb2dfaW5mbyB7CisJaW50IGVycm9yX3R5cGU7CisJdW5zaWduZWQgaW50IHNlcV9udW07Cit9OworI2RlZmluZSBOVlJBTV9NQVhfUkVRCQkyMDc5CisjZGVmaW5lIE5WUkFNX01JTl9SRVEJCTEwNTUKKworI2RlZmluZSBOVlJBTV9MT0dfUEFSVF9OQU1FCSJpYm0scnRhcy1sb2ciCiAKIHN0YXRpYyBzc2l6ZV90IHBTZXJpZXNfbnZyYW1fcmVhZChjaGFyICpidWYsIHNpemVfdCBjb3VudCwgbG9mZl90ICppbmRleCkKIHsKQEAgLTExOSw2ICsxMzMsMTk3IEBACiAJcmV0dXJuIG52cmFtX3NpemUgPyBudnJhbV9zaXplIDogLUVOT0RFVjsKIH0KIAorCisvKiBudnJhbV93cml0ZV9lcnJvcl9sb2cKKyAqCisgKiBXZSBuZWVkIHRvIGJ1ZmZlciB0aGUgZXJyb3IgbG9ncyBpbnRvIG52cmFtIHRvIGVuc3VyZSB0aGF0IHdlIGhhdmUKKyAqIHRoZSBmYWlsdXJlIGluZm9ybWF0aW9uIHRvIGRlY29kZS4gIElmIHdlIGhhdmUgYSBzZXZlcmUgZXJyb3IgdGhlcmUKKyAqIGlzIG5vIHdheSB0byBndWFyYW50ZWUgdGhhdCB0aGUgT1Mgb3IgdGhlIG1hY2hpbmUgaXMgaW4gYSBzdGF0ZSB0bworICogZ2V0IGJhY2sgdG8gdXNlciBsYW5kIGFuZCB3cml0ZSB0aGUgZXJyb3IgdG8gZGlzay4gIEZvciBleGFtcGxlIGlmCisgKiB0aGUgU0NTSSBkZXZpY2UgZHJpdmVyIGNhdXNlcyBhIE1hY2hpbmUgQ2hlY2sgYnkgd3JpdGluZyB0byBhIGJhZAorICogSU8gYWRkcmVzcywgdGhlcmUgaXMgbm8gd2F5IG9mIGd1YXJhbnRlZWluZyB0aGF0IHRoZSBkZXZpY2UgZHJpdmVyCisgKiBpcyBpbiBhbnkgc3RhdGUgdGhhdCBpcyB3b3VsZCBhbHNvIGJlIGFibGUgdG8gd3JpdGUgdGhlIGVycm9yIGRhdGEKKyAqIGNhcHR1cmVkIHRvIGRpc2ssIHRodXMgd2UgYnVmZmVyIGl0IGluIE5WUkFNIGZvciBhbmFseXNpcyBvbiB0aGUKKyAqIG5leHQgYm9vdC4KKyAqCisgKiBJbiBOVlJBTSB0aGUgcGFydGl0aW9uIGNvbnRhaW5pbmcgdGhlIGVycm9yIGxvZyBidWZmZXIgd2lsbCBsb29rcyBsaWtlOgorICogSGVhZGVyIChpbiBieXRlcyk6CisgKiArLS0tLS0tLS0tLS0rLS0tLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tKworICogfCBzaWduYXR1cmUgfCBjaGVja3N1bSB8IGxlbmd0aCB8IG5hbWUgICAgICAgfCBkYXRhICAgICAgICAgICAgIHwKKyAqIHwwICAgICAgICAgIHwxICAgICAgICAgfDIgICAgICAzfDQgICAgICAgICAxNXwxNiAgICAgICAgbGVuZ3RoLTF8CisgKiArLS0tLS0tLS0tLS0rLS0tLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tKworICoKKyAqIFRoZSAnZGF0YScgc2VjdGlvbiB3b3VsZCBsb29rIGxpa2UgKGluIGJ5dGVzKToKKyAqICstLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgKiB8IGV2ZW50X2xvZ2dlZCB8IHNlcXVlbmNlICMgfCBlcnJvciBsb2cgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogfDAgICAgICAgICAgICAzfDQgICAgICAgICAgN3w4ICAgICAgICAgICAgbnZyYW1fZXJyb3JfbG9nX3NpemUtMXwKKyAqICstLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgKgorICogZXZlbnRfbG9nZ2VkOiAwIGlmIGV2ZW50IGhhcyBub3QgYmVlbiBsb2dnZWQgdG8gc3lzbG9nLCAxIGlmIGl0IGhhcworICogc2VxdWVuY2UgIzogVGhlIHVuaXF1ZSBzZXF1ZW5jZSAjIGZvciBlYWNoIGV2ZW50LiAodW50aWwgaXQgd3JhcHMpCisgKiBlcnJvciBsb2c6IFRoZSBlcnJvciBsb2cgZnJvbSBldmVudF9zY2FuCisgKi8KK2ludCBudnJhbV93cml0ZV9lcnJvcl9sb2coY2hhciAqIGJ1ZmYsIGludCBsZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBlcnJfdHlwZSwgdW5zaWduZWQgaW50IGVycm9yX2xvZ19jbnQpCit7CisJaW50IHJjOworCWxvZmZfdCB0bXBfaW5kZXg7CisJc3RydWN0IGVycl9sb2dfaW5mbyBpbmZvOworCQorCWlmIChudnJhbV9lcnJvcl9sb2dfaW5kZXggPT0gLTEpIHsKKwkJcmV0dXJuIC1FU1BJUEU7CisJfQorCisJaWYgKGxlbmd0aCA+IG52cmFtX2Vycm9yX2xvZ19zaXplKSB7CisJCWxlbmd0aCA9IG52cmFtX2Vycm9yX2xvZ19zaXplOworCX0KKworCWluZm8uZXJyb3JfdHlwZSA9IGVycl90eXBlOworCWluZm8uc2VxX251bSA9IGVycm9yX2xvZ19jbnQ7CisKKwl0bXBfaW5kZXggPSBudnJhbV9lcnJvcl9sb2dfaW5kZXg7CisKKwlyYyA9IHBwY19tZC5udnJhbV93cml0ZSgoY2hhciAqKSZpbmZvLCBzaXplb2Yoc3RydWN0IGVycl9sb2dfaW5mbyksICZ0bXBfaW5kZXgpOworCWlmIChyYyA8PSAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAibnZyYW1fd3JpdGVfZXJyb3JfbG9nOiBGYWlsZWQgbnZyYW1fd3JpdGUgKCVkKVxuIiwgcmMpOworCQlyZXR1cm4gcmM7CisJfQorCisJcmMgPSBwcGNfbWQubnZyYW1fd3JpdGUoYnVmZiwgbGVuZ3RoLCAmdG1wX2luZGV4KTsKKwlpZiAocmMgPD0gMCkgeworCQlwcmludGsoS0VSTl9FUlIgIm52cmFtX3dyaXRlX2Vycm9yX2xvZzogRmFpbGVkIG52cmFtX3dyaXRlICglZClcbiIsIHJjKTsKKwkJcmV0dXJuIHJjOworCX0KKwkKKwlyZXR1cm4gMDsKK30KKworLyogbnZyYW1fcmVhZF9lcnJvcl9sb2cKKyAqCisgKiBSZWFkcyBudnJhbSBmb3IgZXJyb3IgbG9nIGZvciBhdCBtb3N0ICdsZW5ndGgnCisgKi8KK2ludCBudnJhbV9yZWFkX2Vycm9yX2xvZyhjaGFyICogYnVmZiwgaW50IGxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKiBlcnJfdHlwZSwgdW5zaWduZWQgaW50ICogZXJyb3JfbG9nX2NudCkKK3sKKwlpbnQgcmM7CisJbG9mZl90IHRtcF9pbmRleDsKKwlzdHJ1Y3QgZXJyX2xvZ19pbmZvIGluZm87CisJCisJaWYgKG52cmFtX2Vycm9yX2xvZ19pbmRleCA9PSAtMSkKKwkJcmV0dXJuIC0xOworCisJaWYgKGxlbmd0aCA+IG52cmFtX2Vycm9yX2xvZ19zaXplKQorCQlsZW5ndGggPSBudnJhbV9lcnJvcl9sb2dfc2l6ZTsKKworCXRtcF9pbmRleCA9IG52cmFtX2Vycm9yX2xvZ19pbmRleDsKKworCXJjID0gcHBjX21kLm52cmFtX3JlYWQoKGNoYXIgKikmaW5mbywgc2l6ZW9mKHN0cnVjdCBlcnJfbG9nX2luZm8pLCAmdG1wX2luZGV4KTsKKwlpZiAocmMgPD0gMCkgeworCQlwcmludGsoS0VSTl9FUlIgIm52cmFtX3JlYWRfZXJyb3JfbG9nOiBGYWlsZWQgbnZyYW1fcmVhZCAoJWQpXG4iLCByYyk7CisJCXJldHVybiByYzsKKwl9CisKKwlyYyA9IHBwY19tZC5udnJhbV9yZWFkKGJ1ZmYsIGxlbmd0aCwgJnRtcF9pbmRleCk7CisJaWYgKHJjIDw9IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJudnJhbV9yZWFkX2Vycm9yX2xvZzogRmFpbGVkIG52cmFtX3JlYWQgKCVkKVxuIiwgcmMpOworCQlyZXR1cm4gcmM7CisJfQorCisJKmVycm9yX2xvZ19jbnQgPSBpbmZvLnNlcV9udW07CisJKmVycl90eXBlID0gaW5mby5lcnJvcl90eXBlOworCisJcmV0dXJuIDA7Cit9CisKKy8qIFRoaXMgZG9lc24ndCBhY3R1YWxseSB6ZXJvIGFueXRoaW5nLCBidXQgaXQgc2V0cyB0aGUgZXZlbnRfbG9nZ2VkCisgKiB3b3JkIHRvIHRlbGwgdGhhdCB0aGlzIGV2ZW50IGlzIHNhZmVseSBpbiBzeXNsb2cuCisgKi8KK2ludCBudnJhbV9jbGVhcl9lcnJvcl9sb2codm9pZCkKK3sKKwlsb2ZmX3QgdG1wX2luZGV4OworCWludCBjbGVhcl93b3JkID0gRVJSX0ZMQUdfQUxSRUFEWV9MT0dHRUQ7CisJaW50IHJjOworCisJaWYgKG52cmFtX2Vycm9yX2xvZ19pbmRleCA9PSAtMSkKKwkJcmV0dXJuIC0xOworCisJdG1wX2luZGV4ID0gbnZyYW1fZXJyb3JfbG9nX2luZGV4OworCQorCXJjID0gcHBjX21kLm52cmFtX3dyaXRlKChjaGFyICopJmNsZWFyX3dvcmQsIHNpemVvZihpbnQpLCAmdG1wX2luZGV4KTsKKwlpZiAocmMgPD0gMCkgeworCQlwcmludGsoS0VSTl9FUlIgIm52cmFtX2NsZWFyX2Vycm9yX2xvZzogRmFpbGVkIG52cmFtX3dyaXRlICglZClcbiIsIHJjKTsKKwkJcmV0dXJuIHJjOworCX0KKworCXJldHVybiAwOworfQorCisvKiBwc2VyaWVzX252cmFtX2luaXRfbG9nX3BhcnRpdGlvbgorICoKKyAqIFRoaXMgd2lsbCBzZXR1cCB0aGUgcGFydGl0aW9uIHdlIG5lZWQgZm9yIGJ1ZmZlcmluZyB0aGUKKyAqIGVycm9yIGxvZ3MgYW5kIGNsZWFudXAgcGFydGl0aW9ucyBpZiBuZWVkZWQuCisgKgorICogVGhlIGdlbmVyYWwgc3RyYXRlZ3kgaXMgdGhlIGZvbGxvd2luZzoKKyAqIDEuKSBJZiB0aGVyZSBpcyBsb2cgcGFydGl0aW9uIGxhcmdlIGVub3VnaCB0aGVuIHVzZSBpdC4KKyAqIDIuKSBJZiB0aGVyZSBpcyBub25lIGxhcmdlIGVub3VnaCwgc2VhcmNoCisgKiBmb3IgYSBmcmVlIHBhcnRpdGlvbiB0aGF0IGlzIGxhcmdlIGVub3VnaC4KKyAqIDMuKSBJZiB0aGVyZSBpcyBub3QgYSBmcmVlIHBhcnRpdGlvbiBsYXJnZSBlbm91Z2ggcmVtb3ZlIAorICogX2FsbF8gT1MgcGFydGl0aW9ucyBhbmQgY29uc29saWRhdGUgdGhlIHNwYWNlLgorICogNC4pIFdpbGwgZmlyc3QgdHJ5IGdldHRpbmcgYSBjaHVuayB0aGF0IHdpbGwgc2F0aXNmeSB0aGUgbWF4aW11bQorICogZXJyb3IgbG9nIHNpemUgKE5WUkFNX01BWF9SRVEpLgorICogNS4pIElmIHRoZSBtYXggY2h1bmsgY2Fubm90IGJlIGFsbG9jYXRlZCB0aGVuIHRyeSBmaW5kaW5nIGEgY2h1bmsKKyAqIHRoYXQgd2lsbCBzYXRpc2Z5IHRoZSBtaW51bSBuZWVkZWQgKE5WUkFNX01JTl9SRVEpLgorICovCitzdGF0aWMgaW50IF9faW5pdCBwc2VyaWVzX252cmFtX2luaXRfbG9nX3BhcnRpdGlvbih2b2lkKQoreworCWxvZmZfdCBwOworCWludCBzaXplOworCisJLyogU2NhbiBudnJhbSBmb3IgcGFydGl0aW9ucyAqLworCW52cmFtX3NjYW5fcGFydGl0aW9ucygpOworCisJLyogTG9va2cgZm9yIG91cnMgKi8KKwlwID0gbnZyYW1fZmluZF9wYXJ0aXRpb24oTlZSQU1fTE9HX1BBUlRfTkFNRSwgTlZSQU1fU0lHX09TLCAmc2l6ZSk7CisKKwkvKiBGb3VuZCBvbmUgYnV0IHRvbyBzbWFsbCwgcmVtb3ZlIGl0ICovCisJaWYgKHAgJiYgc2l6ZSA8IE5WUkFNX01JTl9SRVEpIHsKKwkJcHJfaW5mbygibnZyYW06IEZvdW5kIHRvbyBzbWFsbCAiTlZSQU1fTE9HX1BBUlRfTkFNRSIgcGFydGl0aW9uIgorCQkJIixyZW1vdmluZyBpdC4uLiIpOworCQludnJhbV9yZW1vdmVfcGFydGl0aW9uKE5WUkFNX0xPR19QQVJUX05BTUUsIE5WUkFNX1NJR19PUyk7CisJCXAgPSAwOworCX0KKworCS8qIENyZWF0ZSBvbmUgaWYgd2UgZGlkbid0IGZpbmQgKi8KKwlpZiAoIXApIHsKKwkJcCA9IG52cmFtX2NyZWF0ZV9wYXJ0aXRpb24oTlZSQU1fTE9HX1BBUlRfTkFNRSwgTlZSQU1fU0lHX09TLAorCQkJCQkgICBOVlJBTV9NQVhfUkVRLCBOVlJBTV9NSU5fUkVRKTsKKwkJLyogTm8gcm9vbSBmb3IgaXQsIHRyeSB0byBnZXQgcmlkIG9mIGFueSBPUyBwYXJ0aXRpb24KKwkJICogYW5kIHRyeSBhZ2FpbgorCQkgKi8KKwkJaWYgKHAgPT0gLUVOT1NQQykgeworCQkJcHJfaW5mbygibnZyYW06IE5vIHJvb20gdG8gY3JlYXRlICJOVlJBTV9MT0dfUEFSVF9OQU1FCisJCQkJIiBwYXJ0aXRpb24sIGRlbGV0aW5nIGFsbCBPUyBwYXJ0aXRpb25zLi4uIik7CisJCQludnJhbV9yZW1vdmVfcGFydGl0aW9uKE5VTEwsIE5WUkFNX1NJR19PUyk7CisJCQlwID0gbnZyYW1fY3JlYXRlX3BhcnRpdGlvbihOVlJBTV9MT0dfUEFSVF9OQU1FLAorCQkJCQkJICAgTlZSQU1fU0lHX09TLCBOVlJBTV9NQVhfUkVRLAorCQkJCQkJICAgTlZSQU1fTUlOX1JFUSk7CisJCX0KKwl9CisKKwlpZiAocCA8PSAwKSB7CisJCXByX2VycigibnZyYW06IEZhaWxlZCB0byBmaW5kIG9yIGNyZWF0ZSAiTlZSQU1fTE9HX1BBUlRfTkFNRQorCQkgICAgICAgIiBwYXJ0aXRpb24sIGVyciAlZFxuIiwgKGludClwKTsKKwkJcmV0dXJuIDA7CisJfQorCisJbnZyYW1fZXJyb3JfbG9nX2luZGV4ID0gcDsKKwludnJhbV9lcnJvcl9sb2dfc2l6ZSA9IG52cmFtX2dldF9wYXJ0aXRpb25fc2l6ZShwKSAtCisJCXNpemVvZihzdHJ1Y3QgZXJyX2xvZ19pbmZvKTsKKwkKKwlyZXR1cm4gMDsKK30KK21hY2hpbmVfYXJjaF9pbml0Y2FsbChwc2VyaWVzLCBwc2VyaWVzX252cmFtX2luaXRfbG9nX3BhcnRpdGlvbik7CisKIGludCBfX2luaXQgcFNlcmllc19udnJhbV9pbml0KHZvaWQpCiB7CiAJc3RydWN0IGRldmljZV9ub2RlICpudnJhbTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9wc2VyaWVzX2VuZXJneS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3BzZXJpZXNfZW5lcmd5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzhiM2M2OQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9wc2VyaWVzX2VuZXJneS5jCkBAIC0wLDAgKzEsMzI2IEBACisvKgorICogUE9XRVIgcGxhdGZvcm0gZW5lcmd5IG1hbmFnZW1lbnQgZHJpdmVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgSUJNIENvcnBvcmF0aW9uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHBzZXJpZXMgcGxhdGZvcm0gZGV2aWNlIGRyaXZlciBwcm92aWRlcyBhY2Nlc3MgdG8KKyAqIHBsYXRmb3JtIGVuZXJneSBtYW5hZ2VtZW50IGNhcGFiaWxpdGllcy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2NwdS5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8YXNtL2NwdXRocmVhZHMuaD4KKyNpbmNsdWRlIDxhc20vcGFnZS5oPgorI2luY2x1ZGUgPGFzbS9odmNhbGwuaD4KKworCisjZGVmaW5lIE1PRFVMRV9WRVJTICIxLjAiCisjZGVmaW5lIE1PRFVMRV9OQU1FICJwc2VyaWVzX2VuZXJneSIKKworLyogRHJpdmVyIGZsYWdzICovCisKK3N0YXRpYyBpbnQgc3lzZnNfZW50cmllczsKKworLyogSGVscGVyIHJvdXRpbmVzICovCisKKy8qCisgKiBSb3V0aW5lIHRvIGRldGVjdCBmaXJtd2FyZSBzdXBwb3J0IGZvciBoY2FsbAorICogcmV0dXJuIDEgaWYgSF9CRVNUX0VORVJHWSBpcyBzdXBwb3J0ZWQKKyAqIGVsc2UgcmV0dXJuIDAKKyAqLworCitzdGF0aWMgaW50IGNoZWNrX2Zvcl9oX2Jlc3RfZW5lcmd5KHZvaWQpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpydGFzID0gTlVMTDsKKwljb25zdCBjaGFyICpoeXBlcnRhcywgKnM7CisJaW50IGxlbmd0aDsKKwlpbnQgcmMgPSAwOworCisJcnRhcyA9IG9mX2ZpbmRfbm9kZV9ieV9wYXRoKCIvcnRhcyIpOworCWlmICghcnRhcykKKwkJcmV0dXJuIDA7CisKKwloeXBlcnRhcyA9IG9mX2dldF9wcm9wZXJ0eShydGFzLCAiaWJtLGh5cGVydGFzLWZ1bmN0aW9ucyIsICZsZW5ndGgpOworCWlmICghaHlwZXJ0YXMpIHsKKwkJb2Zfbm9kZV9wdXQocnRhcyk7CisJCXJldHVybiAwOworCX0KKworCS8qIGh5cGVydGFzIHdpbGwgaGF2ZSBsaXN0IG9mIHN0cmluZ3Mgd2l0aCBoY2FsbCBuYW1lcyAqLworCWZvciAocyA9IGh5cGVydGFzOyBzIDwgaHlwZXJ0YXMgKyBsZW5ndGg7IHMgKz0gc3RybGVuKHMpICsgMSkgeworCQlpZiAoIXN0cm5jbXAoImhjYWxsLWJlc3QtZW5lcmd5LTEiLCBzLCAxOSkpIHsKKwkJCXJjID0gMTsgLyogRm91bmQgdGhlIHN0cmluZyAqLworCQkJYnJlYWs7CisJCX0KKwl9CisJb2Zfbm9kZV9wdXQocnRhcyk7CisJcmV0dXJuIHJjOworfQorCisvKiBIZWxwZXIgUm91dGluZXMgdG8gY29udmVydCBiZXR3ZWVuIGRyY19pbmRleCB0byBjcHUgbnVtYmVycyAqLworCitzdGF0aWMgdTMyIGNwdV90b19kcmNfaW5kZXgoaW50IGNwdSkKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRuID0gTlVMTDsKKwljb25zdCBpbnQgKmluZGV4ZXM7CisJaW50IGk7CisJaW50IHJjID0gMTsKKwl1MzIgcmV0ID0gMDsKKworCWRuID0gb2ZfZmluZF9ub2RlX2J5X3BhdGgoIi9jcHVzIik7CisJaWYgKGRuID09IE5VTEwpCisJCWdvdG8gZXJyOworCWluZGV4ZXMgPSBvZl9nZXRfcHJvcGVydHkoZG4sICJpYm0sZHJjLWluZGV4ZXMiLCBOVUxMKTsKKwlpZiAoaW5kZXhlcyA9PSBOVUxMKQorCQlnb3RvIGVycl9vZl9ub2RlX3B1dDsKKwkvKiBDb252ZXJ0IGxvZ2ljYWwgY3B1IG51bWJlciB0byBjb3JlIG51bWJlciAqLworCWkgPSBjcHVfY29yZV9pbmRleF9vZl90aHJlYWQoY3B1KTsKKwkvKgorCSAqIFRoZSBmaXJzdCBlbGVtZW50IGluZGV4ZXNbMF0gaXMgdGhlIG51bWJlciBvZiBkcmNfaW5kZXhlcworCSAqIHJldHVybmVkIGluIHRoZSBsaXN0LiAgSGVuY2UgaSsxIHdpbGwgZ2V0IHRoZSBkcmNfaW5kZXgKKwkgKiBjb3JyZXNwb25kaW5nIHRvIGNvcmUgbnVtYmVyIGkuCisJICovCisJV0FSTl9PTihpID4gaW5kZXhlc1swXSk7CisJcmV0ID0gaW5kZXhlc1tpICsgMV07CisJcmMgPSAwOworCitlcnJfb2Zfbm9kZV9wdXQ6CisJb2Zfbm9kZV9wdXQoZG4pOworZXJyOgorCWlmIChyYykKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiY3B1X3RvX2RyY19pbmRleCglZCkgZmFpbGVkIiwgY3B1KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGRyY19pbmRleF90b19jcHUodTMyIGRyY19pbmRleCkKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRuID0gTlVMTDsKKwljb25zdCBpbnQgKmluZGV4ZXM7CisJaW50IGksIGNwdSA9IDA7CisJaW50IHJjID0gMTsKKworCWRuID0gb2ZfZmluZF9ub2RlX2J5X3BhdGgoIi9jcHVzIik7CisJaWYgKGRuID09IE5VTEwpCisJCWdvdG8gZXJyOworCWluZGV4ZXMgPSBvZl9nZXRfcHJvcGVydHkoZG4sICJpYm0sZHJjLWluZGV4ZXMiLCBOVUxMKTsKKwlpZiAoaW5kZXhlcyA9PSBOVUxMKQorCQlnb3RvIGVycl9vZl9ub2RlX3B1dDsKKwkvKgorCSAqIEZpcnN0IGVsZW1lbnQgaW4gdGhlIGFycmF5IGlzIHRoZSBudW1iZXIgb2YgZHJjX2luZGV4ZXMKKwkgKiByZXR1cm5lZC4gIFNlYXJjaCB0aHJvdWdoIHRoZSBsaXN0IHRvIGZpbmQgdGhlIG1hdGNoaW5nCisJICogZHJjX2luZGV4IGFuZCBnZXQgdGhlIGNvcmUgbnVtYmVyCisJICovCisJZm9yIChpID0gMDsgaSA8IGluZGV4ZXNbMF07IGkrKykgeworCQlpZiAoaW5kZXhlc1tpICsgMV0gPT0gZHJjX2luZGV4KQorCQkJYnJlYWs7CisJfQorCS8qIENvbnZlcnQgY29yZSBudW1iZXIgdG8gbG9naWNhbCBjcHUgbnVtYmVyICovCisJY3B1ID0gY3B1X2ZpcnN0X3RocmVhZF9vZl9jb3JlKGkpOworCXJjID0gMDsKKworZXJyX29mX25vZGVfcHV0OgorCW9mX25vZGVfcHV0KGRuKTsKK2VycjoKKwlpZiAocmMpCisJCXByaW50ayhLRVJOX1dBUk5JTkcgImRyY19pbmRleF90b19jcHUoJWQpIGZhaWxlZCIsIGRyY19pbmRleCk7CisJcmV0dXJuIGNwdTsKK30KKworLyoKKyAqIHBzZXJpZXMgaHlwZXJ2aXNvciBjYWxsIEhfQkVTVF9FTkVSR1kgcHJvdmlkZXMgaGludHMgdG8gT1Mgb24KKyAqIHByZWZlcnJlZCBsb2dpY2FsIGNwdXMgdG8gYWN0aXZhdGUgb3IgZGVhY3RpdmF0ZSBmb3Igb3B0aW1pemVkCisgKiBlbmVyZ3kgY29uc3VtcHRpb24uCisgKi8KKworI2RlZmluZSBGTEFHU19NT0RFMQkweDAwNEUyMDAwMDAwODBFMDEKKyNkZWZpbmUgRkxBR1NfTU9ERTIJMHgwMDRFMjAwMDAwMDgwNDAxCisjZGVmaW5lIEZMQUdTX0FDVElWQVRFICAweDEwMAorCitzdGF0aWMgc3NpemVfdCBnZXRfYmVzdF9lbmVyZ3lfbGlzdChjaGFyICpwYWdlLCBpbnQgYWN0aXZhdGUpCit7CisJaW50IHJjLCBjbnQsIGksIGNwdTsKKwl1bnNpZ25lZCBsb25nIHJldGJ1ZltQTFBBUl9IQ0FMTDlfQlVGU0laRV07CisJdW5zaWduZWQgbG9uZyBmbGFncyA9IDA7CisJdTMyICpidWZfcGFnZTsKKwljaGFyICpzID0gcGFnZTsKKworCWJ1Zl9wYWdlID0gKHUzMiAqKSBnZXRfemVyb2VkX3BhZ2UoR0ZQX0tFUk5FTCk7CisJaWYgKCFidWZfcGFnZSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlmbGFncyA9IEZMQUdTX01PREUxOworCWlmIChhY3RpdmF0ZSkKKwkJZmxhZ3MgfD0gRkxBR1NfQUNUSVZBVEU7CisKKwlyYyA9IHBscGFyX2hjYWxsOShIX0JFU1RfRU5FUkdZLCByZXRidWYsIGZsYWdzLCAwLCBfX3BhKGJ1Zl9wYWdlKSwKKwkJCQkwLCAwLCAwLCAwLCAwLCAwKTsKKwlpZiAocmMgIT0gSF9TVUNDRVNTKSB7CisJCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZykgYnVmX3BhZ2UpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwljbnQgPSByZXRidWZbMF07CisJZm9yIChpID0gMDsgaSA8IGNudDsgaSsrKSB7CisJCWNwdSA9IGRyY19pbmRleF90b19jcHUoYnVmX3BhZ2VbMippKzFdKTsKKwkJaWYgKChjcHVfb25saW5lKGNwdSkgJiYgIWFjdGl2YXRlKSB8fAorCQkgICAgKCFjcHVfb25saW5lKGNwdSkgJiYgYWN0aXZhdGUpKQorCQkJcyArPSBzcHJpbnRmKHMsICIlZCwiLCBjcHUpOworCX0KKwlpZiAocyA+IHBhZ2UpIHsgLyogU29tZXRoaW5nIHRvIHNob3cgKi8KKwkJcy0tOyAvKiBTdXBwcmVzcyBsYXN0IGNvbW1hICovCisJCXMgKz0gc3ByaW50ZihzLCAiXG4iKTsKKwl9CisKKwlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpIGJ1Zl9wYWdlKTsKKwlyZXR1cm4gcy1wYWdlOworfQorCitzdGF0aWMgc3NpemVfdCBnZXRfYmVzdF9lbmVyZ3lfZGF0YShzdHJ1Y3Qgc3lzX2RldmljZSAqZGV2LAorCQkJCQljaGFyICpwYWdlLCBpbnQgYWN0aXZhdGUpCit7CisJaW50IHJjOworCXVuc2lnbmVkIGxvbmcgcmV0YnVmW1BMUEFSX0hDQUxMOV9CVUZTSVpFXTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzID0gMDsKKworCWZsYWdzID0gRkxBR1NfTU9ERTI7CisJaWYgKGFjdGl2YXRlKQorCQlmbGFncyB8PSBGTEFHU19BQ1RJVkFURTsKKworCXJjID0gcGxwYXJfaGNhbGw5KEhfQkVTVF9FTkVSR1ksIHJldGJ1ZiwgZmxhZ3MsCisJCQkJY3B1X3RvX2RyY19pbmRleChkZXYtPmlkKSwKKwkJCQkwLCAwLCAwLCAwLCAwLCAwLCAwKTsKKworCWlmIChyYyAhPSBIX1NVQ0NFU1MpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIHNwcmludGYocGFnZSwgIiVsdVxuIiwgcmV0YnVmWzFdID4+IDMyKTsKK30KKworLyogV3JhcHBlciBmdW5jdGlvbnMgKi8KKworc3RhdGljIHNzaXplX3QgY3B1X2FjdGl2YXRlX2hpbnRfbGlzdF9zaG93KHN0cnVjdCBzeXNkZXZfY2xhc3MgKmNsYXNzLAorCQkJc3RydWN0IHN5c2Rldl9jbGFzc19hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKnBhZ2UpCit7CisJcmV0dXJuIGdldF9iZXN0X2VuZXJneV9saXN0KHBhZ2UsIDEpOworfQorCitzdGF0aWMgc3NpemVfdCBjcHVfZGVhY3RpdmF0ZV9oaW50X2xpc3Rfc2hvdyhzdHJ1Y3Qgc3lzZGV2X2NsYXNzICpjbGFzcywKKwkJCXN0cnVjdCBzeXNkZXZfY2xhc3NfYXR0cmlidXRlICphdHRyLCBjaGFyICpwYWdlKQoreworCXJldHVybiBnZXRfYmVzdF9lbmVyZ3lfbGlzdChwYWdlLCAwKTsKK30KKworc3RhdGljIHNzaXplX3QgcGVyY3B1X2FjdGl2YXRlX2hpbnRfc2hvdyhzdHJ1Y3Qgc3lzX2RldmljZSAqZGV2LAorCQkJc3RydWN0IHN5c2Rldl9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKnBhZ2UpCit7CisJcmV0dXJuIGdldF9iZXN0X2VuZXJneV9kYXRhKGRldiwgcGFnZSwgMSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHBlcmNwdV9kZWFjdGl2YXRlX2hpbnRfc2hvdyhzdHJ1Y3Qgc3lzX2RldmljZSAqZGV2LAorCQkJc3RydWN0IHN5c2Rldl9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKnBhZ2UpCit7CisJcmV0dXJuIGdldF9iZXN0X2VuZXJneV9kYXRhKGRldiwgcGFnZSwgMCk7Cit9CisKKy8qCisgKiBDcmVhdGUgc3lzZnMgaW50ZXJmYWNlOgorICogL3N5cy9kZXZpY2VzL3N5c3RlbS9jcHUvcHNlcmllc19hY3RpdmF0ZV9oaW50X2xpc3QKKyAqIC9zeXMvZGV2aWNlcy9zeXN0ZW0vY3B1L3BzZXJpZXNfZGVhY3RpdmF0ZV9oaW50X2xpc3QKKyAqCUNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIGNwdXMgdG8gYWN0aXZhdGUgb3IgZGVhY3RpdmF0ZQorICogL3N5cy9kZXZpY2VzL3N5c3RlbS9jcHUvY3B1Ti9wc2VyaWVzX2FjdGl2YXRlX2hpbnQKKyAqIC9zeXMvZGV2aWNlcy9zeXN0ZW0vY3B1L2NwdU4vcHNlcmllc19kZWFjdGl2YXRlX2hpbnQKKyAqCVBlci1jcHUgdmFsdWUgb2YgdGhlIGhpbnQKKyAqLworCitzdHJ1Y3Qgc3lzZGV2X2NsYXNzX2F0dHJpYnV0ZSBhdHRyX2NwdV9hY3RpdmF0ZV9oaW50X2xpc3QgPQorCQlfU1lTREVWX0NMQVNTX0FUVFIocHNlcmllc19hY3RpdmF0ZV9oaW50X2xpc3QsIDA0NDQsCisJCWNwdV9hY3RpdmF0ZV9oaW50X2xpc3Rfc2hvdywgTlVMTCk7CisKK3N0cnVjdCBzeXNkZXZfY2xhc3NfYXR0cmlidXRlIGF0dHJfY3B1X2RlYWN0aXZhdGVfaGludF9saXN0ID0KKwkJX1NZU0RFVl9DTEFTU19BVFRSKHBzZXJpZXNfZGVhY3RpdmF0ZV9oaW50X2xpc3QsIDA0NDQsCisJCWNwdV9kZWFjdGl2YXRlX2hpbnRfbGlzdF9zaG93LCBOVUxMKTsKKworc3RydWN0IHN5c2Rldl9hdHRyaWJ1dGUgYXR0cl9wZXJjcHVfYWN0aXZhdGVfaGludCA9CisJCV9TWVNERVZfQVRUUihwc2VyaWVzX2FjdGl2YXRlX2hpbnQsIDA0NDQsCisJCXBlcmNwdV9hY3RpdmF0ZV9oaW50X3Nob3csIE5VTEwpOworCitzdHJ1Y3Qgc3lzZGV2X2F0dHJpYnV0ZSBhdHRyX3BlcmNwdV9kZWFjdGl2YXRlX2hpbnQgPQorCQlfU1lTREVWX0FUVFIocHNlcmllc19kZWFjdGl2YXRlX2hpbnQsIDA0NDQsCisJCXBlcmNwdV9kZWFjdGl2YXRlX2hpbnRfc2hvdywgTlVMTCk7CisKK3N0YXRpYyBpbnQgX19pbml0IHBzZXJpZXNfZW5lcmd5X2luaXQodm9pZCkKK3sKKwlpbnQgY3B1LCBlcnI7CisJc3RydWN0IHN5c19kZXZpY2UgKmNwdV9zeXNfZGV2OworCisJaWYgKCFjaGVja19mb3JfaF9iZXN0X2VuZXJneSgpKSB7CisJCXByaW50ayhLRVJOX0lORk8gIkh5cGVyY2FsbCBIX0JFU1RfRU5FUkdZIG5vdCBzdXBwb3J0ZWRcbiIpOworCQlyZXR1cm4gMDsKKwl9CisJLyogQ3JlYXRlIHRoZSBzeXNmcyBmaWxlcyAqLworCWVyciA9IHN5c2ZzX2NyZWF0ZV9maWxlKCZjcHVfc3lzZGV2X2NsYXNzLmtzZXQua29iaiwKKwkJCQkmYXR0cl9jcHVfYWN0aXZhdGVfaGludF9saXN0LmF0dHIpOworCWlmICghZXJyKQorCQllcnIgPSBzeXNmc19jcmVhdGVfZmlsZSgmY3B1X3N5c2Rldl9jbGFzcy5rc2V0LmtvYmosCisJCQkJJmF0dHJfY3B1X2RlYWN0aXZhdGVfaGludF9saXN0LmF0dHIpOworCisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKwlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoY3B1KSB7CisJCWNwdV9zeXNfZGV2ID0gZ2V0X2NwdV9zeXNkZXYoY3B1KTsKKwkJZXJyID0gc3lzZnNfY3JlYXRlX2ZpbGUoJmNwdV9zeXNfZGV2LT5rb2JqLAorCQkJCSZhdHRyX3BlcmNwdV9hY3RpdmF0ZV9oaW50LmF0dHIpOworCQlpZiAoZXJyKQorCQkJYnJlYWs7CisJCWVyciA9IHN5c2ZzX2NyZWF0ZV9maWxlKCZjcHVfc3lzX2Rldi0+a29iaiwKKwkJCQkmYXR0cl9wZXJjcHVfZGVhY3RpdmF0ZV9oaW50LmF0dHIpOworCQlpZiAoZXJyKQorCQkJYnJlYWs7CisJfQorCisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCXN5c2ZzX2VudHJpZXMgPSAxOyAvKiBSZW1vdmVkIGVudHJpZXMgb24gY2xlYW51cCAqLworCXJldHVybiAwOworCit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBwc2VyaWVzX2VuZXJneV9jbGVhbnVwKHZvaWQpCit7CisJaW50IGNwdTsKKwlzdHJ1Y3Qgc3lzX2RldmljZSAqY3B1X3N5c19kZXY7CisKKwlpZiAoIXN5c2ZzX2VudHJpZXMpCisJCXJldHVybjsKKworCS8qIFJlbW92ZSB0aGUgc3lzZnMgZmlsZXMgKi8KKwlzeXNmc19yZW1vdmVfZmlsZSgmY3B1X3N5c2Rldl9jbGFzcy5rc2V0LmtvYmosCisJCQkJJmF0dHJfY3B1X2FjdGl2YXRlX2hpbnRfbGlzdC5hdHRyKTsKKworCXN5c2ZzX3JlbW92ZV9maWxlKCZjcHVfc3lzZGV2X2NsYXNzLmtzZXQua29iaiwKKwkJCQkmYXR0cl9jcHVfZGVhY3RpdmF0ZV9oaW50X2xpc3QuYXR0cik7CisKKwlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoY3B1KSB7CisJCWNwdV9zeXNfZGV2ID0gZ2V0X2NwdV9zeXNkZXYoY3B1KTsKKwkJc3lzZnNfcmVtb3ZlX2ZpbGUoJmNwdV9zeXNfZGV2LT5rb2JqLAorCQkJCSZhdHRyX3BlcmNwdV9hY3RpdmF0ZV9oaW50LmF0dHIpOworCQlzeXNmc19yZW1vdmVfZmlsZSgmY3B1X3N5c19kZXYtPmtvYmosCisJCQkJJmF0dHJfcGVyY3B1X2RlYWN0aXZhdGVfaGludC5hdHRyKTsKKwl9Cit9CisKK21vZHVsZV9pbml0KHBzZXJpZXNfZW5lcmd5X2luaXQpOworbW9kdWxlX2V4aXQocHNlcmllc19lbmVyZ3lfY2xlYW51cCk7CitNT0RVTEVfREVTQ1JJUFRJT04oIkRyaXZlciBmb3IgcFNlcmllcyBwbGF0Zm9ybSBlbmVyZ3kgbWFuYWdlbWVudCIpOworTU9EVUxFX0FVVEhPUigiVmFpZHlhbmF0aGFuIFNyaW5pdmFzYW4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvTWFrZWZpbGUgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L01ha2VmaWxlCmluZGV4IDBiZWY5ZGEuLjljMjk3MzQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvTWFrZWZpbGUKKysrIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9NYWtlZmlsZQpAQCAtNDEsNiArNDEsNyBAQAogaWZlcSAoJChDT05GSUdfUENJKSx5KQogb2JqLSQoQ09ORklHXzR4eCkJCSs9IHBwYzR4eF9wY2kubwogZW5kaWYKK29iai0kKENPTkZJR19QUEM0eHhfQ1BNKQkrPSBwcGM0eHhfY3BtLm8KIG9iai0kKENPTkZJR19QUEM0eHhfR1BJTykJKz0gcHBjNHh4X2dwaW8ubwogCiBvYmotJChDT05GSUdfQ1BNKQkJKz0gY3BtX2NvbW1vbi5vCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvc3lzZGV2L2RhcnRfaW9tbXUuYyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvZGFydF9pb21tdS5jCmluZGV4IDE3Y2YxNWUuLjhlOWUwNmEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvZGFydF9pb21tdS5jCisrKyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvZGFydF9pb21tdS5jCkBAIC0zMTIsMTcgKzMxMiwxMCBAQAogCiBzdGF0aWMgdm9pZCBwY2lfZG1hX2J1c19zZXR1cF9kYXJ0KHN0cnVjdCBwY2lfYnVzICpidXMpCiB7Ci0Jc3RydWN0IGRldmljZV9ub2RlICpkbjsKLQogCWlmICghaW9tbXVfdGFibGVfZGFydF9pbml0ZWQpIHsKIAkJaW9tbXVfdGFibGVfZGFydF9pbml0ZWQgPSAxOwogCQlpb21tdV90YWJsZV9kYXJ0X3NldHVwKCk7CiAJfQotCi0JZG4gPSBwY2lfYnVzX3RvX09GX25vZGUoYnVzKTsKLQotCWlmIChkbikKLQkJUENJX0ROKGRuKS0+aW9tbXVfdGFibGUgPSAmaW9tbXVfdGFibGVfZGFydDsKIH0KIAogc3RhdGljIGJvb2wgZGFydF9kZXZpY2Vfb25fcGNpZShzdHJ1Y3QgZGV2aWNlICpkZXYpCkBAIC0zNzMsNyArMzY2LDcgQEAKIAlpZiAoZG4gPT0gTlVMTCkgewogCQlkbiA9IG9mX2ZpbmRfY29tcGF0aWJsZV9ub2RlKE5VTEwsICJkYXJ0IiwgInU0LWRhcnQiKTsKIAkJaWYgKGRuID09IE5VTEwpCi0JCQlnb3RvIGJhaWw7CisJCQlyZXR1cm47CS8qIHVzZSBkZWZhdWx0IGRpcmVjdF9kbWFfb3BzICovCiAJCWRhcnRfaXNfdTQgPSAxOwogCX0KIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9tcGM4eHh4X2dwaW8uYyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvbXBjOHh4eF9ncGlvLmMKaW5kZXggYzBlYTA1ZS4uYzQ4Y2Q4MSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9tcGM4eHh4X2dwaW8uYworKysgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L21wYzh4eHhfZ3Bpby5jCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIEdQSU9zIG9uIE1QQzgzNDkvODU3Mi84NjEwIGFuZCBjb21wYXRpYmxlCisgKiBHUElPcyBvbiBNUEM1MTJ4LzgzNDkvODU3Mi84NjEwIGFuZCBjb21wYXRpYmxlCiAgKgogICogQ29weXJpZ2h0IChDKSAyMDA4IFBldGVyIEtvcnNnYWFyZCA8amFjbWV0QHN1bnNpdGUuZGs+CiAgKgpAQCAtMjYsNiArMjYsNyBAQAogI2RlZmluZSBHUElPX0lFUgkJMHgwYwogI2RlZmluZSBHUElPX0lNUgkJMHgxMAogI2RlZmluZSBHUElPX0lDUgkJMHgxNAorI2RlZmluZSBHUElPX0lDUjIJCTB4MTgKIAogc3RydWN0IG1wYzh4eHhfZ3Bpb19jaGlwIHsKIAlzdHJ1Y3Qgb2ZfbW1fZ3Bpb19jaGlwIG1tX2djOwpAQCAtMzcsNiArMzgsNyBAQAogCSAqLwogCXUzMiBkYXRhOwogCXN0cnVjdCBpcnFfaG9zdCAqaXJxOworCXZvaWQgKm9mX2Rldl9pZF9kYXRhOwogfTsKIAogc3RhdGljIGlubGluZSB1MzIgbXBjOHh4eF9ncGlvMm1hc2sodW5zaWduZWQgaW50IGdwaW8pCkBAIC0yMTUsNiArMjE3LDUxIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgbXBjNTEyeF9pcnFfc2V0X3R5cGUodW5zaWduZWQgaW50IHZpcnEsIHVuc2lnbmVkIGludCBmbG93X3R5cGUpCit7CisJc3RydWN0IG1wYzh4eHhfZ3Bpb19jaGlwICptcGM4eHh4X2djID0gZ2V0X2lycV9jaGlwX2RhdGEodmlycSk7CisJc3RydWN0IG9mX21tX2dwaW9fY2hpcCAqbW0gPSAmbXBjOHh4eF9nYy0+bW1fZ2M7CisJdW5zaWduZWQgbG9uZyBncGlvID0gdmlycV90b19odyh2aXJxKTsKKwl2b2lkIF9faW9tZW0gKnJlZzsKKwl1bnNpZ25lZCBpbnQgc2hpZnQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChncGlvIDwgMTYpIHsKKwkJcmVnID0gbW0tPnJlZ3MgKyBHUElPX0lDUjsKKwkJc2hpZnQgPSAoMTUgLSBncGlvKSAqIDI7CisJfSBlbHNlIHsKKwkJcmVnID0gbW0tPnJlZ3MgKyBHUElPX0lDUjI7CisJCXNoaWZ0ID0gKDE1IC0gKGdwaW8gJSAxNikpICogMjsKKwl9CisKKwlzd2l0Y2ggKGZsb3dfdHlwZSkgeworCWNhc2UgSVJRX1RZUEVfRURHRV9GQUxMSU5HOgorCWNhc2UgSVJRX1RZUEVfTEVWRUxfTE9XOgorCQlzcGluX2xvY2tfaXJxc2F2ZSgmbXBjOHh4eF9nYy0+bG9jaywgZmxhZ3MpOworCQljbHJzZXRiaXRzX2JlMzIocmVnLCAzIDw8IHNoaWZ0LCAyIDw8IHNoaWZ0KTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbXBjOHh4eF9nYy0+bG9jaywgZmxhZ3MpOworCQlicmVhazsKKworCWNhc2UgSVJRX1RZUEVfRURHRV9SSVNJTkc6CisJY2FzZSBJUlFfVFlQRV9MRVZFTF9ISUdIOgorCQlzcGluX2xvY2tfaXJxc2F2ZSgmbXBjOHh4eF9nYy0+bG9jaywgZmxhZ3MpOworCQljbHJzZXRiaXRzX2JlMzIocmVnLCAzIDw8IHNoaWZ0LCAxIDw8IHNoaWZ0KTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbXBjOHh4eF9nYy0+bG9jaywgZmxhZ3MpOworCQlicmVhazsKKworCWNhc2UgSVJRX1RZUEVfRURHRV9CT1RIOgorCQlzcGluX2xvY2tfaXJxc2F2ZSgmbXBjOHh4eF9nYy0+bG9jaywgZmxhZ3MpOworCQljbHJiaXRzMzIocmVnLCAzIDw8IHNoaWZ0KTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbXBjOHh4eF9nYy0+bG9jaywgZmxhZ3MpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCiBzdGF0aWMgc3RydWN0IGlycV9jaGlwIG1wYzh4eHhfaXJxX2NoaXAgPSB7CiAJLm5hbWUJCT0gIm1wYzh4eHgtZ3BpbyIsCiAJLnVubWFzawkJPSBtcGM4eHh4X2lycV91bm1hc2ssCkBAIC0yMjYsNiArMjczLDExIEBACiBzdGF0aWMgaW50IG1wYzh4eHhfZ3Bpb19pcnFfbWFwKHN0cnVjdCBpcnFfaG9zdCAqaCwgdW5zaWduZWQgaW50IHZpcnEsCiAJCQkJaXJxX2h3X251bWJlcl90IGh3KQogeworCXN0cnVjdCBtcGM4eHh4X2dwaW9fY2hpcCAqbXBjOHh4eF9nYyA9IGgtPmhvc3RfZGF0YTsKKworCWlmIChtcGM4eHh4X2djLT5vZl9kZXZfaWRfZGF0YSkKKwkJbXBjOHh4eF9pcnFfY2hpcC5zZXRfdHlwZSA9IG1wYzh4eHhfZ2MtPm9mX2Rldl9pZF9kYXRhOworCiAJc2V0X2lycV9jaGlwX2RhdGEodmlycSwgaC0+aG9zdF9kYXRhKTsKIAlzZXRfaXJxX2NoaXBfYW5kX2hhbmRsZXIodmlycSwgJm1wYzh4eHhfaXJxX2NoaXAsIGhhbmRsZV9sZXZlbF9pcnEpOwogCXNldF9pcnFfdHlwZSh2aXJxLCBJUlFfVFlQRV9OT05FKTsKQEAgLTI1MywxMSArMzA1LDIwIEBACiAJLnhsYXRlCT0gbXBjOHh4eF9ncGlvX2lycV94bGF0ZSwKIH07CiAKK3N0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIG1wYzh4eHhfZ3Bpb19pZHNbXSBfX2luaXRkYXRhID0geworCXsgLmNvbXBhdGlibGUgPSAiZnNsLG1wYzgzNDktZ3BpbyIsIH0sCisJeyAuY29tcGF0aWJsZSA9ICJmc2wsbXBjODU3Mi1ncGlvIiwgfSwKKwl7IC5jb21wYXRpYmxlID0gImZzbCxtcGM4NjEwLWdwaW8iLCB9LAorCXsgLmNvbXBhdGlibGUgPSAiZnNsLG1wYzUxMjEtZ3BpbyIsIC5kYXRhID0gbXBjNTEyeF9pcnFfc2V0X3R5cGUsIH0sCisJe30KK307CisKIHN0YXRpYyB2b2lkIF9faW5pdCBtcGM4eHh4X2FkZF9jb250cm9sbGVyKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApCiB7CiAJc3RydWN0IG1wYzh4eHhfZ3Bpb19jaGlwICptcGM4eHh4X2djOwogCXN0cnVjdCBvZl9tbV9ncGlvX2NoaXAgKm1tX2djOwogCXN0cnVjdCBncGlvX2NoaXAgKmdjOworCWNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKmlkOwogCXVuc2lnbmVkIGh3aXJxOwogCWludCByZXQ7CiAKQEAgLTI5Nyw2ICszNTgsMTAgQEAKIAlpZiAoIW1wYzh4eHhfZ2MtPmlycSkKIAkJZ290byBza2lwX2lycTsKIAorCWlkID0gb2ZfbWF0Y2hfbm9kZShtcGM4eHh4X2dwaW9faWRzLCBucCk7CisJaWYgKGlkKQorCQltcGM4eHh4X2djLT5vZl9kZXZfaWRfZGF0YSA9IGlkLT5kYXRhOworCiAJbXBjOHh4eF9nYy0+aXJxLT5ob3N0X2RhdGEgPSBtcGM4eHh4X2djOwogCiAJLyogYWNrIGFuZCBtYXNrIGFsbCBpcnFzICovCkBAIC0zMjEsMTMgKzM4Niw3IEBACiB7CiAJc3RydWN0IGRldmljZV9ub2RlICpucDsKIAotCWZvcl9lYWNoX2NvbXBhdGlibGVfbm9kZShucCwgTlVMTCwgImZzbCxtcGM4MzQ5LWdwaW8iKQotCQltcGM4eHh4X2FkZF9jb250cm9sbGVyKG5wKTsKLQotCWZvcl9lYWNoX2NvbXBhdGlibGVfbm9kZShucCwgTlVMTCwgImZzbCxtcGM4NTcyLWdwaW8iKQotCQltcGM4eHh4X2FkZF9jb250cm9sbGVyKG5wKTsKLQotCWZvcl9lYWNoX2NvbXBhdGlibGVfbm9kZShucCwgTlVMTCwgImZzbCxtcGM4NjEwLWdwaW8iKQorCWZvcl9lYWNoX21hdGNoaW5nX25vZGUobnAsIG1wYzh4eHhfZ3Bpb19pZHMpCiAJCW1wYzh4eHhfYWRkX2NvbnRyb2xsZXIobnApOwogCiAJZm9yX2VhY2hfY29tcGF0aWJsZV9ub2RlKG5wLCBOVUxMLCAiZnNsLHFvcmlxLWdwaW8iKQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9tdjY0eDYwX2Rldi5jIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9tdjY0eDYwX2Rldi5jCmluZGV4IDEzOThiYzQuLmZlYWVlNDAgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvbXY2NHg2MF9kZXYuYworKysgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L212NjR4NjBfZGV2LmMKQEAgLTE2LDYgKzE2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tdjY0M3h4Lmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfcGxhdGZvcm0uaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9uZXQuaD4KICNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgogCiAjaW5jbHVkZSA8YXNtL3Byb20uaD4KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvcHBjNHh4X2NwbS5jIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9wcGM0eHhfY3BtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzNiODZjYwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvcHBjNHh4X2NwbS5jCkBAIC0wLDAgKzEsMzQ2IEBACisvKgorICogUG93ZXJQQyA0eHggQ2xvY2sgYW5kIFBvd2VyIE1hbmFnZW1lbnQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAsIEFwcGxpZWQgTWljcm8gQ2lyY3VpdHMgQ29ycG9yYXRpb24KKyAqIFZpY3RvciBHYWxsYXJkbyAodmdhbGxhcmRvQGFwbS5jb20pCisgKgorICogQmFzZWQgb24gYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy80NHgvaWRsZS5jOgorICogSmVyb25lIFlvdW5nIDxqeW91bmc1QHVzLmlibS5jb20+CisgKiBDb3B5cmlnaHQgMjAwOCBJQk0gQ29ycC4KKyAqCisgKiBCYXNlZCBvbiBhcmNoL3Bvd2VycGMvc3lzZGV2L2ZzbF9wbWMuYzoKKyAqIEFudG9uIFZvcm9udHNvdiA8YXZvcm9udHNvdkBydS5tdmlzdGEuY29tPgorICogQ29weXJpZ2h0IDIwMDkgIE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9wbGF0Zm9ybS5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+CisjaW5jbHVkZSA8bGludXgvY3B1Lmg+CisjaW5jbHVkZSA8bGludXgvc3VzcGVuZC5oPgorI2luY2x1ZGUgPGFzbS9kY3IuaD4KKyNpbmNsdWRlIDxhc20vZGNyLW5hdGl2ZS5oPgorI2luY2x1ZGUgPGFzbS9tYWNoZGVwLmg+CisKKyNkZWZpbmUgQ1BNX0VSCTAKKyNkZWZpbmUgQ1BNX0ZSCTEKKyNkZWZpbmUgQ1BNX1NSCTIKKworI2RlZmluZSBDUE1fSURMRV9XQUlUCTAKKyNkZWZpbmUgQ1BNX0lETEVfRE9aRQkxCisKK3N0cnVjdCBjcG0geworCWRjcl9ob3N0X3QJZGNyX2hvc3Q7CisJdW5zaWduZWQgaW50CWRjcl9vZmZzZXRbM107CisJdW5zaWduZWQgaW50CXBvd2Vyc2F2ZV9vZmY7CisJdW5zaWduZWQgaW50CXVudXNlZDsKKwl1bnNpZ25lZCBpbnQJaWRsZV9kb3plOworCXVuc2lnbmVkIGludAlzdGFuZGJ5OworCXVuc2lnbmVkIGludAlzdXNwZW5kOworfTsKKworc3RhdGljIHN0cnVjdCBjcG0gY3BtOworCitzdHJ1Y3QgY3BtX2lkbGVfbW9kZSB7CisJdW5zaWduZWQgaW50IGVuYWJsZWQ7CisJY29uc3QgY2hhciAgKm5hbWU7Cit9OworCitzdGF0aWMgc3RydWN0IGNwbV9pZGxlX21vZGUgaWRsZV9tb2RlW10gPSB7CisJW0NQTV9JRExFX1dBSVRdID0geyAxLCAid2FpdCIgfSwgLyogZGVmYXVsdCAqLworCVtDUE1fSURMRV9ET1pFXSA9IHsgMCwgImRvemUiIH0sCit9OworCitzdGF0aWMgdW5zaWduZWQgaW50IGNwbV9zZXQodW5zaWduZWQgaW50IGNwbV9yZWcsIHVuc2lnbmVkIGludCBtYXNrKQoreworCXVuc2lnbmVkIGludCB2YWx1ZTsKKworCS8qIENQTSBjb250cm9sbGVyIHN1cHBvcnRzIDMgZGlmZmVyZW50IHR5cGVzIG9mIHNsZWVwIGludGVyZmFjZQorCSAqIGtub3duIGFzIGNsYXNzIDEsIDIgYW5kIDMuIEZvciBjbGFzcyAxIHVuaXRzLCB0aGV5IGFyZQorCSAqIHVuY29uZGl0aW9uYWxseSBwdXQgdG8gc2xlZXAgd2hlbiB0aGUgY29ycmVzcG9uZGluZyBDUE0gYml0IGlzCisJICogc2V0LiBGb3IgY2xhc3MgMiBhbmQgMyB1bml0cyB0aGlzIGlzIG5vdCBjYXNlOyBpZiB0aGV5IGNhbiBiZQorCSAqIHB1dCB0byB0byBzbGVlcCwgdGhleSB3aWxsLiBIZXJlIHdlIGRvIG5vdCB2ZXJpZnksIHdlIGp1c3QKKwkgKiBzZXQgdGhlbSBhbmQgZXhwZWN0IHRoZW0gdG8gZXZlbnR1YWxseSBnbyBvZmYgd2hlbiB0aGV5IGNhbi4KKwkgKi8KKwl2YWx1ZSA9IGRjcl9yZWFkKGNwbS5kY3JfaG9zdCwgY3BtLmRjcl9vZmZzZXRbY3BtX3JlZ10pOworCWRjcl93cml0ZShjcG0uZGNyX2hvc3QsIGNwbS5kY3Jfb2Zmc2V0W2NwbV9yZWddLCB2YWx1ZSB8IG1hc2spOworCisJLyogcmV0dXJuIG9sZCBzdGF0ZSwgdG8gcmVzdG9yZSBsYXRlciBpZiBuZWVkZWQgKi8KKwlyZXR1cm4gdmFsdWU7Cit9CisKK3N0YXRpYyB2b2lkIGNwbV9pZGxlX3dhaXQodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIG1zcl9zYXZlOworCisJLyogc2F2ZSBvZmYgaW5pdGlhbCBzdGF0ZSAqLworCW1zcl9zYXZlID0gbWZtc3IoKTsKKwkvKiBzeW5jIHJlcXVpcmVkIHdoZW4gQ1BNMF9FUltDUFVdIGlzIHNldCAqLworCW1iKCk7CisJLyogc2V0IHdhaXQgc3RhdGUgTVNSICovCisJbXRtc3IobXNyX3NhdmV8TVNSX1dFfE1TUl9FRXxNU1JfQ0V8TVNSX0RFKTsKKwlpc3luYygpOworCS8qIHJldHVybiB0byBpbml0aWFsIHN0YXRlICovCisJbXRtc3IobXNyX3NhdmUpOworCWlzeW5jKCk7Cit9CisKK3N0YXRpYyB2b2lkIGNwbV9pZGxlX3NsZWVwKHVuc2lnbmVkIGludCBtYXNrKQoreworCXVuc2lnbmVkIGludCBlcl9zYXZlOworCisJLyogdXBkYXRlIENQTV9FUiBzdGF0ZSAqLworCWVyX3NhdmUgPSBjcG1fc2V0KENQTV9FUiwgbWFzayk7CisKKwkvKiBnbyB0byB3YWl0IHN0YXRlIHNvIHRoYXQgQ1BNMF9FUltDUFVdIGNhbiB0YWtlIGVmZmVjdCAqLworCWNwbV9pZGxlX3dhaXQoKTsKKworCS8qIHJlc3RvcmUgQ1BNX0VSIHN0YXRlICovCisJZGNyX3dyaXRlKGNwbS5kY3JfaG9zdCwgY3BtLmRjcl9vZmZzZXRbQ1BNX0VSXSwgZXJfc2F2ZSk7Cit9CisKK3N0YXRpYyB2b2lkIGNwbV9pZGxlX2RvemUodm9pZCkKK3sKKwljcG1faWRsZV9zbGVlcChjcG0uaWRsZV9kb3plKTsKK30KKworc3RhdGljIHZvaWQgY3BtX2lkbGVfY29uZmlnKGludCBtb2RlKQoreworCWludCBpOworCisJaWYgKGlkbGVfbW9kZVttb2RlXS5lbmFibGVkKQorCQlyZXR1cm47CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShpZGxlX21vZGUpOyBpKyspCisJCWlkbGVfbW9kZVtpXS5lbmFibGVkID0gMDsKKworCWlkbGVfbW9kZVttb2RlXS5lbmFibGVkID0gMTsKK30KKworc3RhdGljIHNzaXplX3QgY3BtX2lkbGVfc2hvdyhzdHJ1Y3Qga29iamVjdCAqa29iaiwKKwkJCSAgICAgc3RydWN0IGtvYmpfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJY2hhciAqcyA9IGJ1ZjsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGlkbGVfbW9kZSk7IGkrKykgeworCQlpZiAoaWRsZV9tb2RlW2ldLmVuYWJsZWQpCisJCQlzICs9IHNwcmludGYocywgIlslc10gIiwgaWRsZV9tb2RlW2ldLm5hbWUpOworCQllbHNlCisJCQlzICs9IHNwcmludGYocywgIiVzICIsIGlkbGVfbW9kZVtpXS5uYW1lKTsKKwl9CisKKwkqKHMtMSkgPSAnXG4nOyAvKiBjb252ZXJ0IHRoZSBsYXN0IHNwYWNlIHRvIGEgbmV3bGluZSAqLworCisJcmV0dXJuIHMgLSBidWY7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGNwbV9pZGxlX3N0b3JlKHN0cnVjdCBrb2JqZWN0ICprb2JqLAorCQkJICAgICAgc3RydWN0IGtvYmpfYXR0cmlidXRlICphdHRyLAorCQkJICAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgbikKK3sKKwlpbnQgaTsKKwljaGFyICpwOworCWludCBsZW47CisKKwlwID0gbWVtY2hyKGJ1ZiwgJ1xuJywgbik7CisJbGVuID0gcCA/IHAgLSBidWYgOiBuOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoaWRsZV9tb2RlKTsgaSsrKSB7CisJCWlmIChzdHJuY21wKGJ1ZiwgaWRsZV9tb2RlW2ldLm5hbWUsIGxlbikgPT0gMCkgeworCQkJY3BtX2lkbGVfY29uZmlnKGkpOworCQkJcmV0dXJuIG47CisJCX0KKwl9CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIHN0cnVjdCBrb2JqX2F0dHJpYnV0ZSBjcG1faWRsZV9hdHRyID0KKwlfX0FUVFIoaWRsZSwgMDY0NCwgY3BtX2lkbGVfc2hvdywgY3BtX2lkbGVfc3RvcmUpOworCitzdGF0aWMgdm9pZCBjcG1faWRsZV9jb25maWdfc3lzZnModm9pZCkKK3sKKwlzdHJ1Y3Qgc3lzX2RldmljZSAqc3lzX2RldjsKKwl1bnNpZ25lZCBsb25nIHJldDsKKworCXN5c19kZXYgPSBnZXRfY3B1X3N5c2RldigwKTsKKworCXJldCA9IHN5c2ZzX2NyZWF0ZV9maWxlKCZzeXNfZGV2LT5rb2JqLAorCQkJCSZjcG1faWRsZV9hdHRyLmF0dHIpOworCWlmIChyZXQpCisJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJICAgICAgICJjcG06IGZhaWxlZCB0byBjcmVhdGUgaWRsZSBzeXNmcyBlbnRyeVxuIik7Cit9CisKK3N0YXRpYyB2b2lkIGNwbV9pZGxlKHZvaWQpCit7CisJaWYgKGlkbGVfbW9kZVtDUE1fSURMRV9ET1pFXS5lbmFibGVkKQorCQljcG1faWRsZV9kb3plKCk7CisJZWxzZQorCQljcG1faWRsZV93YWl0KCk7Cit9CisKK3N0YXRpYyBpbnQgY3BtX3N1c3BlbmRfdmFsaWQoc3VzcGVuZF9zdGF0ZV90IHN0YXRlKQoreworCXN3aXRjaCAoc3RhdGUpIHsKKwljYXNlIFBNX1NVU1BFTkRfU1RBTkRCWToKKwkJcmV0dXJuICEhY3BtLnN0YW5kYnk7CisJY2FzZSBQTV9TVVNQRU5EX01FTToKKwkJcmV0dXJuICEhY3BtLnN1c3BlbmQ7CisJZGVmYXVsdDoKKwkJcmV0dXJuIDA7CisJfQorfQorCitzdGF0aWMgdm9pZCBjcG1fc3VzcGVuZF9zdGFuZGJ5KHVuc2lnbmVkIGludCBtYXNrKQoreworCXVuc2lnbmVkIGxvbmcgdGNyX3NhdmU7CisKKwkvKiBkaXNhYmxlIGRlY3JlbWVudCBpbnRlcnJ1cHQgKi8KKwl0Y3Jfc2F2ZSA9IG1mc3ByKFNQUk5fVENSKTsKKwltdHNwcihTUFJOX1RDUiwgdGNyX3NhdmUgJiB+VENSX0RJRSk7CisKKwkvKiBnbyB0byBzbGVlcCBzdGF0ZSAqLworCWNwbV9pZGxlX3NsZWVwKG1hc2spOworCisJLyogcmVzdG9yZSBkZWNyZW1lbnQgaW50ZXJydXB0ICovCisJbXRzcHIoU1BSTl9UQ1IsIHRjcl9zYXZlKTsKK30KKworc3RhdGljIGludCBjcG1fc3VzcGVuZF9lbnRlcihzdXNwZW5kX3N0YXRlX3Qgc3RhdGUpCit7CisJc3dpdGNoIChzdGF0ZSkgeworCWNhc2UgUE1fU1VTUEVORF9TVEFOREJZOgorCQljcG1fc3VzcGVuZF9zdGFuZGJ5KGNwbS5zdGFuZGJ5KTsKKwkJYnJlYWs7CisJY2FzZSBQTV9TVVNQRU5EX01FTToKKwkJY3BtX3N1c3BlbmRfc3RhbmRieShjcG0uc3VzcGVuZCk7CisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX3N1c3BlbmRfb3BzIGNwbV9zdXNwZW5kX29wcyA9IHsKKwkudmFsaWQJCT0gY3BtX3N1c3BlbmRfdmFsaWQsCisJLmVudGVyCQk9IGNwbV9zdXNwZW5kX2VudGVyLAorfTsKKworc3RhdGljIGludCBjcG1fZ2V0X3VpbnRfcHJvcGVydHkoc3RydWN0IGRldmljZV9ub2RlICpucCwKKwkJCQkgY29uc3QgY2hhciAqbmFtZSkKK3sKKwlpbnQgbGVuOworCWNvbnN0IHVuc2lnbmVkIGludCAqcHJvcCA9IG9mX2dldF9wcm9wZXJ0eShucCwgbmFtZSwgJmxlbik7CisKKwlpZiAocHJvcCA9PSBOVUxMIHx8IGxlbiA8IHNpemVvZih1MzIpKQorCQlyZXR1cm4gMDsKKworCXJldHVybiAqcHJvcDsKK30KKworc3RhdGljIGludCBfX2luaXQgY3BtX2luaXQodm9pZCkKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOworCWludCBkY3JfYmFzZSwgZGNyX2xlbjsKKwlpbnQgcmV0ID0gMDsKKworCWlmICghY3BtLnBvd2Vyc2F2ZV9vZmYpIHsKKwkJY3BtX2lkbGVfY29uZmlnKENQTV9JRExFX1dBSVQpOworCQlwcGNfbWQucG93ZXJfc2F2ZSA9ICZjcG1faWRsZTsKKwl9CisKKwlucCA9IG9mX2ZpbmRfY29tcGF0aWJsZV9ub2RlKE5VTEwsIE5VTEwsICJpYm0sY3BtIik7CisJaWYgKCFucCkgeworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisKKwlkY3JfYmFzZSA9IGRjcl9yZXNvdXJjZV9zdGFydChucCwgMCk7CisJZGNyX2xlbiA9IGRjcl9yZXNvdXJjZV9sZW4obnAsIDApOworCisJaWYgKGRjcl9iYXNlID09IDAgfHwgZGNyX2xlbiA9PSAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiY3BtOiBjb3VsZCBub3QgcGFyc2UgZGNyIHByb3BlcnR5IGZvciAlc1xuIiwKKwkJICAgICAgIG5wLT5mdWxsX25hbWUpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisKKwljcG0uZGNyX2hvc3QgPSBkY3JfbWFwKG5wLCBkY3JfYmFzZSwgZGNyX2xlbik7CisKKwlpZiAoIURDUl9NQVBfT0soY3BtLmRjcl9ob3N0KSkgeworCQlwcmludGsoS0VSTl9FUlIgImNwbTogZmFpbGVkIHRvIG1hcCBkY3IgcHJvcGVydHkgZm9yICVzXG4iLAorCQkgICAgICAgbnAtPmZ1bGxfbmFtZSk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKworCS8qIEFsbCA0eHggU29DcyB3aXRoIGEgQ1BNIGNvbnRyb2xsZXIgaGF2ZSBvbmUgb2YgdHdvCisJICogZGlmZmVyZW50IG9yZGVyIGZvciB0aGUgQ1BNIHJlZ2lzdGVycy4gU29tZSBoYXZlIHRoZQorCSAqIENQTSByZWdpc3RlcnMgaW4gdGhlIGZvbGxvd2luZyBvcmRlciAoRVIsRlIsU1IpLiBUaGUKKwkgKiBvdGhlcnMgaGF2ZSB0aGVtIGluIHRoZSBmb2xsb3dpbmcgb3JkZXIgKFNSLEVSLEZSKS4KKwkgKi8KKworCWlmIChjcG1fZ2V0X3VpbnRfcHJvcGVydHkobnAsICJlci1vZmZzZXQiKSA9PSAwKSB7CisJCWNwbS5kY3Jfb2Zmc2V0W0NQTV9FUl0gPSAwOworCQljcG0uZGNyX29mZnNldFtDUE1fRlJdID0gMTsKKwkJY3BtLmRjcl9vZmZzZXRbQ1BNX1NSXSA9IDI7CisJfSBlbHNlIHsKKwkJY3BtLmRjcl9vZmZzZXRbQ1BNX0VSXSA9IDE7CisJCWNwbS5kY3Jfb2Zmc2V0W0NQTV9GUl0gPSAyOworCQljcG0uZGNyX29mZnNldFtDUE1fU1JdID0gMDsKKwl9CisKKwkvKiBOb3cgbGV0J3Mgc2VlIHdoYXQgSVBzIHRvIHR1cm4gb2ZmIGZvciB0aGUgZm9sbG93aW5nIG1vZGVzICovCisKKwljcG0udW51c2VkID0gY3BtX2dldF91aW50X3Byb3BlcnR5KG5wLCAidW51c2VkLXVuaXRzIik7CisJY3BtLmlkbGVfZG96ZSA9IGNwbV9nZXRfdWludF9wcm9wZXJ0eShucCwgImlkbGUtZG96ZSIpOworCWNwbS5zdGFuZGJ5ID0gY3BtX2dldF91aW50X3Byb3BlcnR5KG5wLCAic3RhbmRieSIpOworCWNwbS5zdXNwZW5kID0gY3BtX2dldF91aW50X3Byb3BlcnR5KG5wLCAic3VzcGVuZCIpOworCisJLyogSWYgc29tZSBJUHMgYXJlIHVudXNlZCBsZXQncyB0dXJuIHRoZW0gb2ZmIG5vdyAqLworCisJaWYgKGNwbS51bnVzZWQpIHsKKwkJY3BtX3NldChDUE1fRVIsIGNwbS51bnVzZWQpOworCQljcG1fc2V0KENQTV9GUiwgY3BtLnVudXNlZCk7CisJfQorCisJLyogTm93IGxldCdzIGV4cG9ydCBpbnRlcmZhY2VzICovCisKKwlpZiAoIWNwbS5wb3dlcnNhdmVfb2ZmICYmIGNwbS5pZGxlX2RvemUpCisJCWNwbV9pZGxlX2NvbmZpZ19zeXNmcygpOworCisJaWYgKGNwbS5zdGFuZGJ5IHx8IGNwbS5zdXNwZW5kKQorCQlzdXNwZW5kX3NldF9vcHMoJmNwbV9zdXNwZW5kX29wcyk7CitvdXQ6CisJaWYgKG5wKQorCQlvZl9ub2RlX3B1dChucCk7CisJcmV0dXJuIHJldDsKK30KKworbGF0ZV9pbml0Y2FsbChjcG1faW5pdCk7CisKK3N0YXRpYyBpbnQgX19pbml0IGNwbV9wb3dlcnNhdmVfb2ZmKGNoYXIgKmFyZykKK3sKKwljcG0ucG93ZXJzYXZlX29mZiA9IDE7CisJcmV0dXJuIDA7Cit9CitfX3NldHVwKCJwb3dlcnNhdmU9b2ZmIiwgY3BtX3Bvd2Vyc2F2ZV9vZmYpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi90c2kxMDhfZGV2LmMgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L3RzaTEwOF9kZXYuYwppbmRleCBkNGQxNWFhLi5lZTA1NjgwIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvc3lzZGV2L3RzaTEwOF9kZXYuYworKysgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L3RzaTEwOF9kZXYuYwpAQCAtMTksNiArMTksNyBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L29mX25ldC5oPgogI2luY2x1ZGUgPGFzbS90c2kxMDguaD4KIAogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KQEAgLTgzLDggKzg0LDggQEAKIAkJbWVtc2V0KCZ0c2lfZXRoX2RhdGEsIDAsIHNpemVvZih0c2lfZXRoX2RhdGEpKTsKIAogCQlyZXQgPSBvZl9hZGRyZXNzX3RvX3Jlc291cmNlKG5wLCAwLCAmclswXSk7Ci0JCURCRygiJXM6IG5hbWU6c3RhcnQtPmVuZCA9ICVzOjB4JWx4LT4gMHglbHhcbiIsCi0JCQlfX2Z1bmNfXyxyWzBdLm5hbWUsIHJbMF0uc3RhcnQsIHJbMF0uZW5kKTsKKwkJREJHKCIlczogbmFtZTpzdGFydC0+ZW5kID0gJXM6JXBSXG4iLAorCQkgICAgX19mdW5jX18sIHJbMF0ubmFtZSwgJnJbMF0pOwogCQlpZiAocmV0KQogCQkJZ290byBlcnI7CiAKQEAgLTkyLDggKzkzLDggQEAKIAkJclsxXS5zdGFydCA9IGlycV9vZl9wYXJzZV9hbmRfbWFwKG5wLCAwKTsKIAkJclsxXS5lbmQgPSBpcnFfb2ZfcGFyc2VfYW5kX21hcChucCwgMCk7CiAJCXJbMV0uZmxhZ3MgPSBJT1JFU09VUkNFX0lSUTsKLQkJREJHKCIlczogbmFtZTpzdGFydC0+ZW5kID0gJXM6MHglbHgtPiAweCVseFxuIiwKLQkJCV9fZnVuY19fLHJbMV0ubmFtZSwgclsxXS5zdGFydCwgclsxXS5lbmQpOworCQlEQkcoIiVzOiBuYW1lOnN0YXJ0LT5lbmQgPSAlczolcFJcbiIsCisJCQlfX2Z1bmNfXywgclsxXS5uYW1lLCAmclsxXSk7CiAKIAkJdHNpX2V0aF9kZXYgPQogCQkgICAgcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyX3NpbXBsZSgidHNpLWV0aGVybmV0IiwgaSsrLCAmclswXSwKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL2F1eGlvXzMyLmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9hdXhpb18zMi5jCmluZGV4IDM1ZjQ4ODMuLjg1MDVlMGEgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL2F1eGlvXzMyLmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvYXV4aW9fMzIuYwpAQCAtMTIxLDcgKzEyMSw3IEBACiAJbm9kZSA9IHByb21fc2VhcmNoc2libGluZ3Mobm9kZSwgIm9iaW8iKTsKIAlub2RlID0gcHJvbV9nZXRjaGlsZChub2RlKTsKIAlub2RlID0gcHJvbV9zZWFyY2hzaWJsaW5ncyhub2RlLCAicG93ZXIiKTsKLQlpZiAobm9kZSA9PSAwIHx8IG5vZGUgPT0gLTEpCisJaWYgKG5vZGUgPT0gMCB8fCAoczMyKW5vZGUgPT0gLTEpCiAJCXJldHVybjsKIAogCS8qIE1hcCB0aGUgcG93ZXIgY29udHJvbCByZWdpc3Rlci4gKi8KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL3N0YXJmaXJlLmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9zdGFyZmlyZS5jCmluZGV4IGE0NDQ2YzAuLjgyMjgxYTUgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL3N0YXJmaXJlLmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvc3RhcmZpcmUuYwpAQCAtMjQsNyArMjQsNyBAQAogdm9pZCBjaGVja19pZl9zdGFyZmlyZSh2b2lkKQogewogCXBoYW5kbGUgc3Nub2RlID0gcHJvbV9maW5kZGV2aWNlKCIvc3NwLXNlcmlhbCIpOwotCWlmIChzc25vZGUgIT0gMCAmJiBzc25vZGUgIT0gLTEpCisJaWYgKHNzbm9kZSAhPSAwICYmIChzMzIpc3Nub2RlICE9IC0xKQogCQl0aGlzX2lzX3N0YXJmaXJlID0gMTsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9wcm9tL2luaXRfMzIuYyBiL2FyY2gvc3BhcmMvcHJvbS9pbml0XzMyLmMKaW5kZXggZDM0MmRiYS4uMGE2MDFiMyAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9wcm9tL2luaXRfMzIuYworKysgYi9hcmNoL3NwYXJjL3Byb20vaW5pdF8zMi5jCkBAIC02MCw3ICs2MCw3IEBACiAJcHJvbV9ub2Rlb3BzID0gcm9tdmVjLT5wdl9ub2Rlb3BzOwogCiAJcHJvbV9yb290X25vZGUgPSBwcm9tX2dldHNpYmxpbmcoMCk7Ci0JaWYoKHByb21fcm9vdF9ub2RlID09IDApIHx8IChwcm9tX3Jvb3Rfbm9kZSA9PSAtMSkpCisJaWYgKChwcm9tX3Jvb3Rfbm9kZSA9PSAwKSB8fCAoKHMzMilwcm9tX3Jvb3Rfbm9kZSA9PSAtMSkpCiAJCXByb21faGFsdCgpOwogCiAJaWYoKCgodW5zaWduZWQgbG9uZykgcHJvbV9ub2Rlb3BzKSA9PSAwKSB8fCAKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvcHJvbS9pbml0XzY0LmMgYi9hcmNoL3NwYXJjL3Byb20vaW5pdF82NC5jCmluZGV4IDljNmFjNGIuLjUwMTZjNWUgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMvcHJvbS9pbml0XzY0LmMKKysrIGIvYXJjaC9zcGFyYy9wcm9tL2luaXRfNjQuYwpAQCAtMzUsMTMgKzM1LDEzIEBACiAJcHJvbV9jaWZfaW5pdChjaWZfaGFuZGxlciwgY2lmX3N0YWNrKTsKIAogCXByb21fY2hvc2VuX25vZGUgPSBwcm9tX2ZpbmRkZXZpY2UocHJvbV9jaG9zZW5fcGF0aCk7Ci0JaWYgKCFwcm9tX2Nob3Nlbl9ub2RlIHx8IHByb21fY2hvc2VuX25vZGUgPT0gLTEpCisJaWYgKCFwcm9tX2Nob3Nlbl9ub2RlIHx8IChzMzIpcHJvbV9jaG9zZW5fbm9kZSA9PSAtMSkKIAkJcHJvbV9oYWx0KCk7CiAKIAlwcm9tX3N0ZG91dCA9IHByb21fZ2V0aW50KHByb21fY2hvc2VuX25vZGUsICJzdGRvdXQiKTsKIAogCW5vZGUgPSBwcm9tX2ZpbmRkZXZpY2UoIi9vcGVucHJvbSIpOwotCWlmICghbm9kZSB8fCBub2RlID09IC0xKQorCWlmICghbm9kZSB8fCAoczMyKW5vZGUgPT0gLTEpCiAJCXByb21faGFsdCgpOwogCiAJcHJvbV9nZXRzdHJpbmcobm9kZSwgInZlcnNpb24iLCBwcm9tX3ZlcnNpb24sIHNpemVvZihwcm9tX3ZlcnNpb24pKTsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvcHJvbS90cmVlXzMyLmMgYi9hcmNoL3NwYXJjL3Byb20vdHJlZV8zMi5jCmluZGV4IGJjOGU0Y2IuLmYzMGU4ZDAgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMvcHJvbS90cmVlXzMyLmMKKysrIGIvYXJjaC9zcGFyYy9wcm9tL3RyZWVfMzIuYwpAQCAtNDAsMTEgKzQwLDExIEBACiB7CiAJcGhhbmRsZSBjbm9kZTsKIAotCWlmIChub2RlID09IC0xKQorCWlmICgoczMyKW5vZGUgPT0gLTEpCiAJCXJldHVybiAwOwogCiAJY25vZGUgPSBfX3Byb21fZ2V0Y2hpbGQobm9kZSk7Ci0JaWYgKGNub2RlID09IDAgfHwgY25vZGUgPT0gLTEpCisJaWYgKGNub2RlID09IDAgfHwgKHMzMiljbm9kZSA9PSAtMSkKIAkJcmV0dXJuIDA7CiAKIAlyZXR1cm4gY25vZGU7CkBAIC03MiwxMSArNzIsMTEgQEAKIHsKIAlwaGFuZGxlIHNpYm5vZGU7CiAKLQlpZiAobm9kZSA9PSAtMSkKKwlpZiAoKHMzMilub2RlID09IC0xKQogCQlyZXR1cm4gMDsKIAogCXNpYm5vZGUgPSBfX3Byb21fZ2V0c2libGluZyhub2RlKTsKLQlpZiAoc2libm9kZSA9PSAwIHx8IHNpYm5vZGUgPT0gLTEpCisJaWYgKHNpYm5vZGUgPT0gMCB8fCAoczMyKXNpYm5vZGUgPT0gLTEpCiAJCXJldHVybiAwOwogCiAJcmV0dXJuIHNpYm5vZGU7CkBAIC0yMTksNyArMjE5LDcgQEAKICAqLwogY2hhciAqcHJvbV9uZXh0cHJvcChwaGFuZGxlIG5vZGUsIGNoYXIgKm9wcm9wLCBjaGFyICpidWZmZXIpCiB7Ci0JaWYgKG5vZGUgPT0gMCB8fCBub2RlID09IC0xKQorCWlmIChub2RlID09IDAgfHwgKHMzMilub2RlID09IC0xKQogCQlyZXR1cm4gIiI7CiAKIAlyZXR1cm4gX19wcm9tX25leHRwcm9wKG5vZGUsIG9wcm9wKTsKQEAgLTI1Myw3ICsyNTMsNyBAQAogCQkJCWlmIChkICE9IHMgKyAzICYmICghKmQgfHwgKmQgPT0gJy8nKQogCQkJCSAgICAmJiBkIDw9IHMgKyAzICsgOCkgewogCQkJCQlub2RlMiA9IG5vZGU7Ci0JCQkJCXdoaWxlIChub2RlMiAmJiBub2RlMiAhPSAtMSkgeworCQkJCQl3aGlsZSAobm9kZTIgJiYgKHMzMilub2RlMiAhPSAtMSkgewogCQkJCQkJaWYgKHByb21fZ2V0cHJvcGVydHkgKG5vZGUyLCAicmVnIiwgKGNoYXIgKilyZWcsIHNpemVvZiAocmVnKSkgPiAwKSB7CiAJCQkJCQkJaWYgKHdoaWNoX2lvID09IHJlZ1swXS53aGljaF9pbyAmJiBwaHlzX2FkZHIgPT0gcmVnWzBdLnBoeXNfYWRkcikgewogCQkJCQkJCQlub2RlID0gbm9kZTI7CkBAIC0yNjEsNyArMjYxLDcgQEAKIAkJCQkJCQl9CiAJCQkJCQl9CiAJCQkJCQlub2RlMiA9IHByb21fZ2V0c2libGluZyhub2RlMik7Ci0JCQkJCQlpZiAoIW5vZGUyIHx8IG5vZGUyID09IC0xKQorCQkJCQkJaWYgKCFub2RlMiB8fCAoczMyKW5vZGUyID09IC0xKQogCQkJCQkJCWJyZWFrOwogCQkJCQkJbm9kZTIgPSBwcm9tX3NlYXJjaHNpYmxpbmdzKHByb21fZ2V0c2libGluZyhub2RlMiksIG5idWYpOwogCQkJCQl9CkBAIC0zMDMsNiArMzAzLDcgQEAKIAlub2RlID0gKCpyb212ZWMtPnB2X3YyZGV2b3BzLnYyX2luc3QycGtnKShpbnN0KTsKIAlyZXN0b3JlX2N1cnJlbnQoKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcm9tX2xvY2ssIGZsYWdzKTsKLQlpZiAobm9kZSA9PSAtMSkgcmV0dXJuIDA7CisJaWYgKChzMzIpbm9kZSA9PSAtMSkKKwkJcmV0dXJuIDA7CiAJcmV0dXJuIG5vZGU7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL3Byb20vdHJlZV82NC5jIGIvYXJjaC9zcGFyYy9wcm9tL3RyZWVfNjQuYwppbmRleCBkOTM2NjAwLi45MjIwNGMzIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL3Byb20vdHJlZV82NC5jCisrKyBiL2FyY2gvc3BhcmMvcHJvbS90cmVlXzY0LmMKQEAgLTQzLDEwICs0MywxMCBAQAogewogCXBoYW5kbGUgY25vZGU7CiAKLQlpZiAobm9kZSA9PSAtMSkKKwlpZiAoKHMzMilub2RlID09IC0xKQogCQlyZXR1cm4gMDsKIAljbm9kZSA9IF9fcHJvbV9nZXRjaGlsZChub2RlKTsKLQlpZiAoY25vZGUgPT0gLTEpCisJaWYgKChzMzIpY25vZGUgPT0gLTEpCiAJCXJldHVybiAwOwogCXJldHVybiBjbm9kZTsKIH0KQEAgLTU2LDEwICs1NiwxMCBAQAogewogCXBoYW5kbGUgY25vZGU7CiAKLQlpZiAobm9kZSA9PSAtMSkKKwlpZiAoKHMzMilub2RlID09IC0xKQogCQlyZXR1cm4gMDsKIAljbm9kZSA9IHByb21fbm9kZV90b19ub2RlKCJwYXJlbnQiLCBub2RlKTsKLQlpZiAoY25vZGUgPT0gLTEpCisJaWYgKChzMzIpY25vZGUgPT0gLTEpCiAJCXJldHVybiAwOwogCXJldHVybiBjbm9kZTsKIH0KQEAgLTc2LDEwICs3NiwxMCBAQAogewogCXBoYW5kbGUgc2libm9kZTsKIAotCWlmIChub2RlID09IC0xKQorCWlmICgoczMyKW5vZGUgPT0gLTEpCiAJCXJldHVybiAwOwogCXNpYm5vZGUgPSBfX3Byb21fZ2V0c2libGluZyhub2RlKTsKLQlpZiAoc2libm9kZSA9PSAtMSkKKwlpZiAoKHMzMilzaWJub2RlID09IC0xKQogCQlyZXR1cm4gMDsKIAogCXJldHVybiBzaWJub2RlOwpAQCAtMjQwLDcgKzI0MCw3IEBACiAJdW5zaWduZWQgbG9uZyBhcmdzWzddOwogCiAJKmJ1ZmZlciA9IDA7Ci0JaWYgKG5vZGUgPT0gLTEpCisJaWYgKChzMzIpbm9kZSA9PSAtMSkKIAkJcmV0dXJuIGJ1ZmZlcjsKIAogCWFyZ3NbMF0gPSAodW5zaWduZWQgbG9uZykgcHJvbV9uZXh0cHJvcF9uYW1lOwpAQCAtMjY2LDcgKzI2Niw3IEBACiAJdW5zaWduZWQgbG9uZyBhcmdzWzddOwogCWNoYXIgYnVmWzMyXTsKIAotCWlmIChub2RlID09IC0xKSB7CisJaWYgKChzMzIpbm9kZSA9PSAtMSkgewogCQkqYnVmZmVyID0gMDsKIAkJcmV0dXJuIGJ1ZmZlcjsKIAl9CkBAIC0zNjksNyArMzY5LDcgQEAKIAlwMTI3NV9jbWRfZGlyZWN0KGFyZ3MpOwogCiAJbm9kZSA9IChpbnQpIGFyZ3NbNF07Ci0JaWYgKG5vZGUgPT0gLTEpCisJaWYgKChzMzIpbm9kZSA9PSAtMSkKIAkJcmV0dXJuIDA7CiAJcmV0dXJuIG5vZGU7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9hY3BpLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9hY3BpLmgKaW5kZXggNTVkMTA2Yi4uMjExY2EzZiAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vYWNwaS5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2FjcGkuaApAQCAtMTg1LDE3ICsxODUsMTYgQEAKIAogI2lmZGVmIENPTkZJR19BQ1BJX05VTUEKIGV4dGVybiBpbnQgYWNwaV9udW1hOwotZXh0ZXJuIGludCBhY3BpX2dldF9ub2RlcyhzdHJ1Y3QgYm9vdG5vZGUgKnBoeXNub2Rlcyk7CitleHRlcm4gdm9pZCBhY3BpX2dldF9ub2RlcyhzdHJ1Y3QgYm9vdG5vZGUgKnBoeXNub2RlcywgdW5zaWduZWQgbG9uZyBzdGFydCwKKwkJCQl1bnNpZ25lZCBsb25nIGVuZCk7CiBleHRlcm4gaW50IGFjcGlfc2Nhbl9ub2Rlcyh1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCk7CiAjZGVmaW5lIE5SX05PREVfTUVNQkxLUyAoTUFYX05VTU5PREVTKjIpCisKKyNpZmRlZiBDT05GSUdfTlVNQV9FTVUKIGV4dGVybiB2b2lkIGFjcGlfZmFrZV9ub2Rlcyhjb25zdCBzdHJ1Y3QgYm9vdG5vZGUgKmZha2Vfbm9kZXMsCiAJCQkJICAgaW50IG51bV9ub2Rlcyk7Ci0jZWxzZQotc3RhdGljIGlubGluZSB2b2lkIGFjcGlfZmFrZV9ub2Rlcyhjb25zdCBzdHJ1Y3QgYm9vdG5vZGUgKmZha2Vfbm9kZXMsCi0JCQkJICAgaW50IG51bV9ub2RlcykKLXsKLX0KICNlbmRpZgorI2VuZGlmIC8qIENPTkZJR19BQ1BJX05VTUEgKi8KIAogI2RlZmluZSBhY3BpX3VubGF6eV90bGIoeCkJbGVhdmVfbW0oeCkKIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vYW1kX25iLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9hbWRfbmIuaAppbmRleCA2YWVlNTBkLi42NGRjODJlIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9hbWRfbmIuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9hbWRfbmIuaApAQCAtMywxNiArMywyNyBAQAogCiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAKK3N0cnVjdCBhbWRfbmJfYnVzX2Rldl9yYW5nZSB7CisJdTggYnVzOworCXU4IGRldl9iYXNlOworCXU4IGRldl9saW1pdDsKK307CisKIGV4dGVybiBzdHJ1Y3QgcGNpX2RldmljZV9pZCBhbWRfbmJfbWlzY19pZHNbXTsKK2V4dGVybiBjb25zdCBzdHJ1Y3QgYW1kX25iX2J1c19kZXZfcmFuZ2UgYW1kX25iX2J1c19kZXZfcmFuZ2VzW107CiBzdHJ1Y3QgYm9vdG5vZGU7CiAKIGV4dGVybiBpbnQgZWFybHlfaXNfYW1kX25iKHUzMiB2YWx1ZSk7CiBleHRlcm4gaW50IGFtZF9jYWNoZV9ub3J0aGJyaWRnZXModm9pZCk7CiBleHRlcm4gdm9pZCBhbWRfZmx1c2hfZ2FydHModm9pZCk7Ci1leHRlcm4gaW50IGFtZF9nZXRfbm9kZXMoc3RydWN0IGJvb3Rub2RlICpub2Rlcyk7CiBleHRlcm4gaW50IGFtZF9udW1hX2luaXQodW5zaWduZWQgbG9uZyBzdGFydF9wZm4sIHVuc2lnbmVkIGxvbmcgZW5kX3Bmbik7CiBleHRlcm4gaW50IGFtZF9zY2FuX25vZGVzKHZvaWQpOwogCisjaWZkZWYgQ09ORklHX05VTUFfRU1VCitleHRlcm4gdm9pZCBhbWRfZmFrZV9ub2Rlcyhjb25zdCBzdHJ1Y3QgYm9vdG5vZGUgKm5vZGVzLCBpbnQgbnJfbm9kZXMpOworZXh0ZXJuIHZvaWQgYW1kX2dldF9ub2RlcyhzdHJ1Y3QgYm9vdG5vZGUgKm5vZGVzKTsKKyNlbmRpZgorCiBzdHJ1Y3QgYW1kX25vcnRoYnJpZGdlIHsKIAlzdHJ1Y3QgcGNpX2RldiAqbWlzYzsKIH07CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9maXhtYXAuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2ZpeG1hcC5oCmluZGV4IDAxNDFiMjMuLjQ3MjliMmIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2ZpeG1hcC5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2ZpeG1hcC5oCkBAIC0xMTYsMTEgKzExNiwxMSBAQAogI2VuZGlmCiAJRklYX1RFWFRfUE9LRTEsCS8qIHJlc2VydmUgMiBwYWdlcyBmb3IgdGV4dF9wb2tlKCkgKi8KIAlGSVhfVEVYVF9QT0tFMCwgLyogZmlyc3QgcGFnZSBpcyBsYXN0LCBiZWNhdXNlIGFsbG9jYXRpb24gaXMgYmFja3dhcmQgKi8KLQlfX2VuZF9vZl9wZXJtYW5lbnRfZml4ZWRfYWRkcmVzc2VzLAotCiAjaWZkZWYJQ09ORklHX1g4Nl9NUlNUCiAJRklYX0xOV19WUlRDLAogI2VuZGlmCisJX19lbmRfb2ZfcGVybWFuZW50X2ZpeGVkX2FkZHJlc3NlcywKKwogCS8qCiAJICogMjU2IHRlbXBvcmFyeSBib290LXRpbWUgbWFwcGluZ3MsIHVzZWQgYnkgZWFybHlfaW9yZW1hcCgpLAogCSAqIGJlZm9yZSBpb3JlbWFwKCkgaXMgZnVuY3Rpb25hbC4KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2dwaW8uaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2dwaW8uaAppbmRleCA0OWRiZmRmLi45MWQ5MTVhIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9ncGlvLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vZ3Bpby5oCkBAIC0zOCwxMiArMzgsOSBAQAogCXJldHVybiBfX2dwaW9fY2Fuc2xlZXAoZ3Bpbyk7CiB9CiAKLS8qCi0gKiBOb3QgaW1wbGVtZW50ZWQsIHlldC4KLSAqLwogc3RhdGljIGlubGluZSBpbnQgZ3Bpb190b19pcnEodW5zaWduZWQgaW50IGdwaW8pCiB7Ci0JcmV0dXJuIC1FTk9TWVM7CisJcmV0dXJuIF9fZ3Bpb190b19pcnEoZ3Bpbyk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IGlycV90b19ncGlvKHVuc2lnbmVkIGludCBpcnEpCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9oeXBlcnZpc29yLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9oeXBlcnZpc29yLmgKaW5kZXggZmYyNTQ2Yy4uN2ExNTE1MyAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vaHlwZXJ2aXNvci5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2h5cGVydmlzb3IuaApAQCAtMjAsNiArMjAsOSBAQAogI2lmbmRlZiBfQVNNX1g4Nl9IWVBFUlZJU09SX0gKICNkZWZpbmUgX0FTTV9YODZfSFlQRVJWSVNPUl9ICiAKKyNpbmNsdWRlIDxhc20va3ZtX3BhcmEuaD4KKyNpbmNsdWRlIDxhc20veGVuL2h5cGVydmlzb3IuaD4KKwogZXh0ZXJuIHZvaWQgaW5pdF9oeXBlcnZpc29yKHN0cnVjdCBjcHVpbmZvX3g4NiAqYyk7CiBleHRlcm4gdm9pZCBpbml0X2h5cGVydmlzb3JfcGxhdGZvcm0odm9pZCk7CiAKQEAgLTQ3LDQgKzUwLDEzIEBACiBleHRlcm4gY29uc3Qgc3RydWN0IGh5cGVydmlzb3JfeDg2IHg4Nl9oeXBlcl9tc19oeXBlcnY7CiBleHRlcm4gY29uc3Qgc3RydWN0IGh5cGVydmlzb3JfeDg2IHg4Nl9oeXBlcl94ZW5faHZtOwogCitzdGF0aWMgaW5saW5lIGJvb2wgaHlwZXJ2aXNvcl94MmFwaWNfYXZhaWxhYmxlKHZvaWQpCit7CisJaWYgKGt2bV9wYXJhX2F2YWlsYWJsZSgpKQorCQlyZXR1cm4gdHJ1ZTsKKwlpZiAoeGVuX3gyYXBpY19wYXJhX2F2YWlsYWJsZSgpKQorCQlyZXR1cm4gdHJ1ZTsKKwlyZXR1cm4gZmFsc2U7Cit9CisKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20va2RlYnVnLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9rZGVidWcuaAppbmRleCBmMjNlYjI1Li5jYTI0MmQzIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9rZGVidWcuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9rZGVidWcuaApAQCAtMTgsNyArMTgsNiBAQAogCURJRV9UUkFQLAogCURJRV9HUEYsCiAJRElFX0NBTEwsCi0JRElFX05NSV9JUEksCiAJRElFX1BBR0VfRkFVTFQsCiAJRElFX05NSVVOS05PV04sCiB9OwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vbWFjaF90cmFwcy5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vbWFjaF90cmFwcy5oCmluZGV4IGY3OTIwNjAuLjcyYThiNTIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL21hY2hfdHJhcHMuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9tYWNoX3RyYXBzLmgKQEAgLTcsOSArNywxOSBAQAogCiAjaW5jbHVkZSA8YXNtL21jMTQ2ODE4cnRjLmg+CiAKKyNkZWZpbmUgTk1JX1JFQVNPTl9QT1JUCQkweDYxCisKKyNkZWZpbmUgTk1JX1JFQVNPTl9TRVJSCQkweDgwCisjZGVmaW5lIE5NSV9SRUFTT05fSU9DSEsJMHg0MAorI2RlZmluZSBOTUlfUkVBU09OX01BU0sJCShOTUlfUkVBU09OX1NFUlIgfCBOTUlfUkVBU09OX0lPQ0hLKQorCisjZGVmaW5lIE5NSV9SRUFTT05fQ0xFQVJfU0VSUgkweDA0CisjZGVmaW5lIE5NSV9SRUFTT05fQ0xFQVJfSU9DSEsJMHgwOAorI2RlZmluZSBOTUlfUkVBU09OX0NMRUFSX01BU0sJMHgwZgorCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGNoYXIgZ2V0X25taV9yZWFzb24odm9pZCkKIHsKLQlyZXR1cm4gaW5iKDB4NjEpOworCXJldHVybiBpbmIoTk1JX1JFQVNPTl9QT1JUKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIHJlYXNzZXJ0X25taSh2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vbm1pLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9ubWkuaAppbmRleCBjNDAyMWI5Li5jNzZmNWI5IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9ubWkuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9ubWkuaApAQCAtMjMsNiArMjMsMjYgQEAKICNkZWZpbmUgYXJjaF90cmlnZ2VyX2FsbF9jcHVfYmFja3RyYWNlIGFyY2hfdHJpZ2dlcl9hbGxfY3B1X2JhY2t0cmFjZQogI2VuZGlmCiAKKy8qCisgKiBEZWZpbmUgc29tZSBwcmlvcml0aWVzIGZvciB0aGUgbm1pIG5vdGlmaWVyIGNhbGwgY2hhaW4uCisgKgorICogQ3JlYXRlIGEgbG9jYWwgbm1pIGJpdCB0aGF0IGhhcyBhIGhpZ2hlciBwcmlvcml0eSB0aGFuCisgKiBleHRlcm5hbCBubWlzLCBiZWNhdXNlIHRoZSBsb2NhbCBvbmVzIGFyZSBtb3JlIGZyZXF1ZW50LgorICoKKyAqIEFsc28gc2V0dXAgc29tZSBkZWZhdWx0IGhpZ2gvbm9ybWFsL2xvdyBzZXR0aW5ncyBmb3IKKyAqIHN1YnN5c3RlbXMgdG8gcmVnaXN0ZXJzIHdpdGguICBVc2luZyA0IGJpdHMgdG8gc2VwZXJhdGUKKyAqIHRoZSBwcmlvcml0aWVzLiAgVGhpcyBjYW4gZ28gYWxvdCBoaWdoZXIgaWYgbmVlZGVkIGJlLgorICovCisKKyNkZWZpbmUgTk1JX0xPQ0FMX1NISUZUCQkxNgkvKiByYW5kb21seSBwaWNrZWQgKi8KKyNkZWZpbmUgTk1JX0xPQ0FMX0JJVAkJKDFVTEwgPDwgTk1JX0xPQ0FMX1NISUZUKQorI2RlZmluZSBOTUlfSElHSF9QUklPUgkJKDFVTEwgPDwgOCkKKyNkZWZpbmUgTk1JX05PUk1BTF9QUklPUgkoMVVMTCA8PCA0KQorI2RlZmluZSBOTUlfTE9XX1BSSU9SCQkoMVVMTCA8PCAwKQorI2RlZmluZSBOTUlfTE9DQUxfSElHSF9QUklPUgkoTk1JX0xPQ0FMX0JJVCB8IE5NSV9ISUdIX1BSSU9SKQorI2RlZmluZSBOTUlfTE9DQUxfTk9STUFMX1BSSU9SCShOTUlfTE9DQUxfQklUIHwgTk1JX05PUk1BTF9QUklPUikKKyNkZWZpbmUgTk1JX0xPQ0FMX0xPV19QUklPUgkoTk1JX0xPQ0FMX0JJVCB8IE5NSV9MT1dfUFJJT1IpCisKIHZvaWQgc3RvcF9ubWkodm9pZCk7CiB2b2lkIHJlc3RhcnRfbm1pKHZvaWQpOwogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9udW1hXzY0LmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9udW1hXzY0LmgKaW5kZXggODIzZTA3MC4uNWFlODcyOCAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vbnVtYV82NC5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL251bWFfNjQuaApAQCAtMzgsNyArMzgsNyBAQAogZXh0ZXJuIHZvaWQgX19jcHVpbml0IG51bWFfcmVtb3ZlX2NwdShpbnQgY3B1KTsKIAogI2lmZGVmIENPTkZJR19OVU1BX0VNVQotI2RlZmluZSBGQUtFX05PREVfTUlOX1NJWkUJKCh1NjQpNjQgPDwgMjApCisjZGVmaW5lIEZBS0VfTk9ERV9NSU5fU0laRQkoKHU2NCkzMiA8PCAyMCkKICNkZWZpbmUgRkFLRV9OT0RFX01JTl9IQVNIX01BU0sJKH4oRkFLRV9OT0RFX01JTl9TSVpFIC0gMVVMKSkKICNlbmRpZiAvKiBDT05GSUdfTlVNQV9FTVUgKi8KICNlbHNlCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wZXJmX2V2ZW50X3A0LmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wZXJmX2V2ZW50X3A0LmgKaW5kZXggMjk1ZTJmZi4uZTJmNmE5OSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vcGVyZl9ldmVudF9wNC5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3BlcmZfZXZlbnRfcDQuaApAQCAtMjAsNiArMjAsOSBAQAogI2RlZmluZSBBUkNIX1A0X01BWF9FU0NSCShBUkNIX1A0X1RPVEFMX0VTQ1IgLSBBUkNIX1A0X1JFU0VSVkVEX0VTQ1IpCiAjZGVmaW5lIEFSQ0hfUDRfTUFYX0NDQ1IJKDE4KQogCisjZGVmaW5lIEFSQ0hfUDRfQ05UUlZBTF9CSVRTCSg0MCkKKyNkZWZpbmUgQVJDSF9QNF9DTlRSVkFMX01BU0sJKCgxVUxMIDw8IEFSQ0hfUDRfQ05UUlZBTF9CSVRTKSAtIDEpCisKICNkZWZpbmUgUDRfRVNDUl9FVkVOVF9NQVNLCTB4N2UwMDAwMDBVCiAjZGVmaW5lIFA0X0VTQ1JfRVZFTlRfU0hJRlQJMjUKICNkZWZpbmUgUDRfRVNDUl9FVkVOVE1BU0tfTUFTSwkweDAxZmZmZTAwVQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20veGVuL2h5cGVydmlzb3IuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3hlbi9oeXBlcnZpc29yLmgKaW5kZXggMzk2ZmY0Yy4uNjZkMGZmZiAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20veGVuL2h5cGVydmlzb3IuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS94ZW4vaHlwZXJ2aXNvci5oCkBAIC0zNyw0ICszNywzOSBAQAogZXh0ZXJuIHN0cnVjdCBzaGFyZWRfaW5mbyAqSFlQRVJWSVNPUl9zaGFyZWRfaW5mbzsKIGV4dGVybiBzdHJ1Y3Qgc3RhcnRfaW5mbyAqeGVuX3N0YXJ0X2luZm87CiAKKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgeGVuX2NwdWlkX2Jhc2Uodm9pZCkKK3sKKwl1aW50MzJfdCBiYXNlLCBlYXgsIGVieCwgZWN4LCBlZHg7CisJY2hhciBzaWduYXR1cmVbMTNdOworCisJZm9yIChiYXNlID0gMHg0MDAwMDAwMDsgYmFzZSA8IDB4NDAwMTAwMDA7IGJhc2UgKz0gMHgxMDApIHsKKwkJY3B1aWQoYmFzZSwgJmVheCwgJmVieCwgJmVjeCwgJmVkeCk7CisJCSoodWludDMyX3QgKikoc2lnbmF0dXJlICsgMCkgPSBlYng7CisJCSoodWludDMyX3QgKikoc2lnbmF0dXJlICsgNCkgPSBlY3g7CisJCSoodWludDMyX3QgKikoc2lnbmF0dXJlICsgOCkgPSBlZHg7CisJCXNpZ25hdHVyZVsxMl0gPSAwOworCisJCWlmICghc3RyY21wKCJYZW5WTU1YZW5WTU0iLCBzaWduYXR1cmUpICYmICgoZWF4IC0gYmFzZSkgPj0gMikpCisJCQlyZXR1cm4gYmFzZTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIENPTkZJR19YRU4KK2V4dGVybiBib29sIHhlbl9odm1fbmVlZF9sYXBpYyh2b2lkKTsKKworc3RhdGljIGlubGluZSBib29sIHhlbl94MmFwaWNfcGFyYV9hdmFpbGFibGUodm9pZCkKK3sKKwlyZXR1cm4geGVuX2h2bV9uZWVkX2xhcGljKCk7Cit9CisjZWxzZQorc3RhdGljIGlubGluZSBib29sIHhlbl94MmFwaWNfcGFyYV9hdmFpbGFibGUodm9pZCkKK3sKKwlyZXR1cm4gKHhlbl9jcHVpZF9iYXNlKCkgIT0gMCk7Cit9CisjZW5kaWYKKwogI2VuZGlmIC8qIF9BU01fWDg2X1hFTl9IWVBFUlZJU09SX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9hbWRfbmIuYyBiL2FyY2gveDg2L2tlcm5lbC9hbWRfbmIuYwppbmRleCBhZmZhY2I1Li4wYTk5ZjcxIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvYW1kX25iLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2FtZF9uYi5jCkBAIC0yMCw2ICsyMCwxMyBAQAogfTsKIEVYUE9SVF9TWU1CT0woYW1kX25iX21pc2NfaWRzKTsKIAorY29uc3Qgc3RydWN0IGFtZF9uYl9idXNfZGV2X3JhbmdlIGFtZF9uYl9idXNfZGV2X3Jhbmdlc1tdIF9faW5pdGNvbnN0ID0geworCXsgMHgwMCwgMHgxOCwgMHgyMCB9LAorCXsgMHhmZiwgMHgwMCwgMHgyMCB9LAorCXsgMHhmZSwgMHgwMCwgMHgyMCB9LAorCXsgfQorfTsKKwogc3RydWN0IGFtZF9ub3J0aGJyaWRnZV9pbmZvIGFtZF9ub3J0aGJyaWRnZXM7CiBFWFBPUlRfU1lNQk9MKGFtZF9ub3J0aGJyaWRnZXMpOwogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvYXBlcnR1cmVfNjQuYyBiL2FyY2gveDg2L2tlcm5lbC9hcGVydHVyZV82NC5jCmluZGV4IGRjZDdjODMuLjU5NTVhNzggMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9hcGVydHVyZV82NC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9hcGVydHVyZV82NC5jCkBAIC0zOSwxOCArMzksNiBAQAogCiBpbnQgZml4X2FwZXJ0dXJlIF9faW5pdGRhdGEgPSAxOwogCi1zdHJ1Y3QgYnVzX2Rldl9yYW5nZSB7Ci0JaW50IGJ1czsKLQlpbnQgZGV2X2Jhc2U7Ci0JaW50IGRldl9saW1pdDsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYnVzX2Rldl9yYW5nZSBidXNfZGV2X3Jhbmdlc1tdIF9faW5pdGRhdGEgPSB7Ci0JeyAweDAwLCAweDE4LCAweDIwfSwKLQl7IDB4ZmYsIDB4MDAsIDB4MjB9LAotCXsgMHhmZSwgMHgwMCwgMHgyMH0KLX07Ci0KIHN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgZ2FydF9yZXNvdXJjZSA9IHsKIAkubmFtZQk9ICJHQVJUIiwKIAkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKQEAgLTI5NCwxMyArMjgyLDEzIEBACiAJc2VhcmNoX2FncF9icmlkZ2UoJmFncF9hcGVyX29yZGVyLCAmdmFsaWRfYWdwKTsKIAogCWZpeCA9IDA7Ci0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoYnVzX2Rldl9yYW5nZXMpOyBpKyspIHsKKwlmb3IgKGkgPSAwOyBhbWRfbmJfYnVzX2Rldl9yYW5nZXNbaV0uZGV2X2xpbWl0OyBpKyspIHsKIAkJaW50IGJ1czsKIAkJaW50IGRldl9iYXNlLCBkZXZfbGltaXQ7CiAKLQkJYnVzID0gYnVzX2Rldl9yYW5nZXNbaV0uYnVzOwotCQlkZXZfYmFzZSA9IGJ1c19kZXZfcmFuZ2VzW2ldLmRldl9iYXNlOwotCQlkZXZfbGltaXQgPSBidXNfZGV2X3Jhbmdlc1tpXS5kZXZfbGltaXQ7CisJCWJ1cyA9IGFtZF9uYl9idXNfZGV2X3Jhbmdlc1tpXS5idXM7CisJCWRldl9iYXNlID0gYW1kX25iX2J1c19kZXZfcmFuZ2VzW2ldLmRldl9iYXNlOworCQlkZXZfbGltaXQgPSBhbWRfbmJfYnVzX2Rldl9yYW5nZXNbaV0uZGV2X2xpbWl0OwogCiAJCWZvciAoc2xvdCA9IGRldl9iYXNlOyBzbG90IDwgZGV2X2xpbWl0OyBzbG90KyspIHsKIAkJCWlmICghZWFybHlfaXNfYW1kX25iKHJlYWRfcGNpX2NvbmZpZyhidXMsIHNsb3QsIDMsIDB4MDApKSkKQEAgLTM0OSwxMyArMzM3LDEzIEBACiAJCXJldHVybjsKIAogCS8qIGRpc2FibGUgdGhlbSBhbGwgYXQgZmlyc3QgKi8KLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShidXNfZGV2X3Jhbmdlcyk7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBhbWRfbmJfYnVzX2Rldl9yYW5nZXNbaV0uZGV2X2xpbWl0OyBpKyspIHsKIAkJaW50IGJ1czsKIAkJaW50IGRldl9iYXNlLCBkZXZfbGltaXQ7CiAKLQkJYnVzID0gYnVzX2Rldl9yYW5nZXNbaV0uYnVzOwotCQlkZXZfYmFzZSA9IGJ1c19kZXZfcmFuZ2VzW2ldLmRldl9iYXNlOwotCQlkZXZfbGltaXQgPSBidXNfZGV2X3Jhbmdlc1tpXS5kZXZfbGltaXQ7CisJCWJ1cyA9IGFtZF9uYl9idXNfZGV2X3Jhbmdlc1tpXS5idXM7CisJCWRldl9iYXNlID0gYW1kX25iX2J1c19kZXZfcmFuZ2VzW2ldLmRldl9iYXNlOworCQlkZXZfbGltaXQgPSBhbWRfbmJfYnVzX2Rldl9yYW5nZXNbaV0uZGV2X2xpbWl0OwogCiAJCWZvciAoc2xvdCA9IGRldl9iYXNlOyBzbG90IDwgZGV2X2xpbWl0OyBzbG90KyspIHsKIAkJCWlmICghZWFybHlfaXNfYW1kX25iKHJlYWRfcGNpX2NvbmZpZyhidXMsIHNsb3QsIDMsIDB4MDApKSkKQEAgLTM5MCwxNCArMzc4LDE0IEBACiAKIAlmaXggPSAwOwogCW5vZGUgPSAwOwotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGJ1c19kZXZfcmFuZ2VzKTsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IGFtZF9uYl9idXNfZGV2X3Jhbmdlc1tpXS5kZXZfbGltaXQ7IGkrKykgewogCQlpbnQgYnVzOwogCQlpbnQgZGV2X2Jhc2UsIGRldl9saW1pdDsKIAkJdTMyIGN0bDsKIAotCQlidXMgPSBidXNfZGV2X3Jhbmdlc1tpXS5idXM7Ci0JCWRldl9iYXNlID0gYnVzX2Rldl9yYW5nZXNbaV0uZGV2X2Jhc2U7Ci0JCWRldl9saW1pdCA9IGJ1c19kZXZfcmFuZ2VzW2ldLmRldl9saW1pdDsKKwkJYnVzID0gYW1kX25iX2J1c19kZXZfcmFuZ2VzW2ldLmJ1czsKKwkJZGV2X2Jhc2UgPSBhbWRfbmJfYnVzX2Rldl9yYW5nZXNbaV0uZGV2X2Jhc2U7CisJCWRldl9saW1pdCA9IGFtZF9uYl9idXNfZGV2X3Jhbmdlc1tpXS5kZXZfbGltaXQ7CiAKIAkJZm9yIChzbG90ID0gZGV2X2Jhc2U7IHNsb3QgPCBkZXZfbGltaXQ7IHNsb3QrKykgewogCQkJaWYgKCFlYXJseV9pc19hbWRfbmIocmVhZF9wY2lfY29uZmlnKGJ1cywgc2xvdCwgMywgMHgwMCkpKQpAQCAtNTA1LDcgKzQ5Myw3IEBACiAJfQogCiAJLyogRml4IHVwIHRoZSBub3J0aCBicmlkZ2VzICovCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoYnVzX2Rldl9yYW5nZXMpOyBpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgYW1kX25iX2J1c19kZXZfcmFuZ2VzW2ldLmRldl9saW1pdDsgaSsrKSB7CiAJCWludCBidXMsIGRldl9iYXNlLCBkZXZfbGltaXQ7CiAKIAkJLyoKQEAgLTUxNCw5ICs1MDIsOSBAQAogCQkgKi8KIAkJdTMyIGN0bCA9IERJU1RMQldBTEtQUkIgfCBhcGVyX29yZGVyIDw8IDE7CiAKLQkJYnVzID0gYnVzX2Rldl9yYW5nZXNbaV0uYnVzOwotCQlkZXZfYmFzZSA9IGJ1c19kZXZfcmFuZ2VzW2ldLmRldl9iYXNlOwotCQlkZXZfbGltaXQgPSBidXNfZGV2X3Jhbmdlc1tpXS5kZXZfbGltaXQ7CisJCWJ1cyA9IGFtZF9uYl9idXNfZGV2X3Jhbmdlc1tpXS5idXM7CisJCWRldl9iYXNlID0gYW1kX25iX2J1c19kZXZfcmFuZ2VzW2ldLmRldl9iYXNlOworCQlkZXZfbGltaXQgPSBhbWRfbmJfYnVzX2Rldl9yYW5nZXNbaV0uZGV2X2xpbWl0OwogCQlmb3IgKHNsb3QgPSBkZXZfYmFzZTsgc2xvdCA8IGRldl9saW1pdDsgc2xvdCsrKSB7CiAJCQlpZiAoIWVhcmx5X2lzX2FtZF9uYihyZWFkX3BjaV9jb25maWcoYnVzLCBzbG90LCAzLCAweDAwKSkpCiAJCQkJY29udGludWU7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvYXBpYy9hcGljLmMgYi9hcmNoL3g4Ni9rZXJuZWwvYXBpYy9hcGljLmMKaW5kZXggNzllNmJhYS4uMDZjMTk2ZCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2FwaWMvYXBpYy5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9hcGljL2FwaWMuYwpAQCAtNDksOCArNDksOCBAQAogI2luY2x1ZGUgPGFzbS9tdHJyLmg+CiAjaW5jbHVkZSA8YXNtL3NtcC5oPgogI2luY2x1ZGUgPGFzbS9tY2UuaD4KLSNpbmNsdWRlIDxhc20va3ZtX3BhcmEuaD4KICNpbmNsdWRlIDxhc20vdHNjLmg+CisjaW5jbHVkZSA8YXNtL2h5cGVydmlzb3IuaD4KIAogdW5zaWduZWQgaW50IG51bV9wcm9jZXNzb3JzOwogCkBAIC02ODQsNyArNjg0LDcgQEAKIAlsYXBpY19jbG9ja2V2ZW50Lm11bHQgPSBkaXZfc2MoZGVsdGEsIFRJQ0tfTlNFQyAqIExBUElDX0NBTF9MT09QUywKIAkJCQkgICAgICAgbGFwaWNfY2xvY2tldmVudC5zaGlmdCk7CiAJbGFwaWNfY2xvY2tldmVudC5tYXhfZGVsdGFfbnMgPQotCQljbG9ja2V2ZW50X2RlbHRhMm5zKDB4N0ZGRkZGLCAmbGFwaWNfY2xvY2tldmVudCk7CisJCWNsb2NrZXZlbnRfZGVsdGEybnMoMHg3RkZGRkZGRiwgJmxhcGljX2Nsb2NrZXZlbnQpOwogCWxhcGljX2Nsb2NrZXZlbnQubWluX2RlbHRhX25zID0KIAkJY2xvY2tldmVudF9kZWx0YTJucygweEYsICZsYXBpY19jbG9ja2V2ZW50KTsKIApAQCAtMTQ3Niw3ICsxNDc2LDggQEAKIAkJLyogSVIgaXMgcmVxdWlyZWQgaWYgdGhlcmUgaXMgQVBJQyBJRCA+IDI1NSBldmVuIHdoZW4gcnVubmluZwogCQkgKiB1bmRlciBLVk0KIAkJICovCi0JCWlmIChtYXhfcGh5c2ljYWxfYXBpY2lkID4gMjU1IHx8ICFrdm1fcGFyYV9hdmFpbGFibGUoKSkKKwkJaWYgKG1heF9waHlzaWNhbF9hcGljaWQgPiAyNTUgfHwKKwkJICAgICFoeXBlcnZpc29yX3gyYXBpY19hdmFpbGFibGUoKSkKIAkJCWdvdG8gbm94MmFwaWM7CiAJCS8qCiAJCSAqIHdpdGhvdXQgSVIgYWxsIENQVXMgY2FuIGJlIGFkZHJlc3NlZCBieSBJT0FQSUMvTVNJCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvYXBpYy9od19ubWkuYyBiL2FyY2gveDg2L2tlcm5lbC9hcGljL2h3X25taS5jCmluZGV4IDcyZWMyOWUuLjc5ZmQ0M2MgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9hcGljL2h3X25taS5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9hcGljL2h3X25taS5jCkBAIC02OCw3ICs2OCw2IEBACiAKIAlzd2l0Y2ggKGNtZCkgewogCWNhc2UgRElFX05NSToKLQljYXNlIERJRV9OTUlfSVBJOgogCQlicmVhazsKIAogCWRlZmF1bHQ6CkBAIC05Niw3ICs5NSw3IEBACiBzdGF0aWMgX19yZWFkX21vc3RseSBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgYmFja3RyYWNlX25vdGlmaWVyID0gewogCS5ub3RpZmllcl9jYWxsICAgICAgICAgID0gYXJjaF90cmlnZ2VyX2FsbF9jcHVfYmFja3RyYWNlX2hhbmRsZXIsCiAJLm5leHQgICAgICAgICAgICAgICAgICAgPSBOVUxMLAotCS5wcmlvcml0eSAgICAgICAgICAgICAgID0gMQorCS5wcmlvcml0eSAgICAgICAgICAgICAgID0gTk1JX0xPQ0FMX0xPV19QUklPUiwKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IHJlZ2lzdGVyX3RyaWdnZXJfYWxsX2NwdV9iYWNrdHJhY2Uodm9pZCkKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9hcGljL3gyYXBpY191dl94LmMgYi9hcmNoL3g4Ni9rZXJuZWwvYXBpYy94MmFwaWNfdXZfeC5jCmluZGV4IGVjY2E1ZjQuLmJkMTZiNTggMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9hcGljL3gyYXBpY191dl94LmMKKysrIGIvYXJjaC94ODYva2VybmVsL2FwaWMveDJhcGljX3V2X3guYwpAQCAtMzc4LDcgKzM3OCw3IEBACiAKIHN0YXRpYyBfX2NwdWluaXQgdm9pZCBzZXRfeDJhcGljX2V4dHJhX2JpdHMoaW50IHBub2RlKQogewotCV9fdGhpc19jcHVfd3JpdGUoeDJhcGljX2V4dHJhX2JpdHMsIChwbm9kZSA8PCA2KSk7CisJX190aGlzX2NwdV93cml0ZSh4MmFwaWNfZXh0cmFfYml0cywgcG5vZGUgPDwgdXZoX2FwaWNpZC5zLnBub2RlX3NoaWZ0KTsKIH0KIAogLyoKQEAgLTY0MSw3ICs2NDEsNyBAQAogICovCiBpbnQgdXZfaGFuZGxlX25taShzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnNlbGYsIHVuc2lnbmVkIGxvbmcgcmVhc29uLCB2b2lkICpkYXRhKQogewotCWlmIChyZWFzb24gIT0gRElFX05NSV9JUEkpCisJaWYgKHJlYXNvbiAhPSBESUVfTk1JVU5LTk9XTikKIAkJcmV0dXJuIE5PVElGWV9PSzsKIAogCWlmIChpbl9jcmFzaF9rZXhlYykKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9jcHUvbWNoZWNrL21jZS1pbmplY3QuYyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvbWNoZWNrL21jZS1pbmplY3QuYwppbmRleCBlN2RiZGU3Li5hNzc5NzE5IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L21jaGVjay9tY2UtaW5qZWN0LmMKKysrIGIvYXJjaC94ODYva2VybmVsL2NwdS9tY2hlY2svbWNlLWluamVjdC5jCkBAIC0yNSw2ICsyNSw3IEBACiAjaW5jbHVkZSA8bGludXgvZ2ZwLmg+CiAjaW5jbHVkZSA8YXNtL21jZS5oPgogI2luY2x1ZGUgPGFzbS9hcGljLmg+CisjaW5jbHVkZSA8YXNtL25taS5oPgogCiAvKiBVcGRhdGUgZmFrZSBtY2UgcmVnaXN0ZXJzIG9uIGN1cnJlbnQgQ1BVLiAqLwogc3RhdGljIHZvaWQgaW5qZWN0X21jZShzdHJ1Y3QgbWNlICptKQpAQCAtODMsNyArODQsNyBAQAogCXN0cnVjdCBkaWVfYXJncyAqYXJncyA9IChzdHJ1Y3QgZGllX2FyZ3MgKilkYXRhOwogCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CiAJc3RydWN0IG1jZSAqbSA9ICZfX2dldF9jcHVfdmFyKGluamVjdG0pOwotCWlmICh2YWwgIT0gRElFX05NSV9JUEkgfHwgIWNwdW1hc2tfdGVzdF9jcHUoY3B1LCBtY2VfaW5qZWN0X2NwdW1hc2spKQorCWlmICh2YWwgIT0gRElFX05NSSB8fCAhY3B1bWFza190ZXN0X2NwdShjcHUsIG1jZV9pbmplY3RfY3B1bWFzaykpCiAJCXJldHVybiBOT1RJRllfRE9ORTsKIAljcHVtYXNrX2NsZWFyX2NwdShjcHUsIG1jZV9pbmplY3RfY3B1bWFzayk7CiAJaWYgKG0tPmluamVjdF9mbGFncyAmIE1DSl9FWENFUFRJT04pCkBAIC05NSw3ICs5Niw3IEBACiAKIHN0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgbWNlX3JhaXNlX25iID0gewogCS5ub3RpZmllcl9jYWxsID0gbWNlX3JhaXNlX25vdGlmeSwKLQkucHJpb3JpdHkgPSAxMDAwLAorCS5wcmlvcml0eSA9IE5NSV9MT0NBTF9OT1JNQUxfUFJJT1IsCiB9OwogCiAvKiBJbmplY3QgbWNlIG9uIGN1cnJlbnQgQ1BVICovCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L3BlcmZfZXZlbnQuYyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvcGVyZl9ldmVudC5jCmluZGV4IDA0OTIxMDEuLjlkOTc3YTIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9jcHUvcGVyZl9ldmVudC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvcGVyZl9ldmVudC5jCkBAIC0xMjY3LDcgKzEyNjcsNiBAQAogCiAJc3dpdGNoIChjbWQpIHsKIAljYXNlIERJRV9OTUk6Ci0JY2FzZSBESUVfTk1JX0lQSToKIAkJYnJlYWs7CiAJY2FzZSBESUVfTk1JVU5LTk9XTjoKIAkJdGhpc19ubWkgPSBwZXJjcHVfcmVhZChpcnFfc3RhdC5fX25taV9jb3VudCk7CkBAIC0xMzE3LDcgKzEzMTYsNyBAQAogc3RhdGljIF9fcmVhZF9tb3N0bHkgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIHBlcmZfZXZlbnRfbm1pX25vdGlmaWVyID0gewogCS5ub3RpZmllcl9jYWxsCQk9IHBlcmZfZXZlbnRfbm1pX2hhbmRsZXIsCiAJLm5leHQJCQk9IE5VTEwsCi0JLnByaW9yaXR5CQk9IDEKKwkucHJpb3JpdHkJCT0gTk1JX0xPQ0FMX0xPV19QUklPUiwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgZXZlbnRfY29uc3RyYWludCB1bmNvbnN0cmFpbmVkOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2NwdS9wZXJmX2V2ZW50X3A0LmMgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L3BlcmZfZXZlbnRfcDQuYwppbmRleCA4MTQwMGI5Li5lNTZiOWJmIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L3BlcmZfZXZlbnRfcDQuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L3BlcmZfZXZlbnRfcDQuYwpAQCAtNzUzLDE5ICs3NTMsMjEgQEAKIAogc3RhdGljIGlubGluZSBpbnQgcDRfcG11X2NsZWFyX2NjY3Jfb3ZmKHN0cnVjdCBod19wZXJmX2V2ZW50ICpod2MpCiB7Ci0JaW50IG92ZXJmbG93ID0gMDsKLQl1MzIgbG93LCBoaWdoOworCXU2NCB2OwogCi0JcmRtc3IoaHdjLT5jb25maWdfYmFzZSArIGh3Yy0+aWR4LCBsb3csIGhpZ2gpOwotCi0JLyogd2UgbmVlZCB0byBjaGVjayBoaWdoIGJpdCBmb3IgdW5mbGFnZ2VkIG92ZXJmbG93cyAqLwotCWlmICgobG93ICYgUDRfQ0NDUl9PVkYpIHx8ICEoaGlnaCAmICgxIDw8IDMxKSkpIHsKLQkJb3ZlcmZsb3cgPSAxOwotCQkodm9pZCljaGVja2luZ193cm1zcmwoaHdjLT5jb25maWdfYmFzZSArIGh3Yy0+aWR4LAotCQkJKCh1NjQpbG93KSAmIH5QNF9DQ0NSX09WRik7CisJLyogYW4gb2ZmaWNpYWwgd2F5IGZvciBvdmVyZmxvdyBpbmRpY2F0aW9uICovCisJcmRtc3JsKGh3Yy0+Y29uZmlnX2Jhc2UgKyBod2MtPmlkeCwgdik7CisJaWYgKHYgJiBQNF9DQ0NSX09WRikgeworCQl3cm1zcmwoaHdjLT5jb25maWdfYmFzZSArIGh3Yy0+aWR4LCB2ICYgflA0X0NDQ1JfT1ZGKTsKKwkJcmV0dXJuIDE7CiAJfQogCi0JcmV0dXJuIG92ZXJmbG93OworCS8qIGl0IG1pZ2h0IGJlIHVuZmxhZ2dlZCBvdmVyZmxvdyAqLworCXJkbXNybChod2MtPmV2ZW50X2Jhc2UgKyBod2MtPmlkeCwgdik7CisJaWYgKCEodiAmIEFSQ0hfUDRfQ05UUlZBTF9NQVNLKSkKKwkJcmV0dXJuIDE7CisKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgcDRfcG11X2Rpc2FibGVfcGVicyh2b2lkKQpAQCAtMTE1Miw5ICsxMTU0LDkgQEAKIAkgKi8KIAkubnVtX2NvdW50ZXJzCQk9IEFSQ0hfUDRfTUFYX0NDQ1IsCiAJLmFwaWMJCQk9IDEsCi0JLmNudHZhbF9iaXRzCQk9IDQwLAotCS5jbnR2YWxfbWFzawkJPSAoMVVMTCA8PCA0MCkgLSAxLAotCS5tYXhfcGVyaW9kCQk9ICgxVUxMIDw8IDM5KSAtIDEsCisJLmNudHZhbF9iaXRzCQk9IEFSQ0hfUDRfQ05UUlZBTF9CSVRTLAorCS5jbnR2YWxfbWFzawkJPSBBUkNIX1A0X0NOVFJWQUxfTUFTSywKKwkubWF4X3BlcmlvZAkJPSAoMVVMTCA8PCAoQVJDSF9QNF9DTlRSVkFMX0JJVFMgLSAxKSkgLSAxLAogCS5od19jb25maWcJCT0gcDRfaHdfY29uZmlnLAogCS5zY2hlZHVsZV9ldmVudHMJPSBwNF9wbXVfc2NoZWR1bGVfZXZlbnRzLAogCS8qCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvZHVtcHN0YWNrLmMgYi9hcmNoL3g4Ni9rZXJuZWwvZHVtcHN0YWNrLmMKaW5kZXggODQ3NGM5OS4uZDZmYjE0NiAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2R1bXBzdGFjay5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9kdW1wc3RhY2suYwpAQCAtMTk3LDE0ICsxOTcsOCBAQAogICovCiB2b2lkIGR1bXBfc3RhY2sodm9pZCkKIHsKLQl1bnNpZ25lZCBsb25nIGJwID0gMDsKIAl1bnNpZ25lZCBsb25nIHN0YWNrOwogCi0jaWZkZWYgQ09ORklHX0ZSQU1FX1BPSU5URVIKLQlpZiAoIWJwKQotCQlnZXRfYnAoYnApOwotI2VuZGlmCi0KIAlwcmludGsoIlBpZDogJWQsIGNvbW06ICUuMjBzICVzICVzICUuKnNcbiIsCiAJCWN1cnJlbnQtPnBpZCwgY3VycmVudC0+Y29tbSwgcHJpbnRfdGFpbnRlZCgpLAogCQlpbml0X3V0c25hbWUoKS0+cmVsZWFzZSwKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9lbnRyeV82NC5TIGIvYXJjaC94ODYva2VybmVsL2VudHJ5XzY0LlMKaW5kZXggZTNiYTQxNy4uZDNiODk1ZiAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2VudHJ5XzY0LlMKKysrIGIvYXJjaC94ODYva2VybmVsL2VudHJ5XzY0LlMKQEAgLTI5OSwxNyArMjk5LDIxIEBACiBFTlRSWShzYXZlX2FyZ3MpCiAJWENQVF9GUkFNRQogCWNsZAotCW1vdnFfY2ZpIHJkaSwgUkRJKzE2LUFSR09GRlNFVAotCW1vdnFfY2ZpIHJzaSwgUlNJKzE2LUFSR09GRlNFVAotCW1vdnFfY2ZpIHJkeCwgUkRYKzE2LUFSR09GRlNFVAotCW1vdnFfY2ZpIHJjeCwgUkNYKzE2LUFSR09GRlNFVAotCW1vdnFfY2ZpIHJheCwgUkFYKzE2LUFSR09GRlNFVAotCW1vdnFfY2ZpICByOCwgIFI4KzE2LUFSR09GRlNFVAotCW1vdnFfY2ZpICByOSwgIFI5KzE2LUFSR09GRlNFVAotCW1vdnFfY2ZpIHIxMCwgUjEwKzE2LUFSR09GRlNFVAotCW1vdnFfY2ZpIHIxMSwgUjExKzE2LUFSR09GRlNFVAorCS8qCisJICogc3RhcnQgZnJvbSByYnAgaW4gcHRfcmVncyBhbmQganVtcCBvdmVyCisJICogcmV0dXJuIGFkZHJlc3MuCisJICovCisJbW92cV9jZmkgcmRpLCBSREkrOC1SQlAKKwltb3ZxX2NmaSByc2ksIFJTSSs4LVJCUAorCW1vdnFfY2ZpIHJkeCwgUkRYKzgtUkJQCisJbW92cV9jZmkgcmN4LCBSQ1grOC1SQlAKKwltb3ZxX2NmaSByYXgsIFJBWCs4LVJCUAorCW1vdnFfY2ZpICByOCwgIFI4KzgtUkJQCisJbW92cV9jZmkgIHI5LCAgUjkrOC1SQlAKKwltb3ZxX2NmaSByMTAsIFIxMCs4LVJCUAorCW1vdnFfY2ZpIHIxMSwgUjExKzgtUkJQCiAKLQlsZWFxIC1BUkdPRkZTRVQrMTYoJXJzcCksJXJkaQkvKiBhcmcxIGZvciBoYW5kbGVyICovCisJbGVhcSAtUkJQKzgoJXJzcCksJXJkaQkvKiBhcmcxIGZvciBoYW5kbGVyICovCiAJbW92cV9jZmkgcmJwLCA4CQkvKiBwdXNoICVyYnAgKi8KIAlsZWFxIDgoJXJzcCksICVyYnAJCS8qIG1vdiAlcnNwLCAlZWJwICovCiAJdGVzdGwgJDMsIENTKCVyZGkpCkBAIC03ODIsOCArNzg2LDkgQEAKIAogLyogMCglcnNwKTogfihpbnRlcnJ1cHQgbnVtYmVyKSAqLwogCS5tYWNybyBpbnRlcnJ1cHQgZnVuYwotCXN1YnEgJE9SSUdfUkFYLUFSR09GRlNFVCs4LCAlcnNwCi0JQ0ZJX0FESlVTVF9DRkFfT0ZGU0VUIE9SSUdfUkFYLUFSR09GRlNFVCs4CisJLyogcmVzZXJ2ZSBwdF9yZWdzIGZvciBzY3JhdGNoIHJlZ3MgYW5kIHJicCAqLworCXN1YnEgJE9SSUdfUkFYLVJCUCwgJXJzcAorCUNGSV9BREpVU1RfQ0ZBX09GRlNFVCBPUklHX1JBWC1SQlAKIAljYWxsIHNhdmVfYXJncwogCVBBUlRJQUxfRlJBTUUgMAogCWNhbGwgXGZ1bmMKQEAgLTgwOCw5ICs4MTMsMTQgQEAKIAlUUkFDRV9JUlFTX09GRgogCWRlY2wgUEVSX0NQVV9WQVIoaXJxX2NvdW50KQogCWxlYXZlcQorCiAJQ0ZJX1JFU1RPUkUJCXJicAogCUNGSV9ERUZfQ0ZBX1JFR0lTVEVSCXJzcAogCUNGSV9BREpVU1RfQ0ZBX09GRlNFVAktOAorCisJLyogd2UgZGlkIG5vdCBzYXZlIHJieCwgcmVzdG9yZSBvbmx5IGZyb20gQVJHT0ZGU0VUICovCisJYWRkcSAkOCwgJXJzcAorCUNGSV9BREpVU1RfQ0ZBX09GRlNFVAktOAogZXhpdF9pbnRyOgogCUdFVF9USFJFQURfSU5GTyglcmN4KQogCXRlc3RsICQzLENTLUFSR09GRlNFVCglcnNwKQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2tnZGIuYyBiL2FyY2gveDg2L2tlcm5lbC9rZ2RiLmMKaW5kZXggY2QyMWI2NS4uYTQxMzAwMCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2tnZGIuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwva2dkYi5jCkBAIC00OCw2ICs0OCw3IEBACiAjaW5jbHVkZSA8YXNtL2FwaWNkZWYuaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAjaW5jbHVkZSA8YXNtL2FwaWMuaD4KKyNpbmNsdWRlIDxhc20vbm1pLmg+CiAKIHN0cnVjdCBkYmdfcmVnX2RlZl90IGRiZ19yZWdfZGVmW0RCR19NQVhfUkVHX05VTV0gPQogewpAQCAtNTI1LDEwICs1MjYsNiBAQAogCQl9CiAJCXJldHVybiBOT1RJRllfRE9ORTsKIAotCWNhc2UgRElFX05NSV9JUEk6Ci0JCS8qIEp1c3QgaWdub3JlLCB3ZSB3aWxsIGhhbmRsZSB0aGUgcm91bmR1cCBvbiBESUVfTk1JLiAqLwotCQlyZXR1cm4gTk9USUZZX0RPTkU7Ci0KIAljYXNlIERJRV9OTUlVTktOT1dOOgogCQlpZiAod2FzX2luX2RlYnVnX25taVtyYXdfc21wX3Byb2Nlc3Nvcl9pZCgpXSkgewogCQkJd2FzX2luX2RlYnVnX25taVtyYXdfc21wX3Byb2Nlc3Nvcl9pZCgpXSA9IDA7CkBAIC02MDYsNyArNjAzLDcgQEAKIAkvKgogCSAqIExvd2VzdC1wcmlvIG5vdGlmaWVyIHByaW9yaXR5LCB3ZSB3YW50IHRvIGJlIG5vdGlmaWVkIGxhc3Q6CiAJICovCi0JLnByaW9yaXR5CT0gLUlOVF9NQVgsCisJLnByaW9yaXR5CT0gTk1JX0xPQ0FMX0xPV19QUklPUiwKIH07CiAKIC8qKgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL3JlYm9vdC5jIGIvYXJjaC94ODYva2VybmVsL3JlYm9vdC5jCmluZGV4IGM0OTVhYTguLmZjN2FhZTEgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9yZWJvb3QuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvcmVib290LmMKQEAgLTE4LDYgKzE4LDcgQEAKICNpbmNsdWRlIDxhc20vcGNpX3g4Ni5oPgogI2luY2x1ZGUgPGFzbS92aXJ0ZXh0Lmg+CiAjaW5jbHVkZSA8YXNtL2NwdS5oPgorI2luY2x1ZGUgPGFzbS9ubWkuaD4KIAogI2lmZGVmIENPTkZJR19YODZfMzIKICMgaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KQEAgLTc0Nyw3ICs3NDgsNyBAQAogewogCWludCBjcHU7CiAKLQlpZiAodmFsICE9IERJRV9OTUlfSVBJKQorCWlmICh2YWwgIT0gRElFX05NSSkKIAkJcmV0dXJuIE5PVElGWV9PSzsKIAogCWNwdSA9IHJhd19zbXBfcHJvY2Vzc29yX2lkKCk7CkBAIC03NzgsNiArNzc5LDggQEAKIAogc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBjcmFzaF9ubWlfbmIgPSB7CiAJLm5vdGlmaWVyX2NhbGwgPSBjcmFzaF9ubWlfY2FsbGJhY2ssCisJLyogd2Ugd2FudCB0byBiZSB0aGUgZmlyc3Qgb25lIGNhbGxlZCAqLworCS5wcmlvcml0eSA9IE5NSV9MT0NBTF9ISUdIX1BSSU9SKzEsCiB9OwogCiAvKiBIYWx0IGFsbCBvdGhlciBDUFVzLCBjYWxsaW5nIHRoZSBzcGVjaWZpZWQgZnVuY3Rpb24gb24gZWFjaCBvZiB0aGVtCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvc21wYm9vdC5jIGIvYXJjaC94ODYva2VybmVsL3NtcGJvb3QuYwppbmRleCBjNzE0OWM5Li43NjNkZjc3IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvc21wYm9vdC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9zbXBib290LmMKQEAgLTk3LDEyICs5NywxMiBAQAogICovCiBzdGF0aWMgREVGSU5FX01VVEVYKHg4Nl9jcHVfaG90cGx1Z19kcml2ZXJfbXV0ZXgpOwogCi12b2lkIGNwdV9ob3RwbHVnX2RyaXZlcl9sb2NrKCkKK3ZvaWQgY3B1X2hvdHBsdWdfZHJpdmVyX2xvY2sodm9pZCkKIHsKICAgICAgICAgbXV0ZXhfbG9jaygmeDg2X2NwdV9ob3RwbHVnX2RyaXZlcl9tdXRleCk7CiB9CiAKLXZvaWQgY3B1X2hvdHBsdWdfZHJpdmVyX3VubG9jaygpCit2b2lkIGNwdV9ob3RwbHVnX2RyaXZlcl91bmxvY2sodm9pZCkKIHsKICAgICAgICAgbXV0ZXhfdW5sb2NrKCZ4ODZfY3B1X2hvdHBsdWdfZHJpdmVyX211dGV4KTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC90cmFwcy5jIGIvYXJjaC94ODYva2VybmVsL3RyYXBzLmMKaW5kZXggYzc2YWFjYS4uYjliNjcxNiAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL3RyYXBzLmMKKysrIGIvYXJjaC94ODYva2VybmVsL3RyYXBzLmMKQEAgLTg0LDYgKzg0LDExIEBACiBzdGF0aWMgaW50IGlnbm9yZV9ubWlzOwogCiBpbnQgdW5rbm93bl9ubWlfcGFuaWM7CisvKgorICogUHJldmVudCBOTUkgcmVhc29uIHBvcnQgKDB4NjEpIGJlaW5nIGFjY2Vzc2VkIHNpbXVsdGFuZW91c2x5LCBjYW4KKyAqIG9ubHkgYmUgdXNlZCBpbiBOTUkgaGFuZGxlci4KKyAqLworc3RhdGljIERFRklORV9SQVdfU1BJTkxPQ0sobm1pX3JlYXNvbl9sb2NrKTsKIAogc3RhdGljIGlubGluZSB2b2lkIGNvbmRpdGlvbmFsX3N0aShzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKQEAgLTMxMCwxNSArMzE1LDE1IEBACiBfX3NldHVwKCJ1bmtub3duX25taV9wYW5pYyIsIHNldHVwX3Vua25vd25fbm1pX3BhbmljKTsKIAogc3RhdGljIG5vdHJhY2UgX19rcHJvYmVzIHZvaWQKLW1lbV9wYXJpdHlfZXJyb3IodW5zaWduZWQgY2hhciByZWFzb24sIHN0cnVjdCBwdF9yZWdzICpyZWdzKQorcGNpX3NlcnJfZXJyb3IodW5zaWduZWQgY2hhciByZWFzb24sIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewotCXByaW50ayhLRVJOX0VNRVJHCi0JCSJVaGh1aC4gTk1JIHJlY2VpdmVkIGZvciB1bmtub3duIHJlYXNvbiAlMDJ4IG9uIENQVSAlZC5cbiIsCi0JCQlyZWFzb24sIHNtcF9wcm9jZXNzb3JfaWQoKSk7CisJcHJfZW1lcmcoIk5NSTogUENJIHN5c3RlbSBlcnJvciAoU0VSUikgZm9yIHJlYXNvbiAlMDJ4IG9uIENQVSAlZC5cbiIsCisJCSByZWFzb24sIHNtcF9wcm9jZXNzb3JfaWQoKSk7CiAKLQlwcmludGsoS0VSTl9FTUVSRwotCQkiWW91IGhhdmUgc29tZSBoYXJkd2FyZSBwcm9ibGVtLCBsaWtlbHkgb24gdGhlIFBDSSBidXMuXG4iKTsKLQorCS8qCisJICogT24gc29tZSBtYWNoaW5lcywgUENJIFNFUlIgbGluZSBpcyB1c2VkIHRvIHJlcG9ydCBtZW1vcnkKKwkgKiBlcnJvcnMuIEVEQUMgbWFrZXMgdXNlIG9mIGl0LgorCSAqLwogI2lmIGRlZmluZWQoQ09ORklHX0VEQUMpCiAJaWYgKGVkYWNfaGFuZGxlcl9zZXQoKSkgewogCQllZGFjX2F0b21pY19hc3NlcnRfZXJyb3IoKTsKQEAgLTMyOSwxMSArMzM0LDExIEBACiAJaWYgKHBhbmljX29uX3VucmVjb3ZlcmVkX25taSkKIAkJcGFuaWMoIk5NSTogTm90IGNvbnRpbnVpbmciKTsKIAotCXByaW50ayhLRVJOX0VNRVJHICJEYXplZCBhbmQgY29uZnVzZWQsIGJ1dCB0cnlpbmcgdG8gY29udGludWVcbiIpOworCXByX2VtZXJnKCJEYXplZCBhbmQgY29uZnVzZWQsIGJ1dCB0cnlpbmcgdG8gY29udGludWVcbiIpOwogCi0JLyogQ2xlYXIgYW5kIGRpc2FibGUgdGhlIG1lbW9yeSBwYXJpdHkgZXJyb3IgbGluZS4gKi8KLQlyZWFzb24gPSAocmVhc29uICYgMHhmKSB8IDQ7Ci0Jb3V0YihyZWFzb24sIDB4NjEpOworCS8qIENsZWFyIGFuZCBkaXNhYmxlIHRoZSBQQ0kgU0VSUiBlcnJvciBsaW5lLiAqLworCXJlYXNvbiA9IChyZWFzb24gJiBOTUlfUkVBU09OX0NMRUFSX01BU0spIHwgTk1JX1JFQVNPTl9DTEVBUl9TRVJSOworCW91dGIocmVhc29uLCBOTUlfUkVBU09OX1BPUlQpOwogfQogCiBzdGF0aWMgbm90cmFjZSBfX2twcm9iZXMgdm9pZApAQCAtMzQxLDE1ICszNDYsMTcgQEAKIHsKIAl1bnNpZ25lZCBsb25nIGk7CiAKLQlwcmludGsoS0VSTl9FTUVSRyAiTk1JOiBJT0NLIGVycm9yIChkZWJ1ZyBpbnRlcnJ1cHQ/KVxuIik7CisJcHJfZW1lcmcoCisJIk5NSTogSU9DSyBlcnJvciAoZGVidWcgaW50ZXJydXB0PykgZm9yIHJlYXNvbiAlMDJ4IG9uIENQVSAlZC5cbiIsCisJCSByZWFzb24sIHNtcF9wcm9jZXNzb3JfaWQoKSk7CiAJc2hvd19yZWdpc3RlcnMocmVncyk7CiAKIAlpZiAocGFuaWNfb25faW9fbm1pKQogCQlwYW5pYygiTk1JIElPQ0sgZXJyb3I6IE5vdCBjb250aW51aW5nIik7CiAKIAkvKiBSZS1lbmFibGUgdGhlIElPQ0sgbGluZSwgd2FpdCBmb3IgYSBmZXcgc2Vjb25kcyAqLwotCXJlYXNvbiA9IChyZWFzb24gJiAweGYpIHwgODsKLQlvdXRiKHJlYXNvbiwgMHg2MSk7CisJcmVhc29uID0gKHJlYXNvbiAmIE5NSV9SRUFTT05fQ0xFQVJfTUFTSykgfCBOTUlfUkVBU09OX0NMRUFSX0lPQ0hLOworCW91dGIocmVhc29uLCBOTUlfUkVBU09OX1BPUlQpOwogCiAJaSA9IDIwMDAwOwogCXdoaWxlICgtLWkpIHsKQEAgLTM1Nyw4ICszNjQsOCBAQAogCQl1ZGVsYXkoMTAwKTsKIAl9CiAKLQlyZWFzb24gJj0gfjg7Ci0Jb3V0YihyZWFzb24sIDB4NjEpOworCXJlYXNvbiAmPSB+Tk1JX1JFQVNPTl9DTEVBUl9JT0NISzsKKwlvdXRiKHJlYXNvbiwgTk1JX1JFQVNPTl9QT1JUKTsKIH0KIAogc3RhdGljIG5vdHJhY2UgX19rcHJvYmVzIHZvaWQKQEAgLTM3Nyw1NyArMzg0LDUwIEBACiAJCXJldHVybjsKIAl9CiAjZW5kaWYKLQlwcmludGsoS0VSTl9FTUVSRwotCQkiVWhodWguIE5NSSByZWNlaXZlZCBmb3IgdW5rbm93biByZWFzb24gJTAyeCBvbiBDUFUgJWQuXG4iLAotCQkJcmVhc29uLCBzbXBfcHJvY2Vzc29yX2lkKCkpOworCXByX2VtZXJnKCJVaGh1aC4gTk1JIHJlY2VpdmVkIGZvciB1bmtub3duIHJlYXNvbiAlMDJ4IG9uIENQVSAlZC5cbiIsCisJCSByZWFzb24sIHNtcF9wcm9jZXNzb3JfaWQoKSk7CiAKLQlwcmludGsoS0VSTl9FTUVSRyAiRG8geW91IGhhdmUgYSBzdHJhbmdlIHBvd2VyIHNhdmluZyBtb2RlIGVuYWJsZWQ/XG4iKTsKKwlwcl9lbWVyZygiRG8geW91IGhhdmUgYSBzdHJhbmdlIHBvd2VyIHNhdmluZyBtb2RlIGVuYWJsZWQ/XG4iKTsKIAlpZiAodW5rbm93bl9ubWlfcGFuaWMgfHwgcGFuaWNfb25fdW5yZWNvdmVyZWRfbm1pKQogCQlwYW5pYygiTk1JOiBOb3QgY29udGludWluZyIpOwogCi0JcHJpbnRrKEtFUk5fRU1FUkcgIkRhemVkIGFuZCBjb25mdXNlZCwgYnV0IHRyeWluZyB0byBjb250aW51ZVxuIik7CisJcHJfZW1lcmcoIkRhemVkIGFuZCBjb25mdXNlZCwgYnV0IHRyeWluZyB0byBjb250aW51ZVxuIik7CiB9CiAKIHN0YXRpYyBub3RyYWNlIF9fa3Byb2JlcyB2b2lkIGRlZmF1bHRfZG9fbm1pKHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogCXVuc2lnbmVkIGNoYXIgcmVhc29uID0gMDsKLQlpbnQgY3B1OwogCi0JY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOworCS8qCisJICogQ1BVLXNwZWNpZmljIE5NSSBtdXN0IGJlIHByb2Nlc3NlZCBiZWZvcmUgbm9uLUNQVS1zcGVjaWZpYworCSAqIE5NSSwgb3RoZXJ3aXNlIHdlIG1heSBsb3NlIGl0LCBiZWNhdXNlIHRoZSBDUFUtc3BlY2lmaWMKKwkgKiBOTUkgY2FuIG5vdCBiZSBkZXRlY3RlZC9wcm9jZXNzZWQgb24gb3RoZXIgQ1BVcy4KKwkgKi8KKwlpZiAobm90aWZ5X2RpZShESUVfTk1JLCAibm1pIiwgcmVncywgMCwgMiwgU0lHSU5UKSA9PSBOT1RJRllfU1RPUCkKKwkJcmV0dXJuOwogCi0JLyogT25seSB0aGUgQlNQIGdldHMgZXh0ZXJuYWwgTk1JcyBmcm9tIHRoZSBzeXN0ZW0uICovCi0JaWYgKCFjcHUpCi0JCXJlYXNvbiA9IGdldF9ubWlfcmVhc29uKCk7CisJLyogTm9uLUNQVS1zcGVjaWZpYyBOTUk6IE5NSSBzb3VyY2VzIGNhbiBiZSBwcm9jZXNzZWQgb24gYW55IENQVSAqLworCXJhd19zcGluX2xvY2soJm5taV9yZWFzb25fbG9jayk7CisJcmVhc29uID0gZ2V0X25taV9yZWFzb24oKTsKIAotCWlmICghKHJlYXNvbiAmIDB4YzApKSB7Ci0JCWlmIChub3RpZnlfZGllKERJRV9OTUlfSVBJLCAibm1pX2lwaSIsIHJlZ3MsIHJlYXNvbiwgMiwgU0lHSU5UKQotCQkJCQkJCQk9PSBOT1RJRllfU1RPUCkKLQkJCXJldHVybjsKLQotI2lmZGVmIENPTkZJR19YODZfTE9DQUxfQVBJQwotCQlpZiAobm90aWZ5X2RpZShESUVfTk1JLCAibm1pIiwgcmVncywgcmVhc29uLCAyLCBTSUdJTlQpCi0JCQkJCQkJPT0gTk9USUZZX1NUT1ApCi0JCQlyZXR1cm47CisJaWYgKHJlYXNvbiAmIE5NSV9SRUFTT05fTUFTSykgeworCQlpZiAocmVhc29uICYgTk1JX1JFQVNPTl9TRVJSKQorCQkJcGNpX3NlcnJfZXJyb3IocmVhc29uLCByZWdzKTsKKwkJZWxzZSBpZiAocmVhc29uICYgTk1JX1JFQVNPTl9JT0NISykKKwkJCWlvX2NoZWNrX2Vycm9yKHJlYXNvbiwgcmVncyk7CisjaWZkZWYgQ09ORklHX1g4Nl8zMgorCQkvKgorCQkgKiBSZWFzc2VydCBOTUkgaW4gY2FzZSBpdCBiZWNhbWUgYWN0aXZlCisJCSAqIG1lYW53aGlsZSBhcyBpdCdzIGVkZ2UtdHJpZ2dlcmVkOgorCQkgKi8KKwkJcmVhc3NlcnRfbm1pKCk7CiAjZW5kaWYKLQkJdW5rbm93bl9ubWlfZXJyb3IocmVhc29uLCByZWdzKTsKLQorCQlyYXdfc3Bpbl91bmxvY2soJm5taV9yZWFzb25fbG9jayk7CiAJCXJldHVybjsKIAl9Ci0JaWYgKG5vdGlmeV9kaWUoRElFX05NSSwgIm5taSIsIHJlZ3MsIHJlYXNvbiwgMiwgU0lHSU5UKSA9PSBOT1RJRllfU1RPUCkKLQkJcmV0dXJuOworCXJhd19zcGluX3VubG9jaygmbm1pX3JlYXNvbl9sb2NrKTsKIAotCS8qIEFLOiBmb2xsb3dpbmcgY2hlY2tzIHNlZW0gdG8gYmUgYnJva2VuIG9uIG1vZGVybiBjaGlwc2V0cy4gRklYTUUgKi8KLQlpZiAocmVhc29uICYgMHg4MCkKLQkJbWVtX3Bhcml0eV9lcnJvcihyZWFzb24sIHJlZ3MpOwotCWlmIChyZWFzb24gJiAweDQwKQotCQlpb19jaGVja19lcnJvcihyZWFzb24sIHJlZ3MpOwotI2lmZGVmIENPTkZJR19YODZfMzIKLQkvKgotCSAqIFJlYXNzZXJ0IE5NSSBpbiBjYXNlIGl0IGJlY2FtZSBhY3RpdmUgbWVhbndoaWxlCi0JICogYXMgaXQncyBlZGdlLXRyaWdnZXJlZDoKLQkgKi8KLQlyZWFzc2VydF9ubWkoKTsKLSNlbmRpZgorCXVua25vd25fbm1pX2Vycm9yKHJlYXNvbiwgcmVncyk7CiB9CiAKIGRvdHJhcGxpbmthZ2Ugbm90cmFjZSBfX2twcm9iZXMgdm9pZApkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL3RzYy5jIGIvYXJjaC94ODYva2VybmVsL3RzYy5jCmluZGV4IDAzZDJlYTguLjgyM2Y3OWEgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC90c2MuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvdHNjLmMKQEAgLTk2NSw3ICs5NjUsNyBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBpbml0X3RzY19jbG9ja3NvdXJjZSh2b2lkKQogewotCWlmICghY3B1X2hhc190c2MgfHwgdHNjX2Rpc2FibGVkID4gMCkKKwlpZiAoIWNwdV9oYXNfdHNjIHx8IHRzY19kaXNhYmxlZCA+IDAgfHwgIXRzY19raHopCiAJCXJldHVybiAwOwogCiAJaWYgKHRzY19jbG9ja3NvdXJjZV9yZWxpYWJsZSkKZGlmZiAtLWdpdCBhL2FyY2gveDg2L21tL2FtZHRvcG9sb2d5XzY0LmMgYi9hcmNoL3g4Ni9tbS9hbWR0b3BvbG9neV82NC5jCmluZGV4IDA4YTAwNjkuLmYyMTk2MmMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L21tL2FtZHRvcG9sb2d5XzY0LmMKKysrIGIvYXJjaC94ODYvbW0vYW1kdG9wb2xvZ3lfNjQuYwpAQCAtMjcsNiArMjcsNyBAQAogI2luY2x1ZGUgPGFzbS9hbWRfbmIuaD4KIAogc3RhdGljIHN0cnVjdCBib290bm9kZSBfX2luaXRkYXRhIG5vZGVzWzhdOworc3RhdGljIHVuc2lnbmVkIGNoYXIgX19pbml0ZGF0YSBub2RlaWRzWzhdOwogc3RhdGljIG5vZGVtYXNrX3QgX19pbml0ZGF0YSBub2Rlc19wYXJzZWQgPSBOT0RFX01BU0tfTk9ORTsKIAogc3RhdGljIF9faW5pdCBpbnQgZmluZF9ub3J0aGJyaWRnZSh2b2lkKQpAQCAtNjgsMTkgKzY5LDYgQEAKICNlbmRpZgogfQogCi1pbnQgX19pbml0IGFtZF9nZXRfbm9kZXMoc3RydWN0IGJvb3Rub2RlICpwaHlzbm9kZXMpCi17Ci0JaW50IGk7Ci0JaW50IHJldCA9IDA7Ci0KLQlmb3JfZWFjaF9ub2RlX21hc2soaSwgbm9kZXNfcGFyc2VkKSB7Ci0JCXBoeXNub2Rlc1tyZXRdLnN0YXJ0ID0gbm9kZXNbaV0uc3RhcnQ7Ci0JCXBoeXNub2Rlc1tyZXRdLmVuZCA9IG5vZGVzW2ldLmVuZDsKLQkJcmV0Kys7Ci0JfQotCXJldHVybiByZXQ7Ci19Ci0KIGludCBfX2luaXQgYW1kX251bWFfaW5pdCh1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbiwgdW5zaWduZWQgbG9uZyBlbmRfcGZuKQogewogCXVuc2lnbmVkIGxvbmcgc3RhcnQgPSBQRk5fUEhZUyhzdGFydF9wZm4pOwpAQCAtMTEzLDcgKzEwMSw3IEBACiAJCWJhc2UgPSByZWFkX3BjaV9jb25maWcoMCwgbmIsIDEsIDB4NDAgKyBpKjgpOwogCQlsaW1pdCA9IHJlYWRfcGNpX2NvbmZpZygwLCBuYiwgMSwgMHg0NCArIGkqOCk7CiAKLQkJbm9kZWlkID0gbGltaXQgJiA3OworCQlub2RlaWRzW2ldID0gbm9kZWlkID0gbGltaXQgJiA3OwogCQlpZiAoKGJhc2UgJiAzKSA9PSAwKSB7CiAJCQlpZiAoaSA8IG51bW5vZGVzKQogCQkJCXByX2luZm8oIlNraXBwaW5nIGRpc2FibGVkIG5vZGUgJWRcbiIsIGkpOwpAQCAtMTkzLDYgKzE4MSw3NiBAQAogCXJldHVybiAwOwogfQogCisjaWZkZWYgQ09ORklHX05VTUFfRU1VCitzdGF0aWMgczE2IGZha2VfYXBpY2lkX3RvX25vZGVbTUFYX0xPQ0FMX0FQSUNdIF9faW5pdGRhdGEgPSB7CisJWzAgLi4uIE1BWF9MT0NBTF9BUElDLTFdID0gTlVNQV9OT19OT0RFCit9OworCit2b2lkIF9faW5pdCBhbWRfZ2V0X25vZGVzKHN0cnVjdCBib290bm9kZSAqcGh5c25vZGVzKQoreworCWludCBpOworCisJZm9yX2VhY2hfbm9kZV9tYXNrKGksIG5vZGVzX3BhcnNlZCkgeworCQlwaHlzbm9kZXNbaV0uc3RhcnQgPSBub2Rlc1tpXS5zdGFydDsKKwkJcGh5c25vZGVzW2ldLmVuZCA9IG5vZGVzW2ldLmVuZDsKKwl9Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGZpbmRfbm9kZV9ieV9hZGRyKHVuc2lnbmVkIGxvbmcgYWRkcikKK3sKKwlpbnQgcmV0ID0gTlVNQV9OT19OT0RFOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKwkJaWYgKGFkZHIgPj0gbm9kZXNbaV0uc3RhcnQgJiYgYWRkciA8IG5vZGVzW2ldLmVuZCkgeworCQkJcmV0ID0gaTsKKwkJCWJyZWFrOworCQl9CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIEZvciBOVU1BIGVtdWxhdGlvbiwgZmFrZSBwcm94aW1pdHkgZG9tYWluIChfUFhNKSB0byBub2RlIGlkIG1hcHBpbmdzIG11c3QgYmUKKyAqIHNldHVwIHRvIHJlcHJlc2VudCB0aGUgcGh5c2ljYWwgdG9wb2xvZ3kgYnV0IHJlZmxlY3QgdGhlIGVtdWxhdGVkCisgKiBlbnZpcm9ubWVudC4gIEZvciBlYWNoIGVtdWxhdGVkIG5vZGUsIHRoZSByZWFsIG5vZGUgd2hpY2ggaXQgYXBwZWFycyBvbiBpcworICogZm91bmQgYW5kIGEgZmFrZSBweG0gdG8gbmlkIG1hcHBpbmcgaXMgY3JlYXRlZCB3aGljaCBtaXJyb3JzIHRoZSBhY3R1YWwKKyAqIGxvY2FsaXR5LiAgbm9kZV9kaXN0YW5jZSgpIHRoZW4gcmVwcmVzZW50cyB0aGUgY29ycmVjdCBkaXN0YW5jZXMgYmV0d2VlbgorICogZW11bGF0ZWQgbm9kZXMgYnkgdXNpbmcgdGhlIGZha2UgYWNwaSBtYXBwaW5ncyB0byBweG1zLgorICovCit2b2lkIF9faW5pdCBhbWRfZmFrZV9ub2Rlcyhjb25zdCBzdHJ1Y3QgYm9vdG5vZGUgKm5vZGVzLCBpbnQgbnJfbm9kZXMpCit7CisJdW5zaWduZWQgaW50IGJpdHM7CisJdW5zaWduZWQgaW50IGNvcmVzOworCXVuc2lnbmVkIGludCBhcGljaWRfYmFzZSA9IDA7CisJaW50IGk7CisKKwliaXRzID0gYm9vdF9jcHVfZGF0YS54ODZfY29yZWlkX2JpdHM7CisJY29yZXMgPSAxIDw8IGJpdHM7CisJZWFybHlfZ2V0X2Jvb3RfY3B1X2lkKCk7CisJaWYgKGJvb3RfY3B1X3BoeXNpY2FsX2FwaWNpZCA+IDApCisJCWFwaWNpZF9iYXNlID0gYm9vdF9jcHVfcGh5c2ljYWxfYXBpY2lkOworCisJZm9yIChpID0gMDsgaSA8IG5yX25vZGVzOyBpKyspIHsKKwkJaW50IGluZGV4OworCQlpbnQgbmlkOworCQlpbnQgajsKKworCQluaWQgPSBmaW5kX25vZGVfYnlfYWRkcihub2Rlc1tpXS5zdGFydCk7CisJCWlmIChuaWQgPT0gTlVNQV9OT19OT0RFKQorCQkJY29udGludWU7CisKKwkJaW5kZXggPSBub2RlaWRzW25pZF0gPDwgYml0czsKKwkJaWYgKGZha2VfYXBpY2lkX3RvX25vZGVbaW5kZXggKyBhcGljaWRfYmFzZV0gPT0gTlVNQV9OT19OT0RFKQorCQkJZm9yIChqID0gYXBpY2lkX2Jhc2U7IGogPCBjb3JlcyArIGFwaWNpZF9iYXNlOyBqKyspCisJCQkJZmFrZV9hcGljaWRfdG9fbm9kZVtpbmRleCArIGpdID0gaTsKKyNpZmRlZiBDT05GSUdfQUNQSV9OVU1BCisJCV9fYWNwaV9tYXBfcHhtX3RvX25vZGUobmlkLCBpKTsKKyNlbmRpZgorCX0KKwltZW1jcHkoYXBpY2lkX3RvX25vZGUsIGZha2VfYXBpY2lkX3RvX25vZGUsIHNpemVvZihhcGljaWRfdG9fbm9kZSkpOworfQorI2VuZGlmIC8qIENPTkZJR19OVU1BX0VNVSAqLworCiBpbnQgX19pbml0IGFtZF9zY2FuX25vZGVzKHZvaWQpCiB7CiAJdW5zaWduZWQgaW50IGJpdHM7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9tbS9udW1hXzY0LmMgYi9hcmNoL3g4Ni9tbS9udW1hXzY0LmMKaW5kZXggNzc2MmE1MS4uMWU3MjEwMiAxMDA2NDQKLS0tIGEvYXJjaC94ODYvbW0vbnVtYV82NC5jCisrKyBiL2FyY2gveDg2L21tL251bWFfNjQuYwpAQCAtMjYwLDMwICsyNjAsMzAgQEAKICNpZmRlZiBDT05GSUdfTlVNQV9FTVUKIC8qIE51bWEgZW11bGF0aW9uICovCiBzdGF0aWMgc3RydWN0IGJvb3Rub2RlIG5vZGVzW01BWF9OVU1OT0RFU10gX19pbml0ZGF0YTsKLXN0YXRpYyBzdHJ1Y3QgYm9vdG5vZGUgcGh5c25vZGVzW01BWF9OVU1OT0RFU10gX19pbml0ZGF0YTsKK3N0YXRpYyBzdHJ1Y3QgYm9vdG5vZGUgcGh5c25vZGVzW01BWF9OVU1OT0RFU10gX19jcHVpbml0ZGF0YTsKIHN0YXRpYyBjaGFyICpjbWRsaW5lIF9faW5pdGRhdGE7CiAKIHN0YXRpYyBpbnQgX19pbml0IHNldHVwX3BoeXNub2Rlcyh1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCwKIAkJCQkJaW50IGFjcGksIGludCBhbWQpCiB7Ci0JaW50IG5yX25vZGVzID0gMDsKIAlpbnQgcmV0ID0gMDsKIAlpbnQgaTsKIAorCW1lbXNldChwaHlzbm9kZXMsIDAsIHNpemVvZihwaHlzbm9kZXMpKTsKICNpZmRlZiBDT05GSUdfQUNQSV9OVU1BCiAJaWYgKGFjcGkpCi0JCW5yX25vZGVzID0gYWNwaV9nZXRfbm9kZXMocGh5c25vZGVzKTsKKwkJYWNwaV9nZXRfbm9kZXMocGh5c25vZGVzLCBzdGFydCwgZW5kKTsKICNlbmRpZgogI2lmZGVmIENPTkZJR19BTURfTlVNQQogCWlmIChhbWQpCi0JCW5yX25vZGVzID0gYW1kX2dldF9ub2RlcyhwaHlzbm9kZXMpOworCQlhbWRfZ2V0X25vZGVzKHBoeXNub2Rlcyk7CiAjZW5kaWYKIAkvKgogCSAqIEJhc2ljIHNhbml0eSBjaGVja2luZyBvbiB0aGUgcGh5c2ljYWwgbm9kZSBtYXA6IHRoZXJlIG1heSBiZSBlcnJvcnMKIAkgKiBpZiB0aGUgU1JBVCBvciBBTUQgY29kZSBpbmNvcnJlY3RseSByZXBvcnRlZCB0aGUgdG9wb2xvZ3kgb3IgdGhlIG1lbT0KIAkgKiBrZXJuZWwgcGFyYW1ldGVyIGlzIHVzZWQuCiAJICovCi0JZm9yIChpID0gMDsgaSA8IG5yX25vZGVzOyBpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX05VTU5PREVTOyBpKyspIHsKIAkJaWYgKHBoeXNub2Rlc1tpXS5zdGFydCA9PSBwaHlzbm9kZXNbaV0uZW5kKQogCQkJY29udGludWU7CiAJCWlmIChwaHlzbm9kZXNbaV0uc3RhcnQgPiBlbmQpIHsKQEAgLTI5OCwxNyArMjk4LDYgQEAKIAkJCXBoeXNub2Rlc1tpXS5zdGFydCA9IHN0YXJ0OwogCQlpZiAocGh5c25vZGVzW2ldLmVuZCA+IGVuZCkKIAkJCXBoeXNub2Rlc1tpXS5lbmQgPSBlbmQ7Ci0JfQotCi0JLyoKLQkgKiBSZW1vdmUgYWxsIG5vZGVzIHRoYXQgaGF2ZSBubyBtZW1vcnkgb3Igd2VyZSB0cnVuY2F0ZWQgYmVjYXVzZSBvZiB0aGUKLQkgKiBsaW1pdGVkIGFkZHJlc3MgcmFuZ2UuCi0JICovCi0JZm9yIChpID0gMDsgaSA8IG5yX25vZGVzOyBpKyspIHsKLQkJaWYgKHBoeXNub2Rlc1tpXS5zdGFydCA9PSBwaHlzbm9kZXNbaV0uZW5kKQotCQkJY29udGludWU7Ci0JCXBoeXNub2Rlc1tyZXRdLnN0YXJ0ID0gcGh5c25vZGVzW2ldLnN0YXJ0OwotCQlwaHlzbm9kZXNbcmV0XS5lbmQgPSBwaHlzbm9kZXNbaV0uZW5kOwogCQlyZXQrKzsKIAl9CiAKQEAgLTMyNCw2ICszMTMsMjQgQEAKIAlyZXR1cm4gcmV0OwogfQogCitzdGF0aWMgdm9pZCBfX2luaXQgZmFrZV9waHlzbm9kZXMoaW50IGFjcGksIGludCBhbWQsIGludCBucl9ub2RlcykKK3sKKwlpbnQgaTsKKworCUJVR19PTihhY3BpICYmIGFtZCk7CisjaWZkZWYgQ09ORklHX0FDUElfTlVNQQorCWlmIChhY3BpKQorCQlhY3BpX2Zha2Vfbm9kZXMobm9kZXMsIG5yX25vZGVzKTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19BTURfTlVNQQorCWlmIChhbWQpCisJCWFtZF9mYWtlX25vZGVzKG5vZGVzLCBucl9ub2Rlcyk7CisjZW5kaWYKKwlpZiAoIWFjcGkgJiYgIWFtZCkKKwkJZm9yIChpID0gMDsgaSA8IG5yX2NwdV9pZHM7IGkrKykKKwkJCW51bWFfc2V0X25vZGUoaSwgMCk7Cit9CisKIC8qCiAgKiBTZXR1cHMgdXAgbmlkIHRvIHJhbmdlIGZyb20gYWRkciB0byBhZGRyICsgc2l6ZS4gIElmIHRoZSBlbmQKICAqIGJvdW5kYXJ5IGlzIGdyZWF0ZXIgdGhhbiBtYXhfYWRkciwgdGhlbiBtYXhfYWRkciBpcyB1c2VkIGluc3RlYWQuCkBAIC0zNTIsOCArMzU5LDcgQEAKICAqIFNldHMgdXAgbnJfbm9kZXMgZmFrZSBub2RlcyBpbnRlcmxlYXZlZCBvdmVyIHBoeXNpY2FsIG5vZGVzIHJhbmdpbmcgZnJvbSBhZGRyCiAgKiB0byBtYXhfYWRkci4gIFRoZSByZXR1cm4gdmFsdWUgaXMgdGhlIG51bWJlciBvZiBub2RlcyBhbGxvY2F0ZWQuCiAgKi8KLXN0YXRpYyBpbnQgX19pbml0IHNwbGl0X25vZGVzX2ludGVybGVhdmUodTY0IGFkZHIsIHU2NCBtYXhfYWRkciwKLQkJCQkJCWludCBucl9waHlzX25vZGVzLCBpbnQgbnJfbm9kZXMpCitzdGF0aWMgaW50IF9faW5pdCBzcGxpdF9ub2Rlc19pbnRlcmxlYXZlKHU2NCBhZGRyLCB1NjQgbWF4X2FkZHIsIGludCBucl9ub2RlcykKIHsKIAlub2RlbWFza190IHBoeXNub2RlX21hc2sgPSBOT0RFX01BU0tfTk9ORTsKIAl1NjQgc2l6ZTsKQEAgLTM4NCw3ICszOTAsNyBAQAogCQlyZXR1cm4gLTE7CiAJfQogCi0JZm9yIChpID0gMDsgaSA8IG5yX3BoeXNfbm9kZXM7IGkrKykKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX05VTU5PREVTOyBpKyspCiAJCWlmIChwaHlzbm9kZXNbaV0uc3RhcnQgIT0gcGh5c25vZGVzW2ldLmVuZCkKIAkJCW5vZGVfc2V0KGksIHBoeXNub2RlX21hc2spOwogCkBAIC01NTMsMTEgKzU1OSw5IEBACiB7CiAJdTY0IGFkZHIgPSBzdGFydF9wZm4gPDwgUEFHRV9TSElGVDsKIAl1NjQgbWF4X2FkZHIgPSBsYXN0X3BmbiA8PCBQQUdFX1NISUZUOwotCWludCBudW1fcGh5c19ub2RlczsKIAlpbnQgbnVtX25vZGVzOwogCWludCBpOwogCi0JbnVtX3BoeXNfbm9kZXMgPSBzZXR1cF9waHlzbm9kZXMoYWRkciwgbWF4X2FkZHIsIGFjcGksIGFtZCk7CiAJLyoKIAkgKiBJZiB0aGUgbnVtYT1mYWtlIGNvbW1hbmQtbGluZSBjb250YWlucyBhICdNJyBvciAnRycsIGl0IHJlcHJlc2VudHMKIAkgKiB0aGUgZml4ZWQgbm9kZSBzaXplLiAgT3RoZXJ3aXNlLCBpZiBpdCBpcyBqdXN0IGEgc2luZ2xlIG51bWJlciBOLApAQCAtNTcyLDcgKzU3Niw3IEBACiAJCXVuc2lnbmVkIGxvbmcgbjsKIAogCQluID0gc2ltcGxlX3N0cnRvdWwoY21kbGluZSwgTlVMTCwgMCk7Ci0JCW51bV9ub2RlcyA9IHNwbGl0X25vZGVzX2ludGVybGVhdmUoYWRkciwgbWF4X2FkZHIsIG51bV9waHlzX25vZGVzLCBuKTsKKwkJbnVtX25vZGVzID0gc3BsaXRfbm9kZXNfaW50ZXJsZWF2ZShhZGRyLCBtYXhfYWRkciwgbik7CiAJfQogCiAJaWYgKG51bV9ub2RlcyA8IDApCkBAIC01OTUsNyArNTk5LDggQEAKIAkJCQkJCW5vZGVzW2ldLmVuZCA+PiBQQUdFX1NISUZUKTsKIAkJc2V0dXBfbm9kZV9ib290bWVtKGksIG5vZGVzW2ldLnN0YXJ0LCBub2Rlc1tpXS5lbmQpOwogCX0KLQlhY3BpX2Zha2Vfbm9kZXMobm9kZXMsIG51bV9ub2Rlcyk7CisJc2V0dXBfcGh5c25vZGVzKGFkZHIsIG1heF9hZGRyLCBhY3BpLCBhbWQpOworCWZha2VfcGh5c25vZGVzKGFjcGksIGFtZCwgbnVtX25vZGVzKTsKIAludW1hX2luaXRfYXJyYXkoKTsKIAlyZXR1cm4gMDsKIH0KQEAgLTYxMCw4ICs2MTUsMTIgQEAKIAlub2Rlc19jbGVhcihub2RlX29ubGluZV9tYXApOwogCiAjaWZkZWYgQ09ORklHX05VTUFfRU1VCisJc2V0dXBfcGh5c25vZGVzKHN0YXJ0X3BmbiA8PCBQQUdFX1NISUZULCBsYXN0X3BmbiA8PCBQQUdFX1NISUZULAorCQkJYWNwaSwgYW1kKTsKIAlpZiAoY21kbGluZSAmJiAhbnVtYV9lbXVsYXRpb24oc3RhcnRfcGZuLCBsYXN0X3BmbiwgYWNwaSwgYW1kKSkKIAkJcmV0dXJuOworCXNldHVwX3BoeXNub2RlcyhzdGFydF9wZm4gPDwgUEFHRV9TSElGVCwgbGFzdF9wZm4gPDwgUEFHRV9TSElGVCwKKwkJCWFjcGksIGFtZCk7CiAJbm9kZXNfY2xlYXIobm9kZV9wb3NzaWJsZV9tYXApOwogCW5vZGVzX2NsZWFyKG5vZGVfb25saW5lX21hcCk7CiAjZW5kaWYKQEAgLTc2Nyw2ICs3NzYsNyBAQAogCiAjaWZuZGVmIENPTkZJR19ERUJVR19QRVJfQ1BVX01BUFMKIAorI2lmbmRlZiBDT05GSUdfTlVNQV9FTVUKIHZvaWQgX19jcHVpbml0IG51bWFfYWRkX2NwdShpbnQgY3B1KQogewogCWNwdW1hc2tfc2V0X2NwdShjcHUsIG5vZGVfdG9fY3B1bWFza19tYXBbZWFybHlfY3B1X3RvX25vZGUoY3B1KV0pOwpAQCAtNzc2LDM0ICs3ODYsMTE1IEBACiB7CiAJY3B1bWFza19jbGVhcl9jcHUoY3B1LCBub2RlX3RvX2NwdW1hc2tfbWFwW2Vhcmx5X2NwdV90b19ub2RlKGNwdSldKTsKIH0KKyNlbHNlCit2b2lkIF9fY3B1aW5pdCBudW1hX2FkZF9jcHUoaW50IGNwdSkKK3sKKwl1bnNpZ25lZCBsb25nIGFkZHI7CisJdTE2IGFwaWNpZDsKKwlpbnQgcGh5c25pZDsKKwlpbnQgbmlkID0gTlVNQV9OT19OT0RFOworCisJYXBpY2lkID0gZWFybHlfcGVyX2NwdSh4ODZfY3B1X3RvX2FwaWNpZCwgY3B1KTsKKwlpZiAoYXBpY2lkICE9IEJBRF9BUElDSUQpCisJCW5pZCA9IGFwaWNpZF90b19ub2RlW2FwaWNpZF07CisJaWYgKG5pZCA9PSBOVU1BX05PX05PREUpCisJCW5pZCA9IGVhcmx5X2NwdV90b19ub2RlKGNwdSk7CisJQlVHX09OKG5pZCA9PSBOVU1BX05PX05PREUgfHwgIW5vZGVfb25saW5lKG5pZCkpOworCisJLyoKKwkgKiBVc2UgdGhlIHN0YXJ0aW5nIGFkZHJlc3Mgb2YgdGhlIGVtdWxhdGVkIG5vZGUgdG8gZmluZCB3aGljaCBwaHlzaWNhbAorCSAqIG5vZGUgaXQgaXMgYWxsb2NhdGVkIG9uLgorCSAqLworCWFkZHIgPSBub2RlX3N0YXJ0X3BmbihuaWQpIDw8IFBBR0VfU0hJRlQ7CisJZm9yIChwaHlzbmlkID0gMDsgcGh5c25pZCA8IE1BWF9OVU1OT0RFUzsgcGh5c25pZCsrKQorCQlpZiAoYWRkciA+PSBwaHlzbm9kZXNbcGh5c25pZF0uc3RhcnQgJiYKKwkJICAgIGFkZHIgPCBwaHlzbm9kZXNbcGh5c25pZF0uZW5kKQorCQkJYnJlYWs7CisKKwkvKgorCSAqIE1hcCB0aGUgY3B1IHRvIGVhY2ggZW11bGF0ZWQgbm9kZSB0aGF0IGlzIGFsbG9jYXRlZCBvbiB0aGUgcGh5c2ljYWwKKwkgKiBub2RlIG9mIHRoZSBjcHUncyBhcGljIGlkLgorCSAqLworCWZvcl9lYWNoX29ubGluZV9ub2RlKG5pZCkgeworCQlhZGRyID0gbm9kZV9zdGFydF9wZm4obmlkKSA8PCBQQUdFX1NISUZUOworCQlpZiAoYWRkciA+PSBwaHlzbm9kZXNbcGh5c25pZF0uc3RhcnQgJiYKKwkJICAgIGFkZHIgPCBwaHlzbm9kZXNbcGh5c25pZF0uZW5kKQorCQkJY3B1bWFza19zZXRfY3B1KGNwdSwgbm9kZV90b19jcHVtYXNrX21hcFtuaWRdKTsKKwl9Cit9CisKK3ZvaWQgX19jcHVpbml0IG51bWFfcmVtb3ZlX2NwdShpbnQgY3B1KQoreworCWludCBpOworCisJZm9yX2VhY2hfb25saW5lX25vZGUoaSkKKwkJY3B1bWFza19jbGVhcl9jcHUoY3B1LCBub2RlX3RvX2NwdW1hc2tfbWFwW2ldKTsKK30KKyNlbmRpZiAvKiAhQ09ORklHX05VTUFfRU1VICovCiAKICNlbHNlIC8qIENPTkZJR19ERUJVR19QRVJfQ1BVX01BUFMgKi8KLQotLyoKLSAqIC0tLS0tLS0tLSBkZWJ1ZyB2ZXJzaW9ucyBvZiB0aGUgbnVtYSBmdW5jdGlvbnMgLS0tLS0tLS0tCi0gKi8KLXN0YXRpYyB2b2lkIF9fY3B1aW5pdCBudW1hX3NldF9jcHVtYXNrKGludCBjcHUsIGludCBlbmFibGUpCitzdGF0aWMgc3RydWN0IGNwdW1hc2sgX19jcHVpbml0ICpkZWJ1Z19jcHVtYXNrX3NldF9jcHUoaW50IGNwdSwgaW50IGVuYWJsZSkKIHsKIAlpbnQgbm9kZSA9IGVhcmx5X2NwdV90b19ub2RlKGNwdSk7CiAJc3RydWN0IGNwdW1hc2sgKm1hc2s7CiAJY2hhciBidWZbNjRdOwogCiAJbWFzayA9IG5vZGVfdG9fY3B1bWFza19tYXBbbm9kZV07Ci0JaWYgKG1hc2sgPT0gTlVMTCkgewotCQlwcmludGsoS0VSTl9FUlIgIm5vZGVfdG9fY3B1bWFza19tYXBbJWldIE5VTExcbiIsIG5vZGUpOworCWlmICghbWFzaykgeworCQlwcl9lcnIoIm5vZGVfdG9fY3B1bWFza19tYXBbJWldIE5VTExcbiIsIG5vZGUpOwogCQlkdW1wX3N0YWNrKCk7Ci0JCXJldHVybjsKKwkJcmV0dXJuIE5VTEw7CiAJfQogCisJY3B1bGlzdF9zY25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgbWFzayk7CisJcHJpbnRrKEtFUk5fREVCVUcgIiVzIGNwdSAlZCBub2RlICVkOiBtYXNrIG5vdyAlc1xuIiwKKwkJZW5hYmxlID8gIm51bWFfYWRkX2NwdSIgOiAibnVtYV9yZW1vdmVfY3B1IiwKKwkJY3B1LCBub2RlLCBidWYpOworCXJldHVybiBtYXNrOworfQorCisvKgorICogLS0tLS0tLS0tIGRlYnVnIHZlcnNpb25zIG9mIHRoZSBudW1hIGZ1bmN0aW9ucyAtLS0tLS0tLS0KKyAqLworI2lmbmRlZiBDT05GSUdfTlVNQV9FTVUKK3N0YXRpYyB2b2lkIF9fY3B1aW5pdCBudW1hX3NldF9jcHVtYXNrKGludCBjcHUsIGludCBlbmFibGUpCit7CisJc3RydWN0IGNwdW1hc2sgKm1hc2s7CisKKwltYXNrID0gZGVidWdfY3B1bWFza19zZXRfY3B1KGNwdSwgZW5hYmxlKTsKKwlpZiAoIW1hc2spCisJCXJldHVybjsKKwogCWlmIChlbmFibGUpCiAJCWNwdW1hc2tfc2V0X2NwdShjcHUsIG1hc2spOwogCWVsc2UKIAkJY3B1bWFza19jbGVhcl9jcHUoY3B1LCBtYXNrKTsKLQotCWNwdWxpc3Rfc2NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksIG1hc2spOwotCXByaW50ayhLRVJOX0RFQlVHICIlcyBjcHUgJWQgbm9kZSAlZDogbWFzayBub3cgJXNcbiIsCi0JCWVuYWJsZSA/ICJudW1hX2FkZF9jcHUiIDogIm51bWFfcmVtb3ZlX2NwdSIsIGNwdSwgbm9kZSwgYnVmKTsKIH0KKyNlbHNlCitzdGF0aWMgdm9pZCBfX2NwdWluaXQgbnVtYV9zZXRfY3B1bWFzayhpbnQgY3B1LCBpbnQgZW5hYmxlKQoreworCWludCBub2RlID0gZWFybHlfY3B1X3RvX25vZGUoY3B1KTsKKwlzdHJ1Y3QgY3B1bWFzayAqbWFzazsKKwlpbnQgaTsKKworCWZvcl9lYWNoX29ubGluZV9ub2RlKGkpIHsKKwkJdW5zaWduZWQgbG9uZyBhZGRyOworCisJCWFkZHIgPSBub2RlX3N0YXJ0X3BmbihpKSA8PCBQQUdFX1NISUZUOworCQlpZiAoYWRkciA8IHBoeXNub2Rlc1tub2RlXS5zdGFydCB8fAorCQkJCQlhZGRyID49IHBoeXNub2Rlc1tub2RlXS5lbmQpCisJCQljb250aW51ZTsKKwkJbWFzayA9IGRlYnVnX2NwdW1hc2tfc2V0X2NwdShjcHUsIGVuYWJsZSk7CisJCWlmICghbWFzaykKKwkJCXJldHVybjsKKworCQlpZiAoZW5hYmxlKQorCQkJY3B1bWFza19zZXRfY3B1KGNwdSwgbWFzayk7CisJCWVsc2UKKwkJCWNwdW1hc2tfY2xlYXJfY3B1KGNwdSwgbWFzayk7CisJfQorfQorI2VuZGlmIC8qIENPTkZJR19OVU1BX0VNVSAqLwogCiB2b2lkIF9fY3B1aW5pdCBudW1hX2FkZF9jcHUoaW50IGNwdSkKIHsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L21tL3NyYXRfNjQuYyBiL2FyY2gveDg2L21tL3NyYXRfNjQuYwppbmRleCAxNzFhMGFhLi42MDNkMjg1IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9tbS9zcmF0XzY0LmMKKysrIGIvYXJjaC94ODYvbW0vc3JhdF82NC5jCkBAIC0zNDksMTggKzM0OSwxOSBAQAogCiB2b2lkIF9faW5pdCBhY3BpX251bWFfYXJjaF9maXh1cCh2b2lkKSB7fQogCi1pbnQgX19pbml0IGFjcGlfZ2V0X25vZGVzKHN0cnVjdCBib290bm9kZSAqcGh5c25vZGVzKQorI2lmZGVmIENPTkZJR19OVU1BX0VNVQordm9pZCBfX2luaXQgYWNwaV9nZXRfbm9kZXMoc3RydWN0IGJvb3Rub2RlICpwaHlzbm9kZXMsIHVuc2lnbmVkIGxvbmcgc3RhcnQsCisJCQkJdW5zaWduZWQgbG9uZyBlbmQpCiB7CiAJaW50IGk7Ci0JaW50IHJldCA9IDA7CiAKIAlmb3JfZWFjaF9ub2RlX21hc2soaSwgbm9kZXNfcGFyc2VkKSB7Ci0JCXBoeXNub2Rlc1tyZXRdLnN0YXJ0ID0gbm9kZXNbaV0uc3RhcnQ7Ci0JCXBoeXNub2Rlc1tyZXRdLmVuZCA9IG5vZGVzW2ldLmVuZDsKLQkJcmV0Kys7CisJCWN1dG9mZl9ub2RlKGksIHN0YXJ0LCBlbmQpOworCQlwaHlzbm9kZXNbaV0uc3RhcnQgPSBub2Rlc1tpXS5zdGFydDsKKwkJcGh5c25vZGVzW2ldLmVuZCA9IG5vZGVzW2ldLmVuZDsKIAl9Ci0JcmV0dXJuIHJldDsKIH0KKyNlbmRpZiAvKiBDT05GSUdfTlVNQV9FTVUgKi8KIAogLyogVXNlIHRoZSBpbmZvcm1hdGlvbiBkaXNjb3ZlcmVkIGFib3ZlIHRvIGFjdHVhbGx5IHNldCB1cCB0aGUgbm9kZXMuICovCiBpbnQgX19pbml0IGFjcGlfc2Nhbl9ub2Rlcyh1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCkKQEAgLTUwNSw4ICs1MDYsNiBAQAogewogCWludCBpLCBqOwogCi0JcHJpbnRrKEtFUk5fSU5GTyAiRmFraW5nIFBYTSBhZmZpbml0eSBmb3IgZmFrZSBub2RlcyBvbiByZWFsICIKLQkJCSAidG9wb2xvZ3kuXG4iKTsKIAlmb3IgKGkgPSAwOyBpIDwgbnVtX25vZGVzOyBpKyspIHsKIAkJaW50IG5pZCwgcHhtOwogCkBAIC01MjYsNiArNTI1LDE3IEBACiAJCQkgICAgZmFrZV9hcGljaWRfdG9fbm9kZVtqXSA9PSBOVU1BX05PX05PREUpCiAJCQkJZmFrZV9hcGljaWRfdG9fbm9kZVtqXSA9IGk7CiAJfQorCisJLyoKKwkgKiBJZiB0aGVyZSBhcmUgYXBpY2lkLXRvLW5vZGUgbWFwcGluZ3MgZm9yIHBoeXNpY2FsIG5vZGVzIHRoYXQgZG8gbm90CisJICogaGF2ZSBhIGNvcnJlc3BvbmRpbmcgZW11bGF0ZWQgbm9kZSwgaXQgc2hvdWxkIGRlZmF1bHQgdG8gYSBndWFyYW50ZWVkCisJICogdmFsdWUuCisJICovCisJZm9yIChpID0gMDsgaSA8IE1BWF9MT0NBTF9BUElDOyBpKyspCisJCWlmIChhcGljaWRfdG9fbm9kZVtpXSAhPSBOVU1BX05PX05PREUgJiYKKwkJICAgIGZha2VfYXBpY2lkX3RvX25vZGVbaV0gPT0gTlVNQV9OT19OT0RFKQorCQkJZmFrZV9hcGljaWRfdG9fbm9kZVtpXSA9IDA7CisKIAlmb3IgKGkgPSAwOyBpIDwgbnVtX25vZGVzOyBpKyspCiAJCV9fYWNwaV9tYXBfcHhtX3RvX25vZGUoZmFrZV9ub2RlX3RvX3B4bV9tYXBbaV0sIGkpOwogCW1lbWNweShhcGljaWRfdG9fbm9kZSwgZmFrZV9hcGljaWRfdG9fbm9kZSwgc2l6ZW9mKGFwaWNpZF90b19ub2RlKSk7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9vcHJvZmlsZS9ubWlfaW50LmMgYi9hcmNoL3g4Ni9vcHJvZmlsZS9ubWlfaW50LmMKaW5kZXggZjI0YTg1My4uZTJiN2IwYyAxMDA2NDQKLS0tIGEvYXJjaC94ODYvb3Byb2ZpbGUvbm1pX2ludC5jCisrKyBiL2FyY2gveDg2L29wcm9maWxlL25taV9pbnQuYwpAQCAtNjUsNyArNjUsNiBAQAogCiAJc3dpdGNoICh2YWwpIHsKIAljYXNlIERJRV9OTUk6Ci0JY2FzZSBESUVfTk1JX0lQSToKIAkJaWYgKGN0cl9ydW5uaW5nKQogCQkJbW9kZWwtPmNoZWNrX2N0cnMoYXJncy0+cmVncywgJl9fZ2V0X2NwdV92YXIoY3B1X21zcnMpKTsKIAkJZWxzZSBpZiAoIW5taV9lbmFibGVkKQpAQCAtMzYxLDcgKzM2MCw3IEBACiBzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIHByb2ZpbGVfZXhjZXB0aW9uc19uYiA9IHsKIAkubm90aWZpZXJfY2FsbCA9IHByb2ZpbGVfZXhjZXB0aW9uc19ub3RpZnksCiAJLm5leHQgPSBOVUxMLAotCS5wcmlvcml0eSA9IDIKKwkucHJpb3JpdHkgPSBOTUlfTE9DQUxfTE9XX1BSSU9SLAogfTsKIAogc3RhdGljIHZvaWQgbm1pX2NwdV9yZXN0b3JlX3JlZ2lzdGVycyhzdHJ1Y3Qgb3BfbXNycyAqbXNycykKZGlmZiAtLWdpdCBhL2FyY2gveDg2L29wcm9maWxlL25taV90aW1lcl9pbnQuYyBiL2FyY2gveDg2L29wcm9maWxlL25taV90aW1lcl9pbnQuYwppbmRleCAwNjM2ZGQ5Li43MjBiZjVhIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9vcHJvZmlsZS9ubWlfdGltZXJfaW50LmMKKysrIGIvYXJjaC94ODYvb3Byb2ZpbGUvbm1pX3RpbWVyX2ludC5jCkBAIC0zOCw3ICszOCw3IEBACiBzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIHByb2ZpbGVfdGltZXJfZXhjZXB0aW9uc19uYiA9IHsKIAkubm90aWZpZXJfY2FsbCA9IHByb2ZpbGVfdGltZXJfZXhjZXB0aW9uc19ub3RpZnksCiAJLm5leHQgPSBOVUxMLAotCS5wcmlvcml0eSA9IDAKKwkucHJpb3JpdHkgPSBOTUlfTE9XX1BSSU9SLAogfTsKIAogc3RhdGljIGludCB0aW1lcl9zdGFydCh2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvcGNpL2FtZF9idXMuYyBiL2FyY2gveDg2L3BjaS9hbWRfYnVzLmMKaW5kZXggZmMxZThmZS4uZTI3ZGZmYiAxMDA2NDQKLS0tIGEvYXJjaC94ODYvcGNpL2FtZF9idXMuYworKysgYi9hcmNoL3g4Ni9wY2kvYW1kX2J1cy5jCkBAIC00LDYgKzQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2NwdS5oPgogI2luY2x1ZGUgPGxpbnV4L3JhbmdlLmg+CiAKKyNpbmNsdWRlIDxhc20vYW1kX25iLmg+CiAjaW5jbHVkZSA8YXNtL3BjaV94ODYuaD4KIAogI2luY2x1ZGUgPGFzbS9wY2ktZGlyZWN0Lmg+CkBAIC0zNzgsNiArMzc5LDM0IEBACiAJLm5vdGlmaWVyX2NhbGwJPSBhbWRfY3B1X25vdGlmeSwKIH07CiAKK3N0YXRpYyB2b2lkIF9faW5pdCBwY2lfZW5hYmxlX3BjaV9pb19lY3Modm9pZCkKK3sKKyNpZmRlZiBDT05GSUdfQU1EX05CCisJdW5zaWduZWQgaW50IGksIG47CisKKwlmb3IgKG4gPSBpID0gMDsgIW4gJiYgYW1kX25iX2J1c19kZXZfcmFuZ2VzW2ldLmRldl9saW1pdDsgKytpKSB7CisJCXU4IGJ1cyA9IGFtZF9uYl9idXNfZGV2X3Jhbmdlc1tpXS5idXM7CisJCXU4IHNsb3QgPSBhbWRfbmJfYnVzX2Rldl9yYW5nZXNbaV0uZGV2X2Jhc2U7CisJCXU4IGxpbWl0ID0gYW1kX25iX2J1c19kZXZfcmFuZ2VzW2ldLmRldl9saW1pdDsKKworCQlmb3IgKDsgc2xvdCA8IGxpbWl0OyArK3Nsb3QpIHsKKwkJCXUzMiB2YWwgPSByZWFkX3BjaV9jb25maWcoYnVzLCBzbG90LCAzLCAwKTsKKworCQkJaWYgKCFlYXJseV9pc19hbWRfbmIodmFsKSkKKwkJCQljb250aW51ZTsKKworCQkJdmFsID0gcmVhZF9wY2lfY29uZmlnKGJ1cywgc2xvdCwgMywgMHg4Yyk7CisJCQlpZiAoISh2YWwgJiAoRU5BQkxFX0NGOF9FWFRfQ0ZHID4+IDMyKSkpIHsKKwkJCQl2YWwgfD0gRU5BQkxFX0NGOF9FWFRfQ0ZHID4+IDMyOworCQkJCXdyaXRlX3BjaV9jb25maWcoYnVzLCBzbG90LCAzLCAweDhjLCB2YWwpOworCQkJfQorCQkJKytuOworCQl9CisJfQorCXByX2luZm8oIkV4dGVuZGVkIENvbmZpZyBTcGFjZSBlbmFibGVkIG9uICV1IG5vZGVzXG4iLCBuKTsKKyNlbmRpZgorfQorCiBzdGF0aWMgaW50IF9faW5pdCBwY2lfaW9fZWNzX2luaXQodm9pZCkKIHsKIAlpbnQgY3B1OwpAQCAtMzg2LDYgKzQxNSwxMCBAQAogICAgICAgICBpZiAoYm9vdF9jcHVfZGF0YS54ODYgPCAweDEwKQogCQlyZXR1cm4gMDsKIAorCS8qIFRyeSB0aGUgUENJIG1ldGhvZCBmaXJzdC4gKi8KKwlpZiAoZWFybHlfcGNpX2FsbG93ZWQoKSkKKwkJcGNpX2VuYWJsZV9wY2lfaW9fZWNzKCk7CisKIAlyZWdpc3Rlcl9jcHVfbm90aWZpZXIoJmFtZF9jcHVfbm90aWZpZXIpOwogCWZvcl9lYWNoX29ubGluZV9jcHUoY3B1KQogCQlhbWRfY3B1X25vdGlmeSgmYW1kX2NwdV9ub3RpZmllciwgKHVuc2lnbmVkIGxvbmcpQ1BVX09OTElORSwKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3hlbi9lbmxpZ2h0ZW4uYyBiL2FyY2gveDg2L3hlbi9lbmxpZ2h0ZW4uYwppbmRleCBhYThjODlhLi43ZThkM2JjIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni94ZW4vZW5saWdodGVuLmMKKysrIGIvYXJjaC94ODYveGVuL2VubGlnaHRlbi5jCkBAIC0xMTc0LDYgKzExNzQsMTUgQEAKIAogCXhlbl9zbXBfaW5pdCgpOwogCisjaWZkZWYgQ09ORklHX0FDUElfTlVNQQorCS8qCisJICogVGhlIHBhZ2VzIHdlIGZyb20gWGVuIGFyZSBub3QgcmVsYXRlZCB0byBtYWNoaW5lIHBhZ2VzLCBzbworCSAqIGFueSBOVU1BIGluZm9ybWF0aW9uIHRoZSBrZXJuZWwgdHJpZXMgdG8gZ2V0IGZyb20gQUNQSSB3aWxsCisJICogYmUgbWVhbmluZ2xlc3MuICBQcmV2ZW50IGl0IGZyb20gdHJ5aW5nLgorCSAqLworCWFjcGlfbnVtYSA9IC0xOworI2VuZGlmCisKIAlwZ2QgPSAocGdkX3QgKil4ZW5fc3RhcnRfaW5mby0+cHRfYmFzZTsKIAogCWlmICgheGVuX2luaXRpYWxfZG9tYWluKCkpCkBAIC0xMjU2LDI1ICsxMjY1LDYgQEAKICNlbmRpZgogfQogCi1zdGF0aWMgdWludDMyX3QgeGVuX2NwdWlkX2Jhc2Uodm9pZCkKLXsKLQl1aW50MzJfdCBiYXNlLCBlYXgsIGVieCwgZWN4LCBlZHg7Ci0JY2hhciBzaWduYXR1cmVbMTNdOwotCi0JZm9yIChiYXNlID0gMHg0MDAwMDAwMDsgYmFzZSA8IDB4NDAwMTAwMDA7IGJhc2UgKz0gMHgxMDApIHsKLQkJY3B1aWQoYmFzZSwgJmVheCwgJmVieCwgJmVjeCwgJmVkeCk7Ci0JCSoodWludDMyX3QgKikoc2lnbmF0dXJlICsgMCkgPSBlYng7Ci0JCSoodWludDMyX3QgKikoc2lnbmF0dXJlICsgNCkgPSBlY3g7Ci0JCSoodWludDMyX3QgKikoc2lnbmF0dXJlICsgOCkgPSBlZHg7Ci0JCXNpZ25hdHVyZVsxMl0gPSAwOwotCi0JCWlmICghc3RyY21wKCJYZW5WTU1YZW5WTU0iLCBzaWduYXR1cmUpICYmICgoZWF4IC0gYmFzZSkgPj0gMikpCi0JCQlyZXR1cm4gYmFzZTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIGludCBpbml0X2h2bV9wdl9pbmZvKGludCAqbWFqb3IsIGludCAqbWlub3IpCiB7CiAJdWludDMyX3QgZWF4LCBlYngsIGVjeCwgZWR4LCBwYWdlcywgbXNyLCBiYXNlOwpAQCAtMTM4NCw2ICsxMzc0LDE4IEBACiAJcmV0dXJuIHRydWU7CiB9CiAKK2Jvb2wgeGVuX2h2bV9uZWVkX2xhcGljKHZvaWQpCit7CisJaWYgKHhlbl9wdl9kb21haW4oKSkKKwkJcmV0dXJuIGZhbHNlOworCWlmICgheGVuX2h2bV9kb21haW4oKSkKKwkJcmV0dXJuIGZhbHNlOworCWlmICh4ZW5fZmVhdHVyZShYRU5GRUFUX2h2bV9waXJxcykgJiYgeGVuX2hhdmVfdmVjdG9yX2NhbGxiYWNrKQorCQlyZXR1cm4gZmFsc2U7CisJcmV0dXJuIHRydWU7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh4ZW5faHZtX25lZWRfbGFwaWMpOworCiBjb25zdCBfX3JlZmNvbnN0IHN0cnVjdCBoeXBlcnZpc29yX3g4NiB4ODZfaHlwZXJfeGVuX2h2bSA9IHsKIAkubmFtZQkJCT0gIlhlbiBIVk0iLAogCS5kZXRlY3QJCQk9IHhlbl9odm1fcGxhdGZvcm0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9LY29uZmlnIGIvZHJpdmVycy9hdGEvS2NvbmZpZwppbmRleCAzNmUyMzE5Li5jNmIyOThkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9LY29uZmlnCisrKyBiL2RyaXZlcnMvYXRhL0tjb25maWcKQEAgLTIsNiArMiwxNCBAQAogIyBTQVRBL1BBVEEgZHJpdmVyIGNvbmZpZ3VyYXRpb24KICMKIAorY29uZmlnIEhBVkVfUEFUQV9QTEFURk9STQorCWJvb2wKKwloZWxwCisJICBUaGlzIGlzIGFuIGludGVybmFsIGNvbmZpZ3VyYXRpb24gbm9kZSBmb3IgYW55IG1hY2hpbmUgdGhhdAorCSAgdXNlcyBwYXRhLXBsYXRmb3JtIGRyaXZlciB0byBlbmFibGUgdGhlIHJlbGV2YW50IGRyaXZlciBpbiB0aGUKKwkgIGNvbmZpZ3VyYXRpb24gc3RydWN0dXJlIHdpdGhvdXQgaGF2aW5nIHRvIHN1Ym1pdCBlbmRsZXNzIHBhdGNoZXMKKwkgIHRvIHVwZGF0ZSB0aGUgUEFUQV9QTEFURk9STSBlbnRyeS4KKwogbWVudWNvbmZpZyBBVEEKIAl0cmlzdGF0ZSAiU2VyaWFsIEFUQSBhbmQgUGFyYWxsZWwgQVRBIGRyaXZlcnMiCiAJZGVwZW5kcyBvbiBIQVNfSU9NRU0KQEAgLTkwLDYgKzk4LDE0IEBACiAJaGVscAogCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBzdXBwb3J0IGZvciBJbml0aW8gMTYyeCBTZXJpYWwgQVRBLgogCitjb25maWcgU0FUQV9BQ0FSRF9BSENJCisJdHJpc3RhdGUgIkFDYXJkIEFIQ0kgdmFyaWFudCAoQVRQIDg2MjApIgorCWRlcGVuZHMgb24gUENJCisJaGVscAorCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBzdXBwb3J0IGZvciBBY2FyZC4KKworCSAgSWYgdW5zdXJlLCBzYXkgTi4KKwogY29uZmlnIFNBVEFfU0lMMjQKIAl0cmlzdGF0ZSAiU2lsaWNvbiBJbWFnZSAzMTI0LzMxMzIgU0FUQSBzdXBwb3J0IgogCWRlcGVuZHMgb24gUENJCkBAIC00MDAsMTEgKzQxNiwxMSBAQAogCSAgSWYgdW5zdXJlLCBzYXkgTi4KIAogY29uZmlnIFBBVEFfSFBUM1gyTgotCXRyaXN0YXRlICJIUFQgMzcyTi8zMDJOIFBBVEEgc3VwcG9ydCIKKwl0cmlzdGF0ZSAiSFBUIDM3MU4vMzcyTi8zMDJOIFBBVEEgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIFBDSQogCWhlbHAKIAkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgc3VwcG9ydCBmb3IgdGhlIE4gdmFyaWFudCBIUFQgUEFUQQotCSAgY29udHJvbGxlcnMgdmlhIHRoZSBuZXcgQVRBIGxheWVyCisJICBjb250cm9sbGVycyB2aWEgdGhlIG5ldyBBVEEgbGF5ZXIuCiAKIAkgIElmIHVuc3VyZSwgc2F5IE4uCiAKQEAgLTc2NSwxNCArNzgxLDYgQEAKIAogCSAgSWYgdW5zdXJlLCBzYXkgTi4KIAotY29uZmlnIEhBVkVfUEFUQV9QTEFURk9STQotCWJvb2wKLQloZWxwCi0JICBUaGlzIGlzIGFuIGludGVybmFsIGNvbmZpZ3VyYXRpb24gbm9kZSBmb3IgYW55IG1hY2hpbmUgdGhhdAotCSAgdXNlcyBwYXRhLXBsYXRmb3JtIGRyaXZlciB0byBlbmFibGUgdGhlIHJlbGV2YW50IGRyaXZlciBpbiB0aGUKLQkgIGNvbmZpZ3VyYXRpb24gc3RydWN0dXJlIHdpdGhvdXQgaGF2aW5nIHRvIHN1Ym1pdCBlbmRsZXNzIHBhdGNoZXMKLQkgIHRvIHVwZGF0ZSB0aGUgUEFUQV9QTEFURk9STSBlbnRyeS4KLQogY29uZmlnIFBBVEFfUExBVEZPUk0KIAl0cmlzdGF0ZSAiR2VuZXJpYyBwbGF0Zm9ybSBkZXZpY2UgUEFUQSBzdXBwb3J0IgogCWRlcGVuZHMgb24gRU1CRURERUQgfHwgUFBDIHx8IEhBVkVfUEFUQV9QTEFURk9STQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvTWFrZWZpbGUgYi9kcml2ZXJzL2F0YS9NYWtlZmlsZQppbmRleCAyYjY3YzkwLi4yNzI5MWFhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2F0YS9NYWtlZmlsZQpAQCAtMyw2ICszLDcgQEAKIAogIyBub24tU0ZGIGludGVyZmFjZQogb2JqLSQoQ09ORklHX1NBVEFfQUhDSSkJCSs9IGFoY2kubyBsaWJhaGNpLm8KK29iai0kKENPTkZJR19TQVRBX0FDQVJEX0FIQ0kpCSs9IGFjYXJkLWFoY2kubyBsaWJhaGNpLm8KIG9iai0kKENPTkZJR19TQVRBX0FIQ0lfUExBVEZPUk0pICs9IGFoY2lfcGxhdGZvcm0ubyBsaWJhaGNpLm8KIG9iai0kKENPTkZJR19TQVRBX0ZTTCkJCSs9IHNhdGFfZnNsLm8KIG9iai0kKENPTkZJR19TQVRBX0lOSUMxNjJYKQkrPSBzYXRhX2luaWMxNjJ4Lm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL2FjYXJkLWFoY2kuYyBiL2RyaXZlcnMvYXRhL2FjYXJkLWFoY2kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzljMjEwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9hdGEvYWNhcmQtYWhjaS5jCkBAIC0wLDAgKzEsNTI4IEBACisKKy8qCisgKiAgYWNhcmQtYWhjaS5jIC0gQUNhcmQgQUhDSSBTQVRBIHN1cHBvcnQKKyAqCisgKiAgTWFpbnRhaW5lZCBieTogIEplZmYgR2FyemlrIDxqZ2FyemlrQHBvYm94LmNvbT4KKyAqCQkgICAgUGxlYXNlIEFMV0FZUyBjb3B5IGxpbnV4LWlkZUB2Z2VyLmtlcm5lbC5vcmcKKyAqCQkgICAgb24gZW1haWxzLgorICoKKyAqICBDb3B5cmlnaHQgMjAxMCBSZWQgSGF0LCBJbmMuCisgKgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqCisgKgorICogbGliYXRhIGRvY3VtZW50YXRpb24gaXMgYXZhaWxhYmxlIHZpYSAnbWFrZSB7cHN8cGRmfWRvY3MnLAorICogYXMgRG9jdW1lbnRhdGlvbi9Eb2NCb29rL2xpYmF0YS4qCisgKgorICogQUhDSSBoYXJkd2FyZSBkb2N1bWVudGF0aW9uOgorICogaHR0cDovL3d3dy5pbnRlbC5jb20vdGVjaG5vbG9neS9zZXJpYWxhdGEvcGRmL3JldjFfMC5wZGYKKyAqIGh0dHA6Ly93d3cuaW50ZWwuY29tL3RlY2hub2xvZ3kvc2VyaWFsYXRhL3BkZi9yZXYxXzEucGRmCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RtaS5oPgorI2luY2x1ZGUgPGxpbnV4L2dmcC5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2NtbmQuaD4KKyNpbmNsdWRlIDxsaW51eC9saWJhdGEuaD4KKyNpbmNsdWRlICJhaGNpLmgiCisKKyNkZWZpbmUgRFJWX05BTUUJImFjYXJkLWFoY2kiCisjZGVmaW5lIERSVl9WRVJTSU9OCSIxLjAiCisKKy8qCisgIFJlY2VpdmVkIEZJUyBzdHJ1Y3R1cmUgbGltaXRlZCB0byA4MGguCisqLworCisjZGVmaW5lIEFDQVJEX0FIQ0lfUlhfRklTX1NaIDEyOAorCitlbnVtIHsKKwlBSENJX1BDSV9CQVIJCT0gNSwKK307CisKK2VudW0gYm9hcmRfaWRzIHsKKwlib2FyZF9hY2FyZF9haGNpLAorfTsKKworc3RydWN0IGFjYXJkX3NnIHsKKwlfX2xlMzIJCQlhZGRyOworCV9fbGUzMgkJCWFkZHJfaGk7CisJX19sZTMyCQkJcmVzZXJ2ZWQ7CisJX19sZTMyCQkJc2l6ZTsJIC8qIGJpdCAzMSAoRU9UKSBtYXg9PTB4MTAwMDAgKDY0aykgKi8KK307CisKK3N0YXRpYyB2b2lkIGFjYXJkX2FoY2lfcWNfcHJlcChzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjKTsKK3N0YXRpYyBib29sIGFjYXJkX2FoY2lfcWNfZmlsbF9ydGYoc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYyk7CitzdGF0aWMgaW50IGFjYXJkX2FoY2lfcG9ydF9zdGFydChzdHJ1Y3QgYXRhX3BvcnQgKmFwKTsKK3N0YXRpYyBpbnQgYWNhcmRfYWhjaV9pbml0X29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCk7CisKKyNpZmRlZiBDT05GSUdfUE0KK3N0YXRpYyBpbnQgYWNhcmRfYWhjaV9wY2lfZGV2aWNlX3N1c3BlbmQoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHBtX21lc3NhZ2VfdCBtZXNnKTsKK3N0YXRpYyBpbnQgYWNhcmRfYWhjaV9wY2lfZGV2aWNlX3Jlc3VtZShzdHJ1Y3QgcGNpX2RldiAqcGRldik7CisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgYWNhcmRfYWhjaV9zaHQgPSB7CisJQUhDSV9TSFQoImFjYXJkLWFoY2kiKSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXRhX3BvcnRfb3BlcmF0aW9ucyBhY2FyZF9vcHMgPSB7CisJLmluaGVyaXRzCQk9ICZhaGNpX29wcywKKwkucWNfcHJlcAkJPSBhY2FyZF9haGNpX3FjX3ByZXAsCisJLnFjX2ZpbGxfcnRmCQk9IGFjYXJkX2FoY2lfcWNfZmlsbF9ydGYsCisJLnBvcnRfc3RhcnQgICAgICAgICAgICAgPSBhY2FyZF9haGNpX3BvcnRfc3RhcnQsCit9OworCisjZGVmaW5lIEFIQ0lfSEZMQUdTKGZsYWdzKQkucHJpdmF0ZV9kYXRhCT0gKHZvaWQgKikoZmxhZ3MpCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyBhY2FyZF9haGNpX3BvcnRfaW5mb1tdID0geworCVtib2FyZF9hY2FyZF9haGNpXSA9CisJeworCQlBSENJX0hGTEFHUwkoQUhDSV9IRkxBR19OT19OQ1EpLAorCQkuZmxhZ3MJCT0gQUhDSV9GTEFHX0NPTU1PTiwKKwkJLnBpb19tYXNrCT0gQVRBX1BJTzQsCisJCS51ZG1hX21hc2sJPSBBVEFfVURNQTYsCisJCS5wb3J0X29wcwk9ICZhY2FyZF9vcHMsCisJfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCBhY2FyZF9haGNpX3BjaV90YmxbXSA9IHsKKwkvKiBBQ2FyZCAqLworCXsgUENJX1ZERVZJQ0UoQVJUT1AsIDB4MDAwZCksIGJvYXJkX2FjYXJkX2FoY2kgfSwgLyogQVRQODYyMCAqLworCisJeyB9ICAgIC8qIHRlcm1pbmF0ZSBsaXN0ICovCit9OworCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgYWNhcmRfYWhjaV9wY2lfZHJpdmVyID0geworCS5uYW1lCQkJPSBEUlZfTkFNRSwKKwkuaWRfdGFibGUJCT0gYWNhcmRfYWhjaV9wY2lfdGJsLAorCS5wcm9iZQkJCT0gYWNhcmRfYWhjaV9pbml0X29uZSwKKwkucmVtb3ZlCQkJPSBhdGFfcGNpX3JlbW92ZV9vbmUsCisjaWZkZWYgQ09ORklHX1BNCisJLnN1c3BlbmQJCT0gYWNhcmRfYWhjaV9wY2lfZGV2aWNlX3N1c3BlbmQsCisJLnJlc3VtZQkJCT0gYWNhcmRfYWhjaV9wY2lfZGV2aWNlX3Jlc3VtZSwKKyNlbmRpZgorfTsKKworI2lmZGVmIENPTkZJR19QTQorc3RhdGljIGludCBhY2FyZF9haGNpX3BjaV9kZXZpY2Vfc3VzcGVuZChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgcG1fbWVzc2FnZV90IG1lc2cpCit7CisJc3RydWN0IGF0YV9ob3N0ICpob3N0ID0gZGV2X2dldF9kcnZkYXRhKCZwZGV2LT5kZXYpOworCXN0cnVjdCBhaGNpX2hvc3RfcHJpdiAqaHByaXYgPSBob3N0LT5wcml2YXRlX2RhdGE7CisJdm9pZCBfX2lvbWVtICptbWlvID0gaHByaXYtPm1taW87CisJdTMyIGN0bDsKKworCWlmIChtZXNnLmV2ZW50ICYgUE1fRVZFTlRfU1VTUEVORCAmJgorCSAgICBocHJpdi0+ZmxhZ3MgJiBBSENJX0hGTEFHX05PX1NVU1BFTkQpIHsKKwkJZGV2X3ByaW50ayhLRVJOX0VSUiwgJnBkZXYtPmRldiwKKwkJCSAgICJCSU9TIHVwZGF0ZSByZXF1aXJlZCBmb3Igc3VzcGVuZC9yZXN1bWVcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlpZiAobWVzZy5ldmVudCAmIFBNX0VWRU5UX1NMRUVQKSB7CisJCS8qIEFIQ0kgc3BlYyByZXYxLjEgc2VjdGlvbiA4LjMuMzoKKwkJICogU29mdHdhcmUgbXVzdCBkaXNhYmxlIGludGVycnVwdHMgcHJpb3IgdG8gcmVxdWVzdGluZyBhCisJCSAqIHRyYW5zaXRpb24gb2YgdGhlIEhCQSB0byBEMyBzdGF0ZS4KKwkJICovCisJCWN0bCA9IHJlYWRsKG1taW8gKyBIT1NUX0NUTCk7CisJCWN0bCAmPSB+SE9TVF9JUlFfRU47CisJCXdyaXRlbChjdGwsIG1taW8gKyBIT1NUX0NUTCk7CisJCXJlYWRsKG1taW8gKyBIT1NUX0NUTCk7IC8qIGZsdXNoICovCisJfQorCisJcmV0dXJuIGF0YV9wY2lfZGV2aWNlX3N1c3BlbmQocGRldiwgbWVzZyk7Cit9CisKK3N0YXRpYyBpbnQgYWNhcmRfYWhjaV9wY2lfZGV2aWNlX3Jlc3VtZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgYXRhX2hvc3QgKmhvc3QgPSBkZXZfZ2V0X2RydmRhdGEoJnBkZXYtPmRldik7CisJaW50IHJjOworCisJcmMgPSBhdGFfcGNpX2RldmljZV9kb19yZXN1bWUocGRldik7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwlpZiAocGRldi0+ZGV2LnBvd2VyLnBvd2VyX3N0YXRlLmV2ZW50ID09IFBNX0VWRU5UX1NVU1BFTkQpIHsKKwkJcmMgPSBhaGNpX3Jlc2V0X2NvbnRyb2xsZXIoaG9zdCk7CisJCWlmIChyYykKKwkJCXJldHVybiByYzsKKworCQlhaGNpX2luaXRfY29udHJvbGxlcihob3N0KTsKKwl9CisKKwlhdGFfaG9zdF9yZXN1bWUoaG9zdCk7CisKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IGFjYXJkX2FoY2lfY29uZmlndXJlX2RtYV9tYXNrcyhzdHJ1Y3QgcGNpX2RldiAqcGRldiwgaW50IHVzaW5nX2RhYykKK3sKKwlpbnQgcmM7CisKKwlpZiAodXNpbmdfZGFjICYmCisJICAgICFwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIERNQV9CSVRfTUFTSyg2NCkpKSB7CisJCXJjID0gcGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKHBkZXYsIERNQV9CSVRfTUFTSyg2NCkpOworCQlpZiAocmMpIHsKKwkJCXJjID0gcGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKHBkZXYsIERNQV9CSVRfTUFTSygzMikpOworCQkJaWYgKHJjKSB7CisJCQkJZGV2X3ByaW50ayhLRVJOX0VSUiwgJnBkZXYtPmRldiwKKwkJCQkJICAgIjY0LWJpdCBETUEgZW5hYmxlIGZhaWxlZFxuIik7CisJCQkJcmV0dXJuIHJjOworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJcmMgPSBwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIERNQV9CSVRfTUFTSygzMikpOworCQlpZiAocmMpIHsKKwkJCWRldl9wcmludGsoS0VSTl9FUlIsICZwZGV2LT5kZXYsCisJCQkJICAgIjMyLWJpdCBETUEgZW5hYmxlIGZhaWxlZFxuIik7CisJCQlyZXR1cm4gcmM7CisJCX0KKwkJcmMgPSBwY2lfc2V0X2NvbnNpc3RlbnRfZG1hX21hc2socGRldiwgRE1BX0JJVF9NQVNLKDMyKSk7CisJCWlmIChyYykgeworCQkJZGV2X3ByaW50ayhLRVJOX0VSUiwgJnBkZXYtPmRldiwKKwkJCQkgICAiMzItYml0IGNvbnNpc3RlbnQgRE1BIGVuYWJsZSBmYWlsZWRcbiIpOworCQkJcmV0dXJuIHJjOworCQl9CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBhY2FyZF9haGNpX3BjaV9wcmludF9pbmZvKHN0cnVjdCBhdGFfaG9zdCAqaG9zdCkKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHRvX3BjaV9kZXYoaG9zdC0+ZGV2KTsKKwl1MTYgY2M7CisJY29uc3QgY2hhciAqc2NjX3M7CisKKwlwY2lfcmVhZF9jb25maWdfd29yZChwZGV2LCAweDBhLCAmY2MpOworCWlmIChjYyA9PSBQQ0lfQ0xBU1NfU1RPUkFHRV9JREUpCisJCXNjY19zID0gIklERSI7CisJZWxzZSBpZiAoY2MgPT0gUENJX0NMQVNTX1NUT1JBR0VfU0FUQSkKKwkJc2NjX3MgPSAiU0FUQSI7CisJZWxzZSBpZiAoY2MgPT0gUENJX0NMQVNTX1NUT1JBR0VfUkFJRCkKKwkJc2NjX3MgPSAiUkFJRCI7CisJZWxzZQorCQlzY2NfcyA9ICJ1bmtub3duIjsKKworCWFoY2lfcHJpbnRfaW5mbyhob3N0LCBzY2Nfcyk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgYWNhcmRfYWhjaV9maWxsX3NnKHN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMsIHZvaWQgKmNtZF90YmwpCit7CisJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZzsKKwlzdHJ1Y3QgYWNhcmRfc2cgKmFjYXJkX3NnID0gY21kX3RibCArIEFIQ0lfQ01EX1RCTF9IRFJfU1o7CisJdW5zaWduZWQgaW50IHNpLCBsYXN0X3NpID0gMDsKKworCVZQUklOVEsoIkVOVEVSXG4iKTsKKworCS8qCisJICogTmV4dCwgdGhlIFMvRyBsaXN0LgorCSAqLworCWZvcl9lYWNoX3NnKHFjLT5zZywgc2csIHFjLT5uX2VsZW0sIHNpKSB7CisJCWRtYV9hZGRyX3QgYWRkciA9IHNnX2RtYV9hZGRyZXNzKHNnKTsKKwkJdTMyIHNnX2xlbiA9IHNnX2RtYV9sZW4oc2cpOworCisJCS8qCisJCSAqIEFDYXJkIG5vdGU6CisJCSAqIFdlIG11c3Qgc2V0IGFuIGVuZC1vZi10YWJsZSAoRU9UKSBiaXQsCisJCSAqIGFuZCB0aGUgc2VnbWVudCBjYW5ub3QgZXhjZWVkIDY0ayAoMHgxMDAwMCkKKwkJICovCisJCWFjYXJkX3NnW3NpXS5hZGRyID0gY3B1X3RvX2xlMzIoYWRkciAmIDB4ZmZmZmZmZmYpOworCQlhY2FyZF9zZ1tzaV0uYWRkcl9oaSA9IGNwdV90b19sZTMyKChhZGRyID4+IDE2KSA+PiAxNik7CisJCWFjYXJkX3NnW3NpXS5zaXplID0gY3B1X3RvX2xlMzIoc2dfbGVuKTsKKwkJbGFzdF9zaSA9IHNpOworCX0KKworCWFjYXJkX3NnW2xhc3Rfc2ldLnNpemUgfD0gY3B1X3RvX2xlMzIoMSA8PCAzMSk7CS8qIHNldCBFT1QgKi8KKworCXJldHVybiBzaTsKK30KKworc3RhdGljIHZvaWQgYWNhcmRfYWhjaV9xY19wcmVwKHN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMpCit7CisJc3RydWN0IGF0YV9wb3J0ICphcCA9IHFjLT5hcDsKKwlzdHJ1Y3QgYWhjaV9wb3J0X3ByaXYgKnBwID0gYXAtPnByaXZhdGVfZGF0YTsKKwlpbnQgaXNfYXRhcGkgPSBhdGFfaXNfYXRhcGkocWMtPnRmLnByb3RvY29sKTsKKwl2b2lkICpjbWRfdGJsOworCXUzMiBvcHRzOworCWNvbnN0IHUzMiBjbWRfZmlzX2xlbiA9IDU7IC8qIGZpdmUgZHdvcmRzICovCisJdW5zaWduZWQgaW50IG5fZWxlbTsKKworCS8qCisJICogRmlsbCBpbiBjb21tYW5kIHRhYmxlIGluZm9ybWF0aW9uLiAgRmlyc3QsIHRoZSBoZWFkZXIsCisJICogYSBTQVRBIFJlZ2lzdGVyIC0gSG9zdCB0byBEZXZpY2UgY29tbWFuZCBGSVMuCisJICovCisJY21kX3RibCA9IHBwLT5jbWRfdGJsICsgcWMtPnRhZyAqIEFIQ0lfQ01EX1RCTF9TWjsKKworCWF0YV90Zl90b19maXMoJnFjLT50ZiwgcWMtPmRldi0+bGluay0+cG1wLCAxLCBjbWRfdGJsKTsKKwlpZiAoaXNfYXRhcGkpIHsKKwkJbWVtc2V0KGNtZF90YmwgKyBBSENJX0NNRF9UQkxfQ0RCLCAwLCAzMik7CisJCW1lbWNweShjbWRfdGJsICsgQUhDSV9DTURfVEJMX0NEQiwgcWMtPmNkYiwgcWMtPmRldi0+Y2RiX2xlbik7CisJfQorCisJbl9lbGVtID0gMDsKKwlpZiAocWMtPmZsYWdzICYgQVRBX1FDRkxBR19ETUFNQVApCisJCW5fZWxlbSA9IGFjYXJkX2FoY2lfZmlsbF9zZyhxYywgY21kX3RibCk7CisKKwkvKgorCSAqIEZpbGwgaW4gY29tbWFuZCBzbG90IGluZm9ybWF0aW9uLgorCSAqCisJICogQUNhcmQgbm90ZTogcHJkIHRhYmxlIGxlbmd0aCBub3QgZmlsbGVkIGluCisJICovCisJb3B0cyA9IGNtZF9maXNfbGVuIHwgKHFjLT5kZXYtPmxpbmstPnBtcCA8PCAxMik7CisJaWYgKHFjLT50Zi5mbGFncyAmIEFUQV9URkxBR19XUklURSkKKwkJb3B0cyB8PSBBSENJX0NNRF9XUklURTsKKwlpZiAoaXNfYXRhcGkpCisJCW9wdHMgfD0gQUhDSV9DTURfQVRBUEkgfCBBSENJX0NNRF9QUkVGRVRDSDsKKworCWFoY2lfZmlsbF9jbWRfc2xvdChwcCwgcWMtPnRhZywgb3B0cyk7Cit9CisKK3N0YXRpYyBib29sIGFjYXJkX2FoY2lfcWNfZmlsbF9ydGYoc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYykKK3sKKwlzdHJ1Y3QgYWhjaV9wb3J0X3ByaXYgKnBwID0gcWMtPmFwLT5wcml2YXRlX2RhdGE7CisJdTggKnJ4X2ZpcyA9IHBwLT5yeF9maXM7CisKKwlpZiAocHAtPmZic19lbmFibGVkKQorCQlyeF9maXMgKz0gcWMtPmRldi0+bGluay0+cG1wICogQUNBUkRfQUhDSV9SWF9GSVNfU1o7CisKKwkvKgorCSAqIEFmdGVyIGEgc3VjY2Vzc2Z1bCBleGVjdXRpb24gb2YgYW4gQVRBIFBJTyBkYXRhLWluIGNvbW1hbmQsCisJICogdGhlIGRldmljZSBkb2Vzbid0IHNlbmQgRDJIIFJlZyBGSVMgdG8gdXBkYXRlIHRoZSBURiBhbmQKKwkgKiB0aGUgaG9zdCBzaG91bGQgdGFrZSBURiBhbmQgRV9TdGF0dXMgZnJvbSB0aGUgcHJlY2VkaW5nIFBJTworCSAqIFNldHVwIEZJUy4KKwkgKi8KKwlpZiAocWMtPnRmLnByb3RvY29sID09IEFUQV9QUk9UX1BJTyAmJiBxYy0+ZG1hX2RpciA9PSBETUFfRlJPTV9ERVZJQ0UgJiYKKwkgICAgIShxYy0+ZmxhZ3MgJiBBVEFfUUNGTEFHX0ZBSUxFRCkpIHsKKwkJYXRhX3RmX2Zyb21fZmlzKHJ4X2ZpcyArIFJYX0ZJU19QSU9fU0VUVVAsICZxYy0+cmVzdWx0X3RmKTsKKwkJcWMtPnJlc3VsdF90Zi5jb21tYW5kID0gKHJ4X2ZpcyArIFJYX0ZJU19QSU9fU0VUVVApWzE1XTsKKwl9IGVsc2UKKwkJYXRhX3RmX2Zyb21fZmlzKHJ4X2ZpcyArIFJYX0ZJU19EMkhfUkVHLCAmcWMtPnJlc3VsdF90Zik7CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGludCBhY2FyZF9haGNpX3BvcnRfc3RhcnQoc3RydWN0IGF0YV9wb3J0ICphcCkKK3sKKwlzdHJ1Y3QgYWhjaV9ob3N0X3ByaXYgKmhwcml2ID0gYXAtPmhvc3QtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBhcC0+aG9zdC0+ZGV2OworCXN0cnVjdCBhaGNpX3BvcnRfcHJpdiAqcHA7CisJdm9pZCAqbWVtOworCWRtYV9hZGRyX3QgbWVtX2RtYTsKKwlzaXplX3QgZG1hX3N6LCByeF9maXNfc3o7CisKKwlwcCA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqcHApLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXBwKQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qIGNoZWNrIEZCUyBjYXBhYmlsaXR5ICovCisJaWYgKChocHJpdi0+Y2FwICYgSE9TVF9DQVBfRkJTKSAmJiBzYXRhX3BtcF9zdXBwb3J0ZWQoYXApKSB7CisJCXZvaWQgX19pb21lbSAqcG9ydF9tbWlvID0gYWhjaV9wb3J0X2Jhc2UoYXApOworCQl1MzIgY21kID0gcmVhZGwocG9ydF9tbWlvICsgUE9SVF9DTUQpOworCQlpZiAoY21kICYgUE9SVF9DTURfRkJTQ1ApCisJCQlwcC0+ZmJzX3N1cHBvcnRlZCA9IHRydWU7CisJCWVsc2UgaWYgKGhwcml2LT5mbGFncyAmIEFIQ0lfSEZMQUdfWUVTX0ZCUykgeworCQkJZGV2X3ByaW50ayhLRVJOX0lORk8sIGRldiwKKwkJCQkgICAicG9ydCAlZCBjYW4gZG8gRkJTLCBmb3JjaW5nIEZCU0NQXG4iLAorCQkJCSAgIGFwLT5wb3J0X25vKTsKKwkJCXBwLT5mYnNfc3VwcG9ydGVkID0gdHJ1ZTsKKwkJfSBlbHNlCisJCQlkZXZfcHJpbnRrKEtFUk5fV0FSTklORywgZGV2LAorCQkJCSAgICJwb3J0ICVkIGlzIG5vdCBjYXBhYmxlIG9mIEZCU1xuIiwKKwkJCQkgICBhcC0+cG9ydF9ubyk7CisJfQorCisJaWYgKHBwLT5mYnNfc3VwcG9ydGVkKSB7CisJCWRtYV9zeiA9IEFIQ0lfUE9SVF9QUklWX0ZCU19ETUFfU1o7CisJCXJ4X2Zpc19zeiA9IEFDQVJEX0FIQ0lfUlhfRklTX1NaICogMTY7CisJfSBlbHNlIHsKKwkJZG1hX3N6ID0gQUhDSV9QT1JUX1BSSVZfRE1BX1NaOworCQlyeF9maXNfc3ogPSBBQ0FSRF9BSENJX1JYX0ZJU19TWjsKKwl9CisKKwltZW0gPSBkbWFtX2FsbG9jX2NvaGVyZW50KGRldiwgZG1hX3N6LCAmbWVtX2RtYSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFtZW0pCisJCXJldHVybiAtRU5PTUVNOworCW1lbXNldChtZW0sIDAsIGRtYV9zeik7CisKKwkvKgorCSAqIEZpcnN0IGl0ZW0gaW4gY2h1bmsgb2YgRE1BIG1lbW9yeTogMzItc2xvdCBjb21tYW5kIHRhYmxlLAorCSAqIDMyIGJ5dGVzIGVhY2ggaW4gc2l6ZQorCSAqLworCXBwLT5jbWRfc2xvdCA9IG1lbTsKKwlwcC0+Y21kX3Nsb3RfZG1hID0gbWVtX2RtYTsKKworCW1lbSArPSBBSENJX0NNRF9TTE9UX1NaOworCW1lbV9kbWEgKz0gQUhDSV9DTURfU0xPVF9TWjsKKworCS8qCisJICogU2Vjb25kIGl0ZW06IFJlY2VpdmVkLUZJUyBhcmVhCisJICovCisJcHAtPnJ4X2ZpcyA9IG1lbTsKKwlwcC0+cnhfZmlzX2RtYSA9IG1lbV9kbWE7CisKKwltZW0gKz0gcnhfZmlzX3N6OworCW1lbV9kbWEgKz0gcnhfZmlzX3N6OworCisJLyoKKwkgKiBUaGlyZCBpdGVtOiBkYXRhIGFyZWEgZm9yIHN0b3JpbmcgYSBzaW5nbGUgY29tbWFuZAorCSAqIGFuZCBpdHMgc2NhdHRlci1nYXRoZXIgdGFibGUKKwkgKi8KKwlwcC0+Y21kX3RibCA9IG1lbTsKKwlwcC0+Y21kX3RibF9kbWEgPSBtZW1fZG1hOworCisJLyoKKwkgKiBTYXZlIG9mZiBpbml0aWFsIGxpc3Qgb2YgaW50ZXJydXB0cyB0byBiZSBlbmFibGVkLgorCSAqIFRoaXMgY291bGQgYmUgY2hhbmdlZCBsYXRlcgorCSAqLworCXBwLT5pbnRyX21hc2sgPSBERUZfUE9SVF9JUlE7CisKKwlhcC0+cHJpdmF0ZV9kYXRhID0gcHA7CisKKwkvKiBlbmdhZ2UgZW5naW5lcywgY2FwdGFpbiAqLworCXJldHVybiBhaGNpX3BvcnRfcmVzdW1lKGFwKTsKK30KKworc3RhdGljIGludCBhY2FyZF9haGNpX2luaXRfb25lKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQoreworCXN0YXRpYyBpbnQgcHJpbnRlZF92ZXJzaW9uOworCXVuc2lnbmVkIGludCBib2FyZF9pZCA9IGVudC0+ZHJpdmVyX2RhdGE7CisJc3RydWN0IGF0YV9wb3J0X2luZm8gcGkgPSBhY2FyZF9haGNpX3BvcnRfaW5mb1tib2FyZF9pZF07CisJY29uc3Qgc3RydWN0IGF0YV9wb3J0X2luZm8gKnBwaVtdID0geyAmcGksIE5VTEwgfTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2OworCXN0cnVjdCBhaGNpX2hvc3RfcHJpdiAqaHByaXY7CisJc3RydWN0IGF0YV9ob3N0ICpob3N0OworCWludCBuX3BvcnRzLCBpLCByYzsKKworCVZQUklOVEsoIkVOVEVSXG4iKTsKKworCVdBUk5fT04oQVRBX01BWF9RVUVVRSA+IEFIQ0lfTUFYX0NNRFMpOworCisJaWYgKCFwcmludGVkX3ZlcnNpb24rKykKKwkJZGV2X3ByaW50ayhLRVJOX0RFQlVHLCAmcGRldi0+ZGV2LCAidmVyc2lvbiAiIERSVl9WRVJTSU9OICJcbiIpOworCisJLyogYWNxdWlyZSByZXNvdXJjZXMgKi8KKwlyYyA9IHBjaW1fZW5hYmxlX2RldmljZShwZGV2KTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCS8qIEFIQ0kgY29udHJvbGxlcnMgb2Z0ZW4gaW1wbGVtZW50IFNGRiBjb21wYXRpYmxlIGludGVyZmFjZS4KKwkgKiBHcmFiIGFsbCBQQ0kgQkFScyBqdXN0IGluIGNhc2UuCisJICovCisJcmMgPSBwY2ltX2lvbWFwX3JlZ2lvbnNfcmVxdWVzdF9hbGwocGRldiwgMSA8PCBBSENJX1BDSV9CQVIsIERSVl9OQU1FKTsKKwlpZiAocmMgPT0gLUVCVVNZKQorCQlwY2ltX3Bpbl9kZXZpY2UocGRldik7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwlocHJpdiA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqaHByaXYpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWhwcml2KQorCQlyZXR1cm4gLUVOT01FTTsKKwlocHJpdi0+ZmxhZ3MgfD0gKHVuc2lnbmVkIGxvbmcpcGkucHJpdmF0ZV9kYXRhOworCisJaWYgKCEoaHByaXYtPmZsYWdzICYgQUhDSV9IRkxBR19OT19NU0kpKQorCQlwY2lfZW5hYmxlX21zaShwZGV2KTsKKworCWhwcml2LT5tbWlvID0gcGNpbV9pb21hcF90YWJsZShwZGV2KVtBSENJX1BDSV9CQVJdOworCisJLyogc2F2ZSBpbml0aWFsIGNvbmZpZyAqLworCWFoY2lfc2F2ZV9pbml0aWFsX2NvbmZpZygmcGRldi0+ZGV2LCBocHJpdiwgMCwgMCk7CisKKwkvKiBwcmVwYXJlIGhvc3QgKi8KKwlpZiAoaHByaXYtPmNhcCAmIEhPU1RfQ0FQX05DUSkKKwkJcGkuZmxhZ3MgfD0gQVRBX0ZMQUdfTkNROworCisJaWYgKGhwcml2LT5jYXAgJiBIT1NUX0NBUF9QTVApCisJCXBpLmZsYWdzIHw9IEFUQV9GTEFHX1BNUDsKKworCWFoY2lfc2V0X2VtX21lc3NhZ2VzKGhwcml2LCAmcGkpOworCisJLyogQ0FQLk5QIHNvbWV0aW1lcyBpbmRpY2F0ZSB0aGUgaW5kZXggb2YgdGhlIGxhc3QgZW5hYmxlZAorCSAqIHBvcnQsIGF0IG90aGVyIHRpbWVzLCB0aGF0IG9mIHRoZSBsYXN0IHBvc3NpYmxlIHBvcnQsIHNvCisJICogZGV0ZXJtaW5pbmcgdGhlIG1heGltdW0gcG9ydCBudW1iZXIgcmVxdWlyZXMgbG9va2luZyBhdAorCSAqIGJvdGggQ0FQLk5QIGFuZCBwb3J0X21hcC4KKwkgKi8KKwluX3BvcnRzID0gbWF4KGFoY2lfbnJfcG9ydHMoaHByaXYtPmNhcCksIGZscyhocHJpdi0+cG9ydF9tYXApKTsKKworCWhvc3QgPSBhdGFfaG9zdF9hbGxvY19waW5mbygmcGRldi0+ZGV2LCBwcGksIG5fcG9ydHMpOworCWlmICghaG9zdCkKKwkJcmV0dXJuIC1FTk9NRU07CisJaG9zdC0+cHJpdmF0ZV9kYXRhID0gaHByaXY7CisKKwlpZiAoIShocHJpdi0+Y2FwICYgSE9TVF9DQVBfU1NTKSB8fCBhaGNpX2lnbm9yZV9zc3MpCisJCWhvc3QtPmZsYWdzIHw9IEFUQV9IT1NUX1BBUkFMTEVMX1NDQU47CisJZWxzZQorCQlwcmludGsoS0VSTl9JTkZPICJhaGNpOiBTU1MgZmxhZyBzZXQsIHBhcmFsbGVsIGJ1cyBzY2FuIGRpc2FibGVkXG4iKTsKKworCWZvciAoaSA9IDA7IGkgPCBob3N0LT5uX3BvcnRzOyBpKyspIHsKKwkJc3RydWN0IGF0YV9wb3J0ICphcCA9IGhvc3QtPnBvcnRzW2ldOworCisJCWF0YV9wb3J0X3BiYXJfZGVzYyhhcCwgQUhDSV9QQ0lfQkFSLCAtMSwgImFiYXIiKTsKKwkJYXRhX3BvcnRfcGJhcl9kZXNjKGFwLCBBSENJX1BDSV9CQVIsCisJCQkJICAgMHgxMDAgKyBhcC0+cG9ydF9ubyAqIDB4ODAsICJwb3J0Iik7CisKKwkJLyogc2V0IGluaXRpYWwgbGluayBwbSBwb2xpY3kgKi8KKwkJLyoKKwkJYXAtPnBtX3BvbGljeSA9IE5PVF9BVkFJTEFCTEU7CisJCSovCisJCS8qIGRpc2FibGVkL25vdC1pbXBsZW1lbnRlZCBwb3J0ICovCisJCWlmICghKGhwcml2LT5wb3J0X21hcCAmICgxIDw8IGkpKSkKKwkJCWFwLT5vcHMgPSAmYXRhX2R1bW15X3BvcnRfb3BzOworCX0KKworCS8qIGluaXRpYWxpemUgYWRhcHRlciAqLworCXJjID0gYWNhcmRfYWhjaV9jb25maWd1cmVfZG1hX21hc2tzKHBkZXYsIGhwcml2LT5jYXAgJiBIT1NUX0NBUF82NCk7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwlyYyA9IGFoY2lfcmVzZXRfY29udHJvbGxlcihob3N0KTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCWFoY2lfaW5pdF9jb250cm9sbGVyKGhvc3QpOworCWFjYXJkX2FoY2lfcGNpX3ByaW50X2luZm8oaG9zdCk7CisKKwlwY2lfc2V0X21hc3RlcihwZGV2KTsKKwlyZXR1cm4gYXRhX2hvc3RfYWN0aXZhdGUoaG9zdCwgcGRldi0+aXJxLCBhaGNpX2ludGVycnVwdCwgSVJRRl9TSEFSRUQsCisJCQkJICZhY2FyZF9haGNpX3NodCk7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGFjYXJkX2FoY2lfaW5pdCh2b2lkKQoreworCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZhY2FyZF9haGNpX3BjaV9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgYWNhcmRfYWhjaV9leGl0KHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZhY2FyZF9haGNpX3BjaV9kcml2ZXIpOworfQorCitNT0RVTEVfQVVUSE9SKCJKZWZmIEdhcnppayIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJBQ2FyZCBBSENJIFNBVEEgbG93LWxldmVsIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIGFjYXJkX2FoY2lfcGNpX3RibCk7CitNT0RVTEVfVkVSU0lPTihEUlZfVkVSU0lPTik7CisKK21vZHVsZV9pbml0KGFjYXJkX2FoY2lfaW5pdCk7Cittb2R1bGVfZXhpdChhY2FyZF9haGNpX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvYWhjaS5oIGIvZHJpdmVycy9hdGEvYWhjaS5oCmluZGV4IDMyOWNiYmIuLjNlNjA2YzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL2FoY2kuaAorKysgYi9kcml2ZXJzL2F0YS9haGNpLmgKQEAgLTMxMSw2ICszMTEsOCBAQAogCiBleHRlcm4gc3RydWN0IGF0YV9wb3J0X29wZXJhdGlvbnMgYWhjaV9vcHM7CiAKK3ZvaWQgYWhjaV9maWxsX2NtZF9zbG90KHN0cnVjdCBhaGNpX3BvcnRfcHJpdiAqcHAsIHVuc2lnbmVkIGludCB0YWcsCisJCQl1MzIgb3B0cyk7CiB2b2lkIGFoY2lfc2F2ZV9pbml0aWFsX2NvbmZpZyhzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJCQkgICAgICBzdHJ1Y3QgYWhjaV9ob3N0X3ByaXYgKmhwcml2LAogCQkJICAgICAgdW5zaWduZWQgaW50IGZvcmNlX3BvcnRfbWFwLApAQCAtMzI2LDYgKzMyOCw3IEBACiB2b2lkIGFoY2lfc3RhcnRfZW5naW5lKHN0cnVjdCBhdGFfcG9ydCAqYXApOwogaW50IGFoY2lfY2hlY2tfcmVhZHkoc3RydWN0IGF0YV9saW5rICpsaW5rKTsKIGludCBhaGNpX2tpY2tfZW5naW5lKHN0cnVjdCBhdGFfcG9ydCAqYXApOworaW50IGFoY2lfcG9ydF9yZXN1bWUoc3RydWN0IGF0YV9wb3J0ICphcCk7CiB2b2lkIGFoY2lfc2V0X2VtX21lc3NhZ2VzKHN0cnVjdCBhaGNpX2hvc3RfcHJpdiAqaHByaXYsCiAJCQkgIHN0cnVjdCBhdGFfcG9ydF9pbmZvICpwaSk7CiBpbnQgYWhjaV9yZXNldF9lbShzdHJ1Y3QgYXRhX2hvc3QgKmhvc3QpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvbGliYWhjaS5jIGIvZHJpdmVycy9hdGEvbGliYWhjaS5jCmluZGV4IGViYzA4ZDYuLjI2ZDQ1MjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL2xpYmFoY2kuYworKysgYi9kcml2ZXJzL2F0YS9saWJhaGNpLmMKQEAgLTg3LDEwICs4Nyw3IEBACiBzdGF0aWMgdm9pZCBhaGNpX3Bvc3RyZXNldChzdHJ1Y3QgYXRhX2xpbmsgKmxpbmssIHVuc2lnbmVkIGludCAqY2xhc3MpOwogc3RhdGljIHZvaWQgYWhjaV9lcnJvcl9oYW5kbGVyKHN0cnVjdCBhdGFfcG9ydCAqYXApOwogc3RhdGljIHZvaWQgYWhjaV9wb3N0X2ludGVybmFsX2NtZChzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjKTsKLXN0YXRpYyBpbnQgYWhjaV9wb3J0X3Jlc3VtZShzdHJ1Y3QgYXRhX3BvcnQgKmFwKTsKIHN0YXRpYyB2b2lkIGFoY2lfZGV2X2NvbmZpZyhzdHJ1Y3QgYXRhX2RldmljZSAqZGV2KTsKLXN0YXRpYyB2b2lkIGFoY2lfZmlsbF9jbWRfc2xvdChzdHJ1Y3QgYWhjaV9wb3J0X3ByaXYgKnBwLCB1bnNpZ25lZCBpbnQgdGFnLAotCQkJICAgICAgIHUzMiBvcHRzKTsKICNpZmRlZiBDT05GSUdfUE0KIHN0YXRpYyBpbnQgYWhjaV9wb3J0X3N1c3BlbmQoc3RydWN0IGF0YV9wb3J0ICphcCwgcG1fbWVzc2FnZV90IG1lc2cpOwogI2VuZGlmCkBAIC0xMTMzLDggKzExMzAsOCBAQAogCXJldHVybiBhdGFfZGV2X2NsYXNzaWZ5KCZ0Zik7CiB9CiAKLXN0YXRpYyB2b2lkIGFoY2lfZmlsbF9jbWRfc2xvdChzdHJ1Y3QgYWhjaV9wb3J0X3ByaXYgKnBwLCB1bnNpZ25lZCBpbnQgdGFnLAotCQkJICAgICAgIHUzMiBvcHRzKQordm9pZCBhaGNpX2ZpbGxfY21kX3Nsb3Qoc3RydWN0IGFoY2lfcG9ydF9wcml2ICpwcCwgdW5zaWduZWQgaW50IHRhZywKKwkJCXUzMiBvcHRzKQogewogCWRtYV9hZGRyX3QgY21kX3RibF9kbWE7CiAKQEAgLTExNDUsNiArMTE0Miw3IEBACiAJcHAtPmNtZF9zbG90W3RhZ10udGJsX2FkZHIgPSBjcHVfdG9fbGUzMihjbWRfdGJsX2RtYSAmIDB4ZmZmZmZmZmYpOwogCXBwLT5jbWRfc2xvdFt0YWddLnRibF9hZGRyX2hpID0gY3B1X3RvX2xlMzIoKGNtZF90YmxfZG1hID4+IDE2KSA+PiAxNik7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChhaGNpX2ZpbGxfY21kX3Nsb3QpOwogCiBpbnQgYWhjaV9raWNrX2VuZ2luZShzdHJ1Y3QgYXRhX3BvcnQgKmFwKQogewpAQCAtMTkxOCw3ICsxOTE2LDcgQEAKIAl3cml0ZWwocHAtPmludHJfbWFzaywgcG9ydF9tbWlvICsgUE9SVF9JUlFfTUFTSyk7CiB9CiAKLXN0YXRpYyBpbnQgYWhjaV9wb3J0X3Jlc3VtZShzdHJ1Y3QgYXRhX3BvcnQgKmFwKQoraW50IGFoY2lfcG9ydF9yZXN1bWUoc3RydWN0IGF0YV9wb3J0ICphcCkKIHsKIAlhaGNpX3Bvd2VyX3VwKGFwKTsKIAlhaGNpX3N0YXJ0X3BvcnQoYXApOwpAQCAtMTkzMCw2ICsxOTI4LDcgQEAKIAogCXJldHVybiAwOwogfQorRVhQT1JUX1NZTUJPTF9HUEwoYWhjaV9wb3J0X3Jlc3VtZSk7CiAKICNpZmRlZiBDT05GSUdfUE0KIHN0YXRpYyBpbnQgYWhjaV9wb3J0X3N1c3BlbmQoc3RydWN0IGF0YV9wb3J0ICphcCwgcG1fbWVzc2FnZV90IG1lc2cpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9saWJhdGEtc2NzaS5jIGIvZHJpdmVycy9hdGEvbGliYXRhLXNjc2kuYwppbmRleCA2NmFhNGJlLi41ZGVmYzc0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9saWJhdGEtc2NzaS5jCisrKyBiL2RyaXZlcnMvYXRhL2xpYmF0YS1zY3NpLmMKQEAgLTM0NiwxMiArMzQ2LDExIEBACiB9OwogRVhQT1JUX1NZTUJPTF9HUEwoYXRhX2NvbW1vbl9zZGV2X2F0dHJzKTsKIAotc3RhdGljIHZvaWQgYXRhX3Njc2lfaW52YWxpZF9maWVsZChzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQsCi0JCQkJICAgdm9pZCAoKmRvbmUpKHN0cnVjdCBzY3NpX2NtbmQgKikpCitzdGF0aWMgdm9pZCBhdGFfc2NzaV9pbnZhbGlkX2ZpZWxkKHN0cnVjdCBzY3NpX2NtbmQgKmNtZCkKIHsKIAlhdGFfc2NzaV9zZXRfc2Vuc2UoY21kLCBJTExFR0FMX1JFUVVFU1QsIDB4MjQsIDB4MCk7CiAJLyogIkludmFsaWQgZmllbGQgaW4gY2JkIiAqLwotCWRvbmUoY21kKTsKKwljbWQtPnNjc2lfZG9uZShjbWQpOwogfQogCiAvKioKQEAgLTcxOSw3ICs3MTgsNiBAQAogICoJYXRhX3Njc2lfcWNfbmV3IC0gYWNxdWlyZSBuZXcgYXRhX3F1ZXVlZF9jbWQgcmVmZXJlbmNlCiAgKglAZGV2OiBBVEEgZGV2aWNlIHRvIHdoaWNoIHRoZSBuZXcgY29tbWFuZCBpcyBhdHRhY2hlZAogICoJQGNtZDogU0NTSSBjb21tYW5kIHRoYXQgb3JpZ2luYXRlZCB0aGlzIEFUQSBjb21tYW5kCi0gKglAZG9uZTogU0NTSSBjb21tYW5kIGNvbXBsZXRpb24gZnVuY3Rpb24KICAqCiAgKglPYnRhaW4gYSByZWZlcmVuY2UgdG8gYW4gdW51c2VkIGF0YV9xdWV1ZWRfY21kIHN0cnVjdHVyZSwKICAqCXdoaWNoIGlzIHRoZSBiYXNpYyBsaWJhdGEgc3RydWN0dXJlIHJlcHJlc2VudGluZyBhIHNpbmdsZQpAQCAtNzM2LDIxICs3MzQsMjAgQEAKICAqCUNvbW1hbmQgYWxsb2NhdGVkLCBvciAlTlVMTCBpZiBub25lIGF2YWlsYWJsZS4KICAqLwogc3RhdGljIHN0cnVjdCBhdGFfcXVldWVkX2NtZCAqYXRhX3Njc2lfcWNfbmV3KHN0cnVjdCBhdGFfZGV2aWNlICpkZXYsCi0JCQkJCSAgICAgIHN0cnVjdCBzY3NpX2NtbmQgKmNtZCwKLQkJCQkJICAgICAgdm9pZCAoKmRvbmUpKHN0cnVjdCBzY3NpX2NtbmQgKikpCisJCQkJCSAgICAgIHN0cnVjdCBzY3NpX2NtbmQgKmNtZCkKIHsKIAlzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjOwogCiAJcWMgPSBhdGFfcWNfbmV3X2luaXQoZGV2KTsKIAlpZiAocWMpIHsKIAkJcWMtPnNjc2ljbWQgPSBjbWQ7Ci0JCXFjLT5zY3NpZG9uZSA9IGRvbmU7CisJCXFjLT5zY3NpZG9uZSA9IGNtZC0+c2NzaV9kb25lOwogCiAJCXFjLT5zZyA9IHNjc2lfc2dsaXN0KGNtZCk7CiAJCXFjLT5uX2VsZW0gPSBzY3NpX3NnX2NvdW50KGNtZCk7CiAJfSBlbHNlIHsKIAkJY21kLT5yZXN1bHQgPSAoRElEX09LIDw8IDE2KSB8IChRVUVVRV9GVUxMIDw8IDEpOwotCQlkb25lKGNtZCk7CisJCWNtZC0+c2NzaV9kb25lKGNtZCk7CiAJfQogCiAJcmV0dXJuIHFjOwpAQCAtMTczNSw3ICsxNzMyLDYgQEAKICAqCWF0YV9zY3NpX3RyYW5zbGF0ZSAtIFRyYW5zbGF0ZSB0aGVuIGlzc3VlIFNDU0kgY29tbWFuZCB0byBBVEEgZGV2aWNlCiAgKglAZGV2OiBBVEEgZGV2aWNlIHRvIHdoaWNoIHRoZSBjb21tYW5kIGlzIGFkZHJlc3NlZAogICoJQGNtZDogU0NTSSBjb21tYW5kIHRvIGV4ZWN1dGUKLSAqCUBkb25lOiBTQ1NJIGNvbW1hbmQgY29tcGxldGlvbiBmdW5jdGlvbgogICoJQHhsYXRfZnVuYzogQWN0b3Igd2hpY2ggdHJhbnNsYXRlcyBAY21kIHRvIGFuIEFUQSB0YXNrZmlsZQogICoKICAqCU91ciAtPnF1ZXVlY29tbWFuZCgpIGZ1bmN0aW9uIGhhcyBkZWNpZGVkIHRoYXQgdGhlIFNDU0kKQEAgLTE3NTksNyArMTc1NSw2IEBACiAgKgluZWVkcyB0byBiZSBkZWZlcnJlZC4KICAqLwogc3RhdGljIGludCBhdGFfc2NzaV90cmFuc2xhdGUoc3RydWN0IGF0YV9kZXZpY2UgKmRldiwgc3RydWN0IHNjc2lfY21uZCAqY21kLAotCQkJICAgICAgdm9pZCAoKmRvbmUpKHN0cnVjdCBzY3NpX2NtbmQgKiksCiAJCQkgICAgICBhdGFfeGxhdF9mdW5jX3QgeGxhdF9mdW5jKQogewogCXN0cnVjdCBhdGFfcG9ydCAqYXAgPSBkZXYtPmxpbmstPmFwOwpAQCAtMTc2OCw3ICsxNzYzLDcgQEAKIAogCVZQUklOVEsoIkVOVEVSXG4iKTsKIAotCXFjID0gYXRhX3Njc2lfcWNfbmV3KGRldiwgY21kLCBkb25lKTsKKwlxYyA9IGF0YV9zY3NpX3FjX25ldyhkZXYsIGNtZCk7CiAJaWYgKCFxYykKIAkJZ290byBlcnJfbWVtOwogCkBAIC0xODA0LDE0ICsxNzk5LDE0IEBACiAKIGVhcmx5X2ZpbmlzaDoKIAlhdGFfcWNfZnJlZShxYyk7Ci0JcWMtPnNjc2lkb25lKGNtZCk7CisJY21kLT5zY3NpX2RvbmUoY21kKTsKIAlEUFJJTlRLKCJFWElUIC0gZWFybHkgZmluaXNoIChnb29kIG9yIGVycm9yKVxuIik7CiAJcmV0dXJuIDA7CiAKIGVycl9kaWQ6CiAJYXRhX3FjX2ZyZWUocWMpOwogCWNtZC0+cmVzdWx0ID0gKERJRF9FUlJPUiA8PCAxNik7Ci0JcWMtPnNjc2lkb25lKGNtZCk7CisJY21kLT5zY3NpX2RvbmUoY21kKTsKIGVycl9tZW06CiAJRFBSSU5USygiRVhJVCAtIGludGVybmFsXG4iKTsKIAlyZXR1cm4gMDsKQEAgLTMxMTYsNyArMzExMSw2IEBACiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IF9fYXRhX3Njc2lfcXVldWVjbWQoc3RydWN0IHNjc2lfY21uZCAqc2NtZCwKLQkJCQkgICAgICB2b2lkICgqZG9uZSkoc3RydWN0IHNjc2lfY21uZCAqKSwKIAkJCQkgICAgICBzdHJ1Y3QgYXRhX2RldmljZSAqZGV2KQogewogCXU4IHNjc2lfb3AgPSBzY21kLT5jbW5kWzBdOwpAQCAtMzE1MCw5ICszMTQ0LDkgQEAKIAl9CiAKIAlpZiAoeGxhdF9mdW5jKQotCQlyYyA9IGF0YV9zY3NpX3RyYW5zbGF0ZShkZXYsIHNjbWQsIGRvbmUsIHhsYXRfZnVuYyk7CisJCXJjID0gYXRhX3Njc2lfdHJhbnNsYXRlKGRldiwgc2NtZCwgeGxhdF9mdW5jKTsKIAllbHNlCi0JCWF0YV9zY3NpX3NpbXVsYXRlKGRldiwgc2NtZCwgZG9uZSk7CisJCWF0YV9zY3NpX3NpbXVsYXRlKGRldiwgc2NtZCk7CiAKIAlyZXR1cm4gcmM7CiAKQEAgLTMxNjAsNyArMzE1NCw3IEBACiAJRFBSSU5USygiYmFkIENEQiBsZW49JXUsIHNjc2lfb3A9MHglMDJ4LCBtYXg9JXVcbiIsCiAJCXNjbWQtPmNtZF9sZW4sIHNjc2lfb3AsIGRldi0+Y2RiX2xlbik7CiAJc2NtZC0+cmVzdWx0ID0gRElEX0VSUk9SIDw8IDE2OwotCWRvbmUoc2NtZCk7CisJc2NtZC0+c2NzaV9kb25lKHNjbWQpOwogCXJldHVybiAwOwogfQogCkBAIC0zMTk5LDcgKzMxOTMsNyBAQAogCiAJZGV2ID0gYXRhX3Njc2lfZmluZF9kZXYoYXAsIHNjc2lkZXYpOwogCWlmIChsaWtlbHkoZGV2KSkKLQkJcmMgPSBfX2F0YV9zY3NpX3F1ZXVlY21kKGNtZCwgY21kLT5zY3NpX2RvbmUsIGRldik7CisJCXJjID0gX19hdGFfc2NzaV9xdWV1ZWNtZChjbWQsIGRldik7CiAJZWxzZSB7CiAJCWNtZC0+cmVzdWx0ID0gKERJRF9CQURfVEFSR0VUIDw8IDE2KTsKIAkJY21kLT5zY3NpX2RvbmUoY21kKTsKQEAgLTMyMTQsNyArMzIwOCw2IEBACiAgKglhdGFfc2NzaV9zaW11bGF0ZSAtIHNpbXVsYXRlIFNDU0kgY29tbWFuZCBvbiBBVEEgZGV2aWNlCiAgKglAZGV2OiB0aGUgdGFyZ2V0IGRldmljZQogICoJQGNtZDogU0NTSSBjb21tYW5kIGJlaW5nIHNlbnQgdG8gZGV2aWNlLgotICoJQGRvbmU6IFNDU0kgY29tbWFuZCBjb21wbGV0aW9uIGZ1bmN0aW9uLgogICoKICAqCUludGVycHJldHMgYW5kIGRpcmVjdGx5IGV4ZWN1dGVzIGEgc2VsZWN0IGxpc3Qgb2YgU0NTSSBjb21tYW5kcwogICoJdGhhdCBjYW4gYmUgaGFuZGxlZCBpbnRlcm5hbGx5LgpAQCAtMzIyMyw4ICszMjE2LDcgQEAKICAqCXNwaW5fbG9ja19pcnFzYXZlKGhvc3QgbG9jaykKICAqLwogCi12b2lkIGF0YV9zY3NpX3NpbXVsYXRlKHN0cnVjdCBhdGFfZGV2aWNlICpkZXYsIHN0cnVjdCBzY3NpX2NtbmQgKmNtZCwKLQkJICAgICAgdm9pZCAoKmRvbmUpKHN0cnVjdCBzY3NpX2NtbmQgKikpCit2b2lkIGF0YV9zY3NpX3NpbXVsYXRlKHN0cnVjdCBhdGFfZGV2aWNlICpkZXYsIHN0cnVjdCBzY3NpX2NtbmQgKmNtZCkKIHsKIAlzdHJ1Y3QgYXRhX3Njc2lfYXJncyBhcmdzOwogCWNvbnN0IHU4ICpzY3NpY21kID0gY21kLT5jbW5kOwpAQCAtMzIzMywxNyArMzIyNSwxNyBAQAogCWFyZ3MuZGV2ID0gZGV2OwogCWFyZ3MuaWQgPSBkZXYtPmlkOwogCWFyZ3MuY21kID0gY21kOwotCWFyZ3MuZG9uZSA9IGRvbmU7CisJYXJncy5kb25lID0gY21kLT5zY3NpX2RvbmU7CiAKIAlzd2l0Y2goc2NzaWNtZFswXSkgewogCS8qIFRPRE86IHdvcnRoIGltcHJvdmluZz8gKi8KIAljYXNlIEZPUk1BVF9VTklUOgotCQlhdGFfc2NzaV9pbnZhbGlkX2ZpZWxkKGNtZCwgZG9uZSk7CisJCWF0YV9zY3NpX2ludmFsaWRfZmllbGQoY21kKTsKIAkJYnJlYWs7CiAKIAljYXNlIElOUVVJUlk6CiAJCWlmIChzY3NpY21kWzFdICYgMikJICAgICAgICAgICAvKiBpcyBDbWREdCBzZXQ/ICAqLwotCQkJYXRhX3Njc2lfaW52YWxpZF9maWVsZChjbWQsIGRvbmUpOworCQkJYXRhX3Njc2lfaW52YWxpZF9maWVsZChjbWQpOwogCQllbHNlIGlmICgoc2NzaWNtZFsxXSAmIDEpID09IDApICAgIC8qIGlzIEVWUEQgY2xlYXI/ICovCiAJCQlhdGFfc2NzaV9yYnVmX2ZpbGwoJmFyZ3MsIGF0YV9zY3Npb3BfaW5xX3N0ZCk7CiAJCWVsc2Ugc3dpdGNoIChzY3NpY21kWzJdKSB7CkBAIC0zMjY5LDcgKzMyNjEsNyBAQAogCQkJYXRhX3Njc2lfcmJ1Zl9maWxsKCZhcmdzLCBhdGFfc2NzaW9wX2lucV9iMik7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKLQkJCWF0YV9zY3NpX2ludmFsaWRfZmllbGQoY21kLCBkb25lKTsKKwkJCWF0YV9zY3NpX2ludmFsaWRfZmllbGQoY21kKTsKIAkJCWJyZWFrOwogCQl9CiAJCWJyZWFrOwpAQCAtMzI4MSw3ICszMjczLDcgQEAKIAogCWNhc2UgTU9ERV9TRUxFQ1Q6CS8qIHVuY29uZGl0aW9uYWxseSByZXR1cm4gKi8KIAljYXNlIE1PREVfU0VMRUNUXzEwOgkvKiBiYWQtZmllbGQtaW4tY2RiICovCi0JCWF0YV9zY3NpX2ludmFsaWRfZmllbGQoY21kLCBkb25lKTsKKwkJYXRhX3Njc2lfaW52YWxpZF9maWVsZChjbWQpOwogCQlicmVhazsKIAogCWNhc2UgUkVBRF9DQVBBQ0lUWToKQEAgLTMyOTIsNyArMzI4NCw3IEBACiAJCWlmICgoc2NzaWNtZFsxXSAmIDB4MWYpID09IFNBSV9SRUFEX0NBUEFDSVRZXzE2KQogCQkJYXRhX3Njc2lfcmJ1Zl9maWxsKCZhcmdzLCBhdGFfc2NzaW9wX3JlYWRfY2FwKTsKIAkJZWxzZQotCQkJYXRhX3Njc2lfaW52YWxpZF9maWVsZChjbWQsIGRvbmUpOworCQkJYXRhX3Njc2lfaW52YWxpZF9maWVsZChjbWQpOwogCQlicmVhazsKIAogCWNhc2UgUkVQT1JUX0xVTlM6CkBAIC0zMzAyLDcgKzMyOTQsNyBAQAogCWNhc2UgUkVRVUVTVF9TRU5TRToKIAkJYXRhX3Njc2lfc2V0X3NlbnNlKGNtZCwgMCwgMCwgMCk7CiAJCWNtZC0+cmVzdWx0ID0gKERSSVZFUl9TRU5TRSA8PCAyNCk7Ci0JCWRvbmUoY21kKTsKKwkJY21kLT5zY3NpX2RvbmUoY21kKTsKIAkJYnJlYWs7CiAKIAkvKiBpZiB3ZSByZWFjaCB0aGlzLCB0aGVuIHdyaXRlYmFjayBjYWNoaW5nIGlzIGRpc2FibGVkLApAQCAtMzMyNCwxNCArMzMxNiwxNCBAQAogCQlpZiAoKHRtcDggPT0gMHg0KSAmJiAoIXNjc2ljbWRbM10pICYmICghc2NzaWNtZFs0XSkpCiAJCQlhdGFfc2NzaV9yYnVmX2ZpbGwoJmFyZ3MsIGF0YV9zY3Npb3Bfbm9vcCk7CiAJCWVsc2UKLQkJCWF0YV9zY3NpX2ludmFsaWRfZmllbGQoY21kLCBkb25lKTsKKwkJCWF0YV9zY3NpX2ludmFsaWRfZmllbGQoY21kKTsKIAkJYnJlYWs7CiAKIAkvKiBhbGwgb3RoZXIgY29tbWFuZHMgKi8KIAlkZWZhdWx0OgogCQlhdGFfc2NzaV9zZXRfc2Vuc2UoY21kLCBJTExFR0FMX1JFUVVFU1QsIDB4MjAsIDB4MCk7CiAJCS8qICJJbnZhbGlkIGNvbW1hbmQgb3BlcmF0aW9uIGNvZGUiICovCi0JCWRvbmUoY21kKTsKKwkJY21kLT5zY3NpX2RvbmUoY21kKTsKIAkJYnJlYWs7CiAJfQogfQpAQCAtMzg1OCw3ICszODUwLDYgQEAKIC8qKgogICoJYXRhX3Nhc19xdWV1ZWNtZCAtIElzc3VlIFNDU0kgY2RiIHRvIGxpYmF0YS1tYW5hZ2VkIGRldmljZQogICoJQGNtZDogU0NTSSBjb21tYW5kIHRvIGJlIHNlbnQKLSAqCUBkb25lOiBDb21wbGV0aW9uIGZ1bmN0aW9uLCBjYWxsZWQgd2hlbiBjb21tYW5kIGlzIGNvbXBsZXRlCiAgKglAYXA6CUFUQSBwb3J0IHRvIHdoaWNoIHRoZSBjb21tYW5kIGlzIGJlaW5nIHNlbnQKICAqCiAgKglSRVRVUk5TOgpAQCAtMzg2NiwxOCArMzg1NywxNyBAQAogICoJMCBvdGhlcndpc2UuCiAgKi8KIAotaW50IGF0YV9zYXNfcXVldWVjbWQoc3RydWN0IHNjc2lfY21uZCAqY21kLCB2b2lkICgqZG9uZSkoc3RydWN0IHNjc2lfY21uZCAqKSwKLQkJICAgICBzdHJ1Y3QgYXRhX3BvcnQgKmFwKQoraW50IGF0YV9zYXNfcXVldWVjbWQoc3RydWN0IHNjc2lfY21uZCAqY21kLCBzdHJ1Y3QgYXRhX3BvcnQgKmFwKQogewogCWludCByYyA9IDA7CiAKIAlhdGFfc2NzaV9kdW1wX2NkYihhcCwgY21kKTsKIAogCWlmIChsaWtlbHkoYXRhX2Rldl9lbmFibGVkKGFwLT5saW5rLmRldmljZSkpKQotCQlyYyA9IF9fYXRhX3Njc2lfcXVldWVjbWQoY21kLCBkb25lLCBhcC0+bGluay5kZXZpY2UpOworCQlyYyA9IF9fYXRhX3Njc2lfcXVldWVjbWQoY21kLCBhcC0+bGluay5kZXZpY2UpOwogCWVsc2UgewogCQljbWQtPnJlc3VsdCA9IChESURfQkFEX1RBUkdFVCA8PCAxNik7Ci0JCWRvbmUoY21kKTsKKwkJY21kLT5zY3NpX2RvbmUoY21kKTsKIAl9CiAJcmV0dXJuIHJjOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9ocHQzNjYuYyBiL2RyaXZlcnMvYXRhL3BhdGFfaHB0MzY2LmMKaW5kZXggNzY4ODg2OC4uZDdlNTdkYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvcGF0YV9ocHQzNjYuYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX2hwdDM2Ni5jCkBAIC0yNSw3ICsyNSw3IEBACiAjaW5jbHVkZSA8bGludXgvbGliYXRhLmg+CiAKICNkZWZpbmUgRFJWX05BTUUJInBhdGFfaHB0MzY2IgotI2RlZmluZSBEUlZfVkVSU0lPTgkiMC42LjgiCisjZGVmaW5lIERSVl9WRVJTSU9OCSIwLjYuOSIKIAogc3RydWN0IGhwdF9jbG9jayB7CiAJdTgJeGZlcl9tb2RlOwpAQCAtMTEwLDE4ICsxMTAsMjMgQEAKIAl7CTAsCQkweDAxMjA4NTg1CX0KIH07CiAKLXN0YXRpYyBjb25zdCBjaGFyICpiYWRfYXRhMzNbXSA9IHsKLQkiTWF4dG9yIDkyNzIwVTgiLCAiTWF4dG9yIDkyMDQwVTYiLCAiTWF4dG9yIDkxMzYwVTQiLCAiTWF4dG9yIDkxMDIwVTMiLCAiTWF4dG9yIDkwODQ1VTMiLCAiTWF4dG9yIDkwNjUwVTIiLAotCSJNYXh0b3IgOTEzNjBEOCIsICJNYXh0b3IgOTExOTBENyIsICJNYXh0b3IgOTEwMjBENiIsICJNYXh0b3IgOTA4NDVENSIsICJNYXh0b3IgOTA2ODBENCIsICJNYXh0b3IgOTA1MTBEMyIsICJNYXh0b3IgOTAzNDBEMiIsCi0JIk1heHRvciA5MTE1MkQ4IiwgIk1heHRvciA5MTAwOEQ3IiwgIk1heHRvciA5MDg0NUQ2IiwgIk1heHRvciA5MDg0MEQ2IiwgIk1heHRvciA5MDcyMEQ1IiwgIk1heHRvciA5MDY0OEQ1IiwgIk1heHRvciA5MDU3NkQ0IiwKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgYmFkX2F0YTMzW10gPSB7CisJIk1heHRvciA5MjcyMFU4IiwgIk1heHRvciA5MjA0MFU2IiwgIk1heHRvciA5MTM2MFU0IiwgIk1heHRvciA5MTAyMFUzIiwKKwkiTWF4dG9yIDkwODQ1VTMiLCAiTWF4dG9yIDkwNjUwVTIiLAorCSJNYXh0b3IgOTEzNjBEOCIsICJNYXh0b3IgOTExOTBENyIsICJNYXh0b3IgOTEwMjBENiIsICJNYXh0b3IgOTA4NDVENSIsCisJIk1heHRvciA5MDY4MEQ0IiwgIk1heHRvciA5MDUxMEQzIiwgIk1heHRvciA5MDM0MEQyIiwKKwkiTWF4dG9yIDkxMTUyRDgiLCAiTWF4dG9yIDkxMDA4RDciLCAiTWF4dG9yIDkwODQ1RDYiLCAiTWF4dG9yIDkwODQwRDYiLAorCSJNYXh0b3IgOTA3MjBENSIsICJNYXh0b3IgOTA2NDhENSIsICJNYXh0b3IgOTA1NzZENCIsCiAJIk1heHRvciA5MDUxMEQ0IiwKIAkiTWF4dG9yIDkwNDMyRDMiLCAiTWF4dG9yIDkwMjg4RDIiLCAiTWF4dG9yIDkwMjU2RDIiLAotCSJNYXh0b3IgOTEwMDBEOCIsICJNYXh0b3IgOTA5MTBEOCIsICJNYXh0b3IgOTA4NzVENyIsICJNYXh0b3IgOTA4NDBENyIsICJNYXh0b3IgOTA3NTBENiIsICJNYXh0b3IgOTA2MjVENSIsICJNYXh0b3IgOTA1MDBENCIsCi0JIk1heHRvciA5MTcyOEQ4IiwgIk1heHRvciA5MTUxMkQ3IiwgIk1heHRvciA5MTMwM0Q2IiwgIk1heHRvciA5MTA4MEQ1IiwgIk1heHRvciA5MDg0NUQ0IiwgIk1heHRvciA5MDY4MEQ0IiwgIk1heHRvciA5MDY0OEQzIiwgIk1heHRvciA5MDQzMkQyIiwKKwkiTWF4dG9yIDkxMDAwRDgiLCAiTWF4dG9yIDkwOTEwRDgiLCAiTWF4dG9yIDkwODc1RDciLCAiTWF4dG9yIDkwODQwRDciLAorCSJNYXh0b3IgOTA3NTBENiIsICJNYXh0b3IgOTA2MjVENSIsICJNYXh0b3IgOTA1MDBENCIsCisJIk1heHRvciA5MTcyOEQ4IiwgIk1heHRvciA5MTUxMkQ3IiwgIk1heHRvciA5MTMwM0Q2IiwgIk1heHRvciA5MTA4MEQ1IiwKKwkiTWF4dG9yIDkwODQ1RDQiLCAiTWF4dG9yIDkwNjgwRDQiLCAiTWF4dG9yIDkwNjQ4RDMiLCAiTWF4dG9yIDkwNDMyRDIiLAogCU5VTEwKIH07CiAKLXN0YXRpYyBjb25zdCBjaGFyICpiYWRfYXRhNjZfNFtdID0geworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBiYWRfYXRhNjZfNFtdID0gewogCSJJQk0tRFRMQS0zMDcwNzUiLAogCSJJQk0tRFRMQS0zMDcwNjAiLAogCSJJQk0tRFRMQS0zMDcwNDUiLApAQCAtMTQwLDEyICsxNDUsMTMgQEAKIAlOVUxMCiB9OwogCi1zdGF0aWMgY29uc3QgY2hhciAqYmFkX2F0YTY2XzNbXSA9IHsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgYmFkX2F0YTY2XzNbXSA9IHsKIAkiV0RDIEFDMzEwMjAwUiIsCiAJTlVMTAogfTsKIAotc3RhdGljIGludCBocHRfZG1hX2JsYWNrbGlzdGVkKGNvbnN0IHN0cnVjdCBhdGFfZGV2aWNlICpkZXYsIGNoYXIgKm1vZGVzdHIsIGNvbnN0IGNoYXIgKmxpc3RbXSkKK3N0YXRpYyBpbnQgaHB0X2RtYV9ibGFja2xpc3RlZChjb25zdCBzdHJ1Y3QgYXRhX2RldmljZSAqZGV2LCBjaGFyICptb2Rlc3RyLAorCQkJICAgICAgIGNvbnN0IGNoYXIgKiBjb25zdCBsaXN0W10pCiB7CiAJdW5zaWduZWQgY2hhciBtb2RlbF9udW1bQVRBX0lEX1BST0RfTEVOICsgMV07CiAJaW50IGkgPSAwOwpAQCAtMjg4LDYgKzI5NCw3IEBACiBzdGF0aWMgdm9pZCBocHQzNnhfaW5pdF9jaGlwc2V0KHN0cnVjdCBwY2lfZGV2ICpkZXYpCiB7CiAJdTggZHJpdmVfZmFzdDsKKwogCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIFBDSV9DQUNIRV9MSU5FX1NJWkUsIChMMV9DQUNIRV9CWVRFUyAvIDQpKTsKIAlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCBQQ0lfTEFURU5DWV9USU1FUiwgMHg3OCk7CiAJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgUENJX01JTl9HTlQsIDB4MDgpOwpAQCAtMzQ5LDE2ICszNTYsMTYgQEAKIAogCS8qIFBDSSBjbG9ja2luZyBkZXRlcm1pbmVzIHRoZSBBVEEgdGltaW5nIHZhbHVlcyB0byB1c2UgKi8KIAkvKiBpbmZvX2hwdDM2NiBpcyBzYWZlIGFnYWluc3QgcmUtZW50cnkgc28gd2UgY2FuIHNjcmliYmxlIG9uIGl0ICovCi0Jc3dpdGNoKChyZWcxICYgMHg3MDApID4+IDgpIHsKLQkJY2FzZSA5OgotCQkJaHByaXYgPSAmaHB0MzY2XzQwOwotCQkJYnJlYWs7Ci0JCWNhc2UgNToKLQkJCWhwcml2ID0gJmhwdDM2Nl8yNTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJaHByaXYgPSAmaHB0MzY2XzMzOwotCQkJYnJlYWs7CisJc3dpdGNoICgocmVnMSAmIDB4NzAwKSA+PiA4KSB7CisJY2FzZSA5OgorCQlocHJpdiA9ICZocHQzNjZfNDA7CisJCWJyZWFrOworCWNhc2UgNToKKwkJaHByaXYgPSAmaHB0MzY2XzI1OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlocHJpdiA9ICZocHQzNjZfMzM7CisJCWJyZWFrOwogCX0KIAkvKiBOb3cga2ljayBvZmYgQVRBIHNldCB1cCAqLwogCXJldHVybiBhdGFfcGNpX2JtZG1hX2luaXRfb25lKGRldiwgcHBpLCAmaHB0MzZ4X3NodCwgaHByaXYsIDApOwpAQCAtMzg1LDkgKzM5Miw5IEBACiB9OwogCiBzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgaHB0MzZ4X3BjaV9kcml2ZXIgPSB7Ci0JLm5hbWUgCQk9IERSVl9OQU1FLAorCS5uYW1lCQk9IERSVl9OQU1FLAogCS5pZF90YWJsZQk9IGhwdDM2eCwKLQkucHJvYmUgCQk9IGhwdDM2eF9pbml0X29uZSwKKwkucHJvYmUJCT0gaHB0MzZ4X2luaXRfb25lLAogCS5yZW1vdmUJCT0gYXRhX3BjaV9yZW1vdmVfb25lLAogI2lmZGVmIENPTkZJR19QTQogCS5zdXNwZW5kCT0gYXRhX3BjaV9kZXZpY2Vfc3VzcGVuZCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3BhdGFfaHB0Mzd4LmMgYi9kcml2ZXJzL2F0YS9wYXRhX2hwdDM3eC5jCmluZGV4IDlhZTRjMDguLmVmZGQxOGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfaHB0Mzd4LmMKKysrIGIvZHJpdmVycy9hdGEvcGF0YV9ocHQzN3guYwpAQCAtOCw3ICs4LDcgQEAKICAqIENvcHlyaWdodCAoQykgMTk5OS0yMDAzCQlBbmRyZSBIZWRyaWNrIDxhbmRyZUBsaW51eC1pZGUub3JnPgogICogUG9ydGlvbnMgQ29weXJpZ2h0IChDKSAyMDAxCSAgICAgICAgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLgogICogUG9ydGlvbnMgQ29weXJpZ2h0IChDKSAyMDAzCQlSZWQgSGF0IEluYwotICogUG9ydGlvbnMgQ29weXJpZ2h0IChDKSAyMDA1LTIwMDkJTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLgorICogUG9ydGlvbnMgQ29weXJpZ2h0IChDKSAyMDA1LTIwMTAJTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLgogICoKICAqIFRPRE8KICAqCUxvb2sgaW50byBlbmdpbmUgcmVzZXQgb24gdGltZW91dCBlcnJvcnMuIFNob3VsZCBub3QgYmUJcmVxdWlyZWQuCkBAIC0yNCw3ICsyNCw3IEBACiAjaW5jbHVkZSA8bGludXgvbGliYXRhLmg+CiAKICNkZWZpbmUgRFJWX05BTUUJInBhdGFfaHB0Mzd4IgotI2RlZmluZSBEUlZfVkVSU0lPTgkiMC42LjE1IgorI2RlZmluZSBEUlZfVkVSU0lPTgkiMC42LjE4IgogCiBzdHJ1Y3QgaHB0X2Nsb2NrIHsKIAl1OAl4ZmVyX3NwZWVkOwpAQCAtMjEwLDcgKzIxMCw3IEBACiB7CiAJc3RydWN0IGhwdF9jbG9jayAqY2xvY2tzID0gYXAtPmhvc3QtPnByaXZhdGVfZGF0YTsKIAotCXdoaWxlKGNsb2Nrcy0+eGZlcl9zcGVlZCkgeworCXdoaWxlIChjbG9ja3MtPnhmZXJfc3BlZWQpIHsKIAkJaWYgKGNsb2Nrcy0+eGZlcl9zcGVlZCA9PSBzcGVlZCkKIAkJCXJldHVybiBjbG9ja3MtPnRpbWluZzsKIAkJY2xvY2tzKys7CkBAIC0yMTksNyArMjE5LDggQEAKIAlyZXR1cm4gMHhmZmZmZmZmZlU7CS8qIHNpbGVuY2UgY29tcGlsZXIgd2FybmluZyAqLwogfQogCi1zdGF0aWMgaW50IGhwdF9kbWFfYmxhY2tsaXN0ZWQoY29uc3Qgc3RydWN0IGF0YV9kZXZpY2UgKmRldiwgY2hhciAqbW9kZXN0ciwgY29uc3QgY2hhciAqbGlzdFtdKQorc3RhdGljIGludCBocHRfZG1hX2JsYWNrbGlzdGVkKGNvbnN0IHN0cnVjdCBhdGFfZGV2aWNlICpkZXYsIGNoYXIgKm1vZGVzdHIsCisJCQkgICAgICAgY29uc3QgY2hhciAqIGNvbnN0IGxpc3RbXSkKIHsKIAl1bnNpZ25lZCBjaGFyIG1vZGVsX251bVtBVEFfSURfUFJPRF9MRU4gKyAxXTsKIAlpbnQgaSA9IDA7CkBAIC0yMzcsMTggKzIzOCwyMyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgY29uc3QgY2hhciAqYmFkX2F0YTMzW10gPSB7Ci0JIk1heHRvciA5MjcyMFU4IiwgIk1heHRvciA5MjA0MFU2IiwgIk1heHRvciA5MTM2MFU0IiwgIk1heHRvciA5MTAyMFUzIiwgIk1heHRvciA5MDg0NVUzIiwgIk1heHRvciA5MDY1MFUyIiwKLQkiTWF4dG9yIDkxMzYwRDgiLCAiTWF4dG9yIDkxMTkwRDciLCAiTWF4dG9yIDkxMDIwRDYiLCAiTWF4dG9yIDkwODQ1RDUiLCAiTWF4dG9yIDkwNjgwRDQiLCAiTWF4dG9yIDkwNTEwRDMiLCAiTWF4dG9yIDkwMzQwRDIiLAotCSJNYXh0b3IgOTExNTJEOCIsICJNYXh0b3IgOTEwMDhENyIsICJNYXh0b3IgOTA4NDVENiIsICJNYXh0b3IgOTA4NDBENiIsICJNYXh0b3IgOTA3MjBENSIsICJNYXh0b3IgOTA2NDhENSIsICJNYXh0b3IgOTA1NzZENCIsCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGJhZF9hdGEzM1tdID0geworCSJNYXh0b3IgOTI3MjBVOCIsICJNYXh0b3IgOTIwNDBVNiIsICJNYXh0b3IgOTEzNjBVNCIsICJNYXh0b3IgOTEwMjBVMyIsCisJIk1heHRvciA5MDg0NVUzIiwgIk1heHRvciA5MDY1MFUyIiwKKwkiTWF4dG9yIDkxMzYwRDgiLCAiTWF4dG9yIDkxMTkwRDciLCAiTWF4dG9yIDkxMDIwRDYiLCAiTWF4dG9yIDkwODQ1RDUiLAorCSJNYXh0b3IgOTA2ODBENCIsICJNYXh0b3IgOTA1MTBEMyIsICJNYXh0b3IgOTAzNDBEMiIsCisJIk1heHRvciA5MTE1MkQ4IiwgIk1heHRvciA5MTAwOEQ3IiwgIk1heHRvciA5MDg0NUQ2IiwgIk1heHRvciA5MDg0MEQ2IiwKKwkiTWF4dG9yIDkwNzIwRDUiLCAiTWF4dG9yIDkwNjQ4RDUiLCAiTWF4dG9yIDkwNTc2RDQiLAogCSJNYXh0b3IgOTA1MTBENCIsCiAJIk1heHRvciA5MDQzMkQzIiwgIk1heHRvciA5MDI4OEQyIiwgIk1heHRvciA5MDI1NkQyIiwKLQkiTWF4dG9yIDkxMDAwRDgiLCAiTWF4dG9yIDkwOTEwRDgiLCAiTWF4dG9yIDkwODc1RDciLCAiTWF4dG9yIDkwODQwRDciLCAiTWF4dG9yIDkwNzUwRDYiLCAiTWF4dG9yIDkwNjI1RDUiLCAiTWF4dG9yIDkwNTAwRDQiLAotCSJNYXh0b3IgOTE3MjhEOCIsICJNYXh0b3IgOTE1MTJENyIsICJNYXh0b3IgOTEzMDNENiIsICJNYXh0b3IgOTEwODBENSIsICJNYXh0b3IgOTA4NDVENCIsICJNYXh0b3IgOTA2ODBENCIsICJNYXh0b3IgOTA2NDhEMyIsICJNYXh0b3IgOTA0MzJEMiIsCisJIk1heHRvciA5MTAwMEQ4IiwgIk1heHRvciA5MDkxMEQ4IiwgIk1heHRvciA5MDg3NUQ3IiwgIk1heHRvciA5MDg0MEQ3IiwKKwkiTWF4dG9yIDkwNzUwRDYiLCAiTWF4dG9yIDkwNjI1RDUiLCAiTWF4dG9yIDkwNTAwRDQiLAorCSJNYXh0b3IgOTE3MjhEOCIsICJNYXh0b3IgOTE1MTJENyIsICJNYXh0b3IgOTEzMDNENiIsICJNYXh0b3IgOTEwODBENSIsCisJIk1heHRvciA5MDg0NUQ0IiwgIk1heHRvciA5MDY4MEQ0IiwgIk1heHRvciA5MDY0OEQzIiwgIk1heHRvciA5MDQzMkQyIiwKIAlOVUxMCiB9OwogCi1zdGF0aWMgY29uc3QgY2hhciAqYmFkX2F0YTEwMF81W10gPSB7CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGJhZF9hdGExMDBfNVtdID0gewogCSJJQk0tRFRMQS0zMDcwNzUiLAogCSJJQk0tRFRMQS0zMDcwNjAiLAogCSJJQk0tRFRMQS0zMDcwNDUiLApAQCAtMzAyLDYgKzMwOCwyMiBAQAogfQogCiAvKioKKyAqCWhwdDM3Ml9maWx0ZXIJLQltb2RlIHNlbGVjdGlvbiBmaWx0ZXIKKyAqCUBhZGV2OiBBVEEgZGV2aWNlCisgKglAbWFzazogbW9kZSBtYXNrCisgKgorICoJVGhlIE1hcnZlbGwgYnJpZGdlIGNoaXBzIHVzZWQgb24gdGhlIEhpZ2hQb2ludCBTQVRBIGNhcmRzIGRvIG5vdCBzZWVtCisgKgl0byBzdXBwb3J0IHRoZSBVbHRyYURNQSBtb2RlcyAxLCAyLCBhbmQgMyBhcyB3ZWxsIGFzIGFueSBNV0RNQSBtb2Rlcy4uLgorICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBocHQzNzJfZmlsdGVyKHN0cnVjdCBhdGFfZGV2aWNlICphZGV2LCB1bnNpZ25lZCBsb25nIG1hc2spCit7CisJaWYgKGF0YV9pZF9pc19zYXRhKGFkZXYtPmlkKSkKKwkJbWFzayAmPSB+KCgweEUgPDwgQVRBX1NISUZUX1VETUEpIHwgQVRBX01BU0tfTVdETUEpOworCisJcmV0dXJuIG1hc2s7Cit9CisKKy8qKgogICoJaHB0Mzd4X2NhYmxlX2RldGVjdAktCURldGVjdCB0aGUgY2FibGUgdHlwZQogICoJQGFwOiBBVEEgcG9ydCB0byBkZXRlY3Qgb24KICAqCkBAIC0zNzMsNiArMzk1LDcgQEAKIAkJeyAweDUwLCAxLCAweDA0LCAweDA0IH0sCiAJCXsgMHg1NCwgMSwgMHgwNCwgMHgwNCB9CiAJfTsKKwogCWlmICghcGNpX3Rlc3RfY29uZmlnX2JpdHMocGRldiwgJmhwdDM3eF9lbmFibGVfYml0c1thcC0+cG9ydF9ub10pKQogCQlyZXR1cm4gLUVOT0VOVDsKIApAQCAtNTg2LDExICs2MDksMTEgQEAKIH07CiAKIC8qCi0gKglDb25maWd1cmF0aW9uIGZvciBIUFQzNzIsIEhQVDM3MSwgSFBUMzAyLiBTbGlnaHRseSBkaWZmZXJlbnQgUElPCi0gKglhbmQgRE1BIG1vZGUgc2V0dGluZyBmdW5jdGlvbmFsaXR5LgorICoJQ29uZmlndXJhdGlvbiBmb3IgSFBUMzcxIGFuZCBIUFQzMDIuIFNsaWdodGx5IGRpZmZlcmVudCBQSU8gYW5kIERNQQorICoJbW9kZSBzZXR0aW5nIGZ1bmN0aW9uYWxpdHkuCiAgKi8KIAotc3RhdGljIHN0cnVjdCBhdGFfcG9ydF9vcGVyYXRpb25zIGhwdDM3Ml9wb3J0X29wcyA9IHsKK3N0YXRpYyBzdHJ1Y3QgYXRhX3BvcnRfb3BlcmF0aW9ucyBocHQzMDJfcG9ydF9vcHMgPSB7CiAJLmluaGVyaXRzCT0gJmF0YV9ibWRtYV9wb3J0X29wcywKIAogCS5ibWRtYV9zdG9wCT0gaHB0Mzd4X2JtZG1hX3N0b3AsCkBAIC02MDIsNyArNjI1LDE3IEBACiB9OwogCiAvKgotICoJQ29uZmlndXJhdGlvbiBmb3IgSFBUMzc0LiBNb2RlIHNldHRpbmcgd29ya3MgbGlrZSAzNzIgYW5kIGZyaWVuZHMKKyAqCUNvbmZpZ3VyYXRpb24gZm9yIEhQVDM3Mi4gTW9kZSBzZXR0aW5nIHdvcmtzIGxpa2UgMzcxIGFuZCAzMDIKKyAqCWJ1dCB3ZSBoYXZlIGEgbW9kZSBmaWx0ZXIuCisgKi8KKworc3RhdGljIHN0cnVjdCBhdGFfcG9ydF9vcGVyYXRpb25zIGhwdDM3Ml9wb3J0X29wcyA9IHsKKwkuaW5oZXJpdHMJPSAmaHB0MzAyX3BvcnRfb3BzLAorCS5tb2RlX2ZpbHRlcgk9IGhwdDM3Ml9maWx0ZXIsCit9OworCisvKgorICoJQ29uZmlndXJhdGlvbiBmb3IgSFBUMzc0LiBNb2RlIHNldHRpbmcgYW5kIGZpbHRlcmluZyB3b3JrcyBsaWtlIDM3MgogICoJYnV0IHdlIGhhdmUgYSBkaWZmZXJlbnQgY2FibGUgZGV0ZWN0aW9uIHByb2NlZHVyZSBmb3IgZnVuY3Rpb24gMS4KICAqLwogCkBAIC02NDcsMTIgKzY4MCwxMiBAQAogCXUzMiByZWc1YzsKIAlpbnQgdHJpZXM7CiAKLQlmb3IodHJpZXMgPSAwOyB0cmllcyA8IDB4NTAwMDsgdHJpZXMrKykgeworCWZvciAodHJpZXMgPSAwOyB0cmllcyA8IDB4NTAwMDsgdHJpZXMrKykgewogCQl1ZGVsYXkoNTApOwogCQlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIDB4NWIsICZyZWc1Yik7CiAJCWlmIChyZWc1YiAmIDB4ODApIHsKIAkJCS8qIFNlZSBpZiBpdCBzdGF5cyBzZXQgKi8KLQkJCWZvcih0cmllcyA9IDA7IHRyaWVzIDwgMHgxMDAwOyB0cmllcyArKykgeworCQkJZm9yICh0cmllcyA9IDA7IHRyaWVzIDwgMHgxMDAwOyB0cmllcysrKSB7CiAJCQkJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCAweDViLCAmcmVnNWIpOwogCQkJCS8qIEZhaWxlZCA/ICovCiAJCQkJaWYgKChyZWc1YiAmIDB4ODApID09IDApCkBAIC02NjAsNyArNjkzLDcgQEAKIAkJCX0KIAkJCS8qIFR1cm4gb2ZmIHR1bmluZywgd2UgaGF2ZSB0aGUgRFBMTCBzZXQgKi8KIAkJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChkZXYsIDB4NWMsICZyZWc1Yyk7Ci0JCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGRldiwgMHg1YywgcmVnNWMgJiB+IDB4MTAwKTsKKwkJCXBjaV93cml0ZV9jb25maWdfZHdvcmQoZGV2LCAweDVjLCByZWc1YyAmIH4weDEwMCk7CiAJCQlyZXR1cm4gMTsKIAkJfQogCX0KQEAgLTY3Miw2ICs3MDUsNyBAQAogewogCXUzMiBmcmVxOwogCXVuc2lnbmVkIGxvbmcgaW9fYmFzZSA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCA0KTsKKwogCWlmIChQQ0lfRlVOQyhwZGV2LT5kZXZmbikgJiAxKSB7CiAJCXN0cnVjdCBwY2lfZGV2ICpwZGV2XzA7CiAKQEAgLTczNywyMyArNzcxLDIzIEBACiAJCS51ZG1hX21hc2sgPSBBVEFfVURNQTUsCiAJCS5wb3J0X29wcyA9ICZocHQzNzBhX3BvcnRfb3BzCiAJfTsKLQkvKiBIUFQzNzAgLSBVRE1BMTAwICovCisJLyogSFBUMzcwIC0gVURNQTY2ICovCiAJc3RhdGljIGNvbnN0IHN0cnVjdCBhdGFfcG9ydF9pbmZvIGluZm9faHB0MzcwXzMzID0gewogCQkuZmxhZ3MgPSBBVEFfRkxBR19TTEFWRV9QT1NTLAogCQkucGlvX21hc2sgPSBBVEFfUElPNCwKIAkJLm13ZG1hX21hc2sgPSBBVEFfTVdETUEyLAotCQkudWRtYV9tYXNrID0gQVRBX1VETUE1LAorCQkudWRtYV9tYXNrID0gQVRBX1VETUE0LAogCQkucG9ydF9vcHMgPSAmaHB0MzcwX3BvcnRfb3BzCiAJfTsKLQkvKiBIUFQzNzBBIC0gVURNQTEwMCAqLworCS8qIEhQVDM3MEEgLSBVRE1BNjYgKi8KIAlzdGF0aWMgY29uc3Qgc3RydWN0IGF0YV9wb3J0X2luZm8gaW5mb19ocHQzNzBhXzMzID0gewogCQkuZmxhZ3MgPSBBVEFfRkxBR19TTEFWRV9QT1NTLAogCQkucGlvX21hc2sgPSBBVEFfUElPNCwKIAkJLm13ZG1hX21hc2sgPSBBVEFfTVdETUEyLAotCQkudWRtYV9tYXNrID0gQVRBX1VETUE1LAorCQkudWRtYV9tYXNrID0gQVRBX1VETUE0LAogCQkucG9ydF9vcHMgPSAmaHB0MzcwYV9wb3J0X29wcwogCX07Ci0JLyogSFBUMzcxLCAzNzIgYW5kIGZyaWVuZHMgLSBVRE1BMTMzICovCisJLyogSFBUMzcyIC0gVURNQTEzMyAqLwogCXN0YXRpYyBjb25zdCBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyBpbmZvX2hwdDM3MiA9IHsKIAkJLmZsYWdzID0gQVRBX0ZMQUdfU0xBVkVfUE9TUywKIAkJLnBpb19tYXNrID0gQVRBX1BJTzQsCkBAIC03NjEsNiArNzk1LDE0IEBACiAJCS51ZG1hX21hc2sgPSBBVEFfVURNQTYsCiAJCS5wb3J0X29wcyA9ICZocHQzNzJfcG9ydF9vcHMKIAl9OworCS8qIEhQVDM3MSwgMzAyIC0gVURNQTEzMyAqLworCXN0YXRpYyBjb25zdCBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyBpbmZvX2hwdDMwMiA9IHsKKwkJLmZsYWdzID0gQVRBX0ZMQUdfU0xBVkVfUE9TUywKKwkJLnBpb19tYXNrID0gQVRBX1BJTzQsCisJCS5td2RtYV9tYXNrID0gQVRBX01XRE1BMiwKKwkJLnVkbWFfbWFzayA9IEFUQV9VRE1BNiwKKwkJLnBvcnRfb3BzID0gJmhwdDMwMl9wb3J0X29wcworCX07CiAJLyogSFBUMzc0IC0gVURNQTEwMCwgZnVuY3Rpb24gMSB1c2VzIGRpZmZlcmVudCBwcmVyZXNldCBtZXRob2QgKi8KIAlzdGF0aWMgY29uc3Qgc3RydWN0IGF0YV9wb3J0X2luZm8gaW5mb19ocHQzNzRfZm4wID0gewogCQkuZmxhZ3MgPSBBVEFfRkxBR19TTEFWRV9QT1NTLApAQCAtODA1LDY0ICs4NDcsNjggQEAKIAkJaWYgKHJldiA9PSA2KQogCQkJcmV0dXJuIC1FTk9ERVY7CiAKLQkJc3dpdGNoKHJldikgewotCQkJY2FzZSAzOgotCQkJCXBwaVswXSA9ICZpbmZvX2hwdDM3MDsKLQkJCQljaGlwX3RhYmxlID0gJmhwdDM3MDsKLQkJCQlwcmVmZXJfZHBsbCA9IDA7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDQ6Ci0JCQkJcHBpWzBdID0gJmluZm9faHB0MzcwYTsKLQkJCQljaGlwX3RhYmxlID0gJmhwdDM3MGE7Ci0JCQkJcHJlZmVyX2RwbGwgPSAwOwotCQkJCWJyZWFrOwotCQkJY2FzZSA1OgotCQkJCXBwaVswXSA9ICZpbmZvX2hwdDM3MjsKLQkJCQljaGlwX3RhYmxlID0gJmhwdDM3MjsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJcHJpbnRrKEtFUk5fRVJSICJwYXRhX2hwdDM3eDogVW5rbm93biBIUFQzNjYgIgotCQkJCSAgICAgICAic3VidHlwZSwgcGxlYXNlIHJlcG9ydCAoJWQpLlxuIiwgcmV2KTsKLQkJCQlyZXR1cm4gLUVOT0RFVjsKKwkJc3dpdGNoIChyZXYpIHsKKwkJY2FzZSAzOgorCQkJcHBpWzBdID0gJmluZm9faHB0MzcwOworCQkJY2hpcF90YWJsZSA9ICZocHQzNzA7CisJCQlwcmVmZXJfZHBsbCA9IDA7CisJCQlicmVhazsKKwkJY2FzZSA0OgorCQkJcHBpWzBdID0gJmluZm9faHB0MzcwYTsKKwkJCWNoaXBfdGFibGUgPSAmaHB0MzcwYTsKKwkJCXByZWZlcl9kcGxsID0gMDsKKwkJCWJyZWFrOworCQljYXNlIDU6CisJCQlwcGlbMF0gPSAmaW5mb19ocHQzNzI7CisJCQljaGlwX3RhYmxlID0gJmhwdDM3MjsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcHJpbnRrKEtFUk5fRVJSICJwYXRhX2hwdDM3eDogVW5rbm93biBIUFQzNjYgc3VidHlwZSwgIgorCQkJICAgICAgICJwbGVhc2UgcmVwb3J0ICglZCkuXG4iLCByZXYpOworCQkJcmV0dXJuIC1FTk9ERVY7CiAJCX0KIAl9IGVsc2UgewotCQlzd2l0Y2goZGV2LT5kZXZpY2UpIHsKLQkJCWNhc2UgUENJX0RFVklDRV9JRF9UVElfSFBUMzcyOgotCQkJCS8qIDM3Mk4gaWYgcmV2ID49IDIqLwotCQkJCWlmIChyZXYgPj0gMikKLQkJCQkJcmV0dXJuIC1FTk9ERVY7Ci0JCQkJcHBpWzBdID0gJmluZm9faHB0MzcyOwotCQkJCWNoaXBfdGFibGUgPSAmaHB0MzcyYTsKLQkJCQlicmVhazsKLQkJCWNhc2UgUENJX0RFVklDRV9JRF9UVElfSFBUMzAyOgotCQkJCS8qIDMwMk4gaWYgcmV2ID4gMSAqLwotCQkJCWlmIChyZXYgPiAxKQotCQkJCQlyZXR1cm4gLUVOT0RFVjsKLQkJCQlwcGlbMF0gPSAmaW5mb19ocHQzNzI7Ci0JCQkJLyogQ2hlY2sgdGhpcyAqLwotCQkJCWNoaXBfdGFibGUgPSAmaHB0MzAyOwotCQkJCWJyZWFrOwotCQkJY2FzZSBQQ0lfREVWSUNFX0lEX1RUSV9IUFQzNzE6Ci0JCQkJaWYgKHJldiA+IDEpCi0JCQkJCXJldHVybiAtRU5PREVWOwotCQkJCXBwaVswXSA9ICZpbmZvX2hwdDM3MjsKLQkJCQljaGlwX3RhYmxlID0gJmhwdDM3MTsKLQkJCQkvKiBTaW5nbGUgY2hhbm5lbCBkZXZpY2UsIG1hc3RlciBpcyBub3QgcHJlc2VudAotCQkJCSAgIGJ1dCB0aGUgQklPUyAob3IgdXMgZm9yIG5vbiB4ODYpIG11c3QgbWFyayBpdAotCQkJCSAgIGFic2VudCAqLwotCQkJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgMHg1MCwgJm1jcjEpOwotCQkJCW1jcjEgJj0gfjB4MDQ7Ci0JCQkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgMHg1MCwgbWNyMSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFBDSV9ERVZJQ0VfSURfVFRJX0hQVDM3NDoKLQkJCQljaGlwX3RhYmxlID0gJmhwdDM3NDsKLQkJCQlpZiAoIShQQ0lfRlVOQyhkZXYtPmRldmZuKSAmIDEpKQotCQkJCQkqcHBpID0gJmluZm9faHB0Mzc0X2ZuMDsKLQkJCQllbHNlCi0JCQkJCSpwcGkgPSAmaW5mb19ocHQzNzRfZm4xOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlwcmludGsoS0VSTl9FUlIgInBhdGFfaHB0Mzd4OiBQQ0kgdGFibGUgaXMgYm9ndXMgcGxlYXNlIHJlcG9ydCAoJWQpLlxuIiwgZGV2LT5kZXZpY2UpOworCQlzd2l0Y2ggKGRldi0+ZGV2aWNlKSB7CisJCWNhc2UgUENJX0RFVklDRV9JRF9UVElfSFBUMzcyOgorCQkJLyogMzcyTiBpZiByZXYgPj0gMiAqLworCQkJaWYgKHJldiA+PSAyKQorCQkJCXJldHVybiAtRU5PREVWOworCQkJcHBpWzBdID0gJmluZm9faHB0MzcyOworCQkJY2hpcF90YWJsZSA9ICZocHQzNzJhOworCQkJYnJlYWs7CisJCWNhc2UgUENJX0RFVklDRV9JRF9UVElfSFBUMzAyOgorCQkJLyogMzAyTiBpZiByZXYgPiAxICovCisJCQlpZiAocmV2ID4gMSkKKwkJCQlyZXR1cm4gLUVOT0RFVjsKKwkJCXBwaVswXSA9ICZpbmZvX2hwdDMwMjsKKwkJCS8qIENoZWNrIHRoaXMgKi8KKwkJCWNoaXBfdGFibGUgPSAmaHB0MzAyOworCQkJYnJlYWs7CisJCWNhc2UgUENJX0RFVklDRV9JRF9UVElfSFBUMzcxOgorCQkJaWYgKHJldiA+IDEpCisJCQkJcmV0dXJuIC1FTk9ERVY7CisJCQlwcGlbMF0gPSAmaW5mb19ocHQzMDI7CisJCQljaGlwX3RhYmxlID0gJmhwdDM3MTsKKwkJCS8qCisJCQkgKiBTaW5nbGUgY2hhbm5lbCBkZXZpY2UsIG1hc3RlciBpcyBub3QgcHJlc2VudAorCQkJICogYnV0IHRoZSBCSU9TIChvciB1cyBmb3Igbm9uIHg4NikgbXVzdCBtYXJrIGl0CisJCQkgKiBhYnNlbnQKKwkJCSAqLworCQkJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCAweDUwLCAmbWNyMSk7CisJCQltY3IxICY9IH4weDA0OworCQkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgMHg1MCwgbWNyMSk7CisJCQlicmVhazsKKwkJY2FzZSBQQ0lfREVWSUNFX0lEX1RUSV9IUFQzNzQ6CisJCQljaGlwX3RhYmxlID0gJmhwdDM3NDsKKwkJCWlmICghKFBDSV9GVU5DKGRldi0+ZGV2Zm4pICYgMSkpCisJCQkJKnBwaSA9ICZpbmZvX2hwdDM3NF9mbjA7CisJCQllbHNlCisJCQkJKnBwaSA9ICZpbmZvX2hwdDM3NF9mbjE7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXByaW50ayhLRVJOX0VSUgorCQkJICAgICAgICJwYXRhX2hwdDM3eDogUENJIHRhYmxlIGlzIGJvZ3VzLCBwbGVhc2UgcmVwb3J0ICglZCkuXG4iLAorCQkJICAgICAgIGRldi0+ZGV2aWNlKTsKIAkJCQlyZXR1cm4gLUVOT0RFVjsKIAkJfQogCX0KQEAgLTg5Myw5ICs5MzksMTEgQEAKIAlpZiAoY2hpcF90YWJsZSA9PSAmaHB0MzcyYSkKIAkJb3V0YigweDBlLCBpb2Jhc2UgKyAweDljKTsKIAotCS8qIFNvbWUgZGV2aWNlcyBkbyBub3QgbGV0IHRoaXMgdmFsdWUgYmUgYWNjZXNzZWQgdmlhIFBDSSBzcGFjZQotCSAgIGFjY29yZGluZyB0byB0aGUgb2xkIGRyaXZlci4gSW4gYWRkaXRpb24gd2UgbXVzdCB1c2UgdGhlIHZhbHVlCi0JICAgZnJvbSBGTiAwIG9uIHRoZSBIUFQzNzQgKi8KKwkvKgorCSAqIFNvbWUgZGV2aWNlcyBkbyBub3QgbGV0IHRoaXMgdmFsdWUgYmUgYWNjZXNzZWQgdmlhIFBDSSBzcGFjZQorCSAqIGFjY29yZGluZyB0byB0aGUgb2xkIGRyaXZlci4gSW4gYWRkaXRpb24gd2UgbXVzdCB1c2UgdGhlIHZhbHVlCisJICogZnJvbSBGTiAwIG9uIHRoZSBIUFQzNzQuCisJICovCiAKIAlpZiAoY2hpcF90YWJsZSA9PSAmaHB0Mzc0KSB7CiAJCWZyZXEgPSBocHQzNzRfcmVhZF9mcmVxKGRldik7CkBAIC05MDksMTAgKzk1NywxMSBAQAogCQl1OCBzcjsKIAkJdTMyIHRvdGFsID0gMDsKIAotCQlwcmludGsoS0VSTl9XQVJOSU5HICJwYXRhX2hwdDM3eDogQklPUyBoYXMgbm90IHNldCB0aW1pbmcgY2xvY2tzLlxuIik7CisJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJICAgICAgICJwYXRhX2hwdDM3eDogQklPUyBoYXMgbm90IHNldCB0aW1pbmcgY2xvY2tzLlxuIik7CiAKIAkJLyogVGhpcyBpcyB0aGUgcHJvY2VzcyB0aGUgSFBUMzcxIEJJT1MgaXMgcmVwb3J0ZWQgdG8gdXNlICovCi0JCWZvcihpID0gMDsgaSA8IDEyODsgaSsrKSB7CisJCWZvciAoaSA9IDA7IGkgPCAxMjg7IGkrKykgewogCQkJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCAweDc4LCAmc3IpOwogCQkJdG90YWwgKz0gc3IgJiAweDFGRjsKIAkJCXVkZWxheSgxNSk7CkBAIC05NDcsMTcgKzk5NiwyMiBAQAogCiAJCS8qIFNlbGVjdCB0aGUgRFBMTCBjbG9jay4gKi8KIAkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgMHg1YiwgMHgyMSk7Ci0JCXBjaV93cml0ZV9jb25maWdfZHdvcmQoZGV2LCAweDVDLCAoZl9oaWdoIDw8IDE2KSB8IGZfbG93IHwgMHgxMDApOworCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGRldiwgMHg1QywKKwkJCQkgICAgICAgKGZfaGlnaCA8PCAxNikgfCBmX2xvdyB8IDB4MTAwKTsKIAotCQlmb3IoYWRqdXN0ID0gMDsgYWRqdXN0IDwgODsgYWRqdXN0KyspIHsKKwkJZm9yIChhZGp1c3QgPSAwOyBhZGp1c3QgPCA4OyBhZGp1c3QrKykgewogCQkJaWYgKGhwdDM3eF9jYWxpYnJhdGVfZHBsbChkZXYpKQogCQkJCWJyZWFrOwotCQkJLyogU2VlIGlmIGl0J2xsIHNldHRsZSBhdCBhIGZyYWN0aW9uYWxseSBkaWZmZXJlbnQgY2xvY2sgKi8KKwkJCS8qCisJCQkgKiBTZWUgaWYgaXQnbGwgc2V0dGxlIGF0IGEgZnJhY3Rpb25hbGx5CisJCQkgKiBkaWZmZXJlbnQgY2xvY2sKKwkJCSAqLwogCQkJaWYgKGFkanVzdCAmIDEpCiAJCQkJZl9sb3cgLT0gYWRqdXN0ID4+IDE7CiAJCQllbHNlCiAJCQkJZl9oaWdoICs9IGFkanVzdCA+PiAxOwotCQkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChkZXYsIDB4NUMsIChmX2hpZ2ggPDwgMTYpIHwgZl9sb3cgfCAweDEwMCk7CisJCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGRldiwgMHg1QywKKwkJCQkJICAgICAgIChmX2hpZ2ggPDwgMTYpIHwgZl9sb3cgfCAweDEwMCk7CiAJCX0KIAkJaWYgKGFkanVzdCA9PSA4KSB7CiAJCQlwcmludGsoS0VSTl9FUlIgInBhdGFfaHB0Mzd4OiBEUExMIGRpZCBub3Qgc3RhYmlsaXplIVxuIik7CkBAIC05NzYsNyArMTAzMCw3IEBACiAJCSAqCVBlcmZvcm0gYSBmaW5hbCBmaXh1cC4gTm90ZSB0aGF0IHdlIHdpbGwgaGF2ZSB1c2VkIHRoZQogCQkgKglEUExMIG9uIHRoZSBIUFQzNzIgd2hpY2ggbWVhbnMgd2UgZG9uJ3QgaGF2ZSB0byB3b3JyeQogCQkgKglhYm91dCBsYWNrIG9mIFVETUExMzMgc3VwcG9ydCBvbiBsb3dlciBjbG9ja3MKLSAJCSAqLworCQkgKi8KIAogCQlpZiAoY2xvY2tfc2xvdCA8IDIgJiYgcHBpWzBdID09ICZpbmZvX2hwdDM3MCkKIAkJCXBwaVswXSA9ICZpbmZvX2hwdDM3MF8zMzsKQEAgLTEwMDEsOSArMTA1NSw5IEBACiB9OwogCiBzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgaHB0Mzd4X3BjaV9kcml2ZXIgPSB7Ci0JLm5hbWUgCQk9IERSVl9OQU1FLAorCS5uYW1lCQk9IERSVl9OQU1FLAogCS5pZF90YWJsZQk9IGhwdDM3eCwKLQkucHJvYmUgCQk9IGhwdDM3eF9pbml0X29uZSwKKwkucHJvYmUJCT0gaHB0Mzd4X2luaXRfb25lLAogCS5yZW1vdmUJCT0gYXRhX3BjaV9yZW1vdmVfb25lCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9wYXRhX2hwdDN4Mm4uYyBiL2RyaXZlcnMvYXRhL3BhdGFfaHB0M3gybi5jCmluZGV4IDMyZjM0NjMuLmQyMjM5YmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfaHB0M3gybi5jCisrKyBiL2RyaXZlcnMvYXRhL3BhdGFfaHB0M3gybi5jCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIExpYmF0YSBkcml2ZXIgZm9yIHRoZSBoaWdocG9pbnQgMzcyTiBhbmQgMzAyTiBVRE1BNjYgQVRBIGNvbnRyb2xsZXJzLgorICogTGliYXRhIGRyaXZlciBmb3IgdGhlIEhpZ2hQb2ludCAzNzFOLCAzNzJOLCBhbmQgMzAyTiBVRE1BNjYgQVRBIGNvbnRyb2xsZXJzLgogICoKICAqIFRoaXMgZHJpdmVyIGlzIGhlYXZpbHkgYmFzZWQgdXBvbjoKICAqCkBAIC04LDcgKzgsNyBAQAogICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDMJCUFuZHJlIEhlZHJpY2sgPGFuZHJlQGxpbnV4LWlkZS5vcmc+CiAgKiBQb3J0aW9ucyBDb3B5cmlnaHQgKEMpIDIwMDEJICAgICAgICBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuCiAgKiBQb3J0aW9ucyBDb3B5cmlnaHQgKEMpIDIwMDMJCVJlZCBIYXQgSW5jCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAwOQlNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuCisgKiBQb3J0aW9ucyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMAlNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuCiAgKgogICoKICAqIFRPRE8KQEAgLTI1LDcgKzI1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9saWJhdGEuaD4KIAogI2RlZmluZSBEUlZfTkFNRQkicGF0YV9ocHQzeDJuIgotI2RlZmluZSBEUlZfVkVSU0lPTgkiMC4zLjEwIgorI2RlZmluZSBEUlZfVkVSU0lPTgkiMC4zLjEzIgogCiBlbnVtIHsKIAlIUFRfUENJX0ZBU1QJPQkoMSA8PCAzMSksCkBAIC0xMDMsNyArMTAzLDcgQEAKIHsKIAlzdHJ1Y3QgaHB0X2Nsb2NrICpjbG9ja3MgPSBocHQzeDJuX2Nsb2NrczsKIAotCXdoaWxlKGNsb2Nrcy0+eGZlcl9zcGVlZCkgeworCXdoaWxlIChjbG9ja3MtPnhmZXJfc3BlZWQpIHsKIAkJaWYgKGNsb2Nrcy0+eGZlcl9zcGVlZCA9PSBzcGVlZCkKIAkJCXJldHVybiBjbG9ja3MtPnRpbWluZzsKIAkJY2xvY2tzKys7CkBAIC0xMTMsNiArMTEzLDIyIEBACiB9CiAKIC8qKgorICoJaHB0Mzcybl9maWx0ZXIJLQltb2RlIHNlbGVjdGlvbiBmaWx0ZXIKKyAqCUBhZGV2OiBBVEEgZGV2aWNlCisgKglAbWFzazogbW9kZSBtYXNrCisgKgorICoJVGhlIE1hcnZlbGwgYnJpZGdlIGNoaXBzIHVzZWQgb24gdGhlIEhpZ2hQb2ludCBTQVRBIGNhcmRzIGRvIG5vdCBzZWVtCisgKgl0byBzdXBwb3J0IHRoZSBVbHRyYURNQSBtb2RlcyAxLCAyLCBhbmQgMyBhcyB3ZWxsIGFzIGFueSBNV0RNQSBtb2Rlcy4uLgorICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBocHQzNzJuX2ZpbHRlcihzdHJ1Y3QgYXRhX2RldmljZSAqYWRldiwgdW5zaWduZWQgbG9uZyBtYXNrKQoreworCWlmIChhdGFfaWRfaXNfc2F0YShhZGV2LT5pZCkpCisJCW1hc2sgJj0gfigoMHhFIDw8IEFUQV9TSElGVF9VRE1BKSB8IEFUQV9NQVNLX01XRE1BKTsKKworCXJldHVybiBtYXNrOworfQorCisvKioKICAqCWhwdDN4Mm5fY2FibGVfZGV0ZWN0CS0JRGV0ZWN0IHRoZSBjYWJsZSB0eXBlCiAgKglAYXA6IEFUQSBwb3J0IHRvIGRldGVjdCBvbgogICoKQEAgLTE1Myw2ICsxNjksNyBAQAogewogCXN0cnVjdCBhdGFfcG9ydCAqYXAgPSBsaW5rLT5hcDsKIAlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHRvX3BjaV9kZXYoYXAtPmhvc3QtPmRldik7CisKIAkvKiBSZXNldCB0aGUgc3RhdGUgbWFjaGluZSAqLwogCXBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCAweDUwICsgNCAqIGFwLT5wb3J0X25vLCAweDM3KTsKIAl1ZGVsYXkoMTAwKTsKQEAgLTMyOCwxMCArMzQ1LDEwIEBACiB9OwogCiAvKgotICoJQ29uZmlndXJhdGlvbiBmb3IgSFBUM3gybi4KKyAqCUNvbmZpZ3VyYXRpb24gZm9yIEhQVDMwMk4vMzcxTi4KICAqLwogCi1zdGF0aWMgc3RydWN0IGF0YV9wb3J0X29wZXJhdGlvbnMgaHB0M3gybl9wb3J0X29wcyA9IHsKK3N0YXRpYyBzdHJ1Y3QgYXRhX3BvcnRfb3BlcmF0aW9ucyBocHQzeHhuX3BvcnRfb3BzID0gewogCS5pbmhlcml0cwk9ICZhdGFfYm1kbWFfcG9ydF9vcHMsCiAKIAkuYm1kbWFfc3RvcAk9IGhwdDN4Mm5fYm1kbWFfc3RvcCwKQEAgLTM0NSw2ICszNjIsMTUgQEAKIAkucHJlcmVzZXQJPSBocHQzeDJuX3ByZV9yZXNldCwKIH07CiAKKy8qCisgKglDb25maWd1cmF0aW9uIGZvciBIUFQzNzJOLiBTYW1lIGFzIDMwMk4vMzcxTiBidXQgd2UgaGF2ZSBhIG1vZGUgZmlsdGVyLgorICovCisKK3N0YXRpYyBzdHJ1Y3QgYXRhX3BvcnRfb3BlcmF0aW9ucyBocHQzNzJuX3BvcnRfb3BzID0geworCS5pbmhlcml0cwk9ICZocHQzeHhuX3BvcnRfb3BzLAorCS5tb2RlX2ZpbHRlcgk9ICZocHQzNzJuX2ZpbHRlciwKK307CisKIC8qKgogICoJaHB0M3huX2NhbGlicmF0ZV9kcGxsCQktCUNhbGlicmF0ZSB0aGUgRFBMTCBsb29wCiAgKglAZGV2OiBQQ0kgZGV2aWNlCkBAIC0zNTksMTIgKzM4NSwxMiBAQAogCXUzMiByZWc1YzsKIAlpbnQgdHJpZXM7CiAKLQlmb3IodHJpZXMgPSAwOyB0cmllcyA8IDB4NTAwMDsgdHJpZXMrKykgeworCWZvciAodHJpZXMgPSAwOyB0cmllcyA8IDB4NTAwMDsgdHJpZXMrKykgewogCQl1ZGVsYXkoNTApOwogCQlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIDB4NWIsICZyZWc1Yik7CiAJCWlmIChyZWc1YiAmIDB4ODApIHsKIAkJCS8qIFNlZSBpZiBpdCBzdGF5cyBzZXQgKi8KLQkJCWZvcih0cmllcyA9IDA7IHRyaWVzIDwgMHgxMDAwOyB0cmllcyArKykgeworCQkJZm9yICh0cmllcyA9IDA7IHRyaWVzIDwgMHgxMDAwOyB0cmllcysrKSB7CiAJCQkJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCAweDViLCAmcmVnNWIpOwogCQkJCS8qIEZhaWxlZCA/ICovCiAJCQkJaWYgKChyZWc1YiAmIDB4ODApID09IDApCkBAIC0zNzIsNyArMzk4LDcgQEAKIAkJCX0KIAkJCS8qIFR1cm4gb2ZmIHR1bmluZywgd2UgaGF2ZSB0aGUgRFBMTCBzZXQgKi8KIAkJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChkZXYsIDB4NWMsICZyZWc1Yyk7Ci0JCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGRldiwgMHg1YywgcmVnNWMgJiB+IDB4MTAwKTsKKwkJCXBjaV93cml0ZV9jb25maWdfZHdvcmQoZGV2LCAweDVjLCByZWc1YyAmIH4weDEwMCk7CiAJCQlyZXR1cm4gMTsKIAkJfQogCX0KQEAgLTM4OCw4ICs0MTQsMTkgQEAKIAogCWZjbnQgPSBpbmwoaW9iYXNlICsgMHg5MCk7CS8qIE5vdCBQQ0kgcmVhZGFibGUgZm9yIHNvbWUgY2hpcHMgKi8KIAlpZiAoKGZjbnQgPj4gMTIpICE9IDB4QUJDREUpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiaHB0M3huOiBCSU9TIGNsb2NrIGRhdGEgbm90IHNldC5cbiIpOwotCQlyZXR1cm4gMzM7CS8qIE5vdCBCSU9TIHNldCAqLworCQlpbnQgaTsKKwkJdTE2IHNyOworCQl1MzIgdG90YWwgPSAwOworCisJCXByaW50ayhLRVJOX1dBUk5JTkcgInBhdGFfaHB0M3gybjogQklPUyBjbG9jayBkYXRhIG5vdCBzZXQuXG4iKTsKKworCQkvKiBUaGlzIGlzIHRoZSBwcm9jZXNzIHRoZSBIUFQzNzEgQklPUyBpcyByZXBvcnRlZCB0byB1c2UgKi8KKwkJZm9yIChpID0gMDsgaSA8IDEyODsgaSsrKSB7CisJCQlwY2lfcmVhZF9jb25maWdfd29yZChwZGV2LCAweDc4LCAmc3IpOworCQkJdG90YWwgKz0gc3IgJiAweDFGRjsKKwkJCXVkZWxheSgxNSk7CisJCX0KKwkJZmNudCA9IHRvdGFsIC8gMTI4OwogCX0KIAlmY250ICY9IDB4MUZGOwogCkBAIC00MzEsMjEgKzQ2OCwyNyBAQAogICoJSFBUMzcyTgkJCTkgKEhQVDM3Mk4pCSoJVURNQTEzMwogICoKICAqCSgxKSBVRE1BMTMzIHN1cHBvcnQgZGVwZW5kcyBvbiB0aGUgYnVzIGNsb2NrCi0gKgotICoJVG8gcGluIGRvd24JCUhQVDM3MU4KICAqLwogCiBzdGF0aWMgaW50IGhwdDN4Mm5faW5pdF9vbmUoc3RydWN0IHBjaV9kZXYgKmRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKQogewotCS8qIEhQVDM3Mk4gYW5kIGZyaWVuZHMgLSBVRE1BMTMzICovCi0Jc3RhdGljIGNvbnN0IHN0cnVjdCBhdGFfcG9ydF9pbmZvIGluZm8gPSB7CisJLyogSFBUMzcyTiAtIFVETUExMzMgKi8KKwlzdGF0aWMgY29uc3Qgc3RydWN0IGF0YV9wb3J0X2luZm8gaW5mb19ocHQzNzJuID0gewogCQkuZmxhZ3MgPSBBVEFfRkxBR19TTEFWRV9QT1NTLAogCQkucGlvX21hc2sgPSBBVEFfUElPNCwKIAkJLm13ZG1hX21hc2sgPSBBVEFfTVdETUEyLAogCQkudWRtYV9tYXNrID0gQVRBX1VETUE2LAotCQkucG9ydF9vcHMgPSAmaHB0M3gybl9wb3J0X29wcworCQkucG9ydF9vcHMgPSAmaHB0Mzcybl9wb3J0X29wcwogCX07Ci0JY29uc3Qgc3RydWN0IGF0YV9wb3J0X2luZm8gKnBwaVtdID0geyAmaW5mbywgTlVMTCB9OworCS8qIEhQVDMwMk4gYW5kIEhQVDM3MU4gLSBVRE1BMTMzICovCisJc3RhdGljIGNvbnN0IHN0cnVjdCBhdGFfcG9ydF9pbmZvIGluZm9faHB0M3h4biA9IHsKKwkJLmZsYWdzID0gQVRBX0ZMQUdfU0xBVkVfUE9TUywKKwkJLnBpb19tYXNrID0gQVRBX1BJTzQsCisJCS5td2RtYV9tYXNrID0gQVRBX01XRE1BMiwKKwkJLnVkbWFfbWFzayA9IEFUQV9VRE1BNiwKKwkJLnBvcnRfb3BzID0gJmhwdDN4eG5fcG9ydF9vcHMKKwl9OworCWNvbnN0IHN0cnVjdCBhdGFfcG9ydF9pbmZvICpwcGlbXSA9IHsgJmluZm9faHB0M3h4biwgTlVMTCB9OwogCXU4IHJldiA9IGRldi0+cmV2aXNpb247CiAJdTggaXJxbWFzazsKIAl1bnNpZ25lZCBpbnQgcGNpX21oejsKQEAgLTQ1OSwzMCArNTAyLDM2IEBACiAJaWYgKHJjKQogCQlyZXR1cm4gcmM7CiAKLQlzd2l0Y2goZGV2LT5kZXZpY2UpIHsKLQkJY2FzZSBQQ0lfREVWSUNFX0lEX1RUSV9IUFQzNjY6Ci0JCQlpZiAocmV2IDwgNikKLQkJCQlyZXR1cm4gLUVOT0RFVjsKLQkJCWJyZWFrOwotCQljYXNlIFBDSV9ERVZJQ0VfSURfVFRJX0hQVDM3MToKLQkJCWlmIChyZXYgPCAyKQotCQkJCXJldHVybiAtRU5PREVWOwotCQkJLyogMzcxTiBpZiByZXYgPiAxICovCi0JCQlicmVhazsKLQkJY2FzZSBQQ0lfREVWSUNFX0lEX1RUSV9IUFQzNzI6Ci0JCQkvKiAzNzJOIGlmIHJldiA+PSAyKi8KLQkJCWlmIChyZXYgPCAyKQotCQkJCXJldHVybiAtRU5PREVWOwotCQkJYnJlYWs7Ci0JCWNhc2UgUENJX0RFVklDRV9JRF9UVElfSFBUMzAyOgotCQkJaWYgKHJldiA8IDIpCi0JCQkJcmV0dXJuIC1FTk9ERVY7Ci0JCQlicmVhazsKLQkJY2FzZSBQQ0lfREVWSUNFX0lEX1RUSV9IUFQzNzJOOgotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlwcmludGsoS0VSTl9FUlIgInBhdGFfaHB0M3gybjogUENJIHRhYmxlIGlzIGJvZ3VzIHBsZWFzZSByZXBvcnQgKCVkKS5cbiIsIGRldi0+ZGV2aWNlKTsKKwlzd2l0Y2ggKGRldi0+ZGV2aWNlKSB7CisJY2FzZSBQQ0lfREVWSUNFX0lEX1RUSV9IUFQzNjY6CisJCS8qIDM3Mk4gaWYgcmV2ID49IDYgKi8KKwkJaWYgKHJldiA8IDYpCiAJCQlyZXR1cm4gLUVOT0RFVjsKKwkJZ290byBocHQzNzJuOworCWNhc2UgUENJX0RFVklDRV9JRF9UVElfSFBUMzcxOgorCQkvKiAzNzFOIGlmIHJldiA+PSAyICovCisJCWlmIChyZXYgPCAyKQorCQkJcmV0dXJuIC1FTk9ERVY7CisJCWJyZWFrOworCWNhc2UgUENJX0RFVklDRV9JRF9UVElfSFBUMzcyOgorCQkvKiAzNzJOIGlmIHJldiA+PSAyICovCisJCWlmIChyZXYgPCAyKQorCQkJcmV0dXJuIC1FTk9ERVY7CisJCWdvdG8gaHB0MzcybjsKKwljYXNlIFBDSV9ERVZJQ0VfSURfVFRJX0hQVDMwMjoKKwkJLyogMzAyTiBpZiByZXYgPj0gMiAqLworCQlpZiAocmV2IDwgMikKKwkJCXJldHVybiAtRU5PREVWOworCQlicmVhazsKKwljYXNlIFBDSV9ERVZJQ0VfSURfVFRJX0hQVDM3Mk46CitocHQzNzJuOgorCQlwcGlbMF0gPSAmaW5mb19ocHQzNzJuOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcmludGsoS0VSTl9FUlIKKwkJICAgICAgICJwYXRhX2hwdDN4Mm46IFBDSSB0YWJsZSBpcyBib2d1cyBwbGVhc2UgcmVwb3J0ICglZCkuXG4iLAorCQkgICAgICAgZGV2LT5kZXZpY2UpOworCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKIAkvKiBPayBzbyB0aGlzIGlzIGEgY2hpcCB3ZSBzdXBwb3J0ICovCkBAIC01MDksOCArNTU4LDEwIEBACiAJCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIDB4NTAsIG1jcjEpOwogCX0KIAotCS8qIFR1bmUgdGhlIFBMTC4gSFBUIHJlY29tbWVuZCB1c2luZyA3NSBmb3IgU0FUQSwgNjYgZm9yIFVETUExMzMgb3IKLQkgICA1MCBmb3IgVURNQTEwMC4gUmlnaHQgbm93IHdlIGFsd2F5cyB1c2UgNjYgKi8KKwkvKgorCSAqIFR1bmUgdGhlIFBMTC4gSFBUIHJlY29tbWVuZCB1c2luZyA3NSBmb3IgU0FUQSwgNjYgZm9yIFVETUExMzMgb3IKKwkgKiA1MCBmb3IgVURNQTEwMC4gUmlnaHQgbm93IHdlIGFsd2F5cyB1c2UgNjYKKwkgKi8KIAogCXBjaV9taHogPSBocHQzeDJuX3BjaV9jbG9jayhkZXYpOwogCkBAIC01MjIsNyArNTczLDcgQEAKIAlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCAweDVCLCAweDIxKTsKIAogCS8qIFVubGlrZSB0aGUgMzd4IHdlIGRvbid0IHRyeSBqaWdnbGluZyB0aGUgZnJlcXVlbmN5ICovCi0JZm9yKGFkanVzdCA9IDA7IGFkanVzdCA8IDg7IGFkanVzdCsrKSB7CisJZm9yIChhZGp1c3QgPSAwOyBhZGp1c3QgPCA4OyBhZGp1c3QrKykgewogCQlpZiAoaHB0M3huX2NhbGlicmF0ZV9kcGxsKGRldikpCiAJCQlicmVhazsKIAkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChkZXYsIDB4NUMsIChmX2hpZ2ggPDwgMTYpIHwgZl9sb3cpOwpAQCAtNTM0LDggKzU4NSwxMSBAQAogCiAJcHJpbnRrKEtFUk5fSU5GTyAicGF0YV9ocHQzN3g6IGJ1cyBjbG9jayAlZE1IeiwgdXNpbmcgNjZNSHogRFBMTC5cbiIsCiAJICAgICAgIHBjaV9taHopOwotCS8qIFNldCBvdXIgcHJpdmF0ZSBkYXRhIHVwLiBXZSBvbmx5IG5lZWQgYSBmZXcgZmxhZ3Mgc28gd2UgdXNlCi0JICAgaXQgZGlyZWN0bHkgKi8KKworCS8qCisJICogU2V0IG91ciBwcml2YXRlIGRhdGEgdXAuIFdlIG9ubHkgbmVlZCBhIGZldyBmbGFncworCSAqIHNvIHdlIHVzZSBpdCBkaXJlY3RseS4KKwkgKi8KIAlpZiAocGNpX21oeiA+IDYwKQogCQlocHJpdiA9ICh2b2lkICopKFBDSTY2IHwgVVNFX0RQTEwpOwogCkBAIC01NjIsOSArNjE2LDkgQEAKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBocHQzeDJuX3BjaV9kcml2ZXIgPSB7Ci0JLm5hbWUgCQk9IERSVl9OQU1FLAorCS5uYW1lCQk9IERSVl9OQU1FLAogCS5pZF90YWJsZQk9IGhwdDN4Mm4sCi0JLnByb2JlIAkJPSBocHQzeDJuX2luaXRfb25lLAorCS5wcm9iZQkJPSBocHQzeDJuX2luaXRfb25lLAogCS5yZW1vdmUJCT0gYXRhX3BjaV9yZW1vdmVfb25lCiB9OwogCkBAIC01NzksNyArNjMzLDcgQEAKIH0KIAogTU9EVUxFX0FVVEhPUigiQWxhbiBDb3giKTsKLU1PRFVMRV9ERVNDUklQVElPTigibG93LWxldmVsIGRyaXZlciBmb3IgdGhlIEhpZ2hwb2ludCBIUFQzeDJuLzMweCIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJsb3ctbGV2ZWwgZHJpdmVyIGZvciB0aGUgSGlnaHBvaW50IEhQVDN4eE4iKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBocHQzeDJuKTsKIE1PRFVMRV9WRVJTSU9OKERSVl9WRVJTSU9OKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9iYXNlLmggYi9kcml2ZXJzL2Jhc2UvYmFzZS5oCmluZGV4IDJjYTdmNWIuLjE5ZjQ5ZTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9iYXNlLmgKKysrIGIvZHJpdmVycy9iYXNlL2Jhc2UuaApAQCAtMSwzMSArMSw0NiBAQAogCiAvKioKLSAqIHN0cnVjdCBidXNfdHlwZV9wcml2YXRlIC0gc3RydWN0dXJlIHRvIGhvbGQgdGhlIHByaXZhdGUgdG8gdGhlIGRyaXZlciBjb3JlIHBvcnRpb25zIG9mIHRoZSBidXNfdHlwZSBzdHJ1Y3R1cmUuCisgKiBzdHJ1Y3Qgc3Vic3lzX3ByaXZhdGUgLSBzdHJ1Y3R1cmUgdG8gaG9sZCB0aGUgcHJpdmF0ZSB0byB0aGUgZHJpdmVyIGNvcmUgcG9ydGlvbnMgb2YgdGhlIGJ1c190eXBlL2NsYXNzIHN0cnVjdHVyZS4KICAqCi0gKiBAc3Vic3lzIC0gdGhlIHN0cnVjdCBrc2V0IHRoYXQgZGVmaW5lcyB0aGlzIGJ1cy4gIFRoaXMgaXMgdGhlIG1haW4ga29iamVjdAotICogQGRyaXZlcnNfa3NldCAtIHRoZSBsaXN0IG9mIGRyaXZlcnMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgYnVzCi0gKiBAZGV2aWNlc19rc2V0IC0gdGhlIGxpc3Qgb2YgZGV2aWNlcyBhc3NvY2lhdGVkIHdpdGggdGhpcyBidXMKKyAqIEBzdWJzeXMgLSB0aGUgc3RydWN0IGtzZXQgdGhhdCBkZWZpbmVzIHRoaXMgc3Vic3lzdGVtCisgKiBAZGV2aWNlc19rc2V0IC0gdGhlIGxpc3Qgb2YgZGV2aWNlcyBhc3NvY2lhdGVkCisgKgorICogQGRyaXZlcnNfa3NldCAtIHRoZSBsaXN0IG9mIGRyaXZlcnMgYXNzb2NpYXRlZAogICogQGtsaXN0X2RldmljZXMgLSB0aGUga2xpc3QgdG8gaXRlcmF0ZSBvdmVyIHRoZSBAZGV2aWNlc19rc2V0CiAgKiBAa2xpc3RfZHJpdmVycyAtIHRoZSBrbGlzdCB0byBpdGVyYXRlIG92ZXIgdGhlIEBkcml2ZXJzX2tzZXQKICAqIEBidXNfbm90aWZpZXIgLSB0aGUgYnVzIG5vdGlmaWVyIGxpc3QgZm9yIGFueXRoaW5nIHRoYXQgY2FyZXMgYWJvdXQgdGhpbmdzCi0gKiBvbiB0aGlzIGJ1cy4KKyAqICAgICAgICAgICAgICAgICBvbiB0aGlzIGJ1cy4KICAqIEBidXMgLSBwb2ludGVyIGJhY2sgdG8gdGhlIHN0cnVjdCBidXNfdHlwZSB0aGF0IHRoaXMgc3RydWN0dXJlIGlzIGFzc29jaWF0ZWQKLSAqIHdpdGguCisgKiAgICAgICAgd2l0aC4KKyAqCisgKiBAY2xhc3NfaW50ZXJmYWNlcyAtIGxpc3Qgb2YgY2xhc3NfaW50ZXJmYWNlcyBhc3NvY2lhdGVkCisgKiBAZ2x1ZV9kaXJzIC0gImdsdWUiIGRpcmVjdG9yeSB0byBwdXQgaW4tYmV0d2VlbiB0aGUgcGFyZW50IGRldmljZSB0bworICogICAgICAgICAgICAgIGF2b2lkIG5hbWVzcGFjZSBjb25mbGljdHMKKyAqIEBjbGFzc19tdXRleCAtIG11dGV4IHRvIHByb3RlY3QgdGhlIGNoaWxkcmVuLCBkZXZpY2VzLCBhbmQgaW50ZXJmYWNlcyBsaXN0cy4KKyAqIEBjbGFzcyAtIHBvaW50ZXIgYmFjayB0byB0aGUgc3RydWN0IGNsYXNzIHRoYXQgdGhpcyBzdHJ1Y3R1cmUgaXMgYXNzb2NpYXRlZAorICogICAgICAgICAgd2l0aC4KICAqCiAgKiBUaGlzIHN0cnVjdHVyZSBpcyB0aGUgb25lIHRoYXQgaXMgdGhlIGFjdHVhbCBrb2JqZWN0IGFsbG93aW5nIHN0cnVjdAotICogYnVzX3R5cGUgdG8gYmUgc3RhdGljYWxseSBhbGxvY2F0ZWQgc2FmZWx5LiAgTm90aGluZyBvdXRzaWRlIG9mIHRoZSBkcml2ZXIKLSAqIGNvcmUgc2hvdWxkIGV2ZXIgdG91Y2ggdGhlc2UgZmllbGRzLgorICogYnVzX3R5cGUvY2xhc3MgdG8gYmUgc3RhdGljYWxseSBhbGxvY2F0ZWQgc2FmZWx5LiAgTm90aGluZyBvdXRzaWRlIG9mIHRoZQorICogZHJpdmVyIGNvcmUgc2hvdWxkIGV2ZXIgdG91Y2ggdGhlc2UgZmllbGRzLgogICovCi1zdHJ1Y3QgYnVzX3R5cGVfcHJpdmF0ZSB7CitzdHJ1Y3Qgc3Vic3lzX3ByaXZhdGUgewogCXN0cnVjdCBrc2V0IHN1YnN5czsKLQlzdHJ1Y3Qga3NldCAqZHJpdmVyc19rc2V0OwogCXN0cnVjdCBrc2V0ICpkZXZpY2VzX2tzZXQ7CisKKwlzdHJ1Y3Qga3NldCAqZHJpdmVyc19rc2V0OwogCXN0cnVjdCBrbGlzdCBrbGlzdF9kZXZpY2VzOwogCXN0cnVjdCBrbGlzdCBrbGlzdF9kcml2ZXJzOwogCXN0cnVjdCBibG9ja2luZ19ub3RpZmllcl9oZWFkIGJ1c19ub3RpZmllcjsKIAl1bnNpZ25lZCBpbnQgZHJpdmVyc19hdXRvcHJvYmU6MTsKIAlzdHJ1Y3QgYnVzX3R5cGUgKmJ1czsKKworCXN0cnVjdCBsaXN0X2hlYWQgY2xhc3NfaW50ZXJmYWNlczsKKwlzdHJ1Y3Qga3NldCBnbHVlX2RpcnM7CisJc3RydWN0IG11dGV4IGNsYXNzX211dGV4OworCXN0cnVjdCBjbGFzcyAqY2xhc3M7CiB9OworI2RlZmluZSB0b19zdWJzeXNfcHJpdmF0ZShvYmopIGNvbnRhaW5lcl9vZihvYmosIHN0cnVjdCBzdWJzeXNfcHJpdmF0ZSwgc3Vic3lzLmtvYmopCiAKIHN0cnVjdCBkcml2ZXJfcHJpdmF0ZSB7CiAJc3RydWN0IGtvYmplY3Qga29iajsKQEAgLTM2LDMzICs1MSw2IEBACiB9OwogI2RlZmluZSB0b19kcml2ZXIob2JqKSBjb250YWluZXJfb2Yob2JqLCBzdHJ1Y3QgZHJpdmVyX3ByaXZhdGUsIGtvYmopCiAKLQotLyoqCi0gKiBzdHJ1Y3QgY2xhc3NfcHJpdmF0ZSAtIHN0cnVjdHVyZSB0byBob2xkIHRoZSBwcml2YXRlIHRvIHRoZSBkcml2ZXIgY29yZSBwb3J0aW9ucyBvZiB0aGUgY2xhc3Mgc3RydWN0dXJlLgotICoKLSAqIEBjbGFzc19zdWJzeXMgLSB0aGUgc3RydWN0IGtzZXQgdGhhdCBkZWZpbmVzIHRoaXMgY2xhc3MuICBUaGlzIGlzIHRoZSBtYWluIGtvYmplY3QKLSAqIEBjbGFzc19kZXZpY2VzIC0gbGlzdCBvZiBkZXZpY2VzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNsYXNzCi0gKiBAY2xhc3NfaW50ZXJmYWNlcyAtIGxpc3Qgb2YgY2xhc3NfaW50ZXJmYWNlcyBhc3NvY2lhdGVkIHdpdGggdGhpcyBjbGFzcwotICogQGNsYXNzX2RpcnMgLSAiZ2x1ZSIgZGlyZWN0b3J5IGZvciB2aXJ0dWFsIGRldmljZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY2xhc3MKLSAqIEBjbGFzc19tdXRleCAtIG11dGV4IHRvIHByb3RlY3QgdGhlIGNoaWxkcmVuLCBkZXZpY2VzLCBhbmQgaW50ZXJmYWNlcyBsaXN0cy4KLSAqIEBjbGFzcyAtIHBvaW50ZXIgYmFjayB0byB0aGUgc3RydWN0IGNsYXNzIHRoYXQgdGhpcyBzdHJ1Y3R1cmUgaXMgYXNzb2NpYXRlZAotICogd2l0aC4KLSAqCi0gKiBUaGlzIHN0cnVjdHVyZSBpcyB0aGUgb25lIHRoYXQgaXMgdGhlIGFjdHVhbCBrb2JqZWN0IGFsbG93aW5nIHN0cnVjdAotICogY2xhc3MgdG8gYmUgc3RhdGljYWxseSBhbGxvY2F0ZWQgc2FmZWx5LiAgTm90aGluZyBvdXRzaWRlIG9mIHRoZSBkcml2ZXIKLSAqIGNvcmUgc2hvdWxkIGV2ZXIgdG91Y2ggdGhlc2UgZmllbGRzLgotICovCi1zdHJ1Y3QgY2xhc3NfcHJpdmF0ZSB7Ci0Jc3RydWN0IGtzZXQgY2xhc3Nfc3Vic3lzOwotCXN0cnVjdCBrbGlzdCBjbGFzc19kZXZpY2VzOwotCXN0cnVjdCBsaXN0X2hlYWQgY2xhc3NfaW50ZXJmYWNlczsKLQlzdHJ1Y3Qga3NldCBjbGFzc19kaXJzOwotCXN0cnVjdCBtdXRleCBjbGFzc19tdXRleDsKLQlzdHJ1Y3QgY2xhc3MgKmNsYXNzOwotfTsKLSNkZWZpbmUgdG9fY2xhc3Mob2JqKQlcCi0JY29udGFpbmVyX29mKG9iaiwgc3RydWN0IGNsYXNzX3ByaXZhdGUsIGNsYXNzX3N1YnN5cy5rb2JqKQotCiAvKioKICAqIHN0cnVjdCBkZXZpY2VfcHJpdmF0ZSAtIHN0cnVjdHVyZSB0byBob2xkIHRoZSBwcml2YXRlIHRvIHRoZSBkcml2ZXIgY29yZSBwb3J0aW9ucyBvZiB0aGUgZGV2aWNlIHN0cnVjdHVyZS4KICAqCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvYnVzLmMgYi9kcml2ZXJzL2Jhc2UvYnVzLmMKaW5kZXggMzNjMjcwYS4uZTI0M2JkNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL2J1cy5jCisrKyBiL2RyaXZlcnMvYmFzZS9idXMuYwpAQCAtMjAsNyArMjAsNiBAQAogI2luY2x1ZGUgInBvd2VyL3Bvd2VyLmgiCiAKICNkZWZpbmUgdG9fYnVzX2F0dHIoX2F0dHIpIGNvbnRhaW5lcl9vZihfYXR0ciwgc3RydWN0IGJ1c19hdHRyaWJ1dGUsIGF0dHIpCi0jZGVmaW5lIHRvX2J1cyhvYmopIGNvbnRhaW5lcl9vZihvYmosIHN0cnVjdCBidXNfdHlwZV9wcml2YXRlLCBzdWJzeXMua29iaikKIAogLyoKICAqIHN5c2ZzIGJpbmRpbmdzIGZvciBkcml2ZXJzCkBAIC05NiwxMSArOTUsMTEgQEAKIAkJCSAgICAgY2hhciAqYnVmKQogewogCXN0cnVjdCBidXNfYXR0cmlidXRlICpidXNfYXR0ciA9IHRvX2J1c19hdHRyKGF0dHIpOwotCXN0cnVjdCBidXNfdHlwZV9wcml2YXRlICpidXNfcHJpdiA9IHRvX2J1cyhrb2JqKTsKKwlzdHJ1Y3Qgc3Vic3lzX3ByaXZhdGUgKnN1YnN5c19wcml2ID0gdG9fc3Vic3lzX3ByaXZhdGUoa29iaik7CiAJc3NpemVfdCByZXQgPSAwOwogCiAJaWYgKGJ1c19hdHRyLT5zaG93KQotCQlyZXQgPSBidXNfYXR0ci0+c2hvdyhidXNfcHJpdi0+YnVzLCBidWYpOworCQlyZXQgPSBidXNfYXR0ci0+c2hvdyhzdWJzeXNfcHJpdi0+YnVzLCBidWYpOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTEwOCwxMSArMTA3LDExIEBACiAJCQkgICAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKIHsKIAlzdHJ1Y3QgYnVzX2F0dHJpYnV0ZSAqYnVzX2F0dHIgPSB0b19idXNfYXR0cihhdHRyKTsKLQlzdHJ1Y3QgYnVzX3R5cGVfcHJpdmF0ZSAqYnVzX3ByaXYgPSB0b19idXMoa29iaik7CisJc3RydWN0IHN1YnN5c19wcml2YXRlICpzdWJzeXNfcHJpdiA9IHRvX3N1YnN5c19wcml2YXRlKGtvYmopOwogCXNzaXplX3QgcmV0ID0gMDsKIAogCWlmIChidXNfYXR0ci0+c3RvcmUpCi0JCXJldCA9IGJ1c19hdHRyLT5zdG9yZShidXNfcHJpdi0+YnVzLCBidWYsIGNvdW50KTsKKwkJcmV0ID0gYnVzX2F0dHItPnN0b3JlKHN1YnN5c19wcml2LT5idXMsIGJ1ZiwgY291bnQpOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTg1OCw5ICs4NTcsOSBAQAogaW50IGJ1c19yZWdpc3RlcihzdHJ1Y3QgYnVzX3R5cGUgKmJ1cykKIHsKIAlpbnQgcmV0dmFsOwotCXN0cnVjdCBidXNfdHlwZV9wcml2YXRlICpwcml2OworCXN0cnVjdCBzdWJzeXNfcHJpdmF0ZSAqcHJpdjsKIAotCXByaXYgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYnVzX3R5cGVfcHJpdmF0ZSksIEdGUF9LRVJORUwpOworCXByaXYgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgc3Vic3lzX3ByaXZhdGUpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXByaXYpCiAJCXJldHVybiAtRU5PTUVNOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvY2xhc3MuYyBiL2RyaXZlcnMvYmFzZS9jbGFzcy5jCmluZGV4IDljNjNhNTYuLjRmMWRmMmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9jbGFzcy5jCisrKyBiL2RyaXZlcnMvYmFzZS9jbGFzcy5jCkBAIC0yNyw3ICsyNyw3IEBACiAJCQkgICAgICAgY2hhciAqYnVmKQogewogCXN0cnVjdCBjbGFzc19hdHRyaWJ1dGUgKmNsYXNzX2F0dHIgPSB0b19jbGFzc19hdHRyKGF0dHIpOwotCXN0cnVjdCBjbGFzc19wcml2YXRlICpjcCA9IHRvX2NsYXNzKGtvYmopOworCXN0cnVjdCBzdWJzeXNfcHJpdmF0ZSAqY3AgPSB0b19zdWJzeXNfcHJpdmF0ZShrb2JqKTsKIAlzc2l6ZV90IHJldCA9IC1FSU87CiAKIAlpZiAoY2xhc3NfYXR0ci0+c2hvdykKQEAgLTM5LDcgKzM5LDcgQEAKIAkJCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKIHsKIAlzdHJ1Y3QgY2xhc3NfYXR0cmlidXRlICpjbGFzc19hdHRyID0gdG9fY2xhc3NfYXR0cihhdHRyKTsKLQlzdHJ1Y3QgY2xhc3NfcHJpdmF0ZSAqY3AgPSB0b19jbGFzcyhrb2JqKTsKKwlzdHJ1Y3Qgc3Vic3lzX3ByaXZhdGUgKmNwID0gdG9fc3Vic3lzX3ByaXZhdGUoa29iaik7CiAJc3NpemVfdCByZXQgPSAtRUlPOwogCiAJaWYgKGNsYXNzX2F0dHItPnN0b3JlKQpAQCAtNDksNyArNDksNyBAQAogCiBzdGF0aWMgdm9pZCBjbGFzc19yZWxlYXNlKHN0cnVjdCBrb2JqZWN0ICprb2JqKQogewotCXN0cnVjdCBjbGFzc19wcml2YXRlICpjcCA9IHRvX2NsYXNzKGtvYmopOworCXN0cnVjdCBzdWJzeXNfcHJpdmF0ZSAqY3AgPSB0b19zdWJzeXNfcHJpdmF0ZShrb2JqKTsKIAlzdHJ1Y3QgY2xhc3MgKmNsYXNzID0gY3AtPmNsYXNzOwogCiAJcHJfZGVidWcoImNsYXNzICclcyc6IHJlbGVhc2UuXG4iLCBjbGFzcy0+bmFtZSk7CkBAIC02NSw3ICs2NSw3IEBACiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qga29ial9uc190eXBlX29wZXJhdGlvbnMgKmNsYXNzX2NoaWxkX25zX3R5cGUoc3RydWN0IGtvYmplY3QgKmtvYmopCiB7Ci0Jc3RydWN0IGNsYXNzX3ByaXZhdGUgKmNwID0gdG9fY2xhc3Moa29iaik7CisJc3RydWN0IHN1YnN5c19wcml2YXRlICpjcCA9IHRvX3N1YnN5c19wcml2YXRlKGtvYmopOwogCXN0cnVjdCBjbGFzcyAqY2xhc3MgPSBjcC0+Y2xhc3M7CiAKIAlyZXR1cm4gY2xhc3MtPm5zX3R5cGU7CkBAIC04Miw3ICs4Miw3IEBACiAJLmNoaWxkX25zX3R5cGUJPSBjbGFzc19jaGlsZF9uc190eXBlLAogfTsKIAotLyogSG90cGx1ZyBldmVudHMgZm9yIGNsYXNzZXMgZ28gdG8gdGhlIGNsYXNzIGNsYXNzX3N1YnN5cyAqLworLyogSG90cGx1ZyBldmVudHMgZm9yIGNsYXNzZXMgZ28gdG8gdGhlIGNsYXNzIHN1YnN5cyAqLwogc3RhdGljIHN0cnVjdCBrc2V0ICpjbGFzc19rc2V0OwogCiAKQEAgLTkwLDcgKzkwLDcgQEAKIHsKIAlpbnQgZXJyb3I7CiAJaWYgKGNscykKLQkJZXJyb3IgPSBzeXNmc19jcmVhdGVfZmlsZSgmY2xzLT5wLT5jbGFzc19zdWJzeXMua29iaiwKKwkJZXJyb3IgPSBzeXNmc19jcmVhdGVfZmlsZSgmY2xzLT5wLT5zdWJzeXMua29iaiwKIAkJCQkJICAmYXR0ci0+YXR0cik7CiAJZWxzZQogCQllcnJvciA9IC1FSU5WQUw7CkBAIC0xMDAsMjAgKzEwMCwyMCBAQAogdm9pZCBjbGFzc19yZW1vdmVfZmlsZShzdHJ1Y3QgY2xhc3MgKmNscywgY29uc3Qgc3RydWN0IGNsYXNzX2F0dHJpYnV0ZSAqYXR0cikKIHsKIAlpZiAoY2xzKQotCQlzeXNmc19yZW1vdmVfZmlsZSgmY2xzLT5wLT5jbGFzc19zdWJzeXMua29iaiwgJmF0dHItPmF0dHIpOworCQlzeXNmc19yZW1vdmVfZmlsZSgmY2xzLT5wLT5zdWJzeXMua29iaiwgJmF0dHItPmF0dHIpOwogfQogCiBzdGF0aWMgc3RydWN0IGNsYXNzICpjbGFzc19nZXQoc3RydWN0IGNsYXNzICpjbHMpCiB7CiAJaWYgKGNscykKLQkJa3NldF9nZXQoJmNscy0+cC0+Y2xhc3Nfc3Vic3lzKTsKKwkJa3NldF9nZXQoJmNscy0+cC0+c3Vic3lzKTsKIAlyZXR1cm4gY2xzOwogfQogCiBzdGF0aWMgdm9pZCBjbGFzc19wdXQoc3RydWN0IGNsYXNzICpjbHMpCiB7CiAJaWYgKGNscykKLQkJa3NldF9wdXQoJmNscy0+cC0+Y2xhc3Nfc3Vic3lzKTsKKwkJa3NldF9wdXQoJmNscy0+cC0+c3Vic3lzKTsKIH0KIAogc3RhdGljIGludCBhZGRfY2xhc3NfYXR0cnMoc3RydWN0IGNsYXNzICpjbHMpCkBAIC0xNjIsNyArMTYyLDcgQEAKIAogaW50IF9fY2xhc3NfcmVnaXN0ZXIoc3RydWN0IGNsYXNzICpjbHMsIHN0cnVjdCBsb2NrX2NsYXNzX2tleSAqa2V5KQogewotCXN0cnVjdCBjbGFzc19wcml2YXRlICpjcDsKKwlzdHJ1Y3Qgc3Vic3lzX3ByaXZhdGUgKmNwOwogCWludCBlcnJvcjsKIAogCXByX2RlYnVnKCJkZXZpY2UgY2xhc3MgJyVzJzogcmVnaXN0ZXJpbmdcbiIsIGNscy0+bmFtZSk7CkBAIC0xNzAsMTEgKzE3MCwxMSBAQAogCWNwID0ga3phbGxvYyhzaXplb2YoKmNwKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFjcCkKIAkJcmV0dXJuIC1FTk9NRU07Ci0Ja2xpc3RfaW5pdCgmY3AtPmNsYXNzX2RldmljZXMsIGtsaXN0X2NsYXNzX2Rldl9nZXQsIGtsaXN0X2NsYXNzX2Rldl9wdXQpOworCWtsaXN0X2luaXQoJmNwLT5rbGlzdF9kZXZpY2VzLCBrbGlzdF9jbGFzc19kZXZfZ2V0LCBrbGlzdF9jbGFzc19kZXZfcHV0KTsKIAlJTklUX0xJU1RfSEVBRCgmY3AtPmNsYXNzX2ludGVyZmFjZXMpOwotCWtzZXRfaW5pdCgmY3AtPmNsYXNzX2RpcnMpOworCWtzZXRfaW5pdCgmY3AtPmdsdWVfZGlycyk7CiAJX19tdXRleF9pbml0KCZjcC0+Y2xhc3NfbXV0ZXgsICJzdHJ1Y3QgY2xhc3MgbXV0ZXgiLCBrZXkpOwotCWVycm9yID0ga29iamVjdF9zZXRfbmFtZSgmY3AtPmNsYXNzX3N1YnN5cy5rb2JqLCAiJXMiLCBjbHMtPm5hbWUpOworCWVycm9yID0ga29iamVjdF9zZXRfbmFtZSgmY3AtPnN1YnN5cy5rb2JqLCAiJXMiLCBjbHMtPm5hbWUpOwogCWlmIChlcnJvcikgewogCQlrZnJlZShjcCk7CiAJCXJldHVybiBlcnJvcjsKQEAgLTE4NywxNSArMTg3LDE1IEBACiAjaWYgZGVmaW5lZChDT05GSUdfQkxPQ0spCiAJLyogbGV0IHRoZSBibG9jayBjbGFzcyBkaXJlY3Rvcnkgc2hvdyB1cCBpbiB0aGUgcm9vdCBvZiBzeXNmcyAqLwogCWlmICghc3lzZnNfZGVwcmVjYXRlZCB8fCBjbHMgIT0gJmJsb2NrX2NsYXNzKQotCQljcC0+Y2xhc3Nfc3Vic3lzLmtvYmoua3NldCA9IGNsYXNzX2tzZXQ7CisJCWNwLT5zdWJzeXMua29iai5rc2V0ID0gY2xhc3Nfa3NldDsKICNlbHNlCi0JY3AtPmNsYXNzX3N1YnN5cy5rb2JqLmtzZXQgPSBjbGFzc19rc2V0OworCWNwLT5zdWJzeXMua29iai5rc2V0ID0gY2xhc3Nfa3NldDsKICNlbmRpZgotCWNwLT5jbGFzc19zdWJzeXMua29iai5rdHlwZSA9ICZjbGFzc19rdHlwZTsKKwljcC0+c3Vic3lzLmtvYmoua3R5cGUgPSAmY2xhc3Nfa3R5cGU7CiAJY3AtPmNsYXNzID0gY2xzOwogCWNscy0+cCA9IGNwOwogCi0JZXJyb3IgPSBrc2V0X3JlZ2lzdGVyKCZjcC0+Y2xhc3Nfc3Vic3lzKTsKKwllcnJvciA9IGtzZXRfcmVnaXN0ZXIoJmNwLT5zdWJzeXMpOwogCWlmIChlcnJvcikgewogCQlrZnJlZShjcCk7CiAJCXJldHVybiBlcnJvcjsKQEAgLTIxMCw3ICsyMTAsNyBAQAogewogCXByX2RlYnVnKCJkZXZpY2UgY2xhc3MgJyVzJzogdW5yZWdpc3RlcmluZ1xuIiwgY2xzLT5uYW1lKTsKIAlyZW1vdmVfY2xhc3NfYXR0cnMoY2xzKTsKLQlrc2V0X3VucmVnaXN0ZXIoJmNscy0+cC0+Y2xhc3Nfc3Vic3lzKTsKKwlrc2V0X3VucmVnaXN0ZXIoJmNscy0+cC0+c3Vic3lzKTsKIH0KIAogc3RhdGljIHZvaWQgY2xhc3NfY3JlYXRlX3JlbGVhc2Uoc3RydWN0IGNsYXNzICpjbHMpCkBAIC0yOTUsNyArMjk1LDcgQEAKIAogCWlmIChzdGFydCkKIAkJc3RhcnRfa25vZGUgPSAmc3RhcnQtPmtub2RlX2NsYXNzOwotCWtsaXN0X2l0ZXJfaW5pdF9ub2RlKCZjbGFzcy0+cC0+Y2xhc3NfZGV2aWNlcywgJml0ZXItPmtpLCBzdGFydF9rbm9kZSk7CisJa2xpc3RfaXRlcl9pbml0X25vZGUoJmNsYXNzLT5wLT5rbGlzdF9kZXZpY2VzLCAmaXRlci0+a2ksIHN0YXJ0X2tub2RlKTsKIAlpdGVyLT50eXBlID0gdHlwZTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGNsYXNzX2Rldl9pdGVyX2luaXQpOwpAQCAtNDgyLDggKzQ4Miw4IEBACiAJY2xhc3NfcHV0KHBhcmVudCk7CiB9CiAKLXNzaXplX3Qgc2hvd19jbGFzc19hdHRyX3N0cmluZyhzdHJ1Y3QgY2xhc3MgKmNsYXNzLCBzdHJ1Y3QgY2xhc3NfYXR0cmlidXRlICphdHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgCWNoYXIgKmJ1ZikKK3NzaXplX3Qgc2hvd19jbGFzc19hdHRyX3N0cmluZyhzdHJ1Y3QgY2xhc3MgKmNsYXNzLAorCQkJICAgICAgIHN0cnVjdCBjbGFzc19hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKIAlzdHJ1Y3QgY2xhc3NfYXR0cmlidXRlX3N0cmluZyAqY3M7CiAJY3MgPSBjb250YWluZXJfb2YoYXR0ciwgc3RydWN0IGNsYXNzX2F0dHJpYnV0ZV9zdHJpbmcsIGF0dHIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL2NvcmUuYyBiL2RyaXZlcnMvYmFzZS9jb3JlLmMKaW5kZXggNmVkNjQ1NC4uMDgwZTljYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL2NvcmUuYworKysgYi9kcml2ZXJzL2Jhc2UvY29yZS5jCkBAIC0zMzgsNiArMzM4LDM1IEBACiAJCQlkZXZpY2VfcmVtb3ZlX2ZpbGUoZGV2LCAmYXR0cnNbaV0pOwogfQogCitzdGF0aWMgaW50IGRldmljZV9hZGRfYmluX2F0dHJpYnV0ZXMoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgICAgc3RydWN0IGJpbl9hdHRyaWJ1dGUgKmF0dHJzKQoreworCWludCBlcnJvciA9IDA7CisJaW50IGk7CisKKwlpZiAoYXR0cnMpIHsKKwkJZm9yIChpID0gMDsgYXR0cl9uYW1lKGF0dHJzW2ldKTsgaSsrKSB7CisJCQllcnJvciA9IGRldmljZV9jcmVhdGVfYmluX2ZpbGUoZGV2LCAmYXR0cnNbaV0pOworCQkJaWYgKGVycm9yKQorCQkJCWJyZWFrOworCQl9CisJCWlmIChlcnJvcikKKwkJCXdoaWxlICgtLWkgPj0gMCkKKwkJCQlkZXZpY2VfcmVtb3ZlX2Jpbl9maWxlKGRldiwgJmF0dHJzW2ldKTsKKwl9CisJcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgdm9pZCBkZXZpY2VfcmVtb3ZlX2Jpbl9hdHRyaWJ1dGVzKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkJIHN0cnVjdCBiaW5fYXR0cmlidXRlICphdHRycykKK3sKKwlpbnQgaTsKKworCWlmIChhdHRycykKKwkJZm9yIChpID0gMDsgYXR0cl9uYW1lKGF0dHJzW2ldKTsgaSsrKQorCQkJZGV2aWNlX3JlbW92ZV9iaW5fZmlsZShkZXYsICZhdHRyc1tpXSk7Cit9CisKIHN0YXRpYyBpbnQgZGV2aWNlX2FkZF9ncm91cHMoc3RydWN0IGRldmljZSAqZGV2LAogCQkJICAgICBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwICoqZ3JvdXBzKQogewpAQCAtMzc4LDEyICs0MDcsMTUgQEAKIAkJZXJyb3IgPSBkZXZpY2VfYWRkX2F0dHJpYnV0ZXMoZGV2LCBjbGFzcy0+ZGV2X2F0dHJzKTsKIAkJaWYgKGVycm9yKQogCQkJcmV0dXJuIGVycm9yOworCQllcnJvciA9IGRldmljZV9hZGRfYmluX2F0dHJpYnV0ZXMoZGV2LCBjbGFzcy0+ZGV2X2Jpbl9hdHRycyk7CisJCWlmIChlcnJvcikKKwkJCWdvdG8gZXJyX3JlbW92ZV9jbGFzc19hdHRyczsKIAl9CiAKIAlpZiAodHlwZSkgewogCQllcnJvciA9IGRldmljZV9hZGRfZ3JvdXBzKGRldiwgdHlwZS0+Z3JvdXBzKTsKIAkJaWYgKGVycm9yKQotCQkJZ290byBlcnJfcmVtb3ZlX2NsYXNzX2F0dHJzOworCQkJZ290byBlcnJfcmVtb3ZlX2NsYXNzX2Jpbl9hdHRyczsKIAl9CiAKIAllcnJvciA9IGRldmljZV9hZGRfZ3JvdXBzKGRldiwgZGV2LT5ncm91cHMpOwpAQCAtMzk1LDYgKzQyNyw5IEBACiAgZXJyX3JlbW92ZV90eXBlX2dyb3VwczoKIAlpZiAodHlwZSkKIAkJZGV2aWNlX3JlbW92ZV9ncm91cHMoZGV2LCB0eXBlLT5ncm91cHMpOworIGVycl9yZW1vdmVfY2xhc3NfYmluX2F0dHJzOgorCWlmIChjbGFzcykKKwkJZGV2aWNlX3JlbW92ZV9iaW5fYXR0cmlidXRlcyhkZXYsIGNsYXNzLT5kZXZfYmluX2F0dHJzKTsKICBlcnJfcmVtb3ZlX2NsYXNzX2F0dHJzOgogCWlmIChjbGFzcykKIAkJZGV2aWNlX3JlbW92ZV9hdHRyaWJ1dGVzKGRldiwgY2xhc3MtPmRldl9hdHRycyk7CkBAIC00MTIsOCArNDQ3LDEwIEBACiAJaWYgKHR5cGUpCiAJCWRldmljZV9yZW1vdmVfZ3JvdXBzKGRldiwgdHlwZS0+Z3JvdXBzKTsKIAotCWlmIChjbGFzcykKKwlpZiAoY2xhc3MpIHsKIAkJZGV2aWNlX3JlbW92ZV9hdHRyaWJ1dGVzKGRldiwgY2xhc3MtPmRldl9hdHRycyk7CisJCWRldmljZV9yZW1vdmVfYmluX2F0dHJpYnV0ZXMoZGV2LCBjbGFzcy0+ZGV2X2Jpbl9hdHRycyk7CisJfQogfQogCiAKQEAgLTYxMCw3ICs2NDcsNyBAQAogCWRpci0+Y2xhc3MgPSBjbGFzczsKIAlrb2JqZWN0X2luaXQoJmRpci0+a29iaiwgJmNsYXNzX2Rpcl9rdHlwZSk7CiAKLQlkaXItPmtvYmoua3NldCA9ICZjbGFzcy0+cC0+Y2xhc3NfZGlyczsKKwlkaXItPmtvYmoua3NldCA9ICZjbGFzcy0+cC0+Z2x1ZV9kaXJzOwogCiAJcmV0dmFsID0ga29iamVjdF9hZGQoJmRpci0+a29iaiwgcGFyZW50X2tvYmosICIlcyIsIGNsYXNzLT5uYW1lKTsKIAlpZiAocmV0dmFsIDwgMCkgewpAQCAtNjM1LDcgKzY3Miw3IEBACiAJCWlmIChzeXNmc19kZXByZWNhdGVkICYmIGRldi0+Y2xhc3MgPT0gJmJsb2NrX2NsYXNzKSB7CiAJCQlpZiAocGFyZW50ICYmIHBhcmVudC0+Y2xhc3MgPT0gJmJsb2NrX2NsYXNzKQogCQkJCXJldHVybiAmcGFyZW50LT5rb2JqOwotCQkJcmV0dXJuICZibG9ja19jbGFzcy5wLT5jbGFzc19zdWJzeXMua29iajsKKwkJCXJldHVybiAmYmxvY2tfY2xhc3MucC0+c3Vic3lzLmtvYmo7CiAJCX0KICNlbmRpZgogCkBAIC02NTQsMTMgKzY5MSwxMyBAQAogCQltdXRleF9sb2NrKCZnZHBfbXV0ZXgpOwogCiAJCS8qIGZpbmQgb3VyIGNsYXNzLWRpcmVjdG9yeSBhdCB0aGUgcGFyZW50IGFuZCByZWZlcmVuY2UgaXQgKi8KLQkJc3Bpbl9sb2NrKCZkZXYtPmNsYXNzLT5wLT5jbGFzc19kaXJzLmxpc3RfbG9jayk7Ci0JCWxpc3RfZm9yX2VhY2hfZW50cnkoaywgJmRldi0+Y2xhc3MtPnAtPmNsYXNzX2RpcnMubGlzdCwgZW50cnkpCisJCXNwaW5fbG9jaygmZGV2LT5jbGFzcy0+cC0+Z2x1ZV9kaXJzLmxpc3RfbG9jayk7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkoaywgJmRldi0+Y2xhc3MtPnAtPmdsdWVfZGlycy5saXN0LCBlbnRyeSkKIAkJCWlmIChrLT5wYXJlbnQgPT0gcGFyZW50X2tvYmopIHsKIAkJCQlrb2JqID0ga29iamVjdF9nZXQoayk7CiAJCQkJYnJlYWs7CiAJCQl9Ci0JCXNwaW5fdW5sb2NrKCZkZXYtPmNsYXNzLT5wLT5jbGFzc19kaXJzLmxpc3RfbG9jayk7CisJCXNwaW5fdW5sb2NrKCZkZXYtPmNsYXNzLT5wLT5nbHVlX2RpcnMubGlzdF9sb2NrKTsKIAkJaWYgKGtvYmopIHsKIAkJCW11dGV4X3VubG9jaygmZ2RwX211dGV4KTsKIAkJCXJldHVybiBrb2JqOwpAQCAtNjgyLDcgKzcxOSw3IEBACiB7CiAJLyogc2VlIGlmIHdlIGxpdmUgaW4gYSAiZ2x1ZSIgZGlyZWN0b3J5ICovCiAJaWYgKCFnbHVlX2RpciB8fCAhZGV2LT5jbGFzcyB8fAotCSAgICBnbHVlX2Rpci0+a3NldCAhPSAmZGV2LT5jbGFzcy0+cC0+Y2xhc3NfZGlycykKKwkgICAgZ2x1ZV9kaXItPmtzZXQgIT0gJmRldi0+Y2xhc3MtPnAtPmdsdWVfZGlycykKIAkJcmV0dXJuOwogCiAJa29iamVjdF9wdXQoZ2x1ZV9kaXIpOwpAQCAtNzA5LDcgKzc0Niw3IEBACiAJCXJldHVybiAwOwogCiAJZXJyb3IgPSBzeXNmc19jcmVhdGVfbGluaygmZGV2LT5rb2JqLAotCQkJCSAgJmRldi0+Y2xhc3MtPnAtPmNsYXNzX3N1YnN5cy5rb2JqLAorCQkJCSAgJmRldi0+Y2xhc3MtPnAtPnN1YnN5cy5rb2JqLAogCQkJCSAgInN1YnN5c3RlbSIpOwogCWlmIChlcnJvcikKIAkJZ290byBvdXQ7CkBAIC03MjgsNyArNzY1LDcgQEAKICNlbmRpZgogCiAJLyogbGluayBpbiB0aGUgY2xhc3MgZGlyZWN0b3J5IHBvaW50aW5nIHRvIHRoZSBkZXZpY2UgKi8KLQllcnJvciA9IHN5c2ZzX2NyZWF0ZV9saW5rKCZkZXYtPmNsYXNzLT5wLT5jbGFzc19zdWJzeXMua29iaiwKKwllcnJvciA9IHN5c2ZzX2NyZWF0ZV9saW5rKCZkZXYtPmNsYXNzLT5wLT5zdWJzeXMua29iaiwKIAkJCQkgICZkZXYtPmtvYmosIGRldl9uYW1lKGRldikpOwogCWlmIChlcnJvcikKIAkJZ290byBvdXRfZGV2aWNlOwpAQCAtNzU2LDcgKzc5Myw3IEBACiAJaWYgKHN5c2ZzX2RlcHJlY2F0ZWQgJiYgZGV2LT5jbGFzcyA9PSAmYmxvY2tfY2xhc3MpCiAJCXJldHVybjsKICNlbmRpZgotCXN5c2ZzX2RlbGV0ZV9saW5rKCZkZXYtPmNsYXNzLT5wLT5jbGFzc19zdWJzeXMua29iaiwgJmRldi0+a29iaiwgZGV2X25hbWUoZGV2KSk7CisJc3lzZnNfZGVsZXRlX2xpbmsoJmRldi0+Y2xhc3MtPnAtPnN1YnN5cy5rb2JqLCAmZGV2LT5rb2JqLCBkZXZfbmFtZShkZXYpKTsKIH0KIAogLyoqCkBAIC05NDcsNyArOTg0LDcgQEAKIAkJbXV0ZXhfbG9jaygmZGV2LT5jbGFzcy0+cC0+Y2xhc3NfbXV0ZXgpOwogCQkvKiB0aWUgdGhlIGNsYXNzIHRvIHRoZSBkZXZpY2UgKi8KIAkJa2xpc3RfYWRkX3RhaWwoJmRldi0+a25vZGVfY2xhc3MsCi0JCQkgICAgICAgJmRldi0+Y2xhc3MtPnAtPmNsYXNzX2RldmljZXMpOworCQkJICAgICAgICZkZXYtPmNsYXNzLT5wLT5rbGlzdF9kZXZpY2VzKTsKIAogCQkvKiBub3RpZnkgYW55IGludGVyZmFjZXMgdGhhdCB0aGUgZGV2aWNlIGlzIGhlcmUgKi8KIAkJbGlzdF9mb3JfZWFjaF9lbnRyeShjbGFzc19pbnRmLApAQCAtMTUxMyw2ICsxNTUwLDggQEAKICAqIGV4Y2x1c2lvbiBiZXR3ZWVuIHR3byBkaWZmZXJlbnQgY2FsbHMgb2YgZGV2aWNlX3JlbmFtZQogICogb24gdGhlIHNhbWUgZGV2aWNlIHRvIGVuc3VyZSB0aGF0IG5ld19uYW1lIGlzIHZhbGlkIGFuZAogICogd29uJ3QgY29uZmxpY3Qgd2l0aCBvdGhlciBkZXZpY2VzLgorICoKKyAqICJOZXZlciB1c2UgdGhpcyBmdW5jdGlvbiwgYmFkIHRoaW5ncyB3aWxsIGhhcHBlbiIgLSBncmVna2gKICAqLwogaW50IGRldmljZV9yZW5hbWUoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpuZXdfbmFtZSkKIHsKQEAgLTE1MzUsNyArMTU3NCw3IEBACiAJfQogCiAJaWYgKGRldi0+Y2xhc3MpIHsKLQkJZXJyb3IgPSBzeXNmc19yZW5hbWVfbGluaygmZGV2LT5jbGFzcy0+cC0+Y2xhc3Nfc3Vic3lzLmtvYmosCisJCWVycm9yID0gc3lzZnNfcmVuYW1lX2xpbmsoJmRldi0+Y2xhc3MtPnAtPnN1YnN5cy5rb2JqLAogCQkJJmRldi0+a29iaiwgb2xkX2RldmljZV9uYW1lLCBuZXdfbmFtZSk7CiAJCWlmIChlcnJvcikKIAkJCWdvdG8gb3V0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL3Bvd2VyL2dlbmVyaWNfb3BzLmMgYi9kcml2ZXJzL2Jhc2UvcG93ZXIvZ2VuZXJpY19vcHMuYwppbmRleCA4MWYyYzg0Li40MmY5N2Y5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvcG93ZXIvZ2VuZXJpY19vcHMuYworKysgYi9kcml2ZXJzL2Jhc2UvcG93ZXIvZ2VuZXJpY19vcHMuYwpAQCAtMzksNyArMzksNyBAQAogICoKICAqIElmIFBNIG9wZXJhdGlvbnMgYXJlIGRlZmluZWQgZm9yIHRoZSBAZGV2J3MgZHJpdmVyIGFuZCB0aGV5IGluY2x1ZGUKICAqIC0+cnVudGltZV9zdXNwZW5kKCksIGV4ZWN1dGUgaXQgYW5kIHJldHVybiBpdHMgZXJyb3IgY29kZS4gIE90aGVyd2lzZSwKLSAqIHJldHVybiAtRUlOVkFMLgorICogcmV0dXJuIDAuCiAgKi8KIGludCBwbV9nZW5lcmljX3J1bnRpbWVfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CkBAIC01OCw3ICs1OCw3IEBACiAgKgogICogSWYgUE0gb3BlcmF0aW9ucyBhcmUgZGVmaW5lZCBmb3IgdGhlIEBkZXYncyBkcml2ZXIgYW5kIHRoZXkgaW5jbHVkZQogICogLT5ydW50aW1lX3Jlc3VtZSgpLCBleGVjdXRlIGl0IGFuZCByZXR1cm4gaXRzIGVycm9yIGNvZGUuICBPdGhlcndpc2UsCi0gKiByZXR1cm4gLUVJTlZBTC4KKyAqIHJldHVybiAwLgogICovCiBpbnQgcG1fZ2VuZXJpY19ydW50aW1lX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CkBAIC0xODUsNyArMTg1LDcgQEAKIAkJcmV0dXJuIDA7CiAKIAlyZXQgPSBjYWxsYmFjayhkZXYpOwotCWlmICghcmV0KSB7CisJaWYgKCFyZXQgJiYgcG1fcnVudGltZV9lbmFibGVkKGRldikpIHsKIAkJcG1fcnVudGltZV9kaXNhYmxlKGRldik7CiAJCXBtX3J1bnRpbWVfc2V0X2FjdGl2ZShkZXYpOwogCQlwbV9ydW50aW1lX2VuYWJsZShkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL3Bvd2VyL21haW4uYyBiL2RyaXZlcnMvYmFzZS9wb3dlci9tYWluLmMKaW5kZXggZWFkM2U3OS4uMmE1MjI3MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL3Bvd2VyL21haW4uYworKysgYi9kcml2ZXJzL2Jhc2UvcG93ZXIvbWFpbi5jCkBAIC0yNiw2ICsyNiw3IEBACiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9hc3luYy5oPgorI2luY2x1ZGUgPGxpbnV4L3N1c3BlbmQuaD4KIAogI2luY2x1ZGUgIi4uL2Jhc2UuaCIKICNpbmNsdWRlICJwb3dlci5oIgpAQCAtNDEsMTYgKzQyLDEzIEBACiAgKi8KIAogTElTVF9IRUFEKGRwbV9saXN0KTsKK0xJU1RfSEVBRChkcG1fcHJlcGFyZWRfbGlzdCk7CitMSVNUX0hFQUQoZHBtX3N1c3BlbmRlZF9saXN0KTsKK0xJU1RfSEVBRChkcG1fbm9pcnFfbGlzdCk7CiAKIHN0YXRpYyBERUZJTkVfTVVURVgoZHBtX2xpc3RfbXR4KTsKIHN0YXRpYyBwbV9tZXNzYWdlX3QgcG1fdHJhbnNpdGlvbjsKIAotLyoKLSAqIFNldCBvbmNlIHRoZSBwcmVwYXJhdGlvbiBvZiBkZXZpY2VzIGZvciBhIFBNIHRyYW5zaXRpb24gaGFzIHN0YXJ0ZWQsIHJlc2V0Ci0gKiBiZWZvcmUgc3RhcnRpbmcgdG8gcmVzdW1lIGRldmljZXMuICBQcm90ZWN0ZWQgYnkgZHBtX2xpc3RfbXR4LgotICovCi1zdGF0aWMgYm9vbCB0cmFuc2l0aW9uX3N0YXJ0ZWQ7Ci0KIHN0YXRpYyBpbnQgYXN5bmNfZXJyb3I7CiAKIC8qKgpAQCAtNTksNyArNTcsNyBAQAogICovCiB2b2lkIGRldmljZV9wbV9pbml0KHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQlkZXYtPnBvd2VyLnN0YXR1cyA9IERQTV9PTjsKKwlkZXYtPnBvd2VyLmluX3N1c3BlbmQgPSBmYWxzZTsKIAlpbml0X2NvbXBsZXRpb24oJmRldi0+cG93ZXIuY29tcGxldGlvbik7CiAJY29tcGxldGVfYWxsKCZkZXYtPnBvd2VyLmNvbXBsZXRpb24pOwogCWRldi0+cG93ZXIud2FrZXVwID0gTlVMTDsKQEAgLTkwLDIyICs4OCwxMSBAQAogdm9pZCBkZXZpY2VfcG1fYWRkKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlwcl9kZWJ1ZygiUE06IEFkZGluZyBpbmZvIGZvciAlczolc1xuIiwKLQkJIGRldi0+YnVzID8gZGV2LT5idXMtPm5hbWUgOiAiTm8gQnVzIiwKLQkJIGtvYmplY3RfbmFtZSgmZGV2LT5rb2JqKSk7CisJCSBkZXYtPmJ1cyA/IGRldi0+YnVzLT5uYW1lIDogIk5vIEJ1cyIsIGRldl9uYW1lKGRldikpOwogCW11dGV4X2xvY2soJmRwbV9saXN0X210eCk7Ci0JaWYgKGRldi0+cGFyZW50KSB7Ci0JCWlmIChkZXYtPnBhcmVudC0+cG93ZXIuc3RhdHVzID49IERQTV9TVVNQRU5ESU5HKQotCQkJZGV2X3dhcm4oZGV2LCAicGFyZW50ICVzIHNob3VsZCBub3QgYmUgc2xlZXBpbmdcbiIsCi0JCQkJIGRldl9uYW1lKGRldi0+cGFyZW50KSk7Ci0JfSBlbHNlIGlmICh0cmFuc2l0aW9uX3N0YXJ0ZWQpIHsKLQkJLyoKLQkJICogV2UgcmVmdXNlIHRvIHJlZ2lzdGVyIHBhcmVudGxlc3MgZGV2aWNlcyB3aGlsZSBhIFBNCi0JCSAqIHRyYW5zaXRpb24gaXMgaW4gcHJvZ3Jlc3MgaW4gb3JkZXIgdG8gYXZvaWQgbGVhdmluZyB0aGVtCi0JCSAqIHVuaGFuZGxlZCBkb3duIHRoZSByb2FkCi0JCSAqLwotCQlkZXZfV0FSTihkZXYsICJQYXJlbnRsZXNzIGRldmljZSByZWdpc3RlcmVkIGR1cmluZyBhIFBNIHRyYW5zYWN0aW9uXG4iKTsKLQl9Ci0KKwlpZiAoZGV2LT5wYXJlbnQgJiYgZGV2LT5wYXJlbnQtPnBvd2VyLmluX3N1c3BlbmQpCisJCWRldl93YXJuKGRldiwgInBhcmVudCAlcyBzaG91bGQgbm90IGJlIHNsZWVwaW5nXG4iLAorCQkJZGV2X25hbWUoZGV2LT5wYXJlbnQpKTsKIAlsaXN0X2FkZF90YWlsKCZkZXYtPnBvd2VyLmVudHJ5LCAmZHBtX2xpc3QpOwogCW11dGV4X3VubG9jaygmZHBtX2xpc3RfbXR4KTsKIH0KQEAgLTExNyw4ICsxMDQsNyBAQAogdm9pZCBkZXZpY2VfcG1fcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlwcl9kZWJ1ZygiUE06IFJlbW92aW5nIGluZm8gZm9yICVzOiVzXG4iLAotCQkgZGV2LT5idXMgPyBkZXYtPmJ1cy0+bmFtZSA6ICJObyBCdXMiLAotCQkga29iamVjdF9uYW1lKCZkZXYtPmtvYmopKTsKKwkJIGRldi0+YnVzID8gZGV2LT5idXMtPm5hbWUgOiAiTm8gQnVzIiwgZGV2X25hbWUoZGV2KSk7CiAJY29tcGxldGVfYWxsKCZkZXYtPnBvd2VyLmNvbXBsZXRpb24pOwogCW11dGV4X2xvY2soJmRwbV9saXN0X210eCk7CiAJbGlzdF9kZWxfaW5pdCgmZGV2LT5wb3dlci5lbnRyeSk7CkBAIC0xMzUsMTAgKzEyMSw4IEBACiB2b2lkIGRldmljZV9wbV9tb3ZlX2JlZm9yZShzdHJ1Y3QgZGV2aWNlICpkZXZhLCBzdHJ1Y3QgZGV2aWNlICpkZXZiKQogewogCXByX2RlYnVnKCJQTTogTW92aW5nICVzOiVzIGJlZm9yZSAlczolc1xuIiwKLQkJIGRldmEtPmJ1cyA/IGRldmEtPmJ1cy0+bmFtZSA6ICJObyBCdXMiLAotCQkga29iamVjdF9uYW1lKCZkZXZhLT5rb2JqKSwKLQkJIGRldmItPmJ1cyA/IGRldmItPmJ1cy0+bmFtZSA6ICJObyBCdXMiLAotCQkga29iamVjdF9uYW1lKCZkZXZiLT5rb2JqKSk7CisJCSBkZXZhLT5idXMgPyBkZXZhLT5idXMtPm5hbWUgOiAiTm8gQnVzIiwgZGV2X25hbWUoZGV2YSksCisJCSBkZXZiLT5idXMgPyBkZXZiLT5idXMtPm5hbWUgOiAiTm8gQnVzIiwgZGV2X25hbWUoZGV2YikpOwogCS8qIERlbGV0ZSBkZXZhIGZyb20gZHBtX2xpc3QgYW5kIHJlaW5zZXJ0IGJlZm9yZSBkZXZiLiAqLwogCWxpc3RfbW92ZV90YWlsKCZkZXZhLT5wb3dlci5lbnRyeSwgJmRldmItPnBvd2VyLmVudHJ5KTsKIH0KQEAgLTE1MSwxMCArMTM1LDggQEAKIHZvaWQgZGV2aWNlX3BtX21vdmVfYWZ0ZXIoc3RydWN0IGRldmljZSAqZGV2YSwgc3RydWN0IGRldmljZSAqZGV2YikKIHsKIAlwcl9kZWJ1ZygiUE06IE1vdmluZyAlczolcyBhZnRlciAlczolc1xuIiwKLQkJIGRldmEtPmJ1cyA/IGRldmEtPmJ1cy0+bmFtZSA6ICJObyBCdXMiLAotCQkga29iamVjdF9uYW1lKCZkZXZhLT5rb2JqKSwKLQkJIGRldmItPmJ1cyA/IGRldmItPmJ1cy0+bmFtZSA6ICJObyBCdXMiLAotCQkga29iamVjdF9uYW1lKCZkZXZiLT5rb2JqKSk7CisJCSBkZXZhLT5idXMgPyBkZXZhLT5idXMtPm5hbWUgOiAiTm8gQnVzIiwgZGV2X25hbWUoZGV2YSksCisJCSBkZXZiLT5idXMgPyBkZXZiLT5idXMtPm5hbWUgOiAiTm8gQnVzIiwgZGV2X25hbWUoZGV2YikpOwogCS8qIERlbGV0ZSBkZXZhIGZyb20gZHBtX2xpc3QgYW5kIHJlaW5zZXJ0IGFmdGVyIGRldmIuICovCiAJbGlzdF9tb3ZlKCZkZXZhLT5wb3dlci5lbnRyeSwgJmRldmItPnBvd2VyLmVudHJ5KTsKIH0KQEAgLTE2Niw4ICsxNDgsNyBAQAogdm9pZCBkZXZpY2VfcG1fbW92ZV9sYXN0KHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlwcl9kZWJ1ZygiUE06IE1vdmluZyAlczolcyB0byBlbmQgb2YgbGlzdFxuIiwKLQkJIGRldi0+YnVzID8gZGV2LT5idXMtPm5hbWUgOiAiTm8gQnVzIiwKLQkJIGtvYmplY3RfbmFtZSgmZGV2LT5rb2JqKSk7CisJCSBkZXYtPmJ1cyA/IGRldi0+YnVzLT5uYW1lIDogIk5vIEJ1cyIsIGRldl9uYW1lKGRldikpOwogCWxpc3RfbW92ZV90YWlsKCZkZXYtPnBvd2VyLmVudHJ5LCAmZHBtX2xpc3QpOwogfQogCkBAIC0zMDMsNyArMjg0LDcgQEAKIAkJCXBtX21lc3NhZ2VfdCBzdGF0ZSkKIHsKIAlpbnQgZXJyb3IgPSAwOwotCWt0aW1lX3QgY2FsbHRpbWUsIGRlbHRhLCByZXR0aW1lOworCWt0aW1lX3QgY2FsbHRpbWUgPSBrdGltZV9zZXQoMCwgMCksIGRlbHRhLCByZXR0aW1lOwogCiAJaWYgKGluaXRjYWxsX2RlYnVnKSB7CiAJCXByX2luZm8oImNhbGxpbmcgICVzKyBAICVpLCBwYXJlbnQ6ICVzXG4iLApAQCAtNDA1LDcgKzM4Niw3IEBACiAJCQlpbnQgZXJyb3IpCiB7CiAJcHJpbnRrKEtFUk5fRVJSICJQTTogRGV2aWNlICVzIGZhaWxlZCB0byAlcyVzOiBlcnJvciAlZFxuIiwKLQkJa29iamVjdF9uYW1lKCZkZXYtPmtvYmopLCBwbV92ZXJiKHN0YXRlLmV2ZW50KSwgaW5mbywgZXJyb3IpOworCQlkZXZfbmFtZShkZXYpLCBwbV92ZXJiKHN0YXRlLmV2ZW50KSwgaW5mbywgZXJyb3IpOwogfQogCiBzdGF0aWMgdm9pZCBkcG1fc2hvd190aW1lKGt0aW1lX3Qgc3RhcnR0aW1lLCBwbV9tZXNzYWdlX3Qgc3RhdGUsIGNoYXIgKmluZm8pCkBAIC00NzUsMzMgKzQ1NiwyNCBAQAogICovCiB2b2lkIGRwbV9yZXN1bWVfbm9pcnEocG1fbWVzc2FnZV90IHN0YXRlKQogewotCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKIAlrdGltZV90IHN0YXJ0dGltZSA9IGt0aW1lX2dldCgpOwogCi0JSU5JVF9MSVNUX0hFQUQoJmxpc3QpOwogCW11dGV4X2xvY2soJmRwbV9saXN0X210eCk7Ci0JdHJhbnNpdGlvbl9zdGFydGVkID0gZmFsc2U7Ci0Jd2hpbGUgKCFsaXN0X2VtcHR5KCZkcG1fbGlzdCkpIHsKLQkJc3RydWN0IGRldmljZSAqZGV2ID0gdG9fZGV2aWNlKGRwbV9saXN0Lm5leHQpOworCXdoaWxlICghbGlzdF9lbXB0eSgmZHBtX25vaXJxX2xpc3QpKSB7CisJCXN0cnVjdCBkZXZpY2UgKmRldiA9IHRvX2RldmljZShkcG1fbm9pcnFfbGlzdC5uZXh0KTsKKwkJaW50IGVycm9yOwogCiAJCWdldF9kZXZpY2UoZGV2KTsKLQkJaWYgKGRldi0+cG93ZXIuc3RhdHVzID4gRFBNX09GRikgewotCQkJaW50IGVycm9yOworCQlsaXN0X21vdmVfdGFpbCgmZGV2LT5wb3dlci5lbnRyeSwgJmRwbV9zdXNwZW5kZWRfbGlzdCk7CisJCW11dGV4X3VubG9jaygmZHBtX2xpc3RfbXR4KTsKIAotCQkJZGV2LT5wb3dlci5zdGF0dXMgPSBEUE1fT0ZGOwotCQkJbXV0ZXhfdW5sb2NrKCZkcG1fbGlzdF9tdHgpOworCQllcnJvciA9IGRldmljZV9yZXN1bWVfbm9pcnEoZGV2LCBzdGF0ZSk7CisJCWlmIChlcnJvcikKKwkJCXBtX2Rldl9lcnIoZGV2LCBzdGF0ZSwgIiBlYXJseSIsIGVycm9yKTsKIAotCQkJZXJyb3IgPSBkZXZpY2VfcmVzdW1lX25vaXJxKGRldiwgc3RhdGUpOwotCi0JCQltdXRleF9sb2NrKCZkcG1fbGlzdF9tdHgpOwotCQkJaWYgKGVycm9yKQotCQkJCXBtX2Rldl9lcnIoZGV2LCBzdGF0ZSwgIiBlYXJseSIsIGVycm9yKTsKLQkJfQotCQlpZiAoIWxpc3RfZW1wdHkoJmRldi0+cG93ZXIuZW50cnkpKQotCQkJbGlzdF9tb3ZlX3RhaWwoJmRldi0+cG93ZXIuZW50cnksICZsaXN0KTsKKwkJbXV0ZXhfbG9jaygmZHBtX2xpc3RfbXR4KTsKIAkJcHV0X2RldmljZShkZXYpOwogCX0KLQlsaXN0X3NwbGljZSgmbGlzdCwgJmRwbV9saXN0KTsKIAltdXRleF91bmxvY2soJmRwbV9saXN0X210eCk7CiAJZHBtX3Nob3dfdGltZShzdGFydHRpbWUsIHN0YXRlLCAiZWFybHkiKTsKIAlyZXN1bWVfZGV2aWNlX2lycXMoKTsKQEAgLTU0NCw3ICs1MTYsNyBAQAogCWRwbV93YWl0KGRldi0+cGFyZW50LCBhc3luYyk7CiAJZGV2aWNlX2xvY2soZGV2KTsKIAotCWRldi0+cG93ZXIuc3RhdHVzID0gRFBNX1JFU1VNSU5HOworCWRldi0+cG93ZXIuaW5fc3VzcGVuZCA9IGZhbHNlOwogCiAJaWYgKGRldi0+YnVzKSB7CiAJCWlmIChkZXYtPmJ1cy0+cG0pIHsKQEAgLTYxMCwxOSArNTgyLDE0IEBACiAgKi8KIHN0YXRpYyB2b2lkIGRwbV9yZXN1bWUocG1fbWVzc2FnZV90IHN0YXRlKQogewotCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKIAlzdHJ1Y3QgZGV2aWNlICpkZXY7CiAJa3RpbWVfdCBzdGFydHRpbWUgPSBrdGltZV9nZXQoKTsKIAotCUlOSVRfTElTVF9IRUFEKCZsaXN0KTsKIAltdXRleF9sb2NrKCZkcG1fbGlzdF9tdHgpOwogCXBtX3RyYW5zaXRpb24gPSBzdGF0ZTsKIAlhc3luY19lcnJvciA9IDA7CiAKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRldiwgJmRwbV9saXN0LCBwb3dlci5lbnRyeSkgewotCQlpZiAoZGV2LT5wb3dlci5zdGF0dXMgPCBEUE1fT0ZGKQotCQkJY29udGludWU7Ci0KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRldiwgJmRwbV9zdXNwZW5kZWRfbGlzdCwgcG93ZXIuZW50cnkpIHsKIAkJSU5JVF9DT01QTEVUSU9OKGRldi0+cG93ZXIuY29tcGxldGlvbik7CiAJCWlmIChpc19hc3luYyhkZXYpKSB7CiAJCQlnZXRfZGV2aWNlKGRldik7CkBAIC02MzAsMjggKzU5NywyNCBAQAogCQl9CiAJfQogCi0Jd2hpbGUgKCFsaXN0X2VtcHR5KCZkcG1fbGlzdCkpIHsKLQkJZGV2ID0gdG9fZGV2aWNlKGRwbV9saXN0Lm5leHQpOworCXdoaWxlICghbGlzdF9lbXB0eSgmZHBtX3N1c3BlbmRlZF9saXN0KSkgeworCQlkZXYgPSB0b19kZXZpY2UoZHBtX3N1c3BlbmRlZF9saXN0Lm5leHQpOwogCQlnZXRfZGV2aWNlKGRldik7Ci0JCWlmIChkZXYtPnBvd2VyLnN0YXR1cyA+PSBEUE1fT0ZGICYmICFpc19hc3luYyhkZXYpKSB7CisJCWlmICghaXNfYXN5bmMoZGV2KSkgewogCQkJaW50IGVycm9yOwogCiAJCQltdXRleF91bmxvY2soJmRwbV9saXN0X210eCk7CiAKIAkJCWVycm9yID0gZGV2aWNlX3Jlc3VtZShkZXYsIHN0YXRlLCBmYWxzZSk7Ci0KLQkJCW11dGV4X2xvY2soJmRwbV9saXN0X210eCk7CiAJCQlpZiAoZXJyb3IpCiAJCQkJcG1fZGV2X2VycihkZXYsIHN0YXRlLCAiIiwgZXJyb3IpOwotCQl9IGVsc2UgaWYgKGRldi0+cG93ZXIuc3RhdHVzID09IERQTV9TVVNQRU5ESU5HKSB7Ci0JCQkvKiBBbGxvdyBuZXcgY2hpbGRyZW4gb2YgdGhlIGRldmljZSB0byBiZSByZWdpc3RlcmVkICovCi0JCQlkZXYtPnBvd2VyLnN0YXR1cyA9IERQTV9SRVNVTUlORzsKKworCQkJbXV0ZXhfbG9jaygmZHBtX2xpc3RfbXR4KTsKIAkJfQogCQlpZiAoIWxpc3RfZW1wdHkoJmRldi0+cG93ZXIuZW50cnkpKQotCQkJbGlzdF9tb3ZlX3RhaWwoJmRldi0+cG93ZXIuZW50cnksICZsaXN0KTsKKwkJCWxpc3RfbW92ZV90YWlsKCZkZXYtPnBvd2VyLmVudHJ5LCAmZHBtX3ByZXBhcmVkX2xpc3QpOwogCQlwdXRfZGV2aWNlKGRldik7CiAJfQotCWxpc3Rfc3BsaWNlKCZsaXN0LCAmZHBtX2xpc3QpOwogCW11dGV4X3VubG9jaygmZHBtX2xpc3RfbXR4KTsKIAlhc3luY19zeW5jaHJvbml6ZV9mdWxsKCk7CiAJZHBtX3Nob3dfdGltZShzdGFydHRpbWUsIHN0YXRlLCBOVUxMKTsKQEAgLTY5NywyMiArNjYwLDE4IEBACiAKIAlJTklUX0xJU1RfSEVBRCgmbGlzdCk7CiAJbXV0ZXhfbG9jaygmZHBtX2xpc3RfbXR4KTsKLQl0cmFuc2l0aW9uX3N0YXJ0ZWQgPSBmYWxzZTsKLQl3aGlsZSAoIWxpc3RfZW1wdHkoJmRwbV9saXN0KSkgewotCQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSB0b19kZXZpY2UoZHBtX2xpc3QucHJldik7CisJd2hpbGUgKCFsaXN0X2VtcHR5KCZkcG1fcHJlcGFyZWRfbGlzdCkpIHsKKwkJc3RydWN0IGRldmljZSAqZGV2ID0gdG9fZGV2aWNlKGRwbV9wcmVwYXJlZF9saXN0LnByZXYpOwogCiAJCWdldF9kZXZpY2UoZGV2KTsKLQkJaWYgKGRldi0+cG93ZXIuc3RhdHVzID4gRFBNX09OKSB7Ci0JCQlkZXYtPnBvd2VyLnN0YXR1cyA9IERQTV9PTjsKLQkJCW11dGV4X3VubG9jaygmZHBtX2xpc3RfbXR4KTsKKwkJZGV2LT5wb3dlci5pbl9zdXNwZW5kID0gZmFsc2U7CisJCWxpc3RfbW92ZSgmZGV2LT5wb3dlci5lbnRyeSwgJmxpc3QpOworCQltdXRleF91bmxvY2soJmRwbV9saXN0X210eCk7CiAKLQkJCWRldmljZV9jb21wbGV0ZShkZXYsIHN0YXRlKTsKLQkJCXBtX3J1bnRpbWVfcHV0X3N5bmMoZGV2KTsKKwkJZGV2aWNlX2NvbXBsZXRlKGRldiwgc3RhdGUpOworCQlwbV9ydW50aW1lX3B1dF9zeW5jKGRldik7CiAKLQkJCW11dGV4X2xvY2soJmRwbV9saXN0X210eCk7Ci0JCX0KLQkJaWYgKCFsaXN0X2VtcHR5KCZkZXYtPnBvd2VyLmVudHJ5KSkKLQkJCWxpc3RfbW92ZSgmZGV2LT5wb3dlci5lbnRyeSwgJmxpc3QpOworCQltdXRleF9sb2NrKCZkcG1fbGlzdF9tdHgpOwogCQlwdXRfZGV2aWNlKGRldik7CiAJfQogCWxpc3Rfc3BsaWNlKCZsaXN0LCAmZHBtX2xpc3QpOwpAQCAtODAyLDE1ICs3NjEsMTMgQEAKICAqLwogaW50IGRwbV9zdXNwZW5kX25vaXJxKHBtX21lc3NhZ2VfdCBzdGF0ZSkKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CiAJa3RpbWVfdCBzdGFydHRpbWUgPSBrdGltZV9nZXQoKTsKIAlpbnQgZXJyb3IgPSAwOwogCi0JSU5JVF9MSVNUX0hFQUQoJmxpc3QpOwogCXN1c3BlbmRfZGV2aWNlX2lycXMoKTsKIAltdXRleF9sb2NrKCZkcG1fbGlzdF9tdHgpOwotCXdoaWxlICghbGlzdF9lbXB0eSgmZHBtX2xpc3QpKSB7Ci0JCXN0cnVjdCBkZXZpY2UgKmRldiA9IHRvX2RldmljZShkcG1fbGlzdC5wcmV2KTsKKwl3aGlsZSAoIWxpc3RfZW1wdHkoJmRwbV9zdXNwZW5kZWRfbGlzdCkpIHsKKwkJc3RydWN0IGRldmljZSAqZGV2ID0gdG9fZGV2aWNlKGRwbV9zdXNwZW5kZWRfbGlzdC5wcmV2KTsKIAogCQlnZXRfZGV2aWNlKGRldik7CiAJCW11dGV4X3VubG9jaygmZHBtX2xpc3RfbXR4KTsKQEAgLTgyMywxMiArNzgwLDEwIEBACiAJCQlwdXRfZGV2aWNlKGRldik7CiAJCQlicmVhazsKIAkJfQotCQlkZXYtPnBvd2VyLnN0YXR1cyA9IERQTV9PRkZfSVJROwogCQlpZiAoIWxpc3RfZW1wdHkoJmRldi0+cG93ZXIuZW50cnkpKQotCQkJbGlzdF9tb3ZlKCZkZXYtPnBvd2VyLmVudHJ5LCAmbGlzdCk7CisJCQlsaXN0X21vdmUoJmRldi0+cG93ZXIuZW50cnksICZkcG1fbm9pcnFfbGlzdCk7CiAJCXB1dF9kZXZpY2UoZGV2KTsKIAl9Ci0JbGlzdF9zcGxpY2VfdGFpbCgmbGlzdCwgJmRwbV9saXN0KTsKIAltdXRleF91bmxvY2soJmRwbV9saXN0X210eCk7CiAJaWYgKGVycm9yKQogCQlkcG1fcmVzdW1lX25vaXJxKHJlc3VtZV9ldmVudChzdGF0ZSkpOwpAQCAtODc2LDYgKzgzMSwxMSBAQAogCWlmIChhc3luY19lcnJvcikKIAkJZ290byBFbmQ7CiAKKwlpZiAocG1fd2FrZXVwX3BlbmRpbmcoKSkgeworCQlhc3luY19lcnJvciA9IC1FQlVTWTsKKwkJZ290byBFbmQ7CisJfQorCiAJaWYgKGRldi0+Y2xhc3MpIHsKIAkJaWYgKGRldi0+Y2xhc3MtPnBtKSB7CiAJCQlwbV9kZXZfZGJnKGRldiwgc3RhdGUsICJjbGFzcyAiKTsKQEAgLTkwNyw5ICs4NjcsNiBAQAogCQl9CiAJfQogCi0JaWYgKCFlcnJvcikKLQkJZGV2LT5wb3dlci5zdGF0dXMgPSBEUE1fT0ZGOwotCiAgRW5kOgogCWRldmljZV91bmxvY2soZGV2KTsKIAljb21wbGV0ZV9hbGwoJmRldi0+cG93ZXIuY29tcGxldGlvbik7CkBAIC05NTEsMTYgKzkwOCwxNCBAQAogICovCiBzdGF0aWMgaW50IGRwbV9zdXNwZW5kKHBtX21lc3NhZ2VfdCBzdGF0ZSkKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CiAJa3RpbWVfdCBzdGFydHRpbWUgPSBrdGltZV9nZXQoKTsKIAlpbnQgZXJyb3IgPSAwOwogCi0JSU5JVF9MSVNUX0hFQUQoJmxpc3QpOwogCW11dGV4X2xvY2soJmRwbV9saXN0X210eCk7CiAJcG1fdHJhbnNpdGlvbiA9IHN0YXRlOwogCWFzeW5jX2Vycm9yID0gMDsKLQl3aGlsZSAoIWxpc3RfZW1wdHkoJmRwbV9saXN0KSkgewotCQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSB0b19kZXZpY2UoZHBtX2xpc3QucHJldik7CisJd2hpbGUgKCFsaXN0X2VtcHR5KCZkcG1fcHJlcGFyZWRfbGlzdCkpIHsKKwkJc3RydWN0IGRldmljZSAqZGV2ID0gdG9fZGV2aWNlKGRwbV9wcmVwYXJlZF9saXN0LnByZXYpOwogCiAJCWdldF9kZXZpY2UoZGV2KTsKIAkJbXV0ZXhfdW5sb2NrKCZkcG1fbGlzdF9tdHgpOwpAQCAtOTc0LDEyICs5MjksMTEgQEAKIAkJCWJyZWFrOwogCQl9CiAJCWlmICghbGlzdF9lbXB0eSgmZGV2LT5wb3dlci5lbnRyeSkpCi0JCQlsaXN0X21vdmUoJmRldi0+cG93ZXIuZW50cnksICZsaXN0KTsKKwkJCWxpc3RfbW92ZSgmZGV2LT5wb3dlci5lbnRyeSwgJmRwbV9zdXNwZW5kZWRfbGlzdCk7CiAJCXB1dF9kZXZpY2UoZGV2KTsKIAkJaWYgKGFzeW5jX2Vycm9yKQogCQkJYnJlYWs7CiAJfQotCWxpc3Rfc3BsaWNlKCZsaXN0LCBkcG1fbGlzdC5wcmV2KTsKIAltdXRleF91bmxvY2soJmRwbV9saXN0X210eCk7CiAJYXN5bmNfc3luY2hyb25pemVfZnVsbCgpOwogCWlmICghZXJyb3IpCkBAIC0xMDM4LDIyICs5OTIsMjAgQEAKICAqLwogc3RhdGljIGludCBkcG1fcHJlcGFyZShwbV9tZXNzYWdlX3Qgc3RhdGUpCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCBsaXN0OwogCWludCBlcnJvciA9IDA7CiAKLQlJTklUX0xJU1RfSEVBRCgmbGlzdCk7CiAJbXV0ZXhfbG9jaygmZHBtX2xpc3RfbXR4KTsKLQl0cmFuc2l0aW9uX3N0YXJ0ZWQgPSB0cnVlOwogCXdoaWxlICghbGlzdF9lbXB0eSgmZHBtX2xpc3QpKSB7CiAJCXN0cnVjdCBkZXZpY2UgKmRldiA9IHRvX2RldmljZShkcG1fbGlzdC5uZXh0KTsKIAogCQlnZXRfZGV2aWNlKGRldik7Ci0JCWRldi0+cG93ZXIuc3RhdHVzID0gRFBNX1BSRVBBUklORzsKIAkJbXV0ZXhfdW5sb2NrKCZkcG1fbGlzdF9tdHgpOwogCiAJCXBtX3J1bnRpbWVfZ2V0X25vcmVzdW1lKGRldik7Ci0JCWlmIChwbV9ydW50aW1lX2JhcnJpZXIoZGV2KSAmJiBkZXZpY2VfbWF5X3dha2V1cChkZXYpKSB7Ci0JCQkvKiBXYWtlLXVwIHJlcXVlc3RlZCBkdXJpbmcgc3lzdGVtIHNsZWVwIHRyYW5zaXRpb24uICovCisJCWlmIChwbV9ydW50aW1lX2JhcnJpZXIoZGV2KSAmJiBkZXZpY2VfbWF5X3dha2V1cChkZXYpKQorCQkJcG1fd2FrZXVwX2V2ZW50KGRldiwgMCk7CisKKwkJaWYgKHBtX3dha2V1cF9wZW5kaW5nKCkpIHsKIAkJCXBtX3J1bnRpbWVfcHV0X3N5bmMoZGV2KTsKIAkJCWVycm9yID0gLUVCVVNZOwogCQl9IGVsc2UgewpAQCAtMTA2MiwyNCArMTAxNCwyMiBAQAogCiAJCW11dGV4X2xvY2soJmRwbV9saXN0X210eCk7CiAJCWlmIChlcnJvcikgewotCQkJZGV2LT5wb3dlci5zdGF0dXMgPSBEUE1fT047CiAJCQlpZiAoZXJyb3IgPT0gLUVBR0FJTikgewogCQkJCXB1dF9kZXZpY2UoZGV2KTsKIAkJCQllcnJvciA9IDA7CiAJCQkJY29udGludWU7CiAJCQl9Ci0JCQlwcmludGsoS0VSTl9FUlIgIlBNOiBGYWlsZWQgdG8gcHJlcGFyZSBkZXZpY2UgJXMgIgotCQkJCSJmb3IgcG93ZXIgdHJhbnNpdGlvbjogZXJyb3IgJWRcbiIsCi0JCQkJa29iamVjdF9uYW1lKCZkZXYtPmtvYmopLCBlcnJvcik7CisJCQlwcmludGsoS0VSTl9JTkZPICJQTTogRGV2aWNlICVzIG5vdCBwcmVwYXJlZCAiCisJCQkJImZvciBwb3dlciB0cmFuc2l0aW9uOiBjb2RlICVkXG4iLAorCQkJCWRldl9uYW1lKGRldiksIGVycm9yKTsKIAkJCXB1dF9kZXZpY2UoZGV2KTsKIAkJCWJyZWFrOwogCQl9Ci0JCWRldi0+cG93ZXIuc3RhdHVzID0gRFBNX1NVU1BFTkRJTkc7CisJCWRldi0+cG93ZXIuaW5fc3VzcGVuZCA9IHRydWU7CiAJCWlmICghbGlzdF9lbXB0eSgmZGV2LT5wb3dlci5lbnRyeSkpCi0JCQlsaXN0X21vdmVfdGFpbCgmZGV2LT5wb3dlci5lbnRyeSwgJmxpc3QpOworCQkJbGlzdF9tb3ZlX3RhaWwoJmRldi0+cG93ZXIuZW50cnksICZkcG1fcHJlcGFyZWRfbGlzdCk7CiAJCXB1dF9kZXZpY2UoZGV2KTsKIAl9Ci0JbGlzdF9zcGxpY2UoJmxpc3QsICZkcG1fbGlzdCk7CiAJbXV0ZXhfdW5sb2NrKCZkcG1fbGlzdF9tdHgpOwogCXJldHVybiBlcnJvcjsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9wb3dlci9ydW50aW1lLmMgYi9kcml2ZXJzL2Jhc2UvcG93ZXIvcnVudGltZS5jCmluZGV4IDAyYzY1MmIuLjY1NjQ5M2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9wb3dlci9ydW50aW1lLmMKKysrIGIvZHJpdmVycy9iYXNlL3Bvd2VyL3J1bnRpbWUuYwpAQCAtMjUwLDEzICsyNTAsMTYgQEAKIAlpZiAoIWNiKQogCQlyZXR1cm4gLUVOT1NZUzsKIAotCXNwaW5fdW5sb2NrX2lycSgmZGV2LT5wb3dlci5sb2NrKTsKKwlpZiAoZGV2LT5wb3dlci5pcnFfc2FmZSkgeworCQlyZXR2YWwgPSBjYihkZXYpOworCX0gZWxzZSB7CisJCXNwaW5fdW5sb2NrX2lycSgmZGV2LT5wb3dlci5sb2NrKTsKIAotCXJldHZhbCA9IGNiKGRldik7CisJCXJldHZhbCA9IGNiKGRldik7CiAKLQlzcGluX2xvY2tfaXJxKCZkZXYtPnBvd2VyLmxvY2spOworCQlzcGluX2xvY2tfaXJxKCZkZXYtPnBvd2VyLmxvY2spOworCX0KIAlkZXYtPnBvd2VyLnJ1bnRpbWVfZXJyb3IgPSByZXR2YWw7Ci0KIAlyZXR1cm4gcmV0dmFsOwogfQogCkBAIC00MDQsNyArNDA3LDcgQEAKIAkJZ290byBvdXQ7CiAJfQogCi0JaWYgKHBhcmVudCAmJiAhcGFyZW50LT5wb3dlci5pZ25vcmVfY2hpbGRyZW4pIHsKKwlpZiAocGFyZW50ICYmICFwYXJlbnQtPnBvd2VyLmlnbm9yZV9jaGlsZHJlbiAmJiAhZGV2LT5wb3dlci5pcnFfc2FmZSkgewogCQlzcGluX3VubG9ja19pcnEoJmRldi0+cG93ZXIubG9jayk7CiAKIAkJcG1fcmVxdWVzdF9pZGxlKHBhcmVudCk7CkBAIC01MjcsMTAgKzUzMCwxMyBAQAogCiAJaWYgKCFwYXJlbnQgJiYgZGV2LT5wYXJlbnQpIHsKIAkJLyoKLQkJICogSW5jcmVtZW50IHRoZSBwYXJlbnQncyByZXN1bWUgY291bnRlciBhbmQgcmVzdW1lIGl0IGlmCi0JCSAqIG5lY2Vzc2FyeS4KKwkJICogSW5jcmVtZW50IHRoZSBwYXJlbnQncyB1c2FnZSBjb3VudGVyIGFuZCByZXN1bWUgaXQgaWYKKwkJICogbmVjZXNzYXJ5LiAgTm90IG5lZWRlZCBpZiBkZXYgaXMgaXJxLXNhZmU7IHRoZW4gdGhlCisJCSAqIHBhcmVudCBpcyBwZXJtYW5lbnRseSByZXN1bWVkLgogCQkgKi8KIAkJcGFyZW50ID0gZGV2LT5wYXJlbnQ7CisJCWlmIChkZXYtPnBvd2VyLmlycV9zYWZlKQorCQkJZ290byBza2lwX3BhcmVudDsKIAkJc3Bpbl91bmxvY2soJmRldi0+cG93ZXIubG9jayk7CiAKIAkJcG1fcnVudGltZV9nZXRfbm9yZXN1bWUocGFyZW50KTsKQEAgLTU1Myw2ICs1NTksNyBAQAogCQkJZ290byBvdXQ7CiAJCWdvdG8gcmVwZWF0OwogCX0KKyBza2lwX3BhcmVudDoKIAogCWlmIChkZXYtPnBvd2VyLm5vX2NhbGxiYWNrcykKIAkJZ290byBub19jYWxsYmFjazsJLyogQXNzdW1lIHN1Y2Nlc3MuICovCkBAIC01ODQsNyArNTkxLDcgQEAKIAkJcnBtX2lkbGUoZGV2LCBSUE1fQVNZTkMpOwogCiAgb3V0OgotCWlmIChwYXJlbnQpIHsKKwlpZiAocGFyZW50ICYmICFkZXYtPnBvd2VyLmlycV9zYWZlKSB7CiAJCXNwaW5fdW5sb2NrX2lycSgmZGV2LT5wb3dlci5sb2NrKTsKIAogCQlwbV9ydW50aW1lX3B1dChwYXJlbnQpOwpAQCAtMTA2NSw3ICsxMDcyLDYgQEAKICAqIFNldCB0aGUgcG93ZXIubm9fY2FsbGJhY2tzIGZsYWcsIHdoaWNoIHRlbGxzIHRoZSBQTSBjb3JlIHRoYXQgdGhpcwogICogZGV2aWNlIGlzIHBvd2VyLW1hbmFnZWQgdGhyb3VnaCBpdHMgcGFyZW50IGFuZCBoYXMgbm8gcnVuLXRpbWUgUE0KICAqIGNhbGxiYWNrcyBvZiBpdHMgb3duLiAgVGhlIHJ1bi10aW1lIHN5c2ZzIGF0dHJpYnV0ZXMgd2lsbCBiZSByZW1vdmVkLgotICoKICAqLwogdm9pZCBwbV9ydW50aW1lX25vX2NhbGxiYWNrcyhzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CkBAIC0xMDc4LDYgKzEwODQsMjcgQEAKIEVYUE9SVF9TWU1CT0xfR1BMKHBtX3J1bnRpbWVfbm9fY2FsbGJhY2tzKTsKIAogLyoqCisgKiBwbV9ydW50aW1lX2lycV9zYWZlIC0gTGVhdmUgaW50ZXJydXB0cyBkaXNhYmxlZCBkdXJpbmcgY2FsbGJhY2tzLgorICogQGRldjogRGV2aWNlIHRvIGhhbmRsZQorICoKKyAqIFNldCB0aGUgcG93ZXIuaXJxX3NhZmUgZmxhZywgd2hpY2ggdGVsbHMgdGhlIFBNIGNvcmUgdGhhdCB0aGUKKyAqIC0+cnVudGltZV9zdXNwZW5kKCkgYW5kIC0+cnVudGltZV9yZXN1bWUoKSBjYWxsYmFja3MgZm9yIHRoaXMgZGV2aWNlIHNob3VsZAorICogYWx3YXlzIGJlIGludm9rZWQgd2l0aCB0aGUgc3BpbmxvY2sgaGVsZCBhbmQgaW50ZXJydXB0cyBkaXNhYmxlZC4gIEl0IGFsc28KKyAqIGNhdXNlcyB0aGUgcGFyZW50J3MgdXNhZ2UgY291bnRlciB0byBiZSBwZXJtYW5lbnRseSBpbmNyZW1lbnRlZCwgcHJldmVudGluZworICogdGhlIHBhcmVudCBmcm9tIHJ1bnRpbWUgc3VzcGVuZGluZyAtLSBvdGhlcndpc2UgYW4gaXJxLXNhZmUgY2hpbGQgbWlnaHQgaGF2ZQorICogdG8gd2FpdCBmb3IgYSBub24taXJxLXNhZmUgcGFyZW50LgorICovCit2b2lkIHBtX3J1bnRpbWVfaXJxX3NhZmUoc3RydWN0IGRldmljZSAqZGV2KQoreworCWlmIChkZXYtPnBhcmVudCkKKwkJcG1fcnVudGltZV9nZXRfc3luYyhkZXYtPnBhcmVudCk7CisJc3Bpbl9sb2NrX2lycSgmZGV2LT5wb3dlci5sb2NrKTsKKwlkZXYtPnBvd2VyLmlycV9zYWZlID0gMTsKKwlzcGluX3VubG9ja19pcnEoJmRldi0+cG93ZXIubG9jayk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChwbV9ydW50aW1lX2lycV9zYWZlKTsKKworLyoqCiAgKiB1cGRhdGVfYXV0b3N1c3BlbmQgLSBIYW5kbGUgYSBjaGFuZ2UgdG8gYSBkZXZpY2UncyBhdXRvc3VzcGVuZCBzZXR0aW5ncy4KICAqIEBkZXY6IERldmljZSB0byBoYW5kbGUuCiAgKiBAb2xkX2RlbGF5OiBUaGUgZm9ybWVyIGF1dG9zdXNwZW5kX2RlbGF5IHZhbHVlLgpAQCAtMTE5OSw0ICsxMjI2LDYgQEAKIAkvKiBDaGFuZ2UgdGhlIHN0YXR1cyBiYWNrIHRvICdzdXNwZW5kZWQnIHRvIG1hdGNoIHRoZSBpbml0aWFsIHN0YXR1cy4gKi8KIAlpZiAoZGV2LT5wb3dlci5ydW50aW1lX3N0YXR1cyA9PSBSUE1fQUNUSVZFKQogCQlwbV9ydW50aW1lX3NldF9zdXNwZW5kZWQoZGV2KTsKKwlpZiAoZGV2LT5wb3dlci5pcnFfc2FmZSAmJiBkZXYtPnBhcmVudCkKKwkJcG1fcnVudGltZV9wdXRfc3luYyhkZXYtPnBhcmVudCk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvcG93ZXIvd2FrZXVwLmMgYi9kcml2ZXJzL2Jhc2UvcG93ZXIvd2FrZXVwLmMKaW5kZXggNzFjNTUyOC4uOGVjNDA2ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL3Bvd2VyL3dha2V1cC5jCisrKyBiL2RyaXZlcnMvYmFzZS9wb3dlci93YWtldXAuYwpAQCAtNTQyLDI2ICs1NDIsMjYgQEAKIH0KIAogLyoqCi0gKiBwbV9jaGVja193YWtldXBfZXZlbnRzIC0gQ2hlY2sgZm9yIG5ldyB3YWtldXAgZXZlbnRzLgorICogcG1fd2FrZXVwX3BlbmRpbmcgLSBDaGVjayBpZiBwb3dlciB0cmFuc2l0aW9uIGluIHByb2dyZXNzIHNob3VsZCBiZSBhYm9ydGVkLgogICoKICAqIENvbXBhcmUgdGhlIGN1cnJlbnQgbnVtYmVyIG9mIHJlZ2lzdGVyZWQgd2FrZXVwIGV2ZW50cyB3aXRoIGl0cyBwcmVzZXJ2ZWQKLSAqIHZhbHVlIGZyb20gdGhlIHBhc3QgdG8gY2hlY2sgaWYgbmV3IHdha2V1cCBldmVudHMgaGF2ZSBiZWVuIHJlZ2lzdGVyZWQgc2luY2UKLSAqIHRoZSBvbGQgdmFsdWUgd2FzIHN0b3JlZC4gIENoZWNrIGlmIHRoZSBjdXJyZW50IG51bWJlciBvZiB3YWtldXAgZXZlbnRzIGJlaW5nCi0gKiBwcm9jZXNzZWQgaXMgemVyby4KKyAqIHZhbHVlIGZyb20gdGhlIHBhc3QgYW5kIHJldHVybiB0cnVlIGlmIG5ldyB3YWtldXAgZXZlbnRzIGhhdmUgYmVlbiByZWdpc3RlcmVkCisgKiBzaW5jZSB0aGUgb2xkIHZhbHVlIHdhcyBzdG9yZWQuICBBbHNvIHJldHVybiB0cnVlIGlmIHRoZSBjdXJyZW50IG51bWJlciBvZgorICogd2FrZXVwIGV2ZW50cyBiZWluZyBwcm9jZXNzZWQgaXMgZGlmZmVyZW50IGZyb20gemVyby4KICAqLwotYm9vbCBwbV9jaGVja193YWtldXBfZXZlbnRzKHZvaWQpCitib29sIHBtX3dha2V1cF9wZW5kaW5nKHZvaWQpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKLQlib29sIHJldCA9IHRydWU7CisJYm9vbCByZXQgPSBmYWxzZTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZldmVudHNfbG9jaywgZmxhZ3MpOwogCWlmIChldmVudHNfY2hlY2tfZW5hYmxlZCkgewotCQlyZXQgPSAoKHVuc2lnbmVkIGludClhdG9taWNfcmVhZCgmZXZlbnRfY291bnQpID09IHNhdmVkX2NvdW50KQotCQkJJiYgIWF0b21pY19yZWFkKCZldmVudHNfaW5fcHJvZ3Jlc3MpOwotCQlldmVudHNfY2hlY2tfZW5hYmxlZCA9IHJldDsKKwkJcmV0ID0gKCh1bnNpZ25lZCBpbnQpYXRvbWljX3JlYWQoJmV2ZW50X2NvdW50KSAhPSBzYXZlZF9jb3VudCkKKwkJCXx8IGF0b21pY19yZWFkKCZldmVudHNfaW5fcHJvZ3Jlc3MpOworCQlldmVudHNfY2hlY2tfZW5hYmxlZCA9ICFyZXQ7CiAJfQogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmV2ZW50c19sb2NrLCBmbGFncyk7Ci0JaWYgKCFyZXQpCisJaWYgKHJldCkKIAkJcG1fd2FrZXVwX3VwZGF0ZV9oaXRfY291bnRzKCk7CiAJcmV0dXJuIHJldDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9hZ3AvYWdwLmggYi9kcml2ZXJzL2NoYXIvYWdwL2FncC5oCmluZGV4IDUyNTkwNjUuLjNlNjdkZGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9hZ3AvYWdwLmgKKysrIGIvZHJpdmVycy9jaGFyL2FncC9hZ3AuaApAQCAtMTIwLDcgKzEyMCw2IEBACiAJdm9pZCAoKmFncF9kZXN0cm95X3BhZ2UpKHN0cnVjdCBwYWdlICosIGludCBmbGFncyk7CiAJdm9pZCAoKmFncF9kZXN0cm95X3BhZ2VzKShzdHJ1Y3QgYWdwX21lbW9yeSAqKTsKIAlpbnQgKCphZ3BfdHlwZV90b19tYXNrX3R5cGUpIChzdHJ1Y3QgYWdwX2JyaWRnZV9kYXRhICosIGludCk7Ci0Jdm9pZCAoKmNoaXBzZXRfZmx1c2gpKHN0cnVjdCBhZ3BfYnJpZGdlX2RhdGEgKik7CiB9OwogCiBzdHJ1Y3QgYWdwX2JyaWRnZV9kYXRhIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9hZ3AvY29tcGF0X2lvY3RsLmMgYi9kcml2ZXJzL2NoYXIvYWdwL2NvbXBhdF9pb2N0bC5jCmluZGV4IDlkMmM5N2EuLmE0OGUwNWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9hZ3AvY29tcGF0X2lvY3RsLmMKKysrIGIvZHJpdmVycy9jaGFyL2FncC9jb21wYXRfaW9jdGwuYwpAQCAtMjc2LDcgKzI3Niw2IEBACiAJCWJyZWFrOwogCiAJY2FzZSBBR1BJT0NfQ0hJUFNFVF9GTFVTSDMyOgotCQlyZXRfdmFsID0gYWdwaW9jX2NoaXBzZXRfZmx1c2hfd3JhcChjdXJyX3ByaXYpOwogCQlicmVhazsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9hZ3AvY29tcGF0X2lvY3RsLmggYi9kcml2ZXJzL2NoYXIvYWdwL2NvbXBhdF9pb2N0bC5oCmluZGV4IDBjOTY3OGEuLmYzMGUwZmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9hZ3AvY29tcGF0X2lvY3RsLmgKKysrIGIvZHJpdmVycy9jaGFyL2FncC9jb21wYXRfaW9jdGwuaApAQCAtMTAyLDYgKzEwMiw1IEBACiBzdHJ1Y3QgYWdwX21lbW9yeSAqYWdwX2FsbG9jYXRlX21lbW9yeV93cmFwKHNpemVfdCBwZ19jb3VudCwgdTMyIHR5cGUpOwogc3RydWN0IGFncF9tZW1vcnkgKmFncF9maW5kX21lbV9ieV9rZXkoaW50IGtleSk7CiBzdHJ1Y3QgYWdwX2NsaWVudCAqYWdwX2ZpbmRfY2xpZW50X2J5X3BpZChwaWRfdCBpZCk7Ci1pbnQgYWdwaW9jX2NoaXBzZXRfZmx1c2hfd3JhcChzdHJ1Y3QgYWdwX2ZpbGVfcHJpdmF0ZSAqcHJpdik7CiAKICNlbmRpZiAvKiBfQUdQX0NPTVBBVF9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvYWdwL2Zyb250ZW5kLmMgYi9kcml2ZXJzL2NoYXIvYWdwL2Zyb250ZW5kLmMKaW5kZXggM2NiNDUzOS4uMmUwNDQzMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2FncC9mcm9udGVuZC5jCisrKyBiL2RyaXZlcnMvY2hhci9hZ3AvZnJvbnRlbmQuYwpAQCAtOTU3LDEzICs5NTcsNiBAQAogCXJldHVybiBhZ3BfdW5iaW5kX21lbW9yeShtZW1vcnkpOwogfQogCi1pbnQgYWdwaW9jX2NoaXBzZXRfZmx1c2hfd3JhcChzdHJ1Y3QgYWdwX2ZpbGVfcHJpdmF0ZSAqcHJpdikKLXsKLQlEQkcoIiIpOwotCWFncF9mbHVzaF9jaGlwc2V0KGFncF9icmlkZ2UpOwotCXJldHVybiAwOwotfQotCiBzdGF0aWMgbG9uZyBhZ3BfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsCiAJCSAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7CkBAIC0xMDM5LDcgKzEwMzIsNiBAQAogCQlicmVhazsKIAkgICAgICAgCiAJY2FzZSBBR1BJT0NfQ0hJUFNFVF9GTFVTSDoKLQkJcmV0X3ZhbCA9IGFncGlvY19jaGlwc2V0X2ZsdXNoX3dyYXAoY3Vycl9wcml2KTsKIAkJYnJlYWs7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvYWdwL2dlbmVyaWMuYyBiL2RyaXZlcnMvY2hhci9hZ3AvZ2VuZXJpYy5jCmluZGV4IDQ5NTZmMWMuLjAxMmNiYTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9hZ3AvZ2VuZXJpYy5jCisrKyBiL2RyaXZlcnMvY2hhci9hZ3AvZ2VuZXJpYy5jCkBAIC04MSwxMyArODEsNiBAQAogCXJldHVybiAtMTsKIH0KIAotdm9pZCBhZ3BfZmx1c2hfY2hpcHNldChzdHJ1Y3QgYWdwX2JyaWRnZV9kYXRhICpicmlkZ2UpCi17Ci0JaWYgKGJyaWRnZS0+ZHJpdmVyLT5jaGlwc2V0X2ZsdXNoKQotCQlicmlkZ2UtPmRyaXZlci0+Y2hpcHNldF9mbHVzaChicmlkZ2UpOwotfQotRVhQT1JUX1NZTUJPTChhZ3BfZmx1c2hfY2hpcHNldCk7Ci0KIC8qCiAgKiBVc2Uga21hbGxvYyBpZiBwb3NzaWJsZSBmb3IgdGhlIHBhZ2UgbGlzdC4gT3RoZXJ3aXNlIGZhbGwgYmFjayB0bwogICogdm1hbGxvYy4gVGhpcyBzcGVlZHMgdGhpbmdzIHVwIGFuZCBhbHNvIHNhdmVzIG1lbW9yeSBmb3Igc21hbGwgQUdQCkBAIC00ODcsMjYgKzQ4MCw2IEBACiB9CiBFWFBPUlRfU1lNQk9MKGFncF91bmJpbmRfbWVtb3J5KTsKIAotLyoqCi0gKglhZ3BfcmViaW5kX2VtbW9yeSAgLSAgUmV3cml0ZSB0aGUgZW50aXJlIEdBVFQsIHVzZWZ1bCBvbiByZXN1bWUKLSAqLwotaW50IGFncF9yZWJpbmRfbWVtb3J5KHZvaWQpCi17Ci0Jc3RydWN0IGFncF9tZW1vcnkgKmN1cnI7Ci0JaW50IHJldF92YWwgPSAwOwotCi0Jc3Bpbl9sb2NrKCZhZ3BfYnJpZGdlLT5tYXBwZWRfbG9jayk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeShjdXJyLCAmYWdwX2JyaWRnZS0+bWFwcGVkX2xpc3QsIG1hcHBlZF9saXN0KSB7Ci0JCXJldF92YWwgPSBjdXJyLT5icmlkZ2UtPmRyaXZlci0+aW5zZXJ0X21lbW9yeShjdXJyLAotCQkJCQkJCSAgICAgIGN1cnItPnBnX3N0YXJ0LAotCQkJCQkJCSAgICAgIGN1cnItPnR5cGUpOwotCQlpZiAocmV0X3ZhbCAhPSAwKQotCQkJYnJlYWs7Ci0JfQotCXNwaW5fdW5sb2NrKCZhZ3BfYnJpZGdlLT5tYXBwZWRfbG9jayk7Ci0JcmV0dXJuIHJldF92YWw7Ci19Ci1FWFBPUlRfU1lNQk9MKGFncF9yZWJpbmRfbWVtb3J5KTsKIAogLyogRW5kIC0gUm91dGluZXMgZm9yIGhhbmRsaW5nIHN3YXBwaW5nIG9mIGFncF9tZW1vcnkgaW50byB0aGUgR0FUVCAqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvYWdwL2ludGVsLWFncC5jIGIvZHJpdmVycy9jaGFyL2FncC9pbnRlbC1hZ3AuYwppbmRleCBlNzJmNDlkLi4wN2U5Nzk2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvYWdwL2ludGVsLWFncC5jCisrKyBiL2RyaXZlcnMvY2hhci9hZ3AvaW50ZWwtYWdwLmMKQEAgLTgyOCwxNCArODI4LDkgQEAKIHN0YXRpYyBpbnQgYWdwX2ludGVsX3Jlc3VtZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKIHsKIAlzdHJ1Y3QgYWdwX2JyaWRnZV9kYXRhICpicmlkZ2UgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7Ci0JaW50IHJldF92YWw7CiAKIAlicmlkZ2UtPmRyaXZlci0+Y29uZmlndXJlKCk7CiAKLQlyZXRfdmFsID0gYWdwX3JlYmluZF9tZW1vcnkoKTsKLQlpZiAocmV0X3ZhbCAhPSAwKQotCQlyZXR1cm4gcmV0X3ZhbDsKLQogCXJldHVybiAwOwogfQogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvYWdwL2ludGVsLWFncC5oIGIvZHJpdmVycy9jaGFyL2FncC9pbnRlbC1hZ3AuaAppbmRleCA5MDUzOWRmLi4wMTBlM2RlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvYWdwL2ludGVsLWFncC5oCisrKyBiL2RyaXZlcnMvY2hhci9hZ3AvaW50ZWwtYWdwLmgKQEAgLTc1LDYgKzc1LDggQEAKICNkZWZpbmUgSTgxMF9HTVNfRElTQUJMRQkweDAwMDAwMDAwCiAjZGVmaW5lIEk4MTBfUEdFVEJMX0NUTAkJMHgyMDIwCiAjZGVmaW5lIEk4MTBfUEdFVEJMX0VOQUJMRUQJMHgwMDAwMDAwMQorLyogTm90ZTogUEdFVEJMX0NUTDIgaGFzIGEgZGlmZmVyZW50IG9mZnNldCBvbiBHMzMuICovCisjZGVmaW5lIEk5NjVfUEdFVEJMX0NUTDIJMHgyMGM0CiAjZGVmaW5lIEk5NjVfUEdFVEJMX1NJWkVfTUFTSwkweDAwMDAwMDBlCiAjZGVmaW5lIEk5NjVfUEdFVEJMX1NJWkVfNTEyS0IJKDAgPDwgMSkKICNkZWZpbmUgSTk2NV9QR0VUQkxfU0laRV8yNTZLQgkoMSA8PCAxKQpAQCAtODIsOSArODQsMTUgQEAKICNkZWZpbmUgSTk2NV9QR0VUQkxfU0laRV8xTUIJKDMgPDwgMSkKICNkZWZpbmUgSTk2NV9QR0VUQkxfU0laRV8yTUIJKDQgPDwgMSkKICNkZWZpbmUgSTk2NV9QR0VUQkxfU0laRV8xXzVNQgkoNSA8PCAxKQotI2RlZmluZSBHMzNfUEdFVEJMX1NJWkVfTUFTSyAgICAoMyA8PCA4KQotI2RlZmluZSBHMzNfUEdFVEJMX1NJWkVfMU0gICAgICAoMSA8PCA4KQotI2RlZmluZSBHMzNfUEdFVEJMX1NJWkVfMk0gICAgICAoMiA8PCA4KQorI2RlZmluZSBHMzNfR01DSF9TSVpFX01BU0sJKDMgPDwgOCkKKyNkZWZpbmUgRzMzX0dNQ0hfU0laRV8xTQkoMSA8PCA4KQorI2RlZmluZSBHMzNfR01DSF9TSVpFXzJNCSgyIDw8IDgpCisjZGVmaW5lIEc0eF9HTUNIX1NJWkVfTUFTSwkoMHhmIDw8IDgpCisjZGVmaW5lIEc0eF9HTUNIX1NJWkVfMU0JKDB4MSA8PCA4KQorI2RlZmluZSBHNHhfR01DSF9TSVpFXzJNCSgweDMgPDwgOCkKKyNkZWZpbmUgRzR4X0dNQ0hfU0laRV9WVF8xTQkoMHg5IDw8IDgpCisjZGVmaW5lIEc0eF9HTUNIX1NJWkVfVlRfMV81TQkoMHhhIDw8IDgpCisjZGVmaW5lIEc0eF9HTUNIX1NJWkVfVlRfMk0JKDB4YyA8PCA4KQogCiAjZGVmaW5lIEk4MTBfRFJBTV9DVEwJCTB4MzAwMAogI2RlZmluZSBJODEwX0RSQU1fUk9XXzAJCTB4MDAwMDAwMDEKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9hZ3AvaW50ZWwtZ3R0LmMgYi9kcml2ZXJzL2NoYXIvYWdwL2ludGVsLWd0dC5jCmluZGV4IDI5YWM2ZDQuLjM1NmY3M2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9hZ3AvaW50ZWwtZ3R0LmMKKysrIGIvZHJpdmVycy9jaGFyL2FncC9pbnRlbC1ndHQuYwpAQCAtMjQsNyArMjQsNiBAQAogI2luY2x1ZGUgPGFzbS9zbXAuaD4KICNpbmNsdWRlICJhZ3AuaCIKICNpbmNsdWRlICJpbnRlbC1hZ3AuaCIKLSNpbmNsdWRlIDxsaW51eC9pbnRlbC1ndHQuaD4KICNpbmNsdWRlIDxkcm0vaW50ZWwtZ3R0Lmg+CiAKIC8qCkBAIC0zOSw0MCArMzgsMTIgQEAKICNkZWZpbmUgVVNFX1BDSV9ETUFfQVBJIDAKICNlbmRpZgogCi0vKiBNYXggYW1vdW50IG9mIHN0b2xlbiBzcGFjZSwgYW55dGhpbmcgYWJvdmUgd2lsbCBiZSByZXR1cm5lZCB0byBMaW51eCAqLwotaW50IGludGVsX21heF9zdG9sZW4gPSAzMiAqIDEwMjQgKiAxMDI0OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGFwZXJfc2l6ZV9pbmZvX2ZpeGVkIGludGVsX2k4MTBfc2l6ZXNbXSA9Ci17Ci0JezY0LCAxNjM4NCwgNH0sCi0JLyogVGhlIDMyTSBtb2RlIHN0aWxsIHJlcXVpcmVzIGEgNjRrIGdhdHQgKi8KLQl7MzIsIDgxOTIsIDR9Ci19OwotCi0jZGVmaW5lIEFHUF9EQ0FDSEVfTUVNT1JZCTEKLSNkZWZpbmUgQUdQX1BIWVNfTUVNT1JZCQkyCi0jZGVmaW5lIElOVEVMX0FHUF9DQUNIRURfTUVNT1JZIDMKLQotc3RhdGljIHN0cnVjdCBnYXR0X21hc2sgaW50ZWxfaTgxMF9tYXNrc1tdID0KLXsKLQl7Lm1hc2sgPSBJODEwX1BURV9WQUxJRCwgLnR5cGUgPSAwfSwKLQl7Lm1hc2sgPSAoSTgxMF9QVEVfVkFMSUQgfCBJODEwX1BURV9MT0NBTCksIC50eXBlID0gQUdQX0RDQUNIRV9NRU1PUll9LAotCXsubWFzayA9IEk4MTBfUFRFX1ZBTElELCAudHlwZSA9IDB9LAotCXsubWFzayA9IEk4MTBfUFRFX1ZBTElEIHwgSTgzMF9QVEVfU1lTVEVNX0NBQ0hFRCwKLQkgLnR5cGUgPSBJTlRFTF9BR1BfQ0FDSEVEX01FTU9SWX0KLX07Ci0KLSNkZWZpbmUgSU5URUxfQUdQX1VOQ0FDSEVEX01FTU9SWSAgICAgICAgICAgICAgMAotI2RlZmluZSBJTlRFTF9BR1BfQ0FDSEVEX01FTU9SWV9MTEMgICAgICAgICAgICAxCi0jZGVmaW5lIElOVEVMX0FHUF9DQUNIRURfTUVNT1JZX0xMQ19HRkRUICAgICAgIDIKLSNkZWZpbmUgSU5URUxfQUdQX0NBQ0hFRF9NRU1PUllfTExDX01MQyAgICAgICAgMwotI2RlZmluZSBJTlRFTF9BR1BfQ0FDSEVEX01FTU9SWV9MTENfTUxDX0dGRFQgICA0Ci0KIHN0cnVjdCBpbnRlbF9ndHRfZHJpdmVyIHsKIAl1bnNpZ25lZCBpbnQgZ2VuIDogODsKIAl1bnNpZ25lZCBpbnQgaXNfZzMzIDogMTsKIAl1bnNpZ25lZCBpbnQgaXNfcGluZXZpZXcgOiAxOwogCXVuc2lnbmVkIGludCBpc19pcm9ubGFrZSA6IDE7CisJdW5zaWduZWQgaW50IGhhc19wZ3RibF9lbmFibGUgOiAxOwogCXVuc2lnbmVkIGludCBkbWFfbWFza19zaXplIDogODsKIAkvKiBDaGlwc2V0IHNwZWNpZmljIEdUVCBzZXR1cCAqLwogCWludCAoKnNldHVwKSh2b2lkKTsKQEAgLTk1LDEzICs2NiwxNCBAQAogCXU4IF9faW9tZW0gKnJlZ2lzdGVyczsKIAlwaHlzX2FkZHJfdCBndHRfYnVzX2FkZHI7CiAJcGh5c19hZGRyX3QgZ21hX2J1c19hZGRyOwotCXBoeXNfYWRkcl90IHB0ZV9idXNfYWRkcjsKKwl1MzIgUEdFVEJMX3NhdmU7CiAJdTMyIF9faW9tZW0gKmd0dDsJCS8qIEk5MTVHICovCiAJaW50IG51bV9kY2FjaGVfZW50cmllczsKIAl1bmlvbiB7CiAJCXZvaWQgX19pb21lbSAqaTl4eF9mbHVzaF9wYWdlOwogCQl2b2lkICppOHh4X2ZsdXNoX3BhZ2U7CiAJfTsKKwljaGFyICppODF4X2d0dF90YWJsZTsKIAlzdHJ1Y3QgcGFnZSAqaTh4eF9wYWdlOwogCXN0cnVjdCByZXNvdXJjZSBpZnBfcmVzb3VyY2U7CiAJaW50IHJlc291cmNlX3ZhbGlkOwpAQCAtMTEzLDQyICs4NSwzMSBAQAogI2RlZmluZSBJU19HMzMJCWludGVsX3ByaXZhdGUuZHJpdmVyLT5pc19nMzMKICNkZWZpbmUgSVNfUElORVZJRVcJaW50ZWxfcHJpdmF0ZS5kcml2ZXItPmlzX3BpbmV2aWV3CiAjZGVmaW5lIElTX0lST05MQUtFCWludGVsX3ByaXZhdGUuZHJpdmVyLT5pc19pcm9ubGFrZQorI2RlZmluZSBIQVNfUEdUQkxfRU4JaW50ZWxfcHJpdmF0ZS5kcml2ZXItPmhhc19wZ3RibF9lbmFibGUKIAotc3RhdGljIHZvaWQgaW50ZWxfYWdwX2ZyZWVfc2dsaXN0KHN0cnVjdCBhZ3BfbWVtb3J5ICptZW0pCi17Ci0Jc3RydWN0IHNnX3RhYmxlIHN0OwotCi0Jc3Quc2dsID0gbWVtLT5zZ19saXN0OwotCXN0Lm9yaWdfbmVudHMgPSBzdC5uZW50cyA9IG1lbS0+cGFnZV9jb3VudDsKLQotCXNnX2ZyZWVfdGFibGUoJnN0KTsKLQotCW1lbS0+c2dfbGlzdCA9IE5VTEw7Ci0JbWVtLT5udW1fc2cgPSAwOwotfQotCi1zdGF0aWMgaW50IGludGVsX2FncF9tYXBfbWVtb3J5KHN0cnVjdCBhZ3BfbWVtb3J5ICptZW0pCitpbnQgaW50ZWxfZ3R0X21hcF9tZW1vcnkoc3RydWN0IHBhZ2UgKipwYWdlcywgdW5zaWduZWQgaW50IG51bV9lbnRyaWVzLAorCQkJIHN0cnVjdCBzY2F0dGVybGlzdCAqKnNnX2xpc3QsIGludCAqbnVtX3NnKQogewogCXN0cnVjdCBzZ190YWJsZSBzdDsKIAlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnOwogCWludCBpOwogCi0JaWYgKG1lbS0+c2dfbGlzdCkKKwlpZiAoKnNnX2xpc3QpCiAJCXJldHVybiAwOyAvKiBhbHJlYWR5IG1hcHBlZCAoZm9yIGUuZy4gcmVzdW1lICovCiAKLQlEQkcoInRyeSBtYXBwaW5nICVsdSBwYWdlc1xuIiwgKHVuc2lnbmVkIGxvbmcpbWVtLT5wYWdlX2NvdW50KTsKKwlEQkcoInRyeSBtYXBwaW5nICVsdSBwYWdlc1xuIiwgKHVuc2lnbmVkIGxvbmcpbnVtX2VudHJpZXMpOwogCi0JaWYgKHNnX2FsbG9jX3RhYmxlKCZzdCwgbWVtLT5wYWdlX2NvdW50LCBHRlBfS0VSTkVMKSkKKwlpZiAoc2dfYWxsb2NfdGFibGUoJnN0LCBudW1fZW50cmllcywgR0ZQX0tFUk5FTCkpCiAJCWdvdG8gZXJyOwogCi0JbWVtLT5zZ19saXN0ID0gc2cgPSBzdC5zZ2w7CisJKnNnX2xpc3QgPSBzZyA9IHN0LnNnbDsKIAotCWZvciAoaSA9IDAgOyBpIDwgbWVtLT5wYWdlX2NvdW50OyBpKyssIHNnID0gc2dfbmV4dChzZykpCi0JCXNnX3NldF9wYWdlKHNnLCBtZW0tPnBhZ2VzW2ldLCBQQUdFX1NJWkUsIDApOworCWZvciAoaSA9IDAgOyBpIDwgbnVtX2VudHJpZXM7IGkrKywgc2cgPSBzZ19uZXh0KHNnKSkKKwkJc2dfc2V0X3BhZ2Uoc2csIHBhZ2VzW2ldLCBQQUdFX1NJWkUsIDApOwogCi0JbWVtLT5udW1fc2cgPSBwY2lfbWFwX3NnKGludGVsX3ByaXZhdGUucGNpZGV2LCBtZW0tPnNnX2xpc3QsCi0JCQkJIG1lbS0+cGFnZV9jb3VudCwgUENJX0RNQV9CSURJUkVDVElPTkFMKTsKLQlpZiAodW5saWtlbHkoIW1lbS0+bnVtX3NnKSkKKwkqbnVtX3NnID0gcGNpX21hcF9zZyhpbnRlbF9wcml2YXRlLnBjaWRldiwgKnNnX2xpc3QsCisJCQkJIG51bV9lbnRyaWVzLCBQQ0lfRE1BX0JJRElSRUNUSU9OQUwpOworCWlmICh1bmxpa2VseSghKm51bV9zZykpCiAJCWdvdG8gZXJyOwogCiAJcmV0dXJuIDA7CkBAIC0xNTcsOTAgKzExOCwyMiBAQAogCXNnX2ZyZWVfdGFibGUoJnN0KTsKIAlyZXR1cm4gLUVOT01FTTsKIH0KK0VYUE9SVF9TWU1CT0woaW50ZWxfZ3R0X21hcF9tZW1vcnkpOwogCi1zdGF0aWMgdm9pZCBpbnRlbF9hZ3BfdW5tYXBfbWVtb3J5KHN0cnVjdCBhZ3BfbWVtb3J5ICptZW0pCit2b2lkIGludGVsX2d0dF91bm1hcF9tZW1vcnkoc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ19saXN0LCBpbnQgbnVtX3NnKQogeworCXN0cnVjdCBzZ190YWJsZSBzdDsKIAlEQkcoInRyeSB1bm1hcHBpbmcgJWx1IHBhZ2VzXG4iLCAodW5zaWduZWQgbG9uZyltZW0tPnBhZ2VfY291bnQpOwogCi0JcGNpX3VubWFwX3NnKGludGVsX3ByaXZhdGUucGNpZGV2LCBtZW0tPnNnX2xpc3QsCi0JCSAgICAgbWVtLT5wYWdlX2NvdW50LCBQQ0lfRE1BX0JJRElSRUNUSU9OQUwpOwotCWludGVsX2FncF9mcmVlX3NnbGlzdChtZW0pOworCXBjaV91bm1hcF9zZyhpbnRlbF9wcml2YXRlLnBjaWRldiwgc2dfbGlzdCwKKwkJICAgICBudW1fc2csIFBDSV9ETUFfQklESVJFQ1RJT05BTCk7CisKKwlzdC5zZ2wgPSBzZ19saXN0OworCXN0Lm9yaWdfbmVudHMgPSBzdC5uZW50cyA9IG51bV9zZzsKKworCXNnX2ZyZWVfdGFibGUoJnN0KTsKIH0KLQotc3RhdGljIGludCBpbnRlbF9pODEwX2ZldGNoX3NpemUodm9pZCkKLXsKLQl1MzIgc21yYW1fbWlzY2M7Ci0Jc3RydWN0IGFwZXJfc2l6ZV9pbmZvX2ZpeGVkICp2YWx1ZXM7Ci0KLQlwY2lfcmVhZF9jb25maWdfZHdvcmQoaW50ZWxfcHJpdmF0ZS5icmlkZ2VfZGV2LAotCQkJICAgICAgSTgxMF9TTVJBTV9NSVNDQywgJnNtcmFtX21pc2NjKTsKLQl2YWx1ZXMgPSBBX1NJWkVfRklYKGFncF9icmlkZ2UtPmRyaXZlci0+YXBlcnR1cmVfc2l6ZXMpOwotCi0JaWYgKChzbXJhbV9taXNjYyAmIEk4MTBfR01TKSA9PSBJODEwX0dNU19ESVNBQkxFKSB7Ci0JCWRldl93YXJuKCZpbnRlbF9wcml2YXRlLmJyaWRnZV9kZXYtPmRldiwgImk4MTAgaXMgZGlzYWJsZWRcbiIpOwotCQlyZXR1cm4gMDsKLQl9Ci0JaWYgKChzbXJhbV9taXNjYyAmIEk4MTBfR0ZYX01FTV9XSU5fU0laRSkgPT0gSTgxMF9HRlhfTUVNX1dJTl8zMk0pIHsKLQkJYWdwX2JyaWRnZS0+Y3VycmVudF9zaXplID0gKHZvaWQgKikgKHZhbHVlcyArIDEpOwotCQlhZ3BfYnJpZGdlLT5hcGVydHVyZV9zaXplX2lkeCA9IDE7Ci0JCXJldHVybiB2YWx1ZXNbMV0uc2l6ZTsKLQl9IGVsc2UgewotCQlhZ3BfYnJpZGdlLT5jdXJyZW50X3NpemUgPSAodm9pZCAqKSAodmFsdWVzKTsKLQkJYWdwX2JyaWRnZS0+YXBlcnR1cmVfc2l6ZV9pZHggPSAwOwotCQlyZXR1cm4gdmFsdWVzWzBdLnNpemU7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgaW50ZWxfaTgxMF9jb25maWd1cmUodm9pZCkKLXsKLQlzdHJ1Y3QgYXBlcl9zaXplX2luZm9fZml4ZWQgKmN1cnJlbnRfc2l6ZTsKLQl1MzIgdGVtcDsKLQlpbnQgaTsKLQotCWN1cnJlbnRfc2l6ZSA9IEFfU0laRV9GSVgoYWdwX2JyaWRnZS0+Y3VycmVudF9zaXplKTsKLQotCWlmICghaW50ZWxfcHJpdmF0ZS5yZWdpc3RlcnMpIHsKLQkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGludGVsX3ByaXZhdGUucGNpZGV2LCBJODEwX01NQUREUiwgJnRlbXApOwotCQl0ZW1wICY9IDB4ZmZmODAwMDA7Ci0KLQkJaW50ZWxfcHJpdmF0ZS5yZWdpc3RlcnMgPSBpb3JlbWFwKHRlbXAsIDEyOCAqIDQwOTYpOwotCQlpZiAoIWludGVsX3ByaXZhdGUucmVnaXN0ZXJzKSB7Ci0JCQlkZXZfZXJyKCZpbnRlbF9wcml2YXRlLnBjaWRldi0+ZGV2LAotCQkJCSJjYW4ndCByZW1hcCBtZW1vcnlcbiIpOwotCQkJcmV0dXJuIC1FTk9NRU07Ci0JCX0KLQl9Ci0KLQlpZiAoKHJlYWRsKGludGVsX3ByaXZhdGUucmVnaXN0ZXJzK0k4MTBfRFJBTV9DVEwpCi0JCSYgSTgxMF9EUkFNX1JPV18wKSA9PSBJODEwX0RSQU1fUk9XXzBfU0RSQU0pIHsKLQkJLyogVGhpcyB3aWxsIG5lZWQgdG8gYmUgZHluYW1pY2FsbHkgYXNzaWduZWQgKi8KLQkJZGV2X2luZm8oJmludGVsX3ByaXZhdGUucGNpZGV2LT5kZXYsCi0JCQkgImRldGVjdGVkIDRNQiBkZWRpY2F0ZWQgdmlkZW8gcmFtXG4iKTsKLQkJaW50ZWxfcHJpdmF0ZS5udW1fZGNhY2hlX2VudHJpZXMgPSAxMDI0OwotCX0KLQlwY2lfcmVhZF9jb25maWdfZHdvcmQoaW50ZWxfcHJpdmF0ZS5wY2lkZXYsIEk4MTBfR01BRERSLCAmdGVtcCk7Ci0JYWdwX2JyaWRnZS0+Z2FydF9idXNfYWRkciA9ICh0ZW1wICYgUENJX0JBU0VfQUREUkVTU19NRU1fTUFTSyk7Ci0Jd3JpdGVsKGFncF9icmlkZ2UtPmdhdHRfYnVzX2FkZHIgfCBJODEwX1BHRVRCTF9FTkFCTEVELCBpbnRlbF9wcml2YXRlLnJlZ2lzdGVycytJODEwX1BHRVRCTF9DVEwpOwotCXJlYWRsKGludGVsX3ByaXZhdGUucmVnaXN0ZXJzK0k4MTBfUEdFVEJMX0NUTCk7CS8qIFBDSSBQb3N0aW5nLiAqLwotCi0JaWYgKGFncF9icmlkZ2UtPmRyaXZlci0+bmVlZHNfc2NyYXRjaF9wYWdlKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBjdXJyZW50X3NpemUtPm51bV9lbnRyaWVzOyBpKyspIHsKLQkJCXdyaXRlbChhZ3BfYnJpZGdlLT5zY3JhdGNoX3BhZ2UsIGludGVsX3ByaXZhdGUucmVnaXN0ZXJzK0k4MTBfUFRFX0JBU0UrKGkqNCkpOwotCQl9Ci0JCXJlYWRsKGludGVsX3ByaXZhdGUucmVnaXN0ZXJzK0k4MTBfUFRFX0JBU0UrKChpLTEpKjQpKTsJLyogUENJIHBvc3RpbmcuICovCi0JfQotCWdsb2JhbF9jYWNoZV9mbHVzaCgpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBpbnRlbF9pODEwX2NsZWFudXAodm9pZCkKLXsKLQl3cml0ZWwoMCwgaW50ZWxfcHJpdmF0ZS5yZWdpc3RlcnMrSTgxMF9QR0VUQkxfQ1RMKTsKLQlyZWFkbChpbnRlbF9wcml2YXRlLnJlZ2lzdGVycyk7CS8qIFBDSSBQb3N0aW5nLiAqLwotCWlvdW5tYXAoaW50ZWxfcHJpdmF0ZS5yZWdpc3RlcnMpOwotfQorRVhQT1JUX1NZTUJPTChpbnRlbF9ndHRfdW5tYXBfbWVtb3J5KTsKIAogc3RhdGljIHZvaWQgaW50ZWxfZmFrZV9hZ3BfZW5hYmxlKHN0cnVjdCBhZ3BfYnJpZGdlX2RhdGEgKmJyaWRnZSwgdTMyIG1vZGUpCiB7CkBAIC0yNzcsODAgKzE3MCw2NCBAQAogCWF0b21pY19kZWMoJmFncF9icmlkZ2UtPmN1cnJlbnRfbWVtb3J5X2FncCk7CiB9CiAKLXN0YXRpYyBpbnQgaW50ZWxfaTgxMF9pbnNlcnRfZW50cmllcyhzdHJ1Y3QgYWdwX21lbW9yeSAqbWVtLCBvZmZfdCBwZ19zdGFydCwKLQkJCQlpbnQgdHlwZSkKKyNkZWZpbmUgSTgxMF9HVFRfT1JERVIgNAorc3RhdGljIGludCBpODEwX3NldHVwKHZvaWQpCiB7Ci0JaW50IGksIGosIG51bV9lbnRyaWVzOwotCXZvaWQgKnRlbXA7Ci0JaW50IHJldCA9IC1FSU5WQUw7Ci0JaW50IG1hc2tfdHlwZTsKKwl1MzIgcmVnX2FkZHI7CisJY2hhciAqZ3R0X3RhYmxlOwogCi0JaWYgKG1lbS0+cGFnZV9jb3VudCA9PSAwKQotCQlnb3RvIG91dDsKKwkvKiBpODF4IGRvZXMgbm90IHByZWFsbG9jYXRlIHRoZSBndHQuIEl0J3MgYWx3YXlzIDY0a2IgaW4gc2l6ZS4gKi8KKwlndHRfdGFibGUgPSBhbGxvY19nYXR0X3BhZ2VzKEk4MTBfR1RUX09SREVSKTsKKwlpZiAoZ3R0X3RhYmxlID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCWludGVsX3ByaXZhdGUuaTgxeF9ndHRfdGFibGUgPSBndHRfdGFibGU7CiAKLQl0ZW1wID0gYWdwX2JyaWRnZS0+Y3VycmVudF9zaXplOwotCW51bV9lbnRyaWVzID0gQV9TSVpFX0ZJWCh0ZW1wKS0+bnVtX2VudHJpZXM7CisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGludGVsX3ByaXZhdGUucGNpZGV2LCBJODEwX01NQUREUiwgJnJlZ19hZGRyKTsKKwlyZWdfYWRkciAmPSAweGZmZjgwMDAwOwogCi0JaWYgKChwZ19zdGFydCArIG1lbS0+cGFnZV9jb3VudCkgPiBudW1fZW50cmllcykKLQkJZ290byBvdXRfZXJyOworCWludGVsX3ByaXZhdGUucmVnaXN0ZXJzID0gaW9yZW1hcChyZWdfYWRkciwgS0IoNjQpKTsKKwlpZiAoIWludGVsX3ByaXZhdGUucmVnaXN0ZXJzKQorCQlyZXR1cm4gLUVOT01FTTsKIAorCXdyaXRlbCh2aXJ0X3RvX3BoeXMoZ3R0X3RhYmxlKSB8IEk4MTBfUEdFVEJMX0VOQUJMRUQsCisJICAgICAgIGludGVsX3ByaXZhdGUucmVnaXN0ZXJzK0k4MTBfUEdFVEJMX0NUTCk7CiAKLQlmb3IgKGogPSBwZ19zdGFydDsgaiA8IChwZ19zdGFydCArIG1lbS0+cGFnZV9jb3VudCk7IGorKykgewotCQlpZiAoIVBHRV9FTVBUWShhZ3BfYnJpZGdlLCByZWFkbChhZ3BfYnJpZGdlLT5nYXR0X3RhYmxlK2opKSkgewotCQkJcmV0ID0gLUVCVVNZOwotCQkJZ290byBvdXRfZXJyOwotCQl9CisJaW50ZWxfcHJpdmF0ZS5ndHRfYnVzX2FkZHIgPSByZWdfYWRkciArIEk4MTBfUFRFX0JBU0U7CisKKwlpZiAoKHJlYWRsKGludGVsX3ByaXZhdGUucmVnaXN0ZXJzK0k4MTBfRFJBTV9DVEwpCisJCSYgSTgxMF9EUkFNX1JPV18wKSA9PSBJODEwX0RSQU1fUk9XXzBfU0RSQU0pIHsKKwkJZGV2X2luZm8oJmludGVsX3ByaXZhdGUucGNpZGV2LT5kZXYsCisJCQkgImRldGVjdGVkIDRNQiBkZWRpY2F0ZWQgdmlkZW8gcmFtXG4iKTsKKwkJaW50ZWxfcHJpdmF0ZS5udW1fZGNhY2hlX2VudHJpZXMgPSAxMDI0OwogCX0KIAotCWlmICh0eXBlICE9IG1lbS0+dHlwZSkKLQkJZ290byBvdXRfZXJyOwotCi0JbWFza190eXBlID0gYWdwX2JyaWRnZS0+ZHJpdmVyLT5hZ3BfdHlwZV90b19tYXNrX3R5cGUoYWdwX2JyaWRnZSwgdHlwZSk7Ci0KLQlzd2l0Y2ggKG1hc2tfdHlwZSkgewotCWNhc2UgQUdQX0RDQUNIRV9NRU1PUlk6Ci0JCWlmICghbWVtLT5pc19mbHVzaGVkKQotCQkJZ2xvYmFsX2NhY2hlX2ZsdXNoKCk7Ci0JCWZvciAoaSA9IHBnX3N0YXJ0OyBpIDwgKHBnX3N0YXJ0ICsgbWVtLT5wYWdlX2NvdW50KTsgaSsrKSB7Ci0JCQl3cml0ZWwoKGkqNDA5Nil8STgxMF9QVEVfTE9DQUx8STgxMF9QVEVfVkFMSUQsCi0JCQkgICAgICAgaW50ZWxfcHJpdmF0ZS5yZWdpc3RlcnMrSTgxMF9QVEVfQkFTRSsoaSo0KSk7Ci0JCX0KLQkJcmVhZGwoaW50ZWxfcHJpdmF0ZS5yZWdpc3RlcnMrSTgxMF9QVEVfQkFTRSsoKGktMSkqNCkpOwotCQlicmVhazsKLQljYXNlIEFHUF9QSFlTX01FTU9SWToKLQljYXNlIEFHUF9OT1JNQUxfTUVNT1JZOgotCQlpZiAoIW1lbS0+aXNfZmx1c2hlZCkKLQkJCWdsb2JhbF9jYWNoZV9mbHVzaCgpOwotCQlmb3IgKGkgPSAwLCBqID0gcGdfc3RhcnQ7IGkgPCBtZW0tPnBhZ2VfY291bnQ7IGkrKywgaisrKSB7Ci0JCQl3cml0ZWwoYWdwX2JyaWRnZS0+ZHJpdmVyLT5tYXNrX21lbW9yeShhZ3BfYnJpZGdlLAotCQkJCQlwYWdlX3RvX3BoeXMobWVtLT5wYWdlc1tpXSksIG1hc2tfdHlwZSksCi0JCQkgICAgICAgaW50ZWxfcHJpdmF0ZS5yZWdpc3RlcnMrSTgxMF9QVEVfQkFTRSsoaio0KSk7Ci0JCX0KLQkJcmVhZGwoaW50ZWxfcHJpdmF0ZS5yZWdpc3RlcnMrSTgxMF9QVEVfQkFTRSsoKGotMSkqNCkpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlnb3RvIG91dF9lcnI7Ci0JfQotCi1vdXQ6Ci0JcmV0ID0gMDsKLW91dF9lcnI6Ci0JbWVtLT5pc19mbHVzaGVkID0gdHJ1ZTsKLQlyZXR1cm4gcmV0OworCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGludGVsX2k4MTBfcmVtb3ZlX2VudHJpZXMoc3RydWN0IGFncF9tZW1vcnkgKm1lbSwgb2ZmX3QgcGdfc3RhcnQsCi0JCQkJaW50IHR5cGUpCitzdGF0aWMgdm9pZCBpODEwX2NsZWFudXAodm9pZCkKK3sKKwl3cml0ZWwoMCwgaW50ZWxfcHJpdmF0ZS5yZWdpc3RlcnMrSTgxMF9QR0VUQkxfQ1RMKTsKKwlmcmVlX2dhdHRfcGFnZXMoaW50ZWxfcHJpdmF0ZS5pODF4X2d0dF90YWJsZSwgSTgxMF9HVFRfT1JERVIpOworfQorCitzdGF0aWMgaW50IGk4MTBfaW5zZXJ0X2RjYWNoZV9lbnRyaWVzKHN0cnVjdCBhZ3BfbWVtb3J5ICptZW0sIG9mZl90IHBnX3N0YXJ0LAorCQkJCSAgICAgIGludCB0eXBlKQogewogCWludCBpOwogCi0JaWYgKG1lbS0+cGFnZV9jb3VudCA9PSAwKQotCQlyZXR1cm4gMDsKKwlpZiAoKHBnX3N0YXJ0ICsgbWVtLT5wYWdlX2NvdW50KQorCQkJPiBpbnRlbF9wcml2YXRlLm51bV9kY2FjaGVfZW50cmllcykKKwkJcmV0dXJuIC1FSU5WQUw7CiAKLQlmb3IgKGkgPSBwZ19zdGFydDsgaSA8IChtZW0tPnBhZ2VfY291bnQgKyBwZ19zdGFydCk7IGkrKykgewotCQl3cml0ZWwoYWdwX2JyaWRnZS0+c2NyYXRjaF9wYWdlLCBpbnRlbF9wcml2YXRlLnJlZ2lzdGVycytJODEwX1BURV9CQVNFKyhpKjQpKTsKKwlpZiAoIW1lbS0+aXNfZmx1c2hlZCkKKwkJZ2xvYmFsX2NhY2hlX2ZsdXNoKCk7CisKKwlmb3IgKGkgPSBwZ19zdGFydDsgaSA8IChwZ19zdGFydCArIG1lbS0+cGFnZV9jb3VudCk7IGkrKykgeworCQlkbWFfYWRkcl90IGFkZHIgPSBpIDw8IFBBR0VfU0hJRlQ7CisJCWludGVsX3ByaXZhdGUuZHJpdmVyLT53cml0ZV9lbnRyeShhZGRyLAorCQkJCQkJICBpLCB0eXBlKTsKIAl9Ci0JcmVhZGwoaW50ZWxfcHJpdmF0ZS5yZWdpc3RlcnMrSTgxMF9QVEVfQkFTRSsoKGktMSkqNCkpOworCXJlYWRsKGludGVsX3ByaXZhdGUuZ3R0K2ktMSk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTM5NywyOSArMjc0LDYgQEAKIAlyZXR1cm4gbmV3OwogfQogCi1zdGF0aWMgc3RydWN0IGFncF9tZW1vcnkgKmludGVsX2k4MTBfYWxsb2NfYnlfdHlwZShzaXplX3QgcGdfY291bnQsIGludCB0eXBlKQotewotCXN0cnVjdCBhZ3BfbWVtb3J5ICpuZXc7Ci0KLQlpZiAodHlwZSA9PSBBR1BfRENBQ0hFX01FTU9SWSkgewotCQlpZiAocGdfY291bnQgIT0gaW50ZWxfcHJpdmF0ZS5udW1fZGNhY2hlX2VudHJpZXMpCi0JCQlyZXR1cm4gTlVMTDsKLQotCQluZXcgPSBhZ3BfY3JlYXRlX21lbW9yeSgxKTsKLQkJaWYgKG5ldyA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0KLQkJbmV3LT50eXBlID0gQUdQX0RDQUNIRV9NRU1PUlk7Ci0JCW5ldy0+cGFnZV9jb3VudCA9IHBnX2NvdW50OwotCQluZXctPm51bV9zY3JhdGNoX3BhZ2VzID0gMDsKLQkJYWdwX2ZyZWVfcGFnZV9hcnJheShuZXcpOwotCQlyZXR1cm4gbmV3OwotCX0KLQlpZiAodHlwZSA9PSBBR1BfUEhZU19NRU1PUlkpCi0JCXJldHVybiBhbGxvY19hZ3BwaHlzbWVtX2k4eHgocGdfY291bnQsIHR5cGUpOwotCXJldHVybiBOVUxMOwotfQotCiBzdGF0aWMgdm9pZCBpbnRlbF9pODEwX2ZyZWVfYnlfdHlwZShzdHJ1Y3QgYWdwX21lbW9yeSAqY3VycikKIHsKIAlhZ3BfZnJlZV9rZXkoY3Vyci0+a2V5KTsKQEAgLTQzNywxMyArMjkxLDYgQEAKIAlrZnJlZShjdXJyKTsKIH0KIAotc3RhdGljIHVuc2lnbmVkIGxvbmcgaW50ZWxfaTgxMF9tYXNrX21lbW9yeShzdHJ1Y3QgYWdwX2JyaWRnZV9kYXRhICpicmlkZ2UsCi0JCQkJCSAgICBkbWFfYWRkcl90IGFkZHIsIGludCB0eXBlKQotewotCS8qIFR5cGUgY2hlY2tpbmcgbXVzdCBiZSBkb25lIGVsc2V3aGVyZSAqLwotCXJldHVybiBhZGRyIHwgYnJpZGdlLT5kcml2ZXItPm1hc2tzW3R5cGVdLm1hc2s7Ci19Ci0KIHN0YXRpYyBpbnQgaW50ZWxfZ3R0X3NldHVwX3NjcmF0Y2hfcGFnZSh2b2lkKQogewogCXN0cnVjdCBwYWdlICpwYWdlOwpAQCAtNDU1LDcgKzMwMiw3IEBACiAJZ2V0X3BhZ2UocGFnZSk7CiAJc2V0X3BhZ2VzX3VjKHBhZ2UsIDEpOwogCi0JaWYgKFVTRV9QQ0lfRE1BX0FQSSAmJiBJTlRFTF9HVFRfR0VOID4gMikgeworCWlmIChpbnRlbF9wcml2YXRlLmJhc2UubmVlZHNfZG1hcikgewogCQlkbWFfYWRkciA9IHBjaV9tYXBfcGFnZShpbnRlbF9wcml2YXRlLnBjaWRldiwgcGFnZSwgMCwKIAkJCQkgICAgUEFHRV9TSVpFLCBQQ0lfRE1BX0JJRElSRUNUSU9OQUwpOwogCQlpZiAocGNpX2RtYV9tYXBwaW5nX2Vycm9yKGludGVsX3ByaXZhdGUucGNpZGV2LCBkbWFfYWRkcikpCkBAIC00NzAsMzQgKzMxNyw0NSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgY29uc3Qgc3RydWN0IGFwZXJfc2l6ZV9pbmZvX2ZpeGVkIGNvbnN0IGludGVsX2Zha2VfYWdwX3NpemVzW10gPSB7CitzdGF0aWMgdm9pZCBpODEwX3dyaXRlX2VudHJ5KGRtYV9hZGRyX3QgYWRkciwgdW5zaWduZWQgaW50IGVudHJ5LAorCQkJICAgICB1bnNpZ25lZCBpbnQgZmxhZ3MpCit7CisJdTMyIHB0ZV9mbGFncyA9IEk4MTBfUFRFX1ZBTElEOworCisJc3dpdGNoIChmbGFncykgeworCWNhc2UgQUdQX0RDQUNIRV9NRU1PUlk6CisJCXB0ZV9mbGFncyB8PSBJODEwX1BURV9MT0NBTDsKKwkJYnJlYWs7CisJY2FzZSBBR1BfVVNFUl9DQUNIRURfTUVNT1JZOgorCQlwdGVfZmxhZ3MgfD0gSTgzMF9QVEVfU1lTVEVNX0NBQ0hFRDsKKwkJYnJlYWs7CisJfQorCisJd3JpdGVsKGFkZHIgfCBwdGVfZmxhZ3MsIGludGVsX3ByaXZhdGUuZ3R0ICsgZW50cnkpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGFwZXJfc2l6ZV9pbmZvX2ZpeGVkIGludGVsX2Zha2VfYWdwX3NpemVzW10gPSB7CisJezMyLCA4MTkyLCAzfSwKKwl7NjQsIDE2Mzg0LCA0fSwKIAl7MTI4LCAzMjc2OCwgNX0sCi0JLyogVGhlIDY0TSBtb2RlIHN0aWxsIHJlcXVpcmVzIGEgMTI4ayBnYXR0ICovCi0JezY0LCAxNjM4NCwgNX0sCiAJezI1NiwgNjU1MzYsIDZ9LAogCXs1MTIsIDEzMTA3MiwgN30sCiB9OwogCi1zdGF0aWMgdW5zaWduZWQgaW50IGludGVsX2d0dF9zdG9sZW5fZW50cmllcyh2b2lkKQorc3RhdGljIHVuc2lnbmVkIGludCBpbnRlbF9ndHRfc3RvbGVuX3NpemUodm9pZCkKIHsKIAl1MTYgZ21jaF9jdHJsOwogCXU4IHJkY3Q7CiAJaW50IGxvY2FsID0gMDsKIAlzdGF0aWMgY29uc3QgaW50IGRkdFs0XSA9IHsgMCwgMTYsIDMyLCA2NCB9OwotCXVuc2lnbmVkIGludCBvdmVyaGVhZF9lbnRyaWVzLCBzdG9sZW5fZW50cmllczsKIAl1bnNpZ25lZCBpbnQgc3RvbGVuX3NpemUgPSAwOwogCisJaWYgKElOVEVMX0dUVF9HRU4gPT0gMSkKKwkJcmV0dXJuIDA7IC8qIG5vIHN0b2xlbiBtZW0gb24gaTgxeCAqLworCiAJcGNpX3JlYWRfY29uZmlnX3dvcmQoaW50ZWxfcHJpdmF0ZS5icmlkZ2VfZGV2LAogCQkJICAgICBJODMwX0dNQ0hfQ1RSTCwgJmdtY2hfY3RybCk7CiAKLQlpZiAoSU5URUxfR1RUX0dFTiA+IDQgfHwgSVNfUElORVZJRVcpCi0JCW92ZXJoZWFkX2VudHJpZXMgPSAwOwotCWVsc2UKLQkJb3ZlcmhlYWRfZW50cmllcyA9IGludGVsX3ByaXZhdGUuYmFzZS5ndHRfbWFwcGFibGVfZW50cmllcwotCQkJLyAxMDI0OwotCi0Jb3ZlcmhlYWRfZW50cmllcyArPSAxOyAvKiBCSU9TIHBvcHVwICovCi0KIAlpZiAoaW50ZWxfcHJpdmF0ZS5icmlkZ2VfZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9JTlRFTF84MjgzMF9IQiB8fAogCSAgICBpbnRlbF9wcml2YXRlLmJyaWRnZV9kZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODQ1R19IQikgewogCQlzd2l0Y2ggKGdtY2hfY3RybCAmIEk4MzBfR01DSF9HTVNfTUFTSykgewpAQCAtNjIzLDEyICs0ODEsNyBAQAogCQl9CiAJfQogCi0JaWYgKCFsb2NhbCAmJiBzdG9sZW5fc2l6ZSA+IGludGVsX21heF9zdG9sZW4pIHsKLQkJZGV2X2luZm8oJmludGVsX3ByaXZhdGUuYnJpZGdlX2Rldi0+ZGV2LAotCQkJICJkZXRlY3RlZCAlZEsgc3RvbGVuIG1lbW9yeSwgdHJpbW1pbmcgdG8gJWRLXG4iLAotCQkJIHN0b2xlbl9zaXplIC8gS0IoMSksIGludGVsX21heF9zdG9sZW4gLyBLQigxKSk7Ci0JCXN0b2xlbl9zaXplID0gaW50ZWxfbWF4X3N0b2xlbjsKLQl9IGVsc2UgaWYgKHN0b2xlbl9zaXplID4gMCkgeworCWlmIChzdG9sZW5fc2l6ZSA+IDApIHsKIAkJZGV2X2luZm8oJmludGVsX3ByaXZhdGUuYnJpZGdlX2Rldi0+ZGV2LCAiZGV0ZWN0ZWQgJWRLICVzIG1lbW9yeVxuIiwKIAkJICAgICAgIHN0b2xlbl9zaXplIC8gS0IoMSksIGxvY2FsID8gImxvY2FsIiA6ICJzdG9sZW4iKTsKIAl9IGVsc2UgewpAQCAtNjM3LDQ2ICs0OTAsODggQEAKIAkJc3RvbGVuX3NpemUgPSAwOwogCX0KIAotCXN0b2xlbl9lbnRyaWVzID0gc3RvbGVuX3NpemUvS0IoNCkgLSBvdmVyaGVhZF9lbnRyaWVzOworCXJldHVybiBzdG9sZW5fc2l6ZTsKK30KIAotCXJldHVybiBzdG9sZW5fZW50cmllczsKK3N0YXRpYyB2b2lkIGk5NjVfYWRqdXN0X3BnZXRibF9zaXplKHVuc2lnbmVkIGludCBzaXplX2ZsYWcpCit7CisJdTMyIHBnZXRibF9jdGwsIHBnZXRibF9jdGwyOworCisJLyogZW5zdXJlIHRoYXQgcHBndHQgaXMgZGlzYWJsZWQgKi8KKwlwZ2V0YmxfY3RsMiA9IHJlYWRsKGludGVsX3ByaXZhdGUucmVnaXN0ZXJzK0k5NjVfUEdFVEJMX0NUTDIpOworCXBnZXRibF9jdGwyICY9IH5JODEwX1BHRVRCTF9FTkFCTEVEOworCXdyaXRlbChwZ2V0YmxfY3RsMiwgaW50ZWxfcHJpdmF0ZS5yZWdpc3RlcnMrSTk2NV9QR0VUQkxfQ1RMMik7CisKKwkvKiB3cml0ZSB0aGUgbmV3IGdndHQgc2l6ZSAqLworCXBnZXRibF9jdGwgPSByZWFkbChpbnRlbF9wcml2YXRlLnJlZ2lzdGVycytJODEwX1BHRVRCTF9DVEwpOworCXBnZXRibF9jdGwgJj0gfkk5NjVfUEdFVEJMX1NJWkVfTUFTSzsKKwlwZ2V0YmxfY3RsIHw9IHNpemVfZmxhZzsKKwl3cml0ZWwocGdldGJsX2N0bCwgaW50ZWxfcHJpdmF0ZS5yZWdpc3RlcnMrSTgxMF9QR0VUQkxfQ1RMKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBpOTY1X2d0dF90b3RhbF9lbnRyaWVzKHZvaWQpCit7CisJaW50IHNpemU7CisJdTMyIHBnZXRibF9jdGw7CisJdTE2IGdtY2hfY3RsOworCisJcGNpX3JlYWRfY29uZmlnX3dvcmQoaW50ZWxfcHJpdmF0ZS5icmlkZ2VfZGV2LAorCQkJICAgICBJODMwX0dNQ0hfQ1RSTCwgJmdtY2hfY3RsKTsKKworCWlmIChJTlRFTF9HVFRfR0VOID09IDUpIHsKKwkJc3dpdGNoIChnbWNoX2N0bCAmIEc0eF9HTUNIX1NJWkVfTUFTSykgeworCQljYXNlIEc0eF9HTUNIX1NJWkVfMU06CisJCWNhc2UgRzR4X0dNQ0hfU0laRV9WVF8xTToKKwkJCWk5NjVfYWRqdXN0X3BnZXRibF9zaXplKEk5NjVfUEdFVEJMX1NJWkVfMU1CKTsKKwkJCWJyZWFrOworCQljYXNlIEc0eF9HTUNIX1NJWkVfVlRfMV81TToKKwkJCWk5NjVfYWRqdXN0X3BnZXRibF9zaXplKEk5NjVfUEdFVEJMX1NJWkVfMV81TUIpOworCQkJYnJlYWs7CisJCWNhc2UgRzR4X0dNQ0hfU0laRV8yTToKKwkJY2FzZSBHNHhfR01DSF9TSVpFX1ZUXzJNOgorCQkJaTk2NV9hZGp1c3RfcGdldGJsX3NpemUoSTk2NV9QR0VUQkxfU0laRV8yTUIpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlwZ2V0YmxfY3RsID0gcmVhZGwoaW50ZWxfcHJpdmF0ZS5yZWdpc3RlcnMrSTgxMF9QR0VUQkxfQ1RMKTsKKworCXN3aXRjaCAocGdldGJsX2N0bCAmIEk5NjVfUEdFVEJMX1NJWkVfTUFTSykgeworCWNhc2UgSTk2NV9QR0VUQkxfU0laRV8xMjhLQjoKKwkJc2l6ZSA9IEtCKDEyOCk7CisJCWJyZWFrOworCWNhc2UgSTk2NV9QR0VUQkxfU0laRV8yNTZLQjoKKwkJc2l6ZSA9IEtCKDI1Nik7CisJCWJyZWFrOworCWNhc2UgSTk2NV9QR0VUQkxfU0laRV81MTJLQjoKKwkJc2l6ZSA9IEtCKDUxMik7CisJCWJyZWFrOworCS8qIEdUVCBwYWdldGFibGUgc2l6ZXMgYmlnZ2VyIHRoYW4gNTEyS0IgYXJlIG5vdCBwb3NzaWJsZSBvbiBHMzMhICovCisJY2FzZSBJOTY1X1BHRVRCTF9TSVpFXzFNQjoKKwkJc2l6ZSA9IEtCKDEwMjQpOworCQlicmVhazsKKwljYXNlIEk5NjVfUEdFVEJMX1NJWkVfMk1COgorCQlzaXplID0gS0IoMjA0OCk7CisJCWJyZWFrOworCWNhc2UgSTk2NV9QR0VUQkxfU0laRV8xXzVNQjoKKwkJc2l6ZSA9IEtCKDEwMjQgKyA1MTIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfaW5mbygmaW50ZWxfcHJpdmF0ZS5wY2lkZXYtPmRldiwKKwkJCSAidW5rbm93biBwYWdlIHRhYmxlIHNpemUsIGFzc3VtaW5nIDUxMktCXG4iKTsKKwkJc2l6ZSA9IEtCKDUxMik7CisJfQorCisJcmV0dXJuIHNpemUvNDsKIH0KIAogc3RhdGljIHVuc2lnbmVkIGludCBpbnRlbF9ndHRfdG90YWxfZW50cmllcyh2b2lkKQogewogCWludCBzaXplOwogCi0JaWYgKElTX0czMyB8fCBJTlRFTF9HVFRfR0VOID09IDQgfHwgSU5URUxfR1RUX0dFTiA9PSA1KSB7Ci0JCXUzMiBwZ2V0YmxfY3RsOwotCQlwZ2V0YmxfY3RsID0gcmVhZGwoaW50ZWxfcHJpdmF0ZS5yZWdpc3RlcnMrSTgxMF9QR0VUQkxfQ1RMKTsKLQotCQlzd2l0Y2ggKHBnZXRibF9jdGwgJiBJOTY1X1BHRVRCTF9TSVpFX01BU0spIHsKLQkJY2FzZSBJOTY1X1BHRVRCTF9TSVpFXzEyOEtCOgotCQkJc2l6ZSA9IEtCKDEyOCk7Ci0JCQlicmVhazsKLQkJY2FzZSBJOTY1X1BHRVRCTF9TSVpFXzI1NktCOgotCQkJc2l6ZSA9IEtCKDI1Nik7Ci0JCQlicmVhazsKLQkJY2FzZSBJOTY1X1BHRVRCTF9TSVpFXzUxMktCOgotCQkJc2l6ZSA9IEtCKDUxMik7Ci0JCQlicmVhazsKLQkJY2FzZSBJOTY1X1BHRVRCTF9TSVpFXzFNQjoKLQkJCXNpemUgPSBLQigxMDI0KTsKLQkJCWJyZWFrOwotCQljYXNlIEk5NjVfUEdFVEJMX1NJWkVfMk1COgotCQkJc2l6ZSA9IEtCKDIwNDgpOwotCQkJYnJlYWs7Ci0JCWNhc2UgSTk2NV9QR0VUQkxfU0laRV8xXzVNQjoKLQkJCXNpemUgPSBLQigxMDI0ICsgNTEyKTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJZGV2X2luZm8oJmludGVsX3ByaXZhdGUucGNpZGV2LT5kZXYsCi0JCQkJICJ1bmtub3duIHBhZ2UgdGFibGUgc2l6ZSwgYXNzdW1pbmcgNTEyS0JcbiIpOwotCQkJc2l6ZSA9IEtCKDUxMik7Ci0JCX0KLQotCQlyZXR1cm4gc2l6ZS80OwotCX0gZWxzZSBpZiAoSU5URUxfR1RUX0dFTiA9PSA2KSB7CisJaWYgKElTX0czMyB8fCBJTlRFTF9HVFRfR0VOID09IDQgfHwgSU5URUxfR1RUX0dFTiA9PSA1KQorCQlyZXR1cm4gaTk2NV9ndHRfdG90YWxfZW50cmllcygpOworCWVsc2UgaWYgKElOVEVMX0dUVF9HRU4gPT0gNikgewogCQl1MTYgc25iX2dtY2hfY3RsOwogCiAJCXBjaV9yZWFkX2NvbmZpZ193b3JkKGludGVsX3ByaXZhdGUucGNpZGV2LCBTTkJfR01DSF9DVFJMLCAmc25iX2dtY2hfY3RsKTsKQEAgLTcwNiw3ICs2MDEsMTggQEAKIHsKIAl1bnNpZ25lZCBpbnQgYXBlcnR1cmVfc2l6ZTsKIAotCWlmIChJTlRFTF9HVFRfR0VOID09IDIpIHsKKwlpZiAoSU5URUxfR1RUX0dFTiA9PSAxKSB7CisJCXUzMiBzbXJhbV9taXNjYzsKKworCQlwY2lfcmVhZF9jb25maWdfZHdvcmQoaW50ZWxfcHJpdmF0ZS5icmlkZ2VfZGV2LAorCQkJCSAgICAgIEk4MTBfU01SQU1fTUlTQ0MsICZzbXJhbV9taXNjYyk7CisKKwkJaWYgKChzbXJhbV9taXNjYyAmIEk4MTBfR0ZYX01FTV9XSU5fU0laRSkKKwkJCQk9PSBJODEwX0dGWF9NRU1fV0lOXzMyTSkKKwkJCWFwZXJ0dXJlX3NpemUgPSBNQigzMik7CisJCWVsc2UKKwkJCWFwZXJ0dXJlX3NpemUgPSBNQig2NCk7CisJfSBlbHNlIGlmIChJTlRFTF9HVFRfR0VOID09IDIpIHsKIAkJdTE2IGdtY2hfY3RybDsKIAogCQlwY2lfcmVhZF9jb25maWdfd29yZChpbnRlbF9wcml2YXRlLmJyaWRnZV9kZXYsCkBAIC03MzksNyArNjQ1LDcgQEAKIAogCWlvdW5tYXAoaW50ZWxfcHJpdmF0ZS5ndHQpOwogCWlvdW5tYXAoaW50ZWxfcHJpdmF0ZS5yZWdpc3RlcnMpOwotCQorCiAJaW50ZWxfZ3R0X3RlYXJkb3duX3NjcmF0Y2hfcGFnZSgpOwogfQogCkBAIC03NTUsNiArNjYxLDE0IEBACiAJaW50ZWxfcHJpdmF0ZS5iYXNlLmd0dF9tYXBwYWJsZV9lbnRyaWVzID0gaW50ZWxfZ3R0X21hcHBhYmxlX2VudHJpZXMoKTsKIAlpbnRlbF9wcml2YXRlLmJhc2UuZ3R0X3RvdGFsX2VudHJpZXMgPSBpbnRlbF9ndHRfdG90YWxfZW50cmllcygpOwogCisJLyogc2F2ZSB0aGUgUEdFVEJMIHJlZyBmb3IgcmVzdW1lICovCisJaW50ZWxfcHJpdmF0ZS5QR0VUQkxfc2F2ZSA9CisJCXJlYWRsKGludGVsX3ByaXZhdGUucmVnaXN0ZXJzK0k4MTBfUEdFVEJMX0NUTCkKKwkJCSYgfkk4MTBfUEdFVEJMX0VOQUJMRUQ7CisJLyogd2Ugb25seSBldmVyIHJlc3RvcmUgdGhlIHJlZ2lzdGVyIHdoZW4gZW5hYmxpbmcgdGhlIFBHVEJMLi4uICovCisJaWYgKEhBU19QR1RCTF9FTikKKwkJaW50ZWxfcHJpdmF0ZS5QR0VUQkxfc2F2ZSB8PSBJODEwX1BHRVRCTF9FTkFCTEVEOworCiAJZGV2X2luZm8oJmludGVsX3ByaXZhdGUuYnJpZGdlX2Rldi0+ZGV2LAogCQkJImRldGVjdGVkIGd0dCBzaXplOiAlZEsgdG90YWwsICVkSyBtYXBwYWJsZVxuIiwKIAkJCWludGVsX3ByaXZhdGUuYmFzZS5ndHRfdG90YWxfZW50cmllcyAqIDQsCkBAIC03NzIsMTQgKzY4Niw3IEBACiAKIAlnbG9iYWxfY2FjaGVfZmx1c2goKTsgICAvKiBGSVhNRTogPyAqLwogCi0JLyogd2UgaGF2ZSB0byBjYWxsIHRoaXMgYXMgZWFybHkgYXMgcG9zc2libGUgYWZ0ZXIgdGhlIE1NSU8gYmFzZSBhZGRyZXNzIGlzIGtub3duICovCi0JaW50ZWxfcHJpdmF0ZS5iYXNlLmd0dF9zdG9sZW5fZW50cmllcyA9IGludGVsX2d0dF9zdG9sZW5fZW50cmllcygpOwotCWlmIChpbnRlbF9wcml2YXRlLmJhc2UuZ3R0X3N0b2xlbl9lbnRyaWVzID09IDApIHsKLQkJaW50ZWxfcHJpdmF0ZS5kcml2ZXItPmNsZWFudXAoKTsKLQkJaW91bm1hcChpbnRlbF9wcml2YXRlLnJlZ2lzdGVycyk7Ci0JCWlvdW5tYXAoaW50ZWxfcHJpdmF0ZS5ndHQpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9CisJaW50ZWxfcHJpdmF0ZS5iYXNlLnN0b2xlbl9zaXplID0gaW50ZWxfZ3R0X3N0b2xlbl9zaXplKCk7CiAKIAlyZXQgPSBpbnRlbF9ndHRfc2V0dXBfc2NyYXRjaF9wYWdlKCk7CiAJaWYgKHJldCAhPSAwKSB7CkBAIC03ODcsNiArNjk0LDggQEAKIAkJcmV0dXJuIHJldDsKIAl9CiAKKwlpbnRlbF9wcml2YXRlLmJhc2UubmVlZHNfZG1hciA9IFVTRV9QQ0lfRE1BX0FQSSAmJiBJTlRFTF9HVFRfR0VOID4gMjsKKwogCXJldHVybiAwOwogfQogCkBAIC04NjIsMjUgKzc3MSwxOSBAQAogCQkJICAgICB1bnNpZ25lZCBpbnQgZmxhZ3MpCiB7CiAJdTMyIHB0ZV9mbGFncyA9IEk4MTBfUFRFX1ZBTElEOwotCQotCXN3aXRjaCAoZmxhZ3MpIHsKLQljYXNlIEFHUF9EQ0FDSEVfTUVNT1JZOgotCQlwdGVfZmxhZ3MgfD0gSTgxMF9QVEVfTE9DQUw7Ci0JCWJyZWFrOwotCWNhc2UgQUdQX1VTRVJfQ0FDSEVEX01FTU9SWToKKworCWlmIChmbGFncyA9PSAgQUdQX1VTRVJfQ0FDSEVEX01FTU9SWSkKIAkJcHRlX2ZsYWdzIHw9IEk4MzBfUFRFX1NZU1RFTV9DQUNIRUQ7Ci0JCWJyZWFrOwotCX0KIAogCXdyaXRlbChhZGRyIHwgcHRlX2ZsYWdzLCBpbnRlbF9wcml2YXRlLmd0dCArIGVudHJ5KTsKIH0KIAotc3RhdGljIHZvaWQgaW50ZWxfZW5hYmxlX2d0dCh2b2lkKQorc3RhdGljIGJvb2wgaW50ZWxfZW5hYmxlX2d0dCh2b2lkKQogewogCXUzMiBnbWFfYWRkcjsKLQl1MTYgZ21jaF9jdHJsOworCXU4IF9faW9tZW0gKnJlZzsKIAotCWlmIChJTlRFTF9HVFRfR0VOID09IDIpCisJaWYgKElOVEVMX0dUVF9HRU4gPD0gMikKIAkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGludGVsX3ByaXZhdGUucGNpZGV2LCBJODEwX0dNQUREUiwKIAkJCQkgICAgICAmZ21hX2FkZHIpOwogCWVsc2UKQEAgLTg4OSwxMyArNzkyLDM4IEBACiAKIAlpbnRlbF9wcml2YXRlLmdtYV9idXNfYWRkciA9IChnbWFfYWRkciAmIFBDSV9CQVNFX0FERFJFU1NfTUVNX01BU0spOwogCi0JcGNpX3JlYWRfY29uZmlnX3dvcmQoaW50ZWxfcHJpdmF0ZS5icmlkZ2VfZGV2LCBJODMwX0dNQ0hfQ1RSTCwgJmdtY2hfY3RybCk7Ci0JZ21jaF9jdHJsIHw9IEk4MzBfR01DSF9FTkFCTEVEOwotCXBjaV93cml0ZV9jb25maWdfd29yZChpbnRlbF9wcml2YXRlLmJyaWRnZV9kZXYsIEk4MzBfR01DSF9DVFJMLCBnbWNoX2N0cmwpOworCWlmIChJTlRFTF9HVFRfR0VOID49IDYpCisJICAgIHJldHVybiB0cnVlOwogCi0Jd3JpdGVsKGludGVsX3ByaXZhdGUucHRlX2J1c19hZGRyfEk4MTBfUEdFVEJMX0VOQUJMRUQsCi0JICAgICAgIGludGVsX3ByaXZhdGUucmVnaXN0ZXJzK0k4MTBfUEdFVEJMX0NUTCk7Ci0JcmVhZGwoaW50ZWxfcHJpdmF0ZS5yZWdpc3RlcnMrSTgxMF9QR0VUQkxfQ1RMKTsJLyogUENJIFBvc3RpbmcuICovCisJaWYgKElOVEVMX0dUVF9HRU4gPT0gMikgeworCQl1MTYgZ21jaF9jdHJsOworCisJCXBjaV9yZWFkX2NvbmZpZ193b3JkKGludGVsX3ByaXZhdGUuYnJpZGdlX2RldiwKKwkJCQkgICAgIEk4MzBfR01DSF9DVFJMLCAmZ21jaF9jdHJsKTsKKwkJZ21jaF9jdHJsIHw9IEk4MzBfR01DSF9FTkFCTEVEOworCQlwY2lfd3JpdGVfY29uZmlnX3dvcmQoaW50ZWxfcHJpdmF0ZS5icmlkZ2VfZGV2LAorCQkJCSAgICAgIEk4MzBfR01DSF9DVFJMLCBnbWNoX2N0cmwpOworCisJCXBjaV9yZWFkX2NvbmZpZ193b3JkKGludGVsX3ByaXZhdGUuYnJpZGdlX2RldiwKKwkJCQkgICAgIEk4MzBfR01DSF9DVFJMLCAmZ21jaF9jdHJsKTsKKwkJaWYgKChnbWNoX2N0cmwgJiBJODMwX0dNQ0hfRU5BQkxFRCkgPT0gMCkgeworCQkJZGV2X2VycigmaW50ZWxfcHJpdmF0ZS5wY2lkZXYtPmRldiwKKwkJCQkiZmFpbGVkIHRvIGVuYWJsZSB0aGUgR1RUOiBHTUNIX0NUUkw9JXhcbiIsCisJCQkJZ21jaF9jdHJsKTsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCX0KKworCXJlZyA9IGludGVsX3ByaXZhdGUucmVnaXN0ZXJzK0k4MTBfUEdFVEJMX0NUTDsKKwl3cml0ZWwoaW50ZWxfcHJpdmF0ZS5QR0VUQkxfc2F2ZSwgcmVnKTsKKwlpZiAoSEFTX1BHVEJMX0VOICYmIChyZWFkbChyZWcpICYgSTgxMF9QR0VUQkxfRU5BQkxFRCkgPT0gMCkgeworCQlkZXZfZXJyKCZpbnRlbF9wcml2YXRlLnBjaWRldi0+ZGV2LAorCQkJImZhaWxlZCB0byBlbmFibGUgdGhlIEdUVDogUEdFVEJMPSV4IFtleHBlY3RlZCAleF1cbiIsCisJCQlyZWFkbChyZWcpLCBpbnRlbF9wcml2YXRlLlBHRVRCTF9zYXZlKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXJldHVybiB0cnVlOwogfQogCiBzdGF0aWMgaW50IGk4MzBfc2V0dXAodm9pZCkKQEAgLTkxMCw4ICs4MzgsNiBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAogCWludGVsX3ByaXZhdGUuZ3R0X2J1c19hZGRyID0gcmVnX2FkZHIgKyBJODEwX1BURV9CQVNFOwotCWludGVsX3ByaXZhdGUucHRlX2J1c19hZGRyID0KLQkJcmVhZGwoaW50ZWxfcHJpdmF0ZS5yZWdpc3RlcnMrSTgxMF9QR0VUQkxfQ1RMKSAmIDB4ZmZmZmYwMDA7CiAKIAlpbnRlbF9pODMwX3NldHVwX2ZsdXNoKCk7CiAKQEAgLTkzNiwxMiArODYyLDEyIEBACiB7CiAJaW50IGk7CiAKLQlpbnRlbF9lbmFibGVfZ3R0KCk7CisJaWYgKCFpbnRlbF9lbmFibGVfZ3R0KCkpCisJICAgIHJldHVybiAtRUlPOwogCiAJYWdwX2JyaWRnZS0+Z2FydF9idXNfYWRkciA9IGludGVsX3ByaXZhdGUuZ21hX2J1c19hZGRyOwogCi0JZm9yIChpID0gaW50ZWxfcHJpdmF0ZS5iYXNlLmd0dF9zdG9sZW5fZW50cmllczsKLQkJCWkgPCBpbnRlbF9wcml2YXRlLmJhc2UuZ3R0X3RvdGFsX2VudHJpZXM7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBpbnRlbF9wcml2YXRlLmJhc2UuZ3R0X3RvdGFsX2VudHJpZXM7IGkrKykgewogCQlpbnRlbF9wcml2YXRlLmRyaXZlci0+d3JpdGVfZW50cnkoaW50ZWxfcHJpdmF0ZS5zY3JhdGNoX3BhZ2VfZG1hLAogCQkJCQkJICBpLCAwKTsKIAl9CkBAIC05NjUsMTAgKzg5MSwxMCBAQAogCXJldHVybiBmYWxzZTsKIH0KIAotc3RhdGljIHZvaWQgaW50ZWxfZ3R0X2luc2VydF9zZ19lbnRyaWVzKHN0cnVjdCBzY2F0dGVybGlzdCAqc2dfbGlzdCwKLQkJCQkJdW5zaWduZWQgaW50IHNnX2xlbiwKLQkJCQkJdW5zaWduZWQgaW50IHBnX3N0YXJ0LAotCQkJCQl1bnNpZ25lZCBpbnQgZmxhZ3MpCit2b2lkIGludGVsX2d0dF9pbnNlcnRfc2dfZW50cmllcyhzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnX2xpc3QsCisJCQkJIHVuc2lnbmVkIGludCBzZ19sZW4sCisJCQkJIHVuc2lnbmVkIGludCBwZ19zdGFydCwKKwkJCQkgdW5zaWduZWQgaW50IGZsYWdzKQogewogCXN0cnVjdCBzY2F0dGVybGlzdCAqc2c7CiAJdW5zaWduZWQgaW50IGxlbiwgbTsKQEAgLTk4OSwyNyArOTE1LDM0IEBACiAJfQogCXJlYWRsKGludGVsX3ByaXZhdGUuZ3R0K2otMSk7CiB9CitFWFBPUlRfU1lNQk9MKGludGVsX2d0dF9pbnNlcnRfc2dfZW50cmllcyk7CisKK3ZvaWQgaW50ZWxfZ3R0X2luc2VydF9wYWdlcyh1bnNpZ25lZCBpbnQgZmlyc3RfZW50cnksIHVuc2lnbmVkIGludCBudW1fZW50cmllcywKKwkJCSAgICBzdHJ1Y3QgcGFnZSAqKnBhZ2VzLCB1bnNpZ25lZCBpbnQgZmxhZ3MpCit7CisJaW50IGksIGo7CisKKwlmb3IgKGkgPSAwLCBqID0gZmlyc3RfZW50cnk7IGkgPCBudW1fZW50cmllczsgaSsrLCBqKyspIHsKKwkJZG1hX2FkZHJfdCBhZGRyID0gcGFnZV90b19waHlzKHBhZ2VzW2ldKTsKKwkJaW50ZWxfcHJpdmF0ZS5kcml2ZXItPndyaXRlX2VudHJ5KGFkZHIsCisJCQkJCQkgIGosIGZsYWdzKTsKKwl9CisJcmVhZGwoaW50ZWxfcHJpdmF0ZS5ndHQrai0xKTsKK30KK0VYUE9SVF9TWU1CT0woaW50ZWxfZ3R0X2luc2VydF9wYWdlcyk7CiAKIHN0YXRpYyBpbnQgaW50ZWxfZmFrZV9hZ3BfaW5zZXJ0X2VudHJpZXMoc3RydWN0IGFncF9tZW1vcnkgKm1lbSwKIAkJCQkJIG9mZl90IHBnX3N0YXJ0LCBpbnQgdHlwZSkKIHsKLQlpbnQgaSwgajsKIAlpbnQgcmV0ID0gLUVJTlZBTDsKIAorCWlmIChJTlRFTF9HVFRfR0VOID09IDEgJiYgdHlwZSA9PSBBR1BfRENBQ0hFX01FTU9SWSkKKwkJcmV0dXJuIGk4MTBfaW5zZXJ0X2RjYWNoZV9lbnRyaWVzKG1lbSwgcGdfc3RhcnQsIHR5cGUpOworCiAJaWYgKG1lbS0+cGFnZV9jb3VudCA9PSAwKQogCQlnb3RvIG91dDsKIAotCWlmIChwZ19zdGFydCA8IGludGVsX3ByaXZhdGUuYmFzZS5ndHRfc3RvbGVuX2VudHJpZXMpIHsKLQkJZGV2X3ByaW50ayhLRVJOX0RFQlVHLCAmaW50ZWxfcHJpdmF0ZS5wY2lkZXYtPmRldiwKLQkJCSAgICJwZ19zdGFydCA9PSAweCUuOGx4LCBndHRfc3RvbGVuX2VudHJpZXMgPT0gMHglLjh4XG4iLAotCQkJICAgcGdfc3RhcnQsIGludGVsX3ByaXZhdGUuYmFzZS5ndHRfc3RvbGVuX2VudHJpZXMpOwotCi0JCWRldl9pbmZvKCZpbnRlbF9wcml2YXRlLnBjaWRldi0+ZGV2LAotCQkJICJ0cnlpbmcgdG8gaW5zZXJ0IGludG8gbG9jYWwvc3RvbGVuIG1lbW9yeVxuIik7Ci0JCWdvdG8gb3V0X2VycjsKLQl9Ci0KLQlpZiAoKHBnX3N0YXJ0ICsgbWVtLT5wYWdlX2NvdW50KSA+IGludGVsX3ByaXZhdGUuYmFzZS5ndHRfdG90YWxfZW50cmllcykKKwlpZiAocGdfc3RhcnQgKyBtZW0tPnBhZ2VfY291bnQgPiBpbnRlbF9wcml2YXRlLmJhc2UuZ3R0X3RvdGFsX2VudHJpZXMpCiAJCWdvdG8gb3V0X2VycjsKIAogCWlmICh0eXBlICE9IG1lbS0+dHlwZSkKQEAgLTEwMjEsMjEgKzk1NCwxNyBAQAogCWlmICghbWVtLT5pc19mbHVzaGVkKQogCQlnbG9iYWxfY2FjaGVfZmx1c2goKTsKIAotCWlmIChVU0VfUENJX0RNQV9BUEkgJiYgSU5URUxfR1RUX0dFTiA+IDIpIHsKLQkJcmV0ID0gaW50ZWxfYWdwX21hcF9tZW1vcnkobWVtKTsKKwlpZiAoaW50ZWxfcHJpdmF0ZS5iYXNlLm5lZWRzX2RtYXIpIHsKKwkJcmV0ID0gaW50ZWxfZ3R0X21hcF9tZW1vcnkobWVtLT5wYWdlcywgbWVtLT5wYWdlX2NvdW50LAorCQkJCQkgICAmbWVtLT5zZ19saXN0LCAmbWVtLT5udW1fc2cpOwogCQlpZiAocmV0ICE9IDApCiAJCQlyZXR1cm4gcmV0OwogCiAJCWludGVsX2d0dF9pbnNlcnRfc2dfZW50cmllcyhtZW0tPnNnX2xpc3QsIG1lbS0+bnVtX3NnLAogCQkJCQkgICAgcGdfc3RhcnQsIHR5cGUpOwotCX0gZWxzZSB7Ci0JCWZvciAoaSA9IDAsIGogPSBwZ19zdGFydDsgaSA8IG1lbS0+cGFnZV9jb3VudDsgaSsrLCBqKyspIHsKLQkJCWRtYV9hZGRyX3QgYWRkciA9IHBhZ2VfdG9fcGh5cyhtZW0tPnBhZ2VzW2ldKTsKLQkJCWludGVsX3ByaXZhdGUuZHJpdmVyLT53cml0ZV9lbnRyeShhZGRyLAotCQkJCQkJCSAgaiwgdHlwZSk7Ci0JCX0KLQkJcmVhZGwoaW50ZWxfcHJpdmF0ZS5ndHQrai0xKTsKLQl9CisJfSBlbHNlCisJCWludGVsX2d0dF9pbnNlcnRfcGFnZXMocGdfc3RhcnQsIG1lbS0+cGFnZV9jb3VudCwgbWVtLT5wYWdlcywKKwkJCQkgICAgICAgdHlwZSk7CiAKIG91dDoKIAlyZXQgPSAwOwpAQCAtMTA0NCw0MCArOTczLDU0IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBpbnRlbF9mYWtlX2FncF9yZW1vdmVfZW50cmllcyhzdHJ1Y3QgYWdwX21lbW9yeSAqbWVtLAotCQkJCQkgb2ZmX3QgcGdfc3RhcnQsIGludCB0eXBlKQordm9pZCBpbnRlbF9ndHRfY2xlYXJfcmFuZ2UodW5zaWduZWQgaW50IGZpcnN0X2VudHJ5LCB1bnNpZ25lZCBpbnQgbnVtX2VudHJpZXMpCiB7Ci0JaW50IGk7CisJdW5zaWduZWQgaW50IGk7CiAKLQlpZiAobWVtLT5wYWdlX2NvdW50ID09IDApCi0JCXJldHVybiAwOwotCi0JaWYgKHBnX3N0YXJ0IDwgaW50ZWxfcHJpdmF0ZS5iYXNlLmd0dF9zdG9sZW5fZW50cmllcykgewotCQlkZXZfaW5mbygmaW50ZWxfcHJpdmF0ZS5wY2lkZXYtPmRldiwKLQkJCSAidHJ5aW5nIHRvIGRpc2FibGUgbG9jYWwvc3RvbGVuIG1lbW9yeVxuIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWlmIChVU0VfUENJX0RNQV9BUEkgJiYgSU5URUxfR1RUX0dFTiA+IDIpCi0JCWludGVsX2FncF91bm1hcF9tZW1vcnkobWVtKTsKLQotCWZvciAoaSA9IHBnX3N0YXJ0OyBpIDwgKG1lbS0+cGFnZV9jb3VudCArIHBnX3N0YXJ0KTsgaSsrKSB7CisJZm9yIChpID0gZmlyc3RfZW50cnk7IGkgPCAoZmlyc3RfZW50cnkgKyBudW1fZW50cmllcyk7IGkrKykgewogCQlpbnRlbF9wcml2YXRlLmRyaXZlci0+d3JpdGVfZW50cnkoaW50ZWxfcHJpdmF0ZS5zY3JhdGNoX3BhZ2VfZG1hLAogCQkJCQkJICBpLCAwKTsKIAl9CiAJcmVhZGwoaW50ZWxfcHJpdmF0ZS5ndHQraS0xKTsKK30KK0VYUE9SVF9TWU1CT0woaW50ZWxfZ3R0X2NsZWFyX3JhbmdlKTsKKworc3RhdGljIGludCBpbnRlbF9mYWtlX2FncF9yZW1vdmVfZW50cmllcyhzdHJ1Y3QgYWdwX21lbW9yeSAqbWVtLAorCQkJCQkgb2ZmX3QgcGdfc3RhcnQsIGludCB0eXBlKQoreworCWlmIChtZW0tPnBhZ2VfY291bnQgPT0gMCkKKwkJcmV0dXJuIDA7CisKKwlpZiAoaW50ZWxfcHJpdmF0ZS5iYXNlLm5lZWRzX2RtYXIpIHsKKwkJaW50ZWxfZ3R0X3VubWFwX21lbW9yeShtZW0tPnNnX2xpc3QsIG1lbS0+bnVtX3NnKTsKKwkJbWVtLT5zZ19saXN0ID0gTlVMTDsKKwkJbWVtLT5udW1fc2cgPSAwOworCX0KKworCWludGVsX2d0dF9jbGVhcl9yYW5nZShwZ19zdGFydCwgbWVtLT5wYWdlX2NvdW50KTsKIAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBpbnRlbF9mYWtlX2FncF9jaGlwc2V0X2ZsdXNoKHN0cnVjdCBhZ3BfYnJpZGdlX2RhdGEgKmJyaWRnZSkKLXsKLQlpbnRlbF9wcml2YXRlLmRyaXZlci0+Y2hpcHNldF9mbHVzaCgpOwotfQotCiBzdGF0aWMgc3RydWN0IGFncF9tZW1vcnkgKmludGVsX2Zha2VfYWdwX2FsbG9jX2J5X3R5cGUoc2l6ZV90IHBnX2NvdW50LAogCQkJCQkJICAgICAgIGludCB0eXBlKQogeworCXN0cnVjdCBhZ3BfbWVtb3J5ICpuZXc7CisKKwlpZiAodHlwZSA9PSBBR1BfRENBQ0hFX01FTU9SWSAmJiBJTlRFTF9HVFRfR0VOID09IDEpIHsKKwkJaWYgKHBnX2NvdW50ICE9IGludGVsX3ByaXZhdGUubnVtX2RjYWNoZV9lbnRyaWVzKQorCQkJcmV0dXJuIE5VTEw7CisKKwkJbmV3ID0gYWdwX2NyZWF0ZV9tZW1vcnkoMSk7CisJCWlmIChuZXcgPT0gTlVMTCkKKwkJCXJldHVybiBOVUxMOworCisJCW5ldy0+dHlwZSA9IEFHUF9EQ0FDSEVfTUVNT1JZOworCQluZXctPnBhZ2VfY291bnQgPSBwZ19jb3VudDsKKwkJbmV3LT5udW1fc2NyYXRjaF9wYWdlcyA9IDA7CisJCWFncF9mcmVlX3BhZ2VfYXJyYXkobmV3KTsKKwkJcmV0dXJuIG5ldzsKKwl9CiAJaWYgKHR5cGUgPT0gQUdQX1BIWVNfTUVNT1JZKQogCQlyZXR1cm4gYWxsb2NfYWdwcGh5c21lbV9pOHh4KHBnX2NvdW50LCB0eXBlKTsKIAkvKiBhbHdheXMgcmV0dXJuIE5VTEwgZm9yIG90aGVyIGFsbG9jYXRpb24gdHlwZXMgZm9yIG5vdyAqLwpAQCAtMTI3NCw0MCArMTIxNywxMSBAQAogCQlpbnRlbF9wcml2YXRlLmd0dF9idXNfYWRkciA9IHJlZ19hZGRyICsgZ3R0X29mZnNldDsKIAl9CiAKLQlpbnRlbF9wcml2YXRlLnB0ZV9idXNfYWRkciA9Ci0JCXJlYWRsKGludGVsX3ByaXZhdGUucmVnaXN0ZXJzK0k4MTBfUEdFVEJMX0NUTCkgJiAweGZmZmZmMDAwOwotCiAJaW50ZWxfaTl4eF9zZXR1cF9mbHVzaCgpOwogCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYWdwX2JyaWRnZV9kcml2ZXIgaW50ZWxfODEwX2RyaXZlciA9IHsKLQkub3duZXIJCQk9IFRISVNfTU9EVUxFLAotCS5hcGVydHVyZV9zaXplcwkJPSBpbnRlbF9pODEwX3NpemVzLAotCS5zaXplX3R5cGUJCT0gRklYRURfQVBFUl9TSVpFLAotCS5udW1fYXBlcnR1cmVfc2l6ZXMJPSAyLAotCS5uZWVkc19zY3JhdGNoX3BhZ2UJPSB0cnVlLAotCS5jb25maWd1cmUJCT0gaW50ZWxfaTgxMF9jb25maWd1cmUsCi0JLmZldGNoX3NpemUJCT0gaW50ZWxfaTgxMF9mZXRjaF9zaXplLAotCS5jbGVhbnVwCQk9IGludGVsX2k4MTBfY2xlYW51cCwKLQkubWFza19tZW1vcnkJCT0gaW50ZWxfaTgxMF9tYXNrX21lbW9yeSwKLQkubWFza3MJCQk9IGludGVsX2k4MTBfbWFza3MsCi0JLmFncF9lbmFibGUJCT0gaW50ZWxfZmFrZV9hZ3BfZW5hYmxlLAotCS5jYWNoZV9mbHVzaAkJPSBnbG9iYWxfY2FjaGVfZmx1c2gsCi0JLmNyZWF0ZV9nYXR0X3RhYmxlCT0gYWdwX2dlbmVyaWNfY3JlYXRlX2dhdHRfdGFibGUsCi0JLmZyZWVfZ2F0dF90YWJsZQk9IGFncF9nZW5lcmljX2ZyZWVfZ2F0dF90YWJsZSwKLQkuaW5zZXJ0X21lbW9yeQkJPSBpbnRlbF9pODEwX2luc2VydF9lbnRyaWVzLAotCS5yZW1vdmVfbWVtb3J5CQk9IGludGVsX2k4MTBfcmVtb3ZlX2VudHJpZXMsCi0JLmFsbG9jX2J5X3R5cGUJCT0gaW50ZWxfaTgxMF9hbGxvY19ieV90eXBlLAotCS5mcmVlX2J5X3R5cGUJCT0gaW50ZWxfaTgxMF9mcmVlX2J5X3R5cGUsCi0JLmFncF9hbGxvY19wYWdlCQk9IGFncF9nZW5lcmljX2FsbG9jX3BhZ2UsCi0JLmFncF9hbGxvY19wYWdlcyAgICAgICAgPSBhZ3BfZ2VuZXJpY19hbGxvY19wYWdlcywKLQkuYWdwX2Rlc3Ryb3lfcGFnZQk9IGFncF9nZW5lcmljX2Rlc3Ryb3lfcGFnZSwKLQkuYWdwX2Rlc3Ryb3lfcGFnZXMgICAgICA9IGFncF9nZW5lcmljX2Rlc3Ryb3lfcGFnZXMsCi0JLmFncF90eXBlX3RvX21hc2tfdHlwZSAgPSBhZ3BfZ2VuZXJpY190eXBlX3RvX21hc2tfdHlwZSwKLX07Ci0KIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYWdwX2JyaWRnZV9kcml2ZXIgaW50ZWxfZmFrZV9hZ3BfZHJpdmVyID0gewogCS5vd25lcgkJCT0gVEhJU19NT0RVTEUsCiAJLnNpemVfdHlwZQkJPSBGSVhFRF9BUEVSX1NJWkUsCkBAIC0xMzI4LDE1ICsxMjQyLDIwIEBACiAJLmFncF9hbGxvY19wYWdlcyAgICAgICAgPSBhZ3BfZ2VuZXJpY19hbGxvY19wYWdlcywKIAkuYWdwX2Rlc3Ryb3lfcGFnZQk9IGFncF9nZW5lcmljX2Rlc3Ryb3lfcGFnZSwKIAkuYWdwX2Rlc3Ryb3lfcGFnZXMgICAgICA9IGFncF9nZW5lcmljX2Rlc3Ryb3lfcGFnZXMsCi0JLmNoaXBzZXRfZmx1c2gJCT0gaW50ZWxfZmFrZV9hZ3BfY2hpcHNldF9mbHVzaCwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaW50ZWxfZ3R0X2RyaXZlciBpODF4X2d0dF9kcml2ZXIgPSB7CiAJLmdlbiA9IDEsCisJLmhhc19wZ3RibF9lbmFibGUgPSAxLAogCS5kbWFfbWFza19zaXplID0gMzIsCisJLnNldHVwID0gaTgxMF9zZXR1cCwKKwkuY2xlYW51cCA9IGk4MTBfY2xlYW51cCwKKwkuY2hlY2tfZmxhZ3MgPSBpODMwX2NoZWNrX2ZsYWdzLAorCS53cml0ZV9lbnRyeSA9IGk4MTBfd3JpdGVfZW50cnksCiB9Owogc3RhdGljIGNvbnN0IHN0cnVjdCBpbnRlbF9ndHRfZHJpdmVyIGk4eHhfZ3R0X2RyaXZlciA9IHsKIAkuZ2VuID0gMiwKKwkuaGFzX3BndGJsX2VuYWJsZSA9IDEsCiAJLnNldHVwID0gaTgzMF9zZXR1cCwKIAkuY2xlYW51cCA9IGk4MzBfY2xlYW51cCwKIAkud3JpdGVfZW50cnkgPSBpODMwX3dyaXRlX2VudHJ5LApAQCAtMTM0NiwxMCArMTI2NSwxMSBAQAogfTsKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaW50ZWxfZ3R0X2RyaXZlciBpOTE1X2d0dF9kcml2ZXIgPSB7CiAJLmdlbiA9IDMsCisJLmhhc19wZ3RibF9lbmFibGUgPSAxLAogCS5zZXR1cCA9IGk5eHhfc2V0dXAsCiAJLmNsZWFudXAgPSBpOXh4X2NsZWFudXAsCiAJLyogaTk0NSBpcyB0aGUgbGFzdCBncHUgdG8gbmVlZCBwaHlzIG1lbSAoZm9yIG92ZXJsYXkgYW5kIGN1cnNvcnMpLiAqLwotCS53cml0ZV9lbnRyeSA9IGk4MzBfd3JpdGVfZW50cnksIAorCS53cml0ZV9lbnRyeSA9IGk4MzBfd3JpdGVfZW50cnksCiAJLmRtYV9tYXNrX3NpemUgPSAzMiwKIAkuY2hlY2tfZmxhZ3MgPSBpODMwX2NoZWNrX2ZsYWdzLAogCS5jaGlwc2V0X2ZsdXNoID0gaTl4eF9jaGlwc2V0X2ZsdXNoLApAQCAtMTM3Niw2ICsxMjk2LDcgQEAKIH07CiBzdGF0aWMgY29uc3Qgc3RydWN0IGludGVsX2d0dF9kcml2ZXIgaTk2NV9ndHRfZHJpdmVyID0gewogCS5nZW4gPSA0LAorCS5oYXNfcGd0YmxfZW5hYmxlID0gMSwKIAkuc2V0dXAgPSBpOXh4X3NldHVwLAogCS5jbGVhbnVwID0gaTl4eF9jbGVhbnVwLAogCS53cml0ZV9lbnRyeSA9IGk5NjVfd3JpdGVfZW50cnksCkBAIC0xNDE5LDkzICsxMzQwLDkyIEBACiBzdGF0aWMgY29uc3Qgc3RydWN0IGludGVsX2d0dF9kcml2ZXJfZGVzY3JpcHRpb24gewogCXVuc2lnbmVkIGludCBnbWNoX2NoaXBfaWQ7CiAJY2hhciAqbmFtZTsKLQljb25zdCBzdHJ1Y3QgYWdwX2JyaWRnZV9kcml2ZXIgKmdtY2hfZHJpdmVyOwogCWNvbnN0IHN0cnVjdCBpbnRlbF9ndHRfZHJpdmVyICpndHRfZHJpdmVyOwogfSBpbnRlbF9ndHRfY2hpcHNldHNbXSA9IHsKLQl7IFBDSV9ERVZJQ0VfSURfSU5URUxfODI4MTBfSUcxLCAiaTgxMCIsICZpbnRlbF84MTBfZHJpdmVyLAorCXsgUENJX0RFVklDRV9JRF9JTlRFTF84MjgxMF9JRzEsICJpODEwIiwKIAkJJmk4MXhfZ3R0X2RyaXZlcn0sCi0JeyBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODEwX0lHMywgImk4MTAiLCAmaW50ZWxfODEwX2RyaXZlciwKKwl7IFBDSV9ERVZJQ0VfSURfSU5URUxfODI4MTBfSUczLCAiaTgxMCIsCiAJCSZpODF4X2d0dF9kcml2ZXJ9LAotCXsgUENJX0RFVklDRV9JRF9JTlRFTF84MjgxMEVfSUcsICJpODEwIiwgJmludGVsXzgxMF9kcml2ZXIsCisJeyBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODEwRV9JRywgImk4MTAiLAogCQkmaTgxeF9ndHRfZHJpdmVyfSwKLQl7IFBDSV9ERVZJQ0VfSURfSU5URUxfODI4MTVfQ0dDLCAiaTgxNSIsICZpbnRlbF84MTBfZHJpdmVyLAorCXsgUENJX0RFVklDRV9JRF9JTlRFTF84MjgxNV9DR0MsICJpODE1IiwKIAkJJmk4MXhfZ3R0X2RyaXZlcn0sCiAJeyBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODMwX0NHQywgIjgzME0iLAotCQkmaW50ZWxfZmFrZV9hZ3BfZHJpdmVyLCAmaTh4eF9ndHRfZHJpdmVyfSwKKwkJJmk4eHhfZ3R0X2RyaXZlcn0sCiAJeyBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODQ1R19JRywgIjgzME0iLAotCQkmaW50ZWxfZmFrZV9hZ3BfZHJpdmVyLCAmaTh4eF9ndHRfZHJpdmVyfSwKKwkJJmk4eHhfZ3R0X2RyaXZlcn0sCiAJeyBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODU0X0lHLCAiODU0IiwKLQkJJmludGVsX2Zha2VfYWdwX2RyaXZlciwgJmk4eHhfZ3R0X2RyaXZlcn0sCisJCSZpOHh4X2d0dF9kcml2ZXJ9LAogCXsgUENJX0RFVklDRV9JRF9JTlRFTF84Mjg1NUdNX0lHLCAiODU1R00iLAotCQkmaW50ZWxfZmFrZV9hZ3BfZHJpdmVyLCAmaTh4eF9ndHRfZHJpdmVyfSwKKwkJJmk4eHhfZ3R0X2RyaXZlcn0sCiAJeyBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODY1X0lHLCAiODY1IiwKLQkJJmludGVsX2Zha2VfYWdwX2RyaXZlciwgJmk4eHhfZ3R0X2RyaXZlcn0sCisJCSZpOHh4X2d0dF9kcml2ZXJ9LAogCXsgUENJX0RFVklDRV9JRF9JTlRFTF9FNzIyMV9JRywgIkU3MjIxIChpOTE1KSIsCi0JCSZpbnRlbF9mYWtlX2FncF9kcml2ZXIsICZpOTE1X2d0dF9kcml2ZXIgfSwKKwkJJmk5MTVfZ3R0X2RyaXZlciB9LAogCXsgUENJX0RFVklDRV9JRF9JTlRFTF84MjkxNUdfSUcsICI5MTVHIiwKLQkJJmludGVsX2Zha2VfYWdwX2RyaXZlciwgJmk5MTVfZ3R0X2RyaXZlciB9LAorCQkmaTkxNV9ndHRfZHJpdmVyIH0sCiAJeyBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyOTE1R01fSUcsICI5MTVHTSIsCi0JCSZpbnRlbF9mYWtlX2FncF9kcml2ZXIsICZpOTE1X2d0dF9kcml2ZXIgfSwKKwkJJmk5MTVfZ3R0X2RyaXZlciB9LAogCXsgUENJX0RFVklDRV9JRF9JTlRFTF84Mjk0NUdfSUcsICI5NDVHIiwKLQkJJmludGVsX2Zha2VfYWdwX2RyaXZlciwgJmk5MTVfZ3R0X2RyaXZlciB9LAorCQkmaTkxNV9ndHRfZHJpdmVyIH0sCiAJeyBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyOTQ1R01fSUcsICI5NDVHTSIsCi0JCSZpbnRlbF9mYWtlX2FncF9kcml2ZXIsICZpOTE1X2d0dF9kcml2ZXIgfSwKKwkJJmk5MTVfZ3R0X2RyaXZlciB9LAogCXsgUENJX0RFVklDRV9JRF9JTlRFTF84Mjk0NUdNRV9JRywgIjk0NUdNRSIsCi0JCSZpbnRlbF9mYWtlX2FncF9kcml2ZXIsICZpOTE1X2d0dF9kcml2ZXIgfSwKKwkJJmk5MTVfZ3R0X2RyaXZlciB9LAogCXsgUENJX0RFVklDRV9JRF9JTlRFTF84Mjk0NkdaX0lHLCAiOTQ2R1oiLAotCQkmaW50ZWxfZmFrZV9hZ3BfZHJpdmVyLCAmaTk2NV9ndHRfZHJpdmVyIH0sCisJCSZpOTY1X2d0dF9kcml2ZXIgfSwKIAl7IFBDSV9ERVZJQ0VfSURfSU5URUxfODJHMzVfSUcsICJHMzUiLAotCQkmaW50ZWxfZmFrZV9hZ3BfZHJpdmVyLCAmaTk2NV9ndHRfZHJpdmVyIH0sCisJCSZpOTY1X2d0dF9kcml2ZXIgfSwKIAl7IFBDSV9ERVZJQ0VfSURfSU5URUxfODI5NjVRX0lHLCAiOTY1USIsCi0JCSZpbnRlbF9mYWtlX2FncF9kcml2ZXIsICZpOTY1X2d0dF9kcml2ZXIgfSwKKwkJJmk5NjVfZ3R0X2RyaXZlciB9LAogCXsgUENJX0RFVklDRV9JRF9JTlRFTF84Mjk2NUdfSUcsICI5NjVHIiwKLQkJJmludGVsX2Zha2VfYWdwX2RyaXZlciwgJmk5NjVfZ3R0X2RyaXZlciB9LAorCQkmaTk2NV9ndHRfZHJpdmVyIH0sCiAJeyBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyOTY1R01fSUcsICI5NjVHTSIsCi0JCSZpbnRlbF9mYWtlX2FncF9kcml2ZXIsICZpOTY1X2d0dF9kcml2ZXIgfSwKKwkJJmk5NjVfZ3R0X2RyaXZlciB9LAogCXsgUENJX0RFVklDRV9JRF9JTlRFTF84Mjk2NUdNRV9JRywgIjk2NUdNRS9HTEUiLAotCQkmaW50ZWxfZmFrZV9hZ3BfZHJpdmVyLCAmaTk2NV9ndHRfZHJpdmVyIH0sCisJCSZpOTY1X2d0dF9kcml2ZXIgfSwKIAl7IFBDSV9ERVZJQ0VfSURfSU5URUxfRzMzX0lHLCAiRzMzIiwKLQkJJmludGVsX2Zha2VfYWdwX2RyaXZlciwgJmczM19ndHRfZHJpdmVyIH0sCisJCSZnMzNfZ3R0X2RyaXZlciB9LAogCXsgUENJX0RFVklDRV9JRF9JTlRFTF9RMzVfSUcsICJRMzUiLAotCQkmaW50ZWxfZmFrZV9hZ3BfZHJpdmVyLCAmZzMzX2d0dF9kcml2ZXIgfSwKKwkJJmczM19ndHRfZHJpdmVyIH0sCiAJeyBQQ0lfREVWSUNFX0lEX0lOVEVMX1EzM19JRywgIlEzMyIsCi0JCSZpbnRlbF9mYWtlX2FncF9kcml2ZXIsICZnMzNfZ3R0X2RyaXZlciB9LAorCQkmZzMzX2d0dF9kcml2ZXIgfSwKIAl7IFBDSV9ERVZJQ0VfSURfSU5URUxfUElORVZJRVdfTV9JRywgIkdNQTMxNTAiLAotCQkmaW50ZWxfZmFrZV9hZ3BfZHJpdmVyLCAmcGluZXZpZXdfZ3R0X2RyaXZlciB9LAorCQkmcGluZXZpZXdfZ3R0X2RyaXZlciB9LAogCXsgUENJX0RFVklDRV9JRF9JTlRFTF9QSU5FVklFV19JRywgIkdNQTMxNTAiLAotCQkmaW50ZWxfZmFrZV9hZ3BfZHJpdmVyLCAmcGluZXZpZXdfZ3R0X2RyaXZlciB9LAorCQkmcGluZXZpZXdfZ3R0X2RyaXZlciB9LAogCXsgUENJX0RFVklDRV9JRF9JTlRFTF9HTTQ1X0lHLCAiR000NSIsCi0JCSZpbnRlbF9mYWtlX2FncF9kcml2ZXIsICZnNHhfZ3R0X2RyaXZlciB9LAorCQkmZzR4X2d0dF9kcml2ZXIgfSwKIAl7IFBDSV9ERVZJQ0VfSURfSU5URUxfRUFHTEVMQUtFX0lHLCAiRWFnbGVsYWtlIiwKLQkJJmludGVsX2Zha2VfYWdwX2RyaXZlciwgJmc0eF9ndHRfZHJpdmVyIH0sCisJCSZnNHhfZ3R0X2RyaXZlciB9LAogCXsgUENJX0RFVklDRV9JRF9JTlRFTF9RNDVfSUcsICJRNDUvUTQzIiwKLQkJJmludGVsX2Zha2VfYWdwX2RyaXZlciwgJmc0eF9ndHRfZHJpdmVyIH0sCisJCSZnNHhfZ3R0X2RyaXZlciB9LAogCXsgUENJX0RFVklDRV9JRF9JTlRFTF9HNDVfSUcsICJHNDUvRzQzIiwKLQkJJmludGVsX2Zha2VfYWdwX2RyaXZlciwgJmc0eF9ndHRfZHJpdmVyIH0sCisJCSZnNHhfZ3R0X2RyaXZlciB9LAogCXsgUENJX0RFVklDRV9JRF9JTlRFTF9CNDNfSUcsICJCNDMiLAotCQkmaW50ZWxfZmFrZV9hZ3BfZHJpdmVyLCAmZzR4X2d0dF9kcml2ZXIgfSwKKwkJJmc0eF9ndHRfZHJpdmVyIH0sCiAJeyBQQ0lfREVWSUNFX0lEX0lOVEVMX0I0M18xX0lHLCAiQjQzIiwKLQkJJmludGVsX2Zha2VfYWdwX2RyaXZlciwgJmc0eF9ndHRfZHJpdmVyIH0sCisJCSZnNHhfZ3R0X2RyaXZlciB9LAogCXsgUENJX0RFVklDRV9JRF9JTlRFTF9HNDFfSUcsICJHNDEiLAotCQkmaW50ZWxfZmFrZV9hZ3BfZHJpdmVyLCAmZzR4X2d0dF9kcml2ZXIgfSwKKwkJJmc0eF9ndHRfZHJpdmVyIH0sCiAJeyBQQ0lfREVWSUNFX0lEX0lOVEVMX0lST05MQUtFX0RfSUcsCi0JICAgICJIRCBHcmFwaGljcyIsICZpbnRlbF9mYWtlX2FncF9kcml2ZXIsICZpcm9ubGFrZV9ndHRfZHJpdmVyIH0sCisJICAgICJIRCBHcmFwaGljcyIsICZpcm9ubGFrZV9ndHRfZHJpdmVyIH0sCiAJeyBQQ0lfREVWSUNFX0lEX0lOVEVMX0lST05MQUtFX01fSUcsCi0JICAgICJIRCBHcmFwaGljcyIsICZpbnRlbF9mYWtlX2FncF9kcml2ZXIsICZpcm9ubGFrZV9ndHRfZHJpdmVyIH0sCisJICAgICJIRCBHcmFwaGljcyIsICZpcm9ubGFrZV9ndHRfZHJpdmVyIH0sCiAJeyBQQ0lfREVWSUNFX0lEX0lOVEVMX1NBTkRZQlJJREdFX0dUMV9JRywKLQkgICAgIlNhbmR5YnJpZGdlIiwgJmludGVsX2Zha2VfYWdwX2RyaXZlciwgJnNhbmR5YnJpZGdlX2d0dF9kcml2ZXIgfSwKKwkgICAgIlNhbmR5YnJpZGdlIiwgJnNhbmR5YnJpZGdlX2d0dF9kcml2ZXIgfSwKIAl7IFBDSV9ERVZJQ0VfSURfSU5URUxfU0FORFlCUklER0VfR1QyX0lHLAotCSAgICAiU2FuZHlicmlkZ2UiLCAmaW50ZWxfZmFrZV9hZ3BfZHJpdmVyLCAmc2FuZHlicmlkZ2VfZ3R0X2RyaXZlciB9LAorCSAgICAiU2FuZHlicmlkZ2UiLCAmc2FuZHlicmlkZ2VfZ3R0X2RyaXZlciB9LAogCXsgUENJX0RFVklDRV9JRF9JTlRFTF9TQU5EWUJSSURHRV9HVDJfUExVU19JRywKLQkgICAgIlNhbmR5YnJpZGdlIiwgJmludGVsX2Zha2VfYWdwX2RyaXZlciwgJnNhbmR5YnJpZGdlX2d0dF9kcml2ZXIgfSwKKwkgICAgIlNhbmR5YnJpZGdlIiwgJnNhbmR5YnJpZGdlX2d0dF9kcml2ZXIgfSwKIAl7IFBDSV9ERVZJQ0VfSURfSU5URUxfU0FORFlCUklER0VfTV9HVDFfSUcsCi0JICAgICJTYW5keWJyaWRnZSIsICZpbnRlbF9mYWtlX2FncF9kcml2ZXIsICZzYW5keWJyaWRnZV9ndHRfZHJpdmVyIH0sCisJICAgICJTYW5keWJyaWRnZSIsICZzYW5keWJyaWRnZV9ndHRfZHJpdmVyIH0sCiAJeyBQQ0lfREVWSUNFX0lEX0lOVEVMX1NBTkRZQlJJREdFX01fR1QyX0lHLAotCSAgICAiU2FuZHlicmlkZ2UiLCAmaW50ZWxfZmFrZV9hZ3BfZHJpdmVyLCAmc2FuZHlicmlkZ2VfZ3R0X2RyaXZlciB9LAorCSAgICAiU2FuZHlicmlkZ2UiLCAmc2FuZHlicmlkZ2VfZ3R0X2RyaXZlciB9LAogCXsgUENJX0RFVklDRV9JRF9JTlRFTF9TQU5EWUJSSURHRV9NX0dUMl9QTFVTX0lHLAotCSAgICAiU2FuZHlicmlkZ2UiLCAmaW50ZWxfZmFrZV9hZ3BfZHJpdmVyLCAmc2FuZHlicmlkZ2VfZ3R0X2RyaXZlciB9LAorCSAgICAiU2FuZHlicmlkZ2UiLCAmc2FuZHlicmlkZ2VfZ3R0X2RyaXZlciB9LAogCXsgUENJX0RFVklDRV9JRF9JTlRFTF9TQU5EWUJSSURHRV9TX0lHLAotCSAgICAiU2FuZHlicmlkZ2UiLCAmaW50ZWxfZmFrZV9hZ3BfZHJpdmVyLCAmc2FuZHlicmlkZ2VfZ3R0X2RyaXZlciB9LAorCSAgICAiU2FuZHlicmlkZ2UiLCAmc2FuZHlicmlkZ2VfZ3R0X2RyaXZlciB9LAogCXsgMCwgTlVMTCwgTlVMTCB9CiB9OwogCkBAIC0xNTMwLDIxICsxNDUwLDIwIEBACiAJCQkJICAgICAgc3RydWN0IGFncF9icmlkZ2VfZGF0YSAqYnJpZGdlKQogewogCWludCBpLCBtYXNrOwotCWJyaWRnZS0+ZHJpdmVyID0gTlVMTDsKKwlpbnRlbF9wcml2YXRlLmRyaXZlciA9IE5VTEw7CiAKIAlmb3IgKGkgPSAwOyBpbnRlbF9ndHRfY2hpcHNldHNbaV0ubmFtZSAhPSBOVUxMOyBpKyspIHsKIAkJaWYgKGZpbmRfZ21jaChpbnRlbF9ndHRfY2hpcHNldHNbaV0uZ21jaF9jaGlwX2lkKSkgewotCQkJYnJpZGdlLT5kcml2ZXIgPQotCQkJCWludGVsX2d0dF9jaGlwc2V0c1tpXS5nbWNoX2RyaXZlcjsKLQkJCWludGVsX3ByaXZhdGUuZHJpdmVyID0gCisJCQlpbnRlbF9wcml2YXRlLmRyaXZlciA9CiAJCQkJaW50ZWxfZ3R0X2NoaXBzZXRzW2ldLmd0dF9kcml2ZXI7CiAJCQlicmVhazsKIAkJfQogCX0KIAotCWlmICghYnJpZGdlLT5kcml2ZXIpCisJaWYgKCFpbnRlbF9wcml2YXRlLmRyaXZlcikKIAkJcmV0dXJuIDA7CiAKKwlicmlkZ2UtPmRyaXZlciA9ICZpbnRlbF9mYWtlX2FncF9kcml2ZXI7CiAJYnJpZGdlLT5kZXZfcHJpdmF0ZV9kYXRhID0gJmludGVsX3ByaXZhdGU7CiAJYnJpZGdlLT5kZXYgPSBwZGV2OwogCkBAIC0xNTYwLDggKzE0NzksOCBAQAogCQlwY2lfc2V0X2NvbnNpc3RlbnRfZG1hX21hc2soaW50ZWxfcHJpdmF0ZS5wY2lkZXYsCiAJCQkJCSAgICBETUFfQklUX01BU0sobWFzaykpOwogCi0JaWYgKGJyaWRnZS0+ZHJpdmVyID09ICZpbnRlbF84MTBfZHJpdmVyKQotCQlyZXR1cm4gMTsKKwkvKmlmIChicmlkZ2UtPmRyaXZlciA9PSAmaW50ZWxfODEwX2RyaXZlcikKKwkJcmV0dXJuIDE7Ki8KIAogCWlmIChpbnRlbF9ndHRfaW5pdCgpICE9IDApCiAJCXJldHVybiAwOwpAQCAtMTU3MCwxMiArMTQ4OSwxOSBAQAogfQogRVhQT1JUX1NZTUJPTChpbnRlbF9nbWNoX3Byb2JlKTsKIAotc3RydWN0IGludGVsX2d0dCAqaW50ZWxfZ3R0X2dldCh2b2lkKQorY29uc3Qgc3RydWN0IGludGVsX2d0dCAqaW50ZWxfZ3R0X2dldCh2b2lkKQogewogCXJldHVybiAmaW50ZWxfcHJpdmF0ZS5iYXNlOwogfQogRVhQT1JUX1NZTUJPTChpbnRlbF9ndHRfZ2V0KTsKIAordm9pZCBpbnRlbF9ndHRfY2hpcHNldF9mbHVzaCh2b2lkKQoreworCWlmIChpbnRlbF9wcml2YXRlLmRyaXZlci0+Y2hpcHNldF9mbHVzaCkKKwkJaW50ZWxfcHJpdmF0ZS5kcml2ZXItPmNoaXBzZXRfZmx1c2goKTsKK30KK0VYUE9SVF9TWU1CT0woaW50ZWxfZ3R0X2NoaXBzZXRfZmx1c2gpOworCiB2b2lkIGludGVsX2dtY2hfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQogewogCWlmIChpbnRlbF9wcml2YXRlLnBjaWRldikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9odmNfdmlvLmMgYi9kcml2ZXJzL2NoYXIvaHZjX3Zpby5jCmluZGV4IDI3MzcwZTkuLjVlMmY1MmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9odmNfdmlvLmMKKysrIGIvZHJpdmVycy9jaGFyL2h2Y192aW8uYwpAQCAtMzksNyArMzksNyBAQAogCiAjaW5jbHVkZSAiaHZjX2NvbnNvbGUuaCIKIAotY2hhciBodmNfZHJpdmVyX25hbWVbXSA9ICJodmNfY29uc29sZSI7CitzdGF0aWMgY29uc3QgY2hhciBodmNfZHJpdmVyX25hbWVbXSA9ICJodmNfY29uc29sZSI7CiAKIHN0YXRpYyBzdHJ1Y3QgdmlvX2RldmljZV9pZCBodmNfZHJpdmVyX3RhYmxlW10gX19kZXZpbml0ZGF0YSA9IHsKIAl7InNlcmlhbCIsICJodnRlcm0xIn0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvaXBtaS9pcG1pX3NpX2ludGYuYyBiL2RyaXZlcnMvY2hhci9pcG1pL2lwbWlfc2lfaW50Zi5jCmluZGV4IDAzNWRhOWUuLmYyN2MwNGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9pcG1pL2lwbWlfc2lfaW50Zi5jCisrKyBiL2RyaXZlcnMvY2hhci9pcG1pL2lwbWlfc2lfaW50Zi5jCkBAIC02OSw2ICs2OSw4IEBACiAjaWZkZWYgQ09ORklHX1BQQ19PRgogI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L29mX3BsYXRmb3JtLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfYWRkcmVzcy5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2lycS5oPgogI2VuZGlmCiAKICNkZWZpbmUgUEZYICJpcG1pX3NpOiAiCkBAIC0yNTQ2LDcgKzI1NDgsNyBAQAogewogCXN0cnVjdCBzbWlfaW5mbyAqaW5mbzsKIAlzdHJ1Y3QgcmVzb3VyY2UgcmVzb3VyY2U7Ci0JY29uc3QgaW50ICpyZWdzaXplLCAqcmVnc3BhY2luZywgKnJlZ3NoaWZ0OworCWNvbnN0IF9fYmUzMiAqcmVnc2l6ZSwgKnJlZ3NwYWNpbmcsICpyZWdzaGlmdDsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gZGV2LT5kZXYub2Zfbm9kZTsKIAlpbnQgcmV0OwogCWludCBwcm9wbGVuOwpAQCAtMjU5OSw5ICsyNjAxLDkgQEAKIAogCWluZm8tPmlvLmFkZHJfZGF0YQk9IHJlc291cmNlLnN0YXJ0OwogCi0JaW5mby0+aW8ucmVnc2l6ZQk9IHJlZ3NpemUgPyAqcmVnc2l6ZSA6IERFRkFVTFRfUkVHU0laRTsKLQlpbmZvLT5pby5yZWdzcGFjaW5nCT0gcmVnc3BhY2luZyA/ICpyZWdzcGFjaW5nIDogREVGQVVMVF9SRUdTUEFDSU5HOwotCWluZm8tPmlvLnJlZ3NoaWZ0CT0gcmVnc2hpZnQgPyAqcmVnc2hpZnQgOiAwOworCWluZm8tPmlvLnJlZ3NpemUJPSByZWdzaXplID8gYmUzMl90b19jcHVwKHJlZ3NpemUpIDogREVGQVVMVF9SRUdTSVpFOworCWluZm8tPmlvLnJlZ3NwYWNpbmcJPSByZWdzcGFjaW5nID8gYmUzMl90b19jcHVwKHJlZ3NwYWNpbmcpIDogREVGQVVMVF9SRUdTUEFDSU5HOworCWluZm8tPmlvLnJlZ3NoaWZ0CT0gcmVnc2hpZnQgPyBiZTMyX3RvX2NwdXAocmVnc2hpZnQpIDogMDsKIAogCWluZm8tPmlycQkJPSBpcnFfb2ZfcGFyc2VfYW5kX21hcChkZXYtPmRldi5vZl9ub2RlLCAwKTsKIAlpbmZvLT5kZXYJCT0gJmRldi0+ZGV2OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2lwbWkvaXBtaV93YXRjaGRvZy5jIGIvZHJpdmVycy9jaGFyL2lwbWkvaXBtaV93YXRjaGRvZy5jCmluZGV4IGY0ZDMzNGYuLjMyMDY2OGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9pcG1pL2lwbWlfd2F0Y2hkb2cuYworKysgYi9kcml2ZXJzL2NoYXIvaXBtaS9pcG1pX3dhdGNoZG9nLmMKQEAgLTEwODEsNyArMTA4MSw3IEBACiB7CiAJc3RydWN0IGRpZV9hcmdzICphcmdzID0gZGF0YTsKIAotCWlmICh2YWwgIT0gRElFX05NSSkKKwlpZiAodmFsICE9IERJRV9OTUlVTktOT1dOKQogCQlyZXR1cm4gTk9USUZZX09LOwogCiAJLyogSGFjaywgaWYgaXQncyBhIG1lbW9yeSBvciBJL08gZXJyb3IsIGlnbm9yZSBpdC4gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9zbnNjLmggYi9kcml2ZXJzL2NoYXIvc25zYy5oCmluZGV4IDRiZTYyZWQuLmU4YzUyYzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9zbnNjLmgKKysrIGIvZHJpdmVycy9jaGFyL3Nuc2MuaApAQCAtMTksNyArMTksNiBAQAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC93YWl0Lmg+Ci0jaW5jbHVkZSA8bGludXgva29iamVjdC5oPgogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvY2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L3NlbWFwaG9yZS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3RwbS90cG0uYyBiL2RyaXZlcnMvY2hhci90cG0vdHBtLmMKaW5kZXggMGIzYWYzZi4uMWY0NmYxYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3RwbS90cG0uYworKysgYi9kcml2ZXJzL2NoYXIvdHBtL3RwbS5jCkBAIC03MzYsNyArNzM2LDcgQEAKIAlpZiAoY2hpcCA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT0RFVjsKIAlyYyA9IF9fdHBtX3Bjcl9yZWFkKGNoaXAsIHBjcl9pZHgsIHJlc19idWYpOwotCW1vZHVsZV9wdXQoY2hpcC0+ZGV2LT5kcml2ZXItPm93bmVyKTsKKwl0cG1fY2hpcF9wdXQoY2hpcCk7CiAJcmV0dXJuIHJjOwogfQogRVhQT1JUX1NZTUJPTF9HUEwodHBtX3Bjcl9yZWFkKTsKQEAgLTc3NSwxMSArNzc1LDI3IEBACiAJcmMgPSB0cmFuc21pdF9jbWQoY2hpcCwgJmNtZCwgRVhURU5EX1BDUl9SRVNVTFRfU0laRSwKIAkJCSAgImF0dGVtcHRpbmcgZXh0ZW5kIGEgUENSIHZhbHVlIik7CiAKLQltb2R1bGVfcHV0KGNoaXAtPmRldi0+ZHJpdmVyLT5vd25lcik7CisJdHBtX2NoaXBfcHV0KGNoaXApOwogCXJldHVybiByYzsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHRwbV9wY3JfZXh0ZW5kKTsKIAoraW50IHRwbV9zZW5kKHUzMiBjaGlwX251bSwgdm9pZCAqY21kLCBzaXplX3QgYnVmbGVuKQoreworCXN0cnVjdCB0cG1fY2hpcCAqY2hpcDsKKwlpbnQgcmM7CisKKwljaGlwID0gdHBtX2NoaXBfZmluZF9nZXQoY2hpcF9udW0pOworCWlmIChjaGlwID09IE5VTEwpCisJCXJldHVybiAtRU5PREVWOworCisJcmMgPSB0cmFuc21pdF9jbWQoY2hpcCwgY21kLCBidWZsZW4sICJhdHRlbXB0aW5nIHRwbV9jbWQiKTsKKworCXRwbV9jaGlwX3B1dChjaGlwKTsKKwlyZXR1cm4gcmM7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh0cG1fc2VuZCk7CisKIHNzaXplX3QgdHBtX3Nob3dfcGNycyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAogCQkgICAgICBjaGFyICpidWYpCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvdHBtL3RwbS5oIGIvZHJpdmVycy9jaGFyL3RwbS90cG0uaAppbmRleCA3OTI4NjhkLi43MmRkYjAzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvdHBtL3RwbS5oCisrKyBiL2RyaXZlcnMvY2hhci90cG0vdHBtLmgKQEAgLTExMyw2ICsxMTMsMTEgQEAKIAogI2RlZmluZSB0b190cG1fY2hpcChuKSBjb250YWluZXJfb2Yobiwgc3RydWN0IHRwbV9jaGlwLCB2ZW5kb3IpCiAKK3N0YXRpYyBpbmxpbmUgdm9pZCB0cG1fY2hpcF9wdXQoc3RydWN0IHRwbV9jaGlwICpjaGlwKQoreworCW1vZHVsZV9wdXQoY2hpcC0+ZGV2LT5kcml2ZXItPm93bmVyKTsKK30KKwogc3RhdGljIGlubGluZSBpbnQgdHBtX3JlYWRfaW5kZXgoaW50IGJhc2UsIGludCBpbmRleCkKIHsKIAlvdXRiKGluZGV4LCBiYXNlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZG1hL0tjb25maWcgYi9kcml2ZXJzL2RtYS9LY29uZmlnCmluZGV4IDZlZTIzNTkuLmVmMTM4NzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZG1hL0tjb25maWcKKysrIGIvZHJpdmVycy9kbWEvS2NvbmZpZwpAQCAtMTA5LDcgKzEwOSw3IEBACiAKIGNvbmZpZyBNUEM1MTJYX0RNQQogCXRyaXN0YXRlICJGcmVlc2NhbGUgTVBDNTEyeCBidWlsdC1pbiBETUEgZW5naW5lIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBQUENfTVBDNTEyeAorCWRlcGVuZHMgb24gUFBDX01QQzUxMnggfHwgUFBDX01QQzgzMXgKIAlzZWxlY3QgRE1BX0VOR0lORQogCS0tLWhlbHAtLS0KIAkgIEVuYWJsZSBzdXBwb3J0IGZvciB0aGUgRnJlZXNjYWxlIE1QQzUxMnggYnVpbHQtaW4gRE1BIGVuZ2luZS4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZG1hL21wYzUxMnhfZG1hLmMgYi9kcml2ZXJzL2RtYS9tcGM1MTJ4X2RtYS5jCmluZGV4IDRlOWNiZjMuLjU5YzI3MDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZG1hL21wYzUxMnhfZG1hLmMKKysrIGIvZHJpdmVycy9kbWEvbXBjNTEyeF9kbWEuYwpAQCAtMSw2ICsxLDcgQEAKIC8qCiAgKiBDb3B5cmlnaHQgKEMpIEZyZWVzY2FsZSBTZW1pY29uZHV0b3IsIEluYy4gMjAwNywgMjAwOC4KICAqIENvcHlyaWdodCAoQykgU2VtaWhhbGYgMjAwOQorICogQ29weXJpZ2h0IChDKSBJbHlhIFlhbm9rLCBFbWNyYWZ0IFN5c3RlbXMgMjAxMAogICoKICAqIFdyaXR0ZW4gYnkgUGlvdHIgWmllY2lrIDxrb3Ntb0BzZW1paGFsZi5jb20+LiBIYXJkd2FyZSBkZXNjcmlwdGlvbgogICogKGRlZmluZXMsIHN0cnVjdHVyZXMgYW5kIGNvbW1lbnRzKSB3YXMgdGFrZW4gZnJvbSBNUEM1MTIxIERNQSBkcml2ZXIKQEAgLTcwLDYgKzcxLDggQEAKICNkZWZpbmUgTVBDX0RNQV9ETUFFU19TQkUJKDEgPDwgMSkKICNkZWZpbmUgTVBDX0RNQV9ETUFFU19EQkUJKDEgPDwgMCkKIAorI2RlZmluZSBNUENfRE1BX0RNQUdQT1JfU05PT1BfRU5BQkxFCSgxIDw8IDYpCisKICNkZWZpbmUgTVBDX0RNQV9UU0laRV8xCQkweDAwCiAjZGVmaW5lIE1QQ19ETUFfVFNJWkVfMgkJMHgwMQogI2RlZmluZSBNUENfRE1BX1RTSVpFXzQJCTB4MDIKQEAgLTEwNCw3ICsxMDcsMTAgQEAKIAkvKiAweDMwICovCiAJdTMyIGRtYWhyc2g7CQkvKiBETUEgaHcgcmVxdWVzdCBzdGF0dXMgaGlnaChjaDYzfjMyKSAqLwogCXUzMiBkbWFocnNsOwkJLyogRE1BIGhhcmR3YXJlIHJlcXVlc3Qgc3RhdHVzIGxvdyhjaDMxfjApICovCi0JdTMyIGRtYWloc2E7CQkvKiBETUEgaW50ZXJydXB0IGhpZ2ggc2VsZWN0IEFYRShjaDYzfjMyKSAqLworCXVuaW9uIHsKKwkJdTMyIGRtYWloc2E7CS8qIERNQSBpbnRlcnJ1cHQgaGlnaCBzZWxlY3QgQVhFKGNoNjN+MzIpICovCisJCXUzMiBkbWFncG9yOwkvKiAoR2VuZXJhbCBwdXJwb3NlIHJlZ2lzdGVyIG9uIE1QQzgzMDgpICovCisJfTsKIAl1MzIgZG1haWxzYTsJCS8qIERNQSBpbnRlcnJ1cHQgbG93IHNlbGVjdCBBWEUoY2gzMX4wKSAqLwogCS8qIDB4NDAgfiAweGZmICovCiAJdTMyIHJlc2VydmUwWzQ4XTsJLyogUmVzZXJ2ZWQgKi8KQEAgLTE5NSw3ICsyMDEsOSBAQAogCXN0cnVjdCBtcGNfZG1hX3JlZ3MgX19pb21lbQkqcmVnczsKIAlzdHJ1Y3QgbXBjX2RtYV90Y2QgX19pb21lbQkqdGNkOwogCWludAkJCQlpcnE7CisJaW50CQkJCWlycTI7CiAJdWludAkJCQllcnJvcl9zdGF0dXM7CisJaW50CQkJCWlzX21wYzgzMDg7CiAKIAkvKiBMb2NrIGZvciBlcnJvcl9zdGF0dXMgZmllbGQgaW4gdGhpcyBzdHJ1Y3R1cmUgKi8KIAlzcGlubG9ja190CQkJZXJyb3Jfc3RhdHVzX2xvY2s7CkBAIC0yNTIsMTEgKzI2MCwxMyBAQAogCQlwcmV2ID0gbWRlc2M7CiAJfQogCi0JcHJldi0+dGNkLT5zdGFydCA9IDA7CiAJcHJldi0+dGNkLT5pbnRfbWFqID0gMTsKIAogCS8qIFNlbmQgZmlyc3QgZGVzY3JpcHRvciBpbiBjaGFpbiBpbnRvIGhhcmR3YXJlICovCiAJbWVtY3B5X3RvaW8oJm1kbWEtPnRjZFtjaWRdLCBmaXJzdC0+dGNkLCBzaXplb2Yoc3RydWN0IG1wY19kbWFfdGNkKSk7CisKKwlpZiAoZmlyc3QgIT0gcHJldikKKwkJbWRtYS0+dGNkW2NpZF0uZV9zZyA9IDE7CiAJb3V0XzgoJm1kbWEtPnJlZ3MtPmRtYXNzcnQsIGNpZCk7CiB9CiAKQEAgLTI3NCw2ICsyODQsOSBAQAogCiAJCXNwaW5fbG9jaygmbWNoYW4tPmxvY2spOwogCisJCW91dF84KCZtZG1hLT5yZWdzLT5kbWFjaW50LCBjaCArIG9mZik7CisJCW91dF84KCZtZG1hLT5yZWdzLT5kbWFjZXJyLCBjaCArIG9mZik7CisKIAkJLyogQ2hlY2sgZXJyb3Igc3RhdHVzICovCiAJCWlmIChlcyAmICgxIDw8IGNoKSkKIAkJCWxpc3RfZm9yX2VhY2hfZW50cnkobWRlc2MsICZtY2hhbi0+YWN0aXZlLCBub2RlKQpAQCAtMzAyLDM2ICszMTUsNjggQEAKIAlzcGluX3VubG9jaygmbWRtYS0+ZXJyb3Jfc3RhdHVzX2xvY2spOwogCiAJLyogSGFuZGxlIGludGVycnVwdCBvbiBlYWNoIGNoYW5uZWwgKi8KLQltcGNfZG1hX2lycV9wcm9jZXNzKG1kbWEsIGluX2JlMzIoJm1kbWEtPnJlZ3MtPmRtYWludGgpLAorCWlmIChtZG1hLT5kbWEuY2hhbmNudCA+IDMyKSB7CisJCW1wY19kbWFfaXJxX3Byb2Nlc3MobWRtYSwgaW5fYmUzMigmbWRtYS0+cmVncy0+ZG1haW50aCksCiAJCQkJCWluX2JlMzIoJm1kbWEtPnJlZ3MtPmRtYWVycmgpLCAzMik7CisJfQogCW1wY19kbWFfaXJxX3Byb2Nlc3MobWRtYSwgaW5fYmUzMigmbWRtYS0+cmVncy0+ZG1haW50bCksCiAJCQkJCWluX2JlMzIoJm1kbWEtPnJlZ3MtPmRtYWVycmwpLCAwKTsKIAotCS8qIEFjayBpbnRlcnJ1cHQgb24gYWxsIGNoYW5uZWxzICovCi0Jb3V0X2JlMzIoJm1kbWEtPnJlZ3MtPmRtYWludGgsIDB4RkZGRkZGRkYpOwotCW91dF9iZTMyKCZtZG1hLT5yZWdzLT5kbWFpbnRsLCAweEZGRkZGRkZGKTsKLQlvdXRfYmUzMigmbWRtYS0+cmVncy0+ZG1hZXJyaCwgMHhGRkZGRkZGRik7Ci0Jb3V0X2JlMzIoJm1kbWEtPnJlZ3MtPmRtYWVycmwsIDB4RkZGRkZGRkYpOwotCiAJLyogU2NoZWR1bGUgdGFza2xldCAqLwogCXRhc2tsZXRfc2NoZWR1bGUoJm1kbWEtPnRhc2tsZXQpOwogCiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCi0vKiBETUEgVGFza2xldCAqLwotc3RhdGljIHZvaWQgbXBjX2RtYV90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSkKKy8qIHByb2NjZXNzIGNvbXBsZXRlZCBkZXNjcmlwdG9ycyAqLworc3RhdGljIHZvaWQgbXBjX2RtYV9wcm9jZXNzX2NvbXBsZXRlZChzdHJ1Y3QgbXBjX2RtYSAqbWRtYSkKIHsKLQlzdHJ1Y3QgbXBjX2RtYSAqbWRtYSA9ICh2b2lkICopZGF0YTsKIAlkbWFfY29va2llX3QgbGFzdF9jb29raWUgPSAwOwogCXN0cnVjdCBtcGNfZG1hX2NoYW4gKm1jaGFuOwogCXN0cnVjdCBtcGNfZG1hX2Rlc2MgKm1kZXNjOwogCXN0cnVjdCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRvciAqZGVzYzsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCUxJU1RfSEVBRChsaXN0KTsKLQl1aW50IGVzOwogCWludCBpOwogCisJZm9yIChpID0gMDsgaSA8IG1kbWEtPmRtYS5jaGFuY250OyBpKyspIHsKKwkJbWNoYW4gPSAmbWRtYS0+Y2hhbm5lbHNbaV07CisKKwkJLyogR2V0IGFsbCBjb21wbGV0ZWQgZGVzY3JpcHRvcnMgKi8KKwkJc3Bpbl9sb2NrX2lycXNhdmUoJm1jaGFuLT5sb2NrLCBmbGFncyk7CisJCWlmICghbGlzdF9lbXB0eSgmbWNoYW4tPmNvbXBsZXRlZCkpCisJCQlsaXN0X3NwbGljZV90YWlsX2luaXQoJm1jaGFuLT5jb21wbGV0ZWQsICZsaXN0KTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWNoYW4tPmxvY2ssIGZsYWdzKTsKKworCQlpZiAobGlzdF9lbXB0eSgmbGlzdCkpCisJCQljb250aW51ZTsKKworCQkvKiBFeGVjdXRlIGNhbGxiYWNrcyBhbmQgcnVuIGRlcGVuZGVuY2llcyAqLworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KG1kZXNjLCAmbGlzdCwgbm9kZSkgeworCQkJZGVzYyA9ICZtZGVzYy0+ZGVzYzsKKworCQkJaWYgKGRlc2MtPmNhbGxiYWNrKQorCQkJCWRlc2MtPmNhbGxiYWNrKGRlc2MtPmNhbGxiYWNrX3BhcmFtKTsKKworCQkJbGFzdF9jb29raWUgPSBkZXNjLT5jb29raWU7CisJCQlkbWFfcnVuX2RlcGVuZGVuY2llcyhkZXNjKTsKKwkJfQorCisJCS8qIEZyZWUgZGVzY3JpcHRvcnMgKi8KKwkJc3Bpbl9sb2NrX2lycXNhdmUoJm1jaGFuLT5sb2NrLCBmbGFncyk7CisJCWxpc3Rfc3BsaWNlX3RhaWxfaW5pdCgmbGlzdCwgJm1jaGFuLT5mcmVlKTsKKwkJbWNoYW4tPmNvbXBsZXRlZF9jb29raWUgPSBsYXN0X2Nvb2tpZTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWNoYW4tPmxvY2ssIGZsYWdzKTsKKwl9Cit9CisKKy8qIERNQSBUYXNrbGV0ICovCitzdGF0aWMgdm9pZCBtcGNfZG1hX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBtcGNfZG1hICptZG1hID0gKHZvaWQgKilkYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdWludCBlczsKKwogCXNwaW5fbG9ja19pcnFzYXZlKCZtZG1hLT5lcnJvcl9zdGF0dXNfbG9jaywgZmxhZ3MpOwogCWVzID0gbWRtYS0+ZXJyb3Jfc3RhdHVzOwogCW1kbWEtPmVycm9yX3N0YXR1cyA9IDA7CkBAIC0zNzAsMzUgKzQxNSw3IEBACiAJCQlkZXZfZXJyKG1kbWEtPmRtYS5kZXYsICItIERlc3RpbmF0aW9uIEJ1cyBFcnJvclxuIik7CiAJfQogCi0JZm9yIChpID0gMDsgaSA8IG1kbWEtPmRtYS5jaGFuY250OyBpKyspIHsKLQkJbWNoYW4gPSAmbWRtYS0+Y2hhbm5lbHNbaV07Ci0KLQkJLyogR2V0IGFsbCBjb21wbGV0ZWQgZGVzY3JpcHRvcnMgKi8KLQkJc3Bpbl9sb2NrX2lycXNhdmUoJm1jaGFuLT5sb2NrLCBmbGFncyk7Ci0JCWlmICghbGlzdF9lbXB0eSgmbWNoYW4tPmNvbXBsZXRlZCkpCi0JCQlsaXN0X3NwbGljZV90YWlsX2luaXQoJm1jaGFuLT5jb21wbGV0ZWQsICZsaXN0KTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWNoYW4tPmxvY2ssIGZsYWdzKTsKLQotCQlpZiAobGlzdF9lbXB0eSgmbGlzdCkpCi0JCQljb250aW51ZTsKLQotCQkvKiBFeGVjdXRlIGNhbGxiYWNrcyBhbmQgcnVuIGRlcGVuZGVuY2llcyAqLwotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KG1kZXNjLCAmbGlzdCwgbm9kZSkgewotCQkJZGVzYyA9ICZtZGVzYy0+ZGVzYzsKLQotCQkJaWYgKGRlc2MtPmNhbGxiYWNrKQotCQkJCWRlc2MtPmNhbGxiYWNrKGRlc2MtPmNhbGxiYWNrX3BhcmFtKTsKLQotCQkJbGFzdF9jb29raWUgPSBkZXNjLT5jb29raWU7Ci0JCQlkbWFfcnVuX2RlcGVuZGVuY2llcyhkZXNjKTsKLQkJfQotCi0JCS8qIEZyZWUgZGVzY3JpcHRvcnMgKi8KLQkJc3Bpbl9sb2NrX2lycXNhdmUoJm1jaGFuLT5sb2NrLCBmbGFncyk7Ci0JCWxpc3Rfc3BsaWNlX3RhaWxfaW5pdCgmbGlzdCwgJm1jaGFuLT5mcmVlKTsKLQkJbWNoYW4tPmNvbXBsZXRlZF9jb29raWUgPSBsYXN0X2Nvb2tpZTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWNoYW4tPmxvY2ssIGZsYWdzKTsKLQl9CisJbXBjX2RtYV9wcm9jZXNzX2NvbXBsZXRlZChtZG1hKTsKIH0KIAogLyogU3VibWl0IGRlc2NyaXB0b3IgdG8gaGFyZHdhcmUgKi8KQEAgLTU2Myw2ICs1ODAsNyBAQAogbXBjX2RtYV9wcmVwX21lbWNweShzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4sIGRtYV9hZGRyX3QgZHN0LCBkbWFfYWRkcl90IHNyYywKIAkJCQkJc2l6ZV90IGxlbiwgdW5zaWduZWQgbG9uZyBmbGFncykKIHsKKwlzdHJ1Y3QgbXBjX2RtYSAqbWRtYSA9IGRtYV9jaGFuX3RvX21wY19kbWEoY2hhbik7CiAJc3RydWN0IG1wY19kbWFfY2hhbiAqbWNoYW4gPSBkbWFfY2hhbl90b19tcGNfZG1hX2NoYW4oY2hhbik7CiAJc3RydWN0IG1wY19kbWFfZGVzYyAqbWRlc2MgPSBOVUxMOwogCXN0cnVjdCBtcGNfZG1hX3RjZCAqdGNkOwpAQCAtNTc3LDggKzU5NSwxMSBAQAogCX0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtY2hhbi0+bG9jaywgaWZsYWdzKTsKIAotCWlmICghbWRlc2MpCisJaWYgKCFtZGVzYykgeworCQkvKiB0cnkgdG8gZnJlZSBjb21wbGV0ZWQgZGVzY3JpcHRvcnMgKi8KKwkJbXBjX2RtYV9wcm9jZXNzX2NvbXBsZXRlZChtZG1hKTsKIAkJcmV0dXJuIE5VTEw7CisJfQogCiAJbWRlc2MtPmVycm9yID0gMDsKIAl0Y2QgPSBtZGVzYy0+dGNkOwpAQCAtNTkxLDcgKzYxMiw4IEBACiAJCXRjZC0+ZHNpemUgPSBNUENfRE1BX1RTSVpFXzMyOwogCQl0Y2QtPnNvZmYgPSAzMjsKIAkJdGNkLT5kb2ZmID0gMzI7Ci0JfSBlbHNlIGlmIChJU19BTElHTkVEKHNyYyB8IGRzdCB8IGxlbiwgMTYpKSB7CisJfSBlbHNlIGlmICghbWRtYS0+aXNfbXBjODMwOCAmJiBJU19BTElHTkVEKHNyYyB8IGRzdCB8IGxlbiwgMTYpKSB7CisJCS8qIE1QQzgzMDggZG9lc24ndCBzdXBwb3J0IDE2IGJ5dGUgdHJhbnNmZXJzICovCiAJCXRjZC0+c3NpemUgPSBNUENfRE1BX1RTSVpFXzE2OwogCQl0Y2QtPmRzaXplID0gTVBDX0RNQV9UU0laRV8xNjsKIAkJdGNkLT5zb2ZmID0gMTY7CkBAIC02NTEsNiArNjczLDE1IEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAorCWlmIChvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShkbiwgImZzbCxtcGM4MzA4LWRtYSIpKSB7CisJCW1kbWEtPmlzX21wYzgzMDggPSAxOworCQltZG1hLT5pcnEyID0gaXJxX29mX3BhcnNlX2FuZF9tYXAoZG4sIDEpOworCQlpZiAobWRtYS0+aXJxMiA9PSBOT19JUlEpIHsKKwkJCWRldl9lcnIoZGV2LCAiRXJyb3IgbWFwcGluZyBJUlEhXG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfQorCiAJcmV0dmFsID0gb2ZfYWRkcmVzc190b19yZXNvdXJjZShkbiwgMCwgJnJlcyk7CiAJaWYgKHJldHZhbCkgewogCQlkZXZfZXJyKGRldiwgIkVycm9yIHBhcnNpbmcgbWVtb3J5IHJlZ2lvbiFcbiIpOwpAQCAtNjgxLDExICs3MTIsMjMgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCisJaWYgKG1kbWEtPmlzX21wYzgzMDgpIHsKKwkJcmV0dmFsID0gZGV2bV9yZXF1ZXN0X2lycShkZXYsIG1kbWEtPmlycTIsICZtcGNfZG1hX2lycSwgMCwKKwkJCQlEUlZfTkFNRSwgbWRtYSk7CisJCWlmIChyZXR2YWwpIHsKKwkJCWRldl9lcnIoZGV2LCAiRXJyb3IgcmVxdWVzdGluZyBJUlEyIVxuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0KKwogCXNwaW5fbG9ja19pbml0KCZtZG1hLT5lcnJvcl9zdGF0dXNfbG9jayk7CiAKIAlkbWEgPSAmbWRtYS0+ZG1hOwogCWRtYS0+ZGV2ID0gZGV2OwotCWRtYS0+Y2hhbmNudCA9IE1QQ19ETUFfQ0hBTk5FTFM7CisJaWYgKCFtZG1hLT5pc19tcGM4MzA4KQorCQlkbWEtPmNoYW5jbnQgPSBNUENfRE1BX0NIQU5ORUxTOworCWVsc2UKKwkJZG1hLT5jaGFuY250ID0gMTY7IC8qIE1QQzgzMDggRE1BIGhhcyBvbmx5IDE2IGNoYW5uZWxzICovCiAJZG1hLT5kZXZpY2VfYWxsb2NfY2hhbl9yZXNvdXJjZXMgPSBtcGNfZG1hX2FsbG9jX2NoYW5fcmVzb3VyY2VzOwogCWRtYS0+ZGV2aWNlX2ZyZWVfY2hhbl9yZXNvdXJjZXMgPSBtcGNfZG1hX2ZyZWVfY2hhbl9yZXNvdXJjZXM7CiAJZG1hLT5kZXZpY2VfaXNzdWVfcGVuZGluZyA9IG1wY19kbWFfaXNzdWVfcGVuZGluZzsKQEAgLTcyMSwyNiArNzY0LDQwIEBACiAJICogLSBSb3VuZC1yb2JpbiBncm91cCBhcmJpdHJhdGlvbiwKIAkgKiAtIFJvdW5kLXJvYmluIGNoYW5uZWwgYXJiaXRyYXRpb24uCiAJICovCi0Jb3V0X2JlMzIoJm1kbWEtPnJlZ3MtPmRtYWNyLCBNUENfRE1BX0RNQUNSX0VEQ0cgfAotCQkJCU1QQ19ETUFfRE1BQ1JfRVJHQSB8IE1QQ19ETUFfRE1BQ1JfRVJDQSk7CisJaWYgKCFtZG1hLT5pc19tcGM4MzA4KSB7CisJCW91dF9iZTMyKCZtZG1hLT5yZWdzLT5kbWFjciwgTVBDX0RNQV9ETUFDUl9FRENHIHwKKwkJCQkJTVBDX0RNQV9ETUFDUl9FUkdBIHwgTVBDX0RNQV9ETUFDUl9FUkNBKTsKIAotCS8qIERpc2FibGUgaGFyZHdhcmUgRE1BIHJlcXVlc3RzICovCi0Jb3V0X2JlMzIoJm1kbWEtPnJlZ3MtPmRtYWVycWgsIDApOwotCW91dF9iZTMyKCZtZG1hLT5yZWdzLT5kbWFlcnFsLCAwKTsKKwkJLyogRGlzYWJsZSBoYXJkd2FyZSBETUEgcmVxdWVzdHMgKi8KKwkJb3V0X2JlMzIoJm1kbWEtPnJlZ3MtPmRtYWVycWgsIDApOworCQlvdXRfYmUzMigmbWRtYS0+cmVncy0+ZG1hZXJxbCwgMCk7CiAKLQkvKiBEaXNhYmxlIGVycm9yIGludGVycnVwdHMgKi8KLQlvdXRfYmUzMigmbWRtYS0+cmVncy0+ZG1hZWVpaCwgMCk7Ci0Jb3V0X2JlMzIoJm1kbWEtPnJlZ3MtPmRtYWVlaWwsIDApOworCQkvKiBEaXNhYmxlIGVycm9yIGludGVycnVwdHMgKi8KKwkJb3V0X2JlMzIoJm1kbWEtPnJlZ3MtPmRtYWVlaWgsIDApOworCQlvdXRfYmUzMigmbWRtYS0+cmVncy0+ZG1hZWVpbCwgMCk7CiAKLQkvKiBDbGVhciBpbnRlcnJ1cHRzIHN0YXR1cyAqLwotCW91dF9iZTMyKCZtZG1hLT5yZWdzLT5kbWFpbnRoLCAweEZGRkZGRkZGKTsKLQlvdXRfYmUzMigmbWRtYS0+cmVncy0+ZG1haW50bCwgMHhGRkZGRkZGRik7Ci0Jb3V0X2JlMzIoJm1kbWEtPnJlZ3MtPmRtYWVycmgsIDB4RkZGRkZGRkYpOwotCW91dF9iZTMyKCZtZG1hLT5yZWdzLT5kbWFlcnJsLCAweEZGRkZGRkZGKTsKKwkJLyogQ2xlYXIgaW50ZXJydXB0cyBzdGF0dXMgKi8KKwkJb3V0X2JlMzIoJm1kbWEtPnJlZ3MtPmRtYWludGgsIDB4RkZGRkZGRkYpOworCQlvdXRfYmUzMigmbWRtYS0+cmVncy0+ZG1haW50bCwgMHhGRkZGRkZGRik7CisJCW91dF9iZTMyKCZtZG1hLT5yZWdzLT5kbWFlcnJoLCAweEZGRkZGRkZGKTsKKwkJb3V0X2JlMzIoJm1kbWEtPnJlZ3MtPmRtYWVycmwsIDB4RkZGRkZGRkYpOwogCi0JLyogUm91dGUgaW50ZXJydXB0cyB0byBJUElDICovCi0Jb3V0X2JlMzIoJm1kbWEtPnJlZ3MtPmRtYWloc2EsIDApOwotCW91dF9iZTMyKCZtZG1hLT5yZWdzLT5kbWFpbHNhLCAwKTsKKwkJLyogUm91dGUgaW50ZXJydXB0cyB0byBJUElDICovCisJCW91dF9iZTMyKCZtZG1hLT5yZWdzLT5kbWFpaHNhLCAwKTsKKwkJb3V0X2JlMzIoJm1kbWEtPnJlZ3MtPmRtYWlsc2EsIDApOworCX0gZWxzZSB7CisJCS8qIE1QQzgzMDggaGFzIDE2IGNoYW5uZWxzIGFuZCBsYWNrcyBzb21lIHJlZ2lzdGVycyAqLworCQlvdXRfYmUzMigmbWRtYS0+cmVncy0+ZG1hY3IsIE1QQ19ETUFfRE1BQ1JfRVJDQSk7CisKKwkJLyogZW5hYmxlIHNub29waW5nICovCisJCW91dF9iZTMyKCZtZG1hLT5yZWdzLT5kbWFncG9yLCBNUENfRE1BX0RNQUdQT1JfU05PT1BfRU5BQkxFKTsKKwkJLyogRGlzYWJsZSBlcnJvciBpbnRlcnJ1cHRzICovCisJCW91dF9iZTMyKCZtZG1hLT5yZWdzLT5kbWFlZWlsLCAwKTsKKworCQkvKiBDbGVhciBpbnRlcnJ1cHRzIHN0YXR1cyAqLworCQlvdXRfYmUzMigmbWRtYS0+cmVncy0+ZG1haW50bCwgMHhGRkZGKTsKKwkJb3V0X2JlMzIoJm1kbWEtPnJlZ3MtPmRtYWVycmwsIDB4RkZGRik7CisJfQogCiAJLyogUmVnaXN0ZXIgRE1BIGVuZ2luZSAqLwogCWRldl9zZXRfZHJ2ZGF0YShkZXYsIG1kbWEpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9maXJld2lyZS9LY29uZmlnIGIvZHJpdmVycy9maXJld2lyZS9LY29uZmlnCmluZGV4IDQwYTIyMmUuLjY4Zjk0MmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZmlyZXdpcmUvS2NvbmZpZworKysgYi9kcml2ZXJzL2ZpcmV3aXJlL0tjb25maWcKQEAgLTE5LDcgKzE5LDcgQEAKIAogY29uZmlnIEZJUkVXSVJFX09IQ0kKIAl0cmlzdGF0ZSAiT0hDSS0xMzk0IGNvbnRyb2xsZXJzIgotCWRlcGVuZHMgb24gUENJICYmIEZJUkVXSVJFCisJZGVwZW5kcyBvbiBQQ0kgJiYgRklSRVdJUkUgJiYgTU1VCiAJaGVscAogCSAgRW5hYmxlIHRoaXMgZHJpdmVyIGlmIHlvdSBoYXZlIGEgRmlyZVdpcmUgY29udHJvbGxlciBiYXNlZAogCSAgb24gdGhlIE9IQ0kgc3BlY2lmaWNhdGlvbi4gIEZvciBhbGwgcHJhY3RpY2FsIHB1cnBvc2VzLCB0aGlzCmRpZmYgLS1naXQgYS9kcml2ZXJzL2ZpcmV3aXJlL2NvcmUtY2Rldi5jIGIvZHJpdmVycy9maXJld2lyZS9jb3JlLWNkZXYuYwppbmRleCAxNGJiN2I3Li40OGFlNzEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2ZpcmV3aXJlL2NvcmUtY2Rldi5jCisrKyBiL2RyaXZlcnMvZmlyZXdpcmUvY29yZS1jZGV2LmMKQEAgLTE1MDEsOSArMTUwMSwxMCBAQAogCWUtPmNsaWVudAkJPSBjbGllbnQ7CiAJZS0+cC5zcGVlZAkJPSBTQ09ERV8xMDA7CiAJZS0+cC5nZW5lcmF0aW9uCQk9IGEtPmdlbmVyYXRpb247Ci0JZS0+cC5oZWFkZXJbMF0JCT0gYS0+ZGF0YVswXTsKLQllLT5wLmhlYWRlclsxXQkJPSBhLT5kYXRhWzFdOwotCWUtPnAuaGVhZGVyX2xlbmd0aAk9IDg7CisJZS0+cC5oZWFkZXJbMF0JCT0gVENPREVfTElOS19JTlRFUk5BTCA8PCA0OworCWUtPnAuaGVhZGVyWzFdCQk9IGEtPmRhdGFbMF07CisJZS0+cC5oZWFkZXJbMl0JCT0gYS0+ZGF0YVsxXTsKKwllLT5wLmhlYWRlcl9sZW5ndGgJPSAxMjsKIAllLT5wLmNhbGxiYWNrCQk9IG91dGJvdW5kX3BoeV9wYWNrZXRfY2FsbGJhY2s7CiAJZS0+cGh5X3BhY2tldC5jbG9zdXJlCT0gYS0+Y2xvc3VyZTsKIAllLT5waHlfcGFja2V0LnR5cGUJPSBGV19DREVWX0VWRU5UX1BIWV9QQUNLRVRfU0VOVDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZmlyZXdpcmUvY29yZS10cmFuc2FjdGlvbi5jIGIvZHJpdmVycy9maXJld2lyZS9jb3JlLXRyYW5zYWN0aW9uLmMKaW5kZXggYjQyYTBiZC4uZDAwZjhjZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9maXJld2lyZS9jb3JlLXRyYW5zYWN0aW9uLmMKKysrIGIvZHJpdmVycy9maXJld2lyZS9jb3JlLXRyYW5zYWN0aW9uLmMKQEAgLTcyLDYgKzcyLDE1IEBACiAjZGVmaW5lIFBIWV9DT05GSUdfUk9PVF9JRChub2RlX2lkKQkoKCgobm9kZV9pZCkgJiAweDNmKSA8PCAyNCkgfCAoMSA8PCAyMykpCiAjZGVmaW5lIFBIWV9JREVOVElGSUVSKGlkKQkJKChpZCkgPDwgMzApCiAKKy8qIHJldHVybnMgMCBpZiB0aGUgc3BsaXQgdGltZW91dCBoYW5kbGVyIGlzIGFscmVhZHkgcnVubmluZyAqLworc3RhdGljIGludCB0cnlfY2FuY2VsX3NwbGl0X3RpbWVvdXQoc3RydWN0IGZ3X3RyYW5zYWN0aW9uICp0KQoreworCWlmICh0LT5pc19zcGxpdF90cmFuc2FjdGlvbikKKwkJcmV0dXJuIGRlbF90aW1lcigmdC0+c3BsaXRfdGltZW91dF90aW1lcik7CisJZWxzZQorCQlyZXR1cm4gMTsKK30KKwogc3RhdGljIGludCBjbG9zZV90cmFuc2FjdGlvbihzdHJ1Y3QgZndfdHJhbnNhY3Rpb24gKnRyYW5zYWN0aW9uLAogCQkJICAgICBzdHJ1Y3QgZndfY2FyZCAqY2FyZCwgaW50IHJjb2RlKQogewpAQCAtODEsNyArOTAsNyBAQAogCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLCBmbGFncyk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeSh0LCAmY2FyZC0+dHJhbnNhY3Rpb25fbGlzdCwgbGluaykgewogCQlpZiAodCA9PSB0cmFuc2FjdGlvbikgewotCQkJaWYgKCFkZWxfdGltZXIoJnQtPnNwbGl0X3RpbWVvdXRfdGltZXIpKSB7CisJCQlpZiAoIXRyeV9jYW5jZWxfc3BsaXRfdGltZW91dCh0KSkgewogCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKIAkJCQlnb3RvIHRpbWVkX291dDsKIAkJCX0KQEAgLTE0MSwxNiArMTUwLDI4IEBACiAJY2FyZC0+dGxhYmVsX21hc2sgJj0gfigxVUxMIDw8IHQtPnRsYWJlbCk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwogCi0JY2FyZC0+ZHJpdmVyLT5jYW5jZWxfcGFja2V0KGNhcmQsICZ0LT5wYWNrZXQpOwotCi0JLyoKLQkgKiBBdCB0aGlzIHBvaW50IGNhbmNlbF9wYWNrZXQgd2lsbCBuZXZlciBjYWxsIHRoZSB0cmFuc2FjdGlvbgotCSAqIGNhbGxiYWNrLCBzaW5jZSB3ZSBqdXN0IHRvb2sgdGhlIHRyYW5zYWN0aW9uIG91dCBvZiB0aGUgbGlzdC4KLQkgKiBTbyBkbyBpdCBoZXJlLgotCSAqLwogCXQtPmNhbGxiYWNrKGNhcmQsIFJDT0RFX0NBTkNFTExFRCwgTlVMTCwgMCwgdC0+Y2FsbGJhY2tfZGF0YSk7CiB9CiAKK3N0YXRpYyB2b2lkIHN0YXJ0X3NwbGl0X3RyYW5zYWN0aW9uX3RpbWVvdXQoc3RydWN0IGZ3X3RyYW5zYWN0aW9uICp0LAorCQkJCQkgICAgc3RydWN0IGZ3X2NhcmQgKmNhcmQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLCBmbGFncyk7CisKKwlpZiAobGlzdF9lbXB0eSgmdC0+bGluaykgfHwgV0FSTl9PTih0LT5pc19zcGxpdF90cmFuc2FjdGlvbikpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOworCQlyZXR1cm47CisJfQorCisJdC0+aXNfc3BsaXRfdHJhbnNhY3Rpb24gPSB0cnVlOworCW1vZF90aW1lcigmdC0+c3BsaXRfdGltZW91dF90aW1lciwKKwkJICBqaWZmaWVzICsgY2FyZC0+c3BsaXRfdGltZW91dF9qaWZmaWVzKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKK30KKwogc3RhdGljIHZvaWQgdHJhbnNtaXRfY29tcGxldGVfY2FsbGJhY2soc3RydWN0IGZ3X3BhY2tldCAqcGFja2V0LAogCQkJCSAgICAgICBzdHJ1Y3QgZndfY2FyZCAqY2FyZCwgaW50IHN0YXR1cykKIHsKQEAgLTE2Miw3ICsxODMsNyBAQAogCQljbG9zZV90cmFuc2FjdGlvbih0LCBjYXJkLCBSQ09ERV9DT01QTEVURSk7CiAJCWJyZWFrOwogCWNhc2UgQUNLX1BFTkRJTkc6Ci0JCXQtPnRpbWVzdGFtcCA9IHBhY2tldC0+dGltZXN0YW1wOworCQlzdGFydF9zcGxpdF90cmFuc2FjdGlvbl90aW1lb3V0KHQsIGNhcmQpOwogCQlicmVhazsKIAljYXNlIEFDS19CVVNZX1g6CiAJY2FzZSBBQ0tfQlVTWV9BOgpAQCAtMjUwLDcgKzI3MSw3IEBACiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKLQkJV0FSTigxLCAid3JvbmcgdGNvZGUgJWQiLCB0Y29kZSk7CisJCVdBUk4oMSwgIndyb25nIHRjb2RlICVkXG4iLCB0Y29kZSk7CiAJfQogIGNvbW1vbjoKIAlwYWNrZXQtPnNwZWVkID0gc3BlZWQ7CkBAIC0zNDksMTEgKzM3MCw5IEBACiAJdC0+bm9kZV9pZCA9IGRlc3RpbmF0aW9uX2lkOwogCXQtPnRsYWJlbCA9IHRsYWJlbDsKIAl0LT5jYXJkID0gY2FyZDsKKwl0LT5pc19zcGxpdF90cmFuc2FjdGlvbiA9IGZhbHNlOwogCXNldHVwX3RpbWVyKCZ0LT5zcGxpdF90aW1lb3V0X3RpbWVyLAogCQkgICAgc3BsaXRfdHJhbnNhY3Rpb25fdGltZW91dF9jYWxsYmFjaywgKHVuc2lnbmVkIGxvbmcpdCk7Ci0JLyogRklYTUU6IHN0YXJ0IHRoaXMgdGltZXIgbGF0ZXIsIHJlbGF0aXZlIHRvIHQtPnRpbWVzdGFtcCAqLwotCW1vZF90aW1lcigmdC0+c3BsaXRfdGltZW91dF90aW1lciwKLQkJICBqaWZmaWVzICsgY2FyZC0+c3BsaXRfdGltZW91dF9qaWZmaWVzKTsKIAl0LT5jYWxsYmFjayA9IGNhbGxiYWNrOwogCXQtPmNhbGxiYWNrX2RhdGEgPSBjYWxsYmFja19kYXRhOwogCkBAIC00MjMsNyArNDQyLDggQEAKIH0KIAogc3RhdGljIHN0cnVjdCBmd19wYWNrZXQgcGh5X2NvbmZpZ19wYWNrZXQgPSB7Ci0JLmhlYWRlcl9sZW5ndGgJPSA4LAorCS5oZWFkZXJfbGVuZ3RoCT0gMTIsCisJLmhlYWRlclswXQk9IFRDT0RFX0xJTktfSU5URVJOQUwgPDwgNCwKIAkucGF5bG9hZF9sZW5ndGgJPSAwLAogCS5zcGVlZAkJPSBTQ09ERV8xMDAsCiAJLmNhbGxiYWNrCT0gdHJhbnNtaXRfcGh5X3BhY2tldF9jYWxsYmFjaywKQEAgLTQ1MSw4ICs0NzEsOCBAQAogCiAJbXV0ZXhfbG9jaygmcGh5X2NvbmZpZ19tdXRleCk7CiAKLQlwaHlfY29uZmlnX3BhY2tldC5oZWFkZXJbMF0gPSBkYXRhOwotCXBoeV9jb25maWdfcGFja2V0LmhlYWRlclsxXSA9IH5kYXRhOworCXBoeV9jb25maWdfcGFja2V0LmhlYWRlclsxXSA9IGRhdGE7CisJcGh5X2NvbmZpZ19wYWNrZXQuaGVhZGVyWzJdID0gfmRhdGE7CiAJcGh5X2NvbmZpZ19wYWNrZXQuZ2VuZXJhdGlvbiA9IGdlbmVyYXRpb247CiAJSU5JVF9DT01QTEVUSU9OKHBoeV9jb25maWdfZG9uZSk7CiAKQEAgLTYzOCw3ICs2NTgsNyBAQAogCQl9CiAKIAlkZWZhdWx0OgotCQlXQVJOKDEsICJ3cm9uZyB0Y29kZSAlZCIsIHRjb2RlKTsKKwkJV0FSTigxLCAid3JvbmcgdGNvZGUgJWRcbiIsIHRjb2RlKTsKIAkJcmV0dXJuIDA7CiAJfQogfQpAQCAtNjk0LDcgKzcxNCw3IEBACiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKLQkJV0FSTigxLCAid3JvbmcgdGNvZGUgJWQiLCB0Y29kZSk7CisJCVdBUk4oMSwgIndyb25nIHRjb2RlICVkXG4iLCB0Y29kZSk7CiAJfQogCiAJcmVzcG9uc2UtPnBheWxvYWRfbWFwcGVkID0gZmFsc2U7CkBAIC05MjUsNyArOTQ1LDcgQEAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwogCWxpc3RfZm9yX2VhY2hfZW50cnkodCwgJmNhcmQtPnRyYW5zYWN0aW9uX2xpc3QsIGxpbmspIHsKIAkJaWYgKHQtPm5vZGVfaWQgPT0gc291cmNlICYmIHQtPnRsYWJlbCA9PSB0bGFiZWwpIHsKLQkJCWlmICghZGVsX3RpbWVyKCZ0LT5zcGxpdF90aW1lb3V0X3RpbWVyKSkgeworCQkJaWYgKCF0cnlfY2FuY2VsX3NwbGl0X3RpbWVvdXQodCkpIHsKIAkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7CiAJCQkJZ290byB0aW1lZF9vdXQ7CiAJCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2ZpcmV3aXJlL2NvcmUuaCBiL2RyaXZlcnMvZmlyZXdpcmUvY29yZS5oCmluZGV4IGU2MjM5ZjkuLmY4ZGZjZjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZmlyZXdpcmUvY29yZS5oCisrKyBiL2RyaXZlcnMvZmlyZXdpcmUvY29yZS5oCkBAIC0yMTUsOSArMjE1LDExIEBACiAKIC8qIC10cmFuc2FjdGlvbiAqLwogCisjZGVmaW5lIFRDT0RFX0xJTktfSU5URVJOQUwJCTB4ZQorCiAjZGVmaW5lIFRDT0RFX0lTX1JFQURfUkVRVUVTVCh0Y29kZSkJKCgodGNvZGUpICYgfjEpID09IDQpCiAjZGVmaW5lIFRDT0RFX0lTX0JMT0NLX1BBQ0tFVCh0Y29kZSkJKCgodGNvZGUpICYgIDEpICE9IDApCi0jZGVmaW5lIFRDT0RFX0lTX0xJTktfSU5URVJOQUwodGNvZGUpCSgodGNvZGUpID09IDB4ZSkKKyNkZWZpbmUgVENPREVfSVNfTElOS19JTlRFUk5BTCh0Y29kZSkJKCh0Y29kZSkgPT0gVENPREVfTElOS19JTlRFUk5BTCkKICNkZWZpbmUgVENPREVfSVNfUkVRVUVTVCh0Y29kZSkJCSgoKHRjb2RlKSAmICAyKSA9PSAwKQogI2RlZmluZSBUQ09ERV9JU19SRVNQT05TRSh0Y29kZSkJKCgodGNvZGUpICYgIDIpICE9IDApCiAjZGVmaW5lIFRDT0RFX0hBU19SRVFVRVNUX0RBVEEodGNvZGUpCSgoKHRjb2RlKSAmIDEyKSAhPSA0KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9maXJld2lyZS9uZXQuYyBiL2RyaXZlcnMvZmlyZXdpcmUvbmV0LmMKaW5kZXggMWE0NjdhOS4uYzJlMTk0YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9maXJld2lyZS9uZXQuYworKysgYi9kcml2ZXJzL2ZpcmV3aXJlL25ldC5jCkBAIC05LDYgKzksNyBAQAogI2luY2x1ZGUgPGxpbnV4L2J1Zy5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgogI2luY2x1ZGUgPGxpbnV4L2ZpcmV3aXJlLmg+CiAjaW5jbHVkZSA8bGludXgvZmlyZXdpcmUtY29uc3RhbnRzLmg+CiAjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgpAQCAtMTc5LDYgKzE4MCw3IEBACiAJLyogTnVtYmVyIG9mIHR4IGRhdGFncmFtcyB0aGF0IGhhdmUgYmVlbiBxdWV1ZWQgYnV0IG5vdCB5ZXQgYWNrZWQgKi8KIAlpbnQgcXVldWVkX2RhdGFncmFtczsKIAorCWludCBwZWVyX2NvdW50OwogCXN0cnVjdCBsaXN0X2hlYWQgcGVlcl9saXN0OwogCXN0cnVjdCBmd19jYXJkICpjYXJkOwogCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXY7CkBAIC05OTYsMTUgKzk5OCwyMyBAQAogc3RhdGljIHZvaWQgZnduZXRfd3JpdGVfY29tcGxldGUoc3RydWN0IGZ3X2NhcmQgKmNhcmQsIGludCByY29kZSwKIAkJCQkgdm9pZCAqcGF5bG9hZCwgc2l6ZV90IGxlbmd0aCwgdm9pZCAqZGF0YSkKIHsKLQlzdHJ1Y3QgZnduZXRfcGFja2V0X3Rhc2sgKnB0YXNrOwotCi0JcHRhc2sgPSBkYXRhOworCXN0cnVjdCBmd25ldF9wYWNrZXRfdGFzayAqcHRhc2sgPSBkYXRhOworCXN0YXRpYyB1bnNpZ25lZCBsb25nIGo7CisJc3RhdGljIGludCBsYXN0X3Jjb2RlLCBlcnJvcnNfc2tpcHBlZDsKIAogCWlmIChyY29kZSA9PSBSQ09ERV9DT01QTEVURSkgewogCQlmd25ldF90cmFuc21pdF9wYWNrZXRfZG9uZShwdGFzayk7CiAJfSBlbHNlIHsKLQkJZndfZXJyb3IoImZ3bmV0X3dyaXRlX2NvbXBsZXRlOiBmYWlsZWQ6ICV4XG4iLCByY29kZSk7CiAJCWZ3bmV0X3RyYW5zbWl0X3BhY2tldF9mYWlsZWQocHRhc2spOworCisJCWlmIChwcmludGtfdGltZWRfcmF0ZWxpbWl0KCZqLCAgMTAwMCkgfHwgcmNvZGUgIT0gbGFzdF9yY29kZSkgeworCQkJZndfZXJyb3IoImZ3bmV0X3dyaXRlX2NvbXBsZXRlOiAiCisJCQkJImZhaWxlZDogJXggKHNraXBwZWQgJWQpXG4iLCByY29kZSwgZXJyb3JzX3NraXBwZWQpOworCisJCQllcnJvcnNfc2tpcHBlZCA9IDA7CisJCQlsYXN0X3Jjb2RlID0gcmNvZGU7CisJCX0gZWxzZQorCQkJZXJyb3JzX3NraXBwZWQrKzsKIAl9CiB9CiAKQEAgLTEyMTMsNiArMTIyMywxNCBAQAogCXJldHVybiByZXR2YWw7CiB9CiAKK3N0YXRpYyB2b2lkIHNldF9jYXJyaWVyX3N0YXRlKHN0cnVjdCBmd25ldF9kZXZpY2UgKmRldikKK3sKKwlpZiAoZGV2LT5wZWVyX2NvdW50ID4gMSkKKwkJbmV0aWZfY2Fycmllcl9vbihkZXYtPm5ldGRldik7CisJZWxzZQorCQluZXRpZl9jYXJyaWVyX29mZihkZXYtPm5ldGRldik7Cit9CisKIC8qIGlmdXAgKi8KIHN0YXRpYyBpbnQgZnduZXRfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqbmV0KQogewpAQCAtMTIyNiw2ICsxMjQ0LDEwIEBACiAJfQogCW5ldGlmX3N0YXJ0X3F1ZXVlKG5ldCk7CiAKKwlzcGluX2xvY2tfaXJxKCZkZXYtPmxvY2spOworCXNldF9jYXJyaWVyX3N0YXRlKGRldik7CisJc3Bpbl91bmxvY2tfaXJxKCZkZXYtPmxvY2spOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTEzOTcsNiArMTQxOSwxMCBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgY29uc3Qgc3RydWN0IGV0aHRvb2xfb3BzIGZ3bmV0X2V0aHRvb2xfb3BzID0geworCS5nZXRfbGluawk9IGV0aHRvb2xfb3BfZ2V0X2xpbmssCit9OworCiBzdGF0aWMgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzIGZ3bmV0X25ldGRldl9vcHMgPSB7CiAJLm5kb19vcGVuICAgICAgID0gZnduZXRfb3BlbiwKIAkubmRvX3N0b3AJPSBmd25ldF9zdG9wLApAQCAtMTQxNSw2ICsxNDQxLDcgQEAKIAluZXQtPmhhcmRfaGVhZGVyX2xlbgk9IEZXTkVUX0hMRU47CiAJbmV0LT50eXBlCQk9IEFSUEhSRF9JRUVFMTM5NDsKIAluZXQtPnR4X3F1ZXVlX2xlbgk9IEZXTkVUX1RYX1FVRVVFX0xFTjsKKwluZXQtPmV0aHRvb2xfb3BzCT0gJmZ3bmV0X2V0aHRvb2xfb3BzOwogfQogCiAvKiBjYWxsZXIgbXVzdCBob2xkIGZ3bmV0X2RldmljZV9tdXRleCAqLwpAQCAtMTQ1NSw2ICsxNDgyLDggQEAKIAogCXNwaW5fbG9ja19pcnEoJmRldi0+bG9jayk7CiAJbGlzdF9hZGRfdGFpbCgmcGVlci0+cGVlcl9saW5rLCAmZGV2LT5wZWVyX2xpc3QpOworCWRldi0+cGVlcl9jb3VudCsrOworCXNldF9jYXJyaWVyX3N0YXRlKGRldik7CiAJc3Bpbl91bmxvY2tfaXJxKCZkZXYtPmxvY2spOwogCiAJcmV0dXJuIDA7CkBAIC0xNTM1LDEzICsxNTY0LDE1IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHZvaWQgZnduZXRfcmVtb3ZlX3BlZXIoc3RydWN0IGZ3bmV0X3BlZXIgKnBlZXIpCitzdGF0aWMgdm9pZCBmd25ldF9yZW1vdmVfcGVlcihzdHJ1Y3QgZnduZXRfcGVlciAqcGVlciwgc3RydWN0IGZ3bmV0X2RldmljZSAqZGV2KQogewogCXN0cnVjdCBmd25ldF9wYXJ0aWFsX2RhdGFncmFtICpwZCwgKnBkX25leHQ7CiAKLQlzcGluX2xvY2tfaXJxKCZwZWVyLT5kZXYtPmxvY2spOworCXNwaW5fbG9ja19pcnEoJmRldi0+bG9jayk7CiAJbGlzdF9kZWwoJnBlZXItPnBlZXJfbGluayk7Ci0Jc3Bpbl91bmxvY2tfaXJxKCZwZWVyLT5kZXYtPmxvY2spOworCWRldi0+cGVlcl9jb3VudC0tOworCXNldF9jYXJyaWVyX3N0YXRlKGRldik7CisJc3Bpbl91bmxvY2tfaXJxKCZkZXYtPmxvY2spOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHBkLCBwZF9uZXh0LCAmcGVlci0+cGRfbGlzdCwgcGRfbGluaykKIAkJZnduZXRfcGRfZGVsZXRlKHBkKTsKQEAgLTE1NTgsNyArMTU4OSw3IEBACiAKIAltdXRleF9sb2NrKCZmd25ldF9kZXZpY2VfbXV0ZXgpOwogCi0JZnduZXRfcmVtb3ZlX3BlZXIocGVlcik7CisJZnduZXRfcmVtb3ZlX3BlZXIocGVlciwgZGV2KTsKIAogCWlmIChsaXN0X2VtcHR5KCZkZXYtPnBlZXJfbGlzdCkpIHsKIAkJbmV0ID0gZGV2LT5uZXRkZXY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2ZpcmV3aXJlL25vc3kuYyBiL2RyaXZlcnMvZmlyZXdpcmUvbm9zeS5jCmluZGV4IGJmMTg0ZmIuLjA2MTgxNDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZmlyZXdpcmUvbm9zeS5jCisrKyBiL2RyaXZlcnMvZmlyZXdpcmUvbm9zeS5jCkBAIC0zMDIsNyArMzAyLDcgQEAKIAogCWZpbGUtPnByaXZhdGVfZGF0YSA9IGNsaWVudDsKIAotCXJldHVybiAwOworCXJldHVybiBub25zZWVrYWJsZV9vcGVuKGlub2RlLCBmaWxlKTsKIGZhaWw6CiAJa2ZyZWUoY2xpZW50KTsKIAlseW54X3B1dChseW54KTsKQEAgLTQwNSw3ICs0MDUsNiBAQAogCS5wb2xsID0JCQlub3N5X3BvbGwsCiAJLm9wZW4gPQkJCW5vc3lfb3BlbiwKIAkucmVsZWFzZSA9CQlub3N5X3JlbGVhc2UsCi0JLmxsc2VlayA9CQlub29wX2xsc2VlaywKIH07CiAKICNkZWZpbmUgUEhZX1BBQ0tFVF9TSVpFIDEyIC8qIDEgcGF5bG9hZCwgMSBpbnZlcnNlLCAxIGFjayA9IDMgcXVhZGxldHMgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZmlyZXdpcmUvb2hjaS5jIGIvZHJpdmVycy9maXJld2lyZS9vaGNpLmMKaW5kZXggZTNjOGI2MC4uZDc3ZDEyMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9maXJld2lyZS9vaGNpLmMKKysrIGIvZHJpdmVycy9maXJld2lyZS9vaGNpLmMKQEAgLTE4LDYgKzE4LDcgQEAKICAqIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgogI2luY2x1ZGUgPGxpbnV4L2J1Zy5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KQEAgLTQwLDYgKzQxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CiAKICNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KQEAgLTgwLDE3ICs4MiwyMyBAQAogI2RlZmluZSBDT01NQU5EX1BUUihyZWdzKQkoKHJlZ3MpICsgMTIpCiAjZGVmaW5lIENPTlRFWFRfTUFUQ0gocmVncykJKChyZWdzKSArIDE2KQogCi1zdHJ1Y3QgYXJfYnVmZmVyIHsKLQlzdHJ1Y3QgZGVzY3JpcHRvciBkZXNjcmlwdG9yOwotCXN0cnVjdCBhcl9idWZmZXIgKm5leHQ7Ci0JX19sZTMyIGRhdGFbMF07Ci19OworI2RlZmluZSBBUl9CVUZGRVJfU0laRQkoMzIqMTAyNCkKKyNkZWZpbmUgQVJfQlVGRkVSU19NSU4JRElWX1JPVU5EX1VQKEFSX0JVRkZFUl9TSVpFLCBQQUdFX1NJWkUpCisvKiB3ZSBuZWVkIGF0IGxlYXN0IHR3byBwYWdlcyBmb3IgcHJvcGVyIGxpc3QgbWFuYWdlbWVudCAqLworI2RlZmluZSBBUl9CVUZGRVJTCShBUl9CVUZGRVJTX01JTiA+PSAyID8gQVJfQlVGRkVSU19NSU4gOiAyKQorCisjZGVmaW5lIE1BWF9BU1lOQ19QQVlMT0FECTQwOTYKKyNkZWZpbmUgTUFYX0FSX1BBQ0tFVF9TSVpFCSgxNiArIE1BWF9BU1lOQ19QQVlMT0FEICsgNCkKKyNkZWZpbmUgQVJfV1JBUEFST1VORF9QQUdFUwlESVZfUk9VTkRfVVAoTUFYX0FSX1BBQ0tFVF9TSVpFLCBQQUdFX1NJWkUpCiAKIHN0cnVjdCBhcl9jb250ZXh0IHsKIAlzdHJ1Y3QgZndfb2hjaSAqb2hjaTsKLQlzdHJ1Y3QgYXJfYnVmZmVyICpjdXJyZW50X2J1ZmZlcjsKLQlzdHJ1Y3QgYXJfYnVmZmVyICpsYXN0X2J1ZmZlcjsKKwlzdHJ1Y3QgcGFnZSAqcGFnZXNbQVJfQlVGRkVSU107CisJdm9pZCAqYnVmZmVyOworCXN0cnVjdCBkZXNjcmlwdG9yICpkZXNjcmlwdG9yczsKKwlkbWFfYWRkcl90IGRlc2NyaXB0b3JzX2J1czsKIAl2b2lkICpwb2ludGVyOworCXVuc2lnbmVkIGludCBsYXN0X2J1ZmZlcl9pbmRleDsKIAl1MzIgcmVnczsKIAlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgdGFza2xldDsKIH07CkBAIC0xMTcsNiArMTI1LDggQEAKIAlzdHJ1Y3QgZndfb2hjaSAqb2hjaTsKIAl1MzIgcmVnczsKIAlpbnQgdG90YWxfYWxsb2NhdGlvbjsKKwlib29sIHJ1bm5pbmc7CisJYm9vbCBmbHVzaGluZzsKIAogCS8qCiAJICogTGlzdCBvZiBwYWdlLXNpemVkIGJ1ZmZlcnMgZm9yIHN0b3JpbmcgRE1BIGRlc2NyaXB0b3JzLgpAQCAtMTYxLDYgKzE3MSw5IEBACiAJaW50IGV4Y2Vzc19ieXRlczsKIAl2b2lkICpoZWFkZXI7CiAJc2l6ZV90IGhlYWRlcl9sZW5ndGg7CisKKwl1OCBzeW5jOworCXU4IHRhZ3M7CiB9OwogCiAjZGVmaW5lIENPTkZJR19ST01fU0laRSAxMDI0CkBAIC0xNzcsNyArMTkwLDggQEAKIAl1MzIgYnVzX3RpbWU7CiAJYm9vbCBpc19yb290OwogCWJvb2wgY3NyX3N0YXRlX3NldGNsZWFyX2FiZGljYXRlOwotCisJaW50IG5faXI7CisJaW50IG5faXQ7CiAJLyoKIAkgKiBTcGlubG9jayBmb3IgYWNjZXNzaW5nIGZ3X29oY2kgZGF0YS4gIE5ldmVyIGNhbGwgb3V0IG9mCiAJICogdGhpcyBkcml2ZXIgd2l0aCB0aGlzIGxvY2sgaGVsZC4KQEAgLTE4Niw2ICsyMDAsOSBAQAogCiAJc3RydWN0IG11dGV4IHBoeV9yZWdfbXV0ZXg7CiAKKwl2b2lkICptaXNjX2J1ZmZlcjsKKwlkbWFfYWRkcl90IG1pc2NfYnVmZmVyX2J1czsKKwogCXN0cnVjdCBhcl9jb250ZXh0IGFyX3JlcXVlc3RfY3R4OwogCXN0cnVjdCBhcl9jb250ZXh0IGFyX3Jlc3BvbnNlX2N0eDsKIAlzdHJ1Y3QgY29udGV4dCBhdF9yZXF1ZXN0X2N0eDsKQEAgLTQxMSwxMCArNDI4LDYgQEAKIAlbMHhjXSA9ICItcmVzZXJ2ZWQtIiwJCVsweGRdID0gIi1yZXNlcnZlZC0iLAogCVsweGVdID0gImxpbmsgaW50ZXJuYWwiLAlbMHhmXSA9ICItcmVzZXJ2ZWQtIiwKIH07Ci1zdGF0aWMgY29uc3QgY2hhciAqcGh5c1tdID0gewotCVsweDBdID0gInBoeSBjb25maWcgcGFja2V0IiwJWzB4MV0gPSAibGluay1vbiBwYWNrZXQiLAotCVsweDJdID0gInNlbGYtaWQgcGFja2V0IiwJWzB4M10gPSAiLXJlc2VydmVkLSIsCi19OwogCiBzdGF0aWMgdm9pZCBsb2dfYXJfYXRfZXZlbnQoY2hhciBkaXIsIGludCBzcGVlZCwgdTMyICpoZWFkZXIsIGludCBldnQpCiB7CkBAIC00MzMsMTIgKzQ0Niw2IEBACiAJCXJldHVybjsKIAl9CiAKLQlpZiAoaGVhZGVyWzBdID09IH5oZWFkZXJbMV0pIHsKLQkJZndfbm90aWZ5KCJBJWMgJXMsICVzLCAlMDh4XG4iLAotCQkgICAgZGlyLCBldnRzW2V2dF0sIHBoeXNbaGVhZGVyWzBdID4+IDMwICYgMHgzXSwgaGVhZGVyWzBdKTsKLQkJcmV0dXJuOwotCX0KLQogCXN3aXRjaCAodGNvZGUpIHsKIAljYXNlIDB4MDogY2FzZSAweDY6IGNhc2UgMHg4OgogCQlzbnByaW50ZihzcGVjaWZpYywgc2l6ZW9mKHNwZWNpZmljKSwgIiA9ICUwOHgiLApAQCAtNDUzLDkgKzQ2MCwxMyBAQAogCX0KIAogCXN3aXRjaCAodGNvZGUpIHsKLQljYXNlIDB4ZTogY2FzZSAweGE6CisJY2FzZSAweGE6CiAJCWZ3X25vdGlmeSgiQSVjICVzLCAlc1xuIiwgZGlyLCBldnRzW2V2dF0sIHRjb2Rlc1t0Y29kZV0pOwogCQlicmVhazsKKwljYXNlIDB4ZToKKwkJZndfbm90aWZ5KCJBJWMgJXMsIFBIWSAlMDh4ICUwOHhcbiIsCisJCQkgIGRpciwgZXZ0c1tldnRdLCBoZWFkZXJbMV0sIGhlYWRlclsyXSk7CisJCWJyZWFrOwogCWNhc2UgMHgwOiBjYXNlIDB4MTogY2FzZSAweDQ6IGNhc2UgMHg1OiBjYXNlIDB4OToKIAkJZndfbm90aWZ5KCJBJWMgc3BkICV4IHRsICUwMngsICIKIAkJICAgICIlMDR4IC0+ICUwNHgsICVzLCAiCkBAIC01OTQsNTkgKzYwNSwxNTAgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgdm9pZCBhcl9jb250ZXh0X2xpbmtfcGFnZShzdHJ1Y3QgYXJfY29udGV4dCAqY3R4LAotCQkJCSBzdHJ1Y3QgYXJfYnVmZmVyICphYiwgZG1hX2FkZHJfdCBhYl9idXMpCitzdGF0aWMgaW5saW5lIGRtYV9hZGRyX3QgYXJfYnVmZmVyX2J1cyhzdHJ1Y3QgYXJfY29udGV4dCAqY3R4LCB1bnNpZ25lZCBpbnQgaSkKIHsKLQlzaXplX3Qgb2Zmc2V0OworCXJldHVybiBwYWdlX3ByaXZhdGUoY3R4LT5wYWdlc1tpXSk7Cit9CiAKLQlhYi0+bmV4dCA9IE5VTEw7Ci0JbWVtc2V0KCZhYi0+ZGVzY3JpcHRvciwgMCwgc2l6ZW9mKGFiLT5kZXNjcmlwdG9yKSk7Ci0JYWItPmRlc2NyaXB0b3IuY29udHJvbCAgICAgICAgPSBjcHVfdG9fbGUxNihERVNDUklQVE9SX0lOUFVUX01PUkUgfAotCQkJCQkJICAgIERFU0NSSVBUT1JfU1RBVFVTIHwKLQkJCQkJCSAgICBERVNDUklQVE9SX0JSQU5DSF9BTFdBWVMpOwotCW9mZnNldCA9IG9mZnNldG9mKHN0cnVjdCBhcl9idWZmZXIsIGRhdGEpOwotCWFiLT5kZXNjcmlwdG9yLnJlcV9jb3VudCAgICAgID0gY3B1X3RvX2xlMTYoUEFHRV9TSVpFIC0gb2Zmc2V0KTsKLQlhYi0+ZGVzY3JpcHRvci5kYXRhX2FkZHJlc3MgICA9IGNwdV90b19sZTMyKGFiX2J1cyArIG9mZnNldCk7Ci0JYWItPmRlc2NyaXB0b3IucmVzX2NvdW50ICAgICAgPSBjcHVfdG9fbGUxNihQQUdFX1NJWkUgLSBvZmZzZXQpOwotCWFiLT5kZXNjcmlwdG9yLmJyYW5jaF9hZGRyZXNzID0gMDsKK3N0YXRpYyB2b2lkIGFyX2NvbnRleHRfbGlua19wYWdlKHN0cnVjdCBhcl9jb250ZXh0ICpjdHgsIHVuc2lnbmVkIGludCBpbmRleCkKK3sKKwlzdHJ1Y3QgZGVzY3JpcHRvciAqZDsKKworCWQgPSAmY3R4LT5kZXNjcmlwdG9yc1tpbmRleF07CisJZC0+YnJhbmNoX2FkZHJlc3MgICY9IGNwdV90b19sZTMyKH4weGYpOworCWQtPnJlc19jb3VudCAgICAgICA9ICBjcHVfdG9fbGUxNihQQUdFX1NJWkUpOworCWQtPnRyYW5zZmVyX3N0YXR1cyA9ICAwOwogCiAJd21iKCk7IC8qIGZpbmlzaCBpbml0IG9mIG5ldyBkZXNjcmlwdG9ycyBiZWZvcmUgYnJhbmNoX2FkZHJlc3MgdXBkYXRlICovCi0JY3R4LT5sYXN0X2J1ZmZlci0+ZGVzY3JpcHRvci5icmFuY2hfYWRkcmVzcyA9IGNwdV90b19sZTMyKGFiX2J1cyB8IDEpOwotCWN0eC0+bGFzdF9idWZmZXItPm5leHQgPSBhYjsKLQljdHgtPmxhc3RfYnVmZmVyID0gYWI7CisJZCA9ICZjdHgtPmRlc2NyaXB0b3JzW2N0eC0+bGFzdF9idWZmZXJfaW5kZXhdOworCWQtPmJyYW5jaF9hZGRyZXNzICB8PSBjcHVfdG9fbGUzMigxKTsKKworCWN0eC0+bGFzdF9idWZmZXJfaW5kZXggPSBpbmRleDsKIAogCXJlZ193cml0ZShjdHgtPm9oY2ksIENPTlRST0xfU0VUKGN0eC0+cmVncyksIENPTlRFWFRfV0FLRSk7CiAJZmx1c2hfd3JpdGVzKGN0eC0+b2hjaSk7CiB9CiAKLXN0YXRpYyBpbnQgYXJfY29udGV4dF9hZGRfcGFnZShzdHJ1Y3QgYXJfY29udGV4dCAqY3R4KQotewotCXN0cnVjdCBkZXZpY2UgKmRldiA9IGN0eC0+b2hjaS0+Y2FyZC5kZXZpY2U7Ci0Jc3RydWN0IGFyX2J1ZmZlciAqYWI7Ci0JZG1hX2FkZHJfdCB1bmluaXRpYWxpemVkX3ZhcihhYl9idXMpOwotCi0JYWIgPSBkbWFfYWxsb2NfY29oZXJlbnQoZGV2LCBQQUdFX1NJWkUsICZhYl9idXMsIEdGUF9BVE9NSUMpOwotCWlmIChhYiA9PSBOVUxMKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWFyX2NvbnRleHRfbGlua19wYWdlKGN0eCwgYWIsIGFiX2J1cyk7Ci0KLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIHZvaWQgYXJfY29udGV4dF9yZWxlYXNlKHN0cnVjdCBhcl9jb250ZXh0ICpjdHgpCiB7Ci0Jc3RydWN0IGFyX2J1ZmZlciAqYWIsICphYl9uZXh0OwotCXNpemVfdCBvZmZzZXQ7Ci0JZG1hX2FkZHJfdCBhYl9idXM7CisJdW5zaWduZWQgaW50IGk7CiAKLQlmb3IgKGFiID0gY3R4LT5jdXJyZW50X2J1ZmZlcjsgYWI7IGFiID0gYWJfbmV4dCkgewotCQlhYl9uZXh0ID0gYWItPm5leHQ7Ci0JCW9mZnNldCA9IG9mZnNldG9mKHN0cnVjdCBhcl9idWZmZXIsIGRhdGEpOwotCQlhYl9idXMgPSBsZTMyX3RvX2NwdShhYi0+ZGVzY3JpcHRvci5kYXRhX2FkZHJlc3MpIC0gb2Zmc2V0OwotCQlkbWFfZnJlZV9jb2hlcmVudChjdHgtPm9oY2ktPmNhcmQuZGV2aWNlLCBQQUdFX1NJWkUsCi0JCQkJICBhYiwgYWJfYnVzKTsKKwlpZiAoY3R4LT5idWZmZXIpCisJCXZtX3VubWFwX3JhbShjdHgtPmJ1ZmZlciwgQVJfQlVGRkVSUyArIEFSX1dSQVBBUk9VTkRfUEFHRVMpOworCisJZm9yIChpID0gMDsgaSA8IEFSX0JVRkZFUlM7IGkrKykKKwkJaWYgKGN0eC0+cGFnZXNbaV0pIHsKKwkJCWRtYV91bm1hcF9wYWdlKGN0eC0+b2hjaS0+Y2FyZC5kZXZpY2UsCisJCQkJICAgICAgIGFyX2J1ZmZlcl9idXMoY3R4LCBpKSwKKwkJCQkgICAgICAgUEFHRV9TSVpFLCBETUFfRlJPTV9ERVZJQ0UpOworCQkJX19mcmVlX3BhZ2UoY3R4LT5wYWdlc1tpXSk7CisJCX0KK30KKworc3RhdGljIHZvaWQgYXJfY29udGV4dF9hYm9ydChzdHJ1Y3QgYXJfY29udGV4dCAqY3R4LCBjb25zdCBjaGFyICplcnJvcl9tc2cpCit7CisJaWYgKHJlZ19yZWFkKGN0eC0+b2hjaSwgQ09OVFJPTF9DTEVBUihjdHgtPnJlZ3MpKSAmIENPTlRFWFRfUlVOKSB7CisJCXJlZ193cml0ZShjdHgtPm9oY2ksIENPTlRST0xfQ0xFQVIoY3R4LT5yZWdzKSwgQ09OVEVYVF9SVU4pOworCQlmbHVzaF93cml0ZXMoY3R4LT5vaGNpKTsKKworCQlmd19lcnJvcigiQVIgZXJyb3I6ICVzOyBETUEgc3RvcHBlZFxuIiwgZXJyb3JfbXNnKTsKIAl9CisJLyogRklYTUU6IHJlc3RhcnQ/ICovCit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGFyX25leHRfYnVmZmVyX2luZGV4KHVuc2lnbmVkIGludCBpbmRleCkKK3sKKwlyZXR1cm4gKGluZGV4ICsgMSkgJSBBUl9CVUZGRVJTOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBhcl9wcmV2X2J1ZmZlcl9pbmRleCh1bnNpZ25lZCBpbnQgaW5kZXgpCit7CisJcmV0dXJuIChpbmRleCAtIDEgKyBBUl9CVUZGRVJTKSAlIEFSX0JVRkZFUlM7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGFyX2ZpcnN0X2J1ZmZlcl9pbmRleChzdHJ1Y3QgYXJfY29udGV4dCAqY3R4KQoreworCXJldHVybiBhcl9uZXh0X2J1ZmZlcl9pbmRleChjdHgtPmxhc3RfYnVmZmVyX2luZGV4KTsKK30KKworLyoKKyAqIFdlIHNlYXJjaCBmb3IgdGhlIGJ1ZmZlciB0aGF0IGNvbnRhaW5zIHRoZSBsYXN0IEFSIHBhY2tldCBETUEgZGF0YSB3cml0dGVuCisgKiBieSB0aGUgY29udHJvbGxlci4KKyAqLworc3RhdGljIHVuc2lnbmVkIGludCBhcl9zZWFyY2hfbGFzdF9hY3RpdmVfYnVmZmVyKHN0cnVjdCBhcl9jb250ZXh0ICpjdHgsCisJCQkJCQkgdW5zaWduZWQgaW50ICpidWZmZXJfb2Zmc2V0KQoreworCXVuc2lnbmVkIGludCBpLCBuZXh0X2ksIGxhc3QgPSBjdHgtPmxhc3RfYnVmZmVyX2luZGV4OworCV9fbGUxNiByZXNfY291bnQsIG5leHRfcmVzX2NvdW50OworCisJaSA9IGFyX2ZpcnN0X2J1ZmZlcl9pbmRleChjdHgpOworCXJlc19jb3VudCA9IEFDQ0VTU19PTkNFKGN0eC0+ZGVzY3JpcHRvcnNbaV0ucmVzX2NvdW50KTsKKworCS8qIEEgYnVmZmVyIHRoYXQgaXMgbm90IHlldCBjb21wbGV0ZWx5IGZpbGxlZCBtdXN0IGJlIHRoZSBsYXN0IG9uZS4gKi8KKwl3aGlsZSAoaSAhPSBsYXN0ICYmIHJlc19jb3VudCA9PSAwKSB7CisKKwkJLyogUGVlayBhdCB0aGUgbmV4dCBkZXNjcmlwdG9yLiAqLworCQluZXh0X2kgPSBhcl9uZXh0X2J1ZmZlcl9pbmRleChpKTsKKwkJcm1iKCk7IC8qIHJlYWQgZGVzY3JpcHRvcnMgaW4gb3JkZXIgKi8KKwkJbmV4dF9yZXNfY291bnQgPSBBQ0NFU1NfT05DRSgKKwkJCQljdHgtPmRlc2NyaXB0b3JzW25leHRfaV0ucmVzX2NvdW50KTsKKwkJLyoKKwkJICogSWYgdGhlIG5leHQgZGVzY3JpcHRvciBpcyBzdGlsbCBlbXB0eSwgd2UgbXVzdCBzdG9wIGF0IHRoaXMKKwkJICogZGVzY3JpcHRvci4KKwkJICovCisJCWlmIChuZXh0X3Jlc19jb3VudCA9PSBjcHVfdG9fbGUxNihQQUdFX1NJWkUpKSB7CisJCQkvKgorCQkJICogVGhlIGV4Y2VwdGlvbiBpcyB3aGVuIHRoZSBETUEgZGF0YSBmb3Igb25lIHBhY2tldCBpcworCQkJICogc3BsaXQgb3ZlciB0aHJlZSBidWZmZXJzOyBpbiB0aGlzIGNhc2UsIHRoZSBtaWRkbGUKKwkJCSAqIGJ1ZmZlcidzIGRlc2NyaXB0b3IgbWlnaHQgYmUgbmV2ZXIgdXBkYXRlZCBieSB0aGUKKwkJCSAqIGNvbnRyb2xsZXIgYW5kIGxvb2sgc3RpbGwgZW1wdHksIGFuZCB3ZSBoYXZlIHRvIHBlZWsKKwkJCSAqIGF0IHRoZSB0aGlyZCBvbmUuCisJCQkgKi8KKwkJCWlmIChNQVhfQVJfUEFDS0VUX1NJWkUgPiBQQUdFX1NJWkUgJiYgaSAhPSBsYXN0KSB7CisJCQkJbmV4dF9pID0gYXJfbmV4dF9idWZmZXJfaW5kZXgobmV4dF9pKTsKKwkJCQlybWIoKTsKKwkJCQluZXh0X3Jlc19jb3VudCA9IEFDQ0VTU19PTkNFKAorCQkJCQljdHgtPmRlc2NyaXB0b3JzW25leHRfaV0ucmVzX2NvdW50KTsKKwkJCQlpZiAobmV4dF9yZXNfY291bnQgIT0gY3B1X3RvX2xlMTYoUEFHRV9TSVpFKSkKKwkJCQkJZ290byBuZXh0X2J1ZmZlcl9pc19hY3RpdmU7CisJCQl9CisKKwkJCWJyZWFrOworCQl9CisKK25leHRfYnVmZmVyX2lzX2FjdGl2ZToKKwkJaSA9IG5leHRfaTsKKwkJcmVzX2NvdW50ID0gbmV4dF9yZXNfY291bnQ7CisJfQorCisJcm1iKCk7IC8qIHJlYWQgcmVzX2NvdW50IGJlZm9yZSB0aGUgRE1BIGRhdGEgKi8KKworCSpidWZmZXJfb2Zmc2V0ID0gUEFHRV9TSVpFIC0gbGUxNl90b19jcHUocmVzX2NvdW50KTsKKwlpZiAoKmJ1ZmZlcl9vZmZzZXQgPiBQQUdFX1NJWkUpIHsKKwkJKmJ1ZmZlcl9vZmZzZXQgPSAwOworCQlhcl9jb250ZXh0X2Fib3J0KGN0eCwgImNvcnJ1cHRlZCBkZXNjcmlwdG9yIik7CisJfQorCisJcmV0dXJuIGk7Cit9CisKK3N0YXRpYyB2b2lkIGFyX3N5bmNfYnVmZmVyc19mb3JfY3B1KHN0cnVjdCBhcl9jb250ZXh0ICpjdHgsCisJCQkJICAgIHVuc2lnbmVkIGludCBlbmRfYnVmZmVyX2luZGV4LAorCQkJCSAgICB1bnNpZ25lZCBpbnQgZW5kX2J1ZmZlcl9vZmZzZXQpCit7CisJdW5zaWduZWQgaW50IGk7CisKKwlpID0gYXJfZmlyc3RfYnVmZmVyX2luZGV4KGN0eCk7CisJd2hpbGUgKGkgIT0gZW5kX2J1ZmZlcl9pbmRleCkgeworCQlkbWFfc3luY19zaW5nbGVfZm9yX2NwdShjdHgtPm9oY2ktPmNhcmQuZGV2aWNlLAorCQkJCQlhcl9idWZmZXJfYnVzKGN0eCwgaSksCisJCQkJCVBBR0VfU0laRSwgRE1BX0ZST01fREVWSUNFKTsKKwkJaSA9IGFyX25leHRfYnVmZmVyX2luZGV4KGkpOworCX0KKwlpZiAoZW5kX2J1ZmZlcl9vZmZzZXQgPiAwKQorCQlkbWFfc3luY19zaW5nbGVfZm9yX2NwdShjdHgtPm9oY2ktPmNhcmQuZGV2aWNlLAorCQkJCQlhcl9idWZmZXJfYnVzKGN0eCwgaSksCisJCQkJCWVuZF9idWZmZXJfb2Zmc2V0LCBETUFfRlJPTV9ERVZJQ0UpOwogfQogCiAjaWYgZGVmaW5lZChDT05GSUdfUFBDX1BNQUMpICYmIGRlZmluZWQoQ09ORklHX1BQQzMyKQpAQCAtNjg5LDYgKzc5MSwxMCBAQAogCQlwLmhlYWRlclszXSA9IGNvbmRfbGUzMl90b19jcHUoYnVmZmVyWzNdKTsKIAkJcC5oZWFkZXJfbGVuZ3RoID0gMTY7CiAJCXAucGF5bG9hZF9sZW5ndGggPSBwLmhlYWRlclszXSA+PiAxNjsKKwkJaWYgKHAucGF5bG9hZF9sZW5ndGggPiBNQVhfQVNZTkNfUEFZTE9BRCkgeworCQkJYXJfY29udGV4dF9hYm9ydChjdHgsICJpbnZhbGlkIHBhY2tldCBsZW5ndGgiKTsKKwkJCXJldHVybiBOVUxMOworCQl9CiAJCWJyZWFrOwogCiAJY2FzZSBUQ09ERV9XUklURV9SRVNQT05TRToKQEAgLTY5OSw5ICs4MDUsOCBAQAogCQlicmVhazsKIAogCWRlZmF1bHQ6Ci0JCS8qIEZJWE1FOiBTdG9wIGNvbnRleHQsIGRpc2NhcmQgZXZlcnl0aGluZywgYW5kIHJlc3RhcnQ/ICovCi0JCXAuaGVhZGVyX2xlbmd0aCA9IDA7Ci0JCXAucGF5bG9hZF9sZW5ndGggPSAwOworCQlhcl9jb250ZXh0X2Fib3J0KGN0eCwgImludmFsaWQgdGNvZGUiKTsKKwkJcmV0dXJuIE5VTEw7CiAJfQogCiAJcC5wYXlsb2FkID0gKHZvaWQgKikgYnVmZmVyICsgcC5oZWFkZXJfbGVuZ3RoOwpAQCAtNzUxLDEyMSArODU2LDE0NyBAQAogCXJldHVybiBidWZmZXIgKyBsZW5ndGggKyAxOwogfQogCi1zdGF0aWMgdm9pZCBhcl9jb250ZXh0X3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKQorc3RhdGljIHZvaWQgKmhhbmRsZV9hcl9wYWNrZXRzKHN0cnVjdCBhcl9jb250ZXh0ICpjdHgsIHZvaWQgKnAsIHZvaWQgKmVuZCkKIHsKLQlzdHJ1Y3QgYXJfY29udGV4dCAqY3R4ID0gKHN0cnVjdCBhcl9jb250ZXh0ICopZGF0YTsKLQlzdHJ1Y3QgYXJfYnVmZmVyICphYjsKLQlzdHJ1Y3QgZGVzY3JpcHRvciAqZDsKLQl2b2lkICpidWZmZXIsICplbmQ7Ci0JX19sZTE2IHJlc19jb3VudDsKKwl2b2lkICpuZXh0OwogCi0JYWIgPSBjdHgtPmN1cnJlbnRfYnVmZmVyOwotCWQgPSAmYWItPmRlc2NyaXB0b3I7CisJd2hpbGUgKHAgPCBlbmQpIHsKKwkJbmV4dCA9IGhhbmRsZV9hcl9wYWNrZXQoY3R4LCBwKTsKKwkJaWYgKCFuZXh0KQorCQkJcmV0dXJuIHA7CisJCXAgPSBuZXh0OworCX0KIAotCXJlc19jb3VudCA9IEFDQ0VTU19PTkNFKGQtPnJlc19jb3VudCk7Ci0JaWYgKHJlc19jb3VudCA9PSAwKSB7Ci0JCXNpemVfdCBzaXplLCBzaXplMiwgcmVzdCwgcGt0c2l6ZSwgc2l6ZTMsIG9mZnNldDsKLQkJZG1hX2FkZHJfdCBzdGFydF9idXM7Ci0JCXZvaWQgKnN0YXJ0OworCXJldHVybiBwOworfQogCi0JCS8qCi0JCSAqIFRoaXMgZGVzY3JpcHRvciBpcyBmaW5pc2hlZCBhbmQgd2UgbWF5IGhhdmUgYQotCQkgKiBwYWNrZXQgc3BsaXQgYWNyb3NzIHRoaXMgYW5kIHRoZSBuZXh0IGJ1ZmZlci4gV2UKLQkJICogcmV1c2UgdGhlIHBhZ2UgZm9yIHJlYXNzZW1ibGluZyB0aGUgc3BsaXQgcGFja2V0LgotCQkgKi8KK3N0YXRpYyB2b2lkIGFyX3JlY3ljbGVfYnVmZmVycyhzdHJ1Y3QgYXJfY29udGV4dCAqY3R4LCB1bnNpZ25lZCBpbnQgZW5kX2J1ZmZlcikKK3sKKwl1bnNpZ25lZCBpbnQgaTsKIAotCQlvZmZzZXQgPSBvZmZzZXRvZihzdHJ1Y3QgYXJfYnVmZmVyLCBkYXRhKTsKLQkJc3RhcnQgPSBhYjsKLQkJc3RhcnRfYnVzID0gbGUzMl90b19jcHUoYWItPmRlc2NyaXB0b3IuZGF0YV9hZGRyZXNzKSAtIG9mZnNldDsKLQkJYnVmZmVyID0gYWItPmRhdGE7Ci0KLQkJYWIgPSBhYi0+bmV4dDsKLQkJZCA9ICZhYi0+ZGVzY3JpcHRvcjsKLQkJc2l6ZSA9IHN0YXJ0ICsgUEFHRV9TSVpFIC0gY3R4LT5wb2ludGVyOwotCQkvKiB2YWxpZCBidWZmZXIgZGF0YSBpbiB0aGUgbmV4dCBwYWdlICovCi0JCXJlc3QgPSBsZTE2X3RvX2NwdShkLT5yZXFfY291bnQpIC0gbGUxNl90b19jcHUoZC0+cmVzX2NvdW50KTsKLQkJLyogd2hhdCBhY3R1YWxseSBmaXRzIGluIHRoaXMgcGFnZSAqLwotCQlzaXplMiA9IG1pbihyZXN0LCAoc2l6ZV90KVBBR0VfU0laRSAtIG9mZnNldCAtIHNpemUpOwotCQltZW1tb3ZlKGJ1ZmZlciwgY3R4LT5wb2ludGVyLCBzaXplKTsKLQkJbWVtY3B5KGJ1ZmZlciArIHNpemUsIGFiLT5kYXRhLCBzaXplMik7Ci0KLQkJd2hpbGUgKHNpemUgPiAwKSB7Ci0JCQl2b2lkICpuZXh0ID0gaGFuZGxlX2FyX3BhY2tldChjdHgsIGJ1ZmZlcik7Ci0JCQlwa3RzaXplID0gbmV4dCAtIGJ1ZmZlcjsKLQkJCWlmIChwa3RzaXplID49IHNpemUpIHsKLQkJCQkvKgotCQkJCSAqIFdlIGhhdmUgaGFuZGxlZCBhbGwgdGhlIGRhdGEgdGhhdCB3YXMKLQkJCQkgKiBvcmlnaW5hbGx5IGluIHRoaXMgcGFnZSwgc28gd2UgY2FuIG5vdwotCQkJCSAqIGNvbnRpbnVlIGluIHRoZSBuZXh0IHBhZ2UuCi0JCQkJICovCi0JCQkJYnVmZmVyID0gbmV4dDsKLQkJCQlicmVhazsKLQkJCX0KLQkJCS8qIG1vdmUgdGhlIG5leHQgcGFja2V0IHRvIHRoZSBzdGFydCBvZiB0aGUgYnVmZmVyICovCi0JCQltZW1tb3ZlKGJ1ZmZlciwgbmV4dCwgc2l6ZSArIHNpemUyIC0gcGt0c2l6ZSk7Ci0JCQlzaXplIC09IHBrdHNpemU7Ci0JCQkvKiBmaWxsIHVwIHRoaXMgcGFnZSBhZ2FpbiAqLwotCQkJc2l6ZTMgPSBtaW4ocmVzdCAtIHNpemUyLAotCQkJCSAgICAoc2l6ZV90KVBBR0VfU0laRSAtIG9mZnNldCAtIHNpemUgLSBzaXplMik7Ci0JCQltZW1jcHkoYnVmZmVyICsgc2l6ZSArIHNpemUyLAotCQkJICAgICAgICh2b2lkICopIGFiLT5kYXRhICsgc2l6ZTIsIHNpemUzKTsKLQkJCXNpemUyICs9IHNpemUzOwotCQl9Ci0KLQkJaWYgKHJlc3QgPiAwKSB7Ci0JCQkvKiBoYW5kbGUgdGhlIHBhY2tldHMgdGhhdCBhcmUgZnVsbHkgaW4gdGhlIG5leHQgcGFnZSAqLwotCQkJYnVmZmVyID0gKHZvaWQgKikgYWItPmRhdGEgKwotCQkJCQkoYnVmZmVyIC0gKHN0YXJ0ICsgb2Zmc2V0ICsgc2l6ZSkpOwotCQkJZW5kID0gKHZvaWQgKikgYWItPmRhdGEgKyByZXN0OwotCi0JCQl3aGlsZSAoYnVmZmVyIDwgZW5kKQotCQkJCWJ1ZmZlciA9IGhhbmRsZV9hcl9wYWNrZXQoY3R4LCBidWZmZXIpOwotCi0JCQljdHgtPmN1cnJlbnRfYnVmZmVyID0gYWI7Ci0JCQljdHgtPnBvaW50ZXIgPSBlbmQ7Ci0KLQkJCWFyX2NvbnRleHRfbGlua19wYWdlKGN0eCwgc3RhcnQsIHN0YXJ0X2J1cyk7Ci0JCX0gZWxzZSB7Ci0JCQljdHgtPnBvaW50ZXIgPSBzdGFydCArIFBBR0VfU0laRTsKLQkJfQotCX0gZWxzZSB7Ci0JCWJ1ZmZlciA9IGN0eC0+cG9pbnRlcjsKLQkJY3R4LT5wb2ludGVyID0gZW5kID0KLQkJCSh2b2lkICopIGFiICsgUEFHRV9TSVpFIC0gbGUxNl90b19jcHUocmVzX2NvdW50KTsKLQotCQl3aGlsZSAoYnVmZmVyIDwgZW5kKQotCQkJYnVmZmVyID0gaGFuZGxlX2FyX3BhY2tldChjdHgsIGJ1ZmZlcik7CisJaSA9IGFyX2ZpcnN0X2J1ZmZlcl9pbmRleChjdHgpOworCXdoaWxlIChpICE9IGVuZF9idWZmZXIpIHsKKwkJZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2UoY3R4LT5vaGNpLT5jYXJkLmRldmljZSwKKwkJCQkJICAgYXJfYnVmZmVyX2J1cyhjdHgsIGkpLAorCQkJCQkgICBQQUdFX1NJWkUsIERNQV9GUk9NX0RFVklDRSk7CisJCWFyX2NvbnRleHRfbGlua19wYWdlKGN0eCwgaSk7CisJCWkgPSBhcl9uZXh0X2J1ZmZlcl9pbmRleChpKTsKIAl9CiB9CiAKLXN0YXRpYyBpbnQgYXJfY29udGV4dF9pbml0KHN0cnVjdCBhcl9jb250ZXh0ICpjdHgsCi0JCQkgICBzdHJ1Y3QgZndfb2hjaSAqb2hjaSwgdTMyIHJlZ3MpCitzdGF0aWMgdm9pZCBhcl9jb250ZXh0X3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKQogewotCXN0cnVjdCBhcl9idWZmZXIgYWI7CisJc3RydWN0IGFyX2NvbnRleHQgKmN0eCA9IChzdHJ1Y3QgYXJfY29udGV4dCAqKWRhdGE7CisJdW5zaWduZWQgaW50IGVuZF9idWZmZXJfaW5kZXgsIGVuZF9idWZmZXJfb2Zmc2V0OworCXZvaWQgKnAsICplbmQ7CisKKwlwID0gY3R4LT5wb2ludGVyOworCWlmICghcCkKKwkJcmV0dXJuOworCisJZW5kX2J1ZmZlcl9pbmRleCA9IGFyX3NlYXJjaF9sYXN0X2FjdGl2ZV9idWZmZXIoY3R4LAorCQkJCQkJCSZlbmRfYnVmZmVyX29mZnNldCk7CisJYXJfc3luY19idWZmZXJzX2Zvcl9jcHUoY3R4LCBlbmRfYnVmZmVyX2luZGV4LCBlbmRfYnVmZmVyX29mZnNldCk7CisJZW5kID0gY3R4LT5idWZmZXIgKyBlbmRfYnVmZmVyX2luZGV4ICogUEFHRV9TSVpFICsgZW5kX2J1ZmZlcl9vZmZzZXQ7CisKKwlpZiAoZW5kX2J1ZmZlcl9pbmRleCA8IGFyX2ZpcnN0X2J1ZmZlcl9pbmRleChjdHgpKSB7CisJCS8qCisJCSAqIFRoZSBmaWxsZWQgcGFydCBvZiB0aGUgb3ZlcmFsbCBidWZmZXIgd3JhcHMgYXJvdW5kOyBoYW5kbGUKKwkJICogYWxsIHBhY2tldHMgdXAgdG8gdGhlIGJ1ZmZlciBlbmQgaGVyZS4gIElmIHRoZSBsYXN0IHBhY2tldAorCQkgKiB3cmFwcyBhcm91bmQsIGl0cyB0YWlsIHdpbGwgYmUgdmlzaWJsZSBhZnRlciB0aGUgYnVmZmVyIGVuZAorCQkgKiBiZWNhdXNlIHRoZSBidWZmZXIgc3RhcnQgcGFnZXMgYXJlIG1hcHBlZCB0aGVyZSBhZ2Fpbi4KKwkJICovCisJCXZvaWQgKmJ1ZmZlcl9lbmQgPSBjdHgtPmJ1ZmZlciArIEFSX0JVRkZFUlMgKiBQQUdFX1NJWkU7CisJCXAgPSBoYW5kbGVfYXJfcGFja2V0cyhjdHgsIHAsIGJ1ZmZlcl9lbmQpOworCQlpZiAocCA8IGJ1ZmZlcl9lbmQpCisJCQlnb3RvIGVycm9yOworCQkvKiBhZGp1c3QgcCB0byBwb2ludCBiYWNrIGludG8gdGhlIGFjdHVhbCBidWZmZXIgKi8KKwkJcCAtPSBBUl9CVUZGRVJTICogUEFHRV9TSVpFOworCX0KKworCXAgPSBoYW5kbGVfYXJfcGFja2V0cyhjdHgsIHAsIGVuZCk7CisJaWYgKHAgIT0gZW5kKSB7CisJCWlmIChwID4gZW5kKQorCQkJYXJfY29udGV4dF9hYm9ydChjdHgsICJpbmNvbnNpc3RlbnQgZGVzY3JpcHRvciIpOworCQlnb3RvIGVycm9yOworCX0KKworCWN0eC0+cG9pbnRlciA9IHA7CisJYXJfcmVjeWNsZV9idWZmZXJzKGN0eCwgZW5kX2J1ZmZlcl9pbmRleCk7CisKKwlyZXR1cm47CisKK2Vycm9yOgorCWN0eC0+cG9pbnRlciA9IE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgYXJfY29udGV4dF9pbml0KHN0cnVjdCBhcl9jb250ZXh0ICpjdHgsIHN0cnVjdCBmd19vaGNpICpvaGNpLAorCQkJICAgdW5zaWduZWQgaW50IGRlc2NyaXB0b3JzX29mZnNldCwgdTMyIHJlZ3MpCit7CisJdW5zaWduZWQgaW50IGk7CisJZG1hX2FkZHJfdCBkbWFfYWRkcjsKKwlzdHJ1Y3QgcGFnZSAqcGFnZXNbQVJfQlVGRkVSUyArIEFSX1dSQVBBUk9VTkRfUEFHRVNdOworCXN0cnVjdCBkZXNjcmlwdG9yICpkOwogCiAJY3R4LT5yZWdzICAgICAgICA9IHJlZ3M7CiAJY3R4LT5vaGNpICAgICAgICA9IG9oY2k7Ci0JY3R4LT5sYXN0X2J1ZmZlciA9ICZhYjsKIAl0YXNrbGV0X2luaXQoJmN0eC0+dGFza2xldCwgYXJfY29udGV4dF90YXNrbGV0LCAodW5zaWduZWQgbG9uZyljdHgpOwogCi0JYXJfY29udGV4dF9hZGRfcGFnZShjdHgpOwotCWFyX2NvbnRleHRfYWRkX3BhZ2UoY3R4KTsKLQljdHgtPmN1cnJlbnRfYnVmZmVyID0gYWIubmV4dDsKLQljdHgtPnBvaW50ZXIgPSBjdHgtPmN1cnJlbnRfYnVmZmVyLT5kYXRhOworCWZvciAoaSA9IDA7IGkgPCBBUl9CVUZGRVJTOyBpKyspIHsKKwkJY3R4LT5wYWdlc1tpXSA9IGFsbG9jX3BhZ2UoR0ZQX0tFUk5FTCB8IEdGUF9ETUEzMik7CisJCWlmICghY3R4LT5wYWdlc1tpXSkKKwkJCWdvdG8gb3V0X29mX21lbW9yeTsKKwkJZG1hX2FkZHIgPSBkbWFfbWFwX3BhZ2Uob2hjaS0+Y2FyZC5kZXZpY2UsIGN0eC0+cGFnZXNbaV0sCisJCQkJCTAsIFBBR0VfU0laRSwgRE1BX0ZST01fREVWSUNFKTsKKwkJaWYgKGRtYV9tYXBwaW5nX2Vycm9yKG9oY2ktPmNhcmQuZGV2aWNlLCBkbWFfYWRkcikpIHsKKwkJCV9fZnJlZV9wYWdlKGN0eC0+cGFnZXNbaV0pOworCQkJY3R4LT5wYWdlc1tpXSA9IE5VTEw7CisJCQlnb3RvIG91dF9vZl9tZW1vcnk7CisJCX0KKwkJc2V0X3BhZ2VfcHJpdmF0ZShjdHgtPnBhZ2VzW2ldLCBkbWFfYWRkcik7CisJfQorCisJZm9yIChpID0gMDsgaSA8IEFSX0JVRkZFUlM7IGkrKykKKwkJcGFnZXNbaV0gICAgICAgICAgICAgID0gY3R4LT5wYWdlc1tpXTsKKwlmb3IgKGkgPSAwOyBpIDwgQVJfV1JBUEFST1VORF9QQUdFUzsgaSsrKQorCQlwYWdlc1tBUl9CVUZGRVJTICsgaV0gPSBjdHgtPnBhZ2VzW2ldOworCWN0eC0+YnVmZmVyID0gdm1fbWFwX3JhbShwYWdlcywgQVJfQlVGRkVSUyArIEFSX1dSQVBBUk9VTkRfUEFHRVMsCisJCQkJIC0xLCBQQUdFX0tFUk5FTF9STyk7CisJaWYgKCFjdHgtPmJ1ZmZlcikKKwkJZ290byBvdXRfb2ZfbWVtb3J5OworCisJY3R4LT5kZXNjcmlwdG9ycyAgICAgPSBvaGNpLT5taXNjX2J1ZmZlciAgICAgKyBkZXNjcmlwdG9yc19vZmZzZXQ7CisJY3R4LT5kZXNjcmlwdG9yc19idXMgPSBvaGNpLT5taXNjX2J1ZmZlcl9idXMgKyBkZXNjcmlwdG9yc19vZmZzZXQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJfQlVGRkVSUzsgaSsrKSB7CisJCWQgPSAmY3R4LT5kZXNjcmlwdG9yc1tpXTsKKwkJZC0+cmVxX2NvdW50ICAgICAgPSBjcHVfdG9fbGUxNihQQUdFX1NJWkUpOworCQlkLT5jb250cm9sICAgICAgICA9IGNwdV90b19sZTE2KERFU0NSSVBUT1JfSU5QVVRfTU9SRSB8CisJCQkJCQlERVNDUklQVE9SX1NUQVRVUyB8CisJCQkJCQlERVNDUklQVE9SX0JSQU5DSF9BTFdBWVMpOworCQlkLT5kYXRhX2FkZHJlc3MgICA9IGNwdV90b19sZTMyKGFyX2J1ZmZlcl9idXMoY3R4LCBpKSk7CisJCWQtPmJyYW5jaF9hZGRyZXNzID0gY3B1X3RvX2xlMzIoY3R4LT5kZXNjcmlwdG9yc19idXMgKworCQkJYXJfbmV4dF9idWZmZXJfaW5kZXgoaSkgKiBzaXplb2Yoc3RydWN0IGRlc2NyaXB0b3IpKTsKKwl9CiAKIAlyZXR1cm4gMDsKKworb3V0X29mX21lbW9yeToKKwlhcl9jb250ZXh0X3JlbGVhc2UoY3R4KTsKKworCXJldHVybiAtRU5PTUVNOwogfQogCiBzdGF0aWMgdm9pZCBhcl9jb250ZXh0X3J1bihzdHJ1Y3QgYXJfY29udGV4dCAqY3R4KQogewotCXN0cnVjdCBhcl9idWZmZXIgKmFiID0gY3R4LT5jdXJyZW50X2J1ZmZlcjsKLQlkbWFfYWRkcl90IGFiX2J1czsKLQlzaXplX3Qgb2Zmc2V0OworCXVuc2lnbmVkIGludCBpOwogCi0Jb2Zmc2V0ID0gb2Zmc2V0b2Yoc3RydWN0IGFyX2J1ZmZlciwgZGF0YSk7Ci0JYWJfYnVzID0gbGUzMl90b19jcHUoYWItPmRlc2NyaXB0b3IuZGF0YV9hZGRyZXNzKSAtIG9mZnNldDsKKwlmb3IgKGkgPSAwOyBpIDwgQVJfQlVGRkVSUzsgaSsrKQorCQlhcl9jb250ZXh0X2xpbmtfcGFnZShjdHgsIGkpOwogCi0JcmVnX3dyaXRlKGN0eC0+b2hjaSwgQ09NTUFORF9QVFIoY3R4LT5yZWdzKSwgYWJfYnVzIHwgMSk7CisJY3R4LT5wb2ludGVyID0gY3R4LT5idWZmZXI7CisKKwlyZWdfd3JpdGUoY3R4LT5vaGNpLCBDT01NQU5EX1BUUihjdHgtPnJlZ3MpLCBjdHgtPmRlc2NyaXB0b3JzX2J1cyB8IDEpOwogCXJlZ193cml0ZShjdHgtPm9oY2ksIENPTlRST0xfU0VUKGN0eC0+cmVncyksIENPTlRFWFRfUlVOKTsKIAlmbHVzaF93cml0ZXMoY3R4LT5vaGNpKTsKIH0KQEAgLTEwNDIsNiArMTE3Myw3IEBACiAJCSAgbGUzMl90b19jcHUoY3R4LT5sYXN0LT5icmFuY2hfYWRkcmVzcykpOwogCXJlZ193cml0ZShvaGNpLCBDT05UUk9MX0NMRUFSKGN0eC0+cmVncyksIH4wKTsKIAlyZWdfd3JpdGUob2hjaSwgQ09OVFJPTF9TRVQoY3R4LT5yZWdzKSwgQ09OVEVYVF9SVU4gfCBleHRyYSk7CisJY3R4LT5ydW5uaW5nID0gdHJ1ZTsKIAlmbHVzaF93cml0ZXMob2hjaSk7CiB9CiAKQEAgLTEwNjksNiArMTIwMSw3IEBACiAJaW50IGk7CiAKIAlyZWdfd3JpdGUoY3R4LT5vaGNpLCBDT05UUk9MX0NMRUFSKGN0eC0+cmVncyksIENPTlRFWFRfUlVOKTsKKwljdHgtPnJ1bm5pbmcgPSBmYWxzZTsKIAlmbHVzaF93cml0ZXMoY3R4LT5vaGNpKTsKIAogCWZvciAoaSA9IDA7IGkgPCAxMDsgaSsrKSB7CkBAIC0xMDk5LDcgKzEyMzIsNiBAQAogCXN0cnVjdCBkZXNjcmlwdG9yICpkLCAqbGFzdDsKIAlfX2xlMzIgKmhlYWRlcjsKIAlpbnQgeiwgdGNvZGU7Ci0JdTMyIHJlZzsKIAogCWQgPSBjb250ZXh0X2dldF9kZXNjcmlwdG9ycyhjdHgsIDQsICZkX2J1cyk7CiAJaWYgKGQgPT0gTlVMTCkgewpAQCAtMTExMywyMSArMTI0NSwyNyBAQAogCS8qCiAJICogVGhlIERNQSBmb3JtYXQgZm9yIGFzeW5jcm9ub3VzIGxpbmsgcGFja2V0cyBpcyBkaWZmZXJlbnQKIAkgKiBmcm9tIHRoZSBJRUVFMTM5NCBsYXlvdXQsIHNvIHNoaWZ0IHRoZSBmaWVsZHMgYXJvdW5kCi0JICogYWNjb3JkaW5nbHkuICBJZiBoZWFkZXJfbGVuZ3RoIGlzIDgsIGl0J3MgYSBQSFkgcGFja2V0LCB0bwotCSAqIHdoaWNoIHdlIG5lZWQgdG8gcHJlcGVuZCBhbiBleHRyYSBxdWFkbGV0LgorCSAqIGFjY29yZGluZ2x5LgogCSAqLwogCisJdGNvZGUgPSAocGFja2V0LT5oZWFkZXJbMF0gPj4gNCkgJiAweDBmOwogCWhlYWRlciA9IChfX2xlMzIgKikgJmRbMV07Ci0Jc3dpdGNoIChwYWNrZXQtPmhlYWRlcl9sZW5ndGgpIHsKLQljYXNlIDE2OgotCWNhc2UgMTI6CisJc3dpdGNoICh0Y29kZSkgeworCWNhc2UgVENPREVfV1JJVEVfUVVBRExFVF9SRVFVRVNUOgorCWNhc2UgVENPREVfV1JJVEVfQkxPQ0tfUkVRVUVTVDoKKwljYXNlIFRDT0RFX1dSSVRFX1JFU1BPTlNFOgorCWNhc2UgVENPREVfUkVBRF9RVUFETEVUX1JFUVVFU1Q6CisJY2FzZSBUQ09ERV9SRUFEX0JMT0NLX1JFUVVFU1Q6CisJY2FzZSBUQ09ERV9SRUFEX1FVQURMRVRfUkVTUE9OU0U6CisJY2FzZSBUQ09ERV9SRUFEX0JMT0NLX1JFU1BPTlNFOgorCWNhc2UgVENPREVfTE9DS19SRVFVRVNUOgorCWNhc2UgVENPREVfTE9DS19SRVNQT05TRToKIAkJaGVhZGVyWzBdID0gY3B1X3RvX2xlMzIoKHBhY2tldC0+aGVhZGVyWzBdICYgMHhmZmZmKSB8CiAJCQkJCShwYWNrZXQtPnNwZWVkIDw8IDE2KSk7CiAJCWhlYWRlclsxXSA9IGNwdV90b19sZTMyKChwYWNrZXQtPmhlYWRlclsxXSAmIDB4ZmZmZikgfAogCQkJCQkocGFja2V0LT5oZWFkZXJbMF0gJiAweGZmZmYwMDAwKSk7CiAJCWhlYWRlclsyXSA9IGNwdV90b19sZTMyKHBhY2tldC0+aGVhZGVyWzJdKTsKIAotCQl0Y29kZSA9IChwYWNrZXQtPmhlYWRlclswXSA+PiA0KSAmIDB4MGY7CiAJCWlmIChUQ09ERV9JU19CTE9DS19QQUNLRVQodGNvZGUpKQogCQkJaGVhZGVyWzNdID0gY3B1X3RvX2xlMzIocGFja2V0LT5oZWFkZXJbM10pOwogCQllbHNlCkBAIC0xMTM2LDE4ICsxMjc0LDE4IEBACiAJCWRbMF0ucmVxX2NvdW50ID0gY3B1X3RvX2xlMTYocGFja2V0LT5oZWFkZXJfbGVuZ3RoKTsKIAkJYnJlYWs7CiAKLQljYXNlIDg6CisJY2FzZSBUQ09ERV9MSU5LX0lOVEVSTkFMOgogCQloZWFkZXJbMF0gPSBjcHVfdG9fbGUzMigoT0hDSTEzOTRfcGh5X3Rjb2RlIDw8IDQpIHwKIAkJCQkJKHBhY2tldC0+c3BlZWQgPDwgMTYpKTsKLQkJaGVhZGVyWzFdID0gY3B1X3RvX2xlMzIocGFja2V0LT5oZWFkZXJbMF0pOwotCQloZWFkZXJbMl0gPSBjcHVfdG9fbGUzMihwYWNrZXQtPmhlYWRlclsxXSk7CisJCWhlYWRlclsxXSA9IGNwdV90b19sZTMyKHBhY2tldC0+aGVhZGVyWzFdKTsKKwkJaGVhZGVyWzJdID0gY3B1X3RvX2xlMzIocGFja2V0LT5oZWFkZXJbMl0pOwogCQlkWzBdLnJlcV9jb3VudCA9IGNwdV90b19sZTE2KDEyKTsKIAotCQlpZiAoaXNfcGluZ19wYWNrZXQocGFja2V0LT5oZWFkZXIpKQorCQlpZiAoaXNfcGluZ19wYWNrZXQoJnBhY2tldC0+aGVhZGVyWzFdKSkKIAkJCWRbMF0uY29udHJvbCB8PSBjcHVfdG9fbGUxNihERVNDUklQVE9SX1BJTkcpOwogCQlicmVhazsKIAotCWNhc2UgNDoKKwljYXNlIFRDT0RFX1NUUkVBTV9EQVRBOgogCQloZWFkZXJbMF0gPSBjcHVfdG9fbGUzMigocGFja2V0LT5oZWFkZXJbMF0gJiAweGZmZmYpIHwKIAkJCQkJKHBhY2tldC0+c3BlZWQgPDwgMTYpKTsKIAkJaGVhZGVyWzFdID0gY3B1X3RvX2xlMzIocGFja2V0LT5oZWFkZXJbMF0gJiAweGZmZmYwMDAwKTsKQEAgLTExOTcsNiArMTMzNSw4IEBACiAJICogc29tZSBjb250cm9sbGVycyAobGlrZSBhIEpNaWNyb24gSk1CMzgxIFBDSS1lKSBtaXNiZWhhdmUgYW5kIHdpbmQKIAkgKiB1cCBzdGFsbGluZyBvdXQuICBTbyB3ZSBqdXN0IGJhaWwgb3V0IGluIHNvZnR3YXJlIGFuZCB0cnkgYWdhaW4KIAkgKiBsYXRlciwgYW5kIGV2ZXJ5b25lIGlzIGhhcHB5LgorCSAqIEZJWE1FOiBUZXN0IG9mIEludEV2ZW50LmJ1c1Jlc2V0IG1heSBubyBsb25nZXIgYmUgbmVjZXNzYXJ5IHNpbmNlIHdlCisJICogICAgICAgIGZsdXNoIEFUIHF1ZXVlcyBpbiBidXNfcmVzZXRfdGFza2xldC4KIAkgKiBGSVhNRTogRG9jdW1lbnQgaG93IHRoZSBsb2NraW5nIHdvcmtzLgogCSAqLwogCWlmIChvaGNpLT5nZW5lcmF0aW9uICE9IHBhY2tldC0+Z2VuZXJhdGlvbiB8fApAQCAtMTIxMCwxNCArMTM1MCwyMyBAQAogCiAJY29udGV4dF9hcHBlbmQoY3R4LCBkLCB6LCA0IC0geik7CiAKLQkvKiBJZiB0aGUgY29udGV4dCBpc24ndCBhbHJlYWR5IHJ1bm5pbmcsIHN0YXJ0IGl0IHVwLiAqLwotCXJlZyA9IHJlZ19yZWFkKGN0eC0+b2hjaSwgQ09OVFJPTF9TRVQoY3R4LT5yZWdzKSk7Ci0JaWYgKChyZWcgJiBDT05URVhUX1JVTikgPT0gMCkKKwlpZiAoIWN0eC0+cnVubmluZykKIAkJY29udGV4dF9ydW4oY3R4LCAwKTsKIAogCXJldHVybiAwOwogfQogCitzdGF0aWMgdm9pZCBhdF9jb250ZXh0X2ZsdXNoKHN0cnVjdCBjb250ZXh0ICpjdHgpCit7CisJdGFza2xldF9kaXNhYmxlKCZjdHgtPnRhc2tsZXQpOworCisJY3R4LT5mbHVzaGluZyA9IHRydWU7CisJY29udGV4dF90YXNrbGV0KCh1bnNpZ25lZCBsb25nKWN0eCk7CisJY3R4LT5mbHVzaGluZyA9IGZhbHNlOworCisJdGFza2xldF9lbmFibGUoJmN0eC0+dGFza2xldCk7Cit9CisKIHN0YXRpYyBpbnQgaGFuZGxlX2F0X3BhY2tldChzdHJ1Y3QgY29udGV4dCAqY29udGV4dCwKIAkJCSAgICBzdHJ1Y3QgZGVzY3JpcHRvciAqZCwKIAkJCSAgICBzdHJ1Y3QgZGVzY3JpcHRvciAqbGFzdCkKQEAgLTEyMjcsNyArMTM3Niw3IEBACiAJc3RydWN0IGZ3X29oY2kgKm9oY2kgPSBjb250ZXh0LT5vaGNpOwogCWludCBldnQ7CiAKLQlpZiAobGFzdC0+dHJhbnNmZXJfc3RhdHVzID09IDApCisJaWYgKGxhc3QtPnRyYW5zZmVyX3N0YXR1cyA9PSAwICYmICFjb250ZXh0LT5mbHVzaGluZykKIAkJLyogVGhpcyBkZXNjcmlwdG9yIGlzbid0IGRvbmUgeWV0LCBzdG9wIGl0ZXJhdGlvbi4gKi8KIAkJcmV0dXJuIDA7CiAKQEAgLTEyNjEsMTEgKzE0MTAsMTUgQEAKIAkJYnJlYWs7CiAKIAljYXNlIE9IQ0kxMzk0X2V2dF9taXNzaW5nX2FjazoKLQkJLyoKLQkJICogVXNpbmcgYSB2YWxpZCAoY3VycmVudCkgZ2VuZXJhdGlvbiBjb3VudCwgYnV0IHRoZQotCQkgKiBub2RlIGlzIG5vdCBvbiB0aGUgYnVzIG9yIG5vdCBzZW5kaW5nIGFja3MuCi0JCSAqLwotCQlwYWNrZXQtPmFjayA9IFJDT0RFX05PX0FDSzsKKwkJaWYgKGNvbnRleHQtPmZsdXNoaW5nKQorCQkJcGFja2V0LT5hY2sgPSBSQ09ERV9HRU5FUkFUSU9OOworCQllbHNlIHsKKwkJCS8qCisJCQkgKiBVc2luZyBhIHZhbGlkIChjdXJyZW50KSBnZW5lcmF0aW9uIGNvdW50LCBidXQgdGhlCisJCQkgKiBub2RlIGlzIG5vdCBvbiB0aGUgYnVzIG9yIG5vdCBzZW5kaW5nIGFja3MuCisJCQkgKi8KKwkJCXBhY2tldC0+YWNrID0gUkNPREVfTk9fQUNLOworCQl9CiAJCWJyZWFrOwogCiAJY2FzZSBBQ0tfQ09NUExFVEUgKyAweDEwOgpAQCAtMTI3OCw2ICsxNDMxLDEzIEBACiAJCXBhY2tldC0+YWNrID0gZXZ0IC0gMHgxMDsKIAkJYnJlYWs7CiAKKwljYXNlIE9IQ0kxMzk0X2V2dF9ub19zdGF0dXM6CisJCWlmIChjb250ZXh0LT5mbHVzaGluZykgeworCQkJcGFja2V0LT5hY2sgPSBSQ09ERV9HRU5FUkFUSU9OOworCQkJYnJlYWs7CisJCX0KKwkJLyogZmFsbCB0aHJvdWdoICovCisKIAlkZWZhdWx0OgogCQlwYWNrZXQtPmFjayA9IFJDT0RFX1NFTkRfRVJST1I7CiAJCWJyZWFrOwpAQCAtMTU4Myw5ICsxNzQzLDIzIEBACiAJLyogRklYTUU6IERvY3VtZW50IGhvdyB0aGUgbG9ja2luZyB3b3Jrcy4gKi8KIAlzcGluX2xvY2tfaXJxc2F2ZSgmb2hjaS0+bG9jaywgZmxhZ3MpOwogCi0Jb2hjaS0+Z2VuZXJhdGlvbiA9IGdlbmVyYXRpb247CisJb2hjaS0+Z2VuZXJhdGlvbiA9IC0xOyAvKiBwcmV2ZW50IEFUIHBhY2tldCBxdWV1ZWluZyAqLwogCWNvbnRleHRfc3RvcCgmb2hjaS0+YXRfcmVxdWVzdF9jdHgpOwogCWNvbnRleHRfc3RvcCgmb2hjaS0+YXRfcmVzcG9uc2VfY3R4KTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm9oY2ktPmxvY2ssIGZsYWdzKTsKKworCS8qCisJICogUGVyIE9IQ0kgMS4yIGRyYWZ0LCBjbGF1c2UgNy4yLjMuMywgaGFyZHdhcmUgbWF5IGxlYXZlIHVuc2VudAorCSAqIHBhY2tldHMgaW4gdGhlIEFUIHF1ZXVlcyBhbmQgc29mdHdhcmUgbmVlZHMgdG8gZHJhaW4gdGhlbS4KKwkgKiBTb21lIE9IQ0kgMS4xIGNvbnRyb2xsZXJzIChKTWljcm9uKSBhcHBhcmVudGx5IHJlcXVpcmUgdGhpcyB0b28uCisJICovCisJYXRfY29udGV4dF9mbHVzaCgmb2hjaS0+YXRfcmVxdWVzdF9jdHgpOworCWF0X2NvbnRleHRfZmx1c2goJm9oY2ktPmF0X3Jlc3BvbnNlX2N0eCk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmb2hjaS0+bG9jaywgZmxhZ3MpOworCisJb2hjaS0+Z2VuZXJhdGlvbiA9IGdlbmVyYXRpb247CiAJcmVnX3dyaXRlKG9oY2ksIE9IQ0kxMzk0X0ludEV2ZW50Q2xlYXIsIE9IQ0kxMzk0X2J1c1Jlc2V0KTsKIAogCWlmIChvaGNpLT5xdWlya3MgJiBRVUlSS19SRVNFVF9QQUNLRVQpCkBAIC0xNjUzLDggKzE4MjcsMTIgQEAKIAlpZiAoIWV2ZW50IHx8ICF+ZXZlbnQpCiAJCXJldHVybiBJUlFfTk9ORTsKIAotCS8qIGJ1c1Jlc2V0IG11c3Qgbm90IGJlIGNsZWFyZWQgeWV0LCBzZWUgT0hDSSAxLjEgY2xhdXNlIDcuMi4zLjIgKi8KLQlyZWdfd3JpdGUob2hjaSwgT0hDSTEzOTRfSW50RXZlbnRDbGVhciwgZXZlbnQgJiB+T0hDSTEzOTRfYnVzUmVzZXQpOworCS8qCisJICogYnVzUmVzZXQgYW5kIHBvc3RlZFdyaXRlRXJyIG11c3Qgbm90IGJlIGNsZWFyZWQgeWV0CisJICogKE9IQ0kgMS4xIGNsYXVzZXMgNy4yLjMuMiBhbmQgMTMuMi44LjEpCisJICovCisJcmVnX3dyaXRlKG9oY2ksIE9IQ0kxMzk0X0ludEV2ZW50Q2xlYXIsCisJCSAgZXZlbnQgJiB+KE9IQ0kxMzk0X2J1c1Jlc2V0IHwgT0hDSTEzOTRfcG9zdGVkV3JpdGVFcnIpKTsKIAlsb2dfaXJxcyhldmVudCk7CiAKIAlpZiAoZXZlbnQgJiBPSENJMTM5NF9zZWxmSURDb21wbGV0ZSkKQEAgLTE2NzIsMzAgKzE4NTAsNDEgQEAKIAlpZiAoZXZlbnQgJiBPSENJMTM5NF9yZXNwVHhDb21wbGV0ZSkKIAkJdGFza2xldF9zY2hlZHVsZSgmb2hjaS0+YXRfcmVzcG9uc2VfY3R4LnRhc2tsZXQpOwogCi0JaXNvX2V2ZW50ID0gcmVnX3JlYWQob2hjaSwgT0hDSTEzOTRfSXNvUmVjdkludEV2ZW50Q2xlYXIpOwotCXJlZ193cml0ZShvaGNpLCBPSENJMTM5NF9Jc29SZWN2SW50RXZlbnRDbGVhciwgaXNvX2V2ZW50KTsKKwlpZiAoZXZlbnQgJiBPSENJMTM5NF9pc29jaFJ4KSB7CisJCWlzb19ldmVudCA9IHJlZ19yZWFkKG9oY2ksIE9IQ0kxMzk0X0lzb1JlY3ZJbnRFdmVudENsZWFyKTsKKwkJcmVnX3dyaXRlKG9oY2ksIE9IQ0kxMzk0X0lzb1JlY3ZJbnRFdmVudENsZWFyLCBpc29fZXZlbnQpOwogCi0Jd2hpbGUgKGlzb19ldmVudCkgewotCQlpID0gZmZzKGlzb19ldmVudCkgLSAxOwotCQl0YXNrbGV0X3NjaGVkdWxlKCZvaGNpLT5pcl9jb250ZXh0X2xpc3RbaV0uY29udGV4dC50YXNrbGV0KTsKLQkJaXNvX2V2ZW50ICY9IH4oMSA8PCBpKTsKKwkJd2hpbGUgKGlzb19ldmVudCkgeworCQkJaSA9IGZmcyhpc29fZXZlbnQpIC0gMTsKKwkJCXRhc2tsZXRfc2NoZWR1bGUoCisJCQkJJm9oY2ktPmlyX2NvbnRleHRfbGlzdFtpXS5jb250ZXh0LnRhc2tsZXQpOworCQkJaXNvX2V2ZW50ICY9IH4oMSA8PCBpKTsKKwkJfQogCX0KIAotCWlzb19ldmVudCA9IHJlZ19yZWFkKG9oY2ksIE9IQ0kxMzk0X0lzb1htaXRJbnRFdmVudENsZWFyKTsKLQlyZWdfd3JpdGUob2hjaSwgT0hDSTEzOTRfSXNvWG1pdEludEV2ZW50Q2xlYXIsIGlzb19ldmVudCk7CisJaWYgKGV2ZW50ICYgT0hDSTEzOTRfaXNvY2hUeCkgeworCQlpc29fZXZlbnQgPSByZWdfcmVhZChvaGNpLCBPSENJMTM5NF9Jc29YbWl0SW50RXZlbnRDbGVhcik7CisJCXJlZ193cml0ZShvaGNpLCBPSENJMTM5NF9Jc29YbWl0SW50RXZlbnRDbGVhciwgaXNvX2V2ZW50KTsKIAotCXdoaWxlIChpc29fZXZlbnQpIHsKLQkJaSA9IGZmcyhpc29fZXZlbnQpIC0gMTsKLQkJdGFza2xldF9zY2hlZHVsZSgmb2hjaS0+aXRfY29udGV4dF9saXN0W2ldLmNvbnRleHQudGFza2xldCk7Ci0JCWlzb19ldmVudCAmPSB+KDEgPDwgaSk7CisJCXdoaWxlIChpc29fZXZlbnQpIHsKKwkJCWkgPSBmZnMoaXNvX2V2ZW50KSAtIDE7CisJCQl0YXNrbGV0X3NjaGVkdWxlKAorCQkJCSZvaGNpLT5pdF9jb250ZXh0X2xpc3RbaV0uY29udGV4dC50YXNrbGV0KTsKKwkJCWlzb19ldmVudCAmPSB+KDEgPDwgaSk7CisJCX0KIAl9CiAKIAlpZiAodW5saWtlbHkoZXZlbnQgJiBPSENJMTM5NF9yZWdBY2Nlc3NGYWlsKSkKIAkJZndfZXJyb3IoIlJlZ2lzdGVyIGFjY2VzcyBmYWlsdXJlIC0gIgogCQkJICJwbGVhc2Ugbm90aWZ5IGxpbnV4MTM5NC1kZXZlbEBsaXN0cy5zZi5uZXRcbiIpOwogCi0JaWYgKHVubGlrZWx5KGV2ZW50ICYgT0hDSTEzOTRfcG9zdGVkV3JpdGVFcnIpKQorCWlmICh1bmxpa2VseShldmVudCAmIE9IQ0kxMzk0X3Bvc3RlZFdyaXRlRXJyKSkgeworCQlyZWdfcmVhZChvaGNpLCBPSENJMTM5NF9Qb3N0ZWRXcml0ZUFkZHJlc3NIaSk7CisJCXJlZ19yZWFkKG9oY2ksIE9IQ0kxMzk0X1Bvc3RlZFdyaXRlQWRkcmVzc0xvKTsKKwkJcmVnX3dyaXRlKG9oY2ksIE9IQ0kxMzk0X0ludEV2ZW50Q2xlYXIsCisJCQkgIE9IQ0kxMzk0X3Bvc3RlZFdyaXRlRXJyKTsKIAkJZndfZXJyb3IoIlBDSSBwb3N0ZWQgd3JpdGUgZXJyb3JcbiIpOworCX0KIAogCWlmICh1bmxpa2VseShldmVudCAmIE9IQ0kxMzk0X2N5Y2xlVG9vTG9uZykpIHsKIAkJaWYgKHByaW50a19yYXRlbGltaXQoKSkKQEAgLTE3MTksNyArMTkwOCw4IEBACiAJCXNwaW5fbG9jaygmb2hjaS0+bG9jayk7CiAJCXVwZGF0ZV9idXNfdGltZShvaGNpKTsKIAkJc3Bpbl91bmxvY2soJm9oY2ktPmxvY2spOwotCX0KKwl9IGVsc2UKKwkJZmx1c2hfd3JpdGVzKG9oY2kpOwogCiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQpAQCAtMjQ5NSw2ICsyNjg1LDEwIEBACiAJCXJlZ193cml0ZShvaGNpLCBPSENJMTM5NF9Jc29SZWN2SW50TWFza1NldCwgMSA8PCBpbmRleCk7CiAJCXJlZ193cml0ZShvaGNpLCBDT05URVhUX01BVENIKGN0eC0+Y29udGV4dC5yZWdzKSwgbWF0Y2gpOwogCQljb250ZXh0X3J1bigmY3R4LT5jb250ZXh0LCBjb250cm9sKTsKKworCQljdHgtPnN5bmMgPSBzeW5jOworCQljdHgtPnRhZ3MgPSB0YWdzOworCiAJCWJyZWFrOwogCX0KIApAQCAtMjU5Miw2ICsyNzg2LDI2IEBACiAJcmV0dXJuIHJldDsKIH0KIAorI2lmZGVmIENPTkZJR19QTQorc3RhdGljIHZvaWQgb2hjaV9yZXN1bWVfaXNvX2RtYShzdHJ1Y3QgZndfb2hjaSAqb2hjaSkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgaXNvX2NvbnRleHQgKmN0eDsKKworCWZvciAoaSA9IDAgOyBpIDwgb2hjaS0+bl9pciA7IGkrKykgeworCQljdHggPSAmb2hjaS0+aXJfY29udGV4dF9saXN0W2ldOworCQlpZiAoY3R4LT5jb250ZXh0LnJ1bm5pbmcpCisJCQlvaGNpX3N0YXJ0X2lzbygmY3R4LT5iYXNlLCAwLCBjdHgtPnN5bmMsIGN0eC0+dGFncyk7CisJfQorCisJZm9yIChpID0gMCA7IGkgPCBvaGNpLT5uX2l0IDsgaSsrKSB7CisJCWN0eCA9ICZvaGNpLT5pdF9jb250ZXh0X2xpc3RbaV07CisJCWlmIChjdHgtPmNvbnRleHQucnVubmluZykKKwkJCW9oY2lfc3RhcnRfaXNvKCZjdHgtPmJhc2UsIDAsIGN0eC0+c3luYywgY3R4LT50YWdzKTsKKwl9Cit9CisjZW5kaWYKKwogc3RhdGljIGludCBxdWV1ZV9pc29fdHJhbnNtaXQoc3RydWN0IGlzb19jb250ZXh0ICpjdHgsCiAJCQkgICAgICBzdHJ1Y3QgZndfaXNvX3BhY2tldCAqcGFja2V0LAogCQkJICAgICAgc3RydWN0IGZ3X2lzb19idWZmZXIgKmJ1ZmZlciwKQEAgLTI5MDEsNyArMzExNSw3IEBACiAJc3RydWN0IGZ3X29oY2kgKm9oY2k7CiAJdTMyIGJ1c19vcHRpb25zLCBtYXhfcmVjZWl2ZSwgbGlua19zcGVlZCwgdmVyc2lvbjsKIAl1NjQgZ3VpZDsKLQlpbnQgaSwgZXJyLCBuX2lyLCBuX2l0OworCWludCBpLCBlcnI7CiAJc2l6ZV90IHNpemU7CiAKIAlvaGNpID0ga3phbGxvYyhzaXplb2YoKm9oY2kpLCBHRlBfS0VSTkVMKTsKQEAgLTI5NTUsMzEgKzMxNjksNTUgQEAKIAlpZiAocGFyYW1fcXVpcmtzKQogCQlvaGNpLT5xdWlya3MgPSBwYXJhbV9xdWlya3M7CiAKLQlhcl9jb250ZXh0X2luaXQoJm9oY2ktPmFyX3JlcXVlc3RfY3R4LCBvaGNpLAotCQkJT0hDSTEzOTRfQXNSZXFSY3ZDb250ZXh0Q29udHJvbFNldCk7CisJLyoKKwkgKiBCZWNhdXNlIGRtYV9hbGxvY19jb2hlcmVudCgpIGFsbG9jYXRlcyBhdCBsZWFzdCBvbmUgcGFnZSwKKwkgKiB3ZSBzYXZlIHNwYWNlIGJ5IHVzaW5nIGEgY29tbW9uIGJ1ZmZlciBmb3IgdGhlIEFSIHJlcXVlc3QvCisJICogcmVzcG9uc2UgZGVzY3JpcHRvcnMgYW5kIHRoZSBzZWxmIElEcyBidWZmZXIuCisJICovCisJQlVJTERfQlVHX09OKEFSX0JVRkZFUlMgKiBzaXplb2Yoc3RydWN0IGRlc2NyaXB0b3IpID4gUEFHRV9TSVpFLzQpOworCUJVSUxEX0JVR19PTihTRUxGX0lEX0JVRl9TSVpFID4gUEFHRV9TSVpFLzIpOworCW9oY2ktPm1pc2NfYnVmZmVyID0gZG1hX2FsbG9jX2NvaGVyZW50KG9oY2ktPmNhcmQuZGV2aWNlLAorCQkJCQkgICAgICAgUEFHRV9TSVpFLAorCQkJCQkgICAgICAgJm9oY2ktPm1pc2NfYnVmZmVyX2J1cywKKwkJCQkJICAgICAgIEdGUF9LRVJORUwpOworCWlmICghb2hjaS0+bWlzY19idWZmZXIpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBmYWlsX2lvdW5tYXA7CisJfQogCi0JYXJfY29udGV4dF9pbml0KCZvaGNpLT5hcl9yZXNwb25zZV9jdHgsIG9oY2ksCi0JCQlPSENJMTM5NF9Bc1JzcFJjdkNvbnRleHRDb250cm9sU2V0KTsKKwllcnIgPSBhcl9jb250ZXh0X2luaXQoJm9oY2ktPmFyX3JlcXVlc3RfY3R4LCBvaGNpLCAwLAorCQkJICAgICAgT0hDSTEzOTRfQXNSZXFSY3ZDb250ZXh0Q29udHJvbFNldCk7CisJaWYgKGVyciA8IDApCisJCWdvdG8gZmFpbF9taXNjX2J1ZjsKIAotCWNvbnRleHRfaW5pdCgmb2hjaS0+YXRfcmVxdWVzdF9jdHgsIG9oY2ksCi0JCSAgICAgT0hDSTEzOTRfQXNSZXFUckNvbnRleHRDb250cm9sU2V0LCBoYW5kbGVfYXRfcGFja2V0KTsKKwllcnIgPSBhcl9jb250ZXh0X2luaXQoJm9oY2ktPmFyX3Jlc3BvbnNlX2N0eCwgb2hjaSwgUEFHRV9TSVpFLzQsCisJCQkgICAgICBPSENJMTM5NF9Bc1JzcFJjdkNvbnRleHRDb250cm9sU2V0KTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBmYWlsX2FycmVxX2N0eDsKIAotCWNvbnRleHRfaW5pdCgmb2hjaS0+YXRfcmVzcG9uc2VfY3R4LCBvaGNpLAotCQkgICAgIE9IQ0kxMzk0X0FzUnNwVHJDb250ZXh0Q29udHJvbFNldCwgaGFuZGxlX2F0X3BhY2tldCk7CisJZXJyID0gY29udGV4dF9pbml0KCZvaGNpLT5hdF9yZXF1ZXN0X2N0eCwgb2hjaSwKKwkJCSAgIE9IQ0kxMzk0X0FzUmVxVHJDb250ZXh0Q29udHJvbFNldCwgaGFuZGxlX2F0X3BhY2tldCk7CisJaWYgKGVyciA8IDApCisJCWdvdG8gZmFpbF9hcnJzcF9jdHg7CisKKwllcnIgPSBjb250ZXh0X2luaXQoJm9oY2ktPmF0X3Jlc3BvbnNlX2N0eCwgb2hjaSwKKwkJCSAgIE9IQ0kxMzk0X0FzUnNwVHJDb250ZXh0Q29udHJvbFNldCwgaGFuZGxlX2F0X3BhY2tldCk7CisJaWYgKGVyciA8IDApCisJCWdvdG8gZmFpbF9hdHJlcV9jdHg7CiAKIAlyZWdfd3JpdGUob2hjaSwgT0hDSTEzOTRfSXNvUmVjdkludE1hc2tTZXQsIH4wKTsKIAlvaGNpLT5pcl9jb250ZXh0X2NoYW5uZWxzID0gfjBVTEw7CiAJb2hjaS0+aXJfY29udGV4dF9tYXNrID0gcmVnX3JlYWQob2hjaSwgT0hDSTEzOTRfSXNvUmVjdkludE1hc2tTZXQpOwogCXJlZ193cml0ZShvaGNpLCBPSENJMTM5NF9Jc29SZWN2SW50TWFza0NsZWFyLCB+MCk7Ci0Jbl9pciA9IGh3ZWlnaHQzMihvaGNpLT5pcl9jb250ZXh0X21hc2spOwotCXNpemUgPSBzaXplb2Yoc3RydWN0IGlzb19jb250ZXh0KSAqIG5faXI7CisJb2hjaS0+bl9pciA9IGh3ZWlnaHQzMihvaGNpLT5pcl9jb250ZXh0X21hc2spOworCXNpemUgPSBzaXplb2Yoc3RydWN0IGlzb19jb250ZXh0KSAqIG9oY2ktPm5faXI7CiAJb2hjaS0+aXJfY29udGV4dF9saXN0ID0ga3phbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKIAogCXJlZ193cml0ZShvaGNpLCBPSENJMTM5NF9Jc29YbWl0SW50TWFza1NldCwgfjApOwogCW9oY2ktPml0X2NvbnRleHRfbWFzayA9IHJlZ19yZWFkKG9oY2ksIE9IQ0kxMzk0X0lzb1htaXRJbnRNYXNrU2V0KTsKIAlyZWdfd3JpdGUob2hjaSwgT0hDSTEzOTRfSXNvWG1pdEludE1hc2tDbGVhciwgfjApOwotCW5faXQgPSBod2VpZ2h0MzIob2hjaS0+aXRfY29udGV4dF9tYXNrKTsKLQlzaXplID0gc2l6ZW9mKHN0cnVjdCBpc29fY29udGV4dCkgKiBuX2l0OworCW9oY2ktPm5faXQgPSBod2VpZ2h0MzIob2hjaS0+aXRfY29udGV4dF9tYXNrKTsKKwlzaXplID0gc2l6ZW9mKHN0cnVjdCBpc29fY29udGV4dCkgKiBvaGNpLT5uX2l0OwogCW9oY2ktPml0X2NvbnRleHRfbGlzdCA9IGt6YWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7CiAKIAlpZiAob2hjaS0+aXRfY29udGV4dF9saXN0ID09IE5VTEwgfHwgb2hjaS0+aXJfY29udGV4dF9saXN0ID09IE5VTEwpIHsKQEAgLTI5ODcsMTUgKzMyMjUsOCBAQAogCQlnb3RvIGZhaWxfY29udGV4dHM7CiAJfQogCi0JLyogc2VsZi1pZCBkbWEgYnVmZmVyIGFsbG9jYXRpb24gKi8KLQlvaGNpLT5zZWxmX2lkX2NwdSA9IGRtYV9hbGxvY19jb2hlcmVudChvaGNpLT5jYXJkLmRldmljZSwKLQkJCQkJICAgICAgIFNFTEZfSURfQlVGX1NJWkUsCi0JCQkJCSAgICAgICAmb2hjaS0+c2VsZl9pZF9idXMsCi0JCQkJCSAgICAgICBHRlBfS0VSTkVMKTsKLQlpZiAob2hjaS0+c2VsZl9pZF9jcHUgPT0gTlVMTCkgewotCQllcnIgPSAtRU5PTUVNOwotCQlnb3RvIGZhaWxfY29udGV4dHM7Ci0JfQorCW9oY2ktPnNlbGZfaWRfY3B1ID0gb2hjaS0+bWlzY19idWZmZXIgICAgICsgUEFHRV9TSVpFLzI7CisJb2hjaS0+c2VsZl9pZF9idXMgPSBvaGNpLT5taXNjX2J1ZmZlcl9idXMgKyBQQUdFX1NJWkUvMjsKIAogCWJ1c19vcHRpb25zID0gcmVnX3JlYWQob2hjaSwgT0hDSTEzOTRfQnVzT3B0aW9ucyk7CiAJbWF4X3JlY2VpdmUgPSAoYnVzX29wdGlvbnMgPj4gMTIpICYgMHhmOwpAQCAtMzAwNSwyNiArMzIzNiwzMCBAQAogCiAJZXJyID0gZndfY2FyZF9hZGQoJm9oY2ktPmNhcmQsIG1heF9yZWNlaXZlLCBsaW5rX3NwZWVkLCBndWlkKTsKIAlpZiAoZXJyKQotCQlnb3RvIGZhaWxfc2VsZl9pZDsKKwkJZ290byBmYWlsX2NvbnRleHRzOwogCiAJdmVyc2lvbiA9IHJlZ19yZWFkKG9oY2ksIE9IQ0kxMzk0X1ZlcnNpb24pICYgMHgwMGZmMDBmZjsKIAlmd19ub3RpZnkoIkFkZGVkIGZ3LW9oY2kgZGV2aWNlICVzLCBPSENJIHYleC4leCwgIgogCQkgICIlZCBJUiArICVkIElUIGNvbnRleHRzLCBxdWlya3MgMHgleFxuIiwKIAkJICBkZXZfbmFtZSgmZGV2LT5kZXYpLCB2ZXJzaW9uID4+IDE2LCB2ZXJzaW9uICYgMHhmZiwKLQkJICBuX2lyLCBuX2l0LCBvaGNpLT5xdWlya3MpOworCQkgIG9oY2ktPm5faXIsIG9oY2ktPm5faXQsIG9oY2ktPnF1aXJrcyk7CiAKIAlyZXR1cm4gMDsKIAotIGZhaWxfc2VsZl9pZDoKLQlkbWFfZnJlZV9jb2hlcmVudChvaGNpLT5jYXJkLmRldmljZSwgU0VMRl9JRF9CVUZfU0laRSwKLQkJCSAgb2hjaS0+c2VsZl9pZF9jcHUsIG9oY2ktPnNlbGZfaWRfYnVzKTsKICBmYWlsX2NvbnRleHRzOgogCWtmcmVlKG9oY2ktPmlyX2NvbnRleHRfbGlzdCk7CiAJa2ZyZWUob2hjaS0+aXRfY29udGV4dF9saXN0KTsKIAljb250ZXh0X3JlbGVhc2UoJm9oY2ktPmF0X3Jlc3BvbnNlX2N0eCk7CisgZmFpbF9hdHJlcV9jdHg6CiAJY29udGV4dF9yZWxlYXNlKCZvaGNpLT5hdF9yZXF1ZXN0X2N0eCk7CisgZmFpbF9hcnJzcF9jdHg6CiAJYXJfY29udGV4dF9yZWxlYXNlKCZvaGNpLT5hcl9yZXNwb25zZV9jdHgpOworIGZhaWxfYXJyZXFfY3R4OgogCWFyX2NvbnRleHRfcmVsZWFzZSgmb2hjaS0+YXJfcmVxdWVzdF9jdHgpOworIGZhaWxfbWlzY19idWY6CisJZG1hX2ZyZWVfY29oZXJlbnQob2hjaS0+Y2FyZC5kZXZpY2UsIFBBR0VfU0laRSwKKwkJCSAgb2hjaS0+bWlzY19idWZmZXIsIG9oY2ktPm1pc2NfYnVmZmVyX2J1cyk7CisgZmFpbF9pb3VubWFwOgogCXBjaV9pb3VubWFwKGRldiwgb2hjaS0+cmVnaXN0ZXJzKTsKICBmYWlsX2lvbWVtOgogCXBjaV9yZWxlYXNlX3JlZ2lvbihkZXYsIDApOwpAQCAtMzA2MywxMCArMzI5OCwxMCBAQAogCWlmIChvaGNpLT5jb25maWdfcm9tKQogCQlkbWFfZnJlZV9jb2hlcmVudChvaGNpLT5jYXJkLmRldmljZSwgQ09ORklHX1JPTV9TSVpFLAogCQkJCSAgb2hjaS0+Y29uZmlnX3JvbSwgb2hjaS0+Y29uZmlnX3JvbV9idXMpOwotCWRtYV9mcmVlX2NvaGVyZW50KG9oY2ktPmNhcmQuZGV2aWNlLCBTRUxGX0lEX0JVRl9TSVpFLAotCQkJICBvaGNpLT5zZWxmX2lkX2NwdSwgb2hjaS0+c2VsZl9pZF9idXMpOwogCWFyX2NvbnRleHRfcmVsZWFzZSgmb2hjaS0+YXJfcmVxdWVzdF9jdHgpOwogCWFyX2NvbnRleHRfcmVsZWFzZSgmb2hjaS0+YXJfcmVzcG9uc2VfY3R4KTsKKwlkbWFfZnJlZV9jb2hlcmVudChvaGNpLT5jYXJkLmRldmljZSwgUEFHRV9TSVpFLAorCQkJICBvaGNpLT5taXNjX2J1ZmZlciwgb2hjaS0+bWlzY19idWZmZXJfYnVzKTsKIAljb250ZXh0X3JlbGVhc2UoJm9oY2ktPmF0X3JlcXVlc3RfY3R4KTsKIAljb250ZXh0X3JlbGVhc2UoJm9oY2ktPmF0X3Jlc3BvbnNlX2N0eCk7CiAJa2ZyZWUob2hjaS0+aXRfY29udGV4dF9saXN0KTsKQEAgLTMxMTcsNyArMzM1MiwyMCBAQAogCQlyZXR1cm4gZXJyOwogCX0KIAotCXJldHVybiBvaGNpX2VuYWJsZSgmb2hjaS0+Y2FyZCwgTlVMTCwgMCk7CisJLyogU29tZSBzeXN0ZW1zIGRvbid0IHNldHVwIEdVSUQgcmVnaXN0ZXIgb24gcmVzdW1lIGZyb20gcmFtICAqLworCWlmICghcmVnX3JlYWQob2hjaSwgT0hDSTEzOTRfR1VJRExvKSAmJgorCQkJCQkhcmVnX3JlYWQob2hjaSwgT0hDSTEzOTRfR1VJREhpKSkgeworCQlyZWdfd3JpdGUob2hjaSwgT0hDSTEzOTRfR1VJRExvLCAodTMyKW9oY2ktPmNhcmQuZ3VpZCk7CisJCXJlZ193cml0ZShvaGNpLCBPSENJMTM5NF9HVUlESGksICh1MzIpKG9oY2ktPmNhcmQuZ3VpZCA+PiAzMikpOworCX0KKworCWVyciA9IG9oY2lfZW5hYmxlKCZvaGNpLT5jYXJkLCBOVUxMLCAwKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJb2hjaV9yZXN1bWVfaXNvX2RtYShvaGNpKTsKKworCXJldHVybiAwOwogfQogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fYWdwc3VwcG9ydC5jIGIvZHJpdmVycy9ncHUvZHJtL2RybV9hZ3BzdXBwb3J0LmMKaW5kZXggMjUyZmRiOS4uMGNiMmJhNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2RybV9hZ3BzdXBwb3J0LmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2RybV9hZ3BzdXBwb3J0LmMKQEAgLTQ2NiwxMCArNDY2LDQgQEAKIH0KIEVYUE9SVF9TWU1CT0woZHJtX2FncF9iaW5kX3BhZ2VzKTsKIAotdm9pZCBkcm1fYWdwX2NoaXBzZXRfZmx1c2goc3RydWN0IGRybV9kZXZpY2UgKmRldikKLXsKLQlhZ3BfZmx1c2hfY2hpcHNldChkZXYtPmFncC0+YnJpZGdlKTsKLX0KLUVYUE9SVF9TWU1CT0woZHJtX2FncF9jaGlwc2V0X2ZsdXNoKTsKLQogI2VuZGlmIC8qIF9fT1NfSEFTX0FHUCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2RybV9jcnRjX2hlbHBlci5jIGIvZHJpdmVycy9ncHUvZHJtL2RybV9jcnRjX2hlbHBlci5jCmluZGV4IDJkNGUxN2EuLjk1MmIzZDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fY3J0Y19oZWxwZXIuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2NydGNfaGVscGVyLmMKQEAgLTMzNiw3ICszMzYsNyBAQAogCQkJICAgICAgc3RydWN0IGRybV9mcmFtZWJ1ZmZlciAqb2xkX2ZiKQogewogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjcnRjLT5kZXY7Ci0Jc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKmFkanVzdGVkX21vZGUsIHNhdmVkX21vZGU7CisJc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKmFkanVzdGVkX21vZGUsIHNhdmVkX21vZGUsIHNhdmVkX2h3bW9kZTsKIAlzdHJ1Y3QgZHJtX2NydGNfaGVscGVyX2Z1bmNzICpjcnRjX2Z1bmNzID0gY3J0Yy0+aGVscGVyX3ByaXZhdGU7CiAJc3RydWN0IGRybV9lbmNvZGVyX2hlbHBlcl9mdW5jcyAqZW5jb2Rlcl9mdW5jczsKIAlpbnQgc2F2ZWRfeCwgc2F2ZWRfeTsKQEAgLTM1MCw2ICszNTAsNyBAQAogCWlmICghY3J0Yy0+ZW5hYmxlZCkKIAkJcmV0dXJuIHRydWU7CiAKKwlzYXZlZF9od21vZGUgPSBjcnRjLT5od21vZGU7CiAJc2F2ZWRfbW9kZSA9IGNydGMtPm1vZGU7CiAJc2F2ZWRfeCA9IGNydGMtPng7CiAJc2F2ZWRfeSA9IGNydGMtPnk7CkBAIC00MjcsMTEgKzQyOCwyMSBAQAogCiAJfQogCisJLyogU3RvcmUgcmVhbCBwb3N0LWFkanVzdG1lbnQgaGFyZHdhcmUgbW9kZS4gKi8KKwljcnRjLT5od21vZGUgPSAqYWRqdXN0ZWRfbW9kZTsKKworCS8qIENhbGN1bGF0ZSBhbmQgc3RvcmUgdmFyaW91cyBjb25zdGFudHMgd2hpY2gKKwkgKiBhcmUgbGF0ZXIgbmVlZGVkIGJ5IHZibGFuayBhbmQgc3dhcC1jb21wbGV0aW9uCisJICogdGltZXN0YW1waW5nLiBUaGV5IGFyZSBkZXJpdmVkIGZyb20gdHJ1ZSBod21vZGUuCisJICovCisJZHJtX2NhbGNfdGltZXN0YW1waW5nX2NvbnN0YW50cyhjcnRjKTsKKwogCS8qIFhYWCBmcmVlIGFkanVzdGVkbW9kZSAqLwogCWRybV9tb2RlX2Rlc3Ryb3koZGV2LCBhZGp1c3RlZF9tb2RlKTsKIAkvKiBGSVhNRTogYWRkIHN1YnBpeGVsIG9yZGVyICovCiBkb25lOgogCWlmICghcmV0KSB7CisJCWNydGMtPmh3bW9kZSA9IHNhdmVkX2h3bW9kZTsKIAkJY3J0Yy0+bW9kZSA9IHNhdmVkX21vZGU7CiAJCWNydGMtPnggPSBzYXZlZF94OwogCQljcnRjLT55ID0gc2F2ZWRfeTsKQEAgLTY1MCw2ICs2NjEsNyBAQAogCQkJCQkJICAgICAgb2xkX2ZiKSkgewogCQkJCURSTV9FUlJPUigiZmFpbGVkIHRvIHNldCBtb2RlIG9uIFtDUlRDOiVkXVxuIiwKIAkJCQkJICBzZXQtPmNydGMtPmJhc2UuaWQpOworCQkJCXNldC0+Y3J0Yy0+ZmIgPSBvbGRfZmI7CiAJCQkJcmV0ID0gLUVJTlZBTDsKIAkJCQlnb3RvIGZhaWw7CiAJCQl9CkBAIC02NjQsOCArNjc2LDEwIEBACiAJCQlzZXQtPmNydGMtPmZiID0gc2V0LT5mYjsKIAkJcmV0ID0gY3J0Y19mdW5jcy0+bW9kZV9zZXRfYmFzZShzZXQtPmNydGMsCiAJCQkJCQlzZXQtPngsIHNldC0+eSwgb2xkX2ZiKTsKLQkJaWYgKHJldCAhPSAwKQorCQlpZiAocmV0ICE9IDApIHsKKwkJCXNldC0+Y3J0Yy0+ZmIgPSBvbGRfZmI7CiAJCQlnb3RvIGZhaWw7CisJCX0KIAl9CiAJRFJNX0RFQlVHX0tNUygiU2V0dGluZyBjb25uZWN0b3IgRFBNUyBzdGF0ZSB0byBvblxuIik7CiAJZm9yIChpID0gMDsgaSA8IHNldC0+bnVtX2Nvbm5lY3RvcnM7IGkrKykgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2RybV9mYl9oZWxwZXIuYyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fZmJfaGVscGVyLmMKaW5kZXggZDI4NDllNC4uMDMwN2Q2MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2RybV9mYl9oZWxwZXIuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2ZiX2hlbHBlci5jCkBAIC02MDcsNiArNjA3LDI1IEBACiB9CiBFWFBPUlRfU1lNQk9MKGRybV9mYl9oZWxwZXJfZmluaSk7CiAKK3ZvaWQgZHJtX2ZiX2hlbHBlcl9maWxsX2ZpeChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgc3RydWN0IGRybV9mcmFtZWJ1ZmZlciAqZmIpCit7CisJaW5mby0+Zml4LnR5cGUgPSBGQl9UWVBFX1BBQ0tFRF9QSVhFTFM7CisJaW5mby0+Zml4LnZpc3VhbCA9IGZiLT5kZXB0aCA9PSA4ID8gRkJfVklTVUFMX1BTRVVET0NPTE9SIDoKKwkJRkJfVklTVUFMX1RSVUVDT0xPUjsKKwlpbmZvLT5maXgubW1pb19zdGFydCA9IDA7CisJaW5mby0+Zml4Lm1taW9fbGVuID0gMDsKKwlpbmZvLT5maXgudHlwZV9hdXggPSAwOworCWluZm8tPmZpeC54cGFuc3RlcCA9IDE7IC8qIGRvaW5nIGl0IGluIGh3ICovCisJaW5mby0+Zml4LnlwYW5zdGVwID0gMTsgLyogZG9pbmcgaXQgaW4gaHcgKi8KKwlpbmZvLT5maXgueXdyYXBzdGVwID0gMDsKKwlpbmZvLT5maXguYWNjZWwgPSBGQl9BQ0NFTF9OT05FOworCWluZm8tPmZpeC50eXBlX2F1eCA9IDA7CisKKwlpbmZvLT5maXgubGluZV9sZW5ndGggPSBmYi0+cGl0Y2g7CisJcmV0dXJuOworfQorRVhQT1JUX1NZTUJPTChkcm1fZmJfaGVscGVyX2ZpbGxfZml4KTsKKwogc3RhdGljIGludCBzZXRjb2xyZWcoc3RydWN0IGRybV9jcnRjICpjcnRjLCB1MTYgcmVkLCB1MTYgZ3JlZW4sCiAJCSAgICAgdTE2IGJsdWUsIHUxNiByZWdubywgc3RydWN0IGZiX2luZm8gKmluZm8pCiB7CkBAIC04MTYsNiArODM1LDcgQEAKIAkJCW11dGV4X3VubG9jaygmZGV2LT5tb2RlX2NvbmZpZy5tdXRleCk7CiAJCQlyZXR1cm4gcmV0OwogCQl9CisJCWRybV9mYl9oZWxwZXJfZmlsbF9maXgoaW5mbywgZmJfaGVscGVyLT5mYik7CiAJfQogCW11dGV4X3VubG9jaygmZGV2LT5tb2RlX2NvbmZpZy5tdXRleCk7CiAKQEAgLTk1Myw2ICs5NzMsNyBAQAogCiAJaWYgKG5ld19mYikgewogCQlpbmZvLT52YXIucGl4Y2xvY2sgPSAwOworCQlkcm1fZmJfaGVscGVyX2ZpbGxfZml4KGluZm8sIGZiX2hlbHBlci0+ZmIpOwogCQlpZiAocmVnaXN0ZXJfZnJhbWVidWZmZXIoaW5mbykgPCAwKSB7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQpAQCAtOTc5LDI0ICsxMDAwLDYgQEAKIH0KIEVYUE9SVF9TWU1CT0woZHJtX2ZiX2hlbHBlcl9zaW5nbGVfZmJfcHJvYmUpOwogCi12b2lkIGRybV9mYl9oZWxwZXJfZmlsbF9maXgoc3RydWN0IGZiX2luZm8gKmluZm8sIHVpbnQzMl90IHBpdGNoLAotCQkJICAgIHVpbnQzMl90IGRlcHRoKQotewotCWluZm8tPmZpeC50eXBlID0gRkJfVFlQRV9QQUNLRURfUElYRUxTOwotCWluZm8tPmZpeC52aXN1YWwgPSBkZXB0aCA9PSA4ID8gRkJfVklTVUFMX1BTRVVET0NPTE9SIDoKLQkJRkJfVklTVUFMX1RSVUVDT0xPUjsKLQlpbmZvLT5maXgudHlwZV9hdXggPSAwOwotCWluZm8tPmZpeC54cGFuc3RlcCA9IDE7IC8qIGRvaW5nIGl0IGluIGh3ICovCi0JaW5mby0+Zml4LnlwYW5zdGVwID0gMTsgLyogZG9pbmcgaXQgaW4gaHcgKi8KLQlpbmZvLT5maXgueXdyYXBzdGVwID0gMDsKLQlpbmZvLT5maXguYWNjZWwgPSBGQl9BQ0NFTF9OT05FOwotCWluZm8tPmZpeC50eXBlX2F1eCA9IDA7Ci0KLQlpbmZvLT5maXgubGluZV9sZW5ndGggPSBwaXRjaDsKLQlyZXR1cm47Ci19Ci1FWFBPUlRfU1lNQk9MKGRybV9mYl9oZWxwZXJfZmlsbF9maXgpOwotCiB2b2lkIGRybV9mYl9oZWxwZXJfZmlsbF92YXIoc3RydWN0IGZiX2luZm8gKmluZm8sIHN0cnVjdCBkcm1fZmJfaGVscGVyICpmYl9oZWxwZXIsCiAJCQkgICAgdWludDMyX3QgZmJfd2lkdGgsIHVpbnQzMl90IGZiX2hlaWdodCkKIHsKQEAgLTEwMDUsNiArMTAwOCw3IEBACiAJaW5mby0+dmFyLnhyZXNfdmlydHVhbCA9IGZiLT53aWR0aDsKIAlpbmZvLT52YXIueXJlc192aXJ0dWFsID0gZmItPmhlaWdodDsKIAlpbmZvLT52YXIuYml0c19wZXJfcGl4ZWwgPSBmYi0+Yml0c19wZXJfcGl4ZWw7CisJaW5mby0+dmFyLmFjY2VsX2ZsYWdzID0gRkJfQUNDRUxGX1RFWFQ7CiAJaW5mby0+dmFyLnhvZmZzZXQgPSAwOwogCWluZm8tPnZhci55b2Zmc2V0ID0gMDsKIAlpbmZvLT52YXIuYWN0aXZhdGUgPSBGQl9BQ1RJVkFURV9OT1c7CkBAIC0xNTMwLDMgKzE1MzQsMjQgQEAKIH0KIEVYUE9SVF9TWU1CT0woZHJtX2ZiX2hlbHBlcl9ob3RwbHVnX2V2ZW50KTsKIAorLyogVGhlIEtjb25maWcgRFJNX0tNU19IRUxQRVIgc2VsZWN0cyBGUkFNRUJVRkZFUl9DT05TT0xFIChpZiAhRU1CRURERUQpCisgKiBidXQgdGhlIG1vZHVsZSBkb2Vzbid0IGRlcGVuZCBvbiBhbnkgZmIgY29uc29sZSBzeW1ib2xzLiAgQXQgbGVhc3QKKyAqIGF0dGVtcHQgdG8gbG9hZCBmYmNvbiB0byBhdm9pZCBsZWF2aW5nIHRoZSBzeXN0ZW0gd2l0aG91dCBhIHVzYWJsZSBjb25zb2xlLgorICovCisjaWYgZGVmaW5lZChDT05GSUdfRlJBTUVCVUZGRVJfQ09OU09MRV9NT0RVTEUpICYmICFkZWZpbmVkKENPTkZJR19FTUJFRERFRCkKK3N0YXRpYyBpbnQgX19pbml0IGRybV9mYl9oZWxwZXJfbW9kaW5pdCh2b2lkKQoreworCWNvbnN0IGNoYXIgKm5hbWUgPSAiZmJjb24iOworCXN0cnVjdCBtb2R1bGUgKmZiY29uOworCisJbXV0ZXhfbG9jaygmbW9kdWxlX211dGV4KTsKKwlmYmNvbiA9IGZpbmRfbW9kdWxlKG5hbWUpOworCW11dGV4X3VubG9jaygmbW9kdWxlX211dGV4KTsKKworCWlmICghZmJjb24pCisJCXJlcXVlc3RfbW9kdWxlX25vd2FpdChuYW1lKTsKKwlyZXR1cm4gMDsKK30KKworbW9kdWxlX2luaXQoZHJtX2ZiX2hlbHBlcl9tb2Rpbml0KTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2RybV9mb3BzLmMgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2ZvcHMuYwppbmRleCBhMzk3OTRiLi4yZWM3ZDQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vZHJtX2ZvcHMuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2ZvcHMuYwpAQCAtMjM2LDYgKzIzNiw4IEBACiAJCXJldHVybiAtRUJVU1k7CS8qIE5vIGV4Y2x1c2l2ZSBvcGVucyAqLwogCWlmICghZHJtX2NwdV92YWxpZCgpKQogCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoZGV2LT5zd2l0Y2hfcG93ZXJfc3RhdGUgIT0gRFJNX1NXSVRDSF9QT1dFUl9PTikKKwkJcmV0dXJuIC1FSU5WQUw7CiAKIAlEUk1fREVCVUcoInBpZCA9ICVkLCBtaW5vciA9ICVkXG4iLCB0YXNrX3BpZF9ucihjdXJyZW50KSwgbWlub3JfaWQpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vZHJtX2lycS5jIGIvZHJpdmVycy9ncHUvZHJtL2RybV9pcnEuYwppbmRleCAxNmQ1MTU1Li4wMDU0ZTk1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vZHJtX2lycS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1faXJxLmMKQEAgLTQwLDYgKzQwLDIyIEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogCiAjaW5jbHVkZSA8bGludXgvdmdhYXJiLmg+CisKKy8qIEFjY2VzcyBtYWNybyBmb3Igc2xvdHMgaW4gdmJsYW5rIHRpbWVzdGFtcCByaW5nYnVmZmVyLiAqLworI2RlZmluZSB2Ymxhbmt0aW1lc3RhbXAoZGV2LCBjcnRjLCBjb3VudCkgKCBcCisJKGRldiktPl92YmxhbmtfdGltZVsoY3J0YykgKiBEUk1fVkJMQU5LVElNRV9SQlNJWkUgKyBcCisJKChjb3VudCkgJSBEUk1fVkJMQU5LVElNRV9SQlNJWkUpXSkKKworLyogUmV0cnkgdGltZXN0YW1wIGNhbGN1bGF0aW9uIHVwIHRvIDMgdGltZXMgdG8gc2F0aXNmeQorICogZHJtX3RpbWVzdGFtcF9wcmVjaXNpb24gYmVmb3JlIGdpdmluZyB1cC4KKyAqLworI2RlZmluZSBEUk1fVElNRVNUQU1QX01BWFJFVFJJRVMgMworCisvKiBUaHJlc2hvbGQgaW4gbmFub3NlY29uZHMgZm9yIGRldGVjdGlvbiBvZiByZWR1bmRhbnQKKyAqIHZibGFuayBpcnEgaW4gZHJtX2hhbmRsZV92YmxhbmsoKS4gMSBtc2VjIHNob3VsZCBiZSBvay4KKyAqLworI2RlZmluZSBEUk1fUkVEVU5EQU5UX1ZCTElSUV9USFJFU0hfTlMgMTAwMDAwMAorCiAvKioKICAqIEdldCBpbnRlcnJ1cHQgZnJvbSBidXMgaWQuCiAgKgpAQCAtNzcsNiArOTMsODcgQEAKIAlyZXR1cm4gMDsKIH0KIAorLyoKKyAqIENsZWFyIHZibGFuayB0aW1lc3RhbXAgYnVmZmVyIGZvciBhIGNydGMuCisgKi8KK3N0YXRpYyB2b2lkIGNsZWFyX3ZibGFua190aW1lc3RhbXBzKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBjcnRjKQoreworCW1lbXNldCgmZGV2LT5fdmJsYW5rX3RpbWVbY3J0YyAqIERSTV9WQkxBTktUSU1FX1JCU0laRV0sIDAsCisJCURSTV9WQkxBTktUSU1FX1JCU0laRSAqIHNpemVvZihzdHJ1Y3QgdGltZXZhbCkpOworfQorCisvKgorICogRGlzYWJsZSB2YmxhbmsgaXJxJ3Mgb24gY3J0YywgbWFrZSBzdXJlIHRoYXQgbGFzdCB2YmxhbmsgY291bnQKKyAqIG9mIGhhcmR3YXJlIGFuZCBjb3JyZXNwb25kaW5nIGNvbnNpc3RlbnQgc29mdHdhcmUgdmJsYW5rIGNvdW50ZXIKKyAqIGFyZSBwcmVzZXJ2ZWQsIGV2ZW4gaWYgdGhlcmUgYXJlIGFueSBzcHVyaW91cyB2YmxhbmsgaXJxJ3MgYWZ0ZXIKKyAqIGRpc2FibGUuCisgKi8KK3N0YXRpYyB2b2lkIHZibGFua19kaXNhYmxlX2FuZF9zYXZlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBjcnRjKQoreworCXVuc2lnbmVkIGxvbmcgaXJxZmxhZ3M7CisJdTMyIHZibGNvdW50OworCXM2NCBkaWZmX25zOworCWludCB2YmxyYzsKKwlzdHJ1Y3QgdGltZXZhbCB0dmJsYW5rOworCisJLyogUHJldmVudCB2YmxhbmsgaXJxIHByb2Nlc3Npbmcgd2hpbGUgZGlzYWJsaW5nIHZibGFuayBpcnFzLAorCSAqIHNvIG5vIHVwZGF0ZXMgb2YgdGltZXN0YW1wcyBvciBjb3VudCBjYW4gaGFwcGVuIGFmdGVyIHdlJ3ZlCisJICogZGlzYWJsZWQuIE5lZWRlZCB0byBwcmV2ZW50IHJhY2VzIGluIGNhc2Ugb2YgZGVsYXllZCBpcnEncy4KKwkgKiBEaXNhYmxlIHByZWVtcHRpb24sIHNvIHZibGFua190aW1lX2xvY2sgaXMgaGVsZCBhcyBzaG9ydCBhcworCSAqIHBvc3NpYmxlLCBldmVuIHVuZGVyIGEga2VybmVsIHdpdGggUFJFRU1QVF9SVCBwYXRjaGVzLgorCSAqLworCXByZWVtcHRfZGlzYWJsZSgpOworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPnZibGFua190aW1lX2xvY2ssIGlycWZsYWdzKTsKKworCWRldi0+ZHJpdmVyLT5kaXNhYmxlX3ZibGFuayhkZXYsIGNydGMpOworCWRldi0+dmJsYW5rX2VuYWJsZWRbY3J0Y10gPSAwOworCisJLyogTm8gZnVydGhlciB2YmxhbmsgaXJxJ3Mgd2lsbCBiZSBwcm9jZXNzZWQgYWZ0ZXIKKwkgKiB0aGlzIHBvaW50LiBHZXQgY3VycmVudCBoYXJkd2FyZSB2YmxhbmsgY291bnQgYW5kCisJICogdmJsYW5rIHRpbWVzdGFtcCwgcmVwZWF0IHVudGlsIHRoZXkgYXJlIGNvbnNpc3RlbnQuCisJICoKKwkgKiBGSVhNRTogVGhlcmUgaXMgc3RpbGwgYSByYWNlIGNvbmRpdGlvbiBoZXJlIGFuZCBpbgorCSAqIGRybV91cGRhdGVfdmJsYW5rX2NvdW50KCkgd2hpY2ggY2FuIGNhdXNlIG9mZi1ieS1vbmUKKwkgKiByZWluaXRpYWxpemF0aW9uIG9mIHNvZnR3YXJlIHZibGFuayBjb3VudGVyLiBJZiBncHUKKwkgKiB2YmxhbmsgY291bnRlciBkb2Vzbid0IGluY3JlbWVudCBleGFjdGx5IGF0IHRoZSBsZWFkaW5nCisJICogZWRnZSBvZiBhIHZibGFuayBpbnRlcnZhbCwgdGhlbiB3ZSBjYW4gbG9zZSAxIGNvdW50IGlmCisJICogd2UgaGFwcGVuIHRvIGV4ZWN1dGUgYmV0d2VlbiBzdGFydCBvZiB2YmxhbmsgYW5kIHRoZQorCSAqIGRlbGF5ZWQgZ3B1IGNvdW50ZXIgaW5jcmVtZW50LgorCSAqLworCWRvIHsKKwkJZGV2LT5sYXN0X3ZibGFua1tjcnRjXSA9IGRldi0+ZHJpdmVyLT5nZXRfdmJsYW5rX2NvdW50ZXIoZGV2LCBjcnRjKTsKKwkJdmJscmMgPSBkcm1fZ2V0X2xhc3RfdmJsdGltZXN0YW1wKGRldiwgY3J0YywgJnR2YmxhbmssIDApOworCX0gd2hpbGUgKGRldi0+bGFzdF92YmxhbmtbY3J0Y10gIT0gZGV2LT5kcml2ZXItPmdldF92YmxhbmtfY291bnRlcihkZXYsIGNydGMpKTsKKworCS8qIENvbXB1dGUgdGltZSBkaWZmZXJlbmNlIHRvIHN0b3JlZCB0aW1lc3RhbXAgb2YgbGFzdCB2YmxhbmsKKwkgKiBhcyB1cGRhdGVkIGJ5IGxhc3QgaW52b2NhdGlvbiBvZiBkcm1faGFuZGxlX3ZibGFuaygpIGluIHZibGFuayBpcnEuCisJICovCisJdmJsY291bnQgPSBhdG9taWNfcmVhZCgmZGV2LT5fdmJsYW5rX2NvdW50W2NydGNdKTsKKwlkaWZmX25zID0gdGltZXZhbF90b19ucygmdHZibGFuaykgLQorCQkgIHRpbWV2YWxfdG9fbnMoJnZibGFua3RpbWVzdGFtcChkZXYsIGNydGMsIHZibGNvdW50KSk7CisKKwkvKiBJZiB0aGVyZSBpcyBhdCBsZWFzdCAxIG1zZWMgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBsYXN0IHN0b3JlZAorCSAqIHRpbWVzdGFtcCBhbmQgdHZibGFuaywgdGhlbiB3ZSBhcmUgY3VycmVudGx5IGV4ZWN1dGluZyBvdXIKKwkgKiBkaXNhYmxlIGluc2lkZSBhIG5ldyB2YmxhbmsgaW50ZXJ2YWwsIHRoZSB0dmJsYW5rIHRpbWVzdGFtcAorCSAqIGNvcnJlc3BvbmRzIHRvIHRoaXMgbmV3IHZibGFuayBpbnRlcnZhbCBhbmQgdGhlIGlycSBoYW5kbGVyCisJICogZm9yIHRoaXMgdmJsYW5rIGRpZG4ndCBydW4geWV0IGFuZCB3b24ndCBydW4gZHVlIHRvIG91ciBkaXNhYmxlLgorCSAqIFRoZXJlZm9yZSB3ZSBuZWVkIHRvIGRvIHRoZSBqb2Igb2YgZHJtX2hhbmRsZV92YmxhbmsoKSBhbmQKKwkgKiBpbmNyZW1lbnQgdGhlIHZibGFuayBjb3VudGVyIGJ5IG9uZSB0byBhY2NvdW50IGZvciB0aGlzIHZibGFuay4KKwkgKgorCSAqIFNraXAgdGhpcyBzdGVwIGlmIHRoZXJlIGlzbid0IGFueSBoaWdoIHByZWNpc2lvbiB0aW1lc3RhbXAKKwkgKiBhdmFpbGFibGUuIEluIHRoYXQgY2FzZSB3ZSBjYW4ndCBhY2NvdW50IGZvciB0aGlzIGFuZCBqdXN0CisJICogaG9wZSBmb3IgdGhlIGJlc3QuCisJICovCisJaWYgKCh2YmxyYyA+IDApICYmIChhYnMoZGlmZl9ucykgPiAxMDAwMDAwKSkKKwkJYXRvbWljX2luYygmZGV2LT5fdmJsYW5rX2NvdW50W2NydGNdKTsKKworCS8qIEludmFsaWRhdGUgYWxsIHRpbWVzdGFtcHMgd2hpbGUgdmJsYW5rIGlycSdzIGFyZSBvZmYuICovCisJY2xlYXJfdmJsYW5rX3RpbWVzdGFtcHMoZGV2LCBjcnRjKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+dmJsYW5rX3RpbWVfbG9jaywgaXJxZmxhZ3MpOworCXByZWVtcHRfZW5hYmxlKCk7Cit9CisKIHN0YXRpYyB2b2lkIHZibGFua19kaXNhYmxlX2ZuKHVuc2lnbmVkIGxvbmcgYXJnKQogewogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSAoc3RydWN0IGRybV9kZXZpY2UgKilhcmc7CkBAIC05MSwxMCArMTg4LDcgQEAKIAkJaWYgKGF0b21pY19yZWFkKCZkZXYtPnZibGFua19yZWZjb3VudFtpXSkgPT0gMCAmJgogCQkgICAgZGV2LT52YmxhbmtfZW5hYmxlZFtpXSkgewogCQkJRFJNX0RFQlVHKCJkaXNhYmxpbmcgdmJsYW5rIG9uIGNydGMgJWRcbiIsIGkpOwotCQkJZGV2LT5sYXN0X3ZibGFua1tpXSA9Ci0JCQkJZGV2LT5kcml2ZXItPmdldF92YmxhbmtfY291bnRlcihkZXYsIGkpOwotCQkJZGV2LT5kcml2ZXItPmRpc2FibGVfdmJsYW5rKGRldiwgaSk7Ci0JCQlkZXYtPnZibGFua19lbmFibGVkW2ldID0gMDsKKwkJCXZibGFua19kaXNhYmxlX2FuZF9zYXZlKGRldiwgaSk7CiAJCX0KIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT52YmxfbG9jaywgaXJxZmxhZ3MpOwogCX0KQEAgLTExNyw2ICsyMTEsNyBAQAogCWtmcmVlKGRldi0+bGFzdF92YmxhbmspOwogCWtmcmVlKGRldi0+bGFzdF92Ymxhbmtfd2FpdCk7CiAJa2ZyZWUoZGV2LT52YmxhbmtfaW5tb2Rlc2V0KTsKKwlrZnJlZShkZXYtPl92YmxhbmtfdGltZSk7CiAKIAlkZXYtPm51bV9jcnRjcyA9IDA7CiB9CkBAIC0xMjksNiArMjI0LDggQEAKIAlzZXR1cF90aW1lcigmZGV2LT52YmxhbmtfZGlzYWJsZV90aW1lciwgdmJsYW5rX2Rpc2FibGVfZm4sCiAJCSAgICAodW5zaWduZWQgbG9uZylkZXYpOwogCXNwaW5fbG9ja19pbml0KCZkZXYtPnZibF9sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmZGV2LT52YmxhbmtfdGltZV9sb2NrKTsKKwogCWRldi0+bnVtX2NydGNzID0gbnVtX2NydGNzOwogCiAJZGV2LT52YmxfcXVldWUgPSBrbWFsbG9jKHNpemVvZih3YWl0X3F1ZXVlX2hlYWRfdCkgKiBudW1fY3J0Y3MsCkBAIC0xNjEsNiArMjU4LDE5IEBACiAJaWYgKCFkZXYtPnZibGFua19pbm1vZGVzZXQpCiAJCWdvdG8gZXJyOwogCisJZGV2LT5fdmJsYW5rX3RpbWUgPSBrY2FsbG9jKG51bV9jcnRjcyAqIERSTV9WQkxBTktUSU1FX1JCU0laRSwKKwkJCQkgICAgc2l6ZW9mKHN0cnVjdCB0aW1ldmFsKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkZXYtPl92YmxhbmtfdGltZSkKKwkJZ290byBlcnI7CisKKwlEUk1fSU5GTygiU3VwcG9ydHMgdmJsYW5rIHRpbWVzdGFtcCBjYWNoaW5nIFJldiAxICgxMC4xMC4yMDEwKS5cbiIpOworCisJLyogRHJpdmVyIHNwZWNpZmljIGhpZ2gtcHJlY2lzaW9uIHZibGFuayB0aW1lc3RhbXBpbmcgc3VwcG9ydGVkPyAqLworCWlmIChkZXYtPmRyaXZlci0+Z2V0X3ZibGFua190aW1lc3RhbXApCisJCURSTV9JTkZPKCJEcml2ZXIgc3VwcG9ydHMgcHJlY2lzZSB2YmxhbmsgdGltZXN0YW1wIHF1ZXJ5LlxuIik7CisJZWxzZQorCQlEUk1fSU5GTygiTm8gZHJpdmVyIHN1cHBvcnQgZm9yIHZibGFuayB0aW1lc3RhbXAgcXVlcnkuXG4iKTsKKwogCS8qIFplcm8gcGVyLWNydGMgdmJsYW5rIHN0dWZmICovCiAJZm9yIChpID0gMDsgaSA8IG51bV9jcnRjczsgaSsrKSB7CiAJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmRldi0+dmJsX3F1ZXVlW2ldKTsKQEAgLTI3OSw3ICszODksNyBAQAogICoKICAqIENhbGxzIHRoZSBkcml2ZXIncyBcYyBkcm1fZHJpdmVyX2lycV91bmluc3RhbGwoKSBmdW5jdGlvbiwgYW5kIHN0b3BzIHRoZSBpcnEuCiAgKi8KLWludCBkcm1faXJxX3VuaW5zdGFsbChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKK2ludCBkcm1faXJxX3VuaW5zdGFsbChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogewogCXVuc2lnbmVkIGxvbmcgaXJxZmxhZ3M7CiAJaW50IGlycV9lbmFibGVkLCBpOwpAQCAtMzM1LDcgKzQ0NSw5IEBACiB7CiAJc3RydWN0IGRybV9jb250cm9sICpjdGwgPSBkYXRhOwogCi0JLyogaWYgd2UgaGF2ZW4ndCBpcnEgd2UgZmFsbGJhY2sgZm9yIGNvbXBhdGliaWxpdHkgcmVhc29ucyAtIHRoaXMgdXNlZCB0byBiZSBhIHNlcGFyYXRlIGZ1bmN0aW9uIGluIGRybV9kbWEuaCAqLworCS8qIGlmIHdlIGhhdmVuJ3QgaXJxIHdlIGZhbGxiYWNrIGZvciBjb21wYXRpYmlsaXR5IHJlYXNvbnMgLQorCSAqIHRoaXMgdXNlZCB0byBiZSBhIHNlcGFyYXRlIGZ1bmN0aW9uIGluIGRybV9kbWEuaAorCSAqLwogCiAKIAlzd2l0Y2ggKGN0bC0+ZnVuYykgewpAQCAtMzYwLDYgKzQ3MiwyODcgQEAKIH0KIAogLyoqCisgKiBkcm1fY2FsY190aW1lc3RhbXBpbmdfY29uc3RhbnRzIC0gQ2FsY3VsYXRlIGFuZAorICogc3RvcmUgdmFyaW91cyBjb25zdGFudHMgd2hpY2ggYXJlIGxhdGVyIG5lZWRlZCBieQorICogdmJsYW5rIGFuZCBzd2FwLWNvbXBsZXRpb24gdGltZXN0YW1waW5nLCBlLmcsIGJ5CisgKiBkcm1fY2FsY192Ymx0aW1lc3RhbXBfZnJvbV9zY2Fub3V0cG9zKCkuCisgKiBUaGV5IGFyZSBkZXJpdmVkIGZyb20gY3J0YydzIHRydWUgc2Nhbm91dCB0aW1pbmcsCisgKiBzbyB0aGV5IHRha2UgdGhpbmdzIGxpa2UgcGFuZWwgc2NhbGluZyBvciBvdGhlcgorICogYWRqdXN0bWVudHMgaW50byBhY2NvdW50LgorICoKKyAqIEBjcnRjIGRybV9jcnRjIHdob3NlIHRpbWVzdGFtcCBjb25zdGFudHMgc2hvdWxkIGJlIHVwZGF0ZWQuCisgKgorICovCit2b2lkIGRybV9jYWxjX3RpbWVzdGFtcGluZ19jb25zdGFudHMoc3RydWN0IGRybV9jcnRjICpjcnRjKQoreworCXM2NCBsaW5lZHVyX25zID0gMCwgcGl4ZWxkdXJfbnMgPSAwLCBmcmFtZWR1cl9ucyA9IDA7CisJdTY0IGRvdGNsb2NrOworCisJLyogRG90IGNsb2NrIGluIEh6OiAqLworCWRvdGNsb2NrID0gKHU2NCkgY3J0Yy0+aHdtb2RlLmNsb2NrICogMTAwMDsKKworCS8qIFZhbGlkIGRvdGNsb2NrPyAqLworCWlmIChkb3RjbG9jayA+IDApIHsKKwkJLyogQ29udmVydCBzY2FubGluZSBsZW5ndGggaW4gcGl4ZWxzIGFuZCB2aWRlbyBkb3QgY2xvY2sgdG8KKwkJICogbGluZSBkdXJhdGlvbiwgZnJhbWUgZHVyYXRpb24gYW5kIHBpeGVsIGR1cmF0aW9uIGluCisJCSAqIG5hbm9zZWNvbmRzOgorCQkgKi8KKwkJcGl4ZWxkdXJfbnMgPSAoczY0KSBkaXY2NF91NjQoMTAwMDAwMDAwMCwgZG90Y2xvY2spOworCQlsaW5lZHVyX25zICA9IChzNjQpIGRpdjY0X3U2NCgoKHU2NCkgY3J0Yy0+aHdtb2RlLmNydGNfaHRvdGFsICoKKwkJCQkJICAgICAgMTAwMDAwMDAwMCksIGRvdGNsb2NrKTsKKwkJZnJhbWVkdXJfbnMgPSAoczY0KSBjcnRjLT5od21vZGUuY3J0Y192dG90YWwgKiBsaW5lZHVyX25zOworCX0gZWxzZQorCQlEUk1fRVJST1IoImNydGMgJWQ6IENhbid0IGNhbGN1bGF0ZSBjb25zdGFudHMsIGRvdGNsb2NrID0gMCFcbiIsCisJCQkgIGNydGMtPmJhc2UuaWQpOworCisJY3J0Yy0+cGl4ZWxkdXJfbnMgPSBwaXhlbGR1cl9uczsKKwljcnRjLT5saW5lZHVyX25zICA9IGxpbmVkdXJfbnM7CisJY3J0Yy0+ZnJhbWVkdXJfbnMgPSBmcmFtZWR1cl9uczsKKworCURSTV9ERUJVRygiY3J0YyAlZDogaHdtb2RlOiBodG90YWwgJWQsIHZ0b3RhbCAlZCwgdmRpc3BsYXkgJWRcbiIsCisJCSAgY3J0Yy0+YmFzZS5pZCwgY3J0Yy0+aHdtb2RlLmNydGNfaHRvdGFsLAorCQkgIGNydGMtPmh3bW9kZS5jcnRjX3Z0b3RhbCwgY3J0Yy0+aHdtb2RlLmNydGNfdmRpc3BsYXkpOworCURSTV9ERUJVRygiY3J0YyAlZDogY2xvY2sgJWQga0h6IGZyYW1lZHVyICVkIGxpbmVkdXIgJWQsIHBpeGVsZHVyICVkXG4iLAorCQkgIGNydGMtPmJhc2UuaWQsIChpbnQpIGRvdGNsb2NrLzEwMDAsIChpbnQpIGZyYW1lZHVyX25zLAorCQkgIChpbnQpIGxpbmVkdXJfbnMsIChpbnQpIHBpeGVsZHVyX25zKTsKK30KK0VYUE9SVF9TWU1CT0woZHJtX2NhbGNfdGltZXN0YW1waW5nX2NvbnN0YW50cyk7CisKKy8qKgorICogZHJtX2NhbGNfdmJsdGltZXN0YW1wX2Zyb21fc2Nhbm91dHBvcyAtIGhlbHBlciByb3V0aW5lIGZvciBrbXMKKyAqIGRyaXZlcnMuIEltcGxlbWVudHMgY2FsY3VsYXRpb24gb2YgZXhhY3QgdmJsYW5rIHRpbWVzdGFtcHMgZnJvbQorICogZ2l2ZW4gZHJtX2Rpc3BsYXlfbW9kZSB0aW1pbmdzIGFuZCBjdXJyZW50IHZpZGVvIHNjYW5vdXQgcG9zaXRpb24KKyAqIG9mIGEgY3J0Yy4gVGhpcyBjYW4gYmUgY2FsbGVkIGZyb20gd2l0aGluIGdldF92YmxhbmtfdGltZXN0YW1wKCkKKyAqIGltcGxlbWVudGF0aW9uIG9mIGEga21zIGRyaXZlciB0byBpbXBsZW1lbnQgdGhlIGFjdHVhbCB0aW1lc3RhbXBpbmcuCisgKgorICogU2hvdWxkIHJldHVybiB0aW1lc3RhbXBzIGNvbmZvcm1pbmcgdG8gdGhlIE9NTF9zeW5jX2NvbnRyb2wgT3Blbk1MCisgKiBleHRlbnNpb24gc3BlY2lmaWNhdGlvbi4gVGhlIHRpbWVzdGFtcCBjb3JyZXNwb25kcyB0byB0aGUgZW5kIG9mCisgKiB0aGUgdmJsYW5rIGludGVydmFsLCBha2Egc3RhcnQgb2Ygc2Nhbm91dCBvZiB0b3Btb3N0LWxlZnRtb3N0IGRpc3BsYXkKKyAqIHBpeGVsIGluIHRoZSBmb2xsb3dpbmcgdmlkZW8gZnJhbWUuCisgKgorICogUmVxdWlyZXMgc3VwcG9ydCBmb3Igb3B0aW9uYWwgZGV2LT5kcml2ZXItPmdldF9zY2Fub3V0X3Bvc2l0aW9uKCkKKyAqIGluIGttcyBkcml2ZXIsIHBsdXMgYSBiaXQgb2Ygc2V0dXAgY29kZSB0byBwcm92aWRlIGEgZHJtX2Rpc3BsYXlfbW9kZQorICogdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgdHJ1ZSBzY2Fub3V0IHRpbWluZy4KKyAqCisgKiBUaGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBvbmx5IGhhbmRsZXMgc3RhbmRhcmQgdmlkZW8gbW9kZXMuIEl0CisgKiByZXR1cm5zIGFzIG5vIG9wZXJhdGlvbiBpZiBhIGRvdWJsZXNjYW4gb3IgaW50ZXJsYWNlZCB2aWRlbyBtb2RlIGlzCisgKiBhY3RpdmUuIEhpZ2hlciBsZXZlbCBjb2RlIGlzIGV4cGVjdGVkIHRvIGhhbmRsZSB0aGlzLgorICoKKyAqIEBkZXY6IERSTSBkZXZpY2UuCisgKiBAY3J0YzogV2hpY2ggY3J0YydzIHZibGFuayB0aW1lc3RhbXAgdG8gcmV0cmlldmUuCisgKiBAbWF4X2Vycm9yOiBEZXNpcmVkIG1heGltdW0gYWxsb3dhYmxlIGVycm9yIGluIHRpbWVzdGFtcHMgKG5hbm9zZWNzKS4KKyAqICAgICAgICAgICAgIE9uIHJldHVybiBjb250YWlucyB0cnVlIG1heGltdW0gZXJyb3Igb2YgdGltZXN0YW1wLgorICogQHZibGFua190aW1lOiBQb2ludGVyIHRvIHN0cnVjdCB0aW1ldmFsIHdoaWNoIHNob3VsZCByZWNlaXZlIHRoZSB0aW1lc3RhbXAuCisgKiBAZmxhZ3M6IEZsYWdzIHRvIHBhc3MgdG8gZHJpdmVyOgorICogICAgICAgICAwID0gRGVmYXVsdC4KKyAqICAgICAgICAgRFJNX0NBTExFRF9GUk9NX1ZCTElSUSA9IElmIGZ1bmN0aW9uIGlzIGNhbGxlZCBmcm9tIHZibCBpcnEgaGFuZGxlci4KKyAqIEByZWZjcnRjOiBkcm1fY3J0Yyogb2YgY3J0YyB3aGljaCBkZWZpbmVzIHNjYW5vdXQgdGltaW5nLgorICoKKyAqIFJldHVybnMgbmVnYXRpdmUgdmFsdWUgb24gZXJyb3IsIGZhaWx1cmUgb3IgaWYgbm90IHN1cHBvcnRlZCBpbiBjdXJyZW50CisgKiB2aWRlbyBtb2RlOgorICoKKyAqIC1FSU5WQUwgICAtIEludmFsaWQgY3J0Yy4KKyAqIC1FQUdBSU4gICAtIFRlbXBvcmFyeSB1bmF2YWlsYWJsZSwgZS5nLiwgY2FsbGVkIGJlZm9yZSBpbml0aWFsIG1vZGVzZXQuCisgKiAtRU5PVFNVUFAgLSBGdW5jdGlvbiBub3Qgc3VwcG9ydGVkIGluIGN1cnJlbnQgZGlzcGxheSBtb2RlLgorICogLUVJTyAgICAgIC0gRmFpbGVkLCBlLmcuLCBkdWUgdG8gZmFpbGVkIHNjYW5vdXQgcG9zaXRpb24gcXVlcnkuCisgKgorICogUmV0dXJucyBvcidlZCBwb3NpdGl2ZSBzdGF0dXMgZmxhZ3Mgb24gc3VjY2VzczoKKyAqCisgKiBEUk1fVkJMQU5LVElNRV9TQ0FOT1VUUE9TX01FVEhPRCAtIFNpZ25hbCB0aGlzIG1ldGhvZCB1c2VkIGZvciB0aW1lc3RhbXBpbmcuCisgKiBEUk1fVkJMQU5LVElNRV9JTlZCTCAtIFRpbWVzdGFtcCB0YWtlbiB3aGlsZSBzY2Fub3V0IHdhcyBpbiB2YmxhbmsgaW50ZXJ2YWwuCisgKgorICovCitpbnQgZHJtX2NhbGNfdmJsdGltZXN0YW1wX2Zyb21fc2Nhbm91dHBvcyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgY3J0YywKKwkJCQkJICBpbnQgKm1heF9lcnJvciwKKwkJCQkJICBzdHJ1Y3QgdGltZXZhbCAqdmJsYW5rX3RpbWUsCisJCQkJCSAgdW5zaWduZWQgZmxhZ3MsCisJCQkJCSAgc3RydWN0IGRybV9jcnRjICpyZWZjcnRjKQoreworCXN0cnVjdCB0aW1ldmFsIHN0aW1lLCByYXdfdGltZTsKKwlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZTsKKwlpbnQgdmJsX3N0YXR1cywgdnRvdGFsLCB2ZGlzcGxheTsKKwlpbnQgdnBvcywgaHBvcywgaTsKKwlzNjQgZnJhbWVkdXJfbnMsIGxpbmVkdXJfbnMsIHBpeGVsZHVyX25zLCBkZWx0YV9ucywgZHVyYXRpb25fbnM7CisJYm9vbCBpbnZibDsKKworCWlmIChjcnRjIDwgMCB8fCBjcnRjID49IGRldi0+bnVtX2NydGNzKSB7CisJCURSTV9FUlJPUigiSW52YWxpZCBjcnRjICVkXG4iLCBjcnRjKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogU2Nhbm91dCBwb3NpdGlvbiBxdWVyeSBub3Qgc3VwcG9ydGVkPyBTaG91bGQgbm90IGhhcHBlbi4gKi8KKwlpZiAoIWRldi0+ZHJpdmVyLT5nZXRfc2Nhbm91dF9wb3NpdGlvbikgeworCQlEUk1fRVJST1IoIkNhbGxlZCBmcm9tIGRyaXZlciB3L28gZ2V0X3NjYW5vdXRfcG9zaXRpb24oKSE/XG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJbW9kZSA9ICZyZWZjcnRjLT5od21vZGU7CisJdnRvdGFsID0gbW9kZS0+Y3J0Y192dG90YWw7CisJdmRpc3BsYXkgPSBtb2RlLT5jcnRjX3ZkaXNwbGF5OworCisJLyogRHVyYXRpb25zIG9mIGZyYW1lcywgbGluZXMsIHBpeGVscyBpbiBuYW5vc2Vjb25kcy4gKi8KKwlmcmFtZWR1cl9ucyA9IHJlZmNydGMtPmZyYW1lZHVyX25zOworCWxpbmVkdXJfbnMgID0gcmVmY3J0Yy0+bGluZWR1cl9uczsKKwlwaXhlbGR1cl9ucyA9IHJlZmNydGMtPnBpeGVsZHVyX25zOworCisJLyogSWYgbW9kZSB0aW1pbmcgdW5kZWZpbmVkLCBqdXN0IHJldHVybiBhcyBuby1vcDoKKwkgKiBIYXBwZW5zIGR1cmluZyBpbml0aWFsIG1vZGVzZXR0aW5nIG9mIGEgY3J0Yy4KKwkgKi8KKwlpZiAodnRvdGFsIDw9IDAgfHwgdmRpc3BsYXkgPD0gMCB8fCBmcmFtZWR1cl9ucyA9PSAwKSB7CisJCURSTV9ERUJVRygiY3J0YyAlZDogTm9vcCBkdWUgdG8gdW5pbml0aWFsaXplZCBtb2RlLlxuIiwgY3J0Yyk7CisJCXJldHVybiAtRUFHQUlOOworCX0KKworCS8qIERvbid0IGtub3cgeWV0IGhvdyB0byBoYW5kbGUgaW50ZXJsYWNlZCBvcgorCSAqIGRvdWJsZSBzY2FuIG1vZGVzLiBKdXN0IG5vLW9wIGZvciBub3cuCisJICovCisJaWYgKG1vZGUtPmZsYWdzICYgKERSTV9NT0RFX0ZMQUdfSU5URVJMQUNFIHwgRFJNX01PREVfRkxBR19EQkxTQ0FOKSkgeworCQlEUk1fREVCVUcoImNydGMgJWQ6IE5vb3AgZHVlIHRvIHVuc3VwcG9ydGVkIG1vZGUuXG4iLCBjcnRjKTsKKwkJcmV0dXJuIC1FTk9UU1VQUDsKKwl9CisKKwkvKiBHZXQgY3VycmVudCBzY2Fub3V0IHBvc2l0aW9uIHdpdGggc3lzdGVtIHRpbWVzdGFtcC4KKwkgKiBSZXBlYXQgcXVlcnkgdXAgdG8gRFJNX1RJTUVTVEFNUF9NQVhSRVRSSUVTIHRpbWVzCisJICogaWYgc2luZ2xlIHF1ZXJ5IHRha2VzIGxvbmdlciB0aGFuIG1heF9lcnJvciBuYW5vc2Vjb25kcy4KKwkgKgorCSAqIFRoaXMgZ3VhcmFudGVlcyBhIHRpZ2h0IGJvdW5kIG9uIG1heGltdW0gZXJyb3IgaWYKKwkgKiBjb2RlIGdldHMgcHJlZW1wdGVkIG9yIGRlbGF5ZWQgZm9yIHNvbWUgcmVhc29uLgorCSAqLworCWZvciAoaSA9IDA7IGkgPCBEUk1fVElNRVNUQU1QX01BWFJFVFJJRVM7IGkrKykgeworCQkvKiBEaXNhYmxlIHByZWVtcHRpb24gdG8gbWFrZSBpdCB2ZXJ5IGxpa2VseSB0bworCQkgKiBzdWNjZWVkIGluIHRoZSBmaXJzdCBpdGVyYXRpb24gZXZlbiBvbiBQUkVFTVBUX1JUIGtlcm5lbC4KKwkJICovCisJCXByZWVtcHRfZGlzYWJsZSgpOworCisJCS8qIEdldCBzeXN0ZW0gdGltZXN0YW1wIGJlZm9yZSBxdWVyeS4gKi8KKwkJZG9fZ2V0dGltZW9mZGF5KCZzdGltZSk7CisKKwkJLyogR2V0IHZlcnRpY2FsIGFuZCBob3Jpem9udGFsIHNjYW5vdXQgcG9zLiB2cG9zLCBocG9zLiAqLworCQl2Ymxfc3RhdHVzID0gZGV2LT5kcml2ZXItPmdldF9zY2Fub3V0X3Bvc2l0aW9uKGRldiwgY3J0YywgJnZwb3MsICZocG9zKTsKKworCQkvKiBHZXQgc3lzdGVtIHRpbWVzdGFtcCBhZnRlciBxdWVyeS4gKi8KKwkJZG9fZ2V0dGltZW9mZGF5KCZyYXdfdGltZSk7CisKKwkJcHJlZW1wdF9lbmFibGUoKTsKKworCQkvKiBSZXR1cm4gYXMgbm8tb3AgaWYgc2Nhbm91dCBxdWVyeSB1bnN1cHBvcnRlZCBvciBmYWlsZWQuICovCisJCWlmICghKHZibF9zdGF0dXMgJiBEUk1fU0NBTk9VVFBPU19WQUxJRCkpIHsKKwkJCURSTV9ERUJVRygiY3J0YyAlZCA6IHNjYW5vdXRwb3MgcXVlcnkgZmFpbGVkIFslZF0uXG4iLAorCQkJCSAgY3J0YywgdmJsX3N0YXR1cyk7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCisJCWR1cmF0aW9uX25zID0gdGltZXZhbF90b19ucygmcmF3X3RpbWUpIC0gdGltZXZhbF90b19ucygmc3RpbWUpOworCisJCS8qIEFjY2VwdCByZXN1bHQgd2l0aCA8ICBtYXhfZXJyb3IgbnNlY3MgdGltaW5nIHVuY2VydGFpbnR5LiAqLworCQlpZiAoZHVyYXRpb25fbnMgPD0gKHM2NCkgKm1heF9lcnJvcikKKwkJCWJyZWFrOworCX0KKworCS8qIE5vaXN5IHN5c3RlbSB0aW1pbmc/ICovCisJaWYgKGkgPT0gRFJNX1RJTUVTVEFNUF9NQVhSRVRSSUVTKSB7CisJCURSTV9ERUJVRygiY3J0YyAlZDogTm9pc3kgdGltZXN0YW1wICVkIHVzID4gJWQgdXMgWyVkIHJlcHNdLlxuIiwKKwkJCSAgY3J0YywgKGludCkgZHVyYXRpb25fbnMvMTAwMCwgKm1heF9lcnJvci8xMDAwLCBpKTsKKwl9CisKKwkvKiBSZXR1cm4gdXBwZXIgYm91bmQgb2YgdGltZXN0YW1wIHByZWNpc2lvbiBlcnJvci4gKi8KKwkqbWF4X2Vycm9yID0gKGludCkgZHVyYXRpb25fbnM7CisKKwkvKiBDaGVjayBpZiBpbiB2YmxhbmsgYXJlYToKKwkgKiB2cG9zIGlzID49MCBpbiB2aWRlbyBzY2Fub3V0IGFyZWEsIGJ1dCBuZWdhdGl2ZQorCSAqIHdpdGhpbiB2YmxhbmsgYXJlYSwgY291bnRpbmcgZG93biB0aGUgbnVtYmVyIG9mIGxpbmVzIHVudGlsCisJICogc3RhcnQgb2Ygc2Nhbm91dC4KKwkgKi8KKwlpbnZibCA9IHZibF9zdGF0dXMgJiBEUk1fU0NBTk9VVFBPU19JTlZCTDsKKworCS8qIENvbnZlcnQgc2Nhbm91dCBwb3NpdGlvbiBpbnRvIGVsYXBzZWQgdGltZSBhdCByYXdfdGltZSBxdWVyeQorCSAqIHNpbmNlIHN0YXJ0IG9mIHNjYW5vdXQgYXQgZmlyc3QgZGlzcGxheSBzY2FubGluZS4gZGVsdGFfbnMKKwkgKiBjYW4gYmUgbmVnYXRpdmUgaWYgc3RhcnQgb2Ygc2Nhbm91dCBoYXNuJ3QgaGFwcGVuZWQgeWV0LgorCSAqLworCWRlbHRhX25zID0gKHM2NCkgdnBvcyAqIGxpbmVkdXJfbnMgKyAoczY0KSBocG9zICogcGl4ZWxkdXJfbnM7CisKKwkvKiBJcyB2cG9zIG91dHNpZGUgbm9taW5hbCB2YmxhbmsgYXJlYSwgYnV0IGxlc3MgdGhhbgorCSAqIDEvMTAwIG9mIGEgZnJhbWUgaGVpZ2h0IGF3YXkgZnJvbSBzdGFydCBvZiB2Ymxhbms/CisJICogSWYgc28sIGFzc3VtZSB0aGlzIGlzbid0IGEgbWFzc2l2ZWx5IGRlbGF5ZWQgdmJsYW5rCisJICogaW50ZXJydXB0LCBidXQgYSB2YmxhbmsgaW50ZXJydXB0IHRoYXQgZmlyZWQgYSBmZXcKKwkgKiBtaWNyb3NlY29uZHMgYmVmb3JlIHRydWUgc3RhcnQgb2YgdmJsYW5rLiBDb21wZW5zYXRlCisJICogYnkgYWRkaW5nIGEgZnVsbCBmcmFtZSBkdXJhdGlvbiB0byB0aGUgZmluYWwgdGltZXN0YW1wLgorCSAqIEhhcHBlbnMsIGUuZy4sIG9uIEFUSSBSNTAwLCBSNjAwLgorCSAqCisJICogV2Ugb25seSBkbyB0aGlzIGlmIERSTV9DQUxMRURfRlJPTV9WQkxJUlEuCisJICovCisJaWYgKChmbGFncyAmIERSTV9DQUxMRURfRlJPTV9WQkxJUlEpICYmICFpbnZibCAmJgorCSAgICAoKHZkaXNwbGF5IC0gdnBvcykgPCB2dG90YWwgLyAxMDApKSB7CisJCWRlbHRhX25zID0gZGVsdGFfbnMgLSBmcmFtZWR1cl9uczsKKworCQkvKiBTaWduYWwgdGhpcyBjb3JyZWN0aW9uIGFzICJhcHBsaWVkIi4gKi8KKwkJdmJsX3N0YXR1cyB8PSAweDg7CisJfQorCisJLyogU3VidHJhY3QgdGltZSBkZWx0YSBmcm9tIHJhdyB0aW1lc3RhbXAgdG8gZ2V0IGZpbmFsCisJICogdmJsYW5rX3RpbWUgdGltZXN0YW1wIGZvciBlbmQgb2YgdmJsYW5rLgorCSAqLworCSp2YmxhbmtfdGltZSA9IG5zX3RvX3RpbWV2YWwodGltZXZhbF90b19ucygmcmF3X3RpbWUpIC0gZGVsdGFfbnMpOworCisJRFJNX0RFQlVHKCJjcnRjICVkIDogdiAlZCBwKCVkLCVkKUAgJWQuJWQgLT4gJWQuJWQgW2UgJWQgdXMsICVkIHJlcF1cbiIsCisJCSAgY3J0YywgKGludCkgdmJsX3N0YXR1cywgaHBvcywgdnBvcywgcmF3X3RpbWUudHZfc2VjLAorCQkgIHJhd190aW1lLnR2X3VzZWMsIHZibGFua190aW1lLT50dl9zZWMsIHZibGFua190aW1lLT50dl91c2VjLAorCQkgIChpbnQpIGR1cmF0aW9uX25zLzEwMDAsIGkpOworCisJdmJsX3N0YXR1cyA9IERSTV9WQkxBTktUSU1FX1NDQU5PVVRQT1NfTUVUSE9EOworCWlmIChpbnZibCkKKwkJdmJsX3N0YXR1cyB8PSBEUk1fVkJMQU5LVElNRV9JTlZCTDsKKworCXJldHVybiB2Ymxfc3RhdHVzOworfQorRVhQT1JUX1NZTUJPTChkcm1fY2FsY192Ymx0aW1lc3RhbXBfZnJvbV9zY2Fub3V0cG9zKTsKKworLyoqCisgKiBkcm1fZ2V0X2xhc3RfdmJsdGltZXN0YW1wIC0gcmV0cmlldmUgcmF3IHRpbWVzdGFtcCBmb3IgdGhlIG1vc3QgcmVjZW50CisgKiB2YmxhbmsgaW50ZXJ2YWwuCisgKgorICogQGRldjogRFJNIGRldmljZQorICogQGNydGM6IHdoaWNoIGNydGMncyB2YmxhbmsgdGltZXN0YW1wIHRvIHJldHJpZXZlCisgKiBAdHZibGFuazogUG9pbnRlciB0byB0YXJnZXQgc3RydWN0IHRpbWV2YWwgd2hpY2ggc2hvdWxkIHJlY2VpdmUgdGhlIHRpbWVzdGFtcAorICogQGZsYWdzOiBGbGFncyB0byBwYXNzIHRvIGRyaXZlcjoKKyAqICAgICAgICAgMCA9IERlZmF1bHQuCisgKiAgICAgICAgIERSTV9DQUxMRURfRlJPTV9WQkxJUlEgPSBJZiBmdW5jdGlvbiBpcyBjYWxsZWQgZnJvbSB2YmwgaXJxIGhhbmRsZXIuCisgKgorICogRmV0Y2hlcyB0aGUgc3lzdGVtIHRpbWVzdGFtcCBjb3JyZXNwb25kaW5nIHRvIHRoZSB0aW1lIG9mIHRoZSBtb3N0IHJlY2VudAorICogdmJsYW5rIGludGVydmFsIG9uIHNwZWNpZmllZCBjcnRjLiBNYXkgY2FsbCBpbnRvIGttcy1kcml2ZXIgdG8KKyAqIGNvbXB1dGUgdGhlIHRpbWVzdGFtcCB3aXRoIGEgaGlnaC1wcmVjaXNpb24gR1BVIHNwZWNpZmljIG1ldGhvZC4KKyAqCisgKiBSZXR1cm5zIHplcm8gaWYgdGltZXN0YW1wIG9yaWdpbmF0ZXMgZnJvbSB1bmNvcnJlY3RlZCBkb19nZXR0aW1lb2ZkYXkoKQorICogY2FsbCwgaS5lLiwgaXQgaXNuJ3QgdmVyeSBwcmVjaXNlbHkgbG9ja2VkIHRvIHRoZSB0cnVlIHZibGFuay4KKyAqCisgKiBSZXR1cm5zIG5vbi16ZXJvIGlmIHRpbWVzdGFtcCBpcyBjb25zaWRlcmVkIHRvIGJlIHZlcnkgcHJlY2lzZS4KKyAqLwordTMyIGRybV9nZXRfbGFzdF92Ymx0aW1lc3RhbXAoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGNydGMsCisJCQkgICAgICBzdHJ1Y3QgdGltZXZhbCAqdHZibGFuaywgdW5zaWduZWQgZmxhZ3MpCit7CisJaW50IHJldCA9IDA7CisKKwkvKiBEZWZpbmUgcmVxdWVzdGVkIG1heGltdW0gZXJyb3Igb24gdGltZXN0YW1wcyAobmFub3NlY29uZHMpLiAqLworCWludCBtYXhfZXJyb3IgPSAoaW50KSBkcm1fdGltZXN0YW1wX3ByZWNpc2lvbiAqIDEwMDA7CisKKwkvKiBRdWVyeSBkcml2ZXIgaWYgcG9zc2libGUgYW5kIHByZWNpc2lvbiB0aW1lc3RhbXBpbmcgZW5hYmxlZC4gKi8KKwlpZiAoZGV2LT5kcml2ZXItPmdldF92YmxhbmtfdGltZXN0YW1wICYmIChtYXhfZXJyb3IgPiAwKSkgeworCQlyZXQgPSBkZXYtPmRyaXZlci0+Z2V0X3ZibGFua190aW1lc3RhbXAoZGV2LCBjcnRjLCAmbWF4X2Vycm9yLAorCQkJCQkJCXR2YmxhbmssIGZsYWdzKTsKKwkJaWYgKHJldCA+IDApCisJCQlyZXR1cm4gKHUzMikgcmV0OworCX0KKworCS8qIEdQVSBoaWdoIHByZWNpc2lvbiB0aW1lc3RhbXAgcXVlcnkgdW5zdXBwb3J0ZWQgb3IgZmFpbGVkLgorCSAqIFJldHVybiBnZXR0aW1lb2ZkYXkgdGltZXN0YW1wIGFzIGJlc3QgZXN0aW1hdGUuCisJICovCisJZG9fZ2V0dGltZW9mZGF5KHR2YmxhbmspOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGRybV9nZXRfbGFzdF92Ymx0aW1lc3RhbXApOworCisvKioKICAqIGRybV92YmxhbmtfY291bnQgLSByZXRyaWV2ZSAiY29va2VkIiB2YmxhbmsgY291bnRlciB2YWx1ZQogICogQGRldjogRFJNIGRldmljZQogICogQGNydGM6IHdoaWNoIGNvdW50ZXIgdG8gcmV0cmlldmUKQEAgLTM3NSw2ICs3NjgsNDAgQEAKIEVYUE9SVF9TWU1CT0woZHJtX3ZibGFua19jb3VudCk7CiAKIC8qKgorICogZHJtX3ZibGFua19jb3VudF9hbmRfdGltZSAtIHJldHJpZXZlICJjb29rZWQiIHZibGFuayBjb3VudGVyIHZhbHVlCisgKiBhbmQgdGhlIHN5c3RlbSB0aW1lc3RhbXAgY29ycmVzcG9uZGluZyB0byB0aGF0IHZibGFuayBjb3VudGVyIHZhbHVlLgorICoKKyAqIEBkZXY6IERSTSBkZXZpY2UKKyAqIEBjcnRjOiB3aGljaCBjb3VudGVyIHRvIHJldHJpZXZlCisgKiBAdmJsYW5rdGltZTogUG9pbnRlciB0byBzdHJ1Y3QgdGltZXZhbCB0byByZWNlaXZlIHRoZSB2YmxhbmsgdGltZXN0YW1wLgorICoKKyAqIEZldGNoZXMgdGhlICJjb29rZWQiIHZibGFuayBjb3VudCB2YWx1ZSB0aGF0IHJlcHJlc2VudHMgdGhlIG51bWJlciBvZgorICogdmJsYW5rIGV2ZW50cyBzaW5jZSB0aGUgc3lzdGVtIHdhcyBib290ZWQsIGluY2x1ZGluZyBsb3N0IGV2ZW50cyBkdWUgdG8KKyAqIG1vZGVzZXR0aW5nIGFjdGl2aXR5LiBSZXR1cm5zIGNvcnJlc3BvbmRpbmcgc3lzdGVtIHRpbWVzdGFtcCBvZiB0aGUgdGltZQorICogb2YgdGhlIHZibGFuayBpbnRlcnZhbCB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBjdXJyZW50IHZhbHVlIHZibGFuayBjb3VudGVyCisgKiB2YWx1ZS4KKyAqLwordTMyIGRybV92YmxhbmtfY291bnRfYW5kX3RpbWUoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGNydGMsCisJCQkgICAgICBzdHJ1Y3QgdGltZXZhbCAqdmJsYW5rdGltZSkKK3sKKwl1MzIgY3VyX3ZibGFuazsKKworCS8qIFJlYWQgdGltZXN0YW1wIGZyb20gc2xvdCBvZiBfdmJsYW5rX3RpbWUgcmluZ2J1ZmZlcgorCSAqIHRoYXQgY29ycmVzcG9uZHMgdG8gY3VycmVudCB2YmxhbmsgY291bnQuIFJldHJ5IGlmCisJICogY291bnQgaGFzIGluY3JlbWVudGVkIGR1cmluZyByZWFkb3V0LiBUaGlzIHdvcmtzIGxpa2UKKwkgKiBhIHNlcWxvY2suCisJICovCisJZG8geworCQljdXJfdmJsYW5rID0gYXRvbWljX3JlYWQoJmRldi0+X3ZibGFua19jb3VudFtjcnRjXSk7CisJCSp2Ymxhbmt0aW1lID0gdmJsYW5rdGltZXN0YW1wKGRldiwgY3J0YywgY3VyX3ZibGFuayk7CisJCXNtcF9ybWIoKTsKKwl9IHdoaWxlIChjdXJfdmJsYW5rICE9IGF0b21pY19yZWFkKCZkZXYtPl92YmxhbmtfY291bnRbY3J0Y10pKTsKKworCXJldHVybiBjdXJfdmJsYW5rOworfQorRVhQT1JUX1NZTUJPTChkcm1fdmJsYW5rX2NvdW50X2FuZF90aW1lKTsKKworLyoqCiAgKiBkcm1fdXBkYXRlX3ZibGFua19jb3VudCAtIHVwZGF0ZSB0aGUgbWFzdGVyIHZibGFuayBjb3VudGVyCiAgKiBAZGV2OiBEUk0gZGV2aWNlCiAgKiBAY3J0YzogY291bnRlciB0byB1cGRhdGUKQEAgLTM5Miw3ICs4MTksOCBAQAogICovCiBzdGF0aWMgdm9pZCBkcm1fdXBkYXRlX3ZibGFua19jb3VudChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgY3J0YykKIHsKLQl1MzIgY3VyX3ZibGFuaywgZGlmZjsKKwl1MzIgY3VyX3ZibGFuaywgZGlmZiwgdHNsb3QsIHJjOworCXN0cnVjdCB0aW1ldmFsIHRfdmJsYW5rOwogCiAJLyoKIAkgKiBJbnRlcnJ1cHRzIHdlcmUgZGlzYWJsZWQgcHJpb3IgdG8gdGhpcyBjYWxsLCBzbyBkZWFsIHdpdGggY291bnRlcgpAQCAtNDAwLDggKzgyOCwxOCBAQAogCSAqIE5PVEUhICBJdCdzIHBvc3NpYmxlIHdlIGxvc3QgYSBmdWxsIGRldi0+bWF4X3ZibGFua19jb3VudCBldmVudHMKIAkgKiBoZXJlIGlmIHRoZSByZWdpc3RlciBpcyBzbWFsbCBvciB3ZSBoYWQgdmJsYW5rIGludGVycnVwdHMgb2ZmIGZvcgogCSAqIGEgbG9uZyB0aW1lLgorCSAqCisJICogV2UgcmVwZWF0IHRoZSBoYXJkd2FyZSB2YmxhbmsgY291bnRlciAmIHRpbWVzdGFtcCBxdWVyeSB1bnRpbAorCSAqIHdlIGdldCBjb25zaXN0ZW50IHJlc3VsdHMuIFRoaXMgdG8gcHJldmVudCByYWNlcyBiZXR3ZWVuIGdwdQorCSAqIHVwZGF0aW5nIGl0cyBoYXJkd2FyZSBjb3VudGVyIHdoaWxlIHdlIGFyZSByZXRyaWV2aW5nIHRoZQorCSAqIGNvcnJlc3BvbmRpbmcgdmJsYW5rIHRpbWVzdGFtcC4KIAkgKi8KLQljdXJfdmJsYW5rID0gZGV2LT5kcml2ZXItPmdldF92YmxhbmtfY291bnRlcihkZXYsIGNydGMpOworCWRvIHsKKwkJY3VyX3ZibGFuayA9IGRldi0+ZHJpdmVyLT5nZXRfdmJsYW5rX2NvdW50ZXIoZGV2LCBjcnRjKTsKKwkJcmMgPSBkcm1fZ2V0X2xhc3RfdmJsdGltZXN0YW1wKGRldiwgY3J0YywgJnRfdmJsYW5rLCAwKTsKKwl9IHdoaWxlIChjdXJfdmJsYW5rICE9IGRldi0+ZHJpdmVyLT5nZXRfdmJsYW5rX2NvdW50ZXIoZGV2LCBjcnRjKSk7CisKKwkvKiBEZWFsIHdpdGggY291bnRlciB3cmFwICovCiAJZGlmZiA9IGN1cl92YmxhbmsgLSBkZXYtPmxhc3RfdmJsYW5rW2NydGNdOwogCWlmIChjdXJfdmJsYW5rIDwgZGV2LT5sYXN0X3ZibGFua1tjcnRjXSkgewogCQlkaWZmICs9IGRldi0+bWF4X3ZibGFua19jb3VudDsKQEAgLTQxMyw2ICs4NTEsMTYgQEAKIAlEUk1fREVCVUcoImVuYWJsaW5nIHZibGFuayBpbnRlcnJ1cHRzIG9uIGNydGMgJWQsIG1pc3NlZCAlZFxuIiwKIAkJICBjcnRjLCBkaWZmKTsKIAorCS8qIFJlaW5pdGlhbGl6ZSBjb3JyZXNwb25kaW5nIHZibGFuayB0aW1lc3RhbXAgaWYgaGlnaC1wcmVjaXNpb24gcXVlcnkKKwkgKiBhdmFpbGFibGUuIFNraXAgdGhpcyBzdGVwIGlmIHF1ZXJ5IHVuc3VwcG9ydGVkIG9yIGZhaWxlZC4gV2lsbAorCSAqIHJlaW5pdGlhbGl6ZSBkZWxheWVkIGF0IG5leHQgdmJsYW5rIGludGVycnVwdCBpbiB0aGF0IGNhc2UuCisJICovCisJaWYgKHJjKSB7CisJCXRzbG90ID0gYXRvbWljX3JlYWQoJmRldi0+X3ZibGFua19jb3VudFtjcnRjXSkgKyBkaWZmOworCQl2Ymxhbmt0aW1lc3RhbXAoZGV2LCBjcnRjLCB0c2xvdCkgPSB0X3ZibGFuazsKKwkJc21wX3dtYigpOworCX0KKwogCWF0b21pY19hZGQoZGlmZiwgJmRldi0+X3ZibGFua19jb3VudFtjcnRjXSk7CiB9CiAKQEAgLTQyOSwxNSArODc3LDI3IEBACiAgKi8KIGludCBkcm1fdmJsYW5rX2dldChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgY3J0YykKIHsKLQl1bnNpZ25lZCBsb25nIGlycWZsYWdzOworCXVuc2lnbmVkIGxvbmcgaXJxZmxhZ3MsIGlycWZsYWdzMjsKIAlpbnQgcmV0ID0gMDsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPnZibF9sb2NrLCBpcnFmbGFncyk7CiAJLyogR29pbmcgZnJvbSAwLT4xIG1lYW5zIHdlIGhhdmUgdG8gZW5hYmxlIGludGVycnVwdHMgYWdhaW4gKi8KIAlpZiAoYXRvbWljX2FkZF9yZXR1cm4oMSwgJmRldi0+dmJsYW5rX3JlZmNvdW50W2NydGNdKSA9PSAxKSB7CisJCS8qIERpc2FibGUgcHJlZW1wdGlvbiB3aGlsZSBob2xkaW5nIHZibGFua190aW1lX2xvY2suIERvCisJCSAqIGl0IGV4cGxpY2l0ZWx5IHRvIGd1YXJkIGFnYWluc3QgUFJFRU1QVF9SVCBrZXJuZWwuCisJCSAqLworCQlwcmVlbXB0X2Rpc2FibGUoKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+dmJsYW5rX3RpbWVfbG9jaywgaXJxZmxhZ3MyKTsKIAkJaWYgKCFkZXYtPnZibGFua19lbmFibGVkW2NydGNdKSB7CisJCQkvKiBFbmFibGUgdmJsYW5rIGlycXMgdW5kZXIgdmJsYW5rX3RpbWVfbG9jayBwcm90ZWN0aW9uLgorCQkJICogQWxsIHZibGFuayBjb3VudCAmIHRpbWVzdGFtcCB1cGRhdGVzIGFyZSBoZWxkIG9mZgorCQkJICogdW50aWwgd2UgYXJlIGRvbmUgcmVpbml0aWFsaXppbmcgbWFzdGVyIGNvdW50ZXIgYW5kCisJCQkgKiB0aW1lc3RhbXBzLiBGaWx0ZXJjb2RlIGluIGRybV9oYW5kbGVfdmJsYW5rKCkgd2lsbAorCQkJICogcHJldmVudCBkb3VibGUtYWNjb3VudGluZyBvZiBzYW1lIHZibGFuayBpbnRlcnZhbC4KKwkJCSAqLwogCQkJcmV0ID0gZGV2LT5kcml2ZXItPmVuYWJsZV92YmxhbmsoZGV2LCBjcnRjKTsKLQkJCURSTV9ERUJVRygiZW5hYmxpbmcgdmJsYW5rIG9uIGNydGMgJWQsIHJldDogJWRcbiIsIGNydGMsIHJldCk7CisJCQlEUk1fREVCVUcoImVuYWJsaW5nIHZibGFuayBvbiBjcnRjICVkLCByZXQ6ICVkXG4iLAorCQkJCSAgY3J0YywgcmV0KTsKIAkJCWlmIChyZXQpCiAJCQkJYXRvbWljX2RlYygmZGV2LT52YmxhbmtfcmVmY291bnRbY3J0Y10pOwogCQkJZWxzZSB7CkBAIC00NDUsNiArOTA1LDggQEAKIAkJCQlkcm1fdXBkYXRlX3ZibGFua19jb3VudChkZXYsIGNydGMpOwogCQkJfQogCQl9CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+dmJsYW5rX3RpbWVfbG9jaywgaXJxZmxhZ3MyKTsKKwkJcHJlZW1wdF9lbmFibGUoKTsKIAl9IGVsc2UgewogCQlpZiAoIWRldi0+dmJsYW5rX2VuYWJsZWRbY3J0Y10pIHsKIAkJCWF0b21pY19kZWMoJmRldi0+dmJsYW5rX3JlZmNvdW50W2NydGNdKTsKQEAgLTQ2MywxNSArOTI1LDE3IEBACiAgKiBAY3J0Yzogd2hpY2ggY291bnRlciB0byBnaXZlIHVwCiAgKgogICogUmVsZWFzZSBvd25lcnNoaXAgb2YgYSBnaXZlbiB2YmxhbmsgY291bnRlciwgdHVybmluZyBvZmYgaW50ZXJydXB0cwotICogaWYgcG9zc2libGUuCisgKiBpZiBwb3NzaWJsZS4gRGlzYWJsZSBpbnRlcnJ1cHRzIGFmdGVyIGRybV92Ymxhbmtfb2ZmZGVsYXkgbWlsbGlzZWNvbmRzLgogICovCiB2b2lkIGRybV92YmxhbmtfcHV0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBjcnRjKQogewotCUJVR19PTiAoYXRvbWljX3JlYWQgKCZkZXYtPnZibGFua19yZWZjb3VudFtjcnRjXSkgPT0gMCk7CisJQlVHX09OKGF0b21pY19yZWFkKCZkZXYtPnZibGFua19yZWZjb3VudFtjcnRjXSkgPT0gMCk7CiAKIAkvKiBMYXN0IHVzZXIgc2NoZWR1bGVzIGludGVycnVwdCBkaXNhYmxlICovCi0JaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJmRldi0+dmJsYW5rX3JlZmNvdW50W2NydGNdKSkKLQkJbW9kX3RpbWVyKCZkZXYtPnZibGFua19kaXNhYmxlX3RpbWVyLCBqaWZmaWVzICsgNSpEUk1fSFopOworCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZkZXYtPnZibGFua19yZWZjb3VudFtjcnRjXSkgJiYKKwkgICAgKGRybV92Ymxhbmtfb2ZmZGVsYXkgPiAwKSkKKwkJbW9kX3RpbWVyKCZkZXYtPnZibGFua19kaXNhYmxlX3RpbWVyLAorCQkJICBqaWZmaWVzICsgKChkcm1fdmJsYW5rX29mZmRlbGF5ICogRFJNX0haKS8xMDAwKSk7CiB9CiBFWFBPUlRfU1lNQk9MKGRybV92YmxhbmtfcHV0KTsKIApAQCAtNDgwLDEwICs5NDQsOCBAQAogCXVuc2lnbmVkIGxvbmcgaXJxZmxhZ3M7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT52YmxfbG9jaywgaXJxZmxhZ3MpOwotCWRldi0+ZHJpdmVyLT5kaXNhYmxlX3ZibGFuayhkZXYsIGNydGMpOworCXZibGFua19kaXNhYmxlX2FuZF9zYXZlKGRldiwgY3J0Yyk7CiAJRFJNX1dBS0VVUCgmZGV2LT52YmxfcXVldWVbY3J0Y10pOwotCWRldi0+dmJsYW5rX2VuYWJsZWRbY3J0Y10gPSAwOwotCWRldi0+bGFzdF92YmxhbmtbY3J0Y10gPSBkZXYtPmRyaXZlci0+Z2V0X3ZibGFua19jb3VudGVyKGRldiwgY3J0Yyk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT52YmxfbG9jaywgaXJxZmxhZ3MpOwogfQogRVhQT1JUX1NZTUJPTChkcm1fdmJsYW5rX29mZik7CkBAIC02MDIsNyArMTA2NCw2IEBACiAJZS0+YmFzZS5maWxlX3ByaXYgPSBmaWxlX3ByaXY7CiAJZS0+YmFzZS5kZXN0cm95ID0gKHZvaWQgKCopIChzdHJ1Y3QgZHJtX3BlbmRpbmdfZXZlbnQgKikpIGtmcmVlOwogCi0JZG9fZ2V0dGltZW9mZGF5KCZub3cpOwogCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPmV2ZW50X2xvY2ssIGZsYWdzKTsKIAogCWlmIChmaWxlX3ByaXYtPmV2ZW50X3NwYWNlIDwgc2l6ZW9mIGUtPmV2ZW50KSB7CkBAIC02MTEsNyArMTA3Miw4IEBACiAJfQogCiAJZmlsZV9wcml2LT5ldmVudF9zcGFjZSAtPSBzaXplb2YgZS0+ZXZlbnQ7Ci0Jc2VxID0gZHJtX3ZibGFua19jb3VudChkZXYsIHBpcGUpOworCXNlcSA9IGRybV92YmxhbmtfY291bnRfYW5kX3RpbWUoZGV2LCBwaXBlLCAmbm93KTsKKwogCWlmICgodmJsd2FpdC0+cmVxdWVzdC50eXBlICYgX0RSTV9WQkxBTktfTkVYVE9OTUlTUykgJiYKIAkgICAgKHNlcSAtIHZibHdhaXQtPnJlcXVlc3Quc2VxdWVuY2UpIDw9ICgxIDw8IDIzKSkgewogCQl2Ymx3YWl0LT5yZXF1ZXN0LnNlcXVlbmNlID0gc2VxICsgMTsKQEAgLTYyNiwxNSArMTA4OCwxOCBAQAogCiAJZS0+ZXZlbnQuc2VxdWVuY2UgPSB2Ymx3YWl0LT5yZXF1ZXN0LnNlcXVlbmNlOwogCWlmICgoc2VxIC0gdmJsd2FpdC0+cmVxdWVzdC5zZXF1ZW5jZSkgPD0gKDEgPDwgMjMpKSB7CisJCWUtPmV2ZW50LnNlcXVlbmNlID0gc2VxOwogCQllLT5ldmVudC50dl9zZWMgPSBub3cudHZfc2VjOwogCQllLT5ldmVudC50dl91c2VjID0gbm93LnR2X3VzZWM7CiAJCWRybV92YmxhbmtfcHV0KGRldiwgcGlwZSk7CiAJCWxpc3RfYWRkX3RhaWwoJmUtPmJhc2UubGluaywgJmUtPmJhc2UuZmlsZV9wcml2LT5ldmVudF9saXN0KTsKIAkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZlLT5iYXNlLmZpbGVfcHJpdi0+ZXZlbnRfd2FpdCk7CisJCXZibHdhaXQtPnJlcGx5LnNlcXVlbmNlID0gc2VxOwogCQl0cmFjZV9kcm1fdmJsYW5rX2V2ZW50X2RlbGl2ZXJlZChjdXJyZW50LT5waWQsIHBpcGUsCiAJCQkJCQkgdmJsd2FpdC0+cmVxdWVzdC5zZXF1ZW5jZSk7CiAJfSBlbHNlIHsKIAkJbGlzdF9hZGRfdGFpbCgmZS0+YmFzZS5saW5rLCAmZGV2LT52YmxhbmtfZXZlbnRfbGlzdCk7CisJCXZibHdhaXQtPnJlcGx5LnNlcXVlbmNlID0gdmJsd2FpdC0+cmVxdWVzdC5zZXF1ZW5jZTsKIAl9CiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPmV2ZW50X2xvY2ssIGZsYWdzKTsKQEAgLTcyNywxMSArMTE5MiwxMCBAQAogCWlmIChyZXQgIT0gLUVJTlRSKSB7CiAJCXN0cnVjdCB0aW1ldmFsIG5vdzsKIAotCQlkb19nZXR0aW1lb2ZkYXkoJm5vdyk7Ci0KKwkJdmJsd2FpdC0+cmVwbHkuc2VxdWVuY2UgPSBkcm1fdmJsYW5rX2NvdW50X2FuZF90aW1lKGRldiwgY3J0YywgJm5vdyk7CiAJCXZibHdhaXQtPnJlcGx5LnR2YWxfc2VjID0gbm93LnR2X3NlYzsKIAkJdmJsd2FpdC0+cmVwbHkudHZhbF91c2VjID0gbm93LnR2X3VzZWM7Ci0JCXZibHdhaXQtPnJlcGx5LnNlcXVlbmNlID0gZHJtX3ZibGFua19jb3VudChkZXYsIGNydGMpOworCiAJCURSTV9ERUJVRygicmV0dXJuaW5nICVkIHRvIGNsaWVudFxuIiwKIAkJCSAgdmJsd2FpdC0+cmVwbHkuc2VxdWVuY2UpOwogCX0gZWxzZSB7CkBAIC03NTAsOCArMTIxNCw3IEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAl1bnNpZ25lZCBpbnQgc2VxOwogCi0JZG9fZ2V0dGltZW9mZGF5KCZub3cpOwotCXNlcSA9IGRybV92YmxhbmtfY291bnQoZGV2LCBjcnRjKTsKKwlzZXEgPSBkcm1fdmJsYW5rX2NvdW50X2FuZF90aW1lKGRldiwgY3J0YywgJm5vdyk7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5ldmVudF9sb2NrLCBmbGFncyk7CiAKQEAgLTc4OSwxMSArMTI1Miw2NCBAQAogICovCiB2b2lkIGRybV9oYW5kbGVfdmJsYW5rKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBjcnRjKQogeworCXUzMiB2Ymxjb3VudDsKKwlzNjQgZGlmZl9uczsKKwlzdHJ1Y3QgdGltZXZhbCB0dmJsYW5rOworCXVuc2lnbmVkIGxvbmcgaXJxZmxhZ3M7CisKIAlpZiAoIWRldi0+bnVtX2NydGNzKQogCQlyZXR1cm47CiAKLQlhdG9taWNfaW5jKCZkZXYtPl92YmxhbmtfY291bnRbY3J0Y10pOworCS8qIE5lZWQgdGltZXN0YW1wIGxvY2sgdG8gcHJldmVudCBjb25jdXJyZW50IGV4ZWN1dGlvbiB3aXRoCisJICogdmJsYW5rIGVuYWJsZS9kaXNhYmxlLCBhcyB0aGlzIHdvdWxkIGNhdXNlIGluY29uc2lzdGVudAorCSAqIG9yIGNvcnJ1cHRlZCB0aW1lc3RhbXBzIGFuZCB2YmxhbmsgY291bnRzLgorCSAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPnZibGFua190aW1lX2xvY2ssIGlycWZsYWdzKTsKKworCS8qIFZibGFuayBpcnEgaGFuZGxpbmcgZGlzYWJsZWQuIE5vdGhpbmcgdG8gZG8uICovCisJaWYgKCFkZXYtPnZibGFua19lbmFibGVkW2NydGNdKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+dmJsYW5rX3RpbWVfbG9jaywgaXJxZmxhZ3MpOworCQlyZXR1cm47CisJfQorCisJLyogRmV0Y2ggY29ycmVzcG9uZGluZyB0aW1lc3RhbXAgZm9yIHRoaXMgdmJsYW5rIGludGVydmFsIGZyb20KKwkgKiBkcml2ZXIgYW5kIHN0b3JlIGl0IGluIHByb3BlciBzbG90IG9mIHRpbWVzdGFtcCByaW5nYnVmZmVyLgorCSAqLworCisJLyogR2V0IGN1cnJlbnQgdGltZXN0YW1wIGFuZCBjb3VudC4gKi8KKwl2Ymxjb3VudCA9IGF0b21pY19yZWFkKCZkZXYtPl92YmxhbmtfY291bnRbY3J0Y10pOworCWRybV9nZXRfbGFzdF92Ymx0aW1lc3RhbXAoZGV2LCBjcnRjLCAmdHZibGFuaywgRFJNX0NBTExFRF9GUk9NX1ZCTElSUSk7CisKKwkvKiBDb21wdXRlIHRpbWUgZGlmZmVyZW5jZSB0byB0aW1lc3RhbXAgb2YgbGFzdCB2YmxhbmsgKi8KKwlkaWZmX25zID0gdGltZXZhbF90b19ucygmdHZibGFuaykgLQorCQkgIHRpbWV2YWxfdG9fbnMoJnZibGFua3RpbWVzdGFtcChkZXYsIGNydGMsIHZibGNvdW50KSk7CisKKwkvKiBVcGRhdGUgdmJsYW5rIHRpbWVzdGFtcCBhbmQgY291bnQgaWYgYXQgbGVhc3QKKwkgKiBEUk1fUkVEVU5EQU5UX1ZCTElSUV9USFJFU0hfTlMgbmFub3NlY29uZHMKKwkgKiBkaWZmZXJlbmNlIGJldHdlZW4gbGFzdCBzdG9yZWQgdGltZXN0YW1wIGFuZCBjdXJyZW50CisJICogdGltZXN0YW1wLiBBIHNtYWxsZXIgZGlmZmVyZW5jZSBtZWFucyBiYXNpY2FsbHkKKwkgKiBpZGVudGljYWwgdGltZXN0YW1wcy4gSGFwcGVucyBpZiB0aGlzIHZibGFuayBoYXMKKwkgKiBiZWVuIGFscmVhZHkgcHJvY2Vzc2VkIGFuZCB0aGlzIGlzIGEgcmVkdW5kYW50IGNhbGwsCisJICogZS5nLiwgZHVlIHRvIHNwdXJpb3VzIHZibGFuayBpbnRlcnJ1cHRzLiBXZSBuZWVkIHRvCisJICogaWdub3JlIHRob3NlIGZvciBhY2NvdW50aW5nLgorCSAqLworCWlmIChhYnMoZGlmZl9ucykgPiBEUk1fUkVEVU5EQU5UX1ZCTElSUV9USFJFU0hfTlMpIHsKKwkJLyogU3RvcmUgbmV3IHRpbWVzdGFtcCBpbiByaW5nYnVmZmVyLiAqLworCQl2Ymxhbmt0aW1lc3RhbXAoZGV2LCBjcnRjLCB2Ymxjb3VudCArIDEpID0gdHZibGFuazsKKwkJc21wX3dtYigpOworCisJCS8qIEluY3JlbWVudCBjb29rZWQgdmJsYW5rIGNvdW50LiBUaGlzIGFsc28gYXRvbWljYWxseSBjb21taXRzCisJCSAqIHRoZSB0aW1lc3RhbXAgY29tcHV0ZWQgYWJvdmUuCisJCSAqLworCQlhdG9taWNfaW5jKCZkZXYtPl92YmxhbmtfY291bnRbY3J0Y10pOworCX0gZWxzZSB7CisJCURSTV9ERUJVRygiY3J0YyAlZDogUmVkdW5kYW50IHZibGlycSBpZ25vcmVkLiBkaWZmX25zID0gJWRcbiIsCisJCQkgIGNydGMsIChpbnQpIGRpZmZfbnMpOworCX0KKwogCURSTV9XQUtFVVAoJmRldi0+dmJsX3F1ZXVlW2NydGNdKTsKIAlkcm1faGFuZGxlX3ZibGFua19ldmVudHMoZGV2LCBjcnRjKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+dmJsYW5rX3RpbWVfbG9jaywgaXJxZmxhZ3MpOwogfQogRVhQT1JUX1NZTUJPTChkcm1faGFuZGxlX3ZibGFuayk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vZHJtX21tLmMgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX21tLmMKaW5kZXggYTZiZmMzMC4uYzU5NTE1YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2RybV9tbS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fbW0uYwpAQCAtMzkyLDEwICszOTIsMzYgQEAKIAltbS0+c2Nhbm5lZF9ibG9ja3MgPSAwOwogCW1tLT5zY2FuX2hpdF9zdGFydCA9IDA7CiAJbW0tPnNjYW5faGl0X3NpemUgPSAwOworCW1tLT5zY2FuX2NoZWNrX3JhbmdlID0gMDsKIH0KIEVYUE9SVF9TWU1CT0woZHJtX21tX2luaXRfc2Nhbik7CiAKIC8qKgorICogSW5pdGlhbGl6YSBscnUgc2Nhbm5pbmcuCisgKgorICogVGhpcyBzaW1wbHkgc2V0cyB1cCB0aGUgc2Nhbm5pbmcgcm91dGluZXMgd2l0aCB0aGUgcGFyYW1ldGVycyBmb3IgdGhlIGRlc2lyZWQKKyAqIGhvbGUuIFRoaXMgdmVyc2lvbiBpcyBmb3IgcmFuZ2UtcmVzdHJpY3RlZCBzY2Fucy4KKyAqCisgKiBXYXJuaW5nOiBBcyBsb25nIGFzIHRoZSBzY2FuIGxpc3QgaXMgbm9uLWVtcHR5LCBubyBvdGhlciBvcGVyYXRpb25zIHRoYW4KKyAqIGFkZGluZy9yZW1vdmluZyBub2RlcyB0by9mcm9tIHRoZSBzY2FuIGxpc3QgYXJlIGFsbG93ZWQuCisgKi8KK3ZvaWQgZHJtX21tX2luaXRfc2Nhbl93aXRoX3JhbmdlKHN0cnVjdCBkcm1fbW0gKm1tLCB1bnNpZ25lZCBsb25nIHNpemUsCisJCQkJIHVuc2lnbmVkIGFsaWdubWVudCwKKwkJCQkgdW5zaWduZWQgbG9uZyBzdGFydCwKKwkJCQkgdW5zaWduZWQgbG9uZyBlbmQpCit7CisJbW0tPnNjYW5fYWxpZ25tZW50ID0gYWxpZ25tZW50OworCW1tLT5zY2FuX3NpemUgPSBzaXplOworCW1tLT5zY2FubmVkX2Jsb2NrcyA9IDA7CisJbW0tPnNjYW5faGl0X3N0YXJ0ID0gMDsKKwltbS0+c2Nhbl9oaXRfc2l6ZSA9IDA7CisJbW0tPnNjYW5fc3RhcnQgPSBzdGFydDsKKwltbS0+c2Nhbl9lbmQgPSBlbmQ7CisJbW0tPnNjYW5fY2hlY2tfcmFuZ2UgPSAxOworfQorRVhQT1JUX1NZTUJPTChkcm1fbW1faW5pdF9zY2FuX3dpdGhfcmFuZ2UpOworCisvKioKICAqIEFkZCBhIG5vZGUgdG8gdGhlIHNjYW4gbGlzdCB0aGF0IG1pZ2h0IGJlIGZyZWVkIHRvIG1ha2Ugc3BhY2UgZm9yIHRoZSBkZXNpcmVkCiAgKiBob2xlLgogICoKQEAgLTQwNiw2ICs0MzIsOCBAQAogCXN0cnVjdCBkcm1fbW0gKm1tID0gbm9kZS0+bW07CiAJc3RydWN0IGxpc3RfaGVhZCAqcHJldl9mcmVlLCAqbmV4dF9mcmVlOwogCXN0cnVjdCBkcm1fbW1fbm9kZSAqcHJldl9ub2RlLCAqbmV4dF9ub2RlOworCXVuc2lnbmVkIGxvbmcgYWRqX3N0YXJ0OworCXVuc2lnbmVkIGxvbmcgYWRqX2VuZDsKIAogCW1tLT5zY2FubmVkX2Jsb2NrcysrOwogCkBAIC00NTIsNyArNDgwLDE3IEBACiAJbm9kZS0+ZnJlZV9zdGFjay5wcmV2ID0gcHJldl9mcmVlOwogCW5vZGUtPmZyZWVfc3RhY2submV4dCA9IG5leHRfZnJlZTsKIAotCWlmIChjaGVja19mcmVlX2hvbGUobm9kZS0+c3RhcnQsIG5vZGUtPnN0YXJ0ICsgbm9kZS0+c2l6ZSwKKwlpZiAobW0tPnNjYW5fY2hlY2tfcmFuZ2UpIHsKKwkJYWRqX3N0YXJ0ID0gbm9kZS0+c3RhcnQgPCBtbS0+c2Nhbl9zdGFydCA/CisJCQltbS0+c2Nhbl9zdGFydCA6IG5vZGUtPnN0YXJ0OworCQlhZGpfZW5kID0gbm9kZS0+c3RhcnQgKyBub2RlLT5zaXplID4gbW0tPnNjYW5fZW5kID8KKwkJCW1tLT5zY2FuX2VuZCA6IG5vZGUtPnN0YXJ0ICsgbm9kZS0+c2l6ZTsKKwl9IGVsc2UgeworCQlhZGpfc3RhcnQgPSBub2RlLT5zdGFydDsKKwkJYWRqX2VuZCA9IG5vZGUtPnN0YXJ0ICsgbm9kZS0+c2l6ZTsKKwl9CisKKwlpZiAoY2hlY2tfZnJlZV9ob2xlKGFkal9zdGFydCAsIGFkal9lbmQsCiAJCQkgICAgbW0tPnNjYW5fc2l6ZSwgbW0tPnNjYW5fYWxpZ25tZW50KSkgewogCQltbS0+c2Nhbl9oaXRfc3RhcnQgPSBub2RlLT5zdGFydDsKIAkJbW0tPnNjYW5faGl0X3NpemUgPSBub2RlLT5zaXplOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2RybV9zdHViLmMgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX3N0dWIuYwppbmRleCBjZGM4OWVlLi5kNTllZGMxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vZHJtX3N0dWIuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX3N0dWIuYwpAQCAtNDAsMTIgKzQwLDIyIEBACiB1bnNpZ25lZCBpbnQgZHJtX2RlYnVnID0gMDsJLyogMSB0byBlbmFibGUgZGVidWcgb3V0cHV0ICovCiBFWFBPUlRfU1lNQk9MKGRybV9kZWJ1Zyk7CiAKK3Vuc2lnbmVkIGludCBkcm1fdmJsYW5rX29mZmRlbGF5ID0gNTAwMDsgICAgLyogRGVmYXVsdCB0byA1MDAwIG1zZWNzLiAqLworRVhQT1JUX1NZTUJPTChkcm1fdmJsYW5rX29mZmRlbGF5KTsKKwordW5zaWduZWQgaW50IGRybV90aW1lc3RhbXBfcHJlY2lzaW9uID0gMjA7ICAvKiBEZWZhdWx0IHRvIDIwIHVzZWNzLiAqLworRVhQT1JUX1NZTUJPTChkcm1fdGltZXN0YW1wX3ByZWNpc2lvbik7CisKIE1PRFVMRV9BVVRIT1IoQ09SRV9BVVRIT1IpOwogTU9EVUxFX0RFU0NSSVBUSU9OKENPUkVfREVTQyk7CiBNT0RVTEVfTElDRU5TRSgiR1BMIGFuZCBhZGRpdGlvbmFsIHJpZ2h0cyIpOwogTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgIkVuYWJsZSBkZWJ1ZyBvdXRwdXQiKTsKK01PRFVMRV9QQVJNX0RFU0ModmJsYW5rb2ZmZGVsYXksICJEZWxheSB1bnRpbCB2YmxhbmsgaXJxIGF1dG8tZGlzYWJsZSBbbXNlY3NdIik7CitNT0RVTEVfUEFSTV9ERVNDKHRpbWVzdGFtcF9wcmVjaXNpb25fdXNlYywgIk1heC4gZXJyb3Igb24gdGltZXN0YW1wcyBbdXNlY3NdIik7CiAKIG1vZHVsZV9wYXJhbV9uYW1lZChkZWJ1ZywgZHJtX2RlYnVnLCBpbnQsIDA2MDApOworbW9kdWxlX3BhcmFtX25hbWVkKHZibGFua29mZmRlbGF5LCBkcm1fdmJsYW5rX29mZmRlbGF5LCBpbnQsIDA2MDApOworbW9kdWxlX3BhcmFtX25hbWVkKHRpbWVzdGFtcF9wcmVjaXNpb25fdXNlYywgZHJtX3RpbWVzdGFtcF9wcmVjaXNpb24sIGludCwgMDYwMCk7CiAKIHN0cnVjdCBpZHIgZHJtX21pbm9yc19pZHI7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L01ha2VmaWxlIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvTWFrZWZpbGUKaW5kZXggZmRjODMzZC4uMGFlNmE3YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvTWFrZWZpbGUKQEAgLTksNiArOSw4IEBACiAJICBpOTE1X2dlbS5vIFwKIAkgIGk5MTVfZ2VtX2RlYnVnLm8gXAogCSAgaTkxNV9nZW1fZXZpY3QubyBcCisJICBpOTE1X2dlbV9leGVjYnVmZmVyLm8gXAorCSAgaTkxNV9nZW1fZ3R0Lm8gXAogCSAgaTkxNV9nZW1fdGlsaW5nLm8gXAogCSAgaTkxNV90cmFjZV9wb2ludHMubyBcCiAJICBpbnRlbF9kaXNwbGF5Lm8gXApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9kZWJ1Z2ZzLmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2RlYnVnZnMuYwppbmRleCAxZjRmM2NlLi45MmY3NTc4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2RlYnVnZnMuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2RlYnVnZnMuYwpAQCAtMzIsNiArMzIsNyBAQAogI2luY2x1ZGUgImRybVAuaCIKICNpbmNsdWRlICJkcm0uaCIKICNpbmNsdWRlICJpbnRlbF9kcnYuaCIKKyNpbmNsdWRlICJpbnRlbF9yaW5nYnVmZmVyLmgiCiAjaW5jbHVkZSAiaTkxNV9kcm0uaCIKICNpbmNsdWRlICJpOTE1X2Rydi5oIgogCkBAIC03Miw3ICs3Myw2IEBACiAJQihpc19icm9hZHdhdGVyKTsKIAlCKGlzX2NyZXN0bGluZSk7CiAJQihoYXNfZmJjKTsKLQlCKGhhc19yYzYpOwogCUIoaGFzX3BpcGVfY3hzcik7CiAJQihoYXNfaG90cGx1Zyk7CiAJQihjdXJzb3JfbmVlZHNfcGh5c2ljYWwpOwpAQCAtODYsMTkgKzg2LDE5IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBjb25zdCBjaGFyICpnZXRfcGluX2ZsYWcoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9ial9wcml2KQorc3RhdGljIGNvbnN0IGNoYXIgKmdldF9waW5fZmxhZyhzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqKQogewotCWlmIChvYmpfcHJpdi0+dXNlcl9waW5fY291bnQgPiAwKQorCWlmIChvYmotPnVzZXJfcGluX2NvdW50ID4gMCkKIAkJcmV0dXJuICJQIjsKLQllbHNlIGlmIChvYmpfcHJpdi0+cGluX2NvdW50ID4gMCkKKwllbHNlIGlmIChvYmotPnBpbl9jb3VudCA+IDApCiAJCXJldHVybiAicCI7CiAJZWxzZQogCQlyZXR1cm4gIiAiOwogfQogCi1zdGF0aWMgY29uc3QgY2hhciAqZ2V0X3RpbGluZ19mbGFnKHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmpfcHJpdikKK3N0YXRpYyBjb25zdCBjaGFyICpnZXRfdGlsaW5nX2ZsYWcoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaikKIHsKLSAgICBzd2l0Y2ggKG9ial9wcml2LT50aWxpbmdfbW9kZSkgeworICAgIHN3aXRjaCAob2JqLT50aWxpbmdfbW9kZSkgewogICAgIGRlZmF1bHQ6CiAgICAgY2FzZSBJOTE1X1RJTElOR19OT05FOiByZXR1cm4gIiAiOwogICAgIGNhc2UgSTkxNV9USUxJTkdfWDogcmV0dXJuICJYIjsKQEAgLTEwOSw3ICsxMDksNyBAQAogc3RhdGljIHZvaWQKIGRlc2NyaWJlX29iaihzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmopCiB7Ci0Jc2VxX3ByaW50ZihtLCAiJXA6ICVzJXMgJTh6ZCAlMDh4ICUwOHggJWQlcyVzIiwKKwlzZXFfcHJpbnRmKG0sICIlcDogJXMlcyAlOHpkICUwNHggJTA0eCAlZCAlZCVzJXMiLAogCQkgICAmb2JqLT5iYXNlLAogCQkgICBnZXRfcGluX2ZsYWcob2JqKSwKIAkJICAgZ2V0X3RpbGluZ19mbGFnKG9iaiksCkBAIC0xMTcsNiArMTE3LDcgQEAKIAkJICAgb2JqLT5iYXNlLnJlYWRfZG9tYWlucywKIAkJICAgb2JqLT5iYXNlLndyaXRlX2RvbWFpbiwKIAkJICAgb2JqLT5sYXN0X3JlbmRlcmluZ19zZXFubywKKwkJICAgb2JqLT5sYXN0X2ZlbmNlZF9zZXFubywKIAkJICAgb2JqLT5kaXJ0eSA/ICIgZGlydHkiIDogIiIsCiAJCSAgIG9iai0+bWFkdiA9PSBJOTE1X01BRFZfRE9OVE5FRUQgPyAiIHB1cmdlYWJsZSIgOiAiIik7CiAJaWYgKG9iai0+YmFzZS5uYW1lKQpAQCAtMTI0LDcgKzEyNSwxNyBAQAogCWlmIChvYmotPmZlbmNlX3JlZyAhPSBJOTE1X0ZFTkNFX1JFR19OT05FKQogCQlzZXFfcHJpbnRmKG0sICIgKGZlbmNlOiAlZCkiLCBvYmotPmZlbmNlX3JlZyk7CiAJaWYgKG9iai0+Z3R0X3NwYWNlICE9IE5VTEwpCi0JCXNlcV9wcmludGYobSwgIiAoZ3R0X29mZnNldDogJTA4eCkiLCBvYmotPmd0dF9vZmZzZXQpOworCQlzZXFfcHJpbnRmKG0sICIgKGd0dCBvZmZzZXQ6ICUwOHgsIHNpemU6ICUwOHgpIiwKKwkJCSAgIG9iai0+Z3R0X29mZnNldCwgKHVuc2lnbmVkIGludClvYmotPmd0dF9zcGFjZS0+c2l6ZSk7CisJaWYgKG9iai0+cGluX21hcHBhYmxlIHx8IG9iai0+ZmF1bHRfbWFwcGFibGUpIHsKKwkJY2hhciBzWzNdLCAqdCA9IHM7CisJCWlmIChvYmotPnBpbl9tYXBwYWJsZSkKKwkJCSp0KysgPSAncCc7CisJCWlmIChvYmotPmZhdWx0X21hcHBhYmxlKQorCQkJKnQrKyA9ICdmJzsKKwkJKnQgPSAnXDAnOworCQlzZXFfcHJpbnRmKG0sICIgKCVzIG1hcHBhYmxlKSIsIHMpOworCX0KIAlpZiAob2JqLT5yaW5nICE9IE5VTEwpCiAJCXNlcV9wcmludGYobSwgIiAoJXMpIiwgb2JqLT5yaW5nLT5uYW1lKTsKIH0KQEAgLTEzNiw3ICsxNDcsNyBAQAogCXN0cnVjdCBsaXN0X2hlYWQgKmhlYWQ7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IG5vZGUtPm1pbm9yLT5kZXY7CiAJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Ci0Jc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9ial9wcml2OworCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmo7CiAJc2l6ZV90IHRvdGFsX29ial9zaXplLCB0b3RhbF9ndHRfc2l6ZTsKIAlpbnQgY291bnQsIHJldDsKIApAQCAtMTcxLDEyICsxODIsMTIgQEAKIAl9CiAKIAl0b3RhbF9vYmpfc2l6ZSA9IHRvdGFsX2d0dF9zaXplID0gY291bnQgPSAwOwotCWxpc3RfZm9yX2VhY2hfZW50cnkob2JqX3ByaXYsIGhlYWQsIG1tX2xpc3QpIHsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KG9iaiwgaGVhZCwgbW1fbGlzdCkgewogCQlzZXFfcHJpbnRmKG0sICIgICAiKTsKLQkJZGVzY3JpYmVfb2JqKG0sIG9ial9wcml2KTsKKwkJZGVzY3JpYmVfb2JqKG0sIG9iaik7CiAJCXNlcV9wcmludGYobSwgIlxuIik7Ci0JCXRvdGFsX29ial9zaXplICs9IG9ial9wcml2LT5iYXNlLnNpemU7Ci0JCXRvdGFsX2d0dF9zaXplICs9IG9ial9wcml2LT5ndHRfc3BhY2UtPnNpemU7CisJCXRvdGFsX29ial9zaXplICs9IG9iai0+YmFzZS5zaXplOworCQl0b3RhbF9ndHRfc2l6ZSArPSBvYmotPmd0dF9zcGFjZS0+c2l6ZTsKIAkJY291bnQrKzsKIAl9CiAJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CkBAIC0xODYsMjQgKzE5Nyw3OSBAQAogCXJldHVybiAwOwogfQogCisjZGVmaW5lIGNvdW50X29iamVjdHMobGlzdCwgbWVtYmVyKSBkbyB7IFwKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KG9iaiwgbGlzdCwgbWVtYmVyKSB7IFwKKwkJc2l6ZSArPSBvYmotPmd0dF9zcGFjZS0+c2l6ZTsgXAorCQkrK2NvdW50OyBcCisJCWlmIChvYmotPm1hcF9hbmRfZmVuY2VhYmxlKSB7IFwKKwkJCW1hcHBhYmxlX3NpemUgKz0gb2JqLT5ndHRfc3BhY2UtPnNpemU7IFwKKwkJCSsrbWFwcGFibGVfY291bnQ7IFwKKwkJfSBcCisJfSBcCit9IHdoaWxlKDApCisKIHN0YXRpYyBpbnQgaTkxNV9nZW1fb2JqZWN0X2luZm8oc3RydWN0IHNlcV9maWxlICptLCB2b2lkKiBkYXRhKQogewogCXN0cnVjdCBkcm1faW5mb19ub2RlICpub2RlID0gKHN0cnVjdCBkcm1faW5mb19ub2RlICopIG0tPnByaXZhdGU7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IG5vZGUtPm1pbm9yLT5kZXY7CiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwl1MzIgY291bnQsIG1hcHBhYmxlX2NvdW50OworCXNpemVfdCBzaXplLCBtYXBwYWJsZV9zaXplOworCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmo7CiAJaW50IHJldDsKIAogCXJldCA9IG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKLQlzZXFfcHJpbnRmKG0sICIldSBvYmplY3RzXG4iLCBkZXZfcHJpdi0+bW0ub2JqZWN0X2NvdW50KTsKLQlzZXFfcHJpbnRmKG0sICIlenUgb2JqZWN0IGJ5dGVzXG4iLCBkZXZfcHJpdi0+bW0ub2JqZWN0X21lbW9yeSk7Ci0Jc2VxX3ByaW50ZihtLCAiJXUgcGlubmVkXG4iLCBkZXZfcHJpdi0+bW0ucGluX2NvdW50KTsKLQlzZXFfcHJpbnRmKG0sICIlenUgcGluIGJ5dGVzXG4iLCBkZXZfcHJpdi0+bW0ucGluX21lbW9yeSk7Ci0Jc2VxX3ByaW50ZihtLCAiJXUgb2JqZWN0cyBpbiBndHRcbiIsIGRldl9wcml2LT5tbS5ndHRfY291bnQpOwotCXNlcV9wcmludGYobSwgIiV6dSBndHQgYnl0ZXNcbiIsIGRldl9wcml2LT5tbS5ndHRfbWVtb3J5KTsKLQlzZXFfcHJpbnRmKG0sICIlenUgZ3R0IHRvdGFsXG4iLCBkZXZfcHJpdi0+bW0uZ3R0X3RvdGFsKTsKKwlzZXFfcHJpbnRmKG0sICIldSBvYmplY3RzLCAlenUgYnl0ZXNcbiIsCisJCSAgIGRldl9wcml2LT5tbS5vYmplY3RfY291bnQsCisJCSAgIGRldl9wcml2LT5tbS5vYmplY3RfbWVtb3J5KTsKKworCXNpemUgPSBjb3VudCA9IG1hcHBhYmxlX3NpemUgPSBtYXBwYWJsZV9jb3VudCA9IDA7CisJY291bnRfb2JqZWN0cygmZGV2X3ByaXYtPm1tLmd0dF9saXN0LCBndHRfbGlzdCk7CisJc2VxX3ByaW50ZihtLCAiJXUgWyV1XSBvYmplY3RzLCAlenUgWyV6dV0gYnl0ZXMgaW4gZ3R0XG4iLAorCQkgICBjb3VudCwgbWFwcGFibGVfY291bnQsIHNpemUsIG1hcHBhYmxlX3NpemUpOworCisJc2l6ZSA9IGNvdW50ID0gbWFwcGFibGVfc2l6ZSA9IG1hcHBhYmxlX2NvdW50ID0gMDsKKwljb3VudF9vYmplY3RzKCZkZXZfcHJpdi0+bW0uYWN0aXZlX2xpc3QsIG1tX2xpc3QpOworCWNvdW50X29iamVjdHMoJmRldl9wcml2LT5tbS5mbHVzaGluZ19saXN0LCBtbV9saXN0KTsKKwlzZXFfcHJpbnRmKG0sICIgICV1IFsldV0gYWN0aXZlIG9iamVjdHMsICV6dSBbJXp1XSBieXRlc1xuIiwKKwkJICAgY291bnQsIG1hcHBhYmxlX2NvdW50LCBzaXplLCBtYXBwYWJsZV9zaXplKTsKKworCXNpemUgPSBjb3VudCA9IG1hcHBhYmxlX3NpemUgPSBtYXBwYWJsZV9jb3VudCA9IDA7CisJY291bnRfb2JqZWN0cygmZGV2X3ByaXYtPm1tLnBpbm5lZF9saXN0LCBtbV9saXN0KTsKKwlzZXFfcHJpbnRmKG0sICIgICV1IFsldV0gcGlubmVkIG9iamVjdHMsICV6dSBbJXp1XSBieXRlc1xuIiwKKwkJICAgY291bnQsIG1hcHBhYmxlX2NvdW50LCBzaXplLCBtYXBwYWJsZV9zaXplKTsKKworCXNpemUgPSBjb3VudCA9IG1hcHBhYmxlX3NpemUgPSBtYXBwYWJsZV9jb3VudCA9IDA7CisJY291bnRfb2JqZWN0cygmZGV2X3ByaXYtPm1tLmluYWN0aXZlX2xpc3QsIG1tX2xpc3QpOworCXNlcV9wcmludGYobSwgIiAgJXUgWyV1XSBpbmFjdGl2ZSBvYmplY3RzLCAlenUgWyV6dV0gYnl0ZXNcbiIsCisJCSAgIGNvdW50LCBtYXBwYWJsZV9jb3VudCwgc2l6ZSwgbWFwcGFibGVfc2l6ZSk7CisKKwlzaXplID0gY291bnQgPSBtYXBwYWJsZV9zaXplID0gbWFwcGFibGVfY291bnQgPSAwOworCWNvdW50X29iamVjdHMoJmRldl9wcml2LT5tbS5kZWZlcnJlZF9mcmVlX2xpc3QsIG1tX2xpc3QpOworCXNlcV9wcmludGYobSwgIiAgJXUgWyV1XSBmcmVlZCBvYmplY3RzLCAlenUgWyV6dV0gYnl0ZXNcbiIsCisJCSAgIGNvdW50LCBtYXBwYWJsZV9jb3VudCwgc2l6ZSwgbWFwcGFibGVfc2l6ZSk7CisKKwlzaXplID0gY291bnQgPSBtYXBwYWJsZV9zaXplID0gbWFwcGFibGVfY291bnQgPSAwOworCWxpc3RfZm9yX2VhY2hfZW50cnkob2JqLCAmZGV2X3ByaXYtPm1tLmd0dF9saXN0LCBndHRfbGlzdCkgeworCQlpZiAob2JqLT5mYXVsdF9tYXBwYWJsZSkgeworCQkJc2l6ZSArPSBvYmotPmd0dF9zcGFjZS0+c2l6ZTsKKwkJCSsrY291bnQ7CisJCX0KKwkJaWYgKG9iai0+cGluX21hcHBhYmxlKSB7CisJCQltYXBwYWJsZV9zaXplICs9IG9iai0+Z3R0X3NwYWNlLT5zaXplOworCQkJKyttYXBwYWJsZV9jb3VudDsKKwkJfQorCX0KKwlzZXFfcHJpbnRmKG0sICIldSBwaW5uZWQgbWFwcGFibGUgb2JqZWN0cywgJXp1IGJ5dGVzXG4iLAorCQkgICBtYXBwYWJsZV9jb3VudCwgbWFwcGFibGVfc2l6ZSk7CisJc2VxX3ByaW50ZihtLCAiJXUgZmF1bHQgbWFwcGFibGUgb2JqZWN0cywgJXp1IGJ5dGVzXG4iLAorCQkgICBjb3VudCwgc2l6ZSk7CisKKwlzZXFfcHJpbnRmKG0sICIlenUgWyV6dV0gZ3R0IHRvdGFsXG4iLAorCQkgICBkZXZfcHJpdi0+bW0uZ3R0X3RvdGFsLCBkZXZfcHJpdi0+bW0ubWFwcGFibGVfZ3R0X3RvdGFsKTsKIAogCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwogCkBAIC0yNDMsMTQgKzMwOSwxNCBAQAogCQkJc2VxX3ByaW50ZihtLCAiJWQgcHJlcGFyZXNcbiIsIHdvcmstPnBlbmRpbmcpOwogCiAJCQlpZiAod29yay0+b2xkX2ZiX29iaikgewotCQkJCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmpfcHJpdiA9IHRvX2ludGVsX2JvKHdvcmstPm9sZF9mYl9vYmopOwotCQkJCWlmKG9ial9wcml2KQotCQkJCQlzZXFfcHJpbnRmKG0sICJPbGQgZnJhbWVidWZmZXIgZ3R0X29mZnNldCAweCUwOHhcbiIsIG9ial9wcml2LT5ndHRfb2Zmc2V0ICk7CisJCQkJc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaiA9IHdvcmstPm9sZF9mYl9vYmo7CisJCQkJaWYgKG9iaikKKwkJCQkJc2VxX3ByaW50ZihtLCAiT2xkIGZyYW1lYnVmZmVyIGd0dF9vZmZzZXQgMHglMDh4XG4iLCBvYmotPmd0dF9vZmZzZXQpOwogCQkJfQogCQkJaWYgKHdvcmstPnBlbmRpbmdfZmxpcF9vYmopIHsKLQkJCQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqX3ByaXYgPSB0b19pbnRlbF9ibyh3b3JrLT5wZW5kaW5nX2ZsaXBfb2JqKTsKLQkJCQlpZihvYmpfcHJpdikKLQkJCQkJc2VxX3ByaW50ZihtLCAiTmV3IGZyYW1lYnVmZmVyIGd0dF9vZmZzZXQgMHglMDh4XG4iLCBvYmpfcHJpdi0+Z3R0X29mZnNldCApOworCQkJCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmogPSB3b3JrLT5wZW5kaW5nX2ZsaXBfb2JqOworCQkJCWlmIChvYmopCisJCQkJCXNlcV9wcmludGYobSwgIk5ldyBmcmFtZWJ1ZmZlciBndHRfb2Zmc2V0IDB4JTA4eFxuIiwgb2JqLT5ndHRfb2Zmc2V0KTsKIAkJCX0KIAkJfQogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPmV2ZW50X2xvY2ssIGZsYWdzKTsKQEAgLTI2NSw0NCArMzMxLDgwIEBACiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IG5vZGUtPm1pbm9yLT5kZXY7CiAJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJc3RydWN0IGRybV9pOTE1X2dlbV9yZXF1ZXN0ICpnZW1fcmVxdWVzdDsKLQlpbnQgcmV0OworCWludCByZXQsIGNvdW50OwogCiAJcmV0ID0gbXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZkZXYtPnN0cnVjdF9tdXRleCk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAotCXNlcV9wcmludGYobSwgIlJlcXVlc3Q6XG4iKTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGdlbV9yZXF1ZXN0LCAmZGV2X3ByaXYtPnJlbmRlcl9yaW5nLnJlcXVlc3RfbGlzdCwKLQkJCWxpc3QpIHsKLQkJc2VxX3ByaW50ZihtLCAiICAgICVkIEAgJWRcbiIsCi0JCQkgICBnZW1fcmVxdWVzdC0+c2Vxbm8sCi0JCQkgICAoaW50KSAoamlmZmllcyAtIGdlbV9yZXF1ZXN0LT5lbWl0dGVkX2ppZmZpZXMpKTsKKwljb3VudCA9IDA7CisJaWYgKCFsaXN0X2VtcHR5KCZkZXZfcHJpdi0+cmluZ1tSQ1NdLnJlcXVlc3RfbGlzdCkpIHsKKwkJc2VxX3ByaW50ZihtLCAiUmVuZGVyIHJlcXVlc3RzOlxuIik7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkoZ2VtX3JlcXVlc3QsCisJCQkJICAgICZkZXZfcHJpdi0+cmluZ1tSQ1NdLnJlcXVlc3RfbGlzdCwKKwkJCQkgICAgbGlzdCkgeworCQkJc2VxX3ByaW50ZihtLCAiICAgICVkIEAgJWRcbiIsCisJCQkJICAgZ2VtX3JlcXVlc3QtPnNlcW5vLAorCQkJCSAgIChpbnQpIChqaWZmaWVzIC0gZ2VtX3JlcXVlc3QtPmVtaXR0ZWRfamlmZmllcykpOworCQl9CisJCWNvdW50Kys7CisJfQorCWlmICghbGlzdF9lbXB0eSgmZGV2X3ByaXYtPnJpbmdbVkNTXS5yZXF1ZXN0X2xpc3QpKSB7CisJCXNlcV9wcmludGYobSwgIkJTRCByZXF1ZXN0czpcbiIpOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGdlbV9yZXF1ZXN0LAorCQkJCSAgICAmZGV2X3ByaXYtPnJpbmdbVkNTXS5yZXF1ZXN0X2xpc3QsCisJCQkJICAgIGxpc3QpIHsKKwkJCXNlcV9wcmludGYobSwgIiAgICAlZCBAICVkXG4iLAorCQkJCSAgIGdlbV9yZXF1ZXN0LT5zZXFubywKKwkJCQkgICAoaW50KSAoamlmZmllcyAtIGdlbV9yZXF1ZXN0LT5lbWl0dGVkX2ppZmZpZXMpKTsKKwkJfQorCQljb3VudCsrOworCX0KKwlpZiAoIWxpc3RfZW1wdHkoJmRldl9wcml2LT5yaW5nW0JDU10ucmVxdWVzdF9saXN0KSkgeworCQlzZXFfcHJpbnRmKG0sICJCTFQgcmVxdWVzdHM6XG4iKTsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShnZW1fcmVxdWVzdCwKKwkJCQkgICAgJmRldl9wcml2LT5yaW5nW0JDU10ucmVxdWVzdF9saXN0LAorCQkJCSAgICBsaXN0KSB7CisJCQlzZXFfcHJpbnRmKG0sICIgICAgJWQgQCAlZFxuIiwKKwkJCQkgICBnZW1fcmVxdWVzdC0+c2Vxbm8sCisJCQkJICAgKGludCkgKGppZmZpZXMgLSBnZW1fcmVxdWVzdC0+ZW1pdHRlZF9qaWZmaWVzKSk7CisJCX0KKwkJY291bnQrKzsKIAl9CiAJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CiAKKwlpZiAoY291bnQgPT0gMCkKKwkJc2VxX3ByaW50ZihtLCAiTm8gcmVxdWVzdHNcbiIpOworCiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyB2b2lkIGk5MTVfcmluZ19zZXFub19pbmZvKHN0cnVjdCBzZXFfZmlsZSAqbSwKKwkJCQkgc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nKQoreworCWlmIChyaW5nLT5nZXRfc2Vxbm8pIHsKKwkJc2VxX3ByaW50ZihtLCAiQ3VycmVudCBzZXF1ZW5jZSAoJXMpOiAlZFxuIiwKKwkJCSAgIHJpbmctPm5hbWUsIHJpbmctPmdldF9zZXFubyhyaW5nKSk7CisJCXNlcV9wcmludGYobSwgIldhaXRlciBzZXF1ZW5jZSAoJXMpOiAgJWRcbiIsCisJCQkgICByaW5nLT5uYW1lLCByaW5nLT53YWl0aW5nX3NlcW5vKTsKKwkJc2VxX3ByaW50ZihtLCAiSVJRIHNlcXVlbmNlICglcyk6ICAgICAlZFxuIiwKKwkJCSAgIHJpbmctPm5hbWUsIHJpbmctPmlycV9zZXFubyk7CisJfQorfQorCiBzdGF0aWMgaW50IGk5MTVfZ2VtX3NlcW5vX2luZm8oc3RydWN0IHNlcV9maWxlICptLCB2b2lkICpkYXRhKQogewogCXN0cnVjdCBkcm1faW5mb19ub2RlICpub2RlID0gKHN0cnVjdCBkcm1faW5mb19ub2RlICopIG0tPnByaXZhdGU7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IG5vZGUtPm1pbm9yLT5kZXY7CiAJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Ci0JaW50IHJldDsKKwlpbnQgcmV0LCBpOwogCiAJcmV0ID0gbXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZkZXYtPnN0cnVjdF9tdXRleCk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAotCWlmIChkZXZfcHJpdi0+cmVuZGVyX3Jpbmcuc3RhdHVzX3BhZ2UucGFnZV9hZGRyICE9IE5VTEwpIHsKLQkJc2VxX3ByaW50ZihtLCAiQ3VycmVudCBzZXF1ZW5jZTogJWRcbiIsCi0JCQkgICBkZXZfcHJpdi0+cmVuZGVyX3JpbmcuZ2V0X3NlcW5vKGRldiwgJmRldl9wcml2LT5yZW5kZXJfcmluZykpOwotCX0gZWxzZSB7Ci0JCXNlcV9wcmludGYobSwgIkN1cnJlbnQgc2VxdWVuY2U6IGh3cyB1bmluaXRpYWxpemVkXG4iKTsKLQl9Ci0Jc2VxX3ByaW50ZihtLCAiV2FpdGVyIHNlcXVlbmNlOiAgJWRcbiIsCi0JCQlkZXZfcHJpdi0+bW0ud2FpdGluZ19nZW1fc2Vxbm8pOwotCXNlcV9wcmludGYobSwgIklSUSBzZXF1ZW5jZTogICAgICVkXG4iLCBkZXZfcHJpdi0+bW0uaXJxX2dlbV9zZXFubyk7CisJZm9yIChpID0gMDsgaSA8IEk5MTVfTlVNX1JJTkdTOyBpKyspCisJCWk5MTVfcmluZ19zZXFub19pbmZvKG0sICZkZXZfcHJpdi0+cmluZ1tpXSk7CiAKIAltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKIApAQCAtMzE1LDcgKzQxNyw3IEBACiAJc3RydWN0IGRybV9pbmZvX25vZGUgKm5vZGUgPSAoc3RydWN0IGRybV9pbmZvX25vZGUgKikgbS0+cHJpdmF0ZTsKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gbm9kZS0+bWlub3ItPmRldjsKIAlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlpbnQgcmV0OworCWludCByZXQsIGk7CiAKIAlyZXQgPSBtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJmRldi0+c3RydWN0X211dGV4KTsKIAlpZiAocmV0KQpAQCAtMzU0LDE2ICs0NTYsOCBAQAogCX0KIAlzZXFfcHJpbnRmKG0sICJJbnRlcnJ1cHRzIHJlY2VpdmVkOiAlZFxuIiwKIAkJICAgYXRvbWljX3JlYWQoJmRldl9wcml2LT5pcnFfcmVjZWl2ZWQpKTsKLQlpZiAoZGV2X3ByaXYtPnJlbmRlcl9yaW5nLnN0YXR1c19wYWdlLnBhZ2VfYWRkciAhPSBOVUxMKSB7Ci0JCXNlcV9wcmludGYobSwgIkN1cnJlbnQgc2VxdWVuY2U6ICAgICVkXG4iLAotCQkJICAgZGV2X3ByaXYtPnJlbmRlcl9yaW5nLmdldF9zZXFubyhkZXYsICZkZXZfcHJpdi0+cmVuZGVyX3JpbmcpKTsKLQl9IGVsc2UgewotCQlzZXFfcHJpbnRmKG0sICJDdXJyZW50IHNlcXVlbmNlOiAgICBod3MgdW5pbml0aWFsaXplZFxuIik7Ci0JfQotCXNlcV9wcmludGYobSwgIldhaXRlciBzZXF1ZW5jZTogICAgICVkXG4iLAotCQkgICBkZXZfcHJpdi0+bW0ud2FpdGluZ19nZW1fc2Vxbm8pOwotCXNlcV9wcmludGYobSwgIklSUSBzZXF1ZW5jZTogICAgICAgICVkXG4iLAotCQkgICBkZXZfcHJpdi0+bW0uaXJxX2dlbV9zZXFubyk7CisJZm9yIChpID0gMDsgaSA8IEk5MTVfTlVNX1JJTkdTOyBpKyspCisJCWk5MTVfcmluZ19zZXFub19pbmZvKG0sICZkZXZfcHJpdi0+cmluZ1tpXSk7CiAJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CiAKIAlyZXR1cm4gMDsKQEAgLTM4MywyOSArNDc3LDE3IEBACiAJc2VxX3ByaW50ZihtLCAiUmVzZXJ2ZWQgZmVuY2VzID0gJWRcbiIsIGRldl9wcml2LT5mZW5jZV9yZWdfc3RhcnQpOwogCXNlcV9wcmludGYobSwgIlRvdGFsIGZlbmNlcyA9ICVkXG4iLCBkZXZfcHJpdi0+bnVtX2ZlbmNlX3JlZ3MpOwogCWZvciAoaSA9IDA7IGkgPCBkZXZfcHJpdi0+bnVtX2ZlbmNlX3JlZ3M7IGkrKykgewotCQlzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iaiA9IGRldl9wcml2LT5mZW5jZV9yZWdzW2ldLm9iajsKKwkJc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaiA9IGRldl9wcml2LT5mZW5jZV9yZWdzW2ldLm9iajsKIAotCQlpZiAob2JqID09IE5VTEwpIHsKLQkJCXNlcV9wcmludGYobSwgIkZlbmNlZCBvYmplY3RbJTJkXSA9IHVudXNlZFxuIiwgaSk7Ci0JCX0gZWxzZSB7Ci0JCQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqX3ByaXY7Ci0KLQkJCW9ial9wcml2ID0gdG9faW50ZWxfYm8ob2JqKTsKLQkJCXNlcV9wcmludGYobSwgIkZlbmNlZCBvYmplY3RbJTJkXSA9ICVwOiAlcyAiCi0JCQkJICAgIiUwOHggJTA4enggJTA4eCAlcyAlMDh4ICUwOHggJWQiLAotCQkJCSAgIGksIG9iaiwgZ2V0X3Bpbl9mbGFnKG9ial9wcml2KSwKLQkJCQkgICBvYmpfcHJpdi0+Z3R0X29mZnNldCwKLQkJCQkgICBvYmotPnNpemUsIG9ial9wcml2LT5zdHJpZGUsCi0JCQkJICAgZ2V0X3RpbGluZ19mbGFnKG9ial9wcml2KSwKLQkJCQkgICBvYmotPnJlYWRfZG9tYWlucywgb2JqLT53cml0ZV9kb21haW4sCi0JCQkJICAgb2JqX3ByaXYtPmxhc3RfcmVuZGVyaW5nX3NlcW5vKTsKLQkJCWlmIChvYmotPm5hbWUpCi0JCQkJc2VxX3ByaW50ZihtLCAiIChuYW1lOiAlZCkiLCBvYmotPm5hbWUpOwotCQkJc2VxX3ByaW50ZihtLCAiXG4iKTsKLQkJfQorCQlzZXFfcHJpbnRmKG0sICJGZW5jZWQgb2JqZWN0WyUyZF0gPSAiLCBpKTsKKwkJaWYgKG9iaiA9PSBOVUxMKQorCQkJc2VxX3ByaW50ZihtLCAidW51c2VkIik7CisJCWVsc2UKKwkJCWRlc2NyaWJlX29iaihtLCBvYmopOworCQlzZXFfcHJpbnRmKG0sICJcbiIpOwogCX0KLQltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKIAorCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwogCXJldHVybiAwOwogfQogCkBAIC00MTQsMTAgKzQ5NiwxMiBAQAogCXN0cnVjdCBkcm1faW5mb19ub2RlICpub2RlID0gKHN0cnVjdCBkcm1faW5mb19ub2RlICopIG0tPnByaXZhdGU7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IG5vZGUtPm1pbm9yLT5kZXY7CiAJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Ci0JaW50IGk7CisJc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nOwogCXZvbGF0aWxlIHUzMiAqaHdzOworCWludCBpOwogCi0JaHdzID0gKHZvbGF0aWxlIHUzMiAqKWRldl9wcml2LT5yZW5kZXJfcmluZy5zdGF0dXNfcGFnZS5wYWdlX2FkZHI7CisJcmluZyA9ICZkZXZfcHJpdi0+cmluZ1sodWludHB0cl90KW5vZGUtPmluZm9fZW50LT5kYXRhXTsKKwlod3MgPSAodm9sYXRpbGUgdTMyICopcmluZy0+c3RhdHVzX3BhZ2UucGFnZV9hZGRyOwogCWlmIChod3MgPT0gTlVMTCkKIAkJcmV0dXJuIDA7CiAKQEAgLTQzMSwxNCArNTE1LDE0IEBACiAKIHN0YXRpYyB2b2lkIGk5MTVfZHVtcF9vYmplY3Qoc3RydWN0IHNlcV9maWxlICptLAogCQkJICAgICBzdHJ1Y3QgaW9fbWFwcGluZyAqbWFwcGluZywKLQkJCSAgICAgc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9ial9wcml2KQorCQkJICAgICBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqKQogewogCWludCBwYWdlLCBwYWdlX2NvdW50LCBpOwogCi0JcGFnZV9jb3VudCA9IG9ial9wcml2LT5iYXNlLnNpemUgLyBQQUdFX1NJWkU7CisJcGFnZV9jb3VudCA9IG9iai0+YmFzZS5zaXplIC8gUEFHRV9TSVpFOwogCWZvciAocGFnZSA9IDA7IHBhZ2UgPCBwYWdlX2NvdW50OyBwYWdlKyspIHsKIAkJdTMyICptZW0gPSBpb19tYXBwaW5nX21hcF93YyhtYXBwaW5nLAotCQkJCQkgICAgIG9ial9wcml2LT5ndHRfb2Zmc2V0ICsgcGFnZSAqIFBBR0VfU0laRSk7CisJCQkJCSAgICAgb2JqLT5ndHRfb2Zmc2V0ICsgcGFnZSAqIFBBR0VfU0laRSk7CiAJCWZvciAoaSA9IDA7IGkgPCBQQUdFX1NJWkU7IGkgKz0gNCkKIAkJCXNlcV9wcmludGYobSwgIiUwOHggOiAgJTA4eFxuIiwgaSwgbWVtW2kgLyA0XSk7CiAJCWlvX21hcHBpbmdfdW5tYXAobWVtKTsKQEAgLTQ1MCwyNSArNTM0LDIxIEBACiAJc3RydWN0IGRybV9pbmZvX25vZGUgKm5vZGUgPSAoc3RydWN0IGRybV9pbmZvX25vZGUgKikgbS0+cHJpdmF0ZTsKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gbm9kZS0+bWlub3ItPmRldjsKIAlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iajsKLQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqX3ByaXY7CisJc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iajsKIAlpbnQgcmV0OwogCiAJcmV0ID0gbXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZkZXYtPnN0cnVjdF9tdXRleCk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAotCWxpc3RfZm9yX2VhY2hfZW50cnkob2JqX3ByaXYsICZkZXZfcHJpdi0+bW0uYWN0aXZlX2xpc3QsIG1tX2xpc3QpIHsKLQkJb2JqID0gJm9ial9wcml2LT5iYXNlOwotCQlpZiAob2JqLT5yZWFkX2RvbWFpbnMgJiBJOTE1X0dFTV9ET01BSU5fQ09NTUFORCkgewotCQkgICAgc2VxX3ByaW50ZihtLCAiLS0tIGd0dF9vZmZzZXQgPSAweCUwOHhcbiIsCi0JCQkgICAgICAgb2JqX3ByaXYtPmd0dF9vZmZzZXQpOwotCQkgICAgaTkxNV9kdW1wX29iamVjdChtLCBkZXZfcHJpdi0+bW0uZ3R0X21hcHBpbmcsIG9ial9wcml2KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KG9iaiwgJmRldl9wcml2LT5tbS5hY3RpdmVfbGlzdCwgbW1fbGlzdCkgeworCQlpZiAob2JqLT5iYXNlLnJlYWRfZG9tYWlucyAmIEk5MTVfR0VNX0RPTUFJTl9DT01NQU5EKSB7CisJCSAgICBzZXFfcHJpbnRmKG0sICItLS0gZ3R0X29mZnNldCA9IDB4JTA4eFxuIiwgb2JqLT5ndHRfb2Zmc2V0KTsKKwkJICAgIGk5MTVfZHVtcF9vYmplY3QobSwgZGV2X3ByaXYtPm1tLmd0dF9tYXBwaW5nLCBvYmopOwogCQl9CiAJfQogCiAJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7Ci0KIAlyZXR1cm4gMDsKIH0KIApAQCAtNDc3LDE5ICs1NTcsMjEgQEAKIAlzdHJ1Y3QgZHJtX2luZm9fbm9kZSAqbm9kZSA9IChzdHJ1Y3QgZHJtX2luZm9fbm9kZSAqKSBtLT5wcml2YXRlOwogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBub2RlLT5taW5vci0+ZGV2OwogCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZzsKIAlpbnQgcmV0OwogCiAJcmV0ID0gbXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZkZXYtPnN0cnVjdF9tdXRleCk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAotCWlmICghZGV2X3ByaXYtPnJlbmRlcl9yaW5nLmdlbV9vYmplY3QpIHsKKwlyaW5nID0gJmRldl9wcml2LT5yaW5nWyh1aW50cHRyX3Qpbm9kZS0+aW5mb19lbnQtPmRhdGFdOworCWlmICghcmluZy0+b2JqKSB7CiAJCXNlcV9wcmludGYobSwgIk5vIHJpbmdidWZmZXIgc2V0dXBcbiIpOwogCX0gZWxzZSB7Ci0JCXU4ICp2aXJ0ID0gZGV2X3ByaXYtPnJlbmRlcl9yaW5nLnZpcnR1YWxfc3RhcnQ7CisJCXU4ICp2aXJ0ID0gcmluZy0+dmlydHVhbF9zdGFydDsKIAkJdWludDMyX3Qgb2ZmOwogCi0JCWZvciAob2ZmID0gMDsgb2ZmIDwgZGV2X3ByaXYtPnJlbmRlcl9yaW5nLnNpemU7IG9mZiArPSA0KSB7CisJCWZvciAob2ZmID0gMDsgb2ZmIDwgcmluZy0+c2l6ZTsgb2ZmICs9IDQpIHsKIAkJCXVpbnQzMl90ICpwdHIgPSAodWludDMyX3QgKikodmlydCArIG9mZik7CiAJCQlzZXFfcHJpbnRmKG0sICIlMDh4IDogICUwOHhcbiIsIG9mZiwgKnB0cik7CiAJCX0KQEAgLTUwNCwxOSArNTg2LDM4IEBACiAJc3RydWN0IGRybV9pbmZvX25vZGUgKm5vZGUgPSAoc3RydWN0IGRybV9pbmZvX25vZGUgKikgbS0+cHJpdmF0ZTsKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gbm9kZS0+bWlub3ItPmRldjsKIAlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQl1bnNpZ25lZCBpbnQgaGVhZCwgdGFpbDsKKwlzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmc7CiAKLQloZWFkID0gSTkxNV9SRUFEKFBSQjBfSEVBRCkgJiBIRUFEX0FERFI7Ci0JdGFpbCA9IEk5MTVfUkVBRChQUkIwX1RBSUwpICYgVEFJTF9BRERSOworCXJpbmcgPSAmZGV2X3ByaXYtPnJpbmdbKHVpbnRwdHJfdClub2RlLT5pbmZvX2VudC0+ZGF0YV07CisJaWYgKHJpbmctPnNpemUgPT0gMCkKKwkJcmV0dXJuIDA7CiAKLQlzZXFfcHJpbnRmKG0sICJSaW5nSGVhZCA6ICAlMDh4XG4iLCBoZWFkKTsKLQlzZXFfcHJpbnRmKG0sICJSaW5nVGFpbCA6ICAlMDh4XG4iLCB0YWlsKTsKLQlzZXFfcHJpbnRmKG0sICJSaW5nU2l6ZSA6ICAlMDhseFxuIiwgZGV2X3ByaXYtPnJlbmRlcl9yaW5nLnNpemUpOwotCXNlcV9wcmludGYobSwgIkFjdGhkIDogICAgICUwOHhcbiIsIEk5MTVfUkVBRChJTlRFTF9JTkZPKGRldiktPmdlbiA+PSA0ID8gQUNUSERfSTk2NSA6IEFDVEhEKSk7CisJc2VxX3ByaW50ZihtLCAiUmluZyAlczpcbiIsIHJpbmctPm5hbWUpOworCXNlcV9wcmludGYobSwgIiAgSGVhZCA6ICAgICUwOHhcbiIsIEk5MTVfUkVBRF9IRUFEKHJpbmcpICYgSEVBRF9BRERSKTsKKwlzZXFfcHJpbnRmKG0sICIgIFRhaWwgOiAgICAlMDh4XG4iLCBJOTE1X1JFQURfVEFJTChyaW5nKSAmIFRBSUxfQUREUik7CisJc2VxX3ByaW50ZihtLCAiICBTaXplIDogICAgJTA4eFxuIiwgcmluZy0+c2l6ZSk7CisJc2VxX3ByaW50ZihtLCAiICBBY3RpdmUgOiAgJTA4eFxuIiwgaW50ZWxfcmluZ19nZXRfYWN0aXZlX2hlYWQocmluZykpOworCXNlcV9wcmludGYobSwgIiAgTk9QSUQgOiAgICUwOHhcbiIsIEk5MTVfUkVBRF9OT1BJRChyaW5nKSk7CisJaWYgKElTX0dFTjYoZGV2KSkgeworCQlzZXFfcHJpbnRmKG0sICIgIFN5bmMgMCA6ICAgJTA4eFxuIiwgSTkxNV9SRUFEX1NZTkNfMChyaW5nKSk7CisJCXNlcV9wcmludGYobSwgIiAgU3luYyAxIDogICAlMDh4XG4iLCBJOTE1X1JFQURfU1lOQ18xKHJpbmcpKTsKKwl9CisJc2VxX3ByaW50ZihtLCAiICBDb250cm9sIDogJTA4eFxuIiwgSTkxNV9SRUFEX0NUTChyaW5nKSk7CisJc2VxX3ByaW50ZihtLCAiICBTdGFydCA6ICAgJTA4eFxuIiwgSTkxNV9SRUFEX1NUQVJUKHJpbmcpKTsKIAogCXJldHVybiAwOwogfQogCitzdGF0aWMgY29uc3QgY2hhciAqcmluZ19zdHIoaW50IHJpbmcpCit7CisJc3dpdGNoIChyaW5nKSB7CisJY2FzZSBSSU5HX1JFTkRFUjogcmV0dXJuICIgcmVuZGVyIjsKKwljYXNlIFJJTkdfQlNEOiByZXR1cm4gIiBic2QiOworCWNhc2UgUklOR19CTFQ6IHJldHVybiAiIGJsdCI7CisJZGVmYXVsdDogcmV0dXJuICIiOworCX0KK30KKwogc3RhdGljIGNvbnN0IGNoYXIgKnBpbl9mbGFnKGludCBwaW5uZWQpCiB7CiAJaWYgKHBpbm5lZCA+IDApCkBAIC01NDcsNiArNjQ4LDM2IEBACiAJcmV0dXJuIHB1cmdlYWJsZSA/ICIgcHVyZ2VhYmxlIiA6ICIiOwogfQogCitzdGF0aWMgdm9pZCBwcmludF9lcnJvcl9idWZmZXJzKHN0cnVjdCBzZXFfZmlsZSAqbSwKKwkJCQljb25zdCBjaGFyICpuYW1lLAorCQkJCXN0cnVjdCBkcm1faTkxNV9lcnJvcl9idWZmZXIgKmVyciwKKwkJCQlpbnQgY291bnQpCit7CisJc2VxX3ByaW50ZihtLCAiJXMgWyVkXTpcbiIsIG5hbWUsIGNvdW50KTsKKworCXdoaWxlIChjb3VudC0tKSB7CisJCXNlcV9wcmludGYobSwgIiAgJTA4eCAlOHpkICUwNHggJTA0eCAlMDh4JXMlcyVzJXMlcyIsCisJCQkgICBlcnItPmd0dF9vZmZzZXQsCisJCQkgICBlcnItPnNpemUsCisJCQkgICBlcnItPnJlYWRfZG9tYWlucywKKwkJCSAgIGVyci0+d3JpdGVfZG9tYWluLAorCQkJICAgZXJyLT5zZXFubywKKwkJCSAgIHBpbl9mbGFnKGVyci0+cGlubmVkKSwKKwkJCSAgIHRpbGluZ19mbGFnKGVyci0+dGlsaW5nKSwKKwkJCSAgIGRpcnR5X2ZsYWcoZXJyLT5kaXJ0eSksCisJCQkgICBwdXJnZWFibGVfZmxhZyhlcnItPnB1cmdlYWJsZSksCisJCQkgICByaW5nX3N0cihlcnItPnJpbmcpKTsKKworCQlpZiAoZXJyLT5uYW1lKQorCQkJc2VxX3ByaW50ZihtLCAiIChuYW1lOiAlZCkiLCBlcnItPm5hbWUpOworCQlpZiAoZXJyLT5mZW5jZV9yZWcgIT0gSTkxNV9GRU5DRV9SRUdfTk9ORSkKKwkJCXNlcV9wcmludGYobSwgIiAoZmVuY2U6ICVkKSIsIGVyci0+ZmVuY2VfcmVnKTsKKworCQlzZXFfcHJpbnRmKG0sICJcbiIpOworCQllcnIrKzsKKwl9Cit9CisKIHN0YXRpYyBpbnQgaTkxNV9lcnJvcl9zdGF0ZShzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnVudXNlZCkKIHsKIAlzdHJ1Y3QgZHJtX2luZm9fbm9kZSAqbm9kZSA9IChzdHJ1Y3QgZHJtX2luZm9fbm9kZSAqKSBtLT5wcml2YXRlOwpAQCAtNTY4LDQxICs2OTksNDYgQEAKIAkJICAgZXJyb3ItPnRpbWUudHZfdXNlYyk7CiAJc2VxX3ByaW50ZihtLCAiUENJIElEOiAweCUwNHhcbiIsIGRldi0+cGNpX2RldmljZSk7CiAJc2VxX3ByaW50ZihtLCAiRUlSOiAweCUwOHhcbiIsIGVycm9yLT5laXIpOwotCXNlcV9wcmludGYobSwgIiAgUEdUQkxfRVI6IDB4JTA4eFxuIiwgZXJyb3ItPnBndGJsX2VyKTsKLQlzZXFfcHJpbnRmKG0sICIgIElOU1RQTTogMHglMDh4XG4iLCBlcnJvci0+aW5zdHBtKTsKKwlzZXFfcHJpbnRmKG0sICJQR1RCTF9FUjogMHglMDh4XG4iLCBlcnJvci0+cGd0YmxfZXIpOworCWlmIChJTlRFTF9JTkZPKGRldiktPmdlbiA+PSA2KSB7CisJCXNlcV9wcmludGYobSwgIkVSUk9SOiAweCUwOHhcbiIsIGVycm9yLT5lcnJvcik7CisJCXNlcV9wcmludGYobSwgIkJsaXR0ZXIgY29tbWFuZCBzdHJlYW06XG4iKTsKKwkJc2VxX3ByaW50ZihtLCAiICBBQ1RIRDogICAgMHglMDh4XG4iLCBlcnJvci0+YmNzX2FjdGhkKTsKKwkJc2VxX3ByaW50ZihtLCAiICBJUEVJUjogICAgMHglMDh4XG4iLCBlcnJvci0+YmNzX2lwZWlyKTsKKwkJc2VxX3ByaW50ZihtLCAiICBJUEVIUjogICAgMHglMDh4XG4iLCBlcnJvci0+YmNzX2lwZWhyKTsKKwkJc2VxX3ByaW50ZihtLCAiICBJTlNURE9ORTogMHglMDh4XG4iLCBlcnJvci0+YmNzX2luc3Rkb25lKTsKKwkJc2VxX3ByaW50ZihtLCAiICBzZXFubzogICAgMHglMDh4XG4iLCBlcnJvci0+YmNzX3NlcW5vKTsKKwkJc2VxX3ByaW50ZihtLCAiVmlkZW8gKEJTRCkgY29tbWFuZCBzdHJlYW06XG4iKTsKKwkJc2VxX3ByaW50ZihtLCAiICBBQ1RIRDogICAgMHglMDh4XG4iLCBlcnJvci0+dmNzX2FjdGhkKTsKKwkJc2VxX3ByaW50ZihtLCAiICBJUEVJUjogICAgMHglMDh4XG4iLCBlcnJvci0+dmNzX2lwZWlyKTsKKwkJc2VxX3ByaW50ZihtLCAiICBJUEVIUjogICAgMHglMDh4XG4iLCBlcnJvci0+dmNzX2lwZWhyKTsKKwkJc2VxX3ByaW50ZihtLCAiICBJTlNURE9ORTogMHglMDh4XG4iLCBlcnJvci0+dmNzX2luc3Rkb25lKTsKKwkJc2VxX3ByaW50ZihtLCAiICBzZXFubzogICAgMHglMDh4XG4iLCBlcnJvci0+dmNzX3NlcW5vKTsKKwl9CisJc2VxX3ByaW50ZihtLCAiUmVuZGVyIGNvbW1hbmQgc3RyZWFtOlxuIik7CisJc2VxX3ByaW50ZihtLCAiICBBQ1RIRDogMHglMDh4XG4iLCBlcnJvci0+YWN0aGQpOwogCXNlcV9wcmludGYobSwgIiAgSVBFSVI6IDB4JTA4eFxuIiwgZXJyb3ItPmlwZWlyKTsKIAlzZXFfcHJpbnRmKG0sICIgIElQRUhSOiAweCUwOHhcbiIsIGVycm9yLT5pcGVocik7CiAJc2VxX3ByaW50ZihtLCAiICBJTlNURE9ORTogMHglMDh4XG4iLCBlcnJvci0+aW5zdGRvbmUpOwotCXNlcV9wcmludGYobSwgIiAgQUNUSEQ6IDB4JTA4eFxuIiwgZXJyb3ItPmFjdGhkKTsKIAlpZiAoSU5URUxfSU5GTyhkZXYpLT5nZW4gPj0gNCkgewotCQlzZXFfcHJpbnRmKG0sICIgIElOU1RQUzogMHglMDh4XG4iLCBlcnJvci0+aW5zdHBzKTsKIAkJc2VxX3ByaW50ZihtLCAiICBJTlNURE9ORTE6IDB4JTA4eFxuIiwgZXJyb3ItPmluc3Rkb25lMSk7CisJCXNlcV9wcmludGYobSwgIiAgSU5TVFBTOiAweCUwOHhcbiIsIGVycm9yLT5pbnN0cHMpOwogCX0KLQlzZXFfcHJpbnRmKG0sICJzZXFubzogMHglMDh4XG4iLCBlcnJvci0+c2Vxbm8pOworCXNlcV9wcmludGYobSwgIiAgSU5TVFBNOiAweCUwOHhcbiIsIGVycm9yLT5pbnN0cG0pOworCXNlcV9wcmludGYobSwgIiAgc2Vxbm86IDB4JTA4eFxuIiwgZXJyb3ItPnNlcW5vKTsKIAotCWlmIChlcnJvci0+YWN0aXZlX2JvX2NvdW50KSB7Ci0JCXNlcV9wcmludGYobSwgIkJ1ZmZlcnMgWyVkXTpcbiIsIGVycm9yLT5hY3RpdmVfYm9fY291bnQpOworCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQorCQlzZXFfcHJpbnRmKG0sICIgIGZlbmNlWyVkXSA9ICUwOGxseFxuIiwgaSwgZXJyb3ItPmZlbmNlW2ldKTsKIAotCQlmb3IgKGkgPSAwOyBpIDwgZXJyb3ItPmFjdGl2ZV9ib19jb3VudDsgaSsrKSB7Ci0JCQlzZXFfcHJpbnRmKG0sICIgICUwOHggJTh6ZCAlMDh4ICUwOHggJTA4eCVzJXMlcyVzIiwKLQkJCQkgICBlcnJvci0+YWN0aXZlX2JvW2ldLmd0dF9vZmZzZXQsCi0JCQkJICAgZXJyb3ItPmFjdGl2ZV9ib1tpXS5zaXplLAotCQkJCSAgIGVycm9yLT5hY3RpdmVfYm9baV0ucmVhZF9kb21haW5zLAotCQkJCSAgIGVycm9yLT5hY3RpdmVfYm9baV0ud3JpdGVfZG9tYWluLAotCQkJCSAgIGVycm9yLT5hY3RpdmVfYm9baV0uc2Vxbm8sCi0JCQkJICAgcGluX2ZsYWcoZXJyb3ItPmFjdGl2ZV9ib1tpXS5waW5uZWQpLAotCQkJCSAgIHRpbGluZ19mbGFnKGVycm9yLT5hY3RpdmVfYm9baV0udGlsaW5nKSwKLQkJCQkgICBkaXJ0eV9mbGFnKGVycm9yLT5hY3RpdmVfYm9baV0uZGlydHkpLAotCQkJCSAgIHB1cmdlYWJsZV9mbGFnKGVycm9yLT5hY3RpdmVfYm9baV0ucHVyZ2VhYmxlKSk7CisJaWYgKGVycm9yLT5hY3RpdmVfYm8pCisJCXByaW50X2Vycm9yX2J1ZmZlcnMobSwgIkFjdGl2ZSIsCisJCQkJICAgIGVycm9yLT5hY3RpdmVfYm8sCisJCQkJICAgIGVycm9yLT5hY3RpdmVfYm9fY291bnQpOwogCi0JCQlpZiAoZXJyb3ItPmFjdGl2ZV9ib1tpXS5uYW1lKQotCQkJCXNlcV9wcmludGYobSwgIiAobmFtZTogJWQpIiwgZXJyb3ItPmFjdGl2ZV9ib1tpXS5uYW1lKTsKLQkJCWlmIChlcnJvci0+YWN0aXZlX2JvW2ldLmZlbmNlX3JlZyAhPSBJOTE1X0ZFTkNFX1JFR19OT05FKQotCQkJCXNlcV9wcmludGYobSwgIiAoZmVuY2U6ICVkKSIsIGVycm9yLT5hY3RpdmVfYm9baV0uZmVuY2VfcmVnKTsKLQotCQkJc2VxX3ByaW50ZihtLCAiXG4iKTsKLQkJfQotCX0KKwlpZiAoZXJyb3ItPnBpbm5lZF9ibykKKwkJcHJpbnRfZXJyb3JfYnVmZmVycyhtLCAiUGlubmVkIiwKKwkJCQkgICAgZXJyb3ItPnBpbm5lZF9ibywKKwkJCQkgICAgZXJyb3ItPnBpbm5lZF9ib19jb3VudCk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShlcnJvci0+YmF0Y2hidWZmZXIpOyBpKyspIHsKIAkJaWYgKGVycm9yLT5iYXRjaGJ1ZmZlcltpXSkgewpAQCAtNjM1LDYgKzc3MSw5IEBACiAJaWYgKGVycm9yLT5vdmVybGF5KQogCQlpbnRlbF9vdmVybGF5X3ByaW50X2Vycm9yX3N0YXRlKG0sIGVycm9yLT5vdmVybGF5KTsKIAorCWlmIChlcnJvci0+ZGlzcGxheSkKKwkJaW50ZWxfZGlzcGxheV9wcmludF9lcnJvcl9zdGF0ZShtLCBkZXYsIGVycm9yLT5kaXNwbGF5KTsKKwogb3V0OgogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldl9wcml2LT5lcnJvcl9sb2NrLCBmbGFncyk7CiAKQEAgLTY1OCwxNSArNzk3LDUxIEBACiAJc3RydWN0IGRybV9pbmZvX25vZGUgKm5vZGUgPSAoc3RydWN0IGRybV9pbmZvX25vZGUgKikgbS0+cHJpdmF0ZTsKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gbm9kZS0+bWlub3ItPmRldjsKIAlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQl1MTYgcmd2c3djdGwgPSBJOTE1X1JFQUQxNihNRU1TV0NUTCk7Ci0JdTE2IHJndnN0YXQgPSBJOTE1X1JFQUQxNihNRU1TVEFUX0lMSyk7CiAKLQlzZXFfcHJpbnRmKG0sICJSZXF1ZXN0ZWQgUC1zdGF0ZTogJWRcbiIsIChyZ3Zzd2N0bCA+PiA4KSAmIDB4Zik7Ci0Jc2VxX3ByaW50ZihtLCAiUmVxdWVzdGVkIFZJRDogJWRcbiIsIHJndnN3Y3RsICYgMHgzZik7Ci0Jc2VxX3ByaW50ZihtLCAiQ3VycmVudCBWSUQ6ICVkXG4iLCAocmd2c3RhdCAmIE1FTVNUQVRfVklEX01BU0spID4+Ci0JCSAgIE1FTVNUQVRfVklEX1NISUZUKTsKLQlzZXFfcHJpbnRmKG0sICJDdXJyZW50IFAtc3RhdGU6ICVkXG4iLAotCQkgICAocmd2c3RhdCAmIE1FTVNUQVRfUFNUQVRFX01BU0spID4+IE1FTVNUQVRfUFNUQVRFX1NISUZUKTsKKwlpZiAoSVNfR0VONShkZXYpKSB7CisJCXUxNiByZ3Zzd2N0bCA9IEk5MTVfUkVBRDE2KE1FTVNXQ1RMKTsKKwkJdTE2IHJndnN0YXQgPSBJOTE1X1JFQUQxNihNRU1TVEFUX0lMSyk7CisKKwkJc2VxX3ByaW50ZihtLCAiUmVxdWVzdGVkIFAtc3RhdGU6ICVkXG4iLCAocmd2c3djdGwgPj4gOCkgJiAweGYpOworCQlzZXFfcHJpbnRmKG0sICJSZXF1ZXN0ZWQgVklEOiAlZFxuIiwgcmd2c3djdGwgJiAweDNmKTsKKwkJc2VxX3ByaW50ZihtLCAiQ3VycmVudCBWSUQ6ICVkXG4iLCAocmd2c3RhdCAmIE1FTVNUQVRfVklEX01BU0spID4+CisJCQkgICBNRU1TVEFUX1ZJRF9TSElGVCk7CisJCXNlcV9wcmludGYobSwgIkN1cnJlbnQgUC1zdGF0ZTogJWRcbiIsCisJCQkgICAocmd2c3RhdCAmIE1FTVNUQVRfUFNUQVRFX01BU0spID4+IE1FTVNUQVRfUFNUQVRFX1NISUZUKTsKKwl9IGVsc2UgaWYgKElTX0dFTjYoZGV2KSkgeworCQl1MzIgZ3RfcGVyZl9zdGF0dXMgPSBJOTE1X1JFQUQoR0VONl9HVF9QRVJGX1NUQVRVUyk7CisJCXUzMiBycF9zdGF0ZV9saW1pdHMgPSBJOTE1X1JFQUQoR0VONl9SUF9TVEFURV9MSU1JVFMpOworCQl1MzIgcnBfc3RhdGVfY2FwID0gSTkxNV9SRUFEKEdFTjZfUlBfU1RBVEVfQ0FQKTsKKwkJaW50IG1heF9mcmVxOworCisJCS8qIFJQU1RBVDEgaXMgaW4gdGhlIEdUIHBvd2VyIHdlbGwgKi8KKwkJX19nZW42X2ZvcmNlX3dha2VfZ2V0KGRldl9wcml2KTsKKworCQlzZXFfcHJpbnRmKG0sICJHVF9QRVJGX1NUQVRVUzogMHglMDh4XG4iLCBndF9wZXJmX3N0YXR1cyk7CisJCXNlcV9wcmludGYobSwgIlJQU1RBVDE6IDB4JTA4eFxuIiwgSTkxNV9SRUFEKEdFTjZfUlBTVEFUMSkpOworCQlzZXFfcHJpbnRmKG0sICJSZW5kZXIgcC1zdGF0ZSByYXRpbzogJWRcbiIsCisJCQkgICAoZ3RfcGVyZl9zdGF0dXMgJiAweGZmMDApID4+IDgpOworCQlzZXFfcHJpbnRmKG0sICJSZW5kZXIgcC1zdGF0ZSBWSUQ6ICVkXG4iLAorCQkJICAgZ3RfcGVyZl9zdGF0dXMgJiAweGZmKTsKKwkJc2VxX3ByaW50ZihtLCAiUmVuZGVyIHAtc3RhdGUgbGltaXQ6ICVkXG4iLAorCQkJICAgcnBfc3RhdGVfbGltaXRzICYgMHhmZik7CisKKwkJbWF4X2ZyZXEgPSAocnBfc3RhdGVfY2FwICYgMHhmZjAwMDApID4+IDE2OworCQlzZXFfcHJpbnRmKG0sICJMb3dlc3QgKFJQTikgZnJlcXVlbmN5OiAlZE1IelxuIiwKKwkJCSAgIG1heF9mcmVxICogMTAwKTsKKworCQltYXhfZnJlcSA9IChycF9zdGF0ZV9jYXAgJiAweGZmMDApID4+IDg7CisJCXNlcV9wcmludGYobSwgIk5vbWluYWwgKFJQMSkgZnJlcXVlbmN5OiAlZE1IelxuIiwKKwkJCSAgIG1heF9mcmVxICogMTAwKTsKKworCQltYXhfZnJlcSA9IHJwX3N0YXRlX2NhcCAmIDB4ZmY7CisJCXNlcV9wcmludGYobSwgIk1heCBub24tb3ZlcmNsb2NrZWQgKFJQMCkgZnJlcXVlbmN5OiAlZE1IelxuIiwKKwkJCSAgIG1heF9mcmVxICogMTAwKTsKKworCQlfX2dlbjZfZm9yY2Vfd2FrZV9wdXQoZGV2X3ByaXYpOworCX0gZWxzZSB7CisJCXNlcV9wcmludGYobSwgIm5vIFAtc3RhdGUgaW5mbyBhdmFpbGFibGVcbiIpOworCX0KIAogCXJldHVybiAwOwogfQpAQCAtNzk0LDcgKzk2OSw3IEBACiAJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJYm9vbCBzcl9lbmFibGVkID0gZmFsc2U7CiAKLQlpZiAoSVNfR0VONShkZXYpKQorCWlmIChIQVNfUENIX1NQTElUKGRldikpCiAJCXNyX2VuYWJsZWQgPSBJOTE1X1JFQUQoV00xX0xQX0lMSykgJiBXTTFfTFBfU1JfRU47CiAJZWxzZSBpZiAoSVNfQ1JFU1RMSU5FKGRldikgfHwgSVNfSTk0NUcoZGV2KSB8fCBJU19JOTQ1R00oZGV2KSkKIAkJc3JfZW5hYmxlZCA9IEk5MTVfUkVBRChGV19CTENfU0VMRikgJiBGV19CTENfU0VMRl9FTjsKQEAgLTg4Niw3ICsxMDYxLDcgQEAKIAkJICAgZmItPmJhc2UuaGVpZ2h0LAogCQkgICBmYi0+YmFzZS5kZXB0aCwKIAkJICAgZmItPmJhc2UuYml0c19wZXJfcGl4ZWwpOwotCWRlc2NyaWJlX29iaihtLCB0b19pbnRlbF9ibyhmYi0+b2JqKSk7CisJZGVzY3JpYmVfb2JqKG0sIGZiLT5vYmopOwogCXNlcV9wcmludGYobSwgIlxuIik7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGZiLCAmZGV2LT5tb2RlX2NvbmZpZy5mYl9saXN0LCBiYXNlLmhlYWQpIHsKQEAgLTg5OCw3ICsxMDczLDcgQEAKIAkJCSAgIGZiLT5iYXNlLmhlaWdodCwKIAkJCSAgIGZiLT5iYXNlLmRlcHRoLAogCQkJICAgZmItPmJhc2UuYml0c19wZXJfcGl4ZWwpOwotCQlkZXNjcmliZV9vYmoobSwgdG9faW50ZWxfYm8oZmItPm9iaikpOworCQlkZXNjcmliZV9vYmoobSwgZmItPm9iaik7CiAJCXNlcV9wcmludGYobSwgIlxuIik7CiAJfQogCkBAIC05NDMsNyArMTExOCw2IEBACiAJCSAgbG9mZl90ICpwcG9zKQogewogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7Ci0JZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJY2hhciBidWZbMjBdOwogCWludCB2YWwgPSAxOwogCkBAIC05NTksMTIgKzExMzMsNyBAQAogCX0KIAogCURSTV9JTkZPKCJNYW51YWxseSBzZXR0aW5nIHdlZGdlZCB0byAlZFxuIiwgdmFsKTsKLQotCWF0b21pY19zZXQoJmRldl9wcml2LT5tbS53ZWRnZWQsIHZhbCk7Ci0JaWYgKHZhbCkgewotCQl3YWtlX3VwX2FsbCgmZGV2X3ByaXYtPmlycV9xdWV1ZSk7Ci0JCXF1ZXVlX3dvcmsoZGV2X3ByaXYtPndxLCAmZGV2X3ByaXYtPmVycm9yX3dvcmspOwotCX0KKwlpOTE1X2hhbmRsZV9lcnJvcihkZXYsIHZhbCk7CiAKIAlyZXR1cm4gY250OwogfQpAQCAtMTAyOCw5ICsxMTk3LDE1IEBACiAJeyJpOTE1X2dlbV9zZXFubyIsIGk5MTVfZ2VtX3NlcW5vX2luZm8sIDB9LAogCXsiaTkxNV9nZW1fZmVuY2VfcmVncyIsIGk5MTVfZ2VtX2ZlbmNlX3JlZ3NfaW5mbywgMH0sCiAJeyJpOTE1X2dlbV9pbnRlcnJ1cHQiLCBpOTE1X2ludGVycnVwdF9pbmZvLCAwfSwKLQl7Imk5MTVfZ2VtX2h3cyIsIGk5MTVfaHdzX2luZm8sIDB9LAotCXsiaTkxNV9yaW5nYnVmZmVyX2RhdGEiLCBpOTE1X3JpbmdidWZmZXJfZGF0YSwgMH0sCi0JeyJpOTE1X3JpbmdidWZmZXJfaW5mbyIsIGk5MTVfcmluZ2J1ZmZlcl9pbmZvLCAwfSwKKwl7Imk5MTVfZ2VtX2h3cyIsIGk5MTVfaHdzX2luZm8sIDAsICh2b2lkICopUkNTfSwKKwl7Imk5MTVfZ2VtX2h3c19ibHQiLCBpOTE1X2h3c19pbmZvLCAwLCAodm9pZCAqKUJDU30sCisJeyJpOTE1X2dlbV9od3NfYnNkIiwgaTkxNV9od3NfaW5mbywgMCwgKHZvaWQgKilWQ1N9LAorCXsiaTkxNV9yaW5nYnVmZmVyX2RhdGEiLCBpOTE1X3JpbmdidWZmZXJfZGF0YSwgMCwgKHZvaWQgKilSQ1N9LAorCXsiaTkxNV9yaW5nYnVmZmVyX2luZm8iLCBpOTE1X3JpbmdidWZmZXJfaW5mbywgMCwgKHZvaWQgKilSQ1N9LAorCXsiaTkxNV9ic2RfcmluZ2J1ZmZlcl9kYXRhIiwgaTkxNV9yaW5nYnVmZmVyX2RhdGEsIDAsICh2b2lkICopVkNTfSwKKwl7Imk5MTVfYnNkX3JpbmdidWZmZXJfaW5mbyIsIGk5MTVfcmluZ2J1ZmZlcl9pbmZvLCAwLCAodm9pZCAqKVZDU30sCisJeyJpOTE1X2JsdF9yaW5nYnVmZmVyX2RhdGEiLCBpOTE1X3JpbmdidWZmZXJfZGF0YSwgMCwgKHZvaWQgKilCQ1N9LAorCXsiaTkxNV9ibHRfcmluZ2J1ZmZlcl9pbmZvIiwgaTkxNV9yaW5nYnVmZmVyX2luZm8sIDAsICh2b2lkICopQkNTfSwKIAl7Imk5MTVfYmF0Y2hidWZmZXJzIiwgaTkxNV9iYXRjaGJ1ZmZlcl9pbmZvLCAwfSwKIAl7Imk5MTVfZXJyb3Jfc3RhdGUiLCBpOTE1X2Vycm9yX3N0YXRlLCAwfSwKIAl7Imk5MTVfcnN0ZGJ5X2RlbGF5cyIsIGk5MTVfcnN0ZGJ5X2RlbGF5cywgMH0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2RtYS5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9kbWEuYwppbmRleCBjYjkwMGRjLi4wNTY4ZGJkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2RtYS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZG1hLmMKQEAgLTUwLDYgKzUwLDggQEAKIHN0YXRpYyBpbnQgaTkxNV9pbml0X3BoeXNfaHdzKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7CiAJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nID0gTFBfUklORyhkZXZfcHJpdik7CisKIAkvKiBQcm9ncmFtIEhhcmR3YXJlIFN0YXR1cyBQYWdlICovCiAJZGV2X3ByaXYtPnN0YXR1c19wYWdlX2RtYWggPQogCQlkcm1fcGNpX2FsbG9jKGRldiwgUEFHRV9TSVpFLCBQQUdFX1NJWkUpOwpAQCAtNTgsMTEgKzYwLDEwIEBACiAJCURSTV9FUlJPUigiQ2FuIG5vdCBhbGxvY2F0ZSBoYXJkd2FyZSBzdGF0dXMgcGFnZVxuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KLQlkZXZfcHJpdi0+cmVuZGVyX3Jpbmcuc3RhdHVzX3BhZ2UucGFnZV9hZGRyCi0JCT0gZGV2X3ByaXYtPnN0YXR1c19wYWdlX2RtYWgtPnZhZGRyOworCXJpbmctPnN0YXR1c19wYWdlLnBhZ2VfYWRkciA9IGRldl9wcml2LT5zdGF0dXNfcGFnZV9kbWFoLT52YWRkcjsKIAlkZXZfcHJpdi0+ZG1hX3N0YXR1c19wYWdlID0gZGV2X3ByaXYtPnN0YXR1c19wYWdlX2RtYWgtPmJ1c2FkZHI7CiAKLQltZW1zZXQoZGV2X3ByaXYtPnJlbmRlcl9yaW5nLnN0YXR1c19wYWdlLnBhZ2VfYWRkciwgMCwgUEFHRV9TSVpFKTsKKwltZW1zZXQocmluZy0+c3RhdHVzX3BhZ2UucGFnZV9hZGRyLCAwLCBQQUdFX1NJWkUpOwogCiAJaWYgKElOVEVMX0lORk8oZGV2KS0+Z2VuID49IDQpCiAJCWRldl9wcml2LT5kbWFfc3RhdHVzX3BhZ2UgfD0gKGRldl9wcml2LT5kbWFfc3RhdHVzX3BhZ2UgPj4gMjgpICYKQEAgLTgwLDEzICs4MSwxNSBAQAogc3RhdGljIHZvaWQgaTkxNV9mcmVlX2h3cyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogewogCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZyA9IExQX1JJTkcoZGV2X3ByaXYpOworCiAJaWYgKGRldl9wcml2LT5zdGF0dXNfcGFnZV9kbWFoKSB7CiAJCWRybV9wY2lfZnJlZShkZXYsIGRldl9wcml2LT5zdGF0dXNfcGFnZV9kbWFoKTsKIAkJZGV2X3ByaXYtPnN0YXR1c19wYWdlX2RtYWggPSBOVUxMOwogCX0KIAotCWlmIChkZXZfcHJpdi0+cmVuZGVyX3Jpbmcuc3RhdHVzX3BhZ2UuZ2Z4X2FkZHIpIHsKLQkJZGV2X3ByaXYtPnJlbmRlcl9yaW5nLnN0YXR1c19wYWdlLmdmeF9hZGRyID0gMDsKKwlpZiAocmluZy0+c3RhdHVzX3BhZ2UuZ2Z4X2FkZHIpIHsKKwkJcmluZy0+c3RhdHVzX3BhZ2UuZ2Z4X2FkZHIgPSAwOwogCQlkcm1fY29yZV9pb3JlbWFwZnJlZSgmZGV2X3ByaXYtPmh3c19tYXAsIGRldik7CiAJfQogCkBAIC05OCw3ICsxMDEsNyBAQAogewogCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXN0cnVjdCBkcm1faTkxNV9tYXN0ZXJfcHJpdmF0ZSAqbWFzdGVyX3ByaXY7Ci0Jc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nID0gJmRldl9wcml2LT5yZW5kZXJfcmluZzsKKwlzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcgPSBMUF9SSU5HKGRldl9wcml2KTsKIAogCS8qCiAJICogV2Ugc2hvdWxkIG5ldmVyIGxvc2UgY29udGV4dCBvbiB0aGUgcmluZyB3aXRoIG1vZGVzZXR0aW5nCkBAIC0xMDcsOCArMTEwLDggQEAKIAlpZiAoZHJtX2NvcmVfY2hlY2tfZmVhdHVyZShkZXYsIERSSVZFUl9NT0RFU0VUKSkKIAkJcmV0dXJuOwogCi0JcmluZy0+aGVhZCA9IEk5MTVfUkVBRChQUkIwX0hFQUQpICYgSEVBRF9BRERSOwotCXJpbmctPnRhaWwgPSBJOTE1X1JFQUQoUFJCMF9UQUlMKSAmIFRBSUxfQUREUjsKKwlyaW5nLT5oZWFkID0gSTkxNV9SRUFEX0hFQUQocmluZykgJiBIRUFEX0FERFI7CisJcmluZy0+dGFpbCA9IEk5MTVfUkVBRF9UQUlMKHJpbmcpICYgVEFJTF9BRERSOwogCXJpbmctPnNwYWNlID0gcmluZy0+aGVhZCAtIChyaW5nLT50YWlsICsgOCk7CiAJaWYgKHJpbmctPnNwYWNlIDwgMCkKIAkJcmluZy0+c3BhY2UgKz0gcmluZy0+c2l6ZTsKQEAgLTEyNCw2ICsxMjcsOCBAQAogc3RhdGljIGludCBpOTE1X2RtYV9jbGVhbnVwKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewogCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWludCBpOworCiAJLyogTWFrZSBzdXJlIGludGVycnVwdHMgYXJlIGRpc2FibGVkIGhlcmUgYmVjYXVzZSB0aGUgdW5pbnN0YWxsIGlvY3RsCiAJICogbWF5IG5vdCBoYXZlIGJlZW4gY2FsbGVkIGZyb20gdXNlcnNwYWNlIGFuZCBhZnRlciBkZXZfcHJpdmF0ZQogCSAqIGlzIGZyZWVkLCBpdCdzIHRvbyBsYXRlLgpAQCAtMTMyLDkgKzEzNyw4IEBACiAJCWRybV9pcnFfdW5pbnN0YWxsKGRldik7CiAKIAltdXRleF9sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7Ci0JaW50ZWxfY2xlYW51cF9yaW5nX2J1ZmZlcihkZXYsICZkZXZfcHJpdi0+cmVuZGVyX3JpbmcpOwotCWludGVsX2NsZWFudXBfcmluZ19idWZmZXIoZGV2LCAmZGV2X3ByaXYtPmJzZF9yaW5nKTsKLQlpbnRlbF9jbGVhbnVwX3JpbmdfYnVmZmVyKGRldiwgJmRldl9wcml2LT5ibHRfcmluZyk7CisJZm9yIChpID0gMDsgaSA8IEk5MTVfTlVNX1JJTkdTOyBpKyspCisJCWludGVsX2NsZWFudXBfcmluZ19idWZmZXIoJmRldl9wcml2LT5yaW5nW2ldKTsKIAltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKIAogCS8qIENsZWFyIHRoZSBIV1MgdmlydHVhbCBhZGRyZXNzIGF0IHRlYXJkb3duICovCkBAIC0xNDgsNiArMTUyLDcgQEAKIHsKIAlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlzdHJ1Y3QgZHJtX2k5MTVfbWFzdGVyX3ByaXZhdGUgKm1hc3Rlcl9wcml2ID0gZGV2LT5wcmltYXJ5LT5tYXN0ZXItPmRyaXZlcl9wcml2OworCXN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZyA9IExQX1JJTkcoZGV2X3ByaXYpOwogCiAJbWFzdGVyX3ByaXYtPnNhcmVhID0gZHJtX2dldHNhcmVhKGRldik7CiAJaWYgKG1hc3Rlcl9wcml2LT5zYXJlYSkgewpAQCAtMTU4LDI0ICsxNjMsMjQgQEAKIAl9CiAKIAlpZiAoaW5pdC0+cmluZ19zaXplICE9IDApIHsKLQkJaWYgKGRldl9wcml2LT5yZW5kZXJfcmluZy5nZW1fb2JqZWN0ICE9IE5VTEwpIHsKKwkJaWYgKHJpbmctPm9iaiAhPSBOVUxMKSB7CiAJCQlpOTE1X2RtYV9jbGVhbnVwKGRldik7CiAJCQlEUk1fRVJST1IoIkNsaWVudCB0cmllZCB0byBpbml0aWFsaXplIHJpbmdidWZmZXIgaW4gIgogCQkJCSAgIkdFTSBtb2RlXG4iKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAKLQkJZGV2X3ByaXYtPnJlbmRlcl9yaW5nLnNpemUgPSBpbml0LT5yaW5nX3NpemU7CisJCXJpbmctPnNpemUgPSBpbml0LT5yaW5nX3NpemU7CiAKLQkJZGV2X3ByaXYtPnJlbmRlcl9yaW5nLm1hcC5vZmZzZXQgPSBpbml0LT5yaW5nX3N0YXJ0OwotCQlkZXZfcHJpdi0+cmVuZGVyX3JpbmcubWFwLnNpemUgPSBpbml0LT5yaW5nX3NpemU7Ci0JCWRldl9wcml2LT5yZW5kZXJfcmluZy5tYXAudHlwZSA9IDA7Ci0JCWRldl9wcml2LT5yZW5kZXJfcmluZy5tYXAuZmxhZ3MgPSAwOwotCQlkZXZfcHJpdi0+cmVuZGVyX3JpbmcubWFwLm10cnIgPSAwOworCQlyaW5nLT5tYXAub2Zmc2V0ID0gaW5pdC0+cmluZ19zdGFydDsKKwkJcmluZy0+bWFwLnNpemUgPSBpbml0LT5yaW5nX3NpemU7CisJCXJpbmctPm1hcC50eXBlID0gMDsKKwkJcmluZy0+bWFwLmZsYWdzID0gMDsKKwkJcmluZy0+bWFwLm10cnIgPSAwOwogCi0JCWRybV9jb3JlX2lvcmVtYXBfd2MoJmRldl9wcml2LT5yZW5kZXJfcmluZy5tYXAsIGRldik7CisJCWRybV9jb3JlX2lvcmVtYXBfd2MoJnJpbmctPm1hcCwgZGV2KTsKIAotCQlpZiAoZGV2X3ByaXYtPnJlbmRlcl9yaW5nLm1hcC5oYW5kbGUgPT0gTlVMTCkgeworCQlpZiAocmluZy0+bWFwLmhhbmRsZSA9PSBOVUxMKSB7CiAJCQlpOTE1X2RtYV9jbGVhbnVwKGRldik7CiAJCQlEUk1fRVJST1IoImNhbiBub3QgaW9yZW1hcCB2aXJ0dWFsIGFkZHJlc3MgZm9yIgogCQkJCSAgIiByaW5nIGJ1ZmZlclxuIik7CkBAIC0xODMsNyArMTg4LDcgQEAKIAkJfQogCX0KIAotCWRldl9wcml2LT5yZW5kZXJfcmluZy52aXJ0dWFsX3N0YXJ0ID0gZGV2X3ByaXYtPnJlbmRlcl9yaW5nLm1hcC5oYW5kbGU7CisJcmluZy0+dmlydHVhbF9zdGFydCA9IHJpbmctPm1hcC5oYW5kbGU7CiAKIAlkZXZfcHJpdi0+Y3BwID0gaW5pdC0+Y3BwOwogCWRldl9wcml2LT5iYWNrX29mZnNldCA9IGluaXQtPmJhY2tfb2Zmc2V0OwpAQCAtMjAyLDEyICsyMDcsMTAgQEAKIHN0YXRpYyBpbnQgaTkxNV9kbWFfcmVzdW1lKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewogCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX2k5MTVfcHJpdmF0ZV90ICopIGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nID0gTFBfUklORyhkZXZfcHJpdik7CiAKLQlzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmc7CiAJRFJNX0RFQlVHX0RSSVZFUigiJXNcbiIsIF9fZnVuY19fKTsKIAotCXJpbmcgPSAmZGV2X3ByaXYtPnJlbmRlcl9yaW5nOwotCiAJaWYgKHJpbmctPm1hcC5oYW5kbGUgPT0gTlVMTCkgewogCQlEUk1fRVJST1IoImNhbiBub3QgaW9yZW1hcCB2aXJ0dWFsIGFkZHJlc3MgZm9yIgogCQkJICAiIHJpbmcgYnVmZmVyXG4iKTsKQEAgLTIyMiw3ICsyMjUsNyBAQAogCURSTV9ERUJVR19EUklWRVIoImh3IHN0YXR1cyBwYWdlIEAgJXBcbiIsCiAJCQkJcmluZy0+c3RhdHVzX3BhZ2UucGFnZV9hZGRyKTsKIAlpZiAocmluZy0+c3RhdHVzX3BhZ2UuZ2Z4X2FkZHIgIT0gMCkKLQkJaW50ZWxfcmluZ19zZXR1cF9zdGF0dXNfcGFnZShkZXYsIHJpbmcpOworCQlpbnRlbF9yaW5nX3NldHVwX3N0YXR1c19wYWdlKHJpbmcpOwogCWVsc2UKIAkJSTkxNV9XUklURShIV1NfUEdBLCBkZXZfcHJpdi0+ZG1hX3N0YXR1c19wYWdlKTsKIApAQCAtMjY0LDcgKzI2Nyw3IEBACiAgKiBpbnN0cnVjdGlvbiBkZXRlY3RlZCB3aWxsIGJlIGdpdmVuIGEgc2l6ZSBvZiB6ZXJvLCB3aGljaCBpcyBhCiAgKiBzaWduYWwgdG8gYWJvcnQgdGhlIHJlc3Qgb2YgdGhlIGJ1ZmZlci4KICAqLwotc3RhdGljIGludCBkb192YWxpZGF0ZV9jbWQoaW50IGNtZCkKK3N0YXRpYyBpbnQgdmFsaWRhdGVfY21kKGludCBjbWQpCiB7CiAJc3dpdGNoICgoKGNtZCA+PiAyOSkgJiAweDcpKSB7CiAJY2FzZSAweDA6CkBAIC0zMjIsNDAgKzMyNSwyNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHZhbGlkYXRlX2NtZChpbnQgY21kKQotewotCWludCByZXQgPSBkb192YWxpZGF0ZV9jbWQoY21kKTsKLQotLyoJcHJpbnRrKCJ2YWxpZGF0ZV9jbWQoICV4ICk6ICVkXG4iLCBjbWQsIHJldCk7ICovCi0KLQlyZXR1cm4gcmV0OwotfQotCiBzdGF0aWMgaW50IGk5MTVfZW1pdF9jbWRzKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBpbnQgKmJ1ZmZlciwgaW50IGR3b3JkcykKIHsKIAlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlpbnQgaTsKKwlpbnQgaSwgcmV0OwogCi0JaWYgKChkd29yZHMrMSkgKiBzaXplb2YoaW50KSA+PSBkZXZfcHJpdi0+cmVuZGVyX3Jpbmcuc2l6ZSAtIDgpCisJaWYgKChkd29yZHMrMSkgKiBzaXplb2YoaW50KSA+PSBMUF9SSU5HKGRldl9wcml2KS0+c2l6ZSAtIDgpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JQkVHSU5fTFBfUklORygoZHdvcmRzKzEpJn4xKTsKLQogCWZvciAoaSA9IDA7IGkgPCBkd29yZHM7KSB7Ci0JCWludCBjbWQsIHN6OwotCi0JCWNtZCA9IGJ1ZmZlcltpXTsKLQotCQlpZiAoKHN6ID0gdmFsaWRhdGVfY21kKGNtZCkpID09IDAgfHwgaSArIHN6ID4gZHdvcmRzKQorCQlpbnQgc3ogPSB2YWxpZGF0ZV9jbWQoYnVmZmVyW2ldKTsKKwkJaWYgKHN6ID09IDAgfHwgaSArIHN6ID4gZHdvcmRzKQogCQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkJT1VUX1JJTkcoY21kKTsKLQotCQl3aGlsZSAoKytpLCAtLXN6KSB7Ci0JCQlPVVRfUklORyhidWZmZXJbaV0pOwotCQl9CisJCWkgKz0gc3o7CiAJfQogCisJcmV0ID0gQkVHSU5fTFBfUklORygoZHdvcmRzKzEpJn4xKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJZm9yIChpID0gMDsgaSA8IGR3b3JkczsgaSsrKQorCQlPVVRfUklORyhidWZmZXJbaV0pOwogCWlmIChkd29yZHMgJiAxKQogCQlPVVRfUklORygwKTsKIApAQCAtMzY2LDM0ICszNTYsNDEgQEAKIAogaW50CiBpOTE1X2VtaXRfYm94KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCi0JICAgICAgc3RydWN0IGRybV9jbGlwX3JlY3QgKmJveGVzLAotCSAgICAgIGludCBpLCBpbnQgRFIxLCBpbnQgRFI0KQorCSAgICAgIHN0cnVjdCBkcm1fY2xpcF9yZWN0ICpib3gsCisJICAgICAgaW50IERSMSwgaW50IERSNCkKIHsKLQlzdHJ1Y3QgZHJtX2NsaXBfcmVjdCBib3ggPSBib3hlc1tpXTsKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWludCByZXQ7CiAKLQlpZiAoYm94LnkyIDw9IGJveC55MSB8fCBib3gueDIgPD0gYm94LngxIHx8IGJveC55MiA8PSAwIHx8IGJveC54MiA8PSAwKSB7CisJaWYgKGJveC0+eTIgPD0gYm94LT55MSB8fCBib3gtPngyIDw9IGJveC0+eDEgfHwKKwkgICAgYm94LT55MiA8PSAwIHx8IGJveC0+eDIgPD0gMCkgewogCQlEUk1fRVJST1IoIkJhZCBib3ggJWQsJWQuLiVkLCVkXG4iLAotCQkJICBib3gueDEsIGJveC55MSwgYm94LngyLCBib3gueTIpOworCQkJICBib3gtPngxLCBib3gtPnkxLCBib3gtPngyLCBib3gtPnkyKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJaWYgKElOVEVMX0lORk8oZGV2KS0+Z2VuID49IDQpIHsKLQkJQkVHSU5fTFBfUklORyg0KTsKKwkJcmV0ID0gQkVHSU5fTFBfUklORyg0KTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisKIAkJT1VUX1JJTkcoR0ZYX09QX0RSQVdSRUNUX0lORk9fSTk2NSk7Ci0JCU9VVF9SSU5HKChib3gueDEgJiAweGZmZmYpIHwgKGJveC55MSA8PCAxNikpOwotCQlPVVRfUklORygoKGJveC54MiAtIDEpICYgMHhmZmZmKSB8ICgoYm94LnkyIC0gMSkgPDwgMTYpKTsKKwkJT1VUX1JJTkcoKGJveC0+eDEgJiAweGZmZmYpIHwgKGJveC0+eTEgPDwgMTYpKTsKKwkJT1VUX1JJTkcoKChib3gtPngyIC0gMSkgJiAweGZmZmYpIHwgKChib3gtPnkyIC0gMSkgPDwgMTYpKTsKIAkJT1VUX1JJTkcoRFI0KTsKLQkJQURWQU5DRV9MUF9SSU5HKCk7CiAJfSBlbHNlIHsKLQkJQkVHSU5fTFBfUklORyg2KTsKKwkJcmV0ID0gQkVHSU5fTFBfUklORyg2KTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisKIAkJT1VUX1JJTkcoR0ZYX09QX0RSQVdSRUNUX0lORk8pOwogCQlPVVRfUklORyhEUjEpOwotCQlPVVRfUklORygoYm94LngxICYgMHhmZmZmKSB8IChib3gueTEgPDwgMTYpKTsKLQkJT1VUX1JJTkcoKChib3gueDIgLSAxKSAmIDB4ZmZmZikgfCAoKGJveC55MiAtIDEpIDw8IDE2KSk7CisJCU9VVF9SSU5HKChib3gtPngxICYgMHhmZmZmKSB8IChib3gtPnkxIDw8IDE2KSk7CisJCU9VVF9SSU5HKCgoYm94LT54MiAtIDEpICYgMHhmZmZmKSB8ICgoYm94LT55MiAtIDEpIDw8IDE2KSk7CiAJCU9VVF9SSU5HKERSNCk7CiAJCU9VVF9SSU5HKDApOwotCQlBRFZBTkNFX0xQX1JJTkcoKTsKIAl9CisJQURWQU5DRV9MUF9SSU5HKCk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTQxMywxMiArNDEwLDEzIEBACiAJaWYgKG1hc3Rlcl9wcml2LT5zYXJlYV9wcml2KQogCQltYXN0ZXJfcHJpdi0+c2FyZWFfcHJpdi0+bGFzdF9lbnF1ZXVlID0gZGV2X3ByaXYtPmNvdW50ZXI7CiAKLQlCRUdJTl9MUF9SSU5HKDQpOwotCU9VVF9SSU5HKE1JX1NUT1JFX0RXT1JEX0lOREVYKTsKLQlPVVRfUklORyhJOTE1X0JSRUFEQ1JVTUJfSU5ERVggPDwgTUlfU1RPUkVfRFdPUkRfSU5ERVhfU0hJRlQpOwotCU9VVF9SSU5HKGRldl9wcml2LT5jb3VudGVyKTsKLQlPVVRfUklORygwKTsKLQlBRFZBTkNFX0xQX1JJTkcoKTsKKwlpZiAoQkVHSU5fTFBfUklORyg0KSA9PSAwKSB7CisJCU9VVF9SSU5HKE1JX1NUT1JFX0RXT1JEX0lOREVYKTsKKwkJT1VUX1JJTkcoSTkxNV9CUkVBRENSVU1CX0lOREVYIDw8IE1JX1NUT1JFX0RXT1JEX0lOREVYX1NISUZUKTsKKwkJT1VUX1JJTkcoZGV2X3ByaXYtPmNvdW50ZXIpOworCQlPVVRfUklORygwKTsKKwkJQURWQU5DRV9MUF9SSU5HKCk7CisJfQogfQogCiBzdGF0aWMgaW50IGk5MTVfZGlzcGF0Y2hfY21kYnVmZmVyKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LApAQCAtNDQwLDcgKzQzOCw3IEBACiAKIAlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewogCQlpZiAoaSA8IG5ib3gpIHsKLQkJCXJldCA9IGk5MTVfZW1pdF9ib3goZGV2LCBjbGlwcmVjdHMsIGksCisJCQlyZXQgPSBpOTE1X2VtaXRfYm94KGRldiwgJmNsaXByZWN0c1tpXSwKIAkJCQkJICAgIGNtZC0+RFIxLCBjbWQtPkRSNCk7CiAJCQlpZiAocmV0KQogCQkJCXJldHVybiByZXQ7CkBAIC00NTksOCArNDU3LDkgQEAKIAkJCQkgICAgIGRybV9pOTE1X2JhdGNoYnVmZmVyX3QgKiBiYXRjaCwKIAkJCQkgICAgIHN0cnVjdCBkcm1fY2xpcF9yZWN0ICpjbGlwcmVjdHMpCiB7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlpbnQgbmJveCA9IGJhdGNoLT5udW1fY2xpcHJlY3RzOwotCWludCBpID0gMCwgY291bnQ7CisJaW50IGksIGNvdW50LCByZXQ7CiAKIAlpZiAoKGJhdGNoLT5zdGFydCB8IGJhdGNoLT51c2VkKSAmIDB4NykgewogCQlEUk1fRVJST1IoImFsaWdubWVudCIpOwpAQCAtNDcwLDE3ICs0NjksMTkgQEAKIAlpOTE1X2tlcm5lbF9sb3N0X2NvbnRleHQoZGV2KTsKIAogCWNvdW50ID0gbmJveCA/IG5ib3ggOiAxOwotCiAJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKIAkJaWYgKGkgPCBuYm94KSB7Ci0JCQlpbnQgcmV0ID0gaTkxNV9lbWl0X2JveChkZXYsIGNsaXByZWN0cywgaSwKLQkJCQkJCWJhdGNoLT5EUjEsIGJhdGNoLT5EUjQpOworCQkJcmV0ID0gaTkxNV9lbWl0X2JveChkZXYsICZjbGlwcmVjdHNbaV0sCisJCQkJCSAgICBiYXRjaC0+RFIxLCBiYXRjaC0+RFI0KTsKIAkJCWlmIChyZXQpCiAJCQkJcmV0dXJuIHJldDsKIAkJfQogCiAJCWlmICghSVNfSTgzMChkZXYpICYmICFJU184NDVHKGRldikpIHsKLQkJCUJFR0lOX0xQX1JJTkcoMik7CisJCQlyZXQgPSBCRUdJTl9MUF9SSU5HKDIpOworCQkJaWYgKHJldCkKKwkJCQlyZXR1cm4gcmV0OworCiAJCQlpZiAoSU5URUxfSU5GTyhkZXYpLT5nZW4gPj0gNCkgewogCQkJCU9VVF9SSU5HKE1JX0JBVENIX0JVRkZFUl9TVEFSVCB8ICgyIDw8IDYpIHwgTUlfQkFUQ0hfTk9OX1NFQ1VSRV9JOTY1KTsKIAkJCQlPVVRfUklORyhiYXRjaC0+c3RhcnQpOwpAQCAtNDg4LDI2ICs0ODksMjkgQEAKIAkJCQlPVVRfUklORyhNSV9CQVRDSF9CVUZGRVJfU1RBUlQgfCAoMiA8PCA2KSk7CiAJCQkJT1VUX1JJTkcoYmF0Y2gtPnN0YXJ0IHwgTUlfQkFUQ0hfTk9OX1NFQ1VSRSk7CiAJCQl9Ci0JCQlBRFZBTkNFX0xQX1JJTkcoKTsKIAkJfSBlbHNlIHsKLQkJCUJFR0lOX0xQX1JJTkcoNCk7CisJCQlyZXQgPSBCRUdJTl9MUF9SSU5HKDQpOworCQkJaWYgKHJldCkKKwkJCQlyZXR1cm4gcmV0OworCiAJCQlPVVRfUklORyhNSV9CQVRDSF9CVUZGRVIpOwogCQkJT1VUX1JJTkcoYmF0Y2gtPnN0YXJ0IHwgTUlfQkFUQ0hfTk9OX1NFQ1VSRSk7CiAJCQlPVVRfUklORyhiYXRjaC0+c3RhcnQgKyBiYXRjaC0+dXNlZCAtIDQpOwogCQkJT1VUX1JJTkcoMCk7Ci0JCQlBRFZBTkNFX0xQX1JJTkcoKTsKIAkJfQorCQlBRFZBTkNFX0xQX1JJTkcoKTsKIAl9CiAKIAogCWlmIChJU19HNFgoZGV2KSB8fCBJU19HRU41KGRldikpIHsKLQkJQkVHSU5fTFBfUklORygyKTsKLQkJT1VUX1JJTkcoTUlfRkxVU0ggfCBNSV9OT19XUklURV9GTFVTSCB8IE1JX0lOVkFMSURBVEVfSVNQKTsKLQkJT1VUX1JJTkcoTUlfTk9PUCk7Ci0JCUFEVkFOQ0VfTFBfUklORygpOworCQlpZiAoQkVHSU5fTFBfUklORygyKSA9PSAwKSB7CisJCQlPVVRfUklORyhNSV9GTFVTSCB8IE1JX05PX1dSSVRFX0ZMVVNIIHwgTUlfSU5WQUxJREFURV9JU1ApOworCQkJT1VUX1JJTkcoTUlfTk9PUCk7CisJCQlBRFZBTkNFX0xQX1JJTkcoKTsKKwkJfQogCX0KLQlpOTE1X2VtaXRfYnJlYWRjcnVtYihkZXYpOwogCisJaTkxNV9lbWl0X2JyZWFkY3J1bWIoZGV2KTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNTE2LDYgKzUyMCw3IEBACiAJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJc3RydWN0IGRybV9pOTE1X21hc3Rlcl9wcml2YXRlICptYXN0ZXJfcHJpdiA9CiAJCWRldi0+cHJpbWFyeS0+bWFzdGVyLT5kcml2ZXJfcHJpdjsKKwlpbnQgcmV0OwogCiAJaWYgKCFtYXN0ZXJfcHJpdi0+c2FyZWFfcHJpdikKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC01MjcsMTIgKzUzMiwxMyBAQAogCiAJaTkxNV9rZXJuZWxfbG9zdF9jb250ZXh0KGRldik7CiAKLQlCRUdJTl9MUF9SSU5HKDIpOworCXJldCA9IEJFR0lOX0xQX1JJTkcoMTApOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKIAlPVVRfUklORyhNSV9GTFVTSCB8IE1JX1JFQURfRkxVU0gpOwogCU9VVF9SSU5HKDApOwotCUFEVkFOQ0VfTFBfUklORygpOwogCi0JQkVHSU5fTFBfUklORyg2KTsKIAlPVVRfUklORyhDTURfT1BfRElTUExBWUJVRkZFUl9JTkZPIHwgQVNZTkNfRkxJUCk7CiAJT1VUX1JJTkcoMCk7CiAJaWYgKGRldl9wcml2LT5jdXJyZW50X3BhZ2UgPT0gMCkgewpAQCAtNTQzLDMzICs1NDksMzIgQEAKIAkJZGV2X3ByaXYtPmN1cnJlbnRfcGFnZSA9IDA7CiAJfQogCU9VVF9SSU5HKDApOwotCUFEVkFOQ0VfTFBfUklORygpOwogCi0JQkVHSU5fTFBfUklORygyKTsKIAlPVVRfUklORyhNSV9XQUlUX0ZPUl9FVkVOVCB8IE1JX1dBSVRfRk9SX1BMQU5FX0FfRkxJUCk7CiAJT1VUX1JJTkcoMCk7CisKIAlBRFZBTkNFX0xQX1JJTkcoKTsKIAogCW1hc3Rlcl9wcml2LT5zYXJlYV9wcml2LT5sYXN0X2VucXVldWUgPSBkZXZfcHJpdi0+Y291bnRlcisrOwogCi0JQkVHSU5fTFBfUklORyg0KTsKLQlPVVRfUklORyhNSV9TVE9SRV9EV09SRF9JTkRFWCk7Ci0JT1VUX1JJTkcoSTkxNV9CUkVBRENSVU1CX0lOREVYIDw8IE1JX1NUT1JFX0RXT1JEX0lOREVYX1NISUZUKTsKLQlPVVRfUklORyhkZXZfcHJpdi0+Y291bnRlcik7Ci0JT1VUX1JJTkcoMCk7Ci0JQURWQU5DRV9MUF9SSU5HKCk7CisJaWYgKEJFR0lOX0xQX1JJTkcoNCkgPT0gMCkgeworCQlPVVRfUklORyhNSV9TVE9SRV9EV09SRF9JTkRFWCk7CisJCU9VVF9SSU5HKEk5MTVfQlJFQURDUlVNQl9JTkRFWCA8PCBNSV9TVE9SRV9EV09SRF9JTkRFWF9TSElGVCk7CisJCU9VVF9SSU5HKGRldl9wcml2LT5jb3VudGVyKTsKKwkJT1VUX1JJTkcoMCk7CisJCUFEVkFOQ0VfTFBfUklORygpOworCX0KIAogCW1hc3Rlcl9wcml2LT5zYXJlYV9wcml2LT5wZl9jdXJyZW50X3BhZ2UgPSBkZXZfcHJpdi0+Y3VycmVudF9wYWdlOwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGk5MTVfcXVpZXNjZW50KHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQorc3RhdGljIGludCBpOTE1X3F1aWVzY2VudChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogewotCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZyA9IExQX1JJTkcoZGV2LT5kZXZfcHJpdmF0ZSk7CiAKIAlpOTE1X2tlcm5lbF9sb3N0X2NvbnRleHQoZGV2KTsKLQlyZXR1cm4gaW50ZWxfd2FpdF9yaW5nX2J1ZmZlcihkZXYsICZkZXZfcHJpdi0+cmVuZGVyX3JpbmcsCi0JCQkJICAgICAgZGV2X3ByaXYtPnJlbmRlcl9yaW5nLnNpemUgLSA4KTsKKwlyZXR1cm4gaW50ZWxfd2FpdF9yaW5nX2J1ZmZlcihyaW5nLCByaW5nLT5zaXplIC0gOCk7CiB9CiAKIHN0YXRpYyBpbnQgaTkxNV9mbHVzaF9pb2N0bChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB2b2lkICpkYXRhLApAQCAtNzY4LDkgKzc3MywxNSBAQAogCWNhc2UgSTkxNV9QQVJBTV9IQVNfQkxUOgogCQl2YWx1ZSA9IEhBU19CTFQoZGV2KTsKIAkJYnJlYWs7CisJY2FzZSBJOTE1X1BBUkFNX0hBU19SRUxBWEVEX0ZFTkNJTkc6CisJCXZhbHVlID0gMTsKKwkJYnJlYWs7CiAJY2FzZSBJOTE1X1BBUkFNX0hBU19DT0hFUkVOVF9SSU5HUzoKIAkJdmFsdWUgPSAxOwogCQlicmVhazsKKwljYXNlIEk5MTVfUEFSQU1fSEFTX0VYRUNfQ09OU1RBTlRTOgorCQl2YWx1ZSA9IElOVEVMX0lORk8oZGV2KS0+Z2VuID49IDQ7CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCURSTV9ERUJVR19EUklWRVIoIlVua25vd24gcGFyYW1ldGVyICVkXG4iLAogCQkJCSBwYXJhbS0+cGFyYW0pOwpAQCAtODI2LDcgKzgzNyw3IEBACiB7CiAJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJZHJtX2k5MTVfaHdzX2FkZHJfdCAqaHdzID0gZGF0YTsKLQlzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcgPSAmZGV2X3ByaXYtPnJlbmRlcl9yaW5nOworCXN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZyA9IExQX1JJTkcoZGV2X3ByaXYpOwogCiAJaWYgKCFJOTE1X05FRURfR0ZYX0hXUyhkZXYpKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTEwMDUsNzMgKzEwMTYsNDcgQEAKICNkZWZpbmUgUFRFX1ZBTElECQkJKDEgPDwgMCkKIAogLyoqCi0gKiBpOTE1X2d0dF90b19waHlzIC0gdGFrZSBhIEdUVCBhZGRyZXNzIGFuZCB0dXJuIGl0IGludG8gYSBwaHlzaWNhbCBvbmUKKyAqIGk5MTVfc3RvbGVuX3RvX3BoeXMgLSB0YWtlIGFuIG9mZnNldCBpbnRvIHN0b2xlbiBtZW1vcnkgYW5kIHR1cm4gaXQgaW50bworICogICAgICAgICAgICAgICAgICAgICAgIGEgcGh5c2ljYWwgb25lCiAgKiBAZGV2OiBkcm0gZGV2aWNlCi0gKiBAZ3R0X2FkZHI6IGFkZHJlc3MgdG8gdHJhbnNsYXRlCisgKiBAb2Zmc2V0OiBhZGRyZXNzIHRvIHRyYW5zbGF0ZQogICoKLSAqIFNvbWUgY2hpcCBmdW5jdGlvbnMgcmVxdWlyZSBhbGxvY2F0aW9ucyBmcm9tIHN0b2xlbiBzcGFjZSBidXQgbmVlZCB0aGUKLSAqIHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIG1lbW9yeSBpbiBxdWVzdGlvbi4gIFdlIHVzZSB0aGlzIHJvdXRpbmUKLSAqIHRvIGdldCBhIHBoeXNpY2FsIGFkZHJlc3Mgc3VpdGFibGUgZm9yIHJlZ2lzdGVyIHByb2dyYW1taW5nIGZyb20gYSBnaXZlbgotICogR1RUIGFkZHJlc3MuCisgKiBTb21lIGNoaXAgZnVuY3Rpb25zIHJlcXVpcmUgYWxsb2NhdGlvbnMgZnJvbSBzdG9sZW4gc3BhY2UgYW5kIG5lZWQgdGhlCisgKiBwaHlzaWNhbCBhZGRyZXNzIG9mIHRoZSBtZW1vcnkgaW4gcXVlc3Rpb24uCiAgKi8KLXN0YXRpYyB1bnNpZ25lZCBsb25nIGk5MTVfZ3R0X3RvX3BoeXMoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKLQkJCQkgICAgICB1bnNpZ25lZCBsb25nIGd0dF9hZGRyKQorc3RhdGljIHVuc2lnbmVkIGxvbmcgaTkxNV9zdG9sZW5fdG9fcGh5cyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1MzIgb2Zmc2V0KQogewotCXVuc2lnbmVkIGxvbmcgKmd0dDsKLQl1bnNpZ25lZCBsb25nIGVudHJ5LCBwaHlzOwotCWludCBndHRfYmFyID0gSVNfR0VOMihkZXYpID8gMSA6IDA7Ci0JaW50IGd0dF9vZmZzZXQsIGd0dF9zaXplOworCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBkZXZfcHJpdi0+YnJpZGdlX2RldjsKKwl1MzIgYmFzZTsKIAotCWlmIChJTlRFTF9JTkZPKGRldiktPmdlbiA+PSA0KSB7Ci0JCWlmIChJU19HNFgoZGV2KSB8fCBJTlRFTF9JTkZPKGRldiktPmdlbiA+IDQpIHsKLQkJCWd0dF9vZmZzZXQgPSAyKjEwMjQqMTAyNDsKLQkJCWd0dF9zaXplID0gMioxMDI0KjEwMjQ7Ci0JCX0gZWxzZSB7Ci0JCQlndHRfb2Zmc2V0ID0gNTEyKjEwMjQ7Ci0JCQlndHRfc2l6ZSA9IDUxMioxMDI0OwotCQl9CisjaWYgMAorCS8qIE9uIHRoZSBtYWNoaW5lcyBJIGhhdmUgdGVzdGVkIHRoZSBHcmFwaGljcyBCYXNlIG9mIFN0b2xlbiBNZW1vcnkKKwkgKiBpcyB1bnJlbGlhYmxlLCBzbyBjb21wdXRlIHRoZSBiYXNlIGJ5IHN1YnRyYWN0aW5nIHRoZSBzdG9sZW4gbWVtb3J5CisJICogZnJvbSB0aGUgVG9wIG9mIExvdyBVc2FibGUgRFJBTSB3aGljaCBpcyB3aGVyZSB0aGUgQklPUyBwbGFjZXMKKwkgKiB0aGUgZ3JhcGhpY3Mgc3RvbGVuIG1lbW9yeS4KKwkgKi8KKwlpZiAoSU5URUxfSU5GTyhkZXYpLT5nZW4gPiAzIHx8IElTX0czMyhkZXYpKSB7CisJCS8qIHRvcCAzMmJpdHMgYXJlIHJlc2VydmVkID0gMCAqLworCQlwY2lfcmVhZF9jb25maWdfZHdvcmQocGRldiwgMHhBNCwgJmJhc2UpOwogCX0gZWxzZSB7Ci0JCWd0dF9iYXIgPSAzOwotCQlndHRfb2Zmc2V0ID0gMDsKLQkJZ3R0X3NpemUgPSBwY2lfcmVzb3VyY2VfbGVuKGRldi0+cGRldiwgZ3R0X2Jhcik7CisJCS8qIFhYWCBwcmVzdW1lIDh4eCBpcyB0aGUgc2FtZSBhcyBpOTE1ICovCisJCXBjaV9idXNfcmVhZF9jb25maWdfZHdvcmQocGRldi0+YnVzLCAyLCAweDVDLCAmYmFzZSk7CiAJfQotCi0JZ3R0ID0gaW9yZW1hcF93YyhwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2LT5wZGV2LCBndHRfYmFyKSArIGd0dF9vZmZzZXQsCi0JCQkgZ3R0X3NpemUpOwotCWlmICghZ3R0KSB7Ci0JCURSTV9FUlJPUigiaW9yZW1hcCBvZiBHVFQgZmFpbGVkXG4iKTsKLQkJcmV0dXJuIDA7CisjZWxzZQorCWlmIChJTlRFTF9JTkZPKGRldiktPmdlbiA+IDMgfHwgSVNfRzMzKGRldikpIHsKKwkJdTE2IHZhbDsKKwkJcGNpX3JlYWRfY29uZmlnX3dvcmQocGRldiwgMHhiMCwgJnZhbCk7CisJCWJhc2UgPSB2YWwgPj4gNCA8PCAyMDsKKwl9IGVsc2UgeworCQl1OCB2YWw7CisJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIDB4OWMsICZ2YWwpOworCQliYXNlID0gdmFsID4+IDMgPDwgMjc7CiAJfQorCWJhc2UgLT0gZGV2X3ByaXYtPm1tLmd0dC0+c3RvbGVuX3NpemU7CisjZW5kaWYKIAotCWVudHJ5ID0gKih2b2xhdGlsZSB1MzIgKikoZ3R0ICsgKGd0dF9hZGRyIC8gMTAyNCkpOwotCi0JRFJNX0RFQlVHX0RSSVZFUigiR1RUIGFkZHI6IDB4JTA4bHgsIFBURTogMHglMDhseFxuIiwgZ3R0X2FkZHIsIGVudHJ5KTsKLQotCS8qIE1hc2sgb3V0IHRoZXNlIHJlc2VydmVkIGJpdHMgb24gdGhpcyBoYXJkd2FyZS4gKi8KLQlpZiAoSU5URUxfSU5GTyhkZXYpLT5nZW4gPCA0ICYmICFJU19HMzMoZGV2KSkKLQkJZW50cnkgJj0gflBURV9BRERSRVNTX01BU0tfSElHSDsKLQotCS8qIElmIGl0J3Mgbm90IGEgbWFwcGluZyB0eXBlIHdlIGtub3csIHRoZW4gYmFpbC4gKi8KLQlpZiAoKGVudHJ5ICYgUFRFX01BUFBJTkdfVFlQRV9NQVNLKSAhPSBQVEVfTUFQUElOR19UWVBFX1VOQ0FDSEVEICYmCi0JICAgIChlbnRyeSAmIFBURV9NQVBQSU5HX1RZUEVfTUFTSykgIT0gUFRFX01BUFBJTkdfVFlQRV9DQUNIRUQpCXsKLQkJaW91bm1hcChndHQpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlpZiAoIShlbnRyeSAmIFBURV9WQUxJRCkpIHsKLQkJRFJNX0VSUk9SKCJiYWQgR1RUIGVudHJ5IGluIHN0b2xlbiBzcGFjZVxuIik7Ci0JCWlvdW5tYXAoZ3R0KTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JaW91bm1hcChndHQpOwotCi0JcGh5cyA9KGVudHJ5ICYgUFRFX0FERFJFU1NfTUFTSykgfAotCQkoKHVpbnQ2NF90KShlbnRyeSAmIFBURV9BRERSRVNTX01BU0tfSElHSCkgPDwgKDMyIC0gNCkpOwotCi0JRFJNX0RFQlVHX0RSSVZFUigiR1RUIGFkZHI6IDB4JTA4bHgsIHBoeXMgYWRkcjogMHglMDhseFxuIiwgZ3R0X2FkZHIsIHBoeXMpOwotCi0JcmV0dXJuIHBoeXM7CisJcmV0dXJuIGJhc2UgKyBvZmZzZXQ7CiB9CiAKIHN0YXRpYyB2b2lkIGk5MTVfd2Fybl9zdG9sZW4oc3RydWN0IGRybV9kZXZpY2UgKmRldikKQEAgLTEwODcsNTQgKzEwNzIsMzUgQEAKIAl1bnNpZ25lZCBsb25nIGNmYl9iYXNlOwogCXVuc2lnbmVkIGxvbmcgbGxfYmFzZSA9IDA7CiAKLQkvKiBMZWF2ZSAxTSBmb3IgbGluZSBsZW5ndGggYnVmZmVyICYgbWlzYy4gKi8KLQljb21wcmVzc2VkX2ZiID0gZHJtX21tX3NlYXJjaF9mcmVlKCZkZXZfcHJpdi0+bW0udnJhbSwgc2l6ZSwgNDA5NiwgMCk7Ci0JaWYgKCFjb21wcmVzc2VkX2ZiKSB7Ci0JCWRldl9wcml2LT5ub19mYmNfcmVhc29uID0gRkJDX1NUT0xFTl9UT09fU01BTEw7Ci0JCWk5MTVfd2Fybl9zdG9sZW4oZGV2KTsKLQkJcmV0dXJuOwotCX0KKwljb21wcmVzc2VkX2ZiID0gZHJtX21tX3NlYXJjaF9mcmVlKCZkZXZfcHJpdi0+bW0uc3RvbGVuLCBzaXplLCA0MDk2LCAwKTsKKwlpZiAoY29tcHJlc3NlZF9mYikKKwkJY29tcHJlc3NlZF9mYiA9IGRybV9tbV9nZXRfYmxvY2soY29tcHJlc3NlZF9mYiwgc2l6ZSwgNDA5Nik7CisJaWYgKCFjb21wcmVzc2VkX2ZiKQorCQlnb3RvIGVycjsKIAotCWNvbXByZXNzZWRfZmIgPSBkcm1fbW1fZ2V0X2Jsb2NrKGNvbXByZXNzZWRfZmIsIHNpemUsIDQwOTYpOwotCWlmICghY29tcHJlc3NlZF9mYikgewotCQlpOTE1X3dhcm5fc3RvbGVuKGRldik7Ci0JCWRldl9wcml2LT5ub19mYmNfcmVhc29uID0gRkJDX1NUT0xFTl9UT09fU01BTEw7Ci0JCXJldHVybjsKLQl9CisJY2ZiX2Jhc2UgPSBpOTE1X3N0b2xlbl90b19waHlzKGRldiwgY29tcHJlc3NlZF9mYi0+c3RhcnQpOworCWlmICghY2ZiX2Jhc2UpCisJCWdvdG8gZXJyX2ZiOwogCi0JY2ZiX2Jhc2UgPSBpOTE1X2d0dF90b19waHlzKGRldiwgY29tcHJlc3NlZF9mYi0+c3RhcnQpOwotCWlmICghY2ZiX2Jhc2UpIHsKLQkJRFJNX0VSUk9SKCJmYWlsZWQgdG8gZ2V0IHN0b2xlbiBwaHlzIGFkZHIsIGRpc2FibGluZyBGQkNcbiIpOwotCQlkcm1fbW1fcHV0X2Jsb2NrKGNvbXByZXNzZWRfZmIpOwotCX0KKwlpZiAoIShJU19HTTQ1KGRldikgfHwgSEFTX1BDSF9TUExJVChkZXYpKSkgeworCQljb21wcmVzc2VkX2xsYiA9IGRybV9tbV9zZWFyY2hfZnJlZSgmZGV2X3ByaXYtPm1tLnN0b2xlbiwKKwkJCQkJCSAgICA0MDk2LCA0MDk2LCAwKTsKKwkJaWYgKGNvbXByZXNzZWRfbGxiKQorCQkJY29tcHJlc3NlZF9sbGIgPSBkcm1fbW1fZ2V0X2Jsb2NrKGNvbXByZXNzZWRfbGxiLAorCQkJCQkJCSAgNDA5NiwgNDA5Nik7CisJCWlmICghY29tcHJlc3NlZF9sbGIpCisJCQlnb3RvIGVycl9mYjsKIAotCWlmICghKElTX0dNNDUoZGV2KSB8fCBJU19JUk9OTEFLRV9NKGRldikpKSB7Ci0JCWNvbXByZXNzZWRfbGxiID0gZHJtX21tX3NlYXJjaF9mcmVlKCZkZXZfcHJpdi0+bW0udnJhbSwgNDA5NiwKLQkJCQkJCSAgICA0MDk2LCAwKTsKLQkJaWYgKCFjb21wcmVzc2VkX2xsYikgewotCQkJaTkxNV93YXJuX3N0b2xlbihkZXYpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJY29tcHJlc3NlZF9sbGIgPSBkcm1fbW1fZ2V0X2Jsb2NrKGNvbXByZXNzZWRfbGxiLCA0MDk2LCA0MDk2KTsKLQkJaWYgKCFjb21wcmVzc2VkX2xsYikgewotCQkJaTkxNV93YXJuX3N0b2xlbihkZXYpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJbGxfYmFzZSA9IGk5MTVfZ3R0X3RvX3BoeXMoZGV2LCBjb21wcmVzc2VkX2xsYi0+c3RhcnQpOwotCQlpZiAoIWxsX2Jhc2UpIHsKLQkJCURSTV9FUlJPUigiZmFpbGVkIHRvIGdldCBzdG9sZW4gcGh5cyBhZGRyLCBkaXNhYmxpbmcgRkJDXG4iKTsKLQkJCWRybV9tbV9wdXRfYmxvY2soY29tcHJlc3NlZF9mYik7Ci0JCQlkcm1fbW1fcHV0X2Jsb2NrKGNvbXByZXNzZWRfbGxiKTsKLQkJfQorCQlsbF9iYXNlID0gaTkxNV9zdG9sZW5fdG9fcGh5cyhkZXYsIGNvbXByZXNzZWRfbGxiLT5zdGFydCk7CisJCWlmICghbGxfYmFzZSkKKwkJCWdvdG8gZXJyX2xsYjsKIAl9CiAKIAlkZXZfcHJpdi0+Y2ZiX3NpemUgPSBzaXplOwogCiAJaW50ZWxfZGlzYWJsZV9mYmMoZGV2KTsKIAlkZXZfcHJpdi0+Y29tcHJlc3NlZF9mYiA9IGNvbXByZXNzZWRfZmI7Ci0JaWYgKElTX0lST05MQUtFX00oZGV2KSkKKwlpZiAoSEFTX1BDSF9TUExJVChkZXYpKQogCQlJOTE1X1dSSVRFKElMS19EUEZDX0NCX0JBU0UsIGNvbXByZXNzZWRfZmItPnN0YXJ0KTsKIAllbHNlIGlmIChJU19HTTQ1KGRldikpIHsKIAkJSTkxNV9XUklURShEUEZDX0NCX0JBU0UsIGNvbXByZXNzZWRfZmItPnN0YXJ0KTsKQEAgLTExNDQsOCArMTExMCwxNyBAQAogCQlkZXZfcHJpdi0+Y29tcHJlc3NlZF9sbGIgPSBjb21wcmVzc2VkX2xsYjsKIAl9CiAKLQlEUk1fREVCVUdfS01TKCJGQkMgYmFzZSAweCUwOGx4LCBsbCBiYXNlIDB4JTA4bHgsIHNpemUgJWRNXG4iLCBjZmJfYmFzZSwKLQkJICBsbF9iYXNlLCBzaXplID4+IDIwKTsKKwlEUk1fREVCVUdfS01TKCJGQkMgYmFzZSAweCUwOGx4LCBsbCBiYXNlIDB4JTA4bHgsIHNpemUgJWRNXG4iLAorCQkgICAgICBjZmJfYmFzZSwgbGxfYmFzZSwgc2l6ZSA+PiAyMCk7CisJcmV0dXJuOworCitlcnJfbGxiOgorCWRybV9tbV9wdXRfYmxvY2soY29tcHJlc3NlZF9sbGIpOworZXJyX2ZiOgorCWRybV9tbV9wdXRfYmxvY2soY29tcHJlc3NlZF9mYik7CitlcnI6CisJZGV2X3ByaXYtPm5vX2ZiY19yZWFzb24gPSBGQkNfU1RPTEVOX1RPT19TTUFMTDsKKwlpOTE1X3dhcm5fc3RvbGVuKGRldik7CiB9CiAKIHN0YXRpYyB2b2lkIGk5MTVfY2xlYW51cF9jb21wcmVzc2lvbihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQpAQCAtMTE3NiwxMiArMTE1MSwxNiBAQAogCXBtX21lc3NhZ2VfdCBwbW0gPSB7IC5ldmVudCA9IFBNX0VWRU5UX1NVU1BFTkQgfTsKIAlpZiAoc3RhdGUgPT0gVkdBX1NXSVRDSEVST09fT04pIHsKIAkJcHJpbnRrKEtFUk5fSU5GTyAiaTkxNTogc3dpdGNoZWQgb25cbiIpOworCQlkZXYtPnN3aXRjaF9wb3dlcl9zdGF0ZSA9IERSTV9TV0lUQ0hfUE9XRVJfQ0hBTkdJTkc7CiAJCS8qIGk5MTUgcmVzdW1lIGhhbmRsZXIgZG9lc24ndCBzZXQgdG8gRDAgKi8KIAkJcGNpX3NldF9wb3dlcl9zdGF0ZShkZXYtPnBkZXYsIFBDSV9EMCk7CiAJCWk5MTVfcmVzdW1lKGRldik7CisJCWRldi0+c3dpdGNoX3Bvd2VyX3N0YXRlID0gRFJNX1NXSVRDSF9QT1dFUl9PTjsKIAl9IGVsc2UgewogCQlwcmludGsoS0VSTl9FUlIgImk5MTU6IHN3aXRjaGVkIG9mZlxuIik7CisJCWRldi0+c3dpdGNoX3Bvd2VyX3N0YXRlID0gRFJNX1NXSVRDSF9QT1dFUl9DSEFOR0lORzsKIAkJaTkxNV9zdXNwZW5kKGRldiwgcG1tKTsKKwkJZGV2LT5zd2l0Y2hfcG93ZXJfc3RhdGUgPSBEUk1fU1dJVENIX1BPV0VSX09GRjsKIAl9CiB9CiAKQEAgLTExOTYsMTcgKzExNzUsMjAgQEAKIAlyZXR1cm4gY2FuX3N3aXRjaDsKIH0KIAotc3RhdGljIGludCBpOTE1X2xvYWRfbW9kZXNldF9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCi0JCQkJICB1bnNpZ25lZCBsb25nIHByZWFsbG9jX3NpemUsCi0JCQkJICB1bnNpZ25lZCBsb25nIGFncF9zaXplKQorc3RhdGljIGludCBpOTE1X2xvYWRfbW9kZXNldF9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwl1bnNpZ25lZCBsb25nIHByZWFsbG9jX3NpemUsIGd0dF9zaXplLCBtYXBwYWJsZV9zaXplOwogCWludCByZXQgPSAwOwogCi0JLyogQmFzaWMgbWVtcmFuZ2UgYWxsb2NhdG9yIGZvciBzdG9sZW4gc3BhY2UgKGFrYSBtbS52cmFtKSAqLwotCWRybV9tbV9pbml0KCZkZXZfcHJpdi0+bW0udnJhbSwgMCwgcHJlYWxsb2Nfc2l6ZSk7CisJcHJlYWxsb2Nfc2l6ZSA9IGRldl9wcml2LT5tbS5ndHQtPnN0b2xlbl9zaXplOworCWd0dF9zaXplID0gZGV2X3ByaXYtPm1tLmd0dC0+Z3R0X3RvdGFsX2VudHJpZXMgPDwgUEFHRV9TSElGVDsKKwltYXBwYWJsZV9zaXplID0gZGV2X3ByaXYtPm1tLmd0dC0+Z3R0X21hcHBhYmxlX2VudHJpZXMgPDwgUEFHRV9TSElGVDsKIAotCS8qIExldCBHRU0gTWFuYWdlIGZyb20gZW5kIG9mIHByZWFsbG9jIHNwYWNlIHRvIGVuZCBvZiBhcGVydHVyZS4KKwkvKiBCYXNpYyBtZW1yYW5nZSBhbGxvY2F0b3IgZm9yIHN0b2xlbiBzcGFjZSAqLworCWRybV9tbV9pbml0KCZkZXZfcHJpdi0+bW0uc3RvbGVuLCAwLCBwcmVhbGxvY19zaXplKTsKKworCS8qIExldCBHRU0gTWFuYWdlIGFsbCBvZiB0aGUgYXBlcnR1cmUuCiAJICoKIAkgKiBIb3dldmVyLCBsZWF2ZSBvbmUgcGFnZSBhdCB0aGUgZW5kIHN0aWxsIGJvdW5kIHRvIHRoZSBzY3JhdGNoIHBhZ2UuCiAJICogVGhlcmUgYXJlIGEgbnVtYmVyIG9mIHBsYWNlcyB3aGVyZSB0aGUgaGFyZHdhcmUgYXBwYXJlbnRseQpAQCAtMTIxNSw3ICsxMTk3LDcgQEAKIAkgKiBhdCB0aGUgbGFzdCBwYWdlIG9mIHRoZSBhcGVydHVyZS4gIE9uZSBwYWdlIHNob3VsZCBiZSBlbm91Z2ggdG8KIAkgKiBrZWVwIGFueSBwcmVmZXRjaGluZyBpbnNpZGUgb2YgdGhlIGFwZXJ0dXJlLgogCSAqLwotCWk5MTVfZ2VtX2RvX2luaXQoZGV2LCBwcmVhbGxvY19zaXplLCBhZ3Bfc2l6ZSAtIDQwOTYpOworCWk5MTVfZ2VtX2RvX2luaXQoZGV2LCAwLCBtYXBwYWJsZV9zaXplLCBndHRfc2l6ZSAtIFBBR0VfU0laRSk7CiAKIAltdXRleF9sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CiAJcmV0ID0gaTkxNV9nZW1faW5pdF9yaW5nYnVmZmVyKGRldik7CkBAIC0xMjI3LDE2ICsxMjA5LDE3IEBACiAJaWYgKEk5MTVfSEFTX0ZCQyhkZXYpICYmIGk5MTVfcG93ZXJzYXZlKSB7CiAJCWludCBjZmJfc2l6ZTsKIAotCQkvKiBUcnkgdG8gZ2V0IGFuIDhNIGJ1ZmZlci4uLiAqLwotCQlpZiAocHJlYWxsb2Nfc2l6ZSA+ICg5KjEwMjQqMTAyNCkpCi0JCQljZmJfc2l6ZSA9IDgqMTAyNCoxMDI0OworCQkvKiBMZWF2ZSAxTSBmb3IgbGluZSBsZW5ndGggYnVmZmVyICYgbWlzYy4gKi8KKworCQkvKiBUcnkgdG8gZ2V0IGEgMzJNIGJ1ZmZlci4uLiAqLworCQlpZiAocHJlYWxsb2Nfc2l6ZSA+ICgzNioxMDI0KjEwMjQpKQorCQkJY2ZiX3NpemUgPSAzMioxMDI0KjEwMjQ7CiAJCWVsc2UgLyogZmFsbCBiYWNrIHRvIDcvOCBvZiB0aGUgc3RvbGVuIHNwYWNlICovCiAJCQljZmJfc2l6ZSA9IHByZWFsbG9jX3NpemUgKiA3IC8gODsKIAkJaTkxNV9zZXR1cF9jb21wcmVzc2lvbihkZXYsIGNmYl9zaXplKTsKIAl9CiAKLQkvKiBBbGxvdyBoYXJkd2FyZSBiYXRjaGJ1ZmZlcnMgdW5sZXNzIHRvbGQgb3RoZXJ3aXNlLgotCSAqLworCS8qIEFsbG93IGhhcmR3YXJlIGJhdGNoYnVmZmVycyB1bmxlc3MgdG9sZCBvdGhlcndpc2UuICovCiAJZGV2X3ByaXYtPmFsbG93X2JhdGNoYnVmZmVyID0gMTsKIAogCXJldCA9IGludGVsX3BhcnNlX2Jpb3MoZGV2KTsKQEAgLTEyNTIsNiArMTIzNSw3IEBACiAKIAlyZXQgPSB2Z2Ffc3dpdGNoZXJvb19yZWdpc3Rlcl9jbGllbnQoZGV2LT5wZGV2LAogCQkJCQkgICAgIGk5MTVfc3dpdGNoZXJvb19zZXRfc3RhdGUsCisJCQkJCSAgICAgTlVMTCwKIAkJCQkJICAgICBpOTE1X3N3aXRjaGVyb29fY2FuX3N3aXRjaCk7CiAJaWYgKHJldCkKIAkJZ290byBjbGVhbnVwX3ZnYV9jbGllbnQ7CkBAIC0xNDI2LDE1MiArMTQxMCwxMiBAQAogCX0KIH0KIAotc3RydWN0IHZfdGFibGUgewotCXU4IHZpZDsKLQl1bnNpZ25lZCBsb25nIHZkOyAvKiBpbiAuMSBtaWwgKi8KLQl1bnNpZ25lZCBsb25nIHZtOyAvKiBpbiAuMSBtaWwgKi8KLQl1OCBwdmlkOwotfTsKLQotc3RhdGljIHN0cnVjdCB2X3RhYmxlIHZfdGFibGVbXSA9IHsKLQl7IDAsIDE2MTI1LCAxNTAwMCwgMHg3ZiwgfSwKLQl7IDEsIDE2MDAwLCAxNDg3NSwgMHg3ZSwgfSwKLQl7IDIsIDE1ODc1LCAxNDc1MCwgMHg3ZCwgfSwKLQl7IDMsIDE1NzUwLCAxNDYyNSwgMHg3YywgfSwKLQl7IDQsIDE1NjI1LCAxNDUwMCwgMHg3YiwgfSwKLQl7IDUsIDE1NTAwLCAxNDM3NSwgMHg3YSwgfSwKLQl7IDYsIDE1Mzc1LCAxNDI1MCwgMHg3OSwgfSwKLQl7IDcsIDE1MjUwLCAxNDEyNSwgMHg3OCwgfSwKLQl7IDgsIDE1MTI1LCAxNDAwMCwgMHg3NywgfSwKLQl7IDksIDE1MDAwLCAxMzg3NSwgMHg3NiwgfSwKLQl7IDEwLCAxNDg3NSwgMTM3NTAsIDB4NzUsIH0sCi0JeyAxMSwgMTQ3NTAsIDEzNjI1LCAweDc0LCB9LAotCXsgMTIsIDE0NjI1LCAxMzUwMCwgMHg3MywgfSwKLQl7IDEzLCAxNDUwMCwgMTMzNzUsIDB4NzIsIH0sCi0JeyAxNCwgMTQzNzUsIDEzMjUwLCAweDcxLCB9LAotCXsgMTUsIDE0MjUwLCAxMzEyNSwgMHg3MCwgfSwKLQl7IDE2LCAxNDEyNSwgMTMwMDAsIDB4NmYsIH0sCi0JeyAxNywgMTQwMDAsIDEyODc1LCAweDZlLCB9LAotCXsgMTgsIDEzODc1LCAxMjc1MCwgMHg2ZCwgfSwKLQl7IDE5LCAxMzc1MCwgMTI2MjUsIDB4NmMsIH0sCi0JeyAyMCwgMTM2MjUsIDEyNTAwLCAweDZiLCB9LAotCXsgMjEsIDEzNTAwLCAxMjM3NSwgMHg2YSwgfSwKLQl7IDIyLCAxMzM3NSwgMTIyNTAsIDB4NjksIH0sCi0JeyAyMywgMTMyNTAsIDEyMTI1LCAweDY4LCB9LAotCXsgMjQsIDEzMTI1LCAxMjAwMCwgMHg2NywgfSwKLQl7IDI1LCAxMzAwMCwgMTE4NzUsIDB4NjYsIH0sCi0JeyAyNiwgMTI4NzUsIDExNzUwLCAweDY1LCB9LAotCXsgMjcsIDEyNzUwLCAxMTYyNSwgMHg2NCwgfSwKLQl7IDI4LCAxMjYyNSwgMTE1MDAsIDB4NjMsIH0sCi0JeyAyOSwgMTI1MDAsIDExMzc1LCAweDYyLCB9LAotCXsgMzAsIDEyMzc1LCAxMTI1MCwgMHg2MSwgfSwKLQl7IDMxLCAxMjI1MCwgMTExMjUsIDB4NjAsIH0sCi0JeyAzMiwgMTIxMjUsIDExMDAwLCAweDVmLCB9LAotCXsgMzMsIDEyMDAwLCAxMDg3NSwgMHg1ZSwgfSwKLQl7IDM0LCAxMTg3NSwgMTA3NTAsIDB4NWQsIH0sCi0JeyAzNSwgMTE3NTAsIDEwNjI1LCAweDVjLCB9LAotCXsgMzYsIDExNjI1LCAxMDUwMCwgMHg1YiwgfSwKLQl7IDM3LCAxMTUwMCwgMTAzNzUsIDB4NWEsIH0sCi0JeyAzOCwgMTEzNzUsIDEwMjUwLCAweDU5LCB9LAotCXsgMzksIDExMjUwLCAxMDEyNSwgMHg1OCwgfSwKLQl7IDQwLCAxMTEyNSwgMTAwMDAsIDB4NTcsIH0sCi0JeyA0MSwgMTEwMDAsIDk4NzUsIDB4NTYsIH0sCi0JeyA0MiwgMTA4NzUsIDk3NTAsIDB4NTUsIH0sCi0JeyA0MywgMTA3NTAsIDk2MjUsIDB4NTQsIH0sCi0JeyA0NCwgMTA2MjUsIDk1MDAsIDB4NTMsIH0sCi0JeyA0NSwgMTA1MDAsIDkzNzUsIDB4NTIsIH0sCi0JeyA0NiwgMTAzNzUsIDkyNTAsIDB4NTEsIH0sCi0JeyA0NywgMTAyNTAsIDkxMjUsIDB4NTAsIH0sCi0JeyA0OCwgMTAxMjUsIDkwMDAsIDB4NGYsIH0sCi0JeyA0OSwgMTAwMDAsIDg4NzUsIDB4NGUsIH0sCi0JeyA1MCwgOTg3NSwgODc1MCwgMHg0ZCwgfSwKLQl7IDUxLCA5NzUwLCA4NjI1LCAweDRjLCB9LAotCXsgNTIsIDk2MjUsIDg1MDAsIDB4NGIsIH0sCi0JeyA1MywgOTUwMCwgODM3NSwgMHg0YSwgfSwKLQl7IDU0LCA5Mzc1LCA4MjUwLCAweDQ5LCB9LAotCXsgNTUsIDkyNTAsIDgxMjUsIDB4NDgsIH0sCi0JeyA1NiwgOTEyNSwgODAwMCwgMHg0NywgfSwKLQl7IDU3LCA5MDAwLCA3ODc1LCAweDQ2LCB9LAotCXsgNTgsIDg4NzUsIDc3NTAsIDB4NDUsIH0sCi0JeyA1OSwgODc1MCwgNzYyNSwgMHg0NCwgfSwKLQl7IDYwLCA4NjI1LCA3NTAwLCAweDQzLCB9LAotCXsgNjEsIDg1MDAsIDczNzUsIDB4NDIsIH0sCi0JeyA2MiwgODM3NSwgNzI1MCwgMHg0MSwgfSwKLQl7IDYzLCA4MjUwLCA3MTI1LCAweDQwLCB9LAotCXsgNjQsIDgxMjUsIDcwMDAsIDB4M2YsIH0sCi0JeyA2NSwgODAwMCwgNjg3NSwgMHgzZSwgfSwKLQl7IDY2LCA3ODc1LCA2NzUwLCAweDNkLCB9LAotCXsgNjcsIDc3NTAsIDY2MjUsIDB4M2MsIH0sCi0JeyA2OCwgNzYyNSwgNjUwMCwgMHgzYiwgfSwKLQl7IDY5LCA3NTAwLCA2Mzc1LCAweDNhLCB9LAotCXsgNzAsIDczNzUsIDYyNTAsIDB4MzksIH0sCi0JeyA3MSwgNzI1MCwgNjEyNSwgMHgzOCwgfSwKLQl7IDcyLCA3MTI1LCA2MDAwLCAweDM3LCB9LAotCXsgNzMsIDcwMDAsIDU4NzUsIDB4MzYsIH0sCi0JeyA3NCwgNjg3NSwgNTc1MCwgMHgzNSwgfSwKLQl7IDc1LCA2NzUwLCA1NjI1LCAweDM0LCB9LAotCXsgNzYsIDY2MjUsIDU1MDAsIDB4MzMsIH0sCi0JeyA3NywgNjUwMCwgNTM3NSwgMHgzMiwgfSwKLQl7IDc4LCA2Mzc1LCA1MjUwLCAweDMxLCB9LAotCXsgNzksIDYyNTAsIDUxMjUsIDB4MzAsIH0sCi0JeyA4MCwgNjEyNSwgNTAwMCwgMHgyZiwgfSwKLQl7IDgxLCA2MDAwLCA0ODc1LCAweDJlLCB9LAotCXsgODIsIDU4NzUsIDQ3NTAsIDB4MmQsIH0sCi0JeyA4MywgNTc1MCwgNDYyNSwgMHgyYywgfSwKLQl7IDg0LCA1NjI1LCA0NTAwLCAweDJiLCB9LAotCXsgODUsIDU1MDAsIDQzNzUsIDB4MmEsIH0sCi0JeyA4NiwgNTM3NSwgNDI1MCwgMHgyOSwgfSwKLQl7IDg3LCA1MjUwLCA0MTI1LCAweDI4LCB9LAotCXsgODgsIDUxMjUsIDQwMDAsIDB4MjcsIH0sCi0JeyA4OSwgNTAwMCwgMzg3NSwgMHgyNiwgfSwKLQl7IDkwLCA0ODc1LCAzNzUwLCAweDI1LCB9LAotCXsgOTEsIDQ3NTAsIDM2MjUsIDB4MjQsIH0sCi0JeyA5MiwgNDYyNSwgMzUwMCwgMHgyMywgfSwKLQl7IDkzLCA0NTAwLCAzMzc1LCAweDIyLCB9LAotCXsgOTQsIDQzNzUsIDMyNTAsIDB4MjEsIH0sCi0JeyA5NSwgNDI1MCwgMzEyNSwgMHgyMCwgfSwKLQl7IDk2LCA0MTI1LCAzMDAwLCAweDFmLCB9LAotCXsgOTcsIDQxMjUsIDMwMDAsIDB4MWUsIH0sCi0JeyA5OCwgNDEyNSwgMzAwMCwgMHgxZCwgfSwKLQl7IDk5LCA0MTI1LCAzMDAwLCAweDFjLCB9LAotCXsgMTAwLCA0MTI1LCAzMDAwLCAweDFiLCB9LAotCXsgMTAxLCA0MTI1LCAzMDAwLCAweDFhLCB9LAotCXsgMTAyLCA0MTI1LCAzMDAwLCAweDE5LCB9LAotCXsgMTAzLCA0MTI1LCAzMDAwLCAweDE4LCB9LAotCXsgMTA0LCA0MTI1LCAzMDAwLCAweDE3LCB9LAotCXsgMTA1LCA0MTI1LCAzMDAwLCAweDE2LCB9LAotCXsgMTA2LCA0MTI1LCAzMDAwLCAweDE1LCB9LAotCXsgMTA3LCA0MTI1LCAzMDAwLCAweDE0LCB9LAotCXsgMTA4LCA0MTI1LCAzMDAwLCAweDEzLCB9LAotCXsgMTA5LCA0MTI1LCAzMDAwLCAweDEyLCB9LAotCXsgMTEwLCA0MTI1LCAzMDAwLCAweDExLCB9LAotCXsgMTExLCA0MTI1LCAzMDAwLCAweDEwLCB9LAotCXsgMTEyLCA0MTI1LCAzMDAwLCAweDBmLCB9LAotCXsgMTEzLCA0MTI1LCAzMDAwLCAweDBlLCB9LAotCXsgMTE0LCA0MTI1LCAzMDAwLCAweDBkLCB9LAotCXsgMTE1LCA0MTI1LCAzMDAwLCAweDBjLCB9LAotCXsgMTE2LCA0MTI1LCAzMDAwLCAweDBiLCB9LAotCXsgMTE3LCA0MTI1LCAzMDAwLCAweDBhLCB9LAotCXsgMTE4LCA0MTI1LCAzMDAwLCAweDA5LCB9LAotCXsgMTE5LCA0MTI1LCAzMDAwLCAweDA4LCB9LAotCXsgMTIwLCAxMTI1LCAwLCAweDA3LCB9LAotCXsgMTIxLCAxMDAwLCAwLCAweDA2LCB9LAotCXsgMTIyLCA4NzUsIDAsIDB4MDUsIH0sCi0JeyAxMjMsIDc1MCwgMCwgMHgwNCwgfSwKLQl7IDEyNCwgNjI1LCAwLCAweDAzLCB9LAotCXsgMTI1LCA1MDAsIDAsIDB4MDIsIH0sCi0JeyAxMjYsIDM3NSwgMCwgMHgwMSwgfSwKLQl7IDEyNywgMCwgMCwgMHgwMCwgfSwKLX07Ci0KLXN0cnVjdCBjcGFyYW1zIHsKLQlpbnQgaTsKLQlpbnQgdDsKLQlpbnQgbTsKLQlpbnQgYzsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY3BhcmFtcyBjcGFyYW1zW10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGNwYXJhbXMgeworCXUxNiBpOworCXUxNiB0OworCXUxNiBtOworCXUxNiBjOworfSBjcGFyYW1zW10gPSB7CiAJeyAxLCAxMzMzLCAzMDEsIDI4NjY0IH0sCiAJeyAxLCAxMDY2LCAyOTQsIDI0NDYwIH0sCiAJeyAxLCA4MDAsIDI5NCwgMjUxOTIgfSwKQEAgLTE2MzcsMjEgKzE0ODEsMTQ1IEBACiAJcmV0dXJuICgobSAqIHgpIC8gMTI3KSAtIGI7CiB9CiAKLXN0YXRpYyB1bnNpZ25lZCBsb25nIHB2aWRfdG9fZXh0dmlkKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiwgdTggcHh2aWQpCitzdGF0aWMgdTE2IHB2aWRfdG9fZXh0dmlkKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiwgdTggcHh2aWQpCiB7Ci0JdW5zaWduZWQgbG9uZyB2YWwgPSAwOwotCWludCBpOwotCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUodl90YWJsZSk7IGkrKykgewotCQlpZiAodl90YWJsZVtpXS5wdmlkID09IHB4dmlkKSB7Ci0JCQlpZiAoSVNfTU9CSUxFKGRldl9wcml2LT5kZXYpKQotCQkJCXZhbCA9IHZfdGFibGVbaV0udm07Ci0JCQllbHNlCi0JCQkJdmFsID0gdl90YWJsZVtpXS52ZDsKLQkJfQotCX0KLQotCXJldHVybiB2YWw7CisJc3RhdGljIGNvbnN0IHN0cnVjdCB2X3RhYmxlIHsKKwkJdTE2IHZkOyAvKiBpbiAuMSBtaWwgKi8KKwkJdTE2IHZtOyAvKiBpbiAuMSBtaWwgKi8KKwl9IHZfdGFibGVbXSA9IHsKKwkJeyAwLCAwLCB9LAorCQl7IDM3NSwgMCwgfSwKKwkJeyA1MDAsIDAsIH0sCisJCXsgNjI1LCAwLCB9LAorCQl7IDc1MCwgMCwgfSwKKwkJeyA4NzUsIDAsIH0sCisJCXsgMTAwMCwgMCwgfSwKKwkJeyAxMTI1LCAwLCB9LAorCQl7IDQxMjUsIDMwMDAsIH0sCisJCXsgNDEyNSwgMzAwMCwgfSwKKwkJeyA0MTI1LCAzMDAwLCB9LAorCQl7IDQxMjUsIDMwMDAsIH0sCisJCXsgNDEyNSwgMzAwMCwgfSwKKwkJeyA0MTI1LCAzMDAwLCB9LAorCQl7IDQxMjUsIDMwMDAsIH0sCisJCXsgNDEyNSwgMzAwMCwgfSwKKwkJeyA0MTI1LCAzMDAwLCB9LAorCQl7IDQxMjUsIDMwMDAsIH0sCisJCXsgNDEyNSwgMzAwMCwgfSwKKwkJeyA0MTI1LCAzMDAwLCB9LAorCQl7IDQxMjUsIDMwMDAsIH0sCisJCXsgNDEyNSwgMzAwMCwgfSwKKwkJeyA0MTI1LCAzMDAwLCB9LAorCQl7IDQxMjUsIDMwMDAsIH0sCisJCXsgNDEyNSwgMzAwMCwgfSwKKwkJeyA0MTI1LCAzMDAwLCB9LAorCQl7IDQxMjUsIDMwMDAsIH0sCisJCXsgNDEyNSwgMzAwMCwgfSwKKwkJeyA0MTI1LCAzMDAwLCB9LAorCQl7IDQxMjUsIDMwMDAsIH0sCisJCXsgNDEyNSwgMzAwMCwgfSwKKwkJeyA0MTI1LCAzMDAwLCB9LAorCQl7IDQyNTAsIDMxMjUsIH0sCisJCXsgNDM3NSwgMzI1MCwgfSwKKwkJeyA0NTAwLCAzMzc1LCB9LAorCQl7IDQ2MjUsIDM1MDAsIH0sCisJCXsgNDc1MCwgMzYyNSwgfSwKKwkJeyA0ODc1LCAzNzUwLCB9LAorCQl7IDUwMDAsIDM4NzUsIH0sCisJCXsgNTEyNSwgNDAwMCwgfSwKKwkJeyA1MjUwLCA0MTI1LCB9LAorCQl7IDUzNzUsIDQyNTAsIH0sCisJCXsgNTUwMCwgNDM3NSwgfSwKKwkJeyA1NjI1LCA0NTAwLCB9LAorCQl7IDU3NTAsIDQ2MjUsIH0sCisJCXsgNTg3NSwgNDc1MCwgfSwKKwkJeyA2MDAwLCA0ODc1LCB9LAorCQl7IDYxMjUsIDUwMDAsIH0sCisJCXsgNjI1MCwgNTEyNSwgfSwKKwkJeyA2Mzc1LCA1MjUwLCB9LAorCQl7IDY1MDAsIDUzNzUsIH0sCisJCXsgNjYyNSwgNTUwMCwgfSwKKwkJeyA2NzUwLCA1NjI1LCB9LAorCQl7IDY4NzUsIDU3NTAsIH0sCisJCXsgNzAwMCwgNTg3NSwgfSwKKwkJeyA3MTI1LCA2MDAwLCB9LAorCQl7IDcyNTAsIDYxMjUsIH0sCisJCXsgNzM3NSwgNjI1MCwgfSwKKwkJeyA3NTAwLCA2Mzc1LCB9LAorCQl7IDc2MjUsIDY1MDAsIH0sCisJCXsgNzc1MCwgNjYyNSwgfSwKKwkJeyA3ODc1LCA2NzUwLCB9LAorCQl7IDgwMDAsIDY4NzUsIH0sCisJCXsgODEyNSwgNzAwMCwgfSwKKwkJeyA4MjUwLCA3MTI1LCB9LAorCQl7IDgzNzUsIDcyNTAsIH0sCisJCXsgODUwMCwgNzM3NSwgfSwKKwkJeyA4NjI1LCA3NTAwLCB9LAorCQl7IDg3NTAsIDc2MjUsIH0sCisJCXsgODg3NSwgNzc1MCwgfSwKKwkJeyA5MDAwLCA3ODc1LCB9LAorCQl7IDkxMjUsIDgwMDAsIH0sCisJCXsgOTI1MCwgODEyNSwgfSwKKwkJeyA5Mzc1LCA4MjUwLCB9LAorCQl7IDk1MDAsIDgzNzUsIH0sCisJCXsgOTYyNSwgODUwMCwgfSwKKwkJeyA5NzUwLCA4NjI1LCB9LAorCQl7IDk4NzUsIDg3NTAsIH0sCisJCXsgMTAwMDAsIDg4NzUsIH0sCisJCXsgMTAxMjUsIDkwMDAsIH0sCisJCXsgMTAyNTAsIDkxMjUsIH0sCisJCXsgMTAzNzUsIDkyNTAsIH0sCisJCXsgMTA1MDAsIDkzNzUsIH0sCisJCXsgMTA2MjUsIDk1MDAsIH0sCisJCXsgMTA3NTAsIDk2MjUsIH0sCisJCXsgMTA4NzUsIDk3NTAsIH0sCisJCXsgMTEwMDAsIDk4NzUsIH0sCisJCXsgMTExMjUsIDEwMDAwLCB9LAorCQl7IDExMjUwLCAxMDEyNSwgfSwKKwkJeyAxMTM3NSwgMTAyNTAsIH0sCisJCXsgMTE1MDAsIDEwMzc1LCB9LAorCQl7IDExNjI1LCAxMDUwMCwgfSwKKwkJeyAxMTc1MCwgMTA2MjUsIH0sCisJCXsgMTE4NzUsIDEwNzUwLCB9LAorCQl7IDEyMDAwLCAxMDg3NSwgfSwKKwkJeyAxMjEyNSwgMTEwMDAsIH0sCisJCXsgMTIyNTAsIDExMTI1LCB9LAorCQl7IDEyMzc1LCAxMTI1MCwgfSwKKwkJeyAxMjUwMCwgMTEzNzUsIH0sCisJCXsgMTI2MjUsIDExNTAwLCB9LAorCQl7IDEyNzUwLCAxMTYyNSwgfSwKKwkJeyAxMjg3NSwgMTE3NTAsIH0sCisJCXsgMTMwMDAsIDExODc1LCB9LAorCQl7IDEzMTI1LCAxMjAwMCwgfSwKKwkJeyAxMzI1MCwgMTIxMjUsIH0sCisJCXsgMTMzNzUsIDEyMjUwLCB9LAorCQl7IDEzNTAwLCAxMjM3NSwgfSwKKwkJeyAxMzYyNSwgMTI1MDAsIH0sCisJCXsgMTM3NTAsIDEyNjI1LCB9LAorCQl7IDEzODc1LCAxMjc1MCwgfSwKKwkJeyAxNDAwMCwgMTI4NzUsIH0sCisJCXsgMTQxMjUsIDEzMDAwLCB9LAorCQl7IDE0MjUwLCAxMzEyNSwgfSwKKwkJeyAxNDM3NSwgMTMyNTAsIH0sCisJCXsgMTQ1MDAsIDEzMzc1LCB9LAorCQl7IDE0NjI1LCAxMzUwMCwgfSwKKwkJeyAxNDc1MCwgMTM2MjUsIH0sCisJCXsgMTQ4NzUsIDEzNzUwLCB9LAorCQl7IDE1MDAwLCAxMzg3NSwgfSwKKwkJeyAxNTEyNSwgMTQwMDAsIH0sCisJCXsgMTUyNTAsIDE0MTI1LCB9LAorCQl7IDE1Mzc1LCAxNDI1MCwgfSwKKwkJeyAxNTUwMCwgMTQzNzUsIH0sCisJCXsgMTU2MjUsIDE0NTAwLCB9LAorCQl7IDE1NzUwLCAxNDYyNSwgfSwKKwkJeyAxNTg3NSwgMTQ3NTAsIH0sCisJCXsgMTYwMDAsIDE0ODc1LCB9LAorCQl7IDE2MTI1LCAxNTAwMCwgfSwKKwl9OworCWlmIChkZXZfcHJpdi0+aW5mby0+aXNfbW9iaWxlKQorCQlyZXR1cm4gdl90YWJsZVtweHZpZF0udm07CisJZWxzZQorCQlyZXR1cm4gdl90YWJsZVtweHZpZF0udmQ7CiB9CiAKIHZvaWQgaTkxNV91cGRhdGVfZ2Z4X3ZhbChzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYpCkBAIC0xOTA1LDkgKzE4NzMsOSBAQAogaW50IGk5MTVfZHJpdmVyX2xvYWQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdW5zaWduZWQgbG9uZyBmbGFncykKIHsKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXY7Ci0JcmVzb3VyY2Vfc2l6ZV90IGJhc2UsIHNpemU7CiAJaW50IHJldCA9IDAsIG1taW9fYmFyOwotCXVpbnQzMl90IGFncF9zaXplLCBwcmVhbGxvY19zaXplOworCXVpbnQzMl90IGFncF9zaXplOworCiAJLyogaTkxNSBoYXMgNCBtb3JlIGNvdW50ZXJzICovCiAJZGV2LT5jb3VudGVycyArPSA0OwogCWRldi0+dHlwZXNbNl0gPSBfRFJNX1NUQVRfSVJROwpAQCAtMTkyMywxMSArMTg5MSw2IEBACiAJZGV2X3ByaXYtPmRldiA9IGRldjsKIAlkZXZfcHJpdi0+aW5mbyA9IChzdHJ1Y3QgaW50ZWxfZGV2aWNlX2luZm8gKikgZmxhZ3M7CiAKLQkvKiBBZGQgcmVnaXN0ZXIgbWFwIChuZWVkZWQgZm9yIHN1c3BlbmQvcmVzdW1lKSAqLwotCW1taW9fYmFyID0gSVNfR0VOMihkZXYpID8gMSA6IDA7Ci0JYmFzZSA9IHBjaV9yZXNvdXJjZV9zdGFydChkZXYtPnBkZXYsIG1taW9fYmFyKTsKLQlzaXplID0gcGNpX3Jlc291cmNlX2xlbihkZXYtPnBkZXYsIG1taW9fYmFyKTsKLQogCWlmIChpOTE1X2dldF9icmlkZ2VfZGV2KGRldikpIHsKIAkJcmV0ID0gLUVJTzsKIAkJZ290byBmcmVlX3ByaXY7CkBAIC0xOTM3LDE2ICsxOTAwLDI1IEBACiAJaWYgKElTX0dFTjIoZGV2KSkKIAkJZG1hX3NldF9jb2hlcmVudF9tYXNrKCZkZXYtPnBkZXYtPmRldiwgRE1BX0JJVF9NQVNLKDMwKSk7CiAKLQlkZXZfcHJpdi0+cmVncyA9IGlvcmVtYXAoYmFzZSwgc2l6ZSk7CisJbW1pb19iYXIgPSBJU19HRU4yKGRldikgPyAxIDogMDsKKwlkZXZfcHJpdi0+cmVncyA9IHBjaV9pb21hcChkZXYtPnBkZXYsIG1taW9fYmFyLCAwKTsKIAlpZiAoIWRldl9wcml2LT5yZWdzKSB7CiAJCURSTV9FUlJPUigiZmFpbGVkIHRvIG1hcCByZWdpc3RlcnNcbiIpOwogCQlyZXQgPSAtRUlPOwogCQlnb3RvIHB1dF9icmlkZ2U7CiAJfQogCisJZGV2X3ByaXYtPm1tLmd0dCA9IGludGVsX2d0dF9nZXQoKTsKKwlpZiAoIWRldl9wcml2LT5tbS5ndHQpIHsKKwkJRFJNX0VSUk9SKCJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBHVFRcbiIpOworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIG91dF9pb21hcGZyZWU7CisJfQorCisJYWdwX3NpemUgPSBkZXZfcHJpdi0+bW0uZ3R0LT5ndHRfbWFwcGFibGVfZW50cmllcyA8PCBQQUdFX1NISUZUOworCiAgICAgICAgIGRldl9wcml2LT5tbS5ndHRfbWFwcGluZyA9Ci0JCWlvX21hcHBpbmdfY3JlYXRlX3djKGRldi0+YWdwLT5iYXNlLAotCQkJCSAgICAgZGV2LT5hZ3AtPmFncF9pbmZvLmFwZXJfc2l6ZSAqIDEwMjQqMTAyNCk7CisJCWlvX21hcHBpbmdfY3JlYXRlX3djKGRldi0+YWdwLT5iYXNlLCBhZ3Bfc2l6ZSk7CiAJaWYgKGRldl9wcml2LT5tbS5ndHRfbWFwcGluZyA9PSBOVUxMKSB7CiAJCXJldCA9IC1FSU87CiAJCWdvdG8gb3V0X3JtbWFwOwpAQCAtMTk1OCwyNCArMTkzMCwxMyBAQAogCSAqIE1UUlIgaWYgcHJlc2VudC4gIEV2ZW4gaWYgYSBVQyBNVFJSIGlzbid0IHByZXNlbnQuCiAJICovCiAJZGV2X3ByaXYtPm1tLmd0dF9tdHJyID0gbXRycl9hZGQoZGV2LT5hZ3AtPmJhc2UsCi0JCQkJCSBkZXYtPmFncC0+YWdwX2luZm8uYXBlcl9zaXplICoKLQkJCQkJIDEwMjQgKiAxMDI0LAorCQkJCQkgYWdwX3NpemUsCiAJCQkJCSBNVFJSX1RZUEVfV1JDT01CLCAxKTsKIAlpZiAoZGV2X3ByaXYtPm1tLmd0dF9tdHJyIDwgMCkgewogCQlEUk1fSU5GTygiTVRSUiBhbGxvY2F0aW9uIGZhaWxlZC4gIEdyYXBoaWNzICIKIAkJCSAicGVyZm9ybWFuY2UgbWF5IHN1ZmZlci5cbiIpOwogCX0KIAotCWRldl9wcml2LT5tbS5ndHQgPSBpbnRlbF9ndHRfZ2V0KCk7Ci0JaWYgKCFkZXZfcHJpdi0+bW0uZ3R0KSB7Ci0JCURSTV9FUlJPUigiRmFpbGVkIHRvIGluaXRpYWxpemUgR1RUXG4iKTsKLQkJcmV0ID0gLUVOT0RFVjsKLQkJZ290byBvdXRfaW9tYXBmcmVlOwotCX0KLQotCXByZWFsbG9jX3NpemUgPSBkZXZfcHJpdi0+bW0uZ3R0LT5ndHRfc3RvbGVuX2VudHJpZXMgPDwgUEFHRV9TSElGVDsKLQlhZ3Bfc2l6ZSA9IGRldl9wcml2LT5tbS5ndHQtPmd0dF9tYXBwYWJsZV9lbnRyaWVzIDw8IFBBR0VfU0hJRlQ7Ci0KIAkvKiBUaGUgaTkxNSB3b3JrcXVldWUgaXMgcHJpbWFyaWx5IHVzZWQgZm9yIGJhdGNoZWQgcmV0aXJlbWVudCBvZgogCSAqIHJlcXVlc3RzIChhbmQgdGh1cyBtYW5hZ2luZyBibykgb25jZSB0aGUgdGFzayBoYXMgYmVlbiBjb21wbGV0ZWQKIAkgKiBieSB0aGUgR1BVLiBpOTE1X2dlbV9yZXRpcmVfcmVxdWVzdHMoKSBpcyBjYWxsZWQgZGlyZWN0bHkgd2hlbiB3ZQpAQCAtMTk4Myw3ICsxOTQ0LDcgQEAKIAkgKiBiby4KIAkgKgogCSAqIEl0IGlzIGFsc28gdXNlZCBmb3IgcGVyaW9kaWMgbG93LXByaW9yaXR5IGV2ZW50cywgc3VjaCBhcwotCSAqIGlkbGUtdGltZXJzIGFuZCBoYW5nY2hlY2suCisJICogaWRsZS10aW1lcnMgYW5kIHJlY29yZGluZyBlcnJvciBzdGF0ZS4KIAkgKgogCSAqIEFsbCB0YXNrcyBvbiB0aGUgd29ya3F1ZXVlIGFyZSBleHBlY3RlZCB0byBhY3F1aXJlIHRoZSBkZXYgbXV0ZXgKIAkgKiBzbyB0aGVyZSBpcyBubyBwb2ludCBpbiBydW5uaW5nIG1vcmUgdGhhbiBvbmUgaW5zdGFuY2Ugb2YgdGhlCkBAIC0yMDAxLDIwICsxOTYyLDExIEBACiAJLyogZW5hYmxlIEdFTSBieSBkZWZhdWx0ICovCiAJZGV2X3ByaXYtPmhhc19nZW0gPSAxOwogCi0JaWYgKHByZWFsbG9jX3NpemUgPiBhZ3Bfc2l6ZSAqIDMgLyA0KSB7Ci0JCURSTV9FUlJPUigiRGV0ZWN0ZWQgYnJva2VuIHZpZGVvIEJJT1Mgd2l0aCAlZC8lZGtCIG9mIHZpZGVvICIKLQkJCSAgIm1lbW9yeSBzdG9sZW4uXG4iLAotCQkJICBwcmVhbGxvY19zaXplIC8gMTAyNCwgYWdwX3NpemUgLyAxMDI0KTsKLQkJRFJNX0VSUk9SKCJEaXNhYmxpbmcgR0VNLiAodHJ5IHJlZHVjaW5nIHN0b2xlbiBtZW1vcnkgb3IgIgotCQkJICAidXBkYXRpbmcgdGhlIEJJT1MgdG8gZml4KS5cbiIpOwotCQlkZXZfcHJpdi0+aGFzX2dlbSA9IDA7Ci0JfQotCiAJaWYgKGRldl9wcml2LT5oYXNfZ2VtID09IDAgJiYKIAkgICAgZHJtX2NvcmVfY2hlY2tfZmVhdHVyZShkZXYsIERSSVZFUl9NT0RFU0VUKSkgewogCQlEUk1fRVJST1IoImtlcm5lbCBtb2Rlc2V0dGluZyByZXF1aXJlcyBHRU0sIGRpc2FibGluZyBkcml2ZXIuXG4iKTsKIAkJcmV0ID0gLUVOT0RFVjsKLQkJZ290byBvdXRfaW9tYXBmcmVlOworCQlnb3RvIG91dF93b3JrcXVldWVfZnJlZTsKIAl9CiAKIAlkZXYtPmRyaXZlci0+Z2V0X3ZibGFua19jb3VudGVyID0gaTkxNV9nZXRfdmJsYW5rX2NvdW50ZXI7CkBAIC0yMDM3LDggKzE5ODksOCBAQAogCS8qIEluaXQgSFdTICovCiAJaWYgKCFJOTE1X05FRURfR0ZYX0hXUyhkZXYpKSB7CiAJCXJldCA9IGk5MTVfaW5pdF9waHlzX2h3cyhkZXYpOwotCQlpZiAocmV0ICE9IDApCi0JCQlnb3RvIG91dF93b3JrcXVldWVfZnJlZTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gb3V0X2dlbV91bmxvYWQ7CiAJfQogCiAJaWYgKElTX1BJTkVWSUVXKGRldikpCkBAIC0yMDYwLDE2ICsyMDEyLDEzIEBACiAJaWYgKCFJU19JOTQ1RyhkZXYpICYmICFJU19JOTQ1R00oZGV2KSkKIAkJcGNpX2VuYWJsZV9tc2koZGV2LT5wZGV2KTsKIAotCXNwaW5fbG9ja19pbml0KCZkZXZfcHJpdi0+dXNlcl9pcnFfbG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJmRldl9wcml2LT5pcnFfbG9jayk7CiAJc3Bpbl9sb2NrX2luaXQoJmRldl9wcml2LT5lcnJvcl9sb2NrKTsKIAlkZXZfcHJpdi0+dHJhY2VfaXJxX3NlcW5vID0gMDsKIAogCXJldCA9IGRybV92YmxhbmtfaW5pdChkZXYsIEk5MTVfTlVNX1BJUEUpOwotCi0JaWYgKHJldCkgewotCQkodm9pZCkgaTkxNV9kcml2ZXJfdW5sb2FkKGRldik7Ci0JCXJldHVybiByZXQ7Ci0JfQorCWlmIChyZXQpCisJCWdvdG8gb3V0X2dlbV91bmxvYWQ7CiAKIAkvKiBTdGFydCBvdXQgc3VzcGVuZGVkICovCiAJZGV2X3ByaXYtPm1tLnN1c3BlbmRlZCA9IDE7CkBAIC0yMDc3LDEwICsyMDI2LDEwIEBACiAJaW50ZWxfZGV0ZWN0X3BjaChkZXYpOwogCiAJaWYgKGRybV9jb3JlX2NoZWNrX2ZlYXR1cmUoZGV2LCBEUklWRVJfTU9ERVNFVCkpIHsKLQkJcmV0ID0gaTkxNV9sb2FkX21vZGVzZXRfaW5pdChkZXYsIHByZWFsbG9jX3NpemUsIGFncF9zaXplKTsKKwkJcmV0ID0gaTkxNV9sb2FkX21vZGVzZXRfaW5pdChkZXYpOwogCQlpZiAocmV0IDwgMCkgewogCQkJRFJNX0VSUk9SKCJmYWlsZWQgdG8gaW5pdCBtb2Rlc2V0XG4iKTsKLQkJCWdvdG8gb3V0X3dvcmtxdWV1ZV9mcmVlOworCQkJZ290byBvdXRfZ2VtX3VubG9hZDsKIAkJfQogCX0KIApAQCAtMjEwMCwxMiArMjA0OSwxOCBAQAogCiAJcmV0dXJuIDA7CiAKK291dF9nZW1fdW5sb2FkOgorCWlmIChkZXYtPnBkZXYtPm1zaV9lbmFibGVkKQorCQlwY2lfZGlzYWJsZV9tc2koZGV2LT5wZGV2KTsKKworCWludGVsX3RlYXJkb3duX2dtYnVzKGRldik7CisJaW50ZWxfdGVhcmRvd25fbWNoYmFyKGRldik7CiBvdXRfd29ya3F1ZXVlX2ZyZWU6CiAJZGVzdHJveV93b3JrcXVldWUoZGV2X3ByaXYtPndxKTsKIG91dF9pb21hcGZyZWU6CiAJaW9fbWFwcGluZ19mcmVlKGRldl9wcml2LT5tbS5ndHRfbWFwcGluZyk7CiBvdXRfcm1tYXA6Ci0JaW91bm1hcChkZXZfcHJpdi0+cmVncyk7CisJcGNpX2lvdW5tYXAoZGV2LT5wZGV2LCBkZXZfcHJpdi0+cmVncyk7CiBwdXRfYnJpZGdlOgogCXBjaV9kZXZfcHV0KGRldl9wcml2LT5icmlkZ2VfZGV2KTsKIGZyZWVfcHJpdjoKQEAgLTIxMjIsNiArMjA3Nyw5IEBACiAJaTkxNV9tY2hfZGV2ID0gTlVMTDsKIAlzcGluX3VubG9jaygmbWNoZGV2X2xvY2spOwogCisJaWYgKGRldl9wcml2LT5tbS5pbmFjdGl2ZV9zaHJpbmtlci5zaHJpbmspCisJCXVucmVnaXN0ZXJfc2hyaW5rZXIoJmRldl9wcml2LT5tbS5pbmFjdGl2ZV9zaHJpbmtlcik7CisKIAltdXRleF9sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CiAJcmV0ID0gaTkxNV9ncHVfaWRsZShkZXYpOwogCWlmIChyZXQpCkBAIC0yMTc5LDcgKzIxMzcsNyBAQAogCQltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKIAkJaWYgKEk5MTVfSEFTX0ZCQyhkZXYpICYmIGk5MTVfcG93ZXJzYXZlKQogCQkJaTkxNV9jbGVhbnVwX2NvbXByZXNzaW9uKGRldik7Ci0JCWRybV9tbV90YWtlZG93bigmZGV2X3ByaXYtPm1tLnZyYW0pOworCQlkcm1fbW1fdGFrZWRvd24oJmRldl9wcml2LT5tbS5zdG9sZW4pOwogCiAJCWludGVsX2NsZWFudXBfb3ZlcmxheShkZXYpOwogCkBAIC0yMTg4LDcgKzIxNDYsNyBAQAogCX0KIAogCWlmIChkZXZfcHJpdi0+cmVncyAhPSBOVUxMKQotCQlpb3VubWFwKGRldl9wcml2LT5yZWdzKTsKKwkJcGNpX2lvdW5tYXAoZGV2LT5wZGV2LCBkZXZfcHJpdi0+cmVncyk7CiAKIAlpbnRlbF90ZWFyZG93bl9nbWJ1cyhkZXYpOwogCWludGVsX3RlYXJkb3duX21jaGJhcihkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9kcnYuYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZHJ2LmMKaW5kZXggZjczNzk2MC4uODcyNDkzMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9kcnYuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2Rydi5jCkBAIC0xMTEsNyArMTExLDcgQEAKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBpbnRlbF9kZXZpY2VfaW5mbyBpbnRlbF9pOTY1Z21faW5mbyA9IHsKIAkuZ2VuID0gNCwgLmlzX2NyZXN0bGluZSA9IDEsCi0JLmlzX21vYmlsZSA9IDEsIC5oYXNfZmJjID0gMSwgLmhhc19yYzYgPSAxLCAuaGFzX2hvdHBsdWcgPSAxLAorCS5pc19tb2JpbGUgPSAxLCAuaGFzX2ZiYyA9IDEsIC5oYXNfaG90cGx1ZyA9IDEsCiAJLmhhc19vdmVybGF5ID0gMSwKIAkuc3VwcG9ydHNfdHYgPSAxLAogfTsKQEAgLTEzMCw3ICsxMzAsNyBAQAogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGludGVsX2RldmljZV9pbmZvIGludGVsX2dtNDVfaW5mbyA9IHsKIAkuZ2VuID0gNCwgLmlzX2c0eCA9IDEsCi0JLmlzX21vYmlsZSA9IDEsIC5uZWVkX2dmeF9od3MgPSAxLCAuaGFzX2ZiYyA9IDEsIC5oYXNfcmM2ID0gMSwKKwkuaXNfbW9iaWxlID0gMSwgLm5lZWRfZ2Z4X2h3cyA9IDEsIC5oYXNfZmJjID0gMSwKIAkuaGFzX3BpcGVfY3hzciA9IDEsIC5oYXNfaG90cGx1ZyA9IDEsCiAJLnN1cHBvcnRzX3R2ID0gMSwKIAkuaGFzX2JzZF9yaW5nID0gMSwKQEAgLTE1MCw3ICsxNTAsNyBAQAogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGludGVsX2RldmljZV9pbmZvIGludGVsX2lyb25sYWtlX21faW5mbyA9IHsKIAkuZ2VuID0gNSwgLmlzX21vYmlsZSA9IDEsCi0JLm5lZWRfZ2Z4X2h3cyA9IDEsIC5oYXNfcmM2ID0gMSwgLmhhc19ob3RwbHVnID0gMSwKKwkubmVlZF9nZnhfaHdzID0gMSwgLmhhc19ob3RwbHVnID0gMSwKIAkuaGFzX2ZiYyA9IDAsIC8qIGRpc2FibGVkIGR1ZSB0byBidWdneSBoYXJkd2FyZSAqLwogCS5oYXNfYnNkX3JpbmcgPSAxLAogfTsKQEAgLTE2NSw2ICsxNjUsNyBAQAogc3RhdGljIGNvbnN0IHN0cnVjdCBpbnRlbF9kZXZpY2VfaW5mbyBpbnRlbF9zYW5keWJyaWRnZV9tX2luZm8gPSB7CiAJLmdlbiA9IDYsIC5pc19tb2JpbGUgPSAxLAogCS5uZWVkX2dmeF9od3MgPSAxLCAuaGFzX2hvdHBsdWcgPSAxLAorCS5oYXNfZmJjID0gMSwKIAkuaGFzX2JzZF9yaW5nID0gMSwKIAkuaGFzX2JsdF9yaW5nID0gMSwKIH07CkBAIC0yNDQsMTAgKzI0NSwzNCBAQAogCX0KIH0KIAordm9pZCBfX2dlbjZfZm9yY2Vfd2FrZV9nZXQoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2KQoreworCWludCBjb3VudDsKKworCWNvdW50ID0gMDsKKwl3aGlsZSAoY291bnQrKyA8IDUwICYmIChJOTE1X1JFQURfTk9UUkFDRShGT1JDRVdBS0VfQUNLKSAmIDEpKQorCQl1ZGVsYXkoMTApOworCisJSTkxNV9XUklURV9OT1RSQUNFKEZPUkNFV0FLRSwgMSk7CisJUE9TVElOR19SRUFEKEZPUkNFV0FLRSk7CisKKwljb3VudCA9IDA7CisJd2hpbGUgKGNvdW50KysgPCA1MCAmJiAoSTkxNV9SRUFEX05PVFJBQ0UoRk9SQ0VXQUtFX0FDSykgJiAxKSA9PSAwKQorCQl1ZGVsYXkoMTApOworfQorCit2b2lkIF9fZ2VuNl9mb3JjZV93YWtlX3B1dChzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYpCit7CisJSTkxNV9XUklURV9OT1RSQUNFKEZPUkNFV0FLRSwgMCk7CisJUE9TVElOR19SRUFEKEZPUkNFV0FLRSk7Cit9CisKIHN0YXRpYyBpbnQgaTkxNV9kcm1fZnJlZXplKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAorCWRybV9rbXNfaGVscGVyX3BvbGxfZGlzYWJsZShkZXYpOworCiAJcGNpX3NhdmVfc3RhdGUoZGV2LT5wZGV2KTsKIAogCS8qIElmIEtNUyBpcyBhY3RpdmUsIHdlIGRvIHRoZSBsZWF2ZXZ0IHN0dWZmIGhlcmUgKi8KQEAgLTI4NCw3ICszMDksOSBAQAogCWlmIChzdGF0ZS5ldmVudCA9PSBQTV9FVkVOVF9QUkVUSEFXKQogCQlyZXR1cm4gMDsKIAotCWRybV9rbXNfaGVscGVyX3BvbGxfZGlzYWJsZShkZXYpOworCisJaWYgKGRldi0+c3dpdGNoX3Bvd2VyX3N0YXRlID09IERSTV9TV0lUQ0hfUE9XRVJfT0ZGKQorCQlyZXR1cm4gMDsKIAogCWVycm9yID0gaTkxNV9kcm1fZnJlZXplKGRldik7CiAJaWYgKGVycm9yKQpAQCAtMzA0LDYgKzMzMSwxMiBAQAogCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJaW50IGVycm9yID0gMDsKIAorCWlmIChkcm1fY29yZV9jaGVja19mZWF0dXJlKGRldiwgRFJJVkVSX01PREVTRVQpKSB7CisJCW11dGV4X2xvY2soJmRldi0+c3RydWN0X211dGV4KTsKKwkJaTkxNV9nZW1fcmVzdG9yZV9ndHRfbWFwcGluZ3MoZGV2KTsKKwkJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CisJfQorCiAJaTkxNV9yZXN0b3JlX3N0YXRlKGRldik7CiAJaW50ZWxfb3ByZWdpb25fc2V0dXAoZGV2KTsKIApAQCAtMzMyLDYgKzM2NSw5IEBACiB7CiAJaW50IHJldDsKIAorCWlmIChkZXYtPnN3aXRjaF9wb3dlcl9zdGF0ZSA9PSBEUk1fU1dJVENIX1BPV0VSX09GRikKKwkJcmV0dXJuIDA7CisKIAlpZiAocGNpX2VuYWJsZV9kZXZpY2UoZGV2LT5wZGV2KSkKIAkJcmV0dXJuIC1FSU87CiAKQEAgLTQwNSw2ICs0NDEsMTQgQEAKIAlyZXR1cm4gd2FpdF9mb3IoSTkxNV9SRUFEKE1DSEJBUl9NSVJST1JfQkFTRSArIElMS19HRFNSKSAmIDB4MSwgNTAwKTsKIH0KIAorc3RhdGljIGludCBnZW42X2RvX3Jlc2V0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHU4IGZsYWdzKQoreworCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisKKwlJOTE1X1dSSVRFKEdFTjZfR0RSU1QsIEdFTjZfR1JET01fRlVMTCk7CisJcmV0dXJuIHdhaXRfZm9yKChJOTE1X1JFQUQoR0VONl9HRFJTVCkgJiBHRU42X0dSRE9NX0ZVTEwpID09IDAsIDUwMCk7Cit9CisKIC8qKgogICogaTk2NV9yZXNldCAtIHJlc2V0IGNoaXAgYWZ0ZXIgYSBoYW5nCiAgKiBAZGV2OiBkcm0gZGV2aWNlIHRvIHJlc2V0CkBAIC00MzEsNyArNDc1LDggQEAKIAlib29sIG5lZWRfZGlzcGxheSA9IHRydWU7CiAJaW50IHJldDsKIAotCW11dGV4X2xvY2soJmRldi0+c3RydWN0X211dGV4KTsKKwlpZiAoIW11dGV4X3RyeWxvY2soJmRldi0+c3RydWN0X211dGV4KSkKKwkJcmV0dXJuIC1FQlVTWTsKIAogCWk5MTVfZ2VtX3Jlc2V0KGRldik7CiAKQEAgLTQzOSw2ICs0ODQsOSBAQAogCWlmIChnZXRfc2Vjb25kcygpIC0gZGV2X3ByaXYtPmxhc3RfZ3B1X3Jlc2V0IDwgNSkgewogCQlEUk1fRVJST1IoIkdQVSBoYW5naW5nIHRvbyBmYXN0LCBkZWNsYXJpbmcgd2VkZ2VkIVxuIik7CiAJfSBlbHNlIHN3aXRjaCAoSU5URUxfSU5GTyhkZXYpLT5nZW4pIHsKKwljYXNlIDY6CisJCXJldCA9IGdlbjZfZG9fcmVzZXQoZGV2LCBmbGFncyk7CisJCWJyZWFrOwogCWNhc2UgNToKIAkJcmV0ID0gaXJvbmxha2VfZG9fcmVzZXQoZGV2LCBmbGFncyk7CiAJCWJyZWFrOwpAQCAtNDcyLDkgKzUyMCwxNCBAQAogCSAqLwogCWlmIChkcm1fY29yZV9jaGVja19mZWF0dXJlKGRldiwgRFJJVkVSX01PREVTRVQpIHx8CiAJCQkhZGV2X3ByaXYtPm1tLnN1c3BlbmRlZCkgewotCQlzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcgPSAmZGV2X3ByaXYtPnJlbmRlcl9yaW5nOwogCQlkZXZfcHJpdi0+bW0uc3VzcGVuZGVkID0gMDsKLQkJcmluZy0+aW5pdChkZXYsIHJpbmcpOworCisJCWRldl9wcml2LT5yaW5nW1JDU10uaW5pdCgmZGV2X3ByaXYtPnJpbmdbUkNTXSk7CisJCWlmIChIQVNfQlNEKGRldikpCisJCSAgICBkZXZfcHJpdi0+cmluZ1tWQ1NdLmluaXQoJmRldl9wcml2LT5yaW5nW1ZDU10pOworCQlpZiAoSEFTX0JMVChkZXYpKQorCQkgICAgZGV2X3ByaXYtPnJpbmdbQkNTXS5pbml0KCZkZXZfcHJpdi0+cmluZ1tCQ1NdKTsKKwogCQltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKIAkJZHJtX2lycV91bmluc3RhbGwoZGV2KTsKIAkJZHJtX2lycV9pbnN0YWxsKGRldik7CkBAIC01MjMsNiArNTc2LDkgQEAKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCisJaWYgKGRybV9kZXYtPnN3aXRjaF9wb3dlcl9zdGF0ZSA9PSBEUk1fU1dJVENIX1BPV0VSX09GRikKKwkJcmV0dXJuIDA7CisKIAllcnJvciA9IGk5MTVfZHJtX2ZyZWV6ZShkcm1fZGV2KTsKIAlpZiAoZXJyb3IpCiAJCXJldHVybiBlcnJvcjsKQEAgLTYwNiw2ICs2NjIsOCBAQAogCS5kZXZpY2VfaXNfYWdwID0gaTkxNV9kcml2ZXJfZGV2aWNlX2lzX2FncCwKIAkuZW5hYmxlX3ZibGFuayA9IGk5MTVfZW5hYmxlX3ZibGFuaywKIAkuZGlzYWJsZV92YmxhbmsgPSBpOTE1X2Rpc2FibGVfdmJsYW5rLAorCS5nZXRfdmJsYW5rX3RpbWVzdGFtcCA9IGk5MTVfZ2V0X3ZibGFua190aW1lc3RhbXAsCisJLmdldF9zY2Fub3V0X3Bvc2l0aW9uID0gaTkxNV9nZXRfY3J0Y19zY2Fub3V0cG9zLAogCS5pcnFfcHJlaW5zdGFsbCA9IGk5MTVfZHJpdmVyX2lycV9wcmVpbnN0YWxsLAogCS5pcnFfcG9zdGluc3RhbGwgPSBpOTE1X2RyaXZlcl9pcnFfcG9zdGluc3RhbGwsCiAJLmlycV91bmluc3RhbGwgPSBpOTE1X2RyaXZlcl9pcnFfdW5pbnN0YWxsLApAQCAtNjYxLDggKzcxOSw2IEBACiAKIAlkcml2ZXIubnVtX2lvY3RscyA9IGk5MTVfbWF4X2lvY3RsOwogCi0JaTkxNV9nZW1fc2hyaW5rZXJfaW5pdCgpOwotCiAJLyoKIAkgKiBJZiBDT05GSUdfRFJNX0k5MTVfS01TIGlzIHNldCwgZGVmYXVsdCB0byBLTVMgdW5sZXNzCiAJICogZXhwbGljaXRseSBkaXNhYmxlZCB3aXRoIHRoZSBtb2R1bGUgcGFyYXJtZXRlci4KQEAgLTY4NCwxNyArNzQwLDExIEBACiAJCWRyaXZlci5kcml2ZXJfZmVhdHVyZXMgJj0gfkRSSVZFUl9NT0RFU0VUOwogI2VuZGlmCiAKLQlpZiAoIShkcml2ZXIuZHJpdmVyX2ZlYXR1cmVzICYgRFJJVkVSX01PREVTRVQpKSB7Ci0JCWRyaXZlci5zdXNwZW5kID0gaTkxNV9zdXNwZW5kOwotCQlkcml2ZXIucmVzdW1lID0gaTkxNV9yZXN1bWU7Ci0JfQotCiAJcmV0dXJuIGRybV9pbml0KCZkcml2ZXIpOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgaTkxNV9leGl0KHZvaWQpCiB7Ci0JaTkxNV9nZW1fc2hyaW5rZXJfZXhpdCgpOwogCWRybV9leGl0KCZkcml2ZXIpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2Rydi5oIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9kcnYuaAppbmRleCA0MDk4MjZkLi5hYWMxYmYzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2Rydi5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZHJ2LmgKQEAgLTg5LDcgKzg5LDcgQEAKIAlpbnQgaWQ7CiAJc3RydWN0IHBhZ2UgKipwYWdlX2xpc3Q7CiAJZHJtX2RtYV9oYW5kbGVfdCAqaGFuZGxlOwotCXN0cnVjdCBkcm1fZ2VtX29iamVjdCAqY3VyX29iajsKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqY3VyX29iajsKIH07CiAKIHN0cnVjdCBtZW1fYmxvY2sgewpAQCAtMTI0LDkgKzEyNCw5IEBACiAjZGVmaW5lIEk5MTVfRkVOQ0VfUkVHX05PTkUgLTEKIAogc3RydWN0IGRybV9pOTE1X2ZlbmNlX3JlZyB7Ci0Jc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmo7CiAJc3RydWN0IGxpc3RfaGVhZCBscnVfbGlzdDsKLQlib29sIGdwdTsKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqOworCXVpbnQzMl90IHNldHVwX3NlcW5vOwogfTsKIAogc3RydWN0IHNkdm9fZGV2aWNlX21hcHBpbmcgewpAQCAtMTM5LDYgKzEzOSw4IEBACiAJdTggZGRjX3BpbjsKIH07CiAKK3N0cnVjdCBpbnRlbF9kaXNwbGF5X2Vycm9yX3N0YXRlOworCiBzdHJ1Y3QgZHJtX2k5MTVfZXJyb3Jfc3RhdGUgewogCXUzMiBlaXI7CiAJdTMyIHBndGJsX2VyOwpAQCAtMTQ4LDExICsxNTAsMjMgQEAKIAl1MzIgaXBlaHI7CiAJdTMyIGluc3Rkb25lOwogCXUzMiBhY3RoZDsKKwl1MzIgZXJyb3I7IC8qIGdlbjYrICovCisJdTMyIGJjc19hY3RoZDsgLyogZ2VuNisgYmx0IGVuZ2luZSAqLworCXUzMiBiY3NfaXBlaHI7CisJdTMyIGJjc19pcGVpcjsKKwl1MzIgYmNzX2luc3Rkb25lOworCXUzMiBiY3Nfc2Vxbm87CisJdTMyIHZjc19hY3RoZDsgLyogZ2VuNisgYnNkIGVuZ2luZSAqLworCXUzMiB2Y3NfaXBlaHI7CisJdTMyIHZjc19pcGVpcjsKKwl1MzIgdmNzX2luc3Rkb25lOworCXUzMiB2Y3Nfc2Vxbm87CiAJdTMyIGluc3RwbTsKIAl1MzIgaW5zdHBzOwogCXUzMiBpbnN0ZG9uZTE7CiAJdTMyIHNlcW5vOwogCXU2NCBiYmFkZHI7CisJdTY0IGZlbmNlWzE2XTsKIAlzdHJ1Y3QgdGltZXZhbCB0aW1lOwogCXN0cnVjdCBkcm1faTkxNV9lcnJvcl9vYmplY3QgewogCQlpbnQgcGFnZV9jb3VudDsKQEAgLTE3MSw5ICsxODUsMTEgQEAKIAkJdTMyIHRpbGluZzoyOwogCQl1MzIgZGlydHk6MTsKIAkJdTMyIHB1cmdlYWJsZToxOwotCX0gKmFjdGl2ZV9ibzsKLQl1MzIgYWN0aXZlX2JvX2NvdW50OworCQl1MzIgcmluZzo0OworCX0gKmFjdGl2ZV9ibywgKnBpbm5lZF9ibzsKKwl1MzIgYWN0aXZlX2JvX2NvdW50LCBwaW5uZWRfYm9fY291bnQ7CiAJc3RydWN0IGludGVsX292ZXJsYXlfZXJyb3Jfc3RhdGUgKm92ZXJsYXk7CisJc3RydWN0IGludGVsX2Rpc3BsYXlfZXJyb3Jfc3RhdGUgKmRpc3BsYXk7CiB9OwogCiBzdHJ1Y3QgZHJtX2k5MTVfZGlzcGxheV9mdW5jcyB7CkBAIC0yMDcsNyArMjIzLDYgQEAKIAl1OCBpc19icm9hZHdhdGVyIDogMTsKIAl1OCBpc19jcmVzdGxpbmUgOiAxOwogCXU4IGhhc19mYmMgOiAxOwotCXU4IGhhc19yYzYgOiAxOwogCXU4IGhhc19waXBlX2N4c3IgOiAxOwogCXU4IGhhc19ob3RwbHVnIDogMTsKIAl1OCBjdXJzb3JfbmVlZHNfcGh5c2ljYWwgOiAxOwpAQCAtMjQzLDYgKzI1OCw3IEBACiAJY29uc3Qgc3RydWN0IGludGVsX2RldmljZV9pbmZvICppbmZvOwogCiAJaW50IGhhc19nZW07CisJaW50IHJlbGF0aXZlX2NvbnN0YW50c19tb2RlOwogCiAJdm9pZCBfX2lvbWVtICpyZWdzOwogCkBAIC0yNTMsMjAgKzI2OSwxNSBAQAogCX0gKmdtYnVzOwogCiAJc3RydWN0IHBjaV9kZXYgKmJyaWRnZV9kZXY7Ci0Jc3RydWN0IGludGVsX3JpbmdfYnVmZmVyIHJlbmRlcl9yaW5nOwotCXN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciBic2RfcmluZzsKLQlzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgYmx0X3Jpbmc7CisJc3RydWN0IGludGVsX3JpbmdfYnVmZmVyIHJpbmdbSTkxNV9OVU1fUklOR1NdOwogCXVpbnQzMl90IG5leHRfc2Vxbm87CiAKIAlkcm1fZG1hX2hhbmRsZV90ICpzdGF0dXNfcGFnZV9kbWFoOwotCXZvaWQgKnNlcW5vX3BhZ2U7CiAJZG1hX2FkZHJfdCBkbWFfc3RhdHVzX3BhZ2U7CiAJdWludDMyX3QgY291bnRlcjsKLQl1bnNpZ25lZCBpbnQgc2Vxbm9fZ2Z4X2FkZHI7CiAJZHJtX2xvY2FsX21hcF90IGh3c19tYXA7Ci0Jc3RydWN0IGRybV9nZW1fb2JqZWN0ICpzZXFub19vYmo7Ci0Jc3RydWN0IGRybV9nZW1fb2JqZWN0ICpwd3JjdHg7Ci0Jc3RydWN0IGRybV9nZW1fb2JqZWN0ICpyZW5kZXJjdHg7CisJc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKnB3cmN0eDsKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqcmVuZGVyY3R4OwogCiAJc3RydWN0IHJlc291cmNlIG1jaF9yZXM7CiAKQEAgLTI3NSwyNSArMjg2LDE3IEBACiAJaW50IGZyb250X29mZnNldDsKIAlpbnQgY3VycmVudF9wYWdlOwogCWludCBwYWdlX2ZsaXBwaW5nOwotI2RlZmluZSBJOTE1X0RFQlVHX1JFQUQgKDE8PDApCi0jZGVmaW5lIEk5MTVfREVCVUdfV1JJVEUgKDE8PDEpCi0JdW5zaWduZWQgbG9uZyBkZWJ1Z19mbGFnczsKIAotCXdhaXRfcXVldWVfaGVhZF90IGlycV9xdWV1ZTsKIAlhdG9taWNfdCBpcnFfcmVjZWl2ZWQ7Ci0JLyoqIFByb3RlY3RzIHVzZXJfaXJxX3JlZmNvdW50IGFuZCBpcnFfbWFza19yZWcgKi8KLQlzcGlubG9ja190IHVzZXJfaXJxX2xvY2s7CiAJdTMyIHRyYWNlX2lycV9zZXFubzsKKworCS8qIHByb3RlY3RzIHRoZSBpcnEgbWFza3MgKi8KKwlzcGlubG9ja190IGlycV9sb2NrOwogCS8qKiBDYWNoZWQgdmFsdWUgb2YgSU1SIHRvIGF2b2lkIHJlYWRzIGluIHVwZGF0aW5nIHRoZSBiaXRmaWVsZCAqLwotCXUzMiBpcnFfbWFza19yZWc7CiAJdTMyIHBpcGVzdGF0WzJdOwotCS8qKiBzcGxpdHRlZCBpcnEgcmVncyBmb3IgZ3JhcGhpY3MgYW5kIGRpc3BsYXkgZW5naW5lIG9uIElyb25sYWtlLAotCSAgICBpcnFfbWFza19yZWcgaXMgc3RpbGwgdXNlZCBmb3IgZGlzcGxheSBpcnEuICovCi0JdTMyIGd0X2lycV9tYXNrX3JlZzsKLQl1MzIgZ3RfaXJxX2VuYWJsZV9yZWc7Ci0JdTMyIGRlX2lycV9lbmFibGVfcmVnOwotCXUzMiBwY2hfaXJxX21hc2tfcmVnOwotCXUzMiBwY2hfaXJxX2VuYWJsZV9yZWc7CisJdTMyIGlycV9tYXNrOworCXUzMiBndF9pcnFfbWFzazsKKwl1MzIgcGNoX2lycV9tYXNrOwogCiAJdTMyIGhvdHBsdWdfc3VwcG9ydGVkX21hc2s7CiAJc3RydWN0IHdvcmtfc3RydWN0IGhvdHBsdWdfd29yazsKQEAgLTMwNiw3ICszMDksNyBAQAogCWludCBudW1fcGlwZTsKIAogCS8qIEZvciBoYW5nY2hlY2sgdGltZXIgKi8KLSNkZWZpbmUgRFJNX0k5MTVfSEFOR0NIRUNLX1BFUklPRCAyNTAgLyogaW4gbXMgKi8KKyNkZWZpbmUgRFJNX0k5MTVfSEFOR0NIRUNLX1BFUklPRCAxNTAwIC8qIGluIG1zICovCiAJc3RydWN0IHRpbWVyX2xpc3QgaGFuZ2NoZWNrX3RpbWVyOwogCWludCBoYW5nY2hlY2tfY291bnQ7CiAJdWludDMyX3QgbGFzdF9hY3RoZDsKQEAgLTUzMCwyMyArNTMzLDIxIEBACiAKIAlzdHJ1Y3QgewogCQkvKiogQnJpZGdlIHRvIGludGVsLWd0dC1rbyAqLwotCQlzdHJ1Y3QgaW50ZWxfZ3R0ICpndHQ7CisJCWNvbnN0IHN0cnVjdCBpbnRlbF9ndHQgKmd0dDsKIAkJLyoqIE1lbW9yeSBhbGxvY2F0b3IgZm9yIEdUVCBzdG9sZW4gbWVtb3J5ICovCi0JCXN0cnVjdCBkcm1fbW0gdnJhbTsKKwkJc3RydWN0IGRybV9tbSBzdG9sZW47CiAJCS8qKiBNZW1vcnkgYWxsb2NhdG9yIGZvciBHVFQgKi8KIAkJc3RydWN0IGRybV9tbSBndHRfc3BhY2U7CisJCS8qKiBMaXN0IG9mIGFsbCBvYmplY3RzIGluIGd0dF9zcGFjZS4gVXNlZCB0byByZXN0b3JlIGd0dAorCQkgKiBtYXBwaW5ncyBvbiByZXN1bWUgKi8KKwkJc3RydWN0IGxpc3RfaGVhZCBndHRfbGlzdDsKKwkJLyoqIEVuZCBvZiBtYXBwYWJsZSBwYXJ0IG9mIEdUVCAqLworCQl1bnNpZ25lZCBsb25nIGd0dF9tYXBwYWJsZV9lbmQ7CiAKIAkJc3RydWN0IGlvX21hcHBpbmcgKmd0dF9tYXBwaW5nOwogCQlpbnQgZ3R0X210cnI7CiAKLQkJLyoqCi0JCSAqIE1lbWJlcnNoaXAgb24gbGlzdCBvZiBhbGwgbG9hZGVkIGRldmljZXMsIHVzZWQgdG8gZXZpY3QKLQkJICogaW5hY3RpdmUgYnVmZmVycyB1bmRlciBtZW1vcnkgcHJlc3N1cmUuCi0JCSAqCi0JCSAqIE1vZGlmaWNhdGlvbnMgc2hvdWxkIG9ubHkgYmUgZG9uZSB3aGlsc3QgaG9sZGluZyB0aGUKLQkJICogc2hyaW5rX2xpc3RfbG9jayBzcGlubG9jay4KLQkJICovCi0JCXN0cnVjdCBsaXN0X2hlYWQgc2hyaW5rX2xpc3Q7CisJCXN0cnVjdCBzaHJpbmtlciBpbmFjdGl2ZV9zaHJpbmtlcjsKIAogCQkvKioKIAkJICogTGlzdCBvZiBvYmplY3RzIGN1cnJlbnRseSBpbnZvbHZlZCBpbiByZW5kZXJpbmcuCkBAIC02MDksMTYgKzYxMCw2IEBACiAJCXN0cnVjdCBkZWxheWVkX3dvcmsgcmV0aXJlX3dvcms7CiAKIAkJLyoqCi0JCSAqIFdhaXRpbmcgc2VxdWVuY2UgbnVtYmVyLCBpZiBhbnkKLQkJICovCi0JCXVpbnQzMl90IHdhaXRpbmdfZ2VtX3NlcW5vOwotCi0JCS8qKgotCQkgKiBMYXN0IHNlcSBzZWVuIGF0IGlycSB0aW1lCi0JCSAqLwotCQl1aW50MzJfdCBpcnFfZ2VtX3NlcW5vOwotCi0JCS8qKgogCQkgKiBGbGFnIGlmIHRoZSBYIFNlcnZlciwgYW5kIHRodXMgRFJNLCBpcyBub3QgY3VycmVudGx5IGluCiAJCSAqIGNvbnRyb2wgb2YgdGhlIGRldmljZS4KIAkJICoKQEAgLTY0NSwxNiArNjM2LDExIEBACiAJCS8qIHN0b3JhZ2UgZm9yIHBoeXNpY2FsIG9iamVjdHMgKi8KIAkJc3RydWN0IGRybV9pOTE1X2dlbV9waHlzX29iamVjdCAqcGh5c19vYmpzW0k5MTVfTUFYX1BIWVNfT0JKRUNUXTsKIAotCQl1aW50MzJfdCBmbHVzaF9yaW5nczsKLQogCQkvKiBhY2NvdW50aW5nLCB1c2VmdWwgZm9yIHVzZXJsYW5kIGRlYnVnZ2luZyAqLwotCQlzaXplX3Qgb2JqZWN0X21lbW9yeTsKLQkJc2l6ZV90IHBpbl9tZW1vcnk7Ci0JCXNpemVfdCBndHRfbWVtb3J5OwogCQlzaXplX3QgZ3R0X3RvdGFsOworCQlzaXplX3QgbWFwcGFibGVfZ3R0X3RvdGFsOworCQlzaXplX3Qgb2JqZWN0X21lbW9yeTsKIAkJdTMyIG9iamVjdF9jb3VudDsKLQkJdTMyIHBpbl9jb3VudDsKLQkJdTMyIGd0dF9jb3VudDsKIAl9IG1tOwogCXN0cnVjdCBzZHZvX2RldmljZV9tYXBwaW5nIHNkdm9fbWFwcGluZ3NbMl07CiAJLyogaW5kaWNhdGUgd2hldGhlciB0aGUgTFZEU19CT1JERVIgc2hvdWxkIGJlIGVuYWJsZWQgb3Igbm90ICovCkBAIC02ODgsMTQgKzY3NCwxNCBAQAogCXU4IGZtYXg7CiAJdTggZnN0YXJ0OwogCi0gCXU2NCBsYXN0X2NvdW50MTsKLSAJdW5zaWduZWQgbG9uZyBsYXN0X3RpbWUxOwotIAl1NjQgbGFzdF9jb3VudDI7Ci0gCXN0cnVjdCB0aW1lc3BlYyBsYXN0X3RpbWUyOwotIAl1bnNpZ25lZCBsb25nIGdmeF9wb3dlcjsKLSAJaW50IGNfbTsKLSAJaW50IHJfdDsKLSAJdTggY29ycjsKKwl1NjQgbGFzdF9jb3VudDE7CisJdW5zaWduZWQgbG9uZyBsYXN0X3RpbWUxOworCXU2NCBsYXN0X2NvdW50MjsKKwlzdHJ1Y3QgdGltZXNwZWMgbGFzdF90aW1lMjsKKwl1bnNpZ25lZCBsb25nIGdmeF9wb3dlcjsKKwlpbnQgY19tOworCWludCByX3Q7CisJdTggY29ycjsKIAlzcGlubG9ja190ICptY2hkZXZfbG9jazsKIAogCWVudW0gbm9fZmJjX3JlYXNvbiBub19mYmNfcmVhc29uOwpAQCAtNzA5LDIwICs2OTUsMjAgQEAKIAlzdHJ1Y3QgaW50ZWxfZmJkZXYgKmZiZGV2OwogfSBkcm1faTkxNV9wcml2YXRlX3Q7CiAKLS8qKiBkcml2ZXIgcHJpdmF0ZSBzdHJ1Y3R1cmUgYXR0YWNoZWQgdG8gZWFjaCBkcm1fZ2VtX29iamVjdCAqLwogc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgewogCXN0cnVjdCBkcm1fZ2VtX29iamVjdCBiYXNlOwogCiAJLyoqIEN1cnJlbnQgc3BhY2UgYWxsb2NhdGVkIHRvIHRoaXMgb2JqZWN0IGluIHRoZSBHVFQsIGlmIGFueS4gKi8KIAlzdHJ1Y3QgZHJtX21tX25vZGUgKmd0dF9zcGFjZTsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGd0dF9saXN0OwogCiAJLyoqIFRoaXMgb2JqZWN0J3MgcGxhY2Ugb24gdGhlIGFjdGl2ZS9mbHVzaGluZy9pbmFjdGl2ZSBsaXN0cyAqLwogCXN0cnVjdCBsaXN0X2hlYWQgcmluZ19saXN0OwogCXN0cnVjdCBsaXN0X2hlYWQgbW1fbGlzdDsKIAkvKiogVGhpcyBvYmplY3QncyBwbGFjZSBvbiBHUFUgd3JpdGUgbGlzdCAqLwogCXN0cnVjdCBsaXN0X2hlYWQgZ3B1X3dyaXRlX2xpc3Q7Ci0JLyoqIFRoaXMgb2JqZWN0J3MgcGxhY2Ugb24gZXZpY3Rpb24gbGlzdCAqLwotCXN0cnVjdCBsaXN0X2hlYWQgZXZpY3RfbGlzdDsKKwkvKiogVGhpcyBvYmplY3QncyBwbGFjZSBpbiB0aGUgYmF0Y2hidWZmZXIgb3Igb24gdGhlIGV2aWN0aW9uIGxpc3QgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIGV4ZWNfbGlzdDsKIAogCS8qKgogCSAqIFRoaXMgaXMgc2V0IGlmIHRoZSBvYmplY3QgaXMgb24gdGhlIGFjdGl2ZSBvciBmbHVzaGluZyBsaXN0cwpAQCAtNzM4LDYgKzcyNCwxMiBAQAogCXVuc2lnbmVkIGludCBkaXJ0eSA6IDE7CiAKIAkvKioKKwkgKiBUaGlzIGlzIHNldCBpZiB0aGUgb2JqZWN0IGhhcyBiZWVuIHdyaXR0ZW4gdG8gc2luY2UgdGhlIGxhc3QKKwkgKiBHUFUgZmx1c2guCisJICovCisJdW5zaWduZWQgaW50IHBlbmRpbmdfZ3B1X3dyaXRlIDogMTsKKworCS8qKgogCSAqIEZlbmNlIHJlZ2lzdGVyIGJpdHMgKGlmIGFueSkgZm9yIHRoaXMgb2JqZWN0LiAgV2lsbCBiZSBzZXQKIAkgKiBhcyBuZWVkZWQgd2hlbiBtYXBwZWQgaW50byB0aGUgR1RULgogCSAqIFByb3RlY3RlZCBieSBkZXYtPnN0cnVjdF9tdXRleC4KQEAgLTc0NywyOSArNzM5LDE1IEBACiAJc2lnbmVkIGludCBmZW5jZV9yZWcgOiA1OwogCiAJLyoqCi0JICogVXNlZCBmb3IgY2hlY2tpbmcgdGhlIG9iamVjdCBkb2Vzbid0IGFwcGVhciBtb3JlIHRoYW4gb25jZQotCSAqIGluIGFuIGV4ZWNidWZmZXIgb2JqZWN0IGxpc3QuCi0JICovCi0JdW5zaWduZWQgaW50IGluX2V4ZWNidWZmZXIgOiAxOwotCi0JLyoqCiAJICogQWR2aWNlOiBhcmUgdGhlIGJhY2tpbmcgcGFnZXMgcHVyZ2VhYmxlPwogCSAqLwogCXVuc2lnbmVkIGludCBtYWR2IDogMjsKIAogCS8qKgotCSAqIFJlZmNvdW50IGZvciB0aGUgcGFnZXMgYXJyYXkuIFdpdGggdGhlIGN1cnJlbnQgbG9ja2luZyBzY2hlbWUsIHRoZXJlCi0JICogYXJlIGF0IG1vc3QgdHdvIGNvbmN1cnJlbnQgdXNlcnM6IEJpbmRpbmcgYSBibyB0byB0aGUgZ3R0IGFuZAotCSAqIHB3cml0ZS9wcmVhZCB1c2luZyBwaHlzaWNhbCBhZGRyZXNzZXMuIFNvIHR3byBiaXRzIGZvciBhIG1heGltdW0KLQkgKiBvZiB0d28gdXNlcnMgYXJlIGVub3VnaC4KLQkgKi8KLQl1bnNpZ25lZCBpbnQgcGFnZXNfcmVmY291bnQgOiAyOwotI2RlZmluZSBEUk1fSTkxNV9HRU1fT0JKRUNUX01BWF9QQUdFU19SRUZDT1VOVCAweDMKLQotCS8qKgogCSAqIEN1cnJlbnQgdGlsaW5nIG1vZGUgZm9yIHRoZSBvYmplY3QuCiAJICovCiAJdW5zaWduZWQgaW50IHRpbGluZ19tb2RlIDogMjsKKwl1bnNpZ25lZCBpbnQgdGlsaW5nX2NoYW5nZWQgOiAxOwogCiAJLyoqIEhvdyBtYW55IHVzZXJzIGhhdmUgcGlubmVkIHRoaXMgb2JqZWN0IGluIEdUVCBzcGFjZS4gVGhlIGZvbGxvd2luZwogCSAqIHVzZXJzIGNhbiBlYWNoIGhvbGQgYXQgbW9zdCBvbmUgcmVmZXJlbmNlOiBwd3JpdGUvcHJlYWQsIHBpbl9pb2N0bApAQCAtNzgzLDI4ICs3NjEsNTQgQEAKIAl1bnNpZ25lZCBpbnQgcGluX2NvdW50IDogNDsKICNkZWZpbmUgRFJNX0k5MTVfR0VNX09CSkVDVF9NQVhfUElOX0NPVU5UIDB4ZgogCi0JLyoqIEFHUCBtZW1vcnkgc3RydWN0dXJlIGZvciBvdXIgR1RUIGJpbmRpbmcuICovCi0JRFJNX0FHUF9NRU0gKmFncF9tZW07CisJLyoqCisJICogSXMgdGhlIG9iamVjdCBhdCB0aGUgY3VycmVudCBsb2NhdGlvbiBpbiB0aGUgZ3R0IG1hcHBhYmxlIGFuZAorCSAqIGZlbmNlYWJsZT8gVXNlZCB0byBhdm9pZCBjb3N0bHkgcmVjYWxjdWxhdGlvbnMuCisJICovCisJdW5zaWduZWQgaW50IG1hcF9hbmRfZmVuY2VhYmxlIDogMTsKKworCS8qKgorCSAqIFdoZXRoZXIgdGhlIGN1cnJlbnQgZ3R0IG1hcHBpbmcgbmVlZHMgdG8gYmUgbWFwcGFibGUgKGFuZCBpc24ndCBqdXN0CisJICogbWFwcGFibGUgYnkgYWNjaWRlbnQpLiBUcmFjayBwaW4gYW5kIGZhdWx0IHNlcGFyYXRlIGZvciBhIG1vcmUKKwkgKiBhY2N1cmF0ZSBtYXBwYWJsZSB3b3JraW5nIHNldC4KKwkgKi8KKwl1bnNpZ25lZCBpbnQgZmF1bHRfbWFwcGFibGUgOiAxOworCXVuc2lnbmVkIGludCBwaW5fbWFwcGFibGUgOiAxOworCisJLyoKKwkgKiBJcyB0aGUgR1BVIGN1cnJlbnRseSB1c2luZyBhIGZlbmNlIHRvIGFjY2VzcyB0aGlzIGJ1ZmZlciwKKwkgKi8KKwl1bnNpZ25lZCBpbnQgcGVuZGluZ19mZW5jZWRfZ3B1X2FjY2VzczoxOworCXVuc2lnbmVkIGludCBmZW5jZWRfZ3B1X2FjY2VzczoxOwogCiAJc3RydWN0IHBhZ2UgKipwYWdlczsKIAogCS8qKgorCSAqIERNQVIgc3VwcG9ydAorCSAqLworCXN0cnVjdCBzY2F0dGVybGlzdCAqc2dfbGlzdDsKKwlpbnQgbnVtX3NnOworCisJLyoqCisJICogVXNlZCBmb3IgcGVyZm9ybWluZyByZWxvY2F0aW9ucyBkdXJpbmcgZXhlY2J1ZmZlciBpbnNlcnRpb24uCisJICovCisJc3RydWN0IGhsaXN0X25vZGUgZXhlY19ub2RlOworCXVuc2lnbmVkIGxvbmcgZXhlY19oYW5kbGU7CisKKwkvKioKIAkgKiBDdXJyZW50IG9mZnNldCBvZiB0aGUgb2JqZWN0IGluIEdUVCBzcGFjZS4KIAkgKgogCSAqIFRoaXMgaXMgdGhlIHNhbWUgYXMgZ3R0X3NwYWNlLT5zdGFydAogCSAqLwogCXVpbnQzMl90IGd0dF9vZmZzZXQ7CiAKLQkvKiBXaGljaCByaW5nIGlzIHJlZmVyaW5nIHRvIGlzIHRoaXMgb2JqZWN0ICovCi0Jc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nOwotCi0JLyoqCi0JICogRmFrZSBvZmZzZXQgZm9yIHVzZSBieSBtbWFwKDIpCi0JICovCi0JdWludDY0X3QgbW1hcF9vZmZzZXQ7Ci0KIAkvKiogQnJlYWRjcnVtYiBvZiBsYXN0IHJlbmRlcmluZyB0byB0aGUgYnVmZmVyLiAqLwogCXVpbnQzMl90IGxhc3RfcmVuZGVyaW5nX3NlcW5vOworCXN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZzsKKworCS8qKiBCcmVhZGNydW1iIG9mIGxhc3QgZmVuY2VkIEdQVSBhY2Nlc3MgdG8gdGhlIGJ1ZmZlci4gKi8KKwl1aW50MzJfdCBsYXN0X2ZlbmNlZF9zZXFubzsKKwlzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKmxhc3RfZmVuY2VkX3Jpbmc7CiAKIAkvKiogQ3VycmVudCB0aWxpbmcgc3RyaWRlIGZvciB0aGUgb2JqZWN0LCBpZiBpdCdzIHRpbGVkLiAqLwogCXVpbnQzMl90IHN0cmlkZTsKQEAgLTg4MCw2ICs4ODQsNjggQEAKIAlDSElQX0k5NjUgPSAweDA4LAogfTsKIAorI2RlZmluZSBJTlRFTF9JTkZPKGRldikJKCgoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKikgKGRldiktPmRldl9wcml2YXRlKS0+aW5mbykKKworI2RlZmluZSBJU19JODMwKGRldikJCSgoZGV2KS0+cGNpX2RldmljZSA9PSAweDM1NzcpCisjZGVmaW5lIElTXzg0NUcoZGV2KQkJKChkZXYpLT5wY2lfZGV2aWNlID09IDB4MjU2MikKKyNkZWZpbmUgSVNfSTg1WChkZXYpCQkoSU5URUxfSU5GTyhkZXYpLT5pc19pODV4KQorI2RlZmluZSBJU19JODY1RyhkZXYpCQkoKGRldiktPnBjaV9kZXZpY2UgPT0gMHgyNTcyKQorI2RlZmluZSBJU19JOTE1RyhkZXYpCQkoSU5URUxfSU5GTyhkZXYpLT5pc19pOTE1ZykKKyNkZWZpbmUgSVNfSTkxNUdNKGRldikJCSgoZGV2KS0+cGNpX2RldmljZSA9PSAweDI1OTIpCisjZGVmaW5lIElTX0k5NDVHKGRldikJCSgoZGV2KS0+cGNpX2RldmljZSA9PSAweDI3NzIpCisjZGVmaW5lIElTX0k5NDVHTShkZXYpCQkoSU5URUxfSU5GTyhkZXYpLT5pc19pOTQ1Z20pCisjZGVmaW5lIElTX0JST0FEV0FURVIoZGV2KQkoSU5URUxfSU5GTyhkZXYpLT5pc19icm9hZHdhdGVyKQorI2RlZmluZSBJU19DUkVTVExJTkUoZGV2KQkoSU5URUxfSU5GTyhkZXYpLT5pc19jcmVzdGxpbmUpCisjZGVmaW5lIElTX0dNNDUoZGV2KQkJKChkZXYpLT5wY2lfZGV2aWNlID09IDB4MkE0MikKKyNkZWZpbmUgSVNfRzRYKGRldikJCShJTlRFTF9JTkZPKGRldiktPmlzX2c0eCkKKyNkZWZpbmUgSVNfUElORVZJRVdfRyhkZXYpCSgoZGV2KS0+cGNpX2RldmljZSA9PSAweGEwMDEpCisjZGVmaW5lIElTX1BJTkVWSUVXX00oZGV2KQkoKGRldiktPnBjaV9kZXZpY2UgPT0gMHhhMDExKQorI2RlZmluZSBJU19QSU5FVklFVyhkZXYpCShJTlRFTF9JTkZPKGRldiktPmlzX3BpbmV2aWV3KQorI2RlZmluZSBJU19HMzMoZGV2KQkJKElOVEVMX0lORk8oZGV2KS0+aXNfZzMzKQorI2RlZmluZSBJU19JUk9OTEFLRV9EKGRldikJKChkZXYpLT5wY2lfZGV2aWNlID09IDB4MDA0MikKKyNkZWZpbmUgSVNfSVJPTkxBS0VfTShkZXYpCSgoZGV2KS0+cGNpX2RldmljZSA9PSAweDAwNDYpCisjZGVmaW5lIElTX01PQklMRShkZXYpCQkoSU5URUxfSU5GTyhkZXYpLT5pc19tb2JpbGUpCisKKyNkZWZpbmUgSVNfR0VOMihkZXYpCShJTlRFTF9JTkZPKGRldiktPmdlbiA9PSAyKQorI2RlZmluZSBJU19HRU4zKGRldikJKElOVEVMX0lORk8oZGV2KS0+Z2VuID09IDMpCisjZGVmaW5lIElTX0dFTjQoZGV2KQkoSU5URUxfSU5GTyhkZXYpLT5nZW4gPT0gNCkKKyNkZWZpbmUgSVNfR0VONShkZXYpCShJTlRFTF9JTkZPKGRldiktPmdlbiA9PSA1KQorI2RlZmluZSBJU19HRU42KGRldikJKElOVEVMX0lORk8oZGV2KS0+Z2VuID09IDYpCisKKyNkZWZpbmUgSEFTX0JTRChkZXYpICAgICAgICAgICAgKElOVEVMX0lORk8oZGV2KS0+aGFzX2JzZF9yaW5nKQorI2RlZmluZSBIQVNfQkxUKGRldikgICAgICAgICAgICAoSU5URUxfSU5GTyhkZXYpLT5oYXNfYmx0X3JpbmcpCisjZGVmaW5lIEk5MTVfTkVFRF9HRlhfSFdTKGRldikJKElOVEVMX0lORk8oZGV2KS0+bmVlZF9nZnhfaHdzKQorCisjZGVmaW5lIEhBU19PVkVSTEFZKGRldikJCShJTlRFTF9JTkZPKGRldiktPmhhc19vdmVybGF5KQorI2RlZmluZSBPVkVSTEFZX05FRURTX1BIWVNJQ0FMKGRldikJKElOVEVMX0lORk8oZGV2KS0+b3ZlcmxheV9uZWVkc19waHlzaWNhbCkKKworLyogV2l0aCB0aGUgOTQ1IGFuZCBsYXRlciwgWSB0aWxpbmcgZ290IGFkanVzdGVkIHNvIHRoYXQgaXQgd2FzIDMyIDEyOC1ieXRlCisgKiByb3dzLCB3aGljaCBjaGFuZ2VkIHRoZSBhbGlnbm1lbnQgcmVxdWlyZW1lbnRzIGFuZCBmZW5jZSBwcm9ncmFtbWluZy4KKyAqLworI2RlZmluZSBIQVNfMTI4X0JZVEVfWV9USUxJTkcoZGV2KSAoIUlTX0dFTjIoZGV2KSAmJiAhKElTX0k5MTVHKGRldikgfHwgXAorCQkJCQkJICAgICAgSVNfSTkxNUdNKGRldikpKQorI2RlZmluZSBTVVBQT1JUU19ESUdJVEFMX09VVFBVVFMoZGV2KQkoIUlTX0dFTjIoZGV2KSAmJiAhSVNfUElORVZJRVcoZGV2KSkKKyNkZWZpbmUgU1VQUE9SVFNfSU5URUdSQVRFRF9IRE1JKGRldikJKElTX0c0WChkZXYpIHx8IElTX0dFTjUoZGV2KSkKKyNkZWZpbmUgU1VQUE9SVFNfSU5URUdSQVRFRF9EUChkZXYpCShJU19HNFgoZGV2KSB8fCBJU19HRU41KGRldikpCisjZGVmaW5lIFNVUFBPUlRTX0VEUChkZXYpCQkoSVNfSVJPTkxBS0VfTShkZXYpKQorI2RlZmluZSBTVVBQT1JUU19UVihkZXYpCQkoSU5URUxfSU5GTyhkZXYpLT5zdXBwb3J0c190dikKKyNkZWZpbmUgSTkxNV9IQVNfSE9UUExVRyhkZXYpCQkgKElOVEVMX0lORk8oZGV2KS0+aGFzX2hvdHBsdWcpCisvKiBkc3BhcmIgY29udHJvbGxlZCBieSBodyBvbmx5ICovCisjZGVmaW5lIERTUEFSQl9IV0NPTlRST0woZGV2KSAoSVNfRzRYKGRldikgfHwgSVNfSVJPTkxBS0UoZGV2KSkKKworI2RlZmluZSBIQVNfRldfQkxDKGRldikgKElOVEVMX0lORk8oZGV2KS0+Z2VuID4gMikKKyNkZWZpbmUgSEFTX1BJUEVfQ1hTUihkZXYpIChJTlRFTF9JTkZPKGRldiktPmhhc19waXBlX2N4c3IpCisjZGVmaW5lIEk5MTVfSEFTX0ZCQyhkZXYpIChJTlRFTF9JTkZPKGRldiktPmhhc19mYmMpCisKKyNkZWZpbmUgSEFTX1BDSF9TUExJVChkZXYpIChJU19HRU41KGRldikgfHwgSVNfR0VONihkZXYpKQorI2RlZmluZSBIQVNfUElQRV9DT05UUk9MKGRldikgKElTX0dFTjUoZGV2KSB8fCBJU19HRU42KGRldikpCisKKyNkZWZpbmUgSU5URUxfUENIX1RZUEUoZGV2KSAoKChzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqKShkZXYpLT5kZXZfcHJpdmF0ZSktPnBjaF90eXBlKQorI2RlZmluZSBIQVNfUENIX0NQVChkZXYpIChJTlRFTF9QQ0hfVFlQRShkZXYpID09IFBDSF9DUFQpCisjZGVmaW5lIEhBU19QQ0hfSUJYKGRldikgKElOVEVMX1BDSF9UWVBFKGRldikgPT0gUENIX0lCWCkKKworI2luY2x1ZGUgImk5MTVfdHJhY2UuaCIKKwogZXh0ZXJuIHN0cnVjdCBkcm1faW9jdGxfZGVzYyBpOTE1X2lvY3Rsc1tdOwogZXh0ZXJuIGludCBpOTE1X21heF9pb2N0bDsKIGV4dGVybiB1bnNpZ25lZCBpbnQgaTkxNV9mYnBlcmNydGM7CkBAIC05MDcsOCArOTczLDggQEAKIGV4dGVybiBsb25nIGk5MTVfY29tcGF0X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxwLCB1bnNpZ25lZCBpbnQgY21kLAogCQkJICAgICAgdW5zaWduZWQgbG9uZyBhcmcpOwogZXh0ZXJuIGludCBpOTE1X2VtaXRfYm94KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCi0JCQkgc3RydWN0IGRybV9jbGlwX3JlY3QgKmJveGVzLAotCQkJIGludCBpLCBpbnQgRFIxLCBpbnQgRFI0KTsKKwkJCSBzdHJ1Y3QgZHJtX2NsaXBfcmVjdCAqYm94LAorCQkJIGludCBEUjEsIGludCBEUjQpOwogZXh0ZXJuIGludCBpOTE1X3Jlc2V0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHU4IGZsYWdzKTsKIGV4dGVybiB1bnNpZ25lZCBsb25nIGk5MTVfY2hpcHNldF92YWwoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2KTsKIGV4dGVybiB1bnNpZ25lZCBsb25nIGk5MTVfbWNoX3ZhbChzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYpOwpAQCAtOTE4LDYgKzk4NCw3IEBACiAKIC8qIGk5MTVfaXJxLmMgKi8KIHZvaWQgaTkxNV9oYW5nY2hlY2tfZWxhcHNlZCh1bnNpZ25lZCBsb25nIGRhdGEpOwordm9pZCBpOTE1X2hhbmRsZV9lcnJvcihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBib29sIHdlZGdlZCk7CiBleHRlcm4gaW50IGk5MTVfaXJxX2VtaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdm9pZCAqZGF0YSwKIAkJCSBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdik7CiBleHRlcm4gaW50IGk5MTVfaXJxX3dhaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdm9pZCAqZGF0YSwKQEAgLTk1Myw2ICsxMDIwLDEzIEBACiBpOTE1X2Rpc2FibGVfcGlwZXN0YXQoZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiwgaW50IHBpcGUsIHUzMiBtYXNrKTsKIAogdm9pZCBpbnRlbF9lbmFibGVfYXNsZSAoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CitpbnQgaTkxNV9nZXRfdmJsYW5rX3RpbWVzdGFtcChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgY3J0YywKKwkJCSAgICAgIGludCAqbWF4X2Vycm9yLAorCQkJICAgICAgc3RydWN0IHRpbWV2YWwgKnZibGFua190aW1lLAorCQkJICAgICAgdW5zaWduZWQgZmxhZ3MpOworCitpbnQgaTkxNV9nZXRfY3J0Y19zY2Fub3V0cG9zKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBwaXBlLAorCQkJICAgICBpbnQgKnZwb3MsIGludCAqaHBvcyk7CiAKICNpZmRlZiBDT05GSUdfREVCVUdfRlMKIGV4dGVybiB2b2lkIGk5MTVfZGVzdHJveV9lcnJvcl9zdGF0ZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKQEAgLTEwMTcsMTUgKzEwOTEsMjggQEAKIAkJCQlzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdik7CiB2b2lkIGk5MTVfZ2VtX2xvYWQoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CiBpbnQgaTkxNV9nZW1faW5pdF9vYmplY3Qoc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmopOwotc3RydWN0IGRybV9nZW1fb2JqZWN0ICogaTkxNV9nZW1fYWxsb2Nfb2JqZWN0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCi0JCQkJCSAgICAgIHNpemVfdCBzaXplKTsKK3ZvaWQgaTkxNV9nZW1fZmx1c2hfcmluZyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAorCQkJIHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZywKKwkJCSB1aW50MzJfdCBpbnZhbGlkYXRlX2RvbWFpbnMsCisJCQkgdWludDMyX3QgZmx1c2hfZG9tYWlucyk7CitzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqaTkxNV9nZW1fYWxsb2Nfb2JqZWN0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCisJCQkJCQkgIHNpemVfdCBzaXplKTsKIHZvaWQgaTkxNV9nZW1fZnJlZV9vYmplY3Qoc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmopOwotaW50IGk5MTVfZ2VtX29iamVjdF9waW4oc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmosIHVpbnQzMl90IGFsaWdubWVudCk7Ci12b2lkIGk5MTVfZ2VtX29iamVjdF91bnBpbihzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iaik7Ci1pbnQgaTkxNV9nZW1fb2JqZWN0X3VuYmluZChzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iaik7Ci12b2lkIGk5MTVfZ2VtX3JlbGVhc2VfbW1hcChzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iaik7CitpbnQgX19tdXN0X2NoZWNrIGk5MTVfZ2VtX29iamVjdF9waW4oc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaiwKKwkJCQkgICAgIHVpbnQzMl90IGFsaWdubWVudCwKKwkJCQkgICAgIGJvb2wgbWFwX2FuZF9mZW5jZWFibGUpOwordm9pZCBpOTE1X2dlbV9vYmplY3RfdW5waW4oc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaik7CitpbnQgX19tdXN0X2NoZWNrIGk5MTVfZ2VtX29iamVjdF91bmJpbmQoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaik7Cit2b2lkIGk5MTVfZ2VtX3JlbGVhc2VfbW1hcChzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqKTsKIHZvaWQgaTkxNV9nZW1fbGFzdGNsb3NlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwogCitpbnQgX19tdXN0X2NoZWNrIGk5MTVfbXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOworaW50IF9fbXVzdF9jaGVjayBpOTE1X2dlbV9vYmplY3Rfd2FpdF9yZW5kZXJpbmcoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaiwKKwkJCQkJCWJvb2wgaW50ZXJydXB0aWJsZSk7Cit2b2lkIGk5MTVfZ2VtX29iamVjdF9tb3ZlX3RvX2FjdGl2ZShzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqLAorCQkJCSAgICBzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcsCisJCQkJICAgIHUzMiBzZXFubyk7CisKIC8qKgogICogUmV0dXJucyB0cnVlIGlmIHNlcTEgaXMgbGF0ZXIgdGhhbiBzZXEyLgogICovCkBAIC0xMDM1LDczICsxMTIyLDg4IEBACiAJcmV0dXJuIChpbnQzMl90KShzZXExIC0gc2VxMikgPj0gMDsKIH0KIAotaW50IGk5MTVfZ2VtX29iamVjdF9nZXRfZmVuY2VfcmVnKHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqLAotCQkJCSAgYm9vbCBpbnRlcnJ1cHRpYmxlKTsKLWludCBpOTE1X2dlbV9vYmplY3RfcHV0X2ZlbmNlX3JlZyhzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iaiwKLQkJCQkgIGJvb2wgaW50ZXJydXB0aWJsZSk7CitzdGF0aWMgaW5saW5lIHUzMgoraTkxNV9nZW1fbmV4dF9yZXF1ZXN0X3NlcW5vKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCisJCQkgICAgc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nKQoreworCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXJldHVybiByaW5nLT5vdXRzdGFuZGluZ19sYXp5X3JlcXVlc3QgPSBkZXZfcHJpdi0+bmV4dF9zZXFubzsKK30KKworaW50IF9fbXVzdF9jaGVjayBpOTE1X2dlbV9vYmplY3RfZ2V0X2ZlbmNlKHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmosCisJCQkJCSAgIHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcGlwZWxpbmVkLAorCQkJCQkgICBib29sIGludGVycnVwdGlibGUpOworaW50IF9fbXVzdF9jaGVjayBpOTE1X2dlbV9vYmplY3RfcHV0X2ZlbmNlKHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmopOworCiB2b2lkIGk5MTVfZ2VtX3JldGlyZV9yZXF1ZXN0cyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKIHZvaWQgaTkxNV9nZW1fcmVzZXQoc3RydWN0IGRybV9kZXZpY2UgKmRldik7Ci12b2lkIGk5MTVfZ2VtX2NsZmx1c2hfb2JqZWN0KHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqKTsKLWludCBpOTE1X2dlbV9vYmplY3Rfc2V0X2RvbWFpbihzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iaiwKLQkJCSAgICAgICB1aW50MzJfdCByZWFkX2RvbWFpbnMsCi0JCQkgICAgICAgdWludDMyX3Qgd3JpdGVfZG9tYWluKTsKLWludCBpOTE1X2dlbV9vYmplY3RfZmx1c2hfZ3B1KHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmosCi0JCQkgICAgICBib29sIGludGVycnVwdGlibGUpOwotaW50IGk5MTVfZ2VtX2luaXRfcmluZ2J1ZmZlcihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKK3ZvaWQgaTkxNV9nZW1fY2xmbHVzaF9vYmplY3Qoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaik7CitpbnQgX19tdXN0X2NoZWNrIGk5MTVfZ2VtX29iamVjdF9zZXRfZG9tYWluKHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmosCisJCQkJCSAgICB1aW50MzJfdCByZWFkX2RvbWFpbnMsCisJCQkJCSAgICB1aW50MzJfdCB3cml0ZV9kb21haW4pOworaW50IF9fbXVzdF9jaGVjayBpOTE1X2dlbV9vYmplY3RfZmx1c2hfZ3B1KHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmosCisJCQkJCSAgIGJvb2wgaW50ZXJydXB0aWJsZSk7CitpbnQgX19tdXN0X2NoZWNrIGk5MTVfZ2VtX2luaXRfcmluZ2J1ZmZlcihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKIHZvaWQgaTkxNV9nZW1fY2xlYW51cF9yaW5nYnVmZmVyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwotaW50IGk5MTVfZ2VtX2RvX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdW5zaWduZWQgbG9uZyBzdGFydCwKLQkJICAgICB1bnNpZ25lZCBsb25nIGVuZCk7Ci1pbnQgaTkxNV9ncHVfaWRsZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKLWludCBpOTE1X2dlbV9pZGxlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwotdWludDMyX3QgaTkxNV9hZGRfcmVxdWVzdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAotCQkJICBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdiwKLQkJCSAgc3RydWN0IGRybV9pOTE1X2dlbV9yZXF1ZXN0ICpyZXF1ZXN0LAotCQkJICBzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcpOwotaW50IGk5MTVfZG9fd2FpdF9yZXF1ZXN0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCi0JCQkgdWludDMyX3Qgc2Vxbm8sCi0JCQkgYm9vbCBpbnRlcnJ1cHRpYmxlLAotCQkJIHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZyk7Cit2b2lkIGk5MTVfZ2VtX2RvX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKKwkJICAgICAgdW5zaWduZWQgbG9uZyBzdGFydCwKKwkJICAgICAgdW5zaWduZWQgbG9uZyBtYXBwYWJsZV9lbmQsCisJCSAgICAgIHVuc2lnbmVkIGxvbmcgZW5kKTsKK2ludCBfX211c3RfY2hlY2sgaTkxNV9ncHVfaWRsZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKK2ludCBfX211c3RfY2hlY2sgaTkxNV9nZW1faWRsZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKK2ludCBfX211c3RfY2hlY2sgaTkxNV9hZGRfcmVxdWVzdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAorCQkJCSAgc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYsCisJCQkJICBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX3JlcXVlc3QgKnJlcXVlc3QsCisJCQkJICBzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcpOworaW50IF9fbXVzdF9jaGVjayBpOTE1X2RvX3dhaXRfcmVxdWVzdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAorCQkJCSAgICAgIHVpbnQzMl90IHNlcW5vLAorCQkJCSAgICAgIGJvb2wgaW50ZXJydXB0aWJsZSwKKwkJCQkgICAgICBzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcpOwogaW50IGk5MTVfZ2VtX2ZhdWx0KHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCBzdHJ1Y3Qgdm1fZmF1bHQgKnZtZik7Ci1pbnQgaTkxNV9nZW1fb2JqZWN0X3NldF90b19ndHRfZG9tYWluKHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqLAotCQkJCSAgICAgIGludCB3cml0ZSk7Ci1pbnQgaTkxNV9nZW1fb2JqZWN0X3NldF90b19kaXNwbGF5X3BsYW5lKHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqLAotCQkJCQkgYm9vbCBwaXBlbGluZWQpOworaW50IF9fbXVzdF9jaGVjaworaTkxNV9nZW1fb2JqZWN0X3NldF90b19ndHRfZG9tYWluKHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmosCisJCQkJICBib29sIHdyaXRlKTsKK2ludCBfX211c3RfY2hlY2sKK2k5MTVfZ2VtX29iamVjdF9zZXRfdG9fZGlzcGxheV9wbGFuZShzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqLAorCQkJCSAgICAgc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpwaXBlbGluZWQpOwogaW50IGk5MTVfZ2VtX2F0dGFjaF9waHlzX29iamVjdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAotCQkJCXN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqLAorCQkJCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmosCiAJCQkJaW50IGlkLAogCQkJCWludCBhbGlnbik7CiB2b2lkIGk5MTVfZ2VtX2RldGFjaF9waHlzX29iamVjdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAotCQkJCSBzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iaik7CisJCQkJIHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmopOwogdm9pZCBpOTE1X2dlbV9mcmVlX2FsbF9waHlzX29iamVjdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKLXZvaWQgaTkxNV9nZW1fcmVsZWFzZShzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYpOwordm9pZCBpOTE1X2dlbV9yZWxlYXNlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBkcm1fZmlsZSAqZmlsZSk7CiAKLXZvaWQgaTkxNV9nZW1fc2hyaW5rZXJfaW5pdCh2b2lkKTsKLXZvaWQgaTkxNV9nZW1fc2hyaW5rZXJfZXhpdCh2b2lkKTsKKy8qIGk5MTVfZ2VtX2d0dC5jICovCit2b2lkIGk5MTVfZ2VtX3Jlc3RvcmVfZ3R0X21hcHBpbmdzKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOworaW50IF9fbXVzdF9jaGVjayBpOTE1X2dlbV9ndHRfYmluZF9vYmplY3Qoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaik7Cit2b2lkIGk5MTVfZ2VtX2d0dF91bmJpbmRfb2JqZWN0KHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmopOwogCiAvKiBpOTE1X2dlbV9ldmljdC5jICovCi1pbnQgaTkxNV9nZW1fZXZpY3Rfc29tZXRoaW5nKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBtaW5fc2l6ZSwgdW5zaWduZWQgYWxpZ25tZW50KTsKLWludCBpOTE1X2dlbV9ldmljdF9ldmVyeXRoaW5nKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwotaW50IGk5MTVfZ2VtX2V2aWN0X2luYWN0aXZlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOworaW50IF9fbXVzdF9jaGVjayBpOTE1X2dlbV9ldmljdF9zb21ldGhpbmcoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IG1pbl9zaXplLAorCQkJCQkgIHVuc2lnbmVkIGFsaWdubWVudCwgYm9vbCBtYXBwYWJsZSk7CitpbnQgX19tdXN0X2NoZWNrIGk5MTVfZ2VtX2V2aWN0X2V2ZXJ5dGhpbmcoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKKwkJCQkJICAgYm9vbCBwdXJnZWFibGVfb25seSk7CitpbnQgX19tdXN0X2NoZWNrIGk5MTVfZ2VtX2V2aWN0X2luYWN0aXZlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCisJCQkJCSBib29sIHB1cmdlYWJsZV9vbmx5KTsKIAogLyogaTkxNV9nZW1fdGlsaW5nLmMgKi8KIHZvaWQgaTkxNV9nZW1fZGV0ZWN0X2JpdF82X3N3aXp6bGUoc3RydWN0IGRybV9kZXZpY2UgKmRldik7Ci12b2lkIGk5MTVfZ2VtX29iamVjdF9kb19iaXRfMTdfc3dpenpsZShzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iaik7Ci12b2lkIGk5MTVfZ2VtX29iamVjdF9zYXZlX2JpdF8xN19zd2l6emxlKHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqKTsKLWJvb2wgaTkxNV90aWxpbmdfb2soc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IHN0cmlkZSwgaW50IHNpemUsCi0JCSAgICBpbnQgdGlsaW5nX21vZGUpOwotYm9vbCBpOTE1X2dlbV9vYmplY3RfZmVuY2Vfb2Zmc2V0X29rKHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqLAotCQkJCSAgICAgaW50IHRpbGluZ19tb2RlKTsKK3ZvaWQgaTkxNV9nZW1fb2JqZWN0X2RvX2JpdF8xN19zd2l6emxlKHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmopOwordm9pZCBpOTE1X2dlbV9vYmplY3Rfc2F2ZV9iaXRfMTdfc3dpenpsZShzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqKTsKIAogLyogaTkxNV9nZW1fZGVidWcuYyAqLwotdm9pZCBpOTE1X2dlbV9kdW1wX29iamVjdChzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iaiwgaW50IGxlbiwKK3ZvaWQgaTkxNV9nZW1fZHVtcF9vYmplY3Qoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaiwgaW50IGxlbiwKIAkJCSAgY29uc3QgY2hhciAqd2hlcmUsIHVpbnQzMl90IG1hcmspOwogI2lmIFdBVENIX0xJU1RTCiBpbnQgaTkxNV92ZXJpZnlfbGlzdHMoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CiAjZWxzZQogI2RlZmluZSBpOTE1X3ZlcmlmeV9saXN0cyhkZXYpIDAKICNlbmRpZgotdm9pZCBpOTE1X2dlbV9vYmplY3RfY2hlY2tfY29oZXJlbmN5KHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqLCBpbnQgaGFuZGxlKTsKLXZvaWQgaTkxNV9nZW1fZHVtcF9vYmplY3Qoc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmosIGludCBsZW4sCit2b2lkIGk5MTVfZ2VtX29iamVjdF9jaGVja19jb2hlcmVuY3koc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaiwKKwkJCQkgICAgIGludCBoYW5kbGUpOwordm9pZCBpOTE1X2dlbV9kdW1wX29iamVjdChzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqLCBpbnQgbGVuLAogCQkJICBjb25zdCBjaGFyICp3aGVyZSwgdWludDMyX3QgbWFyayk7CiAKIC8qIGk5MTVfZGVidWdmcy5jICovCkBAIC0xMTYzLDYgKzEyNjUsNyBAQAogZXh0ZXJuIHZvaWQgaW50ZWxfZW5hYmxlX2ZiYyhzdHJ1Y3QgZHJtX2NydGMgKmNydGMsIHVuc2lnbmVkIGxvbmcgaW50ZXJ2YWwpOwogZXh0ZXJuIGJvb2wgaW50ZWxfZmJjX2VuYWJsZWQoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CiBleHRlcm4gYm9vbCBpcm9ubGFrZV9zZXRfZHJwcyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1OCB2YWwpOworZXh0ZXJuIHZvaWQgZ2VuNl9zZXRfcnBzKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHU4IHZhbCk7CiBleHRlcm4gdm9pZCBpbnRlbF9kZXRlY3RfcGNoIChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKIGV4dGVybiBpbnQgaW50ZWxfdHJhbnNfZHBfcG9ydF9zZWwgKHN0cnVjdCBkcm1fY3J0YyAqY3J0Yyk7CiAKQEAgLTExNzAsNzkgKzEyNzMsMTIwIEBACiAjaWZkZWYgQ09ORklHX0RFQlVHX0ZTCiBleHRlcm4gc3RydWN0IGludGVsX292ZXJsYXlfZXJyb3Jfc3RhdGUgKmludGVsX292ZXJsYXlfY2FwdHVyZV9lcnJvcl9zdGF0ZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKIGV4dGVybiB2b2lkIGludGVsX292ZXJsYXlfcHJpbnRfZXJyb3Jfc3RhdGUoc3RydWN0IHNlcV9maWxlICptLCBzdHJ1Y3QgaW50ZWxfb3ZlcmxheV9lcnJvcl9zdGF0ZSAqZXJyb3IpOworCitleHRlcm4gc3RydWN0IGludGVsX2Rpc3BsYXlfZXJyb3Jfc3RhdGUgKmludGVsX2Rpc3BsYXlfY2FwdHVyZV9lcnJvcl9zdGF0ZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKK2V4dGVybiB2b2lkIGludGVsX2Rpc3BsYXlfcHJpbnRfZXJyb3Jfc3RhdGUoc3RydWN0IHNlcV9maWxlICptLAorCQkJCQkgICAgc3RydWN0IGRybV9kZXZpY2UgKmRldiwKKwkJCQkJICAgIHN0cnVjdCBpbnRlbF9kaXNwbGF5X2Vycm9yX3N0YXRlICplcnJvcik7CiAjZW5kaWYKIAorI2RlZmluZSBMUF9SSU5HKGQpICgmKChzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqKShkKSktPnJpbmdbUkNTXSkKKworI2RlZmluZSBCRUdJTl9MUF9SSU5HKG4pIFwKKwlpbnRlbF9yaW5nX2JlZ2luKExQX1JJTkcoZGV2X3ByaXYpLCAobikpCisKKyNkZWZpbmUgT1VUX1JJTkcoeCkgXAorCWludGVsX3JpbmdfZW1pdChMUF9SSU5HKGRldl9wcml2KSwgeCkKKworI2RlZmluZSBBRFZBTkNFX0xQX1JJTkcoKSBcCisJaW50ZWxfcmluZ19hZHZhbmNlKExQX1JJTkcoZGV2X3ByaXYpKQorCiAvKioKICAqIExvY2sgdGVzdCBmb3Igd2hlbiBpdCdzIGp1c3QgZm9yIHN5bmNocm9uaXphdGlvbiBvZiByaW5nIGFjY2Vzcy4KICAqCiAgKiBJbiB0aGF0IGNhc2UsIHdlIGRvbid0IG5lZWQgdG8gZG8gaXQgd2hlbiBHRU0gaXMgaW5pdGlhbGl6ZWQgYXMgbm9ib2R5IGVsc2UKICAqIGhhcyBhY2Nlc3MgdG8gdGhlIHJpbmcuCiAgKi8KLSNkZWZpbmUgUklOR19MT0NLX1RFU1RfV0lUSF9SRVRVUk4oZGV2LCBmaWxlX3ByaXYpIGRvIHsJCQlcCi0JaWYgKCgoZHJtX2k5MTVfcHJpdmF0ZV90ICopZGV2LT5kZXZfcHJpdmF0ZSktPnJlbmRlcl9yaW5nLmdlbV9vYmplY3QgXAotCQkJPT0gTlVMTCkJCQkJCVwKLQkJTE9DS19URVNUX1dJVEhfUkVUVVJOKGRldiwgZmlsZV9wcml2KTsJCQlcCisjZGVmaW5lIFJJTkdfTE9DS19URVNUX1dJVEhfUkVUVVJOKGRldiwgZmlsZSkgZG8gewkJCVwKKwlpZiAoTFBfUklORyhkZXYtPmRldl9wcml2YXRlKS0+b2JqID09IE5VTEwpCQkJXAorCQlMT0NLX1RFU1RfV0lUSF9SRVRVUk4oZGV2LCBmaWxlKTsJCQlcCiB9IHdoaWxlICgwKQogCi1zdGF0aWMgaW5saW5lIHUzMiBpOTE1X3JlYWQoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2LCB1MzIgcmVnKQorCisjZGVmaW5lIF9faTkxNV9yZWFkKHgsIHkpIFwKK3N0YXRpYyBpbmxpbmUgdSMjeCBpOTE1X3JlYWQjI3goc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2LCB1MzIgcmVnKSB7IFwKKwl1IyN4IHZhbCA9IHJlYWQjI3koZGV2X3ByaXYtPnJlZ3MgKyByZWcpOyBcCisJdHJhY2VfaTkxNV9yZWdfcncoJ1InLCByZWcsIHZhbCwgc2l6ZW9mKHZhbCkpOyBcCisJcmV0dXJuIHZhbDsgXAorfQorX19pOTE1X3JlYWQoOCwgYikKK19faTkxNV9yZWFkKDE2LCB3KQorX19pOTE1X3JlYWQoMzIsIGwpCitfX2k5MTVfcmVhZCg2NCwgcSkKKyN1bmRlZiBfX2k5MTVfcmVhZAorCisjZGVmaW5lIF9faTkxNV93cml0ZSh4LCB5KSBcCitzdGF0aWMgaW5saW5lIHZvaWQgaTkxNV93cml0ZSMjeChzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYsIHUzMiByZWcsIHUjI3ggdmFsKSB7IFwKKwl0cmFjZV9pOTE1X3JlZ19ydygnVycsIHJlZywgdmFsLCBzaXplb2YodmFsKSk7IFwKKwl3cml0ZSMjeSh2YWwsIGRldl9wcml2LT5yZWdzICsgcmVnKTsgXAorfQorX19pOTE1X3dyaXRlKDgsIGIpCitfX2k5MTVfd3JpdGUoMTYsIHcpCitfX2k5MTVfd3JpdGUoMzIsIGwpCitfX2k5MTVfd3JpdGUoNjQsIHEpCisjdW5kZWYgX19pOTE1X3dyaXRlCisKKyNkZWZpbmUgSTkxNV9SRUFEOChyZWcpCQlpOTE1X3JlYWQ4KGRldl9wcml2LCAocmVnKSkKKyNkZWZpbmUgSTkxNV9XUklURTgocmVnLCB2YWwpCWk5MTVfd3JpdGU4KGRldl9wcml2LCAocmVnKSwgKHZhbCkpCisKKyNkZWZpbmUgSTkxNV9SRUFEMTYocmVnKQlpOTE1X3JlYWQxNihkZXZfcHJpdiwgKHJlZykpCisjZGVmaW5lIEk5MTVfV1JJVEUxNihyZWcsIHZhbCkJaTkxNV93cml0ZTE2KGRldl9wcml2LCAocmVnKSwgKHZhbCkpCisjZGVmaW5lIEk5MTVfUkVBRDE2X05PVFJBQ0UocmVnKQlyZWFkdyhkZXZfcHJpdi0+cmVncyArIChyZWcpKQorI2RlZmluZSBJOTE1X1dSSVRFMTZfTk9UUkFDRShyZWcsIHZhbCkJd3JpdGV3KHZhbCwgZGV2X3ByaXYtPnJlZ3MgKyAocmVnKSkKKworI2RlZmluZSBJOTE1X1JFQUQocmVnKQkJaTkxNV9yZWFkMzIoZGV2X3ByaXYsIChyZWcpKQorI2RlZmluZSBJOTE1X1dSSVRFKHJlZywgdmFsKQlpOTE1X3dyaXRlMzIoZGV2X3ByaXYsIChyZWcpLCAodmFsKSkKKyNkZWZpbmUgSTkxNV9SRUFEX05PVFJBQ0UocmVnKQkJcmVhZGwoZGV2X3ByaXYtPnJlZ3MgKyAocmVnKSkKKyNkZWZpbmUgSTkxNV9XUklURV9OT1RSQUNFKHJlZywgdmFsKQl3cml0ZWwodmFsLCBkZXZfcHJpdi0+cmVncyArIChyZWcpKQorCisjZGVmaW5lIEk5MTVfV1JJVEU2NChyZWcsIHZhbCkJaTkxNV93cml0ZTY0KGRldl9wcml2LCAocmVnKSwgKHZhbCkpCisjZGVmaW5lIEk5MTVfUkVBRDY0KHJlZykJaTkxNV9yZWFkNjQoZGV2X3ByaXYsIChyZWcpKQorCisjZGVmaW5lIFBPU1RJTkdfUkVBRChyZWcpCSh2b2lkKUk5MTVfUkVBRF9OT1RSQUNFKHJlZykKKyNkZWZpbmUgUE9TVElOR19SRUFEMTYocmVnKQkodm9pZClJOTE1X1JFQUQxNl9OT1RSQUNFKHJlZykKKworCisvKiBPbiBTTkIgcGxhdGZvcm0sIGJlZm9yZSByZWFkaW5nIHJpbmcgcmVnaXN0ZXJzIGZvcmNld2FrZSBiaXQKKyAqIG11c3QgYmUgc2V0IHRvIHByZXZlbnQgR1QgY29yZSBmcm9tIHBvd2VyIGRvd24gYW5kIHN0YWxlIHZhbHVlcyBiZWluZworICogcmV0dXJuZWQuCisgKi8KK3ZvaWQgX19nZW42X2ZvcmNlX3dha2VfZ2V0KHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdik7Cit2b2lkIF9fZ2VuNl9mb3JjZV93YWtlX3B1dCAoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2KTsKK3N0YXRpYyBpbmxpbmUgdTMyIGk5MTVfc2FmZV9yZWFkKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiwgdTMyIHJlZykKIHsKIAl1MzIgdmFsOwogCi0JdmFsID0gcmVhZGwoZGV2X3ByaXYtPnJlZ3MgKyByZWcpOwotCWlmIChkZXZfcHJpdi0+ZGVidWdfZmxhZ3MgJiBJOTE1X0RFQlVHX1JFQUQpCi0JCXByaW50ayhLRVJOX0VSUiAicmVhZCAweCUwOHggZnJvbSAweCUwOHhcbiIsIHZhbCwgcmVnKTsKKwlpZiAoZGV2X3ByaXYtPmluZm8tPmdlbiA+PSA2KSB7CisJCV9fZ2VuNl9mb3JjZV93YWtlX2dldChkZXZfcHJpdik7CisJCXZhbCA9IEk5MTVfUkVBRChyZWcpOworCQlfX2dlbjZfZm9yY2Vfd2FrZV9wdXQoZGV2X3ByaXYpOworCX0gZWxzZQorCQl2YWwgPSBJOTE1X1JFQUQocmVnKTsKKwogCXJldHVybiB2YWw7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBpOTE1X3dyaXRlKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiwgdTMyIHJlZywKLQkJCSAgICAgIHUzMiB2YWwpCitzdGF0aWMgaW5saW5lIHZvaWQKK2k5MTVfd3JpdGUoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2LCB1MzIgcmVnLCB1NjQgdmFsLCBpbnQgbGVuKQogewotCXdyaXRlbCh2YWwsIGRldl9wcml2LT5yZWdzICsgcmVnKTsKLQlpZiAoZGV2X3ByaXYtPmRlYnVnX2ZsYWdzICYgSTkxNV9ERUJVR19XUklURSkKLQkJcHJpbnRrKEtFUk5fRVJSICJ3cm90ZSAweCUwOHggdG8gMHglMDh4XG4iLCB2YWwsIHJlZyk7CisgICAgICAgLyogVHJhY2UgZG93biB0aGUgd3JpdGUgb3BlcmF0aW9uIGJlZm9yZSB0aGUgcmVhbCB3cml0ZSAqLworICAgICAgIHRyYWNlX2k5MTVfcmVnX3J3KCdXJywgcmVnLCB2YWwsIGxlbik7CisgICAgICAgc3dpdGNoIChsZW4pIHsKKyAgICAgICBjYXNlIDg6CisgICAgICAgICAgICAgICB3cml0ZXEodmFsLCBkZXZfcHJpdi0+cmVncyArIHJlZyk7CisgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAgICB3cml0ZWwodmFsLCBkZXZfcHJpdi0+cmVncyArIHJlZyk7CisgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICB3cml0ZXcodmFsLCBkZXZfcHJpdi0+cmVncyArIHJlZyk7CisgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICB3cml0ZWIodmFsLCBkZXZfcHJpdi0+cmVncyArIHJlZyk7CisgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICB9CiB9CiAKLSNkZWZpbmUgSTkxNV9SRUFEKHJlZykgICAgICAgICAgaTkxNV9yZWFkKGRldl9wcml2LCAocmVnKSkKLSNkZWZpbmUgSTkxNV9XUklURShyZWcsIHZhbCkgICAgaTkxNV93cml0ZShkZXZfcHJpdiwgKHJlZyksICh2YWwpKQotI2RlZmluZSBJOTE1X1JFQUQxNihyZWcpCXJlYWR3KGRldl9wcml2LT5yZWdzICsgKHJlZykpCi0jZGVmaW5lIEk5MTVfV1JJVEUxNihyZWcsIHZhbCkJd3JpdGVsKHZhbCwgZGV2X3ByaXYtPnJlZ3MgKyAocmVnKSkKLSNkZWZpbmUgSTkxNV9SRUFEOChyZWcpCQlyZWFkYihkZXZfcHJpdi0+cmVncyArIChyZWcpKQotI2RlZmluZSBJOTE1X1dSSVRFOChyZWcsIHZhbCkJd3JpdGViKHZhbCwgZGV2X3ByaXYtPnJlZ3MgKyAocmVnKSkKLSNkZWZpbmUgSTkxNV9XUklURTY0KHJlZywgdmFsKQl3cml0ZXEodmFsLCBkZXZfcHJpdi0+cmVncyArIChyZWcpKQotI2RlZmluZSBJOTE1X1JFQUQ2NChyZWcpCXJlYWRxKGRldl9wcml2LT5yZWdzICsgKHJlZykpCi0jZGVmaW5lIFBPU1RJTkdfUkVBRChyZWcpCSh2b2lkKUk5MTVfUkVBRChyZWcpCi0jZGVmaW5lIFBPU1RJTkdfUkVBRDE2KHJlZykJKHZvaWQpSTkxNV9SRUFEMTYocmVnKQotCi0jZGVmaW5lIEk5MTVfREVCVUdfRU5BQkxFX0lPKCkgKGRldl9wcml2LT5kZWJ1Z19mbGFncyB8PSBJOTE1X0RFQlVHX1JFQUQgfCBcCi0JCQkJSTkxNV9ERUJVR19XUklURSkKLSNkZWZpbmUgSTkxNV9ERUJVR19ESVNBQkxFX0lPKCkgKGRldl9wcml2LT5kZWJ1Z19mbGFncyAmPSB+KEk5MTVfREVCVUdfUkVBRCB8IFwKLQkJCQkJCQkgICAgSTkxNV9ERUJVR19XUklURSkpCi0KLSNkZWZpbmUgSTkxNV9WRVJCT1NFIDAKLQotI2RlZmluZSBCRUdJTl9MUF9SSU5HKG4pICBkbyB7IFwKLQlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2X18gPSBkZXYtPmRldl9wcml2YXRlOyAgICAgICAgICAgICAgICBcCi0JaWYgKEk5MTVfVkVSQk9TRSkJCQkJCQlcCi0JCURSTV9ERUJVRygiICAgQkVHSU5fTFBfUklORyAleFxuIiwgKGludCkobikpOwkJXAotCWludGVsX3JpbmdfYmVnaW4oZGV2LCAmZGV2X3ByaXZfXy0+cmVuZGVyX3JpbmcsIChuKSk7CQlcCi19IHdoaWxlICgwKQotCi0KLSNkZWZpbmUgT1VUX1JJTkcoeCkgZG8gewkJCQkJCVwKLQlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2X18gPSBkZXYtPmRldl9wcml2YXRlOwkJXAotCWlmIChJOTE1X1ZFUkJPU0UpCQkJCQkJXAotCQlEUk1fREVCVUcoIiAgIE9VVF9SSU5HICV4XG4iLCAoaW50KSh4KSk7CQlcCi0JaW50ZWxfcmluZ19lbWl0KGRldiwgJmRldl9wcml2X18tPnJlbmRlcl9yaW5nLCB4KTsJCVwKLX0gd2hpbGUgKDApCi0KLSNkZWZpbmUgQURWQU5DRV9MUF9SSU5HKCkgZG8gewkJCQkJCVwKLQlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2X18gPSBkZXYtPmRldl9wcml2YXRlOyAgICAgICAgICAgICAgICBcCi0JaWYgKEk5MTVfVkVSQk9TRSkJCQkJCQlcCi0JCURSTV9ERUJVRygiQURWQU5DRV9MUF9SSU5HICV4XG4iLAkJCVwKLQkJCQlkZXZfcHJpdl9fLT5yZW5kZXJfcmluZy50YWlsKTsJCVwKLQlpbnRlbF9yaW5nX2FkdmFuY2UoZGV2LCAmZGV2X3ByaXZfXy0+cmVuZGVyX3JpbmcpOwkJXAotfSB3aGlsZSgwKQotCiAvKioKICAqIFJlYWRzIGEgZHdvcmQgb3V0IG9mIHRoZSBzdGF0dXMgcGFnZSwgd2hpY2ggaXMgd3JpdHRlbiB0byBmcm9tIHRoZSBjb21tYW5kCiAgKiBxdWV1ZSBieSBhdXRvbWF0aWMgdXBkYXRlcywgTUlfUkVQT1JUX0hFQUQsIE1JX1NUT1JFX0RBVEFfSU5ERVgsIG9yCkBAIC0xMjU5LDcyICsxNDAzLDkgQEAKICAqIFRoZSBhcmVhIGZyb20gZHdvcmQgMHgyMCB0byAweDNmZiBpcyBhdmFpbGFibGUgZm9yIGRyaXZlciB1c2FnZS4KICAqLwogI2RlZmluZSBSRUFEX0hXU1AoZGV2X3ByaXYsIHJlZykgICgoKHZvbGF0aWxlIHUzMiAqKVwKLQkJCShkZXZfcHJpdi0+cmVuZGVyX3Jpbmcuc3RhdHVzX3BhZ2UucGFnZV9hZGRyKSlbcmVnXSkKKwkJCShMUF9SSU5HKGRldl9wcml2KS0+c3RhdHVzX3BhZ2UucGFnZV9hZGRyKSlbcmVnXSkKICNkZWZpbmUgUkVBRF9CUkVBRENSVU1CKGRldl9wcml2KSBSRUFEX0hXU1AoZGV2X3ByaXYsIEk5MTVfQlJFQURDUlVNQl9JTkRFWCkKICNkZWZpbmUgSTkxNV9HRU1fSFdTX0lOREVYCQkweDIwCiAjZGVmaW5lIEk5MTVfQlJFQURDUlVNQl9JTkRFWAkJMHgyMQogCi0jZGVmaW5lIElOVEVMX0lORk8oZGV2KQkoKChzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqKSAoZGV2KS0+ZGV2X3ByaXZhdGUpLT5pbmZvKQotCi0jZGVmaW5lIElTX0k4MzAoZGV2KQkJKChkZXYpLT5wY2lfZGV2aWNlID09IDB4MzU3NykKLSNkZWZpbmUgSVNfODQ1RyhkZXYpCQkoKGRldiktPnBjaV9kZXZpY2UgPT0gMHgyNTYyKQotI2RlZmluZSBJU19JODVYKGRldikJCShJTlRFTF9JTkZPKGRldiktPmlzX2k4NXgpCi0jZGVmaW5lIElTX0k4NjVHKGRldikJCSgoZGV2KS0+cGNpX2RldmljZSA9PSAweDI1NzIpCi0jZGVmaW5lIElTX0k5MTVHKGRldikJCShJTlRFTF9JTkZPKGRldiktPmlzX2k5MTVnKQotI2RlZmluZSBJU19JOTE1R00oZGV2KQkJKChkZXYpLT5wY2lfZGV2aWNlID09IDB4MjU5MikKLSNkZWZpbmUgSVNfSTk0NUcoZGV2KQkJKChkZXYpLT5wY2lfZGV2aWNlID09IDB4Mjc3MikKLSNkZWZpbmUgSVNfSTk0NUdNKGRldikJCShJTlRFTF9JTkZPKGRldiktPmlzX2k5NDVnbSkKLSNkZWZpbmUgSVNfQlJPQURXQVRFUihkZXYpCShJTlRFTF9JTkZPKGRldiktPmlzX2Jyb2Fkd2F0ZXIpCi0jZGVmaW5lIElTX0NSRVNUTElORShkZXYpCShJTlRFTF9JTkZPKGRldiktPmlzX2NyZXN0bGluZSkKLSNkZWZpbmUgSVNfR000NShkZXYpCQkoKGRldiktPnBjaV9kZXZpY2UgPT0gMHgyQTQyKQotI2RlZmluZSBJU19HNFgoZGV2KQkJKElOVEVMX0lORk8oZGV2KS0+aXNfZzR4KQotI2RlZmluZSBJU19QSU5FVklFV19HKGRldikJKChkZXYpLT5wY2lfZGV2aWNlID09IDB4YTAwMSkKLSNkZWZpbmUgSVNfUElORVZJRVdfTShkZXYpCSgoZGV2KS0+cGNpX2RldmljZSA9PSAweGEwMTEpCi0jZGVmaW5lIElTX1BJTkVWSUVXKGRldikJKElOVEVMX0lORk8oZGV2KS0+aXNfcGluZXZpZXcpCi0jZGVmaW5lIElTX0czMyhkZXYpCQkoSU5URUxfSU5GTyhkZXYpLT5pc19nMzMpCi0jZGVmaW5lIElTX0lST05MQUtFX0QoZGV2KQkoKGRldiktPnBjaV9kZXZpY2UgPT0gMHgwMDQyKQotI2RlZmluZSBJU19JUk9OTEFLRV9NKGRldikJKChkZXYpLT5wY2lfZGV2aWNlID09IDB4MDA0NikKLSNkZWZpbmUgSVNfTU9CSUxFKGRldikJCShJTlRFTF9JTkZPKGRldiktPmlzX21vYmlsZSkKLQotI2RlZmluZSBJU19HRU4yKGRldikJKElOVEVMX0lORk8oZGV2KS0+Z2VuID09IDIpCi0jZGVmaW5lIElTX0dFTjMoZGV2KQkoSU5URUxfSU5GTyhkZXYpLT5nZW4gPT0gMykKLSNkZWZpbmUgSVNfR0VONChkZXYpCShJTlRFTF9JTkZPKGRldiktPmdlbiA9PSA0KQotI2RlZmluZSBJU19HRU41KGRldikJKElOVEVMX0lORk8oZGV2KS0+Z2VuID09IDUpCi0jZGVmaW5lIElTX0dFTjYoZGV2KQkoSU5URUxfSU5GTyhkZXYpLT5nZW4gPT0gNikKLQotI2RlZmluZSBIQVNfQlNEKGRldikgICAgICAgICAgICAoSU5URUxfSU5GTyhkZXYpLT5oYXNfYnNkX3JpbmcpCi0jZGVmaW5lIEhBU19CTFQoZGV2KSAgICAgICAgICAgIChJTlRFTF9JTkZPKGRldiktPmhhc19ibHRfcmluZykKLSNkZWZpbmUgSTkxNV9ORUVEX0dGWF9IV1MoZGV2KQkoSU5URUxfSU5GTyhkZXYpLT5uZWVkX2dmeF9od3MpCi0KLSNkZWZpbmUgSEFTX09WRVJMQVkoZGV2KSAJCShJTlRFTF9JTkZPKGRldiktPmhhc19vdmVybGF5KQotI2RlZmluZSBPVkVSTEFZX05FRURTX1BIWVNJQ0FMKGRldikJKElOVEVMX0lORk8oZGV2KS0+b3ZlcmxheV9uZWVkc19waHlzaWNhbCkKLQotLyogV2l0aCB0aGUgOTQ1IGFuZCBsYXRlciwgWSB0aWxpbmcgZ290IGFkanVzdGVkIHNvIHRoYXQgaXQgd2FzIDMyIDEyOC1ieXRlCi0gKiByb3dzLCB3aGljaCBjaGFuZ2VkIHRoZSBhbGlnbm1lbnQgcmVxdWlyZW1lbnRzIGFuZCBmZW5jZSBwcm9ncmFtbWluZy4KLSAqLwotI2RlZmluZSBIQVNfMTI4X0JZVEVfWV9USUxJTkcoZGV2KSAoIUlTX0dFTjIoZGV2KSAmJiAhKElTX0k5MTVHKGRldikgfHwgXAotCQkJCQkJICAgICAgSVNfSTkxNUdNKGRldikpKQotI2RlZmluZSBTVVBQT1JUU19ESUdJVEFMX09VVFBVVFMoZGV2KQkoIUlTX0dFTjIoZGV2KSAmJiAhSVNfUElORVZJRVcoZGV2KSkKLSNkZWZpbmUgU1VQUE9SVFNfSU5URUdSQVRFRF9IRE1JKGRldikJKElTX0c0WChkZXYpIHx8IElTX0dFTjUoZGV2KSkKLSNkZWZpbmUgU1VQUE9SVFNfSU5URUdSQVRFRF9EUChkZXYpCShJU19HNFgoZGV2KSB8fCBJU19HRU41KGRldikpCi0jZGVmaW5lIFNVUFBPUlRTX0VEUChkZXYpCQkoSVNfSVJPTkxBS0VfTShkZXYpKQotI2RlZmluZSBTVVBQT1JUU19UVihkZXYpCQkoSU5URUxfSU5GTyhkZXYpLT5zdXBwb3J0c190dikKLSNkZWZpbmUgSTkxNV9IQVNfSE9UUExVRyhkZXYpCQkgKElOVEVMX0lORk8oZGV2KS0+aGFzX2hvdHBsdWcpCi0vKiBkc3BhcmIgY29udHJvbGxlZCBieSBodyBvbmx5ICovCi0jZGVmaW5lIERTUEFSQl9IV0NPTlRST0woZGV2KSAoSVNfRzRYKGRldikgfHwgSVNfSVJPTkxBS0UoZGV2KSkKLQotI2RlZmluZSBIQVNfRldfQkxDKGRldikgKElOVEVMX0lORk8oZGV2KS0+Z2VuID4gMikKLSNkZWZpbmUgSEFTX1BJUEVfQ1hTUihkZXYpIChJTlRFTF9JTkZPKGRldiktPmhhc19waXBlX2N4c3IpCi0jZGVmaW5lIEk5MTVfSEFTX0ZCQyhkZXYpIChJTlRFTF9JTkZPKGRldiktPmhhc19mYmMpCi0jZGVmaW5lIEk5MTVfSEFTX1JDNihkZXYpIChJTlRFTF9JTkZPKGRldiktPmhhc19yYzYpCi0KLSNkZWZpbmUgSEFTX1BDSF9TUExJVChkZXYpIChJU19HRU41KGRldikgfHwgSVNfR0VONihkZXYpKQotI2RlZmluZSBIQVNfUElQRV9DT05UUk9MKGRldikgKElTX0dFTjUoZGV2KSB8fCBJU19HRU42KGRldikpCi0KLSNkZWZpbmUgSU5URUxfUENIX1RZUEUoZGV2KSAoKChzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqKShkZXYpLT5kZXZfcHJpdmF0ZSktPnBjaF90eXBlKQotI2RlZmluZSBIQVNfUENIX0NQVChkZXYpIChJTlRFTF9QQ0hfVFlQRShkZXYpID09IFBDSF9DUFQpCi0jZGVmaW5lIEhBU19QQ0hfSUJYKGRldikgKElOVEVMX1BDSF9UWVBFKGRldikgPT0gUENIX0lCWCkKLQotI2RlZmluZSBQUklNQVJZX1JJTkdCVUZGRVJfU0laRSAgICAgICAgICgxMjgqMTAyNCkKLQogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbS5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW0uYwppbmRleCAyNzVlYzZlLi5jNzljMGI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtLmMKQEAgLTM0LDM4ICszNCwzMSBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9zd2FwLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZWwtZ3R0Lmg+CiAKLXN0YXRpYyB1aW50MzJfdCBpOTE1X2dlbV9nZXRfZ3R0X2FsaWdubWVudChzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iaik7Ci0KLXN0YXRpYyBpbnQgaTkxNV9nZW1fb2JqZWN0X2ZsdXNoX2dwdV93cml0ZV9kb21haW4oc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmopOwotc3RhdGljIHZvaWQgaTkxNV9nZW1fb2JqZWN0X2ZsdXNoX2d0dF93cml0ZV9kb21haW4oc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmopOwotc3RhdGljIHZvaWQgaTkxNV9nZW1fb2JqZWN0X2ZsdXNoX2NwdV93cml0ZV9kb21haW4oc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmopOwotc3RhdGljIGludCBpOTE1X2dlbV9vYmplY3Rfc2V0X3RvX2NwdV9kb21haW4oc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmosCi0JCQkJCSAgICAgaW50IHdyaXRlKTsKLXN0YXRpYyBpbnQgaTkxNV9nZW1fb2JqZWN0X3NldF9jcHVfcmVhZF9kb21haW5fcmFuZ2Uoc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmosCitzdGF0aWMgdm9pZCBpOTE1X2dlbV9vYmplY3RfZmx1c2hfZ3B1X3dyaXRlX2RvbWFpbihzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqKTsKK3N0YXRpYyB2b2lkIGk5MTVfZ2VtX29iamVjdF9mbHVzaF9ndHRfd3JpdGVfZG9tYWluKHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmopOworc3RhdGljIHZvaWQgaTkxNV9nZW1fb2JqZWN0X2ZsdXNoX2NwdV93cml0ZV9kb21haW4oc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaik7CitzdGF0aWMgaW50IGk5MTVfZ2VtX29iamVjdF9zZXRfdG9fY3B1X2RvbWFpbihzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqLAorCQkJCQkgICAgIGJvb2wgd3JpdGUpOworc3RhdGljIGludCBpOTE1X2dlbV9vYmplY3Rfc2V0X2NwdV9yZWFkX2RvbWFpbl9yYW5nZShzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqLAogCQkJCQkJICAgICB1aW50NjRfdCBvZmZzZXQsCiAJCQkJCQkgICAgIHVpbnQ2NF90IHNpemUpOwotc3RhdGljIHZvaWQgaTkxNV9nZW1fb2JqZWN0X3NldF90b19mdWxsX2NwdV9yZWFkX2RvbWFpbihzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iaik7Ci1zdGF0aWMgaW50IGk5MTVfZ2VtX29iamVjdF93YWl0X3JlbmRlcmluZyhzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iaiwKLQkJCQkJICBib29sIGludGVycnVwdGlibGUpOwotc3RhdGljIGludCBpOTE1X2dlbV9vYmplY3RfYmluZF90b19ndHQoc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmosCi0JCQkJCSAgIHVuc2lnbmVkIGFsaWdubWVudCk7Ci1zdGF0aWMgdm9pZCBpOTE1X2dlbV9jbGVhcl9mZW5jZV9yZWcoc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmopOwotc3RhdGljIGludCBpOTE1X2dlbV9waHlzX3B3cml0ZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iaiwKK3N0YXRpYyB2b2lkIGk5MTVfZ2VtX29iamVjdF9zZXRfdG9fZnVsbF9jcHVfcmVhZF9kb21haW4oc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaik7CitzdGF0aWMgaW50IGk5MTVfZ2VtX29iamVjdF9iaW5kX3RvX2d0dChzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqLAorCQkJCSAgICAgICB1bnNpZ25lZCBhbGlnbm1lbnQsCisJCQkJICAgICAgIGJvb2wgbWFwX2FuZF9mZW5jZWFibGUpOworc3RhdGljIHZvaWQgaTkxNV9nZW1fY2xlYXJfZmVuY2VfcmVnKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCisJCQkJICAgICBzdHJ1Y3QgZHJtX2k5MTVfZmVuY2VfcmVnICpyZWcpOworc3RhdGljIGludCBpOTE1X2dlbV9waHlzX3B3cml0ZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAorCQkJCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmosCiAJCQkJc3RydWN0IGRybV9pOTE1X2dlbV9wd3JpdGUgKmFyZ3MsCi0JCQkJc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYpOwotc3RhdGljIHZvaWQgaTkxNV9nZW1fZnJlZV9vYmplY3RfdGFpbChzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iaik7CisJCQkJc3RydWN0IGRybV9maWxlICpmaWxlKTsKK3N0YXRpYyB2b2lkIGk5MTVfZ2VtX2ZyZWVfb2JqZWN0X3RhaWwoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaik7CiAKLXN0YXRpYyBpbnQKLWk5MTVfZ2VtX29iamVjdF9nZXRfcGFnZXMoc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmosCi0JCQkgIGdmcF90IGdmcG1hc2spOworc3RhdGljIGludCBpOTE1X2dlbV9pbmFjdGl2ZV9zaHJpbmsoc3RydWN0IHNocmlua2VyICpzaHJpbmtlciwKKwkJCQkgICAgaW50IG5yX3RvX3NjYW4sCisJCQkJICAgIGdmcF90IGdmcF9tYXNrKTsKIAotc3RhdGljIHZvaWQKLWk5MTVfZ2VtX29iamVjdF9wdXRfcGFnZXMoc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmopOwotCi1zdGF0aWMgTElTVF9IRUFEKHNocmlua19saXN0KTsKLXN0YXRpYyBERUZJTkVfU1BJTkxPQ0soc2hyaW5rX2xpc3RfbG9jayk7CiAKIC8qIHNvbWUgYm9va2tlZXBpbmcgKi8KIHN0YXRpYyB2b2lkIGk5MTVfZ2VtX2luZm9fYWRkX29iaihzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYsCkBAIC04MiwzNCArNzUsNiBAQAogCWRldl9wcml2LT5tbS5vYmplY3RfbWVtb3J5IC09IHNpemU7CiB9CiAKLXN0YXRpYyB2b2lkIGk5MTVfZ2VtX2luZm9fYWRkX2d0dChzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYsCi0JCQkJICBzaXplX3Qgc2l6ZSkKLXsKLQlkZXZfcHJpdi0+bW0uZ3R0X2NvdW50Kys7Ci0JZGV2X3ByaXYtPm1tLmd0dF9tZW1vcnkgKz0gc2l6ZTsKLX0KLQotc3RhdGljIHZvaWQgaTkxNV9nZW1faW5mb19yZW1vdmVfZ3R0KHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiwKLQkJCQkgICAgIHNpemVfdCBzaXplKQotewotCWRldl9wcml2LT5tbS5ndHRfY291bnQtLTsKLQlkZXZfcHJpdi0+bW0uZ3R0X21lbW9yeSAtPSBzaXplOwotfQotCi1zdGF0aWMgdm9pZCBpOTE1X2dlbV9pbmZvX2FkZF9waW4oc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2LAotCQkJCSAgc2l6ZV90IHNpemUpCi17Ci0JZGV2X3ByaXYtPm1tLnBpbl9jb3VudCsrOwotCWRldl9wcml2LT5tbS5waW5fbWVtb3J5ICs9IHNpemU7Ci19Ci0KLXN0YXRpYyB2b2lkIGk5MTVfZ2VtX2luZm9fcmVtb3ZlX3BpbihzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYsCi0JCQkJICAgICBzaXplX3Qgc2l6ZSkKLXsKLQlkZXZfcHJpdi0+bW0ucGluX2NvdW50LS07Ci0JZGV2X3ByaXYtPm1tLnBpbl9tZW1vcnkgLT0gc2l6ZTsKLX0KLQogaW50CiBpOTE1X2dlbV9jaGVja19pc193ZWRnZWQoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKQEAgLTE0MCw3ICsxMDUsNyBAQAogCXJldHVybiAtRUlPOwogfQogCi1zdGF0aWMgaW50IGk5MTVfbXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCitpbnQgaTkxNV9tdXRleF9sb2NrX2ludGVycnVwdGlibGUoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCWludCByZXQ7CkBAIC0xNjMsNzUgKzEyOCw3NiBAQAogfQogCiBzdGF0aWMgaW5saW5lIGJvb2wKLWk5MTVfZ2VtX29iamVjdF9pc19pbmFjdGl2ZShzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqX3ByaXYpCitpOTE1X2dlbV9vYmplY3RfaXNfaW5hY3RpdmUoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaikKIHsKLQlyZXR1cm4gb2JqX3ByaXYtPmd0dF9zcGFjZSAmJgotCQkhb2JqX3ByaXYtPmFjdGl2ZSAmJgotCQlvYmpfcHJpdi0+cGluX2NvdW50ID09IDA7CisJcmV0dXJuIG9iai0+Z3R0X3NwYWNlICYmICFvYmotPmFjdGl2ZSAmJiBvYmotPnBpbl9jb3VudCA9PSAwOwogfQogCi1pbnQgaTkxNV9nZW1fZG9faW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAotCQkgICAgIHVuc2lnbmVkIGxvbmcgc3RhcnQsCi0JCSAgICAgdW5zaWduZWQgbG9uZyBlbmQpCit2b2lkIGk5MTVfZ2VtX2RvX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKKwkJICAgICAgdW5zaWduZWQgbG9uZyBzdGFydCwKKwkJICAgICAgdW5zaWduZWQgbG9uZyBtYXBwYWJsZV9lbmQsCisJCSAgICAgIHVuc2lnbmVkIGxvbmcgZW5kKQogewogCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCi0JaWYgKHN0YXJ0ID49IGVuZCB8fAotCSAgICAoc3RhcnQgJiAoUEFHRV9TSVpFIC0gMSkpICE9IDAgfHwKLQkgICAgKGVuZCAmIChQQUdFX1NJWkUgLSAxKSkgIT0gMCkgewotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KIAlkcm1fbW1faW5pdCgmZGV2X3ByaXYtPm1tLmd0dF9zcGFjZSwgc3RhcnQsCiAJCSAgICBlbmQgLSBzdGFydCk7CiAKIAlkZXZfcHJpdi0+bW0uZ3R0X3RvdGFsID0gZW5kIC0gc3RhcnQ7Ci0KLQlyZXR1cm4gMDsKKwlkZXZfcHJpdi0+bW0ubWFwcGFibGVfZ3R0X3RvdGFsID0gbWluKGVuZCwgbWFwcGFibGVfZW5kKSAtIHN0YXJ0OworCWRldl9wcml2LT5tbS5ndHRfbWFwcGFibGVfZW5kID0gbWFwcGFibGVfZW5kOwogfQogCiBpbnQKIGk5MTVfZ2VtX2luaXRfaW9jdGwoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdm9pZCAqZGF0YSwKLQkJICAgIHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2KQorCQkgICAgc3RydWN0IGRybV9maWxlICpmaWxlKQogewogCXN0cnVjdCBkcm1faTkxNV9nZW1faW5pdCAqYXJncyA9IGRhdGE7Ci0JaW50IHJldDsKKworCWlmIChhcmdzLT5ndHRfc3RhcnQgPj0gYXJncy0+Z3R0X2VuZCB8fAorCSAgICAoYXJncy0+Z3R0X2VuZCB8IGFyZ3MtPmd0dF9zdGFydCkgJiAoUEFHRV9TSVpFIC0gMSkpCisJCXJldHVybiAtRUlOVkFMOwogCiAJbXV0ZXhfbG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwotCXJldCA9IGk5MTVfZ2VtX2RvX2luaXQoZGV2LCBhcmdzLT5ndHRfc3RhcnQsIGFyZ3MtPmd0dF9lbmQpOwotCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotaW50Ci1pOTE1X2dlbV9nZXRfYXBlcnR1cmVfaW9jdGwoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdm9pZCAqZGF0YSwKLQkJCSAgICBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdikKLXsKLQlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCXN0cnVjdCBkcm1faTkxNV9nZW1fZ2V0X2FwZXJ0dXJlICphcmdzID0gZGF0YTsKLQotCWlmICghKGRldi0+ZHJpdmVyLT5kcml2ZXJfZmVhdHVyZXMgJiBEUklWRVJfR0VNKSkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQltdXRleF9sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7Ci0JYXJncy0+YXBlcl9zaXplID0gZGV2X3ByaXYtPm1tLmd0dF90b3RhbDsKLQlhcmdzLT5hcGVyX2F2YWlsYWJsZV9zaXplID0gYXJncy0+YXBlcl9zaXplIC0gZGV2X3ByaXYtPm1tLnBpbl9tZW1vcnk7CisJaTkxNV9nZW1fZG9faW5pdChkZXYsIGFyZ3MtPmd0dF9zdGFydCwgYXJncy0+Z3R0X2VuZCwgYXJncy0+Z3R0X2VuZCk7CiAJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CiAKIAlyZXR1cm4gMDsKIH0KIAoraW50CitpOTE1X2dlbV9nZXRfYXBlcnR1cmVfaW9jdGwoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdm9pZCAqZGF0YSwKKwkJCSAgICBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGUpCit7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX2dldF9hcGVydHVyZSAqYXJncyA9IGRhdGE7CisJc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iajsKKwlzaXplX3QgcGlubmVkOworCisJaWYgKCEoZGV2LT5kcml2ZXItPmRyaXZlcl9mZWF0dXJlcyAmIERSSVZFUl9HRU0pKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXBpbm5lZCA9IDA7CisJbXV0ZXhfbG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOworCWxpc3RfZm9yX2VhY2hfZW50cnkob2JqLCAmZGV2X3ByaXYtPm1tLnBpbm5lZF9saXN0LCBtbV9saXN0KQorCQlwaW5uZWQgKz0gb2JqLT5ndHRfc3BhY2UtPnNpemU7CisJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CisKKwlhcmdzLT5hcGVyX3NpemUgPSBkZXZfcHJpdi0+bW0uZ3R0X3RvdGFsOworCWFyZ3MtPmFwZXJfYXZhaWxhYmxlX3NpemUgPSBhcmdzLT5hcGVyX3NpemUgLXBpbm5lZDsKKworCXJldHVybiAwOworfQogCiAvKioKICAqIENyZWF0ZXMgYSBuZXcgbW0gb2JqZWN0IGFuZCByZXR1cm5zIGEgaGFuZGxlIHRvIGl0LgogICovCiBpbnQKIGk5MTVfZ2VtX2NyZWF0ZV9pb2N0bChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB2b2lkICpkYXRhLAotCQkgICAgICBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdikKKwkJICAgICAgc3RydWN0IGRybV9maWxlICpmaWxlKQogewogCXN0cnVjdCBkcm1faTkxNV9nZW1fY3JlYXRlICphcmdzID0gZGF0YTsKLQlzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iajsKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqOwogCWludCByZXQ7CiAJdTMyIGhhbmRsZTsKIApAQCAtMjQyLDQ1ICsyMDgsMjggQEAKIAlpZiAob2JqID09IE5VTEwpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JcmV0ID0gZHJtX2dlbV9oYW5kbGVfY3JlYXRlKGZpbGVfcHJpdiwgb2JqLCAmaGFuZGxlKTsKKwlyZXQgPSBkcm1fZ2VtX2hhbmRsZV9jcmVhdGUoZmlsZSwgJm9iai0+YmFzZSwgJmhhbmRsZSk7CiAJaWYgKHJldCkgewotCQlkcm1fZ2VtX29iamVjdF9yZWxlYXNlKG9iaik7Ci0JCWk5MTVfZ2VtX2luZm9fcmVtb3ZlX29iaihkZXYtPmRldl9wcml2YXRlLCBvYmotPnNpemUpOworCQlkcm1fZ2VtX29iamVjdF9yZWxlYXNlKCZvYmotPmJhc2UpOworCQlpOTE1X2dlbV9pbmZvX3JlbW92ZV9vYmooZGV2LT5kZXZfcHJpdmF0ZSwgb2JqLT5iYXNlLnNpemUpOwogCQlrZnJlZShvYmopOwogCQlyZXR1cm4gcmV0OwogCX0KIAogCS8qIGRyb3AgcmVmZXJlbmNlIGZyb20gYWxsb2NhdGUgLSBoYW5kbGUgaG9sZHMgaXQgbm93ICovCi0JZHJtX2dlbV9vYmplY3RfdW5yZWZlcmVuY2Uob2JqKTsKKwlkcm1fZ2VtX29iamVjdF91bnJlZmVyZW5jZSgmb2JqLT5iYXNlKTsKIAl0cmFjZV9pOTE1X2dlbV9vYmplY3RfY3JlYXRlKG9iaik7CiAKIAlhcmdzLT5oYW5kbGUgPSBoYW5kbGU7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50Ci1mYXN0X3NobWVtX3JlYWQoc3RydWN0IHBhZ2UgKipwYWdlcywKLQkJbG9mZl90IHBhZ2VfYmFzZSwgaW50IHBhZ2Vfb2Zmc2V0LAotCQljaGFyIF9fdXNlciAqZGF0YSwKLQkJaW50IGxlbmd0aCkKK3N0YXRpYyBpbnQgaTkxNV9nZW1fb2JqZWN0X25lZWRzX2JpdDE3X3N3aXp6bGUoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaikKIHsKLQljaGFyICp2YWRkcjsKLQlpbnQgcmV0OwotCi0JdmFkZHIgPSBrbWFwX2F0b21pYyhwYWdlc1twYWdlX2Jhc2UgPj4gUEFHRV9TSElGVF0pOwotCXJldCA9IF9fY29weV90b191c2VyX2luYXRvbWljKGRhdGEsIHZhZGRyICsgcGFnZV9vZmZzZXQsIGxlbmd0aCk7Ci0Ja3VubWFwX2F0b21pYyh2YWRkcik7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IGk5MTVfZ2VtX29iamVjdF9uZWVkc19iaXQxN19zd2l6emxlKHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqKQotewotCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBvYmotPmRldi0+ZGV2X3ByaXZhdGU7Ci0Jc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9ial9wcml2ID0gdG9faW50ZWxfYm8ob2JqKTsKKwlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gb2JqLT5iYXNlLmRldi0+ZGV2X3ByaXZhdGU7CiAKIAlyZXR1cm4gZGV2X3ByaXYtPm1tLmJpdF82X3N3aXp6bGVfeCA9PSBJOTE1X0JJVF82X1NXSVpaTEVfOV8xMF8xNyAmJgotCQlvYmpfcHJpdi0+dGlsaW5nX21vZGUgIT0gSTkxNV9USUxJTkdfTk9ORTsKKwkJb2JqLT50aWxpbmdfbW9kZSAhPSBJOTE1X1RJTElOR19OT05FOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQKQEAgLTM1NiwzOCArMzA1LDUxIEBACiAgKiBmYXVsdCwgaXQgZmFpbHMgc28gd2UgY2FuIGZhbGwgYmFjayB0byBpOTE1X2dlbV9zaG1lbV9wd3JpdGVfc2xvdygpLgogICovCiBzdGF0aWMgaW50Ci1pOTE1X2dlbV9zaG1lbV9wcmVhZF9mYXN0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqLAoraTkxNV9nZW1fc2htZW1fcHJlYWRfZmFzdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAorCQkJICBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqLAogCQkJICBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX3ByZWFkICphcmdzLAotCQkJICBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdikKKwkJCSAgc3RydWN0IGRybV9maWxlICpmaWxlKQogewotCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmpfcHJpdiA9IHRvX2ludGVsX2JvKG9iaik7CisJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBvYmotPmJhc2UuZmlscC0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZS0+aV9tYXBwaW5nOwogCXNzaXplX3QgcmVtYWluOwotCWxvZmZfdCBvZmZzZXQsIHBhZ2VfYmFzZTsKKwlsb2ZmX3Qgb2Zmc2V0OwogCWNoYXIgX191c2VyICp1c2VyX2RhdGE7CiAJaW50IHBhZ2Vfb2Zmc2V0LCBwYWdlX2xlbmd0aDsKIAogCXVzZXJfZGF0YSA9IChjaGFyIF9fdXNlciAqKSAodWludHB0cl90KSBhcmdzLT5kYXRhX3B0cjsKIAlyZW1haW4gPSBhcmdzLT5zaXplOwogCi0Jb2JqX3ByaXYgPSB0b19pbnRlbF9ibyhvYmopOwogCW9mZnNldCA9IGFyZ3MtPm9mZnNldDsKIAogCXdoaWxlIChyZW1haW4gPiAwKSB7CisJCXN0cnVjdCBwYWdlICpwYWdlOworCQljaGFyICp2YWRkcjsKKwkJaW50IHJldDsKKwogCQkvKiBPcGVyYXRpb24gaW4gdGhpcyBwYWdlCiAJCSAqCi0JCSAqIHBhZ2VfYmFzZSA9IHBhZ2Ugb2Zmc2V0IHdpdGhpbiBhcGVydHVyZQogCQkgKiBwYWdlX29mZnNldCA9IG9mZnNldCB3aXRoaW4gcGFnZQogCQkgKiBwYWdlX2xlbmd0aCA9IGJ5dGVzIHRvIGNvcHkgZm9yIHRoaXMgcGFnZQogCQkgKi8KLQkJcGFnZV9iYXNlID0gKG9mZnNldCAmIH4oUEFHRV9TSVpFLTEpKTsKIAkJcGFnZV9vZmZzZXQgPSBvZmZzZXQgJiAoUEFHRV9TSVpFLTEpOwogCQlwYWdlX2xlbmd0aCA9IHJlbWFpbjsKIAkJaWYgKChwYWdlX29mZnNldCArIHJlbWFpbikgPiBQQUdFX1NJWkUpCiAJCQlwYWdlX2xlbmd0aCA9IFBBR0VfU0laRSAtIHBhZ2Vfb2Zmc2V0OwogCi0JCWlmIChmYXN0X3NobWVtX3JlYWQob2JqX3ByaXYtPnBhZ2VzLAotCQkJCSAgICBwYWdlX2Jhc2UsIHBhZ2Vfb2Zmc2V0LAotCQkJCSAgICB1c2VyX2RhdGEsIHBhZ2VfbGVuZ3RoKSkKKwkJcGFnZSA9IHJlYWRfY2FjaGVfcGFnZV9nZnAobWFwcGluZywgb2Zmc2V0ID4+IFBBR0VfU0hJRlQsCisJCQkJCSAgIEdGUF9ISUdIVVNFUiB8IF9fR0ZQX1JFQ0xBSU1BQkxFKTsKKwkJaWYgKElTX0VSUihwYWdlKSkKKwkJCXJldHVybiBQVFJfRVJSKHBhZ2UpOworCisJCXZhZGRyID0ga21hcF9hdG9taWMocGFnZSk7CisJCXJldCA9IF9fY29weV90b191c2VyX2luYXRvbWljKHVzZXJfZGF0YSwKKwkJCQkJICAgICAgdmFkZHIgKyBwYWdlX29mZnNldCwKKwkJCQkJICAgICAgcGFnZV9sZW5ndGgpOworCQlrdW5tYXBfYXRvbWljKHZhZGRyKTsKKworCQltYXJrX3BhZ2VfYWNjZXNzZWQocGFnZSk7CisJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKKwkJaWYgKHJldCkKIAkJCXJldHVybiAtRUZBVUxUOwogCiAJCXJlbWFpbiAtPSBwYWdlX2xlbmd0aDsKQEAgLTM5OCwzMCArMzYwLDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludAotaTkxNV9nZW1fb2JqZWN0X2dldF9wYWdlc19vcl9ldmljdChzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iaikKLXsKLQlpbnQgcmV0OwotCi0JcmV0ID0gaTkxNV9nZW1fb2JqZWN0X2dldF9wYWdlcyhvYmosIF9fR0ZQX05PUkVUUlkgfCBfX0dGUF9OT1dBUk4pOwotCi0JLyogSWYgd2UndmUgaW5zdWZmaWNpZW50IG1lbW9yeSB0byBtYXAgaW4gdGhlIHBhZ2VzLCBhdHRlbXB0Ci0JICogdG8gbWFrZSBzb21lIHNwYWNlIGJ5IHRocm93aW5nIG91dCBzb21lIG9sZCBidWZmZXJzLgotCSAqLwotCWlmIChyZXQgPT0gLUVOT01FTSkgewotCQlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gb2JqLT5kZXY7Ci0KLQkJcmV0ID0gaTkxNV9nZW1fZXZpY3Rfc29tZXRoaW5nKGRldiwgb2JqLT5zaXplLAotCQkJCQkgICAgICAgaTkxNV9nZW1fZ2V0X2d0dF9hbGlnbm1lbnQob2JqKSk7Ci0JCWlmIChyZXQpCi0JCQlyZXR1cm4gcmV0OwotCi0JCXJldCA9IGk5MTVfZ2VtX29iamVjdF9nZXRfcGFnZXMob2JqLCAwKTsKLQl9Ci0KLQlyZXR1cm4gcmV0OwotfQotCiAvKioKICAqIFRoaXMgaXMgdGhlIGZhbGxiYWNrIHNobWVtIHByZWFkIHBhdGgsIHdoaWNoIGFsbG9jYXRlcyB0ZW1wb3Jhcnkgc3RvcmFnZQogICogaW4ga2VybmVsIHNwYWNlIHRvIGNvcHlfdG9fdXNlciBpbnRvIG91dHNpZGUgb2YgdGhlIHN0cnVjdF9tdXRleCwgc28gd2UKQEAgLTQyOSwxOCArMzY3LDE5IEBACiAgKiBhbmQgbm90IHRha2UgcGFnZSBmYXVsdHMuCiAgKi8KIHN0YXRpYyBpbnQKLWk5MTVfZ2VtX3NobWVtX3ByZWFkX3Nsb3coc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmosCitpOTE1X2dlbV9zaG1lbV9wcmVhZF9zbG93KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCisJCQkgIHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmosCiAJCQkgIHN0cnVjdCBkcm1faTkxNV9nZW1fcHJlYWQgKmFyZ3MsCi0JCQkgIHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2KQorCQkJICBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGUpCiB7Ci0Jc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9ial9wcml2ID0gdG9faW50ZWxfYm8ob2JqKTsKKwlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IG9iai0+YmFzZS5maWxwLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlLT5pX21hcHBpbmc7CiAJc3RydWN0IG1tX3N0cnVjdCAqbW0gPSBjdXJyZW50LT5tbTsKIAlzdHJ1Y3QgcGFnZSAqKnVzZXJfcGFnZXM7CiAJc3NpemVfdCByZW1haW47CiAJbG9mZl90IG9mZnNldCwgcGlubmVkX3BhZ2VzLCBpOwogCWxvZmZfdCBmaXJzdF9kYXRhX3BhZ2UsIGxhc3RfZGF0YV9wYWdlLCBudW1fcGFnZXM7Ci0JaW50IHNobWVtX3BhZ2VfaW5kZXgsIHNobWVtX3BhZ2Vfb2Zmc2V0OwotCWludCBkYXRhX3BhZ2VfaW5kZXgsICBkYXRhX3BhZ2Vfb2Zmc2V0OworCWludCBzaG1lbV9wYWdlX29mZnNldDsKKwlpbnQgZGF0YV9wYWdlX2luZGV4LCBkYXRhX3BhZ2Vfb2Zmc2V0OwogCWludCBwYWdlX2xlbmd0aDsKIAlpbnQgcmV0OwogCXVpbnQ2NF90IGRhdGFfcHRyID0gYXJncy0+ZGF0YV9wdHI7CkBAIC00NzksMTkgKzQxOCwxOCBAQAogCiAJZG9fYml0MTdfc3dpenpsaW5nID0gaTkxNV9nZW1fb2JqZWN0X25lZWRzX2JpdDE3X3N3aXp6bGUob2JqKTsKIAotCW9ial9wcml2ID0gdG9faW50ZWxfYm8ob2JqKTsKIAlvZmZzZXQgPSBhcmdzLT5vZmZzZXQ7CiAKIAl3aGlsZSAocmVtYWluID4gMCkgeworCQlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwogCQkvKiBPcGVyYXRpb24gaW4gdGhpcyBwYWdlCiAJCSAqCi0JCSAqIHNobWVtX3BhZ2VfaW5kZXggPSBwYWdlIG51bWJlciB3aXRoaW4gc2htZW0gZmlsZQogCQkgKiBzaG1lbV9wYWdlX29mZnNldCA9IG9mZnNldCB3aXRoaW4gcGFnZSBpbiBzaG1lbSBmaWxlCiAJCSAqIGRhdGFfcGFnZV9pbmRleCA9IHBhZ2UgbnVtYmVyIGluIGdldF91c2VyX3BhZ2VzIHJldHVybgogCQkgKiBkYXRhX3BhZ2Vfb2Zmc2V0ID0gb2Zmc2V0IHdpdGggZGF0YV9wYWdlX2luZGV4IHBhZ2UuCiAJCSAqIHBhZ2VfbGVuZ3RoID0gYnl0ZXMgdG8gY29weSBmb3IgdGhpcyBwYWdlCiAJCSAqLwotCQlzaG1lbV9wYWdlX2luZGV4ID0gb2Zmc2V0IC8gUEFHRV9TSVpFOwogCQlzaG1lbV9wYWdlX29mZnNldCA9IG9mZnNldCAmIH5QQUdFX01BU0s7CiAJCWRhdGFfcGFnZV9pbmRleCA9IGRhdGFfcHRyIC8gUEFHRV9TSVpFIC0gZmlyc3RfZGF0YV9wYWdlOwogCQlkYXRhX3BhZ2Vfb2Zmc2V0ID0gZGF0YV9wdHIgJiB+UEFHRV9NQVNLOwpAQCAtNTAyLDggKzQ0MCwxMyBAQAogCQlpZiAoKGRhdGFfcGFnZV9vZmZzZXQgKyBwYWdlX2xlbmd0aCkgPiBQQUdFX1NJWkUpCiAJCQlwYWdlX2xlbmd0aCA9IFBBR0VfU0laRSAtIGRhdGFfcGFnZV9vZmZzZXQ7CiAKKwkJcGFnZSA9IHJlYWRfY2FjaGVfcGFnZV9nZnAobWFwcGluZywgb2Zmc2V0ID4+IFBBR0VfU0hJRlQsCisJCQkJCSAgIEdGUF9ISUdIVVNFUiB8IF9fR0ZQX1JFQ0xBSU1BQkxFKTsKKwkJaWYgKElTX0VSUihwYWdlKSkKKwkJCXJldHVybiBQVFJfRVJSKHBhZ2UpOworCiAJCWlmIChkb19iaXQxN19zd2l6emxpbmcpIHsKLQkJCXNsb3dfc2htZW1fYml0MTdfY29weShvYmpfcHJpdi0+cGFnZXNbc2htZW1fcGFnZV9pbmRleF0sCisJCQlzbG93X3NobWVtX2JpdDE3X2NvcHkocGFnZSwKIAkJCQkJICAgICAgc2htZW1fcGFnZV9vZmZzZXQsCiAJCQkJCSAgICAgIHVzZXJfcGFnZXNbZGF0YV9wYWdlX2luZGV4XSwKIAkJCQkJICAgICAgZGF0YV9wYWdlX29mZnNldCwKQEAgLTUxMiwxMSArNDU1LDE0IEBACiAJCX0gZWxzZSB7CiAJCQlzbG93X3NobWVtX2NvcHkodXNlcl9wYWdlc1tkYXRhX3BhZ2VfaW5kZXhdLAogCQkJCQlkYXRhX3BhZ2Vfb2Zmc2V0LAotCQkJCQlvYmpfcHJpdi0+cGFnZXNbc2htZW1fcGFnZV9pbmRleF0sCisJCQkJCXBhZ2UsCiAJCQkJCXNobWVtX3BhZ2Vfb2Zmc2V0LAogCQkJCQlwYWdlX2xlbmd0aCk7CiAJCX0KIAorCQltYXJrX3BhZ2VfYWNjZXNzZWQocGFnZSk7CisJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKKwogCQlyZW1haW4gLT0gcGFnZV9sZW5ndGg7CiAJCWRhdGFfcHRyICs9IHBhZ2VfbGVuZ3RoOwogCQlvZmZzZXQgKz0gcGFnZV9sZW5ndGg7CkBAIC01MjUsNiArNDcxLDcgQEAKIG91dDoKIAlmb3IgKGkgPSAwOyBpIDwgcGlubmVkX3BhZ2VzOyBpKyspIHsKIAkJU2V0UGFnZURpcnR5KHVzZXJfcGFnZXNbaV0pOworCQltYXJrX3BhZ2VfYWNjZXNzZWQodXNlcl9wYWdlc1tpXSk7CiAJCXBhZ2VfY2FjaGVfcmVsZWFzZSh1c2VyX3BhZ2VzW2ldKTsKIAl9CiAJZHJtX2ZyZWVfbGFyZ2UodXNlcl9wYWdlcyk7CkBAIC01MzksMTEgKzQ4NiwxMCBAQAogICovCiBpbnQKIGk5MTVfZ2VtX3ByZWFkX2lvY3RsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEsCi0JCSAgICAgc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYpCisJCSAgICAgc3RydWN0IGRybV9maWxlICpmaWxlKQogewogCXN0cnVjdCBkcm1faTkxNV9nZW1fcHJlYWQgKmFyZ3MgPSBkYXRhOwotCXN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqOwotCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmpfcHJpdjsKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqOwogCWludCByZXQgPSAwOwogCiAJaWYgKGFyZ3MtPnNpemUgPT0gMCkKQEAgLTU2MywzOSArNTA5LDMzIEBACiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAotCW9iaiA9IGRybV9nZW1fb2JqZWN0X2xvb2t1cChkZXYsIGZpbGVfcHJpdiwgYXJncy0+aGFuZGxlKTsKKwlvYmogPSB0b19pbnRlbF9ibyhkcm1fZ2VtX29iamVjdF9sb29rdXAoZGV2LCBmaWxlLCBhcmdzLT5oYW5kbGUpKTsKIAlpZiAob2JqID09IE5VTEwpIHsKIAkJcmV0ID0gLUVOT0VOVDsKIAkJZ290byB1bmxvY2s7CiAJfQotCW9ial9wcml2ID0gdG9faW50ZWxfYm8ob2JqKTsKIAogCS8qIEJvdW5kcyBjaGVjayBzb3VyY2UuICAqLwotCWlmIChhcmdzLT5vZmZzZXQgPiBvYmotPnNpemUgfHwgYXJncy0+c2l6ZSA+IG9iai0+c2l6ZSAtIGFyZ3MtPm9mZnNldCkgeworCWlmIChhcmdzLT5vZmZzZXQgPiBvYmotPmJhc2Uuc2l6ZSB8fAorCSAgICBhcmdzLT5zaXplID4gb2JqLT5iYXNlLnNpemUgLSBhcmdzLT5vZmZzZXQpIHsKIAkJcmV0ID0gLUVJTlZBTDsKIAkJZ290byBvdXQ7CiAJfQogCi0JcmV0ID0gaTkxNV9nZW1fb2JqZWN0X2dldF9wYWdlc19vcl9ldmljdChvYmopOwotCWlmIChyZXQpCi0JCWdvdG8gb3V0OwotCiAJcmV0ID0gaTkxNV9nZW1fb2JqZWN0X3NldF9jcHVfcmVhZF9kb21haW5fcmFuZ2Uob2JqLAogCQkJCQkJCWFyZ3MtPm9mZnNldCwKIAkJCQkJCQlhcmdzLT5zaXplKTsKIAlpZiAocmV0KQotCQlnb3RvIG91dF9wdXQ7CisJCWdvdG8gb3V0OwogCiAJcmV0ID0gLUVGQVVMVDsKIAlpZiAoIWk5MTVfZ2VtX29iamVjdF9uZWVkc19iaXQxN19zd2l6emxlKG9iaikpCi0JCXJldCA9IGk5MTVfZ2VtX3NobWVtX3ByZWFkX2Zhc3QoZGV2LCBvYmosIGFyZ3MsIGZpbGVfcHJpdik7CisJCXJldCA9IGk5MTVfZ2VtX3NobWVtX3ByZWFkX2Zhc3QoZGV2LCBvYmosIGFyZ3MsIGZpbGUpOwogCWlmIChyZXQgPT0gLUVGQVVMVCkKLQkJcmV0ID0gaTkxNV9nZW1fc2htZW1fcHJlYWRfc2xvdyhkZXYsIG9iaiwgYXJncywgZmlsZV9wcml2KTsKKwkJcmV0ID0gaTkxNV9nZW1fc2htZW1fcHJlYWRfc2xvdyhkZXYsIG9iaiwgYXJncywgZmlsZSk7CiAKLW91dF9wdXQ6Ci0JaTkxNV9nZW1fb2JqZWN0X3B1dF9wYWdlcyhvYmopOwogb3V0OgotCWRybV9nZW1fb2JqZWN0X3VucmVmZXJlbmNlKG9iaik7CisJZHJtX2dlbV9vYmplY3RfdW5yZWZlcmVuY2UoJm9iai0+YmFzZSk7CiB1bmxvY2s6CiAJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CiAJcmV0dXJuIHJldDsKQEAgLTY0NSwzMiArNTg1LDE2IEBACiAJaW9fbWFwcGluZ191bm1hcChkc3RfdmFkZHIpOwogfQogCi1zdGF0aWMgaW5saW5lIGludAotZmFzdF9zaG1lbV93cml0ZShzdHJ1Y3QgcGFnZSAqKnBhZ2VzLAotCQkgbG9mZl90IHBhZ2VfYmFzZSwgaW50IHBhZ2Vfb2Zmc2V0LAotCQkgY2hhciBfX3VzZXIgKmRhdGEsCi0JCSBpbnQgbGVuZ3RoKQotewotCWNoYXIgKnZhZGRyOwotCWludCByZXQ7Ci0KLQl2YWRkciA9IGttYXBfYXRvbWljKHBhZ2VzW3BhZ2VfYmFzZSA+PiBQQUdFX1NISUZUXSk7Ci0JcmV0ID0gX19jb3B5X2Zyb21fdXNlcl9pbmF0b21pYyh2YWRkciArIHBhZ2Vfb2Zmc2V0LCBkYXRhLCBsZW5ndGgpOwotCWt1bm1hcF9hdG9taWModmFkZHIpOwotCi0JcmV0dXJuIHJldDsKLX0KLQogLyoqCiAgKiBUaGlzIGlzIHRoZSBmYXN0IHB3cml0ZSBwYXRoLCB3aGVyZSB3ZSBjb3B5IHRoZSBkYXRhIGRpcmVjdGx5IGZyb20gdGhlCiAgKiB1c2VyIGludG8gdGhlIEdUVCwgdW5jYWNoZWQuCiAgKi8KIHN0YXRpYyBpbnQKLWk5MTVfZ2VtX2d0dF9wd3JpdGVfZmFzdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iaiwKK2k5MTVfZ2VtX2d0dF9wd3JpdGVfZmFzdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAorCQkJIHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmosCiAJCQkgc3RydWN0IGRybV9pOTE1X2dlbV9wd3JpdGUgKmFyZ3MsCi0JCQkgc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYpCisJCQkgc3RydWN0IGRybV9maWxlICpmaWxlKQogewotCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmpfcHJpdiA9IHRvX2ludGVsX2JvKG9iaik7CiAJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJc3NpemVfdCByZW1haW47CiAJbG9mZl90IG9mZnNldCwgcGFnZV9iYXNlOwpAQCAtNjgwLDggKzYwNCw3IEBACiAJdXNlcl9kYXRhID0gKGNoYXIgX191c2VyICopICh1aW50cHRyX3QpIGFyZ3MtPmRhdGFfcHRyOwogCXJlbWFpbiA9IGFyZ3MtPnNpemU7CiAKLQlvYmpfcHJpdiA9IHRvX2ludGVsX2JvKG9iaik7Ci0Jb2Zmc2V0ID0gb2JqX3ByaXYtPmd0dF9vZmZzZXQgKyBhcmdzLT5vZmZzZXQ7CisJb2Zmc2V0ID0gb2JqLT5ndHRfb2Zmc2V0ICsgYXJncy0+b2Zmc2V0OwogCiAJd2hpbGUgKHJlbWFpbiA+IDApIHsKIAkJLyogT3BlcmF0aW9uIGluIHRoaXMgcGFnZQpAQCAtNzIxLDExICs2NDQsMTEgQEAKICAqIHRoYW4gdXNpbmcgaTkxNV9nZW1fZ3R0X3B3cml0ZV9mYXN0IG9uIGEgRzQ1ICgzMi1iaXQpLgogICovCiBzdGF0aWMgaW50Ci1pOTE1X2dlbV9ndHRfcHdyaXRlX3Nsb3coc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmosCitpOTE1X2dlbV9ndHRfcHdyaXRlX3Nsb3coc3RydWN0IGRybV9kZXZpY2UgKmRldiwKKwkJCSBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqLAogCQkJIHN0cnVjdCBkcm1faTkxNV9nZW1fcHdyaXRlICphcmdzLAotCQkJIHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2KQorCQkJIHN0cnVjdCBkcm1fZmlsZSAqZmlsZSkKIHsKLQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqX3ByaXYgPSB0b19pbnRlbF9ibyhvYmopOwogCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXNzaXplX3QgcmVtYWluOwogCWxvZmZfdCBndHRfcGFnZV9iYXNlLCBvZmZzZXQ7CkBAIC03NjIsMTIgKzY4NSwxNSBAQAogCQlnb3RvIG91dF91bnBpbl9wYWdlczsKIAl9CiAKLQlyZXQgPSBpOTE1X2dlbV9vYmplY3Rfc2V0X3RvX2d0dF9kb21haW4ob2JqLCAxKTsKKwlyZXQgPSBpOTE1X2dlbV9vYmplY3Rfc2V0X3RvX2d0dF9kb21haW4ob2JqLCB0cnVlKTsKIAlpZiAocmV0KQogCQlnb3RvIG91dF91bnBpbl9wYWdlczsKIAotCW9ial9wcml2ID0gdG9faW50ZWxfYm8ob2JqKTsKLQlvZmZzZXQgPSBvYmpfcHJpdi0+Z3R0X29mZnNldCArIGFyZ3MtPm9mZnNldDsKKwlyZXQgPSBpOTE1X2dlbV9vYmplY3RfcHV0X2ZlbmNlKG9iaik7CisJaWYgKHJldCkKKwkJZ290byBvdXRfdW5waW5fcGFnZXM7CisKKwlvZmZzZXQgPSBvYmotPmd0dF9vZmZzZXQgKyBhcmdzLT5vZmZzZXQ7CiAKIAl3aGlsZSAocmVtYWluID4gMCkgewogCQkvKiBPcGVyYXRpb24gaW4gdGhpcyBwYWdlCkBAIC04MTMsMzkgKzczOSw1OCBAQAogICogY29weV9mcm9tX3VzZXIgaW50byB0aGUga21hcHBlZCBwYWdlcyBiYWNraW5nIHRoZSBvYmplY3QuCiAgKi8KIHN0YXRpYyBpbnQKLWk5MTVfZ2VtX3NobWVtX3B3cml0ZV9mYXN0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqLAoraTkxNV9nZW1fc2htZW1fcHdyaXRlX2Zhc3Qoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKKwkJCSAgIHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmosCiAJCQkgICBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX3B3cml0ZSAqYXJncywKLQkJCSAgIHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2KQorCQkJICAgc3RydWN0IGRybV9maWxlICpmaWxlKQogewotCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmpfcHJpdiA9IHRvX2ludGVsX2JvKG9iaik7CisJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBvYmotPmJhc2UuZmlscC0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZS0+aV9tYXBwaW5nOwogCXNzaXplX3QgcmVtYWluOwotCWxvZmZfdCBvZmZzZXQsIHBhZ2VfYmFzZTsKKwlsb2ZmX3Qgb2Zmc2V0OwogCWNoYXIgX191c2VyICp1c2VyX2RhdGE7CiAJaW50IHBhZ2Vfb2Zmc2V0LCBwYWdlX2xlbmd0aDsKIAogCXVzZXJfZGF0YSA9IChjaGFyIF9fdXNlciAqKSAodWludHB0cl90KSBhcmdzLT5kYXRhX3B0cjsKIAlyZW1haW4gPSBhcmdzLT5zaXplOwogCi0Jb2JqX3ByaXYgPSB0b19pbnRlbF9ibyhvYmopOwogCW9mZnNldCA9IGFyZ3MtPm9mZnNldDsKLQlvYmpfcHJpdi0+ZGlydHkgPSAxOworCW9iai0+ZGlydHkgPSAxOwogCiAJd2hpbGUgKHJlbWFpbiA+IDApIHsKKwkJc3RydWN0IHBhZ2UgKnBhZ2U7CisJCWNoYXIgKnZhZGRyOworCQlpbnQgcmV0OworCiAJCS8qIE9wZXJhdGlvbiBpbiB0aGlzIHBhZ2UKIAkJICoKLQkJICogcGFnZV9iYXNlID0gcGFnZSBvZmZzZXQgd2l0aGluIGFwZXJ0dXJlCiAJCSAqIHBhZ2Vfb2Zmc2V0ID0gb2Zmc2V0IHdpdGhpbiBwYWdlCiAJCSAqIHBhZ2VfbGVuZ3RoID0gYnl0ZXMgdG8gY29weSBmb3IgdGhpcyBwYWdlCiAJCSAqLwotCQlwYWdlX2Jhc2UgPSAob2Zmc2V0ICYgfihQQUdFX1NJWkUtMSkpOwogCQlwYWdlX29mZnNldCA9IG9mZnNldCAmIChQQUdFX1NJWkUtMSk7CiAJCXBhZ2VfbGVuZ3RoID0gcmVtYWluOwogCQlpZiAoKHBhZ2Vfb2Zmc2V0ICsgcmVtYWluKSA+IFBBR0VfU0laRSkKIAkJCXBhZ2VfbGVuZ3RoID0gUEFHRV9TSVpFIC0gcGFnZV9vZmZzZXQ7CiAKLQkJaWYgKGZhc3Rfc2htZW1fd3JpdGUob2JqX3ByaXYtPnBhZ2VzLAotCQkJCSAgICAgICBwYWdlX2Jhc2UsIHBhZ2Vfb2Zmc2V0LAotCQkJCSAgICAgICB1c2VyX2RhdGEsIHBhZ2VfbGVuZ3RoKSkKKwkJcGFnZSA9IHJlYWRfY2FjaGVfcGFnZV9nZnAobWFwcGluZywgb2Zmc2V0ID4+IFBBR0VfU0hJRlQsCisJCQkJCSAgIEdGUF9ISUdIVVNFUiB8IF9fR0ZQX1JFQ0xBSU1BQkxFKTsKKwkJaWYgKElTX0VSUihwYWdlKSkKKwkJCXJldHVybiBQVFJfRVJSKHBhZ2UpOworCisJCXZhZGRyID0ga21hcF9hdG9taWMocGFnZSwgS01fVVNFUjApOworCQlyZXQgPSBfX2NvcHlfZnJvbV91c2VyX2luYXRvbWljKHZhZGRyICsgcGFnZV9vZmZzZXQsCisJCQkJCQl1c2VyX2RhdGEsCisJCQkJCQlwYWdlX2xlbmd0aCk7CisJCWt1bm1hcF9hdG9taWModmFkZHIsIEtNX1VTRVIwKTsKKworCQlzZXRfcGFnZV9kaXJ0eShwYWdlKTsKKwkJbWFya19wYWdlX2FjY2Vzc2VkKHBhZ2UpOworCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CisKKwkJLyogSWYgd2UgZ2V0IGEgZmF1bHQgd2hpbGUgY29weWluZyBkYXRhLCB0aGVuIChwcmVzdW1hYmx5KSBvdXIKKwkJICogc291cmNlIHBhZ2UgaXNuJ3QgYXZhaWxhYmxlLiAgUmV0dXJuIHRoZSBlcnJvciBhbmQgd2UnbGwKKwkJICogcmV0cnkgaW4gdGhlIHNsb3cgcGF0aC4KKwkJICovCisJCWlmIChyZXQpCiAJCQlyZXR1cm4gLUVGQVVMVDsKIAogCQlyZW1haW4gLT0gcGFnZV9sZW5ndGg7CkBAIC04NjQsMTcgKzgwOSwxOCBAQAogICogc3RydWN0X211dGV4IGlzIGhlbGQuCiAgKi8KIHN0YXRpYyBpbnQKLWk5MTVfZ2VtX3NobWVtX3B3cml0ZV9zbG93KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqLAoraTkxNV9nZW1fc2htZW1fcHdyaXRlX3Nsb3coc3RydWN0IGRybV9kZXZpY2UgKmRldiwKKwkJCSAgIHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmosCiAJCQkgICBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX3B3cml0ZSAqYXJncywKLQkJCSAgIHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2KQorCQkJICAgc3RydWN0IGRybV9maWxlICpmaWxlKQogewotCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmpfcHJpdiA9IHRvX2ludGVsX2JvKG9iaik7CisJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBvYmotPmJhc2UuZmlscC0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZS0+aV9tYXBwaW5nOwogCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gY3VycmVudC0+bW07CiAJc3RydWN0IHBhZ2UgKip1c2VyX3BhZ2VzOwogCXNzaXplX3QgcmVtYWluOwogCWxvZmZfdCBvZmZzZXQsIHBpbm5lZF9wYWdlcywgaTsKIAlsb2ZmX3QgZmlyc3RfZGF0YV9wYWdlLCBsYXN0X2RhdGFfcGFnZSwgbnVtX3BhZ2VzOwotCWludCBzaG1lbV9wYWdlX2luZGV4LCBzaG1lbV9wYWdlX29mZnNldDsKKwlpbnQgc2htZW1fcGFnZV9vZmZzZXQ7CiAJaW50IGRhdGFfcGFnZV9pbmRleCwgIGRhdGFfcGFnZV9vZmZzZXQ7CiAJaW50IHBhZ2VfbGVuZ3RoOwogCWludCByZXQ7CkBAIC05MTIsMjAgKzg1OCwxOSBAQAogCiAJZG9fYml0MTdfc3dpenpsaW5nID0gaTkxNV9nZW1fb2JqZWN0X25lZWRzX2JpdDE3X3N3aXp6bGUob2JqKTsKIAotCW9ial9wcml2ID0gdG9faW50ZWxfYm8ob2JqKTsKIAlvZmZzZXQgPSBhcmdzLT5vZmZzZXQ7Ci0Jb2JqX3ByaXYtPmRpcnR5ID0gMTsKKwlvYmotPmRpcnR5ID0gMTsKIAogCXdoaWxlIChyZW1haW4gPiAwKSB7CisJCXN0cnVjdCBwYWdlICpwYWdlOworCiAJCS8qIE9wZXJhdGlvbiBpbiB0aGlzIHBhZ2UKIAkJICoKLQkJICogc2htZW1fcGFnZV9pbmRleCA9IHBhZ2UgbnVtYmVyIHdpdGhpbiBzaG1lbSBmaWxlCiAJCSAqIHNobWVtX3BhZ2Vfb2Zmc2V0ID0gb2Zmc2V0IHdpdGhpbiBwYWdlIGluIHNobWVtIGZpbGUKIAkJICogZGF0YV9wYWdlX2luZGV4ID0gcGFnZSBudW1iZXIgaW4gZ2V0X3VzZXJfcGFnZXMgcmV0dXJuCiAJCSAqIGRhdGFfcGFnZV9vZmZzZXQgPSBvZmZzZXQgd2l0aCBkYXRhX3BhZ2VfaW5kZXggcGFnZS4KIAkJICogcGFnZV9sZW5ndGggPSBieXRlcyB0byBjb3B5IGZvciB0aGlzIHBhZ2UKIAkJICovCi0JCXNobWVtX3BhZ2VfaW5kZXggPSBvZmZzZXQgLyBQQUdFX1NJWkU7CiAJCXNobWVtX3BhZ2Vfb2Zmc2V0ID0gb2Zmc2V0ICYgflBBR0VfTUFTSzsKIAkJZGF0YV9wYWdlX2luZGV4ID0gZGF0YV9wdHIgLyBQQUdFX1NJWkUgLSBmaXJzdF9kYXRhX3BhZ2U7CiAJCWRhdGFfcGFnZV9vZmZzZXQgPSBkYXRhX3B0ciAmIH5QQUdFX01BU0s7CkBAIC05MzYsMjEgKzg4MSwzMiBAQAogCQlpZiAoKGRhdGFfcGFnZV9vZmZzZXQgKyBwYWdlX2xlbmd0aCkgPiBQQUdFX1NJWkUpCiAJCQlwYWdlX2xlbmd0aCA9IFBBR0VfU0laRSAtIGRhdGFfcGFnZV9vZmZzZXQ7CiAKKwkJcGFnZSA9IHJlYWRfY2FjaGVfcGFnZV9nZnAobWFwcGluZywgb2Zmc2V0ID4+IFBBR0VfU0hJRlQsCisJCQkJCSAgIEdGUF9ISUdIVVNFUiB8IF9fR0ZQX1JFQ0xBSU1BQkxFKTsKKwkJaWYgKElTX0VSUihwYWdlKSkgeworCQkJcmV0ID0gUFRSX0VSUihwYWdlKTsKKwkJCWdvdG8gb3V0OworCQl9CisKIAkJaWYgKGRvX2JpdDE3X3N3aXp6bGluZykgewotCQkJc2xvd19zaG1lbV9iaXQxN19jb3B5KG9ial9wcml2LT5wYWdlc1tzaG1lbV9wYWdlX2luZGV4XSwKKwkJCXNsb3dfc2htZW1fYml0MTdfY29weShwYWdlLAogCQkJCQkgICAgICBzaG1lbV9wYWdlX29mZnNldCwKIAkJCQkJICAgICAgdXNlcl9wYWdlc1tkYXRhX3BhZ2VfaW5kZXhdLAogCQkJCQkgICAgICBkYXRhX3BhZ2Vfb2Zmc2V0LAogCQkJCQkgICAgICBwYWdlX2xlbmd0aCwKIAkJCQkJICAgICAgMCk7CiAJCX0gZWxzZSB7Ci0JCQlzbG93X3NobWVtX2NvcHkob2JqX3ByaXYtPnBhZ2VzW3NobWVtX3BhZ2VfaW5kZXhdLAorCQkJc2xvd19zaG1lbV9jb3B5KHBhZ2UsCiAJCQkJCXNobWVtX3BhZ2Vfb2Zmc2V0LAogCQkJCQl1c2VyX3BhZ2VzW2RhdGFfcGFnZV9pbmRleF0sCiAJCQkJCWRhdGFfcGFnZV9vZmZzZXQsCiAJCQkJCXBhZ2VfbGVuZ3RoKTsKIAkJfQogCisJCXNldF9wYWdlX2RpcnR5KHBhZ2UpOworCQltYXJrX3BhZ2VfYWNjZXNzZWQocGFnZSk7CisJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKKwogCQlyZW1haW4gLT0gcGFnZV9sZW5ndGg7CiAJCWRhdGFfcHRyICs9IHBhZ2VfbGVuZ3RoOwogCQlvZmZzZXQgKz0gcGFnZV9sZW5ndGg7CkBAIC05NzQsOCArOTMwLDcgQEAKIAkJICAgICAgc3RydWN0IGRybV9maWxlICpmaWxlKQogewogCXN0cnVjdCBkcm1faTkxNV9nZW1fcHdyaXRlICphcmdzID0gZGF0YTsKLQlzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iajsKLQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqX3ByaXY7CisJc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iajsKIAlpbnQgcmV0OwogCiAJaWYgKGFyZ3MtPnNpemUgPT0gMCkKQEAgLTk5NSwxNSArOTUwLDE1IEBACiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAotCW9iaiA9IGRybV9nZW1fb2JqZWN0X2xvb2t1cChkZXYsIGZpbGUsIGFyZ3MtPmhhbmRsZSk7CisJb2JqID0gdG9faW50ZWxfYm8oZHJtX2dlbV9vYmplY3RfbG9va3VwKGRldiwgZmlsZSwgYXJncy0+aGFuZGxlKSk7CiAJaWYgKG9iaiA9PSBOVUxMKSB7CiAJCXJldCA9IC1FTk9FTlQ7CiAJCWdvdG8gdW5sb2NrOwogCX0KLQlvYmpfcHJpdiA9IHRvX2ludGVsX2JvKG9iaik7CiAKIAkvKiBCb3VuZHMgY2hlY2sgZGVzdGluYXRpb24uICovCi0JaWYgKGFyZ3MtPm9mZnNldCA+IG9iai0+c2l6ZSB8fCBhcmdzLT5zaXplID4gb2JqLT5zaXplIC0gYXJncy0+b2Zmc2V0KSB7CisJaWYgKGFyZ3MtPm9mZnNldCA+IG9iai0+YmFzZS5zaXplIHx8CisJICAgIGFyZ3MtPnNpemUgPiBvYmotPmJhc2Uuc2l6ZSAtIGFyZ3MtPm9mZnNldCkgewogCQlyZXQgPSAtRUlOVkFMOwogCQlnb3RvIG91dDsKIAl9CkBAIC0xMDE0LDE2ICs5NjksMTkgQEAKIAkgKiBwcmVhZC9wd3JpdGUgY3VycmVudGx5IGFyZSByZWFkaW5nIGFuZCB3cml0aW5nIGZyb20gdGhlIENQVQogCSAqIHBlcnNwZWN0aXZlLCByZXF1aXJpbmcgbWFudWFsIGRldGlsaW5nIGJ5IHRoZSBjbGllbnQuCiAJICovCi0JaWYgKG9ial9wcml2LT5waHlzX29iaikKKwlpZiAob2JqLT5waHlzX29iaikKIAkJcmV0ID0gaTkxNV9nZW1fcGh5c19wd3JpdGUoZGV2LCBvYmosIGFyZ3MsIGZpbGUpOwotCWVsc2UgaWYgKG9ial9wcml2LT50aWxpbmdfbW9kZSA9PSBJOTE1X1RJTElOR19OT05FICYmCi0JCSBvYmpfcHJpdi0+Z3R0X3NwYWNlICYmCi0JCSBvYmotPndyaXRlX2RvbWFpbiAhPSBJOTE1X0dFTV9ET01BSU5fQ1BVKSB7Ci0JCXJldCA9IGk5MTVfZ2VtX29iamVjdF9waW4ob2JqLCAwKTsKKwllbHNlIGlmIChvYmotPmd0dF9zcGFjZSAmJgorCQkgb2JqLT5iYXNlLndyaXRlX2RvbWFpbiAhPSBJOTE1X0dFTV9ET01BSU5fQ1BVKSB7CisJCXJldCA9IGk5MTVfZ2VtX29iamVjdF9waW4ob2JqLCAwLCB0cnVlKTsKIAkJaWYgKHJldCkKIAkJCWdvdG8gb3V0OwogCi0JCXJldCA9IGk5MTVfZ2VtX29iamVjdF9zZXRfdG9fZ3R0X2RvbWFpbihvYmosIDEpOworCQlyZXQgPSBpOTE1X2dlbV9vYmplY3Rfc2V0X3RvX2d0dF9kb21haW4ob2JqLCB0cnVlKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gb3V0X3VucGluOworCisJCXJldCA9IGk5MTVfZ2VtX29iamVjdF9wdXRfZmVuY2Uob2JqKTsKIAkJaWYgKHJldCkKIAkJCWdvdG8gb3V0X3VucGluOwogCkBAIC0xMDM0LDI2ICs5OTIsMTkgQEAKIG91dF91bnBpbjoKIAkJaTkxNV9nZW1fb2JqZWN0X3VucGluKG9iaik7CiAJfSBlbHNlIHsKLQkJcmV0ID0gaTkxNV9nZW1fb2JqZWN0X2dldF9wYWdlc19vcl9ldmljdChvYmopOwotCQlpZiAocmV0KQotCQkJZ290byBvdXQ7Ci0KIAkJcmV0ID0gaTkxNV9nZW1fb2JqZWN0X3NldF90b19jcHVfZG9tYWluKG9iaiwgMSk7CiAJCWlmIChyZXQpCi0JCQlnb3RvIG91dF9wdXQ7CisJCQlnb3RvIG91dDsKIAogCQlyZXQgPSAtRUZBVUxUOwogCQlpZiAoIWk5MTVfZ2VtX29iamVjdF9uZWVkc19iaXQxN19zd2l6emxlKG9iaikpCiAJCQlyZXQgPSBpOTE1X2dlbV9zaG1lbV9wd3JpdGVfZmFzdChkZXYsIG9iaiwgYXJncywgZmlsZSk7CiAJCWlmIChyZXQgPT0gLUVGQVVMVCkKIAkJCXJldCA9IGk5MTVfZ2VtX3NobWVtX3B3cml0ZV9zbG93KGRldiwgb2JqLCBhcmdzLCBmaWxlKTsKLQotb3V0X3B1dDoKLQkJaTkxNV9nZW1fb2JqZWN0X3B1dF9wYWdlcyhvYmopOwogCX0KIAogb3V0OgotCWRybV9nZW1fb2JqZWN0X3VucmVmZXJlbmNlKG9iaik7CisJZHJtX2dlbV9vYmplY3RfdW5yZWZlcmVuY2UoJm9iai0+YmFzZSk7CiB1bmxvY2s6CiAJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CiAJcmV0dXJuIHJldDsKQEAgLTEwNjUsMTIgKzEwMTYsMTAgQEAKICAqLwogaW50CiBpOTE1X2dlbV9zZXRfZG9tYWluX2lvY3RsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEsCi0JCQkgIHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2KQorCQkJICBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGUpCiB7Ci0Jc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX3NldF9kb21haW4gKmFyZ3MgPSBkYXRhOwotCXN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqOwotCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmpfcHJpdjsKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqOwogCXVpbnQzMl90IHJlYWRfZG9tYWlucyA9IGFyZ3MtPnJlYWRfZG9tYWluczsKIAl1aW50MzJfdCB3cml0ZV9kb21haW4gPSBhcmdzLT53cml0ZV9kb21haW47CiAJaW50IHJldDsKQEAgLTEwOTUsMjggKzEwNDQsMTUgQEAKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCi0Jb2JqID0gZHJtX2dlbV9vYmplY3RfbG9va3VwKGRldiwgZmlsZV9wcml2LCBhcmdzLT5oYW5kbGUpOworCW9iaiA9IHRvX2ludGVsX2JvKGRybV9nZW1fb2JqZWN0X2xvb2t1cChkZXYsIGZpbGUsIGFyZ3MtPmhhbmRsZSkpOwogCWlmIChvYmogPT0gTlVMTCkgewogCQlyZXQgPSAtRU5PRU5UOwogCQlnb3RvIHVubG9jazsKIAl9Ci0Jb2JqX3ByaXYgPSB0b19pbnRlbF9ibyhvYmopOwotCi0JaW50ZWxfbWFya19idXN5KGRldiwgb2JqKTsKIAogCWlmIChyZWFkX2RvbWFpbnMgJiBJOTE1X0dFTV9ET01BSU5fR1RUKSB7CiAJCXJldCA9IGk5MTVfZ2VtX29iamVjdF9zZXRfdG9fZ3R0X2RvbWFpbihvYmosIHdyaXRlX2RvbWFpbiAhPSAwKTsKIAotCQkvKiBVcGRhdGUgdGhlIExSVSBvbiB0aGUgZmVuY2UgZm9yIHRoZSBDUFUgYWNjZXNzIHRoYXQncwotCQkgKiBhYm91dCB0byBvY2N1ci4KLQkJICovCi0JCWlmIChvYmpfcHJpdi0+ZmVuY2VfcmVnICE9IEk5MTVfRkVOQ0VfUkVHX05PTkUpIHsKLQkJCXN0cnVjdCBkcm1faTkxNV9mZW5jZV9yZWcgKnJlZyA9Ci0JCQkJJmRldl9wcml2LT5mZW5jZV9yZWdzW29ial9wcml2LT5mZW5jZV9yZWddOwotCQkJbGlzdF9tb3ZlX3RhaWwoJnJlZy0+bHJ1X2xpc3QsCi0JCQkJICAgICAgICZkZXZfcHJpdi0+bW0uZmVuY2VfbGlzdCk7Ci0JCX0KLQogCQkvKiBTaWxlbnRseSBwcm9tb3RlICJ5b3UncmUgbm90IGJvdW5kLCB0aGVyZSB3YXMgbm90aGluZyB0byBkbyIKIAkJICogdG8gc3VjY2Vzcywgc2luY2UgdGhlIGNsaWVudCB3YXMganVzdCBhc2tpbmcgdXMgdG8KIAkJICogbWFrZSBzdXJlIGV2ZXJ5dGhpbmcgd2FzIGRvbmUuCkBAIC0xMTI3LDExICsxMDYzLDcgQEAKIAkJcmV0ID0gaTkxNV9nZW1fb2JqZWN0X3NldF90b19jcHVfZG9tYWluKG9iaiwgd3JpdGVfZG9tYWluICE9IDApOwogCX0KIAotCS8qIE1haW50YWluIExSVSBvcmRlciBvZiAiaW5hY3RpdmUiIG9iamVjdHMgKi8KLQlpZiAocmV0ID09IDAgJiYgaTkxNV9nZW1fb2JqZWN0X2lzX2luYWN0aXZlKG9ial9wcml2KSkKLQkJbGlzdF9tb3ZlX3RhaWwoJm9ial9wcml2LT5tbV9saXN0LCAmZGV2X3ByaXYtPm1tLmluYWN0aXZlX2xpc3QpOwotCi0JZHJtX2dlbV9vYmplY3RfdW5yZWZlcmVuY2Uob2JqKTsKKwlkcm1fZ2VtX29iamVjdF91bnJlZmVyZW5jZSgmb2JqLT5iYXNlKTsKIHVubG9jazoKIAltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKIAlyZXR1cm4gcmV0OwpAQCAtMTE0MiwxMCArMTA3NCwxMCBAQAogICovCiBpbnQKIGk5MTVfZ2VtX3N3X2ZpbmlzaF9pb2N0bChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB2b2lkICpkYXRhLAotCQkgICAgICBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdikKKwkJCSBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGUpCiB7CiAJc3RydWN0IGRybV9pOTE1X2dlbV9zd19maW5pc2ggKmFyZ3MgPSBkYXRhOwotCXN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqOworCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmo7CiAJaW50IHJldCA9IDA7CiAKIAlpZiAoIShkZXYtPmRyaXZlci0+ZHJpdmVyX2ZlYXR1cmVzICYgRFJJVkVSX0dFTSkpCkBAIC0xMTU1LDE3ICsxMDg3LDE3IEBACiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAotCW9iaiA9IGRybV9nZW1fb2JqZWN0X2xvb2t1cChkZXYsIGZpbGVfcHJpdiwgYXJncy0+aGFuZGxlKTsKKwlvYmogPSB0b19pbnRlbF9ibyhkcm1fZ2VtX29iamVjdF9sb29rdXAoZGV2LCBmaWxlLCBhcmdzLT5oYW5kbGUpKTsKIAlpZiAob2JqID09IE5VTEwpIHsKIAkJcmV0ID0gLUVOT0VOVDsKIAkJZ290byB1bmxvY2s7CiAJfQogCiAJLyogUGlubmVkIGJ1ZmZlcnMgbWF5IGJlIHNjYW5vdXQsIHNvIGZsdXNoIHRoZSBjYWNoZSAqLwotCWlmICh0b19pbnRlbF9ibyhvYmopLT5waW5fY291bnQpCisJaWYgKG9iai0+cGluX2NvdW50KQogCQlpOTE1X2dlbV9vYmplY3RfZmx1c2hfY3B1X3dyaXRlX2RvbWFpbihvYmopOwogCi0JZHJtX2dlbV9vYmplY3RfdW5yZWZlcmVuY2Uob2JqKTsKKwlkcm1fZ2VtX29iamVjdF91bnJlZmVyZW5jZSgmb2JqLT5iYXNlKTsKIHVubG9jazoKIAltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKIAlyZXR1cm4gcmV0OwpAQCAtMTE4MCw4ICsxMTEyLDkgQEAKICAqLwogaW50CiBpOTE1X2dlbV9tbWFwX2lvY3RsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEsCi0JCSAgIHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2KQorCQkgICAgc3RydWN0IGRybV9maWxlICpmaWxlKQogeworCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJc3RydWN0IGRybV9pOTE1X2dlbV9tbWFwICphcmdzID0gZGF0YTsKIAlzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iajsKIAlsb2ZmX3Qgb2Zmc2V0OwpAQCAtMTE5MCwxMCArMTEyMywxNSBAQAogCWlmICghKGRldi0+ZHJpdmVyLT5kcml2ZXJfZmVhdHVyZXMgJiBEUklWRVJfR0VNKSkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKLQlvYmogPSBkcm1fZ2VtX29iamVjdF9sb29rdXAoZGV2LCBmaWxlX3ByaXYsIGFyZ3MtPmhhbmRsZSk7CisJb2JqID0gZHJtX2dlbV9vYmplY3RfbG9va3VwKGRldiwgZmlsZSwgYXJncy0+aGFuZGxlKTsKIAlpZiAob2JqID09IE5VTEwpCiAJCXJldHVybiAtRU5PRU5UOwogCisJaWYgKG9iai0+c2l6ZSA+IGRldl9wcml2LT5tbS5ndHRfbWFwcGFibGVfZW5kKSB7CisJCWRybV9nZW1fb2JqZWN0X3VucmVmZXJlbmNlX3VubG9ja2VkKG9iaik7CisJCXJldHVybiAtRTJCSUc7CisJfQorCiAJb2Zmc2V0ID0gYXJncy0+b2Zmc2V0OwogCiAJZG93bl93cml0ZSgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKQEAgLTEyMjgsMTAgKzExNjYsOSBAQAogICovCiBpbnQgaTkxNV9nZW1fZmF1bHQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHN0cnVjdCB2bV9mYXVsdCAqdm1mKQogewotCXN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqID0gdm1hLT52bV9wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IG9iai0+ZGV2OworCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmogPSB0b19pbnRlbF9ibyh2bWEtPnZtX3ByaXZhdGVfZGF0YSk7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IG9iai0+YmFzZS5kZXY7CiAJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Ci0Jc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9ial9wcml2ID0gdG9faW50ZWxfYm8ob2JqKTsKIAlwZ29mZl90IHBhZ2Vfb2Zmc2V0OwogCXVuc2lnbmVkIGxvbmcgcGZuOwogCWludCByZXQgPSAwOwpAQCAtMTI0MywyNyArMTE4MCwzNSBAQAogCiAJLyogTm93IGJpbmQgaXQgaW50byB0aGUgR1RUIGlmIG5lZWRlZCAqLwogCW11dGV4X2xvY2soJmRldi0+c3RydWN0X211dGV4KTsKLQlpZiAoIW9ial9wcml2LT5ndHRfc3BhY2UpIHsKLQkJcmV0ID0gaTkxNV9nZW1fb2JqZWN0X2JpbmRfdG9fZ3R0KG9iaiwgMCk7CisKKwlpZiAoIW9iai0+bWFwX2FuZF9mZW5jZWFibGUpIHsKKwkJcmV0ID0gaTkxNV9nZW1fb2JqZWN0X3VuYmluZChvYmopOwogCQlpZiAocmV0KQogCQkJZ290byB1bmxvY2s7Ci0KLQkJcmV0ID0gaTkxNV9nZW1fb2JqZWN0X3NldF90b19ndHRfZG9tYWluKG9iaiwgd3JpdGUpOworCX0KKwlpZiAoIW9iai0+Z3R0X3NwYWNlKSB7CisJCXJldCA9IGk5MTVfZ2VtX29iamVjdF9iaW5kX3RvX2d0dChvYmosIDAsIHRydWUpOwogCQlpZiAocmV0KQogCQkJZ290byB1bmxvY2s7CiAJfQogCi0JLyogTmVlZCBhIG5ldyBmZW5jZSByZWdpc3Rlcj8gKi8KLQlpZiAob2JqX3ByaXYtPnRpbGluZ19tb2RlICE9IEk5MTVfVElMSU5HX05PTkUpIHsKLQkJcmV0ID0gaTkxNV9nZW1fb2JqZWN0X2dldF9mZW5jZV9yZWcob2JqLCB0cnVlKTsKLQkJaWYgKHJldCkKLQkJCWdvdG8gdW5sb2NrOwotCX0KKwlyZXQgPSBpOTE1X2dlbV9vYmplY3Rfc2V0X3RvX2d0dF9kb21haW4ob2JqLCB3cml0ZSk7CisJaWYgKHJldCkKKwkJZ290byB1bmxvY2s7CiAKLQlpZiAoaTkxNV9nZW1fb2JqZWN0X2lzX2luYWN0aXZlKG9ial9wcml2KSkKLQkJbGlzdF9tb3ZlX3RhaWwoJm9ial9wcml2LT5tbV9saXN0LCAmZGV2X3ByaXYtPm1tLmluYWN0aXZlX2xpc3QpOworCWlmIChvYmotPnRpbGluZ19tb2RlID09IEk5MTVfVElMSU5HX05PTkUpCisJCXJldCA9IGk5MTVfZ2VtX29iamVjdF9wdXRfZmVuY2Uob2JqKTsKKwllbHNlCisJCXJldCA9IGk5MTVfZ2VtX29iamVjdF9nZXRfZmVuY2Uob2JqLCBOVUxMLCB0cnVlKTsKKwlpZiAocmV0KQorCQlnb3RvIHVubG9jazsKIAotCXBmbiA9ICgoZGV2LT5hZ3AtPmJhc2UgKyBvYmpfcHJpdi0+Z3R0X29mZnNldCkgPj4gUEFHRV9TSElGVCkgKworCWlmIChpOTE1X2dlbV9vYmplY3RfaXNfaW5hY3RpdmUob2JqKSkKKwkJbGlzdF9tb3ZlX3RhaWwoJm9iai0+bW1fbGlzdCwgJmRldl9wcml2LT5tbS5pbmFjdGl2ZV9saXN0KTsKKworCW9iai0+ZmF1bHRfbWFwcGFibGUgPSB0cnVlOworCisJcGZuID0gKChkZXYtPmFncC0+YmFzZSArIG9iai0+Z3R0X29mZnNldCkgPj4gUEFHRV9TSElGVCkgKwogCQlwYWdlX29mZnNldDsKIAogCS8qIEZpbmFsbHksIHJlbWFwIGl0IHVzaW5nIHRoZSBuZXcgR1RUIG9mZnNldCAqLwpAQCAtMTI3MiwxMSArMTIxNywxMiBAQAogCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwogCiAJc3dpdGNoIChyZXQpIHsKKwljYXNlIC1FQUdBSU46CisJCXNldF9uZWVkX3Jlc2NoZWQoKTsKIAljYXNlIDA6CiAJY2FzZSAtRVJFU1RBUlRTWVM6CiAJCXJldHVybiBWTV9GQVVMVF9OT1BBR0U7CiAJY2FzZSAtRU5PTUVNOgotCWNhc2UgLUVBR0FJTjoKIAkJcmV0dXJuIFZNX0ZBVUxUX09PTTsKIAlkZWZhdWx0OgogCQlyZXR1cm4gVk1fRkFVTFRfU0lHQlVTOwpAQCAtMTI5NSwzNyArMTI0MSwzOSBAQAogICogVGhpcyByb3V0aW5lIGFsbG9jYXRlcyBhbmQgYXR0YWNoZXMgYSBmYWtlIG9mZnNldCBmb3IgQG9iai4KICAqLwogc3RhdGljIGludAotaTkxNV9nZW1fY3JlYXRlX21tYXBfb2Zmc2V0KHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqKQoraTkxNV9nZW1fY3JlYXRlX21tYXBfb2Zmc2V0KHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmopCiB7Ci0Jc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IG9iai0+ZGV2OworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBvYmotPmJhc2UuZGV2OwogCXN0cnVjdCBkcm1fZ2VtX21tICptbSA9IGRldi0+bW1fcHJpdmF0ZTsKLQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqX3ByaXYgPSB0b19pbnRlbF9ibyhvYmopOwogCXN0cnVjdCBkcm1fbWFwX2xpc3QgKmxpc3Q7CiAJc3RydWN0IGRybV9sb2NhbF9tYXAgKm1hcDsKIAlpbnQgcmV0ID0gMDsKIAogCS8qIFNldCB0aGUgb2JqZWN0IHVwIGZvciBtbWFwJ2luZyAqLwotCWxpc3QgPSAmb2JqLT5tYXBfbGlzdDsKKwlsaXN0ID0gJm9iai0+YmFzZS5tYXBfbGlzdDsKIAlsaXN0LT5tYXAgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZHJtX21hcF9saXN0KSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFsaXN0LT5tYXApCiAJCXJldHVybiAtRU5PTUVNOwogCiAJbWFwID0gbGlzdC0+bWFwOwogCW1hcC0+dHlwZSA9IF9EUk1fR0VNOwotCW1hcC0+c2l6ZSA9IG9iai0+c2l6ZTsKKwltYXAtPnNpemUgPSBvYmotPmJhc2Uuc2l6ZTsKIAltYXAtPmhhbmRsZSA9IG9iajsKIAogCS8qIEdldCBhIERSTSBHRU0gbW1hcCBvZmZzZXQgYWxsb2NhdGVkLi4uICovCiAJbGlzdC0+ZmlsZV9vZmZzZXRfbm9kZSA9IGRybV9tbV9zZWFyY2hfZnJlZSgmbW0tPm9mZnNldF9tYW5hZ2VyLAotCQkJCQkJICAgIG9iai0+c2l6ZSAvIFBBR0VfU0laRSwgMCwgMCk7CisJCQkJCQkgICAgb2JqLT5iYXNlLnNpemUgLyBQQUdFX1NJWkUsCisJCQkJCQkgICAgMCwgMCk7CiAJaWYgKCFsaXN0LT5maWxlX29mZnNldF9ub2RlKSB7Ci0JCURSTV9FUlJPUigiZmFpbGVkIHRvIGFsbG9jYXRlIG9mZnNldCBmb3IgYm8gJWRcbiIsIG9iai0+bmFtZSk7CisJCURSTV9FUlJPUigiZmFpbGVkIHRvIGFsbG9jYXRlIG9mZnNldCBmb3IgYm8gJWRcbiIsCisJCQkgIG9iai0+YmFzZS5uYW1lKTsKIAkJcmV0ID0gLUVOT1NQQzsKIAkJZ290byBvdXRfZnJlZV9saXN0OwogCX0KIAogCWxpc3QtPmZpbGVfb2Zmc2V0X25vZGUgPSBkcm1fbW1fZ2V0X2Jsb2NrKGxpc3QtPmZpbGVfb2Zmc2V0X25vZGUsCi0JCQkJCQkgIG9iai0+c2l6ZSAvIFBBR0VfU0laRSwgMCk7CisJCQkJCQkgIG9iai0+YmFzZS5zaXplIC8gUEFHRV9TSVpFLAorCQkJCQkJICAwKTsKIAlpZiAoIWxpc3QtPmZpbGVfb2Zmc2V0X25vZGUpIHsKIAkJcmV0ID0gLUVOT01FTTsKIAkJZ290byBvdXRfZnJlZV9saXN0OwpAQCAtMTMzOCwxNiArMTI4NiwxMyBAQAogCQlnb3RvIG91dF9mcmVlX21tOwogCX0KIAotCS8qIEJ5IG5vdyB3ZSBzaG91bGQgYmUgYWxsIHNldCwgYW55IGRybV9tbWFwIHJlcXVlc3Qgb24gdGhlIG9mZnNldAotCSAqIGJlbG93IHdpbGwgZ2V0IHRvIG91ciBtbWFwICYgZmF1bHQgaGFuZGxlciAqLwotCW9ial9wcml2LT5tbWFwX29mZnNldCA9ICgodWludDY0X3QpIGxpc3QtPmhhc2gua2V5KSA8PCBQQUdFX1NISUZUOwotCiAJcmV0dXJuIDA7CiAKIG91dF9mcmVlX21tOgogCWRybV9tbV9wdXRfYmxvY2sobGlzdC0+ZmlsZV9vZmZzZXRfbm9kZSk7CiBvdXRfZnJlZV9saXN0OgogCWtmcmVlKGxpc3QtPm1hcCk7CisJbGlzdC0+bWFwID0gTlVMTDsKIAogCXJldHVybiByZXQ7CiB9CkBAIC0xMzY3LDM4ICsxMzEyLDUxIEBACiAgKiBmaXh1cCBieSBpOTE1X2dlbV9mYXVsdCgpLgogICovCiB2b2lkCi1pOTE1X2dlbV9yZWxlYXNlX21tYXAoc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmopCitpOTE1X2dlbV9yZWxlYXNlX21tYXAoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaikKIHsKLQlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gb2JqLT5kZXY7Ci0Jc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9ial9wcml2ID0gdG9faW50ZWxfYm8ob2JqKTsKKwlpZiAoIW9iai0+ZmF1bHRfbWFwcGFibGUpCisJCXJldHVybjsKIAotCWlmIChkZXYtPmRldl9tYXBwaW5nKQotCQl1bm1hcF9tYXBwaW5nX3JhbmdlKGRldi0+ZGV2X21hcHBpbmcsCi0JCQkJICAgIG9ial9wcml2LT5tbWFwX29mZnNldCwgb2JqLT5zaXplLCAxKTsKKwl1bm1hcF9tYXBwaW5nX3JhbmdlKG9iai0+YmFzZS5kZXYtPmRldl9tYXBwaW5nLAorCQkJICAgIChsb2ZmX3Qpb2JqLT5iYXNlLm1hcF9saXN0Lmhhc2gua2V5PDxQQUdFX1NISUZULAorCQkJICAgIG9iai0+YmFzZS5zaXplLCAxKTsKKworCW9iai0+ZmF1bHRfbWFwcGFibGUgPSBmYWxzZTsKIH0KIAogc3RhdGljIHZvaWQKLWk5MTVfZ2VtX2ZyZWVfbW1hcF9vZmZzZXQoc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmopCitpOTE1X2dlbV9mcmVlX21tYXBfb2Zmc2V0KHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmopCiB7Ci0Jc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IG9iai0+ZGV2OwotCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmpfcHJpdiA9IHRvX2ludGVsX2JvKG9iaik7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IG9iai0+YmFzZS5kZXY7CiAJc3RydWN0IGRybV9nZW1fbW0gKm1tID0gZGV2LT5tbV9wcml2YXRlOwotCXN0cnVjdCBkcm1fbWFwX2xpc3QgKmxpc3Q7CisJc3RydWN0IGRybV9tYXBfbGlzdCAqbGlzdCA9ICZvYmotPmJhc2UubWFwX2xpc3Q7CiAKLQlsaXN0ID0gJm9iai0+bWFwX2xpc3Q7CiAJZHJtX2h0X3JlbW92ZV9pdGVtKCZtbS0+b2Zmc2V0X2hhc2gsICZsaXN0LT5oYXNoKTsKKwlkcm1fbW1fcHV0X2Jsb2NrKGxpc3QtPmZpbGVfb2Zmc2V0X25vZGUpOworCWtmcmVlKGxpc3QtPm1hcCk7CisJbGlzdC0+bWFwID0gTlVMTDsKK30KIAotCWlmIChsaXN0LT5maWxlX29mZnNldF9ub2RlKSB7Ci0JCWRybV9tbV9wdXRfYmxvY2sobGlzdC0+ZmlsZV9vZmZzZXRfbm9kZSk7Ci0JCWxpc3QtPmZpbGVfb2Zmc2V0X25vZGUgPSBOVUxMOwotCX0KK3N0YXRpYyB1aW50MzJfdAoraTkxNV9nZW1fZ2V0X2d0dF9zaXplKHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmopCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IG9iai0+YmFzZS5kZXY7CisJdWludDMyX3Qgc2l6ZTsKIAotCWlmIChsaXN0LT5tYXApIHsKLQkJa2ZyZWUobGlzdC0+bWFwKTsKLQkJbGlzdC0+bWFwID0gTlVMTDsKLQl9CisJaWYgKElOVEVMX0lORk8oZGV2KS0+Z2VuID49IDQgfHwKKwkgICAgb2JqLT50aWxpbmdfbW9kZSA9PSBJOTE1X1RJTElOR19OT05FKQorCQlyZXR1cm4gb2JqLT5iYXNlLnNpemU7CiAKLQlvYmpfcHJpdi0+bW1hcF9vZmZzZXQgPSAwOworCS8qIFByZXZpb3VzIGNoaXBzIG5lZWQgYSBwb3dlci1vZi10d28gZmVuY2UgcmVnaW9uIHdoZW4gdGlsaW5nICovCisJaWYgKElOVEVMX0lORk8oZGV2KS0+Z2VuID09IDMpCisJCXNpemUgPSAxMDI0KjEwMjQ7CisJZWxzZQorCQlzaXplID0gNTEyKjEwMjQ7CisKKwl3aGlsZSAoc2l6ZSA8IG9iai0+YmFzZS5zaXplKQorCQlzaXplIDw8PSAxOworCisJcmV0dXJuIHNpemU7CiB9CiAKIC8qKgpAQCAtMTQwNiw0MiArMTM2NCw2OCBAQAogICogQG9iajogb2JqZWN0IHRvIGNoZWNrCiAgKgogICogUmV0dXJuIHRoZSByZXF1aXJlZCBHVFQgYWxpZ25tZW50IGZvciBhbiBvYmplY3QsIHRha2luZyBpbnRvIGFjY291bnQKLSAqIHBvdGVudGlhbCBmZW5jZSByZWdpc3RlciBtYXBwaW5nIGlmIG5lZWRlZC4KKyAqIHBvdGVudGlhbCBmZW5jZSByZWdpc3RlciBtYXBwaW5nLgogICovCiBzdGF0aWMgdWludDMyX3QKLWk5MTVfZ2VtX2dldF9ndHRfYWxpZ25tZW50KHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqKQoraTkxNV9nZW1fZ2V0X2d0dF9hbGlnbm1lbnQoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaikKIHsKLQlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gb2JqLT5kZXY7Ci0Jc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9ial9wcml2ID0gdG9faW50ZWxfYm8ob2JqKTsKLQlpbnQgc3RhcnQsIGk7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IG9iai0+YmFzZS5kZXY7CiAKIAkvKgogCSAqIE1pbmltdW0gYWxpZ25tZW50IGlzIDRrIChHVFQgcGFnZSBzaXplKSwgYnV0IG1pZ2h0IGJlIGdyZWF0ZXIKIAkgKiBpZiBhIGZlbmNlIHJlZ2lzdGVyIGlzIG5lZWRlZCBmb3IgdGhlIG9iamVjdC4KIAkgKi8KLQlpZiAoSU5URUxfSU5GTyhkZXYpLT5nZW4gPj0gNCB8fCBvYmpfcHJpdi0+dGlsaW5nX21vZGUgPT0gSTkxNV9USUxJTkdfTk9ORSkKKwlpZiAoSU5URUxfSU5GTyhkZXYpLT5nZW4gPj0gNCB8fAorCSAgICBvYmotPnRpbGluZ19tb2RlID09IEk5MTVfVElMSU5HX05PTkUpCiAJCXJldHVybiA0MDk2OwogCiAJLyoKIAkgKiBQcmV2aW91cyBjaGlwcyBuZWVkIHRvIGJlIGFsaWduZWQgdG8gdGhlIHNpemUgb2YgdGhlIHNtYWxsZXN0CiAJICogZmVuY2UgcmVnaXN0ZXIgdGhhdCBjYW4gY29udGFpbiB0aGUgb2JqZWN0LgogCSAqLwotCWlmIChJTlRFTF9JTkZPKGRldiktPmdlbiA9PSAzKQotCQlzdGFydCA9IDEwMjQqMTAyNDsKKwlyZXR1cm4gaTkxNV9nZW1fZ2V0X2d0dF9zaXplKG9iaik7Cit9CisKKy8qKgorICogaTkxNV9nZW1fZ2V0X3VuZmVuY2VkX2d0dF9hbGlnbm1lbnQgLSByZXR1cm4gcmVxdWlyZWQgR1RUIGFsaWdubWVudCBmb3IgYW4KKyAqCQkJCQkgdW5mZW5jZWQgb2JqZWN0CisgKiBAb2JqOiBvYmplY3QgdG8gY2hlY2sKKyAqCisgKiBSZXR1cm4gdGhlIHJlcXVpcmVkIEdUVCBhbGlnbm1lbnQgZm9yIGFuIG9iamVjdCwgb25seSB0YWtpbmcgaW50byBhY2NvdW50CisgKiB1bmZlbmNlZCB0aWxlZCBzdXJmYWNlIHJlcXVpcmVtZW50cy4KKyAqLworc3RhdGljIHVpbnQzMl90CitpOTE1X2dlbV9nZXRfdW5mZW5jZWRfZ3R0X2FsaWdubWVudChzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBvYmotPmJhc2UuZGV2OworCWludCB0aWxlX2hlaWdodDsKKworCS8qCisJICogTWluaW11bSBhbGlnbm1lbnQgaXMgNGsgKEdUVCBwYWdlIHNpemUpIGZvciBzYW5lIGh3LgorCSAqLworCWlmIChJTlRFTF9JTkZPKGRldiktPmdlbiA+PSA0IHx8IElTX0czMyhkZXYpIHx8CisJICAgIG9iai0+dGlsaW5nX21vZGUgPT0gSTkxNV9USUxJTkdfTk9ORSkKKwkJcmV0dXJuIDQwOTY7CisKKwkvKgorCSAqIE9sZGVyIGNoaXBzIG5lZWQgdW5mZW5jZWQgdGlsZWQgYnVmZmVycyB0byBiZSBhbGlnbmVkIHRvIHRoZSBsZWZ0CisJICogZWRnZSBvZiBhbiBldmVuIHRpbGUgcm93ICh3aGVyZSB0aWxlIHJvd3MgYXJlIGNvdW50ZWQgYXMgaWYgdGhlIGJvIGlzCisJICogcGxhY2VkIGluIGEgZmVuY2VkIGd0dCByZWdpb24pLgorCSAqLworCWlmIChJU19HRU4yKGRldikgfHwKKwkgICAgKG9iai0+dGlsaW5nX21vZGUgPT0gSTkxNV9USUxJTkdfWSAmJiBIQVNfMTI4X0JZVEVfWV9USUxJTkcoZGV2KSkpCisJCXRpbGVfaGVpZ2h0ID0gMzI7CiAJZWxzZQotCQlzdGFydCA9IDUxMioxMDI0OworCQl0aWxlX2hlaWdodCA9IDg7CiAKLQlmb3IgKGkgPSBzdGFydDsgaSA8IG9iai0+c2l6ZTsgaSA8PD0gMSkKLQkJOwotCi0JcmV0dXJuIGk7CisJcmV0dXJuIHRpbGVfaGVpZ2h0ICogb2JqLT5zdHJpZGUgKiAyOwogfQogCiAvKioKICAqIGk5MTVfZ2VtX21tYXBfZ3R0X2lvY3RsIC0gcHJlcGFyZSBhbiBvYmplY3QgZm9yIEdUVCBtbWFwJ2luZwogICogQGRldjogRFJNIGRldmljZQogICogQGRhdGE6IEdUVCBtYXBwaW5nIGlvY3RsIGRhdGEKLSAqIEBmaWxlX3ByaXY6IEdFTSBvYmplY3QgaW5mbworICogQGZpbGU6IEdFTSBvYmplY3QgaW5mbwogICoKICAqIFNpbXBseSByZXR1cm5zIHRoZSBmYWtlIG9mZnNldCB0byB1c2Vyc3BhY2Ugc28gaXQgY2FuIG1tYXAgaXQuCiAgKiBUaGUgbW1hcCBjYWxsIHdpbGwgZW5kIHVwIGluIGRybV9nZW1fbW1hcCgpLCB3aGljaCB3aWxsIHNldCB0aGluZ3MKQEAgLTE0NTQsMTEgKzE0MzgsMTEgQEAKICAqLwogaW50CiBpOTE1X2dlbV9tbWFwX2d0dF9pb2N0bChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB2b2lkICpkYXRhLAotCQkJc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYpCisJCQlzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGUpCiB7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX21tYXBfZ3R0ICphcmdzID0gZGF0YTsKLQlzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iajsKLQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqX3ByaXY7CisJc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iajsKIAlpbnQgcmV0OwogCiAJaWYgKCEoZGV2LT5kcml2ZXItPmRyaXZlcl9mZWF0dXJlcyAmIERSSVZFUl9HRU0pKQpAQCAtMTQ2OCwxMzAgKzE0NTIsMTk2IEBACiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAotCW9iaiA9IGRybV9nZW1fb2JqZWN0X2xvb2t1cChkZXYsIGZpbGVfcHJpdiwgYXJncy0+aGFuZGxlKTsKKwlvYmogPSB0b19pbnRlbF9ibyhkcm1fZ2VtX29iamVjdF9sb29rdXAoZGV2LCBmaWxlLCBhcmdzLT5oYW5kbGUpKTsKIAlpZiAob2JqID09IE5VTEwpIHsKIAkJcmV0ID0gLUVOT0VOVDsKIAkJZ290byB1bmxvY2s7CiAJfQotCW9ial9wcml2ID0gdG9faW50ZWxfYm8ob2JqKTsKIAotCWlmIChvYmpfcHJpdi0+bWFkdiAhPSBJOTE1X01BRFZfV0lMTE5FRUQpIHsKKwlpZiAob2JqLT5iYXNlLnNpemUgPiBkZXZfcHJpdi0+bW0uZ3R0X21hcHBhYmxlX2VuZCkgeworCQlyZXQgPSAtRTJCSUc7CisJCWdvdG8gdW5sb2NrOworCX0KKworCWlmIChvYmotPm1hZHYgIT0gSTkxNV9NQURWX1dJTExORUVEKSB7CiAJCURSTV9FUlJPUigiQXR0ZW1wdGluZyB0byBtbWFwIGEgcHVyZ2VhYmxlIGJ1ZmZlclxuIik7CiAJCXJldCA9IC1FSU5WQUw7CiAJCWdvdG8gb3V0OwogCX0KIAotCWlmICghb2JqX3ByaXYtPm1tYXBfb2Zmc2V0KSB7CisJaWYgKCFvYmotPmJhc2UubWFwX2xpc3QubWFwKSB7CiAJCXJldCA9IGk5MTVfZ2VtX2NyZWF0ZV9tbWFwX29mZnNldChvYmopOwogCQlpZiAocmV0KQogCQkJZ290byBvdXQ7CiAJfQogCi0JYXJncy0+b2Zmc2V0ID0gb2JqX3ByaXYtPm1tYXBfb2Zmc2V0OwotCi0JLyoKLQkgKiBQdWxsIGl0IGludG8gdGhlIEdUVCBzbyB0aGF0IHdlIGhhdmUgYSBwYWdlIGxpc3QgKG1ha2VzIHRoZQotCSAqIGluaXRpYWwgZmF1bHQgZmFzdGVyIGFuZCBhbnkgc3Vic2VxdWVudCBmbHVzaGluZyBwb3NzaWJsZSkuCi0JICovCi0JaWYgKCFvYmpfcHJpdi0+YWdwX21lbSkgewotCQlyZXQgPSBpOTE1X2dlbV9vYmplY3RfYmluZF90b19ndHQob2JqLCAwKTsKLQkJaWYgKHJldCkKLQkJCWdvdG8gb3V0OwotCX0KKwlhcmdzLT5vZmZzZXQgPSAodTY0KW9iai0+YmFzZS5tYXBfbGlzdC5oYXNoLmtleSA8PCBQQUdFX1NISUZUOwogCiBvdXQ6Ci0JZHJtX2dlbV9vYmplY3RfdW5yZWZlcmVuY2Uob2JqKTsKKwlkcm1fZ2VtX29iamVjdF91bnJlZmVyZW5jZSgmb2JqLT5iYXNlKTsKIHVubG9jazoKIAltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgdm9pZAotaTkxNV9nZW1fb2JqZWN0X3B1dF9wYWdlcyhzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iaikKK3N0YXRpYyBpbnQKK2k5MTVfZ2VtX29iamVjdF9nZXRfcGFnZXNfZ3R0KHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmosCisJCQkgICAgICBnZnBfdCBnZnBtYXNrKQogewotCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmpfcHJpdiA9IHRvX2ludGVsX2JvKG9iaik7Ci0JaW50IHBhZ2VfY291bnQgPSBvYmotPnNpemUgLyBQQUdFX1NJWkU7CisJaW50IHBhZ2VfY291bnQsIGk7CisJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmc7CisJc3RydWN0IGlub2RlICppbm9kZTsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKworCS8qIEdldCB0aGUgbGlzdCBvZiBwYWdlcyBvdXQgb2Ygb3VyIHN0cnVjdCBmaWxlLiAgVGhleSdsbCBiZSBwaW5uZWQKKwkgKiBhdCB0aGlzIHBvaW50IHVudGlsIHdlIHJlbGVhc2UgdGhlbS4KKwkgKi8KKwlwYWdlX2NvdW50ID0gb2JqLT5iYXNlLnNpemUgLyBQQUdFX1NJWkU7CisJQlVHX09OKG9iai0+cGFnZXMgIT0gTlVMTCk7CisJb2JqLT5wYWdlcyA9IGRybV9tYWxsb2NfYWIocGFnZV9jb3VudCwgc2l6ZW9mKHN0cnVjdCBwYWdlICopKTsKKwlpZiAob2JqLT5wYWdlcyA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWlub2RlID0gb2JqLT5iYXNlLmZpbHAtPmZfcGF0aC5kZW50cnktPmRfaW5vZGU7CisJbWFwcGluZyA9IGlub2RlLT5pX21hcHBpbmc7CisJZm9yIChpID0gMDsgaSA8IHBhZ2VfY291bnQ7IGkrKykgeworCQlwYWdlID0gcmVhZF9jYWNoZV9wYWdlX2dmcChtYXBwaW5nLCBpLAorCQkJCQkgICBHRlBfSElHSFVTRVIgfAorCQkJCQkgICBfX0dGUF9DT0xEIHwKKwkJCQkJICAgX19HRlBfUkVDTEFJTUFCTEUgfAorCQkJCQkgICBnZnBtYXNrKTsKKwkJaWYgKElTX0VSUihwYWdlKSkKKwkJCWdvdG8gZXJyX3BhZ2VzOworCisJCW9iai0+cGFnZXNbaV0gPSBwYWdlOworCX0KKworCWlmIChvYmotPnRpbGluZ19tb2RlICE9IEk5MTVfVElMSU5HX05PTkUpCisJCWk5MTVfZ2VtX29iamVjdF9kb19iaXRfMTdfc3dpenpsZShvYmopOworCisJcmV0dXJuIDA7CisKK2Vycl9wYWdlczoKKwl3aGlsZSAoaS0tKQorCQlwYWdlX2NhY2hlX3JlbGVhc2Uob2JqLT5wYWdlc1tpXSk7CisKKwlkcm1fZnJlZV9sYXJnZShvYmotPnBhZ2VzKTsKKwlvYmotPnBhZ2VzID0gTlVMTDsKKwlyZXR1cm4gUFRSX0VSUihwYWdlKTsKK30KKworc3RhdGljIHZvaWQKK2k5MTVfZ2VtX29iamVjdF9wdXRfcGFnZXNfZ3R0KHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmopCit7CisJaW50IHBhZ2VfY291bnQgPSBvYmotPmJhc2Uuc2l6ZSAvIFBBR0VfU0laRTsKIAlpbnQgaTsKIAotCUJVR19PTihvYmpfcHJpdi0+cGFnZXNfcmVmY291bnQgPT0gMCk7Ci0JQlVHX09OKG9ial9wcml2LT5tYWR2ID09IF9fSTkxNV9NQURWX1BVUkdFRCk7CisJQlVHX09OKG9iai0+bWFkdiA9PSBfX0k5MTVfTUFEVl9QVVJHRUQpOwogCi0JaWYgKC0tb2JqX3ByaXYtPnBhZ2VzX3JlZmNvdW50ICE9IDApCi0JCXJldHVybjsKLQotCWlmIChvYmpfcHJpdi0+dGlsaW5nX21vZGUgIT0gSTkxNV9USUxJTkdfTk9ORSkKKwlpZiAob2JqLT50aWxpbmdfbW9kZSAhPSBJOTE1X1RJTElOR19OT05FKQogCQlpOTE1X2dlbV9vYmplY3Rfc2F2ZV9iaXRfMTdfc3dpenpsZShvYmopOwogCi0JaWYgKG9ial9wcml2LT5tYWR2ID09IEk5MTVfTUFEVl9ET05UTkVFRCkKLQkJb2JqX3ByaXYtPmRpcnR5ID0gMDsKKwlpZiAob2JqLT5tYWR2ID09IEk5MTVfTUFEVl9ET05UTkVFRCkKKwkJb2JqLT5kaXJ0eSA9IDA7CiAKIAlmb3IgKGkgPSAwOyBpIDwgcGFnZV9jb3VudDsgaSsrKSB7Ci0JCWlmIChvYmpfcHJpdi0+ZGlydHkpCi0JCQlzZXRfcGFnZV9kaXJ0eShvYmpfcHJpdi0+cGFnZXNbaV0pOworCQlpZiAob2JqLT5kaXJ0eSkKKwkJCXNldF9wYWdlX2RpcnR5KG9iai0+cGFnZXNbaV0pOwogCi0JCWlmIChvYmpfcHJpdi0+bWFkdiA9PSBJOTE1X01BRFZfV0lMTE5FRUQpCi0JCQltYXJrX3BhZ2VfYWNjZXNzZWQob2JqX3ByaXYtPnBhZ2VzW2ldKTsKKwkJaWYgKG9iai0+bWFkdiA9PSBJOTE1X01BRFZfV0lMTE5FRUQpCisJCQltYXJrX3BhZ2VfYWNjZXNzZWQob2JqLT5wYWdlc1tpXSk7CiAKLQkJcGFnZV9jYWNoZV9yZWxlYXNlKG9ial9wcml2LT5wYWdlc1tpXSk7CisJCXBhZ2VfY2FjaGVfcmVsZWFzZShvYmotPnBhZ2VzW2ldKTsKIAl9Ci0Jb2JqX3ByaXYtPmRpcnR5ID0gMDsKKwlvYmotPmRpcnR5ID0gMDsKIAotCWRybV9mcmVlX2xhcmdlKG9ial9wcml2LT5wYWdlcyk7Ci0Jb2JqX3ByaXYtPnBhZ2VzID0gTlVMTDsKKwlkcm1fZnJlZV9sYXJnZShvYmotPnBhZ2VzKTsKKwlvYmotPnBhZ2VzID0gTlVMTDsKIH0KIAotc3RhdGljIHVpbnQzMl90Ci1pOTE1X2dlbV9uZXh0X3JlcXVlc3Rfc2Vxbm8oc3RydWN0IGRybV9kZXZpY2UgKmRldiwKLQkJCSAgICBzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcpCit2b2lkCitpOTE1X2dlbV9vYmplY3RfbW92ZV90b19hY3RpdmUoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaiwKKwkJCSAgICAgICBzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcsCisJCQkgICAgICAgdTMyIHNlcW5vKQogewotCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCi0JcmluZy0+b3V0c3RhbmRpbmdfbGF6eV9yZXF1ZXN0ID0gdHJ1ZTsKLQlyZXR1cm4gZGV2X3ByaXYtPm5leHRfc2Vxbm87Ci19Ci0KLXN0YXRpYyB2b2lkCi1pOTE1X2dlbV9vYmplY3RfbW92ZV90b19hY3RpdmUoc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmosCi0JCQkgICAgICAgc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nKQotewotCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBvYmotPmRldjsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gb2JqLT5iYXNlLmRldjsKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmpfcHJpdiA9IHRvX2ludGVsX2JvKG9iaik7Ci0JdWludDMyX3Qgc2Vxbm8gPSBpOTE1X2dlbV9uZXh0X3JlcXVlc3Rfc2Vxbm8oZGV2LCByaW5nKTsKIAogCUJVR19PTihyaW5nID09IE5VTEwpOwotCW9ial9wcml2LT5yaW5nID0gcmluZzsKKwlvYmotPnJpbmcgPSByaW5nOwogCiAJLyogQWRkIGEgcmVmZXJlbmNlIGlmIHdlJ3JlIG5ld2x5IGVudGVyaW5nIHRoZSBhY3RpdmUgbGlzdC4gKi8KLQlpZiAoIW9ial9wcml2LT5hY3RpdmUpIHsKLQkJZHJtX2dlbV9vYmplY3RfcmVmZXJlbmNlKG9iaik7Ci0JCW9ial9wcml2LT5hY3RpdmUgPSAxOworCWlmICghb2JqLT5hY3RpdmUpIHsKKwkJZHJtX2dlbV9vYmplY3RfcmVmZXJlbmNlKCZvYmotPmJhc2UpOworCQlvYmotPmFjdGl2ZSA9IDE7CiAJfQogCiAJLyogTW92ZSBmcm9tIHdoYXRldmVyIGxpc3Qgd2Ugd2VyZSBvbiB0byB0aGUgdGFpbCBvZiBleGVjdXRpb24uICovCi0JbGlzdF9tb3ZlX3RhaWwoJm9ial9wcml2LT5tbV9saXN0LCAmZGV2X3ByaXYtPm1tLmFjdGl2ZV9saXN0KTsKLQlsaXN0X21vdmVfdGFpbCgmb2JqX3ByaXYtPnJpbmdfbGlzdCwgJnJpbmctPmFjdGl2ZV9saXN0KTsKLQlvYmpfcHJpdi0+bGFzdF9yZW5kZXJpbmdfc2Vxbm8gPSBzZXFubzsKKwlsaXN0X21vdmVfdGFpbCgmb2JqLT5tbV9saXN0LCAmZGV2X3ByaXYtPm1tLmFjdGl2ZV9saXN0KTsKKwlsaXN0X21vdmVfdGFpbCgmb2JqLT5yaW5nX2xpc3QsICZyaW5nLT5hY3RpdmVfbGlzdCk7CisKKwlvYmotPmxhc3RfcmVuZGVyaW5nX3NlcW5vID0gc2Vxbm87CisJaWYgKG9iai0+ZmVuY2VkX2dwdV9hY2Nlc3MpIHsKKwkJc3RydWN0IGRybV9pOTE1X2ZlbmNlX3JlZyAqcmVnOworCisJCUJVR19PTihvYmotPmZlbmNlX3JlZyA9PSBJOTE1X0ZFTkNFX1JFR19OT05FKTsKKworCQlvYmotPmxhc3RfZmVuY2VkX3NlcW5vID0gc2Vxbm87CisJCW9iai0+bGFzdF9mZW5jZWRfcmluZyA9IHJpbmc7CisKKwkJcmVnID0gJmRldl9wcml2LT5mZW5jZV9yZWdzW29iai0+ZmVuY2VfcmVnXTsKKwkJbGlzdF9tb3ZlX3RhaWwoJnJlZy0+bHJ1X2xpc3QsICZkZXZfcHJpdi0+bW0uZmVuY2VfbGlzdCk7CisJfQogfQogCiBzdGF0aWMgdm9pZAotaTkxNV9nZW1fb2JqZWN0X21vdmVfdG9fZmx1c2hpbmcoc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmopCitpOTE1X2dlbV9vYmplY3RfbW92ZV9vZmZfYWN0aXZlKHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmopCiB7Ci0Jc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IG9iai0+ZGV2OwotCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmpfcHJpdiA9IHRvX2ludGVsX2JvKG9iaik7CisJbGlzdF9kZWxfaW5pdCgmb2JqLT5yaW5nX2xpc3QpOworCW9iai0+bGFzdF9yZW5kZXJpbmdfc2Vxbm8gPSAwOworfQogCi0JQlVHX09OKCFvYmpfcHJpdi0+YWN0aXZlKTsKLQlsaXN0X21vdmVfdGFpbCgmb2JqX3ByaXYtPm1tX2xpc3QsICZkZXZfcHJpdi0+bW0uZmx1c2hpbmdfbGlzdCk7Ci0JbGlzdF9kZWxfaW5pdCgmb2JqX3ByaXYtPnJpbmdfbGlzdCk7Ci0Jb2JqX3ByaXYtPmxhc3RfcmVuZGVyaW5nX3NlcW5vID0gMDsKK3N0YXRpYyB2b2lkCitpOTE1X2dlbV9vYmplY3RfbW92ZV90b19mbHVzaGluZyhzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBvYmotPmJhc2UuZGV2OworCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCisJQlVHX09OKCFvYmotPmFjdGl2ZSk7CisJbGlzdF9tb3ZlX3RhaWwoJm9iai0+bW1fbGlzdCwgJmRldl9wcml2LT5tbS5mbHVzaGluZ19saXN0KTsKKworCWk5MTVfZ2VtX29iamVjdF9tb3ZlX29mZl9hY3RpdmUob2JqKTsKK30KKworc3RhdGljIHZvaWQKK2k5MTVfZ2VtX29iamVjdF9tb3ZlX3RvX2luYWN0aXZlKHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmopCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IG9iai0+YmFzZS5kZXY7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKworCWlmIChvYmotPnBpbl9jb3VudCAhPSAwKQorCQlsaXN0X21vdmVfdGFpbCgmb2JqLT5tbV9saXN0LCAmZGV2X3ByaXYtPm1tLnBpbm5lZF9saXN0KTsKKwllbHNlCisJCWxpc3RfbW92ZV90YWlsKCZvYmotPm1tX2xpc3QsICZkZXZfcHJpdi0+bW0uaW5hY3RpdmVfbGlzdCk7CisKKwlCVUdfT04oIWxpc3RfZW1wdHkoJm9iai0+Z3B1X3dyaXRlX2xpc3QpKTsKKwlCVUdfT04oIW9iai0+YWN0aXZlKTsKKwlvYmotPnJpbmcgPSBOVUxMOworCisJaTkxNV9nZW1fb2JqZWN0X21vdmVfb2ZmX2FjdGl2ZShvYmopOworCW9iai0+ZmVuY2VkX2dwdV9hY2Nlc3MgPSBmYWxzZTsKKworCW9iai0+YWN0aXZlID0gMDsKKwlvYmotPnBlbmRpbmdfZ3B1X3dyaXRlID0gZmFsc2U7CisJZHJtX2dlbV9vYmplY3RfdW5yZWZlcmVuY2UoJm9iai0+YmFzZSk7CisKKwlXQVJOX09OKGk5MTVfdmVyaWZ5X2xpc3RzKGRldikpOwogfQogCiAvKiBJbW1lZGlhdGVseSBkaXNjYXJkIHRoZSBiYWNraW5nIHN0b3JhZ2UgKi8KIHN0YXRpYyB2b2lkCi1pOTE1X2dlbV9vYmplY3RfdHJ1bmNhdGUoc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmopCitpOTE1X2dlbV9vYmplY3RfdHJ1bmNhdGUoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaikKIHsKLQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqX3ByaXYgPSB0b19pbnRlbF9ibyhvYmopOwogCXN0cnVjdCBpbm9kZSAqaW5vZGU7CiAKIAkvKiBPdXIgZ29hbCBoZXJlIGlzIHRvIHJldHVybiBhcyBtdWNoIG9mIHRoZSBtZW1vcnkgYXMKQEAgLTE2MDAsNDIgKzE2NTAsMTggQEAKIAkgKiBiYWNraW5nIHBhZ2VzLCAqbm93Ki4gSGVyZSB3ZSBtaXJyb3IgdGhlIGFjdGlvbnMgdGFrZW4KIAkgKiB3aGVuIGJ5IHNobWVtX2RlbGV0ZV9pbm9kZSgpIHRvIHJlbGVhc2UgdGhlIGJhY2tpbmcgc3RvcmUuCiAJICovCi0JaW5vZGUgPSBvYmotPmZpbHAtPmZfcGF0aC5kZW50cnktPmRfaW5vZGU7CisJaW5vZGUgPSBvYmotPmJhc2UuZmlscC0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZTsKIAl0cnVuY2F0ZV9pbm9kZV9wYWdlcyhpbm9kZS0+aV9tYXBwaW5nLCAwKTsKIAlpZiAoaW5vZGUtPmlfb3AtPnRydW5jYXRlX3JhbmdlKQogCQlpbm9kZS0+aV9vcC0+dHJ1bmNhdGVfcmFuZ2UoaW5vZGUsIDAsIChsb2ZmX3QpLTEpOwogCi0Jb2JqX3ByaXYtPm1hZHYgPSBfX0k5MTVfTUFEVl9QVVJHRUQ7CisJb2JqLT5tYWR2ID0gX19JOTE1X01BRFZfUFVSR0VEOwogfQogCiBzdGF0aWMgaW5saW5lIGludAotaTkxNV9nZW1fb2JqZWN0X2lzX3B1cmdlYWJsZShzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqX3ByaXYpCitpOTE1X2dlbV9vYmplY3RfaXNfcHVyZ2VhYmxlKHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmopCiB7Ci0JcmV0dXJuIG9ial9wcml2LT5tYWR2ID09IEk5MTVfTUFEVl9ET05UTkVFRDsKLX0KLQotc3RhdGljIHZvaWQKLWk5MTVfZ2VtX29iamVjdF9tb3ZlX3RvX2luYWN0aXZlKHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqKQotewotCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBvYmotPmRldjsKLQlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqX3ByaXYgPSB0b19pbnRlbF9ibyhvYmopOwotCi0JaWYgKG9ial9wcml2LT5waW5fY291bnQgIT0gMCkKLQkJbGlzdF9tb3ZlX3RhaWwoJm9ial9wcml2LT5tbV9saXN0LCAmZGV2X3ByaXYtPm1tLnBpbm5lZF9saXN0KTsKLQllbHNlCi0JCWxpc3RfbW92ZV90YWlsKCZvYmpfcHJpdi0+bW1fbGlzdCwgJmRldl9wcml2LT5tbS5pbmFjdGl2ZV9saXN0KTsKLQlsaXN0X2RlbF9pbml0KCZvYmpfcHJpdi0+cmluZ19saXN0KTsKLQotCUJVR19PTighbGlzdF9lbXB0eSgmb2JqX3ByaXYtPmdwdV93cml0ZV9saXN0KSk7Ci0KLQlvYmpfcHJpdi0+bGFzdF9yZW5kZXJpbmdfc2Vxbm8gPSAwOwotCW9ial9wcml2LT5yaW5nID0gTlVMTDsKLQlpZiAob2JqX3ByaXYtPmFjdGl2ZSkgewotCQlvYmpfcHJpdi0+YWN0aXZlID0gMDsKLQkJZHJtX2dlbV9vYmplY3RfdW5yZWZlcmVuY2Uob2JqKTsKLQl9Ci0JV0FSTl9PTihpOTE1X3ZlcmlmeV9saXN0cyhkZXYpKTsKKwlyZXR1cm4gb2JqLT5tYWR2ID09IEk5MTVfTUFEVl9ET05UTkVFRDsKIH0KIAogc3RhdGljIHZvaWQKQEAgLTE2NDMsMzcgKzE2NjksMjcgQEAKIAkJCSAgICAgICB1aW50MzJfdCBmbHVzaF9kb21haW5zLAogCQkJICAgICAgIHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZykKIHsKLQlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqX3ByaXYsICpuZXh0OworCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmosICpuZXh0OwogCi0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKG9ial9wcml2LCBuZXh0LAorCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShvYmosIG5leHQsCiAJCQkJICZyaW5nLT5ncHVfd3JpdGVfbGlzdCwKIAkJCQkgZ3B1X3dyaXRlX2xpc3QpIHsKLQkJc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmogPSAmb2JqX3ByaXYtPmJhc2U7CisJCWlmIChvYmotPmJhc2Uud3JpdGVfZG9tYWluICYgZmx1c2hfZG9tYWlucykgeworCQkJdWludDMyX3Qgb2xkX3dyaXRlX2RvbWFpbiA9IG9iai0+YmFzZS53cml0ZV9kb21haW47CiAKLQkJaWYgKG9iai0+d3JpdGVfZG9tYWluICYgZmx1c2hfZG9tYWlucykgewotCQkJdWludDMyX3Qgb2xkX3dyaXRlX2RvbWFpbiA9IG9iai0+d3JpdGVfZG9tYWluOwotCi0JCQlvYmotPndyaXRlX2RvbWFpbiA9IDA7Ci0JCQlsaXN0X2RlbF9pbml0KCZvYmpfcHJpdi0+Z3B1X3dyaXRlX2xpc3QpOwotCQkJaTkxNV9nZW1fb2JqZWN0X21vdmVfdG9fYWN0aXZlKG9iaiwgcmluZyk7Ci0KLQkJCS8qIHVwZGF0ZSB0aGUgZmVuY2UgbHJ1IGxpc3QgKi8KLQkJCWlmIChvYmpfcHJpdi0+ZmVuY2VfcmVnICE9IEk5MTVfRkVOQ0VfUkVHX05PTkUpIHsKLQkJCQlzdHJ1Y3QgZHJtX2k5MTVfZmVuY2VfcmVnICpyZWcgPQotCQkJCQkmZGV2X3ByaXYtPmZlbmNlX3JlZ3Nbb2JqX3ByaXYtPmZlbmNlX3JlZ107Ci0JCQkJbGlzdF9tb3ZlX3RhaWwoJnJlZy0+bHJ1X2xpc3QsCi0JCQkJCQkmZGV2X3ByaXYtPm1tLmZlbmNlX2xpc3QpOwotCQkJfQorCQkJb2JqLT5iYXNlLndyaXRlX2RvbWFpbiA9IDA7CisJCQlsaXN0X2RlbF9pbml0KCZvYmotPmdwdV93cml0ZV9saXN0KTsKKwkJCWk5MTVfZ2VtX29iamVjdF9tb3ZlX3RvX2FjdGl2ZShvYmosIHJpbmcsCisJCQkJCQkgICAgICAgaTkxNV9nZW1fbmV4dF9yZXF1ZXN0X3NlcW5vKGRldiwgcmluZykpOwogCiAJCQl0cmFjZV9pOTE1X2dlbV9vYmplY3RfY2hhbmdlX2RvbWFpbihvYmosCi0JCQkJCQkJICAgIG9iai0+cmVhZF9kb21haW5zLAorCQkJCQkJCSAgICBvYmotPmJhc2UucmVhZF9kb21haW5zLAogCQkJCQkJCSAgICBvbGRfd3JpdGVfZG9tYWluKTsKIAkJfQogCX0KIH0KIAotdWludDMyX3QKK2ludAogaTkxNV9hZGRfcmVxdWVzdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAogCQkgc3RydWN0IGRybV9maWxlICpmaWxlLAogCQkgc3RydWN0IGRybV9pOTE1X2dlbV9yZXF1ZXN0ICpyZXF1ZXN0LApAQCAtMTY4MywxNyArMTY5OSwxNyBAQAogCXN0cnVjdCBkcm1faTkxNV9maWxlX3ByaXZhdGUgKmZpbGVfcHJpdiA9IE5VTEw7CiAJdWludDMyX3Qgc2Vxbm87CiAJaW50IHdhc19lbXB0eTsKKwlpbnQgcmV0OworCisJQlVHX09OKHJlcXVlc3QgPT0gTlVMTCk7CiAKIAlpZiAoZmlsZSAhPSBOVUxMKQogCQlmaWxlX3ByaXYgPSBmaWxlLT5kcml2ZXJfcHJpdjsKIAotCWlmIChyZXF1ZXN0ID09IE5VTEwpIHsKLQkJcmVxdWVzdCA9IGt6YWxsb2Moc2l6ZW9mKCpyZXF1ZXN0KSwgR0ZQX0tFUk5FTCk7Ci0JCWlmIChyZXF1ZXN0ID09IE5VTEwpCi0JCQlyZXR1cm4gMDsKLQl9CisJcmV0ID0gcmluZy0+YWRkX3JlcXVlc3QocmluZywgJnNlcW5vKTsKKwlpZiAocmV0KQorCSAgICByZXR1cm4gcmV0OwogCi0Jc2Vxbm8gPSByaW5nLT5hZGRfcmVxdWVzdChkZXYsIHJpbmcsIDApOwogCXJpbmctPm91dHN0YW5kaW5nX2xhenlfcmVxdWVzdCA9IGZhbHNlOwogCiAJcmVxdWVzdC0+c2Vxbm8gPSBzZXFubzsKQEAgLTE3MTcsMjYgKzE3MzMsNyBAQAogCQkJcXVldWVfZGVsYXllZF93b3JrKGRldl9wcml2LT53cSwKIAkJCQkJICAgJmRldl9wcml2LT5tbS5yZXRpcmVfd29yaywgSFopOwogCX0KLQlyZXR1cm4gc2Vxbm87Ci19Ci0KLS8qKgotICogQ29tbWFuZCBleGVjdXRpb24gYmFycmllcgotICoKLSAqIEVuc3VyZXMgdGhhdCBhbGwgY29tbWFuZHMgaW4gdGhlIHJpbmcgYXJlIGZpbmlzaGVkCi0gKiBiZWZvcmUgc2lnbmFsbGluZyB0aGUgQ1BVCi0gKi8KLXN0YXRpYyB2b2lkCi1pOTE1X3JldGlyZV9jb21tYW5kcyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcpCi17Ci0JdWludDMyX3QgZmx1c2hfZG9tYWlucyA9IDA7Ci0KLQkvKiBUaGUgc2FtcGxlciBhbHdheXMgZ2V0cyBmbHVzaGVkIG9uIGk5NjUgKHNpZ2gpICovCi0JaWYgKElOVEVMX0lORk8oZGV2KS0+Z2VuID49IDQpCi0JCWZsdXNoX2RvbWFpbnMgfD0gSTkxNV9HRU1fRE9NQUlOX1NBTVBMRVI7Ci0KLQlyaW5nLT5mbHVzaChkZXYsIHJpbmcsCi0JCQlJOTE1X0dFTV9ET01BSU5fQ09NTUFORCwgZmx1c2hfZG9tYWlucyk7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZApAQCAtMTc2OSw2MiArMTc2Niw3NiBAQAogCX0KIAogCXdoaWxlICghbGlzdF9lbXB0eSgmcmluZy0+YWN0aXZlX2xpc3QpKSB7Ci0JCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmpfcHJpdjsKKwkJc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iajsKIAotCQlvYmpfcHJpdiA9IGxpc3RfZmlyc3RfZW50cnkoJnJpbmctPmFjdGl2ZV9saXN0LAotCQkJCQkgICAgc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QsCi0JCQkJCSAgICByaW5nX2xpc3QpOworCQlvYmogPSBsaXN0X2ZpcnN0X2VudHJ5KCZyaW5nLT5hY3RpdmVfbGlzdCwKKwkJCQkgICAgICAgc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QsCisJCQkJICAgICAgIHJpbmdfbGlzdCk7CiAKLQkJb2JqX3ByaXYtPmJhc2Uud3JpdGVfZG9tYWluID0gMDsKLQkJbGlzdF9kZWxfaW5pdCgmb2JqX3ByaXYtPmdwdV93cml0ZV9saXN0KTsKLQkJaTkxNV9nZW1fb2JqZWN0X21vdmVfdG9faW5hY3RpdmUoJm9ial9wcml2LT5iYXNlKTsKKwkJb2JqLT5iYXNlLndyaXRlX2RvbWFpbiA9IDA7CisJCWxpc3RfZGVsX2luaXQoJm9iai0+Z3B1X3dyaXRlX2xpc3QpOworCQlpOTE1X2dlbV9vYmplY3RfbW92ZV90b19pbmFjdGl2ZShvYmopOworCX0KK30KKworc3RhdGljIHZvaWQgaTkxNV9nZW1fcmVzZXRfZmVuY2VzKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisJCXN0cnVjdCBkcm1faTkxNV9mZW5jZV9yZWcgKnJlZyA9ICZkZXZfcHJpdi0+ZmVuY2VfcmVnc1tpXTsKKwkJc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaiA9IHJlZy0+b2JqOworCisJCWlmICghb2JqKQorCQkJY29udGludWU7CisKKwkJaWYgKG9iai0+dGlsaW5nX21vZGUpCisJCQlpOTE1X2dlbV9yZWxlYXNlX21tYXAob2JqKTsKKworCQlyZWctPm9iai0+ZmVuY2VfcmVnID0gSTkxNV9GRU5DRV9SRUdfTk9ORTsKKwkJcmVnLT5vYmotPmZlbmNlZF9ncHVfYWNjZXNzID0gZmFsc2U7CisJCXJlZy0+b2JqLT5sYXN0X2ZlbmNlZF9zZXFubyA9IDA7CisJCXJlZy0+b2JqLT5sYXN0X2ZlbmNlZF9yaW5nID0gTlVMTDsKKwkJaTkxNV9nZW1fY2xlYXJfZmVuY2VfcmVnKGRldiwgcmVnKTsKIAl9CiB9CiAKIHZvaWQgaTkxNV9nZW1fcmVzZXQoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmpfcHJpdjsKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqOwogCWludCBpOwogCi0JaTkxNV9nZW1fcmVzZXRfcmluZ19saXN0cyhkZXZfcHJpdiwgJmRldl9wcml2LT5yZW5kZXJfcmluZyk7Ci0JaTkxNV9nZW1fcmVzZXRfcmluZ19saXN0cyhkZXZfcHJpdiwgJmRldl9wcml2LT5ic2RfcmluZyk7Ci0JaTkxNV9nZW1fcmVzZXRfcmluZ19saXN0cyhkZXZfcHJpdiwgJmRldl9wcml2LT5ibHRfcmluZyk7CisJZm9yIChpID0gMDsgaSA8IEk5MTVfTlVNX1JJTkdTOyBpKyspCisJCWk5MTVfZ2VtX3Jlc2V0X3JpbmdfbGlzdHMoZGV2X3ByaXYsICZkZXZfcHJpdi0+cmluZ1tpXSk7CiAKIAkvKiBSZW1vdmUgYW55dGhpbmcgZnJvbSB0aGUgZmx1c2hpbmcgbGlzdHMuIFRoZSBHUFUgY2FjaGUgaXMgbGlrZWx5CiAJICogdG8gYmUgbG9zdCBvbiByZXNldCBhbG9uZyB3aXRoIHRoZSBkYXRhLCBzbyBzaW1wbHkgbW92ZSB0aGUKIAkgKiBsb3N0IGJvIHRvIHRoZSBpbmFjdGl2ZSBsaXN0LgogCSAqLwogCXdoaWxlICghbGlzdF9lbXB0eSgmZGV2X3ByaXYtPm1tLmZsdXNoaW5nX2xpc3QpKSB7Ci0JCW9ial9wcml2ID0gbGlzdF9maXJzdF9lbnRyeSgmZGV2X3ByaXYtPm1tLmZsdXNoaW5nX2xpc3QsCi0JCQkJCSAgICBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCwKLQkJCQkJICAgIG1tX2xpc3QpOworCQlvYmo9IGxpc3RfZmlyc3RfZW50cnkoJmRldl9wcml2LT5tbS5mbHVzaGluZ19saXN0LAorCQkJCSAgICAgIHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0LAorCQkJCSAgICAgIG1tX2xpc3QpOwogCi0JCW9ial9wcml2LT5iYXNlLndyaXRlX2RvbWFpbiA9IDA7Ci0JCWxpc3RfZGVsX2luaXQoJm9ial9wcml2LT5ncHVfd3JpdGVfbGlzdCk7Ci0JCWk5MTVfZ2VtX29iamVjdF9tb3ZlX3RvX2luYWN0aXZlKCZvYmpfcHJpdi0+YmFzZSk7CisJCW9iai0+YmFzZS53cml0ZV9kb21haW4gPSAwOworCQlsaXN0X2RlbF9pbml0KCZvYmotPmdwdV93cml0ZV9saXN0KTsKKwkJaTkxNV9nZW1fb2JqZWN0X21vdmVfdG9faW5hY3RpdmUob2JqKTsKIAl9CiAKIAkvKiBNb3ZlIGV2ZXJ5dGhpbmcgb3V0IG9mIHRoZSBHUFUgZG9tYWlucyB0byBlbnN1cmUgd2UgZG8gYW55CiAJICogbmVjZXNzYXJ5IGludmFsaWRhdGlvbiB1cG9uIHJldXNlLgogCSAqLwotCWxpc3RfZm9yX2VhY2hfZW50cnkob2JqX3ByaXYsCisJbGlzdF9mb3JfZWFjaF9lbnRyeShvYmosCiAJCQkgICAgJmRldl9wcml2LT5tbS5pbmFjdGl2ZV9saXN0LAogCQkJICAgIG1tX2xpc3QpCiAJewotCQlvYmpfcHJpdi0+YmFzZS5yZWFkX2RvbWFpbnMgJj0gfkk5MTVfR0VNX0dQVV9ET01BSU5TOworCQlvYmotPmJhc2UucmVhZF9kb21haW5zICY9IH5JOTE1X0dFTV9HUFVfRE9NQUlOUzsKIAl9CiAKIAkvKiBUaGUgZmVuY2UgcmVnaXN0ZXJzIGFyZSBpbnZhbGlkYXRlZCBzbyBjbGVhciB0aGVtIG91dCAqLwotCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7Ci0JCXN0cnVjdCBkcm1faTkxNV9mZW5jZV9yZWcgKnJlZzsKLQotCQlyZWcgPSAmZGV2X3ByaXYtPmZlbmNlX3JlZ3NbaV07Ci0JCWlmICghcmVnLT5vYmopCi0JCQljb250aW51ZTsKLQotCQlpOTE1X2dlbV9jbGVhcl9mZW5jZV9yZWcocmVnLT5vYmopOwotCX0KKwlpOTE1X2dlbV9yZXNldF9mZW5jZXMoZGV2KTsKIH0KIAogLyoqCkBAIC0xODM2LDYgKzE4NDcsNyBAQAogewogCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXVpbnQzMl90IHNlcW5vOworCWludCBpOwogCiAJaWYgKCFyaW5nLT5zdGF0dXNfcGFnZS5wYWdlX2FkZHIgfHwKIAkgICAgbGlzdF9lbXB0eSgmcmluZy0+cmVxdWVzdF9saXN0KSkKQEAgLTE4NDMsNyArMTg1NSwxMiBAQAogCiAJV0FSTl9PTihpOTE1X3ZlcmlmeV9saXN0cyhkZXYpKTsKIAotCXNlcW5vID0gcmluZy0+Z2V0X3NlcW5vKGRldiwgcmluZyk7CisJc2Vxbm8gPSByaW5nLT5nZXRfc2Vxbm8ocmluZyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgSTkxNV9OVU1fUklOR1M7IGkrKykKKwkJaWYgKHNlcW5vID49IHJpbmctPnN5bmNfc2Vxbm9baV0pCisJCQlyaW5nLT5zeW5jX3NlcW5vW2ldID0gMDsKKwogCXdoaWxlICghbGlzdF9lbXB0eSgmcmluZy0+cmVxdWVzdF9saXN0KSkgewogCQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX3JlcXVlc3QgKnJlcXVlc3Q7CiAKQEAgLTE4NjUsMTggKzE4ODIsMTYgQEAKIAkgKiBieSB0aGUgcmluZ2J1ZmZlciB0byB0aGUgZmx1c2hpbmcvaW5hY3RpdmUgbGlzdHMgYXMgYXBwcm9wcmlhdGUuCiAJICovCiAJd2hpbGUgKCFsaXN0X2VtcHR5KCZyaW5nLT5hY3RpdmVfbGlzdCkpIHsKLQkJc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmo7Ci0JCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmpfcHJpdjsKKwkJc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iajsKIAotCQlvYmpfcHJpdiA9IGxpc3RfZmlyc3RfZW50cnkoJnJpbmctPmFjdGl2ZV9saXN0LAotCQkJCQkgICAgc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QsCi0JCQkJCSAgICByaW5nX2xpc3QpOworCQlvYmo9IGxpc3RfZmlyc3RfZW50cnkoJnJpbmctPmFjdGl2ZV9saXN0LAorCQkJCSAgICAgIHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0LAorCQkJCSAgICAgIHJpbmdfbGlzdCk7CiAKLQkJaWYgKCFpOTE1X3NlcW5vX3Bhc3NlZChzZXFubywgb2JqX3ByaXYtPmxhc3RfcmVuZGVyaW5nX3NlcW5vKSkKKwkJaWYgKCFpOTE1X3NlcW5vX3Bhc3NlZChzZXFubywgb2JqLT5sYXN0X3JlbmRlcmluZ19zZXFubykpCiAJCQlicmVhazsKIAotCQlvYmogPSAmb2JqX3ByaXYtPmJhc2U7Ci0JCWlmIChvYmotPndyaXRlX2RvbWFpbiAhPSAwKQorCQlpZiAob2JqLT5iYXNlLndyaXRlX2RvbWFpbiAhPSAwKQogCQkJaTkxNV9nZW1fb2JqZWN0X21vdmVfdG9fZmx1c2hpbmcob2JqKTsKIAkJZWxzZQogCQkJaTkxNV9nZW1fb2JqZWN0X21vdmVfdG9faW5hY3RpdmUob2JqKTsKQEAgLTE4ODQsNyArMTg5OSw3IEBACiAKIAlpZiAodW5saWtlbHkgKGRldl9wcml2LT50cmFjZV9pcnFfc2Vxbm8gJiYKIAkJICAgICAgaTkxNV9zZXFub19wYXNzZWQoZGV2X3ByaXYtPnRyYWNlX2lycV9zZXFubywgc2Vxbm8pKSkgewotCQlyaW5nLT51c2VyX2lycV9wdXQoZGV2LCByaW5nKTsKKwkJcmluZy0+aXJxX3B1dChyaW5nKTsKIAkJZGV2X3ByaXYtPnRyYWNlX2lycV9zZXFubyA9IDA7CiAJfQogCkBAIC0xODk1LDI0ICsxOTEwLDI0IEBACiBpOTE1X2dlbV9yZXRpcmVfcmVxdWVzdHMoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKIAlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlpbnQgaTsKIAogCWlmICghbGlzdF9lbXB0eSgmZGV2X3ByaXYtPm1tLmRlZmVycmVkX2ZyZWVfbGlzdCkpIHsKLQkgICAgc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9ial9wcml2LCAqdG1wOworCSAgICBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqLCAqbmV4dDsKIAogCSAgICAvKiBXZSBtdXN0IGJlIGNhcmVmdWwgdGhhdCBkdXJpbmcgdW5iaW5kKCkgd2UgZG8gbm90CiAJICAgICAqIGFjY2lkZW50YWxseSBpbmZpbml0ZWx5IHJlY3Vyc2UgaW50byByZXRpcmUgcmVxdWVzdHMuCiAJICAgICAqIEN1cnJlbnRseToKIAkgICAgICogICByZXRpcmUgLT4gZnJlZSAtPiB1bmJpbmQgLT4gd2FpdCAtPiByZXRpcmVfcmluZwogCSAgICAgKi8KLQkgICAgbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKG9ial9wcml2LCB0bXAsCisJICAgIGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShvYmosIG5leHQsCiAJCQkJICAgICAmZGV2X3ByaXYtPm1tLmRlZmVycmVkX2ZyZWVfbGlzdCwKIAkJCQkgICAgIG1tX2xpc3QpCi0JCSAgICBpOTE1X2dlbV9mcmVlX29iamVjdF90YWlsKCZvYmpfcHJpdi0+YmFzZSk7CisJCSAgICBpOTE1X2dlbV9mcmVlX29iamVjdF90YWlsKG9iaik7CiAJfQogCi0JaTkxNV9nZW1fcmV0aXJlX3JlcXVlc3RzX3JpbmcoZGV2LCAmZGV2X3ByaXYtPnJlbmRlcl9yaW5nKTsKLQlpOTE1X2dlbV9yZXRpcmVfcmVxdWVzdHNfcmluZyhkZXYsICZkZXZfcHJpdi0+YnNkX3JpbmcpOwotCWk5MTVfZ2VtX3JldGlyZV9yZXF1ZXN0c19yaW5nKGRldiwgJmRldl9wcml2LT5ibHRfcmluZyk7CisJZm9yIChpID0gMDsgaSA8IEk5MTVfTlVNX1JJTkdTOyBpKyspCisJCWk5MTVfZ2VtX3JldGlyZV9yZXF1ZXN0c19yaW5nKGRldiwgJmRldl9wcml2LT5yaW5nW2ldKTsKIH0KIAogc3RhdGljIHZvaWQKQEAgLTE5MzQsOSArMTk0OSw5IEBACiAJaTkxNV9nZW1fcmV0aXJlX3JlcXVlc3RzKGRldik7CiAKIAlpZiAoIWRldl9wcml2LT5tbS5zdXNwZW5kZWQgJiYKLQkJKCFsaXN0X2VtcHR5KCZkZXZfcHJpdi0+cmVuZGVyX3JpbmcucmVxdWVzdF9saXN0KSB8fAotCQkgIWxpc3RfZW1wdHkoJmRldl9wcml2LT5ic2RfcmluZy5yZXF1ZXN0X2xpc3QpIHx8Ci0JCSAhbGlzdF9lbXB0eSgmZGV2X3ByaXYtPmJsdF9yaW5nLnJlcXVlc3RfbGlzdCkpKQorCQkoIWxpc3RfZW1wdHkoJmRldl9wcml2LT5yaW5nW1JDU10ucmVxdWVzdF9saXN0KSB8fAorCQkgIWxpc3RfZW1wdHkoJmRldl9wcml2LT5yaW5nW1ZDU10ucmVxdWVzdF9saXN0KSB8fAorCQkgIWxpc3RfZW1wdHkoJmRldl9wcml2LT5yaW5nW0JDU10ucmVxdWVzdF9saXN0KSkpCiAJCXF1ZXVlX2RlbGF5ZWRfd29yayhkZXZfcHJpdi0+d3EsICZkZXZfcHJpdi0+bW0ucmV0aXJlX3dvcmssIEhaKTsKIAltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKIH0KQEAgLTE5NTQsMTQgKzE5NjksMjMgQEAKIAlpZiAoYXRvbWljX3JlYWQoJmRldl9wcml2LT5tbS53ZWRnZWQpKQogCQlyZXR1cm4gLUVBR0FJTjsKIAotCWlmIChyaW5nLT5vdXRzdGFuZGluZ19sYXp5X3JlcXVlc3QpIHsKLQkJc2Vxbm8gPSBpOTE1X2FkZF9yZXF1ZXN0KGRldiwgTlVMTCwgTlVMTCwgcmluZyk7Ci0JCWlmIChzZXFubyA9PSAwKQotCQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCUJVR19PTihzZXFubyA9PSBkZXZfcHJpdi0+bmV4dF9zZXFubyk7CisJaWYgKHNlcW5vID09IHJpbmctPm91dHN0YW5kaW5nX2xhenlfcmVxdWVzdCkgeworCQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX3JlcXVlc3QgKnJlcXVlc3Q7CiAKLQlpZiAoIWk5MTVfc2Vxbm9fcGFzc2VkKHJpbmctPmdldF9zZXFubyhkZXYsIHJpbmcpLCBzZXFubykpIHsKKwkJcmVxdWVzdCA9IGt6YWxsb2Moc2l6ZW9mKCpyZXF1ZXN0KSwgR0ZQX0tFUk5FTCk7CisJCWlmIChyZXF1ZXN0ID09IE5VTEwpCisJCQlyZXR1cm4gLUVOT01FTTsKKworCQlyZXQgPSBpOTE1X2FkZF9yZXF1ZXN0KGRldiwgTlVMTCwgcmVxdWVzdCwgcmluZyk7CisJCWlmIChyZXQpIHsKKwkJCWtmcmVlKHJlcXVlc3QpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCisJCXNlcW5vID0gcmVxdWVzdC0+c2Vxbm87CisJfQorCisJaWYgKCFpOTE1X3NlcW5vX3Bhc3NlZChyaW5nLT5nZXRfc2Vxbm8ocmluZyksIHNlcW5vKSkgewogCQlpZiAoSEFTX1BDSF9TUExJVChkZXYpKQogCQkJaWVyID0gSTkxNV9SRUFEKERFSUVSKSB8IEk5MTVfUkVBRChHVElFUik7CiAJCWVsc2UKQEAgLTE5NzUsMjEgKzE5OTksMjMgQEAKIAogCQl0cmFjZV9pOTE1X2dlbV9yZXF1ZXN0X3dhaXRfYmVnaW4oZGV2LCBzZXFubyk7CiAKLQkJcmluZy0+d2FpdGluZ19nZW1fc2Vxbm8gPSBzZXFubzsKLQkJcmluZy0+dXNlcl9pcnFfZ2V0KGRldiwgcmluZyk7Ci0JCWlmIChpbnRlcnJ1cHRpYmxlKQotCQkJcmV0ID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKHJpbmctPmlycV9xdWV1ZSwKLQkJCQlpOTE1X3NlcW5vX3Bhc3NlZCgKLQkJCQkJcmluZy0+Z2V0X3NlcW5vKGRldiwgcmluZyksIHNlcW5vKQotCQkJCXx8IGF0b21pY19yZWFkKCZkZXZfcHJpdi0+bW0ud2VkZ2VkKSk7Ci0JCWVsc2UKLQkJCXdhaXRfZXZlbnQocmluZy0+aXJxX3F1ZXVlLAotCQkJCWk5MTVfc2Vxbm9fcGFzc2VkKAotCQkJCQlyaW5nLT5nZXRfc2Vxbm8oZGV2LCByaW5nKSwgc2Vxbm8pCi0JCQkJfHwgYXRvbWljX3JlYWQoJmRldl9wcml2LT5tbS53ZWRnZWQpKTsKKwkJcmluZy0+d2FpdGluZ19zZXFubyA9IHNlcW5vOworCQlpZiAocmluZy0+aXJxX2dldChyaW5nKSkgeworCQkJaWYgKGludGVycnVwdGlibGUpCisJCQkJcmV0ID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKHJpbmctPmlycV9xdWV1ZSwKKwkJCQkJCQkgICAgICAgaTkxNV9zZXFub19wYXNzZWQocmluZy0+Z2V0X3NlcW5vKHJpbmcpLCBzZXFubykKKwkJCQkJCQkgICAgICAgfHwgYXRvbWljX3JlYWQoJmRldl9wcml2LT5tbS53ZWRnZWQpKTsKKwkJCWVsc2UKKwkJCQl3YWl0X2V2ZW50KHJpbmctPmlycV9xdWV1ZSwKKwkJCQkJICAgaTkxNV9zZXFub19wYXNzZWQocmluZy0+Z2V0X3NlcW5vKHJpbmcpLCBzZXFubykKKwkJCQkJICAgfHwgYXRvbWljX3JlYWQoJmRldl9wcml2LT5tbS53ZWRnZWQpKTsKIAotCQlyaW5nLT51c2VyX2lycV9wdXQoZGV2LCByaW5nKTsKLQkJcmluZy0+d2FpdGluZ19nZW1fc2Vxbm8gPSAwOworCQkJcmluZy0+aXJxX3B1dChyaW5nKTsKKwkJfSBlbHNlIGlmICh3YWl0X2ZvcihpOTE1X3NlcW5vX3Bhc3NlZChyaW5nLT5nZXRfc2Vxbm8ocmluZyksCisJCQkJCQkgICAgICBzZXFubykgfHwKKwkJCQkgICAgYXRvbWljX3JlYWQoJmRldl9wcml2LT5tbS53ZWRnZWQpLCAzMDAwKSkKKwkJCXJldCA9IC1FQlVTWTsKKwkJcmluZy0+d2FpdGluZ19zZXFubyA9IDA7CiAKIAkJdHJhY2VfaTkxNV9nZW1fcmVxdWVzdF93YWl0X2VuZChkZXYsIHNlcW5vKTsKIAl9CkBAIC0xOTk4LDcgKzIwMjQsNyBAQAogCiAJaWYgKHJldCAmJiByZXQgIT0gLUVSRVNUQVJUU1lTKQogCQlEUk1fRVJST1IoIiVzIHJldHVybnMgJWQgKGF3YWl0aW5nICVkIGF0ICVkLCBuZXh0ICVkKVxuIiwKLQkJCSAgX19mdW5jX18sIHJldCwgc2Vxbm8sIHJpbmctPmdldF9zZXFubyhkZXYsIHJpbmcpLAorCQkJICBfX2Z1bmNfXywgcmV0LCBzZXFubywgcmluZy0+Z2V0X3NlcW5vKHJpbmcpLAogCQkJICBkZXZfcHJpdi0+bmV4dF9zZXFubyk7CiAKIAkvKiBEaXJlY3RseSBkaXNwYXRjaCByZXF1ZXN0IHJldGlyaW5nLiAgV2hpbGUgd2UgaGF2ZSB0aGUgd29yayBxdWV1ZQpAQCAtMjAyMyw3MCArMjA0OSwzMCBAQAogCXJldHVybiBpOTE1X2RvX3dhaXRfcmVxdWVzdChkZXYsIHNlcW5vLCAxLCByaW5nKTsKIH0KIAotc3RhdGljIHZvaWQKLWk5MTVfZ2VtX2ZsdXNoX3Jpbmcoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKLQkJICAgIHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2LAotCQkgICAgc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nLAotCQkgICAgdWludDMyX3QgaW52YWxpZGF0ZV9kb21haW5zLAotCQkgICAgdWludDMyX3QgZmx1c2hfZG9tYWlucykKLXsKLQlyaW5nLT5mbHVzaChkZXYsIHJpbmcsIGludmFsaWRhdGVfZG9tYWlucywgZmx1c2hfZG9tYWlucyk7Ci0JaTkxNV9nZW1fcHJvY2Vzc19mbHVzaGluZ19saXN0KGRldiwgZmx1c2hfZG9tYWlucywgcmluZyk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1pOTE1X2dlbV9mbHVzaChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAotCSAgICAgICBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdiwKLQkgICAgICAgdWludDMyX3QgaW52YWxpZGF0ZV9kb21haW5zLAotCSAgICAgICB1aW50MzJfdCBmbHVzaF9kb21haW5zLAotCSAgICAgICB1aW50MzJfdCBmbHVzaF9yaW5ncykKLXsKLQlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQotCWlmIChmbHVzaF9kb21haW5zICYgSTkxNV9HRU1fRE9NQUlOX0NQVSkKLQkJZHJtX2FncF9jaGlwc2V0X2ZsdXNoKGRldik7Ci0KLQlpZiAoKGZsdXNoX2RvbWFpbnMgfCBpbnZhbGlkYXRlX2RvbWFpbnMpICYgSTkxNV9HRU1fR1BVX0RPTUFJTlMpIHsKLQkJaWYgKGZsdXNoX3JpbmdzICYgUklOR19SRU5ERVIpCi0JCQlpOTE1X2dlbV9mbHVzaF9yaW5nKGRldiwgZmlsZV9wcml2LAotCQkJCQkgICAgJmRldl9wcml2LT5yZW5kZXJfcmluZywKLQkJCQkJICAgIGludmFsaWRhdGVfZG9tYWlucywgZmx1c2hfZG9tYWlucyk7Ci0JCWlmIChmbHVzaF9yaW5ncyAmIFJJTkdfQlNEKQotCQkJaTkxNV9nZW1fZmx1c2hfcmluZyhkZXYsIGZpbGVfcHJpdiwKLQkJCQkJICAgICZkZXZfcHJpdi0+YnNkX3JpbmcsCi0JCQkJCSAgICBpbnZhbGlkYXRlX2RvbWFpbnMsIGZsdXNoX2RvbWFpbnMpOwotCQlpZiAoZmx1c2hfcmluZ3MgJiBSSU5HX0JMVCkKLQkJCWk5MTVfZ2VtX2ZsdXNoX3JpbmcoZGV2LCBmaWxlX3ByaXYsCi0JCQkJCSAgICAmZGV2X3ByaXYtPmJsdF9yaW5nLAotCQkJCQkgICAgaW52YWxpZGF0ZV9kb21haW5zLCBmbHVzaF9kb21haW5zKTsKLQl9Ci19Ci0KIC8qKgogICogRW5zdXJlcyB0aGF0IGFsbCByZW5kZXJpbmcgdG8gdGhlIG9iamVjdCBoYXMgY29tcGxldGVkIGFuZCB0aGUgb2JqZWN0IGlzCiAgKiBzYWZlIHRvIHVuYmluZCBmcm9tIHRoZSBHVFQgb3IgYWNjZXNzIGZyb20gdGhlIENQVS4KICAqLwotc3RhdGljIGludAotaTkxNV9nZW1fb2JqZWN0X3dhaXRfcmVuZGVyaW5nKHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqLAoraW50CitpOTE1X2dlbV9vYmplY3Rfd2FpdF9yZW5kZXJpbmcoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaiwKIAkJCSAgICAgICBib29sIGludGVycnVwdGlibGUpCiB7Ci0Jc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IG9iai0+ZGV2OwotCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmpfcHJpdiA9IHRvX2ludGVsX2JvKG9iaik7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IG9iai0+YmFzZS5kZXY7CiAJaW50IHJldDsKIAogCS8qIFRoaXMgZnVuY3Rpb24gb25seSBleGlzdHMgdG8gc3VwcG9ydCB3YWl0aW5nIGZvciBleGlzdGluZyByZW5kZXJpbmcsCiAJICogbm90IGZvciBlbWl0dGluZyByZXF1aXJlZCBmbHVzaGVzLgogCSAqLwotCUJVR19PTigob2JqLT53cml0ZV9kb21haW4gJiBJOTE1X0dFTV9HUFVfRE9NQUlOUykgIT0gMCk7CisJQlVHX09OKChvYmotPmJhc2Uud3JpdGVfZG9tYWluICYgSTkxNV9HRU1fR1BVX0RPTUFJTlMpICE9IDApOwogCiAJLyogSWYgdGhlcmUgaXMgcmVuZGVyaW5nIHF1ZXVlZCBvbiB0aGUgYnVmZmVyIGJlaW5nIGV2aWN0ZWQsIHdhaXQgZm9yCiAJICogaXQuCiAJICovCi0JaWYgKG9ial9wcml2LT5hY3RpdmUpIHsKKwlpZiAob2JqLT5hY3RpdmUpIHsKIAkJcmV0ID0gaTkxNV9kb193YWl0X3JlcXVlc3QoZGV2LAotCQkJCQkgICBvYmpfcHJpdi0+bGFzdF9yZW5kZXJpbmdfc2Vxbm8sCisJCQkJCSAgIG9iai0+bGFzdF9yZW5kZXJpbmdfc2Vxbm8sCiAJCQkJCSAgIGludGVycnVwdGlibGUsCi0JCQkJCSAgIG9ial9wcml2LT5yaW5nKTsKKwkJCQkJICAgb2JqLT5yaW5nKTsKIAkJaWYgKHJldCkKIAkJCXJldHVybiByZXQ7CiAJfQpAQCAtMjA5OCwxNyArMjA4NCwxNCBAQAogICogVW5iaW5kcyBhbiBvYmplY3QgZnJvbSB0aGUgR1RUIGFwZXJ0dXJlLgogICovCiBpbnQKLWk5MTVfZ2VtX29iamVjdF91bmJpbmQoc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmopCitpOTE1X2dlbV9vYmplY3RfdW5iaW5kKHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmopCiB7Ci0Jc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IG9iai0+ZGV2OwotCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Ci0Jc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9ial9wcml2ID0gdG9faW50ZWxfYm8ob2JqKTsKIAlpbnQgcmV0ID0gMDsKIAotCWlmIChvYmpfcHJpdi0+Z3R0X3NwYWNlID09IE5VTEwpCisJaWYgKG9iai0+Z3R0X3NwYWNlID09IE5VTEwpCiAJCXJldHVybiAwOwogCi0JaWYgKG9ial9wcml2LT5waW5fY291bnQgIT0gMCkgeworCWlmIChvYmotPnBpbl9jb3VudCAhPSAwKSB7CiAJCURSTV9FUlJPUigiQXR0ZW1wdGluZyB0byB1bmJpbmQgcGlubmVkIGJ1ZmZlclxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KQEAgLTIxMzEsMjcgKzIxMTQsMjcgQEAKIAkgKi8KIAlpZiAocmV0KSB7CiAJCWk5MTVfZ2VtX2NsZmx1c2hfb2JqZWN0KG9iaik7Ci0JCW9iai0+cmVhZF9kb21haW5zID0gb2JqLT53cml0ZV9kb21haW4gPSBJOTE1X0dFTV9ET01BSU5fQ1BVOworCQlvYmotPmJhc2UucmVhZF9kb21haW5zID0gb2JqLT5iYXNlLndyaXRlX2RvbWFpbiA9IEk5MTVfR0VNX0RPTUFJTl9DUFU7CiAJfQogCiAJLyogcmVsZWFzZSB0aGUgZmVuY2UgcmVnIF9hZnRlcl8gZmx1c2hpbmcgKi8KLQlpZiAob2JqX3ByaXYtPmZlbmNlX3JlZyAhPSBJOTE1X0ZFTkNFX1JFR19OT05FKQotCQlpOTE1X2dlbV9jbGVhcl9mZW5jZV9yZWcob2JqKTsKKwlyZXQgPSBpOTE1X2dlbV9vYmplY3RfcHV0X2ZlbmNlKG9iaik7CisJaWYgKHJldCA9PSAtRVJFU1RBUlRTWVMpCisJCXJldHVybiByZXQ7CiAKLQlkcm1fdW5iaW5kX2FncChvYmpfcHJpdi0+YWdwX21lbSk7Ci0JZHJtX2ZyZWVfYWdwKG9ial9wcml2LT5hZ3BfbWVtLCBvYmotPnNpemUgLyBQQUdFX1NJWkUpOworCWk5MTVfZ2VtX2d0dF91bmJpbmRfb2JqZWN0KG9iaik7CisJaTkxNV9nZW1fb2JqZWN0X3B1dF9wYWdlc19ndHQob2JqKTsKIAotCWk5MTVfZ2VtX29iamVjdF9wdXRfcGFnZXMob2JqKTsKLQlCVUdfT04ob2JqX3ByaXYtPnBhZ2VzX3JlZmNvdW50KTsKKwlsaXN0X2RlbF9pbml0KCZvYmotPmd0dF9saXN0KTsKKwlsaXN0X2RlbF9pbml0KCZvYmotPm1tX2xpc3QpOworCS8qIEF2b2lkIGFuIHVubmVjZXNzYXJ5IGNhbGwgdG8gdW5iaW5kIG9uIHJlYmluZC4gKi8KKwlvYmotPm1hcF9hbmRfZmVuY2VhYmxlID0gdHJ1ZTsKIAotCWk5MTVfZ2VtX2luZm9fcmVtb3ZlX2d0dChkZXZfcHJpdiwgb2JqLT5zaXplKTsKLQlsaXN0X2RlbF9pbml0KCZvYmpfcHJpdi0+bW1fbGlzdCk7CisJZHJtX21tX3B1dF9ibG9jayhvYmotPmd0dF9zcGFjZSk7CisJb2JqLT5ndHRfc3BhY2UgPSBOVUxMOworCW9iai0+Z3R0X29mZnNldCA9IDA7CiAKLQlkcm1fbW1fcHV0X2Jsb2NrKG9ial9wcml2LT5ndHRfc3BhY2UpOwotCW9ial9wcml2LT5ndHRfc3BhY2UgPSBOVUxMOwotCW9ial9wcml2LT5ndHRfb2Zmc2V0ID0gMDsKLQotCWlmIChpOTE1X2dlbV9vYmplY3RfaXNfcHVyZ2VhYmxlKG9ial9wcml2KSkKKwlpZiAoaTkxNV9nZW1fb2JqZWN0X2lzX3B1cmdlYWJsZShvYmopKQogCQlpOTE1X2dlbV9vYmplY3RfdHJ1bmNhdGUob2JqKTsKIAogCXRyYWNlX2k5MTVfZ2VtX29iamVjdF91bmJpbmQob2JqKTsKQEAgLTIxNTksMTQgKzIxNDIsMjUgQEAKIAlyZXR1cm4gcmV0OwogfQogCit2b2lkCitpOTE1X2dlbV9mbHVzaF9yaW5nKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCisJCSAgICBzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcsCisJCSAgICB1aW50MzJfdCBpbnZhbGlkYXRlX2RvbWFpbnMsCisJCSAgICB1aW50MzJfdCBmbHVzaF9kb21haW5zKQoreworCXJpbmctPmZsdXNoKHJpbmcsIGludmFsaWRhdGVfZG9tYWlucywgZmx1c2hfZG9tYWlucyk7CisJaTkxNV9nZW1fcHJvY2Vzc19mbHVzaGluZ19saXN0KGRldiwgZmx1c2hfZG9tYWlucywgcmluZyk7Cit9CisKIHN0YXRpYyBpbnQgaTkxNV9yaW5nX2lkbGUoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKIAkJCSAgc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nKQogewogCWlmIChsaXN0X2VtcHR5KCZyaW5nLT5ncHVfd3JpdGVfbGlzdCkgJiYgbGlzdF9lbXB0eSgmcmluZy0+YWN0aXZlX2xpc3QpKQogCQlyZXR1cm4gMDsKIAotCWk5MTVfZ2VtX2ZsdXNoX3JpbmcoZGV2LCBOVUxMLCByaW5nLAotCQkJICAgIEk5MTVfR0VNX0dQVV9ET01BSU5TLCBJOTE1X0dFTV9HUFVfRE9NQUlOUyk7CisJaWYgKCFsaXN0X2VtcHR5KCZyaW5nLT5ncHVfd3JpdGVfbGlzdCkpCisJCWk5MTVfZ2VtX2ZsdXNoX3JpbmcoZGV2LCByaW5nLAorCQkJCSAgICBJOTE1X0dFTV9HUFVfRE9NQUlOUywgSTkxNV9HRU1fR1BVX0RPTUFJTlMpOwogCXJldHVybiBpOTE1X3dhaXRfcmVxdWVzdChkZXYsCiAJCQkJIGk5MTVfZ2VtX25leHRfcmVxdWVzdF9zZXFubyhkZXYsIHJpbmcpLAogCQkJCSByaW5nKTsKQEAgLTIxNzcsNyArMjE3MSw3IEBACiB7CiAJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJYm9vbCBsaXN0c19lbXB0eTsKLQlpbnQgcmV0OworCWludCByZXQsIGk7CiAKIAlsaXN0c19lbXB0eSA9IChsaXN0X2VtcHR5KCZkZXZfcHJpdi0+bW0uZmx1c2hpbmdfbGlzdCkgJiYKIAkJICAgICAgIGxpc3RfZW1wdHkoJmRldl9wcml2LT5tbS5hY3RpdmVfbGlzdCkpOwpAQCAtMjE4NSwyNTggKzIxNzksMjk2IEBACiAJCXJldHVybiAwOwogCiAJLyogRmx1c2ggZXZlcnl0aGluZyBvbnRvIHRoZSBpbmFjdGl2ZSBsaXN0LiAqLwotCXJldCA9IGk5MTVfcmluZ19pZGxlKGRldiwgJmRldl9wcml2LT5yZW5kZXJfcmluZyk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCXJldCA9IGk5MTVfcmluZ19pZGxlKGRldiwgJmRldl9wcml2LT5ic2RfcmluZyk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCXJldCA9IGk5MTVfcmluZ19pZGxlKGRldiwgJmRldl9wcml2LT5ibHRfcmluZyk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKKwlmb3IgKGkgPSAwOyBpIDwgSTkxNV9OVU1fUklOR1M7IGkrKykgeworCQlyZXQgPSBpOTE1X3JpbmdfaWRsZShkZXYsICZkZXZfcHJpdi0+cmluZ1tpXSk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCX0KIAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50Ci1pOTE1X2dlbV9vYmplY3RfZ2V0X3BhZ2VzKHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqLAotCQkJICBnZnBfdCBnZnBtYXNrKQorc3RhdGljIGludCBzYW5keWJyaWRnZV93cml0ZV9mZW5jZV9yZWcoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaiwKKwkJCQkgICAgICAgc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpwaXBlbGluZWQpCiB7Ci0Jc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9ial9wcml2ID0gdG9faW50ZWxfYm8ob2JqKTsKLQlpbnQgcGFnZV9jb3VudCwgaTsKLQlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZzsKLQlzdHJ1Y3QgaW5vZGUgKmlub2RlOwotCXN0cnVjdCBwYWdlICpwYWdlOwotCi0JQlVHX09OKG9ial9wcml2LT5wYWdlc19yZWZjb3VudAotCQkJPT0gRFJNX0k5MTVfR0VNX09CSkVDVF9NQVhfUEFHRVNfUkVGQ09VTlQpOwotCi0JaWYgKG9ial9wcml2LT5wYWdlc19yZWZjb3VudCsrICE9IDApCi0JCXJldHVybiAwOwotCi0JLyogR2V0IHRoZSBsaXN0IG9mIHBhZ2VzIG91dCBvZiBvdXIgc3RydWN0IGZpbGUuICBUaGV5J2xsIGJlIHBpbm5lZAotCSAqIGF0IHRoaXMgcG9pbnQgdW50aWwgd2UgcmVsZWFzZSB0aGVtLgotCSAqLwotCXBhZ2VfY291bnQgPSBvYmotPnNpemUgLyBQQUdFX1NJWkU7Ci0JQlVHX09OKG9ial9wcml2LT5wYWdlcyAhPSBOVUxMKTsKLQlvYmpfcHJpdi0+cGFnZXMgPSBkcm1fY2FsbG9jX2xhcmdlKHBhZ2VfY291bnQsIHNpemVvZihzdHJ1Y3QgcGFnZSAqKSk7Ci0JaWYgKG9ial9wcml2LT5wYWdlcyA9PSBOVUxMKSB7Ci0JCW9ial9wcml2LT5wYWdlc19yZWZjb3VudC0tOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQlpbm9kZSA9IG9iai0+ZmlscC0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZTsKLQltYXBwaW5nID0gaW5vZGUtPmlfbWFwcGluZzsKLQlmb3IgKGkgPSAwOyBpIDwgcGFnZV9jb3VudDsgaSsrKSB7Ci0JCXBhZ2UgPSByZWFkX2NhY2hlX3BhZ2VfZ2ZwKG1hcHBpbmcsIGksCi0JCQkJCSAgIEdGUF9ISUdIVVNFUiB8Ci0JCQkJCSAgIF9fR0ZQX0NPTEQgfAotCQkJCQkgICBfX0dGUF9SRUNMQUlNQUJMRSB8Ci0JCQkJCSAgIGdmcG1hc2spOwotCQlpZiAoSVNfRVJSKHBhZ2UpKQotCQkJZ290byBlcnJfcGFnZXM7Ci0KLQkJb2JqX3ByaXYtPnBhZ2VzW2ldID0gcGFnZTsKLQl9Ci0KLQlpZiAob2JqX3ByaXYtPnRpbGluZ19tb2RlICE9IEk5MTVfVElMSU5HX05PTkUpCi0JCWk5MTVfZ2VtX29iamVjdF9kb19iaXRfMTdfc3dpenpsZShvYmopOwotCi0JcmV0dXJuIDA7Ci0KLWVycl9wYWdlczoKLQl3aGlsZSAoaS0tKQotCQlwYWdlX2NhY2hlX3JlbGVhc2Uob2JqX3ByaXYtPnBhZ2VzW2ldKTsKLQotCWRybV9mcmVlX2xhcmdlKG9ial9wcml2LT5wYWdlcyk7Ci0Jb2JqX3ByaXYtPnBhZ2VzID0gTlVMTDsKLQlvYmpfcHJpdi0+cGFnZXNfcmVmY291bnQtLTsKLQlyZXR1cm4gUFRSX0VSUihwYWdlKTsKLX0KLQotc3RhdGljIHZvaWQgc2FuZHlicmlkZ2Vfd3JpdGVfZmVuY2VfcmVnKHN0cnVjdCBkcm1faTkxNV9mZW5jZV9yZWcgKnJlZykKLXsKLQlzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iaiA9IHJlZy0+b2JqOwotCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBvYmotPmRldjsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gb2JqLT5iYXNlLmRldjsKIAlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqX3ByaXYgPSB0b19pbnRlbF9ibyhvYmopOwotCWludCByZWdudW0gPSBvYmpfcHJpdi0+ZmVuY2VfcmVnOworCXUzMiBzaXplID0gb2JqLT5ndHRfc3BhY2UtPnNpemU7CisJaW50IHJlZ251bSA9IG9iai0+ZmVuY2VfcmVnOwogCXVpbnQ2NF90IHZhbDsKIAotCXZhbCA9ICh1aW50NjRfdCkoKG9ial9wcml2LT5ndHRfb2Zmc2V0ICsgb2JqLT5zaXplIC0gNDA5NikgJgotCQkgICAgMHhmZmZmZjAwMCkgPDwgMzI7Ci0JdmFsIHw9IG9ial9wcml2LT5ndHRfb2Zmc2V0ICYgMHhmZmZmZjAwMDsKLQl2YWwgfD0gKHVpbnQ2NF90KSgob2JqX3ByaXYtPnN0cmlkZSAvIDEyOCkgLSAxKSA8PAorCXZhbCA9ICh1aW50NjRfdCkoKG9iai0+Z3R0X29mZnNldCArIHNpemUgLSA0MDk2KSAmCisJCQkgMHhmZmZmZjAwMCkgPDwgMzI7CisJdmFsIHw9IG9iai0+Z3R0X29mZnNldCAmIDB4ZmZmZmYwMDA7CisJdmFsIHw9ICh1aW50NjRfdCkoKG9iai0+c3RyaWRlIC8gMTI4KSAtIDEpIDw8CiAJCVNBTkRZQlJJREdFX0ZFTkNFX1BJVENIX1NISUZUOwogCi0JaWYgKG9ial9wcml2LT50aWxpbmdfbW9kZSA9PSBJOTE1X1RJTElOR19ZKQorCWlmIChvYmotPnRpbGluZ19tb2RlID09IEk5MTVfVElMSU5HX1kpCiAJCXZhbCB8PSAxIDw8IEk5NjVfRkVOQ0VfVElMSU5HX1lfU0hJRlQ7CiAJdmFsIHw9IEk5NjVfRkVOQ0VfUkVHX1ZBTElEOwogCi0JSTkxNV9XUklURTY0KEZFTkNFX1JFR19TQU5EWUJSSURHRV8wICsgKHJlZ251bSAqIDgpLCB2YWwpOworCWlmIChwaXBlbGluZWQpIHsKKwkJaW50IHJldCA9IGludGVsX3JpbmdfYmVnaW4ocGlwZWxpbmVkLCA2KTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisKKwkJaW50ZWxfcmluZ19lbWl0KHBpcGVsaW5lZCwgTUlfTk9PUCk7CisJCWludGVsX3JpbmdfZW1pdChwaXBlbGluZWQsIE1JX0xPQURfUkVHSVNURVJfSU1NKDIpKTsKKwkJaW50ZWxfcmluZ19lbWl0KHBpcGVsaW5lZCwgRkVOQ0VfUkVHX1NBTkRZQlJJREdFXzAgKyByZWdudW0qOCk7CisJCWludGVsX3JpbmdfZW1pdChwaXBlbGluZWQsICh1MzIpdmFsKTsKKwkJaW50ZWxfcmluZ19lbWl0KHBpcGVsaW5lZCwgRkVOQ0VfUkVHX1NBTkRZQlJJREdFXzAgKyByZWdudW0qOCArIDQpOworCQlpbnRlbF9yaW5nX2VtaXQocGlwZWxpbmVkLCAodTMyKSh2YWwgPj4gMzIpKTsKKwkJaW50ZWxfcmluZ19hZHZhbmNlKHBpcGVsaW5lZCk7CisJfSBlbHNlCisJCUk5MTVfV1JJVEU2NChGRU5DRV9SRUdfU0FORFlCUklER0VfMCArIHJlZ251bSAqIDgsIHZhbCk7CisKKwlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgaTk2NV93cml0ZV9mZW5jZV9yZWcoc3RydWN0IGRybV9pOTE1X2ZlbmNlX3JlZyAqcmVnKQorc3RhdGljIGludCBpOTY1X3dyaXRlX2ZlbmNlX3JlZyhzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqLAorCQkJCXN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcGlwZWxpbmVkKQogewotCXN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqID0gcmVnLT5vYmo7Ci0Jc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IG9iai0+ZGV2OworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBvYmotPmJhc2UuZGV2OwogCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmpfcHJpdiA9IHRvX2ludGVsX2JvKG9iaik7Ci0JaW50IHJlZ251bSA9IG9ial9wcml2LT5mZW5jZV9yZWc7CisJdTMyIHNpemUgPSBvYmotPmd0dF9zcGFjZS0+c2l6ZTsKKwlpbnQgcmVnbnVtID0gb2JqLT5mZW5jZV9yZWc7CiAJdWludDY0X3QgdmFsOwogCi0JdmFsID0gKHVpbnQ2NF90KSgob2JqX3ByaXYtPmd0dF9vZmZzZXQgKyBvYmotPnNpemUgLSA0MDk2KSAmCisJdmFsID0gKHVpbnQ2NF90KSgob2JqLT5ndHRfb2Zmc2V0ICsgc2l6ZSAtIDQwOTYpICYKIAkJICAgIDB4ZmZmZmYwMDApIDw8IDMyOwotCXZhbCB8PSBvYmpfcHJpdi0+Z3R0X29mZnNldCAmIDB4ZmZmZmYwMDA7Ci0JdmFsIHw9ICgob2JqX3ByaXYtPnN0cmlkZSAvIDEyOCkgLSAxKSA8PCBJOTY1X0ZFTkNFX1BJVENIX1NISUZUOwotCWlmIChvYmpfcHJpdi0+dGlsaW5nX21vZGUgPT0gSTkxNV9USUxJTkdfWSkKKwl2YWwgfD0gb2JqLT5ndHRfb2Zmc2V0ICYgMHhmZmZmZjAwMDsKKwl2YWwgfD0gKChvYmotPnN0cmlkZSAvIDEyOCkgLSAxKSA8PCBJOTY1X0ZFTkNFX1BJVENIX1NISUZUOworCWlmIChvYmotPnRpbGluZ19tb2RlID09IEk5MTVfVElMSU5HX1kpCiAJCXZhbCB8PSAxIDw8IEk5NjVfRkVOQ0VfVElMSU5HX1lfU0hJRlQ7CiAJdmFsIHw9IEk5NjVfRkVOQ0VfUkVHX1ZBTElEOwogCi0JSTkxNV9XUklURTY0KEZFTkNFX1JFR185NjVfMCArIChyZWdudW0gKiA4KSwgdmFsKTsKKwlpZiAocGlwZWxpbmVkKSB7CisJCWludCByZXQgPSBpbnRlbF9yaW5nX2JlZ2luKHBpcGVsaW5lZCwgNik7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCisJCWludGVsX3JpbmdfZW1pdChwaXBlbGluZWQsIE1JX05PT1ApOworCQlpbnRlbF9yaW5nX2VtaXQocGlwZWxpbmVkLCBNSV9MT0FEX1JFR0lTVEVSX0lNTSgyKSk7CisJCWludGVsX3JpbmdfZW1pdChwaXBlbGluZWQsIEZFTkNFX1JFR185NjVfMCArIHJlZ251bSo4KTsKKwkJaW50ZWxfcmluZ19lbWl0KHBpcGVsaW5lZCwgKHUzMil2YWwpOworCQlpbnRlbF9yaW5nX2VtaXQocGlwZWxpbmVkLCBGRU5DRV9SRUdfOTY1XzAgKyByZWdudW0qOCArIDQpOworCQlpbnRlbF9yaW5nX2VtaXQocGlwZWxpbmVkLCAodTMyKSh2YWwgPj4gMzIpKTsKKwkJaW50ZWxfcmluZ19hZHZhbmNlKHBpcGVsaW5lZCk7CisJfSBlbHNlCisJCUk5MTVfV1JJVEU2NChGRU5DRV9SRUdfOTY1XzAgKyByZWdudW0gKiA4LCB2YWwpOworCisJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIGk5MTVfd3JpdGVfZmVuY2VfcmVnKHN0cnVjdCBkcm1faTkxNV9mZW5jZV9yZWcgKnJlZykKK3N0YXRpYyBpbnQgaTkxNV93cml0ZV9mZW5jZV9yZWcoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaiwKKwkJCQlzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnBpcGVsaW5lZCkKIHsKLQlzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iaiA9IHJlZy0+b2JqOwotCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBvYmotPmRldjsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gb2JqLT5iYXNlLmRldjsKIAlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqX3ByaXYgPSB0b19pbnRlbF9ibyhvYmopOwotCWludCByZWdudW0gPSBvYmpfcHJpdi0+ZmVuY2VfcmVnOworCXUzMiBzaXplID0gb2JqLT5ndHRfc3BhY2UtPnNpemU7CisJdTMyIGZlbmNlX3JlZywgdmFsLCBwaXRjaF92YWw7CiAJaW50IHRpbGVfd2lkdGg7Ci0JdWludDMyX3QgZmVuY2VfcmVnLCB2YWw7Ci0JdWludDMyX3QgcGl0Y2hfdmFsOwogCi0JaWYgKChvYmpfcHJpdi0+Z3R0X29mZnNldCAmIH5JOTE1X0ZFTkNFX1NUQVJUX01BU0spIHx8Ci0JICAgIChvYmpfcHJpdi0+Z3R0X29mZnNldCAmIChvYmotPnNpemUgLSAxKSkpIHsKLQkJV0FSTigxLCAiJXM6IG9iamVjdCAweCUwOHggbm90IDFNIG9yIHNpemUgKDB4JXp4KSBhbGlnbmVkXG4iLAotCQkgICAgIF9fZnVuY19fLCBvYmpfcHJpdi0+Z3R0X29mZnNldCwgb2JqLT5zaXplKTsKLQkJcmV0dXJuOwotCX0KKwlpZiAoV0FSTigob2JqLT5ndHRfb2Zmc2V0ICYgfkk5MTVfRkVOQ0VfU1RBUlRfTUFTSykgfHwKKwkJIChzaXplICYgLXNpemUpICE9IHNpemUgfHwKKwkJIChvYmotPmd0dF9vZmZzZXQgJiAoc2l6ZSAtIDEpKSwKKwkJICJvYmplY3QgMHglMDh4IFtmZW5jZWFibGU/ICVkXSBub3QgMU0gb3IgcG90LXNpemUgKDB4JTA4eCkgYWxpZ25lZFxuIiwKKwkJIG9iai0+Z3R0X29mZnNldCwgb2JqLT5tYXBfYW5kX2ZlbmNlYWJsZSwgc2l6ZSkpCisJCXJldHVybiAtRUlOVkFMOwogCi0JaWYgKG9ial9wcml2LT50aWxpbmdfbW9kZSA9PSBJOTE1X1RJTElOR19ZICYmCi0JICAgIEhBU18xMjhfQllURV9ZX1RJTElORyhkZXYpKQorCWlmIChvYmotPnRpbGluZ19tb2RlID09IEk5MTVfVElMSU5HX1kgJiYgSEFTXzEyOF9CWVRFX1lfVElMSU5HKGRldikpCiAJCXRpbGVfd2lkdGggPSAxMjg7CiAJZWxzZQogCQl0aWxlX3dpZHRoID0gNTEyOwogCiAJLyogTm90ZTogcGl0Y2ggYmV0dGVyIGJlIGEgcG93ZXIgb2YgdHdvIHRpbGUgd2lkdGhzICovCi0JcGl0Y2hfdmFsID0gb2JqX3ByaXYtPnN0cmlkZSAvIHRpbGVfd2lkdGg7CisJcGl0Y2hfdmFsID0gb2JqLT5zdHJpZGUgLyB0aWxlX3dpZHRoOwogCXBpdGNoX3ZhbCA9IGZmcyhwaXRjaF92YWwpIC0gMTsKIAotCWlmIChvYmpfcHJpdi0+dGlsaW5nX21vZGUgPT0gSTkxNV9USUxJTkdfWSAmJgotCSAgICBIQVNfMTI4X0JZVEVfWV9USUxJTkcoZGV2KSkKLQkJV0FSTl9PTihwaXRjaF92YWwgPiBJODMwX0ZFTkNFX01BWF9QSVRDSF9WQUwpOwotCWVsc2UKLQkJV0FSTl9PTihwaXRjaF92YWwgPiBJOTE1X0ZFTkNFX01BWF9QSVRDSF9WQUwpOwotCi0JdmFsID0gb2JqX3ByaXYtPmd0dF9vZmZzZXQ7Ci0JaWYgKG9ial9wcml2LT50aWxpbmdfbW9kZSA9PSBJOTE1X1RJTElOR19ZKQorCXZhbCA9IG9iai0+Z3R0X29mZnNldDsKKwlpZiAob2JqLT50aWxpbmdfbW9kZSA9PSBJOTE1X1RJTElOR19ZKQogCQl2YWwgfD0gMSA8PCBJODMwX0ZFTkNFX1RJTElOR19ZX1NISUZUOwotCXZhbCB8PSBJOTE1X0ZFTkNFX1NJWkVfQklUUyhvYmotPnNpemUpOworCXZhbCB8PSBJOTE1X0ZFTkNFX1NJWkVfQklUUyhzaXplKTsKIAl2YWwgfD0gcGl0Y2hfdmFsIDw8IEk4MzBfRkVOQ0VfUElUQ0hfU0hJRlQ7CiAJdmFsIHw9IEk4MzBfRkVOQ0VfUkVHX1ZBTElEOwogCi0JaWYgKHJlZ251bSA8IDgpCi0JCWZlbmNlX3JlZyA9IEZFTkNFX1JFR184MzBfMCArIChyZWdudW0gKiA0KTsKKwlmZW5jZV9yZWcgPSBvYmotPmZlbmNlX3JlZzsKKwlpZiAoZmVuY2VfcmVnIDwgOCkKKwkJZmVuY2VfcmVnID0gRkVOQ0VfUkVHXzgzMF8wICsgZmVuY2VfcmVnICogNDsKIAllbHNlCi0JCWZlbmNlX3JlZyA9IEZFTkNFX1JFR185NDVfOCArICgocmVnbnVtIC0gOCkgKiA0KTsKLQlJOTE1X1dSSVRFKGZlbmNlX3JlZywgdmFsKTsKKwkJZmVuY2VfcmVnID0gRkVOQ0VfUkVHXzk0NV84ICsgKGZlbmNlX3JlZyAtIDgpICogNDsKKworCWlmIChwaXBlbGluZWQpIHsKKwkJaW50IHJldCA9IGludGVsX3JpbmdfYmVnaW4ocGlwZWxpbmVkLCA0KTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisKKwkJaW50ZWxfcmluZ19lbWl0KHBpcGVsaW5lZCwgTUlfTk9PUCk7CisJCWludGVsX3JpbmdfZW1pdChwaXBlbGluZWQsIE1JX0xPQURfUkVHSVNURVJfSU1NKDEpKTsKKwkJaW50ZWxfcmluZ19lbWl0KHBpcGVsaW5lZCwgZmVuY2VfcmVnKTsKKwkJaW50ZWxfcmluZ19lbWl0KHBpcGVsaW5lZCwgdmFsKTsKKwkJaW50ZWxfcmluZ19hZHZhbmNlKHBpcGVsaW5lZCk7CisJfSBlbHNlCisJCUk5MTVfV1JJVEUoZmVuY2VfcmVnLCB2YWwpOworCisJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIGk4MzBfd3JpdGVfZmVuY2VfcmVnKHN0cnVjdCBkcm1faTkxNV9mZW5jZV9yZWcgKnJlZykKK3N0YXRpYyBpbnQgaTgzMF93cml0ZV9mZW5jZV9yZWcoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaiwKKwkJCQlzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnBpcGVsaW5lZCkKIHsKLQlzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iaiA9IHJlZy0+b2JqOwotCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBvYmotPmRldjsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gb2JqLT5iYXNlLmRldjsKIAlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqX3ByaXYgPSB0b19pbnRlbF9ibyhvYmopOwotCWludCByZWdudW0gPSBvYmpfcHJpdi0+ZmVuY2VfcmVnOworCXUzMiBzaXplID0gb2JqLT5ndHRfc3BhY2UtPnNpemU7CisJaW50IHJlZ251bSA9IG9iai0+ZmVuY2VfcmVnOwogCXVpbnQzMl90IHZhbDsKIAl1aW50MzJfdCBwaXRjaF92YWw7Ci0JdWludDMyX3QgZmVuY2Vfc2l6ZV9iaXRzOwogCi0JaWYgKChvYmpfcHJpdi0+Z3R0X29mZnNldCAmIH5JODMwX0ZFTkNFX1NUQVJUX01BU0spIHx8Ci0JICAgIChvYmpfcHJpdi0+Z3R0X29mZnNldCAmIChvYmotPnNpemUgLSAxKSkpIHsKLQkJV0FSTigxLCAiJXM6IG9iamVjdCAweCUwOHggbm90IDUxMksgb3Igc2l6ZSBhbGlnbmVkXG4iLAotCQkgICAgIF9fZnVuY19fLCBvYmpfcHJpdi0+Z3R0X29mZnNldCk7Ci0JCXJldHVybjsKLQl9CisJaWYgKFdBUk4oKG9iai0+Z3R0X29mZnNldCAmIH5JODMwX0ZFTkNFX1NUQVJUX01BU0spIHx8CisJCSAoc2l6ZSAmIC1zaXplKSAhPSBzaXplIHx8CisJCSAob2JqLT5ndHRfb2Zmc2V0ICYgKHNpemUgLSAxKSksCisJCSAib2JqZWN0IDB4JTA4eCBub3QgNTEySyBvciBwb3Qtc2l6ZSAweCUwOHggYWxpZ25lZFxuIiwKKwkJIG9iai0+Z3R0X29mZnNldCwgc2l6ZSkpCisJCXJldHVybiAtRUlOVkFMOwogCi0JcGl0Y2hfdmFsID0gb2JqX3ByaXYtPnN0cmlkZSAvIDEyODsKKwlwaXRjaF92YWwgPSBvYmotPnN0cmlkZSAvIDEyODsKIAlwaXRjaF92YWwgPSBmZnMocGl0Y2hfdmFsKSAtIDE7Ci0JV0FSTl9PTihwaXRjaF92YWwgPiBJODMwX0ZFTkNFX01BWF9QSVRDSF9WQUwpOwogCi0JdmFsID0gb2JqX3ByaXYtPmd0dF9vZmZzZXQ7Ci0JaWYgKG9ial9wcml2LT50aWxpbmdfbW9kZSA9PSBJOTE1X1RJTElOR19ZKQorCXZhbCA9IG9iai0+Z3R0X29mZnNldDsKKwlpZiAob2JqLT50aWxpbmdfbW9kZSA9PSBJOTE1X1RJTElOR19ZKQogCQl2YWwgfD0gMSA8PCBJODMwX0ZFTkNFX1RJTElOR19ZX1NISUZUOwotCWZlbmNlX3NpemVfYml0cyA9IEk4MzBfRkVOQ0VfU0laRV9CSVRTKG9iai0+c2l6ZSk7Ci0JV0FSTl9PTihmZW5jZV9zaXplX2JpdHMgJiB+MHgwMDAwMGYwMCk7Ci0JdmFsIHw9IGZlbmNlX3NpemVfYml0czsKKwl2YWwgfD0gSTgzMF9GRU5DRV9TSVpFX0JJVFMoc2l6ZSk7CiAJdmFsIHw9IHBpdGNoX3ZhbCA8PCBJODMwX0ZFTkNFX1BJVENIX1NISUZUOwogCXZhbCB8PSBJODMwX0ZFTkNFX1JFR19WQUxJRDsKIAotCUk5MTVfV1JJVEUoRkVOQ0VfUkVHXzgzMF8wICsgKHJlZ251bSAqIDQpLCB2YWwpOworCWlmIChwaXBlbGluZWQpIHsKKwkJaW50IHJldCA9IGludGVsX3JpbmdfYmVnaW4ocGlwZWxpbmVkLCA0KTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisKKwkJaW50ZWxfcmluZ19lbWl0KHBpcGVsaW5lZCwgTUlfTk9PUCk7CisJCWludGVsX3JpbmdfZW1pdChwaXBlbGluZWQsIE1JX0xPQURfUkVHSVNURVJfSU1NKDEpKTsKKwkJaW50ZWxfcmluZ19lbWl0KHBpcGVsaW5lZCwgRkVOQ0VfUkVHXzgzMF8wICsgcmVnbnVtKjQpOworCQlpbnRlbF9yaW5nX2VtaXQocGlwZWxpbmVkLCB2YWwpOworCQlpbnRlbF9yaW5nX2FkdmFuY2UocGlwZWxpbmVkKTsKKwl9IGVsc2UKKwkJSTkxNV9XUklURShGRU5DRV9SRUdfODMwXzAgKyByZWdudW0gKiA0LCB2YWwpOworCisJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgaTkxNV9maW5kX2ZlbmNlX3JlZyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAotCQkJICAgICAgIGJvb2wgaW50ZXJydXB0aWJsZSkKK3N0YXRpYyBib29sIHJpbmdfcGFzc2VkX3NlcW5vKHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZywgdTMyIHNlcW5vKQogewotCXN0cnVjdCBkcm1faTkxNV9mZW5jZV9yZWcgKnJlZyA9IE5VTEw7Ci0Jc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9ial9wcml2ID0gTlVMTDsKKwlyZXR1cm4gaTkxNV9zZXFub19wYXNzZWQocmluZy0+Z2V0X3NlcW5vKHJpbmcpLCBzZXFubyk7Cit9CisKK3N0YXRpYyBpbnQKK2k5MTVfZ2VtX29iamVjdF9mbHVzaF9mZW5jZShzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqLAorCQkJICAgIHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcGlwZWxpbmVkLAorCQkJICAgIGJvb2wgaW50ZXJydXB0aWJsZSkKK3sKKwlpbnQgcmV0OworCisJaWYgKG9iai0+ZmVuY2VkX2dwdV9hY2Nlc3MpIHsKKwkJaWYgKG9iai0+YmFzZS53cml0ZV9kb21haW4gJiBJOTE1X0dFTV9HUFVfRE9NQUlOUykKKwkJCWk5MTVfZ2VtX2ZsdXNoX3Jpbmcob2JqLT5iYXNlLmRldiwKKwkJCQkJICAgIG9iai0+bGFzdF9mZW5jZWRfcmluZywKKwkJCQkJICAgIDAsIG9iai0+YmFzZS53cml0ZV9kb21haW4pOworCisJCW9iai0+ZmVuY2VkX2dwdV9hY2Nlc3MgPSBmYWxzZTsKKwl9CisKKwlpZiAob2JqLT5sYXN0X2ZlbmNlZF9zZXFubyAmJiBwaXBlbGluZWQgIT0gb2JqLT5sYXN0X2ZlbmNlZF9yaW5nKSB7CisJCWlmICghcmluZ19wYXNzZWRfc2Vxbm8ob2JqLT5sYXN0X2ZlbmNlZF9yaW5nLAorCQkJCSAgICAgICBvYmotPmxhc3RfZmVuY2VkX3NlcW5vKSkgeworCQkJcmV0ID0gaTkxNV9kb193YWl0X3JlcXVlc3Qob2JqLT5iYXNlLmRldiwKKwkJCQkJCSAgIG9iai0+bGFzdF9mZW5jZWRfc2Vxbm8sCisJCQkJCQkgICBpbnRlcnJ1cHRpYmxlLAorCQkJCQkJICAgb2JqLT5sYXN0X2ZlbmNlZF9yaW5nKTsKKwkJCWlmIChyZXQpCisJCQkJcmV0dXJuIHJldDsKKwkJfQorCisJCW9iai0+bGFzdF9mZW5jZWRfc2Vxbm8gPSAwOworCQlvYmotPmxhc3RfZmVuY2VkX3JpbmcgPSBOVUxMOworCX0KKworCXJldHVybiAwOworfQorCitpbnQKK2k5MTVfZ2VtX29iamVjdF9wdXRfZmVuY2Uoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaikKK3sKKwlpbnQgcmV0OworCisJaWYgKG9iai0+dGlsaW5nX21vZGUpCisJCWk5MTVfZ2VtX3JlbGVhc2VfbW1hcChvYmopOworCisJcmV0ID0gaTkxNV9nZW1fb2JqZWN0X2ZsdXNoX2ZlbmNlKG9iaiwgTlVMTCwgdHJ1ZSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWlmIChvYmotPmZlbmNlX3JlZyAhPSBJOTE1X0ZFTkNFX1JFR19OT05FKSB7CisJCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IG9iai0+YmFzZS5kZXYtPmRldl9wcml2YXRlOworCQlpOTE1X2dlbV9jbGVhcl9mZW5jZV9yZWcob2JqLT5iYXNlLmRldiwKKwkJCQkJICZkZXZfcHJpdi0+ZmVuY2VfcmVnc1tvYmotPmZlbmNlX3JlZ10pOworCisJCW9iai0+ZmVuY2VfcmVnID0gSTkxNV9GRU5DRV9SRUdfTk9ORTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBkcm1faTkxNV9mZW5jZV9yZWcgKgoraTkxNV9maW5kX2ZlbmNlX3JlZyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAorCQkgICAgc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpwaXBlbGluZWQpCit7CiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iaiA9IE5VTEw7Ci0JaW50IGksIGF2YWlsLCByZXQ7CisJc3RydWN0IGRybV9pOTE1X2ZlbmNlX3JlZyAqcmVnLCAqZmlyc3QsICphdmFpbDsKKwlpbnQgaTsKIAogCS8qIEZpcnN0IHRyeSB0byBmaW5kIGEgZnJlZSByZWcgKi8KLQlhdmFpbCA9IDA7CisJYXZhaWwgPSBOVUxMOwogCWZvciAoaSA9IGRldl9wcml2LT5mZW5jZV9yZWdfc3RhcnQ7IGkgPCBkZXZfcHJpdi0+bnVtX2ZlbmNlX3JlZ3M7IGkrKykgewogCQlyZWcgPSAmZGV2X3ByaXYtPmZlbmNlX3JlZ3NbaV07CiAJCWlmICghcmVnLT5vYmopCi0JCQlyZXR1cm4gaTsKKwkJCXJldHVybiByZWc7CiAKLQkJb2JqX3ByaXYgPSB0b19pbnRlbF9ibyhyZWctPm9iaik7Ci0JCWlmICghb2JqX3ByaXYtPnBpbl9jb3VudCkKLQkJICAgIGF2YWlsKys7CisJCWlmICghcmVnLT5vYmotPnBpbl9jb3VudCkKKwkJCWF2YWlsID0gcmVnOwogCX0KIAotCWlmIChhdmFpbCA9PSAwKQotCQlyZXR1cm4gLUVOT1NQQzsKKwlpZiAoYXZhaWwgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CiAKIAkvKiBOb25lIGF2YWlsYWJsZSwgdHJ5IHRvIHN0ZWFsIG9uZSBvciB3YWl0IGZvciBhIHVzZXIgdG8gZmluaXNoICovCi0JaSA9IEk5MTVfRkVOQ0VfUkVHX05PTkU7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeShyZWcsICZkZXZfcHJpdi0+bW0uZmVuY2VfbGlzdCwKLQkJCSAgICBscnVfbGlzdCkgewotCQlvYmogPSByZWctPm9iajsKLQkJb2JqX3ByaXYgPSB0b19pbnRlbF9ibyhvYmopOwotCi0JCWlmIChvYmpfcHJpdi0+cGluX2NvdW50KQorCWF2YWlsID0gZmlyc3QgPSBOVUxMOworCWxpc3RfZm9yX2VhY2hfZW50cnkocmVnLCAmZGV2X3ByaXYtPm1tLmZlbmNlX2xpc3QsIGxydV9saXN0KSB7CisJCWlmIChyZWctPm9iai0+cGluX2NvdW50KQogCQkJY29udGludWU7CiAKLQkJLyogZm91bmQgb25lISAqLwotCQlpID0gb2JqX3ByaXYtPmZlbmNlX3JlZzsKLQkJYnJlYWs7CisJCWlmIChmaXJzdCA9PSBOVUxMKQorCQkJZmlyc3QgPSByZWc7CisKKwkJaWYgKCFwaXBlbGluZWQgfHwKKwkJICAgICFyZWctPm9iai0+bGFzdF9mZW5jZWRfcmluZyB8fAorCQkgICAgcmVnLT5vYmotPmxhc3RfZmVuY2VkX3JpbmcgPT0gcGlwZWxpbmVkKSB7CisJCQlhdmFpbCA9IHJlZzsKKwkJCWJyZWFrOworCQl9CiAJfQogCi0JQlVHX09OKGkgPT0gSTkxNV9GRU5DRV9SRUdfTk9ORSk7CisJaWYgKGF2YWlsID09IE5VTEwpCisJCWF2YWlsID0gZmlyc3Q7CiAKLQkvKiBXZSBvbmx5IGhhdmUgYSByZWZlcmVuY2Ugb24gb2JqIGZyb20gdGhlIGFjdGl2ZSBsaXN0LiBwdXRfZmVuY2VfcmVnCi0JICogbWlnaHQgZHJvcCB0aGF0IG9uZSwgY2F1c2luZyBhIHVzZS1hZnRlci1mcmVlIGluIGl0LiBTbyBob2xkIGEKLQkgKiBwcml2YXRlIHJlZmVyZW5jZSB0byBvYmogbGlrZSB0aGUgb3RoZXIgY2FsbGVycyBvZiBwdXRfZmVuY2VfcmVnCi0JICogKHNldF90aWxpbmcgaW9jdGwpIGRvLiAqLwotCWRybV9nZW1fb2JqZWN0X3JlZmVyZW5jZShvYmopOwotCXJldCA9IGk5MTVfZ2VtX29iamVjdF9wdXRfZmVuY2VfcmVnKG9iaiwgaW50ZXJydXB0aWJsZSk7Ci0JZHJtX2dlbV9vYmplY3RfdW5yZWZlcmVuY2Uob2JqKTsKLQlpZiAocmV0ICE9IDApCi0JCXJldHVybiByZXQ7Ci0KLQlyZXR1cm4gaTsKKwlyZXR1cm4gYXZhaWw7CiB9CiAKIC8qKgotICogaTkxNV9nZW1fb2JqZWN0X2dldF9mZW5jZV9yZWcgLSBzZXQgdXAgYSBmZW5jZSByZWcgZm9yIGFuIG9iamVjdAorICogaTkxNV9nZW1fb2JqZWN0X2dldF9mZW5jZSAtIHNldCB1cCBhIGZlbmNlIHJlZyBmb3IgYW4gb2JqZWN0CiAgKiBAb2JqOiBvYmplY3QgdG8gbWFwIHRocm91Z2ggYSBmZW5jZSByZWcKKyAqIEBwaXBlbGluZWQ6IHJpbmcgb24gd2hpY2ggdG8gcXVldWUgdGhlIGNoYW5nZSwgb3IgTlVMTCBmb3IgQ1BVIGFjY2VzcworICogQGludGVycnVwdGlibGU6IG11c3Qgd2Ugd2FpdCB1bmludGVycnVwdGlibHkgZm9yIHRoZSByZWdpc3RlciB0byByZXRpcmU/CiAgKgogICogV2hlbiBtYXBwaW5nIG9iamVjdHMgdGhyb3VnaCB0aGUgR1RULCB1c2Vyc3BhY2Ugd2FudHMgdG8gYmUgYWJsZSB0byB3cml0ZQogICogdG8gdGhlbSB3aXRob3V0IGhhdmluZyB0byB3b3JyeSBhYm91dCBzd2l6emxpbmcgaWYgdGhlIG9iamVjdCBpcyB0aWxlZC4KQEAgLTI0NDgsNzIgKzI0ODAsMTM4IEBACiAgKiBhbmQgdGlsaW5nIGZvcm1hdC4KICAqLwogaW50Ci1pOTE1X2dlbV9vYmplY3RfZ2V0X2ZlbmNlX3JlZyhzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iaiwKLQkJCSAgICAgIGJvb2wgaW50ZXJydXB0aWJsZSkKK2k5MTVfZ2VtX29iamVjdF9nZXRfZmVuY2Uoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaiwKKwkJCSAgc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpwaXBlbGluZWQsCisJCQkgIGJvb2wgaW50ZXJydXB0aWJsZSkKIHsKLQlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gb2JqLT5kZXY7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IG9iai0+YmFzZS5kZXY7CiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqX3ByaXYgPSB0b19pbnRlbF9ibyhvYmopOwotCXN0cnVjdCBkcm1faTkxNV9mZW5jZV9yZWcgKnJlZyA9IE5VTEw7CisJc3RydWN0IGRybV9pOTE1X2ZlbmNlX3JlZyAqcmVnOwogCWludCByZXQ7CiAKLQkvKiBKdXN0IHVwZGF0ZSBvdXIgcGxhY2UgaW4gdGhlIExSVSBpZiBvdXIgZmVuY2UgaXMgZ2V0dGluZyB1c2VkLiAqLwotCWlmIChvYmpfcHJpdi0+ZmVuY2VfcmVnICE9IEk5MTVfRkVOQ0VfUkVHX05PTkUpIHsKLQkJcmVnID0gJmRldl9wcml2LT5mZW5jZV9yZWdzW29ial9wcml2LT5mZW5jZV9yZWddOworCS8qIFhYWCBkaXNhYmxlIHBpcGVsaW5pbmcuIFRoZXJlIGFyZSBidWdzLiBTaG9ja2luZy4gKi8KKwlwaXBlbGluZWQgPSBOVUxMOworCisJLyogSnVzdCB1cGRhdGUgb3VyIHBsYWNlIGluIHRoZSBMUlUgaWYgb3VyIGZlbmNlIGlzIGdldHRpbmcgcmV1c2VkLiAqLworCWlmIChvYmotPmZlbmNlX3JlZyAhPSBJOTE1X0ZFTkNFX1JFR19OT05FKSB7CisJCXJlZyA9ICZkZXZfcHJpdi0+ZmVuY2VfcmVnc1tvYmotPmZlbmNlX3JlZ107CiAJCWxpc3RfbW92ZV90YWlsKCZyZWctPmxydV9saXN0LCAmZGV2X3ByaXYtPm1tLmZlbmNlX2xpc3QpOworCisJCWlmICghb2JqLT5mZW5jZWRfZ3B1X2FjY2VzcyAmJiAhb2JqLT5sYXN0X2ZlbmNlZF9zZXFubykKKwkJCXBpcGVsaW5lZCA9IE5VTEw7CisKKwkJaWYgKCFwaXBlbGluZWQpIHsKKwkJCWlmIChyZWctPnNldHVwX3NlcW5vKSB7CisJCQkJaWYgKCFyaW5nX3Bhc3NlZF9zZXFubyhvYmotPmxhc3RfZmVuY2VkX3JpbmcsCisJCQkJCQkgICAgICAgcmVnLT5zZXR1cF9zZXFubykpIHsKKwkJCQkJcmV0ID0gaTkxNV9kb193YWl0X3JlcXVlc3Qob2JqLT5iYXNlLmRldiwKKwkJCQkJCQkJICAgcmVnLT5zZXR1cF9zZXFubywKKwkJCQkJCQkJICAgaW50ZXJydXB0aWJsZSwKKwkJCQkJCQkJICAgb2JqLT5sYXN0X2ZlbmNlZF9yaW5nKTsKKwkJCQkJaWYgKHJldCkKKwkJCQkJCXJldHVybiByZXQ7CisJCQkJfQorCisJCQkJcmVnLT5zZXR1cF9zZXFubyA9IDA7CisJCQl9CisJCX0gZWxzZSBpZiAob2JqLT5sYXN0X2ZlbmNlZF9yaW5nICYmCisJCQkgICBvYmotPmxhc3RfZmVuY2VkX3JpbmcgIT0gcGlwZWxpbmVkKSB7CisJCQlyZXQgPSBpOTE1X2dlbV9vYmplY3RfZmx1c2hfZmVuY2Uob2JqLAorCQkJCQkJCSAgcGlwZWxpbmVkLAorCQkJCQkJCSAgaW50ZXJydXB0aWJsZSk7CisJCQlpZiAocmV0KQorCQkJCXJldHVybiByZXQ7CisJCX0gZWxzZSBpZiAob2JqLT50aWxpbmdfY2hhbmdlZCkgeworCQkJaWYgKG9iai0+ZmVuY2VkX2dwdV9hY2Nlc3MpIHsKKwkJCQlpZiAob2JqLT5iYXNlLndyaXRlX2RvbWFpbiAmIEk5MTVfR0VNX0dQVV9ET01BSU5TKQorCQkJCQlpOTE1X2dlbV9mbHVzaF9yaW5nKG9iai0+YmFzZS5kZXYsIG9iai0+cmluZywKKwkJCQkJCQkgICAgMCwgb2JqLT5iYXNlLndyaXRlX2RvbWFpbik7CisKKwkJCQlvYmotPmZlbmNlZF9ncHVfYWNjZXNzID0gZmFsc2U7CisJCQl9CisJCX0KKworCQlpZiAoIW9iai0+ZmVuY2VkX2dwdV9hY2Nlc3MgJiYgIW9iai0+bGFzdF9mZW5jZWRfc2Vxbm8pCisJCQlwaXBlbGluZWQgPSBOVUxMOworCQlCVUdfT04oIXBpcGVsaW5lZCAmJiByZWctPnNldHVwX3NlcW5vKTsKKworCQlpZiAob2JqLT50aWxpbmdfY2hhbmdlZCkgeworCQkJaWYgKHBpcGVsaW5lZCkgeworCQkJCXJlZy0+c2V0dXBfc2Vxbm8gPQorCQkJCQlpOTE1X2dlbV9uZXh0X3JlcXVlc3Rfc2Vxbm8oZGV2LCBwaXBlbGluZWQpOworCQkJCW9iai0+bGFzdF9mZW5jZWRfc2Vxbm8gPSByZWctPnNldHVwX3NlcW5vOworCQkJCW9iai0+bGFzdF9mZW5jZWRfcmluZyA9IHBpcGVsaW5lZDsKKwkJCX0KKwkJCWdvdG8gdXBkYXRlOworCQl9CisKIAkJcmV0dXJuIDA7CiAJfQogCi0Jc3dpdGNoIChvYmpfcHJpdi0+dGlsaW5nX21vZGUpIHsKLQljYXNlIEk5MTVfVElMSU5HX05PTkU6Ci0JCVdBUk4oMSwgImFsbG9jYXRpbmcgYSBmZW5jZSBmb3Igbm9uLXRpbGVkIG9iamVjdD9cbiIpOwotCQlicmVhazsKLQljYXNlIEk5MTVfVElMSU5HX1g6Ci0JCWlmICghb2JqX3ByaXYtPnN0cmlkZSkKLQkJCXJldHVybiAtRUlOVkFMOwotCQlXQVJOKChvYmpfcHJpdi0+c3RyaWRlICYgKDUxMiAtIDEpKSwKLQkJICAgICAib2JqZWN0IDB4JTA4eCBpcyBYIHRpbGVkIGJ1dCBoYXMgbm9uLTUxMkIgcGl0Y2hcbiIsCi0JCSAgICAgb2JqX3ByaXYtPmd0dF9vZmZzZXQpOwotCQlicmVhazsKLQljYXNlIEk5MTVfVElMSU5HX1k6Ci0JCWlmICghb2JqX3ByaXYtPnN0cmlkZSkKLQkJCXJldHVybiAtRUlOVkFMOwotCQlXQVJOKChvYmpfcHJpdi0+c3RyaWRlICYgKDEyOCAtIDEpKSwKLQkJICAgICAib2JqZWN0IDB4JTA4eCBpcyBZIHRpbGVkIGJ1dCBoYXMgbm9uLTEyOEIgcGl0Y2hcbiIsCi0JCSAgICAgb2JqX3ByaXYtPmd0dF9vZmZzZXQpOwotCQlicmVhazsKLQl9CisJcmVnID0gaTkxNV9maW5kX2ZlbmNlX3JlZyhkZXYsIHBpcGVsaW5lZCk7CisJaWYgKHJlZyA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT1NQQzsKIAotCXJldCA9IGk5MTVfZmluZF9mZW5jZV9yZWcoZGV2LCBpbnRlcnJ1cHRpYmxlKTsKLQlpZiAocmV0IDwgMCkKKwlyZXQgPSBpOTE1X2dlbV9vYmplY3RfZmx1c2hfZmVuY2Uob2JqLCBwaXBlbGluZWQsIGludGVycnVwdGlibGUpOworCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKLQlvYmpfcHJpdi0+ZmVuY2VfcmVnID0gcmV0OwotCXJlZyA9ICZkZXZfcHJpdi0+ZmVuY2VfcmVnc1tvYmpfcHJpdi0+ZmVuY2VfcmVnXTsKLQlsaXN0X2FkZF90YWlsKCZyZWctPmxydV9saXN0LCAmZGV2X3ByaXYtPm1tLmZlbmNlX2xpc3QpOworCWlmIChyZWctPm9iaikgeworCQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2xkID0gcmVnLT5vYmo7CisKKwkJZHJtX2dlbV9vYmplY3RfcmVmZXJlbmNlKCZvbGQtPmJhc2UpOworCisJCWlmIChvbGQtPnRpbGluZ19tb2RlKQorCQkJaTkxNV9nZW1fcmVsZWFzZV9tbWFwKG9sZCk7CisKKwkJcmV0ID0gaTkxNV9nZW1fb2JqZWN0X2ZsdXNoX2ZlbmNlKG9sZCwKKwkJCQkJCSAgcGlwZWxpbmVkLAorCQkJCQkJICBpbnRlcnJ1cHRpYmxlKTsKKwkJaWYgKHJldCkgeworCQkJZHJtX2dlbV9vYmplY3RfdW5yZWZlcmVuY2UoJm9sZC0+YmFzZSk7CisJCQlyZXR1cm4gcmV0OworCQl9CisKKwkJaWYgKG9sZC0+bGFzdF9mZW5jZWRfc2Vxbm8gPT0gMCAmJiBvYmotPmxhc3RfZmVuY2VkX3NlcW5vID09IDApCisJCQlwaXBlbGluZWQgPSBOVUxMOworCisJCW9sZC0+ZmVuY2VfcmVnID0gSTkxNV9GRU5DRV9SRUdfTk9ORTsKKwkJb2xkLT5sYXN0X2ZlbmNlZF9yaW5nID0gcGlwZWxpbmVkOworCQlvbGQtPmxhc3RfZmVuY2VkX3NlcW5vID0KKwkJCXBpcGVsaW5lZCA/IGk5MTVfZ2VtX25leHRfcmVxdWVzdF9zZXFubyhkZXYsIHBpcGVsaW5lZCkgOiAwOworCisJCWRybV9nZW1fb2JqZWN0X3VucmVmZXJlbmNlKCZvbGQtPmJhc2UpOworCX0gZWxzZSBpZiAob2JqLT5sYXN0X2ZlbmNlZF9zZXFubyA9PSAwKQorCQlwaXBlbGluZWQgPSBOVUxMOwogCiAJcmVnLT5vYmogPSBvYmo7CisJbGlzdF9tb3ZlX3RhaWwoJnJlZy0+bHJ1X2xpc3QsICZkZXZfcHJpdi0+bW0uZmVuY2VfbGlzdCk7CisJb2JqLT5mZW5jZV9yZWcgPSByZWcgLSBkZXZfcHJpdi0+ZmVuY2VfcmVnczsKKwlvYmotPmxhc3RfZmVuY2VkX3JpbmcgPSBwaXBlbGluZWQ7CiAKKwlyZWctPnNldHVwX3NlcW5vID0KKwkJcGlwZWxpbmVkID8gaTkxNV9nZW1fbmV4dF9yZXF1ZXN0X3NlcW5vKGRldiwgcGlwZWxpbmVkKSA6IDA7CisJb2JqLT5sYXN0X2ZlbmNlZF9zZXFubyA9IHJlZy0+c2V0dXBfc2Vxbm87CisKK3VwZGF0ZToKKwlvYmotPnRpbGluZ19jaGFuZ2VkID0gZmFsc2U7CiAJc3dpdGNoIChJTlRFTF9JTkZPKGRldiktPmdlbikgewogCWNhc2UgNjoKLQkJc2FuZHlicmlkZ2Vfd3JpdGVfZmVuY2VfcmVnKHJlZyk7CisJCXJldCA9IHNhbmR5YnJpZGdlX3dyaXRlX2ZlbmNlX3JlZyhvYmosIHBpcGVsaW5lZCk7CiAJCWJyZWFrOwogCWNhc2UgNToKIAljYXNlIDQ6Ci0JCWk5NjVfd3JpdGVfZmVuY2VfcmVnKHJlZyk7CisJCXJldCA9IGk5NjVfd3JpdGVfZmVuY2VfcmVnKG9iaiwgcGlwZWxpbmVkKTsKIAkJYnJlYWs7CiAJY2FzZSAzOgotCQlpOTE1X3dyaXRlX2ZlbmNlX3JlZyhyZWcpOworCQlyZXQgPSBpOTE1X3dyaXRlX2ZlbmNlX3JlZyhvYmosIHBpcGVsaW5lZCk7CiAJCWJyZWFrOwogCWNhc2UgMjoKLQkJaTgzMF93cml0ZV9mZW5jZV9yZWcocmVnKTsKKwkJcmV0ID0gaTgzMF93cml0ZV9mZW5jZV9yZWcob2JqLCBwaXBlbGluZWQpOwogCQlicmVhazsKIAl9CiAKLQl0cmFjZV9pOTE1X2dlbV9vYmplY3RfZ2V0X2ZlbmNlKG9iaiwgb2JqX3ByaXYtPmZlbmNlX3JlZywKLQkJCW9ial9wcml2LT50aWxpbmdfbW9kZSk7Ci0KLQlyZXR1cm4gMDsKKwlyZXR1cm4gcmV0OwogfQogCiAvKioKQEAgLTI1MjEsMTU0ICsyNjE5LDEyNyBAQAogICogQG9iajogb2JqZWN0IHRvIGNsZWFyCiAgKgogICogWmVyb2VzIG91dCB0aGUgZmVuY2UgcmVnaXN0ZXIgaXRzZWxmIGFuZCBjbGVhcnMgb3V0IHRoZSBhc3NvY2lhdGVkCi0gKiBkYXRhIHN0cnVjdHVyZXMgaW4gZGV2X3ByaXYgYW5kIG9ial9wcml2LgorICogZGF0YSBzdHJ1Y3R1cmVzIGluIGRldl9wcml2IGFuZCBvYmouCiAgKi8KIHN0YXRpYyB2b2lkCi1pOTE1X2dlbV9jbGVhcl9mZW5jZV9yZWcoc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmopCitpOTE1X2dlbV9jbGVhcl9mZW5jZV9yZWcoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKKwkJCSBzdHJ1Y3QgZHJtX2k5MTVfZmVuY2VfcmVnICpyZWcpCiB7Ci0Jc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IG9iai0+ZGV2OwogCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmpfcHJpdiA9IHRvX2ludGVsX2JvKG9iaik7Ci0Jc3RydWN0IGRybV9pOTE1X2ZlbmNlX3JlZyAqcmVnID0KLQkJJmRldl9wcml2LT5mZW5jZV9yZWdzW29ial9wcml2LT5mZW5jZV9yZWddOwotCXVpbnQzMl90IGZlbmNlX3JlZzsKKwl1aW50MzJfdCBmZW5jZV9yZWcgPSByZWcgLSBkZXZfcHJpdi0+ZmVuY2VfcmVnczsKIAogCXN3aXRjaCAoSU5URUxfSU5GTyhkZXYpLT5nZW4pIHsKIAljYXNlIDY6Ci0JCUk5MTVfV1JJVEU2NChGRU5DRV9SRUdfU0FORFlCUklER0VfMCArCi0JCQkgICAgIChvYmpfcHJpdi0+ZmVuY2VfcmVnICogOCksIDApOworCQlJOTE1X1dSSVRFNjQoRkVOQ0VfUkVHX1NBTkRZQlJJREdFXzAgKyBmZW5jZV9yZWcqOCwgMCk7CiAJCWJyZWFrOwogCWNhc2UgNToKIAljYXNlIDQ6Ci0JCUk5MTVfV1JJVEU2NChGRU5DRV9SRUdfOTY1XzAgKyAob2JqX3ByaXYtPmZlbmNlX3JlZyAqIDgpLCAwKTsKKwkJSTkxNV9XUklURTY0KEZFTkNFX1JFR185NjVfMCArIGZlbmNlX3JlZyo4LCAwKTsKIAkJYnJlYWs7CiAJY2FzZSAzOgotCQlpZiAob2JqX3ByaXYtPmZlbmNlX3JlZyA+PSA4KQotCQkJZmVuY2VfcmVnID0gRkVOQ0VfUkVHXzk0NV84ICsgKG9ial9wcml2LT5mZW5jZV9yZWcgLSA4KSAqIDQ7CisJCWlmIChmZW5jZV9yZWcgPj0gOCkKKwkJCWZlbmNlX3JlZyA9IEZFTkNFX1JFR185NDVfOCArIChmZW5jZV9yZWcgLSA4KSAqIDQ7CiAJCWVsc2UKIAljYXNlIDI6Ci0JCQlmZW5jZV9yZWcgPSBGRU5DRV9SRUdfODMwXzAgKyBvYmpfcHJpdi0+ZmVuY2VfcmVnICogNDsKKwkJCWZlbmNlX3JlZyA9IEZFTkNFX1JFR184MzBfMCArIGZlbmNlX3JlZyAqIDQ7CiAKIAkJSTkxNV9XUklURShmZW5jZV9yZWcsIDApOwogCQlicmVhazsKIAl9CiAKLQlyZWctPm9iaiA9IE5VTEw7Ci0Jb2JqX3ByaXYtPmZlbmNlX3JlZyA9IEk5MTVfRkVOQ0VfUkVHX05PTkU7CiAJbGlzdF9kZWxfaW5pdCgmcmVnLT5scnVfbGlzdCk7Ci19Ci0KLS8qKgotICogaTkxNV9nZW1fb2JqZWN0X3B1dF9mZW5jZV9yZWcgLSB3YWl0cyBvbiBvdXRzdGFuZGluZyBmZW5jZWQgYWNjZXNzCi0gKiB0byB0aGUgYnVmZmVyIHRvIGZpbmlzaCwgYW5kIHRoZW4gcmVzZXRzIHRoZSBmZW5jZSByZWdpc3Rlci4KLSAqIEBvYmo6IHRpbGVkIG9iamVjdCBob2xkaW5nIGEgZmVuY2UgcmVnaXN0ZXIuCi0gKiBAYm9vbDogd2hldGhlciB0aGUgd2FpdCB1cG9uIHRoZSBmZW5jZSBpcyBpbnRlcnJ1cHRpYmxlCi0gKgotICogWmVyb2VzIG91dCB0aGUgZmVuY2UgcmVnaXN0ZXIgaXRzZWxmIGFuZCBjbGVhcnMgb3V0IHRoZSBhc3NvY2lhdGVkCi0gKiBkYXRhIHN0cnVjdHVyZXMgaW4gZGV2X3ByaXYgYW5kIG9ial9wcml2LgotICovCi1pbnQKLWk5MTVfZ2VtX29iamVjdF9wdXRfZmVuY2VfcmVnKHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqLAotCQkJICAgICAgYm9vbCBpbnRlcnJ1cHRpYmxlKQotewotCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBvYmotPmRldjsKLQlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmpfcHJpdiA9IHRvX2ludGVsX2JvKG9iaik7Ci0Jc3RydWN0IGRybV9pOTE1X2ZlbmNlX3JlZyAqcmVnOwotCi0JaWYgKG9ial9wcml2LT5mZW5jZV9yZWcgPT0gSTkxNV9GRU5DRV9SRUdfTk9ORSkKLQkJcmV0dXJuIDA7Ci0KLQkvKiBJZiB3ZSd2ZSBjaGFuZ2VkIHRpbGluZywgR1RULW1hcHBpbmdzIG9mIHRoZSBvYmplY3QKLQkgKiBuZWVkIHRvIHJlLWZhdWx0IHRvIGVuc3VyZSB0aGF0IHRoZSBjb3JyZWN0IGZlbmNlIHJlZ2lzdGVyCi0JICogc2V0dXAgaXMgaW4gcGxhY2UuCi0JICovCi0JaTkxNV9nZW1fcmVsZWFzZV9tbWFwKG9iaik7Ci0KLQkvKiBPbiB0aGUgaTkxNSwgR1BVIGFjY2VzcyB0byB0aWxlZCBidWZmZXJzIGlzIHZpYSBhIGZlbmNlLAotCSAqIHRoZXJlZm9yZSB3ZSBtdXN0IHdhaXQgZm9yIGFueSBvdXRzdGFuZGluZyBhY2Nlc3MgdG8gY29tcGxldGUKLQkgKiBiZWZvcmUgY2xlYXJpbmcgdGhlIGZlbmNlLgotCSAqLwotCXJlZyA9ICZkZXZfcHJpdi0+ZmVuY2VfcmVnc1tvYmpfcHJpdi0+ZmVuY2VfcmVnXTsKLQlpZiAocmVnLT5ncHUpIHsKLQkJaW50IHJldDsKLQotCQlyZXQgPSBpOTE1X2dlbV9vYmplY3RfZmx1c2hfZ3B1X3dyaXRlX2RvbWFpbihvYmopOwotCQlpZiAocmV0KQotCQkJcmV0dXJuIHJldDsKLQotCQlyZXQgPSBpOTE1X2dlbV9vYmplY3Rfd2FpdF9yZW5kZXJpbmcob2JqLCBpbnRlcnJ1cHRpYmxlKTsKLQkJaWYgKHJldCkKLQkJCXJldHVybiByZXQ7Ci0KLQkJcmVnLT5ncHUgPSBmYWxzZTsKLQl9Ci0KLQlpOTE1X2dlbV9vYmplY3RfZmx1c2hfZ3R0X3dyaXRlX2RvbWFpbihvYmopOwotCWk5MTVfZ2VtX2NsZWFyX2ZlbmNlX3JlZyhvYmopOwotCi0JcmV0dXJuIDA7CisJcmVnLT5vYmogPSBOVUxMOworCXJlZy0+c2V0dXBfc2Vxbm8gPSAwOwogfQogCiAvKioKICAqIEZpbmRzIGZyZWUgc3BhY2UgaW4gdGhlIEdUVCBhcGVydHVyZSBhbmQgYmluZHMgdGhlIG9iamVjdCB0aGVyZS4KICAqLwogc3RhdGljIGludAotaTkxNV9nZW1fb2JqZWN0X2JpbmRfdG9fZ3R0KHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqLCB1bnNpZ25lZCBhbGlnbm1lbnQpCitpOTE1X2dlbV9vYmplY3RfYmluZF90b19ndHQoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaiwKKwkJCSAgICB1bnNpZ25lZCBhbGlnbm1lbnQsCisJCQkgICAgYm9vbCBtYXBfYW5kX2ZlbmNlYWJsZSkKIHsKLQlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gb2JqLT5kZXY7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IG9iai0+YmFzZS5kZXY7CiAJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Ci0Jc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9ial9wcml2ID0gdG9faW50ZWxfYm8ob2JqKTsKIAlzdHJ1Y3QgZHJtX21tX25vZGUgKmZyZWVfc3BhY2U7Ci0JZ2ZwX3QgZ2ZwbWFzayA9ICBfX0dGUF9OT1JFVFJZIHwgX19HRlBfTk9XQVJOOworCWdmcF90IGdmcG1hc2sgPSBfX0dGUF9OT1JFVFJZIHwgX19HRlBfTk9XQVJOOworCXUzMiBzaXplLCBmZW5jZV9zaXplLCBmZW5jZV9hbGlnbm1lbnQsIHVuZmVuY2VkX2FsaWdubWVudDsKKwlib29sIG1hcHBhYmxlLCBmZW5jZWFibGU7CiAJaW50IHJldDsKIAotCWlmIChvYmpfcHJpdi0+bWFkdiAhPSBJOTE1X01BRFZfV0lMTE5FRUQpIHsKKwlpZiAob2JqLT5tYWR2ICE9IEk5MTVfTUFEVl9XSUxMTkVFRCkgewogCQlEUk1fRVJST1IoIkF0dGVtcHRpbmcgdG8gYmluZCBhIHB1cmdlYWJsZSBvYmplY3RcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKKwlmZW5jZV9zaXplID0gaTkxNV9nZW1fZ2V0X2d0dF9zaXplKG9iaik7CisJZmVuY2VfYWxpZ25tZW50ID0gaTkxNV9nZW1fZ2V0X2d0dF9hbGlnbm1lbnQob2JqKTsKKwl1bmZlbmNlZF9hbGlnbm1lbnQgPSBpOTE1X2dlbV9nZXRfdW5mZW5jZWRfZ3R0X2FsaWdubWVudChvYmopOworCiAJaWYgKGFsaWdubWVudCA9PSAwKQotCQlhbGlnbm1lbnQgPSBpOTE1X2dlbV9nZXRfZ3R0X2FsaWdubWVudChvYmopOwotCWlmIChhbGlnbm1lbnQgJiAoaTkxNV9nZW1fZ2V0X2d0dF9hbGlnbm1lbnQob2JqKSAtIDEpKSB7CisJCWFsaWdubWVudCA9IG1hcF9hbmRfZmVuY2VhYmxlID8gZmVuY2VfYWxpZ25tZW50IDoKKwkJCQkJCXVuZmVuY2VkX2FsaWdubWVudDsKKwlpZiAobWFwX2FuZF9mZW5jZWFibGUgJiYgYWxpZ25tZW50ICYgKGZlbmNlX2FsaWdubWVudCAtIDEpKSB7CiAJCURSTV9FUlJPUigiSW52YWxpZCBvYmplY3QgYWxpZ25tZW50IHJlcXVlc3RlZCAldVxuIiwgYWxpZ25tZW50KTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCisJc2l6ZSA9IG1hcF9hbmRfZmVuY2VhYmxlID8gZmVuY2Vfc2l6ZSA6IG9iai0+YmFzZS5zaXplOworCiAJLyogSWYgdGhlIG9iamVjdCBpcyBiaWdnZXIgdGhhbiB0aGUgZW50aXJlIGFwZXJ0dXJlLCByZWplY3QgaXQgZWFybHkKIAkgKiBiZWZvcmUgZXZpY3RpbmcgZXZlcnl0aGluZyBpbiBhIHZhaW4gYXR0ZW1wdCB0byBmaW5kIHNwYWNlLgogCSAqLwotCWlmIChvYmotPnNpemUgPiBkZXZfcHJpdi0+bW0uZ3R0X3RvdGFsKSB7CisJaWYgKG9iai0+YmFzZS5zaXplID4KKwkgICAgKG1hcF9hbmRfZmVuY2VhYmxlID8gZGV2X3ByaXYtPm1tLmd0dF9tYXBwYWJsZV9lbmQgOiBkZXZfcHJpdi0+bW0uZ3R0X3RvdGFsKSkgewogCQlEUk1fRVJST1IoIkF0dGVtcHRpbmcgdG8gYmluZCBhbiBvYmplY3QgbGFyZ2VyIHRoYW4gdGhlIGFwZXJ0dXJlXG4iKTsKIAkJcmV0dXJuIC1FMkJJRzsKIAl9CiAKICBzZWFyY2hfZnJlZToKLQlmcmVlX3NwYWNlID0gZHJtX21tX3NlYXJjaF9mcmVlKCZkZXZfcHJpdi0+bW0uZ3R0X3NwYWNlLAotCQkJCQlvYmotPnNpemUsIGFsaWdubWVudCwgMCk7Ci0JaWYgKGZyZWVfc3BhY2UgIT0gTlVMTCkKLQkJb2JqX3ByaXYtPmd0dF9zcGFjZSA9IGRybV9tbV9nZXRfYmxvY2soZnJlZV9zcGFjZSwgb2JqLT5zaXplLAotCQkJCQkJICAgICAgIGFsaWdubWVudCk7Ci0JaWYgKG9ial9wcml2LT5ndHRfc3BhY2UgPT0gTlVMTCkgeworCWlmIChtYXBfYW5kX2ZlbmNlYWJsZSkKKwkJZnJlZV9zcGFjZSA9CisJCQlkcm1fbW1fc2VhcmNoX2ZyZWVfaW5fcmFuZ2UoJmRldl9wcml2LT5tbS5ndHRfc3BhY2UsCisJCQkJCQkgICAgc2l6ZSwgYWxpZ25tZW50LCAwLAorCQkJCQkJICAgIGRldl9wcml2LT5tbS5ndHRfbWFwcGFibGVfZW5kLAorCQkJCQkJICAgIDApOworCWVsc2UKKwkJZnJlZV9zcGFjZSA9IGRybV9tbV9zZWFyY2hfZnJlZSgmZGV2X3ByaXYtPm1tLmd0dF9zcGFjZSwKKwkJCQkJCXNpemUsIGFsaWdubWVudCwgMCk7CisKKwlpZiAoZnJlZV9zcGFjZSAhPSBOVUxMKSB7CisJCWlmIChtYXBfYW5kX2ZlbmNlYWJsZSkKKwkJCW9iai0+Z3R0X3NwYWNlID0KKwkJCQlkcm1fbW1fZ2V0X2Jsb2NrX3JhbmdlX2dlbmVyaWMoZnJlZV9zcGFjZSwKKwkJCQkJCQkgICAgICAgc2l6ZSwgYWxpZ25tZW50LCAwLAorCQkJCQkJCSAgICAgICBkZXZfcHJpdi0+bW0uZ3R0X21hcHBhYmxlX2VuZCwKKwkJCQkJCQkgICAgICAgMCk7CisJCWVsc2UKKwkJCW9iai0+Z3R0X3NwYWNlID0KKwkJCQlkcm1fbW1fZ2V0X2Jsb2NrKGZyZWVfc3BhY2UsIHNpemUsIGFsaWdubWVudCk7CisJfQorCWlmIChvYmotPmd0dF9zcGFjZSA9PSBOVUxMKSB7CiAJCS8qIElmIHRoZSBndHQgaXMgZW1wdHkgYW5kIHdlJ3JlIHN0aWxsIGhhdmluZyB0cm91YmxlCiAJCSAqIGZpdHRpbmcgb3VyIG9iamVjdCBpbiwgd2UncmUgb3V0IG9mIG1lbW9yeS4KIAkJICovCi0JCXJldCA9IGk5MTVfZ2VtX2V2aWN0X3NvbWV0aGluZyhkZXYsIG9iai0+c2l6ZSwgYWxpZ25tZW50KTsKKwkJcmV0ID0gaTkxNV9nZW1fZXZpY3Rfc29tZXRoaW5nKGRldiwgc2l6ZSwgYWxpZ25tZW50LAorCQkJCQkgICAgICAgbWFwX2FuZF9mZW5jZWFibGUpOwogCQlpZiAocmV0KQogCQkJcmV0dXJuIHJldDsKIAogCQlnb3RvIHNlYXJjaF9mcmVlOwogCX0KIAotCXJldCA9IGk5MTVfZ2VtX29iamVjdF9nZXRfcGFnZXMob2JqLCBnZnBtYXNrKTsKKwlyZXQgPSBpOTE1X2dlbV9vYmplY3RfZ2V0X3BhZ2VzX2d0dChvYmosIGdmcG1hc2spOwogCWlmIChyZXQpIHsKLQkJZHJtX21tX3B1dF9ibG9jayhvYmpfcHJpdi0+Z3R0X3NwYWNlKTsKLQkJb2JqX3ByaXYtPmd0dF9zcGFjZSA9IE5VTEw7CisJCWRybV9tbV9wdXRfYmxvY2sob2JqLT5ndHRfc3BhY2UpOworCQlvYmotPmd0dF9zcGFjZSA9IE5VTEw7CiAKIAkJaWYgKHJldCA9PSAtRU5PTUVNKSB7CiAJCQkvKiBmaXJzdCB0cnkgdG8gY2xlYXIgdXAgc29tZSBzcGFjZSBmcm9tIHRoZSBHVFQgKi8KLQkJCXJldCA9IGk5MTVfZ2VtX2V2aWN0X3NvbWV0aGluZyhkZXYsIG9iai0+c2l6ZSwKLQkJCQkJCSAgICAgICBhbGlnbm1lbnQpOworCQkJcmV0ID0gaTkxNV9nZW1fZXZpY3Rfc29tZXRoaW5nKGRldiwgc2l6ZSwKKwkJCQkJCSAgICAgICBhbGlnbm1lbnQsCisJCQkJCQkgICAgICAgbWFwX2FuZF9mZW5jZWFibGUpOwogCQkJaWYgKHJldCkgewogCQkJCS8qIG5vdyB0cnkgdG8gc2hyaW5rIGV2ZXJ5b25lIGVsc2UgKi8KIAkJCQlpZiAoZ2ZwbWFzaykgewpAQCAtMjY4NSwxMjIgKzI3NTYsMTEzIEBACiAJCXJldHVybiByZXQ7CiAJfQogCi0JLyogQ3JlYXRlIGFuIEFHUCBtZW1vcnkgc3RydWN0dXJlIHBvaW50aW5nIGF0IG91ciBwYWdlcywgYW5kIGJpbmQgaXQKLQkgKiBpbnRvIHRoZSBHVFQuCi0JICovCi0Jb2JqX3ByaXYtPmFncF9tZW0gPSBkcm1fYWdwX2JpbmRfcGFnZXMoZGV2LAotCQkJCQkgICAgICAgb2JqX3ByaXYtPnBhZ2VzLAotCQkJCQkgICAgICAgb2JqLT5zaXplID4+IFBBR0VfU0hJRlQsCi0JCQkJCSAgICAgICBvYmpfcHJpdi0+Z3R0X3NwYWNlLT5zdGFydCwKLQkJCQkJICAgICAgIG9ial9wcml2LT5hZ3BfdHlwZSk7Ci0JaWYgKG9ial9wcml2LT5hZ3BfbWVtID09IE5VTEwpIHsKLQkJaTkxNV9nZW1fb2JqZWN0X3B1dF9wYWdlcyhvYmopOwotCQlkcm1fbW1fcHV0X2Jsb2NrKG9ial9wcml2LT5ndHRfc3BhY2UpOwotCQlvYmpfcHJpdi0+Z3R0X3NwYWNlID0gTlVMTDsKKwlyZXQgPSBpOTE1X2dlbV9ndHRfYmluZF9vYmplY3Qob2JqKTsKKwlpZiAocmV0KSB7CisJCWk5MTVfZ2VtX29iamVjdF9wdXRfcGFnZXNfZ3R0KG9iaik7CisJCWRybV9tbV9wdXRfYmxvY2sob2JqLT5ndHRfc3BhY2UpOworCQlvYmotPmd0dF9zcGFjZSA9IE5VTEw7CiAKLQkJcmV0ID0gaTkxNV9nZW1fZXZpY3Rfc29tZXRoaW5nKGRldiwgb2JqLT5zaXplLCBhbGlnbm1lbnQpOworCQlyZXQgPSBpOTE1X2dlbV9ldmljdF9zb21ldGhpbmcoZGV2LCBzaXplLAorCQkJCQkgICAgICAgYWxpZ25tZW50LCBtYXBfYW5kX2ZlbmNlYWJsZSk7CiAJCWlmIChyZXQpCiAJCQlyZXR1cm4gcmV0OwogCiAJCWdvdG8gc2VhcmNoX2ZyZWU7CiAJfQogCi0JLyoga2VlcCB0cmFjayBvZiBib3VuZHMgb2JqZWN0IGJ5IGFkZGluZyBpdCB0byB0aGUgaW5hY3RpdmUgbGlzdCAqLwotCWxpc3RfYWRkX3RhaWwoJm9ial9wcml2LT5tbV9saXN0LCAmZGV2X3ByaXYtPm1tLmluYWN0aXZlX2xpc3QpOwotCWk5MTVfZ2VtX2luZm9fYWRkX2d0dChkZXZfcHJpdiwgb2JqLT5zaXplKTsKKwlsaXN0X2FkZF90YWlsKCZvYmotPmd0dF9saXN0LCAmZGV2X3ByaXYtPm1tLmd0dF9saXN0KTsKKwlsaXN0X2FkZF90YWlsKCZvYmotPm1tX2xpc3QsICZkZXZfcHJpdi0+bW0uaW5hY3RpdmVfbGlzdCk7CiAKIAkvKiBBc3NlcnQgdGhhdCB0aGUgb2JqZWN0IGlzIG5vdCBjdXJyZW50bHkgaW4gYW55IEdQVSBkb21haW4uIEFzIGl0CiAJICogd2Fzbid0IGluIHRoZSBHVFQsIHRoZXJlIHNob3VsZG4ndCBiZSBhbnkgd2F5IGl0IGNvdWxkIGhhdmUgYmVlbiBpbgogCSAqIGEgR1BVIGNhY2hlCiAJICovCi0JQlVHX09OKG9iai0+cmVhZF9kb21haW5zICYgSTkxNV9HRU1fR1BVX0RPTUFJTlMpOwotCUJVR19PTihvYmotPndyaXRlX2RvbWFpbiAmIEk5MTVfR0VNX0dQVV9ET01BSU5TKTsKKwlCVUdfT04ob2JqLT5iYXNlLnJlYWRfZG9tYWlucyAmIEk5MTVfR0VNX0dQVV9ET01BSU5TKTsKKwlCVUdfT04ob2JqLT5iYXNlLndyaXRlX2RvbWFpbiAmIEk5MTVfR0VNX0dQVV9ET01BSU5TKTsKIAotCW9ial9wcml2LT5ndHRfb2Zmc2V0ID0gb2JqX3ByaXYtPmd0dF9zcGFjZS0+c3RhcnQ7Ci0JdHJhY2VfaTkxNV9nZW1fb2JqZWN0X2JpbmQob2JqLCBvYmpfcHJpdi0+Z3R0X29mZnNldCk7CisJb2JqLT5ndHRfb2Zmc2V0ID0gb2JqLT5ndHRfc3BhY2UtPnN0YXJ0OwogCisJZmVuY2VhYmxlID0KKwkJb2JqLT5ndHRfc3BhY2UtPnNpemUgPT0gZmVuY2Vfc2l6ZSAmJgorCQkob2JqLT5ndHRfc3BhY2UtPnN0YXJ0ICYgKGZlbmNlX2FsaWdubWVudCAtMSkpID09IDA7CisKKwltYXBwYWJsZSA9CisJCW9iai0+Z3R0X29mZnNldCArIG9iai0+YmFzZS5zaXplIDw9IGRldl9wcml2LT5tbS5ndHRfbWFwcGFibGVfZW5kOworCisJb2JqLT5tYXBfYW5kX2ZlbmNlYWJsZSA9IG1hcHBhYmxlICYmIGZlbmNlYWJsZTsKKworCXRyYWNlX2k5MTVfZ2VtX29iamVjdF9iaW5kKG9iaiwgb2JqLT5ndHRfb2Zmc2V0LCBtYXBfYW5kX2ZlbmNlYWJsZSk7CiAJcmV0dXJuIDA7CiB9CiAKIHZvaWQKLWk5MTVfZ2VtX2NsZmx1c2hfb2JqZWN0KHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqKQoraTkxNV9nZW1fY2xmbHVzaF9vYmplY3Qoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaikKIHsKLQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdAkqb2JqX3ByaXYgPSB0b19pbnRlbF9ibyhvYmopOwotCiAJLyogSWYgd2UgZG9uJ3QgaGF2ZSBhIHBhZ2UgbGlzdCBzZXQgdXAsIHRoZW4gd2UncmUgbm90IHBpbm5lZAogCSAqIHRvIEdQVSwgYW5kIHdlIGNhbiBpZ25vcmUgdGhlIGNhY2hlIGZsdXNoIGJlY2F1c2UgaXQnbGwgaGFwcGVuCiAJICogYWdhaW4gYXQgYmluZCB0aW1lLgogCSAqLwotCWlmIChvYmpfcHJpdi0+cGFnZXMgPT0gTlVMTCkKKwlpZiAob2JqLT5wYWdlcyA9PSBOVUxMKQogCQlyZXR1cm47CiAKIAl0cmFjZV9pOTE1X2dlbV9vYmplY3RfY2xmbHVzaChvYmopOwogCi0JZHJtX2NsZmx1c2hfcGFnZXMob2JqX3ByaXYtPnBhZ2VzLCBvYmotPnNpemUgLyBQQUdFX1NJWkUpOworCWRybV9jbGZsdXNoX3BhZ2VzKG9iai0+cGFnZXMsIG9iai0+YmFzZS5zaXplIC8gUEFHRV9TSVpFKTsKIH0KIAogLyoqIEZsdXNoZXMgYW55IEdQVSB3cml0ZSBkb21haW4gZm9yIHRoZSBvYmplY3QgaWYgaXQncyBkaXJ0eS4gKi8KLXN0YXRpYyBpbnQKLWk5MTVfZ2VtX29iamVjdF9mbHVzaF9ncHVfd3JpdGVfZG9tYWluKHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqKQorc3RhdGljIHZvaWQKK2k5MTVfZ2VtX29iamVjdF9mbHVzaF9ncHVfd3JpdGVfZG9tYWluKHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmopCiB7Ci0Jc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IG9iai0+ZGV2OwotCXVpbnQzMl90IG9sZF93cml0ZV9kb21haW47CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IG9iai0+YmFzZS5kZXY7CiAKLQlpZiAoKG9iai0+d3JpdGVfZG9tYWluICYgSTkxNV9HRU1fR1BVX0RPTUFJTlMpID09IDApCi0JCXJldHVybiAwOworCWlmICgob2JqLT5iYXNlLndyaXRlX2RvbWFpbiAmIEk5MTVfR0VNX0dQVV9ET01BSU5TKSA9PSAwKQorCQlyZXR1cm47CiAKIAkvKiBRdWV1ZSB0aGUgR1BVIHdyaXRlIGNhY2hlIGZsdXNoaW5nIHdlIG5lZWQuICovCi0Jb2xkX3dyaXRlX2RvbWFpbiA9IG9iai0+d3JpdGVfZG9tYWluOwotCWk5MTVfZ2VtX2ZsdXNoX3JpbmcoZGV2LCBOVUxMLAotCQkJICAgIHRvX2ludGVsX2JvKG9iaiktPnJpbmcsCi0JCQkgICAgMCwgb2JqLT53cml0ZV9kb21haW4pOwotCUJVR19PTihvYmotPndyaXRlX2RvbWFpbik7Ci0KLQl0cmFjZV9pOTE1X2dlbV9vYmplY3RfY2hhbmdlX2RvbWFpbihvYmosCi0JCQkJCSAgICBvYmotPnJlYWRfZG9tYWlucywKLQkJCQkJICAgIG9sZF93cml0ZV9kb21haW4pOwotCi0JcmV0dXJuIDA7CisJaTkxNV9nZW1fZmx1c2hfcmluZyhkZXYsIG9iai0+cmluZywgMCwgb2JqLT5iYXNlLndyaXRlX2RvbWFpbik7CisJQlVHX09OKG9iai0+YmFzZS53cml0ZV9kb21haW4pOwogfQogCiAvKiogRmx1c2hlcyB0aGUgR1RUIHdyaXRlIGRvbWFpbiBmb3IgdGhlIG9iamVjdCBpZiBpdCdzIGRpcnR5LiAqLwogc3RhdGljIHZvaWQKLWk5MTVfZ2VtX29iamVjdF9mbHVzaF9ndHRfd3JpdGVfZG9tYWluKHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqKQoraTkxNV9nZW1fb2JqZWN0X2ZsdXNoX2d0dF93cml0ZV9kb21haW4oc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaikKIHsKIAl1aW50MzJfdCBvbGRfd3JpdGVfZG9tYWluOwogCi0JaWYgKG9iai0+d3JpdGVfZG9tYWluICE9IEk5MTVfR0VNX0RPTUFJTl9HVFQpCisJaWYgKG9iai0+YmFzZS53cml0ZV9kb21haW4gIT0gSTkxNV9HRU1fRE9NQUlOX0dUVCkKIAkJcmV0dXJuOwogCiAJLyogTm8gYWN0dWFsIGZsdXNoaW5nIGlzIHJlcXVpcmVkIGZvciB0aGUgR1RUIHdyaXRlIGRvbWFpbi4gICBXcml0ZXMKIAkgKiB0byBpdCBpbW1lZGlhdGVseSBnbyB0byBtYWluIG1lbW9yeSBhcyBmYXIgYXMgd2Uga25vdywgc28gdGhlcmUncwogCSAqIG5vIGNoaXBzZXQgZmx1c2guICBJdCBhbHNvIGRvZXNuJ3QgbGFuZCBpbiByZW5kZXIgY2FjaGUuCiAJICovCi0Jb2xkX3dyaXRlX2RvbWFpbiA9IG9iai0+d3JpdGVfZG9tYWluOwotCW9iai0+d3JpdGVfZG9tYWluID0gMDsKKwlpOTE1X2dlbV9yZWxlYXNlX21tYXAob2JqKTsKKworCW9sZF93cml0ZV9kb21haW4gPSBvYmotPmJhc2Uud3JpdGVfZG9tYWluOworCW9iai0+YmFzZS53cml0ZV9kb21haW4gPSAwOwogCiAJdHJhY2VfaTkxNV9nZW1fb2JqZWN0X2NoYW5nZV9kb21haW4ob2JqLAotCQkJCQkgICAgb2JqLT5yZWFkX2RvbWFpbnMsCisJCQkJCSAgICBvYmotPmJhc2UucmVhZF9kb21haW5zLAogCQkJCQkgICAgb2xkX3dyaXRlX2RvbWFpbik7CiB9CiAKIC8qKiBGbHVzaGVzIHRoZSBDUFUgd3JpdGUgZG9tYWluIGZvciB0aGUgb2JqZWN0IGlmIGl0J3MgZGlydHkuICovCiBzdGF0aWMgdm9pZAotaTkxNV9nZW1fb2JqZWN0X2ZsdXNoX2NwdV93cml0ZV9kb21haW4oc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmopCitpOTE1X2dlbV9vYmplY3RfZmx1c2hfY3B1X3dyaXRlX2RvbWFpbihzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqKQogewotCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBvYmotPmRldjsKIAl1aW50MzJfdCBvbGRfd3JpdGVfZG9tYWluOwogCi0JaWYgKG9iai0+d3JpdGVfZG9tYWluICE9IEk5MTVfR0VNX0RPTUFJTl9DUFUpCisJaWYgKG9iai0+YmFzZS53cml0ZV9kb21haW4gIT0gSTkxNV9HRU1fRE9NQUlOX0NQVSkKIAkJcmV0dXJuOwogCiAJaTkxNV9nZW1fY2xmbHVzaF9vYmplY3Qob2JqKTsKLQlkcm1fYWdwX2NoaXBzZXRfZmx1c2goZGV2KTsKLQlvbGRfd3JpdGVfZG9tYWluID0gb2JqLT53cml0ZV9kb21haW47Ci0Jb2JqLT53cml0ZV9kb21haW4gPSAwOworCWludGVsX2d0dF9jaGlwc2V0X2ZsdXNoKCk7CisJb2xkX3dyaXRlX2RvbWFpbiA9IG9iai0+YmFzZS53cml0ZV9kb21haW47CisJb2JqLT5iYXNlLndyaXRlX2RvbWFpbiA9IDA7CiAKIAl0cmFjZV9pOTE1X2dlbV9vYmplY3RfY2hhbmdlX2RvbWFpbihvYmosCi0JCQkJCSAgICBvYmotPnJlYWRfZG9tYWlucywKKwkJCQkJICAgIG9iai0+YmFzZS5yZWFkX2RvbWFpbnMsCiAJCQkJCSAgICBvbGRfd3JpdGVfZG9tYWluKTsKIH0KIApAQCAtMjgxMSwzNyArMjg3MywzNiBAQAogICogZmx1c2hlcyB0byBvY2N1ci4KICAqLwogaW50Ci1pOTE1X2dlbV9vYmplY3Rfc2V0X3RvX2d0dF9kb21haW4oc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmosIGludCB3cml0ZSkKK2k5MTVfZ2VtX29iamVjdF9zZXRfdG9fZ3R0X2RvbWFpbihzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqLCBib29sIHdyaXRlKQogewotCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmpfcHJpdiA9IHRvX2ludGVsX2JvKG9iaik7CiAJdWludDMyX3Qgb2xkX3dyaXRlX2RvbWFpbiwgb2xkX3JlYWRfZG9tYWluczsKIAlpbnQgcmV0OwogCiAJLyogTm90IHZhbGlkIHRvIGJlIGNhbGxlZCBvbiB1bmJvdW5kIG9iamVjdHMuICovCi0JaWYgKG9ial9wcml2LT5ndHRfc3BhY2UgPT0gTlVMTCkKKwlpZiAob2JqLT5ndHRfc3BhY2UgPT0gTlVMTCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlyZXQgPSBpOTE1X2dlbV9vYmplY3RfZmx1c2hfZ3B1X3dyaXRlX2RvbWFpbihvYmopOwotCWlmIChyZXQgIT0gMCkKLQkJcmV0dXJuIHJldDsKLQlyZXQgPSBpOTE1X2dlbV9vYmplY3Rfd2FpdF9yZW5kZXJpbmcob2JqLCB0cnVlKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OworCWk5MTVfZ2VtX29iamVjdF9mbHVzaF9ncHVfd3JpdGVfZG9tYWluKG9iaik7CisJaWYgKG9iai0+cGVuZGluZ19ncHVfd3JpdGUgfHwgd3JpdGUpIHsKKwkJcmV0ID0gaTkxNV9nZW1fb2JqZWN0X3dhaXRfcmVuZGVyaW5nKG9iaiwgdHJ1ZSk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCX0KIAogCWk5MTVfZ2VtX29iamVjdF9mbHVzaF9jcHVfd3JpdGVfZG9tYWluKG9iaik7CiAKLQlvbGRfd3JpdGVfZG9tYWluID0gb2JqLT53cml0ZV9kb21haW47Ci0Jb2xkX3JlYWRfZG9tYWlucyA9IG9iai0+cmVhZF9kb21haW5zOworCW9sZF93cml0ZV9kb21haW4gPSBvYmotPmJhc2Uud3JpdGVfZG9tYWluOworCW9sZF9yZWFkX2RvbWFpbnMgPSBvYmotPmJhc2UucmVhZF9kb21haW5zOwogCiAJLyogSXQgc2hvdWxkIG5vdyBiZSBvdXQgb2YgYW55IG90aGVyIHdyaXRlIGRvbWFpbnMsIGFuZCB3ZSBjYW4gdXBkYXRlCiAJICogdGhlIGRvbWFpbiB2YWx1ZXMgZm9yIG91ciBjaGFuZ2VzLgogCSAqLwotCUJVR19PTigob2JqLT53cml0ZV9kb21haW4gJiB+STkxNV9HRU1fRE9NQUlOX0dUVCkgIT0gMCk7Ci0Jb2JqLT5yZWFkX2RvbWFpbnMgfD0gSTkxNV9HRU1fRE9NQUlOX0dUVDsKKwlCVUdfT04oKG9iai0+YmFzZS53cml0ZV9kb21haW4gJiB+STkxNV9HRU1fRE9NQUlOX0dUVCkgIT0gMCk7CisJb2JqLT5iYXNlLnJlYWRfZG9tYWlucyB8PSBJOTE1X0dFTV9ET01BSU5fR1RUOwogCWlmICh3cml0ZSkgewotCQlvYmotPnJlYWRfZG9tYWlucyA9IEk5MTVfR0VNX0RPTUFJTl9HVFQ7Ci0JCW9iai0+d3JpdGVfZG9tYWluID0gSTkxNV9HRU1fRE9NQUlOX0dUVDsKLQkJb2JqX3ByaXYtPmRpcnR5ID0gMTsKKwkJb2JqLT5iYXNlLnJlYWRfZG9tYWlucyA9IEk5MTVfR0VNX0RPTUFJTl9HVFQ7CisJCW9iai0+YmFzZS53cml0ZV9kb21haW4gPSBJOTE1X0dFTV9ET01BSU5fR1RUOworCQlvYmotPmRpcnR5ID0gMTsKIAl9CiAKIAl0cmFjZV9pOTE1X2dlbV9vYmplY3RfY2hhbmdlX2RvbWFpbihvYmosCkBAIC0yODU2LDIzICsyOTE3LDIwIEBACiAgKiB3YWl0LCBhcyBpbiBtb2Rlc2V0dGluZyBwcm9jZXNzIHdlJ3JlIG5vdCBzdXBwb3NlZCB0byBiZSBpbnRlcnJ1cHRlZC4KICAqLwogaW50Ci1pOTE1X2dlbV9vYmplY3Rfc2V0X3RvX2Rpc3BsYXlfcGxhbmUoc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmosCi0JCQkJICAgICBib29sIHBpcGVsaW5lZCkKK2k5MTVfZ2VtX29iamVjdF9zZXRfdG9fZGlzcGxheV9wbGFuZShzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqLAorCQkJCSAgICAgc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpwaXBlbGluZWQpCiB7Ci0Jc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9ial9wcml2ID0gdG9faW50ZWxfYm8ob2JqKTsKIAl1aW50MzJfdCBvbGRfcmVhZF9kb21haW5zOwogCWludCByZXQ7CiAKIAkvKiBOb3QgdmFsaWQgdG8gYmUgY2FsbGVkIG9uIHVuYm91bmQgb2JqZWN0cy4gKi8KLQlpZiAob2JqX3ByaXYtPmd0dF9zcGFjZSA9PSBOVUxMKQorCWlmIChvYmotPmd0dF9zcGFjZSA9PSBOVUxMKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCXJldCA9IGk5MTVfZ2VtX29iamVjdF9mbHVzaF9ncHVfd3JpdGVfZG9tYWluKG9iaik7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKKwlpOTE1X2dlbV9vYmplY3RfZmx1c2hfZ3B1X3dyaXRlX2RvbWFpbihvYmopOwogCiAJLyogQ3VycmVudGx5LCB3ZSBhcmUgYWx3YXlzIGNhbGxlZCBmcm9tIGFuIG5vbi1pbnRlcnJ1cHRpYmxlIGNvbnRleHQuICovCi0JaWYgKCFwaXBlbGluZWQpIHsKKwlpZiAocGlwZWxpbmVkICE9IG9iai0+cmluZykgewogCQlyZXQgPSBpOTE1X2dlbV9vYmplY3Rfd2FpdF9yZW5kZXJpbmcob2JqLCBmYWxzZSk7CiAJCWlmIChyZXQpCiAJCQlyZXR1cm4gcmV0OwpAQCAtMjg4MCwxMiArMjkzOCwxMiBAQAogCiAJaTkxNV9nZW1fb2JqZWN0X2ZsdXNoX2NwdV93cml0ZV9kb21haW4ob2JqKTsKIAotCW9sZF9yZWFkX2RvbWFpbnMgPSBvYmotPnJlYWRfZG9tYWluczsKLQlvYmotPnJlYWRfZG9tYWlucyB8PSBJOTE1X0dFTV9ET01BSU5fR1RUOworCW9sZF9yZWFkX2RvbWFpbnMgPSBvYmotPmJhc2UucmVhZF9kb21haW5zOworCW9iai0+YmFzZS5yZWFkX2RvbWFpbnMgfD0gSTkxNV9HRU1fRE9NQUlOX0dUVDsKIAogCXRyYWNlX2k5MTVfZ2VtX29iamVjdF9jaGFuZ2VfZG9tYWluKG9iaiwKIAkJCQkJICAgIG9sZF9yZWFkX2RvbWFpbnMsCi0JCQkJCSAgICBvYmotPndyaXRlX2RvbWFpbik7CisJCQkJCSAgICBvYmotPmJhc2Uud3JpdGVfZG9tYWluKTsKIAogCXJldHVybiAwOwogfQpAQCAtMjg5OCwxMCArMjk1NiwxMCBAQAogCQlyZXR1cm4gMDsKIAogCWlmIChvYmotPmJhc2Uud3JpdGVfZG9tYWluICYgSTkxNV9HRU1fR1BVX0RPTUFJTlMpCi0JCWk5MTVfZ2VtX2ZsdXNoX3Jpbmcob2JqLT5iYXNlLmRldiwgTlVMTCwgb2JqLT5yaW5nLAorCQlpOTE1X2dlbV9mbHVzaF9yaW5nKG9iai0+YmFzZS5kZXYsIG9iai0+cmluZywKIAkJCQkgICAgMCwgb2JqLT5iYXNlLndyaXRlX2RvbWFpbik7CiAKLQlyZXR1cm4gaTkxNV9nZW1fb2JqZWN0X3dhaXRfcmVuZGVyaW5nKCZvYmotPmJhc2UsIGludGVycnVwdGlibGUpOworCXJldHVybiBpOTE1X2dlbV9vYmplY3Rfd2FpdF9yZW5kZXJpbmcob2JqLCBpbnRlcnJ1cHRpYmxlKTsKIH0KIAogLyoqCkBAIC0yOTExLDE0ICsyOTY5LDEyIEBACiAgKiBmbHVzaGVzIHRvIG9jY3VyLgogICovCiBzdGF0aWMgaW50Ci1pOTE1X2dlbV9vYmplY3Rfc2V0X3RvX2NwdV9kb21haW4oc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmosIGludCB3cml0ZSkKK2k5MTVfZ2VtX29iamVjdF9zZXRfdG9fY3B1X2RvbWFpbihzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqLCBib29sIHdyaXRlKQogewogCXVpbnQzMl90IG9sZF93cml0ZV9kb21haW4sIG9sZF9yZWFkX2RvbWFpbnM7CiAJaW50IHJldDsKIAotCXJldCA9IGk5MTVfZ2VtX29iamVjdF9mbHVzaF9ncHVfd3JpdGVfZG9tYWluKG9iaik7Ci0JaWYgKHJldCAhPSAwKQotCQlyZXR1cm4gcmV0OworCWk5MTVfZ2VtX29iamVjdF9mbHVzaF9ncHVfd3JpdGVfZG9tYWluKG9iaik7CiAJcmV0ID0gaTkxNV9nZW1fb2JqZWN0X3dhaXRfcmVuZGVyaW5nKG9iaiwgdHJ1ZSk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKQEAgLTI5MzAsMjcgKzI5ODYsMjcgQEAKIAkgKi8KIAlpOTE1X2dlbV9vYmplY3Rfc2V0X3RvX2Z1bGxfY3B1X3JlYWRfZG9tYWluKG9iaik7CiAKLQlvbGRfd3JpdGVfZG9tYWluID0gb2JqLT53cml0ZV9kb21haW47Ci0Jb2xkX3JlYWRfZG9tYWlucyA9IG9iai0+cmVhZF9kb21haW5zOworCW9sZF93cml0ZV9kb21haW4gPSBvYmotPmJhc2Uud3JpdGVfZG9tYWluOworCW9sZF9yZWFkX2RvbWFpbnMgPSBvYmotPmJhc2UucmVhZF9kb21haW5zOwogCiAJLyogRmx1c2ggdGhlIENQVSBjYWNoZSBpZiBpdCdzIHN0aWxsIGludmFsaWQuICovCi0JaWYgKChvYmotPnJlYWRfZG9tYWlucyAmIEk5MTVfR0VNX0RPTUFJTl9DUFUpID09IDApIHsKKwlpZiAoKG9iai0+YmFzZS5yZWFkX2RvbWFpbnMgJiBJOTE1X0dFTV9ET01BSU5fQ1BVKSA9PSAwKSB7CiAJCWk5MTVfZ2VtX2NsZmx1c2hfb2JqZWN0KG9iaik7CiAKLQkJb2JqLT5yZWFkX2RvbWFpbnMgfD0gSTkxNV9HRU1fRE9NQUlOX0NQVTsKKwkJb2JqLT5iYXNlLnJlYWRfZG9tYWlucyB8PSBJOTE1X0dFTV9ET01BSU5fQ1BVOwogCX0KIAogCS8qIEl0IHNob3VsZCBub3cgYmUgb3V0IG9mIGFueSBvdGhlciB3cml0ZSBkb21haW5zLCBhbmQgd2UgY2FuIHVwZGF0ZQogCSAqIHRoZSBkb21haW4gdmFsdWVzIGZvciBvdXIgY2hhbmdlcy4KIAkgKi8KLQlCVUdfT04oKG9iai0+d3JpdGVfZG9tYWluICYgfkk5MTVfR0VNX0RPTUFJTl9DUFUpICE9IDApOworCUJVR19PTigob2JqLT5iYXNlLndyaXRlX2RvbWFpbiAmIH5JOTE1X0dFTV9ET01BSU5fQ1BVKSAhPSAwKTsKIAogCS8qIElmIHdlJ3JlIHdyaXRpbmcgdGhyb3VnaCB0aGUgQ1BVLCB0aGVuIHRoZSBHUFUgcmVhZCBkb21haW5zIHdpbGwKIAkgKiBuZWVkIHRvIGJlIGludmFsaWRhdGVkIGF0IG5leHQgdXNlLgogCSAqLwogCWlmICh3cml0ZSkgewotCQlvYmotPnJlYWRfZG9tYWlucyA9IEk5MTVfR0VNX0RPTUFJTl9DUFU7Ci0JCW9iai0+d3JpdGVfZG9tYWluID0gSTkxNV9HRU1fRE9NQUlOX0NQVTsKKwkJb2JqLT5iYXNlLnJlYWRfZG9tYWlucyA9IEk5MTVfR0VNX0RPTUFJTl9DUFU7CisJCW9iai0+YmFzZS53cml0ZV9kb21haW4gPSBJOTE1X0dFTV9ET01BSU5fQ1BVOwogCX0KIAogCXRyYWNlX2k5MTVfZ2VtX29iamVjdF9jaGFuZ2VfZG9tYWluKG9iaiwKQEAgLTI5NjAsMTg0ICszMDE2LDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotLyoKLSAqIFNldCB0aGUgbmV4dCBkb21haW4gZm9yIHRoZSBzcGVjaWZpZWQgb2JqZWN0LiBUaGlzCi0gKiBtYXkgbm90IGFjdHVhbGx5IHBlcmZvcm0gdGhlIG5lY2Vzc2FyeSBmbHVzaGluZy9pbnZhbGlkaW5nIHRob3VnaCwKLSAqIGFzIHRoYXQgbWF5IHdhbnQgdG8gYmUgYmF0Y2hlZCB3aXRoIG90aGVyIHNldF9kb21haW4gb3BlcmF0aW9ucwotICoKLSAqIFRoaXMgaXMgKHdlIGhvcGUpIHRoZSBvbmx5IHJlYWxseSB0cmlja3kgcGFydCBvZiBnZW0uIFRoZSBnb2FsCi0gKiBpcyBmYWlybHkgc2ltcGxlIC0tIHRyYWNrIHdoaWNoIGNhY2hlcyBob2xkIGJpdHMgb2YgdGhlIG9iamVjdAotICogYW5kIG1ha2Ugc3VyZSB0aGV5IHJlbWFpbiBjb2hlcmVudC4gQSBmZXcgY29uY3JldGUgZXhhbXBsZXMgbWF5Ci0gKiBoZWxwIHRvIGV4cGxhaW4gaG93IGl0IHdvcmtzLiBGb3Igc2hvcnRoYW5kLCB3ZSB1c2UgdGhlIG5vdGF0aW9uCi0gKiAocmVhZF9kb21haW5zLCB3cml0ZV9kb21haW4pLCBlLmcuIChDUFUsIENQVSkgdG8gaW5kaWNhdGUgdGhlCi0gKiBhIHBhaXIgb2YgcmVhZCBhbmQgd3JpdGUgZG9tYWluIG1hc2tzLgotICoKLSAqIENhc2UgMTogdGhlIGJhdGNoIGJ1ZmZlcgotICoKLSAqCTEuIEFsbG9jYXRlZAotICoJMi4gV3JpdHRlbiBieSBDUFUKLSAqCTMuIE1hcHBlZCB0byBHVFQKLSAqCTQuIFJlYWQgYnkgR1BVCi0gKgk1LiBVbm1hcHBlZCBmcm9tIEdUVAotICoJNi4gRnJlZWQKLSAqCi0gKglMZXQncyB0YWtlIHRoZXNlIGEgc3RlcCBhdCBhIHRpbWUKLSAqCi0gKgkxLiBBbGxvY2F0ZWQKLSAqCQlQYWdlcyBhbGxvY2F0ZWQgZnJvbSB0aGUga2VybmVsIG1heSBzdGlsbCBoYXZlCi0gKgkJY2FjaGUgY29udGVudHMsIHNvIHdlIHNldCB0aGVtIHRvIChDUFUsIENQVSkgYWx3YXlzLgotICoJMi4gV3JpdHRlbiBieSBDUFUgKHVzaW5nIHB3cml0ZSkKLSAqCQlUaGUgcHdyaXRlIGZ1bmN0aW9uIGNhbGxzIHNldF9kb21haW4gKENQVSwgQ1BVKSBhbmQKLSAqCQl0aGlzIGZ1bmN0aW9uIGRvZXMgbm90aGluZyAoYXMgbm90aGluZyBjaGFuZ2VzKQotICoJMy4gTWFwcGVkIGJ5IEdUVAotICoJCVRoaXMgZnVuY3Rpb24gYXNzZXJ0cyB0aGF0IHRoZSBvYmplY3QgaXMgbm90Ci0gKgkJY3VycmVudGx5IGluIGFueSBHUFUtYmFzZWQgcmVhZCBvciB3cml0ZSBkb21haW5zCi0gKgk0LiBSZWFkIGJ5IEdQVQotICoJCWk5MTVfZ2VtX2V4ZWNidWZmZXIgY2FsbHMgc2V0X2RvbWFpbiAoQ09NTUFORCwgMCkuCi0gKgkJQXMgd3JpdGVfZG9tYWluIGlzIHplcm8sIHRoaXMgZnVuY3Rpb24gYWRkcyBpbiB0aGUKLSAqCQljdXJyZW50IHJlYWQgZG9tYWlucyAoQ1BVK0NPTU1BTkQsIDApLgotICoJCWZsdXNoX2RvbWFpbnMgaXMgc2V0IHRvIENQVS4KLSAqCQlpbnZhbGlkYXRlX2RvbWFpbnMgaXMgc2V0IHRvIENPTU1BTkQKLSAqCQljbGZsdXNoIGlzIHJ1biB0byBnZXQgZGF0YSBvdXQgb2YgdGhlIENQVSBjYWNoZXMKLSAqCQl0aGVuIGk5MTVfZGV2X3NldF9kb21haW4gY2FsbHMgaTkxNV9nZW1fZmx1c2ggdG8KLSAqCQllbWl0IGFuIE1JX0ZMVVNIIGFuZCBkcm1fYWdwX2NoaXBzZXRfZmx1c2gKLSAqCTUuIFVubWFwcGVkIGZyb20gR1RUCi0gKgkJaTkxNV9nZW1fb2JqZWN0X3VuYmluZCBjYWxscyBzZXRfZG9tYWluIChDUFUsIENQVSkKLSAqCQlmbHVzaF9kb21haW5zIGFuZCBpbnZhbGlkYXRlX2RvbWFpbnMgZW5kIHVwIGJvdGggemVybwotICoJCXNvIG5vIGZsdXNoaW5nL2ludmFsaWRhdGluZyBoYXBwZW5zCi0gKgk2LiBGcmVlZAotICoJCXlheSwgZG9uZQotICoKLSAqIENhc2UgMjogVGhlIHNoYXJlZCByZW5kZXIgYnVmZmVyCi0gKgotICoJMS4gQWxsb2NhdGVkCi0gKgkyLiBNYXBwZWQgdG8gR1RUCi0gKgkzLiBSZWFkL3dyaXR0ZW4gYnkgR1BVCi0gKgk0LiBzZXRfZG9tYWluIHRvIChDUFUsQ1BVKQotICoJNS4gUmVhZC93cml0dGVuIGJ5IENQVQotICoJNi4gUmVhZC93cml0dGVuIGJ5IEdQVQotICoKLSAqCTEuIEFsbG9jYXRlZAotICoJCVNhbWUgYXMgbGFzdCBleGFtcGxlLCAoQ1BVLCBDUFUpCi0gKgkyLiBNYXBwZWQgdG8gR1RUCi0gKgkJTm90aGluZyBjaGFuZ2VzIChhc3NlcnRpb25zIGZpbmQgdGhhdCBpdCBpcyBub3QgaW4gdGhlIEdQVSkKLSAqCTMuIFJlYWQvd3JpdHRlbiBieSBHUFUKLSAqCQlleGVjYnVmZmVyIGNhbGxzIHNldF9kb21haW4gKFJFTkRFUiwgUkVOREVSKQotICoJCWZsdXNoX2RvbWFpbnMgZ2V0cyBDUFUKLSAqCQlpbnZhbGlkYXRlX2RvbWFpbnMgZ2V0cyBHUFUKLSAqCQljbGZsdXNoIChvYmopCi0gKgkJTUlfRkxVU0ggYW5kIGRybV9hZ3BfY2hpcHNldF9mbHVzaAotICoJNC4gc2V0X2RvbWFpbiAoQ1BVLCBDUFUpCi0gKgkJZmx1c2hfZG9tYWlucyBnZXRzIEdQVQotICoJCWludmFsaWRhdGVfZG9tYWlucyBnZXRzIENQVQotICoJCXdhaXRfcmVuZGVyaW5nIChvYmopIHRvIG1ha2Ugc3VyZSBhbGwgZHJhd2luZyBpcyBjb21wbGV0ZS4KLSAqCQlUaGlzIHdpbGwgaW5jbHVkZSBhbiBNSV9GTFVTSCB0byBnZXQgdGhlIGRhdGEgZnJvbSBHUFUKLSAqCQl0byBtZW1vcnkKLSAqCQljbGZsdXNoIChvYmopIHRvIGludmFsaWRhdGUgdGhlIENQVSBjYWNoZQotICoJCUFub3RoZXIgTUlfRkxVU0ggaW4gaTkxNV9nZW1fZmx1c2ggKGVsaW1pbmF0ZSB0aGlzIHNvbWVob3c/KQotICoJNS4gUmVhZC93cml0dGVuIGJ5IENQVQotICoJCWNhY2hlIGxpbmVzIGFyZSBsb2FkZWQgYW5kIGRpcnRpZWQKLSAqCTYuIFJlYWQgd3JpdHRlbiBieSBHUFUKLSAqCQlTYW1lIGFzIGxhc3QgR1BVIGFjY2VzcwotICoKLSAqIENhc2UgMzogVGhlIGNvbnN0YW50IGJ1ZmZlcgotICoKLSAqCTEuIEFsbG9jYXRlZAotICoJMi4gV3JpdHRlbiBieSBDUFUKLSAqCTMuIFJlYWQgYnkgR1BVCi0gKgk0LiBVcGRhdGVkICh3cml0dGVuKSBieSBDUFUgYWdhaW4KLSAqCTUuIFJlYWQgYnkgR1BVCi0gKgotICoJMS4gQWxsb2NhdGVkCi0gKgkJKENQVSwgQ1BVKQotICoJMi4gV3JpdHRlbiBieSBDUFUKLSAqCQkoQ1BVLCBDUFUpCi0gKgkzLiBSZWFkIGJ5IEdQVQotICoJCShDUFUrUkVOREVSLCAwKQotICoJCWZsdXNoX2RvbWFpbnMgPSBDUFUKLSAqCQlpbnZhbGlkYXRlX2RvbWFpbnMgPSBSRU5ERVIKLSAqCQljbGZsdXNoIChvYmopCi0gKgkJTUlfRkxVU0gKLSAqCQlkcm1fYWdwX2NoaXBzZXRfZmx1c2gKLSAqCTQuIFVwZGF0ZWQgKHdyaXR0ZW4pIGJ5IENQVSBhZ2FpbgotICoJCShDUFUsIENQVSkKLSAqCQlmbHVzaF9kb21haW5zID0gMCAobm8gcHJldmlvdXMgd3JpdGUgZG9tYWluKQotICoJCWludmFsaWRhdGVfZG9tYWlucyA9IDAgKG5vIG5ldyByZWFkIGRvbWFpbnMpCi0gKgk1LiBSZWFkIGJ5IEdQVQotICoJCShDUFUrUkVOREVSLCAwKQotICoJCWZsdXNoX2RvbWFpbnMgPSBDUFUKLSAqCQlpbnZhbGlkYXRlX2RvbWFpbnMgPSBSRU5ERVIKLSAqCQljbGZsdXNoIChvYmopCi0gKgkJTUlfRkxVU0gKLSAqCQlkcm1fYWdwX2NoaXBzZXRfZmx1c2gKLSAqLwotc3RhdGljIHZvaWQKLWk5MTVfZ2VtX29iamVjdF9zZXRfdG9fZ3B1X2RvbWFpbihzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iaiwKLQkJCQkgIHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZykKLXsKLQlzdHJ1Y3QgZHJtX2RldmljZQkJKmRldiA9IG9iai0+ZGV2OwotCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlCQkqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0CSpvYmpfcHJpdiA9IHRvX2ludGVsX2JvKG9iaik7Ci0JdWludDMyX3QJCQlpbnZhbGlkYXRlX2RvbWFpbnMgPSAwOwotCXVpbnQzMl90CQkJZmx1c2hfZG9tYWlucyA9IDA7Ci0JdWludDMyX3QJCQlvbGRfcmVhZF9kb21haW5zOwotCi0JaW50ZWxfbWFya19idXN5KGRldiwgb2JqKTsKLQotCS8qCi0JICogSWYgdGhlIG9iamVjdCBpc24ndCBtb3ZpbmcgdG8gYSBuZXcgd3JpdGUgZG9tYWluLAotCSAqIGxldCB0aGUgb2JqZWN0IHN0YXkgaW4gbXVsdGlwbGUgcmVhZCBkb21haW5zCi0JICovCi0JaWYgKG9iai0+cGVuZGluZ193cml0ZV9kb21haW4gPT0gMCkKLQkJb2JqLT5wZW5kaW5nX3JlYWRfZG9tYWlucyB8PSBvYmotPnJlYWRfZG9tYWluczsKLQllbHNlCi0JCW9ial9wcml2LT5kaXJ0eSA9IDE7Ci0KLQkvKgotCSAqIEZsdXNoIHRoZSBjdXJyZW50IHdyaXRlIGRvbWFpbiBpZgotCSAqIHRoZSBuZXcgcmVhZCBkb21haW5zIGRvbid0IG1hdGNoLiBJbnZhbGlkYXRlCi0JICogYW55IHJlYWQgZG9tYWlucyB3aGljaCBkaWZmZXIgZnJvbSB0aGUgb2xkCi0JICogd3JpdGUgZG9tYWluCi0JICovCi0JaWYgKG9iai0+d3JpdGVfZG9tYWluICYmCi0JICAgIChvYmotPndyaXRlX2RvbWFpbiAhPSBvYmotPnBlbmRpbmdfcmVhZF9kb21haW5zIHx8Ci0JICAgICBvYmpfcHJpdi0+cmluZyAhPSByaW5nKSkgewotCQlmbHVzaF9kb21haW5zIHw9IG9iai0+d3JpdGVfZG9tYWluOwotCQlpbnZhbGlkYXRlX2RvbWFpbnMgfD0KLQkJCW9iai0+cGVuZGluZ19yZWFkX2RvbWFpbnMgJiB+b2JqLT53cml0ZV9kb21haW47Ci0JfQotCS8qCi0JICogSW52YWxpZGF0ZSBhbnkgcmVhZCBjYWNoZXMgd2hpY2ggbWF5IGhhdmUKLQkgKiBzdGFsZSBkYXRhLiBUaGF0IGlzLCBhbnkgbmV3IHJlYWQgZG9tYWlucy4KLQkgKi8KLQlpbnZhbGlkYXRlX2RvbWFpbnMgfD0gb2JqLT5wZW5kaW5nX3JlYWRfZG9tYWlucyAmIH5vYmotPnJlYWRfZG9tYWluczsKLQlpZiAoKGZsdXNoX2RvbWFpbnMgfCBpbnZhbGlkYXRlX2RvbWFpbnMpICYgSTkxNV9HRU1fRE9NQUlOX0NQVSkKLQkJaTkxNV9nZW1fY2xmbHVzaF9vYmplY3Qob2JqKTsKLQotCW9sZF9yZWFkX2RvbWFpbnMgPSBvYmotPnJlYWRfZG9tYWluczsKLQotCS8qIFRoZSBhY3R1YWwgb2JqLT53cml0ZV9kb21haW4gd2lsbCBiZSB1cGRhdGVkIHdpdGgKLQkgKiBwZW5kaW5nX3dyaXRlX2RvbWFpbiBhZnRlciB3ZSBlbWl0IHRoZSBhY2N1bXVsYXRlZCBmbHVzaCBmb3IgYWxsCi0JICogb2Ygb3VyIGRvbWFpbiBjaGFuZ2VzIGluIGV4ZWNidWZmZXJzICh3aGljaCBjbGVhcnMgb2JqZWN0cycKLQkgKiB3cml0ZV9kb21haW5zKS4gIFNvIGlmIHdlIGhhdmUgYSBjdXJyZW50IHdyaXRlIGRvbWFpbiB0aGF0IHdlCi0JICogYXJlbid0IGNoYW5naW5nLCBzZXQgcGVuZGluZ193cml0ZV9kb21haW4gdG8gdGhhdC4KLQkgKi8KLQlpZiAoZmx1c2hfZG9tYWlucyA9PSAwICYmIG9iai0+cGVuZGluZ193cml0ZV9kb21haW4gPT0gMCkKLQkJb2JqLT5wZW5kaW5nX3dyaXRlX2RvbWFpbiA9IG9iai0+d3JpdGVfZG9tYWluOwotCW9iai0+cmVhZF9kb21haW5zID0gb2JqLT5wZW5kaW5nX3JlYWRfZG9tYWluczsKLQotCWRldi0+aW52YWxpZGF0ZV9kb21haW5zIHw9IGludmFsaWRhdGVfZG9tYWluczsKLQlkZXYtPmZsdXNoX2RvbWFpbnMgfD0gZmx1c2hfZG9tYWluczsKLQlpZiAoZmx1c2hfZG9tYWlucyAmIEk5MTVfR0VNX0dQVV9ET01BSU5TKQotCQlkZXZfcHJpdi0+bW0uZmx1c2hfcmluZ3MgfD0gb2JqX3ByaXYtPnJpbmctPmlkOwotCWlmIChpbnZhbGlkYXRlX2RvbWFpbnMgJiBJOTE1X0dFTV9HUFVfRE9NQUlOUykKLQkJZGV2X3ByaXYtPm1tLmZsdXNoX3JpbmdzIHw9IHJpbmctPmlkOwotCi0JdHJhY2VfaTkxNV9nZW1fb2JqZWN0X2NoYW5nZV9kb21haW4ob2JqLAotCQkJCQkgICAgb2xkX3JlYWRfZG9tYWlucywKLQkJCQkJICAgIG9iai0+d3JpdGVfZG9tYWluKTsKLX0KLQogLyoqCiAgKiBNb3ZlcyB0aGUgb2JqZWN0IGZyb20gYSBwYXJ0aWFsbHkgQ1BVIHJlYWQgdG8gYSBmdWxsIG9uZS4KICAqCkBAIC0zMTQ1LDMwICszMDIzLDI4IEBACiAgKiBhbmQgZG9lc24ndCBoYW5kbGUgdHJhbnNpdGlvbmluZyBmcm9tICEocmVhZF9kb21haW5zICYgSTkxNV9HRU1fRE9NQUlOX0NQVSkuCiAgKi8KIHN0YXRpYyB2b2lkCi1pOTE1X2dlbV9vYmplY3Rfc2V0X3RvX2Z1bGxfY3B1X3JlYWRfZG9tYWluKHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqKQoraTkxNV9nZW1fb2JqZWN0X3NldF90b19mdWxsX2NwdV9yZWFkX2RvbWFpbihzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqKQogewotCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmpfcHJpdiA9IHRvX2ludGVsX2JvKG9iaik7Ci0KLQlpZiAoIW9ial9wcml2LT5wYWdlX2NwdV92YWxpZCkKKwlpZiAoIW9iai0+cGFnZV9jcHVfdmFsaWQpCiAJCXJldHVybjsKIAogCS8qIElmIHdlJ3JlIHBhcnRpYWxseSBpbiB0aGUgQ1BVIHJlYWQgZG9tYWluLCBmaW5pc2ggbW92aW5nIGl0IGluLgogCSAqLwotCWlmIChvYmotPnJlYWRfZG9tYWlucyAmIEk5MTVfR0VNX0RPTUFJTl9DUFUpIHsKKwlpZiAob2JqLT5iYXNlLnJlYWRfZG9tYWlucyAmIEk5MTVfR0VNX0RPTUFJTl9DUFUpIHsKIAkJaW50IGk7CiAKLQkJZm9yIChpID0gMDsgaSA8PSAob2JqLT5zaXplIC0gMSkgLyBQQUdFX1NJWkU7IGkrKykgewotCQkJaWYgKG9ial9wcml2LT5wYWdlX2NwdV92YWxpZFtpXSkKKwkJZm9yIChpID0gMDsgaSA8PSAob2JqLT5iYXNlLnNpemUgLSAxKSAvIFBBR0VfU0laRTsgaSsrKSB7CisJCQlpZiAob2JqLT5wYWdlX2NwdV92YWxpZFtpXSkKIAkJCQljb250aW51ZTsKLQkJCWRybV9jbGZsdXNoX3BhZ2VzKG9ial9wcml2LT5wYWdlcyArIGksIDEpOworCQkJZHJtX2NsZmx1c2hfcGFnZXMob2JqLT5wYWdlcyArIGksIDEpOwogCQl9CiAJfQogCiAJLyogRnJlZSB0aGUgcGFnZV9jcHVfdmFsaWQgbWFwcGluZ3Mgd2hpY2ggYXJlIG5vdyBzdGFsZSwgd2hldGhlcgogCSAqIG9yIG5vdCB3ZSd2ZSBnb3QgSTkxNV9HRU1fRE9NQUlOX0NQVS4KIAkgKi8KLQlrZnJlZShvYmpfcHJpdi0+cGFnZV9jcHVfdmFsaWQpOwotCW9ial9wcml2LT5wYWdlX2NwdV92YWxpZCA9IE5VTEw7CisJa2ZyZWUob2JqLT5wYWdlX2NwdV92YWxpZCk7CisJb2JqLT5wYWdlX2NwdV92YWxpZCA9IE5VTEw7CiB9CiAKIC8qKgpAQCAtMzE4NCwxOSArMzA2MCwxNiBAQAogICogZmx1c2hlcyB0byBvY2N1ci4KICAqLwogc3RhdGljIGludAotaTkxNV9nZW1fb2JqZWN0X3NldF9jcHVfcmVhZF9kb21haW5fcmFuZ2Uoc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmosCitpOTE1X2dlbV9vYmplY3Rfc2V0X2NwdV9yZWFkX2RvbWFpbl9yYW5nZShzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqLAogCQkJCQkgIHVpbnQ2NF90IG9mZnNldCwgdWludDY0X3Qgc2l6ZSkKIHsKLQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqX3ByaXYgPSB0b19pbnRlbF9ibyhvYmopOwogCXVpbnQzMl90IG9sZF9yZWFkX2RvbWFpbnM7CiAJaW50IGksIHJldDsKIAotCWlmIChvZmZzZXQgPT0gMCAmJiBzaXplID09IG9iai0+c2l6ZSkKKwlpZiAob2Zmc2V0ID09IDAgJiYgc2l6ZSA9PSBvYmotPmJhc2Uuc2l6ZSkKIAkJcmV0dXJuIGk5MTVfZ2VtX29iamVjdF9zZXRfdG9fY3B1X2RvbWFpbihvYmosIDApOwogCi0JcmV0ID0gaTkxNV9nZW1fb2JqZWN0X2ZsdXNoX2dwdV93cml0ZV9kb21haW4ob2JqKTsKLQlpZiAocmV0ICE9IDApCi0JCXJldHVybiByZXQ7CisJaTkxNV9nZW1fb2JqZWN0X2ZsdXNoX2dwdV93cml0ZV9kb21haW4ob2JqKTsKIAlyZXQgPSBpOTE1X2dlbV9vYmplY3Rfd2FpdF9yZW5kZXJpbmcob2JqLCB0cnVlKTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwpAQCAtMzIwNCw0NTcgKzMwNzcsNDUgQEAKIAlpOTE1X2dlbV9vYmplY3RfZmx1c2hfZ3R0X3dyaXRlX2RvbWFpbihvYmopOwogCiAJLyogSWYgd2UncmUgYWxyZWFkeSBmdWxseSBpbiB0aGUgQ1BVIHJlYWQgZG9tYWluLCB3ZSdyZSBkb25lLiAqLwotCWlmIChvYmpfcHJpdi0+cGFnZV9jcHVfdmFsaWQgPT0gTlVMTCAmJgotCSAgICAob2JqLT5yZWFkX2RvbWFpbnMgJiBJOTE1X0dFTV9ET01BSU5fQ1BVKSAhPSAwKQorCWlmIChvYmotPnBhZ2VfY3B1X3ZhbGlkID09IE5VTEwgJiYKKwkgICAgKG9iai0+YmFzZS5yZWFkX2RvbWFpbnMgJiBJOTE1X0dFTV9ET01BSU5fQ1BVKSAhPSAwKQogCQlyZXR1cm4gMDsKIAogCS8qIE90aGVyd2lzZSwgY3JlYXRlL2NsZWFyIHRoZSBwZXItcGFnZSBDUFUgcmVhZCBkb21haW4gZmxhZyBpZiB3ZSdyZQogCSAqIG5ld2x5IGFkZGluZyBJOTE1X0dFTV9ET01BSU5fQ1BVCiAJICovCi0JaWYgKG9ial9wcml2LT5wYWdlX2NwdV92YWxpZCA9PSBOVUxMKSB7Ci0JCW9ial9wcml2LT5wYWdlX2NwdV92YWxpZCA9IGt6YWxsb2Mob2JqLT5zaXplIC8gUEFHRV9TSVpFLAotCQkJCQkJICAgR0ZQX0tFUk5FTCk7Ci0JCWlmIChvYmpfcHJpdi0+cGFnZV9jcHVfdmFsaWQgPT0gTlVMTCkKKwlpZiAob2JqLT5wYWdlX2NwdV92YWxpZCA9PSBOVUxMKSB7CisJCW9iai0+cGFnZV9jcHVfdmFsaWQgPSBremFsbG9jKG9iai0+YmFzZS5zaXplIC8gUEFHRV9TSVpFLAorCQkJCQkgICAgICBHRlBfS0VSTkVMKTsKKwkJaWYgKG9iai0+cGFnZV9jcHVfdmFsaWQgPT0gTlVMTCkKIAkJCXJldHVybiAtRU5PTUVNOwotCX0gZWxzZSBpZiAoKG9iai0+cmVhZF9kb21haW5zICYgSTkxNV9HRU1fRE9NQUlOX0NQVSkgPT0gMCkKLQkJbWVtc2V0KG9ial9wcml2LT5wYWdlX2NwdV92YWxpZCwgMCwgb2JqLT5zaXplIC8gUEFHRV9TSVpFKTsKKwl9IGVsc2UgaWYgKChvYmotPmJhc2UucmVhZF9kb21haW5zICYgSTkxNV9HRU1fRE9NQUlOX0NQVSkgPT0gMCkKKwkJbWVtc2V0KG9iai0+cGFnZV9jcHVfdmFsaWQsIDAsIG9iai0+YmFzZS5zaXplIC8gUEFHRV9TSVpFKTsKIAogCS8qIEZsdXNoIHRoZSBjYWNoZSBvbiBhbnkgcGFnZXMgdGhhdCBhcmUgc3RpbGwgaW52YWxpZCBmcm9tIHRoZSBDUFUncwogCSAqIHBlcnNwZWN0aXZlLgogCSAqLwogCWZvciAoaSA9IG9mZnNldCAvIFBBR0VfU0laRTsgaSA8PSAob2Zmc2V0ICsgc2l6ZSAtIDEpIC8gUEFHRV9TSVpFOwogCSAgICAgaSsrKSB7Ci0JCWlmIChvYmpfcHJpdi0+cGFnZV9jcHVfdmFsaWRbaV0pCisJCWlmIChvYmotPnBhZ2VfY3B1X3ZhbGlkW2ldKQogCQkJY29udGludWU7CiAKLQkJZHJtX2NsZmx1c2hfcGFnZXMob2JqX3ByaXYtPnBhZ2VzICsgaSwgMSk7CisJCWRybV9jbGZsdXNoX3BhZ2VzKG9iai0+cGFnZXMgKyBpLCAxKTsKIAotCQlvYmpfcHJpdi0+cGFnZV9jcHVfdmFsaWRbaV0gPSAxOworCQlvYmotPnBhZ2VfY3B1X3ZhbGlkW2ldID0gMTsKIAl9CiAKIAkvKiBJdCBzaG91bGQgbm93IGJlIG91dCBvZiBhbnkgb3RoZXIgd3JpdGUgZG9tYWlucywgYW5kIHdlIGNhbiB1cGRhdGUKIAkgKiB0aGUgZG9tYWluIHZhbHVlcyBmb3Igb3VyIGNoYW5nZXMuCiAJICovCi0JQlVHX09OKChvYmotPndyaXRlX2RvbWFpbiAmIH5JOTE1X0dFTV9ET01BSU5fQ1BVKSAhPSAwKTsKKwlCVUdfT04oKG9iai0+YmFzZS53cml0ZV9kb21haW4gJiB+STkxNV9HRU1fRE9NQUlOX0NQVSkgIT0gMCk7CiAKLQlvbGRfcmVhZF9kb21haW5zID0gb2JqLT5yZWFkX2RvbWFpbnM7Ci0Jb2JqLT5yZWFkX2RvbWFpbnMgfD0gSTkxNV9HRU1fRE9NQUlOX0NQVTsKKwlvbGRfcmVhZF9kb21haW5zID0gb2JqLT5iYXNlLnJlYWRfZG9tYWluczsKKwlvYmotPmJhc2UucmVhZF9kb21haW5zIHw9IEk5MTVfR0VNX0RPTUFJTl9DUFU7CiAKIAl0cmFjZV9pOTE1X2dlbV9vYmplY3RfY2hhbmdlX2RvbWFpbihvYmosCiAJCQkJCSAgICBvbGRfcmVhZF9kb21haW5zLAotCQkJCQkgICAgb2JqLT53cml0ZV9kb21haW4pOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQKLWk5MTVfZ2VtX2V4ZWNidWZmZXJfcmVsb2NhdGVfZW50cnkoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaiwKLQkJCQkgICBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdiwKLQkJCQkgICBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX2V4ZWNfb2JqZWN0MiAqZW50cnksCi0JCQkJICAgc3RydWN0IGRybV9pOTE1X2dlbV9yZWxvY2F0aW9uX2VudHJ5ICpyZWxvYykKLXsKLQlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gb2JqLT5iYXNlLmRldjsKLQlzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKnRhcmdldF9vYmo7Ci0JdWludDMyX3QgdGFyZ2V0X29mZnNldDsKLQlpbnQgcmV0ID0gLUVJTlZBTDsKLQotCXRhcmdldF9vYmogPSBkcm1fZ2VtX29iamVjdF9sb29rdXAoZGV2LCBmaWxlX3ByaXYsCi0JCQkJCSAgIHJlbG9jLT50YXJnZXRfaGFuZGxlKTsKLQlpZiAodGFyZ2V0X29iaiA9PSBOVUxMKQotCQlyZXR1cm4gLUVOT0VOVDsKLQotCXRhcmdldF9vZmZzZXQgPSB0b19pbnRlbF9ibyh0YXJnZXRfb2JqKS0+Z3R0X29mZnNldDsKLQotI2lmIFdBVENIX1JFTE9DCi0JRFJNX0lORk8oIiVzOiBvYmogJXAgb2Zmc2V0ICUwOHggdGFyZ2V0ICVkICIKLQkJICJyZWFkICUwOHggd3JpdGUgJTA4eCBndHQgJTA4eCAiCi0JCSAicHJlc3VtZWQgJTA4eCBkZWx0YSAlMDh4XG4iLAotCQkgX19mdW5jX18sCi0JCSBvYmosCi0JCSAoaW50KSByZWxvYy0+b2Zmc2V0LAotCQkgKGludCkgcmVsb2MtPnRhcmdldF9oYW5kbGUsCi0JCSAoaW50KSByZWxvYy0+cmVhZF9kb21haW5zLAotCQkgKGludCkgcmVsb2MtPndyaXRlX2RvbWFpbiwKLQkJIChpbnQpIHRhcmdldF9vZmZzZXQsCi0JCSAoaW50KSByZWxvYy0+cHJlc3VtZWRfb2Zmc2V0LAotCQkgcmVsb2MtPmRlbHRhKTsKLSNlbmRpZgotCi0JLyogVGhlIHRhcmdldCBidWZmZXIgc2hvdWxkIGhhdmUgYXBwZWFyZWQgYmVmb3JlIHVzIGluIHRoZQotCSAqIGV4ZWNfb2JqZWN0IGxpc3QsIHNvIGl0IHNob3VsZCBoYXZlIGEgR1RUIHNwYWNlIGJvdW5kIGJ5IG5vdy4KLQkgKi8KLQlpZiAodGFyZ2V0X29mZnNldCA9PSAwKSB7Ci0JCURSTV9FUlJPUigiTm8gR1RUIHNwYWNlIGZvdW5kIGZvciBvYmplY3QgJWRcbiIsCi0JCQkgIHJlbG9jLT50YXJnZXRfaGFuZGxlKTsKLQkJZ290byBlcnI7Ci0JfQotCi0JLyogVmFsaWRhdGUgdGhhdCB0aGUgdGFyZ2V0IGlzIGluIGEgdmFsaWQgci93IEdQVSBkb21haW4gKi8KLQlpZiAocmVsb2MtPndyaXRlX2RvbWFpbiAmIChyZWxvYy0+d3JpdGVfZG9tYWluIC0gMSkpIHsKLQkJRFJNX0VSUk9SKCJyZWxvYyB3aXRoIG11bHRpcGxlIHdyaXRlIGRvbWFpbnM6ICIKLQkJCSAgIm9iaiAlcCB0YXJnZXQgJWQgb2Zmc2V0ICVkICIKLQkJCSAgInJlYWQgJTA4eCB3cml0ZSAlMDh4IiwKLQkJCSAgb2JqLCByZWxvYy0+dGFyZ2V0X2hhbmRsZSwKLQkJCSAgKGludCkgcmVsb2MtPm9mZnNldCwKLQkJCSAgcmVsb2MtPnJlYWRfZG9tYWlucywKLQkJCSAgcmVsb2MtPndyaXRlX2RvbWFpbik7Ci0JCWdvdG8gZXJyOwotCX0KLQlpZiAocmVsb2MtPndyaXRlX2RvbWFpbiAmIEk5MTVfR0VNX0RPTUFJTl9DUFUgfHwKLQkgICAgcmVsb2MtPnJlYWRfZG9tYWlucyAmIEk5MTVfR0VNX0RPTUFJTl9DUFUpIHsKLQkJRFJNX0VSUk9SKCJyZWxvYyB3aXRoIHJlYWQvd3JpdGUgQ1BVIGRvbWFpbnM6ICIKLQkJCSAgIm9iaiAlcCB0YXJnZXQgJWQgb2Zmc2V0ICVkICIKLQkJCSAgInJlYWQgJTA4eCB3cml0ZSAlMDh4IiwKLQkJCSAgb2JqLCByZWxvYy0+dGFyZ2V0X2hhbmRsZSwKLQkJCSAgKGludCkgcmVsb2MtPm9mZnNldCwKLQkJCSAgcmVsb2MtPnJlYWRfZG9tYWlucywKLQkJCSAgcmVsb2MtPndyaXRlX2RvbWFpbik7Ci0JCWdvdG8gZXJyOwotCX0KLQlpZiAocmVsb2MtPndyaXRlX2RvbWFpbiAmJiB0YXJnZXRfb2JqLT5wZW5kaW5nX3dyaXRlX2RvbWFpbiAmJgotCSAgICByZWxvYy0+d3JpdGVfZG9tYWluICE9IHRhcmdldF9vYmotPnBlbmRpbmdfd3JpdGVfZG9tYWluKSB7Ci0JCURSTV9FUlJPUigiV3JpdGUgZG9tYWluIGNvbmZsaWN0OiAiCi0JCQkgICJvYmogJXAgdGFyZ2V0ICVkIG9mZnNldCAlZCAiCi0JCQkgICJuZXcgJTA4eCBvbGQgJTA4eFxuIiwKLQkJCSAgb2JqLCByZWxvYy0+dGFyZ2V0X2hhbmRsZSwKLQkJCSAgKGludCkgcmVsb2MtPm9mZnNldCwKLQkJCSAgcmVsb2MtPndyaXRlX2RvbWFpbiwKLQkJCSAgdGFyZ2V0X29iai0+cGVuZGluZ193cml0ZV9kb21haW4pOwotCQlnb3RvIGVycjsKLQl9Ci0KLQl0YXJnZXRfb2JqLT5wZW5kaW5nX3JlYWRfZG9tYWlucyB8PSByZWxvYy0+cmVhZF9kb21haW5zOwotCXRhcmdldF9vYmotPnBlbmRpbmdfd3JpdGVfZG9tYWluIHw9IHJlbG9jLT53cml0ZV9kb21haW47Ci0KLQkvKiBJZiB0aGUgcmVsb2NhdGlvbiBhbHJlYWR5IGhhcyB0aGUgcmlnaHQgdmFsdWUgaW4gaXQsIG5vCi0JICogbW9yZSB3b3JrIG5lZWRzIHRvIGJlIGRvbmUuCi0JICovCi0JaWYgKHRhcmdldF9vZmZzZXQgPT0gcmVsb2MtPnByZXN1bWVkX29mZnNldCkKLQkJZ290byBvdXQ7Ci0KLQkvKiBDaGVjayB0aGF0IHRoZSByZWxvY2F0aW9uIGFkZHJlc3MgaXMgdmFsaWQuLi4gKi8KLQlpZiAocmVsb2MtPm9mZnNldCA+IG9iai0+YmFzZS5zaXplIC0gNCkgewotCQlEUk1fRVJST1IoIlJlbG9jYXRpb24gYmV5b25kIG9iamVjdCBib3VuZHM6ICIKLQkJCSAgIm9iaiAlcCB0YXJnZXQgJWQgb2Zmc2V0ICVkIHNpemUgJWQuXG4iLAotCQkJICBvYmosIHJlbG9jLT50YXJnZXRfaGFuZGxlLAotCQkJICAoaW50KSByZWxvYy0+b2Zmc2V0LAotCQkJICAoaW50KSBvYmotPmJhc2Uuc2l6ZSk7Ci0JCWdvdG8gZXJyOwotCX0KLQlpZiAocmVsb2MtPm9mZnNldCAmIDMpIHsKLQkJRFJNX0VSUk9SKCJSZWxvY2F0aW9uIG5vdCA0LWJ5dGUgYWxpZ25lZDogIgotCQkJICAib2JqICVwIHRhcmdldCAlZCBvZmZzZXQgJWQuXG4iLAotCQkJICBvYmosIHJlbG9jLT50YXJnZXRfaGFuZGxlLAotCQkJICAoaW50KSByZWxvYy0+b2Zmc2V0KTsKLQkJZ290byBlcnI7Ci0JfQotCi0JLyogYW5kIHBvaW50cyB0byBzb21ld2hlcmUgd2l0aGluIHRoZSB0YXJnZXQgb2JqZWN0LiAqLwotCWlmIChyZWxvYy0+ZGVsdGEgPj0gdGFyZ2V0X29iai0+c2l6ZSkgewotCQlEUk1fRVJST1IoIlJlbG9jYXRpb24gYmV5b25kIHRhcmdldCBvYmplY3QgYm91bmRzOiAiCi0JCQkgICJvYmogJXAgdGFyZ2V0ICVkIGRlbHRhICVkIHNpemUgJWQuXG4iLAotCQkJICBvYmosIHJlbG9jLT50YXJnZXRfaGFuZGxlLAotCQkJICAoaW50KSByZWxvYy0+ZGVsdGEsCi0JCQkgIChpbnQpIHRhcmdldF9vYmotPnNpemUpOwotCQlnb3RvIGVycjsKLQl9Ci0KLQlyZWxvYy0+ZGVsdGEgKz0gdGFyZ2V0X29mZnNldDsKLQlpZiAob2JqLT5iYXNlLndyaXRlX2RvbWFpbiA9PSBJOTE1X0dFTV9ET01BSU5fQ1BVKSB7Ci0JCXVpbnQzMl90IHBhZ2Vfb2Zmc2V0ID0gcmVsb2MtPm9mZnNldCAmIH5QQUdFX01BU0s7Ci0JCWNoYXIgKnZhZGRyOwotCi0JCXZhZGRyID0ga21hcF9hdG9taWMob2JqLT5wYWdlc1tyZWxvYy0+b2Zmc2V0ID4+IFBBR0VfU0hJRlRdKTsKLQkJKih1aW50MzJfdCAqKSh2YWRkciArIHBhZ2Vfb2Zmc2V0KSA9IHJlbG9jLT5kZWx0YTsKLQkJa3VubWFwX2F0b21pYyh2YWRkcik7Ci0JfSBlbHNlIHsKLQkJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQkJdWludDMyX3QgX19pb21lbSAqcmVsb2NfZW50cnk7Ci0JCXZvaWQgX19pb21lbSAqcmVsb2NfcGFnZTsKLQotCQlyZXQgPSBpOTE1X2dlbV9vYmplY3Rfc2V0X3RvX2d0dF9kb21haW4oJm9iai0+YmFzZSwgMSk7Ci0JCWlmIChyZXQpCi0JCQlnb3RvIGVycjsKLQotCQkvKiBNYXAgdGhlIHBhZ2UgY29udGFpbmluZyB0aGUgcmVsb2NhdGlvbiB3ZSdyZSBnb2luZyB0byBwZXJmb3JtLiAgKi8KLQkJcmVsb2MtPm9mZnNldCArPSBvYmotPmd0dF9vZmZzZXQ7Ci0JCXJlbG9jX3BhZ2UgPSBpb19tYXBwaW5nX21hcF9hdG9taWNfd2MoZGV2X3ByaXYtPm1tLmd0dF9tYXBwaW5nLAotCQkJCQkJICAgICAgcmVsb2MtPm9mZnNldCAmIFBBR0VfTUFTSyk7Ci0JCXJlbG9jX2VudHJ5ID0gKHVpbnQzMl90IF9faW9tZW0gKikKLQkJCShyZWxvY19wYWdlICsgKHJlbG9jLT5vZmZzZXQgJiB+UEFHRV9NQVNLKSk7Ci0JCWlvd3JpdGUzMihyZWxvYy0+ZGVsdGEsIHJlbG9jX2VudHJ5KTsKLQkJaW9fbWFwcGluZ191bm1hcF9hdG9taWMocmVsb2NfcGFnZSk7Ci0JfQotCi0JLyogYW5kIHVwZGF0ZSB0aGUgdXNlcidzIHJlbG9jYXRpb24gZW50cnkgKi8KLQlyZWxvYy0+cHJlc3VtZWRfb2Zmc2V0ID0gdGFyZ2V0X29mZnNldDsKLQotb3V0OgotCXJldCA9IDA7Ci1lcnI6Ci0JZHJtX2dlbV9vYmplY3RfdW5yZWZlcmVuY2UodGFyZ2V0X29iaik7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludAotaTkxNV9nZW1fZXhlY2J1ZmZlcl9yZWxvY2F0ZV9vYmplY3Qoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaiwKLQkJCQkgICAgc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYsCi0JCQkJICAgIHN0cnVjdCBkcm1faTkxNV9nZW1fZXhlY19vYmplY3QyICplbnRyeSkKLXsKLQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX3JlbG9jYXRpb25fZW50cnkgX191c2VyICp1c2VyX3JlbG9jczsKLQlpbnQgaSwgcmV0OwotCi0JdXNlcl9yZWxvY3MgPSAodm9pZCBfX3VzZXIgKikodWludHB0cl90KWVudHJ5LT5yZWxvY3NfcHRyOwotCWZvciAoaSA9IDA7IGkgPCBlbnRyeS0+cmVsb2NhdGlvbl9jb3VudDsgaSsrKSB7Ci0JCXN0cnVjdCBkcm1faTkxNV9nZW1fcmVsb2NhdGlvbl9lbnRyeSByZWxvYzsKLQotCQlpZiAoX19jb3B5X2Zyb21fdXNlcl9pbmF0b21pYygmcmVsb2MsCi0JCQkJCSAgICAgIHVzZXJfcmVsb2NzK2ksCi0JCQkJCSAgICAgIHNpemVvZihyZWxvYykpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQkJcmV0ID0gaTkxNV9nZW1fZXhlY2J1ZmZlcl9yZWxvY2F0ZV9lbnRyeShvYmosIGZpbGVfcHJpdiwgZW50cnksICZyZWxvYyk7Ci0JCWlmIChyZXQpCi0JCQlyZXR1cm4gcmV0OwotCi0JCWlmIChfX2NvcHlfdG9fdXNlcl9pbmF0b21pYygmdXNlcl9yZWxvY3NbaV0ucHJlc3VtZWRfb2Zmc2V0LAotCQkJCQkgICAgJnJlbG9jLnByZXN1bWVkX29mZnNldCwKLQkJCQkJICAgIHNpemVvZihyZWxvYy5wcmVzdW1lZF9vZmZzZXQpKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50Ci1pOTE1X2dlbV9leGVjYnVmZmVyX3JlbG9jYXRlX29iamVjdF9zbG93KHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmosCi0JCQkJCSBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdiwKLQkJCQkJIHN0cnVjdCBkcm1faTkxNV9nZW1fZXhlY19vYmplY3QyICplbnRyeSwKLQkJCQkJIHN0cnVjdCBkcm1faTkxNV9nZW1fcmVsb2NhdGlvbl9lbnRyeSAqcmVsb2NzKQotewotCWludCBpLCByZXQ7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgZW50cnktPnJlbG9jYXRpb25fY291bnQ7IGkrKykgewotCQlyZXQgPSBpOTE1X2dlbV9leGVjYnVmZmVyX3JlbG9jYXRlX2VudHJ5KG9iaiwgZmlsZV9wcml2LCBlbnRyeSwgJnJlbG9jc1tpXSk7Ci0JCWlmIChyZXQpCi0JCQlyZXR1cm4gcmV0OwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50Ci1pOTE1X2dlbV9leGVjYnVmZmVyX3JlbG9jYXRlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCi0JCQkgICAgIHN0cnVjdCBkcm1fZmlsZSAqZmlsZSwKLQkJCSAgICAgc3RydWN0IGRybV9nZW1fb2JqZWN0ICoqb2JqZWN0X2xpc3QsCi0JCQkgICAgIHN0cnVjdCBkcm1faTkxNV9nZW1fZXhlY19vYmplY3QyICpleGVjX2xpc3QsCi0JCQkgICAgIGludCBjb3VudCkKLXsKLQlpbnQgaSwgcmV0OwotCi0JZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLQkJc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaiA9IHRvX2ludGVsX2JvKG9iamVjdF9saXN0W2ldKTsKLQkJb2JqLT5iYXNlLnBlbmRpbmdfcmVhZF9kb21haW5zID0gMDsKLQkJb2JqLT5iYXNlLnBlbmRpbmdfd3JpdGVfZG9tYWluID0gMDsKLQkJcmV0ID0gaTkxNV9nZW1fZXhlY2J1ZmZlcl9yZWxvY2F0ZV9vYmplY3Qob2JqLCBmaWxlLAotCQkJCQkJCSAgJmV4ZWNfbGlzdFtpXSk7Ci0JCWlmIChyZXQpCi0JCQlyZXR1cm4gcmV0OwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50Ci1pOTE1X2dlbV9leGVjYnVmZmVyX3Jlc2VydmUoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKLQkJCSAgICBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGUsCi0JCQkgICAgc3RydWN0IGRybV9nZW1fb2JqZWN0ICoqb2JqZWN0X2xpc3QsCi0JCQkgICAgc3RydWN0IGRybV9pOTE1X2dlbV9leGVjX29iamVjdDIgKmV4ZWNfbGlzdCwKLQkJCSAgICBpbnQgY291bnQpCi17Ci0Jc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlpbnQgcmV0LCBpLCByZXRyeTsKLQotCS8qIGF0dGVtcHQgdG8gcGluIGFsbCBvZiB0aGUgYnVmZmVycyBpbnRvIHRoZSBHVFQgKi8KLQlmb3IgKHJldHJ5ID0gMDsgcmV0cnkgPCAyOyByZXRyeSsrKSB7Ci0JCXJldCA9IDA7Ci0JCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0JCQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX2V4ZWNfb2JqZWN0MiAqZW50cnkgPSAmZXhlY19saXN0W2ldOwotCQkJc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaj0gdG9faW50ZWxfYm8ob2JqZWN0X2xpc3RbaV0pOwotCQkJYm9vbCBuZWVkX2ZlbmNlID0KLQkJCQllbnRyeS0+ZmxhZ3MgJiBFWEVDX09CSkVDVF9ORUVEU19GRU5DRSAmJgotCQkJCW9iai0+dGlsaW5nX21vZGUgIT0gSTkxNV9USUxJTkdfTk9ORTsKLQotCQkJLyogQ2hlY2sgZmVuY2UgcmVnIGNvbnN0cmFpbnRzIGFuZCByZWJpbmQgaWYgbmVjZXNzYXJ5ICovCi0JCQlpZiAobmVlZF9mZW5jZSAmJgotCQkJICAgICFpOTE1X2dlbV9vYmplY3RfZmVuY2Vfb2Zmc2V0X29rKCZvYmotPmJhc2UsCi0JCQkJCQkJICAgICBvYmotPnRpbGluZ19tb2RlKSkgewotCQkJCXJldCA9IGk5MTVfZ2VtX29iamVjdF91bmJpbmQoJm9iai0+YmFzZSk7Ci0JCQkJaWYgKHJldCkKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCXJldCA9IGk5MTVfZ2VtX29iamVjdF9waW4oJm9iai0+YmFzZSwgZW50cnktPmFsaWdubWVudCk7Ci0JCQlpZiAocmV0KQotCQkJCWJyZWFrOwotCi0JCQkvKgotCQkJICogUHJlLTk2NSBjaGlwcyBuZWVkIGEgZmVuY2UgcmVnaXN0ZXIgc2V0IHVwIGluIG9yZGVyCi0JCQkgKiB0byBwcm9wZXJseSBoYW5kbGUgYmxpdHMgdG8vZnJvbSB0aWxlZCBzdXJmYWNlcy4KLQkJCSAqLwotCQkJaWYgKG5lZWRfZmVuY2UpIHsKLQkJCQlyZXQgPSBpOTE1X2dlbV9vYmplY3RfZ2V0X2ZlbmNlX3JlZygmb2JqLT5iYXNlLCB0cnVlKTsKLQkJCQlpZiAocmV0KSB7Ci0JCQkJCWk5MTVfZ2VtX29iamVjdF91bnBpbigmb2JqLT5iYXNlKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCi0JCQkJZGV2X3ByaXYtPmZlbmNlX3JlZ3Nbb2JqLT5mZW5jZV9yZWddLmdwdSA9IHRydWU7Ci0JCQl9Ci0KLQkJCWVudHJ5LT5vZmZzZXQgPSBvYmotPmd0dF9vZmZzZXQ7Ci0JCX0KLQotCQl3aGlsZSAoaS0tKQotCQkJaTkxNV9nZW1fb2JqZWN0X3VucGluKG9iamVjdF9saXN0W2ldKTsKLQotCQlpZiAocmV0ID09IDApCi0JCQlicmVhazsKLQotCQlpZiAocmV0ICE9IC1FTk9TUEMgfHwgcmV0cnkpCi0JCQlyZXR1cm4gcmV0OwotCi0JCXJldCA9IGk5MTVfZ2VtX2V2aWN0X2V2ZXJ5dGhpbmcoZGV2KTsKLQkJaWYgKHJldCkKLQkJCXJldHVybiByZXQ7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQKLWk5MTVfZ2VtX2V4ZWNidWZmZXJfcmVsb2NhdGVfc2xvdyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAotCQkJCSAgc3RydWN0IGRybV9maWxlICpmaWxlLAotCQkJCSAgc3RydWN0IGRybV9nZW1fb2JqZWN0ICoqb2JqZWN0X2xpc3QsCi0JCQkJICBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX2V4ZWNfb2JqZWN0MiAqZXhlY19saXN0LAotCQkJCSAgaW50IGNvdW50KQotewotCXN0cnVjdCBkcm1faTkxNV9nZW1fcmVsb2NhdGlvbl9lbnRyeSAqcmVsb2M7Ci0JaW50IGksIHRvdGFsLCByZXQ7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotCQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqID0gdG9faW50ZWxfYm8ob2JqZWN0X2xpc3RbaV0pOwotCQlvYmotPmluX2V4ZWNidWZmZXIgPSBmYWxzZTsKLQl9Ci0KLQltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKLQotCXRvdGFsID0gMDsKLQlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykKLQkJdG90YWwgKz0gZXhlY19saXN0W2ldLnJlbG9jYXRpb25fY291bnQ7Ci0KLQlyZWxvYyA9IGRybV9tYWxsb2NfYWIodG90YWwsIHNpemVvZigqcmVsb2MpKTsKLQlpZiAocmVsb2MgPT0gTlVMTCkgewotCQltdXRleF9sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCXRvdGFsID0gMDsKLQlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotCQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX3JlbG9jYXRpb25fZW50cnkgX191c2VyICp1c2VyX3JlbG9jczsKLQotCQl1c2VyX3JlbG9jcyA9ICh2b2lkIF9fdXNlciAqKSh1aW50cHRyX3QpZXhlY19saXN0W2ldLnJlbG9jc19wdHI7Ci0KLQkJaWYgKGNvcHlfZnJvbV91c2VyKHJlbG9jK3RvdGFsLCB1c2VyX3JlbG9jcywKLQkJCQkgICBleGVjX2xpc3RbaV0ucmVsb2NhdGlvbl9jb3VudCAqCi0JCQkJICAgc2l6ZW9mKCpyZWxvYykpKSB7Ci0JCQlyZXQgPSAtRUZBVUxUOwotCQkJbXV0ZXhfbG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwotCQkJZ290byBlcnI7Ci0JCX0KLQotCQl0b3RhbCArPSBleGVjX2xpc3RbaV0ucmVsb2NhdGlvbl9jb3VudDsKLQl9Ci0KLQlyZXQgPSBpOTE1X211dGV4X2xvY2tfaW50ZXJydXB0aWJsZShkZXYpOwotCWlmIChyZXQpIHsKLQkJbXV0ZXhfbG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwotCQlnb3RvIGVycjsKLQl9Ci0KLQlyZXQgPSBpOTE1X2dlbV9leGVjYnVmZmVyX3Jlc2VydmUoZGV2LCBmaWxlLAotCQkJCQkgIG9iamVjdF9saXN0LCBleGVjX2xpc3QsCi0JCQkJCSAgY291bnQpOwotCWlmIChyZXQpCi0JCWdvdG8gZXJyOwotCi0JdG90YWwgPSAwOwotCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0JCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmogPSB0b19pbnRlbF9ibyhvYmplY3RfbGlzdFtpXSk7Ci0JCW9iai0+YmFzZS5wZW5kaW5nX3JlYWRfZG9tYWlucyA9IDA7Ci0JCW9iai0+YmFzZS5wZW5kaW5nX3dyaXRlX2RvbWFpbiA9IDA7Ci0JCXJldCA9IGk5MTVfZ2VtX2V4ZWNidWZmZXJfcmVsb2NhdGVfb2JqZWN0X3Nsb3cob2JqLCBmaWxlLAotCQkJCQkJCSAgICAgICAmZXhlY19saXN0W2ldLAotCQkJCQkJCSAgICAgICByZWxvYyArIHRvdGFsKTsKLQkJaWYgKHJldCkKLQkJCWdvdG8gZXJyOwotCi0JCXRvdGFsICs9IGV4ZWNfbGlzdFtpXS5yZWxvY2F0aW9uX2NvdW50OwotCX0KLQotCS8qIExlYXZlIHRoZSB1c2VyIHJlbG9jYXRpb25zIGFzIGFyZSwgdGhpcyBpcyB0aGUgcGFpbmZ1bGx5IHNsb3cgcGF0aCwKLQkgKiBhbmQgd2Ugd2FudCB0byBhdm9pZCB0aGUgY29tcGxpY2F0aW9uIG9mIGRyb3BwaW5nIHRoZSBsb2NrIHdoaWxzdAotCSAqIGhhdmluZyBidWZmZXJzIHJlc2VydmVkIGluIHRoZSBhcGVydHVyZSBhbmQgc28gY2F1c2luZyBzcHVyaW91cwotCSAqIEVOT1NQQyBmb3IgcmFuZG9tIG9wZXJhdGlvbnMuCi0JICovCi0KLWVycjoKLQlkcm1fZnJlZV9sYXJnZShyZWxvYyk7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludAotaTkxNV9nZW1fZXhlY2J1ZmZlcl9tb3ZlX3RvX2dwdShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAotCQkJCXN0cnVjdCBkcm1fZmlsZSAqZmlsZSwKLQkJCQlzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcsCi0JCQkJc3RydWN0IGRybV9nZW1fb2JqZWN0ICoqb2JqZWN0cywKLQkJCQlpbnQgY291bnQpCi17Ci0Jc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlpbnQgcmV0LCBpOwotCi0JLyogWmVybyB0aGUgZ2xvYmFsIGZsdXNoL2ludmFsaWRhdGUgZmxhZ3MuIFRoZXNlCi0JICogd2lsbCBiZSBtb2RpZmllZCBhcyBuZXcgZG9tYWlucyBhcmUgY29tcHV0ZWQKLQkgKiBmb3IgZWFjaCBvYmplY3QKLQkgKi8KLQlkZXYtPmludmFsaWRhdGVfZG9tYWlucyA9IDA7Ci0JZGV2LT5mbHVzaF9kb21haW5zID0gMDsKLQlkZXZfcHJpdi0+bW0uZmx1c2hfcmluZ3MgPSAwOwotCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKQotCQlpOTE1X2dlbV9vYmplY3Rfc2V0X3RvX2dwdV9kb21haW4ob2JqZWN0c1tpXSwgcmluZyk7Ci0KLQlpZiAoZGV2LT5pbnZhbGlkYXRlX2RvbWFpbnMgfCBkZXYtPmZsdXNoX2RvbWFpbnMpIHsKLSNpZiBXQVRDSF9FWEVDCi0JCURSTV9JTkZPKCIlczogaW52YWxpZGF0ZV9kb21haW5zICUwOHggZmx1c2hfZG9tYWlucyAlMDh4XG4iLAotCQkJICBfX2Z1bmNfXywKLQkJCSBkZXYtPmludmFsaWRhdGVfZG9tYWlucywKLQkJCSBkZXYtPmZsdXNoX2RvbWFpbnMpOwotI2VuZGlmCi0JCWk5MTVfZ2VtX2ZsdXNoKGRldiwgZmlsZSwKLQkJCSAgICAgICBkZXYtPmludmFsaWRhdGVfZG9tYWlucywKLQkJCSAgICAgICBkZXYtPmZsdXNoX2RvbWFpbnMsCi0JCQkgICAgICAgZGV2X3ByaXYtPm1tLmZsdXNoX3JpbmdzKTsKLQl9Ci0KLQlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotCQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqID0gdG9faW50ZWxfYm8ob2JqZWN0c1tpXSk7Ci0JCS8qIFhYWCByZXBsYWNlIHdpdGggc2VtYXBob3JlcyAqLwotCQlpZiAob2JqLT5yaW5nICYmIHJpbmcgIT0gb2JqLT5yaW5nKSB7Ci0JCQlyZXQgPSBpOTE1X2dlbV9vYmplY3Rfd2FpdF9yZW5kZXJpbmcoJm9iai0+YmFzZSwgdHJ1ZSk7Ci0JCQlpZiAocmV0KQotCQkJCXJldHVybiByZXQ7Ci0JCX0KLQl9CisJCQkJCSAgICBvYmotPmJhc2Uud3JpdGVfZG9tYWluKTsKIAogCXJldHVybiAwOwogfQpAQCAtMzY5NCwyMCArMzE1NSwyMSBAQAogCQlyZXR1cm4gMDsKIAogCXJldCA9IDA7Ci0JaWYgKCFpOTE1X3NlcW5vX3Bhc3NlZChyaW5nLT5nZXRfc2Vxbm8oZGV2LCByaW5nKSwgc2Vxbm8pKSB7CisJaWYgKCFpOTE1X3NlcW5vX3Bhc3NlZChyaW5nLT5nZXRfc2Vxbm8ocmluZyksIHNlcW5vKSkgewogCQkvKiBBbmQgd2FpdCBmb3IgdGhlIHNlcW5vIHBhc3Npbmcgd2l0aG91dCBob2xkaW5nIGFueSBsb2NrcyBhbmQKIAkJICogY2F1c2luZyBleHRyYSBsYXRlbmN5IGZvciBvdGhlcnMuIFRoaXMgaXMgc2FmZSBhcyB0aGUgaXJxCiAJCSAqIGdlbmVyYXRpb24gaXMgZGVzaWduZWQgdG8gYmUgcnVuIGF0b21pY2FsbHkgYW5kIHNvIGlzCiAJCSAqIGxvY2tsZXNzLgogCQkgKi8KLQkJcmluZy0+dXNlcl9pcnFfZ2V0KGRldiwgcmluZyk7Ci0JCXJldCA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShyaW5nLT5pcnFfcXVldWUsCi0JCQkJCSAgICAgICBpOTE1X3NlcW5vX3Bhc3NlZChyaW5nLT5nZXRfc2Vxbm8oZGV2LCByaW5nKSwgc2Vxbm8pCi0JCQkJCSAgICAgICB8fCBhdG9taWNfcmVhZCgmZGV2X3ByaXYtPm1tLndlZGdlZCkpOwotCQlyaW5nLT51c2VyX2lycV9wdXQoZGV2LCByaW5nKTsKKwkJaWYgKHJpbmctPmlycV9nZXQocmluZykpIHsKKwkJCXJldCA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShyaW5nLT5pcnFfcXVldWUsCisJCQkJCQkgICAgICAgaTkxNV9zZXFub19wYXNzZWQocmluZy0+Z2V0X3NlcW5vKHJpbmcpLCBzZXFubykKKwkJCQkJCSAgICAgICB8fCBhdG9taWNfcmVhZCgmZGV2X3ByaXYtPm1tLndlZGdlZCkpOworCQkJcmluZy0+aXJxX3B1dChyaW5nKTsKIAotCQlpZiAocmV0ID09IDAgJiYgYXRvbWljX3JlYWQoJmRldl9wcml2LT5tbS53ZWRnZWQpKQotCQkJcmV0ID0gLUVJTzsKKwkJCWlmIChyZXQgPT0gMCAmJiBhdG9taWNfcmVhZCgmZGV2X3ByaXYtPm1tLndlZGdlZCkpCisJCQkJcmV0ID0gLUVJTzsKKwkJfQogCX0KIAogCWlmIChyZXQgPT0gMCkKQEAgLTM3MTYsNTc3ICszMTc4LDEwNiBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQKLWk5MTVfZ2VtX2NoZWNrX2V4ZWNidWZmZXIoc3RydWN0IGRybV9pOTE1X2dlbV9leGVjYnVmZmVyMiAqZXhlYywKLQkJCSAgdWludDY0X3QgZXhlY19vZmZzZXQpCi17Ci0JdWludDMyX3QgZXhlY19zdGFydCwgZXhlY19sZW47Ci0KLQlleGVjX3N0YXJ0ID0gKHVpbnQzMl90KSBleGVjX29mZnNldCArIGV4ZWMtPmJhdGNoX3N0YXJ0X29mZnNldDsKLQlleGVjX2xlbiA9ICh1aW50MzJfdCkgZXhlYy0+YmF0Y2hfbGVuOwotCi0JaWYgKChleGVjX3N0YXJ0IHwgZXhlY19sZW4pICYgMHg3KQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmICghZXhlY19zdGFydCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludAotdmFsaWRhdGVfZXhlY19saXN0KHN0cnVjdCBkcm1faTkxNV9nZW1fZXhlY19vYmplY3QyICpleGVjLAotCQkgICBpbnQgY291bnQpCi17Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotCQljaGFyIF9fdXNlciAqcHRyID0gKGNoYXIgX191c2VyICopKHVpbnRwdHJfdClleGVjW2ldLnJlbG9jc19wdHI7Ci0JCWludCBsZW5ndGg7IC8qIGxpbWl0ZWQgYnkgZmF1bHRfaW5fcGFnZXNfcmVhZGFibGUoKSAqLwotCi0JCS8qIEZpcnN0IGNoZWNrIGZvciBtYWxpY2lvdXMgaW5wdXQgY2F1c2luZyBvdmVyZmxvdyAqLwotCQlpZiAoZXhlY1tpXS5yZWxvY2F0aW9uX2NvdW50ID4KLQkJICAgIElOVF9NQVggLyBzaXplb2Yoc3RydWN0IGRybV9pOTE1X2dlbV9yZWxvY2F0aW9uX2VudHJ5KSkKLQkJCXJldHVybiAtRUlOVkFMOwotCi0JCWxlbmd0aCA9IGV4ZWNbaV0ucmVsb2NhdGlvbl9jb3VudCAqCi0JCQlzaXplb2Yoc3RydWN0IGRybV9pOTE1X2dlbV9yZWxvY2F0aW9uX2VudHJ5KTsKLQkJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIHB0ciwgbGVuZ3RoKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCi0JCS8qIHdlIG1heSBhbHNvIG5lZWQgdG8gdXBkYXRlIHRoZSBwcmVzdW1lZCBvZmZzZXRzICovCi0JCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgcHRyLCBsZW5ndGgpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQkJaWYgKGZhdWx0X2luX3BhZ2VzX3JlYWRhYmxlKHB0ciwgbGVuZ3RoKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50Ci1pOTE1X2dlbV9kb19leGVjYnVmZmVyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEsCi0JCSAgICAgICBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGUsCi0JCSAgICAgICBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX2V4ZWNidWZmZXIyICphcmdzLAotCQkgICAgICAgc3RydWN0IGRybV9pOTE1X2dlbV9leGVjX29iamVjdDIgKmV4ZWNfbGlzdCkKLXsKLQlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKipvYmplY3RfbGlzdCA9IE5VTEw7Ci0Jc3RydWN0IGRybV9nZW1fb2JqZWN0ICpiYXRjaF9vYmo7Ci0Jc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9ial9wcml2OwotCXN0cnVjdCBkcm1fY2xpcF9yZWN0ICpjbGlwcmVjdHMgPSBOVUxMOwotCXN0cnVjdCBkcm1faTkxNV9nZW1fcmVxdWVzdCAqcmVxdWVzdCA9IE5VTEw7Ci0JaW50IHJldCwgaSwgZmxpcHM7Ci0JdWludDY0X3QgZXhlY19vZmZzZXQ7Ci0KLQlzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcgPSBOVUxMOwotCi0JcmV0ID0gaTkxNV9nZW1fY2hlY2tfaXNfd2VkZ2VkKGRldik7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCXJldCA9IHZhbGlkYXRlX2V4ZWNfbGlzdChleGVjX2xpc3QsIGFyZ3MtPmJ1ZmZlcl9jb3VudCk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotI2lmIFdBVENIX0VYRUMKLQlEUk1fSU5GTygiYnVmZmVyc19wdHIgJWQgYnVmZmVyX2NvdW50ICVkIGxlbiAlMDh4XG4iLAotCQkgIChpbnQpIGFyZ3MtPmJ1ZmZlcnNfcHRyLCBhcmdzLT5idWZmZXJfY291bnQsIGFyZ3MtPmJhdGNoX2xlbik7Ci0jZW5kaWYKLQlzd2l0Y2ggKGFyZ3MtPmZsYWdzICYgSTkxNV9FWEVDX1JJTkdfTUFTSykgewotCWNhc2UgSTkxNV9FWEVDX0RFRkFVTFQ6Ci0JY2FzZSBJOTE1X0VYRUNfUkVOREVSOgotCQlyaW5nID0gJmRldl9wcml2LT5yZW5kZXJfcmluZzsKLQkJYnJlYWs7Ci0JY2FzZSBJOTE1X0VYRUNfQlNEOgotCQlpZiAoIUhBU19CU0QoZGV2KSkgewotCQkJRFJNX0VSUk9SKCJleGVjYnVmIHdpdGggaW52YWxpZCByaW5nIChCU0QpXG4iKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0JCXJpbmcgPSAmZGV2X3ByaXYtPmJzZF9yaW5nOwotCQlicmVhazsKLQljYXNlIEk5MTVfRVhFQ19CTFQ6Ci0JCWlmICghSEFTX0JMVChkZXYpKSB7Ci0JCQlEUk1fRVJST1IoImV4ZWNidWYgd2l0aCBpbnZhbGlkIHJpbmcgKEJMVClcbiIpOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQkJcmluZyA9ICZkZXZfcHJpdi0+Ymx0X3Jpbmc7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCURSTV9FUlJPUigiZXhlY2J1ZiB3aXRoIHVua25vd24gcmluZzogJWRcbiIsCi0JCQkgIChpbnQpKGFyZ3MtPmZsYWdzICYgSTkxNV9FWEVDX1JJTkdfTUFTSykpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlpZiAoYXJncy0+YnVmZmVyX2NvdW50IDwgMSkgewotCQlEUk1fRVJST1IoImV4ZWNidWYgd2l0aCAlZCBidWZmZXJzXG4iLCBhcmdzLT5idWZmZXJfY291bnQpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0Jb2JqZWN0X2xpc3QgPSBkcm1fbWFsbG9jX2FiKHNpemVvZigqb2JqZWN0X2xpc3QpLCBhcmdzLT5idWZmZXJfY291bnQpOwotCWlmIChvYmplY3RfbGlzdCA9PSBOVUxMKSB7Ci0JCURSTV9FUlJPUigiRmFpbGVkIHRvIGFsbG9jYXRlIG9iamVjdCBsaXN0IGZvciAlZCBidWZmZXJzXG4iLAotCQkJICBhcmdzLT5idWZmZXJfY291bnQpOwotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIHByZV9tdXRleF9lcnI7Ci0JfQotCi0JaWYgKGFyZ3MtPm51bV9jbGlwcmVjdHMgIT0gMCkgewotCQljbGlwcmVjdHMgPSBrY2FsbG9jKGFyZ3MtPm51bV9jbGlwcmVjdHMsIHNpemVvZigqY2xpcHJlY3RzKSwKLQkJCQkgICAgR0ZQX0tFUk5FTCk7Ci0JCWlmIChjbGlwcmVjdHMgPT0gTlVMTCkgewotCQkJcmV0ID0gLUVOT01FTTsKLQkJCWdvdG8gcHJlX211dGV4X2VycjsKLQkJfQotCi0JCXJldCA9IGNvcHlfZnJvbV91c2VyKGNsaXByZWN0cywKLQkJCQkgICAgIChzdHJ1Y3QgZHJtX2NsaXBfcmVjdCBfX3VzZXIgKikKLQkJCQkgICAgICh1aW50cHRyX3QpIGFyZ3MtPmNsaXByZWN0c19wdHIsCi0JCQkJICAgICBzaXplb2YoKmNsaXByZWN0cykgKiBhcmdzLT5udW1fY2xpcHJlY3RzKTsKLQkJaWYgKHJldCAhPSAwKSB7Ci0JCQlEUk1fRVJST1IoImNvcHkgJWQgY2xpcHJlY3RzIGZhaWxlZDogJWRcbiIsCi0JCQkJICBhcmdzLT5udW1fY2xpcHJlY3RzLCByZXQpOwotCQkJcmV0ID0gLUVGQVVMVDsKLQkJCWdvdG8gcHJlX211dGV4X2VycjsKLQkJfQotCX0KLQotCXJlcXVlc3QgPSBremFsbG9jKHNpemVvZigqcmVxdWVzdCksIEdGUF9LRVJORUwpOwotCWlmIChyZXF1ZXN0ID09IE5VTEwpIHsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBwcmVfbXV0ZXhfZXJyOwotCX0KLQotCXJldCA9IGk5MTVfbXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKGRldik7Ci0JaWYgKHJldCkKLQkJZ290byBwcmVfbXV0ZXhfZXJyOwotCi0JaWYgKGRldl9wcml2LT5tbS5zdXNwZW5kZWQpIHsKLQkJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7Ci0JCXJldCA9IC1FQlVTWTsKLQkJZ290byBwcmVfbXV0ZXhfZXJyOwotCX0KLQotCS8qIExvb2sgdXAgb2JqZWN0IGhhbmRsZXMgKi8KLQlmb3IgKGkgPSAwOyBpIDwgYXJncy0+YnVmZmVyX2NvdW50OyBpKyspIHsKLQkJb2JqZWN0X2xpc3RbaV0gPSBkcm1fZ2VtX29iamVjdF9sb29rdXAoZGV2LCBmaWxlLAotCQkJCQkJICAgICAgIGV4ZWNfbGlzdFtpXS5oYW5kbGUpOwotCQlpZiAob2JqZWN0X2xpc3RbaV0gPT0gTlVMTCkgewotCQkJRFJNX0VSUk9SKCJJbnZhbGlkIG9iamVjdCBoYW5kbGUgJWQgYXQgaW5kZXggJWRcbiIsCi0JCQkJICAgZXhlY19saXN0W2ldLmhhbmRsZSwgaSk7Ci0JCQkvKiBwcmV2ZW50IGVycm9yIHBhdGggZnJvbSByZWFkaW5nIHVuaW5pdGlhbGl6ZWQgZGF0YSAqLwotCQkJYXJncy0+YnVmZmVyX2NvdW50ID0gaSArIDE7Ci0JCQlyZXQgPSAtRU5PRU5UOwotCQkJZ290byBlcnI7Ci0JCX0KLQotCQlvYmpfcHJpdiA9IHRvX2ludGVsX2JvKG9iamVjdF9saXN0W2ldKTsKLQkJaWYgKG9ial9wcml2LT5pbl9leGVjYnVmZmVyKSB7Ci0JCQlEUk1fRVJST1IoIk9iamVjdCAlcCBhcHBlYXJzIG1vcmUgdGhhbiBvbmNlIGluIG9iamVjdCBsaXN0XG4iLAotCQkJCSAgIG9iamVjdF9saXN0W2ldKTsKLQkJCS8qIHByZXZlbnQgZXJyb3IgcGF0aCBmcm9tIHJlYWRpbmcgdW5pbml0aWFsaXplZCBkYXRhICovCi0JCQlhcmdzLT5idWZmZXJfY291bnQgPSBpICsgMTsKLQkJCXJldCA9IC1FSU5WQUw7Ci0JCQlnb3RvIGVycjsKLQkJfQotCQlvYmpfcHJpdi0+aW5fZXhlY2J1ZmZlciA9IHRydWU7Ci0JfQotCi0JLyogTW92ZSB0aGUgb2JqZWN0cyBlbi1tYXNzZSBpbnRvIHRoZSBHVFQsIGV2aWN0aW5nIGlmIG5lY2Vzc2FyeS4gKi8KLQlyZXQgPSBpOTE1X2dlbV9leGVjYnVmZmVyX3Jlc2VydmUoZGV2LCBmaWxlLAotCQkJCQkgIG9iamVjdF9saXN0LCBleGVjX2xpc3QsCi0JCQkJCSAgYXJncy0+YnVmZmVyX2NvdW50KTsKLQlpZiAocmV0KQotCQlnb3RvIGVycjsKLQotCS8qIFRoZSBvYmplY3RzIGFyZSBpbiB0aGVpciBmaW5hbCBsb2NhdGlvbnMsIGFwcGx5IHRoZSByZWxvY2F0aW9ucy4gKi8KLQlyZXQgPSBpOTE1X2dlbV9leGVjYnVmZmVyX3JlbG9jYXRlKGRldiwgZmlsZSwKLQkJCQkJICAgb2JqZWN0X2xpc3QsIGV4ZWNfbGlzdCwKLQkJCQkJICAgYXJncy0+YnVmZmVyX2NvdW50KTsKLQlpZiAocmV0KSB7Ci0JCWlmIChyZXQgPT0gLUVGQVVMVCkgewotCQkJcmV0ID0gaTkxNV9nZW1fZXhlY2J1ZmZlcl9yZWxvY2F0ZV9zbG93KGRldiwgZmlsZSwKLQkJCQkJCQkJb2JqZWN0X2xpc3QsCi0JCQkJCQkJCWV4ZWNfbGlzdCwKLQkJCQkJCQkJYXJncy0+YnVmZmVyX2NvdW50KTsKLQkJCUJVR19PTighbXV0ZXhfaXNfbG9ja2VkKCZkZXYtPnN0cnVjdF9tdXRleCkpOwotCQl9Ci0JCWlmIChyZXQpCi0JCQlnb3RvIGVycjsKLQl9Ci0KLQkvKiBTZXQgdGhlIHBlbmRpbmcgcmVhZCBkb21haW5zIGZvciB0aGUgYmF0Y2ggYnVmZmVyIHRvIENPTU1BTkQgKi8KLQliYXRjaF9vYmogPSBvYmplY3RfbGlzdFthcmdzLT5idWZmZXJfY291bnQtMV07Ci0JaWYgKGJhdGNoX29iai0+cGVuZGluZ193cml0ZV9kb21haW4pIHsKLQkJRFJNX0VSUk9SKCJBdHRlbXB0aW5nIHRvIHVzZSBzZWxmLW1vZGlmeWluZyBiYXRjaCBidWZmZXJcbiIpOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGVycjsKLQl9Ci0JYmF0Y2hfb2JqLT5wZW5kaW5nX3JlYWRfZG9tYWlucyB8PSBJOTE1X0dFTV9ET01BSU5fQ09NTUFORDsKLQotCS8qIFNhbml0eSBjaGVjayB0aGUgYmF0Y2ggYnVmZmVyICovCi0JZXhlY19vZmZzZXQgPSB0b19pbnRlbF9ibyhiYXRjaF9vYmopLT5ndHRfb2Zmc2V0OwotCXJldCA9IGk5MTVfZ2VtX2NoZWNrX2V4ZWNidWZmZXIoYXJncywgZXhlY19vZmZzZXQpOwotCWlmIChyZXQgIT0gMCkgewotCQlEUk1fRVJST1IoImV4ZWNidWYgd2l0aCBpbnZhbGlkIG9mZnNldC9sZW5ndGhcbiIpOwotCQlnb3RvIGVycjsKLQl9Ci0KLQlyZXQgPSBpOTE1X2dlbV9leGVjYnVmZmVyX21vdmVfdG9fZ3B1KGRldiwgZmlsZSwgcmluZywKLQkJCQkJICAgICAgb2JqZWN0X2xpc3QsIGFyZ3MtPmJ1ZmZlcl9jb3VudCk7Ci0JaWYgKHJldCkKLQkJZ290byBlcnI7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgYXJncy0+YnVmZmVyX2NvdW50OyBpKyspIHsKLQkJc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmogPSBvYmplY3RfbGlzdFtpXTsKLQkJdWludDMyX3Qgb2xkX3dyaXRlX2RvbWFpbiA9IG9iai0+d3JpdGVfZG9tYWluOwotCQlvYmotPndyaXRlX2RvbWFpbiA9IG9iai0+cGVuZGluZ193cml0ZV9kb21haW47Ci0JCXRyYWNlX2k5MTVfZ2VtX29iamVjdF9jaGFuZ2VfZG9tYWluKG9iaiwKLQkJCQkJCSAgICBvYmotPnJlYWRfZG9tYWlucywKLQkJCQkJCSAgICBvbGRfd3JpdGVfZG9tYWluKTsKLQl9Ci0KLSNpZiBXQVRDSF9DT0hFUkVOQ1kKLQlmb3IgKGkgPSAwOyBpIDwgYXJncy0+YnVmZmVyX2NvdW50OyBpKyspIHsKLQkJaTkxNV9nZW1fb2JqZWN0X2NoZWNrX2NvaGVyZW5jeShvYmplY3RfbGlzdFtpXSwKLQkJCQkJCWV4ZWNfbGlzdFtpXS5oYW5kbGUpOwotCX0KLSNlbmRpZgotCi0jaWYgV0FUQ0hfRVhFQwotCWk5MTVfZ2VtX2R1bXBfb2JqZWN0KGJhdGNoX29iaiwKLQkJCSAgICAgIGFyZ3MtPmJhdGNoX2xlbiwKLQkJCSAgICAgIF9fZnVuY19fLAotCQkJICAgICAgfjApOwotI2VuZGlmCi0KLQkvKiBDaGVjayBmb3IgYW55IHBlbmRpbmcgZmxpcHMuIEFzIHdlIG9ubHkgbWFpbnRhaW4gYSBmbGlwIHF1ZXVlIGRlcHRoCi0JICogb2YgMSwgd2UgY2FuIHNpbXBseSBpbnNlcnQgYSBXQUlUIGZvciB0aGUgbmV4dCBkaXNwbGF5IGZsaXAgcHJpb3IKLQkgKiB0byBleGVjdXRpbmcgdGhlIGJhdGNoIGFuZCBhdm9pZCBzdGFsbGluZyB0aGUgQ1BVLgotCSAqLwotCWZsaXBzID0gMDsKLQlmb3IgKGkgPSAwOyBpIDwgYXJncy0+YnVmZmVyX2NvdW50OyBpKyspIHsKLQkJaWYgKG9iamVjdF9saXN0W2ldLT53cml0ZV9kb21haW4pCi0JCQlmbGlwcyB8PSBhdG9taWNfcmVhZCgmdG9faW50ZWxfYm8ob2JqZWN0X2xpc3RbaV0pLT5wZW5kaW5nX2ZsaXApOwotCX0KLQlpZiAoZmxpcHMpIHsKLQkJaW50IHBsYW5lLCBmbGlwX21hc2s7Ci0KLQkJZm9yIChwbGFuZSA9IDA7IGZsaXBzID4+IHBsYW5lOyBwbGFuZSsrKSB7Ci0JCQlpZiAoKChmbGlwcyA+PiBwbGFuZSkgJiAxKSA9PSAwKQotCQkJCWNvbnRpbnVlOwotCi0JCQlpZiAocGxhbmUpCi0JCQkJZmxpcF9tYXNrID0gTUlfV0FJVF9GT1JfUExBTkVfQl9GTElQOwotCQkJZWxzZQotCQkJCWZsaXBfbWFzayA9IE1JX1dBSVRfRk9SX1BMQU5FX0FfRkxJUDsKLQotCQkJaW50ZWxfcmluZ19iZWdpbihkZXYsIHJpbmcsIDIpOwotCQkJaW50ZWxfcmluZ19lbWl0KGRldiwgcmluZywKLQkJCQkJTUlfV0FJVF9GT1JfRVZFTlQgfCBmbGlwX21hc2spOwotCQkJaW50ZWxfcmluZ19lbWl0KGRldiwgcmluZywgTUlfTk9PUCk7Ci0JCQlpbnRlbF9yaW5nX2FkdmFuY2UoZGV2LCByaW5nKTsKLQkJfQotCX0KLQotCS8qIEV4ZWMgdGhlIGJhdGNoYnVmZmVyICovCi0JcmV0ID0gcmluZy0+ZGlzcGF0Y2hfZ2VtX2V4ZWNidWZmZXIoZGV2LCByaW5nLCBhcmdzLAotCQkJCQkgICAgY2xpcHJlY3RzLCBleGVjX29mZnNldCk7Ci0JaWYgKHJldCkgewotCQlEUk1fRVJST1IoImRpc3BhdGNoIGZhaWxlZCAlZFxuIiwgcmV0KTsKLQkJZ290byBlcnI7Ci0JfQotCi0JLyoKLQkgKiBFbnN1cmUgdGhhdCB0aGUgY29tbWFuZHMgaW4gdGhlIGJhdGNoIGJ1ZmZlciBhcmUKLQkgKiBmaW5pc2hlZCBiZWZvcmUgdGhlIGludGVycnVwdCBmaXJlcwotCSAqLwotCWk5MTVfcmV0aXJlX2NvbW1hbmRzKGRldiwgcmluZyk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgYXJncy0+YnVmZmVyX2NvdW50OyBpKyspIHsKLQkJc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmogPSBvYmplY3RfbGlzdFtpXTsKLQotCQlpOTE1X2dlbV9vYmplY3RfbW92ZV90b19hY3RpdmUob2JqLCByaW5nKTsKLQkJaWYgKG9iai0+d3JpdGVfZG9tYWluKQotCQkJbGlzdF9tb3ZlX3RhaWwoJnRvX2ludGVsX2JvKG9iaiktPmdwdV93cml0ZV9saXN0LAotCQkJCSAgICAgICAmcmluZy0+Z3B1X3dyaXRlX2xpc3QpOwotCX0KLQotCWk5MTVfYWRkX3JlcXVlc3QoZGV2LCBmaWxlLCByZXF1ZXN0LCByaW5nKTsKLQlyZXF1ZXN0ID0gTlVMTDsKLQotZXJyOgotCWZvciAoaSA9IDA7IGkgPCBhcmdzLT5idWZmZXJfY291bnQ7IGkrKykgewotCQlpZiAob2JqZWN0X2xpc3RbaV0pIHsKLQkJCW9ial9wcml2ID0gdG9faW50ZWxfYm8ob2JqZWN0X2xpc3RbaV0pOwotCQkJb2JqX3ByaXYtPmluX2V4ZWNidWZmZXIgPSBmYWxzZTsKLQkJfQotCQlkcm1fZ2VtX29iamVjdF91bnJlZmVyZW5jZShvYmplY3RfbGlzdFtpXSk7Ci0JfQotCi0JbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7Ci0KLXByZV9tdXRleF9lcnI6Ci0JZHJtX2ZyZWVfbGFyZ2Uob2JqZWN0X2xpc3QpOwotCWtmcmVlKGNsaXByZWN0cyk7Ci0Ja2ZyZWUocmVxdWVzdCk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi0vKgotICogTGVnYWN5IGV4ZWNidWZmZXIganVzdCBjcmVhdGVzIGFuIGV4ZWMyIGxpc3QgZnJvbSB0aGUgb3JpZ2luYWwgZXhlYyBvYmplY3QKLSAqIGxpc3QgYXJyYXkgYW5kIHBhc3NlcyBpdCB0byB0aGUgcmVhbCBmdW5jdGlvbi4KLSAqLwogaW50Ci1pOTE1X2dlbV9leGVjYnVmZmVyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEsCi0JCSAgICBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdikKK2k5MTVfZ2VtX29iamVjdF9waW4oc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaiwKKwkJICAgIHVpbnQzMl90IGFsaWdubWVudCwKKwkJICAgIGJvb2wgbWFwX2FuZF9mZW5jZWFibGUpCiB7Ci0Jc3RydWN0IGRybV9pOTE1X2dlbV9leGVjYnVmZmVyICphcmdzID0gZGF0YTsKLQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX2V4ZWNidWZmZXIyIGV4ZWMyOwotCXN0cnVjdCBkcm1faTkxNV9nZW1fZXhlY19vYmplY3QgKmV4ZWNfbGlzdCA9IE5VTEw7Ci0Jc3RydWN0IGRybV9pOTE1X2dlbV9leGVjX29iamVjdDIgKmV4ZWMyX2xpc3QgPSBOVUxMOwotCWludCByZXQsIGk7Ci0KLSNpZiBXQVRDSF9FWEVDCi0JRFJNX0lORk8oImJ1ZmZlcnNfcHRyICVkIGJ1ZmZlcl9jb3VudCAlZCBsZW4gJTA4eFxuIiwKLQkJICAoaW50KSBhcmdzLT5idWZmZXJzX3B0ciwgYXJncy0+YnVmZmVyX2NvdW50LCBhcmdzLT5iYXRjaF9sZW4pOwotI2VuZGlmCi0KLQlpZiAoYXJncy0+YnVmZmVyX2NvdW50IDwgMSkgewotCQlEUk1fRVJST1IoImV4ZWNidWYgd2l0aCAlZCBidWZmZXJzXG4iLCBhcmdzLT5idWZmZXJfY291bnQpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQkvKiBDb3B5IGluIHRoZSBleGVjIGxpc3QgZnJvbSB1c2VybGFuZCAqLwotCWV4ZWNfbGlzdCA9IGRybV9tYWxsb2NfYWIoc2l6ZW9mKCpleGVjX2xpc3QpLCBhcmdzLT5idWZmZXJfY291bnQpOwotCWV4ZWMyX2xpc3QgPSBkcm1fbWFsbG9jX2FiKHNpemVvZigqZXhlYzJfbGlzdCksIGFyZ3MtPmJ1ZmZlcl9jb3VudCk7Ci0JaWYgKGV4ZWNfbGlzdCA9PSBOVUxMIHx8IGV4ZWMyX2xpc3QgPT0gTlVMTCkgewotCQlEUk1fRVJST1IoIkZhaWxlZCB0byBhbGxvY2F0ZSBleGVjIGxpc3QgZm9yICVkIGJ1ZmZlcnNcbiIsCi0JCQkgIGFyZ3MtPmJ1ZmZlcl9jb3VudCk7Ci0JCWRybV9mcmVlX2xhcmdlKGV4ZWNfbGlzdCk7Ci0JCWRybV9mcmVlX2xhcmdlKGV4ZWMyX2xpc3QpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0JcmV0ID0gY29weV9mcm9tX3VzZXIoZXhlY19saXN0LAotCQkJICAgICAoc3RydWN0IGRybV9pOTE1X3JlbG9jYXRpb25fZW50cnkgX191c2VyICopCi0JCQkgICAgICh1aW50cHRyX3QpIGFyZ3MtPmJ1ZmZlcnNfcHRyLAotCQkJICAgICBzaXplb2YoKmV4ZWNfbGlzdCkgKiBhcmdzLT5idWZmZXJfY291bnQpOwotCWlmIChyZXQgIT0gMCkgewotCQlEUk1fRVJST1IoImNvcHkgJWQgZXhlYyBlbnRyaWVzIGZhaWxlZCAlZFxuIiwKLQkJCSAgYXJncy0+YnVmZmVyX2NvdW50LCByZXQpOwotCQlkcm1fZnJlZV9sYXJnZShleGVjX2xpc3QpOwotCQlkcm1fZnJlZV9sYXJnZShleGVjMl9saXN0KTsKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JfQotCi0JZm9yIChpID0gMDsgaSA8IGFyZ3MtPmJ1ZmZlcl9jb3VudDsgaSsrKSB7Ci0JCWV4ZWMyX2xpc3RbaV0uaGFuZGxlID0gZXhlY19saXN0W2ldLmhhbmRsZTsKLQkJZXhlYzJfbGlzdFtpXS5yZWxvY2F0aW9uX2NvdW50ID0gZXhlY19saXN0W2ldLnJlbG9jYXRpb25fY291bnQ7Ci0JCWV4ZWMyX2xpc3RbaV0ucmVsb2NzX3B0ciA9IGV4ZWNfbGlzdFtpXS5yZWxvY3NfcHRyOwotCQlleGVjMl9saXN0W2ldLmFsaWdubWVudCA9IGV4ZWNfbGlzdFtpXS5hbGlnbm1lbnQ7Ci0JCWV4ZWMyX2xpc3RbaV0ub2Zmc2V0ID0gZXhlY19saXN0W2ldLm9mZnNldDsKLQkJaWYgKElOVEVMX0lORk8oZGV2KS0+Z2VuIDwgNCkKLQkJCWV4ZWMyX2xpc3RbaV0uZmxhZ3MgPSBFWEVDX09CSkVDVF9ORUVEU19GRU5DRTsKLQkJZWxzZQotCQkJZXhlYzJfbGlzdFtpXS5mbGFncyA9IDA7Ci0JfQotCi0JZXhlYzIuYnVmZmVyc19wdHIgPSBhcmdzLT5idWZmZXJzX3B0cjsKLQlleGVjMi5idWZmZXJfY291bnQgPSBhcmdzLT5idWZmZXJfY291bnQ7Ci0JZXhlYzIuYmF0Y2hfc3RhcnRfb2Zmc2V0ID0gYXJncy0+YmF0Y2hfc3RhcnRfb2Zmc2V0OwotCWV4ZWMyLmJhdGNoX2xlbiA9IGFyZ3MtPmJhdGNoX2xlbjsKLQlleGVjMi5EUjEgPSBhcmdzLT5EUjE7Ci0JZXhlYzIuRFI0ID0gYXJncy0+RFI0OwotCWV4ZWMyLm51bV9jbGlwcmVjdHMgPSBhcmdzLT5udW1fY2xpcHJlY3RzOwotCWV4ZWMyLmNsaXByZWN0c19wdHIgPSBhcmdzLT5jbGlwcmVjdHNfcHRyOwotCWV4ZWMyLmZsYWdzID0gSTkxNV9FWEVDX1JFTkRFUjsKLQotCXJldCA9IGk5MTVfZ2VtX2RvX2V4ZWNidWZmZXIoZGV2LCBkYXRhLCBmaWxlX3ByaXYsICZleGVjMiwgZXhlYzJfbGlzdCk7Ci0JaWYgKCFyZXQpIHsKLQkJLyogQ29weSB0aGUgbmV3IGJ1ZmZlciBvZmZzZXRzIGJhY2sgdG8gdGhlIHVzZXIncyBleGVjIGxpc3QuICovCi0JCWZvciAoaSA9IDA7IGkgPCBhcmdzLT5idWZmZXJfY291bnQ7IGkrKykKLQkJCWV4ZWNfbGlzdFtpXS5vZmZzZXQgPSBleGVjMl9saXN0W2ldLm9mZnNldDsKLQkJLyogLi4uIGFuZCBiYWNrIG91dCB0byB1c2Vyc3BhY2UgKi8KLQkJcmV0ID0gY29weV90b191c2VyKChzdHJ1Y3QgZHJtX2k5MTVfcmVsb2NhdGlvbl9lbnRyeSBfX3VzZXIgKikKLQkJCQkgICAodWludHB0cl90KSBhcmdzLT5idWZmZXJzX3B0ciwKLQkJCQkgICBleGVjX2xpc3QsCi0JCQkJICAgc2l6ZW9mKCpleGVjX2xpc3QpICogYXJncy0+YnVmZmVyX2NvdW50KTsKLQkJaWYgKHJldCkgewotCQkJcmV0ID0gLUVGQVVMVDsKLQkJCURSTV9FUlJPUigiZmFpbGVkIHRvIGNvcHkgJWQgZXhlYyBlbnRyaWVzICIKLQkJCQkgICJiYWNrIHRvIHVzZXIgKCVkKVxuIiwKLQkJCQkgIGFyZ3MtPmJ1ZmZlcl9jb3VudCwgcmV0KTsKLQkJfQotCX0KLQotCWRybV9mcmVlX2xhcmdlKGV4ZWNfbGlzdCk7Ci0JZHJtX2ZyZWVfbGFyZ2UoZXhlYzJfbGlzdCk7Ci0JcmV0dXJuIHJldDsKLX0KLQotaW50Ci1pOTE1X2dlbV9leGVjYnVmZmVyMihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB2b2lkICpkYXRhLAotCQkgICAgIHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2KQotewotCXN0cnVjdCBkcm1faTkxNV9nZW1fZXhlY2J1ZmZlcjIgKmFyZ3MgPSBkYXRhOwotCXN0cnVjdCBkcm1faTkxNV9nZW1fZXhlY19vYmplY3QyICpleGVjMl9saXN0ID0gTlVMTDsKLQlpbnQgcmV0OwotCi0jaWYgV0FUQ0hfRVhFQwotCURSTV9JTkZPKCJidWZmZXJzX3B0ciAlZCBidWZmZXJfY291bnQgJWQgbGVuICUwOHhcbiIsCi0JCSAgKGludCkgYXJncy0+YnVmZmVyc19wdHIsIGFyZ3MtPmJ1ZmZlcl9jb3VudCwgYXJncy0+YmF0Y2hfbGVuKTsKLSNlbmRpZgotCi0JaWYgKGFyZ3MtPmJ1ZmZlcl9jb3VudCA8IDEpIHsKLQkJRFJNX0VSUk9SKCJleGVjYnVmMiB3aXRoICVkIGJ1ZmZlcnNcbiIsIGFyZ3MtPmJ1ZmZlcl9jb3VudCk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWV4ZWMyX2xpc3QgPSBkcm1fbWFsbG9jX2FiKHNpemVvZigqZXhlYzJfbGlzdCksIGFyZ3MtPmJ1ZmZlcl9jb3VudCk7Ci0JaWYgKGV4ZWMyX2xpc3QgPT0gTlVMTCkgewotCQlEUk1fRVJST1IoIkZhaWxlZCB0byBhbGxvY2F0ZSBleGVjIGxpc3QgZm9yICVkIGJ1ZmZlcnNcbiIsCi0JCQkgIGFyZ3MtPmJ1ZmZlcl9jb3VudCk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQlyZXQgPSBjb3B5X2Zyb21fdXNlcihleGVjMl9saXN0LAotCQkJICAgICAoc3RydWN0IGRybV9pOTE1X3JlbG9jYXRpb25fZW50cnkgX191c2VyICopCi0JCQkgICAgICh1aW50cHRyX3QpIGFyZ3MtPmJ1ZmZlcnNfcHRyLAotCQkJICAgICBzaXplb2YoKmV4ZWMyX2xpc3QpICogYXJncy0+YnVmZmVyX2NvdW50KTsKLQlpZiAocmV0ICE9IDApIHsKLQkJRFJNX0VSUk9SKCJjb3B5ICVkIGV4ZWMgZW50cmllcyBmYWlsZWQgJWRcbiIsCi0JCQkgIGFyZ3MtPmJ1ZmZlcl9jb3VudCwgcmV0KTsKLQkJZHJtX2ZyZWVfbGFyZ2UoZXhlYzJfbGlzdCk7Ci0JCXJldHVybiAtRUZBVUxUOwotCX0KLQotCXJldCA9IGk5MTVfZ2VtX2RvX2V4ZWNidWZmZXIoZGV2LCBkYXRhLCBmaWxlX3ByaXYsIGFyZ3MsIGV4ZWMyX2xpc3QpOwotCWlmICghcmV0KSB7Ci0JCS8qIENvcHkgdGhlIG5ldyBidWZmZXIgb2Zmc2V0cyBiYWNrIHRvIHRoZSB1c2VyJ3MgZXhlYyBsaXN0LiAqLwotCQlyZXQgPSBjb3B5X3RvX3VzZXIoKHN0cnVjdCBkcm1faTkxNV9yZWxvY2F0aW9uX2VudHJ5IF9fdXNlciAqKQotCQkJCSAgICh1aW50cHRyX3QpIGFyZ3MtPmJ1ZmZlcnNfcHRyLAotCQkJCSAgIGV4ZWMyX2xpc3QsCi0JCQkJICAgc2l6ZW9mKCpleGVjMl9saXN0KSAqIGFyZ3MtPmJ1ZmZlcl9jb3VudCk7Ci0JCWlmIChyZXQpIHsKLQkJCXJldCA9IC1FRkFVTFQ7Ci0JCQlEUk1fRVJST1IoImZhaWxlZCB0byBjb3B5ICVkIGV4ZWMgZW50cmllcyAiCi0JCQkJICAiYmFjayB0byB1c2VyICglZClcbiIsCi0JCQkJICBhcmdzLT5idWZmZXJfY291bnQsIHJldCk7Ci0JCX0KLQl9Ci0KLQlkcm1fZnJlZV9sYXJnZShleGVjMl9saXN0KTsKLQlyZXR1cm4gcmV0OwotfQotCi1pbnQKLWk5MTVfZ2VtX29iamVjdF9waW4oc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmosIHVpbnQzMl90IGFsaWdubWVudCkKLXsKLQlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gb2JqLT5kZXY7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IG9iai0+YmFzZS5kZXY7CiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqX3ByaXYgPSB0b19pbnRlbF9ibyhvYmopOwogCWludCByZXQ7CiAKLQlCVUdfT04ob2JqX3ByaXYtPnBpbl9jb3VudCA9PSBEUk1fSTkxNV9HRU1fT0JKRUNUX01BWF9QSU5fQ09VTlQpOworCUJVR19PTihvYmotPnBpbl9jb3VudCA9PSBEUk1fSTkxNV9HRU1fT0JKRUNUX01BWF9QSU5fQ09VTlQpOwogCVdBUk5fT04oaTkxNV92ZXJpZnlfbGlzdHMoZGV2KSk7CiAKLQlpZiAob2JqX3ByaXYtPmd0dF9zcGFjZSAhPSBOVUxMKSB7Ci0JCWlmIChhbGlnbm1lbnQgPT0gMCkKLQkJCWFsaWdubWVudCA9IGk5MTVfZ2VtX2dldF9ndHRfYWxpZ25tZW50KG9iaik7Ci0JCWlmIChvYmpfcHJpdi0+Z3R0X29mZnNldCAmIChhbGlnbm1lbnQgLSAxKSkgewotCQkJV0FSTihvYmpfcHJpdi0+cGluX2NvdW50LAotCQkJICAgICAiYm8gaXMgYWxyZWFkeSBwaW5uZWQgd2l0aCBpbmNvcnJlY3QgYWxpZ25tZW50OiBvZmZzZXQ9JXgsIHJlcS5hbGlnbm1lbnQ9JXhcbiIsCi0JCQkgICAgIG9ial9wcml2LT5ndHRfb2Zmc2V0LCBhbGlnbm1lbnQpOworCWlmIChvYmotPmd0dF9zcGFjZSAhPSBOVUxMKSB7CisJCWlmICgoYWxpZ25tZW50ICYmIG9iai0+Z3R0X29mZnNldCAmIChhbGlnbm1lbnQgLSAxKSkgfHwKKwkJICAgIChtYXBfYW5kX2ZlbmNlYWJsZSAmJiAhb2JqLT5tYXBfYW5kX2ZlbmNlYWJsZSkpIHsKKwkJCVdBUk4ob2JqLT5waW5fY291bnQsCisJCQkgICAgICJibyBpcyBhbHJlYWR5IHBpbm5lZCB3aXRoIGluY29ycmVjdCBhbGlnbm1lbnQ6IgorCQkJICAgICAiIG9mZnNldD0leCwgcmVxLmFsaWdubWVudD0leCwgcmVxLm1hcF9hbmRfZmVuY2VhYmxlPSVkLCIKKwkJCSAgICAgIiBvYmotPm1hcF9hbmRfZmVuY2VhYmxlPSVkXG4iLAorCQkJICAgICBvYmotPmd0dF9vZmZzZXQsIGFsaWdubWVudCwKKwkJCSAgICAgbWFwX2FuZF9mZW5jZWFibGUsCisJCQkgICAgIG9iai0+bWFwX2FuZF9mZW5jZWFibGUpOwogCQkJcmV0ID0gaTkxNV9nZW1fb2JqZWN0X3VuYmluZChvYmopOwogCQkJaWYgKHJldCkKIAkJCQlyZXR1cm4gcmV0OwogCQl9CiAJfQogCi0JaWYgKG9ial9wcml2LT5ndHRfc3BhY2UgPT0gTlVMTCkgewotCQlyZXQgPSBpOTE1X2dlbV9vYmplY3RfYmluZF90b19ndHQob2JqLCBhbGlnbm1lbnQpOworCWlmIChvYmotPmd0dF9zcGFjZSA9PSBOVUxMKSB7CisJCXJldCA9IGk5MTVfZ2VtX29iamVjdF9iaW5kX3RvX2d0dChvYmosIGFsaWdubWVudCwKKwkJCQkJCSAgbWFwX2FuZF9mZW5jZWFibGUpOwogCQlpZiAocmV0KQogCQkJcmV0dXJuIHJldDsKIAl9CiAKLQlvYmpfcHJpdi0+cGluX2NvdW50Kys7Ci0KLQkvKiBJZiB0aGUgb2JqZWN0IGlzIG5vdCBhY3RpdmUgYW5kIG5vdCBwZW5kaW5nIGEgZmx1c2gsCi0JICogcmVtb3ZlIGl0IGZyb20gdGhlIGluYWN0aXZlIGxpc3QKLQkgKi8KLQlpZiAob2JqX3ByaXYtPnBpbl9jb3VudCA9PSAxKSB7Ci0JCWk5MTVfZ2VtX2luZm9fYWRkX3BpbihkZXZfcHJpdiwgb2JqLT5zaXplKTsKLQkJaWYgKCFvYmpfcHJpdi0+YWN0aXZlKQotCQkJbGlzdF9tb3ZlX3RhaWwoJm9ial9wcml2LT5tbV9saXN0LAorCWlmIChvYmotPnBpbl9jb3VudCsrID09IDApIHsKKwkJaWYgKCFvYmotPmFjdGl2ZSkKKwkJCWxpc3RfbW92ZV90YWlsKCZvYmotPm1tX2xpc3QsCiAJCQkJICAgICAgICZkZXZfcHJpdi0+bW0ucGlubmVkX2xpc3QpOwogCX0KKwlvYmotPnBpbl9tYXBwYWJsZSB8PSBtYXBfYW5kX2ZlbmNlYWJsZTsKIAogCVdBUk5fT04oaTkxNV92ZXJpZnlfbGlzdHMoZGV2KSk7CiAJcmV0dXJuIDA7CiB9CiAKIHZvaWQKLWk5MTVfZ2VtX29iamVjdF91bnBpbihzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iaikKK2k5MTVfZ2VtX29iamVjdF91bnBpbihzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqKQogewotCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBvYmotPmRldjsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gb2JqLT5iYXNlLmRldjsKIAlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqX3ByaXYgPSB0b19pbnRlbF9ibyhvYmopOwogCiAJV0FSTl9PTihpOTE1X3ZlcmlmeV9saXN0cyhkZXYpKTsKLQlvYmpfcHJpdi0+cGluX2NvdW50LS07Ci0JQlVHX09OKG9ial9wcml2LT5waW5fY291bnQgPCAwKTsKLQlCVUdfT04ob2JqX3ByaXYtPmd0dF9zcGFjZSA9PSBOVUxMKTsKKwlCVUdfT04ob2JqLT5waW5fY291bnQgPT0gMCk7CisJQlVHX09OKG9iai0+Z3R0X3NwYWNlID09IE5VTEwpOwogCi0JLyogSWYgdGhlIG9iamVjdCBpcyBubyBsb25nZXIgcGlubmVkLCBhbmQgaXMKLQkgKiBuZWl0aGVyIGFjdGl2ZSBub3IgYmVpbmcgZmx1c2hlZCwgdGhlbiBzdGljayBpdCBvbgotCSAqIHRoZSBpbmFjdGl2ZSBsaXN0Ci0JICovCi0JaWYgKG9ial9wcml2LT5waW5fY291bnQgPT0gMCkgewotCQlpZiAoIW9ial9wcml2LT5hY3RpdmUpCi0JCQlsaXN0X21vdmVfdGFpbCgmb2JqX3ByaXYtPm1tX2xpc3QsCisJaWYgKC0tb2JqLT5waW5fY291bnQgPT0gMCkgeworCQlpZiAoIW9iai0+YWN0aXZlKQorCQkJbGlzdF9tb3ZlX3RhaWwoJm9iai0+bW1fbGlzdCwKIAkJCQkgICAgICAgJmRldl9wcml2LT5tbS5pbmFjdGl2ZV9saXN0KTsKLQkJaTkxNV9nZW1faW5mb19yZW1vdmVfcGluKGRldl9wcml2LCBvYmotPnNpemUpOworCQlvYmotPnBpbl9tYXBwYWJsZSA9IGZhbHNlOwogCX0KIAlXQVJOX09OKGk5MTVfdmVyaWZ5X2xpc3RzKGRldikpOwogfQogCiBpbnQKIGk5MTVfZ2VtX3Bpbl9pb2N0bChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB2b2lkICpkYXRhLAotCQkgICBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdikKKwkJICAgc3RydWN0IGRybV9maWxlICpmaWxlKQogewogCXN0cnVjdCBkcm1faTkxNV9nZW1fcGluICphcmdzID0gZGF0YTsKLQlzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iajsKLQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqX3ByaXY7CisJc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iajsKIAlpbnQgcmV0OwogCiAJcmV0ID0gaTkxNV9tdXRleF9sb2NrX2ludGVycnVwdGlibGUoZGV2KTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCi0Jb2JqID0gZHJtX2dlbV9vYmplY3RfbG9va3VwKGRldiwgZmlsZV9wcml2LCBhcmdzLT5oYW5kbGUpOworCW9iaiA9IHRvX2ludGVsX2JvKGRybV9nZW1fb2JqZWN0X2xvb2t1cChkZXYsIGZpbGUsIGFyZ3MtPmhhbmRsZSkpOwogCWlmIChvYmogPT0gTlVMTCkgewogCQlyZXQgPSAtRU5PRU5UOwogCQlnb3RvIHVubG9jazsKIAl9Ci0Jb2JqX3ByaXYgPSB0b19pbnRlbF9ibyhvYmopOwogCi0JaWYgKG9ial9wcml2LT5tYWR2ICE9IEk5MTVfTUFEVl9XSUxMTkVFRCkgeworCWlmIChvYmotPm1hZHYgIT0gSTkxNV9NQURWX1dJTExORUVEKSB7CiAJCURSTV9FUlJPUigiQXR0ZW1wdGluZyB0byBwaW4gYSBwdXJnZWFibGUgYnVmZmVyXG4iKTsKIAkJcmV0ID0gLUVJTlZBTDsKIAkJZ290byBvdXQ7CiAJfQogCi0JaWYgKG9ial9wcml2LT5waW5fZmlscCAhPSBOVUxMICYmIG9ial9wcml2LT5waW5fZmlscCAhPSBmaWxlX3ByaXYpIHsKKwlpZiAob2JqLT5waW5fZmlscCAhPSBOVUxMICYmIG9iai0+cGluX2ZpbHAgIT0gZmlsZSkgewogCQlEUk1fRVJST1IoIkFscmVhZHkgcGlubmVkIGluIGk5MTVfZ2VtX3Bpbl9pb2N0bCgpOiAlZFxuIiwKIAkJCSAgYXJncy0+aGFuZGxlKTsKIAkJcmV0ID0gLUVJTlZBTDsKIAkJZ290byBvdXQ7CiAJfQogCi0Jb2JqX3ByaXYtPnVzZXJfcGluX2NvdW50Kys7Ci0Jb2JqX3ByaXYtPnBpbl9maWxwID0gZmlsZV9wcml2OwotCWlmIChvYmpfcHJpdi0+dXNlcl9waW5fY291bnQgPT0gMSkgewotCQlyZXQgPSBpOTE1X2dlbV9vYmplY3RfcGluKG9iaiwgYXJncy0+YWxpZ25tZW50KTsKKwlvYmotPnVzZXJfcGluX2NvdW50Kys7CisJb2JqLT5waW5fZmlscCA9IGZpbGU7CisJaWYgKG9iai0+dXNlcl9waW5fY291bnQgPT0gMSkgeworCQlyZXQgPSBpOTE1X2dlbV9vYmplY3RfcGluKG9iaiwgYXJncy0+YWxpZ25tZW50LCB0cnVlKTsKIAkJaWYgKHJldCkKIAkJCWdvdG8gb3V0OwogCX0KQEAgLTQyOTUsOSArMzI4Niw5IEBACiAJICogYXMgdGhlIFggc2VydmVyIGRvZXNuJ3QgbWFuYWdlIGRvbWFpbnMgeWV0CiAJICovCiAJaTkxNV9nZW1fb2JqZWN0X2ZsdXNoX2NwdV93cml0ZV9kb21haW4ob2JqKTsKLQlhcmdzLT5vZmZzZXQgPSBvYmpfcHJpdi0+Z3R0X29mZnNldDsKKwlhcmdzLT5vZmZzZXQgPSBvYmotPmd0dF9vZmZzZXQ7CiBvdXQ6Ci0JZHJtX2dlbV9vYmplY3RfdW5yZWZlcmVuY2Uob2JqKTsKKwlkcm1fZ2VtX29iamVjdF91bnJlZmVyZW5jZSgmb2JqLT5iYXNlKTsKIHVubG9jazoKIAltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKIAlyZXR1cm4gcmV0OwpAQCAtNDMwNSwzOCArMzI5NiwzNiBAQAogCiBpbnQKIGk5MTVfZ2VtX3VucGluX2lvY3RsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEsCi0JCSAgICAgc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYpCisJCSAgICAgc3RydWN0IGRybV9maWxlICpmaWxlKQogewogCXN0cnVjdCBkcm1faTkxNV9nZW1fcGluICphcmdzID0gZGF0YTsKLQlzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iajsKLQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqX3ByaXY7CisJc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iajsKIAlpbnQgcmV0OwogCiAJcmV0ID0gaTkxNV9tdXRleF9sb2NrX2ludGVycnVwdGlibGUoZGV2KTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCi0Jb2JqID0gZHJtX2dlbV9vYmplY3RfbG9va3VwKGRldiwgZmlsZV9wcml2LCBhcmdzLT5oYW5kbGUpOworCW9iaiA9IHRvX2ludGVsX2JvKGRybV9nZW1fb2JqZWN0X2xvb2t1cChkZXYsIGZpbGUsIGFyZ3MtPmhhbmRsZSkpOwogCWlmIChvYmogPT0gTlVMTCkgewogCQlyZXQgPSAtRU5PRU5UOwogCQlnb3RvIHVubG9jazsKIAl9Ci0Jb2JqX3ByaXYgPSB0b19pbnRlbF9ibyhvYmopOwogCi0JaWYgKG9ial9wcml2LT5waW5fZmlscCAhPSBmaWxlX3ByaXYpIHsKKwlpZiAob2JqLT5waW5fZmlscCAhPSBmaWxlKSB7CiAJCURSTV9FUlJPUigiTm90IHBpbm5lZCBieSBjYWxsZXIgaW4gaTkxNV9nZW1fcGluX2lvY3RsKCk6ICVkXG4iLAogCQkJICBhcmdzLT5oYW5kbGUpOwogCQlyZXQgPSAtRUlOVkFMOwogCQlnb3RvIG91dDsKIAl9Ci0Jb2JqX3ByaXYtPnVzZXJfcGluX2NvdW50LS07Ci0JaWYgKG9ial9wcml2LT51c2VyX3Bpbl9jb3VudCA9PSAwKSB7Ci0JCW9ial9wcml2LT5waW5fZmlscCA9IE5VTEw7CisJb2JqLT51c2VyX3Bpbl9jb3VudC0tOworCWlmIChvYmotPnVzZXJfcGluX2NvdW50ID09IDApIHsKKwkJb2JqLT5waW5fZmlscCA9IE5VTEw7CiAJCWk5MTVfZ2VtX29iamVjdF91bnBpbihvYmopOwogCX0KIAogb3V0OgotCWRybV9nZW1fb2JqZWN0X3VucmVmZXJlbmNlKG9iaik7CisJZHJtX2dlbV9vYmplY3RfdW5yZWZlcmVuY2UoJm9iai0+YmFzZSk7CiB1bmxvY2s6CiAJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CiAJcmV0dXJuIHJldDsKQEAgLTQzNDQsNDggKzMzMzMsNTAgQEAKIAogaW50CiBpOTE1X2dlbV9idXN5X2lvY3RsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEsCi0JCSAgICBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdikKKwkJICAgIHN0cnVjdCBkcm1fZmlsZSAqZmlsZSkKIHsKIAlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX2J1c3kgKmFyZ3MgPSBkYXRhOwotCXN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqOwotCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmpfcHJpdjsKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqOwogCWludCByZXQ7CiAKIAlyZXQgPSBpOTE1X211dGV4X2xvY2tfaW50ZXJydXB0aWJsZShkZXYpOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKLQlvYmogPSBkcm1fZ2VtX29iamVjdF9sb29rdXAoZGV2LCBmaWxlX3ByaXYsIGFyZ3MtPmhhbmRsZSk7CisJb2JqID0gdG9faW50ZWxfYm8oZHJtX2dlbV9vYmplY3RfbG9va3VwKGRldiwgZmlsZSwgYXJncy0+aGFuZGxlKSk7CiAJaWYgKG9iaiA9PSBOVUxMKSB7CiAJCXJldCA9IC1FTk9FTlQ7CiAJCWdvdG8gdW5sb2NrOwogCX0KLQlvYmpfcHJpdiA9IHRvX2ludGVsX2JvKG9iaik7CiAKIAkvKiBDb3VudCBhbGwgYWN0aXZlIG9iamVjdHMgYXMgYnVzeSwgZXZlbiBpZiB0aGV5IGFyZSBjdXJyZW50bHkgbm90IHVzZWQKIAkgKiBieSB0aGUgZ3B1LiBVc2VycyBvZiB0aGlzIGludGVyZmFjZSBleHBlY3Qgb2JqZWN0cyB0byBldmVudHVhbGx5CiAJICogYmVjb21lIG5vbi1idXN5IHdpdGhvdXQgYW55IGZ1cnRoZXIgYWN0aW9ucywgdGhlcmVmb3JlIGVtaXQgYW55CiAJICogbmVjZXNzYXJ5IGZsdXNoZXMgaGVyZS4KIAkgKi8KLQlhcmdzLT5idXN5ID0gb2JqX3ByaXYtPmFjdGl2ZTsKKwlhcmdzLT5idXN5ID0gb2JqLT5hY3RpdmU7CiAJaWYgKGFyZ3MtPmJ1c3kpIHsKIAkJLyogVW5jb25kaXRpb25hbGx5IGZsdXNoIG9iamVjdHMsIGV2ZW4gd2hlbiB0aGUgZ3B1IHN0aWxsIHVzZXMgdGhpcwogCQkgKiBvYmplY3QuIFVzZXJzcGFjZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24gaW5kaWNhdGVzIHRoYXQgaXQgd2FudHMgdG8KIAkJICogdXNlIHRoaXMgYnVmZmVyIHJhdGhlciBzb29uZXIgdGhhbiBsYXRlciwgc28gaXNzdWluZyB0aGUgcmVxdWlyZWQKIAkJICogZmx1c2ggZWFybGllciBpcyBiZW5lZmljaWFsLgogCQkgKi8KLQkJaWYgKG9iai0+d3JpdGVfZG9tYWluICYgSTkxNV9HRU1fR1BVX0RPTUFJTlMpIHsKLQkJCWk5MTVfZ2VtX2ZsdXNoX3JpbmcoZGV2LCBmaWxlX3ByaXYsCi0JCQkJCSAgICBvYmpfcHJpdi0+cmluZywKLQkJCQkJICAgIDAsIG9iai0+d3JpdGVfZG9tYWluKTsKLQkJfSBlbHNlIGlmIChvYmpfcHJpdi0+cmluZy0+b3V0c3RhbmRpbmdfbGF6eV9yZXF1ZXN0KSB7CisJCWlmIChvYmotPmJhc2Uud3JpdGVfZG9tYWluICYgSTkxNV9HRU1fR1BVX0RPTUFJTlMpIHsKKwkJCWk5MTVfZ2VtX2ZsdXNoX3JpbmcoZGV2LCBvYmotPnJpbmcsCisJCQkJCSAgICAwLCBvYmotPmJhc2Uud3JpdGVfZG9tYWluKTsKKwkJfSBlbHNlIGlmIChvYmotPnJpbmctPm91dHN0YW5kaW5nX2xhenlfcmVxdWVzdCA9PQorCQkJICAgb2JqLT5sYXN0X3JlbmRlcmluZ19zZXFubykgeworCQkJc3RydWN0IGRybV9pOTE1X2dlbV9yZXF1ZXN0ICpyZXF1ZXN0OworCiAJCQkvKiBUaGlzIHJpbmcgaXMgbm90IGJlaW5nIGNsZWFyZWQgYnkgYWN0aXZlIHVzYWdlLAogCQkJICogc28gZW1pdCBhIHJlcXVlc3QgdG8gZG8gc28uCiAJCQkgKi8KLQkJCXUzMiBzZXFubyA9IGk5MTVfYWRkX3JlcXVlc3QoZGV2LAotCQkJCQkJICAgICBOVUxMLCBOVUxMLAotCQkJCQkJICAgICBvYmpfcHJpdi0+cmluZyk7Ci0JCQlpZiAoc2Vxbm8gPT0gMCkKKwkJCXJlcXVlc3QgPSBremFsbG9jKHNpemVvZigqcmVxdWVzdCksIEdGUF9LRVJORUwpOworCQkJaWYgKHJlcXVlc3QpCisJCQkJcmV0ID0gaTkxNV9hZGRfcmVxdWVzdChkZXYsCisJCQkJCQkgICAgICAgTlVMTCwgcmVxdWVzdCwKKwkJCQkJCSAgICAgICBvYmotPnJpbmcpOworCQkJZWxzZQogCQkJCXJldCA9IC1FTk9NRU07CiAJCX0KIApAQCAtNDM5NCwxMiArMzM4NSwxMiBAQAogCQkgKiBhcmUgYWN0dWFsbHkgdW5tYXNrZWQsIGFuZCBvdXIgd29ya2luZyBzZXQgZW5kcyB1cCBiZWluZwogCQkgKiBsYXJnZXIgdGhhbiByZXF1aXJlZC4KIAkJICovCi0JCWk5MTVfZ2VtX3JldGlyZV9yZXF1ZXN0c19yaW5nKGRldiwgb2JqX3ByaXYtPnJpbmcpOworCQlpOTE1X2dlbV9yZXRpcmVfcmVxdWVzdHNfcmluZyhkZXYsIG9iai0+cmluZyk7CiAKLQkJYXJncy0+YnVzeSA9IG9ial9wcml2LT5hY3RpdmU7CisJCWFyZ3MtPmJ1c3kgPSBvYmotPmFjdGl2ZTsKIAl9CiAKLQlkcm1fZ2VtX29iamVjdF91bnJlZmVyZW5jZShvYmopOworCWRybV9nZW1fb2JqZWN0X3VucmVmZXJlbmNlKCZvYmotPmJhc2UpOwogdW5sb2NrOgogCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwogCXJldHVybiByZXQ7CkBAIC00NDE3LDggKzM0MDgsNyBAQAogCQkgICAgICAgc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYpCiB7CiAJc3RydWN0IGRybV9pOTE1X2dlbV9tYWR2aXNlICphcmdzID0gZGF0YTsKLQlzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iajsKLQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqX3ByaXY7CisJc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iajsKIAlpbnQgcmV0OwogCiAJc3dpdGNoIChhcmdzLT5tYWR2KSB7CkBAIC00NDMzLDM3ICszNDIzLDM2IEBACiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAotCW9iaiA9IGRybV9nZW1fb2JqZWN0X2xvb2t1cChkZXYsIGZpbGVfcHJpdiwgYXJncy0+aGFuZGxlKTsKKwlvYmogPSB0b19pbnRlbF9ibyhkcm1fZ2VtX29iamVjdF9sb29rdXAoZGV2LCBmaWxlX3ByaXYsIGFyZ3MtPmhhbmRsZSkpOwogCWlmIChvYmogPT0gTlVMTCkgewogCQlyZXQgPSAtRU5PRU5UOwogCQlnb3RvIHVubG9jazsKIAl9Ci0Jb2JqX3ByaXYgPSB0b19pbnRlbF9ibyhvYmopOwogCi0JaWYgKG9ial9wcml2LT5waW5fY291bnQpIHsKKwlpZiAob2JqLT5waW5fY291bnQpIHsKIAkJcmV0ID0gLUVJTlZBTDsKIAkJZ290byBvdXQ7CiAJfQogCi0JaWYgKG9ial9wcml2LT5tYWR2ICE9IF9fSTkxNV9NQURWX1BVUkdFRCkKLQkJb2JqX3ByaXYtPm1hZHYgPSBhcmdzLT5tYWR2OworCWlmIChvYmotPm1hZHYgIT0gX19JOTE1X01BRFZfUFVSR0VEKQorCQlvYmotPm1hZHYgPSBhcmdzLT5tYWR2OwogCiAJLyogaWYgdGhlIG9iamVjdCBpcyBubyBsb25nZXIgYm91bmQsIGRpc2NhcmQgaXRzIGJhY2tpbmcgc3RvcmFnZSAqLwotCWlmIChpOTE1X2dlbV9vYmplY3RfaXNfcHVyZ2VhYmxlKG9ial9wcml2KSAmJgotCSAgICBvYmpfcHJpdi0+Z3R0X3NwYWNlID09IE5VTEwpCisJaWYgKGk5MTVfZ2VtX29iamVjdF9pc19wdXJnZWFibGUob2JqKSAmJgorCSAgICBvYmotPmd0dF9zcGFjZSA9PSBOVUxMKQogCQlpOTE1X2dlbV9vYmplY3RfdHJ1bmNhdGUob2JqKTsKIAotCWFyZ3MtPnJldGFpbmVkID0gb2JqX3ByaXYtPm1hZHYgIT0gX19JOTE1X01BRFZfUFVSR0VEOworCWFyZ3MtPnJldGFpbmVkID0gb2JqLT5tYWR2ICE9IF9fSTkxNV9NQURWX1BVUkdFRDsKIAogb3V0OgotCWRybV9nZW1fb2JqZWN0X3VucmVmZXJlbmNlKG9iaik7CisJZHJtX2dlbV9vYmplY3RfdW5yZWZlcmVuY2UoJm9iai0+YmFzZSk7CiB1bmxvY2s6CiAJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CiAJcmV0dXJuIHJldDsKIH0KIAotc3RydWN0IGRybV9nZW1fb2JqZWN0ICogaTkxNV9nZW1fYWxsb2Nfb2JqZWN0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCi0JCQkJCSAgICAgIHNpemVfdCBzaXplKQorc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKmk5MTVfZ2VtX2FsbG9jX29iamVjdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAorCQkJCQkJICBzaXplX3Qgc2l6ZSkKIHsKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmo7CkBAIC00NDg2LDExICszNDc1LDE1IEBACiAJb2JqLT5iYXNlLmRyaXZlcl9wcml2YXRlID0gTlVMTDsKIAlvYmotPmZlbmNlX3JlZyA9IEk5MTVfRkVOQ0VfUkVHX05PTkU7CiAJSU5JVF9MSVNUX0hFQUQoJm9iai0+bW1fbGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJm9iai0+Z3R0X2xpc3QpOwogCUlOSVRfTElTVF9IRUFEKCZvYmotPnJpbmdfbGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJm9iai0+ZXhlY19saXN0KTsKIAlJTklUX0xJU1RfSEVBRCgmb2JqLT5ncHVfd3JpdGVfbGlzdCk7CiAJb2JqLT5tYWR2ID0gSTkxNV9NQURWX1dJTExORUVEOworCS8qIEF2b2lkIGFuIHVubmVjZXNzYXJ5IGNhbGwgdG8gdW5iaW5kIG9uIHRoZSBmaXJzdCBiaW5kLiAqLworCW9iai0+bWFwX2FuZF9mZW5jZWFibGUgPSB0cnVlOwogCi0JcmV0dXJuICZvYmotPmJhc2U7CisJcmV0dXJuIG9iajsKIH0KIAogaW50IGk5MTVfZ2VtX2luaXRfb2JqZWN0KHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqKQpAQCAtNDUwMCw0MiArMzQ5Myw0MSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBpOTE1X2dlbV9mcmVlX29iamVjdF90YWlsKHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqKQorc3RhdGljIHZvaWQgaTkxNV9nZW1fZnJlZV9vYmplY3RfdGFpbChzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqKQogewotCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBvYmotPmRldjsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gb2JqLT5iYXNlLmRldjsKIAlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqX3ByaXYgPSB0b19pbnRlbF9ibyhvYmopOwogCWludCByZXQ7CiAKIAlyZXQgPSBpOTE1X2dlbV9vYmplY3RfdW5iaW5kKG9iaik7CiAJaWYgKHJldCA9PSAtRVJFU1RBUlRTWVMpIHsKLQkJbGlzdF9tb3ZlKCZvYmpfcHJpdi0+bW1fbGlzdCwKKwkJbGlzdF9tb3ZlKCZvYmotPm1tX2xpc3QsCiAJCQkgICZkZXZfcHJpdi0+bW0uZGVmZXJyZWRfZnJlZV9saXN0KTsKIAkJcmV0dXJuOwogCX0KIAotCWlmIChvYmpfcHJpdi0+bW1hcF9vZmZzZXQpCisJaWYgKG9iai0+YmFzZS5tYXBfbGlzdC5tYXApCiAJCWk5MTVfZ2VtX2ZyZWVfbW1hcF9vZmZzZXQob2JqKTsKIAotCWRybV9nZW1fb2JqZWN0X3JlbGVhc2Uob2JqKTsKLQlpOTE1X2dlbV9pbmZvX3JlbW92ZV9vYmooZGV2X3ByaXYsIG9iai0+c2l6ZSk7CisJZHJtX2dlbV9vYmplY3RfcmVsZWFzZSgmb2JqLT5iYXNlKTsKKwlpOTE1X2dlbV9pbmZvX3JlbW92ZV9vYmooZGV2X3ByaXYsIG9iai0+YmFzZS5zaXplKTsKIAotCWtmcmVlKG9ial9wcml2LT5wYWdlX2NwdV92YWxpZCk7Ci0Ja2ZyZWUob2JqX3ByaXYtPmJpdF8xNyk7Ci0Ja2ZyZWUob2JqX3ByaXYpOworCWtmcmVlKG9iai0+cGFnZV9jcHVfdmFsaWQpOworCWtmcmVlKG9iai0+Yml0XzE3KTsKKwlrZnJlZShvYmopOwogfQogCi12b2lkIGk5MTVfZ2VtX2ZyZWVfb2JqZWN0KHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqKQordm9pZCBpOTE1X2dlbV9mcmVlX29iamVjdChzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKmdlbV9vYmopCiB7Ci0Jc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IG9iai0+ZGV2OwotCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmpfcHJpdiA9IHRvX2ludGVsX2JvKG9iaik7CisJc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaiA9IHRvX2ludGVsX2JvKGdlbV9vYmopOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBvYmotPmJhc2UuZGV2OwogCiAJdHJhY2VfaTkxNV9nZW1fb2JqZWN0X2Rlc3Ryb3kob2JqKTsKIAotCXdoaWxlIChvYmpfcHJpdi0+cGluX2NvdW50ID4gMCkKKwl3aGlsZSAob2JqLT5waW5fY291bnQgPiAwKQogCQlpOTE1X2dlbV9vYmplY3RfdW5waW4ob2JqKTsKIAotCWlmIChvYmpfcHJpdi0+cGh5c19vYmopCisJaWYgKG9iai0+cGh5c19vYmopCiAJCWk5MTVfZ2VtX2RldGFjaF9waHlzX29iamVjdChkZXYsIG9iaik7CiAKIAlpOTE1X2dlbV9mcmVlX29iamVjdF90YWlsKG9iaik7CkBAIC00NTYyLDEzICszNTU0LDE1IEBACiAKIAkvKiBVbmRlciBVTVMsIGJlIHBhcmFub2lkIGFuZCBldmljdC4gKi8KIAlpZiAoIWRybV9jb3JlX2NoZWNrX2ZlYXR1cmUoZGV2LCBEUklWRVJfTU9ERVNFVCkpIHsKLQkJcmV0ID0gaTkxNV9nZW1fZXZpY3RfaW5hY3RpdmUoZGV2KTsKKwkJcmV0ID0gaTkxNV9nZW1fZXZpY3RfaW5hY3RpdmUoZGV2LCBmYWxzZSk7CiAJCWlmIChyZXQpIHsKIAkJCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwogCQkJcmV0dXJuIHJldDsKIAkJfQogCX0KIAorCWk5MTVfZ2VtX3Jlc2V0X2ZlbmNlcyhkZXYpOworCiAJLyogSGFjayEgIERvbid0IGxldCBhbnlib2R5IGRvIGV4ZWNidWYgd2hpbGUgd2UgZG9uJ3QgY29udHJvbCB0aGUgY2hpcC4KIAkgKiBXZSBuZWVkIHRvIHJlcGxhY2UgdGhpcyB3aXRoIGEgc2VtYXBob3JlLCBvciBzb21ldGhpbmcuCiAJICogQW5kIG5vdCBjb25mb3VuZCBtbS5zdXNwZW5kZWQhCkBAIC00NTg3LDgyICszNTgxLDE1IEBACiAJcmV0dXJuIDA7CiB9CiAKLS8qCi0gKiA5NjUrIHN1cHBvcnQgUElQRV9DT05UUk9MIGNvbW1hbmRzLCB3aGljaCBwcm92aWRlIGZpbmVyIGdyYWluZWQgY29udHJvbAotICogb3ZlciBjYWNoZSBmbHVzaGluZy4KLSAqLwotc3RhdGljIGludAotaTkxNV9nZW1faW5pdF9waXBlX2NvbnRyb2woc3RydWN0IGRybV9kZXZpY2UgKmRldikKLXsKLQlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iajsKLQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqX3ByaXY7Ci0JaW50IHJldDsKLQotCW9iaiA9IGk5MTVfZ2VtX2FsbG9jX29iamVjdChkZXYsIDQwOTYpOwotCWlmIChvYmogPT0gTlVMTCkgewotCQlEUk1fRVJST1IoIkZhaWxlZCB0byBhbGxvY2F0ZSBzZXFubyBwYWdlXG4iKTsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBlcnI7Ci0JfQotCW9ial9wcml2ID0gdG9faW50ZWxfYm8ob2JqKTsKLQlvYmpfcHJpdi0+YWdwX3R5cGUgPSBBR1BfVVNFUl9DQUNIRURfTUVNT1JZOwotCi0JcmV0ID0gaTkxNV9nZW1fb2JqZWN0X3BpbihvYmosIDQwOTYpOwotCWlmIChyZXQpCi0JCWdvdG8gZXJyX3VucmVmOwotCi0JZGV2X3ByaXYtPnNlcW5vX2dmeF9hZGRyID0gb2JqX3ByaXYtPmd0dF9vZmZzZXQ7Ci0JZGV2X3ByaXYtPnNlcW5vX3BhZ2UgPSAga21hcChvYmpfcHJpdi0+cGFnZXNbMF0pOwotCWlmIChkZXZfcHJpdi0+c2Vxbm9fcGFnZSA9PSBOVUxMKQotCQlnb3RvIGVycl91bnBpbjsKLQotCWRldl9wcml2LT5zZXFub19vYmogPSBvYmo7Ci0JbWVtc2V0KGRldl9wcml2LT5zZXFub19wYWdlLCAwLCBQQUdFX1NJWkUpOwotCi0JcmV0dXJuIDA7Ci0KLWVycl91bnBpbjoKLQlpOTE1X2dlbV9vYmplY3RfdW5waW4ob2JqKTsKLWVycl91bnJlZjoKLQlkcm1fZ2VtX29iamVjdF91bnJlZmVyZW5jZShvYmopOwotZXJyOgotCXJldHVybiByZXQ7Ci19Ci0KLQotc3RhdGljIHZvaWQKLWk5MTVfZ2VtX2NsZWFudXBfcGlwZV9jb250cm9sKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCi17Ci0JZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Ci0Jc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmo7Ci0Jc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9ial9wcml2OwotCi0Jb2JqID0gZGV2X3ByaXYtPnNlcW5vX29iajsKLQlvYmpfcHJpdiA9IHRvX2ludGVsX2JvKG9iaik7Ci0Ja3VubWFwKG9ial9wcml2LT5wYWdlc1swXSk7Ci0JaTkxNV9nZW1fb2JqZWN0X3VucGluKG9iaik7Ci0JZHJtX2dlbV9vYmplY3RfdW5yZWZlcmVuY2Uob2JqKTsKLQlkZXZfcHJpdi0+c2Vxbm9fb2JqID0gTlVMTDsKLQotCWRldl9wcml2LT5zZXFub19wYWdlID0gTlVMTDsKLX0KLQogaW50CiBpOTE1X2dlbV9pbml0X3JpbmdidWZmZXIoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKIAlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlpbnQgcmV0OwogCi0JaWYgKEhBU19QSVBFX0NPTlRST0woZGV2KSkgewotCQlyZXQgPSBpOTE1X2dlbV9pbml0X3BpcGVfY29udHJvbChkZXYpOwotCQlpZiAocmV0KQotCQkJcmV0dXJuIHJldDsKLQl9Ci0KIAlyZXQgPSBpbnRlbF9pbml0X3JlbmRlcl9yaW5nX2J1ZmZlcihkZXYpOwogCWlmIChyZXQpCi0JCWdvdG8gY2xlYW51cF9waXBlX2NvbnRyb2w7CisJCXJldHVybiByZXQ7CiAKIAlpZiAoSEFTX0JTRChkZXYpKSB7CiAJCXJldCA9IGludGVsX2luaXRfYnNkX3JpbmdfYnVmZmVyKGRldik7CkBAIC00NjgxLDEyICszNjA4LDkgQEAKIAlyZXR1cm4gMDsKIAogY2xlYW51cF9ic2RfcmluZzoKLQlpbnRlbF9jbGVhbnVwX3JpbmdfYnVmZmVyKGRldiwgJmRldl9wcml2LT5ic2RfcmluZyk7CisJaW50ZWxfY2xlYW51cF9yaW5nX2J1ZmZlcigmZGV2X3ByaXYtPnJpbmdbVkNTXSk7CiBjbGVhbnVwX3JlbmRlcl9yaW5nOgotCWludGVsX2NsZWFudXBfcmluZ19idWZmZXIoZGV2LCAmZGV2X3ByaXYtPnJlbmRlcl9yaW5nKTsKLWNsZWFudXBfcGlwZV9jb250cm9sOgotCWlmIChIQVNfUElQRV9DT05UUk9MKGRldikpCi0JCWk5MTVfZ2VtX2NsZWFudXBfcGlwZV9jb250cm9sKGRldik7CisJaW50ZWxfY2xlYW51cF9yaW5nX2J1ZmZlcigmZGV2X3ByaXYtPnJpbmdbUkNTXSk7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtNDY5NCwxMiArMzYxOCwxMCBAQAogaTkxNV9nZW1fY2xlYW51cF9yaW5nYnVmZmVyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7CiAJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJaW50IGk7CiAKLQlpbnRlbF9jbGVhbnVwX3JpbmdfYnVmZmVyKGRldiwgJmRldl9wcml2LT5yZW5kZXJfcmluZyk7Ci0JaW50ZWxfY2xlYW51cF9yaW5nX2J1ZmZlcihkZXYsICZkZXZfcHJpdi0+YnNkX3JpbmcpOwotCWludGVsX2NsZWFudXBfcmluZ19idWZmZXIoZGV2LCAmZGV2X3ByaXYtPmJsdF9yaW5nKTsKLQlpZiAoSEFTX1BJUEVfQ09OVFJPTChkZXYpKQotCQlpOTE1X2dlbV9jbGVhbnVwX3BpcGVfY29udHJvbChkZXYpOworCWZvciAoaSA9IDA7IGkgPCBJOTE1X05VTV9SSU5HUzsgaSsrKQorCQlpbnRlbF9jbGVhbnVwX3JpbmdfYnVmZmVyKCZkZXZfcHJpdi0+cmluZ1tpXSk7CiB9CiAKIGludApAQCAtNDcwNyw3ICszNjI5LDcgQEAKIAkJICAgICAgIHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2KQogewogCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCWludCByZXQ7CisJaW50IHJldCwgaTsKIAogCWlmIChkcm1fY29yZV9jaGVja19mZWF0dXJlKGRldiwgRFJJVkVSX01PREVTRVQpKQogCQlyZXR1cm4gMDsKQEAgLTQ3MjcsMTQgKzM2NDksMTIgQEAKIAl9CiAKIAlCVUdfT04oIWxpc3RfZW1wdHkoJmRldl9wcml2LT5tbS5hY3RpdmVfbGlzdCkpOwotCUJVR19PTighbGlzdF9lbXB0eSgmZGV2X3ByaXYtPnJlbmRlcl9yaW5nLmFjdGl2ZV9saXN0KSk7Ci0JQlVHX09OKCFsaXN0X2VtcHR5KCZkZXZfcHJpdi0+YnNkX3JpbmcuYWN0aXZlX2xpc3QpKTsKLQlCVUdfT04oIWxpc3RfZW1wdHkoJmRldl9wcml2LT5ibHRfcmluZy5hY3RpdmVfbGlzdCkpOwogCUJVR19PTighbGlzdF9lbXB0eSgmZGV2X3ByaXYtPm1tLmZsdXNoaW5nX2xpc3QpKTsKIAlCVUdfT04oIWxpc3RfZW1wdHkoJmRldl9wcml2LT5tbS5pbmFjdGl2ZV9saXN0KSk7Ci0JQlVHX09OKCFsaXN0X2VtcHR5KCZkZXZfcHJpdi0+cmVuZGVyX3JpbmcucmVxdWVzdF9saXN0KSk7Ci0JQlVHX09OKCFsaXN0X2VtcHR5KCZkZXZfcHJpdi0+YnNkX3JpbmcucmVxdWVzdF9saXN0KSk7Ci0JQlVHX09OKCFsaXN0X2VtcHR5KCZkZXZfcHJpdi0+Ymx0X3JpbmcucmVxdWVzdF9saXN0KSk7CisJZm9yIChpID0gMDsgaSA8IEk5MTVfTlVNX1JJTkdTOyBpKyspIHsKKwkJQlVHX09OKCFsaXN0X2VtcHR5KCZkZXZfcHJpdi0+cmluZ1tpXS5hY3RpdmVfbGlzdCkpOworCQlCVUdfT04oIWxpc3RfZW1wdHkoJmRldl9wcml2LT5yaW5nW2ldLnJlcXVlc3RfbGlzdCkpOworCX0KIAltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKIAogCXJldCA9IGRybV9pcnFfaW5zdGFsbChkZXYpOwpAQCAtNDc5NiwxNyArMzcxNiwxNCBAQAogCUlOSVRfTElTVF9IRUFEKCZkZXZfcHJpdi0+bW0ucGlubmVkX2xpc3QpOwogCUlOSVRfTElTVF9IRUFEKCZkZXZfcHJpdi0+bW0uZmVuY2VfbGlzdCk7CiAJSU5JVF9MSVNUX0hFQUQoJmRldl9wcml2LT5tbS5kZWZlcnJlZF9mcmVlX2xpc3QpOwotCWluaXRfcmluZ19saXN0cygmZGV2X3ByaXYtPnJlbmRlcl9yaW5nKTsKLQlpbml0X3JpbmdfbGlzdHMoJmRldl9wcml2LT5ic2RfcmluZyk7Ci0JaW5pdF9yaW5nX2xpc3RzKCZkZXZfcHJpdi0+Ymx0X3JpbmcpOworCUlOSVRfTElTVF9IRUFEKCZkZXZfcHJpdi0+bW0uZ3R0X2xpc3QpOworCWZvciAoaSA9IDA7IGkgPCBJOTE1X05VTV9SSU5HUzsgaSsrKQorCQlpbml0X3JpbmdfbGlzdHMoJmRldl9wcml2LT5yaW5nW2ldKTsKIAlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKIAkJSU5JVF9MSVNUX0hFQUQoJmRldl9wcml2LT5mZW5jZV9yZWdzW2ldLmxydV9saXN0KTsKIAlJTklUX0RFTEFZRURfV09SSygmZGV2X3ByaXYtPm1tLnJldGlyZV93b3JrLAogCQkJICBpOTE1X2dlbV9yZXRpcmVfd29ya19oYW5kbGVyKTsKIAlpbml0X2NvbXBsZXRpb24oJmRldl9wcml2LT5lcnJvcl9jb21wbGV0aW9uKTsKLQlzcGluX2xvY2soJnNocmlua19saXN0X2xvY2spOwotCWxpc3RfYWRkKCZkZXZfcHJpdi0+bW0uc2hyaW5rX2xpc3QsICZzaHJpbmtfbGlzdCk7Ci0Jc3Bpbl91bmxvY2soJnNocmlua19saXN0X2xvY2spOwogCiAJLyogT24gR0VOMyB3ZSByZWFsbHkgbmVlZCB0byBtYWtlIHN1cmUgdGhlIEFSQiBDMyBMUCBiaXQgaXMgc2V0ICovCiAJaWYgKElTX0dFTjMoZGV2KSkgewpAQCAtNDgxOCw2ICszNzM1LDggQEAKIAkJfQogCX0KIAorCWRldl9wcml2LT5yZWxhdGl2ZV9jb25zdGFudHNfbW9kZSA9IEk5MTVfRVhFQ19DT05TVEFOVFNfUkVMX0dFTkVSQUw7CisKIAkvKiBPbGQgWCBkcml2ZXJzIHdpbGwgdGFrZSAwLTIgZm9yIGZyb250LCBiYWNrLCBkZXB0aCBidWZmZXJzICovCiAJaWYgKCFkcm1fY29yZV9jaGVja19mZWF0dXJlKGRldiwgRFJJVkVSX01PREVTRVQpKQogCQlkZXZfcHJpdi0+ZmVuY2VfcmVnX3N0YXJ0ID0gMzsKQEAgLTQ4NDksNiArMzc2OCwxMCBAQAogCX0KIAlpOTE1X2dlbV9kZXRlY3RfYml0XzZfc3dpenpsZShkZXYpOwogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmRldl9wcml2LT5wZW5kaW5nX2ZsaXBfcXVldWUpOworCisJZGV2X3ByaXYtPm1tLmluYWN0aXZlX3Nocmlua2VyLnNocmluayA9IGk5MTVfZ2VtX2luYWN0aXZlX3NocmluazsKKwlkZXZfcHJpdi0+bW0uaW5hY3RpdmVfc2hyaW5rZXIuc2Vla3MgPSBERUZBVUxUX1NFRUtTOworCXJlZ2lzdGVyX3Nocmlua2VyKCZkZXZfcHJpdi0+bW0uaW5hY3RpdmVfc2hyaW5rZXIpOwogfQogCiAvKgpAQCAtNDkxOCw0NyArMzg0MSw0NyBAQAogfQogCiB2b2lkIGk5MTVfZ2VtX2RldGFjaF9waHlzX29iamVjdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAotCQkJCSBzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iaikKKwkJCQkgc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaikKIHsKLQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqX3ByaXY7CisJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBvYmotPmJhc2UuZmlscC0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZS0+aV9tYXBwaW5nOworCWNoYXIgKnZhZGRyOwogCWludCBpOwotCWludCByZXQ7CiAJaW50IHBhZ2VfY291bnQ7CiAKLQlvYmpfcHJpdiA9IHRvX2ludGVsX2JvKG9iaik7Ci0JaWYgKCFvYmpfcHJpdi0+cGh5c19vYmopCisJaWYgKCFvYmotPnBoeXNfb2JqKQogCQlyZXR1cm47CisJdmFkZHIgPSBvYmotPnBoeXNfb2JqLT5oYW5kbGUtPnZhZGRyOwogCi0JcmV0ID0gaTkxNV9nZW1fb2JqZWN0X2dldF9wYWdlcyhvYmosIDApOwotCWlmIChyZXQpCi0JCWdvdG8gb3V0OwotCi0JcGFnZV9jb3VudCA9IG9iai0+c2l6ZSAvIFBBR0VfU0laRTsKLQorCXBhZ2VfY291bnQgPSBvYmotPmJhc2Uuc2l6ZSAvIFBBR0VfU0laRTsKIAlmb3IgKGkgPSAwOyBpIDwgcGFnZV9jb3VudDsgaSsrKSB7Ci0JCWNoYXIgKmRzdCA9IGttYXBfYXRvbWljKG9ial9wcml2LT5wYWdlc1tpXSk7Ci0JCWNoYXIgKnNyYyA9IG9ial9wcml2LT5waHlzX29iai0+aGFuZGxlLT52YWRkciArIChpICogUEFHRV9TSVpFKTsKKwkJc3RydWN0IHBhZ2UgKnBhZ2UgPSByZWFkX2NhY2hlX3BhZ2VfZ2ZwKG1hcHBpbmcsIGksCisJCQkJCQkJR0ZQX0hJR0hVU0VSIHwgX19HRlBfUkVDTEFJTUFCTEUpOworCQlpZiAoIUlTX0VSUihwYWdlKSkgeworCQkJY2hhciAqZHN0ID0ga21hcF9hdG9taWMocGFnZSk7CisJCQltZW1jcHkoZHN0LCB2YWRkciArIGkqUEFHRV9TSVpFLCBQQUdFX1NJWkUpOworCQkJa3VubWFwX2F0b21pYyhkc3QpOwogCi0JCW1lbWNweShkc3QsIHNyYywgUEFHRV9TSVpFKTsKLQkJa3VubWFwX2F0b21pYyhkc3QpOworCQkJZHJtX2NsZmx1c2hfcGFnZXMoJnBhZ2UsIDEpOworCisJCQlzZXRfcGFnZV9kaXJ0eShwYWdlKTsKKwkJCW1hcmtfcGFnZV9hY2Nlc3NlZChwYWdlKTsKKwkJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKKwkJfQogCX0KLQlkcm1fY2xmbHVzaF9wYWdlcyhvYmpfcHJpdi0+cGFnZXMsIHBhZ2VfY291bnQpOwotCWRybV9hZ3BfY2hpcHNldF9mbHVzaChkZXYpOworCWludGVsX2d0dF9jaGlwc2V0X2ZsdXNoKCk7CiAKLQlpOTE1X2dlbV9vYmplY3RfcHV0X3BhZ2VzKG9iaik7Ci1vdXQ6Ci0Jb2JqX3ByaXYtPnBoeXNfb2JqLT5jdXJfb2JqID0gTlVMTDsKLQlvYmpfcHJpdi0+cGh5c19vYmogPSBOVUxMOworCW9iai0+cGh5c19vYmotPmN1cl9vYmogPSBOVUxMOworCW9iai0+cGh5c19vYmogPSBOVUxMOwogfQogCiBpbnQKIGk5MTVfZ2VtX2F0dGFjaF9waHlzX29iamVjdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAotCQkJICAgIHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqLAorCQkJICAgIHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmosCiAJCQkgICAgaW50IGlkLAogCQkJICAgIGludCBhbGlnbikKIHsKKwlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IG9iai0+YmFzZS5maWxwLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlLT5pX21hcHBpbmc7CiAJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Ci0Jc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9ial9wcml2OwogCWludCByZXQgPSAwOwogCWludCBwYWdlX2NvdW50OwogCWludCBpOwpAQCAtNDk2NiwxMCArMzg4OSw4IEBACiAJaWYgKGlkID4gSTkxNV9NQVhfUEhZU19PQkpFQ1QpCiAJCXJldHVybiAtRUlOVkFMOwogCi0Jb2JqX3ByaXYgPSB0b19pbnRlbF9ibyhvYmopOwotCi0JaWYgKG9ial9wcml2LT5waHlzX29iaikgewotCQlpZiAob2JqX3ByaXYtPnBoeXNfb2JqLT5pZCA9PSBpZCkKKwlpZiAob2JqLT5waHlzX29iaikgeworCQlpZiAob2JqLT5waHlzX29iai0+aWQgPT0gaWQpCiAJCQlyZXR1cm4gMDsKIAkJaTkxNV9nZW1fZGV0YWNoX3BoeXNfb2JqZWN0KGRldiwgb2JqKTsKIAl9CkBAIC00OTc3LDUxICszODk4LDUwIEBACiAJLyogY3JlYXRlIGEgbmV3IG9iamVjdCAqLwogCWlmICghZGV2X3ByaXYtPm1tLnBoeXNfb2Jqc1tpZCAtIDFdKSB7CiAJCXJldCA9IGk5MTVfZ2VtX2luaXRfcGh5c19vYmplY3QoZGV2LCBpZCwKLQkJCQkJCW9iai0+c2l6ZSwgYWxpZ24pOworCQkJCQkJb2JqLT5iYXNlLnNpemUsIGFsaWduKTsKIAkJaWYgKHJldCkgewotCQkJRFJNX0VSUk9SKCJmYWlsZWQgdG8gaW5pdCBwaHlzIG9iamVjdCAlZCBzaXplOiAlenVcbiIsIGlkLCBvYmotPnNpemUpOwotCQkJZ290byBvdXQ7CisJCQlEUk1fRVJST1IoImZhaWxlZCB0byBpbml0IHBoeXMgb2JqZWN0ICVkIHNpemU6ICV6dVxuIiwKKwkJCQkgIGlkLCBvYmotPmJhc2Uuc2l6ZSk7CisJCQlyZXR1cm4gcmV0OwogCQl9CiAJfQogCiAJLyogYmluZCB0byB0aGUgb2JqZWN0ICovCi0Jb2JqX3ByaXYtPnBoeXNfb2JqID0gZGV2X3ByaXYtPm1tLnBoeXNfb2Jqc1tpZCAtIDFdOwotCW9ial9wcml2LT5waHlzX29iai0+Y3VyX29iaiA9IG9iajsKKwlvYmotPnBoeXNfb2JqID0gZGV2X3ByaXYtPm1tLnBoeXNfb2Jqc1tpZCAtIDFdOworCW9iai0+cGh5c19vYmotPmN1cl9vYmogPSBvYmo7CiAKLQlyZXQgPSBpOTE1X2dlbV9vYmplY3RfZ2V0X3BhZ2VzKG9iaiwgMCk7Ci0JaWYgKHJldCkgewotCQlEUk1fRVJST1IoImZhaWxlZCB0byBnZXQgcGFnZSBsaXN0XG4iKTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JcGFnZV9jb3VudCA9IG9iai0+c2l6ZSAvIFBBR0VfU0laRTsKKwlwYWdlX2NvdW50ID0gb2JqLT5iYXNlLnNpemUgLyBQQUdFX1NJWkU7CiAKIAlmb3IgKGkgPSAwOyBpIDwgcGFnZV9jb3VudDsgaSsrKSB7Ci0JCWNoYXIgKnNyYyA9IGttYXBfYXRvbWljKG9ial9wcml2LT5wYWdlc1tpXSk7Ci0JCWNoYXIgKmRzdCA9IG9ial9wcml2LT5waHlzX29iai0+aGFuZGxlLT52YWRkciArIChpICogUEFHRV9TSVpFKTsKKwkJc3RydWN0IHBhZ2UgKnBhZ2U7CisJCWNoYXIgKmRzdCwgKnNyYzsKIAorCQlwYWdlID0gcmVhZF9jYWNoZV9wYWdlX2dmcChtYXBwaW5nLCBpLAorCQkJCQkgICBHRlBfSElHSFVTRVIgfCBfX0dGUF9SRUNMQUlNQUJMRSk7CisJCWlmIChJU19FUlIocGFnZSkpCisJCQlyZXR1cm4gUFRSX0VSUihwYWdlKTsKKworCQlzcmMgPSBrbWFwX2F0b21pYyhwYWdlKTsKKwkJZHN0ID0gb2JqLT5waHlzX29iai0+aGFuZGxlLT52YWRkciArIChpICogUEFHRV9TSVpFKTsKIAkJbWVtY3B5KGRzdCwgc3JjLCBQQUdFX1NJWkUpOwogCQlrdW5tYXBfYXRvbWljKHNyYyk7CisKKwkJbWFya19wYWdlX2FjY2Vzc2VkKHBhZ2UpOworCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CiAJfQogCi0JaTkxNV9nZW1fb2JqZWN0X3B1dF9wYWdlcyhvYmopOwotCiAJcmV0dXJuIDA7Ci1vdXQ6Ci0JcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGludAotaTkxNV9nZW1fcGh5c19wd3JpdGUoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmosCitpOTE1X2dlbV9waHlzX3B3cml0ZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAorCQkgICAgIHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmosCiAJCSAgICAgc3RydWN0IGRybV9pOTE1X2dlbV9wd3JpdGUgKmFyZ3MsCiAJCSAgICAgc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYpCiB7Ci0Jc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9ial9wcml2ID0gdG9faW50ZWxfYm8ob2JqKTsKLQl2b2lkICp2YWRkciA9IG9ial9wcml2LT5waHlzX29iai0+aGFuZGxlLT52YWRkciArIGFyZ3MtPm9mZnNldDsKKwl2b2lkICp2YWRkciA9IG9iai0+cGh5c19vYmotPmhhbmRsZS0+dmFkZHIgKyBhcmdzLT5vZmZzZXQ7CiAJY2hhciBfX3VzZXIgKnVzZXJfZGF0YSA9IChjaGFyIF9fdXNlciAqKSAodWludHB0cl90KSBhcmdzLT5kYXRhX3B0cjsKIAotCURSTV9ERUJVR19EUklWRVIoInZhZGRyICVwLCAlbGxkXG4iLCB2YWRkciwgYXJncy0+c2l6ZSk7Ci0KIAlpZiAoX19jb3B5X2Zyb21fdXNlcl9pbmF0b21pY19ub2NhY2hlKHZhZGRyLCB1c2VyX2RhdGEsIGFyZ3MtPnNpemUpKSB7CiAJCXVuc2lnbmVkIGxvbmcgdW53cml0dGVuOwogCkBAIC01MDM2LDcgKzM5NTYsNyBAQAogCQkJcmV0dXJuIC1FRkFVTFQ7CiAJfQogCi0JZHJtX2FncF9jaGlwc2V0X2ZsdXNoKGRldik7CisJaW50ZWxfZ3R0X2NoaXBzZXRfZmx1c2goKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNTA3NCwxNDQgKzM5OTQsNjggQEAKIH0KIAogc3RhdGljIGludAotaTkxNV9nZW1fc2hyaW5rKHN0cnVjdCBzaHJpbmtlciAqc2hyaW5rLCBpbnQgbnJfdG9fc2NhbiwgZ2ZwX3QgZ2ZwX21hc2spCitpOTE1X2dlbV9pbmFjdGl2ZV9zaHJpbmsoc3RydWN0IHNocmlua2VyICpzaHJpbmtlciwKKwkJCSBpbnQgbnJfdG9fc2NhbiwKKwkJCSBnZnBfdCBnZnBfbWFzaykKIHsKLQlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2LCAqbmV4dF9kZXY7Ci0Jc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9ial9wcml2LCAqbmV4dF9vYmo7Ci0JaW50IGNudCA9IDA7Ci0JaW50IHdvdWxkX2RlYWRsb2NrID0gMTsKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPQorCQljb250YWluZXJfb2Yoc2hyaW5rZXIsCisJCQkgICAgIHN0cnVjdCBkcm1faTkxNV9wcml2YXRlLAorCQkJICAgICBtbS5pbmFjdGl2ZV9zaHJpbmtlcik7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGRldl9wcml2LT5kZXY7CisJc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaiwgKm5leHQ7CisJaW50IGNudDsKKworCWlmICghbXV0ZXhfdHJ5bG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpKQorCQlyZXR1cm4gMDsKIAogCS8qICJmYXN0LXBhdGgiIHRvIGNvdW50IG51bWJlciBvZiBhdmFpbGFibGUgb2JqZWN0cyAqLwogCWlmIChucl90b19zY2FuID09IDApIHsKLQkJc3Bpbl9sb2NrKCZzaHJpbmtfbGlzdF9sb2NrKTsKLQkJbGlzdF9mb3JfZWFjaF9lbnRyeShkZXZfcHJpdiwgJnNocmlua19saXN0LCBtbS5zaHJpbmtfbGlzdCkgewotCQkJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGRldl9wcml2LT5kZXY7Ci0KLQkJCWlmIChtdXRleF90cnlsb2NrKCZkZXYtPnN0cnVjdF9tdXRleCkpIHsKLQkJCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KG9ial9wcml2LAotCQkJCQkJICAgICZkZXZfcHJpdi0+bW0uaW5hY3RpdmVfbGlzdCwKLQkJCQkJCSAgICBtbV9saXN0KQotCQkJCQljbnQrKzsKLQkJCQltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKLQkJCX0KLQkJfQotCQlzcGluX3VubG9jaygmc2hyaW5rX2xpc3RfbG9jayk7Ci0KLQkJcmV0dXJuIChjbnQgLyAxMDApICogc3lzY3RsX3Zmc19jYWNoZV9wcmVzc3VyZTsKKwkJY250ID0gMDsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShvYmosCisJCQkJICAgICZkZXZfcHJpdi0+bW0uaW5hY3RpdmVfbGlzdCwKKwkJCQkgICAgbW1fbGlzdCkKKwkJCWNudCsrOworCQltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKKwkJcmV0dXJuIGNudCAvIDEwMCAqIHN5c2N0bF92ZnNfY2FjaGVfcHJlc3N1cmU7CiAJfQogCi0Jc3Bpbl9sb2NrKCZzaHJpbmtfbGlzdF9sb2NrKTsKLQogcmVzY2FuOgogCS8qIGZpcnN0IHNjYW4gZm9yIGNsZWFuIGJ1ZmZlcnMgKi8KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZGV2X3ByaXYsIG5leHRfZGV2LAotCQkJCSAmc2hyaW5rX2xpc3QsIG1tLnNocmlua19saXN0KSB7Ci0JCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBkZXZfcHJpdi0+ZGV2OworCWk5MTVfZ2VtX3JldGlyZV9yZXF1ZXN0cyhkZXYpOwogCi0JCWlmICghIG11dGV4X3RyeWxvY2soJmRldi0+c3RydWN0X211dGV4KSkKLQkJCWNvbnRpbnVlOwotCi0JCXNwaW5fdW5sb2NrKCZzaHJpbmtfbGlzdF9sb2NrKTsKLQkJaTkxNV9nZW1fcmV0aXJlX3JlcXVlc3RzKGRldik7Ci0KLQkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKG9ial9wcml2LCBuZXh0X29iaiwKLQkJCQkJICZkZXZfcHJpdi0+bW0uaW5hY3RpdmVfbGlzdCwKLQkJCQkJIG1tX2xpc3QpIHsKLQkJCWlmIChpOTE1X2dlbV9vYmplY3RfaXNfcHVyZ2VhYmxlKG9ial9wcml2KSkgewotCQkJCWk5MTVfZ2VtX29iamVjdF91bmJpbmQoJm9ial9wcml2LT5iYXNlKTsKLQkJCQlpZiAoLS1ucl90b19zY2FuIDw9IDApCi0JCQkJCWJyZWFrOwotCQkJfQorCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShvYmosIG5leHQsCisJCQkJICZkZXZfcHJpdi0+bW0uaW5hY3RpdmVfbGlzdCwKKwkJCQkgbW1fbGlzdCkgeworCQlpZiAoaTkxNV9nZW1fb2JqZWN0X2lzX3B1cmdlYWJsZShvYmopKSB7CisJCQlpZiAoaTkxNV9nZW1fb2JqZWN0X3VuYmluZChvYmopID09IDAgJiYKKwkJCSAgICAtLW5yX3RvX3NjYW4gPT0gMCkKKwkJCQlicmVhazsKIAkJfQotCi0JCXNwaW5fbG9jaygmc2hyaW5rX2xpc3RfbG9jayk7Ci0JCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwotCi0JCXdvdWxkX2RlYWRsb2NrID0gMDsKLQotCQlpZiAobnJfdG9fc2NhbiA8PSAwKQotCQkJYnJlYWs7CiAJfQogCiAJLyogc2Vjb25kIHBhc3MsIGV2aWN0L2NvdW50IGFueXRoaW5nIHN0aWxsIG9uIHRoZSBpbmFjdGl2ZSBsaXN0ICovCi0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGRldl9wcml2LCBuZXh0X2RldiwKLQkJCQkgJnNocmlua19saXN0LCBtbS5zaHJpbmtfbGlzdCkgewotCQlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZGV2X3ByaXYtPmRldjsKLQotCQlpZiAoISBtdXRleF90cnlsb2NrKCZkZXYtPnN0cnVjdF9tdXRleCkpCi0JCQljb250aW51ZTsKLQotCQlzcGluX3VubG9jaygmc2hyaW5rX2xpc3RfbG9jayk7Ci0KLQkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKG9ial9wcml2LCBuZXh0X29iaiwKLQkJCQkJICZkZXZfcHJpdi0+bW0uaW5hY3RpdmVfbGlzdCwKLQkJCQkJIG1tX2xpc3QpIHsKLQkJCWlmIChucl90b19zY2FuID4gMCkgewotCQkJCWk5MTVfZ2VtX29iamVjdF91bmJpbmQoJm9ial9wcml2LT5iYXNlKTsKLQkJCQlucl90b19zY2FuLS07Ci0JCQl9IGVsc2UKLQkJCQljbnQrKzsKLQkJfQotCi0JCXNwaW5fbG9jaygmc2hyaW5rX2xpc3RfbG9jayk7Ci0JCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwotCi0JCXdvdWxkX2RlYWRsb2NrID0gMDsKKwljbnQgPSAwOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShvYmosIG5leHQsCisJCQkJICZkZXZfcHJpdi0+bW0uaW5hY3RpdmVfbGlzdCwKKwkJCQkgbW1fbGlzdCkgeworCQlpZiAobnJfdG9fc2NhbiAmJgorCQkgICAgaTkxNV9nZW1fb2JqZWN0X3VuYmluZChvYmopID09IDApCisJCQlucl90b19zY2FuLS07CisJCWVsc2UKKwkJCWNudCsrOwogCX0KIAotCWlmIChucl90b19zY2FuKSB7Ci0JCWludCBhY3RpdmUgPSAwOwotCisJaWYgKG5yX3RvX3NjYW4gJiYgaTkxNV9ncHVfaXNfYWN0aXZlKGRldikpIHsKIAkJLyoKIAkJICogV2UgYXJlIGRlc3BlcmF0ZSBmb3IgcGFnZXMsIHNvIGFzIGEgbGFzdCByZXNvcnQsIHdhaXQKIAkJICogZm9yIHRoZSBHUFUgdG8gZmluaXNoIGFuZCBkaXNjYXJkIHdoYXRldmVyIHdlIGNhbi4KIAkJICogVGhpcyBoYXMgYSBkcmFtYXRpYyBpbXBhY3QgdG8gcmVkdWNlIHRoZSBudW1iZXIgb2YKIAkJICogT09NLWtpbGxlciBldmVudHMgd2hpbHN0IHJ1bm5pbmcgdGhlIEdQVSBhZ2dyZXNzaXZlbHkuCiAJCSAqLwotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRldl9wcml2LCAmc2hyaW5rX2xpc3QsIG1tLnNocmlua19saXN0KSB7Ci0JCQlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZGV2X3ByaXYtPmRldjsKLQotCQkJaWYgKCFtdXRleF90cnlsb2NrKCZkZXYtPnN0cnVjdF9tdXRleCkpCi0JCQkJY29udGludWU7Ci0KLQkJCXNwaW5fdW5sb2NrKCZzaHJpbmtfbGlzdF9sb2NrKTsKLQotCQkJaWYgKGk5MTVfZ3B1X2lzX2FjdGl2ZShkZXYpKSB7Ci0JCQkJaTkxNV9ncHVfaWRsZShkZXYpOwotCQkJCWFjdGl2ZSsrOwotCQkJfQotCi0JCQlzcGluX2xvY2soJnNocmlua19saXN0X2xvY2spOwotCQkJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7Ci0JCX0KLQotCQlpZiAoYWN0aXZlKQorCQlpZiAoaTkxNV9ncHVfaWRsZShkZXYpID09IDApCiAJCQlnb3RvIHJlc2NhbjsKIAl9Ci0KLQlzcGluX3VubG9jaygmc2hyaW5rX2xpc3RfbG9jayk7Ci0KLQlpZiAod291bGRfZGVhZGxvY2spCi0JCXJldHVybiAtMTsKLQllbHNlIGlmIChjbnQgPiAwKQotCQlyZXR1cm4gKGNudCAvIDEwMCkgKiBzeXNjdGxfdmZzX2NhY2hlX3ByZXNzdXJlOwotCWVsc2UKLQkJcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgc2hyaW5rZXIgc2hyaW5rZXIgPSB7Ci0JLnNocmluayA9IGk5MTVfZ2VtX3NocmluaywKLQkuc2Vla3MgPSBERUZBVUxUX1NFRUtTLAotfTsKLQotX19pbml0IHZvaWQKLWk5MTVfZ2VtX3Nocmlua2VyX2luaXQodm9pZCkKLXsKLSAgICByZWdpc3Rlcl9zaHJpbmtlcigmc2hyaW5rZXIpOwotfQotCi1fX2V4aXQgdm9pZAotaTkxNV9nZW1fc2hyaW5rZXJfZXhpdCh2b2lkKQotewotICAgIHVucmVnaXN0ZXJfc2hyaW5rZXIoJnNocmlua2VyKTsKKwltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKKwlyZXR1cm4gY250IC8gMTAwICogc3lzY3RsX3Zmc19jYWNoZV9wcmVzc3VyZTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtX2RlYnVnLmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbV9kZWJ1Zy5jCmluZGV4IDQ4NjQ0YjguLjI5ZDAxNGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtX2RlYnVnLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW1fZGVidWcuYwpAQCAtMTUyLDEzICsxNTIsMTIgQEAKIH0KIAogdm9pZAotaTkxNV9nZW1fZHVtcF9vYmplY3Qoc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmosIGludCBsZW4sCitpOTE1X2dlbV9kdW1wX29iamVjdChzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqLCBpbnQgbGVuLAogCQkgICAgIGNvbnN0IGNoYXIgKndoZXJlLCB1aW50MzJfdCBtYXJrKQogewotCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmpfcHJpdiA9IHRvX2ludGVsX2JvKG9iaik7CiAJaW50IHBhZ2U7CiAKLQlEUk1fSU5GTygiJXM6IG9iamVjdCBhdCBvZmZzZXQgJTA4eFxuIiwgd2hlcmUsIG9ial9wcml2LT5ndHRfb2Zmc2V0KTsKKwlEUk1fSU5GTygiJXM6IG9iamVjdCBhdCBvZmZzZXQgJTA4eFxuIiwgd2hlcmUsIG9iai0+Z3R0X29mZnNldCk7CiAJZm9yIChwYWdlID0gMDsgcGFnZSA8IChsZW4gKyBQQUdFX1NJWkUtMSkgLyBQQUdFX1NJWkU7IHBhZ2UrKykgewogCQlpbnQgcGFnZV9sZW4sIGNodW5rLCBjaHVua19sZW47CiAKQEAgLTE3MCw5ICsxNjksOSBAQAogCQkJY2h1bmtfbGVuID0gcGFnZV9sZW4gLSBjaHVuazsKIAkJCWlmIChjaHVua19sZW4gPiAxMjgpCiAJCQkJY2h1bmtfbGVuID0gMTI4OwotCQkJaTkxNV9nZW1fZHVtcF9wYWdlKG9ial9wcml2LT5wYWdlc1twYWdlXSwKKwkJCWk5MTVfZ2VtX2R1bXBfcGFnZShvYmotPnBhZ2VzW3BhZ2VdLAogCQkJCQkgICBjaHVuaywgY2h1bmsgKyBjaHVua19sZW4sCi0JCQkJCSAgIG9ial9wcml2LT5ndHRfb2Zmc2V0ICsKKwkJCQkJICAgb2JqLT5ndHRfb2Zmc2V0ICsKIAkJCQkJICAgcGFnZSAqIFBBR0VfU0laRSwKIAkJCQkJICAgbWFyayk7CiAJCX0KQEAgLTE4MiwyMSArMTgxLDE5IEBACiAKICNpZiBXQVRDSF9DT0hFUkVOQ1kKIHZvaWQKLWk5MTVfZ2VtX29iamVjdF9jaGVja19jb2hlcmVuY3koc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmosIGludCBoYW5kbGUpCitpOTE1X2dlbV9vYmplY3RfY2hlY2tfY29oZXJlbmN5KHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmosIGludCBoYW5kbGUpCiB7Ci0Jc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IG9iai0+ZGV2OwotCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmpfcHJpdiA9IHRvX2ludGVsX2JvKG9iaik7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IG9iai0+YmFzZS5kZXY7CiAJaW50IHBhZ2U7CiAJdWludDMyX3QgKmd0dF9tYXBwaW5nOwogCXVpbnQzMl90ICpiYWNraW5nX21hcCA9IE5VTEw7CiAJaW50IGJhZF9jb3VudCA9IDA7CiAKIAlEUk1fSU5GTygiJXM6IGNoZWNraW5nIGNvaGVyZW5jeSBvZiBvYmplY3QgJXBAMHglMDh4ICglZCwgJXpka2IpOlxuIiwKLQkJIF9fZnVuY19fLCBvYmosIG9ial9wcml2LT5ndHRfb2Zmc2V0LCBoYW5kbGUsCisJCSBfX2Z1bmNfXywgb2JqLCBvYmotPmd0dF9vZmZzZXQsIGhhbmRsZSwKIAkJIG9iai0+c2l6ZSAvIDEwMjQpOwogCi0JZ3R0X21hcHBpbmcgPSBpb3JlbWFwKGRldi0+YWdwLT5iYXNlICsgb2JqX3ByaXYtPmd0dF9vZmZzZXQsCi0JCQkgICAgICBvYmotPnNpemUpOworCWd0dF9tYXBwaW5nID0gaW9yZW1hcChkZXYtPmFncC0+YmFzZSArIG9iai0+Z3R0X29mZnNldCwgb2JqLT5iYXNlLnNpemUpOwogCWlmIChndHRfbWFwcGluZyA9PSBOVUxMKSB7CiAJCURSTV9FUlJPUigiZmFpbGVkIHRvIG1hcCBHVFQgc3BhY2VcbiIpOwogCQlyZXR1cm47CkBAIC0yMDUsNyArMjAyLDcgQEAKIAlmb3IgKHBhZ2UgPSAwOyBwYWdlIDwgb2JqLT5zaXplIC8gUEFHRV9TSVpFOyBwYWdlKyspIHsKIAkJaW50IGk7CiAKLQkJYmFja2luZ19tYXAgPSBrbWFwX2F0b21pYyhvYmpfcHJpdi0+cGFnZXNbcGFnZV0sIEtNX1VTRVIwKTsKKwkJYmFja2luZ19tYXAgPSBrbWFwX2F0b21pYyhvYmotPnBhZ2VzW3BhZ2VdLCBLTV9VU0VSMCk7CiAKIAkJaWYgKGJhY2tpbmdfbWFwID09IE5VTEwpIHsKIAkJCURSTV9FUlJPUigiZmFpbGVkIHRvIG1hcCBiYWNraW5nIHBhZ2VcbiIpOwpAQCAtMjIwLDcgKzIxNyw3IEBACiAJCQlpZiAoY3B1dmFsICE9IGd0dHZhbCkgewogCQkJCURSTV9JTkZPKCJpbmNvaGVyZW50IENQVSB2cyBHUFUgYXQgMHglMDh4OiAiCiAJCQkJCSAiMHglMDh4IHZzIDB4JTA4eFxuIiwKLQkJCQkJIChpbnQpKG9ial9wcml2LT5ndHRfb2Zmc2V0ICsKKwkJCQkJIChpbnQpKG9iai0+Z3R0X29mZnNldCArCiAJCQkJCSAgICAgICBwYWdlICogUEFHRV9TSVpFICsgaSAqIDQpLAogCQkJCQkgY3B1dmFsLCBndHR2YWwpOwogCQkJCWlmIChiYWRfY291bnQrKyA+PSA4KSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbV9ldmljdC5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW1fZXZpY3QuYwppbmRleCBkOGFlN2QxLi43OGI4Y2Y5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbV9ldmljdC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtX2V2aWN0LmMKQEAgLTMyLDI4ICszMiwzNiBAQAogI2luY2x1ZGUgImk5MTVfZHJtLmgiCiAKIHN0YXRpYyBib29sCi1tYXJrX2ZyZWUoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9ial9wcml2LAotCSAgIHN0cnVjdCBsaXN0X2hlYWQgKnVud2luZCkKK21hcmtfZnJlZShzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqLCBzdHJ1Y3QgbGlzdF9oZWFkICp1bndpbmQpCiB7Ci0JbGlzdF9hZGQoJm9ial9wcml2LT5ldmljdF9saXN0LCB1bndpbmQpOwotCWRybV9nZW1fb2JqZWN0X3JlZmVyZW5jZSgmb2JqX3ByaXYtPmJhc2UpOwotCXJldHVybiBkcm1fbW1fc2Nhbl9hZGRfYmxvY2sob2JqX3ByaXYtPmd0dF9zcGFjZSk7CisJbGlzdF9hZGQoJm9iai0+ZXhlY19saXN0LCB1bndpbmQpOworCWRybV9nZW1fb2JqZWN0X3JlZmVyZW5jZSgmb2JqLT5iYXNlKTsKKwlyZXR1cm4gZHJtX21tX3NjYW5fYWRkX2Jsb2NrKG9iai0+Z3R0X3NwYWNlKTsKIH0KIAogaW50Ci1pOTE1X2dlbV9ldmljdF9zb21ldGhpbmcoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IG1pbl9zaXplLCB1bnNpZ25lZCBhbGlnbm1lbnQpCitpOTE1X2dlbV9ldmljdF9zb21ldGhpbmcoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IG1pbl9zaXplLAorCQkJIHVuc2lnbmVkIGFsaWdubWVudCwgYm9vbCBtYXBwYWJsZSkKIHsKIAlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGV2aWN0aW9uX2xpc3QsIHVud2luZF9saXN0OwotCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmpfcHJpdjsKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqOwogCWludCByZXQgPSAwOwogCiAJaTkxNV9nZW1fcmV0aXJlX3JlcXVlc3RzKGRldik7CiAKIAkvKiBSZS1jaGVjayBmb3IgZnJlZSBzcGFjZSBhZnRlciByZXRpcmluZyByZXF1ZXN0cyAqLwotCWlmIChkcm1fbW1fc2VhcmNoX2ZyZWUoJmRldl9wcml2LT5tbS5ndHRfc3BhY2UsCi0JCQkgICAgICAgbWluX3NpemUsIGFsaWdubWVudCwgMCkpCi0JCXJldHVybiAwOworCWlmIChtYXBwYWJsZSkgeworCQlpZiAoZHJtX21tX3NlYXJjaF9mcmVlX2luX3JhbmdlKCZkZXZfcHJpdi0+bW0uZ3R0X3NwYWNlLAorCQkJCQkJbWluX3NpemUsIGFsaWdubWVudCwgMCwKKwkJCQkJCWRldl9wcml2LT5tbS5ndHRfbWFwcGFibGVfZW5kLAorCQkJCQkJMCkpCisJCQlyZXR1cm4gMDsKKwl9IGVsc2UgeworCQlpZiAoZHJtX21tX3NlYXJjaF9mcmVlKCZkZXZfcHJpdi0+bW0uZ3R0X3NwYWNlLAorCQkJCSAgICAgICBtaW5fc2l6ZSwgYWxpZ25tZW50LCAwKSkKKwkJCXJldHVybiAwOworCX0KIAogCS8qCiAJICogVGhlIGdvYWwgaXMgdG8gZXZpY3Qgb2JqZWN0cyBhbmQgYW1hbGdhbWF0ZSBzcGFjZSBpbiBMUlUgb3JkZXIuCkBAIC03OSw0NSArODcsNTAgQEAKIAkgKi8KIAogCUlOSVRfTElTVF9IRUFEKCZ1bndpbmRfbGlzdCk7Ci0JZHJtX21tX2luaXRfc2NhbigmZGV2X3ByaXYtPm1tLmd0dF9zcGFjZSwgbWluX3NpemUsIGFsaWdubWVudCk7CisJaWYgKG1hcHBhYmxlKQorCQlkcm1fbW1faW5pdF9zY2FuX3dpdGhfcmFuZ2UoJmRldl9wcml2LT5tbS5ndHRfc3BhY2UsIG1pbl9zaXplLAorCQkJCQkgICAgYWxpZ25tZW50LCAwLAorCQkJCQkgICAgZGV2X3ByaXYtPm1tLmd0dF9tYXBwYWJsZV9lbmQpOworCWVsc2UKKwkJZHJtX21tX2luaXRfc2NhbigmZGV2X3ByaXYtPm1tLmd0dF9zcGFjZSwgbWluX3NpemUsIGFsaWdubWVudCk7CiAKIAkvKiBGaXJzdCBzZWUgaWYgdGhlcmUgaXMgYSBsYXJnZSBlbm91Z2ggY29udGlndW91cyBpZGxlIHJlZ2lvbi4uLiAqLwotCWxpc3RfZm9yX2VhY2hfZW50cnkob2JqX3ByaXYsICZkZXZfcHJpdi0+bW0uaW5hY3RpdmVfbGlzdCwgbW1fbGlzdCkgewotCQlpZiAobWFya19mcmVlKG9ial9wcml2LCAmdW53aW5kX2xpc3QpKQorCWxpc3RfZm9yX2VhY2hfZW50cnkob2JqLCAmZGV2X3ByaXYtPm1tLmluYWN0aXZlX2xpc3QsIG1tX2xpc3QpIHsKKwkJaWYgKG1hcmtfZnJlZShvYmosICZ1bndpbmRfbGlzdCkpCiAJCQlnb3RvIGZvdW5kOwogCX0KIAogCS8qIE5vdyBtZXJnZSBpbiB0aGUgc29vbi10by1iZS1leHBpcmVkIG9iamVjdHMuLi4gKi8KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KG9ial9wcml2LCAmZGV2X3ByaXYtPm1tLmFjdGl2ZV9saXN0LCBtbV9saXN0KSB7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShvYmosICZkZXZfcHJpdi0+bW0uYWN0aXZlX2xpc3QsIG1tX2xpc3QpIHsKIAkJLyogRG9lcyB0aGUgb2JqZWN0IHJlcXVpcmUgYW4gb3V0c3RhbmRpbmcgZmx1c2g/ICovCi0JCWlmIChvYmpfcHJpdi0+YmFzZS53cml0ZV9kb21haW4gfHwgb2JqX3ByaXYtPnBpbl9jb3VudCkKKwkJaWYgKG9iai0+YmFzZS53cml0ZV9kb21haW4gfHwgb2JqLT5waW5fY291bnQpCiAJCQljb250aW51ZTsKIAotCQlpZiAobWFya19mcmVlKG9ial9wcml2LCAmdW53aW5kX2xpc3QpKQorCQlpZiAobWFya19mcmVlKG9iaiwgJnVud2luZF9saXN0KSkKIAkJCWdvdG8gZm91bmQ7CiAJfQogCiAJLyogRmluYWxseSBhZGQgYW55dGhpbmcgd2l0aCBhIHBlbmRpbmcgZmx1c2ggKGluIG9yZGVyIG9mIHJldGlyZW1lbnQpICovCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShvYmpfcHJpdiwgJmRldl9wcml2LT5tbS5mbHVzaGluZ19saXN0LCBtbV9saXN0KSB7Ci0JCWlmIChvYmpfcHJpdi0+cGluX2NvdW50KQorCWxpc3RfZm9yX2VhY2hfZW50cnkob2JqLCAmZGV2X3ByaXYtPm1tLmZsdXNoaW5nX2xpc3QsIG1tX2xpc3QpIHsKKwkJaWYgKG9iai0+cGluX2NvdW50KQogCQkJY29udGludWU7CiAKLQkJaWYgKG1hcmtfZnJlZShvYmpfcHJpdiwgJnVud2luZF9saXN0KSkKKwkJaWYgKG1hcmtfZnJlZShvYmosICZ1bndpbmRfbGlzdCkpCiAJCQlnb3RvIGZvdW5kOwogCX0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KG9ial9wcml2LCAmZGV2X3ByaXYtPm1tLmFjdGl2ZV9saXN0LCBtbV9saXN0KSB7Ci0JCWlmICghIG9ial9wcml2LT5iYXNlLndyaXRlX2RvbWFpbiB8fCBvYmpfcHJpdi0+cGluX2NvdW50KQorCWxpc3RfZm9yX2VhY2hfZW50cnkob2JqLCAmZGV2X3ByaXYtPm1tLmFjdGl2ZV9saXN0LCBtbV9saXN0KSB7CisJCWlmICghIG9iai0+YmFzZS53cml0ZV9kb21haW4gfHwgb2JqLT5waW5fY291bnQpCiAJCQljb250aW51ZTsKIAotCQlpZiAobWFya19mcmVlKG9ial9wcml2LCAmdW53aW5kX2xpc3QpKQorCQlpZiAobWFya19mcmVlKG9iaiwgJnVud2luZF9saXN0KSkKIAkJCWdvdG8gZm91bmQ7CiAJfQogCiAJLyogTm90aGluZyBmb3VuZCwgY2xlYW4gdXAgYW5kIGJhaWwgb3V0ISAqLwotCWxpc3RfZm9yX2VhY2hfZW50cnkob2JqX3ByaXYsICZ1bndpbmRfbGlzdCwgZXZpY3RfbGlzdCkgewotCQlyZXQgPSBkcm1fbW1fc2Nhbl9yZW1vdmVfYmxvY2sob2JqX3ByaXYtPmd0dF9zcGFjZSk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShvYmosICZ1bndpbmRfbGlzdCwgZXhlY19saXN0KSB7CisJCXJldCA9IGRybV9tbV9zY2FuX3JlbW92ZV9ibG9jayhvYmotPmd0dF9zcGFjZSk7CiAJCUJVR19PTihyZXQpOwotCQlkcm1fZ2VtX29iamVjdF91bnJlZmVyZW5jZSgmb2JqX3ByaXYtPmJhc2UpOworCQlkcm1fZ2VtX29iamVjdF91bnJlZmVyZW5jZSgmb2JqLT5iYXNlKTsKIAl9CiAKIAkvKiBXZSBleHBlY3QgdGhlIGNhbGxlciB0byB1bnBpbiwgZXZpY3QgYWxsIGFuZCB0cnkgYWdhaW4sIG9yIGdpdmUgdXAuCkBAIC0xMzEsMzMgKzE0NCwzMyBAQAogCSAqIHRlbXBvcmFyeSBsaXN0LiAqLwogCUlOSVRfTElTVF9IRUFEKCZldmljdGlvbl9saXN0KTsKIAl3aGlsZSAoIWxpc3RfZW1wdHkoJnVud2luZF9saXN0KSkgewotCQlvYmpfcHJpdiA9IGxpc3RfZmlyc3RfZW50cnkoJnVud2luZF9saXN0LAotCQkJCQkgICAgc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QsCi0JCQkJCSAgICBldmljdF9saXN0KTsKLQkJaWYgKGRybV9tbV9zY2FuX3JlbW92ZV9ibG9jayhvYmpfcHJpdi0+Z3R0X3NwYWNlKSkgewotCQkJbGlzdF9tb3ZlKCZvYmpfcHJpdi0+ZXZpY3RfbGlzdCwgJmV2aWN0aW9uX2xpc3QpOworCQlvYmogPSBsaXN0X2ZpcnN0X2VudHJ5KCZ1bndpbmRfbGlzdCwKKwkJCQkgICAgICAgc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QsCisJCQkJICAgICAgIGV4ZWNfbGlzdCk7CisJCWlmIChkcm1fbW1fc2Nhbl9yZW1vdmVfYmxvY2sob2JqLT5ndHRfc3BhY2UpKSB7CisJCQlsaXN0X21vdmUoJm9iai0+ZXhlY19saXN0LCAmZXZpY3Rpb25fbGlzdCk7CiAJCQljb250aW51ZTsKIAkJfQotCQlsaXN0X2RlbCgmb2JqX3ByaXYtPmV2aWN0X2xpc3QpOwotCQlkcm1fZ2VtX29iamVjdF91bnJlZmVyZW5jZSgmb2JqX3ByaXYtPmJhc2UpOworCQlsaXN0X2RlbF9pbml0KCZvYmotPmV4ZWNfbGlzdCk7CisJCWRybV9nZW1fb2JqZWN0X3VucmVmZXJlbmNlKCZvYmotPmJhc2UpOwogCX0KIAogCS8qIFVuYmluZGluZyB3aWxsIGVtaXQgYW55IHJlcXVpcmVkIGZsdXNoZXMgKi8KIAl3aGlsZSAoIWxpc3RfZW1wdHkoJmV2aWN0aW9uX2xpc3QpKSB7Ci0JCW9ial9wcml2ID0gbGlzdF9maXJzdF9lbnRyeSgmZXZpY3Rpb25fbGlzdCwKLQkJCQkJICAgIHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0LAotCQkJCQkgICAgZXZpY3RfbGlzdCk7CisJCW9iaiA9IGxpc3RfZmlyc3RfZW50cnkoJmV2aWN0aW9uX2xpc3QsCisJCQkJICAgICAgIHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0LAorCQkJCSAgICAgICBleGVjX2xpc3QpOwogCQlpZiAocmV0ID09IDApCi0JCQlyZXQgPSBpOTE1X2dlbV9vYmplY3RfdW5iaW5kKCZvYmpfcHJpdi0+YmFzZSk7Ci0JCWxpc3RfZGVsKCZvYmpfcHJpdi0+ZXZpY3RfbGlzdCk7Ci0JCWRybV9nZW1fb2JqZWN0X3VucmVmZXJlbmNlKCZvYmpfcHJpdi0+YmFzZSk7CisJCQlyZXQgPSBpOTE1X2dlbV9vYmplY3RfdW5iaW5kKG9iaik7CisJCWxpc3RfZGVsX2luaXQoJm9iai0+ZXhlY19saXN0KTsKKwkJZHJtX2dlbV9vYmplY3RfdW5yZWZlcmVuY2UoJm9iai0+YmFzZSk7CiAJfQogCiAJcmV0dXJuIHJldDsKIH0KIAogaW50Ci1pOTE1X2dlbV9ldmljdF9ldmVyeXRoaW5nKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCitpOTE1X2dlbV9ldmljdF9ldmVyeXRoaW5nKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGJvb2wgcHVyZ2VhYmxlX29ubHkpCiB7CiAJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJaW50IHJldDsKQEAgLTE3NiwzNiArMTg5LDIyIEBACiAKIAlCVUdfT04oIWxpc3RfZW1wdHkoJmRldl9wcml2LT5tbS5mbHVzaGluZ19saXN0KSk7CiAKLQlyZXQgPSBpOTE1X2dlbV9ldmljdF9pbmFjdGl2ZShkZXYpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQlsaXN0c19lbXB0eSA9IChsaXN0X2VtcHR5KCZkZXZfcHJpdi0+bW0uaW5hY3RpdmVfbGlzdCkgJiYKLQkJICAgICAgIGxpc3RfZW1wdHkoJmRldl9wcml2LT5tbS5mbHVzaGluZ19saXN0KSAmJgotCQkgICAgICAgbGlzdF9lbXB0eSgmZGV2X3ByaXYtPm1tLmFjdGl2ZV9saXN0KSk7Ci0JQlVHX09OKCFsaXN0c19lbXB0eSk7Ci0KLQlyZXR1cm4gMDsKKwlyZXR1cm4gaTkxNV9nZW1fZXZpY3RfaW5hY3RpdmUoZGV2LCBwdXJnZWFibGVfb25seSk7CiB9CiAKIC8qKiBVbmJpbmRzIGFsbCBpbmFjdGl2ZSBvYmplY3RzLiAqLwogaW50Ci1pOTE1X2dlbV9ldmljdF9pbmFjdGl2ZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoraTkxNV9nZW1fZXZpY3RfaW5hY3RpdmUoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgYm9vbCBwdXJnZWFibGVfb25seSkKIHsKIAlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqLCAqbmV4dDsKIAotCXdoaWxlICghbGlzdF9lbXB0eSgmZGV2X3ByaXYtPm1tLmluYWN0aXZlX2xpc3QpKSB7Ci0JCXN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqOwotCQlpbnQgcmV0OwotCi0JCW9iaiA9ICZsaXN0X2ZpcnN0X2VudHJ5KCZkZXZfcHJpdi0+bW0uaW5hY3RpdmVfbGlzdCwKLQkJCQkJc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QsCi0JCQkJCW1tX2xpc3QpLT5iYXNlOwotCi0JCXJldCA9IGk5MTVfZ2VtX29iamVjdF91bmJpbmQob2JqKTsKLQkJaWYgKHJldCAhPSAwKSB7Ci0JCQlEUk1fRVJST1IoIkVycm9yIHVuYmluZGluZyBvYmplY3Q6ICVkXG4iLCByZXQpOwotCQkJcmV0dXJuIHJldDsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUob2JqLCBuZXh0LAorCQkJCSAmZGV2X3ByaXYtPm1tLmluYWN0aXZlX2xpc3QsIG1tX2xpc3QpIHsKKwkJaWYgKCFwdXJnZWFibGVfb25seSB8fCBvYmotPm1hZHYgIT0gSTkxNV9NQURWX1dJTExORUVEKSB7CisJCQlpbnQgcmV0ID0gaTkxNV9nZW1fb2JqZWN0X3VuYmluZChvYmopOworCQkJaWYgKHJldCkKKwkJCQlyZXR1cm4gcmV0OwogCQl9CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbV9leGVjYnVmZmVyLmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbV9leGVjYnVmZmVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjExMjllNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtX2V4ZWNidWZmZXIuYwpAQCAtMCwwICsxLDEzNDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAwOCwyMDEwIEludGVsIENvcnBvcmF0aW9uCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUworICogSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIEF1dGhvcnM6CisgKiAgICBFcmljIEFuaG9sdCA8ZXJpY0BhbmhvbHQubmV0PgorICogICAgQ2hyaXMgV2lsc29uIDxjaHJpc0BjaHJpcy13aWxzb24uY28udWs+CisgKgorICovCisKKyNpbmNsdWRlICJkcm1QLmgiCisjaW5jbHVkZSAiZHJtLmgiCisjaW5jbHVkZSAiaTkxNV9kcm0uaCIKKyNpbmNsdWRlICJpOTE1X2Rydi5oIgorI2luY2x1ZGUgImk5MTVfdHJhY2UuaCIKKyNpbmNsdWRlICJpbnRlbF9kcnYuaCIKKworc3RydWN0IGNoYW5nZV9kb21haW5zIHsKKwl1aW50MzJfdCBpbnZhbGlkYXRlX2RvbWFpbnM7CisJdWludDMyX3QgZmx1c2hfZG9tYWluczsKKwl1aW50MzJfdCBmbHVzaF9yaW5nczsKK307CisKKy8qCisgKiBTZXQgdGhlIG5leHQgZG9tYWluIGZvciB0aGUgc3BlY2lmaWVkIG9iamVjdC4gVGhpcworICogbWF5IG5vdCBhY3R1YWxseSBwZXJmb3JtIHRoZSBuZWNlc3NhcnkgZmx1c2hpbmcvaW52YWxpZGluZyB0aG91Z2gsCisgKiBhcyB0aGF0IG1heSB3YW50IHRvIGJlIGJhdGNoZWQgd2l0aCBvdGhlciBzZXRfZG9tYWluIG9wZXJhdGlvbnMKKyAqCisgKiBUaGlzIGlzICh3ZSBob3BlKSB0aGUgb25seSByZWFsbHkgdHJpY2t5IHBhcnQgb2YgZ2VtLiBUaGUgZ29hbAorICogaXMgZmFpcmx5IHNpbXBsZSAtLSB0cmFjayB3aGljaCBjYWNoZXMgaG9sZCBiaXRzIG9mIHRoZSBvYmplY3QKKyAqIGFuZCBtYWtlIHN1cmUgdGhleSByZW1haW4gY29oZXJlbnQuIEEgZmV3IGNvbmNyZXRlIGV4YW1wbGVzIG1heQorICogaGVscCB0byBleHBsYWluIGhvdyBpdCB3b3Jrcy4gRm9yIHNob3J0aGFuZCwgd2UgdXNlIHRoZSBub3RhdGlvbgorICogKHJlYWRfZG9tYWlucywgd3JpdGVfZG9tYWluKSwgZS5nLiAoQ1BVLCBDUFUpIHRvIGluZGljYXRlIHRoZQorICogYSBwYWlyIG9mIHJlYWQgYW5kIHdyaXRlIGRvbWFpbiBtYXNrcy4KKyAqCisgKiBDYXNlIDE6IHRoZSBiYXRjaCBidWZmZXIKKyAqCisgKgkxLiBBbGxvY2F0ZWQKKyAqCTIuIFdyaXR0ZW4gYnkgQ1BVCisgKgkzLiBNYXBwZWQgdG8gR1RUCisgKgk0LiBSZWFkIGJ5IEdQVQorICoJNS4gVW5tYXBwZWQgZnJvbSBHVFQKKyAqCTYuIEZyZWVkCisgKgorICoJTGV0J3MgdGFrZSB0aGVzZSBhIHN0ZXAgYXQgYSB0aW1lCisgKgorICoJMS4gQWxsb2NhdGVkCisgKgkJUGFnZXMgYWxsb2NhdGVkIGZyb20gdGhlIGtlcm5lbCBtYXkgc3RpbGwgaGF2ZQorICoJCWNhY2hlIGNvbnRlbnRzLCBzbyB3ZSBzZXQgdGhlbSB0byAoQ1BVLCBDUFUpIGFsd2F5cy4KKyAqCTIuIFdyaXR0ZW4gYnkgQ1BVICh1c2luZyBwd3JpdGUpCisgKgkJVGhlIHB3cml0ZSBmdW5jdGlvbiBjYWxscyBzZXRfZG9tYWluIChDUFUsIENQVSkgYW5kCisgKgkJdGhpcyBmdW5jdGlvbiBkb2VzIG5vdGhpbmcgKGFzIG5vdGhpbmcgY2hhbmdlcykKKyAqCTMuIE1hcHBlZCBieSBHVFQKKyAqCQlUaGlzIGZ1bmN0aW9uIGFzc2VydHMgdGhhdCB0aGUgb2JqZWN0IGlzIG5vdAorICoJCWN1cnJlbnRseSBpbiBhbnkgR1BVLWJhc2VkIHJlYWQgb3Igd3JpdGUgZG9tYWlucworICoJNC4gUmVhZCBieSBHUFUKKyAqCQlpOTE1X2dlbV9leGVjYnVmZmVyIGNhbGxzIHNldF9kb21haW4gKENPTU1BTkQsIDApLgorICoJCUFzIHdyaXRlX2RvbWFpbiBpcyB6ZXJvLCB0aGlzIGZ1bmN0aW9uIGFkZHMgaW4gdGhlCisgKgkJY3VycmVudCByZWFkIGRvbWFpbnMgKENQVStDT01NQU5ELCAwKS4KKyAqCQlmbHVzaF9kb21haW5zIGlzIHNldCB0byBDUFUuCisgKgkJaW52YWxpZGF0ZV9kb21haW5zIGlzIHNldCB0byBDT01NQU5ECisgKgkJY2xmbHVzaCBpcyBydW4gdG8gZ2V0IGRhdGEgb3V0IG9mIHRoZSBDUFUgY2FjaGVzCisgKgkJdGhlbiBpOTE1X2Rldl9zZXRfZG9tYWluIGNhbGxzIGk5MTVfZ2VtX2ZsdXNoIHRvCisgKgkJZW1pdCBhbiBNSV9GTFVTSCBhbmQgZHJtX2FncF9jaGlwc2V0X2ZsdXNoCisgKgk1LiBVbm1hcHBlZCBmcm9tIEdUVAorICoJCWk5MTVfZ2VtX29iamVjdF91bmJpbmQgY2FsbHMgc2V0X2RvbWFpbiAoQ1BVLCBDUFUpCisgKgkJZmx1c2hfZG9tYWlucyBhbmQgaW52YWxpZGF0ZV9kb21haW5zIGVuZCB1cCBib3RoIHplcm8KKyAqCQlzbyBubyBmbHVzaGluZy9pbnZhbGlkYXRpbmcgaGFwcGVucworICoJNi4gRnJlZWQKKyAqCQl5YXksIGRvbmUKKyAqCisgKiBDYXNlIDI6IFRoZSBzaGFyZWQgcmVuZGVyIGJ1ZmZlcgorICoKKyAqCTEuIEFsbG9jYXRlZAorICoJMi4gTWFwcGVkIHRvIEdUVAorICoJMy4gUmVhZC93cml0dGVuIGJ5IEdQVQorICoJNC4gc2V0X2RvbWFpbiB0byAoQ1BVLENQVSkKKyAqCTUuIFJlYWQvd3JpdHRlbiBieSBDUFUKKyAqCTYuIFJlYWQvd3JpdHRlbiBieSBHUFUKKyAqCisgKgkxLiBBbGxvY2F0ZWQKKyAqCQlTYW1lIGFzIGxhc3QgZXhhbXBsZSwgKENQVSwgQ1BVKQorICoJMi4gTWFwcGVkIHRvIEdUVAorICoJCU5vdGhpbmcgY2hhbmdlcyAoYXNzZXJ0aW9ucyBmaW5kIHRoYXQgaXQgaXMgbm90IGluIHRoZSBHUFUpCisgKgkzLiBSZWFkL3dyaXR0ZW4gYnkgR1BVCisgKgkJZXhlY2J1ZmZlciBjYWxscyBzZXRfZG9tYWluIChSRU5ERVIsIFJFTkRFUikKKyAqCQlmbHVzaF9kb21haW5zIGdldHMgQ1BVCisgKgkJaW52YWxpZGF0ZV9kb21haW5zIGdldHMgR1BVCisgKgkJY2xmbHVzaCAob2JqKQorICoJCU1JX0ZMVVNIIGFuZCBkcm1fYWdwX2NoaXBzZXRfZmx1c2gKKyAqCTQuIHNldF9kb21haW4gKENQVSwgQ1BVKQorICoJCWZsdXNoX2RvbWFpbnMgZ2V0cyBHUFUKKyAqCQlpbnZhbGlkYXRlX2RvbWFpbnMgZ2V0cyBDUFUKKyAqCQl3YWl0X3JlbmRlcmluZyAob2JqKSB0byBtYWtlIHN1cmUgYWxsIGRyYXdpbmcgaXMgY29tcGxldGUuCisgKgkJVGhpcyB3aWxsIGluY2x1ZGUgYW4gTUlfRkxVU0ggdG8gZ2V0IHRoZSBkYXRhIGZyb20gR1BVCisgKgkJdG8gbWVtb3J5CisgKgkJY2xmbHVzaCAob2JqKSB0byBpbnZhbGlkYXRlIHRoZSBDUFUgY2FjaGUKKyAqCQlBbm90aGVyIE1JX0ZMVVNIIGluIGk5MTVfZ2VtX2ZsdXNoIChlbGltaW5hdGUgdGhpcyBzb21laG93PykKKyAqCTUuIFJlYWQvd3JpdHRlbiBieSBDUFUKKyAqCQljYWNoZSBsaW5lcyBhcmUgbG9hZGVkIGFuZCBkaXJ0aWVkCisgKgk2LiBSZWFkIHdyaXR0ZW4gYnkgR1BVCisgKgkJU2FtZSBhcyBsYXN0IEdQVSBhY2Nlc3MKKyAqCisgKiBDYXNlIDM6IFRoZSBjb25zdGFudCBidWZmZXIKKyAqCisgKgkxLiBBbGxvY2F0ZWQKKyAqCTIuIFdyaXR0ZW4gYnkgQ1BVCisgKgkzLiBSZWFkIGJ5IEdQVQorICoJNC4gVXBkYXRlZCAod3JpdHRlbikgYnkgQ1BVIGFnYWluCisgKgk1LiBSZWFkIGJ5IEdQVQorICoKKyAqCTEuIEFsbG9jYXRlZAorICoJCShDUFUsIENQVSkKKyAqCTIuIFdyaXR0ZW4gYnkgQ1BVCisgKgkJKENQVSwgQ1BVKQorICoJMy4gUmVhZCBieSBHUFUKKyAqCQkoQ1BVK1JFTkRFUiwgMCkKKyAqCQlmbHVzaF9kb21haW5zID0gQ1BVCisgKgkJaW52YWxpZGF0ZV9kb21haW5zID0gUkVOREVSCisgKgkJY2xmbHVzaCAob2JqKQorICoJCU1JX0ZMVVNICisgKgkJZHJtX2FncF9jaGlwc2V0X2ZsdXNoCisgKgk0LiBVcGRhdGVkICh3cml0dGVuKSBieSBDUFUgYWdhaW4KKyAqCQkoQ1BVLCBDUFUpCisgKgkJZmx1c2hfZG9tYWlucyA9IDAgKG5vIHByZXZpb3VzIHdyaXRlIGRvbWFpbikKKyAqCQlpbnZhbGlkYXRlX2RvbWFpbnMgPSAwIChubyBuZXcgcmVhZCBkb21haW5zKQorICoJNS4gUmVhZCBieSBHUFUKKyAqCQkoQ1BVK1JFTkRFUiwgMCkKKyAqCQlmbHVzaF9kb21haW5zID0gQ1BVCisgKgkJaW52YWxpZGF0ZV9kb21haW5zID0gUkVOREVSCisgKgkJY2xmbHVzaCAob2JqKQorICoJCU1JX0ZMVVNICisgKgkJZHJtX2FncF9jaGlwc2V0X2ZsdXNoCisgKi8KK3N0YXRpYyB2b2lkCitpOTE1X2dlbV9vYmplY3Rfc2V0X3RvX2dwdV9kb21haW4oc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaiwKKwkJCQkgIHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZywKKwkJCQkgIHN0cnVjdCBjaGFuZ2VfZG9tYWlucyAqY2QpCit7CisJdWludDMyX3QgaW52YWxpZGF0ZV9kb21haW5zID0gMCwgZmx1c2hfZG9tYWlucyA9IDA7CisKKwkvKgorCSAqIElmIHRoZSBvYmplY3QgaXNuJ3QgbW92aW5nIHRvIGEgbmV3IHdyaXRlIGRvbWFpbiwKKwkgKiBsZXQgdGhlIG9iamVjdCBzdGF5IGluIG11bHRpcGxlIHJlYWQgZG9tYWlucworCSAqLworCWlmIChvYmotPmJhc2UucGVuZGluZ193cml0ZV9kb21haW4gPT0gMCkKKwkJb2JqLT5iYXNlLnBlbmRpbmdfcmVhZF9kb21haW5zIHw9IG9iai0+YmFzZS5yZWFkX2RvbWFpbnM7CisKKwkvKgorCSAqIEZsdXNoIHRoZSBjdXJyZW50IHdyaXRlIGRvbWFpbiBpZgorCSAqIHRoZSBuZXcgcmVhZCBkb21haW5zIGRvbid0IG1hdGNoLiBJbnZhbGlkYXRlCisJICogYW55IHJlYWQgZG9tYWlucyB3aGljaCBkaWZmZXIgZnJvbSB0aGUgb2xkCisJICogd3JpdGUgZG9tYWluCisJICovCisJaWYgKG9iai0+YmFzZS53cml0ZV9kb21haW4gJiYKKwkgICAgKCgob2JqLT5iYXNlLndyaXRlX2RvbWFpbiAhPSBvYmotPmJhc2UucGVuZGluZ19yZWFkX2RvbWFpbnMgfHwKKwkgICAgICAgb2JqLT5yaW5nICE9IHJpbmcpKSB8fAorCSAgICAgKG9iai0+ZmVuY2VkX2dwdV9hY2Nlc3MgJiYgIW9iai0+cGVuZGluZ19mZW5jZWRfZ3B1X2FjY2VzcykpKSB7CisJCWZsdXNoX2RvbWFpbnMgfD0gb2JqLT5iYXNlLndyaXRlX2RvbWFpbjsKKwkJaW52YWxpZGF0ZV9kb21haW5zIHw9CisJCQlvYmotPmJhc2UucGVuZGluZ19yZWFkX2RvbWFpbnMgJiB+b2JqLT5iYXNlLndyaXRlX2RvbWFpbjsKKwl9CisJLyoKKwkgKiBJbnZhbGlkYXRlIGFueSByZWFkIGNhY2hlcyB3aGljaCBtYXkgaGF2ZQorCSAqIHN0YWxlIGRhdGEuIFRoYXQgaXMsIGFueSBuZXcgcmVhZCBkb21haW5zLgorCSAqLworCWludmFsaWRhdGVfZG9tYWlucyB8PSBvYmotPmJhc2UucGVuZGluZ19yZWFkX2RvbWFpbnMgJiB+b2JqLT5iYXNlLnJlYWRfZG9tYWluczsKKwlpZiAoKGZsdXNoX2RvbWFpbnMgfCBpbnZhbGlkYXRlX2RvbWFpbnMpICYgSTkxNV9HRU1fRE9NQUlOX0NQVSkKKwkJaTkxNV9nZW1fY2xmbHVzaF9vYmplY3Qob2JqKTsKKworCS8qIGJsb3cgYXdheSBtYXBwaW5ncyBpZiBtYXBwZWQgdGhyb3VnaCBHVFQgKi8KKwlpZiAoKGZsdXNoX2RvbWFpbnMgfCBpbnZhbGlkYXRlX2RvbWFpbnMpICYgSTkxNV9HRU1fRE9NQUlOX0dUVCkKKwkJaTkxNV9nZW1fcmVsZWFzZV9tbWFwKG9iaik7CisKKwkvKiBUaGUgYWN0dWFsIG9iai0+d3JpdGVfZG9tYWluIHdpbGwgYmUgdXBkYXRlZCB3aXRoCisJICogcGVuZGluZ193cml0ZV9kb21haW4gYWZ0ZXIgd2UgZW1pdCB0aGUgYWNjdW11bGF0ZWQgZmx1c2ggZm9yIGFsbAorCSAqIG9mIG91ciBkb21haW4gY2hhbmdlcyBpbiBleGVjYnVmZmVycyAod2hpY2ggY2xlYXJzIG9iamVjdHMnCisJICogd3JpdGVfZG9tYWlucykuICBTbyBpZiB3ZSBoYXZlIGEgY3VycmVudCB3cml0ZSBkb21haW4gdGhhdCB3ZQorCSAqIGFyZW4ndCBjaGFuZ2luZywgc2V0IHBlbmRpbmdfd3JpdGVfZG9tYWluIHRvIHRoYXQuCisJICovCisJaWYgKGZsdXNoX2RvbWFpbnMgPT0gMCAmJiBvYmotPmJhc2UucGVuZGluZ193cml0ZV9kb21haW4gPT0gMCkKKwkJb2JqLT5iYXNlLnBlbmRpbmdfd3JpdGVfZG9tYWluID0gb2JqLT5iYXNlLndyaXRlX2RvbWFpbjsKKworCWNkLT5pbnZhbGlkYXRlX2RvbWFpbnMgfD0gaW52YWxpZGF0ZV9kb21haW5zOworCWNkLT5mbHVzaF9kb21haW5zIHw9IGZsdXNoX2RvbWFpbnM7CisJaWYgKGZsdXNoX2RvbWFpbnMgJiBJOTE1X0dFTV9HUFVfRE9NQUlOUykKKwkJY2QtPmZsdXNoX3JpbmdzIHw9IG9iai0+cmluZy0+aWQ7CisJaWYgKGludmFsaWRhdGVfZG9tYWlucyAmIEk5MTVfR0VNX0dQVV9ET01BSU5TKQorCQljZC0+Zmx1c2hfcmluZ3MgfD0gcmluZy0+aWQ7Cit9CisKK3N0cnVjdCBlYl9vYmplY3RzIHsKKwlpbnQgYW5kOworCXN0cnVjdCBobGlzdF9oZWFkIGJ1Y2tldHNbMF07Cit9OworCitzdGF0aWMgc3RydWN0IGViX29iamVjdHMgKgorZWJfY3JlYXRlKGludCBzaXplKQoreworCXN0cnVjdCBlYl9vYmplY3RzICplYjsKKwlpbnQgY291bnQgPSBQQUdFX1NJWkUgLyBzaXplb2Yoc3RydWN0IGhsaXN0X2hlYWQpIC8gMjsKKwl3aGlsZSAoY291bnQgPiBzaXplKQorCQljb3VudCA+Pj0gMTsKKwllYiA9IGt6YWxsb2MoY291bnQqc2l6ZW9mKHN0cnVjdCBobGlzdF9oZWFkKSArCisJCSAgICAgc2l6ZW9mKHN0cnVjdCBlYl9vYmplY3RzKSwKKwkJICAgICBHRlBfS0VSTkVMKTsKKwlpZiAoZWIgPT0gTlVMTCkKKwkJcmV0dXJuIGViOworCisJZWItPmFuZCA9IGNvdW50IC0gMTsKKwlyZXR1cm4gZWI7Cit9CisKK3N0YXRpYyB2b2lkCitlYl9yZXNldChzdHJ1Y3QgZWJfb2JqZWN0cyAqZWIpCit7CisJbWVtc2V0KGViLT5idWNrZXRzLCAwLCAoZWItPmFuZCsxKSpzaXplb2Yoc3RydWN0IGhsaXN0X2hlYWQpKTsKK30KKworc3RhdGljIHZvaWQKK2ViX2FkZF9vYmplY3Qoc3RydWN0IGViX29iamVjdHMgKmViLCBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqKQoreworCWhsaXN0X2FkZF9oZWFkKCZvYmotPmV4ZWNfbm9kZSwKKwkJICAgICAgICZlYi0+YnVja2V0c1tvYmotPmV4ZWNfaGFuZGxlICYgZWItPmFuZF0pOworfQorCitzdGF0aWMgc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKgorZWJfZ2V0X29iamVjdChzdHJ1Y3QgZWJfb2JqZWN0cyAqZWIsIHVuc2lnbmVkIGxvbmcgaGFuZGxlKQoreworCXN0cnVjdCBobGlzdF9oZWFkICpoZWFkOworCXN0cnVjdCBobGlzdF9ub2RlICpub2RlOworCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmo7CisKKwloZWFkID0gJmViLT5idWNrZXRzW2hhbmRsZSAmIGViLT5hbmRdOworCWhsaXN0X2Zvcl9lYWNoKG5vZGUsIGhlYWQpIHsKKwkJb2JqID0gaGxpc3RfZW50cnkobm9kZSwgc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QsIGV4ZWNfbm9kZSk7CisJCWlmIChvYmotPmV4ZWNfaGFuZGxlID09IGhhbmRsZSkKKwkJCXJldHVybiBvYmo7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkCitlYl9kZXN0cm95KHN0cnVjdCBlYl9vYmplY3RzICplYikKK3sKKwlrZnJlZShlYik7Cit9CisKK3N0YXRpYyBpbnQKK2k5MTVfZ2VtX2V4ZWNidWZmZXJfcmVsb2NhdGVfZW50cnkoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaiwKKwkJCQkgICBzdHJ1Y3QgZWJfb2JqZWN0cyAqZWIsCisJCQkJICAgc3RydWN0IGRybV9pOTE1X2dlbV9leGVjX29iamVjdDIgKmVudHJ5LAorCQkJCSAgIHN0cnVjdCBkcm1faTkxNV9nZW1fcmVsb2NhdGlvbl9lbnRyeSAqcmVsb2MpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IG9iai0+YmFzZS5kZXY7CisJc3RydWN0IGRybV9nZW1fb2JqZWN0ICp0YXJnZXRfb2JqOworCXVpbnQzMl90IHRhcmdldF9vZmZzZXQ7CisJaW50IHJldCA9IC1FSU5WQUw7CisKKwkvKiB3ZSd2ZSBhbHJlYWR5IGhvbGQgYSByZWZlcmVuY2UgdG8gYWxsIHZhbGlkIG9iamVjdHMgKi8KKwl0YXJnZXRfb2JqID0gJmViX2dldF9vYmplY3QoZWIsIHJlbG9jLT50YXJnZXRfaGFuZGxlKS0+YmFzZTsKKwlpZiAodW5saWtlbHkodGFyZ2V0X29iaiA9PSBOVUxMKSkKKwkJcmV0dXJuIC1FTk9FTlQ7CisKKwl0YXJnZXRfb2Zmc2V0ID0gdG9faW50ZWxfYm8odGFyZ2V0X29iaiktPmd0dF9vZmZzZXQ7CisKKyNpZiBXQVRDSF9SRUxPQworCURSTV9JTkZPKCIlczogb2JqICVwIG9mZnNldCAlMDh4IHRhcmdldCAlZCAiCisJCSAicmVhZCAlMDh4IHdyaXRlICUwOHggZ3R0ICUwOHggIgorCQkgInByZXN1bWVkICUwOHggZGVsdGEgJTA4eFxuIiwKKwkJIF9fZnVuY19fLAorCQkgb2JqLAorCQkgKGludCkgcmVsb2MtPm9mZnNldCwKKwkJIChpbnQpIHJlbG9jLT50YXJnZXRfaGFuZGxlLAorCQkgKGludCkgcmVsb2MtPnJlYWRfZG9tYWlucywKKwkJIChpbnQpIHJlbG9jLT53cml0ZV9kb21haW4sCisJCSAoaW50KSB0YXJnZXRfb2Zmc2V0LAorCQkgKGludCkgcmVsb2MtPnByZXN1bWVkX29mZnNldCwKKwkJIHJlbG9jLT5kZWx0YSk7CisjZW5kaWYKKworCS8qIFRoZSB0YXJnZXQgYnVmZmVyIHNob3VsZCBoYXZlIGFwcGVhcmVkIGJlZm9yZSB1cyBpbiB0aGUKKwkgKiBleGVjX29iamVjdCBsaXN0LCBzbyBpdCBzaG91bGQgaGF2ZSBhIEdUVCBzcGFjZSBib3VuZCBieSBub3cuCisJICovCisJaWYgKHVubGlrZWx5KHRhcmdldF9vZmZzZXQgPT0gMCkpIHsKKwkJRFJNX0VSUk9SKCJObyBHVFQgc3BhY2UgZm91bmQgZm9yIG9iamVjdCAlZFxuIiwKKwkJCSAgcmVsb2MtPnRhcmdldF9oYW5kbGUpOworCQlyZXR1cm4gcmV0OworCX0KKworCS8qIFZhbGlkYXRlIHRoYXQgdGhlIHRhcmdldCBpcyBpbiBhIHZhbGlkIHIvdyBHUFUgZG9tYWluICovCisJaWYgKHVubGlrZWx5KHJlbG9jLT53cml0ZV9kb21haW4gJiAocmVsb2MtPndyaXRlX2RvbWFpbiAtIDEpKSkgeworCQlEUk1fRVJST1IoInJlbG9jIHdpdGggbXVsdGlwbGUgd3JpdGUgZG9tYWluczogIgorCQkJICAib2JqICVwIHRhcmdldCAlZCBvZmZzZXQgJWQgIgorCQkJICAicmVhZCAlMDh4IHdyaXRlICUwOHgiLAorCQkJICBvYmosIHJlbG9jLT50YXJnZXRfaGFuZGxlLAorCQkJICAoaW50KSByZWxvYy0+b2Zmc2V0LAorCQkJICByZWxvYy0+cmVhZF9kb21haW5zLAorCQkJICByZWxvYy0+d3JpdGVfZG9tYWluKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJaWYgKHVubGlrZWx5KChyZWxvYy0+d3JpdGVfZG9tYWluIHwgcmVsb2MtPnJlYWRfZG9tYWlucykgJiBJOTE1X0dFTV9ET01BSU5fQ1BVKSkgeworCQlEUk1fRVJST1IoInJlbG9jIHdpdGggcmVhZC93cml0ZSBDUFUgZG9tYWluczogIgorCQkJICAib2JqICVwIHRhcmdldCAlZCBvZmZzZXQgJWQgIgorCQkJICAicmVhZCAlMDh4IHdyaXRlICUwOHgiLAorCQkJICBvYmosIHJlbG9jLT50YXJnZXRfaGFuZGxlLAorCQkJICAoaW50KSByZWxvYy0+b2Zmc2V0LAorCQkJICByZWxvYy0+cmVhZF9kb21haW5zLAorCQkJICByZWxvYy0+d3JpdGVfZG9tYWluKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJaWYgKHVubGlrZWx5KHJlbG9jLT53cml0ZV9kb21haW4gJiYgdGFyZ2V0X29iai0+cGVuZGluZ193cml0ZV9kb21haW4gJiYKKwkJICAgICByZWxvYy0+d3JpdGVfZG9tYWluICE9IHRhcmdldF9vYmotPnBlbmRpbmdfd3JpdGVfZG9tYWluKSkgeworCQlEUk1fRVJST1IoIldyaXRlIGRvbWFpbiBjb25mbGljdDogIgorCQkJICAib2JqICVwIHRhcmdldCAlZCBvZmZzZXQgJWQgIgorCQkJICAibmV3ICUwOHggb2xkICUwOHhcbiIsCisJCQkgIG9iaiwgcmVsb2MtPnRhcmdldF9oYW5kbGUsCisJCQkgIChpbnQpIHJlbG9jLT5vZmZzZXQsCisJCQkgIHJlbG9jLT53cml0ZV9kb21haW4sCisJCQkgIHRhcmdldF9vYmotPnBlbmRpbmdfd3JpdGVfZG9tYWluKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwl0YXJnZXRfb2JqLT5wZW5kaW5nX3JlYWRfZG9tYWlucyB8PSByZWxvYy0+cmVhZF9kb21haW5zOworCXRhcmdldF9vYmotPnBlbmRpbmdfd3JpdGVfZG9tYWluIHw9IHJlbG9jLT53cml0ZV9kb21haW47CisKKwkvKiBJZiB0aGUgcmVsb2NhdGlvbiBhbHJlYWR5IGhhcyB0aGUgcmlnaHQgdmFsdWUgaW4gaXQsIG5vCisJICogbW9yZSB3b3JrIG5lZWRzIHRvIGJlIGRvbmUuCisJICovCisJaWYgKHRhcmdldF9vZmZzZXQgPT0gcmVsb2MtPnByZXN1bWVkX29mZnNldCkKKwkJcmV0dXJuIDA7CisKKwkvKiBDaGVjayB0aGF0IHRoZSByZWxvY2F0aW9uIGFkZHJlc3MgaXMgdmFsaWQuLi4gKi8KKwlpZiAodW5saWtlbHkocmVsb2MtPm9mZnNldCA+IG9iai0+YmFzZS5zaXplIC0gNCkpIHsKKwkJRFJNX0VSUk9SKCJSZWxvY2F0aW9uIGJleW9uZCBvYmplY3QgYm91bmRzOiAiCisJCQkgICJvYmogJXAgdGFyZ2V0ICVkIG9mZnNldCAlZCBzaXplICVkLlxuIiwKKwkJCSAgb2JqLCByZWxvYy0+dGFyZ2V0X2hhbmRsZSwKKwkJCSAgKGludCkgcmVsb2MtPm9mZnNldCwKKwkJCSAgKGludCkgb2JqLT5iYXNlLnNpemUpOworCQlyZXR1cm4gcmV0OworCX0KKwlpZiAodW5saWtlbHkocmVsb2MtPm9mZnNldCAmIDMpKSB7CisJCURSTV9FUlJPUigiUmVsb2NhdGlvbiBub3QgNC1ieXRlIGFsaWduZWQ6ICIKKwkJCSAgIm9iaiAlcCB0YXJnZXQgJWQgb2Zmc2V0ICVkLlxuIiwKKwkJCSAgb2JqLCByZWxvYy0+dGFyZ2V0X2hhbmRsZSwKKwkJCSAgKGludCkgcmVsb2MtPm9mZnNldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJLyogYW5kIHBvaW50cyB0byBzb21ld2hlcmUgd2l0aGluIHRoZSB0YXJnZXQgb2JqZWN0LiAqLworCWlmICh1bmxpa2VseShyZWxvYy0+ZGVsdGEgPj0gdGFyZ2V0X29iai0+c2l6ZSkpIHsKKwkJRFJNX0VSUk9SKCJSZWxvY2F0aW9uIGJleW9uZCB0YXJnZXQgb2JqZWN0IGJvdW5kczogIgorCQkJICAib2JqICVwIHRhcmdldCAlZCBkZWx0YSAlZCBzaXplICVkLlxuIiwKKwkJCSAgb2JqLCByZWxvYy0+dGFyZ2V0X2hhbmRsZSwKKwkJCSAgKGludCkgcmVsb2MtPmRlbHRhLAorCQkJICAoaW50KSB0YXJnZXRfb2JqLT5zaXplKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZWxvYy0+ZGVsdGEgKz0gdGFyZ2V0X29mZnNldDsKKwlpZiAob2JqLT5iYXNlLndyaXRlX2RvbWFpbiA9PSBJOTE1X0dFTV9ET01BSU5fQ1BVKSB7CisJCXVpbnQzMl90IHBhZ2Vfb2Zmc2V0ID0gcmVsb2MtPm9mZnNldCAmIH5QQUdFX01BU0s7CisJCWNoYXIgKnZhZGRyOworCisJCXZhZGRyID0ga21hcF9hdG9taWMob2JqLT5wYWdlc1tyZWxvYy0+b2Zmc2V0ID4+IFBBR0VfU0hJRlRdKTsKKwkJKih1aW50MzJfdCAqKSh2YWRkciArIHBhZ2Vfb2Zmc2V0KSA9IHJlbG9jLT5kZWx0YTsKKwkJa3VubWFwX2F0b21pYyh2YWRkcik7CisJfSBlbHNlIHsKKwkJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwkJdWludDMyX3QgX19pb21lbSAqcmVsb2NfZW50cnk7CisJCXZvaWQgX19pb21lbSAqcmVsb2NfcGFnZTsKKworCQlyZXQgPSBpOTE1X2dlbV9vYmplY3Rfc2V0X3RvX2d0dF9kb21haW4ob2JqLCAxKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisKKwkJLyogTWFwIHRoZSBwYWdlIGNvbnRhaW5pbmcgdGhlIHJlbG9jYXRpb24gd2UncmUgZ29pbmcgdG8gcGVyZm9ybS4gICovCisJCXJlbG9jLT5vZmZzZXQgKz0gb2JqLT5ndHRfb2Zmc2V0OworCQlyZWxvY19wYWdlID0gaW9fbWFwcGluZ19tYXBfYXRvbWljX3djKGRldl9wcml2LT5tbS5ndHRfbWFwcGluZywKKwkJCQkJCSAgICAgIHJlbG9jLT5vZmZzZXQgJiBQQUdFX01BU0spOworCQlyZWxvY19lbnRyeSA9ICh1aW50MzJfdCBfX2lvbWVtICopCisJCQkocmVsb2NfcGFnZSArIChyZWxvYy0+b2Zmc2V0ICYgflBBR0VfTUFTSykpOworCQlpb3dyaXRlMzIocmVsb2MtPmRlbHRhLCByZWxvY19lbnRyeSk7CisJCWlvX21hcHBpbmdfdW5tYXBfYXRvbWljKHJlbG9jX3BhZ2UpOworCX0KKworCS8qIGFuZCB1cGRhdGUgdGhlIHVzZXIncyByZWxvY2F0aW9uIGVudHJ5ICovCisJcmVsb2MtPnByZXN1bWVkX29mZnNldCA9IHRhcmdldF9vZmZzZXQ7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAoraTkxNV9nZW1fZXhlY2J1ZmZlcl9yZWxvY2F0ZV9vYmplY3Qoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaiwKKwkJCQkgICAgc3RydWN0IGViX29iamVjdHMgKmViLAorCQkJCSAgICBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX2V4ZWNfb2JqZWN0MiAqZW50cnkpCit7CisJc3RydWN0IGRybV9pOTE1X2dlbV9yZWxvY2F0aW9uX2VudHJ5IF9fdXNlciAqdXNlcl9yZWxvY3M7CisJaW50IGksIHJldDsKKworCXVzZXJfcmVsb2NzID0gKHZvaWQgX191c2VyICopKHVpbnRwdHJfdCllbnRyeS0+cmVsb2NzX3B0cjsKKwlmb3IgKGkgPSAwOyBpIDwgZW50cnktPnJlbG9jYXRpb25fY291bnQ7IGkrKykgeworCQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX3JlbG9jYXRpb25fZW50cnkgcmVsb2M7CisKKwkJaWYgKF9fY29weV9mcm9tX3VzZXJfaW5hdG9taWMoJnJlbG9jLAorCQkJCQkgICAgICB1c2VyX3JlbG9jcytpLAorCQkJCQkgICAgICBzaXplb2YocmVsb2MpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCXJldCA9IGk5MTVfZ2VtX2V4ZWNidWZmZXJfcmVsb2NhdGVfZW50cnkob2JqLCBlYiwgZW50cnksICZyZWxvYyk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCisJCWlmIChfX2NvcHlfdG9fdXNlcl9pbmF0b21pYygmdXNlcl9yZWxvY3NbaV0ucHJlc3VtZWRfb2Zmc2V0LAorCQkJCQkgICAgJnJlbG9jLnByZXN1bWVkX29mZnNldCwKKwkJCQkJICAgIHNpemVvZihyZWxvYy5wcmVzdW1lZF9vZmZzZXQpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitpOTE1X2dlbV9leGVjYnVmZmVyX3JlbG9jYXRlX29iamVjdF9zbG93KHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmosCisJCQkJCSBzdHJ1Y3QgZWJfb2JqZWN0cyAqZWIsCisJCQkJCSBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX2V4ZWNfb2JqZWN0MiAqZW50cnksCisJCQkJCSBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX3JlbG9jYXRpb25fZW50cnkgKnJlbG9jcykKK3sKKwlpbnQgaSwgcmV0OworCisJZm9yIChpID0gMDsgaSA8IGVudHJ5LT5yZWxvY2F0aW9uX2NvdW50OyBpKyspIHsKKwkJcmV0ID0gaTkxNV9nZW1fZXhlY2J1ZmZlcl9yZWxvY2F0ZV9lbnRyeShvYmosIGViLCBlbnRyeSwgJnJlbG9jc1tpXSk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitpOTE1X2dlbV9leGVjYnVmZmVyX3JlbG9jYXRlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCisJCQkgICAgIHN0cnVjdCBlYl9vYmplY3RzICplYiwKKwkJCSAgICAgc3RydWN0IGxpc3RfaGVhZCAqb2JqZWN0cywKKwkJCSAgICAgc3RydWN0IGRybV9pOTE1X2dlbV9leGVjX29iamVjdDIgKmV4ZWMpCit7CisJc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iajsKKwlpbnQgcmV0OworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShvYmosIG9iamVjdHMsIGV4ZWNfbGlzdCkgeworCQlvYmotPmJhc2UucGVuZGluZ19yZWFkX2RvbWFpbnMgPSAwOworCQlvYmotPmJhc2UucGVuZGluZ193cml0ZV9kb21haW4gPSAwOworCQlyZXQgPSBpOTE1X2dlbV9leGVjYnVmZmVyX3JlbG9jYXRlX29iamVjdChvYmosIGViLCBleGVjKyspOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAoraTkxNV9nZW1fZXhlY2J1ZmZlcl9yZXNlcnZlKHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZywKKwkJCSAgICBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGUsCisJCQkgICAgc3RydWN0IGxpc3RfaGVhZCAqb2JqZWN0cywKKwkJCSAgICBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX2V4ZWNfb2JqZWN0MiAqZXhlYykKK3sKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqOworCXN0cnVjdCBkcm1faTkxNV9nZW1fZXhlY19vYmplY3QyICplbnRyeTsKKwlpbnQgcmV0LCByZXRyeTsKKwlib29sIGhhc19mZW5jZWRfZ3B1X2FjY2VzcyA9IElOVEVMX0lORk8ocmluZy0+ZGV2KS0+Z2VuIDwgNDsKKworCS8qIEF0dGVtcHQgdG8gcGluIGFsbCBvZiB0aGUgYnVmZmVycyBpbnRvIHRoZSBHVFQuCisJICogVGhpcyBpcyBkb25lIGluIDMgcGhhc2VzOgorCSAqCisJICogMWEuIFVuYmluZCBhbGwgb2JqZWN0cyB0aGF0IGRvIG5vdCBtYXRjaCB0aGUgR1RUIGNvbnN0cmFpbnRzIGZvcgorCSAqICAgICB0aGUgZXhlY2J1ZmZlciAoZmVuY2VhYmxlLCBtYXBwYWJsZSwgYWxpZ25tZW50IGV0YykuCisJICogMWIuIEluY3JlbWVudCBwaW4gY291bnQgZm9yIGFscmVhZHkgYm91bmQgb2JqZWN0cy4KKwkgKiAyLiAgQmluZCBuZXcgb2JqZWN0cy4KKwkgKiAzLiAgRGVjcmVtZW50IHBpbiBjb3VudC4KKwkgKgorCSAqIFRoaXMgYXZvaWQgdW5uZWNlc3NhcnkgdW5iaW5kaW5nIG9mIGxhdGVyIG9iamVjdHMgaW4gb3JkZXIgdG8gbWFrcgorCSAqIHJvb20gZm9yIHRoZSBlYXJsaWVyIG9iamVjdHMgKnVubGVzcyogd2UgbmVlZCB0byBkZWZyYWdtZW50LgorCSAqLworCXJldHJ5ID0gMDsKKwlkbyB7CisJCXJldCA9IDA7CisKKwkJLyogVW5iaW5kIGFueSBpbGwtZml0dGluZyBvYmplY3RzIG9yIHBpbi4gKi8KKwkJZW50cnkgPSBleGVjOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KG9iaiwgb2JqZWN0cywgZXhlY19saXN0KSB7CisJCQlib29sIG5lZWRfZmVuY2UsIG5lZWRfbWFwcGFibGU7CisKKwkJCWlmICghb2JqLT5ndHRfc3BhY2UpIHsKKwkJCQllbnRyeSsrOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQluZWVkX2ZlbmNlID0KKwkJCQloYXNfZmVuY2VkX2dwdV9hY2Nlc3MgJiYKKwkJCQllbnRyeS0+ZmxhZ3MgJiBFWEVDX09CSkVDVF9ORUVEU19GRU5DRSAmJgorCQkJCW9iai0+dGlsaW5nX21vZGUgIT0gSTkxNV9USUxJTkdfTk9ORTsKKwkJCW5lZWRfbWFwcGFibGUgPQorCQkJCWVudHJ5LT5yZWxvY2F0aW9uX2NvdW50ID8gdHJ1ZSA6IG5lZWRfZmVuY2U7CisKKwkJCWlmICgoZW50cnktPmFsaWdubWVudCAmJiBvYmotPmd0dF9vZmZzZXQgJiAoZW50cnktPmFsaWdubWVudCAtIDEpKSB8fAorCQkJICAgIChuZWVkX21hcHBhYmxlICYmICFvYmotPm1hcF9hbmRfZmVuY2VhYmxlKSkKKwkJCQlyZXQgPSBpOTE1X2dlbV9vYmplY3RfdW5iaW5kKG9iaik7CisJCQllbHNlCisJCQkJcmV0ID0gaTkxNV9nZW1fb2JqZWN0X3BpbihvYmosCisJCQkJCQkJICBlbnRyeS0+YWxpZ25tZW50LAorCQkJCQkJCSAgbmVlZF9tYXBwYWJsZSk7CisJCQlpZiAocmV0KQorCQkJCWdvdG8gZXJyOworCisJCQllbnRyeSsrOworCQl9CisKKwkJLyogQmluZCBmcmVzaCBvYmplY3RzICovCisJCWVudHJ5ID0gZXhlYzsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShvYmosIG9iamVjdHMsIGV4ZWNfbGlzdCkgeworCQkJYm9vbCBuZWVkX2ZlbmNlOworCisJCQluZWVkX2ZlbmNlID0KKwkJCQloYXNfZmVuY2VkX2dwdV9hY2Nlc3MgJiYKKwkJCQllbnRyeS0+ZmxhZ3MgJiBFWEVDX09CSkVDVF9ORUVEU19GRU5DRSAmJgorCQkJCW9iai0+dGlsaW5nX21vZGUgIT0gSTkxNV9USUxJTkdfTk9ORTsKKworCQkJaWYgKCFvYmotPmd0dF9zcGFjZSkgeworCQkJCWJvb2wgbmVlZF9tYXBwYWJsZSA9CisJCQkJCWVudHJ5LT5yZWxvY2F0aW9uX2NvdW50ID8gdHJ1ZSA6IG5lZWRfZmVuY2U7CisKKwkJCQlyZXQgPSBpOTE1X2dlbV9vYmplY3RfcGluKG9iaiwKKwkJCQkJCQkgIGVudHJ5LT5hbGlnbm1lbnQsCisJCQkJCQkJICBuZWVkX21hcHBhYmxlKTsKKwkJCQlpZiAocmV0KQorCQkJCQlicmVhazsKKwkJCX0KKworCQkJaWYgKGhhc19mZW5jZWRfZ3B1X2FjY2VzcykgeworCQkJCWlmIChuZWVkX2ZlbmNlKSB7CisJCQkJCXJldCA9IGk5MTVfZ2VtX29iamVjdF9nZXRfZmVuY2Uob2JqLCByaW5nLCAxKTsKKwkJCQkJaWYgKHJldCkKKwkJCQkJCWJyZWFrOworCQkJCX0gZWxzZSBpZiAoZW50cnktPmZsYWdzICYgRVhFQ19PQkpFQ1RfTkVFRFNfRkVOQ0UgJiYKKwkJCQkJICAgb2JqLT50aWxpbmdfbW9kZSA9PSBJOTE1X1RJTElOR19OT05FKSB7CisJCQkJCS8qIFhYWCBwaXBlbGluZWQhICovCisJCQkJCXJldCA9IGk5MTVfZ2VtX29iamVjdF9wdXRfZmVuY2Uob2JqKTsKKwkJCQkJaWYgKHJldCkKKwkJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlvYmotPnBlbmRpbmdfZmVuY2VkX2dwdV9hY2Nlc3MgPSBuZWVkX2ZlbmNlOworCQkJfQorCisJCQllbnRyeS0+b2Zmc2V0ID0gb2JqLT5ndHRfb2Zmc2V0OworCQkJZW50cnkrKzsKKwkJfQorCisJCS8qIERlY3JlbWVudCBwaW4gY291bnQgZm9yIGJvdW5kIG9iamVjdHMgKi8KKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShvYmosIG9iamVjdHMsIGV4ZWNfbGlzdCkgeworCQkJaWYgKG9iai0+Z3R0X3NwYWNlKQorCQkJCWk5MTVfZ2VtX29iamVjdF91bnBpbihvYmopOworCQl9CisKKwkJaWYgKHJldCAhPSAtRU5PU1BDIHx8IHJldHJ5ID4gMSkKKwkJCXJldHVybiByZXQ7CisKKwkJLyogRmlyc3QgYXR0ZW1wdCwganVzdCBjbGVhciBhbnl0aGluZyB0aGF0IGlzIHB1cmdlYWJsZS4KKwkJICogU2Vjb25kIGF0dGVtcHQsIGNsZWFyIHRoZSBlbnRpcmUgR1RULgorCQkgKi8KKwkJcmV0ID0gaTkxNV9nZW1fZXZpY3RfZXZlcnl0aGluZyhyaW5nLT5kZXYsIHJldHJ5ID09IDApOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKworCQlyZXRyeSsrOworCX0gd2hpbGUgKDEpOworCitlcnI6CisJb2JqID0gbGlzdF9lbnRyeShvYmotPmV4ZWNfbGlzdC5wcmV2LAorCQkJIHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0LAorCQkJIGV4ZWNfbGlzdCk7CisJd2hpbGUgKG9iamVjdHMgIT0gJm9iai0+ZXhlY19saXN0KSB7CisJCWlmIChvYmotPmd0dF9zcGFjZSkKKwkJCWk5MTVfZ2VtX29iamVjdF91bnBpbihvYmopOworCisJCW9iaiA9IGxpc3RfZW50cnkob2JqLT5leGVjX2xpc3QucHJldiwKKwkJCQkgc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QsCisJCQkJIGV4ZWNfbGlzdCk7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludAoraTkxNV9nZW1fZXhlY2J1ZmZlcl9yZWxvY2F0ZV9zbG93KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCisJCQkJICBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGUsCisJCQkJICBzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcsCisJCQkJICBzdHJ1Y3QgbGlzdF9oZWFkICpvYmplY3RzLAorCQkJCSAgc3RydWN0IGViX29iamVjdHMgKmViLAorCQkJCSAgc3RydWN0IGRybV9pOTE1X2dlbV9leGVjX29iamVjdDIgKmV4ZWMsCisJCQkJICBpbnQgY291bnQpCit7CisJc3RydWN0IGRybV9pOTE1X2dlbV9yZWxvY2F0aW9uX2VudHJ5ICpyZWxvYzsKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqOworCWludCBpLCB0b3RhbCwgcmV0OworCisJLyogV2UgbWF5IHByb2Nlc3MgYW5vdGhlciBleGVjYnVmZmVyIGR1cmluZyB0aGUgdW5sb2NrLi4uICovCisJd2hpbGUgKGxpc3RfZW1wdHkob2JqZWN0cykpIHsKKwkJb2JqID0gbGlzdF9maXJzdF9lbnRyeShvYmplY3RzLAorCQkJCSAgICAgICBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCwKKwkJCQkgICAgICAgZXhlY19saXN0KTsKKwkJbGlzdF9kZWxfaW5pdCgmb2JqLT5leGVjX2xpc3QpOworCQlkcm1fZ2VtX29iamVjdF91bnJlZmVyZW5jZSgmb2JqLT5iYXNlKTsKKwl9CisKKwltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKKworCXRvdGFsID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykKKwkJdG90YWwgKz0gZXhlY1tpXS5yZWxvY2F0aW9uX2NvdW50OworCisJcmVsb2MgPSBkcm1fbWFsbG9jX2FiKHRvdGFsLCBzaXplb2YoKnJlbG9jKSk7CisJaWYgKHJlbG9jID09IE5VTEwpIHsKKwkJbXV0ZXhfbG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwl0b3RhbCA9IDA7CisJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKwkJc3RydWN0IGRybV9pOTE1X2dlbV9yZWxvY2F0aW9uX2VudHJ5IF9fdXNlciAqdXNlcl9yZWxvY3M7CisKKwkJdXNlcl9yZWxvY3MgPSAodm9pZCBfX3VzZXIgKikodWludHB0cl90KWV4ZWNbaV0ucmVsb2NzX3B0cjsKKworCQlpZiAoY29weV9mcm9tX3VzZXIocmVsb2MrdG90YWwsIHVzZXJfcmVsb2NzLAorCQkJCSAgIGV4ZWNbaV0ucmVsb2NhdGlvbl9jb3VudCAqIHNpemVvZigqcmVsb2MpKSkgeworCQkJcmV0ID0gLUVGQVVMVDsKKwkJCW11dGV4X2xvY2soJmRldi0+c3RydWN0X211dGV4KTsKKwkJCWdvdG8gZXJyOworCQl9CisKKwkJdG90YWwgKz0gZXhlY1tpXS5yZWxvY2F0aW9uX2NvdW50OworCX0KKworCXJldCA9IGk5MTVfbXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKGRldik7CisJaWYgKHJldCkgeworCQltdXRleF9sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CisJCWdvdG8gZXJyOworCX0KKworCS8qIHJlYWNxdWlyZSB0aGUgb2JqZWN0cyAqLworCUlOSVRfTElTVF9IRUFEKG9iamVjdHMpOworCWViX3Jlc2V0KGViKTsKKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworCQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqOworCisJCW9iaiA9IHRvX2ludGVsX2JvKGRybV9nZW1fb2JqZWN0X2xvb2t1cChkZXYsIGZpbGUsCisJCQkJCQkJZXhlY1tpXS5oYW5kbGUpKTsKKwkJaWYgKG9iaiA9PSBOVUxMKSB7CisJCQlEUk1fRVJST1IoIkludmFsaWQgb2JqZWN0IGhhbmRsZSAlZCBhdCBpbmRleCAlZFxuIiwKKwkJCQkgICBleGVjW2ldLmhhbmRsZSwgaSk7CisJCQlyZXQgPSAtRU5PRU5UOworCQkJZ290byBlcnI7CisJCX0KKworCQlsaXN0X2FkZF90YWlsKCZvYmotPmV4ZWNfbGlzdCwgb2JqZWN0cyk7CisJCW9iai0+ZXhlY19oYW5kbGUgPSBleGVjW2ldLmhhbmRsZTsKKwkJZWJfYWRkX29iamVjdChlYiwgb2JqKTsKKwl9CisKKwlyZXQgPSBpOTE1X2dlbV9leGVjYnVmZmVyX3Jlc2VydmUocmluZywgZmlsZSwgb2JqZWN0cywgZXhlYyk7CisJaWYgKHJldCkKKwkJZ290byBlcnI7CisKKwl0b3RhbCA9IDA7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShvYmosIG9iamVjdHMsIGV4ZWNfbGlzdCkgeworCQlvYmotPmJhc2UucGVuZGluZ19yZWFkX2RvbWFpbnMgPSAwOworCQlvYmotPmJhc2UucGVuZGluZ193cml0ZV9kb21haW4gPSAwOworCQlyZXQgPSBpOTE1X2dlbV9leGVjYnVmZmVyX3JlbG9jYXRlX29iamVjdF9zbG93KG9iaiwgZWIsCisJCQkJCQkJICAgICAgIGV4ZWMsCisJCQkJCQkJICAgICAgIHJlbG9jICsgdG90YWwpOworCQlpZiAocmV0KQorCQkJZ290byBlcnI7CisKKwkJdG90YWwgKz0gZXhlYy0+cmVsb2NhdGlvbl9jb3VudDsKKwkJZXhlYysrOworCX0KKworCS8qIExlYXZlIHRoZSB1c2VyIHJlbG9jYXRpb25zIGFzIGFyZSwgdGhpcyBpcyB0aGUgcGFpbmZ1bGx5IHNsb3cgcGF0aCwKKwkgKiBhbmQgd2Ugd2FudCB0byBhdm9pZCB0aGUgY29tcGxpY2F0aW9uIG9mIGRyb3BwaW5nIHRoZSBsb2NrIHdoaWxzdAorCSAqIGhhdmluZyBidWZmZXJzIHJlc2VydmVkIGluIHRoZSBhcGVydHVyZSBhbmQgc28gY2F1c2luZyBzcHVyaW91cworCSAqIEVOT1NQQyBmb3IgcmFuZG9tIG9wZXJhdGlvbnMuCisJICovCisKK2VycjoKKwlkcm1fZnJlZV9sYXJnZShyZWxvYyk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQKK2k5MTVfZ2VtX2V4ZWNidWZmZXJfZmx1c2goc3RydWN0IGRybV9kZXZpY2UgKmRldiwKKwkJCSAgdWludDMyX3QgaW52YWxpZGF0ZV9kb21haW5zLAorCQkJICB1aW50MzJfdCBmbHVzaF9kb21haW5zLAorCQkJICB1aW50MzJfdCBmbHVzaF9yaW5ncykKK3sKKwlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlpbnQgaTsKKworCWlmIChmbHVzaF9kb21haW5zICYgSTkxNV9HRU1fRE9NQUlOX0NQVSkKKwkJaW50ZWxfZ3R0X2NoaXBzZXRfZmx1c2goKTsKKworCWlmICgoZmx1c2hfZG9tYWlucyB8IGludmFsaWRhdGVfZG9tYWlucykgJiBJOTE1X0dFTV9HUFVfRE9NQUlOUykgeworCQlmb3IgKGkgPSAwOyBpIDwgSTkxNV9OVU1fUklOR1M7IGkrKykKKwkJCWlmIChmbHVzaF9yaW5ncyAmICgxIDw8IGkpKQorCQkJCWk5MTVfZ2VtX2ZsdXNoX3JpbmcoZGV2LCAmZGV2X3ByaXYtPnJpbmdbaV0sCisJCQkJCQkgICAgaW52YWxpZGF0ZV9kb21haW5zLAorCQkJCQkJICAgIGZsdXNoX2RvbWFpbnMpOworCX0KK30KKworc3RhdGljIGludAoraTkxNV9nZW1fZXhlY2J1ZmZlcl9zeW5jX3JpbmdzKHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmosCisJCQkgICAgICAgc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICp0bykKK3sKKwlzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKmZyb20gPSBvYmotPnJpbmc7CisJdTMyIHNlcW5vOworCWludCByZXQsIGlkeDsKKworCWlmIChmcm9tID09IE5VTEwgfHwgdG8gPT0gZnJvbSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoSU5URUxfSU5GTyhvYmotPmJhc2UuZGV2KS0+Z2VuIDwgNikKKwkJcmV0dXJuIGk5MTVfZ2VtX29iamVjdF93YWl0X3JlbmRlcmluZyhvYmosIHRydWUpOworCisJaWR4ID0gaW50ZWxfcmluZ19zeW5jX2luZGV4KGZyb20sIHRvKTsKKworCXNlcW5vID0gb2JqLT5sYXN0X3JlbmRlcmluZ19zZXFubzsKKwlpZiAoc2Vxbm8gPD0gZnJvbS0+c3luY19zZXFub1tpZHhdKQorCQlyZXR1cm4gMDsKKworCWlmIChzZXFubyA9PSBmcm9tLT5vdXRzdGFuZGluZ19sYXp5X3JlcXVlc3QpIHsKKwkJc3RydWN0IGRybV9pOTE1X2dlbV9yZXF1ZXN0ICpyZXF1ZXN0OworCisJCXJlcXVlc3QgPSBremFsbG9jKHNpemVvZigqcmVxdWVzdCksIEdGUF9LRVJORUwpOworCQlpZiAocmVxdWVzdCA9PSBOVUxMKQorCQkJcmV0dXJuIC1FTk9NRU07CisKKwkJcmV0ID0gaTkxNV9hZGRfcmVxdWVzdChvYmotPmJhc2UuZGV2LCBOVUxMLCByZXF1ZXN0LCBmcm9tKTsKKwkJaWYgKHJldCkgeworCQkJa2ZyZWUocmVxdWVzdCk7CisJCQlyZXR1cm4gcmV0OworCQl9CisKKwkJc2Vxbm8gPSByZXF1ZXN0LT5zZXFubzsKKwl9CisKKwlmcm9tLT5zeW5jX3NlcW5vW2lkeF0gPSBzZXFubzsKKwlyZXR1cm4gaW50ZWxfcmluZ19zeW5jKHRvLCBmcm9tLCBzZXFubyAtIDEpOworfQorCitzdGF0aWMgaW50CitpOTE1X2dlbV9leGVjYnVmZmVyX21vdmVfdG9fZ3B1KHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZywKKwkJCQlzdHJ1Y3QgbGlzdF9oZWFkICpvYmplY3RzKQoreworCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmo7CisJc3RydWN0IGNoYW5nZV9kb21haW5zIGNkOworCWludCByZXQ7CisKKwljZC5pbnZhbGlkYXRlX2RvbWFpbnMgPSAwOworCWNkLmZsdXNoX2RvbWFpbnMgPSAwOworCWNkLmZsdXNoX3JpbmdzID0gMDsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KG9iaiwgb2JqZWN0cywgZXhlY19saXN0KQorCQlpOTE1X2dlbV9vYmplY3Rfc2V0X3RvX2dwdV9kb21haW4ob2JqLCByaW5nLCAmY2QpOworCisJaWYgKGNkLmludmFsaWRhdGVfZG9tYWlucyB8IGNkLmZsdXNoX2RvbWFpbnMpIHsKKyNpZiBXQVRDSF9FWEVDCisJCURSTV9JTkZPKCIlczogaW52YWxpZGF0ZV9kb21haW5zICUwOHggZmx1c2hfZG9tYWlucyAlMDh4XG4iLAorCQkJICBfX2Z1bmNfXywKKwkJCSBjZC5pbnZhbGlkYXRlX2RvbWFpbnMsCisJCQkgY2QuZmx1c2hfZG9tYWlucyk7CisjZW5kaWYKKwkJaTkxNV9nZW1fZXhlY2J1ZmZlcl9mbHVzaChyaW5nLT5kZXYsCisJCQkJCSAgY2QuaW52YWxpZGF0ZV9kb21haW5zLAorCQkJCQkgIGNkLmZsdXNoX2RvbWFpbnMsCisJCQkJCSAgY2QuZmx1c2hfcmluZ3MpOworCX0KKworCWxpc3RfZm9yX2VhY2hfZW50cnkob2JqLCBvYmplY3RzLCBleGVjX2xpc3QpIHsKKwkJcmV0ID0gaTkxNV9nZW1fZXhlY2J1ZmZlcl9zeW5jX3JpbmdzKG9iaiwgcmluZyk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgYm9vbAoraTkxNV9nZW1fY2hlY2tfZXhlY2J1ZmZlcihzdHJ1Y3QgZHJtX2k5MTVfZ2VtX2V4ZWNidWZmZXIyICpleGVjKQoreworCXJldHVybiAoKGV4ZWMtPmJhdGNoX3N0YXJ0X29mZnNldCB8IGV4ZWMtPmJhdGNoX2xlbikgJiAweDcpID09IDA7Cit9CisKK3N0YXRpYyBpbnQKK3ZhbGlkYXRlX2V4ZWNfbGlzdChzdHJ1Y3QgZHJtX2k5MTVfZ2VtX2V4ZWNfb2JqZWN0MiAqZXhlYywKKwkJICAgaW50IGNvdW50KQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKwkJY2hhciBfX3VzZXIgKnB0ciA9IChjaGFyIF9fdXNlciAqKSh1aW50cHRyX3QpZXhlY1tpXS5yZWxvY3NfcHRyOworCQlpbnQgbGVuZ3RoOyAvKiBsaW1pdGVkIGJ5IGZhdWx0X2luX3BhZ2VzX3JlYWRhYmxlKCkgKi8KKworCQkvKiBGaXJzdCBjaGVjayBmb3IgbWFsaWNpb3VzIGlucHV0IGNhdXNpbmcgb3ZlcmZsb3cgKi8KKwkJaWYgKGV4ZWNbaV0ucmVsb2NhdGlvbl9jb3VudCA+CisJCSAgICBJTlRfTUFYIC8gc2l6ZW9mKHN0cnVjdCBkcm1faTkxNV9nZW1fcmVsb2NhdGlvbl9lbnRyeSkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlsZW5ndGggPSBleGVjW2ldLnJlbG9jYXRpb25fY291bnQgKgorCQkJc2l6ZW9mKHN0cnVjdCBkcm1faTkxNV9nZW1fcmVsb2NhdGlvbl9lbnRyeSk7CisJCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCBwdHIsIGxlbmd0aCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQkvKiB3ZSBtYXkgYWxzbyBuZWVkIHRvIHVwZGF0ZSB0aGUgcHJlc3VtZWQgb2Zmc2V0cyAqLworCQlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIHB0ciwgbGVuZ3RoKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCWlmIChmYXVsdF9pbl9wYWdlc19yZWFkYWJsZShwdHIsIGxlbmd0aCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAoraTkxNV9nZW1fZXhlY2J1ZmZlcl93YWl0X2Zvcl9mbGlwcyhzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcsCisJCQkJICAgc3RydWN0IGxpc3RfaGVhZCAqb2JqZWN0cykKK3sKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqOworCWludCBmbGlwczsKKworCS8qIENoZWNrIGZvciBhbnkgcGVuZGluZyBmbGlwcy4gQXMgd2Ugb25seSBtYWludGFpbiBhIGZsaXAgcXVldWUgZGVwdGgKKwkgKiBvZiAxLCB3ZSBjYW4gc2ltcGx5IGluc2VydCBhIFdBSVQgZm9yIHRoZSBuZXh0IGRpc3BsYXkgZmxpcCBwcmlvcgorCSAqIHRvIGV4ZWN1dGluZyB0aGUgYmF0Y2ggYW5kIGF2b2lkIHN0YWxsaW5nIHRoZSBDUFUuCisJICovCisJZmxpcHMgPSAwOworCWxpc3RfZm9yX2VhY2hfZW50cnkob2JqLCBvYmplY3RzLCBleGVjX2xpc3QpIHsKKwkJaWYgKG9iai0+YmFzZS53cml0ZV9kb21haW4pCisJCQlmbGlwcyB8PSBhdG9taWNfcmVhZCgmb2JqLT5wZW5kaW5nX2ZsaXApOworCX0KKwlpZiAoZmxpcHMpIHsKKwkJaW50IHBsYW5lLCBmbGlwX21hc2ssIHJldDsKKworCQlmb3IgKHBsYW5lID0gMDsgZmxpcHMgPj4gcGxhbmU7IHBsYW5lKyspIHsKKwkJCWlmICgoKGZsaXBzID4+IHBsYW5lKSAmIDEpID09IDApCisJCQkJY29udGludWU7CisKKwkJCWlmIChwbGFuZSkKKwkJCQlmbGlwX21hc2sgPSBNSV9XQUlUX0ZPUl9QTEFORV9CX0ZMSVA7CisJCQllbHNlCisJCQkJZmxpcF9tYXNrID0gTUlfV0FJVF9GT1JfUExBTkVfQV9GTElQOworCisJCQlyZXQgPSBpbnRlbF9yaW5nX2JlZ2luKHJpbmcsIDIpOworCQkJaWYgKHJldCkKKwkJCQlyZXR1cm4gcmV0OworCisJCQlpbnRlbF9yaW5nX2VtaXQocmluZywgTUlfV0FJVF9GT1JfRVZFTlQgfCBmbGlwX21hc2spOworCQkJaW50ZWxfcmluZ19lbWl0KHJpbmcsIE1JX05PT1ApOworCQkJaW50ZWxfcmluZ19hZHZhbmNlKHJpbmcpOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCitpOTE1X2dlbV9leGVjYnVmZmVyX21vdmVfdG9fYWN0aXZlKHN0cnVjdCBsaXN0X2hlYWQgKm9iamVjdHMsCisJCQkJICAgc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nLAorCQkJCSAgIHUzMiBzZXFubykKK3sKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShvYmosIG9iamVjdHMsIGV4ZWNfbGlzdCkgeworCQlvYmotPmJhc2UucmVhZF9kb21haW5zID0gb2JqLT5iYXNlLnBlbmRpbmdfcmVhZF9kb21haW5zOworCQlvYmotPmJhc2Uud3JpdGVfZG9tYWluID0gb2JqLT5iYXNlLnBlbmRpbmdfd3JpdGVfZG9tYWluOworCQlvYmotPmZlbmNlZF9ncHVfYWNjZXNzID0gb2JqLT5wZW5kaW5nX2ZlbmNlZF9ncHVfYWNjZXNzOworCisJCWk5MTVfZ2VtX29iamVjdF9tb3ZlX3RvX2FjdGl2ZShvYmosIHJpbmcsIHNlcW5vKTsKKwkJaWYgKG9iai0+YmFzZS53cml0ZV9kb21haW4pIHsKKwkJCW9iai0+ZGlydHkgPSAxOworCQkJb2JqLT5wZW5kaW5nX2dwdV93cml0ZSA9IHRydWU7CisJCQlsaXN0X21vdmVfdGFpbCgmb2JqLT5ncHVfd3JpdGVfbGlzdCwKKwkJCQkgICAgICAgJnJpbmctPmdwdV93cml0ZV9saXN0KTsKKwkJCWludGVsX21hcmtfYnVzeShyaW5nLT5kZXYsIG9iaik7CisJCX0KKworCQl0cmFjZV9pOTE1X2dlbV9vYmplY3RfY2hhbmdlX2RvbWFpbihvYmosCisJCQkJCQkgICAgb2JqLT5iYXNlLnJlYWRfZG9tYWlucywKKwkJCQkJCSAgICBvYmotPmJhc2Uud3JpdGVfZG9tYWluKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitpOTE1X2dlbV9leGVjYnVmZmVyX3JldGlyZV9jb21tYW5kcyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAorCQkJCSAgICBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGUsCisJCQkJICAgIHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZykKK3sKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX3JlcXVlc3QgKnJlcXVlc3Q7CisJdTMyIGZsdXNoX2RvbWFpbnM7CisKKwkvKgorCSAqIEVuc3VyZSB0aGF0IHRoZSBjb21tYW5kcyBpbiB0aGUgYmF0Y2ggYnVmZmVyIGFyZQorCSAqIGZpbmlzaGVkIGJlZm9yZSB0aGUgaW50ZXJydXB0IGZpcmVzLgorCSAqCisJICogVGhlIHNhbXBsZXIgYWx3YXlzIGdldHMgZmx1c2hlZCBvbiBpOTY1IChzaWdoKS4KKwkgKi8KKwlmbHVzaF9kb21haW5zID0gMDsKKwlpZiAoSU5URUxfSU5GTyhkZXYpLT5nZW4gPj0gNCkKKwkJZmx1c2hfZG9tYWlucyB8PSBJOTE1X0dFTV9ET01BSU5fU0FNUExFUjsKKworCXJpbmctPmZsdXNoKHJpbmcsIEk5MTVfR0VNX0RPTUFJTl9DT01NQU5ELCBmbHVzaF9kb21haW5zKTsKKworCS8qIEFkZCBhIGJyZWFkY3J1bWIgZm9yIHRoZSBjb21wbGV0aW9uIG9mIHRoZSBiYXRjaCBidWZmZXIgKi8KKwlyZXF1ZXN0ID0ga3phbGxvYyhzaXplb2YoKnJlcXVlc3QpLCBHRlBfS0VSTkVMKTsKKwlpZiAocmVxdWVzdCA9PSBOVUxMIHx8IGk5MTVfYWRkX3JlcXVlc3QoZGV2LCBmaWxlLCByZXF1ZXN0LCByaW5nKSkgeworCQlpOTE1X2dlbV9uZXh0X3JlcXVlc3Rfc2Vxbm8oZGV2LCByaW5nKTsKKwkJa2ZyZWUocmVxdWVzdCk7CisJfQorfQorCitzdGF0aWMgaW50CitpOTE1X2dlbV9kb19leGVjYnVmZmVyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEsCisJCSAgICAgICBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGUsCisJCSAgICAgICBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX2V4ZWNidWZmZXIyICphcmdzLAorCQkgICAgICAgc3RydWN0IGRybV9pOTE1X2dlbV9leGVjX29iamVjdDIgKmV4ZWMpCit7CisJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IGxpc3RfaGVhZCBvYmplY3RzOworCXN0cnVjdCBlYl9vYmplY3RzICplYjsKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqYmF0Y2hfb2JqOworCXN0cnVjdCBkcm1fY2xpcF9yZWN0ICpjbGlwcmVjdHMgPSBOVUxMOworCXN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZzsKKwl1MzIgZXhlY19zdGFydCwgZXhlY19sZW47CisJdTMyIHNlcW5vOworCWludCByZXQsIG1vZGUsIGk7CisKKwlpZiAoIWk5MTVfZ2VtX2NoZWNrX2V4ZWNidWZmZXIoYXJncykpIHsKKwkJRFJNX0VSUk9SKCJleGVjYnVmIHdpdGggaW52YWxpZCBvZmZzZXQvbGVuZ3RoXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0ID0gdmFsaWRhdGVfZXhlY19saXN0KGV4ZWMsIGFyZ3MtPmJ1ZmZlcl9jb3VudCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworI2lmIFdBVENIX0VYRUMKKwlEUk1fSU5GTygiYnVmZmVyc19wdHIgJWQgYnVmZmVyX2NvdW50ICVkIGxlbiAlMDh4XG4iLAorCQkgIChpbnQpIGFyZ3MtPmJ1ZmZlcnNfcHRyLCBhcmdzLT5idWZmZXJfY291bnQsIGFyZ3MtPmJhdGNoX2xlbik7CisjZW5kaWYKKwlzd2l0Y2ggKGFyZ3MtPmZsYWdzICYgSTkxNV9FWEVDX1JJTkdfTUFTSykgeworCWNhc2UgSTkxNV9FWEVDX0RFRkFVTFQ6CisJY2FzZSBJOTE1X0VYRUNfUkVOREVSOgorCQlyaW5nID0gJmRldl9wcml2LT5yaW5nW1JDU107CisJCWJyZWFrOworCWNhc2UgSTkxNV9FWEVDX0JTRDoKKwkJaWYgKCFIQVNfQlNEKGRldikpIHsKKwkJCURSTV9FUlJPUigiZXhlY2J1ZiB3aXRoIGludmFsaWQgcmluZyAoQlNEKVxuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlyaW5nID0gJmRldl9wcml2LT5yaW5nW1ZDU107CisJCWJyZWFrOworCWNhc2UgSTkxNV9FWEVDX0JMVDoKKwkJaWYgKCFIQVNfQkxUKGRldikpIHsKKwkJCURSTV9FUlJPUigiZXhlY2J1ZiB3aXRoIGludmFsaWQgcmluZyAoQkxUKVxuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlyaW5nID0gJmRldl9wcml2LT5yaW5nW0JDU107CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCURSTV9FUlJPUigiZXhlY2J1ZiB3aXRoIHVua25vd24gcmluZzogJWRcbiIsCisJCQkgIChpbnQpKGFyZ3MtPmZsYWdzICYgSTkxNV9FWEVDX1JJTkdfTUFTSykpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwltb2RlID0gYXJncy0+ZmxhZ3MgJiBJOTE1X0VYRUNfQ09OU1RBTlRTX01BU0s7CisJc3dpdGNoIChtb2RlKSB7CisJY2FzZSBJOTE1X0VYRUNfQ09OU1RBTlRTX1JFTF9HRU5FUkFMOgorCWNhc2UgSTkxNV9FWEVDX0NPTlNUQU5UU19BQlNPTFVURToKKwljYXNlIEk5MTVfRVhFQ19DT05TVEFOVFNfUkVMX1NVUkZBQ0U6CisJCWlmIChyaW5nID09ICZkZXZfcHJpdi0+cmluZ1tSQ1NdICYmCisJCSAgICBtb2RlICE9IGRldl9wcml2LT5yZWxhdGl2ZV9jb25zdGFudHNfbW9kZSkgeworCQkJaWYgKElOVEVMX0lORk8oZGV2KS0+Z2VuIDwgNCkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKworCQkJaWYgKElOVEVMX0lORk8oZGV2KS0+Z2VuID4gNSAmJgorCQkJICAgIG1vZGUgPT0gSTkxNV9FWEVDX0NPTlNUQU5UU19SRUxfU1VSRkFDRSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKworCQkJcmV0ID0gaW50ZWxfcmluZ19iZWdpbihyaW5nLCA0KTsKKwkJCWlmIChyZXQpCisJCQkJcmV0dXJuIHJldDsKKworCQkJaW50ZWxfcmluZ19lbWl0KHJpbmcsIE1JX05PT1ApOworCQkJaW50ZWxfcmluZ19lbWl0KHJpbmcsIE1JX0xPQURfUkVHSVNURVJfSU1NKDEpKTsKKwkJCWludGVsX3JpbmdfZW1pdChyaW5nLCBJTlNUUE0pOworCQkJaW50ZWxfcmluZ19lbWl0KHJpbmcsCisJCQkJCUk5MTVfRVhFQ19DT05TVEFOVFNfTUFTSyA8PCAxNiB8IG1vZGUpOworCQkJaW50ZWxfcmluZ19hZHZhbmNlKHJpbmcpOworCisJCQlkZXZfcHJpdi0+cmVsYXRpdmVfY29uc3RhbnRzX21vZGUgPSBtb2RlOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCURSTV9FUlJPUigiZXhlY2J1ZiB3aXRoIHVua25vd24gY29uc3RhbnRzOiAlZFxuIiwgbW9kZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChhcmdzLT5idWZmZXJfY291bnQgPCAxKSB7CisJCURSTV9FUlJPUigiZXhlY2J1ZiB3aXRoICVkIGJ1ZmZlcnNcbiIsIGFyZ3MtPmJ1ZmZlcl9jb3VudCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChhcmdzLT5udW1fY2xpcHJlY3RzICE9IDApIHsKKwkJaWYgKHJpbmcgIT0gJmRldl9wcml2LT5yaW5nW1JDU10pIHsKKwkJCURSTV9FUlJPUigiY2xpcCByZWN0YW5nbGVzIGFyZSBvbmx5IHZhbGlkIHdpdGggdGhlIHJlbmRlciByaW5nXG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJY2xpcHJlY3RzID0ga21hbGxvYyhhcmdzLT5udW1fY2xpcHJlY3RzICogc2l6ZW9mKCpjbGlwcmVjdHMpLAorCQkJCSAgICBHRlBfS0VSTkVMKTsKKwkJaWYgKGNsaXByZWN0cyA9PSBOVUxMKSB7CisJCQlyZXQgPSAtRU5PTUVNOworCQkJZ290byBwcmVfbXV0ZXhfZXJyOworCQl9CisKKwkJaWYgKGNvcHlfZnJvbV91c2VyKGNsaXByZWN0cywKKwkJCQkgICAgIChzdHJ1Y3QgZHJtX2NsaXBfcmVjdCBfX3VzZXIgKikodWludHB0cl90KQorCQkJCSAgICAgYXJncy0+Y2xpcHJlY3RzX3B0ciwKKwkJCQkgICAgIHNpemVvZigqY2xpcHJlY3RzKSphcmdzLT5udW1fY2xpcHJlY3RzKSkgeworCQkJcmV0ID0gLUVGQVVMVDsKKwkJCWdvdG8gcHJlX211dGV4X2VycjsKKwkJfQorCX0KKworCXJldCA9IGk5MTVfbXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKGRldik7CisJaWYgKHJldCkKKwkJZ290byBwcmVfbXV0ZXhfZXJyOworCisJaWYgKGRldl9wcml2LT5tbS5zdXNwZW5kZWQpIHsKKwkJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CisJCXJldCA9IC1FQlVTWTsKKwkJZ290byBwcmVfbXV0ZXhfZXJyOworCX0KKworCWViID0gZWJfY3JlYXRlKGFyZ3MtPmJ1ZmZlcl9jb3VudCk7CisJaWYgKGViID09IE5VTEwpIHsKKwkJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gcHJlX211dGV4X2VycjsKKwl9CisKKwkvKiBMb29rIHVwIG9iamVjdCBoYW5kbGVzICovCisJSU5JVF9MSVNUX0hFQUQoJm9iamVjdHMpOworCWZvciAoaSA9IDA7IGkgPCBhcmdzLT5idWZmZXJfY291bnQ7IGkrKykgeworCQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqOworCisJCW9iaiA9IHRvX2ludGVsX2JvKGRybV9nZW1fb2JqZWN0X2xvb2t1cChkZXYsIGZpbGUsCisJCQkJCQkJZXhlY1tpXS5oYW5kbGUpKTsKKwkJaWYgKG9iaiA9PSBOVUxMKSB7CisJCQlEUk1fRVJST1IoIkludmFsaWQgb2JqZWN0IGhhbmRsZSAlZCBhdCBpbmRleCAlZFxuIiwKKwkJCQkgICBleGVjW2ldLmhhbmRsZSwgaSk7CisJCQkvKiBwcmV2ZW50IGVycm9yIHBhdGggZnJvbSByZWFkaW5nIHVuaW5pdGlhbGl6ZWQgZGF0YSAqLworCQkJcmV0ID0gLUVOT0VOVDsKKwkJCWdvdG8gZXJyOworCQl9CisKKwkJaWYgKCFsaXN0X2VtcHR5KCZvYmotPmV4ZWNfbGlzdCkpIHsKKwkJCURSTV9FUlJPUigiT2JqZWN0ICVwIFtoYW5kbGUgJWQsIGluZGV4ICVkXSBhcHBlYXJzIG1vcmUgdGhhbiBvbmNlIGluIG9iamVjdCBsaXN0XG4iLAorCQkJCSAgIG9iaiwgZXhlY1tpXS5oYW5kbGUsIGkpOworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWdvdG8gZXJyOworCQl9CisKKwkJbGlzdF9hZGRfdGFpbCgmb2JqLT5leGVjX2xpc3QsICZvYmplY3RzKTsKKwkJb2JqLT5leGVjX2hhbmRsZSA9IGV4ZWNbaV0uaGFuZGxlOworCQllYl9hZGRfb2JqZWN0KGViLCBvYmopOworCX0KKworCS8qIE1vdmUgdGhlIG9iamVjdHMgZW4tbWFzc2UgaW50byB0aGUgR1RULCBldmljdGluZyBpZiBuZWNlc3NhcnkuICovCisJcmV0ID0gaTkxNV9nZW1fZXhlY2J1ZmZlcl9yZXNlcnZlKHJpbmcsIGZpbGUsICZvYmplY3RzLCBleGVjKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycjsKKworCS8qIFRoZSBvYmplY3RzIGFyZSBpbiB0aGVpciBmaW5hbCBsb2NhdGlvbnMsIGFwcGx5IHRoZSByZWxvY2F0aW9ucy4gKi8KKwlyZXQgPSBpOTE1X2dlbV9leGVjYnVmZmVyX3JlbG9jYXRlKGRldiwgZWIsICZvYmplY3RzLCBleGVjKTsKKwlpZiAocmV0KSB7CisJCWlmIChyZXQgPT0gLUVGQVVMVCkgeworCQkJcmV0ID0gaTkxNV9nZW1fZXhlY2J1ZmZlcl9yZWxvY2F0ZV9zbG93KGRldiwgZmlsZSwgcmluZywKKwkJCQkJCQkJJm9iamVjdHMsIGViLAorCQkJCQkJCQlleGVjLAorCQkJCQkJCQlhcmdzLT5idWZmZXJfY291bnQpOworCQkJQlVHX09OKCFtdXRleF9pc19sb2NrZWQoJmRldi0+c3RydWN0X211dGV4KSk7CisJCX0KKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJyOworCX0KKworCS8qIFNldCB0aGUgcGVuZGluZyByZWFkIGRvbWFpbnMgZm9yIHRoZSBiYXRjaCBidWZmZXIgdG8gQ09NTUFORCAqLworCWJhdGNoX29iaiA9IGxpc3RfZW50cnkob2JqZWN0cy5wcmV2LAorCQkJICAgICAgIHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0LAorCQkJICAgICAgIGV4ZWNfbGlzdCk7CisJaWYgKGJhdGNoX29iai0+YmFzZS5wZW5kaW5nX3dyaXRlX2RvbWFpbikgeworCQlEUk1fRVJST1IoIkF0dGVtcHRpbmcgdG8gdXNlIHNlbGYtbW9kaWZ5aW5nIGJhdGNoIGJ1ZmZlclxuIik7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZXJyOworCX0KKwliYXRjaF9vYmotPmJhc2UucGVuZGluZ19yZWFkX2RvbWFpbnMgfD0gSTkxNV9HRU1fRE9NQUlOX0NPTU1BTkQ7CisKKwlyZXQgPSBpOTE1X2dlbV9leGVjYnVmZmVyX21vdmVfdG9fZ3B1KHJpbmcsICZvYmplY3RzKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycjsKKworCXJldCA9IGk5MTVfZ2VtX2V4ZWNidWZmZXJfd2FpdF9mb3JfZmxpcHMocmluZywgJm9iamVjdHMpOworCWlmIChyZXQpCisJCWdvdG8gZXJyOworCisJc2Vxbm8gPSBpOTE1X2dlbV9uZXh0X3JlcXVlc3Rfc2Vxbm8oZGV2LCByaW5nKTsKKwlmb3IgKGkgPSAwOyBpIDwgSTkxNV9OVU1fUklOR1MtMTsgaSsrKSB7CisJCWlmIChzZXFubyA8IHJpbmctPnN5bmNfc2Vxbm9baV0pIHsKKwkJCS8qIFRoZSBHUFUgY2FuIG5vdCBoYW5kbGUgaXRzIHNlbWFwaG9yZSB2YWx1ZSB3cmFwcGluZywKKwkJCSAqIHNvIGV2ZXJ5IGJpbGxpb24gb3Igc28gZXhlY2J1ZmZlcnMsIHdlIG5lZWQgdG8gc3RhbGwKKwkJCSAqIHRoZSBHUFUgaW4gb3JkZXIgdG8gcmVzZXQgdGhlIGNvdW50ZXJzLgorCQkJICovCisJCQlyZXQgPSBpOTE1X2dwdV9pZGxlKGRldik7CisJCQlpZiAocmV0KQorCQkJCWdvdG8gZXJyOworCisJCQlCVUdfT04ocmluZy0+c3luY19zZXFub1tpXSk7CisJCX0KKwl9CisKKwlleGVjX3N0YXJ0ID0gYmF0Y2hfb2JqLT5ndHRfb2Zmc2V0ICsgYXJncy0+YmF0Y2hfc3RhcnRfb2Zmc2V0OworCWV4ZWNfbGVuID0gYXJncy0+YmF0Y2hfbGVuOworCWlmIChjbGlwcmVjdHMpIHsKKwkJZm9yIChpID0gMDsgaSA8IGFyZ3MtPm51bV9jbGlwcmVjdHM7IGkrKykgeworCQkJcmV0ID0gaTkxNV9lbWl0X2JveChkZXYsICZjbGlwcmVjdHNbaV0sCisJCQkJCSAgICBhcmdzLT5EUjEsIGFyZ3MtPkRSNCk7CisJCQlpZiAocmV0KQorCQkJCWdvdG8gZXJyOworCisJCQlyZXQgPSByaW5nLT5kaXNwYXRjaF9leGVjYnVmZmVyKHJpbmcsCisJCQkJCQkJZXhlY19zdGFydCwgZXhlY19sZW4pOworCQkJaWYgKHJldCkKKwkJCQlnb3RvIGVycjsKKwkJfQorCX0gZWxzZSB7CisJCXJldCA9IHJpbmctPmRpc3BhdGNoX2V4ZWNidWZmZXIocmluZywgZXhlY19zdGFydCwgZXhlY19sZW4pOworCQlpZiAocmV0KQorCQkJZ290byBlcnI7CisJfQorCisJaTkxNV9nZW1fZXhlY2J1ZmZlcl9tb3ZlX3RvX2FjdGl2ZSgmb2JqZWN0cywgcmluZywgc2Vxbm8pOworCWk5MTVfZ2VtX2V4ZWNidWZmZXJfcmV0aXJlX2NvbW1hbmRzKGRldiwgZmlsZSwgcmluZyk7CisKK2VycjoKKwllYl9kZXN0cm95KGViKTsKKwl3aGlsZSAoIWxpc3RfZW1wdHkoJm9iamVjdHMpKSB7CisJCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmo7CisKKwkJb2JqID0gbGlzdF9maXJzdF9lbnRyeSgmb2JqZWN0cywKKwkJCQkgICAgICAgc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QsCisJCQkJICAgICAgIGV4ZWNfbGlzdCk7CisJCWxpc3RfZGVsX2luaXQoJm9iai0+ZXhlY19saXN0KTsKKwkJZHJtX2dlbV9vYmplY3RfdW5yZWZlcmVuY2UoJm9iai0+YmFzZSk7CisJfQorCisJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CisKK3ByZV9tdXRleF9lcnI6CisJa2ZyZWUoY2xpcHJlY3RzKTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogTGVnYWN5IGV4ZWNidWZmZXIganVzdCBjcmVhdGVzIGFuIGV4ZWMyIGxpc3QgZnJvbSB0aGUgb3JpZ2luYWwgZXhlYyBvYmplY3QKKyAqIGxpc3QgYXJyYXkgYW5kIHBhc3NlcyBpdCB0byB0aGUgcmVhbCBmdW5jdGlvbi4KKyAqLworaW50CitpOTE1X2dlbV9leGVjYnVmZmVyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEsCisJCSAgICBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGUpCit7CisJc3RydWN0IGRybV9pOTE1X2dlbV9leGVjYnVmZmVyICphcmdzID0gZGF0YTsKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX2V4ZWNidWZmZXIyIGV4ZWMyOworCXN0cnVjdCBkcm1faTkxNV9nZW1fZXhlY19vYmplY3QgKmV4ZWNfbGlzdCA9IE5VTEw7CisJc3RydWN0IGRybV9pOTE1X2dlbV9leGVjX29iamVjdDIgKmV4ZWMyX2xpc3QgPSBOVUxMOworCWludCByZXQsIGk7CisKKyNpZiBXQVRDSF9FWEVDCisJRFJNX0lORk8oImJ1ZmZlcnNfcHRyICVkIGJ1ZmZlcl9jb3VudCAlZCBsZW4gJTA4eFxuIiwKKwkJICAoaW50KSBhcmdzLT5idWZmZXJzX3B0ciwgYXJncy0+YnVmZmVyX2NvdW50LCBhcmdzLT5iYXRjaF9sZW4pOworI2VuZGlmCisKKwlpZiAoYXJncy0+YnVmZmVyX2NvdW50IDwgMSkgeworCQlEUk1fRVJST1IoImV4ZWNidWYgd2l0aCAlZCBidWZmZXJzXG4iLCBhcmdzLT5idWZmZXJfY291bnQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBDb3B5IGluIHRoZSBleGVjIGxpc3QgZnJvbSB1c2VybGFuZCAqLworCWV4ZWNfbGlzdCA9IGRybV9tYWxsb2NfYWIoc2l6ZW9mKCpleGVjX2xpc3QpLCBhcmdzLT5idWZmZXJfY291bnQpOworCWV4ZWMyX2xpc3QgPSBkcm1fbWFsbG9jX2FiKHNpemVvZigqZXhlYzJfbGlzdCksIGFyZ3MtPmJ1ZmZlcl9jb3VudCk7CisJaWYgKGV4ZWNfbGlzdCA9PSBOVUxMIHx8IGV4ZWMyX2xpc3QgPT0gTlVMTCkgeworCQlEUk1fRVJST1IoIkZhaWxlZCB0byBhbGxvY2F0ZSBleGVjIGxpc3QgZm9yICVkIGJ1ZmZlcnNcbiIsCisJCQkgIGFyZ3MtPmJ1ZmZlcl9jb3VudCk7CisJCWRybV9mcmVlX2xhcmdlKGV4ZWNfbGlzdCk7CisJCWRybV9mcmVlX2xhcmdlKGV4ZWMyX2xpc3QpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJcmV0ID0gY29weV9mcm9tX3VzZXIoZXhlY19saXN0LAorCQkJICAgICAoc3RydWN0IGRybV9pOTE1X3JlbG9jYXRpb25fZW50cnkgX191c2VyICopCisJCQkgICAgICh1aW50cHRyX3QpIGFyZ3MtPmJ1ZmZlcnNfcHRyLAorCQkJICAgICBzaXplb2YoKmV4ZWNfbGlzdCkgKiBhcmdzLT5idWZmZXJfY291bnQpOworCWlmIChyZXQgIT0gMCkgeworCQlEUk1fRVJST1IoImNvcHkgJWQgZXhlYyBlbnRyaWVzIGZhaWxlZCAlZFxuIiwKKwkJCSAgYXJncy0+YnVmZmVyX2NvdW50LCByZXQpOworCQlkcm1fZnJlZV9sYXJnZShleGVjX2xpc3QpOworCQlkcm1fZnJlZV9sYXJnZShleGVjMl9saXN0KTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJZm9yIChpID0gMDsgaSA8IGFyZ3MtPmJ1ZmZlcl9jb3VudDsgaSsrKSB7CisJCWV4ZWMyX2xpc3RbaV0uaGFuZGxlID0gZXhlY19saXN0W2ldLmhhbmRsZTsKKwkJZXhlYzJfbGlzdFtpXS5yZWxvY2F0aW9uX2NvdW50ID0gZXhlY19saXN0W2ldLnJlbG9jYXRpb25fY291bnQ7CisJCWV4ZWMyX2xpc3RbaV0ucmVsb2NzX3B0ciA9IGV4ZWNfbGlzdFtpXS5yZWxvY3NfcHRyOworCQlleGVjMl9saXN0W2ldLmFsaWdubWVudCA9IGV4ZWNfbGlzdFtpXS5hbGlnbm1lbnQ7CisJCWV4ZWMyX2xpc3RbaV0ub2Zmc2V0ID0gZXhlY19saXN0W2ldLm9mZnNldDsKKwkJaWYgKElOVEVMX0lORk8oZGV2KS0+Z2VuIDwgNCkKKwkJCWV4ZWMyX2xpc3RbaV0uZmxhZ3MgPSBFWEVDX09CSkVDVF9ORUVEU19GRU5DRTsKKwkJZWxzZQorCQkJZXhlYzJfbGlzdFtpXS5mbGFncyA9IDA7CisJfQorCisJZXhlYzIuYnVmZmVyc19wdHIgPSBhcmdzLT5idWZmZXJzX3B0cjsKKwlleGVjMi5idWZmZXJfY291bnQgPSBhcmdzLT5idWZmZXJfY291bnQ7CisJZXhlYzIuYmF0Y2hfc3RhcnRfb2Zmc2V0ID0gYXJncy0+YmF0Y2hfc3RhcnRfb2Zmc2V0OworCWV4ZWMyLmJhdGNoX2xlbiA9IGFyZ3MtPmJhdGNoX2xlbjsKKwlleGVjMi5EUjEgPSBhcmdzLT5EUjE7CisJZXhlYzIuRFI0ID0gYXJncy0+RFI0OworCWV4ZWMyLm51bV9jbGlwcmVjdHMgPSBhcmdzLT5udW1fY2xpcHJlY3RzOworCWV4ZWMyLmNsaXByZWN0c19wdHIgPSBhcmdzLT5jbGlwcmVjdHNfcHRyOworCWV4ZWMyLmZsYWdzID0gSTkxNV9FWEVDX1JFTkRFUjsKKworCXJldCA9IGk5MTVfZ2VtX2RvX2V4ZWNidWZmZXIoZGV2LCBkYXRhLCBmaWxlLCAmZXhlYzIsIGV4ZWMyX2xpc3QpOworCWlmICghcmV0KSB7CisJCS8qIENvcHkgdGhlIG5ldyBidWZmZXIgb2Zmc2V0cyBiYWNrIHRvIHRoZSB1c2VyJ3MgZXhlYyBsaXN0LiAqLworCQlmb3IgKGkgPSAwOyBpIDwgYXJncy0+YnVmZmVyX2NvdW50OyBpKyspCisJCQlleGVjX2xpc3RbaV0ub2Zmc2V0ID0gZXhlYzJfbGlzdFtpXS5vZmZzZXQ7CisJCS8qIC4uLiBhbmQgYmFjayBvdXQgdG8gdXNlcnNwYWNlICovCisJCXJldCA9IGNvcHlfdG9fdXNlcigoc3RydWN0IGRybV9pOTE1X3JlbG9jYXRpb25fZW50cnkgX191c2VyICopCisJCQkJICAgKHVpbnRwdHJfdCkgYXJncy0+YnVmZmVyc19wdHIsCisJCQkJICAgZXhlY19saXN0LAorCQkJCSAgIHNpemVvZigqZXhlY19saXN0KSAqIGFyZ3MtPmJ1ZmZlcl9jb3VudCk7CisJCWlmIChyZXQpIHsKKwkJCXJldCA9IC1FRkFVTFQ7CisJCQlEUk1fRVJST1IoImZhaWxlZCB0byBjb3B5ICVkIGV4ZWMgZW50cmllcyAiCisJCQkJICAiYmFjayB0byB1c2VyICglZClcbiIsCisJCQkJICBhcmdzLT5idWZmZXJfY291bnQsIHJldCk7CisJCX0KKwl9CisKKwlkcm1fZnJlZV9sYXJnZShleGVjX2xpc3QpOworCWRybV9mcmVlX2xhcmdlKGV4ZWMyX2xpc3QpOworCXJldHVybiByZXQ7Cit9CisKK2ludAoraTkxNV9nZW1fZXhlY2J1ZmZlcjIoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdm9pZCAqZGF0YSwKKwkJICAgICBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGUpCit7CisJc3RydWN0IGRybV9pOTE1X2dlbV9leGVjYnVmZmVyMiAqYXJncyA9IGRhdGE7CisJc3RydWN0IGRybV9pOTE1X2dlbV9leGVjX29iamVjdDIgKmV4ZWMyX2xpc3QgPSBOVUxMOworCWludCByZXQ7CisKKyNpZiBXQVRDSF9FWEVDCisJRFJNX0lORk8oImJ1ZmZlcnNfcHRyICVkIGJ1ZmZlcl9jb3VudCAlZCBsZW4gJTA4eFxuIiwKKwkJICAoaW50KSBhcmdzLT5idWZmZXJzX3B0ciwgYXJncy0+YnVmZmVyX2NvdW50LCBhcmdzLT5iYXRjaF9sZW4pOworI2VuZGlmCisKKwlpZiAoYXJncy0+YnVmZmVyX2NvdW50IDwgMSkgeworCQlEUk1fRVJST1IoImV4ZWNidWYyIHdpdGggJWQgYnVmZmVyc1xuIiwgYXJncy0+YnVmZmVyX2NvdW50KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZXhlYzJfbGlzdCA9IGRybV9tYWxsb2NfYWIoc2l6ZW9mKCpleGVjMl9saXN0KSwgYXJncy0+YnVmZmVyX2NvdW50KTsKKwlpZiAoZXhlYzJfbGlzdCA9PSBOVUxMKSB7CisJCURSTV9FUlJPUigiRmFpbGVkIHRvIGFsbG9jYXRlIGV4ZWMgbGlzdCBmb3IgJWQgYnVmZmVyc1xuIiwKKwkJCSAgYXJncy0+YnVmZmVyX2NvdW50KTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCXJldCA9IGNvcHlfZnJvbV91c2VyKGV4ZWMyX2xpc3QsCisJCQkgICAgIChzdHJ1Y3QgZHJtX2k5MTVfcmVsb2NhdGlvbl9lbnRyeSBfX3VzZXIgKikKKwkJCSAgICAgKHVpbnRwdHJfdCkgYXJncy0+YnVmZmVyc19wdHIsCisJCQkgICAgIHNpemVvZigqZXhlYzJfbGlzdCkgKiBhcmdzLT5idWZmZXJfY291bnQpOworCWlmIChyZXQgIT0gMCkgeworCQlEUk1fRVJST1IoImNvcHkgJWQgZXhlYyBlbnRyaWVzIGZhaWxlZCAlZFxuIiwKKwkJCSAgYXJncy0+YnVmZmVyX2NvdW50LCByZXQpOworCQlkcm1fZnJlZV9sYXJnZShleGVjMl9saXN0KTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJcmV0ID0gaTkxNV9nZW1fZG9fZXhlY2J1ZmZlcihkZXYsIGRhdGEsIGZpbGUsIGFyZ3MsIGV4ZWMyX2xpc3QpOworCWlmICghcmV0KSB7CisJCS8qIENvcHkgdGhlIG5ldyBidWZmZXIgb2Zmc2V0cyBiYWNrIHRvIHRoZSB1c2VyJ3MgZXhlYyBsaXN0LiAqLworCQlyZXQgPSBjb3B5X3RvX3VzZXIoKHN0cnVjdCBkcm1faTkxNV9yZWxvY2F0aW9uX2VudHJ5IF9fdXNlciAqKQorCQkJCSAgICh1aW50cHRyX3QpIGFyZ3MtPmJ1ZmZlcnNfcHRyLAorCQkJCSAgIGV4ZWMyX2xpc3QsCisJCQkJICAgc2l6ZW9mKCpleGVjMl9saXN0KSAqIGFyZ3MtPmJ1ZmZlcl9jb3VudCk7CisJCWlmIChyZXQpIHsKKwkJCXJldCA9IC1FRkFVTFQ7CisJCQlEUk1fRVJST1IoImZhaWxlZCB0byBjb3B5ICVkIGV4ZWMgZW50cmllcyAiCisJCQkJICAiYmFjayB0byB1c2VyICglZClcbiIsCisJCQkJICBhcmdzLT5idWZmZXJfY291bnQsIHJldCk7CisJCX0KKwl9CisKKwlkcm1fZnJlZV9sYXJnZShleGVjMl9saXN0KTsKKwlyZXR1cm4gcmV0OworfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbV9ndHQuYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtX2d0dC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2NjczZTcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbV9ndHQuYwpAQCAtMCwwICsxLDk5IEBACisvKgorICogQ29weXJpZ2h0IMKpIDIwMTAgRGFuaWVsIFZldHRlcgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MKKyAqIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKi8KKworI2luY2x1ZGUgImRybVAuaCIKKyNpbmNsdWRlICJkcm0uaCIKKyNpbmNsdWRlICJpOTE1X2RybS5oIgorI2luY2x1ZGUgImk5MTVfZHJ2LmgiCisjaW5jbHVkZSAiaTkxNV90cmFjZS5oIgorI2luY2x1ZGUgImludGVsX2Rydi5oIgorCit2b2lkIGk5MTVfZ2VtX3Jlc3RvcmVfZ3R0X21hcHBpbmdzKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShvYmosICZkZXZfcHJpdi0+bW0uZ3R0X2xpc3QsIGd0dF9saXN0KSB7CisJCWk5MTVfZ2VtX2NsZmx1c2hfb2JqZWN0KG9iaik7CisKKwkJaWYgKGRldl9wcml2LT5tbS5ndHQtPm5lZWRzX2RtYXIpIHsKKwkJCUJVR19PTighb2JqLT5zZ19saXN0KTsKKworCQkJaW50ZWxfZ3R0X2luc2VydF9zZ19lbnRyaWVzKG9iai0+c2dfbGlzdCwKKwkJCQkJCSAgICBvYmotPm51bV9zZywKKwkJCQkJCSAgICBvYmotPmd0dF9zcGFjZS0+c3RhcnQKKwkJCQkJCQk+PiBQQUdFX1NISUZULAorCQkJCQkJICAgIG9iai0+YWdwX3R5cGUpOworCQl9IGVsc2UKKwkJCWludGVsX2d0dF9pbnNlcnRfcGFnZXMob2JqLT5ndHRfc3BhY2UtPnN0YXJ0CisJCQkJCQkgICA+PiBQQUdFX1NISUZULAorCQkJCQkgICAgICAgb2JqLT5iYXNlLnNpemUgPj4gUEFHRV9TSElGVCwKKwkJCQkJICAgICAgIG9iai0+cGFnZXMsCisJCQkJCSAgICAgICBvYmotPmFncF90eXBlKTsKKwl9CisKKwlpbnRlbF9ndHRfY2hpcHNldF9mbHVzaCgpOworfQorCitpbnQgaTkxNV9nZW1fZ3R0X2JpbmRfb2JqZWN0KHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmopCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IG9iai0+YmFzZS5kZXY7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlpbnQgcmV0OworCisJaWYgKGRldl9wcml2LT5tbS5ndHQtPm5lZWRzX2RtYXIpIHsKKwkJcmV0ID0gaW50ZWxfZ3R0X21hcF9tZW1vcnkob2JqLT5wYWdlcywKKwkJCQkJICAgb2JqLT5iYXNlLnNpemUgPj4gUEFHRV9TSElGVCwKKwkJCQkJICAgJm9iai0+c2dfbGlzdCwKKwkJCQkJICAgJm9iai0+bnVtX3NnKTsKKwkJaWYgKHJldCAhPSAwKQorCQkJcmV0dXJuIHJldDsKKworCQlpbnRlbF9ndHRfaW5zZXJ0X3NnX2VudHJpZXMob2JqLT5zZ19saXN0LAorCQkJCQkgICAgb2JqLT5udW1fc2csCisJCQkJCSAgICBvYmotPmd0dF9zcGFjZS0+c3RhcnQgPj4gUEFHRV9TSElGVCwKKwkJCQkJICAgIG9iai0+YWdwX3R5cGUpOworCX0gZWxzZQorCQlpbnRlbF9ndHRfaW5zZXJ0X3BhZ2VzKG9iai0+Z3R0X3NwYWNlLT5zdGFydCA+PiBQQUdFX1NISUZULAorCQkJCSAgICAgICBvYmotPmJhc2Uuc2l6ZSA+PiBQQUdFX1NISUZULAorCQkJCSAgICAgICBvYmotPnBhZ2VzLAorCQkJCSAgICAgICBvYmotPmFncF90eXBlKTsKKworCXJldHVybiAwOworfQorCit2b2lkIGk5MTVfZ2VtX2d0dF91bmJpbmRfb2JqZWN0KHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmopCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IG9iai0+YmFzZS5kZXY7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKworCWlmIChkZXZfcHJpdi0+bW0uZ3R0LT5uZWVkc19kbWFyKSB7CisJCWludGVsX2d0dF91bm1hcF9tZW1vcnkob2JqLT5zZ19saXN0LCBvYmotPm51bV9zZyk7CisJCW9iai0+c2dfbGlzdCA9IE5VTEw7CisJCW9iai0+bnVtX3NnID0gMDsKKwl9CisKKwlpbnRlbF9ndHRfY2xlYXJfcmFuZ2Uob2JqLT5ndHRfc3BhY2UtPnN0YXJ0ID4+IFBBR0VfU0hJRlQsCisJCQkgICAgICBvYmotPmJhc2Uuc2l6ZSA+PiBQQUdFX1NISUZUKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtX3RpbGluZy5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW1fdGlsaW5nLmMKaW5kZXggYWYzNTJkZS4uMjJhMzJiOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW1fdGlsaW5nLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW1fdGlsaW5nLmMKQEAgLTE4MSw3ICsxODEsNyBAQAogfQogCiAvKiBDaGVjayBwaXRjaCBjb25zdHJpYW50cyBmb3IgYWxsIGNoaXBzICYgdGlsaW5nIGZvcm1hdHMgKi8KLWJvb2wKK3N0YXRpYyBib29sCiBpOTE1X3RpbGluZ19vayhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgc3RyaWRlLCBpbnQgc2l6ZSwgaW50IHRpbGluZ19tb2RlKQogewogCWludCB0aWxlX3dpZHRoOwpAQCAtMjMyLDMyICsyMzIsNDQgQEAKIAlyZXR1cm4gdHJ1ZTsKIH0KIAotYm9vbAotaTkxNV9nZW1fb2JqZWN0X2ZlbmNlX29mZnNldF9vayhzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iaiwgaW50IHRpbGluZ19tb2RlKQorLyogSXMgdGhlIGN1cnJlbnQgR1RUIGFsbG9jYXRpb24gdmFsaWQgZm9yIHRoZSBjaGFuZ2UgaW4gdGlsaW5nPyAqLworc3RhdGljIGJvb2wKK2k5MTVfZ2VtX29iamVjdF9mZW5jZV9vayhzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqLCBpbnQgdGlsaW5nX21vZGUpCiB7Ci0Jc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IG9iai0+ZGV2OwotCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmpfcHJpdiA9IHRvX2ludGVsX2JvKG9iaik7Ci0KLQlpZiAob2JqX3ByaXYtPmd0dF9zcGFjZSA9PSBOVUxMKQotCQlyZXR1cm4gdHJ1ZTsKKwl1MzIgc2l6ZTsKIAogCWlmICh0aWxpbmdfbW9kZSA9PSBJOTE1X1RJTElOR19OT05FKQogCQlyZXR1cm4gdHJ1ZTsKIAotCWlmIChJTlRFTF9JTkZPKGRldiktPmdlbiA+PSA0KQorCWlmIChJTlRFTF9JTkZPKG9iai0+YmFzZS5kZXYpLT5nZW4gPj0gNCkKIAkJcmV0dXJuIHRydWU7CiAKLQlpZiAob2JqX3ByaXYtPmd0dF9vZmZzZXQgJiAob2JqLT5zaXplIC0gMSkpCi0JCXJldHVybiBmYWxzZTsKLQotCWlmIChJU19HRU4zKGRldikpIHsKLQkJaWYgKG9ial9wcml2LT5ndHRfb2Zmc2V0ICYgfkk5MTVfRkVOQ0VfU1RBUlRfTUFTSykKKwlpZiAoSU5URUxfSU5GTyhvYmotPmJhc2UuZGV2KS0+Z2VuID09IDMpIHsKKwkJaWYgKG9iai0+Z3R0X29mZnNldCAmIH5JOTE1X0ZFTkNFX1NUQVJUX01BU0spCiAJCQlyZXR1cm4gZmFsc2U7CiAJfSBlbHNlIHsKLQkJaWYgKG9ial9wcml2LT5ndHRfb2Zmc2V0ICYgfkk4MzBfRkVOQ0VfU1RBUlRfTUFTSykKKwkJaWYgKG9iai0+Z3R0X29mZnNldCAmIH5JODMwX0ZFTkNFX1NUQVJUX01BU0spCiAJCQlyZXR1cm4gZmFsc2U7CiAJfQogCisJLyoKKwkgKiBQcmV2aW91cyBjaGlwcyBuZWVkIHRvIGJlIGFsaWduZWQgdG8gdGhlIHNpemUgb2YgdGhlIHNtYWxsZXN0CisJICogZmVuY2UgcmVnaXN0ZXIgdGhhdCBjYW4gY29udGFpbiB0aGUgb2JqZWN0LgorCSAqLworCWlmIChJTlRFTF9JTkZPKG9iai0+YmFzZS5kZXYpLT5nZW4gPT0gMykKKwkJc2l6ZSA9IDEwMjQqMTAyNDsKKwllbHNlCisJCXNpemUgPSA1MTIqMTAyNDsKKworCXdoaWxlIChzaXplIDwgb2JqLT5iYXNlLnNpemUpCisJCXNpemUgPDw9IDE7CisKKwlpZiAob2JqLT5ndHRfc3BhY2UtPnNpemUgIT0gc2l6ZSkKKwkJcmV0dXJuIGZhbHNlOworCisJaWYgKG9iai0+Z3R0X29mZnNldCAmIChzaXplIC0gMSkpCisJCXJldHVybiBmYWxzZTsKKwogCXJldHVybiB0cnVlOwogfQogCkBAIC0yNjcsMzAgKzI3OSwyOSBAQAogICovCiBpbnQKIGk5MTVfZ2VtX3NldF90aWxpbmcoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdm9pZCAqZGF0YSwKLQkJICAgc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYpCisJCSAgIHN0cnVjdCBkcm1fZmlsZSAqZmlsZSkKIHsKIAlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX3NldF90aWxpbmcgKmFyZ3MgPSBkYXRhOwogCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCXN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqOwotCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmpfcHJpdjsKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqOwogCWludCByZXQ7CiAKIAlyZXQgPSBpOTE1X2dlbV9jaGVja19pc193ZWRnZWQoZGV2KTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCi0Jb2JqID0gZHJtX2dlbV9vYmplY3RfbG9va3VwKGRldiwgZmlsZV9wcml2LCBhcmdzLT5oYW5kbGUpOworCW9iaiA9IHRvX2ludGVsX2JvKGRybV9nZW1fb2JqZWN0X2xvb2t1cChkZXYsIGZpbGUsIGFyZ3MtPmhhbmRsZSkpOwogCWlmIChvYmogPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9FTlQ7Ci0Jb2JqX3ByaXYgPSB0b19pbnRlbF9ibyhvYmopOwogCi0JaWYgKCFpOTE1X3RpbGluZ19vayhkZXYsIGFyZ3MtPnN0cmlkZSwgb2JqLT5zaXplLCBhcmdzLT50aWxpbmdfbW9kZSkpIHsKLQkJZHJtX2dlbV9vYmplY3RfdW5yZWZlcmVuY2VfdW5sb2NrZWQob2JqKTsKKwlpZiAoIWk5MTVfdGlsaW5nX29rKGRldiwKKwkJCSAgICBhcmdzLT5zdHJpZGUsIG9iai0+YmFzZS5zaXplLCBhcmdzLT50aWxpbmdfbW9kZSkpIHsKKwkJZHJtX2dlbV9vYmplY3RfdW5yZWZlcmVuY2VfdW5sb2NrZWQoJm9iai0+YmFzZSk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCWlmIChvYmpfcHJpdi0+cGluX2NvdW50KSB7Ci0JCWRybV9nZW1fb2JqZWN0X3VucmVmZXJlbmNlX3VubG9ja2VkKG9iaik7CisJaWYgKG9iai0+cGluX2NvdW50KSB7CisJCWRybV9nZW1fb2JqZWN0X3VucmVmZXJlbmNlX3VubG9ja2VkKCZvYmotPmJhc2UpOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KIApAQCAtMzI0LDM0ICszMzUsMjggQEAKIAl9CiAKIAltdXRleF9sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7Ci0JaWYgKGFyZ3MtPnRpbGluZ19tb2RlICE9IG9ial9wcml2LT50aWxpbmdfbW9kZSB8fAotCSAgICBhcmdzLT5zdHJpZGUgIT0gb2JqX3ByaXYtPnN0cmlkZSkgeworCWlmIChhcmdzLT50aWxpbmdfbW9kZSAhPSBvYmotPnRpbGluZ19tb2RlIHx8CisJICAgIGFyZ3MtPnN0cmlkZSAhPSBvYmotPnN0cmlkZSkgewogCQkvKiBXZSBuZWVkIHRvIHJlYmluZCB0aGUgb2JqZWN0IGlmIGl0cyBjdXJyZW50IGFsbG9jYXRpb24KIAkJICogbm8gbG9uZ2VyIG1lZXRzIHRoZSBhbGlnbm1lbnQgcmVzdHJpY3Rpb25zIGZvciBpdHMgbmV3CiAJCSAqIHRpbGluZyBtb2RlLiBPdGhlcndpc2Ugd2UgY2FuIGp1c3QgbGVhdmUgaXQgYWxvbmUsIGJ1dAogCQkgKiBuZWVkIHRvIGVuc3VyZSB0aGF0IGFueSBmZW5jZSByZWdpc3RlciBpcyBjbGVhcmVkLgogCQkgKi8KLQkJaWYgKCFpOTE1X2dlbV9vYmplY3RfZmVuY2Vfb2Zmc2V0X29rKG9iaiwgYXJncy0+dGlsaW5nX21vZGUpKQotCQkJcmV0ID0gaTkxNV9nZW1fb2JqZWN0X3VuYmluZChvYmopOwotCQllbHNlIGlmIChvYmpfcHJpdi0+ZmVuY2VfcmVnICE9IEk5MTVfRkVOQ0VfUkVHX05PTkUpCi0JCQlyZXQgPSBpOTE1X2dlbV9vYmplY3RfcHV0X2ZlbmNlX3JlZyhvYmosIHRydWUpOwotCQllbHNlCi0JCQlpOTE1X2dlbV9yZWxlYXNlX21tYXAob2JqKTsKKwkJaTkxNV9nZW1fcmVsZWFzZV9tbWFwKG9iaik7CiAKLQkJaWYgKHJldCAhPSAwKSB7Ci0JCQlhcmdzLT50aWxpbmdfbW9kZSA9IG9ial9wcml2LT50aWxpbmdfbW9kZTsKLQkJCWFyZ3MtPnN0cmlkZSA9IG9ial9wcml2LT5zdHJpZGU7Ci0JCQlnb3RvIGVycjsKLQkJfQorCQlvYmotPm1hcF9hbmRfZmVuY2VhYmxlID0KKwkJCW9iai0+Z3R0X3NwYWNlID09IE5VTEwgfHwKKwkJCShvYmotPmd0dF9vZmZzZXQgKyBvYmotPmJhc2Uuc2l6ZSA8PSBkZXZfcHJpdi0+bW0uZ3R0X21hcHBhYmxlX2VuZCAmJgorCQkJIGk5MTVfZ2VtX29iamVjdF9mZW5jZV9vayhvYmosIGFyZ3MtPnRpbGluZ19tb2RlKSk7CiAKLQkJb2JqX3ByaXYtPnRpbGluZ19tb2RlID0gYXJncy0+dGlsaW5nX21vZGU7Ci0JCW9ial9wcml2LT5zdHJpZGUgPSBhcmdzLT5zdHJpZGU7CisJCW9iai0+dGlsaW5nX2NoYW5nZWQgPSB0cnVlOworCQlvYmotPnRpbGluZ19tb2RlID0gYXJncy0+dGlsaW5nX21vZGU7CisJCW9iai0+c3RyaWRlID0gYXJncy0+c3RyaWRlOwogCX0KLWVycjoKLQlkcm1fZ2VtX29iamVjdF91bnJlZmVyZW5jZShvYmopOworCWRybV9nZW1fb2JqZWN0X3VucmVmZXJlbmNlKCZvYmotPmJhc2UpOwogCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwogCi0JcmV0dXJuIHJldDsKKwlyZXR1cm4gMDsKIH0KIAogLyoqCkBAIC0zNTksMjIgKzM2NCwyMCBAQAogICovCiBpbnQKIGk5MTVfZ2VtX2dldF90aWxpbmcoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdm9pZCAqZGF0YSwKLQkJICAgc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYpCisJCSAgIHN0cnVjdCBkcm1fZmlsZSAqZmlsZSkKIHsKIAlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX2dldF90aWxpbmcgKmFyZ3MgPSBkYXRhOwogCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCXN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqOwotCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmpfcHJpdjsKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqOwogCi0Jb2JqID0gZHJtX2dlbV9vYmplY3RfbG9va3VwKGRldiwgZmlsZV9wcml2LCBhcmdzLT5oYW5kbGUpOworCW9iaiA9IHRvX2ludGVsX2JvKGRybV9nZW1fb2JqZWN0X2xvb2t1cChkZXYsIGZpbGUsIGFyZ3MtPmhhbmRsZSkpOwogCWlmIChvYmogPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9FTlQ7Ci0Jb2JqX3ByaXYgPSB0b19pbnRlbF9ibyhvYmopOwogCiAJbXV0ZXhfbG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwogCi0JYXJncy0+dGlsaW5nX21vZGUgPSBvYmpfcHJpdi0+dGlsaW5nX21vZGU7Ci0Jc3dpdGNoIChvYmpfcHJpdi0+dGlsaW5nX21vZGUpIHsKKwlhcmdzLT50aWxpbmdfbW9kZSA9IG9iai0+dGlsaW5nX21vZGU7CisJc3dpdGNoIChvYmotPnRpbGluZ19tb2RlKSB7CiAJY2FzZSBJOTE1X1RJTElOR19YOgogCQlhcmdzLT5zd2l6emxlX21vZGUgPSBkZXZfcHJpdi0+bW0uYml0XzZfc3dpenpsZV94OwogCQlicmVhazsKQEAgLTM5NCw3ICszOTcsNyBAQAogCWlmIChhcmdzLT5zd2l6emxlX21vZGUgPT0gSTkxNV9CSVRfNl9TV0laWkxFXzlfMTBfMTcpCiAJCWFyZ3MtPnN3aXp6bGVfbW9kZSA9IEk5MTVfQklUXzZfU1dJWlpMRV85XzEwOwogCi0JZHJtX2dlbV9vYmplY3RfdW5yZWZlcmVuY2Uob2JqKTsKKwlkcm1fZ2VtX29iamVjdF91bnJlZmVyZW5jZSgmb2JqLT5iYXNlKTsKIAltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKIAogCXJldHVybiAwOwpAQCAtNDI0LDQ2ICs0MjcsNDQgQEAKIH0KIAogdm9pZAotaTkxNV9nZW1fb2JqZWN0X2RvX2JpdF8xN19zd2l6emxlKHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqKQoraTkxNV9nZW1fb2JqZWN0X2RvX2JpdF8xN19zd2l6emxlKHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmopCiB7Ci0Jc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IG9iai0+ZGV2OworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBvYmotPmJhc2UuZGV2OwogCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmpfcHJpdiA9IHRvX2ludGVsX2JvKG9iaik7Ci0JaW50IHBhZ2VfY291bnQgPSBvYmotPnNpemUgPj4gUEFHRV9TSElGVDsKKwlpbnQgcGFnZV9jb3VudCA9IG9iai0+YmFzZS5zaXplID4+IFBBR0VfU0hJRlQ7CiAJaW50IGk7CiAKIAlpZiAoZGV2X3ByaXYtPm1tLmJpdF82X3N3aXp6bGVfeCAhPSBJOTE1X0JJVF82X1NXSVpaTEVfOV8xMF8xNykKIAkJcmV0dXJuOwogCi0JaWYgKG9ial9wcml2LT5iaXRfMTcgPT0gTlVMTCkKKwlpZiAob2JqLT5iaXRfMTcgPT0gTlVMTCkKIAkJcmV0dXJuOwogCiAJZm9yIChpID0gMDsgaSA8IHBhZ2VfY291bnQ7IGkrKykgewotCQljaGFyIG5ld19iaXRfMTcgPSBwYWdlX3RvX3BoeXMob2JqX3ByaXYtPnBhZ2VzW2ldKSA+PiAxNzsKKwkJY2hhciBuZXdfYml0XzE3ID0gcGFnZV90b19waHlzKG9iai0+cGFnZXNbaV0pID4+IDE3OwogCQlpZiAoKG5ld19iaXRfMTcgJiAweDEpICE9Ci0JCSAgICAodGVzdF9iaXQoaSwgb2JqX3ByaXYtPmJpdF8xNykgIT0gMCkpIHsKLQkJCWk5MTVfZ2VtX3N3aXp6bGVfcGFnZShvYmpfcHJpdi0+cGFnZXNbaV0pOwotCQkJc2V0X3BhZ2VfZGlydHkob2JqX3ByaXYtPnBhZ2VzW2ldKTsKKwkJICAgICh0ZXN0X2JpdChpLCBvYmotPmJpdF8xNykgIT0gMCkpIHsKKwkJCWk5MTVfZ2VtX3N3aXp6bGVfcGFnZShvYmotPnBhZ2VzW2ldKTsKKwkJCXNldF9wYWdlX2RpcnR5KG9iai0+cGFnZXNbaV0pOwogCQl9CiAJfQogfQogCiB2b2lkCi1pOTE1X2dlbV9vYmplY3Rfc2F2ZV9iaXRfMTdfc3dpenpsZShzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iaikKK2k5MTVfZ2VtX29iamVjdF9zYXZlX2JpdF8xN19zd2l6emxlKHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmopCiB7Ci0Jc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IG9iai0+ZGV2OworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBvYmotPmJhc2UuZGV2OwogCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmpfcHJpdiA9IHRvX2ludGVsX2JvKG9iaik7Ci0JaW50IHBhZ2VfY291bnQgPSBvYmotPnNpemUgPj4gUEFHRV9TSElGVDsKKwlpbnQgcGFnZV9jb3VudCA9IG9iai0+YmFzZS5zaXplID4+IFBBR0VfU0hJRlQ7CiAJaW50IGk7CiAKIAlpZiAoZGV2X3ByaXYtPm1tLmJpdF82X3N3aXp6bGVfeCAhPSBJOTE1X0JJVF82X1NXSVpaTEVfOV8xMF8xNykKIAkJcmV0dXJuOwogCi0JaWYgKG9ial9wcml2LT5iaXRfMTcgPT0gTlVMTCkgewotCQlvYmpfcHJpdi0+Yml0XzE3ID0ga21hbGxvYyhCSVRTX1RPX0xPTkdTKHBhZ2VfY291bnQpICoKKwlpZiAob2JqLT5iaXRfMTcgPT0gTlVMTCkgeworCQlvYmotPmJpdF8xNyA9IGttYWxsb2MoQklUU19UT19MT05HUyhwYWdlX2NvdW50KSAqCiAJCQkJCSAgIHNpemVvZihsb25nKSwgR0ZQX0tFUk5FTCk7Ci0JCWlmIChvYmpfcHJpdi0+Yml0XzE3ID09IE5VTEwpIHsKKwkJaWYgKG9iai0+Yml0XzE3ID09IE5VTEwpIHsKIAkJCURSTV9FUlJPUigiRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgYml0IDE3ICIKIAkJCQkgICJyZWNvcmRcbiIpOwogCQkJcmV0dXJuOwpAQCAtNDcxLDkgKzQ3Miw5IEBACiAJfQogCiAJZm9yIChpID0gMDsgaSA8IHBhZ2VfY291bnQ7IGkrKykgewotCQlpZiAocGFnZV90b19waHlzKG9ial9wcml2LT5wYWdlc1tpXSkgJiAoMSA8PCAxNykpCi0JCQlfX3NldF9iaXQoaSwgb2JqX3ByaXYtPmJpdF8xNyk7CisJCWlmIChwYWdlX3RvX3BoeXMob2JqLT5wYWdlc1tpXSkgJiAoMSA8PCAxNykpCisJCQlfX3NldF9iaXQoaSwgb2JqLT5iaXRfMTcpOwogCQllbHNlCi0JCQlfX2NsZWFyX2JpdChpLCBvYmpfcHJpdi0+Yml0XzE3KTsKKwkJCV9fY2xlYXJfYml0KGksIG9iai0+Yml0XzE3KTsKIAl9CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2lycS5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9pcnEuYwppbmRleCA3MjlmZDBjLi4wZGFkYzAyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2lycS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfaXJxLmMKQEAgLTY3LDIwICs2NywyMCBAQAogdm9pZAogaXJvbmxha2VfZW5hYmxlX2dyYXBoaWNzX2lycShkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2LCB1MzIgbWFzaykKIHsKLQlpZiAoKGRldl9wcml2LT5ndF9pcnFfbWFza19yZWcgJiBtYXNrKSAhPSAwKSB7Ci0JCWRldl9wcml2LT5ndF9pcnFfbWFza19yZWcgJj0gfm1hc2s7Ci0JCUk5MTVfV1JJVEUoR1RJTVIsIGRldl9wcml2LT5ndF9pcnFfbWFza19yZWcpOwotCQkodm9pZCkgSTkxNV9SRUFEKEdUSU1SKTsKKwlpZiAoKGRldl9wcml2LT5ndF9pcnFfbWFzayAmIG1hc2spICE9IDApIHsKKwkJZGV2X3ByaXYtPmd0X2lycV9tYXNrICY9IH5tYXNrOworCQlJOTE1X1dSSVRFKEdUSU1SLCBkZXZfcHJpdi0+Z3RfaXJxX21hc2spOworCQlQT1NUSU5HX1JFQUQoR1RJTVIpOwogCX0KIH0KIAogdm9pZAogaXJvbmxha2VfZGlzYWJsZV9ncmFwaGljc19pcnEoZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiwgdTMyIG1hc2spCiB7Ci0JaWYgKChkZXZfcHJpdi0+Z3RfaXJxX21hc2tfcmVnICYgbWFzaykgIT0gbWFzaykgewotCQlkZXZfcHJpdi0+Z3RfaXJxX21hc2tfcmVnIHw9IG1hc2s7Ci0JCUk5MTVfV1JJVEUoR1RJTVIsIGRldl9wcml2LT5ndF9pcnFfbWFza19yZWcpOwotCQkodm9pZCkgSTkxNV9SRUFEKEdUSU1SKTsKKwlpZiAoKGRldl9wcml2LT5ndF9pcnFfbWFzayAmIG1hc2spICE9IG1hc2spIHsKKwkJZGV2X3ByaXYtPmd0X2lycV9tYXNrIHw9IG1hc2s7CisJCUk5MTVfV1JJVEUoR1RJTVIsIGRldl9wcml2LT5ndF9pcnFfbWFzayk7CisJCVBPU1RJTkdfUkVBRChHVElNUik7CiAJfQogfQogCkBAIC04OCw0MCArODgsNDAgQEAKIHN0YXRpYyB2b2lkCiBpcm9ubGFrZV9lbmFibGVfZGlzcGxheV9pcnEoZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiwgdTMyIG1hc2spCiB7Ci0JaWYgKChkZXZfcHJpdi0+aXJxX21hc2tfcmVnICYgbWFzaykgIT0gMCkgewotCQlkZXZfcHJpdi0+aXJxX21hc2tfcmVnICY9IH5tYXNrOwotCQlJOTE1X1dSSVRFKERFSU1SLCBkZXZfcHJpdi0+aXJxX21hc2tfcmVnKTsKLQkJKHZvaWQpIEk5MTVfUkVBRChERUlNUik7CisJaWYgKChkZXZfcHJpdi0+aXJxX21hc2sgJiBtYXNrKSAhPSAwKSB7CisJCWRldl9wcml2LT5pcnFfbWFzayAmPSB+bWFzazsKKwkJSTkxNV9XUklURShERUlNUiwgZGV2X3ByaXYtPmlycV9tYXNrKTsKKwkJUE9TVElOR19SRUFEKERFSU1SKTsKIAl9CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZAogaXJvbmxha2VfZGlzYWJsZV9kaXNwbGF5X2lycShkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2LCB1MzIgbWFzaykKIHsKLQlpZiAoKGRldl9wcml2LT5pcnFfbWFza19yZWcgJiBtYXNrKSAhPSBtYXNrKSB7Ci0JCWRldl9wcml2LT5pcnFfbWFza19yZWcgfD0gbWFzazsKLQkJSTkxNV9XUklURShERUlNUiwgZGV2X3ByaXYtPmlycV9tYXNrX3JlZyk7Ci0JCSh2b2lkKSBJOTE1X1JFQUQoREVJTVIpOworCWlmICgoZGV2X3ByaXYtPmlycV9tYXNrICYgbWFzaykgIT0gbWFzaykgeworCQlkZXZfcHJpdi0+aXJxX21hc2sgfD0gbWFzazsKKwkJSTkxNV9XUklURShERUlNUiwgZGV2X3ByaXYtPmlycV9tYXNrKTsKKwkJUE9TVElOR19SRUFEKERFSU1SKTsKIAl9CiB9CiAKIHZvaWQKIGk5MTVfZW5hYmxlX2lycShkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2LCB1MzIgbWFzaykKIHsKLQlpZiAoKGRldl9wcml2LT5pcnFfbWFza19yZWcgJiBtYXNrKSAhPSAwKSB7Ci0JCWRldl9wcml2LT5pcnFfbWFza19yZWcgJj0gfm1hc2s7Ci0JCUk5MTVfV1JJVEUoSU1SLCBkZXZfcHJpdi0+aXJxX21hc2tfcmVnKTsKLQkJKHZvaWQpIEk5MTVfUkVBRChJTVIpOworCWlmICgoZGV2X3ByaXYtPmlycV9tYXNrICYgbWFzaykgIT0gMCkgeworCQlkZXZfcHJpdi0+aXJxX21hc2sgJj0gfm1hc2s7CisJCUk5MTVfV1JJVEUoSU1SLCBkZXZfcHJpdi0+aXJxX21hc2spOworCQlQT1NUSU5HX1JFQUQoSU1SKTsKIAl9CiB9CiAKIHZvaWQKIGk5MTVfZGlzYWJsZV9pcnEoZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiwgdTMyIG1hc2spCiB7Ci0JaWYgKChkZXZfcHJpdi0+aXJxX21hc2tfcmVnICYgbWFzaykgIT0gbWFzaykgewotCQlkZXZfcHJpdi0+aXJxX21hc2tfcmVnIHw9IG1hc2s7Ci0JCUk5MTVfV1JJVEUoSU1SLCBkZXZfcHJpdi0+aXJxX21hc2tfcmVnKTsKLQkJKHZvaWQpIEk5MTVfUkVBRChJTVIpOworCWlmICgoZGV2X3ByaXYtPmlycV9tYXNrICYgbWFzaykgIT0gbWFzaykgeworCQlkZXZfcHJpdi0+aXJxX21hc2sgfD0gbWFzazsKKwkJSTkxNV9XUklURShJTVIsIGRldl9wcml2LT5pcnFfbWFzayk7CisJCVBPU1RJTkdfUkVBRChJTVIpOwogCX0KIH0KIApAQCAtMTQ0LDcgKzE0NCw3IEBACiAJCWRldl9wcml2LT5waXBlc3RhdFtwaXBlXSB8PSBtYXNrOwogCQkvKiBFbmFibGUgdGhlIGludGVycnVwdCwgY2xlYXIgYW55IHBlbmRpbmcgc3RhdHVzICovCiAJCUk5MTVfV1JJVEUocmVnLCBkZXZfcHJpdi0+cGlwZXN0YXRbcGlwZV0gfCAobWFzayA+PiAxNikpOwotCQkodm9pZCkgSTkxNV9SRUFEKHJlZyk7CisJCVBPU1RJTkdfUkVBRChyZWcpOwogCX0KIH0KIApAQCAtMTU2LDE2ICsxNTYsMTkgQEAKIAogCQlkZXZfcHJpdi0+cGlwZXN0YXRbcGlwZV0gJj0gfm1hc2s7CiAJCUk5MTVfV1JJVEUocmVnLCBkZXZfcHJpdi0+cGlwZXN0YXRbcGlwZV0pOwotCQkodm9pZCkgSTkxNV9SRUFEKHJlZyk7CisJCVBPU1RJTkdfUkVBRChyZWcpOwogCX0KIH0KIAogLyoqCiAgKiBpbnRlbF9lbmFibGVfYXNsZSAtIGVuYWJsZSBBU0xFIGludGVycnVwdCBmb3IgT3BSZWdpb24KICAqLwotdm9pZCBpbnRlbF9lbmFibGVfYXNsZSAoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3ZvaWQgaW50ZWxfZW5hYmxlX2FzbGUoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKLQlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gKGRybV9pOTE1X3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOworCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXVuc2lnbmVkIGxvbmcgaXJxZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2X3ByaXYtPmlycV9sb2NrLCBpcnFmbGFncyk7CiAKIAlpZiAoSEFTX1BDSF9TUExJVChkZXYpKQogCQlpcm9ubGFrZV9lbmFibGVfZGlzcGxheV9pcnEoZGV2X3ByaXYsIERFX0dTRSk7CkBAIC0xNzYsNiArMTc5LDggQEAKIAkJCWk5MTVfZW5hYmxlX3BpcGVzdGF0KGRldl9wcml2LCAwLAogCQkJCQkgICAgIFBJUEVfTEVHQUNZX0JMQ19FVkVOVF9FTkFCTEUpOwogCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldl9wcml2LT5pcnFfbG9jaywgaXJxZmxhZ3MpOwogfQogCiAvKioKQEAgLTI0Myw2ICsyNDgsOTIgQEAKIAlyZXR1cm4gSTkxNV9SRUFEKHJlZyk7CiB9CiAKK2ludCBpOTE1X2dldF9jcnRjX3NjYW5vdXRwb3Moc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IHBpcGUsCisJCQkgICAgIGludCAqdnBvcywgaW50ICpocG9zKQoreworCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX2k5MTVfcHJpdmF0ZV90ICopIGRldi0+ZGV2X3ByaXZhdGU7CisJdTMyIHZibCA9IDAsIHBvc2l0aW9uID0gMDsKKwlpbnQgdmJsX3N0YXJ0LCB2YmxfZW5kLCBodG90YWwsIHZ0b3RhbDsKKwlib29sIGluX3ZibCA9IHRydWU7CisJaW50IHJldCA9IDA7CisKKwlpZiAoIWk5MTVfcGlwZV9lbmFibGVkKGRldiwgcGlwZSkpIHsKKwkJRFJNX0RFQlVHX0RSSVZFUigidHJ5aW5nIHRvIGdldCBzY2Fub3V0cG9zIGZvciBkaXNhYmxlZCAiCisJCQkJCSJwaXBlICVkXG4iLCBwaXBlKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogR2V0IHZ0b3RhbC4gKi8KKwl2dG90YWwgPSAxICsgKChJOTE1X1JFQUQoVlRPVEFMKHBpcGUpKSA+PiAxNikgJiAweDFmZmYpOworCisJaWYgKElOVEVMX0lORk8oZGV2KS0+Z2VuID49IDQpIHsKKwkJLyogTm8gb2J2aW91cyBwaXhlbGNvdW50IHJlZ2lzdGVyLiBPbmx5IHF1ZXJ5IHZlcnRpY2FsCisJCSAqIHNjYW5vdXQgcG9zaXRpb24gZnJvbSBEaXNwbGF5IHNjYW4gbGluZSByZWdpc3Rlci4KKwkJICovCisJCXBvc2l0aW9uID0gSTkxNV9SRUFEKFBJUEVEU0wocGlwZSkpOworCisJCS8qIERlY29kZSBpbnRvIHZlcnRpY2FsIHNjYW5vdXQgcG9zaXRpb24uIERvbid0IGhhdmUKKwkJICogaG9yaXpvbnRhbCBzY2Fub3V0IHBvc2l0aW9uLgorCQkgKi8KKwkJKnZwb3MgPSBwb3NpdGlvbiAmIDB4MWZmZjsKKwkJKmhwb3MgPSAwOworCX0gZWxzZSB7CisJCS8qIEhhdmUgYWNjZXNzIHRvIHBpeGVsY291bnQgc2luY2Ugc3RhcnQgb2YgZnJhbWUuCisJCSAqIFdlIGNhbiBzcGxpdCB0aGlzIGludG8gdmVydGljYWwgYW5kIGhvcml6b250YWwKKwkJICogc2Nhbm91dCBwb3NpdGlvbi4KKwkJICovCisJCXBvc2l0aW9uID0gKEk5MTVfUkVBRChQSVBFRlJBTUVQSVhFTChwaXBlKSkgJiBQSVBFX1BJWEVMX01BU0spID4+IFBJUEVfUElYRUxfU0hJRlQ7CisKKwkJaHRvdGFsID0gMSArICgoSTkxNV9SRUFEKEhUT1RBTChwaXBlKSkgPj4gMTYpICYgMHgxZmZmKTsKKwkJKnZwb3MgPSBwb3NpdGlvbiAvIGh0b3RhbDsKKwkJKmhwb3MgPSBwb3NpdGlvbiAtICgqdnBvcyAqIGh0b3RhbCk7CisJfQorCisJLyogUXVlcnkgdmJsYW5rIGFyZWEuICovCisJdmJsID0gSTkxNV9SRUFEKFZCTEFOSyhwaXBlKSk7CisKKwkvKiBUZXN0IHBvc2l0aW9uIGFnYWluc3QgdmJsYW5rIHJlZ2lvbi4gKi8KKwl2Ymxfc3RhcnQgPSB2YmwgJiAweDFmZmY7CisJdmJsX2VuZCA9ICh2YmwgPj4gMTYpICYgMHgxZmZmOworCisJaWYgKCgqdnBvcyA8IHZibF9zdGFydCkgfHwgKCp2cG9zID4gdmJsX2VuZCkpCisJCWluX3ZibCA9IGZhbHNlOworCisJLyogSW5zaWRlICJ1cHBlciBwYXJ0IiBvZiB2YmxhbmsgYXJlYT8gQXBwbHkgY29ycmVjdGl2ZSBvZmZzZXQ6ICovCisJaWYgKGluX3ZibCAmJiAoKnZwb3MgPj0gdmJsX3N0YXJ0KSkKKwkJKnZwb3MgPSAqdnBvcyAtIHZ0b3RhbDsKKworCS8qIFJlYWRvdXRzIHZhbGlkPyAqLworCWlmICh2YmwgPiAwKQorCQlyZXQgfD0gRFJNX1NDQU5PVVRQT1NfVkFMSUQgfCBEUk1fU0NBTk9VVFBPU19BQ0NVUkFURTsKKworCS8qIEluIHZibGFuaz8gKi8KKwlpZiAoaW5fdmJsKQorCQlyZXQgfD0gRFJNX1NDQU5PVVRQT1NfSU5WQkw7CisKKwlyZXR1cm4gcmV0OworfQorCitpbnQgaTkxNV9nZXRfdmJsYW5rX3RpbWVzdGFtcChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgY3J0YywKKwkJCSAgICAgIGludCAqbWF4X2Vycm9yLAorCQkJICAgICAgc3RydWN0IHRpbWV2YWwgKnZibGFua190aW1lLAorCQkJICAgICAgdW5zaWduZWQgZmxhZ3MpCit7CisJc3RydWN0IGRybV9jcnRjICpkcm1jcnRjOworCisJaWYgKGNydGMgPCAwIHx8IGNydGMgPj0gZGV2LT5udW1fY3J0Y3MpIHsKKwkJRFJNX0VSUk9SKCJJbnZhbGlkIGNydGMgJWRcbiIsIGNydGMpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBHZXQgZHJtX2NydGMgdG8gdGltZXN0YW1wOiAqLworCWRybWNydGMgPSBpbnRlbF9nZXRfY3J0Y19mb3JfcGlwZShkZXYsIGNydGMpOworCisJLyogSGVscGVyIHJvdXRpbmUgaW4gRFJNIGNvcmUgZG9lcyBhbGwgdGhlIHdvcms6ICovCisJcmV0dXJuIGRybV9jYWxjX3ZibHRpbWVzdGFtcF9mcm9tX3NjYW5vdXRwb3MoZGV2LCBjcnRjLCBtYXhfZXJyb3IsCisJCQkJCQkgICAgIHZibGFua190aW1lLCBmbGFncywgZHJtY3J0Yyk7Cit9CisKIC8qCiAgKiBIYW5kbGUgaG90cGx1ZyBldmVudHMgb3V0c2lkZSB0aGUgaW50ZXJydXB0IGhhbmRsZXIgcHJvcGVyLgogICovCkBAIC0yOTcsOCArMzg4LDggQEAKIAkJCXN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZykKIHsKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCXUzMiBzZXFubyA9IHJpbmctPmdldF9zZXFubyhkZXYsIHJpbmcpOwotCXJpbmctPmlycV9nZW1fc2Vxbm8gPSBzZXFubzsKKwl1MzIgc2Vxbm8gPSByaW5nLT5nZXRfc2Vxbm8ocmluZyk7CisJcmluZy0+aXJxX3NlcW5vID0gc2Vxbm87CiAJdHJhY2VfaTkxNV9nZW1fcmVxdWVzdF9jb21wbGV0ZShkZXYsIHNlcW5vKTsKIAl3YWtlX3VwX2FsbCgmcmluZy0+aXJxX3F1ZXVlKTsKIAlkZXZfcHJpdi0+aGFuZ2NoZWNrX2NvdW50ID0gMDsKQEAgLTMwNiwxMSArMzk3LDQ5IEBACiAJCSAgamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoRFJNX0k5MTVfSEFOR0NIRUNLX1BFUklPRCkpOwogfQogCitzdGF0aWMgdm9pZCBnZW42X3BtX2lycV9oYW5kbGVyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1faTkxNV9wcml2YXRlX3QgKikgZGV2LT5kZXZfcHJpdmF0ZTsKKwl1OCBuZXdfZGVsYXkgPSBkZXZfcHJpdi0+Y3VyX2RlbGF5OworCXUzMiBwbV9paXI7CisKKwlwbV9paXIgPSBJOTE1X1JFQUQoR0VONl9QTUlJUik7CisJaWYgKCFwbV9paXIpCisJCXJldHVybjsKKworCWlmIChwbV9paXIgJiBHRU42X1BNX1JQX1VQX1RIUkVTSE9MRCkgeworCQlpZiAoZGV2X3ByaXYtPmN1cl9kZWxheSAhPSBkZXZfcHJpdi0+bWF4X2RlbGF5KQorCQkJbmV3X2RlbGF5ID0gZGV2X3ByaXYtPmN1cl9kZWxheSArIDE7CisJCWlmIChuZXdfZGVsYXkgPiBkZXZfcHJpdi0+bWF4X2RlbGF5KQorCQkJbmV3X2RlbGF5ID0gZGV2X3ByaXYtPm1heF9kZWxheTsKKwl9IGVsc2UgaWYgKHBtX2lpciAmIChHRU42X1BNX1JQX0RPV05fVEhSRVNIT0xEIHwgR0VONl9QTV9SUF9ET1dOX1RJTUVPVVQpKSB7CisJCWlmIChkZXZfcHJpdi0+Y3VyX2RlbGF5ICE9IGRldl9wcml2LT5taW5fZGVsYXkpCisJCQluZXdfZGVsYXkgPSBkZXZfcHJpdi0+Y3VyX2RlbGF5IC0gMTsKKwkJaWYgKG5ld19kZWxheSA8IGRldl9wcml2LT5taW5fZGVsYXkpIHsKKwkJCW5ld19kZWxheSA9IGRldl9wcml2LT5taW5fZGVsYXk7CisJCQlJOTE1X1dSSVRFKEdFTjZfUlBfSU5URVJSVVBUX0xJTUlUUywKKwkJCQkgICBJOTE1X1JFQUQoR0VONl9SUF9JTlRFUlJVUFRfTElNSVRTKSB8CisJCQkJICAgKChuZXdfZGVsYXkgPDwgMTYpICYgMHgzZjAwMDApKTsKKwkJfSBlbHNlIHsKKwkJCS8qIE1ha2Ugc3VyZSB3ZSBjb250aW51ZSB0byBnZXQgZG93biBpbnRlcnJ1cHRzCisJCQkgKiB1bnRpbCB3ZSBoaXQgdGhlIG1pbmltdW0gZnJlcXVlbmN5ICovCisJCQlJOTE1X1dSSVRFKEdFTjZfUlBfSU5URVJSVVBUX0xJTUlUUywKKwkJCQkgICBJOTE1X1JFQUQoR0VONl9SUF9JTlRFUlJVUFRfTElNSVRTKSAmIH4weDNmMDAwMCk7CisJCX0KKworCX0KKworCWdlbjZfc2V0X3JwcyhkZXYsIG5ld19kZWxheSk7CisJZGV2X3ByaXYtPmN1cl9kZWxheSA9IG5ld19kZWxheTsKKworCUk5MTVfV1JJVEUoR0VONl9QTUlJUiwgcG1faWlyKTsKK30KKwogc3RhdGljIGlycXJldHVybl90IGlyb25sYWtlX2lycV9oYW5kbGVyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7CiAJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1faTkxNV9wcml2YXRlX3QgKikgZGV2LT5kZXZfcHJpdmF0ZTsKIAlpbnQgcmV0ID0gSVJRX05PTkU7Ci0JdTMyIGRlX2lpciwgZ3RfaWlyLCBkZV9pZXIsIHBjaF9paXI7CisJdTMyIGRlX2lpciwgZ3RfaWlyLCBkZV9pZXIsIHBjaF9paXIsIHBtX2lpcjsKIAl1MzIgaG90cGx1Z19tYXNrOwogCXN0cnVjdCBkcm1faTkxNV9tYXN0ZXJfcHJpdmF0ZSAqbWFzdGVyX3ByaXY7CiAJdTMyIGJzZF91c3JfaW50ZXJydXB0ID0gR1RfQlNEX1VTRVJfSU5URVJSVVBUOwpAQCAtMzIxLDEzICs0NTAsMTUgQEAKIAkvKiBkaXNhYmxlIG1hc3RlciBpbnRlcnJ1cHQgYmVmb3JlIGNsZWFyaW5nIGlpciAgKi8KIAlkZV9pZXIgPSBJOTE1X1JFQUQoREVJRVIpOwogCUk5MTVfV1JJVEUoREVJRVIsIGRlX2llciAmIH5ERV9NQVNURVJfSVJRX0NPTlRST0wpOwotCSh2b2lkKUk5MTVfUkVBRChERUlFUik7CisJUE9TVElOR19SRUFEKERFSUVSKTsKIAogCWRlX2lpciA9IEk5MTVfUkVBRChERUlJUik7CiAJZ3RfaWlyID0gSTkxNV9SRUFEKEdUSUlSKTsKIAlwY2hfaWlyID0gSTkxNV9SRUFEKFNERUlJUik7CisJcG1faWlyID0gSTkxNV9SRUFEKEdFTjZfUE1JSVIpOwogCi0JaWYgKGRlX2lpciA9PSAwICYmIGd0X2lpciA9PSAwICYmIHBjaF9paXIgPT0gMCkKKwlpZiAoZGVfaWlyID09IDAgJiYgZ3RfaWlyID09IDAgJiYgcGNoX2lpciA9PSAwICYmCisJICAgICghSVNfR0VONihkZXYpIHx8IHBtX2lpciA9PSAwKSkKIAkJZ290byBkb25lOwogCiAJaWYgKEhBU19QQ0hfQ1BUKGRldikpCkBAIC0zNDQsMTIgKzQ3NSwxMiBAQAogCQkJCVJFQURfQlJFQURDUlVNQihkZXZfcHJpdik7CiAJfQogCi0JaWYgKGd0X2lpciAmIEdUX1BJUEVfTk9USUZZKQotCQlub3RpZnlfcmluZyhkZXYsICZkZXZfcHJpdi0+cmVuZGVyX3JpbmcpOworCWlmIChndF9paXIgJiAoR1RfVVNFUl9JTlRFUlJVUFQgfCBHVF9QSVBFX05PVElGWSkpCisJCW5vdGlmeV9yaW5nKGRldiwgJmRldl9wcml2LT5yaW5nW1JDU10pOwogCWlmIChndF9paXIgJiBic2RfdXNyX2ludGVycnVwdCkKLQkJbm90aWZ5X3JpbmcoZGV2LCAmZGV2X3ByaXYtPmJzZF9yaW5nKTsKLQlpZiAoSEFTX0JMVChkZXYpICYmIGd0X2lpciAmIEdUX0JMVF9VU0VSX0lOVEVSUlVQVCkKLQkJbm90aWZ5X3JpbmcoZGV2LCAmZGV2X3ByaXYtPmJsdF9yaW5nKTsKKwkJbm90aWZ5X3JpbmcoZGV2LCAmZGV2X3ByaXYtPnJpbmdbVkNTXSk7CisJaWYgKGd0X2lpciAmIEdUX0JMVF9VU0VSX0lOVEVSUlVQVCkKKwkJbm90aWZ5X3JpbmcoZGV2LCAmZGV2X3ByaXYtPnJpbmdbQkNTXSk7CiAKIAlpZiAoZGVfaWlyICYgREVfR1NFKQogCQlpbnRlbF9vcHJlZ2lvbl9nc2VfaW50cihkZXYpOwpAQCAtMzc5LDYgKzUxMCw5IEBACiAJCWk5MTVfaGFuZGxlX3Jwc19jaGFuZ2UoZGV2KTsKIAl9CiAKKwlpZiAoSVNfR0VONihkZXYpKQorCQlnZW42X3BtX2lycV9oYW5kbGVyKGRldik7CisKIAkvKiBzaG91bGQgY2xlYXIgUENIIGhvdHBsdWcgZXZlbnQgYmVmb3JlIGNsZWFyIENQVSBpcnEgKi8KIAlJOTE1X1dSSVRFKFNERUlJUiwgcGNoX2lpcik7CiAJSTkxNV9XUklURShHVElJUiwgZ3RfaWlyKTsKQEAgLTM4Niw3ICs1MjAsNyBAQAogCiBkb25lOgogCUk5MTVfV1JJVEUoREVJRVIsIGRlX2llcik7Ci0JKHZvaWQpSTkxNV9SRUFEKERFSUVSKTsKKwlQT1NUSU5HX1JFQUQoREVJRVIpOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTQyMywyOCArNTU3LDIzIEBACiAjaWZkZWYgQ09ORklHX0RFQlVHX0ZTCiBzdGF0aWMgc3RydWN0IGRybV9pOTE1X2Vycm9yX29iamVjdCAqCiBpOTE1X2Vycm9yX29iamVjdF9jcmVhdGUoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKLQkJCSBzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKnNyYykKKwkJCSBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqc3JjKQogewogCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXN0cnVjdCBkcm1faTkxNV9lcnJvcl9vYmplY3QgKmRzdDsKLQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqc3JjX3ByaXY7CiAJaW50IHBhZ2UsIHBhZ2VfY291bnQ7CiAJdTMyIHJlbG9jX29mZnNldDsKIAotCWlmIChzcmMgPT0gTlVMTCkKKwlpZiAoc3JjID09IE5VTEwgfHwgc3JjLT5wYWdlcyA9PSBOVUxMKQogCQlyZXR1cm4gTlVMTDsKIAotCXNyY19wcml2ID0gdG9faW50ZWxfYm8oc3JjKTsKLQlpZiAoc3JjX3ByaXYtPnBhZ2VzID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCi0JcGFnZV9jb3VudCA9IHNyYy0+c2l6ZSAvIFBBR0VfU0laRTsKKwlwYWdlX2NvdW50ID0gc3JjLT5iYXNlLnNpemUgLyBQQUdFX1NJWkU7CiAKIAlkc3QgPSBrbWFsbG9jKHNpemVvZigqZHN0KSArIHBhZ2VfY291bnQgKiBzaXplb2YgKHUzMiAqKSwgR0ZQX0FUT01JQyk7CiAJaWYgKGRzdCA9PSBOVUxMKQogCQlyZXR1cm4gTlVMTDsKIAotCXJlbG9jX29mZnNldCA9IHNyY19wcml2LT5ndHRfb2Zmc2V0OworCXJlbG9jX29mZnNldCA9IHNyYy0+Z3R0X29mZnNldDsKIAlmb3IgKHBhZ2UgPSAwOyBwYWdlIDwgcGFnZV9jb3VudDsgcGFnZSsrKSB7CiAJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJCXZvaWQgX19pb21lbSAqczsKQEAgLTQ2Niw3ICs1OTUsNyBAQAogCQlyZWxvY19vZmZzZXQgKz0gUEFHRV9TSVpFOwogCX0KIAlkc3QtPnBhZ2VfY291bnQgPSBwYWdlX2NvdW50OwotCWRzdC0+Z3R0X29mZnNldCA9IHNyY19wcml2LT5ndHRfb2Zmc2V0OworCWRzdC0+Z3R0X29mZnNldCA9IHNyYy0+Z3R0X29mZnNldDsKIAogCXJldHVybiBkc3Q7CiAKQEAgLTUyMCwzNiArNjQ5LDk2IEBACiB9CiAKIHN0YXRpYyB1MzIKLWk5MTVfcmluZ2J1ZmZlcl9sYXN0X2JhdGNoKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCitpOTE1X3JpbmdidWZmZXJfbGFzdF9iYXRjaChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAorCQkJICAgc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nKQogewogCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJdTMyIGhlYWQsIGJiYWRkcjsKLQl1MzIgKnJpbmc7CisJdTMyICp2YWw7CiAKIAkvKiBMb2NhdGUgdGhlIGN1cnJlbnQgcG9zaXRpb24gaW4gdGhlIHJpbmdidWZmZXIgYW5kIHdhbGsgYmFjawogCSAqIHRvIGZpbmQgdGhlIG1vc3QgcmVjZW50bHkgZGlzcGF0Y2hlZCBiYXRjaCBidWZmZXIuCiAJICovCi0JYmJhZGRyID0gMDsKLQloZWFkID0gSTkxNV9SRUFEKFBSQjBfSEVBRCkgJiBIRUFEX0FERFI7Ci0JcmluZyA9ICh1MzIgKikoZGV2X3ByaXYtPnJlbmRlcl9yaW5nLnZpcnR1YWxfc3RhcnQgKyBoZWFkKTsKKwloZWFkID0gSTkxNV9SRUFEX0hFQUQocmluZykgJiBIRUFEX0FERFI7CiAKLQl3aGlsZSAoLS1yaW5nID49ICh1MzIgKilkZXZfcHJpdi0+cmVuZGVyX3JpbmcudmlydHVhbF9zdGFydCkgewotCQliYmFkZHIgPSBpOTE1X2dldF9iYmFkZHIoZGV2LCByaW5nKTsKKwl2YWwgPSAodTMyICopKHJpbmctPnZpcnR1YWxfc3RhcnQgKyBoZWFkKTsKKwl3aGlsZSAoLS12YWwgPj0gKHUzMiAqKXJpbmctPnZpcnR1YWxfc3RhcnQpIHsKKwkJYmJhZGRyID0gaTkxNV9nZXRfYmJhZGRyKGRldiwgdmFsKTsKIAkJaWYgKGJiYWRkcikKKwkJCXJldHVybiBiYmFkZHI7CisJfQorCisJdmFsID0gKHUzMiAqKShyaW5nLT52aXJ0dWFsX3N0YXJ0ICsgcmluZy0+c2l6ZSk7CisJd2hpbGUgKC0tdmFsID49ICh1MzIgKilyaW5nLT52aXJ0dWFsX3N0YXJ0KSB7CisJCWJiYWRkciA9IGk5MTVfZ2V0X2JiYWRkcihkZXYsIHZhbCk7CisJCWlmIChiYmFkZHIpCisJCQlyZXR1cm4gYmJhZGRyOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdTMyIGNhcHR1cmVfYm9fbGlzdChzdHJ1Y3QgZHJtX2k5MTVfZXJyb3JfYnVmZmVyICplcnIsCisJCQkgICBpbnQgY291bnQsCisJCQkgICBzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkKQoreworCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmo7CisJaW50IGkgPSAwOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShvYmosIGhlYWQsIG1tX2xpc3QpIHsKKwkJZXJyLT5zaXplID0gb2JqLT5iYXNlLnNpemU7CisJCWVyci0+bmFtZSA9IG9iai0+YmFzZS5uYW1lOworCQllcnItPnNlcW5vID0gb2JqLT5sYXN0X3JlbmRlcmluZ19zZXFubzsKKwkJZXJyLT5ndHRfb2Zmc2V0ID0gb2JqLT5ndHRfb2Zmc2V0OworCQllcnItPnJlYWRfZG9tYWlucyA9IG9iai0+YmFzZS5yZWFkX2RvbWFpbnM7CisJCWVyci0+d3JpdGVfZG9tYWluID0gb2JqLT5iYXNlLndyaXRlX2RvbWFpbjsKKwkJZXJyLT5mZW5jZV9yZWcgPSBvYmotPmZlbmNlX3JlZzsKKwkJZXJyLT5waW5uZWQgPSAwOworCQlpZiAob2JqLT5waW5fY291bnQgPiAwKQorCQkJZXJyLT5waW5uZWQgPSAxOworCQlpZiAob2JqLT51c2VyX3Bpbl9jb3VudCA+IDApCisJCQllcnItPnBpbm5lZCA9IC0xOworCQllcnItPnRpbGluZyA9IG9iai0+dGlsaW5nX21vZGU7CisJCWVyci0+ZGlydHkgPSBvYmotPmRpcnR5OworCQllcnItPnB1cmdlYWJsZSA9IG9iai0+bWFkdiAhPSBJOTE1X01BRFZfV0lMTE5FRUQ7CisJCWVyci0+cmluZyA9IG9iai0+cmluZyA/IG9iai0+cmluZy0+aWQgOiAwOworCisJCWlmICgrK2kgPT0gY291bnQpCiAJCQlicmVhazsKKworCQllcnIrKzsKIAl9CiAKLQlpZiAoYmJhZGRyID09IDApIHsKLQkJcmluZyA9ICh1MzIgKikoZGV2X3ByaXYtPnJlbmRlcl9yaW5nLnZpcnR1YWxfc3RhcnQKLQkJCQkrIGRldl9wcml2LT5yZW5kZXJfcmluZy5zaXplKTsKLQkJd2hpbGUgKC0tcmluZyA+PSAodTMyICopZGV2X3ByaXYtPnJlbmRlcl9yaW5nLnZpcnR1YWxfc3RhcnQpIHsKLQkJCWJiYWRkciA9IGk5MTVfZ2V0X2JiYWRkcihkZXYsIHJpbmcpOwotCQkJaWYgKGJiYWRkcikKLQkJCQlicmVhazsKLQkJfQotCX0KKwlyZXR1cm4gaTsKK30KIAotCXJldHVybiBiYmFkZHI7CitzdGF0aWMgdm9pZCBpOTE1X2dlbV9yZWNvcmRfZmVuY2VzKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCisJCQkJICAgc3RydWN0IGRybV9pOTE1X2Vycm9yX3N0YXRlICplcnJvcikKK3sKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWludCBpOworCisJLyogRmVuY2VzICovCisJc3dpdGNoIChJTlRFTF9JTkZPKGRldiktPmdlbikgeworCWNhc2UgNjoKKwkJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisJCQllcnJvci0+ZmVuY2VbaV0gPSBJOTE1X1JFQUQ2NChGRU5DRV9SRUdfU0FORFlCUklER0VfMCArIChpICogOCkpOworCQlicmVhazsKKwljYXNlIDU6CisJY2FzZSA0OgorCQlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKKwkJCWVycm9yLT5mZW5jZVtpXSA9IEk5MTVfUkVBRDY0KEZFTkNFX1JFR185NjVfMCArIChpICogOCkpOworCQlicmVhazsKKwljYXNlIDM6CisJCWlmIChJU19JOTQ1RyhkZXYpIHx8IElTX0k5NDVHTShkZXYpIHx8IElTX0czMyhkZXYpKQorCQkJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKwkJCQllcnJvci0+ZmVuY2VbaSs4XSA9IEk5MTVfUkVBRChGRU5DRV9SRUdfOTQ1XzggKyAoaSAqIDQpKTsKKwljYXNlIDI6CisJCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisJCQllcnJvci0+ZmVuY2VbaV0gPSBJOTE1X1JFQUQoRkVOQ0VfUkVHXzgzMF8wICsgKGkgKiA0KSk7CisJCWJyZWFrOworCisJfQogfQogCiAvKioKQEAgLTU2NCw5ICs3NTMsOSBAQAogc3RhdGljIHZvaWQgaTkxNV9jYXB0dXJlX2Vycm9yX3N0YXRlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqX3ByaXY7CisJc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iajsKIAlzdHJ1Y3QgZHJtX2k5MTVfZXJyb3Jfc3RhdGUgKmVycm9yOwotCXN0cnVjdCBkcm1fZ2VtX29iamVjdCAqYmF0Y2hidWZmZXJbMl07CisJc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKmJhdGNoYnVmZmVyWzJdOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdTMyIGJiYWRkcjsKIAlpbnQgY291bnQ7CkBAIC01ODUsMjAgKzc3NCwzMyBAQAogCiAJRFJNX0RFQlVHX0RSSVZFUigiZ2VuZXJhdGluZyBlcnJvciBldmVudFxuIik7CiAKLQllcnJvci0+c2Vxbm8gPQotCQlkZXZfcHJpdi0+cmVuZGVyX3JpbmcuZ2V0X3NlcW5vKGRldiwgJmRldl9wcml2LT5yZW5kZXJfcmluZyk7CisJZXJyb3ItPnNlcW5vID0gZGV2X3ByaXYtPnJpbmdbUkNTXS5nZXRfc2Vxbm8oJmRldl9wcml2LT5yaW5nW1JDU10pOwogCWVycm9yLT5laXIgPSBJOTE1X1JFQUQoRUlSKTsKIAllcnJvci0+cGd0YmxfZXIgPSBJOTE1X1JFQUQoUEdUQkxfRVIpOwogCWVycm9yLT5waXBlYXN0YXQgPSBJOTE1X1JFQUQoUElQRUFTVEFUKTsKIAllcnJvci0+cGlwZWJzdGF0ID0gSTkxNV9SRUFEKFBJUEVCU1RBVCk7CiAJZXJyb3ItPmluc3RwbSA9IEk5MTVfUkVBRChJTlNUUE0pOwotCWlmIChJTlRFTF9JTkZPKGRldiktPmdlbiA8IDQpIHsKLQkJZXJyb3ItPmlwZWlyID0gSTkxNV9SRUFEKElQRUlSKTsKLQkJZXJyb3ItPmlwZWhyID0gSTkxNV9SRUFEKElQRUhSKTsKLQkJZXJyb3ItPmluc3Rkb25lID0gSTkxNV9SRUFEKElOU1RET05FKTsKLQkJZXJyb3ItPmFjdGhkID0gSTkxNV9SRUFEKEFDVEhEKTsKLQkJZXJyb3ItPmJiYWRkciA9IDA7Ci0JfSBlbHNlIHsKKwllcnJvci0+ZXJyb3IgPSAwOworCWlmIChJTlRFTF9JTkZPKGRldiktPmdlbiA+PSA2KSB7CisJCWVycm9yLT5lcnJvciA9IEk5MTVfUkVBRChFUlJPUl9HRU42KTsKKworCQllcnJvci0+YmNzX2FjdGhkID0gSTkxNV9SRUFEKEJDU19BQ1RIRCk7CisJCWVycm9yLT5iY3NfaXBlaHIgPSBJOTE1X1JFQUQoQkNTX0lQRUhSKTsKKwkJZXJyb3ItPmJjc19pcGVpciA9IEk5MTVfUkVBRChCQ1NfSVBFSVIpOworCQllcnJvci0+YmNzX2luc3Rkb25lID0gSTkxNV9SRUFEKEJDU19JTlNURE9ORSk7CisJCWVycm9yLT5iY3Nfc2Vxbm8gPSAwOworCQlpZiAoZGV2X3ByaXYtPnJpbmdbQkNTXS5nZXRfc2Vxbm8pCisJCQllcnJvci0+YmNzX3NlcW5vID0gZGV2X3ByaXYtPnJpbmdbQkNTXS5nZXRfc2Vxbm8oJmRldl9wcml2LT5yaW5nW0JDU10pOworCisJCWVycm9yLT52Y3NfYWN0aGQgPSBJOTE1X1JFQUQoVkNTX0FDVEhEKTsKKwkJZXJyb3ItPnZjc19pcGVociA9IEk5MTVfUkVBRChWQ1NfSVBFSFIpOworCQllcnJvci0+dmNzX2lwZWlyID0gSTkxNV9SRUFEKFZDU19JUEVJUik7CisJCWVycm9yLT52Y3NfaW5zdGRvbmUgPSBJOTE1X1JFQUQoVkNTX0lOU1RET05FKTsKKwkJZXJyb3ItPnZjc19zZXFubyA9IDA7CisJCWlmIChkZXZfcHJpdi0+cmluZ1tWQ1NdLmdldF9zZXFubykKKwkJCWVycm9yLT52Y3Nfc2Vxbm8gPSBkZXZfcHJpdi0+cmluZ1tWQ1NdLmdldF9zZXFubygmZGV2X3ByaXYtPnJpbmdbVkNTXSk7CisJfQorCWlmIChJTlRFTF9JTkZPKGRldiktPmdlbiA+PSA0KSB7CiAJCWVycm9yLT5pcGVpciA9IEk5MTVfUkVBRChJUEVJUl9JOTY1KTsKIAkJZXJyb3ItPmlwZWhyID0gSTkxNV9SRUFEKElQRUhSX0k5NjUpOwogCQllcnJvci0+aW5zdGRvbmUgPSBJOTE1X1JFQUQoSU5TVERPTkVfSTk2NSk7CkBAIC02MDYsNDIgKzgwOCw0NSBAQAogCQllcnJvci0+aW5zdGRvbmUxID0gSTkxNV9SRUFEKElOU1RET05FMSk7CiAJCWVycm9yLT5hY3RoZCA9IEk5MTVfUkVBRChBQ1RIRF9JOTY1KTsKIAkJZXJyb3ItPmJiYWRkciA9IEk5MTVfUkVBRDY0KEJCX0FERFIpOworCX0gZWxzZSB7CisJCWVycm9yLT5pcGVpciA9IEk5MTVfUkVBRChJUEVJUik7CisJCWVycm9yLT5pcGVociA9IEk5MTVfUkVBRChJUEVIUik7CisJCWVycm9yLT5pbnN0ZG9uZSA9IEk5MTVfUkVBRChJTlNURE9ORSk7CisJCWVycm9yLT5hY3RoZCA9IEk5MTVfUkVBRChBQ1RIRCk7CisJCWVycm9yLT5iYmFkZHIgPSAwOwogCX0KKwlpOTE1X2dlbV9yZWNvcmRfZmVuY2VzKGRldiwgZXJyb3IpOwogCi0JYmJhZGRyID0gaTkxNV9yaW5nYnVmZmVyX2xhc3RfYmF0Y2goZGV2KTsKKwliYmFkZHIgPSBpOTE1X3JpbmdidWZmZXJfbGFzdF9iYXRjaChkZXYsICZkZXZfcHJpdi0+cmluZ1tSQ1NdKTsKIAogCS8qIEdyYWIgdGhlIGN1cnJlbnQgYmF0Y2hidWZmZXIsIG1vc3QgbGlrZWx5IHRvIGhhdmUgY3Jhc2hlZC4gKi8KIAliYXRjaGJ1ZmZlclswXSA9IE5VTEw7CiAJYmF0Y2hidWZmZXJbMV0gPSBOVUxMOwogCWNvdW50ID0gMDsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KG9ial9wcml2LCAmZGV2X3ByaXYtPm1tLmFjdGl2ZV9saXN0LCBtbV9saXN0KSB7Ci0JCXN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqID0gJm9ial9wcml2LT5iYXNlOwotCisJbGlzdF9mb3JfZWFjaF9lbnRyeShvYmosICZkZXZfcHJpdi0+bW0uYWN0aXZlX2xpc3QsIG1tX2xpc3QpIHsKIAkJaWYgKGJhdGNoYnVmZmVyWzBdID09IE5VTEwgJiYKLQkJICAgIGJiYWRkciA+PSBvYmpfcHJpdi0+Z3R0X29mZnNldCAmJgotCQkgICAgYmJhZGRyIDwgb2JqX3ByaXYtPmd0dF9vZmZzZXQgKyBvYmotPnNpemUpCisJCSAgICBiYmFkZHIgPj0gb2JqLT5ndHRfb2Zmc2V0ICYmCisJCSAgICBiYmFkZHIgPCBvYmotPmd0dF9vZmZzZXQgKyBvYmotPmJhc2Uuc2l6ZSkKIAkJCWJhdGNoYnVmZmVyWzBdID0gb2JqOwogCiAJCWlmIChiYXRjaGJ1ZmZlclsxXSA9PSBOVUxMICYmCi0JCSAgICBlcnJvci0+YWN0aGQgPj0gb2JqX3ByaXYtPmd0dF9vZmZzZXQgJiYKLQkJICAgIGVycm9yLT5hY3RoZCA8IG9ial9wcml2LT5ndHRfb2Zmc2V0ICsgb2JqLT5zaXplKQorCQkgICAgZXJyb3ItPmFjdGhkID49IG9iai0+Z3R0X29mZnNldCAmJgorCQkgICAgZXJyb3ItPmFjdGhkIDwgb2JqLT5ndHRfb2Zmc2V0ICsgb2JqLT5iYXNlLnNpemUpCiAJCQliYXRjaGJ1ZmZlclsxXSA9IG9iajsKIAogCQljb3VudCsrOwogCX0KIAkvKiBTY2FuIHRoZSBvdGhlciBsaXN0cyBmb3IgY29tcGxldGVuZXNzIGZvciB0aG9zZSBiaXphcnJlIGVycm9ycy4gKi8KIAlpZiAoYmF0Y2hidWZmZXJbMF0gPT0gTlVMTCB8fCBiYXRjaGJ1ZmZlclsxXSA9PSBOVUxMKSB7Ci0JCWxpc3RfZm9yX2VhY2hfZW50cnkob2JqX3ByaXYsICZkZXZfcHJpdi0+bW0uZmx1c2hpbmdfbGlzdCwgbW1fbGlzdCkgewotCQkJc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmogPSAmb2JqX3ByaXYtPmJhc2U7Ci0KKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShvYmosICZkZXZfcHJpdi0+bW0uZmx1c2hpbmdfbGlzdCwgbW1fbGlzdCkgewogCQkJaWYgKGJhdGNoYnVmZmVyWzBdID09IE5VTEwgJiYKLQkJCSAgICBiYmFkZHIgPj0gb2JqX3ByaXYtPmd0dF9vZmZzZXQgJiYKLQkJCSAgICBiYmFkZHIgPCBvYmpfcHJpdi0+Z3R0X29mZnNldCArIG9iai0+c2l6ZSkKKwkJCSAgICBiYmFkZHIgPj0gb2JqLT5ndHRfb2Zmc2V0ICYmCisJCQkgICAgYmJhZGRyIDwgb2JqLT5ndHRfb2Zmc2V0ICsgb2JqLT5iYXNlLnNpemUpCiAJCQkJYmF0Y2hidWZmZXJbMF0gPSBvYmo7CiAKIAkJCWlmIChiYXRjaGJ1ZmZlclsxXSA9PSBOVUxMICYmCi0JCQkgICAgZXJyb3ItPmFjdGhkID49IG9ial9wcml2LT5ndHRfb2Zmc2V0ICYmCi0JCQkgICAgZXJyb3ItPmFjdGhkIDwgb2JqX3ByaXYtPmd0dF9vZmZzZXQgKyBvYmotPnNpemUpCisJCQkgICAgZXJyb3ItPmFjdGhkID49IG9iai0+Z3R0X29mZnNldCAmJgorCQkJICAgIGVycm9yLT5hY3RoZCA8IG9iai0+Z3R0X29mZnNldCArIG9iai0+YmFzZS5zaXplKQogCQkJCWJhdGNoYnVmZmVyWzFdID0gb2JqOwogCiAJCQlpZiAoYmF0Y2hidWZmZXJbMF0gJiYgYmF0Y2hidWZmZXJbMV0pCkBAIC02NDksMTcgKzg1NCwxNSBAQAogCQl9CiAJfQogCWlmIChiYXRjaGJ1ZmZlclswXSA9PSBOVUxMIHx8IGJhdGNoYnVmZmVyWzFdID09IE5VTEwpIHsKLQkJbGlzdF9mb3JfZWFjaF9lbnRyeShvYmpfcHJpdiwgJmRldl9wcml2LT5tbS5pbmFjdGl2ZV9saXN0LCBtbV9saXN0KSB7Ci0JCQlzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iaiA9ICZvYmpfcHJpdi0+YmFzZTsKLQorCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KG9iaiwgJmRldl9wcml2LT5tbS5pbmFjdGl2ZV9saXN0LCBtbV9saXN0KSB7CiAJCQlpZiAoYmF0Y2hidWZmZXJbMF0gPT0gTlVMTCAmJgotCQkJICAgIGJiYWRkciA+PSBvYmpfcHJpdi0+Z3R0X29mZnNldCAmJgotCQkJICAgIGJiYWRkciA8IG9ial9wcml2LT5ndHRfb2Zmc2V0ICsgb2JqLT5zaXplKQorCQkJICAgIGJiYWRkciA+PSBvYmotPmd0dF9vZmZzZXQgJiYKKwkJCSAgICBiYmFkZHIgPCBvYmotPmd0dF9vZmZzZXQgKyBvYmotPmJhc2Uuc2l6ZSkKIAkJCQliYXRjaGJ1ZmZlclswXSA9IG9iajsKIAogCQkJaWYgKGJhdGNoYnVmZmVyWzFdID09IE5VTEwgJiYKLQkJCSAgICBlcnJvci0+YWN0aGQgPj0gb2JqX3ByaXYtPmd0dF9vZmZzZXQgJiYKLQkJCSAgICBlcnJvci0+YWN0aGQgPCBvYmpfcHJpdi0+Z3R0X29mZnNldCArIG9iai0+c2l6ZSkKKwkJCSAgICBlcnJvci0+YWN0aGQgPj0gb2JqLT5ndHRfb2Zmc2V0ICYmCisJCQkgICAgZXJyb3ItPmFjdGhkIDwgb2JqLT5ndHRfb2Zmc2V0ICsgb2JqLT5iYXNlLnNpemUpCiAJCQkJYmF0Y2hidWZmZXJbMV0gPSBvYmo7CiAKIAkJCWlmIChiYXRjaGJ1ZmZlclswXSAmJiBiYXRjaGJ1ZmZlclsxXSkKQEAgLTY3OCw0NiArODgxLDQxIEBACiAKIAkvKiBSZWNvcmQgdGhlIHJpbmdidWZmZXIgKi8KIAllcnJvci0+cmluZ2J1ZmZlciA9IGk5MTVfZXJyb3Jfb2JqZWN0X2NyZWF0ZShkZXYsCi0JCQlkZXZfcHJpdi0+cmVuZGVyX3JpbmcuZ2VtX29iamVjdCk7CisJCQkJCQkgICAgIGRldl9wcml2LT5yaW5nW1JDU10ub2JqKTsKIAotCS8qIFJlY29yZCBidWZmZXJzIG9uIHRoZSBhY3RpdmUgbGlzdC4gKi8KKwkvKiBSZWNvcmQgYnVmZmVycyBvbiB0aGUgYWN0aXZlIGFuZCBwaW5uZWQgbGlzdHMuICovCiAJZXJyb3ItPmFjdGl2ZV9ibyA9IE5VTEw7Ci0JZXJyb3ItPmFjdGl2ZV9ib19jb3VudCA9IDA7CisJZXJyb3ItPnBpbm5lZF9ibyA9IE5VTEw7CiAKLQlpZiAoY291bnQpCisJZXJyb3ItPmFjdGl2ZV9ib19jb3VudCA9IGNvdW50OworCWxpc3RfZm9yX2VhY2hfZW50cnkob2JqLCAmZGV2X3ByaXYtPm1tLnBpbm5lZF9saXN0LCBtbV9saXN0KQorCQljb3VudCsrOworCWVycm9yLT5waW5uZWRfYm9fY291bnQgPSBjb3VudCAtIGVycm9yLT5hY3RpdmVfYm9fY291bnQ7CisKKwlpZiAoY291bnQpIHsKIAkJZXJyb3ItPmFjdGl2ZV9ibyA9IGttYWxsb2Moc2l6ZW9mKCplcnJvci0+YWN0aXZlX2JvKSpjb3VudCwKIAkJCQkJICAgR0ZQX0FUT01JQyk7Ci0KLQlpZiAoZXJyb3ItPmFjdGl2ZV9ibykgewotCQlpbnQgaSA9IDA7Ci0JCWxpc3RfZm9yX2VhY2hfZW50cnkob2JqX3ByaXYsICZkZXZfcHJpdi0+bW0uYWN0aXZlX2xpc3QsIG1tX2xpc3QpIHsKLQkJCXN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqID0gJm9ial9wcml2LT5iYXNlOwotCi0JCQllcnJvci0+YWN0aXZlX2JvW2ldLnNpemUgPSBvYmotPnNpemU7Ci0JCQllcnJvci0+YWN0aXZlX2JvW2ldLm5hbWUgPSBvYmotPm5hbWU7Ci0JCQllcnJvci0+YWN0aXZlX2JvW2ldLnNlcW5vID0gb2JqX3ByaXYtPmxhc3RfcmVuZGVyaW5nX3NlcW5vOwotCQkJZXJyb3ItPmFjdGl2ZV9ib1tpXS5ndHRfb2Zmc2V0ID0gb2JqX3ByaXYtPmd0dF9vZmZzZXQ7Ci0JCQllcnJvci0+YWN0aXZlX2JvW2ldLnJlYWRfZG9tYWlucyA9IG9iai0+cmVhZF9kb21haW5zOwotCQkJZXJyb3ItPmFjdGl2ZV9ib1tpXS53cml0ZV9kb21haW4gPSBvYmotPndyaXRlX2RvbWFpbjsKLQkJCWVycm9yLT5hY3RpdmVfYm9baV0uZmVuY2VfcmVnID0gb2JqX3ByaXYtPmZlbmNlX3JlZzsKLQkJCWVycm9yLT5hY3RpdmVfYm9baV0ucGlubmVkID0gMDsKLQkJCWlmIChvYmpfcHJpdi0+cGluX2NvdW50ID4gMCkKLQkJCQllcnJvci0+YWN0aXZlX2JvW2ldLnBpbm5lZCA9IDE7Ci0JCQlpZiAob2JqX3ByaXYtPnVzZXJfcGluX2NvdW50ID4gMCkKLQkJCQllcnJvci0+YWN0aXZlX2JvW2ldLnBpbm5lZCA9IC0xOwotCQkJZXJyb3ItPmFjdGl2ZV9ib1tpXS50aWxpbmcgPSBvYmpfcHJpdi0+dGlsaW5nX21vZGU7Ci0JCQllcnJvci0+YWN0aXZlX2JvW2ldLmRpcnR5ID0gb2JqX3ByaXYtPmRpcnR5OwotCQkJZXJyb3ItPmFjdGl2ZV9ib1tpXS5wdXJnZWFibGUgPSBvYmpfcHJpdi0+bWFkdiAhPSBJOTE1X01BRFZfV0lMTE5FRUQ7Ci0KLQkJCWlmICgrK2kgPT0gY291bnQpCi0JCQkJYnJlYWs7Ci0JCX0KLQkJZXJyb3ItPmFjdGl2ZV9ib19jb3VudCA9IGk7CisJCWlmIChlcnJvci0+YWN0aXZlX2JvKQorCQkJZXJyb3ItPnBpbm5lZF9ibyA9CisJCQkJZXJyb3ItPmFjdGl2ZV9ibyArIGVycm9yLT5hY3RpdmVfYm9fY291bnQ7CiAJfQogCisJaWYgKGVycm9yLT5hY3RpdmVfYm8pCisJCWVycm9yLT5hY3RpdmVfYm9fY291bnQgPQorCQkJY2FwdHVyZV9ib19saXN0KGVycm9yLT5hY3RpdmVfYm8sCisJCQkJCWVycm9yLT5hY3RpdmVfYm9fY291bnQsCisJCQkJCSZkZXZfcHJpdi0+bW0uYWN0aXZlX2xpc3QpOworCisJaWYgKGVycm9yLT5waW5uZWRfYm8pCisJCWVycm9yLT5waW5uZWRfYm9fY291bnQgPQorCQkJY2FwdHVyZV9ib19saXN0KGVycm9yLT5waW5uZWRfYm8sCisJCQkJCWVycm9yLT5waW5uZWRfYm9fY291bnQsCisJCQkJCSZkZXZfcHJpdi0+bW0ucGlubmVkX2xpc3QpOworCiAJZG9fZ2V0dGltZW9mZGF5KCZlcnJvci0+dGltZSk7CiAKIAllcnJvci0+b3ZlcmxheSA9IGludGVsX292ZXJsYXlfY2FwdHVyZV9lcnJvcl9zdGF0ZShkZXYpOworCWVycm9yLT5kaXNwbGF5ID0gaW50ZWxfZGlzcGxheV9jYXB0dXJlX2Vycm9yX3N0YXRlKGRldik7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2X3ByaXYtPmVycm9yX2xvY2ssIGZsYWdzKTsKIAlpZiAoZGV2X3ByaXYtPmZpcnN0X2Vycm9yID09IE5VTEwpIHsKQEAgLTc3NSw3ICs5NzMsNyBAQAogCQkJcHJpbnRrKEtFUk5fRVJSICIgIEFDVEhEOiAweCUwOHhcbiIsCiAJCQkgICAgICAgSTkxNV9SRUFEKEFDVEhEX0k5NjUpKTsKIAkJCUk5MTVfV1JJVEUoSVBFSVJfSTk2NSwgaXBlaXIpOwotCQkJKHZvaWQpSTkxNV9SRUFEKElQRUlSX0k5NjUpOworCQkJUE9TVElOR19SRUFEKElQRUlSX0k5NjUpOwogCQl9CiAJCWlmIChlaXIgJiBHTTQ1X0VSUk9SX1BBR0VfVEFCTEUpIHsKIAkJCXUzMiBwZ3RibF9lcnIgPSBJOTE1X1JFQUQoUEdUQkxfRVIpOwpAQCAtNzgzLDcgKzk4MSw3IEBACiAJCQlwcmludGsoS0VSTl9FUlIgIiAgUEdUQkxfRVI6IDB4JTA4eFxuIiwKIAkJCSAgICAgICBwZ3RibF9lcnIpOwogCQkJSTkxNV9XUklURShQR1RCTF9FUiwgcGd0YmxfZXJyKTsKLQkJCSh2b2lkKUk5MTVfUkVBRChQR1RCTF9FUik7CisJCQlQT1NUSU5HX1JFQUQoUEdUQkxfRVIpOwogCQl9CiAJfQogCkBAIC03OTQsNyArOTkyLDcgQEAKIAkJCXByaW50ayhLRVJOX0VSUiAiICBQR1RCTF9FUjogMHglMDh4XG4iLAogCQkJICAgICAgIHBndGJsX2Vycik7CiAJCQlJOTE1X1dSSVRFKFBHVEJMX0VSLCBwZ3RibF9lcnIpOwotCQkJKHZvaWQpSTkxNV9SRUFEKFBHVEJMX0VSKTsKKwkJCVBPU1RJTkdfUkVBRChQR1RCTF9FUik7CiAJCX0KIAl9CiAKQEAgLTgyNSw3ICsxMDIzLDcgQEAKIAkJCXByaW50ayhLRVJOX0VSUiAiICBBQ1RIRDogMHglMDh4XG4iLAogCQkJICAgICAgIEk5MTVfUkVBRChBQ1RIRCkpOwogCQkJSTkxNV9XUklURShJUEVJUiwgaXBlaXIpOwotCQkJKHZvaWQpSTkxNV9SRUFEKElQRUlSKTsKKwkJCVBPU1RJTkdfUkVBRChJUEVJUik7CiAJCX0gZWxzZSB7CiAJCQl1MzIgaXBlaXIgPSBJOTE1X1JFQUQoSVBFSVJfSTk2NSk7CiAKQEAgLTg0MiwxMiArMTA0MCwxMiBAQAogCQkJcHJpbnRrKEtFUk5fRVJSICIgIEFDVEhEOiAweCUwOHhcbiIsCiAJCQkgICAgICAgSTkxNV9SRUFEKEFDVEhEX0k5NjUpKTsKIAkJCUk5MTVfV1JJVEUoSVBFSVJfSTk2NSwgaXBlaXIpOwotCQkJKHZvaWQpSTkxNV9SRUFEKElQRUlSX0k5NjUpOworCQkJUE9TVElOR19SRUFEKElQRUlSX0k5NjUpOwogCQl9CiAJfQogCiAJSTkxNV9XUklURShFSVIsIGVpcik7Ci0JKHZvaWQpSTkxNV9SRUFEKEVJUik7CisJUE9TVElOR19SRUFEKEVJUik7CiAJZWlyID0gSTkxNV9SRUFEKEVJUik7CiAJaWYgKGVpcikgewogCQkvKgpAQCAtODcwLDcgKzEwNjgsNyBAQAogICogc28gdXNlcnNwYWNlIGtub3dzIHNvbWV0aGluZyBiYWQgaGFwcGVuZWQgKHNob3VsZCB0cmlnZ2VyIGNvbGxlY3Rpb24KICAqIG9mIGEgcmluZyBkdW1wIGV0Yy4pLgogICovCi1zdGF0aWMgdm9pZCBpOTE1X2hhbmRsZV9lcnJvcihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBib29sIHdlZGdlZCkKK3ZvaWQgaTkxNV9oYW5kbGVfZXJyb3Ioc3RydWN0IGRybV9kZXZpY2UgKmRldiwgYm9vbCB3ZWRnZWQpCiB7CiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIApAQCAtODg0LDExICsxMDgyLDExIEBACiAJCS8qCiAJCSAqIFdha2V1cCB3YWl0aW5nIHByb2Nlc3NlcyBzbyB0aGV5IGRvbid0IGhhbmcKIAkJICovCi0JCXdha2VfdXBfYWxsKCZkZXZfcHJpdi0+cmVuZGVyX3JpbmcuaXJxX3F1ZXVlKTsKKwkJd2FrZV91cF9hbGwoJmRldl9wcml2LT5yaW5nW1JDU10uaXJxX3F1ZXVlKTsKIAkJaWYgKEhBU19CU0QoZGV2KSkKLQkJCXdha2VfdXBfYWxsKCZkZXZfcHJpdi0+YnNkX3JpbmcuaXJxX3F1ZXVlKTsKKwkJCXdha2VfdXBfYWxsKCZkZXZfcHJpdi0+cmluZ1tWQ1NdLmlycV9xdWV1ZSk7CiAJCWlmIChIQVNfQkxUKGRldikpCi0JCQl3YWtlX3VwX2FsbCgmZGV2X3ByaXYtPmJsdF9yaW5nLmlycV9xdWV1ZSk7CisJCQl3YWtlX3VwX2FsbCgmZGV2X3ByaXYtPnJpbmdbQkNTXS5pcnFfcXVldWUpOwogCX0KIAogCXF1ZXVlX3dvcmsoZGV2X3ByaXYtPndxLCAmZGV2X3ByaXYtPmVycm9yX3dvcmspOwpAQCAtODk5LDcgKzEwOTcsNyBAQAogCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXN0cnVjdCBkcm1fY3J0YyAqY3J0YyA9IGRldl9wcml2LT5waXBlX3RvX2NydGNfbWFwcGluZ1twaXBlXTsKIAlzdHJ1Y3QgaW50ZWxfY3J0YyAqaW50ZWxfY3J0YyA9IHRvX2ludGVsX2NydGMoY3J0Yyk7Ci0Jc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9ial9wcml2OworCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmo7CiAJc3RydWN0IGludGVsX3VucGluX3dvcmsgKndvcms7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlib29sIHN0YWxsX2RldGVjdGVkOwpAQCAtOTE4LDEzICsxMTE2LDEzIEBACiAJfQogCiAJLyogUG90ZW50aWFsIHN0YWxsIC0gaWYgd2Ugc2VlIHRoYXQgdGhlIGZsaXAgaGFzIGhhcHBlbmVkLCBhc3N1bWUgYSBtaXNzZWQgaW50ZXJydXB0ICovCi0Jb2JqX3ByaXYgPSB0b19pbnRlbF9ibyh3b3JrLT5wZW5kaW5nX2ZsaXBfb2JqKTsKKwlvYmogPSB3b3JrLT5wZW5kaW5nX2ZsaXBfb2JqOwogCWlmIChJTlRFTF9JTkZPKGRldiktPmdlbiA+PSA0KSB7CiAJCWludCBkc3BzdXJmID0gaW50ZWxfY3J0Yy0+cGxhbmUgPT0gMCA/IERTUEFTVVJGIDogRFNQQlNVUkY7Ci0JCXN0YWxsX2RldGVjdGVkID0gSTkxNV9SRUFEKGRzcHN1cmYpID09IG9ial9wcml2LT5ndHRfb2Zmc2V0OworCQlzdGFsbF9kZXRlY3RlZCA9IEk5MTVfUkVBRChkc3BzdXJmKSA9PSBvYmotPmd0dF9vZmZzZXQ7CiAJfSBlbHNlIHsKIAkJaW50IGRzcGFkZHIgPSBpbnRlbF9jcnRjLT5wbGFuZSA9PSAwID8gRFNQQUFERFIgOiBEU1BCQUREUjsKLQkJc3RhbGxfZGV0ZWN0ZWQgPSBJOTE1X1JFQUQoZHNwYWRkcikgPT0gKG9ial9wcml2LT5ndHRfb2Zmc2V0ICsKKwkJc3RhbGxfZGV0ZWN0ZWQgPSBJOTE1X1JFQUQoZHNwYWRkcikgPT0gKG9iai0+Z3R0X29mZnNldCArCiAJCQkJCQkJY3J0Yy0+eSAqIGNydGMtPmZiLT5waXRjaCArCiAJCQkJCQkJY3J0Yy0+eCAqIGNydGMtPmZiLT5iaXRzX3Blcl9waXhlbC84KTsKIAl9CkBAIC05NzAsNyArMTE2OCw3IEBACiAJCSAqIEl0IGRvZXNuJ3Qgc2V0IHRoZSBiaXQgaW4gaWlyIGFnYWluLCBidXQgaXQgc3RpbGwgcHJvZHVjZXMKIAkJICogaW50ZXJydXB0cyAoZm9yIG5vbi1NU0kpLgogCQkgKi8KLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmRldl9wcml2LT51c2VyX2lycV9sb2NrLCBpcnFmbGFncyk7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZfcHJpdi0+aXJxX2xvY2ssIGlycWZsYWdzKTsKIAkJcGlwZWFfc3RhdHMgPSBJOTE1X1JFQUQoUElQRUFTVEFUKTsKIAkJcGlwZWJfc3RhdHMgPSBJOTE1X1JFQUQoUElQRUJTVEFUKTsKIApAQCAtOTkzLDcgKzExOTEsNyBAQAogCQkJSTkxNV9XUklURShQSVBFQlNUQVQsIHBpcGViX3N0YXRzKTsKIAkJCWlycV9yZWNlaXZlZCA9IDE7CiAJCX0KLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2X3ByaXYtPnVzZXJfaXJxX2xvY2ssIGlycWZsYWdzKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2X3ByaXYtPmlycV9sb2NrLCBpcnFmbGFncyk7CiAKIAkJaWYgKCFpcnFfcmVjZWl2ZWQpCiAJCQlicmVhazsKQEAgLTEwMjYsOSArMTIyNCw5IEBACiAJCX0KIAogCQlpZiAoaWlyICYgSTkxNV9VU0VSX0lOVEVSUlVQVCkKLQkJCW5vdGlmeV9yaW5nKGRldiwgJmRldl9wcml2LT5yZW5kZXJfcmluZyk7Ci0JCWlmIChIQVNfQlNEKGRldikgJiYgKGlpciAmIEk5MTVfQlNEX1VTRVJfSU5URVJSVVBUKSkKLQkJCW5vdGlmeV9yaW5nKGRldiwgJmRldl9wcml2LT5ic2RfcmluZyk7CisJCQlub3RpZnlfcmluZyhkZXYsICZkZXZfcHJpdi0+cmluZ1tSQ1NdKTsKKwkJaWYgKGlpciAmIEk5MTVfQlNEX1VTRVJfSU5URVJSVVBUKQorCQkJbm90aWZ5X3JpbmcoZGV2LCAmZGV2X3ByaXYtPnJpbmdbVkNTXSk7CiAKIAkJaWYgKGlpciAmIEk5MTVfRElTUExBWV9QTEFORV9BX0ZMSVBfUEVORElOR19JTlRFUlJVUFQpIHsKIAkJCWludGVsX3ByZXBhcmVfcGFnZV9mbGlwKGRldiwgMCk7CkBAIC0xMTAxLDEyICsxMjk5LDEzIEBACiAJaWYgKG1hc3Rlcl9wcml2LT5zYXJlYV9wcml2KQogCQltYXN0ZXJfcHJpdi0+c2FyZWFfcHJpdi0+bGFzdF9lbnF1ZXVlID0gZGV2X3ByaXYtPmNvdW50ZXI7CiAKLQlCRUdJTl9MUF9SSU5HKDQpOwotCU9VVF9SSU5HKE1JX1NUT1JFX0RXT1JEX0lOREVYKTsKLQlPVVRfUklORyhJOTE1X0JSRUFEQ1JVTUJfSU5ERVggPDwgTUlfU1RPUkVfRFdPUkRfSU5ERVhfU0hJRlQpOwotCU9VVF9SSU5HKGRldl9wcml2LT5jb3VudGVyKTsKLQlPVVRfUklORyhNSV9VU0VSX0lOVEVSUlVQVCk7Ci0JQURWQU5DRV9MUF9SSU5HKCk7CisJaWYgKEJFR0lOX0xQX1JJTkcoNCkgPT0gMCkgeworCQlPVVRfUklORyhNSV9TVE9SRV9EV09SRF9JTkRFWCk7CisJCU9VVF9SSU5HKEk5MTVfQlJFQURDUlVNQl9JTkRFWCA8PCBNSV9TVE9SRV9EV09SRF9JTkRFWF9TSElGVCk7CisJCU9VVF9SSU5HKGRldl9wcml2LT5jb3VudGVyKTsKKwkJT1VUX1JJTkcoTUlfVVNFUl9JTlRFUlJVUFQpOworCQlBRFZBTkNFX0xQX1JJTkcoKTsKKwl9CiAKIAlyZXR1cm4gZGV2X3ByaXYtPmNvdW50ZXI7CiB9CkBAIC0xMTE0LDEyICsxMzEzLDExIEBACiB2b2lkIGk5MTVfdHJhY2VfaXJxX2dldChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1MzIgc2Vxbm8pCiB7CiAJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1faTkxNV9wcml2YXRlX3QgKikgZGV2LT5kZXZfcHJpdmF0ZTsKLQlzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJlbmRlcl9yaW5nID0gJmRldl9wcml2LT5yZW5kZXJfcmluZzsKKwlzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcgPSBMUF9SSU5HKGRldl9wcml2KTsKIAotCWlmIChkZXZfcHJpdi0+dHJhY2VfaXJxX3NlcW5vID09IDApCi0JCXJlbmRlcl9yaW5nLT51c2VyX2lycV9nZXQoZGV2LCByZW5kZXJfcmluZyk7Ci0KLQlkZXZfcHJpdi0+dHJhY2VfaXJxX3NlcW5vID0gc2Vxbm87CisJaWYgKGRldl9wcml2LT50cmFjZV9pcnFfc2Vxbm8gPT0gMCAmJgorCSAgICByaW5nLT5pcnFfZ2V0KHJpbmcpKQorCQlkZXZfcHJpdi0+dHJhY2VfaXJxX3NlcW5vID0gc2Vxbm87CiB9CiAKIHN0YXRpYyBpbnQgaTkxNV93YWl0X2lycShzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgaW50IGlycV9ucikKQEAgLTExMjcsNyArMTMyNSw3IEBACiAJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1faTkxNV9wcml2YXRlX3QgKikgZGV2LT5kZXZfcHJpdmF0ZTsKIAlzdHJ1Y3QgZHJtX2k5MTVfbWFzdGVyX3ByaXZhdGUgKm1hc3Rlcl9wcml2ID0gZGV2LT5wcmltYXJ5LT5tYXN0ZXItPmRyaXZlcl9wcml2OwogCWludCByZXQgPSAwOwotCXN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmVuZGVyX3JpbmcgPSAmZGV2X3ByaXYtPnJlbmRlcl9yaW5nOworCXN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZyA9IExQX1JJTkcoZGV2X3ByaXYpOwogCiAJRFJNX0RFQlVHX0RSSVZFUigiaXJxX25yPSVkIGJyZWFkY3J1bWI9JWRcbiIsIGlycV9uciwKIAkJICBSRUFEX0JSRUFEQ1JVTUIoZGV2X3ByaXYpKTsKQEAgLTExNDEsMTAgKzEzMzksMTIgQEAKIAlpZiAobWFzdGVyX3ByaXYtPnNhcmVhX3ByaXYpCiAJCW1hc3Rlcl9wcml2LT5zYXJlYV9wcml2LT5wZXJmX2JveGVzIHw9IEk5MTVfQk9YX1dBSVQ7CiAKLQlyZW5kZXJfcmluZy0+dXNlcl9pcnFfZ2V0KGRldiwgcmVuZGVyX3JpbmcpOwotCURSTV9XQUlUX09OKHJldCwgZGV2X3ByaXYtPnJlbmRlcl9yaW5nLmlycV9xdWV1ZSwgMyAqIERSTV9IWiwKLQkJICAgIFJFQURfQlJFQURDUlVNQihkZXZfcHJpdikgPj0gaXJxX25yKTsKLQlyZW5kZXJfcmluZy0+dXNlcl9pcnFfcHV0KGRldiwgcmVuZGVyX3JpbmcpOworCXJldCA9IC1FTk9ERVY7CisJaWYgKHJpbmctPmlycV9nZXQocmluZykpIHsKKwkJRFJNX1dBSVRfT04ocmV0LCByaW5nLT5pcnFfcXVldWUsIDMgKiBEUk1fSFosCisJCQkgICAgUkVBRF9CUkVBRENSVU1CKGRldl9wcml2KSA+PSBpcnFfbnIpOworCQlyaW5nLT5pcnFfcHV0KHJpbmcpOworCX0KIAogCWlmIChyZXQgPT0gLUVCVVNZKSB7CiAJCURSTV9FUlJPUigiRUJVU1kgLS0gcmVjOiAlZCBlbWl0dGVkOiAlZFxuIiwKQEAgLTExNjMsNyArMTM2Myw3IEBACiAJZHJtX2k5MTVfaXJxX2VtaXRfdCAqZW1pdCA9IGRhdGE7CiAJaW50IHJlc3VsdDsKIAotCWlmICghZGV2X3ByaXYgfHwgIWRldl9wcml2LT5yZW5kZXJfcmluZy52aXJ0dWFsX3N0YXJ0KSB7CisJaWYgKCFkZXZfcHJpdiB8fCAhTFBfUklORyhkZXZfcHJpdiktPnZpcnR1YWxfc3RhcnQpIHsKIAkJRFJNX0VSUk9SKCJjYWxsZWQgd2l0aCBubyBpbml0aWFsaXphdGlvblxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KQEAgLTEyMDksOSArMTQwOSw5IEBACiAJaWYgKCFpOTE1X3BpcGVfZW5hYmxlZChkZXYsIHBpcGUpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZfcHJpdi0+dXNlcl9pcnFfbG9jaywgaXJxZmxhZ3MpOworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZfcHJpdi0+aXJxX2xvY2ssIGlycWZsYWdzKTsKIAlpZiAoSEFTX1BDSF9TUExJVChkZXYpKQotCQlpcm9ubGFrZV9lbmFibGVfZGlzcGxheV9pcnEoZGV2X3ByaXYsIChwaXBlID09IDApID8gCisJCWlyb25sYWtlX2VuYWJsZV9kaXNwbGF5X2lycShkZXZfcHJpdiwgKHBpcGUgPT0gMCkgPwogCQkJCQkgICAgREVfUElQRUFfVkJMQU5LOiBERV9QSVBFQl9WQkxBTkspOwogCWVsc2UgaWYgKElOVEVMX0lORk8oZGV2KS0+Z2VuID49IDQpCiAJCWk5MTVfZW5hYmxlX3BpcGVzdGF0KGRldl9wcml2LCBwaXBlLApAQCAtMTIxOSw3ICsxNDE5LDcgQEAKIAllbHNlCiAJCWk5MTVfZW5hYmxlX3BpcGVzdGF0KGRldl9wcml2LCBwaXBlLAogCQkJCSAgICAgUElQRV9WQkxBTktfSU5URVJSVVBUX0VOQUJMRSk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2X3ByaXYtPnVzZXJfaXJxX2xvY2ssIGlycWZsYWdzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZfcHJpdi0+aXJxX2xvY2ssIGlycWZsYWdzKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTIzMSwxNSArMTQzMSwxNSBAQAogCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX2k5MTVfcHJpdmF0ZV90ICopIGRldi0+ZGV2X3ByaXZhdGU7CiAJdW5zaWduZWQgbG9uZyBpcnFmbGFnczsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZfcHJpdi0+dXNlcl9pcnFfbG9jaywgaXJxZmxhZ3MpOworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZfcHJpdi0+aXJxX2xvY2ssIGlycWZsYWdzKTsKIAlpZiAoSEFTX1BDSF9TUExJVChkZXYpKQotCQlpcm9ubGFrZV9kaXNhYmxlX2Rpc3BsYXlfaXJxKGRldl9wcml2LCAocGlwZSA9PSAwKSA/IAorCQlpcm9ubGFrZV9kaXNhYmxlX2Rpc3BsYXlfaXJxKGRldl9wcml2LCAocGlwZSA9PSAwKSA/CiAJCQkJCSAgICAgREVfUElQRUFfVkJMQU5LOiBERV9QSVBFQl9WQkxBTkspOwogCWVsc2UKIAkJaTkxNV9kaXNhYmxlX3BpcGVzdGF0KGRldl9wcml2LCBwaXBlLAogCQkJCSAgICAgIFBJUEVfVkJMQU5LX0lOVEVSUlVQVF9FTkFCTEUgfAogCQkJCSAgICAgIFBJUEVfU1RBUlRfVkJMQU5LX0lOVEVSUlVQVF9FTkFCTEUpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldl9wcml2LT51c2VyX2lycV9sb2NrLCBpcnFmbGFncyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2X3ByaXYtPmlycV9sb2NrLCBpcnFmbGFncyk7CiB9CiAKIHZvaWQgaTkxNV9lbmFibGVfaW50ZXJydXB0IChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQpAQCAtMTMwNiwxMiArMTUwNiw1MCBAQAogCXJldHVybiAtRUlOVkFMOwogfQogCi1zdGF0aWMgc3RydWN0IGRybV9pOTE1X2dlbV9yZXF1ZXN0ICoKLWk5MTVfZ2V0X3RhaWxfcmVxdWVzdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQorc3RhdGljIHUzMgorcmluZ19sYXN0X3NlcW5vKHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZykKIHsKLQlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlyZXR1cm4gbGlzdF9lbnRyeShkZXZfcHJpdi0+cmVuZGVyX3JpbmcucmVxdWVzdF9saXN0LnByZXYsCi0JCQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX3JlcXVlc3QsIGxpc3QpOworCXJldHVybiBsaXN0X2VudHJ5KHJpbmctPnJlcXVlc3RfbGlzdC5wcmV2LAorCQkJICBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX3JlcXVlc3QsIGxpc3QpLT5zZXFubzsKK30KKworc3RhdGljIGJvb2wgaTkxNV9oYW5nY2hlY2tfcmluZ19pZGxlKHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZywgYm9vbCAqZXJyKQoreworCWlmIChsaXN0X2VtcHR5KCZyaW5nLT5yZXF1ZXN0X2xpc3QpIHx8CisJICAgIGk5MTVfc2Vxbm9fcGFzc2VkKHJpbmctPmdldF9zZXFubyhyaW5nKSwgcmluZ19sYXN0X3NlcW5vKHJpbmcpKSkgeworCQkvKiBJc3N1ZSBhIHdha2UtdXAgdG8gY2F0Y2ggc3R1Y2sgaC93LiAqLworCQlpZiAocmluZy0+d2FpdGluZ19zZXFubyAmJiB3YWl0cXVldWVfYWN0aXZlKCZyaW5nLT5pcnFfcXVldWUpKSB7CisJCQlEUk1fRVJST1IoIkhhbmdjaGVjayB0aW1lciBlbGFwc2VkLi4uICVzIGlkbGUgW3dhaXRpbmcgb24gJWQsIGF0ICVkXSwgbWlzc2VkIElSUT9cbiIsCisJCQkJICByaW5nLT5uYW1lLAorCQkJCSAgcmluZy0+d2FpdGluZ19zZXFubywKKwkJCQkgIHJpbmctPmdldF9zZXFubyhyaW5nKSk7CisJCQl3YWtlX3VwX2FsbCgmcmluZy0+aXJxX3F1ZXVlKTsKKwkJCSplcnIgPSB0cnVlOworCQl9CisJCXJldHVybiB0cnVlOworCX0KKwlyZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBib29sIGtpY2tfcmluZyhzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHJpbmctPmRldjsKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXUzMiB0bXAgPSBJOTE1X1JFQURfQ1RMKHJpbmcpOworCWlmICh0bXAgJiBSSU5HX1dBSVQpIHsKKwkJRFJNX0VSUk9SKCJLaWNraW5nIHN0dWNrIHdhaXQgb24gJXNcbiIsCisJCQkgIHJpbmctPm5hbWUpOworCQlJOTE1X1dSSVRFX0NUTChyaW5nLCB0bXApOworCQlyZXR1cm4gdHJ1ZTsKKwl9CisJaWYgKElTX0dFTjYoZGV2KSAmJgorCSAgICAodG1wICYgUklOR19XQUlUX1NFTUFQSE9SRSkpIHsKKwkJRFJNX0VSUk9SKCJLaWNraW5nIHN0dWNrIHNlbWFwaG9yZSBvbiAlc1xuIiwKKwkJCSAgcmluZy0+bmFtZSk7CisJCUk5MTVfV1JJVEVfQ1RMKHJpbmcsIHRtcCk7CisJCXJldHVybiB0cnVlOworCX0KKwlyZXR1cm4gZmFsc2U7CiB9CiAKIC8qKgpAQCAtMTMyNSw2ICsxNTYzLDE3IEBACiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgZHJtX2RldmljZSAqKWRhdGE7CiAJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJdWludDMyX3QgYWN0aGQsIGluc3Rkb25lLCBpbnN0ZG9uZTE7CisJYm9vbCBlcnIgPSBmYWxzZTsKKworCS8qIElmIGFsbCB3b3JrIGlzIGRvbmUgdGhlbiBBQ1RIRCBjbGVhcmx5IGhhc24ndCBhZHZhbmNlZC4gKi8KKwlpZiAoaTkxNV9oYW5nY2hlY2tfcmluZ19pZGxlKCZkZXZfcHJpdi0+cmluZ1tSQ1NdLCAmZXJyKSAmJgorCSAgICBpOTE1X2hhbmdjaGVja19yaW5nX2lkbGUoJmRldl9wcml2LT5yaW5nW1ZDU10sICZlcnIpICYmCisJICAgIGk5MTVfaGFuZ2NoZWNrX3JpbmdfaWRsZSgmZGV2X3ByaXYtPnJpbmdbQkNTXSwgJmVycikpIHsKKwkJZGV2X3ByaXYtPmhhbmdjaGVja19jb3VudCA9IDA7CisJCWlmIChlcnIpCisJCQlnb3RvIHJlcGVhdDsKKwkJcmV0dXJuOworCX0KIAogCWlmIChJTlRFTF9JTkZPKGRldiktPmdlbiA8IDQpIHsKIAkJYWN0aGQgPSBJOTE1X1JFQUQoQUNUSEQpOwpAQCAtMTMzNiwzOCArMTU4NSw2IEBACiAJCWluc3Rkb25lMSA9IEk5MTVfUkVBRChJTlNURE9ORTEpOwogCX0KIAotCS8qIElmIGFsbCB3b3JrIGlzIGRvbmUgdGhlbiBBQ1RIRCBjbGVhcmx5IGhhc24ndCBhZHZhbmNlZC4gKi8KLQlpZiAobGlzdF9lbXB0eSgmZGV2X3ByaXYtPnJlbmRlcl9yaW5nLnJlcXVlc3RfbGlzdCkgfHwKLQkJaTkxNV9zZXFub19wYXNzZWQoZGV2X3ByaXYtPnJlbmRlcl9yaW5nLmdldF9zZXFubyhkZXYsICZkZXZfcHJpdi0+cmVuZGVyX3JpbmcpLAotCQkJCSAgaTkxNV9nZXRfdGFpbF9yZXF1ZXN0KGRldiktPnNlcW5vKSkgewotCQlib29sIG1pc3NlZF93YWtldXAgPSBmYWxzZTsKLQotCQlkZXZfcHJpdi0+aGFuZ2NoZWNrX2NvdW50ID0gMDsKLQotCQkvKiBJc3N1ZSBhIHdha2UtdXAgdG8gY2F0Y2ggc3R1Y2sgaC93LiAqLwotCQlpZiAoZGV2X3ByaXYtPnJlbmRlcl9yaW5nLndhaXRpbmdfZ2VtX3NlcW5vICYmCi0JCSAgICB3YWl0cXVldWVfYWN0aXZlKCZkZXZfcHJpdi0+cmVuZGVyX3JpbmcuaXJxX3F1ZXVlKSkgewotCQkJd2FrZV91cF9hbGwoJmRldl9wcml2LT5yZW5kZXJfcmluZy5pcnFfcXVldWUpOwotCQkJbWlzc2VkX3dha2V1cCA9IHRydWU7Ci0JCX0KLQotCQlpZiAoZGV2X3ByaXYtPmJzZF9yaW5nLndhaXRpbmdfZ2VtX3NlcW5vICYmCi0JCSAgICB3YWl0cXVldWVfYWN0aXZlKCZkZXZfcHJpdi0+YnNkX3JpbmcuaXJxX3F1ZXVlKSkgewotCQkJd2FrZV91cF9hbGwoJmRldl9wcml2LT5ic2RfcmluZy5pcnFfcXVldWUpOwotCQkJbWlzc2VkX3dha2V1cCA9IHRydWU7Ci0JCX0KLQotCQlpZiAoZGV2X3ByaXYtPmJsdF9yaW5nLndhaXRpbmdfZ2VtX3NlcW5vICYmCi0JCSAgICB3YWl0cXVldWVfYWN0aXZlKCZkZXZfcHJpdi0+Ymx0X3JpbmcuaXJxX3F1ZXVlKSkgewotCQkJd2FrZV91cF9hbGwoJmRldl9wcml2LT5ibHRfcmluZy5pcnFfcXVldWUpOwotCQkJbWlzc2VkX3dha2V1cCA9IHRydWU7Ci0JCX0KLQotCQlpZiAobWlzc2VkX3dha2V1cCkKLQkJCURSTV9FUlJPUigiSGFuZ2NoZWNrIHRpbWVyIGVsYXBzZWQuLi4gR1BVIGlkbGUsIG1pc3NlZCBJUlEuXG4iKTsKLQkJcmV0dXJuOwotCX0KLQogCWlmIChkZXZfcHJpdi0+bGFzdF9hY3RoZCA9PSBhY3RoZCAmJgogCSAgICBkZXZfcHJpdi0+bGFzdF9pbnN0ZG9uZSA9PSBpbnN0ZG9uZSAmJgogCSAgICBkZXZfcHJpdi0+bGFzdF9pbnN0ZG9uZTEgPT0gaW5zdGRvbmUxKSB7CkBAIC0xMzgwLDEyICsxNTk3LDE3IEBACiAJCQkJICogYW5kIGJyZWFrIHRoZSBoYW5nLiBUaGlzIHNob3VsZCB3b3JrIG9uCiAJCQkJICogYWxsIGJ1dCB0aGUgc2Vjb25kIGdlbmVyYXRpb24gY2hpcHNldHMuCiAJCQkJICovCi0JCQkJdTMyIHRtcCA9IEk5MTVfUkVBRChQUkIwX0NUTCk7Ci0JCQkJaWYgKHRtcCAmIFJJTkdfV0FJVCkgewotCQkJCQlJOTE1X1dSSVRFKFBSQjBfQ1RMLCB0bXApOwotCQkJCQlQT1NUSU5HX1JFQUQoUFJCMF9DVEwpOwotCQkJCQlnb3RvIG91dDsKLQkJCQl9CisKKwkJCQlpZiAoa2lja19yaW5nKCZkZXZfcHJpdi0+cmluZ1tSQ1NdKSkKKwkJCQkJZ290byByZXBlYXQ7CisKKwkJCQlpZiAoSEFTX0JTRChkZXYpICYmCisJCQkJICAgIGtpY2tfcmluZygmZGV2X3ByaXYtPnJpbmdbVkNTXSkpCisJCQkJCWdvdG8gcmVwZWF0OworCisJCQkJaWYgKEhBU19CTFQoZGV2KSAmJgorCQkJCSAgICBraWNrX3JpbmcoJmRldl9wcml2LT5yaW5nW0JDU10pKQorCQkJCQlnb3RvIHJlcGVhdDsKIAkJCX0KIAogCQkJaTkxNV9oYW5kbGVfZXJyb3IoZGV2LCB0cnVlKTsKQEAgLTEzOTksNyArMTYyMSw3IEBACiAJCWRldl9wcml2LT5sYXN0X2luc3Rkb25lMSA9IGluc3Rkb25lMTsKIAl9CiAKLW91dDoKK3JlcGVhdDoKIAkvKiBSZXNldCB0aW1lciBjYXNlIGNoaXAgaGFuZ3Mgd2l0aG91dCBhbm90aGVyIHJlcXVlc3QgYmVpbmcgYWRkZWQgKi8KIAltb2RfdGltZXIoJmRldl9wcml2LT5oYW5nY2hlY2tfdGltZXIsCiAJCSAgamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoRFJNX0k5MTVfSEFOR0NIRUNLX1BFUklPRCkpOwpAQCAtMTQxNywxNyArMTYzOSwxNyBAQAogCiAJSTkxNV9XUklURShERUlNUiwgMHhmZmZmZmZmZik7CiAJSTkxNV9XUklURShERUlFUiwgMHgwKTsKLQkodm9pZCkgSTkxNV9SRUFEKERFSUVSKTsKKwlQT1NUSU5HX1JFQUQoREVJRVIpOwogCiAJLyogYW5kIEdUICovCiAJSTkxNV9XUklURShHVElNUiwgMHhmZmZmZmZmZik7CiAJSTkxNV9XUklURShHVElFUiwgMHgwKTsKLQkodm9pZCkgSTkxNV9SRUFEKEdUSUVSKTsKKwlQT1NUSU5HX1JFQUQoR1RJRVIpOwogCiAJLyogc291dGggZGlzcGxheSBpcnEgKi8KIAlJOTE1X1dSSVRFKFNERUlNUiwgMHhmZmZmZmZmZik7CiAJSTkxNV9XUklURShTREVJRVIsIDB4MCk7Ci0JKHZvaWQpIEk5MTVfUkVBRChTREVJRVIpOworCVBPU1RJTkdfUkVBRChTREVJRVIpOwogfQogCiBzdGF0aWMgaW50IGlyb25sYWtlX2lycV9wb3N0aW5zdGFsbChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQpAQCAtMTQzNiwzOCArMTY1OCwzOSBAQAogCS8qIGVuYWJsZSBraW5kIG9mIGludGVycnVwdHMgYWx3YXlzIGVuYWJsZWQgKi8KIAl1MzIgZGlzcGxheV9tYXNrID0gREVfTUFTVEVSX0lSUV9DT05UUk9MIHwgREVfR1NFIHwgREVfUENIX0VWRU5UIHwKIAkJCSAgIERFX1BMQU5FQV9GTElQX0RPTkUgfCBERV9QTEFORUJfRkxJUF9ET05FOwotCXUzMiByZW5kZXJfbWFzayA9IEdUX1BJUEVfTk9USUZZIHwgR1RfQlNEX1VTRVJfSU5URVJSVVBUOworCXUzMiByZW5kZXJfaXJxczsKIAl1MzIgaG90cGx1Z19tYXNrOwogCi0JZGV2X3ByaXYtPmlycV9tYXNrX3JlZyA9IH5kaXNwbGF5X21hc2s7Ci0JZGV2X3ByaXYtPmRlX2lycV9lbmFibGVfcmVnID0gZGlzcGxheV9tYXNrIHwgREVfUElQRUFfVkJMQU5LIHwgREVfUElQRUJfVkJMQU5LOworCWRldl9wcml2LT5pcnFfbWFzayA9IH5kaXNwbGF5X21hc2s7CiAKIAkvKiBzaG91bGQgYWx3YXlzIGNhbiBnZW5lcmF0ZSBpcnEgKi8KIAlJOTE1X1dSSVRFKERFSUlSLCBJOTE1X1JFQUQoREVJSVIpKTsKLQlJOTE1X1dSSVRFKERFSU1SLCBkZXZfcHJpdi0+aXJxX21hc2tfcmVnKTsKLQlJOTE1X1dSSVRFKERFSUVSLCBkZXZfcHJpdi0+ZGVfaXJxX2VuYWJsZV9yZWcpOwotCSh2b2lkKSBJOTE1X1JFQUQoREVJRVIpOworCUk5MTVfV1JJVEUoREVJTVIsIGRldl9wcml2LT5pcnFfbWFzayk7CisJSTkxNV9XUklURShERUlFUiwgZGlzcGxheV9tYXNrIHwgREVfUElQRUFfVkJMQU5LIHwgREVfUElQRUJfVkJMQU5LKTsKKwlQT1NUSU5HX1JFQUQoREVJRVIpOwogCi0JaWYgKElTX0dFTjYoZGV2KSkgewotCQlyZW5kZXJfbWFzayA9Ci0JCQlHVF9QSVBFX05PVElGWSB8Ci0JCQlHVF9HRU42X0JTRF9VU0VSX0lOVEVSUlVQVCB8Ci0JCQlHVF9CTFRfVVNFUl9JTlRFUlJVUFQ7Ci0JfQotCi0JZGV2X3ByaXYtPmd0X2lycV9tYXNrX3JlZyA9IH5yZW5kZXJfbWFzazsKLQlkZXZfcHJpdi0+Z3RfaXJxX2VuYWJsZV9yZWcgPSByZW5kZXJfbWFzazsKKwlkZXZfcHJpdi0+Z3RfaXJxX21hc2sgPSB+MDsKIAogCUk5MTVfV1JJVEUoR1RJSVIsIEk5MTVfUkVBRChHVElJUikpOwotCUk5MTVfV1JJVEUoR1RJTVIsIGRldl9wcml2LT5ndF9pcnFfbWFza19yZWcpOworCUk5MTVfV1JJVEUoR1RJTVIsIGRldl9wcml2LT5ndF9pcnFfbWFzayk7CiAJaWYgKElTX0dFTjYoZGV2KSkgewotCQlJOTE1X1dSSVRFKEdFTjZfUkVOREVSX0lNUiwgfkdFTjZfUkVOREVSX1BJUEVfQ09OVFJPTF9OT1RJRllfSU5URVJSVVBUKTsKLQkJSTkxNV9XUklURShHRU42X0JTRF9JTVIsIH5HRU42X0JTRF9JTVJfVVNFUl9JTlRFUlJVUFQpOworCQlJOTE1X1dSSVRFKEdFTjZfUkVOREVSX0lNUiwgfkdFTjZfUkVOREVSX1VTRVJfSU5URVJSVVBUKTsKKwkJSTkxNV9XUklURShHRU42X0JTRF9JTVIsIH5HRU42X0JTRF9VU0VSX0lOVEVSUlVQVCk7CiAJCUk5MTVfV1JJVEUoR0VONl9CTElUVEVSX0lNUiwgfkdFTjZfQkxJVFRFUl9VU0VSX0lOVEVSUlVQVCk7CiAJfQogCi0JSTkxNV9XUklURShHVElFUiwgZGV2X3ByaXYtPmd0X2lycV9lbmFibGVfcmVnKTsKLQkodm9pZCkgSTkxNV9SRUFEKEdUSUVSKTsKKwlpZiAoSVNfR0VONihkZXYpKQorCQlyZW5kZXJfaXJxcyA9CisJCQlHVF9VU0VSX0lOVEVSUlVQVCB8CisJCQlHVF9HRU42X0JTRF9VU0VSX0lOVEVSUlVQVCB8CisJCQlHVF9CTFRfVVNFUl9JTlRFUlJVUFQ7CisJZWxzZQorCQlyZW5kZXJfaXJxcyA9CisJCQlHVF9VU0VSX0lOVEVSUlVQVCB8CisJCQlHVF9QSVBFX05PVElGWSB8CisJCQlHVF9CU0RfVVNFUl9JTlRFUlJVUFQ7CisJSTkxNV9XUklURShHVElFUiwgcmVuZGVyX2lycXMpOworCVBPU1RJTkdfUkVBRChHVElFUik7CiAKIAlpZiAoSEFTX1BDSF9DUFQoZGV2KSkgewogCQlob3RwbHVnX21hc2sgPSBTREVfQ1JUX0hPVFBMVUdfQ1BUIHwgU0RFX1BPUlRCX0hPVFBMVUdfQ1BUICB8CkBAIC0xNDc3LDEzICsxNzAwLDEyIEBACiAJCQkgICAgICAgU0RFX1BPUlRDX0hPVFBMVUcgfCBTREVfUE9SVERfSE9UUExVRzsKIAl9CiAKLQlkZXZfcHJpdi0+cGNoX2lycV9tYXNrX3JlZyA9IH5ob3RwbHVnX21hc2s7Ci0JZGV2X3ByaXYtPnBjaF9pcnFfZW5hYmxlX3JlZyA9IGhvdHBsdWdfbWFzazsKKwlkZXZfcHJpdi0+cGNoX2lycV9tYXNrID0gfmhvdHBsdWdfbWFzazsKIAogCUk5MTVfV1JJVEUoU0RFSUlSLCBJOTE1X1JFQUQoU0RFSUlSKSk7Ci0JSTkxNV9XUklURShTREVJTVIsIGRldl9wcml2LT5wY2hfaXJxX21hc2tfcmVnKTsKLQlJOTE1X1dSSVRFKFNERUlFUiwgZGV2X3ByaXYtPnBjaF9pcnFfZW5hYmxlX3JlZyk7Ci0JKHZvaWQpIEk5MTVfUkVBRChTREVJRVIpOworCUk5MTVfV1JJVEUoU0RFSU1SLCBkZXZfcHJpdi0+cGNoX2lycV9tYXNrKTsKKwlJOTE1X1dSSVRFKFNERUlFUiwgaG90cGx1Z19tYXNrKTsKKwlQT1NUSU5HX1JFQUQoU0RFSUVSKTsKIAogCWlmIChJU19JUk9OTEFLRV9NKGRldikpIHsKIAkJLyogQ2xlYXIgJiBlbmFibGUgUENVIGV2ZW50IGludGVycnVwdHMgKi8KQEAgLTE1MTksNyArMTc0MSw3IEBACiAJSTkxNV9XUklURShQSVBFQlNUQVQsIDApOwogCUk5MTVfV1JJVEUoSU1SLCAweGZmZmZmZmZmKTsKIAlJOTE1X1dSSVRFKElFUiwgMHgwKTsKLQkodm9pZCkgSTkxNV9SRUFEKElFUik7CisJUE9TVElOR19SRUFEKElFUik7CiB9CiAKIC8qCkBAIC0xNTMyLDExICsxNzU0LDExIEBACiAJdTMyIGVuYWJsZV9tYXNrID0gSTkxNV9JTlRFUlJVUFRfRU5BQkxFX0ZJWCB8IEk5MTVfSU5URVJSVVBUX0VOQUJMRV9WQVI7CiAJdTMyIGVycm9yX21hc2s7CiAKLQlEUk1fSU5JVF9XQUlUUVVFVUUoJmRldl9wcml2LT5yZW5kZXJfcmluZy5pcnFfcXVldWUpOworCURSTV9JTklUX1dBSVRRVUVVRSgmZGV2X3ByaXYtPnJpbmdbUkNTXS5pcnFfcXVldWUpOwogCWlmIChIQVNfQlNEKGRldikpCi0JCURSTV9JTklUX1dBSVRRVUVVRSgmZGV2X3ByaXYtPmJzZF9yaW5nLmlycV9xdWV1ZSk7CisJCURSTV9JTklUX1dBSVRRVUVVRSgmZGV2X3ByaXYtPnJpbmdbVkNTXS5pcnFfcXVldWUpOwogCWlmIChIQVNfQkxUKGRldikpCi0JCURSTV9JTklUX1dBSVRRVUVVRSgmZGV2X3ByaXYtPmJsdF9yaW5nLmlycV9xdWV1ZSk7CisJCURSTV9JTklUX1dBSVRRVUVVRSgmZGV2X3ByaXYtPnJpbmdbQkNTXS5pcnFfcXVldWUpOwogCiAJZGV2X3ByaXYtPnZibGFua19waXBlID0gRFJNX0k5MTVfVkJMQU5LX1BJUEVfQSB8IERSTV9JOTE1X1ZCTEFOS19QSVBFX0I7CiAKQEAgLTE1NDQsNyArMTc2Niw3IEBACiAJCXJldHVybiBpcm9ubGFrZV9pcnFfcG9zdGluc3RhbGwoZGV2KTsKIAogCS8qIFVubWFzayB0aGUgaW50ZXJydXB0cyB0aGF0IHdlIGFsd2F5cyB3YW50IG9uLiAqLwotCWRldl9wcml2LT5pcnFfbWFza19yZWcgPSB+STkxNV9JTlRFUlJVUFRfRU5BQkxFX0ZJWDsKKwlkZXZfcHJpdi0+aXJxX21hc2sgPSB+STkxNV9JTlRFUlJVUFRfRU5BQkxFX0ZJWDsKIAogCWRldl9wcml2LT5waXBlc3RhdFswXSA9IDA7CiAJZGV2X3ByaXYtPnBpcGVzdGF0WzFdID0gMDsKQEAgLTE1NTMsNyArMTc3NSw3IEBACiAJCS8qIEVuYWJsZSBpbiBJRVIuLi4gKi8KIAkJZW5hYmxlX21hc2sgfD0gSTkxNV9ESVNQTEFZX1BPUlRfSU5URVJSVVBUOwogCQkvKiBhbmQgdW5tYXNrIGluIElNUiAqLwotCQlkZXZfcHJpdi0+aXJxX21hc2tfcmVnICY9IH5JOTE1X0RJU1BMQVlfUE9SVF9JTlRFUlJVUFQ7CisJCWRldl9wcml2LT5pcnFfbWFzayAmPSB+STkxNV9ESVNQTEFZX1BPUlRfSU5URVJSVVBUOwogCX0KIAogCS8qCkBAIC0xNTcxLDkgKzE3OTMsOSBAQAogCX0KIAlJOTE1X1dSSVRFKEVNUiwgZXJyb3JfbWFzayk7CiAKLQlJOTE1X1dSSVRFKElNUiwgZGV2X3ByaXYtPmlycV9tYXNrX3JlZyk7CisJSTkxNV9XUklURShJTVIsIGRldl9wcml2LT5pcnFfbWFzayk7CiAJSTkxNV9XUklURShJRVIsIGVuYWJsZV9tYXNrKTsKLQkodm9pZCkgSTkxNV9SRUFEKElFUik7CisJUE9TVElOR19SRUFEKElFUik7CiAKIAlpZiAoSTkxNV9IQVNfSE9UUExVRyhkZXYpKSB7CiAJCXUzMiBob3RwbHVnX2VuID0gSTkxNV9SRUFEKFBPUlRfSE9UUExVR19FTik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X3JlZy5oIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9yZWcuaAppbmRleCBjYjhmNDM0Li44Zjk0OGE2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X3JlZy5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfcmVnLmgKQEAgLTc4LDYgKzc4LDEyIEBACiAjZGVmaW5lICBHUkRPTV9SRU5ERVIJKDE8PDIpCiAjZGVmaW5lICBHUkRPTV9NRURJQQkoMzw8MikKIAorI2RlZmluZSBHRU42X0dEUlNUCTB4OTQxYworI2RlZmluZSAgR0VONl9HUkRPTV9GVUxMCQkoMSA8PCAwKQorI2RlZmluZSAgR0VONl9HUkRPTV9SRU5ERVIJCSgxIDw8IDEpCisjZGVmaW5lICBHRU42X0dSRE9NX01FRElBCQkoMSA8PCAyKQorI2RlZmluZSAgR0VONl9HUkRPTV9CTFQJCQkoMSA8PCAzKQorCiAvKiBWR0Egc3R1ZmYgKi8KIAogI2RlZmluZSBWR0FfU1QwMV9NREEgMHgzYmEKQEAgLTE1OCwxMiArMTY0LDIzIEBACiAjZGVmaW5lICAgTUlfTUVNX1ZJUlRVQUwJKDEgPDwgMjIpIC8qIDk2NSsgb25seSAqLwogI2RlZmluZSBNSV9TVE9SRV9EV09SRF9JTkRFWAlNSV9JTlNUUigweDIxLCAxKQogI2RlZmluZSAgIE1JX1NUT1JFX0RXT1JEX0lOREVYX1NISUZUIDIKLSNkZWZpbmUgTUlfTE9BRF9SRUdJU1RFUl9JTU0JTUlfSU5TVFIoMHgyMiwgMSkKKy8qIE9mZmljaWFsIGludGVsIGRvY3MgYXJlIHNvbWV3aGF0IHNsb3BweSBjb25jZXJuaW5nIE1JX0xPQURfUkVHSVNURVJfSU1NOgorICogLSBBbHdheXMgaXNzdWUgYSBNSV9OT09QIF9iZWZvcmVfIHRoZSBNSV9MT0FEX1JFR0lTVEVSX0lNTSAtIG90aGVyd2lzZSBodworICogICBzaW1wbHkgaWdub3JlcyB0aGUgcmVnaXN0ZXIgbG9hZCB1bmRlciBjZXJ0YWluIGNvbmRpdGlvbnMuCisgKiAtIE9uZSBjYW4gYWN0dWFsbHkgbG9hZCBhcmJpdHJhcnkgbWFueSBhcmJpdHJhcnkgcmVnaXN0ZXJzOiBTaW1wbHkgaXNzdWUgeAorICogICBhZGRyZXNzL3ZhbHVlIHBhaXJzLiBEb24ndCBvdmVyZHVlIGl0LCB0aG91Z2gsIHggPD0gMl40IG11c3QgaG9sZCEKKyAqLworI2RlZmluZSBNSV9MT0FEX1JFR0lTVEVSX0lNTSh4KQlNSV9JTlNUUigweDIyLCAyKngtMSkKICNkZWZpbmUgTUlfRkxVU0hfRFcJCU1JX0lOU1RSKDB4MjYsIDIpIC8qIGZvciBHRU42ICovCiAjZGVmaW5lIE1JX0JBVENIX0JVRkZFUgkJTUlfSU5TVFIoMHgzMCwgMSkKICNkZWZpbmUgICBNSV9CQVRDSF9OT05fU0VDVVJFCSgxKQogI2RlZmluZSAgIE1JX0JBVENIX05PTl9TRUNVUkVfSTk2NSAoMTw8OCkKICNkZWZpbmUgTUlfQkFUQ0hfQlVGRkVSX1NUQVJUCU1JX0lOU1RSKDB4MzEsIDApCisjZGVmaW5lIE1JX1NFTUFQSE9SRV9NQk9YCU1JX0lOU1RSKDB4MTYsIDEpIC8qIGdlbjYrICovCisjZGVmaW5lICBNSV9TRU1BUEhPUkVfR0xPQkFMX0dUVCAgICAoMTw8MjIpCisjZGVmaW5lICBNSV9TRU1BUEhPUkVfVVBEQVRFCSAgICAoMTw8MjEpCisjZGVmaW5lICBNSV9TRU1BUEhPUkVfQ09NUEFSRQkgICAgKDE8PDIwKQorI2RlZmluZSAgTUlfU0VNQVBIT1JFX1JFR0lTVEVSCSAgICAoMTw8MTgpCiAvKgogICogM0QgaW5zdHJ1Y3Rpb25zIHVzZWQgYnkgdGhlIGtlcm5lbAogICovCkBAIC0yNTYsMTAgKzI3Myw2IEBACiAgKiBJbnN0cnVjdGlvbiBhbmQgaW50ZXJydXB0IGNvbnRyb2wgcmVncwogICovCiAjZGVmaW5lIFBHVEJMX0VSCTB4MDIwMjQKLSNkZWZpbmUgUFJCMF9UQUlMCTB4MDIwMzAKLSNkZWZpbmUgUFJCMF9IRUFECTB4MDIwMzQKLSNkZWZpbmUgUFJCMF9TVEFSVAkweDAyMDM4Ci0jZGVmaW5lIFBSQjBfQ1RMCTB4MDIwM2MKICNkZWZpbmUgUkVOREVSX1JJTkdfQkFTRQkweDAyMDAwCiAjZGVmaW5lIEJTRF9SSU5HX0JBU0UJCTB4MDQwMDAKICNkZWZpbmUgR0VONl9CU0RfUklOR19CQVNFCTB4MTIwMDAKQEAgLTI2OCw5ICsyODEsMTMgQEAKICNkZWZpbmUgUklOR19IRUFEKGJhc2UpCQkoKGJhc2UpKzB4MzQpCiAjZGVmaW5lIFJJTkdfU1RBUlQoYmFzZSkJKChiYXNlKSsweDM4KQogI2RlZmluZSBSSU5HX0NUTChiYXNlKQkJKChiYXNlKSsweDNjKQorI2RlZmluZSBSSU5HX1NZTkNfMChiYXNlKQkoKGJhc2UpKzB4NDApCisjZGVmaW5lIFJJTkdfU1lOQ18xKGJhc2UpCSgoYmFzZSkrMHg0NCkKKyNkZWZpbmUgUklOR19NQVhfSURMRShiYXNlKQkoKGJhc2UpKzB4NTQpCiAjZGVmaW5lIFJJTkdfSFdTX1BHQShiYXNlKQkoKGJhc2UpKzB4ODApCiAjZGVmaW5lIFJJTkdfSFdTX1BHQV9HRU42KGJhc2UpCSgoYmFzZSkrMHgyMDgwKQogI2RlZmluZSBSSU5HX0FDVEhEKGJhc2UpCSgoYmFzZSkrMHg3NCkKKyNkZWZpbmUgUklOR19OT1BJRChiYXNlKQkoKGJhc2UpKzB4OTQpCiAjZGVmaW5lICAgVEFJTF9BRERSCQkweDAwMUZGRkY4CiAjZGVmaW5lICAgSEVBRF9XUkFQX0NPVU5UCTB4RkZFMDAwMDAKICNkZWZpbmUgICBIRUFEX1dSQVBfT05FCQkweDAwMjAwMDAwCkBAIC0yODUsMTAgKzMwMiwxNyBAQAogI2RlZmluZSAgIFJJTkdfSU5WQUxJRAkJMHgwMDAwMDAwMAogI2RlZmluZSAgIFJJTkdfV0FJVF9JOFhYCSgxPDwwKSAvKiBnZW4yLCBQUkJ4X0hFQUQgKi8KICNkZWZpbmUgICBSSU5HX1dBSVQJCSgxPDwxMSkgLyogZ2VuMyssIFBSQnhfQ1RMICovCisjZGVmaW5lICAgUklOR19XQUlUX1NFTUFQSE9SRQkoMTw8MTApIC8qIGdlbjYrICovCisjaWYgMAorI2RlZmluZSBQUkIwX1RBSUwJMHgwMjAzMAorI2RlZmluZSBQUkIwX0hFQUQJMHgwMjAzNAorI2RlZmluZSBQUkIwX1NUQVJUCTB4MDIwMzgKKyNkZWZpbmUgUFJCMF9DVEwJMHgwMjAzYwogI2RlZmluZSBQUkIxX1RBSUwJMHgwMjA0MCAvKiA5MTUrIG9ubHkgKi8KICNkZWZpbmUgUFJCMV9IRUFECTB4MDIwNDQgLyogOTE1KyBvbmx5ICovCiAjZGVmaW5lIFBSQjFfU1RBUlQJMHgwMjA0OCAvKiA5MTUrIG9ubHkgKi8KICNkZWZpbmUgUFJCMV9DVEwJMHgwMjA0YyAvKiA5MTUrIG9ubHkgKi8KKyNlbmRpZgogI2RlZmluZSBJUEVJUl9JOTY1CTB4MDIwNjQKICNkZWZpbmUgSVBFSFJfSTk2NQkweDAyMDY4CiAjZGVmaW5lIElOU1RET05FX0k5NjUJMHgwMjA2YwpAQCAtMzA1LDExICszMjksNDIgQEAKICNkZWZpbmUgSU5TVERPTkUJMHgwMjA5MAogI2RlZmluZSBOT1BJRAkJMHgwMjA5NAogI2RlZmluZSBIV1NUQU0JCTB4MDIwOTgKKyNkZWZpbmUgVkNTX0lOU1RET05FCTB4MTIwNkMKKyNkZWZpbmUgVkNTX0lQRUlSCTB4MTIwNjQKKyNkZWZpbmUgVkNTX0lQRUhSCTB4MTIwNjgKKyNkZWZpbmUgVkNTX0FDVEhECTB4MTIwNzQKKyNkZWZpbmUgQkNTX0lOU1RET05FCTB4MjIwNkMKKyNkZWZpbmUgQkNTX0lQRUlSCTB4MjIwNjQKKyNkZWZpbmUgQkNTX0lQRUhSCTB4MjIwNjgKKyNkZWZpbmUgQkNTX0FDVEhECTB4MjIwNzQKKworI2RlZmluZSBFUlJPUl9HRU42CTB4MDQwYTAKKworLyogR000NSsgY2hpY2tlbiBiaXRzIC0tIGRlYnVnIHdvcmthcm91bmQgYml0cyB0aGF0IG1heSBiZSByZXF1aXJlZAorICogZm9yIHZhcmlvdXMgc29ydHMgb2YgY29ycmVjdCBiZWhhdmlvci4gIFRoZSB0b3AgMTYgYml0cyBvZiBlYWNoIGFyZQorICogdGhlIGVuYWJsZXMgZm9yIHdyaXRpbmcgdG8gdGhlIGNvcnJlc3BvbmRpbmcgbG93IGJpdC4KKyAqLworI2RlZmluZSBfM0RfQ0hJQ0tFTgkweDAyMDg0CisjZGVmaW5lIF8zRF9DSElDS0VOMgkweDAyMDhjCisvKiBEaXNhYmxlcyBwaXBlbGluaW5nIG9mIHJlYWQgZmx1c2hlcyBwYXN0IHRoZSBTRi1XSVogaW50ZXJmYWNlLgorICogUmVxdWlyZWQgb24gYWxsIElyb25sYWtlIHN0ZXBwaW5ncyBhY2NvcmRpbmcgdG8gdGhlIEItU3BlYywgYnV0IHRoZQorICogcGFydGljdWxhciBkYW5nZXIgb2Ygbm90IGRvaW5nIHNvIGlzIG5vdCBzcGVjaWZpZWQuCisgKi8KKyMgZGVmaW5lIF8zRF9DSElDS0VOMl9XTV9SRUFEX1BJUEVMSU5FRAkJCSgxIDw8IDE0KQorI2RlZmluZSBfM0RfQ0hJQ0tFTjMJMHgwMjA5MAogCiAjZGVmaW5lIE1JX01PREUJCTB4MDIwOWMKICMgZGVmaW5lIFZTX1RJTUVSX0RJU1BBVENICQkJCSgxIDw8IDYpCiAjIGRlZmluZSBNSV9GTFVTSF9FTkFCTEUJCQkJKDEgPDwgMTEpCiAKKyNkZWZpbmUgR0ZYX01PREUJMHgwMjUyMAorI2RlZmluZSAgIEdGWF9SVU5fTElTVF9FTkFCTEUJCSgxPDwxNSkKKyNkZWZpbmUgICBHRlhfVExCX0lOVkFMSURBVEVfQUxXQVlTCSgxPDwxMykKKyNkZWZpbmUgICBHRlhfU1VSRkFDRV9GQVVMVF9FTkFCTEUJKDE8PDEyKQorI2RlZmluZSAgIEdGWF9SRVBMQVlfTU9ERQkJKDE8PDExKQorI2RlZmluZSAgIEdGWF9QU01JX0dSQU5VTEFSSVRZCQkoMTw8MTApCisjZGVmaW5lICAgR0ZYX1BQR1RUX0VOQUJMRQkJKDE8PDkpCisKICNkZWZpbmUgU0NQRDAJCTB4MDIwOWMgLyogOTE1KyBvbmx5ICovCiAjZGVmaW5lIElFUgkJMHgwMjBhMAogI2RlZmluZSBJSVIJCTB4MDIwYTQKQEAgLTQ2MSw3ICs1MTYsNyBAQAogI2RlZmluZSAgIEdFTjZfQlNEX1NMRUVQX1BTTUlfQ09OVFJPTF9JRExFX0lORElDQVRPUgkJCSgxIDw8IDMpCiAKICNkZWZpbmUgR0VONl9CU0RfSU1SCQkJMHgxMjBhOAotI2RlZmluZSAgIEdFTjZfQlNEX0lNUl9VU0VSX0lOVEVSUlVQVAkoMSA8PCAxMikKKyNkZWZpbmUgICBHRU42X0JTRF9VU0VSX0lOVEVSUlVQVAkoMSA8PCAxMikKIAogI2RlZmluZSBHRU42X0JTRF9STkNJRAkJCTB4MTIxOTgKIApAQCAtNTQxLDYgKzU5NiwxOCBAQAogCiAjZGVmaW5lIElMS19ESVNQTEFZX0NISUNLRU4xCTB4NDIwMDAKICNkZWZpbmUgICBJTEtfRkJDUV9ESVMJCSgxPDwyMikKKyNkZWZpbmUgICBJTEtfUEFCU1RSRVRDSF9ESVMgCSgxPDwyMSkKKworCisvKgorICogRnJhbWVidWZmZXIgY29tcHJlc3Npb24gZm9yIFNhbmR5YnJpZGdlCisgKgorICogVGhlIGZvbGxvd2luZyB0d28gcmVnaXN0ZXJzIGFyZSBvZiB0eXBlIEdUVE1NQURSCisgKi8KKyNkZWZpbmUgU05CX0RQRkNfQ1RMX1NBCQkweDEwMDEwMAorI2RlZmluZSAgIFNOQl9DUFVfRkVOQ0VfRU5BQkxFCSgxPDwyOSkKKyNkZWZpbmUgRFBGQ19DUFVfRkVOQ0VfT0ZGU0VUCTB4MTAwMTA0CisKIAogLyoKICAqIEdQSU8gcmVncwpAQCAtOTAwLDYgKzk2Nyw4IEBACiAgKi8KICNkZWZpbmUgTUNIQkFSX01JUlJPUl9CQVNFCTB4MTAwMDAKIAorI2RlZmluZSBNQ0hCQVJfTUlSUk9SX0JBU0VfU05CCTB4MTQwMDAwCisKIC8qKiA5MTUtOTQ1IGFuZCBHTTk2NSBNQ0ggcmVnaXN0ZXIgY29udHJvbGxpbmcgRFJBTSBjaGFubmVsIGFjY2VzcyAqLwogI2RlZmluZSBEQ0MJCQkweDEwMjAwCiAjZGVmaW5lIERDQ19BRERSRVNTSU5HX01PREVfU0lOR0xFX0NIQU5ORUwJCSgwIDw8IDApCkBAIC0xMTE5LDYgKzExODgsMTAgQEAKICNkZWZpbmUgRERSTVBMTDEJCTBYMTJjMjAKICNkZWZpbmUgUEVHX0JBTkRfR0FQX0RBVEEJMHgxNGQ2OAogCisjZGVmaW5lIEdFTjZfR1RfUEVSRl9TVEFUVVMJMHgxNDU5NDgKKyNkZWZpbmUgR0VONl9SUF9TVEFURV9MSU1JVFMJMHgxNDU5OTQKKyNkZWZpbmUgR0VONl9SUF9TVEFURV9DQVAJMHgxNDU5OTgKKwogLyoKICAqIExvZ2ljYWwgQ29udGV4dCByZWdzCiAgKi8KQEAgLTExNjgsNyArMTI0MSw2IEBACiAjZGVmaW5lIFZUT1RBTChwaXBlKSBfUElQRShwaXBlLCBWVE9UQUxfQSwgVlRPVEFMX0IpCiAjZGVmaW5lIFZCTEFOSyhwaXBlKSBfUElQRShwaXBlLCBWQkxBTktfQSwgVkJMQU5LX0IpCiAjZGVmaW5lIFZTWU5DKHBpcGUpIF9QSVBFKHBpcGUsIFZTWU5DX0EsIFZTWU5DX0IpCi0jZGVmaW5lIFBJUEVTUkMocGlwZSkgX1BJUEUocGlwZSwgUElQRUFTUkMsIFBJUEVCU1JDKQogI2RlZmluZSBCQ0xSUEFUKHBpcGUpIF9QSVBFKHBpcGUsIEJDTFJQQVRfQSwgQkNMUlBBVF9CKQogCiAvKiBWR0EgcG9ydCBjb250cm9sICovCkBAIC0yMTgyLDggKzIyNTQsMTAgQEAKICNkZWZpbmUgICBQSVBFXzZCUEMJCQkJKDIgPDwgNSkKICNkZWZpbmUgICBQSVBFXzEyQlBDCQkJCSgzIDw8IDUpCiAKKyNkZWZpbmUgUElQRVNSQyhwaXBlKSBfUElQRShwaXBlLCBQSVBFQVNSQywgUElQRUJTUkMpCiAjZGVmaW5lIFBJUEVDT05GKHBpcGUpIF9QSVBFKHBpcGUsIFBJUEVBQ09ORiwgUElQRUJDT05GKQogI2RlZmluZSBQSVBFRFNMKHBpcGUpICBfUElQRShwaXBlLCBQSVBFQURTTCwgUElQRUJEU0wpCisjZGVmaW5lIFBJUEVGUkFNRVBJWEVMKHBpcGUpICBfUElQRShwaXBlLCBQSVBFQUZSQU1FUElYRUwsIFBJUEVCRlJBTUVQSVhFTCkKIAogI2RlZmluZSBEU1BBUkIJCQkweDcwMDMwCiAjZGVmaW5lICAgRFNQQVJCX0NTVEFSVF9NQVNLCSgweDdmIDw8IDcpCkBAIC0yMjkxLDYgKzIzNjUsNDAgQEAKIAogI2RlZmluZSBJTEtfRklGT19MSU5FX1NJWkUJNjQKIAorLyogZGVmaW5lIHRoZSBXTSBpbmZvIG9uIFNhbmR5YnJpZGdlICovCisjZGVmaW5lIFNOQl9ESVNQTEFZX0ZJRk8JMTI4CisjZGVmaW5lIFNOQl9ESVNQTEFZX01BWFdNCTB4N2YJLyogYml0IDE2OjIyICovCisjZGVmaW5lIFNOQl9ESVNQTEFZX0RGVFdNCTgKKyNkZWZpbmUgU05CX0NVUlNPUl9GSUZPCQkzMgorI2RlZmluZSBTTkJfQ1VSU09SX01BWFdNCTB4MWYJLyogYml0IDQ6MCAqLworI2RlZmluZSBTTkJfQ1VSU09SX0RGVFdNCTgKKworI2RlZmluZSBTTkJfRElTUExBWV9TUl9GSUZPCTUxMgorI2RlZmluZSBTTkJfRElTUExBWV9NQVhfU1JXTQkweDFmZgkvKiBiaXQgMTY6OCAqLworI2RlZmluZSBTTkJfRElTUExBWV9ERlRfU1JXTQkweDNmCisjZGVmaW5lIFNOQl9DVVJTT1JfU1JfRklGTwk2NAorI2RlZmluZSBTTkJfQ1VSU09SX01BWF9TUldNCTB4M2YJLyogYml0IDU6MCAqLworI2RlZmluZSBTTkJfQ1VSU09SX0RGVF9TUldNCTgKKworI2RlZmluZSBTTkJfRkJDX01BWF9TUldNCTB4ZgkvKiBiaXQgMjM6MjAgKi8KKworI2RlZmluZSBTTkJfRklGT19MSU5FX1NJWkUJNjQKKworCisvKiB0aGUgYWRkcmVzcyB3aGVyZSB3ZSBnZXQgYWxsIGtpbmRzIG9mIGxhdGVuY3kgdmFsdWUgKi8KKyNkZWZpbmUgU1NLUEQJCQkweDVkMTAKKyNkZWZpbmUgU1NLUERfV01fTUFTSwkJMHgzZgorI2RlZmluZSBTU0tQRF9XTTBfU0hJRlQJCTAKKyNkZWZpbmUgU1NLUERfV00xX1NISUZUCQk4CisjZGVmaW5lIFNTS1BEX1dNMl9TSElGVAkJMTYKKyNkZWZpbmUgU1NLUERfV00zX1NISUZUCQkyNAorCisjZGVmaW5lIFNOQl9MQVRFTkNZKHNoaWZ0KQkoSTkxNV9SRUFEKE1DSEJBUl9NSVJST1JfQkFTRV9TTkIgKyBTU0tQRCkgPj4gKHNoaWZ0KSAmIFNTS1BEX1dNX01BU0spCisjZGVmaW5lIFNOQl9SRUFEX1dNMF9MQVRFTkNZKCkJCVNOQl9MQVRFTkNZKFNTS1BEX1dNMF9TSElGVCkKKyNkZWZpbmUgU05CX1JFQURfV00xX0xBVEVOQ1koKQkJU05CX0xBVEVOQ1koU1NLUERfV00xX1NISUZUKQorI2RlZmluZSBTTkJfUkVBRF9XTTJfTEFURU5DWSgpCQlTTkJfTEFURU5DWShTU0tQRF9XTTJfU0hJRlQpCisjZGVmaW5lIFNOQl9SRUFEX1dNM19MQVRFTkNZKCkJCVNOQl9MQVRFTkNZKFNTS1BEX1dNM19TSElGVCkKKwogLyoKICAqIFRoZSB0d28gcGlwZSBmcmFtZSBjb3VudGVyIHJlZ2lzdGVycyBhcmUgbm90IHN5bmNocm9uaXplZCwgc28KICAqIHJlYWRpbmcgYSBzdGFibGUgdmFsdWUgaXMgc29tZXdoYXQgdHJpY2t5LiBUaGUgZm9sbG93aW5nIGNvZGUKQEAgLTIzNTEsNiArMjQ1OSwxMCBAQAogI2RlZmluZSBDVVJCQkFTRQkJMHg3MDBjNAogI2RlZmluZSBDVVJCUE9TCQkJMHg3MDBjOAogCisjZGVmaW5lIENVUkNOVFIocGlwZSkgX1BJUEUocGlwZSwgQ1VSQUNOVFIsIENVUkJDTlRSKQorI2RlZmluZSBDVVJCQVNFKHBpcGUpIF9QSVBFKHBpcGUsIENVUkFCQVNFLCBDVVJCQkFTRSkKKyNkZWZpbmUgQ1VSUE9TKHBpcGUpIF9QSVBFKHBpcGUsIENVUkFQT1MsIENVUkJQT1MpCisKIC8qIERpc3BsYXkgQSBjb250cm9sICovCiAjZGVmaW5lIERTUEFDTlRSICAgICAgICAgICAgICAgIDB4NzAxODAKICNkZWZpbmUgICBESVNQTEFZX1BMQU5FX0VOQUJMRQkJCSgxPDwzMSkKQEAgLTI1ODksNiArMjcwMSw4IEBACiAjZGVmaW5lIEdUSUVSICAgMHg0NDAxYwogCiAjZGVmaW5lIElMS19ESVNQTEFZX0NISUNLRU4yCTB4NDIwMDQKKy8qIFJlcXVpcmVkIG9uIGFsbCBJcm9ubGFrZSBhbmQgU2FuZHlicmlkZ2UgYWNjb3JkaW5nIHRvIHRoZSBCLVNwZWMuICovCisjZGVmaW5lICBJTEtfRUxQSU5fNDA5X1NFTEVDVAkoMSA8PCAyNSkKICNkZWZpbmUgIElMS19EUEFSQl9HQVRFCSgxPDwyMikKICNkZWZpbmUgIElMS19WU0RQRkRfRlVMTAkoMTw8MjEpCiAjZGVmaW5lIElMS19ESVNQTEFZX0NISUNLRU5fRlVTRVMJMHg0MjAxNApAQCAtMjYwMCw2ICsyNzE0LDggQEAKICNkZWZpbmUgIElMS19ERVNLVE9QCQkJKDE8PDIzKQogI2RlZmluZSBJTEtfRFNQQ0xLX0dBVEUJCTB4NDIwMjAKICNkZWZpbmUgIElMS19EUEFSQl9DTEtfR0FURQkoMTw8NSkKKyNkZWZpbmUgIElMS19EUEZEX0NMS19HQVRFCSgxPDw3KQorCiAvKiBBY2NvcmRpbmcgdG8gc3BlYyB0aGlzIGJpdCA3LzgvOSBvZiAweDQyMDIwIHNob3VsZCBiZSBzZXQgdG8gZW5hYmxlIEZCQyAqLwogI2RlZmluZSAgIElMS19DTEtfRkJDCQkoMTw8NykKICNkZWZpbmUgICBJTEtfRFBGQ19ESVMxCQkoMTw8OCkKQEAgLTI2NzksNiArMjc5NSw3IEBACiAjZGVmaW5lIFBDSF9EUExMKHBpcGUpIF9QSVBFKHBpcGUsIFBDSF9EUExMX0EsIFBDSF9EUExMX0IpCiAKICNkZWZpbmUgUENIX0ZQQTAgICAgICAgICAgICAgICAgMHhjNjA0MAorI2RlZmluZSAgRlBfQ0JfVFVORQkJKDB4Mzw8MjIpCiAjZGVmaW5lIFBDSF9GUEExICAgICAgICAgICAgICAgIDB4YzYwNDQKICNkZWZpbmUgUENIX0ZQQjAgICAgICAgICAgICAgICAgMHhjNjA0OAogI2RlZmluZSBQQ0hfRlBCMSAgICAgICAgICAgICAgICAweGM2MDRjCkBAIC0zMDYzLDQgKzMxODAsNjYgQEAKICNkZWZpbmUgIEVEUF9MSU5LX1RSQUlOXzgwME1WXzBEQl9TTkJfQgkJKDB4Mzg8PDIyKQogI2RlZmluZSAgRURQX0xJTktfVFJBSU5fVk9MX0VNUF9NQVNLX1NOQgkoMHgzZjw8MjIpCiAKKyNkZWZpbmUgIEZPUkNFV0FLRQkJCQkweEExOEMKKyNkZWZpbmUgIEZPUkNFV0FLRV9BQ0sJCQkJMHgxMzAwOTAKKworI2RlZmluZSBHRU42X1JQTlNXUkVRCQkJCTB4QTAwOAorI2RlZmluZSAgIEdFTjZfVFVSQk9fRElTQUJMRQkJCSgxPDwzMSkKKyNkZWZpbmUgICBHRU42X0ZSRVFVRU5DWSh4KQkJCSgoeCk8PDI1KQorI2RlZmluZSAgIEdFTjZfT0ZGU0VUKHgpCQkJKCh4KTw8MTkpCisjZGVmaW5lICAgR0VONl9BR0dSRVNTSVZFX1RVUkJPCQkJKDA8PDE1KQorI2RlZmluZSBHRU42X1JDX1ZJREVPX0ZSRVEJCQkweEEwMEMKKyNkZWZpbmUgR0VONl9SQ19DT05UUk9MCQkJCTB4QTA5MAorI2RlZmluZSAgIEdFTjZfUkNfQ1RMX1JDNnBwX0VOQUJMRQkJKDE8PDE2KQorI2RlZmluZSAgIEdFTjZfUkNfQ1RMX1JDNnBfRU5BQkxFCQkoMTw8MTcpCisjZGVmaW5lICAgR0VONl9SQ19DVExfUkM2X0VOQUJMRQkJKDE8PDE4KQorI2RlZmluZSAgIEdFTjZfUkNfQ1RMX1JDMWVfRU5BQkxFCQkoMTw8MjApCisjZGVmaW5lICAgR0VONl9SQ19DVExfUkM3X0VOQUJMRQkJKDE8PDIyKQorI2RlZmluZSAgIEdFTjZfUkNfQ1RMX0VJX01PREUoeCkJCSgoeCk8PDI3KQorI2RlZmluZSAgIEdFTjZfUkNfQ1RMX0hXX0VOQUJMRQkJCSgxPDwzMSkKKyNkZWZpbmUgR0VONl9SUF9ET1dOX1RJTUVPVVQJCQkweEEwMTAKKyNkZWZpbmUgR0VONl9SUF9JTlRFUlJVUFRfTElNSVRTCQkweEEwMTQKKyNkZWZpbmUgR0VONl9SUFNUQVQxCQkJCTB4QTAxQworI2RlZmluZSBHRU42X1JQX0NPTlRST0wJCQkJMHhBMDI0CisjZGVmaW5lICAgR0VONl9SUF9NRURJQV9UVVJCTwkJCSgxPDwxMSkKKyNkZWZpbmUgICBHRU42X1JQX1VTRV9OT1JNQUxfRlJFUQkJKDE8PDkpCisjZGVmaW5lICAgR0VONl9SUF9NRURJQV9JU19HRlgJCQkoMTw8OCkKKyNkZWZpbmUgICBHRU42X1JQX0VOQUJMRQkJCSgxPDw3KQorI2RlZmluZSAgIEdFTjZfUlBfVVBfQlVTWV9NQVgJCQkoMHgyPDwzKQorI2RlZmluZSAgIEdFTjZfUlBfRE9XTl9CVVNZX01JTgkJCSgweDI8PDApCisjZGVmaW5lIEdFTjZfUlBfVVBfVEhSRVNIT0xECQkJMHhBMDJDCisjZGVmaW5lIEdFTjZfUlBfRE9XTl9USFJFU0hPTEQJCQkweEEwMzAKKyNkZWZpbmUgR0VONl9SUF9VUF9FSQkJCQkweEEwNjgKKyNkZWZpbmUgR0VONl9SUF9ET1dOX0VJCQkJCTB4QTA2QworI2RlZmluZSBHRU42X1JQX0lETEVfSFlTVEVSU0lTCQkJMHhBMDcwCisjZGVmaW5lIEdFTjZfUkNfU1RBVEUJCQkJMHhBMDk0CisjZGVmaW5lIEdFTjZfUkMxX1dBS0VfUkFURV9MSU1JVAkJMHhBMDk4CisjZGVmaW5lIEdFTjZfUkM2X1dBS0VfUkFURV9MSU1JVAkJMHhBMDlDCisjZGVmaW5lIEdFTjZfUkM2cHBfV0FLRV9SQVRFX0xJTUlUCQkweEEwQTAKKyNkZWZpbmUgR0VONl9SQ19FVkFMVUFUSU9OX0lOVEVSVkFMCQkweEEwQTgKKyNkZWZpbmUgR0VONl9SQ19JRExFX0hZU1RFUlNJUwkJCTB4QTBBQworI2RlZmluZSBHRU42X1JDX1NMRUVQCQkJCTB4QTBCMAorI2RlZmluZSBHRU42X1JDMWVfVEhSRVNIT0xECQkJMHhBMEI0CisjZGVmaW5lIEdFTjZfUkM2X1RIUkVTSE9MRAkJCTB4QTBCOAorI2RlZmluZSBHRU42X1JDNnBfVEhSRVNIT0xECQkJMHhBMEJDCisjZGVmaW5lIEdFTjZfUkM2cHBfVEhSRVNIT0xECQkJMHhBMEMwCisjZGVmaW5lIEdFTjZfUE1JTlRSTVNLCQkJCTB4QTE2OAorCisjZGVmaW5lIEdFTjZfUE1JU1IJCQkJMHg0NDAyMAorI2RlZmluZSBHRU42X1BNSU1SCQkJCTB4NDQwMjQKKyNkZWZpbmUgR0VONl9QTUlJUgkJCQkweDQ0MDI4CisjZGVmaW5lIEdFTjZfUE1JRVIJCQkJMHg0NDAyQworI2RlZmluZSAgR0VONl9QTV9NQk9YX0VWRU5UCQkJKDE8PDI1KQorI2RlZmluZSAgR0VONl9QTV9USEVSTUFMX0VWRU5UCQkJKDE8PDI0KQorI2RlZmluZSAgR0VONl9QTV9SUF9ET1dOX1RJTUVPVVQJCSgxPDw2KQorI2RlZmluZSAgR0VONl9QTV9SUF9VUF9USFJFU0hPTEQJCSgxPDw1KQorI2RlZmluZSAgR0VONl9QTV9SUF9ET1dOX1RIUkVTSE9MRAkJKDE8PDQpCisjZGVmaW5lICBHRU42X1BNX1JQX1VQX0VJX0VYUElSRUQJCSgxPDwyKQorI2RlZmluZSAgR0VONl9QTV9SUF9ET1dOX0VJX0VYUElSRUQJCSgxPDwxKQorCisjZGVmaW5lIEdFTjZfUENPREVfTUFJTEJPWAkJCTB4MTM4MTI0CisjZGVmaW5lICAgR0VONl9QQ09ERV9SRUFEWQkJCSgxPDwzMSkKKyNkZWZpbmUgICBHRU42X1BDT0RFX1dSSVRFX01JTl9GUkVRX1RBQkxFCTB4OQorI2RlZmluZSBHRU42X1BDT0RFX0RBVEEJCQkJMHgxMzgxMjgKKwogI2VuZGlmIC8qIF9JOTE1X1JFR19IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9zdXNwZW5kLmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X3N1c3BlbmQuYwppbmRleCA0MjcyOWQyLi40MTA3NzI0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X3N1c3BlbmQuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X3N1c3BlbmQuYwpAQCAtMjM1LDYgKzIzNSw3IEBACiBzdGF0aWMgdm9pZCBpOTE1X3NhdmVfbW9kZXNldF9yZWcoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWludCBpOwogCiAJaWYgKGRybV9jb3JlX2NoZWNrX2ZlYXR1cmUoZGV2LCBEUklWRVJfTU9ERVNFVCkpCiAJCXJldHVybjsKQEAgLTM2Nyw2ICszNjgsMjggQEAKIAl9CiAJaTkxNV9zYXZlX3BhbGV0dGUoZGV2LCBQSVBFX0IpOwogCWRldl9wcml2LT5zYXZlUElQRUJTVEFUID0gSTkxNV9SRUFEKFBJUEVCU1RBVCk7CisKKwkvKiBGZW5jZXMgKi8KKwlzd2l0Y2ggKElOVEVMX0lORk8oZGV2KS0+Z2VuKSB7CisJY2FzZSA2OgorCQlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKKwkJCWRldl9wcml2LT5zYXZlRkVOQ0VbaV0gPSBJOTE1X1JFQUQ2NChGRU5DRV9SRUdfU0FORFlCUklER0VfMCArIChpICogOCkpOworCQlicmVhazsKKwljYXNlIDU6CisJY2FzZSA0OgorCQlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKKwkJCWRldl9wcml2LT5zYXZlRkVOQ0VbaV0gPSBJOTE1X1JFQUQ2NChGRU5DRV9SRUdfOTY1XzAgKyAoaSAqIDgpKTsKKwkJYnJlYWs7CisJY2FzZSAzOgorCQlpZiAoSVNfSTk0NUcoZGV2KSB8fCBJU19JOTQ1R00oZGV2KSB8fCBJU19HMzMoZGV2KSkKKwkJCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisJCQkJZGV2X3ByaXYtPnNhdmVGRU5DRVtpKzhdID0gSTkxNV9SRUFEKEZFTkNFX1JFR185NDVfOCArIChpICogNCkpOworCWNhc2UgMjoKKwkJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKwkJCWRldl9wcml2LT5zYXZlRkVOQ0VbaV0gPSBJOTE1X1JFQUQoRkVOQ0VfUkVHXzgzMF8wICsgKGkgKiA0KSk7CisJCWJyZWFrOworCX0KKwogCXJldHVybjsKIH0KIApAQCAtMzc1LDEwICszOTgsMzMgQEAKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCWludCBkcGxsX2FfcmVnLCBmcGEwX3JlZywgZnBhMV9yZWc7CiAJaW50IGRwbGxfYl9yZWcsIGZwYjBfcmVnLCBmcGIxX3JlZzsKKwlpbnQgaTsKIAogCWlmIChkcm1fY29yZV9jaGVja19mZWF0dXJlKGRldiwgRFJJVkVSX01PREVTRVQpKQogCQlyZXR1cm47CiAKKwkvKiBGZW5jZXMgKi8KKwlzd2l0Y2ggKElOVEVMX0lORk8oZGV2KS0+Z2VuKSB7CisJY2FzZSA2OgorCQlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKKwkJCUk5MTVfV1JJVEU2NChGRU5DRV9SRUdfU0FORFlCUklER0VfMCArIChpICogOCksIGRldl9wcml2LT5zYXZlRkVOQ0VbaV0pOworCQlicmVhazsKKwljYXNlIDU6CisJY2FzZSA0OgorCQlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKKwkJCUk5MTVfV1JJVEU2NChGRU5DRV9SRUdfOTY1XzAgKyAoaSAqIDgpLCBkZXZfcHJpdi0+c2F2ZUZFTkNFW2ldKTsKKwkJYnJlYWs7CisJY2FzZSAzOgorCWNhc2UgMjoKKwkJaWYgKElTX0k5NDVHKGRldikgfHwgSVNfSTk0NUdNKGRldikgfHwgSVNfRzMzKGRldikpCisJCQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQorCQkJCUk5MTVfV1JJVEUoRkVOQ0VfUkVHXzk0NV84ICsgKGkgKiA0KSwgZGV2X3ByaXYtPnNhdmVGRU5DRVtpKzhdKTsKKwkJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKwkJCUk5MTVfV1JJVEUoRkVOQ0VfUkVHXzgzMF8wICsgKGkgKiA0KSwgZGV2X3ByaXYtPnNhdmVGRU5DRVtpXSk7CisJCWJyZWFrOworCX0KKworCiAJaWYgKEhBU19QQ0hfU1BMSVQoZGV2KSkgewogCQlkcGxsX2FfcmVnID0gUENIX0RQTExfQTsKIAkJZHBsbF9iX3JlZyA9IFBDSF9EUExMX0I7CkBAIC03NzEsOCArODE3LDE0IEBACiAJCWRldl9wcml2LT5zYXZlSU1SID0gSTkxNV9SRUFEKElNUik7CiAJfQogCi0JaWYgKEhBU19QQ0hfU1BMSVQoZGV2KSkKKwlpZiAoSVNfSVJPTkxBS0VfTShkZXYpKQogCQlpcm9ubGFrZV9kaXNhYmxlX2RycHMoZGV2KTsKKwlpZiAoSVNfR0VONihkZXYpKQorCQlnZW42X2Rpc2FibGVfcnBzKGRldik7CisKKwkvKiBYWFggZGlzYWJsaW5nIHRoZSBjbG9jayBnYXRpbmcgYnJlYWtzIHN1c3BlbmQgb24gZ200NQorCWludGVsX2Rpc2FibGVfY2xvY2tfZ2F0aW5nKGRldik7CisJICovCiAKIAkvKiBDYWNoZSBtb2RlIHN0YXRlICovCiAJZGV2X3ByaXYtPnNhdmVDQUNIRV9NT0RFXzAgPSBJOTE1X1JFQUQoQ0FDSEVfTU9ERV8wKTsKQEAgLTc4OCwyOCArODQwLDYgQEAKIAlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQogCQlkZXZfcHJpdi0+c2F2ZVNXRjJbaV0gPSBJOTE1X1JFQUQoU1dGMzAgKyAoaSA8PCAyKSk7CiAKLQkvKiBGZW5jZXMgKi8KLQlzd2l0Y2ggKElOVEVMX0lORk8oZGV2KS0+Z2VuKSB7Ci0JY2FzZSA2OgotCQlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKLQkJCWRldl9wcml2LT5zYXZlRkVOQ0VbaV0gPSBJOTE1X1JFQUQ2NChGRU5DRV9SRUdfU0FORFlCUklER0VfMCArIChpICogOCkpOwotCQlicmVhazsKLQljYXNlIDU6Ci0JY2FzZSA0OgotCQlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKLQkJCWRldl9wcml2LT5zYXZlRkVOQ0VbaV0gPSBJOTE1X1JFQUQ2NChGRU5DRV9SRUdfOTY1XzAgKyAoaSAqIDgpKTsKLQkJYnJlYWs7Ci0JY2FzZSAzOgotCQlpZiAoSVNfSTk0NUcoZGV2KSB8fCBJU19JOTQ1R00oZGV2KSB8fCBJU19HMzMoZGV2KSkKLQkJCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCi0JCQkJZGV2X3ByaXYtPnNhdmVGRU5DRVtpKzhdID0gSTkxNV9SRUFEKEZFTkNFX1JFR185NDVfOCArIChpICogNCkpOwotCWNhc2UgMjoKLQkJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKLQkJCWRldl9wcml2LT5zYXZlRkVOQ0VbaV0gPSBJOTE1X1JFQUQoRkVOQ0VfUkVHXzgzMF8wICsgKGkgKiA0KSk7Ci0JCWJyZWFrOwotCi0JfQotCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTgyMywyNyArODUzLDYgQEAKIAkvKiBIYXJkd2FyZSBzdGF0dXMgcGFnZSAqLwogCUk5MTVfV1JJVEUoSFdTX1BHQSwgZGV2X3ByaXYtPnNhdmVIV1MpOwogCi0JLyogRmVuY2VzICovCi0Jc3dpdGNoIChJTlRFTF9JTkZPKGRldiktPmdlbikgewotCWNhc2UgNjoKLQkJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCi0JCQlJOTE1X1dSSVRFNjQoRkVOQ0VfUkVHX1NBTkRZQlJJREdFXzAgKyAoaSAqIDgpLCBkZXZfcHJpdi0+c2F2ZUZFTkNFW2ldKTsKLQkJYnJlYWs7Ci0JY2FzZSA1OgotCWNhc2UgNDoKLQkJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCi0JCQlJOTE1X1dSSVRFNjQoRkVOQ0VfUkVHXzk2NV8wICsgKGkgKiA4KSwgZGV2X3ByaXYtPnNhdmVGRU5DRVtpXSk7Ci0JCWJyZWFrOwotCWNhc2UgMzoKLQljYXNlIDI6Ci0JCWlmIChJU19JOTQ1RyhkZXYpIHx8IElTX0k5NDVHTShkZXYpIHx8IElTX0czMyhkZXYpKQotCQkJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKLQkJCQlJOTE1X1dSSVRFKEZFTkNFX1JFR185NDVfOCArIChpICogNCksIGRldl9wcml2LT5zYXZlRkVOQ0VbaSs4XSk7Ci0JCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCi0JCQlJOTE1X1dSSVRFKEZFTkNFX1JFR184MzBfMCArIChpICogNCksIGRldl9wcml2LT5zYXZlRkVOQ0VbaV0pOwotCQlicmVhazsKLQl9Ci0KIAlpOTE1X3Jlc3RvcmVfZGlzcGxheShkZXYpOwogCiAJLyogSW50ZXJydXB0IHN0YXRlICovCkBAIC04NjAsMTMgKzg2OSwxNiBAQAogCX0KIAogCS8qIENsb2NrIGdhdGluZyBzdGF0ZSAqLwotCWludGVsX2luaXRfY2xvY2tfZ2F0aW5nKGRldik7CisJaW50ZWxfZW5hYmxlX2Nsb2NrX2dhdGluZyhkZXYpOwogCi0JaWYgKEhBU19QQ0hfU1BMSVQoZGV2KSkgeworCWlmIChJU19JUk9OTEFLRV9NKGRldikpIHsKIAkJaXJvbmxha2VfZW5hYmxlX2RycHMoZGV2KTsKIAkJaW50ZWxfaW5pdF9lbW9uKGRldik7CiAJfQogCisJaWYgKElTX0dFTjYoZGV2KSkKKwkJZ2VuNl9lbmFibGVfcnBzKGRldl9wcml2KTsKKwogCS8qIENhY2hlIG1vZGUgc3RhdGUgKi8KIAlJOTE1X1dSSVRFIChDQUNIRV9NT0RFXzAsIGRldl9wcml2LT5zYXZlQ0FDSEVfTU9ERV8wIHwgMHhmZmZmMDAwMCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfdHJhY2UuaCBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfdHJhY2UuaAppbmRleCBmZWE5N2EyLi43ZjBmYzNlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X3RyYWNlLmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV90cmFjZS5oCkBAIC02LDYgKzYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3RyYWNlcG9pbnQuaD4KIAogI2luY2x1ZGUgPGRybS9kcm1QLmg+CisjaW5jbHVkZSAiaTkxNV9kcnYuaCIKIAogI3VuZGVmIFRSQUNFX1NZU1RFTQogI2RlZmluZSBUUkFDRV9TWVNURU0gaTkxNQpAQCAtMTYsMTggKzE3LDE4IEBACiAKIFRSQUNFX0VWRU5UKGk5MTVfZ2VtX29iamVjdF9jcmVhdGUsCiAKLQkgICAgVFBfUFJPVE8oc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmopLAorCSAgICBUUF9QUk9UTyhzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqKSwKIAogCSAgICBUUF9BUkdTKG9iaiksCiAKIAkgICAgVFBfU1RSVUNUX19lbnRyeSgKLQkJCSAgICAgX19maWVsZChzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKiwgb2JqKQorCQkJICAgICBfX2ZpZWxkKHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICosIG9iaikKIAkJCSAgICAgX19maWVsZCh1MzIsIHNpemUpCiAJCQkgICAgICksCiAKIAkgICAgVFBfZmFzdF9hc3NpZ24oCiAJCQkgICBfX2VudHJ5LT5vYmogPSBvYmo7Ci0JCQkgICBfX2VudHJ5LT5zaXplID0gb2JqLT5zaXplOworCQkJICAgX19lbnRyeS0+c2l6ZSA9IG9iai0+YmFzZS5zaXplOwogCQkJICAgKSwKIAogCSAgICBUUF9wcmludGsoIm9iaj0lcCwgc2l6ZT0ldSIsIF9fZW50cnktPm9iaiwgX19lbnRyeS0+c2l6ZSkKQEAgLTM1LDQwICszNiw0MyBAQAogCiBUUkFDRV9FVkVOVChpOTE1X2dlbV9vYmplY3RfYmluZCwKIAotCSAgICBUUF9QUk9UTyhzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iaiwgdTMyIGd0dF9vZmZzZXQpLAorCSAgICBUUF9QUk9UTyhzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqLCB1MzIgZ3R0X29mZnNldCwgYm9vbCBtYXBwYWJsZSksCiAKLQkgICAgVFBfQVJHUyhvYmosIGd0dF9vZmZzZXQpLAorCSAgICBUUF9BUkdTKG9iaiwgZ3R0X29mZnNldCwgbWFwcGFibGUpLAogCiAJICAgIFRQX1NUUlVDVF9fZW50cnkoCi0JCQkgICAgIF9fZmllbGQoc3RydWN0IGRybV9nZW1fb2JqZWN0ICosIG9iaikKKwkJCSAgICAgX19maWVsZChzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqLCBvYmopCiAJCQkgICAgIF9fZmllbGQodTMyLCBndHRfb2Zmc2V0KQorCQkJICAgICBfX2ZpZWxkKGJvb2wsIG1hcHBhYmxlKQogCQkJICAgICApLAogCiAJICAgIFRQX2Zhc3RfYXNzaWduKAogCQkJICAgX19lbnRyeS0+b2JqID0gb2JqOwogCQkJICAgX19lbnRyeS0+Z3R0X29mZnNldCA9IGd0dF9vZmZzZXQ7CisJCQkgICBfX2VudHJ5LT5tYXBwYWJsZSA9IG1hcHBhYmxlOwogCQkJICAgKSwKIAotCSAgICBUUF9wcmludGsoIm9iaj0lcCwgZ3R0X29mZnNldD0lMDh4IiwKLQkJICAgICAgX19lbnRyeS0+b2JqLCBfX2VudHJ5LT5ndHRfb2Zmc2V0KQorCSAgICBUUF9wcmludGsoIm9iaj0lcCwgZ3R0X29mZnNldD0lMDh4JXMiLAorCQkgICAgICBfX2VudHJ5LT5vYmosIF9fZW50cnktPmd0dF9vZmZzZXQsCisJCSAgICAgIF9fZW50cnktPm1hcHBhYmxlID8gIiwgbWFwcGFibGUiIDogIiIpCiApOwogCiBUUkFDRV9FVkVOVChpOTE1X2dlbV9vYmplY3RfY2hhbmdlX2RvbWFpbiwKIAotCSAgICBUUF9QUk9UTyhzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iaiwgdWludDMyX3Qgb2xkX3JlYWRfZG9tYWlucywgdWludDMyX3Qgb2xkX3dyaXRlX2RvbWFpbiksCisJICAgIFRQX1BST1RPKHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmosIHVpbnQzMl90IG9sZF9yZWFkX2RvbWFpbnMsIHVpbnQzMl90IG9sZF93cml0ZV9kb21haW4pLAogCiAJICAgIFRQX0FSR1Mob2JqLCBvbGRfcmVhZF9kb21haW5zLCBvbGRfd3JpdGVfZG9tYWluKSwKIAogCSAgICBUUF9TVFJVQ1RfX2VudHJ5KAotCQkJICAgICBfX2ZpZWxkKHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqLCBvYmopCisJCQkgICAgIF9fZmllbGQoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKiwgb2JqKQogCQkJICAgICBfX2ZpZWxkKHUzMiwgcmVhZF9kb21haW5zKQogCQkJICAgICBfX2ZpZWxkKHUzMiwgd3JpdGVfZG9tYWluKQogCQkJICAgICApLAogCiAJICAgIFRQX2Zhc3RfYXNzaWduKAogCQkJICAgX19lbnRyeS0+b2JqID0gb2JqOwotCQkJICAgX19lbnRyeS0+cmVhZF9kb21haW5zID0gb2JqLT5yZWFkX2RvbWFpbnMgfCAob2xkX3JlYWRfZG9tYWlucyA8PCAxNik7Ci0JCQkgICBfX2VudHJ5LT53cml0ZV9kb21haW4gPSBvYmotPndyaXRlX2RvbWFpbiB8IChvbGRfd3JpdGVfZG9tYWluIDw8IDE2KTsKKwkJCSAgIF9fZW50cnktPnJlYWRfZG9tYWlucyA9IG9iai0+YmFzZS5yZWFkX2RvbWFpbnMgfCAob2xkX3JlYWRfZG9tYWlucyA8PCAxNik7CisJCQkgICBfX2VudHJ5LT53cml0ZV9kb21haW4gPSBvYmotPmJhc2Uud3JpdGVfZG9tYWluIHwgKG9sZF93cml0ZV9kb21haW4gPDwgMTYpOwogCQkJICAgKSwKIAogCSAgICBUUF9wcmludGsoIm9iaj0lcCwgcmVhZD0lMDR4LCB3cml0ZT0lMDR4IiwKQEAgLTc2LDM2ICs4MCwxNCBAQAogCQkgICAgICBfX2VudHJ5LT5yZWFkX2RvbWFpbnMsIF9fZW50cnktPndyaXRlX2RvbWFpbikKICk7CiAKLVRSQUNFX0VWRU5UKGk5MTVfZ2VtX29iamVjdF9nZXRfZmVuY2UsCi0KLQkgICAgVFBfUFJPVE8oc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmosIGludCBmZW5jZSwgaW50IHRpbGluZ19tb2RlKSwKLQotCSAgICBUUF9BUkdTKG9iaiwgZmVuY2UsIHRpbGluZ19tb2RlKSwKLQotCSAgICBUUF9TVFJVQ1RfX2VudHJ5KAotCQkJICAgICBfX2ZpZWxkKHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqLCBvYmopCi0JCQkgICAgIF9fZmllbGQoaW50LCBmZW5jZSkKLQkJCSAgICAgX19maWVsZChpbnQsIHRpbGluZ19tb2RlKQotCQkJICAgICApLAotCi0JICAgIFRQX2Zhc3RfYXNzaWduKAotCQkJICAgX19lbnRyeS0+b2JqID0gb2JqOwotCQkJICAgX19lbnRyeS0+ZmVuY2UgPSBmZW5jZTsKLQkJCSAgIF9fZW50cnktPnRpbGluZ19tb2RlID0gdGlsaW5nX21vZGU7Ci0JCQkgICApLAotCi0JICAgIFRQX3ByaW50aygib2JqPSVwLCBmZW5jZT0lZCwgdGlsaW5nPSVkIiwKLQkJICAgICAgX19lbnRyeS0+b2JqLCBfX2VudHJ5LT5mZW5jZSwgX19lbnRyeS0+dGlsaW5nX21vZGUpCi0pOwotCiBERUNMQVJFX0VWRU5UX0NMQVNTKGk5MTVfZ2VtX29iamVjdCwKIAotCSAgICBUUF9QUk9UTyhzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iaiksCisJICAgIFRQX1BST1RPKHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmopLAogCiAJICAgIFRQX0FSR1Mob2JqKSwKIAogCSAgICBUUF9TVFJVQ1RfX2VudHJ5KAotCQkJICAgICBfX2ZpZWxkKHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqLCBvYmopCisJCQkgICAgIF9fZmllbGQoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKiwgb2JqKQogCQkJICAgICApLAogCiAJICAgIFRQX2Zhc3RfYXNzaWduKApAQCAtMTE3LDIxICs5OSwyMSBAQAogCiBERUZJTkVfRVZFTlQoaTkxNV9nZW1fb2JqZWN0LCBpOTE1X2dlbV9vYmplY3RfY2xmbHVzaCwKIAotCSAgICBUUF9QUk9UTyhzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iaiksCisJICAgIFRQX1BST1RPKHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmopLAogCiAJICAgIFRQX0FSR1Mob2JqKQogKTsKIAogREVGSU5FX0VWRU5UKGk5MTVfZ2VtX29iamVjdCwgaTkxNV9nZW1fb2JqZWN0X3VuYmluZCwKIAotCSAgICBUUF9QUk9UTyhzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iaiksCisJICAgIFRQX1BST1RPKHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmopLAogCiAJICAgIFRQX0FSR1Mob2JqKQogKTsKIAogREVGSU5FX0VWRU5UKGk5MTVfZ2VtX29iamVjdCwgaTkxNV9nZW1fb2JqZWN0X2Rlc3Ryb3ksCiAKLQkgICAgVFBfUFJPVE8oc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmopLAorCSAgICBUUF9QUk9UTyhzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqKSwKIAogCSAgICBUUF9BUkdTKG9iaikKICk7CkBAIC0yNjMsMTMgKzI0NSwxMyBAQAogKTsKIAogVFJBQ0VfRVZFTlQoaTkxNV9mbGlwX3JlcXVlc3QsCi0JICAgIFRQX1BST1RPKGludCBwbGFuZSwgc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmopLAorCSAgICBUUF9QUk9UTyhpbnQgcGxhbmUsIHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmopLAogCiAJICAgIFRQX0FSR1MocGxhbmUsIG9iaiksCiAKIAkgICAgVFBfU1RSVUNUX19lbnRyeSgKIAkJICAgIF9fZmllbGQoaW50LCBwbGFuZSkKLQkJICAgIF9fZmllbGQoc3RydWN0IGRybV9nZW1fb2JqZWN0ICosIG9iaikKKwkJICAgIF9fZmllbGQoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKiwgb2JqKQogCQkgICAgKSwKIAogCSAgICBUUF9mYXN0X2Fzc2lnbigKQEAgLTI4MSwxMyArMjYzLDEzIEBACiApOwogCiBUUkFDRV9FVkVOVChpOTE1X2ZsaXBfY29tcGxldGUsCi0JICAgIFRQX1BST1RPKGludCBwbGFuZSwgc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmopLAorCSAgICBUUF9QUk9UTyhpbnQgcGxhbmUsIHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmopLAogCiAJICAgIFRQX0FSR1MocGxhbmUsIG9iaiksCiAKIAkgICAgVFBfU1RSVUNUX19lbnRyeSgKIAkJICAgIF9fZmllbGQoaW50LCBwbGFuZSkKLQkJICAgIF9fZmllbGQoc3RydWN0IGRybV9nZW1fb2JqZWN0ICosIG9iaikKKwkJICAgIF9fZmllbGQoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKiwgb2JqKQogCQkgICAgKSwKIAogCSAgICBUUF9mYXN0X2Fzc2lnbigKQEAgLTI5OCw2ICsyODAsMjkgQEAKIAkgICAgVFBfcHJpbnRrKCJwbGFuZT0lZCwgb2JqPSVwIiwgX19lbnRyeS0+cGxhbmUsIF9fZW50cnktPm9iaikKICk7CiAKK1RSQUNFX0VWRU5UKGk5MTVfcmVnX3J3LAorICAgICAgICAgICBUUF9QUk9UTyhpbnQgY21kLCB1aW50MzJfdCByZWcsIHVpbnQ2NF90IHZhbCwgaW50IGxlbiksCisKKyAgICAgICAgICAgVFBfQVJHUyhjbWQsIHJlZywgdmFsLCBsZW4pLAorCisgICAgICAgICAgIFRQX1NUUlVDVF9fZW50cnkoCisgICAgICAgICAgICAgICAgICAgX19maWVsZChpbnQsIGNtZCkKKyAgICAgICAgICAgICAgICAgICBfX2ZpZWxkKHVpbnQzMl90LCByZWcpCisgICAgICAgICAgICAgICAgICAgX19maWVsZCh1aW50NjRfdCwgdmFsKQorICAgICAgICAgICAgICAgICAgIF9fZmllbGQoaW50LCBsZW4pCisgICAgICAgICAgICAgICAgICAgKSwKKworICAgICAgICAgICBUUF9mYXN0X2Fzc2lnbigKKyAgICAgICAgICAgICAgICAgICBfX2VudHJ5LT5jbWQgPSBjbWQ7CisgICAgICAgICAgICAgICAgICAgX19lbnRyeS0+cmVnID0gcmVnOworICAgICAgICAgICAgICAgICAgIF9fZW50cnktPnZhbCA9ICh1aW50NjRfdCl2YWw7CisgICAgICAgICAgICAgICAgICAgX19lbnRyeS0+bGVuID0gbGVuOworICAgICAgICAgICAgICAgICAgICksCisKKyAgICAgICAgICAgVFBfcHJpbnRrKCJjbWQ9JWMsIHJlZz0weCV4LCB2YWw9MHglbGx4LCBsZW49JWQiLAorICAgICAgICAgICAgICAgICAgICAgX19lbnRyeS0+Y21kLCBfX2VudHJ5LT5yZWcsIF9fZW50cnktPnZhbCwgX19lbnRyeS0+bGVuKQorKTsKKwogI2VuZGlmIC8qIF9JOTE1X1RSQUNFX0hfICovCiAKIC8qIFRoaXMgcGFydCBtdXN0IGJlIG91dHNpZGUgcHJvdGVjdGlvbiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZGlzcGxheS5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZGlzcGxheS5jCmluZGV4IGZjYTUyMzIuLjBhYmU3OWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2Rpc3BsYXkuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9kaXNwbGF5LmMKQEAgLTY0MiwyNiArNjQyLDIzIEBACiAgICAgICAgIC5maW5kX3BsbCA9IGludGVsX2ZpbmRfcGxsX2lyb25sYWtlX2RwLAogfTsKIAotc3RhdGljIGNvbnN0IGludGVsX2xpbWl0X3QgKmludGVsX2lyb25sYWtlX2xpbWl0KHN0cnVjdCBkcm1fY3J0YyAqY3J0YykKK3N0YXRpYyBjb25zdCBpbnRlbF9saW1pdF90ICppbnRlbF9pcm9ubGFrZV9saW1pdChzdHJ1Y3QgZHJtX2NydGMgKmNydGMsCisJCQkJCQlpbnQgcmVmY2xrKQogewogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjcnRjLT5kZXY7CiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAljb25zdCBpbnRlbF9saW1pdF90ICpsaW1pdDsKLQlpbnQgcmVmY2xrID0gMTIwOwogCiAJaWYgKGludGVsX3BpcGVfaGFzX3R5cGUoY3J0YywgSU5URUxfT1VUUFVUX0xWRFMpKSB7Ci0JCWlmIChkZXZfcHJpdi0+bHZkc191c2Vfc3NjICYmIGRldl9wcml2LT5sdmRzX3NzY19mcmVxID09IDEwMCkKLQkJCXJlZmNsayA9IDEwMDsKLQogCQlpZiAoKEk5MTVfUkVBRChQQ0hfTFZEUykgJiBMVkRTX0NMS0JfUE9XRVJfTUFTSykgPT0KIAkJICAgIExWRFNfQ0xLQl9QT1dFUl9VUCkgewogCQkJLyogTFZEUyBkdWFsIGNoYW5uZWwgKi8KLQkJCWlmIChyZWZjbGsgPT0gMTAwKQorCQkJaWYgKHJlZmNsayA9PSAxMDAwMDApCiAJCQkJbGltaXQgPSAmaW50ZWxfbGltaXRzX2lyb25sYWtlX2R1YWxfbHZkc18xMDBtOwogCQkJZWxzZQogCQkJCWxpbWl0ID0gJmludGVsX2xpbWl0c19pcm9ubGFrZV9kdWFsX2x2ZHM7CiAJCX0gZWxzZSB7Ci0JCQlpZiAocmVmY2xrID09IDEwMCkKKwkJCWlmIChyZWZjbGsgPT0gMTAwMDAwKQogCQkJCWxpbWl0ID0gJmludGVsX2xpbWl0c19pcm9ubGFrZV9zaW5nbGVfbHZkc18xMDBtOwogCQkJZWxzZQogCQkJCWxpbWl0ID0gJmludGVsX2xpbWl0c19pcm9ubGFrZV9zaW5nbGVfbHZkczsKQEAgLTcwMiwxMyArNjk5LDEzIEBACiAJcmV0dXJuIGxpbWl0OwogfQogCi1zdGF0aWMgY29uc3QgaW50ZWxfbGltaXRfdCAqaW50ZWxfbGltaXQoc3RydWN0IGRybV9jcnRjICpjcnRjKQorc3RhdGljIGNvbnN0IGludGVsX2xpbWl0X3QgKmludGVsX2xpbWl0KHN0cnVjdCBkcm1fY3J0YyAqY3J0YywgaW50IHJlZmNsaykKIHsKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY3J0Yy0+ZGV2OwogCWNvbnN0IGludGVsX2xpbWl0X3QgKmxpbWl0OwogCiAJaWYgKEhBU19QQ0hfU1BMSVQoZGV2KSkKLQkJbGltaXQgPSBpbnRlbF9pcm9ubGFrZV9saW1pdChjcnRjKTsKKwkJbGltaXQgPSBpbnRlbF9pcm9ubGFrZV9saW1pdChjcnRjLCByZWZjbGspOwogCWVsc2UgaWYgKElTX0c0WChkZXYpKSB7CiAJCWxpbWl0ID0gaW50ZWxfZzR4X2xpbWl0KGNydGMpOwogCX0gZWxzZSBpZiAoSVNfUElORVZJRVcoZGV2KSkgewpAQCAtNzczLDExICs3NzAsMTAgQEAKICAqIHRoZSBnaXZlbiBjb25uZWN0b3JzLgogICovCiAKLXN0YXRpYyBib29sIGludGVsX1BMTF9pc192YWxpZChzdHJ1Y3QgZHJtX2NydGMgKmNydGMsIGludGVsX2Nsb2NrX3QgKmNsb2NrKQorc3RhdGljIGJvb2wgaW50ZWxfUExMX2lzX3ZhbGlkKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCisJCQkgICAgICAgY29uc3QgaW50ZWxfbGltaXRfdCAqbGltaXQsCisJCQkgICAgICAgY29uc3QgaW50ZWxfY2xvY2tfdCAqY2xvY2spCiB7Ci0JY29uc3QgaW50ZWxfbGltaXRfdCAqbGltaXQgPSBpbnRlbF9saW1pdCAoY3J0Yyk7Ci0Jc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNydGMtPmRldjsKLQogCWlmIChjbG9jay0+cDEgIDwgbGltaXQtPnAxLm1pbiAgfHwgbGltaXQtPnAxLm1heCAgPCBjbG9jay0+cDEpCiAJCUlOVEVMUGxsSW52YWxpZCAoInAxIG91dCBvZiByYW5nZVxuIik7CiAJaWYgKGNsb2NrLT5wICAgPCBsaW1pdC0+cC5taW4gICB8fCBsaW1pdC0+cC5tYXggICA8IGNsb2NrLT5wKQpAQCAtODQ5LDggKzg0NSw4IEBACiAJCQkJCWludCB0aGlzX2VycjsKIAogCQkJCQlpbnRlbF9jbG9jayhkZXYsIHJlZmNsaywgJmNsb2NrKTsKLQotCQkJCQlpZiAoIWludGVsX1BMTF9pc192YWxpZChjcnRjLCAmY2xvY2spKQorCQkJCQlpZiAoIWludGVsX1BMTF9pc192YWxpZChkZXYsIGxpbWl0LAorCQkJCQkJCQkmY2xvY2spKQogCQkJCQkJY29udGludWU7CiAKIAkJCQkJdGhpc19lcnIgPSBhYnMoY2xvY2suZG90IC0gdGFyZ2V0KTsKQEAgLTkxMiw5ICs5MDgsMTEgQEAKIAkJCQkJaW50IHRoaXNfZXJyOwogCiAJCQkJCWludGVsX2Nsb2NrKGRldiwgcmVmY2xrLCAmY2xvY2spOwotCQkJCQlpZiAoIWludGVsX1BMTF9pc192YWxpZChjcnRjLCAmY2xvY2spKQorCQkJCQlpZiAoIWludGVsX1BMTF9pc192YWxpZChkZXYsIGxpbWl0LAorCQkJCQkJCQkmY2xvY2spKQogCQkJCQkJY29udGludWU7Ci0JCQkJCXRoaXNfZXJyID0gYWJzKGNsb2NrLmRvdCAtIHRhcmdldCkgOworCisJCQkJCXRoaXNfZXJyID0gYWJzKGNsb2NrLmRvdCAtIHRhcmdldCk7CiAJCQkJCWlmICh0aGlzX2VyciA8IGVycl9tb3N0KSB7CiAJCQkJCQkqYmVzdF9jbG9jayA9IGNsb2NrOwogCQkJCQkJZXJyX21vc3QgPSB0aGlzX2VycjsKQEAgLTEwNjYsMTMgKzEwNjQsMTMgQEAKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXN0cnVjdCBkcm1fZnJhbWVidWZmZXIgKmZiID0gY3J0Yy0+ZmI7CiAJc3RydWN0IGludGVsX2ZyYW1lYnVmZmVyICppbnRlbF9mYiA9IHRvX2ludGVsX2ZyYW1lYnVmZmVyKGZiKTsKLQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqX3ByaXYgPSB0b19pbnRlbF9ibyhpbnRlbF9mYi0+b2JqKTsKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqID0gaW50ZWxfZmItPm9iajsKIAlzdHJ1Y3QgaW50ZWxfY3J0YyAqaW50ZWxfY3J0YyA9IHRvX2ludGVsX2NydGMoY3J0Yyk7CiAJaW50IHBsYW5lLCBpOwogCXUzMiBmYmNfY3RsLCBmYmNfY3RsMjsKIAogCWlmIChmYi0+cGl0Y2ggPT0gZGV2X3ByaXYtPmNmYl9waXRjaCAmJgotCSAgICBvYmpfcHJpdi0+ZmVuY2VfcmVnID09IGRldl9wcml2LT5jZmJfZmVuY2UgJiYKKwkgICAgb2JqLT5mZW5jZV9yZWcgPT0gZGV2X3ByaXYtPmNmYl9mZW5jZSAmJgogCSAgICBpbnRlbF9jcnRjLT5wbGFuZSA9PSBkZXZfcHJpdi0+Y2ZiX3BsYW5lICYmCiAJICAgIEk5MTVfUkVBRChGQkNfQ09OVFJPTCkgJiBGQkNfQ1RMX0VOKQogCQlyZXR1cm47CkBAIC0xMDg2LDcgKzEwODQsNyBAQAogCiAJLyogRkJDX0NUTCB3YW50cyA2NEIgdW5pdHMgKi8KIAlkZXZfcHJpdi0+Y2ZiX3BpdGNoID0gKGRldl9wcml2LT5jZmJfcGl0Y2ggLyA2NCkgLSAxOwotCWRldl9wcml2LT5jZmJfZmVuY2UgPSBvYmpfcHJpdi0+ZmVuY2VfcmVnOworCWRldl9wcml2LT5jZmJfZmVuY2UgPSBvYmotPmZlbmNlX3JlZzsKIAlkZXZfcHJpdi0+Y2ZiX3BsYW5lID0gaW50ZWxfY3J0Yy0+cGxhbmU7CiAJcGxhbmUgPSBkZXZfcHJpdi0+Y2ZiX3BsYW5lID09IDAgPyBGQkNfQ1RMX1BMQU5FQSA6IEZCQ19DVExfUExBTkVCOwogCkBAIC0xMDk2LDcgKzEwOTQsNyBAQAogCiAJLyogU2V0IGl0IHVwLi4uICovCiAJZmJjX2N0bDIgPSBGQkNfQ1RMX0ZFTkNFX0RCTCB8IEZCQ19DVExfSURMRV9JTU0gfCBwbGFuZTsKLQlpZiAob2JqX3ByaXYtPnRpbGluZ19tb2RlICE9IEk5MTVfVElMSU5HX05PTkUpCisJaWYgKG9iai0+dGlsaW5nX21vZGUgIT0gSTkxNV9USUxJTkdfTk9ORSkKIAkJZmJjX2N0bDIgfD0gRkJDX0NUTF9DUFVfRkVOQ0U7CiAJSTkxNV9XUklURShGQkNfQ09OVFJPTDIsIGZiY19jdGwyKTsKIAlJOTE1X1dSSVRFKEZCQ19GRU5DRV9PRkYsIGNydGMtPnkpOwpAQCAtMTEwNyw3ICsxMTA1LDcgQEAKIAkJZmJjX2N0bCB8PSBGQkNfQ1RMX0MzX0lETEU7IC8qIDk0NSBuZWVkcyBzcGVjaWFsIFNSIGhhbmRsaW5nICovCiAJZmJjX2N0bCB8PSAoZGV2X3ByaXYtPmNmYl9waXRjaCAmIDB4ZmYpIDw8IEZCQ19DVExfU1RSSURFX1NISUZUOwogCWZiY19jdGwgfD0gKGludGVydmFsICYgMHgyZmZmKSA8PCBGQkNfQ1RMX0lOVEVSVkFMX1NISUZUOwotCWlmIChvYmpfcHJpdi0+dGlsaW5nX21vZGUgIT0gSTkxNV9USUxJTkdfTk9ORSkKKwlpZiAob2JqLT50aWxpbmdfbW9kZSAhPSBJOTE1X1RJTElOR19OT05FKQogCQlmYmNfY3RsIHw9IGRldl9wcml2LT5jZmJfZmVuY2U7CiAJSTkxNV9XUklURShGQkNfQ09OVFJPTCwgZmJjX2N0bCk7CiAKQEAgLTExNTAsNyArMTE0OCw3IEBACiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlzdHJ1Y3QgZHJtX2ZyYW1lYnVmZmVyICpmYiA9IGNydGMtPmZiOwogCXN0cnVjdCBpbnRlbF9mcmFtZWJ1ZmZlciAqaW50ZWxfZmIgPSB0b19pbnRlbF9mcmFtZWJ1ZmZlcihmYik7Ci0Jc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9ial9wcml2ID0gdG9faW50ZWxfYm8oaW50ZWxfZmItPm9iaik7CisJc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaiA9IGludGVsX2ZiLT5vYmo7CiAJc3RydWN0IGludGVsX2NydGMgKmludGVsX2NydGMgPSB0b19pbnRlbF9jcnRjKGNydGMpOwogCWludCBwbGFuZSA9IGludGVsX2NydGMtPnBsYW5lID09IDAgPyBEUEZDX0NUTF9QTEFORUEgOiBEUEZDX0NUTF9QTEFORUI7CiAJdW5zaWduZWQgbG9uZyBzdGFsbF93YXRlcm1hcmsgPSAyMDA7CkBAIC0xMTU5LDcgKzExNTcsNyBAQAogCWRwZmNfY3RsID0gSTkxNV9SRUFEKERQRkNfQ09OVFJPTCk7CiAJaWYgKGRwZmNfY3RsICYgRFBGQ19DVExfRU4pIHsKIAkJaWYgKGRldl9wcml2LT5jZmJfcGl0Y2ggPT0gZGV2X3ByaXYtPmNmYl9waXRjaCAvIDY0IC0gMSAmJgotCQkgICAgZGV2X3ByaXYtPmNmYl9mZW5jZSA9PSBvYmpfcHJpdi0+ZmVuY2VfcmVnICYmCisJCSAgICBkZXZfcHJpdi0+Y2ZiX2ZlbmNlID09IG9iai0+ZmVuY2VfcmVnICYmCiAJCSAgICBkZXZfcHJpdi0+Y2ZiX3BsYW5lID09IGludGVsX2NydGMtPnBsYW5lICYmCiAJCSAgICBkZXZfcHJpdi0+Y2ZiX3kgPT0gY3J0Yy0+eSkKIAkJCXJldHVybjsKQEAgLTExNzAsMTIgKzExNjgsMTIgQEAKIAl9CiAKIAlkZXZfcHJpdi0+Y2ZiX3BpdGNoID0gKGRldl9wcml2LT5jZmJfcGl0Y2ggLyA2NCkgLSAxOwotCWRldl9wcml2LT5jZmJfZmVuY2UgPSBvYmpfcHJpdi0+ZmVuY2VfcmVnOworCWRldl9wcml2LT5jZmJfZmVuY2UgPSBvYmotPmZlbmNlX3JlZzsKIAlkZXZfcHJpdi0+Y2ZiX3BsYW5lID0gaW50ZWxfY3J0Yy0+cGxhbmU7CiAJZGV2X3ByaXYtPmNmYl95ID0gY3J0Yy0+eTsKIAogCWRwZmNfY3RsID0gcGxhbmUgfCBEUEZDX1NSX0VOIHwgRFBGQ19DVExfTElNSVRfMVg7Ci0JaWYgKG9ial9wcml2LT50aWxpbmdfbW9kZSAhPSBJOTE1X1RJTElOR19OT05FKSB7CisJaWYgKG9iai0+dGlsaW5nX21vZGUgIT0gSTkxNV9USUxJTkdfTk9ORSkgewogCQlkcGZjX2N0bCB8PSBEUEZDX0NUTF9GRU5DRV9FTiB8IGRldl9wcml2LT5jZmJfZmVuY2U7CiAJCUk5MTVfV1JJVEUoRFBGQ19DSElDS0VOLCBEUEZDX0hUX01PRElGWSk7CiAJfSBlbHNlIHsKQEAgLTEyMjEsNyArMTIxOSw3IEBACiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlzdHJ1Y3QgZHJtX2ZyYW1lYnVmZmVyICpmYiA9IGNydGMtPmZiOwogCXN0cnVjdCBpbnRlbF9mcmFtZWJ1ZmZlciAqaW50ZWxfZmIgPSB0b19pbnRlbF9mcmFtZWJ1ZmZlcihmYik7Ci0Jc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9ial9wcml2ID0gdG9faW50ZWxfYm8oaW50ZWxfZmItPm9iaik7CisJc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaiA9IGludGVsX2ZiLT5vYmo7CiAJc3RydWN0IGludGVsX2NydGMgKmludGVsX2NydGMgPSB0b19pbnRlbF9jcnRjKGNydGMpOwogCWludCBwbGFuZSA9IGludGVsX2NydGMtPnBsYW5lID09IDAgPyBEUEZDX0NUTF9QTEFORUEgOiBEUEZDX0NUTF9QTEFORUI7CiAJdW5zaWduZWQgbG9uZyBzdGFsbF93YXRlcm1hcmsgPSAyMDA7CkBAIC0xMjMwLDkgKzEyMjgsOSBAQAogCWRwZmNfY3RsID0gSTkxNV9SRUFEKElMS19EUEZDX0NPTlRST0wpOwogCWlmIChkcGZjX2N0bCAmIERQRkNfQ1RMX0VOKSB7CiAJCWlmIChkZXZfcHJpdi0+Y2ZiX3BpdGNoID09IGRldl9wcml2LT5jZmJfcGl0Y2ggLyA2NCAtIDEgJiYKLQkJICAgIGRldl9wcml2LT5jZmJfZmVuY2UgPT0gb2JqX3ByaXYtPmZlbmNlX3JlZyAmJgorCQkgICAgZGV2X3ByaXYtPmNmYl9mZW5jZSA9PSBvYmotPmZlbmNlX3JlZyAmJgogCQkgICAgZGV2X3ByaXYtPmNmYl9wbGFuZSA9PSBpbnRlbF9jcnRjLT5wbGFuZSAmJgotCQkgICAgZGV2X3ByaXYtPmNmYl9vZmZzZXQgPT0gb2JqX3ByaXYtPmd0dF9vZmZzZXQgJiYKKwkJICAgIGRldl9wcml2LT5jZmJfb2Zmc2V0ID09IG9iai0+Z3R0X29mZnNldCAmJgogCQkgICAgZGV2X3ByaXYtPmNmYl95ID09IGNydGMtPnkpCiAJCQlyZXR1cm47CiAKQEAgLTEyNDIsMTQgKzEyNDAsMTQgQEAKIAl9CiAKIAlkZXZfcHJpdi0+Y2ZiX3BpdGNoID0gKGRldl9wcml2LT5jZmJfcGl0Y2ggLyA2NCkgLSAxOwotCWRldl9wcml2LT5jZmJfZmVuY2UgPSBvYmpfcHJpdi0+ZmVuY2VfcmVnOworCWRldl9wcml2LT5jZmJfZmVuY2UgPSBvYmotPmZlbmNlX3JlZzsKIAlkZXZfcHJpdi0+Y2ZiX3BsYW5lID0gaW50ZWxfY3J0Yy0+cGxhbmU7Ci0JZGV2X3ByaXYtPmNmYl9vZmZzZXQgPSBvYmpfcHJpdi0+Z3R0X29mZnNldDsKKwlkZXZfcHJpdi0+Y2ZiX29mZnNldCA9IG9iai0+Z3R0X29mZnNldDsKIAlkZXZfcHJpdi0+Y2ZiX3kgPSBjcnRjLT55OwogCiAJZHBmY19jdGwgJj0gRFBGQ19SRVNFUlZFRDsKIAlkcGZjX2N0bCB8PSAocGxhbmUgfCBEUEZDX0NUTF9MSU1JVF8xWCk7Ci0JaWYgKG9ial9wcml2LT50aWxpbmdfbW9kZSAhPSBJOTE1X1RJTElOR19OT05FKSB7CisJaWYgKG9iai0+dGlsaW5nX21vZGUgIT0gSTkxNV9USUxJTkdfTk9ORSkgewogCQlkcGZjX2N0bCB8PSAoRFBGQ19DVExfRkVOQ0VfRU4gfCBkZXZfcHJpdi0+Y2ZiX2ZlbmNlKTsKIAkJSTkxNV9XUklURShJTEtfRFBGQ19DSElDS0VOLCBEUEZDX0hUX01PRElGWSk7CiAJfSBlbHNlIHsKQEAgLTEyNjAsMTAgKzEyNTgsMTYgQEAKIAkJICAgKHN0YWxsX3dhdGVybWFyayA8PCBEUEZDX1JFQ09NUF9TVEFMTF9XTV9TSElGVCkgfAogCQkgICAoaW50ZXJ2YWwgPDwgRFBGQ19SRUNPTVBfVElNRVJfQ09VTlRfU0hJRlQpKTsKIAlJOTE1X1dSSVRFKElMS19EUEZDX0ZFTkNFX1lPRkYsIGNydGMtPnkpOwotCUk5MTVfV1JJVEUoSUxLX0ZCQ19SVF9CQVNFLCBvYmpfcHJpdi0+Z3R0X29mZnNldCB8IElMS19GQkNfUlRfVkFMSUQpOworCUk5MTVfV1JJVEUoSUxLX0ZCQ19SVF9CQVNFLCBvYmotPmd0dF9vZmZzZXQgfCBJTEtfRkJDX1JUX1ZBTElEKTsKIAkvKiBlbmFibGUgaXQuLi4gKi8KIAlJOTE1X1dSSVRFKElMS19EUEZDX0NPTlRST0wsIGRwZmNfY3RsIHwgRFBGQ19DVExfRU4pOwogCisJaWYgKElTX0dFTjYoZGV2KSkgeworCQlJOTE1X1dSSVRFKFNOQl9EUEZDX0NUTF9TQSwKKwkJCSAgIFNOQl9DUFVfRkVOQ0VfRU5BQkxFIHwgZGV2X3ByaXYtPmNmYl9mZW5jZSk7CisJCUk5MTVfV1JJVEUoRFBGQ19DUFVfRkVOQ0VfT0ZGU0VULCBjcnRjLT55KTsKKwl9CisKIAlEUk1fREVCVUdfS01TKCJlbmFibGVkIGZiYyBvbiBwbGFuZSAlZFxuIiwgaW50ZWxfY3J0Yy0+cGxhbmUpOwogfQogCkBAIC0xMzQ1LDcgKzEzNDksNyBAQAogCXN0cnVjdCBpbnRlbF9jcnRjICppbnRlbF9jcnRjOwogCXN0cnVjdCBkcm1fZnJhbWVidWZmZXIgKmZiOwogCXN0cnVjdCBpbnRlbF9mcmFtZWJ1ZmZlciAqaW50ZWxfZmI7Ci0Jc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9ial9wcml2OworCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmo7CiAKIAlEUk1fREVCVUdfS01TKCJcbiIpOwogCkBAIC0xMzg0LDkgKzEzODgsOSBAQAogCWludGVsX2NydGMgPSB0b19pbnRlbF9jcnRjKGNydGMpOwogCWZiID0gY3J0Yy0+ZmI7CiAJaW50ZWxfZmIgPSB0b19pbnRlbF9mcmFtZWJ1ZmZlcihmYik7Ci0Jb2JqX3ByaXYgPSB0b19pbnRlbF9ibyhpbnRlbF9mYi0+b2JqKTsKKwlvYmogPSBpbnRlbF9mYi0+b2JqOwogCi0JaWYgKGludGVsX2ZiLT5vYmotPnNpemUgPiBkZXZfcHJpdi0+Y2ZiX3NpemUpIHsKKwlpZiAoaW50ZWxfZmItPm9iai0+YmFzZS5zaXplID4gZGV2X3ByaXYtPmNmYl9zaXplKSB7CiAJCURSTV9ERUJVR19LTVMoImZyYW1lYnVmZmVyIHRvbyBsYXJnZSwgZGlzYWJsaW5nICIKIAkJCSAgICAgICJjb21wcmVzc2lvblxuIik7CiAJCWRldl9wcml2LT5ub19mYmNfcmVhc29uID0gRkJDX1NUT0xFTl9UT09fU01BTEw7CkBAIC0xNDEwLDcgKzE0MTQsNyBAQAogCQlkZXZfcHJpdi0+bm9fZmJjX3JlYXNvbiA9IEZCQ19CQURfUExBTkU7CiAJCWdvdG8gb3V0X2Rpc2FibGU7CiAJfQotCWlmIChvYmpfcHJpdi0+dGlsaW5nX21vZGUgIT0gSTkxNV9USUxJTkdfWCkgeworCWlmIChvYmotPnRpbGluZ19tb2RlICE9IEk5MTVfVElMSU5HX1gpIHsKIAkJRFJNX0RFQlVHX0tNUygiZnJhbWVidWZmZXIgbm90IHRpbGVkLCBkaXNhYmxpbmcgY29tcHJlc3Npb25cbiIpOwogCQlkZXZfcHJpdi0+bm9fZmJjX3JlYXNvbiA9IEZCQ19OT1RfVElMRUQ7CiAJCWdvdG8gb3V0X2Rpc2FibGU7CkBAIC0xNDMzLDE0ICsxNDM3LDEzIEBACiAKIGludAogaW50ZWxfcGluX2FuZF9mZW5jZV9mYl9vYmooc3RydWN0IGRybV9kZXZpY2UgKmRldiwKLQkJCSAgIHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqLAotCQkJICAgYm9vbCBwaXBlbGluZWQpCisJCQkgICBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqLAorCQkJICAgc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpwaXBlbGluZWQpCiB7Ci0Jc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9ial9wcml2ID0gdG9faW50ZWxfYm8ob2JqKTsKIAl1MzIgYWxpZ25tZW50OwogCWludCByZXQ7CiAKLQlzd2l0Y2ggKG9ial9wcml2LT50aWxpbmdfbW9kZSkgeworCXN3aXRjaCAob2JqLT50aWxpbmdfbW9kZSkgewogCWNhc2UgSTkxNV9USUxJTkdfTk9ORToKIAkJaWYgKElTX0JST0FEV0FURVIoZGV2KSB8fCBJU19DUkVTVExJTkUoZGV2KSkKIAkJCWFsaWdubWVudCA9IDEyOCAqIDEwMjQ7CkBAIC0xNDYxLDcgKzE0NjQsNyBAQAogCQlCVUcoKTsKIAl9CiAKLQlyZXQgPSBpOTE1X2dlbV9vYmplY3RfcGluKG9iaiwgYWxpZ25tZW50KTsKKwlyZXQgPSBpOTE1X2dlbV9vYmplY3RfcGluKG9iaiwgYWxpZ25tZW50LCB0cnVlKTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCkBAIC0xNDc0LDkgKzE0NzcsOCBAQAogCSAqIGZyYW1lYnVmZmVyIGNvbXByZXNzaW9uLiAgRm9yIHNpbXBsaWNpdHksIHdlIGFsd2F5cyBpbnN0YWxsCiAJICogYSBmZW5jZSBhcyB0aGUgY29zdCBpcyBub3QgdGhhdCBvbmVyb3VzLgogCSAqLwotCWlmIChvYmpfcHJpdi0+ZmVuY2VfcmVnID09IEk5MTVfRkVOQ0VfUkVHX05PTkUgJiYKLQkgICAgb2JqX3ByaXYtPnRpbGluZ19tb2RlICE9IEk5MTVfVElMSU5HX05PTkUpIHsKLQkJcmV0ID0gaTkxNV9nZW1fb2JqZWN0X2dldF9mZW5jZV9yZWcob2JqLCBmYWxzZSk7CisJaWYgKG9iai0+dGlsaW5nX21vZGUgIT0gSTkxNV9USUxJTkdfTk9ORSkgeworCQlyZXQgPSBpOTE1X2dlbV9vYmplY3RfZ2V0X2ZlbmNlKG9iaiwgcGlwZWxpbmVkLCBmYWxzZSk7CiAJCWlmIChyZXQpCiAJCQlnb3RvIGVycl91bnBpbjsKIAl9CkBAIC0xNDk3LDggKzE0OTksNyBAQAogCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJc3RydWN0IGludGVsX2NydGMgKmludGVsX2NydGMgPSB0b19pbnRlbF9jcnRjKGNydGMpOwogCXN0cnVjdCBpbnRlbF9mcmFtZWJ1ZmZlciAqaW50ZWxfZmI7Ci0Jc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9ial9wcml2OwotCXN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqOworCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmo7CiAJaW50IHBsYW5lID0gaW50ZWxfY3J0Yy0+cGxhbmU7CiAJdW5zaWduZWQgbG9uZyBTdGFydCwgT2Zmc2V0OwogCXUzMiBkc3BjbnRyOwpAQCAtMTUxNSw3ICsxNTE2LDYgQEAKIAogCWludGVsX2ZiID0gdG9faW50ZWxfZnJhbWVidWZmZXIoZmIpOwogCW9iaiA9IGludGVsX2ZiLT5vYmo7Ci0Jb2JqX3ByaXYgPSB0b19pbnRlbF9ibyhvYmopOwogCiAJcmVnID0gRFNQQ05UUihwbGFuZSk7CiAJZHNwY250ciA9IEk5MTVfUkVBRChyZWcpOwpAQCAtMTU0MCw3ICsxNTQwLDcgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCWlmIChJTlRFTF9JTkZPKGRldiktPmdlbiA+PSA0KSB7Ci0JCWlmIChvYmpfcHJpdi0+dGlsaW5nX21vZGUgIT0gSTkxNV9USUxJTkdfTk9ORSkKKwkJaWYgKG9iai0+dGlsaW5nX21vZGUgIT0gSTkxNV9USUxJTkdfTk9ORSkKIAkJCWRzcGNudHIgfD0gRElTUFBMQU5FX1RJTEVEOwogCQllbHNlCiAJCQlkc3BjbnRyICY9IH5ESVNQUExBTkVfVElMRUQ7CkBAIC0xNTUyLDcgKzE1NTIsNyBAQAogCiAJSTkxNV9XUklURShyZWcsIGRzcGNudHIpOwogCi0JU3RhcnQgPSBvYmpfcHJpdi0+Z3R0X29mZnNldDsKKwlTdGFydCA9IG9iai0+Z3R0X29mZnNldDsKIAlPZmZzZXQgPSB5ICogZmItPnBpdGNoICsgeCAqIChmYi0+Yml0c19wZXJfcGl4ZWwgLyA4KTsKIAogCURSTV9ERUJVR19LTVMoIldyaXRpbmcgYmFzZSAlMDhsWCAlMDhsWCAlZCAlZCAlZFxuIiwKQEAgLTE1OTgsNyArMTU5OCw3IEBACiAJbXV0ZXhfbG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwogCXJldCA9IGludGVsX3Bpbl9hbmRfZmVuY2VfZmJfb2JqKGRldiwKIAkJCQkJIHRvX2ludGVsX2ZyYW1lYnVmZmVyKGNydGMtPmZiKS0+b2JqLAotCQkJCQkgZmFsc2UpOworCQkJCQkgTlVMTCk7CiAJaWYgKHJldCAhPSAwKSB7CiAJCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwogCQlyZXR1cm4gcmV0OwpAQCAtMTYwNiwxOCArMTYwNiwxNyBAQAogCiAJaWYgKG9sZF9mYikgewogCQlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCQlzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iaiA9IHRvX2ludGVsX2ZyYW1lYnVmZmVyKG9sZF9mYiktPm9iajsKLQkJc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9ial9wcml2ID0gdG9faW50ZWxfYm8ob2JqKTsKKwkJc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaiA9IHRvX2ludGVsX2ZyYW1lYnVmZmVyKG9sZF9mYiktPm9iajsKIAogCQl3YWl0X2V2ZW50KGRldl9wcml2LT5wZW5kaW5nX2ZsaXBfcXVldWUsCi0JCQkgICBhdG9taWNfcmVhZCgmb2JqX3ByaXYtPnBlbmRpbmdfZmxpcCkgPT0gMCk7CisJCQkgICBhdG9taWNfcmVhZCgmb2JqLT5wZW5kaW5nX2ZsaXApID09IDApOwogCiAJCS8qIEJpZyBIYW1tZXIsIHdlIGFsc28gbmVlZCB0byBlbnN1cmUgdGhhdCBhbnkgcGVuZGluZwogCQkgKiBNSV9XQUlUX0ZPUl9FVkVOVCBpbnNpZGUgYSB1c2VyIGJhdGNoIGJ1ZmZlciBvbiB0aGUKIAkJICogY3VycmVudCBzY2Fub3V0IGlzIHJldGlyZWQgYmVmb3JlIHVucGlubmluZyB0aGUgb2xkCiAJCSAqIGZyYW1lYnVmZmVyLgogCQkgKi8KLQkJcmV0ID0gaTkxNV9nZW1fb2JqZWN0X2ZsdXNoX2dwdShvYmpfcHJpdiwgZmFsc2UpOworCQlyZXQgPSBpOTE1X2dlbV9vYmplY3RfZmx1c2hfZ3B1KG9iaiwgZmFsc2UpOwogCQlpZiAocmV0KSB7CiAJCQlpOTE1X2dlbV9vYmplY3RfdW5waW4odG9faW50ZWxfZnJhbWVidWZmZXIoY3J0Yy0+ZmIpLT5vYmopOwogCQkJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CkBAIC0xNjMzLDggKzE2MzIsMTAgQEAKIAkJcmV0dXJuIHJldDsKIAl9CiAKLQlpZiAob2xkX2ZiKQorCWlmIChvbGRfZmIpIHsKKwkJaW50ZWxfd2FpdF9mb3JfdmJsYW5rKGRldiwgaW50ZWxfY3J0Yy0+cGlwZSk7CiAJCWk5MTVfZ2VtX29iamVjdF91bnBpbih0b19pbnRlbF9mcmFtZWJ1ZmZlcihvbGRfZmIpLT5vYmopOworCX0KIAogCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwogCkBAIC0xOTk2LDMxICsxOTk3LDMxIEBACiBzdGF0aWMgdm9pZCBpbnRlbF9jbGVhcl9zY2FubGluZV93YWl0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmc7CiAJdTMyIHRtcDsKIAogCWlmIChJU19HRU4yKGRldikpCiAJCS8qIENhbid0IGJyZWFrIHRoZSBoYW5nIG9uIGk4eHggKi8KIAkJcmV0dXJuOwogCi0JdG1wID0gSTkxNV9SRUFEKFBSQjBfQ1RMKTsKLQlpZiAodG1wICYgUklOR19XQUlUKSB7Ci0JCUk5MTVfV1JJVEUoUFJCMF9DVEwsIHRtcCk7Ci0JCVBPU1RJTkdfUkVBRChQUkIwX0NUTCk7Ci0JfQorCXJpbmcgPSBMUF9SSU5HKGRldl9wcml2KTsKKwl0bXAgPSBJOTE1X1JFQURfQ1RMKHJpbmcpOworCWlmICh0bXAgJiBSSU5HX1dBSVQpCisJCUk5MTVfV1JJVEVfQ1RMKHJpbmcsIHRtcCk7CiB9CiAKIHN0YXRpYyB2b2lkIGludGVsX2NydGNfd2FpdF9mb3JfcGVuZGluZ19mbGlwcyhzdHJ1Y3QgZHJtX2NydGMgKmNydGMpCiB7Ci0Jc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9ial9wcml2OworCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmo7CiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2OwogCiAJaWYgKGNydGMtPmZiID09IE5VTEwpCiAJCXJldHVybjsKIAotCW9ial9wcml2ID0gdG9faW50ZWxfYm8odG9faW50ZWxfZnJhbWVidWZmZXIoY3J0Yy0+ZmIpLT5vYmopOworCW9iaiA9IHRvX2ludGVsX2ZyYW1lYnVmZmVyKGNydGMtPmZiKS0+b2JqOwogCWRldl9wcml2ID0gY3J0Yy0+ZGV2LT5kZXZfcHJpdmF0ZTsKIAl3YWl0X2V2ZW50KGRldl9wcml2LT5wZW5kaW5nX2ZsaXBfcXVldWUsCi0JCSAgIGF0b21pY19yZWFkKCZvYmpfcHJpdi0+cGVuZGluZ19mbGlwKSA9PSAwKTsKKwkJICAgYXRvbWljX3JlYWQoJm9iai0+cGVuZGluZ19mbGlwKSA9PSAwKTsKIH0KIAogc3RhdGljIHZvaWQgaXJvbmxha2VfY3J0Y19lbmFibGUoc3RydWN0IGRybV9jcnRjICpjcnRjKQpAQCAtMjg1MCw2ICsyODUxLDM5IEBACiAJSUxLX0ZJRk9fTElORV9TSVpFCiB9OwogCitzdGF0aWMgc3RydWN0IGludGVsX3dhdGVybWFya19wYXJhbXMgc2FuZHlicmlkZ2VfZGlzcGxheV93bV9pbmZvID0geworCVNOQl9ESVNQTEFZX0ZJRk8sCisJU05CX0RJU1BMQVlfTUFYV00sCisJU05CX0RJU1BMQVlfREZUV00sCisJMiwKKwlTTkJfRklGT19MSU5FX1NJWkUKK307CisKK3N0YXRpYyBzdHJ1Y3QgaW50ZWxfd2F0ZXJtYXJrX3BhcmFtcyBzYW5keWJyaWRnZV9jdXJzb3Jfd21faW5mbyA9IHsKKwlTTkJfQ1VSU09SX0ZJRk8sCisJU05CX0NVUlNPUl9NQVhXTSwKKwlTTkJfQ1VSU09SX0RGVFdNLAorCTIsCisJU05CX0ZJRk9fTElORV9TSVpFCit9OworCitzdGF0aWMgc3RydWN0IGludGVsX3dhdGVybWFya19wYXJhbXMgc2FuZHlicmlkZ2VfZGlzcGxheV9zcndtX2luZm8gPSB7CisJU05CX0RJU1BMQVlfU1JfRklGTywKKwlTTkJfRElTUExBWV9NQVhfU1JXTSwKKwlTTkJfRElTUExBWV9ERlRfU1JXTSwKKwkyLAorCVNOQl9GSUZPX0xJTkVfU0laRQorfTsKKworc3RhdGljIHN0cnVjdCBpbnRlbF93YXRlcm1hcmtfcGFyYW1zIHNhbmR5YnJpZGdlX2N1cnNvcl9zcndtX2luZm8gPSB7CisJU05CX0NVUlNPUl9TUl9GSUZPLAorCVNOQl9DVVJTT1JfTUFYX1NSV00sCisJU05CX0NVUlNPUl9ERlRfU1JXTSwKKwkyLAorCVNOQl9GSUZPX0xJTkVfU0laRQorfTsKKworCiAvKioKICAqIGludGVsX2NhbGN1bGF0ZV93bSAtIGNhbGN1bGF0ZSB3YXRlcm1hcmsgbGV2ZWwKICAqIEBjbG9ja19pbl9raHo6IHBpeGVsIGNsb2NrCkBAIC0zMzgzLDYgKzM0MTcsMTAgQEAKIAogc3RhdGljIGJvb2wgaXJvbmxha2VfY29tcHV0ZV93bTAoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKIAkJCQkgaW50IHBpcGUsCisJCQkJIGNvbnN0IHN0cnVjdCBpbnRlbF93YXRlcm1hcmtfcGFyYW1zICpkaXNwbGF5LAorCQkJCSBpbnQgZGlzcGxheV9sYXRlbmN5LAorCQkJCSBjb25zdCBzdHJ1Y3QgaW50ZWxfd2F0ZXJtYXJrX3BhcmFtcyAqY3Vyc29yLAorCQkJCSBpbnQgY3Vyc29yX2xhdGVuY3ksCiAJCQkJIGludCAqcGxhbmVfd20sCiAJCQkJIGludCAqY3Vyc29yX3dtKQogewpAQCAtMzQwMCwyMiArMzQzOCwyMCBAQAogCXBpeGVsX3NpemUgPSBjcnRjLT5mYi0+Yml0c19wZXJfcGl4ZWwgLyA4OwogCiAJLyogVXNlIHRoZSBzbWFsbCBidWZmZXIgbWV0aG9kIHRvIGNhbGN1bGF0ZSBwbGFuZSB3YXRlcm1hcmsgKi8KLQllbnRyaWVzID0gKChjbG9jayAqIHBpeGVsX3NpemUgLyAxMDAwKSAqIElMS19MUDBfUExBTkVfTEFURU5DWSkgLyAxMDAwOwotCWVudHJpZXMgPSBESVZfUk9VTkRfVVAoZW50cmllcywKLQkJCSAgICAgICBpcm9ubGFrZV9kaXNwbGF5X3dtX2luZm8uY2FjaGVsaW5lX3NpemUpOwotCSpwbGFuZV93bSA9IGVudHJpZXMgKyBpcm9ubGFrZV9kaXNwbGF5X3dtX2luZm8uZ3VhcmRfc2l6ZTsKLQlpZiAoKnBsYW5lX3dtID4gKGludClpcm9ubGFrZV9kaXNwbGF5X3dtX2luZm8ubWF4X3dtKQotCQkqcGxhbmVfd20gPSBpcm9ubGFrZV9kaXNwbGF5X3dtX2luZm8ubWF4X3dtOworCWVudHJpZXMgPSAoKGNsb2NrICogcGl4ZWxfc2l6ZSAvIDEwMDApICogZGlzcGxheV9sYXRlbmN5ICogMTAwKSAvIDEwMDA7CisJZW50cmllcyA9IERJVl9ST1VORF9VUChlbnRyaWVzLCBkaXNwbGF5LT5jYWNoZWxpbmVfc2l6ZSk7CisJKnBsYW5lX3dtID0gZW50cmllcyArIGRpc3BsYXktPmd1YXJkX3NpemU7CisJaWYgKCpwbGFuZV93bSA+IChpbnQpZGlzcGxheS0+bWF4X3dtKQorCQkqcGxhbmVfd20gPSBkaXNwbGF5LT5tYXhfd207CiAKIAkvKiBVc2UgdGhlIGxhcmdlIGJ1ZmZlciBtZXRob2QgdG8gY2FsY3VsYXRlIGN1cnNvciB3YXRlcm1hcmsgKi8KIAlsaW5lX3RpbWVfdXMgPSAoKGh0b3RhbCAqIDEwMDApIC8gY2xvY2spOwotCWxpbmVfY291bnQgPSAoSUxLX0xQMF9DVVJTT1JfTEFURU5DWSAvIGxpbmVfdGltZV91cyArIDEwMDApIC8gMTAwMDsKKwlsaW5lX2NvdW50ID0gKGN1cnNvcl9sYXRlbmN5ICogMTAwIC8gbGluZV90aW1lX3VzICsgMTAwMCkgLyAxMDAwOwogCWVudHJpZXMgPSBsaW5lX2NvdW50ICogNjQgKiBwaXhlbF9zaXplOwotCWVudHJpZXMgPSBESVZfUk9VTkRfVVAoZW50cmllcywKLQkJCSAgICAgICBpcm9ubGFrZV9jdXJzb3Jfd21faW5mby5jYWNoZWxpbmVfc2l6ZSk7Ci0JKmN1cnNvcl93bSA9IGVudHJpZXMgKyBpcm9ubGFrZV9jdXJzb3Jfd21faW5mby5ndWFyZF9zaXplOwotCWlmICgqY3Vyc29yX3dtID4gaXJvbmxha2VfY3Vyc29yX3dtX2luZm8ubWF4X3dtKQotCQkqY3Vyc29yX3dtID0gaXJvbmxha2VfY3Vyc29yX3dtX2luZm8ubWF4X3dtOworCWVudHJpZXMgPSBESVZfUk9VTkRfVVAoZW50cmllcywgY3Vyc29yLT5jYWNoZWxpbmVfc2l6ZSk7CisJKmN1cnNvcl93bSA9IGVudHJpZXMgKyBjdXJzb3ItPmd1YXJkX3NpemU7CisJaWYgKCpjdXJzb3Jfd20gPiAoaW50KWN1cnNvci0+bWF4X3dtKQorCQkqY3Vyc29yX3dtID0gKGludCljdXJzb3ItPm1heF93bTsKIAogCXJldHVybiB0cnVlOwogfQpAQCAtMzQzMCw3ICszNDY2LDEyIEBACiAJaW50IHRtcDsKIAogCWVuYWJsZWQgPSAwOwotCWlmIChpcm9ubGFrZV9jb21wdXRlX3dtMChkZXYsIDAsICZwbGFuZV93bSwgJmN1cnNvcl93bSkpIHsKKwlpZiAoaXJvbmxha2VfY29tcHV0ZV93bTAoZGV2LCAwLAorCQkJCSAmaXJvbmxha2VfZGlzcGxheV93bV9pbmZvLAorCQkJCSBJTEtfTFAwX1BMQU5FX0xBVEVOQ1ksCisJCQkJICZpcm9ubGFrZV9jdXJzb3Jfd21faW5mbywKKwkJCQkgSUxLX0xQMF9DVVJTT1JfTEFURU5DWSwKKwkJCQkgJnBsYW5lX3dtLCAmY3Vyc29yX3dtKSkgewogCQlJOTE1X1dSSVRFKFdNMF9QSVBFQV9JTEssCiAJCQkgICAocGxhbmVfd20gPDwgV00wX1BJUEVfUExBTkVfU0hJRlQpIHwgY3Vyc29yX3dtKTsKIAkJRFJNX0RFQlVHX0tNUygiRklGTyB3YXRlcm1hcmtzIEZvciBwaXBlIEEgLSIKQEAgLTM0MzksNyArMzQ4MCwxMiBAQAogCQllbmFibGVkKys7CiAJfQogCi0JaWYgKGlyb25sYWtlX2NvbXB1dGVfd20wKGRldiwgMSwgJnBsYW5lX3dtLCAmY3Vyc29yX3dtKSkgeworCWlmIChpcm9ubGFrZV9jb21wdXRlX3dtMChkZXYsIDEsCisJCQkJICZpcm9ubGFrZV9kaXNwbGF5X3dtX2luZm8sCisJCQkJIElMS19MUDBfUExBTkVfTEFURU5DWSwKKwkJCQkgJmlyb25sYWtlX2N1cnNvcl93bV9pbmZvLAorCQkJCSBJTEtfTFAwX0NVUlNPUl9MQVRFTkNZLAorCQkJCSAmcGxhbmVfd20sICZjdXJzb3Jfd20pKSB7CiAJCUk5MTVfV1JJVEUoV00wX1BJUEVCX0lMSywKIAkJCSAgIChwbGFuZV93bSA8PCBXTTBfUElQRV9QTEFORV9TSElGVCkgfCBjdXJzb3Jfd20pOwogCQlEUk1fREVCVUdfS01TKCJGSUZPIHdhdGVybWFya3MgRm9yIHBpcGUgQiAtIgpAQCAtMzQ1Myw3ICszNDk5LDcgQEAKIAkgKiBkaXNwbGF5IHBsYW5lIGlzIHVzZWQuCiAJICovCiAJdG1wID0gMDsKLQlpZiAoZW5hYmxlZCA9PSAxICYmIC8qIFhYWCBkaXNhYmxlZCBkdWUgdG8gYnVnZ3kgaW1wbG1lbnRhdGlvbj8gKi8gMCkgeworCWlmIChlbmFibGVkID09IDEpIHsKIAkJdW5zaWduZWQgbG9uZyBsaW5lX3RpbWVfdXM7CiAJCWludCBzbWFsbCwgbGFyZ2UsIHBsYW5lX2ZiYzsKIAkJaW50IHNyX2Nsb2NrLCBlbnRyaWVzOwpAQCAtMzUwNSw2ICszNTUxLDE5NyBAQAogCS8qIFhYWCBzZXR1cCBXTTIgYW5kIFdNMyAqLwogfQogCisvKgorICogQ2hlY2sgdGhlIHdtIHJlc3VsdC4KKyAqCisgKiBJZiBhbnkgY2FsY3VsYXRlZCB3YXRlcm1hcmsgdmFsdWVzIGlzIGxhcmdlciB0aGFuIHRoZSBtYXhpbXVtIHZhbHVlIHRoYXQKKyAqIGNhbiBiZSBwcm9ncmFtbWVkIGludG8gdGhlIGFzc29jaWF0ZWQgd2F0ZXJtYXJrIHJlZ2lzdGVyLCB0aGF0IHdhdGVybWFyaworICogbXVzdCBiZSBkaXNhYmxlZC4KKyAqCisgKiBBbHNvIHJldHVybiB0cnVlIGlmIGFsbCBvZiB0aG9zZSB3YXRlcm1hcmsgdmFsdWVzIGlzIDAsIHdoaWNoIGlzIHNldCBieQorICogc2FuZHlicmlkZ2VfY29tcHV0ZV9zcndtLCB0byBpbmRpY2F0ZSB0aGUgbGF0ZW5jeSBpcyBaRVJPLgorICovCitzdGF0aWMgYm9vbCBzYW5keWJyaWRnZV9jaGVja19zcndtKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBsZXZlbCwKKwkJCQkgICBpbnQgZmJjX3dtLCBpbnQgZGlzcGxheV93bSwgaW50IGN1cnNvcl93bSkKK3sKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCisJRFJNX0RFQlVHX0tNUygid2F0ZXJtYXJrICVkOiBkaXNwbGF5IHBsYW5lICVkLCBmYmMgbGluZXMgJWQsIgorCQkgICAgICAiIGN1cnNvciAlZFxuIiwgbGV2ZWwsIGRpc3BsYXlfd20sIGZiY193bSwgY3Vyc29yX3dtKTsKKworCWlmIChmYmNfd20gPiBTTkJfRkJDX01BWF9TUldNKSB7CisJCURSTV9ERUJVR19LTVMoImZiYyB3YXRlcm1hcmsoJWQpIGlzIHRvbyBsYXJnZSglZCksIGRpc2FibGluZyB3bSVkK1xuIiwKKwkJCQlmYmNfd20sIFNOQl9GQkNfTUFYX1NSV00sIGxldmVsKTsKKworCQkvKiBmYmMgaGFzIGl0J3Mgb3duIHdheSB0byBkaXNhYmxlIEZCQyBXTSAqLworCQlJOTE1X1dSSVRFKERJU1BfQVJCX0NUTCwKKwkJCSAgIEk5MTVfUkVBRChESVNQX0FSQl9DVEwpIHwgRElTUF9GQkNfV01fRElTKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCWlmIChkaXNwbGF5X3dtID4gU05CX0RJU1BMQVlfTUFYX1NSV00pIHsKKwkJRFJNX0RFQlVHX0tNUygiZGlzcGxheSB3YXRlcm1hcmsoJWQpIGlzIHRvbyBsYXJnZSglZCksIGRpc2FibGluZyB3bSVkK1xuIiwKKwkJCQlkaXNwbGF5X3dtLCBTTkJfRElTUExBWV9NQVhfU1JXTSwgbGV2ZWwpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJaWYgKGN1cnNvcl93bSA+IFNOQl9DVVJTT1JfTUFYX1NSV00pIHsKKwkJRFJNX0RFQlVHX0tNUygiY3Vyc29yIHdhdGVybWFyayglZCkgaXMgdG9vIGxhcmdlKCVkKSwgZGlzYWJsaW5nIHdtJWQrXG4iLAorCQkJCWN1cnNvcl93bSwgU05CX0NVUlNPUl9NQVhfU1JXTSwgbGV2ZWwpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJaWYgKCEoZmJjX3dtIHx8IGRpc3BsYXlfd20gfHwgY3Vyc29yX3dtKSkgeworCQlEUk1fREVCVUdfS01TKCJsYXRlbmN5ICVkIGlzIDAsIGRpc2FibGluZyB3bSVkK1xuIiwgbGV2ZWwsIGxldmVsKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXJldHVybiB0cnVlOworfQorCisvKgorICogQ29tcHV0ZSB3YXRlcm1hcmsgdmFsdWVzIG9mIFdNWzEtM10sCisgKi8KK3N0YXRpYyBib29sIHNhbmR5YnJpZGdlX2NvbXB1dGVfc3J3bShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgbGV2ZWwsCisJCQkJICAgICBpbnQgaGRpc3BsYXksIGludCBodG90YWwsIGludCBwaXhlbF9zaXplLAorCQkJCSAgICAgaW50IGNsb2NrLCBpbnQgbGF0ZW5jeV9ucywgaW50ICpmYmNfd20sCisJCQkJICAgICBpbnQgKmRpc3BsYXlfd20sIGludCAqY3Vyc29yX3dtKQoreworCisJdW5zaWduZWQgbG9uZyBsaW5lX3RpbWVfdXM7CisJaW50IHNtYWxsLCBsYXJnZTsKKwlpbnQgZW50cmllczsKKwlpbnQgbGluZV9jb3VudCwgbGluZV9zaXplOworCisJaWYgKCFsYXRlbmN5X25zKSB7CisJCSpmYmNfd20gPSAqZGlzcGxheV93bSA9ICpjdXJzb3Jfd20gPSAwOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJbGluZV90aW1lX3VzID0gKGh0b3RhbCAqIDEwMDApIC8gY2xvY2s7CisJbGluZV9jb3VudCA9IChsYXRlbmN5X25zIC8gbGluZV90aW1lX3VzICsgMTAwMCkgLyAxMDAwOworCWxpbmVfc2l6ZSA9IGhkaXNwbGF5ICogcGl4ZWxfc2l6ZTsKKworCS8qIFVzZSB0aGUgbWluaW11bSBvZiB0aGUgc21hbGwgYW5kIGxhcmdlIGJ1ZmZlciBtZXRob2QgZm9yIHByaW1hcnkgKi8KKwlzbWFsbCA9ICgoY2xvY2sgKiBwaXhlbF9zaXplIC8gMTAwMCkgKiBsYXRlbmN5X25zKSAvIDEwMDA7CisJbGFyZ2UgPSBsaW5lX2NvdW50ICogbGluZV9zaXplOworCisJZW50cmllcyA9IERJVl9ST1VORF9VUChtaW4oc21hbGwsIGxhcmdlKSwKKwkJCQlzYW5keWJyaWRnZV9kaXNwbGF5X3Nyd21faW5mby5jYWNoZWxpbmVfc2l6ZSk7CisJKmRpc3BsYXlfd20gPSBlbnRyaWVzICsgc2FuZHlicmlkZ2VfZGlzcGxheV9zcndtX2luZm8uZ3VhcmRfc2l6ZTsKKworCS8qCisJICogU3BlYyBzYWlkOgorCSAqIEZCQyBXTSA9ICgoRmluYWwgUHJpbWFyeSBXTSAqIDY0KSAvIG51bWJlciBvZiBieXRlcyBwZXIgbGluZSkgKyAyCisJICovCisJKmZiY193bSA9IERJVl9ST1VORF9VUCgqZGlzcGxheV93bSAqIDY0LCBsaW5lX3NpemUpICsgMjsKKworCS8qIGNhbGN1bGF0ZSB0aGUgc2VsZi1yZWZyZXNoIHdhdGVybWFyayBmb3IgZGlzcGxheSBjdXJzb3IgKi8KKwllbnRyaWVzID0gbGluZV9jb3VudCAqIHBpeGVsX3NpemUgKiA2NDsKKwllbnRyaWVzID0gRElWX1JPVU5EX1VQKGVudHJpZXMsCisJCQkgICAgICAgc2FuZHlicmlkZ2VfY3Vyc29yX3Nyd21faW5mby5jYWNoZWxpbmVfc2l6ZSk7CisJKmN1cnNvcl93bSA9IGVudHJpZXMgKyBzYW5keWJyaWRnZV9jdXJzb3Jfc3J3bV9pbmZvLmd1YXJkX3NpemU7CisKKwlyZXR1cm4gc2FuZHlicmlkZ2VfY2hlY2tfc3J3bShkZXYsIGxldmVsLAorCQkJCSAgICAgICpmYmNfd20sICpkaXNwbGF5X3dtLCAqY3Vyc29yX3dtKTsKK30KKworc3RhdGljIHZvaWQgc2FuZHlicmlkZ2VfdXBkYXRlX3dtKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCisJCQkgICAgICAgaW50IHBsYW5lYV9jbG9jaywgaW50IHBsYW5lYl9jbG9jaywKKwkJCSAgICAgICBpbnQgaGRpc3BsYXksIGludCBodG90YWwsCisJCQkgICAgICAgaW50IHBpeGVsX3NpemUpCit7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlpbnQgbGF0ZW5jeSA9IFNOQl9SRUFEX1dNMF9MQVRFTkNZKCk7CisJaW50IGZiY193bSwgcGxhbmVfd20sIGN1cnNvcl93bSwgZW5hYmxlZDsKKwlpbnQgY2xvY2s7CisKKwllbmFibGVkID0gMDsKKwlpZiAoaXJvbmxha2VfY29tcHV0ZV93bTAoZGV2LCAwLAorCQkJCSAmc2FuZHlicmlkZ2VfZGlzcGxheV93bV9pbmZvLCBsYXRlbmN5LAorCQkJCSAmc2FuZHlicmlkZ2VfY3Vyc29yX3dtX2luZm8sIGxhdGVuY3ksCisJCQkJICZwbGFuZV93bSwgJmN1cnNvcl93bSkpIHsKKwkJSTkxNV9XUklURShXTTBfUElQRUFfSUxLLAorCQkJICAgKHBsYW5lX3dtIDw8IFdNMF9QSVBFX1BMQU5FX1NISUZUKSB8IGN1cnNvcl93bSk7CisJCURSTV9ERUJVR19LTVMoIkZJRk8gd2F0ZXJtYXJrcyBGb3IgcGlwZSBBIC0iCisJCQkgICAgICAiIHBsYW5lICVkLCAiICJjdXJzb3I6ICVkXG4iLAorCQkJICAgICAgcGxhbmVfd20sIGN1cnNvcl93bSk7CisJCWVuYWJsZWQrKzsKKwl9CisKKwlpZiAoaXJvbmxha2VfY29tcHV0ZV93bTAoZGV2LCAxLAorCQkJCSAmc2FuZHlicmlkZ2VfZGlzcGxheV93bV9pbmZvLCBsYXRlbmN5LAorCQkJCSAmc2FuZHlicmlkZ2VfY3Vyc29yX3dtX2luZm8sIGxhdGVuY3ksCisJCQkJICZwbGFuZV93bSwgJmN1cnNvcl93bSkpIHsKKwkJSTkxNV9XUklURShXTTBfUElQRUJfSUxLLAorCQkJICAgKHBsYW5lX3dtIDw8IFdNMF9QSVBFX1BMQU5FX1NISUZUKSB8IGN1cnNvcl93bSk7CisJCURSTV9ERUJVR19LTVMoIkZJRk8gd2F0ZXJtYXJrcyBGb3IgcGlwZSBCIC0iCisJCQkgICAgICAiIHBsYW5lICVkLCBjdXJzb3I6ICVkXG4iLAorCQkJICAgICAgcGxhbmVfd20sIGN1cnNvcl93bSk7CisJCWVuYWJsZWQrKzsKKwl9CisKKwkvKgorCSAqIENhbGN1bGF0ZSBhbmQgdXBkYXRlIHRoZSBzZWxmLXJlZnJlc2ggd2F0ZXJtYXJrIG9ubHkgd2hlbiBvbmUKKwkgKiBkaXNwbGF5IHBsYW5lIGlzIHVzZWQuCisJICoKKwkgKiBTTkIgc3VwcG9ydCAzIGxldmVscyBvZiB3YXRlcm1hcmsuCisJICoKKwkgKiBXTTEvV00yL1dNMiB3YXRlcm1hcmtzIGhhdmUgdG8gYmUgZW5hYmxlZCBpbiB0aGUgYXNjZW5kaW5nIG9yZGVyLAorCSAqIGFuZCBkaXNhYmxlZCBpbiB0aGUgZGVzY2VuZGluZyBvcmRlcgorCSAqCisJICovCisJSTkxNV9XUklURShXTTNfTFBfSUxLLCAwKTsKKwlJOTE1X1dSSVRFKFdNMl9MUF9JTEssIDApOworCUk5MTVfV1JJVEUoV00xX0xQX0lMSywgMCk7CisKKwlpZiAoZW5hYmxlZCAhPSAxKQorCQlyZXR1cm47CisKKwljbG9jayA9IHBsYW5lYV9jbG9jayA/IHBsYW5lYV9jbG9jayA6IHBsYW5lYl9jbG9jazsKKworCS8qIFdNMSAqLworCWlmICghc2FuZHlicmlkZ2VfY29tcHV0ZV9zcndtKGRldiwgMSwgaGRpc3BsYXksIGh0b3RhbCwgcGl4ZWxfc2l6ZSwKKwkJCQkgICAgICBjbG9jaywgU05CX1JFQURfV00xX0xBVEVOQ1koKSAqIDUwMCwKKwkJCQkgICAgICAmZmJjX3dtLCAmcGxhbmVfd20sICZjdXJzb3Jfd20pKQorCQlyZXR1cm47CisKKwlJOTE1X1dSSVRFKFdNMV9MUF9JTEssCisJCSAgIFdNMV9MUF9TUl9FTiB8CisJCSAgIChTTkJfUkVBRF9XTTFfTEFURU5DWSgpIDw8IFdNMV9MUF9MQVRFTkNZX1NISUZUKSB8CisJCSAgIChmYmNfd20gPDwgV00xX0xQX0ZCQ19TSElGVCkgfAorCQkgICAocGxhbmVfd20gPDwgV00xX0xQX1NSX1NISUZUKSB8CisJCSAgIGN1cnNvcl93bSk7CisKKwkvKiBXTTIgKi8KKwlpZiAoIXNhbmR5YnJpZGdlX2NvbXB1dGVfc3J3bShkZXYsIDIsCisJCQkJICAgICAgaGRpc3BsYXksIGh0b3RhbCwgcGl4ZWxfc2l6ZSwKKwkJCQkgICAgICBjbG9jaywgU05CX1JFQURfV00yX0xBVEVOQ1koKSAqIDUwMCwKKwkJCQkgICAgICAmZmJjX3dtLCAmcGxhbmVfd20sICZjdXJzb3Jfd20pKQorCQlyZXR1cm47CisKKwlJOTE1X1dSSVRFKFdNMl9MUF9JTEssCisJCSAgIFdNMl9MUF9FTiB8CisJCSAgIChTTkJfUkVBRF9XTTJfTEFURU5DWSgpIDw8IFdNMV9MUF9MQVRFTkNZX1NISUZUKSB8CisJCSAgIChmYmNfd20gPDwgV00xX0xQX0ZCQ19TSElGVCkgfAorCQkgICAocGxhbmVfd20gPDwgV00xX0xQX1NSX1NISUZUKSB8CisJCSAgIGN1cnNvcl93bSk7CisKKwkvKiBXTTMgKi8KKwlpZiAoIXNhbmR5YnJpZGdlX2NvbXB1dGVfc3J3bShkZXYsIDMsCisJCQkJICAgICAgaGRpc3BsYXksIGh0b3RhbCwgcGl4ZWxfc2l6ZSwKKwkJCQkgICAgICBjbG9jaywgU05CX1JFQURfV00zX0xBVEVOQ1koKSAqIDUwMCwKKwkJCQkgICAgICAmZmJjX3dtLCAmcGxhbmVfd20sICZjdXJzb3Jfd20pKQorCQlyZXR1cm47CisKKwlJOTE1X1dSSVRFKFdNM19MUF9JTEssCisJCSAgIFdNM19MUF9FTiB8CisJCSAgIChTTkJfUkVBRF9XTTNfTEFURU5DWSgpIDw8IFdNMV9MUF9MQVRFTkNZX1NISUZUKSB8CisJCSAgIChmYmNfd20gPDwgV00xX0xQX0ZCQ19TSElGVCkgfAorCQkgICAocGxhbmVfd20gPDwgV00xX0xQX1NSX1NISUZUKSB8CisJCSAgIGN1cnNvcl93bSk7Cit9CisKIC8qKgogICogaW50ZWxfdXBkYXRlX3dhdGVybWFya3MgLSB1cGRhdGUgRklGTyB3YXRlcm1hcmsgdmFsdWVzIGJhc2VkIG9uIGN1cnJlbnQgbW9kZXMKICAqCkBAIC0zNjYwLDcgKzM4OTcsNyBAQAogCSAqIHJlZmNsaywgb3IgRkFMU0UuICBUaGUgcmV0dXJuZWQgdmFsdWVzIHJlcHJlc2VudCB0aGUgY2xvY2sgZXF1YXRpb246CiAJICogcmVmbGNrICogKDUgKiAobTEgKyAyKSArIChtMiArIDIpKSAvIChuICsgMikgLyBwMSAvIHAyLgogCSAqLwotCWxpbWl0ID0gaW50ZWxfbGltaXQoY3J0Yyk7CisJbGltaXQgPSBpbnRlbF9saW1pdChjcnRjLCByZWZjbGspOwogCW9rID0gbGltaXQtPmZpbmRfcGxsKGxpbWl0LCBjcnRjLCBhZGp1c3RlZF9tb2RlLT5jbG9jaywgcmVmY2xrLCAmY2xvY2spOwogCWlmICghb2spIHsKIAkJRFJNX0VSUk9SKCJDb3VsZG4ndCBmaW5kIFBMTCBzZXR0aW5ncyBmb3IgbW9kZSFcbiIpOwpAQCAtMzg1Nyw2ICs0MDk0LDIyIEBACiAJCQkJcmVkdWNlZF9jbG9jay5tMjsKIAl9CiAKKwkvKiBFbmFibGUgYXV0b3R1bmluZyBvZiB0aGUgUExMIGNsb2NrIChpZiBwZXJtaXNzaWJsZSkgKi8KKwlpZiAoSEFTX1BDSF9TUExJVChkZXYpKSB7CisJCWludCBmYWN0b3IgPSAyMTsKKworCQlpZiAoaXNfbHZkcykgeworCQkJaWYgKChkZXZfcHJpdi0+bHZkc191c2Vfc3NjICYmCisJCQkgICAgIGRldl9wcml2LT5sdmRzX3NzY19mcmVxID09IDEwMCkgfHwKKwkJCSAgICAoSTkxNV9SRUFEKFBDSF9MVkRTKSAmIExWRFNfQ0xLQl9QT1dFUl9NQVNLKSA9PSBMVkRTX0NMS0JfUE9XRVJfVVApCisJCQkJZmFjdG9yID0gMjU7CisJCX0gZWxzZSBpZiAoaXNfc2R2byAmJiBpc190dikKKwkJCWZhY3RvciA9IDIwOworCisJCWlmIChjbG9jay5tMSA8IGZhY3RvciAqIGNsb2NrLm4pCisJCQlmcCB8PSBGUF9DQl9UVU5FOworCX0KKwogCWRwbGwgPSAwOwogCWlmICghSEFTX1BDSF9TUExJVChkZXYpKQogCQlkcGxsID0gRFBMTF9WR0FfTU9ERV9ESVM7CkBAIC00MDcxLDcgKzQzMjQsNiBAQAogCX0KIAogCWlmICghaGFzX2VkcF9lbmNvZGVyIHx8IGludGVsX2VuY29kZXJfaXNfcGNoX2VkcCgmaGFzX2VkcF9lbmNvZGVyLT5iYXNlKSkgewotCQlJOTE1X1dSSVRFKGZwX3JlZywgZnApOwogCQlJOTE1X1dSSVRFKGRwbGxfcmVnLCBkcGxsKTsKIAogCQkvKiBXYWl0IGZvciB0aGUgY2xvY2tzIHRvIHN0YWJpbGl6ZS4gKi8KQEAgLTQwODksMTMgKzQzNDEsMTMgQEAKIAkJCX0KIAkJCUk5MTVfV1JJVEUoRFBMTF9NRChwaXBlKSwgdGVtcCk7CiAJCX0gZWxzZSB7Ci0JCQkvKiB3cml0ZSBpdCBhZ2FpbiAtLSB0aGUgQklPUyBkb2VzLCBhZnRlciBhbGwgKi8KKwkJCS8qIFRoZSBwaXhlbCBtdWx0aXBsaWVyIGNhbiBvbmx5IGJlIHVwZGF0ZWQgb25jZSB0aGUKKwkJCSAqIERQTEwgaXMgZW5hYmxlZCBhbmQgdGhlIGNsb2NrcyBhcmUgc3RhYmxlLgorCQkJICoKKwkJCSAqIFNvIHdyaXRlIGl0IGFnYWluLgorCQkJICovCiAJCQlJOTE1X1dSSVRFKGRwbGxfcmVnLCBkcGxsKTsKIAkJfQotCi0JCS8qIFdhaXQgZm9yIHRoZSBjbG9ja3MgdG8gc3RhYmlsaXplLiAqLwotCQlQT1NUSU5HX1JFQUQoZHBsbF9yZWcpOwotCQl1ZGVsYXkoMTUwKTsKIAl9CiAKIAlpbnRlbF9jcnRjLT5sb3dmcmVxX2F2YWlsID0gZmFsc2U7CkBAIC00MzMxLDE1ICs0NTgzLDE0IEBACiB9CiAKIHN0YXRpYyBpbnQgaW50ZWxfY3J0Y19jdXJzb3Jfc2V0KHN0cnVjdCBkcm1fY3J0YyAqY3J0YywKLQkJCQkgc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYsCisJCQkJIHN0cnVjdCBkcm1fZmlsZSAqZmlsZSwKIAkJCQkgdWludDMyX3QgaGFuZGxlLAogCQkJCSB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0KQogewogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjcnRjLT5kZXY7CiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlzdHJ1Y3QgaW50ZWxfY3J0YyAqaW50ZWxfY3J0YyA9IHRvX2ludGVsX2NydGMoY3J0Yyk7Ci0Jc3RydWN0IGRybV9nZW1fb2JqZWN0ICpibzsKLQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqX3ByaXY7CisJc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iajsKIAl1aW50MzJfdCBhZGRyOwogCWludCByZXQ7CiAKQEAgLTQzNDksNyArNDYwMCw3IEBACiAJaWYgKCFoYW5kbGUpIHsKIAkJRFJNX0RFQlVHX0tNUygiY3Vyc29yIG9mZlxuIik7CiAJCWFkZHIgPSAwOwotCQlibyA9IE5VTEw7CisJCW9iaiA9IE5VTEw7CiAJCW11dGV4X2xvY2soJmRldi0+c3RydWN0X211dGV4KTsKIAkJZ290byBmaW5pc2g7CiAJfQpAQCAtNDM2MCwxMyArNDYxMSwxMSBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlibyA9IGRybV9nZW1fb2JqZWN0X2xvb2t1cChkZXYsIGZpbGVfcHJpdiwgaGFuZGxlKTsKLQlpZiAoIWJvKQorCW9iaiA9IHRvX2ludGVsX2JvKGRybV9nZW1fb2JqZWN0X2xvb2t1cChkZXYsIGZpbGUsIGhhbmRsZSkpOworCWlmICghb2JqKQogCQlyZXR1cm4gLUVOT0VOVDsKIAotCW9ial9wcml2ID0gdG9faW50ZWxfYm8oYm8pOwotCi0JaWYgKGJvLT5zaXplIDwgd2lkdGggKiBoZWlnaHQgKiA0KSB7CisJaWYgKG9iai0+YmFzZS5zaXplIDwgd2lkdGggKiBoZWlnaHQgKiA0KSB7CiAJCURSTV9FUlJPUigiYnVmZmVyIGlzIHRvIHNtYWxsXG4iKTsKIAkJcmV0ID0gLUVOT01FTTsKIAkJZ290byBmYWlsOwpAQCAtNDM3NSwyOSArNDYyNCw0MSBAQAogCS8qIHdlIG9ubHkgbmVlZCB0byBwaW4gaW5zaWRlIEdUVCBpZiBjdXJzb3IgaXMgbm9uLXBoeSAqLwogCW11dGV4X2xvY2soJmRldi0+c3RydWN0X211dGV4KTsKIAlpZiAoIWRldl9wcml2LT5pbmZvLT5jdXJzb3JfbmVlZHNfcGh5c2ljYWwpIHsKLQkJcmV0ID0gaTkxNV9nZW1fb2JqZWN0X3BpbihibywgUEFHRV9TSVpFKTsKKwkJaWYgKG9iai0+dGlsaW5nX21vZGUpIHsKKwkJCURSTV9FUlJPUigiY3Vyc29yIGNhbm5vdCBiZSB0aWxlZFxuIik7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJZ290byBmYWlsX2xvY2tlZDsKKwkJfQorCisJCXJldCA9IGk5MTVfZ2VtX29iamVjdF9waW4ob2JqLCBQQUdFX1NJWkUsIHRydWUpOwogCQlpZiAocmV0KSB7CiAJCQlEUk1fRVJST1IoImZhaWxlZCB0byBwaW4gY3Vyc29yIGJvXG4iKTsKIAkJCWdvdG8gZmFpbF9sb2NrZWQ7CiAJCX0KIAotCQlyZXQgPSBpOTE1X2dlbV9vYmplY3Rfc2V0X3RvX2d0dF9kb21haW4oYm8sIDApOworCQlyZXQgPSBpOTE1X2dlbV9vYmplY3Rfc2V0X3RvX2d0dF9kb21haW4ob2JqLCAwKTsKIAkJaWYgKHJldCkgewogCQkJRFJNX0VSUk9SKCJmYWlsZWQgdG8gbW92ZSBjdXJzb3IgYm8gaW50byB0aGUgR1RUXG4iKTsKIAkJCWdvdG8gZmFpbF91bnBpbjsKIAkJfQogCi0JCWFkZHIgPSBvYmpfcHJpdi0+Z3R0X29mZnNldDsKKwkJcmV0ID0gaTkxNV9nZW1fb2JqZWN0X3B1dF9mZW5jZShvYmopOworCQlpZiAocmV0KSB7CisJCQlEUk1fRVJST1IoImZhaWxlZCB0byBtb3ZlIGN1cnNvciBibyBpbnRvIHRoZSBHVFRcbiIpOworCQkJZ290byBmYWlsX3VucGluOworCQl9CisKKwkJYWRkciA9IG9iai0+Z3R0X29mZnNldDsKIAl9IGVsc2UgewogCQlpbnQgYWxpZ24gPSBJU19JODMwKGRldikgPyAxNiAqIDEwMjQgOiAyNTY7Ci0JCXJldCA9IGk5MTVfZ2VtX2F0dGFjaF9waHlzX29iamVjdChkZXYsIGJvLAorCQlyZXQgPSBpOTE1X2dlbV9hdHRhY2hfcGh5c19vYmplY3QoZGV2LCBvYmosCiAJCQkJCQkgIChpbnRlbF9jcnRjLT5waXBlID09IDApID8gSTkxNV9HRU1fUEhZU19DVVJTT1JfMCA6IEk5MTVfR0VNX1BIWVNfQ1VSU09SXzEsCiAJCQkJCQkgIGFsaWduKTsKIAkJaWYgKHJldCkgewogCQkJRFJNX0VSUk9SKCJmYWlsZWQgdG8gYXR0YWNoIHBoeXMgb2JqZWN0XG4iKTsKIAkJCWdvdG8gZmFpbF9sb2NrZWQ7CiAJCX0KLQkJYWRkciA9IG9ial9wcml2LT5waHlzX29iai0+aGFuZGxlLT5idXNhZGRyOworCQlhZGRyID0gb2JqLT5waHlzX29iai0+aGFuZGxlLT5idXNhZGRyOwogCX0KIAogCWlmIChJU19HRU4yKGRldikpCkBAIC00NDA2LDE3ICs0NjY3LDE3IEBACiAgZmluaXNoOgogCWlmIChpbnRlbF9jcnRjLT5jdXJzb3JfYm8pIHsKIAkJaWYgKGRldl9wcml2LT5pbmZvLT5jdXJzb3JfbmVlZHNfcGh5c2ljYWwpIHsKLQkJCWlmIChpbnRlbF9jcnRjLT5jdXJzb3JfYm8gIT0gYm8pCisJCQlpZiAoaW50ZWxfY3J0Yy0+Y3Vyc29yX2JvICE9IG9iaikKIAkJCQlpOTE1X2dlbV9kZXRhY2hfcGh5c19vYmplY3QoZGV2LCBpbnRlbF9jcnRjLT5jdXJzb3JfYm8pOwogCQl9IGVsc2UKIAkJCWk5MTVfZ2VtX29iamVjdF91bnBpbihpbnRlbF9jcnRjLT5jdXJzb3JfYm8pOwotCQlkcm1fZ2VtX29iamVjdF91bnJlZmVyZW5jZShpbnRlbF9jcnRjLT5jdXJzb3JfYm8pOworCQlkcm1fZ2VtX29iamVjdF91bnJlZmVyZW5jZSgmaW50ZWxfY3J0Yy0+Y3Vyc29yX2JvLT5iYXNlKTsKIAl9CiAKIAltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKIAogCWludGVsX2NydGMtPmN1cnNvcl9hZGRyID0gYWRkcjsKLQlpbnRlbF9jcnRjLT5jdXJzb3JfYm8gPSBibzsKKwlpbnRlbF9jcnRjLT5jdXJzb3JfYm8gPSBvYmo7CiAJaW50ZWxfY3J0Yy0+Y3Vyc29yX3dpZHRoID0gd2lkdGg7CiAJaW50ZWxfY3J0Yy0+Y3Vyc29yX2hlaWdodCA9IGhlaWdodDsKIApAQCAtNDQyNCwxMSArNDY4NSwxMSBAQAogCiAJcmV0dXJuIDA7CiBmYWlsX3VucGluOgotCWk5MTVfZ2VtX29iamVjdF91bnBpbihibyk7CisJaTkxNV9nZW1fb2JqZWN0X3VucGluKG9iaik7CiBmYWlsX2xvY2tlZDoKIAltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKIGZhaWw6Ci0JZHJtX2dlbV9vYmplY3RfdW5yZWZlcmVuY2VfdW5sb2NrZWQoYm8pOworCWRybV9nZW1fb2JqZWN0X3VucmVmZXJlbmNlX3VubG9ja2VkKCZvYmotPmJhc2UpOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTQ3MzksOCArNTAwMCwxNCBAQAogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSAoc3RydWN0IGRybV9kZXZpY2UgKilhcmc7CiAJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAKLQlkZXZfcHJpdi0+YnVzeSA9IGZhbHNlOworCWlmICghbGlzdF9lbXB0eSgmZGV2X3ByaXYtPm1tLmFjdGl2ZV9saXN0KSkgeworCQkvKiBTdGlsbCBwcm9jZXNzaW5nIHJlcXVlc3RzLCBzbyBqdXN0IHJlLWFybSB0aGUgdGltZXIuICovCisJCW1vZF90aW1lcigmZGV2X3ByaXYtPmlkbGVfdGltZXIsIGppZmZpZXMgKworCQkJICBtc2Vjc190b19qaWZmaWVzKEdQVV9JRExFX1RJTUVPVVQpKTsKKwkJcmV0dXJuOworCX0KIAorCWRldl9wcml2LT5idXN5ID0gZmFsc2U7CiAJcXVldWVfd29yayhkZXZfcHJpdi0+d3EsICZkZXZfcHJpdi0+aWRsZV93b3JrKTsKIH0KIApAQCAtNDc1MSw5ICs1MDE4LDE3IEBACiAJc3RydWN0IGludGVsX2NydGMgKmludGVsX2NydGMgPSAoc3RydWN0IGludGVsX2NydGMgKilhcmc7CiAJc3RydWN0IGRybV9jcnRjICpjcnRjID0gJmludGVsX2NydGMtPmJhc2U7CiAJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGNydGMtPmRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IGludGVsX2ZyYW1lYnVmZmVyICppbnRlbF9mYjsKKworCWludGVsX2ZiID0gdG9faW50ZWxfZnJhbWVidWZmZXIoY3J0Yy0+ZmIpOworCWlmIChpbnRlbF9mYiAmJiBpbnRlbF9mYi0+b2JqLT5hY3RpdmUpIHsKKwkJLyogVGhlIGZyYW1lYnVmZmVyIGlzIHN0aWxsIGJlaW5nIGFjY2Vzc2VkIGJ5IHRoZSBHUFUuICovCisJCW1vZF90aW1lcigmaW50ZWxfY3J0Yy0+aWRsZV90aW1lciwgamlmZmllcyArCisJCQkgIG1zZWNzX3RvX2ppZmZpZXMoQ1JUQ19JRExFX1RJTUVPVVQpKTsKKwkJcmV0dXJuOworCX0KIAogCWludGVsX2NydGMtPmJ1c3kgPSBmYWxzZTsKLQogCXF1ZXVlX3dvcmsoZGV2X3ByaXYtPndxLCAmZGV2X3ByaXYtPmlkbGVfd29yayk7CiB9CiAKQEAgLTQ4ODgsNyArNTE2Myw3IEBACiAgKiBidWZmZXIpLCB3ZSdsbCBhbHNvIG1hcmsgdGhlIGRpc3BsYXkgYXMgYnVzeSwgc28gd2Uga25vdyB0byBpbmNyZWFzZSBpdHMKICAqIGNsb2NrIGZyZXF1ZW5jeS4KICAqLwotdm9pZCBpbnRlbF9tYXJrX2J1c3koc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmopCit2b2lkIGludGVsX21hcmtfYnVzeShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqKQogewogCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXN0cnVjdCBkcm1fY3J0YyAqY3J0YyA9IE5VTEw7CkBAIC00OTY5LDggKzUyNDQsOSBAQAogCiAJbXV0ZXhfbG9jaygmd29yay0+ZGV2LT5zdHJ1Y3RfbXV0ZXgpOwogCWk5MTVfZ2VtX29iamVjdF91bnBpbih3b3JrLT5vbGRfZmJfb2JqKTsKLQlkcm1fZ2VtX29iamVjdF91bnJlZmVyZW5jZSh3b3JrLT5wZW5kaW5nX2ZsaXBfb2JqKTsKLQlkcm1fZ2VtX29iamVjdF91bnJlZmVyZW5jZSh3b3JrLT5vbGRfZmJfb2JqKTsKKwlkcm1fZ2VtX29iamVjdF91bnJlZmVyZW5jZSgmd29yay0+cGVuZGluZ19mbGlwX29iai0+YmFzZSk7CisJZHJtX2dlbV9vYmplY3RfdW5yZWZlcmVuY2UoJndvcmstPm9sZF9mYl9vYmotPmJhc2UpOworCiAJbXV0ZXhfdW5sb2NrKCZ3b3JrLT5kZXYtPnN0cnVjdF9tdXRleCk7CiAJa2ZyZWUod29yayk7CiB9CkBAIC00OTgxLDE1ICs1MjU3LDE3IEBACiAJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJc3RydWN0IGludGVsX2NydGMgKmludGVsX2NydGMgPSB0b19pbnRlbF9jcnRjKGNydGMpOwogCXN0cnVjdCBpbnRlbF91bnBpbl93b3JrICp3b3JrOwotCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmpfcHJpdjsKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqOwogCXN0cnVjdCBkcm1fcGVuZGluZ192YmxhbmtfZXZlbnQgKmU7Ci0Jc3RydWN0IHRpbWV2YWwgbm93OworCXN0cnVjdCB0aW1ldmFsIHRub3csIHR2Ymw7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCS8qIElnbm9yZSBlYXJseSB2YmxhbmsgaXJxcyAqLwogCWlmIChpbnRlbF9jcnRjID09IE5VTEwpCiAJCXJldHVybjsKIAorCWRvX2dldHRpbWVvZmRheSgmdG5vdyk7CisKIAlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5ldmVudF9sb2NrLCBmbGFncyk7CiAJd29yayA9IGludGVsX2NydGMtPnVucGluX3dvcms7CiAJaWYgKHdvcmsgPT0gTlVMTCB8fCAhd29yay0+cGVuZGluZykgewpAQCAtNDk5OCwyNiArNTI3Niw0OSBAQAogCX0KIAogCWludGVsX2NydGMtPnVucGluX3dvcmsgPSBOVUxMOwotCWRybV92YmxhbmtfcHV0KGRldiwgaW50ZWxfY3J0Yy0+cGlwZSk7CiAKIAlpZiAod29yay0+ZXZlbnQpIHsKIAkJZSA9IHdvcmstPmV2ZW50OwotCQlkb19nZXR0aW1lb2ZkYXkoJm5vdyk7Ci0JCWUtPmV2ZW50LnNlcXVlbmNlID0gZHJtX3ZibGFua19jb3VudChkZXYsIGludGVsX2NydGMtPnBpcGUpOwotCQllLT5ldmVudC50dl9zZWMgPSBub3cudHZfc2VjOwotCQllLT5ldmVudC50dl91c2VjID0gbm93LnR2X3VzZWM7CisJCWUtPmV2ZW50LnNlcXVlbmNlID0gZHJtX3ZibGFua19jb3VudF9hbmRfdGltZShkZXYsIGludGVsX2NydGMtPnBpcGUsICZ0dmJsKTsKKworCQkvKiBDYWxsZWQgYmVmb3JlIHZibGFuayBjb3VudCBhbmQgdGltZXN0YW1wcyBoYXZlCisJCSAqIGJlZW4gdXBkYXRlZCBmb3IgdGhlIHZibGFuayBpbnRlcnZhbCBvZiBmbGlwCisJCSAqIGNvbXBsZXRpb24/IE5lZWQgdG8gaW5jcmVtZW50IHZibGFuayBjb3VudCBhbmQKKwkJICogYWRkIG9uZSB2aWRlb3JlZnJlc2ggZHVyYXRpb24gdG8gcmV0dXJuZWQgdGltZXN0YW1wCisJCSAqIHRvIGFjY291bnQgZm9yIHRoaXMuIFdlIGFzc3VtZSB0aGlzIGhhcHBlbmVkIGlmIHdlCisJCSAqIGdldCBjYWxsZWQgb3ZlciAwLjkgZnJhbWUgZHVyYXRpb25zIGFmdGVyIHRoZSBsYXN0CisJCSAqIHRpbWVzdGFtcGVkIHZibGFuay4KKwkJICoKKwkJICogVGhpcyBjYWxjdWxhdGlvbiBjYW4gbm90IGJlIHVzZWQgd2l0aCB2cmVmcmVzaCByYXRlcworCQkgKiBiZWxvdyA1SHogKDEwSHogdG8gYmUgb24gdGhlIHNhZmUgc2lkZSkgd2l0aG91dAorCQkgKiBwcm9tb3RpbmcgdG8gNjQgaW50ZWdlcnMuCisJCSAqLworCQlpZiAoMTAgKiAodGltZXZhbF90b19ucygmdG5vdykgLSB0aW1ldmFsX3RvX25zKCZ0dmJsKSkgPgorCQkgICAgOSAqIGNydGMtPmZyYW1lZHVyX25zKSB7CisJCQllLT5ldmVudC5zZXF1ZW5jZSsrOworCQkJdHZibCA9IG5zX3RvX3RpbWV2YWwodGltZXZhbF90b19ucygmdHZibCkgKworCQkJCQkgICAgIGNydGMtPmZyYW1lZHVyX25zKTsKKwkJfQorCisJCWUtPmV2ZW50LnR2X3NlYyA9IHR2YmwudHZfc2VjOworCQllLT5ldmVudC50dl91c2VjID0gdHZibC50dl91c2VjOworCiAJCWxpc3RfYWRkX3RhaWwoJmUtPmJhc2UubGluaywKIAkJCSAgICAgICZlLT5iYXNlLmZpbGVfcHJpdi0+ZXZlbnRfbGlzdCk7CiAJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmZS0+YmFzZS5maWxlX3ByaXYtPmV2ZW50X3dhaXQpOwogCX0KIAorCWRybV92YmxhbmtfcHV0KGRldiwgaW50ZWxfY3J0Yy0+cGlwZSk7CisKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPmV2ZW50X2xvY2ssIGZsYWdzKTsKIAotCW9ial9wcml2ID0gdG9faW50ZWxfYm8od29yay0+b2xkX2ZiX29iaik7CisJb2JqID0gd29yay0+b2xkX2ZiX29iajsKKwogCWF0b21pY19jbGVhcl9tYXNrKDEgPDwgaW50ZWxfY3J0Yy0+cGxhbmUsCi0JCQkgICZvYmpfcHJpdi0+cGVuZGluZ19mbGlwLmNvdW50ZXIpOwotCWlmIChhdG9taWNfcmVhZCgmb2JqX3ByaXYtPnBlbmRpbmdfZmxpcCkgPT0gMCkKKwkJCSAgJm9iai0+cGVuZGluZ19mbGlwLmNvdW50ZXIpOworCWlmIChhdG9taWNfcmVhZCgmb2JqLT5wZW5kaW5nX2ZsaXApID09IDApCiAJCXdha2VfdXAoJmRldl9wcml2LT5wZW5kaW5nX2ZsaXBfcXVldWUpOworCiAJc2NoZWR1bGVfd29yaygmd29yay0+d29yayk7CiAKIAl0cmFjZV9pOTE1X2ZsaXBfY29tcGxldGUoaW50ZWxfY3J0Yy0+cGxhbmUsIHdvcmstPnBlbmRpbmdfZmxpcF9vYmopOwpAQCAtNTA2Myw4ICs1MzY0LDcgQEAKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY3J0Yy0+ZGV2OwogCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJc3RydWN0IGludGVsX2ZyYW1lYnVmZmVyICppbnRlbF9mYjsKLQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqX3ByaXY7Ci0Jc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmo7CisJc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iajsKIAlzdHJ1Y3QgaW50ZWxfY3J0YyAqaW50ZWxfY3J0YyA9IHRvX2ludGVsX2NydGMoY3J0Yyk7CiAJc3RydWN0IGludGVsX3VucGluX3dvcmsgKndvcms7CiAJdW5zaWduZWQgbG9uZyBmbGFncywgb2Zmc2V0OwpAQCAtNTA5OCwxMyArNTM5OCwxMyBAQAogCW9iaiA9IGludGVsX2ZiLT5vYmo7CiAKIAltdXRleF9sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7Ci0JcmV0ID0gaW50ZWxfcGluX2FuZF9mZW5jZV9mYl9vYmooZGV2LCBvYmosIHRydWUpOworCXJldCA9IGludGVsX3Bpbl9hbmRfZmVuY2VfZmJfb2JqKGRldiwgb2JqLCBMUF9SSU5HKGRldl9wcml2KSk7CiAJaWYgKHJldCkKIAkJZ290byBjbGVhbnVwX3dvcms7CiAKIAkvKiBSZWZlcmVuY2UgdGhlIG9iamVjdHMgZm9yIHRoZSBzY2hlZHVsZWQgd29yay4gKi8KLQlkcm1fZ2VtX29iamVjdF9yZWZlcmVuY2Uod29yay0+b2xkX2ZiX29iaik7Ci0JZHJtX2dlbV9vYmplY3RfcmVmZXJlbmNlKG9iaik7CisJZHJtX2dlbV9vYmplY3RfcmVmZXJlbmNlKCZ3b3JrLT5vbGRfZmJfb2JqLT5iYXNlKTsKKwlkcm1fZ2VtX29iamVjdF9yZWZlcmVuY2UoJm9iai0+YmFzZSk7CiAKIAljcnRjLT5mYiA9IGZiOwogCkBAIC01MTEyLDIyICs1NDEyLDE2IEBACiAJaWYgKHJldCkKIAkJZ290byBjbGVhbnVwX29ianM7CiAKLQkvKiBCbG9jayBjbGllbnRzIGZyb20gcmVuZGVyaW5nIHRvIHRoZSBuZXcgYmFjayBidWZmZXIgdW50aWwKLQkgKiB0aGUgZmxpcCBvY2N1cnMgYW5kIHRoZSBvYmplY3QgaXMgbm8gbG9uZ2VyIHZpc2libGUuCi0JICovCi0JYXRvbWljX2FkZCgxIDw8IGludGVsX2NydGMtPnBsYW5lLAotCQkgICAmdG9faW50ZWxfYm8od29yay0+b2xkX2ZiX29iaiktPnBlbmRpbmdfZmxpcCk7Ci0KLQl3b3JrLT5wZW5kaW5nX2ZsaXBfb2JqID0gb2JqOwotCW9ial9wcml2ID0gdG9faW50ZWxfYm8ob2JqKTsKLQogCWlmIChJU19HRU4zKGRldikgfHwgSVNfR0VOMihkZXYpKSB7CiAJCXUzMiBmbGlwX21hc2s7CiAKIAkJLyogQ2FuJ3QgcXVldWUgbXVsdGlwbGUgZmxpcHMsIHNvIHdhaXQgZm9yIHRoZSBwcmV2aW91cwogCQkgKiBvbmUgdG8gZmluaXNoIGJlZm9yZSBleGVjdXRpbmcgdGhlIG5leHQuCiAJCSAqLwotCQlCRUdJTl9MUF9SSU5HKDIpOworCQlyZXQgPSBCRUdJTl9MUF9SSU5HKDIpOworCQlpZiAocmV0KQorCQkJZ290byBjbGVhbnVwX29ianM7CisKIAkJaWYgKGludGVsX2NydGMtPnBsYW5lKQogCQkJZmxpcF9tYXNrID0gTUlfV0FJVF9GT1JfUExBTkVfQl9GTElQOwogCQllbHNlCkBAIC01MTM3LDE4ICs1NDMxLDI4IEBACiAJCUFEVkFOQ0VfTFBfUklORygpOwogCX0KIAorCXdvcmstPnBlbmRpbmdfZmxpcF9vYmogPSBvYmo7CisKIAl3b3JrLT5lbmFibGVfc3RhbGxfY2hlY2sgPSB0cnVlOwogCiAJLyogT2Zmc2V0IGludG8gdGhlIG5ldyBidWZmZXIgZm9yIGNhc2VzIG9mIHNoYXJlZCBmYnMgYmV0d2VlbiBDUlRDcyAqLwogCW9mZnNldCA9IGNydGMtPnkgKiBmYi0+cGl0Y2ggKyBjcnRjLT54ICogZmItPmJpdHNfcGVyX3BpeGVsLzg7CiAKLQlCRUdJTl9MUF9SSU5HKDQpOwotCXN3aXRjaChJTlRFTF9JTkZPKGRldiktPmdlbikgeworCXJldCA9IEJFR0lOX0xQX1JJTkcoNCk7CisJaWYgKHJldCkKKwkJZ290byBjbGVhbnVwX29ianM7CisKKwkvKiBCbG9jayBjbGllbnRzIGZyb20gcmVuZGVyaW5nIHRvIHRoZSBuZXcgYmFjayBidWZmZXIgdW50aWwKKwkgKiB0aGUgZmxpcCBvY2N1cnMgYW5kIHRoZSBvYmplY3QgaXMgbm8gbG9uZ2VyIHZpc2libGUuCisJICovCisJYXRvbWljX2FkZCgxIDw8IGludGVsX2NydGMtPnBsYW5lLCAmd29yay0+b2xkX2ZiX29iai0+cGVuZGluZ19mbGlwKTsKKworCXN3aXRjaCAoSU5URUxfSU5GTyhkZXYpLT5nZW4pIHsKIAljYXNlIDI6CiAJCU9VVF9SSU5HKE1JX0RJU1BMQVlfRkxJUCB8CiAJCQkgTUlfRElTUExBWV9GTElQX1BMQU5FKGludGVsX2NydGMtPnBsYW5lKSk7CiAJCU9VVF9SSU5HKGZiLT5waXRjaCk7Ci0JCU9VVF9SSU5HKG9ial9wcml2LT5ndHRfb2Zmc2V0ICsgb2Zmc2V0KTsKKwkJT1VUX1JJTkcob2JqLT5ndHRfb2Zmc2V0ICsgb2Zmc2V0KTsKIAkJT1VUX1JJTkcoTUlfTk9PUCk7CiAJCWJyZWFrOwogCkBAIC01MTU2LDcgKzU0NjAsNyBAQAogCQlPVVRfUklORyhNSV9ESVNQTEFZX0ZMSVBfSTkxNSB8CiAJCQkgTUlfRElTUExBWV9GTElQX1BMQU5FKGludGVsX2NydGMtPnBsYW5lKSk7CiAJCU9VVF9SSU5HKGZiLT5waXRjaCk7Ci0JCU9VVF9SSU5HKG9ial9wcml2LT5ndHRfb2Zmc2V0ICsgb2Zmc2V0KTsKKwkJT1VUX1JJTkcob2JqLT5ndHRfb2Zmc2V0ICsgb2Zmc2V0KTsKIAkJT1VUX1JJTkcoTUlfTk9PUCk7CiAJCWJyZWFrOwogCkBAIC01MTY5LDcgKzU0NzMsNyBAQAogCQlPVVRfUklORyhNSV9ESVNQTEFZX0ZMSVAgfAogCQkJIE1JX0RJU1BMQVlfRkxJUF9QTEFORShpbnRlbF9jcnRjLT5wbGFuZSkpOwogCQlPVVRfUklORyhmYi0+cGl0Y2gpOwotCQlPVVRfUklORyhvYmpfcHJpdi0+Z3R0X29mZnNldCB8IG9ial9wcml2LT50aWxpbmdfbW9kZSk7CisJCU9VVF9SSU5HKG9iai0+Z3R0X29mZnNldCB8IG9iai0+dGlsaW5nX21vZGUpOwogCiAJCS8qIFhYWCBFbmFibGluZyB0aGUgcGFuZWwtZml0dGVyIGFjcm9zcyBwYWdlLWZsaXAgaXMgc28gZmFyCiAJCSAqIHVudGVzdGVkIG9uIG5vbi1uYXRpdmUgbW9kZXMsIHNvIGlnbm9yZSBpdCBmb3Igbm93LgpAQCAtNTE4Myw4ICs1NDg3LDggQEAKIAljYXNlIDY6CiAJCU9VVF9SSU5HKE1JX0RJU1BMQVlfRkxJUCB8CiAJCQkgTUlfRElTUExBWV9GTElQX1BMQU5FKGludGVsX2NydGMtPnBsYW5lKSk7Ci0JCU9VVF9SSU5HKGZiLT5waXRjaCB8IG9ial9wcml2LT50aWxpbmdfbW9kZSk7Ci0JCU9VVF9SSU5HKG9ial9wcml2LT5ndHRfb2Zmc2V0KTsKKwkJT1VUX1JJTkcoZmItPnBpdGNoIHwgb2JqLT50aWxpbmdfbW9kZSk7CisJCU9VVF9SSU5HKG9iai0+Z3R0X29mZnNldCk7CiAKIAkJcGYgPSBJOTE1X1JFQUQocGlwZSA9PSAwID8gUEZBX0NUTF8xIDogUEZCX0NUTF8xKSAmIFBGX0VOQUJMRTsKIAkJcGlwZXNyYyA9IEk5MTVfUkVBRChwaXBlID09IDAgPyBQSVBFQVNSQyA6IFBJUEVCU1JDKSAmIDB4MGZmZjBmZmY7CkBAIC01MjAwLDggKzU1MDQsOCBAQAogCXJldHVybiAwOwogCiBjbGVhbnVwX29ianM6Ci0JZHJtX2dlbV9vYmplY3RfdW5yZWZlcmVuY2Uod29yay0+b2xkX2ZiX29iaik7Ci0JZHJtX2dlbV9vYmplY3RfdW5yZWZlcmVuY2Uob2JqKTsKKwlkcm1fZ2VtX29iamVjdF91bnJlZmVyZW5jZSgmd29yay0+b2xkX2ZiX29iai0+YmFzZSk7CisJZHJtX2dlbV9vYmplY3RfdW5yZWZlcmVuY2UoJm9iai0+YmFzZSk7CiBjbGVhbnVwX3dvcms6CiAJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CiAKQEAgLTUzMzgsNyArNTY0Miw3IEBACiB9CiAKIGludCBpbnRlbF9nZXRfcGlwZV9mcm9tX2NydGNfaWQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdm9pZCAqZGF0YSwKLQkJCQlzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdikKKwkJCQlzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGUpCiB7CiAJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJc3RydWN0IGRybV9pOTE1X2dldF9waXBlX2Zyb21fY3J0Y19pZCAqcGlwZV9mcm9tX2NydGNfaWQgPSBkYXRhOwpAQCAtNTUwNSwxOSArNTgwOSwxOSBAQAogCXN0cnVjdCBpbnRlbF9mcmFtZWJ1ZmZlciAqaW50ZWxfZmIgPSB0b19pbnRlbF9mcmFtZWJ1ZmZlcihmYik7CiAKIAlkcm1fZnJhbWVidWZmZXJfY2xlYW51cChmYik7Ci0JZHJtX2dlbV9vYmplY3RfdW5yZWZlcmVuY2VfdW5sb2NrZWQoaW50ZWxfZmItPm9iaik7CisJZHJtX2dlbV9vYmplY3RfdW5yZWZlcmVuY2VfdW5sb2NrZWQoJmludGVsX2ZiLT5vYmotPmJhc2UpOwogCiAJa2ZyZWUoaW50ZWxfZmIpOwogfQogCiBzdGF0aWMgaW50IGludGVsX3VzZXJfZnJhbWVidWZmZXJfY3JlYXRlX2hhbmRsZShzdHJ1Y3QgZHJtX2ZyYW1lYnVmZmVyICpmYiwKLQkJCQkJCXN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2LAorCQkJCQkJc3RydWN0IGRybV9maWxlICpmaWxlLAogCQkJCQkJdW5zaWduZWQgaW50ICpoYW5kbGUpCiB7CiAJc3RydWN0IGludGVsX2ZyYW1lYnVmZmVyICppbnRlbF9mYiA9IHRvX2ludGVsX2ZyYW1lYnVmZmVyKGZiKTsKLQlzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iamVjdCA9IGludGVsX2ZiLT5vYmo7CisJc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaiA9IGludGVsX2ZiLT5vYmo7CiAKLQlyZXR1cm4gZHJtX2dlbV9oYW5kbGVfY3JlYXRlKGZpbGVfcHJpdiwgb2JqZWN0LCBoYW5kbGUpOworCXJldHVybiBkcm1fZ2VtX2hhbmRsZV9jcmVhdGUoZmlsZSwgJm9iai0+YmFzZSwgaGFuZGxlKTsKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBkcm1fZnJhbWVidWZmZXJfZnVuY3MgaW50ZWxfZmJfZnVuY3MgPSB7CkBAIC01NTI4LDEyICs1ODMyLDExIEBACiBpbnQgaW50ZWxfZnJhbWVidWZmZXJfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAogCQkJICAgc3RydWN0IGludGVsX2ZyYW1lYnVmZmVyICppbnRlbF9mYiwKIAkJCSAgIHN0cnVjdCBkcm1fbW9kZV9mYl9jbWQgKm1vZGVfY21kLAotCQkJICAgc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmopCisJCQkgICBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqKQogewotCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmpfcHJpdiA9IHRvX2ludGVsX2JvKG9iaik7CiAJaW50IHJldDsKIAotCWlmIChvYmpfcHJpdi0+dGlsaW5nX21vZGUgPT0gSTkxNV9USUxJTkdfWSkKKwlpZiAob2JqLT50aWxpbmdfbW9kZSA9PSBJOTE1X1RJTElOR19ZKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWlmIChtb2RlX2NtZC0+cGl0Y2ggJiA2MykKQEAgLTU1NjUsMTEgKzU4NjgsMTEgQEAKIAkJCSAgICAgIHN0cnVjdCBkcm1fZmlsZSAqZmlscCwKIAkJCSAgICAgIHN0cnVjdCBkcm1fbW9kZV9mYl9jbWQgKm1vZGVfY21kKQogewotCXN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqOworCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmo7CiAJc3RydWN0IGludGVsX2ZyYW1lYnVmZmVyICppbnRlbF9mYjsKIAlpbnQgcmV0OwogCi0Jb2JqID0gZHJtX2dlbV9vYmplY3RfbG9va3VwKGRldiwgZmlscCwgbW9kZV9jbWQtPmhhbmRsZSk7CisJb2JqID0gdG9faW50ZWxfYm8oZHJtX2dlbV9vYmplY3RfbG9va3VwKGRldiwgZmlscCwgbW9kZV9jbWQtPmhhbmRsZSkpOwogCWlmICghb2JqKQogCQlyZXR1cm4gRVJSX1BUUigtRU5PRU5UKTsKIApAQCAtNTU3NywxMCArNTg4MCw5IEBACiAJaWYgKCFpbnRlbF9mYikKIAkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CiAKLQlyZXQgPSBpbnRlbF9mcmFtZWJ1ZmZlcl9pbml0KGRldiwgaW50ZWxfZmIsCi0JCQkJICAgICBtb2RlX2NtZCwgb2JqKTsKKwlyZXQgPSBpbnRlbF9mcmFtZWJ1ZmZlcl9pbml0KGRldiwgaW50ZWxfZmIsIG1vZGVfY21kLCBvYmopOwogCWlmIChyZXQpIHsKLQkJZHJtX2dlbV9vYmplY3RfdW5yZWZlcmVuY2VfdW5sb2NrZWQob2JqKTsKKwkJZHJtX2dlbV9vYmplY3RfdW5yZWZlcmVuY2VfdW5sb2NrZWQoJm9iai0+YmFzZSk7CiAJCWtmcmVlKGludGVsX2ZiKTsKIAkJcmV0dXJuIEVSUl9QVFIocmV0KTsKIAl9CkBAIC01NTkzLDEwICs1ODk1LDEwIEBACiAJLm91dHB1dF9wb2xsX2NoYW5nZWQgPSBpbnRlbF9mYl9vdXRwdXRfcG9sbF9jaGFuZ2VkLAogfTsKIAotc3RhdGljIHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqCitzdGF0aWMgc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKgogaW50ZWxfYWxsb2NfY29udGV4dF9wYWdlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7Ci0Jc3RydWN0IGRybV9nZW1fb2JqZWN0ICpjdHg7CisJc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKmN0eDsKIAlpbnQgcmV0OwogCiAJY3R4ID0gaTkxNV9nZW1fYWxsb2Nfb2JqZWN0KGRldiwgNDA5Nik7CkBAIC01NjA2LDcgKzU5MDgsNyBAQAogCX0KIAogCW11dGV4X2xvY2soJmRldi0+c3RydWN0X211dGV4KTsKLQlyZXQgPSBpOTE1X2dlbV9vYmplY3RfcGluKGN0eCwgNDA5Nik7CisJcmV0ID0gaTkxNV9nZW1fb2JqZWN0X3BpbihjdHgsIDQwOTYsIHRydWUpOwogCWlmIChyZXQpIHsKIAkJRFJNX0VSUk9SKCJmYWlsZWQgdG8gcGluIHBvd2VyIGNvbnRleHQ6ICVkXG4iLCByZXQpOwogCQlnb3RvIGVycl91bnJlZjsKQEAgLTU2MjQsNyArNTkyNiw3IEBACiBlcnJfdW5waW46CiAJaTkxNV9nZW1fb2JqZWN0X3VucGluKGN0eCk7CiBlcnJfdW5yZWY6Ci0JZHJtX2dlbV9vYmplY3RfdW5yZWZlcmVuY2UoY3R4KTsKKwlkcm1fZ2VtX29iamVjdF91bnJlZmVyZW5jZSgmY3R4LT5iYXNlKTsKIAltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKIAlyZXR1cm4gTlVMTDsKIH0KQEAgLTU3MzYsNiArNjAzOCwyNSBAQAogCiB9CiAKK3ZvaWQgZ2VuNl9zZXRfcnBzKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHU4IHZhbCkKK3sKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXUzMiBzd3JlcTsKKworCXN3cmVxID0gKHZhbCAmIDB4M2ZmKSA8PCAyNTsKKwlJOTE1X1dSSVRFKEdFTjZfUlBOU1dSRVEsIHN3cmVxKTsKK30KKwordm9pZCBnZW42X2Rpc2FibGVfcnBzKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKworCUk5MTVfV1JJVEUoR0VONl9SUE5TV1JFUSwgMSA8PCAzMSk7CisJSTkxNV9XUklURShHRU42X1BNSU5UUk1TSywgMHhmZmZmZmZmZik7CisJSTkxNV9XUklURShHRU42X1BNSUVSLCAwKTsKKwlJOTE1X1dSSVRFKEdFTjZfUE1JSVIsIEk5MTVfUkVBRChHRU42X1BNSUlSKSk7Cit9CisKIHN0YXRpYyB1bnNpZ25lZCBsb25nIGludGVsX3B4ZnJlcSh1MzIgdmlkZnJlcSkKIHsKIAl1bnNpZ25lZCBsb25nIGZyZXE7CkBAIC01ODIyLDcgKzYxNDMsOTYgQEAKIAlkZXZfcHJpdi0+Y29yciA9IChsY2Z1c2UgJiBMQ0ZVU0VfSElWX01BU0spOwogfQogCi12b2lkIGludGVsX2luaXRfY2xvY2tfZ2F0aW5nKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit2b2lkIGdlbjZfZW5hYmxlX3JwcyhzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYpCit7CisJaW50IGk7CisKKwkvKiBIZXJlIGJlZ2lucyBhIG1hZ2ljIHNlcXVlbmNlIG9mIHJlZ2lzdGVyIHdyaXRlcyB0byBlbmFibGUKKwkgKiBhdXRvLWRvd25jbG9ja2luZy4KKwkgKgorCSAqIFBlcmhhcHMgdGhlcmUgbWlnaHQgYmUgc29tZSB2YWx1ZSBpbiBleHBvc2luZyB0aGVzZSB0bworCSAqIHVzZXJzcGFjZS4uLgorCSAqLworCUk5MTVfV1JJVEUoR0VONl9SQ19TVEFURSwgMCk7CisJX19nZW42X2ZvcmNlX3dha2VfZ2V0KGRldl9wcml2KTsKKworCS8qIGRpc2FibGUgdGhlIGNvdW50ZXJzIGFuZCBzZXQgZGV0ZXJtaW5pc3RpYyB0aHJlc2hvbGRzICovCisJSTkxNV9XUklURShHRU42X1JDX0NPTlRST0wsIDApOworCisJSTkxNV9XUklURShHRU42X1JDMV9XQUtFX1JBVEVfTElNSVQsIDEwMDAgPDwgMTYpOworCUk5MTVfV1JJVEUoR0VONl9SQzZfV0FLRV9SQVRFX0xJTUlULCA0MCA8PCAxNiB8IDMwKTsKKwlJOTE1X1dSSVRFKEdFTjZfUkM2cHBfV0FLRV9SQVRFX0xJTUlULCAzMCk7CisJSTkxNV9XUklURShHRU42X1JDX0VWQUxVQVRJT05fSU5URVJWQUwsIDEyNTAwMCk7CisJSTkxNV9XUklURShHRU42X1JDX0lETEVfSFlTVEVSU0lTLCAyNSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgSTkxNV9OVU1fUklOR1M7IGkrKykKKwkJSTkxNV9XUklURShSSU5HX01BWF9JRExFKGRldl9wcml2LT5yaW5nW2ldLm1taW9fYmFzZSksIDEwKTsKKworCUk5MTVfV1JJVEUoR0VONl9SQ19TTEVFUCwgMCk7CisJSTkxNV9XUklURShHRU42X1JDMWVfVEhSRVNIT0xELCAxMDAwKTsKKwlJOTE1X1dSSVRFKEdFTjZfUkM2X1RIUkVTSE9MRCwgNTAwMDApOworCUk5MTVfV1JJVEUoR0VONl9SQzZwX1RIUkVTSE9MRCwgMTAwMDAwKTsKKwlJOTE1X1dSSVRFKEdFTjZfUkM2cHBfVEhSRVNIT0xELCA2NDAwMCk7IC8qIHVudXNlZCAqLworCisJSTkxNV9XUklURShHRU42X1JDX0NPTlRST0wsCisJCSAgIEdFTjZfUkNfQ1RMX1JDNnBfRU5BQkxFIHwKKwkJICAgR0VONl9SQ19DVExfUkM2X0VOQUJMRSB8CisJCSAgIEdFTjZfUkNfQ1RMX0VJX01PREUoMSkgfAorCQkgICBHRU42X1JDX0NUTF9IV19FTkFCTEUpOworCisJSTkxNV9XUklURShHRU42X1JQTlNXUkVRLAorCQkgICBHRU42X0ZSRVFVRU5DWSgxMCkgfAorCQkgICBHRU42X09GRlNFVCgwKSB8CisJCSAgIEdFTjZfQUdHUkVTU0lWRV9UVVJCTyk7CisJSTkxNV9XUklURShHRU42X1JDX1ZJREVPX0ZSRVEsCisJCSAgIEdFTjZfRlJFUVVFTkNZKDEyKSk7CisKKwlJOTE1X1dSSVRFKEdFTjZfUlBfRE9XTl9USU1FT1VULCAxMDAwMDAwKTsKKwlJOTE1X1dSSVRFKEdFTjZfUlBfSU5URVJSVVBUX0xJTUlUUywKKwkJICAgMTggPDwgMjQgfAorCQkgICA2IDw8IDE2KTsKKwlJOTE1X1dSSVRFKEdFTjZfUlBfVVBfVEhSRVNIT0xELCA5MDAwMCk7CisJSTkxNV9XUklURShHRU42X1JQX0RPV05fVEhSRVNIT0xELCAxMDAwMDApOworCUk5MTVfV1JJVEUoR0VONl9SUF9VUF9FSSwgMTAwMDAwKTsKKwlJOTE1X1dSSVRFKEdFTjZfUlBfRE9XTl9FSSwgMzAwMDAwKTsKKwlJOTE1X1dSSVRFKEdFTjZfUlBfSURMRV9IWVNURVJTSVMsIDEwKTsKKwlJOTE1X1dSSVRFKEdFTjZfUlBfQ09OVFJPTCwKKwkJICAgR0VONl9SUF9NRURJQV9UVVJCTyB8CisJCSAgIEdFTjZfUlBfVVNFX05PUk1BTF9GUkVRIHwKKwkJICAgR0VONl9SUF9NRURJQV9JU19HRlggfAorCQkgICBHRU42X1JQX0VOQUJMRSB8CisJCSAgIEdFTjZfUlBfVVBfQlVTWV9NQVggfAorCQkgICBHRU42X1JQX0RPV05fQlVTWV9NSU4pOworCisJaWYgKHdhaXRfZm9yKChJOTE1X1JFQUQoR0VONl9QQ09ERV9NQUlMQk9YKSAmIEdFTjZfUENPREVfUkVBRFkpID09IDAsCisJCSAgICAgNTAwKSkKKwkJRFJNX0VSUk9SKCJ0aW1lb3V0IHdhaXRpbmcgZm9yIHBjb2RlIG1haWxib3ggdG8gYmVjb21lIGlkbGVcbiIpOworCisJSTkxNV9XUklURShHRU42X1BDT0RFX0RBVEEsIDApOworCUk5MTVfV1JJVEUoR0VONl9QQ09ERV9NQUlMQk9YLAorCQkgICBHRU42X1BDT0RFX1JFQURZIHwKKwkJICAgR0VONl9QQ09ERV9XUklURV9NSU5fRlJFUV9UQUJMRSk7CisJaWYgKHdhaXRfZm9yKChJOTE1X1JFQUQoR0VONl9QQ09ERV9NQUlMQk9YKSAmIEdFTjZfUENPREVfUkVBRFkpID09IDAsCisJCSAgICAgNTAwKSkKKwkJRFJNX0VSUk9SKCJ0aW1lb3V0IHdhaXRpbmcgZm9yIHBjb2RlIG1haWxib3ggdG8gZmluaXNoXG4iKTsKKworCS8qIHJlcXVpcmVzIE1TSSBlbmFibGVkICovCisJSTkxNV9XUklURShHRU42X1BNSUVSLAorCQkgICBHRU42X1BNX01CT1hfRVZFTlQgfAorCQkgICBHRU42X1BNX1RIRVJNQUxfRVZFTlQgfAorCQkgICBHRU42X1BNX1JQX0RPV05fVElNRU9VVCB8CisJCSAgIEdFTjZfUE1fUlBfVVBfVEhSRVNIT0xEIHwKKwkJICAgR0VONl9QTV9SUF9ET1dOX1RIUkVTSE9MRCB8CisJCSAgIEdFTjZfUE1fUlBfVVBfRUlfRVhQSVJFRCB8CisJCSAgIEdFTjZfUE1fUlBfRE9XTl9FSV9FWFBJUkVEKTsKKwlJOTE1X1dSSVRFKEdFTjZfUE1JTVIsIDApOworCS8qIGVuYWJsZSBhbGwgUE0gaW50ZXJydXB0cyAqLworCUk5MTVfV1JJVEUoR0VONl9QTUlOVFJNU0ssIDApOworCisJX19nZW42X2ZvcmNlX3dha2VfcHV0KGRldl9wcml2KTsKK30KKwordm9pZCBpbnRlbF9lbmFibGVfY2xvY2tfZ2F0aW5nKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIApAQCAtNTg3Miw5ICs2MjgyLDkgQEAKIAkJCUk5MTVfV1JJVEUoRElTUF9BUkJfQ1RMLAogCQkJCQkoSTkxNV9SRUFEKERJU1BfQVJCX0NUTCkgfAogCQkJCQkJRElTUF9GQkNfV01fRElTKSk7Ci0JCUk5MTVfV1JJVEUoV00zX0xQX0lMSywgMCk7Ci0JCUk5MTVfV1JJVEUoV00yX0xQX0lMSywgMCk7Ci0JCUk5MTVfV1JJVEUoV00xX0xQX0lMSywgMCk7CisJCQlJOTE1X1dSSVRFKFdNM19MUF9JTEssIDApOworCQkJSTkxNV9XUklURShXTTJfTFBfSUxLLCAwKTsKKwkJCUk5MTVfV1JJVEUoV00xX0xQX0lMSywgMCk7CiAJCX0KIAkJLyoKIAkJICogQmFzZWQgb24gdGhlIGRvY3VtZW50IGZyb20gaGFyZHdhcmUgZ3V5cyB0aGUgZm9sbG93aW5nIGJpdHMKQEAgLTU4OTYsNyArNjMwNiw0OSBAQAogCQkJCSAgIElMS19EUEZDX0RJUzIgfAogCQkJCSAgIElMS19DTEtfRkJDKTsKIAkJfQotCQlyZXR1cm47CisKKwkJSTkxNV9XUklURShJTEtfRElTUExBWV9DSElDS0VOMiwKKwkJCSAgIEk5MTVfUkVBRChJTEtfRElTUExBWV9DSElDS0VOMikgfAorCQkJICAgSUxLX0VMUElOXzQwOV9TRUxFQ1QpOworCisJCWlmIChJU19HRU41KGRldikpIHsKKwkJCUk5MTVfV1JJVEUoXzNEX0NISUNLRU4yLAorCQkJCSAgIF8zRF9DSElDS0VOMl9XTV9SRUFEX1BJUEVMSU5FRCA8PCAxNiB8CisJCQkJICAgXzNEX0NISUNLRU4yX1dNX1JFQURfUElQRUxJTkVEKTsKKwkJfQorCisJCWlmIChJU19HRU42KGRldikpIHsKKwkJCUk5MTVfV1JJVEUoV00zX0xQX0lMSywgMCk7CisJCQlJOTE1X1dSSVRFKFdNMl9MUF9JTEssIDApOworCQkJSTkxNV9XUklURShXTTFfTFBfSUxLLCAwKTsKKworCQkJLyoKKwkJCSAqIEFjY29yZGluZyB0byB0aGUgc3BlYyB0aGUgZm9sbG93aW5nIGJpdHMgc2hvdWxkIGJlCisJCQkgKiBzZXQgaW4gb3JkZXIgdG8gZW5hYmxlIG1lbW9yeSBzZWxmLXJlZnJlc2ggYW5kIGZiYzoKKwkJCSAqIFRoZSBiaXQyMSBhbmQgYml0MjIgb2YgMHg0MjAwMAorCQkJICogVGhlIGJpdDIxIGFuZCBiaXQyMiBvZiAweDQyMDA0CisJCQkgKiBUaGUgYml0NSBhbmQgYml0NyBvZiAweDQyMDIwCisJCQkgKiBUaGUgYml0MTQgb2YgMHg3MDE4MAorCQkJICogVGhlIGJpdDE0IG9mIDB4NzExODAKKwkJCSAqLworCQkJSTkxNV9XUklURShJTEtfRElTUExBWV9DSElDS0VOMSwKKwkJCQkgICBJOTE1X1JFQUQoSUxLX0RJU1BMQVlfQ0hJQ0tFTjEpIHwKKwkJCQkgICBJTEtfRkJDUV9ESVMgfCBJTEtfUEFCU1RSRVRDSF9ESVMpOworCQkJSTkxNV9XUklURShJTEtfRElTUExBWV9DSElDS0VOMiwKKwkJCQkgICBJOTE1X1JFQUQoSUxLX0RJU1BMQVlfQ0hJQ0tFTjIpIHwKKwkJCQkgICBJTEtfRFBBUkJfR0FURSB8IElMS19WU0RQRkRfRlVMTCk7CisJCQlJOTE1X1dSSVRFKElMS19EU1BDTEtfR0FURSwKKwkJCQkgICBJOTE1X1JFQUQoSUxLX0RTUENMS19HQVRFKSB8CisJCQkJICAgSUxLX0RQQVJCX0NMS19HQVRFICB8CisJCQkJICAgSUxLX0RQRkRfQ0xLX0dBVEUpOworCisJCQlJOTE1X1dSSVRFKERTUEFDTlRSLAorCQkJCSAgIEk5MTVfUkVBRChEU1BBQ05UUikgfAorCQkJCSAgIERJU1BQTEFORV9UUklDS0xFX0ZFRURfRElTQUJMRSk7CisJCQlJOTE1X1dSSVRFKERTUEJDTlRSLAorCQkJCSAgIEk5MTVfUkVBRChEU1BCQ05UUikgfAorCQkJCSAgIERJU1BQTEFORV9UUklDS0xFX0ZFRURfRElTQUJMRSk7CisJCX0KIAl9IGVsc2UgaWYgKElTX0c0WChkZXYpKSB7CiAJCXVpbnQzMl90IGRzcGNsa19nYXRlOwogCQlJOTE1X1dSSVRFKFJFTkNMS19HQVRFX0QxLCAwKTsKQEAgLTU5MzksMjAgKzYzOTEsMTggQEAKIAkgKiBHUFUgY2FuIGF1dG9tYXRpY2FsbHkgcG93ZXIgZG93biB0aGUgcmVuZGVyIHVuaXQgaWYgZ2l2ZW4gYSBwYWdlCiAJICogdG8gc2F2ZSBzdGF0ZS4KIAkgKi8KLQlpZiAoSVNfSVJPTkxBS0VfTShkZXYpKSB7CisJaWYgKElTX0lST05MQUtFX00oZGV2KSAmJiAwKSB7IC8qIFhYWCBjYXVzZXMgYSBmYWlsdXJlIGR1cmluZyBzdXNwZW5kICovCiAJCWlmIChkZXZfcHJpdi0+cmVuZGVyY3R4ID09IE5VTEwpCiAJCQlkZXZfcHJpdi0+cmVuZGVyY3R4ID0gaW50ZWxfYWxsb2NfY29udGV4dF9wYWdlKGRldik7CiAJCWlmIChkZXZfcHJpdi0+cmVuZGVyY3R4KSB7Ci0JCQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqX3ByaXY7Ci0JCQlvYmpfcHJpdiA9IHRvX2ludGVsX2JvKGRldl9wcml2LT5yZW5kZXJjdHgpOwotCQkJaWYgKG9ial9wcml2KSB7Ci0JCQkJQkVHSU5fTFBfUklORyg0KTsKKwkJCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmogPSBkZXZfcHJpdi0+cmVuZGVyY3R4OworCQkJaWYgKEJFR0lOX0xQX1JJTkcoNCkgPT0gMCkgewogCQkJCU9VVF9SSU5HKE1JX1NFVF9DT05URVhUKTsKLQkJCQlPVVRfUklORyhvYmpfcHJpdi0+Z3R0X29mZnNldCB8Ci0JCQkJCQlNSV9NTV9TUEFDRV9HVFQgfAotCQkJCQkJTUlfU0FWRV9FWFRfU1RBVEVfRU4gfAotCQkJCQkJTUlfUkVTVE9SRV9FWFRfU1RBVEVfRU4gfAotCQkJCQkJTUlfUkVTVE9SRV9JTkhJQklUKTsKKwkJCQlPVVRfUklORyhvYmotPmd0dF9vZmZzZXQgfAorCQkJCQkgTUlfTU1fU1BBQ0VfR1RUIHwKKwkJCQkJIE1JX1NBVkVfRVhUX1NUQVRFX0VOIHwKKwkJCQkJIE1JX1JFU1RPUkVfRVhUX1NUQVRFX0VOIHwKKwkJCQkJIE1JX1JFU1RPUkVfSU5ISUJJVCk7CiAJCQkJT1VUX1JJTkcoTUlfTk9PUCk7CiAJCQkJT1VUX1JJTkcoTUlfRkxVU0gpOwogCQkJCUFEVkFOQ0VfTFBfUklORygpOwpAQCAtNTk2MiwyOSArNjQxMiw0NSBAQAogCQkJCSAgICAgICAiRGlzYWJsZSBSQzZcbiIpOwogCX0KIAotCWlmIChJOTE1X0hBU19SQzYoZGV2KSAmJiBkcm1fY29yZV9jaGVja19mZWF0dXJlKGRldiwgRFJJVkVSX01PREVTRVQpKSB7Ci0JCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmpfcHJpdiA9IE5VTEw7Ci0KKwlpZiAoSVNfR0VONChkZXYpICYmIElTX01PQklMRShkZXYpKSB7CisJCWlmIChkZXZfcHJpdi0+cHdyY3R4ID09IE5VTEwpCisJCQlkZXZfcHJpdi0+cHdyY3R4ID0gaW50ZWxfYWxsb2NfY29udGV4dF9wYWdlKGRldik7CiAJCWlmIChkZXZfcHJpdi0+cHdyY3R4KSB7Ci0JCQlvYmpfcHJpdiA9IHRvX2ludGVsX2JvKGRldl9wcml2LT5wd3JjdHgpOwotCQl9IGVsc2UgewotCQkJc3RydWN0IGRybV9nZW1fb2JqZWN0ICpwd3JjdHg7Ci0KLQkJCXB3cmN0eCA9IGludGVsX2FsbG9jX2NvbnRleHRfcGFnZShkZXYpOwotCQkJaWYgKHB3cmN0eCkgewotCQkJCWRldl9wcml2LT5wd3JjdHggPSBwd3JjdHg7Ci0JCQkJb2JqX3ByaXYgPSB0b19pbnRlbF9ibyhwd3JjdHgpOwotCQkJfQotCQl9Ci0KLQkJaWYgKG9ial9wcml2KSB7Ci0JCQlJOTE1X1dSSVRFKFBXUkNUWEEsIG9ial9wcml2LT5ndHRfb2Zmc2V0IHwgUFdSQ1RYX0VOKTsKKwkJCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmogPSBkZXZfcHJpdi0+cHdyY3R4OworCQkJSTkxNV9XUklURShQV1JDVFhBLCBvYmotPmd0dF9vZmZzZXQgfCBQV1JDVFhfRU4pOwogCQkJSTkxNV9XUklURShNQ0hCQVJfUkVOREVSX1NUQU5EQlksCiAJCQkJICAgSTkxNV9SRUFEKE1DSEJBUl9SRU5ERVJfU1RBTkRCWSkgJiB+UkNYX1NXX0VYSVQpOwogCQl9CiAJfQogfQogCit2b2lkIGludGVsX2Rpc2FibGVfY2xvY2tfZ2F0aW5nKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKworCWlmIChkZXZfcHJpdi0+cmVuZGVyY3R4KSB7CisJCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmogPSBkZXZfcHJpdi0+cmVuZGVyY3R4OworCisJCUk5MTVfV1JJVEUoQ0NJRCwgMCk7CisJCVBPU1RJTkdfUkVBRChDQ0lEKTsKKworCQlpOTE1X2dlbV9vYmplY3RfdW5waW4ob2JqKTsKKwkJZHJtX2dlbV9vYmplY3RfdW5yZWZlcmVuY2UoJm9iai0+YmFzZSk7CisJCWRldl9wcml2LT5yZW5kZXJjdHggPSBOVUxMOworCX0KKworCWlmIChkZXZfcHJpdi0+cHdyY3R4KSB7CisJCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmogPSBkZXZfcHJpdi0+cHdyY3R4OworCisJCUk5MTVfV1JJVEUoUFdSQ1RYQSwgMCk7CisJCVBPU1RJTkdfUkVBRChQV1JDVFhBKTsKKworCQlpOTE1X2dlbV9vYmplY3RfdW5waW4ob2JqKTsKKwkJZHJtX2dlbV9vYmplY3RfdW5yZWZlcmVuY2UoJm9iai0+YmFzZSk7CisJCWRldl9wcml2LT5wd3JjdHggPSBOVUxMOworCX0KK30KKwogLyogU2V0IHVwIGNoaXAgc3BlY2lmaWMgZGlzcGxheSBmdW5jdGlvbnMgKi8KIHN0YXRpYyB2b2lkIGludGVsX2luaXRfZGlzcGxheShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogewpAQCAtNTk5Nyw3ICs2NDYzLDcgQEAKIAkJZGV2X3ByaXYtPmRpc3BsYXkuZHBtcyA9IGk5eHhfY3J0Y19kcG1zOwogCiAJaWYgKEk5MTVfSEFTX0ZCQyhkZXYpKSB7Ci0JCWlmIChJU19JUk9OTEFLRV9NKGRldikpIHsKKwkJaWYgKEhBU19QQ0hfU1BMSVQoZGV2KSkgewogCQkJZGV2X3ByaXYtPmRpc3BsYXkuZmJjX2VuYWJsZWQgPSBpcm9ubGFrZV9mYmNfZW5hYmxlZDsKIAkJCWRldl9wcml2LT5kaXNwbGF5LmVuYWJsZV9mYmMgPSBpcm9ubGFrZV9lbmFibGVfZmJjOwogCQkJZGV2X3ByaXYtPmRpc3BsYXkuZGlzYWJsZV9mYmMgPSBpcm9ubGFrZV9kaXNhYmxlX2ZiYzsKQEAgLTYwNDYsNiArNjUxMiwxNCBAQAogCQkJCQkgICAgICAiRGlzYWJsZSBDeFNSXG4iKTsKIAkJCQlkZXZfcHJpdi0+ZGlzcGxheS51cGRhdGVfd20gPSBOVUxMOwogCQkJfQorCQl9IGVsc2UgaWYgKElTX0dFTjYoZGV2KSkgeworCQkJaWYgKFNOQl9SRUFEX1dNMF9MQVRFTkNZKCkpIHsKKwkJCQlkZXZfcHJpdi0+ZGlzcGxheS51cGRhdGVfd20gPSBzYW5keWJyaWRnZV91cGRhdGVfd207CisJCQl9IGVsc2UgeworCQkJCURSTV9ERUJVR19LTVMoIkZhaWxlZCB0byByZWFkIGRpc3BsYXkgcGxhbmUgbGF0ZW5jeS4gIgorCQkJCQkgICAgICAiRGlzYWJsZSBDeFNSXG4iKTsKKwkJCQlkZXZfcHJpdi0+ZGlzcGxheS51cGRhdGVfd20gPSBOVUxMOworCQkJfQogCQl9IGVsc2UKIAkJCWRldl9wcml2LT5kaXNwbGF5LnVwZGF0ZV93bSA9IE5VTEw7CiAJfSBlbHNlIGlmIChJU19QSU5FVklFVyhkZXYpKSB7CkBAIC02MjExLDcgKzY2ODUsNyBAQAogCiAJaW50ZWxfc2V0dXBfb3V0cHV0cyhkZXYpOwogCi0JaW50ZWxfaW5pdF9jbG9ja19nYXRpbmcoZGV2KTsKKwlpbnRlbF9lbmFibGVfY2xvY2tfZ2F0aW5nKGRldik7CiAKIAkvKiBKdXN0IGRpc2FibGUgaXQgb25jZSBhdCBzdGFydHVwICovCiAJaTkxNV9kaXNhYmxlX3ZnYShkZXYpOwpAQCAtNjIyMSw2ICs2Njk1LDkgQEAKIAkJaW50ZWxfaW5pdF9lbW9uKGRldik7CiAJfQogCisJaWYgKElTX0dFTjYoZGV2KSkKKwkJZ2VuNl9lbmFibGVfcnBzKGRldl9wcml2KTsKKwogCUlOSVRfV09SSygmZGV2X3ByaXYtPmlkbGVfd29yaywgaW50ZWxfaWRsZV91cGRhdGUpOwogCXNldHVwX3RpbWVyKCZkZXZfcHJpdi0+aWRsZV90aW1lciwgaW50ZWxfZ3B1X2lkbGVfdGltZXIsCiAJCSAgICAodW5zaWduZWQgbG9uZylkZXYpOwpAQCAtNjI1MiwyOCArNjcyOSwxMiBAQAogCWlmIChkZXZfcHJpdi0+ZGlzcGxheS5kaXNhYmxlX2ZiYykKIAkJZGV2X3ByaXYtPmRpc3BsYXkuZGlzYWJsZV9mYmMoZGV2KTsKIAotCWlmIChkZXZfcHJpdi0+cmVuZGVyY3R4KSB7Ci0JCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmpfcHJpdjsKLQotCQlvYmpfcHJpdiA9IHRvX2ludGVsX2JvKGRldl9wcml2LT5yZW5kZXJjdHgpOwotCQlJOTE1X1dSSVRFKENDSUQsIG9ial9wcml2LT5ndHRfb2Zmc2V0ICZ+IENDSURfRU4pOwotCQlJOTE1X1JFQUQoQ0NJRCk7Ci0JCWk5MTVfZ2VtX29iamVjdF91bnBpbihkZXZfcHJpdi0+cmVuZGVyY3R4KTsKLQkJZHJtX2dlbV9vYmplY3RfdW5yZWZlcmVuY2UoZGV2X3ByaXYtPnJlbmRlcmN0eCk7Ci0JfQotCi0JaWYgKGRldl9wcml2LT5wd3JjdHgpIHsKLQkJc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9ial9wcml2OwotCi0JCW9ial9wcml2ID0gdG9faW50ZWxfYm8oZGV2X3ByaXYtPnB3cmN0eCk7Ci0JCUk5MTVfV1JJVEUoUFdSQ1RYQSwgb2JqX3ByaXYtPmd0dF9vZmZzZXQgJn4gUFdSQ1RYX0VOKTsKLQkJSTkxNV9SRUFEKFBXUkNUWEEpOwotCQlpOTE1X2dlbV9vYmplY3RfdW5waW4oZGV2X3ByaXYtPnB3cmN0eCk7Ci0JCWRybV9nZW1fb2JqZWN0X3VucmVmZXJlbmNlKGRldl9wcml2LT5wd3JjdHgpOwotCX0KLQogCWlmIChJU19JUk9OTEFLRV9NKGRldikpCiAJCWlyb25sYWtlX2Rpc2FibGVfZHJwcyhkZXYpOworCWlmIChJU19HRU42KGRldikpCisJCWdlbjZfZGlzYWJsZV9ycHMoZGV2KTsKKworCWludGVsX2Rpc2FibGVfY2xvY2tfZ2F0aW5nKGRldik7CiAKIAltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKIApAQCAtNjMyNSwzICs2Nzg2LDExMyBAQAogCXBjaV93cml0ZV9jb25maWdfd29yZChkZXZfcHJpdi0+YnJpZGdlX2RldiwgSU5URUxfR01DSF9DVFJMLCBnbWNoX2N0cmwpOwogCXJldHVybiAwOwogfQorCisjaWZkZWYgQ09ORklHX0RFQlVHX0ZTCisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKworc3RydWN0IGludGVsX2Rpc3BsYXlfZXJyb3Jfc3RhdGUgeworCXN0cnVjdCBpbnRlbF9jdXJzb3JfZXJyb3Jfc3RhdGUgeworCQl1MzIgY29udHJvbDsKKwkJdTMyIHBvc2l0aW9uOworCQl1MzIgYmFzZTsKKwkJdTMyIHNpemU7CisJfSBjdXJzb3JbMl07CisKKwlzdHJ1Y3QgaW50ZWxfcGlwZV9lcnJvcl9zdGF0ZSB7CisJCXUzMiBjb25mOworCQl1MzIgc291cmNlOworCisJCXUzMiBodG90YWw7CisJCXUzMiBoYmxhbms7CisJCXUzMiBoc3luYzsKKwkJdTMyIHZ0b3RhbDsKKwkJdTMyIHZibGFuazsKKwkJdTMyIHZzeW5jOworCX0gcGlwZVsyXTsKKworCXN0cnVjdCBpbnRlbF9wbGFuZV9lcnJvcl9zdGF0ZSB7CisJCXUzMiBjb250cm9sOworCQl1MzIgc3RyaWRlOworCQl1MzIgc2l6ZTsKKwkJdTMyIHBvczsKKwkJdTMyIGFkZHI7CisJCXUzMiBzdXJmYWNlOworCQl1MzIgdGlsZV9vZmZzZXQ7CisJfSBwbGFuZVsyXTsKK307CisKK3N0cnVjdCBpbnRlbF9kaXNwbGF5X2Vycm9yX3N0YXRlICoKK2ludGVsX2Rpc3BsYXlfY2FwdHVyZV9lcnJvcl9zdGF0ZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworICAgICAgICBkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgaW50ZWxfZGlzcGxheV9lcnJvcl9zdGF0ZSAqZXJyb3I7CisJaW50IGk7CisKKwllcnJvciA9IGttYWxsb2Moc2l6ZW9mKCplcnJvciksIEdGUF9BVE9NSUMpOworCWlmIChlcnJvciA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKwkJZXJyb3ItPmN1cnNvcltpXS5jb250cm9sID0gSTkxNV9SRUFEKENVUkNOVFIoaSkpOworCQllcnJvci0+Y3Vyc29yW2ldLnBvc2l0aW9uID0gSTkxNV9SRUFEKENVUlBPUyhpKSk7CisJCWVycm9yLT5jdXJzb3JbaV0uYmFzZSA9IEk5MTVfUkVBRChDVVJCQVNFKGkpKTsKKworCQllcnJvci0+cGxhbmVbaV0uY29udHJvbCA9IEk5MTVfUkVBRChEU1BDTlRSKGkpKTsKKwkJZXJyb3ItPnBsYW5lW2ldLnN0cmlkZSA9IEk5MTVfUkVBRChEU1BTVFJJREUoaSkpOworCQllcnJvci0+cGxhbmVbaV0uc2l6ZSA9IEk5MTVfUkVBRChEU1BTSVpFKGkpKTsKKwkJZXJyb3ItPnBsYW5lW2ldLnBvcz0gSTkxNV9SRUFEKERTUFBPUyhpKSk7CisJCWVycm9yLT5wbGFuZVtpXS5hZGRyID0gSTkxNV9SRUFEKERTUEFERFIoaSkpOworCQlpZiAoSU5URUxfSU5GTyhkZXYpLT5nZW4gPj0gNCkgeworCQkJZXJyb3ItPnBsYW5lW2ldLnN1cmZhY2UgPSBJOTE1X1JFQUQoRFNQU1VSRihpKSk7CisJCQllcnJvci0+cGxhbmVbaV0udGlsZV9vZmZzZXQgPSBJOTE1X1JFQUQoRFNQVElMRU9GRihpKSk7CisJCX0KKworCQllcnJvci0+cGlwZVtpXS5jb25mID0gSTkxNV9SRUFEKFBJUEVDT05GKGkpKTsKKwkJZXJyb3ItPnBpcGVbaV0uc291cmNlID0gSTkxNV9SRUFEKFBJUEVTUkMoaSkpOworCQllcnJvci0+cGlwZVtpXS5odG90YWwgPSBJOTE1X1JFQUQoSFRPVEFMKGkpKTsKKwkJZXJyb3ItPnBpcGVbaV0uaGJsYW5rID0gSTkxNV9SRUFEKEhCTEFOSyhpKSk7CisJCWVycm9yLT5waXBlW2ldLmhzeW5jID0gSTkxNV9SRUFEKEhTWU5DKGkpKTsKKwkJZXJyb3ItPnBpcGVbaV0udnRvdGFsID0gSTkxNV9SRUFEKFZUT1RBTChpKSk7CisJCWVycm9yLT5waXBlW2ldLnZibGFuayA9IEk5MTVfUkVBRChWQkxBTksoaSkpOworCQllcnJvci0+cGlwZVtpXS52c3luYyA9IEk5MTVfUkVBRChWU1lOQyhpKSk7CisJfQorCisJcmV0dXJuIGVycm9yOworfQorCit2b2lkCitpbnRlbF9kaXNwbGF5X3ByaW50X2Vycm9yX3N0YXRlKHN0cnVjdCBzZXFfZmlsZSAqbSwKKwkJCQlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAorCQkJCXN0cnVjdCBpbnRlbF9kaXNwbGF5X2Vycm9yX3N0YXRlICplcnJvcikKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKwkJc2VxX3ByaW50ZihtLCAiUGlwZSBbJWRdOlxuIiwgaSk7CisJCXNlcV9wcmludGYobSwgIiAgQ09ORjogJTA4eFxuIiwgZXJyb3ItPnBpcGVbaV0uY29uZik7CisJCXNlcV9wcmludGYobSwgIiAgU1JDOiAlMDh4XG4iLCBlcnJvci0+cGlwZVtpXS5zb3VyY2UpOworCQlzZXFfcHJpbnRmKG0sICIgIEhUT1RBTDogJTA4eFxuIiwgZXJyb3ItPnBpcGVbaV0uaHRvdGFsKTsKKwkJc2VxX3ByaW50ZihtLCAiICBIQkxBTks6ICUwOHhcbiIsIGVycm9yLT5waXBlW2ldLmhibGFuayk7CisJCXNlcV9wcmludGYobSwgIiAgSFNZTkM6ICUwOHhcbiIsIGVycm9yLT5waXBlW2ldLmhzeW5jKTsKKwkJc2VxX3ByaW50ZihtLCAiICBWVE9UQUw6ICUwOHhcbiIsIGVycm9yLT5waXBlW2ldLnZ0b3RhbCk7CisJCXNlcV9wcmludGYobSwgIiAgVkJMQU5LOiAlMDh4XG4iLCBlcnJvci0+cGlwZVtpXS52YmxhbmspOworCQlzZXFfcHJpbnRmKG0sICIgIFZTWU5DOiAlMDh4XG4iLCBlcnJvci0+cGlwZVtpXS52c3luYyk7CisKKwkJc2VxX3ByaW50ZihtLCAiUGxhbmUgWyVkXTpcbiIsIGkpOworCQlzZXFfcHJpbnRmKG0sICIgIENOVFI6ICUwOHhcbiIsIGVycm9yLT5wbGFuZVtpXS5jb250cm9sKTsKKwkJc2VxX3ByaW50ZihtLCAiICBTVFJJREU6ICUwOHhcbiIsIGVycm9yLT5wbGFuZVtpXS5zdHJpZGUpOworCQlzZXFfcHJpbnRmKG0sICIgIFNJWkU6ICUwOHhcbiIsIGVycm9yLT5wbGFuZVtpXS5zaXplKTsKKwkJc2VxX3ByaW50ZihtLCAiICBQT1M6ICUwOHhcbiIsIGVycm9yLT5wbGFuZVtpXS5wb3MpOworCQlzZXFfcHJpbnRmKG0sICIgIEFERFI6ICUwOHhcbiIsIGVycm9yLT5wbGFuZVtpXS5hZGRyKTsKKwkJaWYgKElOVEVMX0lORk8oZGV2KS0+Z2VuID49IDQpIHsKKwkJCXNlcV9wcmludGYobSwgIiAgU1VSRjogJTA4eFxuIiwgZXJyb3ItPnBsYW5lW2ldLnN1cmZhY2UpOworCQkJc2VxX3ByaW50ZihtLCAiICBUSUxFT0ZGOiAlMDh4XG4iLCBlcnJvci0+cGxhbmVbaV0udGlsZV9vZmZzZXQpOworCQl9CisKKwkJc2VxX3ByaW50ZihtLCAiQ3Vyc29yIFslZF06XG4iLCBpKTsKKwkJc2VxX3ByaW50ZihtLCAiICBDTlRSOiAlMDh4XG4iLCBlcnJvci0+Y3Vyc29yW2ldLmNvbnRyb2wpOworCQlzZXFfcHJpbnRmKG0sICIgIFBPUzogJTA4eFxuIiwgZXJyb3ItPmN1cnNvcltpXS5wb3NpdGlvbik7CisJCXNlcV9wcmludGYobSwgIiAgQkFTRTogJTA4eFxuIiwgZXJyb3ItPmN1cnNvcltpXS5iYXNlKTsKKwl9Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2RwLmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9kcC5jCmluZGV4IDg2NDQxN2MuLjFkYzYwNDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2RwLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZHAuYwpAQCAtMTQ0Miw4ICsxNDQyLDcgQEAKIAkJLyogQ2hhbmdlcyB0byBlbmFibGUgb3Igc2VsZWN0IHRha2UgcGxhY2UgdGhlIHZibGFuawogCQkgKiBhZnRlciBiZWluZyB3cml0dGVuLgogCQkgKi8KLQkJaW50ZWxfd2FpdF9mb3JfdmJsYW5rKGludGVsX2RwLT5iYXNlLmJhc2UuZGV2LAotCQkJCSAgICAgIGludGVsX2NydGMtPnBpcGUpOworCQlpbnRlbF93YWl0X2Zvcl92YmxhbmsoZGV2LCBpbnRlbF9jcnRjLT5waXBlKTsKIAl9CiAKIAlJOTE1X1dSSVRFKGludGVsX2RwLT5vdXRwdXRfcmVnLCBEUCAmIH5EUF9QT1JUX0VOKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2Rydi5oIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZHJ2LmgKaW5kZXggZTUyYzYxMi4uZDc4MmFkOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZHJ2LmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZHJ2LmgKQEAgLTEyNyw3ICsxMjcsNyBAQAogCiBzdHJ1Y3QgaW50ZWxfZnJhbWVidWZmZXIgewogCXN0cnVjdCBkcm1fZnJhbWVidWZmZXIgYmFzZTsKLQlzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iajsKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqOwogfTsKIAogc3RydWN0IGludGVsX2ZiZGV2IHsKQEAgLTE2Niw3ICsxNjYsNyBAQAogCXN0cnVjdCBpbnRlbF91bnBpbl93b3JrICp1bnBpbl93b3JrOwogCWludCBmZGlfbGFuZXM7CiAKLQlzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKmN1cnNvcl9ibzsKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqY3Vyc29yX2JvOwogCXVpbnQzMl90IGN1cnNvcl9hZGRyOwogCWludDE2X3QgY3Vyc29yX3gsIGN1cnNvcl95OwogCWludDE2X3QgY3Vyc29yX3dpZHRoLCBjdXJzb3JfaGVpZ2h0OwpAQCAtMjIwLDggKzIyMCw4IEBACiBzdHJ1Y3QgaW50ZWxfdW5waW5fd29yayB7CiAJc3RydWN0IHdvcmtfc3RydWN0IHdvcms7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldjsKLQlzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9sZF9mYl9vYmo7Ci0Jc3RydWN0IGRybV9nZW1fb2JqZWN0ICpwZW5kaW5nX2ZsaXBfb2JqOworCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvbGRfZmJfb2JqOworCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpwZW5kaW5nX2ZsaXBfb2JqOwogCXN0cnVjdCBkcm1fcGVuZGluZ192YmxhbmtfZXZlbnQgKmV2ZW50OwogCWludCBwZW5kaW5nOwogCWJvb2wgZW5hYmxlX3N0YWxsX2NoZWNrOwpAQCAtMjM2LDcgKzIzNiw4IEBACiBleHRlcm4gYm9vbCBpbnRlbF9zZHZvX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IG91dHB1dF9kZXZpY2UpOwogZXh0ZXJuIHZvaWQgaW50ZWxfZHZvX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CiBleHRlcm4gdm9pZCBpbnRlbF90dl9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwotZXh0ZXJuIHZvaWQgaW50ZWxfbWFya19idXN5KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqKTsKK2V4dGVybiB2b2lkIGludGVsX21hcmtfYnVzeShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAorCQkJICAgIHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmopOwogZXh0ZXJuIGJvb2wgaW50ZWxfbHZkc19pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwogZXh0ZXJuIHZvaWQgaW50ZWxfZHBfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgZHBfcmVnKTsKIHZvaWQKQEAgLTI5MywxOSArMjk0LDIyIEBACiAJCQkJICAgIHUxNiBibHVlLCBpbnQgcmVnbm8pOwogZXh0ZXJuIHZvaWQgaW50ZWxfY3J0Y19mYl9nYW1tYV9nZXQoc3RydWN0IGRybV9jcnRjICpjcnRjLCB1MTYgKnJlZCwgdTE2ICpncmVlbiwKIAkJCQkgICAgdTE2ICpibHVlLCBpbnQgcmVnbm8pOwotZXh0ZXJuIHZvaWQgaW50ZWxfaW5pdF9jbG9ja19nYXRpbmcoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CitleHRlcm4gdm9pZCBpbnRlbF9lbmFibGVfY2xvY2tfZ2F0aW5nKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOworZXh0ZXJuIHZvaWQgaW50ZWxfZGlzYWJsZV9jbG9ja19nYXRpbmcoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CiBleHRlcm4gdm9pZCBpcm9ubGFrZV9lbmFibGVfZHJwcyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKIGV4dGVybiB2b2lkIGlyb25sYWtlX2Rpc2FibGVfZHJwcyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKK2V4dGVybiB2b2lkIGdlbjZfZW5hYmxlX3JwcyhzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYpOworZXh0ZXJuIHZvaWQgZ2VuNl9kaXNhYmxlX3JwcyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKIGV4dGVybiB2b2lkIGludGVsX2luaXRfZW1vbihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKIAogZXh0ZXJuIGludCBpbnRlbF9waW5fYW5kX2ZlbmNlX2ZiX29iaihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAotCQkJCSAgICAgIHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqLAotCQkJCSAgICAgIGJvb2wgcGlwZWxpbmVkKTsKKwkJCQkgICAgICBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqLAorCQkJCSAgICAgIHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcGlwZWxpbmVkKTsKIAogZXh0ZXJuIGludCBpbnRlbF9mcmFtZWJ1ZmZlcl9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCiAJCQkJICBzdHJ1Y3QgaW50ZWxfZnJhbWVidWZmZXIgKmlmYiwKIAkJCQkgIHN0cnVjdCBkcm1fbW9kZV9mYl9jbWQgKm1vZGVfY21kLAotCQkJCSAgc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmopOworCQkJCSAgc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaik7CiBleHRlcm4gaW50IGludGVsX2ZiZGV2X2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CiBleHRlcm4gdm9pZCBpbnRlbF9mYmRldl9maW5pKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9mYi5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZmIuYwppbmRleCBhZjJhMWRkLi43MDFlODMwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9mYi5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2ZiLmMKQEAgLTY1LDEwICs2NSw5IEBACiAJc3RydWN0IGZiX2luZm8gKmluZm87CiAJc3RydWN0IGRybV9mcmFtZWJ1ZmZlciAqZmI7CiAJc3RydWN0IGRybV9tb2RlX2ZiX2NtZCBtb2RlX2NtZDsKLQlzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKmZibyA9IE5VTEw7Ci0Jc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9ial9wcml2OworCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmo7CiAJc3RydWN0IGRldmljZSAqZGV2aWNlID0gJmRldi0+cGRldi0+ZGV2OwotCWludCBzaXplLCByZXQsIG1taW9fYmFyID0gSVNfR0VOMihkZXYpID8gMSA6IDA7CisJaW50IHNpemUsIHJldDsKIAogCS8qIHdlIGRvbid0IGRvIHBhY2tlZCAyNGJwcCAqLwogCWlmIChzaXplcy0+c3VyZmFjZV9icHAgPT0gMjQpCkBAIC04MywxOCArODIsMTcgQEAKIAogCXNpemUgPSBtb2RlX2NtZC5waXRjaCAqIG1vZGVfY21kLmhlaWdodDsKIAlzaXplID0gQUxJR04oc2l6ZSwgUEFHRV9TSVpFKTsKLQlmYm8gPSBpOTE1X2dlbV9hbGxvY19vYmplY3QoZGV2LCBzaXplKTsKLQlpZiAoIWZibykgeworCW9iaiA9IGk5MTVfZ2VtX2FsbG9jX29iamVjdChkZXYsIHNpemUpOworCWlmICghb2JqKSB7CiAJCURSTV9FUlJPUigiZmFpbGVkIHRvIGFsbG9jYXRlIGZyYW1lYnVmZmVyXG4iKTsKIAkJcmV0ID0gLUVOT01FTTsKIAkJZ290byBvdXQ7CiAJfQotCW9ial9wcml2ID0gdG9faW50ZWxfYm8oZmJvKTsKIAogCW11dGV4X2xvY2soJmRldi0+c3RydWN0X211dGV4KTsKIAogCS8qIEZsdXNoIGV2ZXJ5dGhpbmcgb3V0LCB3ZSdsbCBiZSBkb2luZyBHVFQgb25seSBmcm9tIG5vdyBvbiAqLwotCXJldCA9IGludGVsX3Bpbl9hbmRfZmVuY2VfZmJfb2JqKGRldiwgZmJvLCBmYWxzZSk7CisJcmV0ID0gaW50ZWxfcGluX2FuZF9mZW5jZV9mYl9vYmooZGV2LCBvYmosIGZhbHNlKTsKIAlpZiAocmV0KSB7CiAJCURSTV9FUlJPUigiZmFpbGVkIHRvIHBpbiBmYjogJWRcbiIsIHJldCk7CiAJCWdvdG8gb3V0X3VucmVmOwpAQCAtMTA4LDcgKzEwNiw3IEBACiAKIAlpbmZvLT5wYXIgPSBpZmJkZXY7CiAKLQlyZXQgPSBpbnRlbF9mcmFtZWJ1ZmZlcl9pbml0KGRldiwgJmlmYmRldi0+aWZiLCAmbW9kZV9jbWQsIGZibyk7CisJcmV0ID0gaW50ZWxfZnJhbWVidWZmZXJfaW5pdChkZXYsICZpZmJkZXYtPmlmYiwgJm1vZGVfY21kLCBvYmopOwogCWlmIChyZXQpCiAJCWdvdG8gb3V0X3VucGluOwogCkBAIC0xMzQsMTEgKzEzMiwxMCBAQAogCWVsc2UKIAkJaW5mby0+YXBlcnR1cmVzLT5yYW5nZXNbMF0uc2l6ZSA9IHBjaV9yZXNvdXJjZV9sZW4oZGV2LT5wZGV2LCAwKTsKIAotCWluZm8tPmZpeC5zbWVtX3N0YXJ0ID0gZGV2LT5tb2RlX2NvbmZpZy5mYl9iYXNlICsgb2JqX3ByaXYtPmd0dF9vZmZzZXQ7CisJaW5mby0+Zml4LnNtZW1fc3RhcnQgPSBkZXYtPm1vZGVfY29uZmlnLmZiX2Jhc2UgKyBvYmotPmd0dF9vZmZzZXQ7CiAJaW5mby0+Zml4LnNtZW1fbGVuID0gc2l6ZTsKIAotCWluZm8tPnNjcmVlbl9iYXNlID0gaW9yZW1hcF93YyhkZXYtPmFncC0+YmFzZSArIG9ial9wcml2LT5ndHRfb2Zmc2V0LAotCQkJCSAgICAgICBzaXplKTsKKwlpbmZvLT5zY3JlZW5fYmFzZSA9IGlvcmVtYXBfd2MoZGV2LT5hZ3AtPmJhc2UgKyBvYmotPmd0dF9vZmZzZXQsIHNpemUpOwogCWlmICghaW5mby0+c2NyZWVuX2Jhc2UpIHsKIAkJcmV0ID0gLUVOT1NQQzsKIAkJZ290byBvdXRfdW5waW47CkBAIC0xNTMsMTMgKzE1MCw4IEBACiAKIC8vCW1lbXNldChpbmZvLT5zY3JlZW5fYmFzZSwgMCwgc2l6ZSk7CiAKLQlkcm1fZmJfaGVscGVyX2ZpbGxfZml4KGluZm8sIGZiLT5waXRjaCwgZmItPmRlcHRoKTsKIAlkcm1fZmJfaGVscGVyX2ZpbGxfdmFyKGluZm8sICZpZmJkZXYtPmhlbHBlciwgc2l6ZXMtPmZiX3dpZHRoLCBzaXplcy0+ZmJfaGVpZ2h0KTsKIAotCS8qIEZJWE1FOiB3ZSByZWFsbHkgc2hvdWxkbid0IGV4cG9zZSBtbWlvIHNwYWNlIGF0IGFsbCAqLwotCWluZm8tPmZpeC5tbWlvX3N0YXJ0ID0gcGNpX3Jlc291cmNlX3N0YXJ0KGRldi0+cGRldiwgbW1pb19iYXIpOwotCWluZm8tPmZpeC5tbWlvX2xlbiA9IHBjaV9yZXNvdXJjZV9sZW4oZGV2LT5wZGV2LCBtbWlvX2Jhcik7Ci0KIAlpbmZvLT5waXhtYXAuc2l6ZSA9IDY0KjEwMjQ7CiAJaW5mby0+cGl4bWFwLmJ1Zl9hbGlnbiA9IDg7CiAJaW5mby0+cGl4bWFwLmFjY2Vzc19hbGlnbiA9IDMyOwpAQCAtMTY4LDcgKzE2MCw3IEBACiAKIAlEUk1fREVCVUdfS01TKCJhbGxvY2F0ZWQgJWR4JWQgZmI6IDB4JTA4eCwgYm8gJXBcbiIsCiAJCSAgICAgIGZiLT53aWR0aCwgZmItPmhlaWdodCwKLQkJICAgICAgb2JqX3ByaXYtPmd0dF9vZmZzZXQsIGZibyk7CisJCSAgICAgIG9iai0+Z3R0X29mZnNldCwgb2JqKTsKIAogCiAJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CkBAIC0xNzYsOSArMTY4LDkgQEAKIAlyZXR1cm4gMDsKIAogb3V0X3VucGluOgotCWk5MTVfZ2VtX29iamVjdF91bnBpbihmYm8pOworCWk5MTVfZ2VtX29iamVjdF91bnBpbihvYmopOwogb3V0X3VucmVmOgotCWRybV9nZW1fb2JqZWN0X3VucmVmZXJlbmNlKGZibyk7CisJZHJtX2dlbV9vYmplY3RfdW5yZWZlcmVuY2UoJm9iai0+YmFzZSk7CiAJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CiBvdXQ6CiAJcmV0dXJuIHJldDsKQEAgLTIyNSw3ICsyMTcsNyBAQAogCiAJZHJtX2ZyYW1lYnVmZmVyX2NsZWFudXAoJmlmYi0+YmFzZSk7CiAJaWYgKGlmYi0+b2JqKSB7Ci0JCWRybV9nZW1fb2JqZWN0X3VucmVmZXJlbmNlX3VubG9ja2VkKGlmYi0+b2JqKTsKKwkJZHJtX2dlbV9vYmplY3RfdW5yZWZlcmVuY2VfdW5sb2NrZWQoJmlmYi0+b2JqLT5iYXNlKTsKIAkJaWZiLT5vYmogPSBOVUxMOwogCX0KIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2kyYy5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfaTJjLmMKaW5kZXggM2RiYTA4Ni4uNTgwNDBmNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfaTJjLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfaTJjLmMKQEAgLTg1LDggKzg1LDkgQEAKIAogCS8qIE9uIG1vc3QgY2hpcHMsIHRoZXNlIGJpdHMgbXVzdCBiZSBwcmVzZXJ2ZWQgaW4gc29mdHdhcmUuICovCiAJaWYgKCFJU19JODMwKGRldikgJiYgIUlTXzg0NUcoZGV2KSkKLQkJcmVzZXJ2ZWQgPSBJOTE1X1JFQUQoZ3Bpby0+cmVnKSAmIChHUElPX0RBVEFfUFVMTFVQX0RJU0FCTEUgfAotCQkJCQkJICAgR1BJT19DTE9DS19QVUxMVVBfRElTQUJMRSk7CisJCXJlc2VydmVkID0gSTkxNV9SRUFEX05PVFJBQ0UoZ3Bpby0+cmVnKSAmCisJCQkJCSAgICAgKEdQSU9fREFUQV9QVUxMVVBfRElTQUJMRSB8CisJCQkJCSAgICAgIEdQSU9fQ0xPQ0tfUFVMTFVQX0RJU0FCTEUpOwogCiAJcmV0dXJuIHJlc2VydmVkOwogfQpAQCAtOTYsOSArOTcsOSBAQAogCXN0cnVjdCBpbnRlbF9ncGlvICpncGlvID0gZGF0YTsKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBncGlvLT5kZXZfcHJpdjsKIAl1MzIgcmVzZXJ2ZWQgPSBnZXRfcmVzZXJ2ZWQoZ3Bpbyk7Ci0JSTkxNV9XUklURShncGlvLT5yZWcsIHJlc2VydmVkIHwgR1BJT19DTE9DS19ESVJfTUFTSyk7Ci0JSTkxNV9XUklURShncGlvLT5yZWcsIHJlc2VydmVkKTsKLQlyZXR1cm4gKEk5MTVfUkVBRChncGlvLT5yZWcpICYgR1BJT19DTE9DS19WQUxfSU4pICE9IDA7CisJSTkxNV9XUklURV9OT1RSQUNFKGdwaW8tPnJlZywgcmVzZXJ2ZWQgfCBHUElPX0NMT0NLX0RJUl9NQVNLKTsKKwlJOTE1X1dSSVRFX05PVFJBQ0UoZ3Bpby0+cmVnLCByZXNlcnZlZCk7CisJcmV0dXJuIChJOTE1X1JFQURfTk9UUkFDRShncGlvLT5yZWcpICYgR1BJT19DTE9DS19WQUxfSU4pICE9IDA7CiB9CiAKIHN0YXRpYyBpbnQgZ2V0X2RhdGEodm9pZCAqZGF0YSkKQEAgLTEwNiw5ICsxMDcsOSBAQAogCXN0cnVjdCBpbnRlbF9ncGlvICpncGlvID0gZGF0YTsKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBncGlvLT5kZXZfcHJpdjsKIAl1MzIgcmVzZXJ2ZWQgPSBnZXRfcmVzZXJ2ZWQoZ3Bpbyk7Ci0JSTkxNV9XUklURShncGlvLT5yZWcsIHJlc2VydmVkIHwgR1BJT19EQVRBX0RJUl9NQVNLKTsKLQlJOTE1X1dSSVRFKGdwaW8tPnJlZywgcmVzZXJ2ZWQpOwotCXJldHVybiAoSTkxNV9SRUFEKGdwaW8tPnJlZykgJiBHUElPX0RBVEFfVkFMX0lOKSAhPSAwOworCUk5MTVfV1JJVEVfTk9UUkFDRShncGlvLT5yZWcsIHJlc2VydmVkIHwgR1BJT19EQVRBX0RJUl9NQVNLKTsKKwlJOTE1X1dSSVRFX05PVFJBQ0UoZ3Bpby0+cmVnLCByZXNlcnZlZCk7CisJcmV0dXJuIChJOTE1X1JFQURfTk9UUkFDRShncGlvLT5yZWcpICYgR1BJT19EQVRBX1ZBTF9JTikgIT0gMDsKIH0KIAogc3RhdGljIHZvaWQgc2V0X2Nsb2NrKHZvaWQgKmRhdGEsIGludCBzdGF0ZV9oaWdoKQpAQCAtMTI0LDcgKzEyNSw3IEBACiAJCWNsb2NrX2JpdHMgPSBHUElPX0NMT0NLX0RJUl9PVVQgfCBHUElPX0NMT0NLX0RJUl9NQVNLIHwKIAkJCUdQSU9fQ0xPQ0tfVkFMX01BU0s7CiAKLQlJOTE1X1dSSVRFKGdwaW8tPnJlZywgcmVzZXJ2ZWQgfCBjbG9ja19iaXRzKTsKKwlJOTE1X1dSSVRFX05PVFJBQ0UoZ3Bpby0+cmVnLCByZXNlcnZlZCB8IGNsb2NrX2JpdHMpOwogCVBPU1RJTkdfUkVBRChncGlvLT5yZWcpOwogfQogCkBAIC0xNDEsNyArMTQyLDcgQEAKIAkJZGF0YV9iaXRzID0gR1BJT19EQVRBX0RJUl9PVVQgfCBHUElPX0RBVEFfRElSX01BU0sgfAogCQkJR1BJT19EQVRBX1ZBTF9NQVNLOwogCi0JSTkxNV9XUklURShncGlvLT5yZWcsIHJlc2VydmVkIHwgZGF0YV9iaXRzKTsKKwlJOTE1X1dSSVRFX05PVFJBQ0UoZ3Bpby0+cmVnLCByZXNlcnZlZCB8IGRhdGFfYml0cyk7CiAJUE9TVElOR19SRUFEKGdwaW8tPnJlZyk7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2x2ZHMuYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2x2ZHMuYwppbmRleCAyNWJjZWRmLi5hYTIzMDcwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9sdmRzLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfbHZkcy5jCkBAIC0zMDQsMTQgKzMwNCwxMyBAQAogCQkJdTMyIHNjYWxlZF93aWR0aCA9IGFkanVzdGVkX21vZGUtPmhkaXNwbGF5ICogbW9kZS0+dmRpc3BsYXk7CiAJCQl1MzIgc2NhbGVkX2hlaWdodCA9IG1vZGUtPmhkaXNwbGF5ICogYWRqdXN0ZWRfbW9kZS0+dmRpc3BsYXk7CiAKLQkJCXBmaXRfY29udHJvbCB8PSBQRklUX0VOQUJMRTsKIAkJCS8qIDk2NSsgaXMgZWFzeSwgaXQgZG9lcyBldmVyeXRoaW5nIGluIGh3ICovCiAJCQlpZiAoc2NhbGVkX3dpZHRoID4gc2NhbGVkX2hlaWdodCkKLQkJCQlwZml0X2NvbnRyb2wgfD0gUEZJVF9TQ0FMSU5HX1BJTExBUjsKKwkJCQlwZml0X2NvbnRyb2wgfD0gUEZJVF9FTkFCTEUgfCBQRklUX1NDQUxJTkdfUElMTEFSOwogCQkJZWxzZSBpZiAoc2NhbGVkX3dpZHRoIDwgc2NhbGVkX2hlaWdodCkKLQkJCQlwZml0X2NvbnRyb2wgfD0gUEZJVF9TQ0FMSU5HX0xFVFRFUjsKLQkJCWVsc2UKLQkJCQlwZml0X2NvbnRyb2wgfD0gUEZJVF9TQ0FMSU5HX0FVVE87CisJCQkJcGZpdF9jb250cm9sIHw9IFBGSVRfRU5BQkxFIHwgUEZJVF9TQ0FMSU5HX0xFVFRFUjsKKwkJCWVsc2UgaWYgKGFkanVzdGVkX21vZGUtPmhkaXNwbGF5ICE9IG1vZGUtPmhkaXNwbGF5KQorCQkJCXBmaXRfY29udHJvbCB8PSBQRklUX0VOQUJMRSB8IFBGSVRfU0NBTElOR19BVVRPOwogCQl9IGVsc2UgewogCQkJdTMyIHNjYWxlZF93aWR0aCA9IGFkanVzdGVkX21vZGUtPmhkaXNwbGF5ICogbW9kZS0+dmRpc3BsYXk7CiAJCQl1MzIgc2NhbGVkX2hlaWdodCA9IG1vZGUtPmhkaXNwbGF5ICogYWRqdXN0ZWRfbW9kZS0+dmRpc3BsYXk7CkBAIC0zNTgsMTMgKzM1NywxNyBAQAogCQkgKiBGdWxsIHNjYWxpbmcsIGV2ZW4gaWYgaXQgY2hhbmdlcyB0aGUgYXNwZWN0IHJhdGlvLgogCQkgKiBGb3J0dW5hdGVseSB0aGlzIGlzIGFsbCBkb25lIGZvciB1cyBpbiBody4KIAkJICovCi0JCXBmaXRfY29udHJvbCB8PSBQRklUX0VOQUJMRTsKLQkJaWYgKElOVEVMX0lORk8oZGV2KS0+Z2VuID49IDQpCi0JCQlwZml0X2NvbnRyb2wgfD0gUEZJVF9TQ0FMSU5HX0FVVE87Ci0JCWVsc2UKLQkJCXBmaXRfY29udHJvbCB8PSAoVkVSVF9BVVRPX1NDQUxFIHwgSE9SSVpfQVVUT19TQ0FMRSB8Ci0JCQkJCSBWRVJUX0lOVEVSUF9CSUxJTkVBUiB8Ci0JCQkJCSBIT1JJWl9JTlRFUlBfQklMSU5FQVIpOworCQlpZiAobW9kZS0+dmRpc3BsYXkgIT0gYWRqdXN0ZWRfbW9kZS0+dmRpc3BsYXkgfHwKKwkJICAgIG1vZGUtPmhkaXNwbGF5ICE9IGFkanVzdGVkX21vZGUtPmhkaXNwbGF5KSB7CisJCQlwZml0X2NvbnRyb2wgfD0gUEZJVF9FTkFCTEU7CisJCQlpZiAoSU5URUxfSU5GTyhkZXYpLT5nZW4gPj0gNCkKKwkJCQlwZml0X2NvbnRyb2wgfD0gUEZJVF9TQ0FMSU5HX0FVVE87CisJCQllbHNlCisJCQkJcGZpdF9jb250cm9sIHw9IChWRVJUX0FVVE9fU0NBTEUgfAorCQkJCQkJIFZFUlRfSU5URVJQX0JJTElORUFSIHwKKwkJCQkJCSBIT1JJWl9BVVRPX1NDQUxFIHwKKwkJCQkJCSBIT1JJWl9JTlRFUlBfQklMSU5FQVIpOworCQl9CiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKQEAgLTkxNCw2ICs5MTcsOCBAQAogCiAJaW50ZWxfZW5jb2Rlci0+Y2xvbmVfbWFzayA9ICgxIDw8IElOVEVMX0xWRFNfQ0xPTkVfQklUKTsKIAlpbnRlbF9lbmNvZGVyLT5jcnRjX21hc2sgPSAoMSA8PCAxKTsKKwlpZiAoSU5URUxfSU5GTyhkZXYpLT5nZW4gPj0gNSkKKwkJaW50ZWxfZW5jb2Rlci0+Y3J0Y19tYXNrIHw9ICgxIDw8IDApOwogCWRybV9lbmNvZGVyX2hlbHBlcl9hZGQoZW5jb2RlciwgJmludGVsX2x2ZHNfaGVscGVyX2Z1bmNzKTsKIAlkcm1fY29ubmVjdG9yX2hlbHBlcl9hZGQoY29ubmVjdG9yLCAmaW50ZWxfbHZkc19jb25uZWN0b3JfaGVscGVyX2Z1bmNzKTsKIAljb25uZWN0b3ItPmRpc3BsYXlfaW5mby5zdWJwaXhlbF9vcmRlciA9IFN1YlBpeGVsSG9yaXpvbnRhbFJHQjsKQEAgLTEwMTksMTAgKzEwMjQsMTggQEAKIG91dDoKIAlpZiAoSEFTX1BDSF9TUExJVChkZXYpKSB7CiAJCXUzMiBwd207Ci0JCS8qIG1ha2Ugc3VyZSBQV00gaXMgZW5hYmxlZCAqLworCisJCXBpcGUgPSAoSTkxNV9SRUFEKFBDSF9MVkRTKSAmIExWRFNfUElQRUJfU0VMRUNUKSA/IDEgOiAwOworCisJCS8qIG1ha2Ugc3VyZSBQV00gaXMgZW5hYmxlZCBhbmQgbG9ja2VkIHRvIHRoZSBMVkRTIHBpcGUgKi8KIAkJcHdtID0gSTkxNV9SRUFEKEJMQ19QV01fQ1BVX0NUTDIpOwotCQlwd20gfD0gKFBXTV9FTkFCTEUgfCBQV01fUElQRV9CKTsKLQkJSTkxNV9XUklURShCTENfUFdNX0NQVV9DVEwyLCBwd20pOworCQlpZiAocGlwZSA9PSAwICYmIChwd20gJiBQV01fUElQRV9CKSkKKwkJCUk5MTVfV1JJVEUoQkxDX1BXTV9DUFVfQ1RMMiwgcHdtICYgflBXTV9FTkFCTEUpOworCQlpZiAocGlwZSkKKwkJCXB3bSB8PSBQV01fUElQRV9COworCQllbHNlCisJCQlwd20gJj0gflBXTV9QSVBFX0I7CisJCUk5MTVfV1JJVEUoQkxDX1BXTV9DUFVfQ1RMMiwgcHdtIHwgUFdNX0VOQUJMRSk7CiAKIAkJcHdtID0gSTkxNV9SRUFEKEJMQ19QV01fUENIX0NUTDEpOwogCQlwd20gfD0gUFdNX1BDSF9FTkFCTEU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9vcHJlZ2lvbi5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfb3ByZWdpb24uYwppbmRleCA5YjBkOWE4Li5mMjk1YTdhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9vcHJlZ2lvbi5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX29wcmVnaW9uLmMKQEAgLTI3MywxNCArMjczLDggQEAKIAlzdHJ1Y3Qgb3ByZWdpb25fYXNsZSAqYXNsZSA9IGRldl9wcml2LT5vcHJlZ2lvbi5hc2xlOwogCiAJaWYgKGFzbGUpIHsKLQkJaWYgKElTX01PQklMRShkZXYpKSB7Ci0JCQl1bnNpZ25lZCBsb25nIGlycWZsYWdzOwotCi0JCQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2X3ByaXYtPnVzZXJfaXJxX2xvY2ssIGlycWZsYWdzKTsKKwkJaWYgKElTX01PQklMRShkZXYpKQogCQkJaW50ZWxfZW5hYmxlX2FzbGUoZGV2KTsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldl9wcml2LT51c2VyX2lycV9sb2NrLAotCQkJCQkgICAgICAgaXJxZmxhZ3MpOwotCQl9CiAKIAkJYXNsZS0+dGNoZSA9IEFTTEVfQUxTX0VOIHwgQVNMRV9CTENfRU4gfCBBU0xFX1BGSVRfRU4gfAogCQkJQVNMRV9QRk1CX0VOOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfb3ZlcmxheS5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfb3ZlcmxheS5jCmluZGV4IDAyZmYwYTQuLjNmYmI5OGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX292ZXJsYXkuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9vdmVybGF5LmMKQEAgLTIyMSwxNSArMjIxLDE2IEBACiAJaW50IHJldDsKIAogCUJVR19PTihvdmVybGF5LT5sYXN0X2ZsaXBfcmVxKTsKLQlvdmVybGF5LT5sYXN0X2ZsaXBfcmVxID0KLQkJaTkxNV9hZGRfcmVxdWVzdChkZXYsIE5VTEwsIHJlcXVlc3QsICZkZXZfcHJpdi0+cmVuZGVyX3JpbmcpOwotCWlmIChvdmVybGF5LT5sYXN0X2ZsaXBfcmVxID09IDApCi0JCXJldHVybiAtRU5PTUVNOwotCisJcmV0ID0gaTkxNV9hZGRfcmVxdWVzdChkZXYsIE5VTEwsIHJlcXVlc3QsIExQX1JJTkcoZGV2X3ByaXYpKTsKKwlpZiAocmV0KSB7CisJICAgIGtmcmVlKHJlcXVlc3QpOworCSAgICByZXR1cm4gcmV0OworCX0KKwlvdmVybGF5LT5sYXN0X2ZsaXBfcmVxID0gcmVxdWVzdC0+c2Vxbm87CiAJb3ZlcmxheS0+ZmxpcF90YWlsID0gdGFpbDsKIAlyZXQgPSBpOTE1X2RvX3dhaXRfcmVxdWVzdChkZXYsCiAJCQkJICAgb3ZlcmxheS0+bGFzdF9mbGlwX3JlcSwgdHJ1ZSwKLQkJCQkgICAmZGV2X3ByaXYtPnJlbmRlcl9yaW5nKTsKKwkJCQkgICBMUF9SSU5HKGRldl9wcml2KSk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIApAQCAtMjg5LDYgKzI5MCw3IEBACiBzdGF0aWMgaW50IGludGVsX292ZXJsYXlfb24oc3RydWN0IGludGVsX292ZXJsYXkgKm92ZXJsYXkpCiB7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IG92ZXJsYXktPmRldjsKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXN0cnVjdCBkcm1faTkxNV9nZW1fcmVxdWVzdCAqcmVxdWVzdDsKIAlpbnQgcGlwZV9hX3F1aXJrID0gMDsKIAlpbnQgcmV0OwpAQCAtMzA4LDcgKzMxMCwxMiBAQAogCQlnb3RvIG91dDsKIAl9CiAKLQlCRUdJTl9MUF9SSU5HKDQpOworCXJldCA9IEJFR0lOX0xQX1JJTkcoNCk7CisJaWYgKHJldCkgeworCQlrZnJlZShyZXF1ZXN0KTsKKwkJZ290byBvdXQ7CisJfQorCiAJT1VUX1JJTkcoTUlfT1ZFUkxBWV9GTElQIHwgTUlfT1ZFUkxBWV9PTik7CiAJT1VUX1JJTkcob3ZlcmxheS0+ZmxpcF9hZGRyIHwgT0ZDX1VQREFURSk7CiAJT1VUX1JJTkcoTUlfV0FJVF9GT1JfRVZFTlQgfCBNSV9XQUlUX0ZPUl9PVkVSTEFZX0ZMSVApOwpAQCAtMzMyLDYgKzMzOSw3IEBACiAJc3RydWN0IGRybV9pOTE1X2dlbV9yZXF1ZXN0ICpyZXF1ZXN0OwogCXUzMiBmbGlwX2FkZHIgPSBvdmVybGF5LT5mbGlwX2FkZHI7CiAJdTMyIHRtcDsKKwlpbnQgcmV0OwogCiAJQlVHX09OKCFvdmVybGF5LT5hY3RpdmUpOwogCkBAIC0zNDcsMzYgKzM1NSw0NCBAQAogCWlmICh0bXAgJiAoMSA8PCAxNykpCiAJCURSTV9ERUJVRygib3ZlcmxheSB1bmRlcnJ1biwgRE9WU1RBOiAleFxuIiwgdG1wKTsKIAotCUJFR0lOX0xQX1JJTkcoMik7CisJcmV0ID0gQkVHSU5fTFBfUklORygyKTsKKwlpZiAocmV0KSB7CisJCWtmcmVlKHJlcXVlc3QpOworCQlyZXR1cm4gcmV0OworCX0KIAlPVVRfUklORyhNSV9PVkVSTEFZX0ZMSVAgfCBNSV9PVkVSTEFZX0NPTlRJTlVFKTsKIAlPVVRfUklORyhmbGlwX2FkZHIpOwogICAgICAgICBBRFZBTkNFX0xQX1JJTkcoKTsKIAotCW92ZXJsYXktPmxhc3RfZmxpcF9yZXEgPQotCQlpOTE1X2FkZF9yZXF1ZXN0KGRldiwgTlVMTCwgcmVxdWVzdCwgJmRldl9wcml2LT5yZW5kZXJfcmluZyk7CisJcmV0ID0gaTkxNV9hZGRfcmVxdWVzdChkZXYsIE5VTEwsIHJlcXVlc3QsIExQX1JJTkcoZGV2X3ByaXYpKTsKKwlpZiAocmV0KSB7CisJCWtmcmVlKHJlcXVlc3QpOworCQlyZXR1cm4gcmV0OworCX0KKworCW92ZXJsYXktPmxhc3RfZmxpcF9yZXEgPSByZXF1ZXN0LT5zZXFubzsKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgaW50ZWxfb3ZlcmxheV9yZWxlYXNlX29sZF92aWRfdGFpbChzdHJ1Y3QgaW50ZWxfb3ZlcmxheSAqb3ZlcmxheSkKIHsKLQlzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iaiA9ICZvdmVybGF5LT5vbGRfdmlkX2JvLT5iYXNlOworCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmogPSBvdmVybGF5LT5vbGRfdmlkX2JvOwogCiAJaTkxNV9nZW1fb2JqZWN0X3VucGluKG9iaik7Ci0JZHJtX2dlbV9vYmplY3RfdW5yZWZlcmVuY2Uob2JqKTsKKwlkcm1fZ2VtX29iamVjdF91bnJlZmVyZW5jZSgmb2JqLT5iYXNlKTsKIAogCW92ZXJsYXktPm9sZF92aWRfYm8gPSBOVUxMOwogfQogCiBzdGF0aWMgdm9pZCBpbnRlbF9vdmVybGF5X29mZl90YWlsKHN0cnVjdCBpbnRlbF9vdmVybGF5ICpvdmVybGF5KQogewotCXN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqOworCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmogPSBvdmVybGF5LT52aWRfYm87CiAKIAkvKiBuZXZlciBoYXZlIHRoZSBvdmVybGF5IGh3IG9uIHdpdGhvdXQgc2hvd2luZyBhIGZyYW1lICovCiAJQlVHX09OKCFvdmVybGF5LT52aWRfYm8pOwotCW9iaiA9ICZvdmVybGF5LT52aWRfYm8tPmJhc2U7CiAKIAlpOTE1X2dlbV9vYmplY3RfdW5waW4ob2JqKTsKLQlkcm1fZ2VtX29iamVjdF91bnJlZmVyZW5jZShvYmopOworCWRybV9nZW1fb2JqZWN0X3VucmVmZXJlbmNlKCZvYmotPmJhc2UpOwogCW92ZXJsYXktPnZpZF9ibyA9IE5VTEw7CiAKIAlvdmVybGF5LT5jcnRjLT5vdmVybGF5ID0gTlVMTDsKQEAgLTM4OSw4ICs0MDUsMTAgQEAKIAkJCSAgICAgYm9vbCBpbnRlcnJ1cHRpYmxlKQogewogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBvdmVybGF5LT5kZXY7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAl1MzIgZmxpcF9hZGRyID0gb3ZlcmxheS0+ZmxpcF9hZGRyOwogCXN0cnVjdCBkcm1faTkxNV9nZW1fcmVxdWVzdCAqcmVxdWVzdDsKKwlpbnQgcmV0OwogCiAJQlVHX09OKCFvdmVybGF5LT5hY3RpdmUpOwogCkBAIC00MDQsNyArNDIyLDExIEBACiAJICogb2YgdGhlIGh3LiBEbyBpdCBpbiBib3RoIGNhc2VzICovCiAJZmxpcF9hZGRyIHw9IE9GQ19VUERBVEU7CiAKLQlCRUdJTl9MUF9SSU5HKDYpOworCXJldCA9IEJFR0lOX0xQX1JJTkcoNik7CisJaWYgKHJldCkgeworCQlrZnJlZShyZXF1ZXN0KTsKKwkJcmV0dXJuIHJldDsKKwl9CiAJLyogd2FpdCBmb3Igb3ZlcmxheSB0byBnbyBpZGxlICovCiAJT1VUX1JJTkcoTUlfT1ZFUkxBWV9GTElQIHwgTUlfT1ZFUkxBWV9DT05USU5VRSk7CiAJT1VUX1JJTkcoZmxpcF9hZGRyKTsKQEAgLTQzMiw3ICs0NTQsNyBAQAogCQlyZXR1cm4gMDsKIAogCXJldCA9IGk5MTVfZG9fd2FpdF9yZXF1ZXN0KGRldiwgb3ZlcmxheS0+bGFzdF9mbGlwX3JlcSwKLQkJCQkgICBpbnRlcnJ1cHRpYmxlLCAmZGV2X3ByaXYtPnJlbmRlcl9yaW5nKTsKKwkJCQkgICBpbnRlcnJ1cHRpYmxlLCBMUF9SSU5HKGRldl9wcml2KSk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIApAQCAtNDY3LDcgKzQ4OSwxMiBAQAogCQlpZiAocmVxdWVzdCA9PSBOVUxMKQogCQkJcmV0dXJuIC1FTk9NRU07CiAKLQkJQkVHSU5fTFBfUklORygyKTsKKwkJcmV0ID0gQkVHSU5fTFBfUklORygyKTsKKwkJaWYgKHJldCkgeworCQkJa2ZyZWUocmVxdWVzdCk7CisJCQlyZXR1cm4gcmV0OworCQl9CisKIAkJT1VUX1JJTkcoTUlfV0FJVF9GT1JfRVZFTlQgfCBNSV9XQUlUX0ZPUl9PVkVSTEFZX0ZMSVApOwogCQlPVVRfUklORyhNSV9OT09QKTsKIAkJQURWQU5DRV9MUF9SSU5HKCk7CkBAIC03MzYsMTMgKzc2MywxMiBAQAogfQogCiBzdGF0aWMgaW50IGludGVsX292ZXJsYXlfZG9fcHV0X2ltYWdlKHN0cnVjdCBpbnRlbF9vdmVybGF5ICpvdmVybGF5LAotCQkJCSAgICAgIHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqbmV3X2JvLAorCQkJCSAgICAgIHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpuZXdfYm8sCiAJCQkJICAgICAgc3RydWN0IHB1dF9pbWFnZV9wYXJhbXMgKnBhcmFtcykKIHsKIAlpbnQgcmV0LCB0bXBfd2lkdGg7CiAJc3RydWN0IG92ZXJsYXlfcmVnaXN0ZXJzICpyZWdzOwogCWJvb2wgc2NhbGVfY2hhbmdlZCA9IGZhbHNlOwotCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpib19wcml2ID0gdG9faW50ZWxfYm8obmV3X2JvKTsKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gb3ZlcmxheS0+ZGV2OwogCiAJQlVHX09OKCFtdXRleF9pc19sb2NrZWQoJmRldi0+c3RydWN0X211dGV4KSk7CkBAIC03NTMsNyArNzc5LDcgQEAKIAlpZiAocmV0ICE9IDApCiAJCXJldHVybiByZXQ7CiAKLQlyZXQgPSBpOTE1X2dlbV9vYmplY3RfcGluKG5ld19ibywgUEFHRV9TSVpFKTsKKwlyZXQgPSBpOTE1X2dlbV9vYmplY3RfcGluKG5ld19ibywgUEFHRV9TSVpFLCB0cnVlKTsKIAlpZiAocmV0ICE9IDApCiAJCXJldHVybiByZXQ7CiAKQEAgLTc2MSw2ICs3ODcsMTAgQEAKIAlpZiAocmV0ICE9IDApCiAJCWdvdG8gb3V0X3VucGluOwogCisJcmV0ID0gaTkxNV9nZW1fb2JqZWN0X3B1dF9mZW5jZShuZXdfYm8pOworCWlmIChyZXQpCisJCWdvdG8gb3V0X3VucGluOworCiAJaWYgKCFvdmVybGF5LT5hY3RpdmUpIHsKIAkJcmVncyA9IGludGVsX292ZXJsYXlfbWFwX3JlZ3Mob3ZlcmxheSk7CiAJCWlmICghcmVncykgewpAQCAtNzk3LDcgKzgyNyw3IEBACiAJcmVncy0+U1dJRFRIU1cgPSBjYWxjX3N3aWR0aHN3KG92ZXJsYXktPmRldiwKIAkJCQkgICAgICAgcGFyYW1zLT5vZmZzZXRfWSwgdG1wX3dpZHRoKTsKIAlyZWdzLT5TSEVJR0hUID0gcGFyYW1zLT5zcmNfaDsKLQlyZWdzLT5PQlVGXzBZID0gYm9fcHJpdi0+Z3R0X29mZnNldCArIHBhcmFtcy0+IG9mZnNldF9ZOworCXJlZ3MtPk9CVUZfMFkgPSBuZXdfYm8tPmd0dF9vZmZzZXQgKyBwYXJhbXMtPiBvZmZzZXRfWTsKIAlyZWdzLT5PU1RSSURFID0gcGFyYW1zLT5zdHJpZGVfWTsKIAogCWlmIChwYXJhbXMtPmZvcm1hdCAmIEk5MTVfT1ZFUkxBWV9ZVVZfUExBTkFSKSB7CkBAIC04MTEsOCArODQxLDggQEAKIAkJCQkgICAgICBwYXJhbXMtPnNyY193L3V2X2hzY2FsZSk7CiAJCXJlZ3MtPlNXSURUSFNXIHw9IG1heF90KHUzMiwgdG1wX1UsIHRtcF9WKSA8PCAxNjsKIAkJcmVncy0+U0hFSUdIVCB8PSAocGFyYW1zLT5zcmNfaC91dl92c2NhbGUpIDw8IDE2OwotCQlyZWdzLT5PQlVGXzBVID0gYm9fcHJpdi0+Z3R0X29mZnNldCArIHBhcmFtcy0+b2Zmc2V0X1U7Ci0JCXJlZ3MtPk9CVUZfMFYgPSBib19wcml2LT5ndHRfb2Zmc2V0ICsgcGFyYW1zLT5vZmZzZXRfVjsKKwkJcmVncy0+T0JVRl8wVSA9IG5ld19iby0+Z3R0X29mZnNldCArIHBhcmFtcy0+b2Zmc2V0X1U7CisJCXJlZ3MtPk9CVUZfMFYgPSBuZXdfYm8tPmd0dF9vZmZzZXQgKyBwYXJhbXMtPm9mZnNldF9WOwogCQlyZWdzLT5PU1RSSURFIHw9IHBhcmFtcy0+c3RyaWRlX1VWIDw8IDE2OwogCX0KIApAQCAtODI5LDcgKzg1OSw3IEBACiAJCWdvdG8gb3V0X3VucGluOwogCiAJb3ZlcmxheS0+b2xkX3ZpZF9ibyA9IG92ZXJsYXktPnZpZF9ibzsKLQlvdmVybGF5LT52aWRfYm8gPSB0b19pbnRlbF9ibyhuZXdfYm8pOworCW92ZXJsYXktPnZpZF9ibyA9IG5ld19ibzsKIAogCXJldHVybiAwOwogCkBAIC05NDIsNyArOTcyLDcgQEAKIAogc3RhdGljIGludCBjaGVja19vdmVybGF5X3NyYyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAogCQkJICAgICBzdHJ1Y3QgZHJtX2ludGVsX292ZXJsYXlfcHV0X2ltYWdlICpyZWMsCi0JCQkgICAgIHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqbmV3X2JvKQorCQkJICAgICBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqbmV3X2JvKQogewogCWludCB1dl9oc2NhbGUgPSB1dl9oc3Vic2FtcGxpbmcocmVjLT5mbGFncyk7CiAJaW50IHV2X3ZzY2FsZSA9IHV2X3ZzdWJzYW1wbGluZyhyZWMtPmZsYWdzKTsKQEAgLTEwMjcsNyArMTA1Nyw3IEBACiAJCQlyZXR1cm4gLUVJTlZBTDsKIAogCQl0bXAgPSByZWMtPnN0cmlkZV9ZKnJlYy0+c3JjX2hlaWdodDsKLQkJaWYgKHJlYy0+b2Zmc2V0X1kgKyB0bXAgPiBuZXdfYm8tPnNpemUpCisJCWlmIChyZWMtPm9mZnNldF9ZICsgdG1wID4gbmV3X2JvLT5iYXNlLnNpemUpCiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJYnJlYWs7CiAKQEAgLTEwMzgsMTIgKzEwNjgsMTIgQEAKIAkJCXJldHVybiAtRUlOVkFMOwogCiAJCXRtcCA9IHJlYy0+c3RyaWRlX1kgKiByZWMtPnNyY19oZWlnaHQ7Ci0JCWlmIChyZWMtPm9mZnNldF9ZICsgdG1wID4gbmV3X2JvLT5zaXplKQorCQlpZiAocmVjLT5vZmZzZXRfWSArIHRtcCA+IG5ld19iby0+YmFzZS5zaXplKQogCQkJcmV0dXJuIC1FSU5WQUw7CiAKIAkJdG1wID0gcmVjLT5zdHJpZGVfVVYgKiAocmVjLT5zcmNfaGVpZ2h0IC8gdXZfdnNjYWxlKTsKLQkJaWYgKHJlYy0+b2Zmc2V0X1UgKyB0bXAgPiBuZXdfYm8tPnNpemUgfHwKLQkJICAgIHJlYy0+b2Zmc2V0X1YgKyB0bXAgPiBuZXdfYm8tPnNpemUpCisJCWlmIChyZWMtPm9mZnNldF9VICsgdG1wID4gbmV3X2JvLT5iYXNlLnNpemUgfHwKKwkJICAgIHJlYy0+b2Zmc2V0X1YgKyB0bXAgPiBuZXdfYm8tPmJhc2Uuc2l6ZSkKIAkJCXJldHVybiAtRUlOVkFMOwogCQlicmVhazsKIAl9CkBAIC0xMDg2LDcgKzExMTYsNyBAQAogCXN0cnVjdCBpbnRlbF9vdmVybGF5ICpvdmVybGF5OwogCXN0cnVjdCBkcm1fbW9kZV9vYmplY3QgKmRybW1vZGVfb2JqOwogCXN0cnVjdCBpbnRlbF9jcnRjICpjcnRjOwotCXN0cnVjdCBkcm1fZ2VtX29iamVjdCAqbmV3X2JvOworCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpuZXdfYm87CiAJc3RydWN0IHB1dF9pbWFnZV9wYXJhbXMgKnBhcmFtczsKIAlpbnQgcmV0OwogCkBAIC0xMTI1LDggKzExNTUsOCBAQAogCX0KIAljcnRjID0gdG9faW50ZWxfY3J0YyhvYmpfdG9fY3J0Yyhkcm1tb2RlX29iaikpOwogCi0JbmV3X2JvID0gZHJtX2dlbV9vYmplY3RfbG9va3VwKGRldiwgZmlsZV9wcml2LAotCQkJCSAgICAgICBwdXRfaW1hZ2VfcmVjLT5ib19oYW5kbGUpOworCW5ld19ibyA9IHRvX2ludGVsX2JvKGRybV9nZW1fb2JqZWN0X2xvb2t1cChkZXYsIGZpbGVfcHJpdiwKKwkJCQkJCSAgIHB1dF9pbWFnZV9yZWMtPmJvX2hhbmRsZSkpOwogCWlmICghbmV3X2JvKSB7CiAJCXJldCA9IC1FTk9FTlQ7CiAJCWdvdG8gb3V0X2ZyZWU7CkBAIC0xMTM1LDYgKzExNjUsMTIgQEAKIAltdXRleF9sb2NrKCZkZXYtPm1vZGVfY29uZmlnLm11dGV4KTsKIAltdXRleF9sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CiAKKwlpZiAobmV3X2JvLT50aWxpbmdfbW9kZSkgeworCQlEUk1fRVJST1IoImJ1ZmZlciB1c2VkIGZvciBvdmVybGF5IGltYWdlIGNhbiBub3QgYmUgdGlsZWRcbiIpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIG91dF91bmxvY2s7CisJfQorCiAJcmV0ID0gaW50ZWxfb3ZlcmxheV9yZWNvdmVyX2Zyb21faW50ZXJydXB0KG92ZXJsYXksIHRydWUpOwogCWlmIChyZXQgIT0gMCkKIAkJZ290byBvdXRfdW5sb2NrOwpAQCAtMTIxNyw3ICsxMjUzLDcgQEAKIG91dF91bmxvY2s6CiAJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CiAJbXV0ZXhfdW5sb2NrKCZkZXYtPm1vZGVfY29uZmlnLm11dGV4KTsKLQlkcm1fZ2VtX29iamVjdF91bnJlZmVyZW5jZV91bmxvY2tlZChuZXdfYm8pOworCWRybV9nZW1fb2JqZWN0X3VucmVmZXJlbmNlX3VubG9ja2VkKCZuZXdfYm8tPmJhc2UpOwogb3V0X2ZyZWU6CiAJa2ZyZWUocGFyYW1zKTsKIApAQCAtMTM3MCw3ICsxNDA2LDcgQEAKIHsKICAgICAgICAgZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJc3RydWN0IGludGVsX292ZXJsYXkgKm92ZXJsYXk7Ci0Jc3RydWN0IGRybV9nZW1fb2JqZWN0ICpyZWdfYm87CisJc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKnJlZ19ibzsKIAlzdHJ1Y3Qgb3ZlcmxheV9yZWdpc3RlcnMgKnJlZ3M7CiAJaW50IHJldDsKIApAQCAtMTM4NSw3ICsxNDIxLDcgQEAKIAlyZWdfYm8gPSBpOTE1X2dlbV9hbGxvY19vYmplY3QoZGV2LCBQQUdFX1NJWkUpOwogCWlmICghcmVnX2JvKQogCQlnb3RvIG91dF9mcmVlOwotCW92ZXJsYXktPnJlZ19ibyA9IHRvX2ludGVsX2JvKHJlZ19ibyk7CisJb3ZlcmxheS0+cmVnX2JvID0gcmVnX2JvOwogCiAJaWYgKE9WRVJMQVlfTkVFRFNfUEhZU0lDQUwoZGV2KSkgewogCQlyZXQgPSBpOTE1X2dlbV9hdHRhY2hfcGh5c19vYmplY3QoZGV2LCByZWdfYm8sCkBAIC0xMzk1LDE0ICsxNDMxLDE0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBEUk1fRVJST1IoImZhaWxlZCB0byBhdHRhY2ggcGh5cyBvdmVybGF5IHJlZ3NcbiIpOwogICAgICAgICAgICAgICAgICAgICAgICAgZ290byBvdXRfZnJlZV9ibzsKICAgICAgICAgICAgICAgICB9Ci0JCW92ZXJsYXktPmZsaXBfYWRkciA9IG92ZXJsYXktPnJlZ19iby0+cGh5c19vYmotPmhhbmRsZS0+YnVzYWRkcjsKKwkJb3ZlcmxheS0+ZmxpcF9hZGRyID0gcmVnX2JvLT5waHlzX29iai0+aGFuZGxlLT5idXNhZGRyOwogCX0gZWxzZSB7Ci0JCXJldCA9IGk5MTVfZ2VtX29iamVjdF9waW4ocmVnX2JvLCBQQUdFX1NJWkUpOworCQlyZXQgPSBpOTE1X2dlbV9vYmplY3RfcGluKHJlZ19ibywgUEFHRV9TSVpFLCB0cnVlKTsKIAkJaWYgKHJldCkgewogICAgICAgICAgICAgICAgICAgICAgICAgRFJNX0VSUk9SKCJmYWlsZWQgdG8gcGluIG92ZXJsYXkgcmVnaXN0ZXIgYm9cbiIpOwogICAgICAgICAgICAgICAgICAgICAgICAgZ290byBvdXRfZnJlZV9ibzsKICAgICAgICAgICAgICAgICB9Ci0JCW92ZXJsYXktPmZsaXBfYWRkciA9IG92ZXJsYXktPnJlZ19iby0+Z3R0X29mZnNldDsKKwkJb3ZlcmxheS0+ZmxpcF9hZGRyID0gcmVnX2JvLT5ndHRfb2Zmc2V0OwogCiAJCXJldCA9IGk5MTVfZ2VtX29iamVjdF9zZXRfdG9fZ3R0X2RvbWFpbihyZWdfYm8sIHRydWUpOwogCQlpZiAocmV0KSB7CkBAIC0xNDM0LDcgKzE0NzAsNyBAQAogb3V0X3VucGluX2JvOgogCWk5MTVfZ2VtX29iamVjdF91bnBpbihyZWdfYm8pOwogb3V0X2ZyZWVfYm86Ci0JZHJtX2dlbV9vYmplY3RfdW5yZWZlcmVuY2UocmVnX2JvKTsKKwlkcm1fZ2VtX29iamVjdF91bnJlZmVyZW5jZSgmcmVnX2JvLT5iYXNlKTsKIG91dF9mcmVlOgogCWtmcmVlKG92ZXJsYXkpOwogCXJldHVybjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX3BhbmVsLmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9wYW5lbC5jCmluZGV4IDkyZmY4ZjMuLjczNTBlYzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX3BhbmVsLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfcGFuZWwuYwpAQCAtMTI1LDE1ICsxMjUsNTUgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHUzMiBpOTE1X3JlYWRfYmxjX3B3bV9jdGwoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2KQoreworCXUzMiB2YWw7CisKKwkvKiBSZXN0b3JlIHRoZSBDVEwgdmFsdWUgaWYgaXQgbG9zdCwgZS5nLiBHUFUgcmVzZXQgKi8KKworCWlmIChIQVNfUENIX1NQTElUKGRldl9wcml2LT5kZXYpKSB7CisJCXZhbCA9IEk5MTVfUkVBRChCTENfUFdNX1BDSF9DVEwyKTsKKwkJaWYgKGRldl9wcml2LT5zYXZlQkxDX1BXTV9DVEwyID09IDApIHsKKwkJCWRldl9wcml2LT5zYXZlQkxDX1BXTV9DVEwyID0gdmFsOworCQl9IGVsc2UgaWYgKHZhbCA9PSAwKSB7CisJCQlJOTE1X1dSSVRFKEJMQ19QV01fUENIX0NUTDIsCisJCQkJICAgZGV2X3ByaXYtPnNhdmVCTENfUFdNX0NUTCk7CisJCQl2YWwgPSBkZXZfcHJpdi0+c2F2ZUJMQ19QV01fQ1RMOworCQl9CisJfSBlbHNlIHsKKwkJdmFsID0gSTkxNV9SRUFEKEJMQ19QV01fQ1RMKTsKKwkJaWYgKGRldl9wcml2LT5zYXZlQkxDX1BXTV9DVEwgPT0gMCkgeworCQkJZGV2X3ByaXYtPnNhdmVCTENfUFdNX0NUTCA9IHZhbDsKKwkJCWRldl9wcml2LT5zYXZlQkxDX1BXTV9DVEwyID0gSTkxNV9SRUFEKEJMQ19QV01fQ1RMMik7CisJCX0gZWxzZSBpZiAodmFsID09IDApIHsKKwkJCUk5MTVfV1JJVEUoQkxDX1BXTV9DVEwsCisJCQkJICAgZGV2X3ByaXYtPnNhdmVCTENfUFdNX0NUTCk7CisJCQlJOTE1X1dSSVRFKEJMQ19QV01fQ1RMMiwKKwkJCQkgICBkZXZfcHJpdi0+c2F2ZUJMQ19QV01fQ1RMMik7CisJCQl2YWwgPSBkZXZfcHJpdi0+c2F2ZUJMQ19QV01fQ1RMOworCQl9CisJfQorCisJcmV0dXJuIHZhbDsKK30KKwogdTMyIGludGVsX3BhbmVsX2dldF9tYXhfYmFja2xpZ2h0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAl1MzIgbWF4OwogCisJbWF4ID0gaTkxNV9yZWFkX2JsY19wd21fY3RsKGRldl9wcml2KTsKKwlpZiAobWF4ID09IDApIHsKKwkJLyogWFhYIGFkZCBjb2RlIGhlcmUgdG8gcXVlcnkgbW9kZSBjbG9jayBvciBoYXJkd2FyZSBjbG9jaworCQkgKiBhbmQgcHJvZ3JhbSBtYXggUFdNIGFwcHJvcHJpYXRlbHkuCisJCSAqLworCQlwcmludGtfb25jZShLRVJOX1dBUk5JTkcgImZpeG1lOiBtYXggUFdNIGlzIHplcm8uXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCiAJaWYgKEhBU19QQ0hfU1BMSVQoZGV2KSkgewotCQltYXggPSBJOTE1X1JFQUQoQkxDX1BXTV9QQ0hfQ1RMMikgPj4gMTY7CisJCW1heCA+Pj0gMTY7CiAJfSBlbHNlIHsKLQkJbWF4ID0gSTkxNV9SRUFEKEJMQ19QV01fQ1RMKTsKIAkJaWYgKElTX1BJTkVWSUVXKGRldikpIHsKIAkJCW1heCA+Pj0gMTc7CiAJCX0gZWxzZSB7CkBAIC0xNDYsMTQgKzE4Niw2IEBACiAJCQltYXggKj0gMHhmZjsKIAl9CiAKLQlpZiAobWF4ID09IDApIHsKLQkJLyogWFhYIGFkZCBjb2RlIGhlcmUgdG8gcXVlcnkgbW9kZSBjbG9jayBvciBoYXJkd2FyZSBjbG9jawotCQkgKiBhbmQgcHJvZ3JhbSBtYXggUFdNIGFwcHJvcHJpYXRlbHkuCi0JCSAqLwotCQlEUk1fRVJST1IoImZpeG1lOiBtYXggUFdNIGlzIHplcm8uXG4iKTsKLQkJbWF4ID0gMTsKLQl9Ci0KIAlEUk1fREVCVUdfRFJJVkVSKCJtYXggYmFja2xpZ2h0IFBXTSA9ICVkXG4iLCBtYXgpOwogCXJldHVybiBtYXg7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9yaW5nYnVmZmVyLmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9yaW5nYnVmZmVyLmMKaW5kZXggMzFjZDdlMy4uNTZiYzk1YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfcmluZ2J1ZmZlci5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX3JpbmdidWZmZXIuYwpAQCAtNDksMTEgKzQ5LDExIEBACiB9CiAKIHN0YXRpYyB2b2lkCi1yZW5kZXJfcmluZ19mbHVzaChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAotCQkgIHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZywKK3JlbmRlcl9yaW5nX2ZsdXNoKHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZywKIAkJICB1MzIJaW52YWxpZGF0ZV9kb21haW5zLAogCQkgIHUzMglmbHVzaF9kb21haW5zKQogeworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSByaW5nLT5kZXY7CiAJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJdTMyIGNtZDsKIApAQCAtMTA5LDQ5ICsxMDksNTAgQEAKIAkJaWYgKGludmFsaWRhdGVfZG9tYWlucyAmIEk5MTVfR0VNX0RPTUFJTl9JTlNUUlVDVElPTikKIAkJCWNtZCB8PSBNSV9FWEVfRkxVU0g7CiAKKwkJaWYgKGludmFsaWRhdGVfZG9tYWlucyAmIEk5MTVfR0VNX0RPTUFJTl9DT01NQU5EICYmCisJCSAgICAoSVNfRzRYKGRldikgfHwgSVNfR0VONShkZXYpKSkKKwkJCWNtZCB8PSBNSV9JTlZBTElEQVRFX0lTUDsKKwogI2lmIFdBVENIX0VYRUMKIAkJRFJNX0lORk8oIiVzOiBxdWV1ZSBmbHVzaCAlMDh4IHRvIHJpbmdcbiIsIF9fZnVuY19fLCBjbWQpOwogI2VuZGlmCi0JCWludGVsX3JpbmdfYmVnaW4oZGV2LCByaW5nLCAyKTsKLQkJaW50ZWxfcmluZ19lbWl0KGRldiwgcmluZywgY21kKTsKLQkJaW50ZWxfcmluZ19lbWl0KGRldiwgcmluZywgTUlfTk9PUCk7Ci0JCWludGVsX3JpbmdfYWR2YW5jZShkZXYsIHJpbmcpOworCQlpZiAoaW50ZWxfcmluZ19iZWdpbihyaW5nLCAyKSA9PSAwKSB7CisJCQlpbnRlbF9yaW5nX2VtaXQocmluZywgY21kKTsKKwkJCWludGVsX3JpbmdfZW1pdChyaW5nLCBNSV9OT09QKTsKKwkJCWludGVsX3JpbmdfYWR2YW5jZShyaW5nKTsKKwkJfQogCX0KIH0KIAotc3RhdGljIHZvaWQgcmluZ193cml0ZV90YWlsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCi0JCQkgICAgc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nLAorc3RhdGljIHZvaWQgcmluZ193cml0ZV90YWlsKHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZywKIAkJCSAgICB1MzIgdmFsdWUpCiB7Ci0JZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IHJpbmctPmRldi0+ZGV2X3ByaXZhdGU7CiAJSTkxNV9XUklURV9UQUlMKHJpbmcsIHZhbHVlKTsKIH0KIAotdTMyIGludGVsX3JpbmdfZ2V0X2FjdGl2ZV9oZWFkKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCi0JCQkgICAgICAgc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nKQordTMyIGludGVsX3JpbmdfZ2V0X2FjdGl2ZV9oZWFkKHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZykKIHsKLQlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQl1MzIgYWN0aGRfcmVnID0gSU5URUxfSU5GTyhkZXYpLT5nZW4gPj0gNCA/CisJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IHJpbmctPmRldi0+ZGV2X3ByaXZhdGU7CisJdTMyIGFjdGhkX3JlZyA9IElOVEVMX0lORk8ocmluZy0+ZGV2KS0+Z2VuID49IDQgPwogCQkJUklOR19BQ1RIRChyaW5nLT5tbWlvX2Jhc2UpIDogQUNUSEQ7CiAKIAlyZXR1cm4gSTkxNV9SRUFEKGFjdGhkX3JlZyk7CiB9CiAKLXN0YXRpYyBpbnQgaW5pdF9yaW5nX2NvbW1vbihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAotCQkJICAgIHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZykKK3N0YXRpYyBpbnQgaW5pdF9yaW5nX2NvbW1vbihzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcpCiB7CisJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IHJpbmctPmRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaiA9IHJpbmctPm9iajsKIAl1MzIgaGVhZDsKLQlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqX3ByaXY7Ci0Jb2JqX3ByaXYgPSB0b19pbnRlbF9ibyhyaW5nLT5nZW1fb2JqZWN0KTsKIAogCS8qIFN0b3AgdGhlIHJpbmcgaWYgaXQncyBydW5uaW5nLiAqLwogCUk5MTVfV1JJVEVfQ1RMKHJpbmcsIDApOwogCUk5MTVfV1JJVEVfSEVBRChyaW5nLCAwKTsKLQlyaW5nLT53cml0ZV90YWlsKGRldiwgcmluZywgMCk7CisJcmluZy0+d3JpdGVfdGFpbChyaW5nLCAwKTsKIAogCS8qIEluaXRpYWxpemUgdGhlIHJpbmcuICovCi0JSTkxNV9XUklURV9TVEFSVChyaW5nLCBvYmpfcHJpdi0+Z3R0X29mZnNldCk7CisJSTkxNV9XUklURV9TVEFSVChyaW5nLCBvYmotPmd0dF9vZmZzZXQpOwogCWhlYWQgPSBJOTE1X1JFQURfSEVBRChyaW5nKSAmIEhFQURfQUREUjsKIAogCS8qIEc0NSByaW5nIGluaXRpYWxpemF0aW9uIGZhaWxzIHRvIHJlc2V0IGhlYWQgdG8gemVybyAqLwpAQCAtMTc4LDEyICsxNzksMTMgQEAKIAl9CiAKIAlJOTE1X1dSSVRFX0NUTChyaW5nLAotCQkJKChyaW5nLT5nZW1fb2JqZWN0LT5zaXplIC0gUEFHRV9TSVpFKSAmIFJJTkdfTlJfUEFHRVMpCisJCQkoKHJpbmctPnNpemUgLSBQQUdFX1NJWkUpICYgUklOR19OUl9QQUdFUykKIAkJCXwgUklOR19SRVBPUlRfNjRLIHwgUklOR19WQUxJRCk7CiAKLQloZWFkID0gSTkxNV9SRUFEX0hFQUQocmluZykgJiBIRUFEX0FERFI7CiAJLyogSWYgdGhlIGhlYWQgaXMgc3RpbGwgbm90IHplcm8sIHRoZSByaW5nIGlzIGRlYWQgKi8KLQlpZiAoaGVhZCAhPSAwKSB7CisJaWYgKChJOTE1X1JFQURfQ1RMKHJpbmcpICYgUklOR19WQUxJRCkgPT0gMCB8fAorCSAgICBJOTE1X1JFQURfU1RBUlQocmluZykgIT0gb2JqLT5ndHRfb2Zmc2V0IHx8CisJICAgIChJOTE1X1JFQURfSEVBRChyaW5nKSAmIEhFQURfQUREUikgIT0gMCkgewogCQlEUk1fRVJST1IoIiVzIGluaXRpYWxpemF0aW9uIGZhaWxlZCAiCiAJCQkJImN0bCAlMDh4IGhlYWQgJTA4eCB0YWlsICUwOHggc3RhcnQgJTA4eFxuIiwKIAkJCQlyaW5nLT5uYW1lLApAQCAtMTk0LDggKzE5Niw4IEBACiAJCXJldHVybiAtRUlPOwogCX0KIAotCWlmICghZHJtX2NvcmVfY2hlY2tfZmVhdHVyZShkZXYsIERSSVZFUl9NT0RFU0VUKSkKLQkJaTkxNV9rZXJuZWxfbG9zdF9jb250ZXh0KGRldik7CisJaWYgKCFkcm1fY29yZV9jaGVja19mZWF0dXJlKHJpbmctPmRldiwgRFJJVkVSX01PREVTRVQpKQorCQlpOTE1X2tlcm5lbF9sb3N0X2NvbnRleHQocmluZy0+ZGV2KTsKIAllbHNlIHsKIAkJcmluZy0+aGVhZCA9IEk5MTVfUkVBRF9IRUFEKHJpbmcpICYgSEVBRF9BRERSOwogCQlyaW5nLT50YWlsID0gSTkxNV9SRUFEX1RBSUwocmluZykgJiBUQUlMX0FERFI7CkBAIC0yMDMsMzM1ICsyMDUsNTAwIEBACiAJCWlmIChyaW5nLT5zcGFjZSA8IDApCiAJCQlyaW5nLT5zcGFjZSArPSByaW5nLT5zaXplOwogCX0KKwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGluaXRfcmVuZGVyX3Jpbmcoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKLQkJCSAgICBzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcpCisvKgorICogOTY1KyBzdXBwb3J0IFBJUEVfQ09OVFJPTCBjb21tYW5kcywgd2hpY2ggcHJvdmlkZSBmaW5lciBncmFpbmVkIGNvbnRyb2wKKyAqIG92ZXIgY2FjaGUgZmx1c2hpbmcuCisgKi8KK3N0cnVjdCBwaXBlX2NvbnRyb2wgeworCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmo7CisJdm9sYXRpbGUgdTMyICpjcHVfcGFnZTsKKwl1MzIgZ3R0X29mZnNldDsKK307CisKK3N0YXRpYyBpbnQKK2luaXRfcGlwZV9jb250cm9sKHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZykKIHsKLQlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlpbnQgcmV0ID0gaW5pdF9yaW5nX2NvbW1vbihkZXYsIHJpbmcpOwotCWludCBtb2RlOworCXN0cnVjdCBwaXBlX2NvbnRyb2wgKnBjOworCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmo7CisJaW50IHJldDsKKworCWlmIChyaW5nLT5wcml2YXRlKQorCQlyZXR1cm4gMDsKKworCXBjID0ga21hbGxvYyhzaXplb2YoKnBjKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwYykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlvYmogPSBpOTE1X2dlbV9hbGxvY19vYmplY3QocmluZy0+ZGV2LCA0MDk2KTsKKwlpZiAob2JqID09IE5VTEwpIHsKKwkJRFJNX0VSUk9SKCJGYWlsZWQgdG8gYWxsb2NhdGUgc2Vxbm8gcGFnZVxuIik7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyOworCX0KKwlvYmotPmFncF90eXBlID0gQUdQX1VTRVJfQ0FDSEVEX01FTU9SWTsKKworCXJldCA9IGk5MTVfZ2VtX29iamVjdF9waW4ob2JqLCA0MDk2LCB0cnVlKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl91bnJlZjsKKworCXBjLT5ndHRfb2Zmc2V0ID0gb2JqLT5ndHRfb2Zmc2V0OworCXBjLT5jcHVfcGFnZSA9ICBrbWFwKG9iai0+cGFnZXNbMF0pOworCWlmIChwYy0+Y3B1X3BhZ2UgPT0gTlVMTCkKKwkJZ290byBlcnJfdW5waW47CisKKwlwYy0+b2JqID0gb2JqOworCXJpbmctPnByaXZhdGUgPSBwYzsKKwlyZXR1cm4gMDsKKworZXJyX3VucGluOgorCWk5MTVfZ2VtX29iamVjdF91bnBpbihvYmopOworZXJyX3VucmVmOgorCWRybV9nZW1fb2JqZWN0X3VucmVmZXJlbmNlKCZvYmotPmJhc2UpOworZXJyOgorCWtmcmVlKHBjKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZAorY2xlYW51cF9waXBlX2NvbnRyb2woc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nKQoreworCXN0cnVjdCBwaXBlX2NvbnRyb2wgKnBjID0gcmluZy0+cHJpdmF0ZTsKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqOworCisJaWYgKCFyaW5nLT5wcml2YXRlKQorCQlyZXR1cm47CisKKwlvYmogPSBwYy0+b2JqOworCWt1bm1hcChvYmotPnBhZ2VzWzBdKTsKKwlpOTE1X2dlbV9vYmplY3RfdW5waW4ob2JqKTsKKwlkcm1fZ2VtX29iamVjdF91bnJlZmVyZW5jZSgmb2JqLT5iYXNlKTsKKworCWtmcmVlKHBjKTsKKwlyaW5nLT5wcml2YXRlID0gTlVMTDsKK30KKworc3RhdGljIGludCBpbml0X3JlbmRlcl9yaW5nKHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZykKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gcmluZy0+ZGV2OworCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJaW50IHJldCA9IGluaXRfcmluZ19jb21tb24ocmluZyk7CiAKIAlpZiAoSU5URUxfSU5GTyhkZXYpLT5nZW4gPiAzKSB7Ci0JCW1vZGUgPSBWU19USU1FUl9ESVNQQVRDSCA8PCAxNiB8IFZTX1RJTUVSX0RJU1BBVENIOworCQlpbnQgbW9kZSA9IFZTX1RJTUVSX0RJU1BBVENIIDw8IDE2IHwgVlNfVElNRVJfRElTUEFUQ0g7CiAJCWlmIChJU19HRU42KGRldikpCiAJCQltb2RlIHw9IE1JX0ZMVVNIX0VOQUJMRSA8PCAxNiB8IE1JX0ZMVVNIX0VOQUJMRTsKIAkJSTkxNV9XUklURShNSV9NT0RFLCBtb2RlKTsKIAl9CisKKwlpZiAoSU5URUxfSU5GTyhkZXYpLT5nZW4gPj0gNikgeworCX0gZWxzZSBpZiAoSVNfR0VONShkZXYpKSB7CisJCXJldCA9IGluaXRfcGlwZV9jb250cm9sKHJpbmcpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwl9CisKIAlyZXR1cm4gcmV0OwogfQogCi0jZGVmaW5lIFBJUEVfQ09OVFJPTF9GTFVTSChhZGRyKQkJCQkJXAorc3RhdGljIHZvaWQgcmVuZGVyX3JpbmdfY2xlYW51cChzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcpCit7CisJaWYgKCFyaW5nLT5wcml2YXRlKQorCQlyZXR1cm47CisKKwljbGVhbnVwX3BpcGVfY29udHJvbChyaW5nKTsKK30KKworc3RhdGljIHZvaWQKK3VwZGF0ZV9zZW1hcGhvcmUoc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nLCBpbnQgaSwgdTMyIHNlcW5vKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSByaW5nLT5kZXY7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlpbnQgaWQ7CisKKwkvKgorCSAqIGNzIC0+IDEgPSB2Y3MsIDAgPSBiY3MKKwkgKiB2Y3MgLT4gMSA9IGJjcywgMCA9IGNzLAorCSAqIGJjcyAtPiAxID0gY3MsIDAgPSB2Y3MuCisJICovCisJaWQgPSByaW5nIC0gZGV2X3ByaXYtPnJpbmc7CisJaWQgKz0gMiAtIGk7CisJaWQgJT0gMzsKKworCWludGVsX3JpbmdfZW1pdChyaW5nLAorCQkJTUlfU0VNQVBIT1JFX01CT1ggfAorCQkJTUlfU0VNQVBIT1JFX1JFR0lTVEVSIHwKKwkJCU1JX1NFTUFQSE9SRV9VUERBVEUpOworCWludGVsX3JpbmdfZW1pdChyaW5nLCBzZXFubyk7CisJaW50ZWxfcmluZ19lbWl0KHJpbmcsCisJCQlSSU5HX1NZTkNfMChkZXZfcHJpdi0+cmluZ1tpZF0ubW1pb19iYXNlKSArIDQqaSk7Cit9CisKK3N0YXRpYyBpbnQKK2dlbjZfYWRkX3JlcXVlc3Qoc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nLAorCQkgdTMyICpyZXN1bHQpCit7CisJdTMyIHNlcW5vOworCWludCByZXQ7CisKKwlyZXQgPSBpbnRlbF9yaW5nX2JlZ2luKHJpbmcsIDEwKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJc2Vxbm8gPSBpOTE1X2dlbV9nZXRfc2Vxbm8ocmluZy0+ZGV2KTsKKwl1cGRhdGVfc2VtYXBob3JlKHJpbmcsIDAsIHNlcW5vKTsKKwl1cGRhdGVfc2VtYXBob3JlKHJpbmcsIDEsIHNlcW5vKTsKKworCWludGVsX3JpbmdfZW1pdChyaW5nLCBNSV9TVE9SRV9EV09SRF9JTkRFWCk7CisJaW50ZWxfcmluZ19lbWl0KHJpbmcsIEk5MTVfR0VNX0hXU19JTkRFWCA8PCBNSV9TVE9SRV9EV09SRF9JTkRFWF9TSElGVCk7CisJaW50ZWxfcmluZ19lbWl0KHJpbmcsIHNlcW5vKTsKKwlpbnRlbF9yaW5nX2VtaXQocmluZywgTUlfVVNFUl9JTlRFUlJVUFQpOworCWludGVsX3JpbmdfYWR2YW5jZShyaW5nKTsKKworCSpyZXN1bHQgPSBzZXFubzsKKwlyZXR1cm4gMDsKK30KKworaW50CitpbnRlbF9yaW5nX3N5bmMoc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nLAorCQlzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnRvLAorCQl1MzIgc2Vxbm8pCit7CisJaW50IHJldDsKKworCXJldCA9IGludGVsX3JpbmdfYmVnaW4ocmluZywgNCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWludGVsX3JpbmdfZW1pdChyaW5nLAorCQkJTUlfU0VNQVBIT1JFX01CT1ggfAorCQkJTUlfU0VNQVBIT1JFX1JFR0lTVEVSIHwKKwkJCWludGVsX3Jpbmdfc3luY19pbmRleChyaW5nLCB0bykgPDwgMTcgfAorCQkJTUlfU0VNQVBIT1JFX0NPTVBBUkUpOworCWludGVsX3JpbmdfZW1pdChyaW5nLCBzZXFubyk7CisJaW50ZWxfcmluZ19lbWl0KHJpbmcsIDApOworCWludGVsX3JpbmdfZW1pdChyaW5nLCBNSV9OT09QKTsKKwlpbnRlbF9yaW5nX2FkdmFuY2UocmluZyk7CisKKwlyZXR1cm4gMDsKK30KKworI2RlZmluZSBQSVBFX0NPTlRST0xfRkxVU0gocmluZ19fLCBhZGRyX18pCQkJCQlcCiBkbyB7CQkJCQkJCQkJXAotCU9VVF9SSU5HKEdGWF9PUF9QSVBFX0NPTlRST0wgfCBQSVBFX0NPTlRST0xfUVdfV1JJVEUgfAkJXAorCWludGVsX3JpbmdfZW1pdChyaW5nX18sIEdGWF9PUF9QSVBFX0NPTlRST0wgfCBQSVBFX0NPTlRST0xfUVdfV1JJVEUgfAkJXAogCQkgUElQRV9DT05UUk9MX0RFUFRIX1NUQUxMIHwgMik7CQkJCVwKLQlPVVRfUklORyhhZGRyIHwgUElQRV9DT05UUk9MX0dMT0JBTF9HVFQpOwkJCVwKLQlPVVRfUklORygwKTsJCQkJCQkJXAotCU9VVF9SSU5HKDApOwkJCQkJCQlcCisJaW50ZWxfcmluZ19lbWl0KHJpbmdfXywgKGFkZHJfXykgfCBQSVBFX0NPTlRST0xfR0xPQkFMX0dUVCk7CQkJXAorCWludGVsX3JpbmdfZW1pdChyaW5nX18sIDApOwkJCQkJCQlcCisJaW50ZWxfcmluZ19lbWl0KHJpbmdfXywgMCk7CQkJCQkJCVwKIH0gd2hpbGUgKDApCiAKLS8qKgotICogQ3JlYXRlcyBhIG5ldyBzZXF1ZW5jZSBudW1iZXIsIGVtaXR0aW5nIGEgd3JpdGUgb2YgaXQgdG8gdGhlIHN0YXR1cyBwYWdlCi0gKiBwbHVzIGFuIGludGVycnVwdCwgd2hpY2ggd2lsbCB0cmlnZ2VyIGk5MTVfdXNlcl9pbnRlcnJ1cHRfaGFuZGxlci4KLSAqCi0gKiBNdXN0IGJlIGNhbGxlZCB3aXRoIHN0cnVjdF9sb2NrIGhlbGQuCi0gKgotICogUmV0dXJuZWQgc2VxdWVuY2UgbnVtYmVycyBhcmUgbm9uemVybyBvbiBzdWNjZXNzLgotICovCi1zdGF0aWMgdTMyCi1yZW5kZXJfcmluZ19hZGRfcmVxdWVzdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAotCQkJc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nLAotCQkJdTMyIGZsdXNoX2RvbWFpbnMpCitzdGF0aWMgaW50CitwY19yZW5kZXJfYWRkX3JlcXVlc3Qoc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nLAorCQkgICAgICB1MzIgKnJlc3VsdCkKIHsKLQlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQl1MzIgc2Vxbm87CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHJpbmctPmRldjsKKwl1MzIgc2Vxbm8gPSBpOTE1X2dlbV9nZXRfc2Vxbm8oZGV2KTsKKwlzdHJ1Y3QgcGlwZV9jb250cm9sICpwYyA9IHJpbmctPnByaXZhdGU7CisJdTMyIHNjcmF0Y2hfYWRkciA9IHBjLT5ndHRfb2Zmc2V0ICsgMTI4OworCWludCByZXQ7CiAKLQlzZXFubyA9IGk5MTVfZ2VtX2dldF9zZXFubyhkZXYpOworCS8qIEZvciBJcm9ubGFrZSwgTUlfVVNFUl9JTlRFUlJVUFQgd2FzIGRlcHJlY2F0ZWQgYW5kIGFwcGFyZW50bHkKKwkgKiBpbmNvaGVyZW50IHdpdGggd3JpdGVzIHRvIG1lbW9yeSwgaS5lLiBjb21wbGV0ZWx5IGZ1YmFyLAorCSAqIHNvIHdlIG5lZWQgdG8gdXNlIFBJUEVfTk9USUZZIGluc3RlYWQuCisJICoKKwkgKiBIb3dldmVyLCB3ZSBhbHNvIG5lZWQgdG8gd29ya2Fyb3VuZCB0aGUgcXdvcmQgd3JpdGUKKwkgKiBpbmNvaGVyZW5jZSBieSBmbHVzaGluZyB0aGUgNiBQSVBFX05PVElGWSBidWZmZXJzIG91dCB0bworCSAqIG1lbW9yeSBiZWZvcmUgcmVxdWVzdGluZyBhbiBpbnRlcnJ1cHQuCisJICovCisJcmV0ID0gaW50ZWxfcmluZ19iZWdpbihyaW5nLCAzMik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKIAotCWlmIChJU19HRU42KGRldikpIHsKLQkJQkVHSU5fTFBfUklORyg2KTsKLQkJT1VUX1JJTkcoR0ZYX09QX1BJUEVfQ09OVFJPTCB8IDMpOwotCQlPVVRfUklORyhQSVBFX0NPTlRST0xfUVdfV1JJVEUgfAotCQkJIFBJUEVfQ09OVFJPTF9XQ19GTFVTSCB8IFBJUEVfQ09OVFJPTF9JU19GTFVTSCB8Ci0JCQkgUElQRV9DT05UUk9MX05PVElGWSk7Ci0JCU9VVF9SSU5HKGRldl9wcml2LT5zZXFub19nZnhfYWRkciB8IFBJUEVfQ09OVFJPTF9HTE9CQUxfR1RUKTsKLQkJT1VUX1JJTkcoc2Vxbm8pOwotCQlPVVRfUklORygwKTsKLQkJT1VUX1JJTkcoMCk7Ci0JCUFEVkFOQ0VfTFBfUklORygpOwotCX0gZWxzZSBpZiAoSEFTX1BJUEVfQ09OVFJPTChkZXYpKSB7Ci0JCXUzMiBzY3JhdGNoX2FkZHIgPSBkZXZfcHJpdi0+c2Vxbm9fZ2Z4X2FkZHIgKyAxMjg7CisJaW50ZWxfcmluZ19lbWl0KHJpbmcsIEdGWF9PUF9QSVBFX0NPTlRST0wgfCBQSVBFX0NPTlRST0xfUVdfV1JJVEUgfAorCQkJUElQRV9DT05UUk9MX1dDX0ZMVVNIIHwgUElQRV9DT05UUk9MX1RDX0ZMVVNIKTsKKwlpbnRlbF9yaW5nX2VtaXQocmluZywgcGMtPmd0dF9vZmZzZXQgfCBQSVBFX0NPTlRST0xfR0xPQkFMX0dUVCk7CisJaW50ZWxfcmluZ19lbWl0KHJpbmcsIHNlcW5vKTsKKwlpbnRlbF9yaW5nX2VtaXQocmluZywgMCk7CisJUElQRV9DT05UUk9MX0ZMVVNIKHJpbmcsIHNjcmF0Y2hfYWRkcik7CisJc2NyYXRjaF9hZGRyICs9IDEyODsgLyogd3JpdGUgdG8gc2VwYXJhdGUgY2FjaGVsaW5lcyAqLworCVBJUEVfQ09OVFJPTF9GTFVTSChyaW5nLCBzY3JhdGNoX2FkZHIpOworCXNjcmF0Y2hfYWRkciArPSAxMjg7CisJUElQRV9DT05UUk9MX0ZMVVNIKHJpbmcsIHNjcmF0Y2hfYWRkcik7CisJc2NyYXRjaF9hZGRyICs9IDEyODsKKwlQSVBFX0NPTlRST0xfRkxVU0gocmluZywgc2NyYXRjaF9hZGRyKTsKKwlzY3JhdGNoX2FkZHIgKz0gMTI4OworCVBJUEVfQ09OVFJPTF9GTFVTSChyaW5nLCBzY3JhdGNoX2FkZHIpOworCXNjcmF0Y2hfYWRkciArPSAxMjg7CisJUElQRV9DT05UUk9MX0ZMVVNIKHJpbmcsIHNjcmF0Y2hfYWRkcik7CisJaW50ZWxfcmluZ19lbWl0KHJpbmcsIEdGWF9PUF9QSVBFX0NPTlRST0wgfCBQSVBFX0NPTlRST0xfUVdfV1JJVEUgfAorCQkJUElQRV9DT05UUk9MX1dDX0ZMVVNIIHwgUElQRV9DT05UUk9MX1RDX0ZMVVNIIHwKKwkJCVBJUEVfQ09OVFJPTF9OT1RJRlkpOworCWludGVsX3JpbmdfZW1pdChyaW5nLCBwYy0+Z3R0X29mZnNldCB8IFBJUEVfQ09OVFJPTF9HTE9CQUxfR1RUKTsKKwlpbnRlbF9yaW5nX2VtaXQocmluZywgc2Vxbm8pOworCWludGVsX3JpbmdfZW1pdChyaW5nLCAwKTsKKwlpbnRlbF9yaW5nX2FkdmFuY2UocmluZyk7CiAKLQkJLyoKLQkJICogV29ya2Fyb3VuZCBxd29yZCB3cml0ZSBpbmNvaGVyZW5jZSBieSBmbHVzaGluZyB0aGUKLQkJICogUElQRV9OT1RJRlkgYnVmZmVycyBvdXQgdG8gbWVtb3J5IGJlZm9yZSByZXF1ZXN0aW5nCi0JCSAqIGFuIGludGVycnVwdC4KLQkJICovCi0JCUJFR0lOX0xQX1JJTkcoMzIpOwotCQlPVVRfUklORyhHRlhfT1BfUElQRV9DT05UUk9MIHwgUElQRV9DT05UUk9MX1FXX1dSSVRFIHwKLQkJCSBQSVBFX0NPTlRST0xfV0NfRkxVU0ggfCBQSVBFX0NPTlRST0xfVENfRkxVU0gpOwotCQlPVVRfUklORyhkZXZfcHJpdi0+c2Vxbm9fZ2Z4X2FkZHIgfCBQSVBFX0NPTlRST0xfR0xPQkFMX0dUVCk7Ci0JCU9VVF9SSU5HKHNlcW5vKTsKLQkJT1VUX1JJTkcoMCk7Ci0JCVBJUEVfQ09OVFJPTF9GTFVTSChzY3JhdGNoX2FkZHIpOwotCQlzY3JhdGNoX2FkZHIgKz0gMTI4OyAvKiB3cml0ZSB0byBzZXBhcmF0ZSBjYWNoZWxpbmVzICovCi0JCVBJUEVfQ09OVFJPTF9GTFVTSChzY3JhdGNoX2FkZHIpOwotCQlzY3JhdGNoX2FkZHIgKz0gMTI4OwotCQlQSVBFX0NPTlRST0xfRkxVU0goc2NyYXRjaF9hZGRyKTsKLQkJc2NyYXRjaF9hZGRyICs9IDEyODsKLQkJUElQRV9DT05UUk9MX0ZMVVNIKHNjcmF0Y2hfYWRkcik7Ci0JCXNjcmF0Y2hfYWRkciArPSAxMjg7Ci0JCVBJUEVfQ09OVFJPTF9GTFVTSChzY3JhdGNoX2FkZHIpOwotCQlzY3JhdGNoX2FkZHIgKz0gMTI4OwotCQlQSVBFX0NPTlRST0xfRkxVU0goc2NyYXRjaF9hZGRyKTsKLQkJT1VUX1JJTkcoR0ZYX09QX1BJUEVfQ09OVFJPTCB8IFBJUEVfQ09OVFJPTF9RV19XUklURSB8Ci0JCQkgUElQRV9DT05UUk9MX1dDX0ZMVVNIIHwgUElQRV9DT05UUk9MX1RDX0ZMVVNIIHwKLQkJCSBQSVBFX0NPTlRST0xfTk9USUZZKTsKLQkJT1VUX1JJTkcoZGV2X3ByaXYtPnNlcW5vX2dmeF9hZGRyIHwgUElQRV9DT05UUk9MX0dMT0JBTF9HVFQpOwotCQlPVVRfUklORyhzZXFubyk7Ci0JCU9VVF9SSU5HKDApOwotCQlBRFZBTkNFX0xQX1JJTkcoKTsKLQl9IGVsc2UgewotCQlCRUdJTl9MUF9SSU5HKDQpOwotCQlPVVRfUklORyhNSV9TVE9SRV9EV09SRF9JTkRFWCk7Ci0JCU9VVF9SSU5HKEk5MTVfR0VNX0hXU19JTkRFWCA8PCBNSV9TVE9SRV9EV09SRF9JTkRFWF9TSElGVCk7Ci0JCU9VVF9SSU5HKHNlcW5vKTsKKwkqcmVzdWx0ID0gc2Vxbm87CisJcmV0dXJuIDA7Cit9CiAKLQkJT1VUX1JJTkcoTUlfVVNFUl9JTlRFUlJVUFQpOwotCQlBRFZBTkNFX0xQX1JJTkcoKTsKLQl9Ci0JcmV0dXJuIHNlcW5vOworc3RhdGljIGludAorcmVuZGVyX3JpbmdfYWRkX3JlcXVlc3Qoc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nLAorCQkJdTMyICpyZXN1bHQpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHJpbmctPmRldjsKKwl1MzIgc2Vxbm8gPSBpOTE1X2dlbV9nZXRfc2Vxbm8oZGV2KTsKKwlpbnQgcmV0OworCisJcmV0ID0gaW50ZWxfcmluZ19iZWdpbihyaW5nLCA0KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJaW50ZWxfcmluZ19lbWl0KHJpbmcsIE1JX1NUT1JFX0RXT1JEX0lOREVYKTsKKwlpbnRlbF9yaW5nX2VtaXQocmluZywgSTkxNV9HRU1fSFdTX0lOREVYIDw8IE1JX1NUT1JFX0RXT1JEX0lOREVYX1NISUZUKTsKKwlpbnRlbF9yaW5nX2VtaXQocmluZywgc2Vxbm8pOworCWludGVsX3JpbmdfZW1pdChyaW5nLCBNSV9VU0VSX0lOVEVSUlVQVCk7CisJaW50ZWxfcmluZ19hZHZhbmNlKHJpbmcpOworCisJKnJlc3VsdCA9IHNlcW5vOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgdTMyCi1yZW5kZXJfcmluZ19nZXRfc2Vxbm8oc3RydWN0IGRybV9kZXZpY2UgKmRldiwKLQkJICAgICAgc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nKQotewotCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX2k5MTVfcHJpdmF0ZV90ICopIGRldi0+ZGV2X3ByaXZhdGU7Ci0JaWYgKEhBU19QSVBFX0NPTlRST0woZGV2KSkKLQkJcmV0dXJuICgodm9sYXRpbGUgdTMyICopKGRldl9wcml2LT5zZXFub19wYWdlKSlbMF07Ci0JZWxzZQotCQlyZXR1cm4gaW50ZWxfcmVhZF9zdGF0dXNfcGFnZShyaW5nLCBJOTE1X0dFTV9IV1NfSU5ERVgpOwotfQotCi1zdGF0aWMgdm9pZAotcmVuZGVyX3JpbmdfZ2V0X3VzZXJfaXJxKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCi0JCQkgc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nKQotewotCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX2k5MTVfcHJpdmF0ZV90ICopIGRldi0+ZGV2X3ByaXZhdGU7Ci0JdW5zaWduZWQgbG9uZyBpcnFmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZfcHJpdi0+dXNlcl9pcnFfbG9jaywgaXJxZmxhZ3MpOwotCWlmIChkZXYtPmlycV9lbmFibGVkICYmICgrK3JpbmctPnVzZXJfaXJxX3JlZmNvdW50ID09IDEpKSB7Ci0JCWlmIChIQVNfUENIX1NQTElUKGRldikpCi0JCQlpcm9ubGFrZV9lbmFibGVfZ3JhcGhpY3NfaXJxKGRldl9wcml2LCBHVF9QSVBFX05PVElGWSk7Ci0JCWVsc2UKLQkJCWk5MTVfZW5hYmxlX2lycShkZXZfcHJpdiwgSTkxNV9VU0VSX0lOVEVSUlVQVCk7Ci0JfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldl9wcml2LT51c2VyX2lycV9sb2NrLCBpcnFmbGFncyk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1yZW5kZXJfcmluZ19wdXRfdXNlcl9pcnEoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKLQkJCSBzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcpCi17Ci0JZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1faTkxNV9wcml2YXRlX3QgKikgZGV2LT5kZXZfcHJpdmF0ZTsKLQl1bnNpZ25lZCBsb25nIGlycWZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmRldl9wcml2LT51c2VyX2lycV9sb2NrLCBpcnFmbGFncyk7Ci0JQlVHX09OKGRldi0+aXJxX2VuYWJsZWQgJiYgcmluZy0+dXNlcl9pcnFfcmVmY291bnQgPD0gMCk7Ci0JaWYgKGRldi0+aXJxX2VuYWJsZWQgJiYgKC0tcmluZy0+dXNlcl9pcnFfcmVmY291bnQgPT0gMCkpIHsKLQkJaWYgKEhBU19QQ0hfU1BMSVQoZGV2KSkKLQkJCWlyb25sYWtlX2Rpc2FibGVfZ3JhcGhpY3NfaXJxKGRldl9wcml2LCBHVF9QSVBFX05PVElGWSk7Ci0JCWVsc2UKLQkJCWk5MTVfZGlzYWJsZV9pcnEoZGV2X3ByaXYsIEk5MTVfVVNFUl9JTlRFUlJVUFQpOwotCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZfcHJpdi0+dXNlcl9pcnFfbG9jaywgaXJxZmxhZ3MpOwotfQotCi12b2lkIGludGVsX3Jpbmdfc2V0dXBfc3RhdHVzX3BhZ2Uoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKLQkJCQkgIHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZykKLXsKLQlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlpZiAoSVNfR0VONihkZXYpKSB7Ci0JCUk5MTVfV1JJVEUoUklOR19IV1NfUEdBX0dFTjYocmluZy0+bW1pb19iYXNlKSwKLQkJCSAgIHJpbmctPnN0YXR1c19wYWdlLmdmeF9hZGRyKTsKLQkJSTkxNV9SRUFEKFJJTkdfSFdTX1BHQV9HRU42KHJpbmctPm1taW9fYmFzZSkpOyAvKiBwb3N0aW5nIHJlYWQgKi8KLQl9IGVsc2UgewotCQlJOTE1X1dSSVRFKFJJTkdfSFdTX1BHQShyaW5nLT5tbWlvX2Jhc2UpLAotCQkJICAgcmluZy0+c3RhdHVzX3BhZ2UuZ2Z4X2FkZHIpOwotCQlJOTE1X1JFQUQoUklOR19IV1NfUEdBKHJpbmctPm1taW9fYmFzZSkpOyAvKiBwb3N0aW5nIHJlYWQgKi8KLQl9Ci0KLX0KLQotc3RhdGljIHZvaWQKLWJzZF9yaW5nX2ZsdXNoKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCi0JCXN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZywKLQkJdTMyICAgICBpbnZhbGlkYXRlX2RvbWFpbnMsCi0JCXUzMiAgICAgZmx1c2hfZG9tYWlucykKLXsKLQlpbnRlbF9yaW5nX2JlZ2luKGRldiwgcmluZywgMik7Ci0JaW50ZWxfcmluZ19lbWl0KGRldiwgcmluZywgTUlfRkxVU0gpOwotCWludGVsX3JpbmdfZW1pdChkZXYsIHJpbmcsIE1JX05PT1ApOwotCWludGVsX3JpbmdfYWR2YW5jZShkZXYsIHJpbmcpOwotfQotCi1zdGF0aWMgaW50IGluaXRfYnNkX3Jpbmcoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKLQkJCSBzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcpCi17Ci0JcmV0dXJuIGluaXRfcmluZ19jb21tb24oZGV2LCByaW5nKTsKLX0KLQotc3RhdGljIHUzMgotcmluZ19hZGRfcmVxdWVzdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAotCQkgc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nLAotCQkgdTMyIGZsdXNoX2RvbWFpbnMpCi17Ci0JdTMyIHNlcW5vOwotCi0Jc2Vxbm8gPSBpOTE1X2dlbV9nZXRfc2Vxbm8oZGV2KTsKLQotCWludGVsX3JpbmdfYmVnaW4oZGV2LCByaW5nLCA0KTsKLQlpbnRlbF9yaW5nX2VtaXQoZGV2LCByaW5nLCBNSV9TVE9SRV9EV09SRF9JTkRFWCk7Ci0JaW50ZWxfcmluZ19lbWl0KGRldiwgcmluZywKLQkJCUk5MTVfR0VNX0hXU19JTkRFWCA8PCBNSV9TVE9SRV9EV09SRF9JTkRFWF9TSElGVCk7Ci0JaW50ZWxfcmluZ19lbWl0KGRldiwgcmluZywgc2Vxbm8pOwotCWludGVsX3JpbmdfZW1pdChkZXYsIHJpbmcsIE1JX1VTRVJfSU5URVJSVVBUKTsKLQlpbnRlbF9yaW5nX2FkdmFuY2UoZGV2LCByaW5nKTsKLQotCURSTV9ERUJVR19EUklWRVIoIiVzICVkXG4iLCByaW5nLT5uYW1lLCBzZXFubyk7Ci0KLQlyZXR1cm4gc2Vxbm87Ci19Ci0KLXN0YXRpYyB2b2lkCi1ic2RfcmluZ19nZXRfdXNlcl9pcnEoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKLQkJICAgICAgc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nKQotewotCS8qIGRvIG5vdGhpbmcgKi8KLX0KLXN0YXRpYyB2b2lkCi1ic2RfcmluZ19wdXRfdXNlcl9pcnEoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKLQkJICAgICAgc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nKQotewotCS8qIGRvIG5vdGhpbmcgKi8KLX0KLQotc3RhdGljIHUzMgotcmluZ19zdGF0dXNfcGFnZV9nZXRfc2Vxbm8oc3RydWN0IGRybV9kZXZpY2UgKmRldiwKLQkJCSAgIHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZykKK3JpbmdfZ2V0X3NlcW5vKHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZykKIHsKIAlyZXR1cm4gaW50ZWxfcmVhZF9zdGF0dXNfcGFnZShyaW5nLCBJOTE1X0dFTV9IV1NfSU5ERVgpOwogfQogCi1zdGF0aWMgaW50Ci1yaW5nX2Rpc3BhdGNoX2dlbV9leGVjYnVmZmVyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCi0JCQkgICAgIHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZywKLQkJCSAgICAgc3RydWN0IGRybV9pOTE1X2dlbV9leGVjYnVmZmVyMiAqZXhlYywKLQkJCSAgICAgc3RydWN0IGRybV9jbGlwX3JlY3QgKmNsaXByZWN0cywKLQkJCSAgICAgdWludDY0X3QgZXhlY19vZmZzZXQpCitzdGF0aWMgdTMyCitwY19yZW5kZXJfZ2V0X3NlcW5vKHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZykKIHsKLQl1aW50MzJfdCBleGVjX3N0YXJ0OwotCWV4ZWNfc3RhcnQgPSAodWludDMyX3QpIGV4ZWNfb2Zmc2V0ICsgZXhlYy0+YmF0Y2hfc3RhcnRfb2Zmc2V0OwotCWludGVsX3JpbmdfYmVnaW4oZGV2LCByaW5nLCAyKTsKLQlpbnRlbF9yaW5nX2VtaXQoZGV2LCByaW5nLCBNSV9CQVRDSF9CVUZGRVJfU1RBUlQgfAotCQkJKDIgPDwgNikgfCBNSV9CQVRDSF9OT05fU0VDVVJFX0k5NjUpOwotCWludGVsX3JpbmdfZW1pdChkZXYsIHJpbmcsIGV4ZWNfc3RhcnQpOwotCWludGVsX3JpbmdfYWR2YW5jZShkZXYsIHJpbmcpOworCXN0cnVjdCBwaXBlX2NvbnRyb2wgKnBjID0gcmluZy0+cHJpdmF0ZTsKKwlyZXR1cm4gcGMtPmNwdV9wYWdlWzBdOworfQorCitzdGF0aWMgYm9vbAorcmVuZGVyX3JpbmdfZ2V0X2lycShzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHJpbmctPmRldjsKKworCWlmICghZGV2LT5pcnFfZW5hYmxlZCkKKwkJcmV0dXJuIGZhbHNlOworCisJaWYgKGF0b21pY19pbmNfcmV0dXJuKCZyaW5nLT5pcnFfcmVmY291bnQpID09IDEpIHsKKwkJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJCXVuc2lnbmVkIGxvbmcgaXJxZmxhZ3M7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmRldl9wcml2LT5pcnFfbG9jaywgaXJxZmxhZ3MpOworCQlpZiAoSEFTX1BDSF9TUExJVChkZXYpKQorCQkJaXJvbmxha2VfZW5hYmxlX2dyYXBoaWNzX2lycShkZXZfcHJpdiwKKwkJCQkJCSAgICAgR1RfUElQRV9OT1RJRlkgfCBHVF9VU0VSX0lOVEVSUlVQVCk7CisJCWVsc2UKKwkJCWk5MTVfZW5hYmxlX2lycShkZXZfcHJpdiwgSTkxNV9VU0VSX0lOVEVSUlVQVCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldl9wcml2LT5pcnFfbG9jaywgaXJxZmxhZ3MpOworCX0KKworCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgdm9pZAorcmVuZGVyX3JpbmdfcHV0X2lycShzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHJpbmctPmRldjsKKworCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZyaW5nLT5pcnFfcmVmY291bnQpKSB7CisJCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCQl1bnNpZ25lZCBsb25nIGlycWZsYWdzOworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZfcHJpdi0+aXJxX2xvY2ssIGlycWZsYWdzKTsKKwkJaWYgKEhBU19QQ0hfU1BMSVQoZGV2KSkKKwkJCWlyb25sYWtlX2Rpc2FibGVfZ3JhcGhpY3NfaXJxKGRldl9wcml2LAorCQkJCQkJICAgICAgR1RfVVNFUl9JTlRFUlJVUFQgfAorCQkJCQkJICAgICAgR1RfUElQRV9OT1RJRlkpOworCQllbHNlCisJCQlpOTE1X2Rpc2FibGVfaXJxKGRldl9wcml2LCBJOTE1X1VTRVJfSU5URVJSVVBUKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2X3ByaXYtPmlycV9sb2NrLCBpcnFmbGFncyk7CisJfQorfQorCit2b2lkIGludGVsX3Jpbmdfc2V0dXBfc3RhdHVzX3BhZ2Uoc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nKQoreworCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSByaW5nLT5kZXYtPmRldl9wcml2YXRlOworCXUzMiBtbWlvID0gSVNfR0VONihyaW5nLT5kZXYpID8KKwkJUklOR19IV1NfUEdBX0dFTjYocmluZy0+bW1pb19iYXNlKSA6CisJCVJJTkdfSFdTX1BHQShyaW5nLT5tbWlvX2Jhc2UpOworCUk5MTVfV1JJVEUobW1pbywgKHUzMilyaW5nLT5zdGF0dXNfcGFnZS5nZnhfYWRkcik7CisJUE9TVElOR19SRUFEKG1taW8pOworfQorCitzdGF0aWMgdm9pZAorYnNkX3JpbmdfZmx1c2goc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nLAorCSAgICAgICB1MzIgICAgIGludmFsaWRhdGVfZG9tYWlucywKKwkgICAgICAgdTMyICAgICBmbHVzaF9kb21haW5zKQoreworCWlmICgoZmx1c2hfZG9tYWlucyAmIEk5MTVfR0VNX0RPTUFJTl9SRU5ERVIpID09IDApCisJCXJldHVybjsKKworCWlmIChpbnRlbF9yaW5nX2JlZ2luKHJpbmcsIDIpID09IDApIHsKKwkJaW50ZWxfcmluZ19lbWl0KHJpbmcsIE1JX0ZMVVNIKTsKKwkJaW50ZWxfcmluZ19lbWl0KHJpbmcsIE1JX05PT1ApOworCQlpbnRlbF9yaW5nX2FkdmFuY2UocmluZyk7CisJfQorfQorCitzdGF0aWMgaW50CityaW5nX2FkZF9yZXF1ZXN0KHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZywKKwkJIHUzMiAqcmVzdWx0KQoreworCXUzMiBzZXFubzsKKwlpbnQgcmV0OworCisJcmV0ID0gaW50ZWxfcmluZ19iZWdpbihyaW5nLCA0KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJc2Vxbm8gPSBpOTE1X2dlbV9nZXRfc2Vxbm8ocmluZy0+ZGV2KTsKKworCWludGVsX3JpbmdfZW1pdChyaW5nLCBNSV9TVE9SRV9EV09SRF9JTkRFWCk7CisJaW50ZWxfcmluZ19lbWl0KHJpbmcsIEk5MTVfR0VNX0hXU19JTkRFWCA8PCBNSV9TVE9SRV9EV09SRF9JTkRFWF9TSElGVCk7CisJaW50ZWxfcmluZ19lbWl0KHJpbmcsIHNlcW5vKTsKKwlpbnRlbF9yaW5nX2VtaXQocmluZywgTUlfVVNFUl9JTlRFUlJVUFQpOworCWludGVsX3JpbmdfYWR2YW5jZShyaW5nKTsKKworCURSTV9ERUJVR19EUklWRVIoIiVzICVkXG4iLCByaW5nLT5uYW1lLCBzZXFubyk7CisJKnJlc3VsdCA9IHNlcW5vOworCXJldHVybiAwOworfQorCitzdGF0aWMgYm9vbAorcmluZ19nZXRfaXJxKHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZywgdTMyIGZsYWcpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHJpbmctPmRldjsKKworCWlmICghZGV2LT5pcnFfZW5hYmxlZCkKKwkgICAgICAgcmV0dXJuIGZhbHNlOworCisJaWYgKGF0b21pY19pbmNfcmV0dXJuKCZyaW5nLT5pcnFfcmVmY291bnQpID09IDEpIHsKKwkJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJCXVuc2lnbmVkIGxvbmcgaXJxZmxhZ3M7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmRldl9wcml2LT5pcnFfbG9jaywgaXJxZmxhZ3MpOworCQlpcm9ubGFrZV9lbmFibGVfZ3JhcGhpY3NfaXJxKGRldl9wcml2LCBmbGFnKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2X3ByaXYtPmlycV9sb2NrLCBpcnFmbGFncyk7CisJfQorCisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyB2b2lkCityaW5nX3B1dF9pcnEoc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nLCB1MzIgZmxhZykKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gcmluZy0+ZGV2OworCisJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJnJpbmctPmlycV9yZWZjb3VudCkpIHsKKwkJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJCXVuc2lnbmVkIGxvbmcgaXJxZmxhZ3M7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmRldl9wcml2LT5pcnFfbG9jaywgaXJxZmxhZ3MpOworCQlpcm9ubGFrZV9kaXNhYmxlX2dyYXBoaWNzX2lycShkZXZfcHJpdiwgZmxhZyk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldl9wcml2LT5pcnFfbG9jaywgaXJxZmxhZ3MpOworCX0KK30KKworc3RhdGljIGJvb2wKK2JzZF9yaW5nX2dldF9pcnEoc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nKQoreworCXJldHVybiByaW5nX2dldF9pcnEocmluZywgR1RfQlNEX1VTRVJfSU5URVJSVVBUKTsKK30KK3N0YXRpYyB2b2lkCitic2RfcmluZ19wdXRfaXJxKHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZykKK3sKKwlyaW5nX3B1dF9pcnEocmluZywgR1RfQlNEX1VTRVJfSU5URVJSVVBUKTsKK30KKworc3RhdGljIGludAorcmluZ19kaXNwYXRjaF9leGVjYnVmZmVyKHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZywgdTMyIG9mZnNldCwgdTMyIGxlbmd0aCkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gaW50ZWxfcmluZ19iZWdpbihyaW5nLCAyKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJaW50ZWxfcmluZ19lbWl0KHJpbmcsCisJCQlNSV9CQVRDSF9CVUZGRVJfU1RBUlQgfCAoMiA8PCA2KSB8CisJCQlNSV9CQVRDSF9OT05fU0VDVVJFX0k5NjUpOworCWludGVsX3JpbmdfZW1pdChyaW5nLCBvZmZzZXQpOworCWludGVsX3JpbmdfYWR2YW5jZShyaW5nKTsKKwogCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50Ci1yZW5kZXJfcmluZ19kaXNwYXRjaF9nZW1fZXhlY2J1ZmZlcihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAotCQkJCSAgICBzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcsCi0JCQkJICAgIHN0cnVjdCBkcm1faTkxNV9nZW1fZXhlY2J1ZmZlcjIgKmV4ZWMsCi0JCQkJICAgIHN0cnVjdCBkcm1fY2xpcF9yZWN0ICpjbGlwcmVjdHMsCi0JCQkJICAgIHVpbnQ2NF90IGV4ZWNfb2Zmc2V0KQorcmVuZGVyX3JpbmdfZGlzcGF0Y2hfZXhlY2J1ZmZlcihzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcsCisJCQkJdTMyIG9mZnNldCwgdTMyIGxlbikKIHsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gcmluZy0+ZGV2OwogCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCWludCBuYm94ID0gZXhlYy0+bnVtX2NsaXByZWN0czsKLQlpbnQgaSA9IDAsIGNvdW50OwotCXVpbnQzMl90IGV4ZWNfc3RhcnQsIGV4ZWNfbGVuOwotCWV4ZWNfc3RhcnQgPSAodWludDMyX3QpIGV4ZWNfb2Zmc2V0ICsgZXhlYy0+YmF0Y2hfc3RhcnRfb2Zmc2V0OwotCWV4ZWNfbGVuID0gKHVpbnQzMl90KSBleGVjLT5iYXRjaF9sZW47CisJaW50IHJldDsKIAogCXRyYWNlX2k5MTVfZ2VtX3JlcXVlc3Rfc3VibWl0KGRldiwgZGV2X3ByaXYtPm5leHRfc2Vxbm8gKyAxKTsKIAotCWNvdW50ID0gbmJveCA/IG5ib3ggOiAxOworCWlmIChJU19JODMwKGRldikgfHwgSVNfODQ1RyhkZXYpKSB7CisJCXJldCA9IGludGVsX3JpbmdfYmVnaW4ocmluZywgNCk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OwogCi0JZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLQkJaWYgKGkgPCBuYm94KSB7Ci0JCQlpbnQgcmV0ID0gaTkxNV9lbWl0X2JveChkZXYsIGNsaXByZWN0cywgaSwKLQkJCQkJCWV4ZWMtPkRSMSwgZXhlYy0+RFI0KTsKLQkJCWlmIChyZXQpCi0JCQkJcmV0dXJuIHJldDsKLQkJfQorCQlpbnRlbF9yaW5nX2VtaXQocmluZywgTUlfQkFUQ0hfQlVGRkVSKTsKKwkJaW50ZWxfcmluZ19lbWl0KHJpbmcsIG9mZnNldCB8IE1JX0JBVENIX05PTl9TRUNVUkUpOworCQlpbnRlbF9yaW5nX2VtaXQocmluZywgb2Zmc2V0ICsgbGVuIC0gOCk7CisJCWludGVsX3JpbmdfZW1pdChyaW5nLCAwKTsKKwl9IGVsc2UgeworCQlyZXQgPSBpbnRlbF9yaW5nX2JlZ2luKHJpbmcsIDIpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKIAotCQlpZiAoSVNfSTgzMChkZXYpIHx8IElTXzg0NUcoZGV2KSkgewotCQkJaW50ZWxfcmluZ19iZWdpbihkZXYsIHJpbmcsIDQpOwotCQkJaW50ZWxfcmluZ19lbWl0KGRldiwgcmluZywgTUlfQkFUQ0hfQlVGRkVSKTsKLQkJCWludGVsX3JpbmdfZW1pdChkZXYsIHJpbmcsCi0JCQkJCWV4ZWNfc3RhcnQgfCBNSV9CQVRDSF9OT05fU0VDVVJFKTsKLQkJCWludGVsX3JpbmdfZW1pdChkZXYsIHJpbmcsIGV4ZWNfc3RhcnQgKyBleGVjX2xlbiAtIDQpOwotCQkJaW50ZWxfcmluZ19lbWl0KGRldiwgcmluZywgMCk7CisJCWlmIChJTlRFTF9JTkZPKGRldiktPmdlbiA+PSA0KSB7CisJCQlpbnRlbF9yaW5nX2VtaXQocmluZywKKwkJCQkJTUlfQkFUQ0hfQlVGRkVSX1NUQVJUIHwgKDIgPDwgNikgfAorCQkJCQlNSV9CQVRDSF9OT05fU0VDVVJFX0k5NjUpOworCQkJaW50ZWxfcmluZ19lbWl0KHJpbmcsIG9mZnNldCk7CiAJCX0gZWxzZSB7Ci0JCQlpbnRlbF9yaW5nX2JlZ2luKGRldiwgcmluZywgMik7Ci0JCQlpZiAoSU5URUxfSU5GTyhkZXYpLT5nZW4gPj0gNCkgewotCQkJCWludGVsX3JpbmdfZW1pdChkZXYsIHJpbmcsCi0JCQkJCQlNSV9CQVRDSF9CVUZGRVJfU1RBUlQgfCAoMiA8PCA2KQotCQkJCQkJfCBNSV9CQVRDSF9OT05fU0VDVVJFX0k5NjUpOwotCQkJCWludGVsX3JpbmdfZW1pdChkZXYsIHJpbmcsIGV4ZWNfc3RhcnQpOwotCQkJfSBlbHNlIHsKLQkJCQlpbnRlbF9yaW5nX2VtaXQoZGV2LCByaW5nLCBNSV9CQVRDSF9CVUZGRVJfU1RBUlQKLQkJCQkJCXwgKDIgPDwgNikpOwotCQkJCWludGVsX3JpbmdfZW1pdChkZXYsIHJpbmcsIGV4ZWNfc3RhcnQgfAotCQkJCQkJTUlfQkFUQ0hfTk9OX1NFQ1VSRSk7Ci0JCQl9CisJCQlpbnRlbF9yaW5nX2VtaXQocmluZywKKwkJCQkJTUlfQkFUQ0hfQlVGRkVSX1NUQVJUIHwgKDIgPDwgNikpOworCQkJaW50ZWxfcmluZ19lbWl0KHJpbmcsIG9mZnNldCB8IE1JX0JBVENIX05PTl9TRUNVUkUpOwogCQl9Ci0JCWludGVsX3JpbmdfYWR2YW5jZShkZXYsIHJpbmcpOwogCX0KLQotCWlmIChJU19HNFgoZGV2KSB8fCBJU19HRU41KGRldikpIHsKLQkJaW50ZWxfcmluZ19iZWdpbihkZXYsIHJpbmcsIDIpOwotCQlpbnRlbF9yaW5nX2VtaXQoZGV2LCByaW5nLCBNSV9GTFVTSCB8Ci0JCQkJTUlfTk9fV1JJVEVfRkxVU0ggfAotCQkJCU1JX0lOVkFMSURBVEVfSVNQICk7Ci0JCWludGVsX3JpbmdfZW1pdChkZXYsIHJpbmcsIE1JX05PT1ApOwotCQlpbnRlbF9yaW5nX2FkdmFuY2UoZGV2LCByaW5nKTsKLQl9Ci0JLyogWFhYIGJyZWFkY3J1bWIgKi8KKwlpbnRlbF9yaW5nX2FkdmFuY2UocmluZyk7CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgY2xlYW51cF9zdGF0dXNfcGFnZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAotCQkJCXN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZykKK3N0YXRpYyB2b2lkIGNsZWFudXBfc3RhdHVzX3BhZ2Uoc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nKQogewotCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCXN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqOwotCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmpfcHJpdjsKKwlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gcmluZy0+ZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqOwogCiAJb2JqID0gcmluZy0+c3RhdHVzX3BhZ2Uub2JqOwogCWlmIChvYmogPT0gTlVMTCkKIAkJcmV0dXJuOwotCW9ial9wcml2ID0gdG9faW50ZWxfYm8ob2JqKTsKIAotCWt1bm1hcChvYmpfcHJpdi0+cGFnZXNbMF0pOworCWt1bm1hcChvYmotPnBhZ2VzWzBdKTsKIAlpOTE1X2dlbV9vYmplY3RfdW5waW4ob2JqKTsKLQlkcm1fZ2VtX29iamVjdF91bnJlZmVyZW5jZShvYmopOworCWRybV9nZW1fb2JqZWN0X3VucmVmZXJlbmNlKCZvYmotPmJhc2UpOwogCXJpbmctPnN0YXR1c19wYWdlLm9iaiA9IE5VTEw7CiAKIAltZW1zZXQoJmRldl9wcml2LT5od3NfbWFwLCAwLCBzaXplb2YoZGV2X3ByaXYtPmh3c19tYXApKTsKIH0KIAotc3RhdGljIGludCBpbml0X3N0YXR1c19wYWdlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCi0JCQkgICAgc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nKQorc3RhdGljIGludCBpbml0X3N0YXR1c19wYWdlKHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZykKIHsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gcmluZy0+ZGV2OwogCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCXN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqOwotCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmpfcHJpdjsKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqOwogCWludCByZXQ7CiAKIAlvYmogPSBpOTE1X2dlbV9hbGxvY19vYmplY3QoZGV2LCA0MDk2KTsKQEAgLTU0MCwxNiArNzA3LDE1IEBACiAJCXJldCA9IC1FTk9NRU07CiAJCWdvdG8gZXJyOwogCX0KLQlvYmpfcHJpdiA9IHRvX2ludGVsX2JvKG9iaik7Ci0Jb2JqX3ByaXYtPmFncF90eXBlID0gQUdQX1VTRVJfQ0FDSEVEX01FTU9SWTsKKwlvYmotPmFncF90eXBlID0gQUdQX1VTRVJfQ0FDSEVEX01FTU9SWTsKIAotCXJldCA9IGk5MTVfZ2VtX29iamVjdF9waW4ob2JqLCA0MDk2KTsKKwlyZXQgPSBpOTE1X2dlbV9vYmplY3RfcGluKG9iaiwgNDA5NiwgdHJ1ZSk7CiAJaWYgKHJldCAhPSAwKSB7CiAJCWdvdG8gZXJyX3VucmVmOwogCX0KIAotCXJpbmctPnN0YXR1c19wYWdlLmdmeF9hZGRyID0gb2JqX3ByaXYtPmd0dF9vZmZzZXQ7Ci0JcmluZy0+c3RhdHVzX3BhZ2UucGFnZV9hZGRyID0ga21hcChvYmpfcHJpdi0+cGFnZXNbMF0pOworCXJpbmctPnN0YXR1c19wYWdlLmdmeF9hZGRyID0gb2JqLT5ndHRfb2Zmc2V0OworCXJpbmctPnN0YXR1c19wYWdlLnBhZ2VfYWRkciA9IGttYXAob2JqLT5wYWdlc1swXSk7CiAJaWYgKHJpbmctPnN0YXR1c19wYWdlLnBhZ2VfYWRkciA9PSBOVUxMKSB7CiAJCW1lbXNldCgmZGV2X3ByaXYtPmh3c19tYXAsIDAsIHNpemVvZihkZXZfcHJpdi0+aHdzX21hcCkpOwogCQlnb3RvIGVycl91bnBpbjsKQEAgLTU1Nyw3ICs3MjMsNyBAQAogCXJpbmctPnN0YXR1c19wYWdlLm9iaiA9IG9iajsKIAltZW1zZXQocmluZy0+c3RhdHVzX3BhZ2UucGFnZV9hZGRyLCAwLCBQQUdFX1NJWkUpOwogCi0JaW50ZWxfcmluZ19zZXR1cF9zdGF0dXNfcGFnZShkZXYsIHJpbmcpOworCWludGVsX3Jpbmdfc2V0dXBfc3RhdHVzX3BhZ2UocmluZyk7CiAJRFJNX0RFQlVHX0RSSVZFUigiJXMgaHdzIG9mZnNldDogMHglMDh4XG4iLAogCQkJcmluZy0+bmFtZSwgcmluZy0+c3RhdHVzX3BhZ2UuZ2Z4X2FkZHIpOwogCkBAIC01NjYsNyArNzMyLDcgQEAKIGVycl91bnBpbjoKIAlpOTE1X2dlbV9vYmplY3RfdW5waW4ob2JqKTsKIGVycl91bnJlZjoKLQlkcm1fZ2VtX29iamVjdF91bnJlZmVyZW5jZShvYmopOworCWRybV9nZW1fb2JqZWN0X3VucmVmZXJlbmNlKCZvYmotPmJhc2UpOwogZXJyOgogCXJldHVybiByZXQ7CiB9CkBAIC01NzQsOSArNzQwLDcgQEAKIGludCBpbnRlbF9pbml0X3JpbmdfYnVmZmVyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCiAJCQkgICBzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcpCiB7Ci0Jc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqX3ByaXY7Ci0Jc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmo7CisJc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iajsKIAlpbnQgcmV0OwogCiAJcmluZy0+ZGV2ID0gZGV2OwpAQCAtNTg1LDcgKzc0OSw3IEBACiAJSU5JVF9MSVNUX0hFQUQoJnJpbmctPmdwdV93cml0ZV9saXN0KTsKIAogCWlmIChJOTE1X05FRURfR0ZYX0hXUyhkZXYpKSB7Ci0JCXJldCA9IGluaXRfc3RhdHVzX3BhZ2UoZGV2LCByaW5nKTsKKwkJcmV0ID0gaW5pdF9zdGF0dXNfcGFnZShyaW5nKTsKIAkJaWYgKHJldCkKIAkJCXJldHVybiByZXQ7CiAJfQpAQCAtNTk3LDE1ICs3NjEsMTQgQEAKIAkJZ290byBlcnJfaHdzOwogCX0KIAotCXJpbmctPmdlbV9vYmplY3QgPSBvYmo7CisJcmluZy0+b2JqID0gb2JqOwogCi0JcmV0ID0gaTkxNV9nZW1fb2JqZWN0X3BpbihvYmosIFBBR0VfU0laRSk7CisJcmV0ID0gaTkxNV9nZW1fb2JqZWN0X3BpbihvYmosIFBBR0VfU0laRSwgdHJ1ZSk7CiAJaWYgKHJldCkKIAkJZ290byBlcnJfdW5yZWY7CiAKLQlvYmpfcHJpdiA9IHRvX2ludGVsX2JvKG9iaik7CiAJcmluZy0+bWFwLnNpemUgPSByaW5nLT5zaXplOwotCXJpbmctPm1hcC5vZmZzZXQgPSBkZXYtPmFncC0+YmFzZSArIG9ial9wcml2LT5ndHRfb2Zmc2V0OworCXJpbmctPm1hcC5vZmZzZXQgPSBkZXYtPmFncC0+YmFzZSArIG9iai0+Z3R0X29mZnNldDsKIAlyaW5nLT5tYXAudHlwZSA9IDA7CiAJcmluZy0+bWFwLmZsYWdzID0gMDsKIAlyaW5nLT5tYXAubXRyciA9IDA7CkBAIC02MTgsNjAgKzc4MSw1NyBAQAogCX0KIAogCXJpbmctPnZpcnR1YWxfc3RhcnQgPSByaW5nLT5tYXAuaGFuZGxlOwotCXJldCA9IHJpbmctPmluaXQoZGV2LCByaW5nKTsKKwlyZXQgPSByaW5nLT5pbml0KHJpbmcpOwogCWlmIChyZXQpCiAJCWdvdG8gZXJyX3VubWFwOwogCi0JaWYgKCFkcm1fY29yZV9jaGVja19mZWF0dXJlKGRldiwgRFJJVkVSX01PREVTRVQpKQotCQlpOTE1X2tlcm5lbF9sb3N0X2NvbnRleHQoZGV2KTsKLQllbHNlIHsKLQkJcmluZy0+aGVhZCA9IEk5MTVfUkVBRF9IRUFEKHJpbmcpICYgSEVBRF9BRERSOwotCQlyaW5nLT50YWlsID0gSTkxNV9SRUFEX1RBSUwocmluZykgJiBUQUlMX0FERFI7Ci0JCXJpbmctPnNwYWNlID0gcmluZy0+aGVhZCAtIChyaW5nLT50YWlsICsgOCk7Ci0JCWlmIChyaW5nLT5zcGFjZSA8IDApCi0JCQlyaW5nLT5zcGFjZSArPSByaW5nLT5zaXplOwotCX0KLQlyZXR1cm4gcmV0OworCXJldHVybiAwOwogCiBlcnJfdW5tYXA6CiAJZHJtX2NvcmVfaW9yZW1hcGZyZWUoJnJpbmctPm1hcCwgZGV2KTsKIGVycl91bnBpbjoKIAlpOTE1X2dlbV9vYmplY3RfdW5waW4ob2JqKTsKIGVycl91bnJlZjoKLQlkcm1fZ2VtX29iamVjdF91bnJlZmVyZW5jZShvYmopOwotCXJpbmctPmdlbV9vYmplY3QgPSBOVUxMOworCWRybV9nZW1fb2JqZWN0X3VucmVmZXJlbmNlKCZvYmotPmJhc2UpOworCXJpbmctPm9iaiA9IE5VTEw7CiBlcnJfaHdzOgotCWNsZWFudXBfc3RhdHVzX3BhZ2UoZGV2LCByaW5nKTsKKwljbGVhbnVwX3N0YXR1c19wYWdlKHJpbmcpOwogCXJldHVybiByZXQ7CiB9CiAKLXZvaWQgaW50ZWxfY2xlYW51cF9yaW5nX2J1ZmZlcihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAotCQkJICAgICAgIHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZykKK3ZvaWQgaW50ZWxfY2xlYW51cF9yaW5nX2J1ZmZlcihzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcpCiB7Ci0JaWYgKHJpbmctPmdlbV9vYmplY3QgPT0gTlVMTCkKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXY7CisJaW50IHJldDsKKworCWlmIChyaW5nLT5vYmogPT0gTlVMTCkKIAkJcmV0dXJuOwogCi0JZHJtX2NvcmVfaW9yZW1hcGZyZWUoJnJpbmctPm1hcCwgZGV2KTsKKwkvKiBEaXNhYmxlIHRoZSByaW5nIGJ1ZmZlci4gVGhlIHJpbmcgbXVzdCBiZSBpZGxlIGF0IHRoaXMgcG9pbnQgKi8KKwlkZXZfcHJpdiA9IHJpbmctPmRldi0+ZGV2X3ByaXZhdGU7CisJcmV0ID0gaW50ZWxfd2FpdF9yaW5nX2J1ZmZlcihyaW5nLCByaW5nLT5zaXplIC0gOCk7CisJSTkxNV9XUklURV9DVEwocmluZywgMCk7CiAKLQlpOTE1X2dlbV9vYmplY3RfdW5waW4ocmluZy0+Z2VtX29iamVjdCk7Ci0JZHJtX2dlbV9vYmplY3RfdW5yZWZlcmVuY2UocmluZy0+Z2VtX29iamVjdCk7Ci0JcmluZy0+Z2VtX29iamVjdCA9IE5VTEw7CisJZHJtX2NvcmVfaW9yZW1hcGZyZWUoJnJpbmctPm1hcCwgcmluZy0+ZGV2KTsKKworCWk5MTVfZ2VtX29iamVjdF91bnBpbihyaW5nLT5vYmopOworCWRybV9nZW1fb2JqZWN0X3VucmVmZXJlbmNlKCZyaW5nLT5vYmotPmJhc2UpOworCXJpbmctPm9iaiA9IE5VTEw7CiAKIAlpZiAocmluZy0+Y2xlYW51cCkKIAkJcmluZy0+Y2xlYW51cChyaW5nKTsKIAotCWNsZWFudXBfc3RhdHVzX3BhZ2UoZGV2LCByaW5nKTsKKwljbGVhbnVwX3N0YXR1c19wYWdlKHJpbmcpOwogfQogCi1zdGF0aWMgaW50IGludGVsX3dyYXBfcmluZ19idWZmZXIoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKLQkJCQkgIHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZykKK3N0YXRpYyBpbnQgaW50ZWxfd3JhcF9yaW5nX2J1ZmZlcihzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcpCiB7CiAJdW5zaWduZWQgaW50ICp2aXJ0OwogCWludCByZW07CiAJcmVtID0gcmluZy0+c2l6ZSAtIHJpbmctPnRhaWw7CiAKIAlpZiAocmluZy0+c3BhY2UgPCByZW0pIHsKLQkJaW50IHJldCA9IGludGVsX3dhaXRfcmluZ19idWZmZXIoZGV2LCByaW5nLCByZW0pOworCQlpbnQgcmV0ID0gaW50ZWxfd2FpdF9yaW5nX2J1ZmZlcihyaW5nLCByZW0pOwogCQlpZiAocmV0KQogCQkJcmV0dXJuIHJldDsKIAl9CkBAIC02ODksMTEgKzg0OSwxMSBAQAogCXJldHVybiAwOwogfQogCi1pbnQgaW50ZWxfd2FpdF9yaW5nX2J1ZmZlcihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAotCQkJICAgc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nLCBpbnQgbikKK2ludCBpbnRlbF93YWl0X3JpbmdfYnVmZmVyKHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZywgaW50IG4pCiB7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHJpbmctPmRldjsKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXVuc2lnbmVkIGxvbmcgZW5kOwotCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXUzMiBoZWFkOwogCiAJdHJhY2VfaTkxNV9yaW5nX3dhaXRfYmVnaW4gKGRldik7CkBAIC03MTEsNyArODcxLDcgQEAKIAkJaWYgKHJpbmctPnNwYWNlIDwgMCkKIAkJCXJpbmctPnNwYWNlICs9IHJpbmctPnNpemU7CiAJCWlmIChyaW5nLT5zcGFjZSA+PSBuKSB7Ci0JCQl0cmFjZV9pOTE1X3Jpbmdfd2FpdF9lbmQgKGRldik7CisJCQl0cmFjZV9pOTE1X3Jpbmdfd2FpdF9lbmQoZGV2KTsKIAkJCXJldHVybiAwOwogCQl9CiAKQEAgLTcyMiwyOSArODgyLDM5IEBACiAJCX0KIAogCQltc2xlZXAoMSk7CisJCWlmIChhdG9taWNfcmVhZCgmZGV2X3ByaXYtPm1tLndlZGdlZCkpCisJCQlyZXR1cm4gLUVBR0FJTjsKIAl9IHdoaWxlICghdGltZV9hZnRlcihqaWZmaWVzLCBlbmQpKTsKIAl0cmFjZV9pOTE1X3Jpbmdfd2FpdF9lbmQgKGRldik7CiAJcmV0dXJuIC1FQlVTWTsKIH0KIAotdm9pZCBpbnRlbF9yaW5nX2JlZ2luKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCi0JCSAgICAgIHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZywKLQkJICAgICAgaW50IG51bV9kd29yZHMpCitpbnQgaW50ZWxfcmluZ19iZWdpbihzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcsCisJCSAgICAgaW50IG51bV9kd29yZHMpCiB7CiAJaW50IG4gPSA0Km51bV9kd29yZHM7Ci0JaWYgKHVubGlrZWx5KHJpbmctPnRhaWwgKyBuID4gcmluZy0+c2l6ZSkpCi0JCWludGVsX3dyYXBfcmluZ19idWZmZXIoZGV2LCByaW5nKTsKLQlpZiAodW5saWtlbHkocmluZy0+c3BhY2UgPCBuKSkKLQkJaW50ZWxfd2FpdF9yaW5nX2J1ZmZlcihkZXYsIHJpbmcsIG4pOworCWludCByZXQ7CisKKwlpZiAodW5saWtlbHkocmluZy0+dGFpbCArIG4gPiByaW5nLT5zaXplKSkgeworCQlyZXQgPSBpbnRlbF93cmFwX3JpbmdfYnVmZmVyKHJpbmcpOworCQlpZiAodW5saWtlbHkocmV0KSkKKwkJCXJldHVybiByZXQ7CisJfQorCisJaWYgKHVubGlrZWx5KHJpbmctPnNwYWNlIDwgbikpIHsKKwkJcmV0ID0gaW50ZWxfd2FpdF9yaW5nX2J1ZmZlcihyaW5nLCBuKTsKKwkJaWYgKHVubGlrZWx5KHJldCkpCisJCQlyZXR1cm4gcmV0OworCX0KIAogCXJpbmctPnNwYWNlIC09IG47CisJcmV0dXJuIDA7CiB9CiAKLXZvaWQgaW50ZWxfcmluZ19hZHZhbmNlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCi0JCQlzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcpCit2b2lkIGludGVsX3JpbmdfYWR2YW5jZShzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcpCiB7CiAJcmluZy0+dGFpbCAmPSByaW5nLT5zaXplIC0gMTsKLQlyaW5nLT53cml0ZV90YWlsKGRldiwgcmluZywgcmluZy0+dGFpbCk7CisJcmluZy0+d3JpdGVfdGFpbChyaW5nLCByaW5nLT50YWlsKTsKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciByZW5kZXJfcmluZyA9IHsKQEAgLTc1NiwxMCArOTI2LDExIEBACiAJLndyaXRlX3RhaWwJCT0gcmluZ193cml0ZV90YWlsLAogCS5mbHVzaAkJCT0gcmVuZGVyX3JpbmdfZmx1c2gsCiAJLmFkZF9yZXF1ZXN0CQk9IHJlbmRlcl9yaW5nX2FkZF9yZXF1ZXN0LAotCS5nZXRfc2Vxbm8JCT0gcmVuZGVyX3JpbmdfZ2V0X3NlcW5vLAotCS51c2VyX2lycV9nZXQJCT0gcmVuZGVyX3JpbmdfZ2V0X3VzZXJfaXJxLAotCS51c2VyX2lycV9wdXQJCT0gcmVuZGVyX3JpbmdfcHV0X3VzZXJfaXJxLAotCS5kaXNwYXRjaF9nZW1fZXhlY2J1ZmZlciA9IHJlbmRlcl9yaW5nX2Rpc3BhdGNoX2dlbV9leGVjYnVmZmVyLAorCS5nZXRfc2Vxbm8JCT0gcmluZ19nZXRfc2Vxbm8sCisJLmlycV9nZXQJCT0gcmVuZGVyX3JpbmdfZ2V0X2lycSwKKwkuaXJxX3B1dAkJPSByZW5kZXJfcmluZ19wdXRfaXJxLAorCS5kaXNwYXRjaF9leGVjYnVmZmVyCT0gcmVuZGVyX3JpbmdfZGlzcGF0Y2hfZXhlY2J1ZmZlciwKKyAgICAgICAuY2xlYW51cAkJCT0gcmVuZGVyX3JpbmdfY2xlYW51cCwKIH07CiAKIC8qIHJpbmcgYnVmZmVyIGZvciBiaXQtc3RyZWFtIGRlY29kZXIgKi8KQEAgLTc2OSwyMiArOTQwLDIxIEBACiAJLmlkCQkJPSBSSU5HX0JTRCwKIAkubW1pb19iYXNlCQk9IEJTRF9SSU5HX0JBU0UsCiAJLnNpemUJCQk9IDMyICogUEFHRV9TSVpFLAotCS5pbml0CQkJPSBpbml0X2JzZF9yaW5nLAorCS5pbml0CQkJPSBpbml0X3JpbmdfY29tbW9uLAogCS53cml0ZV90YWlsCQk9IHJpbmdfd3JpdGVfdGFpbCwKIAkuZmx1c2gJCQk9IGJzZF9yaW5nX2ZsdXNoLAogCS5hZGRfcmVxdWVzdAkJPSByaW5nX2FkZF9yZXF1ZXN0LAotCS5nZXRfc2Vxbm8JCT0gcmluZ19zdGF0dXNfcGFnZV9nZXRfc2Vxbm8sCi0JLnVzZXJfaXJxX2dldAkJPSBic2RfcmluZ19nZXRfdXNlcl9pcnEsCi0JLnVzZXJfaXJxX3B1dAkJPSBic2RfcmluZ19wdXRfdXNlcl9pcnEsCi0JLmRpc3BhdGNoX2dlbV9leGVjYnVmZmVyID0gcmluZ19kaXNwYXRjaF9nZW1fZXhlY2J1ZmZlciwKKwkuZ2V0X3NlcW5vCQk9IHJpbmdfZ2V0X3NlcW5vLAorCS5pcnFfZ2V0CQk9IGJzZF9yaW5nX2dldF9pcnEsCisJLmlycV9wdXQJCT0gYnNkX3JpbmdfcHV0X2lycSwKKwkuZGlzcGF0Y2hfZXhlY2J1ZmZlcgk9IHJpbmdfZGlzcGF0Y2hfZXhlY2J1ZmZlciwKIH07CiAKIAotc3RhdGljIHZvaWQgZ2VuNl9ic2RfcmluZ193cml0ZV90YWlsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCi0JCQkJICAgICBzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcsCitzdGF0aWMgdm9pZCBnZW42X2JzZF9yaW5nX3dyaXRlX3RhaWwoc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nLAogCQkJCSAgICAgdTMyIHZhbHVlKQogewotICAgICAgIGRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworICAgICAgIGRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSByaW5nLT5kZXYtPmRldl9wcml2YXRlOwogCiAgICAgICAgLyogRXZlcnkgdGFpbCBtb3ZlIG11c3QgZm9sbG93IHRoZSBzZXF1ZW5jZSBiZWxvdyAqLwogICAgICAgIEk5MTVfV1JJVEUoR0VONl9CU0RfU0xFRVBfUFNNSV9DT05UUk9MLApAQCAtODAzLDY5ICs5NzMsODAgQEAKIAkgICAgICAgR0VONl9CU0RfU0xFRVBfUFNNSV9DT05UUk9MX1JDX0lMRExfTUVTU0FHRV9FTkFCTEUpOwogfQogCi1zdGF0aWMgdm9pZCBnZW42X3JpbmdfZmx1c2goc3RydWN0IGRybV9kZXZpY2UgKmRldiwKLQkJCSAgICBzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcsCitzdGF0aWMgdm9pZCBnZW42X3JpbmdfZmx1c2goc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nLAogCQkJICAgIHUzMiBpbnZhbGlkYXRlX2RvbWFpbnMsCiAJCQkgICAgdTMyIGZsdXNoX2RvbWFpbnMpCiB7Ci0gICAgICAgaW50ZWxfcmluZ19iZWdpbihkZXYsIHJpbmcsIDQpOwotICAgICAgIGludGVsX3JpbmdfZW1pdChkZXYsIHJpbmcsIE1JX0ZMVVNIX0RXKTsKLSAgICAgICBpbnRlbF9yaW5nX2VtaXQoZGV2LCByaW5nLCAwKTsKLSAgICAgICBpbnRlbF9yaW5nX2VtaXQoZGV2LCByaW5nLCAwKTsKLSAgICAgICBpbnRlbF9yaW5nX2VtaXQoZGV2LCByaW5nLCAwKTsKLSAgICAgICBpbnRlbF9yaW5nX2FkdmFuY2UoZGV2LCByaW5nKTsKKwlpZiAoKGZsdXNoX2RvbWFpbnMgJiBJOTE1X0dFTV9ET01BSU5fUkVOREVSKSA9PSAwKQorCQlyZXR1cm47CisKKwlpZiAoaW50ZWxfcmluZ19iZWdpbihyaW5nLCA0KSA9PSAwKSB7CisJCWludGVsX3JpbmdfZW1pdChyaW5nLCBNSV9GTFVTSF9EVyk7CisJCWludGVsX3JpbmdfZW1pdChyaW5nLCAwKTsKKwkJaW50ZWxfcmluZ19lbWl0KHJpbmcsIDApOworCQlpbnRlbF9yaW5nX2VtaXQocmluZywgMCk7CisJCWludGVsX3JpbmdfYWR2YW5jZShyaW5nKTsKKwl9CiB9CiAKIHN0YXRpYyBpbnQKLWdlbjZfcmluZ19kaXNwYXRjaF9nZW1fZXhlY2J1ZmZlcihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAotCQkJCSAgc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nLAotCQkJCSAgc3RydWN0IGRybV9pOTE1X2dlbV9leGVjYnVmZmVyMiAqZXhlYywKLQkJCQkgIHN0cnVjdCBkcm1fY2xpcF9yZWN0ICpjbGlwcmVjdHMsCi0JCQkJICB1aW50NjRfdCBleGVjX29mZnNldCkKK2dlbjZfcmluZ19kaXNwYXRjaF9leGVjYnVmZmVyKHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZywKKwkJCSAgICAgIHUzMiBvZmZzZXQsIHUzMiBsZW4pCiB7Ci0gICAgICAgdWludDMyX3QgZXhlY19zdGFydDsKKyAgICAgICBpbnQgcmV0OwogCi0gICAgICAgZXhlY19zdGFydCA9ICh1aW50MzJfdCkgZXhlY19vZmZzZXQgKyBleGVjLT5iYXRjaF9zdGFydF9vZmZzZXQ7CisgICAgICAgcmV0ID0gaW50ZWxfcmluZ19iZWdpbihyaW5nLCAyKTsKKyAgICAgICBpZiAocmV0KQorCSAgICAgICByZXR1cm4gcmV0OwogCi0gICAgICAgaW50ZWxfcmluZ19iZWdpbihkZXYsIHJpbmcsIDIpOwotICAgICAgIGludGVsX3JpbmdfZW1pdChkZXYsIHJpbmcsCi0JCSAgICAgICBNSV9CQVRDSF9CVUZGRVJfU1RBUlQgfCBNSV9CQVRDSF9OT05fU0VDVVJFX0k5NjUpOworICAgICAgIGludGVsX3JpbmdfZW1pdChyaW5nLCBNSV9CQVRDSF9CVUZGRVJfU1RBUlQgfCBNSV9CQVRDSF9OT05fU0VDVVJFX0k5NjUpOwogICAgICAgIC8qIGJpdDAtNyBpcyB0aGUgbGVuZ3RoIG9uIEdFTjYrICovCi0gICAgICAgaW50ZWxfcmluZ19lbWl0KGRldiwgcmluZywgZXhlY19zdGFydCk7Ci0gICAgICAgaW50ZWxfcmluZ19hZHZhbmNlKGRldiwgcmluZyk7CisgICAgICAgaW50ZWxfcmluZ19lbWl0KHJpbmcsIG9mZnNldCk7CisgICAgICAgaW50ZWxfcmluZ19hZHZhbmNlKHJpbmcpOwogCiAgICAgICAgcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBib29sCitnZW42X2JzZF9yaW5nX2dldF9pcnEoc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nKQoreworCXJldHVybiByaW5nX2dldF9pcnEocmluZywgR1RfR0VONl9CU0RfVVNFUl9JTlRFUlJVUFQpOworfQorCitzdGF0aWMgdm9pZAorZ2VuNl9ic2RfcmluZ19wdXRfaXJxKHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZykKK3sKKwlyaW5nX3B1dF9pcnEocmluZywgR1RfR0VONl9CU0RfVVNFUl9JTlRFUlJVUFQpOworfQorCiAvKiByaW5nIGJ1ZmZlciBmb3IgVmlkZW8gQ29kZWMgZm9yIEdlbjYrICovCiBzdGF0aWMgY29uc3Qgc3RydWN0IGludGVsX3JpbmdfYnVmZmVyIGdlbjZfYnNkX3JpbmcgPSB7Ci0gICAgICAgLm5hbWUJCQk9ICJnZW42IGJzZCByaW5nIiwKLSAgICAgICAuaWQJCQk9IFJJTkdfQlNELAotICAgICAgIC5tbWlvX2Jhc2UJCT0gR0VONl9CU0RfUklOR19CQVNFLAotICAgICAgIC5zaXplCQkJPSAzMiAqIFBBR0VfU0laRSwKLSAgICAgICAuaW5pdAkJCT0gaW5pdF9ic2RfcmluZywKLSAgICAgICAud3JpdGVfdGFpbAkJPSBnZW42X2JzZF9yaW5nX3dyaXRlX3RhaWwsCi0gICAgICAgLmZsdXNoCQkJPSBnZW42X3JpbmdfZmx1c2gsCi0gICAgICAgLmFkZF9yZXF1ZXN0CQk9IHJpbmdfYWRkX3JlcXVlc3QsCi0gICAgICAgLmdldF9zZXFubwkJPSByaW5nX3N0YXR1c19wYWdlX2dldF9zZXFubywKLSAgICAgICAudXNlcl9pcnFfZ2V0CQk9IGJzZF9yaW5nX2dldF91c2VyX2lycSwKLSAgICAgICAudXNlcl9pcnFfcHV0CQk9IGJzZF9yaW5nX3B1dF91c2VyX2lycSwKLSAgICAgICAuZGlzcGF0Y2hfZ2VtX2V4ZWNidWZmZXIJPSBnZW42X3JpbmdfZGlzcGF0Y2hfZ2VtX2V4ZWNidWZmZXIsCisJLm5hbWUJCQk9ICJnZW42IGJzZCByaW5nIiwKKwkuaWQJCQk9IFJJTkdfQlNELAorCS5tbWlvX2Jhc2UJCT0gR0VONl9CU0RfUklOR19CQVNFLAorCS5zaXplCQkJPSAzMiAqIFBBR0VfU0laRSwKKwkuaW5pdAkJCT0gaW5pdF9yaW5nX2NvbW1vbiwKKwkud3JpdGVfdGFpbAkJPSBnZW42X2JzZF9yaW5nX3dyaXRlX3RhaWwsCisJLmZsdXNoCQkJPSBnZW42X3JpbmdfZmx1c2gsCisJLmFkZF9yZXF1ZXN0CQk9IGdlbjZfYWRkX3JlcXVlc3QsCisJLmdldF9zZXFubwkJPSByaW5nX2dldF9zZXFubywKKwkuaXJxX2dldAkJPSBnZW42X2JzZF9yaW5nX2dldF9pcnEsCisJLmlycV9wdXQJCT0gZ2VuNl9ic2RfcmluZ19wdXRfaXJxLAorCS5kaXNwYXRjaF9leGVjYnVmZmVyCT0gZ2VuNl9yaW5nX2Rpc3BhdGNoX2V4ZWNidWZmZXIsCiB9OwogCiAvKiBCbGl0dGVyIHN1cHBvcnQgKFNhbmR5QnJpZGdlKykgKi8KIAotc3RhdGljIHZvaWQKLWJsdF9yaW5nX2dldF91c2VyX2lycShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAotCQkgICAgICBzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcpCitzdGF0aWMgYm9vbAorYmx0X3JpbmdfZ2V0X2lycShzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcpCiB7Ci0JLyogZG8gbm90aGluZyAqLworCXJldHVybiByaW5nX2dldF9pcnEocmluZywgR1RfQkxUX1VTRVJfSU5URVJSVVBUKTsKIH0KKwogc3RhdGljIHZvaWQKLWJsdF9yaW5nX3B1dF91c2VyX2lycShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAotCQkgICAgICBzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcpCitibHRfcmluZ19wdXRfaXJxKHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZykKIHsKLQkvKiBkbyBub3RoaW5nICovCisJcmluZ19wdXRfaXJxKHJpbmcsIEdUX0JMVF9VU0VSX0lOVEVSUlVQVCk7CiB9CiAKIApAQCAtODgzLDMyICsxMDY0LDMxIEBACiAJcmV0dXJuIHJpbmctPnByaXZhdGU7CiB9CiAKLXN0YXRpYyBpbnQgYmx0X3JpbmdfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAotCQkJIHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZykKK3N0YXRpYyBpbnQgYmx0X3JpbmdfaW5pdChzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcpCiB7Ci0JaWYgKE5FRURfQkxUX1dPUktBUk9VTkQoZGV2KSkgeworCWlmIChORUVEX0JMVF9XT1JLQVJPVU5EKHJpbmctPmRldikpIHsKIAkJc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iajsKLQkJdTMyIF9faW9tZW0gKnB0cjsKKwkJdTMyICpwdHI7CiAJCWludCByZXQ7CiAKLQkJb2JqID0gdG9faW50ZWxfYm8oaTkxNV9nZW1fYWxsb2Nfb2JqZWN0KGRldiwgNDA5NikpOworCQlvYmogPSBpOTE1X2dlbV9hbGxvY19vYmplY3QocmluZy0+ZGV2LCA0MDk2KTsKIAkJaWYgKG9iaiA9PSBOVUxMKQogCQkJcmV0dXJuIC1FTk9NRU07CiAKLQkJcmV0ID0gaTkxNV9nZW1fb2JqZWN0X3Bpbigmb2JqLT5iYXNlLCA0MDk2KTsKKwkJcmV0ID0gaTkxNV9nZW1fb2JqZWN0X3BpbihvYmosIDQwOTYsIHRydWUpOwogCQlpZiAocmV0KSB7CiAJCQlkcm1fZ2VtX29iamVjdF91bnJlZmVyZW5jZSgmb2JqLT5iYXNlKTsKIAkJCXJldHVybiByZXQ7CiAJCX0KIAogCQlwdHIgPSBrbWFwKG9iai0+cGFnZXNbMF0pOwotCQlpb3dyaXRlMzIoTUlfQkFUQ0hfQlVGRkVSX0VORCwgcHRyKTsKLQkJaW93cml0ZTMyKE1JX05PT1AsIHB0cisxKTsKKwkJKnB0cisrID0gTUlfQkFUQ0hfQlVGRkVSX0VORDsKKwkJKnB0cisrID0gTUlfTk9PUDsKIAkJa3VubWFwKG9iai0+cGFnZXNbMF0pOwogCi0JCXJldCA9IGk5MTVfZ2VtX29iamVjdF9zZXRfdG9fZ3R0X2RvbWFpbigmb2JqLT5iYXNlLCBmYWxzZSk7CisJCXJldCA9IGk5MTVfZ2VtX29iamVjdF9zZXRfdG9fZ3R0X2RvbWFpbihvYmosIGZhbHNlKTsKIAkJaWYgKHJldCkgewotCQkJaTkxNV9nZW1fb2JqZWN0X3VucGluKCZvYmotPmJhc2UpOworCQkJaTkxNV9nZW1fb2JqZWN0X3VucGluKG9iaik7CiAJCQlkcm1fZ2VtX29iamVjdF91bnJlZmVyZW5jZSgmb2JqLT5iYXNlKTsKIAkJCXJldHVybiByZXQ7CiAJCX0KQEAgLTkxNiw1MSArMTA5NiwzOSBAQAogCQlyaW5nLT5wcml2YXRlID0gb2JqOwogCX0KIAotCXJldHVybiBpbml0X3JpbmdfY29tbW9uKGRldiwgcmluZyk7CisJcmV0dXJuIGluaXRfcmluZ19jb21tb24ocmluZyk7CiB9CiAKLXN0YXRpYyB2b2lkIGJsdF9yaW5nX2JlZ2luKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCi0JCQkgICBzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcsCitzdGF0aWMgaW50IGJsdF9yaW5nX2JlZ2luKHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZywKIAkJCSAgaW50IG51bV9kd29yZHMpCiB7CiAJaWYgKHJpbmctPnByaXZhdGUpIHsKLQkJaW50ZWxfcmluZ19iZWdpbihkZXYsIHJpbmcsIG51bV9kd29yZHMrMik7Ci0JCWludGVsX3JpbmdfZW1pdChkZXYsIHJpbmcsIE1JX0JBVENIX0JVRkZFUl9TVEFSVCk7Ci0JCWludGVsX3JpbmdfZW1pdChkZXYsIHJpbmcsIHRvX2JsdF93b3JrYXJvdW5kKHJpbmcpLT5ndHRfb2Zmc2V0KTsKKwkJaW50IHJldCA9IGludGVsX3JpbmdfYmVnaW4ocmluZywgbnVtX2R3b3JkcysyKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisKKwkJaW50ZWxfcmluZ19lbWl0KHJpbmcsIE1JX0JBVENIX0JVRkZFUl9TVEFSVCk7CisJCWludGVsX3JpbmdfZW1pdChyaW5nLCB0b19ibHRfd29ya2Fyb3VuZChyaW5nKS0+Z3R0X29mZnNldCk7CisKKwkJcmV0dXJuIDA7CiAJfSBlbHNlCi0JCWludGVsX3JpbmdfYmVnaW4oZGV2LCByaW5nLCA0KTsKKwkJcmV0dXJuIGludGVsX3JpbmdfYmVnaW4ocmluZywgNCk7CiB9CiAKLXN0YXRpYyB2b2lkIGJsdF9yaW5nX2ZsdXNoKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCi0JCQkgICBzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcsCitzdGF0aWMgdm9pZCBibHRfcmluZ19mbHVzaChzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcsCiAJCQkgICB1MzIgaW52YWxpZGF0ZV9kb21haW5zLAogCQkJICAgdTMyIGZsdXNoX2RvbWFpbnMpCiB7Ci0JYmx0X3JpbmdfYmVnaW4oZGV2LCByaW5nLCA0KTsKLQlpbnRlbF9yaW5nX2VtaXQoZGV2LCByaW5nLCBNSV9GTFVTSF9EVyk7Ci0JaW50ZWxfcmluZ19lbWl0KGRldiwgcmluZywgMCk7Ci0JaW50ZWxfcmluZ19lbWl0KGRldiwgcmluZywgMCk7Ci0JaW50ZWxfcmluZ19lbWl0KGRldiwgcmluZywgMCk7Ci0JaW50ZWxfcmluZ19hZHZhbmNlKGRldiwgcmluZyk7Ci19CisJaWYgKChmbHVzaF9kb21haW5zICYgSTkxNV9HRU1fRE9NQUlOX1JFTkRFUikgPT0gMCkKKwkJcmV0dXJuOwogCi1zdGF0aWMgdTMyCi1ibHRfcmluZ19hZGRfcmVxdWVzdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAotCQkgICAgIHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZywKLQkJICAgICB1MzIgZmx1c2hfZG9tYWlucykKLXsKLQl1MzIgc2Vxbm8gPSBpOTE1X2dlbV9nZXRfc2Vxbm8oZGV2KTsKLQotCWJsdF9yaW5nX2JlZ2luKGRldiwgcmluZywgNCk7Ci0JaW50ZWxfcmluZ19lbWl0KGRldiwgcmluZywgTUlfU1RPUkVfRFdPUkRfSU5ERVgpOwotCWludGVsX3JpbmdfZW1pdChkZXYsIHJpbmcsCi0JCQlJOTE1X0dFTV9IV1NfSU5ERVggPDwgTUlfU1RPUkVfRFdPUkRfSU5ERVhfU0hJRlQpOwotCWludGVsX3JpbmdfZW1pdChkZXYsIHJpbmcsIHNlcW5vKTsKLQlpbnRlbF9yaW5nX2VtaXQoZGV2LCByaW5nLCBNSV9VU0VSX0lOVEVSUlVQVCk7Ci0JaW50ZWxfcmluZ19hZHZhbmNlKGRldiwgcmluZyk7Ci0KLQlEUk1fREVCVUdfRFJJVkVSKCIlcyAlZFxuIiwgcmluZy0+bmFtZSwgc2Vxbm8pOwotCXJldHVybiBzZXFubzsKKwlpZiAoYmx0X3JpbmdfYmVnaW4ocmluZywgNCkgPT0gMCkgeworCQlpbnRlbF9yaW5nX2VtaXQocmluZywgTUlfRkxVU0hfRFcpOworCQlpbnRlbF9yaW5nX2VtaXQocmluZywgMCk7CisJCWludGVsX3JpbmdfZW1pdChyaW5nLCAwKTsKKwkJaW50ZWxfcmluZ19lbWl0KHJpbmcsIDApOworCQlpbnRlbF9yaW5nX2FkdmFuY2UocmluZyk7CisJfQogfQogCiBzdGF0aWMgdm9pZCBibHRfcmluZ19jbGVhbnVwKHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZykKQEAgLTk4MSw0NyArMTE0OSw1NCBAQAogICAgICAgIC5pbml0CQkJPSBibHRfcmluZ19pbml0LAogICAgICAgIC53cml0ZV90YWlsCQk9IHJpbmdfd3JpdGVfdGFpbCwKICAgICAgICAuZmx1c2gJCQk9IGJsdF9yaW5nX2ZsdXNoLAotICAgICAgIC5hZGRfcmVxdWVzdAkJPSBibHRfcmluZ19hZGRfcmVxdWVzdCwKLSAgICAgICAuZ2V0X3NlcW5vCQk9IHJpbmdfc3RhdHVzX3BhZ2VfZ2V0X3NlcW5vLAotICAgICAgIC51c2VyX2lycV9nZXQJCT0gYmx0X3JpbmdfZ2V0X3VzZXJfaXJxLAotICAgICAgIC51c2VyX2lycV9wdXQJCT0gYmx0X3JpbmdfcHV0X3VzZXJfaXJxLAotICAgICAgIC5kaXNwYXRjaF9nZW1fZXhlY2J1ZmZlcgk9IGdlbjZfcmluZ19kaXNwYXRjaF9nZW1fZXhlY2J1ZmZlciwKKyAgICAgICAuYWRkX3JlcXVlc3QJCT0gZ2VuNl9hZGRfcmVxdWVzdCwKKyAgICAgICAuZ2V0X3NlcW5vCQk9IHJpbmdfZ2V0X3NlcW5vLAorICAgICAgIC5pcnFfZ2V0CQkJPSBibHRfcmluZ19nZXRfaXJxLAorICAgICAgIC5pcnFfcHV0CQkJPSBibHRfcmluZ19wdXRfaXJxLAorICAgICAgIC5kaXNwYXRjaF9leGVjYnVmZmVyCT0gZ2VuNl9yaW5nX2Rpc3BhdGNoX2V4ZWNidWZmZXIsCiAgICAgICAgLmNsZWFudXAJCQk9IGJsdF9yaW5nX2NsZWFudXAsCiB9OwogCiBpbnQgaW50ZWxfaW5pdF9yZW5kZXJfcmluZ19idWZmZXIoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKIAlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcgPSAmZGV2X3ByaXYtPnJpbmdbUkNTXTsKIAotCWRldl9wcml2LT5yZW5kZXJfcmluZyA9IHJlbmRlcl9yaW5nOwotCi0JaWYgKCFJOTE1X05FRURfR0ZYX0hXUyhkZXYpKSB7Ci0JCWRldl9wcml2LT5yZW5kZXJfcmluZy5zdGF0dXNfcGFnZS5wYWdlX2FkZHIKLQkJCT0gZGV2X3ByaXYtPnN0YXR1c19wYWdlX2RtYWgtPnZhZGRyOwotCQltZW1zZXQoZGV2X3ByaXYtPnJlbmRlcl9yaW5nLnN0YXR1c19wYWdlLnBhZ2VfYWRkciwKLQkJCQkwLCBQQUdFX1NJWkUpOworCSpyaW5nID0gcmVuZGVyX3Jpbmc7CisJaWYgKElOVEVMX0lORk8oZGV2KS0+Z2VuID49IDYpIHsKKwkJcmluZy0+YWRkX3JlcXVlc3QgPSBnZW42X2FkZF9yZXF1ZXN0OworCX0gZWxzZSBpZiAoSVNfR0VONShkZXYpKSB7CisJCXJpbmctPmFkZF9yZXF1ZXN0ID0gcGNfcmVuZGVyX2FkZF9yZXF1ZXN0OworCQlyaW5nLT5nZXRfc2Vxbm8gPSBwY19yZW5kZXJfZ2V0X3NlcW5vOwogCX0KIAotCXJldHVybiBpbnRlbF9pbml0X3JpbmdfYnVmZmVyKGRldiwgJmRldl9wcml2LT5yZW5kZXJfcmluZyk7CisJaWYgKCFJOTE1X05FRURfR0ZYX0hXUyhkZXYpKSB7CisJCXJpbmctPnN0YXR1c19wYWdlLnBhZ2VfYWRkciA9IGRldl9wcml2LT5zdGF0dXNfcGFnZV9kbWFoLT52YWRkcjsKKwkJbWVtc2V0KHJpbmctPnN0YXR1c19wYWdlLnBhZ2VfYWRkciwgMCwgUEFHRV9TSVpFKTsKKwl9CisKKwlyZXR1cm4gaW50ZWxfaW5pdF9yaW5nX2J1ZmZlcihkZXYsIHJpbmcpOwogfQogCiBpbnQgaW50ZWxfaW5pdF9ic2RfcmluZ19idWZmZXIoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKIAlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcgPSAmZGV2X3ByaXYtPnJpbmdbVkNTXTsKIAogCWlmIChJU19HRU42KGRldikpCi0JCWRldl9wcml2LT5ic2RfcmluZyA9IGdlbjZfYnNkX3Jpbmc7CisJCSpyaW5nID0gZ2VuNl9ic2RfcmluZzsKIAllbHNlCi0JCWRldl9wcml2LT5ic2RfcmluZyA9IGJzZF9yaW5nOworCQkqcmluZyA9IGJzZF9yaW5nOwogCi0JcmV0dXJuIGludGVsX2luaXRfcmluZ19idWZmZXIoZGV2LCAmZGV2X3ByaXYtPmJzZF9yaW5nKTsKKwlyZXR1cm4gaW50ZWxfaW5pdF9yaW5nX2J1ZmZlcihkZXYsIHJpbmcpOwogfQogCiBpbnQgaW50ZWxfaW5pdF9ibHRfcmluZ19idWZmZXIoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKIAlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcgPSAmZGV2X3ByaXYtPnJpbmdbQkNTXTsKIAotCWRldl9wcml2LT5ibHRfcmluZyA9IGdlbjZfYmx0X3Jpbmc7CisJKnJpbmcgPSBnZW42X2JsdF9yaW5nOwogCi0JcmV0dXJuIGludGVsX2luaXRfcmluZ19idWZmZXIoZGV2LCAmZGV2X3ByaXYtPmJsdF9yaW5nKTsKKwlyZXR1cm4gaW50ZWxfaW5pdF9yaW5nX2J1ZmZlcihkZXYsIHJpbmcpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfcmluZ2J1ZmZlci5oIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfcmluZ2J1ZmZlci5oCmluZGV4IGQyY2QwZjEuLjhlMmUzNTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX3JpbmdidWZmZXIuaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9yaW5nYnVmZmVyLmgKQEAgLTEsMjIgKzEsMzcgQEAKICNpZm5kZWYgX0lOVEVMX1JJTkdCVUZGRVJfSF8KICNkZWZpbmUgX0lOVEVMX1JJTkdCVUZGRVJfSF8KIAotc3RydWN0ICBpbnRlbF9od19zdGF0dXNfcGFnZSB7Ci0Jdm9pZAkJKnBhZ2VfYWRkcjsKLQl1bnNpZ25lZCBpbnQJZ2Z4X2FkZHI7Ci0Jc3RydWN0CQlkcm1fZ2VtX29iamVjdCAqb2JqOworZW51bSB7CisgICAgUkNTID0gMHgwLAorICAgIFZDUywKKyAgICBCQ1MsCisgICAgSTkxNV9OVU1fUklOR1MsCiB9OwogCi0jZGVmaW5lIEk5MTVfUkVBRF9UQUlMKHJpbmcpIEk5MTVfUkVBRChSSU5HX1RBSUwocmluZy0+bW1pb19iYXNlKSkKK3N0cnVjdCAgaW50ZWxfaHdfc3RhdHVzX3BhZ2UgeworCXUzMglfX2lvbWVtCSpwYWdlX2FkZHI7CisJdW5zaWduZWQgaW50CWdmeF9hZGRyOworCXN0cnVjdAkJZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqOworfTsKKworI2RlZmluZSBJOTE1X1JJTkdfUkVBRChyZWcpIGk5MTVfc2FmZV9yZWFkKGRldl9wcml2LCByZWcpCisKKyNkZWZpbmUgSTkxNV9SRUFEX1RBSUwocmluZykgSTkxNV9SSU5HX1JFQUQoUklOR19UQUlMKHJpbmctPm1taW9fYmFzZSkpCiAjZGVmaW5lIEk5MTVfV1JJVEVfVEFJTChyaW5nLCB2YWwpIEk5MTVfV1JJVEUoUklOR19UQUlMKHJpbmctPm1taW9fYmFzZSksIHZhbCkKLSNkZWZpbmUgSTkxNV9SRUFEX1NUQVJUKHJpbmcpIEk5MTVfUkVBRChSSU5HX1NUQVJUKHJpbmctPm1taW9fYmFzZSkpCisKKyNkZWZpbmUgSTkxNV9SRUFEX1NUQVJUKHJpbmcpIEk5MTVfUklOR19SRUFEKFJJTkdfU1RBUlQocmluZy0+bW1pb19iYXNlKSkKICNkZWZpbmUgSTkxNV9XUklURV9TVEFSVChyaW5nLCB2YWwpIEk5MTVfV1JJVEUoUklOR19TVEFSVChyaW5nLT5tbWlvX2Jhc2UpLCB2YWwpCi0jZGVmaW5lIEk5MTVfUkVBRF9IRUFEKHJpbmcpIEk5MTVfUkVBRChSSU5HX0hFQUQocmluZy0+bW1pb19iYXNlKSkKKworI2RlZmluZSBJOTE1X1JFQURfSEVBRChyaW5nKSAgSTkxNV9SSU5HX1JFQUQoUklOR19IRUFEKHJpbmctPm1taW9fYmFzZSkpCiAjZGVmaW5lIEk5MTVfV1JJVEVfSEVBRChyaW5nLCB2YWwpIEk5MTVfV1JJVEUoUklOR19IRUFEKHJpbmctPm1taW9fYmFzZSksIHZhbCkKLSNkZWZpbmUgSTkxNV9SRUFEX0NUTChyaW5nKSBJOTE1X1JFQUQoUklOR19DVEwocmluZy0+bW1pb19iYXNlKSkKKworI2RlZmluZSBJOTE1X1JFQURfQ1RMKHJpbmcpIEk5MTVfUklOR19SRUFEKFJJTkdfQ1RMKHJpbmctPm1taW9fYmFzZSkpCiAjZGVmaW5lIEk5MTVfV1JJVEVfQ1RMKHJpbmcsIHZhbCkgSTkxNV9XUklURShSSU5HX0NUTChyaW5nLT5tbWlvX2Jhc2UpLCB2YWwpCiAKLXN0cnVjdCBkcm1faTkxNV9nZW1fZXhlY2J1ZmZlcjI7CisjZGVmaW5lIEk5MTVfUkVBRF9OT1BJRChyaW5nKSBJOTE1X1JJTkdfUkVBRChSSU5HX05PUElEKHJpbmctPm1taW9fYmFzZSkpCisjZGVmaW5lIEk5MTVfUkVBRF9TWU5DXzAocmluZykgSTkxNV9SSU5HX1JFQUQoUklOR19TWU5DXzAocmluZy0+bW1pb19iYXNlKSkKKyNkZWZpbmUgSTkxNV9SRUFEX1NZTkNfMShyaW5nKSBJOTE1X1JJTkdfUkVBRChSSU5HX1NZTkNfMShyaW5nLT5tbWlvX2Jhc2UpKQorCiBzdHJ1Y3QgIGludGVsX3JpbmdfYnVmZmVyIHsKIAljb25zdCBjaGFyCSpuYW1lOwogCWVudW0gaW50ZWxfcmluZ19pZCB7CkBAIC0yNSw0NSArNDAsMzYgQEAKIAkJUklOR19CTFQgPSAweDQsCiAJfSBpZDsKIAl1MzIJCW1taW9fYmFzZTsKLQl1bnNpZ25lZCBsb25nCXNpemU7CiAJdm9pZAkJKnZpcnR1YWxfc3RhcnQ7CiAJc3RydWN0CQlkcm1fZGV2aWNlICpkZXY7Ci0Jc3RydWN0CQlkcm1fZ2VtX29iamVjdCAqZ2VtX29iamVjdDsKKwlzdHJ1Y3QJCWRybV9pOTE1X2dlbV9vYmplY3QgKm9iajsKIAogCXUzMgkJYWN0dWFsX2hlYWQ7CiAJdTMyCQloZWFkOwogCXUzMgkJdGFpbDsKIAlpbnQJCXNwYWNlOworCWludAkJc2l6ZTsKIAlzdHJ1Y3QgaW50ZWxfaHdfc3RhdHVzX3BhZ2Ugc3RhdHVzX3BhZ2U7CiAKLQl1MzIJCWlycV9nZW1fc2Vxbm87CQkvKiBsYXN0IHNlcSBzZWVtIGF0IGlycSB0aW1lICovCi0JdTMyCQl3YWl0aW5nX2dlbV9zZXFubzsKLQlpbnQJCXVzZXJfaXJxX3JlZmNvdW50OwotCXZvaWQJCSgqdXNlcl9pcnFfZ2V0KShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAotCQkJc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nKTsKLQl2b2lkCQkoKnVzZXJfaXJxX3B1dCkoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKLQkJCXN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZyk7CisJdTMyCQlpcnFfc2Vxbm87CQkvKiBsYXN0IHNlcSBzZWVtIGF0IGlycSB0aW1lICovCisJdTMyCQl3YWl0aW5nX3NlcW5vOworCXUzMgkJc3luY19zZXFub1tJOTE1X05VTV9SSU5HUy0xXTsKKwlhdG9taWNfdAlpcnFfcmVmY291bnQ7CisJYm9vbCBfX211c3RfY2hlY2sgKCppcnFfZ2V0KShzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcpOworCXZvaWQJCSgqaXJxX3B1dCkoc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nKTsKIAotCWludAkJKCppbml0KShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAotCQkJc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nKTsKKwlpbnQJCSgqaW5pdCkoc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nKTsKIAotCXZvaWQJCSgqd3JpdGVfdGFpbCkoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKLQkJCQkgICAgICBzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcsCisJdm9pZAkJKCp3cml0ZV90YWlsKShzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcsCiAJCQkJICAgICAgdTMyIHZhbHVlKTsKLQl2b2lkCQkoKmZsdXNoKShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAotCQkJc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nLAotCQkJdTMyCWludmFsaWRhdGVfZG9tYWlucywKLQkJCXUzMglmbHVzaF9kb21haW5zKTsKLQl1MzIJCSgqYWRkX3JlcXVlc3QpKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCi0JCQlzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcsCi0JCQl1MzIgZmx1c2hfZG9tYWlucyk7Ci0JdTMyCQkoKmdldF9zZXFubykoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKLQkJCQkgICAgIHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZyk7Ci0JaW50CQkoKmRpc3BhdGNoX2dlbV9leGVjYnVmZmVyKShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAotCQkJc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nLAotCQkJc3RydWN0IGRybV9pOTE1X2dlbV9leGVjYnVmZmVyMiAqZXhlYywKLQkJCXN0cnVjdCBkcm1fY2xpcF9yZWN0ICpjbGlwcmVjdHMsCi0JCQl1aW50NjRfdCBleGVjX29mZnNldCk7CisJdm9pZAkJKCpmbHVzaCkoc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nLAorCQkJCSB1MzIJaW52YWxpZGF0ZV9kb21haW5zLAorCQkJCSB1MzIJZmx1c2hfZG9tYWlucyk7CisJaW50CQkoKmFkZF9yZXF1ZXN0KShzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcsCisJCQkJICAgICAgIHUzMiAqc2Vxbm8pOworCXUzMgkJKCpnZXRfc2Vxbm8pKHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZyk7CisJaW50CQkoKmRpc3BhdGNoX2V4ZWNidWZmZXIpKHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZywKKwkJCQkJICAgICAgIHUzMiBvZmZzZXQsIHUzMiBsZW5ndGgpOwogCXZvaWQJCSgqY2xlYW51cCkoc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nKTsKIAogCS8qKgpAQCAtOTYsNyArMTAyLDcgQEAKIAkvKioKIAkgKiBEbyB3ZSBoYXZlIHNvbWUgbm90IHlldCBlbWl0dGVkIHJlcXVlc3RzIG91dHN0YW5kaW5nPwogCSAqLwotCWJvb2wgb3V0c3RhbmRpbmdfbGF6eV9yZXF1ZXN0OworCXUzMiBvdXRzdGFuZGluZ19sYXp5X3JlcXVlc3Q7CiAKIAl3YWl0X3F1ZXVlX2hlYWRfdCBpcnFfcXVldWU7CiAJZHJtX2xvY2FsX21hcF90IG1hcDsKQEAgLTEwNSw0NCArMTExLDU0IEBACiB9OwogCiBzdGF0aWMgaW5saW5lIHUzMgotaW50ZWxfcmVhZF9zdGF0dXNfcGFnZShzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcsCi0JCWludCByZWcpCitpbnRlbF9yaW5nX3N5bmNfaW5kZXgoc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nLAorCQkgICAgICBzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKm90aGVyKQogewotCXUzMiAqcmVncyA9IHJpbmctPnN0YXR1c19wYWdlLnBhZ2VfYWRkcjsKLQlyZXR1cm4gcmVnc1tyZWddOworCWludCBpZHg7CisKKwkvKgorCSAqIGNzIC0+IDAgPSB2Y3MsIDEgPSBiY3MKKwkgKiB2Y3MgLT4gMCA9IGJjcywgMSA9IGNzLAorCSAqIGJjcyAtPiAwID0gY3MsIDEgPSB2Y3MuCisJICovCisKKwlpZHggPSAob3RoZXIgLSByaW5nKSAtIDE7CisJaWYgKGlkeCA8IDApCisJCWlkeCArPSBJOTE1X05VTV9SSU5HUzsKKworCXJldHVybiBpZHg7CiB9CiAKLWludCBpbnRlbF9pbml0X3JpbmdfYnVmZmVyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCi0JCQkgICBzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcpOwotdm9pZCBpbnRlbF9jbGVhbnVwX3JpbmdfYnVmZmVyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCi0JCQkgICAgICAgc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nKTsKLWludCBpbnRlbF93YWl0X3JpbmdfYnVmZmVyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCi0JCQkgICBzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcsIGludCBuKTsKLXZvaWQgaW50ZWxfcmluZ19iZWdpbihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAotCQkgICAgICBzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcsIGludCBuKTsKLQotc3RhdGljIGlubGluZSB2b2lkIGludGVsX3JpbmdfZW1pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAotCQkJCSAgIHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZywKLQkJCQkgICB1bnNpZ25lZCBpbnQgZGF0YSkKK3N0YXRpYyBpbmxpbmUgdTMyCitpbnRlbF9yZWFkX3N0YXR1c19wYWdlKHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZywKKwkJICAgICAgIGludCByZWcpCiB7Ci0JdW5zaWduZWQgaW50ICp2aXJ0ID0gcmluZy0+dmlydHVhbF9zdGFydCArIHJpbmctPnRhaWw7Ci0JKnZpcnQgPSBkYXRhOworCXJldHVybiBpb3JlYWQzMihyaW5nLT5zdGF0dXNfcGFnZS5wYWdlX2FkZHIgKyByZWcpOworfQorCit2b2lkIGludGVsX2NsZWFudXBfcmluZ19idWZmZXIoc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nKTsKK2ludCBfX211c3RfY2hlY2sgaW50ZWxfd2FpdF9yaW5nX2J1ZmZlcihzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcsIGludCBuKTsKK2ludCBfX211c3RfY2hlY2sgaW50ZWxfcmluZ19iZWdpbihzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcsIGludCBuKTsKKworc3RhdGljIGlubGluZSB2b2lkIGludGVsX3JpbmdfZW1pdChzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcsCisJCQkJICAgdTMyIGRhdGEpCit7CisJaW93cml0ZTMyKGRhdGEsIHJpbmctPnZpcnR1YWxfc3RhcnQgKyByaW5nLT50YWlsKTsKIAlyaW5nLT50YWlsICs9IDQ7CiB9CiAKLXZvaWQgaW50ZWxfcmluZ19hZHZhbmNlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCi0JCXN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZyk7Cit2b2lkIGludGVsX3JpbmdfYWR2YW5jZShzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcpOwogCi11MzIgaW50ZWxfcmluZ19nZXRfc2Vxbm8oc3RydWN0IGRybV9kZXZpY2UgKmRldiwKLQkJc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nKTsKK3UzMiBpbnRlbF9yaW5nX2dldF9zZXFubyhzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcpOworaW50IGludGVsX3Jpbmdfc3luYyhzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcsCisJCSAgICBzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnRvLAorCQkgICAgdTMyIHNlcW5vKTsKIAogaW50IGludGVsX2luaXRfcmVuZGVyX3JpbmdfYnVmZmVyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwogaW50IGludGVsX2luaXRfYnNkX3JpbmdfYnVmZmVyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwogaW50IGludGVsX2luaXRfYmx0X3JpbmdfYnVmZmVyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwogCi11MzIgaW50ZWxfcmluZ19nZXRfYWN0aXZlX2hlYWQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKLQkJCSAgICAgICBzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcpOwotdm9pZCBpbnRlbF9yaW5nX3NldHVwX3N0YXR1c19wYWdlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCi0JCQkJICBzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnJpbmcpOwordTMyIGludGVsX3JpbmdfZ2V0X2FjdGl2ZV9oZWFkKHN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAqcmluZyk7Cit2b2lkIGludGVsX3Jpbmdfc2V0dXBfc3RhdHVzX3BhZ2Uoc3RydWN0IGludGVsX3JpbmdfYnVmZmVyICpyaW5nKTsKIAogI2VuZGlmIC8qIF9JTlRFTF9SSU5HQlVGRkVSX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9zZHZvLmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9zZHZvLmMKaW5kZXggNmJjNDJmYS4uOWQwYWYzNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfc2R2by5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX3Nkdm8uYwpAQCAtMTA0NSw3ICsxMDQ1LDkgQEAKIAogCS8qIFNldCB0aGUgU0RWTyBjb250cm9sIHJlZ3MuICovCiAJaWYgKElOVEVMX0lORk8oZGV2KS0+Z2VuID49IDQpIHsKLQkJc2R2b3ggPSBTRFZPX0JPUkRFUl9FTkFCTEU7CisJCXNkdm94ID0gMDsKKwkJaWYgKElOVEVMX0lORk8oZGV2KS0+Z2VuIDwgNSkKKwkJCXNkdm94IHw9IFNEVk9fQk9SREVSX0VOQUJMRTsKIAkJaWYgKGFkanVzdGVkX21vZGUtPmZsYWdzICYgRFJNX01PREVfRkxBR19QVlNZTkMpCiAJCQlzZHZveCB8PSBTRFZPX1ZTWU5DX0FDVElWRV9ISUdIOwogCQlpZiAoYWRqdXN0ZWRfbW9kZS0+ZmxhZ3MgJiBEUk1fTU9ERV9GTEFHX1BIU1lOQykKQEAgLTEwNzUsNyArMTA3Nyw4IEBACiAJCXNkdm94IHw9IChwaXhlbF9tdWx0aXBsaWVyIC0gMSkgPDwgU0RWT19QT1JUX01VTFRJUExZX1NISUZUOwogCX0KIAotCWlmIChpbnB1dF9kdGQucGFydDIuc2R2b19mbGFncyAmIFNEVk9fTkVFRF9UT19TVEFMTCkKKwlpZiAoaW5wdXRfZHRkLnBhcnQyLnNkdm9fZmxhZ3MgJiBTRFZPX05FRURfVE9fU1RBTEwgJiYKKwkgICAgSU5URUxfSU5GTyhkZXYpLT5nZW4gPCA1KQogCQlzZHZveCB8PSBTRFZPX1NUQUxMX1NFTEVDVDsKIAlpbnRlbF9zZHZvX3dyaXRlX3Nkdm94KGludGVsX3Nkdm8sIHNkdm94KTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX3R2LmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF90di5jCmluZGV4IDJmNzY4MTkuLjkzMjA2ZTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX3R2LmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfdHYuYwpAQCAtMTI0NSwxMCArMTI0NSwxMSBAQAogCWludCB0eXBlOwogCiAJLyogRGlzYWJsZSBUViBpbnRlcnJ1cHRzIGFyb3VuZCBsb2FkIGRldGVjdCBvciB3ZSdsbCByZWN1cnNlICovCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmRldl9wcml2LT51c2VyX2lycV9sb2NrLCBpcnFmbGFncyk7Ci0JaTkxNV9kaXNhYmxlX3BpcGVzdGF0KGRldl9wcml2LCAwLCBQSVBFX0hPVFBMVUdfSU5URVJSVVBUX0VOQUJMRSB8CisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldl9wcml2LT5pcnFfbG9jaywgaXJxZmxhZ3MpOworCWk5MTVfZGlzYWJsZV9waXBlc3RhdChkZXZfcHJpdiwgMCwKKwkJCSAgICAgIFBJUEVfSE9UUExVR19JTlRFUlJVUFRfRU5BQkxFIHwKIAkJCSAgICAgIFBJUEVfSE9UUExVR19UVl9JTlRFUlJVUFRfRU5BQkxFKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZfcHJpdi0+dXNlcl9pcnFfbG9jaywgaXJxZmxhZ3MpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldl9wcml2LT5pcnFfbG9jaywgaXJxZmxhZ3MpOwogCiAJc2F2ZV90dl9kYWMgPSB0dl9kYWMgPSBJOTE1X1JFQUQoVFZfREFDKTsKIAlzYXZlX3R2X2N0bCA9IHR2X2N0bCA9IEk5MTVfUkVBRChUVl9DVEwpOwpAQCAtMTMwMSwxMCArMTMwMiwxMSBAQAogCUk5MTVfV1JJVEUoVFZfQ1RMLCBzYXZlX3R2X2N0bCk7CiAKIAkvKiBSZXN0b3JlIGludGVycnVwdCBjb25maWcgKi8KLQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2X3ByaXYtPnVzZXJfaXJxX2xvY2ssIGlycWZsYWdzKTsKLQlpOTE1X2VuYWJsZV9waXBlc3RhdChkZXZfcHJpdiwgMCwgUElQRV9IT1RQTFVHX0lOVEVSUlVQVF9FTkFCTEUgfAorCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZfcHJpdi0+aXJxX2xvY2ssIGlycWZsYWdzKTsKKwlpOTE1X2VuYWJsZV9waXBlc3RhdChkZXZfcHJpdiwgMCwKKwkJCSAgICAgUElQRV9IT1RQTFVHX0lOVEVSUlVQVF9FTkFCTEUgfAogCQkJICAgICBQSVBFX0hPVFBMVUdfVFZfSU5URVJSVVBUX0VOQUJMRSk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2X3ByaXYtPnVzZXJfaXJxX2xvY2ssIGlycWZsYWdzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZfcHJpdi0+aXJxX2xvY2ssIGlycWZsYWdzKTsKIAogCXJldHVybiB0eXBlOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvS2NvbmZpZyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L0tjb25maWcKaW5kZXggNzI3MzBlOS4uMjFkNmMyOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvS2NvbmZpZworKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9LY29uZmlnCkBAIC0xMCw3ICsxMCw3IEBACiAJc2VsZWN0IEZCCiAJc2VsZWN0IEZSQU1FQlVGRkVSX0NPTlNPTEUgaWYgIUVNQkVEREVECiAJc2VsZWN0IEZCX0JBQ0tMSUdIVCBpZiBEUk1fTk9VVkVBVV9CQUNLTElHSFQKLQlzZWxlY3QgQUNQSV9WSURFTyBpZiBBQ1BJCisJc2VsZWN0IEFDUElfVklERU8gaWYgQUNQSSAmJiBYODYgJiYgQkFDS0xJR0hUX0NMQVNTX0RFVklDRSAmJiBWSURFT19PVVRQVVRfQ09OVFJPTCAmJiBJTlBVVAogCWhlbHAKIAkgIENob29zZSB0aGlzIG9wdGlvbiBmb3Igb3Blbi1zb3VyY2UgblZpZGlhIHN1cHBvcnQuCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L01ha2VmaWxlIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvTWFrZWZpbGUKaW5kZXggMjNmYTgyZC4uZTEyYzk3ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvTWFrZWZpbGUKQEAgLTUsMjcgKzUsMzIgQEAKIGNjZmxhZ3MteSA6PSAtSWluY2x1ZGUvZHJtCiBub3V2ZWF1LXkgOj0gbm91dmVhdV9kcnYubyBub3V2ZWF1X3N0YXRlLm8gbm91dmVhdV9jaGFubmVsLm8gbm91dmVhdV9tZW0ubyBcCiAgICAgICAgICAgICAgbm91dmVhdV9vYmplY3QubyBub3V2ZWF1X2lycS5vIG5vdXZlYXVfbm90aWZpZXIubyBcCi0gICAgICAgICAgICAgbm91dmVhdV9zZ2RtYS5vIG5vdXZlYXVfZG1hLm8gXAorICAgICAgICAgICAgIG5vdXZlYXVfc2dkbWEubyBub3V2ZWF1X2RtYS5vIG5vdXZlYXVfdXRpbC5vIFwKICAgICAgICAgICAgICBub3V2ZWF1X2JvLm8gbm91dmVhdV9mZW5jZS5vIG5vdXZlYXVfZ2VtLm8gbm91dmVhdV90dG0ubyBcCiAgICAgICAgICAgICAgbm91dmVhdV9ody5vIG5vdXZlYXVfY2FsYy5vIG5vdXZlYXVfYmlvcy5vIG5vdXZlYXVfaTJjLm8gXAogICAgICAgICAgICAgIG5vdXZlYXVfZGlzcGxheS5vIG5vdXZlYXVfY29ubmVjdG9yLm8gbm91dmVhdV9mYmNvbi5vIFwKICAgICAgICAgICAgICBub3V2ZWF1X2RwLm8gbm91dmVhdV9yYW1odC5vIFwKIAkgICAgIG5vdXZlYXVfcG0ubyBub3V2ZWF1X3ZvbHQubyBub3V2ZWF1X3BlcmYubyBub3V2ZWF1X3RlbXAubyBcCisJICAgICBub3V2ZWF1X21tLm8gbm91dmVhdV92bS5vIFwKICAgICAgICAgICAgICBudjA0X3RpbWVyLm8gXAogICAgICAgICAgICAgIG52MDRfbWMubyBudjQwX21jLm8gbnY1MF9tYy5vIFwKICAgICAgICAgICAgICBudjA0X2ZiLm8gbnYxMF9mYi5vIG52MzBfZmIubyBudjQwX2ZiLm8gbnY1MF9mYi5vIG52YzBfZmIubyBcCiAgICAgICAgICAgICAgbnYwNF9maWZvLm8gbnYxMF9maWZvLm8gbnY0MF9maWZvLm8gbnY1MF9maWZvLm8gbnZjMF9maWZvLm8gXAogICAgICAgICAgICAgIG52MDRfZ3JhcGgubyBudjEwX2dyYXBoLm8gbnYyMF9ncmFwaC5vIFwKICAgICAgICAgICAgICBudjQwX2dyYXBoLm8gbnY1MF9ncmFwaC5vIG52YzBfZ3JhcGgubyBcCi0gICAgICAgICAgICAgbnY0MF9ncmN0eC5vIG52NTBfZ3JjdHgubyBcCisgICAgICAgICAgICAgbnY0MF9ncmN0eC5vIG52NTBfZ3JjdHgubyBudmMwX2dyY3R4Lm8gXAorICAgICAgICAgICAgIG52ODRfY3J5cHQubyBcCiAgICAgICAgICAgICAgbnYwNF9pbnN0bWVtLm8gbnY1MF9pbnN0bWVtLm8gbnZjMF9pbnN0bWVtLm8gXAotICAgICAgICAgICAgIG52NTBfY3J0Yy5vIG52NTBfZGFjLm8gbnY1MF9zb3IubyBcCi0gICAgICAgICAgICAgbnY1MF9jdXJzb3IubyBudjUwX2Rpc3BsYXkubyBudjUwX2ZiY29uLm8gXAorICAgICAgICAgICAgIG52NTBfZXZvLm8gbnY1MF9jcnRjLm8gbnY1MF9kYWMubyBudjUwX3Nvci5vIFwKKyAgICAgICAgICAgICBudjUwX2N1cnNvci5vIG52NTBfZGlzcGxheS5vIFwKICAgICAgICAgICAgICBudjA0X2RhYy5vIG52MDRfZGZwLm8gbnYwNF90di5vIG52MTdfdHYubyBudjE3X3R2X21vZGVzLm8gXAotICAgICAgICAgICAgIG52MDRfY3J0Yy5vIG52MDRfZGlzcGxheS5vIG52MDRfY3Vyc29yLm8gbnYwNF9mYmNvbi5vIFwKKyAgICAgICAgICAgICBudjA0X2NydGMubyBudjA0X2Rpc3BsYXkubyBudjA0X2N1cnNvci5vIFwKKyAgICAgICAgICAgICBudjA0X2ZiY29uLm8gbnY1MF9mYmNvbi5vIG52YzBfZmJjb24ubyBcCiAgICAgICAgICAgICAgbnYxMF9ncGlvLm8gbnY1MF9ncGlvLm8gXAogCSAgICAgbnY1MF9jYWxjLm8gXAotCSAgICAgbnYwNF9wbS5vIG52NTBfcG0ubyBudmEzX3BtLm8KKwkgICAgIG52MDRfcG0ubyBudjUwX3BtLm8gbnZhM19wbS5vIFwKKwkgICAgIG52NTBfdnJhbS5vIG52YzBfdnJhbS5vIFwKKwkgICAgIG52NTBfdm0ubyBudmMwX3ZtLm8KIAogbm91dmVhdS0kKENPTkZJR19EUk1fTk9VVkVBVV9ERUJVRykgKz0gbm91dmVhdV9kZWJ1Z2ZzLm8KIG5vdXZlYXUtJChDT05GSUdfQ09NUEFUKSArPSBub3V2ZWF1X2lvYzMyLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfYWNwaS5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9hY3BpLmMKaW5kZXggMTE5MTUyNi4uYTU0MjM4MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9hY3BpLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9hY3BpLmMKQEAgLTEzMCwxMCArMTMwLDE1IEBACiAKIHN0YXRpYyBpbnQgbm91dmVhdV9kc21fZ2V0X2NsaWVudF9pZChzdHJ1Y3QgcGNpX2RldiAqcGRldikKIHsKLQlpZiAobm91dmVhdV9kc21fcHJpdi5kaGFuZGxlID09IERFVklDRV9BQ1BJX0hBTkRMRSgmcGRldi0+ZGV2KSkKKwkvKiBlYXN5IG9wdGlvbiBvbmUgLSBpbnRlbCB2ZW5kb3IgSUQgbWVhbnMgSW50ZWdyYXRlZCAqLworCWlmIChwZGV2LT52ZW5kb3IgPT0gUENJX1ZFTkRPUl9JRF9JTlRFTCkKIAkJcmV0dXJuIFZHQV9TV0lUQ0hFUk9PX0lHRDsKLQllbHNlCi0JCXJldHVybiBWR0FfU1dJVENIRVJPT19ESVM7CisKKwkvKiBpcyB0aGlzIGRldmljZSBvbiBCdXMgMD8gLSB0aGlzIG1heSBuZWVkIGltcHJvdmluZyAqLworCWlmIChwZGV2LT5idXMtPm51bWJlciA9PSAwKQorCQlyZXR1cm4gVkdBX1NXSVRDSEVST09fSUdEOworCisJcmV0dXJuIFZHQV9TV0lUQ0hFUk9PX0RJUzsKIH0KIAogc3RhdGljIHN0cnVjdCB2Z2Ffc3dpdGNoZXJvb19oYW5kbGVyIG5vdXZlYXVfZHNtX2hhbmRsZXIgPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2Jpb3MuYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfYmlvcy5jCmluZGV4IGIyMjkzNTcuLmQzMDQ2NTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfYmlvcy5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfYmlvcy5jCkBAIC02MDUzLDUyICs2MDUzLDE3IEBACiAJcmV0dXJuIGVudHJ5OwogfQogCi1zdGF0aWMgdm9pZCBmYWJyaWNhdGVfdmdhX291dHB1dChzdHJ1Y3QgZGNiX3RhYmxlICpkY2IsIGludCBpMmMsIGludCBoZWFkcykKK3N0YXRpYyB2b2lkIGZhYnJpY2F0ZV9kY2Jfb3V0cHV0KHN0cnVjdCBkY2JfdGFibGUgKmRjYiwgaW50IHR5cGUsIGludCBpMmMsCisJCQkJIGludCBoZWFkcywgaW50IG9yKQogewogCXN0cnVjdCBkY2JfZW50cnkgKmVudHJ5ID0gbmV3X2RjYl9lbnRyeShkY2IpOwogCi0JZW50cnktPnR5cGUgPSAwOworCWVudHJ5LT50eXBlID0gdHlwZTsKIAllbnRyeS0+aTJjX2luZGV4ID0gaTJjOwogCWVudHJ5LT5oZWFkcyA9IGhlYWRzOwotCWVudHJ5LT5sb2NhdGlvbiA9IERDQl9MT0NfT05fQ0hJUDsKLQllbnRyeS0+b3IgPSAxOwotfQotCi1zdGF0aWMgdm9pZCBmYWJyaWNhdGVfZHZpX2lfb3V0cHV0KHN0cnVjdCBkY2JfdGFibGUgKmRjYiwgYm9vbCB0d29IZWFkcykKLXsKLQlzdHJ1Y3QgZGNiX2VudHJ5ICplbnRyeSA9IG5ld19kY2JfZW50cnkoZGNiKTsKLQotCWVudHJ5LT50eXBlID0gMjsKLQllbnRyeS0+aTJjX2luZGV4ID0gTEVHQUNZX0kyQ19QQU5FTDsKLQllbnRyeS0+aGVhZHMgPSB0d29IZWFkcyA/IDMgOiAxOwotCWVudHJ5LT5sb2NhdGlvbiA9ICFEQ0JfTE9DX09OX0NISVA7CS8qIGllIE9GRiBDSElQICovCi0JZW50cnktPm9yID0gMTsJLyogbWVhbnMgfDB4MTAgZ2V0cyBzZXQgb24gQ1JFX0xDRF9fSU5ERVggKi8KLQllbnRyeS0+ZHVhbGxpbmtfcG9zc2libGUgPSBmYWxzZTsgLyogU2lJMTY0IGFuZCBjby4gYXJlIHNpbmdsZSBsaW5rICovCi0KLSNpZiAwCi0JLyoKLQkgKiBGb3IgZHZpLWEgZWl0aGVyIGNydGMgcHJvYmFibHkgd29ya3MsIGJ1dCBteSBjYXJkIGFwcGVhcnMgdG8gb25seQotCSAqIHN1cHBvcnQgZHZpLWQuICAibnZpZGlhIiBzdGlsbCBhdHRlbXB0cyB0byBwcm9ncmFtIGl0IGZvciBkdmktYSwKLQkgKiBkb2luZyB0aGUgZnVsbCBmcCBvdXRwdXQgc2V0dXAgKHByb2dyYW0gMHg2ODA4Li4gZnAgZGltZW5zaW9uIHJlZ3MsCi0JICogc2V0dGluZyAweDY4MDg0OCB0byAweDEwMDAwMTExIHRvIGVuYWJsZSwgbWF5YmUgc2V0dGluZyAweDY4MDg4MCk7Ci0JICogdGhlIG1vbml0b3IgcGlja3MgdXAgdGhlIG1vZGUgcmVzIG9rIGFuZCBsaWdodHMgdXAsIGJ1dCBubyBwaXhlbAotCSAqIGRhdGEgYXBwZWFycywgc28gdGhlIGJvYXJkIG1hbnVmYWN0dXJlciBwcm9iYWJseSBjb25uZWN0ZWQgdXAgdGhlCi0JICogc3luYyBsaW5lcywgYnV0IG1pc3NlZCB0aGUgdmlkZW8gdHJhY2VzIC8gY29tcG9uZW50cwotCSAqCi0JICogd2l0aCB0aGlzIGludHJvZHVjdGlvbiwgZHZpLWEgbGVmdCBhcyBhbiBleGVyY2lzZSBmb3IgdGhlIHJlYWRlci4KLQkgKi8KLQlmYWJyaWNhdGVfdmdhX291dHB1dChkY2IsIExFR0FDWV9JMkNfUEFORUwsIGVudHJ5LT5oZWFkcyk7Ci0jZW5kaWYKLX0KLQotc3RhdGljIHZvaWQgZmFicmljYXRlX3R2X291dHB1dChzdHJ1Y3QgZGNiX3RhYmxlICpkY2IsIGJvb2wgdHdvSGVhZHMpCi17Ci0Jc3RydWN0IGRjYl9lbnRyeSAqZW50cnkgPSBuZXdfZGNiX2VudHJ5KGRjYik7Ci0KLQllbnRyeS0+dHlwZSA9IDE7Ci0JZW50cnktPmkyY19pbmRleCA9IExFR0FDWV9JMkNfVFY7Ci0JZW50cnktPmhlYWRzID0gdHdvSGVhZHMgPyAzIDogMTsKLQllbnRyeS0+bG9jYXRpb24gPSAhRENCX0xPQ19PTl9DSElQOwkvKiBpZSBPRkYgQ0hJUCAqLworCWlmICh0eXBlICE9IE9VVFBVVF9BTkFMT0cpCisJCWVudHJ5LT5sb2NhdGlvbiA9ICFEQ0JfTE9DX09OX0NISVA7IC8qIGllIE9GRiBDSElQICovCisJZW50cnktPm9yID0gb3I7CiB9CiAKIHN0YXRpYyBib29sCkBAIC02MzY1LDggKzYzMzAsMzYgQEAKIAlyZXR1cm4gdHJ1ZTsKIH0KIAorc3RhdGljIHZvaWQKK2ZhYnJpY2F0ZV9kY2JfZW5jb2Rlcl90YWJsZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgbnZiaW9zICpiaW9zKQoreworCXN0cnVjdCBkY2JfdGFibGUgKmRjYiA9ICZiaW9zLT5kY2I7CisJaW50IGFsbF9oZWFkcyA9IChudl90d29faGVhZHMoZGV2KSA/IDMgOiAxKTsKKworI2lmZGVmIF9fcG93ZXJwY19fCisJLyogQXBwbGUgaU1hYyBHNCBOVjE3ICovCisJaWYgKG9mX21hY2hpbmVfaXNfY29tcGF0aWJsZSgiUG93ZXJNYWM0LDUiKSkgeworCQlmYWJyaWNhdGVfZGNiX291dHB1dChkY2IsIE9VVFBVVF9UTURTLCAwLCBhbGxfaGVhZHMsIDEpOworCQlmYWJyaWNhdGVfZGNiX291dHB1dChkY2IsIE9VVFBVVF9BTkFMT0csIDEsIGFsbF9oZWFkcywgMik7CisJCXJldHVybjsKKwl9CisjZW5kaWYKKworCS8qIE1ha2UgdXAgc29tZSBzYW5lIGRlZmF1bHRzICovCisJZmFicmljYXRlX2RjYl9vdXRwdXQoZGNiLCBPVVRQVVRfQU5BTE9HLCBMRUdBQ1lfSTJDX0NSVCwgMSwgMSk7CisKKwlpZiAobnYwNF90dl9pZGVudGlmeShkZXYsIGJpb3MtPmxlZ2FjeS5pMmNfaW5kaWNlcy50dikgPj0gMCkKKwkJZmFicmljYXRlX2RjYl9vdXRwdXQoZGNiLCBPVVRQVVRfVFYsIExFR0FDWV9JMkNfVFYsCisJCQkJICAgICBhbGxfaGVhZHMsIDApOworCisJZWxzZSBpZiAoYmlvcy0+dG1kcy5vdXRwdXQwX3NjcmlwdF9wdHIgfHwKKwkJIGJpb3MtPnRtZHMub3V0cHV0MV9zY3JpcHRfcHRyKQorCQlmYWJyaWNhdGVfZGNiX291dHB1dChkY2IsIE9VVFBVVF9UTURTLCBMRUdBQ1lfSTJDX1BBTkVMLAorCQkJCSAgICAgYWxsX2hlYWRzLCAxKTsKK30KKwogc3RhdGljIGludAotcGFyc2VfZGNiX3RhYmxlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBudmJpb3MgKmJpb3MsIGJvb2wgdHdvSGVhZHMpCitwYXJzZV9kY2JfdGFibGUoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IG52YmlvcyAqYmlvcykKIHsKIAlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXN0cnVjdCBkY2JfdGFibGUgKmRjYiA9ICZiaW9zLT5kY2I7CkBAIC02Mzg2LDEyICs2Mzc5LDcgQEAKIAogCS8qIHRoaXMgc2l0dWF0aW9uIGxpa2VseSBtZWFucyBhIHJlYWxseSBvbGQgY2FyZCwgcHJlIERDQiAqLwogCWlmIChkY2JwdHIgPT0gMHgwKSB7Ci0JCU5WX0lORk8oZGV2LCAiQXNzdW1pbmcgYSBDUlQgb3V0cHV0IGV4aXN0c1xuIik7Ci0JCWZhYnJpY2F0ZV92Z2Ffb3V0cHV0KGRjYiwgTEVHQUNZX0kyQ19DUlQsIDEpOwotCi0JCWlmIChudjA0X3R2X2lkZW50aWZ5KGRldiwgYmlvcy0+bGVnYWN5LmkyY19pbmRpY2VzLnR2KSA+PSAwKQotCQkJZmFicmljYXRlX3R2X291dHB1dChkY2IsIHR3b0hlYWRzKTsKLQorCQlmYWJyaWNhdGVfZGNiX2VuY29kZXJfdGFibGUoZGV2LCBiaW9zKTsKIAkJcmV0dXJuIDA7CiAJfQogCkBAIC02NDUxLDIxICs2NDM5LDcgQEAKIAkJICovCiAJCU5WX1RSQUNFV0FSTihkZXYsICJObyB1c2VmdWwgaW5mb3JtYXRpb24gaW4gQklPUyBvdXRwdXQgdGFibGU7ICIKIAkJCQkgICJhZGRpbmcgYWxsIHBvc3NpYmxlIG91dHB1dHNcbiIpOwotCQlmYWJyaWNhdGVfdmdhX291dHB1dChkY2IsIExFR0FDWV9JMkNfQ1JULCAxKTsKLQotCQkvKgotCQkgKiBBdHRlbXB0IHRvIGRldGVjdCBUViBiZWZvcmUgRFZJIGJlY2F1c2UgdGhlIHRlc3QKLQkJICogZm9yIHRoZSBmb3JtZXIgaXMgbW9yZSBhY2N1cmF0ZSBhbmQgaXQgcnVsZXMgdGhlCi0JCSAqIGxhdHRlciBvdXQuCi0JCSAqLwotCQlpZiAobnYwNF90dl9pZGVudGlmeShkZXYsCi0JCQkJICAgICBiaW9zLT5sZWdhY3kuaTJjX2luZGljZXMudHYpID49IDApCi0JCQlmYWJyaWNhdGVfdHZfb3V0cHV0KGRjYiwgdHdvSGVhZHMpOwotCi0JCWVsc2UgaWYgKGJpb3MtPnRtZHMub3V0cHV0MF9zY3JpcHRfcHRyIHx8Ci0JCQkgYmlvcy0+dG1kcy5vdXRwdXQxX3NjcmlwdF9wdHIpCi0JCQlmYWJyaWNhdGVfZHZpX2lfb3V0cHV0KGRjYiwgdHdvSGVhZHMpOwotCisJCWZhYnJpY2F0ZV9kY2JfZW5jb2Rlcl90YWJsZShkZXYsIGJpb3MpOwogCQlyZXR1cm4gMDsKIAl9CiAKQEAgLTY4NTksNyArNjgzMyw3IEBACiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAotCXJldCA9IHBhcnNlX2RjYl90YWJsZShkZXYsIGJpb3MsIG52X3R3b19oZWFkcyhkZXYpKTsKKwlyZXQgPSBwYXJzZV9kY2JfdGFibGUoZGV2LCBiaW9zKTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2JvLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2JvLmMKaW5kZXggYzQxZTFjMi4uYTdmYWUyNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9iby5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfYm8uYwpAQCAtMzIsNiArMzIsOCBAQAogI2luY2x1ZGUgIm5vdXZlYXVfZHJtLmgiCiAjaW5jbHVkZSAibm91dmVhdV9kcnYuaCIKICNpbmNsdWRlICJub3V2ZWF1X2RtYS5oIgorI2luY2x1ZGUgIm5vdXZlYXVfbW0uaCIKKyNpbmNsdWRlICJub3V2ZWF1X3ZtLmgiCiAKICNpbmNsdWRlIDxsaW51eC9sb2cyLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgpAQCAtNDYsODIgKzQ4LDUxIEBACiAJaWYgKHVubGlrZWx5KG52Ym8tPmdlbSkpCiAJCURSTV9FUlJPUigiYm8gJXAgc3RpbGwgYXR0YWNoZWQgdG8gR0VNIG9iamVjdFxuIiwgYm8pOwogCi0JaWYgKG52Ym8tPnRpbGUpCi0JCW52MTBfbWVtX2V4cGlyZV90aWxpbmcoZGV2LCBudmJvLT50aWxlLCBOVUxMKTsKLQorCW52MTBfbWVtX3B1dF90aWxlX3JlZ2lvbihkZXYsIG52Ym8tPnRpbGUsIE5VTEwpOworCW5vdXZlYXVfdm1fcHV0KCZudmJvLT52bWEpOwogCWtmcmVlKG52Ym8pOwogfQogCiBzdGF0aWMgdm9pZAotbm91dmVhdV9ib19maXh1cF9hbGlnbihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAotCQkgICAgICAgdWludDMyX3QgdGlsZV9tb2RlLCB1aW50MzJfdCB0aWxlX2ZsYWdzLAotCQkgICAgICAgaW50ICphbGlnbiwgaW50ICpzaXplKQorbm91dmVhdV9ib19maXh1cF9hbGlnbihzdHJ1Y3Qgbm91dmVhdV9ibyAqbnZibywgaW50ICphbGlnbiwgaW50ICpzaXplLAorCQkgICAgICAgaW50ICpwYWdlX3NoaWZ0KQogewotCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gbm91dmVhdV9iZGV2KG52Ym8tPmJvLmJkZXYpOwogCi0JLyoKLQkgKiBTb21lIG9mIHRoZSB0aWxlX2ZsYWdzIGhhdmUgYSBwZXJpb2RpYyBzdHJ1Y3R1cmUgb2YgTio0MDk2IGJ5dGVzLAotCSAqIGFsaWduIHRvIHRvIHRoYXQgYXMgd2VsbCBhcyB0aGUgcGFnZSBzaXplLiBBbGlnbiB0aGUgc2l6ZSB0byB0aGUKLQkgKiBhcHByb3ByaWF0ZSBib3VuZGFyaWVzLiBUaGlzIGRvZXMgaW1wbHkgdGhhdCBzaXplcyBhcmUgcm91bmRlZCB1cAotCSAqIDMtNyBwYWdlcywgc28gYmUgYXdhcmUgb2YgdGhpcyBhbmQgZG8gbm90IHdhc3RlIG1lbW9yeSBieSBhbGxvY2F0aW5nCi0JICogbWFueSBzbWFsbCBidWZmZXJzLgotCSAqLwotCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlID09IE5WXzUwKSB7Ci0JCXVpbnQzMl90IGJsb2NrX3NpemUgPSBkZXZfcHJpdi0+dnJhbV9zaXplID4+IDE1OwotCQlpbnQgaTsKLQotCQlzd2l0Y2ggKHRpbGVfZmxhZ3MpIHsKLQkJY2FzZSAweDE4MDA6Ci0JCWNhc2UgMHgyODAwOgotCQljYXNlIDB4NDgwMDoKLQkJY2FzZSAweDdhMDA6Ci0JCQlpZiAoaXNfcG93ZXJfb2ZfMihibG9ja19zaXplKSkgewotCQkJCWZvciAoaSA9IDE7IGkgPCAxMDsgaSsrKSB7Ci0JCQkJCSphbGlnbiA9IDEyICogaSAqIGJsb2NrX3NpemU7Ci0JCQkJCWlmICghKCphbGlnbiAlIDY1NTM2KSkKLQkJCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJZm9yIChpID0gMTsgaSA8IDEwOyBpKyspIHsKLQkJCQkJKmFsaWduID0gOCAqIGkgKiBibG9ja19zaXplOwotCQkJCQlpZiAoISgqYWxpZ24gJSA2NTUzNikpCi0JCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQkqc2l6ZSA9IHJvdW5kdXAoKnNpemUsICphbGlnbik7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWJyZWFrOwotCQl9Ci0KLQl9IGVsc2UgewotCQlpZiAodGlsZV9tb2RlKSB7CisJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPCBOVl81MCkgeworCQlpZiAobnZiby0+dGlsZV9tb2RlKSB7CiAJCQlpZiAoZGV2X3ByaXYtPmNoaXBzZXQgPj0gMHg0MCkgewogCQkJCSphbGlnbiA9IDY1NTM2OwotCQkJCSpzaXplID0gcm91bmR1cCgqc2l6ZSwgNjQgKiB0aWxlX21vZGUpOworCQkJCSpzaXplID0gcm91bmR1cCgqc2l6ZSwgNjQgKiBudmJvLT50aWxlX21vZGUpOwogCiAJCQl9IGVsc2UgaWYgKGRldl9wcml2LT5jaGlwc2V0ID49IDB4MzApIHsKIAkJCQkqYWxpZ24gPSAzMjc2ODsKLQkJCQkqc2l6ZSA9IHJvdW5kdXAoKnNpemUsIDY0ICogdGlsZV9tb2RlKTsKKwkJCQkqc2l6ZSA9IHJvdW5kdXAoKnNpemUsIDY0ICogbnZiby0+dGlsZV9tb2RlKTsKIAogCQkJfSBlbHNlIGlmIChkZXZfcHJpdi0+Y2hpcHNldCA+PSAweDIwKSB7CiAJCQkJKmFsaWduID0gMTYzODQ7Ci0JCQkJKnNpemUgPSByb3VuZHVwKCpzaXplLCA2NCAqIHRpbGVfbW9kZSk7CisJCQkJKnNpemUgPSByb3VuZHVwKCpzaXplLCA2NCAqIG52Ym8tPnRpbGVfbW9kZSk7CiAKIAkJCX0gZWxzZSBpZiAoZGV2X3ByaXYtPmNoaXBzZXQgPj0gMHgxMCkgewogCQkJCSphbGlnbiA9IDE2Mzg0OwotCQkJCSpzaXplID0gcm91bmR1cCgqc2l6ZSwgMzIgKiB0aWxlX21vZGUpOworCQkJCSpzaXplID0gcm91bmR1cCgqc2l6ZSwgMzIgKiBudmJvLT50aWxlX21vZGUpOwogCQkJfQogCQl9CisJfSBlbHNlIHsKKwkJaWYgKGxpa2VseShkZXZfcHJpdi0+Y2hhbl92bSkpIHsKKwkJCWlmICgqc2l6ZSA+IDI1NiAqIDEwMjQpCisJCQkJKnBhZ2Vfc2hpZnQgPSBkZXZfcHJpdi0+Y2hhbl92bS0+bHBnX3NoaWZ0OworCQkJZWxzZQorCQkJCSpwYWdlX3NoaWZ0ID0gZGV2X3ByaXYtPmNoYW5fdm0tPnNwZ19zaGlmdDsKKwkJfSBlbHNlIHsKKwkJCSpwYWdlX3NoaWZ0ID0gMTI7CisJCX0KKworCQkqc2l6ZSA9IHJvdW5kdXAoKnNpemUsICgxIDw8ICpwYWdlX3NoaWZ0KSk7CisJCSphbGlnbiA9IG1heCgoMSA8PCAqcGFnZV9zaGlmdCksICphbGlnbik7CiAJfQogCi0JLyogQUxJR04gd29ya3Mgb25seSBvbiBwb3dlcnMgb2YgdHdvLiAqLwogCSpzaXplID0gcm91bmR1cCgqc2l6ZSwgUEFHRV9TSVpFKTsKLQotCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlID09IE5WXzUwKSB7Ci0JCSpzaXplID0gcm91bmR1cCgqc2l6ZSwgNjU1MzYpOwotCQkqYWxpZ24gPSBtYXgoNjU1MzYsICphbGlnbik7Ci0JfQogfQogCiBpbnQKQEAgLTEzMiw3ICsxMDMsNyBAQAogewogCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJc3RydWN0IG5vdXZlYXVfYm8gKm52Ym87Ci0JaW50IHJldCA9IDA7CisJaW50IHJldCA9IDAsIHBhZ2Vfc2hpZnQgPSAwOwogCiAJbnZibyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBub3V2ZWF1X2JvKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFudmJvKQpAQCAtMTQ1LDEwICsxMTYsMTggQEAKIAludmJvLT50aWxlX2ZsYWdzID0gdGlsZV9mbGFnczsKIAludmJvLT5iby5iZGV2ID0gJmRldl9wcml2LT50dG0uYmRldjsKIAotCW5vdXZlYXVfYm9fZml4dXBfYWxpZ24oZGV2LCB0aWxlX21vZGUsIG5vdXZlYXVfYm9fdGlsZV9sYXlvdXQobnZibyksCi0JCQkgICAgICAgJmFsaWduLCAmc2l6ZSk7CisJbm91dmVhdV9ib19maXh1cF9hbGlnbihudmJvLCAmYWxpZ24sICZzaXplLCAmcGFnZV9zaGlmdCk7CiAJYWxpZ24gPj49IFBBR0VfU0hJRlQ7CiAKKwlpZiAoIW52Ym8tPm5vX3ZtICYmIGRldl9wcml2LT5jaGFuX3ZtKSB7CisJCXJldCA9IG5vdXZlYXVfdm1fZ2V0KGRldl9wcml2LT5jaGFuX3ZtLCBzaXplLCBwYWdlX3NoaWZ0LAorCQkJCSAgICAgTlZfTUVNX0FDQ0VTU19SVywgJm52Ym8tPnZtYSk7CisJCWlmIChyZXQpIHsKKwkJCWtmcmVlKG52Ym8pOworCQkJcmV0dXJuIHJldDsKKwkJfQorCX0KKwogCW5vdXZlYXVfYm9fcGxhY2VtZW50X3NldChudmJvLCBmbGFncywgMCk7CiAKIAludmJvLT5jaGFubmVsID0gY2hhbjsKQEAgLTE2MSw2ICsxNDAsMTEgQEAKIAl9CiAJbnZiby0+Y2hhbm5lbCA9IE5VTEw7CiAKKwlpZiAobnZiby0+dm1hLm5vZGUpIHsKKwkJaWYgKG52Ym8tPmJvLm1lbS5tZW1fdHlwZSA9PSBUVE1fUExfVlJBTSkKKwkJCW52Ym8tPmJvLm9mZnNldCA9IG52Ym8tPnZtYS5vZmZzZXQ7CisJfQorCiAJKnBudmJvID0gbnZibzsKIAlyZXR1cm4gMDsKIH0KQEAgLTI0NCw3ICsyMjgsNyBAQAogCiAJbm91dmVhdV9ib19wbGFjZW1lbnRfc2V0KG52Ym8sIG1lbXR5cGUsIDApOwogCi0JcmV0ID0gdHRtX2JvX3ZhbGlkYXRlKGJvLCAmbnZiby0+cGxhY2VtZW50LCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKKwlyZXQgPSBub3V2ZWF1X2JvX3ZhbGlkYXRlKG52Ym8sIGZhbHNlLCBmYWxzZSwgZmFsc2UpOwogCWlmIChyZXQgPT0gMCkgewogCQlzd2l0Y2ggKGJvLT5tZW0ubWVtX3R5cGUpIHsKIAkJY2FzZSBUVE1fUExfVlJBTToKQEAgLTI4MCw3ICsyNjQsNyBAQAogCiAJbm91dmVhdV9ib19wbGFjZW1lbnRfc2V0KG52Ym8sIGJvLT5tZW0ucGxhY2VtZW50LCAwKTsKIAotCXJldCA9IHR0bV9ib192YWxpZGF0ZShibywgJm52Ym8tPnBsYWNlbWVudCwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7CisJcmV0ID0gbm91dmVhdV9ib192YWxpZGF0ZShudmJvLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKIAlpZiAocmV0ID09IDApIHsKIAkJc3dpdGNoIChiby0+bWVtLm1lbV90eXBlKSB7CiAJCWNhc2UgVFRNX1BMX1ZSQU06CkBAIC0zMTksNiArMzAzLDI1IEBACiAJCXR0bV9ib19rdW5tYXAoJm52Ym8tPmttYXApOwogfQogCitpbnQKK25vdXZlYXVfYm9fdmFsaWRhdGUoc3RydWN0IG5vdXZlYXVfYm8gKm52Ym8sIGJvb2wgaW50ZXJydXB0aWJsZSwKKwkJICAgIGJvb2wgbm9fd2FpdF9yZXNlcnZlLCBib29sIG5vX3dhaXRfZ3B1KQoreworCWludCByZXQ7CisKKwlyZXQgPSB0dG1fYm9fdmFsaWRhdGUoJm52Ym8tPmJvLCAmbnZiby0+cGxhY2VtZW50LCBpbnRlcnJ1cHRpYmxlLAorCQkJICAgICAgbm9fd2FpdF9yZXNlcnZlLCBub193YWl0X2dwdSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWlmIChudmJvLT52bWEubm9kZSkgeworCQlpZiAobnZiby0+Ym8ubWVtLm1lbV90eXBlID09IFRUTV9QTF9WUkFNKQorCQkJbnZiby0+Ym8ub2Zmc2V0ID0gbnZiby0+dm1hLm9mZnNldDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKwogdTE2CiBub3V2ZWF1X2JvX3JkMTYoc3RydWN0IG5vdXZlYXVfYm8gKm52Ym8sIHVuc2lnbmVkIGluZGV4KQogewpAQCAtNDEwLDM3ICs0MTMsNDAgQEAKIAkJbWFuLT5kZWZhdWx0X2NhY2hpbmcgPSBUVE1fUExfRkxBR19DQUNIRUQ7CiAJCWJyZWFrOwogCWNhc2UgVFRNX1BMX1ZSQU06Ci0JCW1hbi0+ZnVuYyA9ICZ0dG1fYm9fbWFuYWdlcl9mdW5jOworCQlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA+PSBOVl81MCkgeworCQkJbWFuLT5mdW5jID0gJm5vdXZlYXVfdnJhbV9tYW5hZ2VyOworCQkJbWFuLT5pb19yZXNlcnZlX2Zhc3RwYXRoID0gZmFsc2U7CisJCQltYW4tPnVzZV9pb19yZXNlcnZlX2xydSA9IHRydWU7CisJCX0gZWxzZSB7CisJCQltYW4tPmZ1bmMgPSAmdHRtX2JvX21hbmFnZXJfZnVuYzsKKwkJfQogCQltYW4tPmZsYWdzID0gVFRNX01FTVRZUEVfRkxBR19GSVhFRCB8CiAJCQkgICAgIFRUTV9NRU1UWVBFX0ZMQUdfTUFQUEFCTEU7CiAJCW1hbi0+YXZhaWxhYmxlX2NhY2hpbmcgPSBUVE1fUExfRkxBR19VTkNBQ0hFRCB8CiAJCQkJCSBUVE1fUExfRkxBR19XQzsKIAkJbWFuLT5kZWZhdWx0X2NhY2hpbmcgPSBUVE1fUExfRkxBR19XQzsKLQkJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPT0gTlZfNTApCi0JCQltYW4tPmdwdV9vZmZzZXQgPSAweDQwMDAwMDAwOwotCQllbHNlCi0JCQltYW4tPmdwdV9vZmZzZXQgPSAwOwogCQlicmVhazsKIAljYXNlIFRUTV9QTF9UVDoKIAkJbWFuLT5mdW5jID0gJnR0bV9ib19tYW5hZ2VyX2Z1bmM7CiAJCXN3aXRjaCAoZGV2X3ByaXYtPmdhcnRfaW5mby50eXBlKSB7CiAJCWNhc2UgTk9VVkVBVV9HQVJUX0FHUDoKIAkJCW1hbi0+ZmxhZ3MgPSBUVE1fTUVNVFlQRV9GTEFHX01BUFBBQkxFOwotCQkJbWFuLT5hdmFpbGFibGVfY2FjaGluZyA9IFRUTV9QTF9GTEFHX1VOQ0FDSEVEOwotCQkJbWFuLT5kZWZhdWx0X2NhY2hpbmcgPSBUVE1fUExfRkxBR19VTkNBQ0hFRDsKKwkJCW1hbi0+YXZhaWxhYmxlX2NhY2hpbmcgPSBUVE1fUExfRkxBR19VTkNBQ0hFRCB8CisJCQkJVFRNX1BMX0ZMQUdfV0M7CisJCQltYW4tPmRlZmF1bHRfY2FjaGluZyA9IFRUTV9QTF9GTEFHX1dDOwogCQkJYnJlYWs7CiAJCWNhc2UgTk9VVkVBVV9HQVJUX1NHRE1BOgogCQkJbWFuLT5mbGFncyA9IFRUTV9NRU1UWVBFX0ZMQUdfTUFQUEFCTEUgfAogCQkJCSAgICAgVFRNX01FTVRZUEVfRkxBR19DTUE7CiAJCQltYW4tPmF2YWlsYWJsZV9jYWNoaW5nID0gVFRNX1BMX01BU0tfQ0FDSElORzsKIAkJCW1hbi0+ZGVmYXVsdF9jYWNoaW5nID0gVFRNX1BMX0ZMQUdfQ0FDSEVEOworCQkJbWFuLT5ncHVfb2Zmc2V0ID0gZGV2X3ByaXYtPmdhcnRfaW5mby5hcGVyX2Jhc2U7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCU5WX0VSUk9SKGRldiwgIlVua25vd24gR0FSVCB0eXBlOiAlZFxuIiwKIAkJCQkgZGV2X3ByaXYtPmdhcnRfaW5mby50eXBlKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9Ci0JCW1hbi0+Z3B1X29mZnNldCA9IGRldl9wcml2LT52bV9nYXJ0X2Jhc2U7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCU5WX0VSUk9SKGRldiwgIlVuc3VwcG9ydGVkIG1lbW9yeSB0eXBlICV1XG4iLCAodW5zaWduZWQpdHlwZSk7CkBAIC00ODUsMTYgKzQ5MSw5IEBACiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAotCWlmIChudmJvLT5jaGFubmVsKSB7Ci0JCXJldCA9IG5vdXZlYXVfZmVuY2Vfc3luYyhmZW5jZSwgbnZiby0+Y2hhbm5lbCk7Ci0JCWlmIChyZXQpCi0JCQlnb3RvIG91dDsKLQl9Ci0KIAlyZXQgPSB0dG1fYm9fbW92ZV9hY2NlbF9jbGVhbnVwKCZudmJvLT5ibywgZmVuY2UsIE5VTEwsIGV2aWN0LAogCQkJCQlub193YWl0X3Jlc2VydmUsIG5vX3dhaXRfZ3B1LCBuZXdfbWVtKTsKLW91dDoKLQlub3V2ZWF1X2ZlbmNlX3VucmVmKCh2b2lkICopJmZlbmNlKTsKKwlub3V2ZWF1X2ZlbmNlX3VucmVmKCZmZW5jZSk7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtNTE2LDYgKzUxNSw1OCBAQAogfQogCiBzdGF0aWMgaW50CitudmMwX2JvX21vdmVfbTJtZihzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuLCBzdHJ1Y3QgdHRtX2J1ZmZlcl9vYmplY3QgKmJvLAorCQkgIHN0cnVjdCB0dG1fbWVtX3JlZyAqb2xkX21lbSwgc3RydWN0IHR0bV9tZW1fcmVnICpuZXdfbWVtKQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IG5vdXZlYXVfYmRldihiby0+YmRldik7CisJc3RydWN0IG5vdXZlYXVfYm8gKm52Ym8gPSBub3V2ZWF1X2JvKGJvKTsKKwl1NjQgc3JjX29mZnNldCA9IG9sZF9tZW0tPnN0YXJ0IDw8IFBBR0VfU0hJRlQ7CisJdTY0IGRzdF9vZmZzZXQgPSBuZXdfbWVtLT5zdGFydCA8PCBQQUdFX1NISUZUOworCXUzMiBwYWdlX2NvdW50ID0gbmV3X21lbS0+bnVtX3BhZ2VzOworCWludCByZXQ7CisKKwlpZiAoIW52Ym8tPm5vX3ZtKSB7CisJCWlmIChvbGRfbWVtLT5tZW1fdHlwZSA9PSBUVE1fUExfVlJBTSkKKwkJCXNyY19vZmZzZXQgID0gbnZiby0+dm1hLm9mZnNldDsKKwkJZWxzZQorCQkJc3JjX29mZnNldCArPSBkZXZfcHJpdi0+Z2FydF9pbmZvLmFwZXJfYmFzZTsKKworCQlpZiAobmV3X21lbS0+bWVtX3R5cGUgPT0gVFRNX1BMX1ZSQU0pCisJCQlkc3Rfb2Zmc2V0ICA9IG52Ym8tPnZtYS5vZmZzZXQ7CisJCWVsc2UKKwkJCWRzdF9vZmZzZXQgKz0gZGV2X3ByaXYtPmdhcnRfaW5mby5hcGVyX2Jhc2U7CisJfQorCisJcGFnZV9jb3VudCA9IG5ld19tZW0tPm51bV9wYWdlczsKKwl3aGlsZSAocGFnZV9jb3VudCkgeworCQlpbnQgbGluZV9jb3VudCA9IChwYWdlX2NvdW50ID4gMjA0NykgPyAyMDQ3IDogcGFnZV9jb3VudDsKKworCQlyZXQgPSBSSU5HX1NQQUNFKGNoYW4sIDEyKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisKKwkJQkVHSU5fTlZDMChjaGFuLCAyLCBOdlN1Yk0yTUYsIDB4MDIzOCwgMik7CisJCU9VVF9SSU5HICAoY2hhbiwgdXBwZXJfMzJfYml0cyhkc3Rfb2Zmc2V0KSk7CisJCU9VVF9SSU5HICAoY2hhbiwgbG93ZXJfMzJfYml0cyhkc3Rfb2Zmc2V0KSk7CisJCUJFR0lOX05WQzAoY2hhbiwgMiwgTnZTdWJNMk1GLCAweDAzMGMsIDYpOworCQlPVVRfUklORyAgKGNoYW4sIHVwcGVyXzMyX2JpdHMoc3JjX29mZnNldCkpOworCQlPVVRfUklORyAgKGNoYW4sIGxvd2VyXzMyX2JpdHMoc3JjX29mZnNldCkpOworCQlPVVRfUklORyAgKGNoYW4sIFBBR0VfU0laRSk7IC8qIHNyY19waXRjaCAqLworCQlPVVRfUklORyAgKGNoYW4sIFBBR0VfU0laRSk7IC8qIGRzdF9waXRjaCAqLworCQlPVVRfUklORyAgKGNoYW4sIFBBR0VfU0laRSk7IC8qIGxpbmVfbGVuZ3RoICovCisJCU9VVF9SSU5HICAoY2hhbiwgbGluZV9jb3VudCk7CisJCUJFR0lOX05WQzAoY2hhbiwgMiwgTnZTdWJNMk1GLCAweDAzMDAsIDEpOworCQlPVVRfUklORyAgKGNoYW4sIDB4MDAxMDAxMTApOworCisJCXBhZ2VfY291bnQgLT0gbGluZV9jb3VudDsKKwkJc3JjX29mZnNldCArPSAoUEFHRV9TSVpFICogbGluZV9jb3VudCk7CisJCWRzdF9vZmZzZXQgKz0gKFBBR0VfU0laRSAqIGxpbmVfY291bnQpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CiBudjUwX2JvX21vdmVfbTJtZihzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuLCBzdHJ1Y3QgdHRtX2J1ZmZlcl9vYmplY3QgKmJvLAogCQkgIHN0cnVjdCB0dG1fbWVtX3JlZyAqb2xkX21lbSwgc3RydWN0IHR0bV9tZW1fcmVnICpuZXdfbWVtKQogewpAQCAtNTI5LDE0ICs1ODAsMTQgQEAKIAlkc3Rfb2Zmc2V0ID0gbmV3X21lbS0+c3RhcnQgPDwgUEFHRV9TSElGVDsKIAlpZiAoIW52Ym8tPm5vX3ZtKSB7CiAJCWlmIChvbGRfbWVtLT5tZW1fdHlwZSA9PSBUVE1fUExfVlJBTSkKLQkJCXNyY19vZmZzZXQgKz0gZGV2X3ByaXYtPnZtX3ZyYW1fYmFzZTsKKwkJCXNyY19vZmZzZXQgID0gbnZiby0+dm1hLm9mZnNldDsKIAkJZWxzZQotCQkJc3JjX29mZnNldCArPSBkZXZfcHJpdi0+dm1fZ2FydF9iYXNlOworCQkJc3JjX29mZnNldCArPSBkZXZfcHJpdi0+Z2FydF9pbmZvLmFwZXJfYmFzZTsKIAogCQlpZiAobmV3X21lbS0+bWVtX3R5cGUgPT0gVFRNX1BMX1ZSQU0pCi0JCQlkc3Rfb2Zmc2V0ICs9IGRldl9wcml2LT52bV92cmFtX2Jhc2U7CisJCQlkc3Rfb2Zmc2V0ICA9IG52Ym8tPnZtYS5vZmZzZXQ7CiAJCWVsc2UKLQkJCWRzdF9vZmZzZXQgKz0gZGV2X3ByaXYtPnZtX2dhcnRfYmFzZTsKKwkJCWRzdF9vZmZzZXQgKz0gZGV2X3ByaXYtPmdhcnRfaW5mby5hcGVyX2Jhc2U7CiAJfQogCiAJcmV0ID0gUklOR19TUEFDRShjaGFuLCAzKTsKQEAgLTY4MywxNyArNzM0LDI3IEBACiAJaW50IHJldDsKIAogCWNoYW4gPSBudmJvLT5jaGFubmVsOwotCWlmICghY2hhbiB8fCBudmJvLT5ub192bSkKKwlpZiAoIWNoYW4gfHwgbnZiby0+bm9fdm0pIHsKIAkJY2hhbiA9IGRldl9wcml2LT5jaGFubmVsOworCQltdXRleF9sb2NrX25lc3RlZCgmY2hhbi0+bXV0ZXgsIE5PVVZFQVVfS0NIQU5ORUxfTVVURVgpOworCX0KIAogCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlIDwgTlZfNTApCiAJCXJldCA9IG52MDRfYm9fbW92ZV9tMm1mKGNoYW4sIGJvLCAmYm8tPm1lbSwgbmV3X21lbSk7CiAJZWxzZQorCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlIDwgTlZfQzApCiAJCXJldCA9IG52NTBfYm9fbW92ZV9tMm1mKGNoYW4sIGJvLCAmYm8tPm1lbSwgbmV3X21lbSk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKKwllbHNlCisJCXJldCA9IG52YzBfYm9fbW92ZV9tMm1mKGNoYW4sIGJvLCAmYm8tPm1lbSwgbmV3X21lbSk7CisJaWYgKHJldCA9PSAwKSB7CisJCXJldCA9IG5vdXZlYXVfYm9fbW92ZV9hY2NlbF9jbGVhbnVwKGNoYW4sIG52Ym8sIGV2aWN0LAorCQkJCQkJICAgIG5vX3dhaXRfcmVzZXJ2ZSwKKwkJCQkJCSAgICBub193YWl0X2dwdSwgbmV3X21lbSk7CisJfQogCi0JcmV0dXJuIG5vdXZlYXVfYm9fbW92ZV9hY2NlbF9jbGVhbnVwKGNoYW4sIG52Ym8sIGV2aWN0LCBub193YWl0X3Jlc2VydmUsIG5vX3dhaXRfZ3B1LCBuZXdfbWVtKTsKKwlpZiAoY2hhbiA9PSBkZXZfcHJpdi0+Y2hhbm5lbCkKKwkJbXV0ZXhfdW5sb2NrKCZjaGFuLT5tdXRleCk7CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGludApAQCAtNzcxLDcgKzgzMiw2IEBACiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGRldl9wcml2LT5kZXY7CiAJc3RydWN0IG5vdXZlYXVfYm8gKm52Ym8gPSBub3V2ZWF1X2JvKGJvKTsKIAl1aW50NjRfdCBvZmZzZXQ7Ci0JaW50IHJldDsKIAogCWlmIChudmJvLT5ub192bSB8fCBuZXdfbWVtLT5tZW1fdHlwZSAhPSBUVE1fUExfVlJBTSkgewogCQkvKiBOb3RoaW5nIHRvIGRvLiAqLwpAQCAtNzgxLDE4ICs4NDEsMTIgQEAKIAogCW9mZnNldCA9IG5ld19tZW0tPnN0YXJ0IDw8IFBBR0VfU0hJRlQ7CiAKLQlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA9PSBOVl81MCkgewotCQlyZXQgPSBudjUwX21lbV92bV9iaW5kX2xpbmVhcihkZXYsCi0JCQkJCSAgICAgIG9mZnNldCArIGRldl9wcml2LT52bV92cmFtX2Jhc2UsCi0JCQkJCSAgICAgIG5ld19tZW0tPnNpemUsCi0JCQkJCSAgICAgIG5vdXZlYXVfYm9fdGlsZV9sYXlvdXQobnZibyksCi0JCQkJCSAgICAgIG9mZnNldCk7Ci0JCWlmIChyZXQpCi0JCQlyZXR1cm4gcmV0OwotCisJaWYgKGRldl9wcml2LT5jaGFuX3ZtKSB7CisJCW5vdXZlYXVfdm1fbWFwKCZudmJvLT52bWEsIG5ld19tZW0tPm1tX25vZGUpOwogCX0gZWxzZSBpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA+PSBOVl8xMCkgewogCQkqbmV3X3RpbGUgPSBudjEwX21lbV9zZXRfdGlsaW5nKGRldiwgb2Zmc2V0LCBuZXdfbWVtLT5zaXplLAotCQkJCQkJbnZiby0+dGlsZV9tb2RlKTsKKwkJCQkJCW52Ym8tPnRpbGVfbW9kZSwKKwkJCQkJCW52Ym8tPnRpbGVfZmxhZ3MpOwogCX0KIAogCXJldHVybiAwOwpAQCAtODA4LDkgKzg2Miw3IEBACiAKIAlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA+PSBOVl8xMCAmJgogCSAgICBkZXZfcHJpdi0+Y2FyZF90eXBlIDwgTlZfNTApIHsKLQkJaWYgKCpvbGRfdGlsZSkKLQkJCW52MTBfbWVtX2V4cGlyZV90aWxpbmcoZGV2LCAqb2xkX3RpbGUsIGJvLT5zeW5jX29iaik7Ci0KKwkJbnYxMF9tZW1fcHV0X3RpbGVfcmVnaW9uKGRldiwgKm9sZF90aWxlLCBiby0+c3luY19vYmopOwogCQkqb2xkX3RpbGUgPSBuZXdfdGlsZTsKIAl9CiB9CkBAIC04NzksNiArOTMxLDcgQEAKIAlzdHJ1Y3QgdHRtX21lbV90eXBlX21hbmFnZXIgKm1hbiA9ICZiZGV2LT5tYW5bbWVtLT5tZW1fdHlwZV07CiAJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gbm91dmVhdV9iZGV2KGJkZXYpOwogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBkZXZfcHJpdi0+ZGV2OworCWludCByZXQ7CiAKIAltZW0tPmJ1cy5hZGRyID0gTlVMTDsKIAltZW0tPmJ1cy5vZmZzZXQgPSAwOwpAQCAtOTAxLDkgKzk1NCw0MCBAQAogI2VuZGlmCiAJCWJyZWFrOwogCWNhc2UgVFRNX1BMX1ZSQU06Ci0JCW1lbS0+YnVzLm9mZnNldCA9IG1lbS0+c3RhcnQgPDwgUEFHRV9TSElGVDsKKwl7CisJCXN0cnVjdCBub3V2ZWF1X3ZyYW0gKnZyYW0gPSBtZW0tPm1tX25vZGU7CisJCXU4IHBhZ2Vfc2hpZnQ7CisKKwkJaWYgKCFkZXZfcHJpdi0+YmFyMV92bSkgeworCQkJbWVtLT5idXMub2Zmc2V0ID0gbWVtLT5zdGFydCA8PCBQQUdFX1NISUZUOworCQkJbWVtLT5idXMuYmFzZSA9IHBjaV9yZXNvdXJjZV9zdGFydChkZXYtPnBkZXYsIDEpOworCQkJbWVtLT5idXMuaXNfaW9tZW0gPSB0cnVlOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA9PSBOVl9DMCkKKwkJCXBhZ2Vfc2hpZnQgPSB2cmFtLT5wYWdlX3NoaWZ0OworCQllbHNlCisJCQlwYWdlX3NoaWZ0ID0gMTI7CisKKwkJcmV0ID0gbm91dmVhdV92bV9nZXQoZGV2X3ByaXYtPmJhcjFfdm0sIG1lbS0+YnVzLnNpemUsCisJCQkJICAgICBwYWdlX3NoaWZ0LCBOVl9NRU1fQUNDRVNTX1JXLAorCQkJCSAgICAgJnZyYW0tPmJhcl92bWEpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKworCQlub3V2ZWF1X3ZtX21hcCgmdnJhbS0+YmFyX3ZtYSwgdnJhbSk7CisJCWlmIChyZXQpIHsKKwkJCW5vdXZlYXVfdm1fcHV0KCZ2cmFtLT5iYXJfdm1hKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKworCQltZW0tPmJ1cy5vZmZzZXQgPSB2cmFtLT5iYXJfdm1hLm9mZnNldDsKKwkJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPT0gTlZfNTApIC8qWFhYKi8KKwkJCW1lbS0+YnVzLm9mZnNldCAtPSAweDAwMjAwMDAwMDBVTEw7CiAJCW1lbS0+YnVzLmJhc2UgPSBwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2LT5wZGV2LCAxKTsKIAkJbWVtLT5idXMuaXNfaW9tZW0gPSB0cnVlOworCX0KIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC05MTQsNiArOTk4LDE3IEBACiBzdGF0aWMgdm9pZAogbm91dmVhdV90dG1faW9fbWVtX2ZyZWUoc3RydWN0IHR0bV9ib19kZXZpY2UgKmJkZXYsIHN0cnVjdCB0dG1fbWVtX3JlZyAqbWVtKQogeworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IG5vdXZlYXVfYmRldihiZGV2KTsKKwlzdHJ1Y3Qgbm91dmVhdV92cmFtICp2cmFtID0gbWVtLT5tbV9ub2RlOworCisJaWYgKCFkZXZfcHJpdi0+YmFyMV92bSB8fCBtZW0tPm1lbV90eXBlICE9IFRUTV9QTF9WUkFNKQorCQlyZXR1cm47CisKKwlpZiAoIXZyYW0tPmJhcl92bWEubm9kZSkKKwkJcmV0dXJuOworCisJbm91dmVhdV92bV91bm1hcCgmdnJhbS0+YmFyX3ZtYSk7CisJbm91dmVhdV92bV9wdXQoJnZyYW0tPmJhcl92bWEpOwogfQogCiBzdGF0aWMgaW50CkBAIC05MzksNyArMTAzNCwyMyBAQAogCW52Ym8tPnBsYWNlbWVudC5mcGZuID0gMDsKIAludmJvLT5wbGFjZW1lbnQubHBmbiA9IGRldl9wcml2LT5mYl9tYXBwYWJsZV9wYWdlczsKIAlub3V2ZWF1X2JvX3BsYWNlbWVudF9zZXQobnZibywgVFRNX1BMX1ZSQU0sIDApOwotCXJldHVybiB0dG1fYm9fdmFsaWRhdGUoYm8sICZudmJvLT5wbGFjZW1lbnQsIGZhbHNlLCB0cnVlLCBmYWxzZSk7CisJcmV0dXJuIG5vdXZlYXVfYm9fdmFsaWRhdGUobnZibywgZmFsc2UsIHRydWUsIGZhbHNlKTsKK30KKwordm9pZAorbm91dmVhdV9ib19mZW5jZShzdHJ1Y3Qgbm91dmVhdV9ibyAqbnZibywgc3RydWN0IG5vdXZlYXVfZmVuY2UgKmZlbmNlKQoreworCXN0cnVjdCBub3V2ZWF1X2ZlbmNlICpvbGRfZmVuY2U7CisKKwlpZiAobGlrZWx5KGZlbmNlKSkKKwkJbm91dmVhdV9mZW5jZV9yZWYoZmVuY2UpOworCisJc3Bpbl9sb2NrKCZudmJvLT5iby5iZGV2LT5mZW5jZV9sb2NrKTsKKwlvbGRfZmVuY2UgPSBudmJvLT5iby5zeW5jX29iajsKKwludmJvLT5iby5zeW5jX29iaiA9IGZlbmNlOworCXNwaW5fdW5sb2NrKCZudmJvLT5iby5iZGV2LT5mZW5jZV9sb2NrKTsKKworCW5vdXZlYXVfZmVuY2VfdW5yZWYoJm9sZF9mZW5jZSk7CiB9CiAKIHN0cnVjdCB0dG1fYm9fZHJpdmVyIG5vdXZlYXVfYm9fZHJpdmVyID0gewpAQCAtOTQ5LDExICsxMDYwLDExIEBACiAJLmV2aWN0X2ZsYWdzID0gbm91dmVhdV9ib19ldmljdF9mbGFncywKIAkubW92ZSA9IG5vdXZlYXVfYm9fbW92ZSwKIAkudmVyaWZ5X2FjY2VzcyA9IG5vdXZlYXVfYm9fdmVyaWZ5X2FjY2VzcywKLQkuc3luY19vYmpfc2lnbmFsZWQgPSBub3V2ZWF1X2ZlbmNlX3NpZ25hbGxlZCwKLQkuc3luY19vYmpfd2FpdCA9IG5vdXZlYXVfZmVuY2Vfd2FpdCwKLQkuc3luY19vYmpfZmx1c2ggPSBub3V2ZWF1X2ZlbmNlX2ZsdXNoLAotCS5zeW5jX29ial91bnJlZiA9IG5vdXZlYXVfZmVuY2VfdW5yZWYsCi0JLnN5bmNfb2JqX3JlZiA9IG5vdXZlYXVfZmVuY2VfcmVmLAorCS5zeW5jX29ial9zaWduYWxlZCA9IF9fbm91dmVhdV9mZW5jZV9zaWduYWxsZWQsCisJLnN5bmNfb2JqX3dhaXQgPSBfX25vdXZlYXVfZmVuY2Vfd2FpdCwKKwkuc3luY19vYmpfZmx1c2ggPSBfX25vdXZlYXVfZmVuY2VfZmx1c2gsCisJLnN5bmNfb2JqX3VucmVmID0gX19ub3V2ZWF1X2ZlbmNlX3VucmVmLAorCS5zeW5jX29ial9yZWYgPSBfX25vdXZlYXVfZmVuY2VfcmVmLAogCS5mYXVsdF9yZXNlcnZlX25vdGlmeSA9ICZub3V2ZWF1X3R0bV9mYXVsdF9yZXNlcnZlX25vdGlmeSwKIAkuaW9fbWVtX3Jlc2VydmUgPSAmbm91dmVhdV90dG1faW9fbWVtX3Jlc2VydmUsCiAJLmlvX21lbV9mcmVlID0gJm5vdXZlYXVfdHRtX2lvX21lbV9mcmVlLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9jaGFubmVsLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2NoYW5uZWwuYwppbmRleCAzNzM5NTBlLi4zOTYwZDY2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2NoYW5uZWwuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2NoYW5uZWwuYwpAQCAtMzgsMjMgKzM4LDI4IEBACiAJaW50IHJldDsKIAogCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlID49IE5WXzUwKSB7Ci0JCXJldCA9IG5vdXZlYXVfZ3B1b2JqX2RtYV9uZXcoY2hhbiwgTlZfQ0xBU1NfRE1BX0lOX01FTU9SWSwgMCwKLQkJCQkJICAgICBkZXZfcHJpdi0+dm1fZW5kLCBOVl9ETUFfQUNDRVNTX1JPLAotCQkJCQkgICAgIE5WX0RNQV9UQVJHRVRfQUdQLCAmcHVzaGJ1Zik7CisJCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlIDwgTlZfQzApIHsKKwkJCXJldCA9IG5vdXZlYXVfZ3B1b2JqX2RtYV9uZXcoY2hhbiwKKwkJCQkJCSAgICAgTlZfQ0xBU1NfRE1BX0lOX01FTU9SWSwgMCwKKwkJCQkJCSAgICAgKDFVTEwgPDwgNDApLAorCQkJCQkJICAgICBOVl9NRU1fQUNDRVNTX1JPLAorCQkJCQkJICAgICBOVl9NRU1fVEFSR0VUX1ZNLAorCQkJCQkJICAgICAmcHVzaGJ1Zik7CisJCX0KIAkJY2hhbi0+cHVzaGJ1Zl9iYXNlID0gcGItPmJvLm9mZnNldDsKIAl9IGVsc2UKIAlpZiAocGItPmJvLm1lbS5tZW1fdHlwZSA9PSBUVE1fUExfVFQpIHsKLQkJcmV0ID0gbm91dmVhdV9ncHVvYmpfZ2FydF9kbWFfbmV3KGNoYW4sIDAsCi0JCQkJCQkgIGRldl9wcml2LT5nYXJ0X2luZm8uYXBlcl9zaXplLAotCQkJCQkJICBOVl9ETUFfQUNDRVNTX1JPLCAmcHVzaGJ1ZiwKLQkJCQkJCSAgTlVMTCk7CisJCXJldCA9IG5vdXZlYXVfZ3B1b2JqX2RtYV9uZXcoY2hhbiwgTlZfQ0xBU1NfRE1BX0lOX01FTU9SWSwgMCwKKwkJCQkJICAgICBkZXZfcHJpdi0+Z2FydF9pbmZvLmFwZXJfc2l6ZSwKKwkJCQkJICAgICBOVl9NRU1fQUNDRVNTX1JPLAorCQkJCQkgICAgIE5WX01FTV9UQVJHRVRfR0FSVCwgJnB1c2hidWYpOwogCQljaGFuLT5wdXNoYnVmX2Jhc2UgPSBwYi0+Ym8ubWVtLnN0YXJ0IDw8IFBBR0VfU0hJRlQ7CiAJfSBlbHNlCiAJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgIT0gTlZfMDQpIHsKIAkJcmV0ID0gbm91dmVhdV9ncHVvYmpfZG1hX25ldyhjaGFuLCBOVl9DTEFTU19ETUFfSU5fTUVNT1JZLCAwLAogCQkJCQkgICAgIGRldl9wcml2LT5mYl9hdmFpbGFibGVfc2l6ZSwKLQkJCQkJICAgICBOVl9ETUFfQUNDRVNTX1JPLAotCQkJCQkgICAgIE5WX0RNQV9UQVJHRVRfVklETUVNLCAmcHVzaGJ1Zik7CisJCQkJCSAgICAgTlZfTUVNX0FDQ0VTU19STywKKwkJCQkJICAgICBOVl9NRU1fVEFSR0VUX1ZSQU0sICZwdXNoYnVmKTsKIAkJY2hhbi0+cHVzaGJ1Zl9iYXNlID0gcGItPmJvLm1lbS5zdGFydCA8PCBQQUdFX1NISUZUOwogCX0gZWxzZSB7CiAJCS8qIE5WMDQgY21kYnVmIGhhY2ssIGZyb20gb3JpZ2luYWwgZGR4Li4gbm90IHN1cmUgb2YgaXQncwpAQCAtNjIsMTcgKzY3LDE2IEBACiAJCSAqIFZSQU0uCiAJCSAqLwogCQlyZXQgPSBub3V2ZWF1X2dwdW9ial9kbWFfbmV3KGNoYW4sIE5WX0NMQVNTX0RNQV9JTl9NRU1PUlksCi0JCQkJCSAgICAgcGNpX3Jlc291cmNlX3N0YXJ0KGRldi0+cGRldiwKLQkJCQkJICAgICAxKSwKKwkJCQkJICAgICBwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2LT5wZGV2LCAxKSwKIAkJCQkJICAgICBkZXZfcHJpdi0+ZmJfYXZhaWxhYmxlX3NpemUsCi0JCQkJCSAgICAgTlZfRE1BX0FDQ0VTU19STywKLQkJCQkJICAgICBOVl9ETUFfVEFSR0VUX1BDSSwgJnB1c2hidWYpOworCQkJCQkgICAgIE5WX01FTV9BQ0NFU1NfUk8sCisJCQkJCSAgICAgTlZfTUVNX1RBUkdFVF9QQ0ksICZwdXNoYnVmKTsKIAkJY2hhbi0+cHVzaGJ1Zl9iYXNlID0gcGItPmJvLm1lbS5zdGFydCA8PCBQQUdFX1NISUZUOwogCX0KIAogCW5vdXZlYXVfZ3B1b2JqX3JlZihwdXNoYnVmLCAmY2hhbi0+cHVzaGJ1Zik7CiAJbm91dmVhdV9ncHVvYmpfcmVmKE5VTEwsICZwdXNoYnVmKTsKLQlyZXR1cm4gMDsKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgc3RydWN0IG5vdXZlYXVfYm8gKgpAQCAtMTAwLDYgKzEwNCwxMyBAQAogCQlyZXR1cm4gTlVMTDsKIAl9CiAKKwlyZXQgPSBub3V2ZWF1X2JvX21hcChwdXNoYnVmKTsKKwlpZiAocmV0KSB7CisJCW5vdXZlYXVfYm9fdW5waW4ocHVzaGJ1Zik7CisJCW5vdXZlYXVfYm9fcmVmKE5VTEwsICZwdXNoYnVmKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCiAJcmV0dXJuIHB1c2hidWY7CiB9CiAKQEAgLTEwNyw3NCArMTE4LDU5IEBACiBpbnQKIG5vdXZlYXVfY2hhbm5lbF9hbGxvYyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICoqY2hhbl9yZXQsCiAJCSAgICAgIHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2LAotCQkgICAgICB1aW50MzJfdCB2cmFtX2hhbmRsZSwgdWludDMyX3QgdHRfaGFuZGxlKQorCQkgICAgICB1aW50MzJfdCB2cmFtX2hhbmRsZSwgdWludDMyX3QgZ2FydF9oYW5kbGUpCiB7CiAJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlzdHJ1Y3Qgbm91dmVhdV9wZ3JhcGhfZW5naW5lICpwZ3JhcGggPSAmZGV2X3ByaXYtPmVuZ2luZS5ncmFwaDsKIAlzdHJ1Y3Qgbm91dmVhdV9maWZvX2VuZ2luZSAqcGZpZm8gPSAmZGV2X3ByaXYtPmVuZ2luZS5maWZvOwogCXN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW47Ci0JaW50IGNoYW5uZWwsIHVzZXI7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgcmV0OwogCi0JLyoKLQkgKiBBbHJpZ2h0LCBoZXJlIGlzIHRoZSBmdWxsIHN0b3J5Ci0JICogTnZpZGlhIGNhcmRzIGhhdmUgbXVsdGlwbGUgaHcgZmlmbyBjb250ZXh0cyAocHJhaXNlIHRoZW0gZm9yIHRoYXQsCi0JICogbm8gY29tcGxpY2F0ZWQgY3Jhc2gtcHJvbmUgY29udGV4dCBzd2l0Y2hlcykKLQkgKiBXZSBhbGxvY2F0ZSBhIG5ldyBjb250ZXh0IGZvciBlYWNoIGFwcCBhbmQgbGV0IGl0IHdyaXRlIHRvIGl0Ci0JICogZGlyZWN0bHkgKHdvbywgZnVsbCB1c2Vyc3BhY2UgY29tbWFuZCBzdWJtaXNzaW9uICEpCi0JICogV2hlbiB0aGVyZSBhcmUgbm8gbW9yZSBjb250ZXh0cywgeW91IGxvc3QKLQkgKi8KLQlmb3IgKGNoYW5uZWwgPSAwOyBjaGFubmVsIDwgcGZpZm8tPmNoYW5uZWxzOyBjaGFubmVsKyspIHsKLQkJaWYgKGRldl9wcml2LT5maWZvc1tjaGFubmVsXSA9PSBOVUxMKQotCQkJYnJlYWs7Ci0JfQotCi0JLyogbm8gbW9yZSBmaWZvcy4geW91IGxvc3QuICovCi0JaWYgKGNoYW5uZWwgPT0gcGZpZm8tPmNoYW5uZWxzKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWRldl9wcml2LT5maWZvc1tjaGFubmVsXSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwpLAotCQkJCQkgICBHRlBfS0VSTkVMKTsKLQlpZiAoIWRldl9wcml2LT5maWZvc1tjaGFubmVsXSkKKwkvKiBhbGxvY2F0ZSBhbmQgbG9jayBjaGFubmVsIHN0cnVjdHVyZSAqLworCWNoYW4gPSBremFsbG9jKHNpemVvZigqY2hhbiksIEdGUF9LRVJORUwpOworCWlmICghY2hhbikKIAkJcmV0dXJuIC1FTk9NRU07Ci0JY2hhbiA9IGRldl9wcml2LT5maWZvc1tjaGFubmVsXTsKLQlJTklUX0xJU1RfSEVBRCgmY2hhbi0+bnZzdy52Ymxfd2FpdCk7Ci0JSU5JVF9MSVNUX0hFQUQoJmNoYW4tPmZlbmNlLnBlbmRpbmcpOwogCWNoYW4tPmRldiA9IGRldjsKLQljaGFuLT5pZCA9IGNoYW5uZWw7CiAJY2hhbi0+ZmlsZV9wcml2ID0gZmlsZV9wcml2OwogCWNoYW4tPnZyYW1faGFuZGxlID0gdnJhbV9oYW5kbGU7Ci0JY2hhbi0+Z2FydF9oYW5kbGUgPSB0dF9oYW5kbGU7CisJY2hhbi0+Z2FydF9oYW5kbGUgPSBnYXJ0X2hhbmRsZTsKIAotCU5WX0lORk8oZGV2LCAiQWxsb2NhdGluZyBGSUZPIG51bWJlciAlZFxuIiwgY2hhbm5lbCk7CisJa3JlZl9pbml0KCZjaGFuLT5yZWYpOworCWF0b21pY19zZXQoJmNoYW4tPnVzZXJzLCAxKTsKKwltdXRleF9pbml0KCZjaGFuLT5tdXRleCk7CisJbXV0ZXhfbG9jaygmY2hhbi0+bXV0ZXgpOworCisJLyogYWxsb2NhdGUgaHcgY2hhbm5lbCBpZCAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZfcHJpdi0+Y2hhbm5lbHMubG9jaywgZmxhZ3MpOworCWZvciAoY2hhbi0+aWQgPSAwOyBjaGFuLT5pZCA8IHBmaWZvLT5jaGFubmVsczsgY2hhbi0+aWQrKykgeworCQlpZiAoIWRldl9wcml2LT5jaGFubmVscy5wdHJbY2hhbi0+aWRdKSB7CisJCQlub3V2ZWF1X2NoYW5uZWxfcmVmKGNoYW4sICZkZXZfcHJpdi0+Y2hhbm5lbHMucHRyW2NoYW4tPmlkXSk7CisJCQlicmVhazsKKwkJfQorCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZfcHJpdi0+Y2hhbm5lbHMubG9jaywgZmxhZ3MpOworCisJaWYgKGNoYW4tPmlkID09IHBmaWZvLT5jaGFubmVscykgeworCQltdXRleF91bmxvY2soJmNoYW4tPm11dGV4KTsKKwkJa2ZyZWUoY2hhbik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCU5WX0RFQlVHKGRldiwgImluaXRpYWxpc2luZyBjaGFubmVsICVkXG4iLCBjaGFuLT5pZCk7CisJSU5JVF9MSVNUX0hFQUQoJmNoYW4tPm52c3cudmJsX3dhaXQpOworCUlOSVRfTElTVF9IRUFEKCZjaGFuLT5udnN3LmZsaXApOworCUlOSVRfTElTVF9IRUFEKCZjaGFuLT5mZW5jZS5wZW5kaW5nKTsKIAogCS8qIEFsbG9jYXRlIERNQSBwdXNoIGJ1ZmZlciAqLwogCWNoYW4tPnB1c2hidWZfYm8gPSBub3V2ZWF1X2NoYW5uZWxfdXNlcl9wdXNoYnVmX2FsbG9jKGRldik7CiAJaWYgKCFjaGFuLT5wdXNoYnVmX2JvKSB7CiAJCXJldCA9IC1FTk9NRU07CiAJCU5WX0VSUk9SKGRldiwgInB1c2hidWYgJWRcbiIsIHJldCk7Ci0JCW5vdXZlYXVfY2hhbm5lbF9mcmVlKGNoYW4pOworCQlub3V2ZWF1X2NoYW5uZWxfcHV0KCZjaGFuKTsKIAkJcmV0dXJuIHJldDsKIAl9CiAKIAlub3V2ZWF1X2RtYV9wcmVfaW5pdChjaGFuKTsKLQotCS8qIExvY2F0ZSBjaGFubmVsJ3MgdXNlciBjb250cm9sIHJlZ3MgKi8KLQlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA8IE5WXzQwKQotCQl1c2VyID0gTlYwM19VU0VSKGNoYW5uZWwpOwotCWVsc2UKLQlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA8IE5WXzUwKQotCQl1c2VyID0gTlY0MF9VU0VSKGNoYW5uZWwpOwotCWVsc2UKLQkJdXNlciA9IE5WNTBfVVNFUihjaGFubmVsKTsKLQotCWNoYW4tPnVzZXIgPSBpb3JlbWFwKHBjaV9yZXNvdXJjZV9zdGFydChkZXYtPnBkZXYsIDApICsgdXNlciwKLQkJCQkJCQkJUEFHRV9TSVpFKTsKLQlpZiAoIWNoYW4tPnVzZXIpIHsKLQkJTlZfRVJST1IoZGV2LCAiaW9yZW1hcCBvZiByZWdzIGZhaWxlZC5cbiIpOwotCQlub3V2ZWF1X2NoYW5uZWxfZnJlZShjaGFuKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQogCWNoYW4tPnVzZXJfcHV0ID0gMHg0MDsKIAljaGFuLT51c2VyX2dldCA9IDB4NDQ7CiAKQEAgLTE4MiwxNSArMTc4LDE1IEBACiAJcmV0ID0gbm91dmVhdV9ub3RpZmllcl9pbml0X2NoYW5uZWwoY2hhbik7CiAJaWYgKHJldCkgewogCQlOVl9FUlJPUihkZXYsICJudGZ5ICVkXG4iLCByZXQpOwotCQlub3V2ZWF1X2NoYW5uZWxfZnJlZShjaGFuKTsKKwkJbm91dmVhdV9jaGFubmVsX3B1dCgmY2hhbik7CiAJCXJldHVybiByZXQ7CiAJfQogCiAJLyogU2V0dXAgY2hhbm5lbCdzIGRlZmF1bHQgb2JqZWN0cyAqLwotCXJldCA9IG5vdXZlYXVfZ3B1b2JqX2NoYW5uZWxfaW5pdChjaGFuLCB2cmFtX2hhbmRsZSwgdHRfaGFuZGxlKTsKKwlyZXQgPSBub3V2ZWF1X2dwdW9ial9jaGFubmVsX2luaXQoY2hhbiwgdnJhbV9oYW5kbGUsIGdhcnRfaGFuZGxlKTsKIAlpZiAocmV0KSB7CiAJCU5WX0VSUk9SKGRldiwgImdwdW9iaiAlZFxuIiwgcmV0KTsKLQkJbm91dmVhdV9jaGFubmVsX2ZyZWUoY2hhbik7CisJCW5vdXZlYXVfY2hhbm5lbF9wdXQoJmNoYW4pOwogCQlyZXR1cm4gcmV0OwogCX0KIApAQCAtMTk4LDI0ICsxOTQsMTcgQEAKIAlyZXQgPSBub3V2ZWF1X2NoYW5uZWxfcHVzaGJ1Zl9jdHhkbWFfaW5pdChjaGFuKTsKIAlpZiAocmV0KSB7CiAJCU5WX0VSUk9SKGRldiwgInBiY3R4ZG1hICVkXG4iLCByZXQpOwotCQlub3V2ZWF1X2NoYW5uZWxfZnJlZShjaGFuKTsKKwkJbm91dmVhdV9jaGFubmVsX3B1dCgmY2hhbik7CiAJCXJldHVybiByZXQ7CiAJfQogCiAJLyogZGlzYWJsZSB0aGUgZmlmbyBjYWNoZXMgKi8KIAlwZmlmby0+cmVhc3NpZ24oZGV2LCBmYWxzZSk7CiAKLQkvKiBDcmVhdGUgYSBncmFwaGljcyBjb250ZXh0IGZvciBuZXcgY2hhbm5lbCAqLwotCXJldCA9IHBncmFwaC0+Y3JlYXRlX2NvbnRleHQoY2hhbik7Ci0JaWYgKHJldCkgewotCQlub3V2ZWF1X2NoYW5uZWxfZnJlZShjaGFuKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KIAkvKiBDb25zdHJ1Y3QgaW5pdGFsIFJBTUZDIGZvciBuZXcgY2hhbm5lbCAqLwogCXJldCA9IHBmaWZvLT5jcmVhdGVfY29udGV4dChjaGFuKTsKIAlpZiAocmV0KSB7Ci0JCW5vdXZlYXVfY2hhbm5lbF9mcmVlKGNoYW4pOworCQlub3V2ZWF1X2NoYW5uZWxfcHV0KCZjaGFuKTsKIAkJcmV0dXJuIHJldDsKIAl9CiAKQEAgLTIyNSw4MyArMjE0LDExMSBAQAogCWlmICghcmV0KQogCQlyZXQgPSBub3V2ZWF1X2ZlbmNlX2NoYW5uZWxfaW5pdChjaGFuKTsKIAlpZiAocmV0KSB7Ci0JCW5vdXZlYXVfY2hhbm5lbF9mcmVlKGNoYW4pOworCQlub3V2ZWF1X2NoYW5uZWxfcHV0KCZjaGFuKTsKIAkJcmV0dXJuIHJldDsKIAl9CiAKIAlub3V2ZWF1X2RlYnVnZnNfY2hhbm5lbF9pbml0KGNoYW4pOwogCi0JTlZfSU5GTyhkZXYsICIlczogaW5pdGlhbGlzZWQgRklGTyAlZFxuIiwgX19mdW5jX18sIGNoYW5uZWwpOworCU5WX0RFQlVHKGRldiwgImNoYW5uZWwgJWQgaW5pdGlhbGlzZWRcbiIsIGNoYW4tPmlkKTsKIAkqY2hhbl9yZXQgPSBjaGFuOwogCXJldHVybiAwOwogfQogCi0vKiBzdG9wcyBhIGZpZm8gKi8KLXZvaWQKLW5vdXZlYXVfY2hhbm5lbF9mcmVlKHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4pCitzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICoKK25vdXZlYXVfY2hhbm5lbF9nZXRfdW5sb2NrZWQoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqcmVmKQogewotCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjaGFuLT5kZXY7CisJc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbiA9IE5VTEw7CisKKwlpZiAobGlrZWx5KHJlZiAmJiBhdG9taWNfaW5jX25vdF96ZXJvKCZyZWYtPnVzZXJzKSkpCisJCW5vdXZlYXVfY2hhbm5lbF9yZWYocmVmLCAmY2hhbik7CisKKwlyZXR1cm4gY2hhbjsKK30KKworc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqCitub3V2ZWF1X2NoYW5uZWxfZ2V0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2LCBpbnQgaWQpCit7CiAJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlzdHJ1Y3Qgbm91dmVhdV9wZ3JhcGhfZW5naW5lICpwZ3JhcGggPSAmZGV2X3ByaXYtPmVuZ2luZS5ncmFwaDsKLQlzdHJ1Y3Qgbm91dmVhdV9maWZvX2VuZ2luZSAqcGZpZm8gPSAmZGV2X3ByaXYtPmVuZ2luZS5maWZvOworCXN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW47CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgcmV0OwogCi0JTlZfSU5GTyhkZXYsICIlczogZnJlZWluZyBmaWZvICVkXG4iLCBfX2Z1bmNfXywgY2hhbi0+aWQpOworCWlmICh1bmxpa2VseShpZCA8IDAgfHwgaWQgPj0gTk9VVkVBVV9NQVhfQ0hBTk5FTF9OUikpCisJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwogCi0Jbm91dmVhdV9kZWJ1Z2ZzX2NoYW5uZWxfZmluaShjaGFuKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2X3ByaXYtPmNoYW5uZWxzLmxvY2ssIGZsYWdzKTsKKwljaGFuID0gbm91dmVhdV9jaGFubmVsX2dldF91bmxvY2tlZChkZXZfcHJpdi0+Y2hhbm5lbHMucHRyW2lkXSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2X3ByaXYtPmNoYW5uZWxzLmxvY2ssIGZsYWdzKTsKIAotCS8qIEdpdmUgb3V0c3RhbmRpbmcgcHVzaCBidWZmZXJzIGEgY2hhbmNlIHRvIGNvbXBsZXRlICovCi0Jbm91dmVhdV9mZW5jZV91cGRhdGUoY2hhbik7Ci0JaWYgKGNoYW4tPmZlbmNlLnNlcXVlbmNlICE9IGNoYW4tPmZlbmNlLnNlcXVlbmNlX2FjaykgewotCQlzdHJ1Y3Qgbm91dmVhdV9mZW5jZSAqZmVuY2UgPSBOVUxMOworCWlmICh1bmxpa2VseSghY2hhbikpCisJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwogCi0JCXJldCA9IG5vdXZlYXVfZmVuY2VfbmV3KGNoYW4sICZmZW5jZSwgdHJ1ZSk7Ci0JCWlmIChyZXQgPT0gMCkgewotCQkJcmV0ID0gbm91dmVhdV9mZW5jZV93YWl0KGZlbmNlLCBOVUxMLCBmYWxzZSwgZmFsc2UpOwotCQkJbm91dmVhdV9mZW5jZV91bnJlZigodm9pZCAqKSZmZW5jZSk7Ci0JCX0KLQotCQlpZiAocmV0KQotCQkJTlZfRVJST1IoZGV2LCAiRmFpbGVkIHRvIGlkbGUgY2hhbm5lbCAlZC5cbiIsIGNoYW4tPmlkKTsKKwlpZiAodW5saWtlbHkoZmlsZV9wcml2ICYmIGNoYW4tPmZpbGVfcHJpdiAhPSBmaWxlX3ByaXYpKSB7CisJCW5vdXZlYXVfY2hhbm5lbF9wdXRfdW5sb2NrZWQoJmNoYW4pOworCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKIAl9CiAKLQkvKiBFbnN1cmUgYWxsIG91dHN0YW5kaW5nIGZlbmNlcyBhcmUgc2lnbmFsZWQuICBUaGV5IHNob3VsZCBiZSBpZiB0aGUKKwltdXRleF9sb2NrKCZjaGFuLT5tdXRleCk7CisJcmV0dXJuIGNoYW47Cit9CisKK3ZvaWQKK25vdXZlYXVfY2hhbm5lbF9wdXRfdW5sb2NrZWQoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqKnBjaGFuKQoreworCXN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4gPSAqcGNoYW47CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNoYW4tPmRldjsKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBub3V2ZWF1X2ZpZm9fZW5naW5lICpwZmlmbyA9ICZkZXZfcHJpdi0+ZW5naW5lLmZpZm87CisJc3RydWN0IG5vdXZlYXVfcGdyYXBoX2VuZ2luZSAqcGdyYXBoID0gJmRldl9wcml2LT5lbmdpbmUuZ3JhcGg7CisJc3RydWN0IG5vdXZlYXVfY3J5cHRfZW5naW5lICpwY3J5cHQgPSAmZGV2X3ByaXYtPmVuZ2luZS5jcnlwdDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyogZGVjcmVtZW50IHRoZSByZWZjb3VudCwgYW5kIHdlJ3JlIGRvbmUgaWYgdGhlcmUncyBzdGlsbCByZWZzICovCisJaWYgKGxpa2VseSghYXRvbWljX2RlY19hbmRfdGVzdCgmY2hhbi0+dXNlcnMpKSkgeworCQlub3V2ZWF1X2NoYW5uZWxfcmVmKE5VTEwsIHBjaGFuKTsKKwkJcmV0dXJuOworCX0KKworCS8qIG5vb25lIHdhbnRzIHRoZSBjaGFubmVsIGFueW1vcmUgKi8KKwlOVl9ERUJVRyhkZXYsICJmcmVlaW5nIGNoYW5uZWwgJWRcbiIsIGNoYW4tPmlkKTsKKwlub3V2ZWF1X2RlYnVnZnNfY2hhbm5lbF9maW5pKGNoYW4pOworCisJLyogZ2l2ZSBpdCBjaGFuY2UgdG8gaWRsZSAqLworCW5vdXZlYXVfY2hhbm5lbF9pZGxlKGNoYW4pOworCisJLyogZW5zdXJlIGFsbCBvdXRzdGFuZGluZyBmZW5jZXMgYXJlIHNpZ25hbGVkLiAgdGhleSBzaG91bGQgYmUgaWYgdGhlCiAJICogYWJvdmUgYXR0ZW1wdHMgYXQgaWRsaW5nIHdlcmUgT0ssIGJ1dCBpZiB3ZSBmYWlsZWQgdGhpcydsbCB0ZWxsIFRUTQogCSAqIHdlJ3JlIGRvbmUgd2l0aCB0aGUgYnVmZmVycy4KIAkgKi8KIAlub3V2ZWF1X2ZlbmNlX2NoYW5uZWxfZmluaShjaGFuKTsKIAotCS8qIFRoaXMgd2lsbCBwcmV2ZW50IHBmaWZvIGZyb20gc3dpdGNoaW5nIGNoYW5uZWxzLiAqLworCS8qIGJvb3QgaXQgb2ZmIHRoZSBoYXJkd2FyZSAqLwogCXBmaWZvLT5yZWFzc2lnbihkZXYsIGZhbHNlKTsKIAotCS8qIFdlIHdhbnQgdG8gZ2l2ZSBwZ3JhcGggYSBjaGFuY2UgdG8gaWRsZSBhbmQgZ2V0IHJpZCBvZiBhbGwgcG90ZW50aWFsCi0JICogZXJyb3JzLiBXZSBuZWVkIHRvIGRvIHRoaXMgYmVmb3JlIHRoZSBsb2NrLCBvdGhlcndpc2UgdGhlIGlycSBoYW5kbGVyCi0JICogaXMgdW5hYmxlIHRvIHByb2Nlc3MgdGhlbS4KKwkvKiBXZSB3YW50IHRvIGdpdmUgcGdyYXBoIGEgY2hhbmNlIHRvIGlkbGUgYW5kIGdldCByaWQgb2YgYWxsCisJICogcG90ZW50aWFsIGVycm9ycy4gV2UgbmVlZCB0byBkbyB0aGlzIHdpdGhvdXQgdGhlIGNvbnRleHQKKwkgKiBzd2l0Y2ggbG9jayBoZWxkLCBvdGhlcndpc2UgdGhlIGlycSBoYW5kbGVyIGlzIHVuYWJsZSB0bworCSAqIHByb2Nlc3MgdGhlbS4KIAkgKi8KIAlpZiAocGdyYXBoLT5jaGFubmVsKGRldikgPT0gY2hhbikKIAkJbm91dmVhdV93YWl0X2Zvcl9pZGxlKGRldik7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2X3ByaXYtPmNvbnRleHRfc3dpdGNoX2xvY2ssIGZsYWdzKTsKLQotCXBncmFwaC0+Zmlmb19hY2Nlc3MoZGV2LCBmYWxzZSk7Ci0JaWYgKHBncmFwaC0+Y2hhbm5lbChkZXYpID09IGNoYW4pCi0JCXBncmFwaC0+dW5sb2FkX2NvbnRleHQoZGV2KTsKLQlwZ3JhcGgtPmRlc3Ryb3lfY29udGV4dChjaGFuKTsKLQlwZ3JhcGgtPmZpZm9fYWNjZXNzKGRldiwgdHJ1ZSk7Ci0KLQlpZiAocGZpZm8tPmNoYW5uZWxfaWQoZGV2KSA9PSBjaGFuLT5pZCkgewotCQlwZmlmby0+ZGlzYWJsZShkZXYpOwotCQlwZmlmby0+dW5sb2FkX2NvbnRleHQoZGV2KTsKLQkJcGZpZm8tPmVuYWJsZShkZXYpOwotCX0KKwkvKiBkZXN0cm95IHRoZSBlbmdpbmUgc3BlY2lmaWMgY29udGV4dHMgKi8KIAlwZmlmby0+ZGVzdHJveV9jb250ZXh0KGNoYW4pOworCXBncmFwaC0+ZGVzdHJveV9jb250ZXh0KGNoYW4pOworCWlmIChwY3J5cHQtPmRlc3Ryb3lfY29udGV4dCkKKwkJcGNyeXB0LT5kZXN0cm95X2NvbnRleHQoY2hhbik7CiAKIAlwZmlmby0+cmVhc3NpZ24oZGV2LCB0cnVlKTsKIAotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldl9wcml2LT5jb250ZXh0X3N3aXRjaF9sb2NrLCBmbGFncyk7CisJLyogYXNpZGUgZnJvbSBpdHMgcmVzb3VyY2VzLCB0aGUgY2hhbm5lbCBzaG91bGQgbm93IGJlIGRlYWQsCisJICogcmVtb3ZlIGl0IGZyb20gdGhlIGNoYW5uZWwgbGlzdAorCSAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZfcHJpdi0+Y2hhbm5lbHMubG9jaywgZmxhZ3MpOworCW5vdXZlYXVfY2hhbm5lbF9yZWYoTlVMTCwgJmRldl9wcml2LT5jaGFubmVscy5wdHJbY2hhbi0+aWRdKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZfcHJpdi0+Y2hhbm5lbHMubG9jaywgZmxhZ3MpOwogCi0JLyogUmVsZWFzZSB0aGUgY2hhbm5lbCdzIHJlc291cmNlcyAqLworCS8qIGRlc3Ryb3kgYW55IHJlc291cmNlcyB0aGUgY2hhbm5lbCBvd25lZCAqLwogCW5vdXZlYXVfZ3B1b2JqX3JlZihOVUxMLCAmY2hhbi0+cHVzaGJ1Zik7CiAJaWYgKGNoYW4tPnB1c2hidWZfYm8pIHsKIAkJbm91dmVhdV9ib191bm1hcChjaGFuLT5wdXNoYnVmX2JvKTsKQEAgLTMxMCw0NCArMzI3LDgwIEBACiAJfQogCW5vdXZlYXVfZ3B1b2JqX2NoYW5uZWxfdGFrZWRvd24oY2hhbik7CiAJbm91dmVhdV9ub3RpZmllcl90YWtlZG93bl9jaGFubmVsKGNoYW4pOwotCWlmIChjaGFuLT51c2VyKQotCQlpb3VubWFwKGNoYW4tPnVzZXIpOwogCi0JZGV2X3ByaXYtPmZpZm9zW2NoYW4tPmlkXSA9IE5VTEw7CisJbm91dmVhdV9jaGFubmVsX3JlZihOVUxMLCBwY2hhbik7Cit9CisKK3ZvaWQKK25vdXZlYXVfY2hhbm5lbF9wdXQoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqKnBjaGFuKQoreworCW11dGV4X3VubG9jaygmKCpwY2hhbiktPm11dGV4KTsKKwlub3V2ZWF1X2NoYW5uZWxfcHV0X3VubG9ja2VkKHBjaGFuKTsKK30KKworc3RhdGljIHZvaWQKK25vdXZlYXVfY2hhbm5lbF9kZWwoc3RydWN0IGtyZWYgKnJlZikKK3sKKwlzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuID0KKwkJY29udGFpbmVyX29mKHJlZiwgc3RydWN0IG5vdXZlYXVfY2hhbm5lbCwgcmVmKTsKKwogCWtmcmVlKGNoYW4pOwogfQogCit2b2lkCitub3V2ZWF1X2NoYW5uZWxfcmVmKHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4sCisJCSAgICBzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICoqcGNoYW4pCit7CisJaWYgKGNoYW4pCisJCWtyZWZfZ2V0KCZjaGFuLT5yZWYpOworCisJaWYgKCpwY2hhbikKKwkJa3JlZl9wdXQoJigqcGNoYW4pLT5yZWYsIG5vdXZlYXVfY2hhbm5lbF9kZWwpOworCisJKnBjaGFuID0gY2hhbjsKK30KKwordm9pZAorbm91dmVhdV9jaGFubmVsX2lkbGUoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbikKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY2hhbi0+ZGV2OworCXN0cnVjdCBub3V2ZWF1X2ZlbmNlICpmZW5jZSA9IE5VTEw7CisJaW50IHJldDsKKworCW5vdXZlYXVfZmVuY2VfdXBkYXRlKGNoYW4pOworCisJaWYgKGNoYW4tPmZlbmNlLnNlcXVlbmNlICE9IGNoYW4tPmZlbmNlLnNlcXVlbmNlX2FjaykgeworCQlyZXQgPSBub3V2ZWF1X2ZlbmNlX25ldyhjaGFuLCAmZmVuY2UsIHRydWUpOworCQlpZiAoIXJldCkgeworCQkJcmV0ID0gbm91dmVhdV9mZW5jZV93YWl0KGZlbmNlLCBmYWxzZSwgZmFsc2UpOworCQkJbm91dmVhdV9mZW5jZV91bnJlZigmZmVuY2UpOworCQl9CisKKwkJaWYgKHJldCkKKwkJCU5WX0VSUk9SKGRldiwgIkZhaWxlZCB0byBpZGxlIGNoYW5uZWwgJWQuXG4iLCBjaGFuLT5pZCk7CisJfQorfQorCiAvKiBjbGVhbnMgdXAgYWxsIHRoZSBmaWZvcyBmcm9tIGZpbGVfcHJpdiAqLwogdm9pZAogbm91dmVhdV9jaGFubmVsX2NsZWFudXAoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYpCiB7CiAJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlzdHJ1Y3Qgbm91dmVhdV9lbmdpbmUgKmVuZ2luZSA9ICZkZXZfcHJpdi0+ZW5naW5lOworCXN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW47CiAJaW50IGk7CiAKIAlOVl9ERUJVRyhkZXYsICJjbGVhcmluZyBGSUZPIGVuYWJsZXMgZnJvbSBmaWxlX3ByaXZcbiIpOwogCWZvciAoaSA9IDA7IGkgPCBlbmdpbmUtPmZpZm8uY2hhbm5lbHM7IGkrKykgewotCQlzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuID0gZGV2X3ByaXYtPmZpZm9zW2ldOworCQljaGFuID0gbm91dmVhdV9jaGFubmVsX2dldChkZXYsIGZpbGVfcHJpdiwgaSk7CisJCWlmIChJU19FUlIoY2hhbikpCisJCQljb250aW51ZTsKIAotCQlpZiAoY2hhbiAmJiBjaGFuLT5maWxlX3ByaXYgPT0gZmlsZV9wcml2KQotCQkJbm91dmVhdV9jaGFubmVsX2ZyZWUoY2hhbik7CisJCWF0b21pY19kZWMoJmNoYW4tPnVzZXJzKTsKKwkJbm91dmVhdV9jaGFubmVsX3B1dCgmY2hhbik7CiAJfQogfQogCi1pbnQKLW5vdXZlYXVfY2hhbm5lbF9vd25lcihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdiwKLQkJICAgICAgaW50IGNoYW5uZWwpCi17Ci0Jc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlzdHJ1Y3Qgbm91dmVhdV9lbmdpbmUgKmVuZ2luZSA9ICZkZXZfcHJpdi0+ZW5naW5lOwotCi0JaWYgKGNoYW5uZWwgPj0gZW5naW5lLT5maWZvLmNoYW5uZWxzKQotCQlyZXR1cm4gMDsKLQlpZiAoZGV2X3ByaXYtPmZpZm9zW2NoYW5uZWxdID09IE5VTEwpCi0JCXJldHVybiAwOwotCi0JcmV0dXJuIChkZXZfcHJpdi0+Zmlmb3NbY2hhbm5lbF0tPmZpbGVfcHJpdiA9PSBmaWxlX3ByaXYpOwotfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIGlvY3RscyB3cmFwcGluZyB0aGUgZnVuY3Rpb25zCkBAIC0zODMsMzYgKzQzNiw0NCBAQAogCWVsc2UKIAkJaW5pdC0+cHVzaGJ1Zl9kb21haW5zID0gTk9VVkVBVV9HRU1fRE9NQUlOX0dBUlQ7CiAKLQlpbml0LT5zdWJjaGFuWzBdLmhhbmRsZSA9IE52TTJNRjsKLQlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA8IE5WXzUwKQotCQlpbml0LT5zdWJjaGFuWzBdLmdyY2xhc3MgPSAweDAwMzk7Ci0JZWxzZQotCQlpbml0LT5zdWJjaGFuWzBdLmdyY2xhc3MgPSAweDUwMzk7Ci0JaW5pdC0+c3ViY2hhblsxXS5oYW5kbGUgPSBOdlN3OwotCWluaXQtPnN1YmNoYW5bMV0uZ3JjbGFzcyA9IE5WX1NXOwotCWluaXQtPm5yX3N1YmNoYW4gPSAyOworCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlIDwgTlZfQzApIHsKKwkJaW5pdC0+c3ViY2hhblswXS5oYW5kbGUgPSBOdk0yTUY7CisJCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlIDwgTlZfNTApCisJCQlpbml0LT5zdWJjaGFuWzBdLmdyY2xhc3MgPSAweDAwMzk7CisJCWVsc2UKKwkJCWluaXQtPnN1YmNoYW5bMF0uZ3JjbGFzcyA9IDB4NTAzOTsKKwkJaW5pdC0+c3ViY2hhblsxXS5oYW5kbGUgPSBOdlN3OworCQlpbml0LT5zdWJjaGFuWzFdLmdyY2xhc3MgPSBOVl9TVzsKKwkJaW5pdC0+bnJfc3ViY2hhbiA9IDI7CisJfSBlbHNlIHsKKwkJaW5pdC0+c3ViY2hhblswXS5oYW5kbGUgID0gMHg5MDM5OworCQlpbml0LT5zdWJjaGFuWzBdLmdyY2xhc3MgPSAweDkwMzk7CisJCWluaXQtPm5yX3N1YmNoYW4gPSAxOworCX0KIAogCS8qIE5hbWVkIG1lbW9yeSBvYmplY3QgYXJlYSAqLwogCXJldCA9IGRybV9nZW1faGFuZGxlX2NyZWF0ZShmaWxlX3ByaXYsIGNoYW4tPm5vdGlmaWVyX2JvLT5nZW0sCiAJCQkJICAgICZpbml0LT5ub3RpZmllcl9oYW5kbGUpOwotCWlmIChyZXQpIHsKLQkJbm91dmVhdV9jaGFubmVsX2ZyZWUoY2hhbik7Ci0JCXJldHVybiByZXQ7Ci0JfQogCi0JcmV0dXJuIDA7CisJaWYgKHJldCA9PSAwKQorCQlhdG9taWNfaW5jKCZjaGFuLT51c2Vycyk7IC8qIHVzZXJzcGFjZSByZWZlcmVuY2UgKi8KKwlub3V2ZWF1X2NoYW5uZWxfcHV0KCZjaGFuKTsKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW50CiBub3V2ZWF1X2lvY3RsX2ZpZm9fZnJlZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB2b2lkICpkYXRhLAogCQkJc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYpCiB7Ci0Jc3RydWN0IGRybV9ub3V2ZWF1X2NoYW5uZWxfZnJlZSAqY2ZyZWUgPSBkYXRhOworCXN0cnVjdCBkcm1fbm91dmVhdV9jaGFubmVsX2ZyZWUgKnJlcSA9IGRhdGE7CiAJc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbjsKIAotCU5PVVZFQVVfR0VUX1VTRVJfQ0hBTk5FTF9XSVRIX1JFVFVSTihjZnJlZS0+Y2hhbm5lbCwgZmlsZV9wcml2LCBjaGFuKTsKKwljaGFuID0gbm91dmVhdV9jaGFubmVsX2dldChkZXYsIGZpbGVfcHJpdiwgcmVxLT5jaGFubmVsKTsKKwlpZiAoSVNfRVJSKGNoYW4pKQorCQlyZXR1cm4gUFRSX0VSUihjaGFuKTsKIAotCW5vdXZlYXVfY2hhbm5lbF9mcmVlKGNoYW4pOworCWF0b21pY19kZWMoJmNoYW4tPnVzZXJzKTsKKwlub3V2ZWF1X2NoYW5uZWxfcHV0KCZjaGFuKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNDIxLDE4ICs0ODIsMTggQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogc3RydWN0IGRybV9pb2N0bF9kZXNjIG5vdXZlYXVfaW9jdGxzW10gPSB7Ci0JRFJNX0lPQ1RMX0RFRl9EUlYoTk9VVkVBVV9HRVRQQVJBTSwgbm91dmVhdV9pb2N0bF9nZXRwYXJhbSwgRFJNX0FVVEgpLAotCURSTV9JT0NUTF9ERUZfRFJWKE5PVVZFQVVfU0VUUEFSQU0sIG5vdXZlYXVfaW9jdGxfc2V0cGFyYW0sIERSTV9BVVRIfERSTV9NQVNURVJ8RFJNX1JPT1RfT05MWSksCi0JRFJNX0lPQ1RMX0RFRl9EUlYoTk9VVkVBVV9DSEFOTkVMX0FMTE9DLCBub3V2ZWF1X2lvY3RsX2ZpZm9fYWxsb2MsIERSTV9BVVRIKSwKLQlEUk1fSU9DVExfREVGX0RSVihOT1VWRUFVX0NIQU5ORUxfRlJFRSwgbm91dmVhdV9pb2N0bF9maWZvX2ZyZWUsIERSTV9BVVRIKSwKLQlEUk1fSU9DVExfREVGX0RSVihOT1VWRUFVX0dST0JKX0FMTE9DLCBub3V2ZWF1X2lvY3RsX2dyb2JqX2FsbG9jLCBEUk1fQVVUSCksCi0JRFJNX0lPQ1RMX0RFRl9EUlYoTk9VVkVBVV9OT1RJRklFUk9CSl9BTExPQywgbm91dmVhdV9pb2N0bF9ub3RpZmllcl9hbGxvYywgRFJNX0FVVEgpLAotCURSTV9JT0NUTF9ERUZfRFJWKE5PVVZFQVVfR1BVT0JKX0ZSRUUsIG5vdXZlYXVfaW9jdGxfZ3B1b2JqX2ZyZWUsIERSTV9BVVRIKSwKLQlEUk1fSU9DVExfREVGX0RSVihOT1VWRUFVX0dFTV9ORVcsIG5vdXZlYXVfZ2VtX2lvY3RsX25ldywgRFJNX0FVVEgpLAotCURSTV9JT0NUTF9ERUZfRFJWKE5PVVZFQVVfR0VNX1BVU0hCVUYsIG5vdXZlYXVfZ2VtX2lvY3RsX3B1c2hidWYsIERSTV9BVVRIKSwKLQlEUk1fSU9DVExfREVGX0RSVihOT1VWRUFVX0dFTV9DUFVfUFJFUCwgbm91dmVhdV9nZW1faW9jdGxfY3B1X3ByZXAsIERSTV9BVVRIKSwKLQlEUk1fSU9DVExfREVGX0RSVihOT1VWRUFVX0dFTV9DUFVfRklOSSwgbm91dmVhdV9nZW1faW9jdGxfY3B1X2ZpbmksIERSTV9BVVRIKSwKLQlEUk1fSU9DVExfREVGX0RSVihOT1VWRUFVX0dFTV9JTkZPLCBub3V2ZWF1X2dlbV9pb2N0bF9pbmZvLCBEUk1fQVVUSCksCisJRFJNX0lPQ1RMX0RFRl9EUlYoTk9VVkVBVV9HRVRQQVJBTSwgbm91dmVhdV9pb2N0bF9nZXRwYXJhbSwgRFJNX1VOTE9DS0VEfERSTV9BVVRIKSwKKwlEUk1fSU9DVExfREVGX0RSVihOT1VWRUFVX1NFVFBBUkFNLCBub3V2ZWF1X2lvY3RsX3NldHBhcmFtLCBEUk1fVU5MT0NLRUR8RFJNX0FVVEh8RFJNX01BU1RFUnxEUk1fUk9PVF9PTkxZKSwKKwlEUk1fSU9DVExfREVGX0RSVihOT1VWRUFVX0NIQU5ORUxfQUxMT0MsIG5vdXZlYXVfaW9jdGxfZmlmb19hbGxvYywgRFJNX1VOTE9DS0VEfERSTV9BVVRIKSwKKwlEUk1fSU9DVExfREVGX0RSVihOT1VWRUFVX0NIQU5ORUxfRlJFRSwgbm91dmVhdV9pb2N0bF9maWZvX2ZyZWUsIERSTV9VTkxPQ0tFRHxEUk1fQVVUSCksCisJRFJNX0lPQ1RMX0RFRl9EUlYoTk9VVkVBVV9HUk9CSl9BTExPQywgbm91dmVhdV9pb2N0bF9ncm9ial9hbGxvYywgRFJNX1VOTE9DS0VEfERSTV9BVVRIKSwKKwlEUk1fSU9DVExfREVGX0RSVihOT1VWRUFVX05PVElGSUVST0JKX0FMTE9DLCBub3V2ZWF1X2lvY3RsX25vdGlmaWVyX2FsbG9jLCBEUk1fVU5MT0NLRUR8RFJNX0FVVEgpLAorCURSTV9JT0NUTF9ERUZfRFJWKE5PVVZFQVVfR1BVT0JKX0ZSRUUsIG5vdXZlYXVfaW9jdGxfZ3B1b2JqX2ZyZWUsIERSTV9VTkxPQ0tFRHxEUk1fQVVUSCksCisJRFJNX0lPQ1RMX0RFRl9EUlYoTk9VVkVBVV9HRU1fTkVXLCBub3V2ZWF1X2dlbV9pb2N0bF9uZXcsIERSTV9VTkxPQ0tFRHxEUk1fQVVUSCksCisJRFJNX0lPQ1RMX0RFRl9EUlYoTk9VVkVBVV9HRU1fUFVTSEJVRiwgbm91dmVhdV9nZW1faW9jdGxfcHVzaGJ1ZiwgRFJNX1VOTE9DS0VEfERSTV9BVVRIKSwKKwlEUk1fSU9DVExfREVGX0RSVihOT1VWRUFVX0dFTV9DUFVfUFJFUCwgbm91dmVhdV9nZW1faW9jdGxfY3B1X3ByZXAsIERSTV9VTkxPQ0tFRHxEUk1fQVVUSCksCisJRFJNX0lPQ1RMX0RFRl9EUlYoTk9VVkVBVV9HRU1fQ1BVX0ZJTkksIG5vdXZlYXVfZ2VtX2lvY3RsX2NwdV9maW5pLCBEUk1fVU5MT0NLRUR8RFJNX0FVVEgpLAorCURSTV9JT0NUTF9ERUZfRFJWKE5PVVZFQVVfR0VNX0lORk8sIG5vdXZlYXVfZ2VtX2lvY3RsX2luZm8sIERSTV9VTkxPQ0tFRHxEUk1fQVVUSCksCiB9OwogCiBpbnQgbm91dmVhdV9tYXhfaW9jdGwgPSBEUk1fQVJSQVlfU0laRShub3V2ZWF1X2lvY3Rscyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2Nvbm5lY3Rvci5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9jb25uZWN0b3IuYwppbmRleCA1MmMzNTZlLi5hMjFlMDAwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2Nvbm5lY3Rvci5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfY29ubmVjdG9yLmMKQEAgLTM3LDYgKzM3LDggQEAKICNpbmNsdWRlICJub3V2ZWF1X2Nvbm5lY3Rvci5oIgogI2luY2x1ZGUgIm5vdXZlYXVfaHcuaCIKIAorc3RhdGljIHZvaWQgbm91dmVhdV9jb25uZWN0b3JfaG90cGx1Zyh2b2lkICosIGludCk7CisKIHN0YXRpYyBzdHJ1Y3Qgbm91dmVhdV9lbmNvZGVyICoKIGZpbmRfZW5jb2Rlcl9ieV90eXBlKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IsIGludCB0eXBlKQogewpAQCAtOTQsMjIgKzk2LDMwIEBACiB9CiAKIHN0YXRpYyB2b2lkCi1ub3V2ZWF1X2Nvbm5lY3Rvcl9kZXN0cm95KHN0cnVjdCBkcm1fY29ubmVjdG9yICpkcm1fY29ubmVjdG9yKQorbm91dmVhdV9jb25uZWN0b3JfZGVzdHJveShzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yKQogewotCXN0cnVjdCBub3V2ZWF1X2Nvbm5lY3RvciAqbnZfY29ubmVjdG9yID0KLQkJbm91dmVhdV9jb25uZWN0b3IoZHJtX2Nvbm5lY3Rvcik7CisJc3RydWN0IG5vdXZlYXVfY29ubmVjdG9yICpudl9jb25uZWN0b3IgPSBub3V2ZWF1X2Nvbm5lY3Rvcihjb25uZWN0b3IpOworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdjsKKwlzdHJ1Y3Qgbm91dmVhdV9ncGlvX2VuZ2luZSAqcGdwaW87CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldjsKIAogCWlmICghbnZfY29ubmVjdG9yKQogCQlyZXR1cm47CiAKIAlkZXYgPSBudl9jb25uZWN0b3ItPmJhc2UuZGV2OworCWRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlOVl9ERUJVR19LTVMoZGV2LCAiXG4iKTsKIAorCXBncGlvID0gJmRldl9wcml2LT5lbmdpbmUuZ3BpbzsKKwlpZiAocGdwaW8tPmlycV91bnJlZ2lzdGVyKSB7CisJCXBncGlvLT5pcnFfdW5yZWdpc3RlcihkZXYsIG52X2Nvbm5lY3Rvci0+ZGNiLT5ncGlvX3RhZywKKwkJCQkgICAgICBub3V2ZWF1X2Nvbm5lY3Rvcl9ob3RwbHVnLCBjb25uZWN0b3IpOworCX0KKwogCWtmcmVlKG52X2Nvbm5lY3Rvci0+ZWRpZCk7Ci0JZHJtX3N5c2ZzX2Nvbm5lY3Rvcl9yZW1vdmUoZHJtX2Nvbm5lY3Rvcik7Ci0JZHJtX2Nvbm5lY3Rvcl9jbGVhbnVwKGRybV9jb25uZWN0b3IpOwotCWtmcmVlKGRybV9jb25uZWN0b3IpOworCWRybV9zeXNmc19jb25uZWN0b3JfcmVtb3ZlKGNvbm5lY3Rvcik7CisJZHJtX2Nvbm5lY3Rvcl9jbGVhbnVwKGNvbm5lY3Rvcik7CisJa2ZyZWUoY29ubmVjdG9yKTsKIH0KIAogc3RhdGljIHN0cnVjdCBub3V2ZWF1X2kyY19jaGFuICoKQEAgLTc2MCw2ICs3NzAsNyBAQAogewogCWNvbnN0IHN0cnVjdCBkcm1fY29ubmVjdG9yX2Z1bmNzICpmdW5jcyA9ICZub3V2ZWF1X2Nvbm5lY3Rvcl9mdW5jczsKIAlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBub3V2ZWF1X2dwaW9fZW5naW5lICpwZ3BpbyA9ICZkZXZfcHJpdi0+ZW5naW5lLmdwaW87CiAJc3RydWN0IG5vdXZlYXVfY29ubmVjdG9yICpudl9jb25uZWN0b3IgPSBOVUxMOwogCXN0cnVjdCBkY2JfY29ubmVjdG9yX3RhYmxlX2VudHJ5ICpkY2IgPSBOVUxMOwogCXN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3I7CkBAIC04NzYsNiArODg3LDExIEBACiAJCWJyZWFrOwogCX0KIAorCWlmIChwZ3Bpby0+aXJxX3JlZ2lzdGVyKSB7CisJCXBncGlvLT5pcnFfcmVnaXN0ZXIoZGV2LCBudl9jb25uZWN0b3ItPmRjYi0+Z3Bpb190YWcsCisJCQkJICAgIG5vdXZlYXVfY29ubmVjdG9yX2hvdHBsdWcsIGNvbm5lY3Rvcik7CisJfQorCiAJZHJtX3N5c2ZzX2Nvbm5lY3Rvcl9hZGQoY29ubmVjdG9yKTsKIAlkY2ItPmRybSA9IGNvbm5lY3RvcjsKIAlyZXR1cm4gZGNiLT5kcm07CkBAIC04ODYsMyArOTAyLDI5IEBACiAJcmV0dXJuIEVSUl9QVFIocmV0KTsKIAogfQorCitzdGF0aWMgdm9pZAorbm91dmVhdV9jb25uZWN0b3JfaG90cGx1Zyh2b2lkICpkYXRhLCBpbnQgcGx1Z2dlZCkKK3sKKwlzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yID0gZGF0YTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY29ubmVjdG9yLT5kZXY7CisKKwlOVl9JTkZPKGRldiwgIiVzcGx1Z2dlZCAlc1xuIiwgcGx1Z2dlZCA/ICIiIDogInVuIiwKKwkJZHJtX2dldF9jb25uZWN0b3JfbmFtZShjb25uZWN0b3IpKTsKKworCWlmIChjb25uZWN0b3ItPmVuY29kZXIgJiYgY29ubmVjdG9yLT5lbmNvZGVyLT5jcnRjICYmCisJICAgIGNvbm5lY3Rvci0+ZW5jb2Rlci0+Y3J0Yy0+ZW5hYmxlZCkgeworCQlzdHJ1Y3Qgbm91dmVhdV9lbmNvZGVyICpudl9lbmNvZGVyID0gbm91dmVhdV9lbmNvZGVyKGNvbm5lY3Rvci0+ZW5jb2Rlcik7CisJCXN0cnVjdCBkcm1fZW5jb2Rlcl9oZWxwZXJfZnVuY3MgKmhlbHBlciA9CisJCQljb25uZWN0b3ItPmVuY29kZXItPmhlbHBlcl9wcml2YXRlOworCisJCWlmIChudl9lbmNvZGVyLT5kY2ItPnR5cGUgPT0gT1VUUFVUX0RQKSB7CisJCQlpZiAocGx1Z2dlZCkKKwkJCQloZWxwZXItPmRwbXMoY29ubmVjdG9yLT5lbmNvZGVyLCBEUk1fTU9ERV9EUE1TX09OKTsKKwkJCWVsc2UKKwkJCQloZWxwZXItPmRwbXMoY29ubmVjdG9yLT5lbmNvZGVyLCBEUk1fTU9ERV9EUE1TX09GRik7CisJCX0KKwl9CisKKwlkcm1faGVscGVyX2hwZF9pcnFfZXZlbnQoZGV2KTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfZGlzcGxheS5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9kaXNwbGF5LmMKaW5kZXggMmUxMWZkNi4uNTA1YzZiZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9kaXNwbGF5LmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9kaXNwbGF5LmMKQEAgLTI5LDYgKzI5LDkgQEAKICNpbmNsdWRlICJub3V2ZWF1X2Rydi5oIgogI2luY2x1ZGUgIm5vdXZlYXVfZmIuaCIKICNpbmNsdWRlICJub3V2ZWF1X2ZiY29uLmgiCisjaW5jbHVkZSAibm91dmVhdV9ody5oIgorI2luY2x1ZGUgIm5vdXZlYXVfY3J0Yy5oIgorI2luY2x1ZGUgIm5vdXZlYXVfZG1hLmgiCiAKIHN0YXRpYyB2b2lkCiBub3V2ZWF1X3VzZXJfZnJhbWVidWZmZXJfZGVzdHJveShzdHJ1Y3QgZHJtX2ZyYW1lYnVmZmVyICpkcm1fZmIpCkBAIC0xMDQsMyArMTA3LDIwNyBAQAogCS5vdXRwdXRfcG9sbF9jaGFuZ2VkID0gbm91dmVhdV9mYmNvbl9vdXRwdXRfcG9sbF9jaGFuZ2VkLAogfTsKIAoraW50Citub3V2ZWF1X3ZibGFua19lbmFibGUoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGNydGMpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKworCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlID49IE5WXzUwKQorCQludl9tYXNrKGRldiwgTlY1MF9QRElTUExBWV9JTlRSX0VOXzEsIDAsCisJCQlOVjUwX1BESVNQTEFZX0lOVFJfRU5fMV9WQkxBTktfQ1JUQ18oY3J0YykpOworCWVsc2UKKwkJTlZXcml0ZUNSVEMoZGV2LCBjcnRjLCBOVl9QQ1JUQ19JTlRSX0VOXzAsCisJCQkgICAgTlZfUENSVENfSU5UUl8wX1ZCTEFOSyk7CisKKwlyZXR1cm4gMDsKK30KKwordm9pZAorbm91dmVhdV92YmxhbmtfZGlzYWJsZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgY3J0YykKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCisJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPj0gTlZfNTApCisJCW52X21hc2soZGV2LCBOVjUwX1BESVNQTEFZX0lOVFJfRU5fMSwKKwkJCU5WNTBfUERJU1BMQVlfSU5UUl9FTl8xX1ZCTEFOS19DUlRDXyhjcnRjKSwgMCk7CisJZWxzZQorCQlOVldyaXRlQ1JUQyhkZXYsIGNydGMsIE5WX1BDUlRDX0lOVFJfRU5fMCwgMCk7Cit9CisKK3N0YXRpYyBpbnQKK25vdXZlYXVfcGFnZV9mbGlwX3Jlc2VydmUoc3RydWN0IG5vdXZlYXVfYm8gKm9sZF9ibywKKwkJCSAgc3RydWN0IG5vdXZlYXVfYm8gKm5ld19ibykKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gbm91dmVhdV9ib19waW4obmV3X2JvLCBUVE1fUExfRkxBR19WUkFNKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gdHRtX2JvX3Jlc2VydmUoJm5ld19iby0+Ym8sIGZhbHNlLCBmYWxzZSwgZmFsc2UsIDApOworCWlmIChyZXQpCisJCWdvdG8gZmFpbDsKKworCXJldCA9IHR0bV9ib19yZXNlcnZlKCZvbGRfYm8tPmJvLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCAwKTsKKwlpZiAocmV0KQorCQlnb3RvIGZhaWxfdW5yZXNlcnZlOworCisJcmV0dXJuIDA7CisKK2ZhaWxfdW5yZXNlcnZlOgorCXR0bV9ib191bnJlc2VydmUoJm5ld19iby0+Ym8pOworZmFpbDoKKwlub3V2ZWF1X2JvX3VucGluKG5ld19ibyk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQKK25vdXZlYXVfcGFnZV9mbGlwX3VucmVzZXJ2ZShzdHJ1Y3Qgbm91dmVhdV9ibyAqb2xkX2JvLAorCQkJICAgIHN0cnVjdCBub3V2ZWF1X2JvICpuZXdfYm8sCisJCQkgICAgc3RydWN0IG5vdXZlYXVfZmVuY2UgKmZlbmNlKQoreworCW5vdXZlYXVfYm9fZmVuY2UobmV3X2JvLCBmZW5jZSk7CisJdHRtX2JvX3VucmVzZXJ2ZSgmbmV3X2JvLT5ibyk7CisKKwlub3V2ZWF1X2JvX2ZlbmNlKG9sZF9ibywgZmVuY2UpOworCXR0bV9ib191bnJlc2VydmUoJm9sZF9iby0+Ym8pOworCisJbm91dmVhdV9ib191bnBpbihvbGRfYm8pOworfQorCitzdGF0aWMgaW50Citub3V2ZWF1X3BhZ2VfZmxpcF9lbWl0KHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4sCisJCSAgICAgICBzdHJ1Y3Qgbm91dmVhdV9ibyAqb2xkX2JvLAorCQkgICAgICAgc3RydWN0IG5vdXZlYXVfYm8gKm5ld19ibywKKwkJICAgICAgIHN0cnVjdCBub3V2ZWF1X3BhZ2VfZmxpcF9zdGF0ZSAqcywKKwkJICAgICAgIHN0cnVjdCBub3V2ZWF1X2ZlbmNlICoqcGZlbmNlKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjaGFuLT5kZXY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0OworCisJLyogUXVldWUgaXQgdG8gdGhlIHBlbmRpbmcgbGlzdCAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPmV2ZW50X2xvY2ssIGZsYWdzKTsKKwlsaXN0X2FkZF90YWlsKCZzLT5oZWFkLCAmY2hhbi0+bnZzdy5mbGlwKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPmV2ZW50X2xvY2ssIGZsYWdzKTsKKworCS8qIFN5bmNocm9uaXplIHdpdGggdGhlIG9sZCBmcmFtZWJ1ZmZlciAqLworCXJldCA9IG5vdXZlYXVfZmVuY2Vfc3luYyhvbGRfYm8tPmJvLnN5bmNfb2JqLCBjaGFuKTsKKwlpZiAocmV0KQorCQlnb3RvIGZhaWw7CisKKwkvKiBFbWl0IHRoZSBwYWdlZmxpcCAqLworCXJldCA9IFJJTkdfU1BBQ0UoY2hhbiwgMik7CisJaWYgKHJldCkKKwkJZ290byBmYWlsOworCisJQkVHSU5fUklORyhjaGFuLCBOdlN1YlN3LCBOVl9TV19QQUdFX0ZMSVAsIDEpOworCU9VVF9SSU5HKGNoYW4sIDApOworCUZJUkVfUklORyhjaGFuKTsKKworCXJldCA9IG5vdXZlYXVfZmVuY2VfbmV3KGNoYW4sIHBmZW5jZSwgdHJ1ZSk7CisJaWYgKHJldCkKKwkJZ290byBmYWlsOworCisJcmV0dXJuIDA7CitmYWlsOgorCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPmV2ZW50X2xvY2ssIGZsYWdzKTsKKwlsaXN0X2RlbCgmcy0+aGVhZCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5ldmVudF9sb2NrLCBmbGFncyk7CisJcmV0dXJuIHJldDsKK30KKworaW50Citub3V2ZWF1X2NydGNfcGFnZV9mbGlwKHN0cnVjdCBkcm1fY3J0YyAqY3J0Yywgc3RydWN0IGRybV9mcmFtZWJ1ZmZlciAqZmIsCisJCSAgICAgICBzdHJ1Y3QgZHJtX3BlbmRpbmdfdmJsYW5rX2V2ZW50ICpldmVudCkKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY3J0Yy0+ZGV2OworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG5vdXZlYXVfYm8gKm9sZF9ibyA9IG5vdXZlYXVfZnJhbWVidWZmZXIoY3J0Yy0+ZmIpLT5udmJvOworCXN0cnVjdCBub3V2ZWF1X2JvICpuZXdfYm8gPSBub3V2ZWF1X2ZyYW1lYnVmZmVyKGZiKS0+bnZibzsKKwlzdHJ1Y3Qgbm91dmVhdV9wYWdlX2ZsaXBfc3RhdGUgKnM7CisJc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbjsKKwlzdHJ1Y3Qgbm91dmVhdV9mZW5jZSAqZmVuY2U7CisJaW50IHJldDsKKworCWlmIChkZXZfcHJpdi0+ZW5naW5lLmdyYXBoLmFjY2VsX2Jsb2NrZWQpCisJCXJldHVybiAtRU5PREVWOworCisJcyA9IGt6YWxsb2Moc2l6ZW9mKCpzKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzKQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qIERvbid0IGxldCB0aGUgYnVmZmVycyBnbyBhd2F5IHdoaWxlIHdlIGZsaXAgKi8KKwlyZXQgPSBub3V2ZWF1X3BhZ2VfZmxpcF9yZXNlcnZlKG9sZF9ibywgbmV3X2JvKTsKKwlpZiAocmV0KQorCQlnb3RvIGZhaWxfZnJlZTsKKworCS8qIEluaXRpYWxpemUgYSBwYWdlIGZsaXAgc3RydWN0ICovCisJKnMgPSAoc3RydWN0IG5vdXZlYXVfcGFnZV9mbGlwX3N0YXRlKQorCQl7IHsgfSwgcy0+ZXZlbnQsIG5vdXZlYXVfY3J0YyhjcnRjKS0+aW5kZXgsCisJCSAgZmItPmJpdHNfcGVyX3BpeGVsLCBmYi0+cGl0Y2gsIGNydGMtPngsIGNydGMtPnksCisJCSAgbmV3X2JvLT5iby5vZmZzZXQgfTsKKworCS8qIENob29zZSB0aGUgY2hhbm5lbCB0aGUgZmxpcCB3aWxsIGJlIGhhbmRsZWQgaW4gKi8KKwljaGFuID0gbm91dmVhdV9mZW5jZV9jaGFubmVsKG5ld19iby0+Ym8uc3luY19vYmopOworCWlmICghY2hhbikKKwkJY2hhbiA9IG5vdXZlYXVfY2hhbm5lbF9nZXRfdW5sb2NrZWQoZGV2X3ByaXYtPmNoYW5uZWwpOworCW11dGV4X2xvY2soJmNoYW4tPm11dGV4KTsKKworCS8qIEVtaXQgYSBwYWdlIGZsaXAgKi8KKwlyZXQgPSBub3V2ZWF1X3BhZ2VfZmxpcF9lbWl0KGNoYW4sIG9sZF9ibywgbmV3X2JvLCBzLCAmZmVuY2UpOworCW5vdXZlYXVfY2hhbm5lbF9wdXQoJmNoYW4pOworCWlmIChyZXQpCisJCWdvdG8gZmFpbF91bnJlc2VydmU7CisKKwkvKiBVcGRhdGUgdGhlIGNydGMgc3RydWN0IGFuZCBjbGVhbnVwICovCisJY3J0Yy0+ZmIgPSBmYjsKKworCW5vdXZlYXVfcGFnZV9mbGlwX3VucmVzZXJ2ZShvbGRfYm8sIG5ld19ibywgZmVuY2UpOworCW5vdXZlYXVfZmVuY2VfdW5yZWYoJmZlbmNlKTsKKwlyZXR1cm4gMDsKKworZmFpbF91bnJlc2VydmU6CisJbm91dmVhdV9wYWdlX2ZsaXBfdW5yZXNlcnZlKG9sZF9ibywgbmV3X2JvLCBOVUxMKTsKK2ZhaWxfZnJlZToKKwlrZnJlZShzKTsKKwlyZXR1cm4gcmV0OworfQorCitpbnQKK25vdXZlYXVfZmluaXNoX3BhZ2VfZmxpcChzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuLAorCQkJIHN0cnVjdCBub3V2ZWF1X3BhZ2VfZmxpcF9zdGF0ZSAqcHMpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNoYW4tPmRldjsKKwlzdHJ1Y3Qgbm91dmVhdV9wYWdlX2ZsaXBfc3RhdGUgKnM7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPmV2ZW50X2xvY2ssIGZsYWdzKTsKKworCWlmIChsaXN0X2VtcHR5KCZjaGFuLT5udnN3LmZsaXApKSB7CisJCU5WX0VSUk9SKGRldiwgIlVuZXhwZWN0ZWQgcGFnZWZsaXAgaW4gY2hhbm5lbCAlZC5cbiIsIGNoYW4tPmlkKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5ldmVudF9sb2NrLCBmbGFncyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXMgPSBsaXN0X2ZpcnN0X2VudHJ5KCZjaGFuLT5udnN3LmZsaXAsCisJCQkgICAgIHN0cnVjdCBub3V2ZWF1X3BhZ2VfZmxpcF9zdGF0ZSwgaGVhZCk7CisJaWYgKHMtPmV2ZW50KSB7CisJCXN0cnVjdCBkcm1fcGVuZGluZ192YmxhbmtfZXZlbnQgKmUgPSBzLT5ldmVudDsKKwkJc3RydWN0IHRpbWV2YWwgbm93OworCisJCWRvX2dldHRpbWVvZmRheSgmbm93KTsKKwkJZS0+ZXZlbnQuc2VxdWVuY2UgPSAwOworCQllLT5ldmVudC50dl9zZWMgPSBub3cudHZfc2VjOworCQllLT5ldmVudC50dl91c2VjID0gbm93LnR2X3VzZWM7CisJCWxpc3RfYWRkX3RhaWwoJmUtPmJhc2UubGluaywgJmUtPmJhc2UuZmlsZV9wcml2LT5ldmVudF9saXN0KTsKKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZlLT5iYXNlLmZpbGVfcHJpdi0+ZXZlbnRfd2FpdCk7CisJfQorCisJbGlzdF9kZWwoJnMtPmhlYWQpOworCSpwcyA9ICpzOworCWtmcmVlKHMpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5ldmVudF9sb2NrLCBmbGFncyk7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2RtYS5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9kbWEuYwppbmRleCA4MjU4MWU2Li42NTY5OWJmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2RtYS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfZG1hLmMKQEAgLTM2LDcgKzM2LDcgQEAKIAlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBjaGFuLT5kZXYtPmRldl9wcml2YXRlOwogCXN0cnVjdCBub3V2ZWF1X2JvICpwdXNoYnVmID0gY2hhbi0+cHVzaGJ1Zl9ibzsKIAotCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlID09IE5WXzUwKSB7CisJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPj0gTlZfNTApIHsKIAkJY29uc3QgaW50IGliX3NpemUgPSBwdXNoYnVmLT5iby5tZW0uc2l6ZSAvIDI7CiAKIAkJY2hhbi0+ZG1hLmliX2Jhc2UgPSAocHVzaGJ1Zi0+Ym8ubWVtLnNpemUgLSBpYl9zaXplKSA+PiAyOwpAQCAtNTksMTcgKzU5LDI2IEBACiB7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNoYW4tPmRldjsKIAlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCXN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqb2JqID0gTlVMTDsKIAlpbnQgcmV0LCBpOwogCi0JLyogQ3JlYXRlIE5WX01FTU9SWV9UT19NRU1PUllfRk9STUFUIGZvciBidWZmZXIgbW92ZXMgKi8KLQlyZXQgPSBub3V2ZWF1X2dwdW9ial9ncl9uZXcoY2hhbiwgZGV2X3ByaXYtPmNhcmRfdHlwZSA8IE5WXzUwID8KLQkJCQkgICAgMHgwMDM5IDogMHg1MDM5LCAmb2JqKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OworCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlID49IE5WX0MwKSB7CisJCXJldCA9IG5vdXZlYXVfZ3B1b2JqX2dyX25ldyhjaGFuLCAweDkwMzksIDB4OTAzOSk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OwogCi0JcmV0ID0gbm91dmVhdV9yYW1odF9pbnNlcnQoY2hhbiwgTnZNMk1GLCBvYmopOwotCW5vdXZlYXVfZ3B1b2JqX3JlZihOVUxMLCAmb2JqKTsKKwkJcmV0ID0gUklOR19TUEFDRShjaGFuLCAyKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisKKwkJQkVHSU5fTlZDMChjaGFuLCAyLCBOdlN1Yk0yTUYsIDB4MDAwMCwgMSk7CisJCU9VVF9SSU5HICAoY2hhbiwgMHgwMDAwOTAzOSk7CisJCUZJUkVfUklORyAoY2hhbik7CisJCXJldHVybiAwOworCX0KKworCS8qIENyZWF0ZSBOVl9NRU1PUllfVE9fTUVNT1JZX0ZPUk1BVCBmb3IgYnVmZmVyIG1vdmVzICovCisJcmV0ID0gbm91dmVhdV9ncHVvYmpfZ3JfbmV3KGNoYW4sIE52TTJNRiwgZGV2X3ByaXYtPmNhcmRfdHlwZSA8IE5WXzUwID8KKwkJCQkgICAgMHgwMDM5IDogMHg1MDM5KTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCkBAIC03OCwxMSArODcsNiBAQAogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKLQkvKiBNYXAgcHVzaCBidWZmZXIgKi8KLQlyZXQgPSBub3V2ZWF1X2JvX21hcChjaGFuLT5wdXNoYnVmX2JvKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCiAJLyogSW5zZXJ0IE5PUFMgZm9yIE5PVVZFQVVfRE1BX1NLSVBTICovCiAJcmV0ID0gUklOR19TUEFDRShjaGFuLCBOT1VWRUFVX0RNQV9TS0lQUyk7CiAJaWYgKHJldCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfZG1hLmggYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2RtYS5oCmluZGV4IGQ1NzhjMjEuLmMzNmYxNzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfZG1hLmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9kbWEuaApAQCAtNzcsNyArNzcsOCBAQAogCS8qIEc4MCsgZGlzcGxheSBvYmplY3RzICovCiAJTnZFdm9WUkFNCT0gMHgwMTAwMDAwMCwKIAlOdkV2b0ZCMTYJPSAweDAxMDAwMDAxLAotCU52RXZvRkIzMgk9IDB4MDEwMDAwMDIKKwlOdkV2b0ZCMzIJPSAweDAxMDAwMDAyLAorCU52RXZvVlJBTV9MUAk9IDB4MDEwMDAwMDMKIH07CiAKICNkZWZpbmUgTlZfTUVNT1JZX1RPX01FTU9SWV9GT1JNQVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDM5CkBAIC0xMjUsNiArMTI2LDEyIEBACiBPVVRfUklOR3Aoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbiwgY29uc3Qgdm9pZCAqZGF0YSwgdW5zaWduZWQgbnJfZHdvcmRzKTsKIAogc3RhdGljIGlubGluZSB2b2lkCitCRUdJTl9OVkMwKHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4sIGludCBvcCwgaW50IHN1YmMsIGludCBtdGhkLCBpbnQgc2l6ZSkKK3sKKwlPVVRfUklORyhjaGFuLCAob3AgPDwgMjgpIHwgKHNpemUgPDwgMTYpIHwgKHN1YmMgPDwgMTMpIHwgKG10aGQgPj4gMikpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKIEJFR0lOX1JJTkcoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbiwgaW50IHN1YmMsIGludCBtdGhkLCBpbnQgc2l6ZSkKIHsKIAlPVVRfUklORyhjaGFuLCAoc3ViYyA8PCAxMykgfCAoc2l6ZSA8PCAxOCkgfCBtdGhkKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfZHAuYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfZHAuYwppbmRleCA0NTYyZjMwLi4zOGQ1OTk1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2RwLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9kcC5jCkBAIC0yNzksNyArMjc5LDcgQEAKIAlzdHJ1Y3QgYml0X2Rpc3BsYXlwb3J0X2VuY29kZXJfdGFibGUgKmRwZTsKIAlpbnQgZHBlX2hlYWRlcmxlbjsKIAl1aW50OF90IGNvbmZpZ1s0XSwgc3RhdHVzWzNdOwotCWJvb2wgY3JfZG9uZSwgY3JfbWF4X3ZzLCBlcV9kb25lOworCWJvb2wgY3JfZG9uZSwgY3JfbWF4X3ZzLCBlcV9kb25lLCBocGRfc3RhdGU7CiAJaW50IHJldCA9IDAsIGksIHRyaWVzLCB2b2x0YWdlOwogCiAJTlZfREVCVUdfS01TKGRldiwgImxpbmsgdHJhaW5pbmchIVxuIik7CkBAIC0yOTcsNyArMjk3LDcgQEAKIAkvKiBkaXNhYmxlIGhvdHBsdWcgZGV0ZWN0LCB0aGlzIGZsaXBzIGFyb3VuZCBvbiBzb21lIHBhbmVscyBkdXJpbmcKIAkgKiBsaW5rIHRyYWluaW5nLgogCSAqLwotCXBncGlvLT5pcnFfZW5hYmxlKGRldiwgbnZfY29ubmVjdG9yLT5kY2ItPmdwaW9fdGFnLCBmYWxzZSk7CisJaHBkX3N0YXRlID0gcGdwaW8tPmlycV9lbmFibGUoZGV2LCBudl9jb25uZWN0b3ItPmRjYi0+Z3Bpb190YWcsIGZhbHNlKTsKIAogCWlmIChkcGUtPnNjcmlwdDApIHsKIAkJTlZfREVCVUdfS01TKGRldiwgIlNPUi0lZDogcnVubmluZyBEUCBzY3JpcHQgMFxuIiwgbnZfZW5jb2Rlci0+b3IpOwpAQCAtNDM5LDcgKzQzOSw3IEBACiAJfQogCiAJLyogcmUtZW5hYmxlIGhvdHBsdWcgZGV0ZWN0ICovCi0JcGdwaW8tPmlycV9lbmFibGUoZGV2LCBudl9jb25uZWN0b3ItPmRjYi0+Z3Bpb190YWcsIHRydWUpOworCXBncGlvLT5pcnFfZW5hYmxlKGRldiwgbnZfY29ubmVjdG9yLT5kY2ItPmdwaW9fdGFnLCBocGRfc3RhdGUpOwogCiAJcmV0dXJuIGVxX2RvbmU7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2Rydi5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9kcnYuYwppbmRleCA5MDg3NTQ5Li4xM2JiNjcyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2Rydi5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfZHJ2LmMKQEAgLTExNSw2ICsxMTUsMTAgQEAKIGludCBub3V2ZWF1X3BlcmZsdmxfd3I7CiBtb2R1bGVfcGFyYW1fbmFtZWQocGVyZmx2bF93ciwgbm91dmVhdV9wZXJmbHZsX3dyLCBpbnQsIDA0MDApOwogCitNT0RVTEVfUEFSTV9ERVNDKG1zaSwgIkVuYWJsZSBNU0kgKGRlZmF1bHQ6IG9mZilcbiIpOworaW50IG5vdXZlYXVfbXNpOworbW9kdWxlX3BhcmFtX25hbWVkKG1zaSwgbm91dmVhdV9tc2ksIGludCwgMDQwMCk7CisKIGludCBub3V2ZWF1X2ZicGVyY3J0YzsKICNpZiAwCiBtb2R1bGVfcGFyYW1fbmFtZWQoZmJwZXJjcnRjLCBub3V2ZWF1X2ZicGVyY3J0YywgaW50LCAwNDAwKTsKQEAgLTE2Nyw2ICsxNzEsOSBAQAogCWlmIChwbV9zdGF0ZS5ldmVudCA9PSBQTV9FVkVOVF9QUkVUSEFXKQogCQlyZXR1cm4gMDsKIAorCWlmIChkZXYtPnN3aXRjaF9wb3dlcl9zdGF0ZSA9PSBEUk1fU1dJVENIX1BPV0VSX09GRikKKwkJcmV0dXJuIDA7CisKIAlOVl9JTkZPKGRldiwgIkRpc2FibGluZyBmYmNvbiBhY2NlbGVyYXRpb24uLi5cbiIpOwogCW5vdXZlYXVfZmJjb25fc2F2ZV9kaXNhYmxlX2FjY2VsKGRldik7CiAKQEAgLTE5MywyMyArMjAwLDEwIEBACiAKIAlOVl9JTkZPKGRldiwgIklkbGluZyBjaGFubmVscy4uLlxuIik7CiAJZm9yIChpID0gMDsgaSA8IHBmaWZvLT5jaGFubmVsczsgaSsrKSB7Ci0JCXN0cnVjdCBub3V2ZWF1X2ZlbmNlICpmZW5jZSA9IE5VTEw7CisJCWNoYW4gPSBkZXZfcHJpdi0+Y2hhbm5lbHMucHRyW2ldOwogCi0JCWNoYW4gPSBkZXZfcHJpdi0+Zmlmb3NbaV07Ci0JCWlmICghY2hhbiB8fCAoZGV2X3ByaXYtPmNhcmRfdHlwZSA+PSBOVl81MCAmJgotCQkJICAgICAgY2hhbiA9PSBkZXZfcHJpdi0+Zmlmb3NbMF0pKQotCQkJY29udGludWU7Ci0KLQkJcmV0ID0gbm91dmVhdV9mZW5jZV9uZXcoY2hhbiwgJmZlbmNlLCB0cnVlKTsKLQkJaWYgKHJldCA9PSAwKSB7Ci0JCQlyZXQgPSBub3V2ZWF1X2ZlbmNlX3dhaXQoZmVuY2UsIE5VTEwsIGZhbHNlLCBmYWxzZSk7Ci0JCQlub3V2ZWF1X2ZlbmNlX3VucmVmKCh2b2lkICopJmZlbmNlKTsKLQkJfQotCi0JCWlmIChyZXQpIHsKLQkJCU5WX0VSUk9SKGRldiwgIkZhaWxlZCB0byBpZGxlIGNoYW5uZWwgJWQgZm9yIHN1c3BlbmRcbiIsCi0JCQkJIGNoYW4tPmlkKTsKLQkJfQorCQlpZiAoY2hhbiAmJiBjaGFuLT5wdXNoYnVmX2JvKQorCQkJbm91dmVhdV9jaGFubmVsX2lkbGUoY2hhbik7CiAJfQogCiAJcGdyYXBoLT5maWZvX2FjY2VzcyhkZXYsIGZhbHNlKTsKQEAgLTIxOSwxNyArMjEzLDE3IEBACiAJcGZpZm8tPnVubG9hZF9jb250ZXh0KGRldik7CiAJcGdyYXBoLT51bmxvYWRfY29udGV4dChkZXYpOwogCi0JTlZfSU5GTyhkZXYsICJTdXNwZW5kaW5nIEdQVSBvYmplY3RzLi4uXG4iKTsKLQlyZXQgPSBub3V2ZWF1X2dwdW9ial9zdXNwZW5kKGRldik7CisJcmV0ID0gcGluc3RtZW0tPnN1c3BlbmQoZGV2KTsKIAlpZiAocmV0KSB7CiAJCU5WX0VSUk9SKGRldiwgIi4uLiBmYWlsZWQ6ICVkXG4iLCByZXQpOwogCQlnb3RvIG91dF9hYm9ydDsKIAl9CiAKLQlyZXQgPSBwaW5zdG1lbS0+c3VzcGVuZChkZXYpOworCU5WX0lORk8oZGV2LCAiU3VzcGVuZGluZyBHUFUgb2JqZWN0cy4uLlxuIik7CisJcmV0ID0gbm91dmVhdV9ncHVvYmpfc3VzcGVuZChkZXYpOwogCWlmIChyZXQpIHsKIAkJTlZfRVJST1IoZGV2LCAiLi4uIGZhaWxlZDogJWRcbiIsIHJldCk7Ci0JCW5vdXZlYXVfZ3B1b2JqX3N1c3BlbmRfY2xlYW51cChkZXYpOworCQlwaW5zdG1lbS0+cmVzdW1lKGRldik7CiAJCWdvdG8gb3V0X2Fib3J0OwogCX0KIApAQCAtMjYzLDYgKzI1Nyw5IEBACiAJc3RydWN0IGRybV9jcnRjICpjcnRjOwogCWludCByZXQsIGk7CiAKKwlpZiAoZGV2LT5zd2l0Y2hfcG93ZXJfc3RhdGUgPT0gRFJNX1NXSVRDSF9QT1dFUl9PRkYpCisJCXJldHVybiAwOworCiAJbm91dmVhdV9mYmNvbl9zYXZlX2Rpc2FibGVfYWNjZWwoZGV2KTsKIAogCU5WX0lORk8oZGV2LCAiV2UncmUgYmFjaywgZW5hYmxpbmcgZGV2aWNlLi4uXG4iKTsKQEAgLTI5NCwxNyArMjkxLDE4IEBACiAJCX0KIAl9CiAKKwlOVl9JTkZPKGRldiwgIlJlc3RvcmluZyBHUFUgb2JqZWN0cy4uLlxuIik7CisJbm91dmVhdV9ncHVvYmpfcmVzdW1lKGRldik7CisKIAlOVl9JTkZPKGRldiwgIlJlaW5pdGlhbGlzaW5nIGVuZ2luZXMuLi5cbiIpOwogCWVuZ2luZS0+aW5zdG1lbS5yZXN1bWUoZGV2KTsKIAllbmdpbmUtPm1jLmluaXQoZGV2KTsKIAllbmdpbmUtPnRpbWVyLmluaXQoZGV2KTsKIAllbmdpbmUtPmZiLmluaXQoZGV2KTsKIAllbmdpbmUtPmdyYXBoLmluaXQoZGV2KTsKKwllbmdpbmUtPmNyeXB0LmluaXQoZGV2KTsKIAllbmdpbmUtPmZpZm8uaW5pdChkZXYpOwogCi0JTlZfSU5GTyhkZXYsICJSZXN0b3JpbmcgR1BVIG9iamVjdHMuLi5cbiIpOwotCW5vdXZlYXVfZ3B1b2JqX3Jlc3VtZShkZXYpOwotCiAJbm91dmVhdV9pcnFfcG9zdGluc3RhbGwoZGV2KTsKIAogCS8qIFJlLXdyaXRlIFNLSVBTLCB0aGV5J2xsIGhhdmUgYmVlbiBsb3N0IG92ZXIgdGhlIHN1c3BlbmQgKi8KQEAgLTMxMyw3ICszMTEsNyBAQAogCQlpbnQgajsKIAogCQlmb3IgKGkgPSAwOyBpIDwgZGV2X3ByaXYtPmVuZ2luZS5maWZvLmNoYW5uZWxzOyBpKyspIHsKLQkJCWNoYW4gPSBkZXZfcHJpdi0+Zmlmb3NbaV07CisJCQljaGFuID0gZGV2X3ByaXYtPmNoYW5uZWxzLnB0cltpXTsKIAkJCWlmICghY2hhbiB8fCAhY2hhbi0+cHVzaGJ1Zl9ibykKIAkJCQljb250aW51ZTsKIApAQCAtMzQ3LDEzICszNDUsMTEgQEAKIAogCWxpc3RfZm9yX2VhY2hfZW50cnkoY3J0YywgJmRldi0+bW9kZV9jb25maWcuY3J0Y19saXN0LCBoZWFkKSB7CiAJCXN0cnVjdCBub3V2ZWF1X2NydGMgKm52X2NydGMgPSBub3V2ZWF1X2NydGMoY3J0Yyk7CisJCXUzMiBvZmZzZXQgPSBudl9jcnRjLT5jdXJzb3IubnZiby0+Ym8ubWVtLnN0YXJ0IDw8IFBBR0VfU0hJRlQ7CiAKLQkJbnZfY3J0Yy0+Y3Vyc29yLnNldF9vZmZzZXQobnZfY3J0YywKLQkJCQkJbnZfY3J0Yy0+Y3Vyc29yLm52Ym8tPmJvLm9mZnNldCAtCi0JCQkJCWRldl9wcml2LT52bV92cmFtX2Jhc2UpOwotCisJCW52X2NydGMtPmN1cnNvci5zZXRfb2Zmc2V0KG52X2NydGMsIG9mZnNldCk7CiAJCW52X2NydGMtPmN1cnNvci5zZXRfcG9zKG52X2NydGMsIG52X2NydGMtPmN1cnNvcl9zYXZlZF94LAotCQkJbnZfY3J0Yy0+Y3Vyc29yX3NhdmVkX3kpOworCQkJCQkJIG52X2NydGMtPmN1cnNvcl9zYXZlZF95KTsKIAl9CiAKIAkvKiBGb3JjZSBDTFVUIHRvIGdldCByZS1sb2FkZWQgZHVyaW5nIG1vZGVzZXQgKi8KQEAgLTM5Myw2ICszODksOSBAQAogCS5pcnFfcG9zdGluc3RhbGwgPSBub3V2ZWF1X2lycV9wb3N0aW5zdGFsbCwKIAkuaXJxX3VuaW5zdGFsbCA9IG5vdXZlYXVfaXJxX3VuaW5zdGFsbCwKIAkuaXJxX2hhbmRsZXIgPSBub3V2ZWF1X2lycV9oYW5kbGVyLAorCS5nZXRfdmJsYW5rX2NvdW50ZXIgPSBkcm1fdmJsYW5rX2NvdW50LAorCS5lbmFibGVfdmJsYW5rID0gbm91dmVhdV92YmxhbmtfZW5hYmxlLAorCS5kaXNhYmxlX3ZibGFuayA9IG5vdXZlYXVfdmJsYW5rX2Rpc2FibGUsCiAJLnJlY2xhaW1fYnVmZmVycyA9IGRybV9jb3JlX3JlY2xhaW1fYnVmZmVycywKIAkuaW9jdGxzID0gbm91dmVhdV9pb2N0bHMsCiAJLmZvcHMgPSB7CkBAIC00MDMsNiArNDAyLDcgQEAKIAkJLm1tYXAgPSBub3V2ZWF1X3R0bV9tbWFwLAogCQkucG9sbCA9IGRybV9wb2xsLAogCQkuZmFzeW5jID0gZHJtX2Zhc3luYywKKwkJLnJlYWQgPSBkcm1fcmVhZCwKICNpZiBkZWZpbmVkKENPTkZJR19DT01QQVQpCiAJCS5jb21wYXRfaW9jdGwgPSBub3V2ZWF1X2NvbXBhdF9pb2N0bCwKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9kcnYuaCBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfZHJ2LmgKaW5kZXggMWM3ZGI2NC4uNDZlMzI1NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9kcnYuaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2Rydi5oCkBAIC01NCwyMiArNTQsMzcgQEAKICNpbmNsdWRlICJub3V2ZWF1X2RybS5oIgogI2luY2x1ZGUgIm5vdXZlYXVfcmVnLmgiCiAjaW5jbHVkZSAibm91dmVhdV9iaW9zLmgiCisjaW5jbHVkZSAibm91dmVhdV91dGlsLmgiCisKIHN0cnVjdCBub3V2ZWF1X2dyY3R4Oworc3RydWN0IG5vdXZlYXVfdnJhbTsKKyNpbmNsdWRlICJub3V2ZWF1X3ZtLmgiCiAKICNkZWZpbmUgTUFYX05VTV9EQ0JfRU5UUklFUyAxNgogCiAjZGVmaW5lIE5PVVZFQVVfTUFYX0NIQU5ORUxfTlIgMTI4CiAjZGVmaW5lIE5PVVZFQVVfTUFYX1RJTEVfTlIgMTUKIAotI2RlZmluZSBOVjUwX1ZNX01BWF9WUkFNICgyKjEwMjQqMTAyNCoxMDI0VUxMKQotI2RlZmluZSBOVjUwX1ZNX0JMT0NLICAgICg1MTIqMTAyNCoxMDI0VUxMKQotI2RlZmluZSBOVjUwX1ZNX1ZSQU1fTlIgIChOVjUwX1ZNX01BWF9WUkFNIC8gTlY1MF9WTV9CTE9DSykKK3N0cnVjdCBub3V2ZWF1X3ZyYW0geworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXY7CisKKwlzdHJ1Y3Qgbm91dmVhdV92bWEgYmFyX3ZtYTsKKwl1OCAgcGFnZV9zaGlmdDsKKworCXN0cnVjdCBsaXN0X2hlYWQgcmVnaW9uczsKKwl1MzIgbWVtdHlwZTsKKwl1NjQgb2Zmc2V0OworCXU2NCBzaXplOworfTsKIAogc3RydWN0IG5vdXZlYXVfdGlsZV9yZWcgewotCXN0cnVjdCBub3V2ZWF1X2ZlbmNlICpmZW5jZTsKLQl1aW50MzJfdCBhZGRyOwotCXVpbnQzMl90IHNpemU7CiAJYm9vbCB1c2VkOworCXVpbnQzMl90IGFkZHI7CisJdWludDMyX3QgbGltaXQ7CisJdWludDMyX3QgcGl0Y2g7CisJdWludDMyX3QgemNvbXA7CisJc3RydWN0IGRybV9tbV9ub2RlICp0YWdfbWVtOworCXN0cnVjdCBub3V2ZWF1X2ZlbmNlICpmZW5jZTsKIH07CiAKIHN0cnVjdCBub3V2ZWF1X2JvIHsKQEAgLTg4LDYgKzEwMyw3IEBACiAKIAlzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFubmVsOwogCisJc3RydWN0IG5vdXZlYXVfdm1hIHZtYTsKIAlib29sIG1hcHBhYmxlOwogCWJvb2wgbm9fdm07CiAKQEAgLTk2LDcgKzExMiw2IEBACiAJc3RydWN0IG5vdXZlYXVfdGlsZV9yZWcgKnRpbGU7CiAKIAlzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKmdlbTsKLQlzdHJ1Y3QgZHJtX2ZpbGUgKmNwdV9maWxwOwogCWludCBwaW5fcmVmY250OwogfTsKIApAQCAtMTMzLDIwICsxNDgsMjggQEAKIAogI2RlZmluZSBOVk9CSl9FTkdJTkVfU1cJCTAKICNkZWZpbmUgTlZPQkpfRU5HSU5FX0dSCQkxCi0jZGVmaW5lIE5WT0JKX0VOR0lORV9ESVNQTEFZCTIKKyNkZWZpbmUgTlZPQkpfRU5HSU5FX1BQUAkyCisjZGVmaW5lIE5WT0JKX0VOR0lORV9DT1BZCTMKKyNkZWZpbmUgTlZPQkpfRU5HSU5FX1ZQCQk0CisjZGVmaW5lIE5WT0JKX0VOR0lORV9DUllQVCAgICAgIDUKKyNkZWZpbmUgTlZPQkpfRU5HSU5FX0JTUAk2CisjZGVmaW5lIE5WT0JKX0VOR0lORV9ESVNQTEFZCTB4Y2FmZTAwMDEKICNkZWZpbmUgTlZPQkpfRU5HSU5FX0lOVAkweGRlYWRiZWVmCiAKKyNkZWZpbmUgTlZPQkpfRkxBR19ET05UX01BUCAgICAgICAgICAgICAoMSA8PCAwKQogI2RlZmluZSBOVk9CSl9GTEFHX1pFUk9fQUxMT0MJCSgxIDw8IDEpCiAjZGVmaW5lIE5WT0JKX0ZMQUdfWkVST19GUkVFCQkoMSA8PCAyKQorI2RlZmluZSBOVk9CSl9GTEFHX1ZNCQkJKDEgPDwgMykKKworI2RlZmluZSBOVk9CSl9DSU5TVF9HTE9CQUwJMHhkZWFkYmVlZgorCiBzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogewogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXY7CiAJc3RydWN0IGtyZWYgcmVmY291bnQ7CiAJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwogCi0Jc3RydWN0IGRybV9tbV9ub2RlICppbV9wcmFtaW47Ci0Jc3RydWN0IG5vdXZlYXVfYm8gKmltX2JhY2tpbmc7Ci0JdWludDMyX3QgKmltX2JhY2tpbmdfc3VzcGVuZDsKLQlpbnQgaW1fYm91bmQ7CisJdm9pZCAqbm9kZTsKKwl1MzIgKnN1c3BlbmQ7CiAKIAl1aW50MzJfdCBmbGFnczsKIApAQCAtMTYyLDEwICsxODUsMjkgQEAKIAl2b2lkICpwcml2OwogfTsKIAorc3RydWN0IG5vdXZlYXVfcGFnZV9mbGlwX3N0YXRlIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGhlYWQ7CisJc3RydWN0IGRybV9wZW5kaW5nX3ZibGFua19ldmVudCAqZXZlbnQ7CisJaW50IGNydGMsIGJwcCwgcGl0Y2gsIHgsIHk7CisJdWludDY0X3Qgb2Zmc2V0OworfTsKKworZW51bSBub3V2ZWF1X2NoYW5uZWxfbXV0ZXhfY2xhc3MgeworCU5PVVZFQVVfVUNIQU5ORUxfTVVURVgsCisJTk9VVkVBVV9LQ0hBTk5FTF9NVVRFWAorfTsKKwogc3RydWN0IG5vdXZlYXVfY2hhbm5lbCB7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldjsKIAlpbnQgaWQ7CiAKKwkvKiByZWZlcmVuY2VzIHRvIHRoZSBjaGFubmVsIGRhdGEgc3RydWN0dXJlICovCisJc3RydWN0IGtyZWYgcmVmOworCS8qIHVzZXJzIG9mIHRoZSBoYXJkd2FyZSBjaGFubmVsIHJlc291cmNlcywgdGhlIGhhcmR3YXJlCisJICogY29udGV4dCB3aWxsIGJlIGtpY2tlZCBvZmYgd2hlbiBpdCByZWFjaGVzIHplcm8uICovCisJYXRvbWljX3QgdXNlcnM7CisJc3RydWN0IG11dGV4IG11dGV4OworCiAJLyogb3duZXIgb2YgdGhpcyBmaWZvICovCiAJc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXY7CiAJLyogbWFwcGluZyBvZiB0aGUgZmlmbyBpdHNlbGYgKi8KQEAgLTE5OCwxNiArMjQwLDE3IEBACiAJLyogUEZJRk8gY29udGV4dCAqLwogCXN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqcmFtZmM7CiAJc3RydWN0IG5vdXZlYXVfZ3B1b2JqICpjYWNoZTsKKwl2b2lkICpmaWZvX3ByaXY7CiAKIAkvKiBQR1JBUEggY29udGV4dCAqLwogCS8qIFhYWCBtYXkgYmUgbWVyZ2UgMiBwb2ludGVycyBhcyBwcml2YXRlIGRhdGEgPz8/ICovCiAJc3RydWN0IG5vdXZlYXVfZ3B1b2JqICpyYW1pbl9ncmN0eDsKKwlzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKmNyeXB0X2N0eDsKIAl2b2lkICpwZ3JhcGhfY3R4OwogCiAJLyogTlY1MCBWTSAqLworCXN0cnVjdCBub3V2ZWF1X3ZtICAgICAqdm07CiAJc3RydWN0IG5vdXZlYXVfZ3B1b2JqICp2bV9wZDsKLQlzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKnZtX2dhcnRfcHQ7Ci0Jc3RydWN0IG5vdXZlYXVfZ3B1b2JqICp2bV92cmFtX3B0W05WNTBfVk1fVlJBTV9OUl07CiAKIAkvKiBPYmplY3RzICovCiAJc3RydWN0IG5vdXZlYXVfZ3B1b2JqICpyYW1pbjsgLyogUHJpdmF0ZSBpbnN0bWVtICovCkBAIC0yMzgsOSArMjgxLDExIEBACiAKIAlzdHJ1Y3QgewogCQlzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKnZibHNlbTsKKwkJdWludDMyX3QgdmJsc2VtX2hlYWQ7CiAJCXVpbnQzMl90IHZibHNlbV9vZmZzZXQ7CiAJCXVpbnQzMl90IHZibHNlbV9ydmFsOwogCQlzdHJ1Y3QgbGlzdF9oZWFkIHZibF93YWl0OworCQlzdHJ1Y3QgbGlzdF9oZWFkIGZsaXA7CiAJfSBudnN3OwogCiAJc3RydWN0IHsKQEAgLTI1OCwxMSArMzAzLDExIEBACiAJaW50CSgqc3VzcGVuZCkoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CiAJdm9pZAkoKnJlc3VtZSkoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CiAKLQlpbnQJKCpwb3B1bGF0ZSkoc3RydWN0IGRybV9kZXZpY2UgKiwgc3RydWN0IG5vdXZlYXVfZ3B1b2JqICosCi0JCQkgICAgdWludDMyX3QgKnNpemUpOwotCXZvaWQJKCpjbGVhcikoc3RydWN0IGRybV9kZXZpY2UgKiwgc3RydWN0IG5vdXZlYXVfZ3B1b2JqICopOwotCWludAkoKmJpbmQpKHN0cnVjdCBkcm1fZGV2aWNlICosIHN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqKTsKLQlpbnQJKCp1bmJpbmQpKHN0cnVjdCBkcm1fZGV2aWNlICosIHN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqKTsKKwlpbnQJKCpnZXQpKHN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqLCB1MzIgc2l6ZSwgdTMyIGFsaWduKTsKKwl2b2lkCSgqcHV0KShzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKik7CisJaW50CSgqbWFwKShzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKik7CisJdm9pZAkoKnVubWFwKShzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKik7CisKIAl2b2lkCSgqZmx1c2gpKHN0cnVjdCBkcm1fZGV2aWNlICopOwogfTsKIApAQCAtMjc5LDE1ICszMjQsMjEgQEAKIAogc3RydWN0IG5vdXZlYXVfZmJfZW5naW5lIHsKIAlpbnQgbnVtX3RpbGVzOworCXN0cnVjdCBkcm1fbW0gdGFnX2hlYXA7CisJdm9pZCAqcHJpdjsKIAogCWludCAgKCppbml0KShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKIAl2b2lkICgqdGFrZWRvd24pKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwogCi0Jdm9pZCAoKnNldF9yZWdpb25fdGlsaW5nKShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgaSwgdWludDMyX3QgYWRkciwKLQkJCQkgdWludDMyX3Qgc2l6ZSwgdWludDMyX3QgcGl0Y2gpOworCXZvaWQgKCppbml0X3RpbGVfcmVnaW9uKShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgaSwKKwkJCQkgdWludDMyX3QgYWRkciwgdWludDMyX3Qgc2l6ZSwKKwkJCQkgdWludDMyX3QgcGl0Y2gsIHVpbnQzMl90IGZsYWdzKTsKKwl2b2lkICgqc2V0X3RpbGVfcmVnaW9uKShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgaSk7CisJdm9pZCAoKmZyZWVfdGlsZV9yZWdpb24pKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBpKTsKIH07CiAKIHN0cnVjdCBub3V2ZWF1X2ZpZm9fZW5naW5lIHsKKwl2b2lkICpwcml2OwogCWludCAgY2hhbm5lbHM7CiAKIAlzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKnBsYXlsaXN0WzJdOwpAQCAtMzEwLDIyICszNjEsMTEgQEAKIAl2b2lkICgqdGxiX2ZsdXNoKShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKIH07CiAKLXN0cnVjdCBub3V2ZWF1X3BncmFwaF9vYmplY3RfbWV0aG9kIHsKLQlpbnQgaWQ7Ci0JaW50ICgqZXhlYykoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbiwgaW50IGdyY2xhc3MsIGludCBtdGhkLAotCQkgICAgICB1aW50MzJfdCBkYXRhKTsKLX07Ci0KLXN0cnVjdCBub3V2ZWF1X3BncmFwaF9vYmplY3RfY2xhc3MgewotCWludCBpZDsKLQlib29sIHNvZnR3YXJlOwotCXN0cnVjdCBub3V2ZWF1X3BncmFwaF9vYmplY3RfbWV0aG9kICptZXRob2RzOwotfTsKLQogc3RydWN0IG5vdXZlYXVfcGdyYXBoX2VuZ2luZSB7Ci0Jc3RydWN0IG5vdXZlYXVfcGdyYXBoX29iamVjdF9jbGFzcyAqZ3JjbGFzczsKIAlib29sIGFjY2VsX2Jsb2NrZWQ7CisJYm9vbCByZWdpc3RlcmVkOwogCWludCBncmN0eF9zaXplOworCXZvaWQgKnByaXY7CiAKIAkvKiBOVjJ4L05WM3ggY29udGV4dCB0YWJsZSAoMHg0MDA3ODApICovCiAJc3RydWN0IG5vdXZlYXVfZ3B1b2JqICpjdHhfdGFibGU7CkBAIC0zNDIsOCArMzgyLDcgQEAKIAlpbnQgICgqdW5sb2FkX2NvbnRleHQpKHN0cnVjdCBkcm1fZGV2aWNlICopOwogCXZvaWQgKCp0bGJfZmx1c2gpKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwogCi0Jdm9pZCAoKnNldF9yZWdpb25fdGlsaW5nKShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgaSwgdWludDMyX3QgYWRkciwKLQkJCQkgIHVpbnQzMl90IHNpemUsIHVpbnQzMl90IHBpdGNoKTsKKwl2b2lkICgqc2V0X3RpbGVfcmVnaW9uKShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgaSk7CiB9OwogCiBzdHJ1Y3Qgbm91dmVhdV9kaXNwbGF5X2VuZ2luZSB7CkBAIC0zNTUsMTMgKzM5NCwxOSBAQAogfTsKIAogc3RydWN0IG5vdXZlYXVfZ3Bpb19lbmdpbmUgeworCXZvaWQgKnByaXY7CisKIAlpbnQgICgqaW5pdCkoc3RydWN0IGRybV9kZXZpY2UgKik7CiAJdm9pZCAoKnRha2Vkb3duKShzdHJ1Y3QgZHJtX2RldmljZSAqKTsKIAogCWludCAgKCpnZXQpKHN0cnVjdCBkcm1fZGV2aWNlICosIGVudW0gZGNiX2dwaW9fdGFnKTsKIAlpbnQgICgqc2V0KShzdHJ1Y3QgZHJtX2RldmljZSAqLCBlbnVtIGRjYl9ncGlvX3RhZywgaW50IHN0YXRlKTsKIAotCXZvaWQgKCppcnFfZW5hYmxlKShzdHJ1Y3QgZHJtX2RldmljZSAqLCBlbnVtIGRjYl9ncGlvX3RhZywgYm9vbCBvbik7CisJaW50ICAoKmlycV9yZWdpc3Rlcikoc3RydWN0IGRybV9kZXZpY2UgKiwgZW51bSBkY2JfZ3Bpb190YWcsCisJCQkgICAgIHZvaWQgKCopKHZvaWQgKiwgaW50KSwgdm9pZCAqKTsKKwl2b2lkICgqaXJxX3VucmVnaXN0ZXIpKHN0cnVjdCBkcm1fZGV2aWNlICosIGVudW0gZGNiX2dwaW9fdGFnLAorCQkJICAgICAgIHZvaWQgKCopKHZvaWQgKiwgaW50KSwgdm9pZCAqKTsKKwlib29sICgqaXJxX2VuYWJsZSkoc3RydWN0IGRybV9kZXZpY2UgKiwgZW51bSBkY2JfZ3Bpb190YWcsIGJvb2wgb24pOwogfTsKIAogc3RydWN0IG5vdXZlYXVfcG1fdm9sdGFnZV9sZXZlbCB7CkBAIC00MzcsNiArNDgyLDcgQEAKIAlzdHJ1Y3Qgbm91dmVhdV9wbV9sZXZlbCAqY3VyOwogCiAJc3RydWN0IGRldmljZSAqaHdtb247CisJc3RydWN0IG5vdGlmaWVyX2Jsb2NrIGFjcGlfbmI7CiAKIAlpbnQgKCpjbG9ja19nZXQpKHN0cnVjdCBkcm1fZGV2aWNlICosIHUzMiBpZCk7CiAJdm9pZCAqKCpjbG9ja19wcmUpKHN0cnVjdCBkcm1fZGV2aWNlICosIHN0cnVjdCBub3V2ZWF1X3BtX2xldmVsICosCkBAIC00NDksNiArNDk1LDI1IEBACiAJaW50ICgqdGVtcF9nZXQpKHN0cnVjdCBkcm1fZGV2aWNlICopOwogfTsKIAorc3RydWN0IG5vdXZlYXVfY3J5cHRfZW5naW5lIHsKKwlib29sIHJlZ2lzdGVyZWQ7CisKKwlpbnQgICgqaW5pdCkoc3RydWN0IGRybV9kZXZpY2UgKik7CisJdm9pZCAoKnRha2Vkb3duKShzdHJ1Y3QgZHJtX2RldmljZSAqKTsKKwlpbnQgICgqY3JlYXRlX2NvbnRleHQpKHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKik7CisJdm9pZCAoKmRlc3Ryb3lfY29udGV4dCkoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqKTsKKwl2b2lkICgqdGxiX2ZsdXNoKShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKK307CisKK3N0cnVjdCBub3V2ZWF1X3ZyYW1fZW5naW5lIHsKKwlpbnQgICgqaW5pdCkoc3RydWN0IGRybV9kZXZpY2UgKik7CisJaW50ICAoKmdldCkoc3RydWN0IGRybV9kZXZpY2UgKiwgdTY0LCB1MzIgYWxpZ24sIHUzMiBzaXplX25jLAorCQkgICAgdTMyIHR5cGUsIHN0cnVjdCBub3V2ZWF1X3ZyYW0gKiopOworCXZvaWQgKCpwdXQpKHN0cnVjdCBkcm1fZGV2aWNlICosIHN0cnVjdCBub3V2ZWF1X3ZyYW0gKiopOworCisJYm9vbCAoKmZsYWdzX3ZhbGlkKShzdHJ1Y3QgZHJtX2RldmljZSAqLCB1MzIgdGlsZV9mbGFncyk7Cit9OworCiBzdHJ1Y3Qgbm91dmVhdV9lbmdpbmUgewogCXN0cnVjdCBub3V2ZWF1X2luc3RtZW1fZW5naW5lIGluc3RtZW07CiAJc3RydWN0IG5vdXZlYXVfbWNfZW5naW5lICAgICAgbWM7CkBAIC00NTksNiArNTI0LDggQEAKIAlzdHJ1Y3Qgbm91dmVhdV9kaXNwbGF5X2VuZ2luZSBkaXNwbGF5OwogCXN0cnVjdCBub3V2ZWF1X2dwaW9fZW5naW5lICAgIGdwaW87CiAJc3RydWN0IG5vdXZlYXVfcG1fZW5naW5lICAgICAgcG07CisJc3RydWN0IG5vdXZlYXVfY3J5cHRfZW5naW5lICAgY3J5cHQ7CisJc3RydWN0IG5vdXZlYXVfdnJhbV9lbmdpbmUgICAgdnJhbTsKIH07CiAKIHN0cnVjdCBub3V2ZWF1X3BsbF92YWxzIHsKQEAgLTU3NywxOCArNjQ0LDE1IEBACiAJYm9vbCByYW1pbl9hdmFpbGFibGU7CiAJc3RydWN0IGRybV9tbSByYW1pbl9oZWFwOwogCXN0cnVjdCBsaXN0X2hlYWQgZ3B1b2JqX2xpc3Q7CisJc3RydWN0IGxpc3RfaGVhZCBjbGFzc2VzOwogCiAJc3RydWN0IG5vdXZlYXVfYm8gKnZnYV9yYW07CiAKKwkvKiBpbnRlcnJ1cHQgaGFuZGxpbmcgKi8KKwl2b2lkICgqaXJxX2hhbmRsZXJbMzJdKShzdHJ1Y3QgZHJtX2RldmljZSAqKTsKKwlib29sIG1zaV9lbmFibGVkOwogCXN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICp3cTsKIAlzdHJ1Y3Qgd29ya19zdHJ1Y3QgaXJxX3dvcms7Ci0Jc3RydWN0IHdvcmtfc3RydWN0IGhwZF93b3JrOwotCi0Jc3RydWN0IHsKLQkJc3BpbmxvY2tfdCBsb2NrOwotCQl1aW50MzJfdCBocGQwX2JpdHM7Ci0JCXVpbnQzMl90IGhwZDFfYml0czsKLQl9IGhwZF9zdGF0ZTsKIAogCXN0cnVjdCBsaXN0X2hlYWQgdmJsX3dhaXRpbmc7CiAKQEAgLTYwNSw4ICs2NjksMTAgQEAKIAkJc3RydWN0IG5vdXZlYXVfYm8gKmJvOwogCX0gZmVuY2U7CiAKLQlpbnQgZmlmb19hbGxvY19jb3VudDsKLQlzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpmaWZvc1tOT1VWRUFVX01BWF9DSEFOTkVMX05SXTsKKwlzdHJ1Y3QgeworCQlzcGlubG9ja190IGxvY2s7CisJCXN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKnB0cltOT1VWRUFVX01BWF9DSEFOTkVMX05SXTsKKwl9IGNoYW5uZWxzOwogCiAJc3RydWN0IG5vdXZlYXVfZW5naW5lIGVuZ2luZTsKIAlzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFubmVsOwpAQCAtNjMyLDEyICs2OTgsMTQgQEAKIAkJdWludDY0X3QgYXBlcl9mcmVlOwogCiAJCXN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqc2dfY3R4ZG1hOwotCQlzdHJ1Y3QgcGFnZSAqc2dfZHVtbXlfcGFnZTsKLQkJZG1hX2FkZHJfdCBzZ19kdW1teV9idXM7CisJCXN0cnVjdCBub3V2ZWF1X3ZtYSB2bWE7CiAJfSBnYXJ0X2luZm87CiAKIAkvKiBudjEwLW52NDAgdGlsaW5nIHJlZ2lvbnMgKi8KLQlzdHJ1Y3Qgbm91dmVhdV90aWxlX3JlZyB0aWxlW05PVVZFQVVfTUFYX1RJTEVfTlJdOworCXN0cnVjdCB7CisJCXN0cnVjdCBub3V2ZWF1X3RpbGVfcmVnIHJlZ1tOT1VWRUFVX01BWF9USUxFX05SXTsKKwkJc3BpbmxvY2tfdCBsb2NrOworCX0gdGlsZTsKIAogCS8qIFZSQU0vZmIgY29uZmlndXJhdGlvbiAqLwogCXVpbnQ2NF90IHZyYW1fc2l6ZTsKQEAgLTY1MCwxNCArNzE4LDEyIEBACiAJdWludDY0X3QgZmJfYXBlcl9mcmVlOwogCWludCBmYl9tdHJyOwogCisJLyogQkFSIGNvbnRyb2wgKE5WNTAtKSAqLworCXN0cnVjdCBub3V2ZWF1X3ZtICpiYXIxX3ZtOworCXN0cnVjdCBub3V2ZWF1X3ZtICpiYXIzX3ZtOworCiAJLyogRzh4L0c5eCB2aXJ0dWFsIGFkZHJlc3Mgc3BhY2UgKi8KLQl1aW50NjRfdCB2bV9nYXJ0X2Jhc2U7Ci0JdWludDY0X3Qgdm1fZ2FydF9zaXplOwotCXVpbnQ2NF90IHZtX3ZyYW1fYmFzZTsKLQl1aW50NjRfdCB2bV92cmFtX3NpemU7Ci0JdWludDY0X3Qgdm1fZW5kOwotCXN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqdm1fdnJhbV9wdFtOVjUwX1ZNX1ZSQU1fTlJdOwotCWludCB2bV92cmFtX3B0X25yOworCXN0cnVjdCBub3V2ZWF1X3ZtICpjaGFuX3ZtOwogCiAJc3RydWN0IG52YmlvcyB2YmlvczsKIApAQCAtNjc0LDYgKzc0MCw3IEBACiAJc3RydWN0IGJhY2tsaWdodF9kZXZpY2UgKmJhY2tsaWdodDsKIAogCXN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmV2bzsKKwl1MzIgZXZvX2FsbG9jOwogCXN0cnVjdCB7CiAJCXN0cnVjdCBkY2JfZW50cnkgKmRjYjsKIAkJdTE2IHNjcmlwdDsKQEAgLTY4Niw2ICs3NTMsOCBAQAogCiAJc3RydWN0IG5vdXZlYXVfZmJkZXYgKm5mYmRldjsKIAlzdHJ1Y3QgYXBlcnR1cmVzX3N0cnVjdCAqYXBlcnR1cmVzOworCisJYm9vbCBwb3dlcmVkX2Rvd247CiB9OwogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICoKQEAgLTcxOSwxNiArNzg4LDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotI2RlZmluZSBOT1VWRUFVX0dFVF9VU0VSX0NIQU5ORUxfV0lUSF9SRVRVUk4oaWQsIGNsLCBjaCkgZG8geyAgICBcCi0Jc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKm52ID0gZGV2LT5kZXZfcHJpdmF0ZTsgICAgICAgXAotCWlmICghbm91dmVhdV9jaGFubmVsX293bmVyKGRldiwgKGNsKSwgKGlkKSkpIHsgICAgICAgICAgIFwKLQkJTlZfRVJST1IoZGV2LCAicGlkICVkIGRvZXNuJ3Qgb3duIGNoYW5uZWwgJWRcbiIsIFwKLQkJCSBEUk1fQ1VSUkVOVFBJRCwgKGlkKSk7ICAgICAgICAgICAgICAgICAgXAotCQlyZXR1cm4gLUVQRVJNOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkoY2gpID0gbnYtPmZpZm9zWyhpZCldOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi19IHdoaWxlICgwKQotCiAvKiBub3V2ZWF1X2Rydi5jICovCiBleHRlcm4gaW50IG5vdXZlYXVfYWdwbW9kZTsKIGV4dGVybiBpbnQgbm91dmVhdV9kdWFsbGluazsKQEAgLTc0OCw2ICs4MDcsNyBAQAogZXh0ZXJuIGludCBub3V2ZWF1X292ZXJyaWRlX2Nvbm50eXBlOwogZXh0ZXJuIGNoYXIgKm5vdXZlYXVfcGVyZmx2bDsKIGV4dGVybiBpbnQgbm91dmVhdV9wZXJmbHZsX3dyOworZXh0ZXJuIGludCBub3V2ZWF1X21zaTsKIAogZXh0ZXJuIGludCBub3V2ZWF1X3BjaV9zdXNwZW5kKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBwbV9tZXNzYWdlX3QgcG1fc3RhdGUpOwogZXh0ZXJuIGludCBub3V2ZWF1X3BjaV9yZXN1bWUoc3RydWN0IHBjaV9kZXYgKnBkZXYpOwpAQCAtNzYyLDggKzgyMiwxMCBAQAogCQkJCSAgIHN0cnVjdCBkcm1fZmlsZSAqKTsKIGV4dGVybiBpbnQgIG5vdXZlYXVfaW9jdGxfc2V0cGFyYW0oc3RydWN0IGRybV9kZXZpY2UgKiwgdm9pZCAqZGF0YSwKIAkJCQkgICBzdHJ1Y3QgZHJtX2ZpbGUgKik7Ci1leHRlcm4gYm9vbCBub3V2ZWF1X3dhaXRfdW50aWwoc3RydWN0IGRybV9kZXZpY2UgKiwgdWludDY0X3QgdGltZW91dCwKLQkJCSAgICAgICB1aW50MzJfdCByZWcsIHVpbnQzMl90IG1hc2ssIHVpbnQzMl90IHZhbCk7CitleHRlcm4gYm9vbCBub3V2ZWF1X3dhaXRfZXEoc3RydWN0IGRybV9kZXZpY2UgKiwgdWludDY0X3QgdGltZW91dCwKKwkJCSAgICB1aW50MzJfdCByZWcsIHVpbnQzMl90IG1hc2ssIHVpbnQzMl90IHZhbCk7CitleHRlcm4gYm9vbCBub3V2ZWF1X3dhaXRfbmUoc3RydWN0IGRybV9kZXZpY2UgKiwgdWludDY0X3QgdGltZW91dCwKKwkJCSAgICB1aW50MzJfdCByZWcsIHVpbnQzMl90IG1hc2ssIHVpbnQzMl90IHZhbCk7CiBleHRlcm4gYm9vbCBub3V2ZWF1X3dhaXRfZm9yX2lkbGUoc3RydWN0IGRybV9kZXZpY2UgKik7CiBleHRlcm4gaW50ICBub3V2ZWF1X2NhcmRfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqKTsKIApAQCAtNzc1LDE4ICs4MzcsMTggQEAKIGV4dGVybiBpbnQgIG5vdXZlYXVfbWVtX2luaXRfYWdwKHN0cnVjdCBkcm1fZGV2aWNlICopOwogZXh0ZXJuIGludCAgbm91dmVhdV9tZW1fcmVzZXRfYWdwKHN0cnVjdCBkcm1fZGV2aWNlICopOwogZXh0ZXJuIHZvaWQgbm91dmVhdV9tZW1fY2xvc2Uoc3RydWN0IGRybV9kZXZpY2UgKik7Ci1leHRlcm4gc3RydWN0IG5vdXZlYXVfdGlsZV9yZWcgKm52MTBfbWVtX3NldF90aWxpbmcoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKLQkJCQkJCSAgICB1aW50MzJfdCBhZGRyLAotCQkJCQkJICAgIHVpbnQzMl90IHNpemUsCi0JCQkJCQkgICAgdWludDMyX3QgcGl0Y2gpOwotZXh0ZXJuIHZvaWQgbnYxMF9tZW1fZXhwaXJlX3RpbGluZyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAotCQkJCSAgIHN0cnVjdCBub3V2ZWF1X3RpbGVfcmVnICp0aWxlLAotCQkJCSAgIHN0cnVjdCBub3V2ZWF1X2ZlbmNlICpmZW5jZSk7Ci1leHRlcm4gaW50ICBudjUwX21lbV92bV9iaW5kX2xpbmVhcihzdHJ1Y3QgZHJtX2RldmljZSAqLCB1aW50NjRfdCB2aXJ0LAotCQkJCSAgICB1aW50MzJfdCBzaXplLCB1aW50MzJfdCBmbGFncywKLQkJCQkgICAgdWludDY0X3QgcGh5cyk7Ci1leHRlcm4gdm9pZCBudjUwX21lbV92bV91bmJpbmQoc3RydWN0IGRybV9kZXZpY2UgKiwgdWludDY0X3QgdmlydCwKLQkJCSAgICAgICB1aW50MzJfdCBzaXplKTsKK2V4dGVybiBpbnQgIG5vdXZlYXVfbWVtX2RldGVjdChzdHJ1Y3QgZHJtX2RldmljZSAqKTsKK2V4dGVybiBib29sIG5vdXZlYXVfbWVtX2ZsYWdzX3ZhbGlkKHN0cnVjdCBkcm1fZGV2aWNlICosIHUzMiB0aWxlX2ZsYWdzKTsKK2V4dGVybiBzdHJ1Y3Qgbm91dmVhdV90aWxlX3JlZyAqbnYxMF9tZW1fc2V0X3RpbGluZygKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1aW50MzJfdCBhZGRyLCB1aW50MzJfdCBzaXplLAorCXVpbnQzMl90IHBpdGNoLCB1aW50MzJfdCBmbGFncyk7CitleHRlcm4gdm9pZCBudjEwX21lbV9wdXRfdGlsZV9yZWdpb24oc3RydWN0IGRybV9kZXZpY2UgKmRldiwKKwkJCQkgICAgIHN0cnVjdCBub3V2ZWF1X3RpbGVfcmVnICp0aWxlLAorCQkJCSAgICAgc3RydWN0IG5vdXZlYXVfZmVuY2UgKmZlbmNlKTsKK2V4dGVybiBjb25zdCBzdHJ1Y3QgdHRtX21lbV90eXBlX21hbmFnZXJfZnVuYyBub3V2ZWF1X3ZyYW1fbWFuYWdlcjsKKworLyogbnZjMF92cmFtLmMgKi8KK2V4dGVybiBjb25zdCBzdHJ1Y3QgdHRtX21lbV90eXBlX21hbmFnZXJfZnVuYyBudmMwX3ZyYW1fbWFuYWdlcjsKIAogLyogbm91dmVhdV9ub3RpZmllci5jICovCiBleHRlcm4gaW50ICBub3V2ZWF1X25vdGlmaWVyX2luaXRfY2hhbm5lbChzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICopOwpAQCAtODAzLDIxICs4NjUsNDQgQEAKIGV4dGVybiBzdHJ1Y3QgZHJtX2lvY3RsX2Rlc2Mgbm91dmVhdV9pb2N0bHNbXTsKIGV4dGVybiBpbnQgbm91dmVhdV9tYXhfaW9jdGw7CiBleHRlcm4gdm9pZCBub3V2ZWF1X2NoYW5uZWxfY2xlYW51cChzdHJ1Y3QgZHJtX2RldmljZSAqLCBzdHJ1Y3QgZHJtX2ZpbGUgKik7Ci1leHRlcm4gaW50ICBub3V2ZWF1X2NoYW5uZWxfb3duZXIoc3RydWN0IGRybV9kZXZpY2UgKiwgc3RydWN0IGRybV9maWxlICosCi0JCQkJICBpbnQgY2hhbm5lbCk7CiBleHRlcm4gaW50ICBub3V2ZWF1X2NoYW5uZWxfYWxsb2Moc3RydWN0IGRybV9kZXZpY2UgKmRldiwKIAkJCQkgIHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKipjaGFuLAogCQkJCSAgc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYsCiAJCQkJICB1aW50MzJfdCBmYl9jdHhkbWEsIHVpbnQzMl90IHR0X2N0eGRtYSk7Ci1leHRlcm4gdm9pZCBub3V2ZWF1X2NoYW5uZWxfZnJlZShzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICopOworZXh0ZXJuIHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKgorbm91dmVhdV9jaGFubmVsX2dldF91bmxvY2tlZChzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICopOworZXh0ZXJuIHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKgorbm91dmVhdV9jaGFubmVsX2dldChzdHJ1Y3QgZHJtX2RldmljZSAqLCBzdHJ1Y3QgZHJtX2ZpbGUgKiwgaW50IGlkKTsKK2V4dGVybiB2b2lkIG5vdXZlYXVfY2hhbm5lbF9wdXRfdW5sb2NrZWQoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqKik7CitleHRlcm4gdm9pZCBub3V2ZWF1X2NoYW5uZWxfcHV0KHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKiopOworZXh0ZXJuIHZvaWQgbm91dmVhdV9jaGFubmVsX3JlZihzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuLAorCQkJCXN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKipwY2hhbik7CitleHRlcm4gdm9pZCBub3V2ZWF1X2NoYW5uZWxfaWRsZShzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuKTsKIAogLyogbm91dmVhdV9vYmplY3QuYyAqLworI2RlZmluZSBOVk9CSl9DTEFTUyhkLGMsZSkgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlpbnQgcmV0ID0gbm91dmVhdV9ncHVvYmpfY2xhc3NfbmV3KChkKSwgKGMpLCBOVk9CSl9FTkdJTkVfIyNlKTsgICAgICAgIFwKKwlpZiAocmV0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJcmV0dXJuIHJldDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSgwKQorCisjZGVmaW5lIE5WT0JKX01USEQoZCxjLG0sZSkgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCWludCByZXQgPSBub3V2ZWF1X2dwdW9ial9tdGhkX25ldygoZCksIChjKSwgKG0pLCAoZSkpOyAgICAgICAgICAgICAgICAgXAorCWlmIChyZXQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQlyZXR1cm4gcmV0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlKDApCisKIGV4dGVybiBpbnQgIG5vdXZlYXVfZ3B1b2JqX2Vhcmx5X2luaXQoc3RydWN0IGRybV9kZXZpY2UgKik7CiBleHRlcm4gaW50ICBub3V2ZWF1X2dwdW9ial9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICopOwogZXh0ZXJuIHZvaWQgbm91dmVhdV9ncHVvYmpfdGFrZWRvd24oc3RydWN0IGRybV9kZXZpY2UgKik7CiBleHRlcm4gaW50ICBub3V2ZWF1X2dwdW9ial9zdXNwZW5kKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwotZXh0ZXJuIHZvaWQgbm91dmVhdV9ncHVvYmpfc3VzcGVuZF9jbGVhbnVwKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwogZXh0ZXJuIHZvaWQgbm91dmVhdV9ncHVvYmpfcmVzdW1lKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOworZXh0ZXJuIGludCAgbm91dmVhdV9ncHVvYmpfY2xhc3NfbmV3KHN0cnVjdCBkcm1fZGV2aWNlICosIHUzMiBjbGFzcywgdTMyIGVuZyk7CitleHRlcm4gaW50ICBub3V2ZWF1X2dwdW9ial9tdGhkX25ldyhzdHJ1Y3QgZHJtX2RldmljZSAqLCB1MzIgY2xhc3MsIHUzMiBtdGhkLAorCQkJCSAgICBpbnQgKCpleGVjKShzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICosCisJCQkJCSAgICAgICAgdTMyIGNsYXNzLCB1MzIgbXRoZCwgdTMyIGRhdGEpKTsKK2V4dGVybiBpbnQgIG5vdXZlYXVfZ3B1b2JqX210aGRfY2FsbChzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICosIHUzMiwgdTMyLCB1MzIpOworZXh0ZXJuIGludCAgbm91dmVhdV9ncHVvYmpfbXRoZF9jYWxsMihzdHJ1Y3QgZHJtX2RldmljZSAqLCBpbnQsIHUzMiwgdTMyLCB1MzIpOwogZXh0ZXJuIGludCBub3V2ZWF1X2dwdW9ial9jaGFubmVsX2luaXQoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqLAogCQkJCSAgICAgICB1aW50MzJfdCB2cmFtX2gsIHVpbnQzMl90IHR0X2gpOwogZXh0ZXJuIHZvaWQgbm91dmVhdV9ncHVvYmpfY2hhbm5lbF90YWtlZG93bihzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICopOwpAQCAtODMyLDIxICs5MTcsMjUgQEAKIGV4dGVybiBpbnQgbm91dmVhdV9ncHVvYmpfZG1hX25ldyhzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICosIGludCBjbGFzcywKIAkJCQkgIHVpbnQ2NF90IG9mZnNldCwgdWludDY0X3Qgc2l6ZSwgaW50IGFjY2VzcywKIAkJCQkgIGludCB0YXJnZXQsIHN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqKik7Ci1leHRlcm4gaW50IG5vdXZlYXVfZ3B1b2JqX2dhcnRfZG1hX25ldyhzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICosCi0JCQkJICAgICAgIHVpbnQ2NF90IG9mZnNldCwgdWludDY0X3Qgc2l6ZSwKLQkJCQkgICAgICAgaW50IGFjY2Vzcywgc3RydWN0IG5vdXZlYXVfZ3B1b2JqICoqLAotCQkJCSAgICAgICB1aW50MzJfdCAqb19yZXQpOwotZXh0ZXJuIGludCBub3V2ZWF1X2dwdW9ial9ncl9uZXcoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqLCBpbnQgY2xhc3MsCi0JCQkJIHN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqKik7Ci1leHRlcm4gaW50IG5vdXZlYXVfZ3B1b2JqX3N3X25ldyhzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICosIGludCBjbGFzcywKLQkJCQkgc3RydWN0IG5vdXZlYXVfZ3B1b2JqICoqKTsKK2V4dGVybiBpbnQgbm91dmVhdV9ncHVvYmpfZ3JfbmV3KHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKiwgdTMyIGhhbmRsZSwgaW50IGNsYXNzKTsKK2V4dGVybiBpbnQgbnY1MF9ncHVvYmpfZG1hX25ldyhzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICosIGludCBjbGFzcywgdTY0IGJhc2UsCisJCQkgICAgICAgdTY0IHNpemUsIGludCB0YXJnZXQsIGludCBhY2Nlc3MsIHUzMiB0eXBlLAorCQkJICAgICAgIHUzMiBjb21wLCBzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKipwb2JqKTsKK2V4dGVybiB2b2lkIG52NTBfZ3B1b2JqX2RtYV9pbml0KHN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqLCB1MzIgb2Zmc2V0LAorCQkJCSBpbnQgY2xhc3MsIHU2NCBiYXNlLCB1NjQgc2l6ZSwgaW50IHRhcmdldCwKKwkJCQkgaW50IGFjY2VzcywgdTMyIHR5cGUsIHUzMiBjb21wKTsKIGV4dGVybiBpbnQgbm91dmVhdV9pb2N0bF9ncm9ial9hbGxvYyhzdHJ1Y3QgZHJtX2RldmljZSAqLCB2b2lkICpkYXRhLAogCQkJCSAgICAgc3RydWN0IGRybV9maWxlICopOwogZXh0ZXJuIGludCBub3V2ZWF1X2lvY3RsX2dwdW9ial9mcmVlKHN0cnVjdCBkcm1fZGV2aWNlICosIHZvaWQgKmRhdGEsCiAJCQkJICAgICBzdHJ1Y3QgZHJtX2ZpbGUgKik7CiAKIC8qIG5vdXZlYXVfaXJxLmMgKi8KK2V4dGVybiBpbnQgICAgICAgICBub3V2ZWF1X2lycV9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICopOworZXh0ZXJuIHZvaWQgICAgICAgIG5vdXZlYXVfaXJxX2Zpbmkoc3RydWN0IGRybV9kZXZpY2UgKik7CiBleHRlcm4gaXJxcmV0dXJuX3Qgbm91dmVhdV9pcnFfaGFuZGxlcihEUk1fSVJRX0FSR1MpOworZXh0ZXJuIHZvaWQgICAgICAgIG5vdXZlYXVfaXJxX3JlZ2lzdGVyKHN0cnVjdCBkcm1fZGV2aWNlICosIGludCBzdGF0dXNfYml0LAorCQkJCQl2b2lkICgqKShzdHJ1Y3QgZHJtX2RldmljZSAqKSk7CitleHRlcm4gdm9pZCAgICAgICAgbm91dmVhdV9pcnFfdW5yZWdpc3RlcihzdHJ1Y3QgZHJtX2RldmljZSAqLCBpbnQgc3RhdHVzX2JpdCk7CiBleHRlcm4gdm9pZCAgICAgICAgbm91dmVhdV9pcnFfcHJlaW5zdGFsbChzdHJ1Y3QgZHJtX2RldmljZSAqKTsKIGV4dGVybiBpbnQgICAgICAgICBub3V2ZWF1X2lycV9wb3N0aW5zdGFsbChzdHJ1Y3QgZHJtX2RldmljZSAqKTsKIGV4dGVybiB2b2lkICAgICAgICBub3V2ZWF1X2lycV91bmluc3RhbGwoc3RydWN0IGRybV9kZXZpY2UgKik7CkBAIC04NTQsOCArOTQzLDggQEAKIC8qIG5vdXZlYXVfc2dkbWEuYyAqLwogZXh0ZXJuIGludCBub3V2ZWF1X3NnZG1hX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKik7CiBleHRlcm4gdm9pZCBub3V2ZWF1X3NnZG1hX3Rha2Vkb3duKHN0cnVjdCBkcm1fZGV2aWNlICopOwotZXh0ZXJuIGludCBub3V2ZWF1X3NnZG1hX2dldF9wYWdlKHN0cnVjdCBkcm1fZGV2aWNlICosIHVpbnQzMl90IG9mZnNldCwKLQkJCQkgIHVpbnQzMl90ICpwYWdlKTsKK2V4dGVybiB1aW50MzJfdCBub3V2ZWF1X3NnZG1hX2dldF9waHlzaWNhbChzdHJ1Y3QgZHJtX2RldmljZSAqLAorCQkJCQkgICB1aW50MzJfdCBvZmZzZXQpOwogZXh0ZXJuIHN0cnVjdCB0dG1fYmFja2VuZCAqbm91dmVhdV9zZ2RtYV9pbml0X3R0bShzdHJ1Y3QgZHJtX2RldmljZSAqKTsKIAogLyogbm91dmVhdV9kZWJ1Z2ZzLmMgKi8KQEAgLTk2NiwxOCArMTA1NSwyNSBAQAogLyogbnYxMF9mYi5jICovCiBleHRlcm4gaW50ICBudjEwX2ZiX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKik7CiBleHRlcm4gdm9pZCBudjEwX2ZiX3Rha2Vkb3duKHN0cnVjdCBkcm1fZGV2aWNlICopOwotZXh0ZXJuIHZvaWQgbnYxMF9mYl9zZXRfcmVnaW9uX3RpbGluZyhzdHJ1Y3QgZHJtX2RldmljZSAqLCBpbnQsIHVpbnQzMl90LAotCQkJCSAgICAgIHVpbnQzMl90LCB1aW50MzJfdCk7CitleHRlcm4gdm9pZCBudjEwX2ZiX2luaXRfdGlsZV9yZWdpb24oc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGksCisJCQkJICAgICB1aW50MzJfdCBhZGRyLCB1aW50MzJfdCBzaXplLAorCQkJCSAgICAgdWludDMyX3QgcGl0Y2gsIHVpbnQzMl90IGZsYWdzKTsKK2V4dGVybiB2b2lkIG52MTBfZmJfc2V0X3RpbGVfcmVnaW9uKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBpKTsKK2V4dGVybiB2b2lkIG52MTBfZmJfZnJlZV90aWxlX3JlZ2lvbihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgaSk7CiAKIC8qIG52MzBfZmIuYyAqLwogZXh0ZXJuIGludCAgbnYzMF9mYl9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICopOwogZXh0ZXJuIHZvaWQgbnYzMF9mYl90YWtlZG93bihzdHJ1Y3QgZHJtX2RldmljZSAqKTsKK2V4dGVybiB2b2lkIG52MzBfZmJfaW5pdF90aWxlX3JlZ2lvbihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgaSwKKwkJCQkgICAgIHVpbnQzMl90IGFkZHIsIHVpbnQzMl90IHNpemUsCisJCQkJICAgICB1aW50MzJfdCBwaXRjaCwgdWludDMyX3QgZmxhZ3MpOworZXh0ZXJuIHZvaWQgbnYzMF9mYl9mcmVlX3RpbGVfcmVnaW9uKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBpKTsKIAogLyogbnY0MF9mYi5jICovCiBleHRlcm4gaW50ICBudjQwX2ZiX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKik7CiBleHRlcm4gdm9pZCBudjQwX2ZiX3Rha2Vkb3duKHN0cnVjdCBkcm1fZGV2aWNlICopOwotZXh0ZXJuIHZvaWQgbnY0MF9mYl9zZXRfcmVnaW9uX3RpbGluZyhzdHJ1Y3QgZHJtX2RldmljZSAqLCBpbnQsIHVpbnQzMl90LAotCQkJCSAgICAgIHVpbnQzMl90LCB1aW50MzJfdCk7CitleHRlcm4gdm9pZCBudjQwX2ZiX3NldF90aWxlX3JlZ2lvbihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgaSk7CisKIC8qIG52NTBfZmIuYyAqLwogZXh0ZXJuIGludCAgbnY1MF9mYl9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICopOwogZXh0ZXJuIHZvaWQgbnY1MF9mYl90YWtlZG93bihzdHJ1Y3QgZHJtX2RldmljZSAqKTsKQEAgLTk4OSw2ICsxMDg1LDcgQEAKIAogLyogbnYwNF9maWZvLmMgKi8KIGV4dGVybiBpbnQgIG52MDRfZmlmb19pbml0KHN0cnVjdCBkcm1fZGV2aWNlICopOworZXh0ZXJuIHZvaWQgbnYwNF9maWZvX2Zpbmkoc3RydWN0IGRybV9kZXZpY2UgKik7CiBleHRlcm4gdm9pZCBudjA0X2ZpZm9fZGlzYWJsZShzdHJ1Y3QgZHJtX2RldmljZSAqKTsKIGV4dGVybiB2b2lkIG52MDRfZmlmb19lbmFibGUoc3RydWN0IGRybV9kZXZpY2UgKik7CiBleHRlcm4gYm9vbCBudjA0X2ZpZm9fcmVhc3NpZ24oc3RydWN0IGRybV9kZXZpY2UgKiwgYm9vbCk7CkBAIC05OTgsMTkgKzEwOTUsMTggQEAKIGV4dGVybiB2b2lkIG52MDRfZmlmb19kZXN0cm95X2NvbnRleHQoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqKTsKIGV4dGVybiBpbnQgIG52MDRfZmlmb19sb2FkX2NvbnRleHQoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqKTsKIGV4dGVybiBpbnQgIG52MDRfZmlmb191bmxvYWRfY29udGV4dChzdHJ1Y3QgZHJtX2RldmljZSAqKTsKK2V4dGVybiB2b2lkIG52MDRfZmlmb19pc3Ioc3RydWN0IGRybV9kZXZpY2UgKik7CiAKIC8qIG52MTBfZmlmby5jICovCiBleHRlcm4gaW50ICBudjEwX2ZpZm9faW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqKTsKIGV4dGVybiBpbnQgIG52MTBfZmlmb19jaGFubmVsX2lkKHN0cnVjdCBkcm1fZGV2aWNlICopOwogZXh0ZXJuIGludCAgbnYxMF9maWZvX2NyZWF0ZV9jb250ZXh0KHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKik7Ci1leHRlcm4gdm9pZCBudjEwX2ZpZm9fZGVzdHJveV9jb250ZXh0KHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKik7CiBleHRlcm4gaW50ICBudjEwX2ZpZm9fbG9hZF9jb250ZXh0KHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKik7CiBleHRlcm4gaW50ICBudjEwX2ZpZm9fdW5sb2FkX2NvbnRleHQoc3RydWN0IGRybV9kZXZpY2UgKik7CiAKIC8qIG52NDBfZmlmby5jICovCiBleHRlcm4gaW50ICBudjQwX2ZpZm9faW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqKTsKIGV4dGVybiBpbnQgIG52NDBfZmlmb19jcmVhdGVfY29udGV4dChzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICopOwotZXh0ZXJuIHZvaWQgbnY0MF9maWZvX2Rlc3Ryb3lfY29udGV4dChzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICopOwogZXh0ZXJuIGludCAgbnY0MF9maWZvX2xvYWRfY29udGV4dChzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICopOwogZXh0ZXJuIGludCAgbnY0MF9maWZvX3VubG9hZF9jb250ZXh0KHN0cnVjdCBkcm1fZGV2aWNlICopOwogCkBAIC0xMDM4LDcgKzExMzQsNiBAQAogZXh0ZXJuIGludCAgbnZjMF9maWZvX3VubG9hZF9jb250ZXh0KHN0cnVjdCBkcm1fZGV2aWNlICopOwogCiAvKiBudjA0X2dyYXBoLmMgKi8KLWV4dGVybiBzdHJ1Y3Qgbm91dmVhdV9wZ3JhcGhfb2JqZWN0X2NsYXNzIG52MDRfZ3JhcGhfZ3JjbGFzc1tdOwogZXh0ZXJuIGludCAgbnYwNF9ncmFwaF9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICopOwogZXh0ZXJuIHZvaWQgbnYwNF9ncmFwaF90YWtlZG93bihzdHJ1Y3QgZHJtX2RldmljZSAqKTsKIGV4dGVybiB2b2lkIG52MDRfZ3JhcGhfZmlmb19hY2Nlc3Moc3RydWN0IGRybV9kZXZpY2UgKiwgYm9vbCk7CkBAIC0xMDQ3LDEwICsxMTQyLDExIEBACiBleHRlcm4gdm9pZCBudjA0X2dyYXBoX2Rlc3Ryb3lfY29udGV4dChzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICopOwogZXh0ZXJuIGludCAgbnYwNF9ncmFwaF9sb2FkX2NvbnRleHQoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqKTsKIGV4dGVybiBpbnQgIG52MDRfZ3JhcGhfdW5sb2FkX2NvbnRleHQoc3RydWN0IGRybV9kZXZpY2UgKik7Ci1leHRlcm4gdm9pZCBudjA0X2dyYXBoX2NvbnRleHRfc3dpdGNoKHN0cnVjdCBkcm1fZGV2aWNlICopOworZXh0ZXJuIGludCAgbnYwNF9ncmFwaF9tdGhkX3BhZ2VfZmxpcChzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuLAorCQkJCSAgICAgIHUzMiBjbGFzcywgdTMyIG10aGQsIHUzMiBkYXRhKTsKK2V4dGVybiBzdHJ1Y3Qgbm91dmVhdV9iaXRmaWVsZCBudjA0X2dyYXBoX25zb3VyY2VbXTsKIAogLyogbnYxMF9ncmFwaC5jICovCi1leHRlcm4gc3RydWN0IG5vdXZlYXVfcGdyYXBoX29iamVjdF9jbGFzcyBudjEwX2dyYXBoX2dyY2xhc3NbXTsKIGV4dGVybiBpbnQgIG52MTBfZ3JhcGhfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqKTsKIGV4dGVybiB2b2lkIG52MTBfZ3JhcGhfdGFrZWRvd24oc3RydWN0IGRybV9kZXZpY2UgKik7CiBleHRlcm4gc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqbnYxMF9ncmFwaF9jaGFubmVsKHN0cnVjdCBkcm1fZGV2aWNlICopOwpAQCAtMTA1OCwxMyArMTE1NCwxMSBAQAogZXh0ZXJuIHZvaWQgbnYxMF9ncmFwaF9kZXN0cm95X2NvbnRleHQoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqKTsKIGV4dGVybiBpbnQgIG52MTBfZ3JhcGhfbG9hZF9jb250ZXh0KHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKik7CiBleHRlcm4gaW50ICBudjEwX2dyYXBoX3VubG9hZF9jb250ZXh0KHN0cnVjdCBkcm1fZGV2aWNlICopOwotZXh0ZXJuIHZvaWQgbnYxMF9ncmFwaF9jb250ZXh0X3N3aXRjaChzdHJ1Y3QgZHJtX2RldmljZSAqKTsKLWV4dGVybiB2b2lkIG52MTBfZ3JhcGhfc2V0X3JlZ2lvbl90aWxpbmcoc3RydWN0IGRybV9kZXZpY2UgKiwgaW50LCB1aW50MzJfdCwKLQkJCQkJIHVpbnQzMl90LCB1aW50MzJfdCk7CitleHRlcm4gdm9pZCBudjEwX2dyYXBoX3NldF90aWxlX3JlZ2lvbihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgaSk7CitleHRlcm4gc3RydWN0IG5vdXZlYXVfYml0ZmllbGQgbnYxMF9ncmFwaF9pbnRyW107CitleHRlcm4gc3RydWN0IG5vdXZlYXVfYml0ZmllbGQgbnYxMF9ncmFwaF9uc3RhdHVzW107CiAKIC8qIG52MjBfZ3JhcGguYyAqLwotZXh0ZXJuIHN0cnVjdCBub3V2ZWF1X3BncmFwaF9vYmplY3RfY2xhc3MgbnYyMF9ncmFwaF9ncmNsYXNzW107Ci1leHRlcm4gc3RydWN0IG5vdXZlYXVfcGdyYXBoX29iamVjdF9jbGFzcyBudjMwX2dyYXBoX2dyY2xhc3NbXTsKIGV4dGVybiBpbnQgIG52MjBfZ3JhcGhfY3JlYXRlX2NvbnRleHQoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqKTsKIGV4dGVybiB2b2lkIG52MjBfZ3JhcGhfZGVzdHJveV9jb250ZXh0KHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKik7CiBleHRlcm4gaW50ICBudjIwX2dyYXBoX2xvYWRfY29udGV4dChzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICopOwpAQCAtMTA3MiwxMSArMTE2Niw5IEBACiBleHRlcm4gaW50ICBudjIwX2dyYXBoX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKik7CiBleHRlcm4gdm9pZCBudjIwX2dyYXBoX3Rha2Vkb3duKHN0cnVjdCBkcm1fZGV2aWNlICopOwogZXh0ZXJuIGludCAgbnYzMF9ncmFwaF9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICopOwotZXh0ZXJuIHZvaWQgbnYyMF9ncmFwaF9zZXRfcmVnaW9uX3RpbGluZyhzdHJ1Y3QgZHJtX2RldmljZSAqLCBpbnQsIHVpbnQzMl90LAotCQkJCQkgdWludDMyX3QsIHVpbnQzMl90KTsKK2V4dGVybiB2b2lkIG52MjBfZ3JhcGhfc2V0X3RpbGVfcmVnaW9uKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBpKTsKIAogLyogbnY0MF9ncmFwaC5jICovCi1leHRlcm4gc3RydWN0IG5vdXZlYXVfcGdyYXBoX29iamVjdF9jbGFzcyBudjQwX2dyYXBoX2dyY2xhc3NbXTsKIGV4dGVybiBpbnQgIG52NDBfZ3JhcGhfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqKTsKIGV4dGVybiB2b2lkIG52NDBfZ3JhcGhfdGFrZWRvd24oc3RydWN0IGRybV9kZXZpY2UgKik7CiBleHRlcm4gc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqbnY0MF9ncmFwaF9jaGFubmVsKHN0cnVjdCBkcm1fZGV2aWNlICopOwpAQCAtMTA4NSwxMSArMTE3Nyw5IEBACiBleHRlcm4gaW50ICBudjQwX2dyYXBoX2xvYWRfY29udGV4dChzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICopOwogZXh0ZXJuIGludCAgbnY0MF9ncmFwaF91bmxvYWRfY29udGV4dChzdHJ1Y3QgZHJtX2RldmljZSAqKTsKIGV4dGVybiB2b2lkIG52NDBfZ3JjdHhfaW5pdChzdHJ1Y3Qgbm91dmVhdV9ncmN0eCAqKTsKLWV4dGVybiB2b2lkIG52NDBfZ3JhcGhfc2V0X3JlZ2lvbl90aWxpbmcoc3RydWN0IGRybV9kZXZpY2UgKiwgaW50LCB1aW50MzJfdCwKLQkJCQkJIHVpbnQzMl90LCB1aW50MzJfdCk7CitleHRlcm4gdm9pZCBudjQwX2dyYXBoX3NldF90aWxlX3JlZ2lvbihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgaSk7CiAKIC8qIG52NTBfZ3JhcGguYyAqLwotZXh0ZXJuIHN0cnVjdCBub3V2ZWF1X3BncmFwaF9vYmplY3RfY2xhc3MgbnY1MF9ncmFwaF9ncmNsYXNzW107CiBleHRlcm4gaW50ICBudjUwX2dyYXBoX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKik7CiBleHRlcm4gdm9pZCBudjUwX2dyYXBoX3Rha2Vkb3duKHN0cnVjdCBkcm1fZGV2aWNlICopOwogZXh0ZXJuIHZvaWQgbnY1MF9ncmFwaF9maWZvX2FjY2VzcyhzdHJ1Y3QgZHJtX2RldmljZSAqLCBib29sKTsKQEAgLTEwOTgsMTAgKzExODgsMTAgQEAKIGV4dGVybiB2b2lkIG52NTBfZ3JhcGhfZGVzdHJveV9jb250ZXh0KHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKik7CiBleHRlcm4gaW50ICBudjUwX2dyYXBoX2xvYWRfY29udGV4dChzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICopOwogZXh0ZXJuIGludCAgbnY1MF9ncmFwaF91bmxvYWRfY29udGV4dChzdHJ1Y3QgZHJtX2RldmljZSAqKTsKLWV4dGVybiB2b2lkIG52NTBfZ3JhcGhfY29udGV4dF9zd2l0Y2goc3RydWN0IGRybV9kZXZpY2UgKik7CiBleHRlcm4gaW50ICBudjUwX2dyY3R4X2luaXQoc3RydWN0IG5vdXZlYXVfZ3JjdHggKik7CiBleHRlcm4gdm9pZCBudjUwX2dyYXBoX3RsYl9mbHVzaChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKIGV4dGVybiB2b2lkIG52ODZfZ3JhcGhfdGxiX2ZsdXNoKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOworZXh0ZXJuIHN0cnVjdCBub3V2ZWF1X2VudW0gbnY1MF9kYXRhX2Vycm9yX25hbWVzW107CiAKIC8qIG52YzBfZ3JhcGguYyAqLwogZXh0ZXJuIGludCAgbnZjMF9ncmFwaF9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICopOwpAQCAtMTExMywxNiArMTIwMywyMiBAQAogZXh0ZXJuIGludCAgbnZjMF9ncmFwaF9sb2FkX2NvbnRleHQoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqKTsKIGV4dGVybiBpbnQgIG52YzBfZ3JhcGhfdW5sb2FkX2NvbnRleHQoc3RydWN0IGRybV9kZXZpY2UgKik7CiAKKy8qIG52ODRfY3J5cHQuYyAqLworZXh0ZXJuIGludCAgbnY4NF9jcnlwdF9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOworZXh0ZXJuIHZvaWQgbnY4NF9jcnlwdF9maW5pKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOworZXh0ZXJuIGludCAgbnY4NF9jcnlwdF9jcmVhdGVfY29udGV4dChzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICopOworZXh0ZXJuIHZvaWQgbnY4NF9jcnlwdF9kZXN0cm95X2NvbnRleHQoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqKTsKK2V4dGVybiB2b2lkIG52ODRfY3J5cHRfdGxiX2ZsdXNoKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOworCiAvKiBudjA0X2luc3RtZW0uYyAqLwogZXh0ZXJuIGludCAgbnYwNF9pbnN0bWVtX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKik7CiBleHRlcm4gdm9pZCBudjA0X2luc3RtZW1fdGFrZWRvd24oc3RydWN0IGRybV9kZXZpY2UgKik7CiBleHRlcm4gaW50ICBudjA0X2luc3RtZW1fc3VzcGVuZChzdHJ1Y3QgZHJtX2RldmljZSAqKTsKIGV4dGVybiB2b2lkIG52MDRfaW5zdG1lbV9yZXN1bWUoc3RydWN0IGRybV9kZXZpY2UgKik7Ci1leHRlcm4gaW50ICBudjA0X2luc3RtZW1fcG9wdWxhdGUoc3RydWN0IGRybV9kZXZpY2UgKiwgc3RydWN0IG5vdXZlYXVfZ3B1b2JqICosCi0JCQkJICB1aW50MzJfdCAqc2l6ZSk7Ci1leHRlcm4gdm9pZCBudjA0X2luc3RtZW1fY2xlYXIoc3RydWN0IGRybV9kZXZpY2UgKiwgc3RydWN0IG5vdXZlYXVfZ3B1b2JqICopOwotZXh0ZXJuIGludCAgbnYwNF9pbnN0bWVtX2JpbmQoc3RydWN0IGRybV9kZXZpY2UgKiwgc3RydWN0IG5vdXZlYXVfZ3B1b2JqICopOwotZXh0ZXJuIGludCAgbnYwNF9pbnN0bWVtX3VuYmluZChzdHJ1Y3QgZHJtX2RldmljZSAqLCBzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKik7CitleHRlcm4gaW50ICBudjA0X2luc3RtZW1fZ2V0KHN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqLCB1MzIgc2l6ZSwgdTMyIGFsaWduKTsKK2V4dGVybiB2b2lkIG52MDRfaW5zdG1lbV9wdXQoc3RydWN0IG5vdXZlYXVfZ3B1b2JqICopOworZXh0ZXJuIGludCAgbnYwNF9pbnN0bWVtX21hcChzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKik7CitleHRlcm4gdm9pZCBudjA0X2luc3RtZW1fdW5tYXAoc3RydWN0IG5vdXZlYXVfZ3B1b2JqICopOwogZXh0ZXJuIHZvaWQgbnYwNF9pbnN0bWVtX2ZsdXNoKHN0cnVjdCBkcm1fZGV2aWNlICopOwogCiAvKiBudjUwX2luc3RtZW0uYyAqLwpAQCAtMTEzMCwyNiArMTIyNiwxOCBAQAogZXh0ZXJuIHZvaWQgbnY1MF9pbnN0bWVtX3Rha2Vkb3duKHN0cnVjdCBkcm1fZGV2aWNlICopOwogZXh0ZXJuIGludCAgbnY1MF9pbnN0bWVtX3N1c3BlbmQoc3RydWN0IGRybV9kZXZpY2UgKik7CiBleHRlcm4gdm9pZCBudjUwX2luc3RtZW1fcmVzdW1lKHN0cnVjdCBkcm1fZGV2aWNlICopOwotZXh0ZXJuIGludCAgbnY1MF9pbnN0bWVtX3BvcHVsYXRlKHN0cnVjdCBkcm1fZGV2aWNlICosIHN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqLAotCQkJCSAgdWludDMyX3QgKnNpemUpOwotZXh0ZXJuIHZvaWQgbnY1MF9pbnN0bWVtX2NsZWFyKHN0cnVjdCBkcm1fZGV2aWNlICosIHN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqKTsKLWV4dGVybiBpbnQgIG52NTBfaW5zdG1lbV9iaW5kKHN0cnVjdCBkcm1fZGV2aWNlICosIHN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqKTsKLWV4dGVybiBpbnQgIG52NTBfaW5zdG1lbV91bmJpbmQoc3RydWN0IGRybV9kZXZpY2UgKiwgc3RydWN0IG5vdXZlYXVfZ3B1b2JqICopOworZXh0ZXJuIGludCAgbnY1MF9pbnN0bWVtX2dldChzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKiwgdTMyIHNpemUsIHUzMiBhbGlnbik7CitleHRlcm4gdm9pZCBudjUwX2luc3RtZW1fcHV0KHN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqKTsKK2V4dGVybiBpbnQgIG52NTBfaW5zdG1lbV9tYXAoc3RydWN0IG5vdXZlYXVfZ3B1b2JqICopOworZXh0ZXJuIHZvaWQgbnY1MF9pbnN0bWVtX3VubWFwKHN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqKTsKIGV4dGVybiB2b2lkIG52NTBfaW5zdG1lbV9mbHVzaChzdHJ1Y3QgZHJtX2RldmljZSAqKTsKIGV4dGVybiB2b2lkIG52ODRfaW5zdG1lbV9mbHVzaChzdHJ1Y3QgZHJtX2RldmljZSAqKTsKLWV4dGVybiB2b2lkIG52NTBfdm1fZmx1c2goc3RydWN0IGRybV9kZXZpY2UgKiwgaW50IGVuZ2luZSk7CiAKIC8qIG52YzBfaW5zdG1lbS5jICovCiBleHRlcm4gaW50ICBudmMwX2luc3RtZW1faW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqKTsKIGV4dGVybiB2b2lkIG52YzBfaW5zdG1lbV90YWtlZG93bihzdHJ1Y3QgZHJtX2RldmljZSAqKTsKIGV4dGVybiBpbnQgIG52YzBfaW5zdG1lbV9zdXNwZW5kKHN0cnVjdCBkcm1fZGV2aWNlICopOwogZXh0ZXJuIHZvaWQgbnZjMF9pbnN0bWVtX3Jlc3VtZShzdHJ1Y3QgZHJtX2RldmljZSAqKTsKLWV4dGVybiBpbnQgIG52YzBfaW5zdG1lbV9wb3B1bGF0ZShzdHJ1Y3QgZHJtX2RldmljZSAqLCBzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKiwKLQkJCQkgIHVpbnQzMl90ICpzaXplKTsKLWV4dGVybiB2b2lkIG52YzBfaW5zdG1lbV9jbGVhcihzdHJ1Y3QgZHJtX2RldmljZSAqLCBzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKik7Ci1leHRlcm4gaW50ICBudmMwX2luc3RtZW1fYmluZChzdHJ1Y3QgZHJtX2RldmljZSAqLCBzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKik7Ci1leHRlcm4gaW50ICBudmMwX2luc3RtZW1fdW5iaW5kKHN0cnVjdCBkcm1fZGV2aWNlICosIHN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqKTsKLWV4dGVybiB2b2lkIG52YzBfaW5zdG1lbV9mbHVzaChzdHJ1Y3QgZHJtX2RldmljZSAqKTsKIAogLyogbnYwNF9tYy5jICovCiBleHRlcm4gaW50ICBudjA0X21jX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKik7CkBAIC0xMjE5LDYgKzEzMDcsOSBAQAogZXh0ZXJuIHZvaWQgbm91dmVhdV9ib193cjE2KHN0cnVjdCBub3V2ZWF1X2JvICpudmJvLCB1bnNpZ25lZCBpbmRleCwgdTE2IHZhbCk7CiBleHRlcm4gdTMyIG5vdXZlYXVfYm9fcmQzMihzdHJ1Y3Qgbm91dmVhdV9ibyAqbnZibywgdW5zaWduZWQgaW5kZXgpOwogZXh0ZXJuIHZvaWQgbm91dmVhdV9ib193cjMyKHN0cnVjdCBub3V2ZWF1X2JvICpudmJvLCB1bnNpZ25lZCBpbmRleCwgdTMyIHZhbCk7CitleHRlcm4gdm9pZCBub3V2ZWF1X2JvX2ZlbmNlKHN0cnVjdCBub3V2ZWF1X2JvICosIHN0cnVjdCBub3V2ZWF1X2ZlbmNlICopOworZXh0ZXJuIGludCBub3V2ZWF1X2JvX3ZhbGlkYXRlKHN0cnVjdCBub3V2ZWF1X2JvICosIGJvb2wgaW50ZXJydXB0aWJsZSwKKwkJCSAgICAgICBib29sIG5vX3dhaXRfcmVzZXJ2ZSwgYm9vbCBub193YWl0X2dwdSk7CiAKIC8qIG5vdXZlYXVfZmVuY2UuYyAqLwogc3RydWN0IG5vdXZlYXVfZmVuY2U7CkBAIC0xMjM0LDEyICsxMzI1LDM1IEBACiAJCQkgICAgICAgdm9pZCAoKndvcmspKHZvaWQgKnByaXYsIGJvb2wgc2lnbmFsbGVkKSwKIAkJCSAgICAgICB2b2lkICpwcml2KTsKIHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKm5vdXZlYXVfZmVuY2VfY2hhbm5lbChzdHJ1Y3Qgbm91dmVhdV9mZW5jZSAqKTsKLWV4dGVybiBib29sIG5vdXZlYXVfZmVuY2Vfc2lnbmFsbGVkKHZvaWQgKm9iaiwgdm9pZCAqYXJnKTsKLWV4dGVybiBpbnQgbm91dmVhdV9mZW5jZV93YWl0KHZvaWQgKm9iaiwgdm9pZCAqYXJnLCBib29sIGxhenksIGJvb2wgaW50cik7CisKK2V4dGVybiBib29sIF9fbm91dmVhdV9mZW5jZV9zaWduYWxsZWQodm9pZCAqb2JqLCB2b2lkICphcmcpOworZXh0ZXJuIGludCBfX25vdXZlYXVfZmVuY2Vfd2FpdCh2b2lkICpvYmosIHZvaWQgKmFyZywgYm9vbCBsYXp5LCBib29sIGludHIpOworZXh0ZXJuIGludCBfX25vdXZlYXVfZmVuY2VfZmx1c2godm9pZCAqb2JqLCB2b2lkICphcmcpOworZXh0ZXJuIHZvaWQgX19ub3V2ZWF1X2ZlbmNlX3VucmVmKHZvaWQgKipvYmopOworZXh0ZXJuIHZvaWQgKl9fbm91dmVhdV9mZW5jZV9yZWYodm9pZCAqb2JqKTsKKworc3RhdGljIGlubGluZSBib29sIG5vdXZlYXVfZmVuY2Vfc2lnbmFsbGVkKHN0cnVjdCBub3V2ZWF1X2ZlbmNlICpvYmopCit7CisJcmV0dXJuIF9fbm91dmVhdV9mZW5jZV9zaWduYWxsZWQob2JqLCBOVUxMKTsKK30KK3N0YXRpYyBpbmxpbmUgaW50Citub3V2ZWF1X2ZlbmNlX3dhaXQoc3RydWN0IG5vdXZlYXVfZmVuY2UgKm9iaiwgYm9vbCBsYXp5LCBib29sIGludHIpCit7CisJcmV0dXJuIF9fbm91dmVhdV9mZW5jZV93YWl0KG9iaiwgTlVMTCwgbGF6eSwgaW50cik7Cit9CiBleHRlcm4gaW50IG5vdXZlYXVfZmVuY2Vfc3luYyhzdHJ1Y3Qgbm91dmVhdV9mZW5jZSAqLCBzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICopOwotZXh0ZXJuIGludCBub3V2ZWF1X2ZlbmNlX2ZsdXNoKHZvaWQgKm9iaiwgdm9pZCAqYXJnKTsKLWV4dGVybiB2b2lkIG5vdXZlYXVfZmVuY2VfdW5yZWYodm9pZCAqKm9iaik7Ci1leHRlcm4gdm9pZCAqbm91dmVhdV9mZW5jZV9yZWYodm9pZCAqb2JqKTsKK3N0YXRpYyBpbmxpbmUgaW50IG5vdXZlYXVfZmVuY2VfZmx1c2goc3RydWN0IG5vdXZlYXVfZmVuY2UgKm9iaikKK3sKKwlyZXR1cm4gX19ub3V2ZWF1X2ZlbmNlX2ZsdXNoKG9iaiwgTlVMTCk7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgbm91dmVhdV9mZW5jZV91bnJlZihzdHJ1Y3Qgbm91dmVhdV9mZW5jZSAqKm9iaikKK3sKKwlfX25vdXZlYXVfZmVuY2VfdW5yZWYoKHZvaWQgKiopb2JqKTsKK30KK3N0YXRpYyBpbmxpbmUgc3RydWN0IG5vdXZlYXVfZmVuY2UgKm5vdXZlYXVfZmVuY2VfcmVmKHN0cnVjdCBub3V2ZWF1X2ZlbmNlICpvYmopCit7CisJcmV0dXJuIF9fbm91dmVhdV9mZW5jZV9yZWYob2JqKTsKK30KIAogLyogbm91dmVhdV9nZW0uYyAqLwogZXh0ZXJuIGludCBub3V2ZWF1X2dlbV9uZXcoc3RydWN0IGRybV9kZXZpY2UgKiwgc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqLApAQCAtMTI1OSwxNSArMTM3MywyOCBAQAogZXh0ZXJuIGludCBub3V2ZWF1X2dlbV9pb2N0bF9pbmZvKHN0cnVjdCBkcm1fZGV2aWNlICosIHZvaWQgKiwKIAkJCQkgIHN0cnVjdCBkcm1fZmlsZSAqKTsKIAorLyogbm91dmVhdV9kaXNwbGF5LmMgKi8KK2ludCBub3V2ZWF1X3ZibGFua19lbmFibGUoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGNydGMpOwordm9pZCBub3V2ZWF1X3ZibGFua19kaXNhYmxlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBjcnRjKTsKK2ludCBub3V2ZWF1X2NydGNfcGFnZV9mbGlwKHN0cnVjdCBkcm1fY3J0YyAqY3J0Yywgc3RydWN0IGRybV9mcmFtZWJ1ZmZlciAqZmIsCisJCQkgICBzdHJ1Y3QgZHJtX3BlbmRpbmdfdmJsYW5rX2V2ZW50ICpldmVudCk7CitpbnQgbm91dmVhdV9maW5pc2hfcGFnZV9mbGlwKHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKiwKKwkJCSAgICAgc3RydWN0IG5vdXZlYXVfcGFnZV9mbGlwX3N0YXRlICopOworCiAvKiBudjEwX2dwaW8uYyAqLwogaW50IG52MTBfZ3Bpb19nZXQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgZW51bSBkY2JfZ3Bpb190YWcgdGFnKTsKIGludCBudjEwX2dwaW9fc2V0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGVudW0gZGNiX2dwaW9fdGFnIHRhZywgaW50IHN0YXRlKTsKIAogLyogbnY1MF9ncGlvLmMgKi8KIGludCBudjUwX2dwaW9faW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKK3ZvaWQgbnY1MF9ncGlvX2Zpbmkoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CiBpbnQgbnY1MF9ncGlvX2dldChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBlbnVtIGRjYl9ncGlvX3RhZyB0YWcpOwogaW50IG52NTBfZ3Bpb19zZXQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgZW51bSBkY2JfZ3Bpb190YWcgdGFnLCBpbnQgc3RhdGUpOwotdm9pZCBudjUwX2dwaW9faXJxX2VuYWJsZShzdHJ1Y3QgZHJtX2RldmljZSAqLCBlbnVtIGRjYl9ncGlvX3RhZywgYm9vbCBvbik7CitpbnQgIG52NTBfZ3Bpb19pcnFfcmVnaXN0ZXIoc3RydWN0IGRybV9kZXZpY2UgKiwgZW51bSBkY2JfZ3Bpb190YWcsCisJCQkgICAgdm9pZCAoKikodm9pZCAqLCBpbnQpLCB2b2lkICopOwordm9pZCBudjUwX2dwaW9faXJxX3VucmVnaXN0ZXIoc3RydWN0IGRybV9kZXZpY2UgKiwgZW51bSBkY2JfZ3Bpb190YWcsCisJCQkgICAgICB2b2lkICgqKSh2b2lkICosIGludCksIHZvaWQgKik7Citib29sIG52NTBfZ3Bpb19pcnFfZW5hYmxlKHN0cnVjdCBkcm1fZGV2aWNlICosIGVudW0gZGNiX2dwaW9fdGFnLCBib29sIG9uKTsKIAogLyogbnY1MF9jYWxjLiAqLwogaW50IG52NTBfY2FsY19wbGwoc3RydWN0IGRybV9kZXZpY2UgKiwgc3RydWN0IHBsbF9saW1zICosIGludCBjbGssCkBAIC0xMzM0LDcgKzE0NjEsOSBAQAogfQogCiAjZGVmaW5lIG52X3dhaXQoZGV2LCByZWcsIG1hc2ssIHZhbCkgXAotCW5vdXZlYXVfd2FpdF91bnRpbChkZXYsIDIwMDAwMDAwMDBVTEwsIChyZWcpLCAobWFzayksICh2YWwpKQorCW5vdXZlYXVfd2FpdF9lcShkZXYsIDIwMDAwMDAwMDBVTEwsIChyZWcpLCAobWFzayksICh2YWwpKQorI2RlZmluZSBudl93YWl0X25lKGRldiwgcmVnLCBtYXNrLCB2YWwpIFwKKwlub3V2ZWF1X3dhaXRfbmUoZGV2LCAyMDAwMDAwMDAwVUxMLCAocmVnKSwgKG1hc2spLCAodmFsKSkKIAogLyogUFJBTUlOIGFjY2VzcyAqLwogc3RhdGljIGlubGluZSB1MzIgbnZfcmkzMihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1bnNpZ25lZCBvZmZzZXQpCkBAIC0xNDQ3LDYgKzE1NzYsMjMgQEAKIAkJZGV2LT5wZGV2LT5zdWJzeXN0ZW1fZGV2aWNlID09IHN1Yl9kZXZpY2U7CiB9CiAKKy8qIG1lbW9yeSB0eXBlL2FjY2VzcyBmbGFncywgZG8gbm90IG1hdGNoIGhhcmR3YXJlIHZhbHVlcyAqLworI2RlZmluZSBOVl9NRU1fQUNDRVNTX1JPICAxCisjZGVmaW5lIE5WX01FTV9BQ0NFU1NfV08gIDIKKyNkZWZpbmUgTlZfTUVNX0FDQ0VTU19SVyAoTlZfTUVNX0FDQ0VTU19STyB8IE5WX01FTV9BQ0NFU1NfV08pCisjZGVmaW5lIE5WX01FTV9BQ0NFU1NfU1lTIDQKKyNkZWZpbmUgTlZfTUVNX0FDQ0VTU19WTSAgOAorCisjZGVmaW5lIE5WX01FTV9UQVJHRVRfVlJBTSAgICAgICAgMAorI2RlZmluZSBOVl9NRU1fVEFSR0VUX1BDSSAgICAgICAgIDEKKyNkZWZpbmUgTlZfTUVNX1RBUkdFVF9QQ0lfTk9TTk9PUCAyCisjZGVmaW5lIE5WX01FTV9UQVJHRVRfVk0gICAgICAgICAgMworI2RlZmluZSBOVl9NRU1fVEFSR0VUX0dBUlQgICAgICAgIDQKKworI2RlZmluZSBOVl9NRU1fVFlQRV9WTSAweDdmCisjZGVmaW5lIE5WX01FTV9DT01QX1ZNIDB4MDMKKworLyogTlZfU1cgb2JqZWN0IGNsYXNzICovCiAjZGVmaW5lIE5WX1NXICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDA1MDZlCiAjZGVmaW5lIE5WX1NXX0RNQV9TRU1BUEhPUkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDYwCiAjZGVmaW5lIE5WX1NXX1NFTUFQSE9SRV9PRkZTRVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDY0CkBAIC0xNDU3LDUgKzE2MDMsNiBAQAogI2RlZmluZSBOVl9TV19WQkxTRU1fT0ZGU0VUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQwMAogI2RlZmluZSBOVl9TV19WQkxTRU1fUkVMRUFTRV9WQUxVRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQwNAogI2RlZmluZSBOVl9TV19WQkxTRU1fUkVMRUFTRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQwOAorI2RlZmluZSBOVl9TV19QQUdFX0ZMSVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDUwMAogCiAjZW5kaWYgLyogX19OT1VWRUFVX0RSVl9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfZmJjb24uYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfZmJjb24uYwppbmRleCAwMmE0ZDFmLi5hMjZkMDQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2ZiY29uLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9mYmNvbi5jCkBAIC00OSw2ICs0OSwxMDIgQEAKICNpbmNsdWRlICJub3V2ZWF1X2ZiY29uLmgiCiAjaW5jbHVkZSAibm91dmVhdV9kbWEuaCIKIAorc3RhdGljIHZvaWQKK25vdXZlYXVfZmJjb25fZmlsbHJlY3Qoc3RydWN0IGZiX2luZm8gKmluZm8sIGNvbnN0IHN0cnVjdCBmYl9maWxscmVjdCAqcmVjdCkKK3sKKwlzdHJ1Y3Qgbm91dmVhdV9mYmRldiAqbmZiZGV2ID0gaW5mby0+cGFyOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBuZmJkZXYtPmRldjsKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWludCByZXQ7CisKKwlpZiAoaW5mby0+c3RhdGUgIT0gRkJJTkZPX1NUQVRFX1JVTk5JTkcpCisJCXJldHVybjsKKworCXJldCA9IC1FTk9ERVY7CisJaWYgKCFpbl9pbnRlcnJ1cHQoKSAmJiAhKGluZm8tPmZsYWdzICYgRkJJTkZPX0hXQUNDRUxfRElTQUJMRUQpICYmCisJICAgIG11dGV4X3RyeWxvY2soJmRldl9wcml2LT5jaGFubmVsLT5tdXRleCkpIHsKKwkJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPCBOVl81MCkKKwkJCXJldCA9IG52MDRfZmJjb25fZmlsbHJlY3QoaW5mbywgcmVjdCk7CisJCWVsc2UKKwkJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPCBOVl9DMCkKKwkJCXJldCA9IG52NTBfZmJjb25fZmlsbHJlY3QoaW5mbywgcmVjdCk7CisJCWVsc2UKKwkJCXJldCA9IG52YzBfZmJjb25fZmlsbHJlY3QoaW5mbywgcmVjdCk7CisJCW11dGV4X3VubG9jaygmZGV2X3ByaXYtPmNoYW5uZWwtPm11dGV4KTsKKwl9CisKKwlpZiAocmV0ID09IDApCisJCXJldHVybjsKKworCWlmIChyZXQgIT0gLUVOT0RFVikKKwkJbm91dmVhdV9mYmNvbl9ncHVfbG9ja3VwKGluZm8pOworCWNmYl9maWxscmVjdChpbmZvLCByZWN0KTsKK30KKworc3RhdGljIHZvaWQKK25vdXZlYXVfZmJjb25fY29weWFyZWEoc3RydWN0IGZiX2luZm8gKmluZm8sIGNvbnN0IHN0cnVjdCBmYl9jb3B5YXJlYSAqaW1hZ2UpCit7CisJc3RydWN0IG5vdXZlYXVfZmJkZXYgKm5mYmRldiA9IGluZm8tPnBhcjsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gbmZiZGV2LT5kZXY7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlpbnQgcmV0OworCisJaWYgKGluZm8tPnN0YXRlICE9IEZCSU5GT19TVEFURV9SVU5OSU5HKQorCQlyZXR1cm47CisKKwlyZXQgPSAtRU5PREVWOworCWlmICghaW5faW50ZXJydXB0KCkgJiYgIShpbmZvLT5mbGFncyAmIEZCSU5GT19IV0FDQ0VMX0RJU0FCTEVEKSAmJgorCSAgICBtdXRleF90cnlsb2NrKCZkZXZfcHJpdi0+Y2hhbm5lbC0+bXV0ZXgpKSB7CisJCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlIDwgTlZfNTApCisJCQlyZXQgPSBudjA0X2ZiY29uX2NvcHlhcmVhKGluZm8sIGltYWdlKTsKKwkJZWxzZQorCQlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA8IE5WX0MwKQorCQkJcmV0ID0gbnY1MF9mYmNvbl9jb3B5YXJlYShpbmZvLCBpbWFnZSk7CisJCWVsc2UKKwkJCXJldCA9IG52YzBfZmJjb25fY29weWFyZWEoaW5mbywgaW1hZ2UpOworCQltdXRleF91bmxvY2soJmRldl9wcml2LT5jaGFubmVsLT5tdXRleCk7CisJfQorCisJaWYgKHJldCA9PSAwKQorCQlyZXR1cm47CisKKwlpZiAocmV0ICE9IC1FTk9ERVYpCisJCW5vdXZlYXVfZmJjb25fZ3B1X2xvY2t1cChpbmZvKTsKKwljZmJfY29weWFyZWEoaW5mbywgaW1hZ2UpOworfQorCitzdGF0aWMgdm9pZAorbm91dmVhdV9mYmNvbl9pbWFnZWJsaXQoc3RydWN0IGZiX2luZm8gKmluZm8sIGNvbnN0IHN0cnVjdCBmYl9pbWFnZSAqaW1hZ2UpCit7CisJc3RydWN0IG5vdXZlYXVfZmJkZXYgKm5mYmRldiA9IGluZm8tPnBhcjsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gbmZiZGV2LT5kZXY7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlpbnQgcmV0OworCisJaWYgKGluZm8tPnN0YXRlICE9IEZCSU5GT19TVEFURV9SVU5OSU5HKQorCQlyZXR1cm47CisKKwlyZXQgPSAtRU5PREVWOworCWlmICghaW5faW50ZXJydXB0KCkgJiYgIShpbmZvLT5mbGFncyAmIEZCSU5GT19IV0FDQ0VMX0RJU0FCTEVEKSAmJgorCSAgICBtdXRleF90cnlsb2NrKCZkZXZfcHJpdi0+Y2hhbm5lbC0+bXV0ZXgpKSB7CisJCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlIDwgTlZfNTApCisJCQlyZXQgPSBudjA0X2ZiY29uX2ltYWdlYmxpdChpbmZvLCBpbWFnZSk7CisJCWVsc2UKKwkJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPCBOVl9DMCkKKwkJCXJldCA9IG52NTBfZmJjb25faW1hZ2VibGl0KGluZm8sIGltYWdlKTsKKwkJZWxzZQorCQkJcmV0ID0gbnZjMF9mYmNvbl9pbWFnZWJsaXQoaW5mbywgaW1hZ2UpOworCQltdXRleF91bmxvY2soJmRldl9wcml2LT5jaGFubmVsLT5tdXRleCk7CisJfQorCisJaWYgKHJldCA9PSAwKQorCQlyZXR1cm47CisKKwlpZiAocmV0ICE9IC1FTk9ERVYpCisJCW5vdXZlYXVfZmJjb25fZ3B1X2xvY2t1cChpbmZvKTsKKwljZmJfaW1hZ2VibGl0KGluZm8sIGltYWdlKTsKK30KKwogc3RhdGljIGludAogbm91dmVhdV9mYmNvbl9zeW5jKHN0cnVjdCBmYl9pbmZvICppbmZvKQogewpAQCAtNTgsMjIgKzE1NCwzNiBAQAogCXN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4gPSBkZXZfcHJpdi0+Y2hhbm5lbDsKIAlpbnQgcmV0LCBpOwogCi0JaWYgKCFjaGFuIHx8ICFjaGFuLT5hY2NlbF9kb25lIHx8CisJaWYgKCFjaGFuIHx8ICFjaGFuLT5hY2NlbF9kb25lIHx8IGluX2ludGVycnVwdCgpIHx8CiAJICAgIGluZm8tPnN0YXRlICE9IEZCSU5GT19TVEFURV9SVU5OSU5HIHx8CiAJICAgIGluZm8tPmZsYWdzICYgRkJJTkZPX0hXQUNDRUxfRElTQUJMRUQpCiAJCXJldHVybiAwOwogCi0JaWYgKFJJTkdfU1BBQ0UoY2hhbiwgNCkpIHsKKwlpZiAoIW11dGV4X3RyeWxvY2soJmNoYW4tPm11dGV4KSkKKwkJcmV0dXJuIDA7CisKKwlyZXQgPSBSSU5HX1NQQUNFKGNoYW4sIDQpOworCWlmIChyZXQpIHsKKwkJbXV0ZXhfdW5sb2NrKCZjaGFuLT5tdXRleCk7CiAJCW5vdXZlYXVfZmJjb25fZ3B1X2xvY2t1cChpbmZvKTsKIAkJcmV0dXJuIDA7CiAJfQogCi0JQkVHSU5fUklORyhjaGFuLCAwLCAweDAxMDQsIDEpOwotCU9VVF9SSU5HKGNoYW4sIDApOwotCUJFR0lOX1JJTkcoY2hhbiwgMCwgMHgwMTAwLCAxKTsKLQlPVVRfUklORyhjaGFuLCAwKTsKKwlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA+PSBOVl9DMCkgeworCQlCRUdJTl9OVkMwKGNoYW4sIDIsIE52U3ViMkQsIDB4MDEwYywgMSk7CisJCU9VVF9SSU5HICAoY2hhbiwgMCk7CisJCUJFR0lOX05WQzAoY2hhbiwgMiwgTnZTdWIyRCwgMHgwMTAwLCAxKTsKKwkJT1VUX1JJTkcgIChjaGFuLCAwKTsKKwl9IGVsc2UgeworCQlCRUdJTl9SSU5HKGNoYW4sIDAsIDB4MDEwNCwgMSk7CisJCU9VVF9SSU5HICAoY2hhbiwgMCk7CisJCUJFR0lOX1JJTkcoY2hhbiwgMCwgMHgwMTAwLCAxKTsKKwkJT1VUX1JJTkcgIChjaGFuLCAwKTsKKwl9CisKIAlub3V2ZWF1X2JvX3dyMzIoY2hhbi0+bm90aWZpZXJfYm8sIGNoYW4tPm0ybWZfbnRmeSArIDMsIDB4ZmZmZmZmZmYpOwogCUZJUkVfUklORyhjaGFuKTsKKwltdXRleF91bmxvY2soJmNoYW4tPm11dGV4KTsKIAogCXJldCA9IC1FQlVTWTsKIAlmb3IgKGkgPSAwOyBpIDwgMTAwMDAwOyBpKyspIHsKQEAgLTk3LDQwICsyMDcsMjQgQEAKIAkub3duZXIgPSBUSElTX01PRFVMRSwKIAkuZmJfY2hlY2tfdmFyID0gZHJtX2ZiX2hlbHBlcl9jaGVja192YXIsCiAJLmZiX3NldF9wYXIgPSBkcm1fZmJfaGVscGVyX3NldF9wYXIsCisJLmZiX2ZpbGxyZWN0ID0gbm91dmVhdV9mYmNvbl9maWxscmVjdCwKKwkuZmJfY29weWFyZWEgPSBub3V2ZWF1X2ZiY29uX2NvcHlhcmVhLAorCS5mYl9pbWFnZWJsaXQgPSBub3V2ZWF1X2ZiY29uX2ltYWdlYmxpdCwKKwkuZmJfc3luYyA9IG5vdXZlYXVfZmJjb25fc3luYywKKwkuZmJfcGFuX2Rpc3BsYXkgPSBkcm1fZmJfaGVscGVyX3Bhbl9kaXNwbGF5LAorCS5mYl9ibGFuayA9IGRybV9mYl9oZWxwZXJfYmxhbmssCisJLmZiX3NldGNtYXAgPSBkcm1fZmJfaGVscGVyX3NldGNtYXAsCisJLmZiX2RlYnVnX2VudGVyID0gZHJtX2ZiX2hlbHBlcl9kZWJ1Z19lbnRlciwKKwkuZmJfZGVidWdfbGVhdmUgPSBkcm1fZmJfaGVscGVyX2RlYnVnX2xlYXZlLAorfTsKKworc3RhdGljIHN0cnVjdCBmYl9vcHMgbm91dmVhdV9mYmNvbl9zd19vcHMgPSB7CisJLm93bmVyID0gVEhJU19NT0RVTEUsCisJLmZiX2NoZWNrX3ZhciA9IGRybV9mYl9oZWxwZXJfY2hlY2tfdmFyLAorCS5mYl9zZXRfcGFyID0gZHJtX2ZiX2hlbHBlcl9zZXRfcGFyLAogCS5mYl9maWxscmVjdCA9IGNmYl9maWxscmVjdCwKIAkuZmJfY29weWFyZWEgPSBjZmJfY29weWFyZWEsCiAJLmZiX2ltYWdlYmxpdCA9IGNmYl9pbWFnZWJsaXQsCi0JLmZiX3N5bmMgPSBub3V2ZWF1X2ZiY29uX3N5bmMsCi0JLmZiX3Bhbl9kaXNwbGF5ID0gZHJtX2ZiX2hlbHBlcl9wYW5fZGlzcGxheSwKLQkuZmJfYmxhbmsgPSBkcm1fZmJfaGVscGVyX2JsYW5rLAotCS5mYl9zZXRjbWFwID0gZHJtX2ZiX2hlbHBlcl9zZXRjbWFwLAotCS5mYl9kZWJ1Z19lbnRlciA9IGRybV9mYl9oZWxwZXJfZGVidWdfZW50ZXIsCi0JLmZiX2RlYnVnX2xlYXZlID0gZHJtX2ZiX2hlbHBlcl9kZWJ1Z19sZWF2ZSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgZmJfb3BzIG52MDRfZmJjb25fb3BzID0gewotCS5vd25lciA9IFRISVNfTU9EVUxFLAotCS5mYl9jaGVja192YXIgPSBkcm1fZmJfaGVscGVyX2NoZWNrX3ZhciwKLQkuZmJfc2V0X3BhciA9IGRybV9mYl9oZWxwZXJfc2V0X3BhciwKLQkuZmJfZmlsbHJlY3QgPSBudjA0X2ZiY29uX2ZpbGxyZWN0LAotCS5mYl9jb3B5YXJlYSA9IG52MDRfZmJjb25fY29weWFyZWEsCi0JLmZiX2ltYWdlYmxpdCA9IG52MDRfZmJjb25faW1hZ2VibGl0LAotCS5mYl9zeW5jID0gbm91dmVhdV9mYmNvbl9zeW5jLAotCS5mYl9wYW5fZGlzcGxheSA9IGRybV9mYl9oZWxwZXJfcGFuX2Rpc3BsYXksCi0JLmZiX2JsYW5rID0gZHJtX2ZiX2hlbHBlcl9ibGFuaywKLQkuZmJfc2V0Y21hcCA9IGRybV9mYl9oZWxwZXJfc2V0Y21hcCwKLQkuZmJfZGVidWdfZW50ZXIgPSBkcm1fZmJfaGVscGVyX2RlYnVnX2VudGVyLAotCS5mYl9kZWJ1Z19sZWF2ZSA9IGRybV9mYl9oZWxwZXJfZGVidWdfbGVhdmUsCi19OwotCi1zdGF0aWMgc3RydWN0IGZiX29wcyBudjUwX2ZiY29uX29wcyA9IHsKLQkub3duZXIgPSBUSElTX01PRFVMRSwKLQkuZmJfY2hlY2tfdmFyID0gZHJtX2ZiX2hlbHBlcl9jaGVja192YXIsCi0JLmZiX3NldF9wYXIgPSBkcm1fZmJfaGVscGVyX3NldF9wYXIsCi0JLmZiX2ZpbGxyZWN0ID0gbnY1MF9mYmNvbl9maWxscmVjdCwKLQkuZmJfY29weWFyZWEgPSBudjUwX2ZiY29uX2NvcHlhcmVhLAotCS5mYl9pbWFnZWJsaXQgPSBudjUwX2ZiY29uX2ltYWdlYmxpdCwKLQkuZmJfc3luYyA9IG5vdXZlYXVfZmJjb25fc3luYywKIAkuZmJfcGFuX2Rpc3BsYXkgPSBkcm1fZmJfaGVscGVyX3Bhbl9kaXNwbGF5LAogCS5mYl9ibGFuayA9IGRybV9mYl9oZWxwZXJfYmxhbmssCiAJLmZiX3NldGNtYXAgPSBkcm1fZmJfaGVscGVyX3NldGNtYXAsCkBAIC0yNTcsMjEgKzM1MSwxNiBAQAogCQkJICAgICAgRkJJTkZPX0hXQUNDRUxfRklMTFJFQ1QgfAogCQkJICAgICAgRkJJTkZPX0hXQUNDRUxfSU1BR0VCTElUOwogCWluZm8tPmZsYWdzIHw9IEZCSU5GT19DQU5fRk9SQ0VfT1VUUFVUOwotCWluZm8tPmZib3BzID0gJm5vdXZlYXVfZmJjb25fb3BzOwotCWluZm8tPmZpeC5zbWVtX3N0YXJ0ID0gZGV2LT5tb2RlX2NvbmZpZy5mYl9iYXNlICsgbnZiby0+Ym8ub2Zmc2V0IC0KLQkJCSAgICAgICBkZXZfcHJpdi0+dm1fdnJhbV9iYXNlOworCWluZm8tPmZib3BzID0gJm5vdXZlYXVfZmJjb25fc3dfb3BzOworCWluZm8tPmZpeC5zbWVtX3N0YXJ0ID0gZGV2LT5tb2RlX2NvbmZpZy5mYl9iYXNlICsKKwkJCSAgICAgICAobnZiby0+Ym8ubWVtLnN0YXJ0IDw8IFBBR0VfU0hJRlQpOwogCWluZm8tPmZpeC5zbWVtX2xlbiA9IHNpemU7CiAKIAlpbmZvLT5zY3JlZW5fYmFzZSA9IG52Ym9fa21hcF9vYmpfaW92aXJ0dWFsKG5vdXZlYXVfZmItPm52Ym8pOwogCWluZm8tPnNjcmVlbl9zaXplID0gc2l6ZTsKIAotCWRybV9mYl9oZWxwZXJfZmlsbF9maXgoaW5mbywgZmItPnBpdGNoLCBmYi0+ZGVwdGgpOwogCWRybV9mYl9oZWxwZXJfZmlsbF92YXIoaW5mbywgJm5mYmRldi0+aGVscGVyLCBzaXplcy0+ZmJfd2lkdGgsIHNpemVzLT5mYl9oZWlnaHQpOwogCi0JLyogRklYTUU6IHdlIHJlYWxseSBzaG91bGRuJ3QgZXhwb3NlIG1taW8gc3BhY2UgYXQgYWxsICovCi0JaW5mby0+Zml4Lm1taW9fc3RhcnQgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMSk7Ci0JaW5mby0+Zml4Lm1taW9fbGVuID0gcGNpX3Jlc291cmNlX2xlbihwZGV2LCAxKTsKLQogCS8qIFNldCBhcGVydHVyZSBiYXNlL3NpemUgZm9yIHZlc2FmYiB0YWtlb3ZlciAqLwogCWluZm8tPmFwZXJ0dXJlcyA9IGRldl9wcml2LT5hcGVydHVyZXM7CiAJaWYgKCFpbmZvLT5hcGVydHVyZXMpIHsKQEAgLTI4NSwxOSArMzc0LDIwIEBACiAJaW5mby0+cGl4bWFwLmZsYWdzID0gRkJfUElYTUFQX1NZU1RFTTsKIAlpbmZvLT5waXhtYXAuc2Nhbl9hbGlnbiA9IDE7CiAKKwltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKKwogCWlmIChkZXZfcHJpdi0+Y2hhbm5lbCAmJiAhbm91dmVhdV9ub2ZiYWNjZWwpIHsKLQkJc3dpdGNoIChkZXZfcHJpdi0+Y2FyZF90eXBlKSB7Ci0JCWNhc2UgTlZfQzA6Ci0JCQlicmVhazsKLQkJY2FzZSBOVl81MDoKLQkJCW52NTBfZmJjb25fYWNjZWxfaW5pdChpbmZvKTsKLQkJCWluZm8tPmZib3BzID0gJm52NTBfZmJjb25fb3BzOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQludjA0X2ZiY29uX2FjY2VsX2luaXQoaW5mbyk7Ci0JCQlpbmZvLT5mYm9wcyA9ICZudjA0X2ZiY29uX29wczsKLQkJCWJyZWFrOwotCQl9OworCQlyZXQgPSAtRU5PREVWOworCQlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA8IE5WXzUwKQorCQkJcmV0ID0gbnYwNF9mYmNvbl9hY2NlbF9pbml0KGluZm8pOworCQllbHNlCisJCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlIDwgTlZfQzApCisJCQlyZXQgPSBudjUwX2ZiY29uX2FjY2VsX2luaXQoaW5mbyk7CisJCWVsc2UKKwkJCXJldCA9IG52YzBfZmJjb25fYWNjZWxfaW5pdChpbmZvKTsKKworCQlpZiAocmV0ID09IDApCisJCQlpbmZvLT5mYm9wcyA9ICZub3V2ZWF1X2ZiY29uX29wczsKIAl9CiAKIAlub3V2ZWF1X2ZiY29uX3pmaWxsKGRldiwgbmZiZGV2KTsKQEAgLTMwOCw3ICszOTgsNiBAQAogCQkJCQkJbm91dmVhdV9mYi0+YmFzZS5oZWlnaHQsCiAJCQkJCQludmJvLT5iby5vZmZzZXQsIG52Ym8pOwogCi0JbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CiAJdmdhX3N3aXRjaGVyb29fY2xpZW50X2ZiX3NldChkZXYtPnBkZXYsIGluZm8pOwogCXJldHVybiAwOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2ZiY29uLmggYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2ZiY29uLmgKaW5kZXggZTdlMTI2OC4uYjczYzI5ZjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfZmJjb24uaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2ZiY29uLmgKQEAgLTQwLDE1ICs0MCwyMSBAQAogCiB2b2lkIG5vdXZlYXVfZmJjb25fcmVzdG9yZSh2b2lkKTsKIAotdm9pZCBudjA0X2ZiY29uX2NvcHlhcmVhKHN0cnVjdCBmYl9pbmZvICppbmZvLCBjb25zdCBzdHJ1Y3QgZmJfY29weWFyZWEgKnJlZ2lvbik7Ci12b2lkIG52MDRfZmJjb25fZmlsbHJlY3Qoc3RydWN0IGZiX2luZm8gKmluZm8sIGNvbnN0IHN0cnVjdCBmYl9maWxscmVjdCAqcmVjdCk7Ci12b2lkIG52MDRfZmJjb25faW1hZ2VibGl0KHN0cnVjdCBmYl9pbmZvICppbmZvLCBjb25zdCBzdHJ1Y3QgZmJfaW1hZ2UgKmltYWdlKTsKK2ludCBudjA0X2ZiY29uX2NvcHlhcmVhKHN0cnVjdCBmYl9pbmZvICppbmZvLCBjb25zdCBzdHJ1Y3QgZmJfY29weWFyZWEgKnJlZ2lvbik7CitpbnQgbnYwNF9mYmNvbl9maWxscmVjdChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgY29uc3Qgc3RydWN0IGZiX2ZpbGxyZWN0ICpyZWN0KTsKK2ludCBudjA0X2ZiY29uX2ltYWdlYmxpdChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgY29uc3Qgc3RydWN0IGZiX2ltYWdlICppbWFnZSk7CiBpbnQgbnYwNF9mYmNvbl9hY2NlbF9pbml0KHN0cnVjdCBmYl9pbmZvICppbmZvKTsKLXZvaWQgbnY1MF9mYmNvbl9maWxscmVjdChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgY29uc3Qgc3RydWN0IGZiX2ZpbGxyZWN0ICpyZWN0KTsKLXZvaWQgbnY1MF9mYmNvbl9jb3B5YXJlYShzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgY29uc3Qgc3RydWN0IGZiX2NvcHlhcmVhICpyZWdpb24pOwotdm9pZCBudjUwX2ZiY29uX2ltYWdlYmxpdChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgY29uc3Qgc3RydWN0IGZiX2ltYWdlICppbWFnZSk7CisKK2ludCBudjUwX2ZiY29uX2ZpbGxyZWN0KHN0cnVjdCBmYl9pbmZvICppbmZvLCBjb25zdCBzdHJ1Y3QgZmJfZmlsbHJlY3QgKnJlY3QpOworaW50IG52NTBfZmJjb25fY29weWFyZWEoc3RydWN0IGZiX2luZm8gKmluZm8sIGNvbnN0IHN0cnVjdCBmYl9jb3B5YXJlYSAqcmVnaW9uKTsKK2ludCBudjUwX2ZiY29uX2ltYWdlYmxpdChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgY29uc3Qgc3RydWN0IGZiX2ltYWdlICppbWFnZSk7CiBpbnQgbnY1MF9mYmNvbl9hY2NlbF9pbml0KHN0cnVjdCBmYl9pbmZvICppbmZvKTsKIAoraW50IG52YzBfZmJjb25fZmlsbHJlY3Qoc3RydWN0IGZiX2luZm8gKmluZm8sIGNvbnN0IHN0cnVjdCBmYl9maWxscmVjdCAqcmVjdCk7CitpbnQgbnZjMF9mYmNvbl9jb3B5YXJlYShzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgY29uc3Qgc3RydWN0IGZiX2NvcHlhcmVhICpyZWdpb24pOworaW50IG52YzBfZmJjb25faW1hZ2VibGl0KHN0cnVjdCBmYl9pbmZvICppbmZvLCBjb25zdCBzdHJ1Y3QgZmJfaW1hZ2UgKmltYWdlKTsKK2ludCBudmMwX2ZiY29uX2FjY2VsX2luaXQoc3RydWN0IGZiX2luZm8gKmluZm8pOworCiB2b2lkIG5vdXZlYXVfZmJjb25fZ3B1X2xvY2t1cChzdHJ1Y3QgZmJfaW5mbyAqaW5mbyk7CiAKIGludCBub3V2ZWF1X2ZiY29uX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2ZlbmNlLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2ZlbmNlLmMKaW5kZXggYWIxYmJmYi4uMjIxYjg0NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9mZW5jZS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfZmVuY2UuYwpAQCAtMzIsNyArMzIsOCBAQAogI2luY2x1ZGUgIm5vdXZlYXVfZG1hLmgiCiAKICNkZWZpbmUgVVNFX1JFRkNOVChkZXYpIChub3V2ZWF1X3ByaXZhdGUoZGV2KS0+Y2hpcHNldCA+PSAweDEwKQotI2RlZmluZSBVU0VfU0VNQShkZXYpIChub3V2ZWF1X3ByaXZhdGUoZGV2KS0+Y2hpcHNldCA+PSAweDE3KQorI2RlZmluZSBVU0VfU0VNQShkZXYpIChub3V2ZWF1X3ByaXZhdGUoZGV2KS0+Y2hpcHNldCA+PSAweDE3ICYmIFwKKwkJICAgICAgIG5vdXZlYXVfcHJpdmF0ZShkZXYpLT5jYXJkX3R5cGUgPCBOVl9DMCkKIAogc3RydWN0IG5vdXZlYXVfZmVuY2UgewogCXN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW5uZWw7CkBAIC02NCw2ICs2NSw3IEBACiAJc3RydWN0IG5vdXZlYXVfZmVuY2UgKmZlbmNlID0KIAkJY29udGFpbmVyX29mKHJlZiwgc3RydWN0IG5vdXZlYXVfZmVuY2UsIHJlZmNvdW50KTsKIAorCW5vdXZlYXVfY2hhbm5lbF9yZWYoTlVMTCwgJmZlbmNlLT5jaGFubmVsKTsKIAlrZnJlZShmZW5jZSk7CiB9CiAKQEAgLTc2LDE0ICs3OCwxNyBAQAogCiAJc3Bpbl9sb2NrKCZjaGFuLT5mZW5jZS5sb2NrKTsKIAotCWlmIChVU0VfUkVGQ05UKGRldikpCi0JCXNlcXVlbmNlID0gbnZjaGFuX3JkMzIoY2hhbiwgMHg0OCk7Ci0JZWxzZQotCQlzZXF1ZW5jZSA9IGF0b21pY19yZWFkKCZjaGFuLT5mZW5jZS5sYXN0X3NlcXVlbmNlX2lycSk7CisJLyogRmV0Y2ggdGhlIGxhc3Qgc2VxdWVuY2UgaWYgdGhlIGNoYW5uZWwgaXMgc3RpbGwgdXAgYW5kIHJ1bm5pbmcgKi8KKwlpZiAobGlrZWx5KCFsaXN0X2VtcHR5KCZjaGFuLT5mZW5jZS5wZW5kaW5nKSkpIHsKKwkJaWYgKFVTRV9SRUZDTlQoZGV2KSkKKwkJCXNlcXVlbmNlID0gbnZjaGFuX3JkMzIoY2hhbiwgMHg0OCk7CisJCWVsc2UKKwkJCXNlcXVlbmNlID0gYXRvbWljX3JlYWQoJmNoYW4tPmZlbmNlLmxhc3Rfc2VxdWVuY2VfaXJxKTsKIAotCWlmIChjaGFuLT5mZW5jZS5zZXF1ZW5jZV9hY2sgPT0gc2VxdWVuY2UpCi0JCWdvdG8gb3V0OwotCWNoYW4tPmZlbmNlLnNlcXVlbmNlX2FjayA9IHNlcXVlbmNlOworCQlpZiAoY2hhbi0+ZmVuY2Uuc2VxdWVuY2VfYWNrID09IHNlcXVlbmNlKQorCQkJZ290byBvdXQ7CisJCWNoYW4tPmZlbmNlLnNlcXVlbmNlX2FjayA9IHNlcXVlbmNlOworCX0KIAogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShmZW5jZSwgdG1wLCAmY2hhbi0+ZmVuY2UucGVuZGluZywgZW50cnkpIHsKIAkJc2VxdWVuY2UgPSBmZW5jZS0+c2VxdWVuY2U7CkBAIC0xMTMsMTMgKzExOCwxMyBAQAogCWlmICghZmVuY2UpCiAJCXJldHVybiAtRU5PTUVNOwogCWtyZWZfaW5pdCgmZmVuY2UtPnJlZmNvdW50KTsKLQlmZW5jZS0+Y2hhbm5lbCA9IGNoYW47CisJbm91dmVhdV9jaGFubmVsX3JlZihjaGFuLCAmZmVuY2UtPmNoYW5uZWwpOwogCiAJaWYgKGVtaXQpCiAJCXJldCA9IG5vdXZlYXVfZmVuY2VfZW1pdChmZW5jZSk7CiAKIAlpZiAocmV0KQotCQlub3V2ZWF1X2ZlbmNlX3VucmVmKCh2b2lkICopJmZlbmNlKTsKKwkJbm91dmVhdV9mZW5jZV91bnJlZigmZmVuY2UpOwogCSpwZmVuY2UgPSBmZW5jZTsKIAlyZXR1cm4gcmV0OwogfQpAQCAtMTI3LDcgKzEzMiw3IEBACiBzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICoKIG5vdXZlYXVfZmVuY2VfY2hhbm5lbChzdHJ1Y3Qgbm91dmVhdV9mZW5jZSAqZmVuY2UpCiB7Ci0JcmV0dXJuIGZlbmNlID8gZmVuY2UtPmNoYW5uZWwgOiBOVUxMOworCXJldHVybiBmZW5jZSA/IG5vdXZlYXVfY2hhbm5lbF9nZXRfdW5sb2NrZWQoZmVuY2UtPmNoYW5uZWwpIDogTlVMTDsKIH0KIAogaW50CkBAIC0xMzUsNiArMTQwLDcgQEAKIHsKIAlzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuID0gZmVuY2UtPmNoYW5uZWw7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNoYW4tPmRldjsKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCWludCByZXQ7CiAKIAlyZXQgPSBSSU5HX1NQQUNFKGNoYW4sIDIpOwpAQCAtMTU1LDggKzE2MSwxNSBAQAogCWxpc3RfYWRkX3RhaWwoJmZlbmNlLT5lbnRyeSwgJmNoYW4tPmZlbmNlLnBlbmRpbmcpOwogCXNwaW5fdW5sb2NrKCZjaGFuLT5mZW5jZS5sb2NrKTsKIAotCUJFR0lOX1JJTkcoY2hhbiwgTnZTdWJTdywgVVNFX1JFRkNOVChkZXYpID8gMHgwMDUwIDogMHgwMTUwLCAxKTsKLQlPVVRfUklORyhjaGFuLCBmZW5jZS0+c2VxdWVuY2UpOworCWlmIChVU0VfUkVGQ05UKGRldikpIHsKKwkJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPCBOVl9DMCkKKwkJCUJFR0lOX1JJTkcoY2hhbiwgTnZTdWJTdywgMHgwMDUwLCAxKTsKKwkJZWxzZQorCQkJQkVHSU5fTlZDMChjaGFuLCAyLCBOdlN1Yk0yTUYsIDB4MDA1MCwgMSk7CisJfSBlbHNlIHsKKwkJQkVHSU5fUklORyhjaGFuLCBOdlN1YlN3LCAweDAxNTAsIDEpOworCX0KKwlPVVRfUklORyAoY2hhbiwgZmVuY2UtPnNlcXVlbmNlKTsKIAlGSVJFX1JJTkcoY2hhbik7CiAKIAlyZXR1cm4gMDsKQEAgLTE4Miw3ICsxOTUsNyBAQAogfQogCiB2b2lkCi1ub3V2ZWF1X2ZlbmNlX3VucmVmKHZvaWQgKipzeW5jX29iaikKK19fbm91dmVhdV9mZW5jZV91bnJlZih2b2lkICoqc3luY19vYmopCiB7CiAJc3RydWN0IG5vdXZlYXVfZmVuY2UgKmZlbmNlID0gbm91dmVhdV9mZW5jZSgqc3luY19vYmopOwogCkBAIC0xOTIsNyArMjA1LDcgQEAKIH0KIAogdm9pZCAqCi1ub3V2ZWF1X2ZlbmNlX3JlZih2b2lkICpzeW5jX29iaikKK19fbm91dmVhdV9mZW5jZV9yZWYodm9pZCAqc3luY19vYmopCiB7CiAJc3RydWN0IG5vdXZlYXVfZmVuY2UgKmZlbmNlID0gbm91dmVhdV9mZW5jZShzeW5jX29iaik7CiAKQEAgLTIwMSw3ICsyMTQsNyBAQAogfQogCiBib29sCi1ub3V2ZWF1X2ZlbmNlX3NpZ25hbGxlZCh2b2lkICpzeW5jX29iaiwgdm9pZCAqc3luY19hcmcpCitfX25vdXZlYXVfZmVuY2Vfc2lnbmFsbGVkKHZvaWQgKnN5bmNfb2JqLCB2b2lkICpzeW5jX2FyZykKIHsKIAlzdHJ1Y3Qgbm91dmVhdV9mZW5jZSAqZmVuY2UgPSBub3V2ZWF1X2ZlbmNlKHN5bmNfb2JqKTsKIAlzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuID0gZmVuY2UtPmNoYW5uZWw7CkBAIC0yMTQsMTMgKzIyNywxNCBAQAogfQogCiBpbnQKLW5vdXZlYXVfZmVuY2Vfd2FpdCh2b2lkICpzeW5jX29iaiwgdm9pZCAqc3luY19hcmcsIGJvb2wgbGF6eSwgYm9vbCBpbnRyKQorX19ub3V2ZWF1X2ZlbmNlX3dhaXQodm9pZCAqc3luY19vYmosIHZvaWQgKnN5bmNfYXJnLCBib29sIGxhenksIGJvb2wgaW50cikKIHsKIAl1bnNpZ25lZCBsb25nIHRpbWVvdXQgPSBqaWZmaWVzICsgKDMgKiBEUk1fSFopOworCXVuc2lnbmVkIGxvbmcgc2xlZXBfdGltZSA9IGppZmZpZXMgKyAxOwogCWludCByZXQgPSAwOwogCiAJd2hpbGUgKDEpIHsKLQkJaWYgKG5vdXZlYXVfZmVuY2Vfc2lnbmFsbGVkKHN5bmNfb2JqLCBzeW5jX2FyZykpCisJCWlmIChfX25vdXZlYXVfZmVuY2Vfc2lnbmFsbGVkKHN5bmNfb2JqLCBzeW5jX2FyZykpCiAJCQlicmVhazsKIAogCQlpZiAodGltZV9hZnRlcl9lcShqaWZmaWVzLCB0aW1lb3V0KSkgewpAQCAtMjMwLDcgKzI0NCw3IEBACiAKIAkJX19zZXRfY3VycmVudF9zdGF0ZShpbnRyID8gVEFTS19JTlRFUlJVUFRJQkxFCiAJCQk6IFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKLQkJaWYgKGxhenkpCisJCWlmIChsYXp5ICYmIHRpbWVfYWZ0ZXJfZXEoamlmZmllcywgc2xlZXBfdGltZSkpCiAJCQlzY2hlZHVsZV90aW1lb3V0KDEpOwogCiAJCWlmIChpbnRyICYmIHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CkBAIC0zNjgsNyArMzgyLDcgQEAKIAogCWtyZWZfZ2V0KCZzZW1hLT5yZWYpOwogCW5vdXZlYXVfZmVuY2Vfd29yayhmZW5jZSwgc2VtYXBob3JlX3dvcmssIHNlbWEpOwotCW5vdXZlYXVfZmVuY2VfdW5yZWYoKHZvaWQgKikmZmVuY2UpOworCW5vdXZlYXVfZmVuY2VfdW5yZWYoJmZlbmNlKTsKIAogCXJldHVybiAwOwogfQpAQCAtMzgwLDMzICszOTQsNDkgQEAKIAlzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuID0gbm91dmVhdV9mZW5jZV9jaGFubmVsKGZlbmNlKTsKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gd2NoYW4tPmRldjsKIAlzdHJ1Y3Qgbm91dmVhdV9zZW1hcGhvcmUgKnNlbWE7Ci0JaW50IHJldDsKKwlpbnQgcmV0ID0gMDsKIAotCWlmIChsaWtlbHkoIWZlbmNlIHx8IGNoYW4gPT0gd2NoYW4gfHwKLQkJICAgbm91dmVhdV9mZW5jZV9zaWduYWxsZWQoZmVuY2UsIE5VTEwpKSkKLQkJcmV0dXJuIDA7CisJaWYgKGxpa2VseSghY2hhbiB8fCBjaGFuID09IHdjaGFuIHx8CisJCSAgIG5vdXZlYXVfZmVuY2Vfc2lnbmFsbGVkKGZlbmNlKSkpCisJCWdvdG8gb3V0OwogCiAJc2VtYSA9IGFsbG9jX3NlbWFwaG9yZShkZXYpOwogCWlmICghc2VtYSkgewogCQkvKiBFYXJseSBjYXJkIG9yIGJyb2tlbiB1c2Vyc3BhY2UsIGZhbGwgYmFjayB0bwogCQkgKiBzb2Z0d2FyZSBzeW5jLiAqLwotCQlyZXR1cm4gbm91dmVhdV9mZW5jZV93YWl0KGZlbmNlLCBOVUxMLCBmYWxzZSwgZmFsc2UpOworCQlyZXQgPSBub3V2ZWF1X2ZlbmNlX3dhaXQoZmVuY2UsIHRydWUsIGZhbHNlKTsKKwkJZ290byBvdXQ7CisJfQorCisJLyogdHJ5IHRvIHRha2UgY2hhbidzIG11dGV4LCBpZiB3ZSBjYW4ndCB0YWtlIGl0IHJpZ2h0IGF3YXkKKwkgKiB3ZSBoYXZlIHRvIGZhbGxiYWNrIHRvIHNvZnR3YXJlIHN5bmMgdG8gcHJldmVudCBsb2NraW5nCisJICogb3JkZXIgaXNzdWVzCisJICovCisJaWYgKCFtdXRleF90cnlsb2NrKCZjaGFuLT5tdXRleCkpIHsKKwkJcmV0ID0gbm91dmVhdV9mZW5jZV93YWl0KGZlbmNlLCB0cnVlLCBmYWxzZSk7CisJCWdvdG8gb3V0X3VucmVmOwogCX0KIAogCS8qIE1ha2Ugd2NoYW4gd2FpdCB1bnRpbCBpdCBnZXRzIHNpZ25hbGxlZCAqLwogCXJldCA9IGVtaXRfc2VtYXBob3JlKHdjaGFuLCBOVl9TV19TRU1BUEhPUkVfQUNRVUlSRSwgc2VtYSk7CiAJaWYgKHJldCkKLQkJZ290byBvdXQ7CisJCWdvdG8gb3V0X3VubG9jazsKIAogCS8qIFNpZ25hbCB0aGUgc2VtYXBob3JlIGZyb20gY2hhbiAqLwogCXJldCA9IGVtaXRfc2VtYXBob3JlKGNoYW4sIE5WX1NXX1NFTUFQSE9SRV9SRUxFQVNFLCBzZW1hKTsKLW91dDoKKworb3V0X3VubG9jazoKKwltdXRleF91bmxvY2soJmNoYW4tPm11dGV4KTsKK291dF91bnJlZjoKIAlrcmVmX3B1dCgmc2VtYS0+cmVmLCBmcmVlX3NlbWFwaG9yZSk7CitvdXQ6CisJaWYgKGNoYW4pCisJCW5vdXZlYXVfY2hhbm5lbF9wdXRfdW5sb2NrZWQoJmNoYW4pOwogCXJldHVybiByZXQ7CiB9CiAKIGludAotbm91dmVhdV9mZW5jZV9mbHVzaCh2b2lkICpzeW5jX29iaiwgdm9pZCAqc3luY19hcmcpCitfX25vdXZlYXVfZmVuY2VfZmx1c2godm9pZCAqc3luY19vYmosIHZvaWQgKnN5bmNfYXJnKQogewogCXJldHVybiAwOwogfQpAQCAtNDIwLDMwICs0NTAsMjcgQEAKIAlpbnQgcmV0OwogCiAJLyogQ3JlYXRlIGFuIE5WX1NXIG9iamVjdCBmb3IgdmFyaW91cyBzeW5jIHB1cnBvc2VzICovCi0JcmV0ID0gbm91dmVhdV9ncHVvYmpfc3dfbmV3KGNoYW4sIE5WX1NXLCAmb2JqKTsKKwlyZXQgPSBub3V2ZWF1X2dwdW9ial9ncl9uZXcoY2hhbiwgTnZTdywgTlZfU1cpOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKLQlyZXQgPSBub3V2ZWF1X3JhbWh0X2luc2VydChjaGFuLCBOdlN3LCBvYmopOwotCW5vdXZlYXVfZ3B1b2JqX3JlZihOVUxMLCAmb2JqKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCi0JcmV0ID0gUklOR19TUEFDRShjaGFuLCAyKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCUJFR0lOX1JJTkcoY2hhbiwgTnZTdWJTdywgMCwgMSk7Ci0JT1VUX1JJTkcoY2hhbiwgTnZTdyk7CisJLyogd2UgbGVhdmUgc3ViY2hhbm5lbCBlbXB0eSBmb3IgbnZjMCAqLworCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlIDwgTlZfQzApIHsKKwkJcmV0ID0gUklOR19TUEFDRShjaGFuLCAyKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJCUJFR0lOX1JJTkcoY2hhbiwgTnZTdWJTdywgMCwgMSk7CisJCU9VVF9SSU5HKGNoYW4sIE52U3cpOworCX0KIAogCS8qIENyZWF0ZSBhIERNQSBvYmplY3QgZm9yIHRoZSBzaGFyZWQgY3Jvc3MtY2hhbm5lbCBzeW5jIGFyZWEuICovCiAJaWYgKFVTRV9TRU1BKGRldikpIHsKLQkJc3RydWN0IGRybV9tbV9ub2RlICptZW0gPSBkZXZfcHJpdi0+ZmVuY2UuYm8tPmJvLm1lbS5tbV9ub2RlOworCQlzdHJ1Y3QgdHRtX21lbV9yZWcgKm1lbSA9ICZkZXZfcHJpdi0+ZmVuY2UuYm8tPmJvLm1lbTsKIAogCQlyZXQgPSBub3V2ZWF1X2dwdW9ial9kbWFfbmV3KGNoYW4sIE5WX0NMQVNTX0RNQV9JTl9NRU1PUlksCiAJCQkJCSAgICAgbWVtLT5zdGFydCA8PCBQQUdFX1NISUZULAotCQkJCQkgICAgIG1lbS0+c2l6ZSA8PCBQQUdFX1NISUZULAotCQkJCQkgICAgIE5WX0RNQV9BQ0NFU1NfUlcsCi0JCQkJCSAgICAgTlZfRE1BX1RBUkdFVF9WSURNRU0sICZvYmopOworCQkJCQkgICAgIG1lbS0+c2l6ZSwgTlZfTUVNX0FDQ0VTU19SVywKKwkJCQkJICAgICBOVl9NRU1fVEFSR0VUX1ZSQU0sICZvYmopOwogCQlpZiAocmV0KQogCQkJcmV0dXJuIHJldDsKIApAQCAtNDczLDYgKzUwMCw4IEBACiB7CiAJc3RydWN0IG5vdXZlYXVfZmVuY2UgKnRtcCwgKmZlbmNlOwogCisJc3Bpbl9sb2NrKCZjaGFuLT5mZW5jZS5sb2NrKTsKKwogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShmZW5jZSwgdG1wLCAmY2hhbi0+ZmVuY2UucGVuZGluZywgZW50cnkpIHsKIAkJZmVuY2UtPnNpZ25hbGxlZCA9IHRydWU7CiAJCWxpc3RfZGVsKCZmZW5jZS0+ZW50cnkpOwpAQCAtNDgyLDYgKzUxMSw4IEBACiAKIAkJa3JlZl9wdXQoJmZlbmNlLT5yZWZjb3VudCwgbm91dmVhdV9mZW5jZV9kZWwpOwogCX0KKworCXNwaW5fdW5sb2NrKCZjaGFuLT5mZW5jZS5sb2NrKTsKIH0KIAogaW50CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2dlbS5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9nZW0uYwppbmRleCA5YTFmZGNmLi41MDZjNTA4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2dlbS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfZ2VtLmMKQEAgLTQ4LDkgKzQ4LDYgQEAKIAkJcmV0dXJuOwogCW52Ym8tPmdlbSA9IE5VTEw7CiAKLQlpZiAodW5saWtlbHkobnZiby0+Y3B1X2ZpbHApKQotCQl0dG1fYm9fc3luY2NwdV93cml0ZV9yZWxlYXNlKGJvKTsKLQogCWlmICh1bmxpa2VseShudmJvLT5waW5fcmVmY250KSkgewogCQludmJvLT5waW5fcmVmY250ID0gMTsKIAkJbm91dmVhdV9ib191bnBpbihudmJvKTsKQEAgLTEwNiwzMiArMTAzLDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGJvb2wKLW5vdXZlYXVfZ2VtX3RpbGVfZmxhZ3NfdmFsaWQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdWludDMyX3QgdGlsZV9mbGFncykKLXsKLQlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCi0JaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPj0gTlZfNTApIHsKLQkJc3dpdGNoICh0aWxlX2ZsYWdzICYgTk9VVkVBVV9HRU1fVElMRV9MQVlPVVRfTUFTSykgewotCQljYXNlIDB4MDAwMDoKLQkJY2FzZSAweDE4MDA6Ci0JCWNhc2UgMHgyODAwOgotCQljYXNlIDB4NDgwMDoKLQkJY2FzZSAweDcwMDA6Ci0JCWNhc2UgMHg3NDAwOgotCQljYXNlIDB4N2EwMDoKLQkJY2FzZSAweGUwMDA6Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCX0gZWxzZSB7Ci0JCWlmICghKHRpbGVfZmxhZ3MgJiBOT1VWRUFVX0dFTV9USUxFX0xBWU9VVF9NQVNLKSkKLQkJCXJldHVybiB0cnVlOwotCX0KLQotCU5WX0VSUk9SKGRldiwgImJhZCBwYWdlIGZsYWdzOiAweCUwOHhcbiIsIHRpbGVfZmxhZ3MpOwotCXJldHVybiBmYWxzZTsKLX0KLQogaW50CiBub3V2ZWF1X2dlbV9pb2N0bF9uZXcoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdm9pZCAqZGF0YSwKIAkJICAgICAgc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYpCkBAIC0xNDYsMTEgKzExNyw2IEBACiAJaWYgKHVubGlrZWx5KGRldl9wcml2LT50dG0uYmRldi5kZXZfbWFwcGluZyA9PSBOVUxMKSkKIAkJZGV2X3ByaXYtPnR0bS5iZGV2LmRldl9tYXBwaW5nID0gZGV2X3ByaXYtPmRldi0+ZGV2X21hcHBpbmc7CiAKLQlpZiAocmVxLT5jaGFubmVsX2hpbnQpIHsKLQkJTk9VVkVBVV9HRVRfVVNFUl9DSEFOTkVMX1dJVEhfUkVUVVJOKHJlcS0+Y2hhbm5lbF9oaW50LAotCQkJCQkJICAgICBmaWxlX3ByaXYsIGNoYW4pOwotCX0KLQogCWlmIChyZXEtPmluZm8uZG9tYWluICYgTk9VVkVBVV9HRU1fRE9NQUlOX1ZSQU0pCiAJCWZsYWdzIHw9IFRUTV9QTF9GTEFHX1ZSQU07CiAJaWYgKHJlcS0+aW5mby5kb21haW4gJiBOT1VWRUFVX0dFTV9ET01BSU5fR0FSVCkKQEAgLTE1OCwxMyArMTI0LDIzIEBACiAJaWYgKCFmbGFncyB8fCByZXEtPmluZm8uZG9tYWluICYgTk9VVkVBVV9HRU1fRE9NQUlOX0NQVSkKIAkJZmxhZ3MgfD0gVFRNX1BMX0ZMQUdfU1lTVEVNOwogCi0JaWYgKCFub3V2ZWF1X2dlbV90aWxlX2ZsYWdzX3ZhbGlkKGRldiwgcmVxLT5pbmZvLnRpbGVfZmxhZ3MpKQorCWlmICghZGV2X3ByaXYtPmVuZ2luZS52cmFtLmZsYWdzX3ZhbGlkKGRldiwgcmVxLT5pbmZvLnRpbGVfZmxhZ3MpKSB7CisJCU5WX0VSUk9SKGRldiwgImJhZCBwYWdlIGZsYWdzOiAweCUwOHhcbiIsIHJlcS0+aW5mby50aWxlX2ZsYWdzKTsKIAkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKHJlcS0+Y2hhbm5lbF9oaW50KSB7CisJCWNoYW4gPSBub3V2ZWF1X2NoYW5uZWxfZ2V0KGRldiwgZmlsZV9wcml2LCByZXEtPmNoYW5uZWxfaGludCk7CisJCWlmIChJU19FUlIoY2hhbikpCisJCQlyZXR1cm4gUFRSX0VSUihjaGFuKTsKKwl9CiAKIAlyZXQgPSBub3V2ZWF1X2dlbV9uZXcoZGV2LCBjaGFuLCByZXEtPmluZm8uc2l6ZSwgcmVxLT5hbGlnbiwgZmxhZ3MsCiAJCQkgICAgICByZXEtPmluZm8udGlsZV9tb2RlLCByZXEtPmluZm8udGlsZV9mbGFncywgZmFsc2UsCiAJCQkgICAgICAocmVxLT5pbmZvLmRvbWFpbiAmIE5PVVZFQVVfR0VNX0RPTUFJTl9NQVBQQUJMRSksCiAJCQkgICAgICAmbnZibyk7CisJaWYgKGNoYW4pCisJCW5vdXZlYXVfY2hhbm5lbF9wdXQoJmNoYW4pOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKQEAgLTIzMSwxNSArMjA3LDggQEAKIAogCWxpc3RfZm9yX2VhY2hfc2FmZShlbnRyeSwgdG1wLCBsaXN0KSB7CiAJCW52Ym8gPSBsaXN0X2VudHJ5KGVudHJ5LCBzdHJ1Y3Qgbm91dmVhdV9ibywgZW50cnkpOwotCQlpZiAobGlrZWx5KGZlbmNlKSkgewotCQkJc3RydWN0IG5vdXZlYXVfZmVuY2UgKnByZXZfZmVuY2U7CiAKLQkJCXNwaW5fbG9jaygmbnZiby0+Ym8ubG9jayk7Ci0JCQlwcmV2X2ZlbmNlID0gbnZiby0+Ym8uc3luY19vYmo7Ci0JCQludmJvLT5iby5zeW5jX29iaiA9IG5vdXZlYXVfZmVuY2VfcmVmKGZlbmNlKTsKLQkJCXNwaW5fdW5sb2NrKCZudmJvLT5iby5sb2NrKTsKLQkJCW5vdXZlYXVfZmVuY2VfdW5yZWYoKHZvaWQgKikmcHJldl9mZW5jZSk7Ci0JCX0KKwkJbm91dmVhdV9ib19mZW5jZShudmJvLCBmZW5jZSk7CiAKIAkJaWYgKHVubGlrZWx5KG52Ym8tPnZhbGlkYXRlX21hcHBlZCkpIHsKIAkJCXR0bV9ib19rdW5tYXAoJm52Ym8tPmttYXApOwpAQCAtMjk5LDE0ICsyNjgsMTUgQEAKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAKLQkJcmV0ID0gdHRtX2JvX3Jlc2VydmUoJm52Ym8tPmJvLCBmYWxzZSwgZmFsc2UsIHRydWUsIHNlcXVlbmNlKTsKKwkJcmV0ID0gdHRtX2JvX3Jlc2VydmUoJm52Ym8tPmJvLCB0cnVlLCBmYWxzZSwgdHJ1ZSwgc2VxdWVuY2UpOwogCQlpZiAocmV0KSB7CiAJCQl2YWxpZGF0ZV9maW5pKG9wLCBOVUxMKTsKLQkJCWlmIChyZXQgPT0gLUVBR0FJTikKLQkJCQlyZXQgPSB0dG1fYm9fd2FpdF91bnJlc2VydmVkKCZudmJvLT5ibywgZmFsc2UpOworCQkJaWYgKHVubGlrZWx5KHJldCA9PSAtRUFHQUlOKSkKKwkJCQlyZXQgPSB0dG1fYm9fd2FpdF91bnJlc2VydmVkKCZudmJvLT5ibywgdHJ1ZSk7CiAJCQlkcm1fZ2VtX29iamVjdF91bnJlZmVyZW5jZV91bmxvY2tlZChnZW0pOwotCQkJaWYgKHJldCkgewotCQkJCU5WX0VSUk9SKGRldiwgImZhaWwgcmVzZXJ2ZVxuIik7CisJCQlpZiAodW5saWtlbHkocmV0KSkgeworCQkJCWlmIChyZXQgIT0gLUVSRVNUQVJUU1lTKQorCQkJCQlOVl9FUlJPUihkZXYsICJmYWlsIHJlc2VydmVcbiIpOwogCQkJCXJldHVybiByZXQ7CiAJCQl9CiAJCQlnb3RvIHJldHJ5OwpAQCAtMzMxLDI1ICszMDEsNiBAQAogCQkJdmFsaWRhdGVfZmluaShvcCwgTlVMTCk7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQotCi0JCWlmICh1bmxpa2VseShhdG9taWNfcmVhZCgmbnZiby0+Ym8uY3B1X3dyaXRlcnMpID4gMCkpIHsKLQkJCXZhbGlkYXRlX2Zpbmkob3AsIE5VTEwpOwotCi0JCQlpZiAobnZiby0+Y3B1X2ZpbHAgPT0gZmlsZV9wcml2KSB7Ci0JCQkJTlZfRVJST1IoZGV2LCAiYm8gJXAgbWFwcGVkIGJ5IHByb2Nlc3MgdHJ5aW5nICIKLQkJCQkJICAgICAgInRvIHZhbGlkYXRlIGl0IVxuIiwgbnZibyk7Ci0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQl9Ci0KLQkJCW11dGV4X3VubG9jaygmZHJtX2dsb2JhbF9tdXRleCk7Ci0JCQlyZXQgPSB0dG1fYm9fd2FpdF9jcHUoJm52Ym8tPmJvLCBmYWxzZSk7Ci0JCQltdXRleF9sb2NrKCZkcm1fZ2xvYmFsX211dGV4KTsKLQkJCWlmIChyZXQpIHsKLQkJCQlOVl9FUlJPUihkZXYsICJmYWlsIHdhaXRfY3B1XG4iKTsKLQkJCQlyZXR1cm4gcmV0OwotCQkJfQotCQkJZ290byByZXRyeTsKLQkJfQogCX0KIAogCXJldHVybiAwOwpAQCAtMzgzLDExICszMzQsMTEgQEAKIAkJfQogCiAJCW52Ym8tPmNoYW5uZWwgPSAoYi0+cmVhZF9kb21haW5zICYgKDEgPDwgMzEpKSA/IE5VTEwgOiBjaGFuOwotCQlyZXQgPSB0dG1fYm9fdmFsaWRhdGUoJm52Ym8tPmJvLCAmbnZiby0+cGxhY2VtZW50LAotCQkJCSAgICAgIGZhbHNlLCBmYWxzZSwgZmFsc2UpOworCQlyZXQgPSBub3V2ZWF1X2JvX3ZhbGlkYXRlKG52Ym8sIHRydWUsIGZhbHNlLCBmYWxzZSk7CiAJCW52Ym8tPmNoYW5uZWwgPSBOVUxMOwogCQlpZiAodW5saWtlbHkocmV0KSkgewotCQkJTlZfRVJST1IoZGV2LCAiZmFpbCB0dG1fdmFsaWRhdGVcbiIpOworCQkJaWYgKHJldCAhPSAtRVJFU1RBUlRTWVMpCisJCQkJTlZfRVJST1IoZGV2LCAiZmFpbCB0dG1fdmFsaWRhdGVcbiIpOwogCQkJcmV0dXJuIHJldDsKIAkJfQogCkBAIC00MzksMTMgKzM5MCwxNSBAQAogCiAJcmV0ID0gdmFsaWRhdGVfaW5pdChjaGFuLCBmaWxlX3ByaXYsIHBiYm8sIG5yX2J1ZmZlcnMsIG9wKTsKIAlpZiAodW5saWtlbHkocmV0KSkgewotCQlOVl9FUlJPUihkZXYsICJ2YWxpZGF0ZV9pbml0XG4iKTsKKwkJaWYgKHJldCAhPSAtRVJFU1RBUlRTWVMpCisJCQlOVl9FUlJPUihkZXYsICJ2YWxpZGF0ZV9pbml0XG4iKTsKIAkJcmV0dXJuIHJldDsKIAl9CiAKIAlyZXQgPSB2YWxpZGF0ZV9saXN0KGNoYW4sICZvcC0+dnJhbV9saXN0LCBwYmJvLCB1c2VyX2J1ZmZlcnMpOwogCWlmICh1bmxpa2VseShyZXQgPCAwKSkgewotCQlOVl9FUlJPUihkZXYsICJ2YWxpZGF0ZSB2cmFtX2xpc3RcbiIpOworCQlpZiAocmV0ICE9IC1FUkVTVEFSVFNZUykKKwkJCU5WX0VSUk9SKGRldiwgInZhbGlkYXRlIHZyYW1fbGlzdFxuIik7CiAJCXZhbGlkYXRlX2Zpbmkob3AsIE5VTEwpOwogCQlyZXR1cm4gcmV0OwogCX0KQEAgLTQ1Myw3ICs0MDYsOCBAQAogCiAJcmV0ID0gdmFsaWRhdGVfbGlzdChjaGFuLCAmb3AtPmdhcnRfbGlzdCwgcGJibywgdXNlcl9idWZmZXJzKTsKIAlpZiAodW5saWtlbHkocmV0IDwgMCkpIHsKLQkJTlZfRVJST1IoZGV2LCAidmFsaWRhdGUgZ2FydF9saXN0XG4iKTsKKwkJaWYgKHJldCAhPSAtRVJFU1RBUlRTWVMpCisJCQlOVl9FUlJPUihkZXYsICJ2YWxpZGF0ZSBnYXJ0X2xpc3RcbiIpOwogCQl2YWxpZGF0ZV9maW5pKG9wLCBOVUxMKTsKIAkJcmV0dXJuIHJldDsKIAl9CkBAIC00NjEsNyArNDE1LDggQEAKIAogCXJldCA9IHZhbGlkYXRlX2xpc3QoY2hhbiwgJm9wLT5ib3RoX2xpc3QsIHBiYm8sIHVzZXJfYnVmZmVycyk7CiAJaWYgKHVubGlrZWx5KHJldCA8IDApKSB7Ci0JCU5WX0VSUk9SKGRldiwgInZhbGlkYXRlIGJvdGhfbGlzdFxuIik7CisJCWlmIChyZXQgIT0gLUVSRVNUQVJUU1lTKQorCQkJTlZfRVJST1IoZGV2LCAidmFsaWRhdGUgYm90aF9saXN0XG4iKTsKIAkJdmFsaWRhdGVfZmluaShvcCwgTlVMTCk7CiAJCXJldHVybiByZXQ7CiAJfQpAQCAtNTU3LDkgKzUxMiw5IEBACiAJCQkJZGF0YSB8PSByLT52b3I7CiAJCX0KIAotCQlzcGluX2xvY2soJm52Ym8tPmJvLmxvY2spOworCQlzcGluX2xvY2soJm52Ym8tPmJvLmJkZXYtPmZlbmNlX2xvY2spOwogCQlyZXQgPSB0dG1fYm9fd2FpdCgmbnZiby0+Ym8sIGZhbHNlLCBmYWxzZSwgZmFsc2UpOwotCQlzcGluX3VubG9jaygmbnZiby0+Ym8ubG9jayk7CisJCXNwaW5fdW5sb2NrKCZudmJvLT5iby5iZGV2LT5mZW5jZV9sb2NrKTsKIAkJaWYgKHJldCkgewogCQkJTlZfRVJST1IoZGV2LCAicmVsb2Mgd2FpdF9pZGxlIGZhaWxlZDogJWRcbiIsIHJldCk7CiAJCQlicmVhazsKQEAgLTU4NSw3ICs1NDAsOSBAQAogCXN0cnVjdCBub3V2ZWF1X2ZlbmNlICpmZW5jZSA9IE5VTEw7CiAJaW50IGksIGosIHJldCA9IDAsIGRvX3JlbG9jID0gMDsKIAotCU5PVVZFQVVfR0VUX1VTRVJfQ0hBTk5FTF9XSVRIX1JFVFVSTihyZXEtPmNoYW5uZWwsIGZpbGVfcHJpdiwgY2hhbik7CisJY2hhbiA9IG5vdXZlYXVfY2hhbm5lbF9nZXQoZGV2LCBmaWxlX3ByaXYsIHJlcS0+Y2hhbm5lbCk7CisJaWYgKElTX0VSUihjaGFuKSkKKwkJcmV0dXJuIFBUUl9FUlIoY2hhbik7CiAKIAlyZXEtPnZyYW1fYXZhaWxhYmxlID0gZGV2X3ByaXYtPmZiX2FwZXJfZnJlZTsKIAlyZXEtPmdhcnRfYXZhaWxhYmxlID0gZGV2X3ByaXYtPmdhcnRfaW5mby5hcGVyX2ZyZWU7CkBAIC01OTUsMjggKzU1MiwzNCBAQAogCWlmICh1bmxpa2VseShyZXEtPm5yX3B1c2ggPiBOT1VWRUFVX0dFTV9NQVhfUFVTSCkpIHsKIAkJTlZfRVJST1IoZGV2LCAicHVzaGJ1ZiBwdXNoIGNvdW50IGV4Y2VlZHMgbGltaXQ6ICVkIG1heCAlZFxuIiwKIAkJCSByZXEtPm5yX3B1c2gsIE5PVVZFQVVfR0VNX01BWF9QVVNIKTsKKwkJbm91dmVhdV9jaGFubmVsX3B1dCgmY2hhbik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAogCWlmICh1bmxpa2VseShyZXEtPm5yX2J1ZmZlcnMgPiBOT1VWRUFVX0dFTV9NQVhfQlVGRkVSUykpIHsKIAkJTlZfRVJST1IoZGV2LCAicHVzaGJ1ZiBibyBjb3VudCBleGNlZWRzIGxpbWl0OiAlZCBtYXggJWRcbiIsCiAJCQkgcmVxLT5ucl9idWZmZXJzLCBOT1VWRUFVX0dFTV9NQVhfQlVGRkVSUyk7CisJCW5vdXZlYXVfY2hhbm5lbF9wdXQoJmNoYW4pOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKIAlpZiAodW5saWtlbHkocmVxLT5ucl9yZWxvY3MgPiBOT1VWRUFVX0dFTV9NQVhfUkVMT0NTKSkgewogCQlOVl9FUlJPUihkZXYsICJwdXNoYnVmIHJlbG9jIGNvdW50IGV4Y2VlZHMgbGltaXQ6ICVkIG1heCAlZFxuIiwKIAkJCSByZXEtPm5yX3JlbG9jcywgTk9VVkVBVV9HRU1fTUFYX1JFTE9DUyk7CisJCW5vdXZlYXVfY2hhbm5lbF9wdXQoJmNoYW4pOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKIAlwdXNoID0gdV9tZW1jcHlhKHJlcS0+cHVzaCwgcmVxLT5ucl9wdXNoLCBzaXplb2YoKnB1c2gpKTsKLQlpZiAoSVNfRVJSKHB1c2gpKQorCWlmIChJU19FUlIocHVzaCkpIHsKKwkJbm91dmVhdV9jaGFubmVsX3B1dCgmY2hhbik7CiAJCXJldHVybiBQVFJfRVJSKHB1c2gpOworCX0KIAogCWJvID0gdV9tZW1jcHlhKHJlcS0+YnVmZmVycywgcmVxLT5ucl9idWZmZXJzLCBzaXplb2YoKmJvKSk7CiAJaWYgKElTX0VSUihibykpIHsKIAkJa2ZyZWUocHVzaCk7CisJCW5vdXZlYXVfY2hhbm5lbF9wdXQoJmNoYW4pOwogCQlyZXR1cm4gUFRSX0VSUihibyk7CiAJfQogCkBAIC02MzksNyArNjAyLDggQEAKIAlyZXQgPSBub3V2ZWF1X2dlbV9wdXNoYnVmX3ZhbGlkYXRlKGNoYW4sIGZpbGVfcHJpdiwgYm8sIHJlcS0+YnVmZmVycywKIAkJCQkJICAgcmVxLT5ucl9idWZmZXJzLCAmb3AsICZkb19yZWxvYyk7CiAJaWYgKHJldCkgewotCQlOVl9FUlJPUihkZXYsICJ2YWxpZGF0ZTogJWRcbiIsIHJldCk7CisJCWlmIChyZXQgIT0gLUVSRVNUQVJUU1lTKQorCQkJTlZfRVJST1IoZGV2LCAidmFsaWRhdGU6ICVkXG4iLCByZXQpOwogCQlnb3RvIG91dDsKIAl9CiAKQEAgLTczMiw3ICs2OTYsNyBAQAogCiBvdXQ6CiAJdmFsaWRhdGVfZmluaSgmb3AsIGZlbmNlKTsKLQlub3V2ZWF1X2ZlbmNlX3VucmVmKCh2b2lkKiopJmZlbmNlKTsKKwlub3V2ZWF1X2ZlbmNlX3VucmVmKCZmZW5jZSk7CiAJa2ZyZWUoYm8pOwogCWtmcmVlKHB1c2gpOwogCkBAIC03NTAsNiArNzE0LDcgQEAKIAkJcmVxLT5zdWZmaXgxID0gMHgwMDAwMDAwMDsKIAl9CiAKKwlub3V2ZWF1X2NoYW5uZWxfcHV0KCZjaGFuKTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC03ODEsMjYgKzc0Niw5IEBACiAJCXJldHVybiAtRU5PRU5UOwogCW52Ym8gPSBub3V2ZWF1X2dlbV9vYmplY3QoZ2VtKTsKIAotCWlmIChudmJvLT5jcHVfZmlscCkgewotCQlpZiAobnZiby0+Y3B1X2ZpbHAgPT0gZmlsZV9wcml2KQotCQkJZ290byBvdXQ7Ci0KLQkJcmV0ID0gdHRtX2JvX3dhaXRfY3B1KCZudmJvLT5ibywgbm9fd2FpdCk7Ci0JCWlmIChyZXQpCi0JCQlnb3RvIG91dDsKLQl9Ci0KLQlpZiAocmVxLT5mbGFncyAmIE5PVVZFQVVfR0VNX0NQVV9QUkVQX05PQkxPQ0spIHsKLQkJc3Bpbl9sb2NrKCZudmJvLT5iby5sb2NrKTsKLQkJcmV0ID0gdHRtX2JvX3dhaXQoJm52Ym8tPmJvLCBmYWxzZSwgZmFsc2UsIG5vX3dhaXQpOwotCQlzcGluX3VubG9jaygmbnZiby0+Ym8ubG9jayk7Ci0JfSBlbHNlIHsKLQkJcmV0ID0gdHRtX2JvX3N5bmNjcHVfd3JpdGVfZ3JhYigmbnZiby0+Ym8sIG5vX3dhaXQpOwotCQlpZiAocmV0ID09IDApCi0JCQludmJvLT5jcHVfZmlscCA9IGZpbGVfcHJpdjsKLQl9Ci0KLW91dDoKKwlzcGluX2xvY2soJm52Ym8tPmJvLmJkZXYtPmZlbmNlX2xvY2spOworCXJldCA9IHR0bV9ib193YWl0KCZudmJvLT5ibywgdHJ1ZSwgdHJ1ZSwgbm9fd2FpdCk7CisJc3Bpbl91bmxvY2soJm52Ym8tPmJvLmJkZXYtPmZlbmNlX2xvY2spOwogCWRybV9nZW1fb2JqZWN0X3VucmVmZXJlbmNlX3VubG9ja2VkKGdlbSk7CiAJcmV0dXJuIHJldDsKIH0KQEAgLTgwOSwyNiArNzU3LDcgQEAKIG5vdXZlYXVfZ2VtX2lvY3RsX2NwdV9maW5pKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEsCiAJCQkgICBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdikKIHsKLQlzdHJ1Y3QgZHJtX25vdXZlYXVfZ2VtX2NwdV9wcmVwICpyZXEgPSBkYXRhOwotCXN0cnVjdCBkcm1fZ2VtX29iamVjdCAqZ2VtOwotCXN0cnVjdCBub3V2ZWF1X2JvICpudmJvOwotCWludCByZXQgPSAtRUlOVkFMOwotCi0JZ2VtID0gZHJtX2dlbV9vYmplY3RfbG9va3VwKGRldiwgZmlsZV9wcml2LCByZXEtPmhhbmRsZSk7Ci0JaWYgKCFnZW0pCi0JCXJldHVybiAtRU5PRU5UOwotCW52Ym8gPSBub3V2ZWF1X2dlbV9vYmplY3QoZ2VtKTsKLQotCWlmIChudmJvLT5jcHVfZmlscCAhPSBmaWxlX3ByaXYpCi0JCWdvdG8gb3V0OwotCW52Ym8tPmNwdV9maWxwID0gTlVMTDsKLQotCXR0bV9ib19zeW5jY3B1X3dyaXRlX3JlbGVhc2UoJm52Ym8tPmJvKTsKLQlyZXQgPSAwOwotCi1vdXQ6Ci0JZHJtX2dlbV9vYmplY3RfdW5yZWZlcmVuY2VfdW5sb2NrZWQoZ2VtKTsKLQlyZXR1cm4gcmV0OworCXJldHVybiAwOwogfQogCiBpbnQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfaHcuYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfaHcuYwppbmRleCBiOTY3MmEwLi4wNTNlZGY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2h3LmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9ody5jCkBAIC05NTMsNyArOTUzLDcgQEAKIAkJCU5WV3JpdGVDUlRDKGRldiwgaGVhZCwgTlZfUENSVENfODUwLCByZWdwLT5jcnRjXzg1MCk7CiAKIAkJCXJlZzkwMCA9IE5WUmVhZFJBTURBQyhkZXYsIGhlYWQsIE5WX1BSQU1EQUNfOTAwKTsKLQkJCWlmIChyZWdwLT5jcnRjX2NmZyA9PSBOVl9QQ1JUQ19DT05GSUdfU1RBUlRfQUREUkVTU19IU1lOQykKKwkJCWlmIChyZWdwLT5jcnRjX2NmZyA9PSBOVjEwX1BDUlRDX0NPTkZJR19TVEFSVF9BRERSRVNTX0hTWU5DKQogCQkJCU5WV3JpdGVSQU1EQUMoZGV2LCBoZWFkLCBOVl9QUkFNREFDXzkwMCwgcmVnOTAwIHwgMHgxMDAwMCk7CiAJCQllbHNlCiAJCQkJTlZXcml0ZVJBTURBQyhkZXYsIGhlYWQsIE5WX1BSQU1EQUNfOTAwLCByZWc5MDAgJiB+MHgxMDAwMCk7CkBAIC05OTksOCArOTk5LDggQEAKIAkJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPT0gTlZfMTApIHsKIAkJCS8qIE5vdCB3YWl0aW5nIGZvciB2ZXJ0aWNhbCByZXRyYWNlIGJlZm9yZSBtb2RpZnlpbmcKIAkJCSAgIENSRV81My9DUkVfNTQgY2F1c2VzIGxvY2t1cHMuICovCi0JCQlub3V2ZWF1X3dhaXRfdW50aWwoZGV2LCA2NTAwMDAwMDAsIE5WX1BSTUNJT19JTlAwX19DT0xPUiwgMHg4LCAweDgpOwotCQkJbm91dmVhdV93YWl0X3VudGlsKGRldiwgNjUwMDAwMDAwLCBOVl9QUk1DSU9fSU5QMF9fQ09MT1IsIDB4OCwgMHgwKTsKKwkJCW5vdXZlYXVfd2FpdF9lcShkZXYsIDY1MDAwMDAwMCwgTlZfUFJNQ0lPX0lOUDBfX0NPTE9SLCAweDgsIDB4OCk7CisJCQlub3V2ZWF1X3dhaXRfZXEoZGV2LCA2NTAwMDAwMDAsIE5WX1BSTUNJT19JTlAwX19DT0xPUiwgMHg4LCAweDApOwogCQl9CiAKIAkJd3JfY2lvX3N0YXRlKGRldiwgaGVhZCwgcmVncCwgTlZfQ0lPX0NSRV81Myk7CkBAIC0xMDE3LDggKzEwMTcsOSBAQAogCiAJTlZXcml0ZUNSVEMoZGV2LCBoZWFkLCBOVl9QQ1JUQ19TVEFSVCwgcmVncC0+ZmJfc3RhcnQpOwogCi0JLyogU2V0dGluZyAxIG9uIHRoaXMgdmFsdWUgZ2l2ZXMgeW91IGludGVycnVwdHMgZm9yIGV2ZXJ5IHZibGFuayBwZXJpb2QuICovCi0JTlZXcml0ZUNSVEMoZGV2LCBoZWFkLCBOVl9QQ1JUQ19JTlRSX0VOXzAsIDApOworCS8qIEVuYWJsZSB2YmxhbmsgaW50ZXJydXB0cy4gKi8KKwlOVldyaXRlQ1JUQyhkZXYsIGhlYWQsIE5WX1BDUlRDX0lOVFJfRU5fMCwKKwkJICAgIChkZXYtPnZibGFua19lbmFibGVkW2hlYWRdID8gMSA6IDApKTsKIAlOVldyaXRlQ1JUQyhkZXYsIGhlYWQsIE5WX1BDUlRDX0lOVFJfMCwgTlZfUENSVENfSU5UUl8wX1ZCTEFOSyk7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfaXJxLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2lycS5jCmluZGV4IDdiZmQ5ZTYuLjJiYTcyNjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfaXJxLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9pcnEuYwpAQCAtMzYsMTggKzM2LDcgQEAKICNpbmNsdWRlICJub3V2ZWF1X2Rydi5oIgogI2luY2x1ZGUgIm5vdXZlYXVfcmVnLmgiCiAjaW5jbHVkZSAibm91dmVhdV9yYW1odC5oIgotI2luY2x1ZGUgPGxpbnV4L3JhdGVsaW1pdC5oPgotCi0vKiBuZWVkZWQgZm9yIGhvdHBsdWcgaXJxICovCi0jaW5jbHVkZSAibm91dmVhdV9jb25uZWN0b3IuaCIKLSNpbmNsdWRlICJudjUwX2Rpc3BsYXkuaCIKLQotc3RhdGljIERFRklORV9SQVRFTElNSVRfU1RBVEUobm91dmVhdV9yYXRlbGltaXRfc3RhdGUsIDMgKiBIWiwgMjApOwotCi1zdGF0aWMgaW50IG5vdXZlYXVfcmF0ZWxpbWl0KHZvaWQpCi17Ci0JcmV0dXJuIF9fcmF0ZWxpbWl0KCZub3V2ZWF1X3JhdGVsaW1pdF9zdGF0ZSk7Ci19CisjaW5jbHVkZSAibm91dmVhdV91dGlsLmgiCiAKIHZvaWQKIG5vdXZlYXVfaXJxX3ByZWluc3RhbGwoc3RydWN0IGRybV9kZXZpY2UgKmRldikKQEAgLTU3LDE5ICs0NiwxOSBAQAogCS8qIE1hc3RlciBkaXNhYmxlICovCiAJbnZfd3IzMihkZXYsIE5WMDNfUE1DX0lOVFJfRU5fMCwgMCk7CiAKLQlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA+PSBOVl81MCkgewotCQlJTklUX1dPUksoJmRldl9wcml2LT5pcnFfd29yaywgbnY1MF9kaXNwbGF5X2lycV9oYW5kbGVyX2JoKTsKLQkJSU5JVF9XT1JLKCZkZXZfcHJpdi0+aHBkX3dvcmssIG52NTBfZGlzcGxheV9pcnFfaG90cGx1Z19iaCk7Ci0JCXNwaW5fbG9ja19pbml0KCZkZXZfcHJpdi0+aHBkX3N0YXRlLmxvY2spOwotCQlJTklUX0xJU1RfSEVBRCgmZGV2X3ByaXYtPnZibF93YWl0aW5nKTsKLQl9CisJSU5JVF9MSVNUX0hFQUQoJmRldl9wcml2LT52Ymxfd2FpdGluZyk7CiB9CiAKIGludAogbm91dmVhdV9pcnFfcG9zdGluc3RhbGwoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCiAJLyogTWFzdGVyIGVuYWJsZSAqLwogCW52X3dyMzIoZGV2LCBOVjAzX1BNQ19JTlRSX0VOXzAsIE5WX1BNQ19JTlRSX0VOXzBfTUFTVEVSX0VOQUJMRSk7CisJaWYgKGRldl9wcml2LT5tc2lfZW5hYmxlZCkKKwkJbnZfd3IwOChkZXYsIDB4MDAwODgwNjgsIDB4ZmYpOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTgwLDExNzggKzY5LDgzIEBACiAJbnZfd3IzMihkZXYsIE5WMDNfUE1DX0lOVFJfRU5fMCwgMCk7CiB9CiAKLXN0YXRpYyBpbnQKLW5vdXZlYXVfY2FsbF9tZXRob2Qoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbiwgaW50IGNsYXNzLCBpbnQgbXRoZCwgaW50IGRhdGEpCi17Ci0Jc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gY2hhbi0+ZGV2LT5kZXZfcHJpdmF0ZTsKLQlzdHJ1Y3Qgbm91dmVhdV9wZ3JhcGhfb2JqZWN0X21ldGhvZCAqZ3JtOwotCXN0cnVjdCBub3V2ZWF1X3BncmFwaF9vYmplY3RfY2xhc3MgKmdyYzsKLQotCWdyYyA9IGRldl9wcml2LT5lbmdpbmUuZ3JhcGguZ3JjbGFzczsKLQl3aGlsZSAoZ3JjLT5pZCkgewotCQlpZiAoZ3JjLT5pZCA9PSBjbGFzcykKLQkJCWJyZWFrOwotCQlncmMrKzsKLQl9Ci0KLQlpZiAoZ3JjLT5pZCAhPSBjbGFzcyB8fCAhZ3JjLT5tZXRob2RzKQotCQlyZXR1cm4gLUVOT0VOVDsKLQotCWdybSA9IGdyYy0+bWV0aG9kczsKLQl3aGlsZSAoZ3JtLT5pZCkgewotCQlpZiAoZ3JtLT5pZCA9PSBtdGhkKQotCQkJcmV0dXJuIGdybS0+ZXhlYyhjaGFuLCBjbGFzcywgbXRoZCwgZGF0YSk7Ci0JCWdybSsrOwotCX0KLQotCXJldHVybiAtRU5PRU5UOwotfQotCi1zdGF0aWMgYm9vbAotbm91dmVhdV9maWZvX3N3bXRoZChzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuLCB1aW50MzJfdCBhZGRyLCB1aW50MzJfdCBkYXRhKQotewotCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjaGFuLT5kZXY7Ci0JY29uc3QgaW50IHN1YmMgPSAoYWRkciA+PiAxMykgJiAweDc7Ci0JY29uc3QgaW50IG10aGQgPSBhZGRyICYgMHgxZmZjOwotCi0JaWYgKG10aGQgPT0gMHgwMDAwKSB7Ci0JCXN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqZ3B1b2JqOwotCi0JCWdwdW9iaiA9IG5vdXZlYXVfcmFtaHRfZmluZChjaGFuLCBkYXRhKTsKLQkJaWYgKCFncHVvYmopCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJaWYgKGdwdW9iai0+ZW5naW5lICE9IE5WT0JKX0VOR0lORV9TVykKLQkJCXJldHVybiBmYWxzZTsKLQotCQljaGFuLT5zd19zdWJjaGFubmVsW3N1YmNdID0gZ3B1b2JqLT5jbGFzczsKLQkJbnZfd3IzMihkZXYsIE5WMDRfUEZJRk9fQ0FDSEUxX0VOR0lORSwgbnZfcmQzMihkZXYsCi0JCQlOVjA0X1BGSUZPX0NBQ0hFMV9FTkdJTkUpICYgfigweGYgPDwgc3ViYyAqIDQpKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyogaHcgb2JqZWN0ICovCi0JaWYgKG52X3JkMzIoZGV2LCBOVjA0X1BGSUZPX0NBQ0hFMV9FTkdJTkUpICYgKDEgPDwgKHN1YmMqNCkpKQotCQlyZXR1cm4gZmFsc2U7Ci0KLQlpZiAobm91dmVhdV9jYWxsX21ldGhvZChjaGFuLCBjaGFuLT5zd19zdWJjaGFubmVsW3N1YmNdLCBtdGhkLCBkYXRhKSkKLQkJcmV0dXJuIGZhbHNlOwotCi0JcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyB2b2lkCi1ub3V2ZWF1X2ZpZm9faXJxX2hhbmRsZXIoc3RydWN0IGRybV9kZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCXN0cnVjdCBub3V2ZWF1X2VuZ2luZSAqZW5naW5lID0gJmRldl9wcml2LT5lbmdpbmU7Ci0JdWludDMyX3Qgc3RhdHVzLCByZWFzc2lnbjsKLQlpbnQgY250ID0gMDsKLQotCXJlYXNzaWduID0gbnZfcmQzMihkZXYsIE5WMDNfUEZJRk9fQ0FDSEVTKSAmIDE7Ci0Jd2hpbGUgKChzdGF0dXMgPSBudl9yZDMyKGRldiwgTlYwM19QRklGT19JTlRSXzApKSAmJiAoY250KysgPCAxMDApKSB7Ci0JCXN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4gPSBOVUxMOwotCQl1aW50MzJfdCBjaGlkLCBnZXQ7Ci0KLQkJbnZfd3IzMihkZXYsIE5WMDNfUEZJRk9fQ0FDSEVTLCAwKTsKLQotCQljaGlkID0gZW5naW5lLT5maWZvLmNoYW5uZWxfaWQoZGV2KTsKLQkJaWYgKGNoaWQgPj0gMCAmJiBjaGlkIDwgZW5naW5lLT5maWZvLmNoYW5uZWxzKQotCQkJY2hhbiA9IGRldl9wcml2LT5maWZvc1tjaGlkXTsKLQkJZ2V0ICA9IG52X3JkMzIoZGV2LCBOVjAzX1BGSUZPX0NBQ0hFMV9HRVQpOwotCi0JCWlmIChzdGF0dXMgJiBOVl9QRklGT19JTlRSX0NBQ0hFX0VSUk9SKSB7Ci0JCQl1aW50MzJfdCBtdGhkLCBkYXRhOwotCQkJaW50IHB0cjsKLQotCQkJLyogTlZfUEZJRk9fQ0FDSEUxX0dFVCBhY3R1YWxseSBnb2VzIHRvIDB4ZmZjIGJlZm9yZQotCQkJICogd3JhcHBpbmcgb24gbXkgRzgwIGNoaXBzLCBidXQgQ0FDSEUxIGlzbid0IGJpZwotCQkJICogZW5vdWdoIGZvciB0aGlzIG11Y2ggZGF0YS4uIFRlc3RzIHNob3cgdGhhdCBpdAotCQkJICogd3JhcHMgYXJvdW5kIHRvIHRoZSBzdGFydCBhdCBHRVQ9MHg4MDAuLiBObyBjbHVlCi0JCQkgKiBhcyB0byB3aHkuLgotCQkJICovCi0JCQlwdHIgPSAoZ2V0ICYgMHg3ZmYpID4+IDI7Ci0KLQkJCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlIDwgTlZfNDApIHsKLQkJCQltdGhkID0gbnZfcmQzMihkZXYsCi0JCQkJCU5WMDRfUEZJRk9fQ0FDSEUxX01FVEhPRChwdHIpKTsKLQkJCQlkYXRhID0gbnZfcmQzMihkZXYsCi0JCQkJCU5WMDRfUEZJRk9fQ0FDSEUxX0RBVEEocHRyKSk7Ci0JCQl9IGVsc2UgewotCQkJCW10aGQgPSBudl9yZDMyKGRldiwKLQkJCQkJTlY0MF9QRklGT19DQUNIRTFfTUVUSE9EKHB0cikpOwotCQkJCWRhdGEgPSBudl9yZDMyKGRldiwKLQkJCQkJTlY0MF9QRklGT19DQUNIRTFfREFUQShwdHIpKTsKLQkJCX0KLQotCQkJaWYgKCFjaGFuIHx8ICFub3V2ZWF1X2ZpZm9fc3dtdGhkKGNoYW4sIG10aGQsIGRhdGEpKSB7Ci0JCQkJTlZfSU5GTyhkZXYsICJQRklGT19DQUNIRV9FUlJPUiAtIENoICVkLyVkICIKLQkJCQkJICAgICAiTXRoZCAweCUwNHggRGF0YSAweCUwOHhcbiIsCi0JCQkJCWNoaWQsIChtdGhkID4+IDEzKSAmIDcsIG10aGQgJiAweDFmZmMsCi0JCQkJCWRhdGEpOwotCQkJfQotCi0JCQludl93cjMyKGRldiwgTlYwNF9QRklGT19DQUNIRTFfRE1BX1BVU0gsIDApOwotCQkJbnZfd3IzMihkZXYsIE5WMDNfUEZJRk9fSU5UUl8wLAotCQkJCQkJTlZfUEZJRk9fSU5UUl9DQUNIRV9FUlJPUik7Ci0KLQkJCW52X3dyMzIoZGV2LCBOVjAzX1BGSUZPX0NBQ0hFMV9QVVNIMCwKLQkJCQludl9yZDMyKGRldiwgTlYwM19QRklGT19DQUNIRTFfUFVTSDApICYgfjEpOwotCQkJbnZfd3IzMihkZXYsIE5WMDNfUEZJRk9fQ0FDSEUxX0dFVCwgZ2V0ICsgNCk7Ci0JCQludl93cjMyKGRldiwgTlYwM19QRklGT19DQUNIRTFfUFVTSDAsCi0JCQkJbnZfcmQzMihkZXYsIE5WMDNfUEZJRk9fQ0FDSEUxX1BVU0gwKSB8IDEpOwotCQkJbnZfd3IzMihkZXYsIE5WMDRfUEZJRk9fQ0FDSEUxX0hBU0gsIDApOwotCi0JCQludl93cjMyKGRldiwgTlYwNF9QRklGT19DQUNIRTFfRE1BX1BVU0gsCi0JCQkJbnZfcmQzMihkZXYsIE5WMDRfUEZJRk9fQ0FDSEUxX0RNQV9QVVNIKSB8IDEpOwotCQkJbnZfd3IzMihkZXYsIE5WMDRfUEZJRk9fQ0FDSEUxX1BVTEwwLCAxKTsKLQotCQkJc3RhdHVzICY9IH5OVl9QRklGT19JTlRSX0NBQ0hFX0VSUk9SOwotCQl9Ci0KLQkJaWYgKHN0YXR1cyAmIE5WX1BGSUZPX0lOVFJfRE1BX1BVU0hFUikgewotCQkJdTMyIGRtYV9nZXQgPSBudl9yZDMyKGRldiwgMHgwMDMyNDQpOwotCQkJdTMyIGRtYV9wdXQgPSBudl9yZDMyKGRldiwgMHgwMDMyNDApOwotCQkJdTMyIHB1c2ggPSBudl9yZDMyKGRldiwgMHgwMDMyMjApOwotCQkJdTMyIHN0YXRlID0gbnZfcmQzMihkZXYsIDB4MDAzMjI4KTsKLQotCQkJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPT0gTlZfNTApIHsKLQkJCQl1MzIgaG9fZ2V0ID0gbnZfcmQzMihkZXYsIDB4MDAzMzI4KTsKLQkJCQl1MzIgaG9fcHV0ID0gbnZfcmQzMihkZXYsIDB4MDAzMzIwKTsKLQkJCQl1MzIgaWJfZ2V0ID0gbnZfcmQzMihkZXYsIDB4MDAzMzM0KTsKLQkJCQl1MzIgaWJfcHV0ID0gbnZfcmQzMihkZXYsIDB4MDAzMzMwKTsKLQotCQkJCWlmIChub3V2ZWF1X3JhdGVsaW1pdCgpKQotCQkJCQlOVl9JTkZPKGRldiwgIlBGSUZPX0RNQV9QVVNIRVIgLSBDaCAlZCBHZXQgMHglMDJ4JTA4eCAiCi0JCQkJCSAgICAgIlB1dCAweCUwMnglMDh4IEliR2V0IDB4JTA4eCBJYlB1dCAweCUwOHggIgotCQkJCQkgICAgICJTdGF0ZSAweCUwOHggUHVzaCAweCUwOHhcbiIsCi0JCQkJCQljaGlkLCBob19nZXQsIGRtYV9nZXQsIGhvX3B1dCwKLQkJCQkJCWRtYV9wdXQsIGliX2dldCwgaWJfcHV0LCBzdGF0ZSwKLQkJCQkJCXB1c2gpOwotCi0JCQkJLyogTUVUSE9EX0NPVU5ULCBpbiBETUFfU1RBVEUgb24gZWFybGllciBjaGlwc2V0cyAqLwotCQkJCW52X3dyMzIoZGV2LCAweDAwMzM2NCwgMHgwMDAwMDAwMCk7Ci0JCQkJaWYgKGRtYV9nZXQgIT0gZG1hX3B1dCB8fCBob19nZXQgIT0gaG9fcHV0KSB7Ci0JCQkJCW52X3dyMzIoZGV2LCAweDAwMzI0NCwgZG1hX3B1dCk7Ci0JCQkJCW52X3dyMzIoZGV2LCAweDAwMzMyOCwgaG9fcHV0KTsKLQkJCQl9IGVsc2UKLQkJCQlpZiAoaWJfZ2V0ICE9IGliX3B1dCkgewotCQkJCQludl93cjMyKGRldiwgMHgwMDMzMzQsIGliX3B1dCk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlOVl9JTkZPKGRldiwgIlBGSUZPX0RNQV9QVVNIRVIgLSBDaCAlZCBHZXQgMHglMDh4ICIKLQkJCQkJICAgICAiUHV0IDB4JTA4eCBTdGF0ZSAweCUwOHggUHVzaCAweCUwOHhcbiIsCi0JCQkJCWNoaWQsIGRtYV9nZXQsIGRtYV9wdXQsIHN0YXRlLCBwdXNoKTsKLQotCQkJCWlmIChkbWFfZ2V0ICE9IGRtYV9wdXQpCi0JCQkJCW52X3dyMzIoZGV2LCAweDAwMzI0NCwgZG1hX3B1dCk7Ci0JCQl9Ci0KLQkJCW52X3dyMzIoZGV2LCAweDAwMzIyOCwgMHgwMDAwMDAwMCk7Ci0JCQludl93cjMyKGRldiwgMHgwMDMyMjAsIDB4MDAwMDAwMDEpOwotCQkJbnZfd3IzMihkZXYsIDB4MDAyMTAwLCBOVl9QRklGT19JTlRSX0RNQV9QVVNIRVIpOwotCQkJc3RhdHVzICY9IH5OVl9QRklGT19JTlRSX0RNQV9QVVNIRVI7Ci0JCX0KLQotCQlpZiAoc3RhdHVzICYgTlZfUEZJRk9fSU5UUl9TRU1BUEhPUkUpIHsKLQkJCXVpbnQzMl90IHNlbTsKLQotCQkJc3RhdHVzICY9IH5OVl9QRklGT19JTlRSX1NFTUFQSE9SRTsKLQkJCW52X3dyMzIoZGV2LCBOVjAzX1BGSUZPX0lOVFJfMCwKLQkJCQlOVl9QRklGT19JTlRSX1NFTUFQSE9SRSk7Ci0KLQkJCXNlbSA9IG52X3JkMzIoZGV2LCBOVjEwX1BGSUZPX0NBQ0hFMV9TRU1BUEhPUkUpOwotCQkJbnZfd3IzMihkZXYsIE5WMTBfUEZJRk9fQ0FDSEUxX1NFTUFQSE9SRSwgc2VtIHwgMHgxKTsKLQotCQkJbnZfd3IzMihkZXYsIE5WMDNfUEZJRk9fQ0FDSEUxX0dFVCwgZ2V0ICsgNCk7Ci0JCQludl93cjMyKGRldiwgTlYwNF9QRklGT19DQUNIRTFfUFVMTDAsIDEpOwotCQl9Ci0KLQkJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPT0gTlZfNTApIHsKLQkJCWlmIChzdGF0dXMgJiAweDAwMDAwMDEwKSB7Ci0JCQkJbnY1MF9mYl92bV90cmFwKGRldiwgMSwgIlBGSUZPX0JBUl9GQVVMVCIpOwotCQkJCXN0YXR1cyAmPSB+MHgwMDAwMDAxMDsKLQkJCQludl93cjMyKGRldiwgMHgwMDIxMDAsIDB4MDAwMDAwMTApOwotCQkJfQotCQl9Ci0KLQkJaWYgKHN0YXR1cykgewotCQkJaWYgKG5vdXZlYXVfcmF0ZWxpbWl0KCkpCi0JCQkJTlZfSU5GTyhkZXYsICJQRklGT19JTlRSIDB4JTA4eCAtIENoICVkXG4iLAotCQkJCQlzdGF0dXMsIGNoaWQpOwotCQkJbnZfd3IzMihkZXYsIE5WMDNfUEZJRk9fSU5UUl8wLCBzdGF0dXMpOwotCQkJc3RhdHVzID0gMDsKLQkJfQotCi0JCW52X3dyMzIoZGV2LCBOVjAzX1BGSUZPX0NBQ0hFUywgcmVhc3NpZ24pOwotCX0KLQotCWlmIChzdGF0dXMpIHsKLQkJTlZfSU5GTyhkZXYsICJQRklGTyBzdGlsbCBhbmdyeSBhZnRlciAlZCBzcGlucywgaGFsdFxuIiwgY250KTsKLQkJbnZfd3IzMihkZXYsIDB4MjE0MCwgMCk7Ci0JCW52X3dyMzIoZGV2LCAweDE0MCwgMCk7Ci0JfQotCi0JbnZfd3IzMihkZXYsIE5WMDNfUE1DX0lOVFJfMCwgTlZfUE1DX0lOVFJfMF9QRklGT19QRU5ESU5HKTsKLX0KLQotc3RydWN0IG5vdXZlYXVfYml0ZmllbGRfbmFtZXMgewotCXVpbnQzMl90IG1hc2s7Ci0JY29uc3QgY2hhciAqbmFtZTsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgbm91dmVhdV9iaXRmaWVsZF9uYW1lcyBuc3RhdHVzX25hbWVzW10gPQotewotCXsgTlYwNF9QR1JBUEhfTlNUQVRVU19TVEFURV9JTl9VU0UsICAgICAgICJTVEFURV9JTl9VU0UiIH0sCi0JeyBOVjA0X1BHUkFQSF9OU1RBVFVTX0lOVkFMSURfU1RBVEUsICAgICAgIklOVkFMSURfU1RBVEUiIH0sCi0JeyBOVjA0X1BHUkFQSF9OU1RBVFVTX0JBRF9BUkdVTUVOVCwgICAgICAgIkJBRF9BUkdVTUVOVCIgfSwKLQl7IE5WMDRfUEdSQVBIX05TVEFUVVNfUFJPVEVDVElPTl9GQVVMVCwgICAiUFJPVEVDVElPTl9GQVVMVCIgfQotfTsKLQotc3RhdGljIHN0cnVjdCBub3V2ZWF1X2JpdGZpZWxkX25hbWVzIG5zdGF0dXNfbmFtZXNfbnYxMFtdID0KLXsKLQl7IE5WMTBfUEdSQVBIX05TVEFUVVNfU1RBVEVfSU5fVVNFLCAgICAgICAiU1RBVEVfSU5fVVNFIiB9LAotCXsgTlYxMF9QR1JBUEhfTlNUQVRVU19JTlZBTElEX1NUQVRFLCAgICAgICJJTlZBTElEX1NUQVRFIiB9LAotCXsgTlYxMF9QR1JBUEhfTlNUQVRVU19CQURfQVJHVU1FTlQsICAgICAgICJCQURfQVJHVU1FTlQiIH0sCi0JeyBOVjEwX1BHUkFQSF9OU1RBVFVTX1BST1RFQ1RJT05fRkFVTFQsICAgIlBST1RFQ1RJT05fRkFVTFQiIH0KLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgbm91dmVhdV9iaXRmaWVsZF9uYW1lcyBuc291cmNlX25hbWVzW10gPQotewotCXsgTlYwM19QR1JBUEhfTlNPVVJDRV9OT1RJRklDQVRJT04sICAgICAgICJOT1RJRklDQVRJT04iIH0sCi0JeyBOVjAzX1BHUkFQSF9OU09VUkNFX0RBVEFfRVJST1IsICAgICAgICAgIkRBVEFfRVJST1IiIH0sCi0JeyBOVjAzX1BHUkFQSF9OU09VUkNFX1BST1RFQ1RJT05fRVJST1IsICAgIlBST1RFQ1RJT05fRVJST1IiIH0sCi0JeyBOVjAzX1BHUkFQSF9OU09VUkNFX1JBTkdFX0VYQ0VQVElPTiwgICAgIlJBTkdFX0VYQ0VQVElPTiIgfSwKLQl7IE5WMDNfUEdSQVBIX05TT1VSQ0VfTElNSVRfQ09MT1IsICAgICAgICAiTElNSVRfQ09MT1IiIH0sCi0JeyBOVjAzX1BHUkFQSF9OU09VUkNFX0xJTUlUX1pFVEEsICAgICAgICAgIkxJTUlUX1pFVEEiIH0sCi0JeyBOVjAzX1BHUkFQSF9OU09VUkNFX0lMTEVHQUxfTVRIRCwgICAgICAgIklMTEVHQUxfTVRIRCIgfSwKLQl7IE5WMDNfUEdSQVBIX05TT1VSQ0VfRE1BX1JfUFJPVEVDVElPTiwgICAiRE1BX1JfUFJPVEVDVElPTiIgfSwKLQl7IE5WMDNfUEdSQVBIX05TT1VSQ0VfRE1BX1dfUFJPVEVDVElPTiwgICAiRE1BX1dfUFJPVEVDVElPTiIgfSwKLQl7IE5WMDNfUEdSQVBIX05TT1VSQ0VfRk9STUFUX0VYQ0VQVElPTiwgICAiRk9STUFUX0VYQ0VQVElPTiIgfSwKLQl7IE5WMDNfUEdSQVBIX05TT1VSQ0VfUEFUQ0hfRVhDRVBUSU9OLCAgICAiUEFUQ0hfRVhDRVBUSU9OIiB9LAotCXsgTlYwM19QR1JBUEhfTlNPVVJDRV9TVEFURV9JTlZBTElELCAgICAgICJTVEFURV9JTlZBTElEIiB9LAotCXsgTlYwM19QR1JBUEhfTlNPVVJDRV9ET1VCTEVfTk9USUZZLCAgICAgICJET1VCTEVfTk9USUZZIiB9LAotCXsgTlYwM19QR1JBUEhfTlNPVVJDRV9OT1RJRllfSU5fVVNFLCAgICAgICJOT1RJRllfSU5fVVNFIiB9LAotCXsgTlYwM19QR1JBUEhfTlNPVVJDRV9NRVRIT0RfQ05ULCAgICAgICAgICJNRVRIT0RfQ05UIiB9LAotCXsgTlYwM19QR1JBUEhfTlNPVVJDRV9CRlJfTk9USUZJQ0FUSU9OLCAgICJCRlJfTk9USUZJQ0FUSU9OIiB9LAotCXsgTlYwM19QR1JBUEhfTlNPVVJDRV9ETUFfVlRYX1BST1RFQ1RJT04sICJETUFfVlRYX1BST1RFQ1RJT04iIH0sCi0JeyBOVjAzX1BHUkFQSF9OU09VUkNFX0RNQV9XSURUSF9BLCAgICAgICAgIkRNQV9XSURUSF9BIiB9LAotCXsgTlYwM19QR1JBUEhfTlNPVVJDRV9ETUFfV0lEVEhfQiwgICAgICAgICJETUFfV0lEVEhfQiIgfSwKLX07Ci0KLXN0YXRpYyB2b2lkCi1ub3V2ZWF1X3ByaW50X2JpdGZpZWxkX25hbWVzXyh1aW50MzJfdCB2YWx1ZSwKLQkJCQljb25zdCBzdHJ1Y3Qgbm91dmVhdV9iaXRmaWVsZF9uYW1lcyAqbmFtZWxpc3QsCi0JCQkJY29uc3QgaW50IG5hbWVsaXN0X2xlbikKLXsKLQkvKgotCSAqIENhbGxlciBtdXN0IGhhdmUgYWxyZWFkeSBwcmludGVkIHRoZSBLRVJOXyogbG9nIGxldmVsIGZvciB1cy4KLQkgKiBBbHNvIHRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGFkZGluZyB0aGUgbmV3bGluZS4KLQkgKi8KLQlpbnQgaTsKLQlmb3IgKGkgPSAwOyBpIDwgbmFtZWxpc3RfbGVuOyArK2kpIHsKLQkJdWludDMyX3QgbWFzayA9IG5hbWVsaXN0W2ldLm1hc2s7Ci0JCWlmICh2YWx1ZSAmIG1hc2spIHsKLQkJCXByaW50aygiICVzIiwgbmFtZWxpc3RbaV0ubmFtZSk7Ci0JCQl2YWx1ZSAmPSB+bWFzazsKLQkJfQotCX0KLQlpZiAodmFsdWUpCi0JCXByaW50aygiICh1bmtub3duIGJpdHMgMHglMDh4KSIsIHZhbHVlKTsKLX0KLSNkZWZpbmUgbm91dmVhdV9wcmludF9iaXRmaWVsZF9uYW1lcyh2YWwsIG5hbWVsaXN0KSBcCi0Jbm91dmVhdV9wcmludF9iaXRmaWVsZF9uYW1lc18oKHZhbCksIChuYW1lbGlzdCksIEFSUkFZX1NJWkUobmFtZWxpc3QpKQotCi1zdHJ1Y3Qgbm91dmVhdV9lbnVtX25hbWVzIHsKLQl1aW50MzJfdCB2YWx1ZTsKLQljb25zdCBjaGFyICpuYW1lOwotfTsKLQotc3RhdGljIHZvaWQKLW5vdXZlYXVfcHJpbnRfZW51bV9uYW1lc18odWludDMyX3QgdmFsdWUsCi0JCQkJY29uc3Qgc3RydWN0IG5vdXZlYXVfZW51bV9uYW1lcyAqbmFtZWxpc3QsCi0JCQkJY29uc3QgaW50IG5hbWVsaXN0X2xlbikKLXsKLQkvKgotCSAqIENhbGxlciBtdXN0IGhhdmUgYWxyZWFkeSBwcmludGVkIHRoZSBLRVJOXyogbG9nIGxldmVsIGZvciB1cy4KLQkgKiBBbHNvIHRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGFkZGluZyB0aGUgbmV3bGluZS4KLQkgKi8KLQlpbnQgaTsKLQlmb3IgKGkgPSAwOyBpIDwgbmFtZWxpc3RfbGVuOyArK2kpIHsKLQkJaWYgKHZhbHVlID09IG5hbWVsaXN0W2ldLnZhbHVlKSB7Ci0JCQlwcmludGsoIiVzIiwgbmFtZWxpc3RbaV0ubmFtZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0JcHJpbnRrKCJ1bmtub3duIHZhbHVlIDB4JTA4eCIsIHZhbHVlKTsKLX0KLSNkZWZpbmUgbm91dmVhdV9wcmludF9lbnVtX25hbWVzKHZhbCwgbmFtZWxpc3QpIFwKLQlub3V2ZWF1X3ByaW50X2VudW1fbmFtZXNfKCh2YWwpLCAobmFtZWxpc3QpLCBBUlJBWV9TSVpFKG5hbWVsaXN0KSkKLQotc3RhdGljIGludAotbm91dmVhdV9ncmFwaF9jaGlkX2Zyb21fZ3JjdHgoc3RydWN0IGRybV9kZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCXVpbnQzMl90IGluc3Q7Ci0JaW50IGk7Ci0KLQlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA8IE5WXzQwKQotCQlyZXR1cm4gZGV2X3ByaXYtPmVuZ2luZS5maWZvLmNoYW5uZWxzOwotCWVsc2UKLQlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA8IE5WXzUwKSB7Ci0JCWluc3QgPSAobnZfcmQzMihkZXYsIDB4NDAwMzJjKSAmIDB4ZmZmZmYpIDw8IDQ7Ci0KLQkJZm9yIChpID0gMDsgaSA8IGRldl9wcml2LT5lbmdpbmUuZmlmby5jaGFubmVsczsgaSsrKSB7Ci0JCQlzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuID0gZGV2X3ByaXYtPmZpZm9zW2ldOwotCi0JCQlpZiAoIWNoYW4gfHwgIWNoYW4tPnJhbWluX2dyY3R4KQotCQkJCWNvbnRpbnVlOwotCi0JCQlpZiAoaW5zdCA9PSBjaGFuLT5yYW1pbl9ncmN0eC0+cGluc3QpCi0JCQkJYnJlYWs7Ci0JCX0KLQl9IGVsc2UgewotCQlpbnN0ID0gKG52X3JkMzIoZGV2LCAweDQwMDMyYykgJiAweGZmZmZmKSA8PCAxMjsKLQotCQlmb3IgKGkgPSAwOyBpIDwgZGV2X3ByaXYtPmVuZ2luZS5maWZvLmNoYW5uZWxzOyBpKyspIHsKLQkJCXN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4gPSBkZXZfcHJpdi0+Zmlmb3NbaV07Ci0KLQkJCWlmICghY2hhbiB8fCAhY2hhbi0+cmFtaW4pCi0JCQkJY29udGludWU7Ci0KLQkJCWlmIChpbnN0ID09IGNoYW4tPnJhbWluLT52aW5zdCkKLQkJCQlicmVhazsKLQkJfQotCX0KLQotCi0JcmV0dXJuIGk7Ci19Ci0KLXN0YXRpYyBpbnQKLW5vdXZlYXVfZ3JhcGhfdHJhcHBlZF9jaGFubmVsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCAqY2hhbm5lbF9yZXQpCi17Ci0Jc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlzdHJ1Y3Qgbm91dmVhdV9lbmdpbmUgKmVuZ2luZSA9ICZkZXZfcHJpdi0+ZW5naW5lOwotCWludCBjaGFubmVsOwotCi0JaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPCBOVl8xMCkKLQkJY2hhbm5lbCA9IChudl9yZDMyKGRldiwgTlYwNF9QR1JBUEhfVFJBUFBFRF9BRERSKSA+PiAyNCkgJiAweGY7Ci0JZWxzZQotCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlIDwgTlZfNDApCi0JCWNoYW5uZWwgPSAobnZfcmQzMihkZXYsIE5WMDRfUEdSQVBIX1RSQVBQRURfQUREUikgPj4gMjApICYgMHgxZjsKLQllbHNlCi0JCWNoYW5uZWwgPSBub3V2ZWF1X2dyYXBoX2NoaWRfZnJvbV9ncmN0eChkZXYpOwotCi0JaWYgKGNoYW5uZWwgPj0gZW5naW5lLT5maWZvLmNoYW5uZWxzIHx8ICFkZXZfcHJpdi0+Zmlmb3NbY2hhbm5lbF0pIHsKLQkJTlZfRVJST1IoZGV2LCAiQUlJSSwgaW52YWxpZC9pbmFjdGl2ZSBjaGFubmVsIGlkICVkXG4iLCBjaGFubmVsKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JKmNoYW5uZWxfcmV0ID0gY2hhbm5lbDsKLQlyZXR1cm4gMDsKLX0KLQotc3RydWN0IG5vdXZlYXVfcGdyYXBoX3RyYXAgewotCWludCBjaGFubmVsOwotCWludCBjbGFzczsKLQlpbnQgc3ViYywgbXRoZCwgc2l6ZTsKLQl1aW50MzJfdCBkYXRhLCBkYXRhMjsKLQl1aW50MzJfdCBuc291cmNlLCBuc3RhdHVzOwotfTsKLQotc3RhdGljIHZvaWQKLW5vdXZlYXVfZ3JhcGhfdHJhcF9pbmZvKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCi0JCQlzdHJ1Y3Qgbm91dmVhdV9wZ3JhcGhfdHJhcCAqdHJhcCkKLXsKLQlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCXVpbnQzMl90IGFkZHJlc3M7Ci0KLQl0cmFwLT5uc291cmNlID0gdHJhcC0+bnN0YXR1cyA9IDA7Ci0JaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPCBOVl81MCkgewotCQl0cmFwLT5uc291cmNlID0gbnZfcmQzMihkZXYsIE5WMDNfUEdSQVBIX05TT1VSQ0UpOwotCQl0cmFwLT5uc3RhdHVzID0gbnZfcmQzMihkZXYsIE5WMDNfUEdSQVBIX05TVEFUVVMpOwotCX0KLQotCWlmIChub3V2ZWF1X2dyYXBoX3RyYXBwZWRfY2hhbm5lbChkZXYsICZ0cmFwLT5jaGFubmVsKSkKLQkJdHJhcC0+Y2hhbm5lbCA9IC0xOwotCWFkZHJlc3MgPSBudl9yZDMyKGRldiwgTlYwNF9QR1JBUEhfVFJBUFBFRF9BRERSKTsKLQotCXRyYXAtPm10aGQgPSBhZGRyZXNzICYgMHgxRkZDOwotCXRyYXAtPmRhdGEgPSBudl9yZDMyKGRldiwgTlYwNF9QR1JBUEhfVFJBUFBFRF9EQVRBKTsKLQlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA8IE5WXzEwKSB7Ci0JCXRyYXAtPnN1YmMgID0gKGFkZHJlc3MgPj4gMTMpICYgMHg3OwotCX0gZWxzZSB7Ci0JCXRyYXAtPnN1YmMgID0gKGFkZHJlc3MgPj4gMTYpICYgMHg3OwotCQl0cmFwLT5kYXRhMiA9IG52X3JkMzIoZGV2LCBOVjEwX1BHUkFQSF9UUkFQUEVEX0RBVEFfSElHSCk7Ci0JfQotCi0JaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPCBOVl8xMCkKLQkJdHJhcC0+Y2xhc3MgPSBudl9yZDMyKGRldiwgMHg0MDAxODAgKyB0cmFwLT5zdWJjKjQpICYgMHhGRjsKLQllbHNlIGlmIChkZXZfcHJpdi0+Y2FyZF90eXBlIDwgTlZfNDApCi0JCXRyYXAtPmNsYXNzID0gbnZfcmQzMihkZXYsIDB4NDAwMTYwICsgdHJhcC0+c3ViYyo0KSAmIDB4RkZGOwotCWVsc2UgaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPCBOVl81MCkKLQkJdHJhcC0+Y2xhc3MgPSBudl9yZDMyKGRldiwgMHg0MDAxNjAgKyB0cmFwLT5zdWJjKjQpICYgMHhGRkZGOwotCWVsc2UKLQkJdHJhcC0+Y2xhc3MgPSBudl9yZDMyKGRldiwgMHg0MDA4MTQpOwotfQotCi1zdGF0aWMgdm9pZAotbm91dmVhdV9ncmFwaF9kdW1wX3RyYXBfaW5mbyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBjb25zdCBjaGFyICppZCwKLQkJCSAgICAgc3RydWN0IG5vdXZlYXVfcGdyYXBoX3RyYXAgKnRyYXApCi17Ci0Jc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQl1aW50MzJfdCBuc291cmNlID0gdHJhcC0+bnNvdXJjZSwgbnN0YXR1cyA9IHRyYXAtPm5zdGF0dXM7Ci0KLQlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA8IE5WXzUwKSB7Ci0JCU5WX0lORk8oZGV2LCAiJXMgLSBuU291cmNlOiIsIGlkKTsKLQkJbm91dmVhdV9wcmludF9iaXRmaWVsZF9uYW1lcyhuc291cmNlLCBuc291cmNlX25hbWVzKTsKLQkJcHJpbnRrKCIsIG5TdGF0dXM6Iik7Ci0JCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlIDwgTlZfMTApCi0JCQlub3V2ZWF1X3ByaW50X2JpdGZpZWxkX25hbWVzKG5zdGF0dXMsIG5zdGF0dXNfbmFtZXMpOwotCQllbHNlCi0JCQlub3V2ZWF1X3ByaW50X2JpdGZpZWxkX25hbWVzKG5zdGF0dXMsIG5zdGF0dXNfbmFtZXNfbnYxMCk7Ci0JCXByaW50aygiXG4iKTsKLQl9Ci0KLQlOVl9JTkZPKGRldiwgIiVzIC0gQ2ggJWQvJWQgQ2xhc3MgMHglMDR4IE10aGQgMHglMDR4ICIKLQkJCQkJIkRhdGEgMHglMDh4OjB4JTA4eFxuIiwKLQkJCQkJaWQsIHRyYXAtPmNoYW5uZWwsIHRyYXAtPnN1YmMsCi0JCQkJCXRyYXAtPmNsYXNzLCB0cmFwLT5tdGhkLAotCQkJCQl0cmFwLT5kYXRhMiwgdHJhcC0+ZGF0YSk7Ci19Ci0KLXN0YXRpYyBpbnQKLW5vdXZlYXVfcGdyYXBoX2ludHJfc3dtdGhkKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCi0JCQkgICBzdHJ1Y3Qgbm91dmVhdV9wZ3JhcGhfdHJhcCAqdHJhcCkKLXsKLQlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCi0JaWYgKHRyYXAtPmNoYW5uZWwgPCAwIHx8Ci0JICAgIHRyYXAtPmNoYW5uZWwgPj0gZGV2X3ByaXYtPmVuZ2luZS5maWZvLmNoYW5uZWxzIHx8Ci0JICAgICFkZXZfcHJpdi0+Zmlmb3NbdHJhcC0+Y2hhbm5lbF0pCi0JCXJldHVybiAtRU5PREVWOwotCi0JcmV0dXJuIG5vdXZlYXVfY2FsbF9tZXRob2QoZGV2X3ByaXYtPmZpZm9zW3RyYXAtPmNoYW5uZWxdLAotCQkJCSAgIHRyYXAtPmNsYXNzLCB0cmFwLT5tdGhkLCB0cmFwLT5kYXRhKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkCi1ub3V2ZWF1X3BncmFwaF9pbnRyX25vdGlmeShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1aW50MzJfdCBuc291cmNlKQotewotCXN0cnVjdCBub3V2ZWF1X3BncmFwaF90cmFwIHRyYXA7Ci0JaW50IHVuaGFuZGxlZCA9IDA7Ci0KLQlub3V2ZWF1X2dyYXBoX3RyYXBfaW5mbyhkZXYsICZ0cmFwKTsKLQotCWlmIChuc291cmNlICYgTlYwM19QR1JBUEhfTlNPVVJDRV9JTExFR0FMX01USEQpIHsKLQkJaWYgKG5vdXZlYXVfcGdyYXBoX2ludHJfc3dtdGhkKGRldiwgJnRyYXApKQotCQkJdW5oYW5kbGVkID0gMTsKLQl9IGVsc2UgewotCQl1bmhhbmRsZWQgPSAxOwotCX0KLQotCWlmICh1bmhhbmRsZWQpCi0JCW5vdXZlYXVfZ3JhcGhfZHVtcF90cmFwX2luZm8oZGV2LCAiUEdSQVBIX05PVElGWSIsICZ0cmFwKTsKLX0KLQotCi1zdGF0aWMgaW5saW5lIHZvaWQKLW5vdXZlYXVfcGdyYXBoX2ludHJfZXJyb3Ioc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdWludDMyX3QgbnNvdXJjZSkKLXsKLQlzdHJ1Y3Qgbm91dmVhdV9wZ3JhcGhfdHJhcCB0cmFwOwotCWludCB1bmhhbmRsZWQgPSAwOwotCi0Jbm91dmVhdV9ncmFwaF90cmFwX2luZm8oZGV2LCAmdHJhcCk7Ci0JdHJhcC5uc291cmNlID0gbnNvdXJjZTsKLQotCWlmIChuc291cmNlICYgTlYwM19QR1JBUEhfTlNPVVJDRV9JTExFR0FMX01USEQpIHsKLQkJaWYgKG5vdXZlYXVfcGdyYXBoX2ludHJfc3dtdGhkKGRldiwgJnRyYXApKQotCQkJdW5oYW5kbGVkID0gMTsKLQl9IGVsc2UgaWYgKG5zb3VyY2UgJiBOVjAzX1BHUkFQSF9OU09VUkNFX0RNQV9WVFhfUFJPVEVDVElPTikgewotCQl1aW50MzJfdCB2ID0gbnZfcmQzMihkZXYsIDB4NDAyMDAwKTsKLQkJbnZfd3IzMihkZXYsIDB4NDAyMDAwLCB2KTsKLQotCQkvKiBkdW1wIHRoZSBlcnJvciBhbnl3YXkgZm9yIG5vdzogaXQncyB1c2VmdWwgZm9yCi0JCSAgIEdhbGxpdW0gZGV2ZWxvcG1lbnQgKi8KLQkJdW5oYW5kbGVkID0gMTsKLQl9IGVsc2UgewotCQl1bmhhbmRsZWQgPSAxOwotCX0KLQotCWlmICh1bmhhbmRsZWQgJiYgbm91dmVhdV9yYXRlbGltaXQoKSkKLQkJbm91dmVhdV9ncmFwaF9kdW1wX3RyYXBfaW5mbyhkZXYsICJQR1JBUEhfRVJST1IiLCAmdHJhcCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZAotbm91dmVhdV9wZ3JhcGhfaW50cl9jb250ZXh0X3N3aXRjaChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQotewotCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Ci0Jc3RydWN0IG5vdXZlYXVfZW5naW5lICplbmdpbmUgPSAmZGV2X3ByaXYtPmVuZ2luZTsKLQl1aW50MzJfdCBjaGlkOwotCi0JY2hpZCA9IGVuZ2luZS0+Zmlmby5jaGFubmVsX2lkKGRldik7Ci0JTlZfREVCVUcoZGV2LCAiUEdSQVBIIGNvbnRleHQgc3dpdGNoIGludGVycnVwdCBjaGFubmVsICV4XG4iLCBjaGlkKTsKLQotCXN3aXRjaCAoZGV2X3ByaXYtPmNhcmRfdHlwZSkgewotCWNhc2UgTlZfMDQ6Ci0JCW52MDRfZ3JhcGhfY29udGV4dF9zd2l0Y2goZGV2KTsKLQkJYnJlYWs7Ci0JY2FzZSBOVl8xMDoKLQkJbnYxMF9ncmFwaF9jb250ZXh0X3N3aXRjaChkZXYpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlOVl9FUlJPUihkZXYsICJDb250ZXh0IHN3aXRjaCBub3QgaW1wbGVtZW50ZWRcbiIpOwotCQlicmVhazsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkCi1ub3V2ZWF1X3BncmFwaF9pcnFfaGFuZGxlcihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQotewotCXVpbnQzMl90IHN0YXR1czsKLQotCXdoaWxlICgoc3RhdHVzID0gbnZfcmQzMihkZXYsIE5WMDNfUEdSQVBIX0lOVFIpKSkgewotCQl1aW50MzJfdCBuc291cmNlID0gbnZfcmQzMihkZXYsIE5WMDNfUEdSQVBIX05TT1VSQ0UpOwotCi0JCWlmIChzdGF0dXMgJiBOVl9QR1JBUEhfSU5UUl9OT1RJRlkpIHsKLQkJCW5vdXZlYXVfcGdyYXBoX2ludHJfbm90aWZ5KGRldiwgbnNvdXJjZSk7Ci0KLQkJCXN0YXR1cyAmPSB+TlZfUEdSQVBIX0lOVFJfTk9USUZZOwotCQkJbnZfd3IzMihkZXYsIE5WMDNfUEdSQVBIX0lOVFIsIE5WX1BHUkFQSF9JTlRSX05PVElGWSk7Ci0JCX0KLQotCQlpZiAoc3RhdHVzICYgTlZfUEdSQVBIX0lOVFJfRVJST1IpIHsKLQkJCW5vdXZlYXVfcGdyYXBoX2ludHJfZXJyb3IoZGV2LCBuc291cmNlKTsKLQotCQkJc3RhdHVzICY9IH5OVl9QR1JBUEhfSU5UUl9FUlJPUjsKLQkJCW52X3dyMzIoZGV2LCBOVjAzX1BHUkFQSF9JTlRSLCBOVl9QR1JBUEhfSU5UUl9FUlJPUik7Ci0JCX0KLQotCQlpZiAoc3RhdHVzICYgTlZfUEdSQVBIX0lOVFJfQ09OVEVYVF9TV0lUQ0gpIHsKLQkJCXN0YXR1cyAmPSB+TlZfUEdSQVBIX0lOVFJfQ09OVEVYVF9TV0lUQ0g7Ci0JCQludl93cjMyKGRldiwgTlYwM19QR1JBUEhfSU5UUiwKLQkJCQkgTlZfUEdSQVBIX0lOVFJfQ09OVEVYVF9TV0lUQ0gpOwotCi0JCQlub3V2ZWF1X3BncmFwaF9pbnRyX2NvbnRleHRfc3dpdGNoKGRldik7Ci0JCX0KLQotCQlpZiAoc3RhdHVzKSB7Ci0JCQlOVl9JTkZPKGRldiwgIlVuaGFuZGxlZCBQR1JBUEhfSU5UUiAtIDB4JTA4eFxuIiwgc3RhdHVzKTsKLQkJCW52X3dyMzIoZGV2LCBOVjAzX1BHUkFQSF9JTlRSLCBzdGF0dXMpOwotCQl9Ci0KLQkJaWYgKChudl9yZDMyKGRldiwgTlYwNF9QR1JBUEhfRklGTykgJiAoMSA8PCAwKSkgPT0gMCkKLQkJCW52X3dyMzIoZGV2LCBOVjA0X1BHUkFQSF9GSUZPLCAxKTsKLQl9Ci0KLQludl93cjMyKGRldiwgTlYwM19QTUNfSU5UUl8wLCBOVl9QTUNfSU5UUl8wX1BHUkFQSF9QRU5ESU5HKTsKLX0KLQotc3RhdGljIHN0cnVjdCBub3V2ZWF1X2VudW1fbmFtZXMgbnY1MF9tcF9leGVjX2Vycm9yX25hbWVzW10gPQotewotCXsgMywgIlNUQUNLX1VOREVSRkxPVyIgfSwKLQl7IDQsICJRVUFET05fQUNUSVZFIiB9LAotCXsgOCwgIlRJTUVPVVQiIH0sCi0JeyAweDEwLCAiSU5WQUxJRF9PUENPREUiIH0sCi0JeyAweDQwLCAiQlJFQUtQT0lOVCIgfSwKLX07Ci0KLXN0YXRpYyB2b2lkCi1udjUwX3BncmFwaF9tcF90cmFwKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCB0cGlkLCBpbnQgZGlzcGxheSkKLXsKLQlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCXVpbnQzMl90IHVuaXRzID0gbnZfcmQzMihkZXYsIDB4MTU0MCk7Ci0JdWludDMyX3QgYWRkciwgbXAxMCwgc3RhdHVzLCBwYywgb3Bsb3csIG9waGlnaDsKLQlpbnQgaTsKLQlpbnQgbXBzID0gMDsKLQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7Ci0JCWlmICghKHVuaXRzICYgMSA8PCAoaSsyNCkpKQotCQkJY29udGludWU7Ci0JCWlmIChkZXZfcHJpdi0+Y2hpcHNldCA8IDB4YTApCi0JCQlhZGRyID0gMHg0MDgyMDAgKyAodHBpZCA8PCAxMikgKyAoaSA8PCA3KTsKLQkJZWxzZQotCQkJYWRkciA9IDB4NDA4MTAwICsgKHRwaWQgPDwgMTEpICsgKGkgPDwgNyk7Ci0JCW1wMTAgPSBudl9yZDMyKGRldiwgYWRkciArIDB4MTApOwotCQlzdGF0dXMgPSBudl9yZDMyKGRldiwgYWRkciArIDB4MTQpOwotCQlpZiAoIXN0YXR1cykKLQkJCWNvbnRpbnVlOwotCQlpZiAoZGlzcGxheSkgewotCQkJbnZfcmQzMihkZXYsIGFkZHIgKyAweDIwKTsKLQkJCXBjID0gbnZfcmQzMihkZXYsIGFkZHIgKyAweDI0KTsKLQkJCW9wbG93ID0gbnZfcmQzMihkZXYsIGFkZHIgKyAweDcwKTsKLQkJCW9waGlnaD0gbnZfcmQzMihkZXYsIGFkZHIgKyAweDc0KTsKLQkJCU5WX0lORk8oZGV2LCAiUEdSQVBIX1RSQVBfTVBfRVhFQyAtICIKLQkJCQkJIlRQICVkIE1QICVkOiAiLCB0cGlkLCBpKTsKLQkJCW5vdXZlYXVfcHJpbnRfZW51bV9uYW1lcyhzdGF0dXMsCi0JCQkJCW52NTBfbXBfZXhlY19lcnJvcl9uYW1lcyk7Ci0JCQlwcmludGsoIiBhdCAlMDZ4IHdhcnAgJWQsIG9wY29kZSAlMDh4ICUwOHhcbiIsCi0JCQkJCXBjJjB4ZmZmZmZmLCBwYyA+PiAyNCwKLQkJCQkJb3Bsb3csIG9waGlnaCk7Ci0JCX0KLQkJbnZfd3IzMihkZXYsIGFkZHIgKyAweDEwLCBtcDEwKTsKLQkJbnZfd3IzMihkZXYsIGFkZHIgKyAweDE0LCAwKTsKLQkJbXBzKys7Ci0JfQotCWlmICghbXBzICYmIGRpc3BsYXkpCi0JCU5WX0lORk8oZGV2LCAiUEdSQVBIX1RSQVBfTVBfRVhFQyAtIFRQICVkOiAiCi0JCQkJIk5vIE1QcyBjbGFpbWluZyBlcnJvcnM/XG4iLCB0cGlkKTsKLX0KLQotc3RhdGljIHZvaWQKLW52NTBfcGdyYXBoX3RwX3RyYXAoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IHR5cGUsIHVpbnQzMl90IHVzdGF0dXNfb2xkLAotCQl1aW50MzJfdCB1c3RhdHVzX25ldywgaW50IGRpc3BsYXksIGNvbnN0IGNoYXIgKm5hbWUpCi17Ci0Jc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlpbnQgdHBzID0gMDsKLQl1aW50MzJfdCB1bml0cyA9IG52X3JkMzIoZGV2LCAweDE1NDApOwotCWludCBpLCByOwotCXVpbnQzMl90IHVzdGF0dXNfYWRkciwgdXN0YXR1czsKLQlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgewotCQlpZiAoISh1bml0cyAmICgxIDw8IGkpKSkKLQkJCWNvbnRpbnVlOwotCQlpZiAoZGV2X3ByaXYtPmNoaXBzZXQgPCAweGEwKQotCQkJdXN0YXR1c19hZGRyID0gdXN0YXR1c19vbGQgKyAoaSA8PCAxMik7Ci0JCWVsc2UKLQkJCXVzdGF0dXNfYWRkciA9IHVzdGF0dXNfbmV3ICsgKGkgPDwgMTEpOwotCQl1c3RhdHVzID0gbnZfcmQzMihkZXYsIHVzdGF0dXNfYWRkcikgJiAweDdmZmZmZmZmOwotCQlpZiAoIXVzdGF0dXMpCi0JCQljb250aW51ZTsKLQkJdHBzKys7Ci0JCXN3aXRjaCAodHlwZSkgewotCQljYXNlIDY6IC8qIHRleHR1cmUgZXJyb3IuLi4gdW5rbm93biBmb3Igbm93ICovCi0JCQludjUwX2ZiX3ZtX3RyYXAoZGV2LCBkaXNwbGF5LCBuYW1lKTsKLQkJCWlmIChkaXNwbGF5KSB7Ci0JCQkJTlZfRVJST1IoZGV2LCAibWFnaWMgc2V0ICVkOlxuIiwgaSk7Ci0JCQkJZm9yIChyID0gdXN0YXR1c19hZGRyICsgNDsgciA8PSB1c3RhdHVzX2FkZHIgKyAweDEwOyByICs9IDQpCi0JCQkJCU5WX0VSUk9SKGRldiwgIlx0MHglMDh4OiAweCUwOHhcbiIsIHIsCi0JCQkJCQludl9yZDMyKGRldiwgcikpOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgNzogLyogTVAgZXJyb3IgKi8KLQkJCWlmICh1c3RhdHVzICYgMHgwMDAxMDAwMCkgewotCQkJCW52NTBfcGdyYXBoX21wX3RyYXAoZGV2LCBpLCBkaXNwbGF5KTsKLQkJCQl1c3RhdHVzICY9IH4weDAwMDEwMDAwOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgODogLyogVFBETUEgZXJyb3IgKi8KLQkJCXsKLQkJCXVpbnQzMl90IGUwYyA9IG52X3JkMzIoZGV2LCB1c3RhdHVzX2FkZHIgKyA0KTsKLQkJCXVpbnQzMl90IGUxMCA9IG52X3JkMzIoZGV2LCB1c3RhdHVzX2FkZHIgKyA4KTsKLQkJCXVpbnQzMl90IGUxNCA9IG52X3JkMzIoZGV2LCB1c3RhdHVzX2FkZHIgKyAweGMpOwotCQkJdWludDMyX3QgZTE4ID0gbnZfcmQzMihkZXYsIHVzdGF0dXNfYWRkciArIDB4MTApOwotCQkJdWludDMyX3QgZTFjID0gbnZfcmQzMihkZXYsIHVzdGF0dXNfYWRkciArIDB4MTQpOwotCQkJdWludDMyX3QgZTIwID0gbnZfcmQzMihkZXYsIHVzdGF0dXNfYWRkciArIDB4MTgpOwotCQkJdWludDMyX3QgZTI0ID0gbnZfcmQzMihkZXYsIHVzdGF0dXNfYWRkciArIDB4MWMpOwotCQkJbnY1MF9mYl92bV90cmFwKGRldiwgZGlzcGxheSwgbmFtZSk7Ci0JCQkvKiAyZCBlbmdpbmUgZGVzdGluYXRpb24gKi8KLQkJCWlmICh1c3RhdHVzICYgMHgwMDAwMDAxMCkgewotCQkJCWlmIChkaXNwbGF5KSB7Ci0JCQkJCU5WX0lORk8oZGV2LCAiUEdSQVBIX1RSQVBfVFBETUFfMkQgLSBUUCAlZCAtIFVua25vd24gZmF1bHQgYXQgYWRkcmVzcyAlMDJ4JTA4eFxuIiwKLQkJCQkJCQlpLCBlMTQsIGUxMCk7Ci0JCQkJCU5WX0lORk8oZGV2LCAiUEdSQVBIX1RSQVBfVFBETUFfMkQgLSBUUCAlZCAtIGUwYzogJTA4eCwgZTE4OiAlMDh4LCBlMWM6ICUwOHgsIGUyMDogJTA4eCwgZTI0OiAlMDh4XG4iLAotCQkJCQkJCWksIGUwYywgZTE4LCBlMWMsIGUyMCwgZTI0KTsKLQkJCQl9Ci0JCQkJdXN0YXR1cyAmPSB+MHgwMDAwMDAxMDsKLQkJCX0KLQkJCS8qIFJlbmRlciB0YXJnZXQgKi8KLQkJCWlmICh1c3RhdHVzICYgMHgwMDAwMDA0MCkgewotCQkJCWlmIChkaXNwbGF5KSB7Ci0JCQkJCU5WX0lORk8oZGV2LCAiUEdSQVBIX1RSQVBfVFBETUFfUlQgLSBUUCAlZCAtIFVua25vd24gZmF1bHQgYXQgYWRkcmVzcyAlMDJ4JTA4eFxuIiwKLQkJCQkJCQlpLCBlMTQsIGUxMCk7Ci0JCQkJCU5WX0lORk8oZGV2LCAiUEdSQVBIX1RSQVBfVFBETUFfUlQgLSBUUCAlZCAtIGUwYzogJTA4eCwgZTE4OiAlMDh4LCBlMWM6ICUwOHgsIGUyMDogJTA4eCwgZTI0OiAlMDh4XG4iLAotCQkJCQkJCWksIGUwYywgZTE4LCBlMWMsIGUyMCwgZTI0KTsKLQkJCQl9Ci0JCQkJdXN0YXR1cyAmPSB+MHgwMDAwMDA0MDsKLQkJCX0KLQkJCS8qIENVREEgbWVtb3J5OiBsW10sIGdbXSBvciBzdGFjay4gKi8KLQkJCWlmICh1c3RhdHVzICYgMHgwMDAwMDA4MCkgewotCQkJCWlmIChkaXNwbGF5KSB7Ci0JCQkJCWlmIChlMTggJiAweDgwMDAwMDAwKSB7Ci0JCQkJCQkvKiBnW10gcmVhZCBmYXVsdD8gKi8KLQkJCQkJCU5WX0lORk8oZGV2LCAiUEdSQVBIX1RSQVBfVFBETUEgLSBUUCAlZCAtIEdsb2JhbCByZWFkIGZhdWx0IGF0IGFkZHJlc3MgJTAyeCUwOHhcbiIsCi0JCQkJCQkJCWksIGUxNCwgZTEwIHwgKChlMTggPj4gMjQpICYgMHgxZikpOwotCQkJCQkJZTE4ICY9IH4weDFmMDAwMDAwOwotCQkJCQl9IGVsc2UgaWYgKGUxOCAmIDB4YykgewotCQkJCQkJLyogZ1tdIHdyaXRlIGZhdWx0PyAqLwotCQkJCQkJTlZfSU5GTyhkZXYsICJQR1JBUEhfVFJBUF9UUERNQSAtIFRQICVkIC0gR2xvYmFsIHdyaXRlIGZhdWx0IGF0IGFkZHJlc3MgJTAyeCUwOHhcbiIsCi0JCQkJCQkJCWksIGUxNCwgZTEwIHwgKChlMTggPj4gNykgJiAweDFmKSk7Ci0JCQkJCQllMTggJj0gfjB4MDAwMDBmODA7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlOVl9JTkZPKGRldiwgIlBHUkFQSF9UUkFQX1RQRE1BIC0gVFAgJWQgLSBVbmtub3duIENVREEgZmF1bHQgYXQgYWRkcmVzcyAlMDJ4JTA4eFxuIiwKLQkJCQkJCQkJaSwgZTE0LCBlMTApOwotCQkJCQl9Ci0JCQkJCU5WX0lORk8oZGV2LCAiUEdSQVBIX1RSQVBfVFBETUEgLSBUUCAlZCAtIGUwYzogJTA4eCwgZTE4OiAlMDh4LCBlMWM6ICUwOHgsIGUyMDogJTA4eCwgZTI0OiAlMDh4XG4iLAotCQkJCQkJCWksIGUwYywgZTE4LCBlMWMsIGUyMCwgZTI0KTsKLQkJCQl9Ci0JCQkJdXN0YXR1cyAmPSB+MHgwMDAwMDA4MDsKLQkJCX0KLQkJCX0KLQkJCWJyZWFrOwotCQl9Ci0JCWlmICh1c3RhdHVzKSB7Ci0JCQlpZiAoZGlzcGxheSkKLQkJCQlOVl9JTkZPKGRldiwgIiVzIC0gVFAlZDogVW5oYW5kbGVkIHVzdGF0dXMgMHglMDh4XG4iLCBuYW1lLCBpLCB1c3RhdHVzKTsKLQkJfQotCQludl93cjMyKGRldiwgdXN0YXR1c19hZGRyLCAweGMwMDAwMDAwKTsKLQl9Ci0KLQlpZiAoIXRwcyAmJiBkaXNwbGF5KQotCQlOVl9JTkZPKGRldiwgIiVzIC0gTm8gVFBzIGNsYWltaW5nIGVycm9ycz9cbiIsIG5hbWUpOwotfQotCi1zdGF0aWMgdm9pZAotbnY1MF9wZ3JhcGhfdHJhcF9oYW5kbGVyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IG5vdXZlYXVfcGdyYXBoX3RyYXAgdHJhcDsKLQl1aW50MzJfdCBzdGF0dXMgPSBudl9yZDMyKGRldiwgMHg0MDAxMDgpOwotCXVpbnQzMl90IHVzdGF0dXM7Ci0JaW50IGRpc3BsYXkgPSBub3V2ZWF1X3JhdGVsaW1pdCgpOwotCi0KLQlpZiAoIXN0YXR1cyAmJiBkaXNwbGF5KSB7Ci0JCW5vdXZlYXVfZ3JhcGhfdHJhcF9pbmZvKGRldiwgJnRyYXApOwotCQlub3V2ZWF1X2dyYXBoX2R1bXBfdHJhcF9pbmZvKGRldiwgIlBHUkFQSF9UUkFQIiwgJnRyYXApOwotCQlOVl9JTkZPKGRldiwgIlBHUkFQSF9UUkFQIC0gbm8gdW5pdHMgcmVwb3J0aW5nIHRyYXBzP1xuIik7Ci0JfQotCi0JLyogRElTUEFUQ0g6IFJlbGF5cyBjb21tYW5kcyB0byBvdGhlciB1bml0cyBhbmQgaGFuZGxlcyBOT1RJRlksCi0JICogQ09ORCwgUVVFUlkuIElmIHlvdSBnZXQgYSB0cmFwIGZyb20gaXQsIHRoZSBjb21tYW5kIGlzIHN0aWxsIHN0dWNrCi0JICogaW4gRElTUEFUQ0ggYW5kIHlvdSBuZWVkIHRvIGRvIHNvbWV0aGluZyBhYm91dCBpdC4gKi8KLQlpZiAoc3RhdHVzICYgMHgwMDEpIHsKLQkJdXN0YXR1cyA9IG52X3JkMzIoZGV2LCAweDQwMDgwNCkgJiAweDdmZmZmZmZmOwotCQlpZiAoIXVzdGF0dXMgJiYgZGlzcGxheSkgewotCQkJTlZfSU5GTyhkZXYsICJQR1JBUEhfVFJBUF9ESVNQQVRDSCAtIG5vIHVzdGF0dXM/XG4iKTsKLQkJfQotCi0JCS8qIEtub3duIHRvIGJlIHRyaWdnZXJlZCBieSBzY3Jld2VkIHVwIE5PVElGWSBhbmQgQ09ORC4uLiAqLwotCQlpZiAodXN0YXR1cyAmIDB4MDAwMDAwMDEpIHsKLQkJCW52NTBfZmJfdm1fdHJhcChkZXYsIGRpc3BsYXksICJQR1JBUEhfVFJBUF9ESVNQQVRDSF9GQVVMVCIpOwotCQkJbnZfd3IzMihkZXYsIDB4NDAwNTAwLCAwKTsKLQkJCWlmIChudl9yZDMyKGRldiwgMHg0MDA4MDgpICYgMHg4MDAwMDAwMCkgewotCQkJCWlmIChkaXNwbGF5KSB7Ci0JCQkJCWlmIChub3V2ZWF1X2dyYXBoX3RyYXBwZWRfY2hhbm5lbChkZXYsICZ0cmFwLmNoYW5uZWwpKQotCQkJCQkJdHJhcC5jaGFubmVsID0gLTE7Ci0JCQkJCXRyYXAuY2xhc3MgPSBudl9yZDMyKGRldiwgMHg0MDA4MTQpOwotCQkJCQl0cmFwLm10aGQgPSBudl9yZDMyKGRldiwgMHg0MDA4MDgpICYgMHgxZmZjOwotCQkJCQl0cmFwLnN1YmMgPSAobnZfcmQzMihkZXYsIDB4NDAwODA4KSA+PiAxNikgJiAweDc7Ci0JCQkJCXRyYXAuZGF0YSA9IG52X3JkMzIoZGV2LCAweDQwMDgwYyk7Ci0JCQkJCXRyYXAuZGF0YTIgPSBudl9yZDMyKGRldiwgMHg0MDA4MTApOwotCQkJCQlub3V2ZWF1X2dyYXBoX2R1bXBfdHJhcF9pbmZvKGRldiwKLQkJCQkJCQkiUEdSQVBIX1RSQVBfRElTUEFUQ0hfRkFVTFQiLCAmdHJhcCk7Ci0JCQkJCU5WX0lORk8oZGV2LCAiUEdSQVBIX1RSQVBfRElTUEFUQ0hfRkFVTFQgLSA0MDA4MDg6ICUwOHhcbiIsIG52X3JkMzIoZGV2LCAweDQwMDgwOCkpOwotCQkJCQlOVl9JTkZPKGRldiwgIlBHUkFQSF9UUkFQX0RJU1BBVENIX0ZBVUxUIC0gNDAwODQ4OiAlMDh4XG4iLCBudl9yZDMyKGRldiwgMHg0MDA4NDgpKTsKLQkJCQl9Ci0JCQkJbnZfd3IzMihkZXYsIDB4NDAwODA4LCAwKTsKLQkJCX0gZWxzZSBpZiAoZGlzcGxheSkgewotCQkJCU5WX0lORk8oZGV2LCAiUEdSQVBIX1RSQVBfRElTUEFUQ0hfRkFVTFQgLSBObyBzdHVjayBjb21tYW5kP1xuIik7Ci0JCQl9Ci0JCQludl93cjMyKGRldiwgMHg0MDA4ZTgsIG52X3JkMzIoZGV2LCAweDQwMDhlOCkgJiAzKTsKLQkJCW52X3dyMzIoZGV2LCAweDQwMDg0OCwgMCk7Ci0JCQl1c3RhdHVzICY9IH4weDAwMDAwMDAxOwotCQl9Ci0JCWlmICh1c3RhdHVzICYgMHgwMDAwMDAwMikgewotCQkJbnY1MF9mYl92bV90cmFwKGRldiwgZGlzcGxheSwgIlBHUkFQSF9UUkFQX0RJU1BBVENIX1FVRVJZIik7Ci0JCQludl93cjMyKGRldiwgMHg0MDA1MDAsIDApOwotCQkJaWYgKG52X3JkMzIoZGV2LCAweDQwMDg0YykgJiAweDgwMDAwMDAwKSB7Ci0JCQkJaWYgKGRpc3BsYXkpIHsKLQkJCQkJaWYgKG5vdXZlYXVfZ3JhcGhfdHJhcHBlZF9jaGFubmVsKGRldiwgJnRyYXAuY2hhbm5lbCkpCi0JCQkJCQl0cmFwLmNoYW5uZWwgPSAtMTsKLQkJCQkJdHJhcC5jbGFzcyA9IG52X3JkMzIoZGV2LCAweDQwMDgxNCk7Ci0JCQkJCXRyYXAubXRoZCA9IG52X3JkMzIoZGV2LCAweDQwMDg0YykgJiAweDFmZmM7Ci0JCQkJCXRyYXAuc3ViYyA9IChudl9yZDMyKGRldiwgMHg0MDA4NGMpID4+IDE2KSAmIDB4NzsKLQkJCQkJdHJhcC5kYXRhID0gbnZfcmQzMihkZXYsIDB4NDAwODVjKTsKLQkJCQkJdHJhcC5kYXRhMiA9IDA7Ci0JCQkJCW5vdXZlYXVfZ3JhcGhfZHVtcF90cmFwX2luZm8oZGV2LAotCQkJCQkJCSJQR1JBUEhfVFJBUF9ESVNQQVRDSF9RVUVSWSIsICZ0cmFwKTsKLQkJCQkJTlZfSU5GTyhkZXYsICJQR1JBUEhfVFJBUF9ESVNQQVRDSF9RVUVSWSAtIDQwMDg0YzogJTA4eFxuIiwgbnZfcmQzMihkZXYsIDB4NDAwODRjKSk7Ci0JCQkJfQotCQkJCW52X3dyMzIoZGV2LCAweDQwMDg0YywgMCk7Ci0JCQl9IGVsc2UgaWYgKGRpc3BsYXkpIHsKLQkJCQlOVl9JTkZPKGRldiwgIlBHUkFQSF9UUkFQX0RJU1BBVENIX1FVRVJZIC0gTm8gc3R1Y2sgY29tbWFuZD9cbiIpOwotCQkJfQotCQkJdXN0YXR1cyAmPSB+MHgwMDAwMDAwMjsKLQkJfQotCQlpZiAodXN0YXR1cyAmJiBkaXNwbGF5KQotCQkJTlZfSU5GTyhkZXYsICJQR1JBUEhfVFJBUF9ESVNQQVRDSCAtIFVuaGFuZGxlZCB1c3RhdHVzIDB4JTA4eFxuIiwgdXN0YXR1cyk7Ci0JCW52X3dyMzIoZGV2LCAweDQwMDgwNCwgMHhjMDAwMDAwMCk7Ci0JCW52X3dyMzIoZGV2LCAweDQwMDEwOCwgMHgwMDEpOwotCQlzdGF0dXMgJj0gfjB4MDAxOwotCX0KLQotCS8qIFRSQVBzIG90aGVyIHRoYW4gZGlzcGF0Y2ggdXNlIHRoZSAibm9ybWFsIiB0cmFwIHJlZ3MuICovCi0JaWYgKHN0YXR1cyAmJiBkaXNwbGF5KSB7Ci0JCW5vdXZlYXVfZ3JhcGhfdHJhcF9pbmZvKGRldiwgJnRyYXApOwotCQlub3V2ZWF1X2dyYXBoX2R1bXBfdHJhcF9pbmZvKGRldiwKLQkJCQkiUEdSQVBIX1RSQVAiLCAmdHJhcCk7Ci0JfQotCi0JLyogTTJNRjogTWVtb3J5IHRvIG1lbW9yeSBjb3B5IGVuZ2luZS4gKi8KLQlpZiAoc3RhdHVzICYgMHgwMDIpIHsKLQkJdXN0YXR1cyA9IG52X3JkMzIoZGV2LCAweDQwNjgwMCkgJiAweDdmZmZmZmZmOwotCQlpZiAoIXVzdGF0dXMgJiYgZGlzcGxheSkgewotCQkJTlZfSU5GTyhkZXYsICJQR1JBUEhfVFJBUF9NMk1GIC0gbm8gdXN0YXR1cz9cbiIpOwotCQl9Ci0JCWlmICh1c3RhdHVzICYgMHgwMDAwMDAwMSkgewotCQkJbnY1MF9mYl92bV90cmFwKGRldiwgZGlzcGxheSwgIlBHUkFQSF9UUkFQX00yTUZfTk9USUZZIik7Ci0JCQl1c3RhdHVzICY9IH4weDAwMDAwMDAxOwotCQl9Ci0JCWlmICh1c3RhdHVzICYgMHgwMDAwMDAwMikgewotCQkJbnY1MF9mYl92bV90cmFwKGRldiwgZGlzcGxheSwgIlBHUkFQSF9UUkFQX00yTUZfSU4iKTsKLQkJCXVzdGF0dXMgJj0gfjB4MDAwMDAwMDI7Ci0JCX0KLQkJaWYgKHVzdGF0dXMgJiAweDAwMDAwMDA0KSB7Ci0JCQludjUwX2ZiX3ZtX3RyYXAoZGV2LCBkaXNwbGF5LCAiUEdSQVBIX1RSQVBfTTJNRl9PVVQiKTsKLQkJCXVzdGF0dXMgJj0gfjB4MDAwMDAwMDQ7Ci0JCX0KLQkJTlZfSU5GTyAoZGV2LCAiUEdSQVBIX1RSQVBfTTJNRiAtICUwOHggJTA4eCAlMDh4ICUwOHhcbiIsCi0JCQkJbnZfcmQzMihkZXYsIDB4NDA2ODA0KSwKLQkJCQludl9yZDMyKGRldiwgMHg0MDY4MDgpLAotCQkJCW52X3JkMzIoZGV2LCAweDQwNjgwYyksCi0JCQkJbnZfcmQzMihkZXYsIDB4NDA2ODEwKSk7Ci0JCWlmICh1c3RhdHVzICYmIGRpc3BsYXkpCi0JCQlOVl9JTkZPKGRldiwgIlBHUkFQSF9UUkFQX00yTUYgLSBVbmhhbmRsZWQgdXN0YXR1cyAweCUwOHhcbiIsIHVzdGF0dXMpOwotCQkvKiBObyBzYW5lIHdheSBmb3VuZCB5ZXQgLS0ganVzdCByZXNldCB0aGUgYnVnZ2VyLiAqLwotCQludl93cjMyKGRldiwgMHg0MDAwNDAsIDIpOwotCQludl93cjMyKGRldiwgMHg0MDAwNDAsIDApOwotCQludl93cjMyKGRldiwgMHg0MDY4MDAsIDB4YzAwMDAwMDApOwotCQludl93cjMyKGRldiwgMHg0MDAxMDgsIDB4MDAyKTsKLQkJc3RhdHVzICY9IH4weDAwMjsKLQl9Ci0KLQkvKiBWRkVUQ0g6IEZldGNoZXMgZGF0YSBmcm9tIHZlcnRleCBidWZmZXJzLiAqLwotCWlmIChzdGF0dXMgJiAweDAwNCkgewotCQl1c3RhdHVzID0gbnZfcmQzMihkZXYsIDB4NDAwYzA0KSAmIDB4N2ZmZmZmZmY7Ci0JCWlmICghdXN0YXR1cyAmJiBkaXNwbGF5KSB7Ci0JCQlOVl9JTkZPKGRldiwgIlBHUkFQSF9UUkFQX1ZGRVRDSCAtIG5vIHVzdGF0dXM/XG4iKTsKLQkJfQotCQlpZiAodXN0YXR1cyAmIDB4MDAwMDAwMDEpIHsKLQkJCW52NTBfZmJfdm1fdHJhcChkZXYsIGRpc3BsYXksICJQR1JBUEhfVFJBUF9WRkVUQ0hfRkFVTFQiKTsKLQkJCU5WX0lORk8gKGRldiwgIlBHUkFQSF9UUkFQX1ZGRVRDSF9GQVVMVCAtICUwOHggJTA4eCAlMDh4ICUwOHhcbiIsCi0JCQkJCW52X3JkMzIoZGV2LCAweDQwMGMwMCksCi0JCQkJCW52X3JkMzIoZGV2LCAweDQwMGMwOCksCi0JCQkJCW52X3JkMzIoZGV2LCAweDQwMGMwYyksCi0JCQkJCW52X3JkMzIoZGV2LCAweDQwMGMxMCkpOwotCQkJdXN0YXR1cyAmPSB+MHgwMDAwMDAwMTsKLQkJfQotCQlpZiAodXN0YXR1cyAmJiBkaXNwbGF5KQotCQkJTlZfSU5GTyhkZXYsICJQR1JBUEhfVFJBUF9WRkVUQ0ggLSBVbmhhbmRsZWQgdXN0YXR1cyAweCUwOHhcbiIsIHVzdGF0dXMpOwotCQludl93cjMyKGRldiwgMHg0MDBjMDQsIDB4YzAwMDAwMDApOwotCQludl93cjMyKGRldiwgMHg0MDAxMDgsIDB4MDA0KTsKLQkJc3RhdHVzICY9IH4weDAwNDsKLQl9Ci0KLQkvKiBTVFJNT1VUOiBEaXJlY3RYIHN0cmVhbW91dCAvIE9wZW5HTCB0cmFuc2Zvcm0gZmVlZGJhY2suICovCi0JaWYgKHN0YXR1cyAmIDB4MDA4KSB7Ci0JCXVzdGF0dXMgPSBudl9yZDMyKGRldiwgMHg0MDE4MDApICYgMHg3ZmZmZmZmZjsKLQkJaWYgKCF1c3RhdHVzICYmIGRpc3BsYXkpIHsKLQkJCU5WX0lORk8oZGV2LCAiUEdSQVBIX1RSQVBfU1RSTU9VVCAtIG5vIHVzdGF0dXM/XG4iKTsKLQkJfQotCQlpZiAodXN0YXR1cyAmIDB4MDAwMDAwMDEpIHsKLQkJCW52NTBfZmJfdm1fdHJhcChkZXYsIGRpc3BsYXksICJQR1JBUEhfVFJBUF9TVFJNT1VUX0ZBVUxUIik7Ci0JCQlOVl9JTkZPIChkZXYsICJQR1JBUEhfVFJBUF9TVFJNT1VUX0ZBVUxUIC0gJTA4eCAlMDh4ICUwOHggJTA4eFxuIiwKLQkJCQkJbnZfcmQzMihkZXYsIDB4NDAxODA0KSwKLQkJCQkJbnZfcmQzMihkZXYsIDB4NDAxODA4KSwKLQkJCQkJbnZfcmQzMihkZXYsIDB4NDAxODBjKSwKLQkJCQkJbnZfcmQzMihkZXYsIDB4NDAxODEwKSk7Ci0JCQl1c3RhdHVzICY9IH4weDAwMDAwMDAxOwotCQl9Ci0JCWlmICh1c3RhdHVzICYmIGRpc3BsYXkpCi0JCQlOVl9JTkZPKGRldiwgIlBHUkFQSF9UUkFQX1NUUk1PVVQgLSBVbmhhbmRsZWQgdXN0YXR1cyAweCUwOHhcbiIsIHVzdGF0dXMpOwotCQkvKiBObyBzYW5lIHdheSBmb3VuZCB5ZXQgLS0ganVzdCByZXNldCB0aGUgYnVnZ2VyLiAqLwotCQludl93cjMyKGRldiwgMHg0MDAwNDAsIDB4ODApOwotCQludl93cjMyKGRldiwgMHg0MDAwNDAsIDApOwotCQludl93cjMyKGRldiwgMHg0MDE4MDAsIDB4YzAwMDAwMDApOwotCQludl93cjMyKGRldiwgMHg0MDAxMDgsIDB4MDA4KTsKLQkJc3RhdHVzICY9IH4weDAwODsKLQl9Ci0KLQkvKiBDQ0FDSEU6IEhhbmRsZXMgY29kZSBhbmQgY1tdIGNhY2hlcyBhbmQgZmlsbHMgdGhlbS4gKi8KLQlpZiAoc3RhdHVzICYgMHgwMTApIHsKLQkJdXN0YXR1cyA9IG52X3JkMzIoZGV2LCAweDQwNTAxOCkgJiAweDdmZmZmZmZmOwotCQlpZiAoIXVzdGF0dXMgJiYgZGlzcGxheSkgewotCQkJTlZfSU5GTyhkZXYsICJQR1JBUEhfVFJBUF9DQ0FDSEUgLSBubyB1c3RhdHVzP1xuIik7Ci0JCX0KLQkJaWYgKHVzdGF0dXMgJiAweDAwMDAwMDAxKSB7Ci0JCQludjUwX2ZiX3ZtX3RyYXAoZGV2LCBkaXNwbGF5LCAiUEdSQVBIX1RSQVBfQ0NBQ0hFX0ZBVUxUIik7Ci0JCQlOVl9JTkZPIChkZXYsICJQR1JBUEhfVFJBUF9DQ0FDSEVfRkFVTFQgLSAlMDh4ICUwOHggJTA4eCAlMDh4ICUwOHggJTA4eCAlMDh4XG4iLAotCQkJCQludl9yZDMyKGRldiwgMHg0MDU4MDApLAotCQkJCQludl9yZDMyKGRldiwgMHg0MDU4MDQpLAotCQkJCQludl9yZDMyKGRldiwgMHg0MDU4MDgpLAotCQkJCQludl9yZDMyKGRldiwgMHg0MDU4MGMpLAotCQkJCQludl9yZDMyKGRldiwgMHg0MDU4MTApLAotCQkJCQludl9yZDMyKGRldiwgMHg0MDU4MTQpLAotCQkJCQludl9yZDMyKGRldiwgMHg0MDU4MWMpKTsKLQkJCXVzdGF0dXMgJj0gfjB4MDAwMDAwMDE7Ci0JCX0KLQkJaWYgKHVzdGF0dXMgJiYgZGlzcGxheSkKLQkJCU5WX0lORk8oZGV2LCAiUEdSQVBIX1RSQVBfQ0NBQ0hFIC0gVW5oYW5kbGVkIHVzdGF0dXMgMHglMDh4XG4iLCB1c3RhdHVzKTsKLQkJbnZfd3IzMihkZXYsIDB4NDA1MDE4LCAweGMwMDAwMDAwKTsKLQkJbnZfd3IzMihkZXYsIDB4NDAwMTA4LCAweDAxMCk7Ci0JCXN0YXR1cyAmPSB+MHgwMTA7Ci0JfQotCi0JLyogVW5rbm93biwgbm90IHNlZW4geWV0Li4uIDB4NDAyMDAwIGlzIHRoZSBvbmx5IHRyYXAgc3RhdHVzIHJlZwotCSAqIHJlbWFpbmluZywgc28gdHJ5IHRvIGhhbmRsZSBpdCBhbnl3YXkuIFBlcmhhcHMgcmVsYXRlZCB0byB0aGF0Ci0JICogdW5rbm93biBETUEgc2xvdCBvbiB0ZXNsYT8gKi8KLQlpZiAoc3RhdHVzICYgMHgyMCkgewotCQludjUwX2ZiX3ZtX3RyYXAoZGV2LCBkaXNwbGF5LCAiUEdSQVBIX1RSQVBfVU5LQzA0Iik7Ci0JCXVzdGF0dXMgPSBudl9yZDMyKGRldiwgMHg0MDIwMDApICYgMHg3ZmZmZmZmZjsKLQkJaWYgKGRpc3BsYXkpCi0JCQlOVl9JTkZPKGRldiwgIlBHUkFQSF9UUkFQX1VOS0MwNCAtIFVuaGFuZGxlZCB1c3RhdHVzIDB4JTA4eFxuIiwgdXN0YXR1cyk7Ci0JCW52X3dyMzIoZGV2LCAweDQwMjAwMCwgMHhjMDAwMDAwMCk7Ci0JCS8qIG5vIHN0YXR1cyBtb2RpZmljdGlvbiBvbiBwdXJwb3NlICovCi0JfQotCi0JLyogVEVYVFVSRTogQ1VEQSB0ZXh0dXJpbmcgdW5pdHMgKi8KLQlpZiAoc3RhdHVzICYgMHgwNDApIHsKLQkJbnY1MF9wZ3JhcGhfdHBfdHJhcCAoZGV2LCA2LCAweDQwODkwMCwgMHg0MDg2MDAsIGRpc3BsYXksCi0JCQkJIlBHUkFQSF9UUkFQX1RFWFRVUkUiKTsKLQkJbnZfd3IzMihkZXYsIDB4NDAwMTA4LCAweDA0MCk7Ci0JCXN0YXR1cyAmPSB+MHgwNDA7Ci0JfQotCi0JLyogTVA6IENVREEgZXhlY3V0aW9uIGVuZ2luZXMuICovCi0JaWYgKHN0YXR1cyAmIDB4MDgwKSB7Ci0JCW52NTBfcGdyYXBoX3RwX3RyYXAgKGRldiwgNywgMHg0MDgzMTQsIDB4NDA4MzFjLCBkaXNwbGF5LAotCQkJCSJQR1JBUEhfVFJBUF9NUCIpOwotCQludl93cjMyKGRldiwgMHg0MDAxMDgsIDB4MDgwKTsKLQkJc3RhdHVzICY9IH4weDA4MDsKLQl9Ci0KLQkvKiBUUERNQTogIEhhbmRsZXMgVFAtaW5pdGlhdGVkIHVuY2FjaGVkIG1lbW9yeSBhY2Nlc3NlczoKLQkgKiBsW10sIGdbXSwgc3RhY2ssIDJkIHN1cmZhY2VzLCByZW5kZXIgdGFyZ2V0cy4gKi8KLQlpZiAoc3RhdHVzICYgMHgxMDApIHsKLQkJbnY1MF9wZ3JhcGhfdHBfdHJhcCAoZGV2LCA4LCAweDQwOGUwOCwgMHg0MDg3MDgsIGRpc3BsYXksCi0JCQkJIlBHUkFQSF9UUkFQX1RQRE1BIik7Ci0JCW52X3dyMzIoZGV2LCAweDQwMDEwOCwgMHgxMDApOwotCQlzdGF0dXMgJj0gfjB4MTAwOwotCX0KLQotCWlmIChzdGF0dXMpIHsKLQkJaWYgKGRpc3BsYXkpCi0JCQlOVl9JTkZPKGRldiwgIlBHUkFQSF9UUkFQIC0gVW5rbm93biB0cmFwIDB4JTA4eFxuIiwKLQkJCQlzdGF0dXMpOwotCQludl93cjMyKGRldiwgMHg0MDAxMDgsIHN0YXR1cyk7Ci0JfQotfQotCi0vKiBUaGVyZSBtdXN0IGJlIGEgKmxvdCogb2YgdGhlc2UuIFdpbGwgdGFrZSBzb21lIHRpbWUgdG8gZ2F0aGVyIHRoZW0gdXAuICovCi1zdGF0aWMgc3RydWN0IG5vdXZlYXVfZW51bV9uYW1lcyBudjUwX2RhdGFfZXJyb3JfbmFtZXNbXSA9Ci17Ci0JeyA0LAkiSU5WQUxJRF9WQUxVRSIgfSwKLQl7IDUsCSJJTlZBTElEX0VOVU0iIH0sCi0JeyA4LAkiSU5WQUxJRF9PQkpFQ1QiIH0sCi0JeyAweGMsCSJJTlZBTElEX0JJVEZJRUxEIiB9LAotCXsgMHgyOCwJIk1QX05PX1JFR19TUEFDRSIgfSwKLQl7IDB4MmIsCSJNUF9CTE9DS19TSVpFX01JU01BVENIIiB9LAotfTsKLQotc3RhdGljIHZvaWQKLW52NTBfcGdyYXBoX2lycV9oYW5kbGVyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IG5vdXZlYXVfcGdyYXBoX3RyYXAgdHJhcDsKLQlpbnQgdW5oYW5kbGVkID0gMDsKLQl1aW50MzJfdCBzdGF0dXM7Ci0KLQl3aGlsZSAoKHN0YXR1cyA9IG52X3JkMzIoZGV2LCBOVjAzX1BHUkFQSF9JTlRSKSkpIHsKLQkJLyogTk9USUZZOiBZb3UndmUgc2V0IGEgTk9USUZZIGFuIGEgY29tbWFuZCBhbmQgaXQncyBkb25lLiAqLwotCQlpZiAoc3RhdHVzICYgMHgwMDAwMDAwMSkgewotCQkJbm91dmVhdV9ncmFwaF90cmFwX2luZm8oZGV2LCAmdHJhcCk7Ci0JCQlpZiAobm91dmVhdV9yYXRlbGltaXQoKSkKLQkJCQlub3V2ZWF1X2dyYXBoX2R1bXBfdHJhcF9pbmZvKGRldiwKLQkJCQkJCSJQR1JBUEhfTk9USUZZIiwgJnRyYXApOwotCQkJc3RhdHVzICY9IH4weDAwMDAwMDAxOwotCQkJbnZfd3IzMihkZXYsIE5WMDNfUEdSQVBIX0lOVFIsIDB4MDAwMDAwMDEpOwotCQl9Ci0KLQkJLyogQ09NUFVURV9RVUVSWTogUHVycG9zZSBhbmQgZXhhY3QgY2F1c2UgdW5rbm93biwgaGFwcGVucwotCQkgKiB3aGVuIHlvdSB3cml0ZSAweDIwMCB0byAweDUwYzAgbWV0aG9kIDB4MzFjLiAqLwotCQlpZiAoc3RhdHVzICYgMHgwMDAwMDAwMikgewotCQkJbm91dmVhdV9ncmFwaF90cmFwX2luZm8oZGV2LCAmdHJhcCk7Ci0JCQlpZiAobm91dmVhdV9yYXRlbGltaXQoKSkKLQkJCQlub3V2ZWF1X2dyYXBoX2R1bXBfdHJhcF9pbmZvKGRldiwKLQkJCQkJCSJQR1JBUEhfQ09NUFVURV9RVUVSWSIsICZ0cmFwKTsKLQkJCXN0YXR1cyAmPSB+MHgwMDAwMDAwMjsKLQkJCW52X3dyMzIoZGV2LCBOVjAzX1BHUkFQSF9JTlRSLCAweDAwMDAwMDAyKTsKLQkJfQotCi0JCS8qIFVua25vd24sIG5ldmVyIHNlZW46IDB4NCAqLwotCi0JCS8qIElMTEVHQUxfTVRIRDogWW91IHVzZWQgYSB3cm9uZyBtZXRob2QgZm9yIHRoaXMgY2xhc3MuICovCi0JCWlmIChzdGF0dXMgJiAweDAwMDAwMDEwKSB7Ci0JCQlub3V2ZWF1X2dyYXBoX3RyYXBfaW5mbyhkZXYsICZ0cmFwKTsKLQkJCWlmIChub3V2ZWF1X3BncmFwaF9pbnRyX3N3bXRoZChkZXYsICZ0cmFwKSkKLQkJCQl1bmhhbmRsZWQgPSAxOwotCQkJaWYgKHVuaGFuZGxlZCAmJiBub3V2ZWF1X3JhdGVsaW1pdCgpKQotCQkJCW5vdXZlYXVfZ3JhcGhfZHVtcF90cmFwX2luZm8oZGV2LAotCQkJCQkJIlBHUkFQSF9JTExFR0FMX01USEQiLCAmdHJhcCk7Ci0JCQlzdGF0dXMgJj0gfjB4MDAwMDAwMTA7Ci0JCQludl93cjMyKGRldiwgTlYwM19QR1JBUEhfSU5UUiwgMHgwMDAwMDAxMCk7Ci0JCX0KLQotCQkvKiBJTExFR0FMX0NMQVNTOiBZb3UgdXNlZCBhIHdyb25nIGNsYXNzLiAqLwotCQlpZiAoc3RhdHVzICYgMHgwMDAwMDAyMCkgewotCQkJbm91dmVhdV9ncmFwaF90cmFwX2luZm8oZGV2LCAmdHJhcCk7Ci0JCQlpZiAobm91dmVhdV9yYXRlbGltaXQoKSkKLQkJCQlub3V2ZWF1X2dyYXBoX2R1bXBfdHJhcF9pbmZvKGRldiwKLQkJCQkJCSJQR1JBUEhfSUxMRUdBTF9DTEFTUyIsICZ0cmFwKTsKLQkJCXN0YXR1cyAmPSB+MHgwMDAwMDAyMDsKLQkJCW52X3dyMzIoZGV2LCBOVjAzX1BHUkFQSF9JTlRSLCAweDAwMDAwMDIwKTsKLQkJfQotCi0JCS8qIERPVUJMRV9OT1RJRlk6IFlvdSB0cmllZCB0byBzZXQgYSBOT1RJRlkgb24gYW5vdGhlciBOT1RJRlkuICovCi0JCWlmIChzdGF0dXMgJiAweDAwMDAwMDQwKSB7Ci0JCQlub3V2ZWF1X2dyYXBoX3RyYXBfaW5mbyhkZXYsICZ0cmFwKTsKLQkJCWlmIChub3V2ZWF1X3JhdGVsaW1pdCgpKQotCQkJCW5vdXZlYXVfZ3JhcGhfZHVtcF90cmFwX2luZm8oZGV2LAotCQkJCQkJIlBHUkFQSF9ET1VCTEVfTk9USUZZIiwgJnRyYXApOwotCQkJc3RhdHVzICY9IH4weDAwMDAwMDQwOwotCQkJbnZfd3IzMihkZXYsIE5WMDNfUEdSQVBIX0lOVFIsIDB4MDAwMDAwNDApOwotCQl9Ci0KLQkJLyogQ09OVEVYVF9TV0lUQ0g6IFBHUkFQSCBuZWVkcyB1cyB0byBsb2FkIGEgbmV3IGNvbnRleHQgKi8KLQkJaWYgKHN0YXR1cyAmIDB4MDAwMDEwMDApIHsKLQkJCW52X3dyMzIoZGV2LCAweDQwMDUwMCwgMHgwMDAwMDAwMCk7Ci0JCQludl93cjMyKGRldiwgTlYwM19QR1JBUEhfSU5UUiwKLQkJCQlOVl9QR1JBUEhfSU5UUl9DT05URVhUX1NXSVRDSCk7Ci0JCQludl93cjMyKGRldiwgTlY0MF9QR1JBUEhfSU5UUl9FTiwgbnZfcmQzMihkZXYsCi0JCQkJTlY0MF9QR1JBUEhfSU5UUl9FTikgJgotCQkJCX5OVl9QR1JBUEhfSU5UUl9DT05URVhUX1NXSVRDSCk7Ci0JCQludl93cjMyKGRldiwgMHg0MDA1MDAsIDB4MDAwMTAwMDEpOwotCi0JCQludjUwX2dyYXBoX2NvbnRleHRfc3dpdGNoKGRldik7Ci0KLQkJCXN0YXR1cyAmPSB+TlZfUEdSQVBIX0lOVFJfQ09OVEVYVF9TV0lUQ0g7Ci0JCX0KLQotCQkvKiBCVUZGRVJfTk9USUZZOiBZb3VyIG0ybWYgdHJhbnNmZXIgZmluaXNoZWQgKi8KLQkJaWYgKHN0YXR1cyAmIDB4MDAwMTAwMDApIHsKLQkJCW5vdXZlYXVfZ3JhcGhfdHJhcF9pbmZvKGRldiwgJnRyYXApOwotCQkJaWYgKG5vdXZlYXVfcmF0ZWxpbWl0KCkpCi0JCQkJbm91dmVhdV9ncmFwaF9kdW1wX3RyYXBfaW5mbyhkZXYsCi0JCQkJCQkiUEdSQVBIX0JVRkZFUl9OT1RJRlkiLCAmdHJhcCk7Ci0JCQlzdGF0dXMgJj0gfjB4MDAwMTAwMDA7Ci0JCQludl93cjMyKGRldiwgTlYwM19QR1JBUEhfSU5UUiwgMHgwMDAxMDAwMCk7Ci0JCX0KLQotCQkvKiBEQVRBX0VSUk9SOiBJbnZhbGlkIHZhbHVlIGZvciB0aGlzIG1ldGhvZCwgb3IgaW52YWxpZAotCQkgKiBzdGF0ZSBpbiBjdXJyZW50IFBHUkFQSCBjb250ZXh0IGZvciB0aGlzIG9wZXJhdGlvbiAqLwotCQlpZiAoc3RhdHVzICYgMHgwMDEwMDAwMCkgewotCQkJbm91dmVhdV9ncmFwaF90cmFwX2luZm8oZGV2LCAmdHJhcCk7Ci0JCQlpZiAobm91dmVhdV9yYXRlbGltaXQoKSkgewotCQkJCW5vdXZlYXVfZ3JhcGhfZHVtcF90cmFwX2luZm8oZGV2LAotCQkJCQkJIlBHUkFQSF9EQVRBX0VSUk9SIiwgJnRyYXApOwotCQkJCU5WX0lORk8gKGRldiwgIlBHUkFQSF9EQVRBX0VSUk9SIC0gIik7Ci0JCQkJbm91dmVhdV9wcmludF9lbnVtX25hbWVzKG52X3JkMzIoZGV2LCAweDQwMDExMCksCi0JCQkJCQludjUwX2RhdGFfZXJyb3JfbmFtZXMpOwotCQkJCXByaW50aygiXG4iKTsKLQkJCX0KLQkJCXN0YXR1cyAmPSB+MHgwMDEwMDAwMDsKLQkJCW52X3dyMzIoZGV2LCBOVjAzX1BHUkFQSF9JTlRSLCAweDAwMTAwMDAwKTsKLQkJfQotCi0JCS8qIFRSQVA6IFNvbWV0aGluZyBiYWQgaGFwcGVuZWQgaW4gdGhlIG1pZGRsZSBvZiBjb21tYW5kCi0JCSAqIGV4ZWN1dGlvbi4gIEhhcyBhIGJpbGxpb24gdHlwZXMsIHN1YnR5cGVzLCBhbmQgZXZlbgotCQkgKiBzdWJzdWJ0eXBlcy4gKi8KLQkJaWYgKHN0YXR1cyAmIDB4MDAyMDAwMDApIHsKLQkJCW52NTBfcGdyYXBoX3RyYXBfaGFuZGxlcihkZXYpOwotCQkJc3RhdHVzICY9IH4weDAwMjAwMDAwOwotCQkJbnZfd3IzMihkZXYsIE5WMDNfUEdSQVBIX0lOVFIsIDB4MDAyMDAwMDApOwotCQl9Ci0KLQkJLyogVW5rbm93biwgbmV2ZXIgc2VlbjogMHgwMDQwMDAwMCAqLwotCi0JCS8qIFNJTkdMRV9TVEVQOiBIYXBwZW5zIG9uIGV2ZXJ5IG1ldGhvZCBpZiB5b3UgdHVybmVkIG9uCi0JCSAqIHNpbmdsZSBzdGVwcGluZyBpbiA0MDAwOGMgKi8KLQkJaWYgKHN0YXR1cyAmIDB4MDEwMDAwMDApIHsKLQkJCW5vdXZlYXVfZ3JhcGhfdHJhcF9pbmZvKGRldiwgJnRyYXApOwotCQkJaWYgKG5vdXZlYXVfcmF0ZWxpbWl0KCkpCi0JCQkJbm91dmVhdV9ncmFwaF9kdW1wX3RyYXBfaW5mbyhkZXYsCi0JCQkJCQkiUEdSQVBIX1NJTkdMRV9TVEVQIiwgJnRyYXApOwotCQkJc3RhdHVzICY9IH4weDAxMDAwMDAwOwotCQkJbnZfd3IzMihkZXYsIE5WMDNfUEdSQVBIX0lOVFIsIDB4MDEwMDAwMDApOwotCQl9Ci0KLQkJLyogMHgwMjAwMDAwMCBoYXBwZW5zIHdoZW4geW91IHBhdXNlIGEgY3R4cHJvZy4uLgotCQkgKiBidXQgdGhlIG9ubHkgd2F5IHRoaXMgY2FuIGhhcHBlbiB0aGF0IEkga25vdyBpcyBieQotCQkgKiBwb2tpbmcgdGhlIHJlbGV2YW50IE1NSU8gcmVnaXN0ZXIsIGFuZCB3ZSBkb24ndAotCQkgKiBkbyB0aGF0LiAqLwotCi0JCWlmIChzdGF0dXMpIHsKLQkJCU5WX0lORk8oZGV2LCAiVW5oYW5kbGVkIFBHUkFQSF9JTlRSIC0gMHglMDh4XG4iLAotCQkJCXN0YXR1cyk7Ci0JCQludl93cjMyKGRldiwgTlYwM19QR1JBUEhfSU5UUiwgc3RhdHVzKTsKLQkJfQotCi0JCXsKLQkJCWNvbnN0IGludCBpc2IgPSAoMSA8PCAxNikgfCAoMSA8PCAwKTsKLQotCQkJaWYgKChudl9yZDMyKGRldiwgMHg0MDA1MDApICYgaXNiKSAhPSBpc2IpCi0JCQkJbnZfd3IzMihkZXYsIDB4NDAwNTAwLAotCQkJCQludl9yZDMyKGRldiwgMHg0MDA1MDApIHwgaXNiKTsKLQkJfQotCX0KLQotCW52X3dyMzIoZGV2LCBOVjAzX1BNQ19JTlRSXzAsIE5WX1BNQ19JTlRSXzBfUEdSQVBIX1BFTkRJTkcpOwotCWlmIChudl9yZDMyKGRldiwgMHg0MDA4MjQpICYgKDEgPDwgMzEpKQotCQludl93cjMyKGRldiwgMHg0MDA4MjQsIG52X3JkMzIoZGV2LCAweDQwMDgyNCkgJiB+KDEgPDwgMzEpKTsKLX0KLQotc3RhdGljIHZvaWQKLW5vdXZlYXVfY3J0Y19pcnFfaGFuZGxlcihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgY3J0YykKLXsKLQlpZiAoY3J0YyAmIDEpCi0JCW52X3dyMzIoZGV2LCBOVl9DUlRDMF9JTlRTVEFULCBOVl9DUlRDX0lOVFJfVkJMQU5LKTsKLQotCWlmIChjcnRjICYgMikKLQkJbnZfd3IzMihkZXYsIE5WX0NSVEMxX0lOVFNUQVQsIE5WX0NSVENfSU5UUl9WQkxBTkspOwotfQotCiBpcnFyZXR1cm5fdAogbm91dmVhdV9pcnFfaGFuZGxlcihEUk1fSVJRX0FSR1MpCiB7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgZHJtX2RldmljZSAqKWFyZzsKIAlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCXVpbnQzMl90IHN0YXR1czsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOworCXUzMiBzdGF0OworCWludCBpOwogCi0Jc3RhdHVzID0gbnZfcmQzMihkZXYsIE5WMDNfUE1DX0lOVFJfMCk7Ci0JaWYgKCFzdGF0dXMpCisJc3RhdCA9IG52X3JkMzIoZGV2LCBOVjAzX1BNQ19JTlRSXzApOworCWlmICghc3RhdCkKIAkJcmV0dXJuIElSUV9OT05FOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmRldl9wcml2LT5jb250ZXh0X3N3aXRjaF9sb2NrLCBmbGFncyk7CisJZm9yIChpID0gMDsgaSA8IDMyICYmIHN0YXQ7IGkrKykgeworCQlpZiAoIShzdGF0ICYgKDEgPDwgaSkpIHx8ICFkZXZfcHJpdi0+aXJxX2hhbmRsZXJbaV0pCisJCQljb250aW51ZTsKIAotCWlmIChzdGF0dXMgJiBOVl9QTUNfSU5UUl8wX1BGSUZPX1BFTkRJTkcpIHsKLQkJbm91dmVhdV9maWZvX2lycV9oYW5kbGVyKGRldik7Ci0JCXN0YXR1cyAmPSB+TlZfUE1DX0lOVFJfMF9QRklGT19QRU5ESU5HOworCQlkZXZfcHJpdi0+aXJxX2hhbmRsZXJbaV0oZGV2KTsKKwkJc3RhdCAmPSB+KDEgPDwgaSk7CiAJfQogCi0JaWYgKHN0YXR1cyAmIE5WX1BNQ19JTlRSXzBfUEdSQVBIX1BFTkRJTkcpIHsKLQkJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPj0gTlZfNTApCi0JCQludjUwX3BncmFwaF9pcnFfaGFuZGxlcihkZXYpOwotCQllbHNlCi0JCQlub3V2ZWF1X3BncmFwaF9pcnFfaGFuZGxlcihkZXYpOwotCi0JCXN0YXR1cyAmPSB+TlZfUE1DX0lOVFJfMF9QR1JBUEhfUEVORElORzsKLQl9Ci0KLQlpZiAoc3RhdHVzICYgTlZfUE1DX0lOVFJfMF9DUlRDbl9QRU5ESU5HKSB7Ci0JCW5vdXZlYXVfY3J0Y19pcnFfaGFuZGxlcihkZXYsIChzdGF0dXM+PjI0KSYzKTsKLQkJc3RhdHVzICY9IH5OVl9QTUNfSU5UUl8wX0NSVENuX1BFTkRJTkc7Ci0JfQotCi0JaWYgKHN0YXR1cyAmIChOVl9QTUNfSU5UUl8wX05WNTBfRElTUExBWV9QRU5ESU5HIHwKLQkJICAgICAgTlZfUE1DX0lOVFJfMF9OVjUwX0kyQ19QRU5ESU5HKSkgewotCQludjUwX2Rpc3BsYXlfaXJxX2hhbmRsZXIoZGV2KTsKLQkJc3RhdHVzICY9IH4oTlZfUE1DX0lOVFJfMF9OVjUwX0RJU1BMQVlfUEVORElORyB8Ci0JCQkgICAgTlZfUE1DX0lOVFJfMF9OVjUwX0kyQ19QRU5ESU5HKTsKLQl9Ci0KLQlpZiAoc3RhdHVzKQotCQlOVl9FUlJPUihkZXYsICJVbmhhbmRsZWQgUE1DIElOVFIgc3RhdHVzIGJpdHMgMHglMDh4XG4iLCBzdGF0dXMpOwotCisJaWYgKGRldl9wcml2LT5tc2lfZW5hYmxlZCkKKwkJbnZfd3IwOChkZXYsIDB4MDAwODgwNjgsIDB4ZmYpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldl9wcml2LT5jb250ZXh0X3N3aXRjaF9sb2NrLCBmbGFncyk7CiAKKwlpZiAoc3RhdCAmJiBub3V2ZWF1X3JhdGVsaW1pdCgpKQorCQlOVl9FUlJPUihkZXYsICJQTUMgLSB1bmhhbmRsZWQgSU5UUiAweCUwOHhcbiIsIHN0YXQpOwogCXJldHVybiBJUlFfSEFORExFRDsKIH0KKworaW50Citub3V2ZWF1X2lycV9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlpbnQgcmV0OworCisJaWYgKG5vdXZlYXVfbXNpICE9IDAgJiYgZGV2X3ByaXYtPmNhcmRfdHlwZSA+PSBOVl81MCkgeworCQlyZXQgPSBwY2lfZW5hYmxlX21zaShkZXYtPnBkZXYpOworCQlpZiAocmV0ID09IDApIHsKKwkJCU5WX0lORk8oZGV2LCAiZW5hYmxlZCBNU0lcbiIpOworCQkJZGV2X3ByaXYtPm1zaV9lbmFibGVkID0gdHJ1ZTsKKwkJfQorCX0KKworCXJldHVybiBkcm1faXJxX2luc3RhbGwoZGV2KTsKK30KKwordm9pZAorbm91dmVhdV9pcnFfZmluaShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisKKwlkcm1faXJxX3VuaW5zdGFsbChkZXYpOworCWlmIChkZXZfcHJpdi0+bXNpX2VuYWJsZWQpCisJCXBjaV9kaXNhYmxlX21zaShkZXYtPnBkZXYpOworfQorCit2b2lkCitub3V2ZWF1X2lycV9yZWdpc3RlcihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgc3RhdHVzX2JpdCwKKwkJICAgICB2b2lkICgqaGFuZGxlcikoc3RydWN0IGRybV9kZXZpY2UgKikpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldl9wcml2LT5jb250ZXh0X3N3aXRjaF9sb2NrLCBmbGFncyk7CisJZGV2X3ByaXYtPmlycV9oYW5kbGVyW3N0YXR1c19iaXRdID0gaGFuZGxlcjsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZfcHJpdi0+Y29udGV4dF9zd2l0Y2hfbG9jaywgZmxhZ3MpOworfQorCit2b2lkCitub3V2ZWF1X2lycV91bnJlZ2lzdGVyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBzdGF0dXNfYml0KQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZfcHJpdi0+Y29udGV4dF9zd2l0Y2hfbG9jaywgZmxhZ3MpOworCWRldl9wcml2LT5pcnFfaGFuZGxlcltzdGF0dXNfYml0XSA9IE5VTEw7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2X3ByaXYtPmNvbnRleHRfc3dpdGNoX2xvY2ssIGZsYWdzKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfbWVtLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X21lbS5jCmluZGV4IGZlNGEzMGQuLjY5MDQ0ZWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfbWVtLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9tZW0uYwpAQCAtMzYsMTgzICszNiwxMTIgQEAKIAogI2luY2x1ZGUgIm5vdXZlYXVfZHJ2LmgiCiAjaW5jbHVkZSAibm91dmVhdV9wbS5oIgorI2luY2x1ZGUgIm5vdXZlYXVfbW0uaCIKKyNpbmNsdWRlICJub3V2ZWF1X3ZtLmgiCiAKIC8qCiAgKiBOVjEwLU5WNDAgdGlsaW5nIGhlbHBlcnMKICAqLwogCiBzdGF0aWMgdm9pZAotbnYxMF9tZW1fc2V0X3JlZ2lvbl90aWxpbmcoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGksIHVpbnQzMl90IGFkZHIsCi0JCQkgICB1aW50MzJfdCBzaXplLCB1aW50MzJfdCBwaXRjaCkKK252MTBfbWVtX3VwZGF0ZV90aWxlX3JlZ2lvbihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAorCQkJICAgIHN0cnVjdCBub3V2ZWF1X3RpbGVfcmVnICp0aWxlLCB1aW50MzJfdCBhZGRyLAorCQkJICAgIHVpbnQzMl90IHNpemUsIHVpbnQzMl90IHBpdGNoLCB1aW50MzJfdCBmbGFncykKIHsKIAlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXN0cnVjdCBub3V2ZWF1X2ZpZm9fZW5naW5lICpwZmlmbyA9ICZkZXZfcHJpdi0+ZW5naW5lLmZpZm87CiAJc3RydWN0IG5vdXZlYXVfZmJfZW5naW5lICpwZmIgPSAmZGV2X3ByaXYtPmVuZ2luZS5mYjsKIAlzdHJ1Y3Qgbm91dmVhdV9wZ3JhcGhfZW5naW5lICpwZ3JhcGggPSAmZGV2X3ByaXYtPmVuZ2luZS5ncmFwaDsKLQlzdHJ1Y3Qgbm91dmVhdV90aWxlX3JlZyAqdGlsZSA9ICZkZXZfcHJpdi0+dGlsZVtpXTsKKwlpbnQgaSA9IHRpbGUgLSBkZXZfcHJpdi0+dGlsZS5yZWc7CisJdW5zaWduZWQgbG9uZyBzYXZlOwogCi0JdGlsZS0+YWRkciA9IGFkZHI7Ci0JdGlsZS0+c2l6ZSA9IHNpemU7Ci0JdGlsZS0+dXNlZCA9ICEhcGl0Y2g7Ci0Jbm91dmVhdV9mZW5jZV91bnJlZigodm9pZCAqKikmdGlsZS0+ZmVuY2UpOworCW5vdXZlYXVfZmVuY2VfdW5yZWYoJnRpbGUtPmZlbmNlKTsKIAorCWlmICh0aWxlLT5waXRjaCkKKwkJcGZiLT5mcmVlX3RpbGVfcmVnaW9uKGRldiwgaSk7CisKKwlpZiAocGl0Y2gpCisJCXBmYi0+aW5pdF90aWxlX3JlZ2lvbihkZXYsIGksIGFkZHIsIHNpemUsIHBpdGNoLCBmbGFncyk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2X3ByaXYtPmNvbnRleHRfc3dpdGNoX2xvY2ssIHNhdmUpOwogCXBmaWZvLT5yZWFzc2lnbihkZXYsIGZhbHNlKTsKIAlwZmlmby0+Y2FjaGVfcHVsbChkZXYsIGZhbHNlKTsKIAogCW5vdXZlYXVfd2FpdF9mb3JfaWRsZShkZXYpOwogCi0JcGdyYXBoLT5zZXRfcmVnaW9uX3RpbGluZyhkZXYsIGksIGFkZHIsIHNpemUsIHBpdGNoKTsKLQlwZmItPnNldF9yZWdpb25fdGlsaW5nKGRldiwgaSwgYWRkciwgc2l6ZSwgcGl0Y2gpOworCXBmYi0+c2V0X3RpbGVfcmVnaW9uKGRldiwgaSk7CisJcGdyYXBoLT5zZXRfdGlsZV9yZWdpb24oZGV2LCBpKTsKIAogCXBmaWZvLT5jYWNoZV9wdWxsKGRldiwgdHJ1ZSk7CiAJcGZpZm8tPnJlYXNzaWduKGRldiwgdHJ1ZSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2X3ByaXYtPmNvbnRleHRfc3dpdGNoX2xvY2ssIHNhdmUpOworfQorCitzdGF0aWMgc3RydWN0IG5vdXZlYXVfdGlsZV9yZWcgKgorbnYxMF9tZW1fZ2V0X3RpbGVfcmVnaW9uKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBpKQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG5vdXZlYXVfdGlsZV9yZWcgKnRpbGUgPSAmZGV2X3ByaXYtPnRpbGUucmVnW2ldOworCisJc3Bpbl9sb2NrKCZkZXZfcHJpdi0+dGlsZS5sb2NrKTsKKworCWlmICghdGlsZS0+dXNlZCAmJgorCSAgICAoIXRpbGUtPmZlbmNlIHx8IG5vdXZlYXVfZmVuY2Vfc2lnbmFsbGVkKHRpbGUtPmZlbmNlKSkpCisJCXRpbGUtPnVzZWQgPSB0cnVlOworCWVsc2UKKwkJdGlsZSA9IE5VTEw7CisKKwlzcGluX3VubG9jaygmZGV2X3ByaXYtPnRpbGUubG9jayk7CisJcmV0dXJuIHRpbGU7Cit9CisKK3ZvaWQKK252MTBfbWVtX3B1dF90aWxlX3JlZ2lvbihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3Qgbm91dmVhdV90aWxlX3JlZyAqdGlsZSwKKwkJCSBzdHJ1Y3Qgbm91dmVhdV9mZW5jZSAqZmVuY2UpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKworCWlmICh0aWxlKSB7CisJCXNwaW5fbG9jaygmZGV2X3ByaXYtPnRpbGUubG9jayk7CisJCWlmIChmZW5jZSkgeworCQkJLyogTWFyayBpdCBhcyBwZW5kaW5nLiAqLworCQkJdGlsZS0+ZmVuY2UgPSBmZW5jZTsKKwkJCW5vdXZlYXVfZmVuY2VfcmVmKGZlbmNlKTsKKwkJfQorCisJCXRpbGUtPnVzZWQgPSBmYWxzZTsKKwkJc3Bpbl91bmxvY2soJmRldl9wcml2LT50aWxlLmxvY2spOworCX0KIH0KIAogc3RydWN0IG5vdXZlYXVfdGlsZV9yZWcgKgogbnYxMF9tZW1fc2V0X3RpbGluZyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1aW50MzJfdCBhZGRyLCB1aW50MzJfdCBzaXplLAotCQkgICAgdWludDMyX3QgcGl0Y2gpCisJCSAgICB1aW50MzJfdCBwaXRjaCwgdWludDMyX3QgZmxhZ3MpCiB7CiAJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlzdHJ1Y3Qgbm91dmVhdV9mYl9lbmdpbmUgKnBmYiA9ICZkZXZfcHJpdi0+ZW5naW5lLmZiOwotCXN0cnVjdCBub3V2ZWF1X3RpbGVfcmVnICpmb3VuZCA9IE5VTEw7Ci0JdW5zaWduZWQgbG9uZyBpLCBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZfcHJpdi0+Y29udGV4dF9zd2l0Y2hfbG9jaywgZmxhZ3MpOwotCi0JZm9yIChpID0gMDsgaSA8IHBmYi0+bnVtX3RpbGVzOyBpKyspIHsKLQkJc3RydWN0IG5vdXZlYXVfdGlsZV9yZWcgKnRpbGUgPSAmZGV2X3ByaXYtPnRpbGVbaV07Ci0KLQkJaWYgKHRpbGUtPnVzZWQpCi0JCQkvKiBUaWxlIHJlZ2lvbiBpbiB1c2UuICovCi0JCQljb250aW51ZTsKLQotCQlpZiAodGlsZS0+ZmVuY2UgJiYKLQkJICAgICFub3V2ZWF1X2ZlbmNlX3NpZ25hbGxlZCh0aWxlLT5mZW5jZSwgTlVMTCkpCi0JCQkvKiBQZW5kaW5nIHRpbGUgcmVnaW9uLiAqLwotCQkJY29udGludWU7Ci0KLQkJaWYgKG1heCh0aWxlLT5hZGRyLCBhZGRyKSA8Ci0JCSAgICBtaW4odGlsZS0+YWRkciArIHRpbGUtPnNpemUsIGFkZHIgKyBzaXplKSkKLQkJCS8qIEtpbGwgYW4gaW50ZXJzZWN0aW5nIHRpbGUgcmVnaW9uLiAqLwotCQkJbnYxMF9tZW1fc2V0X3JlZ2lvbl90aWxpbmcoZGV2LCBpLCAwLCAwLCAwKTsKLQotCQlpZiAocGl0Y2ggJiYgIWZvdW5kKSB7Ci0JCQkvKiBGcmVlIHRpbGUgcmVnaW9uLiAqLwotCQkJbnYxMF9tZW1fc2V0X3JlZ2lvbl90aWxpbmcoZGV2LCBpLCBhZGRyLCBzaXplLCBwaXRjaCk7Ci0JCQlmb3VuZCA9IHRpbGU7Ci0JCX0KLQl9Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZfcHJpdi0+Y29udGV4dF9zd2l0Y2hfbG9jaywgZmxhZ3MpOwotCi0JcmV0dXJuIGZvdW5kOwotfQotCi12b2lkCi1udjEwX21lbV9leHBpcmVfdGlsaW5nKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBub3V2ZWF1X3RpbGVfcmVnICp0aWxlLAotCQkgICAgICAgc3RydWN0IG5vdXZlYXVfZmVuY2UgKmZlbmNlKQotewotCWlmIChmZW5jZSkgewotCQkvKiBNYXJrIGl0IGFzIHBlbmRpbmcuICovCi0JCXRpbGUtPmZlbmNlID0gZmVuY2U7Ci0JCW5vdXZlYXVfZmVuY2VfcmVmKGZlbmNlKTsKLQl9Ci0KLQl0aWxlLT51c2VkID0gZmFsc2U7Ci19Ci0KLS8qCi0gKiBOVjUwIFZNIGhlbHBlcnMKLSAqLwotaW50Ci1udjUwX21lbV92bV9iaW5kX2xpbmVhcihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1aW50NjRfdCB2aXJ0LCB1aW50MzJfdCBzaXplLAotCQkJdWludDMyX3QgZmxhZ3MsIHVpbnQ2NF90IHBoeXMpCi17Ci0Jc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKnBndDsKLQl1bnNpZ25lZCBibG9jazsKKwlzdHJ1Y3Qgbm91dmVhdV90aWxlX3JlZyAqdGlsZSwgKmZvdW5kID0gTlVMTDsKIAlpbnQgaTsKIAotCXZpcnQgPSAoKHZpcnQgLSBkZXZfcHJpdi0+dm1fdnJhbV9iYXNlKSA+PiAxNikgPDwgMTsKLQlzaXplID0gKHNpemUgPj4gMTYpIDw8IDE7CisJZm9yIChpID0gMDsgaSA8IHBmYi0+bnVtX3RpbGVzOyBpKyspIHsKKwkJdGlsZSA9IG52MTBfbWVtX2dldF90aWxlX3JlZ2lvbihkZXYsIGkpOwogCi0JcGh5cyB8PSAoKHVpbnQ2NF90KWZsYWdzIDw8IDMyKTsKLQlwaHlzIHw9IDE7Ci0JaWYgKGRldl9wcml2LT52cmFtX3N5c19iYXNlKSB7Ci0JCXBoeXMgKz0gZGV2X3ByaXYtPnZyYW1fc3lzX2Jhc2U7Ci0JCXBoeXMgfD0gMHgzMDsKKwkJaWYgKHBpdGNoICYmICFmb3VuZCkgeworCQkJZm91bmQgPSB0aWxlOworCQkJY29udGludWU7CisKKwkJfSBlbHNlIGlmICh0aWxlICYmIHRpbGUtPnBpdGNoKSB7CisJCQkvKiBLaWxsIGFuIHVudXNlZCB0aWxlIHJlZ2lvbi4gKi8KKwkJCW52MTBfbWVtX3VwZGF0ZV90aWxlX3JlZ2lvbihkZXYsIHRpbGUsIDAsIDAsIDAsIDApOworCQl9CisKKwkJbnYxMF9tZW1fcHV0X3RpbGVfcmVnaW9uKGRldiwgdGlsZSwgTlVMTCk7CiAJfQogCi0Jd2hpbGUgKHNpemUpIHsKLQkJdW5zaWduZWQgb2Zmc2V0X2ggPSB1cHBlcl8zMl9iaXRzKHBoeXMpOwotCQl1bnNpZ25lZCBvZmZzZXRfbCA9IGxvd2VyXzMyX2JpdHMocGh5cyk7Ci0JCXVuc2lnbmVkIHB0ZSwgZW5kOwotCi0JCWZvciAoaSA9IDc7IGkgPj0gMDsgaS0tKSB7Ci0JCQlibG9jayA9IDEgPDwgKGkgKyAxKTsKLQkJCWlmIChzaXplID49IGJsb2NrICYmICEodmlydCAmIChibG9jayAtIDEpKSkKLQkJCQlicmVhazsKLQkJfQotCQlvZmZzZXRfbCB8PSAoaSA8PCA3KTsKLQotCQlwaHlzICs9IGJsb2NrIDw8IDE1OwotCQlzaXplIC09IGJsb2NrOwotCi0JCXdoaWxlIChibG9jaykgewotCQkJcGd0ID0gZGV2X3ByaXYtPnZtX3ZyYW1fcHRbdmlydCA+PiAxNF07Ci0JCQlwdGUgPSB2aXJ0ICYgMHgzZmZlOwotCi0JCQllbmQgPSBwdGUgKyBibG9jazsKLQkJCWlmIChlbmQgPiAxNjM4NCkKLQkJCQllbmQgPSAxNjM4NDsKLQkJCWJsb2NrIC09IChlbmQgLSBwdGUpOwotCQkJdmlydCAgKz0gKGVuZCAtIHB0ZSk7Ci0KLQkJCXdoaWxlIChwdGUgPCBlbmQpIHsKLQkJCQludl93bzMyKHBndCwgKHB0ZSAqIDQpICsgMCwgb2Zmc2V0X2wpOwotCQkJCW52X3dvMzIocGd0LCAocHRlICogNCkgKyA0LCBvZmZzZXRfaCk7Ci0JCQkJcHRlICs9IDI7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlkZXZfcHJpdi0+ZW5naW5lLmluc3RtZW0uZmx1c2goZGV2KTsKLQlkZXZfcHJpdi0+ZW5naW5lLmZpZm8udGxiX2ZsdXNoKGRldik7Ci0JZGV2X3ByaXYtPmVuZ2luZS5ncmFwaC50bGJfZmx1c2goZGV2KTsKLQludjUwX3ZtX2ZsdXNoKGRldiwgNik7Ci0JcmV0dXJuIDA7Ci19Ci0KLXZvaWQKLW52NTBfbWVtX3ZtX3VuYmluZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1aW50NjRfdCB2aXJ0LCB1aW50MzJfdCBzaXplKQotewotCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Ci0Jc3RydWN0IG5vdXZlYXVfZ3B1b2JqICpwZ3Q7Ci0JdW5zaWduZWQgcGFnZXMsIHB0ZSwgZW5kOwotCi0JdmlydCAtPSBkZXZfcHJpdi0+dm1fdnJhbV9iYXNlOwotCXBhZ2VzID0gKHNpemUgPj4gMTYpIDw8IDE7Ci0KLQl3aGlsZSAocGFnZXMpIHsKLQkJcGd0ID0gZGV2X3ByaXYtPnZtX3ZyYW1fcHRbdmlydCA+PiAyOV07Ci0JCXB0ZSA9ICh2aXJ0ICYgMHgxZmZlMDAwMFVMTCkgPj4gMTU7Ci0KLQkJZW5kID0gcHRlICsgcGFnZXM7Ci0JCWlmIChlbmQgPiAxNjM4NCkKLQkJCWVuZCA9IDE2Mzg0OwotCQlwYWdlcyAtPSAoZW5kIC0gcHRlKTsKLQkJdmlydCAgKz0gKGVuZCAtIHB0ZSkgPDwgMTU7Ci0KLQkJd2hpbGUgKHB0ZSA8IGVuZCkgewotCQkJbnZfd28zMihwZ3QsIChwdGUgKiA0KSwgMCk7Ci0JCQlwdGUrKzsKLQkJfQotCX0KLQotCWRldl9wcml2LT5lbmdpbmUuaW5zdG1lbS5mbHVzaChkZXYpOwotCWRldl9wcml2LT5lbmdpbmUuZmlmby50bGJfZmx1c2goZGV2KTsKLQlkZXZfcHJpdi0+ZW5naW5lLmdyYXBoLnRsYl9mbHVzaChkZXYpOwotCW52NTBfdm1fZmx1c2goZGV2LCA2KTsKKwlpZiAoZm91bmQpCisJCW52MTBfbWVtX3VwZGF0ZV90aWxlX3JlZ2lvbihkZXYsIGZvdW5kLCBhZGRyLCBzaXplLAorCQkJCQkgICAgcGl0Y2gsIGZsYWdzKTsKKwlyZXR1cm4gZm91bmQ7CiB9CiAKIC8qCkBAIC0zMTIsNjIgKzI0MSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkCi1udjUwX3ZyYW1fcHJlaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQotewotCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Ci0JaW50IGksIHBhcnRzLCBjb2xiaXRzLCByb3diaXRzYSwgcm93Yml0c2IsIGJhbmtzOwotCXU2NCByb3dzaXplLCBwcmVkaWN0ZWQ7Ci0JdTMyIHIwLCByNCwgcnQsIHJ1OwotCi0JcjAgPSBudl9yZDMyKGRldiwgMHgxMDAyMDApOwotCXI0ID0gbnZfcmQzMihkZXYsIDB4MTAwMjA0KTsKLQlydCA9IG52X3JkMzIoZGV2LCAweDEwMDI1MCk7Ci0JcnUgPSBudl9yZDMyKGRldiwgMHgwMDE1NDApOwotCU5WX0RFQlVHKGRldiwgIm1lbWNmZyAweCUwOHggMHglMDh4IDB4JTA4eCAweCUwOHhcbiIsIHIwLCByNCwgcnQsIHJ1KTsKLQotCWZvciAoaSA9IDAsIHBhcnRzID0gMDsgaSA8IDg7IGkrKykgewotCQlpZiAocnUgJiAoMHgwMDAxMDAwMCA8PCBpKSkKLQkJCXBhcnRzKys7Ci0JfQotCi0JY29sYml0cyAgPSAgKHI0ICYgMHgwMDAwZjAwMCkgPj4gMTI7Ci0Jcm93Yml0c2EgPSAoKHI0ICYgMHgwMDBmMDAwMCkgPj4gMTYpICsgODsKLQlyb3diaXRzYiA9ICgocjQgJiAweDAwZjAwMDAwKSA+PiAyMCkgKyA4OwotCWJhbmtzICAgID0gKChyNCAmIDB4MDEwMDAwMDApID8gOCA6IDQpOwotCi0Jcm93c2l6ZSA9IHBhcnRzICogYmFua3MgKiAoMSA8PCBjb2xiaXRzKSAqIDg7Ci0JcHJlZGljdGVkID0gcm93c2l6ZSA8PCByb3diaXRzYTsKLQlpZiAocjAgJiAweDAwMDAwMDA0KQotCQlwcmVkaWN0ZWQgKz0gcm93c2l6ZSA8PCByb3diaXRzYjsKLQotCWlmIChwcmVkaWN0ZWQgIT0gZGV2X3ByaXYtPnZyYW1fc2l6ZSkgewotCQlOVl9XQVJOKGRldiwgIm1lbW9yeSBjb250cm9sbGVyIHJlcG9ydHMgJWRNaUIgVlJBTVxuIiwKLQkJCSh1MzIpKGRldl9wcml2LT52cmFtX3NpemUgPj4gMjApKTsKLQkJTlZfV0FSTihkZXYsICJ3ZSBjYWxjdWxhdGVkICVkTWlCIFZSQU1cbiIsCi0JCQkodTMyKShwcmVkaWN0ZWQgPj4gMjApKTsKLQl9Ci0KLQlkZXZfcHJpdi0+dnJhbV9yYmxvY2tfc2l6ZSA9IHJvd3NpemUgPj4gMTI7Ci0JaWYgKHJ0ICYgMSkKLQkJZGV2X3ByaXYtPnZyYW1fcmJsb2NrX3NpemUgKj0gMzsKLQotCU5WX0RFQlVHKGRldiwgInJibG9jayAlbGxkIGJ5dGVzXG4iLAotCQkgKHU2NClkZXZfcHJpdi0+dnJhbV9yYmxvY2tfc2l6ZSA8PCAxMik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1udmFhX3ZyYW1fcHJlaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQotewotCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Ci0KLQkvKiBUbyBvdXIga25vd2xlZGdlLCB0aGVyZSdzIG5vIGxhcmdlIHNjYWxlIHJlb3JkZXJpbmcgb2YgcGFnZXMKLQkgKiB0aGF0IG9jY3VycyBvbiBJR1AgY2hpcHNldHMuCi0JICovCi0JZGV2X3ByaXYtPnZyYW1fcmJsb2NrX3NpemUgPSAxOwotfQotCi1zdGF0aWMgaW50CitpbnQKIG5vdXZlYXVfbWVtX2RldGVjdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogewogCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CkBAIC0zODEsMzMgKzI1NSw2IEBACiAJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPCBOVl81MCkgewogCQlkZXZfcHJpdi0+dnJhbV9zaXplICA9IG52X3JkMzIoZGV2LCBOVjA0X1BGQl9GSUZPX0RBVEEpOwogCQlkZXZfcHJpdi0+dnJhbV9zaXplICY9IE5WMTBfUEZCX0ZJRk9fREFUQV9SQU1fQU1PVU5UX01CX01BU0s7Ci0JfSBlbHNlCi0JaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPCBOVl9DMCkgewotCQlkZXZfcHJpdi0+dnJhbV9zaXplID0gbnZfcmQzMihkZXYsIE5WMDRfUEZCX0ZJRk9fREFUQSk7Ci0JCWRldl9wcml2LT52cmFtX3NpemUgfD0gKGRldl9wcml2LT52cmFtX3NpemUgJiAweGZmKSA8PCAzMjsKLQkJZGV2X3ByaXYtPnZyYW1fc2l6ZSAmPSAweGZmZmZmZmZmMDBsbDsKLQotCQlzd2l0Y2ggKGRldl9wcml2LT5jaGlwc2V0KSB7Ci0JCWNhc2UgMHhhYToKLQkJY2FzZSAweGFjOgotCQljYXNlIDB4YWY6Ci0JCQlkZXZfcHJpdi0+dnJhbV9zeXNfYmFzZSA9IG52X3JkMzIoZGV2LCAweDEwMGUxMCk7Ci0JCQlkZXZfcHJpdi0+dnJhbV9zeXNfYmFzZSA8PD0gMTI7Ci0JCQludmFhX3ZyYW1fcHJlaW5pdChkZXYpOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQludjUwX3ZyYW1fcHJlaW5pdChkZXYpOwotCQkJYnJlYWs7Ci0JCX0KLQl9IGVsc2UgewotCQlkZXZfcHJpdi0+dnJhbV9zaXplICA9IG52X3JkMzIoZGV2LCAweDEwZjIwYykgPDwgMjA7Ci0JCWRldl9wcml2LT52cmFtX3NpemUgKj0gbnZfcmQzMihkZXYsIDB4MTIxYzc0KTsKLQl9Ci0KLQlOVl9JTkZPKGRldiwgIkRldGVjdGVkICVkTWlCIFZSQU1cbiIsIChpbnQpKGRldl9wcml2LT52cmFtX3NpemUgPj4gMjApKTsKLQlpZiAoZGV2X3ByaXYtPnZyYW1fc3lzX2Jhc2UpIHsKLQkJTlZfSU5GTyhkZXYsICJTdG9sZW4gc3lzdGVtIG1lbW9yeSBhdDogMHglMDEwbGx4XG4iLAotCQkJZGV2X3ByaXYtPnZyYW1fc3lzX2Jhc2UpOwogCX0KIAogCWlmIChkZXZfcHJpdi0+dnJhbV9zaXplKQpAQCAtNDE1LDYgKzI2MiwxNSBAQAogCXJldHVybiAtRU5PTUVNOwogfQogCitib29sCitub3V2ZWF1X21lbV9mbGFnc192YWxpZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1MzIgdGlsZV9mbGFncykKK3sKKwlpZiAoISh0aWxlX2ZsYWdzICYgTk9VVkVBVV9HRU1fVElMRV9MQVlPVVRfTUFTSykpCisJCXJldHVybiB0cnVlOworCisJcmV0dXJuIGZhbHNlOworfQorCiAjaWYgX19PU19IQVNfQUdQCiBzdGF0aWMgdW5zaWduZWQgbG9uZwogZ2V0X2FncF9tb2RlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcgbW9kZSkKQEAgLTU0NywxMCArNDAzLDYgQEAKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCi0JcmV0ID0gbm91dmVhdV9tZW1fZGV0ZWN0KGRldik7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQogCWRldl9wcml2LT5mYl9waHlzID0gcGNpX3Jlc291cmNlX3N0YXJ0KGRldi0+cGRldiwgMSk7CiAKIAlyZXQgPSBub3V2ZWF1X3R0bV9nbG9iYWxfaW5pdChkZXZfcHJpdik7CkBAIC01NjYsMTMgKzQxOCw2IEBACiAJCXJldHVybiByZXQ7CiAJfQogCi0JZGV2X3ByaXYtPmZiX2F2YWlsYWJsZV9zaXplID0gZGV2X3ByaXYtPnZyYW1fc2l6ZTsKLQlkZXZfcHJpdi0+ZmJfbWFwcGFibGVfcGFnZXMgPSBkZXZfcHJpdi0+ZmJfYXZhaWxhYmxlX3NpemU7Ci0JaWYgKGRldl9wcml2LT5mYl9tYXBwYWJsZV9wYWdlcyA+IHBjaV9yZXNvdXJjZV9sZW4oZGV2LT5wZGV2LCAxKSkKLQkJZGV2X3ByaXYtPmZiX21hcHBhYmxlX3BhZ2VzID0KLQkJCXBjaV9yZXNvdXJjZV9sZW4oZGV2LT5wZGV2LCAxKTsKLQlkZXZfcHJpdi0+ZmJfbWFwcGFibGVfcGFnZXMgPj49IFBBR0VfU0hJRlQ7Ci0KIAkvKiByZXNlcnZlIHNwYWNlIGF0IGVuZCBvZiBWUkFNIGZvciBQUkFNSU4gKi8KIAlpZiAoZGV2X3ByaXYtPmNoaXBzZXQgPT0gMHg0MCB8fCBkZXZfcHJpdi0+Y2hpcHNldCA9PSAweDQ3IHx8CiAJICAgIGRldl9wcml2LT5jaGlwc2V0ID09IDB4NDkgfHwgZGV2X3ByaXYtPmNoaXBzZXQgPT0gMHg0YikKQEAgLTU4Myw2ICs0MjgsMjIgQEAKIAllbHNlCiAJCWRldl9wcml2LT5yYW1pbl9yc3ZkX3ZyYW0gPSAoNTEyICogMTAyNCk7CiAKKwlyZXQgPSBkZXZfcHJpdi0+ZW5naW5lLnZyYW0uaW5pdChkZXYpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlOVl9JTkZPKGRldiwgIkRldGVjdGVkICVkTWlCIFZSQU1cbiIsIChpbnQpKGRldl9wcml2LT52cmFtX3NpemUgPj4gMjApKTsKKwlpZiAoZGV2X3ByaXYtPnZyYW1fc3lzX2Jhc2UpIHsKKwkJTlZfSU5GTyhkZXYsICJTdG9sZW4gc3lzdGVtIG1lbW9yeSBhdDogMHglMDEwbGx4XG4iLAorCQkJZGV2X3ByaXYtPnZyYW1fc3lzX2Jhc2UpOworCX0KKworCWRldl9wcml2LT5mYl9hdmFpbGFibGVfc2l6ZSA9IGRldl9wcml2LT52cmFtX3NpemU7CisJZGV2X3ByaXYtPmZiX21hcHBhYmxlX3BhZ2VzID0gZGV2X3ByaXYtPmZiX2F2YWlsYWJsZV9zaXplOworCWlmIChkZXZfcHJpdi0+ZmJfbWFwcGFibGVfcGFnZXMgPiBwY2lfcmVzb3VyY2VfbGVuKGRldi0+cGRldiwgMSkpCisJCWRldl9wcml2LT5mYl9tYXBwYWJsZV9wYWdlcyA9IHBjaV9yZXNvdXJjZV9sZW4oZGV2LT5wZGV2LCAxKTsKKwlkZXZfcHJpdi0+ZmJfbWFwcGFibGVfcGFnZXMgPj49IFBBR0VfU0hJRlQ7CisKIAlkZXZfcHJpdi0+ZmJfYXZhaWxhYmxlX3NpemUgLT0gZGV2X3ByaXYtPnJhbWluX3JzdmRfdnJhbTsKIAlkZXZfcHJpdi0+ZmJfYXBlcl9mcmVlID0gZGV2X3ByaXYtPmZiX2F2YWlsYWJsZV9zaXplOwogCkBAIC03OTksMyArNjYwLDExOCBAQAogCiAJa2ZyZWUobWVtLT50aW1pbmcpOwogfQorCitzdGF0aWMgaW50Citub3V2ZWF1X3ZyYW1fbWFuYWdlcl9pbml0KHN0cnVjdCB0dG1fbWVtX3R5cGVfbWFuYWdlciAqbWFuLCB1bnNpZ25lZCBsb25nIHBfc2l6ZSkKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBub3V2ZWF1X2JkZXYobWFuLT5iZGV2KTsKKwlzdHJ1Y3Qgbm91dmVhdV9tbSAqbW07CisJdTMyIGJfc2l6ZTsKKwlpbnQgcmV0OworCisJcF9zaXplID0gKHBfc2l6ZSA8PCBQQUdFX1NISUZUKSA+PiAxMjsKKwliX3NpemUgPSBkZXZfcHJpdi0+dnJhbV9yYmxvY2tfc2l6ZSA+PiAxMjsKKworCXJldCA9IG5vdXZlYXVfbW1faW5pdCgmbW0sIDAsIHBfc2l6ZSwgYl9zaXplKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJbWFuLT5wcml2ID0gbW07CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK25vdXZlYXVfdnJhbV9tYW5hZ2VyX2Zpbmkoc3RydWN0IHR0bV9tZW1fdHlwZV9tYW5hZ2VyICptYW4pCit7CisJc3RydWN0IG5vdXZlYXVfbW0gKm1tID0gbWFuLT5wcml2OworCWludCByZXQ7CisKKwlyZXQgPSBub3V2ZWF1X21tX2ZpbmkoJm1tKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJbWFuLT5wcml2ID0gTlVMTDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQKK25vdXZlYXVfdnJhbV9tYW5hZ2VyX2RlbChzdHJ1Y3QgdHRtX21lbV90eXBlX21hbmFnZXIgKm1hbiwKKwkJCSBzdHJ1Y3QgdHRtX21lbV9yZWcgKm1lbSkKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBub3V2ZWF1X2JkZXYobWFuLT5iZGV2KTsKKwlzdHJ1Y3Qgbm91dmVhdV92cmFtX2VuZ2luZSAqdnJhbSA9ICZkZXZfcHJpdi0+ZW5naW5lLnZyYW07CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGRldl9wcml2LT5kZXY7CisKKwl2cmFtLT5wdXQoZGV2LCAoc3RydWN0IG5vdXZlYXVfdnJhbSAqKikmbWVtLT5tbV9ub2RlKTsKK30KKworc3RhdGljIGludAorbm91dmVhdV92cmFtX21hbmFnZXJfbmV3KHN0cnVjdCB0dG1fbWVtX3R5cGVfbWFuYWdlciAqbWFuLAorCQkJIHN0cnVjdCB0dG1fYnVmZmVyX29iamVjdCAqYm8sCisJCQkgc3RydWN0IHR0bV9wbGFjZW1lbnQgKnBsYWNlbWVudCwKKwkJCSBzdHJ1Y3QgdHRtX21lbV9yZWcgKm1lbSkKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBub3V2ZWF1X2JkZXYobWFuLT5iZGV2KTsKKwlzdHJ1Y3Qgbm91dmVhdV92cmFtX2VuZ2luZSAqdnJhbSA9ICZkZXZfcHJpdi0+ZW5naW5lLnZyYW07CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGRldl9wcml2LT5kZXY7CisJc3RydWN0IG5vdXZlYXVfYm8gKm52Ym8gPSBub3V2ZWF1X2JvKGJvKTsKKwlzdHJ1Y3Qgbm91dmVhdV92cmFtICpub2RlOworCXUzMiBzaXplX25jID0gMDsKKwlpbnQgcmV0OworCisJaWYgKG52Ym8tPnRpbGVfZmxhZ3MgJiBOT1VWRUFVX0dFTV9USUxFX05PTkNPTlRJRykKKwkJc2l6ZV9uYyA9IDEgPDwgbnZiby0+dm1hLm5vZGUtPnR5cGU7CisKKwlyZXQgPSB2cmFtLT5nZXQoZGV2LCBtZW0tPm51bV9wYWdlcyA8PCBQQUdFX1NISUZULAorCQkJbWVtLT5wYWdlX2FsaWdubWVudCA8PCBQQUdFX1NISUZULCBzaXplX25jLAorCQkJKG52Ym8tPnRpbGVfZmxhZ3MgPj4gOCkgJiAweGZmLCAmbm9kZSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCW5vZGUtPnBhZ2Vfc2hpZnQgPSAxMjsKKwlpZiAobnZiby0+dm1hLm5vZGUpCisJCW5vZGUtPnBhZ2Vfc2hpZnQgPSBudmJvLT52bWEubm9kZS0+dHlwZTsKKworCW1lbS0+bW1fbm9kZSA9IG5vZGU7CisJbWVtLT5zdGFydCAgID0gbm9kZS0+b2Zmc2V0ID4+IFBBR0VfU0hJRlQ7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQKK25vdXZlYXVfdnJhbV9tYW5hZ2VyX2RlYnVnKHN0cnVjdCB0dG1fbWVtX3R5cGVfbWFuYWdlciAqbWFuLCBjb25zdCBjaGFyICpwcmVmaXgpCit7CisJc3RydWN0IG5vdXZlYXVfbW0gKm1tID0gbWFuLT5wcml2OworCXN0cnVjdCBub3V2ZWF1X21tX25vZGUgKnI7CisJdTY0IHRvdGFsID0gMCwgdHRvdGFsWzNdID0ge30sIHR1c2VkWzNdID0ge30sIHRmcmVlWzNdID0ge307CisJaW50IGk7CisKKwltdXRleF9sb2NrKCZtbS0+bXV0ZXgpOworCWxpc3RfZm9yX2VhY2hfZW50cnkociwgJm1tLT5ub2RlcywgbmxfZW50cnkpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzICVzLSVkOiAweCUwMTBsbHggMHglMDEwbGx4XG4iLAorCQkgICAgICAgcHJlZml4LCByLT5mcmVlID8gImZyZWUiIDogInVzZWQiLCByLT50eXBlLAorCQkgICAgICAgKCh1NjQpci0+b2Zmc2V0IDw8IDEyKSwKKwkJICAgICAgICgoKHU2NClyLT5vZmZzZXQgKyByLT5sZW5ndGgpIDw8IDEyKSk7CisJCXRvdGFsICs9IHItPmxlbmd0aDsKKwkJdHRvdGFsW3ItPnR5cGVdICs9IHItPmxlbmd0aDsKKwkJaWYgKHItPmZyZWUpCisJCQl0ZnJlZVtyLT50eXBlXSArPSByLT5sZW5ndGg7CisJCWVsc2UKKwkJCXR1c2VkW3ItPnR5cGVdICs9IHItPmxlbmd0aDsKKwl9CisJbXV0ZXhfdW5sb2NrKCZtbS0+bXV0ZXgpOworCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzICB0b3RhbDogMHglMDEwbGx4XG4iLCBwcmVmaXgsIHRvdGFsIDw8IDEyKTsKKwlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICIlcyB0eXBlICVkOiAweCUwMTBsbHgsICIKKwkJCQkgICJ1c2VkIDB4JTAxMGxseCwgZnJlZSAweCUwMTBsbHhcbiIsIHByZWZpeCwKKwkJICAgICAgIGksIHR0b3RhbFtpXSA8PCAxMiwgdHVzZWRbaV0gPDwgMTIsIHRmcmVlW2ldIDw8IDEyKTsKKwl9Cit9CisKK2NvbnN0IHN0cnVjdCB0dG1fbWVtX3R5cGVfbWFuYWdlcl9mdW5jIG5vdXZlYXVfdnJhbV9tYW5hZ2VyID0geworCW5vdXZlYXVfdnJhbV9tYW5hZ2VyX2luaXQsCisJbm91dmVhdV92cmFtX21hbmFnZXJfZmluaSwKKwlub3V2ZWF1X3ZyYW1fbWFuYWdlcl9uZXcsCisJbm91dmVhdV92cmFtX21hbmFnZXJfZGVsLAorCW5vdXZlYXVfdnJhbV9tYW5hZ2VyX2RlYnVnCit9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9tbS5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9tbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkYmIxMWUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X21tLmMKQEAgLTAsMCArMSwyNzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxMCBSZWQgSGF0IEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBDT1BZUklHSFQgSE9MREVSKFMpIE9SIEFVVEhPUihTKSBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBBdXRob3JzOiBCZW4gU2tlZ2dzCisgKi8KKworI2luY2x1ZGUgImRybVAuaCIKKyNpbmNsdWRlICJub3V2ZWF1X2Rydi5oIgorI2luY2x1ZGUgIm5vdXZlYXVfbW0uaCIKKworc3RhdGljIGlubGluZSB2b2lkCityZWdpb25fcHV0KHN0cnVjdCBub3V2ZWF1X21tICpybW0sIHN0cnVjdCBub3V2ZWF1X21tX25vZGUgKmEpCit7CisJbGlzdF9kZWwoJmEtPm5sX2VudHJ5KTsKKwlsaXN0X2RlbCgmYS0+ZmxfZW50cnkpOworCWtmcmVlKGEpOworfQorCitzdGF0aWMgc3RydWN0IG5vdXZlYXVfbW1fbm9kZSAqCityZWdpb25fc3BsaXQoc3RydWN0IG5vdXZlYXVfbW0gKnJtbSwgc3RydWN0IG5vdXZlYXVfbW1fbm9kZSAqYSwgdTMyIHNpemUpCit7CisJc3RydWN0IG5vdXZlYXVfbW1fbm9kZSAqYjsKKworCWlmIChhLT5sZW5ndGggPT0gc2l6ZSkKKwkJcmV0dXJuIGE7CisKKwliID0ga21hbGxvYyhzaXplb2YoKmIpLCBHRlBfS0VSTkVMKTsKKwlpZiAodW5saWtlbHkoYiA9PSBOVUxMKSkKKwkJcmV0dXJuIE5VTEw7CisKKwliLT5vZmZzZXQgPSBhLT5vZmZzZXQ7CisJYi0+bGVuZ3RoID0gc2l6ZTsKKwliLT5mcmVlICAgPSBhLT5mcmVlOworCWItPnR5cGUgICA9IGEtPnR5cGU7CisJYS0+b2Zmc2V0ICs9IHNpemU7CisJYS0+bGVuZ3RoIC09IHNpemU7CisJbGlzdF9hZGRfdGFpbCgmYi0+bmxfZW50cnksICZhLT5ubF9lbnRyeSk7CisJaWYgKGItPmZyZWUpCisJCWxpc3RfYWRkX3RhaWwoJmItPmZsX2VudHJ5LCAmYS0+ZmxfZW50cnkpOworCXJldHVybiBiOworfQorCitzdGF0aWMgc3RydWN0IG5vdXZlYXVfbW1fbm9kZSAqCitub3V2ZWF1X21tX21lcmdlKHN0cnVjdCBub3V2ZWF1X21tICpybW0sIHN0cnVjdCBub3V2ZWF1X21tX25vZGUgKnRoaXMpCit7CisJc3RydWN0IG5vdXZlYXVfbW1fbm9kZSAqcHJldiwgKm5leHQ7CisKKwkvKiB0cnkgdG8gbWVyZ2Ugd2l0aCBmcmVlIGFkamFjZW50IGVudHJpZXMgb2Ygc2FtZSB0eXBlICovCisJcHJldiA9IGxpc3RfZW50cnkodGhpcy0+bmxfZW50cnkucHJldiwgc3RydWN0IG5vdXZlYXVfbW1fbm9kZSwgbmxfZW50cnkpOworCWlmICh0aGlzLT5ubF9lbnRyeS5wcmV2ICE9ICZybW0tPm5vZGVzKSB7CisJCWlmIChwcmV2LT5mcmVlICYmIHByZXYtPnR5cGUgPT0gdGhpcy0+dHlwZSkgeworCQkJcHJldi0+bGVuZ3RoICs9IHRoaXMtPmxlbmd0aDsKKwkJCXJlZ2lvbl9wdXQocm1tLCB0aGlzKTsKKwkJCXRoaXMgPSBwcmV2OworCQl9CisJfQorCisJbmV4dCA9IGxpc3RfZW50cnkodGhpcy0+bmxfZW50cnkubmV4dCwgc3RydWN0IG5vdXZlYXVfbW1fbm9kZSwgbmxfZW50cnkpOworCWlmICh0aGlzLT5ubF9lbnRyeS5uZXh0ICE9ICZybW0tPm5vZGVzKSB7CisJCWlmIChuZXh0LT5mcmVlICYmIG5leHQtPnR5cGUgPT0gdGhpcy0+dHlwZSkgeworCQkJbmV4dC0+b2Zmc2V0ICA9IHRoaXMtPm9mZnNldDsKKwkJCW5leHQtPmxlbmd0aCArPSB0aGlzLT5sZW5ndGg7CisJCQlyZWdpb25fcHV0KHJtbSwgdGhpcyk7CisJCQl0aGlzID0gbmV4dDsKKwkJfQorCX0KKworCXJldHVybiB0aGlzOworfQorCit2b2lkCitub3V2ZWF1X21tX3B1dChzdHJ1Y3Qgbm91dmVhdV9tbSAqcm1tLCBzdHJ1Y3Qgbm91dmVhdV9tbV9ub2RlICp0aGlzKQoreworCXUzMiBibG9ja19zLCBibG9ja19sOworCisJdGhpcy0+ZnJlZSA9IHRydWU7CisJbGlzdF9hZGQoJnRoaXMtPmZsX2VudHJ5LCAmcm1tLT5mcmVlKTsKKwl0aGlzID0gbm91dmVhdV9tbV9tZXJnZShybW0sIHRoaXMpOworCisJLyogYW55IGVudGlyZWx5IGZyZWUgYmxvY2tzIG5vdz8gIHdlJ2xsIHdhbnQgdG8gcmVtb3ZlIHR5cGluZworCSAqIG9uIHRoZW0gbm93IHNvIHRoZXkgY2FuIGJlIHVzZSBmb3IgYW55IG1lbW9yeSBhbGxvY2F0aW9uCisJICovCisJYmxvY2tfcyA9IHJvdW5kdXAodGhpcy0+b2Zmc2V0LCBybW0tPmJsb2NrX3NpemUpOworCWlmIChibG9ja19zICsgcm1tLT5ibG9ja19zaXplID4gdGhpcy0+b2Zmc2V0ICsgdGhpcy0+bGVuZ3RoKQorCQlyZXR1cm47CisKKwkvKiBzcGxpdCBvZmYgYW55IHN0aWxsLXR5cGVkIHJlZ2lvbiBhdCB0aGUgc3RhcnQgKi8KKwlpZiAoYmxvY2tfcyAhPSB0aGlzLT5vZmZzZXQpIHsKKwkJaWYgKCFyZWdpb25fc3BsaXQocm1tLCB0aGlzLCBibG9ja19zIC0gdGhpcy0+b2Zmc2V0KSkKKwkJCXJldHVybjsKKwl9CisKKwkvKiBzcGxpdCBvZmYgdGhlIHNvb24tdG8tYmUtdW50eXBlZCBibG9jayhzKSAqLworCWJsb2NrX2wgPSByb3VuZGRvd24odGhpcy0+bGVuZ3RoLCBybW0tPmJsb2NrX3NpemUpOworCWlmIChibG9ja19sICE9IHRoaXMtPmxlbmd0aCkgeworCQl0aGlzID0gcmVnaW9uX3NwbGl0KHJtbSwgdGhpcywgYmxvY2tfbCk7CisJCWlmICghdGhpcykKKwkJCXJldHVybjsKKwl9CisKKwkvKiBtYXJrIGFzIGhhdmluZyBubyB0eXBlLCBhbmQgcmV0cnkgbWVyZ2Ugd2l0aCBhbnkgYWRqYWNlbnQKKwkgKiB1bnR5cGVkIGJsb2NrcworCSAqLworCXRoaXMtPnR5cGUgPSAwOworCW5vdXZlYXVfbW1fbWVyZ2Uocm1tLCB0aGlzKTsKK30KKworaW50Citub3V2ZWF1X21tX2dldChzdHJ1Y3Qgbm91dmVhdV9tbSAqcm1tLCBpbnQgdHlwZSwgdTMyIHNpemUsIHUzMiBzaXplX25jLAorCSAgICAgICB1MzIgYWxpZ24sIHN0cnVjdCBub3V2ZWF1X21tX25vZGUgKipwbm9kZSkKK3sKKwlzdHJ1Y3Qgbm91dmVhdV9tbV9ub2RlICp0aGlzLCAqdG1wLCAqbmV4dDsKKwl1MzIgc3BsaXRvZmYsIGF2YWlsLCBhbGxvYzsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSh0aGlzLCB0bXAsICZybW0tPmZyZWUsIGZsX2VudHJ5KSB7CisJCW5leHQgPSBsaXN0X2VudHJ5KHRoaXMtPm5sX2VudHJ5Lm5leHQsIHN0cnVjdCBub3V2ZWF1X21tX25vZGUsIG5sX2VudHJ5KTsKKwkJaWYgKHRoaXMtPm5sX2VudHJ5Lm5leHQgPT0gJnJtbS0+bm9kZXMpCisJCQluZXh0ID0gTlVMTDsKKworCQkvKiBza2lwIHdyb25nbHkgdHlwZWQgYmxvY2tzICovCisJCWlmICh0aGlzLT50eXBlICYmIHRoaXMtPnR5cGUgIT0gdHlwZSkKKwkJCWNvbnRpbnVlOworCisJCS8qIGFjY291bnQgZm9yIGFsaWdubWVudCAqLworCQlzcGxpdG9mZiA9IHRoaXMtPm9mZnNldCAmIChhbGlnbiAtIDEpOworCQlpZiAoc3BsaXRvZmYpCisJCQlzcGxpdG9mZiA9IGFsaWduIC0gc3BsaXRvZmY7CisKKwkJaWYgKHRoaXMtPmxlbmd0aCA8PSBzcGxpdG9mZikKKwkJCWNvbnRpbnVlOworCisJCS8qIGRldGVybWluZSB0b3RhbCBtZW1vcnkgYXZhaWxhYmxlIGZyb20gdGhpcywgYW5kCisJCSAqIHRoZSBuZXh0IGJsb2NrIChpZiBhcHByb3ByaWF0ZSkKKwkJICovCisJCWF2YWlsID0gdGhpcy0+bGVuZ3RoOworCQlpZiAobmV4dCAmJiBuZXh0LT5mcmVlICYmICghbmV4dC0+dHlwZSB8fCBuZXh0LT50eXBlID09IHR5cGUpKQorCQkJYXZhaWwgKz0gbmV4dC0+bGVuZ3RoOworCisJCWF2YWlsIC09IHNwbGl0b2ZmOworCisJCS8qIGRldGVybWluZSBhbGxvY2F0aW9uIHNpemUgKi8KKwkJaWYgKHNpemVfbmMpIHsKKwkJCWFsbG9jID0gbWluKGF2YWlsLCBzaXplKTsKKwkJCWFsbG9jID0gcm91bmRkb3duKGFsbG9jLCBzaXplX25jKTsKKwkJCWlmIChhbGxvYyA9PSAwKQorCQkJCWNvbnRpbnVlOworCQl9IGVsc2UgeworCQkJYWxsb2MgPSBzaXplOworCQkJaWYgKGF2YWlsIDwgYWxsb2MpCisJCQkJY29udGludWU7CisJCX0KKworCQkvKiB1bnR5cGVkIGJsb2NrLCBzcGxpdCBvZmYgYSBjaHVuayB0aGF0J3MgYSBtdWx0aXBsZQorCQkgKiBvZiBibG9ja19zaXplIGFuZCB0eXBlIGl0CisJCSAqLworCQlpZiAoIXRoaXMtPnR5cGUpIHsKKwkJCXUzMiBibG9jayA9IHJvdW5kdXAoYWxsb2MgKyBzcGxpdG9mZiwgcm1tLT5ibG9ja19zaXplKTsKKwkJCWlmICh0aGlzLT5sZW5ndGggPCBibG9jaykKKwkJCQljb250aW51ZTsKKworCQkJdGhpcyA9IHJlZ2lvbl9zcGxpdChybW0sIHRoaXMsIGJsb2NrKTsKKwkJCWlmICghdGhpcykKKwkJCQlyZXR1cm4gLUVOT01FTTsKKworCQkJdGhpcy0+dHlwZSA9IHR5cGU7CisJCX0KKworCQkvKiBzdGVhbGluZyBtZW1vcnkgZnJvbSBhZGphY2VudCBibG9jayAqLworCQlpZiAoYWxsb2MgPiB0aGlzLT5sZW5ndGgpIHsKKwkJCXUzMiBhbW91bnQgPSBhbGxvYyAtICh0aGlzLT5sZW5ndGggLSBzcGxpdG9mZik7CisKKwkJCWlmICghbmV4dC0+dHlwZSkgeworCQkJCWFtb3VudCA9IHJvdW5kdXAoYW1vdW50LCBybW0tPmJsb2NrX3NpemUpOworCisJCQkJbmV4dCA9IHJlZ2lvbl9zcGxpdChybW0sIG5leHQsIGFtb3VudCk7CisJCQkJaWYgKCFuZXh0KQorCQkJCQlyZXR1cm4gLUVOT01FTTsKKworCQkJCW5leHQtPnR5cGUgPSB0eXBlOworCQkJfQorCisJCQl0aGlzLT5sZW5ndGggKz0gYW1vdW50OworCQkJbmV4dC0+b2Zmc2V0ICs9IGFtb3VudDsKKwkJCW5leHQtPmxlbmd0aCAtPSBhbW91bnQ7CisJCQlpZiAoIW5leHQtPmxlbmd0aCkgeworCQkJCWxpc3RfZGVsKCZuZXh0LT5ubF9lbnRyeSk7CisJCQkJbGlzdF9kZWwoJm5leHQtPmZsX2VudHJ5KTsKKwkJCQlrZnJlZShuZXh0KTsKKwkJCX0KKwkJfQorCisJCWlmIChzcGxpdG9mZikgeworCQkJaWYgKCFyZWdpb25fc3BsaXQocm1tLCB0aGlzLCBzcGxpdG9mZikpCisJCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKworCQl0aGlzID0gcmVnaW9uX3NwbGl0KHJtbSwgdGhpcywgYWxsb2MpOworCQlpZiAodGhpcyA9PSBOVUxMKQorCQkJcmV0dXJuIC1FTk9NRU07CisKKwkJdGhpcy0+ZnJlZSA9IGZhbHNlOworCQlsaXN0X2RlbCgmdGhpcy0+ZmxfZW50cnkpOworCQkqcG5vZGUgPSB0aGlzOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gLUVOT01FTTsKK30KKworaW50Citub3V2ZWF1X21tX2luaXQoc3RydWN0IG5vdXZlYXVfbW0gKipwcm1tLCB1MzIgb2Zmc2V0LCB1MzIgbGVuZ3RoLCB1MzIgYmxvY2spCit7CisJc3RydWN0IG5vdXZlYXVfbW0gKnJtbTsKKwlzdHJ1Y3Qgbm91dmVhdV9tbV9ub2RlICpoZWFwOworCisJaGVhcCA9IGt6YWxsb2Moc2l6ZW9mKCpoZWFwKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFoZWFwKQorCQlyZXR1cm4gLUVOT01FTTsKKwloZWFwLT5mcmVlID0gdHJ1ZTsKKwloZWFwLT5vZmZzZXQgPSByb3VuZHVwKG9mZnNldCwgYmxvY2spOworCWhlYXAtPmxlbmd0aCA9IHJvdW5kZG93bihvZmZzZXQgKyBsZW5ndGgsIGJsb2NrKSAtIGhlYXAtPm9mZnNldDsKKworCXJtbSA9IGt6YWxsb2Moc2l6ZW9mKCpybW0pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXJtbSkgeworCQlrZnJlZShoZWFwKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCXJtbS0+YmxvY2tfc2l6ZSA9IGJsb2NrOworCW11dGV4X2luaXQoJnJtbS0+bXV0ZXgpOworCUlOSVRfTElTVF9IRUFEKCZybW0tPm5vZGVzKTsKKwlJTklUX0xJU1RfSEVBRCgmcm1tLT5mcmVlKTsKKwlsaXN0X2FkZCgmaGVhcC0+bmxfZW50cnksICZybW0tPm5vZGVzKTsKKwlsaXN0X2FkZCgmaGVhcC0+ZmxfZW50cnksICZybW0tPmZyZWUpOworCisJKnBybW0gPSBybW07CisJcmV0dXJuIDA7Cit9CisKK2ludAorbm91dmVhdV9tbV9maW5pKHN0cnVjdCBub3V2ZWF1X21tICoqcHJtbSkKK3sKKwlzdHJ1Y3Qgbm91dmVhdV9tbSAqcm1tID0gKnBybW07CisJc3RydWN0IG5vdXZlYXVfbW1fbm9kZSAqaGVhcCA9CisJCWxpc3RfZmlyc3RfZW50cnkoJnJtbS0+bm9kZXMsIHN0cnVjdCBub3V2ZWF1X21tX25vZGUsIG5sX2VudHJ5KTsKKworCWlmICghbGlzdF9pc19zaW5ndWxhcigmcm1tLT5ub2RlcykpCisJCXJldHVybiAtRUJVU1k7CisKKwlrZnJlZShoZWFwKTsKKwlrZnJlZShybW0pOworCSpwcm1tID0gTlVMTDsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfbW0uaCBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfbW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjM4NDQ5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9tbS5oCkBAIC0wLDAgKzEsNjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxMCBSZWQgSGF0IEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBDT1BZUklHSFQgSE9MREVSKFMpIE9SIEFVVEhPUihTKSBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBBdXRob3JzOiBCZW4gU2tlZ2dzCisgKi8KKworI2lmbmRlZiBfX05PVVZFQVVfUkVHSU9OX0hfXworI2RlZmluZSBfX05PVVZFQVVfUkVHSU9OX0hfXworCitzdHJ1Y3Qgbm91dmVhdV9tbV9ub2RlIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIG5sX2VudHJ5OworCXN0cnVjdCBsaXN0X2hlYWQgZmxfZW50cnk7CisJc3RydWN0IGxpc3RfaGVhZCBybF9lbnRyeTsKKworCWJvb2wgZnJlZTsKKwlpbnQgIHR5cGU7CisKKwl1MzIgb2Zmc2V0OworCXUzMiBsZW5ndGg7Cit9OworCitzdHJ1Y3Qgbm91dmVhdV9tbSB7CisJc3RydWN0IGxpc3RfaGVhZCBub2RlczsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGZyZWU7CisKKwlzdHJ1Y3QgbXV0ZXggbXV0ZXg7CisKKwl1MzIgYmxvY2tfc2l6ZTsKK307CisKK2ludCAgbm91dmVhdV9tbV9pbml0KHN0cnVjdCBub3V2ZWF1X21tICoqLCB1MzIgb2Zmc2V0LCB1MzIgbGVuZ3RoLCB1MzIgYmxvY2spOworaW50ICBub3V2ZWF1X21tX2Zpbmkoc3RydWN0IG5vdXZlYXVfbW0gKiopOworaW50ICBub3V2ZWF1X21tX3ByZShzdHJ1Y3Qgbm91dmVhdV9tbSAqKTsKK2ludCAgbm91dmVhdV9tbV9nZXQoc3RydWN0IG5vdXZlYXVfbW0gKiwgaW50IHR5cGUsIHUzMiBzaXplLCB1MzIgc2l6ZV9uYywKKwkJICAgIHUzMiBhbGlnbiwgc3RydWN0IG5vdXZlYXVfbW1fbm9kZSAqKik7Cit2b2lkIG5vdXZlYXVfbW1fcHV0KHN0cnVjdCBub3V2ZWF1X21tICosIHN0cnVjdCBub3V2ZWF1X21tX25vZGUgKik7CisKK2ludCAgbnY1MF92cmFtX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKik7CitpbnQgIG52NTBfdnJhbV9uZXcoc3RydWN0IGRybV9kZXZpY2UgKiwgdTY0IHNpemUsIHUzMiBhbGlnbiwgdTMyIHNpemVfbmMsCisJCSAgICB1MzIgbWVtdHlwZSwgc3RydWN0IG5vdXZlYXVfdnJhbSAqKik7Cit2b2lkIG52NTBfdnJhbV9kZWwoc3RydWN0IGRybV9kZXZpY2UgKiwgc3RydWN0IG5vdXZlYXVfdnJhbSAqKik7Citib29sIG52NTBfdnJhbV9mbGFnc192YWxpZChzdHJ1Y3QgZHJtX2RldmljZSAqLCB1MzIgdGlsZV9mbGFncyk7CisKK2ludCAgbnZjMF92cmFtX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKik7CitpbnQgIG52YzBfdnJhbV9uZXcoc3RydWN0IGRybV9kZXZpY2UgKiwgdTY0IHNpemUsIHUzMiBhbGlnbiwgdTMyIG5jbWluLAorCQkgICAgdTMyIG1lbXR5cGUsIHN0cnVjdCBub3V2ZWF1X3ZyYW0gKiopOworYm9vbCBudmMwX3ZyYW1fZmxhZ3NfdmFsaWQoc3RydWN0IGRybV9kZXZpY2UgKiwgdTMyIHRpbGVfZmxhZ3MpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfbm90aWZpZXIuYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfbm90aWZpZXIuYwppbmRleCAyY2M1OWY4Li5mZTI5ZDYwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X25vdGlmaWVyLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9ub3RpZmllci5jCkBAIC05OSw3ICs5OSw2IEBACiAJCSAgICAgICBpbnQgc2l6ZSwgdWludDMyX3QgKmJfb2Zmc2V0KQogewogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjaGFuLT5kZXY7Ci0Jc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKm5vYmogPSBOVUxMOwogCXN0cnVjdCBkcm1fbW1fbm9kZSAqbWVtOwogCXVpbnQzMl90IG9mZnNldDsKQEAgLTExMywzMSArMTEyLDE1IEBACiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAotCW9mZnNldCA9IGNoYW4tPm5vdGlmaWVyX2JvLT5iby5tZW0uc3RhcnQgPDwgUEFHRV9TSElGVDsKLQlpZiAoY2hhbi0+bm90aWZpZXJfYm8tPmJvLm1lbS5tZW1fdHlwZSA9PSBUVE1fUExfVlJBTSkgewotCQl0YXJnZXQgPSBOVl9ETUFfVEFSR0VUX1ZJRE1FTTsKLQl9IGVsc2UKLQlpZiAoY2hhbi0+bm90aWZpZXJfYm8tPmJvLm1lbS5tZW1fdHlwZSA9PSBUVE1fUExfVFQpIHsKLQkJaWYgKGRldl9wcml2LT5nYXJ0X2luZm8udHlwZSA9PSBOT1VWRUFVX0dBUlRfU0dETUEgJiYKLQkJICAgIGRldl9wcml2LT5jYXJkX3R5cGUgPCBOVl81MCkgewotCQkJcmV0ID0gbm91dmVhdV9zZ2RtYV9nZXRfcGFnZShkZXYsIG9mZnNldCwgJm9mZnNldCk7Ci0JCQlpZiAocmV0KQotCQkJCXJldHVybiByZXQ7Ci0JCQl0YXJnZXQgPSBOVl9ETUFfVEFSR0VUX1BDSTsKLQkJfSBlbHNlIHsKLQkJCXRhcmdldCA9IE5WX0RNQV9UQVJHRVRfQUdQOwotCQkJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPj0gTlZfNTApCi0JCQkJb2Zmc2V0ICs9IGRldl9wcml2LT52bV9nYXJ0X2Jhc2U7Ci0JCX0KLQl9IGVsc2UgewotCQlOVl9FUlJPUihkZXYsICJCYWQgRE1BIHRhcmdldCwgbWVtX3R5cGUgJWQhXG4iLAotCQkJIGNoYW4tPm5vdGlmaWVyX2JvLT5iby5tZW0ubWVtX3R5cGUpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9CisJaWYgKGNoYW4tPm5vdGlmaWVyX2JvLT5iby5tZW0ubWVtX3R5cGUgPT0gVFRNX1BMX1ZSQU0pCisJCXRhcmdldCA9IE5WX01FTV9UQVJHRVRfVlJBTTsKKwllbHNlCisJCXRhcmdldCA9IE5WX01FTV9UQVJHRVRfR0FSVDsKKwlvZmZzZXQgID0gY2hhbi0+bm90aWZpZXJfYm8tPmJvLm1lbS5zdGFydCA8PCBQQUdFX1NISUZUOwogCW9mZnNldCArPSBtZW0tPnN0YXJ0OwogCiAJcmV0ID0gbm91dmVhdV9ncHVvYmpfZG1hX25ldyhjaGFuLCBOVl9DTEFTU19ETUFfSU5fTUVNT1JZLCBvZmZzZXQsCi0JCQkJICAgICBtZW0tPnNpemUsIE5WX0RNQV9BQ0NFU1NfUlcsIHRhcmdldCwKKwkJCQkgICAgIG1lbS0+c2l6ZSwgTlZfTUVNX0FDQ0VTU19SVywgdGFyZ2V0LAogCQkJCSAgICAgJm5vYmopOwogCWlmIChyZXQpIHsKIAkJZHJtX21tX3B1dF9ibG9jayhtZW0pOwpAQCAtMTgxLDE1ICsxNjQsMjAgQEAKIG5vdXZlYXVfaW9jdGxfbm90aWZpZXJfYWxsb2Moc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdm9pZCAqZGF0YSwKIAkJCSAgICAgc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYpCiB7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlzdHJ1Y3QgZHJtX25vdXZlYXVfbm90aWZpZXJvYmpfYWxsb2MgKm5hID0gZGF0YTsKIAlzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuOwogCWludCByZXQ7CiAKLQlOT1VWRUFVX0dFVF9VU0VSX0NIQU5ORUxfV0lUSF9SRVRVUk4obmEtPmNoYW5uZWwsIGZpbGVfcHJpdiwgY2hhbik7CisJLyogY29tcGxldGVseSB1bm5lY2Vzc2FyeSBmb3IgdGhlc2UgY2hpcHNldHMuLi4gKi8KKwlpZiAodW5saWtlbHkoZGV2X3ByaXYtPmNhcmRfdHlwZSA+PSBOVl9DMCkpCisJCXJldHVybiAtRUlOVkFMOworCisJY2hhbiA9IG5vdXZlYXVfY2hhbm5lbF9nZXQoZGV2LCBmaWxlX3ByaXYsIG5hLT5jaGFubmVsKTsKKwlpZiAoSVNfRVJSKGNoYW4pKQorCQlyZXR1cm4gUFRSX0VSUihjaGFuKTsKIAogCXJldCA9IG5vdXZlYXVfbm90aWZpZXJfYWxsb2MoY2hhbiwgbmEtPmhhbmRsZSwgbmEtPnNpemUsICZuYS0+b2Zmc2V0KTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCi0JcmV0dXJuIDA7CisJbm91dmVhdV9jaGFubmVsX3B1dCgmY2hhbik7CisJcmV0dXJuIHJldDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfb2JqZWN0LmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X29iamVjdC5jCmluZGV4IGRkNTcyYWQuLjMwYjY1NDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfb2JqZWN0LmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9vYmplY3QuYwpAQCAtMzUsNiArMzUsMTAyIEBACiAjaW5jbHVkZSAibm91dmVhdV9kcnYuaCIKICNpbmNsdWRlICJub3V2ZWF1X2RybS5oIgogI2luY2x1ZGUgIm5vdXZlYXVfcmFtaHQuaCIKKyNpbmNsdWRlICJub3V2ZWF1X3ZtLmgiCisKK3N0cnVjdCBub3V2ZWF1X2dwdW9ial9tZXRob2QgeworCXN0cnVjdCBsaXN0X2hlYWQgaGVhZDsKKwl1MzIgbXRoZDsKKwlpbnQgKCpleGVjKShzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICosIHUzMiBjbGFzcywgdTMyIG10aGQsIHUzMiBkYXRhKTsKK307CisKK3N0cnVjdCBub3V2ZWF1X2dwdW9ial9jbGFzcyB7CisJc3RydWN0IGxpc3RfaGVhZCBoZWFkOworCXN0cnVjdCBsaXN0X2hlYWQgbWV0aG9kczsKKwl1MzIgaWQ7CisJdTMyIGVuZ2luZTsKK307CisKK2ludAorbm91dmVhdV9ncHVvYmpfY2xhc3NfbmV3KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHUzMiBjbGFzcywgdTMyIGVuZ2luZSkKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBub3V2ZWF1X2dwdW9ial9jbGFzcyAqb2M7CisKKwlvYyA9IGt6YWxsb2Moc2l6ZW9mKCpvYyksIEdGUF9LRVJORUwpOworCWlmICghb2MpCisJCXJldHVybiAtRU5PTUVNOworCisJSU5JVF9MSVNUX0hFQUQoJm9jLT5tZXRob2RzKTsKKwlvYy0+aWQgPSBjbGFzczsKKwlvYy0+ZW5naW5lID0gZW5naW5lOworCWxpc3RfYWRkKCZvYy0+aGVhZCwgJmRldl9wcml2LT5jbGFzc2VzKTsKKwlyZXR1cm4gMDsKK30KKworaW50Citub3V2ZWF1X2dwdW9ial9tdGhkX25ldyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1MzIgY2xhc3MsIHUzMiBtdGhkLAorCQkJaW50ICgqZXhlYykoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqLCB1MzIsIHUzMiwgdTMyKSkKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBub3V2ZWF1X2dwdW9ial9tZXRob2QgKm9tOworCXN0cnVjdCBub3V2ZWF1X2dwdW9ial9jbGFzcyAqb2M7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KG9jLCAmZGV2X3ByaXYtPmNsYXNzZXMsIGhlYWQpIHsKKwkJaWYgKG9jLT5pZCA9PSBjbGFzcykKKwkJCWdvdG8gZm91bmQ7CisJfQorCisJcmV0dXJuIC1FSU5WQUw7CisKK2ZvdW5kOgorCW9tID0ga3phbGxvYyhzaXplb2YoKm9tKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFvbSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlvbS0+bXRoZCA9IG10aGQ7CisJb20tPmV4ZWMgPSBleGVjOworCWxpc3RfYWRkKCZvbS0+aGVhZCwgJm9jLT5tZXRob2RzKTsKKwlyZXR1cm4gMDsKK30KKworaW50Citub3V2ZWF1X2dwdW9ial9tdGhkX2NhbGwoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbiwKKwkJCSB1MzIgY2xhc3MsIHUzMiBtdGhkLCB1MzIgZGF0YSkKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBjaGFuLT5kZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBub3V2ZWF1X2dwdW9ial9tZXRob2QgKm9tOworCXN0cnVjdCBub3V2ZWF1X2dwdW9ial9jbGFzcyAqb2M7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KG9jLCAmZGV2X3ByaXYtPmNsYXNzZXMsIGhlYWQpIHsKKwkJaWYgKG9jLT5pZCAhPSBjbGFzcykKKwkJCWNvbnRpbnVlOworCisJCWxpc3RfZm9yX2VhY2hfZW50cnkob20sICZvYy0+bWV0aG9kcywgaGVhZCkgeworCQkJaWYgKG9tLT5tdGhkID09IG10aGQpCisJCQkJcmV0dXJuIG9tLT5leGVjKGNoYW4sIGNsYXNzLCBtdGhkLCBkYXRhKTsKKwkJfQorCX0KKworCXJldHVybiAtRU5PRU5UOworfQorCitpbnQKK25vdXZlYXVfZ3B1b2JqX210aGRfY2FsbDIoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGNoaWQsCisJCQkgIHUzMiBjbGFzcywgdTMyIG10aGQsIHUzMiBkYXRhKQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbiA9IE5VTEw7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0ID0gLUVJTlZBTDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZfcHJpdi0+Y2hhbm5lbHMubG9jaywgZmxhZ3MpOworCWlmIChjaGlkID4gMCAmJiBjaGlkIDwgZGV2X3ByaXYtPmVuZ2luZS5maWZvLmNoYW5uZWxzKQorCQljaGFuID0gZGV2X3ByaXYtPmNoYW5uZWxzLnB0cltjaGlkXTsKKwlpZiAoY2hhbikKKwkJcmV0ID0gbm91dmVhdV9ncHVvYmpfbXRoZF9jYWxsKGNoYW4sIGNsYXNzLCBtdGhkLCBkYXRhKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZfcHJpdi0+Y2hhbm5lbHMubG9jaywgZmxhZ3MpOworCXJldHVybiByZXQ7Cit9CiAKIC8qIE5WaWRpYSB1c2VzIGNvbnRleHQgb2JqZWN0cyB0byBkcml2ZSBkcmF3aW5nIG9wZXJhdGlvbnMuCiAKQEAgLTczLDE3ICsxNjksMTQgQEAKIAkJICAgc3RydWN0IG5vdXZlYXVfZ3B1b2JqICoqZ3B1b2JqX3JldCkKIHsKIAlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCXN0cnVjdCBub3V2ZWF1X2VuZ2luZSAqZW5naW5lID0gJmRldl9wcml2LT5lbmdpbmU7CisJc3RydWN0IG5vdXZlYXVfaW5zdG1lbV9lbmdpbmUgKmluc3RtZW0gPSAmZGV2X3ByaXYtPmVuZ2luZS5pbnN0bWVtOwogCXN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqZ3B1b2JqOwogCXN0cnVjdCBkcm1fbW1fbm9kZSAqcmFtaW4gPSBOVUxMOwotCWludCByZXQ7CisJaW50IHJldCwgaTsKIAogCU5WX0RFQlVHKGRldiwgImNoJWQgc2l6ZT0ldSBhbGlnbj0lZCBmbGFncz0weCUwOHhcbiIsCiAJCSBjaGFuID8gY2hhbi0+aWQgOiAtMSwgc2l6ZSwgYWxpZ24sIGZsYWdzKTsKIAotCWlmICghZGV2X3ByaXYgfHwgIWdwdW9ial9yZXQgfHwgKmdwdW9ial9yZXQgIT0gTlVMTCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KIAlncHVvYmogPSBremFsbG9jKHNpemVvZigqZ3B1b2JqKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFncHVvYmopCiAJCXJldHVybiAtRU5PTUVNOwpAQCAtOTgsODggKzE5MSw0MSBAQAogCXNwaW5fdW5sb2NrKCZkZXZfcHJpdi0+cmFtaW5fbG9jayk7CiAKIAlpZiAoY2hhbikgewotCQlOVl9ERUJVRyhkZXYsICJjaGFubmVsIGhlYXBcbiIpOwotCiAJCXJhbWluID0gZHJtX21tX3NlYXJjaF9mcmVlKCZjaGFuLT5yYW1pbl9oZWFwLCBzaXplLCBhbGlnbiwgMCk7CiAJCWlmIChyYW1pbikKIAkJCXJhbWluID0gZHJtX21tX2dldF9ibG9jayhyYW1pbiwgc2l6ZSwgYWxpZ24pOwotCiAJCWlmICghcmFtaW4pIHsKIAkJCW5vdXZlYXVfZ3B1b2JqX3JlZihOVUxMLCAmZ3B1b2JqKTsKIAkJCXJldHVybiAtRU5PTUVNOwogCQl9Ci0JfSBlbHNlIHsKLQkJTlZfREVCVUcoZGV2LCAiZ2xvYmFsIGhlYXBcbiIpOwogCi0JCS8qIGFsbG9jYXRlIGJhY2tpbmcgcGFnZXMsIHNldHMgdmluc3QgKi8KLQkJcmV0ID0gZW5naW5lLT5pbnN0bWVtLnBvcHVsYXRlKGRldiwgZ3B1b2JqLCAmc2l6ZSk7Ci0JCWlmIChyZXQpIHsKLQkJCW5vdXZlYXVfZ3B1b2JqX3JlZihOVUxMLCAmZ3B1b2JqKTsKLQkJCXJldHVybiByZXQ7Ci0JCX0KLQotCQkvKiB0cnkgYW5kIGdldCBhcGVydHVyZSBzcGFjZSAqLwotCQlkbyB7Ci0JCQlpZiAoZHJtX21tX3ByZV9nZXQoJmRldl9wcml2LT5yYW1pbl9oZWFwKSkKLQkJCQlyZXR1cm4gLUVOT01FTTsKLQotCQkJc3Bpbl9sb2NrKCZkZXZfcHJpdi0+cmFtaW5fbG9jayk7Ci0JCQlyYW1pbiA9IGRybV9tbV9zZWFyY2hfZnJlZSgmZGV2X3ByaXYtPnJhbWluX2hlYXAsIHNpemUsCi0JCQkJCQkgICBhbGlnbiwgMCk7Ci0JCQlpZiAocmFtaW4gPT0gTlVMTCkgewotCQkJCXNwaW5fdW5sb2NrKCZkZXZfcHJpdi0+cmFtaW5fbG9jayk7Ci0JCQkJbm91dmVhdV9ncHVvYmpfcmVmKE5VTEwsICZncHVvYmopOwotCQkJCXJldHVybiAtRU5PTUVNOwotCQkJfQotCi0JCQlyYW1pbiA9IGRybV9tbV9nZXRfYmxvY2tfYXRvbWljKHJhbWluLCBzaXplLCBhbGlnbik7Ci0JCQlzcGluX3VubG9jaygmZGV2X3ByaXYtPnJhbWluX2xvY2spOwotCQl9IHdoaWxlIChyYW1pbiA9PSBOVUxMKTsKLQotCQkvKiBvbiBudjUwIGl0J3Mgb2sgdG8gZmFpbCwgd2UgaGF2ZSBhIGZhbGxiYWNrIHBhdGggKi8KLQkJaWYgKCFyYW1pbiAmJiBkZXZfcHJpdi0+Y2FyZF90eXBlIDwgTlZfNTApIHsKLQkJCW5vdXZlYXVfZ3B1b2JqX3JlZihOVUxMLCAmZ3B1b2JqKTsKLQkJCXJldHVybiAtRU5PTUVNOwotCQl9Ci0JfQotCi0JLyogaWYgd2UgZ290IGEgY2h1bmsgb2YgdGhlIGFwZXJ0dXJlLCBtYXAgcGFnZXMgaW50byBpdCAqLwotCWdwdW9iai0+aW1fcHJhbWluID0gcmFtaW47Ci0JaWYgKCFjaGFuICYmIGdwdW9iai0+aW1fcHJhbWluICYmIGRldl9wcml2LT5yYW1pbl9hdmFpbGFibGUpIHsKLQkJcmV0ID0gZW5naW5lLT5pbnN0bWVtLmJpbmQoZGV2LCBncHVvYmopOwotCQlpZiAocmV0KSB7Ci0JCQlub3V2ZWF1X2dwdW9ial9yZWYoTlVMTCwgJmdwdW9iaik7Ci0JCQlyZXR1cm4gcmV0OwotCQl9Ci0JfQotCi0JLyogY2FsY3VsYXRlIHRoZSB2YXJpb3VzIGRpZmZlcmVudCBhZGRyZXNzZXMgZm9yIHRoZSBvYmplY3QgKi8KLQlpZiAoY2hhbikgewogCQlncHVvYmotPnBpbnN0ID0gY2hhbi0+cmFtaW4tPnBpbnN0OwogCQlpZiAoZ3B1b2JqLT5waW5zdCAhPSB+MCkKLQkJCWdwdW9iai0+cGluc3QgKz0gZ3B1b2JqLT5pbV9wcmFtaW4tPnN0YXJ0OworCQkJZ3B1b2JqLT5waW5zdCArPSByYW1pbi0+c3RhcnQ7CiAKLQkJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPCBOVl81MCkgewotCQkJZ3B1b2JqLT5jaW5zdCA9IGdwdW9iai0+cGluc3Q7Ci0JCX0gZWxzZSB7Ci0JCQlncHVvYmotPmNpbnN0ID0gZ3B1b2JqLT5pbV9wcmFtaW4tPnN0YXJ0OwotCQkJZ3B1b2JqLT52aW5zdCA9IGdwdW9iai0+aW1fcHJhbWluLT5zdGFydCArCi0JCQkJCWNoYW4tPnJhbWluLT52aW5zdDsKLQkJfQorCQlncHVvYmotPmNpbnN0ID0gcmFtaW4tPnN0YXJ0OworCQlncHVvYmotPnZpbnN0ID0gcmFtaW4tPnN0YXJ0ICsgY2hhbi0+cmFtaW4tPnZpbnN0OworCQlncHVvYmotPm5vZGUgID0gcmFtaW47CiAJfSBlbHNlIHsKLQkJaWYgKGdwdW9iai0+aW1fcHJhbWluKQotCQkJZ3B1b2JqLT5waW5zdCA9IGdwdW9iai0+aW1fcHJhbWluLT5zdGFydDsKLQkJZWxzZQorCQlyZXQgPSBpbnN0bWVtLT5nZXQoZ3B1b2JqLCBzaXplLCBhbGlnbik7CisJCWlmIChyZXQpIHsKKwkJCW5vdXZlYXVfZ3B1b2JqX3JlZihOVUxMLCAmZ3B1b2JqKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKworCQlyZXQgPSAtRU5PU1lTOworCQlpZiAoIShmbGFncyAmIE5WT0JKX0ZMQUdfRE9OVF9NQVApKQorCQkJcmV0ID0gaW5zdG1lbS0+bWFwKGdwdW9iaik7CisJCWlmIChyZXQpCiAJCQlncHVvYmotPnBpbnN0ID0gfjA7Ci0JCWdwdW9iai0+Y2luc3QgPSAweGRlYWRiZWVmOworCisJCWdwdW9iai0+Y2luc3QgPSBOVk9CSl9DSU5TVF9HTE9CQUw7CiAJfQogCiAJaWYgKGdwdW9iai0+ZmxhZ3MgJiBOVk9CSl9GTEFHX1pFUk9fQUxMT0MpIHsKLQkJaW50IGk7Ci0KIAkJZm9yIChpID0gMDsgaSA8IGdwdW9iai0+c2l6ZTsgaSArPSA0KQogCQkJbnZfd28zMihncHVvYmosIGksIDApOwotCQllbmdpbmUtPmluc3RtZW0uZmx1c2goZGV2KTsKKwkJaW5zdG1lbS0+Zmx1c2goZGV2KTsKIAl9CiAKIApAQCAtMTk1LDYgKzI0MSw3IEBACiAJTlZfREVCVUcoZGV2LCAiXG4iKTsKIAogCUlOSVRfTElTVF9IRUFEKCZkZXZfcHJpdi0+Z3B1b2JqX2xpc3QpOworCUlOSVRfTElTVF9IRUFEKCZkZXZfcHJpdi0+Y2xhc3Nlcyk7CiAJc3Bpbl9sb2NrX2luaXQoJmRldl9wcml2LT5yYW1pbl9sb2NrKTsKIAlkZXZfcHJpdi0+cmFtaW5fYmFzZSA9IH4wOwogCkBAIC0yMDUsOSArMjUyLDIwIEBACiBub3V2ZWF1X2dwdW9ial90YWtlZG93bihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogewogCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG5vdXZlYXVfZ3B1b2JqX21ldGhvZCAqb20sICp0bTsKKwlzdHJ1Y3Qgbm91dmVhdV9ncHVvYmpfY2xhc3MgKm9jLCAqdGM7CiAKIAlOVl9ERUJVRyhkZXYsICJcbiIpOwogCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKG9jLCB0YywgJmRldl9wcml2LT5jbGFzc2VzLCBoZWFkKSB7CisJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShvbSwgdG0sICZvYy0+bWV0aG9kcywgaGVhZCkgeworCQkJbGlzdF9kZWwoJm9tLT5oZWFkKTsKKwkJCWtmcmVlKG9tKTsKKwkJfQorCQlsaXN0X2RlbCgmb2MtPmhlYWQpOworCQlrZnJlZShvYyk7CisJfQorCiAJQlVHX09OKCFsaXN0X2VtcHR5KCZkZXZfcHJpdi0+Z3B1b2JqX2xpc3QpKTsKIH0KIApAQCAtMjE5LDI2ICsyNzcsMzQgQEAKIAkJY29udGFpbmVyX29mKHJlZiwgc3RydWN0IG5vdXZlYXVfZ3B1b2JqLCByZWZjb3VudCk7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGdwdW9iai0+ZGV2OwogCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Ci0Jc3RydWN0IG5vdXZlYXVfZW5naW5lICplbmdpbmUgPSAmZGV2X3ByaXYtPmVuZ2luZTsKKwlzdHJ1Y3Qgbm91dmVhdV9pbnN0bWVtX2VuZ2luZSAqaW5zdG1lbSA9ICZkZXZfcHJpdi0+ZW5naW5lLmluc3RtZW07CiAJaW50IGk7CiAKIAlOVl9ERUJVRyhkZXYsICJncHVvYmogJXBcbiIsIGdwdW9iaik7CiAKLQlpZiAoZ3B1b2JqLT5pbV9wcmFtaW4gJiYgKGdwdW9iai0+ZmxhZ3MgJiBOVk9CSl9GTEFHX1pFUk9fRlJFRSkpIHsKKwlpZiAoZ3B1b2JqLT5ub2RlICYmIChncHVvYmotPmZsYWdzICYgTlZPQkpfRkxBR19aRVJPX0ZSRUUpKSB7CiAJCWZvciAoaSA9IDA7IGkgPCBncHVvYmotPnNpemU7IGkgKz0gNCkKIAkJCW52X3dvMzIoZ3B1b2JqLCBpLCAwKTsKLQkJZW5naW5lLT5pbnN0bWVtLmZsdXNoKGRldik7CisJCWluc3RtZW0tPmZsdXNoKGRldik7CiAJfQogCiAJaWYgKGdwdW9iai0+ZHRvcikKIAkJZ3B1b2JqLT5kdG9yKGRldiwgZ3B1b2JqKTsKIAotCWlmIChncHVvYmotPmltX2JhY2tpbmcpCi0JCWVuZ2luZS0+aW5zdG1lbS5jbGVhcihkZXYsIGdwdW9iaik7CisJaWYgKGdwdW9iai0+Y2luc3QgPT0gTlZPQkpfQ0lOU1RfR0xPQkFMKSB7CisJCWlmIChncHVvYmotPm5vZGUpIHsKKwkJCWluc3RtZW0tPnVubWFwKGdwdW9iaik7CisJCQlpbnN0bWVtLT5wdXQoZ3B1b2JqKTsKKwkJfQorCX0gZWxzZSB7CisJCWlmIChncHVvYmotPm5vZGUpIHsKKwkJCXNwaW5fbG9jaygmZGV2X3ByaXYtPnJhbWluX2xvY2spOworCQkJZHJtX21tX3B1dF9ibG9jayhncHVvYmotPm5vZGUpOworCQkJc3Bpbl91bmxvY2soJmRldl9wcml2LT5yYW1pbl9sb2NrKTsKKwkJfQorCX0KIAogCXNwaW5fbG9jaygmZGV2X3ByaXYtPnJhbWluX2xvY2spOwotCWlmIChncHVvYmotPmltX3ByYW1pbikKLQkJZHJtX21tX3B1dF9ibG9jayhncHVvYmotPmltX3ByYW1pbik7CiAJbGlzdF9kZWwoJmdwdW9iai0+bGlzdCk7CiAJc3Bpbl91bmxvY2soJmRldl9wcml2LT5yYW1pbl9sb2NrKTsKIApAQCAtMjc4LDcgKzM0NCw3IEBACiAJa3JlZl9pbml0KCZncHVvYmotPnJlZmNvdW50KTsKIAlncHVvYmotPnNpemUgID0gc2l6ZTsKIAlncHVvYmotPnBpbnN0ID0gcGluc3Q7Ci0JZ3B1b2JqLT5jaW5zdCA9IDB4ZGVhZGJlZWY7CisJZ3B1b2JqLT5jaW5zdCA9IE5WT0JKX0NJTlNUX0dMT0JBTDsKIAlncHVvYmotPnZpbnN0ID0gdmluc3Q7CiAKIAlpZiAoZ3B1b2JqLT5mbGFncyAmIE5WT0JKX0ZMQUdfWkVST19BTExPQykgewpAQCAtMzM1LDExNSArNDAxLDE1MiBAQAogICAgVGhlIG1ldGhvZCBiZWxvdyBjcmVhdGVzIGEgRE1BIG9iamVjdCBpbiBpbnN0YW5jZSBSQU0gYW5kIHJldHVybnMgYSBoYW5kbGUKICAgIHRvIGl0IHRoYXQgY2FuIGJlIHVzZWQgdG8gc2V0IHVwIGNvbnRleHQgb2JqZWN0cy4KICovCi1pbnQKLW5vdXZlYXVfZ3B1b2JqX2RtYV9uZXcoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbiwgaW50IGNsYXNzLAotCQkgICAgICAgdWludDY0X3Qgb2Zmc2V0LCB1aW50NjRfdCBzaXplLCBpbnQgYWNjZXNzLAotCQkgICAgICAgaW50IHRhcmdldCwgc3RydWN0IG5vdXZlYXVfZ3B1b2JqICoqZ3B1b2JqKQotewotCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjaGFuLT5kZXY7Ci0Jc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlzdHJ1Y3Qgbm91dmVhdV9pbnN0bWVtX2VuZ2luZSAqaW5zdG1lbSA9ICZkZXZfcHJpdi0+ZW5naW5lLmluc3RtZW07Ci0JaW50IHJldDsKIAotCU5WX0RFQlVHKGRldiwgImNoJWQgY2xhc3M9MHglMDR4IG9mZnNldD0weCVsbHggc2l6ZT0weCVsbHhcbiIsCi0JCSBjaGFuLT5pZCwgY2xhc3MsIG9mZnNldCwgc2l6ZSk7Ci0JTlZfREVCVUcoZGV2LCAiYWNjZXNzPSVkIHRhcmdldD0lZFxuIiwgYWNjZXNzLCB0YXJnZXQpOwordm9pZAorbnY1MF9ncHVvYmpfZG1hX2luaXQoc3RydWN0IG5vdXZlYXVfZ3B1b2JqICpvYmosIHUzMiBvZmZzZXQsIGludCBjbGFzcywKKwkJICAgICB1NjQgYmFzZSwgdTY0IHNpemUsIGludCB0YXJnZXQsIGludCBhY2Nlc3MsCisJCSAgICAgdTMyIHR5cGUsIHUzMiBjb21wKQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IG9iai0+ZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3Qgbm91dmVhdV9pbnN0bWVtX2VuZ2luZSAqcGluc3RtZW0gPSAmZGV2X3ByaXYtPmVuZ2luZS5pbnN0bWVtOworCXUzMiBmbGFnczA7CisKKwlmbGFnczAgID0gKGNvbXAgPDwgMjkpIHwgKHR5cGUgPDwgMjIpIHwgY2xhc3M7CisJZmxhZ3MwIHw9IDB4MDAxMDAwMDA7CisKKwlzd2l0Y2ggKGFjY2VzcykgeworCWNhc2UgTlZfTUVNX0FDQ0VTU19STzogZmxhZ3MwIHw9IDB4MDAwNDAwMDA7IGJyZWFrOworCWNhc2UgTlZfTUVNX0FDQ0VTU19SVzoKKwljYXNlIE5WX01FTV9BQ0NFU1NfV086IGZsYWdzMCB8PSAweDAwMDgwMDAwOyBicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CiAKIAlzd2l0Y2ggKHRhcmdldCkgewotCWNhc2UgTlZfRE1BX1RBUkdFVF9BR1A6Ci0JCW9mZnNldCArPSBkZXZfcHJpdi0+Z2FydF9pbmZvLmFwZXJfYmFzZTsKKwljYXNlIE5WX01FTV9UQVJHRVRfVlJBTToKKwkJZmxhZ3MwIHw9IDB4MDAwMTAwMDA7CisJCWJyZWFrOworCWNhc2UgTlZfTUVNX1RBUkdFVF9QQ0k6CisJCWZsYWdzMCB8PSAweDAwMDIwMDAwOworCQlicmVhazsKKwljYXNlIE5WX01FTV9UQVJHRVRfUENJX05PU05PT1A6CisJCWZsYWdzMCB8PSAweDAwMDMwMDAwOworCQlicmVhazsKKwljYXNlIE5WX01FTV9UQVJHRVRfR0FSVDoKKwkJYmFzZSArPSBkZXZfcHJpdi0+Z2FydF9pbmZvLmFwZXJfYmFzZTsKKwlkZWZhdWx0OgorCQlmbGFnczAgJj0gfjB4MDAxMDAwMDA7CisJCWJyZWFrOworCX0KKworCS8qIGNvbnZlcnQgdG8gYmFzZSArIGxpbWl0ICovCisJc2l6ZSA9IChiYXNlICsgc2l6ZSkgLSAxOworCisJbnZfd28zMihvYmosIG9mZnNldCArIDB4MDAsIGZsYWdzMCk7CisJbnZfd28zMihvYmosIG9mZnNldCArIDB4MDQsIGxvd2VyXzMyX2JpdHMoc2l6ZSkpOworCW52X3dvMzIob2JqLCBvZmZzZXQgKyAweDA4LCBsb3dlcl8zMl9iaXRzKGJhc2UpKTsKKwludl93bzMyKG9iaiwgb2Zmc2V0ICsgMHgwYywgdXBwZXJfMzJfYml0cyhzaXplKSA8PCAyNCB8CisJCQkJICAgIHVwcGVyXzMyX2JpdHMoYmFzZSkpOworCW52X3dvMzIob2JqLCBvZmZzZXQgKyAweDEwLCAweDAwMDAwMDAwKTsKKwludl93bzMyKG9iaiwgb2Zmc2V0ICsgMHgxNCwgMHgwMDAwMDAwMCk7CisKKwlwaW5zdG1lbS0+Zmx1c2gob2JqLT5kZXYpOworfQorCitpbnQKK252NTBfZ3B1b2JqX2RtYV9uZXcoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbiwgaW50IGNsYXNzLCB1NjQgYmFzZSwgdTY0IHNpemUsCisJCSAgICBpbnQgdGFyZ2V0LCBpbnQgYWNjZXNzLCB1MzIgdHlwZSwgdTMyIGNvbXAsCisJCSAgICBzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKipwb2JqKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjaGFuLT5kZXY7CisJaW50IHJldDsKKworCXJldCA9IG5vdXZlYXVfZ3B1b2JqX25ldyhkZXYsIGNoYW4sIDI0LCAxNiwgTlZPQkpfRkxBR19aRVJPX0ZSRUUsIHBvYmopOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwludjUwX2dwdW9ial9kbWFfaW5pdCgqcG9iaiwgMCwgY2xhc3MsIGJhc2UsIHNpemUsIHRhcmdldCwKKwkJCSAgICAgYWNjZXNzLCB0eXBlLCBjb21wKTsKKwlyZXR1cm4gMDsKK30KKworaW50Citub3V2ZWF1X2dwdW9ial9kbWFfbmV3KHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4sIGludCBjbGFzcywgdTY0IGJhc2UsCisJCSAgICAgICB1NjQgc2l6ZSwgaW50IGFjY2VzcywgaW50IHRhcmdldCwKKwkJICAgICAgIHN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqKnBvYmopCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gY2hhbi0+ZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY2hhbi0+ZGV2OworCXN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqb2JqOworCXUzMiBmbGFnczAsIGZsYWdzMjsKKwlpbnQgcmV0OworCisJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPj0gTlZfNTApIHsKKwkJdTMyIGNvbXAgPSAodGFyZ2V0ID09IE5WX01FTV9UQVJHRVRfVk0pID8gTlZfTUVNX0NPTVBfVk0gOiAwOworCQl1MzIgdHlwZSA9ICh0YXJnZXQgPT0gTlZfTUVNX1RBUkdFVF9WTSkgPyBOVl9NRU1fVFlQRV9WTSA6IDA7CisKKwkJcmV0dXJuIG52NTBfZ3B1b2JqX2RtYV9uZXcoY2hhbiwgY2xhc3MsIGJhc2UsIHNpemUsCisJCQkJCSAgIHRhcmdldCwgYWNjZXNzLCB0eXBlLCBjb21wLCBwb2JqKTsKKwl9CisKKwlpZiAodGFyZ2V0ID09IE5WX01FTV9UQVJHRVRfR0FSVCkgeworCQlpZiAoZGV2X3ByaXYtPmdhcnRfaW5mby50eXBlID09IE5PVVZFQVVfR0FSVF9BR1ApIHsKKwkJCXRhcmdldCA9IE5WX01FTV9UQVJHRVRfUENJX05PU05PT1A7CisJCQliYXNlICArPSBkZXZfcHJpdi0+Z2FydF9pbmZvLmFwZXJfYmFzZTsKKwkJfSBlbHNlCisJCWlmIChiYXNlICE9IDApIHsKKwkJCWJhc2UgPSBub3V2ZWF1X3NnZG1hX2dldF9waHlzaWNhbChkZXYsIGJhc2UpOworCQkJdGFyZ2V0ID0gTlZfTUVNX1RBUkdFVF9QQ0k7CisJCX0gZWxzZSB7CisJCQlub3V2ZWF1X2dwdW9ial9yZWYoZGV2X3ByaXYtPmdhcnRfaW5mby5zZ19jdHhkbWEsIHBvYmopOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwlmbGFnczAgID0gY2xhc3M7CisJZmxhZ3MwIHw9IDB4MDAwMDMwMDA7IC8qIFBUIHByZXNlbnQsIFBUIGxpbmVhciAqLworCWZsYWdzMiAgPSAwOworCisJc3dpdGNoICh0YXJnZXQpIHsKKwljYXNlIE5WX01FTV9UQVJHRVRfUENJOgorCQlmbGFnczAgfD0gMHgwMDAyMDAwMDsKKwkJYnJlYWs7CisJY2FzZSBOVl9NRU1fVEFSR0VUX1BDSV9OT1NOT09QOgorCQlmbGFnczAgfD0gMHgwMDAzMDAwMDsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJYnJlYWs7CiAJfQogCi0JcmV0ID0gbm91dmVhdV9ncHVvYmpfbmV3KGRldiwgY2hhbiwKLQkJCQkgbm91dmVhdV9ncHVvYmpfY2xhc3NfaW5zdG1lbV9zaXplKGRldiwgY2xhc3MpLAotCQkJCSAxNiwgTlZPQkpfRkxBR19aRVJPX0FMTE9DIHwKLQkJCQkgTlZPQkpfRkxBR19aRVJPX0ZSRUUsIGdwdW9iaik7Ci0JaWYgKHJldCkgewotCQlOVl9FUlJPUihkZXYsICJFcnJvciBjcmVhdGluZyBncHVvYmo6ICVkXG4iLCByZXQpOworCXN3aXRjaCAoYWNjZXNzKSB7CisJY2FzZSBOVl9NRU1fQUNDRVNTX1JPOgorCQlmbGFnczAgfD0gMHgwMDAwNDAwMDsKKwkJYnJlYWs7CisJY2FzZSBOVl9NRU1fQUNDRVNTX1dPOgorCQlmbGFnczAgfD0gMHgwMDAwODAwMDsKKwlkZWZhdWx0OgorCQlmbGFnczIgfD0gMHgwMDAwMDAwMjsKKwkJYnJlYWs7CisJfQorCisJZmxhZ3MwIHw9IChiYXNlICYgMHgwMDAwMGZmZikgPDwgMjA7CisJZmxhZ3MyIHw9IChiYXNlICYgMHhmZmZmZjAwMCk7CisKKwlyZXQgPSBub3V2ZWF1X2dwdW9ial9uZXcoZGV2LCBjaGFuLCAxNiwgMTYsIE5WT0JKX0ZMQUdfWkVST19GUkVFLCAmb2JqKTsKKwlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwotCX0KIAotCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlIDwgTlZfNTApIHsKLQkJdWludDMyX3QgZnJhbWUsIGFkanVzdCwgcHRlX2ZsYWdzID0gMDsKKwludl93bzMyKG9iaiwgMHgwMCwgZmxhZ3MwKTsKKwludl93bzMyKG9iaiwgMHgwNCwgc2l6ZSAtIDEpOworCW52X3dvMzIob2JqLCAweDA4LCBmbGFnczIpOworCW52X3dvMzIob2JqLCAweDBjLCBmbGFnczIpOwogCi0JCWlmIChhY2Nlc3MgIT0gTlZfRE1BX0FDQ0VTU19STykKLQkJCXB0ZV9mbGFncyB8PSAoMTw8MSk7Ci0JCWFkanVzdCA9IG9mZnNldCAmICAweDAwMDAwZmZmOwotCQlmcmFtZSAgPSBvZmZzZXQgJiB+MHgwMDAwMGZmZjsKLQotCQludl93bzMyKCpncHVvYmosICAwLCAoKDE8PDEyKSB8ICgxPDwxMykgfCAoYWRqdXN0IDw8IDIwKSB8Ci0JCQkJICAgICAgKGFjY2VzcyA8PCAxNCkgfCAodGFyZ2V0IDw8IDE2KSB8Ci0JCQkJICAgICAgY2xhc3MpKTsKLQkJbnZfd28zMigqZ3B1b2JqLCAgNCwgc2l6ZSAtIDEpOwotCQludl93bzMyKCpncHVvYmosICA4LCBmcmFtZSB8IHB0ZV9mbGFncyk7Ci0JCW52X3dvMzIoKmdwdW9iaiwgMTIsIGZyYW1lIHwgcHRlX2ZsYWdzKTsKLQl9IGVsc2UgewotCQl1aW50NjRfdCBsaW1pdCA9IG9mZnNldCArIHNpemUgLSAxOwotCQl1aW50MzJfdCBmbGFnczAsIGZsYWdzNTsKLQotCQlpZiAodGFyZ2V0ID09IE5WX0RNQV9UQVJHRVRfVklETUVNKSB7Ci0JCQlmbGFnczAgPSAweDAwMTkwMDAwOwotCQkJZmxhZ3M1ID0gMHgwMDAxMDAwMDsKLQkJfSBlbHNlIHsKLQkJCWZsYWdzMCA9IDB4N2ZjMDAwMDA7Ci0JCQlmbGFnczUgPSAweDAwMDgwMDAwOwotCQl9Ci0KLQkJbnZfd28zMigqZ3B1b2JqLCAgMCwgZmxhZ3MwIHwgY2xhc3MpOwotCQludl93bzMyKCpncHVvYmosICA0LCBsb3dlcl8zMl9iaXRzKGxpbWl0KSk7Ci0JCW52X3dvMzIoKmdwdW9iaiwgIDgsIGxvd2VyXzMyX2JpdHMob2Zmc2V0KSk7Ci0JCW52X3dvMzIoKmdwdW9iaiwgMTIsICgodXBwZXJfMzJfYml0cyhsaW1pdCkgJiAweGZmKSA8PCAyNCkgfAotCQkJCSAgICAgICh1cHBlcl8zMl9iaXRzKG9mZnNldCkgJiAweGZmKSk7Ci0JCW52X3dvMzIoKmdwdW9iaiwgMjAsIGZsYWdzNSk7Ci0JfQotCi0JaW5zdG1lbS0+Zmx1c2goZGV2KTsKLQotCSgqZ3B1b2JqKS0+ZW5naW5lID0gTlZPQkpfRU5HSU5FX1NXOwotCSgqZ3B1b2JqKS0+Y2xhc3MgID0gY2xhc3M7CisJb2JqLT5lbmdpbmUgPSBOVk9CSl9FTkdJTkVfU1c7CisJb2JqLT5jbGFzcyAgPSBjbGFzczsKKwkqcG9iaiA9IG9iajsKIAlyZXR1cm4gMDsKIH0KIAotaW50Ci1ub3V2ZWF1X2dwdW9ial9nYXJ0X2RtYV9uZXcoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbiwKLQkJCSAgICB1aW50NjRfdCBvZmZzZXQsIHVpbnQ2NF90IHNpemUsIGludCBhY2Nlc3MsCi0JCQkgICAgc3RydWN0IG5vdXZlYXVfZ3B1b2JqICoqZ3B1b2JqLAotCQkJICAgIHVpbnQzMl90ICpvX3JldCkKLXsKLQlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY2hhbi0+ZGV2OwotCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Ci0JaW50IHJldDsKLQotCWlmIChkZXZfcHJpdi0+Z2FydF9pbmZvLnR5cGUgPT0gTk9VVkVBVV9HQVJUX0FHUCB8fAotCSAgICAoZGV2X3ByaXYtPmNhcmRfdHlwZSA+PSBOVl81MCAmJgotCSAgICAgZGV2X3ByaXYtPmdhcnRfaW5mby50eXBlID09IE5PVVZFQVVfR0FSVF9TR0RNQSkpIHsKLQkJcmV0ID0gbm91dmVhdV9ncHVvYmpfZG1hX25ldyhjaGFuLCBOVl9DTEFTU19ETUFfSU5fTUVNT1JZLAotCQkJCQkgICAgIG9mZnNldCArIGRldl9wcml2LT52bV9nYXJ0X2Jhc2UsCi0JCQkJCSAgICAgc2l6ZSwgYWNjZXNzLCBOVl9ETUFfVEFSR0VUX0FHUCwKLQkJCQkJICAgICBncHVvYmopOwotCQlpZiAob19yZXQpCi0JCQkqb19yZXQgPSAwOwotCX0gZWxzZQotCWlmIChkZXZfcHJpdi0+Z2FydF9pbmZvLnR5cGUgPT0gTk9VVkVBVV9HQVJUX1NHRE1BKSB7Ci0JCW5vdXZlYXVfZ3B1b2JqX3JlZihkZXZfcHJpdi0+Z2FydF9pbmZvLnNnX2N0eGRtYSwgZ3B1b2JqKTsKLQkJaWYgKG9mZnNldCAmIH4weGZmZmZmZmZmVUxMKSB7Ci0JCQlOVl9FUlJPUihkZXYsICJvYmogb2Zmc2V0IGV4Y2VlZHMgMzItYml0c1xuIik7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCQlpZiAob19yZXQpCi0JCQkqb19yZXQgPSAodWludDMyX3Qpb2Zmc2V0OwotCQlyZXQgPSAoKmdwdW9iaiAhPSBOVUxMKSA/IDAgOiAtRUlOVkFMOwotCX0gZWxzZSB7Ci0JCU5WX0VSUk9SKGRldiwgIkludmFsaWQgR0FSVCB0eXBlICVkXG4iLCBkZXZfcHJpdi0+Z2FydF9pbmZvLnR5cGUpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlyZXR1cm4gcmV0OwotfQotCiAvKiBDb250ZXh0IG9iamVjdHMgaW4gdGhlIGluc3RhbmNlIFJBTSBoYXZlIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlLgogICogT24gTlY0MCB0aGV5IGFyZSAzMiBieXRlIGxvbmcsIG9uIE5WMzAgYW5kIHNtYWxsZXIgMTYgYnl0ZXMuCiAKQEAgLTQ5NSw2OCArNTk4LDEzIEBACiAgICBlbnRyeVs1XToKICAgIHNldCB0byAwPwogKi8KLWludAotbm91dmVhdV9ncHVvYmpfZ3JfbmV3KHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4sIGludCBjbGFzcywKLQkJICAgICAgc3RydWN0IG5vdXZlYXVfZ3B1b2JqICoqZ3B1b2JqKQotewotCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjaGFuLT5kZXY7Ci0Jc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlpbnQgcmV0OwotCi0JTlZfREVCVUcoZGV2LCAiY2glZCBjbGFzcz0weCUwNHhcbiIsIGNoYW4tPmlkLCBjbGFzcyk7Ci0KLQlyZXQgPSBub3V2ZWF1X2dwdW9ial9uZXcoZGV2LCBjaGFuLAotCQkJCSBub3V2ZWF1X2dwdW9ial9jbGFzc19pbnN0bWVtX3NpemUoZGV2LCBjbGFzcyksCi0JCQkJIDE2LAotCQkJCSBOVk9CSl9GTEFHX1pFUk9fQUxMT0MgfCBOVk9CSl9GTEFHX1pFUk9fRlJFRSwKLQkJCQkgZ3B1b2JqKTsKLQlpZiAocmV0KSB7Ci0JCU5WX0VSUk9SKGRldiwgIkVycm9yIGNyZWF0aW5nIGdwdW9iajogJWRcbiIsIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPj0gTlZfNTApIHsKLQkJbnZfd28zMigqZ3B1b2JqLCAgMCwgY2xhc3MpOwotCQludl93bzMyKCpncHVvYmosIDIwLCAweDAwMDEwMDAwKTsKLQl9IGVsc2UgewotCQlzd2l0Y2ggKGNsYXNzKSB7Ci0JCWNhc2UgTlZfQ0xBU1NfTlVMTDoKLQkJCW52X3dvMzIoKmdwdW9iaiwgMCwgMHgwMDAwMTAzMCk7Ci0JCQludl93bzMyKCpncHVvYmosIDQsIDB4RkZGRkZGRkYpOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA+PSBOVl80MCkgewotCQkJCW52X3dvMzIoKmdwdW9iaiwgMCwgY2xhc3MpOwotI2lmZGVmIF9fQklHX0VORElBTgotCQkJCW52X3dvMzIoKmdwdW9iaiwgOCwgMHgwMTAwMDAwMCk7Ci0jZW5kaWYKLQkJCX0gZWxzZSB7Ci0jaWZkZWYgX19CSUdfRU5ESUFOCi0JCQkJbnZfd28zMigqZ3B1b2JqLCAwLCBjbGFzcyB8IDB4MDAwODAwMDApOwotI2Vsc2UKLQkJCQludl93bzMyKCpncHVvYmosIDAsIGNsYXNzKTsKLSNlbmRpZgotCQkJfQotCQl9Ci0JfQotCWRldl9wcml2LT5lbmdpbmUuaW5zdG1lbS5mbHVzaChkZXYpOwotCi0JKCpncHVvYmopLT5lbmdpbmUgPSBOVk9CSl9FTkdJTkVfR1I7Ci0JKCpncHVvYmopLT5jbGFzcyAgPSBjbGFzczsKLQlyZXR1cm4gMDsKLX0KLQotaW50CitzdGF0aWMgaW50CiBub3V2ZWF1X2dwdW9ial9zd19uZXcoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbiwgaW50IGNsYXNzLAogCQkgICAgICBzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKipncHVvYmpfcmV0KQogewotCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdjsKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBjaGFuLT5kZXYtPmRldl9wcml2YXRlOwogCXN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqZ3B1b2JqOwogCi0JaWYgKCFjaGFuIHx8ICFncHVvYmpfcmV0IHx8ICpncHVvYmpfcmV0ICE9IE5VTEwpCi0JCXJldHVybiAtRUlOVkFMOwotCWRldl9wcml2ID0gY2hhbi0+ZGV2LT5kZXZfcHJpdmF0ZTsKLQogCWdwdW9iaiA9IGt6YWxsb2Moc2l6ZW9mKCpncHVvYmopLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWdwdW9iaikKIAkJcmV0dXJuIC1FTk9NRU07CkBAIC01NzMsNiArNjIxLDEwOSBAQAogCXJldHVybiAwOwogfQogCitpbnQKK25vdXZlYXVfZ3B1b2JqX2dyX25ldyhzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuLCB1MzIgaGFuZGxlLCBpbnQgY2xhc3MpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gY2hhbi0+ZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY2hhbi0+ZGV2OworCXN0cnVjdCBub3V2ZWF1X2dwdW9ial9jbGFzcyAqb2M7CisJc3RydWN0IG5vdXZlYXVfZ3B1b2JqICpncHVvYmo7CisJaW50IHJldDsKKworCU5WX0RFQlVHKGRldiwgImNoJWQgY2xhc3M9MHglMDR4XG4iLCBjaGFuLT5pZCwgY2xhc3MpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShvYywgJmRldl9wcml2LT5jbGFzc2VzLCBoZWFkKSB7CisJCWlmIChvYy0+aWQgPT0gY2xhc3MpCisJCQlnb3RvIGZvdW5kOworCX0KKworCU5WX0VSUk9SKGRldiwgImlsbGVnYWwgb2JqZWN0IGNsYXNzOiAweCV4XG4iLCBjbGFzcyk7CisJcmV0dXJuIC1FSU5WQUw7CisKK2ZvdW5kOgorCXN3aXRjaCAob2MtPmVuZ2luZSkgeworCWNhc2UgTlZPQkpfRU5HSU5FX1NXOgorCQlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA8IE5WX0MwKSB7CisJCQlyZXQgPSBub3V2ZWF1X2dwdW9ial9zd19uZXcoY2hhbiwgY2xhc3MsICZncHVvYmopOworCQkJaWYgKHJldCkKKwkJCQlyZXR1cm4gcmV0OworCQkJZ290byBpbnNlcnQ7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBOVk9CSl9FTkdJTkVfR1I6CisJCWlmICgoZGV2X3ByaXYtPmNhcmRfdHlwZSA+PSBOVl8yMCAmJiAhY2hhbi0+cmFtaW5fZ3JjdHgpIHx8CisJCSAgICAoZGV2X3ByaXYtPmNhcmRfdHlwZSAgPCBOVl8yMCAmJiAhY2hhbi0+cGdyYXBoX2N0eCkpIHsKKwkJCXN0cnVjdCBub3V2ZWF1X3BncmFwaF9lbmdpbmUgKnBncmFwaCA9CisJCQkJJmRldl9wcml2LT5lbmdpbmUuZ3JhcGg7CisKKwkJCXJldCA9IHBncmFwaC0+Y3JlYXRlX2NvbnRleHQoY2hhbik7CisJCQlpZiAocmV0KQorCQkJCXJldHVybiByZXQ7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBOVk9CSl9FTkdJTkVfQ1JZUFQ6CisJCWlmICghY2hhbi0+Y3J5cHRfY3R4KSB7CisJCQlzdHJ1Y3Qgbm91dmVhdV9jcnlwdF9lbmdpbmUgKnBjcnlwdCA9CisJCQkJJmRldl9wcml2LT5lbmdpbmUuY3J5cHQ7CisKKwkJCXJldCA9IHBjcnlwdC0+Y3JlYXRlX2NvbnRleHQoY2hhbik7CisJCQlpZiAocmV0KQorCQkJCXJldHVybiByZXQ7CisJCX0KKwkJYnJlYWs7CisJfQorCisJLyogd2UncmUgZG9uZSBpZiB0aGlzIGlzIGZlcm1pICovCisJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPj0gTlZfQzApCisJCXJldHVybiAwOworCisJcmV0ID0gbm91dmVhdV9ncHVvYmpfbmV3KGRldiwgY2hhbiwKKwkJCQkgbm91dmVhdV9ncHVvYmpfY2xhc3NfaW5zdG1lbV9zaXplKGRldiwgY2xhc3MpLAorCQkJCSAxNiwKKwkJCQkgTlZPQkpfRkxBR19aRVJPX0FMTE9DIHwgTlZPQkpfRkxBR19aRVJPX0ZSRUUsCisJCQkJICZncHVvYmopOworCWlmIChyZXQpIHsKKwkJTlZfRVJST1IoZGV2LCAiZXJyb3IgY3JlYXRpbmcgZ3B1b2JqOiAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA+PSBOVl81MCkgeworCQludl93bzMyKGdwdW9iaiwgIDAsIGNsYXNzKTsKKwkJbnZfd28zMihncHVvYmosIDIwLCAweDAwMDEwMDAwKTsKKwl9IGVsc2UgeworCQlzd2l0Y2ggKGNsYXNzKSB7CisJCWNhc2UgTlZfQ0xBU1NfTlVMTDoKKwkJCW52X3dvMzIoZ3B1b2JqLCAwLCAweDAwMDAxMDMwKTsKKwkJCW52X3dvMzIoZ3B1b2JqLCA0LCAweEZGRkZGRkZGKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPj0gTlZfNDApIHsKKwkJCQludl93bzMyKGdwdW9iaiwgMCwgY2xhc3MpOworI2lmZGVmIF9fQklHX0VORElBTgorCQkJCW52X3dvMzIoZ3B1b2JqLCA4LCAweDAxMDAwMDAwKTsKKyNlbmRpZgorCQkJfSBlbHNlIHsKKyNpZmRlZiBfX0JJR19FTkRJQU4KKwkJCQludl93bzMyKGdwdW9iaiwgMCwgY2xhc3MgfCAweDAwMDgwMDAwKTsKKyNlbHNlCisJCQkJbnZfd28zMihncHVvYmosIDAsIGNsYXNzKTsKKyNlbmRpZgorCQkJfQorCQl9CisJfQorCWRldl9wcml2LT5lbmdpbmUuaW5zdG1lbS5mbHVzaChkZXYpOworCisJZ3B1b2JqLT5lbmdpbmUgPSBvYy0+ZW5naW5lOworCWdwdW9iai0+Y2xhc3MgID0gb2MtPmlkOworCitpbnNlcnQ6CisJcmV0ID0gbm91dmVhdV9yYW1odF9pbnNlcnQoY2hhbiwgaGFuZGxlLCBncHVvYmopOworCWlmIChyZXQpCisJCU5WX0VSUk9SKGRldiwgImVycm9yIGFkZGluZyBncHVvYmogdG8gUkFNSFQ6ICVkXG4iLCByZXQpOworCW5vdXZlYXVfZ3B1b2JqX3JlZihOVUxMLCAmZ3B1b2JqKTsKKwlyZXR1cm4gcmV0OworfQorCiBzdGF0aWMgaW50CiBub3V2ZWF1X2dwdW9ial9jaGFubmVsX2luaXRfcHJhbWluKHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4pCiB7CkBAIC01ODUsNyArNzM2LDcgQEAKIAlOVl9ERUJVRyhkZXYsICJjaCVkXG4iLCBjaGFuLT5pZCk7CiAKIAkvKiBCYXNlIGFtb3VudCBmb3Igb2JqZWN0IHN0b3JhZ2UgKDRLaUIgZW5vdWdoPykgKi8KLQlzaXplID0gMHgxMDAwOworCXNpemUgPSAweDIwMDA7CiAJYmFzZSA9IDA7CiAKIAkvKiBQR1JBUEggY29udGV4dCAqLwpAQCAtNjI0LDEyICs3NzUsMzAgQEAKIHsKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY2hhbi0+ZGV2OwogCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Ci0Jc3RydWN0IG5vdXZlYXVfaW5zdG1lbV9lbmdpbmUgKmluc3RtZW0gPSAmZGV2X3ByaXYtPmVuZ2luZS5pbnN0bWVtOwogCXN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqdnJhbSA9IE5VTEwsICp0dCA9IE5VTEw7Ci0JaW50IHJldCwgaTsKKwlpbnQgcmV0OwogCiAJTlZfREVCVUcoZGV2LCAiY2glZCB2cmFtPTB4JTA4eCB0dD0weCUwOHhcbiIsIGNoYW4tPmlkLCB2cmFtX2gsIHR0X2gpOwogCisJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPT0gTlZfQzApIHsKKwkJc3RydWN0IG5vdXZlYXVfdm0gKnZtID0gZGV2X3ByaXYtPmNoYW5fdm07CisJCXN0cnVjdCBub3V2ZWF1X3ZtX3BnZCAqdnBnZDsKKworCQlyZXQgPSBub3V2ZWF1X2dwdW9ial9uZXcoZGV2LCBOVUxMLCA0MDk2LCAweDEwMDAsIDAsCisJCQkJCSAmY2hhbi0+cmFtaW4pOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKworCQlub3V2ZWF1X3ZtX3JlZih2bSwgJmNoYW4tPnZtLCBOVUxMKTsKKworCQl2cGdkID0gbGlzdF9maXJzdF9lbnRyeSgmdm0tPnBnZF9saXN0LCBzdHJ1Y3Qgbm91dmVhdV92bV9wZ2QsIGhlYWQpOworCQludl93bzMyKGNoYW4tPnJhbWluLCAweDAyMDAsIGxvd2VyXzMyX2JpdHModnBnZC0+b2JqLT52aW5zdCkpOworCQludl93bzMyKGNoYW4tPnJhbWluLCAweDAyMDQsIHVwcGVyXzMyX2JpdHModnBnZC0+b2JqLT52aW5zdCkpOworCQludl93bzMyKGNoYW4tPnJhbWluLCAweDAyMDgsIDB4ZmZmZmZmZmYpOworCQludl93bzMyKGNoYW4tPnJhbWluLCAweDAyMGMsIDB4MDAwMDAwZmYpOworCQlyZXR1cm4gMDsKKwl9CisKIAkvKiBBbGxvY2F0ZSBhIGNodW5rIG9mIG1lbW9yeSBmb3IgcGVyLWNoYW5uZWwgb2JqZWN0IHN0b3JhZ2UgKi8KIAlyZXQgPSBub3V2ZWF1X2dwdW9ial9jaGFubmVsX2luaXRfcHJhbWluKGNoYW4pOwogCWlmIChyZXQpIHsKQEAgLTYzOSwxNCArODA4LDEyIEBACiAKIAkvKiBOVjUwIFZNCiAJICogIC0gQWxsb2NhdGUgcGVyLWNoYW5uZWwgcGFnZS1kaXJlY3RvcnkKLQkgKiAgLSBNYXAgR0FSVCBhbmQgVlJBTSBpbnRvIHRoZSBjaGFubmVsJ3MgYWRkcmVzcyBzcGFjZSBhdCB0aGUKLQkgKiAgICBsb2NhdGlvbnMgZGV0ZXJtaW5lZCBkdXJpbmcgaW5pdC4KKwkgKiAgLSBMaW5rIHdpdGggc2hhcmVkIGNoYW5uZWwgVk0KIAkgKi8KLQlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA+PSBOVl81MCkgeworCWlmIChkZXZfcHJpdi0+Y2hhbl92bSkgewogCQl1MzIgcGdkX29mZnMgPSAoZGV2X3ByaXYtPmNoaXBzZXQgPT0gMHg1MCkgPyAweDE0MDAgOiAweDAyMDA7CiAJCXU2NCB2bV92aW5zdCA9IGNoYW4tPnJhbWluLT52aW5zdCArIHBnZF9vZmZzOwogCQl1MzIgdm1fcGluc3QgPSBjaGFuLT5yYW1pbi0+cGluc3Q7Ci0JCXUzMiBwZGU7CiAKIAkJaWYgKHZtX3BpbnN0ICE9IH4wKQogCQkJdm1fcGluc3QgKz0gcGdkX29mZnM7CkBAIC02NTUsMjkgKzgyMiw4IEBACiAJCQkJCSAgICAgIDAsICZjaGFuLT52bV9wZCk7CiAJCWlmIChyZXQpCiAJCQlyZXR1cm4gcmV0OwotCQlmb3IgKGkgPSAwOyBpIDwgMHg0MDAwOyBpICs9IDgpIHsKLQkJCW52X3dvMzIoY2hhbi0+dm1fcGQsIGkgKyAwLCAweDAwMDAwMDAwKTsKLQkJCW52X3dvMzIoY2hhbi0+dm1fcGQsIGkgKyA0LCAweGRlYWRjYWZlKTsKLQkJfQogCi0JCW5vdXZlYXVfZ3B1b2JqX3JlZihkZXZfcHJpdi0+Z2FydF9pbmZvLnNnX2N0eGRtYSwKLQkJCQkgICAmY2hhbi0+dm1fZ2FydF9wdCk7Ci0JCXBkZSA9IChkZXZfcHJpdi0+dm1fZ2FydF9iYXNlIC8gKDUxMioxMDI0KjEwMjQpKSAqIDg7Ci0JCW52X3dvMzIoY2hhbi0+dm1fcGQsIHBkZSArIDAsIGNoYW4tPnZtX2dhcnRfcHQtPnZpbnN0IHwgMyk7Ci0JCW52X3dvMzIoY2hhbi0+dm1fcGQsIHBkZSArIDQsIDB4MDAwMDAwMDApOwotCi0JCXBkZSA9IChkZXZfcHJpdi0+dm1fdnJhbV9iYXNlIC8gKDUxMioxMDI0KjEwMjQpKSAqIDg7Ci0JCWZvciAoaSA9IDA7IGkgPCBkZXZfcHJpdi0+dm1fdnJhbV9wdF9ucjsgaSsrKSB7Ci0JCQlub3V2ZWF1X2dwdW9ial9yZWYoZGV2X3ByaXYtPnZtX3ZyYW1fcHRbaV0sCi0JCQkJCSAgICZjaGFuLT52bV92cmFtX3B0W2ldKTsKLQotCQkJbnZfd28zMihjaGFuLT52bV9wZCwgcGRlICsgMCwKLQkJCQljaGFuLT52bV92cmFtX3B0W2ldLT52aW5zdCB8IDB4NjEpOwotCQkJbnZfd28zMihjaGFuLT52bV9wZCwgcGRlICsgNCwgMHgwMDAwMDAwMCk7Ci0JCQlwZGUgKz0gODsKLQkJfQotCi0JCWluc3RtZW0tPmZsdXNoKGRldik7CisJCW5vdXZlYXVfdm1fcmVmKGRldl9wcml2LT5jaGFuX3ZtLCAmY2hhbi0+dm0sIGNoYW4tPnZtX3BkKTsKIAl9CiAKIAkvKiBSQU1IVCAqLwpAQCAtNzAwLDkgKzg0Niw4IEBACiAJLyogVlJBTSBjdHhkbWEgKi8KIAlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA+PSBOVl81MCkgewogCQlyZXQgPSBub3V2ZWF1X2dwdW9ial9kbWFfbmV3KGNoYW4sIE5WX0NMQVNTX0RNQV9JTl9NRU1PUlksCi0JCQkJCSAgICAgMCwgZGV2X3ByaXYtPnZtX2VuZCwKLQkJCQkJICAgICBOVl9ETUFfQUNDRVNTX1JXLAotCQkJCQkgICAgIE5WX0RNQV9UQVJHRVRfQUdQLCAmdnJhbSk7CisJCQkJCSAgICAgMCwgKDFVTEwgPDwgNDApLCBOVl9NRU1fQUNDRVNTX1JXLAorCQkJCQkgICAgIE5WX01FTV9UQVJHRVRfVk0sICZ2cmFtKTsKIAkJaWYgKHJldCkgewogCQkJTlZfRVJST1IoZGV2LCAiRXJyb3IgY3JlYXRpbmcgVlJBTSBjdHhkbWE6ICVkXG4iLCByZXQpOwogCQkJcmV0dXJuIHJldDsKQEAgLTcxMCw4ICs4NTUsOCBAQAogCX0gZWxzZSB7CiAJCXJldCA9IG5vdXZlYXVfZ3B1b2JqX2RtYV9uZXcoY2hhbiwgTlZfQ0xBU1NfRE1BX0lOX01FTU9SWSwKIAkJCQkJICAgICAwLCBkZXZfcHJpdi0+ZmJfYXZhaWxhYmxlX3NpemUsCi0JCQkJCSAgICAgTlZfRE1BX0FDQ0VTU19SVywKLQkJCQkJICAgICBOVl9ETUFfVEFSR0VUX1ZJRE1FTSwgJnZyYW0pOworCQkJCQkgICAgIE5WX01FTV9BQ0NFU1NfUlcsCisJCQkJCSAgICAgTlZfTUVNX1RBUkdFVF9WUkFNLCAmdnJhbSk7CiAJCWlmIChyZXQpIHsKIAkJCU5WX0VSUk9SKGRldiwgIkVycm9yIGNyZWF0aW5nIFZSQU0gY3R4ZG1hOiAlZFxuIiwgcmV0KTsKIAkJCXJldHVybiByZXQ7CkBAIC03MjgsMjEgKzg3MywxMyBAQAogCS8qIFRUIG1lbW9yeSBjdHhkbWEgKi8KIAlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA+PSBOVl81MCkgewogCQlyZXQgPSBub3V2ZWF1X2dwdW9ial9kbWFfbmV3KGNoYW4sIE5WX0NMQVNTX0RNQV9JTl9NRU1PUlksCi0JCQkJCSAgICAgMCwgZGV2X3ByaXYtPnZtX2VuZCwKLQkJCQkJICAgICBOVl9ETUFfQUNDRVNTX1JXLAotCQkJCQkgICAgIE5WX0RNQV9UQVJHRVRfQUdQLCAmdHQpOwotCQlpZiAocmV0KSB7Ci0JCQlOVl9FUlJPUihkZXYsICJFcnJvciBjcmVhdGluZyBWUkFNIGN0eGRtYTogJWRcbiIsIHJldCk7Ci0JCQlyZXR1cm4gcmV0OwotCQl9Ci0JfSBlbHNlCi0JaWYgKGRldl9wcml2LT5nYXJ0X2luZm8udHlwZSAhPSBOT1VWRUFVX0dBUlRfTk9ORSkgewotCQlyZXQgPSBub3V2ZWF1X2dwdW9ial9nYXJ0X2RtYV9uZXcoY2hhbiwgMCwKLQkJCQkJCSAgZGV2X3ByaXYtPmdhcnRfaW5mby5hcGVyX3NpemUsCi0JCQkJCQkgIE5WX0RNQV9BQ0NFU1NfUlcsICZ0dCwgTlVMTCk7CisJCQkJCSAgICAgMCwgKDFVTEwgPDwgNDApLCBOVl9NRU1fQUNDRVNTX1JXLAorCQkJCQkgICAgIE5WX01FTV9UQVJHRVRfVk0sICZ0dCk7CiAJfSBlbHNlIHsKLQkJTlZfRVJST1IoZGV2LCAiSW52YWxpZCBHQVJUIHR5cGUgJWRcbiIsIGRldl9wcml2LT5nYXJ0X2luZm8udHlwZSk7Ci0JCXJldCA9IC1FSU5WQUw7CisJCXJldCA9IG5vdXZlYXVfZ3B1b2JqX2RtYV9uZXcoY2hhbiwgTlZfQ0xBU1NfRE1BX0lOX01FTU9SWSwKKwkJCQkJICAgICAwLCBkZXZfcHJpdi0+Z2FydF9pbmZvLmFwZXJfc2l6ZSwKKwkJCQkJICAgICBOVl9NRU1fQUNDRVNTX1JXLAorCQkJCQkgICAgIE5WX01FTV9UQVJHRVRfR0FSVCwgJnR0KTsKIAl9CiAKIAlpZiAocmV0KSB7CkBAIC03NjMsMjEgKzkwMCwxNCBAQAogdm9pZAogbm91dmVhdV9ncHVvYmpfY2hhbm5lbF90YWtlZG93bihzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuKQogewotCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGNoYW4tPmRldi0+ZGV2X3ByaXZhdGU7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNoYW4tPmRldjsKLQlpbnQgaTsKIAogCU5WX0RFQlVHKGRldiwgImNoJWRcbiIsIGNoYW4tPmlkKTsKIAotCWlmICghY2hhbi0+cmFtaHQpCi0JCXJldHVybjsKLQogCW5vdXZlYXVfcmFtaHRfcmVmKE5VTEwsICZjaGFuLT5yYW1odCwgY2hhbik7CiAKKwlub3V2ZWF1X3ZtX3JlZihOVUxMLCAmY2hhbi0+dm0sIGNoYW4tPnZtX3BkKTsKIAlub3V2ZWF1X2dwdW9ial9yZWYoTlVMTCwgJmNoYW4tPnZtX3BkKTsKLQlub3V2ZWF1X2dwdW9ial9yZWYoTlVMTCwgJmNoYW4tPnZtX2dhcnRfcHQpOwotCWZvciAoaSA9IDA7IGkgPCBkZXZfcHJpdi0+dm1fdnJhbV9wdF9ucjsgaSsrKQotCQlub3V2ZWF1X2dwdW9ial9yZWYoTlVMTCwgJmNoYW4tPnZtX3ZyYW1fcHRbaV0pOwogCiAJaWYgKGNoYW4tPnJhbWluX2hlYXAuZnJlZV9zdGFjay5uZXh0KQogCQlkcm1fbW1fdGFrZWRvd24oJmNoYW4tPnJhbWluX2hlYXApOwpAQCAtNzkxLDE0NyArOTIxLDkxIEBACiAJc3RydWN0IG5vdXZlYXVfZ3B1b2JqICpncHVvYmo7CiAJaW50IGk7CiAKLQlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA8IE5WXzUwKSB7Ci0JCWRldl9wcml2LT5zdXNyZXMucmFtaW5fY29weSA9IHZtYWxsb2MoZGV2X3ByaXYtPnJhbWluX3JzdmRfdnJhbSk7Ci0JCWlmICghZGV2X3ByaXYtPnN1c3Jlcy5yYW1pbl9jb3B5KQotCQkJcmV0dXJuIC1FTk9NRU07Ci0KLQkJZm9yIChpID0gMDsgaSA8IGRldl9wcml2LT5yYW1pbl9yc3ZkX3ZyYW07IGkgKz0gNCkKLQkJCWRldl9wcml2LT5zdXNyZXMucmFtaW5fY29weVtpLzRdID0gbnZfcmkzMihkZXYsIGkpOwotCQlyZXR1cm4gMDsKLQl9Ci0KIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGdwdW9iaiwgJmRldl9wcml2LT5ncHVvYmpfbGlzdCwgbGlzdCkgewotCQlpZiAoIWdwdW9iai0+aW1fYmFja2luZykKKwkJaWYgKGdwdW9iai0+Y2luc3QgIT0gTlZPQkpfQ0lOU1RfR0xPQkFMKQogCQkJY29udGludWU7CiAKLQkJZ3B1b2JqLT5pbV9iYWNraW5nX3N1c3BlbmQgPSB2bWFsbG9jKGdwdW9iai0+c2l6ZSk7Ci0JCWlmICghZ3B1b2JqLT5pbV9iYWNraW5nX3N1c3BlbmQpIHsKKwkJZ3B1b2JqLT5zdXNwZW5kID0gdm1hbGxvYyhncHVvYmotPnNpemUpOworCQlpZiAoIWdwdW9iai0+c3VzcGVuZCkgewogCQkJbm91dmVhdV9ncHVvYmpfcmVzdW1lKGRldik7CiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJfQogCiAJCWZvciAoaSA9IDA7IGkgPCBncHVvYmotPnNpemU7IGkgKz0gNCkKLQkJCWdwdW9iai0+aW1fYmFja2luZ19zdXNwZW5kW2kvNF0gPSBudl9ybzMyKGdwdW9iaiwgaSk7CisJCQlncHVvYmotPnN1c3BlbmRbaS80XSA9IG52X3JvMzIoZ3B1b2JqLCBpKTsKIAl9CiAKIAlyZXR1cm4gMDsKIH0KIAogdm9pZAotbm91dmVhdV9ncHVvYmpfc3VzcGVuZF9jbGVhbnVwKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKmdwdW9iajsKLQotCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlIDwgTlZfNTApIHsKLQkJdmZyZWUoZGV2X3ByaXYtPnN1c3Jlcy5yYW1pbl9jb3B5KTsKLQkJZGV2X3ByaXYtPnN1c3Jlcy5yYW1pbl9jb3B5ID0gTlVMTDsKLQkJcmV0dXJuOwotCX0KLQotCWxpc3RfZm9yX2VhY2hfZW50cnkoZ3B1b2JqLCAmZGV2X3ByaXYtPmdwdW9ial9saXN0LCBsaXN0KSB7Ci0JCWlmICghZ3B1b2JqLT5pbV9iYWNraW5nX3N1c3BlbmQpCi0JCQljb250aW51ZTsKLQotCQl2ZnJlZShncHVvYmotPmltX2JhY2tpbmdfc3VzcGVuZCk7Ci0JCWdwdW9iai0+aW1fYmFja2luZ19zdXNwZW5kID0gTlVMTDsKLQl9Ci19Ci0KLXZvaWQKIG5vdXZlYXVfZ3B1b2JqX3Jlc3VtZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogewogCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJc3RydWN0IG5vdXZlYXVfZ3B1b2JqICpncHVvYmo7CiAJaW50IGk7CiAKLQlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA8IE5WXzUwKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBkZXZfcHJpdi0+cmFtaW5fcnN2ZF92cmFtOyBpICs9IDQpCi0JCQludl93aTMyKGRldiwgaSwgZGV2X3ByaXYtPnN1c3Jlcy5yYW1pbl9jb3B5W2kvNF0pOwotCQlub3V2ZWF1X2dwdW9ial9zdXNwZW5kX2NsZWFudXAoZGV2KTsKLQkJcmV0dXJuOwotCX0KLQogCWxpc3RfZm9yX2VhY2hfZW50cnkoZ3B1b2JqLCAmZGV2X3ByaXYtPmdwdW9ial9saXN0LCBsaXN0KSB7Ci0JCWlmICghZ3B1b2JqLT5pbV9iYWNraW5nX3N1c3BlbmQpCisJCWlmICghZ3B1b2JqLT5zdXNwZW5kKQogCQkJY29udGludWU7CiAKIAkJZm9yIChpID0gMDsgaSA8IGdwdW9iai0+c2l6ZTsgaSArPSA0KQotCQkJbnZfd28zMihncHVvYmosIGksIGdwdW9iai0+aW1fYmFja2luZ19zdXNwZW5kW2kvNF0pOwotCQlkZXZfcHJpdi0+ZW5naW5lLmluc3RtZW0uZmx1c2goZGV2KTsKKwkJCW52X3dvMzIoZ3B1b2JqLCBpLCBncHVvYmotPnN1c3BlbmRbaS80XSk7CisKKwkJdmZyZWUoZ3B1b2JqLT5zdXNwZW5kKTsKKwkJZ3B1b2JqLT5zdXNwZW5kID0gTlVMTDsKIAl9CiAKLQlub3V2ZWF1X2dwdW9ial9zdXNwZW5kX2NsZWFudXAoZGV2KTsKKwlkZXZfcHJpdi0+ZW5naW5lLmluc3RtZW0uZmx1c2goZGV2KTsKIH0KIAogaW50IG5vdXZlYXVfaW9jdGxfZ3JvYmpfYWxsb2Moc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdm9pZCAqZGF0YSwKIAkJCSAgICAgIHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2KQogewotCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJc3RydWN0IGRybV9ub3V2ZWF1X2dyb2JqX2FsbG9jICppbml0ID0gZGF0YTsKLQlzdHJ1Y3Qgbm91dmVhdV9wZ3JhcGhfZW5naW5lICpwZ3JhcGggPSAmZGV2X3ByaXYtPmVuZ2luZS5ncmFwaDsKLQlzdHJ1Y3Qgbm91dmVhdV9wZ3JhcGhfb2JqZWN0X2NsYXNzICpncmM7Ci0Jc3RydWN0IG5vdXZlYXVfZ3B1b2JqICpnciA9IE5VTEw7CiAJc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbjsKIAlpbnQgcmV0OwogCi0JTk9VVkVBVV9HRVRfVVNFUl9DSEFOTkVMX1dJVEhfUkVUVVJOKGluaXQtPmNoYW5uZWwsIGZpbGVfcHJpdiwgY2hhbik7Ci0KIAlpZiAoaW5pdC0+aGFuZGxlID09IH4wKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWdyYyA9IHBncmFwaC0+Z3JjbGFzczsKLQl3aGlsZSAoZ3JjLT5pZCkgewotCQlpZiAoZ3JjLT5pZCA9PSBpbml0LT5jbGFzcykKLQkJCWJyZWFrOwotCQlncmMrKzsKKwljaGFuID0gbm91dmVhdV9jaGFubmVsX2dldChkZXYsIGZpbGVfcHJpdiwgaW5pdC0+Y2hhbm5lbCk7CisJaWYgKElTX0VSUihjaGFuKSkKKwkJcmV0dXJuIFBUUl9FUlIoY2hhbik7CisKKwlpZiAobm91dmVhdV9yYW1odF9maW5kKGNoYW4sIGluaXQtPmhhbmRsZSkpIHsKKwkJcmV0ID0gLUVFWElTVDsKKwkJZ290byBvdXQ7CiAJfQogCi0JaWYgKCFncmMtPmlkKSB7Ci0JCU5WX0VSUk9SKGRldiwgIklsbGVnYWwgb2JqZWN0IGNsYXNzOiAweCV4XG4iLCBpbml0LT5jbGFzcyk7Ci0JCXJldHVybiAtRVBFUk07Ci0JfQotCi0JaWYgKG5vdXZlYXVfcmFtaHRfZmluZChjaGFuLCBpbml0LT5oYW5kbGUpKQotCQlyZXR1cm4gLUVFWElTVDsKLQotCWlmICghZ3JjLT5zb2Z0d2FyZSkKLQkJcmV0ID0gbm91dmVhdV9ncHVvYmpfZ3JfbmV3KGNoYW4sIGdyYy0+aWQsICZncik7Ci0JZWxzZQotCQlyZXQgPSBub3V2ZWF1X2dwdW9ial9zd19uZXcoY2hhbiwgZ3JjLT5pZCwgJmdyKTsKKwlyZXQgPSBub3V2ZWF1X2dwdW9ial9ncl9uZXcoY2hhbiwgaW5pdC0+aGFuZGxlLCBpbml0LT5jbGFzcyk7CiAJaWYgKHJldCkgewogCQlOVl9FUlJPUihkZXYsICJFcnJvciBjcmVhdGluZyBvYmplY3Q6ICVkICglZC8weCUwOHgpXG4iLAogCQkJIHJldCwgaW5pdC0+Y2hhbm5lbCwgaW5pdC0+aGFuZGxlKTsKLQkJcmV0dXJuIHJldDsKIAl9CiAKLQlyZXQgPSBub3V2ZWF1X3JhbWh0X2luc2VydChjaGFuLCBpbml0LT5oYW5kbGUsIGdyKTsKLQlub3V2ZWF1X2dwdW9ial9yZWYoTlVMTCwgJmdyKTsKLQlpZiAocmV0KSB7Ci0JCU5WX0VSUk9SKGRldiwgIkVycm9yIHJlZmVyZW5jaW5nIG9iamVjdDogJWQgKCVkLzB4JTA4eClcbiIsCi0JCQkgcmV0LCBpbml0LT5jaGFubmVsLCBpbml0LT5oYW5kbGUpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCXJldHVybiAwOworb3V0OgorCW5vdXZlYXVfY2hhbm5lbF9wdXQoJmNoYW4pOworCXJldHVybiByZXQ7CiB9CiAKIGludCBub3V2ZWF1X2lvY3RsX2dwdW9ial9mcmVlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEsCiAJCQkgICAgICBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdikKIHsKIAlzdHJ1Y3QgZHJtX25vdXZlYXVfZ3B1b2JqX2ZyZWUgKm9iamZyZWUgPSBkYXRhOwotCXN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqZ3B1b2JqOwogCXN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW47CisJaW50IHJldDsKIAotCU5PVVZFQVVfR0VUX1VTRVJfQ0hBTk5FTF9XSVRIX1JFVFVSTihvYmpmcmVlLT5jaGFubmVsLCBmaWxlX3ByaXYsIGNoYW4pOworCWNoYW4gPSBub3V2ZWF1X2NoYW5uZWxfZ2V0KGRldiwgZmlsZV9wcml2LCBvYmpmcmVlLT5jaGFubmVsKTsKKwlpZiAoSVNfRVJSKGNoYW4pKQorCQlyZXR1cm4gUFRSX0VSUihjaGFuKTsKIAotCWdwdW9iaiA9IG5vdXZlYXVfcmFtaHRfZmluZChjaGFuLCBvYmpmcmVlLT5oYW5kbGUpOwotCWlmICghZ3B1b2JqKQotCQlyZXR1cm4gLUVOT0VOVDsKKwkvKiBTeW5jaHJvbml6ZSB3aXRoIHRoZSB1c2VyIGNoYW5uZWwgKi8KKwlub3V2ZWF1X2NoYW5uZWxfaWRsZShjaGFuKTsKIAotCW5vdXZlYXVfcmFtaHRfcmVtb3ZlKGNoYW4sIG9iamZyZWUtPmhhbmRsZSk7Ci0JcmV0dXJuIDA7CisJcmV0ID0gbm91dmVhdV9yYW1odF9yZW1vdmUoY2hhbiwgb2JqZnJlZS0+aGFuZGxlKTsKKwlub3V2ZWF1X2NoYW5uZWxfcHV0KCZjaGFuKTsKKwlyZXR1cm4gcmV0OwogfQogCiB1MzIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfcG0uYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfcG0uYwppbmRleCA5ZjdiMTU4Li5mYjg0NmEzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X3BtLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9wbS5jCkBAIC0yNyw2ICsyNywxMCBAQAogI2luY2x1ZGUgIm5vdXZlYXVfZHJ2LmgiCiAjaW5jbHVkZSAibm91dmVhdV9wbS5oIgogCisjaWZkZWYgQ09ORklHX0FDUEkKKyNpbmNsdWRlIDxsaW51eC9hY3BpLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxsaW51eC9wb3dlcl9zdXBwbHkuaD4KICNpbmNsdWRlIDxsaW51eC9od21vbi5oPgogI2luY2x1ZGUgPGxpbnV4L2h3bW9uLXN5c2ZzLmg+CiAKQEAgLTQxOCw4ICs0MjIsNyBAQAogCQlyZXR1cm4gcmV0OwogCX0KIAlkZXZfc2V0X2RydmRhdGEoaHdtb25fZGV2LCBkZXYpOwotCXJldCA9IHN5c2ZzX2NyZWF0ZV9ncm91cCgmaHdtb25fZGV2LT5rb2JqLAotCQkJCQkmaHdtb25fYXR0cmdyb3VwKTsKKwlyZXQgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJmRldi0+cGRldi0+ZGV2LmtvYmosICZod21vbl9hdHRyZ3JvdXApOwogCWlmIChyZXQpIHsKIAkJTlZfRVJST1IoZGV2LAogCQkJIlVuYWJsZSB0byBjcmVhdGUgaHdtb24gc3lzZnMgZmlsZTogJWRcbiIsIHJldCk7CkBAIC00NDYsNiArNDQ5LDI1IEBACiAjZW5kaWYKIH0KIAorI2lmZGVmIENPTkZJR19BQ1BJCitzdGF0aWMgaW50Citub3V2ZWF1X3BtX2FjcGlfZXZlbnQoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYiwgdW5zaWduZWQgbG9uZyB2YWwsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0KKwkJY29udGFpbmVyX29mKG5iLCBzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSwgZW5naW5lLnBtLmFjcGlfbmIpOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBkZXZfcHJpdi0+ZGV2OworCXN0cnVjdCBhY3BpX2J1c19ldmVudCAqZW50cnkgPSAoc3RydWN0IGFjcGlfYnVzX2V2ZW50ICopZGF0YTsKKworCWlmIChzdHJjbXAoZW50cnktPmRldmljZV9jbGFzcywgImFjX2FkYXB0ZXIiKSA9PSAwKSB7CisJCWJvb2wgYWMgPSBwb3dlcl9zdXBwbHlfaXNfc3lzdGVtX3N1cHBsaWVkKCk7CisKKwkJTlZfREVCVUcoZGV2LCAicG93ZXIgc3VwcGx5IGNoYW5nZWQ6ICVzXG4iLCBhYyA/ICJBQyIgOiAiREMiKTsKKwl9CisKKwlyZXR1cm4gTk9USUZZX09LOworfQorI2VuZGlmCisKIGludAogbm91dmVhdV9wbV9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7CkBAIC00ODUsNiArNTA3LDEwIEBACiAKIAlub3V2ZWF1X3N5c2ZzX2luaXQoZGV2KTsKIAlub3V2ZWF1X2h3bW9uX2luaXQoZGV2KTsKKyNpZmRlZiBDT05GSUdfQUNQSQorCXBtLT5hY3BpX25iLm5vdGlmaWVyX2NhbGwgPSBub3V2ZWF1X3BtX2FjcGlfZXZlbnQ7CisJcmVnaXN0ZXJfYWNwaV9ub3RpZmllcigmcG0tPmFjcGlfbmIpOworI2VuZGlmCiAKIAlyZXR1cm4gMDsKIH0KQEAgLTUwMyw2ICs1MjksOSBAQAogCW5vdXZlYXVfcGVyZl9maW5pKGRldik7CiAJbm91dmVhdV92b2x0X2ZpbmkoZGV2KTsKIAorI2lmZGVmIENPTkZJR19BQ1BJCisJdW5yZWdpc3Rlcl9hY3BpX25vdGlmaWVyKCZwbS0+YWNwaV9uYik7CisjZW5kaWYKIAlub3V2ZWF1X2h3bW9uX2ZpbmkoZGV2KTsKIAlub3V2ZWF1X3N5c2ZzX2ZpbmkoZGV2KTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfcmFtaHQuYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfcmFtaHQuYwppbmRleCAyZDg1ODA5Li5iZWYzZTY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X3JhbWh0LmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9yYW1odC5jCkBAIC0xMDQsMTcgKzEwNCwxNyBAQAogCW5vdXZlYXVfZ3B1b2JqX3JlZihncHVvYmosICZlbnRyeS0+Z3B1b2JqKTsKIAogCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlIDwgTlZfNDApIHsKLQkJY3R4ID0gTlZfUkFNSFRfQ09OVEVYVF9WQUxJRCB8IChncHVvYmotPmNpbnN0ID4+IDQpIHwKKwkJY3R4ID0gTlZfUkFNSFRfQ09OVEVYVF9WQUxJRCB8IChncHVvYmotPnBpbnN0ID4+IDQpIHwKIAkJICAgICAgKGNoYW4tPmlkIDw8IE5WX1JBTUhUX0NPTlRFWFRfQ0hBTk5FTF9TSElGVCkgfAogCQkgICAgICAoZ3B1b2JqLT5lbmdpbmUgPDwgTlZfUkFNSFRfQ09OVEVYVF9FTkdJTkVfU0hJRlQpOwogCX0gZWxzZQogCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlIDwgTlZfNTApIHsKLQkJY3R4ID0gKGdwdW9iai0+Y2luc3QgPj4gNCkgfAorCQljdHggPSAoZ3B1b2JqLT5waW5zdCA+PiA0KSB8CiAJCSAgICAgIChjaGFuLT5pZCA8PCBOVjQwX1JBTUhUX0NPTlRFWFRfQ0hBTk5FTF9TSElGVCkgfAogCQkgICAgICAoZ3B1b2JqLT5lbmdpbmUgPDwgTlY0MF9SQU1IVF9DT05URVhUX0VOR0lORV9TSElGVCk7CiAJfSBlbHNlIHsKIAkJaWYgKGdwdW9iai0+ZW5naW5lID09IE5WT0JKX0VOR0lORV9ESVNQTEFZKSB7Ci0JCQljdHggPSAoZ3B1b2JqLT5jaW5zdCA8PCAxMCkgfCAyOworCQkJY3R4ID0gKGdwdW9iai0+Y2luc3QgPDwgMTApIHwgY2hhbi0+aWQ7CiAJCX0gZWxzZSB7CiAJCQljdHggPSAoZ3B1b2JqLT5jaW5zdCA+PiA0KSB8CiAJCQkgICAgICAoKGdwdW9iai0+ZW5naW5lIDw8CkBAIC0yMTQsMTggKzIxNCwxOSBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoYW4tPnJhbWh0LT5sb2NrLCBmbGFncyk7CiB9CiAKLXZvaWQKK2ludAogbm91dmVhdV9yYW1odF9yZW1vdmUoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbiwgdTMyIGhhbmRsZSkKIHsKIAlzdHJ1Y3Qgbm91dmVhdV9yYW1odF9lbnRyeSAqZW50cnk7CiAKIAllbnRyeSA9IG5vdXZlYXVfcmFtaHRfcmVtb3ZlX2VudHJ5KGNoYW4sIGhhbmRsZSk7CiAJaWYgKCFlbnRyeSkKLQkJcmV0dXJuOworCQlyZXR1cm4gLUVOT0VOVDsKIAogCW5vdXZlYXVfcmFtaHRfcmVtb3ZlX2hhc2goY2hhbiwgZW50cnktPmhhbmRsZSk7CiAJbm91dmVhdV9ncHVvYmpfcmVmKE5VTEwsICZlbnRyeS0+Z3B1b2JqKTsKIAlrZnJlZShlbnRyeSk7CisJcmV0dXJuIDA7CiB9CiAKIHN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X3JhbWh0LmggYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X3JhbWh0LmgKaW5kZXggYjc5Y2I1ZS4uYzgyZGU5OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9yYW1odC5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfcmFtaHQuaApAQCAtNDgsNyArNDgsNyBAQAogCiBleHRlcm4gaW50ICBub3V2ZWF1X3JhbWh0X2luc2VydChzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICosIHUzMiBoYW5kbGUsCiAJCQkJIHN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqKTsKLWV4dGVybiB2b2lkIG5vdXZlYXVfcmFtaHRfcmVtb3ZlKHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKiwgdTMyIGhhbmRsZSk7CitleHRlcm4gaW50ICBub3V2ZWF1X3JhbWh0X3JlbW92ZShzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICosIHUzMiBoYW5kbGUpOwogZXh0ZXJuIHN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqCiBub3V2ZWF1X3JhbWh0X2ZpbmQoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbiwgdTMyIGhhbmRsZSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfcmVnLmggYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X3JlZy5oCmluZGV4IDFiNDI1NDEuLjA0ZThmYjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfcmVnLmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9yZWcuaApAQCAtNDUsNiArNDUsMTEgQEAKICMJZGVmaW5lIE5WMDRfUEZCX1JFRl9DTURfUkVGUkVTSAkJCQkoMSA8PCAwKQogI2RlZmluZSBOVjA0X1BGQl9QUkUJCQkJCQkweDAwMTAwMmQ0CiAjCWRlZmluZSBOVjA0X1BGQl9QUkVfQ01EX1BSRUNIQVJHRQkJCSgxIDw8IDApCisjZGVmaW5lIE5WMjBfUEZCX1pDT01QKGkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MDAxMDAzMDAgKyA0KihpKSkKKyMJZGVmaW5lIE5WMjBfUEZCX1pDT01QX01PREVfMzIJCQkJKDQgPDwgMjQpCisjCWRlZmluZSBOVjIwX1BGQl9aQ09NUF9FTgkJCQkoMSA8PCAzMSkKKyMJZGVmaW5lIE5WMjVfUEZCX1pDT01QX01PREVfMTYJCQkJKDEgPDwgMjApCisjCWRlZmluZSBOVjI1X1BGQl9aQ09NUF9NT0RFXzMyCQkJCSgyIDw8IDIwKQogI2RlZmluZSBOVjEwX1BGQl9DTE9TRV9QQUdFMgkJCQkJMHgwMDEwMDMzYwogI2RlZmluZSBOVjA0X1BGQl9TQ1JBTUJMRShpKSAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMDEwMDQwMCArIDQgKiAoaSkpCiAjZGVmaW5lIE5WNDBfUEZCX1RJTEUoaSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMDEwMDYwMCArIChpKjE2KSkKQEAgLTc0LDE3ICs3OSw2IEBACiAjICAgIGRlZmluZSBOVjQwX1JBTUhUX0NPTlRFWFRfRU5HSU5FX1NISUZUICAgICAgICAgICAgICAgIDIwCiAjICAgIGRlZmluZSBOVjQwX1JBTUhUX0NPTlRFWFRfSU5TVEFOQ0VfU0hJRlQgICAgICAgICAgICAgIDAKIAotLyogRE1BIG9iamVjdCBkZWZpbmVzICovCi0jZGVmaW5lIE5WX0RNQV9BQ0NFU1NfUlcgMAotI2RlZmluZSBOVl9ETUFfQUNDRVNTX1JPIDEKLSNkZWZpbmUgTlZfRE1BX0FDQ0VTU19XTyAyCi0jZGVmaW5lIE5WX0RNQV9UQVJHRVRfVklETUVNIDAKLSNkZWZpbmUgTlZfRE1BX1RBUkdFVF9QQ0kgICAgMgotI2RlZmluZSBOVl9ETUFfVEFSR0VUX0FHUCAgICAzCi0vKiBUaGUgZm9sbG93aW5nIGlzIG5vdCBhIHJlYWwgdmFsdWUgdXNlZCBieSB0aGUgY2FyZCwgaXQncyBjaGFuZ2VkIGJ5Ci0gKiBub3V2ZWF1X29iamVjdF9kbWFfY3JlYXRlICovCi0jZGVmaW5lIE5WX0RNQV9UQVJHRVRfUENJX05PTkxJTkVBUiA4Ci0KIC8qIFNvbWUgb2JqZWN0IGNsYXNzZXMgd2UgY2FyZSBhYm91dCBpbiB0aGUgZHJtICovCiAjZGVmaW5lIE5WX0NMQVNTX0RNQV9GUk9NX01FTU9SWSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKICNkZWZpbmUgTlZfQ0xBU1NfRE1BX1RPX01FTU9SWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMwpAQCAtMzMyLDYgKzMyNiw3IEBACiAjZGVmaW5lIE5WMDRfUEdSQVBIX0JTV0laWkxFNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDA2QTAKICNkZWZpbmUgTlYwM19QR1JBUEhfU1RBVFVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMDZCMAogI2RlZmluZSBOVjA0X1BHUkFQSF9TVEFUVVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAwNzAwCisjICAgIGRlZmluZSBOVjQwX1BHUkFQSF9TVEFUVVNfU1lOQ19TVEFMTCAgICAgICAgICAgICAgICAgIDB4MDAwMDQwMDAKICNkZWZpbmUgTlYwNF9QR1JBUEhfVFJBUFBFRF9BRERSICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMDcwNAogI2RlZmluZSBOVjA0X1BHUkFQSF9UUkFQUEVEX0RBVEEgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAwNzA4CiAjZGVmaW5lIE5WMDRfUEdSQVBIX1NVUkZBQ0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDA3MEMKQEAgLTM3OCw2ICszNzMsNyBAQAogI2RlZmluZSBOVjIwX1BHUkFQSF9UTElNSVQoaSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMDQwMDkwNCArIChpKjE2KSkKICNkZWZpbmUgTlYyMF9QR1JBUEhfVFNJWkUoaSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MDA0MDA5MDggKyAoaSoxNikpCiAjZGVmaW5lIE5WMjBfUEdSQVBIX1RTVEFUVVMoaSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDAwNDAwOTBDICsgKGkqMTYpKQorI2RlZmluZSBOVjIwX1BHUkFQSF9aQ09NUChpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMDQwMDk4MCArIDQqKGkpKQogI2RlZmluZSBOVjEwX1BHUkFQSF9USUxFKGkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMDQwMEIwMCArIChpKjE2KSkKICNkZWZpbmUgTlYxMF9QR1JBUEhfVExJTUlUKGkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MDA0MDBCMDQgKyAoaSoxNikpCiAjZGVmaW5lIE5WMTBfUEdSQVBIX1RTSVpFKGkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDAwNDAwQjA4ICsgKGkqMTYpKQpAQCAtNzE0LDMxICs3MTAsMzIgQEAKICNkZWZpbmUgTlY1MF9QRElTUExBWV9JTlRSXzFfQ0xLX1VOSzEwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTAKICNkZWZpbmUgTlY1MF9QRElTUExBWV9JTlRSXzFfQ0xLX1VOSzIwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMjAKICNkZWZpbmUgTlY1MF9QRElTUExBWV9JTlRSXzFfQ0xLX1VOSzQwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwNDAKLSNkZWZpbmUgTlY1MF9QRElTUExBWV9JTlRSX0VOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA2MTAwMmMKLSNkZWZpbmUgTlY1MF9QRElTUExBWV9JTlRSX0VOX1ZCTEFOS19DUlRDICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMGMKLSNkZWZpbmUgTlY1MF9QRElTUExBWV9JTlRSX0VOX1ZCTEFOS19DUlRDXyhuKSAgICAgICAgICAgICAgICAgICAoMSA8PCAoKG4pICsgMikpCi0jZGVmaW5lIE5WNTBfUERJU1BMQVlfSU5UUl9FTl9WQkxBTktfQ1JUQ18wICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0Ci0jZGVmaW5lIE5WNTBfUERJU1BMQVlfSU5UUl9FTl9WQkxBTktfQ1JUQ18xICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA4Ci0jZGVmaW5lIE5WNTBfUERJU1BMQVlfSU5UUl9FTl9DTEtfVU5LMTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDEwCi0jZGVmaW5lIE5WNTBfUERJU1BMQVlfSU5UUl9FTl9DTEtfVU5LMjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDIwCi0jZGVmaW5lIE5WNTBfUERJU1BMQVlfSU5UUl9FTl9DTEtfVU5LNDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDQwCisjZGVmaW5lIE5WNTBfUERJU1BMQVlfSU5UUl9FTl8wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNjEwMDI4CisjZGVmaW5lIE5WNTBfUERJU1BMQVlfSU5UUl9FTl8xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNjEwMDJjCisjZGVmaW5lIE5WNTBfUERJU1BMQVlfSU5UUl9FTl8xX1ZCTEFOS19DUlRDICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDBjCisjZGVmaW5lIE5WNTBfUERJU1BMQVlfSU5UUl9FTl8xX1ZCTEFOS19DUlRDXyhuKSAgICAgICAgICAgICAgICAgKDEgPDwgKChuKSArIDIpKQorI2RlZmluZSBOVjUwX1BESVNQTEFZX0lOVFJfRU5fMV9WQkxBTktfQ1JUQ18wICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAorI2RlZmluZSBOVjUwX1BESVNQTEFZX0lOVFJfRU5fMV9WQkxBTktfQ1JUQ18xICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwOAorI2RlZmluZSBOVjUwX1BESVNQTEFZX0lOVFJfRU5fMV9DTEtfVU5LMTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxMAorI2RlZmluZSBOVjUwX1BESVNQTEFZX0lOVFJfRU5fMV9DTEtfVU5LMjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAyMAorI2RlZmluZSBOVjUwX1BESVNQTEFZX0lOVFJfRU5fMV9DTEtfVU5LNDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA0MAogI2RlZmluZSBOVjUwX1BESVNQTEFZX1VOSzMwX0NUUkwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDYxMDAzMAogI2RlZmluZSBOVjUwX1BESVNQTEFZX1VOSzMwX0NUUkxfVVBEQVRFX1ZDTEswICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDIwMAogI2RlZmluZSBOVjUwX1BESVNQTEFZX1VOSzMwX0NUUkxfVVBEQVRFX1ZDTEsxICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQwMAogI2RlZmluZSBOVjUwX1BESVNQTEFZX1VOSzMwX0NUUkxfUEVORElORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDAwMDAwMAotI2RlZmluZSBOVjUwX1BESVNQTEFZX1RSQVBQRURfQUREUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDYxMDA4MAotI2RlZmluZSBOVjUwX1BESVNQTEFZX1RSQVBQRURfREFUQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDYxMDA4NAotI2RlZmluZSBOVjUwX1BESVNQTEFZX0NIQU5ORUxfU1RBVChpKSAgICAgICAgICAgICAgICAgICgoaSkgKiAweDEwICsgMHgwMDYxMDIwMCkKLSNkZWZpbmUgTlY1MF9QRElTUExBWV9DSEFOTkVMX1NUQVRfRE1BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTAKLSNkZWZpbmUgTlY1MF9QRElTUExBWV9DSEFOTkVMX1NUQVRfRE1BX0RJU0FCTEVEICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKLSNkZWZpbmUgTlY1MF9QRElTUExBWV9DSEFOTkVMX1NUQVRfRE1BX0VOQUJMRUQgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTAKLSNkZWZpbmUgTlY1MF9QRElTUExBWV9DSEFOTkVMX0RNQV9DQihpKSAgICAgICAgICAgICAgICAoKGkpICogMHgxMCArIDB4MDA2MTAyMDQpCi0jZGVmaW5lIE5WNTBfUERJU1BMQVlfQ0hBTk5FTF9ETUFfQ0JfTE9DQVRJT04gICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCi0jZGVmaW5lIE5WNTBfUERJU1BMQVlfQ0hBTk5FTF9ETUFfQ0JfTE9DQVRJT05fVlJBTSAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwCi0jZGVmaW5lIE5WNTBfUERJU1BMQVlfQ0hBTk5FTF9ETUFfQ0JfTE9DQVRJT05fU1lTVEVNICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCi0jZGVmaW5lIE5WNTBfUERJU1BMQVlfQ0hBTk5FTF9ETUFfQ0JfVkFMSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCi0jZGVmaW5lIE5WNTBfUERJU1BMQVlfQ0hBTk5FTF9VTksyKGkpICAgICAgICAgICAgICAgICAgKChpKSAqIDB4MTAgKyAweDAwNjEwMjA4KQotI2RlZmluZSBOVjUwX1BESVNQTEFZX0NIQU5ORUxfVU5LMyhpKSAgICAgICAgICAgICAgICAgICgoaSkgKiAweDEwICsgMHgwMDYxMDIwYykKKyNkZWZpbmUgTlY1MF9QRElTUExBWV9UUkFQUEVEX0FERFIoaSkgICAgICAgICAgICAgICAgICAoKGkpICogMHgwOCArIDB4MDA2MTAwODApCisjZGVmaW5lIE5WNTBfUERJU1BMQVlfVFJBUFBFRF9EQVRBKGkpICAgICAgICAgICAgICAgICAgKChpKSAqIDB4MDggKyAweDAwNjEwMDg0KQorI2RlZmluZSBOVjUwX1BESVNQTEFZX0VWT19DVFJMKGkpICAgICAgICAgICAgICAgICAgICAgICgoaSkgKiAweDEwICsgMHgwMDYxMDIwMCkKKyNkZWZpbmUgTlY1MF9QRElTUExBWV9FVk9fQ1RSTF9ETUEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTAKKyNkZWZpbmUgTlY1MF9QRElTUExBWV9FVk9fQ1RSTF9ETUFfRElTQUJMRUQgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgTlY1MF9QRElTUExBWV9FVk9fQ1RSTF9ETUFfRU5BQkxFRCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTAKKyNkZWZpbmUgTlY1MF9QRElTUExBWV9FVk9fRE1BX0NCKGkpICAgICAgICAgICAgICAgICAgICAoKGkpICogMHgxMCArIDB4MDA2MTAyMDQpCisjZGVmaW5lIE5WNTBfUERJU1BMQVlfRVZPX0RNQV9DQl9MT0NBVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIE5WNTBfUERJU1BMQVlfRVZPX0RNQV9DQl9MT0NBVElPTl9WUkFNICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIE5WNTBfUERJU1BMQVlfRVZPX0RNQV9DQl9MT0NBVElPTl9TWVNURU0gICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIE5WNTBfUERJU1BMQVlfRVZPX0RNQV9DQl9WQUxJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIE5WNTBfUERJU1BMQVlfRVZPX1VOSzIoaSkgICAgICAgICAgICAgICAgICAgICAgKChpKSAqIDB4MTAgKyAweDAwNjEwMjA4KQorI2RlZmluZSBOVjUwX1BESVNQTEFZX0VWT19IQVNIX1RBRyhpKSAgICAgICAgICAgICAgICAgICgoaSkgKiAweDEwICsgMHgwMDYxMDIwYykKIAogI2RlZmluZSBOVjUwX1BESVNQTEFZX0NVUlNPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDYxMDI3MAogI2RlZmluZSBOVjUwX1BESVNQTEFZX0NVUlNPUl9DVVJTT1JfQ1RSTDIoaSkgICAgICAgICAgICgoaSkgKiAweDEwICsgMHgwMDYxMDI3MCkKQEAgLTc0NiwxNSArNzQzLDExIEBACiAjZGVmaW5lIE5WNTBfUERJU1BMQVlfQ1VSU09SX0NVUlNPUl9DVFJMMl9TVEFUVVMgICAgICAgICAgICAgICAgICAgICAweDAwMDMwMDAwCiAjZGVmaW5lIE5WNTBfUERJU1BMQVlfQ1VSU09SX0NVUlNPUl9DVFJMMl9TVEFUVVNfQUNUSVZFICAgICAgICAgICAgICAweDAwMDEwMDAwCiAKLSNkZWZpbmUgTlY1MF9QRElTUExBWV9DVFJMX1NUQVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA2MTAzMDAKLSNkZWZpbmUgTlY1MF9QRElTUExBWV9DVFJMX1NUQVRFX1BFTkRJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAwMDAwMDAKLSNkZWZpbmUgTlY1MF9QRElTUExBWV9DVFJMX1NUQVRFX01FVEhPRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDFmZmMKLSNkZWZpbmUgTlY1MF9QRElTUExBWV9DVFJMX1NUQVRFX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKLSNkZWZpbmUgTlY1MF9QRElTUExBWV9DVFJMX1ZBTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA2MTAzMDQKLSNkZWZpbmUgTlY1MF9QRElTUExBWV9VTktfMzgwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA2MTAzODAKLSNkZWZpbmUgTlY1MF9QRElTUExBWV9SQU1fQU1PVU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA2MTAzODQKLSNkZWZpbmUgTlY1MF9QRElTUExBWV9VTktfMzg4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA2MTAzODgKLSNkZWZpbmUgTlY1MF9QRElTUExBWV9VTktfMzhDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA2MTAzOGMKKyNkZWZpbmUgTlY1MF9QRElTUExBWV9QSU9fQ1RSTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA2MTAzMDAKKyNkZWZpbmUgTlY1MF9QRElTUExBWV9QSU9fQ1RSTF9QRU5ESU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAwMDAwMDAKKyNkZWZpbmUgTlY1MF9QRElTUExBWV9QSU9fQ1RSTF9NVEhEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDFmZmMKKyNkZWZpbmUgTlY1MF9QRElTUExBWV9QSU9fQ1RSTF9FTkFCTEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgTlY1MF9QRElTUExBWV9QSU9fREFUQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA2MTAzMDQKIAogI2RlZmluZSBOVjUwX1BESVNQTEFZX0NSVENfUChpLCByKSAgICAgICAgKChpKSAqIDB4NTQwICsgTlY1MF9QRElTUExBWV9DUlRDXyMjcikKICNkZWZpbmUgTlY1MF9QRElTUExBWV9DUlRDX0MoaSwgcikgICAgKDQgKyAoaSkgKiAweDU0MCArIE5WNTBfUERJU1BMQVlfQ1JUQ18jI3IpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X3NnZG1hLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X3NnZG1hLmMKaW5kZXggZDRhYzk3MC4uOWEyNTBlYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9zZ2RtYS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfc2dkbWEuYwpAQCAtMTQsNyArMTQsNyBAQAogCWRtYV9hZGRyX3QgKnBhZ2VzOwogCXVuc2lnbmVkIG5yX3BhZ2VzOwogCi0JdW5zaWduZWQgcHRlX3N0YXJ0OworCXU2NCBvZmZzZXQ7CiAJYm9vbCBib3VuZDsKIH07CiAKQEAgLTc0LDE4ICs3NCw2IEBACiAJfQogfQogCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkCi1ub3V2ZWF1X3NnZG1hX3B0ZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1aW50NjRfdCBvZmZzZXQpCi17Ci0Jc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQl1bnNpZ25lZCBwdGUgPSAob2Zmc2V0ID4+IE5WX0NUWERNQV9QQUdFX1NISUZUKTsKLQotCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlIDwgTlZfNTApCi0JCXJldHVybiBwdGUgKyAyOwotCi0JcmV0dXJuIHB0ZSA8PCAxOwotfQotCiBzdGF0aWMgaW50CiBub3V2ZWF1X3NnZG1hX2JpbmQoc3RydWN0IHR0bV9iYWNrZW5kICpiZSwgc3RydWN0IHR0bV9tZW1fcmVnICptZW0pCiB7CkBAIC05NywzMiArODUsMTcgQEAKIAogCU5WX0RFQlVHKGRldiwgInBnPTB4JWx4XG4iLCBtZW0tPnN0YXJ0KTsKIAotCXB0ZSA9IG5vdXZlYXVfc2dkbWFfcHRlKG52YmUtPmRldiwgbWVtLT5zdGFydCA8PCBQQUdFX1NISUZUKTsKLQludmJlLT5wdGVfc3RhcnQgPSBwdGU7CisJbnZiZS0+b2Zmc2V0ID0gbWVtLT5zdGFydCA8PCBQQUdFX1NISUZUOworCXB0ZSA9IChudmJlLT5vZmZzZXQgPj4gTlZfQ1RYRE1BX1BBR0VfU0hJRlQpICsgMjsKIAlmb3IgKGkgPSAwOyBpIDwgbnZiZS0+bnJfcGFnZXM7IGkrKykgewogCQlkbWFfYWRkcl90IGRtYV9vZmZzZXQgPSBudmJlLT5wYWdlc1tpXTsKIAkJdWludDMyX3Qgb2Zmc2V0X2wgPSBsb3dlcl8zMl9iaXRzKGRtYV9vZmZzZXQpOwotCQl1aW50MzJfdCBvZmZzZXRfaCA9IHVwcGVyXzMyX2JpdHMoZG1hX29mZnNldCk7CiAKLQkJZm9yIChqID0gMDsgaiA8IFBBR0VfU0laRSAvIE5WX0NUWERNQV9QQUdFX1NJWkU7IGorKykgewotCQkJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPCBOVl81MCkgewotCQkJCW52X3dvMzIoZ3B1b2JqLCAocHRlICogNCkgKyAwLCBvZmZzZXRfbCB8IDMpOwotCQkJCXB0ZSArPSAxOwotCQkJfSBlbHNlIHsKLQkJCQludl93bzMyKGdwdW9iaiwgKHB0ZSAqIDQpICsgMCwgb2Zmc2V0X2wgfCAweDIxKTsKLQkJCQludl93bzMyKGdwdW9iaiwgKHB0ZSAqIDQpICsgNCwgb2Zmc2V0X2ggJiAweGZmKTsKLQkJCQlwdGUgKz0gMjsKLQkJCX0KLQorCQlmb3IgKGogPSAwOyBqIDwgUEFHRV9TSVpFIC8gTlZfQ1RYRE1BX1BBR0VfU0laRTsgaisrLCBwdGUrKykgeworCQkJbnZfd28zMihncHVvYmosIChwdGUgKiA0KSArIDAsIG9mZnNldF9sIHwgMyk7CiAJCQlkbWFfb2Zmc2V0ICs9IE5WX0NUWERNQV9QQUdFX1NJWkU7CiAJCX0KIAl9Ci0JZGV2X3ByaXYtPmVuZ2luZS5pbnN0bWVtLmZsdXNoKG52YmUtPmRldik7Ci0KLQlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA9PSBOVl81MCkgewotCQlkZXZfcHJpdi0+ZW5naW5lLmZpZm8udGxiX2ZsdXNoKGRldik7Ci0JCWRldl9wcml2LT5lbmdpbmUuZ3JhcGgudGxiX2ZsdXNoKGRldik7Ci0JfQogCiAJbnZiZS0+Ym91bmQgPSB0cnVlOwogCXJldHVybiAwOwpAQCAtMTQyLDI4ICsxMTUsMTAgQEAKIAlpZiAoIW52YmUtPmJvdW5kKQogCQlyZXR1cm4gMDsKIAotCXB0ZSA9IG52YmUtPnB0ZV9zdGFydDsKKwlwdGUgPSAobnZiZS0+b2Zmc2V0ID4+IE5WX0NUWERNQV9QQUdFX1NISUZUKSArIDI7CiAJZm9yIChpID0gMDsgaSA8IG52YmUtPm5yX3BhZ2VzOyBpKyspIHsKLQkJZG1hX2FkZHJfdCBkbWFfb2Zmc2V0ID0gZGV2X3ByaXYtPmdhcnRfaW5mby5zZ19kdW1teV9idXM7Ci0KLQkJZm9yIChqID0gMDsgaiA8IFBBR0VfU0laRSAvIE5WX0NUWERNQV9QQUdFX1NJWkU7IGorKykgewotCQkJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPCBOVl81MCkgewotCQkJCW52X3dvMzIoZ3B1b2JqLCAocHRlICogNCkgKyAwLCBkbWFfb2Zmc2V0IHwgMyk7Ci0JCQkJcHRlICs9IDE7Ci0JCQl9IGVsc2UgewotCQkJCW52X3dvMzIoZ3B1b2JqLCAocHRlICogNCkgKyAwLCAweDAwMDAwMDAwKTsKLQkJCQludl93bzMyKGdwdW9iaiwgKHB0ZSAqIDQpICsgNCwgMHgwMDAwMDAwMCk7Ci0JCQkJcHRlICs9IDI7Ci0JCQl9Ci0KLQkJCWRtYV9vZmZzZXQgKz0gTlZfQ1RYRE1BX1BBR0VfU0laRTsKLQkJfQotCX0KLQlkZXZfcHJpdi0+ZW5naW5lLmluc3RtZW0uZmx1c2gobnZiZS0+ZGV2KTsKLQotCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlID09IE5WXzUwKSB7Ci0JCWRldl9wcml2LT5lbmdpbmUuZmlmby50bGJfZmx1c2goZGV2KTsKLQkJZGV2X3ByaXYtPmVuZ2luZS5ncmFwaC50bGJfZmx1c2goZGV2KTsKKwkJZm9yIChqID0gMDsgaiA8IFBBR0VfU0laRSAvIE5WX0NUWERNQV9QQUdFX1NJWkU7IGorKywgcHRlKyspCisJCQludl93bzMyKGdwdW9iaiwgKHB0ZSAqIDQpICsgMCwgMHgwMDAwMDAwMCk7CiAJfQogCiAJbnZiZS0+Ym91bmQgPSBmYWxzZTsKQEAgLTE4Niw2ICsxNDEsMzUgQEAKIAl9CiB9CiAKK3N0YXRpYyBpbnQKK252NTBfc2dkbWFfYmluZChzdHJ1Y3QgdHRtX2JhY2tlbmQgKmJlLCBzdHJ1Y3QgdHRtX21lbV9yZWcgKm1lbSkKK3sKKwlzdHJ1Y3Qgbm91dmVhdV9zZ2RtYV9iZSAqbnZiZSA9IChzdHJ1Y3Qgbm91dmVhdV9zZ2RtYV9iZSAqKWJlOworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IG52YmUtPmRldi0+ZGV2X3ByaXZhdGU7CisKKwludmJlLT5vZmZzZXQgPSBtZW0tPnN0YXJ0IDw8IFBBR0VfU0hJRlQ7CisKKwlub3V2ZWF1X3ZtX21hcF9zZygmZGV2X3ByaXYtPmdhcnRfaW5mby52bWEsIG52YmUtPm9mZnNldCwKKwkJCSAgbnZiZS0+bnJfcGFnZXMgPDwgUEFHRV9TSElGVCwgbnZiZS0+cGFnZXMpOworCW52YmUtPmJvdW5kID0gdHJ1ZTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorbnY1MF9zZ2RtYV91bmJpbmQoc3RydWN0IHR0bV9iYWNrZW5kICpiZSkKK3sKKwlzdHJ1Y3Qgbm91dmVhdV9zZ2RtYV9iZSAqbnZiZSA9IChzdHJ1Y3Qgbm91dmVhdV9zZ2RtYV9iZSAqKWJlOworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IG52YmUtPmRldi0+ZGV2X3ByaXZhdGU7CisKKwlpZiAoIW52YmUtPmJvdW5kKQorCQlyZXR1cm4gMDsKKworCW5vdXZlYXVfdm1fdW5tYXBfYXQoJmRldl9wcml2LT5nYXJ0X2luZm8udm1hLCBudmJlLT5vZmZzZXQsCisJCQkgICAgbnZiZS0+bnJfcGFnZXMgPDwgUEFHRV9TSElGVCk7CisJbnZiZS0+Ym91bmQgPSBmYWxzZTsKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIHN0cnVjdCB0dG1fYmFja2VuZF9mdW5jIG5vdXZlYXVfc2dkbWFfYmFja2VuZCA9IHsKIAkucG9wdWxhdGUJCT0gbm91dmVhdV9zZ2RtYV9wb3B1bGF0ZSwKIAkuY2xlYXIJCQk9IG5vdXZlYXVfc2dkbWFfY2xlYXIsCkBAIC0xOTQsMjMgKzE3OCwzMCBAQAogCS5kZXN0cm95CQk9IG5vdXZlYXVfc2dkbWFfZGVzdHJveQogfTsKIAorc3RhdGljIHN0cnVjdCB0dG1fYmFja2VuZF9mdW5jIG52NTBfc2dkbWFfYmFja2VuZCA9IHsKKwkucG9wdWxhdGUJCT0gbm91dmVhdV9zZ2RtYV9wb3B1bGF0ZSwKKwkuY2xlYXIJCQk9IG5vdXZlYXVfc2dkbWFfY2xlYXIsCisJLmJpbmQJCQk9IG52NTBfc2dkbWFfYmluZCwKKwkudW5iaW5kCQkJPSBudjUwX3NnZG1hX3VuYmluZCwKKwkuZGVzdHJveQkJPSBub3V2ZWF1X3NnZG1hX2Rlc3Ryb3kKK307CisKIHN0cnVjdCB0dG1fYmFja2VuZCAqCiBub3V2ZWF1X3NnZG1hX2luaXRfdHRtKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlzdHJ1Y3Qgbm91dmVhdV9zZ2RtYV9iZSAqbnZiZTsKIAotCWlmICghZGV2X3ByaXYtPmdhcnRfaW5mby5zZ19jdHhkbWEpCi0JCXJldHVybiBOVUxMOwotCiAJbnZiZSA9IGt6YWxsb2Moc2l6ZW9mKCpudmJlKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFudmJlKQogCQlyZXR1cm4gTlVMTDsKIAogCW52YmUtPmRldiA9IGRldjsKIAotCW52YmUtPmJhY2tlbmQuZnVuYwk9ICZub3V2ZWF1X3NnZG1hX2JhY2tlbmQ7Ci0KKwlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA8IE5WXzUwKQorCQludmJlLT5iYWNrZW5kLmZ1bmMgPSAmbm91dmVhdV9zZ2RtYV9iYWNrZW5kOworCWVsc2UKKwkJbnZiZS0+YmFja2VuZC5mdW5jID0gJm52NTBfc2dkbWFfYmFja2VuZDsKIAlyZXR1cm4gJm52YmUtPmJhY2tlbmQ7CiB9CiAKQEAgLTIxOCw3ICsyMDksNiBAQAogbm91dmVhdV9zZ2RtYV9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGRldi0+cGRldjsKIAlzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKmdwdW9iaiA9IE5VTEw7CiAJdWludDMyX3QgYXBlcl9zaXplLCBvYmpfc2l6ZTsKIAlpbnQgaSwgcmV0OwpAQCAtMjMxLDY4ICsyMjEsNDAgQEAKIAogCQlvYmpfc2l6ZSAgPSAoYXBlcl9zaXplID4+IE5WX0NUWERNQV9QQUdFX1NISUZUKSAqIDQ7CiAJCW9ial9zaXplICs9IDg7IC8qIGN0eGRtYSBoZWFkZXIgKi8KLQl9IGVsc2UgewotCQkvKiAxIGVudGlyZSBWTSBwYWdlIHRhYmxlICovCi0JCWFwZXJfc2l6ZSA9ICg1MTIgKiAxMDI0ICogMTAyNCk7Ci0JCW9ial9zaXplICA9IChhcGVyX3NpemUgPj4gTlZfQ1RYRE1BX1BBR0VfU0hJRlQpICogODsKLQl9CiAKLQlyZXQgPSBub3V2ZWF1X2dwdW9ial9uZXcoZGV2LCBOVUxMLCBvYmpfc2l6ZSwgMTYsCi0JCQkJICAgICAgTlZPQkpfRkxBR19aRVJPX0FMTE9DIHwKLQkJCQkgICAgICBOVk9CSl9GTEFHX1pFUk9fRlJFRSwgJmdwdW9iaik7Ci0JaWYgKHJldCkgewotCQlOVl9FUlJPUihkZXYsICJFcnJvciBjcmVhdGluZyBzZ2RtYSBvYmplY3Q6ICVkXG4iLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KKwkJcmV0ID0gbm91dmVhdV9ncHVvYmpfbmV3KGRldiwgTlVMTCwgb2JqX3NpemUsIDE2LAorCQkJCQkgICAgICBOVk9CSl9GTEFHX1pFUk9fQUxMT0MgfAorCQkJCQkgICAgICBOVk9CSl9GTEFHX1pFUk9fRlJFRSwgJmdwdW9iaik7CisJCWlmIChyZXQpIHsKKwkJCU5WX0VSUk9SKGRldiwgIkVycm9yIGNyZWF0aW5nIHNnZG1hIG9iamVjdDogJWRcbiIsIHJldCk7CisJCQlyZXR1cm4gcmV0OworCQl9CiAKLQlkZXZfcHJpdi0+Z2FydF9pbmZvLnNnX2R1bW15X3BhZ2UgPQotCQlhbGxvY19wYWdlKEdGUF9LRVJORUx8X19HRlBfRE1BMzJ8X19HRlBfWkVSTyk7Ci0JaWYgKCFkZXZfcHJpdi0+Z2FydF9pbmZvLnNnX2R1bW15X3BhZ2UpIHsKLQkJbm91dmVhdV9ncHVvYmpfcmVmKE5VTEwsICZncHVvYmopOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQlzZXRfYml0KFBHX2xvY2tlZCwgJmRldl9wcml2LT5nYXJ0X2luZm8uc2dfZHVtbXlfcGFnZS0+ZmxhZ3MpOwotCWRldl9wcml2LT5nYXJ0X2luZm8uc2dfZHVtbXlfYnVzID0KLQkJcGNpX21hcF9wYWdlKHBkZXYsIGRldl9wcml2LT5nYXJ0X2luZm8uc2dfZHVtbXlfcGFnZSwgMCwKLQkJCSAgICAgUEFHRV9TSVpFLCBQQ0lfRE1BX0JJRElSRUNUSU9OQUwpOwotCWlmIChwY2lfZG1hX21hcHBpbmdfZXJyb3IocGRldiwgZGV2X3ByaXYtPmdhcnRfaW5mby5zZ19kdW1teV9idXMpKSB7Ci0JCW5vdXZlYXVfZ3B1b2JqX3JlZihOVUxMLCAmZ3B1b2JqKTsKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JfQotCi0JaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPCBOVl81MCkgewotCQkvKiBzcGVjaWFsIGNhc2UsIGFsbG9jYXRlZCBmcm9tIGdsb2JhbCBpbnN0bWVtIGhlYXAgc28KLQkJICogY2luc3QgaXMgaW52YWxpZCwgd2UgdXNlIGl0IG9uIGFsbCBjaGFubmVscyB0aG91Z2ggc28KLQkJICogY2luc3QgbmVlZHMgdG8gYmUgdmFsaWQsIHNldCBpdCB0aGUgc2FtZSBhcyBwaW5zdAotCQkgKi8KLQkJZ3B1b2JqLT5jaW5zdCA9IGdwdW9iai0+cGluc3Q7Ci0KLQkJLyogTWF5YmUgdXNlIE5WX0RNQV9UQVJHRVRfQUdQIGZvciBQQ0lFPyBOVklESUEgZG8gdGhpcywgYW5kCi0JCSAqIGNvbmZpcm1lZCB0byB3b3JrIG9uIGM1MS4gIFBlcmhhcHMgbWVhbnMgTlZfRE1BX1RBUkdFVF9QQ0lFCi0JCSAqIG9uIHRob3NlIGNhcmRzPyAqLwogCQludl93bzMyKGdwdW9iaiwgMCwgTlZfQ0xBU1NfRE1BX0lOX01FTU9SWSB8CiAJCQkJICAgKDEgPDwgMTIpIC8qIFBUIHByZXNlbnQgKi8gfAogCQkJCSAgICgwIDw8IDEzKSAvKiBQVCAqbm90KiBsaW5lYXIgKi8gfAotCQkJCSAgIChOVl9ETUFfQUNDRVNTX1JXICA8PCAxNCkgfAotCQkJCSAgIChOVl9ETUFfVEFSR0VUX1BDSSA8PCAxNikpOworCQkJCSAgICgwIDw8IDE0KSAvKiBSVyAqLyB8CisJCQkJICAgKDIgPDwgMTYpIC8qIFBDSSAqLyk7CiAJCW52X3dvMzIoZ3B1b2JqLCA0LCBhcGVyX3NpemUgLSAxKTsKLQkJZm9yIChpID0gMjsgaSA8IDIgKyAoYXBlcl9zaXplID4+IDEyKTsgaSsrKSB7Ci0JCQludl93bzMyKGdwdW9iaiwgaSAqIDQsCi0JCQkJZGV2X3ByaXYtPmdhcnRfaW5mby5zZ19kdW1teV9idXMgfCAzKTsKLQkJfQotCX0gZWxzZSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBvYmpfc2l6ZTsgaSArPSA4KSB7Ci0JCQludl93bzMyKGdwdW9iaiwgaSArIDAsIDB4MDAwMDAwMDApOwotCQkJbnZfd28zMihncHVvYmosIGkgKyA0LCAweDAwMDAwMDAwKTsKLQkJfQorCQlmb3IgKGkgPSAyOyBpIDwgMiArIChhcGVyX3NpemUgPj4gMTIpOyBpKyspCisJCQludl93bzMyKGdwdW9iaiwgaSAqIDQsIDB4MDAwMDAwMDApOworCisJCWRldl9wcml2LT5nYXJ0X2luZm8uc2dfY3R4ZG1hID0gZ3B1b2JqOworCQlkZXZfcHJpdi0+Z2FydF9pbmZvLmFwZXJfYmFzZSA9IDA7CisJCWRldl9wcml2LT5nYXJ0X2luZm8uYXBlcl9zaXplID0gYXBlcl9zaXplOworCX0gZWxzZQorCWlmIChkZXZfcHJpdi0+Y2hhbl92bSkgeworCQlyZXQgPSBub3V2ZWF1X3ZtX2dldChkZXZfcHJpdi0+Y2hhbl92bSwgNTEyICogMTAyNCAqIDEwMjQsCisJCQkJICAgICAxMiwgTlZfTUVNX0FDQ0VTU19SVywKKwkJCQkgICAgICZkZXZfcHJpdi0+Z2FydF9pbmZvLnZtYSk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCisJCWRldl9wcml2LT5nYXJ0X2luZm8uYXBlcl9iYXNlID0gZGV2X3ByaXYtPmdhcnRfaW5mby52bWEub2Zmc2V0OworCQlkZXZfcHJpdi0+Z2FydF9pbmZvLmFwZXJfc2l6ZSA9IDUxMiAqIDEwMjQgKiAxMDI0OwogCX0KLQlkZXZfcHJpdi0+ZW5naW5lLmluc3RtZW0uZmx1c2goZGV2KTsKIAogCWRldl9wcml2LT5nYXJ0X2luZm8udHlwZSAgICAgID0gTk9VVkVBVV9HQVJUX1NHRE1BOwotCWRldl9wcml2LT5nYXJ0X2luZm8uYXBlcl9iYXNlID0gMDsKLQlkZXZfcHJpdi0+Z2FydF9pbmZvLmFwZXJfc2l6ZSA9IGFwZXJfc2l6ZTsKLQlkZXZfcHJpdi0+Z2FydF9pbmZvLnNnX2N0eGRtYSA9IGdwdW9iajsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMzAxLDMxICsyNjMsMTkgQEAKIHsKIAlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCi0JaWYgKGRldl9wcml2LT5nYXJ0X2luZm8uc2dfZHVtbXlfcGFnZSkgewotCQlwY2lfdW5tYXBfcGFnZShkZXYtPnBkZXYsIGRldl9wcml2LT5nYXJ0X2luZm8uc2dfZHVtbXlfYnVzLAotCQkJICAgICAgIE5WX0NUWERNQV9QQUdFX1NJWkUsIFBDSV9ETUFfQklESVJFQ1RJT05BTCk7Ci0JCXVubG9ja19wYWdlKGRldl9wcml2LT5nYXJ0X2luZm8uc2dfZHVtbXlfcGFnZSk7Ci0JCV9fZnJlZV9wYWdlKGRldl9wcml2LT5nYXJ0X2luZm8uc2dfZHVtbXlfcGFnZSk7Ci0JCWRldl9wcml2LT5nYXJ0X2luZm8uc2dfZHVtbXlfcGFnZSA9IE5VTEw7Ci0JCWRldl9wcml2LT5nYXJ0X2luZm8uc2dfZHVtbXlfYnVzID0gMDsKLQl9Ci0KIAlub3V2ZWF1X2dwdW9ial9yZWYoTlVMTCwgJmRldl9wcml2LT5nYXJ0X2luZm8uc2dfY3R4ZG1hKTsKKwlub3V2ZWF1X3ZtX3B1dCgmZGV2X3ByaXYtPmdhcnRfaW5mby52bWEpOwogfQogCi1pbnQKLW5vdXZlYXVfc2dkbWFfZ2V0X3BhZ2Uoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdWludDMyX3Qgb2Zmc2V0LCB1aW50MzJfdCAqcGFnZSkKK3VpbnQzMl90Citub3V2ZWF1X3NnZG1hX2dldF9waHlzaWNhbChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1aW50MzJfdCBvZmZzZXQpCiB7CiAJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKmdwdW9iaiA9IGRldl9wcml2LT5nYXJ0X2luZm8uc2dfY3R4ZG1hOwotCWludCBwdGU7CisJaW50IHB0ZSA9IChvZmZzZXQgPj4gTlZfQ1RYRE1BX1BBR0VfU0hJRlQpICsgMjsKIAotCXB0ZSA9IChvZmZzZXQgPj4gTlZfQ1RYRE1BX1BBR0VfU0hJRlQpIDw8IDI7Ci0JaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPCBOVl81MCkgewotCQkqcGFnZSA9IG52X3JvMzIoZ3B1b2JqLCAocHRlICsgOCkpICYgfk5WX0NUWERNQV9QQUdFX01BU0s7Ci0JCXJldHVybiAwOwotCX0KKwlCVUdfT04oZGV2X3ByaXYtPmNhcmRfdHlwZSA+PSBOVl81MCk7CiAKLQlOVl9FUlJPUihkZXYsICJVbmltcGxlbWVudGVkIG9uIE5WNTBcbiIpOwotCXJldHVybiAtRUlOVkFMOworCXJldHVybiAobnZfcm8zMihncHVvYmosIDQgKiBwdGUpICYgfk5WX0NUWERNQV9QQUdFX01BU0spIHwKKwkJKG9mZnNldCAmIE5WX0NUWERNQV9QQUdFX01BU0spOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9zdGF0ZS5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9zdGF0ZS5jCmluZGV4IDA0OWY3NTUuLmE1NGZjNDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfc3RhdGUuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X3N0YXRlLmMKQEAgLTUzLDEwICs1MywxMCBAQAogCQllbmdpbmUtPmluc3RtZW0udGFrZWRvd24JPSBudjA0X2luc3RtZW1fdGFrZWRvd247CiAJCWVuZ2luZS0+aW5zdG1lbS5zdXNwZW5kCQk9IG52MDRfaW5zdG1lbV9zdXNwZW5kOwogCQllbmdpbmUtPmluc3RtZW0ucmVzdW1lCQk9IG52MDRfaW5zdG1lbV9yZXN1bWU7Ci0JCWVuZ2luZS0+aW5zdG1lbS5wb3B1bGF0ZQk9IG52MDRfaW5zdG1lbV9wb3B1bGF0ZTsKLQkJZW5naW5lLT5pbnN0bWVtLmNsZWFyCQk9IG52MDRfaW5zdG1lbV9jbGVhcjsKLQkJZW5naW5lLT5pbnN0bWVtLmJpbmQJCT0gbnYwNF9pbnN0bWVtX2JpbmQ7Ci0JCWVuZ2luZS0+aW5zdG1lbS51bmJpbmQJCT0gbnYwNF9pbnN0bWVtX3VuYmluZDsKKwkJZW5naW5lLT5pbnN0bWVtLmdldAkJPSBudjA0X2luc3RtZW1fZ2V0OworCQllbmdpbmUtPmluc3RtZW0ucHV0CQk9IG52MDRfaW5zdG1lbV9wdXQ7CisJCWVuZ2luZS0+aW5zdG1lbS5tYXAJCT0gbnYwNF9pbnN0bWVtX21hcDsKKwkJZW5naW5lLT5pbnN0bWVtLnVubWFwCQk9IG52MDRfaW5zdG1lbV91bm1hcDsKIAkJZW5naW5lLT5pbnN0bWVtLmZsdXNoCQk9IG52MDRfaW5zdG1lbV9mbHVzaDsKIAkJZW5naW5lLT5tYy5pbml0CQkJPSBudjA0X21jX2luaXQ7CiAJCWVuZ2luZS0+bWMudGFrZWRvd24JCT0gbnYwNF9tY190YWtlZG93bjsKQEAgLTY1LDcgKzY1LDYgQEAKIAkJZW5naW5lLT50aW1lci50YWtlZG93bgkJPSBudjA0X3RpbWVyX3Rha2Vkb3duOwogCQllbmdpbmUtPmZiLmluaXQJCQk9IG52MDRfZmJfaW5pdDsKIAkJZW5naW5lLT5mYi50YWtlZG93bgkJPSBudjA0X2ZiX3Rha2Vkb3duOwotCQllbmdpbmUtPmdyYXBoLmdyY2xhc3MJCT0gbnYwNF9ncmFwaF9ncmNsYXNzOwogCQllbmdpbmUtPmdyYXBoLmluaXQJCT0gbnYwNF9ncmFwaF9pbml0OwogCQllbmdpbmUtPmdyYXBoLnRha2Vkb3duCQk9IG52MDRfZ3JhcGhfdGFrZWRvd247CiAJCWVuZ2luZS0+Z3JhcGguZmlmb19hY2Nlc3MJPSBudjA0X2dyYXBoX2ZpZm9fYWNjZXNzOwpAQCAtNzYsNyArNzUsNyBAQAogCQllbmdpbmUtPmdyYXBoLnVubG9hZF9jb250ZXh0CT0gbnYwNF9ncmFwaF91bmxvYWRfY29udGV4dDsKIAkJZW5naW5lLT5maWZvLmNoYW5uZWxzCQk9IDE2OwogCQllbmdpbmUtPmZpZm8uaW5pdAkJPSBudjA0X2ZpZm9faW5pdDsKLQkJZW5naW5lLT5maWZvLnRha2Vkb3duCQk9IG5vdXZlYXVfc3R1Yl90YWtlZG93bjsKKwkJZW5naW5lLT5maWZvLnRha2Vkb3duCQk9IG52MDRfZmlmb19maW5pOwogCQllbmdpbmUtPmZpZm8uZGlzYWJsZQkJPSBudjA0X2ZpZm9fZGlzYWJsZTsKIAkJZW5naW5lLT5maWZvLmVuYWJsZQkJPSBudjA0X2ZpZm9fZW5hYmxlOwogCQllbmdpbmUtPmZpZm8ucmVhc3NpZ24JCT0gbnYwNF9maWZvX3JlYXNzaWduOwpAQCAtOTksMTYgKzk4LDIwIEBACiAJCWVuZ2luZS0+cG0uY2xvY2tfZ2V0CQk9IG52MDRfcG1fY2xvY2tfZ2V0OwogCQllbmdpbmUtPnBtLmNsb2NrX3ByZQkJPSBudjA0X3BtX2Nsb2NrX3ByZTsKIAkJZW5naW5lLT5wbS5jbG9ja19zZXQJCT0gbnYwNF9wbV9jbG9ja19zZXQ7CisJCWVuZ2luZS0+Y3J5cHQuaW5pdAkJPSBub3V2ZWF1X3N0dWJfaW5pdDsKKwkJZW5naW5lLT5jcnlwdC50YWtlZG93bgkJPSBub3V2ZWF1X3N0dWJfdGFrZWRvd247CisJCWVuZ2luZS0+dnJhbS5pbml0CQk9IG5vdXZlYXVfbWVtX2RldGVjdDsKKwkJZW5naW5lLT52cmFtLmZsYWdzX3ZhbGlkCT0gbm91dmVhdV9tZW1fZmxhZ3NfdmFsaWQ7CiAJCWJyZWFrOwogCWNhc2UgMHgxMDoKIAkJZW5naW5lLT5pbnN0bWVtLmluaXQJCT0gbnYwNF9pbnN0bWVtX2luaXQ7CiAJCWVuZ2luZS0+aW5zdG1lbS50YWtlZG93bgk9IG52MDRfaW5zdG1lbV90YWtlZG93bjsKIAkJZW5naW5lLT5pbnN0bWVtLnN1c3BlbmQJCT0gbnYwNF9pbnN0bWVtX3N1c3BlbmQ7CiAJCWVuZ2luZS0+aW5zdG1lbS5yZXN1bWUJCT0gbnYwNF9pbnN0bWVtX3Jlc3VtZTsKLQkJZW5naW5lLT5pbnN0bWVtLnBvcHVsYXRlCT0gbnYwNF9pbnN0bWVtX3BvcHVsYXRlOwotCQllbmdpbmUtPmluc3RtZW0uY2xlYXIJCT0gbnYwNF9pbnN0bWVtX2NsZWFyOwotCQllbmdpbmUtPmluc3RtZW0uYmluZAkJPSBudjA0X2luc3RtZW1fYmluZDsKLQkJZW5naW5lLT5pbnN0bWVtLnVuYmluZAkJPSBudjA0X2luc3RtZW1fdW5iaW5kOworCQllbmdpbmUtPmluc3RtZW0uZ2V0CQk9IG52MDRfaW5zdG1lbV9nZXQ7CisJCWVuZ2luZS0+aW5zdG1lbS5wdXQJCT0gbnYwNF9pbnN0bWVtX3B1dDsKKwkJZW5naW5lLT5pbnN0bWVtLm1hcAkJPSBudjA0X2luc3RtZW1fbWFwOworCQllbmdpbmUtPmluc3RtZW0udW5tYXAJCT0gbnYwNF9pbnN0bWVtX3VubWFwOwogCQllbmdpbmUtPmluc3RtZW0uZmx1c2gJCT0gbnYwNF9pbnN0bWVtX2ZsdXNoOwogCQllbmdpbmUtPm1jLmluaXQJCQk9IG52MDRfbWNfaW5pdDsKIAkJZW5naW5lLT5tYy50YWtlZG93bgkJPSBudjA0X21jX3Rha2Vkb3duOwpAQCAtMTE3LDggKzEyMCw5IEBACiAJCWVuZ2luZS0+dGltZXIudGFrZWRvd24JCT0gbnYwNF90aW1lcl90YWtlZG93bjsKIAkJZW5naW5lLT5mYi5pbml0CQkJPSBudjEwX2ZiX2luaXQ7CiAJCWVuZ2luZS0+ZmIudGFrZWRvd24JCT0gbnYxMF9mYl90YWtlZG93bjsKLQkJZW5naW5lLT5mYi5zZXRfcmVnaW9uX3RpbGluZwk9IG52MTBfZmJfc2V0X3JlZ2lvbl90aWxpbmc7Ci0JCWVuZ2luZS0+Z3JhcGguZ3JjbGFzcwkJPSBudjEwX2dyYXBoX2dyY2xhc3M7CisJCWVuZ2luZS0+ZmIuaW5pdF90aWxlX3JlZ2lvbgk9IG52MTBfZmJfaW5pdF90aWxlX3JlZ2lvbjsKKwkJZW5naW5lLT5mYi5zZXRfdGlsZV9yZWdpb24JPSBudjEwX2ZiX3NldF90aWxlX3JlZ2lvbjsKKwkJZW5naW5lLT5mYi5mcmVlX3RpbGVfcmVnaW9uCT0gbnYxMF9mYl9mcmVlX3RpbGVfcmVnaW9uOwogCQllbmdpbmUtPmdyYXBoLmluaXQJCT0gbnYxMF9ncmFwaF9pbml0OwogCQllbmdpbmUtPmdyYXBoLnRha2Vkb3duCQk9IG52MTBfZ3JhcGhfdGFrZWRvd247CiAJCWVuZ2luZS0+Z3JhcGguY2hhbm5lbAkJPSBudjEwX2dyYXBoX2NoYW5uZWw7CkBAIC0xMjcsMTcgKzEzMSwxNyBAQAogCQllbmdpbmUtPmdyYXBoLmZpZm9fYWNjZXNzCT0gbnYwNF9ncmFwaF9maWZvX2FjY2VzczsKIAkJZW5naW5lLT5ncmFwaC5sb2FkX2NvbnRleHQJPSBudjEwX2dyYXBoX2xvYWRfY29udGV4dDsKIAkJZW5naW5lLT5ncmFwaC51bmxvYWRfY29udGV4dAk9IG52MTBfZ3JhcGhfdW5sb2FkX2NvbnRleHQ7Ci0JCWVuZ2luZS0+Z3JhcGguc2V0X3JlZ2lvbl90aWxpbmcJPSBudjEwX2dyYXBoX3NldF9yZWdpb25fdGlsaW5nOworCQllbmdpbmUtPmdyYXBoLnNldF90aWxlX3JlZ2lvbgk9IG52MTBfZ3JhcGhfc2V0X3RpbGVfcmVnaW9uOwogCQllbmdpbmUtPmZpZm8uY2hhbm5lbHMJCT0gMzI7CiAJCWVuZ2luZS0+Zmlmby5pbml0CQk9IG52MTBfZmlmb19pbml0OwotCQllbmdpbmUtPmZpZm8udGFrZWRvd24JCT0gbm91dmVhdV9zdHViX3Rha2Vkb3duOworCQllbmdpbmUtPmZpZm8udGFrZWRvd24JCT0gbnYwNF9maWZvX2Zpbmk7CiAJCWVuZ2luZS0+Zmlmby5kaXNhYmxlCQk9IG52MDRfZmlmb19kaXNhYmxlOwogCQllbmdpbmUtPmZpZm8uZW5hYmxlCQk9IG52MDRfZmlmb19lbmFibGU7CiAJCWVuZ2luZS0+Zmlmby5yZWFzc2lnbgkJPSBudjA0X2ZpZm9fcmVhc3NpZ247CiAJCWVuZ2luZS0+Zmlmby5jYWNoZV9wdWxsCQk9IG52MDRfZmlmb19jYWNoZV9wdWxsOwogCQllbmdpbmUtPmZpZm8uY2hhbm5lbF9pZAkJPSBudjEwX2ZpZm9fY2hhbm5lbF9pZDsKIAkJZW5naW5lLT5maWZvLmNyZWF0ZV9jb250ZXh0CT0gbnYxMF9maWZvX2NyZWF0ZV9jb250ZXh0OwotCQllbmdpbmUtPmZpZm8uZGVzdHJveV9jb250ZXh0CT0gbnYxMF9maWZvX2Rlc3Ryb3lfY29udGV4dDsKKwkJZW5naW5lLT5maWZvLmRlc3Ryb3lfY29udGV4dAk9IG52MDRfZmlmb19kZXN0cm95X2NvbnRleHQ7CiAJCWVuZ2luZS0+Zmlmby5sb2FkX2NvbnRleHQJPSBudjEwX2ZpZm9fbG9hZF9jb250ZXh0OwogCQllbmdpbmUtPmZpZm8udW5sb2FkX2NvbnRleHQJPSBudjEwX2ZpZm9fdW5sb2FkX2NvbnRleHQ7CiAJCWVuZ2luZS0+ZGlzcGxheS5lYXJseV9pbml0CT0gbnYwNF9kaXNwbGF5X2Vhcmx5X2luaXQ7CkBAIC0xNTMsMTYgKzE1NywyMCBAQAogCQllbmdpbmUtPnBtLmNsb2NrX2dldAkJPSBudjA0X3BtX2Nsb2NrX2dldDsKIAkJZW5naW5lLT5wbS5jbG9ja19wcmUJCT0gbnYwNF9wbV9jbG9ja19wcmU7CiAJCWVuZ2luZS0+cG0uY2xvY2tfc2V0CQk9IG52MDRfcG1fY2xvY2tfc2V0OworCQllbmdpbmUtPmNyeXB0LmluaXQJCT0gbm91dmVhdV9zdHViX2luaXQ7CisJCWVuZ2luZS0+Y3J5cHQudGFrZWRvd24JCT0gbm91dmVhdV9zdHViX3Rha2Vkb3duOworCQllbmdpbmUtPnZyYW0uaW5pdAkJPSBub3V2ZWF1X21lbV9kZXRlY3Q7CisJCWVuZ2luZS0+dnJhbS5mbGFnc192YWxpZAk9IG5vdXZlYXVfbWVtX2ZsYWdzX3ZhbGlkOwogCQlicmVhazsKIAljYXNlIDB4MjA6CiAJCWVuZ2luZS0+aW5zdG1lbS5pbml0CQk9IG52MDRfaW5zdG1lbV9pbml0OwogCQllbmdpbmUtPmluc3RtZW0udGFrZWRvd24JPSBudjA0X2luc3RtZW1fdGFrZWRvd247CiAJCWVuZ2luZS0+aW5zdG1lbS5zdXNwZW5kCQk9IG52MDRfaW5zdG1lbV9zdXNwZW5kOwogCQllbmdpbmUtPmluc3RtZW0ucmVzdW1lCQk9IG52MDRfaW5zdG1lbV9yZXN1bWU7Ci0JCWVuZ2luZS0+aW5zdG1lbS5wb3B1bGF0ZQk9IG52MDRfaW5zdG1lbV9wb3B1bGF0ZTsKLQkJZW5naW5lLT5pbnN0bWVtLmNsZWFyCQk9IG52MDRfaW5zdG1lbV9jbGVhcjsKLQkJZW5naW5lLT5pbnN0bWVtLmJpbmQJCT0gbnYwNF9pbnN0bWVtX2JpbmQ7Ci0JCWVuZ2luZS0+aW5zdG1lbS51bmJpbmQJCT0gbnYwNF9pbnN0bWVtX3VuYmluZDsKKwkJZW5naW5lLT5pbnN0bWVtLmdldAkJPSBudjA0X2luc3RtZW1fZ2V0OworCQllbmdpbmUtPmluc3RtZW0ucHV0CQk9IG52MDRfaW5zdG1lbV9wdXQ7CisJCWVuZ2luZS0+aW5zdG1lbS5tYXAJCT0gbnYwNF9pbnN0bWVtX21hcDsKKwkJZW5naW5lLT5pbnN0bWVtLnVubWFwCQk9IG52MDRfaW5zdG1lbV91bm1hcDsKIAkJZW5naW5lLT5pbnN0bWVtLmZsdXNoCQk9IG52MDRfaW5zdG1lbV9mbHVzaDsKIAkJZW5naW5lLT5tYy5pbml0CQkJPSBudjA0X21jX2luaXQ7CiAJCWVuZ2luZS0+bWMudGFrZWRvd24JCT0gbnYwNF9tY190YWtlZG93bjsKQEAgLTE3MSw4ICsxNzksOSBAQAogCQllbmdpbmUtPnRpbWVyLnRha2Vkb3duCQk9IG52MDRfdGltZXJfdGFrZWRvd247CiAJCWVuZ2luZS0+ZmIuaW5pdAkJCT0gbnYxMF9mYl9pbml0OwogCQllbmdpbmUtPmZiLnRha2Vkb3duCQk9IG52MTBfZmJfdGFrZWRvd247Ci0JCWVuZ2luZS0+ZmIuc2V0X3JlZ2lvbl90aWxpbmcJPSBudjEwX2ZiX3NldF9yZWdpb25fdGlsaW5nOwotCQllbmdpbmUtPmdyYXBoLmdyY2xhc3MJCT0gbnYyMF9ncmFwaF9ncmNsYXNzOworCQllbmdpbmUtPmZiLmluaXRfdGlsZV9yZWdpb24JPSBudjEwX2ZiX2luaXRfdGlsZV9yZWdpb247CisJCWVuZ2luZS0+ZmIuc2V0X3RpbGVfcmVnaW9uCT0gbnYxMF9mYl9zZXRfdGlsZV9yZWdpb247CisJCWVuZ2luZS0+ZmIuZnJlZV90aWxlX3JlZ2lvbgk9IG52MTBfZmJfZnJlZV90aWxlX3JlZ2lvbjsKIAkJZW5naW5lLT5ncmFwaC5pbml0CQk9IG52MjBfZ3JhcGhfaW5pdDsKIAkJZW5naW5lLT5ncmFwaC50YWtlZG93bgkJPSBudjIwX2dyYXBoX3Rha2Vkb3duOwogCQllbmdpbmUtPmdyYXBoLmNoYW5uZWwJCT0gbnYxMF9ncmFwaF9jaGFubmVsOwpAQCAtMTgxLDE3ICsxOTAsMTcgQEAKIAkJZW5naW5lLT5ncmFwaC5maWZvX2FjY2Vzcwk9IG52MDRfZ3JhcGhfZmlmb19hY2Nlc3M7CiAJCWVuZ2luZS0+Z3JhcGgubG9hZF9jb250ZXh0CT0gbnYyMF9ncmFwaF9sb2FkX2NvbnRleHQ7CiAJCWVuZ2luZS0+Z3JhcGgudW5sb2FkX2NvbnRleHQJPSBudjIwX2dyYXBoX3VubG9hZF9jb250ZXh0OwotCQllbmdpbmUtPmdyYXBoLnNldF9yZWdpb25fdGlsaW5nCT0gbnYyMF9ncmFwaF9zZXRfcmVnaW9uX3RpbGluZzsKKwkJZW5naW5lLT5ncmFwaC5zZXRfdGlsZV9yZWdpb24JPSBudjIwX2dyYXBoX3NldF90aWxlX3JlZ2lvbjsKIAkJZW5naW5lLT5maWZvLmNoYW5uZWxzCQk9IDMyOwogCQllbmdpbmUtPmZpZm8uaW5pdAkJPSBudjEwX2ZpZm9faW5pdDsKLQkJZW5naW5lLT5maWZvLnRha2Vkb3duCQk9IG5vdXZlYXVfc3R1Yl90YWtlZG93bjsKKwkJZW5naW5lLT5maWZvLnRha2Vkb3duCQk9IG52MDRfZmlmb19maW5pOwogCQllbmdpbmUtPmZpZm8uZGlzYWJsZQkJPSBudjA0X2ZpZm9fZGlzYWJsZTsKIAkJZW5naW5lLT5maWZvLmVuYWJsZQkJPSBudjA0X2ZpZm9fZW5hYmxlOwogCQllbmdpbmUtPmZpZm8ucmVhc3NpZ24JCT0gbnYwNF9maWZvX3JlYXNzaWduOwogCQllbmdpbmUtPmZpZm8uY2FjaGVfcHVsbAkJPSBudjA0X2ZpZm9fY2FjaGVfcHVsbDsKIAkJZW5naW5lLT5maWZvLmNoYW5uZWxfaWQJCT0gbnYxMF9maWZvX2NoYW5uZWxfaWQ7CiAJCWVuZ2luZS0+Zmlmby5jcmVhdGVfY29udGV4dAk9IG52MTBfZmlmb19jcmVhdGVfY29udGV4dDsKLQkJZW5naW5lLT5maWZvLmRlc3Ryb3lfY29udGV4dAk9IG52MTBfZmlmb19kZXN0cm95X2NvbnRleHQ7CisJCWVuZ2luZS0+Zmlmby5kZXN0cm95X2NvbnRleHQJPSBudjA0X2ZpZm9fZGVzdHJveV9jb250ZXh0OwogCQllbmdpbmUtPmZpZm8ubG9hZF9jb250ZXh0CT0gbnYxMF9maWZvX2xvYWRfY29udGV4dDsKIAkJZW5naW5lLT5maWZvLnVubG9hZF9jb250ZXh0CT0gbnYxMF9maWZvX3VubG9hZF9jb250ZXh0OwogCQllbmdpbmUtPmRpc3BsYXkuZWFybHlfaW5pdAk9IG52MDRfZGlzcGxheV9lYXJseV9pbml0OwpAQCAtMjA3LDE2ICsyMTYsMjAgQEAKIAkJZW5naW5lLT5wbS5jbG9ja19nZXQJCT0gbnYwNF9wbV9jbG9ja19nZXQ7CiAJCWVuZ2luZS0+cG0uY2xvY2tfcHJlCQk9IG52MDRfcG1fY2xvY2tfcHJlOwogCQllbmdpbmUtPnBtLmNsb2NrX3NldAkJPSBudjA0X3BtX2Nsb2NrX3NldDsKKwkJZW5naW5lLT5jcnlwdC5pbml0CQk9IG5vdXZlYXVfc3R1Yl9pbml0OworCQllbmdpbmUtPmNyeXB0LnRha2Vkb3duCQk9IG5vdXZlYXVfc3R1Yl90YWtlZG93bjsKKwkJZW5naW5lLT52cmFtLmluaXQJCT0gbm91dmVhdV9tZW1fZGV0ZWN0OworCQllbmdpbmUtPnZyYW0uZmxhZ3NfdmFsaWQJPSBub3V2ZWF1X21lbV9mbGFnc192YWxpZDsKIAkJYnJlYWs7CiAJY2FzZSAweDMwOgogCQllbmdpbmUtPmluc3RtZW0uaW5pdAkJPSBudjA0X2luc3RtZW1faW5pdDsKIAkJZW5naW5lLT5pbnN0bWVtLnRha2Vkb3duCT0gbnYwNF9pbnN0bWVtX3Rha2Vkb3duOwogCQllbmdpbmUtPmluc3RtZW0uc3VzcGVuZAkJPSBudjA0X2luc3RtZW1fc3VzcGVuZDsKIAkJZW5naW5lLT5pbnN0bWVtLnJlc3VtZQkJPSBudjA0X2luc3RtZW1fcmVzdW1lOwotCQllbmdpbmUtPmluc3RtZW0ucG9wdWxhdGUJPSBudjA0X2luc3RtZW1fcG9wdWxhdGU7Ci0JCWVuZ2luZS0+aW5zdG1lbS5jbGVhcgkJPSBudjA0X2luc3RtZW1fY2xlYXI7Ci0JCWVuZ2luZS0+aW5zdG1lbS5iaW5kCQk9IG52MDRfaW5zdG1lbV9iaW5kOwotCQllbmdpbmUtPmluc3RtZW0udW5iaW5kCQk9IG52MDRfaW5zdG1lbV91bmJpbmQ7CisJCWVuZ2luZS0+aW5zdG1lbS5nZXQJCT0gbnYwNF9pbnN0bWVtX2dldDsKKwkJZW5naW5lLT5pbnN0bWVtLnB1dAkJPSBudjA0X2luc3RtZW1fcHV0OworCQllbmdpbmUtPmluc3RtZW0ubWFwCQk9IG52MDRfaW5zdG1lbV9tYXA7CisJCWVuZ2luZS0+aW5zdG1lbS51bm1hcAkJPSBudjA0X2luc3RtZW1fdW5tYXA7CiAJCWVuZ2luZS0+aW5zdG1lbS5mbHVzaAkJPSBudjA0X2luc3RtZW1fZmx1c2g7CiAJCWVuZ2luZS0+bWMuaW5pdAkJCT0gbnYwNF9tY19pbml0OwogCQllbmdpbmUtPm1jLnRha2Vkb3duCQk9IG52MDRfbWNfdGFrZWRvd247CkBAIC0yMjUsOCArMjM4LDkgQEAKIAkJZW5naW5lLT50aW1lci50YWtlZG93bgkJPSBudjA0X3RpbWVyX3Rha2Vkb3duOwogCQllbmdpbmUtPmZiLmluaXQJCQk9IG52MzBfZmJfaW5pdDsKIAkJZW5naW5lLT5mYi50YWtlZG93bgkJPSBudjMwX2ZiX3Rha2Vkb3duOwotCQllbmdpbmUtPmZiLnNldF9yZWdpb25fdGlsaW5nCT0gbnYxMF9mYl9zZXRfcmVnaW9uX3RpbGluZzsKLQkJZW5naW5lLT5ncmFwaC5ncmNsYXNzCQk9IG52MzBfZ3JhcGhfZ3JjbGFzczsKKwkJZW5naW5lLT5mYi5pbml0X3RpbGVfcmVnaW9uCT0gbnYzMF9mYl9pbml0X3RpbGVfcmVnaW9uOworCQllbmdpbmUtPmZiLnNldF90aWxlX3JlZ2lvbgk9IG52MTBfZmJfc2V0X3RpbGVfcmVnaW9uOworCQllbmdpbmUtPmZiLmZyZWVfdGlsZV9yZWdpb24JPSBudjMwX2ZiX2ZyZWVfdGlsZV9yZWdpb247CiAJCWVuZ2luZS0+Z3JhcGguaW5pdAkJPSBudjMwX2dyYXBoX2luaXQ7CiAJCWVuZ2luZS0+Z3JhcGgudGFrZWRvd24JCT0gbnYyMF9ncmFwaF90YWtlZG93bjsKIAkJZW5naW5lLT5ncmFwaC5maWZvX2FjY2Vzcwk9IG52MDRfZ3JhcGhfZmlmb19hY2Nlc3M7CkBAIC0yMzUsMTcgKzI0OSwxNyBAQAogCQllbmdpbmUtPmdyYXBoLmRlc3Ryb3lfY29udGV4dAk9IG52MjBfZ3JhcGhfZGVzdHJveV9jb250ZXh0OwogCQllbmdpbmUtPmdyYXBoLmxvYWRfY29udGV4dAk9IG52MjBfZ3JhcGhfbG9hZF9jb250ZXh0OwogCQllbmdpbmUtPmdyYXBoLnVubG9hZF9jb250ZXh0CT0gbnYyMF9ncmFwaF91bmxvYWRfY29udGV4dDsKLQkJZW5naW5lLT5ncmFwaC5zZXRfcmVnaW9uX3RpbGluZwk9IG52MjBfZ3JhcGhfc2V0X3JlZ2lvbl90aWxpbmc7CisJCWVuZ2luZS0+Z3JhcGguc2V0X3RpbGVfcmVnaW9uCT0gbnYyMF9ncmFwaF9zZXRfdGlsZV9yZWdpb247CiAJCWVuZ2luZS0+Zmlmby5jaGFubmVscwkJPSAzMjsKIAkJZW5naW5lLT5maWZvLmluaXQJCT0gbnYxMF9maWZvX2luaXQ7Ci0JCWVuZ2luZS0+Zmlmby50YWtlZG93bgkJPSBub3V2ZWF1X3N0dWJfdGFrZWRvd247CisJCWVuZ2luZS0+Zmlmby50YWtlZG93bgkJPSBudjA0X2ZpZm9fZmluaTsKIAkJZW5naW5lLT5maWZvLmRpc2FibGUJCT0gbnYwNF9maWZvX2Rpc2FibGU7CiAJCWVuZ2luZS0+Zmlmby5lbmFibGUJCT0gbnYwNF9maWZvX2VuYWJsZTsKIAkJZW5naW5lLT5maWZvLnJlYXNzaWduCQk9IG52MDRfZmlmb19yZWFzc2lnbjsKIAkJZW5naW5lLT5maWZvLmNhY2hlX3B1bGwJCT0gbnYwNF9maWZvX2NhY2hlX3B1bGw7CiAJCWVuZ2luZS0+Zmlmby5jaGFubmVsX2lkCQk9IG52MTBfZmlmb19jaGFubmVsX2lkOwogCQllbmdpbmUtPmZpZm8uY3JlYXRlX2NvbnRleHQJPSBudjEwX2ZpZm9fY3JlYXRlX2NvbnRleHQ7Ci0JCWVuZ2luZS0+Zmlmby5kZXN0cm95X2NvbnRleHQJPSBudjEwX2ZpZm9fZGVzdHJveV9jb250ZXh0OworCQllbmdpbmUtPmZpZm8uZGVzdHJveV9jb250ZXh0CT0gbnYwNF9maWZvX2Rlc3Ryb3lfY29udGV4dDsKIAkJZW5naW5lLT5maWZvLmxvYWRfY29udGV4dAk9IG52MTBfZmlmb19sb2FkX2NvbnRleHQ7CiAJCWVuZ2luZS0+Zmlmby51bmxvYWRfY29udGV4dAk9IG52MTBfZmlmb191bmxvYWRfY29udGV4dDsKIAkJZW5naW5lLT5kaXNwbGF5LmVhcmx5X2luaXQJPSBudjA0X2Rpc3BsYXlfZWFybHlfaW5pdDsKQEAgLTI2Myw2ICsyNzcsMTAgQEAKIAkJZW5naW5lLT5wbS5jbG9ja19zZXQJCT0gbnYwNF9wbV9jbG9ja19zZXQ7CiAJCWVuZ2luZS0+cG0udm9sdGFnZV9nZXQJCT0gbm91dmVhdV92b2x0YWdlX2dwaW9fZ2V0OwogCQllbmdpbmUtPnBtLnZvbHRhZ2Vfc2V0CQk9IG5vdXZlYXVfdm9sdGFnZV9ncGlvX3NldDsKKwkJZW5naW5lLT5jcnlwdC5pbml0CQk9IG5vdXZlYXVfc3R1Yl9pbml0OworCQllbmdpbmUtPmNyeXB0LnRha2Vkb3duCQk9IG5vdXZlYXVfc3R1Yl90YWtlZG93bjsKKwkJZW5naW5lLT52cmFtLmluaXQJCT0gbm91dmVhdV9tZW1fZGV0ZWN0OworCQllbmdpbmUtPnZyYW0uZmxhZ3NfdmFsaWQJPSBub3V2ZWF1X21lbV9mbGFnc192YWxpZDsKIAkJYnJlYWs7CiAJY2FzZSAweDQwOgogCWNhc2UgMHg2MDoKQEAgLTI3MCwxMCArMjg4LDEwIEBACiAJCWVuZ2luZS0+aW5zdG1lbS50YWtlZG93bgk9IG52MDRfaW5zdG1lbV90YWtlZG93bjsKIAkJZW5naW5lLT5pbnN0bWVtLnN1c3BlbmQJCT0gbnYwNF9pbnN0bWVtX3N1c3BlbmQ7CiAJCWVuZ2luZS0+aW5zdG1lbS5yZXN1bWUJCT0gbnYwNF9pbnN0bWVtX3Jlc3VtZTsKLQkJZW5naW5lLT5pbnN0bWVtLnBvcHVsYXRlCT0gbnYwNF9pbnN0bWVtX3BvcHVsYXRlOwotCQllbmdpbmUtPmluc3RtZW0uY2xlYXIJCT0gbnYwNF9pbnN0bWVtX2NsZWFyOwotCQllbmdpbmUtPmluc3RtZW0uYmluZAkJPSBudjA0X2luc3RtZW1fYmluZDsKLQkJZW5naW5lLT5pbnN0bWVtLnVuYmluZAkJPSBudjA0X2luc3RtZW1fdW5iaW5kOworCQllbmdpbmUtPmluc3RtZW0uZ2V0CQk9IG52MDRfaW5zdG1lbV9nZXQ7CisJCWVuZ2luZS0+aW5zdG1lbS5wdXQJCT0gbnYwNF9pbnN0bWVtX3B1dDsKKwkJZW5naW5lLT5pbnN0bWVtLm1hcAkJPSBudjA0X2luc3RtZW1fbWFwOworCQllbmdpbmUtPmluc3RtZW0udW5tYXAJCT0gbnYwNF9pbnN0bWVtX3VubWFwOwogCQllbmdpbmUtPmluc3RtZW0uZmx1c2gJCT0gbnYwNF9pbnN0bWVtX2ZsdXNoOwogCQllbmdpbmUtPm1jLmluaXQJCQk9IG52NDBfbWNfaW5pdDsKIAkJZW5naW5lLT5tYy50YWtlZG93bgkJPSBudjQwX21jX3Rha2Vkb3duOwpAQCAtMjgyLDggKzMwMCw5IEBACiAJCWVuZ2luZS0+dGltZXIudGFrZWRvd24JCT0gbnYwNF90aW1lcl90YWtlZG93bjsKIAkJZW5naW5lLT5mYi5pbml0CQkJPSBudjQwX2ZiX2luaXQ7CiAJCWVuZ2luZS0+ZmIudGFrZWRvd24JCT0gbnY0MF9mYl90YWtlZG93bjsKLQkJZW5naW5lLT5mYi5zZXRfcmVnaW9uX3RpbGluZwk9IG52NDBfZmJfc2V0X3JlZ2lvbl90aWxpbmc7Ci0JCWVuZ2luZS0+Z3JhcGguZ3JjbGFzcwkJPSBudjQwX2dyYXBoX2dyY2xhc3M7CisJCWVuZ2luZS0+ZmIuaW5pdF90aWxlX3JlZ2lvbgk9IG52MzBfZmJfaW5pdF90aWxlX3JlZ2lvbjsKKwkJZW5naW5lLT5mYi5zZXRfdGlsZV9yZWdpb24JPSBudjQwX2ZiX3NldF90aWxlX3JlZ2lvbjsKKwkJZW5naW5lLT5mYi5mcmVlX3RpbGVfcmVnaW9uCT0gbnYzMF9mYl9mcmVlX3RpbGVfcmVnaW9uOwogCQllbmdpbmUtPmdyYXBoLmluaXQJCT0gbnY0MF9ncmFwaF9pbml0OwogCQllbmdpbmUtPmdyYXBoLnRha2Vkb3duCQk9IG52NDBfZ3JhcGhfdGFrZWRvd247CiAJCWVuZ2luZS0+Z3JhcGguZmlmb19hY2Nlc3MJPSBudjA0X2dyYXBoX2ZpZm9fYWNjZXNzOwpAQCAtMjkyLDE3ICszMTEsMTcgQEAKIAkJZW5naW5lLT5ncmFwaC5kZXN0cm95X2NvbnRleHQJPSBudjQwX2dyYXBoX2Rlc3Ryb3lfY29udGV4dDsKIAkJZW5naW5lLT5ncmFwaC5sb2FkX2NvbnRleHQJPSBudjQwX2dyYXBoX2xvYWRfY29udGV4dDsKIAkJZW5naW5lLT5ncmFwaC51bmxvYWRfY29udGV4dAk9IG52NDBfZ3JhcGhfdW5sb2FkX2NvbnRleHQ7Ci0JCWVuZ2luZS0+Z3JhcGguc2V0X3JlZ2lvbl90aWxpbmcJPSBudjQwX2dyYXBoX3NldF9yZWdpb25fdGlsaW5nOworCQllbmdpbmUtPmdyYXBoLnNldF90aWxlX3JlZ2lvbgk9IG52NDBfZ3JhcGhfc2V0X3RpbGVfcmVnaW9uOwogCQllbmdpbmUtPmZpZm8uY2hhbm5lbHMJCT0gMzI7CiAJCWVuZ2luZS0+Zmlmby5pbml0CQk9IG52NDBfZmlmb19pbml0OwotCQllbmdpbmUtPmZpZm8udGFrZWRvd24JCT0gbm91dmVhdV9zdHViX3Rha2Vkb3duOworCQllbmdpbmUtPmZpZm8udGFrZWRvd24JCT0gbnYwNF9maWZvX2Zpbmk7CiAJCWVuZ2luZS0+Zmlmby5kaXNhYmxlCQk9IG52MDRfZmlmb19kaXNhYmxlOwogCQllbmdpbmUtPmZpZm8uZW5hYmxlCQk9IG52MDRfZmlmb19lbmFibGU7CiAJCWVuZ2luZS0+Zmlmby5yZWFzc2lnbgkJPSBudjA0X2ZpZm9fcmVhc3NpZ247CiAJCWVuZ2luZS0+Zmlmby5jYWNoZV9wdWxsCQk9IG52MDRfZmlmb19jYWNoZV9wdWxsOwogCQllbmdpbmUtPmZpZm8uY2hhbm5lbF9pZAkJPSBudjEwX2ZpZm9fY2hhbm5lbF9pZDsKIAkJZW5naW5lLT5maWZvLmNyZWF0ZV9jb250ZXh0CT0gbnY0MF9maWZvX2NyZWF0ZV9jb250ZXh0OwotCQllbmdpbmUtPmZpZm8uZGVzdHJveV9jb250ZXh0CT0gbnY0MF9maWZvX2Rlc3Ryb3lfY29udGV4dDsKKwkJZW5naW5lLT5maWZvLmRlc3Ryb3lfY29udGV4dAk9IG52MDRfZmlmb19kZXN0cm95X2NvbnRleHQ7CiAJCWVuZ2luZS0+Zmlmby5sb2FkX2NvbnRleHQJPSBudjQwX2ZpZm9fbG9hZF9jb250ZXh0OwogCQllbmdpbmUtPmZpZm8udW5sb2FkX2NvbnRleHQJPSBudjQwX2ZpZm9fdW5sb2FkX2NvbnRleHQ7CiAJCWVuZ2luZS0+ZGlzcGxheS5lYXJseV9pbml0CT0gbnYwNF9kaXNwbGF5X2Vhcmx5X2luaXQ7CkBAIC0zMjEsNiArMzQwLDEwIEBACiAJCWVuZ2luZS0+cG0udm9sdGFnZV9nZXQJCT0gbm91dmVhdV92b2x0YWdlX2dwaW9fZ2V0OwogCQllbmdpbmUtPnBtLnZvbHRhZ2Vfc2V0CQk9IG5vdXZlYXVfdm9sdGFnZV9ncGlvX3NldDsKIAkJZW5naW5lLT5wbS50ZW1wX2dldAkJPSBudjQwX3RlbXBfZ2V0OworCQllbmdpbmUtPmNyeXB0LmluaXQJCT0gbm91dmVhdV9zdHViX2luaXQ7CisJCWVuZ2luZS0+Y3J5cHQudGFrZWRvd24JCT0gbm91dmVhdV9zdHViX3Rha2Vkb3duOworCQllbmdpbmUtPnZyYW0uaW5pdAkJPSBub3V2ZWF1X21lbV9kZXRlY3Q7CisJCWVuZ2luZS0+dnJhbS5mbGFnc192YWxpZAk9IG5vdXZlYXVfbWVtX2ZsYWdzX3ZhbGlkOwogCQlicmVhazsKIAljYXNlIDB4NTA6CiAJY2FzZSAweDgwOiAvKiBnb3R0YSBsb3ZlIE5WSURJQSdzIGNvbnNpc3RlbmN5Li4gKi8KQEAgLTMzMCwxMCArMzUzLDEwIEBACiAJCWVuZ2luZS0+aW5zdG1lbS50YWtlZG93bgk9IG52NTBfaW5zdG1lbV90YWtlZG93bjsKIAkJZW5naW5lLT5pbnN0bWVtLnN1c3BlbmQJCT0gbnY1MF9pbnN0bWVtX3N1c3BlbmQ7CiAJCWVuZ2luZS0+aW5zdG1lbS5yZXN1bWUJCT0gbnY1MF9pbnN0bWVtX3Jlc3VtZTsKLQkJZW5naW5lLT5pbnN0bWVtLnBvcHVsYXRlCT0gbnY1MF9pbnN0bWVtX3BvcHVsYXRlOwotCQllbmdpbmUtPmluc3RtZW0uY2xlYXIJCT0gbnY1MF9pbnN0bWVtX2NsZWFyOwotCQllbmdpbmUtPmluc3RtZW0uYmluZAkJPSBudjUwX2luc3RtZW1fYmluZDsKLQkJZW5naW5lLT5pbnN0bWVtLnVuYmluZAkJPSBudjUwX2luc3RtZW1fdW5iaW5kOworCQllbmdpbmUtPmluc3RtZW0uZ2V0CQk9IG52NTBfaW5zdG1lbV9nZXQ7CisJCWVuZ2luZS0+aW5zdG1lbS5wdXQJCT0gbnY1MF9pbnN0bWVtX3B1dDsKKwkJZW5naW5lLT5pbnN0bWVtLm1hcAkJPSBudjUwX2luc3RtZW1fbWFwOworCQllbmdpbmUtPmluc3RtZW0udW5tYXAJCT0gbnY1MF9pbnN0bWVtX3VubWFwOwogCQlpZiAoZGV2X3ByaXYtPmNoaXBzZXQgPT0gMHg1MCkKIAkJCWVuZ2luZS0+aW5zdG1lbS5mbHVzaAk9IG52NTBfaW5zdG1lbV9mbHVzaDsKIAkJZWxzZQpAQCAtMzQ1LDcgKzM2OCw2IEBACiAJCWVuZ2luZS0+dGltZXIudGFrZWRvd24JCT0gbnYwNF90aW1lcl90YWtlZG93bjsKIAkJZW5naW5lLT5mYi5pbml0CQkJPSBudjUwX2ZiX2luaXQ7CiAJCWVuZ2luZS0+ZmIudGFrZWRvd24JCT0gbnY1MF9mYl90YWtlZG93bjsKLQkJZW5naW5lLT5ncmFwaC5ncmNsYXNzCQk9IG52NTBfZ3JhcGhfZ3JjbGFzczsKIAkJZW5naW5lLT5ncmFwaC5pbml0CQk9IG52NTBfZ3JhcGhfaW5pdDsKIAkJZW5naW5lLT5ncmFwaC50YWtlZG93bgkJPSBudjUwX2dyYXBoX3Rha2Vkb3duOwogCQllbmdpbmUtPmdyYXBoLmZpZm9fYWNjZXNzCT0gbnY1MF9ncmFwaF9maWZvX2FjY2VzczsKQEAgLTM4MSwyNCArNDAzLDMyIEBACiAJCWVuZ2luZS0+ZGlzcGxheS5pbml0CQk9IG52NTBfZGlzcGxheV9pbml0OwogCQllbmdpbmUtPmRpc3BsYXkuZGVzdHJveQkJPSBudjUwX2Rpc3BsYXlfZGVzdHJveTsKIAkJZW5naW5lLT5ncGlvLmluaXQJCT0gbnY1MF9ncGlvX2luaXQ7Ci0JCWVuZ2luZS0+Z3Bpby50YWtlZG93bgkJPSBub3V2ZWF1X3N0dWJfdGFrZWRvd247CisJCWVuZ2luZS0+Z3Bpby50YWtlZG93bgkJPSBudjUwX2dwaW9fZmluaTsKIAkJZW5naW5lLT5ncGlvLmdldAkJPSBudjUwX2dwaW9fZ2V0OwogCQllbmdpbmUtPmdwaW8uc2V0CQk9IG52NTBfZ3Bpb19zZXQ7CisJCWVuZ2luZS0+Z3Bpby5pcnFfcmVnaXN0ZXIJPSBudjUwX2dwaW9faXJxX3JlZ2lzdGVyOworCQllbmdpbmUtPmdwaW8uaXJxX3VucmVnaXN0ZXIJPSBudjUwX2dwaW9faXJxX3VucmVnaXN0ZXI7CiAJCWVuZ2luZS0+Z3Bpby5pcnFfZW5hYmxlCQk9IG52NTBfZ3Bpb19pcnFfZW5hYmxlOwogCQlzd2l0Y2ggKGRldl9wcml2LT5jaGlwc2V0KSB7Ci0JCWNhc2UgMHhhMzoKLQkJY2FzZSAweGE1OgotCQljYXNlIDB4YTg6Ci0JCWNhc2UgMHhhZjoKLQkJCWVuZ2luZS0+cG0uY2xvY2tfZ2V0CT0gbnZhM19wbV9jbG9ja19nZXQ7Ci0JCQllbmdpbmUtPnBtLmNsb2NrX3ByZQk9IG52YTNfcG1fY2xvY2tfcHJlOwotCQkJZW5naW5lLT5wbS5jbG9ja19zZXQJPSBudmEzX3BtX2Nsb2NrX3NldDsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgorCQljYXNlIDB4ODQ6CisJCWNhc2UgMHg4NjoKKwkJY2FzZSAweDkyOgorCQljYXNlIDB4OTQ6CisJCWNhc2UgMHg5NjoKKwkJY2FzZSAweDk4OgorCQljYXNlIDB4YTA6CisJCWNhc2UgMHhhYToKKwkJY2FzZSAweGFjOgorCQljYXNlIDB4NTA6CiAJCQllbmdpbmUtPnBtLmNsb2NrX2dldAk9IG52NTBfcG1fY2xvY2tfZ2V0OwogCQkJZW5naW5lLT5wbS5jbG9ja19wcmUJPSBudjUwX3BtX2Nsb2NrX3ByZTsKIAkJCWVuZ2luZS0+cG0uY2xvY2tfc2V0CT0gbnY1MF9wbV9jbG9ja19zZXQ7CiAJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWVuZ2luZS0+cG0uY2xvY2tfZ2V0CT0gbnZhM19wbV9jbG9ja19nZXQ7CisJCQllbmdpbmUtPnBtLmNsb2NrX3ByZQk9IG52YTNfcG1fY2xvY2tfcHJlOworCQkJZW5naW5lLT5wbS5jbG9ja19zZXQJPSBudmEzX3BtX2Nsb2NrX3NldDsKKwkJCWJyZWFrOwogCQl9CiAJCWVuZ2luZS0+cG0udm9sdGFnZV9nZXQJCT0gbm91dmVhdV92b2x0YWdlX2dwaW9fZ2V0OwogCQllbmdpbmUtPnBtLnZvbHRhZ2Vfc2V0CQk9IG5vdXZlYXVfdm9sdGFnZV9ncGlvX3NldDsKQEAgLTQwNiwxNyArNDM2LDM5IEBACiAJCQllbmdpbmUtPnBtLnRlbXBfZ2V0CT0gbnY4NF90ZW1wX2dldDsKIAkJZWxzZQogCQkJZW5naW5lLT5wbS50ZW1wX2dldAk9IG52NDBfdGVtcF9nZXQ7CisJCXN3aXRjaCAoZGV2X3ByaXYtPmNoaXBzZXQpIHsKKwkJY2FzZSAweDg0OgorCQljYXNlIDB4ODY6CisJCWNhc2UgMHg5MjoKKwkJY2FzZSAweDk0OgorCQljYXNlIDB4OTY6CisJCWNhc2UgMHhhMDoKKwkJCWVuZ2luZS0+Y3J5cHQuaW5pdAk9IG52ODRfY3J5cHRfaW5pdDsKKwkJCWVuZ2luZS0+Y3J5cHQudGFrZWRvd24JPSBudjg0X2NyeXB0X2Zpbmk7CisJCQllbmdpbmUtPmNyeXB0LmNyZWF0ZV9jb250ZXh0ID0gbnY4NF9jcnlwdF9jcmVhdGVfY29udGV4dDsKKwkJCWVuZ2luZS0+Y3J5cHQuZGVzdHJveV9jb250ZXh0ID0gbnY4NF9jcnlwdF9kZXN0cm95X2NvbnRleHQ7CisJCQllbmdpbmUtPmNyeXB0LnRsYl9mbHVzaAk9IG52ODRfY3J5cHRfdGxiX2ZsdXNoOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQllbmdpbmUtPmNyeXB0LmluaXQJPSBub3V2ZWF1X3N0dWJfaW5pdDsKKwkJCWVuZ2luZS0+Y3J5cHQudGFrZWRvd24JPSBub3V2ZWF1X3N0dWJfdGFrZWRvd247CisJCQlicmVhazsKKwkJfQorCQllbmdpbmUtPnZyYW0uaW5pdAkJPSBudjUwX3ZyYW1faW5pdDsKKwkJZW5naW5lLT52cmFtLmdldAkJPSBudjUwX3ZyYW1fbmV3OworCQllbmdpbmUtPnZyYW0ucHV0CQk9IG52NTBfdnJhbV9kZWw7CisJCWVuZ2luZS0+dnJhbS5mbGFnc192YWxpZAk9IG52NTBfdnJhbV9mbGFnc192YWxpZDsKIAkJYnJlYWs7CiAJY2FzZSAweEMwOgogCQllbmdpbmUtPmluc3RtZW0uaW5pdAkJPSBudmMwX2luc3RtZW1faW5pdDsKIAkJZW5naW5lLT5pbnN0bWVtLnRha2Vkb3duCT0gbnZjMF9pbnN0bWVtX3Rha2Vkb3duOwogCQllbmdpbmUtPmluc3RtZW0uc3VzcGVuZAkJPSBudmMwX2luc3RtZW1fc3VzcGVuZDsKIAkJZW5naW5lLT5pbnN0bWVtLnJlc3VtZQkJPSBudmMwX2luc3RtZW1fcmVzdW1lOwotCQllbmdpbmUtPmluc3RtZW0ucG9wdWxhdGUJPSBudmMwX2luc3RtZW1fcG9wdWxhdGU7Ci0JCWVuZ2luZS0+aW5zdG1lbS5jbGVhcgkJPSBudmMwX2luc3RtZW1fY2xlYXI7Ci0JCWVuZ2luZS0+aW5zdG1lbS5iaW5kCQk9IG52YzBfaW5zdG1lbV9iaW5kOwotCQllbmdpbmUtPmluc3RtZW0udW5iaW5kCQk9IG52YzBfaW5zdG1lbV91bmJpbmQ7Ci0JCWVuZ2luZS0+aW5zdG1lbS5mbHVzaAkJPSBudmMwX2luc3RtZW1fZmx1c2g7CisJCWVuZ2luZS0+aW5zdG1lbS5nZXQJCT0gbnY1MF9pbnN0bWVtX2dldDsKKwkJZW5naW5lLT5pbnN0bWVtLnB1dAkJPSBudjUwX2luc3RtZW1fcHV0OworCQllbmdpbmUtPmluc3RtZW0ubWFwCQk9IG52NTBfaW5zdG1lbV9tYXA7CisJCWVuZ2luZS0+aW5zdG1lbS51bm1hcAkJPSBudjUwX2luc3RtZW1fdW5tYXA7CisJCWVuZ2luZS0+aW5zdG1lbS5mbHVzaAkJPSBudjg0X2luc3RtZW1fZmx1c2g7CiAJCWVuZ2luZS0+bWMuaW5pdAkJCT0gbnY1MF9tY19pbml0OwogCQllbmdpbmUtPm1jLnRha2Vkb3duCQk9IG52NTBfbWNfdGFrZWRvd247CiAJCWVuZ2luZS0+dGltZXIuaW5pdAkJPSBudjA0X3RpbWVyX2luaXQ7CkBAIC00MjQsNyArNDc2LDYgQEAKIAkJZW5naW5lLT50aW1lci50YWtlZG93bgkJPSBudjA0X3RpbWVyX3Rha2Vkb3duOwogCQllbmdpbmUtPmZiLmluaXQJCQk9IG52YzBfZmJfaW5pdDsKIAkJZW5naW5lLT5mYi50YWtlZG93bgkJPSBudmMwX2ZiX3Rha2Vkb3duOwotCQllbmdpbmUtPmdyYXBoLmdyY2xhc3MJCT0gTlVMTDsgIC8vbnZjMF9ncmFwaF9ncmNsYXNzOwogCQllbmdpbmUtPmdyYXBoLmluaXQJCT0gbnZjMF9ncmFwaF9pbml0OwogCQllbmdpbmUtPmdyYXBoLnRha2Vkb3duCQk9IG52YzBfZ3JhcGhfdGFrZWRvd247CiAJCWVuZ2luZS0+Z3JhcGguZmlmb19hY2Nlc3MJPSBudmMwX2dyYXBoX2ZpZm9fYWNjZXNzOwpAQCAtNDUzLDcgKzUwNCwxNSBAQAogCQllbmdpbmUtPmdwaW8udGFrZWRvd24JCT0gbm91dmVhdV9zdHViX3Rha2Vkb3duOwogCQllbmdpbmUtPmdwaW8uZ2V0CQk9IG52NTBfZ3Bpb19nZXQ7CiAJCWVuZ2luZS0+Z3Bpby5zZXQJCT0gbnY1MF9ncGlvX3NldDsKKwkJZW5naW5lLT5ncGlvLmlycV9yZWdpc3Rlcgk9IG52NTBfZ3Bpb19pcnFfcmVnaXN0ZXI7CisJCWVuZ2luZS0+Z3Bpby5pcnFfdW5yZWdpc3Rlcgk9IG52NTBfZ3Bpb19pcnFfdW5yZWdpc3RlcjsKIAkJZW5naW5lLT5ncGlvLmlycV9lbmFibGUJCT0gbnY1MF9ncGlvX2lycV9lbmFibGU7CisJCWVuZ2luZS0+Y3J5cHQuaW5pdAkJPSBub3V2ZWF1X3N0dWJfaW5pdDsKKwkJZW5naW5lLT5jcnlwdC50YWtlZG93bgkJPSBub3V2ZWF1X3N0dWJfdGFrZWRvd247CisJCWVuZ2luZS0+dnJhbS5pbml0CQk9IG52YzBfdnJhbV9pbml0OworCQllbmdpbmUtPnZyYW0uZ2V0CQk9IG52YzBfdnJhbV9uZXc7CisJCWVuZ2luZS0+dnJhbS5wdXQJCT0gbnY1MF92cmFtX2RlbDsKKwkJZW5naW5lLT52cmFtLmZsYWdzX3ZhbGlkCT0gbnZjMF92cmFtX2ZsYWdzX3ZhbGlkOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlOVl9FUlJPUihkZXYsICJOViUwMnggdW5zdXBwb3J0ZWRcbiIsIGRldl9wcml2LT5jaGlwc2V0KTsKQEAgLTQ5Myw5ICs1NTIsMTMgQEAKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCisJLyogbm8gZG1hIG9iamVjdHMgb24gZmVybWkuLi4gKi8KKwlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA+PSBOVl9DMCkKKwkJZ290byBvdXRfZG9uZTsKKwogCXJldCA9IG5vdXZlYXVfZ3B1b2JqX2RtYV9uZXcoZGV2X3ByaXYtPmNoYW5uZWwsIE5WX0NMQVNTX0RNQV9JTl9NRU1PUlksCiAJCQkJICAgICAwLCBkZXZfcHJpdi0+dnJhbV9zaXplLAotCQkJCSAgICAgTlZfRE1BX0FDQ0VTU19SVywgTlZfRE1BX1RBUkdFVF9WSURNRU0sCisJCQkJICAgICBOVl9NRU1fQUNDRVNTX1JXLCBOVl9NRU1fVEFSR0VUX1ZSQU0sCiAJCQkJICAgICAmZ3B1b2JqKTsKIAlpZiAocmV0KQogCQlnb3RvIG91dF9lcnI7CkBAIC01MDUsOSArNTY4LDEwIEBACiAJaWYgKHJldCkKIAkJZ290byBvdXRfZXJyOwogCi0JcmV0ID0gbm91dmVhdV9ncHVvYmpfZ2FydF9kbWFfbmV3KGRldl9wcml2LT5jaGFubmVsLCAwLAotCQkJCQkgIGRldl9wcml2LT5nYXJ0X2luZm8uYXBlcl9zaXplLAotCQkJCQkgIE5WX0RNQV9BQ0NFU1NfUlcsICZncHVvYmosIE5VTEwpOworCXJldCA9IG5vdXZlYXVfZ3B1b2JqX2RtYV9uZXcoZGV2X3ByaXYtPmNoYW5uZWwsIE5WX0NMQVNTX0RNQV9JTl9NRU1PUlksCisJCQkJICAgICAwLCBkZXZfcHJpdi0+Z2FydF9pbmZvLmFwZXJfc2l6ZSwKKwkJCQkgICAgIE5WX01FTV9BQ0NFU1NfUlcsIE5WX01FTV9UQVJHRVRfR0FSVCwKKwkJCQkgICAgICZncHVvYmopOwogCWlmIChyZXQpCiAJCWdvdG8gb3V0X2VycjsKIApAQCAtNTE2LDExICs1ODAsMTIgQEAKIAlpZiAocmV0KQogCQlnb3RvIG91dF9lcnI7CiAKK291dF9kb25lOgorCW11dGV4X3VubG9jaygmZGV2X3ByaXYtPmNoYW5uZWwtPm11dGV4KTsKIAlyZXR1cm4gMDsKIAogb3V0X2VycjoKLQlub3V2ZWF1X2NoYW5uZWxfZnJlZShkZXZfcHJpdi0+Y2hhbm5lbCk7Ci0JZGV2X3ByaXYtPmNoYW5uZWwgPSBOVUxMOworCW5vdXZlYXVfY2hhbm5lbF9wdXQoJmRldl9wcml2LT5jaGFubmVsKTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC01MzEsMTUgKzU5NiwyNSBAQAogCXBtX21lc3NhZ2VfdCBwbW0gPSB7IC5ldmVudCA9IFBNX0VWRU5UX1NVU1BFTkQgfTsKIAlpZiAoc3RhdGUgPT0gVkdBX1NXSVRDSEVST09fT04pIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJWR0Egc3dpdGNoZXJvbzogc3dpdGNoZWQgbm91dmVhdSBvblxuIik7CisJCWRldi0+c3dpdGNoX3Bvd2VyX3N0YXRlID0gRFJNX1NXSVRDSF9QT1dFUl9DSEFOR0lORzsKIAkJbm91dmVhdV9wY2lfcmVzdW1lKHBkZXYpOwogCQlkcm1fa21zX2hlbHBlcl9wb2xsX2VuYWJsZShkZXYpOworCQlkZXYtPnN3aXRjaF9wb3dlcl9zdGF0ZSA9IERSTV9TV0lUQ0hfUE9XRVJfT047CiAJfSBlbHNlIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJWR0Egc3dpdGNoZXJvbzogc3dpdGNoZWQgbm91dmVhdSBvZmZcbiIpOworCQlkZXYtPnN3aXRjaF9wb3dlcl9zdGF0ZSA9IERSTV9TV0lUQ0hfUE9XRVJfQ0hBTkdJTkc7CiAJCWRybV9rbXNfaGVscGVyX3BvbGxfZGlzYWJsZShkZXYpOwogCQlub3V2ZWF1X3BjaV9zdXNwZW5kKHBkZXYsIHBtbSk7CisJCWRldi0+c3dpdGNoX3Bvd2VyX3N0YXRlID0gRFJNX1NXSVRDSF9QT1dFUl9PRkY7CiAJfQogfQogCitzdGF0aWMgdm9pZCBub3V2ZWF1X3N3aXRjaGVyb29fcmVwcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCW5vdXZlYXVfZmJjb25fb3V0cHV0X3BvbGxfY2hhbmdlZChkZXYpOworfQorCiBzdGF0aWMgYm9vbCBub3V2ZWF1X3N3aXRjaGVyb29fY2FuX3N3aXRjaChzdHJ1Y3QgcGNpX2RldiAqcGRldikKIHsKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOwpAQCAtNTYwLDYgKzYzNSw3IEBACiAKIAl2Z2FfY2xpZW50X3JlZ2lzdGVyKGRldi0+cGRldiwgZGV2LCBOVUxMLCBub3V2ZWF1X3ZnYV9zZXRfZGVjb2RlKTsKIAl2Z2Ffc3dpdGNoZXJvb19yZWdpc3Rlcl9jbGllbnQoZGV2LT5wZGV2LCBub3V2ZWF1X3N3aXRjaGVyb29fc2V0X3N0YXRlLAorCQkJCSAgICAgICBub3V2ZWF1X3N3aXRjaGVyb29fcmVwcm9iZSwKIAkJCQkgICAgICAgbm91dmVhdV9zd2l0Y2hlcm9vX2Nhbl9zd2l0Y2gpOwogCiAJLyogSW5pdGlhbGlzZSBpbnRlcm5hbCBkcml2ZXIgQVBJIGhvb2tzICovCkBAIC01NjcsNiArNjQzLDggQEAKIAlpZiAocmV0KQogCQlnb3RvIG91dDsKIAllbmdpbmUgPSAmZGV2X3ByaXYtPmVuZ2luZTsKKwlzcGluX2xvY2tfaW5pdCgmZGV2X3ByaXYtPmNoYW5uZWxzLmxvY2spOworCXNwaW5fbG9ja19pbml0KCZkZXZfcHJpdi0+dGlsZS5sb2NrKTsKIAlzcGluX2xvY2tfaW5pdCgmZGV2X3ByaXYtPmNvbnRleHRfc3dpdGNoX2xvY2spOwogCiAJLyogTWFrZSB0aGUgQ1JUQ3MgYW5kIEkyQyBidXNlcyBhY2Nlc3NpYmxlICovCkBAIC02MjUsMjYgKzcwMywyOCBAQAogCQlpZiAocmV0KQogCQkJZ290byBvdXRfZmI7CiAKKwkJLyogUENSWVBUICovCisJCXJldCA9IGVuZ2luZS0+Y3J5cHQuaW5pdChkZXYpOworCQlpZiAocmV0KQorCQkJZ290byBvdXRfZ3JhcGg7CisKIAkJLyogUEZJRk8gKi8KIAkJcmV0ID0gZW5naW5lLT5maWZvLmluaXQoZGV2KTsKIAkJaWYgKHJldCkKLQkJCWdvdG8gb3V0X2dyYXBoOworCQkJZ290byBvdXRfY3J5cHQ7CiAJfQogCiAJcmV0ID0gZW5naW5lLT5kaXNwbGF5LmNyZWF0ZShkZXYpOwogCWlmIChyZXQpCiAJCWdvdG8gb3V0X2ZpZm87CiAKLQkvKiB0aGlzIGNhbGwgaXJxX3ByZWluc3RhbGwsIHJlZ2lzdGVyIGlycSBoYW5kbGVyIGFuZAotCSAqIGNhbGwgaXJxX3Bvc3RpbnN0YWxsCi0JICovCi0JcmV0ID0gZHJtX2lycV9pbnN0YWxsKGRldik7CisJcmV0ID0gZHJtX3ZibGFua19pbml0KGRldiwgbnZfdHdvX2hlYWRzKGRldikgPyAyIDogMSk7CiAJaWYgKHJldCkKLQkJZ290byBvdXRfZGlzcGxheTsKKwkJZ290byBvdXRfdmJsYW5rOwogCi0JcmV0ID0gZHJtX3ZibGFua19pbml0KGRldiwgMCk7CisJcmV0ID0gbm91dmVhdV9pcnFfaW5pdChkZXYpOwogCWlmIChyZXQpCi0JCWdvdG8gb3V0X2lycTsKKwkJZ290byBvdXRfdmJsYW5rOwogCiAJLyogd2hhdCBhYm91dCBQVklERU8vUENSVEMvUFJBTURBQyBldGM/ICovCiAKQEAgLTY2OSwxMiArNzQ5LDE2IEBACiBvdXRfZmVuY2U6CiAJbm91dmVhdV9mZW5jZV9maW5pKGRldik7CiBvdXRfaXJxOgotCWRybV9pcnFfdW5pbnN0YWxsKGRldik7Ci1vdXRfZGlzcGxheToKKwlub3V2ZWF1X2lycV9maW5pKGRldik7CitvdXRfdmJsYW5rOgorCWRybV92YmxhbmtfY2xlYW51cChkZXYpOwogCWVuZ2luZS0+ZGlzcGxheS5kZXN0cm95KGRldik7CiBvdXRfZmlmbzoKIAlpZiAoIW5vdXZlYXVfbm9hY2NlbCkKIAkJZW5naW5lLT5maWZvLnRha2Vkb3duKGRldik7CitvdXRfY3J5cHQ6CisJaWYgKCFub3V2ZWF1X25vYWNjZWwpCisJCWVuZ2luZS0+Y3J5cHQudGFrZWRvd24oZGV2KTsKIG91dF9ncmFwaDoKIAlpZiAoIW5vdXZlYXVfbm9hY2NlbCkKIAkJZW5naW5lLT5ncmFwaC50YWtlZG93bihkZXYpOwpAQCAtNzEzLDEyICs3OTcsMTIgQEAKIAogCWlmICghZW5naW5lLT5ncmFwaC5hY2NlbF9ibG9ja2VkKSB7CiAJCW5vdXZlYXVfZmVuY2VfZmluaShkZXYpOwotCQlub3V2ZWF1X2NoYW5uZWxfZnJlZShkZXZfcHJpdi0+Y2hhbm5lbCk7Ci0JCWRldl9wcml2LT5jaGFubmVsID0gTlVMTDsKKwkJbm91dmVhdV9jaGFubmVsX3B1dF91bmxvY2tlZCgmZGV2X3ByaXYtPmNoYW5uZWwpOwogCX0KIAogCWlmICghbm91dmVhdV9ub2FjY2VsKSB7CiAJCWVuZ2luZS0+Zmlmby50YWtlZG93bihkZXYpOworCQllbmdpbmUtPmNyeXB0LnRha2Vkb3duKGRldik7CiAJCWVuZ2luZS0+Z3JhcGgudGFrZWRvd24oZGV2KTsKIAl9CiAJZW5naW5lLT5mYi50YWtlZG93bihkZXYpOwpAQCAtNzM3LDcgKzgyMSw4IEBACiAJbm91dmVhdV9ncHVvYmpfdGFrZWRvd24oZGV2KTsKIAlub3V2ZWF1X21lbV92cmFtX2ZpbmkoZGV2KTsKIAotCWRybV9pcnFfdW5pbnN0YWxsKGRldik7CisJbm91dmVhdV9pcnFfZmluaShkZXYpOworCWRybV92YmxhbmtfY2xlYW51cChkZXYpOwogCiAJbm91dmVhdV9wbV9maW5pKGRldik7CiAJbm91dmVhdV9iaW9zX3Rha2Vkb3duKGRldik7CkBAIC05ODAsNiArMTA2NSw3IEBACiAKIHZvaWQgbm91dmVhdV9sYXN0Y2xvc2Uoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKKwl2Z2Ffc3dpdGNoZXJvb19wcm9jZXNzX2RlbGF5ZWRfc3dpdGNoKCk7CiB9CiAKIGludCBub3V2ZWF1X3VubG9hZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQpAQCAtMTAyNCwyMSArMTExMCw2IEBACiAJCWVsc2UKIAkJCWdldHBhcmFtLT52YWx1ZSA9IE5WX1BDSTsKIAkJYnJlYWs7Ci0JY2FzZSBOT1VWRUFVX0dFVFBBUkFNX0ZCX1BIWVNJQ0FMOgotCQlnZXRwYXJhbS0+dmFsdWUgPSBkZXZfcHJpdi0+ZmJfcGh5czsKLQkJYnJlYWs7Ci0JY2FzZSBOT1VWRUFVX0dFVFBBUkFNX0FHUF9QSFlTSUNBTDoKLQkJZ2V0cGFyYW0tPnZhbHVlID0gZGV2X3ByaXYtPmdhcnRfaW5mby5hcGVyX2Jhc2U7Ci0JCWJyZWFrOwotCWNhc2UgTk9VVkVBVV9HRVRQQVJBTV9QQ0lfUEhZU0lDQUw6Ci0JCWlmIChkZXYtPnNnKSB7Ci0JCQlnZXRwYXJhbS0+dmFsdWUgPSAodW5zaWduZWQgbG9uZylkZXYtPnNnLT52aXJ0dWFsOwotCQl9IGVsc2UgewotCQkJTlZfRVJST1IoZGV2LCAiUmVxdWVzdGVkIFBDSUdBUlQgYWRkcmVzcywgIgotCQkJCQkid2hpbGUgbm8gUENJR0FSVCB3YXMgY3JlYXRlZFxuIik7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCQlicmVhazsKIAljYXNlIE5PVVZFQVVfR0VUUEFSQU1fRkJfU0laRToKIAkJZ2V0cGFyYW0tPnZhbHVlID0gZGV2X3ByaXYtPmZiX2F2YWlsYWJsZV9zaXplOwogCQlicmVhazsKQEAgLTEwNDYsNyArMTExNyw3IEBACiAJCWdldHBhcmFtLT52YWx1ZSA9IGRldl9wcml2LT5nYXJ0X2luZm8uYXBlcl9zaXplOwogCQlicmVhazsKIAljYXNlIE5PVVZFQVVfR0VUUEFSQU1fVk1fVlJBTV9CQVNFOgotCQlnZXRwYXJhbS0+dmFsdWUgPSBkZXZfcHJpdi0+dm1fdnJhbV9iYXNlOworCQlnZXRwYXJhbS0+dmFsdWUgPSAwOyAvKiBkZXByZWNhdGVkICovCiAJCWJyZWFrOwogCWNhc2UgTk9VVkVBVV9HRVRQQVJBTV9QVElNRVJfVElNRToKIAkJZ2V0cGFyYW0tPnZhbHVlID0gZGV2X3ByaXYtPmVuZ2luZS50aW1lci5yZWFkKGRldik7CkBAIC0xMDU0LDYgKzExMjUsOSBAQAogCWNhc2UgTk9VVkVBVV9HRVRQQVJBTV9IQVNfQk9fVVNBR0U6CiAJCWdldHBhcmFtLT52YWx1ZSA9IDE7CiAJCWJyZWFrOworCWNhc2UgTk9VVkVBVV9HRVRQQVJBTV9IQVNfUEFHRUZMSVA6CisJCWdldHBhcmFtLT52YWx1ZSA9IChkZXZfcHJpdi0+Y2FyZF90eXBlIDwgTlZfNTApOworCQlicmVhazsKIAljYXNlIE5PVVZFQVVfR0VUUEFSQU1fR1JBUEhfVU5JVFM6CiAJCS8qIE5WNDAgYW5kIE5WNTAgdmVyc2lvbnMgYXJlIHF1aXRlIGRpZmZlcmVudCwgYnV0IHJlZ2lzdGVyCiAJCSAqIGFkZHJlc3MgaXMgdGhlIHNhbWUuIFVzZXIgaXMgc3VwcG9zZWQgdG8ga25vdyB0aGUgY2FyZApAQCAtMTA4Nyw4ICsxMTYxLDkgQEAKIH0KIAogLyogV2FpdCB1bnRpbCAodmFsdWUocmVnKSAmIG1hc2spID09IHZhbCwgdXAgdW50aWwgdGltZW91dCBoYXMgaGl0ICovCi1ib29sIG5vdXZlYXVfd2FpdF91bnRpbChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1aW50NjRfdCB0aW1lb3V0LAotCQkJdWludDMyX3QgcmVnLCB1aW50MzJfdCBtYXNrLCB1aW50MzJfdCB2YWwpCitib29sCitub3V2ZWF1X3dhaXRfZXEoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdWludDY0X3QgdGltZW91dCwKKwkJdWludDMyX3QgcmVnLCB1aW50MzJfdCBtYXNrLCB1aW50MzJfdCB2YWwpCiB7CiAJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlzdHJ1Y3Qgbm91dmVhdV90aW1lcl9lbmdpbmUgKnB0aW1lciA9ICZkZXZfcHJpdi0+ZW5naW5lLnRpbWVyOwpAQCAtMTEwMiwxMCArMTE3NywzMyBAQAogCXJldHVybiBmYWxzZTsKIH0KIAorLyogV2FpdCB1bnRpbCAodmFsdWUocmVnKSAmIG1hc2spICE9IHZhbCwgdXAgdW50aWwgdGltZW91dCBoYXMgaGl0ICovCitib29sCitub3V2ZWF1X3dhaXRfbmUoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdWludDY0X3QgdGltZW91dCwKKwkJdWludDMyX3QgcmVnLCB1aW50MzJfdCBtYXNrLCB1aW50MzJfdCB2YWwpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3Qgbm91dmVhdV90aW1lcl9lbmdpbmUgKnB0aW1lciA9ICZkZXZfcHJpdi0+ZW5naW5lLnRpbWVyOworCXVpbnQ2NF90IHN0YXJ0ID0gcHRpbWVyLT5yZWFkKGRldik7CisKKwlkbyB7CisJCWlmICgobnZfcmQzMihkZXYsIHJlZykgJiBtYXNrKSAhPSB2YWwpCisJCQlyZXR1cm4gdHJ1ZTsKKwl9IHdoaWxlIChwdGltZXItPnJlYWQoZGV2KSAtIHN0YXJ0IDwgdGltZW91dCk7CisKKwlyZXR1cm4gZmFsc2U7Cit9CisKIC8qIFdhaXRzIGZvciBQR1JBUEggdG8gZ28gY29tcGxldGVseSBpZGxlICovCiBib29sIG5vdXZlYXVfd2FpdF9mb3JfaWRsZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogewotCWlmICghbnZfd2FpdChkZXYsIE5WMDRfUEdSQVBIX1NUQVRVUywgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCkpIHsKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXVpbnQzMl90IG1hc2sgPSB+MDsKKworCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlID09IE5WXzQwKQorCQltYXNrICY9IH5OVjQwX1BHUkFQSF9TVEFUVVNfU1lOQ19TVEFMTDsKKworCWlmICghbnZfd2FpdChkZXYsIE5WMDRfUEdSQVBIX1NUQVRVUywgbWFzaywgMCkpIHsKIAkJTlZfRVJST1IoZGV2LCAiUEdSQVBIIGlkbGUgdGltZWQgb3V0IHdpdGggc3RhdHVzIDB4JTA4eFxuIiwKIAkJCSBudl9yZDMyKGRldiwgTlYwNF9QR1JBUEhfU1RBVFVTKSk7CiAJCXJldHVybiBmYWxzZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfdXRpbC5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV91dGlsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmJlMGZiMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfdXRpbC5jCkBAIC0wLDAgKzEsNjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgTm91dmVhdSBQcm9qZWN0CisgKgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKKyAqIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZworICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorICogZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCisgKiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZQorICogbmV4dCBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwKKyAqIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUihTKSBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRQorICogTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTgorICogT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OCisgKiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3JhdGVsaW1pdC5oPgorCisjaW5jbHVkZSAibm91dmVhdV91dGlsLmgiCisKK3N0YXRpYyBERUZJTkVfUkFURUxJTUlUX1NUQVRFKG5vdXZlYXVfcmF0ZWxpbWl0X3N0YXRlLCAzICogSFosIDIwKTsKKwordm9pZAorbm91dmVhdV9iaXRmaWVsZF9wcmludChjb25zdCBzdHJ1Y3Qgbm91dmVhdV9iaXRmaWVsZCAqYmYsIHUzMiB2YWx1ZSkKK3sKKwl3aGlsZSAoYmYtPm5hbWUpIHsKKwkJaWYgKHZhbHVlICYgYmYtPm1hc2spIHsKKwkJCXByaW50aygiICVzIiwgYmYtPm5hbWUpOworCQkJdmFsdWUgJj0gfmJmLT5tYXNrOworCQl9CisKKwkJYmYrKzsKKwl9CisKKwlpZiAodmFsdWUpCisJCXByaW50aygiICh1bmtub3duIGJpdHMgMHglMDh4KSIsIHZhbHVlKTsKK30KKwordm9pZAorbm91dmVhdV9lbnVtX3ByaW50KGNvbnN0IHN0cnVjdCBub3V2ZWF1X2VudW0gKmVuLCB1MzIgdmFsdWUpCit7CisJd2hpbGUgKGVuLT5uYW1lKSB7CisJCWlmICh2YWx1ZSA9PSBlbi0+dmFsdWUpIHsKKwkJCXByaW50aygiJXMiLCBlbi0+bmFtZSk7CisJCQlyZXR1cm47CisJCX0KKworCQllbisrOworCX0KKworCXByaW50aygiKHVua25vd24gZW51bSAweCUwOHgpIiwgdmFsdWUpOworfQorCitpbnQKK25vdXZlYXVfcmF0ZWxpbWl0KHZvaWQpCit7CisJcmV0dXJuIF9fcmF0ZWxpbWl0KCZub3V2ZWF1X3JhdGVsaW1pdF9zdGF0ZSk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X3V0aWwuaCBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfdXRpbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5Y2VhZWEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X3V0aWwuaApAQCAtMCwwICsxLDQ1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIE5vdXZlYXUgUHJvamVjdAorICoKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCisgKiBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyAqIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworICogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUKKyAqIG5leHQgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsCisgKiBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIoUykgQU5EL09SIElUUyBTVVBQTElFUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04KKyAqIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTgorICogV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICovCisKKyNpZm5kZWYgX19OT1VWRUFVX1VUSUxfSF9fCisjZGVmaW5lIF9fTk9VVkVBVV9VVElMX0hfXworCitzdHJ1Y3Qgbm91dmVhdV9iaXRmaWVsZCB7CisJdTMyIG1hc2s7CisJY29uc3QgY2hhciAqbmFtZTsKK307CisKK3N0cnVjdCBub3V2ZWF1X2VudW0geworCXUzMiB2YWx1ZTsKKwljb25zdCBjaGFyICpuYW1lOworfTsKKwordm9pZCBub3V2ZWF1X2JpdGZpZWxkX3ByaW50KGNvbnN0IHN0cnVjdCBub3V2ZWF1X2JpdGZpZWxkICosIHUzMiB2YWx1ZSk7Cit2b2lkIG5vdXZlYXVfZW51bV9wcmludChjb25zdCBzdHJ1Y3Qgbm91dmVhdV9lbnVtICosIHUzMiB2YWx1ZSk7CitpbnQgbm91dmVhdV9yYXRlbGltaXQodm9pZCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV92bS5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV92bS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3ZDgyYWUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X3ZtLmMKQEAgLTAsMCArMSw0MzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxMCBSZWQgSGF0IEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBDT1BZUklHSFQgSE9MREVSKFMpIE9SIEFVVEhPUihTKSBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBBdXRob3JzOiBCZW4gU2tlZ2dzCisgKi8KKworI2luY2x1ZGUgImRybVAuaCIKKyNpbmNsdWRlICJub3V2ZWF1X2Rydi5oIgorI2luY2x1ZGUgIm5vdXZlYXVfbW0uaCIKKyNpbmNsdWRlICJub3V2ZWF1X3ZtLmgiCisKK3ZvaWQKK25vdXZlYXVfdm1fbWFwX2F0KHN0cnVjdCBub3V2ZWF1X3ZtYSAqdm1hLCB1NjQgZGVsdGEsIHN0cnVjdCBub3V2ZWF1X3ZyYW0gKnZyYW0pCit7CisJc3RydWN0IG5vdXZlYXVfdm0gKnZtID0gdm1hLT52bTsKKwlzdHJ1Y3Qgbm91dmVhdV9tbV9ub2RlICpyOworCWludCBiaWcgPSB2bWEtPm5vZGUtPnR5cGUgIT0gdm0tPnNwZ19zaGlmdDsKKwl1MzIgb2Zmc2V0ID0gdm1hLT5ub2RlLT5vZmZzZXQgKyAoZGVsdGEgPj4gMTIpOworCXUzMiBiaXRzID0gdm1hLT5ub2RlLT50eXBlIC0gMTI7CisJdTMyIHBkZSAgPSAob2Zmc2V0ID4+IHZtLT5wZ3RfYml0cykgLSB2bS0+ZnBkZTsKKwl1MzIgcHRlICA9IChvZmZzZXQgJiAoKDEgPDwgdm0tPnBndF9iaXRzKSAtIDEpKSA+PiBiaXRzOworCXUzMiBtYXggID0gMSA8PCAodm0tPnBndF9iaXRzIC0gYml0cyk7CisJdTMyIGVuZCwgbGVuOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShyLCAmdnJhbS0+cmVnaW9ucywgcmxfZW50cnkpIHsKKwkJdTY0IHBoeXMgPSAodTY0KXItPm9mZnNldCA8PCAxMjsKKwkJdTMyIG51bSAgPSByLT5sZW5ndGggPj4gYml0czsKKworCQl3aGlsZSAobnVtKSB7CisJCQlzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKnBndCA9IHZtLT5wZ3RbcGRlXS5vYmpbYmlnXTsKKworCQkJZW5kID0gKHB0ZSArIG51bSk7CisJCQlpZiAodW5saWtlbHkoZW5kID49IG1heCkpCisJCQkJZW5kID0gbWF4OworCQkJbGVuID0gZW5kIC0gcHRlOworCisJCQl2bS0+bWFwKHZtYSwgcGd0LCB2cmFtLCBwdGUsIGxlbiwgcGh5cyk7CisKKwkJCW51bSAtPSBsZW47CisJCQlwdGUgKz0gbGVuOworCQkJaWYgKHVubGlrZWx5KGVuZCA+PSBtYXgpKSB7CisJCQkJcGRlKys7CisJCQkJcHRlID0gMDsKKwkJCX0KKwkJfQorCX0KKworCXZtLT5mbHVzaCh2bSk7Cit9CisKK3ZvaWQKK25vdXZlYXVfdm1fbWFwKHN0cnVjdCBub3V2ZWF1X3ZtYSAqdm1hLCBzdHJ1Y3Qgbm91dmVhdV92cmFtICp2cmFtKQoreworCW5vdXZlYXVfdm1fbWFwX2F0KHZtYSwgMCwgdnJhbSk7Cit9CisKK3ZvaWQKK25vdXZlYXVfdm1fbWFwX3NnKHN0cnVjdCBub3V2ZWF1X3ZtYSAqdm1hLCB1NjQgZGVsdGEsIHU2NCBsZW5ndGgsCisJCSAgZG1hX2FkZHJfdCAqbGlzdCkKK3sKKwlzdHJ1Y3Qgbm91dmVhdV92bSAqdm0gPSB2bWEtPnZtOworCWludCBiaWcgPSB2bWEtPm5vZGUtPnR5cGUgIT0gdm0tPnNwZ19zaGlmdDsKKwl1MzIgb2Zmc2V0ID0gdm1hLT5ub2RlLT5vZmZzZXQgKyAoZGVsdGEgPj4gMTIpOworCXUzMiBiaXRzID0gdm1hLT5ub2RlLT50eXBlIC0gMTI7CisJdTMyIG51bSAgPSBsZW5ndGggPj4gdm1hLT5ub2RlLT50eXBlOworCXUzMiBwZGUgID0gKG9mZnNldCA+PiB2bS0+cGd0X2JpdHMpIC0gdm0tPmZwZGU7CisJdTMyIHB0ZSAgPSAob2Zmc2V0ICYgKCgxIDw8IHZtLT5wZ3RfYml0cykgLSAxKSkgPj4gYml0czsKKwl1MzIgbWF4ICA9IDEgPDwgKHZtLT5wZ3RfYml0cyAtIGJpdHMpOworCXUzMiBlbmQsIGxlbjsKKworCXdoaWxlIChudW0pIHsKKwkJc3RydWN0IG5vdXZlYXVfZ3B1b2JqICpwZ3QgPSB2bS0+cGd0W3BkZV0ub2JqW2JpZ107CisKKwkJZW5kID0gKHB0ZSArIG51bSk7CisJCWlmICh1bmxpa2VseShlbmQgPj0gbWF4KSkKKwkJCWVuZCA9IG1heDsKKwkJbGVuID0gZW5kIC0gcHRlOworCisJCXZtLT5tYXBfc2codm1hLCBwZ3QsIHB0ZSwgbGlzdCwgbGVuKTsKKworCQludW0gIC09IGxlbjsKKwkJcHRlICArPSBsZW47CisJCWxpc3QgKz0gbGVuOworCQlpZiAodW5saWtlbHkoZW5kID49IG1heCkpIHsKKwkJCXBkZSsrOworCQkJcHRlID0gMDsKKwkJfQorCX0KKworCXZtLT5mbHVzaCh2bSk7Cit9CisKK3ZvaWQKK25vdXZlYXVfdm1fdW5tYXBfYXQoc3RydWN0IG5vdXZlYXVfdm1hICp2bWEsIHU2NCBkZWx0YSwgdTY0IGxlbmd0aCkKK3sKKwlzdHJ1Y3Qgbm91dmVhdV92bSAqdm0gPSB2bWEtPnZtOworCWludCBiaWcgPSB2bWEtPm5vZGUtPnR5cGUgIT0gdm0tPnNwZ19zaGlmdDsKKwl1MzIgb2Zmc2V0ID0gdm1hLT5ub2RlLT5vZmZzZXQgKyAoZGVsdGEgPj4gMTIpOworCXUzMiBiaXRzID0gdm1hLT5ub2RlLT50eXBlIC0gMTI7CisJdTMyIG51bSAgPSBsZW5ndGggPj4gdm1hLT5ub2RlLT50eXBlOworCXUzMiBwZGUgID0gKG9mZnNldCA+PiB2bS0+cGd0X2JpdHMpIC0gdm0tPmZwZGU7CisJdTMyIHB0ZSAgPSAob2Zmc2V0ICYgKCgxIDw8IHZtLT5wZ3RfYml0cykgLSAxKSkgPj4gYml0czsKKwl1MzIgbWF4ICA9IDEgPDwgKHZtLT5wZ3RfYml0cyAtIGJpdHMpOworCXUzMiBlbmQsIGxlbjsKKworCXdoaWxlIChudW0pIHsKKwkJc3RydWN0IG5vdXZlYXVfZ3B1b2JqICpwZ3QgPSB2bS0+cGd0W3BkZV0ub2JqW2JpZ107CisKKwkJZW5kID0gKHB0ZSArIG51bSk7CisJCWlmICh1bmxpa2VseShlbmQgPj0gbWF4KSkKKwkJCWVuZCA9IG1heDsKKwkJbGVuID0gZW5kIC0gcHRlOworCisJCXZtLT51bm1hcChwZ3QsIHB0ZSwgbGVuKTsKKworCQludW0gLT0gbGVuOworCQlwdGUgKz0gbGVuOworCQlpZiAodW5saWtlbHkoZW5kID49IG1heCkpIHsKKwkJCXBkZSsrOworCQkJcHRlID0gMDsKKwkJfQorCX0KKworCXZtLT5mbHVzaCh2bSk7Cit9CisKK3ZvaWQKK25vdXZlYXVfdm1fdW5tYXAoc3RydWN0IG5vdXZlYXVfdm1hICp2bWEpCit7CisJbm91dmVhdV92bV91bm1hcF9hdCh2bWEsIDAsICh1NjQpdm1hLT5ub2RlLT5sZW5ndGggPDwgMTIpOworfQorCitzdGF0aWMgdm9pZAorbm91dmVhdV92bV91bm1hcF9wZ3Qoc3RydWN0IG5vdXZlYXVfdm0gKnZtLCBpbnQgYmlnLCB1MzIgZnBkZSwgdTMyIGxwZGUpCit7CisJc3RydWN0IG5vdXZlYXVfdm1fcGdkICp2cGdkOworCXN0cnVjdCBub3V2ZWF1X3ZtX3BndCAqdnBndDsKKwlzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKnBndDsKKwl1MzIgcGRlOworCisJZm9yIChwZGUgPSBmcGRlOyBwZGUgPD0gbHBkZTsgcGRlKyspIHsKKwkJdnBndCA9ICZ2bS0+cGd0W3BkZSAtIHZtLT5mcGRlXTsKKwkJaWYgKC0tdnBndC0+cmVmY291bnRbYmlnXSkKKwkJCWNvbnRpbnVlOworCisJCXBndCA9IHZwZ3QtPm9ialtiaWddOworCQl2cGd0LT5vYmpbYmlnXSA9IE5VTEw7CisKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeSh2cGdkLCAmdm0tPnBnZF9saXN0LCBoZWFkKSB7CisJCQl2bS0+bWFwX3BndCh2cGdkLT5vYmosIHBkZSwgdnBndC0+b2JqKTsKKwkJfQorCisJCW11dGV4X3VubG9jaygmdm0tPm1tLT5tdXRleCk7CisJCW5vdXZlYXVfZ3B1b2JqX3JlZihOVUxMLCAmcGd0KTsKKwkJbXV0ZXhfbG9jaygmdm0tPm1tLT5tdXRleCk7CisJfQorfQorCitzdGF0aWMgaW50Citub3V2ZWF1X3ZtX21hcF9wZ3Qoc3RydWN0IG5vdXZlYXVfdm0gKnZtLCB1MzIgcGRlLCB1MzIgdHlwZSkKK3sKKwlzdHJ1Y3Qgbm91dmVhdV92bV9wZ3QgKnZwZ3QgPSAmdm0tPnBndFtwZGUgLSB2bS0+ZnBkZV07CisJc3RydWN0IG5vdXZlYXVfdm1fcGdkICp2cGdkOworCXN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqcGd0OworCWludCBiaWcgPSAodHlwZSAhPSB2bS0+c3BnX3NoaWZ0KTsKKwl1MzIgcGd0X3NpemU7CisJaW50IHJldDsKKworCXBndF9zaXplICA9ICgxIDw8ICh2bS0+cGd0X2JpdHMgKyAxMikpID4+IHR5cGU7CisJcGd0X3NpemUgKj0gODsKKworCW11dGV4X3VubG9jaygmdm0tPm1tLT5tdXRleCk7CisJcmV0ID0gbm91dmVhdV9ncHVvYmpfbmV3KHZtLT5kZXYsIE5VTEwsIHBndF9zaXplLCAweDEwMDAsCisJCQkJIE5WT0JKX0ZMQUdfWkVST19BTExPQywgJnBndCk7CisJbXV0ZXhfbG9jaygmdm0tPm1tLT5tdXRleCk7CisJaWYgKHVubGlrZWx5KHJldCkpCisJCXJldHVybiByZXQ7CisKKwkvKiBzb21lb25lIGJlYXQgdXMgdG8gZmlsbGluZyB0aGUgUERFIHdoaWxlIHdlIGRpZG4ndCBoYXZlIHRoZSBsb2NrICovCisJaWYgKHVubGlrZWx5KHZwZ3QtPnJlZmNvdW50W2JpZ10rKykpIHsKKwkJbXV0ZXhfdW5sb2NrKCZ2bS0+bW0tPm11dGV4KTsKKwkJbm91dmVhdV9ncHVvYmpfcmVmKE5VTEwsICZwZ3QpOworCQltdXRleF9sb2NrKCZ2bS0+bW0tPm11dGV4KTsKKwkJcmV0dXJuIDA7CisJfQorCisJdnBndC0+b2JqW2JpZ10gPSBwZ3Q7CisJbGlzdF9mb3JfZWFjaF9lbnRyeSh2cGdkLCAmdm0tPnBnZF9saXN0LCBoZWFkKSB7CisJCXZtLT5tYXBfcGd0KHZwZ2QtPm9iaiwgcGRlLCB2cGd0LT5vYmopOworCX0KKworCXJldHVybiAwOworfQorCitpbnQKK25vdXZlYXVfdm1fZ2V0KHN0cnVjdCBub3V2ZWF1X3ZtICp2bSwgdTY0IHNpemUsIHUzMiBwYWdlX3NoaWZ0LAorCSAgICAgICB1MzIgYWNjZXNzLCBzdHJ1Y3Qgbm91dmVhdV92bWEgKnZtYSkKK3sKKwl1MzIgYWxpZ24gPSAoMSA8PCBwYWdlX3NoaWZ0KSA+PiAxMjsKKwl1MzIgbXNpemUgPSBzaXplID4+IDEyOworCXUzMiBmcGRlLCBscGRlLCBwZGU7CisJaW50IHJldDsKKworCW11dGV4X2xvY2soJnZtLT5tbS0+bXV0ZXgpOworCXJldCA9IG5vdXZlYXVfbW1fZ2V0KHZtLT5tbSwgcGFnZV9zaGlmdCwgbXNpemUsIDAsIGFsaWduLCAmdm1hLT5ub2RlKTsKKwlpZiAodW5saWtlbHkocmV0ICE9IDApKSB7CisJCW11dGV4X3VubG9jaygmdm0tPm1tLT5tdXRleCk7CisJCXJldHVybiByZXQ7CisJfQorCisJZnBkZSA9ICh2bWEtPm5vZGUtPm9mZnNldCA+PiB2bS0+cGd0X2JpdHMpOworCWxwZGUgPSAodm1hLT5ub2RlLT5vZmZzZXQgKyB2bWEtPm5vZGUtPmxlbmd0aCAtIDEpID4+IHZtLT5wZ3RfYml0czsKKwlmb3IgKHBkZSA9IGZwZGU7IHBkZSA8PSBscGRlOyBwZGUrKykgeworCQlzdHJ1Y3Qgbm91dmVhdV92bV9wZ3QgKnZwZ3QgPSAmdm0tPnBndFtwZGUgLSB2bS0+ZnBkZV07CisJCWludCBiaWcgPSAodm1hLT5ub2RlLT50eXBlICE9IHZtLT5zcGdfc2hpZnQpOworCisJCWlmIChsaWtlbHkodnBndC0+cmVmY291bnRbYmlnXSkpIHsKKwkJCXZwZ3QtPnJlZmNvdW50W2JpZ10rKzsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJcmV0ID0gbm91dmVhdV92bV9tYXBfcGd0KHZtLCBwZGUsIHZtYS0+bm9kZS0+dHlwZSk7CisJCWlmIChyZXQpIHsKKwkJCWlmIChwZGUgIT0gZnBkZSkKKwkJCQlub3V2ZWF1X3ZtX3VubWFwX3BndCh2bSwgYmlnLCBmcGRlLCBwZGUgLSAxKTsKKwkJCW5vdXZlYXVfbW1fcHV0KHZtLT5tbSwgdm1hLT5ub2RlKTsKKwkJCW11dGV4X3VubG9jaygmdm0tPm1tLT5tdXRleCk7CisJCQl2bWEtPm5vZGUgPSBOVUxMOworCQkJcmV0dXJuIHJldDsKKwkJfQorCX0KKwltdXRleF91bmxvY2soJnZtLT5tbS0+bXV0ZXgpOworCisJdm1hLT52bSAgICAgPSB2bTsKKwl2bWEtPm9mZnNldCA9ICh1NjQpdm1hLT5ub2RlLT5vZmZzZXQgPDwgMTI7CisJdm1hLT5hY2Nlc3MgPSBhY2Nlc3M7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQKK25vdXZlYXVfdm1fcHV0KHN0cnVjdCBub3V2ZWF1X3ZtYSAqdm1hKQoreworCXN0cnVjdCBub3V2ZWF1X3ZtICp2bSA9IHZtYS0+dm07CisJdTMyIGZwZGUsIGxwZGU7CisKKwlpZiAodW5saWtlbHkodm1hLT5ub2RlID09IE5VTEwpKQorCQlyZXR1cm47CisJZnBkZSA9ICh2bWEtPm5vZGUtPm9mZnNldCA+PiB2bS0+cGd0X2JpdHMpOworCWxwZGUgPSAodm1hLT5ub2RlLT5vZmZzZXQgKyB2bWEtPm5vZGUtPmxlbmd0aCAtIDEpID4+IHZtLT5wZ3RfYml0czsKKworCW11dGV4X2xvY2soJnZtLT5tbS0+bXV0ZXgpOworCW5vdXZlYXVfdm1fdW5tYXBfcGd0KHZtLCB2bWEtPm5vZGUtPnR5cGUgIT0gdm0tPnNwZ19zaGlmdCwgZnBkZSwgbHBkZSk7CisJbm91dmVhdV9tbV9wdXQodm0tPm1tLCB2bWEtPm5vZGUpOworCXZtYS0+bm9kZSA9IE5VTEw7CisJbXV0ZXhfdW5sb2NrKCZ2bS0+bW0tPm11dGV4KTsKK30KKworaW50Citub3V2ZWF1X3ZtX25ldyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1NjQgb2Zmc2V0LCB1NjQgbGVuZ3RoLCB1NjQgbW1fb2Zmc2V0LAorCSAgICAgICBzdHJ1Y3Qgbm91dmVhdV92bSAqKnB2bSkKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBub3V2ZWF1X3ZtICp2bTsKKwl1NjQgbW1fbGVuZ3RoID0gKG9mZnNldCArIGxlbmd0aCkgLSBtbV9vZmZzZXQ7CisJdTMyIGJsb2NrLCBwZ3RfYml0czsKKwlpbnQgcmV0OworCisJdm0gPSBremFsbG9jKHNpemVvZigqdm0pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXZtKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlID09IE5WXzUwKSB7CisJCXZtLT5tYXBfcGd0ID0gbnY1MF92bV9tYXBfcGd0OworCQl2bS0+bWFwID0gbnY1MF92bV9tYXA7CisJCXZtLT5tYXBfc2cgPSBudjUwX3ZtX21hcF9zZzsKKwkJdm0tPnVubWFwID0gbnY1MF92bV91bm1hcDsKKwkJdm0tPmZsdXNoID0gbnY1MF92bV9mbHVzaDsKKwkJdm0tPnNwZ19zaGlmdCA9IDEyOworCQl2bS0+bHBnX3NoaWZ0ID0gMTY7CisKKwkJcGd0X2JpdHMgPSAyOTsKKwkJYmxvY2sgPSAoMSA8PCBwZ3RfYml0cyk7CisJCWlmIChsZW5ndGggPCBibG9jaykKKwkJCWJsb2NrID0gbGVuZ3RoOworCisJfSBlbHNlCisJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPT0gTlZfQzApIHsKKwkJdm0tPm1hcF9wZ3QgPSBudmMwX3ZtX21hcF9wZ3Q7CisJCXZtLT5tYXAgPSBudmMwX3ZtX21hcDsKKwkJdm0tPm1hcF9zZyA9IG52YzBfdm1fbWFwX3NnOworCQl2bS0+dW5tYXAgPSBudmMwX3ZtX3VubWFwOworCQl2bS0+Zmx1c2ggPSBudmMwX3ZtX2ZsdXNoOworCQl2bS0+c3BnX3NoaWZ0ID0gMTI7CisJCXZtLT5scGdfc2hpZnQgPSAxNzsKKwkJcGd0X2JpdHMgPSAyNzsKKworCQkvKiBTaG91bGQgYmUgNDA5NiBldmVyeXdoZXJlLCB0aGlzIGlzIGEgaGFjayB0aGF0J3MKKwkJICogY3VycmVudGx5IG5lY2Vzc2FyeSB0byBhdm9pZCBhbiBlbHVzaXZlIGJ1ZyB0aGF0CisJCSAqIGNhdXNlcyBjb3JydXB0aW9uIHdoZW4gbWl4aW5nIHNtYWxsL2xhcmdlIHBhZ2VzCisJCSAqLworCQlpZiAobGVuZ3RoIDwgKDFVTEwgPDwgNDApKQorCQkJYmxvY2sgPSA0MDk2OworCQllbHNlIHsKKwkJCWJsb2NrID0gKDEgPDwgcGd0X2JpdHMpOworCQkJaWYgKGxlbmd0aCA8IGJsb2NrKQorCQkJCWJsb2NrID0gbGVuZ3RoOworCQl9CisJfSBlbHNlIHsKKwkJa2ZyZWUodm0pOworCQlyZXR1cm4gLUVOT1NZUzsKKwl9CisKKwl2bS0+ZnBkZSAgID0gb2Zmc2V0ID4+IHBndF9iaXRzOworCXZtLT5scGRlICAgPSAob2Zmc2V0ICsgbGVuZ3RoIC0gMSkgPj4gcGd0X2JpdHM7CisJdm0tPnBndCA9IGtjYWxsb2Modm0tPmxwZGUgLSB2bS0+ZnBkZSArIDEsIHNpemVvZigqdm0tPnBndCksIEdGUF9LRVJORUwpOworCWlmICghdm0tPnBndCkgeworCQlrZnJlZSh2bSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCUlOSVRfTElTVF9IRUFEKCZ2bS0+cGdkX2xpc3QpOworCXZtLT5kZXYgPSBkZXY7CisJdm0tPnJlZmNvdW50ID0gMTsKKwl2bS0+cGd0X2JpdHMgPSBwZ3RfYml0cyAtIDEyOworCisJcmV0ID0gbm91dmVhdV9tbV9pbml0KCZ2bS0+bW0sIG1tX29mZnNldCA+PiAxMiwgbW1fbGVuZ3RoID4+IDEyLAorCQkJICAgICAgYmxvY2sgPj4gMTIpOworCWlmIChyZXQpIHsKKwkJa2ZyZWUodm0pOworCQlyZXR1cm4gcmV0OworCX0KKworCSpwdm0gPSB2bTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorbm91dmVhdV92bV9saW5rKHN0cnVjdCBub3V2ZWF1X3ZtICp2bSwgc3RydWN0IG5vdXZlYXVfZ3B1b2JqICpwZ2QpCit7CisJc3RydWN0IG5vdXZlYXVfdm1fcGdkICp2cGdkOworCWludCBpOworCisJaWYgKCFwZ2QpCisJCXJldHVybiAwOworCisJdnBnZCA9IGt6YWxsb2Moc2l6ZW9mKCp2cGdkKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCF2cGdkKQorCQlyZXR1cm4gLUVOT01FTTsKKworCW5vdXZlYXVfZ3B1b2JqX3JlZihwZ2QsICZ2cGdkLT5vYmopOworCisJbXV0ZXhfbG9jaygmdm0tPm1tLT5tdXRleCk7CisJZm9yIChpID0gdm0tPmZwZGU7IGkgPD0gdm0tPmxwZGU7IGkrKykKKwkJdm0tPm1hcF9wZ3QocGdkLCBpLCB2bS0+cGd0W2kgLSB2bS0+ZnBkZV0ub2JqKTsKKwlsaXN0X2FkZCgmdnBnZC0+aGVhZCwgJnZtLT5wZ2RfbGlzdCk7CisJbXV0ZXhfdW5sb2NrKCZ2bS0+bW0tPm11dGV4KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQKK25vdXZlYXVfdm1fdW5saW5rKHN0cnVjdCBub3V2ZWF1X3ZtICp2bSwgc3RydWN0IG5vdXZlYXVfZ3B1b2JqICpwZ2QpCit7CisJc3RydWN0IG5vdXZlYXVfdm1fcGdkICp2cGdkLCAqdG1wOworCisJaWYgKCFwZ2QpCisJCXJldHVybjsKKworCW11dGV4X2xvY2soJnZtLT5tbS0+bXV0ZXgpOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSh2cGdkLCB0bXAsICZ2bS0+cGdkX2xpc3QsIGhlYWQpIHsKKwkJaWYgKHZwZ2QtPm9iaiAhPSBwZ2QpCisJCQljb250aW51ZTsKKworCQlsaXN0X2RlbCgmdnBnZC0+aGVhZCk7CisJCW5vdXZlYXVfZ3B1b2JqX3JlZihOVUxMLCAmdnBnZC0+b2JqKTsKKwkJa2ZyZWUodnBnZCk7CisJfQorCW11dGV4X3VubG9jaygmdm0tPm1tLT5tdXRleCk7Cit9CisKK3N0YXRpYyB2b2lkCitub3V2ZWF1X3ZtX2RlbChzdHJ1Y3Qgbm91dmVhdV92bSAqdm0pCit7CisJc3RydWN0IG5vdXZlYXVfdm1fcGdkICp2cGdkLCAqdG1wOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHZwZ2QsIHRtcCwgJnZtLT5wZ2RfbGlzdCwgaGVhZCkgeworCQlub3V2ZWF1X3ZtX3VubGluayh2bSwgdnBnZC0+b2JqKTsKKwl9CisJV0FSTl9PTihub3V2ZWF1X21tX2ZpbmkoJnZtLT5tbSkgIT0gMCk7CisKKwlrZnJlZSh2bS0+cGd0KTsKKwlrZnJlZSh2bSk7Cit9CisKK2ludAorbm91dmVhdV92bV9yZWYoc3RydWN0IG5vdXZlYXVfdm0gKnJlZiwgc3RydWN0IG5vdXZlYXVfdm0gKipwdHIsCisJICAgICAgIHN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqcGdkKQoreworCXN0cnVjdCBub3V2ZWF1X3ZtICp2bTsKKwlpbnQgcmV0OworCisJdm0gPSByZWY7CisJaWYgKHZtKSB7CisJCXJldCA9IG5vdXZlYXVfdm1fbGluayh2bSwgcGdkKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisKKwkJdm0tPnJlZmNvdW50Kys7CisJfQorCisJdm0gPSAqcHRyOworCSpwdHIgPSByZWY7CisKKwlpZiAodm0pIHsKKwkJbm91dmVhdV92bV91bmxpbmsodm0sIHBnZCk7CisKKwkJaWYgKC0tdm0tPnJlZmNvdW50ID09IDApCisJCQlub3V2ZWF1X3ZtX2RlbCh2bSk7CisJfQorCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X3ZtLmggYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X3ZtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTExOTM1MQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfdm0uaApAQCAtMCwwICsxLDExMyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDEwIFJlZCBIYXQgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIENPUFlSSUdIVCBIT0xERVIoUykgT1IgQVVUSE9SKFMpIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIEF1dGhvcnM6IEJlbiBTa2VnZ3MKKyAqLworCisjaWZuZGVmIF9fTk9VVkVBVV9WTV9IX18KKyNkZWZpbmUgX19OT1VWRUFVX1ZNX0hfXworCisjaW5jbHVkZSAiZHJtUC5oIgorCisjaW5jbHVkZSAibm91dmVhdV9kcnYuaCIKKyNpbmNsdWRlICJub3V2ZWF1X21tLmgiCisKK3N0cnVjdCBub3V2ZWF1X3ZtX3BndCB7CisJc3RydWN0IG5vdXZlYXVfZ3B1b2JqICpvYmpbMl07CisJdTMyIHJlZmNvdW50WzJdOworfTsKKworc3RydWN0IG5vdXZlYXVfdm1fcGdkIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGhlYWQ7CisJc3RydWN0IG5vdXZlYXVfZ3B1b2JqICpvYmo7Cit9OworCitzdHJ1Y3Qgbm91dmVhdV92bWEgeworCXN0cnVjdCBub3V2ZWF1X3ZtICp2bTsKKwlzdHJ1Y3Qgbm91dmVhdV9tbV9ub2RlICpub2RlOworCXU2NCBvZmZzZXQ7CisJdTMyIGFjY2VzczsKK307CisKK3N0cnVjdCBub3V2ZWF1X3ZtIHsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2OworCXN0cnVjdCBub3V2ZWF1X21tICptbTsKKwlpbnQgcmVmY291bnQ7CisKKwlzdHJ1Y3QgbGlzdF9oZWFkIHBnZF9saXN0OworCWF0b21pY190IHBncmFwaF9yZWZzOworCWF0b21pY190IHBjcnlwdF9yZWZzOworCisJc3RydWN0IG5vdXZlYXVfdm1fcGd0ICpwZ3Q7CisJdTMyIGZwZGU7CisJdTMyIGxwZGU7CisKKwl1MzIgcGd0X2JpdHM7CisJdTggIHNwZ19zaGlmdDsKKwl1OCAgbHBnX3NoaWZ0OworCisJdm9pZCAoKm1hcF9wZ3QpKHN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqcGdkLCB1MzIgcGRlLAorCQkJc3RydWN0IG5vdXZlYXVfZ3B1b2JqICpwZ3RbMl0pOworCXZvaWQgKCptYXApKHN0cnVjdCBub3V2ZWF1X3ZtYSAqLCBzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKiwKKwkJICAgIHN0cnVjdCBub3V2ZWF1X3ZyYW0gKiwgdTMyIHB0ZSwgdTMyIGNudCwgdTY0IHBoeXMpOworCXZvaWQgKCptYXBfc2cpKHN0cnVjdCBub3V2ZWF1X3ZtYSAqLCBzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKiwKKwkJICAgICAgIHUzMiBwdGUsIGRtYV9hZGRyX3QgKiwgdTMyIGNudCk7CisJdm9pZCAoKnVubWFwKShzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKnBndCwgdTMyIHB0ZSwgdTMyIGNudCk7CisJdm9pZCAoKmZsdXNoKShzdHJ1Y3Qgbm91dmVhdV92bSAqKTsKK307CisKKy8qIG5vdXZlYXVfdm0uYyAqLworaW50ICBub3V2ZWF1X3ZtX25ldyhzdHJ1Y3QgZHJtX2RldmljZSAqLCB1NjQgb2Zmc2V0LCB1NjQgbGVuZ3RoLCB1NjQgbW1fb2Zmc2V0LAorCQkgICAgc3RydWN0IG5vdXZlYXVfdm0gKiopOworaW50ICBub3V2ZWF1X3ZtX3JlZihzdHJ1Y3Qgbm91dmVhdV92bSAqLCBzdHJ1Y3Qgbm91dmVhdV92bSAqKiwKKwkJICAgIHN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqcGdkKTsKK2ludCAgbm91dmVhdV92bV9nZXQoc3RydWN0IG5vdXZlYXVfdm0gKiwgdTY0IHNpemUsIHUzMiBwYWdlX3NoaWZ0LAorCQkgICAgdTMyIGFjY2Vzcywgc3RydWN0IG5vdXZlYXVfdm1hICopOwordm9pZCBub3V2ZWF1X3ZtX3B1dChzdHJ1Y3Qgbm91dmVhdV92bWEgKik7Cit2b2lkIG5vdXZlYXVfdm1fbWFwKHN0cnVjdCBub3V2ZWF1X3ZtYSAqLCBzdHJ1Y3Qgbm91dmVhdV92cmFtICopOwordm9pZCBub3V2ZWF1X3ZtX21hcF9hdChzdHJ1Y3Qgbm91dmVhdV92bWEgKiwgdTY0IG9mZnNldCwgc3RydWN0IG5vdXZlYXVfdnJhbSAqKTsKK3ZvaWQgbm91dmVhdV92bV91bm1hcChzdHJ1Y3Qgbm91dmVhdV92bWEgKik7Cit2b2lkIG5vdXZlYXVfdm1fdW5tYXBfYXQoc3RydWN0IG5vdXZlYXVfdm1hICosIHU2NCBvZmZzZXQsIHU2NCBsZW5ndGgpOwordm9pZCBub3V2ZWF1X3ZtX21hcF9zZyhzdHJ1Y3Qgbm91dmVhdV92bWEgKiwgdTY0IG9mZnNldCwgdTY0IGxlbmd0aCwKKwkJICAgICAgIGRtYV9hZGRyX3QgKik7CisKKy8qIG52NTBfdm0uYyAqLwordm9pZCBudjUwX3ZtX21hcF9wZ3Qoc3RydWN0IG5vdXZlYXVfZ3B1b2JqICpwZ2QsIHUzMiBwZGUsCisJCSAgICAgc3RydWN0IG5vdXZlYXVfZ3B1b2JqICpwZ3RbMl0pOwordm9pZCBudjUwX3ZtX21hcChzdHJ1Y3Qgbm91dmVhdV92bWEgKiwgc3RydWN0IG5vdXZlYXVfZ3B1b2JqICosCisJCSBzdHJ1Y3Qgbm91dmVhdV92cmFtICosIHUzMiBwdGUsIHUzMiBjbnQsIHU2NCBwaHlzKTsKK3ZvaWQgbnY1MF92bV9tYXBfc2coc3RydWN0IG5vdXZlYXVfdm1hICosIHN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqLAorCQkgICAgdTMyIHB0ZSwgZG1hX2FkZHJfdCAqLCB1MzIgY250KTsKK3ZvaWQgbnY1MF92bV91bm1hcChzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKiwgdTMyIHB0ZSwgdTMyIGNudCk7Cit2b2lkIG52NTBfdm1fZmx1c2goc3RydWN0IG5vdXZlYXVfdm0gKik7Cit2b2lkIG52NTBfdm1fZmx1c2hfZW5naW5lKHN0cnVjdCBkcm1fZGV2aWNlICosIGludCBlbmdpbmUpOworCisvKiBudmMwX3ZtLmMgKi8KK3ZvaWQgbnZjMF92bV9tYXBfcGd0KHN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqcGdkLCB1MzIgcGRlLAorCQkgICAgIHN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqcGd0WzJdKTsKK3ZvaWQgbnZjMF92bV9tYXAoc3RydWN0IG5vdXZlYXVfdm1hICosIHN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqLAorCQkgc3RydWN0IG5vdXZlYXVfdnJhbSAqLCB1MzIgcHRlLCB1MzIgY250LCB1NjQgcGh5cyk7Cit2b2lkIG52YzBfdm1fbWFwX3NnKHN0cnVjdCBub3V2ZWF1X3ZtYSAqLCBzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKiwKKwkJICAgIHUzMiBwdGUsIGRtYV9hZGRyX3QgKiwgdTMyIGNudCk7Cit2b2lkIG52YzBfdm1fdW5tYXAoc3RydWN0IG5vdXZlYXVfZ3B1b2JqICosIHUzMiBwdGUsIHUzMiBjbnQpOwordm9pZCBudmMwX3ZtX2ZsdXNoKHN0cnVjdCBub3V2ZWF1X3ZtICopOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252MDRfY3J0Yy5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnYwNF9jcnRjLmMKaW5kZXggNDBlMTgwNy4uMjk3NTA1ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnYwNF9jcnRjLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnYwNF9jcnRjLmMKQEAgLTU1MSw3ICs1NTEsMTAgQEAKIAlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA+PSBOVl8zMCkKIAkJcmVncC0+Z3Bpb19leHQgPSBOVlJlYWRDUlRDKGRldiwgMCwgTlZfUENSVENfR1BJT19FWFQpOwogCi0JcmVncC0+Y3J0Y19jZmcgPSBOVl9QQ1JUQ19DT05GSUdfU1RBUlRfQUREUkVTU19IU1lOQzsKKwlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA+PSBOVl8xMCkKKwkJcmVncC0+Y3J0Y19jZmcgPSBOVjEwX1BDUlRDX0NPTkZJR19TVEFSVF9BRERSRVNTX0hTWU5DOworCWVsc2UKKwkJcmVncC0+Y3J0Y19jZmcgPSBOVjA0X1BDUlRDX0NPTkZJR19TVEFSVF9BRERSRVNTX0hTWU5DOwogCiAJLyogU29tZSBtaXNjIHJlZ3MgKi8KIAlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA9PSBOVl80MCkgewpAQCAtNjY5LDYgKzY3Miw3IEBACiAJaWYgKG52X3R3b19oZWFkcyhkZXYpKQogCQlOVlNldE93bmVyKGRldiwgbnZfY3J0Yy0+aW5kZXgpOwogCisJZHJtX3ZibGFua19wcmVfbW9kZXNldChkZXYsIG52X2NydGMtPmluZGV4KTsKIAlmdW5jcy0+ZHBtcyhjcnRjLCBEUk1fTU9ERV9EUE1TX09GRik7CiAKIAlOVkJsYW5rU2NyZWVuKGRldiwgbnZfY3J0Yy0+aW5kZXgsIHRydWUpOwpAQCAtNzAxLDYgKzcwNSw3IEBACiAjZW5kaWYKIAogCWZ1bmNzLT5kcG1zKGNydGMsIERSTV9NT0RFX0RQTVNfT04pOworCWRybV92YmxhbmtfcG9zdF9tb2Rlc2V0KGRldiwgbnZfY3J0Yy0+aW5kZXgpOwogfQogCiBzdGF0aWMgdm9pZCBudl9jcnRjX2Rlc3Ryb3koc3RydWN0IGRybV9jcnRjICpjcnRjKQpAQCAtOTg2LDYgKzk5MSw3IEBACiAJLmN1cnNvcl9tb3ZlID0gbnYwNF9jcnRjX2N1cnNvcl9tb3ZlLAogCS5nYW1tYV9zZXQgPSBudl9jcnRjX2dhbW1hX3NldCwKIAkuc2V0X2NvbmZpZyA9IGRybV9jcnRjX2hlbHBlcl9zZXRfY29uZmlnLAorCS5wYWdlX2ZsaXAgPSBub3V2ZWF1X2NydGNfcGFnZV9mbGlwLAogCS5kZXN0cm95ID0gbnZfY3J0Y19kZXN0cm95LAogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnYwNF9kYWMuYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252MDRfZGFjLmMKaW5kZXggYmE2NDIzZi4uZTAwMDQ1NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnYwNF9kYWMuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjA0X2RhYy5jCkBAIC03NCwxNCArNzQsMTQgQEAKIAkJICogdXNlIGEgMTBtcyB0aW1lb3V0IChndWFyZHMgYWdhaW5zdCBjcnRjIGJlaW5nIGluYWN0aXZlLCBpbgogCQkgKiB3aGljaCBjYXNlIGJsYW5rIHN0YXRlIHdvdWxkIG5ldmVyIGNoYW5nZSkKIAkJICovCi0JCWlmICghbm91dmVhdV93YWl0X3VudGlsKGRldiwgMTAwMDAwMDAsIE5WX1BSTUNJT19JTlAwX19DT0xPUiwKLQkJCQkJMHgwMDAwMDAwMSwgMHgwMDAwMDAwMCkpCisJCWlmICghbm91dmVhdV93YWl0X2VxKGRldiwgMTAwMDAwMDAsIE5WX1BSTUNJT19JTlAwX19DT0xPUiwKKwkJCQkgICAgIDB4MDAwMDAwMDEsIDB4MDAwMDAwMDApKQogCQkJcmV0dXJuIC1FQlVTWTsKLQkJaWYgKCFub3V2ZWF1X3dhaXRfdW50aWwoZGV2LCAxMDAwMDAwMCwgTlZfUFJNQ0lPX0lOUDBfX0NPTE9SLAotCQkJCQkweDAwMDAwMDAxLCAweDAwMDAwMDAxKSkKKwkJaWYgKCFub3V2ZWF1X3dhaXRfZXEoZGV2LCAxMDAwMDAwMCwgTlZfUFJNQ0lPX0lOUDBfX0NPTE9SLAorCQkJCSAgICAgMHgwMDAwMDAwMSwgMHgwMDAwMDAwMSkpCiAJCQlyZXR1cm4gLUVCVVNZOwotCQlpZiAoIW5vdXZlYXVfd2FpdF91bnRpbChkZXYsIDEwMDAwMDAwLCBOVl9QUk1DSU9fSU5QMF9fQ09MT1IsCi0JCQkJCTB4MDAwMDAwMDEsIDB4MDAwMDAwMDApKQorCQlpZiAoIW5vdXZlYXVfd2FpdF9lcShkZXYsIDEwMDAwMDAwLCBOVl9QUk1DSU9fSU5QMF9fQ09MT1IsCisJCQkJICAgICAweDAwMDAwMDAxLCAweDAwMDAwMDAwKSkKIAkJCXJldHVybiAtRUJVU1k7CiAKIAkJdWRlbGF5KDEwMCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjA0X2Rpc3BsYXkuYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252MDRfZGlzcGxheS5jCmluZGV4IDllMjhjZjcuLjE3MTVlMTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252MDRfZGlzcGxheS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252MDRfZGlzcGxheS5jCkBAIC0zMiw2ICszMiw5IEBACiAjaW5jbHVkZSAibm91dmVhdV9lbmNvZGVyLmgiCiAjaW5jbHVkZSAibm91dmVhdV9jb25uZWN0b3IuaCIKIAorc3RhdGljIHZvaWQgbnYwNF92YmxhbmtfY3J0YzBfaXNyKHN0cnVjdCBkcm1fZGV2aWNlICopOworc3RhdGljIHZvaWQgbnYwNF92YmxhbmtfY3J0YzFfaXNyKHN0cnVjdCBkcm1fZGV2aWNlICopOworCiBzdGF0aWMgdm9pZAogbnYwNF9kaXNwbGF5X3N0b3JlX2luaXRpYWxfaGVhZF9vd25lcihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogewpAQCAtMTk3LDYgKzIwMCw4IEBACiAJCWZ1bmMtPnNhdmUoZW5jb2Rlcik7CiAJfQogCisJbm91dmVhdV9pcnFfcmVnaXN0ZXIoZGV2LCAyNCwgbnYwNF92YmxhbmtfY3J0YzBfaXNyKTsKKwlub3V2ZWF1X2lycV9yZWdpc3RlcihkZXYsIDI1LCBudjA0X3ZibGFua19jcnRjMV9pc3IpOwogCXJldHVybiAwOwogfQogCkBAIC0yMDgsNiArMjEzLDkgQEAKIAogCU5WX0RFQlVHX0tNUyhkZXYsICJcbiIpOwogCisJbm91dmVhdV9pcnFfdW5yZWdpc3RlcihkZXYsIDI0KTsKKwlub3V2ZWF1X2lycV91bnJlZ2lzdGVyKGRldiwgMjUpOworCiAJLyogVHVybiBldmVyeSBDUlRDIG9mZi4gKi8KIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNydGMsICZkZXYtPm1vZGVfY29uZmlnLmNydGNfbGlzdCwgaGVhZCkgewogCQlzdHJ1Y3QgZHJtX21vZGVfc2V0IG1vZGVzZXQgPSB7CkBAIC0yNTgsMyArMjY2LDE2IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyB2b2lkCitudjA0X3ZibGFua19jcnRjMF9pc3Ioc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwludl93cjMyKGRldiwgTlZfQ1JUQzBfSU5UU1RBVCwgTlZfQ1JUQ19JTlRSX1ZCTEFOSyk7CisJZHJtX2hhbmRsZV92YmxhbmsoZGV2LCAwKTsKK30KKworc3RhdGljIHZvaWQKK252MDRfdmJsYW5rX2NydGMxX2lzcihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCW52X3dyMzIoZGV2LCBOVl9DUlRDMV9JTlRTVEFULCBOVl9DUlRDX0lOVFJfVkJMQU5LKTsKKwlkcm1faGFuZGxlX3ZibGFuayhkZXYsIDEpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnYwNF9mYmNvbi5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnYwNF9mYmNvbi5jCmluZGV4IDMzZTRjOTMuLjdhMTE4OTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252MDRfZmJjb24uYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjA0X2ZiY29uLmMKQEAgLTI4LDUyICsyOCwzOSBAQAogI2luY2x1ZGUgIm5vdXZlYXVfcmFtaHQuaCIKICNpbmNsdWRlICJub3V2ZWF1X2ZiY29uLmgiCiAKLXZvaWQKK2ludAogbnYwNF9mYmNvbl9jb3B5YXJlYShzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgY29uc3Qgc3RydWN0IGZiX2NvcHlhcmVhICpyZWdpb24pCiB7CiAJc3RydWN0IG5vdXZlYXVfZmJkZXYgKm5mYmRldiA9IGluZm8tPnBhcjsKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gbmZiZGV2LT5kZXY7CiAJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuID0gZGV2X3ByaXYtPmNoYW5uZWw7CisJaW50IHJldDsKIAotCWlmIChpbmZvLT5zdGF0ZSAhPSBGQklORk9fU1RBVEVfUlVOTklORykKLQkJcmV0dXJuOwotCi0JaWYgKCEoaW5mby0+ZmxhZ3MgJiBGQklORk9fSFdBQ0NFTF9ESVNBQkxFRCkgJiYgUklOR19TUEFDRShjaGFuLCA0KSkgewotCQlub3V2ZWF1X2ZiY29uX2dwdV9sb2NrdXAoaW5mbyk7Ci0JfQotCi0JaWYgKGluZm8tPmZsYWdzICYgRkJJTkZPX0hXQUNDRUxfRElTQUJMRUQpIHsKLQkJY2ZiX2NvcHlhcmVhKGluZm8sIHJlZ2lvbik7Ci0JCXJldHVybjsKLQl9CisJcmV0ID0gUklOR19TUEFDRShjaGFuLCA0KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OwogCiAJQkVHSU5fUklORyhjaGFuLCBOdlN1YkltYWdlQmxpdCwgMHgwMzAwLCAzKTsKIAlPVVRfUklORyhjaGFuLCAocmVnaW9uLT5zeSA8PCAxNikgfCByZWdpb24tPnN4KTsKIAlPVVRfUklORyhjaGFuLCAocmVnaW9uLT5keSA8PCAxNikgfCByZWdpb24tPmR4KTsKIAlPVVRfUklORyhjaGFuLCAocmVnaW9uLT5oZWlnaHQgPDwgMTYpIHwgcmVnaW9uLT53aWR0aCk7CiAJRklSRV9SSU5HKGNoYW4pOworCXJldHVybiAwOwogfQogCi12b2lkCitpbnQKIG52MDRfZmJjb25fZmlsbHJlY3Qoc3RydWN0IGZiX2luZm8gKmluZm8sIGNvbnN0IHN0cnVjdCBmYl9maWxscmVjdCAqcmVjdCkKIHsKIAlzdHJ1Y3Qgbm91dmVhdV9mYmRldiAqbmZiZGV2ID0gaW5mby0+cGFyOwogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBuZmJkZXYtPmRldjsKIAlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4gPSBkZXZfcHJpdi0+Y2hhbm5lbDsKKwlpbnQgcmV0OwogCi0JaWYgKGluZm8tPnN0YXRlICE9IEZCSU5GT19TVEFURV9SVU5OSU5HKQotCQlyZXR1cm47Ci0KLQlpZiAoIShpbmZvLT5mbGFncyAmIEZCSU5GT19IV0FDQ0VMX0RJU0FCTEVEKSAmJiBSSU5HX1NQQUNFKGNoYW4sIDcpKSB7Ci0JCW5vdXZlYXVfZmJjb25fZ3B1X2xvY2t1cChpbmZvKTsKLQl9Ci0KLQlpZiAoaW5mby0+ZmxhZ3MgJiBGQklORk9fSFdBQ0NFTF9ESVNBQkxFRCkgewotCQljZmJfZmlsbHJlY3QoaW5mbywgcmVjdCk7Ci0JCXJldHVybjsKLQl9CisJcmV0ID0gUklOR19TUEFDRShjaGFuLCA3KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OwogCiAJQkVHSU5fUklORyhjaGFuLCBOdlN1YkdkaVJlY3QsIDB4MDJmYywgMSk7CiAJT1VUX1JJTkcoY2hhbiwgKHJlY3QtPnJvcCAhPSBST1BfQ09QWSkgPyAxIDogMyk7CkBAIC04Nyw5ICs3NCwxMCBAQAogCU9VVF9SSU5HKGNoYW4sIChyZWN0LT5keCA8PCAxNikgfCByZWN0LT5keSk7CiAJT1VUX1JJTkcoY2hhbiwgKHJlY3QtPndpZHRoIDw8IDE2KSB8IHJlY3QtPmhlaWdodCk7CiAJRklSRV9SSU5HKGNoYW4pOworCXJldHVybiAwOwogfQogCi12b2lkCitpbnQKIG52MDRfZmJjb25faW1hZ2VibGl0KHN0cnVjdCBmYl9pbmZvICppbmZvLCBjb25zdCBzdHJ1Y3QgZmJfaW1hZ2UgKmltYWdlKQogewogCXN0cnVjdCBub3V2ZWF1X2ZiZGV2ICpuZmJkZXYgPSBpbmZvLT5wYXI7CkBAIC0xMDEsMjMgKzg5LDE0IEBACiAJdWludDMyX3QgZHNpemU7CiAJdWludDMyX3Qgd2lkdGg7CiAJdWludDMyX3QgKmRhdGEgPSAodWludDMyX3QgKilpbWFnZS0+ZGF0YTsKKwlpbnQgcmV0OwogCi0JaWYgKGluZm8tPnN0YXRlICE9IEZCSU5GT19TVEFURV9SVU5OSU5HKQotCQlyZXR1cm47CisJaWYgKGltYWdlLT5kZXB0aCAhPSAxKQorCQlyZXR1cm4gLUVOT0RFVjsKIAotCWlmIChpbWFnZS0+ZGVwdGggIT0gMSkgewotCQljZmJfaW1hZ2VibGl0KGluZm8sIGltYWdlKTsKLQkJcmV0dXJuOwotCX0KLQotCWlmICghKGluZm8tPmZsYWdzICYgRkJJTkZPX0hXQUNDRUxfRElTQUJMRUQpICYmIFJJTkdfU1BBQ0UoY2hhbiwgOCkpIHsKLQkJbm91dmVhdV9mYmNvbl9ncHVfbG9ja3VwKGluZm8pOwotCX0KLQotCWlmIChpbmZvLT5mbGFncyAmIEZCSU5GT19IV0FDQ0VMX0RJU0FCTEVEKSB7Ci0JCWNmYl9pbWFnZWJsaXQoaW5mbywgaW1hZ2UpOwotCQlyZXR1cm47Ci0JfQorCXJldCA9IFJJTkdfU1BBQ0UoY2hhbiwgOCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKIAogCXdpZHRoID0gQUxJR04oaW1hZ2UtPndpZHRoLCA4KTsKIAlkc2l6ZSA9IEFMSUdOKHdpZHRoICogaW1hZ2UtPmhlaWdodCwgMzIpID4+IDU7CkBAIC0xNDQsMTEgKzEyMyw5IEBACiAJd2hpbGUgKGRzaXplKSB7CiAJCWludCBpdGVyX2xlbiA9IGRzaXplID4gMTI4ID8gMTI4IDogZHNpemU7CiAKLQkJaWYgKFJJTkdfU1BBQ0UoY2hhbiwgaXRlcl9sZW4gKyAxKSkgewotCQkJbm91dmVhdV9mYmNvbl9ncHVfbG9ja3VwKGluZm8pOwotCQkJY2ZiX2ltYWdlYmxpdChpbmZvLCBpbWFnZSk7Ci0JCQlyZXR1cm47Ci0JCX0KKwkJcmV0ID0gUklOR19TUEFDRShjaGFuLCBpdGVyX2xlbiArIDEpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKIAogCQlCRUdJTl9SSU5HKGNoYW4sIE52U3ViR2RpUmVjdCwgMHgwYzAwLCBpdGVyX2xlbik7CiAJCU9VVF9SSU5HcChjaGFuLCBkYXRhLCBpdGVyX2xlbik7CkBAIC0xNTcsMjIgKzEzNCw3IEBACiAJfQogCiAJRklSRV9SSU5HKGNoYW4pOwotfQotCi1zdGF0aWMgaW50Ci1udjA0X2ZiY29uX2dyb2JqX25ldyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgY2xhc3MsIHVpbnQzMl90IGhhbmRsZSkKLXsKLQlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCXN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqb2JqID0gTlVMTDsKLQlpbnQgcmV0OwotCi0JcmV0ID0gbm91dmVhdV9ncHVvYmpfZ3JfbmV3KGRldl9wcml2LT5jaGFubmVsLCBjbGFzcywgJm9iaik7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCXJldCA9IG5vdXZlYXVfcmFtaHRfaW5zZXJ0KGRldl9wcml2LT5jaGFubmVsLCBoYW5kbGUsIG9iaik7Ci0Jbm91dmVhdV9ncHVvYmpfcmVmKE5VTEwsICZvYmopOwotCXJldHVybiByZXQ7CisJcmV0dXJuIDA7CiB9CiAKIGludApAQCAtMjE0LDI5ICsxNzYsMzEgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JcmV0ID0gbnYwNF9mYmNvbl9ncm9ial9uZXcoZGV2LCBkZXZfcHJpdi0+Y2FyZF90eXBlID49IE5WXzEwID8KLQkJCQkgICAweDAwNjIgOiAweDAwNDIsIE52Q3R4U3VyZjJEKTsKKwlyZXQgPSBub3V2ZWF1X2dwdW9ial9ncl9uZXcoY2hhbiwgTnZDdHhTdXJmMkQsCisJCQkJICAgIGRldl9wcml2LT5jYXJkX3R5cGUgPj0gTlZfMTAgPworCQkJCSAgICAweDAwNjIgOiAweDAwNDIpOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKLQlyZXQgPSBudjA0X2ZiY29uX2dyb2JqX25ldyhkZXYsIDB4MDAxOSwgTnZDbGlwUmVjdCk7CisJcmV0ID0gbm91dmVhdV9ncHVvYmpfZ3JfbmV3KGNoYW4sIE52Q2xpcFJlY3QsIDB4MDAxOSk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAotCXJldCA9IG52MDRfZmJjb25fZ3JvYmpfbmV3KGRldiwgMHgwMDQzLCBOdlJvcCk7CisJcmV0ID0gbm91dmVhdV9ncHVvYmpfZ3JfbmV3KGNoYW4sIE52Um9wLCAweDAwNDMpOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKLQlyZXQgPSBudjA0X2ZiY29uX2dyb2JqX25ldyhkZXYsIDB4MDA0NCwgTnZJbWFnZVBhdHQpOworCXJldCA9IG5vdXZlYXVfZ3B1b2JqX2dyX25ldyhjaGFuLCBOdkltYWdlUGF0dCwgMHgwMDQ0KTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCi0JcmV0ID0gbnYwNF9mYmNvbl9ncm9ial9uZXcoZGV2LCAweDAwNGEsIE52R2RpUmVjdCk7CisJcmV0ID0gbm91dmVhdV9ncHVvYmpfZ3JfbmV3KGNoYW4sIE52R2RpUmVjdCwgMHgwMDRhKTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCi0JcmV0ID0gbnYwNF9mYmNvbl9ncm9ial9uZXcoZGV2LCBkZXZfcHJpdi0+Y2hpcHNldCA+PSAweDExID8KLQkJCQkgICAweDAwOWYgOiAweDAwNWYsIE52SW1hZ2VCbGl0KTsKKwlyZXQgPSBub3V2ZWF1X2dwdW9ial9ncl9uZXcoY2hhbiwgTnZJbWFnZUJsaXQsCisJCQkJICAgIGRldl9wcml2LT5jaGlwc2V0ID49IDB4MTEgPworCQkJCSAgICAweDAwOWYgOiAweDAwNWYpOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252MDRfZmlmby5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnYwNF9maWZvLmMKaW5kZXggNzA4MjkzYi4uZjg5ZDEwNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnYwNF9maWZvLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnYwNF9maWZvLmMKQEAgLTI4LDYgKzI4LDcgQEAKICNpbmNsdWRlICJkcm0uaCIKICNpbmNsdWRlICJub3V2ZWF1X2Rydi5oIgogI2luY2x1ZGUgIm5vdXZlYXVfcmFtaHQuaCIKKyNpbmNsdWRlICJub3V2ZWF1X3V0aWwuaCIKIAogI2RlZmluZSBOVjA0X1JBTUZDKGMpIChkZXZfcHJpdi0+cmFtZmMtPnBpbnN0ICsgKChjKSAqIE5WMDRfUkFNRkNfX1NJWkUpKQogI2RlZmluZSBOVjA0X1JBTUZDX19TSVpFIDMyCkBAIC0xMjgsNiArMTI5LDExIEBACiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAorCWNoYW4tPnVzZXIgPSBpb3JlbWFwKHBjaV9yZXNvdXJjZV9zdGFydChkZXYtPnBkZXYsIDApICsKKwkJCSAgICAgTlYwM19VU0VSKGNoYW4tPmlkKSwgUEFHRV9TSVpFKTsKKwlpZiAoIWNoYW4tPnVzZXIpCisJCXJldHVybiAtRU5PTUVNOworCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmRldl9wcml2LT5jb250ZXh0X3N3aXRjaF9sb2NrLCBmbGFncyk7CiAKIAkvKiBTZXR1cCBpbml0aWFsIHN0YXRlICovCkBAIC0xNTEsMTAgKzE1NywzMSBAQAogbnYwNF9maWZvX2Rlc3Ryb3lfY29udGV4dChzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuKQogewogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjaGFuLT5kZXY7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3Qgbm91dmVhdV9maWZvX2VuZ2luZSAqcGZpZm8gPSAmZGV2X3ByaXYtPmVuZ2luZS5maWZvOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQludl93cjMyKGRldiwgTlYwNF9QRklGT19NT0RFLAotCQludl9yZDMyKGRldiwgTlYwNF9QRklGT19NT0RFKSAmIH4oMSA8PCBjaGFuLT5pZCkpOworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZfcHJpdi0+Y29udGV4dF9zd2l0Y2hfbG9jaywgZmxhZ3MpOworCXBmaWZvLT5yZWFzc2lnbihkZXYsIGZhbHNlKTsKIAorCS8qIFVubG9hZCB0aGUgY29udGV4dCBpZiBpdCdzIHRoZSBjdXJyZW50bHkgYWN0aXZlIG9uZSAqLworCWlmIChwZmlmby0+Y2hhbm5lbF9pZChkZXYpID09IGNoYW4tPmlkKSB7CisJCXBmaWZvLT5kaXNhYmxlKGRldik7CisJCXBmaWZvLT51bmxvYWRfY29udGV4dChkZXYpOworCQlwZmlmby0+ZW5hYmxlKGRldik7CisJfQorCisJLyogS2VlcCBpdCBmcm9tIGJlaW5nIHJlc2NoZWR1bGVkICovCisJbnZfbWFzayhkZXYsIE5WMDRfUEZJRk9fTU9ERSwgMSA8PCBjaGFuLT5pZCwgMCk7CisKKwlwZmlmby0+cmVhc3NpZ24oZGV2LCB0cnVlKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZfcHJpdi0+Y29udGV4dF9zd2l0Y2hfbG9jaywgZmxhZ3MpOworCisJLyogRnJlZSB0aGUgY2hhbm5lbCByZXNvdXJjZXMgKi8KKwlpZiAoY2hhbi0+dXNlcikgeworCQlpb3VubWFwKGNoYW4tPnVzZXIpOworCQljaGFuLT51c2VyID0gTlVMTDsKKwl9CiAJbm91dmVhdV9ncHVvYmpfcmVmKE5VTEwsICZjaGFuLT5yYW1mYyk7CiB9CiAKQEAgLTIwOCw3ICsyMzUsNyBAQAogCWlmIChjaGlkIDwgMCB8fCBjaGlkID49IGRldl9wcml2LT5lbmdpbmUuZmlmby5jaGFubmVscykKIAkJcmV0dXJuIDA7CiAKLQljaGFuID0gZGV2X3ByaXYtPmZpZm9zW2NoaWRdOworCWNoYW4gPSBkZXZfcHJpdi0+Y2hhbm5lbHMucHRyW2NoaWRdOwogCWlmICghY2hhbikgewogCQlOVl9FUlJPUihkZXYsICJJbmFjdGl2ZSBjaGFubmVsIG9uIFBGSUZPOiAlZFxuIiwgY2hpZCk7CiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMjY3LDYgKzI5NCw3IEBACiBzdGF0aWMgdm9pZAogbnYwNF9maWZvX2luaXRfaW50cihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogeworCW5vdXZlYXVfaXJxX3JlZ2lzdGVyKGRldiwgOCwgbnYwNF9maWZvX2lzcik7CiAJbnZfd3IzMihkZXYsIDB4MDAyMTAwLCAweGZmZmZmZmZmKTsKIAludl93cjMyKGRldiwgMHgwMDIxNDAsIDB4ZmZmZmZmZmYpOwogfQpAQCAtMjg5LDcgKzMxNyw3IEBACiAJcGZpZm8tPnJlYXNzaWduKGRldiwgdHJ1ZSk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgZGV2X3ByaXYtPmVuZ2luZS5maWZvLmNoYW5uZWxzOyBpKyspIHsKLQkJaWYgKGRldl9wcml2LT5maWZvc1tpXSkgeworCQlpZiAoZGV2X3ByaXYtPmNoYW5uZWxzLnB0cltpXSkgewogCQkJdWludDMyX3QgbW9kZSA9IG52X3JkMzIoZGV2LCBOVjA0X1BGSUZPX01PREUpOwogCQkJbnZfd3IzMihkZXYsIE5WMDRfUEZJRk9fTU9ERSwgbW9kZSB8ICgxIDw8IGkpKTsKIAkJfQpAQCAtMjk4LDMgKzMyNiwyMDcgQEAKIAlyZXR1cm4gMDsKIH0KIAordm9pZAorbnYwNF9maWZvX2Zpbmkoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwludl93cjMyKGRldiwgMHgyMTQwLCAweDAwMDAwMDAwKTsKKwlub3V2ZWF1X2lycV91bnJlZ2lzdGVyKGRldiwgOCk7Cit9CisKK3N0YXRpYyBib29sCitub3V2ZWF1X2ZpZm9fc3dtdGhkKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHUzMiBjaGlkLCB1MzIgYWRkciwgdTMyIGRhdGEpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuID0gTlVMTDsKKwlzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKm9iajsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWNvbnN0IGludCBzdWJjID0gKGFkZHIgPj4gMTMpICYgMHg3OworCWNvbnN0IGludCBtdGhkID0gYWRkciAmIDB4MWZmYzsKKwlib29sIGhhbmRsZWQgPSBmYWxzZTsKKwl1MzIgZW5naW5lOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldl9wcml2LT5jaGFubmVscy5sb2NrLCBmbGFncyk7CisJaWYgKGxpa2VseShjaGlkID49IDAgJiYgY2hpZCA8IGRldl9wcml2LT5lbmdpbmUuZmlmby5jaGFubmVscykpCisJCWNoYW4gPSBkZXZfcHJpdi0+Y2hhbm5lbHMucHRyW2NoaWRdOworCWlmICh1bmxpa2VseSghY2hhbikpCisJCWdvdG8gb3V0OworCisJc3dpdGNoIChtdGhkKSB7CisJY2FzZSAweDAwMDA6IC8qIGJpbmQgb2JqZWN0IHRvIHN1YmNoYW5uZWwgKi8KKwkJb2JqID0gbm91dmVhdV9yYW1odF9maW5kKGNoYW4sIGRhdGEpOworCQlpZiAodW5saWtlbHkoIW9iaiB8fCBvYmotPmVuZ2luZSAhPSBOVk9CSl9FTkdJTkVfU1cpKQorCQkJYnJlYWs7CisKKwkJY2hhbi0+c3dfc3ViY2hhbm5lbFtzdWJjXSA9IG9iai0+Y2xhc3M7CisJCWVuZ2luZSA9IDB4MDAwMDAwMGYgPDwgKHN1YmMgKiA0KTsKKworCQludl9tYXNrKGRldiwgTlYwNF9QRklGT19DQUNIRTFfRU5HSU5FLCBlbmdpbmUsIDB4MDAwMDAwMDApOworCQloYW5kbGVkID0gdHJ1ZTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZW5naW5lID0gbnZfcmQzMihkZXYsIE5WMDRfUEZJRk9fQ0FDSEUxX0VOR0lORSk7CisJCWlmICh1bmxpa2VseSgoKGVuZ2luZSA+PiAoc3ViYyAqIDQpKSAmIDB4ZikgIT0gMCkpCisJCQlicmVhazsKKworCQlpZiAoIW5vdXZlYXVfZ3B1b2JqX210aGRfY2FsbChjaGFuLCBjaGFuLT5zd19zdWJjaGFubmVsW3N1YmNdLAorCQkJCQkgICAgICBtdGhkLCBkYXRhKSkKKwkJCWhhbmRsZWQgPSB0cnVlOworCQlicmVhazsKKwl9CisKK291dDoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZfcHJpdi0+Y2hhbm5lbHMubG9jaywgZmxhZ3MpOworCXJldHVybiBoYW5kbGVkOworfQorCit2b2lkCitudjA0X2ZpZm9faXNyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3Qgbm91dmVhdV9lbmdpbmUgKmVuZ2luZSA9ICZkZXZfcHJpdi0+ZW5naW5lOworCXVpbnQzMl90IHN0YXR1cywgcmVhc3NpZ247CisJaW50IGNudCA9IDA7CisKKwlyZWFzc2lnbiA9IG52X3JkMzIoZGV2LCBOVjAzX1BGSUZPX0NBQ0hFUykgJiAxOworCXdoaWxlICgoc3RhdHVzID0gbnZfcmQzMihkZXYsIE5WMDNfUEZJRk9fSU5UUl8wKSkgJiYgKGNudCsrIDwgMTAwKSkgeworCQl1aW50MzJfdCBjaGlkLCBnZXQ7CisKKwkJbnZfd3IzMihkZXYsIE5WMDNfUEZJRk9fQ0FDSEVTLCAwKTsKKworCQljaGlkID0gZW5naW5lLT5maWZvLmNoYW5uZWxfaWQoZGV2KTsKKwkJZ2V0ICA9IG52X3JkMzIoZGV2LCBOVjAzX1BGSUZPX0NBQ0hFMV9HRVQpOworCisJCWlmIChzdGF0dXMgJiBOVl9QRklGT19JTlRSX0NBQ0hFX0VSUk9SKSB7CisJCQl1aW50MzJfdCBtdGhkLCBkYXRhOworCQkJaW50IHB0cjsKKworCQkJLyogTlZfUEZJRk9fQ0FDSEUxX0dFVCBhY3R1YWxseSBnb2VzIHRvIDB4ZmZjIGJlZm9yZQorCQkJICogd3JhcHBpbmcgb24gbXkgRzgwIGNoaXBzLCBidXQgQ0FDSEUxIGlzbid0IGJpZworCQkJICogZW5vdWdoIGZvciB0aGlzIG11Y2ggZGF0YS4uIFRlc3RzIHNob3cgdGhhdCBpdAorCQkJICogd3JhcHMgYXJvdW5kIHRvIHRoZSBzdGFydCBhdCBHRVQ9MHg4MDAuLiBObyBjbHVlCisJCQkgKiBhcyB0byB3aHkuLgorCQkJICovCisJCQlwdHIgPSAoZ2V0ICYgMHg3ZmYpID4+IDI7CisKKwkJCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlIDwgTlZfNDApIHsKKwkJCQltdGhkID0gbnZfcmQzMihkZXYsCisJCQkJCU5WMDRfUEZJRk9fQ0FDSEUxX01FVEhPRChwdHIpKTsKKwkJCQlkYXRhID0gbnZfcmQzMihkZXYsCisJCQkJCU5WMDRfUEZJRk9fQ0FDSEUxX0RBVEEocHRyKSk7CisJCQl9IGVsc2UgeworCQkJCW10aGQgPSBudl9yZDMyKGRldiwKKwkJCQkJTlY0MF9QRklGT19DQUNIRTFfTUVUSE9EKHB0cikpOworCQkJCWRhdGEgPSBudl9yZDMyKGRldiwKKwkJCQkJTlY0MF9QRklGT19DQUNIRTFfREFUQShwdHIpKTsKKwkJCX0KKworCQkJaWYgKCFub3V2ZWF1X2ZpZm9fc3dtdGhkKGRldiwgY2hpZCwgbXRoZCwgZGF0YSkpIHsKKwkJCQlOVl9JTkZPKGRldiwgIlBGSUZPX0NBQ0hFX0VSUk9SIC0gQ2ggJWQvJWQgIgorCQkJCQkgICAgICJNdGhkIDB4JTA0eCBEYXRhIDB4JTA4eFxuIiwKKwkJCQkJY2hpZCwgKG10aGQgPj4gMTMpICYgNywgbXRoZCAmIDB4MWZmYywKKwkJCQkJZGF0YSk7CisJCQl9CisKKwkJCW52X3dyMzIoZGV2LCBOVjA0X1BGSUZPX0NBQ0hFMV9ETUFfUFVTSCwgMCk7CisJCQludl93cjMyKGRldiwgTlYwM19QRklGT19JTlRSXzAsCisJCQkJCQlOVl9QRklGT19JTlRSX0NBQ0hFX0VSUk9SKTsKKworCQkJbnZfd3IzMihkZXYsIE5WMDNfUEZJRk9fQ0FDSEUxX1BVU0gwLAorCQkJCW52X3JkMzIoZGV2LCBOVjAzX1BGSUZPX0NBQ0hFMV9QVVNIMCkgJiB+MSk7CisJCQludl93cjMyKGRldiwgTlYwM19QRklGT19DQUNIRTFfR0VULCBnZXQgKyA0KTsKKwkJCW52X3dyMzIoZGV2LCBOVjAzX1BGSUZPX0NBQ0hFMV9QVVNIMCwKKwkJCQludl9yZDMyKGRldiwgTlYwM19QRklGT19DQUNIRTFfUFVTSDApIHwgMSk7CisJCQludl93cjMyKGRldiwgTlYwNF9QRklGT19DQUNIRTFfSEFTSCwgMCk7CisKKwkJCW52X3dyMzIoZGV2LCBOVjA0X1BGSUZPX0NBQ0hFMV9ETUFfUFVTSCwKKwkJCQludl9yZDMyKGRldiwgTlYwNF9QRklGT19DQUNIRTFfRE1BX1BVU0gpIHwgMSk7CisJCQludl93cjMyKGRldiwgTlYwNF9QRklGT19DQUNIRTFfUFVMTDAsIDEpOworCisJCQlzdGF0dXMgJj0gfk5WX1BGSUZPX0lOVFJfQ0FDSEVfRVJST1I7CisJCX0KKworCQlpZiAoc3RhdHVzICYgTlZfUEZJRk9fSU5UUl9ETUFfUFVTSEVSKSB7CisJCQl1MzIgZG1hX2dldCA9IG52X3JkMzIoZGV2LCAweDAwMzI0NCk7CisJCQl1MzIgZG1hX3B1dCA9IG52X3JkMzIoZGV2LCAweDAwMzI0MCk7CisJCQl1MzIgcHVzaCA9IG52X3JkMzIoZGV2LCAweDAwMzIyMCk7CisJCQl1MzIgc3RhdGUgPSBudl9yZDMyKGRldiwgMHgwMDMyMjgpOworCisJCQlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA9PSBOVl81MCkgeworCQkJCXUzMiBob19nZXQgPSBudl9yZDMyKGRldiwgMHgwMDMzMjgpOworCQkJCXUzMiBob19wdXQgPSBudl9yZDMyKGRldiwgMHgwMDMzMjApOworCQkJCXUzMiBpYl9nZXQgPSBudl9yZDMyKGRldiwgMHgwMDMzMzQpOworCQkJCXUzMiBpYl9wdXQgPSBudl9yZDMyKGRldiwgMHgwMDMzMzApOworCisJCQkJaWYgKG5vdXZlYXVfcmF0ZWxpbWl0KCkpCisJCQkJCU5WX0lORk8oZGV2LCAiUEZJRk9fRE1BX1BVU0hFUiAtIENoICVkIEdldCAweCUwMnglMDh4ICIKKwkJCQkJICAgICAiUHV0IDB4JTAyeCUwOHggSWJHZXQgMHglMDh4IEliUHV0IDB4JTA4eCAiCisJCQkJCSAgICAgIlN0YXRlIDB4JTA4eCBQdXNoIDB4JTA4eFxuIiwKKwkJCQkJCWNoaWQsIGhvX2dldCwgZG1hX2dldCwgaG9fcHV0LAorCQkJCQkJZG1hX3B1dCwgaWJfZ2V0LCBpYl9wdXQsIHN0YXRlLAorCQkJCQkJcHVzaCk7CisKKwkJCQkvKiBNRVRIT0RfQ09VTlQsIGluIERNQV9TVEFURSBvbiBlYXJsaWVyIGNoaXBzZXRzICovCisJCQkJbnZfd3IzMihkZXYsIDB4MDAzMzY0LCAweDAwMDAwMDAwKTsKKwkJCQlpZiAoZG1hX2dldCAhPSBkbWFfcHV0IHx8IGhvX2dldCAhPSBob19wdXQpIHsKKwkJCQkJbnZfd3IzMihkZXYsIDB4MDAzMjQ0LCBkbWFfcHV0KTsKKwkJCQkJbnZfd3IzMihkZXYsIDB4MDAzMzI4LCBob19wdXQpOworCQkJCX0gZWxzZQorCQkJCWlmIChpYl9nZXQgIT0gaWJfcHV0KSB7CisJCQkJCW52X3dyMzIoZGV2LCAweDAwMzMzNCwgaWJfcHV0KTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCU5WX0lORk8oZGV2LCAiUEZJRk9fRE1BX1BVU0hFUiAtIENoICVkIEdldCAweCUwOHggIgorCQkJCQkgICAgICJQdXQgMHglMDh4IFN0YXRlIDB4JTA4eCBQdXNoIDB4JTA4eFxuIiwKKwkJCQkJY2hpZCwgZG1hX2dldCwgZG1hX3B1dCwgc3RhdGUsIHB1c2gpOworCisJCQkJaWYgKGRtYV9nZXQgIT0gZG1hX3B1dCkKKwkJCQkJbnZfd3IzMihkZXYsIDB4MDAzMjQ0LCBkbWFfcHV0KTsKKwkJCX0KKworCQkJbnZfd3IzMihkZXYsIDB4MDAzMjI4LCAweDAwMDAwMDAwKTsKKwkJCW52X3dyMzIoZGV2LCAweDAwMzIyMCwgMHgwMDAwMDAwMSk7CisJCQludl93cjMyKGRldiwgMHgwMDIxMDAsIE5WX1BGSUZPX0lOVFJfRE1BX1BVU0hFUik7CisJCQlzdGF0dXMgJj0gfk5WX1BGSUZPX0lOVFJfRE1BX1BVU0hFUjsKKwkJfQorCisJCWlmIChzdGF0dXMgJiBOVl9QRklGT19JTlRSX1NFTUFQSE9SRSkgeworCQkJdWludDMyX3Qgc2VtOworCisJCQlzdGF0dXMgJj0gfk5WX1BGSUZPX0lOVFJfU0VNQVBIT1JFOworCQkJbnZfd3IzMihkZXYsIE5WMDNfUEZJRk9fSU5UUl8wLAorCQkJCU5WX1BGSUZPX0lOVFJfU0VNQVBIT1JFKTsKKworCQkJc2VtID0gbnZfcmQzMihkZXYsIE5WMTBfUEZJRk9fQ0FDSEUxX1NFTUFQSE9SRSk7CisJCQludl93cjMyKGRldiwgTlYxMF9QRklGT19DQUNIRTFfU0VNQVBIT1JFLCBzZW0gfCAweDEpOworCisJCQludl93cjMyKGRldiwgTlYwM19QRklGT19DQUNIRTFfR0VULCBnZXQgKyA0KTsKKwkJCW52X3dyMzIoZGV2LCBOVjA0X1BGSUZPX0NBQ0hFMV9QVUxMMCwgMSk7CisJCX0KKworCQlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA9PSBOVl81MCkgeworCQkJaWYgKHN0YXR1cyAmIDB4MDAwMDAwMTApIHsKKwkJCQludjUwX2ZiX3ZtX3RyYXAoZGV2LCAxLCAiUEZJRk9fQkFSX0ZBVUxUIik7CisJCQkJc3RhdHVzICY9IH4weDAwMDAwMDEwOworCQkJCW52X3dyMzIoZGV2LCAweDAwMjEwMCwgMHgwMDAwMDAxMCk7CisJCQl9CisJCX0KKworCQlpZiAoc3RhdHVzKSB7CisJCQlpZiAobm91dmVhdV9yYXRlbGltaXQoKSkKKwkJCQlOVl9JTkZPKGRldiwgIlBGSUZPX0lOVFIgMHglMDh4IC0gQ2ggJWRcbiIsCisJCQkJCXN0YXR1cywgY2hpZCk7CisJCQludl93cjMyKGRldiwgTlYwM19QRklGT19JTlRSXzAsIHN0YXR1cyk7CisJCQlzdGF0dXMgPSAwOworCQl9CisKKwkJbnZfd3IzMihkZXYsIE5WMDNfUEZJRk9fQ0FDSEVTLCByZWFzc2lnbik7CisJfQorCisJaWYgKHN0YXR1cykgeworCQlOVl9JTkZPKGRldiwgIlBGSUZPIHN0aWxsIGFuZ3J5IGFmdGVyICVkIHNwaW5zLCBoYWx0XG4iLCBjbnQpOworCQludl93cjMyKGRldiwgMHgyMTQwLCAwKTsKKwkJbnZfd3IzMihkZXYsIDB4MTQwLCAwKTsKKwl9CisKKwludl93cjMyKGRldiwgTlYwM19QTUNfSU5UUl8wLCBOVl9QTUNfSU5UUl8wX1BGSUZPX1BFTkRJTkcpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnYwNF9ncmFwaC5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnYwNF9ncmFwaC5jCmluZGV4IGM4OTczNDIuLmFmNzUwMTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252MDRfZ3JhcGguYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjA0X2dyYXBoLmMKQEAgLTI2LDYgKzI2LDExIEBACiAjaW5jbHVkZSAiZHJtLmgiCiAjaW5jbHVkZSAibm91dmVhdV9kcm0uaCIKICNpbmNsdWRlICJub3V2ZWF1X2Rydi5oIgorI2luY2x1ZGUgIm5vdXZlYXVfaHcuaCIKKyNpbmNsdWRlICJub3V2ZWF1X3V0aWwuaCIKKworc3RhdGljIGludCAgbnYwNF9ncmFwaF9yZWdpc3RlcihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIG52MDRfZ3JhcGhfaXNyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwogCiBzdGF0aWMgdWludDMyX3QgbnYwNF9ncmFwaF9jdHhfcmVnc1tdID0gewogCTB4MDA0MDA1M2MsCkBAIC0zNTcsMTAgKzM2MiwxMCBAQAogCWlmIChjaGlkID49IGRldl9wcml2LT5lbmdpbmUuZmlmby5jaGFubmVscykKIAkJcmV0dXJuIE5VTEw7CiAKLQlyZXR1cm4gZGV2X3ByaXYtPmZpZm9zW2NoaWRdOworCXJldHVybiBkZXZfcHJpdi0+Y2hhbm5lbHMucHRyW2NoaWRdOwogfQogCi12b2lkCitzdGF0aWMgdm9pZAogbnYwNF9ncmFwaF9jb250ZXh0X3N3aXRjaChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogewogCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CkBAIC0zNjgsNyArMzczLDYgQEAKIAlzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuID0gTlVMTDsKIAlpbnQgY2hpZDsKIAotCXBncmFwaC0+Zmlmb19hY2Nlc3MoZGV2LCBmYWxzZSk7CiAJbm91dmVhdV93YWl0X2Zvcl9pZGxlKGRldik7CiAKIAkvKiBJZiBwcmV2aW91cyBjb250ZXh0IGlzIHZhbGlkLCB3ZSBuZWVkIHRvIHNhdmUgaXQgKi8KQEAgLTM3NiwxMSArMzgwLDkgQEAKIAogCS8qIExvYWQgY29udGV4dCBmb3IgbmV4dCBjaGFubmVsICovCiAJY2hpZCA9IGRldl9wcml2LT5lbmdpbmUuZmlmby5jaGFubmVsX2lkKGRldik7Ci0JY2hhbiA9IGRldl9wcml2LT5maWZvc1tjaGlkXTsKKwljaGFuID0gZGV2X3ByaXYtPmNoYW5uZWxzLnB0cltjaGlkXTsKIAlpZiAoY2hhbikKIAkJbnYwNF9ncmFwaF9sb2FkX2NvbnRleHQoY2hhbik7Ci0KLQlwZ3JhcGgtPmZpZm9fYWNjZXNzKGRldiwgdHJ1ZSk7CiB9CiAKIHN0YXRpYyB1aW50MzJfdCAqY3R4X3JlZyhzdHJ1Y3QgZ3JhcGhfc3RhdGUgKmN0eCwgdWludDMyX3QgcmVnKQpAQCAtNDEyLDEwICs0MTQsMjUgQEAKIAogdm9pZCBudjA0X2dyYXBoX2Rlc3Ryb3lfY29udGV4dChzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuKQogeworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjaGFuLT5kZXY7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3Qgbm91dmVhdV9wZ3JhcGhfZW5naW5lICpwZ3JhcGggPSAmZGV2X3ByaXYtPmVuZ2luZS5ncmFwaDsKIAlzdHJ1Y3QgZ3JhcGhfc3RhdGUgKnBncmFwaF9jdHggPSBjaGFuLT5wZ3JhcGhfY3R4OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2X3ByaXYtPmNvbnRleHRfc3dpdGNoX2xvY2ssIGZsYWdzKTsKKwlwZ3JhcGgtPmZpZm9fYWNjZXNzKGRldiwgZmFsc2UpOworCisJLyogVW5sb2FkIHRoZSBjb250ZXh0IGlmIGl0J3MgdGhlIGN1cnJlbnRseSBhY3RpdmUgb25lICovCisJaWYgKHBncmFwaC0+Y2hhbm5lbChkZXYpID09IGNoYW4pCisJCXBncmFwaC0+dW5sb2FkX2NvbnRleHQoZGV2KTsKKworCS8qIEZyZWUgdGhlIGNvbnRleHQgcmVzb3VyY2VzICovCiAJa2ZyZWUocGdyYXBoX2N0eCk7CiAJY2hhbi0+cGdyYXBoX2N0eCA9IE5VTEw7CisKKwlwZ3JhcGgtPmZpZm9fYWNjZXNzKGRldiwgdHJ1ZSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2X3ByaXYtPmNvbnRleHRfc3dpdGNoX2xvY2ssIGZsYWdzKTsKIH0KIAogaW50IG52MDRfZ3JhcGhfbG9hZF9jb250ZXh0KHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4pCkBAIC00NjgsMTMgKzQ4NSwxOSBAQAogewogCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJdWludDMyX3QgdG1wOworCWludCByZXQ7CiAKIAludl93cjMyKGRldiwgTlYwM19QTUNfRU5BQkxFLCBudl9yZDMyKGRldiwgTlYwM19QTUNfRU5BQkxFKSAmCiAJCQl+TlZfUE1DX0VOQUJMRV9QR1JBUEgpOwogCW52X3dyMzIoZGV2LCBOVjAzX1BNQ19FTkFCTEUsIG52X3JkMzIoZGV2LCBOVjAzX1BNQ19FTkFCTEUpIHwKIAkJCSBOVl9QTUNfRU5BQkxFX1BHUkFQSCk7CiAKKwlyZXQgPSBudjA0X2dyYXBoX3JlZ2lzdGVyKGRldik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwogCS8qIEVuYWJsZSBQR1JBUEggaW50ZXJydXB0cyAqLworCW5vdXZlYXVfaXJxX3JlZ2lzdGVyKGRldiwgMTIsIG52MDRfZ3JhcGhfaXNyKTsKIAludl93cjMyKGRldiwgTlYwM19QR1JBUEhfSU5UUiwgMHhGRkZGRkZGRik7CiAJbnZfd3IzMihkZXYsIE5WMDNfUEdSQVBIX0lOVFJfRU4sIDB4RkZGRkZGRkYpOwogCkBAIC01MTAsNiArNTMzLDggQEAKIAogdm9pZCBudjA0X2dyYXBoX3Rha2Vkb3duKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7CisJbnZfd3IzMihkZXYsIE5WMDNfUEdSQVBIX0lOVFJfRU4sIDB4MDAwMDAwMDApOworCW5vdXZlYXVfaXJxX3VucmVnaXN0ZXIoZGV2LCAxMik7CiB9CiAKIHZvaWQKQEAgLTUyNCwxMyArNTQ5LDI3IEBACiB9CiAKIHN0YXRpYyBpbnQKLW52MDRfZ3JhcGhfbXRoZF9zZXRfcmVmKHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4sIGludCBncmNsYXNzLAotCQkJaW50IG10aGQsIHVpbnQzMl90IGRhdGEpCitudjA0X2dyYXBoX210aGRfc2V0X3JlZihzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuLAorCQkJdTMyIGNsYXNzLCB1MzIgbXRoZCwgdTMyIGRhdGEpCiB7CiAJYXRvbWljX3NldCgmY2hhbi0+ZmVuY2UubGFzdF9zZXF1ZW5jZV9pcnEsIGRhdGEpOwogCXJldHVybiAwOwogfQogCitpbnQKK252MDRfZ3JhcGhfbXRoZF9wYWdlX2ZsaXAoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbiwKKwkJCSAgdTMyIGNsYXNzLCB1MzIgbXRoZCwgdTMyIGRhdGEpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNoYW4tPmRldjsKKwlzdHJ1Y3Qgbm91dmVhdV9wYWdlX2ZsaXBfc3RhdGUgczsKKworCWlmICghbm91dmVhdV9maW5pc2hfcGFnZV9mbGlwKGNoYW4sICZzKSkKKwkJbnZfc2V0X2NydGNfYmFzZShkZXYsIHMuY3J0YywKKwkJCQkgcy5vZmZzZXQgKyBzLnkgKiBzLnBpdGNoICsgcy54ICogcy5icHAgLyA4KTsKKworCXJldHVybiAwOworfQorCiAvKgogICogU29mdHdhcmUgbWV0aG9kcywgd2h5IHRoZXkgYXJlIG5lZWRlZCwgYW5kIGhvdyB0aGV5IGFsbCB3b3JrOgogICoKQEAgLTYwNiwxMiArNjQ1LDEyIEBACiAgKi8KIAogc3RhdGljIHZvaWQKLW52MDRfZ3JhcGhfc2V0X2N0eDEoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbiwgdWludDMyX3QgbWFzaywgdWludDMyX3QgdmFsdWUpCitudjA0X2dyYXBoX3NldF9jdHgxKHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4sIHUzMiBtYXNrLCB1MzIgdmFsdWUpCiB7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNoYW4tPmRldjsKLQl1aW50MzJfdCBpbnN0YW5jZSA9IChudl9yZDMyKGRldiwgTlYwNF9QR1JBUEhfQ1RYX1NXSVRDSDQpICYgMHhmZmZmKSA8PCA0OworCXUzMiBpbnN0YW5jZSA9IChudl9yZDMyKGRldiwgTlYwNF9QR1JBUEhfQ1RYX1NXSVRDSDQpICYgMHhmZmZmKSA8PCA0OwogCWludCBzdWJjID0gKG52X3JkMzIoZGV2LCBOVjA0X1BHUkFQSF9UUkFQUEVEX0FERFIpID4+IDEzKSAmIDB4NzsKLQl1aW50MzJfdCB0bXA7CisJdTMyIHRtcDsKIAogCXRtcCAgPSBudl9yaTMyKGRldiwgaW5zdGFuY2UpOwogCXRtcCAmPSB+bWFzazsKQEAgLTYyMywxMSArNjYyLDExIEBACiB9CiAKIHN0YXRpYyB2b2lkCi1udjA0X2dyYXBoX3NldF9jdHhfdmFsKHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4sIHVpbnQzMl90IG1hc2ssIHVpbnQzMl90IHZhbHVlKQorbnYwNF9ncmFwaF9zZXRfY3R4X3ZhbChzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuLCB1MzIgbWFzaywgdTMyIHZhbHVlKQogewogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjaGFuLT5kZXY7Ci0JdWludDMyX3QgaW5zdGFuY2UgPSAobnZfcmQzMihkZXYsIE5WMDRfUEdSQVBIX0NUWF9TV0lUQ0g0KSAmIDB4ZmZmZikgPDwgNDsKLQl1aW50MzJfdCB0bXAsIGN0eDE7CisJdTMyIGluc3RhbmNlID0gKG52X3JkMzIoZGV2LCBOVjA0X1BHUkFQSF9DVFhfU1dJVENINCkgJiAweGZmZmYpIDw8IDQ7CisJdTMyIHRtcCwgY3R4MTsKIAlpbnQgY2xhc3MsIG9wLCB2YWxpZCA9IDE7CiAKIAljdHgxID0gbnZfcmkzMihkZXYsIGluc3RhbmNlKTsKQEAgLTY3MiwxMyArNzExLDEzIEBACiB9CiAKIHN0YXRpYyBpbnQKLW52MDRfZ3JhcGhfbXRoZF9zZXRfb3BlcmF0aW9uKHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4sIGludCBncmNsYXNzLAotCQkJICAgICAgaW50IG10aGQsIHVpbnQzMl90IGRhdGEpCitudjA0X2dyYXBoX210aGRfc2V0X29wZXJhdGlvbihzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuLAorCQkJICAgICAgdTMyIGNsYXNzLCB1MzIgbXRoZCwgdTMyIGRhdGEpCiB7CiAJaWYgKGRhdGEgPiA1KQogCQlyZXR1cm4gMTsKIAkvKiBPbGQgdmVyc2lvbnMgb2YgdGhlIG9iamVjdHMgb25seSBhY2NlcHQgZmlyc3QgdGhyZWUgb3BlcmF0aW9ucy4gKi8KLQlpZiAoZGF0YSA+IDIgJiYgZ3JjbGFzcyA8IDB4NDApCisJaWYgKGRhdGEgPiAyICYmIGNsYXNzIDwgMHg0MCkKIAkJcmV0dXJuIDE7CiAJbnYwNF9ncmFwaF9zZXRfY3R4MShjaGFuLCAweDAwMDM4MDAwLCBkYXRhIDw8IDE1KTsKIAkvKiBjaGFuZ2luZyBvcGVyYXRpb24gY2hhbmdlcyBzZXQgb2Ygb2JqZWN0cyBuZWVkZWQgZm9yIHZhbGlkYXRpb24gKi8KQEAgLTY4Nyw4ICs3MjYsOCBAQAogfQogCiBzdGF0aWMgaW50Ci1udjA0X2dyYXBoX210aGRfc3VyZjNkX2NsaXBfaChzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuLCBpbnQgZ3JjbGFzcywKLQkJCSAgICAgIGludCBtdGhkLCB1aW50MzJfdCBkYXRhKQorbnYwNF9ncmFwaF9tdGhkX3N1cmYzZF9jbGlwX2goc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbiwKKwkJCSAgICAgIHUzMiBjbGFzcywgdTMyIG10aGQsIHUzMiBkYXRhKQogewogCXVpbnQzMl90IG1pbiA9IGRhdGEgJiAweGZmZmYsIG1heDsKIAl1aW50MzJfdCB3ID0gZGF0YSA+PiAxNjsKQEAgLTcwNiw4ICs3NDUsOCBAQAogfQogCiBzdGF0aWMgaW50Ci1udjA0X2dyYXBoX210aGRfc3VyZjNkX2NsaXBfdihzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuLCBpbnQgZ3JjbGFzcywKLQkJCSAgICAgIGludCBtdGhkLCB1aW50MzJfdCBkYXRhKQorbnYwNF9ncmFwaF9tdGhkX3N1cmYzZF9jbGlwX3Yoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbiwKKwkJCSAgICAgIHUzMiBjbGFzcywgdTMyIG10aGQsIHUzMiBkYXRhKQogewogCXVpbnQzMl90IG1pbiA9IGRhdGEgJiAweGZmZmYsIG1heDsKIAl1aW50MzJfdCB3ID0gZGF0YSA+PiAxNjsKQEAgLTcyNSw4ICs3NjQsOCBAQAogfQogCiBzdGF0aWMgaW50Ci1udjA0X2dyYXBoX210aGRfYmluZF9zdXJmMmQoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbiwgaW50IGdyY2xhc3MsCi0JCQkgICAgICBpbnQgbXRoZCwgdWludDMyX3QgZGF0YSkKK252MDRfZ3JhcGhfbXRoZF9iaW5kX3N1cmYyZChzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuLAorCQkJICAgIHUzMiBjbGFzcywgdTMyIG10aGQsIHUzMiBkYXRhKQogewogCXN3aXRjaCAobnZfcmkzMihjaGFuLT5kZXYsIGRhdGEgPDwgNCkgJiAweGZmKSB7CiAJY2FzZSAweDMwOgpAQCAtNzQyLDggKzc4MSw4IEBACiB9CiAKIHN0YXRpYyBpbnQKLW52MDRfZ3JhcGhfbXRoZF9iaW5kX3N1cmYyZF9zd3pzdXJmKHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4sIGludCBncmNsYXNzLAotCQkJICAgICAgaW50IG10aGQsIHVpbnQzMl90IGRhdGEpCitudjA0X2dyYXBoX210aGRfYmluZF9zdXJmMmRfc3d6c3VyZihzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuLAorCQkJCSAgICB1MzIgY2xhc3MsIHUzMiBtdGhkLCB1MzIgZGF0YSkKIHsKIAlzd2l0Y2ggKG52X3JpMzIoY2hhbi0+ZGV2LCBkYXRhIDw8IDQpICYgMHhmZikgewogCWNhc2UgMHgzMDoKQEAgLTc2Myw4ICs4MDIsOCBAQAogfQogCiBzdGF0aWMgaW50Ci1udjA0X2dyYXBoX210aGRfYmluZF9udjAxX3BhdHQoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbiwgaW50IGdyY2xhc3MsCi0JCQkgICAgICBpbnQgbXRoZCwgdWludDMyX3QgZGF0YSkKK252MDRfZ3JhcGhfbXRoZF9iaW5kX252MDFfcGF0dChzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuLAorCQkJICAgICAgIHUzMiBjbGFzcywgdTMyIG10aGQsIHUzMiBkYXRhKQogewogCXN3aXRjaCAobnZfcmkzMihjaGFuLT5kZXYsIGRhdGEgPDwgNCkgJiAweGZmKSB7CiAJY2FzZSAweDMwOgpAQCAtNzc4LDggKzgxNyw4IEBACiB9CiAKIHN0YXRpYyBpbnQKLW52MDRfZ3JhcGhfbXRoZF9iaW5kX252MDRfcGF0dChzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuLCBpbnQgZ3JjbGFzcywKLQkJCSAgICAgIGludCBtdGhkLCB1aW50MzJfdCBkYXRhKQorbnYwNF9ncmFwaF9tdGhkX2JpbmRfbnYwNF9wYXR0KHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4sCisJCQkgICAgICAgdTMyIGNsYXNzLCB1MzIgbXRoZCwgdTMyIGRhdGEpCiB7CiAJc3dpdGNoIChudl9yaTMyKGNoYW4tPmRldiwgZGF0YSA8PCA0KSAmIDB4ZmYpIHsKIAljYXNlIDB4MzA6CkBAIC03OTMsOCArODMyLDggQEAKIH0KIAogc3RhdGljIGludAotbnYwNF9ncmFwaF9tdGhkX2JpbmRfcm9wKHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4sIGludCBncmNsYXNzLAotCQkJICAgICAgaW50IG10aGQsIHVpbnQzMl90IGRhdGEpCitudjA0X2dyYXBoX210aGRfYmluZF9yb3Aoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbiwKKwkJCSB1MzIgY2xhc3MsIHUzMiBtdGhkLCB1MzIgZGF0YSkKIHsKIAlzd2l0Y2ggKG52X3JpMzIoY2hhbi0+ZGV2LCBkYXRhIDw8IDQpICYgMHhmZikgewogCWNhc2UgMHgzMDoKQEAgLTgwOCw4ICs4NDcsOCBAQAogfQogCiBzdGF0aWMgaW50Ci1udjA0X2dyYXBoX210aGRfYmluZF9iZXRhMShzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuLCBpbnQgZ3JjbGFzcywKLQkJCSAgICAgIGludCBtdGhkLCB1aW50MzJfdCBkYXRhKQorbnYwNF9ncmFwaF9tdGhkX2JpbmRfYmV0YTEoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbiwKKwkJCSAgIHUzMiBjbGFzcywgdTMyIG10aGQsIHUzMiBkYXRhKQogewogCXN3aXRjaCAobnZfcmkzMihjaGFuLT5kZXYsIGRhdGEgPDwgNCkgJiAweGZmKSB7CiAJY2FzZSAweDMwOgpAQCAtODIzLDggKzg2Miw4IEBACiB9CiAKIHN0YXRpYyBpbnQKLW52MDRfZ3JhcGhfbXRoZF9iaW5kX2JldGE0KHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4sIGludCBncmNsYXNzLAotCQkJICAgICAgaW50IG10aGQsIHVpbnQzMl90IGRhdGEpCitudjA0X2dyYXBoX210aGRfYmluZF9iZXRhNChzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuLAorCQkJICAgdTMyIGNsYXNzLCB1MzIgbXRoZCwgdTMyIGRhdGEpCiB7CiAJc3dpdGNoIChudl9yaTMyKGNoYW4tPmRldiwgZGF0YSA8PCA0KSAmIDB4ZmYpIHsKIAljYXNlIDB4MzA6CkBAIC04MzgsOCArODc3LDggQEAKIH0KIAogc3RhdGljIGludAotbnYwNF9ncmFwaF9tdGhkX2JpbmRfc3VyZl9kc3Qoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbiwgaW50IGdyY2xhc3MsCi0JCQkgICAgICBpbnQgbXRoZCwgdWludDMyX3QgZGF0YSkKK252MDRfZ3JhcGhfbXRoZF9iaW5kX3N1cmZfZHN0KHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4sCisJCQkgICAgICB1MzIgY2xhc3MsIHUzMiBtdGhkLCB1MzIgZGF0YSkKIHsKIAlzd2l0Y2ggKG52X3JpMzIoY2hhbi0+ZGV2LCBkYXRhIDw8IDQpICYgMHhmZikgewogCWNhc2UgMHgzMDoKQEAgLTg1Myw4ICs4OTIsOCBAQAogfQogCiBzdGF0aWMgaW50Ci1udjA0X2dyYXBoX210aGRfYmluZF9zdXJmX3NyYyhzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuLCBpbnQgZ3JjbGFzcywKLQkJCSAgICAgIGludCBtdGhkLCB1aW50MzJfdCBkYXRhKQorbnYwNF9ncmFwaF9tdGhkX2JpbmRfc3VyZl9zcmMoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbiwKKwkJCSAgICAgIHUzMiBjbGFzcywgdTMyIG10aGQsIHUzMiBkYXRhKQogewogCXN3aXRjaCAobnZfcmkzMihjaGFuLT5kZXYsIGRhdGEgPDwgNCkgJiAweGZmKSB7CiAJY2FzZSAweDMwOgpAQCAtODY4LDggKzkwNyw4IEBACiB9CiAKIHN0YXRpYyBpbnQKLW52MDRfZ3JhcGhfbXRoZF9iaW5kX3N1cmZfY29sb3Ioc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbiwgaW50IGdyY2xhc3MsCi0JCQkgICAgICBpbnQgbXRoZCwgdWludDMyX3QgZGF0YSkKK252MDRfZ3JhcGhfbXRoZF9iaW5kX3N1cmZfY29sb3Ioc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbiwKKwkJCQl1MzIgY2xhc3MsIHUzMiBtdGhkLCB1MzIgZGF0YSkKIHsKIAlzd2l0Y2ggKG52X3JpMzIoY2hhbi0+ZGV2LCBkYXRhIDw8IDQpICYgMHhmZikgewogCWNhc2UgMHgzMDoKQEAgLTg4Myw4ICs5MjIsOCBAQAogfQogCiBzdGF0aWMgaW50Ci1udjA0X2dyYXBoX210aGRfYmluZF9zdXJmX3pldGEoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbiwgaW50IGdyY2xhc3MsCi0JCQkgICAgICBpbnQgbXRoZCwgdWludDMyX3QgZGF0YSkKK252MDRfZ3JhcGhfbXRoZF9iaW5kX3N1cmZfemV0YShzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuLAorCQkJICAgICAgIHUzMiBjbGFzcywgdTMyIG10aGQsIHUzMiBkYXRhKQogewogCXN3aXRjaCAobnZfcmkzMihjaGFuLT5kZXYsIGRhdGEgPDwgNCkgJiAweGZmKSB7CiAJY2FzZSAweDMwOgpAQCAtODk4LDggKzkzNyw4IEBACiB9CiAKIHN0YXRpYyBpbnQKLW52MDRfZ3JhcGhfbXRoZF9iaW5kX2NsaXAoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbiwgaW50IGdyY2xhc3MsCi0JCQkgICAgICBpbnQgbXRoZCwgdWludDMyX3QgZGF0YSkKK252MDRfZ3JhcGhfbXRoZF9iaW5kX2NsaXAoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbiwKKwkJCSAgdTMyIGNsYXNzLCB1MzIgbXRoZCwgdTMyIGRhdGEpCiB7CiAJc3dpdGNoIChudl9yaTMyKGNoYW4tPmRldiwgZGF0YSA8PCA0KSAmIDB4ZmYpIHsKIAljYXNlIDB4MzA6CkBAIC05MTMsOCArOTUyLDggQEAKIH0KIAogc3RhdGljIGludAotbnYwNF9ncmFwaF9tdGhkX2JpbmRfY2hyb21hKHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4sIGludCBncmNsYXNzLAotCQkJICAgICAgaW50IG10aGQsIHVpbnQzMl90IGRhdGEpCitudjA0X2dyYXBoX210aGRfYmluZF9jaHJvbWEoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbiwKKwkJCSAgICB1MzIgY2xhc3MsIHUzMiBtdGhkLCB1MzIgZGF0YSkKIHsKIAlzd2l0Y2ggKG52X3JpMzIoY2hhbi0+ZGV2LCBkYXRhIDw8IDQpICYgMHhmZikgewogCWNhc2UgMHgzMDoKQEAgLTkzMCwxOTQgKzk2OSwzNDYgQEAKIAlyZXR1cm4gMTsKIH0KIAotc3RhdGljIHN0cnVjdCBub3V2ZWF1X3BncmFwaF9vYmplY3RfbWV0aG9kIG52MDRfZ3JhcGhfbXRoZHNfc3dbXSA9IHsKLQl7IDB4MDE1MCwgbnYwNF9ncmFwaF9tdGhkX3NldF9yZWYgfSwKK3N0YXRpYyBpbnQKK252MDRfZ3JhcGhfcmVnaXN0ZXIoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCisJaWYgKGRldl9wcml2LT5lbmdpbmUuZ3JhcGgucmVnaXN0ZXJlZCkKKwkJcmV0dXJuIDA7CisKKwkvKiBkdmQgc3VicGljdHVyZSAqLworCU5WT0JKX0NMQVNTKGRldiwgMHgwMDM4LCBHUik7CisKKwkvKiBtMm1mICovCisJTlZPQkpfQ0xBU1MoZGV2LCAweDAwMzksIEdSKTsKKworCS8qIG52MDMgZ2RpcmVjdCAqLworCU5WT0JKX0NMQVNTKGRldiwgMHgwMDRiLCBHUik7CisJTlZPQkpfTVRIRCAoZGV2LCAweDAwNGIsIDB4MDE4NCwgbnYwNF9ncmFwaF9tdGhkX2JpbmRfbnYwMV9wYXR0KTsKKwlOVk9CSl9NVEhEIChkZXYsIDB4MDA0YiwgMHgwMTg4LCBudjA0X2dyYXBoX210aGRfYmluZF9yb3ApOworCU5WT0JKX01USEQgKGRldiwgMHgwMDRiLCAweDAxOGMsIG52MDRfZ3JhcGhfbXRoZF9iaW5kX2JldGExKTsKKwlOVk9CSl9NVEhEIChkZXYsIDB4MDA0YiwgMHgwMTkwLCBudjA0X2dyYXBoX210aGRfYmluZF9zdXJmX2RzdCk7CisJTlZPQkpfTVRIRCAoZGV2LCAweDAwNGIsIDB4MDJmYywgbnYwNF9ncmFwaF9tdGhkX3NldF9vcGVyYXRpb24pOworCisJLyogbnYwNCBnZGlyZWN0ICovCisJTlZPQkpfQ0xBU1MoZGV2LCAweDAwNGEsIEdSKTsKKwlOVk9CSl9NVEhEIChkZXYsIDB4MDA0YSwgMHgwMTg4LCBudjA0X2dyYXBoX210aGRfYmluZF9udjA0X3BhdHQpOworCU5WT0JKX01USEQgKGRldiwgMHgwMDRhLCAweDAxOGMsIG52MDRfZ3JhcGhfbXRoZF9iaW5kX3JvcCk7CisJTlZPQkpfTVRIRCAoZGV2LCAweDAwNGEsIDB4MDE5MCwgbnYwNF9ncmFwaF9tdGhkX2JpbmRfYmV0YTEpOworCU5WT0JKX01USEQgKGRldiwgMHgwMDRhLCAweDAxOTQsIG52MDRfZ3JhcGhfbXRoZF9iaW5kX2JldGE0KTsKKwlOVk9CSl9NVEhEIChkZXYsIDB4MDA0YSwgMHgwMTk4LCBudjA0X2dyYXBoX210aGRfYmluZF9zdXJmMmQpOworCU5WT0JKX01USEQgKGRldiwgMHgwMDRhLCAweDAyZmMsIG52MDRfZ3JhcGhfbXRoZF9zZXRfb3BlcmF0aW9uKTsKKworCS8qIG52MDEgaW1hZ2VibGl0ICovCisJTlZPQkpfQ0xBU1MoZGV2LCAweDAwMWYsIEdSKTsKKwlOVk9CSl9NVEhEIChkZXYsIDB4MDAxZiwgMHgwMTg0LCBudjA0X2dyYXBoX210aGRfYmluZF9jaHJvbWEpOworCU5WT0JKX01USEQgKGRldiwgMHgwMDFmLCAweDAxODgsIG52MDRfZ3JhcGhfbXRoZF9iaW5kX2NsaXApOworCU5WT0JKX01USEQgKGRldiwgMHgwMDFmLCAweDAxOGMsIG52MDRfZ3JhcGhfbXRoZF9iaW5kX252MDFfcGF0dCk7CisJTlZPQkpfTVRIRCAoZGV2LCAweDAwMWYsIDB4MDE5MCwgbnYwNF9ncmFwaF9tdGhkX2JpbmRfcm9wKTsKKwlOVk9CSl9NVEhEIChkZXYsIDB4MDAxZiwgMHgwMTk0LCBudjA0X2dyYXBoX210aGRfYmluZF9iZXRhMSk7CisJTlZPQkpfTVRIRCAoZGV2LCAweDAwMWYsIDB4MDE5OCwgbnYwNF9ncmFwaF9tdGhkX2JpbmRfc3VyZl9kc3QpOworCU5WT0JKX01USEQgKGRldiwgMHgwMDFmLCAweDAxOWMsIG52MDRfZ3JhcGhfbXRoZF9iaW5kX3N1cmZfc3JjKTsKKwlOVk9CSl9NVEhEIChkZXYsIDB4MDAxZiwgMHgwMmZjLCBudjA0X2dyYXBoX210aGRfc2V0X29wZXJhdGlvbik7CisKKwkvKiBudjA0IGltYWdlYmxpdCAqLworCU5WT0JKX0NMQVNTKGRldiwgMHgwMDVmLCBHUik7CisJTlZPQkpfTVRIRCAoZGV2LCAweDAwNWYsIDB4MDE4NCwgbnYwNF9ncmFwaF9tdGhkX2JpbmRfY2hyb21hKTsKKwlOVk9CSl9NVEhEIChkZXYsIDB4MDA1ZiwgMHgwMTg4LCBudjA0X2dyYXBoX210aGRfYmluZF9jbGlwKTsKKwlOVk9CSl9NVEhEIChkZXYsIDB4MDA1ZiwgMHgwMThjLCBudjA0X2dyYXBoX210aGRfYmluZF9udjA0X3BhdHQpOworCU5WT0JKX01USEQgKGRldiwgMHgwMDVmLCAweDAxOTAsIG52MDRfZ3JhcGhfbXRoZF9iaW5kX3JvcCk7CisJTlZPQkpfTVRIRCAoZGV2LCAweDAwNWYsIDB4MDE5NCwgbnYwNF9ncmFwaF9tdGhkX2JpbmRfYmV0YTEpOworCU5WT0JKX01USEQgKGRldiwgMHgwMDVmLCAweDAxOTgsIG52MDRfZ3JhcGhfbXRoZF9iaW5kX2JldGE0KTsKKwlOVk9CSl9NVEhEIChkZXYsIDB4MDA1ZiwgMHgwMTljLCBudjA0X2dyYXBoX210aGRfYmluZF9zdXJmMmQpOworCU5WT0JKX01USEQgKGRldiwgMHgwMDVmLCAweDAyZmMsIG52MDRfZ3JhcGhfbXRoZF9zZXRfb3BlcmF0aW9uKTsKKworCS8qIG52MDQgaWlmYyAqLworCU5WT0JKX0NMQVNTKGRldiwgMHgwMDYwLCBHUik7CisJTlZPQkpfTVRIRCAoZGV2LCAweDAwNjAsIDB4MDE4OCwgbnYwNF9ncmFwaF9tdGhkX2JpbmRfY2hyb21hKTsKKwlOVk9CSl9NVEhEIChkZXYsIDB4MDA2MCwgMHgwMThjLCBudjA0X2dyYXBoX210aGRfYmluZF9jbGlwKTsKKwlOVk9CSl9NVEhEIChkZXYsIDB4MDA2MCwgMHgwMTkwLCBudjA0X2dyYXBoX210aGRfYmluZF9udjA0X3BhdHQpOworCU5WT0JKX01USEQgKGRldiwgMHgwMDYwLCAweDAxOTQsIG52MDRfZ3JhcGhfbXRoZF9iaW5kX3JvcCk7CisJTlZPQkpfTVRIRCAoZGV2LCAweDAwNjAsIDB4MDE5OCwgbnYwNF9ncmFwaF9tdGhkX2JpbmRfYmV0YTEpOworCU5WT0JKX01USEQgKGRldiwgMHgwMDYwLCAweDAxOWMsIG52MDRfZ3JhcGhfbXRoZF9iaW5kX2JldGE0KTsKKwlOVk9CSl9NVEhEIChkZXYsIDB4MDA2MCwgMHgwMWEwLCBudjA0X2dyYXBoX210aGRfYmluZF9zdXJmMmRfc3d6c3VyZik7CisJTlZPQkpfTVRIRCAoZGV2LCAweDAwNjAsIDB4MDNlNCwgbnYwNF9ncmFwaF9tdGhkX3NldF9vcGVyYXRpb24pOworCisJLyogbnYwNSBpaWZjICovCisJTlZPQkpfQ0xBU1MoZGV2LCAweDAwNjQsIEdSKTsKKworCS8qIG52MDEgaWZjICovCisJTlZPQkpfQ0xBU1MoZGV2LCAweDAwMjEsIEdSKTsKKwlOVk9CSl9NVEhEIChkZXYsIDB4MDAyMSwgMHgwMTg0LCBudjA0X2dyYXBoX210aGRfYmluZF9jaHJvbWEpOworCU5WT0JKX01USEQgKGRldiwgMHgwMDIxLCAweDAxODgsIG52MDRfZ3JhcGhfbXRoZF9iaW5kX2NsaXApOworCU5WT0JKX01USEQgKGRldiwgMHgwMDIxLCAweDAxOGMsIG52MDRfZ3JhcGhfbXRoZF9iaW5kX252MDFfcGF0dCk7CisJTlZPQkpfTVRIRCAoZGV2LCAweDAwMjEsIDB4MDE5MCwgbnYwNF9ncmFwaF9tdGhkX2JpbmRfcm9wKTsKKwlOVk9CSl9NVEhEIChkZXYsIDB4MDAyMSwgMHgwMTk0LCBudjA0X2dyYXBoX210aGRfYmluZF9iZXRhMSk7CisJTlZPQkpfTVRIRCAoZGV2LCAweDAwMjEsIDB4MDE5OCwgbnYwNF9ncmFwaF9tdGhkX2JpbmRfc3VyZl9kc3QpOworCU5WT0JKX01USEQgKGRldiwgMHgwMDIxLCAweDAyZmMsIG52MDRfZ3JhcGhfbXRoZF9zZXRfb3BlcmF0aW9uKTsKKworCS8qIG52MDQgaWZjICovCisJTlZPQkpfQ0xBU1MoZGV2LCAweDAwNjEsIEdSKTsKKwlOVk9CSl9NVEhEIChkZXYsIDB4MDA2MSwgMHgwMTg0LCBudjA0X2dyYXBoX210aGRfYmluZF9jaHJvbWEpOworCU5WT0JKX01USEQgKGRldiwgMHgwMDYxLCAweDAxODgsIG52MDRfZ3JhcGhfbXRoZF9iaW5kX2NsaXApOworCU5WT0JKX01USEQgKGRldiwgMHgwMDYxLCAweDAxOGMsIG52MDRfZ3JhcGhfbXRoZF9iaW5kX252MDRfcGF0dCk7CisJTlZPQkpfTVRIRCAoZGV2LCAweDAwNjEsIDB4MDE5MCwgbnYwNF9ncmFwaF9tdGhkX2JpbmRfcm9wKTsKKwlOVk9CSl9NVEhEIChkZXYsIDB4MDA2MSwgMHgwMTk0LCBudjA0X2dyYXBoX210aGRfYmluZF9iZXRhMSk7CisJTlZPQkpfTVRIRCAoZGV2LCAweDAwNjEsIDB4MDE5OCwgbnYwNF9ncmFwaF9tdGhkX2JpbmRfYmV0YTQpOworCU5WT0JKX01USEQgKGRldiwgMHgwMDYxLCAweDAxOWMsIG52MDRfZ3JhcGhfbXRoZF9iaW5kX3N1cmYyZCk7CisJTlZPQkpfTVRIRCAoZGV2LCAweDAwNjEsIDB4MDJmYywgbnYwNF9ncmFwaF9tdGhkX3NldF9vcGVyYXRpb24pOworCisJLyogbnYwNSBpZmMgKi8KKwlOVk9CSl9DTEFTUyhkZXYsIDB4MDA2NSwgR1IpOworCisJLyogbnYwMyBzaWZjICovCisJTlZPQkpfQ0xBU1MoZGV2LCAweDAwMzYsIEdSKTsKKwlOVk9CSl9NVEhEIChkZXYsIDB4MDAzNiwgMHgwMTg0LCBudjA0X2dyYXBoX210aGRfYmluZF9jaHJvbWEpOworCU5WT0JKX01USEQgKGRldiwgMHgwMDM2LCAweDAxODgsIG52MDRfZ3JhcGhfbXRoZF9iaW5kX252MDFfcGF0dCk7CisJTlZPQkpfTVRIRCAoZGV2LCAweDAwMzYsIDB4MDE4YywgbnYwNF9ncmFwaF9tdGhkX2JpbmRfcm9wKTsKKwlOVk9CSl9NVEhEIChkZXYsIDB4MDAzNiwgMHgwMTkwLCBudjA0X2dyYXBoX210aGRfYmluZF9iZXRhMSk7CisJTlZPQkpfTVRIRCAoZGV2LCAweDAwMzYsIDB4MDE5NCwgbnYwNF9ncmFwaF9tdGhkX2JpbmRfc3VyZl9kc3QpOworCU5WT0JKX01USEQgKGRldiwgMHgwMDM2LCAweDAyZmMsIG52MDRfZ3JhcGhfbXRoZF9zZXRfb3BlcmF0aW9uKTsKKworCS8qIG52MDQgc2lmYyAqLworCU5WT0JKX0NMQVNTKGRldiwgMHgwMDc2LCBHUik7CisJTlZPQkpfTVRIRCAoZGV2LCAweDAwNzYsIDB4MDE4NCwgbnYwNF9ncmFwaF9tdGhkX2JpbmRfY2hyb21hKTsKKwlOVk9CSl9NVEhEIChkZXYsIDB4MDA3NiwgMHgwMTg4LCBudjA0X2dyYXBoX210aGRfYmluZF9udjA0X3BhdHQpOworCU5WT0JKX01USEQgKGRldiwgMHgwMDc2LCAweDAxOGMsIG52MDRfZ3JhcGhfbXRoZF9iaW5kX3JvcCk7CisJTlZPQkpfTVRIRCAoZGV2LCAweDAwNzYsIDB4MDE5MCwgbnYwNF9ncmFwaF9tdGhkX2JpbmRfYmV0YTEpOworCU5WT0JKX01USEQgKGRldiwgMHgwMDc2LCAweDAxOTQsIG52MDRfZ3JhcGhfbXRoZF9iaW5kX2JldGE0KTsKKwlOVk9CSl9NVEhEIChkZXYsIDB4MDA3NiwgMHgwMTk4LCBudjA0X2dyYXBoX210aGRfYmluZF9zdXJmMmQpOworCU5WT0JKX01USEQgKGRldiwgMHgwMDc2LCAweDAyZmMsIG52MDRfZ3JhcGhfbXRoZF9zZXRfb3BlcmF0aW9uKTsKKworCS8qIG52MDUgc2lmYyAqLworCU5WT0JKX0NMQVNTKGRldiwgMHgwMDY2LCBHUik7CisKKwkvKiBudjAzIHNpZm0gKi8KKwlOVk9CSl9DTEFTUyhkZXYsIDB4MDAzNywgR1IpOworCU5WT0JKX01USEQgKGRldiwgMHgwMDM3LCAweDAxODgsIG52MDRfZ3JhcGhfbXRoZF9iaW5kX252MDFfcGF0dCk7CisJTlZPQkpfTVRIRCAoZGV2LCAweDAwMzcsIDB4MDE4YywgbnYwNF9ncmFwaF9tdGhkX2JpbmRfcm9wKTsKKwlOVk9CSl9NVEhEIChkZXYsIDB4MDAzNywgMHgwMTkwLCBudjA0X2dyYXBoX210aGRfYmluZF9iZXRhMSk7CisJTlZPQkpfTVRIRCAoZGV2LCAweDAwMzcsIDB4MDE5NCwgbnYwNF9ncmFwaF9tdGhkX2JpbmRfc3VyZl9kc3QpOworCU5WT0JKX01USEQgKGRldiwgMHgwMDM3LCAweDAzMDQsIG52MDRfZ3JhcGhfbXRoZF9zZXRfb3BlcmF0aW9uKTsKKworCS8qIG52MDQgc2lmbSAqLworCU5WT0JKX0NMQVNTKGRldiwgMHgwMDc3LCBHUik7CisJTlZPQkpfTVRIRCAoZGV2LCAweDAwNzcsIDB4MDE4OCwgbnYwNF9ncmFwaF9tdGhkX2JpbmRfbnYwNF9wYXR0KTsKKwlOVk9CSl9NVEhEIChkZXYsIDB4MDA3NywgMHgwMThjLCBudjA0X2dyYXBoX210aGRfYmluZF9yb3ApOworCU5WT0JKX01USEQgKGRldiwgMHgwMDc3LCAweDAxOTAsIG52MDRfZ3JhcGhfbXRoZF9iaW5kX2JldGExKTsKKwlOVk9CSl9NVEhEIChkZXYsIDB4MDA3NywgMHgwMTk0LCBudjA0X2dyYXBoX210aGRfYmluZF9iZXRhNCk7CisJTlZPQkpfTVRIRCAoZGV2LCAweDAwNzcsIDB4MDE5OCwgbnYwNF9ncmFwaF9tdGhkX2JpbmRfc3VyZjJkX3N3enN1cmYpOworCU5WT0JKX01USEQgKGRldiwgMHgwMDc3LCAweDAzMDQsIG52MDRfZ3JhcGhfbXRoZF9zZXRfb3BlcmF0aW9uKTsKKworCS8qIG51bGwgKi8KKwlOVk9CSl9DTEFTUyhkZXYsIDB4MDAzMCwgR1IpOworCisJLyogc3VyZjJkICovCisJTlZPQkpfQ0xBU1MoZGV2LCAweDAwNDIsIEdSKTsKKworCS8qIHJvcCAqLworCU5WT0JKX0NMQVNTKGRldiwgMHgwMDQzLCBHUik7CisKKwkvKiBiZXRhMSAqLworCU5WT0JKX0NMQVNTKGRldiwgMHgwMDEyLCBHUik7CisKKwkvKiBiZXRhNCAqLworCU5WT0JKX0NMQVNTKGRldiwgMHgwMDcyLCBHUik7CisKKwkvKiBjbGlwcmVjdCAqLworCU5WT0JKX0NMQVNTKGRldiwgMHgwMDE5LCBHUik7CisKKwkvKiBudjAxIHBhdHRlcm4gKi8KKwlOVk9CSl9DTEFTUyhkZXYsIDB4MDAxOCwgR1IpOworCisJLyogbnYwNCBwYXR0ZXJuICovCisJTlZPQkpfQ0xBU1MoZGV2LCAweDAwNDQsIEdSKTsKKworCS8qIHN3enN1cmYgKi8KKwlOVk9CSl9DTEFTUyhkZXYsIDB4MDA1MiwgR1IpOworCisJLyogc3VyZjNkICovCisJTlZPQkpfQ0xBU1MoZGV2LCAweDAwNTMsIEdSKTsKKwlOVk9CSl9NVEhEIChkZXYsIDB4MDA1MywgMHgwMmY4LCBudjA0X2dyYXBoX210aGRfc3VyZjNkX2NsaXBfaCk7CisJTlZPQkpfTVRIRCAoZGV2LCAweDAwNTMsIDB4MDJmYywgbnYwNF9ncmFwaF9tdGhkX3N1cmYzZF9jbGlwX3YpOworCisJLyogbnYwMyB0ZXhfdHJpICovCisJTlZPQkpfQ0xBU1MoZGV2LCAweDAwNDgsIEdSKTsKKwlOVk9CSl9NVEhEIChkZXYsIDB4MDA0OCwgMHgwMTg4LCBudjA0X2dyYXBoX210aGRfYmluZF9jbGlwKTsKKwlOVk9CSl9NVEhEIChkZXYsIDB4MDA0OCwgMHgwMThjLCBudjA0X2dyYXBoX210aGRfYmluZF9zdXJmX2NvbG9yKTsKKwlOVk9CSl9NVEhEIChkZXYsIDB4MDA0OCwgMHgwMTkwLCBudjA0X2dyYXBoX210aGRfYmluZF9zdXJmX3pldGEpOworCisJLyogdGV4X3RyaSAqLworCU5WT0JKX0NMQVNTKGRldiwgMHgwMDU0LCBHUik7CisKKwkvKiBtdWx0aXRleF90cmkgKi8KKwlOVk9CSl9DTEFTUyhkZXYsIDB4MDA1NSwgR1IpOworCisJLyogbnYwMSBjaHJvbWEgKi8KKwlOVk9CSl9DTEFTUyhkZXYsIDB4MDAxNywgR1IpOworCisJLyogbnYwNCBjaHJvbWEgKi8KKwlOVk9CSl9DTEFTUyhkZXYsIDB4MDA1NywgR1IpOworCisJLyogc3VyZl9kc3QgKi8KKwlOVk9CSl9DTEFTUyhkZXYsIDB4MDA1OCwgR1IpOworCisJLyogc3VyZl9zcmMgKi8KKwlOVk9CSl9DTEFTUyhkZXYsIDB4MDA1OSwgR1IpOworCisJLyogc3VyZl9jb2xvciAqLworCU5WT0JKX0NMQVNTKGRldiwgMHgwMDVhLCBHUik7CisKKwkvKiBzdXJmX3pldGEgKi8KKwlOVk9CSl9DTEFTUyhkZXYsIDB4MDA1YiwgR1IpOworCisJLyogbnYwMSBsaW5lICovCisJTlZPQkpfQ0xBU1MoZGV2LCAweDAwMWMsIEdSKTsKKwlOVk9CSl9NVEhEIChkZXYsIDB4MDAxYywgMHgwMTg0LCBudjA0X2dyYXBoX210aGRfYmluZF9jbGlwKTsKKwlOVk9CSl9NVEhEIChkZXYsIDB4MDAxYywgMHgwMTg4LCBudjA0X2dyYXBoX210aGRfYmluZF9udjAxX3BhdHQpOworCU5WT0JKX01USEQgKGRldiwgMHgwMDFjLCAweDAxOGMsIG52MDRfZ3JhcGhfbXRoZF9iaW5kX3JvcCk7CisJTlZPQkpfTVRIRCAoZGV2LCAweDAwMWMsIDB4MDE5MCwgbnYwNF9ncmFwaF9tdGhkX2JpbmRfYmV0YTEpOworCU5WT0JKX01USEQgKGRldiwgMHgwMDFjLCAweDAxOTQsIG52MDRfZ3JhcGhfbXRoZF9iaW5kX3N1cmZfZHN0KTsKKwlOVk9CSl9NVEhEIChkZXYsIDB4MDAxYywgMHgwMmZjLCBudjA0X2dyYXBoX210aGRfc2V0X29wZXJhdGlvbik7CisKKwkvKiBudjA0IGxpbmUgKi8KKwlOVk9CSl9DTEFTUyhkZXYsIDB4MDA1YywgR1IpOworCU5WT0JKX01USEQgKGRldiwgMHgwMDVjLCAweDAxODQsIG52MDRfZ3JhcGhfbXRoZF9iaW5kX2NsaXApOworCU5WT0JKX01USEQgKGRldiwgMHgwMDVjLCAweDAxODgsIG52MDRfZ3JhcGhfbXRoZF9iaW5kX252MDRfcGF0dCk7CisJTlZPQkpfTVRIRCAoZGV2LCAweDAwNWMsIDB4MDE4YywgbnYwNF9ncmFwaF9tdGhkX2JpbmRfcm9wKTsKKwlOVk9CSl9NVEhEIChkZXYsIDB4MDA1YywgMHgwMTkwLCBudjA0X2dyYXBoX210aGRfYmluZF9iZXRhMSk7CisJTlZPQkpfTVRIRCAoZGV2LCAweDAwNWMsIDB4MDE5NCwgbnYwNF9ncmFwaF9tdGhkX2JpbmRfYmV0YTQpOworCU5WT0JKX01USEQgKGRldiwgMHgwMDVjLCAweDAxOTgsIG52MDRfZ3JhcGhfbXRoZF9iaW5kX3N1cmYyZCk7CisJTlZPQkpfTVRIRCAoZGV2LCAweDAwNWMsIDB4MDJmYywgbnYwNF9ncmFwaF9tdGhkX3NldF9vcGVyYXRpb24pOworCisJLyogbnYwMSB0cmkgKi8KKwlOVk9CSl9DTEFTUyhkZXYsIDB4MDAxZCwgR1IpOworCU5WT0JKX01USEQgKGRldiwgMHgwMDFkLCAweDAxODQsIG52MDRfZ3JhcGhfbXRoZF9iaW5kX2NsaXApOworCU5WT0JKX01USEQgKGRldiwgMHgwMDFkLCAweDAxODgsIG52MDRfZ3JhcGhfbXRoZF9iaW5kX252MDFfcGF0dCk7CisJTlZPQkpfTVRIRCAoZGV2LCAweDAwMWQsIDB4MDE4YywgbnYwNF9ncmFwaF9tdGhkX2JpbmRfcm9wKTsKKwlOVk9CSl9NVEhEIChkZXYsIDB4MDAxZCwgMHgwMTkwLCBudjA0X2dyYXBoX210aGRfYmluZF9iZXRhMSk7CisJTlZPQkpfTVRIRCAoZGV2LCAweDAwMWQsIDB4MDE5NCwgbnYwNF9ncmFwaF9tdGhkX2JpbmRfc3VyZl9kc3QpOworCU5WT0JKX01USEQgKGRldiwgMHgwMDFkLCAweDAyZmMsIG52MDRfZ3JhcGhfbXRoZF9zZXRfb3BlcmF0aW9uKTsKKworCS8qIG52MDQgdHJpICovCisJTlZPQkpfQ0xBU1MoZGV2LCAweDAwNWQsIEdSKTsKKwlOVk9CSl9NVEhEIChkZXYsIDB4MDA1ZCwgMHgwMTg0LCBudjA0X2dyYXBoX210aGRfYmluZF9jbGlwKTsKKwlOVk9CSl9NVEhEIChkZXYsIDB4MDA1ZCwgMHgwMTg4LCBudjA0X2dyYXBoX210aGRfYmluZF9udjA0X3BhdHQpOworCU5WT0JKX01USEQgKGRldiwgMHgwMDVkLCAweDAxOGMsIG52MDRfZ3JhcGhfbXRoZF9iaW5kX3JvcCk7CisJTlZPQkpfTVRIRCAoZGV2LCAweDAwNWQsIDB4MDE5MCwgbnYwNF9ncmFwaF9tdGhkX2JpbmRfYmV0YTEpOworCU5WT0JKX01USEQgKGRldiwgMHgwMDVkLCAweDAxOTQsIG52MDRfZ3JhcGhfbXRoZF9iaW5kX2JldGE0KTsKKwlOVk9CSl9NVEhEIChkZXYsIDB4MDA1ZCwgMHgwMTk4LCBudjA0X2dyYXBoX210aGRfYmluZF9zdXJmMmQpOworCU5WT0JKX01USEQgKGRldiwgMHgwMDVkLCAweDAyZmMsIG52MDRfZ3JhcGhfbXRoZF9zZXRfb3BlcmF0aW9uKTsKKworCS8qIG52MDEgcmVjdCAqLworCU5WT0JKX0NMQVNTKGRldiwgMHgwMDFlLCBHUik7CisJTlZPQkpfTVRIRCAoZGV2LCAweDAwMWUsIDB4MDE4NCwgbnYwNF9ncmFwaF9tdGhkX2JpbmRfY2xpcCk7CisJTlZPQkpfTVRIRCAoZGV2LCAweDAwMWUsIDB4MDE4OCwgbnYwNF9ncmFwaF9tdGhkX2JpbmRfbnYwMV9wYXR0KTsKKwlOVk9CSl9NVEhEIChkZXYsIDB4MDAxZSwgMHgwMThjLCBudjA0X2dyYXBoX210aGRfYmluZF9yb3ApOworCU5WT0JKX01USEQgKGRldiwgMHgwMDFlLCAweDAxOTAsIG52MDRfZ3JhcGhfbXRoZF9iaW5kX2JldGExKTsKKwlOVk9CSl9NVEhEIChkZXYsIDB4MDAxZSwgMHgwMTk0LCBudjA0X2dyYXBoX210aGRfYmluZF9zdXJmX2RzdCk7CisJTlZPQkpfTVRIRCAoZGV2LCAweDAwMWUsIDB4MDJmYywgbnYwNF9ncmFwaF9tdGhkX3NldF9vcGVyYXRpb24pOworCisJLyogbnYwNCByZWN0ICovCisJTlZPQkpfQ0xBU1MoZGV2LCAweDAwNWUsIEdSKTsKKwlOVk9CSl9NVEhEIChkZXYsIDB4MDA1ZSwgMHgwMTg0LCBudjA0X2dyYXBoX210aGRfYmluZF9jbGlwKTsKKwlOVk9CSl9NVEhEIChkZXYsIDB4MDA1ZSwgMHgwMTg4LCBudjA0X2dyYXBoX210aGRfYmluZF9udjA0X3BhdHQpOworCU5WT0JKX01USEQgKGRldiwgMHgwMDVlLCAweDAxOGMsIG52MDRfZ3JhcGhfbXRoZF9iaW5kX3JvcCk7CisJTlZPQkpfTVRIRCAoZGV2LCAweDAwNWUsIDB4MDE5MCwgbnYwNF9ncmFwaF9tdGhkX2JpbmRfYmV0YTEpOworCU5WT0JKX01USEQgKGRldiwgMHgwMDVlLCAweDAxOTQsIG52MDRfZ3JhcGhfbXRoZF9iaW5kX2JldGE0KTsKKwlOVk9CSl9NVEhEIChkZXYsIDB4MDA1ZSwgMHgwMTk4LCBudjA0X2dyYXBoX210aGRfYmluZF9zdXJmMmQpOworCU5WT0JKX01USEQgKGRldiwgMHgwMDVlLCAweDAyZmMsIG52MDRfZ3JhcGhfbXRoZF9zZXRfb3BlcmF0aW9uKTsKKworCS8qIG52c3cgKi8KKwlOVk9CSl9DTEFTUyhkZXYsIDB4NTA2ZSwgU1cpOworCU5WT0JKX01USEQgKGRldiwgMHg1MDZlLCAweDAxNTAsIG52MDRfZ3JhcGhfbXRoZF9zZXRfcmVmKTsKKwlOVk9CSl9NVEhEIChkZXYsIDB4NTA2ZSwgMHgwNTAwLCBudjA0X2dyYXBoX210aGRfcGFnZV9mbGlwKTsKKworCWRldl9wcml2LT5lbmdpbmUuZ3JhcGgucmVnaXN0ZXJlZCA9IHRydWU7CisJcmV0dXJuIDA7Cit9OworCitzdGF0aWMgc3RydWN0IG5vdXZlYXVfYml0ZmllbGQgbnYwNF9ncmFwaF9pbnRyW10gPSB7CisJeyBOVl9QR1JBUEhfSU5UUl9OT1RJRlksICJOT1RJRlkiIH0sCiAJe30KIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgbm91dmVhdV9wZ3JhcGhfb2JqZWN0X21ldGhvZCBudjA0X2dyYXBoX210aGRzX252MDNfZ2RpcmVjdFtdID0gewotCXsgMHgwMTg0LCBudjA0X2dyYXBoX210aGRfYmluZF9udjAxX3BhdHQgfSwKLQl7IDB4MDE4OCwgbnYwNF9ncmFwaF9tdGhkX2JpbmRfcm9wIH0sCi0JeyAweDAxOGMsIG52MDRfZ3JhcGhfbXRoZF9iaW5kX2JldGExIH0sCi0JeyAweDAxOTAsIG52MDRfZ3JhcGhfbXRoZF9iaW5kX3N1cmZfZHN0IH0sCi0JeyAweDAyZmMsIG52MDRfZ3JhcGhfbXRoZF9zZXRfb3BlcmF0aW9uIH0sCi0Je30sCi19OwotCi1zdGF0aWMgc3RydWN0IG5vdXZlYXVfcGdyYXBoX29iamVjdF9tZXRob2QgbnYwNF9ncmFwaF9tdGhkc19udjA0X2dkaXJlY3RbXSA9IHsKLQl7IDB4MDE4OCwgbnYwNF9ncmFwaF9tdGhkX2JpbmRfbnYwNF9wYXR0IH0sCi0JeyAweDAxOGMsIG52MDRfZ3JhcGhfbXRoZF9iaW5kX3JvcCB9LAotCXsgMHgwMTkwLCBudjA0X2dyYXBoX210aGRfYmluZF9iZXRhMSB9LAotCXsgMHgwMTk0LCBudjA0X2dyYXBoX210aGRfYmluZF9iZXRhNCB9LAotCXsgMHgwMTk4LCBudjA0X2dyYXBoX210aGRfYmluZF9zdXJmMmQgfSwKLQl7IDB4MDJmYywgbnYwNF9ncmFwaF9tdGhkX3NldF9vcGVyYXRpb24gfSwKLQl7fSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgbm91dmVhdV9wZ3JhcGhfb2JqZWN0X21ldGhvZCBudjA0X2dyYXBoX210aGRzX252MDFfaW1hZ2VibGl0W10gPSB7Ci0JeyAweDAxODQsIG52MDRfZ3JhcGhfbXRoZF9iaW5kX2Nocm9tYSB9LAotCXsgMHgwMTg4LCBudjA0X2dyYXBoX210aGRfYmluZF9jbGlwIH0sCi0JeyAweDAxOGMsIG52MDRfZ3JhcGhfbXRoZF9iaW5kX252MDFfcGF0dCB9LAotCXsgMHgwMTkwLCBudjA0X2dyYXBoX210aGRfYmluZF9yb3AgfSwKLQl7IDB4MDE5NCwgbnYwNF9ncmFwaF9tdGhkX2JpbmRfYmV0YTEgfSwKLQl7IDB4MDE5OCwgbnYwNF9ncmFwaF9tdGhkX2JpbmRfc3VyZl9kc3QgfSwKLQl7IDB4MDE5YywgbnYwNF9ncmFwaF9tdGhkX2JpbmRfc3VyZl9zcmMgfSwKLQl7IDB4MDJmYywgbnYwNF9ncmFwaF9tdGhkX3NldF9vcGVyYXRpb24gfSwKLQl7fSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgbm91dmVhdV9wZ3JhcGhfb2JqZWN0X21ldGhvZCBudjA0X2dyYXBoX210aGRzX252MDRfaW1hZ2VibGl0X2lmY1tdID0gewotCXsgMHgwMTg0LCBudjA0X2dyYXBoX210aGRfYmluZF9jaHJvbWEgfSwKLQl7IDB4MDE4OCwgbnYwNF9ncmFwaF9tdGhkX2JpbmRfY2xpcCB9LAotCXsgMHgwMThjLCBudjA0X2dyYXBoX210aGRfYmluZF9udjA0X3BhdHQgfSwKLQl7IDB4MDE5MCwgbnYwNF9ncmFwaF9tdGhkX2JpbmRfcm9wIH0sCi0JeyAweDAxOTQsIG52MDRfZ3JhcGhfbXRoZF9iaW5kX2JldGExIH0sCi0JeyAweDAxOTgsIG52MDRfZ3JhcGhfbXRoZF9iaW5kX2JldGE0IH0sCi0JeyAweDAxOWMsIG52MDRfZ3JhcGhfbXRoZF9iaW5kX3N1cmYyZCB9LAotCXsgMHgwMmZjLCBudjA0X2dyYXBoX210aGRfc2V0X29wZXJhdGlvbiB9LAotCXt9LAotfTsKLQotc3RhdGljIHN0cnVjdCBub3V2ZWF1X3BncmFwaF9vYmplY3RfbWV0aG9kIG52MDRfZ3JhcGhfbXRoZHNfbnYwNF9paWZjW10gPSB7Ci0JeyAweDAxODgsIG52MDRfZ3JhcGhfbXRoZF9iaW5kX2Nocm9tYSB9LAotCXsgMHgwMThjLCBudjA0X2dyYXBoX210aGRfYmluZF9jbGlwIH0sCi0JeyAweDAxOTAsIG52MDRfZ3JhcGhfbXRoZF9iaW5kX252MDRfcGF0dCB9LAotCXsgMHgwMTk0LCBudjA0X2dyYXBoX210aGRfYmluZF9yb3AgfSwKLQl7IDB4MDE5OCwgbnYwNF9ncmFwaF9tdGhkX2JpbmRfYmV0YTEgfSwKLQl7IDB4MDE5YywgbnYwNF9ncmFwaF9tdGhkX2JpbmRfYmV0YTQgfSwKLQl7IDB4MDFhMCwgbnYwNF9ncmFwaF9tdGhkX2JpbmRfc3VyZjJkX3N3enN1cmYgfSwKLQl7IDB4MDNlNCwgbnYwNF9ncmFwaF9tdGhkX3NldF9vcGVyYXRpb24gfSwKLQl7fSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgbm91dmVhdV9wZ3JhcGhfb2JqZWN0X21ldGhvZCBudjA0X2dyYXBoX210aGRzX252MDFfaWZjW10gPSB7Ci0JeyAweDAxODQsIG52MDRfZ3JhcGhfbXRoZF9iaW5kX2Nocm9tYSB9LAotCXsgMHgwMTg4LCBudjA0X2dyYXBoX210aGRfYmluZF9jbGlwIH0sCi0JeyAweDAxOGMsIG52MDRfZ3JhcGhfbXRoZF9iaW5kX252MDFfcGF0dCB9LAotCXsgMHgwMTkwLCBudjA0X2dyYXBoX210aGRfYmluZF9yb3AgfSwKLQl7IDB4MDE5NCwgbnYwNF9ncmFwaF9tdGhkX2JpbmRfYmV0YTEgfSwKLQl7IDB4MDE5OCwgbnYwNF9ncmFwaF9tdGhkX2JpbmRfc3VyZl9kc3QgfSwKLQl7IDB4MDJmYywgbnYwNF9ncmFwaF9tdGhkX3NldF9vcGVyYXRpb24gfSwKLQl7fSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgbm91dmVhdV9wZ3JhcGhfb2JqZWN0X21ldGhvZCBudjA0X2dyYXBoX210aGRzX252MDNfc2lmY1tdID0gewotCXsgMHgwMTg0LCBudjA0X2dyYXBoX210aGRfYmluZF9jaHJvbWEgfSwKLQl7IDB4MDE4OCwgbnYwNF9ncmFwaF9tdGhkX2JpbmRfbnYwMV9wYXR0IH0sCi0JeyAweDAxOGMsIG52MDRfZ3JhcGhfbXRoZF9iaW5kX3JvcCB9LAotCXsgMHgwMTkwLCBudjA0X2dyYXBoX210aGRfYmluZF9iZXRhMSB9LAotCXsgMHgwMTk0LCBudjA0X2dyYXBoX210aGRfYmluZF9zdXJmX2RzdCB9LAotCXsgMHgwMmZjLCBudjA0X2dyYXBoX210aGRfc2V0X29wZXJhdGlvbiB9LAotCXt9LAotfTsKLQotc3RhdGljIHN0cnVjdCBub3V2ZWF1X3BncmFwaF9vYmplY3RfbWV0aG9kIG52MDRfZ3JhcGhfbXRoZHNfbnYwNF9zaWZjW10gPSB7Ci0JeyAweDAxODQsIG52MDRfZ3JhcGhfbXRoZF9iaW5kX2Nocm9tYSB9LAotCXsgMHgwMTg4LCBudjA0X2dyYXBoX210aGRfYmluZF9udjA0X3BhdHQgfSwKLQl7IDB4MDE4YywgbnYwNF9ncmFwaF9tdGhkX2JpbmRfcm9wIH0sCi0JeyAweDAxOTAsIG52MDRfZ3JhcGhfbXRoZF9iaW5kX2JldGExIH0sCi0JeyAweDAxOTQsIG52MDRfZ3JhcGhfbXRoZF9iaW5kX2JldGE0IH0sCi0JeyAweDAxOTgsIG52MDRfZ3JhcGhfbXRoZF9iaW5kX3N1cmYyZCB9LAotCXsgMHgwMmZjLCBudjA0X2dyYXBoX210aGRfc2V0X29wZXJhdGlvbiB9LAotCXt9LAotfTsKLQotc3RhdGljIHN0cnVjdCBub3V2ZWF1X3BncmFwaF9vYmplY3RfbWV0aG9kIG52MDRfZ3JhcGhfbXRoZHNfbnYwM19zaWZtW10gPSB7Ci0JeyAweDAxODgsIG52MDRfZ3JhcGhfbXRoZF9iaW5kX252MDFfcGF0dCB9LAotCXsgMHgwMThjLCBudjA0X2dyYXBoX210aGRfYmluZF9yb3AgfSwKLQl7IDB4MDE5MCwgbnYwNF9ncmFwaF9tdGhkX2JpbmRfYmV0YTEgfSwKLQl7IDB4MDE5NCwgbnYwNF9ncmFwaF9tdGhkX2JpbmRfc3VyZl9kc3QgfSwKLQl7IDB4MDMwNCwgbnYwNF9ncmFwaF9tdGhkX3NldF9vcGVyYXRpb24gfSwKLQl7fSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgbm91dmVhdV9wZ3JhcGhfb2JqZWN0X21ldGhvZCBudjA0X2dyYXBoX210aGRzX252MDRfc2lmbVtdID0gewotCXsgMHgwMTg4LCBudjA0X2dyYXBoX210aGRfYmluZF9udjA0X3BhdHQgfSwKLQl7IDB4MDE4YywgbnYwNF9ncmFwaF9tdGhkX2JpbmRfcm9wIH0sCi0JeyAweDAxOTAsIG52MDRfZ3JhcGhfbXRoZF9iaW5kX2JldGExIH0sCi0JeyAweDAxOTQsIG52MDRfZ3JhcGhfbXRoZF9iaW5kX2JldGE0IH0sCi0JeyAweDAxOTgsIG52MDRfZ3JhcGhfbXRoZF9iaW5kX3N1cmYyZF9zd3pzdXJmIH0sCi0JeyAweDAzMDQsIG52MDRfZ3JhcGhfbXRoZF9zZXRfb3BlcmF0aW9uIH0sCi0Je30sCi19OwotCi1zdGF0aWMgc3RydWN0IG5vdXZlYXVfcGdyYXBoX29iamVjdF9tZXRob2QgbnYwNF9ncmFwaF9tdGhkc19udjAxX3NoYXBlW10gPSB7Ci0JeyAweDAxODQsIG52MDRfZ3JhcGhfbXRoZF9iaW5kX2NsaXAgfSwKLQl7IDB4MDE4OCwgbnYwNF9ncmFwaF9tdGhkX2JpbmRfbnYwMV9wYXR0IH0sCi0JeyAweDAxOGMsIG52MDRfZ3JhcGhfbXRoZF9iaW5kX3JvcCB9LAotCXsgMHgwMTkwLCBudjA0X2dyYXBoX210aGRfYmluZF9iZXRhMSB9LAotCXsgMHgwMTk0LCBudjA0X2dyYXBoX210aGRfYmluZF9zdXJmX2RzdCB9LAotCXsgMHgwMmZjLCBudjA0X2dyYXBoX210aGRfc2V0X29wZXJhdGlvbiB9LAotCXt9LAotfTsKLQotc3RhdGljIHN0cnVjdCBub3V2ZWF1X3BncmFwaF9vYmplY3RfbWV0aG9kIG52MDRfZ3JhcGhfbXRoZHNfbnYwNF9zaGFwZVtdID0gewotCXsgMHgwMTg0LCBudjA0X2dyYXBoX210aGRfYmluZF9jbGlwIH0sCi0JeyAweDAxODgsIG52MDRfZ3JhcGhfbXRoZF9iaW5kX252MDRfcGF0dCB9LAotCXsgMHgwMThjLCBudjA0X2dyYXBoX210aGRfYmluZF9yb3AgfSwKLQl7IDB4MDE5MCwgbnYwNF9ncmFwaF9tdGhkX2JpbmRfYmV0YTEgfSwKLQl7IDB4MDE5NCwgbnYwNF9ncmFwaF9tdGhkX2JpbmRfYmV0YTQgfSwKLQl7IDB4MDE5OCwgbnYwNF9ncmFwaF9tdGhkX2JpbmRfc3VyZjJkIH0sCi0JeyAweDAyZmMsIG52MDRfZ3JhcGhfbXRoZF9zZXRfb3BlcmF0aW9uIH0sCi0Je30sCi19OwotCi1zdGF0aWMgc3RydWN0IG5vdXZlYXVfcGdyYXBoX29iamVjdF9tZXRob2QgbnYwNF9ncmFwaF9tdGhkc19udjAzX3RleF90cmlbXSA9IHsKLQl7IDB4MDE4OCwgbnYwNF9ncmFwaF9tdGhkX2JpbmRfY2xpcCB9LAotCXsgMHgwMThjLCBudjA0X2dyYXBoX210aGRfYmluZF9zdXJmX2NvbG9yIH0sCi0JeyAweDAxOTAsIG52MDRfZ3JhcGhfbXRoZF9iaW5kX3N1cmZfemV0YSB9LAotCXt9LAotfTsKLQotc3RhdGljIHN0cnVjdCBub3V2ZWF1X3BncmFwaF9vYmplY3RfbWV0aG9kIG52MDRfZ3JhcGhfbXRoZHNfc3VyZjNkW10gPSB7Ci0JeyAweDAyZjgsIG52MDRfZ3JhcGhfbXRoZF9zdXJmM2RfY2xpcF9oIH0sCi0JeyAweDAyZmMsIG52MDRfZ3JhcGhfbXRoZF9zdXJmM2RfY2xpcF92IH0sCi0Je30sCi19OwotCi1zdHJ1Y3Qgbm91dmVhdV9wZ3JhcGhfb2JqZWN0X2NsYXNzIG52MDRfZ3JhcGhfZ3JjbGFzc1tdID0gewotCXsgMHgwMDM4LCBmYWxzZSwgTlVMTCB9LCAvKiBkdmQgc3VicGljdHVyZSAqLwotCXsgMHgwMDM5LCBmYWxzZSwgTlVMTCB9LCAvKiBtMm1mICovCi0JeyAweDAwNGIsIGZhbHNlLCBudjA0X2dyYXBoX210aGRzX252MDNfZ2RpcmVjdCB9LCAvKiBudjAzIGdkaXJlY3QgKi8KLQl7IDB4MDA0YSwgZmFsc2UsIG52MDRfZ3JhcGhfbXRoZHNfbnYwNF9nZGlyZWN0IH0sIC8qIG52MDQgZ2RpcmVjdCAqLwotCXsgMHgwMDFmLCBmYWxzZSwgbnYwNF9ncmFwaF9tdGhkc19udjAxX2ltYWdlYmxpdCB9LCAvKiBudjAxIGltYWdlYmxpdCAqLwotCXsgMHgwMDVmLCBmYWxzZSwgbnYwNF9ncmFwaF9tdGhkc19udjA0X2ltYWdlYmxpdF9pZmMgfSwgLyogbnYwNCBpbWFnZWJsaXQgKi8KLQl7IDB4MDA2MCwgZmFsc2UsIG52MDRfZ3JhcGhfbXRoZHNfbnYwNF9paWZjIH0sIC8qIG52MDQgaWlmYyAqLwotCXsgMHgwMDY0LCBmYWxzZSwgTlVMTCB9LCAvKiBudjA1IGlpZmMgKi8KLQl7IDB4MDAyMSwgZmFsc2UsIG52MDRfZ3JhcGhfbXRoZHNfbnYwMV9pZmMgfSwgLyogbnYwMSBpZmMgKi8KLQl7IDB4MDA2MSwgZmFsc2UsIG52MDRfZ3JhcGhfbXRoZHNfbnYwNF9pbWFnZWJsaXRfaWZjIH0sIC8qIG52MDQgaWZjICovCi0JeyAweDAwNjUsIGZhbHNlLCBOVUxMIH0sIC8qIG52MDUgaWZjICovCi0JeyAweDAwMzYsIGZhbHNlLCBudjA0X2dyYXBoX210aGRzX252MDNfc2lmYyB9LCAvKiBudjAzIHNpZmMgKi8KLQl7IDB4MDA3NiwgZmFsc2UsIG52MDRfZ3JhcGhfbXRoZHNfbnYwNF9zaWZjIH0sIC8qIG52MDQgc2lmYyAqLwotCXsgMHgwMDY2LCBmYWxzZSwgTlVMTCB9LCAvKiBudjA1IHNpZmMgKi8KLQl7IDB4MDAzNywgZmFsc2UsIG52MDRfZ3JhcGhfbXRoZHNfbnYwM19zaWZtIH0sIC8qIG52MDMgc2lmbSAqLwotCXsgMHgwMDc3LCBmYWxzZSwgbnYwNF9ncmFwaF9tdGhkc19udjA0X3NpZm0gfSwgLyogbnYwNCBzaWZtICovCi0JeyAweDAwMzAsIGZhbHNlLCBOVUxMIH0sIC8qIG51bGwgKi8KLQl7IDB4MDA0MiwgZmFsc2UsIE5VTEwgfSwgLyogc3VyZjJkICovCi0JeyAweDAwNDMsIGZhbHNlLCBOVUxMIH0sIC8qIHJvcCAqLwotCXsgMHgwMDEyLCBmYWxzZSwgTlVMTCB9LCAvKiBiZXRhMSAqLwotCXsgMHgwMDcyLCBmYWxzZSwgTlVMTCB9LCAvKiBiZXRhNCAqLwotCXsgMHgwMDE5LCBmYWxzZSwgTlVMTCB9LCAvKiBjbGlwcmVjdCAqLwotCXsgMHgwMDE4LCBmYWxzZSwgTlVMTCB9LCAvKiBudjAxIHBhdHRlcm4gKi8KLQl7IDB4MDA0NCwgZmFsc2UsIE5VTEwgfSwgLyogbnYwNCBwYXR0ZXJuICovCi0JeyAweDAwNTIsIGZhbHNlLCBOVUxMIH0sIC8qIHN3enN1cmYgKi8KLQl7IDB4MDA1MywgZmFsc2UsIG52MDRfZ3JhcGhfbXRoZHNfc3VyZjNkIH0sIC8qIHN1cmYzZCAqLwotCXsgMHgwMDQ4LCBmYWxzZSwgbnYwNF9ncmFwaF9tdGhkc19udjAzX3RleF90cmkgfSwgLyogbnYwMyB0ZXhfdHJpICovCi0JeyAweDAwNTQsIGZhbHNlLCBOVUxMIH0sIC8qIHRleF90cmkgKi8KLQl7IDB4MDA1NSwgZmFsc2UsIE5VTEwgfSwgLyogbXVsdGl0ZXhfdHJpICovCi0JeyAweDAwMTcsIGZhbHNlLCBOVUxMIH0sIC8qIG52MDEgY2hyb21hICovCi0JeyAweDAwNTcsIGZhbHNlLCBOVUxMIH0sIC8qIG52MDQgY2hyb21hICovCi0JeyAweDAwNTgsIGZhbHNlLCBOVUxMIH0sIC8qIHN1cmZfZHN0ICovCi0JeyAweDAwNTksIGZhbHNlLCBOVUxMIH0sIC8qIHN1cmZfc3JjICovCi0JeyAweDAwNWEsIGZhbHNlLCBOVUxMIH0sIC8qIHN1cmZfY29sb3IgKi8KLQl7IDB4MDA1YiwgZmFsc2UsIE5VTEwgfSwgLyogc3VyZl96ZXRhICovCi0JeyAweDAwMWMsIGZhbHNlLCBudjA0X2dyYXBoX210aGRzX252MDFfc2hhcGUgfSwgLyogbnYwMSBsaW5lICovCi0JeyAweDAwNWMsIGZhbHNlLCBudjA0X2dyYXBoX210aGRzX252MDRfc2hhcGUgfSwgLyogbnYwNCBsaW5lICovCi0JeyAweDAwMWQsIGZhbHNlLCBudjA0X2dyYXBoX210aGRzX252MDFfc2hhcGUgfSwgLyogbnYwMSB0cmkgKi8KLQl7IDB4MDA1ZCwgZmFsc2UsIG52MDRfZ3JhcGhfbXRoZHNfbnYwNF9zaGFwZSB9LCAvKiBudjA0IHRyaSAqLwotCXsgMHgwMDFlLCBmYWxzZSwgbnYwNF9ncmFwaF9tdGhkc19udjAxX3NoYXBlIH0sIC8qIG52MDEgcmVjdCAqLwotCXsgMHgwMDVlLCBmYWxzZSwgbnYwNF9ncmFwaF9tdGhkc19udjA0X3NoYXBlIH0sIC8qIG52MDQgcmVjdCAqLwotCXsgMHg1MDZlLCB0cnVlLCBudjA0X2dyYXBoX210aGRzX3N3IH0sCitzdGF0aWMgc3RydWN0IG5vdXZlYXVfYml0ZmllbGQgbnYwNF9ncmFwaF9uc3RhdHVzW10gPQoreworCXsgTlYwNF9QR1JBUEhfTlNUQVRVU19TVEFURV9JTl9VU0UsICAgICAgICJTVEFURV9JTl9VU0UiIH0sCisJeyBOVjA0X1BHUkFQSF9OU1RBVFVTX0lOVkFMSURfU1RBVEUsICAgICAgIklOVkFMSURfU1RBVEUiIH0sCisJeyBOVjA0X1BHUkFQSF9OU1RBVFVTX0JBRF9BUkdVTUVOVCwgICAgICAgIkJBRF9BUkdVTUVOVCIgfSwKKwl7IE5WMDRfUEdSQVBIX05TVEFUVVNfUFJPVEVDVElPTl9GQVVMVCwgICAiUFJPVEVDVElPTl9GQVVMVCIgfSwKIAl7fQogfTsKIAorc3RydWN0IG5vdXZlYXVfYml0ZmllbGQgbnYwNF9ncmFwaF9uc291cmNlW10gPQoreworCXsgTlYwM19QR1JBUEhfTlNPVVJDRV9OT1RJRklDQVRJT04sICAgICAgICJOT1RJRklDQVRJT04iIH0sCisJeyBOVjAzX1BHUkFQSF9OU09VUkNFX0RBVEFfRVJST1IsICAgICAgICAgIkRBVEFfRVJST1IiIH0sCisJeyBOVjAzX1BHUkFQSF9OU09VUkNFX1BST1RFQ1RJT05fRVJST1IsICAgIlBST1RFQ1RJT05fRVJST1IiIH0sCisJeyBOVjAzX1BHUkFQSF9OU09VUkNFX1JBTkdFX0VYQ0VQVElPTiwgICAgIlJBTkdFX0VYQ0VQVElPTiIgfSwKKwl7IE5WMDNfUEdSQVBIX05TT1VSQ0VfTElNSVRfQ09MT1IsICAgICAgICAiTElNSVRfQ09MT1IiIH0sCisJeyBOVjAzX1BHUkFQSF9OU09VUkNFX0xJTUlUX1pFVEEsICAgICAgICAgIkxJTUlUX1pFVEEiIH0sCisJeyBOVjAzX1BHUkFQSF9OU09VUkNFX0lMTEVHQUxfTVRIRCwgICAgICAgIklMTEVHQUxfTVRIRCIgfSwKKwl7IE5WMDNfUEdSQVBIX05TT1VSQ0VfRE1BX1JfUFJPVEVDVElPTiwgICAiRE1BX1JfUFJPVEVDVElPTiIgfSwKKwl7IE5WMDNfUEdSQVBIX05TT1VSQ0VfRE1BX1dfUFJPVEVDVElPTiwgICAiRE1BX1dfUFJPVEVDVElPTiIgfSwKKwl7IE5WMDNfUEdSQVBIX05TT1VSQ0VfRk9STUFUX0VYQ0VQVElPTiwgICAiRk9STUFUX0VYQ0VQVElPTiIgfSwKKwl7IE5WMDNfUEdSQVBIX05TT1VSQ0VfUEFUQ0hfRVhDRVBUSU9OLCAgICAiUEFUQ0hfRVhDRVBUSU9OIiB9LAorCXsgTlYwM19QR1JBUEhfTlNPVVJDRV9TVEFURV9JTlZBTElELCAgICAgICJTVEFURV9JTlZBTElEIiB9LAorCXsgTlYwM19QR1JBUEhfTlNPVVJDRV9ET1VCTEVfTk9USUZZLCAgICAgICJET1VCTEVfTk9USUZZIiB9LAorCXsgTlYwM19QR1JBUEhfTlNPVVJDRV9OT1RJRllfSU5fVVNFLCAgICAgICJOT1RJRllfSU5fVVNFIiB9LAorCXsgTlYwM19QR1JBUEhfTlNPVVJDRV9NRVRIT0RfQ05ULCAgICAgICAgICJNRVRIT0RfQ05UIiB9LAorCXsgTlYwM19QR1JBUEhfTlNPVVJDRV9CRlJfTk9USUZJQ0FUSU9OLCAgICJCRlJfTk9USUZJQ0FUSU9OIiB9LAorCXsgTlYwM19QR1JBUEhfTlNPVVJDRV9ETUFfVlRYX1BST1RFQ1RJT04sICJETUFfVlRYX1BST1RFQ1RJT04iIH0sCisJeyBOVjAzX1BHUkFQSF9OU09VUkNFX0RNQV9XSURUSF9BLCAgICAgICAgIkRNQV9XSURUSF9BIiB9LAorCXsgTlYwM19QR1JBUEhfTlNPVVJDRV9ETUFfV0lEVEhfQiwgICAgICAgICJETUFfV0lEVEhfQiIgfSwKKwl7fQorfTsKKworc3RhdGljIHZvaWQKK252MDRfZ3JhcGhfaXNyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJdTMyIHN0YXQ7CisKKwl3aGlsZSAoKHN0YXQgPSBudl9yZDMyKGRldiwgTlYwM19QR1JBUEhfSU5UUikpKSB7CisJCXUzMiBuc291cmNlID0gbnZfcmQzMihkZXYsIE5WMDNfUEdSQVBIX05TT1VSQ0UpOworCQl1MzIgbnN0YXR1cyA9IG52X3JkMzIoZGV2LCBOVjAzX1BHUkFQSF9OU1RBVFVTKTsKKwkJdTMyIGFkZHIgPSBudl9yZDMyKGRldiwgTlYwNF9QR1JBUEhfVFJBUFBFRF9BRERSKTsKKwkJdTMyIGNoaWQgPSAoYWRkciAmIDB4MGYwMDAwMDApID4+IDI0OworCQl1MzIgc3ViYyA9IChhZGRyICYgMHgwMDAwZTAwMCkgPj4gMTM7CisJCXUzMiBtdGhkID0gKGFkZHIgJiAweDAwMDAxZmZjKTsKKwkJdTMyIGRhdGEgPSBudl9yZDMyKGRldiwgTlYwNF9QR1JBUEhfVFJBUFBFRF9EQVRBKTsKKwkJdTMyIGNsYXNzID0gbnZfcmQzMihkZXYsIDB4NDAwMTgwICsgc3ViYyAqIDQpICYgMHhmZjsKKwkJdTMyIHNob3cgPSBzdGF0OworCisJCWlmIChzdGF0ICYgTlZfUEdSQVBIX0lOVFJfTk9USUZZKSB7CisJCQlpZiAobnNvdXJjZSAmIE5WMDNfUEdSQVBIX05TT1VSQ0VfSUxMRUdBTF9NVEhEKSB7CisJCQkJaWYgKCFub3V2ZWF1X2dwdW9ial9tdGhkX2NhbGwyKGRldiwgY2hpZCwgY2xhc3MsIG10aGQsIGRhdGEpKQorCQkJCQlzaG93ICY9IH5OVl9QR1JBUEhfSU5UUl9OT1RJRlk7CisJCQl9CisJCX0KKworCQlpZiAoc3RhdCAmIE5WX1BHUkFQSF9JTlRSX0NPTlRFWFRfU1dJVENIKSB7CisJCQludl93cjMyKGRldiwgTlYwM19QR1JBUEhfSU5UUiwgTlZfUEdSQVBIX0lOVFJfQ09OVEVYVF9TV0lUQ0gpOworCQkJc3RhdCAmPSB+TlZfUEdSQVBIX0lOVFJfQ09OVEVYVF9TV0lUQ0g7CisJCQlzaG93ICY9IH5OVl9QR1JBUEhfSU5UUl9DT05URVhUX1NXSVRDSDsKKwkJCW52MDRfZ3JhcGhfY29udGV4dF9zd2l0Y2goZGV2KTsKKwkJfQorCisJCW52X3dyMzIoZGV2LCBOVjAzX1BHUkFQSF9JTlRSLCBzdGF0KTsKKwkJbnZfd3IzMihkZXYsIE5WMDRfUEdSQVBIX0ZJRk8sIDB4MDAwMDAwMDEpOworCisJCWlmIChzaG93ICYmIG5vdXZlYXVfcmF0ZWxpbWl0KCkpIHsKKwkJCU5WX0lORk8oZGV2LCAiUEdSQVBIIC0iKTsKKwkJCW5vdXZlYXVfYml0ZmllbGRfcHJpbnQobnYwNF9ncmFwaF9pbnRyLCBzaG93KTsKKwkJCXByaW50aygiIG5zb3VyY2U6Iik7CisJCQlub3V2ZWF1X2JpdGZpZWxkX3ByaW50KG52MDRfZ3JhcGhfbnNvdXJjZSwgbnNvdXJjZSk7CisJCQlwcmludGsoIiBuc3RhdHVzOiIpOworCQkJbm91dmVhdV9iaXRmaWVsZF9wcmludChudjA0X2dyYXBoX25zdGF0dXMsIG5zdGF0dXMpOworCQkJcHJpbnRrKCJcbiIpOworCQkJTlZfSU5GTyhkZXYsICJQR1JBUEggLSBjaCAlZC8lZCBjbGFzcyAweCUwNHggIgorCQkJCSAgICAgIm10aGQgMHglMDR4IGRhdGEgMHglMDh4XG4iLAorCQkJCWNoaWQsIHN1YmMsIGNsYXNzLCBtdGhkLCBkYXRhKTsKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252MDRfaW5zdG1lbS5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnYwNF9pbnN0bWVtLmMKaW5kZXggMGI1YWUyOS4uYjhlM2VkYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnYwNF9pbnN0bWVtLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnYwNF9pbnN0bWVtLmMKQEAgLTk4LDM1ICs5OCw2IEBACiB9CiAKIGludAotbnYwNF9pbnN0bWVtX3BvcHVsYXRlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqZ3B1b2JqLAotCQkgICAgICB1aW50MzJfdCAqc3opCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLXZvaWQKLW52MDRfaW5zdG1lbV9jbGVhcihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKmdwdW9iaikKLXsKLX0KLQotaW50Ci1udjA0X2luc3RtZW1fYmluZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKmdwdW9iaikKLXsKLQlyZXR1cm4gMDsKLX0KLQotaW50Ci1udjA0X2luc3RtZW1fdW5iaW5kKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqZ3B1b2JqKQotewotCXJldHVybiAwOwotfQotCi12b2lkCi1udjA0X2luc3RtZW1fZmx1c2goc3RydWN0IGRybV9kZXZpY2UgKmRldikKLXsKLX0KLQotaW50CiBudjA0X2luc3RtZW1fc3VzcGVuZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogewogCXJldHVybiAwOwpAQCAtMTM3LDMgKzEwOCw1NiBAQAogewogfQogCitpbnQKK252MDRfaW5zdG1lbV9nZXQoc3RydWN0IG5vdXZlYXVfZ3B1b2JqICpncHVvYmosIHUzMiBzaXplLCB1MzIgYWxpZ24pCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZ3B1b2JqLT5kZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBkcm1fbW1fbm9kZSAqcmFtaW4gPSBOVUxMOworCisJZG8geworCQlpZiAoZHJtX21tX3ByZV9nZXQoJmRldl9wcml2LT5yYW1pbl9oZWFwKSkKKwkJCXJldHVybiAtRU5PTUVNOworCisJCXNwaW5fbG9jaygmZGV2X3ByaXYtPnJhbWluX2xvY2spOworCQlyYW1pbiA9IGRybV9tbV9zZWFyY2hfZnJlZSgmZGV2X3ByaXYtPnJhbWluX2hlYXAsIHNpemUsIGFsaWduLCAwKTsKKwkJaWYgKHJhbWluID09IE5VTEwpIHsKKwkJCXNwaW5fdW5sb2NrKCZkZXZfcHJpdi0+cmFtaW5fbG9jayk7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCisJCXJhbWluID0gZHJtX21tX2dldF9ibG9ja19hdG9taWMocmFtaW4sIHNpemUsIGFsaWduKTsKKwkJc3Bpbl91bmxvY2soJmRldl9wcml2LT5yYW1pbl9sb2NrKTsKKwl9IHdoaWxlIChyYW1pbiA9PSBOVUxMKTsKKworCWdwdW9iai0+bm9kZSAgPSByYW1pbjsKKwlncHVvYmotPnZpbnN0ID0gcmFtaW4tPnN0YXJ0OworCXJldHVybiAwOworfQorCit2b2lkCitudjA0X2luc3RtZW1fcHV0KHN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqZ3B1b2JqKQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGdwdW9iai0+ZGV2LT5kZXZfcHJpdmF0ZTsKKworCXNwaW5fbG9jaygmZGV2X3ByaXYtPnJhbWluX2xvY2spOworCWRybV9tbV9wdXRfYmxvY2soZ3B1b2JqLT5ub2RlKTsKKwlncHVvYmotPm5vZGUgPSBOVUxMOworCXNwaW5fdW5sb2NrKCZkZXZfcHJpdi0+cmFtaW5fbG9jayk7Cit9CisKK2ludAorbnYwNF9pbnN0bWVtX21hcChzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKmdwdW9iaikKK3sKKwlncHVvYmotPnBpbnN0ID0gZ3B1b2JqLT52aW5zdDsKKwlyZXR1cm4gMDsKK30KKwordm9pZAorbnYwNF9pbnN0bWVtX3VubWFwKHN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqZ3B1b2JqKQoreworfQorCit2b2lkCitudjA0X2luc3RtZW1fZmx1c2goc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252MTBfZmIuYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252MTBfZmIuYwppbmRleCBjYzVjZGE0Li5mNzgxODFhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjEwX2ZiLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnYxMF9mYi5jCkBAIC0zLDIzICszLDEwOSBAQAogI2luY2x1ZGUgIm5vdXZlYXVfZHJ2LmgiCiAjaW5jbHVkZSAibm91dmVhdV9kcm0uaCIKIAotdm9pZAotbnYxMF9mYl9zZXRfcmVnaW9uX3RpbGluZyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgaSwgdWludDMyX3QgYWRkciwKLQkJCSAgdWludDMyX3Qgc2l6ZSwgdWludDMyX3QgcGl0Y2gpCitzdGF0aWMgc3RydWN0IGRybV9tbV9ub2RlICoKK252MjBfZmJfYWxsb2NfdGFnKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVpbnQzMl90IHNpemUpCiB7CiAJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQl1aW50MzJfdCBsaW1pdCA9IG1heCgxdSwgYWRkciArIHNpemUpIC0gMTsKKwlzdHJ1Y3Qgbm91dmVhdV9mYl9lbmdpbmUgKnBmYiA9ICZkZXZfcHJpdi0+ZW5naW5lLmZiOworCXN0cnVjdCBkcm1fbW1fbm9kZSAqbWVtOworCWludCByZXQ7CiAKLQlpZiAocGl0Y2gpIHsKLQkJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPj0gTlZfMjApCi0JCQlhZGRyIHw9IDE7Ci0JCWVsc2UKLQkJCWFkZHIgfD0gMSA8PCAzMTsKKwlyZXQgPSBkcm1fbW1fcHJlX2dldCgmcGZiLT50YWdfaGVhcCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIE5VTEw7CisKKwlzcGluX2xvY2soJmRldl9wcml2LT50aWxlLmxvY2spOworCW1lbSA9IGRybV9tbV9zZWFyY2hfZnJlZSgmcGZiLT50YWdfaGVhcCwgc2l6ZSwgMCwgMCk7CisJaWYgKG1lbSkKKwkJbWVtID0gZHJtX21tX2dldF9ibG9ja19hdG9taWMobWVtLCBzaXplLCAwKTsKKwlzcGluX3VubG9jaygmZGV2X3ByaXYtPnRpbGUubG9jayk7CisKKwlyZXR1cm4gbWVtOworfQorCitzdGF0aWMgdm9pZAorbnYyMF9mYl9mcmVlX3RhZyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgZHJtX21tX25vZGUgKm1lbSkKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCisJc3Bpbl9sb2NrKCZkZXZfcHJpdi0+dGlsZS5sb2NrKTsKKwlkcm1fbW1fcHV0X2Jsb2NrKG1lbSk7CisJc3Bpbl91bmxvY2soJmRldl9wcml2LT50aWxlLmxvY2spOworfQorCit2b2lkCitudjEwX2ZiX2luaXRfdGlsZV9yZWdpb24oc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGksIHVpbnQzMl90IGFkZHIsCisJCQkgdWludDMyX3Qgc2l6ZSwgdWludDMyX3QgcGl0Y2gsIHVpbnQzMl90IGZsYWdzKQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG5vdXZlYXVfdGlsZV9yZWcgKnRpbGUgPSAmZGV2X3ByaXYtPnRpbGUucmVnW2ldOworCWludCBicHAgPSAoZmxhZ3MgJiBOT1VWRUFVX0dFTV9USUxFXzMyQlBQID8gMzIgOiAxNik7CisKKwl0aWxlLT5hZGRyID0gYWRkcjsKKwl0aWxlLT5saW1pdCA9IG1heCgxdSwgYWRkciArIHNpemUpIC0gMTsKKwl0aWxlLT5waXRjaCA9IHBpdGNoOworCisJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPT0gTlZfMjApIHsKKwkJaWYgKGZsYWdzICYgTk9VVkVBVV9HRU1fVElMRV9aRVRBKSB7CisJCQkvKgorCQkJICogQWxsb2NhdGUgc29tZSBvZiB0aGUgb24tZGllIHRhZyBtZW1vcnksCisJCQkgKiB1c2VkIHRvIHN0b3JlIFogY29tcHJlc3Npb24gbWV0YS1kYXRhIChtb3N0CisJCQkgKiBsaWtlbHkganVzdCBhIGJpdG1hcCBkZXRlcm1pbmluZyBpZiBhIGdpdmVuCisJCQkgKiB0aWxlIGlzIGNvbXByZXNzZWQgb3Igbm90KS4KKwkJCSAqLworCQkJdGlsZS0+dGFnX21lbSA9IG52MjBfZmJfYWxsb2NfdGFnKGRldiwgc2l6ZSAvIDI1Nik7CisKKwkJCWlmICh0aWxlLT50YWdfbWVtKSB7CisJCQkJLyogRW5hYmxlIFogY29tcHJlc3Npb24gKi8KKwkJCQlpZiAoZGV2X3ByaXYtPmNoaXBzZXQgPj0gMHgyNSkKKwkJCQkJdGlsZS0+emNvbXAgPSB0aWxlLT50YWdfbWVtLT5zdGFydCB8CisJCQkJCQkoYnBwID09IDE2ID8KKwkJCQkJCSBOVjI1X1BGQl9aQ09NUF9NT0RFXzE2IDoKKwkJCQkJCSBOVjI1X1BGQl9aQ09NUF9NT0RFXzMyKTsKKwkJCQllbHNlCisJCQkJCXRpbGUtPnpjb21wID0gdGlsZS0+dGFnX21lbS0+c3RhcnQgfAorCQkJCQkJTlYyMF9QRkJfWkNPTVBfRU4gfAorCQkJCQkJKGJwcCA9PSAxNiA/IDAgOgorCQkJCQkJIE5WMjBfUEZCX1pDT01QX01PREVfMzIpOworCQkJfQorCisJCQl0aWxlLT5hZGRyIHw9IDM7CisJCX0gZWxzZSB7CisJCQl0aWxlLT5hZGRyIHw9IDE7CisJCX0KKworCX0gZWxzZSB7CisJCXRpbGUtPmFkZHIgfD0gMSA8PCAzMTsKKwl9Cit9CisKK3ZvaWQKK252MTBfZmJfZnJlZV90aWxlX3JlZ2lvbihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgaSkKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBub3V2ZWF1X3RpbGVfcmVnICp0aWxlID0gJmRldl9wcml2LT50aWxlLnJlZ1tpXTsKKworCWlmICh0aWxlLT50YWdfbWVtKSB7CisJCW52MjBfZmJfZnJlZV90YWcoZGV2LCB0aWxlLT50YWdfbWVtKTsKKwkJdGlsZS0+dGFnX21lbSA9IE5VTEw7CiAJfQogCi0JbnZfd3IzMihkZXYsIE5WMTBfUEZCX1RMSU1JVChpKSwgbGltaXQpOwotCW52X3dyMzIoZGV2LCBOVjEwX1BGQl9UU0laRShpKSwgcGl0Y2gpOwotCW52X3dyMzIoZGV2LCBOVjEwX1BGQl9USUxFKGkpLCBhZGRyKTsKKwl0aWxlLT5hZGRyID0gdGlsZS0+bGltaXQgPSB0aWxlLT5waXRjaCA9IHRpbGUtPnpjb21wID0gMDsKK30KKwordm9pZAorbnYxMF9mYl9zZXRfdGlsZV9yZWdpb24oc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGkpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3Qgbm91dmVhdV90aWxlX3JlZyAqdGlsZSA9ICZkZXZfcHJpdi0+dGlsZS5yZWdbaV07CisKKwludl93cjMyKGRldiwgTlYxMF9QRkJfVExJTUlUKGkpLCB0aWxlLT5saW1pdCk7CisJbnZfd3IzMihkZXYsIE5WMTBfUEZCX1RTSVpFKGkpLCB0aWxlLT5waXRjaCk7CisJbnZfd3IzMihkZXYsIE5WMTBfUEZCX1RJTEUoaSksIHRpbGUtPmFkZHIpOworCisJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPT0gTlZfMjApCisJCW52X3dyMzIoZGV2LCBOVjIwX1BGQl9aQ09NUChpKSwgdGlsZS0+emNvbXApOwogfQogCiBpbnQKQEAgLTMxLDkgKzExNywxNCBAQAogCiAJcGZiLT5udW1fdGlsZXMgPSBOVjEwX1BGQl9USUxFX19TSVpFOwogCisJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPT0gTlZfMjApCisJCWRybV9tbV9pbml0KCZwZmItPnRhZ19oZWFwLCAwLAorCQkJICAgIChkZXZfcHJpdi0+Y2hpcHNldCA+PSAweDI1ID8KKwkJCSAgICAgNjQgKiAxMDI0IDogMzIgKiAxMDI0KSk7CisKIAkvKiBUdXJuIGFsbCB0aGUgdGlsaW5nIHJlZ2lvbnMgb2ZmLiAqLwogCWZvciAoaSA9IDA7IGkgPCBwZmItPm51bV90aWxlczsgaSsrKQotCQlwZmItPnNldF9yZWdpb25fdGlsaW5nKGRldiwgaSwgMCwgMCwgMCk7CisJCXBmYi0+c2V0X3RpbGVfcmVnaW9uKGRldiwgaSk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTQxLDQgKzEzMiwxMyBAQAogdm9pZAogbnYxMF9mYl90YWtlZG93bihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogeworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG5vdXZlYXVfZmJfZW5naW5lICpwZmIgPSAmZGV2X3ByaXYtPmVuZ2luZS5mYjsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBwZmItPm51bV90aWxlczsgaSsrKQorCQlwZmItPmZyZWVfdGlsZV9yZWdpb24oZGV2LCBpKTsKKworCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlID09IE5WXzIwKQorCQlkcm1fbW1fdGFrZWRvd24oJnBmYi0+dGFnX2hlYXApOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnYxMF9maWZvLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjEwX2ZpZm8uYwppbmRleCBmMWIwM2FkLi5kMmVjYmZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjEwX2ZpZm8uYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjEwX2ZpZm8uYwpAQCAtNTMsNiArNTMsMTEgQEAKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCisJY2hhbi0+dXNlciA9IGlvcmVtYXAocGNpX3Jlc291cmNlX3N0YXJ0KGRldi0+cGRldiwgMCkgKworCQkJICAgICBOVjAzX1VTRVIoY2hhbi0+aWQpLCBQQUdFX1NJWkUpOworCWlmICghY2hhbi0+dXNlcikKKwkJcmV0dXJuIC1FTk9NRU07CisKIAkvKiBGaWxsIGVudHJpZXMgdGhhdCBhcmUgc2VlbiBmaWxsZWQgaW4gZHVtcHMgb2YgbnZpZGlhIGRyaXZlciBqdXN0CiAJICogYWZ0ZXIgY2hhbm5lbCdzIGlzIHB1dCBpbnRvIERNQSBtb2RlCiAJICovCkBAIC03MywxNyArNzgsNiBAQAogCXJldHVybiAwOwogfQogCi12b2lkCi1udjEwX2ZpZm9fZGVzdHJveV9jb250ZXh0KHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4pCi17Ci0Jc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNoYW4tPmRldjsKLQotCW52X3dyMzIoZGV2LCBOVjA0X1BGSUZPX01PREUsCi0JCQludl9yZDMyKGRldiwgTlYwNF9QRklGT19NT0RFKSAmIH4oMSA8PCBjaGFuLT5pZCkpOwotCi0Jbm91dmVhdV9ncHVvYmpfcmVmKE5VTEwsICZjaGFuLT5yYW1mYyk7Ci19Ci0KIHN0YXRpYyB2b2lkCiBudjEwX2ZpZm9fZG9fbG9hZF9jb250ZXh0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBjaGlkKQogewpAQCAtMjE5LDYgKzIxMyw3IEBACiBzdGF0aWMgdm9pZAogbnYxMF9maWZvX2luaXRfaW50cihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogeworCW5vdXZlYXVfaXJxX3JlZ2lzdGVyKGRldiwgOCwgbnYwNF9maWZvX2lzcik7CiAJbnZfd3IzMihkZXYsIDB4MDAyMTAwLCAweGZmZmZmZmZmKTsKIAludl93cjMyKGRldiwgMHgwMDIxNDAsIDB4ZmZmZmZmZmYpOwogfQpAQCAtMjQxLDcgKzIzNiw3IEBACiAJcGZpZm8tPnJlYXNzaWduKGRldiwgdHJ1ZSk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgZGV2X3ByaXYtPmVuZ2luZS5maWZvLmNoYW5uZWxzOyBpKyspIHsKLQkJaWYgKGRldl9wcml2LT5maWZvc1tpXSkgeworCQlpZiAoZGV2X3ByaXYtPmNoYW5uZWxzLnB0cltpXSkgewogCQkJdWludDMyX3QgbW9kZSA9IG52X3JkMzIoZGV2LCBOVjA0X1BGSUZPX01PREUpOwogCQkJbnZfd3IzMihkZXYsIE5WMDRfUEZJRk9fTU9ERSwgbW9kZSB8ICgxIDw8IGkpKTsKIAkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnYxMF9ncmFwaC5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnYxMF9ncmFwaC5jCmluZGV4IDhlNjhjOTcuLjhjOTJlZGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252MTBfZ3JhcGguYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjEwX2dyYXBoLmMKQEAgLTI2LDYgKzI2LDEwIEBACiAjaW5jbHVkZSAiZHJtLmgiCiAjaW5jbHVkZSAibm91dmVhdV9kcm0uaCIKICNpbmNsdWRlICJub3V2ZWF1X2Rydi5oIgorI2luY2x1ZGUgIm5vdXZlYXVfdXRpbC5oIgorCitzdGF0aWMgaW50ICBudjEwX2dyYXBoX3JlZ2lzdGVyKHN0cnVjdCBkcm1fZGV2aWNlICopOworc3RhdGljIHZvaWQgbnYxMF9ncmFwaF9pc3Ioc3RydWN0IGRybV9kZXZpY2UgKik7CiAKICNkZWZpbmUgTlYxMF9GSUZPX05VTUJFUiAzMgogCkBAIC03ODYsMTUgKzc5MCwxMyBAQAogCXJldHVybiAwOwogfQogCi12b2lkCitzdGF0aWMgdm9pZAogbnYxMF9ncmFwaF9jb250ZXh0X3N3aXRjaChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogewogCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Ci0Jc3RydWN0IG5vdXZlYXVfcGdyYXBoX2VuZ2luZSAqcGdyYXBoID0gJmRldl9wcml2LT5lbmdpbmUuZ3JhcGg7CiAJc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbiA9IE5VTEw7CiAJaW50IGNoaWQ7CiAKLQlwZ3JhcGgtPmZpZm9fYWNjZXNzKGRldiwgZmFsc2UpOwogCW5vdXZlYXVfd2FpdF9mb3JfaWRsZShkZXYpOwogCiAJLyogSWYgcHJldmlvdXMgY29udGV4dCBpcyB2YWxpZCwgd2UgbmVlZCB0byBzYXZlIGl0ICovCkBAIC04MDIsMTEgKzgwNCw5IEBACiAKIAkvKiBMb2FkIGNvbnRleHQgZm9yIG5leHQgY2hhbm5lbCAqLwogCWNoaWQgPSAobnZfcmQzMihkZXYsIE5WMDRfUEdSQVBIX1RSQVBQRURfQUREUikgPj4gMjApICYgMHgxZjsKLQljaGFuID0gZGV2X3ByaXYtPmZpZm9zW2NoaWRdOworCWNoYW4gPSBkZXZfcHJpdi0+Y2hhbm5lbHMucHRyW2NoaWRdOwogCWlmIChjaGFuICYmIGNoYW4tPnBncmFwaF9jdHgpCiAJCW52MTBfZ3JhcGhfbG9hZF9jb250ZXh0KGNoYW4pOwotCi0JcGdyYXBoLT5maWZvX2FjY2VzcyhkZXYsIHRydWUpOwogfQogCiAjZGVmaW5lIE5WX1dSSVRFX0NUWChyZWcsIHZhbCkgZG8geyBcCkBAIC04MzMsNyArODMzLDcgQEAKIAlpZiAoY2hpZCA+PSBkZXZfcHJpdi0+ZW5naW5lLmZpZm8uY2hhbm5lbHMpCiAJCXJldHVybiBOVUxMOwogCi0JcmV0dXJuIGRldl9wcml2LT5maWZvc1tjaGlkXTsKKwlyZXR1cm4gZGV2X3ByaXYtPmNoYW5uZWxzLnB0cltjaGlkXTsKIH0KIAogaW50IG52MTBfZ3JhcGhfY3JlYXRlX2NvbnRleHQoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbikKQEAgLTg3NSwzNyArODc1LDU0IEBACiAKIHZvaWQgbnYxMF9ncmFwaF9kZXN0cm95X2NvbnRleHQoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbikKIHsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY2hhbi0+ZGV2OworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG5vdXZlYXVfcGdyYXBoX2VuZ2luZSAqcGdyYXBoID0gJmRldl9wcml2LT5lbmdpbmUuZ3JhcGg7CiAJc3RydWN0IGdyYXBoX3N0YXRlICpwZ3JhcGhfY3R4ID0gY2hhbi0+cGdyYXBoX2N0eDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldl9wcml2LT5jb250ZXh0X3N3aXRjaF9sb2NrLCBmbGFncyk7CisJcGdyYXBoLT5maWZvX2FjY2VzcyhkZXYsIGZhbHNlKTsKKworCS8qIFVubG9hZCB0aGUgY29udGV4dCBpZiBpdCdzIHRoZSBjdXJyZW50bHkgYWN0aXZlIG9uZSAqLworCWlmIChwZ3JhcGgtPmNoYW5uZWwoZGV2KSA9PSBjaGFuKQorCQlwZ3JhcGgtPnVubG9hZF9jb250ZXh0KGRldik7CisKKwkvKiBGcmVlIHRoZSBjb250ZXh0IHJlc291cmNlcyAqLwogCWtmcmVlKHBncmFwaF9jdHgpOwogCWNoYW4tPnBncmFwaF9jdHggPSBOVUxMOworCisJcGdyYXBoLT5maWZvX2FjY2VzcyhkZXYsIHRydWUpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldl9wcml2LT5jb250ZXh0X3N3aXRjaF9sb2NrLCBmbGFncyk7CiB9CiAKIHZvaWQKLW52MTBfZ3JhcGhfc2V0X3JlZ2lvbl90aWxpbmcoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGksIHVpbnQzMl90IGFkZHIsCi0JCQkgICAgIHVpbnQzMl90IHNpemUsIHVpbnQzMl90IHBpdGNoKQorbnYxMF9ncmFwaF9zZXRfdGlsZV9yZWdpb24oc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGkpCiB7Ci0JdWludDMyX3QgbGltaXQgPSBtYXgoMXUsIGFkZHIgKyBzaXplKSAtIDE7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3Qgbm91dmVhdV90aWxlX3JlZyAqdGlsZSA9ICZkZXZfcHJpdi0+dGlsZS5yZWdbaV07CiAKLQlpZiAocGl0Y2gpCi0JCWFkZHIgfD0gMSA8PCAzMTsKLQotCW52X3dyMzIoZGV2LCBOVjEwX1BHUkFQSF9UTElNSVQoaSksIGxpbWl0KTsKLQludl93cjMyKGRldiwgTlYxMF9QR1JBUEhfVFNJWkUoaSksIHBpdGNoKTsKLQludl93cjMyKGRldiwgTlYxMF9QR1JBUEhfVElMRShpKSwgYWRkcik7CisJbnZfd3IzMihkZXYsIE5WMTBfUEdSQVBIX1RMSU1JVChpKSwgdGlsZS0+bGltaXQpOworCW52X3dyMzIoZGV2LCBOVjEwX1BHUkFQSF9UU0laRShpKSwgdGlsZS0+cGl0Y2gpOworCW52X3dyMzIoZGV2LCBOVjEwX1BHUkFQSF9USUxFKGkpLCB0aWxlLT5hZGRyKTsKIH0KIAogaW50IG52MTBfZ3JhcGhfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogewogCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJdWludDMyX3QgdG1wOwotCWludCBpOworCWludCByZXQsIGk7CiAKIAludl93cjMyKGRldiwgTlYwM19QTUNfRU5BQkxFLCBudl9yZDMyKGRldiwgTlYwM19QTUNfRU5BQkxFKSAmCiAJCQl+TlZfUE1DX0VOQUJMRV9QR1JBUEgpOwogCW52X3dyMzIoZGV2LCBOVjAzX1BNQ19FTkFCTEUsIG52X3JkMzIoZGV2LCBOVjAzX1BNQ19FTkFCTEUpIHwKIAkJCSBOVl9QTUNfRU5BQkxFX1BHUkFQSCk7CiAKKwlyZXQgPSBudjEwX2dyYXBoX3JlZ2lzdGVyKGRldik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCW5vdXZlYXVfaXJxX3JlZ2lzdGVyKGRldiwgMTIsIG52MTBfZ3JhcGhfaXNyKTsKIAludl93cjMyKGRldiwgTlYwM19QR1JBUEhfSU5UUiAgICwgMHhGRkZGRkZGRik7CiAJbnZfd3IzMihkZXYsIE5WMDNfUEdSQVBIX0lOVFJfRU4sIDB4RkZGRkZGRkYpOwogCkBAIC05MjgsNyArOTQ1LDcgQEAKIAogCS8qIFR1cm4gYWxsIHRoZSB0aWxpbmcgcmVnaW9ucyBvZmYuICovCiAJZm9yIChpID0gMDsgaSA8IE5WMTBfUEZCX1RJTEVfX1NJWkU7IGkrKykKLQkJbnYxMF9ncmFwaF9zZXRfcmVnaW9uX3RpbGluZyhkZXYsIGksIDAsIDAsIDApOworCQludjEwX2dyYXBoX3NldF90aWxlX3JlZ2lvbihkZXYsIGkpOwogCiAJbnZfd3IzMihkZXYsIE5WMTBfUEdSQVBIX0NUWF9TV0lUQ0goMCksIDB4MDAwMDAwMDApOwogCW52X3dyMzIoZGV2LCBOVjEwX1BHUkFQSF9DVFhfU1dJVENIKDEpLCAweDAwMDAwMDAwKTsKQEAgLTk0OCwxNyArOTY1LDE3IEBACiAKIHZvaWQgbnYxMF9ncmFwaF90YWtlZG93bihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogeworCW52X3dyMzIoZGV2LCBOVjAzX1BHUkFQSF9JTlRSX0VOLCAweDAwMDAwMDAwKTsKKwlub3V2ZWF1X2lycV91bnJlZ2lzdGVyKGRldiwgMTIpOwogfQogCiBzdGF0aWMgaW50Ci1udjE3X2dyYXBoX210aGRfbG1hX3dpbmRvdyhzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuLCBpbnQgZ3JjbGFzcywKLQkJCSAgIGludCBtdGhkLCB1aW50MzJfdCBkYXRhKQorbnYxN19ncmFwaF9tdGhkX2xtYV93aW5kb3coc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbiwKKwkJCSAgIHUzMiBjbGFzcywgdTMyIG10aGQsIHUzMiBkYXRhKQogewogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjaGFuLT5kZXY7CiAJc3RydWN0IGdyYXBoX3N0YXRlICpjdHggPSBjaGFuLT5wZ3JhcGhfY3R4OwogCXN0cnVjdCBwaXBlX3N0YXRlICpwaXBlID0gJmN0eC0+cGlwZV9zdGF0ZTsKLQlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCXN0cnVjdCBub3V2ZWF1X3BncmFwaF9lbmdpbmUgKnBncmFwaCA9ICZkZXZfcHJpdi0+ZW5naW5lLmdyYXBoOwogCXVpbnQzMl90IHBpcGVfMHgwMDQwWzFdLCBwaXBlXzB4NjRjMFs4XSwgcGlwZV8weDZhODBbM10sIHBpcGVfMHg2YWIwWzNdOwogCXVpbnQzMl90IHhmbW9kZTAsIHhmbW9kZTE7CiAJaW50IGk7CkBAIC0xMDI1LDE4ICsxMDQyLDE0IEBACiAKIAlub3V2ZWF1X3dhaXRfZm9yX2lkbGUoZGV2KTsKIAotCXBncmFwaC0+Zmlmb19hY2Nlc3MoZGV2LCB0cnVlKTsKLQogCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50Ci1udjE3X2dyYXBoX210aGRfbG1hX2VuYWJsZShzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuLCBpbnQgZ3JjbGFzcywKLQkJCSAgIGludCBtdGhkLCB1aW50MzJfdCBkYXRhKQorbnYxN19ncmFwaF9tdGhkX2xtYV9lbmFibGUoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbiwKKwkJCSAgIHUzMiBjbGFzcywgdTMyIG10aGQsIHUzMiBkYXRhKQogewogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjaGFuLT5kZXY7Ci0Jc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlzdHJ1Y3Qgbm91dmVhdV9wZ3JhcGhfZW5naW5lICpwZ3JhcGggPSAmZGV2X3ByaXYtPmVuZ2luZS5ncmFwaDsKIAogCW5vdXZlYXVfd2FpdF9mb3JfaWRsZShkZXYpOwogCkBAIC0xMDQ1LDQwICsxMDU4LDExOCBAQAogCW52X3dyMzIoZGV2LCAweDAwNDAwNmIwLAogCQludl9yZDMyKGRldiwgMHgwMDQwMDZiMCkgfCAweDggPDwgMjQpOwogCi0JcGdyYXBoLT5maWZvX2FjY2VzcyhkZXYsIHRydWUpOwotCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgbm91dmVhdV9wZ3JhcGhfb2JqZWN0X21ldGhvZCBudjE3X2dyYXBoX2NlbHNpdXNfbXRoZHNbXSA9IHsKLQl7IDB4MTYzOCwgbnYxN19ncmFwaF9tdGhkX2xtYV93aW5kb3cgfSwKLQl7IDB4MTYzYywgbnYxN19ncmFwaF9tdGhkX2xtYV93aW5kb3cgfSwKLQl7IDB4MTY0MCwgbnYxN19ncmFwaF9tdGhkX2xtYV93aW5kb3cgfSwKLQl7IDB4MTY0NCwgbnYxN19ncmFwaF9tdGhkX2xtYV93aW5kb3cgfSwKLQl7IDB4MTY1OCwgbnYxN19ncmFwaF9tdGhkX2xtYV9lbmFibGUgfSwKK3N0YXRpYyBpbnQKK252MTBfZ3JhcGhfcmVnaXN0ZXIoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCisJaWYgKGRldl9wcml2LT5lbmdpbmUuZ3JhcGgucmVnaXN0ZXJlZCkKKwkJcmV0dXJuIDA7CisKKwlOVk9CSl9DTEFTUyhkZXYsIDB4NTA2ZSwgU1cpOyAvKiBudnN3ICovCisJTlZPQkpfQ0xBU1MoZGV2LCAweDAwMzAsIEdSKTsgLyogbnVsbCAqLworCU5WT0JKX0NMQVNTKGRldiwgMHgwMDM5LCBHUik7IC8qIG0ybWYgKi8KKwlOVk9CSl9DTEFTUyhkZXYsIDB4MDA0YSwgR1IpOyAvKiBnZGlyZWN0ICovCisJTlZPQkpfQ0xBU1MoZGV2LCAweDAwNWYsIEdSKTsgLyogaW1hZ2VibGl0ICovCisJTlZPQkpfQ0xBU1MoZGV2LCAweDAwOWYsIEdSKTsgLyogaW1hZ2VibGl0IChudjEyKSAqLworCU5WT0JKX0NMQVNTKGRldiwgMHgwMDhhLCBHUik7IC8qIGlmYyAqLworCU5WT0JKX0NMQVNTKGRldiwgMHgwMDg5LCBHUik7IC8qIHNpZm0gKi8KKwlOVk9CSl9DTEFTUyhkZXYsIDB4MDA2MiwgR1IpOyAvKiBzdXJmMmQgKi8KKwlOVk9CSl9DTEFTUyhkZXYsIDB4MDA0MywgR1IpOyAvKiByb3AgKi8KKwlOVk9CSl9DTEFTUyhkZXYsIDB4MDAxMiwgR1IpOyAvKiBiZXRhMSAqLworCU5WT0JKX0NMQVNTKGRldiwgMHgwMDcyLCBHUik7IC8qIGJldGE0ICovCisJTlZPQkpfQ0xBU1MoZGV2LCAweDAwMTksIEdSKTsgLyogY2xpcHJlY3QgKi8KKwlOVk9CSl9DTEFTUyhkZXYsIDB4MDA0NCwgR1IpOyAvKiBwYXR0ZXJuICovCisJTlZPQkpfQ0xBU1MoZGV2LCAweDAwNTIsIEdSKTsgLyogc3d6c3VyZiAqLworCU5WT0JKX0NMQVNTKGRldiwgMHgwMDkzLCBHUik7IC8qIHN1cmYzZCAqLworCU5WT0JKX0NMQVNTKGRldiwgMHgwMDk0LCBHUik7IC8qIHRleF90cmkgKi8KKwlOVk9CSl9DTEFTUyhkZXYsIDB4MDA5NSwgR1IpOyAvKiBtdWx0aXRleF90cmkgKi8KKworCS8qIGNlbGNpdXMgKi8KKwlpZiAoZGV2X3ByaXYtPmNoaXBzZXQgPD0gMHgxMCkgeworCQlOVk9CSl9DTEFTUyhkZXYsIDB4MDA1NiwgR1IpOworCX0gZWxzZQorCWlmIChkZXZfcHJpdi0+Y2hpcHNldCA8IDB4MTcgfHwgZGV2X3ByaXYtPmNoaXBzZXQgPT0gMHgxYSkgeworCQlOVk9CSl9DTEFTUyhkZXYsIDB4MDA5NiwgR1IpOworCX0gZWxzZSB7CisJCU5WT0JKX0NMQVNTKGRldiwgMHgwMDk5LCBHUik7CisJCU5WT0JKX01USEQgKGRldiwgMHgwMDk5LCAweDE2MzgsIG52MTdfZ3JhcGhfbXRoZF9sbWFfd2luZG93KTsKKwkJTlZPQkpfTVRIRCAoZGV2LCAweDAwOTksIDB4MTYzYywgbnYxN19ncmFwaF9tdGhkX2xtYV93aW5kb3cpOworCQlOVk9CSl9NVEhEIChkZXYsIDB4MDA5OSwgMHgxNjQwLCBudjE3X2dyYXBoX210aGRfbG1hX3dpbmRvdyk7CisJCU5WT0JKX01USEQgKGRldiwgMHgwMDk5LCAweDE2NDQsIG52MTdfZ3JhcGhfbXRoZF9sbWFfd2luZG93KTsKKwkJTlZPQkpfTVRIRCAoZGV2LCAweDAwOTksIDB4MTY1OCwgbnYxN19ncmFwaF9tdGhkX2xtYV9lbmFibGUpOworCX0KKworCS8qIG52c3cgKi8KKwlOVk9CSl9DTEFTUyhkZXYsIDB4NTA2ZSwgU1cpOworCU5WT0JKX01USEQgKGRldiwgMHg1MDZlLCAweDA1MDAsIG52MDRfZ3JhcGhfbXRoZF9wYWdlX2ZsaXApOworCisJZGV2X3ByaXYtPmVuZ2luZS5ncmFwaC5yZWdpc3RlcmVkID0gdHJ1ZTsKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IG5vdXZlYXVfYml0ZmllbGQgbnYxMF9ncmFwaF9pbnRyW10gPSB7CisJeyBOVl9QR1JBUEhfSU5UUl9OT1RJRlksICJOT1RJRlkiIH0sCisJeyBOVl9QR1JBUEhfSU5UUl9FUlJPUiwgICJFUlJPUiIgIH0sCiAJe30KIH07CiAKLXN0cnVjdCBub3V2ZWF1X3BncmFwaF9vYmplY3RfY2xhc3MgbnYxMF9ncmFwaF9ncmNsYXNzW10gPSB7Ci0JeyAweDAwMzAsIGZhbHNlLCBOVUxMIH0sIC8qIG51bGwgKi8KLQl7IDB4MDAzOSwgZmFsc2UsIE5VTEwgfSwgLyogbTJtZiAqLwotCXsgMHgwMDRhLCBmYWxzZSwgTlVMTCB9LCAvKiBnZGlyZWN0ICovCi0JeyAweDAwNWYsIGZhbHNlLCBOVUxMIH0sIC8qIGltYWdlYmxpdCAqLwotCXsgMHgwMDlmLCBmYWxzZSwgTlVMTCB9LCAvKiBpbWFnZWJsaXQgKG52MTIpICovCi0JeyAweDAwOGEsIGZhbHNlLCBOVUxMIH0sIC8qIGlmYyAqLwotCXsgMHgwMDg5LCBmYWxzZSwgTlVMTCB9LCAvKiBzaWZtICovCi0JeyAweDAwNjIsIGZhbHNlLCBOVUxMIH0sIC8qIHN1cmYyZCAqLwotCXsgMHgwMDQzLCBmYWxzZSwgTlVMTCB9LCAvKiByb3AgKi8KLQl7IDB4MDAxMiwgZmFsc2UsIE5VTEwgfSwgLyogYmV0YTEgKi8KLQl7IDB4MDA3MiwgZmFsc2UsIE5VTEwgfSwgLyogYmV0YTQgKi8KLQl7IDB4MDAxOSwgZmFsc2UsIE5VTEwgfSwgLyogY2xpcHJlY3QgKi8KLQl7IDB4MDA0NCwgZmFsc2UsIE5VTEwgfSwgLyogcGF0dGVybiAqLwotCXsgMHgwMDUyLCBmYWxzZSwgTlVMTCB9LCAvKiBzd3pzdXJmICovCi0JeyAweDAwOTMsIGZhbHNlLCBOVUxMIH0sIC8qIHN1cmYzZCAqLwotCXsgMHgwMDk0LCBmYWxzZSwgTlVMTCB9LCAvKiB0ZXhfdHJpICovCi0JeyAweDAwOTUsIGZhbHNlLCBOVUxMIH0sIC8qIG11bHRpdGV4X3RyaSAqLwotCXsgMHgwMDU2LCBmYWxzZSwgTlVMTCB9LCAvKiBjZWxjaXVzIChudjEwKSAqLwotCXsgMHgwMDk2LCBmYWxzZSwgTlVMTCB9LCAvKiBjZWxjaXVzIChudjExKSAqLwotCXsgMHgwMDk5LCBmYWxzZSwgbnYxN19ncmFwaF9jZWxzaXVzX210aGRzIH0sIC8qIGNlbGNpdXMgKG52MTcpICovCitzdHJ1Y3Qgbm91dmVhdV9iaXRmaWVsZCBudjEwX2dyYXBoX25zdGF0dXNbXSA9Cit7CisJeyBOVjEwX1BHUkFQSF9OU1RBVFVTX1NUQVRFX0lOX1VTRSwgICAgICAgIlNUQVRFX0lOX1VTRSIgfSwKKwl7IE5WMTBfUEdSQVBIX05TVEFUVVNfSU5WQUxJRF9TVEFURSwgICAgICAiSU5WQUxJRF9TVEFURSIgfSwKKwl7IE5WMTBfUEdSQVBIX05TVEFUVVNfQkFEX0FSR1VNRU5ULCAgICAgICAiQkFEX0FSR1VNRU5UIiB9LAorCXsgTlYxMF9QR1JBUEhfTlNUQVRVU19QUk9URUNUSU9OX0ZBVUxULCAgICJQUk9URUNUSU9OX0ZBVUxUIiB9LAogCXt9CiB9OworCitzdGF0aWMgdm9pZAorbnYxMF9ncmFwaF9pc3Ioc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwl1MzIgc3RhdDsKKworCXdoaWxlICgoc3RhdCA9IG52X3JkMzIoZGV2LCBOVjAzX1BHUkFQSF9JTlRSKSkpIHsKKwkJdTMyIG5zb3VyY2UgPSBudl9yZDMyKGRldiwgTlYwM19QR1JBUEhfTlNPVVJDRSk7CisJCXUzMiBuc3RhdHVzID0gbnZfcmQzMihkZXYsIE5WMDNfUEdSQVBIX05TVEFUVVMpOworCQl1MzIgYWRkciA9IG52X3JkMzIoZGV2LCBOVjA0X1BHUkFQSF9UUkFQUEVEX0FERFIpOworCQl1MzIgY2hpZCA9IChhZGRyICYgMHgwMWYwMDAwMCkgPj4gMjA7CisJCXUzMiBzdWJjID0gKGFkZHIgJiAweDAwMDcwMDAwKSA+PiAxNjsKKwkJdTMyIG10aGQgPSAoYWRkciAmIDB4MDAwMDFmZmMpOworCQl1MzIgZGF0YSA9IG52X3JkMzIoZGV2LCBOVjA0X1BHUkFQSF9UUkFQUEVEX0RBVEEpOworCQl1MzIgY2xhc3MgPSBudl9yZDMyKGRldiwgMHg0MDAxNjAgKyBzdWJjICogNCkgJiAweGZmZjsKKwkJdTMyIHNob3cgPSBzdGF0OworCisJCWlmIChzdGF0ICYgTlZfUEdSQVBIX0lOVFJfRVJST1IpIHsKKwkJCWlmIChuc291cmNlICYgTlYwM19QR1JBUEhfTlNPVVJDRV9JTExFR0FMX01USEQpIHsKKwkJCQlpZiAoIW5vdXZlYXVfZ3B1b2JqX210aGRfY2FsbDIoZGV2LCBjaGlkLCBjbGFzcywgbXRoZCwgZGF0YSkpCisJCQkJCXNob3cgJj0gfk5WX1BHUkFQSF9JTlRSX0VSUk9SOworCQkJfQorCQl9CisKKwkJaWYgKHN0YXQgJiBOVl9QR1JBUEhfSU5UUl9DT05URVhUX1NXSVRDSCkgeworCQkJbnZfd3IzMihkZXYsIE5WMDNfUEdSQVBIX0lOVFIsIE5WX1BHUkFQSF9JTlRSX0NPTlRFWFRfU1dJVENIKTsKKwkJCXN0YXQgJj0gfk5WX1BHUkFQSF9JTlRSX0NPTlRFWFRfU1dJVENIOworCQkJc2hvdyAmPSB+TlZfUEdSQVBIX0lOVFJfQ09OVEVYVF9TV0lUQ0g7CisJCQludjEwX2dyYXBoX2NvbnRleHRfc3dpdGNoKGRldik7CisJCX0KKworCQludl93cjMyKGRldiwgTlYwM19QR1JBUEhfSU5UUiwgc3RhdCk7CisJCW52X3dyMzIoZGV2LCBOVjA0X1BHUkFQSF9GSUZPLCAweDAwMDAwMDAxKTsKKworCQlpZiAoc2hvdyAmJiBub3V2ZWF1X3JhdGVsaW1pdCgpKSB7CisJCQlOVl9JTkZPKGRldiwgIlBHUkFQSCAtIik7CisJCQlub3V2ZWF1X2JpdGZpZWxkX3ByaW50KG52MTBfZ3JhcGhfaW50ciwgc2hvdyk7CisJCQlwcmludGsoIiBuc291cmNlOiIpOworCQkJbm91dmVhdV9iaXRmaWVsZF9wcmludChudjA0X2dyYXBoX25zb3VyY2UsIG5zb3VyY2UpOworCQkJcHJpbnRrKCIgbnN0YXR1czoiKTsKKwkJCW5vdXZlYXVfYml0ZmllbGRfcHJpbnQobnYxMF9ncmFwaF9uc3RhdHVzLCBuc3RhdHVzKTsKKwkJCXByaW50aygiXG4iKTsKKwkJCU5WX0lORk8oZGV2LCAiUEdSQVBIIC0gY2ggJWQvJWQgY2xhc3MgMHglMDR4ICIKKwkJCQkgICAgICJtdGhkIDB4JTA0eCBkYXRhIDB4JTA4eFxuIiwKKwkJCQljaGlkLCBzdWJjLCBjbGFzcywgbXRoZCwgZGF0YSk7CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjIwX2dyYXBoLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjIwX2dyYXBoLmMKaW5kZXggMTJhYjljZC4uODQ2NGI3NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnYyMF9ncmFwaC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252MjBfZ3JhcGguYwpAQCAtMzIsNiArMzIsMTAgQEAKICNkZWZpbmUgTlYzNF9HUkNUWF9TSVpFICAgICgxODE0MCkKICNkZWZpbmUgTlYzNV8zNl9HUkNUWF9TSVpFICgyMjM5NikKIAorc3RhdGljIGludCBudjIwX2dyYXBoX3JlZ2lzdGVyKHN0cnVjdCBkcm1fZGV2aWNlICopOworc3RhdGljIGludCBudjMwX2dyYXBoX3JlZ2lzdGVyKHN0cnVjdCBkcm1fZGV2aWNlICopOworc3RhdGljIHZvaWQgbnYyMF9ncmFwaF9pc3Ioc3RydWN0IGRybV9kZXZpY2UgKik7CisKIHN0YXRpYyB2b2lkCiBudjIwX2dyYXBoX2NvbnRleHRfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKmN0eCkKIHsKQEAgLTQyNSw5ICs0MjksMjEgQEAKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY2hhbi0+ZGV2OwogCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJc3RydWN0IG5vdXZlYXVfcGdyYXBoX2VuZ2luZSAqcGdyYXBoID0gJmRldl9wcml2LT5lbmdpbmUuZ3JhcGg7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCW5vdXZlYXVfZ3B1b2JqX3JlZihOVUxMLCAmY2hhbi0+cmFtaW5fZ3JjdHgpOworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZfcHJpdi0+Y29udGV4dF9zd2l0Y2hfbG9jaywgZmxhZ3MpOworCXBncmFwaC0+Zmlmb19hY2Nlc3MoZGV2LCBmYWxzZSk7CisKKwkvKiBVbmxvYWQgdGhlIGNvbnRleHQgaWYgaXQncyB0aGUgY3VycmVudGx5IGFjdGl2ZSBvbmUgKi8KKwlpZiAocGdyYXBoLT5jaGFubmVsKGRldikgPT0gY2hhbikKKwkJcGdyYXBoLT51bmxvYWRfY29udGV4dChkZXYpOworCisJcGdyYXBoLT5maWZvX2FjY2VzcyhkZXYsIHRydWUpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldl9wcml2LT5jb250ZXh0X3N3aXRjaF9sb2NrLCBmbGFncyk7CisKKwkvKiBGcmVlIHRoZSBjb250ZXh0IHJlc291cmNlcyAqLwogCW52X3dvMzIocGdyYXBoLT5jdHhfdGFibGUsIGNoYW4tPmlkICogNCwgMCk7CisJbm91dmVhdV9ncHVvYmpfcmVmKE5VTEwsICZjaGFuLT5yYW1pbl9ncmN0eCk7CiB9CiAKIGludApAQCAtNDk2LDI0ICs1MTIsMjcgQEAKIH0KIAogdm9pZAotbnYyMF9ncmFwaF9zZXRfcmVnaW9uX3RpbGluZyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgaSwgdWludDMyX3QgYWRkciwKLQkJCSAgICAgdWludDMyX3Qgc2l6ZSwgdWludDMyX3QgcGl0Y2gpCitudjIwX2dyYXBoX3NldF90aWxlX3JlZ2lvbihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgaSkKIHsKLQl1aW50MzJfdCBsaW1pdCA9IG1heCgxdSwgYWRkciArIHNpemUpIC0gMTsKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBub3V2ZWF1X3RpbGVfcmVnICp0aWxlID0gJmRldl9wcml2LT50aWxlLnJlZ1tpXTsKIAotCWlmIChwaXRjaCkKLQkJYWRkciB8PSAxOwotCi0JbnZfd3IzMihkZXYsIE5WMjBfUEdSQVBIX1RMSU1JVChpKSwgbGltaXQpOwotCW52X3dyMzIoZGV2LCBOVjIwX1BHUkFQSF9UU0laRShpKSwgcGl0Y2gpOwotCW52X3dyMzIoZGV2LCBOVjIwX1BHUkFQSF9USUxFKGkpLCBhZGRyKTsKKwludl93cjMyKGRldiwgTlYyMF9QR1JBUEhfVExJTUlUKGkpLCB0aWxlLT5saW1pdCk7CisJbnZfd3IzMihkZXYsIE5WMjBfUEdSQVBIX1RTSVpFKGkpLCB0aWxlLT5waXRjaCk7CisJbnZfd3IzMihkZXYsIE5WMjBfUEdSQVBIX1RJTEUoaSksIHRpbGUtPmFkZHIpOwogCiAJbnZfd3IzMihkZXYsIE5WMTBfUEdSQVBIX1JESV9JTkRFWCwgMHgwMEVBMDAzMCArIDQgKiBpKTsKLQludl93cjMyKGRldiwgTlYxMF9QR1JBUEhfUkRJX0RBVEEsIGxpbWl0KTsKKwludl93cjMyKGRldiwgTlYxMF9QR1JBUEhfUkRJX0RBVEEsIHRpbGUtPmxpbWl0KTsKIAludl93cjMyKGRldiwgTlYxMF9QR1JBUEhfUkRJX0lOREVYLCAweDAwRUEwMDUwICsgNCAqIGkpOwotCW52X3dyMzIoZGV2LCBOVjEwX1BHUkFQSF9SRElfREFUQSwgcGl0Y2gpOworCW52X3dyMzIoZGV2LCBOVjEwX1BHUkFQSF9SRElfREFUQSwgdGlsZS0+cGl0Y2gpOwogCW52X3dyMzIoZGV2LCBOVjEwX1BHUkFQSF9SRElfSU5ERVgsIDB4MDBFQTAwMTAgKyA0ICogaSk7Ci0JbnZfd3IzMihkZXYsIE5WMTBfUEdSQVBIX1JESV9EQVRBLCBhZGRyKTsKKwludl93cjMyKGRldiwgTlYxMF9QR1JBUEhfUkRJX0RBVEEsIHRpbGUtPmFkZHIpOworCisJaWYgKGRldl9wcml2LT5jYXJkX3R5cGUgPT0gTlZfMjApIHsKKwkJbnZfd3IzMihkZXYsIE5WMjBfUEdSQVBIX1pDT01QKGkpLCB0aWxlLT56Y29tcCk7CisJCW52X3dyMzIoZGV2LCBOVjEwX1BHUkFQSF9SRElfSU5ERVgsIDB4MDBlYTAwOTAgKyA0ICogaSk7CisJCW52X3dyMzIoZGV2LCBOVjEwX1BHUkFQSF9SRElfREFUQSwgdGlsZS0+emNvbXApOworCX0KIH0KIAogaW50CkBAIC01NjAsNiArNTc5LDEzIEBACiAKIAludjIwX2dyYXBoX3JkaShkZXYpOwogCisJcmV0ID0gbnYyMF9ncmFwaF9yZWdpc3RlcihkZXYpOworCWlmIChyZXQpIHsKKwkJbm91dmVhdV9ncHVvYmpfcmVmKE5VTEwsICZwZ3JhcGgtPmN0eF90YWJsZSk7CisJCXJldHVybiByZXQ7CisJfQorCisJbm91dmVhdV9pcnFfcmVnaXN0ZXIoZGV2LCAxMiwgbnYyMF9ncmFwaF9pc3IpOwogCW52X3dyMzIoZGV2LCBOVjAzX1BHUkFQSF9JTlRSICAgLCAweEZGRkZGRkZGKTsKIAludl93cjMyKGRldiwgTlYwM19QR1JBUEhfSU5UUl9FTiwgMHhGRkZGRkZGRik7CiAKQEAgLTU3MSwxNiArNTk3LDE3IEBACiAJbnZfd3IzMihkZXYsIDB4NDAwMDlDICAgICAgICAgICAsIDB4MDAwMDAwNDApOwogCiAJaWYgKGRldl9wcml2LT5jaGlwc2V0ID49IDB4MjUpIHsKLQkJbnZfd3IzMihkZXYsIDB4NDAwODkwLCAweDAwMDgwMDAwKTsKKwkJbnZfd3IzMihkZXYsIDB4NDAwODkwLCAweDAwYThjZmZmKTsKIAkJbnZfd3IzMihkZXYsIDB4NDAwNjEwLCAweDMwNEIxRkI2KTsKLQkJbnZfd3IzMihkZXYsIDB4NDAwQjgwLCAweDE4QjgyODgwKTsKKwkJbnZfd3IzMihkZXYsIDB4NDAwQjgwLCAweDFjYmQzODgzKTsKIAkJbnZfd3IzMihkZXYsIDB4NDAwQjg0LCAweDQ0MDAwMDAwKTsKIAkJbnZfd3IzMihkZXYsIDB4NDAwMDk4LCAweDQwMDAwMDgwKTsKIAkJbnZfd3IzMihkZXYsIDB4NDAwQjg4LCAweDAwMDAwMGZmKTsKKwogCX0gZWxzZSB7Ci0JCW52X3dyMzIoZGV2LCAweDQwMDg4MCwgMHgwMDA4MDAwMCk7IC8qIDB4MDAwOGM3ZGYgKi8KKwkJbnZfd3IzMihkZXYsIDB4NDAwODgwLCAweDAwMDhjN2RmKTsKIAkJbnZfd3IzMihkZXYsIDB4NDAwMDk0LCAweDAwMDAwMDA1KTsKLQkJbnZfd3IzMihkZXYsIDB4NDAwQjgwLCAweDQ1Q0FBMjA4KTsgLyogMHg0NWVhZTIwZSAqLworCQludl93cjMyKGRldiwgMHg0MDBCODAsIDB4NDVlYWUyMGUpOwogCQludl93cjMyKGRldiwgMHg0MDBCODQsIDB4MjQwMDAwMDApOwogCQludl93cjMyKGRldiwgMHg0MDAwOTgsIDB4MDAwMDAwNDApOwogCQludl93cjMyKGRldiwgTlYxMF9QR1JBUEhfUkRJX0lOREVYLCAweDAwRTAwMDM4KTsKQEAgLTU5MSwxNCArNjE4LDggQEAKIAogCS8qIFR1cm4gYWxsIHRoZSB0aWxpbmcgcmVnaW9ucyBvZmYuICovCiAJZm9yIChpID0gMDsgaSA8IE5WMTBfUEZCX1RJTEVfX1NJWkU7IGkrKykKLQkJbnYyMF9ncmFwaF9zZXRfcmVnaW9uX3RpbGluZyhkZXYsIGksIDAsIDAsIDApOworCQludjIwX2dyYXBoX3NldF90aWxlX3JlZ2lvbihkZXYsIGkpOwogCi0JZm9yIChpID0gMDsgaSA8IDg7IGkrKykgewotCQludl93cjMyKGRldiwgMHg0MDA5ODAgKyBpICogNCwgbnZfcmQzMihkZXYsIDB4MTAwMzAwICsgaSAqIDQpKTsKLQkJbnZfd3IzMihkZXYsIE5WMTBfUEdSQVBIX1JESV9JTkRFWCwgMHgwMEVBMDA5MCArIGkgKiA0KTsKLQkJbnZfd3IzMihkZXYsIE5WMTBfUEdSQVBIX1JESV9EQVRBLAotCQkJCQludl9yZDMyKGRldiwgMHgxMDAzMDAgKyBpICogNCkpOwotCX0KIAludl93cjMyKGRldiwgMHg0MDA5YTAsIG52X3JkMzIoZGV2LCAweDEwMDMyNCkpOwogCW52X3dyMzIoZGV2LCBOVjEwX1BHUkFQSF9SRElfSU5ERVgsIDB4MDBFQTAwMEMpOwogCW52X3dyMzIoZGV2LCBOVjEwX1BHUkFQSF9SRElfREFUQSwgbnZfcmQzMihkZXYsIDB4MTAwMzI0KSk7CkBAIC02NDIsNiArNjYzLDkgQEAKIAlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXN0cnVjdCBub3V2ZWF1X3BncmFwaF9lbmdpbmUgKnBncmFwaCA9ICZkZXZfcHJpdi0+ZW5naW5lLmdyYXBoOwogCisJbnZfd3IzMihkZXYsIE5WMDNfUEdSQVBIX0lOVFJfRU4sIDB4MDAwMDAwMDApOworCW5vdXZlYXVfaXJxX3VucmVnaXN0ZXIoZGV2LCAxMik7CisKIAlub3V2ZWF1X2dwdW9ial9yZWYoTlVMTCwgJnBncmFwaC0+Y3R4X3RhYmxlKTsKIH0KIApAQCAtNjg0LDkgKzcwOCwxNiBAQAogCQkJcmV0dXJuIHJldDsKIAl9CiAKKwlyZXQgPSBudjMwX2dyYXBoX3JlZ2lzdGVyKGRldik7CisJaWYgKHJldCkgeworCQlub3V2ZWF1X2dwdW9ial9yZWYoTlVMTCwgJnBncmFwaC0+Y3R4X3RhYmxlKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKIAludl93cjMyKGRldiwgTlYyMF9QR1JBUEhfQ0hBTk5FTF9DVFhfVEFCTEUsCiAJCSAgICAgcGdyYXBoLT5jdHhfdGFibGUtPnBpbnN0ID4+IDQpOwogCisJbm91dmVhdV9pcnFfcmVnaXN0ZXIoZGV2LCAxMiwgbnYyMF9ncmFwaF9pc3IpOwogCW52X3dyMzIoZGV2LCBOVjAzX1BHUkFQSF9JTlRSICAgLCAweEZGRkZGRkZGKTsKIAludl93cjMyKGRldiwgTlYwM19QR1JBUEhfSU5UUl9FTiwgMHhGRkZGRkZGRik7CiAKQEAgLTcyNCw3ICs3NTUsNyBAQAogCiAJLyogVHVybiBhbGwgdGhlIHRpbGluZyByZWdpb25zIG9mZi4gKi8KIAlmb3IgKGkgPSAwOyBpIDwgTlYxMF9QRkJfVElMRV9fU0laRTsgaSsrKQotCQludjIwX2dyYXBoX3NldF9yZWdpb25fdGlsaW5nKGRldiwgaSwgMCwgMCwgMCk7CisJCW52MjBfZ3JhcGhfc2V0X3RpbGVfcmVnaW9uKGRldiwgaSk7CiAKIAludl93cjMyKGRldiwgTlYxMF9QR1JBUEhfQ1RYX0NPTlRST0wsIDB4MTAwMDAxMDApOwogCW52X3dyMzIoZGV2LCBOVjEwX1BHUkFQSF9TVEFURSAgICAgICwgMHhGRkZGRkZGRik7CkBAIC03NDQsNDYgKzc3NSwxMjUgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RydWN0IG5vdXZlYXVfcGdyYXBoX29iamVjdF9jbGFzcyBudjIwX2dyYXBoX2dyY2xhc3NbXSA9IHsKLQl7IDB4MDAzMCwgZmFsc2UsIE5VTEwgfSwgLyogbnVsbCAqLwotCXsgMHgwMDM5LCBmYWxzZSwgTlVMTCB9LCAvKiBtMm1mICovCi0JeyAweDAwNGEsIGZhbHNlLCBOVUxMIH0sIC8qIGdkaXJlY3QgKi8KLQl7IDB4MDA5ZiwgZmFsc2UsIE5VTEwgfSwgLyogaW1hZ2VibGl0IChudjEyKSAqLwotCXsgMHgwMDhhLCBmYWxzZSwgTlVMTCB9LCAvKiBpZmMgKi8KLQl7IDB4MDA4OSwgZmFsc2UsIE5VTEwgfSwgLyogc2lmbSAqLwotCXsgMHgwMDYyLCBmYWxzZSwgTlVMTCB9LCAvKiBzdXJmMmQgKi8KLQl7IDB4MDA0MywgZmFsc2UsIE5VTEwgfSwgLyogcm9wICovCi0JeyAweDAwMTIsIGZhbHNlLCBOVUxMIH0sIC8qIGJldGExICovCi0JeyAweDAwNzIsIGZhbHNlLCBOVUxMIH0sIC8qIGJldGE0ICovCi0JeyAweDAwMTksIGZhbHNlLCBOVUxMIH0sIC8qIGNsaXByZWN0ICovCi0JeyAweDAwNDQsIGZhbHNlLCBOVUxMIH0sIC8qIHBhdHRlcm4gKi8KLQl7IDB4MDA5ZSwgZmFsc2UsIE5VTEwgfSwgLyogc3d6c3VyZiAqLwotCXsgMHgwMDk2LCBmYWxzZSwgTlVMTCB9LCAvKiBjZWxjaXVzICovCi0JeyAweDAwOTcsIGZhbHNlLCBOVUxMIH0sIC8qIGtlbHZpbiAobnYyMCkgKi8KLQl7IDB4MDU5NywgZmFsc2UsIE5VTEwgfSwgLyoga2VsdmluIChudjI1KSAqLwotCXt9Ci19Oworc3RhdGljIGludAorbnYyMF9ncmFwaF9yZWdpc3RlcihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAKLXN0cnVjdCBub3V2ZWF1X3BncmFwaF9vYmplY3RfY2xhc3MgbnYzMF9ncmFwaF9ncmNsYXNzW10gPSB7Ci0JeyAweDAwMzAsIGZhbHNlLCBOVUxMIH0sIC8qIG51bGwgKi8KLQl7IDB4MDAzOSwgZmFsc2UsIE5VTEwgfSwgLyogbTJtZiAqLwotCXsgMHgwMDRhLCBmYWxzZSwgTlVMTCB9LCAvKiBnZGlyZWN0ICovCi0JeyAweDAwOWYsIGZhbHNlLCBOVUxMIH0sIC8qIGltYWdlYmxpdCAobnYxMikgKi8KLQl7IDB4MDA4YSwgZmFsc2UsIE5VTEwgfSwgLyogaWZjICovCi0JeyAweDAzOGEsIGZhbHNlLCBOVUxMIH0sIC8qIGlmYyAobnYzMCkgKi8KLQl7IDB4MDA4OSwgZmFsc2UsIE5VTEwgfSwgLyogc2lmbSAqLwotCXsgMHgwMzg5LCBmYWxzZSwgTlVMTCB9LCAvKiBzaWZtIChudjMwKSAqLwotCXsgMHgwMDYyLCBmYWxzZSwgTlVMTCB9LCAvKiBzdXJmMmQgKi8KLQl7IDB4MDM2MiwgZmFsc2UsIE5VTEwgfSwgLyogc3VyZjJkIChudjMwKSAqLwotCXsgMHgwMDQzLCBmYWxzZSwgTlVMTCB9LCAvKiByb3AgKi8KLQl7IDB4MDAxMiwgZmFsc2UsIE5VTEwgfSwgLyogYmV0YTEgKi8KLQl7IDB4MDA3MiwgZmFsc2UsIE5VTEwgfSwgLyogYmV0YTQgKi8KLQl7IDB4MDAxOSwgZmFsc2UsIE5VTEwgfSwgLyogY2xpcHJlY3QgKi8KLQl7IDB4MDA0NCwgZmFsc2UsIE5VTEwgfSwgLyogcGF0dGVybiAqLwotCXsgMHgwMzllLCBmYWxzZSwgTlVMTCB9LCAvKiBzd3pzdXJmICovCi0JeyAweDAzOTcsIGZhbHNlLCBOVUxMIH0sIC8qIHJhbmtpbmUgKG52MzApICovCi0JeyAweDA0OTcsIGZhbHNlLCBOVUxMIH0sIC8qIHJhbmtpbmUgKG52MzUpICovCi0JeyAweDA2OTcsIGZhbHNlLCBOVUxMIH0sIC8qIHJhbmtpbmUgKG52MzQpICovCi0Je30KLX07CisJaWYgKGRldl9wcml2LT5lbmdpbmUuZ3JhcGgucmVnaXN0ZXJlZCkKKwkJcmV0dXJuIDA7CiAKKwlOVk9CSl9DTEFTUyhkZXYsIDB4NTA2ZSwgU1cpOyAvKiBudnN3ICovCisJTlZPQkpfQ0xBU1MoZGV2LCAweDAwMzAsIEdSKTsgLyogbnVsbCAqLworCU5WT0JKX0NMQVNTKGRldiwgMHgwMDM5LCBHUik7IC8qIG0ybWYgKi8KKwlOVk9CSl9DTEFTUyhkZXYsIDB4MDA0YSwgR1IpOyAvKiBnZGlyZWN0ICovCisJTlZPQkpfQ0xBU1MoZGV2LCAweDAwOWYsIEdSKTsgLyogaW1hZ2VibGl0IChudjEyKSAqLworCU5WT0JKX0NMQVNTKGRldiwgMHgwMDhhLCBHUik7IC8qIGlmYyAqLworCU5WT0JKX0NMQVNTKGRldiwgMHgwMDg5LCBHUik7IC8qIHNpZm0gKi8KKwlOVk9CSl9DTEFTUyhkZXYsIDB4MDA2MiwgR1IpOyAvKiBzdXJmMmQgKi8KKwlOVk9CSl9DTEFTUyhkZXYsIDB4MDA0MywgR1IpOyAvKiByb3AgKi8KKwlOVk9CSl9DTEFTUyhkZXYsIDB4MDAxMiwgR1IpOyAvKiBiZXRhMSAqLworCU5WT0JKX0NMQVNTKGRldiwgMHgwMDcyLCBHUik7IC8qIGJldGE0ICovCisJTlZPQkpfQ0xBU1MoZGV2LCAweDAwMTksIEdSKTsgLyogY2xpcHJlY3QgKi8KKwlOVk9CSl9DTEFTUyhkZXYsIDB4MDA0NCwgR1IpOyAvKiBwYXR0ZXJuICovCisJTlZPQkpfQ0xBU1MoZGV2LCAweDAwOWUsIEdSKTsgLyogc3d6c3VyZiAqLworCU5WT0JKX0NMQVNTKGRldiwgMHgwMDk2LCBHUik7IC8qIGNlbGNpdXMgKi8KKworCS8qIGtlbHZpbiAqLworCWlmIChkZXZfcHJpdi0+Y2hpcHNldCA8IDB4MjUpCisJCU5WT0JKX0NMQVNTKGRldiwgMHgwMDk3LCBHUik7CisJZWxzZQorCQlOVk9CSl9DTEFTUyhkZXYsIDB4MDU5NywgR1IpOworCisJLyogbnZzdyAqLworCU5WT0JKX0NMQVNTKGRldiwgMHg1MDZlLCBTVyk7CisJTlZPQkpfTVRIRCAoZGV2LCAweDUwNmUsIDB4MDUwMCwgbnYwNF9ncmFwaF9tdGhkX3BhZ2VfZmxpcCk7CisKKwlkZXZfcHJpdi0+ZW5naW5lLmdyYXBoLnJlZ2lzdGVyZWQgPSB0cnVlOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitudjMwX2dyYXBoX3JlZ2lzdGVyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKworCWlmIChkZXZfcHJpdi0+ZW5naW5lLmdyYXBoLnJlZ2lzdGVyZWQpCisJCXJldHVybiAwOworCisJTlZPQkpfQ0xBU1MoZGV2LCAweDUwNmUsIFNXKTsgLyogbnZzdyAqLworCU5WT0JKX0NMQVNTKGRldiwgMHgwMDMwLCBHUik7IC8qIG51bGwgKi8KKwlOVk9CSl9DTEFTUyhkZXYsIDB4MDAzOSwgR1IpOyAvKiBtMm1mICovCisJTlZPQkpfQ0xBU1MoZGV2LCAweDAwNGEsIEdSKTsgLyogZ2RpcmVjdCAqLworCU5WT0JKX0NMQVNTKGRldiwgMHgwMDlmLCBHUik7IC8qIGltYWdlYmxpdCAobnYxMikgKi8KKwlOVk9CSl9DTEFTUyhkZXYsIDB4MDA4YSwgR1IpOyAvKiBpZmMgKi8KKwlOVk9CSl9DTEFTUyhkZXYsIDB4MDM4YSwgR1IpOyAvKiBpZmMgKG52MzApICovCisJTlZPQkpfQ0xBU1MoZGV2LCAweDAwODksIEdSKTsgLyogc2lmbSAqLworCU5WT0JKX0NMQVNTKGRldiwgMHgwMzg5LCBHUik7IC8qIHNpZm0gKG52MzApICovCisJTlZPQkpfQ0xBU1MoZGV2LCAweDAwNjIsIEdSKTsgLyogc3VyZjJkICovCisJTlZPQkpfQ0xBU1MoZGV2LCAweDAzNjIsIEdSKTsgLyogc3VyZjJkIChudjMwKSAqLworCU5WT0JKX0NMQVNTKGRldiwgMHgwMDQzLCBHUik7IC8qIHJvcCAqLworCU5WT0JKX0NMQVNTKGRldiwgMHgwMDEyLCBHUik7IC8qIGJldGExICovCisJTlZPQkpfQ0xBU1MoZGV2LCAweDAwNzIsIEdSKTsgLyogYmV0YTQgKi8KKwlOVk9CSl9DTEFTUyhkZXYsIDB4MDAxOSwgR1IpOyAvKiBjbGlwcmVjdCAqLworCU5WT0JKX0NMQVNTKGRldiwgMHgwMDQ0LCBHUik7IC8qIHBhdHRlcm4gKi8KKwlOVk9CSl9DTEFTUyhkZXYsIDB4MDM5ZSwgR1IpOyAvKiBzd3pzdXJmICovCisKKwkvKiByYW5raW5lICovCisJaWYgKDB4MDAwMDAwMDMgJiAoMSA8PCAoZGV2X3ByaXYtPmNoaXBzZXQgJiAweDBmKSkpCisJCU5WT0JKX0NMQVNTKGRldiwgMHgwMzk3LCBHUik7CisJZWxzZQorCWlmICgweDAwMDAwMDEwICYgKDEgPDwgKGRldl9wcml2LT5jaGlwc2V0ICYgMHgwZikpKQorCQlOVk9CSl9DTEFTUyhkZXYsIDB4MDY5NywgR1IpOworCWVsc2UKKwlpZiAoMHgwMDAwMDFlMCAmICgxIDw8IChkZXZfcHJpdi0+Y2hpcHNldCAmIDB4MGYpKSkKKwkJTlZPQkpfQ0xBU1MoZGV2LCAweDA0OTcsIEdSKTsKKworCS8qIG52c3cgKi8KKwlOVk9CSl9DTEFTUyhkZXYsIDB4NTA2ZSwgU1cpOworCU5WT0JKX01USEQgKGRldiwgMHg1MDZlLCAweDA1MDAsIG52MDRfZ3JhcGhfbXRoZF9wYWdlX2ZsaXApOworCisJZGV2X3ByaXYtPmVuZ2luZS5ncmFwaC5yZWdpc3RlcmVkID0gdHJ1ZTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQKK252MjBfZ3JhcGhfaXNyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJdTMyIHN0YXQ7CisKKwl3aGlsZSAoKHN0YXQgPSBudl9yZDMyKGRldiwgTlYwM19QR1JBUEhfSU5UUikpKSB7CisJCXUzMiBuc291cmNlID0gbnZfcmQzMihkZXYsIE5WMDNfUEdSQVBIX05TT1VSQ0UpOworCQl1MzIgbnN0YXR1cyA9IG52X3JkMzIoZGV2LCBOVjAzX1BHUkFQSF9OU1RBVFVTKTsKKwkJdTMyIGFkZHIgPSBudl9yZDMyKGRldiwgTlYwNF9QR1JBUEhfVFJBUFBFRF9BRERSKTsKKwkJdTMyIGNoaWQgPSAoYWRkciAmIDB4MDFmMDAwMDApID4+IDIwOworCQl1MzIgc3ViYyA9IChhZGRyICYgMHgwMDA3MDAwMCkgPj4gMTY7CisJCXUzMiBtdGhkID0gKGFkZHIgJiAweDAwMDAxZmZjKTsKKwkJdTMyIGRhdGEgPSBudl9yZDMyKGRldiwgTlYwNF9QR1JBUEhfVFJBUFBFRF9EQVRBKTsKKwkJdTMyIGNsYXNzID0gbnZfcmQzMihkZXYsIDB4NDAwMTYwICsgc3ViYyAqIDQpICYgMHhmZmY7CisJCXUzMiBzaG93ID0gc3RhdDsKKworCQlpZiAoc3RhdCAmIE5WX1BHUkFQSF9JTlRSX0VSUk9SKSB7CisJCQlpZiAobnNvdXJjZSAmIE5WMDNfUEdSQVBIX05TT1VSQ0VfSUxMRUdBTF9NVEhEKSB7CisJCQkJaWYgKCFub3V2ZWF1X2dwdW9ial9tdGhkX2NhbGwyKGRldiwgY2hpZCwgY2xhc3MsIG10aGQsIGRhdGEpKQorCQkJCQlzaG93ICY9IH5OVl9QR1JBUEhfSU5UUl9FUlJPUjsKKwkJCX0KKwkJfQorCisJCW52X3dyMzIoZGV2LCBOVjAzX1BHUkFQSF9JTlRSLCBzdGF0KTsKKwkJbnZfd3IzMihkZXYsIE5WMDRfUEdSQVBIX0ZJRk8sIDB4MDAwMDAwMDEpOworCisJCWlmIChzaG93ICYmIG5vdXZlYXVfcmF0ZWxpbWl0KCkpIHsKKwkJCU5WX0lORk8oZGV2LCAiUEdSQVBIIC0iKTsKKwkJCW5vdXZlYXVfYml0ZmllbGRfcHJpbnQobnYxMF9ncmFwaF9pbnRyLCBzaG93KTsKKwkJCXByaW50aygiIG5zb3VyY2U6Iik7CisJCQlub3V2ZWF1X2JpdGZpZWxkX3ByaW50KG52MDRfZ3JhcGhfbnNvdXJjZSwgbnNvdXJjZSk7CisJCQlwcmludGsoIiBuc3RhdHVzOiIpOworCQkJbm91dmVhdV9iaXRmaWVsZF9wcmludChudjEwX2dyYXBoX25zdGF0dXMsIG5zdGF0dXMpOworCQkJcHJpbnRrKCJcbiIpOworCQkJTlZfSU5GTyhkZXYsICJQR1JBUEggLSBjaCAlZC8lZCBjbGFzcyAweCUwNHggIgorCQkJCSAgICAgIm10aGQgMHglMDR4IGRhdGEgMHglMDh4XG4iLAorCQkJCWNoaWQsIHN1YmMsIGNsYXNzLCBtdGhkLCBkYXRhKTsKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252MzBfZmIuYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252MzBfZmIuYwppbmRleCA0YTNmMmYwLi5lMDEzNWYwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjMwX2ZiLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnYzMF9mYi5jCkBAIC0yOSw2ICsyOSwyNyBAQAogI2luY2x1ZGUgIm5vdXZlYXVfZHJ2LmgiCiAjaW5jbHVkZSAibm91dmVhdV9kcm0uaCIKIAordm9pZAorbnYzMF9mYl9pbml0X3RpbGVfcmVnaW9uKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBpLCB1aW50MzJfdCBhZGRyLAorCQkJIHVpbnQzMl90IHNpemUsIHVpbnQzMl90IHBpdGNoLCB1aW50MzJfdCBmbGFncykKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBub3V2ZWF1X3RpbGVfcmVnICp0aWxlID0gJmRldl9wcml2LT50aWxlLnJlZ1tpXTsKKworCXRpbGUtPmFkZHIgPSBhZGRyIHwgMTsKKwl0aWxlLT5saW1pdCA9IG1heCgxdSwgYWRkciArIHNpemUpIC0gMTsKKwl0aWxlLT5waXRjaCA9IHBpdGNoOworfQorCit2b2lkCitudjMwX2ZiX2ZyZWVfdGlsZV9yZWdpb24oc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGkpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3Qgbm91dmVhdV90aWxlX3JlZyAqdGlsZSA9ICZkZXZfcHJpdi0+dGlsZS5yZWdbaV07CisKKwl0aWxlLT5hZGRyID0gdGlsZS0+bGltaXQgPSB0aWxlLT5waXRjaCA9IDA7Cit9CisKIHN0YXRpYyBpbnQKIGNhbGNfYmlhcyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgaywgaW50IGksIGludCBqKQogewpAQCAtNjUsNyArODYsNyBAQAogCiAJLyogVHVybiBhbGwgdGhlIHRpbGluZyByZWdpb25zIG9mZi4gKi8KIAlmb3IgKGkgPSAwOyBpIDwgcGZiLT5udW1fdGlsZXM7IGkrKykKLQkJcGZiLT5zZXRfcmVnaW9uX3RpbGluZyhkZXYsIGksIDAsIDAsIDApOworCQlwZmItPnNldF90aWxlX3JlZ2lvbihkZXYsIGkpOwogCiAJLyogSW5pdCB0aGUgbWVtb3J5IHRpbWluZyByZWdzIGF0IDB4MTAwMzdjLzB4MTAwM2FjICovCiAJaWYgKGRldl9wcml2LT5jaGlwc2V0ID09IDB4MzAgfHwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252NDBfZmIuYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252NDBfZmIuYwppbmRleCAzY2QwN2Q4Li5mM2Q5YzA1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjQwX2ZiLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnY0MF9mYi5jCkBAIC00LDI2ICs0LDIyIEBACiAjaW5jbHVkZSAibm91dmVhdV9kcm0uaCIKIAogdm9pZAotbnY0MF9mYl9zZXRfcmVnaW9uX3RpbGluZyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgaSwgdWludDMyX3QgYWRkciwKLQkJCSAgdWludDMyX3Qgc2l6ZSwgdWludDMyX3QgcGl0Y2gpCitudjQwX2ZiX3NldF90aWxlX3JlZ2lvbihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgaSkKIHsKIAlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCXVpbnQzMl90IGxpbWl0ID0gbWF4KDF1LCBhZGRyICsgc2l6ZSkgLSAxOwotCi0JaWYgKHBpdGNoKQotCQlhZGRyIHw9IDE7CisJc3RydWN0IG5vdXZlYXVfdGlsZV9yZWcgKnRpbGUgPSAmZGV2X3ByaXYtPnRpbGUucmVnW2ldOwogCiAJc3dpdGNoIChkZXZfcHJpdi0+Y2hpcHNldCkgewogCWNhc2UgMHg0MDoKLQkJbnZfd3IzMihkZXYsIE5WMTBfUEZCX1RMSU1JVChpKSwgbGltaXQpOwotCQludl93cjMyKGRldiwgTlYxMF9QRkJfVFNJWkUoaSksIHBpdGNoKTsKLQkJbnZfd3IzMihkZXYsIE5WMTBfUEZCX1RJTEUoaSksIGFkZHIpOworCQludl93cjMyKGRldiwgTlYxMF9QRkJfVExJTUlUKGkpLCB0aWxlLT5saW1pdCk7CisJCW52X3dyMzIoZGV2LCBOVjEwX1BGQl9UU0laRShpKSwgdGlsZS0+cGl0Y2gpOworCQludl93cjMyKGRldiwgTlYxMF9QRkJfVElMRShpKSwgdGlsZS0+YWRkcik7CiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKLQkJbnZfd3IzMihkZXYsIE5WNDBfUEZCX1RMSU1JVChpKSwgbGltaXQpOwotCQludl93cjMyKGRldiwgTlY0MF9QRkJfVFNJWkUoaSksIHBpdGNoKTsKLQkJbnZfd3IzMihkZXYsIE5WNDBfUEZCX1RJTEUoaSksIGFkZHIpOworCQludl93cjMyKGRldiwgTlY0MF9QRkJfVExJTUlUKGkpLCB0aWxlLT5saW1pdCk7CisJCW52X3dyMzIoZGV2LCBOVjQwX1BGQl9UU0laRShpKSwgdGlsZS0+cGl0Y2gpOworCQludl93cjMyKGRldiwgTlY0MF9QRkJfVElMRShpKSwgdGlsZS0+YWRkcik7CiAJCWJyZWFrOwogCX0KIH0KQEAgLTY0LDcgKzYwLDcgQEAKIAogCS8qIFR1cm4gYWxsIHRoZSB0aWxpbmcgcmVnaW9ucyBvZmYuICovCiAJZm9yIChpID0gMDsgaSA8IHBmYi0+bnVtX3RpbGVzOyBpKyspCi0JCXBmYi0+c2V0X3JlZ2lvbl90aWxpbmcoZGV2LCBpLCAwLCAwLCAwKTsKKwkJcGZiLT5zZXRfdGlsZV9yZWdpb24oZGV2LCBpKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnY0MF9maWZvLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjQwX2ZpZm8uYwppbmRleCBkMzM3YjhiLi40OWI5YTM1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjQwX2ZpZm8uYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjQwX2ZpZm8uYwpAQCAtNDcsNiArNDcsMTEgQEAKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCisJY2hhbi0+dXNlciA9IGlvcmVtYXAocGNpX3Jlc291cmNlX3N0YXJ0KGRldi0+cGRldiwgMCkgKworCQkJICAgICBOVjQwX1VTRVIoY2hhbi0+aWQpLCBQQUdFX1NJWkUpOworCWlmICghY2hhbi0+dXNlcikKKwkJcmV0dXJuIC1FTk9NRU07CisKIAlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2X3ByaXYtPmNvbnRleHRfc3dpdGNoX2xvY2ssIGZsYWdzKTsKIAogCW52X3dpMzIoZGV2LCBmYyArICAwLCBjaGFuLT5wdXNoYnVmX2Jhc2UpOwpAQCAtNTksNyArNjQsNiBAQAogCQkJICAgICAgTlZfUEZJRk9fQ0FDSEUxX0JJR19FTkRJQU4gfAogI2VuZGlmCiAJCQkgICAgICAweDMwMDAwMDAwIC8qIG5vIGlkZWEuLiAqLyk7Ci0JbnZfd2kzMihkZXYsIGZjICsgNTYsIGNoYW4tPnJhbWluX2dyY3R4LT5waW5zdCA+PiA0KTsKIAludl93aTMyKGRldiwgZmMgKyA2MCwgMHgwMDAxRkZGRik7CiAKIAkvKiBlbmFibGUgdGhlIGZpZm8gZG1hIG9wZXJhdGlvbiAqLwpAQCAtNzAsMTcgKzc0LDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotdm9pZAotbnY0MF9maWZvX2Rlc3Ryb3lfY29udGV4dChzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuKQotewotCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjaGFuLT5kZXY7Ci0KLQludl93cjMyKGRldiwgTlYwNF9QRklGT19NT0RFLAotCQludl9yZDMyKGRldiwgTlYwNF9QRklGT19NT0RFKSAmIH4oMSA8PCBjaGFuLT5pZCkpOwotCi0Jbm91dmVhdV9ncHVvYmpfcmVmKE5VTEwsICZjaGFuLT5yYW1mYyk7Ci19Ci0KIHN0YXRpYyB2b2lkCiBudjQwX2ZpZm9fZG9fbG9hZF9jb250ZXh0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBjaGlkKQogewpAQCAtMjc5LDYgKzI3Miw3IEBACiBzdGF0aWMgdm9pZAogbnY0MF9maWZvX2luaXRfaW50cihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogeworCW5vdXZlYXVfaXJxX3JlZ2lzdGVyKGRldiwgOCwgbnYwNF9maWZvX2lzcik7CiAJbnZfd3IzMihkZXYsIDB4MDAyMTAwLCAweGZmZmZmZmZmKTsKIAludl93cjMyKGRldiwgMHgwMDIxNDAsIDB4ZmZmZmZmZmYpOwogfQpAQCAtMzAxLDcgKzI5NSw3IEBACiAJcGZpZm8tPnJlYXNzaWduKGRldiwgdHJ1ZSk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgZGV2X3ByaXYtPmVuZ2luZS5maWZvLmNoYW5uZWxzOyBpKyspIHsKLQkJaWYgKGRldl9wcml2LT5maWZvc1tpXSkgeworCQlpZiAoZGV2X3ByaXYtPmNoYW5uZWxzLnB0cltpXSkgewogCQkJdWludDMyX3QgbW9kZSA9IG52X3JkMzIoZGV2LCBOVjA0X1BGSUZPX01PREUpOwogCQkJbnZfd3IzMihkZXYsIE5WMDRfUEZJRk9fTU9ERSwgbW9kZSB8ICgxIDw8IGkpKTsKIAkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnY0MF9ncmFwaC5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnY0MF9ncmFwaC5jCmluZGV4IDdlZTFiOTEuLjE5ZWY5MmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252NDBfZ3JhcGguYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjQwX2dyYXBoLmMKQEAgLTI5LDYgKzI5LDkgQEAKICNpbmNsdWRlICJub3V2ZWF1X2Rydi5oIgogI2luY2x1ZGUgIm5vdXZlYXVfZ3JjdHguaCIKIAorc3RhdGljIGludCBudjQwX2dyYXBoX3JlZ2lzdGVyKHN0cnVjdCBkcm1fZGV2aWNlICopOworc3RhdGljIHZvaWQgbnY0MF9ncmFwaF9pc3Ioc3RydWN0IGRybV9kZXZpY2UgKik7CisKIHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKgogbnY0MF9ncmFwaF9jaGFubmVsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7CkBAIC00Miw3ICs0NSw3IEBACiAJaW5zdCA9IChpbnN0ICYgTlY0MF9QR1JBUEhfQ1RYQ1RMX0NVUl9JTlNUQU5DRSkgPDwgNDsKIAogCWZvciAoaSA9IDA7IGkgPCBkZXZfcHJpdi0+ZW5naW5lLmZpZm8uY2hhbm5lbHM7IGkrKykgewotCQlzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuID0gZGV2X3ByaXYtPmZpZm9zW2ldOworCQlzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuID0gZGV2X3ByaXYtPmNoYW5uZWxzLnB0cltpXTsKIAogCQlpZiAoY2hhbiAmJiBjaGFuLT5yYW1pbl9ncmN0eCAmJgogCQkgICAgY2hhbi0+cmFtaW5fZ3JjdHgtPnBpbnN0ID09IGluc3QpCkBAIC01OSw2ICs2Miw3IEBACiAJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlzdHJ1Y3Qgbm91dmVhdV9wZ3JhcGhfZW5naW5lICpwZ3JhcGggPSAmZGV2X3ByaXYtPmVuZ2luZS5ncmFwaDsKIAlzdHJ1Y3Qgbm91dmVhdV9ncmN0eCBjdHggPSB7fTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCByZXQ7CiAKIAlyZXQgPSBub3V2ZWF1X2dwdW9ial9uZXcoZGV2LCBjaGFuLCBwZ3JhcGgtPmdyY3R4X3NpemUsIDE2LApAQCAtNzMsMTIgKzc3LDM5IEBACiAJbnY0MF9ncmN0eF9pbml0KCZjdHgpOwogCiAJbnZfd28zMihjaGFuLT5yYW1pbl9ncmN0eCwgMCwgY2hhbi0+cmFtaW5fZ3JjdHgtPnBpbnN0KTsKKworCS8qIGluaXQgZ3JjdHggcG9pbnRlciBpbiByYW1mYywgYW5kIG9uIFBGSUZPIGlmIGNoYW5uZWwgaXMKKwkgKiBhbHJlYWR5IGFjdGl2ZSB0aGVyZQorCSAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZfcHJpdi0+Y29udGV4dF9zd2l0Y2hfbG9jaywgZmxhZ3MpOworCW52X3dvMzIoY2hhbi0+cmFtZmMsIDB4MzgsIGNoYW4tPnJhbWluX2dyY3R4LT5waW5zdCA+PiA0KTsKKwludl9tYXNrKGRldiwgMHgwMDI1MDAsIDB4MDAwMDAwMDEsIDB4MDAwMDAwMDApOworCWlmICgobnZfcmQzMihkZXYsIDB4MDAzMjA0KSAmIDB4MDAwMDAwMWYpID09IGNoYW4tPmlkKQorCQludl93cjMyKGRldiwgMHgwMDMyZTAsIGNoYW4tPnJhbWluX2dyY3R4LT5waW5zdCA+PiA0KTsKKwludl9tYXNrKGRldiwgMHgwMDI1MDAsIDB4MDAwMDAwMDEsIDB4MDAwMDAwMDEpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldl9wcml2LT5jb250ZXh0X3N3aXRjaF9sb2NrLCBmbGFncyk7CiAJcmV0dXJuIDA7CiB9CiAKIHZvaWQKIG52NDBfZ3JhcGhfZGVzdHJveV9jb250ZXh0KHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4pCiB7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNoYW4tPmRldjsKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBub3V2ZWF1X3BncmFwaF9lbmdpbmUgKnBncmFwaCA9ICZkZXZfcHJpdi0+ZW5naW5lLmdyYXBoOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2X3ByaXYtPmNvbnRleHRfc3dpdGNoX2xvY2ssIGZsYWdzKTsKKwlwZ3JhcGgtPmZpZm9fYWNjZXNzKGRldiwgZmFsc2UpOworCisJLyogVW5sb2FkIHRoZSBjb250ZXh0IGlmIGl0J3MgdGhlIGN1cnJlbnRseSBhY3RpdmUgb25lICovCisJaWYgKHBncmFwaC0+Y2hhbm5lbChkZXYpID09IGNoYW4pCisJCXBncmFwaC0+dW5sb2FkX2NvbnRleHQoZGV2KTsKKworCXBncmFwaC0+Zmlmb19hY2Nlc3MoZGV2LCB0cnVlKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZfcHJpdi0+Y29udGV4dF9zd2l0Y2hfbG9jaywgZmxhZ3MpOworCisJLyogRnJlZSB0aGUgY29udGV4dCByZXNvdXJjZXMgKi8KIAlub3V2ZWF1X2dwdW9ial9yZWYoTlVMTCwgJmNoYW4tPnJhbWluX2dyY3R4KTsKIH0KIApAQCAtMTc0LDQzICsyMDUsMzkgQEAKIH0KIAogdm9pZAotbnY0MF9ncmFwaF9zZXRfcmVnaW9uX3RpbGluZyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgaSwgdWludDMyX3QgYWRkciwKLQkJCSAgICAgdWludDMyX3Qgc2l6ZSwgdWludDMyX3QgcGl0Y2gpCitudjQwX2dyYXBoX3NldF90aWxlX3JlZ2lvbihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgaSkKIHsKIAlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCXVpbnQzMl90IGxpbWl0ID0gbWF4KDF1LCBhZGRyICsgc2l6ZSkgLSAxOwotCi0JaWYgKHBpdGNoKQotCQlhZGRyIHw9IDE7CisJc3RydWN0IG5vdXZlYXVfdGlsZV9yZWcgKnRpbGUgPSAmZGV2X3ByaXYtPnRpbGUucmVnW2ldOwogCiAJc3dpdGNoIChkZXZfcHJpdi0+Y2hpcHNldCkgewogCWNhc2UgMHg0NDoKIAljYXNlIDB4NGE6CiAJY2FzZSAweDRlOgotCQludl93cjMyKGRldiwgTlYyMF9QR1JBUEhfVFNJWkUoaSksIHBpdGNoKTsKLQkJbnZfd3IzMihkZXYsIE5WMjBfUEdSQVBIX1RMSU1JVChpKSwgbGltaXQpOwotCQludl93cjMyKGRldiwgTlYyMF9QR1JBUEhfVElMRShpKSwgYWRkcik7CisJCW52X3dyMzIoZGV2LCBOVjIwX1BHUkFQSF9UU0laRShpKSwgdGlsZS0+cGl0Y2gpOworCQludl93cjMyKGRldiwgTlYyMF9QR1JBUEhfVExJTUlUKGkpLCB0aWxlLT5saW1pdCk7CisJCW52X3dyMzIoZGV2LCBOVjIwX1BHUkFQSF9USUxFKGkpLCB0aWxlLT5hZGRyKTsKIAkJYnJlYWs7CiAKIAljYXNlIDB4NDY6CiAJY2FzZSAweDQ3OgogCWNhc2UgMHg0OToKIAljYXNlIDB4NGI6Ci0JCW52X3dyMzIoZGV2LCBOVjQ3X1BHUkFQSF9UU0laRShpKSwgcGl0Y2gpOwotCQludl93cjMyKGRldiwgTlY0N19QR1JBUEhfVExJTUlUKGkpLCBsaW1pdCk7Ci0JCW52X3dyMzIoZGV2LCBOVjQ3X1BHUkFQSF9USUxFKGkpLCBhZGRyKTsKLQkJbnZfd3IzMihkZXYsIE5WNDBfUEdSQVBIX1RTSVpFMShpKSwgcGl0Y2gpOwotCQludl93cjMyKGRldiwgTlY0MF9QR1JBUEhfVExJTUlUMShpKSwgbGltaXQpOwotCQludl93cjMyKGRldiwgTlY0MF9QR1JBUEhfVElMRTEoaSksIGFkZHIpOworCQludl93cjMyKGRldiwgTlY0N19QR1JBUEhfVFNJWkUoaSksIHRpbGUtPnBpdGNoKTsKKwkJbnZfd3IzMihkZXYsIE5WNDdfUEdSQVBIX1RMSU1JVChpKSwgdGlsZS0+bGltaXQpOworCQludl93cjMyKGRldiwgTlY0N19QR1JBUEhfVElMRShpKSwgdGlsZS0+YWRkcik7CisJCW52X3dyMzIoZGV2LCBOVjQwX1BHUkFQSF9UU0laRTEoaSksIHRpbGUtPnBpdGNoKTsKKwkJbnZfd3IzMihkZXYsIE5WNDBfUEdSQVBIX1RMSU1JVDEoaSksIHRpbGUtPmxpbWl0KTsKKwkJbnZfd3IzMihkZXYsIE5WNDBfUEdSQVBIX1RJTEUxKGkpLCB0aWxlLT5hZGRyKTsKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgotCQludl93cjMyKGRldiwgTlYyMF9QR1JBUEhfVFNJWkUoaSksIHBpdGNoKTsKLQkJbnZfd3IzMihkZXYsIE5WMjBfUEdSQVBIX1RMSU1JVChpKSwgbGltaXQpOwotCQludl93cjMyKGRldiwgTlYyMF9QR1JBUEhfVElMRShpKSwgYWRkcik7Ci0JCW52X3dyMzIoZGV2LCBOVjQwX1BHUkFQSF9UU0laRTEoaSksIHBpdGNoKTsKLQkJbnZfd3IzMihkZXYsIE5WNDBfUEdSQVBIX1RMSU1JVDEoaSksIGxpbWl0KTsKLQkJbnZfd3IzMihkZXYsIE5WNDBfUEdSQVBIX1RJTEUxKGkpLCBhZGRyKTsKKwkJbnZfd3IzMihkZXYsIE5WMjBfUEdSQVBIX1RTSVpFKGkpLCB0aWxlLT5waXRjaCk7CisJCW52X3dyMzIoZGV2LCBOVjIwX1BHUkFQSF9UTElNSVQoaSksIHRpbGUtPmxpbWl0KTsKKwkJbnZfd3IzMihkZXYsIE5WMjBfUEdSQVBIX1RJTEUoaSksIHRpbGUtPmFkZHIpOworCQludl93cjMyKGRldiwgTlY0MF9QR1JBUEhfVFNJWkUxKGkpLCB0aWxlLT5waXRjaCk7CisJCW52X3dyMzIoZGV2LCBOVjQwX1BHUkFQSF9UTElNSVQxKGkpLCB0aWxlLT5saW1pdCk7CisJCW52X3dyMzIoZGV2LCBOVjQwX1BHUkFQSF9USUxFMShpKSwgdGlsZS0+YWRkcik7CiAJCWJyZWFrOwogCX0KIH0KQEAgLTIzMiw3ICsyNTksNyBAQAogCXN0cnVjdCBub3V2ZWF1X2ZiX2VuZ2luZSAqcGZiID0gJmRldl9wcml2LT5lbmdpbmUuZmI7CiAJc3RydWN0IG5vdXZlYXVfZ3JjdHggY3R4ID0ge307CiAJdWludDMyX3QgdnJhbXN6LCAqY3A7Ci0JaW50IGksIGo7CisJaW50IHJldCwgaSwgajsKIAogCW52X3dyMzIoZGV2LCBOVjAzX1BNQ19FTkFCTEUsIG52X3JkMzIoZGV2LCBOVjAzX1BNQ19FTkFCTEUpICYKIAkJCX5OVl9QTUNfRU5BQkxFX1BHUkFQSCk7CkBAIC0yNTYsOSArMjgzLDE0IEBACiAKIAlrZnJlZShjcCk7CiAKKwlyZXQgPSBudjQwX2dyYXBoX3JlZ2lzdGVyKGRldik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwogCS8qIE5vIGNvbnRleHQgcHJlc2VudCBjdXJyZW50bHkgKi8KIAludl93cjMyKGRldiwgTlY0MF9QR1JBUEhfQ1RYQ1RMX0NVUiwgMHgwMDAwMDAwMCk7CiAKKwlub3V2ZWF1X2lycV9yZWdpc3RlcihkZXYsIDEyLCBudjQwX2dyYXBoX2lzcik7CiAJbnZfd3IzMihkZXYsIE5WMDNfUEdSQVBIX0lOVFIgICAsIDB4RkZGRkZGRkYpOwogCW52X3dyMzIoZGV2LCBOVjQwX1BHUkFQSF9JTlRSX0VOLCAweEZGRkZGRkZGKTsKIApAQCAtMzQ3LDcgKzM3OSw3IEBACiAKIAkvKiBUdXJuIGFsbCB0aGUgdGlsaW5nIHJlZ2lvbnMgb2ZmLiAqLwogCWZvciAoaSA9IDA7IGkgPCBwZmItPm51bV90aWxlczsgaSsrKQotCQludjQwX2dyYXBoX3NldF9yZWdpb25fdGlsaW5nKGRldiwgaSwgMCwgMCwgMCk7CisJCW52NDBfZ3JhcGhfc2V0X3RpbGVfcmVnaW9uKGRldiwgaSk7CiAKIAkvKiBiZWdpbiBSQU0gY29uZmlnICovCiAJdnJhbXN6ID0gcGNpX3Jlc291cmNlX2xlbihkZXYtPnBkZXYsIDApIC0gMTsKQEAgLTM5MCwyNiArNDIyLDExMSBAQAogCiB2b2lkIG52NDBfZ3JhcGhfdGFrZWRvd24oc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKKwlub3V2ZWF1X2lycV91bnJlZ2lzdGVyKGRldiwgMTIpOwogfQogCi1zdHJ1Y3Qgbm91dmVhdV9wZ3JhcGhfb2JqZWN0X2NsYXNzIG52NDBfZ3JhcGhfZ3JjbGFzc1tdID0gewotCXsgMHgwMDMwLCBmYWxzZSwgTlVMTCB9LCAvKiBudWxsICovCi0JeyAweDAwMzksIGZhbHNlLCBOVUxMIH0sIC8qIG0ybWYgKi8KLQl7IDB4MDA0YSwgZmFsc2UsIE5VTEwgfSwgLyogZ2RpcmVjdCAqLwotCXsgMHgwMDlmLCBmYWxzZSwgTlVMTCB9LCAvKiBpbWFnZWJsaXQgKG52MTIpICovCi0JeyAweDAwOGEsIGZhbHNlLCBOVUxMIH0sIC8qIGlmYyAqLwotCXsgMHgwMDg5LCBmYWxzZSwgTlVMTCB9LCAvKiBzaWZtICovCi0JeyAweDMwODksIGZhbHNlLCBOVUxMIH0sIC8qIHNpZm0gKG52NDApICovCi0JeyAweDAwNjIsIGZhbHNlLCBOVUxMIH0sIC8qIHN1cmYyZCAqLwotCXsgMHgzMDYyLCBmYWxzZSwgTlVMTCB9LCAvKiBzdXJmMmQgKG52NDApICovCi0JeyAweDAwNDMsIGZhbHNlLCBOVUxMIH0sIC8qIHJvcCAqLwotCXsgMHgwMDEyLCBmYWxzZSwgTlVMTCB9LCAvKiBiZXRhMSAqLwotCXsgMHgwMDcyLCBmYWxzZSwgTlVMTCB9LCAvKiBiZXRhNCAqLwotCXsgMHgwMDE5LCBmYWxzZSwgTlVMTCB9LCAvKiBjbGlwcmVjdCAqLwotCXsgMHgwMDQ0LCBmYWxzZSwgTlVMTCB9LCAvKiBwYXR0ZXJuICovCi0JeyAweDMwOWUsIGZhbHNlLCBOVUxMIH0sIC8qIHN3enN1cmYgKi8KLQl7IDB4NDA5NywgZmFsc2UsIE5VTEwgfSwgLyogY3VyaWUgKG52NDApICovCi0JeyAweDQ0OTcsIGZhbHNlLCBOVUxMIH0sIC8qIGN1cmllIChudjQ0KSAqLwotCXt9Ci19Oworc3RhdGljIGludAorbnY0MF9ncmFwaF9yZWdpc3RlcihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAKKwlpZiAoZGV2X3ByaXYtPmVuZ2luZS5ncmFwaC5yZWdpc3RlcmVkKQorCQlyZXR1cm4gMDsKKworCU5WT0JKX0NMQVNTKGRldiwgMHg1MDZlLCBTVyk7IC8qIG52c3cgKi8KKwlOVk9CSl9DTEFTUyhkZXYsIDB4MDAzMCwgR1IpOyAvKiBudWxsICovCisJTlZPQkpfQ0xBU1MoZGV2LCAweDAwMzksIEdSKTsgLyogbTJtZiAqLworCU5WT0JKX0NMQVNTKGRldiwgMHgwMDRhLCBHUik7IC8qIGdkaXJlY3QgKi8KKwlOVk9CSl9DTEFTUyhkZXYsIDB4MDA5ZiwgR1IpOyAvKiBpbWFnZWJsaXQgKG52MTIpICovCisJTlZPQkpfQ0xBU1MoZGV2LCAweDAwOGEsIEdSKTsgLyogaWZjICovCisJTlZPQkpfQ0xBU1MoZGV2LCAweDAwODksIEdSKTsgLyogc2lmbSAqLworCU5WT0JKX0NMQVNTKGRldiwgMHgzMDg5LCBHUik7IC8qIHNpZm0gKG52NDApICovCisJTlZPQkpfQ0xBU1MoZGV2LCAweDAwNjIsIEdSKTsgLyogc3VyZjJkICovCisJTlZPQkpfQ0xBU1MoZGV2LCAweDMwNjIsIEdSKTsgLyogc3VyZjJkIChudjQwKSAqLworCU5WT0JKX0NMQVNTKGRldiwgMHgwMDQzLCBHUik7IC8qIHJvcCAqLworCU5WT0JKX0NMQVNTKGRldiwgMHgwMDEyLCBHUik7IC8qIGJldGExICovCisJTlZPQkpfQ0xBU1MoZGV2LCAweDAwNzIsIEdSKTsgLyogYmV0YTQgKi8KKwlOVk9CSl9DTEFTUyhkZXYsIDB4MDAxOSwgR1IpOyAvKiBjbGlwcmVjdCAqLworCU5WT0JKX0NMQVNTKGRldiwgMHgwMDQ0LCBHUik7IC8qIHBhdHRlcm4gKi8KKwlOVk9CSl9DTEFTUyhkZXYsIDB4MzA5ZSwgR1IpOyAvKiBzd3pzdXJmICovCisKKwkvKiBjdXJpZSAqLworCWlmIChkZXZfcHJpdi0+Y2hpcHNldCA+PSAweDYwIHx8CisJICAgIDB4MDAwMDU0NTAgJiAoMSA8PCAoZGV2X3ByaXYtPmNoaXBzZXQgJiAweDBmKSkpCisJCU5WT0JKX0NMQVNTKGRldiwgMHg0NDk3LCBHUik7CisJZWxzZQorCQlOVk9CSl9DTEFTUyhkZXYsIDB4NDA5NywgR1IpOworCisJLyogbnZzdyAqLworCU5WT0JKX0NMQVNTKGRldiwgMHg1MDZlLCBTVyk7CisJTlZPQkpfTVRIRCAoZGV2LCAweDUwNmUsIDB4MDUwMCwgbnYwNF9ncmFwaF9tdGhkX3BhZ2VfZmxpcCk7CisKKwlkZXZfcHJpdi0+ZW5naW5lLmdyYXBoLnJlZ2lzdGVyZWQgPSB0cnVlOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitudjQwX2dyYXBoX2lzcl9jaGlkKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHUzMiBpbnN0KQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldl9wcml2LT5jaGFubmVscy5sb2NrLCBmbGFncyk7CisJZm9yIChpID0gMDsgaSA8IGRldl9wcml2LT5lbmdpbmUuZmlmby5jaGFubmVsczsgaSsrKSB7CisJCWNoYW4gPSBkZXZfcHJpdi0+Y2hhbm5lbHMucHRyW2ldOworCQlpZiAoIWNoYW4gfHwgIWNoYW4tPnJhbWluX2dyY3R4KQorCQkJY29udGludWU7CisKKwkJaWYgKGluc3QgPT0gY2hhbi0+cmFtaW5fZ3JjdHgtPnBpbnN0KQorCQkJYnJlYWs7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldl9wcml2LT5jaGFubmVscy5sb2NrLCBmbGFncyk7CisJcmV0dXJuIGk7Cit9CisKK3N0YXRpYyB2b2lkCitudjQwX2dyYXBoX2lzcihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXUzMiBzdGF0OworCisJd2hpbGUgKChzdGF0ID0gbnZfcmQzMihkZXYsIE5WMDNfUEdSQVBIX0lOVFIpKSkgeworCQl1MzIgbnNvdXJjZSA9IG52X3JkMzIoZGV2LCBOVjAzX1BHUkFQSF9OU09VUkNFKTsKKwkJdTMyIG5zdGF0dXMgPSBudl9yZDMyKGRldiwgTlYwM19QR1JBUEhfTlNUQVRVUyk7CisJCXUzMiBpbnN0ID0gKG52X3JkMzIoZGV2LCAweDQwMDMyYykgJiAweDAwMGZmZmZmKSA8PCA0OworCQl1MzIgY2hpZCA9IG52NDBfZ3JhcGhfaXNyX2NoaWQoZGV2LCBpbnN0KTsKKwkJdTMyIGFkZHIgPSBudl9yZDMyKGRldiwgTlYwNF9QR1JBUEhfVFJBUFBFRF9BRERSKTsKKwkJdTMyIHN1YmMgPSAoYWRkciAmIDB4MDAwNzAwMDApID4+IDE2OworCQl1MzIgbXRoZCA9IChhZGRyICYgMHgwMDAwMWZmYyk7CisJCXUzMiBkYXRhID0gbnZfcmQzMihkZXYsIE5WMDRfUEdSQVBIX1RSQVBQRURfREFUQSk7CisJCXUzMiBjbGFzcyA9IG52X3JkMzIoZGV2LCAweDQwMDE2MCArIHN1YmMgKiA0KSAmIDB4ZmZmZjsKKwkJdTMyIHNob3cgPSBzdGF0OworCisJCWlmIChzdGF0ICYgTlZfUEdSQVBIX0lOVFJfRVJST1IpIHsKKwkJCWlmIChuc291cmNlICYgTlYwM19QR1JBUEhfTlNPVVJDRV9JTExFR0FMX01USEQpIHsKKwkJCQlpZiAoIW5vdXZlYXVfZ3B1b2JqX210aGRfY2FsbDIoZGV2LCBjaGlkLCBjbGFzcywgbXRoZCwgZGF0YSkpCisJCQkJCXNob3cgJj0gfk5WX1BHUkFQSF9JTlRSX0VSUk9SOworCQkJfSBlbHNlCisJCQlpZiAobnNvdXJjZSAmIE5WMDNfUEdSQVBIX05TT1VSQ0VfRE1BX1ZUWF9QUk9URUNUSU9OKSB7CisJCQkJbnZfbWFzayhkZXYsIDB4NDAyMDAwLCAwLCAwKTsKKwkJCX0KKwkJfQorCisJCW52X3dyMzIoZGV2LCBOVjAzX1BHUkFQSF9JTlRSLCBzdGF0KTsKKwkJbnZfd3IzMihkZXYsIE5WMDRfUEdSQVBIX0ZJRk8sIDB4MDAwMDAwMDEpOworCisJCWlmIChzaG93ICYmIG5vdXZlYXVfcmF0ZWxpbWl0KCkpIHsKKwkJCU5WX0lORk8oZGV2LCAiUEdSQVBIIC0iKTsKKwkJCW5vdXZlYXVfYml0ZmllbGRfcHJpbnQobnYxMF9ncmFwaF9pbnRyLCBzaG93KTsKKwkJCXByaW50aygiIG5zb3VyY2U6Iik7CisJCQlub3V2ZWF1X2JpdGZpZWxkX3ByaW50KG52MDRfZ3JhcGhfbnNvdXJjZSwgbnNvdXJjZSk7CisJCQlwcmludGsoIiBuc3RhdHVzOiIpOworCQkJbm91dmVhdV9iaXRmaWVsZF9wcmludChudjEwX2dyYXBoX25zdGF0dXMsIG5zdGF0dXMpOworCQkJcHJpbnRrKCJcbiIpOworCQkJTlZfSU5GTyhkZXYsICJQR1JBUEggLSBjaCAlZCAoMHglMDh4KSBzdWJjICVkICIKKwkJCQkgICAgICJjbGFzcyAweCUwNHggbXRoZCAweCUwNHggZGF0YSAweCUwOHhcbiIsCisJCQkJY2hpZCwgaW5zdCwgc3ViYywgY2xhc3MsIG10aGQsIGRhdGEpOworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnY1MF9jcnRjLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjUwX2NydGMuYwppbmRleCA1NjQ3NmQwLi45MDIzYzRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjUwX2NydGMuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjUwX2NydGMuYwpAQCAtMTE1LDE1ICsxMTUsMTYgQEAKIAkJT1VUX1JJTkcoZXZvLCAwKTsKIAkJQkVHSU5fUklORyhldm8sIDAsIE5WNTBfRVZPX0NSVEMoaW5kZXgsIEZCX0RNQSksIDEpOwogCQlpZiAoZGV2X3ByaXYtPmNoaXBzZXQgIT0gMHg1MCkKLQkJCWlmIChudl9jcnRjLT5mYi50aWxlX2ZsYWdzID09IDB4N2EwMCkKKwkJCWlmIChudl9jcnRjLT5mYi50aWxlX2ZsYWdzID09IDB4N2EwMCB8fAorCQkJICAgIG52X2NydGMtPmZiLnRpbGVfZmxhZ3MgPT0gMHhmZTAwKQogCQkJCU9VVF9SSU5HKGV2bywgTnZFdm9GQjMyKTsKIAkJCWVsc2UKIAkJCWlmIChudl9jcnRjLT5mYi50aWxlX2ZsYWdzID09IDB4NzAwMCkKIAkJCQlPVVRfUklORyhldm8sIE52RXZvRkIxNik7CiAJCQllbHNlCi0JCQkJT1VUX1JJTkcoZXZvLCBOdkV2b1ZSQU0pOworCQkJCU9VVF9SSU5HKGV2bywgTnZFdm9WUkFNX0xQKTsKIAkJZWxzZQotCQkJT1VUX1JJTkcoZXZvLCBOdkV2b1ZSQU0pOworCQkJT1VUX1JJTkcoZXZvLCBOdkV2b1ZSQU1fTFApOwogCX0KIAogCW52X2NydGMtPmZiLmJsYW5rZWQgPSBibGFua2VkOwpAQCAtMzQ1LDcgKzM0Niw2IEBACiAJCSAgICAgdWludDMyX3QgYnVmZmVyX2hhbmRsZSwgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCkKIHsKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY3J0Yy0+ZGV2OwotCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJc3RydWN0IG5vdXZlYXVfY3J0YyAqbnZfY3J0YyA9IG5vdXZlYXVfY3J0YyhjcnRjKTsKIAlzdHJ1Y3Qgbm91dmVhdV9ibyAqY3Vyc29yID0gTlVMTDsKIAlzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKmdlbTsKQEAgLTM3NCw4ICszNzQsNyBAQAogCiAJbm91dmVhdV9ib191bm1hcChjdXJzb3IpOwogCi0JbnZfY3J0Yy0+Y3Vyc29yLnNldF9vZmZzZXQobnZfY3J0YywgbnZfY3J0Yy0+Y3Vyc29yLm52Ym8tPmJvLm9mZnNldCAtCi0JCQkJCSAgICBkZXZfcHJpdi0+dm1fdnJhbV9iYXNlKTsKKwludl9jcnRjLT5jdXJzb3Iuc2V0X29mZnNldChudl9jcnRjLCBudl9jcnRjLT5jdXJzb3IubnZiby0+Ym8ubWVtLnN0YXJ0IDw8IFBBR0VfU0hJRlQpOwogCW52X2NydGMtPmN1cnNvci5zaG93KG52X2NydGMsIHRydWUpOwogCiBvdXQ6CkBAIC00MzcsNiArNDM2LDcgQEAKIAkuY3Vyc29yX21vdmUgPSBudjUwX2NydGNfY3Vyc29yX21vdmUsCiAJLmdhbW1hX3NldCA9IG52NTBfY3J0Y19nYW1tYV9zZXQsCiAJLnNldF9jb25maWcgPSBkcm1fY3J0Y19oZWxwZXJfc2V0X2NvbmZpZywKKwkucGFnZV9mbGlwID0gbm91dmVhdV9jcnRjX3BhZ2VfZmxpcCwKIAkuZGVzdHJveSA9IG52NTBfY3J0Y19kZXN0cm95LAogfTsKIApAQCAtNDUzLDYgKzQ1Myw3IEBACiAKIAlOVl9ERUJVR19LTVMoZGV2LCAiaW5kZXggJWRcbiIsIG52X2NydGMtPmluZGV4KTsKIAorCWRybV92YmxhbmtfcHJlX21vZGVzZXQoZGV2LCBudl9jcnRjLT5pbmRleCk7CiAJbnY1MF9jcnRjX2JsYW5rKG52X2NydGMsIHRydWUpOwogfQogCkBAIC00NjgsNiArNDY5LDcgQEAKIAlOVl9ERUJVR19LTVMoZGV2LCAiaW5kZXggJWRcbiIsIG52X2NydGMtPmluZGV4KTsKIAogCW52NTBfY3J0Y19ibGFuayhudl9jcnRjLCBmYWxzZSk7CisJZHJtX3ZibGFua19wb3N0X21vZGVzZXQoZGV2LCBudl9jcnRjLT5pbmRleCk7CiAKIAlyZXQgPSBSSU5HX1NQQUNFKGV2bywgMik7CiAJaWYgKHJldCkgewpAQCAtNTQ1LDcgKzU0Nyw3IEBACiAJCSByZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQludl9jcnRjLT5mYi5vZmZzZXQgPSBmYi0+bnZiby0+Ym8ub2Zmc2V0IC0gZGV2X3ByaXYtPnZtX3ZyYW1fYmFzZTsKKwludl9jcnRjLT5mYi5vZmZzZXQgPSBmYi0+bnZiby0+Ym8ubWVtLnN0YXJ0IDw8IFBBR0VfU0hJRlQ7CiAJbnZfY3J0Yy0+ZmIudGlsZV9mbGFncyA9IG5vdXZlYXVfYm9fdGlsZV9sYXlvdXQoZmItPm52Ym8pOwogCW52X2NydGMtPmZiLmNwcCA9IGRybV9mYi0+Yml0c19wZXJfcGl4ZWwgLyA4OwogCWlmICghbnZfY3J0Yy0+ZmIuYmxhbmtlZCAmJiBkZXZfcHJpdi0+Y2hpcHNldCAhPSAweDUwKSB7CkBAIC01NTQsMTMgKzU1NiwxNCBAQAogCQkJcmV0dXJuIHJldDsKIAogCQlCRUdJTl9SSU5HKGV2bywgMCwgTlY1MF9FVk9fQ1JUQyhudl9jcnRjLT5pbmRleCwgRkJfRE1BKSwgMSk7Ci0JCWlmIChudl9jcnRjLT5mYi50aWxlX2ZsYWdzID09IDB4N2EwMCkKKwkJaWYgKG52X2NydGMtPmZiLnRpbGVfZmxhZ3MgPT0gMHg3YTAwIHx8CisJCSAgICBudl9jcnRjLT5mYi50aWxlX2ZsYWdzID09IDB4ZmUwMCkKIAkJCU9VVF9SSU5HKGV2bywgTnZFdm9GQjMyKTsKIAkJZWxzZQogCQlpZiAobnZfY3J0Yy0+ZmIudGlsZV9mbGFncyA9PSAweDcwMDApCiAJCQlPVVRfUklORyhldm8sIE52RXZvRkIxNik7CiAJCWVsc2UKLQkJCU9VVF9SSU5HKGV2bywgTnZFdm9WUkFNKTsKKwkJCU9VVF9SSU5HKGV2bywgTnZFdm9WUkFNX0xQKTsKIAl9CiAKIAlyZXQgPSBSSU5HX1NQQUNFKGV2bywgMTIpOwpAQCAtNTc0LDggKzU3NywxMCBAQAogCWlmICghbnZfY3J0Yy0+ZmIudGlsZV9mbGFncykgewogCQlPVVRfUklORyhldm8sIGRybV9mYi0+cGl0Y2ggfCAoMSA8PCAyMCkpOwogCX0gZWxzZSB7Ci0JCU9VVF9SSU5HKGV2bywgKChkcm1fZmItPnBpdGNoIC8gNCkgPDwgNCkgfAotCQkJCSAgZmItPm52Ym8tPnRpbGVfbW9kZSk7CisJCXUzMiB0aWxlX21vZGUgPSBmYi0+bnZiby0+dGlsZV9tb2RlOworCQlpZiAoZGV2X3ByaXYtPmNhcmRfdHlwZSA+PSBOVl9DMCkKKwkJCXRpbGVfbW9kZSA+Pj0gNDsKKwkJT1VUX1JJTkcoZXZvLCAoKGRybV9mYi0+cGl0Y2ggLyA0KSA8PCA0KSB8IHRpbGVfbW9kZSk7CiAJfQogCWlmIChkZXZfcHJpdi0+Y2hpcHNldCA9PSAweDUwKQogCQlPVVRfUklORyhldm8sIChudl9jcnRjLT5mYi50aWxlX2ZsYWdzIDw8IDgpIHwgZm9ybWF0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252NTBfZGlzcGxheS5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnY1MF9kaXNwbGF5LmMKaW5kZXggZjYyNGM2MS4uN2NjOTRlZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnY1MF9kaXNwbGF5LmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnY1MF9kaXNwbGF5LmMKQEAgLTMzLDYgKzMzLDggQEAKICNpbmNsdWRlICJub3V2ZWF1X3JhbWh0LmgiCiAjaW5jbHVkZSAiZHJtX2NydGNfaGVscGVyLmgiCiAKK3N0YXRpYyB2b2lkIG52NTBfZGlzcGxheV9pc3Ioc3RydWN0IGRybV9kZXZpY2UgKik7CisKIHN0YXRpYyBpbmxpbmUgaW50CiBudjUwX3Nvcl9ucihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogewpAQCAtNDYsMTU5ICs0OCw2IEBACiAJcmV0dXJuIDQ7CiB9CiAKLXN0YXRpYyB2b2lkCi1udjUwX2V2b19jaGFubmVsX2RlbChzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICoqcGNoYW4pCi17Ci0Jc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbiA9ICpwY2hhbjsKLQotCWlmICghY2hhbikKLQkJcmV0dXJuOwotCSpwY2hhbiA9IE5VTEw7Ci0KLQlub3V2ZWF1X2dwdW9ial9jaGFubmVsX3Rha2Vkb3duKGNoYW4pOwotCW5vdXZlYXVfYm9fdW5tYXAoY2hhbi0+cHVzaGJ1Zl9ibyk7Ci0Jbm91dmVhdV9ib19yZWYoTlVMTCwgJmNoYW4tPnB1c2hidWZfYm8pOwotCi0JaWYgKGNoYW4tPnVzZXIpCi0JCWlvdW5tYXAoY2hhbi0+dXNlcik7Ci0KLQlrZnJlZShjaGFuKTsKLX0KLQotc3RhdGljIGludAotbnY1MF9ldm9fZG1hb2JqX25ldyhzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpldm8sIHVpbnQzMl90IGNsYXNzLCB1aW50MzJfdCBuYW1lLAotCQkgICAgdWludDMyX3QgdGlsZV9mbGFncywgdWludDMyX3QgbWFnaWNfZmxhZ3MsCi0JCSAgICB1aW50MzJfdCBvZmZzZXQsIHVpbnQzMl90IGxpbWl0KQotewotCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGV2by0+ZGV2LT5kZXZfcHJpdmF0ZTsKLQlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZXZvLT5kZXY7Ci0Jc3RydWN0IG5vdXZlYXVfZ3B1b2JqICpvYmogPSBOVUxMOwotCWludCByZXQ7Ci0KLQlyZXQgPSBub3V2ZWF1X2dwdW9ial9uZXcoZGV2LCBldm8sIDYqNCwgMzIsIDAsICZvYmopOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0Jb2JqLT5lbmdpbmUgPSBOVk9CSl9FTkdJTkVfRElTUExBWTsKLQotCW52X3dvMzIob2JqLCAgMCwgKHRpbGVfZmxhZ3MgPDwgMjIpIHwgKG1hZ2ljX2ZsYWdzIDw8IDE2KSB8IGNsYXNzKTsKLQludl93bzMyKG9iaiwgIDQsIGxpbWl0KTsKLQludl93bzMyKG9iaiwgIDgsIG9mZnNldCk7Ci0JbnZfd28zMihvYmosIDEyLCAweDAwMDAwMDAwKTsKLQludl93bzMyKG9iaiwgMTYsIDB4MDAwMDAwMDApOwotCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlIDwgTlZfQzApCi0JCW52X3dvMzIob2JqLCAyMCwgMHgwMDAxMDAwMCk7Ci0JZWxzZQotCQludl93bzMyKG9iaiwgMjAsIDB4MDAwMjAwMDApOwotCWRldl9wcml2LT5lbmdpbmUuaW5zdG1lbS5mbHVzaChkZXYpOwotCi0JcmV0ID0gbm91dmVhdV9yYW1odF9pbnNlcnQoZXZvLCBuYW1lLCBvYmopOwotCW5vdXZlYXVfZ3B1b2JqX3JlZihOVUxMLCAmb2JqKTsKLQlpZiAocmV0KSB7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQKLW52NTBfZXZvX2NoYW5uZWxfbmV3KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKipwY2hhbikKLXsKLQlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCXN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqcmFtaHQgPSBOVUxMOwotCXN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW47Ci0JaW50IHJldDsKLQotCWNoYW4gPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFjaGFuKQotCQlyZXR1cm4gLUVOT01FTTsKLQkqcGNoYW4gPSBjaGFuOwotCi0JY2hhbi0+aWQgPSAtMTsKLQljaGFuLT5kZXYgPSBkZXY7Ci0JY2hhbi0+dXNlcl9nZXQgPSA0OwotCWNoYW4tPnVzZXJfcHV0ID0gMDsKLQotCXJldCA9IG5vdXZlYXVfZ3B1b2JqX25ldyhkZXYsIE5VTEwsIDMyNzY4LCAweDEwMDAsCi0JCQkJIE5WT0JKX0ZMQUdfWkVST19BTExPQywgJmNoYW4tPnJhbWluKTsKLQlpZiAocmV0KSB7Ci0JCU5WX0VSUk9SKGRldiwgIkVycm9yIGFsbG9jYXRpbmcgRVZPIGNoYW5uZWwgbWVtb3J5OiAlZFxuIiwgcmV0KTsKLQkJbnY1MF9ldm9fY2hhbm5lbF9kZWwocGNoYW4pOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCXJldCA9IGRybV9tbV9pbml0KCZjaGFuLT5yYW1pbl9oZWFwLCAwLCAzMjc2OCk7Ci0JaWYgKHJldCkgewotCQlOVl9FUlJPUihkZXYsICJFcnJvciBpbml0aWFsaXNpbmcgRVZPIFBSQU1JTiBoZWFwOiAlZFxuIiwgcmV0KTsKLQkJbnY1MF9ldm9fY2hhbm5lbF9kZWwocGNoYW4pOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCXJldCA9IG5vdXZlYXVfZ3B1b2JqX25ldyhkZXYsIGNoYW4sIDQwOTYsIDE2LCAwLCAmcmFtaHQpOwotCWlmIChyZXQpIHsKLQkJTlZfRVJST1IoZGV2LCAiVW5hYmxlIHRvIGFsbG9jYXRlIEVWTyBSQU1IVDogJWRcbiIsIHJldCk7Ci0JCW52NTBfZXZvX2NoYW5uZWxfZGVsKHBjaGFuKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlyZXQgPSBub3V2ZWF1X3JhbWh0X25ldyhkZXYsIHJhbWh0LCAmY2hhbi0+cmFtaHQpOwotCW5vdXZlYXVfZ3B1b2JqX3JlZihOVUxMLCAmcmFtaHQpOwotCWlmIChyZXQpIHsKLQkJbnY1MF9ldm9fY2hhbm5lbF9kZWwocGNoYW4pOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCWlmIChkZXZfcHJpdi0+Y2hpcHNldCAhPSAweDUwKSB7Ci0JCXJldCA9IG52NTBfZXZvX2RtYW9ial9uZXcoY2hhbiwgMHgzZCwgTnZFdm9GQjE2LCAweDcwLCAweDE5LAotCQkJCQkgIDAsIDB4ZmZmZmZmZmYpOwotCQlpZiAocmV0KSB7Ci0JCQludjUwX2V2b19jaGFubmVsX2RlbChwY2hhbik7Ci0JCQlyZXR1cm4gcmV0OwotCQl9Ci0KLQotCQlyZXQgPSBudjUwX2V2b19kbWFvYmpfbmV3KGNoYW4sIDB4M2QsIE52RXZvRkIzMiwgMHg3YSwgMHgxOSwKLQkJCQkJICAwLCAweGZmZmZmZmZmKTsKLQkJaWYgKHJldCkgewotCQkJbnY1MF9ldm9fY2hhbm5lbF9kZWwocGNoYW4pOwotCQkJcmV0dXJuIHJldDsKLQkJfQotCX0KLQotCXJldCA9IG52NTBfZXZvX2RtYW9ial9uZXcoY2hhbiwgMHgzZCwgTnZFdm9WUkFNLCAwLCAweDE5LAotCQkJCSAgMCwgZGV2X3ByaXYtPnZyYW1fc2l6ZSk7Ci0JaWYgKHJldCkgewotCQludjUwX2V2b19jaGFubmVsX2RlbChwY2hhbik7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JcmV0ID0gbm91dmVhdV9ib19uZXcoZGV2LCBOVUxMLCA0MDk2LCAwLCBUVE1fUExfRkxBR19WUkFNLCAwLCAwLAotCQkJICAgICBmYWxzZSwgdHJ1ZSwgJmNoYW4tPnB1c2hidWZfYm8pOwotCWlmIChyZXQgPT0gMCkKLQkJcmV0ID0gbm91dmVhdV9ib19waW4oY2hhbi0+cHVzaGJ1Zl9ibywgVFRNX1BMX0ZMQUdfVlJBTSk7Ci0JaWYgKHJldCkgewotCQlOVl9FUlJPUihkZXYsICJFcnJvciBjcmVhdGluZyBFVk8gRE1BIHB1c2ggYnVmZmVyOiAlZFxuIiwgcmV0KTsKLQkJbnY1MF9ldm9fY2hhbm5lbF9kZWwocGNoYW4pOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCXJldCA9IG5vdXZlYXVfYm9fbWFwKGNoYW4tPnB1c2hidWZfYm8pOwotCWlmIChyZXQpIHsKLQkJTlZfRVJST1IoZGV2LCAiRXJyb3IgbWFwcGluZyBFVk8gRE1BIHB1c2ggYnVmZmVyOiAlZFxuIiwgcmV0KTsKLQkJbnY1MF9ldm9fY2hhbm5lbF9kZWwocGNoYW4pOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCWNoYW4tPnVzZXIgPSBpb3JlbWFwKHBjaV9yZXNvdXJjZV9zdGFydChkZXYtPnBkZXYsIDApICsKLQkJCQkJTlY1MF9QRElTUExBWV9VU0VSKDApLCBQQUdFX1NJWkUpOwotCWlmICghY2hhbi0+dXNlcikgewotCQlOVl9FUlJPUihkZXYsICJFcnJvciBtYXBwaW5nIEVWTyBjb250cm9sIHJlZ3MuXG4iKTsKLQkJbnY1MF9ldm9fY2hhbm5lbF9kZWwocGNoYW4pOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQogaW50CiBudjUwX2Rpc3BsYXlfZWFybHlfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogewpAQCAtMjE0LDE3ICs2MywxNiBAQAogbnY1MF9kaXNwbGF5X2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCXN0cnVjdCBub3V2ZWF1X3RpbWVyX2VuZ2luZSAqcHRpbWVyID0gJmRldl9wcml2LT5lbmdpbmUudGltZXI7CiAJc3RydWN0IG5vdXZlYXVfZ3Bpb19lbmdpbmUgKnBncGlvID0gJmRldl9wcml2LT5lbmdpbmUuZ3BpbzsKLQlzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpldm8gPSBkZXZfcHJpdi0+ZXZvOwogCXN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3I7Ci0JdWludDMyX3QgdmFsLCByYW1fYW1vdW50OwotCXVpbnQ2NF90IHN0YXJ0OworCXN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmV2bzsKIAlpbnQgcmV0LCBpOworCXUzMiB2YWw7CiAKIAlOVl9ERUJVR19LTVMoZGV2LCAiXG4iKTsKIAogCW52X3dyMzIoZGV2LCAweDAwNjEwMTg0LCBudl9yZDMyKGRldiwgMHgwMDYxNDAwNCkpOworCiAJLyoKIAkgKiBJIHRoaW5rIHRoZSAweDAwNjEwMVhYIHJhbmdlIGlzIHNvbWUga2luZCBvZiBtYWluIGNvbnRyb2wgYXJlYQogCSAqIHRoYXQgZW5hYmxlcyB0aGluZ3MuCkBAIC0yNDAsMTYgKzg4LDE5IEBACiAJCXZhbCA9IG52X3JkMzIoZGV2LCAweDAwNjE2MTBjICsgKGkgKiAweDgwMCkpOwogCQludl93cjMyKGRldiwgMHgwMDYxMDE5YyArIChpICogMHgxMCksIHZhbCk7CiAJfQorCiAJLyogREFDICovCiAJZm9yIChpID0gMDsgaSA8IDM7IGkrKykgewogCQl2YWwgPSBudl9yZDMyKGRldiwgMHgwMDYxYTAwMCArIChpICogMHg4MDApKTsKIAkJbnZfd3IzMihkZXYsIDB4MDA2MTAxZDAgKyAoaSAqIDB4MDQpLCB2YWwpOwogCX0KKwogCS8qIFNPUiAqLwogCWZvciAoaSA9IDA7IGkgPCBudjUwX3Nvcl9ucihkZXYpOyBpKyspIHsKIAkJdmFsID0gbnZfcmQzMihkZXYsIDB4MDA2MWMwMDAgKyAoaSAqIDB4ODAwKSk7CiAJCW52X3dyMzIoZGV2LCAweDAwNjEwMWUwICsgKGkgKiAweDA0KSwgdmFsKTsKIAl9CisKIAkvKiBFWFQgKi8KIAlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CiAJCXZhbCA9IG52X3JkMzIoZGV2LCAweDAwNjFlMDAwICsgKGkgKiAweDgwMCkpOwpAQCAtMjYyLDE3ICsxMTMsNiBAQAogCQludl93cjMyKGRldiwgTlY1MF9QRElTUExBWV9EQUNfQ0xLX0NUUkwxKGkpLCAweDAwMDAwMDAxKTsKIAl9CiAKLQkvKiBUaGlzIHVzZWQgdG8gYmUgaW4gY3J0YyB1bmJsYW5rLCBidXQgc2VlbXMgb3V0IG9mIHBsYWNlIHRoZXJlLiAqLwotCW52X3dyMzIoZGV2LCBOVjUwX1BESVNQTEFZX1VOS18zODAsIDApOwotCS8qIFJBTSBpcyBjbGFtcGVkIHRvIDI1NiBNaUIuICovCi0JcmFtX2Ftb3VudCA9IGRldl9wcml2LT52cmFtX3NpemU7Ci0JTlZfREVCVUdfS01TKGRldiwgInJhbV9hbW91bnQgJWRcbiIsIHJhbV9hbW91bnQpOwotCWlmIChyYW1fYW1vdW50ID4gMjU2KjEwMjQqMTAyNCkKLQkJcmFtX2Ftb3VudCA9IDI1NioxMDI0KjEwMjQ7Ci0JbnZfd3IzMihkZXYsIE5WNTBfUERJU1BMQVlfUkFNX0FNT1VOVCwgcmFtX2Ftb3VudCAtIDEpOwotCW52X3dyMzIoZGV2LCBOVjUwX1BESVNQTEFZX1VOS18zODgsIDB4MTUwMDAwKTsKLQludl93cjMyKGRldiwgTlY1MF9QRElTUExBWV9VTktfMzhDLCAwKTsKLQogCS8qIFRoZSBwcmVjaXNlIHB1cnBvc2UgaXMgdW5rbm93biwgaSBzdXNwZWN0IGl0IGhhcyBzb21ldGhpbmcgdG8gZG8KIAkgKiB3aXRoIHRleHQgbW9kZS4KIAkgKi8KQEAgLTI4NywzNyArMTI3LDYgQEAKIAkJfQogCX0KIAotCS8qIHRha2VuIGZyb20gbnYgYnVnICMxMjYzNywgYXR0ZW1wdHMgdG8gdW4td2VkZ2UgdGhlIGh3IGlmIGl0J3MKLQkgKiBzdHVjayBpbiBzb21lIHVuc3BlY2lmaWVkIHN0YXRlCi0JICovCi0Jc3RhcnQgPSBwdGltZXItPnJlYWQoZGV2KTsKLQludl93cjMyKGRldiwgTlY1MF9QRElTUExBWV9DSEFOTkVMX1NUQVQoMCksIDB4MmIwMCk7Ci0Jd2hpbGUgKCh2YWwgPSBudl9yZDMyKGRldiwgTlY1MF9QRElTUExBWV9DSEFOTkVMX1NUQVQoMCkpKSAmIDB4MWUwMDAwKSB7Ci0JCWlmICgodmFsICYgMHg5ZjAwMDApID09IDB4MjAwMDApCi0JCQludl93cjMyKGRldiwgTlY1MF9QRElTUExBWV9DSEFOTkVMX1NUQVQoMCksCi0JCQkJCQkJdmFsIHwgMHg4MDAwMDApOwotCi0JCWlmICgodmFsICYgMHgzZjAwMDApID09IDB4MzAwMDApCi0JCQludl93cjMyKGRldiwgTlY1MF9QRElTUExBWV9DSEFOTkVMX1NUQVQoMCksCi0JCQkJCQkJdmFsIHwgMHgyMDAwMDApOwotCi0JCWlmIChwdGltZXItPnJlYWQoZGV2KSAtIHN0YXJ0ID4gMTAwMDAwMDAwMFVMTCkgewotCQkJTlZfRVJST1IoZGV2LCAidGltZW91dDogKDB4NjEwMjAwICYgMHgxZTAwMDApICE9IDBcbiIpOwotCQkJTlZfRVJST1IoZGV2LCAiMHg2MTAyMDAgPSAweCUwOHhcbiIsIHZhbCk7Ci0JCQlyZXR1cm4gLUVCVVNZOwotCQl9Ci0JfQotCi0JbnZfd3IzMihkZXYsIE5WNTBfUERJU1BMQVlfQ1RSTF9TVEFURSwgTlY1MF9QRElTUExBWV9DVFJMX1NUQVRFX0VOQUJMRSk7Ci0JbnZfd3IzMihkZXYsIE5WNTBfUERJU1BMQVlfQ0hBTk5FTF9TVEFUKDApLCAweDEwMDBiMDMpOwotCWlmICghbnZfd2FpdChkZXYsIE5WNTBfUERJU1BMQVlfQ0hBTk5FTF9TVEFUKDApLAotCQkgICAgIDB4NDAwMDAwMDAsIDB4NDAwMDAwMDApKSB7Ci0JCU5WX0VSUk9SKGRldiwgInRpbWVvdXQ6ICgweDYxMDIwMCAmIDB4NDAwMDAwMDApID09IDB4NDAwMDAwMDBcbiIpOwotCQlOVl9FUlJPUihkZXYsICIweDYxMDIwMCA9IDB4JTA4eFxuIiwKLQkJCSAgbnZfcmQzMihkZXYsIE5WNTBfUERJU1BMQVlfQ0hBTk5FTF9TVEFUKDApKSk7Ci0JCXJldHVybiAtRUJVU1k7Ci0JfQotCiAJZm9yIChpID0gMDsgaSA8IDI7IGkrKykgewogCQludl93cjMyKGRldiwgTlY1MF9QRElTUExBWV9DVVJTT1JfQ1VSU09SX0NUUkwyKGkpLCAweDIwMDApOwogCQlpZiAoIW52X3dhaXQoZGV2LCBOVjUwX1BESVNQTEFZX0NVUlNPUl9DVVJTT1JfQ1RSTDIoaSksCkBAIC0zNDEsMzkgKzE1MCwzMSBAQAogCQl9CiAJfQogCi0JbnZfd3IzMihkZXYsIE5WNTBfUERJU1BMQVlfT0JKRUNUUywgKGV2by0+cmFtaW4tPnZpbnN0ID4+IDgpIHwgOSk7CisJbnZfd3IzMihkZXYsIE5WNTBfUERJU1BMQVlfUElPX0NUUkwsIDB4MDAwMDAwMDApOworCW52X21hc2soZGV2LCBOVjUwX1BESVNQTEFZX0lOVFJfMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIE5WNTBfUERJU1BMQVlfSU5UUl9FTl8wLCAweDAwMDAwMDAwKTsKKwludl9tYXNrKGRldiwgTlY1MF9QRElTUExBWV9JTlRSXzEsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCBOVjUwX1BESVNQTEFZX0lOVFJfRU5fMSwKKwkJICAgICBOVjUwX1BESVNQTEFZX0lOVFJfRU5fMV9DTEtfVU5LMTAgfAorCQkgICAgIE5WNTBfUERJU1BMQVlfSU5UUl9FTl8xX0NMS19VTksyMCB8CisJCSAgICAgTlY1MF9QRElTUExBWV9JTlRSX0VOXzFfQ0xLX1VOSzQwKTsKIAotCS8qIGluaXRpYWxpc2UgZmlmbyAqLwotCW52X3dyMzIoZGV2LCBOVjUwX1BESVNQTEFZX0NIQU5ORUxfRE1BX0NCKDApLAotCQkoKGV2by0+cHVzaGJ1Zl9iby0+Ym8ubWVtLnN0YXJ0IDw8IFBBR0VfU0hJRlQpID4+IDgpIHwKLQkJTlY1MF9QRElTUExBWV9DSEFOTkVMX0RNQV9DQl9MT0NBVElPTl9WUkFNIHwKLQkJTlY1MF9QRElTUExBWV9DSEFOTkVMX0RNQV9DQl9WQUxJRCk7Ci0JbnZfd3IzMihkZXYsIE5WNTBfUERJU1BMQVlfQ0hBTk5FTF9VTksyKDApLCAweDAwMDEwMDAwKTsKLQludl93cjMyKGRldiwgTlY1MF9QRElTUExBWV9DSEFOTkVMX1VOSzMoMCksIDB4MDAwMDAwMDIpOwotCWlmICghbnZfd2FpdChkZXYsIDB4NjEwMjAwLCAweDgwMDAwMDAwLCAweDAwMDAwMDAwKSkgewotCQlOVl9FUlJPUihkZXYsICJ0aW1lb3V0OiAoMHg2MTAyMDAgJiAweDgwMDAwMDAwKSA9PSAwXG4iKTsKLQkJTlZfRVJST1IoZGV2LCAiMHg2MTAyMDAgPSAweCUwOHhcbiIsIG52X3JkMzIoZGV2LCAweDYxMDIwMCkpOwotCQlyZXR1cm4gLUVCVVNZOworCS8qIGVuYWJsZSBob3RwbHVnIGludGVycnVwdHMgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNvbm5lY3RvciwgJmRldi0+bW9kZV9jb25maWcuY29ubmVjdG9yX2xpc3QsIGhlYWQpIHsKKwkJc3RydWN0IG5vdXZlYXVfY29ubmVjdG9yICpjb25uID0gbm91dmVhdV9jb25uZWN0b3IoY29ubmVjdG9yKTsKKworCQlpZiAoY29ubi0+ZGNiLT5ncGlvX3RhZyA9PSAweGZmKQorCQkJY29udGludWU7CisKKwkJcGdwaW8tPmlycV9lbmFibGUoZGV2LCBjb25uLT5kY2ItPmdwaW9fdGFnLCB0cnVlKTsKIAl9Ci0JbnZfd3IzMihkZXYsIE5WNTBfUERJU1BMQVlfQ0hBTk5FTF9TVEFUKDApLAotCQkobnZfcmQzMihkZXYsIE5WNTBfUERJU1BMQVlfQ0hBTk5FTF9TVEFUKDApKSAmIH4weDAwMDAwMDAzKSB8Ci0JCSBOVjUwX1BESVNQTEFZX0NIQU5ORUxfU1RBVF9ETUFfRU5BQkxFRCk7Ci0JbnZfd3IzMihkZXYsIE5WNTBfUERJU1BMQVlfVVNFUl9QVVQoMCksIDApOwotCW52X3dyMzIoZGV2LCBOVjUwX1BESVNQTEFZX0NIQU5ORUxfU1RBVCgwKSwgMHgwMTAwMDAwMyB8Ci0JCU5WNTBfUERJU1BMQVlfQ0hBTk5FTF9TVEFUX0RNQV9FTkFCTEVEKTsKLQludl93cjMyKGRldiwgMHg2MTAzMDAsIG52X3JkMzIoZGV2LCAweDYxMDMwMCkgJiB+MSk7CiAKLQlldm8tPmRtYS5tYXggPSAoNDA5Ni80KSAtIDI7Ci0JZXZvLT5kbWEucHV0ID0gMDsKLQlldm8tPmRtYS5jdXIgPSBldm8tPmRtYS5wdXQ7Ci0JZXZvLT5kbWEuZnJlZSA9IGV2by0+ZG1hLm1heCAtIGV2by0+ZG1hLmN1cjsKLQotCXJldCA9IFJJTkdfU1BBQ0UoZXZvLCBOT1VWRUFVX0RNQV9TS0lQUyk7CisJcmV0ID0gbnY1MF9ldm9faW5pdChkZXYpOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CisJZXZvID0gZGV2X3ByaXYtPmV2bzsKIAotCWZvciAoaSA9IDA7IGkgPCBOT1VWRUFVX0RNQV9TS0lQUzsgaSsrKQotCQlPVVRfUklORyhldm8sIDApOworCW52X3dyMzIoZGV2LCBOVjUwX1BESVNQTEFZX09CSkVDVFMsIChldm8tPnJhbWluLT52aW5zdCA+PiA4KSB8IDkpOwogCiAJcmV0ID0gUklOR19TUEFDRShldm8sIDExKTsKIAlpZiAocmV0KQpAQCAtMzkzLDIxICsxOTQsNiBAQAogCWlmICghbnZfd2FpdChkZXYsIDB4NjQwMDA0LCAweGZmZmZmZmZmLCBldm8tPmRtYS5wdXQgPDwgMikpCiAJCU5WX0VSUk9SKGRldiwgImV2byBwdXNoYnVmIHN0YWxsZWRcbiIpOwogCi0JLyogZW5hYmxlIGNsb2NrIGNoYW5nZSBpbnRlcnJ1cHRzLiAqLwotCW52X3dyMzIoZGV2LCAweDYxMDAyOCwgMHgwMDAxMDAwMSk7Ci0JbnZfd3IzMihkZXYsIE5WNTBfUERJU1BMQVlfSU5UUl9FTiwgKE5WNTBfUERJU1BMQVlfSU5UUl9FTl9DTEtfVU5LMTAgfAotCQkJCQkgICAgIE5WNTBfUERJU1BMQVlfSU5UUl9FTl9DTEtfVU5LMjAgfAotCQkJCQkgICAgIE5WNTBfUERJU1BMQVlfSU5UUl9FTl9DTEtfVU5LNDApKTsKLQotCS8qIGVuYWJsZSBob3RwbHVnIGludGVycnVwdHMgKi8KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNvbm5lY3RvciwgJmRldi0+bW9kZV9jb25maWcuY29ubmVjdG9yX2xpc3QsIGhlYWQpIHsKLQkJc3RydWN0IG5vdXZlYXVfY29ubmVjdG9yICpjb25uID0gbm91dmVhdV9jb25uZWN0b3IoY29ubmVjdG9yKTsKLQotCQlpZiAoY29ubi0+ZGNiLT5ncGlvX3RhZyA9PSAweGZmKQotCQkJY29udGludWU7Ci0KLQkJcGdwaW8tPmlycV9lbmFibGUoZGV2LCBjb25uLT5kY2ItPmdwaW9fdGFnLCB0cnVlKTsKLQl9CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTQ1MiwxMyArMjM4LDcgQEAKIAkJfQogCX0KIAotCW52X3dyMzIoZGV2LCBOVjUwX1BESVNQTEFZX0NIQU5ORUxfU1RBVCgwKSwgMCk7Ci0JbnZfd3IzMihkZXYsIE5WNTBfUERJU1BMQVlfQ1RSTF9TVEFURSwgMCk7Ci0JaWYgKCFudl93YWl0KGRldiwgTlY1MF9QRElTUExBWV9DSEFOTkVMX1NUQVQoMCksIDB4MWUwMDAwLCAwKSkgewotCQlOVl9FUlJPUihkZXYsICJ0aW1lb3V0OiAoMHg2MTAyMDAgJiAweDFlMDAwMCkgPT0gMFxuIik7Ci0JCU5WX0VSUk9SKGRldiwgIjB4NjEwMjAwID0gMHglMDh4XG4iLAotCQkJICBudl9yZDMyKGRldiwgTlY1MF9QRElTUExBWV9DSEFOTkVMX1NUQVQoMCkpKTsKLQl9CisJbnY1MF9ldm9fZmluaShkZXYpOwogCiAJZm9yIChpID0gMDsgaSA8IDM7IGkrKykgewogCQlpZiAoIW52X3dhaXQoZGV2LCBOVjUwX1BESVNQTEFZX1NPUl9EUE1TX1NUQVRFKGkpLApAQCAtNDcwLDcgKzI1MCw3IEBACiAJfQogCiAJLyogZGlzYWJsZSBpbnRlcnJ1cHRzLiAqLwotCW52X3dyMzIoZGV2LCBOVjUwX1BESVNQTEFZX0lOVFJfRU4sIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCBOVjUwX1BESVNQTEFZX0lOVFJfRU5fMSwgMHgwMDAwMDAwMCk7CiAKIAkvKiBkaXNhYmxlIGhvdHBsdWcgaW50ZXJydXB0cyAqLwogCW52X3dyMzIoZGV2LCAweGUwNTQsIDB4ZmZmZmZmZmYpOwpAQCAtNTA4LDEzICsyODgsNiBAQAogCiAJZGV2LT5tb2RlX2NvbmZpZy5mYl9iYXNlID0gZGV2X3ByaXYtPmZiX3BoeXM7CiAKLQkvKiBDcmVhdGUgRVZPIGNoYW5uZWwgKi8KLQlyZXQgPSBudjUwX2V2b19jaGFubmVsX25ldyhkZXYsICZkZXZfcHJpdi0+ZXZvKTsKLQlpZiAocmV0KSB7Ci0JCU5WX0VSUk9SKGRldiwgIkVycm9yIGNyZWF0aW5nIEVWTyBjaGFubmVsOiAlZFxuIiwgcmV0KTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KIAkvKiBDcmVhdGUgQ1JUQyBvYmplY3RzICovCiAJZm9yIChpID0gMDsgaSA8IDI7IGkrKykKIAkJbnY1MF9jcnRjX2NyZWF0ZShkZXYsIGkpOwpAQCAtNTU3LDYgKzMzMCw5IEBACiAJCX0KIAl9CiAKKwlJTklUX1dPUksoJmRldl9wcml2LT5pcnFfd29yaywgbnY1MF9kaXNwbGF5X2lycV9oYW5kbGVyX2JoKTsKKwlub3V2ZWF1X2lycV9yZWdpc3RlcihkZXYsIDI2LCBudjUwX2Rpc3BsYXlfaXNyKTsKKwogCXJldCA9IG52NTBfZGlzcGxheV9pbml0KGRldik7CiAJaWYgKHJldCkgewogCQludjUwX2Rpc3BsYXlfZGVzdHJveShkZXYpOwpAQCAtNTY5LDE0ICszNDUsMTIgQEAKIHZvaWQKIG52NTBfZGlzcGxheV9kZXN0cm95KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7Ci0Jc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQogCU5WX0RFQlVHX0tNUyhkZXYsICJcbiIpOwogCiAJZHJtX21vZGVfY29uZmlnX2NsZWFudXAoZGV2KTsKIAogCW52NTBfZGlzcGxheV9kaXNhYmxlKGRldik7Ci0JbnY1MF9ldm9fY2hhbm5lbF9kZWwoJmRldl9wcml2LT5ldm8pOworCW5vdXZlYXVfaXJxX3VucmVnaXN0ZXIoZGV2LCAyNik7CiB9CiAKIHN0YXRpYyB1MTYKQEAgLTY2MCwzMiArNDM0LDMyIEBACiBudjUwX2Rpc3BsYXlfdmJsYW5rX2NydGNfaGFuZGxlcihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgY3J0YykKIHsKIAlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCXN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW47Ci0Jc3RydWN0IGxpc3RfaGVhZCAqZW50cnksICp0bXA7CisJc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbiwgKnRtcDsKIAotCWxpc3RfZm9yX2VhY2hfc2FmZShlbnRyeSwgdG1wLCAmZGV2X3ByaXYtPnZibF93YWl0aW5nKSB7Ci0JCWNoYW4gPSBsaXN0X2VudHJ5KGVudHJ5LCBzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsLCBudnN3LnZibF93YWl0KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoY2hhbiwgdG1wLCAmZGV2X3ByaXYtPnZibF93YWl0aW5nLAorCQkJCSBudnN3LnZibF93YWl0KSB7CisJCWlmIChjaGFuLT5udnN3LnZibHNlbV9oZWFkICE9IGNydGMpCisJCQljb250aW51ZTsKIAogCQlub3V2ZWF1X2JvX3dyMzIoY2hhbi0+bm90aWZpZXJfYm8sIGNoYW4tPm52c3cudmJsc2VtX29mZnNldCwKIAkJCQkJCWNoYW4tPm52c3cudmJsc2VtX3J2YWwpOwogCQlsaXN0X2RlbCgmY2hhbi0+bnZzdy52Ymxfd2FpdCk7CisJCWRybV92YmxhbmtfcHV0KGRldiwgY3J0Yyk7CiAJfQorCisJZHJtX2hhbmRsZV92YmxhbmsoZGV2LCBjcnRjKTsKIH0KIAogc3RhdGljIHZvaWQKIG52NTBfZGlzcGxheV92YmxhbmtfaGFuZGxlcihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1aW50MzJfdCBpbnRyKQogewotCWludHIgJj0gTlY1MF9QRElTUExBWV9JTlRSXzFfVkJMQU5LX0NSVEM7Ci0KIAlpZiAoaW50ciAmIE5WNTBfUERJU1BMQVlfSU5UUl8xX1ZCTEFOS19DUlRDXzApCiAJCW52NTBfZGlzcGxheV92YmxhbmtfY3J0Y19oYW5kbGVyKGRldiwgMCk7CiAKIAlpZiAoaW50ciAmIE5WNTBfUERJU1BMQVlfSU5UUl8xX1ZCTEFOS19DUlRDXzEpCiAJCW52NTBfZGlzcGxheV92YmxhbmtfY3J0Y19oYW5kbGVyKGRldiwgMSk7CiAKLQludl93cjMyKGRldiwgTlY1MF9QRElTUExBWV9JTlRSX0VOLCBudl9yZDMyKGRldiwKLQkJICAgICBOVjUwX1BESVNQTEFZX0lOVFJfRU4pICYgfmludHIpOwotCW52X3dyMzIoZGV2LCBOVjUwX1BESVNQTEFZX0lOVFJfMSwgaW50cik7CisJbnZfd3IzMihkZXYsIE5WNTBfUERJU1BMQVlfSU5UUl8xLCBOVjUwX1BESVNQTEFZX0lOVFJfMV9WQkxBTktfQ1JUQyk7CiB9CiAKIHN0YXRpYyB2b2lkCkBAIC0xMDExLDEwOCArNzg1LDMxIEBACiBzdGF0aWMgdm9pZAogbnY1MF9kaXNwbGF5X2Vycm9yX2hhbmRsZXIoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKLQl1aW50MzJfdCBhZGRyLCBkYXRhOworCXUzMiBjaGFubmVscyA9IChudl9yZDMyKGRldiwgTlY1MF9QRElTUExBWV9JTlRSXzApICYgMHgwMDFmMDAwMCkgPj4gMTY7CisJdTMyIGFkZHIsIGRhdGE7CisJaW50IGNoaWQ7CiAKLQludl93cjMyKGRldiwgTlY1MF9QRElTUExBWV9JTlRSXzAsIDB4MDAwMTAwMDApOwotCWFkZHIgPSBudl9yZDMyKGRldiwgTlY1MF9QRElTUExBWV9UUkFQUEVEX0FERFIpOwotCWRhdGEgPSBudl9yZDMyKGRldiwgTlY1MF9QRElTUExBWV9UUkFQUEVEX0RBVEEpOwotCi0JTlZfRVJST1IoZGV2LCAiRXZvQ2ggJWQgTXRoZCAweCUwNHggRGF0YSAweCUwOHggKDB4JTA0eCAweCUwMngpXG4iLAotCQkgMCwgYWRkciAmIDB4ZmZjLCBkYXRhLCBhZGRyID4+IDE2LCAoYWRkciA+PiAxMikgJiAweGYpOwotCi0JbnZfd3IzMihkZXYsIE5WNTBfUERJU1BMQVlfVFJBUFBFRF9BRERSLCAweDkwMDAwMDAwKTsKLX0KLQotdm9pZAotbnY1MF9kaXNwbGF5X2lycV9ob3RwbHVnX2JoKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKLXsKLQlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPQotCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUsIGhwZF93b3JrKTsKLQlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZGV2X3ByaXYtPmRldjsKLQlzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yOwotCWNvbnN0IHVpbnQzMl90IGdwaW9fcmVnWzRdID0geyAweGUxMDQsIDB4ZTEwOCwgMHhlMjgwLCAweGUyODQgfTsKLQl1aW50MzJfdCB1bnBsdWdfbWFzaywgcGx1Z19tYXNrLCBjaGFuZ2VfbWFzazsKLQl1aW50MzJfdCBocGQwLCBocGQxOwotCi0Jc3Bpbl9sb2NrX2lycSgmZGV2X3ByaXYtPmhwZF9zdGF0ZS5sb2NrKTsKLQlocGQwID0gZGV2X3ByaXYtPmhwZF9zdGF0ZS5ocGQwX2JpdHM7Ci0JZGV2X3ByaXYtPmhwZF9zdGF0ZS5ocGQwX2JpdHMgPSAwOwotCWhwZDEgPSBkZXZfcHJpdi0+aHBkX3N0YXRlLmhwZDFfYml0czsKLQlkZXZfcHJpdi0+aHBkX3N0YXRlLmhwZDFfYml0cyA9IDA7Ci0Jc3Bpbl91bmxvY2tfaXJxKCZkZXZfcHJpdi0+aHBkX3N0YXRlLmxvY2spOwotCi0JaHBkMCAmPSBudl9yZDMyKGRldiwgMHhlMDUwKTsKLQlpZiAoZGV2X3ByaXYtPmNoaXBzZXQgPj0gMHg5MCkKLQkJaHBkMSAmPSBudl9yZDMyKGRldiwgMHhlMDcwKTsKLQotCXBsdWdfbWFzayAgID0gKGhwZDAgJiAweDAwMDBmZmZmKSB8IChocGQxIDw8IDE2KTsKLQl1bnBsdWdfbWFzayA9IChocGQwID4+IDE2KSB8IChocGQxICYgMHhmZmZmMDAwMCk7Ci0JY2hhbmdlX21hc2sgPSBwbHVnX21hc2sgfCB1bnBsdWdfbWFzazsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnkoY29ubmVjdG9yLCAmZGV2LT5tb2RlX2NvbmZpZy5jb25uZWN0b3JfbGlzdCwgaGVhZCkgewotCQlzdHJ1Y3QgZHJtX2VuY29kZXJfaGVscGVyX2Z1bmNzICpoZWxwZXI7Ci0JCXN0cnVjdCBub3V2ZWF1X2Nvbm5lY3RvciAqbnZfY29ubmVjdG9yID0KLQkJCW5vdXZlYXVfY29ubmVjdG9yKGNvbm5lY3Rvcik7Ci0JCXN0cnVjdCBub3V2ZWF1X2VuY29kZXIgKm52X2VuY29kZXI7Ci0JCXN0cnVjdCBkY2JfZ3Bpb19lbnRyeSAqZ3BpbzsKLQkJdWludDMyX3QgcmVnOwotCQlib29sIHBsdWdnZWQ7Ci0KLQkJaWYgKCFudl9jb25uZWN0b3ItPmRjYikKKwlmb3IgKGNoaWQgPSAwOyBjaGlkIDwgNTsgY2hpZCsrKSB7CisJCWlmICghKGNoYW5uZWxzICYgKDEgPDwgY2hpZCkpKQogCQkJY29udGludWU7CiAKLQkJZ3BpbyA9IG5vdXZlYXVfYmlvc19ncGlvX2VudHJ5KGRldiwgbnZfY29ubmVjdG9yLT5kY2ItPmdwaW9fdGFnKTsKLQkJaWYgKCFncGlvIHx8ICEoY2hhbmdlX21hc2sgJiAoMSA8PCBncGlvLT5saW5lKSkpCi0JCQljb250aW51ZTsKKwkJbnZfd3IzMihkZXYsIE5WNTBfUERJU1BMQVlfSU5UUl8wLCAweDAwMDEwMDAwIDw8IGNoaWQpOworCQlhZGRyID0gbnZfcmQzMihkZXYsIE5WNTBfUERJU1BMQVlfVFJBUFBFRF9BRERSKGNoaWQpKTsKKwkJZGF0YSA9IG52X3JkMzIoZGV2LCBOVjUwX1BESVNQTEFZX1RSQVBQRURfREFUQShjaGlkKSk7CisJCU5WX0VSUk9SKGRldiwgIkV2b0NoICVkIE10aGQgMHglMDR4IERhdGEgMHglMDh4ICIKKwkJCSAgICAgICIoMHglMDR4IDB4JTAyeClcbiIsIGNoaWQsCisJCQkgYWRkciAmIDB4ZmZjLCBkYXRhLCBhZGRyID4+IDE2LCAoYWRkciA+PiAxMikgJiAweGYpOwogCi0JCXJlZyA9IG52X3JkMzIoZGV2LCBncGlvX3JlZ1tncGlvLT5saW5lID4+IDNdKTsKLQkJcGx1Z2dlZCA9ICEhKHJlZyAmICg0IDw8ICgoZ3Bpby0+bGluZSAmIDcpIDw8IDIpKSk7Ci0JCU5WX0lORk8oZGV2LCAiJXNwbHVnZ2VkICVzXG4iLCBwbHVnZ2VkID8gIiIgOiAidW4iLAotCQkJZHJtX2dldF9jb25uZWN0b3JfbmFtZShjb25uZWN0b3IpKSA7Ci0KLQkJaWYgKCFjb25uZWN0b3ItPmVuY29kZXIgfHwgIWNvbm5lY3Rvci0+ZW5jb2Rlci0+Y3J0YyB8fAotCQkgICAgIWNvbm5lY3Rvci0+ZW5jb2Rlci0+Y3J0Yy0+ZW5hYmxlZCkKLQkJCWNvbnRpbnVlOwotCQludl9lbmNvZGVyID0gbm91dmVhdV9lbmNvZGVyKGNvbm5lY3Rvci0+ZW5jb2Rlcik7Ci0JCWhlbHBlciA9IGNvbm5lY3Rvci0+ZW5jb2Rlci0+aGVscGVyX3ByaXZhdGU7Ci0KLQkJaWYgKG52X2VuY29kZXItPmRjYi0+dHlwZSAhPSBPVVRQVVRfRFApCi0JCQljb250aW51ZTsKLQotCQlpZiAocGx1Z2dlZCkKLQkJCWhlbHBlci0+ZHBtcyhjb25uZWN0b3ItPmVuY29kZXIsIERSTV9NT0RFX0RQTVNfT04pOwotCQllbHNlCi0JCQloZWxwZXItPmRwbXMoY29ubmVjdG9yLT5lbmNvZGVyLCBEUk1fTU9ERV9EUE1TX09GRik7CisJCW52X3dyMzIoZGV2LCBOVjUwX1BESVNQTEFZX1RSQVBQRURfQUREUihjaGlkKSwgMHg5MDAwMDAwMCk7CiAJfQotCi0JZHJtX2hlbHBlcl9ocGRfaXJxX2V2ZW50KGRldik7CiB9CiAKLXZvaWQKLW52NTBfZGlzcGxheV9pcnFfaGFuZGxlcihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQorc3RhdGljIHZvaWQKK252NTBfZGlzcGxheV9pc3Ioc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXVpbnQzMl90IGRlbGF5ZWQgPSAwOwogCi0JaWYgKG52X3JkMzIoZGV2LCBOVjUwX1BNQ19JTlRSXzApICYgTlY1MF9QTUNfSU5UUl8wX0hPVFBMVUcpIHsKLQkJdWludDMyX3QgaHBkMF9iaXRzLCBocGQxX2JpdHMgPSAwOwotCi0JCWhwZDBfYml0cyA9IG52X3JkMzIoZGV2LCAweGUwNTQpOwotCQludl93cjMyKGRldiwgMHhlMDU0LCBocGQwX2JpdHMpOwotCi0JCWlmIChkZXZfcHJpdi0+Y2hpcHNldCA+PSAweDkwKSB7Ci0JCQlocGQxX2JpdHMgPSBudl9yZDMyKGRldiwgMHhlMDc0KTsKLQkJCW52X3dyMzIoZGV2LCAweGUwNzQsIGhwZDFfYml0cyk7Ci0JCX0KLQotCQlzcGluX2xvY2soJmRldl9wcml2LT5ocGRfc3RhdGUubG9jayk7Ci0JCWRldl9wcml2LT5ocGRfc3RhdGUuaHBkMF9iaXRzIHw9IGhwZDBfYml0czsKLQkJZGV2X3ByaXYtPmhwZF9zdGF0ZS5ocGQxX2JpdHMgfD0gaHBkMV9iaXRzOwotCQlzcGluX3VubG9jaygmZGV2X3ByaXYtPmhwZF9zdGF0ZS5sb2NrKTsKLQotCQlxdWV1ZV93b3JrKGRldl9wcml2LT53cSwgJmRldl9wcml2LT5ocGRfd29yayk7Ci0JfQotCiAJd2hpbGUgKG52X3JkMzIoZGV2LCBOVjUwX1BNQ19JTlRSXzApICYgTlY1MF9QTUNfSU5UUl8wX0RJU1BMQVkpIHsKIAkJdWludDMyX3QgaW50cjAgPSBudl9yZDMyKGRldiwgTlY1MF9QRElTUExBWV9JTlRSXzApOwogCQl1aW50MzJfdCBpbnRyMSA9IG52X3JkMzIoZGV2LCBOVjUwX1BESVNQTEFZX0lOVFJfMSk7CkBAIC0xMTIzLDkgKzgyMCw5IEBACiAJCWlmICghaW50cjAgJiYgIShpbnRyMSAmIH5kZWxheWVkKSkKIAkJCWJyZWFrOwogCi0JCWlmIChpbnRyMCAmIDB4MDAwMTAwMDApIHsKKwkJaWYgKGludHIwICYgMHgwMDFmMDAwMCkgewogCQkJbnY1MF9kaXNwbGF5X2Vycm9yX2hhbmRsZXIoZGV2KTsKLQkJCWludHIwICY9IH4weDAwMDEwMDAwOworCQkJaW50cjAgJj0gfjB4MDAxZjAwMDA7CiAJCX0KIAogCQlpZiAoaW50cjEgJiBOVjUwX1BESVNQTEFZX0lOVFJfMV9WQkxBTktfQ1JUQykgewpAQCAtMTE1Niw0ICs4NTMsMyBAQAogCQl9CiAJfQogfQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjUwX2Rpc3BsYXkuaCBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252NTBfZGlzcGxheS5oCmluZGV4IGM1NTFmMGIuLmYwZTMwYjc4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjUwX2Rpc3BsYXkuaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjUwX2Rpc3BsYXkuaApAQCAtMzUsOSArMzUsNyBAQAogI2luY2x1ZGUgIm5vdXZlYXVfY3J0Yy5oIgogI2luY2x1ZGUgIm52NTBfZXZvLmgiCiAKLXZvaWQgbnY1MF9kaXNwbGF5X2lycV9oYW5kbGVyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwogdm9pZCBudjUwX2Rpc3BsYXlfaXJxX2hhbmRsZXJfYmgoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKLXZvaWQgbnY1MF9kaXNwbGF5X2lycV9ob3RwbHVnX2JoKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CiBpbnQgbnY1MF9kaXNwbGF5X2Vhcmx5X2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CiB2b2lkIG52NTBfZGlzcGxheV9sYXRlX3Rha2Vkb3duKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwogaW50IG52NTBfZGlzcGxheV9jcmVhdGUoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjUwX2V2by5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnY1MF9ldm8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNGUyNGU5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnY1MF9ldm8uYwpAQCAtMCwwICsxLDM0NSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDEwIFJlZCBIYXQgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIENPUFlSSUdIVCBIT0xERVIoUykgT1IgQVVUSE9SKFMpIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIEF1dGhvcnM6IEJlbiBTa2VnZ3MKKyAqLworCisjaW5jbHVkZSAiZHJtUC5oIgorCisjaW5jbHVkZSAibm91dmVhdV9kcnYuaCIKKyNpbmNsdWRlICJub3V2ZWF1X2RtYS5oIgorI2luY2x1ZGUgIm5vdXZlYXVfcmFtaHQuaCIKKworc3RhdGljIHZvaWQKK252NTBfZXZvX2NoYW5uZWxfZGVsKHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKipwZXZvKQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdjsKKwlzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpldm8gPSAqcGV2bzsKKworCWlmICghZXZvKQorCQlyZXR1cm47CisJKnBldm8gPSBOVUxMOworCisJZGV2X3ByaXYgPSBldm8tPmRldi0+ZGV2X3ByaXZhdGU7CisJZGV2X3ByaXYtPmV2b19hbGxvYyAmPSB+KDEgPDwgZXZvLT5pZCk7CisKKwlub3V2ZWF1X2dwdW9ial9jaGFubmVsX3Rha2Vkb3duKGV2byk7CisJbm91dmVhdV9ib191bm1hcChldm8tPnB1c2hidWZfYm8pOworCW5vdXZlYXVfYm9fcmVmKE5VTEwsICZldm8tPnB1c2hidWZfYm8pOworCisJaWYgKGV2by0+dXNlcikKKwkJaW91bm1hcChldm8tPnVzZXIpOworCisJa2ZyZWUoZXZvKTsKK30KKworaW50CitudjUwX2V2b19kbWFvYmpfbmV3KHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmV2bywgdTMyIGNsYXNzLCB1MzIgbmFtZSwKKwkJICAgIHUzMiB0aWxlX2ZsYWdzLCB1MzIgbWFnaWNfZmxhZ3MsIHUzMiBvZmZzZXQsIHUzMiBsaW1pdCwKKwkJICAgIHUzMiBmbGFnczUpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZXZvLT5kZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBldm8tPmRldjsKKwlzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKm9iaiA9IE5VTEw7CisJaW50IHJldDsKKworCXJldCA9IG5vdXZlYXVfZ3B1b2JqX25ldyhkZXYsIGRldl9wcml2LT5ldm8sIDYqNCwgMzIsIDAsICZvYmopOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisJb2JqLT5lbmdpbmUgPSBOVk9CSl9FTkdJTkVfRElTUExBWTsKKworCW52X3dvMzIob2JqLCAgMCwgKHRpbGVfZmxhZ3MgPDwgMjIpIHwgKG1hZ2ljX2ZsYWdzIDw8IDE2KSB8IGNsYXNzKTsKKwludl93bzMyKG9iaiwgIDQsIGxpbWl0KTsKKwludl93bzMyKG9iaiwgIDgsIG9mZnNldCk7CisJbnZfd28zMihvYmosIDEyLCAweDAwMDAwMDAwKTsKKwludl93bzMyKG9iaiwgMTYsIDB4MDAwMDAwMDApOworCW52X3dvMzIob2JqLCAyMCwgZmxhZ3M1KTsKKwlkZXZfcHJpdi0+ZW5naW5lLmluc3RtZW0uZmx1c2goZGV2KTsKKworCXJldCA9IG5vdXZlYXVfcmFtaHRfaW5zZXJ0KGV2bywgbmFtZSwgb2JqKTsKKwlub3V2ZWF1X2dwdW9ial9yZWYoTlVMTCwgJm9iaik7CisJaWYgKHJldCkgeworCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitudjUwX2V2b19jaGFubmVsX25ldyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICoqcGV2bykKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmV2bzsKKwlpbnQgcmV0OworCisJZXZvID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCksIEdGUF9LRVJORUwpOworCWlmICghZXZvKQorCQlyZXR1cm4gLUVOT01FTTsKKwkqcGV2byA9IGV2bzsKKworCWZvciAoZXZvLT5pZCA9IDA7IGV2by0+aWQgPCA1OyBldm8tPmlkKyspIHsKKwkJaWYgKGRldl9wcml2LT5ldm9fYWxsb2MgJiAoMSA8PCBldm8tPmlkKSkKKwkJCWNvbnRpbnVlOworCisJCWRldl9wcml2LT5ldm9fYWxsb2MgfD0gKDEgPDwgZXZvLT5pZCk7CisJCWJyZWFrOworCX0KKworCWlmIChldm8tPmlkID09IDUpIHsKKwkJa2ZyZWUoZXZvKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJZXZvLT5kZXYgPSBkZXY7CisJZXZvLT51c2VyX2dldCA9IDQ7CisJZXZvLT51c2VyX3B1dCA9IDA7CisKKwlyZXQgPSBub3V2ZWF1X2JvX25ldyhkZXYsIE5VTEwsIDQwOTYsIDAsIFRUTV9QTF9GTEFHX1ZSQU0sIDAsIDAsCisJCQkgICAgIGZhbHNlLCB0cnVlLCAmZXZvLT5wdXNoYnVmX2JvKTsKKwlpZiAocmV0ID09IDApCisJCXJldCA9IG5vdXZlYXVfYm9fcGluKGV2by0+cHVzaGJ1Zl9ibywgVFRNX1BMX0ZMQUdfVlJBTSk7CisJaWYgKHJldCkgeworCQlOVl9FUlJPUihkZXYsICJFcnJvciBjcmVhdGluZyBFVk8gRE1BIHB1c2ggYnVmZmVyOiAlZFxuIiwgcmV0KTsKKwkJbnY1MF9ldm9fY2hhbm5lbF9kZWwocGV2byk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gbm91dmVhdV9ib19tYXAoZXZvLT5wdXNoYnVmX2JvKTsKKwlpZiAocmV0KSB7CisJCU5WX0VSUk9SKGRldiwgIkVycm9yIG1hcHBpbmcgRVZPIERNQSBwdXNoIGJ1ZmZlcjogJWRcbiIsIHJldCk7CisJCW52NTBfZXZvX2NoYW5uZWxfZGVsKHBldm8pOworCQlyZXR1cm4gcmV0OworCX0KKworCWV2by0+dXNlciA9IGlvcmVtYXAocGNpX3Jlc291cmNlX3N0YXJ0KGRldi0+cGRldiwgMCkgKworCQkJICAgIE5WNTBfUERJU1BMQVlfVVNFUihldm8tPmlkKSwgUEFHRV9TSVpFKTsKKwlpZiAoIWV2by0+dXNlcikgeworCQlOVl9FUlJPUihkZXYsICJFcnJvciBtYXBwaW5nIEVWTyBjb250cm9sIHJlZ3MuXG4iKTsKKwkJbnY1MF9ldm9fY2hhbm5lbF9kZWwocGV2byk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCS8qIGJpbmQgcHJpbWFyeSBldm8gY2hhbm5lbCdzIHJhbWh0IHRvIHRoZSBjaGFubmVsICovCisJaWYgKGRldl9wcml2LT5ldm8gJiYgZXZvICE9IGRldl9wcml2LT5ldm8pCisJCW5vdXZlYXVfcmFtaHRfcmVmKGRldl9wcml2LT5ldm8tPnJhbWh0LCAmZXZvLT5yYW1odCwgTlVMTCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorbnY1MF9ldm9fY2hhbm5lbF9pbml0KHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmV2bykKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZXZvLT5kZXY7CisJaW50IGlkID0gZXZvLT5pZCwgcmV0LCBpOworCXU2NCBwdXNoYnVmID0gZXZvLT5wdXNoYnVmX2JvLT5iby5tZW0uc3RhcnQgPDwgUEFHRV9TSElGVDsKKwl1MzIgdG1wOworCisJdG1wID0gbnZfcmQzMihkZXYsIE5WNTBfUERJU1BMQVlfRVZPX0NUUkwoaWQpKTsKKwlpZiAoKHRtcCAmIDB4MDA5ZjAwMDApID09IDB4MDAwMjAwMDApCisJCW52X3dyMzIoZGV2LCBOVjUwX1BESVNQTEFZX0VWT19DVFJMKGlkKSwgdG1wIHwgMHgwMDgwMDAwMCk7CisKKwl0bXAgPSBudl9yZDMyKGRldiwgTlY1MF9QRElTUExBWV9FVk9fQ1RSTChpZCkpOworCWlmICgodG1wICYgMHgwMDNmMDAwMCkgPT0gMHgwMDAzMDAwMCkKKwkJbnZfd3IzMihkZXYsIE5WNTBfUERJU1BMQVlfRVZPX0NUUkwoaWQpLCB0bXAgfCAweDAwNjAwMDAwKTsKKworCS8qIGluaXRpYWxpc2UgZmlmbyAqLworCW52X3dyMzIoZGV2LCBOVjUwX1BESVNQTEFZX0VWT19ETUFfQ0IoaWQpLCBwdXNoYnVmID4+IDggfAorCQkgICAgIE5WNTBfUERJU1BMQVlfRVZPX0RNQV9DQl9MT0NBVElPTl9WUkFNIHwKKwkJICAgICBOVjUwX1BESVNQTEFZX0VWT19ETUFfQ0JfVkFMSUQpOworCW52X3dyMzIoZGV2LCBOVjUwX1BESVNQTEFZX0VWT19VTksyKGlkKSwgMHgwMDAxMDAwMCk7CisJbnZfd3IzMihkZXYsIE5WNTBfUERJU1BMQVlfRVZPX0hBU0hfVEFHKGlkKSwgaWQpOworCW52X21hc2soZGV2LCBOVjUwX1BESVNQTEFZX0VWT19DVFJMKGlkKSwgTlY1MF9QRElTUExBWV9FVk9fQ1RSTF9ETUEsCisJCSAgICAgTlY1MF9QRElTUExBWV9FVk9fQ1RSTF9ETUFfRU5BQkxFRCk7CisKKwludl93cjMyKGRldiwgTlY1MF9QRElTUExBWV9VU0VSX1BVVChpZCksIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCBOVjUwX1BESVNQTEFZX0VWT19DVFJMKGlkKSwgMHgwMTAwMDAwMyB8CisJCSAgICAgTlY1MF9QRElTUExBWV9FVk9fQ1RSTF9ETUFfRU5BQkxFRCk7CisJaWYgKCFudl93YWl0KGRldiwgTlY1MF9QRElTUExBWV9FVk9fQ1RSTChpZCksIDB4ODAwMDAwMDAsIDB4MDAwMDAwMDApKSB7CisJCU5WX0VSUk9SKGRldiwgIkV2b0NoICVkIGluaXQgdGltZW91dDogMHglMDh4XG4iLCBpZCwKKwkJCSBudl9yZDMyKGRldiwgTlY1MF9QRElTUExBWV9FVk9fQ1RSTChpZCkpKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwkvKiBlbmFibGUgZXJyb3IgcmVwb3J0aW5nIG9uIHRoZSBjaGFubmVsICovCisJbnZfbWFzayhkZXYsIDB4NjEwMDI4LCAweDAwMDAwMDAwLCAweDAwMDEwMDAxIDw8IGlkKTsKKworCWV2by0+ZG1hLm1heCA9ICg0MDk2LzQpIC0gMjsKKwlldm8tPmRtYS5wdXQgPSAwOworCWV2by0+ZG1hLmN1ciA9IGV2by0+ZG1hLnB1dDsKKwlldm8tPmRtYS5mcmVlID0gZXZvLT5kbWEubWF4IC0gZXZvLT5kbWEuY3VyOworCisJcmV0ID0gUklOR19TUEFDRShldm8sIE5PVVZFQVVfRE1BX1NLSVBTKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJZm9yIChpID0gMDsgaSA8IE5PVVZFQVVfRE1BX1NLSVBTOyBpKyspCisJCU9VVF9SSU5HKGV2bywgMCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQKK252NTBfZXZvX2NoYW5uZWxfZmluaShzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpldm8pCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGV2by0+ZGV2OworCWludCBpZCA9IGV2by0+aWQ7CisKKwludl9tYXNrKGRldiwgMHg2MTAwMjgsIDB4MDAwMTAwMDEgPDwgaWQsIDB4MDAwMDAwMDApOworCW52X21hc2soZGV2LCBOVjUwX1BESVNQTEFZX0VWT19DVFJMKGlkKSwgMHgwMDAwMTAxMCwgMHgwMDAwMTAwMCk7CisJbnZfd3IzMihkZXYsIE5WNTBfUERJU1BMQVlfSU5UUl8wLCAoMSA8PCBpZCkpOworCW52X21hc2soZGV2LCBOVjUwX1BESVNQTEFZX0VWT19DVFJMKGlkKSwgMHgwMDAwMDAwMywgMHgwMDAwMDAwMCk7CisJaWYgKCFudl93YWl0KGRldiwgTlY1MF9QRElTUExBWV9FVk9fQ1RSTChpZCksIDB4MDAxZTAwMDAsIDB4MDAwMDAwMDApKSB7CisJCU5WX0VSUk9SKGRldiwgIkV2b0NoICVkIHRha2Vkb3duIHRpbWVvdXQ6IDB4JTA4eFxuIiwgaWQsCisJCQkgbnZfcmQzMihkZXYsIE5WNTBfUERJU1BMQVlfRVZPX0NUUkwoaWQpKSk7CisJfQorfQorCitzdGF0aWMgaW50CitudjUwX2V2b19jcmVhdGUoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqcmFtaHQgPSBOVUxMOworCXN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmV2bzsKKwlpbnQgcmV0OworCisJLyogY3JlYXRlIHByaW1hcnkgZXZvIGNoYW5uZWwsIHRoZSBvbmUgd2UgdXNlIGZvciBtb2Rlc2V0dGluZworCSAqIHB1cnBvcnNlcworCSAqLworCXJldCA9IG52NTBfZXZvX2NoYW5uZWxfbmV3KGRldiwgJmRldl9wcml2LT5ldm8pOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisJZXZvID0gZGV2X3ByaXYtPmV2bzsKKworCS8qIHNldHVwIG9iamVjdCBtYW5hZ2VtZW50IG9uIGl0LCBhbnkgb3RoZXIgZXZvIGNoYW5uZWwgd2lsbAorCSAqIHVzZSB0aGlzIGFsc28gYXMgdGhlcmUncyBubyBwZXItY2hhbm5lbCBzdXBwb3J0IG9uIHRoZQorCSAqIGhhcmR3YXJlCisJICovCisJcmV0ID0gbm91dmVhdV9ncHVvYmpfbmV3KGRldiwgTlVMTCwgMzI3NjgsIDY1NTM2LAorCQkJCSBOVk9CSl9GTEFHX1pFUk9fQUxMT0MsICZldm8tPnJhbWluKTsKKwlpZiAocmV0KSB7CisJCU5WX0VSUk9SKGRldiwgIkVycm9yIGFsbG9jYXRpbmcgRVZPIGNoYW5uZWwgbWVtb3J5OiAlZFxuIiwgcmV0KTsKKwkJbnY1MF9ldm9fY2hhbm5lbF9kZWwoJmRldl9wcml2LT5ldm8pOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldCA9IGRybV9tbV9pbml0KCZldm8tPnJhbWluX2hlYXAsIDAsIDMyNzY4KTsKKwlpZiAocmV0KSB7CisJCU5WX0VSUk9SKGRldiwgIkVycm9yIGluaXRpYWxpc2luZyBFVk8gUFJBTUlOIGhlYXA6ICVkXG4iLCByZXQpOworCQludjUwX2V2b19jaGFubmVsX2RlbCgmZGV2X3ByaXYtPmV2byk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gbm91dmVhdV9ncHVvYmpfbmV3KGRldiwgZXZvLCA0MDk2LCAxNiwgMCwgJnJhbWh0KTsKKwlpZiAocmV0KSB7CisJCU5WX0VSUk9SKGRldiwgIlVuYWJsZSB0byBhbGxvY2F0ZSBFVk8gUkFNSFQ6ICVkXG4iLCByZXQpOworCQludjUwX2V2b19jaGFubmVsX2RlbCgmZGV2X3ByaXYtPmV2byk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gbm91dmVhdV9yYW1odF9uZXcoZGV2LCByYW1odCwgJmV2by0+cmFtaHQpOworCW5vdXZlYXVfZ3B1b2JqX3JlZihOVUxMLCAmcmFtaHQpOworCWlmIChyZXQpIHsKKwkJbnY1MF9ldm9fY2hhbm5lbF9kZWwoJmRldl9wcml2LT5ldm8pOworCQlyZXR1cm4gcmV0OworCX0KKworCS8qIGNyZWF0ZSBzb21lIGRlZmF1bHQgb2JqZWN0cyBmb3IgdGhlIHNjYW5vdXQgbWVtdHlwZXMgd2Ugc3VwcG9ydCAqLworCWlmIChkZXZfcHJpdi0+Y2FyZF90eXBlID49IE5WX0MwKSB7CisJCXJldCA9IG52NTBfZXZvX2RtYW9ial9uZXcoZXZvLCAweDNkLCBOdkV2b0ZCMzIsIDB4ZmUsIDB4MTksCisJCQkJCSAgMCwgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCk7CisJCWlmIChyZXQpIHsKKwkJCW52NTBfZXZvX2NoYW5uZWxfZGVsKCZkZXZfcHJpdi0+ZXZvKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKworCQlyZXQgPSBudjUwX2V2b19kbWFvYmpfbmV3KGV2bywgMHgzZCwgTnZFdm9WUkFNLCAwLCAweDE5LAorCQkJCQkgIDAsIGRldl9wcml2LT52cmFtX3NpemUsIDB4MDAwMjAwMDApOworCQlpZiAocmV0KSB7CisJCQludjUwX2V2b19jaGFubmVsX2RlbCgmZGV2X3ByaXYtPmV2byk7CisJCQlyZXR1cm4gcmV0OworCQl9CisKKwkJcmV0ID0gbnY1MF9ldm9fZG1hb2JqX25ldyhldm8sIDB4M2QsIE52RXZvVlJBTV9MUCwgMCwgMHgxOSwKKwkJCQkJICAwLCBkZXZfcHJpdi0+dnJhbV9zaXplLCAweDAwMDAwMDAwKTsKKwkJaWYgKHJldCkgeworCQkJbnY1MF9ldm9fY2hhbm5lbF9kZWwoJmRldl9wcml2LT5ldm8pOworCQkJcmV0dXJuIHJldDsKKwkJfQorCX0gZWxzZQorCWlmIChkZXZfcHJpdi0+Y2hpcHNldCAhPSAweDUwKSB7CisJCXJldCA9IG52NTBfZXZvX2RtYW9ial9uZXcoZXZvLCAweDNkLCBOdkV2b0ZCMTYsIDB4NzAsIDB4MTksCisJCQkJCSAgMCwgMHhmZmZmZmZmZiwgMHgwMDAxMDAwMCk7CisJCWlmIChyZXQpIHsKKwkJCW52NTBfZXZvX2NoYW5uZWxfZGVsKCZkZXZfcHJpdi0+ZXZvKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKworCisJCXJldCA9IG52NTBfZXZvX2RtYW9ial9uZXcoZXZvLCAweDNkLCBOdkV2b0ZCMzIsIDB4N2EsIDB4MTksCisJCQkJCSAgMCwgMHhmZmZmZmZmZiwgMHgwMDAxMDAwMCk7CisJCWlmIChyZXQpIHsKKwkJCW52NTBfZXZvX2NoYW5uZWxfZGVsKCZkZXZfcHJpdi0+ZXZvKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKworCQlyZXQgPSBudjUwX2V2b19kbWFvYmpfbmV3KGV2bywgMHgzZCwgTnZFdm9WUkFNLCAwLCAweDE5LAorCQkJCQkgIDAsIGRldl9wcml2LT52cmFtX3NpemUsIDB4MDAwMTAwMDApOworCQlpZiAocmV0KSB7CisJCQludjUwX2V2b19jaGFubmVsX2RlbCgmZGV2X3ByaXYtPmV2byk7CisJCQlyZXR1cm4gcmV0OworCQl9CisKKwkJcmV0ID0gbnY1MF9ldm9fZG1hb2JqX25ldyhldm8sIDB4M2QsIE52RXZvVlJBTV9MUCwgMCwgMHgxOSwKKwkJCQkJICAwLCBkZXZfcHJpdi0+dnJhbV9zaXplLCAweDAwMDEwMDAwKTsKKwkJaWYgKHJldCkgeworCQkJbnY1MF9ldm9fY2hhbm5lbF9kZWwoJmRldl9wcml2LT5ldm8pOworCQkJcmV0dXJuIHJldDsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCitpbnQKK252NTBfZXZvX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWludCByZXQ7CisKKwlpZiAoIWRldl9wcml2LT5ldm8pIHsKKwkJcmV0ID0gbnY1MF9ldm9fY3JlYXRlKGRldik7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiBudjUwX2V2b19jaGFubmVsX2luaXQoZGV2X3ByaXYtPmV2byk7Cit9CisKK3ZvaWQKK252NTBfZXZvX2Zpbmkoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCisJaWYgKGRldl9wcml2LT5ldm8pIHsKKwkJbnY1MF9ldm9fY2hhbm5lbF9maW5pKGRldl9wcml2LT5ldm8pOworCQludjUwX2V2b19jaGFubmVsX2RlbCgmZGV2X3ByaXYtPmV2byk7CisJfQorfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnY1MF9ldm8uaCBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252NTBfZXZvLmgKaW5kZXggYWFlMTMzNC4uYWE0ZjBkMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnY1MF9ldm8uaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjUwX2V2by5oCkBAIC0yNCw2ICsyNCwxNSBAQAogICoKICAqLwogCisjaWZuZGVmIF9fTlY1MF9FVk9fSF9fCisjZGVmaW5lIF9fTlY1MF9FVk9fSF9fCisKK2ludCAgbnY1MF9ldm9faW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKK3ZvaWQgbnY1MF9ldm9fZmluaShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKK2ludCAgbnY1MF9ldm9fZG1hb2JqX25ldyhzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICosIHUzMiBjbGFzcywgdTMyIG5hbWUsCisJCQkgdTMyIHRpbGVfZmxhZ3MsIHUzMiBtYWdpY19mbGFncywKKwkJCSB1MzIgb2Zmc2V0LCB1MzIgbGltaXQpOworCiAjZGVmaW5lIE5WNTBfRVZPX1VQREFURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDgwCiAjZGVmaW5lIE5WNTBfRVZPX1VOSzg0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDg0CiAjZGVmaW5lIE5WNTBfRVZPX1VOSzg0X05PVElGWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwMDAwMDAwCkBAIC0xMTEsMyArMTIwLDQgQEAKICNkZWZpbmUgTlY1MF9FVk9fQ1JUQ19TQ0FMRV9SRVMxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA4ZDgKICNkZWZpbmUgTlY1MF9FVk9fQ1JUQ19TQ0FMRV9SRVMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA4ZGMKIAorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjUwX2ZiLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjUwX2ZiLmMKaW5kZXggY2QxOTg4Yi4uNTAyOTBkZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnY1MF9mYi5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252NTBfZmIuYwpAQCAtMywzMCArMyw3NSBAQAogI2luY2x1ZGUgIm5vdXZlYXVfZHJ2LmgiCiAjaW5jbHVkZSAibm91dmVhdV9kcm0uaCIKIAorc3RydWN0IG52NTBfZmJfcHJpdiB7CisJc3RydWN0IHBhZ2UgKnIxMDBjMDhfcGFnZTsKKwlkbWFfYWRkcl90IHIxMDBjMDg7Cit9OworCitzdGF0aWMgaW50CitudjUwX2ZiX2NyZWF0ZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG52NTBfZmJfcHJpdiAqcHJpdjsKKworCXByaXYgPSBremFsbG9jKHNpemVvZigqcHJpdiksIEdGUF9LRVJORUwpOworCWlmICghcHJpdikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlwcml2LT5yMTAwYzA4X3BhZ2UgPSBhbGxvY19wYWdlKEdGUF9LRVJORUwgfCBfX0dGUF9aRVJPKTsKKwlpZiAoIXByaXYtPnIxMDBjMDhfcGFnZSkgeworCQlrZnJlZShwcml2KTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJcHJpdi0+cjEwMGMwOCA9IHBjaV9tYXBfcGFnZShkZXYtPnBkZXYsIHByaXYtPnIxMDBjMDhfcGFnZSwgMCwKKwkJCQkgICAgIFBBR0VfU0laRSwgUENJX0RNQV9CSURJUkVDVElPTkFMKTsKKwlpZiAocGNpX2RtYV9tYXBwaW5nX2Vycm9yKGRldi0+cGRldiwgcHJpdi0+cjEwMGMwOCkpIHsKKwkJX19mcmVlX3BhZ2UocHJpdi0+cjEwMGMwOF9wYWdlKTsKKwkJa2ZyZWUocHJpdik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCWRldl9wcml2LT5lbmdpbmUuZmIucHJpdiA9IHByaXY7CisJcmV0dXJuIDA7Cit9CisKIGludAogbnY1MF9mYl9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgbnY1MF9mYl9wcml2ICpwcml2OworCWludCByZXQ7CisKKwlpZiAoIWRldl9wcml2LT5lbmdpbmUuZmIucHJpdikgeworCQlyZXQgPSBudjUwX2ZiX2NyZWF0ZShkZXYpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwl9CisJcHJpdiA9IGRldl9wcml2LT5lbmdpbmUuZmIucHJpdjsKIAogCS8qIE5vdCBhIGNsdWUgd2hhdCB0aGlzIGlzIGV4YWN0bHkuICBXaXRob3V0IHBvaW50aW5nIGl0IGF0IGEKIAkgKiBzY3JhdGNoIHBhZ2UsIFZSQU0tPkdBUlQgYmxpdHMgd2l0aCBNMk1GIChhcyBpbiBERFggREZTKQogCSAqIGNhdXNlIElPTU1VICJyZWFkIGZyb20gYWRkcmVzcyAwIiBlcnJvcnMgKHJoIzU2MTI2NykKIAkgKi8KLQludl93cjMyKGRldiwgMHgxMDBjMDgsIGRldl9wcml2LT5nYXJ0X2luZm8uc2dfZHVtbXlfYnVzID4+IDgpOworCW52X3dyMzIoZGV2LCAweDEwMGMwOCwgcHJpdi0+cjEwMGMwOCA+PiA4KTsKIAogCS8qIFRoaXMgaXMgbmVlZGVkIHRvIGdldCBtZWFuaW5nZnVsIGluZm9ybWF0aW9uIGZyb20gMTAwYzkwCiAJICogb24gdHJhcHMuIE5vIGlkZWEgd2hhdCB0aGVzZSB2YWx1ZXMgbWVhbiBleGFjdGx5LiAqLwogCXN3aXRjaCAoZGV2X3ByaXYtPmNoaXBzZXQpIHsKIAljYXNlIDB4NTA6Ci0JCW52X3dyMzIoZGV2LCAweDEwMGM5MCwgMHgwNzA3ZmYpOworCQludl93cjMyKGRldiwgMHgxMDBjOTAsIDB4MDAwNzA3ZmYpOwogCQlicmVhazsKIAljYXNlIDB4YTM6CiAJY2FzZSAweGE1OgogCWNhc2UgMHhhODoKLQkJbnZfd3IzMihkZXYsIDB4MTAwYzkwLCAweDBkMGZmZik7CisJCW52X3dyMzIoZGV2LCAweDEwMGM5MCwgMHgwMDBkMGZmZik7CisJCWJyZWFrOworCWNhc2UgMHhhZjoKKwkJbnZfd3IzMihkZXYsIDB4MTAwYzkwLCAweDA4OWQxZmZmKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJbnZfd3IzMihkZXYsIDB4MTAwYzkwLCAweDFkMDdmZik7CisJCW52X3dyMzIoZGV2LCAweDEwMGM5MCwgMHgwMDFkMDdmZik7CiAJCWJyZWFrOwogCX0KIApAQCAtMzYsMTIgKzgxLDI1IEBACiB2b2lkCiBudjUwX2ZiX3Rha2Vkb3duKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgbnY1MF9mYl9wcml2ICpwcml2OworCisJcHJpdiA9IGRldl9wcml2LT5lbmdpbmUuZmIucHJpdjsKKwlpZiAoIXByaXYpCisJCXJldHVybjsKKwlkZXZfcHJpdi0+ZW5naW5lLmZiLnByaXYgPSBOVUxMOworCisJcGNpX3VubWFwX3BhZ2UoZGV2LT5wZGV2LCBwcml2LT5yMTAwYzA4LCBQQUdFX1NJWkUsCisJCSAgICAgICBQQ0lfRE1BX0JJRElSRUNUSU9OQUwpOworCV9fZnJlZV9wYWdlKHByaXYtPnIxMDBjMDhfcGFnZSk7CisJa2ZyZWUocHJpdik7CiB9CiAKIHZvaWQKIG52NTBfZmJfdm1fdHJhcChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgZGlzcGxheSwgY29uc3QgY2hhciAqbmFtZSkKIHsKIAlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdTMyIHRyYXBbNl0sIGlkeCwgY2hpbnN0OwogCWludCBpLCBjaDsKIApAQCAtNjAsOCArMTE4LDEwIEBACiAJCXJldHVybjsKIAogCWNoaW5zdCA9ICh0cmFwWzJdIDw8IDE2KSB8IHRyYXBbMV07CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2X3ByaXYtPmNoYW5uZWxzLmxvY2ssIGZsYWdzKTsKIAlmb3IgKGNoID0gMDsgY2ggPCBkZXZfcHJpdi0+ZW5naW5lLmZpZm8uY2hhbm5lbHM7IGNoKyspIHsKLQkJc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbiA9IGRldl9wcml2LT5maWZvc1tjaF07CisJCXN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4gPSBkZXZfcHJpdi0+Y2hhbm5lbHMucHRyW2NoXTsKIAogCQlpZiAoIWNoYW4gfHwgIWNoYW4tPnJhbWluKQogCQkJY29udGludWU7CkBAIC02OSw2ICsxMjksNyBAQAogCQlpZiAoY2hpbnN0ID09IGNoYW4tPnJhbWluLT52aW5zdCA+PiAxMikKIAkJCWJyZWFrOwogCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZfcHJpdi0+Y2hhbm5lbHMubG9jaywgZmxhZ3MpOwogCiAJTlZfSU5GTyhkZXYsICIlcyAtIFZNOiBUcmFwcGVkICVzIGF0ICUwMnglMDR4JTA0eCBzdGF0dXMgJTA4eCAiCiAJCSAgICAgImNoYW5uZWwgJWQgKDB4JTA4eClcbiIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjUwX2ZiY29uLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjUwX2ZiY29uLmMKaW5kZXggNmRjZjA0OC4uNzkxZGVkMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnY1MF9mYmNvbi5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252NTBfZmJjb24uYwpAQCAtMSwyOSArMSw0NiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDEwIFJlZCBIYXQgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIENPUFlSSUdIVCBIT0xERVIoUykgT1IgQVVUSE9SKFMpIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIEF1dGhvcnM6IEJlbiBTa2VnZ3MKKyAqLworCiAjaW5jbHVkZSAiZHJtUC5oIgogI2luY2x1ZGUgIm5vdXZlYXVfZHJ2LmgiCiAjaW5jbHVkZSAibm91dmVhdV9kbWEuaCIKICNpbmNsdWRlICJub3V2ZWF1X3JhbWh0LmgiCiAjaW5jbHVkZSAibm91dmVhdV9mYmNvbi5oIgorI2luY2x1ZGUgIm5vdXZlYXVfbW0uaCIKIAotdm9pZAoraW50CiBudjUwX2ZiY29uX2ZpbGxyZWN0KHN0cnVjdCBmYl9pbmZvICppbmZvLCBjb25zdCBzdHJ1Y3QgZmJfZmlsbHJlY3QgKnJlY3QpCiB7CiAJc3RydWN0IG5vdXZlYXVfZmJkZXYgKm5mYmRldiA9IGluZm8tPnBhcjsKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gbmZiZGV2LT5kZXY7CiAJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuID0gZGV2X3ByaXYtPmNoYW5uZWw7CisJaW50IHJldDsKIAotCWlmIChpbmZvLT5zdGF0ZSAhPSBGQklORk9fU1RBVEVfUlVOTklORykKLQkJcmV0dXJuOwotCi0JaWYgKCEoaW5mby0+ZmxhZ3MgJiBGQklORk9fSFdBQ0NFTF9ESVNBQkxFRCkgJiYKLQkgICAgIFJJTkdfU1BBQ0UoY2hhbiwgcmVjdC0+cm9wID09IFJPUF9DT1BZID8gNyA6IDExKSkgewotCQlub3V2ZWF1X2ZiY29uX2dwdV9sb2NrdXAoaW5mbyk7Ci0JfQotCi0JaWYgKGluZm8tPmZsYWdzICYgRkJJTkZPX0hXQUNDRUxfRElTQUJMRUQpIHsKLQkJY2ZiX2ZpbGxyZWN0KGluZm8sIHJlY3QpOwotCQlyZXR1cm47Ci0JfQorCXJldCA9IFJJTkdfU1BBQ0UoY2hhbiwgcmVjdC0+cm9wID09IFJPUF9DT1BZID8gNyA6IDExKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OwogCiAJaWYgKHJlY3QtPnJvcCAhPSBST1BfQ09QWSkgewogCQlCRUdJTl9SSU5HKGNoYW4sIE52U3ViMkQsIDB4MDJhYywgMSk7CkBAIC00NSwyNyArNjIsMjEgQEAKIAkJT1VUX1JJTkcoY2hhbiwgMyk7CiAJfQogCUZJUkVfUklORyhjaGFuKTsKKwlyZXR1cm4gMDsKIH0KIAotdm9pZAoraW50CiBudjUwX2ZiY29uX2NvcHlhcmVhKHN0cnVjdCBmYl9pbmZvICppbmZvLCBjb25zdCBzdHJ1Y3QgZmJfY29weWFyZWEgKnJlZ2lvbikKIHsKIAlzdHJ1Y3Qgbm91dmVhdV9mYmRldiAqbmZiZGV2ID0gaW5mby0+cGFyOwogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBuZmJkZXYtPmRldjsKIAlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4gPSBkZXZfcHJpdi0+Y2hhbm5lbDsKKwlpbnQgcmV0OwogCi0JaWYgKGluZm8tPnN0YXRlICE9IEZCSU5GT19TVEFURV9SVU5OSU5HKQotCQlyZXR1cm47Ci0KLQlpZiAoIShpbmZvLT5mbGFncyAmIEZCSU5GT19IV0FDQ0VMX0RJU0FCTEVEKSAmJiBSSU5HX1NQQUNFKGNoYW4sIDEyKSkgewotCQlub3V2ZWF1X2ZiY29uX2dwdV9sb2NrdXAoaW5mbyk7Ci0JfQotCi0JaWYgKGluZm8tPmZsYWdzICYgRkJJTkZPX0hXQUNDRUxfRElTQUJMRUQpIHsKLQkJY2ZiX2NvcHlhcmVhKGluZm8sIHJlZ2lvbik7Ci0JCXJldHVybjsKLQl9CisJcmV0ID0gUklOR19TUEFDRShjaGFuLCAxMik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKIAogCUJFR0lOX1JJTkcoY2hhbiwgTnZTdWIyRCwgMHgwMTEwLCAxKTsKIAlPVVRfUklORyhjaGFuLCAwKTsKQEAgLTgwLDkgKzkxLDEwIEBACiAJT1VUX1JJTkcoY2hhbiwgMCk7CiAJT1VUX1JJTkcoY2hhbiwgcmVnaW9uLT5zeSk7CiAJRklSRV9SSU5HKGNoYW4pOworCXJldHVybiAwOwogfQogCi12b2lkCitpbnQKIG52NTBfZmJjb25faW1hZ2VibGl0KHN0cnVjdCBmYl9pbmZvICppbmZvLCBjb25zdCBzdHJ1Y3QgZmJfaW1hZ2UgKmltYWdlKQogewogCXN0cnVjdCBub3V2ZWF1X2ZiZGV2ICpuZmJkZXYgPSBpbmZvLT5wYXI7CkBAIC05MiwyMyArMTA0LDE0IEBACiAJdWludDMyX3Qgd2lkdGgsIGR3b3JkcywgKmRhdGEgPSAodWludDMyX3QgKilpbWFnZS0+ZGF0YTsKIAl1aW50MzJfdCBtYXNrID0gfih+MCA+PiAoMzIgLSBpbmZvLT52YXIuYml0c19wZXJfcGl4ZWwpKTsKIAl1aW50MzJfdCAqcGFsZXR0ZSA9IGluZm8tPnBzZXVkb19wYWxldHRlOworCWludCByZXQ7CiAKLQlpZiAoaW5mby0+c3RhdGUgIT0gRkJJTkZPX1NUQVRFX1JVTk5JTkcpCi0JCXJldHVybjsKKwlpZiAoaW1hZ2UtPmRlcHRoICE9IDEpCisJCXJldHVybiAtRU5PREVWOwogCi0JaWYgKGltYWdlLT5kZXB0aCAhPSAxKSB7Ci0JCWNmYl9pbWFnZWJsaXQoaW5mbywgaW1hZ2UpOwotCQlyZXR1cm47Ci0JfQotCi0JaWYgKCEoaW5mby0+ZmxhZ3MgJiBGQklORk9fSFdBQ0NFTF9ESVNBQkxFRCkgJiYgUklOR19TUEFDRShjaGFuLCAxMSkpIHsKLQkJbm91dmVhdV9mYmNvbl9ncHVfbG9ja3VwKGluZm8pOwotCX0KLQotCWlmIChpbmZvLT5mbGFncyAmIEZCSU5GT19IV0FDQ0VMX0RJU0FCTEVEKSB7Ci0JCWNmYl9pbWFnZWJsaXQoaW5mbywgaW1hZ2UpOwotCQlyZXR1cm47Ci0JfQorCXJldCA9IFJJTkdfU1BBQ0UoY2hhbiwgMTEpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CiAKIAl3aWR0aCA9IEFMSUdOKGltYWdlLT53aWR0aCwgMzIpOwogCWR3b3JkcyA9ICh3aWR0aCAqIGltYWdlLT5oZWlnaHQpID4+IDU7CkBAIC0xMzQsMTEgKzEzNyw5IEBACiAJd2hpbGUgKGR3b3JkcykgewogCQlpbnQgcHVzaCA9IGR3b3JkcyA+IDIwNDcgPyAyMDQ3IDogZHdvcmRzOwogCi0JCWlmIChSSU5HX1NQQUNFKGNoYW4sIHB1c2ggKyAxKSkgewotCQkJbm91dmVhdV9mYmNvbl9ncHVfbG9ja3VwKGluZm8pOwotCQkJY2ZiX2ltYWdlYmxpdChpbmZvLCBpbWFnZSk7Ci0JCQlyZXR1cm47Ci0JCX0KKwkJcmV0ID0gUklOR19TUEFDRShjaGFuLCBwdXNoICsgMSk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OwogCiAJCWR3b3JkcyAtPSBwdXNoOwogCkBAIC0xNDgsNiArMTQ5LDcgQEAKIAl9CiAKIAlGSVJFX1JJTkcoY2hhbik7CisJcmV0dXJuIDA7CiB9CiAKIGludApAQCAtMTU3LDEyICsxNTksOSBAQAogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBuZmJkZXYtPmRldjsKIAlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4gPSBkZXZfcHJpdi0+Y2hhbm5lbDsKLQlzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKmVuZzJkID0gTlVMTDsKLQl1aW50NjRfdCBmYjsKKwlzdHJ1Y3Qgbm91dmVhdV9ibyAqbnZibyA9IG5mYmRldi0+bm91dmVhdV9mYi5udmJvOwogCWludCByZXQsIGZvcm1hdDsKIAotCWZiID0gaW5mby0+Zml4LnNtZW1fc3RhcnQgLSBkZXZfcHJpdi0+ZmJfcGh5cyArIGRldl9wcml2LT52bV92cmFtX2Jhc2U7Ci0KIAlzd2l0Y2ggKGluZm8tPnZhci5iaXRzX3Blcl9waXhlbCkgewogCWNhc2UgODoKIAkJZm9ybWF0ID0gMHhmMzsKQEAgLTE5MCwxMiArMTg5LDcgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JcmV0ID0gbm91dmVhdV9ncHVvYmpfZ3JfbmV3KGRldl9wcml2LT5jaGFubmVsLCAweDUwMmQsICZlbmcyZCk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCXJldCA9IG5vdXZlYXVfcmFtaHRfaW5zZXJ0KGRldl9wcml2LT5jaGFubmVsLCBOdjJELCBlbmcyZCk7Ci0Jbm91dmVhdV9ncHVvYmpfcmVmKE5VTEwsICZlbmcyZCk7CisJcmV0ID0gbm91dmVhdV9ncHVvYmpfZ3JfbmV3KGRldl9wcml2LT5jaGFubmVsLCBOdjJELCAweDUwMmQpOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKQEAgLTI1Myw4ICsyNDcsOCBAQAogCU9VVF9SSU5HKGNoYW4sIGluZm8tPmZpeC5saW5lX2xlbmd0aCk7CiAJT1VUX1JJTkcoY2hhbiwgaW5mby0+dmFyLnhyZXNfdmlydHVhbCk7CiAJT1VUX1JJTkcoY2hhbiwgaW5mby0+dmFyLnlyZXNfdmlydHVhbCk7Ci0JT1VUX1JJTkcoY2hhbiwgdXBwZXJfMzJfYml0cyhmYikpOwotCU9VVF9SSU5HKGNoYW4sIGxvd2VyXzMyX2JpdHMoZmIpKTsKKwlPVVRfUklORyhjaGFuLCB1cHBlcl8zMl9iaXRzKG52Ym8tPnZtYS5vZmZzZXQpKTsKKwlPVVRfUklORyhjaGFuLCBsb3dlcl8zMl9iaXRzKG52Ym8tPnZtYS5vZmZzZXQpKTsKIAlCRUdJTl9SSU5HKGNoYW4sIE52U3ViMkQsIDB4MDIzMCwgMik7CiAJT1VUX1JJTkcoY2hhbiwgZm9ybWF0KTsKIAlPVVRfUklORyhjaGFuLCAxKTsKQEAgLTI2Miw4ICsyNTYsOCBAQAogCU9VVF9SSU5HKGNoYW4sIGluZm8tPmZpeC5saW5lX2xlbmd0aCk7CiAJT1VUX1JJTkcoY2hhbiwgaW5mby0+dmFyLnhyZXNfdmlydHVhbCk7CiAJT1VUX1JJTkcoY2hhbiwgaW5mby0+dmFyLnlyZXNfdmlydHVhbCk7Ci0JT1VUX1JJTkcoY2hhbiwgdXBwZXJfMzJfYml0cyhmYikpOwotCU9VVF9SSU5HKGNoYW4sIGxvd2VyXzMyX2JpdHMoZmIpKTsKKwlPVVRfUklORyhjaGFuLCB1cHBlcl8zMl9iaXRzKG52Ym8tPnZtYS5vZmZzZXQpKTsKKwlPVVRfUklORyhjaGFuLCBsb3dlcl8zMl9iaXRzKG52Ym8tPnZtYS5vZmZzZXQpKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnY1MF9maWZvLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjUwX2ZpZm8uYwppbmRleCAxZGE2NWJkLi44ZGQwNGM1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjUwX2ZpZm8uYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjUwX2ZpZm8uYwpAQCAtMjgsNiArMjgsNyBAQAogI2luY2x1ZGUgImRybS5oIgogI2luY2x1ZGUgIm5vdXZlYXVfZHJ2LmgiCiAjaW5jbHVkZSAibm91dmVhdV9yYW1odC5oIgorI2luY2x1ZGUgIm5vdXZlYXVfdm0uaCIKIAogc3RhdGljIHZvaWQKIG52NTBfZmlmb19wbGF5bGlzdF91cGRhdGUoc3RydWN0IGRybV9kZXZpY2UgKmRldikKQEAgLTQ0LDcgKzQ1LDggQEAKIAogCS8qIFdlIG5ldmVyIHNjaGVkdWxlIGNoYW5uZWwgMCBvciAxMjcgKi8KIAlmb3IgKGkgPSAxLCBuciA9IDA7IGkgPCAxMjc7IGkrKykgewotCQlpZiAoZGV2X3ByaXYtPmZpZm9zW2ldICYmIGRldl9wcml2LT5maWZvc1tpXS0+cmFtZmMpIHsKKwkJaWYgKGRldl9wcml2LT5jaGFubmVscy5wdHJbaV0gJiYKKwkJICAgIGRldl9wcml2LT5jaGFubmVscy5wdHJbaV0tPnJhbWZjKSB7CiAJCQludl93bzMyKGN1ciwgKG5yICogNCksIGkpOwogCQkJbnIrKzsKIAkJfQpAQCAtNjAsNyArNjIsNyBAQAogbnY1MF9maWZvX2NoYW5uZWxfZW5hYmxlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBjaGFubmVsKQogewogCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Ci0Jc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbiA9IGRldl9wcml2LT5maWZvc1tjaGFubmVsXTsKKwlzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuID0gZGV2X3ByaXYtPmNoYW5uZWxzLnB0cltjaGFubmVsXTsKIAl1aW50MzJfdCBpbnN0OwogCiAJTlZfREVCVUcoZGV2LCAiY2glZFxuIiwgY2hhbm5lbCk7CkBAIC0xMDUsNiArMTA3LDcgQEAKIHsKIAlOVl9ERUJVRyhkZXYsICJcbiIpOwogCisJbm91dmVhdV9pcnFfcmVnaXN0ZXIoZGV2LCA4LCBudjA0X2ZpZm9faXNyKTsKIAludl93cjMyKGRldiwgTlYwM19QRklGT19JTlRSXzAsIDB4RkZGRkZGRkYpOwogCW52X3dyMzIoZGV2LCBOVjAzX1BGSUZPX0lOVFJfRU5fMCwgMHhGRkZGRkZGRik7CiB9CkBAIC0xMTgsNyArMTIxLDcgQEAKIAlOVl9ERUJVRyhkZXYsICJcbiIpOwogCiAJZm9yIChpID0gMDsgaSA8IE5WNTBfUEZJRk9fQ1RYX1RBQkxFX19TSVpFOyBpKyspIHsKLQkJaWYgKGRldl9wcml2LT5maWZvc1tpXSkKKwkJaWYgKGRldl9wcml2LT5jaGFubmVscy5wdHJbaV0pCiAJCQludjUwX2ZpZm9fY2hhbm5lbF9lbmFibGUoZGV2LCBpKTsKIAkJZWxzZQogCQkJbnY1MF9maWZvX2NoYW5uZWxfZGlzYWJsZShkZXYsIGkpOwpAQCAtMjA2LDYgKzIwOSw5IEBACiAJaWYgKCFwZmlmby0+cGxheWxpc3RbMF0pCiAJCXJldHVybjsKIAorCW52X3dyMzIoZGV2LCAweDIxNDAsIDB4MDAwMDAwMDApOworCW5vdXZlYXVfaXJxX3VucmVnaXN0ZXIoZGV2LCA4KTsKKwogCW5vdXZlYXVfZ3B1b2JqX3JlZihOVUxMLCAmcGZpZm8tPnBsYXlsaXN0WzBdKTsKIAlub3V2ZWF1X2dwdW9ial9yZWYoTlVMTCwgJnBmaWZvLT5wbGF5bGlzdFsxXSk7CiB9CkBAIC0yNTYsNiArMjYyLDExIEBACiAJfQogCXJhbWZjID0gY2hhbi0+cmFtZmM7CiAKKwljaGFuLT51c2VyID0gaW9yZW1hcChwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2LT5wZGV2LCAwKSArCisJCQkgICAgIE5WNTBfVVNFUihjaGFuLT5pZCksIFBBR0VfU0laRSk7CisJaWYgKCFjaGFuLT51c2VyKQorCQlyZXR1cm4gLUVOT01FTTsKKwogCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZfcHJpdi0+Y29udGV4dF9zd2l0Y2hfbG9jaywgZmxhZ3MpOwogCiAJbnZfd28zMihyYW1mYywgMHg0OCwgY2hhbi0+cHVzaGJ1Zi0+Y2luc3QgPj4gNCk7CkBAIC0yOTEsMTAgKzMwMiwyMyBAQAogbnY1MF9maWZvX2Rlc3Ryb3lfY29udGV4dChzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuKQogewogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjaGFuLT5kZXY7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3Qgbm91dmVhdV9maWZvX2VuZ2luZSAqcGZpZm8gPSAmZGV2X3ByaXYtPmVuZ2luZS5maWZvOwogCXN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqcmFtZmMgPSBOVUxMOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlOVl9ERUJVRyhkZXYsICJjaCVkXG4iLCBjaGFuLT5pZCk7CiAKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2X3ByaXYtPmNvbnRleHRfc3dpdGNoX2xvY2ssIGZsYWdzKTsKKwlwZmlmby0+cmVhc3NpZ24oZGV2LCBmYWxzZSk7CisKKwkvKiBVbmxvYWQgdGhlIGNvbnRleHQgaWYgaXQncyB0aGUgY3VycmVudGx5IGFjdGl2ZSBvbmUgKi8KKwlpZiAocGZpZm8tPmNoYW5uZWxfaWQoZGV2KSA9PSBjaGFuLT5pZCkgeworCQlwZmlmby0+ZGlzYWJsZShkZXYpOworCQlwZmlmby0+dW5sb2FkX2NvbnRleHQoZGV2KTsKKwkJcGZpZm8tPmVuYWJsZShkZXYpOworCX0KKwogCS8qIFRoaXMgd2lsbCBlbnN1cmUgdGhlIGNoYW5uZWwgaXMgc2VlbiBhcyBkaXNhYmxlZC4gKi8KIAlub3V2ZWF1X2dwdW9ial9yZWYoY2hhbi0+cmFtZmMsICZyYW1mYyk7CiAJbm91dmVhdV9ncHVvYmpfcmVmKE5VTEwsICZjaGFuLT5yYW1mYyk7CkBAIC0zMDUsNiArMzI5LDE0IEBACiAJCW52NTBfZmlmb19jaGFubmVsX2Rpc2FibGUoZGV2LCAxMjcpOwogCW52NTBfZmlmb19wbGF5bGlzdF91cGRhdGUoZGV2KTsKIAorCXBmaWZvLT5yZWFzc2lnbihkZXYsIHRydWUpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldl9wcml2LT5jb250ZXh0X3N3aXRjaF9sb2NrLCBmbGFncyk7CisKKwkvKiBGcmVlIHRoZSBjaGFubmVsIHJlc291cmNlcyAqLworCWlmIChjaGFuLT51c2VyKSB7CisJCWlvdW5tYXAoY2hhbi0+dXNlcik7CisJCWNoYW4tPnVzZXIgPSBOVUxMOworCX0KIAlub3V2ZWF1X2dwdW9ial9yZWYoTlVMTCwgJnJhbWZjKTsKIAlub3V2ZWF1X2dwdW9ial9yZWYoTlVMTCwgJmNoYW4tPmNhY2hlKTsKIH0KQEAgLTM5Miw3ICs0MjQsNyBAQAogCWlmIChjaGlkIDwgMSB8fCBjaGlkID49IGRldl9wcml2LT5lbmdpbmUuZmlmby5jaGFubmVscyAtIDEpCiAJCXJldHVybiAwOwogCi0JY2hhbiA9IGRldl9wcml2LT5maWZvc1tjaGlkXTsKKwljaGFuID0gZGV2X3ByaXYtPmNoYW5uZWxzLnB0cltjaGlkXTsKIAlpZiAoIWNoYW4pIHsKIAkJTlZfRVJST1IoZGV2LCAiSW5hY3RpdmUgY2hhbm5lbCBvbiBQRklGTzogJWRcbiIsIGNoaWQpOwogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTQ2Nyw1ICs0OTksNSBAQAogdm9pZAogbnY1MF9maWZvX3RsYl9mbHVzaChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogewotCW52NTBfdm1fZmx1c2goZGV2LCA1KTsKKwludjUwX3ZtX2ZsdXNoX2VuZ2luZShkZXYsIDUpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnY1MF9ncGlvLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjUwX2dwaW8uYwppbmRleCBiMmZhYjJiLi42YjE0OWMwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjUwX2dwaW8uYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjUwX2dwaW8uYwpAQCAtMjYsNiArMjYsMjggQEAKICNpbmNsdWRlICJub3V2ZWF1X2Rydi5oIgogI2luY2x1ZGUgIm5vdXZlYXVfaHcuaCIKIAorI2luY2x1ZGUgIm52NTBfZGlzcGxheS5oIgorCitzdGF0aWMgdm9pZCBudjUwX2dwaW9faXNyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgbnY1MF9ncGlvX2lzcl9iaChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOworCitzdHJ1Y3QgbnY1MF9ncGlvX3ByaXYgeworCXN0cnVjdCBsaXN0X2hlYWQgaGFuZGxlcnM7CisJc3BpbmxvY2tfdCBsb2NrOworfTsKKworc3RydWN0IG52NTBfZ3Bpb19oYW5kbGVyIHsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2OworCXN0cnVjdCBsaXN0X2hlYWQgaGVhZDsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd29yazsKKwlib29sIGluaGliaXQ7CisKKwlzdHJ1Y3QgZGNiX2dwaW9fZW50cnkgKmdwaW87CisKKwl2b2lkICgqaGFuZGxlcikodm9pZCAqZGF0YSwgaW50IHN0YXRlKTsKKwl2b2lkICpkYXRhOworfTsKKwogc3RhdGljIGludAogbnY1MF9ncGlvX2xvY2F0aW9uKHN0cnVjdCBkY2JfZ3Bpb19lbnRyeSAqZ3BpbywgdWludDMyX3QgKnJlZywgdWludDMyX3QgKnNoaWZ0KQogewpAQCAtNzUsMjkgKzk3LDEyMyBAQAogCXJldHVybiAwOwogfQogCitpbnQKK252NTBfZ3Bpb19pcnFfcmVnaXN0ZXIoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgZW51bSBkY2JfZ3Bpb190YWcgdGFnLAorCQkgICAgICAgdm9pZCAoKmhhbmRsZXIpKHZvaWQgKiwgaW50KSwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBub3V2ZWF1X2dwaW9fZW5naW5lICpwZ3BpbyA9ICZkZXZfcHJpdi0+ZW5naW5lLmdwaW87CisJc3RydWN0IG52NTBfZ3Bpb19wcml2ICpwcml2ID0gcGdwaW8tPnByaXY7CisJc3RydWN0IG52NTBfZ3Bpb19oYW5kbGVyICpncGlvaDsKKwlzdHJ1Y3QgZGNiX2dwaW9fZW50cnkgKmdwaW87CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWdwaW8gPSBub3V2ZWF1X2Jpb3NfZ3Bpb19lbnRyeShkZXYsIHRhZyk7CisJaWYgKCFncGlvKQorCQlyZXR1cm4gLUVOT0VOVDsKKworCWdwaW9oID0ga3phbGxvYyhzaXplb2YoKmdwaW9oKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFncGlvaCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlJTklUX1dPUksoJmdwaW9oLT53b3JrLCBudjUwX2dwaW9faXNyX2JoKTsKKwlncGlvaC0+ZGV2ICA9IGRldjsKKwlncGlvaC0+Z3BpbyA9IGdwaW87CisJZ3Bpb2gtPmhhbmRsZXIgPSBoYW5kbGVyOworCWdwaW9oLT5kYXRhID0gZGF0YTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7CisJbGlzdF9hZGQoJmdwaW9oLT5oZWFkLCAmcHJpdi0+aGFuZGxlcnMpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gMDsKK30KKwogdm9pZAorbnY1MF9ncGlvX2lycV91bnJlZ2lzdGVyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGVudW0gZGNiX2dwaW9fdGFnIHRhZywKKwkJCSB2b2lkICgqaGFuZGxlcikodm9pZCAqLCBpbnQpLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG5vdXZlYXVfZ3Bpb19lbmdpbmUgKnBncGlvID0gJmRldl9wcml2LT5lbmdpbmUuZ3BpbzsKKwlzdHJ1Y3QgbnY1MF9ncGlvX3ByaXYgKnByaXYgPSBwZ3Bpby0+cHJpdjsKKwlzdHJ1Y3QgbnY1MF9ncGlvX2hhbmRsZXIgKmdwaW9oLCAqdG1wOworCXN0cnVjdCBkY2JfZ3Bpb19lbnRyeSAqZ3BpbzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJZ3BpbyA9IG5vdXZlYXVfYmlvc19ncGlvX2VudHJ5KGRldiwgdGFnKTsKKwlpZiAoIWdwaW8pCisJCXJldHVybjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGdwaW9oLCB0bXAsICZwcml2LT5oYW5kbGVycywgaGVhZCkgeworCQlpZiAoZ3Bpb2gtPmdwaW8gIT0gZ3BpbyB8fAorCQkgICAgZ3Bpb2gtPmhhbmRsZXIgIT0gaGFuZGxlciB8fAorCQkgICAgZ3Bpb2gtPmRhdGEgIT0gZGF0YSkKKwkJCWNvbnRpbnVlOworCQlsaXN0X2RlbCgmZ3Bpb2gtPmhlYWQpOworCQlrZnJlZShncGlvaCk7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKK30KKworYm9vbAogbnY1MF9ncGlvX2lycV9lbmFibGUoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgZW51bSBkY2JfZ3Bpb190YWcgdGFnLCBib29sIG9uKQogewogCXN0cnVjdCBkY2JfZ3Bpb19lbnRyeSAqZ3BpbzsKIAl1MzIgcmVnLCBtYXNrOwogCiAJZ3BpbyA9IG5vdXZlYXVfYmlvc19ncGlvX2VudHJ5KGRldiwgdGFnKTsKLQlpZiAoIWdwaW8pIHsKLQkJTlZfRVJST1IoZGV2LCAiZ3BpbyB0YWcgMHglMDJ4IG5vdCBmb3VuZFxuIiwgdGFnKTsKLQkJcmV0dXJuOwotCX0KKwlpZiAoIWdwaW8pCisJCXJldHVybiBmYWxzZTsKIAogCXJlZyAgPSBncGlvLT5saW5lIDwgMTYgPyAweGUwNTAgOiAweGUwNzA7CiAJbWFzayA9IDB4MDAwMTAwMDEgPDwgKGdwaW8tPmxpbmUgJiAweGYpOwogCiAJbnZfd3IzMihkZXYsIHJlZyArIDQsIG1hc2spOwotCW52X21hc2soZGV2LCByZWcgKyAwLCBtYXNrLCBvbiA/IG1hc2sgOiAwKTsKKwlyZWcgPSBudl9tYXNrKGRldiwgcmVnICsgMCwgbWFzaywgb24gPyBtYXNrIDogMCk7CisJcmV0dXJuIChyZWcgJiBtYXNrKSA9PSBtYXNrOworfQorCitzdGF0aWMgaW50CitudjUwX2dwaW9fY3JlYXRlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3Qgbm91dmVhdV9ncGlvX2VuZ2luZSAqcGdwaW8gPSAmZGV2X3ByaXYtPmVuZ2luZS5ncGlvOworCXN0cnVjdCBudjUwX2dwaW9fcHJpdiAqcHJpdjsKKworCXByaXYgPSBremFsbG9jKHNpemVvZigqcHJpdiksIEdGUF9LRVJORUwpOworCWlmICghcHJpdikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlJTklUX0xJU1RfSEVBRCgmcHJpdi0+aGFuZGxlcnMpOworCXNwaW5fbG9ja19pbml0KCZwcml2LT5sb2NrKTsKKwlwZ3Bpby0+cHJpdiA9IHByaXY7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCitudjUwX2dwaW9fZGVzdHJveShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG5vdXZlYXVfZ3Bpb19lbmdpbmUgKnBncGlvID0gJmRldl9wcml2LT5lbmdpbmUuZ3BpbzsKKworCWtmcmVlKHBncGlvLT5wcml2KTsKKwlwZ3Bpby0+cHJpdiA9IE5VTEw7CiB9CiAKIGludAogbnY1MF9ncGlvX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBub3V2ZWF1X2dwaW9fZW5naW5lICpwZ3BpbyA9ICZkZXZfcHJpdi0+ZW5naW5lLmdwaW87CisJc3RydWN0IG52NTBfZ3Bpb19wcml2ICpwcml2OworCWludCByZXQ7CisKKwlpZiAoIXBncGlvLT5wcml2KSB7CisJCXJldCA9IG52NTBfZ3Bpb19jcmVhdGUoZGV2KTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJfQorCXByaXYgPSBwZ3Bpby0+cHJpdjsKIAogCS8qIGRpc2FibGUsIGFuZCBhY2sgYW55IHBlbmRpbmcgZ3BpbyBpbnRlcnJ1cHRzICovCiAJbnZfd3IzMihkZXYsIDB4ZTA1MCwgMHgwMDAwMDAwMCk7CkBAIC0xMDcsNSArMjIzLDc3IEBACiAJCW52X3dyMzIoZGV2LCAweGUwNzQsIDB4ZmZmZmZmZmYpOwogCX0KIAorCW5vdXZlYXVfaXJxX3JlZ2lzdGVyKGRldiwgMjEsIG52NTBfZ3Bpb19pc3IpOwogCXJldHVybiAwOwogfQorCit2b2lkCitudjUwX2dwaW9fZmluaShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisKKwludl93cjMyKGRldiwgMHhlMDUwLCAweDAwMDAwMDAwKTsKKwlpZiAoZGV2X3ByaXYtPmNoaXBzZXQgPj0gMHg5MCkKKwkJbnZfd3IzMihkZXYsIDB4ZTA3MCwgMHgwMDAwMDAwMCk7CisJbm91dmVhdV9pcnFfdW5yZWdpc3RlcihkZXYsIDIxKTsKKworCW52NTBfZ3Bpb19kZXN0cm95KGRldik7Cit9CisKK3N0YXRpYyB2b2lkCitudjUwX2dwaW9faXNyX2JoKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgbnY1MF9ncGlvX2hhbmRsZXIgKmdwaW9oID0KKwkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBudjUwX2dwaW9faGFuZGxlciwgd29yayk7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZ3Bpb2gtPmRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG5vdXZlYXVfZ3Bpb19lbmdpbmUgKnBncGlvID0gJmRldl9wcml2LT5lbmdpbmUuZ3BpbzsKKwlzdHJ1Y3QgbnY1MF9ncGlvX3ByaXYgKnByaXYgPSBwZ3Bpby0+cHJpdjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBzdGF0ZTsKKworCXN0YXRlID0gcGdwaW8tPmdldChncGlvaC0+ZGV2LCBncGlvaC0+Z3Bpby0+dGFnKTsKKwlpZiAoc3RhdGUgPCAwKQorCQlyZXR1cm47CisKKwlncGlvaC0+aGFuZGxlcihncGlvaC0+ZGF0YSwgc3RhdGUpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKwlncGlvaC0+aW5oaWJpdCA9IGZhbHNlOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQKK252NTBfZ3Bpb19pc3Ioc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBub3V2ZWF1X2dwaW9fZW5naW5lICpwZ3BpbyA9ICZkZXZfcHJpdi0+ZW5naW5lLmdwaW87CisJc3RydWN0IG52NTBfZ3Bpb19wcml2ICpwcml2ID0gcGdwaW8tPnByaXY7CisJc3RydWN0IG52NTBfZ3Bpb19oYW5kbGVyICpncGlvaDsKKwl1MzIgaW50cjAsIGludHIxID0gMDsKKwl1MzIgaGksIGxvLCBjaDsKKworCWludHIwID0gbnZfcmQzMihkZXYsIDB4ZTA1NCkgJiBudl9yZDMyKGRldiwgMHhlMDUwKTsKKwlpZiAoZGV2X3ByaXYtPmNoaXBzZXQgPj0gMHg5MCkKKwkJaW50cjEgPSBudl9yZDMyKGRldiwgMHhlMDc0KSAmIG52X3JkMzIoZGV2LCAweGUwNzApOworCisJaGkgPSAoaW50cjAgJiAweDAwMDBmZmZmKSB8IChpbnRyMSA8PCAxNik7CisJbG8gPSAoaW50cjAgPj4gMTYpIHwgKGludHIxICYgMHhmZmZmMDAwMCk7CisJY2ggPSBoaSB8IGxvOworCisJbnZfd3IzMihkZXYsIDB4ZTA1NCwgaW50cjApOworCWlmIChkZXZfcHJpdi0+Y2hpcHNldCA+PSAweDkwKQorCQludl93cjMyKGRldiwgMHhlMDc0LCBpbnRyMSk7CisKKwlzcGluX2xvY2soJnByaXYtPmxvY2spOworCWxpc3RfZm9yX2VhY2hfZW50cnkoZ3Bpb2gsICZwcml2LT5oYW5kbGVycywgaGVhZCkgeworCQlpZiAoIShjaCAmICgxIDw8IGdwaW9oLT5ncGlvLT5saW5lKSkpCisJCQljb250aW51ZTsKKworCQlpZiAoZ3Bpb2gtPmluaGliaXQpCisJCQljb250aW51ZTsKKwkJZ3Bpb2gtPmluaGliaXQgPSB0cnVlOworCisJCXF1ZXVlX3dvcmsoZGV2X3ByaXYtPndxLCAmZ3Bpb2gtPndvcmspOworCX0KKwlzcGluX3VubG9jaygmcHJpdi0+bG9jayk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjUwX2dyYXBoLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjUwX2dyYXBoLmMKaW5kZXggOGI2NjlkMC4uMmQ3ZWE3NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnY1MF9ncmFwaC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252NTBfZ3JhcGguYwpAQCAtMjksNiArMjksMTIgQEAKICNpbmNsdWRlICJub3V2ZWF1X2Rydi5oIgogI2luY2x1ZGUgIm5vdXZlYXVfcmFtaHQuaCIKICNpbmNsdWRlICJub3V2ZWF1X2dyY3R4LmgiCisjaW5jbHVkZSAibm91dmVhdV9kbWEuaCIKKyNpbmNsdWRlICJub3V2ZWF1X3ZtLmgiCisjaW5jbHVkZSAibnY1MF9ldm8uaCIKKworc3RhdGljIGludCAgbnY1MF9ncmFwaF9yZWdpc3RlcihzdHJ1Y3QgZHJtX2RldmljZSAqKTsKK3N0YXRpYyB2b2lkIG52NTBfZ3JhcGhfaXNyKHN0cnVjdCBkcm1fZGV2aWNlICopOwogCiBzdGF0aWMgdm9pZAogbnY1MF9ncmFwaF9pbml0X3Jlc2V0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCkBAIC00Niw2ICs1Miw3IEBACiB7CiAJTlZfREVCVUcoZGV2LCAiXG4iKTsKIAorCW5vdXZlYXVfaXJxX3JlZ2lzdGVyKGRldiwgMTIsIG52NTBfZ3JhcGhfaXNyKTsKIAludl93cjMyKGRldiwgTlYwM19QR1JBUEhfSU5UUiwgMHhmZmZmZmZmZik7CiAJbnZfd3IzMihkZXYsIDB4NDAwMTM4LCAweGZmZmZmZmZmKTsKIAludl93cjMyKGRldiwgTlY0MF9QR1JBUEhfSU5UUl9FTiwgMHhmZmZmZmZmZik7CkBAIC0xNDUsMTIgKzE1MiwxNSBAQAogCW52NTBfZ3JhcGhfaW5pdF9yZXNldChkZXYpOwogCW52NTBfZ3JhcGhfaW5pdF9yZWdzX19udihkZXYpOwogCW52NTBfZ3JhcGhfaW5pdF9yZWdzKGRldik7Ci0JbnY1MF9ncmFwaF9pbml0X2ludHIoZGV2KTsKIAogCXJldCA9IG52NTBfZ3JhcGhfaW5pdF9jdHhjdGwoZGV2KTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCisJcmV0ID0gbnY1MF9ncmFwaF9yZWdpc3RlcihkZXYpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisJbnY1MF9ncmFwaF9pbml0X2ludHIoZGV2KTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTU4LDYgKzE2OCw4IEBACiBudjUwX2dyYXBoX3Rha2Vkb3duKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7CiAJTlZfREVCVUcoZGV2LCAiXG4iKTsKKwludl93cjMyKGRldiwgMHg0MDAxM2MsIDB4MDAwMDAwMDApOworCW5vdXZlYXVfaXJxX3VucmVnaXN0ZXIoZGV2LCAxMik7CiB9CiAKIHZvaWQKQEAgLTE5MCw3ICsyMDIsNyBAQAogCWluc3QgPSAoaW5zdCAmIE5WNTBfUEdSQVBIX0NUWENUTF9DVVJfSU5TVEFOQ0UpIDw8IDEyOwogCiAJZm9yIChpID0gMDsgaSA8IGRldl9wcml2LT5lbmdpbmUuZmlmby5jaGFubmVsczsgaSsrKSB7Ci0JCXN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4gPSBkZXZfcHJpdi0+Zmlmb3NbaV07CisJCXN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4gPSBkZXZfcHJpdi0+Y2hhbm5lbHMucHRyW2ldOwogCiAJCWlmIChjaGFuICYmIGNoYW4tPnJhbWluICYmIGNoYW4tPnJhbWluLT52aW5zdCA9PSBpbnN0KQogCQkJcmV0dXJuIGNoYW47CkBAIC0yMTEsNyArMjIzLDcgQEAKIAogCU5WX0RFQlVHKGRldiwgImNoJWRcbiIsIGNoYW4tPmlkKTsKIAotCXJldCA9IG5vdXZlYXVfZ3B1b2JqX25ldyhkZXYsIGNoYW4sIHBncmFwaC0+Z3JjdHhfc2l6ZSwgMHgxMDAwLAorCXJldCA9IG5vdXZlYXVfZ3B1b2JqX25ldyhkZXYsIGNoYW4sIHBncmFwaC0+Z3JjdHhfc2l6ZSwgMCwKIAkJCQkgTlZPQkpfRkxBR19aRVJPX0FMTE9DIHwKIAkJCQkgTlZPQkpfRkxBR19aRVJPX0ZSRUUsICZjaGFuLT5yYW1pbl9ncmN0eCk7CiAJaWYgKHJldCkKQEAgLTIzNCw2ICsyNDYsNyBAQAogCW52X3dvMzIoY2hhbi0+cmFtaW5fZ3JjdHgsIDB4MDAwMDAsIGNoYW4tPnJhbWluLT52aW5zdCA+PiAxMik7CiAKIAlkZXZfcHJpdi0+ZW5naW5lLmluc3RtZW0uZmx1c2goZGV2KTsKKwlhdG9taWNfaW5jKCZjaGFuLT52bS0+cGdyYXBoX3JlZnMpOwogCXJldHVybiAwOwogfQogCkBAIC0yNDIsMTggKzI1NSwzMSBAQAogewogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjaGFuLT5kZXY7CiAJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3Qgbm91dmVhdV9wZ3JhcGhfZW5naW5lICpwZ3JhcGggPSAmZGV2X3ByaXYtPmVuZ2luZS5ncmFwaDsKIAlpbnQgaSwgaGRyID0gKGRldl9wcml2LT5jaGlwc2V0ID09IDB4NTApID8gMHgyMDAgOiAweDIwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlOVl9ERUJVRyhkZXYsICJjaCVkXG4iLCBjaGFuLT5pZCk7CiAKIAlpZiAoIWNoYW4tPnJhbWluKQogCQlyZXR1cm47CiAKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2X3ByaXYtPmNvbnRleHRfc3dpdGNoX2xvY2ssIGZsYWdzKTsKKwlwZ3JhcGgtPmZpZm9fYWNjZXNzKGRldiwgZmFsc2UpOworCisJaWYgKHBncmFwaC0+Y2hhbm5lbChkZXYpID09IGNoYW4pCisJCXBncmFwaC0+dW5sb2FkX2NvbnRleHQoZGV2KTsKKwogCWZvciAoaSA9IGhkcjsgaSA8IGhkciArIDI0OyBpICs9IDQpCiAJCW52X3dvMzIoY2hhbi0+cmFtaW4sIGksIDApOwogCWRldl9wcml2LT5lbmdpbmUuaW5zdG1lbS5mbHVzaChkZXYpOwogCisJcGdyYXBoLT5maWZvX2FjY2VzcyhkZXYsIHRydWUpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldl9wcml2LT5jb250ZXh0X3N3aXRjaF9sb2NrLCBmbGFncyk7CisKIAlub3V2ZWF1X2dwdW9ial9yZWYoTlVMTCwgJmNoYW4tPnJhbWluX2dyY3R4KTsKKworCWF0b21pY19kZWMoJmNoYW4tPnZtLT5wZ3JhcGhfcmVmcyk7CiB9CiAKIHN0YXRpYyBpbnQKQEAgLTMwNiw3ICszMzIsNyBAQAogCXJldHVybiAwOwogfQogCi12b2lkCitzdGF0aWMgdm9pZAogbnY1MF9ncmFwaF9jb250ZXh0X3N3aXRjaChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogewogCXVpbnQzMl90IGluc3Q7CkBAIC0zMjIsOCArMzQ4LDggQEAKIH0KIAogc3RhdGljIGludAotbnY1MF9ncmFwaF9udnN3X2RtYV92YmxzZW0oc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbiwgaW50IGdyY2xhc3MsCi0JCQkgICBpbnQgbXRoZCwgdWludDMyX3QgZGF0YSkKK252NTBfZ3JhcGhfbnZzd19kbWFfdmJsc2VtKHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4sCisJCQkgICB1MzIgY2xhc3MsIHUzMiBtdGhkLCB1MzIgZGF0YSkKIHsKIAlzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKmdwdW9iajsKIApAQCAtMzQwLDggKzM2Niw4IEBACiB9CiAKIHN0YXRpYyBpbnQKLW52NTBfZ3JhcGhfbnZzd192YmxzZW1fb2Zmc2V0KHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4sIGludCBncmNsYXNzLAotCQkJICAgICAgaW50IG10aGQsIHVpbnQzMl90IGRhdGEpCitudjUwX2dyYXBoX252c3dfdmJsc2VtX29mZnNldChzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuLAorCQkJICAgICAgdTMyIGNsYXNzLCB1MzIgbXRoZCwgdTMyIGRhdGEpCiB7CiAJaWYgKG5vdXZlYXVfbm90aWZpZXJfb2Zmc2V0KGNoYW4tPm52c3cudmJsc2VtLCAmZGF0YSkpCiAJCXJldHVybiAtRVJBTkdFOwpAQCAtMzUxLDE2ICszNzcsMTYgQEAKIH0KIAogc3RhdGljIGludAotbnY1MF9ncmFwaF9udnN3X3ZibHNlbV9yZWxlYXNlX3ZhbChzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuLCBpbnQgZ3JjbGFzcywKLQkJCQkgICBpbnQgbXRoZCwgdWludDMyX3QgZGF0YSkKK252NTBfZ3JhcGhfbnZzd192YmxzZW1fcmVsZWFzZV92YWwoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbiwKKwkJCQkgICB1MzIgY2xhc3MsIHUzMiBtdGhkLCB1MzIgZGF0YSkKIHsKIAljaGFuLT5udnN3LnZibHNlbV9ydmFsID0gZGF0YTsKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludAotbnY1MF9ncmFwaF9udnN3X3ZibHNlbV9yZWxlYXNlKHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4sIGludCBncmNsYXNzLAotCQkJICAgICAgIGludCBtdGhkLCB1aW50MzJfdCBkYXRhKQorbnY1MF9ncmFwaF9udnN3X3ZibHNlbV9yZWxlYXNlKHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4sCisJCQkgICAgICAgdTMyIGNsYXNzLCB1MzIgbXRoZCwgdTMyIGRhdGEpCiB7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNoYW4tPmRldjsKIAlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwpAQCAtMzY4LDQ1ICszOTQsODUgQEAKIAlpZiAoIWNoYW4tPm52c3cudmJsc2VtIHx8IGNoYW4tPm52c3cudmJsc2VtX29mZnNldCA9PSB+MCB8fCBkYXRhID4gMSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlpZiAoIShudl9yZDMyKGRldiwgTlY1MF9QRElTUExBWV9JTlRSX0VOKSAmCi0JCSAgICAgIE5WNTBfUERJU1BMQVlfSU5UUl9FTl9WQkxBTktfQ1JUQ18oZGF0YSkpKSB7Ci0JCW52X3dyMzIoZGV2LCBOVjUwX1BESVNQTEFZX0lOVFJfMSwKLQkJCU5WNTBfUERJU1BMQVlfSU5UUl8xX1ZCTEFOS19DUlRDXyhkYXRhKSk7Ci0JCW52X3dyMzIoZGV2LCBOVjUwX1BESVNQTEFZX0lOVFJfRU4sIG52X3JkMzIoZGV2LAotCQkJTlY1MF9QRElTUExBWV9JTlRSX0VOKSB8Ci0JCQlOVjUwX1BESVNQTEFZX0lOVFJfRU5fVkJMQU5LX0NSVENfKGRhdGEpKTsKLQl9CisJZHJtX3ZibGFua19nZXQoZGV2LCBkYXRhKTsKIAorCWNoYW4tPm52c3cudmJsc2VtX2hlYWQgPSBkYXRhOwogCWxpc3RfYWRkKCZjaGFuLT5udnN3LnZibF93YWl0LCAmZGV2X3ByaXYtPnZibF93YWl0aW5nKTsKKwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IG5vdXZlYXVfcGdyYXBoX29iamVjdF9tZXRob2QgbnY1MF9ncmFwaF9udnN3X21ldGhvZHNbXSA9IHsKLQl7IDB4MDE4YywgbnY1MF9ncmFwaF9udnN3X2RtYV92YmxzZW0gfSwKLQl7IDB4MDQwMCwgbnY1MF9ncmFwaF9udnN3X3ZibHNlbV9vZmZzZXQgfSwKLQl7IDB4MDQwNCwgbnY1MF9ncmFwaF9udnN3X3ZibHNlbV9yZWxlYXNlX3ZhbCB9LAotCXsgMHgwNDA4LCBudjUwX2dyYXBoX252c3dfdmJsc2VtX3JlbGVhc2UgfSwKLQl7fQotfTsKK3N0YXRpYyBpbnQKK252NTBfZ3JhcGhfbnZzd19tdGhkX3BhZ2VfZmxpcChzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuLAorCQkJICAgICAgIHUzMiBjbGFzcywgdTMyIG10aGQsIHUzMiBkYXRhKQoreworCXN0cnVjdCBub3V2ZWF1X3BhZ2VfZmxpcF9zdGF0ZSBzOwogCi1zdHJ1Y3Qgbm91dmVhdV9wZ3JhcGhfb2JqZWN0X2NsYXNzIG52NTBfZ3JhcGhfZ3JjbGFzc1tdID0gewotCXsgMHg1MDZlLCB0cnVlLCBudjUwX2dyYXBoX252c3dfbWV0aG9kcyB9LCAvKiBudnN3ICovCi0JeyAweDAwMzAsIGZhbHNlLCBOVUxMIH0sIC8qIG51bGwgKi8KLQl7IDB4NTAzOSwgZmFsc2UsIE5VTEwgfSwgLyogbTJtZiAqLwotCXsgMHg1MDJkLCBmYWxzZSwgTlVMTCB9LCAvKiAyZCAqLwotCXsgMHg1MGMwLCBmYWxzZSwgTlVMTCB9LCAvKiBjb21wdXRlICovCi0JeyAweDg1YzAsIGZhbHNlLCBOVUxMIH0sIC8qIGNvbXB1dGUgKG52YTMsIG52YTUsIG52YTgpICovCi0JeyAweDUwOTcsIGZhbHNlLCBOVUxMIH0sIC8qIHRlc2xhIChudjUwKSAqLwotCXsgMHg4Mjk3LCBmYWxzZSwgTlVMTCB9LCAvKiB0ZXNsYSAobnY4eC9udjl4KSAqLwotCXsgMHg4Mzk3LCBmYWxzZSwgTlVMTCB9LCAvKiB0ZXNsYSAobnZhMCwgbnZhYSwgbnZhYykgKi8KLQl7IDB4ODU5NywgZmFsc2UsIE5VTEwgfSwgLyogdGVzbGEgKG52YTMsIG52YTUsIG52YTgpICovCi0Je30KLX07CisJaWYgKCFub3V2ZWF1X2ZpbmlzaF9wYWdlX2ZsaXAoY2hhbiwgJnMpKSB7CisJCS8qIFhYWCAtIERvIHNvbWV0aGluZyBoZXJlICovCisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK252NTBfZ3JhcGhfcmVnaXN0ZXIoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCisJaWYgKGRldl9wcml2LT5lbmdpbmUuZ3JhcGgucmVnaXN0ZXJlZCkKKwkJcmV0dXJuIDA7CisKKwlOVk9CSl9DTEFTUyhkZXYsIDB4NTA2ZSwgU1cpOyAvKiBudnN3ICovCisJTlZPQkpfTVRIRCAoZGV2LCAweDUwNmUsIDB4MDE4YywgbnY1MF9ncmFwaF9udnN3X2RtYV92YmxzZW0pOworCU5WT0JKX01USEQgKGRldiwgMHg1MDZlLCAweDA0MDAsIG52NTBfZ3JhcGhfbnZzd192YmxzZW1fb2Zmc2V0KTsKKwlOVk9CSl9NVEhEIChkZXYsIDB4NTA2ZSwgMHgwNDA0LCBudjUwX2dyYXBoX252c3dfdmJsc2VtX3JlbGVhc2VfdmFsKTsKKwlOVk9CSl9NVEhEIChkZXYsIDB4NTA2ZSwgMHgwNDA4LCBudjUwX2dyYXBoX252c3dfdmJsc2VtX3JlbGVhc2UpOworCU5WT0JKX01USEQgKGRldiwgMHg1MDZlLCAweDA1MDAsIG52NTBfZ3JhcGhfbnZzd19tdGhkX3BhZ2VfZmxpcCk7CisKKwlOVk9CSl9DTEFTUyhkZXYsIDB4MDAzMCwgR1IpOyAvKiBudWxsICovCisJTlZPQkpfQ0xBU1MoZGV2LCAweDUwMzksIEdSKTsgLyogbTJtZiAqLworCU5WT0JKX0NMQVNTKGRldiwgMHg1MDJkLCBHUik7IC8qIDJkICovCisKKwkvKiB0ZXNsYSAqLworCWlmIChkZXZfcHJpdi0+Y2hpcHNldCA9PSAweDUwKQorCQlOVk9CSl9DTEFTUyhkZXYsIDB4NTA5NywgR1IpOyAvKiB0ZXNsYSAobnY1MCkgKi8KKwllbHNlCisJaWYgKGRldl9wcml2LT5jaGlwc2V0IDwgMHhhMCkKKwkJTlZPQkpfQ0xBU1MoZGV2LCAweDgyOTcsIEdSKTsgLyogdGVzbGEgKG52OHgvbnY5eCkgKi8KKwllbHNlIHsKKwkJc3dpdGNoIChkZXZfcHJpdi0+Y2hpcHNldCkgeworCQljYXNlIDB4YTA6CisJCWNhc2UgMHhhYToKKwkJY2FzZSAweGFjOgorCQkJTlZPQkpfQ0xBU1MoZGV2LCAweDgzOTcsIEdSKTsKKwkJCWJyZWFrOworCQljYXNlIDB4YTM6CisJCWNhc2UgMHhhNToKKwkJY2FzZSAweGE4OgorCQkJTlZPQkpfQ0xBU1MoZGV2LCAweDg1OTcsIEdSKTsKKwkJCWJyZWFrOworCQljYXNlIDB4YWY6CisJCQlOVk9CSl9DTEFTUyhkZXYsIDB4ODY5NywgR1IpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvKiBjb21wdXRlICovCisJTlZPQkpfQ0xBU1MoZGV2LCAweDUwYzAsIEdSKTsKKwlpZiAoZGV2X3ByaXYtPmNoaXBzZXQgID4gMHhhMCAmJgorCSAgICBkZXZfcHJpdi0+Y2hpcHNldCAhPSAweGFhICYmCisJICAgIGRldl9wcml2LT5jaGlwc2V0ICE9IDB4YWMpCisJCU5WT0JKX0NMQVNTKGRldiwgMHg4NWMwLCBHUik7CisKKwlkZXZfcHJpdi0+ZW5naW5lLmdyYXBoLnJlZ2lzdGVyZWQgPSB0cnVlOworCXJldHVybiAwOworfQogCiB2b2lkCiBudjUwX2dyYXBoX3RsYl9mbHVzaChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogewotCW52NTBfdm1fZmx1c2goZGV2LCAwKTsKKwludjUwX3ZtX2ZsdXNoX2VuZ2luZShkZXYsIDApOwogfQogCiB2b2lkCkBAIC00NDksOCArNTE1LDUzNSBAQAogCQkJIG52X3JkMzIoZGV2LCAweDQwMDM4NCksIG52X3JkMzIoZGV2LCAweDQwMDM4OCkpOwogCX0KIAotCW52NTBfdm1fZmx1c2goZGV2LCAwKTsKKwludjUwX3ZtX2ZsdXNoX2VuZ2luZShkZXYsIDApOwogCiAJbnZfbWFzayhkZXYsIDB4NDAwNTAwLCAweDAwMDAwMDAxLCAweDAwMDAwMDAxKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZfcHJpdi0+Y29udGV4dF9zd2l0Y2hfbG9jaywgZmxhZ3MpOwogfQorCitzdGF0aWMgc3RydWN0IG5vdXZlYXVfZW51bSBudjUwX21wX2V4ZWNfZXJyb3JfbmFtZXNbXSA9Cit7CisJeyAzLCAiU1RBQ0tfVU5ERVJGTE9XIiB9LAorCXsgNCwgIlFVQURPTl9BQ1RJVkUiIH0sCisJeyA4LCAiVElNRU9VVCIgfSwKKwl7IDB4MTAsICJJTlZBTElEX09QQ09ERSIgfSwKKwl7IDB4NDAsICJCUkVBS1BPSU5UIiB9LAorCXt9Cit9OworCitzdGF0aWMgc3RydWN0IG5vdXZlYXVfYml0ZmllbGQgbnY1MF9ncmFwaF90cmFwX20ybWZbXSA9IHsKKwl7IDB4MDAwMDAwMDEsICJOT1RJRlkiIH0sCisJeyAweDAwMDAwMDAyLCAiSU4iIH0sCisJeyAweDAwMDAwMDA0LCAiT1VUIiB9LAorCXt9Cit9OworCitzdGF0aWMgc3RydWN0IG5vdXZlYXVfYml0ZmllbGQgbnY1MF9ncmFwaF90cmFwX3ZmZXRjaFtdID0geworCXsgMHgwMDAwMDAwMSwgIkZBVUxUIiB9LAorCXt9Cit9OworCitzdGF0aWMgc3RydWN0IG5vdXZlYXVfYml0ZmllbGQgbnY1MF9ncmFwaF90cmFwX3N0cm1vdXRbXSA9IHsKKwl7IDB4MDAwMDAwMDEsICJGQVVMVCIgfSwKKwl7fQorfTsKKworc3RhdGljIHN0cnVjdCBub3V2ZWF1X2JpdGZpZWxkIG52NTBfZ3JhcGhfdHJhcF9jY2FjaGVbXSA9IHsKKwl7IDB4MDAwMDAwMDEsICJGQVVMVCIgfSwKKwl7fQorfTsKKworLyogVGhlcmUgbXVzdCBiZSBhICpsb3QqIG9mIHRoZXNlLiBXaWxsIHRha2Ugc29tZSB0aW1lIHRvIGdhdGhlciB0aGVtIHVwLiAqLworc3RydWN0IG5vdXZlYXVfZW51bSBudjUwX2RhdGFfZXJyb3JfbmFtZXNbXSA9IHsKKwl7IDB4MDAwMDAwMDMsICJJTlZBTElEX1FVRVJZX09SX1RFWFRVUkUiIH0sCisJeyAweDAwMDAwMDA0LCAiSU5WQUxJRF9WQUxVRSIgfSwKKwl7IDB4MDAwMDAwMDUsICJJTlZBTElEX0VOVU0iIH0sCisJeyAweDAwMDAwMDA4LCAiSU5WQUxJRF9PQkpFQ1QiIH0sCisJeyAweDAwMDAwMDA5LCAiUkVBRF9PTkxZX09CSkVDVCIgfSwKKwl7IDB4MDAwMDAwMGEsICJTVVBFUlZJU09SX09CSkVDVCIgfSwKKwl7IDB4MDAwMDAwMGIsICJJTlZBTElEX0FERFJFU1NfQUxJR05NRU5UIiB9LAorCXsgMHgwMDAwMDAwYywgIklOVkFMSURfQklURklFTEQiIH0sCisJeyAweDAwMDAwMDBkLCAiQkVHSU5fRU5EX0FDVElWRSIgfSwKKwl7IDB4MDAwMDAwMGUsICJTRU1BTlRJQ19DT0xPUl9CQUNLX09WRVJfTElNSVQiIH0sCisJeyAweDAwMDAwMDBmLCAiVklFV1BPUlRfSURfTkVFRFNfR1AiIH0sCisJeyAweDAwMDAwMDEwLCAiUlRfRE9VQkxFX0JJTkQiIH0sCisJeyAweDAwMDAwMDExLCAiUlRfVFlQRVNfTUlTTUFUQ0giIH0sCisJeyAweDAwMDAwMDEyLCAiUlRfTElORUFSX1dJVEhfWkVUQSIgfSwKKwl7IDB4MDAwMDAwMTUsICJGUF9UT09fRkVXX1JFR1MiIH0sCisJeyAweDAwMDAwMDE2LCAiWkVUQV9GT1JNQVRfQ1NBQV9NSVNNQVRDSCIgfSwKKwl7IDB4MDAwMDAwMTcsICJSVF9MSU5FQVJfV0lUSF9NU0FBIiB9LAorCXsgMHgwMDAwMDAxOCwgIkZQX0lOVEVSUE9MQU5UX1NUQVJUX09WRVJfTElNSVQiIH0sCisJeyAweDAwMDAwMDE5LCAiU0VNQU5USUNfTEFZRVJfT1ZFUl9MSU1JVCIgfSwKKwl7IDB4MDAwMDAwMWEsICJSVF9JTlZBTElEX0FMSUdOTUVOVCIgfSwKKwl7IDB4MDAwMDAwMWIsICJTQU1QTEVSX09WRVJfTElNSVQiIH0sCisJeyAweDAwMDAwMDFjLCAiVEVYVFVSRV9PVkVSX0xJTUlUIiB9LAorCXsgMHgwMDAwMDAxZSwgIkdQX1RPT19NQU5ZX09VVFBVVFMiIH0sCisJeyAweDAwMDAwMDFmLCAiUlRfQlBQMTI4X1dJVEhfTVM4IiB9LAorCXsgMHgwMDAwMDAyMSwgIlpfT1VUX09GX0JPVU5EUyIgfSwKKwl7IDB4MDAwMDAwMjMsICJYWV9PVVRfT0ZfQk9VTkRTIiB9LAorCXsgMHgwMDAwMDAyNywgIkNQX01PUkVfUEFSQU1TX1RIQU5fU0hBUkVEIiB9LAorCXsgMHgwMDAwMDAyOCwgIkNQX05PX1JFR19TUEFDRV9TVFJJUEVEIiB9LAorCXsgMHgwMDAwMDAyOSwgIkNQX05PX1JFR19TUEFDRV9QQUNLRUQiIH0sCisJeyAweDAwMDAwMDJhLCAiQ1BfTk9UX0VOT1VHSF9XQVJQUyIgfSwKKwl7IDB4MDAwMDAwMmIsICJDUF9CTE9DS19TSVpFX01JU01BVENIIiB9LAorCXsgMHgwMDAwMDAyYywgIkNQX05PVF9FTk9VR0hfTE9DQUxfV0FSUFMiIH0sCisJeyAweDAwMDAwMDJkLCAiQ1BfTk9UX0VOT1VHSF9TVEFDS19XQVJQUyIgfSwKKwl7IDB4MDAwMDAwMmUsICJDUF9OT19CTE9DS0RJTV9MQVRDSCIgfSwKKwl7IDB4MDAwMDAwMzEsICJFTkcyRF9GT1JNQVRfTUlTTUFUQ0giIH0sCisJeyAweDAwMDAwMDNmLCAiUFJJTUlUSVZFX0lEX05FRURTX0dQIiB9LAorCXsgMHgwMDAwMDA0NCwgIlNFTUFOVElDX1ZJRVdQT1JUX09WRVJfTElNSVQiIH0sCisJeyAweDAwMDAwMDQ1LCAiU0VNQU5USUNfQ09MT1JfRlJPTlRfT1ZFUl9MSU1JVCIgfSwKKwl7IDB4MDAwMDAwNDYsICJMQVlFUl9JRF9ORUVEU19HUCIgfSwKKwl7IDB4MDAwMDAwNDcsICJTRU1BTlRJQ19DTElQX09WRVJfTElNSVQiIH0sCisJeyAweDAwMDAwMDQ4LCAiU0VNQU5USUNfUFRTWl9PVkVSX0xJTUlUIiB9LAorCXt9Cit9OworCitzdGF0aWMgc3RydWN0IG5vdXZlYXVfYml0ZmllbGQgbnY1MF9ncmFwaF9pbnRyW10gPSB7CisJeyAweDAwMDAwMDAxLCAiTk9USUZZIiB9LAorCXsgMHgwMDAwMDAwMiwgIkNPTVBVVEVfUVVFUlkiIH0sCisJeyAweDAwMDAwMDEwLCAiSUxMRUdBTF9NVEhEIiB9LAorCXsgMHgwMDAwMDAyMCwgIklMTEVHQUxfQ0xBU1MiIH0sCisJeyAweDAwMDAwMDQwLCAiRE9VQkxFX05PVElGWSIgfSwKKwl7IDB4MDAwMDEwMDAsICJDT05URVhUX1NXSVRDSCIgfSwKKwl7IDB4MDAwMTAwMDAsICJCVUZGRVJfTk9USUZZIiB9LAorCXsgMHgwMDEwMDAwMCwgIkRBVEFfRVJST1IiIH0sCisJeyAweDAwMjAwMDAwLCAiVFJBUCIgfSwKKwl7IDB4MDEwMDAwMDAsICJTSU5HTEVfU1RFUCIgfSwKKwl7fQorfTsKKworc3RhdGljIHZvaWQKK252NTBfcGdyYXBoX21wX3RyYXAoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IHRwaWQsIGludCBkaXNwbGF5KQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJdWludDMyX3QgdW5pdHMgPSBudl9yZDMyKGRldiwgMHgxNTQwKTsKKwl1aW50MzJfdCBhZGRyLCBtcDEwLCBzdGF0dXMsIHBjLCBvcGxvdywgb3BoaWdoOworCWludCBpOworCWludCBtcHMgPSAwOworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKwkJaWYgKCEodW5pdHMgJiAxIDw8IChpKzI0KSkpCisJCQljb250aW51ZTsKKwkJaWYgKGRldl9wcml2LT5jaGlwc2V0IDwgMHhhMCkKKwkJCWFkZHIgPSAweDQwODIwMCArICh0cGlkIDw8IDEyKSArIChpIDw8IDcpOworCQllbHNlCisJCQlhZGRyID0gMHg0MDgxMDAgKyAodHBpZCA8PCAxMSkgKyAoaSA8PCA3KTsKKwkJbXAxMCA9IG52X3JkMzIoZGV2LCBhZGRyICsgMHgxMCk7CisJCXN0YXR1cyA9IG52X3JkMzIoZGV2LCBhZGRyICsgMHgxNCk7CisJCWlmICghc3RhdHVzKQorCQkJY29udGludWU7CisJCWlmIChkaXNwbGF5KSB7CisJCQludl9yZDMyKGRldiwgYWRkciArIDB4MjApOworCQkJcGMgPSBudl9yZDMyKGRldiwgYWRkciArIDB4MjQpOworCQkJb3Bsb3cgPSBudl9yZDMyKGRldiwgYWRkciArIDB4NzApOworCQkJb3BoaWdoPSBudl9yZDMyKGRldiwgYWRkciArIDB4NzQpOworCQkJTlZfSU5GTyhkZXYsICJQR1JBUEhfVFJBUF9NUF9FWEVDIC0gIgorCQkJCQkiVFAgJWQgTVAgJWQ6ICIsIHRwaWQsIGkpOworCQkJbm91dmVhdV9lbnVtX3ByaW50KG52NTBfbXBfZXhlY19lcnJvcl9uYW1lcywgc3RhdHVzKTsKKwkJCXByaW50aygiIGF0ICUwNnggd2FycCAlZCwgb3Bjb2RlICUwOHggJTA4eFxuIiwKKwkJCQkJcGMmMHhmZmZmZmYsIHBjID4+IDI0LAorCQkJCQlvcGxvdywgb3BoaWdoKTsKKwkJfQorCQludl93cjMyKGRldiwgYWRkciArIDB4MTAsIG1wMTApOworCQludl93cjMyKGRldiwgYWRkciArIDB4MTQsIDApOworCQltcHMrKzsKKwl9CisJaWYgKCFtcHMgJiYgZGlzcGxheSkKKwkJTlZfSU5GTyhkZXYsICJQR1JBUEhfVFJBUF9NUF9FWEVDIC0gVFAgJWQ6ICIKKwkJCQkiTm8gTVBzIGNsYWltaW5nIGVycm9ycz9cbiIsIHRwaWQpOworfQorCitzdGF0aWMgdm9pZAorbnY1MF9wZ3JhcGhfdHBfdHJhcChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgdHlwZSwgdWludDMyX3QgdXN0YXR1c19vbGQsCisJCXVpbnQzMl90IHVzdGF0dXNfbmV3LCBpbnQgZGlzcGxheSwgY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWludCB0cHMgPSAwOworCXVpbnQzMl90IHVuaXRzID0gbnZfcmQzMihkZXYsIDB4MTU0MCk7CisJaW50IGksIHI7CisJdWludDMyX3QgdXN0YXR1c19hZGRyLCB1c3RhdHVzOworCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisJCWlmICghKHVuaXRzICYgKDEgPDwgaSkpKQorCQkJY29udGludWU7CisJCWlmIChkZXZfcHJpdi0+Y2hpcHNldCA8IDB4YTApCisJCQl1c3RhdHVzX2FkZHIgPSB1c3RhdHVzX29sZCArIChpIDw8IDEyKTsKKwkJZWxzZQorCQkJdXN0YXR1c19hZGRyID0gdXN0YXR1c19uZXcgKyAoaSA8PCAxMSk7CisJCXVzdGF0dXMgPSBudl9yZDMyKGRldiwgdXN0YXR1c19hZGRyKSAmIDB4N2ZmZmZmZmY7CisJCWlmICghdXN0YXR1cykKKwkJCWNvbnRpbnVlOworCQl0cHMrKzsKKwkJc3dpdGNoICh0eXBlKSB7CisJCWNhc2UgNjogLyogdGV4dHVyZSBlcnJvci4uLiB1bmtub3duIGZvciBub3cgKi8KKwkJCW52NTBfZmJfdm1fdHJhcChkZXYsIGRpc3BsYXksIG5hbWUpOworCQkJaWYgKGRpc3BsYXkpIHsKKwkJCQlOVl9FUlJPUihkZXYsICJtYWdpYyBzZXQgJWQ6XG4iLCBpKTsKKwkJCQlmb3IgKHIgPSB1c3RhdHVzX2FkZHIgKyA0OyByIDw9IHVzdGF0dXNfYWRkciArIDB4MTA7IHIgKz0gNCkKKwkJCQkJTlZfRVJST1IoZGV2LCAiXHQweCUwOHg6IDB4JTA4eFxuIiwgciwKKwkJCQkJCW52X3JkMzIoZGV2LCByKSk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSA3OiAvKiBNUCBlcnJvciAqLworCQkJaWYgKHVzdGF0dXMgJiAweDAwMDEwMDAwKSB7CisJCQkJbnY1MF9wZ3JhcGhfbXBfdHJhcChkZXYsIGksIGRpc3BsYXkpOworCQkJCXVzdGF0dXMgJj0gfjB4MDAwMTAwMDA7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSA4OiAvKiBUUERNQSBlcnJvciAqLworCQkJeworCQkJdWludDMyX3QgZTBjID0gbnZfcmQzMihkZXYsIHVzdGF0dXNfYWRkciArIDQpOworCQkJdWludDMyX3QgZTEwID0gbnZfcmQzMihkZXYsIHVzdGF0dXNfYWRkciArIDgpOworCQkJdWludDMyX3QgZTE0ID0gbnZfcmQzMihkZXYsIHVzdGF0dXNfYWRkciArIDB4Yyk7CisJCQl1aW50MzJfdCBlMTggPSBudl9yZDMyKGRldiwgdXN0YXR1c19hZGRyICsgMHgxMCk7CisJCQl1aW50MzJfdCBlMWMgPSBudl9yZDMyKGRldiwgdXN0YXR1c19hZGRyICsgMHgxNCk7CisJCQl1aW50MzJfdCBlMjAgPSBudl9yZDMyKGRldiwgdXN0YXR1c19hZGRyICsgMHgxOCk7CisJCQl1aW50MzJfdCBlMjQgPSBudl9yZDMyKGRldiwgdXN0YXR1c19hZGRyICsgMHgxYyk7CisJCQludjUwX2ZiX3ZtX3RyYXAoZGV2LCBkaXNwbGF5LCBuYW1lKTsKKwkJCS8qIDJkIGVuZ2luZSBkZXN0aW5hdGlvbiAqLworCQkJaWYgKHVzdGF0dXMgJiAweDAwMDAwMDEwKSB7CisJCQkJaWYgKGRpc3BsYXkpIHsKKwkJCQkJTlZfSU5GTyhkZXYsICJQR1JBUEhfVFJBUF9UUERNQV8yRCAtIFRQICVkIC0gVW5rbm93biBmYXVsdCBhdCBhZGRyZXNzICUwMnglMDh4XG4iLAorCQkJCQkJCWksIGUxNCwgZTEwKTsKKwkJCQkJTlZfSU5GTyhkZXYsICJQR1JBUEhfVFJBUF9UUERNQV8yRCAtIFRQICVkIC0gZTBjOiAlMDh4LCBlMTg6ICUwOHgsIGUxYzogJTA4eCwgZTIwOiAlMDh4LCBlMjQ6ICUwOHhcbiIsCisJCQkJCQkJaSwgZTBjLCBlMTgsIGUxYywgZTIwLCBlMjQpOworCQkJCX0KKwkJCQl1c3RhdHVzICY9IH4weDAwMDAwMDEwOworCQkJfQorCQkJLyogUmVuZGVyIHRhcmdldCAqLworCQkJaWYgKHVzdGF0dXMgJiAweDAwMDAwMDQwKSB7CisJCQkJaWYgKGRpc3BsYXkpIHsKKwkJCQkJTlZfSU5GTyhkZXYsICJQR1JBUEhfVFJBUF9UUERNQV9SVCAtIFRQICVkIC0gVW5rbm93biBmYXVsdCBhdCBhZGRyZXNzICUwMnglMDh4XG4iLAorCQkJCQkJCWksIGUxNCwgZTEwKTsKKwkJCQkJTlZfSU5GTyhkZXYsICJQR1JBUEhfVFJBUF9UUERNQV9SVCAtIFRQICVkIC0gZTBjOiAlMDh4LCBlMTg6ICUwOHgsIGUxYzogJTA4eCwgZTIwOiAlMDh4LCBlMjQ6ICUwOHhcbiIsCisJCQkJCQkJaSwgZTBjLCBlMTgsIGUxYywgZTIwLCBlMjQpOworCQkJCX0KKwkJCQl1c3RhdHVzICY9IH4weDAwMDAwMDQwOworCQkJfQorCQkJLyogQ1VEQSBtZW1vcnk6IGxbXSwgZ1tdIG9yIHN0YWNrLiAqLworCQkJaWYgKHVzdGF0dXMgJiAweDAwMDAwMDgwKSB7CisJCQkJaWYgKGRpc3BsYXkpIHsKKwkJCQkJaWYgKGUxOCAmIDB4ODAwMDAwMDApIHsKKwkJCQkJCS8qIGdbXSByZWFkIGZhdWx0PyAqLworCQkJCQkJTlZfSU5GTyhkZXYsICJQR1JBUEhfVFJBUF9UUERNQSAtIFRQICVkIC0gR2xvYmFsIHJlYWQgZmF1bHQgYXQgYWRkcmVzcyAlMDJ4JTA4eFxuIiwKKwkJCQkJCQkJaSwgZTE0LCBlMTAgfCAoKGUxOCA+PiAyNCkgJiAweDFmKSk7CisJCQkJCQllMTggJj0gfjB4MWYwMDAwMDA7CisJCQkJCX0gZWxzZSBpZiAoZTE4ICYgMHhjKSB7CisJCQkJCQkvKiBnW10gd3JpdGUgZmF1bHQ/ICovCisJCQkJCQlOVl9JTkZPKGRldiwgIlBHUkFQSF9UUkFQX1RQRE1BIC0gVFAgJWQgLSBHbG9iYWwgd3JpdGUgZmF1bHQgYXQgYWRkcmVzcyAlMDJ4JTA4eFxuIiwKKwkJCQkJCQkJaSwgZTE0LCBlMTAgfCAoKGUxOCA+PiA3KSAmIDB4MWYpKTsKKwkJCQkJCWUxOCAmPSB+MHgwMDAwMGY4MDsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCU5WX0lORk8oZGV2LCAiUEdSQVBIX1RSQVBfVFBETUEgLSBUUCAlZCAtIFVua25vd24gQ1VEQSBmYXVsdCBhdCBhZGRyZXNzICUwMnglMDh4XG4iLAorCQkJCQkJCQlpLCBlMTQsIGUxMCk7CisJCQkJCX0KKwkJCQkJTlZfSU5GTyhkZXYsICJQR1JBUEhfVFJBUF9UUERNQSAtIFRQICVkIC0gZTBjOiAlMDh4LCBlMTg6ICUwOHgsIGUxYzogJTA4eCwgZTIwOiAlMDh4LCBlMjQ6ICUwOHhcbiIsCisJCQkJCQkJaSwgZTBjLCBlMTgsIGUxYywgZTIwLCBlMjQpOworCQkJCX0KKwkJCQl1c3RhdHVzICY9IH4weDAwMDAwMDgwOworCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCX0KKwkJaWYgKHVzdGF0dXMpIHsKKwkJCWlmIChkaXNwbGF5KQorCQkJCU5WX0lORk8oZGV2LCAiJXMgLSBUUCVkOiBVbmhhbmRsZWQgdXN0YXR1cyAweCUwOHhcbiIsIG5hbWUsIGksIHVzdGF0dXMpOworCQl9CisJCW52X3dyMzIoZGV2LCB1c3RhdHVzX2FkZHIsIDB4YzAwMDAwMDApOworCX0KKworCWlmICghdHBzICYmIGRpc3BsYXkpCisJCU5WX0lORk8oZGV2LCAiJXMgLSBObyBUUHMgY2xhaW1pbmcgZXJyb3JzP1xuIiwgbmFtZSk7Cit9CisKK3N0YXRpYyBpbnQKK252NTBfcGdyYXBoX3RyYXBfaGFuZGxlcihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1MzIgZGlzcGxheSwgdTY0IGluc3QsIHUzMiBjaGlkKQoreworCXUzMiBzdGF0dXMgPSBudl9yZDMyKGRldiwgMHg0MDAxMDgpOworCXUzMiB1c3RhdHVzOworCisJaWYgKCFzdGF0dXMgJiYgZGlzcGxheSkgeworCQlOVl9JTkZPKGRldiwgIlBHUkFQSCAtIFRSQVA6IG5vIHVuaXRzIHJlcG9ydGluZyB0cmFwcz9cbiIpOworCQlyZXR1cm4gMTsKKwl9CisKKwkvKiBESVNQQVRDSDogUmVsYXlzIGNvbW1hbmRzIHRvIG90aGVyIHVuaXRzIGFuZCBoYW5kbGVzIE5PVElGWSwKKwkgKiBDT05ELCBRVUVSWS4gSWYgeW91IGdldCBhIHRyYXAgZnJvbSBpdCwgdGhlIGNvbW1hbmQgaXMgc3RpbGwgc3R1Y2sKKwkgKiBpbiBESVNQQVRDSCBhbmQgeW91IG5lZWQgdG8gZG8gc29tZXRoaW5nIGFib3V0IGl0LiAqLworCWlmIChzdGF0dXMgJiAweDAwMSkgeworCQl1c3RhdHVzID0gbnZfcmQzMihkZXYsIDB4NDAwODA0KSAmIDB4N2ZmZmZmZmY7CisJCWlmICghdXN0YXR1cyAmJiBkaXNwbGF5KSB7CisJCQlOVl9JTkZPKGRldiwgIlBHUkFQSF9UUkFQX0RJU1BBVENIIC0gbm8gdXN0YXR1cz9cbiIpOworCQl9CisKKwkJbnZfd3IzMihkZXYsIDB4NDAwNTAwLCAweDAwMDAwMDAwKTsKKworCQkvKiBLbm93biB0byBiZSB0cmlnZ2VyZWQgYnkgc2NyZXdlZCB1cCBOT1RJRlkgYW5kIENPTkQuLi4gKi8KKwkJaWYgKHVzdGF0dXMgJiAweDAwMDAwMDAxKSB7CisJCQl1MzIgYWRkciA9IG52X3JkMzIoZGV2LCAweDQwMDgwOCk7CisJCQl1MzIgc3ViYyA9IChhZGRyICYgMHgwMDA3MDAwMCkgPj4gMTY7CisJCQl1MzIgbXRoZCA9IChhZGRyICYgMHgwMDAwMWZmYyk7CisJCQl1MzIgZGF0YWwgPSBudl9yZDMyKGRldiwgMHg0MDA4MGMpOworCQkJdTMyIGRhdGFoID0gbnZfcmQzMihkZXYsIDB4NDAwODEwKTsKKwkJCXUzMiBjbGFzcyA9IG52X3JkMzIoZGV2LCAweDQwMDgxNCk7CisJCQl1MzIgcjg0OCA9IG52X3JkMzIoZGV2LCAweDQwMDg0OCk7CisKKwkJCU5WX0lORk8oZGV2LCAiUEdSQVBIIC0gVFJBUCBESVNQQVRDSF9GQVVMVFxuIik7CisJCQlpZiAoZGlzcGxheSAmJiAoYWRkciAmIDB4ODAwMDAwMDApKSB7CisJCQkJTlZfSU5GTyhkZXYsICJQR1JBUEggLSBjaCAlZCAoMHglMDEwbGx4KSAiCisJCQkJCSAgICAgInN1YmMgJWQgY2xhc3MgMHglMDR4IG10aGQgMHglMDR4ICIKKwkJCQkJICAgICAiZGF0YSAweCUwOHglMDh4ICIKKwkJCQkJICAgICAiNDAwODA4IDB4JTA4eCA0MDA4NDggMHglMDh4XG4iLAorCQkJCQljaGlkLCBpbnN0LCBzdWJjLCBjbGFzcywgbXRoZCwgZGF0YWgsCisJCQkJCWRhdGFsLCBhZGRyLCByODQ4KTsKKwkJCX0gZWxzZQorCQkJaWYgKGRpc3BsYXkpIHsKKwkJCQlOVl9JTkZPKGRldiwgIlBHUkFQSCAtIG5vIHN0dWNrIGNvbW1hbmQ/XG4iKTsKKwkJCX0KKworCQkJbnZfd3IzMihkZXYsIDB4NDAwODA4LCAwKTsKKwkJCW52X3dyMzIoZGV2LCAweDQwMDhlOCwgbnZfcmQzMihkZXYsIDB4NDAwOGU4KSAmIDMpOworCQkJbnZfd3IzMihkZXYsIDB4NDAwODQ4LCAwKTsKKwkJCXVzdGF0dXMgJj0gfjB4MDAwMDAwMDE7CisJCX0KKworCQlpZiAodXN0YXR1cyAmIDB4MDAwMDAwMDIpIHsKKwkJCXUzMiBhZGRyID0gbnZfcmQzMihkZXYsIDB4NDAwODRjKTsKKwkJCXUzMiBzdWJjID0gKGFkZHIgJiAweDAwMDcwMDAwKSA+PiAxNjsKKwkJCXUzMiBtdGhkID0gKGFkZHIgJiAweDAwMDAxZmZjKTsKKwkJCXUzMiBkYXRhID0gbnZfcmQzMihkZXYsIDB4NDAwODVjKTsKKwkJCXUzMiBjbGFzcyA9IG52X3JkMzIoZGV2LCAweDQwMDgxNCk7CisKKwkJCU5WX0lORk8oZGV2LCAiUEdSQVBIIC0gVFJBUCBESVNQQVRDSF9RVUVSWVxuIik7CisJCQlpZiAoZGlzcGxheSAmJiAoYWRkciAmIDB4ODAwMDAwMDApKSB7CisJCQkJTlZfSU5GTyhkZXYsICJQR1JBUEggLSBjaCAlZCAoMHglMDEwbGx4KSAiCisJCQkJCSAgICAgInN1YmMgJWQgY2xhc3MgMHglMDR4IG10aGQgMHglMDR4ICIKKwkJCQkJICAgICAiZGF0YSAweCUwOHggNDAwODRjIDB4JTA4eFxuIiwKKwkJCQkJY2hpZCwgaW5zdCwgc3ViYywgY2xhc3MsIG10aGQsCisJCQkJCWRhdGEsIGFkZHIpOworCQkJfSBlbHNlCisJCQlpZiAoZGlzcGxheSkgeworCQkJCU5WX0lORk8oZGV2LCAiUEdSQVBIIC0gbm8gc3R1Y2sgY29tbWFuZD9cbiIpOworCQkJfQorCisJCQludl93cjMyKGRldiwgMHg0MDA4NGMsIDApOworCQkJdXN0YXR1cyAmPSB+MHgwMDAwMDAwMjsKKwkJfQorCisJCWlmICh1c3RhdHVzICYmIGRpc3BsYXkpIHsKKwkJCU5WX0lORk8oZGV2LCAiUEdSQVBIIC0gVFJBUF9ESVNQQVRDSCAodW5rbm93biAiCisJCQkJICAgICAgIjB4JTA4eClcbiIsIHVzdGF0dXMpOworCQl9CisKKwkJbnZfd3IzMihkZXYsIDB4NDAwODA0LCAweGMwMDAwMDAwKTsKKwkJbnZfd3IzMihkZXYsIDB4NDAwMTA4LCAweDAwMSk7CisJCXN0YXR1cyAmPSB+MHgwMDE7CisJCWlmICghc3RhdHVzKQorCQkJcmV0dXJuIDA7CisJfQorCisJLyogTTJNRjogTWVtb3J5IHRvIG1lbW9yeSBjb3B5IGVuZ2luZS4gKi8KKwlpZiAoc3RhdHVzICYgMHgwMDIpIHsKKwkJdTMyIHVzdGF0dXMgPSBudl9yZDMyKGRldiwgMHg0MDY4MDApICYgMHg3ZmZmZmZmZjsKKwkJaWYgKGRpc3BsYXkpIHsKKwkJCU5WX0lORk8oZGV2LCAiUEdSQVBIIC0gVFJBUF9NMk1GIik7CisJCQlub3V2ZWF1X2JpdGZpZWxkX3ByaW50KG52NTBfZ3JhcGhfdHJhcF9tMm1mLCB1c3RhdHVzKTsKKwkJCXByaW50aygiXG4iKTsKKwkJCU5WX0lORk8oZGV2LCAiUEdSQVBIIC0gVFJBUF9NMk1GICUwOHggJTA4eCAlMDh4ICUwOHhcbiIsCisJCQkJbnZfcmQzMihkZXYsIDB4NDA2ODA0KSwgbnZfcmQzMihkZXYsIDB4NDA2ODA4KSwKKwkJCQludl9yZDMyKGRldiwgMHg0MDY4MGMpLCBudl9yZDMyKGRldiwgMHg0MDY4MTApKTsKKworCQl9CisKKwkJLyogTm8gc2FuZSB3YXkgZm91bmQgeWV0IC0tIGp1c3QgcmVzZXQgdGhlIGJ1Z2dlci4gKi8KKwkJbnZfd3IzMihkZXYsIDB4NDAwMDQwLCAyKTsKKwkJbnZfd3IzMihkZXYsIDB4NDAwMDQwLCAwKTsKKwkJbnZfd3IzMihkZXYsIDB4NDA2ODAwLCAweGMwMDAwMDAwKTsKKwkJbnZfd3IzMihkZXYsIDB4NDAwMTA4LCAweDAwMik7CisJCXN0YXR1cyAmPSB+MHgwMDI7CisJfQorCisJLyogVkZFVENIOiBGZXRjaGVzIGRhdGEgZnJvbSB2ZXJ0ZXggYnVmZmVycy4gKi8KKwlpZiAoc3RhdHVzICYgMHgwMDQpIHsKKwkJdTMyIHVzdGF0dXMgPSBudl9yZDMyKGRldiwgMHg0MDBjMDQpICYgMHg3ZmZmZmZmZjsKKwkJaWYgKGRpc3BsYXkpIHsKKwkJCU5WX0lORk8oZGV2LCAiUEdSQVBIIC0gVFJBUF9WRkVUQ0giKTsKKwkJCW5vdXZlYXVfYml0ZmllbGRfcHJpbnQobnY1MF9ncmFwaF90cmFwX3ZmZXRjaCwgdXN0YXR1cyk7CisJCQlwcmludGsoIlxuIik7CisJCQlOVl9JTkZPKGRldiwgIlBHUkFQSCAtIFRSQVBfVkZFVENIICUwOHggJTA4eCAlMDh4ICUwOHhcbiIsCisJCQkJbnZfcmQzMihkZXYsIDB4NDAwYzAwKSwgbnZfcmQzMihkZXYsIDB4NDAwYzA4KSwKKwkJCQludl9yZDMyKGRldiwgMHg0MDBjMGMpLCBudl9yZDMyKGRldiwgMHg0MDBjMTApKTsKKwkJfQorCisJCW52X3dyMzIoZGV2LCAweDQwMGMwNCwgMHhjMDAwMDAwMCk7CisJCW52X3dyMzIoZGV2LCAweDQwMDEwOCwgMHgwMDQpOworCQlzdGF0dXMgJj0gfjB4MDA0OworCX0KKworCS8qIFNUUk1PVVQ6IERpcmVjdFggc3RyZWFtb3V0IC8gT3BlbkdMIHRyYW5zZm9ybSBmZWVkYmFjay4gKi8KKwlpZiAoc3RhdHVzICYgMHgwMDgpIHsKKwkJdXN0YXR1cyA9IG52X3JkMzIoZGV2LCAweDQwMTgwMCkgJiAweDdmZmZmZmZmOworCQlpZiAoZGlzcGxheSkgeworCQkJTlZfSU5GTyhkZXYsICJQR1JBUEggLSBUUkFQX1NUUk1PVVQiKTsKKwkJCW5vdXZlYXVfYml0ZmllbGRfcHJpbnQobnY1MF9ncmFwaF90cmFwX3N0cm1vdXQsIHVzdGF0dXMpOworCQkJcHJpbnRrKCJcbiIpOworCQkJTlZfSU5GTyhkZXYsICJQR1JBUEggLSBUUkFQX1NUUk1PVVQgJTA4eCAlMDh4ICUwOHggJTA4eFxuIiwKKwkJCQludl9yZDMyKGRldiwgMHg0MDE4MDQpLCBudl9yZDMyKGRldiwgMHg0MDE4MDgpLAorCQkJCW52X3JkMzIoZGV2LCAweDQwMTgwYyksIG52X3JkMzIoZGV2LCAweDQwMTgxMCkpOworCisJCX0KKworCQkvKiBObyBzYW5lIHdheSBmb3VuZCB5ZXQgLS0ganVzdCByZXNldCB0aGUgYnVnZ2VyLiAqLworCQludl93cjMyKGRldiwgMHg0MDAwNDAsIDB4ODApOworCQludl93cjMyKGRldiwgMHg0MDAwNDAsIDApOworCQludl93cjMyKGRldiwgMHg0MDE4MDAsIDB4YzAwMDAwMDApOworCQludl93cjMyKGRldiwgMHg0MDAxMDgsIDB4MDA4KTsKKwkJc3RhdHVzICY9IH4weDAwODsKKwl9CisKKwkvKiBDQ0FDSEU6IEhhbmRsZXMgY29kZSBhbmQgY1tdIGNhY2hlcyBhbmQgZmlsbHMgdGhlbS4gKi8KKwlpZiAoc3RhdHVzICYgMHgwMTApIHsKKwkJdXN0YXR1cyA9IG52X3JkMzIoZGV2LCAweDQwNTAxOCkgJiAweDdmZmZmZmZmOworCQlpZiAoZGlzcGxheSkgeworCQkJTlZfSU5GTyhkZXYsICJQR1JBUEggLSBUUkFQX0NDQUNIRSIpOworCQkJbm91dmVhdV9iaXRmaWVsZF9wcmludChudjUwX2dyYXBoX3RyYXBfY2NhY2hlLCB1c3RhdHVzKTsKKwkJCXByaW50aygiXG4iKTsKKwkJCU5WX0lORk8oZGV2LCAiUEdSQVBIIC0gVFJBUF9DQ0FDSEUgJTA4eCAlMDh4ICUwOHggJTA4eCIKKwkJCQkgICAgICIgJTA4eCAlMDh4ICUwOHhcbiIsCisJCQkJbnZfcmQzMihkZXYsIDB4NDA1ODAwKSwgbnZfcmQzMihkZXYsIDB4NDA1ODA0KSwKKwkJCQludl9yZDMyKGRldiwgMHg0MDU4MDgpLCBudl9yZDMyKGRldiwgMHg0MDU4MGMpLAorCQkJCW52X3JkMzIoZGV2LCAweDQwNTgxMCksIG52X3JkMzIoZGV2LCAweDQwNTgxNCksCisJCQkJbnZfcmQzMihkZXYsIDB4NDA1ODFjKSk7CisKKwkJfQorCisJCW52X3dyMzIoZGV2LCAweDQwNTAxOCwgMHhjMDAwMDAwMCk7CisJCW52X3dyMzIoZGV2LCAweDQwMDEwOCwgMHgwMTApOworCQlzdGF0dXMgJj0gfjB4MDEwOworCX0KKworCS8qIFVua25vd24sIG5vdCBzZWVuIHlldC4uLiAweDQwMjAwMCBpcyB0aGUgb25seSB0cmFwIHN0YXR1cyByZWcKKwkgKiByZW1haW5pbmcsIHNvIHRyeSB0byBoYW5kbGUgaXQgYW55d2F5LiBQZXJoYXBzIHJlbGF0ZWQgdG8gdGhhdAorCSAqIHVua25vd24gRE1BIHNsb3Qgb24gdGVzbGE/ICovCisJaWYgKHN0YXR1cyAmIDB4MjApIHsKKwkJdXN0YXR1cyA9IG52X3JkMzIoZGV2LCAweDQwMjAwMCkgJiAweDdmZmZmZmZmOworCQlpZiAoZGlzcGxheSkKKwkJCU5WX0lORk8oZGV2LCAiUEdSQVBIIC0gVFJBUF9VTktDMDQgMHglMDh4XG4iLCB1c3RhdHVzKTsKKwkJbnZfd3IzMihkZXYsIDB4NDAyMDAwLCAweGMwMDAwMDAwKTsKKwkJLyogbm8gc3RhdHVzIG1vZGlmaWN0aW9uIG9uIHB1cnBvc2UgKi8KKwl9CisKKwkvKiBURVhUVVJFOiBDVURBIHRleHR1cmluZyB1bml0cyAqLworCWlmIChzdGF0dXMgJiAweDA0MCkgeworCQludjUwX3BncmFwaF90cF90cmFwKGRldiwgNiwgMHg0MDg5MDAsIDB4NDA4NjAwLCBkaXNwbGF5LAorCQkJCSAgICAiUEdSQVBIIC0gVFJBUF9URVhUVVJFIik7CisJCW52X3dyMzIoZGV2LCAweDQwMDEwOCwgMHgwNDApOworCQlzdGF0dXMgJj0gfjB4MDQwOworCX0KKworCS8qIE1QOiBDVURBIGV4ZWN1dGlvbiBlbmdpbmVzLiAqLworCWlmIChzdGF0dXMgJiAweDA4MCkgeworCQludjUwX3BncmFwaF90cF90cmFwKGRldiwgNywgMHg0MDgzMTQsIDB4NDA4MzFjLCBkaXNwbGF5LAorCQkJCSAgICAiUEdSQVBIIC0gVFJBUF9NUCIpOworCQludl93cjMyKGRldiwgMHg0MDAxMDgsIDB4MDgwKTsKKwkJc3RhdHVzICY9IH4weDA4MDsKKwl9CisKKwkvKiBUUERNQTogIEhhbmRsZXMgVFAtaW5pdGlhdGVkIHVuY2FjaGVkIG1lbW9yeSBhY2Nlc3NlczoKKwkgKiBsW10sIGdbXSwgc3RhY2ssIDJkIHN1cmZhY2VzLCByZW5kZXIgdGFyZ2V0cy4gKi8KKwlpZiAoc3RhdHVzICYgMHgxMDApIHsKKwkJbnY1MF9wZ3JhcGhfdHBfdHJhcChkZXYsIDgsIDB4NDA4ZTA4LCAweDQwODcwOCwgZGlzcGxheSwKKwkJCQkgICAgIlBHUkFQSCAtIFRSQVBfVFBETUEiKTsKKwkJbnZfd3IzMihkZXYsIDB4NDAwMTA4LCAweDEwMCk7CisJCXN0YXR1cyAmPSB+MHgxMDA7CisJfQorCisJaWYgKHN0YXR1cykgeworCQlpZiAoZGlzcGxheSkKKwkJCU5WX0lORk8oZGV2LCAiUEdSQVBIIC0gVFJBUDogdW5rbm93biAweCUwOHhcbiIsIHN0YXR1cyk7CisJCW52X3dyMzIoZGV2LCAweDQwMDEwOCwgc3RhdHVzKTsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludAorbnY1MF9ncmFwaF9pc3JfY2hpZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1NjQgaW5zdCkKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW47CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgaTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZfcHJpdi0+Y2hhbm5lbHMubG9jaywgZmxhZ3MpOworCWZvciAoaSA9IDA7IGkgPCBkZXZfcHJpdi0+ZW5naW5lLmZpZm8uY2hhbm5lbHM7IGkrKykgeworCQljaGFuID0gZGV2X3ByaXYtPmNoYW5uZWxzLnB0cltpXTsKKwkJaWYgKCFjaGFuIHx8ICFjaGFuLT5yYW1pbikKKwkJCWNvbnRpbnVlOworCisJCWlmIChpbnN0ID09IGNoYW4tPnJhbWluLT52aW5zdCkKKwkJCWJyZWFrOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZfcHJpdi0+Y2hhbm5lbHMubG9jaywgZmxhZ3MpOworCXJldHVybiBpOworfQorCitzdGF0aWMgdm9pZAorbnY1MF9ncmFwaF9pc3Ioc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwl1MzIgc3RhdDsKKworCXdoaWxlICgoc3RhdCA9IG52X3JkMzIoZGV2LCAweDQwMDEwMCkpKSB7CisJCXU2NCBpbnN0ID0gKHU2NCkobnZfcmQzMihkZXYsIDB4NDAwMzJjKSAmIDB4MGZmZmZmZmYpIDw8IDEyOworCQl1MzIgY2hpZCA9IG52NTBfZ3JhcGhfaXNyX2NoaWQoZGV2LCBpbnN0KTsKKwkJdTMyIGFkZHIgPSBudl9yZDMyKGRldiwgTlYwNF9QR1JBUEhfVFJBUFBFRF9BRERSKTsKKwkJdTMyIHN1YmMgPSAoYWRkciAmIDB4MDAwNzAwMDApID4+IDE2OworCQl1MzIgbXRoZCA9IChhZGRyICYgMHgwMDAwMWZmYyk7CisJCXUzMiBkYXRhID0gbnZfcmQzMihkZXYsIE5WMDRfUEdSQVBIX1RSQVBQRURfREFUQSk7CisJCXUzMiBjbGFzcyA9IG52X3JkMzIoZGV2LCAweDQwMDgxNCk7CisJCXUzMiBzaG93ID0gc3RhdDsKKworCQlpZiAoc3RhdCAmIDB4MDAwMDAwMTApIHsKKwkJCWlmICghbm91dmVhdV9ncHVvYmpfbXRoZF9jYWxsMihkZXYsIGNoaWQsIGNsYXNzLAorCQkJCQkJICAgICAgIG10aGQsIGRhdGEpKQorCQkJCXNob3cgJj0gfjB4MDAwMDAwMTA7CisJCX0KKworCQlpZiAoc3RhdCAmIDB4MDAwMDEwMDApIHsKKwkJCW52X3dyMzIoZGV2LCAweDQwMDUwMCwgMHgwMDAwMDAwMCk7CisJCQludl93cjMyKGRldiwgMHg0MDAxMDAsIDB4MDAwMDEwMDApOworCQkJbnZfbWFzayhkZXYsIDB4NDAwMTNjLCAweDAwMDAxMDAwLCAweDAwMDAwMDAwKTsKKwkJCW52NTBfZ3JhcGhfY29udGV4dF9zd2l0Y2goZGV2KTsKKwkJCXN0YXQgJj0gfjB4MDAwMDEwMDA7CisJCQlzaG93ICY9IH4weDAwMDAxMDAwOworCQl9CisKKwkJc2hvdyA9IChzaG93ICYmIG5vdXZlYXVfcmF0ZWxpbWl0KCkpID8gc2hvdyA6IDA7CisKKwkJaWYgKHNob3cgJiAweDAwMTAwMDAwKSB7CisJCQl1MzIgZWNvZGUgPSBudl9yZDMyKGRldiwgMHg0MDAxMTApOworCQkJTlZfSU5GTyhkZXYsICJQR1JBUEggLSBEQVRBX0VSUk9SICIpOworCQkJbm91dmVhdV9lbnVtX3ByaW50KG52NTBfZGF0YV9lcnJvcl9uYW1lcywgZWNvZGUpOworCQkJcHJpbnRrKCJcbiIpOworCQl9CisKKwkJaWYgKHN0YXQgJiAweDAwMjAwMDAwKSB7CisJCQlpZiAoIW52NTBfcGdyYXBoX3RyYXBfaGFuZGxlcihkZXYsIHNob3csIGluc3QsIGNoaWQpKQorCQkJCXNob3cgJj0gfjB4MDAyMDAwMDA7CisJCX0KKworCQludl93cjMyKGRldiwgMHg0MDAxMDAsIHN0YXQpOworCQludl93cjMyKGRldiwgMHg0MDA1MDAsIDB4MDAwMTAwMDEpOworCisJCWlmIChzaG93KSB7CisJCQlOVl9JTkZPKGRldiwgIlBHUkFQSCAtIik7CisJCQlub3V2ZWF1X2JpdGZpZWxkX3ByaW50KG52NTBfZ3JhcGhfaW50ciwgc2hvdyk7CisJCQlwcmludGsoIlxuIik7CisJCQlOVl9JTkZPKGRldiwgIlBHUkFQSCAtIGNoICVkICgweCUwMTBsbHgpIHN1YmMgJWQgIgorCQkJCSAgICAgImNsYXNzIDB4JTA0eCBtdGhkIDB4JTA0eCBkYXRhIDB4JTA4eFxuIiwKKwkJCQljaGlkLCBpbnN0LCBzdWJjLCBjbGFzcywgbXRoZCwgZGF0YSk7CisJCX0KKwl9CisKKwlpZiAobnZfcmQzMihkZXYsIDB4NDAwODI0KSAmICgxIDw8IDMxKSkKKwkJbnZfd3IzMihkZXYsIDB4NDAwODI0LCBudl9yZDMyKGRldiwgMHg0MDA4MjQpICYgfigxIDw8IDMxKSk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjUwX2luc3RtZW0uYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252NTBfaW5zdG1lbS5jCmluZGV4IGI3NzMyMjkuLjJlMWIxY2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252NTBfaW5zdG1lbS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252NTBfaW5zdG1lbS5jCkBAIC0yNywxNCArMjcsMjAgQEAKIAogI2luY2x1ZGUgImRybVAuaCIKICNpbmNsdWRlICJkcm0uaCIKKwogI2luY2x1ZGUgIm5vdXZlYXVfZHJ2LmgiCisjaW5jbHVkZSAibm91dmVhdV92bS5oIgorCisjZGVmaW5lIEJBUjFfVk1fQkFTRSAweDAwMjAwMDAwMDBVTEwKKyNkZWZpbmUgQkFSMV9WTV9TSVpFIHBjaV9yZXNvdXJjZV9sZW4oZGV2LT5wZGV2LCAxKQorI2RlZmluZSBCQVIzX1ZNX0JBU0UgMHgwMDAwMDAwMDAwVUxMCisjZGVmaW5lIEJBUjNfVk1fU0laRSBwY2lfcmVzb3VyY2VfbGVuKGRldi0+cGRldiwgMykKIAogc3RydWN0IG52NTBfaW5zdG1lbV9wcml2IHsKIAl1aW50MzJfdCBzYXZlMTcwMFs1XTsgLyogMHgxNzAwLT4weDE3MTAgKi8KIAotCXN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqcHJhbWluX3B0OwotCXN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqcHJhbWluX2JhcjsKLQlzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKmZiX2JhcjsKKwlzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKmJhcjFfZG1hb2JqOworCXN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqYmFyM19kbWFvYmo7CiB9OwogCiBzdGF0aWMgdm9pZApAQCAtNDgsNiArNTQsNyBAQAogCQlyZXR1cm47CiAKIAlub3V2ZWF1X2dwdW9ial9yZWYoTlVMTCwgJmNoYW4tPnJhbWZjKTsKKwlub3V2ZWF1X3ZtX3JlZihOVUxMLCAmY2hhbi0+dm0sIGNoYW4tPnZtX3BkKTsKIAlub3V2ZWF1X2dwdW9ial9yZWYoTlVMTCwgJmNoYW4tPnZtX3BkKTsKIAlpZiAoY2hhbi0+cmFtaW5faGVhcC5mcmVlX3N0YWNrLm5leHQpCiAJCWRybV9tbV90YWtlZG93bigmY2hhbi0+cmFtaW5faGVhcCk7CkBAIC01NiwxNCArNjMsMTQgQEAKIH0KIAogc3RhdGljIGludAotbnY1MF9jaGFubmVsX25ldyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1MzIgc2l6ZSwKK252NTBfY2hhbm5lbF9uZXcoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdTMyIHNpemUsIHN0cnVjdCBub3V2ZWF1X3ZtICp2bSwKIAkJIHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKipwY2hhbikKIHsKIAlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXUzMiBwZ2QgPSAoZGV2X3ByaXYtPmNoaXBzZXQgPT0gMHg1MCkgPyAweDE0MDAgOiAweDAyMDA7CiAJdTMyICBmYyA9IChkZXZfcHJpdi0+Y2hpcHNldCA9PSAweDUwKSA/IDB4MDAwMCA6IDB4NDIwMDsKIAlzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuOwotCWludCByZXQ7CisJaW50IHJldCwgaTsKIAogCWNoYW4gPSBremFsbG9jKHNpemVvZigqY2hhbiksIEdGUF9LRVJORUwpOwogCWlmICghY2hhbikKQEAgLTkyLDYgKzk5LDE3IEBACiAJCXJldHVybiByZXQ7CiAJfQogCisJZm9yIChpID0gMDsgaSA8IDB4NDAwMDsgaSArPSA4KSB7CisJCW52X3dvMzIoY2hhbi0+dm1fcGQsIGkgKyAwLCAweDAwMDAwMDAwKTsKKwkJbnZfd28zMihjaGFuLT52bV9wZCwgaSArIDQsIDB4ZGVhZGNhZmUpOworCX0KKworCXJldCA9IG5vdXZlYXVfdm1fcmVmKHZtLCAmY2hhbi0+dm0sIGNoYW4tPnZtX3BkKTsKKwlpZiAocmV0KSB7CisJCW52NTBfY2hhbm5lbF9kZWwoJmNoYW4pOworCQlyZXR1cm4gcmV0OworCX0KKwogCXJldCA9IG5vdXZlYXVfZ3B1b2JqX25ld19mYWtlKGRldiwgY2hhbi0+cmFtaW4tPnBpbnN0ID09IH4wID8gfjAgOgogCQkJCSAgICAgIGNoYW4tPnJhbWluLT5waW5zdCArIGZjLAogCQkJCSAgICAgIGNoYW4tPnJhbWluLT52aW5zdCArIGZjLCAweDEwMCwKQEAgLTExMSw2ICsxMjksNyBAQAogCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJc3RydWN0IG52NTBfaW5zdG1lbV9wcml2ICpwcml2OwogCXN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW47CisJc3RydWN0IG5vdXZlYXVfdm0gKnZtOwogCWludCByZXQsIGk7CiAJdTMyIHRtcDsKIApAQCAtMTI3LDExMiArMTQ2LDg3IEBACiAJcmV0ID0gZHJtX21tX2luaXQoJmRldl9wcml2LT5yYW1pbl9oZWFwLCAwLCBkZXZfcHJpdi0+cmFtaW5fc2l6ZSk7CiAJaWYgKHJldCkgewogCQlOVl9FUlJPUihkZXYsICJGYWlsZWQgdG8gaW5pdCBSQU1JTiBoZWFwXG4iKTsKLQkJcmV0dXJuIC1FTk9NRU07CisJCWdvdG8gZXJyb3I7CiAJfQogCi0JLyogd2UgbmVlZCBhIGNoYW5uZWwgdG8gcGx1ZyBpbnRvIHRoZSBodyB0byBjb250cm9sIHRoZSBCQVJzICovCi0JcmV0ID0gbnY1MF9jaGFubmVsX25ldyhkZXYsIDEyOCoxMDI0LCAmZGV2X3ByaXYtPmZpZm9zWzBdKTsKKwkvKiBCQVIzICovCisJcmV0ID0gbm91dmVhdV92bV9uZXcoZGV2LCBCQVIzX1ZNX0JBU0UsIEJBUjNfVk1fU0laRSwgQkFSM19WTV9CQVNFLAorCQkJICAgICAmZGV2X3ByaXYtPmJhcjNfdm0pOwogCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0JY2hhbiA9IGRldl9wcml2LT5maWZvc1sxMjddID0gZGV2X3ByaXYtPmZpZm9zWzBdOworCQlnb3RvIGVycm9yOwogCi0JLyogYWxsb2NhdGUgcGFnZSB0YWJsZSBmb3IgUFJBTUlOIEJBUiAqLwotCXJldCA9IG5vdXZlYXVfZ3B1b2JqX25ldyhkZXYsIGNoYW4sIChkZXZfcHJpdi0+cmFtaW5fc2l6ZSA+PiAxMikgKiA4LAotCQkJCSAweDEwMDAsIE5WT0JKX0ZMQUdfWkVST19BTExPQywKLQkJCQkgJnByaXYtPnByYW1pbl9wdCk7CisJcmV0ID0gbm91dmVhdV9ncHVvYmpfbmV3KGRldiwgTlVMTCwgKEJBUjNfVk1fU0laRSA+PiAxMikgKiA4LAorCQkJCSAweDEwMDAsIE5WT0JKX0ZMQUdfRE9OVF9NQVAgfAorCQkJCSBOVk9CSl9GTEFHX1pFUk9fQUxMT0MsCisJCQkJICZkZXZfcHJpdi0+YmFyM192bS0+cGd0WzBdLm9ialswXSk7CiAJaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKKwkJZ290byBlcnJvcjsKKwlkZXZfcHJpdi0+YmFyM192bS0+cGd0WzBdLnJlZmNvdW50WzBdID0gMTsKIAotCW52X3dvMzIoY2hhbi0+dm1fcGQsIDB4MDAwMCwgcHJpdi0+cHJhbWluX3B0LT52aW5zdCB8IDB4NjMpOwotCW52X3dvMzIoY2hhbi0+dm1fcGQsIDB4MDAwNCwgMCk7CisJbnY1MF9pbnN0bWVtX21hcChkZXZfcHJpdi0+YmFyM192bS0+cGd0WzBdLm9ialswXSk7CiAKLQkvKiBETUEgb2JqZWN0IGZvciBQUkFNSU4gQkFSICovCi0JcmV0ID0gbm91dmVhdV9ncHVvYmpfbmV3KGRldiwgY2hhbiwgNio0LCAxNiwgMCwgJnByaXYtPnByYW1pbl9iYXIpOworCXJldCA9IG52NTBfY2hhbm5lbF9uZXcoZGV2LCAxMjggKiAxMDI0LCBkZXZfcHJpdi0+YmFyM192bSwgJmNoYW4pOwogCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0JbnZfd28zMihwcml2LT5wcmFtaW5fYmFyLCAweDAwLCAweDdmYzAwMDAwKTsKLQludl93bzMyKHByaXYtPnByYW1pbl9iYXIsIDB4MDQsIGRldl9wcml2LT5yYW1pbl9zaXplIC0gMSk7Ci0JbnZfd28zMihwcml2LT5wcmFtaW5fYmFyLCAweDA4LCAweDAwMDAwMDAwKTsKLQludl93bzMyKHByaXYtPnByYW1pbl9iYXIsIDB4MGMsIDB4MDAwMDAwMDApOwotCW52X3dvMzIocHJpdi0+cHJhbWluX2JhciwgMHgxMCwgMHgwMDAwMDAwMCk7Ci0JbnZfd28zMihwcml2LT5wcmFtaW5fYmFyLCAweDE0LCAweDAwMDAwMDAwKTsKKwkJZ290byBlcnJvcjsKKwlkZXZfcHJpdi0+Y2hhbm5lbHMucHRyWzBdID0gZGV2X3ByaXYtPmNoYW5uZWxzLnB0clsxMjddID0gY2hhbjsKIAotCS8qIG1hcCBjaGFubmVsIGludG8gUFJBTUlOLCBncHVvYmogZGlkbid0IGRvIGl0IGZvciB1cyAqLwotCXJldCA9IG52NTBfaW5zdG1lbV9iaW5kKGRldiwgY2hhbi0+cmFtaW4pOworCXJldCA9IG52NTBfZ3B1b2JqX2RtYV9uZXcoY2hhbiwgMHgwMDAwLCBCQVIzX1ZNX0JBU0UsIEJBUjNfVk1fU0laRSwKKwkJCQkgIE5WX01FTV9UQVJHRVRfVk0sIE5WX01FTV9BQ0NFU1NfVk0sCisJCQkJICBOVl9NRU1fVFlQRV9WTSwgTlZfTUVNX0NPTVBfVk0sCisJCQkJICAmcHJpdi0+YmFyM19kbWFvYmopOwogCWlmIChyZXQpCi0JCXJldHVybiByZXQ7CisJCWdvdG8gZXJyb3I7CiAKLQkvKiBwb2tlIHJlZ3MuLi4gKi8KIAludl93cjMyKGRldiwgMHgwMDE3MDQsIDB4MDAwMDAwMDAgfCAoY2hhbi0+cmFtaW4tPnZpbnN0ID4+IDEyKSk7CiAJbnZfd3IzMihkZXYsIDB4MDAxNzA0LCAweDQwMDAwMDAwIHwgKGNoYW4tPnJhbWluLT52aW5zdCA+PiAxMikpOwotCW52X3dyMzIoZGV2LCAweDAwMTcwYywgMHg4MDAwMDAwMCB8IChwcml2LT5wcmFtaW5fYmFyLT5jaW5zdCA+PiA0KSk7Ci0KLQl0bXAgPSBudl9yaTMyKGRldiwgMCk7Ci0JbnZfd2kzMihkZXYsIDAsIH50bXApOwotCWlmIChudl9yaTMyKGRldiwgMCkgIT0gfnRtcCkgewotCQlOVl9FUlJPUihkZXYsICJQUkFNSU4gcmVhZGJhY2sgZmFpbGVkXG4iKTsKLQkJcmV0dXJuIC1FSU87Ci0JfQotCW52X3dpMzIoZGV2LCAwLCB0bXApOwotCi0JZGV2X3ByaXYtPnJhbWluX2F2YWlsYWJsZSA9IHRydWU7Ci0KLQkvKiBEZXRlcm1pbmUgVk0gbGF5b3V0ICovCi0JZGV2X3ByaXYtPnZtX2dhcnRfYmFzZSA9IHJvdW5kdXAoTlY1MF9WTV9CTE9DSywgTlY1MF9WTV9CTE9DSyk7Ci0JZGV2X3ByaXYtPnZtX2dhcnRfc2l6ZSA9IE5WNTBfVk1fQkxPQ0s7Ci0KLQlkZXZfcHJpdi0+dm1fdnJhbV9iYXNlID0gZGV2X3ByaXYtPnZtX2dhcnRfYmFzZSArIGRldl9wcml2LT52bV9nYXJ0X3NpemU7Ci0JZGV2X3ByaXYtPnZtX3ZyYW1fc2l6ZSA9IGRldl9wcml2LT52cmFtX3NpemU7Ci0JaWYgKGRldl9wcml2LT52bV92cmFtX3NpemUgPiBOVjUwX1ZNX01BWF9WUkFNKQotCQlkZXZfcHJpdi0+dm1fdnJhbV9zaXplID0gTlY1MF9WTV9NQVhfVlJBTTsKLQlkZXZfcHJpdi0+dm1fdnJhbV9zaXplID0gcm91bmR1cChkZXZfcHJpdi0+dm1fdnJhbV9zaXplLCBOVjUwX1ZNX0JMT0NLKTsKLQlkZXZfcHJpdi0+dm1fdnJhbV9wdF9uciA9IGRldl9wcml2LT52bV92cmFtX3NpemUgLyBOVjUwX1ZNX0JMT0NLOwotCi0JZGV2X3ByaXYtPnZtX2VuZCA9IGRldl9wcml2LT52bV92cmFtX2Jhc2UgKyBkZXZfcHJpdi0+dm1fdnJhbV9zaXplOwotCi0JTlZfREVCVUcoZGV2LCAiTlY1MFZNOiBHQVJUIDB4JTAxNmxseC0weCUwMTZsbHhcbiIsCi0JCSBkZXZfcHJpdi0+dm1fZ2FydF9iYXNlLAotCQkgZGV2X3ByaXYtPnZtX2dhcnRfYmFzZSArIGRldl9wcml2LT52bV9nYXJ0X3NpemUgLSAxKTsKLQlOVl9ERUJVRyhkZXYsICJOVjUwVk06IFZSQU0gMHglMDE2bGx4LTB4JTAxNmxseFxuIiwKLQkJIGRldl9wcml2LT52bV92cmFtX2Jhc2UsCi0JCSBkZXZfcHJpdi0+dm1fdnJhbV9iYXNlICsgZGV2X3ByaXYtPnZtX3ZyYW1fc2l6ZSAtIDEpOwotCi0JLyogVlJBTSBwYWdlIHRhYmxlKHMpLCBtYXBwZWQgaW50byBWTSBhdCArMUdpQiAgKi8KLQlmb3IgKGkgPSAwOyBpIDwgZGV2X3ByaXYtPnZtX3ZyYW1fcHRfbnI7IGkrKykgewotCQlyZXQgPSBub3V2ZWF1X2dwdW9ial9uZXcoZGV2LCBOVUxMLCBOVjUwX1ZNX0JMT0NLIC8gMHgxMDAwMCAqIDgsCi0JCQkJCSAwLCBOVk9CSl9GTEFHX1pFUk9fQUxMT0MsCi0JCQkJCSAmY2hhbi0+dm1fdnJhbV9wdFtpXSk7Ci0JCWlmIChyZXQpIHsKLQkJCU5WX0VSUk9SKGRldiwgIkVycm9yIGNyZWF0aW5nIFZSQU0gUEdUOiAlZFxuIiwgcmV0KTsKLQkJCWRldl9wcml2LT52bV92cmFtX3B0X25yID0gaTsKLQkJCXJldHVybiByZXQ7Ci0JCX0KLQkJZGV2X3ByaXYtPnZtX3ZyYW1fcHRbaV0gPSBjaGFuLT52bV92cmFtX3B0W2ldOwotCi0JCW52X3dvMzIoY2hhbi0+dm1fcGQsIDB4MTAgKyAoaSo4KSwKLQkJCWNoYW4tPnZtX3ZyYW1fcHRbaV0tPnZpbnN0IHwgMHg2MSk7Ci0JCW52X3dvMzIoY2hhbi0+dm1fcGQsIDB4MTQgKyAoaSo4KSwgMCk7Ci0JfQotCi0JLyogRE1BIG9iamVjdCBmb3IgRkIgQkFSICovCi0JcmV0ID0gbm91dmVhdV9ncHVvYmpfbmV3KGRldiwgY2hhbiwgNio0LCAxNiwgMCwgJnByaXYtPmZiX2Jhcik7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQludl93bzMyKHByaXYtPmZiX2JhciwgMHgwMCwgMHg3ZmMwMDAwMCk7Ci0JbnZfd28zMihwcml2LT5mYl9iYXIsIDB4MDQsIDB4NDAwMDAwMDAgKwotCQkJCSAgICBwY2lfcmVzb3VyY2VfbGVuKGRldi0+cGRldiwgMSkgLSAxKTsKLQludl93bzMyKHByaXYtPmZiX2JhciwgMHgwOCwgMHg0MDAwMDAwMCk7Ci0JbnZfd28zMihwcml2LT5mYl9iYXIsIDB4MGMsIDB4MDAwMDAwMDApOwotCW52X3dvMzIocHJpdi0+ZmJfYmFyLCAweDEwLCAweDAwMDAwMDAwKTsKLQludl93bzMyKHByaXYtPmZiX2JhciwgMHgxNCwgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4MDAxNzBjLCAweDgwMDAwMDAwIHwgKHByaXYtPmJhcjNfZG1hb2JqLT5jaW5zdCA+PiA0KSk7CiAKIAlkZXZfcHJpdi0+ZW5naW5lLmluc3RtZW0uZmx1c2goZGV2KTsKKwlkZXZfcHJpdi0+cmFtaW5fYXZhaWxhYmxlID0gdHJ1ZTsKIAotCW52X3dyMzIoZGV2LCAweDAwMTcwOCwgMHg4MDAwMDAwMCB8IChwcml2LT5mYl9iYXItPmNpbnN0ID4+IDQpKTsKKwl0bXAgPSBudl9ybzMyKGNoYW4tPnJhbWluLCAwKTsKKwludl93bzMyKGNoYW4tPnJhbWluLCAwLCB+dG1wKTsKKwlpZiAobnZfcm8zMihjaGFuLT5yYW1pbiwgMCkgIT0gfnRtcCkgeworCQlOVl9FUlJPUihkZXYsICJQUkFNSU4gcmVhZGJhY2sgZmFpbGVkXG4iKTsKKwkJcmV0ID0gLUVJTzsKKwkJZ290byBlcnJvcjsKKwl9CisJbnZfd28zMihjaGFuLT5yYW1pbiwgMCwgdG1wKTsKKworCS8qIEJBUjEgKi8KKwlyZXQgPSBub3V2ZWF1X3ZtX25ldyhkZXYsIEJBUjFfVk1fQkFTRSwgQkFSMV9WTV9TSVpFLCBCQVIxX1ZNX0JBU0UsICZ2bSk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcjsKKworCXJldCA9IG5vdXZlYXVfdm1fcmVmKHZtLCAmZGV2X3ByaXYtPmJhcjFfdm0sIGNoYW4tPnZtX3BkKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yOworCW5vdXZlYXVfdm1fcmVmKE5VTEwsICZ2bSwgTlVMTCk7CisKKwlyZXQgPSBudjUwX2dwdW9ial9kbWFfbmV3KGNoYW4sIDB4MDAwMCwgQkFSMV9WTV9CQVNFLCBCQVIxX1ZNX1NJWkUsCisJCQkJICBOVl9NRU1fVEFSR0VUX1ZNLCBOVl9NRU1fQUNDRVNTX1ZNLAorCQkJCSAgTlZfTUVNX1RZUEVfVk0sIE5WX01FTV9DT01QX1ZNLAorCQkJCSAgJnByaXYtPmJhcjFfZG1hb2JqKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yOworCisJbnZfd3IzMihkZXYsIDB4MDAxNzA4LCAweDgwMDAwMDAwIHwgKHByaXYtPmJhcjFfZG1hb2JqLT5jaW5zdCA+PiA0KSk7CiAJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKIAkJbnZfd3IzMihkZXYsIDB4MTkwMCArIChpKjQpLCAwKTsKIAorCS8qIENyZWF0ZSBzaGFyZWQgY2hhbm5lbCBWTSwgc3BhY2UgaXMgcmVzZXJ2ZWQgYXQgdGhlIGJlZ2lubmluZworCSAqIHRvIGNhdGNoICJOVUxMIHBvaW50ZXIiIHJlZmVyZW5jZXMKKwkgKi8KKwlyZXQgPSBub3V2ZWF1X3ZtX25ldyhkZXYsIDAsICgxVUxMIDw8IDQwKSwgMHgwMDIwMDAwMDAwVUxMLAorCQkJICAgICAmZGV2X3ByaXYtPmNoYW5fdm0pOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKIAlyZXR1cm4gMDsKKworZXJyb3I6CisJbnY1MF9pbnN0bWVtX3Rha2Vkb3duKGRldik7CisJcmV0dXJuIHJldDsKIH0KIAogdm9pZApAQCAtMjQwLDcgKzIzNCw3IEBACiB7CiAJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlzdHJ1Y3QgbnY1MF9pbnN0bWVtX3ByaXYgKnByaXYgPSBkZXZfcHJpdi0+ZW5naW5lLmluc3RtZW0ucHJpdjsKLQlzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuID0gZGV2X3ByaXYtPmZpZm9zWzBdOworCXN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4gPSBkZXZfcHJpdi0+Y2hhbm5lbHMucHRyWzBdOwogCWludCBpOwogCiAJTlZfREVCVUcoZGV2LCAiXG4iKTsKQEAgLTI1MCwyMyArMjQ0LDIzIEBACiAKIAlkZXZfcHJpdi0+cmFtaW5fYXZhaWxhYmxlID0gZmFsc2U7CiAKLQkvKiBSZXN0b3JlIHN0YXRlIGZyb20gYmVmb3JlIGluaXQgKi8KKwlub3V2ZWF1X3ZtX3JlZihOVUxMLCAmZGV2X3ByaXYtPmNoYW5fdm0sIE5VTEwpOworCiAJZm9yIChpID0gMHgxNzAwOyBpIDw9IDB4MTcxMDsgaSArPSA0KQogCQludl93cjMyKGRldiwgaSwgcHJpdi0+c2F2ZTE3MDBbKGkgLSAweDE3MDApIC8gNF0pOwogCi0Jbm91dmVhdV9ncHVvYmpfcmVmKE5VTEwsICZwcml2LT5mYl9iYXIpOwotCW5vdXZlYXVfZ3B1b2JqX3JlZihOVUxMLCAmcHJpdi0+cHJhbWluX2Jhcik7Ci0Jbm91dmVhdV9ncHVvYmpfcmVmKE5VTEwsICZwcml2LT5wcmFtaW5fcHQpOworCW5vdXZlYXVfZ3B1b2JqX3JlZihOVUxMLCAmcHJpdi0+YmFyM19kbWFvYmopOworCW5vdXZlYXVfZ3B1b2JqX3JlZihOVUxMLCAmcHJpdi0+YmFyMV9kbWFvYmopOwogCi0JLyogRGVzdHJveSBkdW1teSBjaGFubmVsICovCi0JaWYgKGNoYW4pIHsKLQkJZm9yIChpID0gMDsgaSA8IGRldl9wcml2LT52bV92cmFtX3B0X25yOyBpKyspCi0JCQlub3V2ZWF1X2dwdW9ial9yZWYoTlVMTCwgJmNoYW4tPnZtX3ZyYW1fcHRbaV0pOwotCQlkZXZfcHJpdi0+dm1fdnJhbV9wdF9uciA9IDA7CisJbm91dmVhdV92bV9yZWYoTlVMTCwgJmRldl9wcml2LT5iYXIxX3ZtLCBjaGFuLT52bV9wZCk7CisJZGV2X3ByaXYtPmNoYW5uZWxzLnB0clsxMjddID0gMDsKKwludjUwX2NoYW5uZWxfZGVsKCZkZXZfcHJpdi0+Y2hhbm5lbHMucHRyWzBdKTsKIAotCQludjUwX2NoYW5uZWxfZGVsKCZkZXZfcHJpdi0+Zmlmb3NbMF0pOwotCQlkZXZfcHJpdi0+Zmlmb3NbMTI3XSA9IE5VTEw7Ci0JfQorCW5vdXZlYXVfZ3B1b2JqX3JlZihOVUxMLCAmZGV2X3ByaXYtPmJhcjNfdm0tPnBndFswXS5vYmpbMF0pOworCW5vdXZlYXVfdm1fcmVmKE5VTEwsICZkZXZfcHJpdi0+YmFyM192bSwgTlVMTCk7CisKKwlpZiAoZGV2X3ByaXYtPnJhbWluX2hlYXAuZnJlZV9zdGFjay5uZXh0KQorCQlkcm1fbW1fdGFrZWRvd24oJmRldl9wcml2LT5yYW1pbl9oZWFwKTsKIAogCWRldl9wcml2LT5lbmdpbmUuaW5zdG1lbS5wcml2ID0gTlVMTDsKIAlrZnJlZShwcml2KTsKQEAgLTI3NiwxNiArMjcwLDggQEAKIG52NTBfaW5zdG1lbV9zdXNwZW5kKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuID0gZGV2X3ByaXYtPmZpZm9zWzBdOwotCXN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqcmFtaW4gPSBjaGFuLT5yYW1pbjsKLQlpbnQgaTsKIAotCXJhbWluLT5pbV9iYWNraW5nX3N1c3BlbmQgPSB2bWFsbG9jKHJhbWluLT5zaXplKTsKLQlpZiAoIXJhbWluLT5pbV9iYWNraW5nX3N1c3BlbmQpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JZm9yIChpID0gMDsgaSA8IHJhbWluLT5zaXplOyBpICs9IDQpCi0JCXJhbWluLT5pbV9iYWNraW5nX3N1c3BlbmRbaS80XSA9IG52X3JpMzIoZGV2LCBpKTsKKwlkZXZfcHJpdi0+cmFtaW5fYXZhaWxhYmxlID0gZmFsc2U7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTI5NCwxNDYgKzI4MCwxMjEgQEAKIHsKIAlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXN0cnVjdCBudjUwX2luc3RtZW1fcHJpdiAqcHJpdiA9IGRldl9wcml2LT5lbmdpbmUuaW5zdG1lbS5wcml2OwotCXN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4gPSBkZXZfcHJpdi0+Zmlmb3NbMF07Ci0Jc3RydWN0IG5vdXZlYXVfZ3B1b2JqICpyYW1pbiA9IGNoYW4tPnJhbWluOworCXN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4gPSBkZXZfcHJpdi0+Y2hhbm5lbHMucHRyWzBdOwogCWludCBpOwogCi0JZGV2X3ByaXYtPnJhbWluX2F2YWlsYWJsZSA9IGZhbHNlOwotCWRldl9wcml2LT5yYW1pbl9iYXNlID0gfjA7Ci0JZm9yIChpID0gMDsgaSA8IHJhbWluLT5zaXplOyBpICs9IDQpCi0JCW52X3dvMzIocmFtaW4sIGksIHJhbWluLT5pbV9iYWNraW5nX3N1c3BlbmRbaS80XSk7Ci0JZGV2X3ByaXYtPnJhbWluX2F2YWlsYWJsZSA9IHRydWU7Ci0JdmZyZWUocmFtaW4tPmltX2JhY2tpbmdfc3VzcGVuZCk7Ci0JcmFtaW4tPmltX2JhY2tpbmdfc3VzcGVuZCA9IE5VTEw7Ci0KIAkvKiBQb2tlIHRoZSByZWxldmFudCByZWdzLCBhbmQgcHJheSBpdCB3b3JrcyA6KSAqLwogCW52X3dyMzIoZGV2LCBOVjUwX1BVTktfQkFSX0NGR19CQVNFLCAoY2hhbi0+cmFtaW4tPnZpbnN0ID4+IDEyKSk7CiAJbnZfd3IzMihkZXYsIE5WNTBfUFVOS19VTksxNzEwLCAwKTsKIAludl93cjMyKGRldiwgTlY1MF9QVU5LX0JBUl9DRkdfQkFTRSwgKGNoYW4tPnJhbWluLT52aW5zdCA+PiAxMikgfAogCQkJCQkgTlY1MF9QVU5LX0JBUl9DRkdfQkFTRV9WQUxJRCk7Ci0JbnZfd3IzMihkZXYsIE5WNTBfUFVOS19CQVIxX0NUWERNQSwgKHByaXYtPmZiX2Jhci0+Y2luc3QgPj4gNCkgfAorCW52X3dyMzIoZGV2LCBOVjUwX1BVTktfQkFSMV9DVFhETUEsIChwcml2LT5iYXIxX2RtYW9iai0+Y2luc3QgPj4gNCkgfAogCQkJCQlOVjUwX1BVTktfQkFSMV9DVFhETUFfVkFMSUQpOwotCW52X3dyMzIoZGV2LCBOVjUwX1BVTktfQkFSM19DVFhETUEsIChwcml2LT5wcmFtaW5fYmFyLT5jaW5zdCA+PiA0KSB8CisJbnZfd3IzMihkZXYsIE5WNTBfUFVOS19CQVIzX0NUWERNQSwgKHByaXYtPmJhcjNfZG1hb2JqLT5jaW5zdCA+PiA0KSB8CiAJCQkJCU5WNTBfUFVOS19CQVIzX0NUWERNQV9WQUxJRCk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQogCQludl93cjMyKGRldiwgMHgxOTAwICsgKGkqNCksIDApOworCisJZGV2X3ByaXYtPnJhbWluX2F2YWlsYWJsZSA9IHRydWU7CiB9CiAKK3N0cnVjdCBudjUwX2dwdW9ial9ub2RlIHsKKwlzdHJ1Y3Qgbm91dmVhdV92cmFtICp2cmFtOworCXN0cnVjdCBub3V2ZWF1X3ZtYSBjaGFuX3ZtYTsKKwl1MzIgYWxpZ247Cit9OworCisKIGludAotbnY1MF9pbnN0bWVtX3BvcHVsYXRlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqZ3B1b2JqLAotCQkgICAgICB1aW50MzJfdCAqc3opCitudjUwX2luc3RtZW1fZ2V0KHN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqZ3B1b2JqLCB1MzIgc2l6ZSwgdTMyIGFsaWduKQogeworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBncHVvYmotPmRldjsKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBub3V2ZWF1X3ZyYW1fZW5naW5lICp2cmFtID0gJmRldl9wcml2LT5lbmdpbmUudnJhbTsKKwlzdHJ1Y3QgbnY1MF9ncHVvYmpfbm9kZSAqbm9kZSA9IE5VTEw7CiAJaW50IHJldDsKIAotCWlmIChncHVvYmotPmltX2JhY2tpbmcpCi0JCXJldHVybiAtRUlOVkFMOworCW5vZGUgPSBremFsbG9jKHNpemVvZigqbm9kZSksIEdGUF9LRVJORUwpOworCWlmICghbm9kZSkKKwkJcmV0dXJuIC1FTk9NRU07CisJbm9kZS0+YWxpZ24gPSBhbGlnbjsKIAotCSpzeiA9IEFMSUdOKCpzeiwgNDA5Nik7Ci0JaWYgKCpzeiA9PSAwKQotCQlyZXR1cm4gLUVJTlZBTDsKKwlzaXplICA9IChzaXplICsgNDA5NSkgJiB+NDA5NTsKKwlhbGlnbiA9IG1heChhbGlnbiwgKHUzMik0MDk2KTsKIAotCXJldCA9IG5vdXZlYXVfYm9fbmV3KGRldiwgTlVMTCwgKnN6LCAwLCBUVE1fUExfRkxBR19WUkFNLCAwLCAweDAwMDAsCi0JCQkgICAgIHRydWUsIGZhbHNlLCAmZ3B1b2JqLT5pbV9iYWNraW5nKTsKKwlyZXQgPSB2cmFtLT5nZXQoZGV2LCBzaXplLCBhbGlnbiwgMCwgMCwgJm5vZGUtPnZyYW0pOwogCWlmIChyZXQpIHsKLQkJTlZfRVJST1IoZGV2LCAiZXJyb3IgZ2V0dGluZyBQUkFNSU4gYmFja2luZyBwYWdlczogJWRcbiIsIHJldCk7CisJCWtmcmVlKG5vZGUpOwogCQlyZXR1cm4gcmV0OwogCX0KIAotCXJldCA9IG5vdXZlYXVfYm9fcGluKGdwdW9iai0+aW1fYmFja2luZywgVFRNX1BMX0ZMQUdfVlJBTSk7Ci0JaWYgKHJldCkgewotCQlOVl9FUlJPUihkZXYsICJlcnJvciBwaW5uaW5nIFBSQU1JTiBiYWNraW5nIFZSQU06ICVkXG4iLCByZXQpOwotCQlub3V2ZWF1X2JvX3JlZihOVUxMLCAmZ3B1b2JqLT5pbV9iYWNraW5nKTsKLQkJcmV0dXJuIHJldDsKKwlncHVvYmotPnZpbnN0ID0gbm9kZS0+dnJhbS0+b2Zmc2V0OworCisJaWYgKGdwdW9iai0+ZmxhZ3MgJiBOVk9CSl9GTEFHX1ZNKSB7CisJCXJldCA9IG5vdXZlYXVfdm1fZ2V0KGRldl9wcml2LT5jaGFuX3ZtLCBzaXplLCAxMiwKKwkJCQkgICAgIE5WX01FTV9BQ0NFU1NfUlcgfCBOVl9NRU1fQUNDRVNTX1NZUywKKwkJCQkgICAgICZub2RlLT5jaGFuX3ZtYSk7CisJCWlmIChyZXQpIHsKKwkJCXZyYW0tPnB1dChkZXYsICZub2RlLT52cmFtKTsKKwkJCWtmcmVlKG5vZGUpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCisJCW5vdXZlYXVfdm1fbWFwKCZub2RlLT5jaGFuX3ZtYSwgbm9kZS0+dnJhbSk7CisJCWdwdW9iai0+dmluc3QgPSBub2RlLT5jaGFuX3ZtYS5vZmZzZXQ7CiAJfQogCi0JZ3B1b2JqLT52aW5zdCA9IGdwdW9iai0+aW1fYmFja2luZy0+Ym8ubWVtLnN0YXJ0IDw8IFBBR0VfU0hJRlQ7CisJZ3B1b2JqLT5zaXplID0gc2l6ZTsKKwlncHVvYmotPm5vZGUgPSBub2RlOwogCXJldHVybiAwOwogfQogCiB2b2lkCi1udjUwX2luc3RtZW1fY2xlYXIoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IG5vdXZlYXVfZ3B1b2JqICpncHVvYmopCitudjUwX2luc3RtZW1fcHV0KHN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqZ3B1b2JqKQogeworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBncHVvYmotPmRldjsKIAlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBub3V2ZWF1X3ZyYW1fZW5naW5lICp2cmFtID0gJmRldl9wcml2LT5lbmdpbmUudnJhbTsKKwlzdHJ1Y3QgbnY1MF9ncHVvYmpfbm9kZSAqbm9kZTsKIAotCWlmIChncHVvYmogJiYgZ3B1b2JqLT5pbV9iYWNraW5nKSB7Ci0JCWlmIChncHVvYmotPmltX2JvdW5kKQotCQkJZGV2X3ByaXYtPmVuZ2luZS5pbnN0bWVtLnVuYmluZChkZXYsIGdwdW9iaik7Ci0JCW5vdXZlYXVfYm9fdW5waW4oZ3B1b2JqLT5pbV9iYWNraW5nKTsKLQkJbm91dmVhdV9ib19yZWYoTlVMTCwgJmdwdW9iai0+aW1fYmFja2luZyk7Ci0JCWdwdW9iai0+aW1fYmFja2luZyA9IE5VTEw7CisJbm9kZSA9IGdwdW9iai0+bm9kZTsKKwlncHVvYmotPm5vZGUgPSBOVUxMOworCisJaWYgKG5vZGUtPmNoYW5fdm1hLm5vZGUpIHsKKwkJbm91dmVhdV92bV91bm1hcCgmbm9kZS0+Y2hhbl92bWEpOworCQlub3V2ZWF1X3ZtX3B1dCgmbm9kZS0+Y2hhbl92bWEpOwogCX0KKwl2cmFtLT5wdXQoZGV2LCAmbm9kZS0+dnJhbSk7CisJa2ZyZWUobm9kZSk7CiB9CiAKIGludAotbnY1MF9pbnN0bWVtX2JpbmQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IG5vdXZlYXVfZ3B1b2JqICpncHVvYmopCitudjUwX2luc3RtZW1fbWFwKHN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqZ3B1b2JqKQogewotCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Ci0Jc3RydWN0IG52NTBfaW5zdG1lbV9wcml2ICpwcml2ID0gZGV2X3ByaXYtPmVuZ2luZS5pbnN0bWVtLnByaXY7Ci0Jc3RydWN0IG5vdXZlYXVfZ3B1b2JqICpwcmFtaW5fcHQgPSBwcml2LT5wcmFtaW5fcHQ7Ci0JdWludDMyX3QgcHRlLCBwdGVfZW5kOwotCXVpbnQ2NF90IHZyYW07CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZ3B1b2JqLT5kZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBudjUwX2dwdW9ial9ub2RlICpub2RlID0gZ3B1b2JqLT5ub2RlOworCWludCByZXQ7CiAKLQlpZiAoIWdwdW9iai0+aW1fYmFja2luZyB8fCAhZ3B1b2JqLT5pbV9wcmFtaW4gfHwgZ3B1b2JqLT5pbV9ib3VuZCkKLQkJcmV0dXJuIC1FSU5WQUw7CisJcmV0ID0gbm91dmVhdV92bV9nZXQoZGV2X3ByaXYtPmJhcjNfdm0sIGdwdW9iai0+c2l6ZSwgMTIsCisJCQkgICAgIE5WX01FTV9BQ0NFU1NfUlcsICZub2RlLT52cmFtLT5iYXJfdm1hKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OwogCi0JTlZfREVCVUcoZGV2LCAic3Q9MHglbHggc3o9MHglbHhcbiIsCi0JCSBncHVvYmotPmltX3ByYW1pbi0+c3RhcnQsIGdwdW9iai0+aW1fcHJhbWluLT5zaXplKTsKLQotCXB0ZSAgICAgPSAoZ3B1b2JqLT5pbV9wcmFtaW4tPnN0YXJ0ID4+IDEyKSA8PCAxOwotCXB0ZV9lbmQgPSAoKGdwdW9iai0+aW1fcHJhbWluLT5zaXplID4+IDEyKSA8PCAxKSArIHB0ZTsKLQl2cmFtICAgID0gZ3B1b2JqLT52aW5zdDsKLQotCU5WX0RFQlVHKGRldiwgInByYW1pbj0weCVseCwgcHRlPSVkLCBwdGVfZW5kPSVkXG4iLAotCQkgZ3B1b2JqLT5pbV9wcmFtaW4tPnN0YXJ0LCBwdGUsIHB0ZV9lbmQpOwotCU5WX0RFQlVHKGRldiwgImZpcnN0IHZyYW0gcGFnZTogMHglMDEwbGx4XG4iLCBncHVvYmotPnZpbnN0KTsKLQotCXZyYW0gfD0gMTsKLQlpZiAoZGV2X3ByaXYtPnZyYW1fc3lzX2Jhc2UpIHsKLQkJdnJhbSArPSBkZXZfcHJpdi0+dnJhbV9zeXNfYmFzZTsKLQkJdnJhbSB8PSAweDMwOwotCX0KLQotCXdoaWxlIChwdGUgPCBwdGVfZW5kKSB7Ci0JCW52X3dvMzIocHJhbWluX3B0LCAocHRlICogNCkgKyAwLCBsb3dlcl8zMl9iaXRzKHZyYW0pKTsKLQkJbnZfd28zMihwcmFtaW5fcHQsIChwdGUgKiA0KSArIDQsIHVwcGVyXzMyX2JpdHModnJhbSkpOwotCQl2cmFtICs9IDB4MTAwMDsKLQkJcHRlICs9IDI7Ci0JfQotCWRldl9wcml2LT5lbmdpbmUuaW5zdG1lbS5mbHVzaChkZXYpOwotCi0JbnY1MF92bV9mbHVzaChkZXYsIDYpOwotCi0JZ3B1b2JqLT5pbV9ib3VuZCA9IDE7CisJbm91dmVhdV92bV9tYXAoJm5vZGUtPnZyYW0tPmJhcl92bWEsIG5vZGUtPnZyYW0pOworCWdwdW9iai0+cGluc3QgPSBub2RlLT52cmFtLT5iYXJfdm1hLm9mZnNldDsKIAlyZXR1cm4gMDsKIH0KIAotaW50Ci1udjUwX2luc3RtZW1fdW5iaW5kKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqZ3B1b2JqKQordm9pZAorbnY1MF9pbnN0bWVtX3VubWFwKHN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqZ3B1b2JqKQogewotCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Ci0Jc3RydWN0IG52NTBfaW5zdG1lbV9wcml2ICpwcml2ID0gZGV2X3ByaXYtPmVuZ2luZS5pbnN0bWVtLnByaXY7Ci0JdWludDMyX3QgcHRlLCBwdGVfZW5kOworCXN0cnVjdCBudjUwX2dwdW9ial9ub2RlICpub2RlID0gZ3B1b2JqLT5ub2RlOwogCi0JaWYgKGdwdW9iai0+aW1fYm91bmQgPT0gMCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkvKiBjYW4gaGFwcGVuIGR1cmluZyBsYXRlIHRha2Vkb3duICovCi0JaWYgKHVubGlrZWx5KCFkZXZfcHJpdi0+cmFtaW5fYXZhaWxhYmxlKSkKLQkJcmV0dXJuIDA7Ci0KLQlwdGUgICAgID0gKGdwdW9iai0+aW1fcHJhbWluLT5zdGFydCA+PiAxMikgPDwgMTsKLQlwdGVfZW5kID0gKChncHVvYmotPmltX3ByYW1pbi0+c2l6ZSA+PiAxMikgPDwgMSkgKyBwdGU7Ci0KLQl3aGlsZSAocHRlIDwgcHRlX2VuZCkgewotCQludl93bzMyKHByaXYtPnByYW1pbl9wdCwgKHB0ZSAqIDQpICsgMCwgMHgwMDAwMDAwMCk7Ci0JCW52X3dvMzIocHJpdi0+cHJhbWluX3B0LCAocHRlICogNCkgKyA0LCAweDAwMDAwMDAwKTsKLQkJcHRlICs9IDI7CisJaWYgKG5vZGUtPnZyYW0tPmJhcl92bWEubm9kZSkgeworCQlub3V2ZWF1X3ZtX3VubWFwKCZub2RlLT52cmFtLT5iYXJfdm1hKTsKKwkJbm91dmVhdV92bV9wdXQoJm5vZGUtPnZyYW0tPmJhcl92bWEpOwogCX0KLQlkZXZfcHJpdi0+ZW5naW5lLmluc3RtZW0uZmx1c2goZGV2KTsKLQotCWdwdW9iai0+aW1fYm91bmQgPSAwOwotCXJldHVybiAwOwogfQogCiB2b2lkCkBAIC00NTIsMTEgKzQxMywzIEBACiAJCU5WX0VSUk9SKGRldiwgIlBSQU1JTiBmbHVzaCB0aW1lb3V0XG4iKTsKIH0KIAotdm9pZAotbnY1MF92bV9mbHVzaChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgZW5naW5lKQotewotCW52X3dyMzIoZGV2LCAweDEwMGM4MCwgKGVuZ2luZSA8PCAxNikgfCAxKTsKLQlpZiAoIW52X3dhaXQoZGV2LCAweDEwMGM4MCwgMHgwMDAwMDAwMSwgMHgwMDAwMDAwMCkpCi0JCU5WX0VSUk9SKGRldiwgInZtIGZsdXNoIHRpbWVvdXQ6IGVuZ2luZSAlZFxuIiwgZW5naW5lKTsKLX0KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnY1MF92bS5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnY1MF92bS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4ZTUyM2UKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjUwX3ZtLmMKQEAgLTAsMCArMSwxODAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxMCBSZWQgSGF0IEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBDT1BZUklHSFQgSE9MREVSKFMpIE9SIEFVVEhPUihTKSBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBBdXRob3JzOiBCZW4gU2tlZ2dzCisgKi8KKworI2luY2x1ZGUgImRybVAuaCIKKworI2luY2x1ZGUgIm5vdXZlYXVfZHJ2LmgiCisjaW5jbHVkZSAibm91dmVhdV92bS5oIgorCit2b2lkCitudjUwX3ZtX21hcF9wZ3Qoc3RydWN0IG5vdXZlYXVfZ3B1b2JqICpwZ2QsIHUzMiBwZGUsCisJCXN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqcGd0WzJdKQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IHBnZC0+ZGV2LT5kZXZfcHJpdmF0ZTsKKwl1NjQgcGh5cyA9IDB4ZGVhZGNhZmUwMDAwMDAwMFVMTDsKKwl1MzIgY292ZXJhZ2UgPSAwOworCisJaWYgKHBndFswXSkgeworCQlwaHlzID0gMHgwMDAwMDAwMyB8IHBndFswXS0+dmluc3Q7IC8qIHByZXNlbnQsIDRLaUIgcGFnZXMgKi8KKwkJY292ZXJhZ2UgPSAocGd0WzBdLT5zaXplID4+IDMpIDw8IDEyOworCX0gZWxzZQorCWlmIChwZ3RbMV0pIHsKKwkJcGh5cyA9IDB4MDAwMDAwMDEgfCBwZ3RbMV0tPnZpbnN0OyAvKiBwcmVzZW50ICovCisJCWNvdmVyYWdlID0gKHBndFsxXS0+c2l6ZSA+PiAzKSA8PCAxNjsKKwl9CisKKwlpZiAocGh5cyAmIDEpIHsKKwkJaWYgKGRldl9wcml2LT52cmFtX3N5c19iYXNlKSB7CisJCQlwaHlzICs9IGRldl9wcml2LT52cmFtX3N5c19iYXNlOworCQkJcGh5cyB8PSAweDMwOworCQl9CisKKwkJaWYgKGNvdmVyYWdlIDw9IDMyICogMTAyNCAqIDEwMjQpCisJCQlwaHlzIHw9IDB4NjA7CisJCWVsc2UgaWYgKGNvdmVyYWdlIDw9IDY0ICogMTAyNCAqIDEwMjQpCisJCQlwaHlzIHw9IDB4NDA7CisJCWVsc2UgaWYgKGNvdmVyYWdlIDwgMTI4ICogMTAyNCAqIDEwMjQpCisJCQlwaHlzIHw9IDB4MjA7CisJfQorCisJbnZfd28zMihwZ2QsIChwZGUgKiA4KSArIDAsIGxvd2VyXzMyX2JpdHMocGh5cykpOworCW52X3dvMzIocGdkLCAocGRlICogOCkgKyA0LCB1cHBlcl8zMl9iaXRzKHBoeXMpKTsKK30KKworc3RhdGljIGlubGluZSB1NjQKK252NTBfdm1fYWRkcihzdHJ1Y3Qgbm91dmVhdV92bWEgKnZtYSwgc3RydWN0IG5vdXZlYXVfZ3B1b2JqICpwZ3QsCisJICAgICB1NjQgcGh5cywgdTMyIG1lbXR5cGUsIHUzMiB0YXJnZXQpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gcGd0LT5kZXYtPmRldl9wcml2YXRlOworCisJcGh5cyB8PSAxOyAvKiBwcmVzZW50ICovCisJcGh5cyB8PSAodTY0KW1lbXR5cGUgPDwgNDA7CisKKwkvKiBJR1BzIGRvbid0IGhhdmUgcmVhbCBWUkFNLCByZS10YXJnZXQgdG8gc3RvbGVuIHN5c3RlbSBtZW1vcnkgKi8KKwlpZiAodGFyZ2V0ID09IDAgJiYgZGV2X3ByaXYtPnZyYW1fc3lzX2Jhc2UpIHsKKwkJcGh5cyAgKz0gZGV2X3ByaXYtPnZyYW1fc3lzX2Jhc2U7CisJCXRhcmdldCA9IDM7CisJfQorCisJcGh5cyB8PSB0YXJnZXQgPDwgNDsKKworCWlmICh2bWEtPmFjY2VzcyAmIE5WX01FTV9BQ0NFU1NfU1lTKQorCQlwaHlzIHw9ICgxIDw8IDYpOworCisJaWYgKCEodm1hLT5hY2Nlc3MgJiBOVl9NRU1fQUNDRVNTX1dPKSkKKwkJcGh5cyB8PSAoMSA8PCAzKTsKKworCXJldHVybiBwaHlzOworfQorCit2b2lkCitudjUwX3ZtX21hcChzdHJ1Y3Qgbm91dmVhdV92bWEgKnZtYSwgc3RydWN0IG5vdXZlYXVfZ3B1b2JqICpwZ3QsCisJICAgIHN0cnVjdCBub3V2ZWF1X3ZyYW0gKm1lbSwgdTMyIHB0ZSwgdTMyIGNudCwgdTY0IHBoeXMpCit7CisJdTMyIGJsb2NrOworCWludCBpOworCisJcGh5cyAgPSBudjUwX3ZtX2FkZHIodm1hLCBwZ3QsIHBoeXMsIG1lbS0+bWVtdHlwZSwgMCk7CisJcHRlIDw8PSAzOworCWNudCA8PD0gMzsKKworCXdoaWxlIChjbnQpIHsKKwkJdTMyIG9mZnNldF9oID0gdXBwZXJfMzJfYml0cyhwaHlzKTsKKwkJdTMyIG9mZnNldF9sID0gbG93ZXJfMzJfYml0cyhwaHlzKTsKKworCQlmb3IgKGkgPSA3OyBpID49IDA7IGktLSkgeworCQkJYmxvY2sgPSAxIDw8IChpICsgMyk7CisJCQlpZiAoY250ID49IGJsb2NrICYmICEocHRlICYgKGJsb2NrIC0gMSkpKQorCQkJCWJyZWFrOworCQl9CisJCW9mZnNldF9sIHw9IChpIDw8IDcpOworCisJCXBoeXMgKz0gYmxvY2sgPDwgKHZtYS0+bm9kZS0+dHlwZSAtIDMpOworCQljbnQgIC09IGJsb2NrOworCisJCXdoaWxlIChibG9jaykgeworCQkJbnZfd28zMihwZ3QsIHB0ZSArIDAsIG9mZnNldF9sKTsKKwkJCW52X3dvMzIocGd0LCBwdGUgKyA0LCBvZmZzZXRfaCk7CisJCQlwdGUgKz0gODsKKwkJCWJsb2NrIC09IDg7CisJCX0KKwl9Cit9CisKK3ZvaWQKK252NTBfdm1fbWFwX3NnKHN0cnVjdCBub3V2ZWF1X3ZtYSAqdm1hLCBzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKnBndCwKKwkgICAgICAgdTMyIHB0ZSwgZG1hX2FkZHJfdCAqbGlzdCwgdTMyIGNudCkKK3sKKwlwdGUgPDw9IDM7CisJd2hpbGUgKGNudC0tKSB7CisJCXU2NCBwaHlzID0gbnY1MF92bV9hZGRyKHZtYSwgcGd0LCAodTY0KSpsaXN0KyssIDAsIDIpOworCQludl93bzMyKHBndCwgcHRlICsgMCwgbG93ZXJfMzJfYml0cyhwaHlzKSk7CisJCW52X3dvMzIocGd0LCBwdGUgKyA0LCB1cHBlcl8zMl9iaXRzKHBoeXMpKTsKKwkJcHRlICs9IDg7CisJfQorfQorCit2b2lkCitudjUwX3ZtX3VubWFwKHN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqcGd0LCB1MzIgcHRlLCB1MzIgY250KQoreworCXB0ZSA8PD0gMzsKKwl3aGlsZSAoY250LS0pIHsKKwkJbnZfd28zMihwZ3QsIHB0ZSArIDAsIDB4MDAwMDAwMDApOworCQludl93bzMyKHBndCwgcHRlICsgNCwgMHgwMDAwMDAwMCk7CisJCXB0ZSArPSA4OworCX0KK30KKwordm9pZAorbnY1MF92bV9mbHVzaChzdHJ1Y3Qgbm91dmVhdV92bSAqdm0pCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gdm0tPmRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG5vdXZlYXVfaW5zdG1lbV9lbmdpbmUgKnBpbnN0bWVtID0gJmRldl9wcml2LT5lbmdpbmUuaW5zdG1lbTsKKwlzdHJ1Y3Qgbm91dmVhdV9maWZvX2VuZ2luZSAqcGZpZm8gPSAmZGV2X3ByaXYtPmVuZ2luZS5maWZvOworCXN0cnVjdCBub3V2ZWF1X3BncmFwaF9lbmdpbmUgKnBncmFwaCA9ICZkZXZfcHJpdi0+ZW5naW5lLmdyYXBoOworCXN0cnVjdCBub3V2ZWF1X2NyeXB0X2VuZ2luZSAqcGNyeXB0ID0gJmRldl9wcml2LT5lbmdpbmUuY3J5cHQ7CisKKwlwaW5zdG1lbS0+Zmx1c2godm0tPmRldik7CisKKwkvKiBCQVIgKi8KKwlpZiAodm0gIT0gZGV2X3ByaXYtPmNoYW5fdm0pIHsKKwkJbnY1MF92bV9mbHVzaF9lbmdpbmUodm0tPmRldiwgNik7CisJCXJldHVybjsKKwl9CisKKwlwZmlmby0+dGxiX2ZsdXNoKHZtLT5kZXYpOworCisJaWYgKGF0b21pY19yZWFkKCZ2bS0+cGdyYXBoX3JlZnMpKQorCQlwZ3JhcGgtPnRsYl9mbHVzaCh2bS0+ZGV2KTsKKwlpZiAoYXRvbWljX3JlYWQoJnZtLT5wY3J5cHRfcmVmcykpCisJCXBjcnlwdC0+dGxiX2ZsdXNoKHZtLT5kZXYpOworfQorCit2b2lkCitudjUwX3ZtX2ZsdXNoX2VuZ2luZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgZW5naW5lKQoreworCW52X3dyMzIoZGV2LCAweDEwMGM4MCwgKGVuZ2luZSA8PCAxNikgfCAxKTsKKwlpZiAoIW52X3dhaXQoZGV2LCAweDEwMGM4MCwgMHgwMDAwMDAwMSwgMHgwMDAwMDAwMCkpCisJCU5WX0VSUk9SKGRldiwgInZtIGZsdXNoIHRpbWVvdXQ6IGVuZ2luZSAlZFxuIiwgZW5naW5lKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252NTBfdnJhbS5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnY1MF92cmFtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNThlOThhZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252NTBfdnJhbS5jCkBAIC0wLDAgKzEsMTkwIEBACisvKgorICogQ29weXJpZ2h0IDIwMTAgUmVkIEhhdCBJbmMuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQ09QWVJJR0hUIEhPTERFUihTKSBPUiBBVVRIT1IoUykgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogQXV0aG9yczogQmVuIFNrZWdncworICovCisKKyNpbmNsdWRlICJkcm1QLmgiCisjaW5jbHVkZSAibm91dmVhdV9kcnYuaCIKKyNpbmNsdWRlICJub3V2ZWF1X21tLmgiCisKK3N0YXRpYyBpbnQgdHlwZXNbMHg4MF0gPSB7CisJMSwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKwkxLCAxLCAxLCAxLCAwLCAwLCAwLCAwLCAyLCAyLCAyLCAyLCAwLCAwLCAwLCAwLAorCTEsIDEsIDEsIDEsIDEsIDEsIDEsIDAsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDAsCisJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKwkxLCAxLCAxLCAxLCAxLCAxLCAxLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAwLCAwLAorCTAsIDAsIDAsIDAsIDEsIDEsIDEsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisJMSwgMSwgMSwgMSwgMSwgMSwgMSwgMCwgMSwgMSwgMSwgMSwgMiwgMiwgMiwgMiwKKwkxLCAwLCAyLCAwLCAxLCAwLCAyLCAwLCAxLCAxLCAyLCAyLCAxLCAxLCAwLCAwCit9OworCitib29sCitudjUwX3ZyYW1fZmxhZ3NfdmFsaWQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdTMyIHRpbGVfZmxhZ3MpCit7CisJaW50IHR5cGUgPSAodGlsZV9mbGFncyAmIE5PVVZFQVVfR0VNX1RJTEVfTEFZT1VUX01BU0spID4+IDg7CisKKwlpZiAobGlrZWx5KHR5cGUgPCBBUlJBWV9TSVpFKHR5cGVzKSAmJiB0eXBlc1t0eXBlXSkpCisJCXJldHVybiB0cnVlOworCXJldHVybiBmYWxzZTsKK30KKwordm9pZAorbnY1MF92cmFtX2RlbChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3Qgbm91dmVhdV92cmFtICoqcHZyYW0pCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgdHRtX2JvX2RldmljZSAqYmRldiA9ICZkZXZfcHJpdi0+dHRtLmJkZXY7CisJc3RydWN0IHR0bV9tZW1fdHlwZV9tYW5hZ2VyICptYW4gPSAmYmRldi0+bWFuW1RUTV9QTF9WUkFNXTsKKwlzdHJ1Y3Qgbm91dmVhdV9tbSAqbW0gPSBtYW4tPnByaXY7CisJc3RydWN0IG5vdXZlYXVfbW1fbm9kZSAqdGhpczsKKwlzdHJ1Y3Qgbm91dmVhdV92cmFtICp2cmFtOworCisJdnJhbSA9ICpwdnJhbTsKKwkqcHZyYW0gPSBOVUxMOworCWlmICh1bmxpa2VseSh2cmFtID09IE5VTEwpKQorCQlyZXR1cm47CisKKwltdXRleF9sb2NrKCZtbS0+bXV0ZXgpOworCXdoaWxlICghbGlzdF9lbXB0eSgmdnJhbS0+cmVnaW9ucykpIHsKKwkJdGhpcyA9IGxpc3RfZmlyc3RfZW50cnkoJnZyYW0tPnJlZ2lvbnMsIHN0cnVjdCBub3V2ZWF1X21tX25vZGUsIHJsX2VudHJ5KTsKKworCQlsaXN0X2RlbCgmdGhpcy0+cmxfZW50cnkpOworCQlub3V2ZWF1X21tX3B1dChtbSwgdGhpcyk7CisJfQorCW11dGV4X3VubG9jaygmbW0tPm11dGV4KTsKKworCWtmcmVlKHZyYW0pOworfQorCitpbnQKK252NTBfdnJhbV9uZXcoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdTY0IHNpemUsIHUzMiBhbGlnbiwgdTMyIHNpemVfbmMsCisJICAgICAgdTMyIHR5cGUsIHN0cnVjdCBub3V2ZWF1X3ZyYW0gKipwdnJhbSkKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCB0dG1fYm9fZGV2aWNlICpiZGV2ID0gJmRldl9wcml2LT50dG0uYmRldjsKKwlzdHJ1Y3QgdHRtX21lbV90eXBlX21hbmFnZXIgKm1hbiA9ICZiZGV2LT5tYW5bVFRNX1BMX1ZSQU1dOworCXN0cnVjdCBub3V2ZWF1X21tICptbSA9IG1hbi0+cHJpdjsKKwlzdHJ1Y3Qgbm91dmVhdV9tbV9ub2RlICpyOworCXN0cnVjdCBub3V2ZWF1X3ZyYW0gKnZyYW07CisJaW50IHJldDsKKworCWlmICghdHlwZXNbdHlwZV0pCisJCXJldHVybiAtRUlOVkFMOworCXNpemUgPj49IDEyOworCWFsaWduID4+PSAxMjsKKwlzaXplX25jID4+PSAxMjsKKworCXZyYW0gPSBremFsbG9jKHNpemVvZigqdnJhbSksIEdGUF9LRVJORUwpOworCWlmICghdnJhbSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlJTklUX0xJU1RfSEVBRCgmdnJhbS0+cmVnaW9ucyk7CisJdnJhbS0+ZGV2ID0gZGV2X3ByaXYtPmRldjsKKwl2cmFtLT5tZW10eXBlID0gdHlwZTsKKwl2cmFtLT5zaXplID0gc2l6ZTsKKworCW11dGV4X2xvY2soJm1tLT5tdXRleCk7CisJZG8geworCQlyZXQgPSBub3V2ZWF1X21tX2dldChtbSwgdHlwZXNbdHlwZV0sIHNpemUsIHNpemVfbmMsIGFsaWduLCAmcik7CisJCWlmIChyZXQpIHsKKwkJCW11dGV4X3VubG9jaygmbW0tPm11dGV4KTsKKwkJCW52NTBfdnJhbV9kZWwoZGV2LCAmdnJhbSk7CisJCQlyZXR1cm4gcmV0OworCQl9CisKKwkJbGlzdF9hZGRfdGFpbCgmci0+cmxfZW50cnksICZ2cmFtLT5yZWdpb25zKTsKKwkJc2l6ZSAtPSByLT5sZW5ndGg7CisJfSB3aGlsZSAoc2l6ZSk7CisJbXV0ZXhfdW5sb2NrKCZtbS0+bXV0ZXgpOworCisJciA9IGxpc3RfZmlyc3RfZW50cnkoJnZyYW0tPnJlZ2lvbnMsIHN0cnVjdCBub3V2ZWF1X21tX25vZGUsIHJsX2VudHJ5KTsKKwl2cmFtLT5vZmZzZXQgPSAodTY0KXItPm9mZnNldCA8PCAxMjsKKwkqcHZyYW0gPSB2cmFtOworCXJldHVybiAwOworfQorCitzdGF0aWMgdTMyCitudjUwX3ZyYW1fcmJsb2NrKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlpbnQgaSwgcGFydHMsIGNvbGJpdHMsIHJvd2JpdHNhLCByb3diaXRzYiwgYmFua3M7CisJdTY0IHJvd3NpemUsIHByZWRpY3RlZDsKKwl1MzIgcjAsIHI0LCBydCwgcnUsIHJibG9ja19zaXplOworCisJcjAgPSBudl9yZDMyKGRldiwgMHgxMDAyMDApOworCXI0ID0gbnZfcmQzMihkZXYsIDB4MTAwMjA0KTsKKwlydCA9IG52X3JkMzIoZGV2LCAweDEwMDI1MCk7CisJcnUgPSBudl9yZDMyKGRldiwgMHgwMDE1NDApOworCU5WX0RFQlVHKGRldiwgIm1lbWNmZyAweCUwOHggMHglMDh4IDB4JTA4eCAweCUwOHhcbiIsIHIwLCByNCwgcnQsIHJ1KTsKKworCWZvciAoaSA9IDAsIHBhcnRzID0gMDsgaSA8IDg7IGkrKykgeworCQlpZiAocnUgJiAoMHgwMDAxMDAwMCA8PCBpKSkKKwkJCXBhcnRzKys7CisJfQorCisJY29sYml0cyAgPSAgKHI0ICYgMHgwMDAwZjAwMCkgPj4gMTI7CisJcm93Yml0c2EgPSAoKHI0ICYgMHgwMDBmMDAwMCkgPj4gMTYpICsgODsKKwlyb3diaXRzYiA9ICgocjQgJiAweDAwZjAwMDAwKSA+PiAyMCkgKyA4OworCWJhbmtzICAgID0gKChyNCAmIDB4MDEwMDAwMDApID8gOCA6IDQpOworCisJcm93c2l6ZSA9IHBhcnRzICogYmFua3MgKiAoMSA8PCBjb2xiaXRzKSAqIDg7CisJcHJlZGljdGVkID0gcm93c2l6ZSA8PCByb3diaXRzYTsKKwlpZiAocjAgJiAweDAwMDAwMDA0KQorCQlwcmVkaWN0ZWQgKz0gcm93c2l6ZSA8PCByb3diaXRzYjsKKworCWlmIChwcmVkaWN0ZWQgIT0gZGV2X3ByaXYtPnZyYW1fc2l6ZSkgeworCQlOVl9XQVJOKGRldiwgIm1lbW9yeSBjb250cm9sbGVyIHJlcG9ydHMgJWRNaUIgVlJBTVxuIiwKKwkJCSh1MzIpKGRldl9wcml2LT52cmFtX3NpemUgPj4gMjApKTsKKwkJTlZfV0FSTihkZXYsICJ3ZSBjYWxjdWxhdGVkICVkTWlCIFZSQU1cbiIsCisJCQkodTMyKShwcmVkaWN0ZWQgPj4gMjApKTsKKwl9CisKKwlyYmxvY2tfc2l6ZSA9IHJvd3NpemU7CisJaWYgKHJ0ICYgMSkKKwkJcmJsb2NrX3NpemUgKj0gMzsKKworCU5WX0RFQlVHKGRldiwgInJibG9jayAlZCBieXRlc1xuIiwgcmJsb2NrX3NpemUpOworCXJldHVybiByYmxvY2tfc2l6ZTsKK30KKworaW50CitudjUwX3ZyYW1faW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisKKwlkZXZfcHJpdi0+dnJhbV9zaXplICA9IG52X3JkMzIoZGV2LCAweDEwMDIwYyk7CisJZGV2X3ByaXYtPnZyYW1fc2l6ZSB8PSAoZGV2X3ByaXYtPnZyYW1fc2l6ZSAmIDB4ZmYpIDw8IDMyOworCWRldl9wcml2LT52cmFtX3NpemUgJj0gMHhmZmZmZmZmZjAwVUxMOworCisJc3dpdGNoIChkZXZfcHJpdi0+Y2hpcHNldCkgeworCWNhc2UgMHhhYToKKwljYXNlIDB4YWM6CisJY2FzZSAweGFmOgorCQlkZXZfcHJpdi0+dnJhbV9zeXNfYmFzZSA9ICh1NjQpbnZfcmQzMihkZXYsIDB4MTAwZTEwKSA8PCAxMjsKKwkJZGV2X3ByaXYtPnZyYW1fcmJsb2NrX3NpemUgPSA0MDk2OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfcHJpdi0+dnJhbV9yYmxvY2tfc2l6ZSA9IG52NTBfdnJhbV9yYmxvY2soZGV2KTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjg0X2NyeXB0LmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjg0X2NyeXB0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWMxOGFlMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252ODRfY3J5cHQuYwpAQCAtMCwwICsxLDE0MCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDEwIFJlZCBIYXQgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIENPUFlSSUdIVCBIT0xERVIoUykgT1IgQVVUSE9SKFMpIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIEF1dGhvcnM6IEJlbiBTa2VnZ3MKKyAqLworCisjaW5jbHVkZSAiZHJtUC5oIgorI2luY2x1ZGUgIm5vdXZlYXVfZHJ2LmgiCisjaW5jbHVkZSAibm91dmVhdV91dGlsLmgiCisjaW5jbHVkZSAibm91dmVhdV92bS5oIgorCitzdGF0aWMgdm9pZCBudjg0X2NyeXB0X2lzcihzdHJ1Y3QgZHJtX2RldmljZSAqKTsKKworaW50Citudjg0X2NyeXB0X2NyZWF0ZV9jb250ZXh0KHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4pCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNoYW4tPmRldjsKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqcmFtaW4gPSBjaGFuLT5yYW1pbjsKKwlpbnQgcmV0OworCisJTlZfREVCVUcoZGV2LCAiY2glZFxuIiwgY2hhbi0+aWQpOworCisJcmV0ID0gbm91dmVhdV9ncHVvYmpfbmV3KGRldiwgY2hhbiwgMjU2LCAwLAorCQkJCSBOVk9CSl9GTEFHX1pFUk9fQUxMT0MgfCBOVk9CSl9GTEFHX1pFUk9fRlJFRSwKKwkJCQkgJmNoYW4tPmNyeXB0X2N0eCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCW52X3dvMzIocmFtaW4sIDB4YTAsIDB4MDAxOTAwMDApOworCW52X3dvMzIocmFtaW4sIDB4YTQsIGNoYW4tPmNyeXB0X2N0eC0+dmluc3QgKyAweGZmKTsKKwludl93bzMyKHJhbWluLCAweGE4LCBjaGFuLT5jcnlwdF9jdHgtPnZpbnN0KTsKKwludl93bzMyKHJhbWluLCAweGFjLCAwKTsKKwludl93bzMyKHJhbWluLCAweGIwLCAwKTsKKwludl93bzMyKHJhbWluLCAweGI0LCAwKTsKKworCWRldl9wcml2LT5lbmdpbmUuaW5zdG1lbS5mbHVzaChkZXYpOworCWF0b21pY19pbmMoJmNoYW4tPnZtLT5wY3J5cHRfcmVmcyk7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQKK252ODRfY3J5cHRfZGVzdHJveV9jb250ZXh0KHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4pCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNoYW4tPmRldjsKKwl1MzIgaW5zdDsKKworCWlmICghY2hhbi0+Y3J5cHRfY3R4KQorCQlyZXR1cm47CisKKwlpbnN0ICA9IChjaGFuLT5yYW1pbi0+dmluc3QgPj4gMTIpOworCWluc3QgfD0gMHg4MDAwMDAwMDsKKworCS8qIG1hcmsgY29udGV4dCBhcyBpbnZhbGlkIGlmIHN0aWxsIG9uIHRoZSBoYXJkd2FyZSwgbm90CisJICogZG9pbmcgdGhpcyBjYXVzZXMgaXNzdWVzIHRoZSBuZXh0IHRpbWUgUENSWVBUIGlzIHVzZWQsCisJICogdW5zdXJwcmlzaW5nbHkgOikKKwkgKi8KKwludl93cjMyKGRldiwgMHgxMDIwMGMsIDB4MDAwMDAwMDApOworCWlmIChudl9yZDMyKGRldiwgMHgxMDIxODgpID09IGluc3QpCisJCW52X21hc2soZGV2LCAweDEwMjE4OCwgMHg4MDAwMDAwMCwgMHgwMDAwMDAwMCk7CisJaWYgKG52X3JkMzIoZGV2LCAweDEwMjE4YykgPT0gaW5zdCkKKwkJbnZfbWFzayhkZXYsIDB4MTAyMThjLCAweDgwMDAwMDAwLCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHgxMDIwMGMsIDB4MDAwMDAwMTApOworCisJbm91dmVhdV9ncHVvYmpfcmVmKE5VTEwsICZjaGFuLT5jcnlwdF9jdHgpOworCWF0b21pY19kZWMoJmNoYW4tPnZtLT5wY3J5cHRfcmVmcyk7Cit9CisKK3ZvaWQKK252ODRfY3J5cHRfdGxiX2ZsdXNoKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJbnY1MF92bV9mbHVzaF9lbmdpbmUoZGV2LCAweDBhKTsKK30KKworaW50Citudjg0X2NyeXB0X2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBub3V2ZWF1X2NyeXB0X2VuZ2luZSAqcGNyeXB0ID0gJmRldl9wcml2LT5lbmdpbmUuY3J5cHQ7CisKKwlpZiAoIXBjcnlwdC0+cmVnaXN0ZXJlZCkgeworCQlOVk9CSl9DTEFTUyhkZXYsIDB4NzRjMSwgQ1JZUFQpOworCQlwY3J5cHQtPnJlZ2lzdGVyZWQgPSB0cnVlOworCX0KKworCW52X21hc2soZGV2LCAweDAwMDIwMCwgMHgwMDAwNDAwMCwgMHgwMDAwMDAwMCk7CisJbnZfbWFzayhkZXYsIDB4MDAwMjAwLCAweDAwMDA0MDAwLCAweDAwMDA0MDAwKTsKKworCW5vdXZlYXVfaXJxX3JlZ2lzdGVyKGRldiwgMTQsIG52ODRfY3J5cHRfaXNyKTsKKwludl93cjMyKGRldiwgMHgxMDIxMzAsIDB4ZmZmZmZmZmYpOworCW52X3dyMzIoZGV2LCAweDEwMjE0MCwgMHhmZmZmZmZiZik7CisKKwludl93cjMyKGRldiwgMHgxMDIwMGMsIDB4MDAwMDAwMTApOworCXJldHVybiAwOworfQorCit2b2lkCitudjg0X2NyeXB0X2Zpbmkoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwludl93cjMyKGRldiwgMHgxMDIxNDAsIDB4MDAwMDAwMDApOworCW5vdXZlYXVfaXJxX3VucmVnaXN0ZXIoZGV2LCAxNCk7Cit9CisKK3N0YXRpYyB2b2lkCitudjg0X2NyeXB0X2lzcihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXUzMiBzdGF0ID0gbnZfcmQzMihkZXYsIDB4MTAyMTMwKTsKKwl1MzIgbXRoZCA9IG52X3JkMzIoZGV2LCAweDEwMjE5MCk7CisJdTMyIGRhdGEgPSBudl9yZDMyKGRldiwgMHgxMDIxOTQpOworCXUzMiBpbnN0ID0gbnZfcmQzMihkZXYsIDB4MTAyMTg4KSAmIDB4N2ZmZmZmZmY7CisJaW50IHNob3cgPSBub3V2ZWF1X3JhdGVsaW1pdCgpOworCisJaWYgKHNob3cpIHsKKwkJTlZfSU5GTyhkZXYsICJQQ1JZUFRfSU5UUjogMHglMDh4IDB4JTA4eCAweCUwOHggMHglMDh4XG4iLAorCQkJICAgICBzdGF0LCBtdGhkLCBkYXRhLCBpbnN0KTsKKwl9CisKKwludl93cjMyKGRldiwgMHgxMDIxMzAsIHN0YXQpOworCW52X3dyMzIoZGV2LCAweDEwMjAwYywgMHgxMCk7CisKKwludjUwX2ZiX3ZtX3RyYXAoZGV2LCBzaG93LCAiUENSWVBUIik7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udmMwX2ZiY29uLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udmMwX2ZiY29uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmE1ZDRjMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252YzBfZmJjb24uYwpAQCAtMCwwICsxLDI2OSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDEwIFJlZCBIYXQgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIENPUFlSSUdIVCBIT0xERVIoUykgT1IgQVVUSE9SKFMpIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIEF1dGhvcnM6IEJlbiBTa2VnZ3MKKyAqLworCisjaW5jbHVkZSAiZHJtUC5oIgorI2luY2x1ZGUgIm5vdXZlYXVfZHJ2LmgiCisjaW5jbHVkZSAibm91dmVhdV9kbWEuaCIKKyNpbmNsdWRlICJub3V2ZWF1X3JhbWh0LmgiCisjaW5jbHVkZSAibm91dmVhdV9mYmNvbi5oIgorI2luY2x1ZGUgIm5vdXZlYXVfbW0uaCIKKworaW50CitudmMwX2ZiY29uX2ZpbGxyZWN0KHN0cnVjdCBmYl9pbmZvICppbmZvLCBjb25zdCBzdHJ1Y3QgZmJfZmlsbHJlY3QgKnJlY3QpCit7CisJc3RydWN0IG5vdXZlYXVfZmJkZXYgKm5mYmRldiA9IGluZm8tPnBhcjsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gbmZiZGV2LT5kZXY7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuID0gZGV2X3ByaXYtPmNoYW5uZWw7CisJaW50IHJldDsKKworCXJldCA9IFJJTkdfU1BBQ0UoY2hhbiwgcmVjdC0+cm9wID09IFJPUF9DT1BZID8gNyA6IDExKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJaWYgKHJlY3QtPnJvcCAhPSBST1BfQ09QWSkgeworCQlCRUdJTl9OVkMwKGNoYW4sIDIsIE52U3ViMkQsIDB4MDJhYywgMSk7CisJCU9VVF9SSU5HICAoY2hhbiwgMSk7CisJfQorCUJFR0lOX05WQzAoY2hhbiwgMiwgTnZTdWIyRCwgMHgwNTg4LCAxKTsKKwlpZiAoaW5mby0+Zml4LnZpc3VhbCA9PSBGQl9WSVNVQUxfVFJVRUNPTE9SIHx8CisJICAgIGluZm8tPmZpeC52aXN1YWwgPT0gRkJfVklTVUFMX0RJUkVDVENPTE9SKQorCQlPVVRfUklORyAgKGNoYW4sICgodWludDMyX3QgKilpbmZvLT5wc2V1ZG9fcGFsZXR0ZSlbcmVjdC0+Y29sb3JdKTsKKwllbHNlCisJCU9VVF9SSU5HICAoY2hhbiwgcmVjdC0+Y29sb3IpOworCUJFR0lOX05WQzAoY2hhbiwgMiwgTnZTdWIyRCwgMHgwNjAwLCA0KTsKKwlPVVRfUklORyAgKGNoYW4sIHJlY3QtPmR4KTsKKwlPVVRfUklORyAgKGNoYW4sIHJlY3QtPmR5KTsKKwlPVVRfUklORyAgKGNoYW4sIHJlY3QtPmR4ICsgcmVjdC0+d2lkdGgpOworCU9VVF9SSU5HICAoY2hhbiwgcmVjdC0+ZHkgKyByZWN0LT5oZWlnaHQpOworCWlmIChyZWN0LT5yb3AgIT0gUk9QX0NPUFkpIHsKKwkJQkVHSU5fTlZDMChjaGFuLCAyLCBOdlN1YjJELCAweDAyYWMsIDEpOworCQlPVVRfUklORyAgKGNoYW4sIDMpOworCX0KKwlGSVJFX1JJTkcoY2hhbik7CisJcmV0dXJuIDA7Cit9CisKK2ludAorbnZjMF9mYmNvbl9jb3B5YXJlYShzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgY29uc3Qgc3RydWN0IGZiX2NvcHlhcmVhICpyZWdpb24pCit7CisJc3RydWN0IG5vdXZlYXVfZmJkZXYgKm5mYmRldiA9IGluZm8tPnBhcjsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gbmZiZGV2LT5kZXY7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuID0gZGV2X3ByaXYtPmNoYW5uZWw7CisJaW50IHJldDsKKworCXJldCA9IFJJTkdfU1BBQ0UoY2hhbiwgMTIpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlCRUdJTl9OVkMwKGNoYW4sIDIsIE52U3ViMkQsIDB4MDExMCwgMSk7CisJT1VUX1JJTkcgIChjaGFuLCAwKTsKKwlCRUdJTl9OVkMwKGNoYW4sIDIsIE52U3ViMkQsIDB4MDhiMCwgNCk7CisJT1VUX1JJTkcgIChjaGFuLCByZWdpb24tPmR4KTsKKwlPVVRfUklORyAgKGNoYW4sIHJlZ2lvbi0+ZHkpOworCU9VVF9SSU5HICAoY2hhbiwgcmVnaW9uLT53aWR0aCk7CisJT1VUX1JJTkcgIChjaGFuLCByZWdpb24tPmhlaWdodCk7CisJQkVHSU5fTlZDMChjaGFuLCAyLCBOdlN1YjJELCAweDA4ZDAsIDQpOworCU9VVF9SSU5HICAoY2hhbiwgMCk7CisJT1VUX1JJTkcgIChjaGFuLCByZWdpb24tPnN4KTsKKwlPVVRfUklORyAgKGNoYW4sIDApOworCU9VVF9SSU5HICAoY2hhbiwgcmVnaW9uLT5zeSk7CisJRklSRV9SSU5HKGNoYW4pOworCXJldHVybiAwOworfQorCitpbnQKK252YzBfZmJjb25faW1hZ2VibGl0KHN0cnVjdCBmYl9pbmZvICppbmZvLCBjb25zdCBzdHJ1Y3QgZmJfaW1hZ2UgKmltYWdlKQoreworCXN0cnVjdCBub3V2ZWF1X2ZiZGV2ICpuZmJkZXYgPSBpbmZvLT5wYXI7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IG5mYmRldi0+ZGV2OworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbiA9IGRldl9wcml2LT5jaGFubmVsOworCXVpbnQzMl90IHdpZHRoLCBkd29yZHMsICpkYXRhID0gKHVpbnQzMl90ICopaW1hZ2UtPmRhdGE7CisJdWludDMyX3QgbWFzayA9IH4ofjAgPj4gKDMyIC0gaW5mby0+dmFyLmJpdHNfcGVyX3BpeGVsKSk7CisJdWludDMyX3QgKnBhbGV0dGUgPSBpbmZvLT5wc2V1ZG9fcGFsZXR0ZTsKKwlpbnQgcmV0OworCisJaWYgKGltYWdlLT5kZXB0aCAhPSAxKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXJldCA9IFJJTkdfU1BBQ0UoY2hhbiwgMTEpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwl3aWR0aCA9IEFMSUdOKGltYWdlLT53aWR0aCwgMzIpOworCWR3b3JkcyA9ICh3aWR0aCAqIGltYWdlLT5oZWlnaHQpID4+IDU7CisKKwlCRUdJTl9OVkMwKGNoYW4sIDIsIE52U3ViMkQsIDB4MDgxNCwgMik7CisJaWYgKGluZm8tPmZpeC52aXN1YWwgPT0gRkJfVklTVUFMX1RSVUVDT0xPUiB8fAorCSAgICBpbmZvLT5maXgudmlzdWFsID09IEZCX1ZJU1VBTF9ESVJFQ1RDT0xPUikgeworCQlPVVRfUklORyAgKGNoYW4sIHBhbGV0dGVbaW1hZ2UtPmJnX2NvbG9yXSB8IG1hc2spOworCQlPVVRfUklORyAgKGNoYW4sIHBhbGV0dGVbaW1hZ2UtPmZnX2NvbG9yXSB8IG1hc2spOworCX0gZWxzZSB7CisJCU9VVF9SSU5HICAoY2hhbiwgaW1hZ2UtPmJnX2NvbG9yKTsKKwkJT1VUX1JJTkcgIChjaGFuLCBpbWFnZS0+ZmdfY29sb3IpOworCX0KKwlCRUdJTl9OVkMwKGNoYW4sIDIsIE52U3ViMkQsIDB4MDgzOCwgMik7CisJT1VUX1JJTkcgIChjaGFuLCBpbWFnZS0+d2lkdGgpOworCU9VVF9SSU5HICAoY2hhbiwgaW1hZ2UtPmhlaWdodCk7CisJQkVHSU5fTlZDMChjaGFuLCAyLCBOdlN1YjJELCAweDA4NTAsIDQpOworCU9VVF9SSU5HICAoY2hhbiwgMCk7CisJT1VUX1JJTkcgIChjaGFuLCBpbWFnZS0+ZHgpOworCU9VVF9SSU5HICAoY2hhbiwgMCk7CisJT1VUX1JJTkcgIChjaGFuLCBpbWFnZS0+ZHkpOworCisJd2hpbGUgKGR3b3JkcykgeworCQlpbnQgcHVzaCA9IGR3b3JkcyA+IDIwNDcgPyAyMDQ3IDogZHdvcmRzOworCisJCXJldCA9IFJJTkdfU1BBQ0UoY2hhbiwgcHVzaCArIDEpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKworCQlkd29yZHMgLT0gcHVzaDsKKworCQlCRUdJTl9OVkMwKGNoYW4sIDYsIE52U3ViMkQsIDB4MDg2MCwgcHVzaCk7CisJCU9VVF9SSU5HcChjaGFuLCBkYXRhLCBwdXNoKTsKKwkJZGF0YSArPSBwdXNoOworCX0KKworCUZJUkVfUklORyhjaGFuKTsKKwlyZXR1cm4gMDsKK30KKworaW50CitudmMwX2ZiY29uX2FjY2VsX2luaXQoc3RydWN0IGZiX2luZm8gKmluZm8pCit7CisJc3RydWN0IG5vdXZlYXVfZmJkZXYgKm5mYmRldiA9IGluZm8tPnBhcjsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gbmZiZGV2LT5kZXY7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuID0gZGV2X3ByaXYtPmNoYW5uZWw7CisJc3RydWN0IG5vdXZlYXVfYm8gKm52Ym8gPSBuZmJkZXYtPm5vdXZlYXVfZmIubnZibzsKKwlpbnQgcmV0LCBmb3JtYXQ7CisKKwlyZXQgPSBub3V2ZWF1X2dwdW9ial9ncl9uZXcoY2hhbiwgMHg5MDJkLCAweDkwMmQpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlzd2l0Y2ggKGluZm8tPnZhci5iaXRzX3Blcl9waXhlbCkgeworCWNhc2UgODoKKwkJZm9ybWF0ID0gMHhmMzsKKwkJYnJlYWs7CisJY2FzZSAxNToKKwkJZm9ybWF0ID0gMHhmODsKKwkJYnJlYWs7CisJY2FzZSAxNjoKKwkJZm9ybWF0ID0gMHhlODsKKwkJYnJlYWs7CisJY2FzZSAzMjoKKwkJc3dpdGNoIChpbmZvLT52YXIudHJhbnNwLmxlbmd0aCkgeworCQljYXNlIDA6IC8qIGRlcHRoIDI0ICovCisJCWNhc2UgODogLyogZGVwdGggMzIsIGp1c3QgdXNlIDI0Li4gKi8KKwkJCWZvcm1hdCA9IDB4ZTY7CisJCQlicmVhazsKKwkJY2FzZSAyOiAvKiBkZXB0aCAzMCAqLworCQkJZm9ybWF0ID0gMHhkMTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0ID0gUklOR19TUEFDRShjaGFuLCA2MCk7CisJaWYgKHJldCkgeworCQlXQVJOX09OKDEpOworCQlub3V2ZWF1X2ZiY29uX2dwdV9sb2NrdXAoaW5mbyk7CisJCXJldHVybiByZXQ7CisJfQorCisJQkVHSU5fTlZDMChjaGFuLCAyLCBOdlN1YjJELCAweDAwMDAsIDEpOworCU9VVF9SSU5HICAoY2hhbiwgMHgwMDAwOTAyZCk7CisJQkVHSU5fTlZDMChjaGFuLCAyLCBOdlN1YjJELCAweDAxMDQsIDIpOworCU9VVF9SSU5HICAoY2hhbiwgdXBwZXJfMzJfYml0cyhjaGFuLT5ub3RpZmllcl9iby0+Ym8ub2Zmc2V0KSk7CisJT1VUX1JJTkcgIChjaGFuLCBsb3dlcl8zMl9iaXRzKGNoYW4tPm5vdGlmaWVyX2JvLT5iby5vZmZzZXQpKTsKKwlCRUdJTl9OVkMwKGNoYW4sIDIsIE52U3ViMkQsIDB4MDI5MCwgMSk7CisJT1VUX1JJTkcgIChjaGFuLCAwKTsKKwlCRUdJTl9OVkMwKGNoYW4sIDIsIE52U3ViMkQsIDB4MDg4OCwgMSk7CisJT1VUX1JJTkcgIChjaGFuLCAxKTsKKwlCRUdJTl9OVkMwKGNoYW4sIDIsIE52U3ViMkQsIDB4MDJhYywgMSk7CisJT1VUX1JJTkcgIChjaGFuLCAzKTsKKwlCRUdJTl9OVkMwKGNoYW4sIDIsIE52U3ViMkQsIDB4MDJhMCwgMSk7CisJT1VUX1JJTkcgIChjaGFuLCAweDU1KTsKKwlCRUdJTl9OVkMwKGNoYW4sIDIsIE52U3ViMkQsIDB4MDhjMCwgNCk7CisJT1VUX1JJTkcgIChjaGFuLCAwKTsKKwlPVVRfUklORyAgKGNoYW4sIDEpOworCU9VVF9SSU5HICAoY2hhbiwgMCk7CisJT1VUX1JJTkcgIChjaGFuLCAxKTsKKwlCRUdJTl9OVkMwKGNoYW4sIDIsIE52U3ViMkQsIDB4MDU4MCwgMik7CisJT1VUX1JJTkcgIChjaGFuLCA0KTsKKwlPVVRfUklORyAgKGNoYW4sIGZvcm1hdCk7CisJQkVHSU5fTlZDMChjaGFuLCAyLCBOdlN1YjJELCAweDAyZTgsIDIpOworCU9VVF9SSU5HICAoY2hhbiwgMik7CisJT1VUX1JJTkcgIChjaGFuLCAxKTsKKworCUJFR0lOX05WQzAoY2hhbiwgMiwgTnZTdWIyRCwgMHgwODA0LCAxKTsKKwlPVVRfUklORyAgKGNoYW4sIGZvcm1hdCk7CisJQkVHSU5fTlZDMChjaGFuLCAyLCBOdlN1YjJELCAweDA4MDAsIDEpOworCU9VVF9SSU5HICAoY2hhbiwgMSk7CisJQkVHSU5fTlZDMChjaGFuLCAyLCBOdlN1YjJELCAweDA4MDgsIDMpOworCU9VVF9SSU5HICAoY2hhbiwgMCk7CisJT1VUX1JJTkcgIChjaGFuLCAwKTsKKwlPVVRfUklORyAgKGNoYW4sIDEpOworCUJFR0lOX05WQzAoY2hhbiwgMiwgTnZTdWIyRCwgMHgwODFjLCAxKTsKKwlPVVRfUklORyAgKGNoYW4sIDEpOworCUJFR0lOX05WQzAoY2hhbiwgMiwgTnZTdWIyRCwgMHgwODQwLCA0KTsKKwlPVVRfUklORyAgKGNoYW4sIDApOworCU9VVF9SSU5HICAoY2hhbiwgMSk7CisJT1VUX1JJTkcgIChjaGFuLCAwKTsKKwlPVVRfUklORyAgKGNoYW4sIDEpOworCUJFR0lOX05WQzAoY2hhbiwgMiwgTnZTdWIyRCwgMHgwMjAwLCAxMCk7CisJT1VUX1JJTkcgIChjaGFuLCBmb3JtYXQpOworCU9VVF9SSU5HICAoY2hhbiwgMSk7CisJT1VUX1JJTkcgIChjaGFuLCAwKTsKKwlPVVRfUklORyAgKGNoYW4sIDEpOworCU9VVF9SSU5HICAoY2hhbiwgMCk7CisJT1VUX1JJTkcgIChjaGFuLCBpbmZvLT5maXgubGluZV9sZW5ndGgpOworCU9VVF9SSU5HICAoY2hhbiwgaW5mby0+dmFyLnhyZXNfdmlydHVhbCk7CisJT1VUX1JJTkcgIChjaGFuLCBpbmZvLT52YXIueXJlc192aXJ0dWFsKTsKKwlPVVRfUklORyAgKGNoYW4sIHVwcGVyXzMyX2JpdHMobnZiby0+dm1hLm9mZnNldCkpOworCU9VVF9SSU5HICAoY2hhbiwgbG93ZXJfMzJfYml0cyhudmJvLT52bWEub2Zmc2V0KSk7CisJQkVHSU5fTlZDMChjaGFuLCAyLCBOdlN1YjJELCAweDAyMzAsIDEwKTsKKwlPVVRfUklORyAgKGNoYW4sIGZvcm1hdCk7CisJT1VUX1JJTkcgIChjaGFuLCAxKTsKKwlPVVRfUklORyAgKGNoYW4sIDApOworCU9VVF9SSU5HICAoY2hhbiwgMSk7CisJT1VUX1JJTkcgIChjaGFuLCAwKTsKKwlPVVRfUklORyAgKGNoYW4sIGluZm8tPmZpeC5saW5lX2xlbmd0aCk7CisJT1VUX1JJTkcgIChjaGFuLCBpbmZvLT52YXIueHJlc192aXJ0dWFsKTsKKwlPVVRfUklORyAgKGNoYW4sIGluZm8tPnZhci55cmVzX3ZpcnR1YWwpOworCU9VVF9SSU5HICAoY2hhbiwgdXBwZXJfMzJfYml0cyhudmJvLT52bWEub2Zmc2V0KSk7CisJT1VUX1JJTkcgIChjaGFuLCBsb3dlcl8zMl9iaXRzKG52Ym8tPnZtYS5vZmZzZXQpKTsKKwlGSVJFX1JJTkcgKGNoYW4pOworCisJcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252YzBfZmlmby5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnZjMF9maWZvLmMKaW5kZXggODkwYzJiOS4uZTZmOTJjNTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252YzBfZmlmby5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252YzBfZmlmby5jCkBAIC0yNSw2ICsyNSw0OSBAQAogI2luY2x1ZGUgImRybVAuaCIKIAogI2luY2x1ZGUgIm5vdXZlYXVfZHJ2LmgiCisjaW5jbHVkZSAibm91dmVhdV9tbS5oIgorCitzdGF0aWMgdm9pZCBudmMwX2ZpZm9faXNyKHN0cnVjdCBkcm1fZGV2aWNlICopOworCitzdHJ1Y3QgbnZjMF9maWZvX3ByaXYgeworCXN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqcGxheWxpc3RbMl07CisJaW50IGN1cl9wbGF5bGlzdDsKKwlzdHJ1Y3Qgbm91dmVhdV92bWEgdXNlcl92bWE7CisJaW50IHNwb29uX25yOworfTsKKworc3RydWN0IG52YzBfZmlmb19jaGFuIHsKKwlzdHJ1Y3Qgbm91dmVhdV9ibyAqdXNlcjsKKwlzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKnJhbWZjOworfTsKKworc3RhdGljIHZvaWQKK252YzBfZmlmb19wbGF5bGlzdF91cGRhdGUoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBub3V2ZWF1X2luc3RtZW1fZW5naW5lICpwaW5zdG1lbSA9ICZkZXZfcHJpdi0+ZW5naW5lLmluc3RtZW07CisJc3RydWN0IG5vdXZlYXVfZmlmb19lbmdpbmUgKnBmaWZvID0gJmRldl9wcml2LT5lbmdpbmUuZmlmbzsKKwlzdHJ1Y3QgbnZjMF9maWZvX3ByaXYgKnByaXYgPSBwZmlmby0+cHJpdjsKKwlzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKmN1cjsKKwlpbnQgaSwgcDsKKworCWN1ciA9IHByaXYtPnBsYXlsaXN0W3ByaXYtPmN1cl9wbGF5bGlzdF07CisJcHJpdi0+Y3VyX3BsYXlsaXN0ID0gIXByaXYtPmN1cl9wbGF5bGlzdDsKKworCWZvciAoaSA9IDAsIHAgPSAwOyBpIDwgMTI4OyBpKyspIHsKKwkJaWYgKCEobnZfcmQzMihkZXYsIDB4MzAwNCArIChpICogOCkpICYgMSkpCisJCQljb250aW51ZTsKKwkJbnZfd28zMihjdXIsIHAgKyAwLCBpKTsKKwkJbnZfd28zMihjdXIsIHAgKyA0LCAweDAwMDAwMDA0KTsKKwkJcCArPSA4OworCX0KKwlwaW5zdG1lbS0+Zmx1c2goZGV2KTsKKworCW52X3dyMzIoZGV2LCAweDAwMjI3MCwgY3VyLT52aW5zdCA+PiAxMik7CisJbnZfd3IzMihkZXYsIDB4MDAyMjc0LCAweDAxZjAwMDAwIHwgKHAgPj4gMykpOworCWlmICghbnZfd2FpdChkZXYsIDB4MDAyMjdjLCAweDAwMTAwMDAwLCAweDAwMDAwMDAwKSkKKwkJTlZfRVJST1IoZGV2LCAiUEZJRk8gLSBwbGF5bGlzdCB1cGRhdGUgZmFpbGVkXG4iKTsKK30KIAogdm9pZAogbnZjMF9maWZvX2Rpc2FibGUoc3RydWN0IGRybV9kZXZpY2UgKmRldikKQEAgLTU3LDEyICsxMDAsMTM1IEBACiBpbnQKIG52YzBfZmlmb19jcmVhdGVfY29udGV4dChzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuKQogeworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjaGFuLT5kZXY7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3Qgbm91dmVhdV9pbnN0bWVtX2VuZ2luZSAqcGluc3RtZW0gPSAmZGV2X3ByaXYtPmVuZ2luZS5pbnN0bWVtOworCXN0cnVjdCBub3V2ZWF1X2ZpZm9fZW5naW5lICpwZmlmbyA9ICZkZXZfcHJpdi0+ZW5naW5lLmZpZm87CisJc3RydWN0IG52YzBfZmlmb19wcml2ICpwcml2ID0gcGZpZm8tPnByaXY7CisJc3RydWN0IG52YzBfZmlmb19jaGFuICpmaWZvY2g7CisJdTY0IGliX3ZpcnQsIHVzZXJfdmluc3Q7CisJaW50IHJldDsKKworCWNoYW4tPmZpZm9fcHJpdiA9IGt6YWxsb2Moc2l6ZW9mKCpmaWZvY2gpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWNoYW4tPmZpZm9fcHJpdikKKwkJcmV0dXJuIC1FTk9NRU07CisJZmlmb2NoID0gY2hhbi0+Zmlmb19wcml2OworCisJLyogYWxsb2NhdGUgdnJhbSBmb3IgY29udHJvbCByZWdzLCBtYXAgaW50byBwb2xsaW5nIGFyZWEgKi8KKwlyZXQgPSBub3V2ZWF1X2JvX25ldyhkZXYsIE5VTEwsIDB4MTAwMCwgMCwgVFRNX1BMX0ZMQUdfVlJBTSwKKwkJCSAgICAgMCwgMCwgdHJ1ZSwgdHJ1ZSwgJmZpZm9jaC0+dXNlcik7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcjsKKworCXJldCA9IG5vdXZlYXVfYm9fcGluKGZpZm9jaC0+dXNlciwgVFRNX1BMX0ZMQUdfVlJBTSk7CisJaWYgKHJldCkgeworCQlub3V2ZWF1X2JvX3JlZihOVUxMLCAmZmlmb2NoLT51c2VyKTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwl1c2VyX3ZpbnN0ID0gZmlmb2NoLT51c2VyLT5iby5tZW0uc3RhcnQgPDwgUEFHRV9TSElGVDsKKworCXJldCA9IG5vdXZlYXVfYm9fbWFwKGZpZm9jaC0+dXNlcik7CisJaWYgKHJldCkgeworCQlub3V2ZWF1X2JvX3VucGluKGZpZm9jaC0+dXNlcik7CisJCW5vdXZlYXVfYm9fcmVmKE5VTEwsICZmaWZvY2gtPnVzZXIpOworCQlnb3RvIGVycm9yOworCX0KKworCW5vdXZlYXVfdm1fbWFwX2F0KCZwcml2LT51c2VyX3ZtYSwgY2hhbi0+aWQgKiAweDEwMDAsCisJCQkgIGZpZm9jaC0+dXNlci0+Ym8ubWVtLm1tX25vZGUpOworCisJY2hhbi0+dXNlciA9IGlvcmVtYXBfd2MocGNpX3Jlc291cmNlX3N0YXJ0KGRldi0+cGRldiwgMSkgKworCQkJCXByaXYtPnVzZXJfdm1hLm9mZnNldCArIChjaGFuLT5pZCAqIDB4MTAwMCksCisJCQkJUEFHRV9TSVpFKTsKKwlpZiAoIWNoYW4tPnVzZXIpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlpYl92aXJ0ID0gY2hhbi0+cHVzaGJ1Zl9iYXNlICsgY2hhbi0+ZG1hLmliX2Jhc2UgKiA0OworCisJLyogemVybyBjaGFubmVsIHJlZ3MgKi8KKwlub3V2ZWF1X2JvX3dyMzIoZmlmb2NoLT51c2VyLCAweDAwNDAvNCwgMCk7CisJbm91dmVhdV9ib193cjMyKGZpZm9jaC0+dXNlciwgMHgwMDQ0LzQsIDApOworCW5vdXZlYXVfYm9fd3IzMihmaWZvY2gtPnVzZXIsIDB4MDA0OC80LCAwKTsKKwlub3V2ZWF1X2JvX3dyMzIoZmlmb2NoLT51c2VyLCAweDAwNGMvNCwgMCk7CisJbm91dmVhdV9ib193cjMyKGZpZm9jaC0+dXNlciwgMHgwMDUwLzQsIDApOworCW5vdXZlYXVfYm9fd3IzMihmaWZvY2gtPnVzZXIsIDB4MDA1OC80LCAwKTsKKwlub3V2ZWF1X2JvX3dyMzIoZmlmb2NoLT51c2VyLCAweDAwNWMvNCwgMCk7CisJbm91dmVhdV9ib193cjMyKGZpZm9jaC0+dXNlciwgMHgwMDYwLzQsIDApOworCW5vdXZlYXVfYm9fd3IzMihmaWZvY2gtPnVzZXIsIDB4MDA4OC80LCAwKTsKKwlub3V2ZWF1X2JvX3dyMzIoZmlmb2NoLT51c2VyLCAweDAwOGMvNCwgMCk7CisKKwkvKiByYW1mYyAqLworCXJldCA9IG5vdXZlYXVfZ3B1b2JqX25ld19mYWtlKGRldiwgY2hhbi0+cmFtaW4tPnBpbnN0LAorCQkJCSAgICAgIGNoYW4tPnJhbWluLT52aW5zdCwgMHgxMDAsCisJCQkJICAgICAgTlZPQkpfRkxBR19aRVJPX0FMTE9DLCAmZmlmb2NoLT5yYW1mYyk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcjsKKworCW52X3dvMzIoZmlmb2NoLT5yYW1mYywgMHgwOCwgbG93ZXJfMzJfYml0cyh1c2VyX3ZpbnN0KSk7CisJbnZfd28zMihmaWZvY2gtPnJhbWZjLCAweDBjLCB1cHBlcl8zMl9iaXRzKHVzZXJfdmluc3QpKTsKKwludl93bzMyKGZpZm9jaC0+cmFtZmMsIDB4MTAsIDB4MDAwMGZhY2UpOworCW52X3dvMzIoZmlmb2NoLT5yYW1mYywgMHgzMCwgMHhmZmZmZjkwMik7CisJbnZfd28zMihmaWZvY2gtPnJhbWZjLCAweDQ4LCBsb3dlcl8zMl9iaXRzKGliX3ZpcnQpKTsKKwludl93bzMyKGZpZm9jaC0+cmFtZmMsIDB4NGMsIGRybV9vcmRlcihjaGFuLT5kbWEuaWJfbWF4ICsgMSkgPDwgMTYgfAorCQkJCSAgIHVwcGVyXzMyX2JpdHMoaWJfdmlydCkpOworCW52X3dvMzIoZmlmb2NoLT5yYW1mYywgMHg1NCwgMHgwMDAwMDAwMik7CisJbnZfd28zMihmaWZvY2gtPnJhbWZjLCAweDg0LCAweDIwNDAwMDAwKTsKKwludl93bzMyKGZpZm9jaC0+cmFtZmMsIDB4OTQsIDB4MzAwMDAwMDEpOworCW52X3dvMzIoZmlmb2NoLT5yYW1mYywgMHg5YywgMHgwMDAwMDEwMCk7CisJbnZfd28zMihmaWZvY2gtPnJhbWZjLCAweGE0LCAweDFmMWYxZjFmKTsKKwludl93bzMyKGZpZm9jaC0+cmFtZmMsIDB4YTgsIDB4MWYxZjFmMWYpOworCW52X3dvMzIoZmlmb2NoLT5yYW1mYywgMHhhYywgMHgwMDAwMDAxZik7CisJbnZfd28zMihmaWZvY2gtPnJhbWZjLCAweGI4LCAweGY4MDAwMDAwKTsKKwludl93bzMyKGZpZm9jaC0+cmFtZmMsIDB4ZjgsIDB4MTAwMDMwODApOyAvKiAweDAwMjMxMCAqLworCW52X3dvMzIoZmlmb2NoLT5yYW1mYywgMHhmYywgMHgxMDAwMDAxMCk7IC8qIDB4MDAyMzUwICovCisJcGluc3RtZW0tPmZsdXNoKGRldik7CisKKwludl93cjMyKGRldiwgMHgwMDMwMDAgKyAoY2hhbi0+aWQgKiA4KSwgMHhjMDAwMDAwMCB8CisJCQkJCQkoY2hhbi0+cmFtaW4tPnZpbnN0ID4+IDEyKSk7CisJbnZfd3IzMihkZXYsIDB4MDAzMDA0ICsgKGNoYW4tPmlkICogOCksIDB4MDAxZjAwMDEpOworCW52YzBfZmlmb19wbGF5bGlzdF91cGRhdGUoZGV2KTsKIAlyZXR1cm4gMDsKKworZXJyb3I6CisJcGZpZm8tPmRlc3Ryb3lfY29udGV4dChjaGFuKTsKKwlyZXR1cm4gcmV0OwogfQogCiB2b2lkCiBudmMwX2ZpZm9fZGVzdHJveV9jb250ZXh0KHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4pCiB7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNoYW4tPmRldjsKKwlzdHJ1Y3QgbnZjMF9maWZvX2NoYW4gKmZpZm9jaDsKKworCW52X21hc2soZGV2LCAweDAwMzAwNCArIChjaGFuLT5pZCAqIDgpLCAweDAwMDAwMDAxLCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHgwMDI2MzQsIGNoYW4tPmlkKTsKKwlpZiAoIW52X3dhaXQoZGV2LCAweDAwMDI2MzQsIDB4ZmZmZmZmZmYsIGNoYW4tPmlkKSkKKwkJTlZfV0FSTihkZXYsICIweDI2MzQgIT0gY2hpZDogMHglMDh4XG4iLCBudl9yZDMyKGRldiwgMHgyNjM0KSk7CisKKwludmMwX2ZpZm9fcGxheWxpc3RfdXBkYXRlKGRldik7CisKKwludl93cjMyKGRldiwgMHgwMDMwMDAgKyAoY2hhbi0+aWQgKiA4KSwgMHgwMDAwMDAwMCk7CisKKwlpZiAoY2hhbi0+dXNlcikgeworCQlpb3VubWFwKGNoYW4tPnVzZXIpOworCQljaGFuLT51c2VyID0gTlVMTDsKKwl9CisKKwlmaWZvY2ggPSBjaGFuLT5maWZvX3ByaXY7CisJY2hhbi0+Zmlmb19wcml2ID0gTlVMTDsKKwlpZiAoIWZpZm9jaCkKKwkJcmV0dXJuOworCisJbm91dmVhdV9ncHVvYmpfcmVmKE5VTEwsICZmaWZvY2gtPnJhbWZjKTsKKwlpZiAoZmlmb2NoLT51c2VyKSB7CisJCW5vdXZlYXVfYm9fdW5tYXAoZmlmb2NoLT51c2VyKTsKKwkJbm91dmVhdV9ib191bnBpbihmaWZvY2gtPnVzZXIpOworCQlub3V2ZWF1X2JvX3JlZihOVUxMLCAmZmlmb2NoLT51c2VyKTsKKwl9CisJa2ZyZWUoZmlmb2NoKTsKIH0KIAogaW50CkBAIC03NywxNCArMjQzLDIxMyBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgdm9pZAorbnZjMF9maWZvX2Rlc3Ryb3koc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBub3V2ZWF1X2ZpZm9fZW5naW5lICpwZmlmbyA9ICZkZXZfcHJpdi0+ZW5naW5lLmZpZm87CisJc3RydWN0IG52YzBfZmlmb19wcml2ICpwcml2OworCisJcHJpdiA9IHBmaWZvLT5wcml2OworCWlmICghcHJpdikKKwkJcmV0dXJuOworCisJbm91dmVhdV92bV9wdXQoJnByaXYtPnVzZXJfdm1hKTsKKwlub3V2ZWF1X2dwdW9ial9yZWYoTlVMTCwgJnByaXYtPnBsYXlsaXN0WzFdKTsKKwlub3V2ZWF1X2dwdW9ial9yZWYoTlVMTCwgJnByaXYtPnBsYXlsaXN0WzBdKTsKKwlrZnJlZShwcml2KTsKK30KKwogdm9pZAogbnZjMF9maWZvX3Rha2Vkb3duKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7CisJbnZfd3IzMihkZXYsIDB4MDAyMTQwLCAweDAwMDAwMDAwKTsKKwludmMwX2ZpZm9fZGVzdHJveShkZXYpOworfQorCitzdGF0aWMgaW50CitudmMwX2ZpZm9fY3JlYXRlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3Qgbm91dmVhdV9maWZvX2VuZ2luZSAqcGZpZm8gPSAmZGV2X3ByaXYtPmVuZ2luZS5maWZvOworCXN0cnVjdCBudmMwX2ZpZm9fcHJpdiAqcHJpdjsKKwlpbnQgcmV0OworCisJcHJpdiA9IGt6YWxsb2Moc2l6ZW9mKCpwcml2KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwcml2KQorCQlyZXR1cm4gLUVOT01FTTsKKwlwZmlmby0+cHJpdiA9IHByaXY7CisKKwlyZXQgPSBub3V2ZWF1X2dwdW9ial9uZXcoZGV2LCBOVUxMLCAweDEwMDAsIDB4MTAwMCwgMCwKKwkJCQkgJnByaXYtPnBsYXlsaXN0WzBdKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yOworCisJcmV0ID0gbm91dmVhdV9ncHVvYmpfbmV3KGRldiwgTlVMTCwgMHgxMDAwLCAweDEwMDAsIDAsCisJCQkJICZwcml2LT5wbGF5bGlzdFsxXSk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcjsKKworCXJldCA9IG5vdXZlYXVfdm1fZ2V0KGRldl9wcml2LT5iYXIxX3ZtLCBwZmlmby0+Y2hhbm5lbHMgKiAweDEwMDAsCisJCQkgICAgIDEyLCBOVl9NRU1fQUNDRVNTX1JXLCAmcHJpdi0+dXNlcl92bWEpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3I7CisKKwlub3V2ZWF1X2lycV9yZWdpc3RlcihkZXYsIDgsIG52YzBfZmlmb19pc3IpOworCU5WT0JKX0NMQVNTKGRldiwgMHg1MDZlLCBTVyk7IC8qIG52c3cgKi8KKwlyZXR1cm4gMDsKKworZXJyb3I6CisJbnZjMF9maWZvX2Rlc3Ryb3koZGV2KTsKKwlyZXR1cm4gcmV0OwogfQogCiBpbnQKIG52YzBfZmlmb19pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3Qgbm91dmVhdV9maWZvX2VuZ2luZSAqcGZpZm8gPSAmZGV2X3ByaXYtPmVuZ2luZS5maWZvOworCXN0cnVjdCBudmMwX2ZpZm9fcHJpdiAqcHJpdjsKKwlpbnQgcmV0LCBpOworCisJaWYgKCFwZmlmby0+cHJpdikgeworCQlyZXQgPSBudmMwX2ZpZm9fY3JlYXRlKGRldik7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCX0KKwlwcml2ID0gcGZpZm8tPnByaXY7CisKKwkvKiByZXNldCBQRklGTywgZW5hYmxlIGFsbCBhdmFpbGFibGUgUFNVQkZJRk8gYXJlYXMgKi8KKwludl9tYXNrKGRldiwgMHgwMDAyMDAsIDB4MDAwMDAxMDAsIDB4MDAwMDAwMDApOworCW52X21hc2soZGV2LCAweDAwMDIwMCwgMHgwMDAwMDEwMCwgMHgwMDAwMDEwMCk7CisJbnZfd3IzMihkZXYsIDB4MDAwMjA0LCAweGZmZmZmZmZmKTsKKwludl93cjMyKGRldiwgMHgwMDIyMDQsIDB4ZmZmZmZmZmYpOworCisJcHJpdi0+c3Bvb25fbnIgPSBod2VpZ2h0MzIobnZfcmQzMihkZXYsIDB4MDAyMjA0KSk7CisJTlZfREVCVUcoZGV2LCAiUEZJRk86ICVkIHN1YmZpZm8ocylcbiIsIHByaXYtPnNwb29uX25yKTsKKworCS8qIGFzc2lnbiBlbmdpbmVzIHRvIHN1YmZpZm9zICovCisJaWYgKHByaXYtPnNwb29uX25yID49IDMpIHsKKwkJbnZfd3IzMihkZXYsIDB4MDAyMjA4LCB+KDEgPDwgMCkpOyAvKiBQR1JBUEggKi8KKwkJbnZfd3IzMihkZXYsIDB4MDAyMjBjLCB+KDEgPDwgMSkpOyAvKiBQVlAgKi8KKwkJbnZfd3IzMihkZXYsIDB4MDAyMjEwLCB+KDEgPDwgMSkpOyAvKiBQUFAgKi8KKwkJbnZfd3IzMihkZXYsIDB4MDAyMjE0LCB+KDEgPDwgMSkpOyAvKiBQQlNQICovCisJCW52X3dyMzIoZGV2LCAweDAwMjIxOCwgfigxIDw8IDIpKTsgLyogUENFMCAqLworCQludl93cjMyKGRldiwgMHgwMDIyMWMsIH4oMSA8PCAxKSk7IC8qIFBDRTEgKi8KKwl9CisKKwkvKiBQU1VCRklGT1tuXSAqLworCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKwkJbnZfbWFzayhkZXYsIDB4MDQwMTNjICsgKGkgKiAweDIwMDApLCAweDEwMDAwMTAwLCAweDAwMDAwMDAwKTsKKwkJbnZfd3IzMihkZXYsIDB4MDQwMTA4ICsgKGkgKiAweDIwMDApLCAweGZmZmZmZmZmKTsgLyogSU5UUiAqLworCQludl93cjMyKGRldiwgMHgwNDAxMGMgKyAoaSAqIDB4MjAwMCksIDB4ZmZmZmZlZmYpOyAvKiBJTlRSX0VOICovCisJfQorCisJbnZfbWFzayhkZXYsIDB4MDAyMjAwLCAweDAwMDAwMDAxLCAweDAwMDAwMDAxKTsKKwludl93cjMyKGRldiwgMHgwMDIyNTQsIDB4MTAwMDAwMDAgfCBwcml2LT51c2VyX3ZtYS5vZmZzZXQgPj4gMTIpOworCisJbnZfd3IzMihkZXYsIDB4MDAyYTAwLCAweGZmZmZmZmZmKTsgLyogY2xlYXJzIFBGSUZPLklOVFIgYml0IDMwICovCisJbnZfd3IzMihkZXYsIDB4MDAyMTAwLCAweGZmZmZmZmZmKTsKKwludl93cjMyKGRldiwgMHgwMDIxNDAsIDB4YmZmZmZmZmYpOwogCXJldHVybiAwOwogfQogCitzdHJ1Y3Qgbm91dmVhdV9lbnVtIG52YzBfZmlmb19mYXVsdF91bml0W10gPSB7CisJeyAwLCAiUEdSQVBIIiB9LAorCXsgMywgIlBFRVBIT0xFIiB9LAorCXsgNCwgIkJBUjEiIH0sCisJeyA1LCAiQkFSMyIgfSwKKwl7IDcsICJQRklGTyIgfSwKKwl7fQorfTsKKworc3RydWN0IG5vdXZlYXVfZW51bSBudmMwX2ZpZm9fZmF1bHRfcmVhc29uW10gPSB7CisJeyAwLCAiUFRfTk9UX1BSRVNFTlQiIH0sCisJeyAxLCAiUFRfVE9PX1NIT1JUIiB9LAorCXsgMiwgIlBBR0VfTk9UX1BSRVNFTlQiIH0sCisJeyAzLCAiVk1fTElNSVRfRVhDRUVERUQiIH0sCisJe30KK307CisKK3N0cnVjdCBub3V2ZWF1X2JpdGZpZWxkIG52YzBfZmlmb19zdWJmaWZvX2ludHJbXSA9IHsKKy8qCXsgMHgwMDAwODAwMCwgIiIgfQlzZWVuIHdpdGggbnVsbCBpYiBwdXNoICovCisJeyAweDAwMjAwMDAwLCAiSUxMRUdBTF9NVEhEIiB9LAorCXsgMHgwMDgwMDAwMCwgIkVNUFRZX1NVQkMiIH0sCisJe30KK307CisKK3N0YXRpYyB2b2lkCitudmMwX2ZpZm9faXNyX3ZtX2ZhdWx0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCB1bml0KQoreworCXUzMiBpbnN0ID0gbnZfcmQzMihkZXYsIDB4MjgwMCArICh1bml0ICogMHgxMCkpOworCXUzMiB2YWxvID0gbnZfcmQzMihkZXYsIDB4MjgwNCArICh1bml0ICogMHgxMCkpOworCXUzMiB2YWhpID0gbnZfcmQzMihkZXYsIDB4MjgwOCArICh1bml0ICogMHgxMCkpOworCXUzMiBzdGF0ID0gbnZfcmQzMihkZXYsIDB4MjgwYyArICh1bml0ICogMHgxMCkpOworCisJTlZfSU5GTyhkZXYsICJQRklGTzogJXMgZmF1bHQgYXQgMHglMDEwbGx4IFsiLAorCQkoc3RhdCAmIDB4MDAwMDAwODApID8gIndyaXRlIiA6ICJyZWFkIiwgKHU2NCl2YWhpIDw8IDMyIHwgdmFsbyk7CisJbm91dmVhdV9lbnVtX3ByaW50KG52YzBfZmlmb19mYXVsdF9yZWFzb24sIHN0YXQgJiAweDAwMDAwMDBmKTsKKwlwcmludGsoIl0gZnJvbSAiKTsKKwlub3V2ZWF1X2VudW1fcHJpbnQobnZjMF9maWZvX2ZhdWx0X3VuaXQsIHVuaXQpOworCXByaW50aygiIG9uIGNoYW5uZWwgMHglMDEwbGx4XG4iLCAodTY0KWluc3QgPDwgMTIpOworfQorCitzdGF0aWMgdm9pZAorbnZjMF9maWZvX2lzcl9zdWJmaWZvX2ludHIoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IHVuaXQpCit7CisJdTMyIHN0YXQgPSBudl9yZDMyKGRldiwgMHgwNDAxMDggKyAodW5pdCAqIDB4MjAwMCkpOworCXUzMiBhZGRyID0gbnZfcmQzMihkZXYsIDB4MDQwMGMwICsgKHVuaXQgKiAweDIwMDApKTsKKwl1MzIgZGF0YSA9IG52X3JkMzIoZGV2LCAweDA0MDBjNCArICh1bml0ICogMHgyMDAwKSk7CisJdTMyIGNoaWQgPSBudl9yZDMyKGRldiwgMHgwNDAxMjAgKyAodW5pdCAqIDB4MjAwMCkpICYgMHg3ZjsKKwl1MzIgc3ViYyA9IChhZGRyICYgMHgwMDA3MDAwMCk7CisJdTMyIG10aGQgPSAoYWRkciAmIDB4MDAwMDNmZmMpOworCisJTlZfSU5GTyhkZXYsICJQU1VCRklGTyAlZDoiLCB1bml0KTsKKwlub3V2ZWF1X2JpdGZpZWxkX3ByaW50KG52YzBfZmlmb19zdWJmaWZvX2ludHIsIHN0YXQpOworCU5WX0lORk8oZGV2LCAiUFNVQkZJRk8gJWQ6IGNoICVkIHN1YmMgJWQgbXRoZCAweCUwNHggZGF0YSAweCUwOHhcbiIsCisJCXVuaXQsIGNoaWQsIHN1YmMsIG10aGQsIGRhdGEpOworCisJbnZfd3IzMihkZXYsIDB4MDQwMGMwICsgKHVuaXQgKiAweDIwMDApLCAweDgwNjAwMDA4KTsKKwludl93cjMyKGRldiwgMHgwNDAxMDggKyAodW5pdCAqIDB4MjAwMCksIHN0YXQpOworfQorCitzdGF0aWMgdm9pZAorbnZjMF9maWZvX2lzcihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXUzMiBzdGF0ID0gbnZfcmQzMihkZXYsIDB4MDAyMTAwKTsKKworCWlmIChzdGF0ICYgMHgxMDAwMDAwMCkgeworCQl1MzIgdW5pdHMgPSBudl9yZDMyKGRldiwgMHgwMDI1OWMpOworCQl1MzIgdSA9IHVuaXRzOworCisJCXdoaWxlICh1KSB7CisJCQlpbnQgaSA9IGZmcyh1KSAtIDE7CisJCQludmMwX2ZpZm9faXNyX3ZtX2ZhdWx0KGRldiwgaSk7CisJCQl1ICY9IH4oMSA8PCBpKTsKKwkJfQorCisJCW52X3dyMzIoZGV2LCAweDAwMjU5YywgdW5pdHMpOworCQlzdGF0ICY9IH4weDEwMDAwMDAwOworCX0KKworCWlmIChzdGF0ICYgMHgyMDAwMDAwMCkgeworCQl1MzIgdW5pdHMgPSBudl9yZDMyKGRldiwgMHgwMDI1YTApOworCQl1MzIgdSA9IHVuaXRzOworCisJCXdoaWxlICh1KSB7CisJCQlpbnQgaSA9IGZmcyh1KSAtIDE7CisJCQludmMwX2ZpZm9faXNyX3N1YmZpZm9faW50cihkZXYsIGkpOworCQkJdSAmPSB+KDEgPDwgaSk7CisJCX0KKworCQludl93cjMyKGRldiwgMHgwMDI1YTAsIHVuaXRzKTsKKwkJc3RhdCAmPSB+MHgyMDAwMDAwMDsKKwl9CisKKwlpZiAoc3RhdCkgeworCQlOVl9JTkZPKGRldiwgIlBGSUZPOiB1bmhhbmRsZWQgc3RhdHVzIDB4JTA4eFxuIiwgc3RhdCk7CisJCW52X3dyMzIoZGV2LCAweDAwMjEwMCwgc3RhdCk7CisJfQorCisJbnZfd3IzMihkZXYsIDB4MjE0MCwgMCk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udmMwX2dyYXBoLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udmMwX2dyYXBoLmMKaW5kZXggNzE3YTUxNy4uNWZlYWNkNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnZjMF9ncmFwaC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252YzBfZ3JhcGguYwpAQCAtMjIsOSArMjIsMTYgQEAKICAqIEF1dGhvcnM6IEJlbiBTa2VnZ3MKICAqLwogCisjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KKwogI2luY2x1ZGUgImRybVAuaCIKIAogI2luY2x1ZGUgIm5vdXZlYXVfZHJ2LmgiCisjaW5jbHVkZSAibm91dmVhdV9tbS5oIgorI2luY2x1ZGUgIm52YzBfZ3JhcGguaCIKKworc3RhdGljIHZvaWQgbnZjMF9ncmFwaF9pc3Ioc3RydWN0IGRybV9kZXZpY2UgKik7CitzdGF0aWMgaW50ICBudmMwX2dyYXBoX3VubG9hZF9jb250ZXh0X3RvKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHU2NCBjaGFuKTsKIAogdm9pZAogbnZjMF9ncmFwaF9maWZvX2FjY2VzcyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBib29sIGVuYWJsZWQpCkBAIC0zNywzOSArNDQsNzM1IEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKK3N0YXRpYyBpbnQKK252YzBfZ3JhcGhfY29uc3RydWN0X2NvbnRleHQoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbikKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBjaGFuLT5kZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBudmMwX2dyYXBoX3ByaXYgKnByaXYgPSBkZXZfcHJpdi0+ZW5naW5lLmdyYXBoLnByaXY7CisJc3RydWN0IG52YzBfZ3JhcGhfY2hhbiAqZ3JjaCA9IGNoYW4tPnBncmFwaF9jdHg7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNoYW4tPmRldjsKKwlpbnQgcmV0LCBpOworCXUzMiAqY3R4OworCisJY3R4ID0ga21hbGxvYyhwcml2LT5ncmN0eF9zaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWN0eCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwludmMwX2dyYXBoX2xvYWRfY29udGV4dChjaGFuKTsKKworCW52X3dvMzIoZ3JjaC0+Z3JjdHgsIDB4MWMsIDEpOworCW52X3dvMzIoZ3JjaC0+Z3JjdHgsIDB4MjAsIDApOworCW52X3dvMzIoZ3JjaC0+Z3JjdHgsIDB4MjgsIDApOworCW52X3dvMzIoZ3JjaC0+Z3JjdHgsIDB4MmMsIDApOworCWRldl9wcml2LT5lbmdpbmUuaW5zdG1lbS5mbHVzaChkZXYpOworCisJcmV0ID0gbnZjMF9ncmN0eF9nZW5lcmF0ZShjaGFuKTsKKwlpZiAocmV0KSB7CisJCWtmcmVlKGN0eCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gbnZjMF9ncmFwaF91bmxvYWRfY29udGV4dF90byhkZXYsIGNoYW4tPnJhbWluLT52aW5zdCk7CisJaWYgKHJldCkgeworCQlrZnJlZShjdHgpOworCQlyZXR1cm4gcmV0OworCX0KKworCWZvciAoaSA9IDA7IGkgPCBwcml2LT5ncmN0eF9zaXplOyBpICs9IDQpCisJCWN0eFtpIC8gNF0gPSBudl9ybzMyKGdyY2gtPmdyY3R4LCBpKTsKKworCXByaXYtPmdyY3R4X3ZhbHMgPSBjdHg7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK252YzBfZ3JhcGhfY3JlYXRlX2NvbnRleHRfbW1pb19saXN0KHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4pCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gY2hhbi0+ZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgbnZjMF9ncmFwaF9wcml2ICpwcml2ID0gZGV2X3ByaXYtPmVuZ2luZS5ncmFwaC5wcml2OworCXN0cnVjdCBudmMwX2dyYXBoX2NoYW4gKmdyY2ggPSBjaGFuLT5wZ3JhcGhfY3R4OworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjaGFuLT5kZXY7CisJaW50IGkgPSAwLCBncGMsIHRwLCByZXQ7CisJdTMyIG1hZ2ljOworCisJcmV0ID0gbm91dmVhdV9ncHVvYmpfbmV3KGRldiwgTlVMTCwgMHgyMDAwLCAyNTYsIE5WT0JKX0ZMQUdfVk0sCisJCQkJICZncmNoLT51bms0MDgwMDQpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBub3V2ZWF1X2dwdW9ial9uZXcoZGV2LCBOVUxMLCAweDgwMDAsIDI1NiwgTlZPQkpfRkxBR19WTSwKKwkJCQkgJmdyY2gtPnVuazQwODAwYyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IG5vdXZlYXVfZ3B1b2JqX25ldyhkZXYsIE5VTEwsIDM4NCAqIDEwMjQsIDQwOTYsIE5WT0JKX0ZMQUdfVk0sCisJCQkJICZncmNoLT51bms0MTg4MTApOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBub3V2ZWF1X2dwdW9ial9uZXcoZGV2LCBOVUxMLCAweDEwMDAsIDAsIE5WT0JKX0ZMQUdfVk0sCisJCQkJICZncmNoLT5tbWlvKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisKKwludl93bzMyKGdyY2gtPm1taW8sIGkrKyAqIDQsIDB4MDA0MDgwMDQpOworCW52X3dvMzIoZ3JjaC0+bW1pbywgaSsrICogNCwgZ3JjaC0+dW5rNDA4MDA0LT52aW5zdCA+PiA4KTsKKwludl93bzMyKGdyY2gtPm1taW8sIGkrKyAqIDQsIDB4MDA0MDgwMDgpOworCW52X3dvMzIoZ3JjaC0+bW1pbywgaSsrICogNCwgMHg4MDAwMDAxOCk7CisKKwludl93bzMyKGdyY2gtPm1taW8sIGkrKyAqIDQsIDB4MDA0MDgwMGMpOworCW52X3dvMzIoZ3JjaC0+bW1pbywgaSsrICogNCwgZ3JjaC0+dW5rNDA4MDBjLT52aW5zdCA+PiA4KTsKKwludl93bzMyKGdyY2gtPm1taW8sIGkrKyAqIDQsIDB4MDA0MDgwMTApOworCW52X3dvMzIoZ3JjaC0+bW1pbywgaSsrICogNCwgMHg4MDAwMDAwMCk7CisKKwludl93bzMyKGdyY2gtPm1taW8sIGkrKyAqIDQsIDB4MDA0MTg4MTApOworCW52X3dvMzIoZ3JjaC0+bW1pbywgaSsrICogNCwgMHg4MDAwMDAwMCB8IGdyY2gtPnVuazQxODgxMC0+dmluc3QgPj4gMTIpOworCW52X3dvMzIoZ3JjaC0+bW1pbywgaSsrICogNCwgMHgwMDQxOTg0OCk7CisJbnZfd28zMihncmNoLT5tbWlvLCBpKysgKiA0LCAweDEwMDAwMDAwIHwgZ3JjaC0+dW5rNDE4ODEwLT52aW5zdCA+PiAxMik7CisKKwludl93bzMyKGdyY2gtPm1taW8sIGkrKyAqIDQsIDB4MDA0MTkwMDQpOworCW52X3dvMzIoZ3JjaC0+bW1pbywgaSsrICogNCwgZ3JjaC0+dW5rNDA4MDBjLT52aW5zdCA+PiA4KTsKKwludl93bzMyKGdyY2gtPm1taW8sIGkrKyAqIDQsIDB4MDA0MTkwMDgpOworCW52X3dvMzIoZ3JjaC0+bW1pbywgaSsrICogNCwgMHgwMDAwMDAwMCk7CisKKwludl93bzMyKGdyY2gtPm1taW8sIGkrKyAqIDQsIDB4MDA0MTg4MDgpOworCW52X3dvMzIoZ3JjaC0+bW1pbywgaSsrICogNCwgZ3JjaC0+dW5rNDA4MDA0LT52aW5zdCA+PiA4KTsKKwludl93bzMyKGdyY2gtPm1taW8sIGkrKyAqIDQsIDB4MDA0MTg4MGMpOworCW52X3dvMzIoZ3JjaC0+bW1pbywgaSsrICogNCwgMHg4MDAwMDAxOCk7CisKKwltYWdpYyA9IDB4MDIxODAwMDA7CisJbnZfd28zMihncmNoLT5tbWlvLCBpKysgKiA0LCAweDAwNDA1ODMwKTsKKwludl93bzMyKGdyY2gtPm1taW8sIGkrKyAqIDQsIG1hZ2ljKTsKKwlmb3IgKGdwYyA9IDA7IGdwYyA8IHByaXYtPmdwY19ucjsgZ3BjKyspIHsKKwkJZm9yICh0cCA9IDA7IHRwIDwgcHJpdi0+dHBfbnJbZ3BjXTsgdHArKywgbWFnaWMgKz0gMHgwMmZjKSB7CisJCQl1MzIgcmVnID0gMHg1MDQ1MjAgKyAoZ3BjICogMHg4MDAwKSArICh0cCAqIDB4MDgwMCk7CisJCQludl93bzMyKGdyY2gtPm1taW8sIGkrKyAqIDQsIHJlZyk7CisJCQludl93bzMyKGdyY2gtPm1taW8sIGkrKyAqIDQsIG1hZ2ljKTsKKwkJfQorCX0KKworCWdyY2gtPm1taW9fbnIgPSBpIC8gMjsKKwlyZXR1cm4gMDsKK30KKwogaW50CiBudmMwX2dyYXBoX2NyZWF0ZV9jb250ZXh0KHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW4pCiB7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gY2hhbi0+ZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3Qgbm91dmVhdV9pbnN0bWVtX2VuZ2luZSAqcGluc3RtZW0gPSAmZGV2X3ByaXYtPmVuZ2luZS5pbnN0bWVtOworCXN0cnVjdCBub3V2ZWF1X3BncmFwaF9lbmdpbmUgKnBncmFwaCA9ICZkZXZfcHJpdi0+ZW5naW5lLmdyYXBoOworCXN0cnVjdCBudmMwX2dyYXBoX3ByaXYgKnByaXYgPSBwZ3JhcGgtPnByaXY7CisJc3RydWN0IG52YzBfZ3JhcGhfY2hhbiAqZ3JjaDsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY2hhbi0+ZGV2OworCXN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqZ3JjdHg7CisJaW50IHJldCwgaTsKKworCWNoYW4tPnBncmFwaF9jdHggPSBremFsbG9jKHNpemVvZigqZ3JjaCksIEdGUF9LRVJORUwpOworCWlmICghY2hhbi0+cGdyYXBoX2N0eCkKKwkJcmV0dXJuIC1FTk9NRU07CisJZ3JjaCA9IGNoYW4tPnBncmFwaF9jdHg7CisKKwlyZXQgPSBub3V2ZWF1X2dwdW9ial9uZXcoZGV2LCBOVUxMLCBwcml2LT5ncmN0eF9zaXplLCAyNTYsCisJCQkJIE5WT0JKX0ZMQUdfVk0gfCBOVk9CSl9GTEFHX1pFUk9fQUxMT0MsCisJCQkJICZncmNoLT5ncmN0eCk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcjsKKwljaGFuLT5yYW1pbl9ncmN0eCA9IGdyY2gtPmdyY3R4OworCWdyY3R4ID0gZ3JjaC0+Z3JjdHg7CisKKwlyZXQgPSBudmMwX2dyYXBoX2NyZWF0ZV9jb250ZXh0X21taW9fbGlzdChjaGFuKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yOworCisJbnZfd28zMihjaGFuLT5yYW1pbiwgMHgwMjEwLCBsb3dlcl8zMl9iaXRzKGdyY3R4LT52aW5zdCkgfCA0KTsKKwludl93bzMyKGNoYW4tPnJhbWluLCAweDAyMTQsIHVwcGVyXzMyX2JpdHMoZ3JjdHgtPnZpbnN0KSk7CisJcGluc3RtZW0tPmZsdXNoKGRldik7CisKKwlpZiAoIXByaXYtPmdyY3R4X3ZhbHMpIHsKKwkJcmV0ID0gbnZjMF9ncmFwaF9jb25zdHJ1Y3RfY29udGV4dChjaGFuKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJyb3I7CisJfQorCisJZm9yIChpID0gMDsgaSA8IHByaXYtPmdyY3R4X3NpemU7IGkgKz0gNCkKKwkJbnZfd28zMihncmN0eCwgaSwgcHJpdi0+Z3JjdHhfdmFsc1tpIC8gNF0pOworCisgICAgICAgIG52X3dvMzIoZ3JjdHgsIDB4ZjQsIDApOworICAgICAgICBudl93bzMyKGdyY3R4LCAweGY4LCAwKTsKKyAgICAgICAgbnZfd28zMihncmN0eCwgMHgxMCwgZ3JjaC0+bW1pb19ucik7CisgICAgICAgIG52X3dvMzIoZ3JjdHgsIDB4MTQsIGxvd2VyXzMyX2JpdHMoZ3JjaC0+bW1pby0+dmluc3QpKTsKKyAgICAgICAgbnZfd28zMihncmN0eCwgMHgxOCwgdXBwZXJfMzJfYml0cyhncmNoLT5tbWlvLT52aW5zdCkpOworICAgICAgICBudl93bzMyKGdyY3R4LCAweDFjLCAxKTsKKyAgICAgICAgbnZfd28zMihncmN0eCwgMHgyMCwgMCk7CisgICAgICAgIG52X3dvMzIoZ3JjdHgsIDB4MjgsIDApOworICAgICAgICBudl93bzMyKGdyY3R4LCAweDJjLCAwKTsKKwlwaW5zdG1lbS0+Zmx1c2goZGV2KTsKIAlyZXR1cm4gMDsKKworZXJyb3I6CisJcGdyYXBoLT5kZXN0cm95X2NvbnRleHQoY2hhbik7CisJcmV0dXJuIHJldDsKIH0KIAogdm9pZAogbnZjMF9ncmFwaF9kZXN0cm95X2NvbnRleHQoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbikKIHsKKwlzdHJ1Y3QgbnZjMF9ncmFwaF9jaGFuICpncmNoOworCisJZ3JjaCA9IGNoYW4tPnBncmFwaF9jdHg7CisJY2hhbi0+cGdyYXBoX2N0eCA9IE5VTEw7CisJaWYgKCFncmNoKQorCQlyZXR1cm47CisKKwlub3V2ZWF1X2dwdW9ial9yZWYoTlVMTCwgJmdyY2gtPm1taW8pOworCW5vdXZlYXVfZ3B1b2JqX3JlZihOVUxMLCAmZ3JjaC0+dW5rNDE4ODEwKTsKKwlub3V2ZWF1X2dwdW9ial9yZWYoTlVMTCwgJmdyY2gtPnVuazQwODAwYyk7CisJbm91dmVhdV9ncHVvYmpfcmVmKE5VTEwsICZncmNoLT51bms0MDgwMDQpOworCW5vdXZlYXVfZ3B1b2JqX3JlZihOVUxMLCAmZ3JjaC0+Z3JjdHgpOworCWNoYW4tPnJhbWluX2dyY3R4ID0gTlVMTDsKIH0KIAogaW50CiBudmMwX2dyYXBoX2xvYWRfY29udGV4dChzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpjaGFuKQogeworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjaGFuLT5kZXY7CisKKwludl93cjMyKGRldiwgMHg0MDk4NDAsIDB4MDAwMDAwMzApOworCW52X3dyMzIoZGV2LCAweDQwOTUwMCwgMHg4MDAwMDAwMCB8IGNoYW4tPnJhbWluLT52aW5zdCA+PiAxMik7CisJbnZfd3IzMihkZXYsIDB4NDA5NTA0LCAweDAwMDAwMDAzKTsKKwlpZiAoIW52X3dhaXQoZGV2LCAweDQwOTgwMCwgMHgwMDAwMDAxMCwgMHgwMDAwMDAxMCkpCisJCU5WX0VSUk9SKGRldiwgIlBHUkFQSDogbG9hZF9jdHggdGltZW91dFxuIik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorbnZjMF9ncmFwaF91bmxvYWRfY29udGV4dF90byhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1NjQgY2hhbikKK3sKKwludl93cjMyKGRldiwgMHg0MDk4NDAsIDB4MDAwMDAwMDMpOworCW52X3dyMzIoZGV2LCAweDQwOTUwMCwgMHg4MDAwMDAwMCB8IGNoYW4gPj4gMTIpOworCW52X3dyMzIoZGV2LCAweDQwOTUwNCwgMHgwMDAwMDAwOSk7CisJaWYgKCFudl93YWl0KGRldiwgMHg0MDk4MDAsIDB4MDAwMDAwMDEsIDB4MDAwMDAwMDApKSB7CisJCU5WX0VSUk9SKGRldiwgIlBHUkFQSDogdW5sb2FkX2N0eCB0aW1lb3V0XG4iKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKIAlyZXR1cm4gMDsKIH0KIAogaW50CiBudmMwX2dyYXBoX3VubG9hZF9jb250ZXh0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7Ci0JcmV0dXJuIDA7CisJdTY0IGluc3QgPSAodTY0KShudl9yZDMyKGRldiwgMHg0MDliMDApICYgMHgwZmZmZmZmZikgPDwgMTI7CisJcmV0dXJuIG52YzBfZ3JhcGhfdW5sb2FkX2NvbnRleHRfdG8oZGV2LCBpbnN0KTsKK30KKworc3RhdGljIHZvaWQKK252YzBfZ3JhcGhfZGVzdHJveShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG5vdXZlYXVfcGdyYXBoX2VuZ2luZSAqcGdyYXBoID0gJmRldl9wcml2LT5lbmdpbmUuZ3JhcGg7CisJc3RydWN0IG52YzBfZ3JhcGhfcHJpdiAqcHJpdjsKKworCXByaXYgPSBwZ3JhcGgtPnByaXY7CisJaWYgKCFwcml2KQorCQlyZXR1cm47CisKKwlub3V2ZWF1X2lycV91bnJlZ2lzdGVyKGRldiwgMTIpOworCisJbm91dmVhdV9ncHVvYmpfcmVmKE5VTEwsICZwcml2LT51bms0MTg4YjgpOworCW5vdXZlYXVfZ3B1b2JqX3JlZihOVUxMLCAmcHJpdi0+dW5rNDE4OGI0KTsKKworCWlmIChwcml2LT5ncmN0eF92YWxzKQorCQlrZnJlZShwcml2LT5ncmN0eF92YWxzKTsKKwlrZnJlZShwcml2KTsKIH0KIAogdm9pZAogbnZjMF9ncmFwaF90YWtlZG93bihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogeworCW52YzBfZ3JhcGhfZGVzdHJveShkZXYpOworfQorCitzdGF0aWMgaW50CitudmMwX2dyYXBoX2NyZWF0ZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG5vdXZlYXVfcGdyYXBoX2VuZ2luZSAqcGdyYXBoID0gJmRldl9wcml2LT5lbmdpbmUuZ3JhcGg7CisJc3RydWN0IG52YzBfZ3JhcGhfcHJpdiAqcHJpdjsKKwlpbnQgcmV0LCBncGMsIGk7CisKKwlwcml2ID0ga3phbGxvYyhzaXplb2YoKnByaXYpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXByaXYpCisJCXJldHVybiAtRU5PTUVNOworCXBncmFwaC0+cHJpdiA9IHByaXY7CisKKwlyZXQgPSBub3V2ZWF1X2dwdW9ial9uZXcoZGV2LCBOVUxMLCAweDEwMDAsIDI1NiwgMCwgJnByaXYtPnVuazQxODhiNCk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcjsKKworCXJldCA9IG5vdXZlYXVfZ3B1b2JqX25ldyhkZXYsIE5VTEwsIDB4MTAwMCwgMjU2LCAwLCAmcHJpdi0+dW5rNDE4OGI4KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yOworCisJZm9yIChpID0gMDsgaSA8IDB4MTAwMDsgaSArPSA0KSB7CisJCW52X3dvMzIocHJpdi0+dW5rNDE4OGI0LCBpLCAweDAwMDAwMDEwKTsKKwkJbnZfd28zMihwcml2LT51bms0MTg4YjgsIGksIDB4MDAwMDAwMTApOworCX0KKworCXByaXYtPmdwY19uciAgPSAgbnZfcmQzMihkZXYsIDB4NDA5NjA0KSAmIDB4MDAwMDAwMWY7CisJcHJpdi0+cm9wX25yID0gKG52X3JkMzIoZGV2LCAweDQwOTYwNCkgJiAweDAwMWYwMDAwKSA+PiAxNjsKKwlmb3IgKGdwYyA9IDA7IGdwYyA8IHByaXYtPmdwY19ucjsgZ3BjKyspIHsKKwkJcHJpdi0+dHBfbnJbZ3BjXSA9IG52X3JkMzIoZGV2LCBHUENfVU5JVChncGMsIDB4MjYwOCkpOworCQlwcml2LT50cF90b3RhbCArPSBwcml2LT50cF9ucltncGNdOworCX0KKworCS8qWFhYOiB0aGVzZSBuZWVkIGZpZ3VyaW5nIG91dC4uLiAqLworCXN3aXRjaCAoZGV2X3ByaXYtPmNoaXBzZXQpIHsKKwljYXNlIDB4YzA6CisJCWlmIChwcml2LT50cF90b3RhbCA9PSAxMSkgeyAvKiA0NjUsIDMvNC80LzAsIDQgKi8KKwkJCXByaXYtPm1hZ2ljX25vdF9yb3BfbnIgPSAweDA3OworCQkJLyogZmlsbGVkIHZhbHVlcyB1cCB0byB0cF90b3RhbCwgdGhlIHJlc3QgMCAqLworCQkJcHJpdi0+bWFnaWNncGM5ODBbMF0gICA9IDB4MjIxMTEwMDA7CisJCQlwcml2LT5tYWdpY2dwYzk4MFsxXSAgID0gMHgwMDAwMDIzMzsKKwkJCXByaXYtPm1hZ2ljZ3BjOTgwWzJdICAgPSAweDAwMDAwMDAwOworCQkJcHJpdi0+bWFnaWNncGM5ODBbM10gICA9IDB4MDAwMDAwMDA7CisJCQlwcml2LT5tYWdpY2dwYzkxOCAgICAgID0gMHgwMDBiYTJlOTsKKwkJfSBlbHNlCisJCWlmIChwcml2LT50cF90b3RhbCA9PSAxNCkgeyAvKiA0NzAsIDMvMy80LzQsIDUgKi8KKwkJCXByaXYtPm1hZ2ljX25vdF9yb3BfbnIgPSAweDA1OworCQkJcHJpdi0+bWFnaWNncGM5ODBbMF0gICA9IDB4MTExMTAwMDA7CisJCQlwcml2LT5tYWdpY2dwYzk4MFsxXSAgID0gMHgwMDIzMzIyMjsKKwkJCXByaXYtPm1hZ2ljZ3BjOTgwWzJdICAgPSAweDAwMDAwMDAwOworCQkJcHJpdi0+bWFnaWNncGM5ODBbM10gICA9IDB4MDAwMDAwMDA7CisJCQlwcml2LT5tYWdpY2dwYzkxOCAgICAgID0gMHgwMDA5MjQ5MzsKKwkJfSBlbHNlCisJCWlmIChwcml2LT50cF90b3RhbCA9PSAxNSkgeyAvKiA0ODAsIDMvNC80LzQsIDYgKi8KKwkJCXByaXYtPm1hZ2ljX25vdF9yb3BfbnIgPSAweDA2OworCQkJcHJpdi0+bWFnaWNncGM5ODBbMF0gICA9IDB4MTExMTAwMDA7CisJCQlwcml2LT5tYWdpY2dwYzk4MFsxXSAgID0gMHgwMzMzMjIyMjsKKwkJCXByaXYtPm1hZ2ljZ3BjOTgwWzJdICAgPSAweDAwMDAwMDAwOworCQkJcHJpdi0+bWFnaWNncGM5ODBbM10gICA9IDB4MDAwMDAwMDA7CisJCQlwcml2LT5tYWdpY2dwYzkxOCAgICAgID0gMHgwMDA4ODg4OTsKKwkJfQorCQlicmVhazsKKwljYXNlIDB4YzM6IC8qIDQ1MCwgNC8wLzAvMCwgMiAqLworCQlwcml2LT5tYWdpY19ub3Rfcm9wX25yID0gMHgwMzsKKwkJcHJpdi0+bWFnaWNncGM5ODBbMF0gICA9IDB4MDAwMDMyMTA7CisJCXByaXYtPm1hZ2ljZ3BjOTgwWzFdICAgPSAweDAwMDAwMDAwOworCQlwcml2LT5tYWdpY2dwYzk4MFsyXSAgID0gMHgwMDAwMDAwMDsKKwkJcHJpdi0+bWFnaWNncGM5ODBbM10gICA9IDB4MDAwMDAwMDA7CisJCXByaXYtPm1hZ2ljZ3BjOTE4ICAgICAgPSAweDAwMjAwMDAwOworCQlicmVhazsKKwljYXNlIDB4YzQ6IC8qIDQ2MCwgMy80LzAvMCwgNCAqLworCQlwcml2LT5tYWdpY19ub3Rfcm9wX25yID0gMHgwMTsKKwkJcHJpdi0+bWFnaWNncGM5ODBbMF0gICA9IDB4MDIzMjExMDA7CisJCXByaXYtPm1hZ2ljZ3BjOTgwWzFdICAgPSAweDAwMDAwMDAwOworCQlwcml2LT5tYWdpY2dwYzk4MFsyXSAgID0gMHgwMDAwMDAwMDsKKwkJcHJpdi0+bWFnaWNncGM5ODBbM10gICA9IDB4MDAwMDAwMDA7CisJCXByaXYtPm1hZ2ljZ3BjOTE4ICAgICAgPSAweDAwMTI0OTI1OworCQlicmVhazsKKwl9CisKKwlpZiAoIXByaXYtPm1hZ2ljX25vdF9yb3BfbnIpIHsKKwkJTlZfRVJST1IoZGV2LCAiUEdSQVBIOiB1bmtub3duIGNvbmZpZzogJWQvJWQvJWQvJWQsICVkXG4iLAorCQkJIHByaXYtPnRwX25yWzBdLCBwcml2LT50cF9uclsxXSwgcHJpdi0+dHBfbnJbMl0sCisJCQkgcHJpdi0+dHBfbnJbM10sIHByaXYtPnJvcF9ucik7CisJCS8qIHVzZSAweGMzJ3MgdmFsdWVzLi4uICovCisJCXByaXYtPm1hZ2ljX25vdF9yb3BfbnIgPSAweDAzOworCQlwcml2LT5tYWdpY2dwYzk4MFswXSAgID0gMHgwMDAwMzIxMDsKKwkJcHJpdi0+bWFnaWNncGM5ODBbMV0gICA9IDB4MDAwMDAwMDA7CisJCXByaXYtPm1hZ2ljZ3BjOTgwWzJdICAgPSAweDAwMDAwMDAwOworCQlwcml2LT5tYWdpY2dwYzk4MFszXSAgID0gMHgwMDAwMDAwMDsKKwkJcHJpdi0+bWFnaWNncGM5MTggICAgICA9IDB4MDAyMDAwMDA7CisJfQorCisJbm91dmVhdV9pcnFfcmVnaXN0ZXIoZGV2LCAxMiwgbnZjMF9ncmFwaF9pc3IpOworCU5WT0JKX0NMQVNTKGRldiwgMHg5MDJkLCBHUik7IC8qIDJEICovCisJTlZPQkpfQ0xBU1MoZGV2LCAweDkwMzksIEdSKTsgLyogTTJNRiAqLworCU5WT0JKX0NMQVNTKGRldiwgMHg5MDk3LCBHUik7IC8qIDNEICovCisJTlZPQkpfQ0xBU1MoZGV2LCAweDkwYzAsIEdSKTsgLyogQ09NUFVURSAqLworCXJldHVybiAwOworCitlcnJvcjoKKwludmMwX2dyYXBoX2Rlc3Ryb3koZGV2KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZAorbnZjMF9ncmFwaF9pbml0X29iajQxODg4MChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG5vdXZlYXVfcGdyYXBoX2VuZ2luZSAqcGdyYXBoID0gJmRldl9wcml2LT5lbmdpbmUuZ3JhcGg7CisJc3RydWN0IG52YzBfZ3JhcGhfcHJpdiAqcHJpdiA9IHBncmFwaC0+cHJpdjsKKwlpbnQgaTsKKworCW52X3dyMzIoZGV2LCBHUENfQkNBU1QoMHgwODgwKSwgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIEdQQ19CQ0FTVCgweDA4YTQpLCAweDAwMDAwMDAwKTsKKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorCQludl93cjMyKGRldiwgR1BDX0JDQVNUKDB4MDg4OCkgKyAoaSAqIDQpLCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgR1BDX0JDQVNUKDB4MDhiNCksIHByaXYtPnVuazQxODhiNC0+dmluc3QgPj4gOCk7CisJbnZfd3IzMihkZXYsIEdQQ19CQ0FTVCgweDA4YjgpLCBwcml2LT51bms0MTg4YjgtPnZpbnN0ID4+IDgpOworfQorCitzdGF0aWMgdm9pZAorbnZjMF9ncmFwaF9pbml0X3JlZ3Moc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwludl93cjMyKGRldiwgMHg0MDAwODAsIDB4MDAzMDgzYzIpOworCW52X3dyMzIoZGV2LCAweDQwMDA4OCwgMHgwMDAwNmZlNyk7CisJbnZfd3IzMihkZXYsIDB4NDAwMDhjLCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MDAwOTAsIDB4MDAwMDAwMzApOworCW52X3dyMzIoZGV2LCAweDQwMDEzYywgMHgwMTM5MDFmNyk7CisJbnZfd3IzMihkZXYsIDB4NDAwMTQwLCAweDAwMDAwMTAwKTsKKwludl93cjMyKGRldiwgMHg0MDAxNDQsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQwMDE0OCwgMHgwMDAwMDExMCk7CisJbnZfd3IzMihkZXYsIDB4NDAwMTM4LCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MDAxMzAsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQwMDEzNCwgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDAwMTI0LCAweDAwMDAwMDAyKTsKK30KKworc3RhdGljIHZvaWQKK252YzBfZ3JhcGhfaW5pdF9ncGNfMChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG52YzBfZ3JhcGhfcHJpdiAqcHJpdiA9IGRldl9wcml2LT5lbmdpbmUuZ3JhcGgucHJpdjsKKwlpbnQgZ3BjOworCQorCS8vICAgICAgVFAgICAgICBST1AgVU5LVkFMKG1hZ2ljX25vdF9yb3BfbnIpCisJLy8gNDUwOiA0LzAvMC8wIDIgICAgICAgIDMKKwkvLyA0NjA6IDMvNC8wLzAgNCAgICAgICAgMQorCS8vIDQ2NTogMy80LzQvMCA0ICAgICAgICA3CisJLy8gNDcwOiAzLzMvNC80IDUgICAgICAgIDUKKwkvLyA0ODA6IDMvNC80LzQgNiAgICAgICAgNgorCisJLy8gbWFnaWNncGM5MTgKKwkvLyA0NTA6IDAwMjAwMDAwIDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwCisJLy8gNDYwOiAwMDEyNDkyNSAwMDAwMDAwMDAwMDEwMDEwMDEwMDEwMDEwMDEwMDEwMQorCS8vIDQ2NTogMDAwYmEyZTkgMDAwMDAwMDAwMDAwMTAxMTEwMTAwMDEwMTExMDEwMDEKKwkvLyA0NzA6IDAwMDkyNDkzIDAwMDAwMDAwMDAwMDEwMDEwMDEwMDEwMDEwMDEwMDExCisJLy8gNDgwOiAwMDA4ODg4OSAwMDAwMDAwMDAwMDAxMDAwMTAwMDEwMDAxMDAwMTAwMQorCisJLyogZmlsbGVkIHZhbHVlcyB1cCB0byB0cF90b3RhbCwgcmVtYWluZGVyIDAgKi8KKwkvLyA0NTA6IDAwMDAzMjEwIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwCisJLy8gNDYwOiAwMjMyMTEwMCAwMDAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMAorCS8vIDQ2NTogMjIxMTEwMDAgMDAwMDAyMzMgMDAwMDAwMDAgMDAwMDAwMDAKKwkvLyA0NzA6IDExMTEwMDAwIDAwMjMzMjIyIDAwMDAwMDAwIDAwMDAwMDAwCisJLy8gNDgwOiAxMTExMDAwMCAwMzMzMjIyMiAwMDAwMDAwMCAwMDAwMDAwMAorCQorCW52X3dyMzIoZGV2LCBHUENfQkNBU1QoMHgwOTgwKSwgcHJpdi0+bWFnaWNncGM5ODBbMF0pOworCW52X3dyMzIoZGV2LCBHUENfQkNBU1QoMHgwOTg0KSwgcHJpdi0+bWFnaWNncGM5ODBbMV0pOworCW52X3dyMzIoZGV2LCBHUENfQkNBU1QoMHgwOTg4KSwgcHJpdi0+bWFnaWNncGM5ODBbMl0pOworCW52X3dyMzIoZGV2LCBHUENfQkNBU1QoMHgwOThjKSwgcHJpdi0+bWFnaWNncGM5ODBbM10pOworCisJZm9yIChncGMgPSAwOyBncGMgPCBwcml2LT5ncGNfbnI7IGdwYysrKSB7CisJCW52X3dyMzIoZGV2LCBHUENfVU5JVChncGMsIDB4MDkxNCksIHByaXYtPm1hZ2ljX25vdF9yb3BfbnIgPDwgOCB8CisJCQkJCQkgIHByaXYtPnRwX25yW2dwY10pOworCQludl93cjMyKGRldiwgR1BDX1VOSVQoZ3BjLCAweDA5MTApLCAweDAwMDQwMDAwIHwgcHJpdi0+dHBfdG90YWwpOworCQludl93cjMyKGRldiwgR1BDX1VOSVQoZ3BjLCAweDA5MTgpLCBwcml2LT5tYWdpY2dwYzkxOCk7CisJfQorCisJbnZfd3IzMihkZXYsIEdQQ19CQ0FTVCgweDFiZDQpLCBwcml2LT5tYWdpY2dwYzkxOCk7CisJbnZfd3IzMihkZXYsIEdQQ19CQ0FTVCgweDA4YWMpLCBwcml2LT5yb3BfbnIpOworfQorCitzdGF0aWMgdm9pZAorbnZjMF9ncmFwaF9pbml0X3VuaXRzKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJbnZfd3IzMihkZXYsIDB4NDA5YzI0LCAweDAwMGYwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MDQwMDAsIDB4YzAwMDAwMDApOyAvKiBESVNQQVRDSCAqLworCW52X3dyMzIoZGV2LCAweDQwNDYwMCwgMHhjMDAwMDAwMCk7IC8qIE0yTUYgKi8KKwludl93cjMyKGRldiwgMHg0MDgwMzAsIDB4YzAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQwNjAxYywgMHhjMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDA0NDkwLCAweGMwMDAwMDAwKTsgLyogTUFDUk8gKi8KKwludl93cjMyKGRldiwgMHg0MDYwMTgsIDB4YzAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQwNTg0MCwgMHhjMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDA1ODQ0LCAweDAwZmZmZmZmKTsKKwludl9tYXNrKGRldiwgMHg0MTljYzAsIDB4MDAwMDAwMDgsIDB4MDAwMDAwMDgpOworCW52X21hc2soZGV2LCAweDQxOWViNCwgMHgwMDAwMTAwMCwgMHgwMDAwMTAwMCk7Cit9CisKK3N0YXRpYyB2b2lkCitudmMwX2dyYXBoX2luaXRfZ3BjXzEoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBudmMwX2dyYXBoX3ByaXYgKnByaXYgPSBkZXZfcHJpdi0+ZW5naW5lLmdyYXBoLnByaXY7CisJaW50IGdwYywgdHA7CisKKwlmb3IgKGdwYyA9IDA7IGdwYyA8IHByaXYtPmdwY19ucjsgZ3BjKyspIHsKKwkJbnZfd3IzMihkZXYsIEdQQ19VTklUKGdwYywgMHgwNDIwKSwgMHhjMDAwMDAwMCk7CisJCW52X3dyMzIoZGV2LCBHUENfVU5JVChncGMsIDB4MDkwMCksIDB4YzAwMDAwMDApOworCQludl93cjMyKGRldiwgR1BDX1VOSVQoZ3BjLCAweDEwMjgpLCAweGMwMDAwMDAwKTsKKwkJbnZfd3IzMihkZXYsIEdQQ19VTklUKGdwYywgMHgwODI0KSwgMHhjMDAwMDAwMCk7CisJCWZvciAodHAgPSAwOyB0cCA8IHByaXYtPnRwX25yW2dwY107IHRwKyspIHsKKwkJCW52X3dyMzIoZGV2LCBUUF9VTklUKGdwYywgdHAsIDB4NTA4KSwgMHhmZmZmZmZmZik7CisJCQludl93cjMyKGRldiwgVFBfVU5JVChncGMsIHRwLCAweDUwYyksIDB4ZmZmZmZmZmYpOworCQkJbnZfd3IzMihkZXYsIFRQX1VOSVQoZ3BjLCB0cCwgMHgyMjQpLCAweGMwMDAwMDAwKTsKKwkJCW52X3dyMzIoZGV2LCBUUF9VTklUKGdwYywgdHAsIDB4NDhjKSwgMHhjMDAwMDAwMCk7CisJCQludl93cjMyKGRldiwgVFBfVU5JVChncGMsIHRwLCAweDA4NCksIDB4YzAwMDAwMDApOworCQkJbnZfd3IzMihkZXYsIFRQX1VOSVQoZ3BjLCB0cCwgMHhlNDQpLCAweDAwMWZmZmZlKTsKKwkJCW52X3dyMzIoZGV2LCBUUF9VTklUKGdwYywgdHAsIDB4ZTRjKSwgMHgwMDAwMDAwZik7CisJCX0KKwkJbnZfd3IzMihkZXYsIEdQQ19VTklUKGdwYywgMHgyYzkwKSwgMHhmZmZmZmZmZik7CisJCW52X3dyMzIoZGV2LCBHUENfVU5JVChncGMsIDB4MmM5NCksIDB4ZmZmZmZmZmYpOworCX0KK30KKworc3RhdGljIHZvaWQKK252YzBfZ3JhcGhfaW5pdF9yb3Aoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBudmMwX2dyYXBoX3ByaXYgKnByaXYgPSBkZXZfcHJpdi0+ZW5naW5lLmdyYXBoLnByaXY7CisJaW50IHJvcDsKKworCWZvciAocm9wID0gMDsgcm9wIDwgcHJpdi0+cm9wX25yOyByb3ArKykgeworCQludl93cjMyKGRldiwgUk9QX1VOSVQocm9wLCAweDE0NCksIDB4YzAwMDAwMDApOworCQludl93cjMyKGRldiwgUk9QX1VOSVQocm9wLCAweDA3MCksIDB4YzAwMDAwMDApOworCQludl93cjMyKGRldiwgUk9QX1VOSVQocm9wLCAweDIwNCksIDB4ZmZmZmZmZmYpOworCQludl93cjMyKGRldiwgUk9QX1VOSVQocm9wLCAweDIwOCksIDB4ZmZmZmZmZmYpOworCX0KK30KKworc3RhdGljIGludAorbnZjMF9mdWNfbG9hZF9mdyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1MzIgZnVjX2Jhc2UsCisJCSBjb25zdCBjaGFyICpjb2RlX2Z3LCBjb25zdCBjaGFyICpkYXRhX2Z3KQoreworCWNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZnc7CisJY2hhciBuYW1lWzMyXTsKKwlpbnQgcmV0LCBpOworCisJc25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLCAibm91dmVhdS8lcyIsIGRhdGFfZncpOworCXJldCA9IHJlcXVlc3RfZmlybXdhcmUoJmZ3LCBuYW1lLCAmZGV2LT5wZGV2LT5kZXYpOworCWlmIChyZXQpIHsKKwkJTlZfRVJST1IoZGV2LCAiZmFpbGVkIHRvIGxvYWQgJXNcbiIsIGRhdGFfZncpOworCQlyZXR1cm4gcmV0OworCX0KKworCW52X3dyMzIoZGV2LCBmdWNfYmFzZSArIDB4MDFjMCwgMHgwMTAwMDAwMCk7CisJZm9yIChpID0gMDsgaSA8IGZ3LT5zaXplIC8gNDsgaSsrKQorCQludl93cjMyKGRldiwgZnVjX2Jhc2UgKyAweDAxYzQsICgodTMyICopZnctPmRhdGEpW2ldKTsKKwlyZWxlYXNlX2Zpcm13YXJlKGZ3KTsKKworCXNucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwgIm5vdXZlYXUvJXMiLCBjb2RlX2Z3KTsKKwlyZXQgPSByZXF1ZXN0X2Zpcm13YXJlKCZmdywgbmFtZSwgJmRldi0+cGRldi0+ZGV2KTsKKwlpZiAocmV0KSB7CisJCU5WX0VSUk9SKGRldiwgImZhaWxlZCB0byBsb2FkICVzXG4iLCBjb2RlX2Z3KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwludl93cjMyKGRldiwgZnVjX2Jhc2UgKyAweDAxODAsIDB4MDEwMDAwMDApOworCWZvciAoaSA9IDA7IGkgPCBmdy0+c2l6ZSAvIDQ7IGkrKykgeworCQlpZiAoKGkgJiAweDNmKSA9PSAwKQorCQkJbnZfd3IzMihkZXYsIGZ1Y19iYXNlICsgMHgwMTg4LCBpID4+IDYpOworCQludl93cjMyKGRldiwgZnVjX2Jhc2UgKyAweDAxODQsICgodTMyICopZnctPmRhdGEpW2ldKTsKKwl9CisJcmVsZWFzZV9maXJtd2FyZShmdyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorbnZjMF9ncmFwaF9pbml0X2N0eGN0bChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG52YzBfZ3JhcGhfcHJpdiAqcHJpdiA9IGRldl9wcml2LT5lbmdpbmUuZ3JhcGgucHJpdjsKKwl1MzIgcjAwMDI2MDsKKwlpbnQgcmV0OworCisJLyogbG9hZCBmdWMgbWljcm9jb2RlICovCisJcjAwMDI2MCA9IG52X21hc2soZGV2LCAweDAwMDI2MCwgMHgwMDAwMDAwMSwgMHgwMDAwMDAwMCk7CisJcmV0ID0gbnZjMF9mdWNfbG9hZF9mdyhkZXYsIDB4NDA5MDAwLCAiZnVjNDA5YyIsICJmdWM0MDlkIik7CisJaWYgKHJldCA9PSAwKQorCQlyZXQgPSBudmMwX2Z1Y19sb2FkX2Z3KGRldiwgMHg0MWEwMDAsICJmdWM0MWFjIiwgImZ1YzQxYWQiKTsKKwludl93cjMyKGRldiwgMHgwMDAyNjAsIHIwMDAyNjApOworCisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCS8qIHN0YXJ0IGJvdGggb2YgdGhlbSBydW5uaW5nICovCisJbnZfd3IzMihkZXYsIDB4NDA5ODQwLCAweGZmZmZmZmZmKTsKKwludl93cjMyKGRldiwgMHg0MWExMGMsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQwOTEwYywgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDFhMTAwLCAweDAwMDAwMDAyKTsKKwludl93cjMyKGRldiwgMHg0MDkxMDAsIDB4MDAwMDAwMDIpOworCWlmICghbnZfd2FpdChkZXYsIDB4NDA5ODAwLCAweDAwMDAwMDAxLCAweDAwMDAwMDAxKSkKKwkJTlZfSU5GTyhkZXYsICIweDQwOTgwMCB3YWl0IGZhaWxlZFxuIik7CisKKwludl93cjMyKGRldiwgMHg0MDk4NDAsIDB4ZmZmZmZmZmYpOworCW52X3dyMzIoZGV2LCAweDQwOTUwMCwgMHg3ZmZmZmZmZik7CisJbnZfd3IzMihkZXYsIDB4NDA5NTA0LCAweDAwMDAwMDIxKTsKKworCW52X3dyMzIoZGV2LCAweDQwOTg0MCwgMHhmZmZmZmZmZik7CisJbnZfd3IzMihkZXYsIDB4NDA5NTAwLCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MDk1MDQsIDB4MDAwMDAwMTApOworCWlmICghbnZfd2FpdF9uZShkZXYsIDB4NDA5ODAwLCAweGZmZmZmZmZmLCAweDAwMDAwMDAwKSkgeworCQlOVl9FUlJPUihkZXYsICJmdWMwOSByZXEgMHgxMCB0aW1lb3V0XG4iKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisJcHJpdi0+Z3JjdHhfc2l6ZSA9IG52X3JkMzIoZGV2LCAweDQwOTgwMCk7CisKKwludl93cjMyKGRldiwgMHg0MDk4NDAsIDB4ZmZmZmZmZmYpOworCW52X3dyMzIoZGV2LCAweDQwOTUwMCwgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDA5NTA0LCAweDAwMDAwMDE2KTsKKwlpZiAoIW52X3dhaXRfbmUoZGV2LCAweDQwOTgwMCwgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCkpIHsKKwkJTlZfRVJST1IoZGV2LCAiZnVjMDkgcmVxIDB4MTYgdGltZW91dFxuIik7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJbnZfd3IzMihkZXYsIDB4NDA5ODQwLCAweGZmZmZmZmZmKTsKKwludl93cjMyKGRldiwgMHg0MDk1MDAsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQwOTUwNCwgMHgwMDAwMDAyNSk7CisJaWYgKCFudl93YWl0X25lKGRldiwgMHg0MDk4MDAsIDB4ZmZmZmZmZmYsIDB4MDAwMDAwMDApKSB7CisJCU5WX0VSUk9SKGRldiwgImZ1YzA5IHJlcSAweDI1IHRpbWVvdXRcbiIpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCXJldHVybiAwOwogfQogCiBpbnQKIG52YzBfZ3JhcGhfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogewogCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG5vdXZlYXVfcGdyYXBoX2VuZ2luZSAqcGdyYXBoID0gJmRldl9wcml2LT5lbmdpbmUuZ3JhcGg7CisJc3RydWN0IG52YzBfZ3JhcGhfcHJpdiAqcHJpdjsKKwlpbnQgcmV0OworCiAJZGV2X3ByaXYtPmVuZ2luZS5ncmFwaC5hY2NlbF9ibG9ja2VkID0gdHJ1ZTsKKworCXN3aXRjaCAoZGV2X3ByaXYtPmNoaXBzZXQpIHsKKwljYXNlIDB4YzA6CisJY2FzZSAweGMzOgorCWNhc2UgMHhjNDoKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJTlZfRVJST1IoZGV2LCAiUEdSQVBIOiB1bnN1cHBvcnRlZCBjaGlwc2V0LCBwbGVhc2UgcmVwb3J0IVxuIik7CisJCWlmIChub3V2ZWF1X25vYWNjZWwgIT0gMCkKKwkJCXJldHVybiAwOworCQlicmVhazsKKwl9CisKKwludl9tYXNrKGRldiwgMHgwMDAyMDAsIDB4MTgwMDEwMDAsIDB4MDAwMDAwMDApOworCW52X21hc2soZGV2LCAweDAwMDIwMCwgMHgxODAwMTAwMCwgMHgxODAwMTAwMCk7CisKKwlpZiAoIXBncmFwaC0+cHJpdikgeworCQlyZXQgPSBudmMwX2dyYXBoX2NyZWF0ZShkZXYpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwl9CisJcHJpdiA9IHBncmFwaC0+cHJpdjsKKworCW52YzBfZ3JhcGhfaW5pdF9vYmo0MTg4ODAoZGV2KTsKKwludmMwX2dyYXBoX2luaXRfcmVncyhkZXYpOworCS8vbnZjMF9ncmFwaF9pbml0X3VuaXRwbGVtZW50ZWRfbWFnaWNzKGRldik7CisJbnZjMF9ncmFwaF9pbml0X2dwY18wKGRldik7CisJLy9udmMwX2dyYXBoX2luaXRfdW5pdHBsZW1lbnRlZF9jMjQyKGRldik7CisKKwludl93cjMyKGRldiwgMHg0MDA1MDAsIDB4MDAwMTAwMDEpOworCW52X3dyMzIoZGV2LCAweDQwMDEwMCwgMHhmZmZmZmZmZik7CisJbnZfd3IzMihkZXYsIDB4NDAwMTNjLCAweGZmZmZmZmZmKTsKKworCW52YzBfZ3JhcGhfaW5pdF91bml0cyhkZXYpOworCW52YzBfZ3JhcGhfaW5pdF9ncGNfMShkZXYpOworCW52YzBfZ3JhcGhfaW5pdF9yb3AoZGV2KTsKKworCW52X3dyMzIoZGV2LCAweDQwMDEwOCwgMHhmZmZmZmZmZik7CisJbnZfd3IzMihkZXYsIDB4NDAwMTM4LCAweGZmZmZmZmZmKTsKKwludl93cjMyKGRldiwgMHg0MDAxMTgsIDB4ZmZmZmZmZmYpOworCW52X3dyMzIoZGV2LCAweDQwMDEzMCwgMHhmZmZmZmZmZik7CisJbnZfd3IzMihkZXYsIDB4NDAwMTFjLCAweGZmZmZmZmZmKTsKKwludl93cjMyKGRldiwgMHg0MDAxMzQsIDB4ZmZmZmZmZmYpOworCW52X3dyMzIoZGV2LCAweDQwMDA1NCwgMHgzNGNlMzQ2NCk7CisKKwlyZXQgPSBudmMwX2dyYXBoX2luaXRfY3R4Y3RsKGRldik7CisJaWYgKHJldCA9PSAwKQorCQlkZXZfcHJpdi0+ZW5naW5lLmdyYXBoLmFjY2VsX2Jsb2NrZWQgPSBmYWxzZTsKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludAorbnZjMF9ncmFwaF9pc3JfY2hpZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1NjQgaW5zdCkKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW47CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgaTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZfcHJpdi0+Y2hhbm5lbHMubG9jaywgZmxhZ3MpOworCWZvciAoaSA9IDA7IGkgPCBkZXZfcHJpdi0+ZW5naW5lLmZpZm8uY2hhbm5lbHM7IGkrKykgeworCQljaGFuID0gZGV2X3ByaXYtPmNoYW5uZWxzLnB0cltpXTsKKwkJaWYgKCFjaGFuIHx8ICFjaGFuLT5yYW1pbikKKwkJCWNvbnRpbnVlOworCisJCWlmIChpbnN0ID09IGNoYW4tPnJhbWluLT52aW5zdCkKKwkJCWJyZWFrOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZfcHJpdi0+Y2hhbm5lbHMubG9jaywgZmxhZ3MpOworCXJldHVybiBpOworfQorCitzdGF0aWMgdm9pZAorbnZjMF9ncmFwaF9pc3Ioc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwl1NjQgaW5zdCA9ICh1NjQpKG52X3JkMzIoZGV2LCAweDQwOWIwMCkgJiAweDBmZmZmZmZmKSA8PCAxMjsKKwl1MzIgY2hpZCA9IG52YzBfZ3JhcGhfaXNyX2NoaWQoZGV2LCBpbnN0KTsKKwl1MzIgc3RhdCA9IG52X3JkMzIoZGV2LCAweDQwMDEwMCk7CisJdTMyIGFkZHIgPSBudl9yZDMyKGRldiwgMHg0MDA3MDQpOworCXUzMiBtdGhkID0gKGFkZHIgJiAweDAwMDAzZmZjKTsKKwl1MzIgc3ViYyA9IChhZGRyICYgMHgwMDA3MDAwMCkgPj4gMTY7CisJdTMyIGRhdGEgPSBudl9yZDMyKGRldiwgMHg0MDA3MDgpOworCXUzMiBjb2RlID0gbnZfcmQzMihkZXYsIDB4NDAwMTEwKTsKKwl1MzIgY2xhc3MgPSBudl9yZDMyKGRldiwgMHg0MDQyMDAgKyAoc3ViYyAqIDQpKTsKKworCWlmIChzdGF0ICYgMHgwMDAwMDAxMCkgeworCQlOVl9JTkZPKGRldiwgIlBHUkFQSDogSUxMRUdBTF9NVEhEIGNoICVkIFsweCUwMTBsbHhdIHN1YmMgJWQgIgorCQkJICAgICAiY2xhc3MgMHglMDR4IG10aGQgMHglMDR4IGRhdGEgMHglMDh4XG4iLAorCQkJY2hpZCwgaW5zdCwgc3ViYywgY2xhc3MsIG10aGQsIGRhdGEpOworCQludl93cjMyKGRldiwgMHg0MDAxMDAsIDB4MDAwMDAwMTApOworCQlzdGF0ICY9IH4weDAwMDAwMDEwOworCX0KKworCWlmIChzdGF0ICYgMHgwMDAwMDAyMCkgeworCQlOVl9JTkZPKGRldiwgIlBHUkFQSDogSUxMRUdBTF9DTEFTUyBjaCAlZCBbMHglMDEwbGx4XSBzdWJjICVkICIKKwkJCSAgICAgImNsYXNzIDB4JTA0eCBtdGhkIDB4JTA0eCBkYXRhIDB4JTA4eFxuIiwKKwkJCWNoaWQsIGluc3QsIHN1YmMsIGNsYXNzLCBtdGhkLCBkYXRhKTsKKwkJbnZfd3IzMihkZXYsIDB4NDAwMTAwLCAweDAwMDAwMDIwKTsKKwkJc3RhdCAmPSB+MHgwMDAwMDAyMDsKKwl9CisKKwlpZiAoc3RhdCAmIDB4MDAxMDAwMDApIHsKKwkJTlZfSU5GTyhkZXYsICJQR1JBUEg6IERBVEFfRVJST1IgWyIpOworCQlub3V2ZWF1X2VudW1fcHJpbnQobnY1MF9kYXRhX2Vycm9yX25hbWVzLCBjb2RlKTsKKwkJcHJpbnRrKCJdIGNoICVkIFsweCUwMTBsbHhdIHN1YmMgJWQgY2xhc3MgMHglMDR4ICIKKwkJICAgICAgICJtdGhkIDB4JTA0eCBkYXRhIDB4JTA4eFxuIiwKKwkJICAgICAgIGNoaWQsIGluc3QsIHN1YmMsIGNsYXNzLCBtdGhkLCBkYXRhKTsKKwkJbnZfd3IzMihkZXYsIDB4NDAwMTAwLCAweDAwMTAwMDAwKTsKKwkJc3RhdCAmPSB+MHgwMDEwMDAwMDsKKwl9CisKKwlpZiAoc3RhdCAmIDB4MDAyMDAwMDApIHsKKwkJdTMyIHRyYXAgPSBudl9yZDMyKGRldiwgMHg0MDAxMDgpOworCQlOVl9JTkZPKGRldiwgIlBHUkFQSDogVFJBUCBjaCAlZCBzdGF0dXMgMHglMDh4XG4iLCBjaGlkLCB0cmFwKTsKKwkJbnZfd3IzMihkZXYsIDB4NDAwMTA4LCB0cmFwKTsKKwkJbnZfd3IzMihkZXYsIDB4NDAwMTAwLCAweDAwMjAwMDAwKTsKKwkJc3RhdCAmPSB+MHgwMDIwMDAwMDsKKwl9CisKKwlpZiAoc3RhdCAmIDB4MDAwODAwMDApIHsKKwkJdTMyIHVzdGF0ID0gbnZfcmQzMihkZXYsIDB4NDA5YzE4KTsKKworCQlOVl9JTkZPKGRldiwgIlBHUkFQSDogQ1RYQ1RSTCB1c3RhdCAweCUwOHhcbiIsIHVzdGF0KTsKKworCQludl93cjMyKGRldiwgMHg0MDljMjAsIHVzdGF0KTsKKwkJbnZfd3IzMihkZXYsIDB4NDAwMTAwLCAweDAwMDgwMDAwKTsKKwkJc3RhdCAmPSB+MHgwMDA4MDAwMDsKKwl9CisKKwlpZiAoc3RhdCkgeworCQlOVl9JTkZPKGRldiwgIlBHUkFQSDogdW5rbm93biBzdGF0IDB4JTA4eFxuIiwgc3RhdCk7CisJCW52X3dyMzIoZGV2LCAweDQwMDEwMCwgc3RhdCk7CisJfQorCisJbnZfd3IzMihkZXYsIDB4NDAwNTAwLCAweDAwMDEwMDAxKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252YzBfZ3JhcGguaCBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252YzBfZ3JhcGguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MGUyNmY5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnZjMF9ncmFwaC5oCkBAIC0wLDAgKzEsNjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxMCBSZWQgSGF0IEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBDT1BZUklHSFQgSE9MREVSKFMpIE9SIEFVVEhPUihTKSBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBBdXRob3JzOiBCZW4gU2tlZ2dzCisgKi8KKworI2lmbmRlZiBfX05WQzBfR1JBUEhfSF9fCisjZGVmaW5lIF9fTlZDMF9HUkFQSF9IX18KKworI2RlZmluZSBHUENfTUFYIDQKKyNkZWZpbmUgVFBfTUFYIDMyCisKKyNkZWZpbmUgUk9QX0JDQVNUKHIpICAgKDB4NDA4ODAwICsgKHIpKQorI2RlZmluZSBST1BfVU5JVCh1LHIpICAoMHg0MTAwMDAgKyAodSkgKiAweDQwMCArIChyKSkKKyNkZWZpbmUgR1BDX0JDQVNUKHIpICAgKDB4NDE4MDAwICsgKHIpKQorI2RlZmluZSBHUENfVU5JVCh0LHIpICAoMHg1MDAwMDAgKyAodCkgKiAweDgwMDAgKyAocikpCisjZGVmaW5lIFRQX1VOSVQodCxtLHIpICgweDUwNDAwMCArICh0KSAqIDB4ODAwMCArIChtKSAqIDB4ODAwICsgKHIpKQorCitzdHJ1Y3QgbnZjMF9ncmFwaF9wcml2IHsKKwl1OCBncGNfbnI7CisJdTggcm9wX25yOworCXU4IHRwX25yW0dQQ19NQVhdOworCXU4IHRwX3RvdGFsOworCisJdTMyICBncmN0eF9zaXplOworCXUzMiAqZ3JjdHhfdmFsczsKKwlzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKnVuazQxODhiNDsKKwlzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKnVuazQxODhiODsKKworCXU4ICBtYWdpY19ub3Rfcm9wX25yOworCXUzMiBtYWdpY2dwYzk4MFs0XTsKKwl1MzIgbWFnaWNncGM5MTg7Cit9OworCitzdHJ1Y3QgbnZjMF9ncmFwaF9jaGFuIHsKKwlzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKmdyY3R4OworCXN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqdW5rNDA4MDA0OyAvLyAweDQxODgxMCB0b28KKwlzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKnVuazQwODAwYzsgLy8gMHg0MTkwMDQgdG9vCisJc3RydWN0IG5vdXZlYXVfZ3B1b2JqICp1bms0MTg4MTA7IC8vIDB4NDE5ODQ4IHRvbworCXN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqbW1pbzsKKwlpbnQgbW1pb19ucjsKK307CisKK2ludCBudmMwX2dyY3R4X2dlbmVyYXRlKHN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKik7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnZjMF9ncmN0eC5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnZjMF9ncmN0eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5ZTY4YjIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udmMwX2dyY3R4LmMKQEAgLTAsMCArMSwyODc0IEBACisvKgorICogQ29weXJpZ2h0IDIwMTAgUmVkIEhhdCBJbmMuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQ09QWVJJR0hUIEhPTERFUihTKSBPUiBBVVRIT1IoUykgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogQXV0aG9yczogQmVuIFNrZWdncworICovCisKKyNpbmNsdWRlICJkcm1QLmgiCisjaW5jbHVkZSAibm91dmVhdV9kcnYuaCIKKyNpbmNsdWRlICJub3V2ZWF1X21tLmgiCisjaW5jbHVkZSAibnZjMF9ncmFwaC5oIgorCitzdGF0aWMgdm9pZAorbnZfaWNtZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1MzIgaWNtZCwgdTMyIGRhdGEpCit7CisJbnZfd3IzMihkZXYsIDB4NDAwMjA0LCBkYXRhKTsKKwludl93cjMyKGRldiwgMHg0MDAyMDAsIGljbWQpOworCXdoaWxlIChudl9yZDMyKGRldiwgMHg0MDA3MDApICYgMikge30KK30KKworc3RhdGljIHZvaWQKK252X210aGQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdTMyIGNsYXNzLCB1MzIgbXRoZCwgdTMyIGRhdGEpCit7CisJbnZfd3IzMihkZXYsIDB4NDA0NDhjLCBkYXRhKTsKKwludl93cjMyKGRldiwgMHg0MDQ0ODgsIDB4ODAwMDAwMDAgfCAobXRoZCA8PCAxNCkgfCBjbGFzcyk7Cit9CisKK3N0YXRpYyB2b2lkCitudmMwX2dyY3R4X2dlbmVyYXRlXzkwOTcoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDA4MDAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MDg0MCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwODgwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDA4YzAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MDkwMCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwOTQwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDA5ODAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MDljMCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwODA0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDA4NDQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MDg4NCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwOGM0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDA5MDQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MDk0NCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwOTg0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDA5YzQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MDgwOCwgMHgwMDAwMDQwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwODQ4LCAweDAwMDAwNDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDA4ODgsIDB4MDAwMDA0MDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MDhjOCwgMHgwMDAwMDQwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwOTA4LCAweDAwMDAwNDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDA5NDgsIDB4MDAwMDA0MDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MDk4OCwgMHgwMDAwMDQwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwOWM4LCAweDAwMDAwNDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDA4MGMsIDB4MDAwMDAzMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MDg0YywgMHgwMDAwMDMwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwODhjLCAweDAwMDAwMzAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDA4Y2MsIDB4MDAwMDAzMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MDkwYywgMHgwMDAwMDMwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwOTRjLCAweDAwMDAwMzAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDA5OGMsIDB4MDAwMDAzMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MDljYywgMHgwMDAwMDMwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwODEwLCAweDAwMDAwMGNmKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDA4NTAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MDg5MCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwOGQwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDA5MTAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MDk1MCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwOTkwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDA5ZDAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MDgxNCwgMHgwMDAwMDA0MCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwODU0LCAweDAwMDAwMDQwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDA4OTQsIDB4MDAwMDAwNDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MDhkNCwgMHgwMDAwMDA0MCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwOTE0LCAweDAwMDAwMDQwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDA5NTQsIDB4MDAwMDAwNDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MDk5NCwgMHgwMDAwMDA0MCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwOWQ0LCAweDAwMDAwMDQwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDA4MTgsIDB4MDAwMDAwMDEpOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MDg1OCwgMHgwMDAwMDAwMSk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwODk4LCAweDAwMDAwMDAxKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDA4ZDgsIDB4MDAwMDAwMDEpOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MDkxOCwgMHgwMDAwMDAwMSk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwOTU4LCAweDAwMDAwMDAxKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDA5OTgsIDB4MDAwMDAwMDEpOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MDlkOCwgMHgwMDAwMDAwMSk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwODFjLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDA4NWMsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MDg5YywgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwOGRjLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDA5MWMsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MDk1YywgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwOTljLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDA5ZGMsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MDgyMCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwODYwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDA4YTAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MDhlMCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwOTIwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDA5NjAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MDlhMCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwOWUwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDI3MDAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MjcyMCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgyNzQwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDI3NjAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4Mjc4MCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgyN2EwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDI3YzAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MjdlMCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgyNzA0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDI3MjQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4Mjc0NCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgyNzY0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDI3ODQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MjdhNCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgyN2M0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDI3ZTQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MjcwOCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgyNzI4LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDI3NDgsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4Mjc2OCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgyNzg4LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDI3YTgsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MjdjOCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgyN2U4LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDI3MGMsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MjcyYywgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgyNzRjLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDI3NmMsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4Mjc4YywgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgyN2FjLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDI3Y2MsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MjdlYywgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgyNzEwLCAweDAwMDE0MDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDI3MzAsIDB4MDAwMTQwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4Mjc1MCwgMHgwMDAxNDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgyNzcwLCAweDAwMDE0MDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDI3OTAsIDB4MDAwMTQwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MjdiMCwgMHgwMDAxNDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgyN2QwLCAweDAwMDE0MDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDI3ZjAsIDB4MDAwMTQwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MjcxNCwgMHgwMDAwMDA0MCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgyNzM0LCAweDAwMDAwMDQwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDI3NTQsIDB4MDAwMDAwNDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4Mjc3NCwgMHgwMDAwMDA0MCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgyNzk0LCAweDAwMDAwMDQwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDI3YjQsIDB4MDAwMDAwNDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MjdkNCwgMHgwMDAwMDA0MCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgyN2Y0LCAweDAwMDAwMDQwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFjMDAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWMxMCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxYzIwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFjMzAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWM0MCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxYzUwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFjNjAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWM3MCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxYzgwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFjOTAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWNhMCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxY2IwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFjYzAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWNkMCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxY2UwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFjZjAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWMwNCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxYzE0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFjMjQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWMzNCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxYzQ0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFjNTQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWM2NCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxYzc0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFjODQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWM5NCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxY2E0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFjYjQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWNjNCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxY2Q0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFjZTQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWNmNCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxYzA4LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFjMTgsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWMyOCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxYzM4LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFjNDgsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWM1OCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxYzY4LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFjNzgsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWM4OCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxYzk4LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFjYTgsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWNiOCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxY2M4LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFjZDgsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWNlOCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxY2Y4LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFjMGMsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWMxYywgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxYzJjLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFjM2MsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWM0YywgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxYzVjLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFjNmMsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWM3YywgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxYzhjLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFjOWMsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWNhYywgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxY2JjLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFjY2MsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWNkYywgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxY2VjLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFjZmMsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWQwMCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxZDEwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFkMjAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWQzMCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxZDQwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFkNTAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWQ2MCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxZDcwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFkODAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWQ5MCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxZGEwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFkYjAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWRjMCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxZGQwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFkZTAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWRmMCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxZDA0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFkMTQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWQyNCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxZDM0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFkNDQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWQ1NCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxZDY0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFkNzQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWQ4NCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxZDk0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFkYTQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWRiNCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxZGM0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFkZDQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWRlNCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxZGY0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFkMDgsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWQxOCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxZDI4LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFkMzgsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWQ0OCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxZDU4LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFkNjgsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWQ3OCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxZDg4LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFkOTgsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWRhOCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxZGI4LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFkYzgsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWRkOCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxZGU4LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFkZjgsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWQwYywgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxZDFjLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFkMmMsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWQzYywgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxZDRjLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFkNWMsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWQ2YywgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxZDdjLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFkOGMsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWQ5YywgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxZGFjLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFkYmMsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWRjYywgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxZGRjLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFkZWMsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWRmYywgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxZjAwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFmMDgsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWYxMCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxZjE4LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFmMjAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWYyOCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxZjMwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFmMzgsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWY0MCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxZjQ4LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFmNTAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWY1OCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxZjYwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFmNjgsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWY3MCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxZjc4LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFmMDQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWYwYywgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxZjE0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFmMWMsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWYyNCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxZjJjLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFmMzQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWYzYywgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxZjQ0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFmNGMsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWY1NCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxZjVjLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFmNjQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWY2YywgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxZjc0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFmN2MsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWY4MCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxZjg4LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFmOTAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWY5OCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxZmEwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFmYTgsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWZiMCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxZmI4LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFmYzAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWZjOCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxZmQwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFmZDgsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWZlMCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxZmU4LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFmZjAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWZmOCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxZjg0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFmOGMsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWY5NCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxZjljLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFmYTQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWZhYywgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxZmI0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFmYmMsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWZjNCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxZmNjLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFmZDQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWZkYywgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxZmU0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFmZWMsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWZmNCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxZmZjLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDIyMDAsIDB4MDAwMDAwMjIpOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MjIxMCwgMHgwMDAwMDAyMik7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgyMjIwLCAweDAwMDAwMDIyKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDIyMzAsIDB4MDAwMDAwMjIpOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MjI0MCwgMHgwMDAwMDAyMik7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgyMDAwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDIwNDAsIDB4MDAwMDAwMTEpOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MjA4MCwgMHgwMDAwMDAyMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgyMGMwLCAweDAwMDAwMDMwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDIxMDAsIDB4MDAwMDAwNDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MjE0MCwgMHgwMDAwMDA1MSk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgyMDBjLCAweDAwMDAwMDAxKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDIwNGMsIDB4MDAwMDAwMDEpOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MjA4YywgMHgwMDAwMDAwMSk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgyMGNjLCAweDAwMDAwMDAxKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDIxMGMsIDB4MDAwMDAwMDEpOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MjE0YywgMHgwMDAwMDAwMSk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgyMDEwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDIwNTAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MjA5MCwgMHgwMDAwMDAwMSk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgyMGQwLCAweDAwMDAwMDAyKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDIxMTAsIDB4MDAwMDAwMDMpOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MjE1MCwgMHgwMDAwMDAwNCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwMzgwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDAzYTAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MDNjMCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwM2UwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDAzODQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MDNhNCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwM2M0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDAzZTQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MDM4OCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwM2E4LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDAzYzgsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MDNlOCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwMzhjLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDAzYWMsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MDNjYywgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwM2VjLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDA3MDAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MDcxMCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwNzIwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDA3MzAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MDcwNCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwNzE0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDA3MjQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MDczNCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwNzA4LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDA3MTgsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MDcyOCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwNzM4LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDI4MDAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MjgwNCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgyODA4LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDI4MGMsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MjgxMCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgyODE0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDI4MTgsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MjgxYywgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgyODIwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDI4MjQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MjgyOCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgyODJjLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDI4MzAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MjgzNCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgyODM4LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDI4M2MsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4Mjg0MCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgyODQ0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDI4NDgsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4Mjg0YywgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgyODUwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDI4NTQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4Mjg1OCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgyODVjLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDI4NjAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4Mjg2NCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgyODY4LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDI4NmMsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4Mjg3MCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgyODc0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDI4NzgsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4Mjg3YywgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgyODgwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDI4ODQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4Mjg4OCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgyODhjLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDI4OTAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4Mjg5NCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgyODk4LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDI4OWMsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MjhhMCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgyOGE0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDI4YTgsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MjhhYywgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgyOGIwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDI4YjQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MjhiOCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgyOGJjLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDI4YzAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MjhjNCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgyOGM4LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDI4Y2MsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MjhkMCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgyOGQ0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDI4ZDgsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MjhkYywgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgyOGUwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDI4ZTQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MjhlOCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgyOGVjLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDI4ZjAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MjhmNCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgyOGY4LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDI4ZmMsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MjkwMCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgyOTA0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDI5MDgsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MjkwYywgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgyOTEwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDI5MTQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MjkxOCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgyOTFjLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDI5MjAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MjkyNCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgyOTI4LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDI5MmMsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MjkzMCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgyOTM0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDI5MzgsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MjkzYywgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgyOTQwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDI5NDQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4Mjk0OCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgyOTRjLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDI5NTAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4Mjk1NCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgyOTU4LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDI5NWMsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4Mjk2MCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgyOTY0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDI5NjgsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4Mjk2YywgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgyOTcwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDI5NzQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4Mjk3OCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgyOTdjLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDI5ODAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4Mjk4NCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgyOTg4LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDI5OGMsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4Mjk5MCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgyOTk0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDI5OTgsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4Mjk5YywgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgyOWEwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDI5YTQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MjlhOCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgyOWFjLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDI5YjAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MjliNCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgyOWI4LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDI5YmMsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MjljMCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgyOWM0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDI5YzgsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MjljYywgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgyOWQwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDI5ZDQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MjlkOCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgyOWRjLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDI5ZTAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MjllNCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgyOWU4LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDI5ZWMsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MjlmMCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgyOWY0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDI5ZjgsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MjlmYywgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwYTAwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBhMjAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGE0MCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwYTYwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBhODAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGFhMCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwYWMwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBhZTAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGIwMCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwYjIwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBiNDAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGI2MCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwYjgwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBiYTAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGJjMCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwYmUwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBhMDQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGEyNCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwYTQ0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBhNjQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGE4NCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwYWE0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBhYzQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGFlNCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwYjA0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBiMjQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGI0NCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwYjY0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBiODQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGJhNCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwYmM0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBiZTQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGEwOCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwYTI4LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBhNDgsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGE2OCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwYTg4LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBhYTgsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGFjOCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwYWU4LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBiMDgsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGIyOCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwYjQ4LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBiNjgsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGI4OCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwYmE4LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBiYzgsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGJlOCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwYTBjLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBhMmMsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGE0YywgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwYTZjLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBhOGMsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGFhYywgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwYWNjLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBhZWMsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGIwYywgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwYjJjLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBiNGMsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGI2YywgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwYjhjLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBiYWMsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGJjYywgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwYmVjLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBhMTAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGEzMCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwYTUwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBhNzAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGE5MCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwYWIwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBhZDAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGFmMCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwYjEwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBiMzAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGI1MCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwYjcwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBiOTAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGJiMCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwYmQwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBiZjAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGExNCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwYTM0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBhNTQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGE3NCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwYTk0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBhYjQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGFkNCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwYWY0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBiMTQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGIzNCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwYjU0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBiNzQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGI5NCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwYmI0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBiZDQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGJmNCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwYzAwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBjMTAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGMyMCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwYzMwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBjNDAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGM1MCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwYzYwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBjNzAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGM4MCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwYzkwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBjYTAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGNiMCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwY2MwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBjZDAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGNlMCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwY2YwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBjMDQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGMxNCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwYzI0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBjMzQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGM0NCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwYzU0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBjNjQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGM3NCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwYzg0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBjOTQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGNhNCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwY2I0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBjYzQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGNkNCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwY2U0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBjZjQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGMwOCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwYzE4LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBjMjgsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGMzOCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwYzQ4LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBjNTgsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGM2OCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwYzc4LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBjODgsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGM5OCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwY2E4LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBjYjgsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGNjOCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwY2Q4LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBjZTgsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGNmOCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwYzBjLCAweDNmODAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBjMWMsIDB4M2Y4MDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGMyYywgMHgzZjgwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwYzNjLCAweDNmODAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBjNGMsIDB4M2Y4MDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGM1YywgMHgzZjgwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwYzZjLCAweDNmODAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBjN2MsIDB4M2Y4MDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGM4YywgMHgzZjgwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwYzljLCAweDNmODAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBjYWMsIDB4M2Y4MDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGNiYywgMHgzZjgwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwY2NjLCAweDNmODAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBjZGMsIDB4M2Y4MDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGNlYywgMHgzZjgwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwY2ZjLCAweDNmODAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBkMDAsIDB4ZmZmZjAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGQwOCwgMHhmZmZmMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwZDEwLCAweGZmZmYwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBkMTgsIDB4ZmZmZjAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGQyMCwgMHhmZmZmMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwZDI4LCAweGZmZmYwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBkMzAsIDB4ZmZmZjAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGQzOCwgMHhmZmZmMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwZDA0LCAweGZmZmYwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBkMGMsIDB4ZmZmZjAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGQxNCwgMHhmZmZmMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwZDFjLCAweGZmZmYwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBkMjQsIDB4ZmZmZjAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGQyYywgMHhmZmZmMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwZDM0LCAweGZmZmYwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBkM2MsIDB4ZmZmZjAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGUwMCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwZTEwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBlMjAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGUzMCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwZTQwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBlNTAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGU2MCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwZTcwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBlODAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGU5MCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwZWEwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBlYjAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGVjMCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwZWQwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBlZTAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGVmMCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwZTA0LCAweGZmZmYwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBlMTQsIDB4ZmZmZjAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGUyNCwgMHhmZmZmMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwZTM0LCAweGZmZmYwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBlNDQsIDB4ZmZmZjAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGU1NCwgMHhmZmZmMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwZTY0LCAweGZmZmYwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBlNzQsIDB4ZmZmZjAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGU4NCwgMHhmZmZmMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwZTk0LCAweGZmZmYwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBlYTQsIDB4ZmZmZjAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGViNCwgMHhmZmZmMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwZWM0LCAweGZmZmYwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBlZDQsIDB4ZmZmZjAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGVlNCwgMHhmZmZmMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwZWY0LCAweGZmZmYwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBlMDgsIDB4ZmZmZjAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGUxOCwgMHhmZmZmMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwZTI4LCAweGZmZmYwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBlMzgsIDB4ZmZmZjAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGU0OCwgMHhmZmZmMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwZTU4LCAweGZmZmYwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBlNjgsIDB4ZmZmZjAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGU3OCwgMHhmZmZmMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwZTg4LCAweGZmZmYwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBlOTgsIDB4ZmZmZjAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGVhOCwgMHhmZmZmMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwZWI4LCAweGZmZmYwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBlYzgsIDB4ZmZmZjAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGVkOCwgMHhmZmZmMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwZWU4LCAweGZmZmYwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBlZjgsIDB4ZmZmZjAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGQ0MCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwZDQ4LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBkNTAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGQ1OCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwZDQ0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBkNGMsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGQ1NCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwZDVjLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFlMDAsIDB4MDAwMDAwMDEpOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWUyMCwgMHgwMDAwMDAwMSk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxZTQwLCAweDAwMDAwMDAxKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFlNjAsIDB4MDAwMDAwMDEpOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWU4MCwgMHgwMDAwMDAwMSk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxZWEwLCAweDAwMDAwMDAxKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFlYzAsIDB4MDAwMDAwMDEpOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWVlMCwgMHgwMDAwMDAwMSk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxZTA0LCAweDAwMDAwMDAxKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFlMjQsIDB4MDAwMDAwMDEpOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWU0NCwgMHgwMDAwMDAwMSk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxZTY0LCAweDAwMDAwMDAxKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFlODQsIDB4MDAwMDAwMDEpOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWVhNCwgMHgwMDAwMDAwMSk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxZWM0LCAweDAwMDAwMDAxKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFlZTQsIDB4MDAwMDAwMDEpOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWUwOCwgMHgwMDAwMDAwMik7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxZTI4LCAweDAwMDAwMDAyKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFlNDgsIDB4MDAwMDAwMDIpOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWU2OCwgMHgwMDAwMDAwMik7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxZTg4LCAweDAwMDAwMDAyKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFlYTgsIDB4MDAwMDAwMDIpOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWVjOCwgMHgwMDAwMDAwMik7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxZWU4LCAweDAwMDAwMDAyKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFlMGMsIDB4MDAwMDAwMDEpOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWUyYywgMHgwMDAwMDAwMSk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxZTRjLCAweDAwMDAwMDAxKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFlNmMsIDB4MDAwMDAwMDEpOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWU4YywgMHgwMDAwMDAwMSk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxZWFjLCAweDAwMDAwMDAxKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFlY2MsIDB4MDAwMDAwMDEpOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWVlYywgMHgwMDAwMDAwMSk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxZTEwLCAweDAwMDAwMDAxKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFlMzAsIDB4MDAwMDAwMDEpOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWU1MCwgMHgwMDAwMDAwMSk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxZTcwLCAweDAwMDAwMDAxKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFlOTAsIDB4MDAwMDAwMDEpOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWViMCwgMHgwMDAwMDAwMSk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxZWQwLCAweDAwMDAwMDAxKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFlZjAsIDB4MDAwMDAwMDEpOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWUxNCwgMHgwMDAwMDAwMik7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxZTM0LCAweDAwMDAwMDAyKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFlNTQsIDB4MDAwMDAwMDIpOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWU3NCwgMHgwMDAwMDAwMik7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxZTk0LCAweDAwMDAwMDAyKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFlYjQsIDB4MDAwMDAwMDIpOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWVkNCwgMHgwMDAwMDAwMik7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxZWY0LCAweDAwMDAwMDAyKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFlMTgsIDB4MDAwMDAwMDEpOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWUzOCwgMHgwMDAwMDAwMSk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxZTU4LCAweDAwMDAwMDAxKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFlNzgsIDB4MDAwMDAwMDEpOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWU5OCwgMHgwMDAwMDAwMSk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxZWI4LCAweDAwMDAwMDAxKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFlZDgsIDB4MDAwMDAwMDEpOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWVmOCwgMHgwMDAwMDAwMSk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgzNDAwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDM0MDQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MzQwOCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgzNDBjLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDM0MTAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MzQxNCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgzNDE4LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDM0MWMsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MzQyMCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgzNDI0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDM0MjgsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MzQyYywgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgzNDMwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDM0MzQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MzQzOCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgzNDNjLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDM0NDAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MzQ0NCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgzNDQ4LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDM0NGMsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MzQ1MCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgzNDU0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDM0NTgsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MzQ1YywgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgzNDYwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDM0NjQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MzQ2OCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgzNDZjLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDM0NzAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MzQ3NCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgzNDc4LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDM0N2MsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MzQ4MCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgzNDg0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDM0ODgsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MzQ4YywgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgzNDkwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDM0OTQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MzQ5OCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgzNDljLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDM0YTAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MzRhNCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgzNGE4LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDM0YWMsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MzRiMCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgzNGI0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDM0YjgsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MzRiYywgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgzNGMwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDM0YzQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MzRjOCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgzNGNjLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDM0ZDAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MzRkNCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgzNGQ4LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDM0ZGMsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MzRlMCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgzNGU0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDM0ZTgsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MzRlYywgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgzNGYwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDM0ZjQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MzRmOCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgzNGZjLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDM1MDAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MzUwNCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgzNTA4LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDM1MGMsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MzUxMCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgzNTE0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDM1MTgsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MzUxYywgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgzNTIwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDM1MjQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MzUyOCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgzNTJjLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDM1MzAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MzUzNCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgzNTM4LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDM1M2MsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MzU0MCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgzNTQ0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDM1NDgsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MzU0YywgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgzNTUwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDM1NTQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MzU1OCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgzNTVjLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDM1NjAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MzU2NCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgzNTY4LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDM1NmMsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MzU3MCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgzNTc0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDM1NzgsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MzU3YywgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgzNTgwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDM1ODQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MzU4OCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgzNThjLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDM1OTAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MzU5NCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgzNTk4LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDM1OWMsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MzVhMCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgzNWE0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDM1YTgsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MzVhYywgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgzNWIwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDM1YjQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MzViOCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgzNWJjLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDM1YzAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MzVjNCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgzNWM4LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDM1Y2MsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MzVkMCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgzNWQ0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDM1ZDgsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MzVkYywgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgzNWUwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDM1ZTQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MzVlOCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgzNWVjLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDM1ZjAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MzVmNCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgzNWY4LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDM1ZmMsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MDMwYywgMHgwMDAwMDAwMSk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxOTQ0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDE1MTQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGQ2OCwgMHgwMDAwZmZmZik7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxMjFjLCAweDBmYWM2ODgxKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBmYWMsIDB4MDAwMDAwMDEpOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MTUzOCwgMHgwMDAwMDAwMSk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwZmUwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBmZTQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGZlOCwgMHgwMDAwMDAxNCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwZmVjLCAweDAwMDAwMDQwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBmZjAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MTc5YywgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxMjI4LCAweDAwMDAwNDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDEyMmMsIDB4MDAwMDAzMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MTIzMCwgMHgwMDAxMDAwMSk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwN2Y4LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDE1YjQsIDB4MDAwMDAwMDEpOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MTVjYywgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxNTM0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBmYjAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MTVkMCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxNTNjLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDE2YjQsIDB4MDAwMDAwMDMpOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGZiYywgMHgwMDAwZmZmZik7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwZmMwLCAweDAwMDBmZmZmKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBmYzQsIDB4MDAwMGZmZmYpOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGZjOCwgMHgwMDAwZmZmZik7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwZGY4LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBkZmMsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MTk0OCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxOTcwLCAweDAwMDAwMDAxKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDE2MWMsIDB4MDAwMDA5ZjApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGRjYywgMHgwMDAwMDAxMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxNjNjLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDE1ZTQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MTE2MCwgMHgyNWUwMDA0MCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxMTY0LCAweDI1ZTAwMDQwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDExNjgsIDB4MjVlMDAwNDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MTE2YywgMHgyNWUwMDA0MCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxMTcwLCAweDI1ZTAwMDQwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDExNzQsIDB4MjVlMDAwNDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MTE3OCwgMHgyNWUwMDA0MCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxMTdjLCAweDI1ZTAwMDQwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDExODAsIDB4MjVlMDAwNDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MTE4NCwgMHgyNWUwMDA0MCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxMTg4LCAweDI1ZTAwMDQwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDExOGMsIDB4MjVlMDAwNDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MTE5MCwgMHgyNWUwMDA0MCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxMTk0LCAweDI1ZTAwMDQwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDExOTgsIDB4MjVlMDAwNDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MTE5YywgMHgyNWUwMDA0MCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxMWEwLCAweDI1ZTAwMDQwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDExYTQsIDB4MjVlMDAwNDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MTFhOCwgMHgyNWUwMDA0MCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxMWFjLCAweDI1ZTAwMDQwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDExYjAsIDB4MjVlMDAwNDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MTFiNCwgMHgyNWUwMDA0MCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxMWI4LCAweDI1ZTAwMDQwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDExYmMsIDB4MjVlMDAwNDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MTFjMCwgMHgyNWUwMDA0MCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxMWM0LCAweDI1ZTAwMDQwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDExYzgsIDB4MjVlMDAwNDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MTFjYywgMHgyNWUwMDA0MCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxMWQwLCAweDI1ZTAwMDQwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDExZDQsIDB4MjVlMDAwNDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MTFkOCwgMHgyNWUwMDA0MCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxMWRjLCAweDI1ZTAwMDQwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDE4ODAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MTg4NCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxODg4LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDE4OGMsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MTg5MCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxODk0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDE4OTgsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MTg5YywgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxOGEwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDE4YTQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MThhOCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxOGFjLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDE4YjAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MThiNCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxOGI4LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDE4YmMsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MThjMCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxOGM0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDE4YzgsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MThjYywgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxOGQwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDE4ZDQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MThkOCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxOGRjLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDE4ZTAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MThlNCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxOGU4LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDE4ZWMsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MThmMCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxOGY0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDE4ZjgsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MThmYywgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwZjg0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBmODgsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MTdjOCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxN2NjLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDE3ZDAsIDB4MDAwMDAwZmYpOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MTdkNCwgMHhmZmZmZmZmZik7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxN2Q4LCAweDAwMDAwMDAyKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDE3ZGMsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MTVmNCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxNWY4LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDE0MzQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MTQzOCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwZDc0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBkZWMsIDB4MDAwMDAwMDEpOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MTNhNCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxMzE4LCAweDAwMDAwMDAxKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDE2NDQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MDc0OCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwZGU4LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDE2NDgsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MTJhNCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxMTIwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDExMjQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MTEyOCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxMTJjLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDExMTgsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MTY0YywgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxNjU4LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDE5MTAsIDB4MDAwMDAyOTApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MTUxOCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxNjVjLCAweDAwMDAwMDAxKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDE1MjAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MTYwNCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxNTcwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDEzYjAsIDB4M2Y4MDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MTNiNCwgMHgzZjgwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwMjBjLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDE2NzAsIDB4MzAyMDEwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MTY3NCwgMHg3MDYwNTA0MCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxNjc4LCAweGI4YTg5ODg4KTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDE2N2MsIDB4ZjhlOGQ4YzgpOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MTY2YywgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxNjgwLCAweDAwZmZmZjAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDEyZDAsIDB4MDAwMDAwMDMpOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MTJkNCwgMHgwMDAwMDAwMik7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxNjg0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDE2ODgsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGRhYywgMHgwMDAwMWIwMik7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwZGIwLCAweDAwMDAxYjAyKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBkYjQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MTY4YywgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxNWJjLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDE1NmMsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MTg3YywgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxMTEwLCAweDAwMDAwMDAxKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBkYzAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGRjNCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwZGM4LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDEyMzQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MTY5MCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxMmFjLCAweDAwMDAwMDAxKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDAyYzQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MDc5MCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwNzk0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDA3OTgsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MDc5YywgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwN2EwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDA3N2MsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MTAwMCwgMHgwMDAwMDAxMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxMGZjLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDEyOTAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MDIxOCwgMHgwMDAwMDAxMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxMmQ4LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDEyZGMsIDB4MDAwMDAwMTApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGQ5NCwgMHgwMDAwMDAwMSk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxNTVjLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDE1NjAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MTU2NCwgMHgwMDAwMWZmZik7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxNTc0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDE1NzgsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MTU3YywgMHgwMDNmZmZmZik7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxMzU0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDE2NjQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MTYxMCwgMHgwMDAwMDAxMik7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxNjA4LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDE2MGMsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MTYyYywgMHgwMDAwMDAwMyk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwMjEwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDAzMjAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MDMyNCwgMHgzZjgwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwMzI4LCAweDNmODAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDAzMmMsIDB4M2Y4MDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MDMzMCwgMHgzZjgwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwMzM0LCAweDNmODAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDAzMzgsIDB4M2Y4MDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MDc1MCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwNzYwLCAweDM5MjkxOTA5KTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDA3NjQsIDB4Nzk2OTU5NDkpOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MDc2OCwgMHhiOWE5OTk4OSk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwNzZjLCAweGY5ZTlkOWM5KTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDA3NzAsIDB4MzAyMDEwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MDc3NCwgMHg3MDYwNTA0MCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwNzc4LCAweDAwMDA5MDgwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDA3ODAsIDB4MzkyOTE5MDkpOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MDc4NCwgMHg3OTY5NTk0OSk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwNzg4LCAweGI5YTk5OTg5KTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDA3OGMsIDB4ZjllOWQ5YzkpOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MDdkMCwgMHgzMDIwMTAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwN2Q0LCAweDcwNjA1MDQwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDA3ZDgsIDB4MDAwMDkwODApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MDM3YywgMHgwMDAwMDAwMSk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwNzQwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDA3NDQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MjYwMCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxOTE4LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDE5MWMsIDB4MDAwMDA5MDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MTkyMCwgMHgwMDAwMDQwNSk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxMzA4LCAweDAwMDAwMDAxKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDE5MjQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MTNhYywgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxOTJjLCAweDAwMDAwMDAxKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDE5M2MsIDB4MDAwMDJjMWMpOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGQ3YywgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwZjhjLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDAyYzAsIDB4MDAwMDAwMDEpOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MTUxMCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxOTQwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBmZjQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGZmOCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxOTRjLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDE5NTAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MTk2OCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxNTkwLCAweDAwMDAwMDNmKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDA3ZTgsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MDdlYywgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwN2YwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDA3ZjQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MTk2YywgMHgwMDAwMDAxMSk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxOTdjLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBmY2MsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGZkMCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwMmQ4LCAweDAwMDAwMDQwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDE5ODAsIDB4MDAwMDAwODApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MTUwNCwgMHgwMDAwMDA4MCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxOTg0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDAzMDAsIDB4MDAwMDAwMDEpOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MTNhOCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxMmVjLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDEzMTAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MTMxNCwgMHgwMDAwMDAwMSk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxMzgwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDEzODQsIDB4MDAwMDAwMDEpOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MTM4OCwgMHgwMDAwMDAwMSk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxMzhjLCAweDAwMDAwMDAxKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDEzOTAsIDB4MDAwMDAwMDEpOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MTM5NCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxMzljLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDEzOTgsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MTU5NCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxNTk4LCAweDAwMDAwMDAxKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDE1OWMsIDB4MDAwMDAwMDEpOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MTVhMCwgMHgwMDAwMDAwMSk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxNWE0LCAweDAwMDAwMDAxKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBmNTQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGY1OCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwZjVjLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDE5YmMsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGY5YywgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwZmEwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDEyY2MsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MTJlOCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxMzBjLCAweDAwMDAwMDAxKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDEzNjAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MTM2NCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxMzY4LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDEzNmMsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MTM3MCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxMzc0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDEzNzgsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MTM3YywgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxMzNjLCAweDAwMDAwMDAxKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDEzNDAsIDB4MDAwMDAwMDEpOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MTM0NCwgMHgwMDAwMDAwMik7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxMzQ4LCAweDAwMDAwMDAxKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDEzNGMsIDB4MDAwMDAwMDEpOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MTM1MCwgMHgwMDAwMDAwMik7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxMzU4LCAweDAwMDAwMDAxKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDEyZTQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MTMxYywgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxMzIwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDEzMjQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MTMyOCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxOWMwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDExNDAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MTljNCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxOWM4LCAweDAwMDAxNTAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDEzNWMsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGY5MCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxOWUwLCAweDAwMDAwMDAxKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDE5ZTQsIDB4MDAwMDAwMDEpOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MTllOCwgMHgwMDAwMDAwMSk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxOWVjLCAweDAwMDAwMDAxKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDE5ZjAsIDB4MDAwMDAwMDEpOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MTlmNCwgMHgwMDAwMDAwMSk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxOWY4LCAweDAwMDAwMDAxKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDE5ZmMsIDB4MDAwMDAwMDEpOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MTljYywgMHgwMDAwMDAwMSk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxNWI4LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFhMDAsIDB4MDAwMDExMTEpOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWEwNCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxYTA4LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFhMGMsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWExMCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxYTE0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDFhMTgsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MWExYywgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwZDZjLCAweGZmZmYwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBkNzAsIDB4ZmZmZjAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MTBmOCwgMHgwMDAwMTAxMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwZDgwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBkODQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGQ4OCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwZDhjLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBkOTAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGRhMCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxNTA4LCAweDgwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDE1MGMsIDB4NDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MTY2OCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwMzE4LCAweDAwMDAwMDA4KTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDAzMWMsIDB4MDAwMDAwMDgpOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MGQ5YywgMHgwMDAwMDAwMSk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwN2RjLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDA3NGMsIDB4MDAwMDAwNTUpOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MTQyMCwgMHgwMDAwMDAwMyk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxN2JjLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDE3YzAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MTdjNCwgMHgwMDAwMDAwMSk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxMDA4LCAweDAwMDAwMDA4KTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDEwMGMsIDB4MDAwMDAwNDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MTAxMCwgMHgwMDAwMDEyYyk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwZDYwLCAweDAwMDAwMDQwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDA3NWMsIDB4MDAwMDAwMDMpOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MTAxOCwgMHgwMDAwMDAyMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxMDFjLCAweDAwMDAwMDAxKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDEwMjAsIDB4MDAwMDAwMjApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MTAyNCwgMHgwMDAwMDAwMSk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxNDQ0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDE0NDgsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MTQ0YywgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwMzYwLCAweDIwMTY0MDEwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDAzNjQsIDB4MDAwMDAwMjApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MDM2OCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwZGU0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDAyMDQsIDB4MDAwMDAwMDYpOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MDIwOCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwMmNjLCAweDAwM2ZmZmZmKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDAyZDAsIDB4MDAwMDBjNDgpOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MTIyMCwgMHgwMDAwMDAwNSk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgwZmRjLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDBmOTgsIDB4MDAzMDAwMDgpOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MTI4NCwgMHgwNDAwMDA4MCk7CisJbnZfbXRoZChkZXYsIDB4OTA5NywgMHgxNDUwLCAweDAwMzAwMDA4KTsKKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDE0NTQsIDB4MDQwMDAwODApOworCW52X210aGQoZGV2LCAweDkwOTcsIDB4MDIxNCwgMHgwMDAwMDAwMCk7CisJLyogaW4gdHJhY2UsIHJpZ2h0IGFmdGVyIDB4OTBjMCwgbm90IGhlcmUgKi8KKwludl9tdGhkKGRldiwgMHg5MDk3LCAweDM0MTAsIDB4ODAwMDIwMDYpOworfQorCitzdGF0aWMgdm9pZAorbnZjMF9ncmN0eF9nZW5lcmF0ZV85MDJkKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJbnZfbXRoZChkZXYsIDB4OTAyZCwgMHgwMjAwLCAweDAwMDAwMGNmKTsKKwludl9tdGhkKGRldiwgMHg5MDJkLCAweDAyMDQsIDB4MDAwMDAwMDEpOworCW52X210aGQoZGV2LCAweDkwMmQsIDB4MDIwOCwgMHgwMDAwMDAyMCk7CisJbnZfbXRoZChkZXYsIDB4OTAyZCwgMHgwMjBjLCAweDAwMDAwMDAxKTsKKwludl9tdGhkKGRldiwgMHg5MDJkLCAweDAyMTAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwMmQsIDB4MDIxNCwgMHgwMDAwMDA4MCk7CisJbnZfbXRoZChkZXYsIDB4OTAyZCwgMHgwMjE4LCAweDAwMDAwMTAwKTsKKwludl9tdGhkKGRldiwgMHg5MDJkLCAweDAyMWMsIDB4MDAwMDAxMDApOworCW52X210aGQoZGV2LCAweDkwMmQsIDB4MDIyMCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTAyZCwgMHgwMjI0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDJkLCAweDAyMzAsIDB4MDAwMDAwY2YpOworCW52X210aGQoZGV2LCAweDkwMmQsIDB4MDIzNCwgMHgwMDAwMDAwMSk7CisJbnZfbXRoZChkZXYsIDB4OTAyZCwgMHgwMjM4LCAweDAwMDAwMDIwKTsKKwludl9tdGhkKGRldiwgMHg5MDJkLCAweDAyM2MsIDB4MDAwMDAwMDEpOworCW52X210aGQoZGV2LCAweDkwMmQsIDB4MDI0NCwgMHgwMDAwMDA4MCk7CisJbnZfbXRoZChkZXYsIDB4OTAyZCwgMHgwMjQ4LCAweDAwMDAwMTAwKTsKKwludl9tdGhkKGRldiwgMHg5MDJkLCAweDAyNGMsIDB4MDAwMDAxMDApOworfQorCitzdGF0aWMgdm9pZAorbnZjMF9ncmN0eF9nZW5lcmF0ZV85MDM5KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJbnZfbXRoZChkZXYsIDB4OTAzOSwgMHgwMzBjLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDM5LCAweDAzMTAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwMzksIDB4MDMxNCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTAzOSwgMHgwMzIwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDM5LCAweDAyMzgsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwMzksIDB4MDIzYywgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTAzOSwgMHgwMzE4LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MDM5LCAweDAzMWMsIDB4MDAwMDAwMDApOworfQorCitzdGF0aWMgdm9pZAorbnZjMF9ncmN0eF9nZW5lcmF0ZV85MGMwKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJbnZfbXRoZChkZXYsIDB4OTBjMCwgMHgyNzBjLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MGMwLCAweDI3MmMsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwYzAsIDB4Mjc0YywgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTBjMCwgMHgyNzZjLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MGMwLCAweDI3OGMsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwYzAsIDB4MjdhYywgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTBjMCwgMHgyN2NjLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MGMwLCAweDI3ZWMsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwYzAsIDB4MDMwYywgMHgwMDAwMDAwMSk7CisJbnZfbXRoZChkZXYsIDB4OTBjMCwgMHgxOTQ0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MGMwLCAweDA3NTgsIDB4MDAwMDAxMDApOworCW52X210aGQoZGV2LCAweDkwYzAsIDB4MDJjNCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTBjMCwgMHgwNzkwLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MGMwLCAweDA3OTQsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwYzAsIDB4MDc5OCwgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTBjMCwgMHgwNzljLCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MGMwLCAweDA3YTAsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwYzAsIDB4MDc3YywgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTBjMCwgMHgwMjA0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MGMwLCAweDAyMDgsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwYzAsIDB4MDIwYywgMHgwMDAwMDAwMCk7CisJbnZfbXRoZChkZXYsIDB4OTBjMCwgMHgwMjE0LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MGMwLCAweDAyNGMsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwYzAsIDB4MGQ5NCwgMHgwMDAwMDAwMSk7CisJbnZfbXRoZChkZXYsIDB4OTBjMCwgMHgxNjA4LCAweDAwMDAwMDAwKTsKKwludl9tdGhkKGRldiwgMHg5MGMwLCAweDE2MGMsIDB4MDAwMDAwMDApOworCW52X210aGQoZGV2LCAweDkwYzAsIDB4MTY2NCwgMHgwMDAwMDAwMCk7Cit9CisKK3N0YXRpYyB2b2lkCitudmMwX2dyY3R4X2dlbmVyYXRlX2Rpc3BhdGNoKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJaW50IGk7CisKKwludl93cjMyKGRldiwgMHg0MDQwMDQsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQwNDAwOCwgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDA0MDBjLCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MDQwMTAsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQwNDAxNCwgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDA0MDE4LCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MDQwMWMsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQwNDAyMCwgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDA0MDI0LCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MDQwMjgsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQwNDAyYywgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDA0MDQ0LCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MDQwOTQsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQwNDA5OCwgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDA0MDljLCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MDQwYTAsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQwNDBhNCwgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDA0MGE4LCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MDQwYWMsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQwNDBiMCwgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDA0MGI0LCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MDQwYjgsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQwNDBiYywgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDA0MGMwLCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MDQwYzQsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQwNDBjOCwgMHhmMDAwMDA4Nyk7CisJbnZfd3IzMihkZXYsIDB4NDA0MGQ0LCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MDQwZDgsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQwNDBkYywgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDA0MGUwLCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MDQwZTQsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQwNDBlOCwgMHgwMDAwMTAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDA0MGY4LCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MDQxMzAsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQwNDEzNCwgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDA0MTM4LCAweDIwMDAwMDQwKTsKKwludl93cjMyKGRldiwgMHg0MDQxNTAsIDB4MDAwMDAwMmUpOworCW52X3dyMzIoZGV2LCAweDQwNDE1NCwgMHgwMDAwMDQwMCk7CisJbnZfd3IzMihkZXYsIDB4NDA0MTU4LCAweDAwMDAwMjAwKTsKKwludl93cjMyKGRldiwgMHg0MDQxNjQsIDB4MDAwMDAwNTUpOworCW52X3dyMzIoZGV2LCAweDQwNDE2OCwgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDA0MTc0LCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MDQxNzgsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQwNDE3YywgMHgwMDAwMDAwMCk7CisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKwkJbnZfd3IzMihkZXYsIDB4NDA0MjAwICsgKGkgKiA0KSwgMHgwMDAwMDAwMCk7IC8qIHN1YmMgKi8KK30KKworc3RhdGljIHZvaWQKK252YzBfZ3JjdHhfZ2VuZXJhdGVfbWFjcm8oc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwludl93cjMyKGRldiwgMHg0MDQ0MDQsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQwNDQwOCwgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDA0NDBjLCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MDQ0MTAsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQwNDQxNCwgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDA0NDE4LCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MDQ0MWMsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQwNDQyMCwgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDA0NDI0LCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MDQ0MjgsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQwNDQyYywgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDA0NDMwLCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MDQ0MzQsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQwNDQzOCwgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDA0NDYwLCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MDQ0NjQsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQwNDQ2OCwgMHgwMGZmZmZmZik7CisJbnZfd3IzMihkZXYsIDB4NDA0NDZjLCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MDQ0ODAsIDB4MDAwMDAwMDEpOworCW52X3dyMzIoZGV2LCAweDQwNDQ5OCwgMHgwMDAwMDAwMSk7Cit9CisKK3N0YXRpYyB2b2lkCitudmMwX2dyY3R4X2dlbmVyYXRlX20ybWYoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwludl93cjMyKGRldiwgMHg0MDQ2MDQsIDB4MDAwMDAwMTUpOworCW52X3dyMzIoZGV2LCAweDQwNDYwOCwgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDA0NjBjLCAweDAwMDAyZTAwKTsKKwludl93cjMyKGRldiwgMHg0MDQ2MTAsIDB4MDAwMDAxMDApOworCW52X3dyMzIoZGV2LCAweDQwNDYxOCwgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDA0NjFjLCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MDQ2MjAsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQwNDYyNCwgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDA0NjI4LCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MDQ2MmMsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQwNDYzMCwgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDA0NjM0LCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MDQ2MzgsIDB4MDAwMDAwMDQpOworCW52X3dyMzIoZGV2LCAweDQwNDYzYywgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDA0NjQwLCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MDQ2NDQsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQwNDY0OCwgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDA0NjRjLCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MDQ2NTAsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQwNDY1NCwgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDA0NjU4LCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MDQ2NWMsIDB4MDA3ZjAxMDApOworCW52X3dyMzIoZGV2LCAweDQwNDY2MCwgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDA0NjY0LCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MDQ2NjgsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQwNDY2YywgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDA0NjcwLCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MDQ2NzQsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQwNDY3OCwgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDA0NjdjLCAweDAwMDAwMDAyKTsKKwludl93cjMyKGRldiwgMHg0MDQ2ODAsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQwNDY4NCwgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDA0Njg4LCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MDQ2OGMsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQwNDY5MCwgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDA0Njk0LCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MDQ2OTgsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQwNDY5YywgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDA0NmEwLCAweDAwN2YwMDgwKTsKKwludl93cjMyKGRldiwgMHg0MDQ2YTQsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQwNDZhOCwgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDA0NmFjLCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MDQ2YjAsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQwNDZiNCwgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDA0NmI4LCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MDQ2YmMsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQwNDZjMCwgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDA0NmM0LCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MDQ2YzgsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQwNDZjYywgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDA0NmQwLCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MDQ2ZDQsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQwNDZkOCwgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDA0NmRjLCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MDQ2ZTAsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQwNDZlNCwgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDA0NmU4LCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MDQ2ZjAsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQwNDZmNCwgMHgwMDAwMDAwMCk7Cit9CisKK3N0YXRpYyB2b2lkCitudmMwX2dyY3R4X2dlbmVyYXRlX3VuazQ3eHgoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwludl93cjMyKGRldiwgMHg0MDQ3MDAsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQwNDcwNCwgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDA0NzA4LCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MDQ3MGMsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQwNDcxMCwgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDA0NzE0LCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MDQ3MTgsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQwNDcxYywgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDA0NzIwLCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MDQ3MjQsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQwNDcyOCwgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDA0NzJjLCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MDQ3MzAsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQwNDczNCwgMHgwMDAwMDEwMCk7CisJbnZfd3IzMihkZXYsIDB4NDA0NzM4LCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MDQ3M2MsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQwNDc0MCwgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDA0NzQ0LCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MDQ3NDgsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQwNDc0YywgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDA0NzUwLCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MDQ3NTQsIDB4MDAwMDAwMDApOworfQorCitzdGF0aWMgdm9pZAorbnZjMF9ncmN0eF9nZW5lcmF0ZV9zaGFkZXJzKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJbnZfd3IzMihkZXYsIDB4NDA1ODAwLCAweDA3ODAwMGJmKTsKKwludl93cjMyKGRldiwgMHg0MDU4MzAsIDB4MDIxODAwMDApOworCW52X3dyMzIoZGV2LCAweDQwNTgzNCwgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDA1ODM4LCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MDU4NTQsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQwNTg3MCwgMHgwMDAwMDAwMSk7CisJbnZfd3IzMihkZXYsIDB4NDA1ODc0LCAweDAwMDAwMDAxKTsKKwludl93cjMyKGRldiwgMHg0MDU4NzgsIDB4MDAwMDAwMDEpOworCW52X3dyMzIoZGV2LCAweDQwNTg3YywgMHgwMDAwMDAwMSk7CisJbnZfd3IzMihkZXYsIDB4NDA1YTAwLCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MDVhMDQsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQwNWExOCwgMHgwMDAwMDAwMCk7Cit9CisKK3N0YXRpYyB2b2lkCitudmMwX2dyY3R4X2dlbmVyYXRlX3VuazYweHgoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwludl93cjMyKGRldiwgMHg0MDYwMjAsIDB4MDAwMTAzYzEpOworCW52X3dyMzIoZGV2LCAweDQwNjAyOCwgMHgwMDAwMDAwMSk7CisJbnZfd3IzMihkZXYsIDB4NDA2MDJjLCAweDAwMDAwMDAxKTsKKwludl93cjMyKGRldiwgMHg0MDYwMzAsIDB4MDAwMDAwMDEpOworCW52X3dyMzIoZGV2LCAweDQwNjAzNCwgMHgwMDAwMDAwMSk7Cit9CisKK3N0YXRpYyB2b2lkCitudmMwX2dyY3R4X2dlbmVyYXRlX3VuazY0eHgoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwludl93cjMyKGRldiwgMHg0MDY0YTgsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQwNjRhYywgMHgwMDAwM2ZmZik7CisJbnZfd3IzMihkZXYsIDB4NDA2NGI0LCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MDY0YjgsIDB4MDAwMDAwMDApOworfQorCitzdGF0aWMgdm9pZAorbnZjMF9ncmN0eF9nZW5lcmF0ZV90cGJ1cyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCW52X3dyMzIoZGV2LCAweDQwNzgwNCwgMHgwMDAwMDAyMyk7CisJbnZfd3IzMihkZXYsIDB4NDA3ODBjLCAweDBhNDE4ODIwKTsKKwludl93cjMyKGRldiwgMHg0MDc4MTAsIDB4MDYyMDgwZTYpOworCW52X3dyMzIoZGV2LCAweDQwNzgxNCwgMHgwMjAzOThhNCk7CisJbnZfd3IzMihkZXYsIDB4NDA3ODE4LCAweDBlNjI5MDYyKTsKKwludl93cjMyKGRldiwgMHg0MDc4MWMsIDB4MGE0MTg4MjApOworCW52X3dyMzIoZGV2LCAweDQwNzgyMCwgMHgwMDAwMDBlNik7CisJbnZfd3IzMihkZXYsIDB4NDA3OGJjLCAweDAwMDAwMTAzKTsKK30KKworc3RhdGljIHZvaWQKK252YzBfZ3JjdHhfZ2VuZXJhdGVfY2NhY2hlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJbnZfd3IzMihkZXYsIDB4NDA4MDAwLCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MDgwMDQsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQwODAwOCwgMHgwMDAwMDAxOCk7CisJbnZfd3IzMihkZXYsIDB4NDA4MDBjLCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MDgwMTAsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQwODAxNCwgMHgwMDAwMDA2OSk7CisJbnZfd3IzMihkZXYsIDB4NDA4MDE4LCAweGUxMDBlMTAwKTsKKwludl93cjMyKGRldiwgMHg0MDgwNjQsIDB4MDAwMDAwMDApOworfQorCitzdGF0aWMgdm9pZAorbnZjMF9ncmN0eF9nZW5lcmF0ZV9yb3Aoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCisJLy8gUk9QQ19CUk9BRENBU1QKKwludl93cjMyKGRldiwgMHg0MDg4MDAsIDB4MDI4MDJhM2MpOworCW52X3dyMzIoZGV2LCAweDQwODgwNCwgMHgwMDAwMDA0MCk7CisJbnZfd3IzMihkZXYsIDB4NDA4ODA4LCAweDAwMDNlMDBkKTsKKwlzd2l0Y2ggKGRldl9wcml2LT5jaGlwc2V0KSB7CisJY2FzZSAweGMwOgorCQludl93cjMyKGRldiwgMHg0MDg5MDAsIDB4MDA4MGI4MDEpOworCQlicmVhazsKKwljYXNlIDB4YzM6CisJY2FzZSAweGM0OgorCQludl93cjMyKGRldiwgMHg0MDg5MDAsIDB4MzA4MGI4MDEpOworCQlicmVhazsKKwl9CisJbnZfd3IzMihkZXYsIDB4NDA4OTA0LCAweDAyMDAwMDAxKTsKKwludl93cjMyKGRldiwgMHg0MDg5MDgsIDB4MDBjODA5MjkpOworCW52X3dyMzIoZGV2LCAweDQwODkwYywgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDA4OTgwLCAweDAwMDAwMTFkKTsKK30KKworc3RhdGljIHZvaWQKK252YzBfZ3JjdHhfZ2VuZXJhdGVfZ3BjKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJaW50IGk7CisKKwkvLyBHUENfQlJPQURDQVNUCisJbnZfd3IzMihkZXYsIDB4NDE4MzgwLCAweDAwMDAwMDE2KTsKKwludl93cjMyKGRldiwgMHg0MTg0MDAsIDB4MzgwMDRlMDApOworCW52X3dyMzIoZGV2LCAweDQxODQwNCwgMHg3MWUwZmZmZik7CisJbnZfd3IzMihkZXYsIDB4NDE4NDA4LCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MTg0MGMsIDB4MDAwMDEwMDgpOworCW52X3dyMzIoZGV2LCAweDQxODQxMCwgMHgwZmZmMGZmZik7CisJbnZfd3IzMihkZXYsIDB4NDE4NDE0LCAweDAwMjAwZmZmKTsKKwludl93cjMyKGRldiwgMHg0MTg0NTAsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQxODQ1NCwgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDE4NDU4LCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MTg0NWMsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQxODQ2MCwgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDE4NDY0LCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MTg0NjgsIDB4MDAwMDAwMDEpOworCW52X3dyMzIoZGV2LCAweDQxODQ2YywgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDE4NDcwLCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MTg2MDAsIDB4MDAwMDAwMWYpOworCW52X3dyMzIoZGV2LCAweDQxODY4NCwgMHgwMDAwMDAwZik7CisJbnZfd3IzMihkZXYsIDB4NDE4NzAwLCAweDAwMDAwMDAyKTsKKwludl93cjMyKGRldiwgMHg0MTg3MDQsIDB4MDAwMDAwODApOworCW52X3dyMzIoZGV2LCAweDQxODcwOCwgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDE4NzBjLCAweDA3YzgwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MTg3MTAsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQxODgwMCwgMHgwMDA2ODYwYSk7CisJbnZfd3IzMihkZXYsIDB4NDE4ODA4LCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MTg4MGMsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQxODgxMCwgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDE4ODI4LCAweDAwMDA4NDQyKTsKKwludl93cjMyKGRldiwgMHg0MTg4MzAsIDB4MDAwMDAwMDEpOworCW52X3dyMzIoZGV2LCAweDQxODhkOCwgMHgwMDAwMDAwOCk7CisJbnZfd3IzMihkZXYsIDB4NDE4OGUwLCAweDAxMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MTg4ZTgsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQxODhlYywgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDE4OGYwLCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MTg4ZjQsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQxODhmOCwgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDE4OGZjLCAweDAwMTAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MTg5MWMsIDB4MDBmZjAwZmYpOworCW52X3dyMzIoZGV2LCAweDQxODkyNCwgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDE4OTI4LCAweDAwZmZmZjAwKTsKKwludl93cjMyKGRldiwgMHg0MTg5MmMsIDB4MDAwMGZmMDApOworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKwkJbnZfd3IzMihkZXYsIDB4NDE4YTAwICsgKGkgKiAweDIwKSwgMHgwMDAwMDAwMCk7CisJCW52X3dyMzIoZGV2LCAweDQxOGEwNCArIChpICogMHgyMCksIDB4MDAwMDAwMDApOworCQludl93cjMyKGRldiwgMHg0MThhMDggKyAoaSAqIDB4MjApLCAweDAwMDAwMDAwKTsKKwkJbnZfd3IzMihkZXYsIDB4NDE4YTBjICsgKGkgKiAweDIwKSwgMHgwMDAxMDAwMCk7CisJCW52X3dyMzIoZGV2LCAweDQxOGExMCArIChpICogMHgyMCksIDB4MDAwMDAwMDApOworCQludl93cjMyKGRldiwgMHg0MThhMTQgKyAoaSAqIDB4MjApLCAweDAwMDAwMDAwKTsKKwkJbnZfd3IzMihkZXYsIDB4NDE4YTE4ICsgKGkgKiAweDIwKSwgMHgwMDAwMDAwMCk7CisJfQorCW52X3dyMzIoZGV2LCAweDQxOGIwMCwgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDE4YjA4LCAweDBhNDE4ODIwKTsKKwludl93cjMyKGRldiwgMHg0MThiMGMsIDB4MDYyMDgwZTYpOworCW52X3dyMzIoZGV2LCAweDQxOGIxMCwgMHgwMjAzOThhNCk7CisJbnZfd3IzMihkZXYsIDB4NDE4YjE0LCAweDBlNjI5MDYyKTsKKwludl93cjMyKGRldiwgMHg0MThiMTgsIDB4MGE0MTg4MjApOworCW52X3dyMzIoZGV2LCAweDQxOGIxYywgMHgwMDAwMDBlNik7CisJbnZfd3IzMihkZXYsIDB4NDE4YmI4LCAweDAwMDAwMTAzKTsKKwludl93cjMyKGRldiwgMHg0MThjMDgsIDB4MDAwMDAwMDEpOworCW52X3dyMzIoZGV2LCAweDQxOGMxMCwgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDE4YzE0LCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MThjMTgsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQxOGMxYywgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDE4YzIwLCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MThjMjQsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQxOGMyOCwgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDE4YzJjLCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MThjODAsIDB4MjAyMDAwMDQpOworCW52X3dyMzIoZGV2LCAweDQxOGM4YywgMHgwMDAwMDAwMSk7CisJbnZfd3IzMihkZXYsIDB4NDE5MDAwLCAweDAwMDAwNzgwKTsKKwludl93cjMyKGRldiwgMHg0MTkwMDQsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQxOTAwOCwgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDE5MDE0LCAweDAwMDAwMDA0KTsKK30KKworc3RhdGljIHZvaWQKK252YzBfZ3JjdHhfZ2VuZXJhdGVfdHAoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCisJLy8gR1BDX0JST0FEQ0FTVC5UUF9CUk9BRENBU1QKKwludl93cjMyKGRldiwgMHg0MTk4NDgsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQxOTg2NCwgMHgwMDAwMDEyYSk7CisJbnZfd3IzMihkZXYsIDB4NDE5ODg4LCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MTlhMDAsIDB4MDAwMDAxZjApOworCW52X3dyMzIoZGV2LCAweDQxOWEwNCwgMHgwMDAwMDAwMSk7CisJbnZfd3IzMihkZXYsIDB4NDE5YTA4LCAweDAwMDAwMDIzKTsKKwludl93cjMyKGRldiwgMHg0MTlhMGMsIDB4MDAwMjAwMDApOworCW52X3dyMzIoZGV2LCAweDQxOWExMCwgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDE5YTE0LCAweDAwMDAwMjAwKTsKKwludl93cjMyKGRldiwgMHg0MTlhMWMsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQxOWEyMCwgMHgwMDAwMDgwMCk7CisJaWYgKGRldl9wcml2LT5jaGlwc2V0ICE9IDB4YzApCisJCW52X3dyMzIoZGV2LCAweDAwNDE5YWM0LCAweDAwMDdmNDQwKTsgLy8gMHhjMworCW52X3dyMzIoZGV2LCAweDQxOWIwMCwgMHgwYTQxODgyMCk7CisJbnZfd3IzMihkZXYsIDB4NDE5YjA0LCAweDA2MjA4MGU2KTsKKwludl93cjMyKGRldiwgMHg0MTliMDgsIDB4MDIwMzk4YTQpOworCW52X3dyMzIoZGV2LCAweDQxOWIwYywgMHgwZTYyOTA2Mik7CisJbnZfd3IzMihkZXYsIDB4NDE5YjEwLCAweDBhNDE4ODIwKTsKKwludl93cjMyKGRldiwgMHg0MTliMTQsIDB4MDAwMDAwZTYpOworCW52X3dyMzIoZGV2LCAweDQxOWJkMCwgMHgwMDkwMDEwMyk7CisJbnZfd3IzMihkZXYsIDB4NDE5YmUwLCAweDAwMDAwMDAxKTsKKwludl93cjMyKGRldiwgMHg0MTliZTQsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQxOWMwMCwgMHgwMDAwMDAwMik7CisJbnZfd3IzMihkZXYsIDB4NDE5YzA0LCAweDAwMDAwMDA2KTsKKwludl93cjMyKGRldiwgMHg0MTljMDgsIDB4MDAwMDAwMDIpOworCW52X3dyMzIoZGV2LCAweDQxOWMyMCwgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDE5Y2JjLCAweDI4MTM3NjA2KTsKKwludl93cjMyKGRldiwgMHg0MTljZTgsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQxOWNmNCwgMHgwMDAwMDE4Myk7CisJbnZfd3IzMihkZXYsIDB4NDE5ZDIwLCAweDAyMTgwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MTlkMjQsIDB4MDAwMDFmZmYpOworCW52X3dyMzIoZGV2LCAweDQxOWUwNCwgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDE5ZTA4LCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MTllMGMsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQxOWUxMCwgMHgwMDAwMDAwMik7CisJbnZfd3IzMihkZXYsIDB4NDE5ZTQ0LCAweDAwMWJlZmYyKTsKKwludl93cjMyKGRldiwgMHg0MTllNDgsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQxOWU0YywgMHgwMDAwMDAwZik7CisJbnZfd3IzMihkZXYsIDB4NDE5ZTUwLCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MTllNTQsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQxOWU1OCwgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDE5ZTVjLCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MTllNjAsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQxOWU2NCwgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDE5ZTY4LCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MTllNmMsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQxOWU3MCwgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDE5ZTc0LCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MTllNzgsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQxOWU3YywgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDE5ZTgwLCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MTllODQsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQxOWU4OCwgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDE5ZThjLCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MTllOTAsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQxOWU5OCwgMHgwMDAwMDAwMCk7CisJaWYgKGRldl9wcml2LT5jaGlwc2V0ICE9IDB4YzApCisJCW52X3dyMzIoZGV2LCAweDQxOWVlMCwgMHgwMDAxMTExMCk7CisJbnZfd3IzMihkZXYsIDB4NDE5ZjUwLCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MTlmNTQsIDB4MDAwMDAwMDApOworCWlmIChkZXZfcHJpdi0+Y2hpcHNldCAhPSAweGMwKQorCQludl93cjMyKGRldiwgMHg0MTlmNTgsIDB4MDAwMDAwMDApOworfQorCitpbnQKK252YzBfZ3JjdHhfZ2VuZXJhdGUoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbikKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBjaGFuLT5kZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBudmMwX2dyYXBoX3ByaXYgKnByaXYgPSBkZXZfcHJpdi0+ZW5naW5lLmdyYXBoLnByaXY7CisJc3RydWN0IG52YzBfZ3JhcGhfY2hhbiAqZ3JjaCA9IGNoYW4tPnBncmFwaF9jdHg7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNoYW4tPmRldjsKKwlpbnQgaSwgZ3BjLCB0cCwgaWQ7CisJdTMyIHIwMDAyNjAsIHRtcDsKKworCXIwMDAyNjAgPSBudl9yZDMyKGRldiwgMHgwMDAyNjApOworCW52X3dyMzIoZGV2LCAweDAwMDI2MCwgcjAwMDI2MCAmIH4xKTsKKwludl93cjMyKGRldiwgMHg0MDAyMDgsIDB4MDAwMDAwMDApOworCisJbnZjMF9ncmN0eF9nZW5lcmF0ZV9kaXNwYXRjaChkZXYpOworCW52YzBfZ3JjdHhfZ2VuZXJhdGVfbWFjcm8oZGV2KTsKKwludmMwX2dyY3R4X2dlbmVyYXRlX20ybWYoZGV2KTsKKwludmMwX2dyY3R4X2dlbmVyYXRlX3VuazQ3eHgoZGV2KTsKKwludmMwX2dyY3R4X2dlbmVyYXRlX3NoYWRlcnMoZGV2KTsKKwludmMwX2dyY3R4X2dlbmVyYXRlX3VuazYweHgoZGV2KTsKKwludmMwX2dyY3R4X2dlbmVyYXRlX3VuazY0eHgoZGV2KTsKKwludmMwX2dyY3R4X2dlbmVyYXRlX3RwYnVzKGRldik7CisJbnZjMF9ncmN0eF9nZW5lcmF0ZV9jY2FjaGUoZGV2KTsKKwludmMwX2dyY3R4X2dlbmVyYXRlX3JvcChkZXYpOworCW52YzBfZ3JjdHhfZ2VuZXJhdGVfZ3BjKGRldik7CisJbnZjMF9ncmN0eF9nZW5lcmF0ZV90cChkZXYpOworCisJbnZfd3IzMihkZXYsIDB4NDA0MTU0LCAweDAwMDAwMDAwKTsKKworCS8qIGZ1YyAibW1pbyBsaXN0IiB3cml0ZXMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgZ3JjaC0+bW1pb19uciAqIDg7IGkgKz0gOCkgeworCQl1MzIgcmVnID0gbnZfcm8zMihncmNoLT5tbWlvLCBpICsgMCk7CisJCW52X3dyMzIoZGV2LCByZWcsIG52X3JvMzIoZ3JjaC0+bW1pbywgaSArIDQpKTsKKwl9CisKKwlmb3IgKHRwID0gMCwgaWQgPSAwOyB0cCA8IDQ7IHRwKyspIHsKKwkJZm9yIChncGMgPSAwOyBncGMgPCBwcml2LT5ncGNfbnI7IGdwYysrKSB7CisJCQlpZiAodHAgPD0gcHJpdi0+dHBfbnJbZ3BjXSkgeworCQkJCW52X3dyMzIoZGV2LCBUUF9VTklUKGdwYywgdHAsIDB4Njk4KSwgaWQpOworCQkJCW52X3dyMzIoZGV2LCBUUF9VTklUKGdwYywgdHAsIDB4NGU4KSwgaWQpOworCQkJCW52X3dyMzIoZGV2LCBHUENfVU5JVChncGMsIDB4MGMxMCArIHRwICogNCksIGlkKTsKKwkJCQludl93cjMyKGRldiwgVFBfVU5JVChncGMsIHRwLCAweDA4OCksIGlkKTsKKwkJCQlpZCsrOworCQkJfQorCisJCQludl93cjMyKGRldiwgR1BDX1VOSVQoZ3BjLCAweDBjMDgpLCBwcml2LT50cF9ucltncGNdKTsKKwkJCW52X3dyMzIoZGV2LCBHUENfVU5JVChncGMsIDB4MGM4YyksIHByaXYtPnRwX25yW2dwY10pOworCQl9CisJfQorCisJdG1wID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgcHJpdi0+Z3BjX25yOyBpKyspCisJCXRtcCB8PSBwcml2LT50cF9ucltpXSA8PCAoaSAqIDQpOworCW52X3dyMzIoZGV2LCAweDQwNjAyOCwgdG1wKTsKKwludl93cjMyKGRldiwgMHg0MDU4NzAsIHRtcCk7CisKKwludl93cjMyKGRldiwgMHg0MDYwMmMsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQwNTg3NCwgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDA2MDMwLCAweDAwMDAwMDAwKTsKKwludl93cjMyKGRldiwgMHg0MDU4NzgsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDQwNjAzNCwgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDA1ODdjLCAweDAwMDAwMDAwKTsKKworCWlmICgxKSB7CisJCWNvbnN0IHU4IGNoaXBzZXRfdHBfbWF4W10gPSB7IDE2LCAwLCAwLCA0LCA4IH07CisJCXU4IG1heCA9IGNoaXBzZXRfdHBfbWF4W2Rldl9wcml2LT5jaGlwc2V0ICYgMHgwZl07CisJCXU4IHRwbnJbR1BDX01BWF07CisJCXU4IGRhdGFbMzJdOworCisJCW1lbWNweSh0cG5yLCBwcml2LT50cF9uciwgc2l6ZW9mKHByaXYtPnRwX25yKSk7CisJCW1lbXNldChkYXRhLCAweDFmLCBzaXplb2YoZGF0YSkpOworCisJCWdwYyA9IC0xOworCQlmb3IgKHRwID0gMDsgdHAgPCBwcml2LT50cF90b3RhbDsgdHArKykgeworCQkJZG8geworCQkJCWdwYyA9IChncGMgKyAxKSAlIHByaXYtPmdwY19ucjsKKwkJCX0gd2hpbGUgKCF0cG5yW2dwY10pOworCQkJdHBucltncGNdLS07CisJCQlkYXRhW3RwXSA9IGdwYzsKKwkJfQorCisJCWZvciAoaSA9IDA7IGkgPCBtYXggLyA0OyBpKyspCisJCQludl93cjMyKGRldiwgMHg0MDYwYTggKyAoaSAqIDQpLCAoKHUzMiAqKWRhdGEpW2ldKTsKKwl9CisKKwlpZiAoMSkgeworCQl1MzIgZGF0YVs2XSA9IHt9LCBkYXRhMlsyXSA9IHt9OworCQl1OCB0cG5yW0dQQ19NQVhdOworCQl1OCBzaGlmdCwgbnRwY3Y7CisKKwkJLyogY2FsY3VsYXRlIGZpcnN0IHNldCBvZiBtYWdpY3MgKi8KKwkJbWVtY3B5KHRwbnIsIHByaXYtPnRwX25yLCBzaXplb2YocHJpdi0+dHBfbnIpKTsKKworCQlmb3IgKHRwID0gMDsgdHAgPCBwcml2LT50cF90b3RhbDsgdHArKykgeworCQkJZG8geworCQkJCWdwYyA9IChncGMgKyAxKSAlIHByaXYtPmdwY19ucjsKKwkJCX0gd2hpbGUgKCF0cG5yW2dwY10pOworCQkJdHBucltncGNdLS07CisKKwkJCWRhdGFbdHAgLyA2XSB8PSBncGMgPDwgKCh0cCAlIDYpICogNSk7CisJCX0KKworCQlmb3IgKDsgdHAgPCAzMjsgdHArKykKKwkJCWRhdGFbdHAgLyA2XSB8PSA3IDw8ICgodHAgJSA2KSAqIDUpOworCisJCS8qIGFuZCB0aGUgc2Vjb25kLi4uICovCisJCXNoaWZ0ID0gMDsKKwkJbnRwY3YgPSBwcml2LT50cF90b3RhbDsKKwkJd2hpbGUgKCEobnRwY3YgJiAoMSA8PCA0KSkpIHsKKwkJCW50cGN2IDw8PSAxOworCQkJc2hpZnQrKzsKKwkJfQorCisJCWRhdGEyWzBdICA9IChudHBjdiA8PCAxNik7CisJCWRhdGEyWzBdIHw9IChzaGlmdCA8PCAyMSk7CisJCWRhdGEyWzBdIHw9ICgoKDEgPDwgKDAgKyA1KSkgJSBudHBjdikgPDwgMjQpOworCQlmb3IgKGkgPSAxOyBpIDwgNzsgaSsrKQorCQkJZGF0YTJbMV0gfD0gKCgxIDw8IChpICsgNSkpICUgbnRwY3YpIDw8ICgoaSAtIDEpICogNSk7CisKKwkJLy8gR1BDX0JST0FEQ0FTVAorCQludl93cjMyKGRldiwgMHg0MThiYjgsIChwcml2LT50cF90b3RhbCA8PCA4KSB8CisJCQkJCXByaXYtPm1hZ2ljX25vdF9yb3BfbnIpOworCQlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQkJbnZfd3IzMihkZXYsIDB4NDE4YjA4ICsgKGkgKiA0KSwgZGF0YVtpXSk7CisKKwkJLy8gR1BDX0JST0FEQ0FTVC5UUF9CUk9BRENBU1QKKwkJbnZfd3IzMihkZXYsIDB4NDE5YmQwLCAocHJpdi0+dHBfdG90YWwgPDwgOCkgfAorCQkJCSAgICAgICBwcml2LT5tYWdpY19ub3Rfcm9wX25yIHwKKwkJCQkgICAgICAgZGF0YTJbMF0pOworCQludl93cjMyKGRldiwgMHg0MTliZTQsIGRhdGEyWzFdKTsKKwkJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwkJCW52X3dyMzIoZGV2LCAweDQxOWIwMCArIChpICogNCksIGRhdGFbaV0pOworCisJCS8vIFVOSzc4eHgKKwkJbnZfd3IzMihkZXYsIDB4NDA3OGJjLCAocHJpdi0+dHBfdG90YWwgPDwgOCkgfAorCQkJCQlwcml2LT5tYWdpY19ub3Rfcm9wX25yKTsKKwkJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwkJCW52X3dyMzIoZGV2LCAweDQwNzgwYyArIChpICogNCksIGRhdGFbaV0pOworCX0KKworCWlmICgxKSB7CisJCXUzMiB0cF9tYXNrID0gMCwgdHBfc2V0ID0gMDsKKwkJdTggIHRwbnJbR1BDX01BWF07CisKKwkJbWVtY3B5KHRwbnIsIHByaXYtPnRwX25yLCBzaXplb2YocHJpdi0+dHBfbnIpKTsKKwkJZm9yIChncGMgPSAwOyBncGMgPCBwcml2LT5ncGNfbnI7IGdwYysrKQorCQkJdHBfbWFzayB8PSAoKDEgPDwgcHJpdi0+dHBfbnJbZ3BjXSkgLSAxKSA8PCAoZ3BjICogOCk7CisKKwkJZ3BjID0gLTE7CisJCWZvciAoaSA9IDAsIGdwYyA9IC0xOyBpIDwgMzI7IGkrKykgeworCQkJaW50IGx0cCA9IGkgKiAocHJpdi0+dHBfdG90YWwgLSAxKSAvIDMyOworCQkJCisJCQlkbyB7CisJCQkJZ3BjID0gKGdwYyArIDEpICUgcHJpdi0+Z3BjX25yOworCQkJfSB3aGlsZSAoIXRwbnJbZ3BjXSk7CisJCQl0cCA9IHByaXYtPnRwX25yW2dwY10gLSB0cG5yW2dwY10tLTsKKworCQkJdHBfc2V0IHw9IDEgPDwgKChncGMgKiA4KSArIHRwKTsKKworCQkJZG8geworCQkJCW52X3dyMzIoZGV2LCAweDQwNjgwMCArIChpICogMHgyMCksIHRwX3NldCk7CisJCQkJdHBfc2V0IF49IHRwX21hc2s7CisJCQkJbnZfd3IzMihkZXYsIDB4NDA2YzAwICsgKGkgKiAweDIwKSwgdHBfc2V0KTsKKwkJCQl0cF9zZXQgXj0gdHBfbWFzazsKKwkJCX0gd2hpbGUgKGx0cCA9PSAoKytpICogKHByaXYtPnRwX3RvdGFsIC0gMSkgLyAzMikpOworCQkJaS0tOworCQl9CisJfQorCisJbnZfd3IzMihkZXYsIDB4NDAwMjA4LCAweDgwMDAwMDAwKTsKKworCW52X2ljbWQoZGV2LCAweDAwMDAxMDAwLCAweDAwMDAwMDA0KTsKKwludl9pY21kKGRldiwgMHgwMDAwMDBhOSwgMHgwMDAwZmZmZik7CisJbnZfaWNtZChkZXYsIDB4MDAwMDAwMzgsIDB4MGZhYzY4ODEpOworCW52X2ljbWQoZGV2LCAweDAwMDAwMDNkLCAweDAwMDAwMDAxKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDBlOCwgMHgwMDAwMDQwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDAwZTksIDB4MDAwMDA0MDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwMGVhLCAweDAwMDAwNDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDBlYiwgMHgwMDAwMDQwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDAwZWMsIDB4MDAwMDA0MDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwMGVkLCAweDAwMDAwNDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDBlZSwgMHgwMDAwMDQwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDAwZWYsIDB4MDAwMDA0MDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwMDc4LCAweDAwMDAwMzAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDA3OSwgMHgwMDAwMDMwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDAwN2EsIDB4MDAwMDAzMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwMDdiLCAweDAwMDAwMzAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDA3YywgMHgwMDAwMDMwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDAwN2QsIDB4MDAwMDAzMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwMDdlLCAweDAwMDAwMzAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDA3ZiwgMHgwMDAwMDMwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDAwNTAsIDB4MDAwMDAwMTEpOworCW52X2ljbWQoZGV2LCAweDAwMDAwMDU4LCAweDAwMDAwMDA4KTsKKwludl9pY21kKGRldiwgMHgwMDAwMDA1OSwgMHgwMDAwMDAwOCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDAwNWEsIDB4MDAwMDAwMDgpOworCW52X2ljbWQoZGV2LCAweDAwMDAwMDViLCAweDAwMDAwMDA4KTsKKwludl9pY21kKGRldiwgMHgwMDAwMDA1YywgMHgwMDAwMDAwOCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDAwNWQsIDB4MDAwMDAwMDgpOworCW52X2ljbWQoZGV2LCAweDAwMDAwMDVlLCAweDAwMDAwMDA4KTsKKwludl9pY21kKGRldiwgMHgwMDAwMDA1ZiwgMHgwMDAwMDAwOCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDAyMDgsIDB4MDAwMDAwMDEpOworCW52X2ljbWQoZGV2LCAweDAwMDAwMjA5LCAweDAwMDAwMDAxKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDIwYSwgMHgwMDAwMDAwMSk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDAyMGIsIDB4MDAwMDAwMDEpOworCW52X2ljbWQoZGV2LCAweDAwMDAwMjBjLCAweDAwMDAwMDAxKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDIwZCwgMHgwMDAwMDAwMSk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDAyMGUsIDB4MDAwMDAwMDEpOworCW52X2ljbWQoZGV2LCAweDAwMDAwMjBmLCAweDAwMDAwMDAxKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDA4MSwgMHgwMDAwMDAwMSk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDAwODUsIDB4MDAwMDAwMDQpOworCW52X2ljbWQoZGV2LCAweDAwMDAwMDg4LCAweDAwMDAwNDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDA5MCwgMHgwMDAwMDMwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDAwOTgsIDB4MDAwMDEwMDEpOworCW52X2ljbWQoZGV2LCAweDAwMDAwMGUzLCAweDAwMDAwMDAxKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDBkYSwgMHgwMDAwMDAwMSk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDAwZjgsIDB4MDAwMDAwMDMpOworCW52X2ljbWQoZGV2LCAweDAwMDAwMGZhLCAweDAwMDAwMDAxKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDA5ZiwgMHgwMDAwZmZmZik7CisJbnZfaWNtZChkZXYsIDB4MDAwMDAwYTAsIDB4MDAwMGZmZmYpOworCW52X2ljbWQoZGV2LCAweDAwMDAwMGExLCAweDAwMDBmZmZmKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDBhMiwgMHgwMDAwZmZmZik7CisJbnZfaWNtZChkZXYsIDB4MDAwMDAwYjEsIDB4MDAwMDAwMDEpOworCW52X2ljbWQoZGV2LCAweDAwMDAwMGIyLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDBiMywgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDAwYjQsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwMGI1LCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDBiNiwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDAwYjcsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwMGI4LCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDBiOSwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDAwYmEsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwMGJiLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDBiYywgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDAwYmQsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwMGJlLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDBiZiwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDAwYzAsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwMGMxLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDBjMiwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDAwYzMsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwMGM0LCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDBjNSwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDAwYzYsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwMGM3LCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDBjOCwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDAwYzksIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwMGNhLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDBjYiwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDAwY2MsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwMGNkLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDBjZSwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDAwY2YsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwMGQwLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDBkMSwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDAwZDIsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwMGQzLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDBkNCwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDAwZDUsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwMGQ2LCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDBkNywgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDAwZDgsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwMGQ5LCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDIxMCwgMHgwMDAwMDA0MCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDAyMTEsIDB4MDAwMDAwNDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwMjEyLCAweDAwMDAwMDQwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDIxMywgMHgwMDAwMDA0MCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDAyMTQsIDB4MDAwMDAwNDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwMjE1LCAweDAwMDAwMDQwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDIxNiwgMHgwMDAwMDA0MCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDAyMTcsIDB4MDAwMDAwNDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwMjE4LCAweDAwMDBjMDgwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDIxOSwgMHgwMDAwYzA4MCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDAyMWEsIDB4MDAwMGMwODApOworCW52X2ljbWQoZGV2LCAweDAwMDAwMjFiLCAweDAwMDBjMDgwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDIxYywgMHgwMDAwYzA4MCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDAyMWQsIDB4MDAwMGMwODApOworCW52X2ljbWQoZGV2LCAweDAwMDAwMjFlLCAweDAwMDBjMDgwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDIxZiwgMHgwMDAwYzA4MCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDAwYWQsIDB4MDAwMDAxM2UpOworCW52X2ljbWQoZGV2LCAweDAwMDAwMGUxLCAweDAwMDAwMDEwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDI5MCwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDAyOTEsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwMjkyLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDI5MywgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDAyOTQsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwMjk1LCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDI5NiwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDAyOTcsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwMjk4LCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDI5OSwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDAyOWEsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwMjliLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDI5YywgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDAyOWQsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwMjllLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDI5ZiwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDAzYjAsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwM2IxLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDNiMiwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDAzYjMsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwM2I0LCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDNiNSwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDAzYjYsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwM2I3LCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDNiOCwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDAzYjksIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwM2JhLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDNiYiwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDAzYmMsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwM2JkLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDNiZSwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDAzYmYsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwMmEwLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDJhMSwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDAyYTIsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwMmEzLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDJhNCwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDAyYTUsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwMmE2LCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDJhNywgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDAyYTgsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwMmE5LCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDJhYSwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDAyYWIsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwMmFjLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDJhZCwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDAyYWUsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwMmFmLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDQyMCwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA0MjEsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwNDIyLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDQyMywgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA0MjQsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwNDI1LCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDQyNiwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA0MjcsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwNDI4LCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDQyOSwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA0MmEsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwNDJiLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDQyYywgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA0MmQsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwNDJlLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDQyZiwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDAyYjAsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwMmIxLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDJiMiwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDAyYjMsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwMmI0LCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDJiNSwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDAyYjYsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwMmI3LCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDJiOCwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDAyYjksIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwMmJhLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDJiYiwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDAyYmMsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwMmJkLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDJiZSwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDAyYmYsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwNDMwLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDQzMSwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA0MzIsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwNDMzLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDQzNCwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA0MzUsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwNDM2LCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDQzNywgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA0MzgsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwNDM5LCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDQzYSwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA0M2IsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwNDNjLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDQzZCwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA0M2UsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwNDNmLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDJjMCwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDAyYzEsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwMmMyLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDJjMywgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDAyYzQsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwMmM1LCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDJjNiwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDAyYzcsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwMmM4LCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDJjOSwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDAyY2EsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwMmNiLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDJjYywgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDAyY2QsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwMmNlLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDJjZiwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA0ZDAsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwNGQxLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDRkMiwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA0ZDMsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwNGQ0LCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDRkNSwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA0ZDYsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwNGQ3LCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDRkOCwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA0ZDksIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwNGRhLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDRkYiwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA0ZGMsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwNGRkLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDRkZSwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA0ZGYsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwNzIwLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDcyMSwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA3MjIsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwNzIzLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDcyNCwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA3MjUsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwNzI2LCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDcyNywgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA3MjgsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwNzI5LCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDcyYSwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA3MmIsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwNzJjLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDcyZCwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA3MmUsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwNzJmLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDhjMCwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA4YzEsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwOGMyLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDhjMywgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA4YzQsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwOGM1LCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDhjNiwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA4YzcsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwOGM4LCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDhjOSwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA4Y2EsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwOGNiLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDhjYywgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA4Y2QsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwOGNlLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDhjZiwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA4OTAsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwODkxLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDg5MiwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA4OTMsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwODk0LCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDg5NSwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA4OTYsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwODk3LCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDg5OCwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA4OTksIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwODlhLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDg5YiwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA4OWMsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwODlkLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDg5ZSwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA4OWYsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwOGUwLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDhlMSwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA4ZTIsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwOGUzLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDhlNCwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA4ZTUsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwOGU2LCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDhlNywgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA4ZTgsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwOGU5LCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDhlYSwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA4ZWIsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwOGVjLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDhlZCwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA4ZWUsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwOGVmLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDhhMCwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA4YTEsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwOGEyLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDhhMywgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA4YTQsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwOGE1LCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDhhNiwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA4YTcsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwOGE4LCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDhhOSwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA4YWEsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwOGFiLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDhhYywgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA4YWQsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwOGFlLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDhhZiwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA4ZjAsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwOGYxLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDhmMiwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA4ZjMsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwOGY0LCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDhmNSwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA4ZjYsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwOGY3LCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDhmOCwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA4ZjksIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwOGZhLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDhmYiwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA4ZmMsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwOGZkLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDhmZSwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA4ZmYsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwOTRjLCAweDAwMDAwMGZmKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDk0ZCwgMHhmZmZmZmZmZik7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA5NGUsIDB4MDAwMDAwMDIpOworCW52X2ljbWQoZGV2LCAweDAwMDAwMmVjLCAweDAwMDAwMDAxKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDMwMywgMHgwMDAwMDAwMSk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDAyZTYsIDB4MDAwMDAwMDEpOworCW52X2ljbWQoZGV2LCAweDAwMDAwNDY2LCAweDAwMDAwMDUyKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDMwMSwgMHgzZjgwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDAzMDQsIDB4MzAyMDEwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwMzA1LCAweDcwNjA1MDQwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDMwNiwgMHhiOGE4OTg4OCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDAzMDcsIDB4ZjhlOGQ4YzgpOworCW52X2ljbWQoZGV2LCAweDAwMDAwMzBhLCAweDAwZmZmZjAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDMwYiwgMHgwMDAwMDAxYSk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDAzMGMsIDB4MDAwMDAwMDEpOworCW52X2ljbWQoZGV2LCAweDAwMDAwMzE4LCAweDAwMDAwMDAxKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDM0MCwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDAzNzUsIDB4MDAwMDAwMDEpOworCW52X2ljbWQoZGV2LCAweDAwMDAwMzUxLCAweDAwMDAwMTAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDM3ZCwgMHgwMDAwMDAwNik7CisJbnZfaWNtZChkZXYsIDB4MDAwMDAzYTAsIDB4MDAwMDAwMDIpOworCW52X2ljbWQoZGV2LCAweDAwMDAwM2FhLCAweDAwMDAwMDAxKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDNhOSwgMHgwMDAwMDAwMSk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDAzODAsIDB4MDAwMDAwMDEpOworCW52X2ljbWQoZGV2LCAweDAwMDAwMzYwLCAweDAwMDAwMDQwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDM2NiwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDAzNjcsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwMzY4LCAweDAwMDAxZmZmKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDM3MCwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDAzNzEsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwMzcyLCAweDAwM2ZmZmZmKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDM3YSwgMHgwMDAwMDAxMik7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA1ZTAsIDB4MDAwMDAwMjIpOworCW52X2ljbWQoZGV2LCAweDAwMDAwNWUxLCAweDAwMDAwMDIyKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDVlMiwgMHgwMDAwMDAyMik7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA1ZTMsIDB4MDAwMDAwMjIpOworCW52X2ljbWQoZGV2LCAweDAwMDAwNWU0LCAweDAwMDAwMDIyKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDYxOSwgMHgwMDAwMDAwMyk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA4MTEsIDB4MDAwMDAwMDMpOworCW52X2ljbWQoZGV2LCAweDAwMDAwODEyLCAweDAwMDAwMDA0KTsKKwludl9pY21kKGRldiwgMHgwMDAwMDgxMywgMHgwMDAwMDAwNik7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA4MTQsIDB4MDAwMDAwMDgpOworCW52X2ljbWQoZGV2LCAweDAwMDAwODE1LCAweDAwMDAwMDBiKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDgwMCwgMHgwMDAwMDAwMSk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA4MDEsIDB4MDAwMDAwMDEpOworCW52X2ljbWQoZGV2LCAweDAwMDAwODAyLCAweDAwMDAwMDAxKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDgwMywgMHgwMDAwMDAwMSk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA4MDQsIDB4MDAwMDAwMDEpOworCW52X2ljbWQoZGV2LCAweDAwMDAwODA1LCAweDAwMDAwMDAxKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDYzMiwgMHgwMDAwMDAwMSk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA2MzMsIDB4MDAwMDAwMDIpOworCW52X2ljbWQoZGV2LCAweDAwMDAwNjM0LCAweDAwMDAwMDAzKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDYzNSwgMHgwMDAwMDAwNCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA2NTQsIDB4M2Y4MDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwNjU3LCAweDNmODAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDY1NSwgMHgzZjgwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA2NTYsIDB4M2Y4MDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwNmNkLCAweDNmODAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDdmNSwgMHgzZjgwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA3ZGMsIDB4MzkyOTE5MDkpOworCW52X2ljbWQoZGV2LCAweDAwMDAwN2RkLCAweDc5Njk1OTQ5KTsKKwludl9pY21kKGRldiwgMHgwMDAwMDdkZSwgMHhiOWE5OTk4OSk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA3ZGYsIDB4ZjllOWQ5YzkpOworCW52X2ljbWQoZGV2LCAweDAwMDAwN2U4LCAweDAwMDAzMjEwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDdlOSwgMHgwMDAwNzY1NCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA3ZWEsIDB4MDAwMDAwOTgpOworCW52X2ljbWQoZGV2LCAweDAwMDAwN2VjLCAweDM5MjkxOTA5KTsKKwludl9pY21kKGRldiwgMHgwMDAwMDdlZCwgMHg3OTY5NTk0OSk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA3ZWUsIDB4YjlhOTk5ODkpOworCW52X2ljbWQoZGV2LCAweDAwMDAwN2VmLCAweGY5ZTlkOWM5KTsKKwludl9pY21kKGRldiwgMHgwMDAwMDdmMCwgMHgwMDAwMzIxMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA3ZjEsIDB4MDAwMDc2NTQpOworCW52X2ljbWQoZGV2LCAweDAwMDAwN2YyLCAweDAwMDAwMDk4KTsKKwludl9pY21kKGRldiwgMHgwMDAwMDVhNSwgMHgwMDAwMDAwMSk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA5ODAsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwOTgxLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDk4MiwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA5ODMsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwOTg0LCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDk4NSwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA5ODYsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwOTg3LCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDk4OCwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA5ODksIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwOThhLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDk4YiwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA5OGMsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwOThkLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDk4ZSwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA5OGYsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwOTkwLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDk5MSwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA5OTIsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwOTkzLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDk5NCwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA5OTUsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwOTk2LCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDk5NywgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA5OTgsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwOTk5LCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDk5YSwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA5OWIsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwOTljLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDk5ZCwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA5OWUsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwOTlmLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDlhMCwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA5YTEsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwOWEyLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDlhMywgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA5YTQsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwOWE1LCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDlhNiwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA5YTcsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwOWE4LCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDlhOSwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA5YWEsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwOWFiLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDlhYywgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA5YWQsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwOWFlLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDlhZiwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA5YjAsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwOWIxLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDliMiwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA5YjMsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwOWI0LCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDliNSwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA5YjYsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwOWI3LCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDliOCwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA5YjksIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwOWJhLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDliYiwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA5YmMsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwOWJkLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDliZSwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA5YmYsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwOWMwLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDljMSwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA5YzIsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwOWMzLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDljNCwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA5YzUsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwOWM2LCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDljNywgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA5YzgsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwOWM5LCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDljYSwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA5Y2IsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwOWNjLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDljZCwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA5Y2UsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwOWNmLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDlkMCwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA5ZDEsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwOWQyLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDlkMywgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA5ZDQsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwOWQ1LCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDlkNiwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA5ZDcsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwOWQ4LCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDlkOSwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA5ZGEsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwOWRiLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDlkYywgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA5ZGQsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwOWRlLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDlkZiwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA5ZTAsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwOWUxLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDllMiwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA5ZTMsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwOWU0LCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDllNSwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA5ZTYsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwOWU3LCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDllOCwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA5ZTksIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwOWVhLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDllYiwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA5ZWMsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwOWVkLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDllZSwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA5ZWYsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwOWYwLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDlmMSwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA5ZjIsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwOWYzLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDlmNCwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA5ZjUsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwOWY2LCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDlmNywgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA5ZjgsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwOWY5LCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDlmYSwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA5ZmIsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwOWZjLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDlmZCwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA5ZmUsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwOWZmLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDQ2OCwgMHgwMDAwMDAwNCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA0NmMsIDB4MDAwMDAwMDEpOworCW52X2ljbWQoZGV2LCAweDAwMDAwNDcwLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDQ3MSwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA0NzIsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwNDczLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDQ3NCwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA0NzUsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwNDc2LCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDQ3NywgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA0NzgsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwNDc5LCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDQ3YSwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA0N2IsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwNDdjLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDQ3ZCwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA0N2UsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwNDdmLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDQ4MCwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA0ODEsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwNDgyLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDQ4MywgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA0ODQsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwNDg1LCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDQ4NiwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA0ODcsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwNDg4LCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDQ4OSwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA0OGEsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwNDhiLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDQ4YywgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA0OGQsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwNDhlLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDQ4ZiwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA0OTAsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwNDkxLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDQ5MiwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA0OTMsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwNDk0LCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDQ5NSwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA0OTYsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwNDk3LCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDQ5OCwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA0OTksIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwNDlhLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDQ5YiwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA0OWMsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwNDlkLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDQ5ZSwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA0OWYsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwNGEwLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDRhMSwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA0YTIsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwNGEzLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDRhNCwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA0YTUsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwNGE2LCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDRhNywgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA0YTgsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwNGE5LCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDRhYSwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA0YWIsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwNGFjLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDRhZCwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA0YWUsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwNGFmLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDRiMCwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA0YjEsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwNGIyLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDRiMywgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA0YjQsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwNGI1LCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDRiNiwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA0YjcsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwNGI4LCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDRiOSwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA0YmEsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwNGJiLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDRiYywgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA0YmQsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwNGJlLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDRiZiwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA0YzAsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwNGMxLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDRjMiwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA0YzMsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwNGM0LCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDRjNSwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA0YzYsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwNGM3LCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDRjOCwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA0YzksIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwNGNhLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDRjYiwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA0Y2MsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwNGNkLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDRjZSwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA0Y2YsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwNTEwLCAweDNmODAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDUxMSwgMHgzZjgwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA1MTIsIDB4M2Y4MDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwNTEzLCAweDNmODAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDUxNCwgMHgzZjgwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA1MTUsIDB4M2Y4MDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwNTE2LCAweDNmODAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDUxNywgMHgzZjgwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA1MTgsIDB4M2Y4MDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwNTE5LCAweDNmODAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDUxYSwgMHgzZjgwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA1MWIsIDB4M2Y4MDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwNTFjLCAweDNmODAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDUxZCwgMHgzZjgwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA1MWUsIDB4M2Y4MDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwNTFmLCAweDNmODAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDUyMCwgMHgwMDAwMDJiNik7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA1MjksIDB4MDAwMDAwMDEpOworCW52X2ljbWQoZGV2LCAweDAwMDAwNTMwLCAweGZmZmYwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDUzMSwgMHhmZmZmMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA1MzIsIDB4ZmZmZjAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwNTMzLCAweGZmZmYwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDUzNCwgMHhmZmZmMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA1MzUsIDB4ZmZmZjAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwNTM2LCAweGZmZmYwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDUzNywgMHhmZmZmMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA1MzgsIDB4ZmZmZjAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwNTM5LCAweGZmZmYwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDUzYSwgMHhmZmZmMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA1M2IsIDB4ZmZmZjAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwNTNjLCAweGZmZmYwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDUzZCwgMHhmZmZmMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA1M2UsIDB4ZmZmZjAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwNTNmLCAweGZmZmYwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDU4NSwgMHgwMDAwMDAzZik7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA1NzYsIDB4MDAwMDAwMDMpOworCW52X2ljbWQoZGV2LCAweDAwMDAwNTg2LCAweDAwMDAwMDQwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDU4MiwgMHgwMDAwMDA4MCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA1ODMsIDB4MDAwMDAwODApOworCW52X2ljbWQoZGV2LCAweDAwMDAwNWMyLCAweDAwMDAwMDAxKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDYzOCwgMHgwMDAwMDAwMSk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA2MzksIDB4MDAwMDAwMDEpOworCW52X2ljbWQoZGV2LCAweDAwMDAwNjNhLCAweDAwMDAwMDAyKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDYzYiwgMHgwMDAwMDAwMSk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA2M2MsIDB4MDAwMDAwMDEpOworCW52X2ljbWQoZGV2LCAweDAwMDAwNjNkLCAweDAwMDAwMDAyKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDYzZSwgMHgwMDAwMDAwMSk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA4YjgsIDB4MDAwMDAwMDEpOworCW52X2ljbWQoZGV2LCAweDAwMDAwOGI5LCAweDAwMDAwMDAxKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDhiYSwgMHgwMDAwMDAwMSk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA4YmIsIDB4MDAwMDAwMDEpOworCW52X2ljbWQoZGV2LCAweDAwMDAwOGJjLCAweDAwMDAwMDAxKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDhiZCwgMHgwMDAwMDAwMSk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA4YmUsIDB4MDAwMDAwMDEpOworCW52X2ljbWQoZGV2LCAweDAwMDAwOGJmLCAweDAwMDAwMDAxKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDkwMCwgMHgwMDAwMDAwMSk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA5MDEsIDB4MDAwMDAwMDEpOworCW52X2ljbWQoZGV2LCAweDAwMDAwOTAyLCAweDAwMDAwMDAxKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDkwMywgMHgwMDAwMDAwMSk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA5MDQsIDB4MDAwMDAwMDEpOworCW52X2ljbWQoZGV2LCAweDAwMDAwOTA1LCAweDAwMDAwMDAxKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDkwNiwgMHgwMDAwMDAwMSk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA5MDcsIDB4MDAwMDAwMDEpOworCW52X2ljbWQoZGV2LCAweDAwMDAwOTA4LCAweDAwMDAwMDAyKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDkwOSwgMHgwMDAwMDAwMik7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA5MGEsIDB4MDAwMDAwMDIpOworCW52X2ljbWQoZGV2LCAweDAwMDAwOTBiLCAweDAwMDAwMDAyKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDkwYywgMHgwMDAwMDAwMik7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA5MGQsIDB4MDAwMDAwMDIpOworCW52X2ljbWQoZGV2LCAweDAwMDAwOTBlLCAweDAwMDAwMDAyKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDkwZiwgMHgwMDAwMDAwMik7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA5MTAsIDB4MDAwMDAwMDEpOworCW52X2ljbWQoZGV2LCAweDAwMDAwOTExLCAweDAwMDAwMDAxKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDkxMiwgMHgwMDAwMDAwMSk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA5MTMsIDB4MDAwMDAwMDEpOworCW52X2ljbWQoZGV2LCAweDAwMDAwOTE0LCAweDAwMDAwMDAxKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDkxNSwgMHgwMDAwMDAwMSk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA5MTYsIDB4MDAwMDAwMDEpOworCW52X2ljbWQoZGV2LCAweDAwMDAwOTE3LCAweDAwMDAwMDAxKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDkxOCwgMHgwMDAwMDAwMSk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA5MTksIDB4MDAwMDAwMDEpOworCW52X2ljbWQoZGV2LCAweDAwMDAwOTFhLCAweDAwMDAwMDAxKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDkxYiwgMHgwMDAwMDAwMSk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA5MWMsIDB4MDAwMDAwMDEpOworCW52X2ljbWQoZGV2LCAweDAwMDAwOTFkLCAweDAwMDAwMDAxKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDkxZSwgMHgwMDAwMDAwMSk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA5MWYsIDB4MDAwMDAwMDEpOworCW52X2ljbWQoZGV2LCAweDAwMDAwOTIwLCAweDAwMDAwMDAyKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDkyMSwgMHgwMDAwMDAwMik7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA5MjIsIDB4MDAwMDAwMDIpOworCW52X2ljbWQoZGV2LCAweDAwMDAwOTIzLCAweDAwMDAwMDAyKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDkyNCwgMHgwMDAwMDAwMik7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA5MjUsIDB4MDAwMDAwMDIpOworCW52X2ljbWQoZGV2LCAweDAwMDAwOTI2LCAweDAwMDAwMDAyKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDkyNywgMHgwMDAwMDAwMik7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA5MjgsIDB4MDAwMDAwMDEpOworCW52X2ljbWQoZGV2LCAweDAwMDAwOTI5LCAweDAwMDAwMDAxKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDkyYSwgMHgwMDAwMDAwMSk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA5MmIsIDB4MDAwMDAwMDEpOworCW52X2ljbWQoZGV2LCAweDAwMDAwOTJjLCAweDAwMDAwMDAxKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDkyZCwgMHgwMDAwMDAwMSk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA5MmUsIDB4MDAwMDAwMDEpOworCW52X2ljbWQoZGV2LCAweDAwMDAwOTJmLCAweDAwMDAwMDAxKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDY0OCwgMHgwMDAwMDAwMSk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA2NDksIDB4MDAwMDAwMDEpOworCW52X2ljbWQoZGV2LCAweDAwMDAwNjRhLCAweDAwMDAwMDAxKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDY0YiwgMHgwMDAwMDAwMSk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA2NGMsIDB4MDAwMDAwMDEpOworCW52X2ljbWQoZGV2LCAweDAwMDAwNjRkLCAweDAwMDAwMDAxKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDY0ZSwgMHgwMDAwMDAwMSk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA2NGYsIDB4MDAwMDAwMDEpOworCW52X2ljbWQoZGV2LCAweDAwMDAwNjUwLCAweDAwMDAwMDAxKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDY1OCwgMHgwMDAwMDAwZik7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA3ZmYsIDB4MDAwMDAwMGEpOworCW52X2ljbWQoZGV2LCAweDAwMDAwNjZhLCAweDQwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDY2YiwgMHgxMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA2NmMsIDB4ZmZmZjAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwNjZkLCAweGZmZmYwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDdhZiwgMHgwMDAwMDAwOCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA3YjAsIDB4MDAwMDAwMDgpOworCW52X2ljbWQoZGV2LCAweDAwMDAwN2Y2LCAweDAwMDAwMDAxKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDZiMiwgMHgwMDAwMDA1NSk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA3YWQsIDB4MDAwMDAwMDMpOworCW52X2ljbWQoZGV2LCAweDAwMDAwOTM3LCAweDAwMDAwMDAxKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDk3MSwgMHgwMDAwMDAwOCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA5NzIsIDB4MDAwMDAwNDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwOTczLCAweDAwMDAwMTJjKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDk3YywgMHgwMDAwMDA0MCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA5NzksIDB4MDAwMDAwMDMpOworCW52X2ljbWQoZGV2LCAweDAwMDAwOTc1LCAweDAwMDAwMDIwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDk3NiwgMHgwMDAwMDAwMSk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA5NzcsIDB4MDAwMDAwMjApOworCW52X2ljbWQoZGV2LCAweDAwMDAwOTc4LCAweDAwMDAwMDAxKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDk1NywgMHgwMDAwMDAwMyk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA5NWUsIDB4MjAxNjQwMTApOworCW52X2ljbWQoZGV2LCAweDAwMDAwOTVmLCAweDAwMDAwMDIwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDY4MywgMHgwMDAwMDAwNik7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA2ODUsIDB4MDAzZmZmZmYpOworCW52X2ljbWQoZGV2LCAweDAwMDAwNjg3LCAweDAwMDAwYzQ4KTsKKwludl9pY21kKGRldiwgMHgwMDAwMDZhMCwgMHgwMDAwMDAwNSk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA4NDAsIDB4MDAzMDAwMDgpOworCW52X2ljbWQoZGV2LCAweDAwMDAwODQxLCAweDA0MDAwMDgwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDg0MiwgMHgwMDMwMDAwOCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA4NDMsIDB4MDQwMDAwODApOworCW52X2ljbWQoZGV2LCAweDAwMDAwODE4LCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDgxOSwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA4MWEsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwODFiLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDgxYywgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA4MWQsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwODFlLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDgxZiwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA4NDgsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwODQ5LCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDg0YSwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA4NGIsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwODRjLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDg0ZCwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA4NGUsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwODRmLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDg1MCwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA4NTEsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwODUyLCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDg1MywgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA4NTQsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwODU1LCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDg1NiwgMHgwMDAwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA4NTcsIDB4MDAwMDAwMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwNzM4LCAweDAwMDAwMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDZhYSwgMHgwMDAwMDAwMSk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA2YWIsIDB4MDAwMDAwMDIpOworCW52X2ljbWQoZGV2LCAweDAwMDAwNmFjLCAweDAwMDAwMDgwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDZhZCwgMHgwMDAwMDEwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA2YWUsIDB4MDAwMDAxMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwNmIxLCAweDAwMDAwMDExKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDZiYiwgMHgwMDAwMDBjZik7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA2Y2UsIDB4MmE3MTI0ODgpOworCW52X2ljbWQoZGV2LCAweDAwMDAwNzM5LCAweDQwODVjMDAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDczYSwgMHgwMDAwMDA4MCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA3ODYsIDB4ODAwMDAxMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwNzNjLCAweDAwMDEwMTAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDczZCwgMHgwMjgwMDAwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA3ODcsIDB4MDAwMDAwY2YpOworCW52X2ljbWQoZGV2LCAweDAwMDAwNzhjLCAweDAwMDAwMDA4KTsKKwludl9pY21kKGRldiwgMHgwMDAwMDc5MiwgMHgwMDAwMDAwMSk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA3OTQsIDB4MDAwMDAwMDEpOworCW52X2ljbWQoZGV2LCAweDAwMDAwNzk1LCAweDAwMDAwMDAxKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDc5NiwgMHgwMDAwMDAwMSk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA3OTcsIDB4MDAwMDAwY2YpOworCW52X2ljbWQoZGV2LCAweDAwMDAwODM2LCAweDAwMDAwMDAxKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDc5YSwgMHgwMDAwMDAwMik7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA4MzMsIDB4MDQ0NDQ0ODApOworCW52X2ljbWQoZGV2LCAweDAwMDAwN2ExLCAweDAwMDAwMDAxKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDdhMywgMHgwMDAwMDAwMSk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA3YTQsIDB4MDAwMDAwMDEpOworCW52X2ljbWQoZGV2LCAweDAwMDAwN2E1LCAweDAwMDAwMDAxKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDgzMSwgMHgwMDAwMDAwNCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA4MGMsIDB4MDAwMDAwMDIpOworCW52X2ljbWQoZGV2LCAweDAwMDAwODBkLCAweDAwMDAwMTAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDgwZSwgMHgwMDAwMDEwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA4MGYsIDB4MDAwMDAwMDEpOworCW52X2ljbWQoZGV2LCAweDAwMDAwODIzLCAweDAwMDAwMDAyKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDgyNCwgMHgwMDAwMDEwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA4MjUsIDB4MDAwMDAxMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwODI2LCAweDAwMDAwMDAxKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDk1ZCwgMHgwMDAwMDAwMSk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA4MmIsIDB4MDAwMDAwMDQpOworCW52X2ljbWQoZGV2LCAweDAwMDAwOTQyLCAweDAwMDEwMDAxKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDk0MywgMHgwMDAwMDAwMSk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA5NDQsIDB4MDAwMDAwMjIpOworCW52X2ljbWQoZGV2LCAweDAwMDAwN2M1LCAweDAwMDEwMDAxKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDgzNCwgMHgwMDAwMDAwMSk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA3YzcsIDB4MDAwMDAwMDEpOworCW52X2ljbWQoZGV2LCAweDAwMDBjMWIwLCAweDAwMDAwMDBmKTsKKwludl9pY21kKGRldiwgMHgwMDAwYzFiMSwgMHgwMDAwMDAwZik7CisJbnZfaWNtZChkZXYsIDB4MDAwMGMxYjIsIDB4MDAwMDAwMGYpOworCW52X2ljbWQoZGV2LCAweDAwMDBjMWIzLCAweDAwMDAwMDBmKTsKKwludl9pY21kKGRldiwgMHgwMDAwYzFiNCwgMHgwMDAwMDAwZik7CisJbnZfaWNtZChkZXYsIDB4MDAwMGMxYjUsIDB4MDAwMDAwMGYpOworCW52X2ljbWQoZGV2LCAweDAwMDBjMWI2LCAweDAwMDAwMDBmKTsKKwludl9pY21kKGRldiwgMHgwMDAwYzFiNywgMHgwMDAwMDAwZik7CisJbnZfaWNtZChkZXYsIDB4MDAwMGMxYjgsIDB4MGZhYzY4ODEpOworCW52X2ljbWQoZGV2LCAweDAwMDBjMWI5LCAweDAwZmFjNjg4KTsKKwludl9pY21kKGRldiwgMHgwMDAxZTEwMCwgMHgwMDAwMDAwMSk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDEwMDAsIDB4MDAwMDAwMDIpOworCW52X2ljbWQoZGV2LCAweDAwMDAwNmFhLCAweDAwMDAwMDAxKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDZhZCwgMHgwMDAwMDEwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA2YWUsIDB4MDAwMDAxMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwNmIxLCAweDAwMDAwMDExKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDc4YywgMHgwMDAwMDAwOCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA3OTIsIDB4MDAwMDAwMDEpOworCW52X2ljbWQoZGV2LCAweDAwMDAwNzk0LCAweDAwMDAwMDAxKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDc5NSwgMHgwMDAwMDAwMSk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA3OTYsIDB4MDAwMDAwMDEpOworCW52X2ljbWQoZGV2LCAweDAwMDAwNzk3LCAweDAwMDAwMGNmKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDc5YSwgMHgwMDAwMDAwMik7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA4MzMsIDB4MDQ0NDQ0ODApOworCW52X2ljbWQoZGV2LCAweDAwMDAwN2ExLCAweDAwMDAwMDAxKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDdhMywgMHgwMDAwMDAwMSk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA3YTQsIDB4MDAwMDAwMDEpOworCW52X2ljbWQoZGV2LCAweDAwMDAwN2E1LCAweDAwMDAwMDAxKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDgzMSwgMHgwMDAwMDAwNCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMWUxMDAsIDB4MDAwMDAwMDEpOworCW52X2ljbWQoZGV2LCAweDAwMDAxMDAwLCAweDAwMDAwMDE0KTsKKwludl9pY21kKGRldiwgMHgwMDAwMDM1MSwgMHgwMDAwMDEwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA5NTcsIDB4MDAwMDAwMDMpOworCW52X2ljbWQoZGV2LCAweDAwMDAwOTVkLCAweDAwMDAwMDAxKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDgyYiwgMHgwMDAwMDAwNCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA5NDIsIDB4MDAwMTAwMDEpOworCW52X2ljbWQoZGV2LCAweDAwMDAwOTQzLCAweDAwMDAwMDAxKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDdjNSwgMHgwMDAxMDAwMSk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA4MzQsIDB4MDAwMDAwMDEpOworCW52X2ljbWQoZGV2LCAweDAwMDAwN2M3LCAweDAwMDAwMDAxKTsKKwludl9pY21kKGRldiwgMHgwMDAxZTEwMCwgMHgwMDAwMDAwMSk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDEwMDAsIDB4MDAwMDAwMDEpOworCW52X2ljbWQoZGV2LCAweDAwMDAwODBjLCAweDAwMDAwMDAyKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDgwZCwgMHgwMDAwMDEwMCk7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA4MGUsIDB4MDAwMDAxMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwODBmLCAweDAwMDAwMDAxKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDgyMywgMHgwMDAwMDAwMik7CisJbnZfaWNtZChkZXYsIDB4MDAwMDA4MjQsIDB4MDAwMDAxMDApOworCW52X2ljbWQoZGV2LCAweDAwMDAwODI1LCAweDAwMDAwMTAwKTsKKwludl9pY21kKGRldiwgMHgwMDAwMDgyNiwgMHgwMDAwMDAwMSk7CisJbnZfaWNtZChkZXYsIDB4MDAwMWUxMDAsIDB4MDAwMDAwMDEpOworCW52X3dyMzIoZGV2LCAweDQwMDIwOCwgMHgwMDAwMDAwMCk7CisJbnZfd3IzMihkZXYsIDB4NDA0MTU0LCAweDAwMDAwNDAwKTsKKworCW52YzBfZ3JjdHhfZ2VuZXJhdGVfOTA5NyhkZXYpOworCW52YzBfZ3JjdHhfZ2VuZXJhdGVfOTAyZChkZXYpOworCW52YzBfZ3JjdHhfZ2VuZXJhdGVfOTAzOShkZXYpOworCW52YzBfZ3JjdHhfZ2VuZXJhdGVfOTBjMChkZXYpOworCisJbnZfd3IzMihkZXYsIDB4MDAwMjYwLCByMDAwMjYwKTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252YzBfaW5zdG1lbS5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnZjMF9pbnN0bWVtLmMKaW5kZXggMTNhMGY3OC4uYzA5MDkxNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnZjMF9pbnN0bWVtLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnZjMF9pbnN0bWVtLmMKQEAgLTI1LDEzMiArMjUsMjIgQEAKICNpbmNsdWRlICJkcm1QLmgiCiAKICNpbmNsdWRlICJub3V2ZWF1X2Rydi5oIgorI2luY2x1ZGUgIm5vdXZlYXVfdm0uaCIKIAotaW50Ci1udmMwX2luc3RtZW1fcG9wdWxhdGUoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IG5vdXZlYXVfZ3B1b2JqICpncHVvYmosCi0JCSAgICAgIHVpbnQzMl90ICpzaXplKQotewotCWludCByZXQ7Ci0KLQkqc2l6ZSA9IEFMSUdOKCpzaXplLCA0MDk2KTsKLQlpZiAoKnNpemUgPT0gMCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlyZXQgPSBub3V2ZWF1X2JvX25ldyhkZXYsIE5VTEwsICpzaXplLCAwLCBUVE1fUExfRkxBR19WUkFNLCAwLCAweDAwMDAsCi0JCQkgICAgIHRydWUsIGZhbHNlLCAmZ3B1b2JqLT5pbV9iYWNraW5nKTsKLQlpZiAocmV0KSB7Ci0JCU5WX0VSUk9SKGRldiwgImVycm9yIGdldHRpbmcgUFJBTUlOIGJhY2tpbmcgcGFnZXM6ICVkXG4iLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCXJldCA9IG5vdXZlYXVfYm9fcGluKGdwdW9iai0+aW1fYmFja2luZywgVFRNX1BMX0ZMQUdfVlJBTSk7Ci0JaWYgKHJldCkgewotCQlOVl9FUlJPUihkZXYsICJlcnJvciBwaW5uaW5nIFBSQU1JTiBiYWNraW5nIFZSQU06ICVkXG4iLCByZXQpOwotCQlub3V2ZWF1X2JvX3JlZihOVUxMLCAmZ3B1b2JqLT5pbV9iYWNraW5nKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlncHVvYmotPnZpbnN0ID0gZ3B1b2JqLT5pbV9iYWNraW5nLT5iby5tZW0uc3RhcnQgPDwgUEFHRV9TSElGVDsKLQlyZXR1cm4gMDsKLX0KLQotdm9pZAotbnZjMF9pbnN0bWVtX2NsZWFyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqZ3B1b2JqKQotewotCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Ci0KLQlpZiAoZ3B1b2JqICYmIGdwdW9iai0+aW1fYmFja2luZykgewotCQlpZiAoZ3B1b2JqLT5pbV9ib3VuZCkKLQkJCWRldl9wcml2LT5lbmdpbmUuaW5zdG1lbS51bmJpbmQoZGV2LCBncHVvYmopOwotCQlub3V2ZWF1X2JvX3VucGluKGdwdW9iai0+aW1fYmFja2luZyk7Ci0JCW5vdXZlYXVfYm9fcmVmKE5VTEwsICZncHVvYmotPmltX2JhY2tpbmcpOwotCQlncHVvYmotPmltX2JhY2tpbmcgPSBOVUxMOwotCX0KLX0KLQotaW50Ci1udmMwX2luc3RtZW1fYmluZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKmdwdW9iaikKLXsKLQlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCXVpbnQzMl90IHB0ZSwgcHRlX2VuZDsKLQl1aW50NjRfdCB2cmFtOwotCi0JaWYgKCFncHVvYmotPmltX2JhY2tpbmcgfHwgIWdwdW9iai0+aW1fcHJhbWluIHx8IGdwdW9iai0+aW1fYm91bmQpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JTlZfREVCVUcoZGV2LCAic3Q9MHglbHggc3o9MHglbHhcbiIsCi0JCSBncHVvYmotPmltX3ByYW1pbi0+c3RhcnQsIGdwdW9iai0+aW1fcHJhbWluLT5zaXplKTsKLQotCXB0ZSAgICAgPSBncHVvYmotPmltX3ByYW1pbi0+c3RhcnQgPj4gMTI7Ci0JcHRlX2VuZCA9IChncHVvYmotPmltX3ByYW1pbi0+c2l6ZSA+PiAxMikgKyBwdGU7Ci0JdnJhbSAgICA9IGdwdW9iai0+dmluc3Q7Ci0KLQlOVl9ERUJVRyhkZXYsICJwcmFtaW49MHglbHgsIHB0ZT0lZCwgcHRlX2VuZD0lZFxuIiwKLQkJIGdwdW9iai0+aW1fcHJhbWluLT5zdGFydCwgcHRlLCBwdGVfZW5kKTsKLQlOVl9ERUJVRyhkZXYsICJmaXJzdCB2cmFtIHBhZ2U6IDB4JTAxMGxseFxuIiwgZ3B1b2JqLT52aW5zdCk7Ci0KLQl3aGlsZSAocHRlIDwgcHRlX2VuZCkgewotCQludl93cjMyKGRldiwgMHg3MDIwMDAgKyAocHRlICogOCksICh2cmFtID4+IDgpIHwgMSk7Ci0JCW52X3dyMzIoZGV2LCAweDcwMjAwNCArIChwdGUgKiA4KSwgMCk7Ci0JCXZyYW0gKz0gNDA5NjsKLQkJcHRlKys7Ci0JfQotCWRldl9wcml2LT5lbmdpbmUuaW5zdG1lbS5mbHVzaChkZXYpOwotCi0JaWYgKDEpIHsKLQkJdTMyIGNoYW4gPSBudl9yZDMyKGRldiwgMHgxNzAwKSA8PCAxNjsKLQkJbnZfd3IzMihkZXYsIDB4MTAwY2I4LCAoY2hhbiArIDB4MTAwMCkgPj4gOCk7Ci0JCW52X3dyMzIoZGV2LCAweDEwMGNiYywgMHg4MDAwMDAwNSk7Ci0JfQotCi0JZ3B1b2JqLT5pbV9ib3VuZCA9IDE7Ci0JcmV0dXJuIDA7Ci19Ci0KLWludAotbnZjMF9pbnN0bWVtX3VuYmluZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKmdwdW9iaikKLXsKLQlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCXVpbnQzMl90IHB0ZSwgcHRlX2VuZDsKLQotCWlmIChncHVvYmotPmltX2JvdW5kID09IDApCi0JCXJldHVybiAtRUlOVkFMOwotCi0JcHRlICAgICA9IGdwdW9iai0+aW1fcHJhbWluLT5zdGFydCA+PiAxMjsKLQlwdGVfZW5kID0gKGdwdW9iai0+aW1fcHJhbWluLT5zaXplID4+IDEyKSArIHB0ZTsKLQl3aGlsZSAocHRlIDwgcHRlX2VuZCkgewotCQludl93cjMyKGRldiwgMHg3MDIwMDAgKyAocHRlICogOCksIDApOwotCQludl93cjMyKGRldiwgMHg3MDIwMDQgKyAocHRlICogOCksIDApOwotCQlwdGUrKzsKLQl9Ci0JZGV2X3ByaXYtPmVuZ2luZS5pbnN0bWVtLmZsdXNoKGRldik7Ci0KLQlncHVvYmotPmltX2JvdW5kID0gMDsKLQlyZXR1cm4gMDsKLX0KLQotdm9pZAotbnZjMF9pbnN0bWVtX2ZsdXNoKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCi17Ci0JbnZfd3IzMihkZXYsIDB4MDcwMDAwLCAxKTsKLQlpZiAoIW52X3dhaXQoZGV2LCAweDA3MDAwMCwgMHgwMDAwMDAwMiwgMHgwMDAwMDAwMCkpCi0JCU5WX0VSUk9SKGRldiwgIlBSQU1JTiBmbHVzaCB0aW1lb3V0XG4iKTsKLX0KK3N0cnVjdCBudmMwX2luc3RtZW1fcHJpdiB7CisJc3RydWN0IG5vdXZlYXVfZ3B1b2JqICAqYmFyMV9wZ2Q7CisJc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqYmFyMTsKKwlzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogICpiYXIzX3BnZDsKKwlzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICpiYXIzOworCXN0cnVjdCBub3V2ZWF1X2dwdW9iaiAgKmNoYW5fcGdkOworfTsKIAogaW50CiBudmMwX2luc3RtZW1fc3VzcGVuZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogewogCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Ci0JdTMyICpidWY7Ci0JaW50IGk7CiAKLQlkZXZfcHJpdi0+c3VzcmVzLnJhbWluX2NvcHkgPSB2bWFsbG9jKDY1NTM2KTsKLQlpZiAoIWRldl9wcml2LT5zdXNyZXMucmFtaW5fY29weSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0JYnVmID0gZGV2X3ByaXYtPnN1c3Jlcy5yYW1pbl9jb3B5OwotCi0JZm9yIChpID0gMDsgaSA8IDY1NTM2OyBpICs9IDQpCi0JCWJ1ZltpLzRdID0gbnZfcmQzMihkZXYsIE5WMDRfUFJBTUlOICsgaSk7CisJZGV2X3ByaXYtPnJhbWluX2F2YWlsYWJsZSA9IGZhbHNlOwogCXJldHVybiAwOwogfQogCkBAIC0xNTgsNzMgKzQ4LDE4NCBAQAogbnZjMF9pbnN0bWVtX3Jlc3VtZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogewogCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Ci0JdTMyICpidWYgPSBkZXZfcHJpdi0+c3VzcmVzLnJhbWluX2NvcHk7Ci0JdTY0IGNoYW47Ci0JaW50IGk7CisJc3RydWN0IG52YzBfaW5zdG1lbV9wcml2ICpwcml2ID0gZGV2X3ByaXYtPmVuZ2luZS5pbnN0bWVtLnByaXY7CiAKLQljaGFuID0gZGV2X3ByaXYtPnZyYW1fc2l6ZSAtIGRldl9wcml2LT5yYW1pbl9yc3ZkX3ZyYW07Ci0JbnZfd3IzMihkZXYsIDB4MDAxNzAwLCBjaGFuID4+IDE2KTsKKwludl9tYXNrKGRldiwgMHgxMDBjODAsIDB4MDAwMDAwMDEsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDAwMTcwNCwgMHg4MDAwMDAwMCB8IHByaXYtPmJhcjEtPnJhbWluLT52aW5zdCA+PiAxMik7CisJbnZfd3IzMihkZXYsIDB4MDAxNzE0LCAweGMwMDAwMDAwIHwgcHJpdi0+YmFyMy0+cmFtaW4tPnZpbnN0ID4+IDEyKTsKKwlkZXZfcHJpdi0+cmFtaW5fYXZhaWxhYmxlID0gdHJ1ZTsKK30KIAotCWZvciAoaSA9IDA7IGkgPCA2NTUzNjsgaSArPSA0KQotCQludl93cjMyKGRldiwgTlYwNF9QUkFNSU4gKyBpLCBidWZbaS80XSk7Ci0JdmZyZWUoZGV2X3ByaXYtPnN1c3Jlcy5yYW1pbl9jb3B5KTsKLQlkZXZfcHJpdi0+c3VzcmVzLnJhbWluX2NvcHkgPSBOVUxMOworc3RhdGljIHZvaWQKK252YzBfY2hhbm5lbF9kZWwoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqKnBjaGFuKQoreworCXN0cnVjdCBub3V2ZWF1X2NoYW5uZWwgKmNoYW47CiAKLQludl93cjMyKGRldiwgMHgwMDE3MTQsIDB4YzAwMDAwMDAgfCAoY2hhbiA+PiAxMikpOworCWNoYW4gPSAqcGNoYW47CisJKnBjaGFuID0gTlVMTDsKKwlpZiAoIWNoYW4pCisJCXJldHVybjsKKworCW5vdXZlYXVfdm1fcmVmKE5VTEwsICZjaGFuLT52bSwgTlVMTCk7CisJaWYgKGNoYW4tPnJhbWluX2hlYXAuZnJlZV9zdGFjay5uZXh0KQorCQlkcm1fbW1fdGFrZWRvd24oJmNoYW4tPnJhbWluX2hlYXApOworCW5vdXZlYXVfZ3B1b2JqX3JlZihOVUxMLCAmY2hhbi0+cmFtaW4pOworCWtmcmVlKGNoYW4pOworfQorCitzdGF0aWMgaW50CitudmMwX2NoYW5uZWxfbmV3KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHUzMiBzaXplLCBzdHJ1Y3Qgbm91dmVhdV92bSAqdm0sCisJCSBzdHJ1Y3Qgbm91dmVhdV9jaGFubmVsICoqcGNoYW4sCisJCSBzdHJ1Y3Qgbm91dmVhdV9ncHVvYmogKnBnZCwgdTY0IHZtX3NpemUpCit7CisJc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqY2hhbjsKKwlpbnQgcmV0OworCisJY2hhbiA9IGt6YWxsb2Moc2l6ZW9mKCpjaGFuKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFjaGFuKQorCQlyZXR1cm4gLUVOT01FTTsKKwljaGFuLT5kZXYgPSBkZXY7CisKKwlyZXQgPSBub3V2ZWF1X2dwdW9ial9uZXcoZGV2LCBOVUxMLCBzaXplLCAweDEwMDAsIDAsICZjaGFuLT5yYW1pbik7CisJaWYgKHJldCkgeworCQludmMwX2NoYW5uZWxfZGVsKCZjaGFuKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXQgPSBkcm1fbW1faW5pdCgmY2hhbi0+cmFtaW5faGVhcCwgMHgxMDAwLCBzaXplIC0gMHgxMDAwKTsKKwlpZiAocmV0KSB7CisJCW52YzBfY2hhbm5lbF9kZWwoJmNoYW4pOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldCA9IG5vdXZlYXVfdm1fcmVmKHZtLCAmY2hhbi0+dm0sIE5VTEwpOworCWlmIChyZXQpIHsKKwkJbnZjMF9jaGFubmVsX2RlbCgmY2hhbik7CisJCXJldHVybiByZXQ7CisJfQorCisJbnZfd28zMihjaGFuLT5yYW1pbiwgMHgwMjAwLCBsb3dlcl8zMl9iaXRzKHBnZC0+dmluc3QpKTsKKwludl93bzMyKGNoYW4tPnJhbWluLCAweDAyMDQsIHVwcGVyXzMyX2JpdHMocGdkLT52aW5zdCkpOworCW52X3dvMzIoY2hhbi0+cmFtaW4sIDB4MDIwOCwgbG93ZXJfMzJfYml0cyh2bV9zaXplIC0gMSkpOworCW52X3dvMzIoY2hhbi0+cmFtaW4sIDB4MDIwYywgdXBwZXJfMzJfYml0cyh2bV9zaXplIC0gMSkpOworCisJKnBjaGFuID0gY2hhbjsKKwlyZXR1cm4gMDsKIH0KIAogaW50CiBudmMwX2luc3RtZW1faW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogewogCXN0cnVjdCBkcm1fbm91dmVhdV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Ci0JdTY0IGNoYW4sIHBndDMsIGltZW0sIGxpbTMgPSBkZXZfcHJpdi0+cmFtaW5fc2l6ZSAtIDE7Ci0JaW50IHJldCwgaTsKKwlzdHJ1Y3Qgbm91dmVhdV9pbnN0bWVtX2VuZ2luZSAqcGluc3RtZW0gPSAmZGV2X3ByaXYtPmVuZ2luZS5pbnN0bWVtOworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gZGV2LT5wZGV2OworCXN0cnVjdCBudmMwX2luc3RtZW1fcHJpdiAqcHJpdjsKKwlzdHJ1Y3Qgbm91dmVhdV92bSAqdm0gPSBOVUxMOworCWludCByZXQ7CiAKLQlkZXZfcHJpdi0+cmFtaW5fcnN2ZF92cmFtID0gMSAqIDEwMjQgKiAxMDI0OwotCWNoYW4gPSBkZXZfcHJpdi0+dnJhbV9zaXplIC0gZGV2X3ByaXYtPnJhbWluX3JzdmRfdnJhbTsKLQlpbWVtID0gNDA5NiArIDQwOTYgKyAzMjc2ODsKLQotCW52X3dyMzIoZGV2LCAweDAwMTcwMCwgY2hhbiA+PiAxNik7Ci0KLQkvKiBjaGFubmVsIHNldHVwICovCi0JbnZfd3IzMihkZXYsIDB4NzAwMjAwLCBsb3dlcl8zMl9iaXRzKGNoYW4gKyAweDEwMDApKTsKLQludl93cjMyKGRldiwgMHg3MDAyMDQsIHVwcGVyXzMyX2JpdHMoY2hhbiArIDB4MTAwMCkpOwotCW52X3dyMzIoZGV2LCAweDcwMDIwOCwgbG93ZXJfMzJfYml0cyhsaW0zKSk7Ci0JbnZfd3IzMihkZXYsIDB4NzAwMjBjLCB1cHBlcl8zMl9iaXRzKGxpbTMpKTsKLQotCS8qIHBvaW50IHBnZCAtPiBwZ3QgKi8KLQludl93cjMyKGRldiwgMHg3MDEwMDAsIDApOwotCW52X3dyMzIoZGV2LCAweDcwMTAwNCwgKChjaGFuICsgMHgyMDAwKSA+PiA4KSB8IDEpOwotCi0JLyogcG9pbnQgcGd0IC0+IHBoeXNpY2FsIHZyYW0gZm9yIGNoYW5uZWwgKi8KLQlwZ3QzID0gMHgyMDAwOwotCWZvciAoaSA9IDA7IGkgPCBkZXZfcHJpdi0+cmFtaW5fcnN2ZF92cmFtOyBpICs9IDQwOTYsIHBndDMgKz0gOCkgewotCQludl93cjMyKGRldiwgMHg3MDAwMDAgKyBwZ3QzLCAoKGNoYW4gKyBpKSA+PiA4KSB8IDEpOwotCQludl93cjMyKGRldiwgMHg3MDAwMDQgKyBwZ3QzLCAwKTsKLQl9Ci0KLQkvKiBjbGVhciByZXN0IG9mIHBndCAqLwotCWZvciAoOyBpIDwgZGV2X3ByaXYtPnJhbWluX3NpemU7IGkgKz0gNDA5NiwgcGd0MyArPSA4KSB7Ci0JCW52X3dyMzIoZGV2LCAweDcwMDAwMCArIHBndDMsIDApOwotCQludl93cjMyKGRldiwgMHg3MDAwMDQgKyBwZ3QzLCAwKTsKLQl9Ci0KLQkvKiBwb2ludCBiYXIzIGF0IHRoZSBjaGFubmVsICovCi0JbnZfd3IzMihkZXYsIDB4MDAxNzE0LCAweGMwMDAwMDAwIHwgKGNoYW4gPj4gMTIpKTsKLQotCS8qIEdsb2JhbCBQUkFNSU4gaGVhcCAqLwotCXJldCA9IGRybV9tbV9pbml0KCZkZXZfcHJpdi0+cmFtaW5faGVhcCwgaW1lbSwKLQkJCSAgZGV2X3ByaXYtPnJhbWluX3NpemUgLSBpbWVtKTsKLQlpZiAocmV0KSB7Ci0JCU5WX0VSUk9SKGRldiwgIkZhaWxlZCB0byBpbml0IFJBTUlOIGhlYXBcbiIpOworCXByaXYgPSBremFsbG9jKHNpemVvZigqcHJpdiksIEdGUF9LRVJORUwpOworCWlmICghcHJpdikKIAkJcmV0dXJuIC1FTk9NRU07Ci0JfQorCXBpbnN0bWVtLT5wcml2ID0gcHJpdjsKIAorCS8qIEJBUjMgVk0gKi8KKwlyZXQgPSBub3V2ZWF1X3ZtX25ldyhkZXYsIDAsIHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMyksIDAsCisJCQkgICAgICZkZXZfcHJpdi0+YmFyM192bSk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcjsKKworCXJldCA9IG5vdXZlYXVfZ3B1b2JqX25ldyhkZXYsIE5VTEwsCisJCQkJIChwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDMpID4+IDEyKSAqIDgsIDAsCisJCQkJIE5WT0JKX0ZMQUdfRE9OVF9NQVAgfAorCQkJCSBOVk9CSl9GTEFHX1pFUk9fQUxMT0MsCisJCQkJICZkZXZfcHJpdi0+YmFyM192bS0+cGd0WzBdLm9ialswXSk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcjsKKwlkZXZfcHJpdi0+YmFyM192bS0+cGd0WzBdLnJlZmNvdW50WzBdID0gMTsKKworCW52NTBfaW5zdG1lbV9tYXAoZGV2X3ByaXYtPmJhcjNfdm0tPnBndFswXS5vYmpbMF0pOworCisJcmV0ID0gbm91dmVhdV9ncHVvYmpfbmV3KGRldiwgTlVMTCwgMHg4MDAwLCA0MDk2LAorCQkJCSBOVk9CSl9GTEFHX1pFUk9fQUxMT0MsICZwcml2LT5iYXIzX3BnZCk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcjsKKworCXJldCA9IG5vdXZlYXVfdm1fcmVmKGRldl9wcml2LT5iYXIzX3ZtLCAmdm0sIHByaXYtPmJhcjNfcGdkKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yOworCW5vdXZlYXVfdm1fcmVmKE5VTEwsICZ2bSwgTlVMTCk7CisKKwlyZXQgPSBudmMwX2NoYW5uZWxfbmV3KGRldiwgODE5MiwgZGV2X3ByaXYtPmJhcjNfdm0sICZwcml2LT5iYXIzLAorCQkJICAgICAgIHByaXYtPmJhcjNfcGdkLCBwY2lfcmVzb3VyY2VfbGVuKGRldi0+cGRldiwgMykpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3I7CisKKwkvKiBCQVIxIFZNICovCisJcmV0ID0gbm91dmVhdV92bV9uZXcoZGV2LCAwLCBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDEpLCAwLCAmdm0pOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3I7CisKKwlyZXQgPSBub3V2ZWF1X2dwdW9ial9uZXcoZGV2LCBOVUxMLCAweDgwMDAsIDQwOTYsCisJCQkJIE5WT0JKX0ZMQUdfWkVST19BTExPQywgJnByaXYtPmJhcjFfcGdkKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yOworCisJcmV0ID0gbm91dmVhdV92bV9yZWYodm0sICZkZXZfcHJpdi0+YmFyMV92bSwgcHJpdi0+YmFyMV9wZ2QpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3I7CisJbm91dmVhdV92bV9yZWYoTlVMTCwgJnZtLCBOVUxMKTsKKworCXJldCA9IG52YzBfY2hhbm5lbF9uZXcoZGV2LCA4MTkyLCBkZXZfcHJpdi0+YmFyMV92bSwgJnByaXYtPmJhcjEsCisJCQkgICAgICAgcHJpdi0+YmFyMV9wZ2QsIHBjaV9yZXNvdXJjZV9sZW4oZGV2LT5wZGV2LCAxKSk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcjsKKworCS8qIGNoYW5uZWwgdm0gKi8KKwlyZXQgPSBub3V2ZWF1X3ZtX25ldyhkZXYsIDAsICgxVUxMIDw8IDQwKSwgMHgwMDA4MDAwMDAwVUxMLCAmdm0pOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3I7CisKKwlyZXQgPSBub3V2ZWF1X2dwdW9ial9uZXcoZGV2LCBOVUxMLCAweDgwMDAsIDQwOTYsIDAsICZwcml2LT5jaGFuX3BnZCk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcjsKKworCW5vdXZlYXVfdm1fcmVmKHZtLCAmZGV2X3ByaXYtPmNoYW5fdm0sIHByaXYtPmNoYW5fcGdkKTsKKwlub3V2ZWF1X3ZtX3JlZihOVUxMLCAmdm0sIE5VTEwpOworCisJbnZjMF9pbnN0bWVtX3Jlc3VtZShkZXYpOwogCXJldHVybiAwOworZXJyb3I6CisJbnZjMF9pbnN0bWVtX3Rha2Vkb3duKGRldik7CisJcmV0dXJuIHJldDsKIH0KIAogdm9pZAogbnZjMF9pbnN0bWVtX3Rha2Vkb3duKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgbnZjMF9pbnN0bWVtX3ByaXYgKnByaXYgPSBkZXZfcHJpdi0+ZW5naW5lLmluc3RtZW0ucHJpdjsKKwlzdHJ1Y3Qgbm91dmVhdV92bSAqdm0gPSBOVUxMOworCisJbnZjMF9pbnN0bWVtX3N1c3BlbmQoZGV2KTsKKworCW52X3dyMzIoZGV2LCAweDE3MDQsIDB4MDAwMDAwMDApOworCW52X3dyMzIoZGV2LCAweDE3MTQsIDB4MDAwMDAwMDApOworCisJbm91dmVhdV92bV9yZWYoTlVMTCwgJmRldl9wcml2LT5jaGFuX3ZtLCBwcml2LT5jaGFuX3BnZCk7CisJbm91dmVhdV9ncHVvYmpfcmVmKE5VTEwsICZwcml2LT5jaGFuX3BnZCk7CisKKwludmMwX2NoYW5uZWxfZGVsKCZwcml2LT5iYXIxKTsKKwlub3V2ZWF1X3ZtX3JlZihOVUxMLCAmZGV2X3ByaXYtPmJhcjFfdm0sIHByaXYtPmJhcjFfcGdkKTsKKwlub3V2ZWF1X2dwdW9ial9yZWYoTlVMTCwgJnByaXYtPmJhcjFfcGdkKTsKKworCW52YzBfY2hhbm5lbF9kZWwoJnByaXYtPmJhcjMpOworCW5vdXZlYXVfdm1fcmVmKGRldl9wcml2LT5iYXIzX3ZtLCAmdm0sIE5VTEwpOworCW5vdXZlYXVfdm1fcmVmKE5VTEwsICZ2bSwgcHJpdi0+YmFyM19wZ2QpOworCW5vdXZlYXVfZ3B1b2JqX3JlZihOVUxMLCAmcHJpdi0+YmFyM19wZ2QpOworCW5vdXZlYXVfZ3B1b2JqX3JlZihOVUxMLCAmZGV2X3ByaXYtPmJhcjNfdm0tPnBndFswXS5vYmpbMF0pOworCW5vdXZlYXVfdm1fcmVmKE5VTEwsICZkZXZfcHJpdi0+YmFyM192bSwgTlVMTCk7CisKKwlkZXZfcHJpdi0+ZW5naW5lLmluc3RtZW0ucHJpdiA9IE5VTEw7CisJa2ZyZWUocHJpdik7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252YzBfdm0uYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252YzBfdm0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjkyNTFiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnZjMF92bS5jCkBAIC0wLDAgKzEsMTIzIEBACisvKgorICogQ29weXJpZ2h0IDIwMTAgUmVkIEhhdCBJbmMuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQ09QWVJJR0hUIEhPTERFUihTKSBPUiBBVVRIT1IoUykgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogQXV0aG9yczogQmVuIFNrZWdncworICovCisKKyNpbmNsdWRlICJkcm1QLmgiCisKKyNpbmNsdWRlICJub3V2ZWF1X2Rydi5oIgorI2luY2x1ZGUgIm5vdXZlYXVfdm0uaCIKKwordm9pZAorbnZjMF92bV9tYXBfcGd0KHN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqcGdkLCB1MzIgaW5kZXgsCisJCXN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqcGd0WzJdKQoreworCXUzMiBwZGVbMl0gPSB7IDAsIDAgfTsKKworCWlmIChwZ3RbMF0pCisJCXBkZVsxXSA9IDB4MDAwMDAwMDEgfCAocGd0WzBdLT52aW5zdCA+PiA4KTsKKwlpZiAocGd0WzFdKQorCQlwZGVbMF0gPSAweDAwMDAwMDAxIHwgKHBndFsxXS0+dmluc3QgPj4gOCk7CisKKwludl93bzMyKHBnZCwgKGluZGV4ICogOCkgKyAwLCBwZGVbMF0pOworCW52X3dvMzIocGdkLCAoaW5kZXggKiA4KSArIDQsIHBkZVsxXSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTY0CitudmMwX3ZtX2FkZHIoc3RydWN0IG5vdXZlYXVfdm1hICp2bWEsIHU2NCBwaHlzLCB1MzIgbWVtdHlwZSwgdTMyIHRhcmdldCkKK3sKKwlwaHlzID4+PSA4OworCisJcGh5cyB8PSAweDAwMDAwMDAxOyAvKiBwcmVzZW50ICovCisvLwlpZiAodm1hLT5hY2Nlc3MgJiBOVl9NRU1fQUNDRVNTX1NZUykKKy8vCQlwaHlzIHw9IDB4MDAwMDAwMDI7CisKKwlwaHlzIHw9ICgodTY0KXRhcmdldCAgPDwgMzIpOworCXBoeXMgfD0gKCh1NjQpbWVtdHlwZSA8PCAzNik7CisKKwlyZXR1cm4gcGh5czsKK30KKwordm9pZAorbnZjMF92bV9tYXAoc3RydWN0IG5vdXZlYXVfdm1hICp2bWEsIHN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqcGd0LAorCSAgICBzdHJ1Y3Qgbm91dmVhdV92cmFtICptZW0sIHUzMiBwdGUsIHUzMiBjbnQsIHU2NCBwaHlzKQoreworCXUzMiBuZXh0ID0gMSA8PCAodm1hLT5ub2RlLT50eXBlIC0gOCk7CisKKwlwaHlzICA9IG52YzBfdm1fYWRkcih2bWEsIHBoeXMsIG1lbS0+bWVtdHlwZSwgMCk7CisJcHRlIDw8PSAzOworCXdoaWxlIChjbnQtLSkgeworCQludl93bzMyKHBndCwgcHRlICsgMCwgbG93ZXJfMzJfYml0cyhwaHlzKSk7CisJCW52X3dvMzIocGd0LCBwdGUgKyA0LCB1cHBlcl8zMl9iaXRzKHBoeXMpKTsKKwkJcGh5cyArPSBuZXh0OworCQlwdGUgICs9IDg7CisJfQorfQorCit2b2lkCitudmMwX3ZtX21hcF9zZyhzdHJ1Y3Qgbm91dmVhdV92bWEgKnZtYSwgc3RydWN0IG5vdXZlYXVfZ3B1b2JqICpwZ3QsCisJICAgICAgIHUzMiBwdGUsIGRtYV9hZGRyX3QgKmxpc3QsIHUzMiBjbnQpCit7CisJcHRlIDw8PSAzOworCXdoaWxlIChjbnQtLSkgeworCQl1NjQgcGh5cyA9IG52YzBfdm1fYWRkcih2bWEsICpsaXN0KyssIDAsIDUpOworCQludl93bzMyKHBndCwgcHRlICsgMCwgbG93ZXJfMzJfYml0cyhwaHlzKSk7CisJCW52X3dvMzIocGd0LCBwdGUgKyA0LCB1cHBlcl8zMl9iaXRzKHBoeXMpKTsKKwkJcHRlICs9IDg7CisJfQorfQorCit2b2lkCitudmMwX3ZtX3VubWFwKHN0cnVjdCBub3V2ZWF1X2dwdW9iaiAqcGd0LCB1MzIgcHRlLCB1MzIgY250KQoreworCXB0ZSA8PD0gMzsKKwl3aGlsZSAoY250LS0pIHsKKwkJbnZfd28zMihwZ3QsIHB0ZSArIDAsIDB4MDAwMDAwMDApOworCQludl93bzMyKHBndCwgcHRlICsgNCwgMHgwMDAwMDAwMCk7CisJCXB0ZSArPSA4OworCX0KK30KKwordm9pZAorbnZjMF92bV9mbHVzaChzdHJ1Y3Qgbm91dmVhdV92bSAqdm0pCit7CisJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gdm0tPmRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IG5vdXZlYXVfaW5zdG1lbV9lbmdpbmUgKnBpbnN0bWVtID0gJmRldl9wcml2LT5lbmdpbmUuaW5zdG1lbTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gdm0tPmRldjsKKwlzdHJ1Y3Qgbm91dmVhdV92bV9wZ2QgKnZwZ2Q7CisJdTMyIHIxMDBjODAsIGVuZ2luZTsKKworCXBpbnN0bWVtLT5mbHVzaCh2bS0+ZGV2KTsKKworCWlmICh2bSA9PSBkZXZfcHJpdi0+Y2hhbl92bSkKKwkJZW5naW5lID0gMTsKKwllbHNlCisJCWVuZ2luZSA9IDU7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHZwZ2QsICZ2bS0+cGdkX2xpc3QsIGhlYWQpIHsKKwkJcjEwMGM4MCA9IG52X3JkMzIoZGV2LCAweDEwMGM4MCk7CisJCW52X3dyMzIoZGV2LCAweDEwMGNiOCwgdnBnZC0+b2JqLT52aW5zdCA+PiA4KTsKKwkJbnZfd3IzMihkZXYsIDB4MTAwY2JjLCAweDgwMDAwMDAwIHwgZW5naW5lKTsKKwkJaWYgKCFudl93YWl0KGRldiwgMHgxMDBjODAsIDB4ZmZmZmZmZmYsIHIxMDBjODApKQorCQkJTlZfRVJST1IoZGV2LCAidm0gZmx1c2ggdGltZW91dCBlbmcgJWRcbiIsIGVuZ2luZSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnZjMF92cmFtLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udmMwX3ZyYW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NThlZGE1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnZjMF92cmFtLmMKQEAgLTAsMCArMSw5OSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDEwIFJlZCBIYXQgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIENPUFlSSUdIVCBIT0xERVIoUykgT1IgQVVUSE9SKFMpIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIEF1dGhvcnM6IEJlbiBTa2VnZ3MKKyAqLworCisjaW5jbHVkZSAiZHJtUC5oIgorI2luY2x1ZGUgIm5vdXZlYXVfZHJ2LmgiCisjaW5jbHVkZSAibm91dmVhdV9tbS5oIgorCitib29sCitudmMwX3ZyYW1fZmxhZ3NfdmFsaWQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdTMyIHRpbGVfZmxhZ3MpCit7CisJc3dpdGNoICh0aWxlX2ZsYWdzICYgTk9VVkVBVV9HRU1fVElMRV9MQVlPVVRfTUFTSykgeworCWNhc2UgMHgwMDAwOgorCWNhc2UgMHhmZTAwOgorCWNhc2UgMHhkYjAwOgorCWNhc2UgMHgxMTAwOgorCQlyZXR1cm4gdHJ1ZTsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gZmFsc2U7Cit9CisKK2ludAorbnZjMF92cmFtX25ldyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1NjQgc2l6ZSwgdTMyIGFsaWduLCB1MzIgbmNtaW4sCisJICAgICAgdTMyIHR5cGUsIHN0cnVjdCBub3V2ZWF1X3ZyYW0gKipwdnJhbSkKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCB0dG1fYm9fZGV2aWNlICpiZGV2ID0gJmRldl9wcml2LT50dG0uYmRldjsKKwlzdHJ1Y3QgdHRtX21lbV90eXBlX21hbmFnZXIgKm1hbiA9ICZiZGV2LT5tYW5bVFRNX1BMX1ZSQU1dOworCXN0cnVjdCBub3V2ZWF1X21tICptbSA9IG1hbi0+cHJpdjsKKwlzdHJ1Y3Qgbm91dmVhdV9tbV9ub2RlICpyOworCXN0cnVjdCBub3V2ZWF1X3ZyYW0gKnZyYW07CisJaW50IHJldDsKKworCXNpemUgID4+PSAxMjsKKwlhbGlnbiA+Pj0gMTI7CisJbmNtaW4gPj49IDEyOworCisJdnJhbSA9IGt6YWxsb2Moc2l6ZW9mKCp2cmFtKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCF2cmFtKQorCQlyZXR1cm4gLUVOT01FTTsKKworCUlOSVRfTElTVF9IRUFEKCZ2cmFtLT5yZWdpb25zKTsKKwl2cmFtLT5kZXYgPSBkZXZfcHJpdi0+ZGV2OworCXZyYW0tPm1lbXR5cGUgPSB0eXBlOworCXZyYW0tPnNpemUgPSBzaXplOworCisJbXV0ZXhfbG9jaygmbW0tPm11dGV4KTsKKwlkbyB7CisJCXJldCA9IG5vdXZlYXVfbW1fZ2V0KG1tLCAxLCBzaXplLCBuY21pbiwgYWxpZ24sICZyKTsKKwkJaWYgKHJldCkgeworCQkJbXV0ZXhfdW5sb2NrKCZtbS0+bXV0ZXgpOworCQkJbnY1MF92cmFtX2RlbChkZXYsICZ2cmFtKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKworCQlsaXN0X2FkZF90YWlsKCZyLT5ybF9lbnRyeSwgJnZyYW0tPnJlZ2lvbnMpOworCQlzaXplIC09IHItPmxlbmd0aDsKKwl9IHdoaWxlIChzaXplKTsKKwltdXRleF91bmxvY2soJm1tLT5tdXRleCk7CisKKwlyID0gbGlzdF9maXJzdF9lbnRyeSgmdnJhbS0+cmVnaW9ucywgc3RydWN0IG5vdXZlYXVfbW1fbm9kZSwgcmxfZW50cnkpOworCXZyYW0tPm9mZnNldCA9ICh1NjQpci0+b2Zmc2V0IDw8IDEyOworCSpwdnJhbSA9IHZyYW07CisJcmV0dXJuIDA7Cit9CisKK2ludAorbnZjMF92cmFtX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZHJtX25vdXZlYXVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCisJZGV2X3ByaXYtPnZyYW1fc2l6ZSAgPSBudl9yZDMyKGRldiwgMHgxMGYyMGMpIDw8IDIwOworCWRldl9wcml2LT52cmFtX3NpemUgKj0gbnZfcmQzMihkZXYsIDB4MTIxYzc0KTsKKwlkZXZfcHJpdi0+dnJhbV9yYmxvY2tfc2l6ZSA9IDQwOTY7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udnJlZy5oIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnZyZWcuaAppbmRleCA4ODFmOGE1Li5mZTBmMjUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udnJlZy5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252cmVnLmgKQEAgLTE1Myw3ICsxNTMsOCBAQAogI2RlZmluZSBOVl9QQ1JUQ19TVEFSVAkJCQkJMHgwMDYwMDgwMAogI2RlZmluZSBOVl9QQ1JUQ19DT05GSUcJCQkJCTB4MDA2MDA4MDQKICMJZGVmaW5lIE5WX1BDUlRDX0NPTkZJR19TVEFSVF9BRERSRVNTX05PTl9WR0EJCSgxIDw8IDApCi0jCWRlZmluZSBOVl9QQ1JUQ19DT05GSUdfU1RBUlRfQUREUkVTU19IU1lOQwkJKDIgPDwgMCkKKyMJZGVmaW5lIE5WMDRfUENSVENfQ09ORklHX1NUQVJUX0FERFJFU1NfSFNZTkMJCSg0IDw8IDApCisjCWRlZmluZSBOVjEwX1BDUlRDX0NPTkZJR19TVEFSVF9BRERSRVNTX0hTWU5DCQkoMiA8PCAwKQogI2RlZmluZSBOVl9QQ1JUQ19DVVJTT1JfQ09ORklHCQkJCTB4MDA2MDA4MTAKICMJZGVmaW5lIE5WX1BDUlRDX0NVUlNPUl9DT05GSUdfRU5BQkxFX0VOQUJMRQkJKDEgPDwgMCkKICMJZGVmaW5lIE5WX1BDUlRDX0NVUlNPUl9DT05GSUdfRE9VQkxFX1NDQU5fRU5BQkxFCSgxIDw8IDQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL01ha2VmaWxlIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9NYWtlZmlsZQppbmRleCA2Y2FlNGYyLi5lNDdlZWNmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vTWFrZWZpbGUKQEAgLTY1LDEwICs2NSwxMyBAQAogCXJzNDAwLm8gcnM2MDAubyByczY5MC5vIHJ2NTE1Lm8gcjUyMC5vIHI2MDAubyBydjc3MC5vIHJhZGVvbl90ZXN0Lm8gXAogCXIyMDAubyByYWRlb25fbGVnYWN5X3R2Lm8gcjYwMF9jcy5vIHI2MDBfYmxpdC5vIHI2MDBfYmxpdF9zaGFkZXJzLm8gXAogCXI2MDBfYmxpdF9rbXMubyByYWRlb25fcG0ubyBhdG9tYmlvc19kcC5vIHI2MDBfYXVkaW8ubyByNjAwX2hkbWkubyBcCi0JZXZlcmdyZWVuLm8gZXZlcmdyZWVuX2NzLm8gZXZlcmdyZWVuX2JsaXRfc2hhZGVycy5vIGV2ZXJncmVlbl9ibGl0X2ttcy5vCisJZXZlcmdyZWVuLm8gZXZlcmdyZWVuX2NzLm8gZXZlcmdyZWVuX2JsaXRfc2hhZGVycy5vIGV2ZXJncmVlbl9ibGl0X2ttcy5vIFwKKwlyYWRlb25fdHJhY2VfcG9pbnRzLm8gbmkubwogCiByYWRlb24tJChDT05GSUdfQ09NUEFUKSArPSByYWRlb25faW9jMzIubwogcmFkZW9uLSQoQ09ORklHX1ZHQV9TV0lUQ0hFUk9PKSArPSByYWRlb25fYXRweF9oYW5kbGVyLm8KIHJhZGVvbi0kKENPTkZJR19BQ1BJKSArPSByYWRlb25fYWNwaS5vCiAKIG9iai0kKENPTkZJR19EUk1fUkFERU9OKSs9IHJhZGVvbi5vCisKK0NGTEFHU19yYWRlb25fdHJhY2VfcG9pbnRzLm8gOj0gLUkkKHNyYykKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL09iamVjdElELmggYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL09iamVjdElELmgKaW5kZXggYzcxNDE3OS4uYzYxYzNmZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9PYmplY3RJRC5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vT2JqZWN0SUQuaApAQCAtMzcsNiArMzcsOCBAQAogI2RlZmluZSBHUkFQSF9PQkpFQ1RfVFlQRV9DT05ORUNUT1IgICAgICAgICAgICAgICAweDMKICNkZWZpbmUgR1JBUEhfT0JKRUNUX1RZUEVfUk9VVEVSICAgICAgICAgICAgICAgICAgMHg0CiAvKiBkZWxldGVkICovCisjZGVmaW5lIEdSQVBIX09CSkVDVF9UWVBFX0RJU1BMQVlfUEFUSCAgICAgICAgICAgIDB4NiAgCisjZGVmaW5lIEdSQVBIX09CSkVDVF9UWVBFX0dFTkVSSUMgICAgICAgICAgICAgICAgIDB4NwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIEVuY29kZXIgT2JqZWN0IElEIERlZmluaXRpb24gICAgICAgICAgICAgICAgICAgICAqLwpAQCAtNjQsNiArNjYsOSBAQAogI2RlZmluZSBFTkNPREVSX09CSkVDVF9JRF9WVDE2MjMgICAgICAgICAgICAgICAgICAweDEwCiAjZGVmaW5lIEVOQ09ERVJfT0JKRUNUX0lEX0hETUlfU0kxOTMwICAgICAgICAgICAgIDB4MTEKICNkZWZpbmUgRU5DT0RFUl9PQkpFQ1RfSURfSERNSV9JTlRFUk5BTCAgICAgICAgICAgMHgxMgorI2RlZmluZSBFTkNPREVSX09CSkVDVF9JRF9BTE1PTkQgICAgICAgICAgICAgICAgICAweDIyCisjZGVmaW5lIEVOQ09ERVJfT0JKRUNUX0lEX1RSQVZJUyAgICAgICAgICAgICAgICAgIDB4MjMKKyNkZWZpbmUgRU5DT0RFUl9PQkpFQ1RfSURfTlVUTUVHICAgICAgICAgICAgICAgICAgMHgyMgogLyogS2FsZWlkb3Njb3BlIChLTERTQ1ApIENsYXNzIERpc3BsYXkgSGFyZHdhcmUgKGludGVybmFsKSAqLwogI2RlZmluZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9LTERTQ1BfVE1EUzEgICAweDEzCiAjZGVmaW5lIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX0tMRFNDUF9EVk8xICAgIDB4MTQKQEAgLTEwOCw2ICsxMTMsNyBAQAogI2RlZmluZSBDT05ORUNUT1JfT0JKRUNUX0lEX0RJU1BMQVlQT1JUICAgICAgICAgICAweDEzCiAjZGVmaW5lIENPTk5FQ1RPUl9PQkpFQ1RfSURfZURQICAgICAgICAgICAgICAgICAgIDB4MTQKICNkZWZpbmUgQ09OTkVDVE9SX09CSkVDVF9JRF9NWE0gICAgICAgICAgICAgICAgICAgMHgxNQorI2RlZmluZSBDT05ORUNUT1JfT0JKRUNUX0lEX0xWRFNfZURQICAgICAgICAgICAgICAweDE2CiAKIC8qIGRlbGV0ZWQgKi8KIApAQCAtMTI0LDYgKzEzMCw3IEBACiAjZGVmaW5lIEdFTkVSSUNfT0JKRUNUX0lEX0dMU1lOQyAgICAgICAgICAgICAgICAgIDB4MDEKICNkZWZpbmUgR0VORVJJQ19PQkpFQ1RfSURfUFgyX05PTl9EUklWQUJMRSAgICAgICAgMHgwMgogI2RlZmluZSBHRU5FUklDX09CSkVDVF9JRF9NWE1fT1BNICAgICAgICAgICAgICAgICAweDAzCisjZGVmaW5lIEdFTkVSSUNfT0JKRUNUX0lEX1NURVJFT19QSU4gICAgICAgICAgICAgIDB4MDQgICAgICAgIC8vVGhpcyBvYmplY3QgY291bGQgc2hvdyB1cCBmcm9tIE1pc2MgT2JqZWN0IHRhYmxlLCBpdCBmb2xsb3dzIEFUT01fT0JKRUNUIGZvcm1hdCwgYW5kIGNvbnRhaW5zIG9uZSBBVE9NX09CSkVDVF9HUElPX0NOVExfUkVDT1JEIGZvciB0aGUgc3RlcmVvIHBpbgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIEdyYXBoaWNzIE9iamVjdCBFTlVNIElEIERlZmluaXRpb24gICAgICAgICAgICAgICAqLwpAQCAtMzYwLDYgKzM2NywyNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUkFQSF9PQkpFQ1RfRU5VTV9JRDEgPDwgRU5VTV9JRF9TSElGVCB8XAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkNPREVSX09CSkVDVF9JRF9HRU5FUkFMX0VYVEVSTkFMX0RWTyA8PCBPQkpFQ1RfSURfU0hJRlQpCiAKKyNkZWZpbmUgRU5DT0RFUl9BTE1PTkRfRU5VTV9JRDEgICAgICAgICAgICAgICAgICAoIEdSQVBIX09CSkVDVF9UWVBFX0VOQ09ERVIgPDwgT0JKRUNUX1RZUEVfU0hJRlQgfFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1JBUEhfT0JKRUNUX0VOVU1fSUQxIDw8IEVOVU1fSURfU0hJRlQgfFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5DT0RFUl9PQkpFQ1RfSURfQUxNT05EIDw8IE9CSkVDVF9JRF9TSElGVCkKKworI2RlZmluZSBFTkNPREVSX0FMTU9ORF9FTlVNX0lEMiAgICAgICAgICAgICAgICAgICggR1JBUEhfT0JKRUNUX1RZUEVfRU5DT0RFUiA8PCBPQkpFQ1RfVFlQRV9TSElGVCB8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUkFQSF9PQkpFQ1RfRU5VTV9JRDIgPDwgRU5VTV9JRF9TSElGVCB8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkNPREVSX09CSkVDVF9JRF9BTE1PTkQgPDwgT0JKRUNUX0lEX1NISUZUKQorCisjZGVmaW5lIEVOQ09ERVJfVFJBVklTX0VOVU1fSUQxICAgICAgICAgICAgICAgICAgKCBHUkFQSF9PQkpFQ1RfVFlQRV9FTkNPREVSIDw8IE9CSkVDVF9UWVBFX1NISUZUIHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdSQVBIX09CSkVDVF9FTlVNX0lEMSA8PCBFTlVNX0lEX1NISUZUIHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVOQ09ERVJfT0JKRUNUX0lEX1RSQVZJUyA8PCBPQkpFQ1RfSURfU0hJRlQpCisKKyNkZWZpbmUgRU5DT0RFUl9UUkFWSVNfRU5VTV9JRDIgICAgICAgICAgICAgICAgICAoIEdSQVBIX09CSkVDVF9UWVBFX0VOQ09ERVIgPDwgT0JKRUNUX1RZUEVfU0hJRlQgfFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1JBUEhfT0JKRUNUX0VOVU1fSUQyIDw8IEVOVU1fSURfU0hJRlQgfFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5DT0RFUl9PQkpFQ1RfSURfVFJBVklTIDw8IE9CSkVDVF9JRF9TSElGVCkKKworI2RlZmluZSBFTkNPREVSX05VVE1FR19FTlVNX0lEMSAgICAgICAgICAgICAgICAgICggR1JBUEhfT0JKRUNUX1RZUEVfRU5DT0RFUiA8PCBPQkpFQ1RfVFlQRV9TSElGVCB8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUkFQSF9PQkpFQ1RfRU5VTV9JRDEgPDwgRU5VTV9JRF9TSElGVCB8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkNPREVSX09CSkVDVF9JRF9OVVRNRUcgPDwgT0JKRUNUX0lEX1NISUZUKQorCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIENvbm5lY3RvciBPYmplY3QgSUQgZGVmaW5pdGlvbiAtIFNoYXJlZCB3aXRoIEJJT1MgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtNDIxLDYgKzQ0OCwxNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdSQVBIX09CSkVDVF9FTlVNX0lEMiA8PCBFTlVNX0lEX1NISUZUIHxcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OTkVDVE9SX09CSkVDVF9JRF9TSU5HTEVfTElOS19EVklfRCA8PCBPQkpFQ1RfSURfU0hJRlQpCiAKKyNkZWZpbmUgQ09OTkVDVE9SX1NJTkdMRV9MSU5LX0RWSV9EX0VOVU1fSUQzICAgKCBHUkFQSF9PQkpFQ1RfVFlQRV9DT05ORUNUT1IgPDwgT0JKRUNUX1RZUEVfU0hJRlQgfFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUkFQSF9PQkpFQ1RfRU5VTV9JRDMgPDwgRU5VTV9JRF9TSElGVCB8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTk5FQ1RPUl9PQkpFQ1RfSURfU0lOR0xFX0xJTktfRFZJX0QgPDwgT0JKRUNUX0lEX1NISUZUKQorCisjZGVmaW5lIENPTk5FQ1RPUl9TSU5HTEVfTElOS19EVklfRF9FTlVNX0lENCAgICggR1JBUEhfT0JKRUNUX1RZUEVfQ09OTkVDVE9SIDw8IE9CSkVDVF9UWVBFX1NISUZUIHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1JBUEhfT0JKRUNUX0VOVU1fSUQ0IDw8IEVOVU1fSURfU0hJRlQgfFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05ORUNUT1JfT0JKRUNUX0lEX1NJTkdMRV9MSU5LX0RWSV9EIDw8IE9CSkVDVF9JRF9TSElGVCkKKwogI2RlZmluZSBDT05ORUNUT1JfRFVBTF9MSU5LX0RWSV9EX0VOVU1fSUQxICAgICAoIEdSQVBIX09CSkVDVF9UWVBFX0NPTk5FQ1RPUiA8PCBPQkpFQ1RfVFlQRV9TSElGVCB8XAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdSQVBIX09CSkVDVF9FTlVNX0lEMSA8PCBFTlVNX0lEX1NISUZUIHxcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OTkVDVE9SX09CSkVDVF9JRF9EVUFMX0xJTktfRFZJX0QgPDwgT0JKRUNUX0lEX1NISUZUKQpAQCAtNTEyLDYgKzU0Nyw3IEBACiAjZGVmaW5lIENPTk5FQ1RPUl83UElOX0RJTl9FTlVNX0lEMSAgICAgICAgICAgICggR1JBUEhfT0JKRUNUX1RZUEVfQ09OTkVDVE9SIDw8IE9CSkVDVF9UWVBFX1NISUZUIHxcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1JBUEhfT0JKRUNUX0VOVU1fSUQxIDw8IEVOVU1fSURfU0hJRlQgfFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05ORUNUT1JfT0JKRUNUX0lEXzdQSU5fRElOIDw8IE9CSkVDVF9JRF9TSElGVCkKKwogI2RlZmluZSBDT05ORUNUT1JfN1BJTl9ESU5fRU5VTV9JRDIgICAgICAgICAgICAoIEdSQVBIX09CSkVDVF9UWVBFX0NPTk5FQ1RPUiA8PCBPQkpFQ1RfVFlQRV9TSElGVCB8XAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdSQVBIX09CSkVDVF9FTlVNX0lEMiA8PCBFTlVNX0lEX1NISUZUIHxcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OTkVDVE9SX09CSkVDVF9JRF83UElOX0RJTiA8PCBPQkpFQ1RfSURfU0hJRlQpCkBAIC01OTMsNiArNjI5LDE0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1JBUEhfT0JKRUNUX0VOVU1fSUQ3IDw8IEVOVU1fSURfU0hJRlQgfFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05ORUNUT1JfT0JKRUNUX0lEX01YTSA8PCBPQkpFQ1RfSURfU0hJRlQpICAgICAgICAgIC8vTWFwcGluZyB0byBNWE1fREFDCiAKKyNkZWZpbmUgQ09OTkVDVE9SX0xWRFNfZURQX0VOVU1fSUQxICAgICAgICAgICAgKCBHUkFQSF9PQkpFQ1RfVFlQRV9DT05ORUNUT1IgPDwgT0JKRUNUX1RZUEVfU0hJRlQgfFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUkFQSF9PQkpFQ1RfRU5VTV9JRDEgPDwgRU5VTV9JRF9TSElGVCB8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTk5FQ1RPUl9PQkpFQ1RfSURfTFZEU19lRFAgPDwgT0JKRUNUX0lEX1NISUZUKQorCisjZGVmaW5lIENPTk5FQ1RPUl9MVkRTX2VEUF9FTlVNX0lEMiAgICAgICAgICAgICggR1JBUEhfT0JKRUNUX1RZUEVfQ09OTkVDVE9SIDw8IE9CSkVDVF9UWVBFX1NISUZUIHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1JBUEhfT0JKRUNUX0VOVU1fSUQyIDw8IEVOVU1fSURfU0hJRlQgfFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05ORUNUT1JfT0JKRUNUX0lEX0xWRFNfZURQIDw8IE9CSkVDVF9JRF9TSElGVCkKKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBSb3V0ZXIgT2JqZWN0IElEIGRlZmluaXRpb24gLSBTaGFyZWQgd2l0aCBCSU9TICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtNjIxLDYgKzY2NSwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdSQVBIX09CSkVDVF9FTlVNX0lEMSA8PCBFTlVNX0lEX1NISUZUIHxcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0VORVJJQ19PQkpFQ1RfSURfTVhNX09QTSA8PCBPQkpFQ1RfSURfU0hJRlQpCiAKKyNkZWZpbmUgR0VORVJJQ09CSkVDVF9TVEVSRU9fUElOX0VOVU1fSUQxICAgICAgICAoR1JBUEhfT0JKRUNUX1RZUEVfR0VORVJJQyA8PCBPQkpFQ1RfVFlQRV9TSElGVCB8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdSQVBIX09CSkVDVF9FTlVNX0lEMSA8PCBFTlVNX0lEX1NISUZUIHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0VORVJJQ19PQkpFQ1RfSURfU1RFUkVPX1BJTiA8PCBPQkpFQ1RfSURfU0hJRlQpCisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogT2JqZWN0IENhcCBkZWZpbml0aW9uIC0gU2hhcmVkIHdpdGggQklPUyAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vYXRvbS5jIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9hdG9tLmMKaW5kZXggMDVlZmI1Yi4uMjU4ZmE1ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9hdG9tLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9hdG9tLmMKQEAgLTczNCwxNiArNzM0LDE2IEBACiBzdGF0aWMgdm9pZCBhdG9tX29wX21hc2soYXRvbV9leGVjX2NvbnRleHQgKmN0eCwgaW50ICpwdHIsIGludCBhcmcpCiB7CiAJdWludDhfdCBhdHRyID0gVTgoKCpwdHIpKyspOwotCXVpbnQzMl90IGRzdCwgc3JjMSwgc3JjMiwgc2F2ZWQ7CisJdWludDMyX3QgZHN0LCBtYXNrLCBzcmMsIHNhdmVkOwogCWludCBkcHRyID0gKnB0cjsKIAlTREVCVUcoIiAgIGRzdDogIik7CiAJZHN0ID0gYXRvbV9nZXRfZHN0KGN0eCwgYXJnLCBhdHRyLCBwdHIsICZzYXZlZCwgMSk7Ci0JU0RFQlVHKCIgICBzcmMxOiAiKTsKLQlzcmMxID0gYXRvbV9nZXRfc3JjX2RpcmVjdChjdHgsICgoYXR0ciA+PiAzKSAmIDcpLCBwdHIpOwotCVNERUJVRygiICAgc3JjMjogIik7Ci0Jc3JjMiA9IGF0b21fZ2V0X3NyYyhjdHgsIGF0dHIsIHB0cik7Ci0JZHN0ICY9IHNyYzE7Ci0JZHN0IHw9IHNyYzI7CisJbWFzayA9IGF0b21fZ2V0X3NyY19kaXJlY3QoY3R4LCAoKGF0dHIgPj4gMykgJiA3KSwgcHRyKTsKKwlTREVCVUcoIiAgIG1hc2s6IDB4JTA4eCIsIG1hc2spOworCVNERUJVRygiICAgc3JjOiAiKTsKKwlzcmMgPSBhdG9tX2dldF9zcmMoY3R4LCBhdHRyLCBwdHIpOworCWRzdCAmPSBtYXNrOworCWRzdCB8PSBzcmM7CiAJU0RFQlVHKCIgICBkc3Q6ICIpOwogCWF0b21fcHV0X2RzdChjdHgsIGFyZywgYXR0ciwgJmRwdHIsIGRzdCwgc2F2ZWQpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9hdG9tYmlvcy5oIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9hdG9tYmlvcy5oCmluZGV4IGZlMzU5YTIuLjU4YTBjZDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vYXRvbWJpb3MuaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL2F0b21iaW9zLmgKQEAgLTczLDggKzczLDE4IEBACiAjZGVmaW5lIEFUT01fUFBMTDEgICAgICAgICAgICAwCiAjZGVmaW5lIEFUT01fUFBMTDIgICAgICAgICAgICAxCiAjZGVmaW5lIEFUT01fRENQTEwgICAgICAgICAgICAyCisjZGVmaW5lIEFUT01fUFBMTDAgICAgICAgICAgICAyCisjZGVmaW5lIEFUT01fRVhUX1BMTDEgICAgICAgICA4CisjZGVmaW5lIEFUT01fRVhUX1BMTDIgICAgICAgICA5CisjZGVmaW5lIEFUT01fRVhUX0NMT0NLICAgICAgICAxMAogI2RlZmluZSBBVE9NX1BQTExfSU5WQUxJRCAgICAgMHhGRgogCisjZGVmaW5lIEVOQ09ERVJfUkVGQ0xLX1NSQ19QMVBMTCAgICAgICAwICAgICAgIAorI2RlZmluZSBFTkNPREVSX1JFRkNMS19TUkNfUDJQTEwgICAgICAgMQorI2RlZmluZSBFTkNPREVSX1JFRkNMS19TUkNfRENQTEwgICAgICAgMgorI2RlZmluZSBFTkNPREVSX1JFRkNMS19TUkNfRVhUQ0xLICAgICAgMworI2RlZmluZSBFTkNPREVSX1JFRkNMS19TUkNfSU5WQUxJRCAgICAgMHhGRgorCiAjZGVmaW5lIEFUT01fU0NBTEVSMSAgICAgICAgICAwCiAjZGVmaW5lIEFUT01fU0NBTEVSMiAgICAgICAgICAxCiAKQEAgLTE5Miw2ICsyMDIsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qSW1hZ2UgY2FuJ3QgYmUgdXBkYXRlZCwgd2hpbGUgRHJpdmVyIG5lZWRzIHRvIGNhcnJ5IHRoZSBuZXcgdGFibGUhICovCiB9QVRPTV9DT01NT05fVEFCTEVfSEVBREVSOwogCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8JCisvLyBTdHJ1Y3R1cmUgc3RvcmVzIHRoZSBST00gaGVhZGVyLgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCQogdHlwZWRlZiBzdHJ1Y3QgX0FUT01fUk9NX0hFQURFUgogewogICBBVE9NX0NPTU1PTl9UQUJMRV9IRUFERVIJCXNIZWFkZXI7CkBAIC0yMjEsNiArMjM0LDkgQEAKIAkjZGVmaW5lCVVTSE9SVAl2b2lkKgogI2VuZGlmCiAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwkKKy8vIFN0cnVjdHVyZXMgdXNlZCBpbiBDb21tYW5kLm10YiAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwkKIHR5cGVkZWYgc3RydWN0IF9BVE9NX01BU1RFUl9MSVNUX09GX0NPTU1BTkRfVEFCTEVTewogICBVU0hPUlQgQVNJQ19Jbml0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vRnVuY3Rpb24gVGFibGUsIHVzZWQgYnkgdmFyaW91cyBTVyBjb21wb25lbnRzLGxhdGVzdCB2ZXJzaW9uIDEuMQogICBVU0hPUlQgR2V0RGlzcGxheVN1cmZhY2VTaXplOyAgICAgICAgICAgICAgICAgIC8vQXRvbWljIFRhYmxlLCAgVXNlZCBieSBCaW9zIHdoZW4gZW5hYmxpbmcgSFcgSUNPTgpAQCAtMzEyLDYgKzMyOCw3IEBACiAjZGVmaW5lIFNldFVuaXBoeUluc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgQVNJQ19TdGF0aWNQd3JNZ3RTdGF0dXNDaGFuZ2UKICNkZWZpbmUgSFBESW50ZXJydXB0U2VydmljZSAgICAgICAgICAgICAgICAgICAgICBSZWFkSFdBc3Npc3RlZEkyQ1N0YXR1cwogI2RlZmluZSBFbmFibGVWR0FfQWNjZXNzICAgICAgICAgICAgICAgICAgICAgICAgIEdldFNDTEtPdmVyTUNMS1JhdGlvCisjZGVmaW5lIEdldERpc3BPYmplY3RJbmZvICAgICAgICAgICAgICAgICAgICAgICAgRW5hYmxlWVVWIAogCiB0eXBlZGVmIHN0cnVjdCBfQVRPTV9NQVNURVJfQ09NTUFORF9UQUJMRQogewpAQCAtMzU3LDYgKzM3NCwyNCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCQogI2RlZmluZSBDT01QVVRFX01FTU9SWV9QTExfUEFSQU0gICAgICAgIDEKICNkZWZpbmUgQ09NUFVURV9FTkdJTkVfUExMX1BBUkFNICAgICAgICAyCisjZGVmaW5lIEFESlVTVF9NQ19TRVRUSU5HX1BBUkFNICAgICAgICAgMworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8JCisvLyBTdHJ1Y3R1cmVzIHVzZWQgYnkgQWRqdXN0TWVtb3J5Q29udHJvbGxlclRhYmxlCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8JCit0eXBlZGVmIHN0cnVjdCBfQVRPTV9BREpVU1RfTUVNT1JZX0NMT0NLX0ZSRVEKK3sKKyNpZiBBVE9NX0JJR19FTkRJQU4KKyAgVUxPTkcgdWxQb2ludGVyUmV0dXJuRmxhZzoxOyAgICAgIC8vIEJZVEVfM1s3XT0xIC0gUmV0dXJuIHRoZSBwb2ludGVyIHRvIHRoZSByaWdodCBEYXRhIEJsb2NrOyBCWVRFXzNbN109MCAtIFByb2dyYW0gdGhlIHJpZ2h0IERhdGEgQmxvY2sgCisgIFVMT05HIHVsTWVtb3J5TW9kdWxlTnVtYmVyOjc7ICAgICAvLyBCWVRFXzNbNjowXQorICBVTE9ORyB1bENsb2NrRnJlcToyNDsKKyNlbHNlCisgIFVMT05HIHVsQ2xvY2tGcmVxOjI0OworICBVTE9ORyB1bE1lbW9yeU1vZHVsZU51bWJlcjo3OyAgICAgLy8gQllURV8zWzY6MF0KKyAgVUxPTkcgdWxQb2ludGVyUmV0dXJuRmxhZzoxOyAgICAgIC8vIEJZVEVfM1s3XT0xIC0gUmV0dXJuIHRoZSBwb2ludGVyIHRvIHRoZSByaWdodCBEYXRhIEJsb2NrOyBCWVRFXzNbN109MCAtIFByb2dyYW0gdGhlIHJpZ2h0IERhdGEgQmxvY2sgCisjZW5kaWYKK31BVE9NX0FESlVTVF9NRU1PUllfQ0xPQ0tfRlJFUTsKKyNkZWZpbmUgUE9JTlRFUl9SRVRVUk5fRkxBRyAgICAgICAgICAgICAweDgwCiAKIHR5cGVkZWYgc3RydWN0IF9DT01QVVRFX01FTU9SWV9FTkdJTkVfUExMX1BBUkFNRVRFUlMKIHsKQEAgLTQ0MCw2ICs0NzUsMjYgQEAKICNlbmRpZgogfUNPTVBVVEVfTUVNT1JZX0VOR0lORV9QTExfUEFSQU1FVEVSU19WNDsKIAordHlwZWRlZiBzdHJ1Y3QgX0NPTVBVVEVfTUVNT1JZX0VOR0lORV9QTExfUEFSQU1FVEVSU19WNQoreworICB1bmlvbgorICB7CisgICAgQVRPTV9DT01QVVRFX0NMT0NLX0ZSRVEgIHVsQ2xvY2s7ICAgICAgICAgLy9JbnB1dCBQYXJhbWV0ZXIKKyAgICBBVE9NX1NfTVBMTF9GQl9ESVZJREVSICAgdWxGYkRpdjsgICAgICAgICAvL091dHB1dCBQYXJhbWV0ZXIKKyAgfTsKKyAgVUNIQVIgICB1Y1JlZkRpdjsgICAgICAgICAgICAgICAgICAgICAgICAgICAvL091dHB1dCBQYXJhbWV0ZXIgICAgICAKKyAgVUNIQVIgICB1Y1Bvc3REaXY7ICAgICAgICAgICAgICAgICAgICAgICAgICAvL091dHB1dCBQYXJhbWV0ZXIgICAgICAKKyAgdW5pb24KKyAgeworICAgIFVDSEFSICAgdWNDbnRsRmxhZzsgICAgICAgICAgICAgICAgICAgICAgIC8vT3V0cHV0IEZsYWdzCisgICAgVUNIQVIgICB1Y0lucHV0RmxhZzsgICAgICAgICAgICAgICAgICAgICAgLy9JbnB1dCBGbGFncy4gdWNJbnB1dEZsYWdbMF0gLSBTdHJvYmUoMSkvUGVyZm9ybWFuY2UoMCkgbW9kZQorICB9OworICBVQ0hBUiAgIHVjUmVzZXJ2ZWQ7ICAgICAgICAgICAgICAgICAgICAgICAKK31DT01QVVRFX01FTU9SWV9FTkdJTkVfUExMX1BBUkFNRVRFUlNfVjU7CisKKy8vIHVjSW5wdXRGbGFnCisjZGVmaW5lIEFUT01fUExMX0lOUFVUX0ZMQUdfUExMX1NUUk9CRV9NT0RFX0VOICAxICAgLy8gMS1TdHJvYmVNb2RlLCAwLVBlcmZvcm1hbmNlTW9kZQorCiB0eXBlZGVmIHN0cnVjdCBfRFlOQU1JQ0VfTUVNT1JZX1NFVFRJTkdTX1BBUkFNRVRFUgogewogICBBVE9NX0NPTVBVVEVfQ0xPQ0tfRlJFUSB1bENsb2NrOwpAQCAtNTgzLDYgKzYzOCw3IEBACiAjZGVmaW5lIEFUT01fRU5DT0RFUl9DT05GSUdfRFBMSU5LUkFURV9NQVNLCQkJCTB4MDEKICNkZWZpbmUgQVRPTV9FTkNPREVSX0NPTkZJR19EUExJTktSQVRFXzFfNjJHSFoJCTB4MDAKICNkZWZpbmUgQVRPTV9FTkNPREVSX0NPTkZJR19EUExJTktSQVRFXzJfNzBHSFoJCTB4MDEKKyNkZWZpbmUgQVRPTV9FTkNPREVSX0NPTkZJR19EUExJTktSQVRFXzVfNDBHSFoJCTB4MDIKICNkZWZpbmUgQVRPTV9FTkNPREVSX0NPTkZJR19MSU5LX1NFTF9NQVNLCQkJCSAgMHgwNAogI2RlZmluZSBBVE9NX0VOQ09ERVJfQ09ORklHX0xJTktBCQkJCQkJCQkgIDB4MDAKICNkZWZpbmUgQVRPTV9FTkNPREVSX0NPTkZJR19MSU5LQgkJCQkJCQkJICAweDA0CkBAIC02MDgsNiArNjY0LDkgQEAKICNkZWZpbmUgQVRPTV9FTkNPREVSX01PREVfVFYJCQkJCQkJCQkJCTEzCiAjZGVmaW5lIEFUT01fRU5DT0RFUl9NT0RFX0NWCQkJCQkJCQkJCQkxNAogI2RlZmluZSBBVE9NX0VOQ09ERVJfTU9ERV9DUlQJCQkJCQkJCQkJCTE1CisjZGVmaW5lIEFUT01fRU5DT0RFUl9NT0RFX0RWTwkJCQkJCQkJCQkJMTYKKyNkZWZpbmUgQVRPTV9FTkNPREVSX01PREVfRFBfU1NUICAgICAgICAgICAgICAgICAgQVRPTV9FTkNPREVSX01PREVfRFAgICAgLy8gRm9yIERQMS4yCisjZGVmaW5lIEFUT01fRU5DT0RFUl9NT0RFX0RQX01TVCAgICAgICAgICAgICAgICAgIDUgICAgICAgICAgICAgICAgICAgICAgIC8vIEZvciBEUDEuMgogCiB0eXBlZGVmIHN0cnVjdCBfQVRPTV9ESUdfRU5DT0RFUl9DT05GSUdfVjIKIHsKQEAgLTY2MSw2ICs3MjAsNyBAQAogI2RlZmluZSBBVE9NX0VOQ09ERVJfQ01EX0RQX0xJTktfVFJBSU5JTkdfU1RBUlQgICAgICAgMHgwOAogI2RlZmluZSBBVE9NX0VOQ09ERVJfQ01EX0RQX0xJTktfVFJBSU5JTkdfUEFUVEVSTjEgICAgMHgwOQogI2RlZmluZSBBVE9NX0VOQ09ERVJfQ01EX0RQX0xJTktfVFJBSU5JTkdfUEFUVEVSTjIgICAgMHgwYQorI2RlZmluZSBBVE9NX0VOQ09ERVJfQ01EX0RQX0xJTktfVFJBSU5JTkdfUEFUVEVSTjMgICAgMHgxMwogI2RlZmluZSBBVE9NX0VOQ09ERVJfQ01EX0RQX0xJTktfVFJBSU5JTkdfQ09NUExFVEUgICAgMHgwYgogI2RlZmluZSBBVE9NX0VOQ09ERVJfQ01EX0RQX1ZJREVPX09GRiAgICAgICAgICAgICAgICAgMHgwYwogI2RlZmluZSBBVE9NX0VOQ09ERVJfQ01EX0RQX1ZJREVPX09OICAgICAgICAgICAgICAgICAgMHgwZApAQCAtNjcxLDI0ICs3MzEsMzQgQEAKICNkZWZpbmUgQVRPTV9FTkNPREVSX1NUQVRVU19MSU5LX1RSQUlOSU5HX0NPTVBMRVRFICAgIDB4MTAKICNkZWZpbmUgQVRPTV9FTkNPREVSX1NUQVRVU19MSU5LX1RSQUlOSU5HX0lOQ09NUExFVEUgIDB4MDAKIAorLy91Y1RhYmxlRm9ybWF0UmV2aXNpb249MQorLy91Y1RhYmxlQ29udGVudFJldmlzaW9uPTMKIC8vIEZvbGxvd2luZyBmdW5jdGlvbiBFTkFCTEUgc3ViLWZ1bmN0aW9uIHdpbGwgYmUgdXNlZCBieSBkcml2ZXIgd2hlbiBUTURTL0hETUkvTFZEUyBpcyB1c2VkLCBkaXNhYmxlIGZ1bmN0aW9uIHdpbGwgYmUgdXNlZCBieSBkcml2ZXIKIHR5cGVkZWYgc3RydWN0IF9BVE9NX0RJR19FTkNPREVSX0NPTkZJR19WMwogewogI2lmIEFUT01fQklHX0VORElBTgogICAgIFVDSEFSIHVjUmVzZXJ2ZWQxOjE7Ci0gICAgVUNIQVIgdWNEaWdTZWw6MzsgICAgICAgICAgICAgLy8gPTA6IERJR0EvQi9DL0QvRS9GCisgICAgVUNIQVIgdWNEaWdTZWw6MzsgICAgICAgICAgICAgLy8gPTAvMS8yLzMvNC81OiBESUcwLzEvMi8zLzQvNSAoSW4gcmVnaXN0ZXIgc3BlYyBhbHNvIHJlZmVyZWQgYXMgRElHQS9CL0MvRC9FL0YpCiAgICAgVUNIQVIgdWNSZXNlcnZlZDozOwogICAgIFVDSEFSIHVjRFBMaW5rUmF0ZToxOyAgICAgICAgIC8vID0wOiAxLjYyR2h6LCA9MTogMi43R2h6CiAjZWxzZQogICAgIFVDSEFSIHVjRFBMaW5rUmF0ZToxOyAgICAgICAgIC8vID0wOiAxLjYyR2h6LCA9MTogMi43R2h6CiAgICAgVUNIQVIgdWNSZXNlcnZlZDozOwotICAgIFVDSEFSIHVjRGlnU2VsOjM7ICAgICAgICAgICAgIC8vID0wOiBESUdBL0IvQy9EL0UvRgorICAgIFVDSEFSIHVjRGlnU2VsOjM7ICAgICAgICAgICAgIC8vID0wLzEvMi8zLzQvNTogRElHMC8xLzIvMy80LzUgKEluIHJlZ2lzdGVyIHNwZWMgYWxzbyByZWZlcmVkIGFzIERJR0EvQi9DL0QvRS9GKQogICAgIFVDSEFSIHVjUmVzZXJ2ZWQxOjE7CiAjZW5kaWYKIH1BVE9NX0RJR19FTkNPREVSX0NPTkZJR19WMzsKIAorI2RlZmluZSBBVE9NX0VOQ09ERVJfQ09ORklHX1YzX0RQTElOS1JBVEVfTUFTSwkJCQkweDAzCisjZGVmaW5lIEFUT01fRU5DT0RFUl9DT05GSUdfVjNfRFBMSU5LUkFURV8xXzYyR0haCQkgIDB4MDAKKyNkZWZpbmUgQVRPTV9FTkNPREVSX0NPTkZJR19WM19EUExJTktSQVRFXzJfNzBHSFoJCSAgMHgwMQogI2RlZmluZSBBVE9NX0VOQ09ERVJfQ09ORklHX1YzX0VOQ09ERVJfU0VMCQkJCQkgIDB4NzAKLQorI2RlZmluZSBBVE9NX0VOQ09ERVJfQ09ORklHX1YzX0RJRzBfRU5DT0RFUgkJCQkJICAweDAwCisjZGVmaW5lIEFUT01fRU5DT0RFUl9DT05GSUdfVjNfRElHMV9FTkNPREVSCQkJCQkgIDB4MTAKKyNkZWZpbmUgQVRPTV9FTkNPREVSX0NPTkZJR19WM19ESUcyX0VOQ09ERVIJCQkJCSAgMHgyMAorI2RlZmluZSBBVE9NX0VOQ09ERVJfQ09ORklHX1YzX0RJRzNfRU5DT0RFUgkJCQkJICAweDMwCisjZGVmaW5lIEFUT01fRU5DT0RFUl9DT05GSUdfVjNfRElHNF9FTkNPREVSCQkJCQkgIDB4NDAKKyNkZWZpbmUgQVRPTV9FTkNPREVSX0NPTkZJR19WM19ESUc1X0VOQ09ERVIJCQkJCSAgMHg1MAogCiB0eXBlZGVmIHN0cnVjdCBfRElHX0VOQ09ERVJfQ09OVFJPTF9QQVJBTUVURVJTX1YzCiB7CkBAIC03MDcsNiArNzc3LDU2IEBACiAgIFVDSEFSIHVjUmVzZXJ2ZWQ7CiB9RElHX0VOQ09ERVJfQ09OVFJPTF9QQVJBTUVURVJTX1YzOwogCisvL3VjVGFibGVGb3JtYXRSZXZpc2lvbj0xCisvL3VjVGFibGVDb250ZW50UmV2aXNpb249NAorLy8gc3RhcnQgZnJvbSBOSSAgICAgICAgICAgCisvLyBGb2xsb3dpbmcgZnVuY3Rpb24gRU5BQkxFIHN1Yi1mdW5jdGlvbiB3aWxsIGJlIHVzZWQgYnkgZHJpdmVyIHdoZW4gVE1EUy9IRE1JL0xWRFMgaXMgdXNlZCwgZGlzYWJsZSBmdW5jdGlvbiB3aWxsIGJlIHVzZWQgYnkgZHJpdmVyCit0eXBlZGVmIHN0cnVjdCBfQVRPTV9ESUdfRU5DT0RFUl9DT05GSUdfVjQKK3sKKyNpZiBBVE9NX0JJR19FTkRJQU4KKyAgICBVQ0hBUiB1Y1Jlc2VydmVkMToxOworICAgIFVDSEFSIHVjRGlnU2VsOjM7ICAgICAgICAgICAgIC8vID0wLzEvMi8zLzQvNTogRElHMC8xLzIvMy80LzUgKEluIHJlZ2lzdGVyIHNwZWMgYWxzbyByZWZlcmVkIGFzIERJR0EvQi9DL0QvRS9GKQorICAgIFVDSEFSIHVjUmVzZXJ2ZWQ6MjsKKyAgICBVQ0hBUiB1Y0RQTGlua1JhdGU6MjsgICAgICAgICAvLyA9MDogMS42MkdoeiwgPTE6IDIuN0doeiwgMj01LjRHaHogICAgPD0gQ2hhbmdlZCBjb21wYXJpbmcgdG8gcHJldmlvdXMgdmVyc2lvbgorI2Vsc2UKKyAgICBVQ0hBUiB1Y0RQTGlua1JhdGU6MjsgICAgICAgICAvLyA9MDogMS42MkdoeiwgPTE6IDIuN0doeiwgMj01LjRHaHogICAgPD0gQ2hhbmdlZCBjb21wYXJpbmcgdG8gcHJldmlvdXMgdmVyc2lvbgorICAgIFVDSEFSIHVjUmVzZXJ2ZWQ6MjsKKyAgICBVQ0hBUiB1Y0RpZ1NlbDozOyAgICAgICAgICAgICAvLyA9MC8xLzIvMy80LzU6IERJRzAvMS8yLzMvNC81IChJbiByZWdpc3RlciBzcGVjIGFsc28gcmVmZXJlZCBhcyBESUdBL0IvQy9EL0UvRikKKyAgICBVQ0hBUiB1Y1Jlc2VydmVkMToxOworI2VuZGlmCit9QVRPTV9ESUdfRU5DT0RFUl9DT05GSUdfVjQ7CisKKyNkZWZpbmUgQVRPTV9FTkNPREVSX0NPTkZJR19WNF9EUExJTktSQVRFX01BU0sJCQkJMHgwMworI2RlZmluZSBBVE9NX0VOQ09ERVJfQ09ORklHX1Y0X0RQTElOS1JBVEVfMV82MkdIWgkJICAweDAwCisjZGVmaW5lIEFUT01fRU5DT0RFUl9DT05GSUdfVjRfRFBMSU5LUkFURV8yXzcwR0haCQkgIDB4MDEKKyNkZWZpbmUgQVRPTV9FTkNPREVSX0NPTkZJR19WNF9EUExJTktSQVRFXzVfNDBHSFoJCSAgMHgwMgorI2RlZmluZSBBVE9NX0VOQ09ERVJfQ09ORklHX1Y0X0VOQ09ERVJfU0VMCQkJCQkgIDB4NzAKKyNkZWZpbmUgQVRPTV9FTkNPREVSX0NPTkZJR19WNF9ESUcwX0VOQ09ERVIJCQkJCSAgMHgwMAorI2RlZmluZSBBVE9NX0VOQ09ERVJfQ09ORklHX1Y0X0RJRzFfRU5DT0RFUgkJCQkJICAweDEwCisjZGVmaW5lIEFUT01fRU5DT0RFUl9DT05GSUdfVjRfRElHMl9FTkNPREVSCQkJCQkgIDB4MjAKKyNkZWZpbmUgQVRPTV9FTkNPREVSX0NPTkZJR19WNF9ESUczX0VOQ09ERVIJCQkJCSAgMHgzMAorI2RlZmluZSBBVE9NX0VOQ09ERVJfQ09ORklHX1Y0X0RJRzRfRU5DT0RFUgkJCQkJICAweDQwCisjZGVmaW5lIEFUT01fRU5DT0RFUl9DT05GSUdfVjRfRElHNV9FTkNPREVSCQkJCQkgIDB4NTAKKwordHlwZWRlZiBzdHJ1Y3QgX0RJR19FTkNPREVSX0NPTlRST0xfUEFSQU1FVEVSU19WNAoreworICBVU0hPUlQgdXNQaXhlbENsb2NrOyAgICAgIC8vIGluIDEwS0h6OyBmb3IgYmlvcyBjb252ZW5pZW50CisgIHVuaW9ueworICBBVE9NX0RJR19FTkNPREVSX0NPTkZJR19WNCBhY0NvbmZpZzsKKyAgVUNIQVIgdWNDb25maWc7CisgIH07CisgIFVDSEFSIHVjQWN0aW9uOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICBVQ0hBUiB1Y0VuY29kZXJNb2RlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vID0wOiBEUCAgIGVuY29kZXIgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA9MTogTFZEUyBlbmNvZGVyICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vID0yOiBEVkkgIGVuY29kZXIgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vID0zOiBIRE1JIGVuY29kZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA9NDogU0RWTyBlbmNvZGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gPTU6IERQIGF1ZGlvCisgIFVDSEFSIHVjTGFuZU51bTsgICAgICAgICAgLy8gaG93IG1hbnkgbGFuZXMgdG8gZW5hYmxlCisgIFVDSEFSIHVjQml0UGVyQ29sb3I7ICAgICAgLy8gb25seSB2YWxpZCBmb3IgRFAgbW9kZSB3aGVuIHVjQWN0aW9uID0gQVRPTV9FTkNPREVSX0NNRF9TRVRVUAorICBVQ0hBUiB1Y0hQRF9JRDsgICAgICAgICAgIC8vIEhQRCBJRCAoMS02KS4gPTAgbWVhbnMgdG8gc2tpcCBIRFAgcHJvZ3JhbW1pbmcuIE5ldyBjb21wYXJpbmcgdG8gcHJldmlvdXMgdmVyc2lvbgorfURJR19FTkNPREVSX0NPTlRST0xfUEFSQU1FVEVSU19WNDsKIAogLy8gZGVmaW5lIHVjQml0UGVyQ29sb3I6IAogI2RlZmluZSBQQU5FTF9CUENfVU5ERUZJTkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMApAQCAtODkzLDYgKzEwMTMsNyBAQAogI2VuZGlmCiB9QVRPTV9ESUdfVFJBTlNNSVRURVJfQ09ORklHX1YzOwogCisKIHR5cGVkZWYgc3RydWN0IF9ESUdfVFJBTlNNSVRURVJfQ09OVFJPTF9QQVJBTUVURVJTX1YzCiB7CiAJdW5pb24KQEAgLTkzNiw2ICsxMDU3LDE0OSBAQAogI2RlZmluZSBBVE9NX1RSQU5TTUlUVEVSX0NPTkZJR19WM19UUkFOU01JVFRFUjIgICAgICAgICAgIAkweDQwCS8vQ0QKICNkZWZpbmUgQVRPTV9UUkFOU01JVFRFUl9DT05GSUdfVjNfVFJBTlNNSVRURVIzICAgICAgICAgICAJMHg4MAkvL0VGCiAKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCQorLy8gU3RydWN0dXJlcyB1c2VkIGJ5IFVOSVBIWVRyYW5zbWl0dGVyQ29udHJvbFRhYmxlIFYxLjQKKy8vIEFTSUMgRmFtaWxpZXM6IE5JCisvLyB1Y1RhYmxlRm9ybWF0UmV2aXNpb249MQorLy8gdWNUYWJsZUNvbnRlbnRSZXZpc2lvbj00CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8JCit0eXBlZGVmIHN0cnVjdCBfQVRPTV9EUF9WU19NT0RFX1Y0Cit7CisgIFVDSEFSIHVjTGFuZVNlbDsKKyAJdW5pb24KKyAJeyAgCisgCSAgVUNIQVIgdWNMYW5lU2V0OworIAkgIHN0cnVjdCB7CisjaWYgQVRPTV9CSUdfRU5ESUFOCisgCQkgIFVDSEFSIHVjUE9TVF9DVVJTT1IyOjI7ICAgICAgICAgLy9CaXRbNzo2XSBQb3N0IEN1cnNvcjIgTGV2ZWwgICAgICA8PSBOZXcgaW4gVjQKKyAJCSAgVUNIQVIgdWNQUkVfRU1QSEFTSVM6MzsgICAgICAgICAvL0JpdFs1OjNdIFByZS1lbXBoYXNpcyBMZXZlbAorIAkJICBVQ0hBUiB1Y1ZPTFRBR0VfU1dJTkc6MzsgICAgICAgIC8vQml0WzI6MF0gVm9sdGFnZSBTd2luZyBMZXZlbAorI2Vsc2UKKyAJCSAgVUNIQVIgdWNWT0xUQUdFX1NXSU5HOjM7ICAgICAgICAvL0JpdFsyOjBdIFZvbHRhZ2UgU3dpbmcgTGV2ZWwKKyAJCSAgVUNIQVIgdWNQUkVfRU1QSEFTSVM6MzsgICAgICAgICAvL0JpdFs1OjNdIFByZS1lbXBoYXNpcyBMZXZlbAorIAkJICBVQ0hBUiB1Y1BPU1RfQ1VSU09SMjoyOyAgICAgICAgIC8vQml0Wzc6Nl0gUG9zdCBDdXJzb3IyIExldmVsICAgICAgPD0gTmV3IGluIFY0CisjZW5kaWYKKyAJCX07CisgCX07IAorfUFUT01fRFBfVlNfTU9ERV9WNDsKKyAKK3R5cGVkZWYgc3RydWN0IF9BVE9NX0RJR19UUkFOU01JVFRFUl9DT05GSUdfVjQKK3sKKyNpZiBBVE9NX0JJR19FTkRJQU4KKyAgVUNIQVIgdWNUcmFuc21pdHRlclNlbDoyOyAgICAgICAgIC8vYml0Nzo2OiA9MCBEaWcgVHJhbnNtaXR0ZXIgMSAoIFVuaXBoeSBBQiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgPTEgRGlnIFRyYW5zbWl0dGVyIDIgKCBVbmlwaHkgQ0QgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgID0yIERpZyBUcmFuc21pdHRlciAzICggVW5pcGh5IEVGICkKKyAgVUNIQVIgdWNSZWZDbGtTb3VyY2U6MjsgICAgICAgICAgIC8vYml0NTo0OiBQUExMMSA9MCwgUFBMTDI9MSwgRENQTEw9MiwgRVhUX0NMSz0zICAgPD0gTmV3CisgIFVDSEFSIHVjRW5jb2RlclNlbDoxOyAgICAgICAgICAgICAvL2JpdDM9MDogRGF0YS9DbGsgcGF0aCBzb3VyY2UgZnJvbSBESUdBL0MvRS4gPTE6IERhdGEvY2xrIHBhdGggc291cmNlIGZyb20gRElHQi9EL0YKKyAgVUNIQVIgdWNMaW5rU2VsOjE7ICAgICAgICAgICAgICAgIC8vYml0Mj0wOiBVbmlwaHkgTElOS0Egb3IgQyBvciBFIHdoZW4gZkR1YWxMaW5rQ29ubmVjdG9yPTAuIHdoZW4gZkR1YWxMaW5rQ29ubmVjdG9yPTEsIGl0IG1lYW5zIG1hc3RlciBsaW5rIG9mIGR1YWwgbGluayBpcyBBIG9yIEMgb3IgRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgPTE6IFVuaXBoeSBMSU5LQiBvciBEIG9yIEYgd2hlbiBmRHVhbExpbmtDb25uZWN0b3I9MC4gd2hlbiBmRHVhbExpbmtDb25uZWN0b3I9MSwgaXQgbWVhbnMgbWFzdGVyIGxpbmsgb2YgZHVhbCBsaW5rIGlzIEIgb3IgRCBvciBGCisgIFVDSEFSIGZDb2hlcmVudE1vZGU6MTsgICAgICAgICAgICAvL2JpdDE9MTogQ29oZXJlbnQgTW9kZSAoIGZvciBEVkkvSERNSSBtb2RlICkKKyAgVUNIQVIgZkR1YWxMaW5rQ29ubmVjdG9yOjE7ICAgICAgIC8vYml0MD0xOiBEdWFsIExpbmsgRFZJIGNvbm5lY3RvcgorI2Vsc2UKKyAgVUNIQVIgZkR1YWxMaW5rQ29ubmVjdG9yOjE7ICAgICAgIC8vYml0MD0xOiBEdWFsIExpbmsgRFZJIGNvbm5lY3RvcgorICBVQ0hBUiBmQ29oZXJlbnRNb2RlOjE7ICAgICAgICAgICAgLy9iaXQxPTE6IENvaGVyZW50IE1vZGUgKCBmb3IgRFZJL0hETUkgbW9kZSApCisgIFVDSEFSIHVjTGlua1NlbDoxOyAgICAgICAgICAgICAgICAvL2JpdDI9MDogVW5pcGh5IExJTktBIG9yIEMgb3IgRSB3aGVuIGZEdWFsTGlua0Nvbm5lY3Rvcj0wLiB3aGVuIGZEdWFsTGlua0Nvbm5lY3Rvcj0xLCBpdCBtZWFucyBtYXN0ZXIgbGluayBvZiBkdWFsIGxpbmsgaXMgQSBvciBDIG9yIEUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgID0xOiBVbmlwaHkgTElOS0Igb3IgRCBvciBGIHdoZW4gZkR1YWxMaW5rQ29ubmVjdG9yPTAuIHdoZW4gZkR1YWxMaW5rQ29ubmVjdG9yPTEsIGl0IG1lYW5zIG1hc3RlciBsaW5rIG9mIGR1YWwgbGluayBpcyBCIG9yIEQgb3IgRgorICBVQ0hBUiB1Y0VuY29kZXJTZWw6MTsgICAgICAgICAgICAgLy9iaXQzPTA6IERhdGEvQ2xrIHBhdGggc291cmNlIGZyb20gRElHQS9DL0UuID0xOiBEYXRhL2NsayBwYXRoIHNvdXJjZSBmcm9tIERJR0IvRC9GCisgIFVDSEFSIHVjUmVmQ2xrU291cmNlOjI7ICAgICAgICAgICAvL2JpdDU6NDogUFBMTDEgPTAsIFBQTEwyPTEsIERDUExMPTIsIEVYVF9DTEs9MyAgIDw9IE5ldworICBVQ0hBUiB1Y1RyYW5zbWl0dGVyU2VsOjI7ICAgICAgICAgLy9iaXQ3OjY6ID0wIERpZyBUcmFuc21pdHRlciAxICggVW5pcGh5IEFCICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICA9MSBEaWcgVHJhbnNtaXR0ZXIgMiAoIFVuaXBoeSBDRCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgPTIgRGlnIFRyYW5zbWl0dGVyIDMgKCBVbmlwaHkgRUYgKQorI2VuZGlmCit9QVRPTV9ESUdfVFJBTlNNSVRURVJfQ09ORklHX1Y0OworCit0eXBlZGVmIHN0cnVjdCBfRElHX1RSQU5TTUlUVEVSX0NPTlRST0xfUEFSQU1FVEVSU19WNAoreworICB1bmlvbgorICB7CisgICAgVVNIT1JUIHVzUGl4ZWxDbG9jazsJCS8vIGluIDEwS0h6OyBmb3IgYmlvcyBjb252ZW5pZW50CisgICAgVVNIT1JUIHVzSW5pdEluZm87CQkJLy8gd2hlbiBpbml0IHVuaXBoeSxsb3dlciA4Yml0IGlzIHVzZWQgZm9yIGNvbm5lY3RvciB0eXBlIGRlZmluZWQgaW4gb2JqZWN0aWQuaAorICAgIEFUT01fRFBfVlNfTU9ERV9WNCBhc01vZGU7IC8vIERQIFZvbHRhZ2Ugc3dpbmcgbW9kZSAgICAgUmVkZWZpbmVkIGNvbXBhcmluZyB0byBwcmV2aW91cyB2ZXJzaW9uCisgIH07CisgIHVuaW9uCisgIHsKKyAgQVRPTV9ESUdfVFJBTlNNSVRURVJfQ09ORklHX1Y0IGFjQ29uZmlnOworICBVQ0hBUiB1Y0NvbmZpZzsKKyAgfTsKKyAgVUNIQVIgdWNBY3Rpb247CQkJCSAgICAvLyBkZWZpbmUgYXMgQVRPTV9UUkFOU01JVEVSX0FDVElPTl9YWFgJICAgICAgICAgICAgICAgICAgICAgICAgCisgIFVDSEFSIHVjTGFuZU51bTsKKyAgVUNIQVIgdWNSZXNlcnZlZFszXTsKK31ESUdfVFJBTlNNSVRURVJfQ09OVFJPTF9QQVJBTUVURVJTX1Y0OworCisvL3VjQ29uZmlnIAorLy9CaXQwCisjZGVmaW5lIEFUT01fVFJBTlNNSVRURVJfQ09ORklHX1Y0X0RVQUxfTElOS19DT05ORUNUT1IJCQkweDAxCisvL0JpdDEKKyNkZWZpbmUgQVRPTV9UUkFOU01JVFRFUl9DT05GSUdfVjRfQ09IRVJFTlQJCQkJICAgICAgICAgIDB4MDIKKy8vQml0MgorI2RlZmluZSBBVE9NX1RSQU5TTUlUVEVSX0NPTkZJR19WNF9MSU5LX1NFTF9NQVNLCQkgICAgICAgIDB4MDQKKyNkZWZpbmUgQVRPTV9UUkFOU01JVFRFUl9DT05GSUdfVjRfTElOS0EgIAkJCSAgICAgICAgICAgIDB4MDAJCQkKKyNkZWZpbmUgQVRPTV9UUkFOU01JVFRFUl9DT05GSUdfVjRfTElOS0IJCQkJICAgICAgICAgICAgMHgwNAorLy8gQml0MworI2RlZmluZSBBVE9NX1RSQU5TTUlUVEVSX0NPTkZJR19WNF9FTkNPREVSX1NFTF9NQVNLCSAgICAgICAgMHgwOAorI2RlZmluZSBBVE9NX1RSQU5TTUlUVEVSX0NPTkZJR19WNF9ESUcxX0VOQ09ERVIJCSAgICAgICAgICAweDAwCQkJCSAKKyNkZWZpbmUgQVRPTV9UUkFOU01JVFRFUl9DT05GSUdfVjRfRElHMl9FTkNPREVSCQkgICAgICAgICAgMHgwOAkJCQkKKy8vIEJpdDU6NAorI2RlZmluZSBBVE9NX1RSQU5TTUlUVEVSX0NPTkZJR19WNF9SRUZDTEtfU0VMX01BU0sgCSAgICAgICAgMHgzMAorI2RlZmluZSBBVE9NX1RSQU5TTUlUVEVSX0NPTkZJR19WNF9QMVBMTCAgICAgICAgIAkJICAgICAgICAweDAwCisjZGVmaW5lIEFUT01fVFJBTlNNSVRURVJfQ09ORklHX1Y0X1AyUExMCQkgICAgICAgICAgICAgICAgMHgxMAorI2RlZmluZSBBVE9NX1RSQU5TTUlUVEVSX0NPTkZJR19WNF9EQ1BMTAkJICAgICAgICAgICAgICAgIDB4MjAgICAvLyBOZXcgaW4gX1Y0CisjZGVmaW5lIEFUT01fVFJBTlNNSVRURVJfQ09ORklHX1Y0X1JFRkNMS19TUkNfRVhUICAgICAgICAgICAweDMwICAgLy8gQ2hhbmdlZCBjb21wYXJpbmcgdG8gVjMKKy8vIEJpdDc6NgorI2RlZmluZSBBVE9NX1RSQU5TTUlUVEVSX0NPTkZJR19WNF9UUkFOU01JVFRFUl9TRUxfTUFTSyAgICAgMHhDMAorI2RlZmluZSBBVE9NX1RSQU5TTUlUVEVSX0NPTkZJR19WNF9UUkFOU01JVFRFUjEgICAgICAgICAgIAkweDAwCS8vQUIKKyNkZWZpbmUgQVRPTV9UUkFOU01JVFRFUl9DT05GSUdfVjRfVFJBTlNNSVRURVIyICAgICAgICAgICAJMHg0MAkvL0NECisjZGVmaW5lIEFUT01fVFJBTlNNSVRURVJfQ09ORklHX1Y0X1RSQU5TTUlUVEVSMyAgICAgICAgICAgCTB4ODAJLy9FRgorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwkKKy8vIFN0cnVjdHVyZXMgdXNlZCBieSBFeHRlcm5hbEVuY29kZXJDb250cm9sVGFibGUgVjEuMworLy8gQVNJQyBGYW1pbGllczogRXZlcmdyZWVuLCBMbGFubywgTkkKKy8vIHVjVGFibGVGb3JtYXRSZXZpc2lvbj0xCisvLyB1Y1RhYmxlQ29udGVudFJldmlzaW9uPTMKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwkKKwordHlwZWRlZiBzdHJ1Y3QgX0VYVEVSTkFMX0VOQ09ERVJfQ09OVFJPTF9QQVJBTUVURVJTX1YzCit7CisgIHVuaW9ueworICBVU0hPUlQgdXNQaXhlbENsb2NrOyAgICAgIC8vIHBpeGVsIGNsb2NrIGluIDEwS2h6LCB2YWxpZCB3aGVuIHVjQWN0aW9uPVNFVFVQL0VOQUJMRV9PVVRQVVQgCisgIFVTSE9SVCB1c0Nvbm5lY3RvcklkOyAgICAgLy8gY29ubmVjdG9yIGlkLCB2YWxpZCB3aGVuIHVjQWN0aW9uID0gSU5JVAorICB9OworICBVQ0hBUiAgdWNDb25maWc7ICAgICAgICAgIC8vIGluZGljYXRlIHdoaWNoIGVuY29kZXIsIGFuZCBEUCBsaW5rIHJhdGUgd2hlbiB1Y0FjdGlvbiA9IFNFVFVQL0VOQUJMRV9PVVRQVVQgIAorICBVQ0hBUiAgdWNBY3Rpb247ICAgICAgICAgIC8vIAorICBVQ0hBUiAgdWNFbmNvZGVyTW9kZTsgICAgIC8vIGVuY29kZXIgbW9kZSwgb25seSB1c2VkIHdoZW4gdWNBY3Rpb24gPSBTRVRVUC9FTkFCTEVfT1VUUFVUCisgIFVDSEFSICB1Y0xhbmVOdW07ICAgICAgICAgLy8gbGFuZSBudW1iZXIsIG9ubHkgdXNlZCB3aGVuIHVjQWN0aW9uID0gU0VUVVAvRU5BQkxFX09VVFBVVCAgCisgIFVDSEFSICB1Y0JpdFBlckNvbG9yOyAgICAgLy8gb3V0cHV0IGJpdCBwZXIgY29sb3IsIG9ubHkgdmFsaWQgd2hlbiB1Y0FjdGlvbiA9IFNFVFVQL0VOQUJMRV9PVVRQVVQgYW5kIHVjRW5jb2RlTW9kZT0gRFAKKyAgVUNIQVIgIHVjUmVzZXJ2ZWQ7ICAgICAgICAKK31FWFRFUk5BTF9FTkNPREVSX0NPTlRST0xfUEFSQU1FVEVSU19WMzsKKworLy8gdWNBY3Rpb24KKyNkZWZpbmUgRVhURVJOQUxfRU5DT0RFUl9BQ1RJT05fVjNfRElTQUJMRV9PVVRQVVQgICAgICAgICAweDAwCisjZGVmaW5lIEVYVEVSTkFMX0VOQ09ERVJfQUNUSU9OX1YzX0VOQUJMRV9PVVRQVVQgICAgICAgICAgMHgwMQorI2RlZmluZSBFWFRFUk5BTF9FTkNPREVSX0FDVElPTl9WM19FTkNPREVSX0lOSVQgICAgICAgICAgIDB4MDcKKyNkZWZpbmUgRVhURVJOQUxfRU5DT0RFUl9BQ1RJT05fVjNfRU5DT0RFUl9TRVRVUCAgICAgICAgICAweDBmCisjZGVmaW5lIEVYVEVSTkFMX0VOQ09ERVJfQUNUSU9OX1YzX0VOQ09ERVJfQkxBTktJTkdfT0ZGICAgMHgxMAorI2RlZmluZSBFWFRFUk5BTF9FTkNPREVSX0FDVElPTl9WM19FTkNPREVSX0JMQU5LSU5HICAgICAgIDB4MTEKKyNkZWZpbmUgRVhURVJOQUxfRU5DT0RFUl9BQ1RJT05fVjNfREFDTE9BRF9ERVRFQ1RJT04gICAgICAweDEyCisKKy8vIHVjQ29uZmlnCisjZGVmaW5lIEVYVEVSTkFMX0VOQ09ERVJfQ09ORklHX1YzX0RQTElOS1JBVEVfTUFTSwkJCQkweDAzCisjZGVmaW5lIEVYVEVSTkFMX0VOQ09ERVJfQ09ORklHX1YzX0RQTElOS1JBVEVfMV82MkdIWgkJICAweDAwCisjZGVmaW5lIEVYVEVSTkFMX0VOQ09ERVJfQ09ORklHX1YzX0RQTElOS1JBVEVfMl83MEdIWgkJICAweDAxCisjZGVmaW5lIEVYVEVSTkFMX0VOQ09ERVJfQ09ORklHX1YzX0RQTElOS1JBVEVfNV80MEdIWgkJICAweDAyCisjZGVmaW5lIEVYVEVSTkFMX0VOQ09ERVJfQ09ORklHX1YzX0VOQ09ERVJfU0VMX01BU0sJCSAgICAweDcwCisjZGVmaW5lIEVYVEVSTkFMX0VOQ09ERVJfQ09ORklHX1YzX0VOQ09ERVIxCQkgICAgICAgICAgICAweDAwCisjZGVmaW5lIEVYVEVSTkFMX0VOQ09ERVJfQ09ORklHX1YzX0VOQ09ERVIyCQkgICAgICAgICAgICAweDEwCisjZGVmaW5lIEVYVEVSTkFMX0VOQ09ERVJfQ09ORklHX1YzX0VOQ09ERVIzCQkgICAgICAgICAgICAweDIwCisKK3R5cGVkZWYgc3RydWN0IF9FWFRFUk5BTF9FTkNPREVSX0NPTlRST0xfUFNfQUxMT0NBVElPTl9WMworeworICBFWFRFUk5BTF9FTkNPREVSX0NPTlRST0xfUEFSQU1FVEVSU19WMyBzRXh0RW5jb2RlcjsKKyAgVUxPTkcgdWxSZXNlcnZlZFsyXTsKK31FWFRFUk5BTF9FTkNPREVSX0NPTlRST0xfUFNfQUxMT0NBVElPTl9WMzsKKworCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8JCiAvLyBTdHJ1Y3R1cmVzIHVzZWQgYnkgREFDMU91cHV0Q29udHJvbFRhYmxlCiAvLyAgICAgICAgICAgICAgICAgICAgREFDMk91cHV0Q29udHJvbFRhYmxlCkBAIC0xMTQyLDYgKzE0MDYsNyBAQAogI2RlZmluZSBQSVhFTF9DTE9DS19WNF9NSVNDX1NTX0VOQUJMRSAgICAgICAgICAgICAgIDB4MTAKICNkZWZpbmUgUElYRUxfQ0xPQ0tfVjRfTUlTQ19DT0hFUkVOVF9NT0RFICAgICAgICAgICAweDIwCiAKKwogdHlwZWRlZiBzdHJ1Y3QgX1BJWEVMX0NMT0NLX1BBUkFNRVRFUlNfVjMKIHsKICAgVVNIT1JUIHVzUGl4ZWxDbG9jazsgICAgICAgICAgICAgICAgLy8gaW4gMTBrSHogdW5pdDsgZm9yIGJpb3MgY29udmVuaWVudCA9IChSZWZDbGsqRkJfRGl2KS8oUmVmX0RpdipQb3N0X0RpdikKQEAgLTEyMDIsNiArMTQ2Nyw1NSBAQAogI2RlZmluZSBQSVhFTF9DTE9DS19WNV9NSVNDX0hETUlfMzJCUFAgICAgICAgICAgICAgIDB4MDgKICNkZWZpbmUgUElYRUxfQ0xPQ0tfVjVfTUlTQ19SRUZfRElWX1NSQyAgICAgICAgICAgICAweDEwCiAKK3R5cGVkZWYgc3RydWN0IF9DUlRDX1BJWEVMX0NMT0NLX0ZSRVEKK3sKKyNpZiBBVE9NX0JJR19FTkRJQU4KKyAgVUxPTkcgIHVjQ1JUQzo4OyAgICAgICAgICAgIC8vIEFUT01fQ1JUQzF+NiwgaW5kaWNhdGUgdGhlIENSVEMgY29udHJvbGxlciB0byAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRyaXZlIHRoZSBwaXhlbCBjbG9jay4gbm90IHVzZWQgZm9yIERDUExMIGNhc2UuCisgIFVMT05HICB1bFBpeGVsQ2xvY2s6MjQ7ICAgICAvLyB0YXJnZXQgdGhlIHBpeGVsIGNsb2NrIHRvIGRyaXZlIHRoZSBDUlRDIHRpbWluZy4gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwIG1lYW5zIGRpc2FibGUgUFBMTC9EQ1BMTC4gRXhwYW5kZWQgdG8gMjQgYml0cyBjb21wYXJpbmcgdG8gcHJldmlvdXMgdmVyc2lvbi4KKyNlbHNlCisgIFVMT05HICB1bFBpeGVsQ2xvY2s6MjQ7ICAgICAvLyB0YXJnZXQgdGhlIHBpeGVsIGNsb2NrIHRvIGRyaXZlIHRoZSBDUlRDIHRpbWluZy4gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwIG1lYW5zIGRpc2FibGUgUFBMTC9EQ1BMTC4gRXhwYW5kZWQgdG8gMjQgYml0cyBjb21wYXJpbmcgdG8gcHJldmlvdXMgdmVyc2lvbi4KKyAgVUxPTkcgIHVjQ1JUQzo4OyAgICAgICAgICAgIC8vIEFUT01fQ1JUQzF+NiwgaW5kaWNhdGUgdGhlIENSVEMgY29udHJvbGxlciB0byAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRyaXZlIHRoZSBwaXhlbCBjbG9jay4gbm90IHVzZWQgZm9yIERDUExMIGNhc2UuCisjZW5kaWYKK31DUlRDX1BJWEVMX0NMT0NLX0ZSRVE7CisKK3R5cGVkZWYgc3RydWN0IF9QSVhFTF9DTE9DS19QQVJBTUVURVJTX1Y2Cit7CisgIHVuaW9ueworICAgIENSVENfUElYRUxfQ0xPQ0tfRlJFUSB1bENydGNQY2xrRnJlcTsgICAgLy8gcGl4ZWwgY2xvY2sgYW5kIENSVEMgaWQgZnJlcXVlbmN5IAorICAgIFVMT05HIHVsRGlzcEVuZ0Nsa0ZyZXE7ICAgICAgICAgICAgICAgICAgLy8gZGlzcGNsayBmcmVxdWVuY3kKKyAgfTsKKyAgVVNIT1JUIHVzRmJEaXY7ICAgICAgICAgICAgLy8gZmVlZGJhY2sgZGl2aWRlciBpbnRlZ2VyIHBhcnQuIAorICBVQ0hBUiAgdWNQb3N0RGl2OyAgICAgICAgICAvLyBwb3N0IGRpdmlkZXIuIAorICBVQ0hBUiAgdWNSZWZEaXY7ICAgICAgICAgICAvLyBSZWZlcmVuY2UgZGl2aWRlcgorICBVQ0hBUiAgdWNQcGxsOyAgICAgICAgICAgICAvLyBBVE9NX1BQTEwxL0FUT01fUFBMTDIvQVRPTV9EQ1BMTAorICBVQ0hBUiAgdWNUcmFuc21pdHRlcklEOyAgICAvLyBBU0lDIGVuY29kZXIgaWQgZGVmaW5lZCBpbiBvYmplY3RJZC5oLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5kaWNhdGUgd2hpY2ggZ3JhcGhpYyBlbmNvZGVyIHdpbGwgYmUgdXNlZC4gCisgIFVDSEFSICB1Y0VuY29kZXJNb2RlOyAgICAgIC8vIEVuY29kZXIgbW9kZTogCisgIFVDSEFSICB1Y01pc2NJbmZvOyAgICAgICAgIC8vIGJpdFswXT0gRm9yY2UgcHJvZ3JhbSBQUExMIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiaXRbMV09IHdoZW4gVkdBIHRpbWluZyBpcyB1c2VkLiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYml0WzM6Ml09IEhETUkgcGFuZWwgYml0IGRlcHRoOiA9MDogMjRicHAgPTE6MzBicHAsID0yOjMyYnBwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJpdFs0XT0gUmVmQ2xvY2sgc291cmNlIGZvciBQUExMLiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gPTA6IFhUTEFJTiggZGVmYXVsdCBtb2RlICkKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA9MTogb3RoZXIgZXh0ZXJuYWwgY2xvY2sgc291cmNlLCB3aGljaCBpcyBwcmUtZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBieSBWQklPUyBkZXBlbmQgb24gdGhlIGZlYXR1cmUgcmVxdWlyZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJpdFs3OjVdOiByZXNlcnZlZC4KKyAgVUxPTkcgIHVsRmJEaXZEZWNGcmFjOyAgICAgLy8gMjAgYml0IGZlZWRiYWNrIGRpdmlkZXIgZGVjaW1hbCBmcmFjdGlvbiBwYXJ0LCByYW5nZSBmcm9tIDF+OTk5OTk5ICggMC4wMDAwMDEgdG8gMC45OTk5OTkgKQorCit9UElYRUxfQ0xPQ0tfUEFSQU1FVEVSU19WNjsKKworI2RlZmluZSBQSVhFTF9DTE9DS19WNl9NSVNDX0ZPUkNFX1BST0dfUFBMTAkJCQkJMHgwMQorI2RlZmluZSBQSVhFTF9DTE9DS19WNl9NSVNDX1ZHQV9NT0RFCQkJCQkJCQkweDAyCisjZGVmaW5lIFBJWEVMX0NMT0NLX1Y2X01JU0NfSERNSV9CUFBfTUFTSyAgICAgICAgICAgMHgwYworI2RlZmluZSBQSVhFTF9DTE9DS19WNl9NSVNDX0hETUlfMjRCUFAgICAgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgUElYRUxfQ0xPQ0tfVjZfTUlTQ19IRE1JXzM2QlBQICAgICAgICAgICAgICAweDA0CisjZGVmaW5lIFBJWEVMX0NMT0NLX1Y2X01JU0NfSERNSV8zMEJQUCAgICAgICAgICAgICAgMHgwOAorI2RlZmluZSBQSVhFTF9DTE9DS19WNl9NSVNDX0hETUlfNDhCUFAgICAgICAgICAgICAgIDB4MGMKKyNkZWZpbmUgUElYRUxfQ0xPQ0tfVjZfTUlTQ19SRUZfRElWX1NSQyAgICAgICAgICAgICAweDEwCisKIHR5cGVkZWYgc3RydWN0IF9HRVRfRElTUF9QTExfU1RBVFVTX0lOUFVUX1BBUkFNRVRFUlNfVjIKIHsKICAgUElYRUxfQ0xPQ0tfUEFSQU1FVEVSU19WMyBzRGlzcENsa0lucHV0OwpAQCAtMTI0MSwxMCArMTU1NSwxMSBAQAogdHlwZWRlZiBzdHJ1Y3QgX0FESlVTVF9ESVNQTEFZX1BMTF9JTlBVVF9QQVJBTUVURVJTX1YzCiB7CiAJVVNIT1JUIHVzUGl4ZWxDbG9jazsgICAgICAgICAgICAgICAgICAgIC8vIHRhcmdldCBwaXhlbCBjbG9jawotCVVDSEFSIHVjVHJhbnNtaXR0ZXJJRDsgICAgICAgICAgICAgICAgICAvLyB0cmFuc21pdHRlciBpZCBkZWZpbmVkIGluIG9iamVjdGlkLmgKKwlVQ0hBUiB1Y1RyYW5zbWl0dGVySUQ7ICAgICAgICAgICAgICAgICAgLy8gR1BVIHRyYW5zbWl0dGVyIGlkIGRlZmluZWQgaW4gb2JqZWN0aWQuaAogCVVDSEFSIHVjRW5jb2RlTW9kZTsgICAgICAgICAgICAgICAgICAgICAvLyBlbmNvZGVyIG1vZGU6IENSVCwgTFZEUywgRFAsIFRNRFMgb3IgSERNSQogICBVQ0hBUiB1Y0Rpc3BQbGxDb25maWc7ICAgICAgICAgICAgICAgICAvLyBkaXNwbGF5IHBsbCBjb25maWd1cmUgcGFyYW1ldGVyIGRlZmluZWQgYXMgZm9sbG93aW5nIERJU1BQTExfQ09ORklHX1hYWFgKLQlVQ0hBUiB1Y1Jlc2VydmVkWzNdOworICBVQ0hBUiB1Y0V4dFRyYW5zbWl0dGVySUQ7ICAgICAgICAgICAgICAgLy8gZXh0ZXJuYWwgZW5jb2RlciBpZC4KKwlVQ0hBUiB1Y1Jlc2VydmVkWzJdOwogfUFESlVTVF9ESVNQTEFZX1BMTF9JTlBVVF9QQVJBTUVURVJTX1YzOwogCiAvLyB1c0Rpc3BQbGxDb25maWcgdjEuMiBmb3IgUm9hZFJ1bm5lcgpAQCAtMTM1OCw2ICsxNjczLDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICNkZWZpbmUgU1BFRURfRkFOX0NPTlRST0xfUFNfQUxMT0NBVElPTiAgIFdSSVRFX09ORV9CWVRFX0hXX0kyQ19EQVRBX1BBUkFNRVRFUlMKIAorCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8JCiAvLyBTdHJ1Y3R1cmVzIHVzZWQgYnkgUG93ZXJDb25uZWN0b3JEZXRlY3Rpb25UYWJsZQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCQpAQCAtMTQzOCw2ICsxNzU0LDMxIEBACiAjZGVmaW5lIEFUT01fUFBMTF9TU19BTU9VTlRfVjJfTkZSQUNfTUFTSyAgICAgMHgwRjAwCiAjZGVmaW5lIEFUT01fUFBMTF9TU19BTU9VTlRfVjJfTkZSQUNfU0hJRlQgICAgOAogCisvLyBVc2VkIGJ5IERDRTUuMAorIHR5cGVkZWYgc3RydWN0IF9FTkFCTEVfU1BSRUFEX1NQRUNUUlVNX09OX1BQTExfVjMKK3sKKyAgVVNIT1JUICB1c1NwcmVhZFNwZWN0cnVtQW1vdW50RnJhYzsgICAvLyBTU19BTU9VTlRfRFNGUkFDIE5ldyBpbiBEQ0U1LjAKKyAgVUNIQVIgICB1Y1NwcmVhZFNwZWN0cnVtVHlwZTsJICAgICAgICAvLyBCaXRbMF06IDAtRG93biBTcHJlYWQsMS1DZW50ZXIgU3ByZWFkLiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBCaXRbMV06IDEtRXh0LiAwLUludC4gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQml0WzM6Ml06ID0wIFAxUExMID0xIFAyUExMID0yIERDUExMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQml0c1s3OjRdIHJlc2VydmVkCisgIFVDSEFSICAgdWNFbmFibGU7CSAgICAgICAgICAgICAgICAgICAgLy8gQVRPTV9FTkFCTEUgb3IgQVRPTV9ESVNBQkxFCisgIFVTSE9SVCAgdXNTcHJlYWRTcGVjdHJ1bUFtb3VudDsgICAgICAJLy8gSW5jbHVkZXMgU1NfQU1PVU5UX0ZCRElWWzc6MF0gYW5kIFNTX0FNT1VOVF9ORlJBQ19TTElQWzExOjhdICAgIAorICBVU0hPUlQgIHVzU3ByZWFkU3BlY3RydW1TdGVwOwkgICAgICAgIC8vIFNTX1NURVBfU0laRV9EU0ZSQUMKK31FTkFCTEVfU1BSRUFEX1NQRUNUUlVNX09OX1BQTExfVjM7CisgICAgCisjZGVmaW5lIEFUT01fUFBMTF9TU19UWVBFX1YzX0RPV05fU1BSRUFEICAgICAgMHgwMAorI2RlZmluZSBBVE9NX1BQTExfU1NfVFlQRV9WM19DRU5UUkVfU1BSRUFEICAgIDB4MDEKKyNkZWZpbmUgQVRPTV9QUExMX1NTX1RZUEVfVjNfRVhUX1NQUkVBRCAgICAgICAweDAyCisjZGVmaW5lIEFUT01fUFBMTF9TU19UWVBFX1YzX1BQTExfU0VMX01BU0sgICAgMHgwYworI2RlZmluZSBBVE9NX1BQTExfU1NfVFlQRV9WM19QMVBMTCAgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgQVRPTV9QUExMX1NTX1RZUEVfVjNfUDJQTEwgICAgICAgICAgICAweDA0CisjZGVmaW5lIEFUT01fUFBMTF9TU19UWVBFX1YzX0RDUExMICAgICAgICAgICAgMHgwOAorI2RlZmluZSBBVE9NX1BQTExfU1NfQU1PVU5UX1YzX0ZCRElWX01BU0sgICAgIDB4MDBGRgorI2RlZmluZSBBVE9NX1BQTExfU1NfQU1PVU5UX1YzX0ZCRElWX1NISUZUICAgIDAKKyNkZWZpbmUgQVRPTV9QUExMX1NTX0FNT1VOVF9WM19ORlJBQ19NQVNLICAgICAweDBGMDAKKyNkZWZpbmUgQVRPTV9QUExMX1NTX0FNT1VOVF9WM19ORlJBQ19TSElGVCAgICA4CisKICNkZWZpbmUgRU5BQkxFX1NQUkVBRF9TUEVDVFJVTV9PTl9QUExMX1BTX0FMTE9DQVRJT04gIEVOQUJMRV9TUFJFQURfU1BFQ1RSVU1fT05fUFBMTAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0xNzA2LDcgKzIwNDcsNyBAQAogICBVU0hPUlQgICAgICAgIFN0YW5kYXJkVkVTQV9UaW1pbmc7ICAgICAgLy8gT25seSB1c2VkIGJ5IEJpb3MKICAgVVNIT1JUICAgICAgICBGaXJtd2FyZUluZm87ICAgICAgICAgICAgIC8vIFNoYXJlZCBieSB2YXJpb3VzIFNXIGNvbXBvbmVudHMsbGF0ZXN0IHZlcnNpb24gMS40CiAgIFVTSE9SVCAgICAgICAgREFDX0luZm87ICAgICAgICAgICAgICAgICAvLyBXaWxsIGJlIG9ic29sZXRlIGZyb20gUjYwMAotICBVU0hPUlQgICAgICAgIExWRFNfSW5mbzsgICAgICAgICAgICAgICAgLy8gU2hhcmVkIGJ5IHZhcmlvdXMgU1cgY29tcG9uZW50cyxsYXRlc3QgdmVyc2lvbiAxLjEgCisgIFVTSE9SVCAgICAgICAgTENEX0luZm87ICAgICAgICAgICAgICAgICAvLyBTaGFyZWQgYnkgdmFyaW91cyBTVyBjb21wb25lbnRzLGxhdGVzdCB2ZXJzaW9uIDEuMywgd2FzIGNhbGxlZCBMVkRTX0luZm8gCiAgIFVTSE9SVCAgICAgICAgVE1EU19JbmZvOyAgICAgICAgICAgICAgICAvLyBXaWxsIGJlIG9ic29sZXRlIGZyb20gUjYwMAogICBVU0hPUlQgICAgICAgIEFuYWxvZ1RWX0luZm87ICAgICAgICAgICAgLy8gU2hhcmVkIGJ5IHZhcmlvdXMgU1cgY29tcG9uZW50cyxsYXRlc3QgdmVyc2lvbiAxLjEgCiAgIFVTSE9SVCAgICAgICAgU3VwcG9ydGVkRGV2aWNlc0luZm87ICAgICAvLyBXaWxsIGJlIG9ic29sZXRlIGZyb20gUjYwMApAQCAtMTczNiwxMiArMjA3NywxNiBAQAogCVVTSE9SVAkJCQlQb3dlclNvdXJjZUluZm87CQkJCQkvLyBTaGFyZWQgYnkgdmFyaW91cyBTVyBjb21wb25lbnRzLCBsYXRlc3QgdmVyc29pbiAxLjEKIH1BVE9NX01BU1RFUl9MSVNUX09GX0RBVEFfVEFCTEVTOwogCisvLyBGb3IgYmFja3dhcmQgY29tcGF0aWJsZSAKKyNkZWZpbmUgTFZEU19JbmZvICAgICAgICAgICAgICAgIExDRF9JbmZvCisKIHR5cGVkZWYgc3RydWN0IF9BVE9NX01BU1RFUl9EQVRBX1RBQkxFCiB7IAogICBBVE9NX0NPTU1PTl9UQUJMRV9IRUFERVIgc0hlYWRlcjsgIAogICBBVE9NX01BU1RFUl9MSVNUX09GX0RBVEFfVEFCTEVTICAgTGlzdE9mRGF0YVRhYmxlczsKIH1BVE9NX01BU1RFUl9EQVRBX1RBQkxFOwogCisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwkKIC8vIFN0cnVjdHVyZSB1c2VkIGluIE11bHRpbWVkaWFDYXBhYmlsaXR5SW5mb1RhYmxlCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8JCkBAIC0xNzc2LDYgKzIxMjEsNyBAQAogICBVQ0hBUiAgICAgICAgICAgICAgICAgICAgdWNWaWRlb0lucHV0NEluZm87Ly8gVmlkZW8gSW5wdXQgNCBUeXBlICgxOjApIEYvQiBzZXR0aW5nICgyKSBwaHlzaWNhbCBjb25uZWN0b3IgSUQgKDU6MykgcmVzZXJ2ZWQgKDc6NikKIH1BVE9NX01VTFRJTUVESUFfQ09ORklHX0lORk87CiAKKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCQogLy8gU3RydWN0dXJlcyB1c2VkIGluIEZpcm13YXJlSW5mb1RhYmxlCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8JCkBAIC0yMDMxLDggKzIzNzcsNDcgQEAKICAgVUNIQVIgICAgICAgICAgICAgICAgICAgICAgICAgICB1Y1Jlc2VydmVkNFszXTsKIH1BVE9NX0ZJUk1XQVJFX0lORk9fVjJfMTsKIAorLy90aGUgc3RydWN0dXJlIGJlbG93IHRvIGJlIHVzZWQgZnJvbSBOSQorLy91Y1RhYmxlRm9ybWF0UmV2aXNpb249MgorLy91Y1RhYmxlQ29udGVudFJldmlzaW9uPTIKK3R5cGVkZWYgc3RydWN0IF9BVE9NX0ZJUk1XQVJFX0lORk9fVjJfMgoreworICBBVE9NX0NPTU1PTl9UQUJMRV9IRUFERVIgICAgICAgIHNIZWFkZXI7IAorICBVTE9ORyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVsRmlybXdhcmVSZXZpc2lvbjsKKyAgVUxPTkcgICAgICAgICAgICAgICAgICAgICAgICAgICB1bERlZmF1bHRFbmdpbmVDbG9jazsgICAgICAgLy9JbiAxMEtoeiB1bml0CisgIFVMT05HICAgICAgICAgICAgICAgICAgICAgICAgICAgdWxEZWZhdWx0TWVtb3J5Q2xvY2s7ICAgICAgIC8vSW4gMTBLaHogdW5pdAorICBVTE9ORyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVsUmVzZXJ2ZWRbMl07CisgIFVMT05HICAgICAgICAgICAgICAgICAgICAgICAgICAgdWxSZXNlcnZlZDE7ICAgICAgICAgICAgICAgIC8vV2FzIHVsTWF4RW5naW5lQ2xvY2tQTExfT3V0cHV0OyAvL0luIDEwS2h6IHVuaXQqCisgIFVMT05HICAgICAgICAgICAgICAgICAgICAgICAgICAgdWxSZXNlcnZlZDI7ICAgICAgICAgICAgICAgIC8vV2FzIHVsTWF4TWVtb3J5Q2xvY2tQTExfT3V0cHV0OyAvL0luIDEwS2h6IHVuaXQqCisgIFVMT05HICAgICAgICAgICAgICAgICAgICAgICAgICAgdWxNYXhQaXhlbENsb2NrUExMX091dHB1dDsgIC8vSW4gMTBLaHogdW5pdAorICBVTE9ORyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVsQmluYXJ5QWx0ZXJlZEluZm87ICAgICAgICAvL1dhcyB1bEFTSUNNYXhFbmdpbmVDbG9jayAgPworICBVTE9ORyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVsRGVmYXVsdERpc3BFbmdpbmVDbGtGcmVxOyAvL0luIDEwS2h6IHVuaXQuIFRoaXMgaXMgdGhlIGZyZXF1ZW5jeSBiZWZvcmUgRENEVE8sIGNvcnJlc3BvbmRpbmcgdG8gdXNCb290VXBWRERDVm9sdGFnZS4gICAgICAgICAgCisgIFVDSEFSICAgICAgICAgICAgICAgICAgICAgICAgICAgdWNSZXNlcnZlZDM7ICAgICAgICAgICAgICAgIC8vV2FzIHVjQVNJQ01heFRlbXBlcmF0dXJlOworICBVQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgICAgIHVjTWluQWxsb3dlZEJMX0xldmVsOworICBVU0hPUlQgICAgICAgICAgICAgICAgICAgICAgICAgIHVzQm9vdFVwVkREQ1ZvbHRhZ2U7ICAgICAgICAvL0luIE1WIHVuaXQKKyAgVVNIT1JUICAgICAgICAgICAgICAgICAgICAgICAgICB1c0xjZE1pblBpeGVsQ2xvY2tQTExfT3V0cHV0OyAvLyBJbiBNSHogdW5pdAorICBVU0hPUlQgICAgICAgICAgICAgICAgICAgICAgICAgIHVzTGNkTWF4UGl4ZWxDbG9ja1BMTF9PdXRwdXQ7IC8vIEluIE1IeiB1bml0CisgIFVMT05HICAgICAgICAgICAgICAgICAgICAgICAgICAgdWxSZXNlcnZlZDQ7ICAgICAgICAgICAgICAgIC8vV2FzIHVsQXNpY01heGltdW1Wb2x0YWdlCisgIFVMT05HICAgICAgICAgICAgICAgICAgICAgICAgICAgdWxNaW5QaXhlbENsb2NrUExMX091dHB1dDsgIC8vSW4gMTBLaHogdW5pdAorICBVTE9ORyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVsUmVzZXJ2ZWQ1OyAgICAgICAgICAgICAgICAvL1dhcyB1c01pbkVuZ2luZUNsb2NrUExMX0lucHV0IGFuZCB1c01heEVuZ2luZUNsb2NrUExMX0lucHV0CisgIFVMT05HICAgICAgICAgICAgICAgICAgICAgICAgICAgdWxSZXNlcnZlZDY7ICAgICAgICAgICAgICAgIC8vV2FzIHVzTWluRW5naW5lQ2xvY2tQTExfT3V0cHV0IGFuZCB1c01pbk1lbW9yeUNsb2NrUExMX0lucHV0CisgIFVMT05HICAgICAgICAgICAgICAgICAgICAgICAgICAgdWxSZXNlcnZlZDc7ICAgICAgICAgICAgICAgIC8vV2FzIHVzTWF4TWVtb3J5Q2xvY2tQTExfSW5wdXQgYW5kIHVzTWluTWVtb3J5Q2xvY2tQTExfT3V0cHV0CisgIFVTSE9SVCAgICAgICAgICAgICAgICAgICAgICAgICAgdXNSZXNlcnZlZDExOyAgICAgICAgICAgICAgIC8vV2FzIHVzTWF4UGl4ZWxDbG9jazsgIC8vSW4gMTBLaHogdW5pdCwgTWF4LiAgUGNsayB1c2VkIG9ubHkgZm9yIERBQworICBVU0hPUlQgICAgICAgICAgICAgICAgICAgICAgICAgIHVzTWluUGl4ZWxDbG9ja1BMTF9JbnB1dDsgICAvL0luIDEwS2h6IHVuaXQKKyAgVVNIT1JUICAgICAgICAgICAgICAgICAgICAgICAgICB1c01heFBpeGVsQ2xvY2tQTExfSW5wdXQ7ICAgLy9JbiAxMEtoeiB1bml0CisgIFVTSE9SVCAgICAgICAgICAgICAgICAgICAgICAgICAgdXNCb290VXBWRERDSVZvbHRhZ2U7ICAgICAgIC8vSW4gdW5pdCBvZiBtdjsgV2FzIHVzTWluUGl4ZWxDbG9ja1BMTF9PdXRwdXQ7CisgIEFUT01fRklSTVdBUkVfQ0FQQUJJTElUWV9BQ0NFU1MgdXNGaXJtd2FyZUNhcGFiaWxpdHk7CisgIFVTSE9SVCAgICAgICAgICAgICAgICAgICAgICAgICAgdXNDb3JlUmVmZXJlbmNlQ2xvY2s7ICAgICAgIC8vSW4gMTBLaHogdW5pdAkKKyAgVVNIT1JUICAgICAgICAgICAgICAgICAgICAgICAgICB1c01lbW9yeVJlZmVyZW5jZUNsb2NrOyAgICAgLy9JbiAxMEtoeiB1bml0CQorICBVU0hPUlQgICAgICAgICAgICAgICAgICAgICAgICAgIHVzVW5pcGh5RFBNb2RlRXh0Q2xrRnJlcTsgICAvL0luIDEwS2h6IHVuaXQsIGlmIGl0IGlzIDAsIEluIERQIE1vZGUgVW5pcGh5IElucHV0IGNsb2NrIGZyb20gaW50ZXJuYWwgUFBMTCwgb3RoZXJ3aXNlIElucHV0IGNsb2NrIGZyb20gZXh0ZXJuYWwgU3ByZWFkIGNsb2NrCisgIFVDSEFSICAgICAgICAgICAgICAgICAgICAgICAgICAgdWNNZW1vcnlNb2R1bGVfSUQ7ICAgICAgICAgIC8vSW5kaWNhdGUgd2hhdCBpcyB0aGUgYm9hcmQgZGVzaWduCisgIFVDSEFSICAgICAgICAgICAgICAgICAgICAgICAgICAgdWNSZXNlcnZlZDlbM107CisgIFVTSE9SVCAgICAgICAgICAgICAgICAgICAgICAgICAgdXNCb290VXBNVkREQ1ZvbHRhZ2U7ICAgICAgIC8vSW4gdW5pdCBvZiBtdjsgV2FzIHVzTWluUGl4ZWxDbG9ja1BMTF9PdXRwdXQ7CisgIFVTSE9SVCAgICAgICAgICAgICAgICAgICAgICAgICAgdXNSZXNlcnZlZDEyOworICBVTE9ORyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVsUmVzZXJ2ZWQxMFszXTsgICAgICAgICAgICAvLyBOZXcgYWRkZWQgY29tcGFyaW5nIHRvIHByZXZpb3VzIHZlcnNpb24KK31BVE9NX0ZJUk1XQVJFX0lORk9fVjJfMjsKIAotI2RlZmluZSBBVE9NX0ZJUk1XQVJFX0lORk9fTEFTVCAgQVRPTV9GSVJNV0FSRV9JTkZPX1YyXzEKKyNkZWZpbmUgQVRPTV9GSVJNV0FSRV9JTkZPX0xBU1QgIEFUT01fRklSTVdBUkVfSU5GT19WMl8yCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwkKIC8vIFN0cnVjdHVyZXMgdXNlZCBpbiBJbnRlZ3JhdGVkU3lzdGVtSW5mb1RhYmxlCkBAIC0yMjEyLDcgKzI1OTcsNyBAQAogdWNEb2NraW5nUGluQml0OiAgICAgd2hpY2ggYml0IGluIHRoaXMgcmVnaXN0ZXIgdG8gcmVhZCB0aGUgcGluIHN0YXR1czsKIHVjRG9ja2luZ1BpblBvbGFyaXR5OlBvbGFyaXR5IG9mIHRoZSBwaW4gd2hlbiBkb2NrZWQ7CiAKLXVsQ1BVQ2FwSW5mbzogICAgICAgIFs3OjBdPTE6R3JpZmZpbjtbNzowXT0yOkdyZXlob3VuZDtbNzowXT0zOks4LCBvdGhlciBiaXRzIHJlc2VydmVkIGZvciBub3cgYW5kIG11c3QgYmUgMHgwCit1bENQVUNhcEluZm86ICAgICAgICBbNzowXT0xOkdyaWZmaW47Wzc6MF09MjpHcmV5aG91bmQ7Wzc6MF09MzpLOCwgWzc6MF09NDpQaGFyYW9oLCBvdGhlciBiaXRzIHJlc2VydmVkIGZvciBub3cgYW5kIG11c3QgYmUgMHgwCiAKIHVzTnVtYmVyT2ZDeWNsZXNJblBlcmlvZDpJbmRpY2F0ZSBob3cgbWFueSBjeWNsZXMgd2hlbiBQV00gZHV0eSBpcyAxMDAlLgogCkBAIC0yMjUwLDYgKzI2MzUsMTQgQEAKIHVzTWluRG93blN0cmVhbUhUTGlua1dpZHRoOiAgc2FtZSBhcyBhYm92ZS4KICovCiAKKy8vIEFUT01fSU5URUdSQVRFRF9TWVNURU1fSU5GTzo6dWxDUFVDYXBJbmZvICAtIENQVSB0eXBlIGRlZmluaXRpb24gCisjZGVmaW5lICAgIElOVEVHUkFURURfU1lTVEVNX0lORk9fX1VOS05PV05fQ1BVICAgICAgICAgICAgIDAKKyNkZWZpbmUgICAgSU5URUdSQVRFRF9TWVNURU1fSU5GT19fQU1EX0NQVV9fR1JJRkZJTiAgICAgICAgMQorI2RlZmluZSAgICBJTlRFR1JBVEVEX1NZU1RFTV9JTkZPX19BTURfQ1BVX19HUkVZSE9VTkQgICAgICAyCisjZGVmaW5lICAgIElOVEVHUkFURURfU1lTVEVNX0lORk9fX0FNRF9DUFVfX0s4ICAgICAgICAgICAgIDMKKyNkZWZpbmUgICAgSU5URUdSQVRFRF9TWVNURU1fSU5GT19fQU1EX0NQVV9fUEhBUkFPSCAgICAgICAgNAorCisjZGVmaW5lICAgIElOVEVHUkFURURfU1lTVEVNX0lORk9fX0FNRF9DUFVfX01BWF9DT0RFICAgICAgIElOVEVHUkFURURfU1lTVEVNX0lORk9fX0FNRF9DUFVfX1BIQVJBT0ggICAgLy8gdGhpcyBkZWZmIHJlZmxlY3RzIG1heCBkZWZpbmVkIENQVSBjb2RlCiAKICNkZWZpbmUgU1lTVEVNX0NPTkZJR19QT1dFUkVYUFJFU1NfRU5BQkxFICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCiAjZGVmaW5lIFNZU1RFTV9DT05GSUdfUlVOX0FUX09WRVJEUklWRV9FTkdJTkUgICAgICAgICAgICAgMHgwMDAwMDAwMgpAQCAtMjc3OCw4ICszMTcxLDg4IEBACiAjZGVmaW5lIFBBTkVMX1JBTkRPTV9ESVRIRVIgICAweDgwCiAjZGVmaW5lIFBBTkVMX1JBTkRPTV9ESVRIRVJfTUFTSyAgIDB4ODAKIAorI2RlZmluZSBBVE9NX0xWRFNfSU5GT19MQVNUICBBVE9NX0xWRFNfSU5GT19WMTIgICAvLyBubyBuZWVkIHRvIGNoYW5nZSB0aGlzIAogCi0jZGVmaW5lIEFUT01fTFZEU19JTkZPX0xBU1QgIEFUT01fTFZEU19JTkZPX1YxMgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCQorLy8gU3RydWN0dXJlcyB1c2VkIGJ5IExDRF9JbmZvVGFibGUgVjEuMyAgICBOb3RlOiBwcmV2aW91cyB2ZXJzaW9uIHdhcyBjYWxsZWQgQVRPTV9MVkRTX0lORk9fVjEyCisvLyBBU0lDIEZhbWlsaWVzOiAgTkkKKy8vIHVjVGFibGVGb3JtYXRSZXZpc2lvbj0xCisvLyB1Y1RhYmxlQ29udGVudFJldmlzaW9uPTMKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwkKK3R5cGVkZWYgc3RydWN0IF9BVE9NX0xDRF9JTkZPX1YxMworeworICBBVE9NX0NPTU1PTl9UQUJMRV9IRUFERVIgc0hlYWRlcjsgIAorICBBVE9NX0RURF9GT1JNQVQgICAgIHNMQ0RUaW1pbmc7CisgIFVTSE9SVCAgICAgICAgICAgICAgdXNFeHRJbmZvVGFibGVPZmZzZXQ7CisgIFVTSE9SVCAgICAgICAgICAgICAgdXNTdXBwb3J0ZWRSZWZyZXNoUmF0ZTsgICAgIC8vUmVmZXIgdG8gcGFuZWwgaW5mbyB0YWJsZSBpbiBBVE9NQklPUyBleHRlbnNpb24gU3BlYy4KKyAgVUxPTkcgICAgICAgICAgICAgICB1bFJlc2VydmVkMDsKKyAgVUNIQVIgICAgICAgICAgICAgICB1Y0xDRF9NaXNjOyAgICAgICAgICAgICAgICAvLyBSZW9yZ2FuaXplZCBpbiBWMTMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBCaXQwOiB7PTA6c2luZ2xlLCA9MTpkdWFsfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBCaXQxOiB7PTA6TERJIGZvcm1hdCBmb3IgUkdCODg4LCA9MSBGUERJIGZvcm1hdCBmb3IgUkdCODg4fSAgLy8gd2FzIHs9MDo2NjZSR0IsID0xOjg4OFJHQn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQml0MzoyOiB7R3JleSBsZXZlbH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBCaXQ2OjQgQ29sb3IgQml0IERlcHRoIGRlZmluaXRpb24gKHNlZSBiZWxvdyBkZWZpbml0aW9uIGluIEVESUQgVjEuNCBAQllURSAxNGgpIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEJpdDcgICBSZXNlcnZlZC4gIHdhcyBmb3IgQVRPTV9QQU5FTF9NSVNDX0FQSV9FTkFCTEVELCBzdGlsbCBuZWVkIGl0PyAgCisgIFVDSEFSICAgICAgICAgICAgICAgdWNQYW5lbERlZmF1bHRSZWZyZXNoUmF0ZTsKKyAgVUNIQVIgICAgICAgICAgICAgICB1Y1BhbmVsSWRlbnRpZmljYXRpb247CisgIFVDSEFSICAgICAgICAgICAgICAgdWNTU19JZDsKKyAgVVNIT1JUICAgICAgICAgICAgICB1c0xDRFZlbmRlcklEOworICBVU0hPUlQgICAgICAgICAgICAgIHVzTENEUHJvZHVjdElEOworICBVQ0hBUiAgICAgICAgICAgICAgIHVjTENEUGFuZWxfU3BlY2lhbEhhbmRsaW5nQ2FwOyAgLy8gUmVvcmdhbml6ZWQgaW4gVjEzIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEJpdDA6IE9uY2UgREFMIHNlZXMgdGhpcyBDQVAgaXMgc2V0LCBpdCB3aWxsIHJlYWQgRURJRCBmcm9tIExDRCBvbiBpdHMgb3duCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQml0MTogU2VlIExDRFBBTkVMX0NBUF9EUlJfU1VQUE9SVEVECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQml0MjogYSBxdWljayByZWZlcmVuY2Ugd2hldGhlciBhbiBlbWJhZGRlZCBwYW5lbCAoTENEMSApIGlzIExWRFMgKDApIG9yIGVEUCAoMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBCaXQ3LTM6IFJlc2VydmVkIAorICBVQ0hBUiAgICAgICAgICAgICAgIHVjUGFuZWxJbmZvU2l6ZTsJCQkJCSAvLyAgc3RhcnQgZnJvbSBBVE9NX0RURF9GT1JNQVQgdG8gZW5kIG9mIHBhbmVsIGluZm8sIGluY2x1ZGUgRXh0SW5mb1RhYmxlCisgIFVTSE9SVCAgICAgICAgICAgICAgdXNCYWNrbGlnaHRQV007ICAgICAgICAgICAgLy8gIEJhY2tsaWdodCBQV00gaW4gSHouIE5ldyBpbiBfVjEzCisKKyAgVUNIQVIgICAgICAgICAgICAgICB1Y1Bvd2VyU2VxdWVuY2VESUdPTnRvREVfaW40TXM7CisgIFVDSEFSICAgICAgICAgICAgICAgdWNQb3dlclNlcXVlbmNlREV0b1ZBUllfQkxfaW40TXM7CisgIFVDSEFSICAgICAgICAgICAgICAgdWNQb3dlclNlcXVlbmNlREV0b0RJR09OX2luNE1zOworICBVQ0hBUiAgICAgICAgICAgICAgIHVjUG93ZXJTZXF1ZW5jZVZBUllfQkx0b0RFX2luNE1zOworCisgIFVDSEFSICAgICAgICAgICAgICAgdWNPZmZEZWxheV9pbjRNczsKKyAgVUNIQVIgICAgICAgICAgICAgICB1Y1Bvd2VyU2VxdWVuY2VWQVJZX0JMdG9CTE9OX2luNE1zOworICBVQ0hBUiAgICAgICAgICAgICAgIHVjUG93ZXJTZXF1ZW5jZUJMT050b1ZBUllfQkxfaW40TXM7CisgIFVDSEFSICAgICAgICAgICAgICAgdWNSZXNlcnZlZDE7CisKKyAgVUxPTkcgICAgICAgICAgICAgICB1bFJlc2VydmVkWzRdOworfUFUT01fTENEX0lORk9fVjEzOyAgCisKKyNkZWZpbmUgQVRPTV9MQ0RfSU5GT19MQVNUICBBVE9NX0xDRF9JTkZPX1YxMyAgICAKKworLy9EZWZpbml0aW9ucyBmb3IgdWNMQ0RfTWlzYworI2RlZmluZSBBVE9NX1BBTkVMX01JU0NfVjEzX0RVQUwgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBBVE9NX1BBTkVMX01JU0NfVjEzX0ZQREkgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBBVE9NX1BBTkVMX01JU0NfVjEzX0dSRVlfTEVWRUwgICAgICAgICAgICAgMHgwMDAwMDAwQworI2RlZmluZSBBVE9NX1BBTkVMX01JU0NfVjEzX0dSRVlfTEVWRUxfU0hJRlQgICAgICAgMgorI2RlZmluZSBBVE9NX1BBTkVMX01JU0NfVjEzX0NPTE9SX0JJVF9ERVBUSF9NQVNLICAgMHg3MAorI2RlZmluZSBBVE9NX1BBTkVMX01JU0NfVjEzXzZCSVRfUEVSX0NPTE9SICAgICAgICAgMHgxMAorI2RlZmluZSBBVE9NX1BBTkVMX01JU0NfVjEzXzhCSVRfUEVSX0NPTE9SICAgICAgICAgMHgyMAorCisvL0NvbG9yIEJpdCBEZXB0aCBkZWZpbml0aW9uIGluIEVESUQgVjEuNCBAQllURSAxNGgKKy8vQml0IDYgIDUgIDQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgMCAgMCAgMCAgLSAgQ29sb3IgYml0IGRlcHRoIGlzIHVuZGVmaW5lZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAwICAwICAxICAtICA2IEJpdHMgcGVyIFByaW1hcnkgQ29sb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgMCAgMSAgMCAgLSAgOCBCaXRzIHBlciBQcmltYXJ5IENvbG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgIDAgIDEgIDEgIC0gMTAgQml0cyBwZXIgUHJpbWFyeSBDb2xvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAxICAwICAwICAtIDEyIEJpdHMgcGVyIFByaW1hcnkgQ29sb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgMSAgMCAgMSAgLSAxNCBCaXRzIHBlciBQcmltYXJ5IENvbG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgIDEgIDEgIDAgIC0gMTYgQml0cyBwZXIgUHJpbWFyeSBDb2xvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAxICAxICAxICAtIFJlc2VydmVkCisgCisvL0RlZmluaXRpb25zIGZvciB1Y0xDRFBhbmVsX1NwZWNpYWxIYW5kbGluZ0NhcDoKKworLy9PbmNlIERBTCBzZWVzIHRoaXMgQ0FQIGlzIHNldCwgaXQgd2lsbCByZWFkIEVESUQgZnJvbSBMQ0Qgb24gaXRzIG93biBpbnN0ZWFkIG9mIHVzaW5nIHNMQ0RUaW1pbmcgaW4gQVRPTV9MVkRTX0lORk9fVjEyLiAKKy8vT3RoZXIgZW50cmllcyBpbiBBVE9NX0xWRFNfSU5GT19WMTIgYXJlIHN0aWxsIHZhbGlkL3VzZWZ1bCB0byBEQUwgCisjZGVmaW5lCUxDRFBBTkVMX0NBUF9WMTNfUkVBRF9FRElEICAgICAgICAgICAgICAweDEgICAgICAgIC8vID0gTENEUEFORUxfQ0FQX1JFQURfRURJRCBubyBjaGFuZ2UgY29tcGFyaW5nIHRvIHByZXZpb3VzIHZlcnNpb24KKworLy9JZiBhIGRlc2lnbiBzdXBwb3J0cyBEUlIgKGR5bmFtaWMgcmVmcmVzaCByYXRlKSBvbiBpbnRlcm5hbCBwYW5lbHMgKExWRFMgb3IgRURQKSwgdGhpcyBjYXAgaXMgc2V0IGluIHVjTENEUGFuZWxfU3BlY2lhbEhhbmRsaW5nQ2FwIHRvZ2V0aGVyCisvL3dpdGggbXVsdGlwbGUgc3VwcG9ydGVkIHJlZnJlc2ggcmF0ZXNAdXNTdXBwb3J0ZWRSZWZyZXNoUmF0ZS4gVGhpcyBjYXAgc2hvdWxkIG5vdCBiZSBzZXQgd2hlbiBvbmx5IHNsb3cgcmVmcmVzaCByYXRlIGlzIHN1cHBvcnRlZCAoc3RhdGljCisvL3JlZnJlc2ggcmF0ZSBzd2l0Y2ggYnkgU1cuIFRoaXMgaXMgb25seSB2YWxpZCBmcm9tIEFUT01fTFZEU19JTkZPX1YxMgorI2RlZmluZQlMQ0RQQU5FTF9DQVBfVjEzX0RSUl9TVVBQT1JURUQgICAgICAgICAgMHgyICAgICAgICAvLyA9IExDRFBBTkVMX0NBUF9EUlJfU1VQUE9SVEVEIG5vIGNoYW5nZSBjb21wYXJpbmcgdG8gcHJldmlvdXMgdmVyc2lvbgorCisvL1VzZSB0aGlzIGNhcCBiaXQgZm9yIGEgcXVpY2sgcmVmZXJlbmNlIHdoZXRoZXIgYW4gZW1iYWRkZWQgcGFuZWwgKExDRDEgKSBpcyBMVkRTIG9yIGVEUC4KKyNkZWZpbmUJTENEUEFORUxfQ0FQX1YxM19lRFAgICAgICAgICAgICAgICAgICAgIDB4NCAgICAgICAgLy8gPSBMQ0RQQU5FTF9DQVBfZURQIG5vIGNoYW5nZSBjb21wYXJpbmcgdG8gcHJldmlvdXMgdmVyc2lvbgogCiB0eXBlZGVmIHN0cnVjdCAgX0FUT01fUEFUQ0hfUkVDT1JEX01PREUKIHsKQEAgLTI5NDQsOSArMzQxNyw5IEBACiAjZGVmaW5lIE1BWF9EVERfTU9ERV9JTl9WUkFNICAgICAgICAgICAgNgogI2RlZmluZSBBVE9NX0RURF9NT0RFX1NVUFBPUlRfVEJMX1NJWkUgIChNQVhfRFREX01PREVfSU5fVlJBTSoyOCkgICAgLy8yOD0gKFNJWkVPRiBBVE9NX0RURF9GT1JNQVQpIAogI2RlZmluZSBBVE9NX1NURF9NT0RFX1NVUFBPUlRfVEJMX1NJWkUgIDMyKjggICAgICAgICAgICAgICAgICAgICAgICAgLy8zMiBpcyBhIHByZWRlZmluZWQgbnVtYmVyLDg9IChTSVpFT0YgQVRPTV9TVERfRk9STUFUKQotI2RlZmluZSBERlBfRU5DT0RFUl9UWVBFX09GRlNFVAkJCQkJMHg4MAotI2RlZmluZSBEUF9FTkNPREVSX0xBTkVfTlVNX09GRlNFVAkJCTB4ODQKLSNkZWZpbmUgRFBfRU5DT0RFUl9MSU5LX1JBVEVfT0ZGU0VUCQkJMHg4OAorLy8yMCBieXRlcyBmb3IgRW5jb2RlciBUeXBlIGFuZCBEUENEIGluIFNURCBFRElEIGFyZWEKKyNkZWZpbmUgREZQX0VOQ09ERVJfVFlQRV9PRkZTRVQgICAgICAgICAoQVRPTV9FRElEX1JBV19EQVRBU0laRSArIEFUT01fRFREX01PREVfU1VQUE9SVF9UQkxfU0laRSArIEFUT01fU1REX01PREVfU1VQUE9SVF9UQkxfU0laRSAtIDIwKSAgICAKKyNkZWZpbmUgQVRPTV9EUF9EUENEX09GRlNFVCAgICAgICAgICAgICAoREZQX0VOQ09ERVJfVFlQRV9PRkZTRVQgKyA0ICkgICAgICAgIAogCiAjZGVmaW5lIEFUT01fSFdJQ09OMV9TVVJGQUNFX0FERFIgICAgICAgMAogI2RlZmluZSBBVE9NX0hXSUNPTjJfU1VSRkFDRV9BRERSICAgICAgIChBVE9NX0hXSUNPTjFfU1VSRkFDRV9BRERSICsgQVRPTV9IV0lDT05fU1VSRkFDRV9TSVpFKQpAQCAtMjk5NywxNCArMzQ3MCwxNiBAQAogI2RlZmluZSBBVE9NX0RGUDVfRFREX01PREVfVEJMX0FERFIgICAgIChBVE9NX0RGUDVfRURJRF9BRERSICsgQVRPTV9FRElEX1JBV19EQVRBU0laRSkKICNkZWZpbmUgQVRPTV9ERlA1X1NURF9NT0RFX1RCTF9BRERSICAgICAoQVRPTV9ERlA1X0RURF9NT0RFX1RCTF9BRERSICsgQVRPTV9EVERfTU9ERV9TVVBQT1JUX1RCTF9TSVpFKQogCi0jZGVmaW5lIEFUT01fRFBfVFJBSU5JTkdfVEJMX0FERFIJCQkJKEFUT01fREZQNV9TVERfTU9ERV9UQkxfQUREUitBVE9NX1NURF9NT0RFX1NVUFBPUlRfVEJMX1NJWkUpICAgICAgIAorI2RlZmluZSBBVE9NX0RQX1RSQUlOSU5HX1RCTF9BRERSICAgICAgIChBVE9NX0RGUDVfU1REX01PREVfVEJMX0FERFIgKyBBVE9NX1NURF9NT0RFX1NVUFBPUlRfVEJMX1NJWkUpCiAKLSNkZWZpbmUgQVRPTV9TVEFDS19TVE9SQUdFX1NUQVJUICAgICAgICAoQVRPTV9EUF9UUkFJTklOR19UQkxfQUREUisyNTYpICAgICAgIAotI2RlZmluZSBBVE9NX1NUQUNLX1NUT1JBR0VfRU5EICAgICAgICAgIEFUT01fU1RBQ0tfU1RPUkFHRV9TVEFSVCs1MTIgICAgICAgIAorI2RlZmluZSBBVE9NX1NUQUNLX1NUT1JBR0VfU1RBUlQgICAgICAgIChBVE9NX0RQX1RSQUlOSU5HX1RCTF9BRERSICsgMTAyNCkgICAgICAgCisjZGVmaW5lIEFUT01fU1RBQ0tfU1RPUkFHRV9FTkQgICAgICAgICAgQVRPTV9TVEFDS19TVE9SQUdFX1NUQVJUICsgNTEyICAgICAgICAKIAogLy9UaGUgc2l6ZSBiZWxvdyBpcyBpbiBLYiEKICNkZWZpbmUgQVRPTV9WUkFNX1JFU0VSVkVfU0laRSAgICAgICAgICgoKChBVE9NX1NUQUNLX1NUT1JBR0VfRU5EIC0gQVRPTV9IV0lDT04xX1NVUkZBQ0VfQUREUik+PjEwKSs0KSYweEZGRkMpCiAgICAKKyNkZWZpbmUgQVRPTV9WUkFNX1JFU0VSVkVfVjJfU0laRSAgICAgIDMyCisKICNkZWZpbmUJQVRPTV9WUkFNX09QRVJBVElPTl9GTEFHU19NQVNLICAgICAgICAgMHhDMDAwMDAwMEwKICNkZWZpbmUgQVRPTV9WUkFNX09QRVJBVElPTl9GTEFHU19TSElGVCAgICAgICAgMzAKICNkZWZpbmUJQVRPTV9WUkFNX0JMT0NLX05FRURTX05PX1JFU0VSVkFUSU9OICAgMHgxCkBAIC0zMjA2LDYgKzM2ODEsMTUgQEAKICAgVVNIT1JUICAgIHVzR3JhcGhpY09iaklkc1sxXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vMXN0IEVuY29kZXIgT2JqIHNvdXJjZSBmcm9tIEdQVSB0byBsYXN0IEdyYXBoaWMgT2JqIGRlc3RpbmF0ZSB0byBjb25uZWN0b3IuCiB9QVRPTV9ESVNQTEFZX09CSkVDVF9QQVRIOwogCit0eXBlZGVmIHN0cnVjdCAgX0FUT01fRElTUExBWV9FWFRFUk5BTF9PQkpFQ1RfUEFUSAoreworICBVU0hPUlQgICAgdXNEZXZpY2VUYWc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3N1cHBvcnRlZCBkZXZpY2UgCisgIFVTSE9SVCAgICB1c1NpemU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vdGhlIHNpemUgb2YgQVRPTV9ESVNQTEFZX09CSkVDVF9QQVRICisgIFVTSE9SVCAgICB1c0Nvbm5PYmplY3RJZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vQ29ubmVjdG9yIE9iamVjdCBJRCAKKyAgVVNIT1JUICAgIHVzR1BVT2JqZWN0SWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9HUFUgSUQgCisgIFVTSE9SVCAgICB1c0dyYXBoaWNPYmpJZHNbMl07ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vdXNHcmFwaGljT2JqSWRzWzBdPSBHUFUgaW50ZXJuYWwgZW5jb2RlciwgdXNHcmFwaGljT2JqSWRzWzFdPSBleHRlcm5hbCBlbmNvZGVyIAorfUFUT01fRElTUExBWV9FWFRFUk5BTF9PQkpFQ1RfUEFUSDsKKwogdHlwZWRlZiBzdHJ1Y3QgX0FUT01fRElTUExBWV9PQkpFQ1RfUEFUSF9UQUJMRQogewogICBVQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgICAgIHVjTnVtT2ZEaXNwUGF0aDsKQEAgLTMyNjEsNiArMzc0NSw0NyBAQAogI2RlZmluZSBFWFRfQVVYRERDX0xVVElOREVYXzcgICAgICAgICAgICAgICAgICAgNwogI2RlZmluZSBNQVhfTlVNQkVSX09GX0VYVF9BVVhERENfTFVUX0VOVFJJRVMgICAoRVhUX0FVWEREQ19MVVRJTkRFWF83KzEpCiAKKy8vdWNDaGFubmVsTWFwcGluZyBhcmUgZGVmaW5lZCBhcyBmb2xsb3dpbmcKKy8vZm9yIERQIGNvbm5lY3RvciwgZURQLCBEUCB0byBWR0EvTFZEUyAKKy8vQml0WzE6MF06IERlZmluZSB3aGljaCBwaW4gY29ubmVjdCB0byBEUCBjb25uZWN0b3IgRFBfTGFuZTAsID0wOiBzb3VyY2UgZnJvbSBHUFUgcGluIFRYMCwgPTE6IGZyb20gR1BVIHBpbiBUWDEsID0yOiBmcm9tIEdQVSBwaW4gVFgyLCA9MyBmcm9tIEdQVSBwaW4gVFgzCisvL0JpdFszOjJdOiBEZWZpbmUgd2hpY2ggcGluIGNvbm5lY3QgdG8gRFAgY29ubmVjdG9yIERQX0xhbmUxLCA9MDogc291cmNlIGZyb20gR1BVIHBpbiBUWDAsID0xOiBmcm9tIEdQVSBwaW4gVFgxLCA9MjogZnJvbSBHUFUgcGluIFRYMiwgPTMgZnJvbSBHUFUgcGluIFRYMworLy9CaXRbNTo0XTogRGVmaW5lIHdoaWNoIHBpbiBjb25uZWN0IHRvIERQIGNvbm5lY3RvciBEUF9MYW5lMiwgPTA6IHNvdXJjZSBmcm9tIEdQVSBwaW4gVFgwLCA9MTogZnJvbSBHUFUgcGluIFRYMSwgPTI6IGZyb20gR1BVIHBpbiBUWDIsID0zIGZyb20gR1BVIHBpbiBUWDMKKy8vQml0Wzc6Nl06IERlZmluZSB3aGljaCBwaW4gY29ubmVjdCB0byBEUCBjb25uZWN0b3IgRFBfTGFuZTMsID0wOiBzb3VyY2UgZnJvbSBHUFUgcGluIFRYMCwgPTE6IGZyb20gR1BVIHBpbiBUWDEsID0yOiBmcm9tIEdQVSBwaW4gVFgyLCA9MyBmcm9tIEdQVSBwaW4gVFgzCit0eXBlZGVmIHN0cnVjdCBfQVRPTV9EUF9DT05OX0NIQU5ORUxfTUFQUElORworeworI2lmIEFUT01fQklHX0VORElBTgorICBVQ0hBUiB1Y0RQX0xhbmUzX1NvdXJjZToyOworICBVQ0hBUiB1Y0RQX0xhbmUyX1NvdXJjZToyOworICBVQ0hBUiB1Y0RQX0xhbmUxX1NvdXJjZToyOworICBVQ0hBUiB1Y0RQX0xhbmUwX1NvdXJjZToyOworI2Vsc2UKKyAgVUNIQVIgdWNEUF9MYW5lMF9Tb3VyY2U6MjsKKyAgVUNIQVIgdWNEUF9MYW5lMV9Tb3VyY2U6MjsKKyAgVUNIQVIgdWNEUF9MYW5lMl9Tb3VyY2U6MjsKKyAgVUNIQVIgdWNEUF9MYW5lM19Tb3VyY2U6MjsKKyNlbmRpZgorfUFUT01fRFBfQ09OTl9DSEFOTkVMX01BUFBJTkc7CisKKy8vZm9yIERWSS9IRE1JLCBpbiBkdWFsIGxpbmsgY2FzZSwgYm90aCBsaW5rcyBoYXZlIHRvIGhhdmUgc2FtZSBtYXBwaW5nLiAKKy8vQml0WzE6MF06IERlZmluZSB3aGljaCBwaW4gY29ubmVjdCB0byBEVkkgY29ubmVjdG9yIGRhdGEgTGFuZTIsID0wOiBzb3VyY2UgZnJvbSBHUFUgcGluIFRYMCwgPTE6IGZyb20gR1BVIHBpbiBUWDEsID0yOiBmcm9tIEdQVSBwaW4gVFgyLCA9MyBmcm9tIEdQVSBwaW4gVFgzCisvL0JpdFszOjJdOiBEZWZpbmUgd2hpY2ggcGluIGNvbm5lY3QgdG8gRFZJIGNvbm5lY3RvciBkYXRhIExhbmUxLCA9MDogc291cmNlIGZyb20gR1BVIHBpbiBUWDAsID0xOiBmcm9tIEdQVSBwaW4gVFgxLCA9MjogZnJvbSBHUFUgcGluIFRYMiwgPTMgZnJvbSBHUFUgcGluIFRYMworLy9CaXRbNTo0XTogRGVmaW5lIHdoaWNoIHBpbiBjb25uZWN0IHRvIERWSSBjb25uZWN0b3IgZGF0YSBMYW5lMCwgPTA6IHNvdXJjZSBmcm9tIEdQVSBwaW4gVFgwLCA9MTogZnJvbSBHUFUgcGluIFRYMSwgPTI6IGZyb20gR1BVIHBpbiBUWDIsID0zIGZyb20gR1BVIHBpbiBUWDMKKy8vQml0Wzc6Nl06IERlZmluZSB3aGljaCBwaW4gY29ubmVjdCB0byBEVkkgY29ubmVjdG9yIGNsb2NrIGxhbmUsID0wOiBzb3VyY2UgZnJvbSBHUFUgcGluIFRYMCwgPTE6IGZyb20gR1BVIHBpbiBUWDEsID0yOiBmcm9tIEdQVSBwaW4gVFgyLCA9MyBmcm9tIEdQVSBwaW4gVFgzCit0eXBlZGVmIHN0cnVjdCBfQVRPTV9EVklfQ09OTl9DSEFOTkVMX01BUFBJTkcKK3sKKyNpZiBBVE9NX0JJR19FTkRJQU4KKyAgVUNIQVIgdWNEVklfQ0xLX1NvdXJjZToyOworICBVQ0hBUiB1Y0RWSV9EQVRBMF9Tb3VyY2U6MjsKKyAgVUNIQVIgdWNEVklfREFUQTFfU291cmNlOjI7CisgIFVDSEFSIHVjRFZJX0RBVEEyX1NvdXJjZToyOworI2Vsc2UKKyAgVUNIQVIgdWNEVklfREFUQTJfU291cmNlOjI7CisgIFVDSEFSIHVjRFZJX0RBVEExX1NvdXJjZToyOworICBVQ0hBUiB1Y0RWSV9EQVRBMF9Tb3VyY2U6MjsKKyAgVUNIQVIgdWNEVklfQ0xLX1NvdXJjZToyOworI2VuZGlmCit9QVRPTV9EVklfQ09OTl9DSEFOTkVMX01BUFBJTkc7CisKIHR5cGVkZWYgc3RydWN0IF9FWFRfRElTUExBWV9QQVRICiB7CiAgIFVTSE9SVCAgdXNEZXZpY2VUYWc7ICAgICAgICAgICAgICAgICAgICAvL0EgYml0IHZlY3RvciB0byBzaG93IHdoYXQgZGV2aWNlcyBhcmUgc3VwcG9ydGVkIApAQCAtMzI2OSw3ICszNzk0LDEzIEBACiAgIFVDSEFSICAgdWNFeHRBVVhERENMdXRJbmRleDsgICAgICAgICAgICAvL0FuIGluZGV4IGludG8gZXh0ZXJuYWwgQVVYL0REQyBjaGFubmVsIExVVAogICBVQ0hBUiAgIHVjRXh0SFBEUElOTHV0SW5kZXg7ICAgICAgICAgICAgLy9BbiBpbmRleCBpbnRvIGV4dGVybmFsIEhQRCBwaW4gTFVUCiAgIFVTSE9SVCAgdXNFeHRFbmNvZGVyT2JqSWQ7ICAgICAgICAgICAgICAvL2V4dGVybmFsIGVuY29kZXIgb2JqZWN0IGlkCi0gIFVTSE9SVCAgdXNSZXNlcnZlZFszXTsgCisgIHVuaW9ueworICAgIFVDSEFSICAgdWNDaGFubmVsTWFwcGluZzsgICAgICAgICAgICAgICAgICAvLyBpZiB1Y0NoYW5uZWxNYXBwaW5nPTAsIHVzaW5nIGRlZmF1bHQgb25lIHRvIG9uZSBtYXBwaW5nCisgICAgQVRPTV9EUF9DT05OX0NIQU5ORUxfTUFQUElORyBhc0RQTWFwcGluZzsKKyAgICBBVE9NX0RWSV9DT05OX0NIQU5ORUxfTUFQUElORyBhc0RWSU1hcHBpbmc7CisgIH07CisgIFVDSEFSICAgdWNSZXNlcnZlZDsKKyAgVVNIT1JUICB1c1Jlc2VydmVkWzJdOyAKIH1FWFRfRElTUExBWV9QQVRIOwogICAgCiAjZGVmaW5lIE5VTUJFUl9PRl9VQ0hBUl9GT1JfR1VJRCAgICAgICAgICAxNgpAQCAtMzI4MSw3ICszODEyLDggQEAKICAgVUNIQVIgICAgICAgICAgICAgICAgICAgIHVjR3VpZCBbTlVNQkVSX09GX1VDSEFSX0ZPUl9HVUlEXTsgICAgIC8vIGEgR1VJRCBpcyBhIDE2IGJ5dGUgbG9uZyBzdHJpbmcKICAgRVhUX0RJU1BMQVlfUEFUSCAgICAgICAgIHNQYXRoW01BWF9OVU1CRVJfT0ZfRVhUX0RJU1BMQVlfUEFUSF07IC8vIHRvdGFsIG9mIGZpeGVkIDcgZW50cmllcy4KICAgVUNIQVIgICAgICAgICAgICAgICAgICAgIHVjQ2hlY2tzdW07ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGEgIHNpbXBsZSBDaGVja3N1bSBvZiB0aGUgc3VtIG9mIHdob2xlIHN0cnVjdHVyZSBlcXVhbCB0byAweDAuIAotICBVQ0hBUiAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQgWzddOyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9yIHBvdGVudGlhbCBleHBhbnNpb24KKyAgVUNIQVIgICAgICAgICAgICAgICAgICAgIHVjM0RTdGVyZW9QaW5JZDsgICAgICAgICAgICAgICAgICAgICAgIC8vIHVzZSBmb3IgZURQIHBhbmVsCisgIFVDSEFSICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZCBbNl07ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3IgcG90ZW50aWFsIGV4cGFuc2lvbgogfUFUT01fRVhURVJOQUxfRElTUExBWV9DT05ORUNUSU9OX0lORk87CiAKIC8vUmVsYXRlZCBkZWZpbml0aW9ucywgYWxsIHJlY29yZHMgYXJlIGRpZmZlcm50IGJ1dCB0aGV5IGhhdmUgYSBjb21tb25kIGhlYWRlcgpAQCAtMzMxMSwxMCArMzg0MywxMSBAQAogI2RlZmluZSBBVE9NX0NPTk5FQ1RPUl9BVVhERENfTFVUX1JFQ09SRF9UWVBFICAgICAgICAgIDE3IC8vVGhpcyBpcyBmb3IgdGhlIGNhc2Ugd2hlbiBjb25uZWN0b3JzIGFyZSBub3Qga25vd24gdG8gb2JqZWN0IHRhYmxlCiAjZGVmaW5lIEFUT01fT0JKRUNUX0xJTktfUkVDT1JEX1RZUEUgICAgICAgICAgICAgICAgICAgMTggLy9PbmNlIHRoaXMgcmVjb3JkIGlzIHByZXNlbnQgdW5kZXIgb25lIG9iamVjdCwgaXQgaW5kaWNhdHMgdGhlIG9vYmplY3QgaXMgbGlua2VkIHRvIGFub3RoZXIgb2JqIGRlc2NyaWJlZCBieSB0aGUgcmVjb3JkCiAjZGVmaW5lIEFUT01fQ09OTkVDVE9SX1JFTU9URV9DQVBfUkVDT1JEX1RZUEUgICAgICAgICAgMTkKKyNkZWZpbmUgQVRPTV9FTkNPREVSX0NBUF9SRUNPUkRfVFlQRSAgICAgICAgICAgICAgICAgICAyMAogCiAKIC8vTXVzdCBiZSB1cGRhdGVkIHdoZW4gbmV3IHJlY29yZCB0eXBlIGlzIGFkZGVkLGVxdWFsIHRvIHRoYXQgcmVjb3JkIGRlZmluaXRpb24hCi0jZGVmaW5lIEFUT01fTUFYX09CSkVDVF9SRUNPUkRfTlVNQkVSICAgICAgICAgICAgIEFUT01fQ09OTkVDVE9SX1JFTU9URV9DQVBfUkVDT1JEX1RZUEUKKyNkZWZpbmUgQVRPTV9NQVhfT0JKRUNUX1JFQ09SRF9OVU1CRVIgICAgICAgICAgICAgQVRPTV9FTkNPREVSX0NBUF9SRUNPUkRfVFlQRQogCiB0eXBlZGVmIHN0cnVjdCAgX0FUT01fSTJDX1JFQ09SRAogewpAQCAtMzQ0MSw2ICszOTc0LDI2IEBACiAgIFVDSEFSICAgICAgICAgICAgICAgICAgICAgICB1Y1BhZGRpbmdbMl07CiB9QVRPTV9FTkNPREVSX0RWT19DRl9SRUNPUkQ7CiAKKy8vIEJpdCBtYXBzIGZvciBBVE9NX0VOQ09ERVJfQ0FQX1JFQ09SRC51Y0VuY29kZXJDYXAKKyNkZWZpbmUgQVRPTV9FTkNPREVSX0NBUF9SRUNPUkRfSEJSMiAgICAgMHgwMSAgICAgICAgIC8vIERQMS4yIEhCUjIgaXMgc3VwcG9ydGVkIGJ5IHRoaXMgcGF0aAorCit0eXBlZGVmIHN0cnVjdCAgX0FUT01fRU5DT0RFUl9DQVBfUkVDT1JECit7CisgIEFUT01fQ09NTU9OX1JFQ09SRF9IRUFERVIgICBzaGVhZGVyOworICB1bmlvbiB7CisgICAgVVNIT1JUICAgICAgICAgICAgICAgICAgICB1c0VuY29kZXJDYXA7ICAgICAgICAgCisgICAgc3RydWN0IHsKKyNpZiBBVE9NX0JJR19FTkRJQU4KKyAgICAgIFVTSE9SVCAgICAgICAgICAgICAgICAgIHVzUmVzZXJ2ZWQ6MTU7ICAgICAgICAvLyBCaXQxLTE1IG1heSBiZSBkZWZpbmVkIGZvciBvdGhlciBjYXBhYmlsaXR5IGluIGZ1dHVyZQorICAgICAgVVNIT1JUICAgICAgICAgICAgICAgICAgdXNIQlIyQ2FwOjE7ICAgICAgICAgIC8vIEJpdDAgaXMgZm9yIERQMS4yIEhCUjIgY2FwYWJpbGl0eS4gCisjZWxzZQorICAgICAgVVNIT1JUICAgICAgICAgICAgICAgICAgdXNIQlIyQ2FwOjE7ICAgICAgICAgIC8vIEJpdDAgaXMgZm9yIERQMS4yIEhCUjIgY2FwYWJpbGl0eS4gCisgICAgICBVU0hPUlQgICAgICAgICAgICAgICAgICB1c1Jlc2VydmVkOjE1OyAgICAgICAgLy8gQml0MS0xNSBtYXkgYmUgZGVmaW5lZCBmb3Igb3RoZXIgY2FwYWJpbGl0eSBpbiBmdXR1cmUKKyNlbmRpZgorICAgIH07CisgIH07IAorfUFUT01fRU5DT0RFUl9DQVBfUkVDT1JEOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisKIC8vIHZhbHVlIGZvciBBVE9NX0NPTk5FQ1RPUl9DRl9SRUNPUkQudWNDb25uZWN0ZWREdm9CdW5kbGUKICNkZWZpbmUgQVRPTV9DT05ORUNUT1JfQ0ZfUkVDT1JEX0NPTk5FQ1RFRF9VUFBFUjEyQklUQlVORExFQSAgIDEKICNkZWZpbmUgQVRPTV9DT05ORUNUT1JfQ0ZfUkVDT1JEX0NPTk5FQ1RFRF9MT1dFUjEyQklUQlVORExFQiAgIDIKQEAgLTM1ODAsNiArNDEzMywxMSBAQAogI2RlZmluZQlWT0xUQUdFX0NPTlRST0xfSURfREFDCQkJCQkJCQkweDAyCQkJCQkJCQkJLy9JMkMgY29udHJvbCwgdXNlZCBmb3IgUjV4eC9SNnh4IE1WRERDLE1WRERRIG9yIFZERENJCiAjZGVmaW5lCVZPTFRBR0VfQ09OVFJPTF9JRF9WVDExNnhNCQkJCQkJMHgwMwkJCQkJCQkJCS8vSTJDIGNvbnRyb2wsIHVzZWQgZm9yIFI2eHggQ29yZSBWb2x0YWdlCiAjZGVmaW5lIFZPTFRBR0VfQ09OVFJPTF9JRF9EUzQ0MDIJCQkJCQkJMHgwNAkJCQkJCQkJCQorI2RlZmluZSBWT0xUQUdFX0NPTlRST0xfSURfVVA2MjY2IAkJCQkJCTB4MDUJCQkJCQkJCQkKKyNkZWZpbmUgVk9MVEFHRV9DT05UUk9MX0lEX1NDT1JQSU8JCQkJCQkweDA2CisjZGVmaW5lCVZPTFRBR0VfQ09OVFJPTF9JRF9WVDE1NTZNCQkJCQkJMHgwNwkJCQkJCQkJCQorI2RlZmluZQlWT0xUQUdFX0NPTlRST0xfSURfQ0hMODIyeAkJCQkJCTB4MDgJCQkJCQkJCQkKKyNkZWZpbmUJVk9MVEFHRV9DT05UUk9MX0lEX1ZUMTU4Nk0JCQkJCQkweDA5CiAKIHR5cGVkZWYgc3RydWN0ICBfQVRPTV9WT0xUQUdFX09CSkVDVAogewpAQCAtMzY3MCw2NiArNDIyOCwxNTcgQEAKICNkZWZpbmUgUE9XRVJfU0VOU09SX0dQSU8JCQkJCQkJCTB4MDEKICNkZWZpbmUgUE9XRVJfU0VOU09SX0kyQwkJCQkJCQkJMHgwMgogCit0eXBlZGVmIHN0cnVjdCBfQVRPTV9DTEtfVk9MVF9DQVBBQklMSVRZCit7CisgIFVMT05HICAgICAgdWxWb2x0YWdlSW5kZXg7ICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBWb2x0YWdlIEluZGV4IGluZGljYXRlZCBieSBGVVNFLCBzYW1lIHZvbHRhZ2UgaW5kZXggc2hhcmVkIHdpdGggU0NMSyBEUE0gZnVzZSB0YWJsZSAgICAgICAgCisgIFVMT05HICAgICAgdWxNYXhpbXVtU3VwcG9ydGVkQ0xLOyAgICAgICAgICAgICAgIC8vIE1heGltdW0gY2xvY2sgc3VwcG9ydGVkIHdpdGggc3BlY2lmaWVkIHZvbHRhZ2UgaW5kZXgsIHVuaXQgaW4gMTBrSHoKK31BVE9NX0NMS19WT0xUX0NBUEFCSUxJVFk7CisKK3R5cGVkZWYgc3RydWN0IF9BVE9NX0FWQUlMQUJMRV9TQ0xLX0xJU1QKK3sKKyAgVUxPTkcgICAgICB1bFN1cHBvcnRlZFNDTEs7ICAgICAgICAgICAgICAgLy8gTWF4aW11bSBjbG9jayBzdXBwb3J0ZWQgd2l0aCBzcGVjaWZpZWQgdm9sdGFnZSBpbmRleCwgIHVuaXQgaW4gMTBrSHoKKyAgVVNIT1JUICAgICB1c1ZvbHRhZ2VJbmRleDsgICAgICAgICAgICAgICAgLy8gVGhlIFZvbHRhZ2UgSW5kZXggaW5kaWNhdGVkIGJ5IEZVU0UgZm9yIHNwZWNpZmllZCBTQ0xLICAKKyAgVVNIT1JUICAgICB1c1ZvbHRhZ2VJRDsgICAgICAgICAgICAgICAgICAgLy8gVGhlIFZvbHRhZ2UgSUQgaW5kaWNhdGVkIGJ5IEZVU0UgZm9yIHNwZWNpZmllZCBTQ0xLIAorfUFUT01fQVZBSUxBQkxFX1NDTEtfTElTVDsKKworLy8gQVRPTV9JTlRFR1JBVEVEX1NZU1RFTV9JTkZPX1Y2IHVsU3lzdGVtQ29uZmlnIGNhcCBkZWZpbml0aW9uCisjZGVmaW5lIEFUT01fSUdQX0lORk9fVjZfU1lTVEVNX0NPTkZJR19fUENJRV9QT1dFUl9HQVRJTkdfRU5BQkxFICAgICAgICAgICAgIDEgICAgICAgLy8gcmVmZXIgdG8gdWxTeXN0ZW1Db25maWcgYml0WzBdCisKKy8vIHRoaXMgSW50ZWdyYXRlU3lzdGVtSW5mb1RhYmxlIGlzIHVzZWQgZm9yIExpYW5vL09udGFyaW8gQVBVCiB0eXBlZGVmIHN0cnVjdCBfQVRPTV9JTlRFR1JBVEVEX1NZU1RFTV9JTkZPX1Y2CiB7CiAgIEFUT01fQ09NTU9OX1RBQkxFX0hFQURFUiAgIHNIZWFkZXI7CiAgIFVMT05HICB1bEJvb3RVcEVuZ2luZUNsb2NrOwogICBVTE9ORyAgdWxEZW50aXN0VkNPRnJlcTsgICAgICAgICAgCiAgIFVMT05HICB1bEJvb3RVcFVNQUNsb2NrOyAgICAgICAgICAKLSAgVUxPTkcgIHVsUmVzZXJ2ZWQxWzhdOyAgICAgICAgICAgIAorICBBVE9NX0NMS19WT0xUX0NBUEFCSUxJVFkgICBzRElTUENMS19Wb2x0YWdlWzRdOyAgICAgICAgICAgIAogICBVTE9ORyAgdWxCb290VXBSZXFEaXNwbGF5VmVjdG9yOwogICBVTE9ORyAgdWxPdGhlckRpc3BsYXlNaXNjOwogICBVTE9ORyAgdWxHUFVDYXBJbmZvOwotICBVTE9ORyAgdWxSZXNlcnZlZDJbM107ICAgICAgICAgICAgCisgIFVMT05HICB1bFNCX01NSU9fQmFzZV9BZGRyOworICBVU0hPUlQgdXNSZXF1ZXN0ZWRQV01GcmVxSW5IejsKKyAgVUNIQVIgIHVjSHRjVG1wTG10OyAgIAorICBVQ0hBUiAgdWNIdGNIeXN0TG10OworICBVTE9ORyAgdWxNaW5FbmdpbmVDbG9jazsgICAgICAgICAgIAogICBVTE9ORyAgdWxTeXN0ZW1Db25maWc7ICAgICAgICAgICAgCiAgIFVMT05HICB1bENQVUNhcEluZm87ICAgICAgICAgICAgICAKLSAgVVNIT1JUIHVzTWF4TkJWb2x0YWdlOyAgCi0gIFVTSE9SVCB1c01pbk5CVm9sdGFnZTsgIAotICBVU0hPUlQgdXNCb290VXBOQlZvbHRhZ2U7ICAgICAgICAgCi0gIFVTSE9SVCB1c0V4dERpc3BDb25uSW5mb09mZnNldDsgIAotICBVQ0hBUiAgdWNIdGNUbXBMbXQ7ICAgCi0gIFVDSEFSICB1Y1RqT2Zmc2V0OyAgICAKKyAgVVNIT1JUIHVzTkJQMFZvbHRhZ2U7ICAgICAgICAgICAgICAgCisgIFVTSE9SVCB1c05CUDFWb2x0YWdlOworICBVU0hPUlQgdXNCb290VXBOQlZvbHRhZ2U7ICAgICAgICAgICAgICAgICAgICAgICAKKyAgVVNIT1JUIHVzRXh0RGlzcENvbm5JbmZvT2Zmc2V0OworICBVU0hPUlQgdXNQYW5lbFJlZnJlc2hSYXRlUmFuZ2U7ICAgICAKICAgVUNIQVIgIHVjTWVtb3J5VHlwZTsgIAogICBVQ0hBUiAgdWNVTUFDaGFubmVsTnVtYmVyOwogICBVTE9ORyAgdWxDU1JfTTNfQVJCX0NOVExfREVGQVVMVFsxMF07ICAKICAgVUxPTkcgIHVsQ1NSX00zX0FSQl9DTlRMX1VWRFsxMF07IAogICBVTE9ORyAgdWxDU1JfTTNfQVJCX0NOVExfRlMzRFsxMF07Ci0gIFVMT05HICB1bFJlc2VydmVkM1s0Ml07IAorICBBVE9NX0FWQUlMQUJMRV9TQ0xLX0xJU1QgICBzQXZhaWxfU0NMS1s1XTsKKyAgVUxPTkcgIHVsR01DUmVzdG9yZVJlc2V0VGltZTsKKyAgVUxPTkcgIHVsTWluaW11bU5DbGs7CisgIFVMT05HICB1bElkbGVOQ2xrOworICBVTE9ORyAgdWxERFJfRExMX1Bvd2VyVXBUaW1lOworICBVTE9ORyAgdWxERFJfUExMX1Bvd2VyVXBUaW1lOworICBVU0hPUlQgdXNQQ0lFQ2xrU1NQZXJjZW50YWdlOworICBVU0hPUlQgdXNQQ0lFQ2xrU1NUeXBlOworICBVU0hPUlQgdXNMdmRzU1NQZXJjZW50YWdlOworICBVU0hPUlQgdXNMdmRzU1NwcmVhZFJhdGVJbjEwSHo7CisgIFVTSE9SVCB1c0hETUlTU1BlcmNlbnRhZ2U7CisgIFVTSE9SVCB1c0hETUlTU3ByZWFkUmF0ZUluMTBIejsKKyAgVVNIT1JUIHVzRFZJU1NQZXJjZW50YWdlOworICBVU0hPUlQgdXNEVklTU3ByZWFkUmF0ZUluMTBIejsKKyAgVUxPTkcgIHVsUmVzZXJ2ZWQzWzIxXTsgCiAgIEFUT01fRVhURVJOQUxfRElTUExBWV9DT05ORUNUSU9OX0lORk8gc0V4dERpc3BDb25uSW5mbzsgICAKIH1BVE9NX0lOVEVHUkFURURfU1lTVEVNX0lORk9fVjY7ICAgCiAKKy8vIHVsR1BVQ2FwSW5mbworI2RlZmluZSBJTlRFR1JBVEVEX1NZU1RFTV9JTkZPX1Y2X0dQVUNBUElORk9fX1RNRFNIRE1JX0NPSEVSRU5UX1NJTkdMRVBMTF9NT0RFICAgICAgIDB4MDEKKyNkZWZpbmUgSU5URUdSQVRFRF9TWVNURU1fSU5GT19WNl9HUFVDQVBJTkZPX19ESVNBQkxFX0FVWF9IV19NT0RFX0RFVEVDVElPTiAgICAgICAgICAweDA4CisKKy8vIHVsT3RoZXJEaXNwbGF5TWlzYworI2RlZmluZSBJTlRFR1JBVEVEX1NZU1RFTV9JTkZPX19HRVRfRURJRF9DQUxMQkFDS19GVU5DX1NVUFBPUlQgICAgICAgICAgICAgICAgICAgICAgIDB4MDEKKworCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gQVRPTV9JTlRFR1JBVEVEX1NZU1RFTV9JTkZPX1Y2IERlc2NyaXB0aW9uCi0vL3VsQm9vdFVwRW5naW5lQ2xvY2s6ICAgICAgICAgICAgICBWQklPUyBib290dXAgRW5naW5lIGNsb2NrIGZyZXF1ZW5jeSwgaW4gMTBrSHogdW5pdC4gCi0vL3VsRGVudGlzdFZDT0ZyZXE6ICAgICAgICAgICAgICAgICBEZW50aXN0IFZDTyBjbG9jayBpbiAxMGtIeiB1bml0LiAKLS8vdWxCb290VXBVTUFDbG9jazogICAgICAgICAgICAgICAgIFN5c3RlbSBtZW1vcnkgYm9vdCB1cCBjbG9jayBmcmVxdWVuY3kgaW4gMTBLaHogdW5pdC4gCi0vL3VsUmVzZXJ2ZWQxWzhdICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZCBieSBub3csIG11c3QgYmUgMHgwLiAKLS8vdWxCb290VXBSZXFEaXNwbGF5VmVjdG9yCSAgICAgICAgVkJJT1MgYm9vdCB1cCBkaXNwbGF5IElEcwotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVRPTV9ERVZJQ0VfQ1JUMV9TVVBQT1JUICAgICAgICAgICAgICAgICAgMHgwMDAxCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVE9NX0RFVklDRV9DUlQyX1NVUFBPUlQgICAgICAgICAgICAgICAgICAweDAwMTAKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFUT01fREVWSUNFX0RGUDFfU1VQUE9SVCAgICAgICAgICAgICAgICAgIDB4MDAwOCAKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFUT01fREVWSUNFX0RGUDZfU1VQUE9SVCAgICAgICAgICAgICAgICAgIDB4MDA0MCAKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFUT01fREVWSUNFX0RGUDJfU1VQUE9SVCAgICAgICAgICAgICAgICAgIDB4MDA4MCAgICAgICAKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFUT01fREVWSUNFX0RGUDNfU1VQUE9SVCAgICAgICAgICAgICAgICAgIDB4MDIwMCAgICAgICAKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFUT01fREVWSUNFX0RGUDRfU1VQUE9SVCAgICAgICAgICAgICAgICAgIDB4MDQwMCAgICAgICAgCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVE9NX0RFVklDRV9ERlA1X1NVUFBPUlQgICAgICAgICAgICAgICAgICAweDA4MDAKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFUT01fREVWSUNFX0xDRDFfU1VQUE9SVCAgICAgICAgICAgICAgICAgIDB4MDAwMgotLy91bE90aGVyRGlzcGxheU1pc2MgICAgICAJICAgICAgICBPdGhlciBkaXNwbGF5IHJlbGF0ZWQgZmxhZ3MsIG5vdCBkZWZpbmVkIHlldC4gCi0vL3VsR1BVQ2FwSW5mbyAgICAgICAgICAgICAgICAgICAgICBUQkQKLS8vdWxSZXNlcnZlZDJbM10gICAgICAgICAgICAgICAgICAgIG11c3QgYmUgMHgwIGZvciB0aGUgcmVzZXJ2ZWQuCi0vL3VsU3lzdGVtQ29uZmlnICAgICAgICAgICAgICAgICAgICBUQkQKLS8vdWxDUFVDYXBJbmZvICAgICAgICAgICAgICAgICAgICAgIFRCRAotLy91c01heE5CVm9sdGFnZSAgICAgICAgICAgICAgICAgICAgSGlnaCBOQiB2b2x0YWdlIGluIHVuaXQgb2YgbXYsIGNhbGN1bGF0ZWQgdXNpbmcgY3VycmVudCBWREROQiAoRDI0RjJ4REMpIGFuZCBWREROQiBvZmZzZXQgZnVzZS4gCi0vL3VzTWluTkJWb2x0YWdlICAgICAgICAgICAgICAgICAgICBMb3cgTkIgdm9sdGFnZSBpbiB1bml0IG9mIG12LCBjYWxjdWxhdGVkIHVzaW5nIGN1cnJlbnQgVkRETkIgKEQyNEYyeERDKSBhbmQgVkRETkIgb2Zmc2V0IGZ1c2UuCi0vL3VzQm9vdFVwTkJWb2x0YWdlICAgICAgICAgICAgICAgICBCb290IHVwIE5CIHZvbHRhZ2UgaW4gdW5pdCBvZiBtdi4KLS8vdWNIdGNUbXBMbXQgICAgICAgICAgICAgICAgICAgICAgIEJpdCBbMjI6MTZdIG9mIEQyNEYzeDY0IFRoZXJtYWwgQ29udHJvbCAoSFRDKSBSZWdpc3Rlci4KLS8vdWNUak9mZnNldCAgICAgICAgICAgICAgICAgICAgICAgIEJpdCBbMjg6MjJdIG9mIEQyNEYzeEU0IFRoZXJtdHJpcCBTdGF0dXMgUmVnaXN0ZXIsbWF5IG5vdCBiZSBuZWVkZWQuCi0vL3VjTWVtb3J5VHlwZSAgICAgICAgICAgICAgICAgICAgICBbMzowXT0xOkREUjE7PTI6RERSMjs9MzpERFIzLls3OjRdIGlzIHJlc2VydmVkLgotLy91Y1VNQUNoYW5uZWxOdW1iZXIgICAgICAJICAgICAgICBTeXN0ZW0gbWVtb3J5IGNoYW5uZWwgbnVtYmVycy4gCi0vL3VzRXh0RGlzcENvbm5lY3Rpb25JbmZvT2Zmc2V0ICAgICBBVE9NX0VYVEVSTkFMX0RJU1BMQVlfQ09OTkVDVElPTl9JTkZPIG9mZnNldCByZWxhdGl2ZSB0byBiZWdpbm5pbmcgb2YgdGhpcyB0YWJsZS4gCi0vL3VsQ1NSX00zX0FSQl9DTlRMX0RFRkFVTFRbMTBdICAgICBBcnJheXMgd2l0aCB2YWx1ZXMgZm9yIENTUiBNMyBhcmJpdGVyIGZvciBkZWZhdWx0Ci0vL3VsQ1NSX00zX0FSQl9DTlRMX1VWRFsxMF0gICAgICAgICBBcnJheXMgd2l0aCB2YWx1ZXMgZm9yIENTUiBNMyBhcmJpdGVyIGZvciBVVkQgcGxheWJhY2suCi0vL3VsQ1NSX00zX0FSQl9DTlRMX0ZTM0RbMTBdICAgICAgICBBcnJheXMgd2l0aCB2YWx1ZXMgZm9yIENTUiBNMyBhcmJpdGVyIGZvciBGdWxsIFNjcmVlbiAzRCBhcHBsaWNhdGlvbnMuCisgIEFUT01fSU5URUdSQVRFRF9TWVNURU1fSU5GT19WNiBEZXNjcmlwdGlvbgordWxCb290VXBFbmdpbmVDbG9jazogICAgICAgICAgICAgIFZCSU9TIGJvb3R1cCBFbmdpbmUgY2xvY2sgZnJlcXVlbmN5LCBpbiAxMGtIeiB1bml0LiBpZiBpdCBpcyBlcXVhbCAwLCB0aGVuIFZCSU9TIHVzZSBwcmUtZGVmaW5lZCBib290dXAgZW5naW5lIGNsb2NrCit1bERlbnRpc3RWQ09GcmVxOiAgICAgICAgICAgICAgICAgRGVudGlzdCBWQ08gY2xvY2sgaW4gMTBrSHogdW5pdC4gCit1bEJvb3RVcFVNQUNsb2NrOiAgICAgICAgICAgICAgICAgU3lzdGVtIG1lbW9yeSBib290IHVwIGNsb2NrIGZyZXF1ZW5jeSBpbiAxMEtoeiB1bml0LiAKK3NESVNQQ0xLX1ZvbHRhZ2U6ICAgICAgICAgICAgICAgICBSZXBvcnQgRGlzcGxheSBjbG9jayB2b2x0YWdlIHJlcXVpcmVtZW50LgorIAordWxCb290VXBSZXFEaXNwbGF5VmVjdG9yOiAgICAgICAgIFZCSU9TIGJvb3QgdXAgZGlzcGxheSBJRHMsIGZvbGxvd2luZyBhcmUgc3VwcG9ydGVkIGRldmljZXMgaW4gTGlhbm8vT250YWlvIHByb2plY3RzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFUT01fREVWSUNFX0NSVDFfU1VQUE9SVCAgICAgICAgICAgICAgICAgIDB4MDAwMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFUT01fREVWSUNFX0NSVDJfU1VQUE9SVCAgICAgICAgICAgICAgICAgIDB4MDAxMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFUT01fREVWSUNFX0RGUDFfU1VQUE9SVCAgICAgICAgICAgICAgICAgIDB4MDAwOCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVE9NX0RFVklDRV9ERlA2X1NVUFBPUlQgICAgICAgICAgICAgICAgICAweDAwNDAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVRPTV9ERVZJQ0VfREZQMl9TVVBQT1JUICAgICAgICAgICAgICAgICAgMHgwMDgwICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFUT01fREVWSUNFX0RGUDNfU1VQUE9SVCAgICAgICAgICAgICAgICAgIDB4MDIwMCAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVE9NX0RFVklDRV9ERlA0X1NVUFBPUlQgICAgICAgICAgICAgICAgICAweDA0MDAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFUT01fREVWSUNFX0RGUDVfU1VQUE9SVCAgICAgICAgICAgICAgICAgIDB4MDgwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFUT01fREVWSUNFX0xDRDFfU1VQUE9SVCAgICAgICAgICAgICAgICAgIDB4MDAwMgordWxPdGhlckRpc3BsYXlNaXNjOiAgICAgIAkgICAgICAgIE90aGVyIGRpc3BsYXkgcmVsYXRlZCBmbGFncywgbm90IGRlZmluZWQgeWV0LiAKK3VsR1BVQ2FwSW5mbzogICAgICAgICAgICAgICAgICAgICBiaXRbMF09MDogVE1EUy9IRE1JIENvaGVyZW50IE1vZGUgdXNlIGNhc2NhZGUgUExMIG1vZGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPTE6IFRNRFMvSERNSSBDb2hlcmVudCBNb2RlIHVzZSBzaWduZWwgUExMIG1vZGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0WzNdPTA6IEVuYWJsZSBIVyBBVVggbW9kZSBkZXRlY3Rpb24gbG9naWMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9MTogRGlzYWJsZSBIVyBBVVggbW9kZSBkZXR0aW9uIGxvZ2ljCit1bFNCX01NSU9fQmFzZV9BZGRyOiAgICAgICAgICAgICAgUGh5c2ljYWwgQmFzZSBhZGRyZXNzIHRvIFNCIE1NSU8gc3BhY2UuIERyaXZlciBuZWVkcyB0byBpbml0aWFsaXplIGl0IGZvciBTTVUgdXNhZ2UuCisKK3VzUmVxdWVzdGVkUFdNRnJlcUluSHo6ICAgICAgICAgICBXaGVuIGl0J3Mgc2V0IHRvIDB4MCBieSBTQklPUzogdGhlIExDRCBCYWNrTGlnaHQgaXMgbm90IGNvbnRyb2xsZWQgYnkgR1BVKFNXKS4gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW55IGF0dGVtcHQgdG8gY2hhbmdlIEJMIHVzaW5nIFZCSU9TIGZ1bmN0aW9uIG9yIGVuYWJsZSBWYXJpQnJpIGZyb20gUFAgdGFibGUgaXMgbm90IGVmZmVjdGl2ZSBzaW5jZSBBVE9NX0JJT1NfSU5GT19CTF9DT05UUk9MTEVEX0JZX0dQVT09MDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaGVuIGl0J3Mgc2V0IHRvIGEgbm9uLXplcm8gZnJlcXVlbmN5LCB0aGUgQmFja0xpZ2h0IGlzIGNvbnRyb2xsZWQgYnkgR1BVIChTVykgaW4gb25lIG9mIHR3byB3YXlzIGJlbG93OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuIFNXIHVzZXMgdGhlIEdQVSBCTCBQV00gb3V0cHV0IHRvIGNvbnRyb2wgdGhlIEJMLCBpbiBjaGlzIGNhc2UsIHRoaXMgbm9uLXplcm8gZnJlcXVlbmN5IGRldGVybWluZXMgd2hhdCBmcmVxIEdQVSBzaG91bGQgdXNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZCSU9TIHdpbGwgc2V0IHVwIHByb3BlciBQV00gZnJlcXVlbmN5IGFuZCBBVE9NX0JJT1NfSU5GT19CTF9DT05UUk9MTEVEX0JZX0dQVT09MSxhcyB0aGUgcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYW5naW5nIEJMIHVzaW5nIFZCSU9TIGZ1bmN0aW9uIGlzIGZ1bmN0aW9uYWwgaW4gYm90aCBkcml2ZXIgYW5kIG5vbi1kcml2ZXIgcHJlc2VudCBlbnZpcm9ubWVudDsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGVuYWJsaW5nIFZhcmlCcmkgdW5kZXIgdGhlIGRyaXZlciBlbnZpcm9ubWVudCBmcm9tIFBQIHRhYmxlIGlzIG9wdGlvbmFsLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMi4gU1cgdXNlcyBvdGhlciBtZWFucyB0byBjb250cm9sIEJMIChsaWtlIERQQ0QpLHRoaXMgbm9uLXplcm8gZnJlcXVlbmN5IHNlcnZlcyBhcyBhIGZsYWcgb25seSBpbmRpY2F0aW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdCBCTCBjb250cm9sIGZyb20gR1BVIGlzIGV4cGVjdGVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZCSU9TIHdpbGwgTk9UIHNldCB1cCBQV00gZnJlcXVlbmN5IGJ1dCBtYWtlIEFUT01fQklPU19JTkZPX0JMX0NPTlRST0xMRURfQllfR1BVPT0xCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhbmdpbmcgQkwgdXNpbmcgVkJJT1MgZnVuY3Rpb24gY291bGQgYmUgZnVuY3Rpb25hbCBpbiBib3RoIGRyaXZlciBhbmQgbm9uLWRyaXZlciBwcmVzZW50IGVudmlyb25tZW50LGJ1dAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0J3MgcGVyIHBsYXRmb3JtIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBlbmFibGluZyBWYXJpQnJpIHVuZGVyIHRoZSBkcml2ZXIgZW52aXJvbm1lbnQgZnJvbSBQUCB0YWJsZSBpcyBvcHRpb25hbC4KKwordWNIdGNUbXBMbXQ6ICAgICAgICAgICAgICAgICAgICAgIFJlZmVyIHRvIEQxOEYzeDY0IGJpdFsyMjoxNl0sIEh0Y1RtcExtdC4gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyZXNob2xkIG9uIHZhbHVlIHRvIGVudGVyIEhUQ19hY3RpdmUgc3RhdGUuCit1Y0h0Y0h5c3RMbXQ6ICAgICAgICAgICAgICAgICAgICAgUmVmZXIgdG8gRDE4RjN4NjQgYml0WzI3OjI0XSwgSHRjSHlzdExtdC4gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVG8gY2FsY3VsYXRlIHRocmVzaG9sZCBvZmYgdmFsdWUgdG8gZXhpdCBIVENfYWN0aXZlIHN0YXRlLCB3aGljaCBpcyBUaHJlc2hvbGQgb24gdmxhdWUgbWludXMgdWNIdGNIeXN0TG10LgordWxNaW5FbmdpbmVDbG9jazogICAgICAgICAgICAgICAgIE1pbmltdW0gU0NMSyBhbGxvd2VkIGluIDEwa0h6IHVuaXQuIFRoaXMgaXMgY2FsY3VsYXRlZCBiYXNlZCBvbiBXUkNLIEZ1c2Ugc2V0dGluZ3MuCit1bFN5c3RlbUNvbmZpZzogICAgICAgICAgICAgICAgICAgQml0WzBdPTA6IFBDSUUgUG93ZXIgR2F0aW5nIERpc2FibGVkIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0xOiBQQ0lFIFBvd2VyIEdhdGluZyBFbmFibGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQml0WzFdPTA6IEREUi1ETEwgc2h1dC1kb3duIGZlYXR1cmUgZGlzYWJsZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE6IEREUi1ETEwgc2h1dC1kb3duIGZlYXR1cmUgZW5hYmxlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXRbMl09MDogRERSLVBMTCBQb3dlciBkb3duIGZlYXR1cmUgZGlzYWJsZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE6IEREUi1QTEwgUG93ZXIgZG93biBmZWF0dXJlIGVuYWJsZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCit1bENQVUNhcEluZm86ICAgICAgICAgICAgICAgICAgICAgVEJECit1c05CUDBWb2x0YWdlOiAgICAgICAgICAgICAgICAgICAgVklEIGZvciB2b2x0YWdlIG9uIE5CIFAwIFN0YXRlCit1c05CUDFWb2x0YWdlOiAgICAgICAgICAgICAgICAgICAgVklEIGZvciB2b2x0YWdlIG9uIE5CIFAxIFN0YXRlICAKK3VzQm9vdFVwTkJWb2x0YWdlOiAgICAgICAgICAgICAgICBWb2x0YWdlIEluZGV4IG9mIEdOQiB2b2x0YWdlIGNvbmZpZ3VyZWQgYnkgU0JJT1MsIHdoaWNoIGlzIHN1ZmZjaWVudCB0byBzdXBwb3J0IFZCSU9TIERJU1BDTEsgcmVxdWlyZW1lbnQuCit1c0V4dERpc3BDb25uSW5mb09mZnNldDogICAgICAgICAgT2Zmc2V0IHRvIHNFeHREaXNwQ29ubkluZm8gaW5zaWRlIHRoZSBzdHJ1Y3R1cmUKK3VzUGFuZWxSZWZyZXNoUmF0ZVJhbmdlOiAgICAgICAgICBCaXQgdmVjdG9yIGZvciBMQ0Qgc3VwcG9ydGVkIHJlZnJlc2ggcmF0ZSByYW5nZS4gSWYgRFJSIGlzIHJlcXVlc3RkIGJ5IHRoZSBwbGF0Zm9ybSwgYXQgbGVhc3QgdHdvIGJpdHMgbmVlZCB0byBiZSBzZXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBpbmRpY2F0ZSBhIHJhbmdlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNVUFBPUlRFRF9MQ0RfUkVGUkVTSFJBVEVfMzBIeiAgICAgICAgICAweDAwMDQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVVBQT1JURURfTENEX1JFRlJFU0hSQVRFXzQwSHogICAgICAgICAgMHgwMDA4CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1VQUE9SVEVEX0xDRF9SRUZSRVNIUkFURV81MEh6ICAgICAgICAgIDB4MDAxMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNVUFBPUlRFRF9MQ0RfUkVGUkVTSFJBVEVfNjBIeiAgICAgICAgICAweDAwMjAKK3VjTWVtb3J5VHlwZTogICAgICAgICAgICAgICAgICAgICBbMzowXT0xOkREUjE7PTI6RERSMjs9MzpERFIzLls3OjRdIGlzIHJlc2VydmVkLgordWNVTUFDaGFubmVsTnVtYmVyOiAgICAgIAkgICAgICAgIFN5c3RlbSBtZW1vcnkgY2hhbm5lbCBudW1iZXJzLiAKK3VsQ1NSX00zX0FSQl9DTlRMX0RFRkFVTFRbMTBdOiAgICBBcnJheXMgd2l0aCB2YWx1ZXMgZm9yIENTUiBNMyBhcmJpdGVyIGZvciBkZWZhdWx0Cit1bENTUl9NM19BUkJfQ05UTF9VVkRbMTBdOiAgICAgICAgQXJyYXlzIHdpdGggdmFsdWVzIGZvciBDU1IgTTMgYXJiaXRlciBmb3IgVVZEIHBsYXliYWNrLgordWxDU1JfTTNfQVJCX0NOVExfRlMzRFsxMF06ICAgICAgIEFycmF5cyB3aXRoIHZhbHVlcyBmb3IgQ1NSIE0zIGFyYml0ZXIgZm9yIEZ1bGwgU2NyZWVuIDNEIGFwcGxpY2F0aW9ucy4KK3NBdmFpbF9TQ0xLWzVdOiAgICAgICAgICAgICAgICAgICBBcnJheXMgdG8gcHJvdmlkZSBhdmFpbGFiZSBsaXN0IG9mIFNMQ0sgYW5kIGNvcnJlc3BvbmRpbmcgdm9sdGFnZSwgb3JkZXIgZnJvbSBsb3cgdG8gaGlnaCAgCit1bEdNQ1Jlc3RvcmVSZXNldFRpbWU6ICAgICAgICAgICAgR01DIHBvd2VyIHJlc3RvcmUgYW5kIEdNQyByZXNldCB0aW1lIHRvIGNhbGN1bGF0ZSBkYXRhIHJlY29ubmVjdGlvbiBsYXRlbmN5LiBVbml0IGluIG5zLiAKK3VsTWluaW11bU5DbGs6ICAgICAgICAgICAgICAgICAgICBNaW5pbXVtIE5DTEsgc3BlZWQgYW1vbmcgYWxsIE5CLVBzdGF0ZXMgdG8gY2FsY3VhbHRlIGRhdGEgcmVjb25uZWN0aW9uIGxhdGVuY3kuIFVuaXQgaW4gMTBrSHouIAordWxJZGxlTkNsazogICAgICAgICAgICAgICAgICAgICAgIE5DTEsgc3BlZWQgd2hpbGUgbWVtb3J5IHJ1bnMgaW4gc2VsZi1yZWZyZXNoIHN0YXRlLiBVbml0IGluIDEwa0h6LgordWxERFJfRExMX1Bvd2VyVXBUaW1lOiAgICAgICAgICAgIEREUiBQSFkgRExMIHBvd2VyIHVwIHRpbWUuIFVuaXQgaW4gbnMuCit1bEREUl9QTExfUG93ZXJVcFRpbWU6ICAgICAgICAgICAgRERSIFBIWSBQTEwgcG93ZXIgdXAgdGltZS4gVW5pdCBpbiBucy4KK3VzUENJRUNsa1NTUGVyY2VudGFnZTogICAgICAgICAgICBQQ0lFIENsb2NrIFNwcmVkIFNwZWN0cnVtIFBlcmNlbnRhZ2UgaW4gdW5pdCAwLjAxJTsgMTAwIG1lYW4gMSUuCit1c1BDSUVDbGtTU1R5cGU6ICAgICAgICAgICAgICAgICAgUENJRSBDbG9jayBTcHJlZCBTcGVjdHJ1bSBUeXBlLiAwIGZvciBEb3duIHNwcmVhZChkZWZhdWx0KTsgMSBmb3IgQ2VudGVyIHNwcmVhZC4KK3VzTHZkc1NTUGVyY2VudGFnZTogICAgICAgICAgICAgICBMVkRTIHBhbmVsICggbm90IGluY2x1ZGUgZURQICkgU3ByZWFkIFNwZWN0cnVtIFBlcmNlbnRhZ2UgaW4gdW5pdCBvZiAwLjAxJSwgPTAsIHVzZSBWQklPUyBkZWZhdWx0IHNldHRpbmcuIAordXNMdmRzU1NwcmVhZFJhdGVJbjEwSHo6ICAgICAgICAgIExWRFMgcGFuZWwgKCBub3QgaW5jbHVkZSBlRFAgKSBTcHJlYWQgU3BlY3RydW0gZnJlcXVlbmN5IGluIHVuaXQgb2YgMTBIeiwgPTAsIHVzZSBWQklPUyBkZWZhdWx0IHNldHRpbmcuIAordXNIRE1JU1NQZXJjZW50YWdlOiAgICAgICAgICAgICAgIEhETUkgU3ByZWFkIFNwZWN0cnVtIFBlcmNlbnRhZ2UgaW4gdW5pdCAwLjAxJTsgMTAwIG1lYW4gMSUsICA9MCwgdXNlIFZCSU9TIGRlZmF1bHQgc2V0dGluZy4gCit1c0hETUlTU3ByZWFkUmF0ZUluMTBIejogICAgICAgICAgSERNSSBTcHJlYWQgU3BlY3RydW0gZnJlcXVlbmN5IGluIHVuaXQgb2YgMTBIeiwgID0wLCB1c2UgVkJJT1MgZGVmYXVsdCBzZXR0aW5nLiAKK3VzRFZJU1NQZXJjZW50YWdlOiAgICAgICAgICAgICAgICBEVkkgU3ByZWFkIFNwZWN0cnVtIFBlcmNlbnRhZ2UgaW4gdW5pdCAwLjAxJTsgMTAwIG1lYW4gMSUsICA9MCwgdXNlIFZCSU9TIGRlZmF1bHQgc2V0dGluZy4gCit1c0RWSVNTcHJlYWRSYXRlSW4xMEh6OiAgICAgICAgICAgRFZJIFNwcmVhZCBTcGVjdHJ1bSBmcmVxdWVuY3kgaW4gdW5pdCBvZiAxMEh6LCAgPTAsIHVzZSBWQklPUyBkZWZhdWx0IHNldHRpbmcuIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMzc5MCw2ICs0NDM5LDcgQEAKICNkZWZpbmUgQVNJQ19JTlRFUk5BTF9TU19PTl9MVkRTICAgIDYKICNkZWZpbmUgQVNJQ19JTlRFUk5BTF9TU19PTl9EUCAgICAgIDcKICNkZWZpbmUgQVNJQ19JTlRFUk5BTF9TU19PTl9EQ1BMTCAgIDgKKyNkZWZpbmUgQVNJQ19FWFRFUk5BTF9TU19PTl9EUF9DTE9DSyA5CiAKIHR5cGVkZWYgc3RydWN0IF9BVE9NX0FTSUNfU1NfQVNTSUdOTUVOVF9WMgogewpAQCAtMzkwMyw2ICs0NTUzLDcgQEAKICNkZWZpbmUgQVRPTV9TMF9TWVNURU1fUE9XRVJfU1RBVEVfVkFMVUVfQUMgICAgIDEKICNkZWZpbmUgQVRPTV9TMF9TWVNURU1fUE9XRVJfU1RBVEVfVkFMVUVfREMgICAgIDIKICNkZWZpbmUgQVRPTV9TMF9TWVNURU1fUE9XRVJfU1RBVEVfVkFMVUVfTElURUFDIDMKKyNkZWZpbmUgQVRPTV9TMF9TWVNURU1fUE9XRVJfU1RBVEVfVkFMVUVfTElUMkFDIDQKIAogLy9CeXRlIGFsaWduZWQgZGVmaW50aW9uIGZvciBCSU9TIHVzYWdlCiAjZGVmaW5lIEFUT01fUzBfQ1JUMV9NT05PYjAgICAgICAgICAgICAgMHgwMQpAQCAtNDUyOSw3ICs1MTgwLDggQEAKICNkZWZpbmUgSU5ERVhfQUNDRVNTX1JBTkdFX0JFR0lOCSAgICAoVkFMVUVfRFdPUkQgKyAxKQogI2RlZmluZSBJTkRFWF9BQ0NFU1NfUkFOR0VfRU5ECQkgICAgKElOREVYX0FDQ0VTU19SQU5HRV9CRUdJTiArIDEpCiAjZGVmaW5lIFZBTFVFX0lOREVYX0FDQ0VTU19TSU5HTEUJICAgIChJTkRFWF9BQ0NFU1NfUkFOR0VfRU5EICsgMSkKLQorLy8jZGVmaW5lIEFDQ0VTU19NQ0lPREVCVUdJTkQgICAgICAgICAgICAweDQwICAgICAgIC8vZGVmaW5lZCBpbiBCSU9TIGNvZGUKKyNkZWZpbmUgQUNDRVNTX1BMQUNFSE9MREVSICAgICAgICAgICAgIDB4ODAKIAogdHlwZWRlZiBzdHJ1Y3QgX0FUT01fTUNfSU5JVF9QQVJBTV9UQUJMRQogeyAKQEAgLTQ1NTQsNiArNTIwNiwxMCBAQAogI2RlZmluZSBfMzJNeDMyICAgICAgICAgICAgIDB4MzMKICNkZWZpbmUgXzY0TXg4ICAgICAgICAgICAgICAweDQxCiAjZGVmaW5lIF82NE14MTYgICAgICAgICAgICAgMHg0MgorI2RlZmluZSBfNjRNeDMyICAgICAgICAgICAgIDB4NDMKKyNkZWZpbmUgXzEyOE14OCAgICAgICAgICAgICAweDUxCisjZGVmaW5lIF8xMjhNeDE2ICAgICAgICAgICAgMHg1MgorI2RlZmluZSBfMjU2TXg4ICAgICAgICAgICAgIDB4NjEKIAogI2RlZmluZSBTQU1TVU5HICAgICAgICAgICAgIDB4MQogI2RlZmluZSBJTkZJTkVPTiAgICAgICAgICAgIDB4MgpAQCAtNDU2OSwxMCArNTIyNSwxMSBAQAogI2RlZmluZSBRSU1PTkRBICAgICAgICAgICAgIElORklORU9OCiAjZGVmaW5lIFBST01PUyAgICAgICAgICAgICAgTU9TRUwKICNkZWZpbmUgS1JFVE9OICAgICAgICAgICAgICBJTkZJTkVPTgorI2RlZmluZSBFTElYSVIgICAgICAgICAgICAgIE5BTllBCiAKIC8vLy8vLy8vLy8vLy9TdXBwb3J0IGZvciBHRERSNSBNQyB1Q29kZSB0byByZXNpZGUgaW4gdXBwZXIgNjRLIG9mIFJPTS8vLy8vLy8vLy8vLy8KIAotI2RlZmluZSBVQ09ERV9ST01fU1RBUlRfQUREUkVTUwkJMHgxYzAwMAorI2RlZmluZSBVQ09ERV9ST01fU1RBUlRfQUREUkVTUwkJMHgxYjgwMAogI2RlZmluZQlVQ09ERV9TSUdOQVRVUkUJCQkweDQzNzU0MzRkIC8vICdNQ3VDJyAtIE1DIHVDb2RlCiAKIC8vdUNvZGUgYmxvY2sgaGVhZGVyIGZvciByZWZlcmVuY2UKQEAgLTQ5MDMsNyArNTU2MCwzNCBAQAogICBBVE9NX01FTU9SWV9USU1JTkdfRk9STUFUX1YyICBhc01lbVRpbWluZ1s1XTsvL01lbW9yeSBUaW1pbmcgYmxvY2sgc29ydCBmcm9tIGxvd2VyIGNsb2NrIHRvIGhpZ2hlciBjbG9jawogfUFUT01fVlJBTV9NT0RVTEVfVjY7CiAKLQordHlwZWRlZiBzdHJ1Y3QgX0FUT01fVlJBTV9NT0RVTEVfVjcKK3sKKy8vIERlc2lnbiBTcGVjaWZpYyBWYWx1ZXMKKyAgVUxPTkcJICB1bENoYW5uZWxNYXBDZmc7CSAgICAgICAgICAgICAgICAvLyBtbU1DX1NIQVJFRF9DSFJFTUFQCisgIFVTSE9SVCAgdXNNb2R1bGVTaXplOyAgICAgICAgICAgICAgICAgICAgIC8vIFNpemUgb2YgQVRPTV9WUkFNX01PRFVMRV9WNworICBVU0hPUlQgIHVzUHJpdmF0ZVJlc2VydmVkOyAgICAgICAgICAgICAgICAvLyBNQ19BUkJfUkFNQ0ZHIChpbmNsdWRlcyBOT09GQkFOSyxOT09GUkFOS1MsTk9PRlJPV1MsTk9PRkNPTFMpCisgIFVTSE9SVCAgdXNSZXNlcnZlZDsKKyAgVUNIQVIgICB1Y0V4dE1lbW9yeUlEOyAgICAgICAgICAgICAgICAgICAgLy8gQ3VycmVudCBtZW1vcnkgbW9kdWxlIElECisgIFVDSEFSICAgdWNNZW1vcnlUeXBlOyAgICAgICAgICAgICAgICAgICAgIC8vIE1FTV9UWVBFX0REUjIvRERSMy9HRERSMy9HRERSNQorICBVQ0hBUiAgIHVjQ2hhbm5lbE51bTsgICAgICAgICAgICAgICAgICAgICAvLyBOdW1iZXIgb2YgbWVtLiBjaGFubmVscyBzdXBwb3J0ZWQgaW4gdGhpcyBtb2R1bGUKKyAgVUNIQVIgICB1Y0NoYW5uZWxXaWR0aDsgICAgICAgICAgICAgICAgICAgLy8gQ0hBTk5FTF8xNkJJVC9DSEFOTkVMXzMyQklUL0NIQU5ORUxfNjRCSVQKKyAgVUNIQVIgICB1Y0RlbnNpdHk7ICAgICAgICAgICAgICAgICAgICAgICAgLy8gXzhNeDMyLCBfMTZNeDMyLCBfMTZNeDE2LCBfMzJNeDE2CisgIFVDSEFSCSAgdWNSZXNlcnZlOyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZvcm1lciBjb250YWluZXIgZm9yIE14X0ZMQUdTIGxpa2UgREJJX0FDX01PREVfRU5BQkxFX0FTSUMgZm9yIEdERFI0LiBOb3QgdXNlZCBub3cuCisgIFVDSEFSCSAgdWNNaXNjOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJBTktfT0ZfVEhJU01FTU9SWSBldGMuCisgIFVDSEFSCSAgdWNWUkVGSTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vdCB1c2VkLgorICBVQ0hBUiAgIHVjTlBMX1JUOyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSb3VuZCB0cmlwIGRlbGF5IChNQ19TRVFfQ0FTX1RJTUlORyBbMjg6MjRdOlRDTD1DTCtOUExfUlQtMikuIEFsd2F5cyAyLgorICBVQ0hBUgkgIHVjUHJlYW1ibGU7ICAgICAgICAgICAgICAgICAgICAgICAvLyBbNzo0XSBXcml0ZSBQcmVhbWJsZSwgWzM6MF0gUmVhZCBQcmVhbWJsZQorICBVQ0hBUiAgIHVjTWVtb3J5U2l6ZTsgICAgICAgICAgICAgICAgICAgICAvLyBUb3RhbCBtZW1vcnkgc2l6ZSBpbiB1bml0IG9mIDE2TUIgZm9yIENPTkZJR19NRU1TSVpFIC0gYml0WzIzOjBdIHplcm9zCisgIFVDSEFSICAgdWNSZXNlcnZlZFszXTsKKy8vIE1lbW9yeSBNb2R1bGUgc3BlY2lmaWMgdmFsdWVzCisgIFVTSE9SVCAgdXNFTVJTMlZhbHVlOyAgICAgICAgICAgICAgICAgICAgIC8vIEVNUlMyL01SMiBWYWx1ZS4gCisgIFVTSE9SVCAgdXNFTVJTM1ZhbHVlOyAgICAgICAgICAgICAgICAgICAgIC8vIEVNUlMzL01SMyBWYWx1ZS4KKyAgVUNIQVIgICB1Y01lbW9yeVZlbmRlcklEOyAgICAgICAgICAgICAgICAgLy8gWzc6NF0gUmV2aXNpb24sIFszOjBdIFZlbmRvciBjb2RlCisgIFVDSEFSCSAgdWNSZWZyZXNoUmF0ZUZhY3RvcjsgICAgICAgICAgICAgIC8vIFsxOjBdPVJlZnJlc2hGYWN0b3IgKDAwPThtcywgMDE9MTZtcywgMTA9MzJtcywxMT02NG1zKQorICBVQ0hBUgkgIHVjRklGT0RlcHRoOyAgICAgICAgICAgICAgICAgICAgICAvLyBGSUZPIGRlcHRoIGNhbiBiZSBkZXRlY3RlZCBkdXJpbmcgdmVuZG9yIGRldGVjdGlvbiwgaGVyZSBpcyBoYXJkY29kZWQgcGVyIG1lbW9yeQorICBVQ0hBUiAgIHVjQ0RSX0JhbmR3aWR0aDsgICAgICAgICAgICAgICAgICAvLyBbMDozXT1SZWFkIENEUiBiYW5kd2lkdGgsIFs0OjddIC0gV3JpdGUgQ0RSIEJhbmR3aWR0aAorICBjaGFyICAgIHN0ck1lbVBOU3RyaW5nWzIwXTsgICAgICAgICAgICAgICAvLyBwYXJ0IG51bWJlciBlbmQgd2l0aCAnMCcuIAorfUFUT01fVlJBTV9NT0RVTEVfVjc7CiAKIHR5cGVkZWYgc3RydWN0IF9BVE9NX1ZSQU1fSU5GT19WMgogewpAQCAtNDk0Miw2ICs1NjI2LDIwIEBACiAJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSAvLwlBVE9NX0lOSVRfUkVHX0JMT0NLCQkJCSBhTWVtQWRqdXN0OwogfUFUT01fVlJBTV9JTkZPX1Y0OwogCit0eXBlZGVmIHN0cnVjdCBfQVRPTV9WUkFNX0lORk9fSEVBREVSX1YyXzEKK3sKKyAgQVRPTV9DT01NT05fVEFCTEVfSEVBREVSICAgc0hlYWRlcjsKKwlVU0hPUlQJCQkJCQkJCQkJIHVzTWVtQWRqdXN0VGJsT2Zmc2V0OwkJCQkJCQkJCQkJCQkgLy8gb2Zmc2V0IG9mIEFUT01fSU5JVF9SRUdfQkxPQ0sgc3RydWN0dXJlIGZvciBtZW1vcnkgdmVuZG9yIHNwZWNpZmljIE1DIGFkanVzdCBzZXR0aW5nCisJVVNIT1JUCQkJCQkJCQkJCSB1c01lbUNsa1BhdGNoVGJsT2Zmc2V0OwkJCQkJCQkJCQkJCSAvLwlvZmZzZXQgb2YgQVRPTV9JTklUX1JFR19CTE9DSyBzdHJ1Y3R1cmUgZm9yIG1lbW9yeSBjbG9jayBzcGVjaWZpYyBNQyBzZXR0aW5nCisJVVNIT1JUCQkJCQkJCQkJCSB1c1Jlc2VydmVkWzRdOworICBVQ0hBUiAgICAgICAgICAgICAgICAgICAgICB1Y051bU9mVlJBTU1vZHVsZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbmRpY2F0ZSBudW1iZXIgb2YgVlJBTSBtb2R1bGUKKyAgVUNIQVIgICAgICAgICAgICAgICAgICAgICAgdWNNZW1vcnlDbGtQYXRjaFRibFZlcjsgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdmVyc2lvbiBvZiBtZW1vcnkgQUMgdGltaW5nIHJlZ2lzdGVyIGxpc3QKKyAgVUNIQVIgICAgICAgICAgICAgICAgICAgICAgdWNWcmFtTW9kdWxlVmVyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5kaWNhdGUgQVRPTV9WUkFNX01PRFVFIHZlcnNpb24KKyAgVUNIQVIgICAgICAgICAgICAgICAgICAgICAgdWNSZXNlcnZlZDsgCisgIEFUT01fVlJBTV9NT0RVTEVfVjcJCSAgICAgYVZyYW1JbmZvW0FUT01fTUFYX05VTUJFUl9PRl9WUkFNX01PRFVMRV07ICAgICAgLy8ganVzdCBmb3IgYWxsb2NhdGlvbiwgcmVhbCBudW1iZXIgb2YgYmxvY2tzIGlzIGluIHVjTnVtT2ZWUkFNTW9kdWxlOworfUFUT01fVlJBTV9JTkZPX0hFQURFUl9WMl8xOworCisKIHR5cGVkZWYgc3RydWN0IF9BVE9NX1ZSQU1fR1BJT19ERVRFQ1RJT05fSU5GTwogewogICBBVE9NX0NPTU1PTl9UQUJMRV9IRUFERVIgICBzSGVhZGVyOwpAQCAtNTE4Miw2ICs1ODgwLDE2IEBACiAJVUNIQVIgIHVjUmVzZXJ2ZWQ7CiB9QVNJQ19UUkFOU01JVFRFUl9JTkZPOwogCisjZGVmaW5lIEFTSUNfVFJBTlNNSVRURVJfSU5GT19DT05GSUdfX0RWT19TRFJfTU9ERSAgICAgICAgICAweDAxCisjZGVmaW5lIEFTSUNfVFJBTlNNSVRURVJfSU5GT19DT05GSUdfX0NPSEVSRU5UX01PREUgICAgICAgICAweDAyCisjZGVmaW5lIEFTSUNfVFJBTlNNSVRURVJfSU5GT19DT05GSUdfX0VOQ09ERVJPQkpfSURfTUFTSyAgICAweGM0CisjZGVmaW5lIEFTSUNfVFJBTlNNSVRURVJfSU5GT19DT05GSUdfX0VOQ09ERVJfQSAgICAgICAgICAgICAweDAwCisjZGVmaW5lIEFTSUNfVFJBTlNNSVRURVJfSU5GT19DT05GSUdfX0VOQ09ERVJfQiAgICAgICAgICAgICAweDA0CisjZGVmaW5lIEFTSUNfVFJBTlNNSVRURVJfSU5GT19DT05GSUdfX0VOQ09ERVJfQyAgICAgICAgICAgICAweDQwCisjZGVmaW5lIEFTSUNfVFJBTlNNSVRURVJfSU5GT19DT05GSUdfX0VOQ09ERVJfRCAgICAgICAgICAgICAweDQ0CisjZGVmaW5lIEFTSUNfVFJBTlNNSVRURVJfSU5GT19DT05GSUdfX0VOQ09ERVJfRSAgICAgICAgICAgICAweDgwCisjZGVmaW5lIEFTSUNfVFJBTlNNSVRURVJfSU5GT19DT05GSUdfX0VOQ09ERVJfRiAgICAgICAgICAgICAweDg0CisKIHR5cGVkZWYgc3RydWN0IF9BU0lDX0VOQ09ERVJfSU5GTwogewogCVVDSEFSIHVjRW5jb2RlcklEOwpAQCAtNTI4NCw2ICs1OTkyLDI4IEBACiAvKiAvb2JzZWxldGUgKi8KICNkZWZpbmUgRFBfRU5DT0RFUl9TRVJWSUNFX1BTX0FMTE9DQVRJT04JCQkJV1JJVEVfT05FX0JZVEVfSFdfSTJDX0RBVEFfUEFSQU1FVEVSUwogCisKK3R5cGVkZWYgc3RydWN0IF9EUF9FTkNPREVSX1NFUlZJQ0VfUEFSQU1FVEVSU19WMgoreworCVVTSE9SVCB1c0V4dEVuY29kZXJPYmpJZDsgICAvLyBFeHRlcm5hbCBFbmNvZGVyIE9iamVjdCBJZCwgb3V0cHV0IHBhcmFtZXRlciBvbmx5LCB1c2Ugd2hlbiB1Y0FjdGlvbiA9IERQX1NFUlZJQ0VfVjJfQUNUSU9OX0RFVF9FWFRfQ09OTkVDVElPTgorICBVQ0hBUiAgdWNBdXhJZDsKKyAgVUNIQVIgIHVjQWN0aW9uOworICBVQ0hBUiAgdWNTaW5rVHlwZTsgICAgICAgICAgLy8gSXB1dCBhbmQgT3V0cHV0IHBhcmFtZXRlcnMuIAorICBVQ0hBUiAgdWNIUERJZDsgICAgICAgICAgICAgLy8gSW5wdXQgcGFyYW1ldGVyLCB1c2VkIHdoZW4gdWNBY3Rpb24gPSBEUF9TRVJWSUNFX1YyX0FDVElPTl9ERVRfRVhUX0NPTk5FQ1RJT04KKwlVQ0hBUiAgdWNSZXNlcnZlZFsyXTsKK31EUF9FTkNPREVSX1NFUlZJQ0VfUEFSQU1FVEVSU19WMjsKKwordHlwZWRlZiBzdHJ1Y3QgX0RQX0VOQ09ERVJfU0VSVklDRV9QU19BTExPQ0FUSU9OX1YyCit7CisgIERQX0VOQ09ERVJfU0VSVklDRV9QQVJBTUVURVJTX1YyIGFzRFBTZXJ2aWNlUGFyYW07CisgIFBST0NFU1NfQVVYX0NIQU5ORUxfVFJBTlNBQ1RJT05fUEFSQU1FVEVSU19WMiBhc0F1eFBhcmFtOworfURQX0VOQ09ERVJfU0VSVklDRV9QU19BTExPQ0FUSU9OX1YyOworCisvLyB1Y0FjdGlvbgorI2RlZmluZSBEUF9TRVJWSUNFX1YyX0FDVElPTl9HRVRfU0lOS19UWVBFCQkJCQkJCTB4MDEKKyNkZWZpbmUgRFBfU0VSVklDRV9WMl9BQ1RJT05fREVUX0xDRF9DT05ORUNUSU9OCQkJICAgIDB4MDIKKworCiAvLyBEUF9UUkFJTklOR19UQUJMRQogI2RlZmluZSBEUENEX1NFVF9MSU5LUkFURV9MQU5FTlVNX1BBVFRFUk4xX1RCTF9BRERSCQkJCUFUT01fRFBfVFJBSU5JTkdfVEJMX0FERFIJCQogI2RlZmluZSBEUENEX1NFVF9TU19DTlRMX1RCTF9BRERSCQkJCQkJCQkJCQkJCShBVE9NX0RQX1RSQUlOSU5HX1RCTF9BRERSICsgOCApCkBAIC01MzM5LDYgKzYwNjksNyBAQAogI2RlZmluZSBTRUxFQ1RfRENJT19JTVBDQUwgICAgICAgICAgICA0CiAjZGVmaW5lIFNFTEVDVF9EQ0lPX0RJRyAgICAgICAgICAgICAgIDYKICNkZWZpbmUgU0VMRUNUX0NSVENfUElYRUxfUkFURSAgICAgICAgNworI2RlZmluZSBTRUxFQ1RfVkdBX0JMSyAgICAgICAgICAgICAgICA4CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwkKIC8vUG9ydGlvbiBWSTogRGVmaW5pdGlub3MgZm9yIHZiaW9zIE1DIHNjcmF0Y2ggcmVnaXN0ZXJzIHRoYXQgZHJpdmVyIHVzZWQKQEAgLTU3NDQsNyArNjQ3NSwxNyBAQAogI2RlZmluZSBBVE9NX1BQX1RIRVJNQUxDT05UUk9MTEVSX0FEVDc0NzMgICA5CiAjZGVmaW5lIEFUT01fUFBfVEhFUk1BTENPTlRST0xMRVJfRVhURVJOQUxfR1BJTyAgICAgMTEKICNkZWZpbmUgQVRPTV9QUF9USEVSTUFMQ09OVFJPTExFUl9FVkVSR1JFRU4gMTIKKyNkZWZpbmUgQVRPTV9QUF9USEVSTUFMQ09OVFJPTExFUl9FTUMyMTAzICAgMTMgIC8qIDB4MEQgKi8gLy8gT25seSBmYW4gY29udHJvbCB3aWxsIGJlIGltcGxlbWVudGVkLCBkbyBOT1Qgc2hvdyB0aGlzIGluIFBQR2VuLgorI2RlZmluZSBBVE9NX1BQX1RIRVJNQUxDT05UUk9MTEVSX1NVTU8gICAgICAxNCAgLyogMHgwRSAqLyAvLyBTdW1vIHR5cGUsIHVzZWQgaW50ZXJuYWxseQorI2RlZmluZSBBVE9NX1BQX1RIRVJNQUxDT05UUk9MTEVSX05JU0xBTkRTICAxNQorCisvLyBUaGVybWFsIGNvbnRyb2xsZXIgJ2NvbWJvIHR5cGUnIHRvIHVzZSBhbiBleHRlcm5hbCBjb250cm9sbGVyIGZvciBGYW4gY29udHJvbCBhbmQgYW4gaW50ZXJuYWwgY29udHJvbGxlciBmb3IgdGhlcm1hbC4KKy8vIFdlIHByb2JhYmx5IHNob3VsZCByZXNlcnZlIHRoZSBiaXQgMHg4MCBmb3IgdGhpcyB1c2UuCisvLyBUbyBrZWVwIHRoZSBudW1iZXIgb2YgdGhlc2UgdHlwZXMgbG93IHdlIHNob3VsZCBhbHNvIHVzZSB0aGUgc2FtZSBjb2RlIGZvciBhbGwgQVNJQ3MgKGkuZS4gZG8gbm90IGRpc3Rpbmd1aXNoIFJWNnh4IGFuZCBSVjd4eCBJbnRlcm5hbCBoZXJlKS4KKy8vIFRoZSBkcml2ZXIgY2FuIHBpY2sgdGhlIGNvcnJlY3QgaW50ZXJuYWwgY29udHJvbGxlciBiYXNlZCBvbiB0aGUgQVNJQy4KKwogI2RlZmluZSBBVE9NX1BQX1RIRVJNQUxDT05UUk9MTEVSX0FEVDc0NzNfV0lUSF9JTlRFUk5BTCAgIDB4ODkgICAgLy8gQURUNzQ3MyBGYW4gQ29udHJvbCArIEludGVybmFsIFRoZXJtYWwgQ29udHJvbGxlcgorI2RlZmluZSBBVE9NX1BQX1RIRVJNQUxDT05UUk9MTEVSX0VNQzIxMDNfV0lUSF9JTlRFUk5BTCAgIDB4OEQgICAgLy8gRU1DMjEwMyBGYW4gQ29udHJvbCArIEludGVybmFsIFRoZXJtYWwgQ29udHJvbGxlcgogCiB0eXBlZGVmIHN0cnVjdCBfQVRPTV9QUExJQl9TVEFURQogewpAQCAtNTg0MSw2ICs2NTgyLDI5IEBACiAgICAgVVNIT1JUICAgICAgICAgICAgICAgICAgICAgdXNFeHRlbmRlbmRlZEhlYWRlck9mZnNldDsKIH0gQVRPTV9QUExJQl9QT1dFUlBMQVlUQUJMRTMsICpMUEFUT01fUFBMSUJfUE9XRVJQTEFZVEFCTEUzOwogCit0eXBlZGVmIHN0cnVjdCBfQVRPTV9QUExJQl9QT1dFUlBMQVlUQUJMRTQKK3sKKyAgICBBVE9NX1BQTElCX1BPV0VSUExBWVRBQkxFMyBiYXNpY1RhYmxlMzsKKyAgICBVTE9ORyAgICAgICAgICAgICAgICAgICAgICB1bEdvbGRlblBQSUQ7ICAgICAgICAgICAgICAgICAgICAvLyBQUEdlbiB1c2Ugb25seSAgICAgCisgICAgVUxPTkcgICAgICAgICAgICAgICAgICAgICAgdWxHb2xkZW5SZXZpc2lvbjsgICAgICAgICAgICAgICAgLy8gUFBHZW4gdXNlIG9ubHkKKyAgICBVU0hPUlQgICAgICAgICAgICAgICAgICAgICB1c1ZkZGNEZXBlbmRlbmN5T25TQ0xLT2Zmc2V0OworICAgIFVTSE9SVCAgICAgICAgICAgICAgICAgICAgIHVzVmRkY2lEZXBlbmRlbmN5T25NQ0xLT2Zmc2V0OworICAgIFVTSE9SVCAgICAgICAgICAgICAgICAgICAgIHVzVmRkY0RlcGVuZGVuY3lPbk1DTEtPZmZzZXQ7CisgICAgVVNIT1JUICAgICAgICAgICAgICAgICAgICAgdXNNYXhDbG9ja1ZvbHRhZ2VPbkRDT2Zmc2V0OworICAgIFVTSE9SVCAgICAgICAgICAgICAgICAgICAgIHVzUmVzZXJ2ZWRbMl07ICAKK30gQVRPTV9QUExJQl9QT1dFUlBMQVlUQUJMRTQsICpMUEFUT01fUFBMSUJfUE9XRVJQTEFZVEFCTEU0OworCit0eXBlZGVmIHN0cnVjdCBfQVRPTV9QUExJQl9QT1dFUlBMQVlUQUJMRTUKK3sKKyAgICBBVE9NX1BQTElCX1BPV0VSUExBWVRBQkxFNCBiYXNpY1RhYmxlNDsKKyAgICBVTE9ORyAgICAgICAgICAgICAgICAgICAgICB1bFREUExpbWl0OworICAgIFVMT05HICAgICAgICAgICAgICAgICAgICAgIHVsTmVhclREUExpbWl0OworICAgIFVMT05HICAgICAgICAgICAgICAgICAgICAgIHVsU1FSYW1waW5nVGhyZXNob2xkOworICAgIFVTSE9SVCAgICAgICAgICAgICAgICAgICAgIHVzQ0FDTGVha2FnZVRhYmxlT2Zmc2V0OyAgICAgICAgIC8vIFBvaW50cyB0byBBVE9NX1BQTElCX0NBQ19MZWFrYWdlX1RhYmxlCisgICAgVUxPTkcgICAgICAgICAgICAgICAgICAgICAgdWxDQUNMZWFrYWdlOyAgICAgICAgICAgICAgICAgICAgLy8gVEJELCB0aGlzIHBhcmFtZXRlciBpcyBzdGlsbCB1bmRlciBkaXNjdXNzaW9uLiAgQ2hhbmdlIHRvIHVsUmVzZXJ2ZWQgaWYgbm90IG5lZWRlZC4KKyAgICBVTE9ORyAgICAgICAgICAgICAgICAgICAgICB1bFJlc2VydmVkOworfSBBVE9NX1BQTElCX1BPV0VSUExBWVRBQkxFNSwgKkxQQVRPTV9QUExJQl9QT1dFUlBMQVlUQUJMRTU7CisKIC8vLy8gQVRPTV9QUExJQl9OT05DTE9DS19JTkZPOjp1c0NsYXNzaWZpY2F0aW9uCiAjZGVmaW5lIEFUT01fUFBMSUJfQ0xBU1NJRklDQVRJT05fVUlfTUFTSyAgICAgICAgICAweDAwMDcKICNkZWZpbmUgQVRPTV9QUExJQl9DTEFTU0lGSUNBVElPTl9VSV9TSElGVCAgICAgICAgIDAKQEAgLTU4NjQsNiArNjYyOCwxMCBAQAogI2RlZmluZSBBVE9NX1BQTElCX0NMQVNTSUZJQ0FUSU9OX0hEU1RBVEUgICAgICAgICAgICAgICAgMHg0MDAwCiAjZGVmaW5lIEFUT01fUFBMSUJfQ0xBU1NJRklDQVRJT05fU0RTVEFURSAgICAgICAgICAgICAgICAweDgwMDAKIAorLy8vLyBBVE9NX1BQTElCX05PTkNMT0NLX0lORk86OnVzQ2xhc3NpZmljYXRpb24yCisjZGVmaW5lIEFUT01fUFBMSUJfQ0xBU1NJRklDQVRJT04yX0xJTUlURURQT1dFUlNPVVJDRV8yICAgICAweDAwMDEKKyNkZWZpbmUgQVRPTV9QUExJQl9DTEFTU0lGSUNBVElPTjJfVUxWICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMgorCiAvLy8vIEFUT01fUFBMSUJfTk9OQ0xPQ0tfSU5GTzo6dWxDYXBzQW5kU2V0dGluZ3MKICNkZWZpbmUgQVRPTV9QUExJQl9TSU5HTEVfRElTUExBWV9PTkxZICAgICAgICAgICAweDAwMDAwMDAxCiAjZGVmaW5lIEFUT01fUFBMSUJfU1VQUE9SVFNfVklERU9fUExBWUJBQ0sgICAgICAgICAweDAwMDAwMDAyCkBAIC01ODk2LDkgKzY2NjQsMjEgQEAKICNkZWZpbmUgQVRPTV9QUExJQl9NM0FSQl9NQVNLICAgICAgICAgICAgICAgICAgICAgICAweDAwMDYwMDAwCiAjZGVmaW5lIEFUT01fUFBMSUJfTTNBUkJfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgMTcKIAorI2RlZmluZSBBVE9NX1BQTElCX0VOQUJMRV9EUlIgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwODAwMDAKKworLy8gcmVtYWluaW5nIDE2IGJpdHMgYXJlIHJlc2VydmVkCit0eXBlZGVmIHN0cnVjdCBfQVRPTV9QUExJQl9USEVSTUFMX1NUQVRFCit7CisgICAgVUNIQVIgICB1Y01pblRlbXBlcmF0dXJlOworICAgIFVDSEFSICAgdWNNYXhUZW1wZXJhdHVyZTsKKyAgICBVQ0hBUiAgIHVjVGhlcm1hbEFjdGlvbjsKK31BVE9NX1BQTElCX1RIRVJNQUxfU1RBVEUsICpMUEFUT01fUFBMSUJfVEhFUk1BTF9TVEFURTsKKwogLy8gQ29udGFpbmVkIGluIGFuIGFycmF5IHN0YXJ0aW5nIGF0IHRoZSBvZmZzZXQKIC8vIGluIEFUT01fUFBMSUJfUE9XRVJQTEFZVEFCTEU6OnVzTm9uQ2xvY2tJbmZvQXJyYXlPZmZzZXQuCiAvLyByZWZlcmVuY2VkIGZyb20gQVRPTV9QUExJQl9TVEFURV9JTkZPOjp1Y05vbkNsb2NrU3RhdGVJbmRleAorI2RlZmluZSBBVE9NX1BQTElCX05PTkNMT0NLSU5GT19WRVIxICAgICAgMTIKKyNkZWZpbmUgQVRPTV9QUExJQl9OT05DTE9DS0lORk9fVkVSMiAgICAgIDI0CiB0eXBlZGVmIHN0cnVjdCBfQVRPTV9QUExJQl9OT05DTE9DS19JTkZPCiB7CiAgICAgICBVU0hPUlQgdXNDbGFzc2lmaWNhdGlvbjsKQEAgLTU5MDYsMTUgKzY2ODYsMTUgQEAKICAgICAgIFVDSEFSICB1Y01heFRlbXBlcmF0dXJlOwogICAgICAgVUxPTkcgIHVsQ2Fwc0FuZFNldHRpbmdzOwogICAgICAgVUNIQVIgIHVjUmVxdWlyZWRQb3dlcjsKLSAgICAgIFVDSEFSICB1Y1VudXNlZDFbM107CisgICAgICBVU0hPUlQgdXNDbGFzc2lmaWNhdGlvbjI7CisgICAgICBVTE9ORyAgdWxWQ0xLOworICAgICAgVUxPTkcgIHVsRENMSzsKKyAgICAgIFVDSEFSICB1Y1VudXNlZFs1XTsKIH0gQVRPTV9QUExJQl9OT05DTE9DS19JTkZPOwogCiAvLyBDb250YWluZWQgaW4gYW4gYXJyYXkgc3RhcnRpbmcgYXQgdGhlIG9mZnNldAogLy8gaW4gQVRPTV9QUExJQl9QT1dFUlBMQVlUQUJMRTo6dXNDbG9ja0luZm9BcnJheU9mZnNldC4KIC8vIHJlZmVyZW5jZWQgZnJvbSBBVE9NX1BQTElCX1NUQVRFOjp1Y0Nsb2NrU3RhdGVJbmRpY2VzCi0jZGVmaW5lIEFUT01fUFBMSUJfTk9OQ0xPQ0tJTkZPX1ZFUjEgICAgICAxMgotI2RlZmluZSBBVE9NX1BQTElCX05PTkNMT0NLSU5GT19WRVIyICAgICAgMjQKLQogdHlwZWRlZiBzdHJ1Y3QgX0FUT01fUFBMSUJfUjYwMF9DTE9DS19JTkZPCiB7CiAgICAgICBVU0hPUlQgdXNFbmdpbmVDbG9ja0xvdzsKQEAgLTU5ODUsNiArNjc2NSw5MyBAQAogI2RlZmluZSBBVE9NX1BQTElCX1JTNzgwX0hUTElOS0ZSRVFfTE9XICAgICAgICAxIAogI2RlZmluZSBBVE9NX1BQTElCX1JTNzgwX0hUTElOS0ZSRVFfSElHSCAgICAgICAyIAogCit0eXBlZGVmIHN0cnVjdCBfQVRPTV9QUExJQl9TVU1PX0NMT0NLX0lORk97CisgICAgICBVU0hPUlQgdXNFbmdpbmVDbG9ja0xvdzsgIC8vY2xvY2tmcmVxdWVuY3kgJiAweEZGRkYuIFRoZSB1bml0IGlzIGluIDEwa2h6CisgICAgICBVQ0hBUiAgdWNFbmdpbmVDbG9ja0hpZ2g7IC8vY2xvY2tmcmVxdWVuY3kgPj4gMTYuIAorICAgICAgVUNIQVIgIHZkZGNJbmRleDsgICAgICAgICAvLzItYml0IHZkZGMgaW5kZXg7CisgICAgICBVQ0hBUiAgbGVha2FnZTsgICAgICAgICAgLy9wbGVhc2UgdXNlIDgtYml0IGFic29sdXRlIHZhbHVlLCBub3QgdGhlIDYtYml0ICUgdmFsdWUgCisgICAgICAvL3BsZWFzZSBpbml0YWxpemUgdG8gMAorICAgICAgVUNIQVIgIHJzdjsKKyAgICAgIC8vcGxlYXNlIGluaXRhbGl6ZSB0byAwCisgICAgICBVU0hPUlQgcnN2MTsKKyAgICAgIC8vcGxlYXNlIGluaXRpYWxpemUgdG8gMHMKKyAgICAgIFVMT05HIHJzdjJbMl07Cit9QVRPTV9QUExJQl9TVU1PX0NMT0NLX0lORk87CisKKworCit0eXBlZGVmIHN0cnVjdCBfQVRPTV9QUExJQl9TVEFURV9WMgoreworICAgICAgLy9udW1iZXIgb2YgdmFsaWQgZHBtIGxldmVscyBpbiB0aGlzIHN0YXRlOyBEcml2ZXIgdXNlcyBpdCB0byBjYWxjdWxhdGUgdGhlIHdob2xlIAorICAgICAgLy9zaXplIG9mIHRoZSBzdGF0ZTogc2l6ZW9mKEFUT01fUFBMSUJfU1RBVEVfVjIpICsgKHVjTnVtRFBNTGV2ZWxzIC0gMSkgKiBzaXplb2YoVUNIQVIpCisgICAgICBVQ0hBUiB1Y051bURQTUxldmVsczsKKyAgICAgIAorICAgICAgLy9hIGluZGV4IHRvIHRoZSBhcnJheSBvZiBub25DbG9ja0luZm9zCisgICAgICBVQ0hBUiBub25DbG9ja0luZm9JbmRleDsKKyAgICAgIC8qKgorICAgICAgKiBEcml2ZXIgd2lsbCByZWFkIHRoZSBmaXJzdCB1Y051bURQTUxldmVscyBpbiB0aGlzIGFycmF5CisgICAgICAqLworICAgICAgVUNIQVIgY2xvY2tJbmZvSW5kZXhbMV07Cit9IEFUT01fUFBMSUJfU1RBVEVfVjI7CisKK3R5cGVkZWYgc3RydWN0IFN0YXRlQXJyYXl7CisgICAgLy9ob3cgbWFueSBzdGF0ZXMgd2UgaGF2ZSAKKyAgICBVQ0hBUiB1Y051bUVudHJpZXM7CisgICAgCisgICAgQVRPTV9QUExJQl9TVEFURV9WMiBzdGF0ZXNbMV07Cit9U3RhdGVBcnJheTsKKworCit0eXBlZGVmIHN0cnVjdCBDbG9ja0luZm9BcnJheXsKKyAgICAvL2hvdyBtYW55IGNsb2NrIGxldmVscyB3ZSBoYXZlCisgICAgVUNIQVIgdWNOdW1FbnRyaWVzOworICAgIAorICAgIC8vc2l6ZW9mKEFUT01fUFBMSUJfU1VNT19DTE9DS19JTkZPKQorICAgIFVDSEFSIHVjRW50cnlTaXplOworICAgIAorICAgIC8vdGhpcyBpcyBmb3IgU3VtbworICAgIEFUT01fUFBMSUJfU1VNT19DTE9DS19JTkZPIGNsb2NrSW5mb1sxXTsKK31DbG9ja0luZm9BcnJheTsKKwordHlwZWRlZiBzdHJ1Y3QgTm9uQ2xvY2tJbmZvQXJyYXl7CisKKyAgICAvL2hvdyBtYW55IG5vbi1jbG9jayBsZXZlbHMgd2UgaGF2ZS4gbm9ybWFsbHkgc2hvdWxkIGJlIHNhbWUgYXMgbnVtYmVyIG9mIHN0YXRlcworICAgIFVDSEFSIHVjTnVtRW50cmllczsKKyAgICAvL3NpemVvZihBVE9NX1BQTElCX05PTkNMT0NLX0lORk8pCisgICAgVUNIQVIgdWNFbnRyeVNpemU7CisgICAgCisgICAgQVRPTV9QUExJQl9OT05DTE9DS19JTkZPIG5vbkNsb2NrSW5mb1sxXTsKK31Ob25DbG9ja0luZm9BcnJheTsKKwordHlwZWRlZiBzdHJ1Y3QgX0FUT01fUFBMSUJfQ2xvY2tfVm9sdGFnZV9EZXBlbmRlbmN5X1JlY29yZAoreworICAgIFVTSE9SVCB1c0Nsb2NrTG93OworICAgIFVDSEFSICB1Y0Nsb2NrSGlnaDsKKyAgICBVU0hPUlQgdXNWb2x0YWdlOworfUFUT01fUFBMSUJfQ2xvY2tfVm9sdGFnZV9EZXBlbmRlbmN5X1JlY29yZDsKKwordHlwZWRlZiBzdHJ1Y3QgX0FUT01fUFBMSUJfQ2xvY2tfVm9sdGFnZV9EZXBlbmRlbmN5X1RhYmxlCit7CisgICAgVUNIQVIgdWNOdW1FbnRyaWVzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE51bWJlciBvZiBlbnRyaWVzLgorICAgIEFUT01fUFBMSUJfQ2xvY2tfVm9sdGFnZV9EZXBlbmRlbmN5X1JlY29yZCBlbnRyaWVzWzFdOyAgICAgICAgICAgICAvLyBEeW5hbWljYWxseSBhbGxvY2F0ZSBlbnRyaWVzLgorfUFUT01fUFBMSUJfQ2xvY2tfVm9sdGFnZV9EZXBlbmRlbmN5X1RhYmxlOworCit0eXBlZGVmIHN0cnVjdCBfQVRPTV9QUExJQl9DbG9ja19Wb2x0YWdlX0xpbWl0X1JlY29yZAoreworICAgIFVTSE9SVCB1c1NjbGtMb3c7CisgICAgVUNIQVIgIHVjU2Nsa0hpZ2g7CisgICAgVVNIT1JUIHVzTWNsa0xvdzsKKyAgICBVQ0hBUiAgdWNNY2xrSGlnaDsKKyAgICBVU0hPUlQgdXNWZGRjOworICAgIFVTSE9SVCB1c1ZkZGNpOworfUFUT01fUFBMSUJfQ2xvY2tfVm9sdGFnZV9MaW1pdF9SZWNvcmQ7CisKK3R5cGVkZWYgc3RydWN0IF9BVE9NX1BQTElCX0Nsb2NrX1ZvbHRhZ2VfTGltaXRfVGFibGUKK3sKKyAgICBVQ0hBUiB1Y051bUVudHJpZXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTnVtYmVyIG9mIGVudHJpZXMuCisgICAgQVRPTV9QUExJQl9DbG9ja19Wb2x0YWdlX0xpbWl0X1JlY29yZCBlbnRyaWVzWzFdOyAgICAgICAgICAgICAgICAgIC8vIER5bmFtaWNhbGx5IGFsbG9jYXRlIGVudHJpZXMuCit9QVRPTV9QUExJQl9DbG9ja19Wb2x0YWdlX0xpbWl0X1RhYmxlOworCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9hdG9tYmlvc19jcnRjLmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL2F0b21iaW9zX2NydGMuYwppbmRleCA5ZmJhYmFhLi5iMGFiMTg1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL2F0b21iaW9zX2NydGMuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL2F0b21iaW9zX2NydGMuYwpAQCAtNDAzLDYgKzQwMyw3IEBACiAJRU5BQkxFX0xWRFNfU1NfUEFSQU1FVEVSU19WMiBsdmRzX3NzXzI7CiAJRU5BQkxFX1NQUkVBRF9TUEVDVFJVTV9PTl9QUExMX1BTX0FMTE9DQVRJT04gdjE7CiAJRU5BQkxFX1NQUkVBRF9TUEVDVFJVTV9PTl9QUExMX1YyIHYyOworCUVOQUJMRV9TUFJFQURfU1BFQ1RSVU1fT05fUFBMTF9WMyB2MzsKIH07CiAKIHN0YXRpYyB2b2lkIGF0b21iaW9zX2NydGNfcHJvZ3JhbV9zcyhzdHJ1Y3QgZHJtX2NydGMgKmNydGMsCkBAIC00MTcsNyArNDE4LDMwIEBACiAKIAltZW1zZXQoJmFyZ3MsIDAsIHNpemVvZihhcmdzKSk7CiAKLQlpZiAoQVNJQ19JU19EQ0U0KHJkZXYpKSB7CisJaWYgKEFTSUNfSVNfRENFNShyZGV2KSkgeworCQlhcmdzLnYzLnVzU3ByZWFkU3BlY3RydW1BbW91bnRGcmFjID0gMDsKKwkJYXJncy52My51Y1NwcmVhZFNwZWN0cnVtVHlwZSA9IHNzLT50eXBlOworCQlzd2l0Y2ggKHBsbF9pZCkgeworCQljYXNlIEFUT01fUFBMTDE6CisJCQlhcmdzLnYzLnVjU3ByZWFkU3BlY3RydW1UeXBlIHw9IEFUT01fUFBMTF9TU19UWVBFX1YzX1AxUExMOworCQkJYXJncy52My51c1NwcmVhZFNwZWN0cnVtQW1vdW50ID0gc3MtPmFtb3VudDsKKwkJCWFyZ3MudjMudXNTcHJlYWRTcGVjdHJ1bVN0ZXAgPSBzcy0+c3RlcDsKKwkJCWJyZWFrOworCQljYXNlIEFUT01fUFBMTDI6CisJCQlhcmdzLnYzLnVjU3ByZWFkU3BlY3RydW1UeXBlIHw9IEFUT01fUFBMTF9TU19UWVBFX1YzX1AyUExMOworCQkJYXJncy52My51c1NwcmVhZFNwZWN0cnVtQW1vdW50ID0gc3MtPmFtb3VudDsKKwkJCWFyZ3MudjMudXNTcHJlYWRTcGVjdHJ1bVN0ZXAgPSBzcy0+c3RlcDsKKwkJCWJyZWFrOworCQljYXNlIEFUT01fRENQTEw6CisJCQlhcmdzLnYzLnVjU3ByZWFkU3BlY3RydW1UeXBlIHw9IEFUT01fUFBMTF9TU19UWVBFX1YzX0RDUExMOworCQkJYXJncy52My51c1NwcmVhZFNwZWN0cnVtQW1vdW50ID0gMDsKKwkJCWFyZ3MudjMudXNTcHJlYWRTcGVjdHJ1bVN0ZXAgPSAwOworCQkJYnJlYWs7CisJCWNhc2UgQVRPTV9QUExMX0lOVkFMSUQ6CisJCQlyZXR1cm47CisJCX0KKwkJYXJncy52Mi51Y0VuYWJsZSA9IGVuYWJsZTsKKwl9IGVsc2UgaWYgKEFTSUNfSVNfRENFNChyZGV2KSkgewogCQlhcmdzLnYyLnVzU3ByZWFkU3BlY3RydW1QZXJjZW50YWdlID0gY3B1X3RvX2xlMTYoc3MtPnBlcmNlbnRhZ2UpOwogCQlhcmdzLnYyLnVjU3ByZWFkU3BlY3RydW1UeXBlID0gc3MtPnR5cGU7CiAJCXN3aXRjaCAocGxsX2lkKSB7CkBAIC02NzMsOSArNjk3LDE0IEBACiAJUElYRUxfQ0xPQ0tfUEFSQU1FVEVSU19WMiB2MjsKIAlQSVhFTF9DTE9DS19QQVJBTUVURVJTX1YzIHYzOwogCVBJWEVMX0NMT0NLX1BBUkFNRVRFUlNfVjUgdjU7CisJUElYRUxfQ0xPQ0tfUEFSQU1FVEVSU19WNiB2NjsKIH07CiAKLXN0YXRpYyB2b2lkIGF0b21iaW9zX2NydGNfc2V0X2RjcGxsKHN0cnVjdCBkcm1fY3J0YyAqY3J0YykKKy8qIG9uIERDRTUsIG1ha2Ugc3VyZSB0aGUgdm9sdGFnZSBpcyBoaWdoIGVub3VnaCB0byBzdXBwb3J0IHRoZQorICogcmVxdWlyZWQgZGlzcCBjbGsuCisgKi8KK3N0YXRpYyB2b2lkIGF0b21iaW9zX2NydGNfc2V0X2RjcGxsKHN0cnVjdCBkcm1fY3J0YyAqY3J0YywKKwkJCQkgICAgdTMyIGRpc3BjbGspCiB7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNydGMtPmRldjsKIAlzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiA9IGRldi0+ZGV2X3ByaXZhdGU7CkBAIC02OTgsOSArNzI3LDE2IEBACiAJCQkgKiBTZXRQaXhlbENsb2NrIHByb3ZpZGVzIHRoZSBkaXZpZGVycwogCQkJICovCiAJCQlhcmdzLnY1LnVjQ1JUQyA9IEFUT01fQ1JUQ19JTlZBTElEOwotCQkJYXJncy52NS51c1BpeGVsQ2xvY2sgPSByZGV2LT5jbG9jay5kZWZhdWx0X2Rpc3BjbGs7CisJCQlhcmdzLnY1LnVzUGl4ZWxDbG9jayA9IGRpc3BjbGs7CiAJCQlhcmdzLnY1LnVjUHBsbCA9IEFUT01fRENQTEw7CiAJCQlicmVhazsKKwkJY2FzZSA2OgorCQkJLyogaWYgdGhlIGRlZmF1bHQgZGNwbGwgY2xvY2sgaXMgc3BlY2lmaWVkLAorCQkJICogU2V0UGl4ZWxDbG9jayBwcm92aWRlcyB0aGUgZGl2aWRlcnMKKwkJCSAqLworCQkJYXJncy52Ni51bERpc3BFbmdDbGtGcmVxID0gZGlzcGNsazsKKwkJCWFyZ3MudjYudWNQcGxsID0gQVRPTV9EQ1BMTDsKKwkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJRFJNX0VSUk9SKCJVbmtub3duIHRhYmxlIHZlcnNpb24gJWQgJWRcbiIsIGZyZXYsIGNyZXYpOwogCQkJcmV0dXJuOwpAQCAtNzg0LDYgKzgyMCwxOCBAQAogCQkJYXJncy52NS51Y0VuY29kZXJNb2RlID0gZW5jb2Rlcl9tb2RlOwogCQkJYXJncy52NS51Y1BwbGwgPSBwbGxfaWQ7CiAJCQlicmVhazsKKwkJY2FzZSA2OgorCQkJYXJncy52Ni51bENydGNQY2xrRnJlcS51Y0NSVEMgPSBjcnRjX2lkOworCQkJYXJncy52Ni51bENydGNQY2xrRnJlcS51bFBpeGVsQ2xvY2sgPSBjcHVfdG9fbGUzMihjbG9jayAvIDEwKTsKKwkJCWFyZ3MudjYudWNSZWZEaXYgPSByZWZfZGl2OworCQkJYXJncy52Ni51c0ZiRGl2ID0gY3B1X3RvX2xlMTYoZmJfZGl2KTsKKwkJCWFyZ3MudjYudWxGYkRpdkRlY0ZyYWMgPSBjcHVfdG9fbGUzMihmcmFjX2ZiX2RpdiAqIDEwMDAwMCk7CisJCQlhcmdzLnY2LnVjUG9zdERpdiA9IHBvc3RfZGl2OworCQkJYXJncy52Ni51Y01pc2NJbmZvID0gMDsgLyogSERNSSBkZXB0aCwgZXRjLiAqLworCQkJYXJncy52Ni51Y1RyYW5zbWl0dGVySUQgPSBlbmNvZGVyX2lkOworCQkJYXJncy52Ni51Y0VuY29kZXJNb2RlID0gZW5jb2Rlcl9tb2RlOworCQkJYXJncy52Ni51Y1BwbGwgPSBwbGxfaWQ7CisJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCURSTV9FUlJPUigiVW5rbm93biB0YWJsZSB2ZXJzaW9uICVkICVkXG4iLCBmcmV2LCBjcmV2KTsKIAkJCXJldHVybjsKQEAgLTEzNzcsNyArMTQyNSw4IEBACiAJCQkJCQkJCSAgIHJkZXYtPmNsb2NrLmRlZmF1bHRfZGlzcGNsayk7CiAJCWlmIChzc19lbmFibGVkKQogCQkJYXRvbWJpb3NfY3J0Y19wcm9ncmFtX3NzKGNydGMsIEFUT01fRElTQUJMRSwgQVRPTV9EQ1BMTCwgJnNzKTsKLQkJYXRvbWJpb3NfY3J0Y19zZXRfZGNwbGwoY3J0Yyk7CisJCS8qIFhYWDogRENFNSwgbWFrZSBzdXJlIHZvbHRhZ2UsIGRpc3BjbGsgaXMgaGlnaCBlbm91Z2ggKi8KKwkJYXRvbWJpb3NfY3J0Y19zZXRfZGNwbGwoY3J0YywgcmRldi0+Y2xvY2suZGVmYXVsdF9kaXNwY2xrKTsKIAkJaWYgKHNzX2VuYWJsZWQpCiAJCQlhdG9tYmlvc19jcnRjX3Byb2dyYW1fc3MoY3J0YywgQVRPTV9FTkFCTEUsIEFUT01fRENQTEwsICZzcyk7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9ldmVyZ3JlZW4uYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vZXZlcmdyZWVuLmMKaW5kZXggN2IzMzdjMy4uN2ZlOGViZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9ldmVyZ3JlZW4uYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL2V2ZXJncmVlbi5jCkBAIC0zOSw2ICszOSw2MiBAQAogCiBzdGF0aWMgdm9pZCBldmVyZ3JlZW5fZ3B1X2luaXQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwogdm9pZCBldmVyZ3JlZW5fZmluaShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CitzdGF0aWMgdm9pZCBldmVyZ3JlZW5fcGNpZV9nZW4yX2VuYWJsZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CisKK3ZvaWQgZXZlcmdyZWVuX3ByZV9wYWdlX2ZsaXAoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIGludCBjcnRjKQoreworCXN0cnVjdCByYWRlb25fY3J0YyAqcmFkZW9uX2NydGMgPSByZGV2LT5tb2RlX2luZm8uY3J0Y3NbY3J0Y107CisJdTMyIHRtcDsKKworCS8qIG1ha2Ugc3VyZSBmbGlwIGlzIGF0IHZiIHJhdGhlciB0aGFuIGhiICovCisJdG1wID0gUlJFRzMyKEVWRVJHUkVFTl9HUlBIX0ZMSVBfQ09OVFJPTCArIHJhZGVvbl9jcnRjLT5jcnRjX29mZnNldCk7CisJdG1wICY9IH5FVkVSR1JFRU5fR1JQSF9TVVJGQUNFX1VQREFURV9IX1JFVFJBQ0VfRU47CisJV1JFRzMyKEVWRVJHUkVFTl9HUlBIX0ZMSVBfQ09OVFJPTCArIHJhZGVvbl9jcnRjLT5jcnRjX29mZnNldCwgdG1wKTsKKworCS8qIHNldCBwYWdlZmxpcCB0byBoYXBwZW4gYW55d2hlcmUgaW4gdmJsYW5rIGludGVydmFsICovCisJV1JFRzMyKEVWRVJHUkVFTl9NQVNURVJfVVBEQVRFX01PREUgKyByYWRlb25fY3J0Yy0+Y3J0Y19vZmZzZXQsIDApOworCisJLyogZW5hYmxlIHRoZSBwZmxpcCBpbnQgKi8KKwlyYWRlb25faXJxX2ttc19wZmxpcF9pcnFfZ2V0KHJkZXYsIGNydGMpOworfQorCit2b2lkIGV2ZXJncmVlbl9wb3N0X3BhZ2VfZmxpcChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwgaW50IGNydGMpCit7CisJLyogZGlzYWJsZSB0aGUgcGZsaXAgaW50ICovCisJcmFkZW9uX2lycV9rbXNfcGZsaXBfaXJxX3B1dChyZGV2LCBjcnRjKTsKK30KKwordTMyIGV2ZXJncmVlbl9wYWdlX2ZsaXAoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIGludCBjcnRjX2lkLCB1NjQgY3J0Y19iYXNlKQoreworCXN0cnVjdCByYWRlb25fY3J0YyAqcmFkZW9uX2NydGMgPSByZGV2LT5tb2RlX2luZm8uY3J0Y3NbY3J0Y19pZF07CisJdTMyIHRtcCA9IFJSRUczMihFVkVSR1JFRU5fR1JQSF9VUERBVEUgKyByYWRlb25fY3J0Yy0+Y3J0Y19vZmZzZXQpOworCisJLyogTG9jayB0aGUgZ3JhcGhpY3MgdXBkYXRlIGxvY2sgKi8KKwl0bXAgfD0gRVZFUkdSRUVOX0dSUEhfVVBEQVRFX0xPQ0s7CisJV1JFRzMyKEVWRVJHUkVFTl9HUlBIX1VQREFURSArIHJhZGVvbl9jcnRjLT5jcnRjX29mZnNldCwgdG1wKTsKKworCS8qIHVwZGF0ZSB0aGUgc2Nhbm91dCBhZGRyZXNzZXMgKi8KKwlXUkVHMzIoRVZFUkdSRUVOX0dSUEhfU0VDT05EQVJZX1NVUkZBQ0VfQUREUkVTU19ISUdIICsgcmFkZW9uX2NydGMtPmNydGNfb2Zmc2V0LAorCSAgICAgICB1cHBlcl8zMl9iaXRzKGNydGNfYmFzZSkpOworCVdSRUczMihFVkVSR1JFRU5fR1JQSF9TRUNPTkRBUllfU1VSRkFDRV9BRERSRVNTICsgcmFkZW9uX2NydGMtPmNydGNfb2Zmc2V0LAorCSAgICAgICAodTMyKWNydGNfYmFzZSk7CisKKwlXUkVHMzIoRVZFUkdSRUVOX0dSUEhfUFJJTUFSWV9TVVJGQUNFX0FERFJFU1NfSElHSCArIHJhZGVvbl9jcnRjLT5jcnRjX29mZnNldCwKKwkgICAgICAgdXBwZXJfMzJfYml0cyhjcnRjX2Jhc2UpKTsKKwlXUkVHMzIoRVZFUkdSRUVOX0dSUEhfUFJJTUFSWV9TVVJGQUNFX0FERFJFU1MgKyByYWRlb25fY3J0Yy0+Y3J0Y19vZmZzZXQsCisJICAgICAgICh1MzIpY3J0Y19iYXNlKTsKKworCS8qIFdhaXQgZm9yIHVwZGF0ZV9wZW5kaW5nIHRvIGdvIGhpZ2guICovCisJd2hpbGUgKCEoUlJFRzMyKEVWRVJHUkVFTl9HUlBIX1VQREFURSArIHJhZGVvbl9jcnRjLT5jcnRjX29mZnNldCkgJiBFVkVSR1JFRU5fR1JQSF9TVVJGQUNFX1VQREFURV9QRU5ESU5HKSk7CisJRFJNX0RFQlVHKCJVcGRhdGUgcGVuZGluZyBub3cgaGlnaC4gVW5sb2NraW5nIHZ1cGRhdGVfbG9jay5cbiIpOworCisJLyogVW5sb2NrIHRoZSBsb2NrLCBzbyBkb3VibGUtYnVmZmVyaW5nIGNhbiB0YWtlIHBsYWNlIGluc2lkZSB2YmxhbmsgKi8KKwl0bXAgJj0gfkVWRVJHUkVFTl9HUlBIX1VQREFURV9MT0NLOworCVdSRUczMihFVkVSR1JFRU5fR1JQSF9VUERBVEUgKyByYWRlb25fY3J0Yy0+Y3J0Y19vZmZzZXQsIHRtcCk7CisKKwkvKiBSZXR1cm4gY3VycmVudCB1cGRhdGVfcGVuZGluZyBzdGF0dXM6ICovCisJcmV0dXJuIFJSRUczMihFVkVSR1JFRU5fR1JQSF9VUERBVEUgKyByYWRlb25fY3J0Yy0+Y3J0Y19vZmZzZXQpICYgRVZFUkdSRUVOX0dSUEhfU1VSRkFDRV9VUERBVEVfUEVORElORzsKK30KIAogLyogZ2V0IHRlbXBlcmF0dXJlIGluIG1pbGxpZGVncmVlcyAqLwogdTMyIGV2ZXJncmVlbl9nZXRfdGVtcChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKQEAgLTU3LDYgKzExMywxNCBAQAogCXJldHVybiBhY3R1YWxfdGVtcCAqIDEwMDA7CiB9CiAKK3UzMiBzdW1vX2dldF90ZW1wKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQoreworCXUzMiB0ZW1wID0gUlJFRzMyKENHX1RIRVJNQUxfU1RBVFVTKSAmIDB4ZmY7CisJdTMyIGFjdHVhbF90ZW1wID0gKHRlbXAgPj4gMSkgJiAweGZmOworCisJcmV0dXJuIGFjdHVhbF90ZW1wICogMTAwMDsKK30KKwogdm9pZCBldmVyZ3JlZW5fcG1fbWlzYyhzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKIHsKIAlpbnQgcmVxX3BzX2lkeCA9IHJkZXYtPnBtLnJlcXVlc3RlZF9wb3dlcl9zdGF0ZV9pbmRleDsKQEAgLTMzNywxNiArNDAxLDI4IEBACiAJY2FzZSAwOgogCWNhc2UgNDoKIAlkZWZhdWx0OgotCQlyZXR1cm4gMzg0MCAqIDI7CisJCWlmIChBU0lDX0lTX0RDRTUocmRldikpCisJCQlyZXR1cm4gNDA5NiAqIDI7CisJCWVsc2UKKwkJCXJldHVybiAzODQwICogMjsKIAljYXNlIDE6CiAJY2FzZSA1OgotCQlyZXR1cm4gNTc2MCAqIDI7CisJCWlmIChBU0lDX0lTX0RDRTUocmRldikpCisJCQlyZXR1cm4gNjE0NCAqIDI7CisJCWVsc2UKKwkJCXJldHVybiA1NzYwICogMjsKIAljYXNlIDI6CiAJY2FzZSA2OgotCQlyZXR1cm4gNzY4MCAqIDI7CisJCWlmIChBU0lDX0lTX0RDRTUocmRldikpCisJCQlyZXR1cm4gODE5MiAqIDI7CisJCWVsc2UKKwkJCXJldHVybiA3NjgwICogMjsKIAljYXNlIDM6CiAJY2FzZSA3OgotCQlyZXR1cm4gMTkyMCAqIDI7CisJCWlmIChBU0lDX0lTX0RDRTUocmRldikpCisJCQlyZXR1cm4gMjA0OCAqIDI7CisJCWVsc2UKKwkJCXJldHVybiAxOTIwICogMjsKIAl9CiB9CiAKQEAgLTg5MCwzMSArOTY2LDM5IEBACiAJc2F2ZS0+dmdhX2hkcF9jb250cm9sID0gUlJFRzMyKFZHQV9IRFBfQ09OVFJPTCk7CiAJc2F2ZS0+Y3J0Y19jb250cm9sWzBdID0gUlJFRzMyKEVWRVJHUkVFTl9DUlRDX0NPTlRST0wgKyBFVkVSR1JFRU5fQ1JUQzBfUkVHSVNURVJfT0ZGU0VUKTsKIAlzYXZlLT5jcnRjX2NvbnRyb2xbMV0gPSBSUkVHMzIoRVZFUkdSRUVOX0NSVENfQ09OVFJPTCArIEVWRVJHUkVFTl9DUlRDMV9SRUdJU1RFUl9PRkZTRVQpOwotCXNhdmUtPmNydGNfY29udHJvbFsyXSA9IFJSRUczMihFVkVSR1JFRU5fQ1JUQ19DT05UUk9MICsgRVZFUkdSRUVOX0NSVEMyX1JFR0lTVEVSX09GRlNFVCk7Ci0Jc2F2ZS0+Y3J0Y19jb250cm9sWzNdID0gUlJFRzMyKEVWRVJHUkVFTl9DUlRDX0NPTlRST0wgKyBFVkVSR1JFRU5fQ1JUQzNfUkVHSVNURVJfT0ZGU0VUKTsKLQlzYXZlLT5jcnRjX2NvbnRyb2xbNF0gPSBSUkVHMzIoRVZFUkdSRUVOX0NSVENfQ09OVFJPTCArIEVWRVJHUkVFTl9DUlRDNF9SRUdJU1RFUl9PRkZTRVQpOwotCXNhdmUtPmNydGNfY29udHJvbFs1XSA9IFJSRUczMihFVkVSR1JFRU5fQ1JUQ19DT05UUk9MICsgRVZFUkdSRUVOX0NSVEM1X1JFR0lTVEVSX09GRlNFVCk7CisJaWYgKCEocmRldi0+ZmxhZ3MgJiBSQURFT05fSVNfSUdQKSkgeworCQlzYXZlLT5jcnRjX2NvbnRyb2xbMl0gPSBSUkVHMzIoRVZFUkdSRUVOX0NSVENfQ09OVFJPTCArIEVWRVJHUkVFTl9DUlRDMl9SRUdJU1RFUl9PRkZTRVQpOworCQlzYXZlLT5jcnRjX2NvbnRyb2xbM10gPSBSUkVHMzIoRVZFUkdSRUVOX0NSVENfQ09OVFJPTCArIEVWRVJHUkVFTl9DUlRDM19SRUdJU1RFUl9PRkZTRVQpOworCQlzYXZlLT5jcnRjX2NvbnRyb2xbNF0gPSBSUkVHMzIoRVZFUkdSRUVOX0NSVENfQ09OVFJPTCArIEVWRVJHUkVFTl9DUlRDNF9SRUdJU1RFUl9PRkZTRVQpOworCQlzYXZlLT5jcnRjX2NvbnRyb2xbNV0gPSBSUkVHMzIoRVZFUkdSRUVOX0NSVENfQ09OVFJPTCArIEVWRVJHUkVFTl9DUlRDNV9SRUdJU1RFUl9PRkZTRVQpOworCX0KIAogCS8qIFN0b3AgYWxsIHZpZGVvICovCiAJV1JFRzMyKFZHQV9SRU5ERVJfQ09OVFJPTCwgMCk7CiAJV1JFRzMyKEVWRVJHUkVFTl9DUlRDX1VQREFURV9MT0NLICsgRVZFUkdSRUVOX0NSVEMwX1JFR0lTVEVSX09GRlNFVCwgMSk7CiAJV1JFRzMyKEVWRVJHUkVFTl9DUlRDX1VQREFURV9MT0NLICsgRVZFUkdSRUVOX0NSVEMxX1JFR0lTVEVSX09GRlNFVCwgMSk7Ci0JV1JFRzMyKEVWRVJHUkVFTl9DUlRDX1VQREFURV9MT0NLICsgRVZFUkdSRUVOX0NSVEMyX1JFR0lTVEVSX09GRlNFVCwgMSk7Ci0JV1JFRzMyKEVWRVJHUkVFTl9DUlRDX1VQREFURV9MT0NLICsgRVZFUkdSRUVOX0NSVEMzX1JFR0lTVEVSX09GRlNFVCwgMSk7Ci0JV1JFRzMyKEVWRVJHUkVFTl9DUlRDX1VQREFURV9MT0NLICsgRVZFUkdSRUVOX0NSVEM0X1JFR0lTVEVSX09GRlNFVCwgMSk7Ci0JV1JFRzMyKEVWRVJHUkVFTl9DUlRDX1VQREFURV9MT0NLICsgRVZFUkdSRUVOX0NSVEM1X1JFR0lTVEVSX09GRlNFVCwgMSk7CisJaWYgKCEocmRldi0+ZmxhZ3MgJiBSQURFT05fSVNfSUdQKSkgeworCQlXUkVHMzIoRVZFUkdSRUVOX0NSVENfVVBEQVRFX0xPQ0sgKyBFVkVSR1JFRU5fQ1JUQzJfUkVHSVNURVJfT0ZGU0VULCAxKTsKKwkJV1JFRzMyKEVWRVJHUkVFTl9DUlRDX1VQREFURV9MT0NLICsgRVZFUkdSRUVOX0NSVEMzX1JFR0lTVEVSX09GRlNFVCwgMSk7CisJCVdSRUczMihFVkVSR1JFRU5fQ1JUQ19VUERBVEVfTE9DSyArIEVWRVJHUkVFTl9DUlRDNF9SRUdJU1RFUl9PRkZTRVQsIDEpOworCQlXUkVHMzIoRVZFUkdSRUVOX0NSVENfVVBEQVRFX0xPQ0sgKyBFVkVSR1JFRU5fQ1JUQzVfUkVHSVNURVJfT0ZGU0VULCAxKTsKKwl9CiAJV1JFRzMyKEVWRVJHUkVFTl9DUlRDX0NPTlRST0wgKyBFVkVSR1JFRU5fQ1JUQzBfUkVHSVNURVJfT0ZGU0VULCAwKTsKIAlXUkVHMzIoRVZFUkdSRUVOX0NSVENfQ09OVFJPTCArIEVWRVJHUkVFTl9DUlRDMV9SRUdJU1RFUl9PRkZTRVQsIDApOwotCVdSRUczMihFVkVSR1JFRU5fQ1JUQ19DT05UUk9MICsgRVZFUkdSRUVOX0NSVEMyX1JFR0lTVEVSX09GRlNFVCwgMCk7Ci0JV1JFRzMyKEVWRVJHUkVFTl9DUlRDX0NPTlRST0wgKyBFVkVSR1JFRU5fQ1JUQzNfUkVHSVNURVJfT0ZGU0VULCAwKTsKLQlXUkVHMzIoRVZFUkdSRUVOX0NSVENfQ09OVFJPTCArIEVWRVJHUkVFTl9DUlRDNF9SRUdJU1RFUl9PRkZTRVQsIDApOwotCVdSRUczMihFVkVSR1JFRU5fQ1JUQ19DT05UUk9MICsgRVZFUkdSRUVOX0NSVEM1X1JFR0lTVEVSX09GRlNFVCwgMCk7CisJaWYgKCEocmRldi0+ZmxhZ3MgJiBSQURFT05fSVNfSUdQKSkgeworCQlXUkVHMzIoRVZFUkdSRUVOX0NSVENfQ09OVFJPTCArIEVWRVJHUkVFTl9DUlRDMl9SRUdJU1RFUl9PRkZTRVQsIDApOworCQlXUkVHMzIoRVZFUkdSRUVOX0NSVENfQ09OVFJPTCArIEVWRVJHUkVFTl9DUlRDM19SRUdJU1RFUl9PRkZTRVQsIDApOworCQlXUkVHMzIoRVZFUkdSRUVOX0NSVENfQ09OVFJPTCArIEVWRVJHUkVFTl9DUlRDNF9SRUdJU1RFUl9PRkZTRVQsIDApOworCQlXUkVHMzIoRVZFUkdSRUVOX0NSVENfQ09OVFJPTCArIEVWRVJHUkVFTl9DUlRDNV9SRUdJU1RFUl9PRkZTRVQsIDApOworCX0KIAlXUkVHMzIoRVZFUkdSRUVOX0NSVENfVVBEQVRFX0xPQ0sgKyBFVkVSR1JFRU5fQ1JUQzBfUkVHSVNURVJfT0ZGU0VULCAwKTsKIAlXUkVHMzIoRVZFUkdSRUVOX0NSVENfVVBEQVRFX0xPQ0sgKyBFVkVSR1JFRU5fQ1JUQzFfUkVHSVNURVJfT0ZGU0VULCAwKTsKLQlXUkVHMzIoRVZFUkdSRUVOX0NSVENfVVBEQVRFX0xPQ0sgKyBFVkVSR1JFRU5fQ1JUQzJfUkVHSVNURVJfT0ZGU0VULCAwKTsKLQlXUkVHMzIoRVZFUkdSRUVOX0NSVENfVVBEQVRFX0xPQ0sgKyBFVkVSR1JFRU5fQ1JUQzNfUkVHSVNURVJfT0ZGU0VULCAwKTsKLQlXUkVHMzIoRVZFUkdSRUVOX0NSVENfVVBEQVRFX0xPQ0sgKyBFVkVSR1JFRU5fQ1JUQzRfUkVHSVNURVJfT0ZGU0VULCAwKTsKLQlXUkVHMzIoRVZFUkdSRUVOX0NSVENfVVBEQVRFX0xPQ0sgKyBFVkVSR1JFRU5fQ1JUQzVfUkVHSVNURVJfT0ZGU0VULCAwKTsKKwlpZiAoIShyZGV2LT5mbGFncyAmIFJBREVPTl9JU19JR1ApKSB7CisJCVdSRUczMihFVkVSR1JFRU5fQ1JUQ19VUERBVEVfTE9DSyArIEVWRVJHUkVFTl9DUlRDMl9SRUdJU1RFUl9PRkZTRVQsIDApOworCQlXUkVHMzIoRVZFUkdSRUVOX0NSVENfVVBEQVRFX0xPQ0sgKyBFVkVSR1JFRU5fQ1JUQzNfUkVHSVNURVJfT0ZGU0VULCAwKTsKKwkJV1JFRzMyKEVWRVJHUkVFTl9DUlRDX1VQREFURV9MT0NLICsgRVZFUkdSRUVOX0NSVEM0X1JFR0lTVEVSX09GRlNFVCwgMCk7CisJCVdSRUczMihFVkVSR1JFRU5fQ1JUQ19VUERBVEVfTE9DSyArIEVWRVJHUkVFTl9DUlRDNV9SRUdJU1RFUl9PRkZTRVQsIDApOworCX0KIAogCVdSRUczMihEMVZHQV9DT05UUk9MLCAwKTsKIAlXUkVHMzIoRDJWR0FfQ09OVFJPTCwgMCk7CkBAIC05NDQsNDEgKzEwMjgsNDMgQEAKIAlXUkVHMzIoRVZFUkdSRUVOX0dSUEhfU0VDT05EQVJZX1NVUkZBQ0VfQUREUkVTUyArIEVWRVJHUkVFTl9DUlRDMV9SRUdJU1RFUl9PRkZTRVQsCiAJICAgICAgICh1MzIpcmRldi0+bWMudnJhbV9zdGFydCk7CiAKLQlXUkVHMzIoRVZFUkdSRUVOX0dSUEhfUFJJTUFSWV9TVVJGQUNFX0FERFJFU1NfSElHSCArIEVWRVJHUkVFTl9DUlRDMl9SRUdJU1RFUl9PRkZTRVQsCi0JICAgICAgIHVwcGVyXzMyX2JpdHMocmRldi0+bWMudnJhbV9zdGFydCkpOwotCVdSRUczMihFVkVSR1JFRU5fR1JQSF9TRUNPTkRBUllfU1VSRkFDRV9BRERSRVNTX0hJR0ggKyBFVkVSR1JFRU5fQ1JUQzJfUkVHSVNURVJfT0ZGU0VULAotCSAgICAgICB1cHBlcl8zMl9iaXRzKHJkZXYtPm1jLnZyYW1fc3RhcnQpKTsKLQlXUkVHMzIoRVZFUkdSRUVOX0dSUEhfUFJJTUFSWV9TVVJGQUNFX0FERFJFU1MgKyBFVkVSR1JFRU5fQ1JUQzJfUkVHSVNURVJfT0ZGU0VULAotCSAgICAgICAodTMyKXJkZXYtPm1jLnZyYW1fc3RhcnQpOwotCVdSRUczMihFVkVSR1JFRU5fR1JQSF9TRUNPTkRBUllfU1VSRkFDRV9BRERSRVNTICsgRVZFUkdSRUVOX0NSVEMyX1JFR0lTVEVSX09GRlNFVCwKLQkgICAgICAgKHUzMilyZGV2LT5tYy52cmFtX3N0YXJ0KTsKKwlpZiAoIShyZGV2LT5mbGFncyAmIFJBREVPTl9JU19JR1ApKSB7CisJCVdSRUczMihFVkVSR1JFRU5fR1JQSF9QUklNQVJZX1NVUkZBQ0VfQUREUkVTU19ISUdIICsgRVZFUkdSRUVOX0NSVEMyX1JFR0lTVEVSX09GRlNFVCwKKwkJICAgICAgIHVwcGVyXzMyX2JpdHMocmRldi0+bWMudnJhbV9zdGFydCkpOworCQlXUkVHMzIoRVZFUkdSRUVOX0dSUEhfU0VDT05EQVJZX1NVUkZBQ0VfQUREUkVTU19ISUdIICsgRVZFUkdSRUVOX0NSVEMyX1JFR0lTVEVSX09GRlNFVCwKKwkJICAgICAgIHVwcGVyXzMyX2JpdHMocmRldi0+bWMudnJhbV9zdGFydCkpOworCQlXUkVHMzIoRVZFUkdSRUVOX0dSUEhfUFJJTUFSWV9TVVJGQUNFX0FERFJFU1MgKyBFVkVSR1JFRU5fQ1JUQzJfUkVHSVNURVJfT0ZGU0VULAorCQkgICAgICAgKHUzMilyZGV2LT5tYy52cmFtX3N0YXJ0KTsKKwkJV1JFRzMyKEVWRVJHUkVFTl9HUlBIX1NFQ09OREFSWV9TVVJGQUNFX0FERFJFU1MgKyBFVkVSR1JFRU5fQ1JUQzJfUkVHSVNURVJfT0ZGU0VULAorCQkgICAgICAgKHUzMilyZGV2LT5tYy52cmFtX3N0YXJ0KTsKIAotCVdSRUczMihFVkVSR1JFRU5fR1JQSF9QUklNQVJZX1NVUkZBQ0VfQUREUkVTU19ISUdIICsgRVZFUkdSRUVOX0NSVEMzX1JFR0lTVEVSX09GRlNFVCwKLQkgICAgICAgdXBwZXJfMzJfYml0cyhyZGV2LT5tYy52cmFtX3N0YXJ0KSk7Ci0JV1JFRzMyKEVWRVJHUkVFTl9HUlBIX1NFQ09OREFSWV9TVVJGQUNFX0FERFJFU1NfSElHSCArIEVWRVJHUkVFTl9DUlRDM19SRUdJU1RFUl9PRkZTRVQsCi0JICAgICAgIHVwcGVyXzMyX2JpdHMocmRldi0+bWMudnJhbV9zdGFydCkpOwotCVdSRUczMihFVkVSR1JFRU5fR1JQSF9QUklNQVJZX1NVUkZBQ0VfQUREUkVTUyArIEVWRVJHUkVFTl9DUlRDM19SRUdJU1RFUl9PRkZTRVQsCi0JICAgICAgICh1MzIpcmRldi0+bWMudnJhbV9zdGFydCk7Ci0JV1JFRzMyKEVWRVJHUkVFTl9HUlBIX1NFQ09OREFSWV9TVVJGQUNFX0FERFJFU1MgKyBFVkVSR1JFRU5fQ1JUQzNfUkVHSVNURVJfT0ZGU0VULAotCSAgICAgICAodTMyKXJkZXYtPm1jLnZyYW1fc3RhcnQpOworCQlXUkVHMzIoRVZFUkdSRUVOX0dSUEhfUFJJTUFSWV9TVVJGQUNFX0FERFJFU1NfSElHSCArIEVWRVJHUkVFTl9DUlRDM19SRUdJU1RFUl9PRkZTRVQsCisJCSAgICAgICB1cHBlcl8zMl9iaXRzKHJkZXYtPm1jLnZyYW1fc3RhcnQpKTsKKwkJV1JFRzMyKEVWRVJHUkVFTl9HUlBIX1NFQ09OREFSWV9TVVJGQUNFX0FERFJFU1NfSElHSCArIEVWRVJHUkVFTl9DUlRDM19SRUdJU1RFUl9PRkZTRVQsCisJCSAgICAgICB1cHBlcl8zMl9iaXRzKHJkZXYtPm1jLnZyYW1fc3RhcnQpKTsKKwkJV1JFRzMyKEVWRVJHUkVFTl9HUlBIX1BSSU1BUllfU1VSRkFDRV9BRERSRVNTICsgRVZFUkdSRUVOX0NSVEMzX1JFR0lTVEVSX09GRlNFVCwKKwkJICAgICAgICh1MzIpcmRldi0+bWMudnJhbV9zdGFydCk7CisJCVdSRUczMihFVkVSR1JFRU5fR1JQSF9TRUNPTkRBUllfU1VSRkFDRV9BRERSRVNTICsgRVZFUkdSRUVOX0NSVEMzX1JFR0lTVEVSX09GRlNFVCwKKwkJICAgICAgICh1MzIpcmRldi0+bWMudnJhbV9zdGFydCk7CiAKLQlXUkVHMzIoRVZFUkdSRUVOX0dSUEhfUFJJTUFSWV9TVVJGQUNFX0FERFJFU1NfSElHSCArIEVWRVJHUkVFTl9DUlRDNF9SRUdJU1RFUl9PRkZTRVQsCi0JICAgICAgIHVwcGVyXzMyX2JpdHMocmRldi0+bWMudnJhbV9zdGFydCkpOwotCVdSRUczMihFVkVSR1JFRU5fR1JQSF9TRUNPTkRBUllfU1VSRkFDRV9BRERSRVNTX0hJR0ggKyBFVkVSR1JFRU5fQ1JUQzRfUkVHSVNURVJfT0ZGU0VULAotCSAgICAgICB1cHBlcl8zMl9iaXRzKHJkZXYtPm1jLnZyYW1fc3RhcnQpKTsKLQlXUkVHMzIoRVZFUkdSRUVOX0dSUEhfUFJJTUFSWV9TVVJGQUNFX0FERFJFU1MgKyBFVkVSR1JFRU5fQ1JUQzRfUkVHSVNURVJfT0ZGU0VULAotCSAgICAgICAodTMyKXJkZXYtPm1jLnZyYW1fc3RhcnQpOwotCVdSRUczMihFVkVSR1JFRU5fR1JQSF9TRUNPTkRBUllfU1VSRkFDRV9BRERSRVNTICsgRVZFUkdSRUVOX0NSVEM0X1JFR0lTVEVSX09GRlNFVCwKLQkgICAgICAgKHUzMilyZGV2LT5tYy52cmFtX3N0YXJ0KTsKKwkJV1JFRzMyKEVWRVJHUkVFTl9HUlBIX1BSSU1BUllfU1VSRkFDRV9BRERSRVNTX0hJR0ggKyBFVkVSR1JFRU5fQ1JUQzRfUkVHSVNURVJfT0ZGU0VULAorCQkgICAgICAgdXBwZXJfMzJfYml0cyhyZGV2LT5tYy52cmFtX3N0YXJ0KSk7CisJCVdSRUczMihFVkVSR1JFRU5fR1JQSF9TRUNPTkRBUllfU1VSRkFDRV9BRERSRVNTX0hJR0ggKyBFVkVSR1JFRU5fQ1JUQzRfUkVHSVNURVJfT0ZGU0VULAorCQkgICAgICAgdXBwZXJfMzJfYml0cyhyZGV2LT5tYy52cmFtX3N0YXJ0KSk7CisJCVdSRUczMihFVkVSR1JFRU5fR1JQSF9QUklNQVJZX1NVUkZBQ0VfQUREUkVTUyArIEVWRVJHUkVFTl9DUlRDNF9SRUdJU1RFUl9PRkZTRVQsCisJCSAgICAgICAodTMyKXJkZXYtPm1jLnZyYW1fc3RhcnQpOworCQlXUkVHMzIoRVZFUkdSRUVOX0dSUEhfU0VDT05EQVJZX1NVUkZBQ0VfQUREUkVTUyArIEVWRVJHUkVFTl9DUlRDNF9SRUdJU1RFUl9PRkZTRVQsCisJCSAgICAgICAodTMyKXJkZXYtPm1jLnZyYW1fc3RhcnQpOwogCi0JV1JFRzMyKEVWRVJHUkVFTl9HUlBIX1BSSU1BUllfU1VSRkFDRV9BRERSRVNTX0hJR0ggKyBFVkVSR1JFRU5fQ1JUQzVfUkVHSVNURVJfT0ZGU0VULAotCSAgICAgICB1cHBlcl8zMl9iaXRzKHJkZXYtPm1jLnZyYW1fc3RhcnQpKTsKLQlXUkVHMzIoRVZFUkdSRUVOX0dSUEhfU0VDT05EQVJZX1NVUkZBQ0VfQUREUkVTU19ISUdIICsgRVZFUkdSRUVOX0NSVEM1X1JFR0lTVEVSX09GRlNFVCwKLQkgICAgICAgdXBwZXJfMzJfYml0cyhyZGV2LT5tYy52cmFtX3N0YXJ0KSk7Ci0JV1JFRzMyKEVWRVJHUkVFTl9HUlBIX1BSSU1BUllfU1VSRkFDRV9BRERSRVNTICsgRVZFUkdSRUVOX0NSVEM1X1JFR0lTVEVSX09GRlNFVCwKLQkgICAgICAgKHUzMilyZGV2LT5tYy52cmFtX3N0YXJ0KTsKLQlXUkVHMzIoRVZFUkdSRUVOX0dSUEhfU0VDT05EQVJZX1NVUkZBQ0VfQUREUkVTUyArIEVWRVJHUkVFTl9DUlRDNV9SRUdJU1RFUl9PRkZTRVQsCi0JICAgICAgICh1MzIpcmRldi0+bWMudnJhbV9zdGFydCk7CisJCVdSRUczMihFVkVSR1JFRU5fR1JQSF9QUklNQVJZX1NVUkZBQ0VfQUREUkVTU19ISUdIICsgRVZFUkdSRUVOX0NSVEM1X1JFR0lTVEVSX09GRlNFVCwKKwkJICAgICAgIHVwcGVyXzMyX2JpdHMocmRldi0+bWMudnJhbV9zdGFydCkpOworCQlXUkVHMzIoRVZFUkdSRUVOX0dSUEhfU0VDT05EQVJZX1NVUkZBQ0VfQUREUkVTU19ISUdIICsgRVZFUkdSRUVOX0NSVEM1X1JFR0lTVEVSX09GRlNFVCwKKwkJICAgICAgIHVwcGVyXzMyX2JpdHMocmRldi0+bWMudnJhbV9zdGFydCkpOworCQlXUkVHMzIoRVZFUkdSRUVOX0dSUEhfUFJJTUFSWV9TVVJGQUNFX0FERFJFU1MgKyBFVkVSR1JFRU5fQ1JUQzVfUkVHSVNURVJfT0ZGU0VULAorCQkgICAgICAgKHUzMilyZGV2LT5tYy52cmFtX3N0YXJ0KTsKKwkJV1JFRzMyKEVWRVJHUkVFTl9HUlBIX1NFQ09OREFSWV9TVVJGQUNFX0FERFJFU1MgKyBFVkVSR1JFRU5fQ1JUQzVfUkVHSVNURVJfT0ZGU0VULAorCQkgICAgICAgKHUzMilyZGV2LT5tYy52cmFtX3N0YXJ0KTsKKwl9CiAKIAlXUkVHMzIoRVZFUkdSRUVOX1ZHQV9NRU1PUllfQkFTRV9BRERSRVNTX0hJR0gsIHVwcGVyXzMyX2JpdHMocmRldi0+bWMudnJhbV9zdGFydCkpOwogCVdSRUczMihFVkVSR1JFRU5fVkdBX01FTU9SWV9CQVNFX0FERFJFU1MsICh1MzIpcmRldi0+bWMudnJhbV9zdGFydCk7CkBAIC05OTQsMjIgKzEwODAsMjggQEAKIAlXUkVHMzIoRVZFUkdSRUVOX0Q2VkdBX0NPTlRST0wsIHNhdmUtPnZnYV9jb250cm9sWzVdKTsKIAlXUkVHMzIoRVZFUkdSRUVOX0NSVENfVVBEQVRFX0xPQ0sgKyBFVkVSR1JFRU5fQ1JUQzBfUkVHSVNURVJfT0ZGU0VULCAxKTsKIAlXUkVHMzIoRVZFUkdSRUVOX0NSVENfVVBEQVRFX0xPQ0sgKyBFVkVSR1JFRU5fQ1JUQzFfUkVHSVNURVJfT0ZGU0VULCAxKTsKLQlXUkVHMzIoRVZFUkdSRUVOX0NSVENfVVBEQVRFX0xPQ0sgKyBFVkVSR1JFRU5fQ1JUQzJfUkVHSVNURVJfT0ZGU0VULCAxKTsKLQlXUkVHMzIoRVZFUkdSRUVOX0NSVENfVVBEQVRFX0xPQ0sgKyBFVkVSR1JFRU5fQ1JUQzNfUkVHSVNURVJfT0ZGU0VULCAxKTsKLQlXUkVHMzIoRVZFUkdSRUVOX0NSVENfVVBEQVRFX0xPQ0sgKyBFVkVSR1JFRU5fQ1JUQzRfUkVHSVNURVJfT0ZGU0VULCAxKTsKLQlXUkVHMzIoRVZFUkdSRUVOX0NSVENfVVBEQVRFX0xPQ0sgKyBFVkVSR1JFRU5fQ1JUQzVfUkVHSVNURVJfT0ZGU0VULCAxKTsKKwlpZiAoIShyZGV2LT5mbGFncyAmIFJBREVPTl9JU19JR1ApKSB7CisJCVdSRUczMihFVkVSR1JFRU5fQ1JUQ19VUERBVEVfTE9DSyArIEVWRVJHUkVFTl9DUlRDMl9SRUdJU1RFUl9PRkZTRVQsIDEpOworCQlXUkVHMzIoRVZFUkdSRUVOX0NSVENfVVBEQVRFX0xPQ0sgKyBFVkVSR1JFRU5fQ1JUQzNfUkVHSVNURVJfT0ZGU0VULCAxKTsKKwkJV1JFRzMyKEVWRVJHUkVFTl9DUlRDX1VQREFURV9MT0NLICsgRVZFUkdSRUVOX0NSVEM0X1JFR0lTVEVSX09GRlNFVCwgMSk7CisJCVdSRUczMihFVkVSR1JFRU5fQ1JUQ19VUERBVEVfTE9DSyArIEVWRVJHUkVFTl9DUlRDNV9SRUdJU1RFUl9PRkZTRVQsIDEpOworCX0KIAlXUkVHMzIoRVZFUkdSRUVOX0NSVENfQ09OVFJPTCArIEVWRVJHUkVFTl9DUlRDMF9SRUdJU1RFUl9PRkZTRVQsIHNhdmUtPmNydGNfY29udHJvbFswXSk7CiAJV1JFRzMyKEVWRVJHUkVFTl9DUlRDX0NPTlRST0wgKyBFVkVSR1JFRU5fQ1JUQzFfUkVHSVNURVJfT0ZGU0VULCBzYXZlLT5jcnRjX2NvbnRyb2xbMV0pOwotCVdSRUczMihFVkVSR1JFRU5fQ1JUQ19DT05UUk9MICsgRVZFUkdSRUVOX0NSVEMyX1JFR0lTVEVSX09GRlNFVCwgc2F2ZS0+Y3J0Y19jb250cm9sWzJdKTsKLQlXUkVHMzIoRVZFUkdSRUVOX0NSVENfQ09OVFJPTCArIEVWRVJHUkVFTl9DUlRDM19SRUdJU1RFUl9PRkZTRVQsIHNhdmUtPmNydGNfY29udHJvbFszXSk7Ci0JV1JFRzMyKEVWRVJHUkVFTl9DUlRDX0NPTlRST0wgKyBFVkVSR1JFRU5fQ1JUQzRfUkVHSVNURVJfT0ZGU0VULCBzYXZlLT5jcnRjX2NvbnRyb2xbNF0pOwotCVdSRUczMihFVkVSR1JFRU5fQ1JUQ19DT05UUk9MICsgRVZFUkdSRUVOX0NSVEM1X1JFR0lTVEVSX09GRlNFVCwgc2F2ZS0+Y3J0Y19jb250cm9sWzVdKTsKKwlpZiAoIShyZGV2LT5mbGFncyAmIFJBREVPTl9JU19JR1ApKSB7CisJCVdSRUczMihFVkVSR1JFRU5fQ1JUQ19DT05UUk9MICsgRVZFUkdSRUVOX0NSVEMyX1JFR0lTVEVSX09GRlNFVCwgc2F2ZS0+Y3J0Y19jb250cm9sWzJdKTsKKwkJV1JFRzMyKEVWRVJHUkVFTl9DUlRDX0NPTlRST0wgKyBFVkVSR1JFRU5fQ1JUQzNfUkVHSVNURVJfT0ZGU0VULCBzYXZlLT5jcnRjX2NvbnRyb2xbM10pOworCQlXUkVHMzIoRVZFUkdSRUVOX0NSVENfQ09OVFJPTCArIEVWRVJHUkVFTl9DUlRDNF9SRUdJU1RFUl9PRkZTRVQsIHNhdmUtPmNydGNfY29udHJvbFs0XSk7CisJCVdSRUczMihFVkVSR1JFRU5fQ1JUQ19DT05UUk9MICsgRVZFUkdSRUVOX0NSVEM1X1JFR0lTVEVSX09GRlNFVCwgc2F2ZS0+Y3J0Y19jb250cm9sWzVdKTsKKwl9CiAJV1JFRzMyKEVWRVJHUkVFTl9DUlRDX1VQREFURV9MT0NLICsgRVZFUkdSRUVOX0NSVEMwX1JFR0lTVEVSX09GRlNFVCwgMCk7CiAJV1JFRzMyKEVWRVJHUkVFTl9DUlRDX1VQREFURV9MT0NLICsgRVZFUkdSRUVOX0NSVEMxX1JFR0lTVEVSX09GRlNFVCwgMCk7Ci0JV1JFRzMyKEVWRVJHUkVFTl9DUlRDX1VQREFURV9MT0NLICsgRVZFUkdSRUVOX0NSVEMyX1JFR0lTVEVSX09GRlNFVCwgMCk7Ci0JV1JFRzMyKEVWRVJHUkVFTl9DUlRDX1VQREFURV9MT0NLICsgRVZFUkdSRUVOX0NSVEMzX1JFR0lTVEVSX09GRlNFVCwgMCk7Ci0JV1JFRzMyKEVWRVJHUkVFTl9DUlRDX1VQREFURV9MT0NLICsgRVZFUkdSRUVOX0NSVEM0X1JFR0lTVEVSX09GRlNFVCwgMCk7Ci0JV1JFRzMyKEVWRVJHUkVFTl9DUlRDX1VQREFURV9MT0NLICsgRVZFUkdSRUVOX0NSVEM1X1JFR0lTVEVSX09GRlNFVCwgMCk7CisJaWYgKCEocmRldi0+ZmxhZ3MgJiBSQURFT05fSVNfSUdQKSkgeworCQlXUkVHMzIoRVZFUkdSRUVOX0NSVENfVVBEQVRFX0xPQ0sgKyBFVkVSR1JFRU5fQ1JUQzJfUkVHSVNURVJfT0ZGU0VULCAwKTsKKwkJV1JFRzMyKEVWRVJHUkVFTl9DUlRDX1VQREFURV9MT0NLICsgRVZFUkdSRUVOX0NSVEMzX1JFR0lTVEVSX09GRlNFVCwgMCk7CisJCVdSRUczMihFVkVSR1JFRU5fQ1JUQ19VUERBVEVfTE9DSyArIEVWRVJHUkVFTl9DUlRDNF9SRUdJU1RFUl9PRkZTRVQsIDApOworCQlXUkVHMzIoRVZFUkdSRUVOX0NSVENfVVBEQVRFX0xPQ0sgKyBFVkVSR1JFRU5fQ1JUQzVfUkVHSVNURVJfT0ZGU0VULCAwKTsKKwl9CiAJV1JFRzMyKFZHQV9SRU5ERVJfQ09OVFJPTCwgc2F2ZS0+dmdhX3JlbmRlcl9jb250cm9sKTsKIH0KIApAQCAtMTA1NywxMSArMTE0OSwxNyBAQAogCQkJcmRldi0+bWMudnJhbV9lbmQgPj4gMTIpOwogCX0KIAlXUkVHMzIoTUNfVk1fU1lTVEVNX0FQRVJUVVJFX0RFRkFVTFRfQUREUiwgMCk7CisJaWYgKHJkZXYtPmZsYWdzICYgUkFERU9OX0lTX0lHUCkgeworCQl0bXAgPSBSUkVHMzIoTUNfRlVTX1ZNX0ZCX09GRlNFVCkgJiAweDAwMEZGRkZGOworCQl0bXAgfD0gKChyZGV2LT5tYy52cmFtX2VuZCA+PiAyMCkgJiAweEYpIDw8IDI0OworCQl0bXAgfD0gKChyZGV2LT5tYy52cmFtX3N0YXJ0ID4+IDIwKSAmIDB4RikgPDwgMjA7CisJCVdSRUczMihNQ19GVVNfVk1fRkJfT0ZGU0VULCB0bXApOworCX0KIAl0bXAgPSAoKHJkZXYtPm1jLnZyYW1fZW5kID4+IDI0KSAmIDB4RkZGRikgPDwgMTY7CiAJdG1wIHw9ICgocmRldi0+bWMudnJhbV9zdGFydCA+PiAyNCkgJiAweEZGRkYpOwogCVdSRUczMihNQ19WTV9GQl9MT0NBVElPTiwgdG1wKTsKIAlXUkVHMzIoSERQX05PTlNVUkZBQ0VfQkFTRSwgKHJkZXYtPm1jLnZyYW1fc3RhcnQgPj4gOCkpOwotCVdSRUczMihIRFBfTk9OU1VSRkFDRV9JTkZPLCAoMiA8PCA3KSk7CisJV1JFRzMyKEhEUF9OT05TVVJGQUNFX0lORk8sICgyIDw8IDcpIHwgKDEgPDwgMzApKTsKIAlXUkVHMzIoSERQX05PTlNVUkZBQ0VfU0laRSwgMHgzRkZGRkZGRik7CiAJaWYgKHJkZXYtPmZsYWdzICYgUkFERU9OX0lTX0FHUCkgewogCQlXUkVHMzIoTUNfVk1fQUdQX1RPUCwgcmRldi0+bWMuZ3R0X2VuZCA+PiAxNik7CkBAIC0xMjg1LDExICsxMzgzLDE1IEBACiAJc3dpdGNoIChyZGV2LT5mYW1pbHkpIHsKIAljYXNlIENISVBfQ0VEQVI6CiAJY2FzZSBDSElQX1JFRFdPT0Q6CisJY2FzZSBDSElQX1BBTE06CisJY2FzZSBDSElQX1RVUktTOgorCWNhc2UgQ0hJUF9DQUlDT1M6CiAJCWZvcmNlX25vX3N3aXp6bGUgPSBmYWxzZTsKIAkJYnJlYWs7CiAJY2FzZSBDSElQX0NZUFJFU1M6CiAJY2FzZSBDSElQX0hFTUxPQ0s6CiAJY2FzZSBDSElQX0pVTklQRVI6CisJY2FzZSBDSElQX0JBUlRTOgogCWRlZmF1bHQ6CiAJCWZvcmNlX25vX3N3aXp6bGUgPSB0cnVlOwogCQlicmVhazsKQEAgLTEzODQsNiArMTQ4Niw0NiBAQAogCXJldHVybiBiYWNrZW5kX21hcDsKIH0KIAorc3RhdGljIHZvaWQgZXZlcmdyZWVuX3Byb2dyYW1fY2hhbm5lbF9yZW1hcChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKK3sKKwl1MzIgdGNwX2NoYW5fc3RlZXJfbG8sIHRjcF9jaGFuX3N0ZWVyX2hpLCBtY19zaGFyZWRfY2hyZW1hcCwgdG1wOworCisJdG1wID0gUlJFRzMyKE1DX1NIQVJFRF9DSE1BUCk7CisJc3dpdGNoICgodG1wICYgTk9PRkNIQU5fTUFTSykgPj4gTk9PRkNIQU5fU0hJRlQpIHsKKwljYXNlIDA6CisJY2FzZSAxOgorCWNhc2UgMjoKKwljYXNlIDM6CisJZGVmYXVsdDoKKwkJLyogZGVmYXVsdCBtYXBwaW5nICovCisJCW1jX3NoYXJlZF9jaHJlbWFwID0gMHgwMGZhYzY4ODsKKwkJYnJlYWs7CisJfQorCisJc3dpdGNoIChyZGV2LT5mYW1pbHkpIHsKKwljYXNlIENISVBfSEVNTE9DSzoKKwljYXNlIENISVBfQ1lQUkVTUzoKKwljYXNlIENISVBfQkFSVFM6CisJCXRjcF9jaGFuX3N0ZWVyX2xvID0gMHg1NDc2MzIxMDsKKwkJdGNwX2NoYW5fc3RlZXJfaGkgPSAweDAwMDBiYTk4OworCQlicmVhazsKKwljYXNlIENISVBfSlVOSVBFUjoKKwljYXNlIENISVBfUkVEV09PRDoKKwljYXNlIENISVBfQ0VEQVI6CisJY2FzZSBDSElQX1BBTE06CisJY2FzZSBDSElQX1RVUktTOgorCWNhc2UgQ0hJUF9DQUlDT1M6CisJZGVmYXVsdDoKKwkJdGNwX2NoYW5fc3RlZXJfbG8gPSAweDc2NTQzMjEwOworCQl0Y3BfY2hhbl9zdGVlcl9oaSA9IDB4MDAwMGJhOTg7CisJCWJyZWFrOworCX0KKworCVdSRUczMihUQ1BfQ0hBTl9TVEVFUl9MTywgdGNwX2NoYW5fc3RlZXJfbG8pOworCVdSRUczMihUQ1BfQ0hBTl9TVEVFUl9ISSwgdGNwX2NoYW5fc3RlZXJfaGkpOworCVdSRUczMihNQ19TSEFSRURfQ0hSRU1BUCwgbWNfc2hhcmVkX2NocmVtYXApOworfQorCiBzdGF0aWMgdm9pZCBldmVyZ3JlZW5fZ3B1X2luaXQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCiB7CiAJdTMyIGNjX3JiX2JhY2tlbmRfZGlzYWJsZSA9IDA7CkBAIC0xNDk1LDYgKzE2MzcsOTAgQEAKIAkJcmRldi0+Y29uZmlnLmV2ZXJncmVlbi5zY19oaXpfdGlsZV9maWZvX3NpemUgPSAweDMwOwogCQlyZGV2LT5jb25maWcuZXZlcmdyZWVuLnNjX2Vhcmx5el90aWxlX2ZpZm9fc2l6ZSA9IDB4MTMwOwogCQlicmVhazsKKwljYXNlIENISVBfUEFMTToKKwkJcmRldi0+Y29uZmlnLmV2ZXJncmVlbi5udW1fc2VzID0gMTsKKwkJcmRldi0+Y29uZmlnLmV2ZXJncmVlbi5tYXhfcGlwZXMgPSAyOworCQlyZGV2LT5jb25maWcuZXZlcmdyZWVuLm1heF90aWxlX3BpcGVzID0gMjsKKwkJcmRldi0+Y29uZmlnLmV2ZXJncmVlbi5tYXhfc2ltZHMgPSAyOworCQlyZGV2LT5jb25maWcuZXZlcmdyZWVuLm1heF9iYWNrZW5kcyA9IDEgKiByZGV2LT5jb25maWcuZXZlcmdyZWVuLm51bV9zZXM7CisJCXJkZXYtPmNvbmZpZy5ldmVyZ3JlZW4ubWF4X2dwcnMgPSAyNTY7CisJCXJkZXYtPmNvbmZpZy5ldmVyZ3JlZW4ubWF4X3RocmVhZHMgPSAxOTI7CisJCXJkZXYtPmNvbmZpZy5ldmVyZ3JlZW4ubWF4X2dzX3RocmVhZHMgPSAxNjsKKwkJcmRldi0+Y29uZmlnLmV2ZXJncmVlbi5tYXhfc3RhY2tfZW50cmllcyA9IDI1NjsKKwkJcmRldi0+Y29uZmlnLmV2ZXJncmVlbi5zeF9udW1fb2Zfc2V0cyA9IDQ7CisJCXJkZXYtPmNvbmZpZy5ldmVyZ3JlZW4uc3hfbWF4X2V4cG9ydF9zaXplID0gMTI4OworCQlyZGV2LT5jb25maWcuZXZlcmdyZWVuLnN4X21heF9leHBvcnRfcG9zX3NpemUgPSAzMjsKKwkJcmRldi0+Y29uZmlnLmV2ZXJncmVlbi5zeF9tYXhfZXhwb3J0X3NteF9zaXplID0gOTY7CisJCXJkZXYtPmNvbmZpZy5ldmVyZ3JlZW4ubWF4X2h3X2NvbnRleHRzID0gNDsKKwkJcmRldi0+Y29uZmlnLmV2ZXJncmVlbi5zcV9udW1fY2ZfaW5zdHMgPSAxOworCisJCXJkZXYtPmNvbmZpZy5ldmVyZ3JlZW4uc2NfcHJpbV9maWZvX3NpemUgPSAweDQwOworCQlyZGV2LT5jb25maWcuZXZlcmdyZWVuLnNjX2hpel90aWxlX2ZpZm9fc2l6ZSA9IDB4MzA7CisJCXJkZXYtPmNvbmZpZy5ldmVyZ3JlZW4uc2NfZWFybHl6X3RpbGVfZmlmb19zaXplID0gMHgxMzA7CisJCWJyZWFrOworCWNhc2UgQ0hJUF9CQVJUUzoKKwkJcmRldi0+Y29uZmlnLmV2ZXJncmVlbi5udW1fc2VzID0gMjsKKwkJcmRldi0+Y29uZmlnLmV2ZXJncmVlbi5tYXhfcGlwZXMgPSA0OworCQlyZGV2LT5jb25maWcuZXZlcmdyZWVuLm1heF90aWxlX3BpcGVzID0gODsKKwkJcmRldi0+Y29uZmlnLmV2ZXJncmVlbi5tYXhfc2ltZHMgPSA3OworCQlyZGV2LT5jb25maWcuZXZlcmdyZWVuLm1heF9iYWNrZW5kcyA9IDQgKiByZGV2LT5jb25maWcuZXZlcmdyZWVuLm51bV9zZXM7CisJCXJkZXYtPmNvbmZpZy5ldmVyZ3JlZW4ubWF4X2dwcnMgPSAyNTY7CisJCXJkZXYtPmNvbmZpZy5ldmVyZ3JlZW4ubWF4X3RocmVhZHMgPSAyNDg7CisJCXJkZXYtPmNvbmZpZy5ldmVyZ3JlZW4ubWF4X2dzX3RocmVhZHMgPSAzMjsKKwkJcmRldi0+Y29uZmlnLmV2ZXJncmVlbi5tYXhfc3RhY2tfZW50cmllcyA9IDUxMjsKKwkJcmRldi0+Y29uZmlnLmV2ZXJncmVlbi5zeF9udW1fb2Zfc2V0cyA9IDQ7CisJCXJkZXYtPmNvbmZpZy5ldmVyZ3JlZW4uc3hfbWF4X2V4cG9ydF9zaXplID0gMjU2OworCQlyZGV2LT5jb25maWcuZXZlcmdyZWVuLnN4X21heF9leHBvcnRfcG9zX3NpemUgPSA2NDsKKwkJcmRldi0+Y29uZmlnLmV2ZXJncmVlbi5zeF9tYXhfZXhwb3J0X3NteF9zaXplID0gMTkyOworCQlyZGV2LT5jb25maWcuZXZlcmdyZWVuLm1heF9od19jb250ZXh0cyA9IDg7CisJCXJkZXYtPmNvbmZpZy5ldmVyZ3JlZW4uc3FfbnVtX2NmX2luc3RzID0gMjsKKworCQlyZGV2LT5jb25maWcuZXZlcmdyZWVuLnNjX3ByaW1fZmlmb19zaXplID0gMHgxMDA7CisJCXJkZXYtPmNvbmZpZy5ldmVyZ3JlZW4uc2NfaGl6X3RpbGVfZmlmb19zaXplID0gMHgzMDsKKwkJcmRldi0+Y29uZmlnLmV2ZXJncmVlbi5zY19lYXJseXpfdGlsZV9maWZvX3NpemUgPSAweDEzMDsKKwkJYnJlYWs7CisJY2FzZSBDSElQX1RVUktTOgorCQlyZGV2LT5jb25maWcuZXZlcmdyZWVuLm51bV9zZXMgPSAxOworCQlyZGV2LT5jb25maWcuZXZlcmdyZWVuLm1heF9waXBlcyA9IDQ7CisJCXJkZXYtPmNvbmZpZy5ldmVyZ3JlZW4ubWF4X3RpbGVfcGlwZXMgPSA0OworCQlyZGV2LT5jb25maWcuZXZlcmdyZWVuLm1heF9zaW1kcyA9IDY7CisJCXJkZXYtPmNvbmZpZy5ldmVyZ3JlZW4ubWF4X2JhY2tlbmRzID0gMiAqIHJkZXYtPmNvbmZpZy5ldmVyZ3JlZW4ubnVtX3NlczsKKwkJcmRldi0+Y29uZmlnLmV2ZXJncmVlbi5tYXhfZ3BycyA9IDI1NjsKKwkJcmRldi0+Y29uZmlnLmV2ZXJncmVlbi5tYXhfdGhyZWFkcyA9IDI0ODsKKwkJcmRldi0+Y29uZmlnLmV2ZXJncmVlbi5tYXhfZ3NfdGhyZWFkcyA9IDMyOworCQlyZGV2LT5jb25maWcuZXZlcmdyZWVuLm1heF9zdGFja19lbnRyaWVzID0gMjU2OworCQlyZGV2LT5jb25maWcuZXZlcmdyZWVuLnN4X251bV9vZl9zZXRzID0gNDsKKwkJcmRldi0+Y29uZmlnLmV2ZXJncmVlbi5zeF9tYXhfZXhwb3J0X3NpemUgPSAyNTY7CisJCXJkZXYtPmNvbmZpZy5ldmVyZ3JlZW4uc3hfbWF4X2V4cG9ydF9wb3Nfc2l6ZSA9IDY0OworCQlyZGV2LT5jb25maWcuZXZlcmdyZWVuLnN4X21heF9leHBvcnRfc214X3NpemUgPSAxOTI7CisJCXJkZXYtPmNvbmZpZy5ldmVyZ3JlZW4ubWF4X2h3X2NvbnRleHRzID0gODsKKwkJcmRldi0+Y29uZmlnLmV2ZXJncmVlbi5zcV9udW1fY2ZfaW5zdHMgPSAyOworCisJCXJkZXYtPmNvbmZpZy5ldmVyZ3JlZW4uc2NfcHJpbV9maWZvX3NpemUgPSAweDEwMDsKKwkJcmRldi0+Y29uZmlnLmV2ZXJncmVlbi5zY19oaXpfdGlsZV9maWZvX3NpemUgPSAweDMwOworCQlyZGV2LT5jb25maWcuZXZlcmdyZWVuLnNjX2Vhcmx5el90aWxlX2ZpZm9fc2l6ZSA9IDB4MTMwOworCQlicmVhazsKKwljYXNlIENISVBfQ0FJQ09TOgorCQlyZGV2LT5jb25maWcuZXZlcmdyZWVuLm51bV9zZXMgPSAxOworCQlyZGV2LT5jb25maWcuZXZlcmdyZWVuLm1heF9waXBlcyA9IDQ7CisJCXJkZXYtPmNvbmZpZy5ldmVyZ3JlZW4ubWF4X3RpbGVfcGlwZXMgPSAyOworCQlyZGV2LT5jb25maWcuZXZlcmdyZWVuLm1heF9zaW1kcyA9IDI7CisJCXJkZXYtPmNvbmZpZy5ldmVyZ3JlZW4ubWF4X2JhY2tlbmRzID0gMSAqIHJkZXYtPmNvbmZpZy5ldmVyZ3JlZW4ubnVtX3NlczsKKwkJcmRldi0+Y29uZmlnLmV2ZXJncmVlbi5tYXhfZ3BycyA9IDI1NjsKKwkJcmRldi0+Y29uZmlnLmV2ZXJncmVlbi5tYXhfdGhyZWFkcyA9IDE5MjsKKwkJcmRldi0+Y29uZmlnLmV2ZXJncmVlbi5tYXhfZ3NfdGhyZWFkcyA9IDE2OworCQlyZGV2LT5jb25maWcuZXZlcmdyZWVuLm1heF9zdGFja19lbnRyaWVzID0gMjU2OworCQlyZGV2LT5jb25maWcuZXZlcmdyZWVuLnN4X251bV9vZl9zZXRzID0gNDsKKwkJcmRldi0+Y29uZmlnLmV2ZXJncmVlbi5zeF9tYXhfZXhwb3J0X3NpemUgPSAxMjg7CisJCXJkZXYtPmNvbmZpZy5ldmVyZ3JlZW4uc3hfbWF4X2V4cG9ydF9wb3Nfc2l6ZSA9IDMyOworCQlyZGV2LT5jb25maWcuZXZlcmdyZWVuLnN4X21heF9leHBvcnRfc214X3NpemUgPSA5NjsKKwkJcmRldi0+Y29uZmlnLmV2ZXJncmVlbi5tYXhfaHdfY29udGV4dHMgPSA0OworCQlyZGV2LT5jb25maWcuZXZlcmdyZWVuLnNxX251bV9jZl9pbnN0cyA9IDE7CisKKwkJcmRldi0+Y29uZmlnLmV2ZXJncmVlbi5zY19wcmltX2ZpZm9fc2l6ZSA9IDB4NDA7CisJCXJkZXYtPmNvbmZpZy5ldmVyZ3JlZW4uc2NfaGl6X3RpbGVfZmlmb19zaXplID0gMHgzMDsKKwkJcmRldi0+Y29uZmlnLmV2ZXJncmVlbi5zY19lYXJseXpfdGlsZV9maWZvX3NpemUgPSAweDEzMDsKKwkJYnJlYWs7CiAJfQogCiAJLyogSW5pdGlhbGl6ZSBIRFAgKi8KQEAgLTE2MzYsNiArMTg2Miw3IEBACiAJCXN3aXRjaCAocmRldi0+ZmFtaWx5KSB7CiAJCWNhc2UgQ0hJUF9DWVBSRVNTOgogCQljYXNlIENISVBfSEVNTE9DSzoKKwkJY2FzZSBDSElQX0JBUlRTOgogCQkJZ2JfYmFja2VuZF9tYXAgPSAweDY2NDQyMjAwOwogCQkJYnJlYWs7CiAJCWNhc2UgQ0hJUF9KVU5JUEVSOgpAQCAtMTY4Nyw2ICsxOTE0LDggQEAKIAlXUkVHMzIoRE1JRl9BRERSX0NPTkZJRywgZ2JfYWRkcl9jb25maWcpOwogCVdSRUczMihIRFBfQUREUl9DT05GSUcsIGdiX2FkZHJfY29uZmlnKTsKIAorCWV2ZXJncmVlbl9wcm9ncmFtX2NoYW5uZWxfcmVtYXAocmRldik7CisKIAludW1fc2hhZGVyX2VuZ2luZXMgPSAoKFJSRUczMihHQl9BRERSX0NPTkZJRykgJiBOVU1fU0hBREVSX0VOR0lORVMoMykpID4+IDEyKSArIDE7CiAJZ3JibV9nZnhfaW5kZXggPSBJTlNUQU5DRV9CUk9BRENBU1RfV1JJVEVTOwogCkBAIC0xNzY5LDkgKzE5OTgsMTYgQEAKIAkJICAgICAgR1NfUFJJTygyKSB8CiAJCSAgICAgIEVTX1BSSU8oMykpOwogCi0JaWYgKHJkZXYtPmZhbWlseSA9PSBDSElQX0NFREFSKQorCXN3aXRjaCAocmRldi0+ZmFtaWx5KSB7CisJY2FzZSBDSElQX0NFREFSOgorCWNhc2UgQ0hJUF9QQUxNOgorCWNhc2UgQ0hJUF9DQUlDT1M6CiAJCS8qIG5vIHZlcnRleCBjYWNoZSAqLwogCQlzcV9jb25maWcgJj0gflZDX0VOQUJMRTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQogCiAJc3FfbGRzX3Jlc291cmNlX21nbXQgPSBSUkVHMzIoU1FfTERTX1JFU09VUkNFX01HTVQpOwogCkBAIC0xNzgzLDEwICsyMDE5LDE1IEBACiAJc3FfZ3ByX3Jlc291cmNlX21nbXRfMyA9IE5VTV9IU19HUFJTKChyZGV2LT5jb25maWcuZXZlcmdyZWVuLm1heF9ncHJzIC0gKDQgKiAyKSkgKiAzIC8gMzIpOwogCXNxX2dwcl9yZXNvdXJjZV9tZ210XzMgfD0gTlVNX0xTX0dQUlMoKHJkZXYtPmNvbmZpZy5ldmVyZ3JlZW4ubWF4X2dwcnMgLSAoNCAqIDIpKSAqIDMgLyAzMik7CiAKLQlpZiAocmRldi0+ZmFtaWx5ID09IENISVBfQ0VEQVIpCisJc3dpdGNoIChyZGV2LT5mYW1pbHkpIHsKKwljYXNlIENISVBfQ0VEQVI6CisJY2FzZSBDSElQX1BBTE06CiAJCXBzX3RocmVhZF9jb3VudCA9IDk2OwotCWVsc2UKKwkJYnJlYWs7CisJZGVmYXVsdDoKIAkJcHNfdGhyZWFkX2NvdW50ID0gMTI4OworCQlicmVhazsKKwl9CiAKIAlzcV90aHJlYWRfcmVzb3VyY2VfbWdtdCA9IE5VTV9QU19USFJFQURTKHBzX3RocmVhZF9jb3VudCk7CiAJc3FfdGhyZWFkX3Jlc291cmNlX21nbXQgfD0gTlVNX1ZTX1RIUkVBRFMoKCgocmRldi0+Y29uZmlnLmV2ZXJncmVlbi5tYXhfdGhyZWFkcyAtIHBzX3RocmVhZF9jb3VudCkgLyA2KSAvIDgpICogOCk7CkBAIC0xODE3LDEwICsyMDU4LDE2IEBACiAJV1JFRzMyKFBBX1NDX0ZPUkNFX0VPVl9NQVhfQ05UUywgKEZPUkNFX0VPVl9NQVhfQ0xLX0NOVCg0MDk1KSB8CiAJCQkJCSAgRk9SQ0VfRU9WX01BWF9SRVpfQ05UKDI1NSkpKTsKIAotCWlmIChyZGV2LT5mYW1pbHkgPT0gQ0hJUF9DRURBUikKKwlzd2l0Y2ggKHJkZXYtPmZhbWlseSkgeworCWNhc2UgQ0hJUF9DRURBUjoKKwljYXNlIENISVBfUEFMTToKKwljYXNlIENISVBfQ0FJQ09TOgogCQl2Z3RfY2FjaGVfaW52YWxpZGF0aW9uID0gQ0FDSEVfSU5WQUxJREFUSU9OKFRDX09OTFkpOwotCWVsc2UKKwkJYnJlYWs7CisJZGVmYXVsdDoKIAkJdmd0X2NhY2hlX2ludmFsaWRhdGlvbiA9IENBQ0hFX0lOVkFMSURBVElPTihWQ19BTkRfVEMpOworCQlicmVhazsKKwl9CiAJdmd0X2NhY2hlX2ludmFsaWRhdGlvbiB8PSBBVVRPX0lOVkxEX0VOKEVTX0FORF9HU19BVVRPKTsKIAlXUkVHMzIoVkdUX0NBQ0hFX0lOVkFMSURBVElPTiwgdmd0X2NhY2hlX2ludmFsaWRhdGlvbik7CiAKQEAgLTE5MDQsMTIgKzIxNTEsMTggQEAKIAlyZGV2LT5tYy5hcGVyX2Jhc2UgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocmRldi0+cGRldiwgMCk7CiAJcmRldi0+bWMuYXBlcl9zaXplID0gcGNpX3Jlc291cmNlX2xlbihyZGV2LT5wZGV2LCAwKTsKIAkvKiBTZXR1cCBHUFUgbWVtb3J5IHNwYWNlICovCi0JLyogc2l6ZSBpbiBNQiBvbiBldmVyZ3JlZW4gKi8KLQlyZGV2LT5tYy5tY192cmFtX3NpemUgPSBSUkVHMzIoQ09ORklHX01FTVNJWkUpICogMTAyNCAqIDEwMjQ7Ci0JcmRldi0+bWMucmVhbF92cmFtX3NpemUgPSBSUkVHMzIoQ09ORklHX01FTVNJWkUpICogMTAyNCAqIDEwMjQ7CisJaWYgKHJkZXYtPmZsYWdzICYgUkFERU9OX0lTX0lHUCkgeworCQkvKiBzaXplIGluIGJ5dGVzIG9uIGZ1c2lvbiAqLworCQlyZGV2LT5tYy5tY192cmFtX3NpemUgPSBSUkVHMzIoQ09ORklHX01FTVNJWkUpOworCQlyZGV2LT5tYy5yZWFsX3ZyYW1fc2l6ZSA9IFJSRUczMihDT05GSUdfTUVNU0laRSk7CisJfSBlbHNlIHsKKwkJLyogc2l6ZSBpbiBNQiBvbiBldmVyZ3JlZW4gKi8KKwkJcmRldi0+bWMubWNfdnJhbV9zaXplID0gUlJFRzMyKENPTkZJR19NRU1TSVpFKSAqIDEwMjQgKiAxMDI0OworCQlyZGV2LT5tYy5yZWFsX3ZyYW1fc2l6ZSA9IFJSRUczMihDT05GSUdfTUVNU0laRSkgKiAxMDI0ICogMTAyNDsKKwl9CiAJcmRldi0+bWMudmlzaWJsZV92cmFtX3NpemUgPSByZGV2LT5tYy5hcGVyX3NpemU7CiAJcmRldi0+bWMuYWN0aXZlX3ZyYW1fc2l6ZSA9IHJkZXYtPm1jLnZpc2libGVfdnJhbV9zaXplOwotCXI2MDBfdnJhbV9ndHRfbG9jYXRpb24ocmRldiwgJnJkZXYtPm1jKTsKKwlyNzAwX3ZyYW1fZ3R0X2xvY2F0aW9uKHJkZXYsICZyZGV2LT5tYyk7CiAJcmFkZW9uX3VwZGF0ZV9iYW5kd2lkdGhfaW5mbyhyZGV2KTsKIAogCXJldHVybiAwOwpAQCAtMTkxNyw4ICsyMTcwLDMwIEBACiAKIGJvb2wgZXZlcmdyZWVuX2dwdV9pc19sb2NrdXAoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCiB7Ci0JLyogRklYTUU6IGltcGxlbWVudCBmb3IgZXZlcmdyZWVuICovCi0JcmV0dXJuIGZhbHNlOworCXUzMiBzcmJtX3N0YXR1czsKKwl1MzIgZ3JibV9zdGF0dXM7CisJdTMyIGdyYm1fc3RhdHVzX3NlMCwgZ3JibV9zdGF0dXNfc2UxOworCXN0cnVjdCByMTAwX2dwdV9sb2NrdXAgKmxvY2t1cCA9ICZyZGV2LT5jb25maWcuZXZlcmdyZWVuLmxvY2t1cDsKKwlpbnQgcjsKKworCXNyYm1fc3RhdHVzID0gUlJFRzMyKFNSQk1fU1RBVFVTKTsKKwlncmJtX3N0YXR1cyA9IFJSRUczMihHUkJNX1NUQVRVUyk7CisJZ3JibV9zdGF0dXNfc2UwID0gUlJFRzMyKEdSQk1fU1RBVFVTX1NFMCk7CisJZ3JibV9zdGF0dXNfc2UxID0gUlJFRzMyKEdSQk1fU1RBVFVTX1NFMSk7CisJaWYgKCEoZ3JibV9zdGF0dXMgJiBHVUlfQUNUSVZFKSkgeworCQlyMTAwX2dwdV9sb2NrdXBfdXBkYXRlKGxvY2t1cCwgJnJkZXYtPmNwKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwkvKiBmb3JjZSBDUCBhY3Rpdml0aWVzICovCisJciA9IHJhZGVvbl9yaW5nX2xvY2socmRldiwgMik7CisJaWYgKCFyKSB7CisJCS8qIFBBQ0tFVDIgTk9QICovCisJCXJhZGVvbl9yaW5nX3dyaXRlKHJkZXYsIDB4ODAwMDAwMDApOworCQlyYWRlb25fcmluZ193cml0ZShyZGV2LCAweDgwMDAwMDAwKTsKKwkJcmFkZW9uX3JpbmdfdW5sb2NrX2NvbW1pdChyZGV2KTsKKwl9CisJcmRldi0+Y3AucnB0ciA9IFJSRUczMihDUF9SQl9SUFRSKTsKKwlyZXR1cm4gcjEwMF9ncHVfY3BfaXNfbG9ja3VwKHJkZXYsIGxvY2t1cCwgJnJkZXYtPmNwKTsKIH0KIAogc3RhdGljIGludCBldmVyZ3JlZW5fZ3B1X3NvZnRfcmVzZXQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCkBAIC0yMDExLDE3ICsyMjg2LDIxIEBACiAJV1JFRzMyKEdSQk1fSU5UX0NOVEwsIDApOwogCVdSRUczMihJTlRfTUFTSyArIEVWRVJHUkVFTl9DUlRDMF9SRUdJU1RFUl9PRkZTRVQsIDApOwogCVdSRUczMihJTlRfTUFTSyArIEVWRVJHUkVFTl9DUlRDMV9SRUdJU1RFUl9PRkZTRVQsIDApOwotCVdSRUczMihJTlRfTUFTSyArIEVWRVJHUkVFTl9DUlRDMl9SRUdJU1RFUl9PRkZTRVQsIDApOwotCVdSRUczMihJTlRfTUFTSyArIEVWRVJHUkVFTl9DUlRDM19SRUdJU1RFUl9PRkZTRVQsIDApOwotCVdSRUczMihJTlRfTUFTSyArIEVWRVJHUkVFTl9DUlRDNF9SRUdJU1RFUl9PRkZTRVQsIDApOwotCVdSRUczMihJTlRfTUFTSyArIEVWRVJHUkVFTl9DUlRDNV9SRUdJU1RFUl9PRkZTRVQsIDApOworCWlmICghKHJkZXYtPmZsYWdzICYgUkFERU9OX0lTX0lHUCkpIHsKKwkJV1JFRzMyKElOVF9NQVNLICsgRVZFUkdSRUVOX0NSVEMyX1JFR0lTVEVSX09GRlNFVCwgMCk7CisJCVdSRUczMihJTlRfTUFTSyArIEVWRVJHUkVFTl9DUlRDM19SRUdJU1RFUl9PRkZTRVQsIDApOworCQlXUkVHMzIoSU5UX01BU0sgKyBFVkVSR1JFRU5fQ1JUQzRfUkVHSVNURVJfT0ZGU0VULCAwKTsKKwkJV1JFRzMyKElOVF9NQVNLICsgRVZFUkdSRUVOX0NSVEM1X1JFR0lTVEVSX09GRlNFVCwgMCk7CisJfQogCiAJV1JFRzMyKEdSUEhfSU5UX0NPTlRST0wgKyBFVkVSR1JFRU5fQ1JUQzBfUkVHSVNURVJfT0ZGU0VULCAwKTsKIAlXUkVHMzIoR1JQSF9JTlRfQ09OVFJPTCArIEVWRVJHUkVFTl9DUlRDMV9SRUdJU1RFUl9PRkZTRVQsIDApOwotCVdSRUczMihHUlBIX0lOVF9DT05UUk9MICsgRVZFUkdSRUVOX0NSVEMyX1JFR0lTVEVSX09GRlNFVCwgMCk7Ci0JV1JFRzMyKEdSUEhfSU5UX0NPTlRST0wgKyBFVkVSR1JFRU5fQ1JUQzNfUkVHSVNURVJfT0ZGU0VULCAwKTsKLQlXUkVHMzIoR1JQSF9JTlRfQ09OVFJPTCArIEVWRVJHUkVFTl9DUlRDNF9SRUdJU1RFUl9PRkZTRVQsIDApOwotCVdSRUczMihHUlBIX0lOVF9DT05UUk9MICsgRVZFUkdSRUVOX0NSVEM1X1JFR0lTVEVSX09GRlNFVCwgMCk7CisJaWYgKCEocmRldi0+ZmxhZ3MgJiBSQURFT05fSVNfSUdQKSkgeworCQlXUkVHMzIoR1JQSF9JTlRfQ09OVFJPTCArIEVWRVJHUkVFTl9DUlRDMl9SRUdJU1RFUl9PRkZTRVQsIDApOworCQlXUkVHMzIoR1JQSF9JTlRfQ09OVFJPTCArIEVWRVJHUkVFTl9DUlRDM19SRUdJU1RFUl9PRkZTRVQsIDApOworCQlXUkVHMzIoR1JQSF9JTlRfQ09OVFJPTCArIEVWRVJHUkVFTl9DUlRDNF9SRUdJU1RFUl9PRkZTRVQsIDApOworCQlXUkVHMzIoR1JQSF9JTlRfQ09OVFJPTCArIEVWRVJHUkVFTl9DUlRDNV9SRUdJU1RFUl9PRkZTRVQsIDApOworCX0KIAogCVdSRUczMihEQUNBX0FVVE9ERVRFQ1RfSU5UX0NPTlRST0wsIDApOwogCVdSRUczMihEQUNCX0FVVE9ERVRFQ1RfSU5UX0NPTlRST0wsIDApOwpAQCAtMjA0Nyw2ICsyMzI2LDcgQEAKIAl1MzIgY3J0YzEgPSAwLCBjcnRjMiA9IDAsIGNydGMzID0gMCwgY3J0YzQgPSAwLCBjcnRjNSA9IDAsIGNydGM2ID0gMDsKIAl1MzIgaHBkMSwgaHBkMiwgaHBkMywgaHBkNCwgaHBkNSwgaHBkNjsKIAl1MzIgZ3JibV9pbnRfY250bCA9IDA7CisJdTMyIGdycGgxID0gMCwgZ3JwaDIgPSAwLCBncnBoMyA9IDAsIGdycGg0ID0gMCwgZ3JwaDUgPSAwLCBncnBoNiA9IDA7CiAKIAlpZiAoIXJkZXYtPmlycS5pbnN0YWxsZWQpIHsKIAkJV0FSTigxLCAiQ2FuJ3QgZW5hYmxlIElSUS9NU0kgYmVjYXVzZSBubyBoYW5kbGVyIGlzIGluc3RhbGxlZFxuIik7CkBAIC0yMDcyLDI3ICsyMzUyLDMzIEBACiAJCWNwX2ludF9jbnRsIHw9IFJCX0lOVF9FTkFCTEU7CiAJCWNwX2ludF9jbnRsIHw9IFRJTUVfU1RBTVBfSU5UX0VOQUJMRTsKIAl9Ci0JaWYgKHJkZXYtPmlycS5jcnRjX3ZibGFua19pbnRbMF0pIHsKKwlpZiAocmRldi0+aXJxLmNydGNfdmJsYW5rX2ludFswXSB8fAorCSAgICByZGV2LT5pcnEucGZsaXBbMF0pIHsKIAkJRFJNX0RFQlVHKCJldmVyZ3JlZW5faXJxX3NldDogdmJsYW5rIDBcbiIpOwogCQljcnRjMSB8PSBWQkxBTktfSU5UX01BU0s7CiAJfQotCWlmIChyZGV2LT5pcnEuY3J0Y192YmxhbmtfaW50WzFdKSB7CisJaWYgKHJkZXYtPmlycS5jcnRjX3ZibGFua19pbnRbMV0gfHwKKwkgICAgcmRldi0+aXJxLnBmbGlwWzFdKSB7CiAJCURSTV9ERUJVRygiZXZlcmdyZWVuX2lycV9zZXQ6IHZibGFuayAxXG4iKTsKIAkJY3J0YzIgfD0gVkJMQU5LX0lOVF9NQVNLOwogCX0KLQlpZiAocmRldi0+aXJxLmNydGNfdmJsYW5rX2ludFsyXSkgeworCWlmIChyZGV2LT5pcnEuY3J0Y192YmxhbmtfaW50WzJdIHx8CisJICAgIHJkZXYtPmlycS5wZmxpcFsyXSkgewogCQlEUk1fREVCVUcoImV2ZXJncmVlbl9pcnFfc2V0OiB2YmxhbmsgMlxuIik7CiAJCWNydGMzIHw9IFZCTEFOS19JTlRfTUFTSzsKIAl9Ci0JaWYgKHJkZXYtPmlycS5jcnRjX3ZibGFua19pbnRbM10pIHsKKwlpZiAocmRldi0+aXJxLmNydGNfdmJsYW5rX2ludFszXSB8fAorCSAgICByZGV2LT5pcnEucGZsaXBbM10pIHsKIAkJRFJNX0RFQlVHKCJldmVyZ3JlZW5faXJxX3NldDogdmJsYW5rIDNcbiIpOwogCQljcnRjNCB8PSBWQkxBTktfSU5UX01BU0s7CiAJfQotCWlmIChyZGV2LT5pcnEuY3J0Y192YmxhbmtfaW50WzRdKSB7CisJaWYgKHJkZXYtPmlycS5jcnRjX3ZibGFua19pbnRbNF0gfHwKKwkgICAgcmRldi0+aXJxLnBmbGlwWzRdKSB7CiAJCURSTV9ERUJVRygiZXZlcmdyZWVuX2lycV9zZXQ6IHZibGFuayA0XG4iKTsKIAkJY3J0YzUgfD0gVkJMQU5LX0lOVF9NQVNLOwogCX0KLQlpZiAocmRldi0+aXJxLmNydGNfdmJsYW5rX2ludFs1XSkgeworCWlmIChyZGV2LT5pcnEuY3J0Y192YmxhbmtfaW50WzVdIHx8CisJICAgIHJkZXYtPmlycS5wZmxpcFs1XSkgewogCQlEUk1fREVCVUcoImV2ZXJncmVlbl9pcnFfc2V0OiB2YmxhbmsgNVxuIik7CiAJCWNydGM2IHw9IFZCTEFOS19JTlRfTUFTSzsKIAl9CkBAIC0yMTMwLDEwICsyNDE2LDE5IEBACiAKIAlXUkVHMzIoSU5UX01BU0sgKyBFVkVSR1JFRU5fQ1JUQzBfUkVHSVNURVJfT0ZGU0VULCBjcnRjMSk7CiAJV1JFRzMyKElOVF9NQVNLICsgRVZFUkdSRUVOX0NSVEMxX1JFR0lTVEVSX09GRlNFVCwgY3J0YzIpOwotCVdSRUczMihJTlRfTUFTSyArIEVWRVJHUkVFTl9DUlRDMl9SRUdJU1RFUl9PRkZTRVQsIGNydGMzKTsKLQlXUkVHMzIoSU5UX01BU0sgKyBFVkVSR1JFRU5fQ1JUQzNfUkVHSVNURVJfT0ZGU0VULCBjcnRjNCk7Ci0JV1JFRzMyKElOVF9NQVNLICsgRVZFUkdSRUVOX0NSVEM0X1JFR0lTVEVSX09GRlNFVCwgY3J0YzUpOwotCVdSRUczMihJTlRfTUFTSyArIEVWRVJHUkVFTl9DUlRDNV9SRUdJU1RFUl9PRkZTRVQsIGNydGM2KTsKKwlpZiAoIShyZGV2LT5mbGFncyAmIFJBREVPTl9JU19JR1ApKSB7CisJCVdSRUczMihJTlRfTUFTSyArIEVWRVJHUkVFTl9DUlRDMl9SRUdJU1RFUl9PRkZTRVQsIGNydGMzKTsKKwkJV1JFRzMyKElOVF9NQVNLICsgRVZFUkdSRUVOX0NSVEMzX1JFR0lTVEVSX09GRlNFVCwgY3J0YzQpOworCQlXUkVHMzIoSU5UX01BU0sgKyBFVkVSR1JFRU5fQ1JUQzRfUkVHSVNURVJfT0ZGU0VULCBjcnRjNSk7CisJCVdSRUczMihJTlRfTUFTSyArIEVWRVJHUkVFTl9DUlRDNV9SRUdJU1RFUl9PRkZTRVQsIGNydGM2KTsKKwl9CisKKwlXUkVHMzIoR1JQSF9JTlRfQ09OVFJPTCArIEVWRVJHUkVFTl9DUlRDMF9SRUdJU1RFUl9PRkZTRVQsIGdycGgxKTsKKwlXUkVHMzIoR1JQSF9JTlRfQ09OVFJPTCArIEVWRVJHUkVFTl9DUlRDMV9SRUdJU1RFUl9PRkZTRVQsIGdycGgyKTsKKwlXUkVHMzIoR1JQSF9JTlRfQ09OVFJPTCArIEVWRVJHUkVFTl9DUlRDMl9SRUdJU1RFUl9PRkZTRVQsIGdycGgzKTsKKwlXUkVHMzIoR1JQSF9JTlRfQ09OVFJPTCArIEVWRVJHUkVFTl9DUlRDM19SRUdJU1RFUl9PRkZTRVQsIGdycGg0KTsKKwlXUkVHMzIoR1JQSF9JTlRfQ09OVFJPTCArIEVWRVJHUkVFTl9DUlRDNF9SRUdJU1RFUl9PRkZTRVQsIGdycGg1KTsKKwlXUkVHMzIoR1JQSF9JTlRfQ09OVFJPTCArIEVWRVJHUkVFTl9DUlRDNV9SRUdJU1RFUl9PRkZTRVQsIGdycGg2KTsKIAogCVdSRUczMihEQ19IUEQxX0lOVF9DT05UUk9MLCBocGQxKTsKIAlXUkVHMzIoRENfSFBEMl9JTlRfQ09OVFJPTCwgaHBkMik7CkBAIC0yMTQ1LDc5ICsyNDQwLDkyIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBldmVyZ3JlZW5faXJxX2FjayhzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwKLQkJCQkgICAgIHUzMiAqZGlzcF9pbnQsCi0JCQkJICAgICB1MzIgKmRpc3BfaW50X2NvbnQsCi0JCQkJICAgICB1MzIgKmRpc3BfaW50X2NvbnQyLAotCQkJCSAgICAgdTMyICpkaXNwX2ludF9jb250MywKLQkJCQkgICAgIHUzMiAqZGlzcF9pbnRfY29udDQsCi0JCQkJICAgICB1MzIgKmRpc3BfaW50X2NvbnQ1KQorc3RhdGljIGlubGluZSB2b2lkIGV2ZXJncmVlbl9pcnFfYWNrKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQogewogCXUzMiB0bXA7CiAKLQkqZGlzcF9pbnQgPSBSUkVHMzIoRElTUF9JTlRFUlJVUFRfU1RBVFVTKTsKLQkqZGlzcF9pbnRfY29udCA9IFJSRUczMihESVNQX0lOVEVSUlVQVF9TVEFUVVNfQ09OVElOVUUpOwotCSpkaXNwX2ludF9jb250MiA9IFJSRUczMihESVNQX0lOVEVSUlVQVF9TVEFUVVNfQ09OVElOVUUyKTsKLQkqZGlzcF9pbnRfY29udDMgPSBSUkVHMzIoRElTUF9JTlRFUlJVUFRfU1RBVFVTX0NPTlRJTlVFMyk7Ci0JKmRpc3BfaW50X2NvbnQ0ID0gUlJFRzMyKERJU1BfSU5URVJSVVBUX1NUQVRVU19DT05USU5VRTQpOwotCSpkaXNwX2ludF9jb250NSA9IFJSRUczMihESVNQX0lOVEVSUlVQVF9TVEFUVVNfQ09OVElOVUU1KTsKKwlyZGV2LT5pcnEuc3RhdF9yZWdzLmV2ZXJncmVlbi5kaXNwX2ludCA9IFJSRUczMihESVNQX0lOVEVSUlVQVF9TVEFUVVMpOworCXJkZXYtPmlycS5zdGF0X3JlZ3MuZXZlcmdyZWVuLmRpc3BfaW50X2NvbnQgPSBSUkVHMzIoRElTUF9JTlRFUlJVUFRfU1RBVFVTX0NPTlRJTlVFKTsKKwlyZGV2LT5pcnEuc3RhdF9yZWdzLmV2ZXJncmVlbi5kaXNwX2ludF9jb250MiA9IFJSRUczMihESVNQX0lOVEVSUlVQVF9TVEFUVVNfQ09OVElOVUUyKTsKKwlyZGV2LT5pcnEuc3RhdF9yZWdzLmV2ZXJncmVlbi5kaXNwX2ludF9jb250MyA9IFJSRUczMihESVNQX0lOVEVSUlVQVF9TVEFUVVNfQ09OVElOVUUzKTsKKwlyZGV2LT5pcnEuc3RhdF9yZWdzLmV2ZXJncmVlbi5kaXNwX2ludF9jb250NCA9IFJSRUczMihESVNQX0lOVEVSUlVQVF9TVEFUVVNfQ09OVElOVUU0KTsKKwlyZGV2LT5pcnEuc3RhdF9yZWdzLmV2ZXJncmVlbi5kaXNwX2ludF9jb250NSA9IFJSRUczMihESVNQX0lOVEVSUlVQVF9TVEFUVVNfQ09OVElOVUU1KTsKKwlyZGV2LT5pcnEuc3RhdF9yZWdzLmV2ZXJncmVlbi5kMWdycGhfaW50ID0gUlJFRzMyKEdSUEhfSU5UX1NUQVRVUyArIEVWRVJHUkVFTl9DUlRDMF9SRUdJU1RFUl9PRkZTRVQpOworCXJkZXYtPmlycS5zdGF0X3JlZ3MuZXZlcmdyZWVuLmQyZ3JwaF9pbnQgPSBSUkVHMzIoR1JQSF9JTlRfU1RBVFVTICsgRVZFUkdSRUVOX0NSVEMxX1JFR0lTVEVSX09GRlNFVCk7CisJcmRldi0+aXJxLnN0YXRfcmVncy5ldmVyZ3JlZW4uZDNncnBoX2ludCA9IFJSRUczMihHUlBIX0lOVF9TVEFUVVMgKyBFVkVSR1JFRU5fQ1JUQzJfUkVHSVNURVJfT0ZGU0VUKTsKKwlyZGV2LT5pcnEuc3RhdF9yZWdzLmV2ZXJncmVlbi5kNGdycGhfaW50ID0gUlJFRzMyKEdSUEhfSU5UX1NUQVRVUyArIEVWRVJHUkVFTl9DUlRDM19SRUdJU1RFUl9PRkZTRVQpOworCXJkZXYtPmlycS5zdGF0X3JlZ3MuZXZlcmdyZWVuLmQ1Z3JwaF9pbnQgPSBSUkVHMzIoR1JQSF9JTlRfU1RBVFVTICsgRVZFUkdSRUVOX0NSVEM0X1JFR0lTVEVSX09GRlNFVCk7CisJcmRldi0+aXJxLnN0YXRfcmVncy5ldmVyZ3JlZW4uZDZncnBoX2ludCA9IFJSRUczMihHUlBIX0lOVF9TVEFUVVMgKyBFVkVSR1JFRU5fQ1JUQzVfUkVHSVNURVJfT0ZGU0VUKTsKIAotCWlmICgqZGlzcF9pbnQgJiBMQl9EMV9WQkxBTktfSU5URVJSVVBUKQorCWlmIChyZGV2LT5pcnEuc3RhdF9yZWdzLmV2ZXJncmVlbi5kMWdycGhfaW50ICYgR1JQSF9QRkxJUF9JTlRfT0NDVVJSRUQpCisJCVdSRUczMihHUlBIX0lOVF9TVEFUVVMgKyBFVkVSR1JFRU5fQ1JUQzBfUkVHSVNURVJfT0ZGU0VULCBHUlBIX1BGTElQX0lOVF9DTEVBUik7CisJaWYgKHJkZXYtPmlycS5zdGF0X3JlZ3MuZXZlcmdyZWVuLmQyZ3JwaF9pbnQgJiBHUlBIX1BGTElQX0lOVF9PQ0NVUlJFRCkKKwkJV1JFRzMyKEdSUEhfSU5UX1NUQVRVUyArIEVWRVJHUkVFTl9DUlRDMV9SRUdJU1RFUl9PRkZTRVQsIEdSUEhfUEZMSVBfSU5UX0NMRUFSKTsKKwlpZiAocmRldi0+aXJxLnN0YXRfcmVncy5ldmVyZ3JlZW4uZDNncnBoX2ludCAmIEdSUEhfUEZMSVBfSU5UX09DQ1VSUkVEKQorCQlXUkVHMzIoR1JQSF9JTlRfU1RBVFVTICsgRVZFUkdSRUVOX0NSVEMyX1JFR0lTVEVSX09GRlNFVCwgR1JQSF9QRkxJUF9JTlRfQ0xFQVIpOworCWlmIChyZGV2LT5pcnEuc3RhdF9yZWdzLmV2ZXJncmVlbi5kNGdycGhfaW50ICYgR1JQSF9QRkxJUF9JTlRfT0NDVVJSRUQpCisJCVdSRUczMihHUlBIX0lOVF9TVEFUVVMgKyBFVkVSR1JFRU5fQ1JUQzNfUkVHSVNURVJfT0ZGU0VULCBHUlBIX1BGTElQX0lOVF9DTEVBUik7CisJaWYgKHJkZXYtPmlycS5zdGF0X3JlZ3MuZXZlcmdyZWVuLmQ1Z3JwaF9pbnQgJiBHUlBIX1BGTElQX0lOVF9PQ0NVUlJFRCkKKwkJV1JFRzMyKEdSUEhfSU5UX1NUQVRVUyArIEVWRVJHUkVFTl9DUlRDNF9SRUdJU1RFUl9PRkZTRVQsIEdSUEhfUEZMSVBfSU5UX0NMRUFSKTsKKwlpZiAocmRldi0+aXJxLnN0YXRfcmVncy5ldmVyZ3JlZW4uZDZncnBoX2ludCAmIEdSUEhfUEZMSVBfSU5UX09DQ1VSUkVEKQorCQlXUkVHMzIoR1JQSF9JTlRfU1RBVFVTICsgRVZFUkdSRUVOX0NSVEM1X1JFR0lTVEVSX09GRlNFVCwgR1JQSF9QRkxJUF9JTlRfQ0xFQVIpOworCisJaWYgKHJkZXYtPmlycS5zdGF0X3JlZ3MuZXZlcmdyZWVuLmRpc3BfaW50ICYgTEJfRDFfVkJMQU5LX0lOVEVSUlVQVCkKIAkJV1JFRzMyKFZCTEFOS19TVEFUVVMgKyBFVkVSR1JFRU5fQ1JUQzBfUkVHSVNURVJfT0ZGU0VULCBWQkxBTktfQUNLKTsKLQlpZiAoKmRpc3BfaW50ICYgTEJfRDFfVkxJTkVfSU5URVJSVVBUKQorCWlmIChyZGV2LT5pcnEuc3RhdF9yZWdzLmV2ZXJncmVlbi5kaXNwX2ludCAmIExCX0QxX1ZMSU5FX0lOVEVSUlVQVCkKIAkJV1JFRzMyKFZMSU5FX1NUQVRVUyArIEVWRVJHUkVFTl9DUlRDMF9SRUdJU1RFUl9PRkZTRVQsIFZMSU5FX0FDSyk7CiAKLQlpZiAoKmRpc3BfaW50X2NvbnQgJiBMQl9EMl9WQkxBTktfSU5URVJSVVBUKQorCWlmIChyZGV2LT5pcnEuc3RhdF9yZWdzLmV2ZXJncmVlbi5kaXNwX2ludF9jb250ICYgTEJfRDJfVkJMQU5LX0lOVEVSUlVQVCkKIAkJV1JFRzMyKFZCTEFOS19TVEFUVVMgKyBFVkVSR1JFRU5fQ1JUQzFfUkVHSVNURVJfT0ZGU0VULCBWQkxBTktfQUNLKTsKLQlpZiAoKmRpc3BfaW50X2NvbnQgJiBMQl9EMl9WTElORV9JTlRFUlJVUFQpCisJaWYgKHJkZXYtPmlycS5zdGF0X3JlZ3MuZXZlcmdyZWVuLmRpc3BfaW50X2NvbnQgJiBMQl9EMl9WTElORV9JTlRFUlJVUFQpCiAJCVdSRUczMihWTElORV9TVEFUVVMgKyBFVkVSR1JFRU5fQ1JUQzFfUkVHSVNURVJfT0ZGU0VULCBWTElORV9BQ0spOwogCi0JaWYgKCpkaXNwX2ludF9jb250MiAmIExCX0QzX1ZCTEFOS19JTlRFUlJVUFQpCisJaWYgKHJkZXYtPmlycS5zdGF0X3JlZ3MuZXZlcmdyZWVuLmRpc3BfaW50X2NvbnQyICYgTEJfRDNfVkJMQU5LX0lOVEVSUlVQVCkKIAkJV1JFRzMyKFZCTEFOS19TVEFUVVMgKyBFVkVSR1JFRU5fQ1JUQzJfUkVHSVNURVJfT0ZGU0VULCBWQkxBTktfQUNLKTsKLQlpZiAoKmRpc3BfaW50X2NvbnQyICYgTEJfRDNfVkxJTkVfSU5URVJSVVBUKQorCWlmIChyZGV2LT5pcnEuc3RhdF9yZWdzLmV2ZXJncmVlbi5kaXNwX2ludF9jb250MiAmIExCX0QzX1ZMSU5FX0lOVEVSUlVQVCkKIAkJV1JFRzMyKFZMSU5FX1NUQVRVUyArIEVWRVJHUkVFTl9DUlRDMl9SRUdJU1RFUl9PRkZTRVQsIFZMSU5FX0FDSyk7CiAKLQlpZiAoKmRpc3BfaW50X2NvbnQzICYgTEJfRDRfVkJMQU5LX0lOVEVSUlVQVCkKKwlpZiAocmRldi0+aXJxLnN0YXRfcmVncy5ldmVyZ3JlZW4uZGlzcF9pbnRfY29udDMgJiBMQl9ENF9WQkxBTktfSU5URVJSVVBUKQogCQlXUkVHMzIoVkJMQU5LX1NUQVRVUyArIEVWRVJHUkVFTl9DUlRDM19SRUdJU1RFUl9PRkZTRVQsIFZCTEFOS19BQ0spOwotCWlmICgqZGlzcF9pbnRfY29udDMgJiBMQl9ENF9WTElORV9JTlRFUlJVUFQpCisJaWYgKHJkZXYtPmlycS5zdGF0X3JlZ3MuZXZlcmdyZWVuLmRpc3BfaW50X2NvbnQzICYgTEJfRDRfVkxJTkVfSU5URVJSVVBUKQogCQlXUkVHMzIoVkxJTkVfU1RBVFVTICsgRVZFUkdSRUVOX0NSVEMzX1JFR0lTVEVSX09GRlNFVCwgVkxJTkVfQUNLKTsKIAotCWlmICgqZGlzcF9pbnRfY29udDQgJiBMQl9ENV9WQkxBTktfSU5URVJSVVBUKQorCWlmIChyZGV2LT5pcnEuc3RhdF9yZWdzLmV2ZXJncmVlbi5kaXNwX2ludF9jb250NCAmIExCX0Q1X1ZCTEFOS19JTlRFUlJVUFQpCiAJCVdSRUczMihWQkxBTktfU1RBVFVTICsgRVZFUkdSRUVOX0NSVEM0X1JFR0lTVEVSX09GRlNFVCwgVkJMQU5LX0FDSyk7Ci0JaWYgKCpkaXNwX2ludF9jb250NCAmIExCX0Q1X1ZMSU5FX0lOVEVSUlVQVCkKKwlpZiAocmRldi0+aXJxLnN0YXRfcmVncy5ldmVyZ3JlZW4uZGlzcF9pbnRfY29udDQgJiBMQl9ENV9WTElORV9JTlRFUlJVUFQpCiAJCVdSRUczMihWTElORV9TVEFUVVMgKyBFVkVSR1JFRU5fQ1JUQzRfUkVHSVNURVJfT0ZGU0VULCBWTElORV9BQ0spOwogCi0JaWYgKCpkaXNwX2ludF9jb250NSAmIExCX0Q2X1ZCTEFOS19JTlRFUlJVUFQpCisJaWYgKHJkZXYtPmlycS5zdGF0X3JlZ3MuZXZlcmdyZWVuLmRpc3BfaW50X2NvbnQ1ICYgTEJfRDZfVkJMQU5LX0lOVEVSUlVQVCkKIAkJV1JFRzMyKFZCTEFOS19TVEFUVVMgKyBFVkVSR1JFRU5fQ1JUQzVfUkVHSVNURVJfT0ZGU0VULCBWQkxBTktfQUNLKTsKLQlpZiAoKmRpc3BfaW50X2NvbnQ1ICYgTEJfRDZfVkxJTkVfSU5URVJSVVBUKQorCWlmIChyZGV2LT5pcnEuc3RhdF9yZWdzLmV2ZXJncmVlbi5kaXNwX2ludF9jb250NSAmIExCX0Q2X1ZMSU5FX0lOVEVSUlVQVCkKIAkJV1JFRzMyKFZMSU5FX1NUQVRVUyArIEVWRVJHUkVFTl9DUlRDNV9SRUdJU1RFUl9PRkZTRVQsIFZMSU5FX0FDSyk7CiAKLQlpZiAoKmRpc3BfaW50ICYgRENfSFBEMV9JTlRFUlJVUFQpIHsKKwlpZiAocmRldi0+aXJxLnN0YXRfcmVncy5ldmVyZ3JlZW4uZGlzcF9pbnQgJiBEQ19IUEQxX0lOVEVSUlVQVCkgewogCQl0bXAgPSBSUkVHMzIoRENfSFBEMV9JTlRfQ09OVFJPTCk7CiAJCXRtcCB8PSBEQ19IUER4X0lOVF9BQ0s7CiAJCVdSRUczMihEQ19IUEQxX0lOVF9DT05UUk9MLCB0bXApOwogCX0KLQlpZiAoKmRpc3BfaW50X2NvbnQgJiBEQ19IUEQyX0lOVEVSUlVQVCkgeworCWlmIChyZGV2LT5pcnEuc3RhdF9yZWdzLmV2ZXJncmVlbi5kaXNwX2ludF9jb250ICYgRENfSFBEMl9JTlRFUlJVUFQpIHsKIAkJdG1wID0gUlJFRzMyKERDX0hQRDJfSU5UX0NPTlRST0wpOwogCQl0bXAgfD0gRENfSFBEeF9JTlRfQUNLOwogCQlXUkVHMzIoRENfSFBEMl9JTlRfQ09OVFJPTCwgdG1wKTsKIAl9Ci0JaWYgKCpkaXNwX2ludF9jb250MiAmIERDX0hQRDNfSU5URVJSVVBUKSB7CisJaWYgKHJkZXYtPmlycS5zdGF0X3JlZ3MuZXZlcmdyZWVuLmRpc3BfaW50X2NvbnQyICYgRENfSFBEM19JTlRFUlJVUFQpIHsKIAkJdG1wID0gUlJFRzMyKERDX0hQRDNfSU5UX0NPTlRST0wpOwogCQl0bXAgfD0gRENfSFBEeF9JTlRfQUNLOwogCQlXUkVHMzIoRENfSFBEM19JTlRfQ09OVFJPTCwgdG1wKTsKIAl9Ci0JaWYgKCpkaXNwX2ludF9jb250MyAmIERDX0hQRDRfSU5URVJSVVBUKSB7CisJaWYgKHJkZXYtPmlycS5zdGF0X3JlZ3MuZXZlcmdyZWVuLmRpc3BfaW50X2NvbnQzICYgRENfSFBENF9JTlRFUlJVUFQpIHsKIAkJdG1wID0gUlJFRzMyKERDX0hQRDRfSU5UX0NPTlRST0wpOwogCQl0bXAgfD0gRENfSFBEeF9JTlRfQUNLOwogCQlXUkVHMzIoRENfSFBENF9JTlRfQ09OVFJPTCwgdG1wKTsKIAl9Ci0JaWYgKCpkaXNwX2ludF9jb250NCAmIERDX0hQRDVfSU5URVJSVVBUKSB7CisJaWYgKHJkZXYtPmlycS5zdGF0X3JlZ3MuZXZlcmdyZWVuLmRpc3BfaW50X2NvbnQ0ICYgRENfSFBENV9JTlRFUlJVUFQpIHsKIAkJdG1wID0gUlJFRzMyKERDX0hQRDVfSU5UX0NPTlRST0wpOwogCQl0bXAgfD0gRENfSFBEeF9JTlRfQUNLOwogCQlXUkVHMzIoRENfSFBENV9JTlRfQ09OVFJPTCwgdG1wKTsKIAl9Ci0JaWYgKCpkaXNwX2ludF9jb250NSAmIERDX0hQRDZfSU5URVJSVVBUKSB7CisJaWYgKHJkZXYtPmlycS5zdGF0X3JlZ3MuZXZlcmdyZWVuLmRpc3BfaW50X2NvbnQ1ICYgRENfSFBENl9JTlRFUlJVUFQpIHsKIAkJdG1wID0gUlJFRzMyKERDX0hQRDVfSU5UX0NPTlRST0wpOwogCQl0bXAgfD0gRENfSFBEeF9JTlRfQUNLOwogCQlXUkVHMzIoRENfSFBENl9JTlRfQ09OVFJPTCwgdG1wKTsKQEAgLTIyMjYsMTQgKzI1MzQsMTAgQEAKIAogdm9pZCBldmVyZ3JlZW5faXJxX2Rpc2FibGUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCiB7Ci0JdTMyIGRpc3BfaW50LCBkaXNwX2ludF9jb250LCBkaXNwX2ludF9jb250MjsKLQl1MzIgZGlzcF9pbnRfY29udDMsIGRpc3BfaW50X2NvbnQ0LCBkaXNwX2ludF9jb250NTsKLQogCXI2MDBfZGlzYWJsZV9pbnRlcnJ1cHRzKHJkZXYpOwogCS8qIFdhaXQgYW5kIGFja25vd2xlZGdlIGlycSAqLwogCW1kZWxheSgxKTsKLQlldmVyZ3JlZW5faXJxX2FjayhyZGV2LCAmZGlzcF9pbnQsICZkaXNwX2ludF9jb250LCAmZGlzcF9pbnRfY29udDIsCi0JCQkgICZkaXNwX2ludF9jb250MywgJmRpc3BfaW50X2NvbnQ0LCAmZGlzcF9pbnRfY29udDUpOworCWV2ZXJncmVlbl9pcnFfYWNrKHJkZXYpOwogCWV2ZXJncmVlbl9kaXNhYmxlX2ludGVycnVwdF9zdGF0ZShyZGV2KTsKIH0KIApAQCAtMjI3Myw4ICsyNTc3LDYgQEAKIAl1MzIgcnB0ciA9IHJkZXYtPmloLnJwdHI7CiAJdTMyIHNyY19pZCwgc3JjX2RhdGE7CiAJdTMyIHJpbmdfaW5kZXg7Ci0JdTMyIGRpc3BfaW50LCBkaXNwX2ludF9jb250LCBkaXNwX2ludF9jb250MjsKLQl1MzIgZGlzcF9pbnRfY29udDMsIGRpc3BfaW50X2NvbnQ0LCBkaXNwX2ludF9jb250NTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWJvb2wgcXVldWVfaG90cGx1ZyA9IGZhbHNlOwogCkBAIC0yMjk1LDggKzI1OTcsNyBAQAogCiByZXN0YXJ0X2loOgogCS8qIGRpc3BsYXkgaW50ZXJydXB0cyAqLwotCWV2ZXJncmVlbl9pcnFfYWNrKHJkZXYsICZkaXNwX2ludCwgJmRpc3BfaW50X2NvbnQsICZkaXNwX2ludF9jb250MiwKLQkJCSAgJmRpc3BfaW50X2NvbnQzLCAmZGlzcF9pbnRfY29udDQsICZkaXNwX2ludF9jb250NSk7CisJZXZlcmdyZWVuX2lycV9hY2socmRldik7CiAKIAlyZGV2LT5paC53cHRyID0gd3B0cjsKIAl3aGlsZSAocnB0ciAhPSB3cHRyKSB7CkBAIC0yMzA5LDE3ICsyNjEwLDIxIEBACiAJCWNhc2UgMTogLyogRDEgdmJsYW5rL3ZsaW5lICovCiAJCQlzd2l0Y2ggKHNyY19kYXRhKSB7CiAJCQljYXNlIDA6IC8qIEQxIHZibGFuayAqLwotCQkJCWlmIChkaXNwX2ludCAmIExCX0QxX1ZCTEFOS19JTlRFUlJVUFQpIHsKLQkJCQkJZHJtX2hhbmRsZV92YmxhbmsocmRldi0+ZGRldiwgMCk7Ci0JCQkJCXJkZXYtPnBtLnZibGFua19zeW5jID0gdHJ1ZTsKLQkJCQkJd2FrZV91cCgmcmRldi0+aXJxLnZibGFua19xdWV1ZSk7Ci0JCQkJCWRpc3BfaW50ICY9IH5MQl9EMV9WQkxBTktfSU5URVJSVVBUOworCQkJCWlmIChyZGV2LT5pcnEuc3RhdF9yZWdzLmV2ZXJncmVlbi5kaXNwX2ludCAmIExCX0QxX1ZCTEFOS19JTlRFUlJVUFQpIHsKKwkJCQkJaWYgKHJkZXYtPmlycS5jcnRjX3ZibGFua19pbnRbMF0pIHsKKwkJCQkJCWRybV9oYW5kbGVfdmJsYW5rKHJkZXYtPmRkZXYsIDApOworCQkJCQkJcmRldi0+cG0udmJsYW5rX3N5bmMgPSB0cnVlOworCQkJCQkJd2FrZV91cCgmcmRldi0+aXJxLnZibGFua19xdWV1ZSk7CisJCQkJCX0KKwkJCQkJaWYgKHJkZXYtPmlycS5wZmxpcFswXSkKKwkJCQkJCXJhZGVvbl9jcnRjX2hhbmRsZV9mbGlwKHJkZXYsIDApOworCQkJCQlyZGV2LT5pcnEuc3RhdF9yZWdzLmV2ZXJncmVlbi5kaXNwX2ludCAmPSB+TEJfRDFfVkJMQU5LX0lOVEVSUlVQVDsKIAkJCQkJRFJNX0RFQlVHKCJJSDogRDEgdmJsYW5rXG4iKTsKIAkJCQl9CiAJCQkJYnJlYWs7CiAJCQljYXNlIDE6IC8qIEQxIHZsaW5lICovCi0JCQkJaWYgKGRpc3BfaW50ICYgTEJfRDFfVkxJTkVfSU5URVJSVVBUKSB7Ci0JCQkJCWRpc3BfaW50ICY9IH5MQl9EMV9WTElORV9JTlRFUlJVUFQ7CisJCQkJaWYgKHJkZXYtPmlycS5zdGF0X3JlZ3MuZXZlcmdyZWVuLmRpc3BfaW50ICYgTEJfRDFfVkxJTkVfSU5URVJSVVBUKSB7CisJCQkJCXJkZXYtPmlycS5zdGF0X3JlZ3MuZXZlcmdyZWVuLmRpc3BfaW50ICY9IH5MQl9EMV9WTElORV9JTlRFUlJVUFQ7CiAJCQkJCURSTV9ERUJVRygiSUg6IEQxIHZsaW5lXG4iKTsKIAkJCQl9CiAJCQkJYnJlYWs7CkBAIC0yMzMxLDE3ICsyNjM2LDIxIEBACiAJCWNhc2UgMjogLyogRDIgdmJsYW5rL3ZsaW5lICovCiAJCQlzd2l0Y2ggKHNyY19kYXRhKSB7CiAJCQljYXNlIDA6IC8qIEQyIHZibGFuayAqLwotCQkJCWlmIChkaXNwX2ludF9jb250ICYgTEJfRDJfVkJMQU5LX0lOVEVSUlVQVCkgewotCQkJCQlkcm1faGFuZGxlX3ZibGFuayhyZGV2LT5kZGV2LCAxKTsKLQkJCQkJcmRldi0+cG0udmJsYW5rX3N5bmMgPSB0cnVlOwotCQkJCQl3YWtlX3VwKCZyZGV2LT5pcnEudmJsYW5rX3F1ZXVlKTsKLQkJCQkJZGlzcF9pbnRfY29udCAmPSB+TEJfRDJfVkJMQU5LX0lOVEVSUlVQVDsKKwkJCQlpZiAocmRldi0+aXJxLnN0YXRfcmVncy5ldmVyZ3JlZW4uZGlzcF9pbnRfY29udCAmIExCX0QyX1ZCTEFOS19JTlRFUlJVUFQpIHsKKwkJCQkJaWYgKHJkZXYtPmlycS5jcnRjX3ZibGFua19pbnRbMV0pIHsKKwkJCQkJCWRybV9oYW5kbGVfdmJsYW5rKHJkZXYtPmRkZXYsIDEpOworCQkJCQkJcmRldi0+cG0udmJsYW5rX3N5bmMgPSB0cnVlOworCQkJCQkJd2FrZV91cCgmcmRldi0+aXJxLnZibGFua19xdWV1ZSk7CisJCQkJCX0KKwkJCQkJaWYgKHJkZXYtPmlycS5wZmxpcFsxXSkKKwkJCQkJCXJhZGVvbl9jcnRjX2hhbmRsZV9mbGlwKHJkZXYsIDEpOworCQkJCQlyZGV2LT5pcnEuc3RhdF9yZWdzLmV2ZXJncmVlbi5kaXNwX2ludF9jb250ICY9IH5MQl9EMl9WQkxBTktfSU5URVJSVVBUOwogCQkJCQlEUk1fREVCVUcoIklIOiBEMiB2YmxhbmtcbiIpOwogCQkJCX0KIAkJCQlicmVhazsKIAkJCWNhc2UgMTogLyogRDIgdmxpbmUgKi8KLQkJCQlpZiAoZGlzcF9pbnRfY29udCAmIExCX0QyX1ZMSU5FX0lOVEVSUlVQVCkgewotCQkJCQlkaXNwX2ludF9jb250ICY9IH5MQl9EMl9WTElORV9JTlRFUlJVUFQ7CisJCQkJaWYgKHJkZXYtPmlycS5zdGF0X3JlZ3MuZXZlcmdyZWVuLmRpc3BfaW50X2NvbnQgJiBMQl9EMl9WTElORV9JTlRFUlJVUFQpIHsKKwkJCQkJcmRldi0+aXJxLnN0YXRfcmVncy5ldmVyZ3JlZW4uZGlzcF9pbnRfY29udCAmPSB+TEJfRDJfVkxJTkVfSU5URVJSVVBUOwogCQkJCQlEUk1fREVCVUcoIklIOiBEMiB2bGluZVxuIik7CiAJCQkJfQogCQkJCWJyZWFrOwpAQCAtMjM1MywxNyArMjY2MiwyMSBAQAogCQljYXNlIDM6IC8qIEQzIHZibGFuay92bGluZSAqLwogCQkJc3dpdGNoIChzcmNfZGF0YSkgewogCQkJY2FzZSAwOiAvKiBEMyB2YmxhbmsgKi8KLQkJCQlpZiAoZGlzcF9pbnRfY29udDIgJiBMQl9EM19WQkxBTktfSU5URVJSVVBUKSB7Ci0JCQkJCWRybV9oYW5kbGVfdmJsYW5rKHJkZXYtPmRkZXYsIDIpOwotCQkJCQlyZGV2LT5wbS52Ymxhbmtfc3luYyA9IHRydWU7Ci0JCQkJCXdha2VfdXAoJnJkZXYtPmlycS52YmxhbmtfcXVldWUpOwotCQkJCQlkaXNwX2ludF9jb250MiAmPSB+TEJfRDNfVkJMQU5LX0lOVEVSUlVQVDsKKwkJCQlpZiAocmRldi0+aXJxLnN0YXRfcmVncy5ldmVyZ3JlZW4uZGlzcF9pbnRfY29udDIgJiBMQl9EM19WQkxBTktfSU5URVJSVVBUKSB7CisJCQkJCWlmIChyZGV2LT5pcnEuY3J0Y192YmxhbmtfaW50WzJdKSB7CisJCQkJCQlkcm1faGFuZGxlX3ZibGFuayhyZGV2LT5kZGV2LCAyKTsKKwkJCQkJCXJkZXYtPnBtLnZibGFua19zeW5jID0gdHJ1ZTsKKwkJCQkJCXdha2VfdXAoJnJkZXYtPmlycS52YmxhbmtfcXVldWUpOworCQkJCQl9CisJCQkJCWlmIChyZGV2LT5pcnEucGZsaXBbMl0pCisJCQkJCQlyYWRlb25fY3J0Y19oYW5kbGVfZmxpcChyZGV2LCAyKTsKKwkJCQkJcmRldi0+aXJxLnN0YXRfcmVncy5ldmVyZ3JlZW4uZGlzcF9pbnRfY29udDIgJj0gfkxCX0QzX1ZCTEFOS19JTlRFUlJVUFQ7CiAJCQkJCURSTV9ERUJVRygiSUg6IEQzIHZibGFua1xuIik7CiAJCQkJfQogCQkJCWJyZWFrOwogCQkJY2FzZSAxOiAvKiBEMyB2bGluZSAqLwotCQkJCWlmIChkaXNwX2ludF9jb250MiAmIExCX0QzX1ZMSU5FX0lOVEVSUlVQVCkgewotCQkJCQlkaXNwX2ludF9jb250MiAmPSB+TEJfRDNfVkxJTkVfSU5URVJSVVBUOworCQkJCWlmIChyZGV2LT5pcnEuc3RhdF9yZWdzLmV2ZXJncmVlbi5kaXNwX2ludF9jb250MiAmIExCX0QzX1ZMSU5FX0lOVEVSUlVQVCkgeworCQkJCQlyZGV2LT5pcnEuc3RhdF9yZWdzLmV2ZXJncmVlbi5kaXNwX2ludF9jb250MiAmPSB+TEJfRDNfVkxJTkVfSU5URVJSVVBUOwogCQkJCQlEUk1fREVCVUcoIklIOiBEMyB2bGluZVxuIik7CiAJCQkJfQogCQkJCWJyZWFrOwpAQCAtMjM3NSwxNyArMjY4OCwyMSBAQAogCQljYXNlIDQ6IC8qIEQ0IHZibGFuay92bGluZSAqLwogCQkJc3dpdGNoIChzcmNfZGF0YSkgewogCQkJY2FzZSAwOiAvKiBENCB2YmxhbmsgKi8KLQkJCQlpZiAoZGlzcF9pbnRfY29udDMgJiBMQl9ENF9WQkxBTktfSU5URVJSVVBUKSB7Ci0JCQkJCWRybV9oYW5kbGVfdmJsYW5rKHJkZXYtPmRkZXYsIDMpOwotCQkJCQlyZGV2LT5wbS52Ymxhbmtfc3luYyA9IHRydWU7Ci0JCQkJCXdha2VfdXAoJnJkZXYtPmlycS52YmxhbmtfcXVldWUpOwotCQkJCQlkaXNwX2ludF9jb250MyAmPSB+TEJfRDRfVkJMQU5LX0lOVEVSUlVQVDsKKwkJCQlpZiAocmRldi0+aXJxLnN0YXRfcmVncy5ldmVyZ3JlZW4uZGlzcF9pbnRfY29udDMgJiBMQl9ENF9WQkxBTktfSU5URVJSVVBUKSB7CisJCQkJCWlmIChyZGV2LT5pcnEuY3J0Y192YmxhbmtfaW50WzNdKSB7CisJCQkJCQlkcm1faGFuZGxlX3ZibGFuayhyZGV2LT5kZGV2LCAzKTsKKwkJCQkJCXJkZXYtPnBtLnZibGFua19zeW5jID0gdHJ1ZTsKKwkJCQkJCXdha2VfdXAoJnJkZXYtPmlycS52YmxhbmtfcXVldWUpOworCQkJCQl9CisJCQkJCWlmIChyZGV2LT5pcnEucGZsaXBbM10pCisJCQkJCQlyYWRlb25fY3J0Y19oYW5kbGVfZmxpcChyZGV2LCAzKTsKKwkJCQkJcmRldi0+aXJxLnN0YXRfcmVncy5ldmVyZ3JlZW4uZGlzcF9pbnRfY29udDMgJj0gfkxCX0Q0X1ZCTEFOS19JTlRFUlJVUFQ7CiAJCQkJCURSTV9ERUJVRygiSUg6IEQ0IHZibGFua1xuIik7CiAJCQkJfQogCQkJCWJyZWFrOwogCQkJY2FzZSAxOiAvKiBENCB2bGluZSAqLwotCQkJCWlmIChkaXNwX2ludF9jb250MyAmIExCX0Q0X1ZMSU5FX0lOVEVSUlVQVCkgewotCQkJCQlkaXNwX2ludF9jb250MyAmPSB+TEJfRDRfVkxJTkVfSU5URVJSVVBUOworCQkJCWlmIChyZGV2LT5pcnEuc3RhdF9yZWdzLmV2ZXJncmVlbi5kaXNwX2ludF9jb250MyAmIExCX0Q0X1ZMSU5FX0lOVEVSUlVQVCkgeworCQkJCQlyZGV2LT5pcnEuc3RhdF9yZWdzLmV2ZXJncmVlbi5kaXNwX2ludF9jb250MyAmPSB+TEJfRDRfVkxJTkVfSU5URVJSVVBUOwogCQkJCQlEUk1fREVCVUcoIklIOiBENCB2bGluZVxuIik7CiAJCQkJfQogCQkJCWJyZWFrOwpAQCAtMjM5NywxNyArMjcxNCwyMSBAQAogCQljYXNlIDU6IC8qIEQ1IHZibGFuay92bGluZSAqLwogCQkJc3dpdGNoIChzcmNfZGF0YSkgewogCQkJY2FzZSAwOiAvKiBENSB2YmxhbmsgKi8KLQkJCQlpZiAoZGlzcF9pbnRfY29udDQgJiBMQl9ENV9WQkxBTktfSU5URVJSVVBUKSB7Ci0JCQkJCWRybV9oYW5kbGVfdmJsYW5rKHJkZXYtPmRkZXYsIDQpOwotCQkJCQlyZGV2LT5wbS52Ymxhbmtfc3luYyA9IHRydWU7Ci0JCQkJCXdha2VfdXAoJnJkZXYtPmlycS52YmxhbmtfcXVldWUpOwotCQkJCQlkaXNwX2ludF9jb250NCAmPSB+TEJfRDVfVkJMQU5LX0lOVEVSUlVQVDsKKwkJCQlpZiAocmRldi0+aXJxLnN0YXRfcmVncy5ldmVyZ3JlZW4uZGlzcF9pbnRfY29udDQgJiBMQl9ENV9WQkxBTktfSU5URVJSVVBUKSB7CisJCQkJCWlmIChyZGV2LT5pcnEuY3J0Y192YmxhbmtfaW50WzRdKSB7CisJCQkJCQlkcm1faGFuZGxlX3ZibGFuayhyZGV2LT5kZGV2LCA0KTsKKwkJCQkJCXJkZXYtPnBtLnZibGFua19zeW5jID0gdHJ1ZTsKKwkJCQkJCXdha2VfdXAoJnJkZXYtPmlycS52YmxhbmtfcXVldWUpOworCQkJCQl9CisJCQkJCWlmIChyZGV2LT5pcnEucGZsaXBbNF0pCisJCQkJCQlyYWRlb25fY3J0Y19oYW5kbGVfZmxpcChyZGV2LCA0KTsKKwkJCQkJcmRldi0+aXJxLnN0YXRfcmVncy5ldmVyZ3JlZW4uZGlzcF9pbnRfY29udDQgJj0gfkxCX0Q1X1ZCTEFOS19JTlRFUlJVUFQ7CiAJCQkJCURSTV9ERUJVRygiSUg6IEQ1IHZibGFua1xuIik7CiAJCQkJfQogCQkJCWJyZWFrOwogCQkJY2FzZSAxOiAvKiBENSB2bGluZSAqLwotCQkJCWlmIChkaXNwX2ludF9jb250NCAmIExCX0Q1X1ZMSU5FX0lOVEVSUlVQVCkgewotCQkJCQlkaXNwX2ludF9jb250NCAmPSB+TEJfRDVfVkxJTkVfSU5URVJSVVBUOworCQkJCWlmIChyZGV2LT5pcnEuc3RhdF9yZWdzLmV2ZXJncmVlbi5kaXNwX2ludF9jb250NCAmIExCX0Q1X1ZMSU5FX0lOVEVSUlVQVCkgeworCQkJCQlyZGV2LT5pcnEuc3RhdF9yZWdzLmV2ZXJncmVlbi5kaXNwX2ludF9jb250NCAmPSB+TEJfRDVfVkxJTkVfSU5URVJSVVBUOwogCQkJCQlEUk1fREVCVUcoIklIOiBENSB2bGluZVxuIik7CiAJCQkJfQogCQkJCWJyZWFrOwpAQCAtMjQxOSwxNyArMjc0MCwyMSBAQAogCQljYXNlIDY6IC8qIEQ2IHZibGFuay92bGluZSAqLwogCQkJc3dpdGNoIChzcmNfZGF0YSkgewogCQkJY2FzZSAwOiAvKiBENiB2YmxhbmsgKi8KLQkJCQlpZiAoZGlzcF9pbnRfY29udDUgJiBMQl9ENl9WQkxBTktfSU5URVJSVVBUKSB7Ci0JCQkJCWRybV9oYW5kbGVfdmJsYW5rKHJkZXYtPmRkZXYsIDUpOwotCQkJCQlyZGV2LT5wbS52Ymxhbmtfc3luYyA9IHRydWU7Ci0JCQkJCXdha2VfdXAoJnJkZXYtPmlycS52YmxhbmtfcXVldWUpOwotCQkJCQlkaXNwX2ludF9jb250NSAmPSB+TEJfRDZfVkJMQU5LX0lOVEVSUlVQVDsKKwkJCQlpZiAocmRldi0+aXJxLnN0YXRfcmVncy5ldmVyZ3JlZW4uZGlzcF9pbnRfY29udDUgJiBMQl9ENl9WQkxBTktfSU5URVJSVVBUKSB7CisJCQkJCWlmIChyZGV2LT5pcnEuY3J0Y192YmxhbmtfaW50WzVdKSB7CisJCQkJCQlkcm1faGFuZGxlX3ZibGFuayhyZGV2LT5kZGV2LCA1KTsKKwkJCQkJCXJkZXYtPnBtLnZibGFua19zeW5jID0gdHJ1ZTsKKwkJCQkJCXdha2VfdXAoJnJkZXYtPmlycS52YmxhbmtfcXVldWUpOworCQkJCQl9CisJCQkJCWlmIChyZGV2LT5pcnEucGZsaXBbNV0pCisJCQkJCQlyYWRlb25fY3J0Y19oYW5kbGVfZmxpcChyZGV2LCA1KTsKKwkJCQkJcmRldi0+aXJxLnN0YXRfcmVncy5ldmVyZ3JlZW4uZGlzcF9pbnRfY29udDUgJj0gfkxCX0Q2X1ZCTEFOS19JTlRFUlJVUFQ7CiAJCQkJCURSTV9ERUJVRygiSUg6IEQ2IHZibGFua1xuIik7CiAJCQkJfQogCQkJCWJyZWFrOwogCQkJY2FzZSAxOiAvKiBENiB2bGluZSAqLwotCQkJCWlmIChkaXNwX2ludF9jb250NSAmIExCX0Q2X1ZMSU5FX0lOVEVSUlVQVCkgewotCQkJCQlkaXNwX2ludF9jb250NSAmPSB+TEJfRDZfVkxJTkVfSU5URVJSVVBUOworCQkJCWlmIChyZGV2LT5pcnEuc3RhdF9yZWdzLmV2ZXJncmVlbi5kaXNwX2ludF9jb250NSAmIExCX0Q2X1ZMSU5FX0lOVEVSUlVQVCkgeworCQkJCQlyZGV2LT5pcnEuc3RhdF9yZWdzLmV2ZXJncmVlbi5kaXNwX2ludF9jb250NSAmPSB+TEJfRDZfVkxJTkVfSU5URVJSVVBUOwogCQkJCQlEUk1fREVCVUcoIklIOiBENiB2bGluZVxuIik7CiAJCQkJfQogCQkJCWJyZWFrOwpAQCAtMjQ0MSw0MyArMjc2Niw0MyBAQAogCQljYXNlIDQyOiAvKiBIUEQgaG90cGx1ZyAqLwogCQkJc3dpdGNoIChzcmNfZGF0YSkgewogCQkJY2FzZSAwOgotCQkJCWlmIChkaXNwX2ludCAmIERDX0hQRDFfSU5URVJSVVBUKSB7Ci0JCQkJCWRpc3BfaW50ICY9IH5EQ19IUEQxX0lOVEVSUlVQVDsKKwkJCQlpZiAocmRldi0+aXJxLnN0YXRfcmVncy5ldmVyZ3JlZW4uZGlzcF9pbnQgJiBEQ19IUEQxX0lOVEVSUlVQVCkgeworCQkJCQlyZGV2LT5pcnEuc3RhdF9yZWdzLmV2ZXJncmVlbi5kaXNwX2ludCAmPSB+RENfSFBEMV9JTlRFUlJVUFQ7CiAJCQkJCXF1ZXVlX2hvdHBsdWcgPSB0cnVlOwogCQkJCQlEUk1fREVCVUcoIklIOiBIUEQxXG4iKTsKIAkJCQl9CiAJCQkJYnJlYWs7CiAJCQljYXNlIDE6Ci0JCQkJaWYgKGRpc3BfaW50X2NvbnQgJiBEQ19IUEQyX0lOVEVSUlVQVCkgewotCQkJCQlkaXNwX2ludF9jb250ICY9IH5EQ19IUEQyX0lOVEVSUlVQVDsKKwkJCQlpZiAocmRldi0+aXJxLnN0YXRfcmVncy5ldmVyZ3JlZW4uZGlzcF9pbnRfY29udCAmIERDX0hQRDJfSU5URVJSVVBUKSB7CisJCQkJCXJkZXYtPmlycS5zdGF0X3JlZ3MuZXZlcmdyZWVuLmRpc3BfaW50X2NvbnQgJj0gfkRDX0hQRDJfSU5URVJSVVBUOwogCQkJCQlxdWV1ZV9ob3RwbHVnID0gdHJ1ZTsKIAkJCQkJRFJNX0RFQlVHKCJJSDogSFBEMlxuIik7CiAJCQkJfQogCQkJCWJyZWFrOwogCQkJY2FzZSAyOgotCQkJCWlmIChkaXNwX2ludF9jb250MiAmIERDX0hQRDNfSU5URVJSVVBUKSB7Ci0JCQkJCWRpc3BfaW50X2NvbnQyICY9IH5EQ19IUEQzX0lOVEVSUlVQVDsKKwkJCQlpZiAocmRldi0+aXJxLnN0YXRfcmVncy5ldmVyZ3JlZW4uZGlzcF9pbnRfY29udDIgJiBEQ19IUEQzX0lOVEVSUlVQVCkgeworCQkJCQlyZGV2LT5pcnEuc3RhdF9yZWdzLmV2ZXJncmVlbi5kaXNwX2ludF9jb250MiAmPSB+RENfSFBEM19JTlRFUlJVUFQ7CiAJCQkJCXF1ZXVlX2hvdHBsdWcgPSB0cnVlOwogCQkJCQlEUk1fREVCVUcoIklIOiBIUEQzXG4iKTsKIAkJCQl9CiAJCQkJYnJlYWs7CiAJCQljYXNlIDM6Ci0JCQkJaWYgKGRpc3BfaW50X2NvbnQzICYgRENfSFBENF9JTlRFUlJVUFQpIHsKLQkJCQkJZGlzcF9pbnRfY29udDMgJj0gfkRDX0hQRDRfSU5URVJSVVBUOworCQkJCWlmIChyZGV2LT5pcnEuc3RhdF9yZWdzLmV2ZXJncmVlbi5kaXNwX2ludF9jb250MyAmIERDX0hQRDRfSU5URVJSVVBUKSB7CisJCQkJCXJkZXYtPmlycS5zdGF0X3JlZ3MuZXZlcmdyZWVuLmRpc3BfaW50X2NvbnQzICY9IH5EQ19IUEQ0X0lOVEVSUlVQVDsKIAkJCQkJcXVldWVfaG90cGx1ZyA9IHRydWU7CiAJCQkJCURSTV9ERUJVRygiSUg6IEhQRDRcbiIpOwogCQkJCX0KIAkJCQlicmVhazsKIAkJCWNhc2UgNDoKLQkJCQlpZiAoZGlzcF9pbnRfY29udDQgJiBEQ19IUEQ1X0lOVEVSUlVQVCkgewotCQkJCQlkaXNwX2ludF9jb250NCAmPSB+RENfSFBENV9JTlRFUlJVUFQ7CisJCQkJaWYgKHJkZXYtPmlycS5zdGF0X3JlZ3MuZXZlcmdyZWVuLmRpc3BfaW50X2NvbnQ0ICYgRENfSFBENV9JTlRFUlJVUFQpIHsKKwkJCQkJcmRldi0+aXJxLnN0YXRfcmVncy5ldmVyZ3JlZW4uZGlzcF9pbnRfY29udDQgJj0gfkRDX0hQRDVfSU5URVJSVVBUOwogCQkJCQlxdWV1ZV9ob3RwbHVnID0gdHJ1ZTsKIAkJCQkJRFJNX0RFQlVHKCJJSDogSFBENVxuIik7CiAJCQkJfQogCQkJCWJyZWFrOwogCQkJY2FzZSA1OgotCQkJCWlmIChkaXNwX2ludF9jb250NSAmIERDX0hQRDZfSU5URVJSVVBUKSB7Ci0JCQkJCWRpc3BfaW50X2NvbnQ1ICY9IH5EQ19IUEQ2X0lOVEVSUlVQVDsKKwkJCQlpZiAocmRldi0+aXJxLnN0YXRfcmVncy5ldmVyZ3JlZW4uZGlzcF9pbnRfY29udDUgJiBEQ19IUEQ2X0lOVEVSUlVQVCkgeworCQkJCQlyZGV2LT5pcnEuc3RhdF9yZWdzLmV2ZXJncmVlbi5kaXNwX2ludF9jb250NSAmPSB+RENfSFBENl9JTlRFUlJVUFQ7CiAJCQkJCXF1ZXVlX2hvdHBsdWcgPSB0cnVlOwogCQkJCQlEUk1fREVCVUcoIklIOiBIUEQ2XG4iKTsKIAkJCQl9CkBAIC0yNTE2LDcgKzI4NDEsNyBAQAogCWlmICh3cHRyICE9IHJkZXYtPmloLndwdHIpCiAJCWdvdG8gcmVzdGFydF9paDsKIAlpZiAocXVldWVfaG90cGx1ZykKLQkJcXVldWVfd29yayhyZGV2LT53cSwgJnJkZXYtPmhvdHBsdWdfd29yayk7CisJCXNjaGVkdWxlX3dvcmsoJnJkZXYtPmhvdHBsdWdfd29yayk7CiAJcmRldi0+aWgucnB0ciA9IHJwdHI7CiAJV1JFRzMyKElIX1JCX1JQVFIsIHJkZXYtPmloLnJwdHIpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJkZXYtPmloLmxvY2ssIGZsYWdzKTsKQEAgLTI1MjcsMTIgKzI4NTIsMzEgQEAKIHsKIAlpbnQgcjsKIAotCWlmICghcmRldi0+bWVfZncgfHwgIXJkZXYtPnBmcF9mdyB8fCAhcmRldi0+cmxjX2Z3KSB7Ci0JCXIgPSByNjAwX2luaXRfbWljcm9jb2RlKHJkZXYpOworCS8qIGVuYWJsZSBwY2llIGdlbjIgbGluayAqLworCWlmICghQVNJQ19JU19EQ0U1KHJkZXYpKQorCQlldmVyZ3JlZW5fcGNpZV9nZW4yX2VuYWJsZShyZGV2KTsKKworCWlmIChBU0lDX0lTX0RDRTUocmRldikpIHsKKwkJaWYgKCFyZGV2LT5tZV9mdyB8fCAhcmRldi0+cGZwX2Z3IHx8ICFyZGV2LT5ybGNfZncgfHwgIXJkZXYtPm1jX2Z3KSB7CisJCQlyID0gbmlfaW5pdF9taWNyb2NvZGUocmRldik7CisJCQlpZiAocikgeworCQkJCURSTV9FUlJPUigiRmFpbGVkIHRvIGxvYWQgZmlybXdhcmUhXG4iKTsKKwkJCQlyZXR1cm4gcjsKKwkJCX0KKwkJfQorCQlyID0gYnRjX21jX2xvYWRfbWljcm9jb2RlKHJkZXYpOwogCQlpZiAocikgewotCQkJRFJNX0VSUk9SKCJGYWlsZWQgdG8gbG9hZCBmaXJtd2FyZSFcbiIpOworCQkJRFJNX0VSUk9SKCJGYWlsZWQgdG8gbG9hZCBNQyBmaXJtd2FyZSFcbiIpOwogCQkJcmV0dXJuIHI7CiAJCX0KKwl9IGVsc2UgeworCQlpZiAoIXJkZXYtPm1lX2Z3IHx8ICFyZGV2LT5wZnBfZncgfHwgIXJkZXYtPnJsY19mdykgeworCQkJciA9IHI2MDBfaW5pdF9taWNyb2NvZGUocmRldik7CisJCQlpZiAocikgeworCQkJCURSTV9FUlJPUigiRmFpbGVkIHRvIGxvYWQgZmlybXdhcmUhXG4iKTsKKwkJCQlyZXR1cm4gcjsKKwkJCX0KKwkJfQogCX0KIAogCWV2ZXJncmVlbl9tY19wcm9ncmFtKHJkZXYpOwpAQCAtMjU1MSw2ICsyODk1LDExIEBACiAJCXJkZXYtPmFzaWMtPmNvcHkgPSBOVUxMOwogCQlkZXZfd2FybihyZGV2LT5kZXYsICJmYWlsZWQgYmxpdHRlciAoJWQpIGZhbGxpbmcgYmFjayB0byBtZW1jcHlcbiIsIHIpOwogCX0KKwkvKiBYWFg6IG9udGFyaW8gaGFzIHByb2JsZW1zIGJsaXR0aW5nIHRvIGdhcnQgYXQgdGhlIG1vbWVudCAqLworCWlmIChyZGV2LT5mYW1pbHkgPT0gQ0hJUF9QQUxNKSB7CisJCXJkZXYtPmFzaWMtPmNvcHkgPSBOVUxMOworCQlyZGV2LT5tYy5hY3RpdmVfdnJhbV9zaXplID0gcmRldi0+bWMudmlzaWJsZV92cmFtX3NpemU7CisJfQogCiAJLyogYWxsb2NhdGUgd2IgYnVmZmVyICovCiAJciA9IHJhZGVvbl93Yl9pbml0KHJkZXYpOwpAQCAtMjY1OCwxMiArMzAwNywxNiBAQAogCXUzMiByZWc7CiAKIAkvKiBmaXJzdCBjaGVjayBDUlRDcyAqLwotCXJlZyA9IFJSRUczMihFVkVSR1JFRU5fQ1JUQ19DT05UUk9MICsgRVZFUkdSRUVOX0NSVEMwX1JFR0lTVEVSX09GRlNFVCkgfAotCQlSUkVHMzIoRVZFUkdSRUVOX0NSVENfQ09OVFJPTCArIEVWRVJHUkVFTl9DUlRDMV9SRUdJU1RFUl9PRkZTRVQpIHwKLQkJUlJFRzMyKEVWRVJHUkVFTl9DUlRDX0NPTlRST0wgKyBFVkVSR1JFRU5fQ1JUQzJfUkVHSVNURVJfT0ZGU0VUKSB8Ci0JCVJSRUczMihFVkVSR1JFRU5fQ1JUQ19DT05UUk9MICsgRVZFUkdSRUVOX0NSVEMzX1JFR0lTVEVSX09GRlNFVCkgfAotCQlSUkVHMzIoRVZFUkdSRUVOX0NSVENfQ09OVFJPTCArIEVWRVJHUkVFTl9DUlRDNF9SRUdJU1RFUl9PRkZTRVQpIHwKLQkJUlJFRzMyKEVWRVJHUkVFTl9DUlRDX0NPTlRST0wgKyBFVkVSR1JFRU5fQ1JUQzVfUkVHSVNURVJfT0ZGU0VUKTsKKwlpZiAocmRldi0+ZmxhZ3MgJiBSQURFT05fSVNfSUdQKQorCQlyZWcgPSBSUkVHMzIoRVZFUkdSRUVOX0NSVENfQ09OVFJPTCArIEVWRVJHUkVFTl9DUlRDMF9SRUdJU1RFUl9PRkZTRVQpIHwKKwkJCVJSRUczMihFVkVSR1JFRU5fQ1JUQ19DT05UUk9MICsgRVZFUkdSRUVOX0NSVEMxX1JFR0lTVEVSX09GRlNFVCk7CisJZWxzZQorCQlyZWcgPSBSUkVHMzIoRVZFUkdSRUVOX0NSVENfQ09OVFJPTCArIEVWRVJHUkVFTl9DUlRDMF9SRUdJU1RFUl9PRkZTRVQpIHwKKwkJCVJSRUczMihFVkVSR1JFRU5fQ1JUQ19DT05UUk9MICsgRVZFUkdSRUVOX0NSVEMxX1JFR0lTVEVSX09GRlNFVCkgfAorCQkJUlJFRzMyKEVWRVJHUkVFTl9DUlRDX0NPTlRST0wgKyBFVkVSR1JFRU5fQ1JUQzJfUkVHSVNURVJfT0ZGU0VUKSB8CisJCQlSUkVHMzIoRVZFUkdSRUVOX0NSVENfQ09OVFJPTCArIEVWRVJHUkVFTl9DUlRDM19SRUdJU1RFUl9PRkZTRVQpIHwKKwkJCVJSRUczMihFVkVSR1JFRU5fQ1JUQ19DT05UUk9MICsgRVZFUkdSRUVOX0NSVEM0X1JFR0lTVEVSX09GRlNFVCkgfAorCQkJUlJFRzMyKEVWRVJHUkVFTl9DUlRDX0NPTlRST0wgKyBFVkVSR1JFRU5fQ1JUQzVfUkVHSVNURVJfT0ZGU0VUKTsKIAlpZiAocmVnICYgRVZFUkdSRUVOX0NSVENfTUFTVEVSX0VOKQogCQlyZXR1cm4gdHJ1ZTsKIApAQCAtMjgwMCwzICszMTUzLDUyIEBACiAJcmRldi0+YmlvcyA9IE5VTEw7CiAJcmFkZW9uX2R1bW15X3BhZ2VfZmluaShyZGV2KTsKIH0KKworc3RhdGljIHZvaWQgZXZlcmdyZWVuX3BjaWVfZ2VuMl9lbmFibGUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCit7CisJdTMyIGxpbmtfd2lkdGhfY250bCwgc3BlZWRfY250bDsKKworCWlmIChyZGV2LT5mbGFncyAmIFJBREVPTl9JU19JR1ApCisJCXJldHVybjsKKworCWlmICghKHJkZXYtPmZsYWdzICYgUkFERU9OX0lTX1BDSUUpKQorCQlyZXR1cm47CisKKwkvKiB4MiBjYXJkcyBoYXZlIGEgc3BlY2lhbCBzZXF1ZW5jZSAqLworCWlmIChBU0lDX0lTX1gyKHJkZXYpKQorCQlyZXR1cm47CisKKwlzcGVlZF9jbnRsID0gUlJFRzMyX1BDSUVfUChQQ0lFX0xDX1NQRUVEX0NOVEwpOworCWlmICgoc3BlZWRfY250bCAmIExDX09USEVSX1NJREVfRVZFUl9TRU5UX0dFTjIpIHx8CisJICAgIChzcGVlZF9jbnRsICYgTENfT1RIRVJfU0lERV9TVVBQT1JUU19HRU4yKSkgeworCisJCWxpbmtfd2lkdGhfY250bCA9IFJSRUczMl9QQ0lFX1AoUENJRV9MQ19MSU5LX1dJRFRIX0NOVEwpOworCQlsaW5rX3dpZHRoX2NudGwgJj0gfkxDX1VQQ09ORklHVVJFX0RJUzsKKwkJV1JFRzMyX1BDSUVfUChQQ0lFX0xDX0xJTktfV0lEVEhfQ05UTCwgbGlua193aWR0aF9jbnRsKTsKKworCQlzcGVlZF9jbnRsID0gUlJFRzMyX1BDSUVfUChQQ0lFX0xDX1NQRUVEX0NOVEwpOworCQlzcGVlZF9jbnRsICY9IH5MQ19UQVJHRVRfTElOS19TUEVFRF9PVkVSUklERV9FTjsKKwkJV1JFRzMyX1BDSUVfUChQQ0lFX0xDX1NQRUVEX0NOVEwsIHNwZWVkX2NudGwpOworCisJCXNwZWVkX2NudGwgPSBSUkVHMzJfUENJRV9QKFBDSUVfTENfU1BFRURfQ05UTCk7CisJCXNwZWVkX2NudGwgfD0gTENfQ0xSX0ZBSUxFRF9TUERfQ0hBTkdFX0NOVDsKKwkJV1JFRzMyX1BDSUVfUChQQ0lFX0xDX1NQRUVEX0NOVEwsIHNwZWVkX2NudGwpOworCisJCXNwZWVkX2NudGwgPSBSUkVHMzJfUENJRV9QKFBDSUVfTENfU1BFRURfQ05UTCk7CisJCXNwZWVkX2NudGwgJj0gfkxDX0NMUl9GQUlMRURfU1BEX0NIQU5HRV9DTlQ7CisJCVdSRUczMl9QQ0lFX1AoUENJRV9MQ19TUEVFRF9DTlRMLCBzcGVlZF9jbnRsKTsKKworCQlzcGVlZF9jbnRsID0gUlJFRzMyX1BDSUVfUChQQ0lFX0xDX1NQRUVEX0NOVEwpOworCQlzcGVlZF9jbnRsIHw9IExDX0dFTjJfRU5fU1RSQVA7CisJCVdSRUczMl9QQ0lFX1AoUENJRV9MQ19TUEVFRF9DTlRMLCBzcGVlZF9jbnRsKTsKKworCX0gZWxzZSB7CisJCWxpbmtfd2lkdGhfY250bCA9IFJSRUczMl9QQ0lFX1AoUENJRV9MQ19MSU5LX1dJRFRIX0NOVEwpOworCQkvKiBYWFg6IG9ubHkgZGlzYWJsZSBpdCBpZiBnZW4xIGJyaWRnZSB2ZW5kb3IgPT0gMHgxMTFkIG9yIDB4MTEwNiAqLworCQlpZiAoMSkKKwkJCWxpbmtfd2lkdGhfY250bCB8PSBMQ19VUENPTkZJR1VSRV9ESVM7CisJCWVsc2UKKwkJCWxpbmtfd2lkdGhfY250bCAmPSB+TENfVVBDT05GSUdVUkVfRElTOworCQlXUkVHMzJfUENJRV9QKFBDSUVfTENfTElOS19XSURUSF9DTlRMLCBsaW5rX3dpZHRoX2NudGwpOworCX0KK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vZXZlcmdyZWVuX2JsaXRfa21zLmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL2V2ZXJncmVlbl9ibGl0X2ttcy5jCmluZGV4IGUwZTU5MDEuLmI3NThkYzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vZXZlcmdyZWVuX2JsaXRfa21zLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9ldmVyZ3JlZW5fYmxpdF9rbXMuYwpAQCAtMTQ3LDcgKzE0Nyw5IEBACiAJcmFkZW9uX3Jpbmdfd3JpdGUocmRldiwgMCk7CiAJcmFkZW9uX3Jpbmdfd3JpdGUocmRldiwgU1FfVEVYX1ZUWF9WQUxJRF9CVUZGRVIgPDwgMzApOwogCi0JaWYgKHJkZXYtPmZhbWlseSA9PSBDSElQX0NFREFSKQorCWlmICgocmRldi0+ZmFtaWx5ID09IENISVBfQ0VEQVIpIHx8CisJICAgIChyZGV2LT5mYW1pbHkgPT0gQ0hJUF9QQUxNKSB8fAorCSAgICAocmRldi0+ZmFtaWx5ID09IENISVBfQ0FJQ09TKSkKIAkJY3Bfc2V0X3N1cmZhY2Vfc3luYyhyZGV2LAogCQkJCSAgICBQQUNLRVQzX1RDX0FDVElPTl9FTkEsIDQ4LCBncHVfYWRkcik7CiAJZWxzZQpAQCAtMzMxLDkgKzMzMyw5NSBAQAogCQludW1faHNfc3RhY2tfZW50cmllcyA9IDg1OwogCQludW1fbHNfc3RhY2tfZW50cmllcyA9IDg1OwogCQlicmVhazsKKwljYXNlIENISVBfUEFMTToKKwkJbnVtX3BzX2dwcnMgPSA5MzsKKwkJbnVtX3ZzX2dwcnMgPSA0NjsKKwkJbnVtX3RlbXBfZ3BycyA9IDQ7CisJCW51bV9nc19ncHJzID0gMzE7CisJCW51bV9lc19ncHJzID0gMzE7CisJCW51bV9oc19ncHJzID0gMjM7CisJCW51bV9sc19ncHJzID0gMjM7CisJCW51bV9wc190aHJlYWRzID0gOTY7CisJCW51bV92c190aHJlYWRzID0gMTY7CisJCW51bV9nc190aHJlYWRzID0gMTY7CisJCW51bV9lc190aHJlYWRzID0gMTY7CisJCW51bV9oc190aHJlYWRzID0gMTY7CisJCW51bV9sc190aHJlYWRzID0gMTY7CisJCW51bV9wc19zdGFja19lbnRyaWVzID0gNDI7CisJCW51bV92c19zdGFja19lbnRyaWVzID0gNDI7CisJCW51bV9nc19zdGFja19lbnRyaWVzID0gNDI7CisJCW51bV9lc19zdGFja19lbnRyaWVzID0gNDI7CisJCW51bV9oc19zdGFja19lbnRyaWVzID0gNDI7CisJCW51bV9sc19zdGFja19lbnRyaWVzID0gNDI7CisJCWJyZWFrOworCWNhc2UgQ0hJUF9CQVJUUzoKKwkJbnVtX3BzX2dwcnMgPSA5MzsKKwkJbnVtX3ZzX2dwcnMgPSA0NjsKKwkJbnVtX3RlbXBfZ3BycyA9IDQ7CisJCW51bV9nc19ncHJzID0gMzE7CisJCW51bV9lc19ncHJzID0gMzE7CisJCW51bV9oc19ncHJzID0gMjM7CisJCW51bV9sc19ncHJzID0gMjM7CisJCW51bV9wc190aHJlYWRzID0gMTI4OworCQludW1fdnNfdGhyZWFkcyA9IDIwOworCQludW1fZ3NfdGhyZWFkcyA9IDIwOworCQludW1fZXNfdGhyZWFkcyA9IDIwOworCQludW1faHNfdGhyZWFkcyA9IDIwOworCQludW1fbHNfdGhyZWFkcyA9IDIwOworCQludW1fcHNfc3RhY2tfZW50cmllcyA9IDg1OworCQludW1fdnNfc3RhY2tfZW50cmllcyA9IDg1OworCQludW1fZ3Nfc3RhY2tfZW50cmllcyA9IDg1OworCQludW1fZXNfc3RhY2tfZW50cmllcyA9IDg1OworCQludW1faHNfc3RhY2tfZW50cmllcyA9IDg1OworCQludW1fbHNfc3RhY2tfZW50cmllcyA9IDg1OworCQlicmVhazsKKwljYXNlIENISVBfVFVSS1M6CisJCW51bV9wc19ncHJzID0gOTM7CisJCW51bV92c19ncHJzID0gNDY7CisJCW51bV90ZW1wX2dwcnMgPSA0OworCQludW1fZ3NfZ3BycyA9IDMxOworCQludW1fZXNfZ3BycyA9IDMxOworCQludW1faHNfZ3BycyA9IDIzOworCQludW1fbHNfZ3BycyA9IDIzOworCQludW1fcHNfdGhyZWFkcyA9IDEyODsKKwkJbnVtX3ZzX3RocmVhZHMgPSAyMDsKKwkJbnVtX2dzX3RocmVhZHMgPSAyMDsKKwkJbnVtX2VzX3RocmVhZHMgPSAyMDsKKwkJbnVtX2hzX3RocmVhZHMgPSAyMDsKKwkJbnVtX2xzX3RocmVhZHMgPSAyMDsKKwkJbnVtX3BzX3N0YWNrX2VudHJpZXMgPSA0MjsKKwkJbnVtX3ZzX3N0YWNrX2VudHJpZXMgPSA0MjsKKwkJbnVtX2dzX3N0YWNrX2VudHJpZXMgPSA0MjsKKwkJbnVtX2VzX3N0YWNrX2VudHJpZXMgPSA0MjsKKwkJbnVtX2hzX3N0YWNrX2VudHJpZXMgPSA0MjsKKwkJbnVtX2xzX3N0YWNrX2VudHJpZXMgPSA0MjsKKwkJYnJlYWs7CisJY2FzZSBDSElQX0NBSUNPUzoKKwkJbnVtX3BzX2dwcnMgPSA5MzsKKwkJbnVtX3ZzX2dwcnMgPSA0NjsKKwkJbnVtX3RlbXBfZ3BycyA9IDQ7CisJCW51bV9nc19ncHJzID0gMzE7CisJCW51bV9lc19ncHJzID0gMzE7CisJCW51bV9oc19ncHJzID0gMjM7CisJCW51bV9sc19ncHJzID0gMjM7CisJCW51bV9wc190aHJlYWRzID0gMTI4OworCQludW1fdnNfdGhyZWFkcyA9IDEwOworCQludW1fZ3NfdGhyZWFkcyA9IDEwOworCQludW1fZXNfdGhyZWFkcyA9IDEwOworCQludW1faHNfdGhyZWFkcyA9IDEwOworCQludW1fbHNfdGhyZWFkcyA9IDEwOworCQludW1fcHNfc3RhY2tfZW50cmllcyA9IDQyOworCQludW1fdnNfc3RhY2tfZW50cmllcyA9IDQyOworCQludW1fZ3Nfc3RhY2tfZW50cmllcyA9IDQyOworCQludW1fZXNfc3RhY2tfZW50cmllcyA9IDQyOworCQludW1faHNfc3RhY2tfZW50cmllcyA9IDQyOworCQludW1fbHNfc3RhY2tfZW50cmllcyA9IDQyOworCQlicmVhazsKIAl9CiAKLQlpZiAocmRldi0+ZmFtaWx5ID09IENISVBfQ0VEQVIpCisJaWYgKChyZGV2LT5mYW1pbHkgPT0gQ0hJUF9DRURBUikgfHwKKwkgICAgKHJkZXYtPmZhbWlseSA9PSBDSElQX1BBTE0pIHx8CisJICAgIChyZGV2LT5mYW1pbHkgPT0gQ0hJUF9DQUlDT1MpKQogCQlzcV9jb25maWcgPSAwOwogCWVsc2UKIAkJc3FfY29uZmlnID0gVkNfRU5BQkxFOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9ldmVyZ3JlZW5fcmVnLmggYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL2V2ZXJncmVlbl9yZWcuaAppbmRleCAyMzMwZjNhMzYuLmM3ODFjOTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vZXZlcmdyZWVuX3JlZy5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vZXZlcmdyZWVuX3JlZy5oCkBAIC0xMDUsNiArMTA1LDExIEBACiAjZGVmaW5lIEVWRVJHUkVFTl9HUlBIX1lfU1RBUlQgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NjgzMAogI2RlZmluZSBFVkVSR1JFRU5fR1JQSF9YX0VORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDY4MzQKICNkZWZpbmUgRVZFUkdSRUVOX0dSUEhfWV9FTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg2ODM4CisjZGVmaW5lIEVWRVJHUkVFTl9HUlBIX1VQREFURSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4Njg0NAorIyAgICAgICBkZWZpbmUgRVZFUkdSRUVOX0dSUEhfU1VSRkFDRV9VUERBVEVfUEVORElORyAgICAoMSA8PCAyKQorIyAgICAgICBkZWZpbmUgRVZFUkdSRUVOX0dSUEhfVVBEQVRFX0xPQ0sgICAgICAgICAgICAgICAoMSA8PCAxNikKKyNkZWZpbmUgRVZFUkdSRUVOX0dSUEhfRkxJUF9DT05UUk9MICAgICAgICAgICAgICAgICAgICAgMHg2ODQ4CisjICAgICAgIGRlZmluZSBFVkVSR1JFRU5fR1JQSF9TVVJGQUNFX1VQREFURV9IX1JFVFJBQ0VfRU4gKDEgPDwgMCkKIAogLyogQ1VSIGJsb2NrcyBhdCAweDY5OTgsIDB4NzU5OCwgMHgxMDE5OCwgMHgxMGQ5OCwgMHgxMTk5OCwgMHgxMjU5OCAqLwogI2RlZmluZSBFVkVSR1JFRU5fQ1VSX0NPTlRST0wgICAgICAgICAgICAgICAgICAgICAgICAgICAweDY5OTgKQEAgLTE3OCw2ICsxODMsNyBAQAogIyAgICAgICBkZWZpbmUgRVZFUkdSRUVOX0NSVENfRElTUF9SRUFEX1JFUVVFU1RfRElTQUJMRSAoMSA8PCAyNCkKICNkZWZpbmUgRVZFUkdSRUVOX0NSVENfU1RBVFVTICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg2ZThjCiAjZGVmaW5lIEVWRVJHUkVFTl9DUlRDX1NUQVRVU19QT1NJVElPTiAgICAgICAgICAgICAgICAgIDB4NmU5MAorI2RlZmluZSBFVkVSR1JFRU5fTUFTVEVSX1VQREFURV9NT0RFICAgICAgICAgICAgICAgICAgICAweDZlZjgKICNkZWZpbmUgRVZFUkdSRUVOX0NSVENfVVBEQVRFX0xPQ0sgICAgICAgICAgICAgICAgICAgICAgMHg2ZWQ0CiAKICNkZWZpbmUgRVZFUkdSRUVOX0RDX0dQSU9fSFBEX01BU0sgICAgICAgICAgICAgICAgICAgICAgMHg2NGIwCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL2V2ZXJncmVlbmQuaCBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vZXZlcmdyZWVuZC5oCmluZGV4IGE3M2I1M2MuLjM2ZDMyZDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vZXZlcmdyZWVuZC5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vZXZlcmdyZWVuZC5oCkBAIC0xNjQsMTEgKzE2NCwxMyBAQAogI2RlZmluZQkJU0VfU0NfQlVTWQkJCQkJKDEgPDwgMjkpCiAjZGVmaW5lCQlTRV9EQl9CVVNZCQkJCQkoMSA8PCAzMCkKICNkZWZpbmUJCVNFX0NCX0JVU1kJCQkJCSgxIDw8IDMxKQotCisvKiBldmVyZ3JlZW4gKi8KICNkZWZpbmUJQ0dfTVVMVF9USEVSTUFMX1NUQVRVUwkJCQkweDc0MAogI2RlZmluZQkJQVNJQ19UKHgpCQkJICAgICAgICAoKHgpIDw8IDE2KQogI2RlZmluZQkJQVNJQ19UX01BU0sJCQkgICAgICAgIDB4N0ZGMDAwMAogI2RlZmluZQkJQVNJQ19UX1NISUZUCQkJICAgICAgICAxNgorLyogQVBVICovCisjZGVmaW5lCUNHX1RIRVJNQUxfU1RBVFVTCQkJICAgICAgICAweDY3OAogCiAjZGVmaW5lCUhEUF9IT1NUX1BBVEhfQ05UTAkJCQkweDJDMDAKICNkZWZpbmUJSERQX05PTlNVUkZBQ0VfQkFTRQkJCQkweDJDMDQKQEAgLTE4MSw2ICsxODMsNyBAQAogI2RlZmluZSBNQ19TSEFSRURfQ0hNQVAJCQkJCQkweDIwMDQKICNkZWZpbmUJCU5PT0ZDSEFOX1NISUZUCQkJCQkxMgogI2RlZmluZQkJTk9PRkNIQU5fTUFTSwkJCQkJMHgwMDAwMzAwMAorI2RlZmluZSBNQ19TSEFSRURfQ0hSRU1BUAkJCQkJMHgyMDA4CiAKICNkZWZpbmUJTUNfQVJCX1JBTUNGRwkJCQkJMHgyNzYwCiAjZGVmaW5lCQlOT09GQkFOS19TSElGVAkJCQkJMApAQCAtMjAwLDYgKzIwMyw3IEBACiAjZGVmaW5lCU1DX1ZNX0FHUF9CT1QJCQkJCTB4MjAyQwogI2RlZmluZQlNQ19WTV9BR1BfQkFTRQkJCQkJMHgyMDMwCiAjZGVmaW5lCU1DX1ZNX0ZCX0xPQ0FUSU9OCQkJCTB4MjAyNAorI2RlZmluZQlNQ19GVVNfVk1fRkJfT0ZGU0VUCQkJCTB4Mjg5OAogI2RlZmluZQlNQ19WTV9NQl9MMV9UTEIwX0NOVEwJCQkJMHgyMjM0CiAjZGVmaW5lCU1DX1ZNX01CX0wxX1RMQjFfQ05UTAkJCQkweDIyMzgKICNkZWZpbmUJTUNfVk1fTUJfTDFfVExCMl9DTlRMCQkJCTB4MjIzQwpAQCAtMzQ5LDYgKzM1Myw5IEBACiAjZGVmaW5lCQlTWU5DX1dBTEtFUgkJCQkJKDEgPDwgMjUpCiAjZGVmaW5lCQlTWU5DX0FMSUdORVIJCQkJCSgxIDw8IDI2KQogCisjZGVmaW5lCVRDUF9DSEFOX1NURUVSX0xPCQkJCTB4OTYwYworI2RlZmluZQlUQ1BfQ0hBTl9TVEVFUl9ISQkJCQkweDk2MTAKKwogI2RlZmluZQlWR1RfQ0FDSEVfSU5WQUxJREFUSU9OCQkJCTB4ODhDNAogI2RlZmluZQkJQ0FDSEVfSU5WQUxJREFUSU9OKHgpCQkJCSgoeCkgPDwgMCkKICNkZWZpbmUJCQlWQ19PTkxZCQkJCQkJMApAQCAtNTc0LDYgKzU4MSw0NCBAQAogIyAgICAgICBkZWZpbmUgRENfSFBEeF9SWF9JTlRfVElNRVIoeCkgICAgICAgICAgICAgICAgICAgICgoeCkgPDwgMTYpCiAjICAgICAgIGRlZmluZSBEQ19IUER4X0VOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgMjgpCiAKKy8qIFBDSUUgbGluayBzdHVmZiAqLworI2RlZmluZSBQQ0lFX0xDX1RSQUlOSU5HX0NOVEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4YTEgLyogUENJRV9QICovCisjZGVmaW5lIFBDSUVfTENfTElOS19XSURUSF9DTlRMICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhhMiAvKiBQQ0lFX1AgKi8KKyMgICAgICAgZGVmaW5lIExDX0xJTktfV0lEVEhfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAwCisjICAgICAgIGRlZmluZSBMQ19MSU5LX1dJRFRIX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgMHg3CisjICAgICAgIGRlZmluZSBMQ19MSU5LX1dJRFRIX1gwICAgICAgICAgICAgICAgICAgICAgICAgICAgMAorIyAgICAgICBkZWZpbmUgTENfTElOS19XSURUSF9YMSAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyMgICAgICAgZGVmaW5lIExDX0xJTktfV0lEVEhfWDIgICAgICAgICAgICAgICAgICAgICAgICAgICAyCisjICAgICAgIGRlZmluZSBMQ19MSU5LX1dJRFRIX1g0ICAgICAgICAgICAgICAgICAgICAgICAgICAgMworIyAgICAgICBkZWZpbmUgTENfTElOS19XSURUSF9YOCAgICAgICAgICAgICAgICAgICAgICAgICAgIDQKKyMgICAgICAgZGVmaW5lIExDX0xJTktfV0lEVEhfWDE2ICAgICAgICAgICAgICAgICAgICAgICAgICA2CisjICAgICAgIGRlZmluZSBMQ19MSU5LX1dJRFRIX1JEX1NISUZUICAgICAgICAgICAgICAgICAgICAgNAorIyAgICAgICBkZWZpbmUgTENfTElOS19XSURUSF9SRF9NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4NzAKKyMgICAgICAgZGVmaW5lIExDX1JFQ09ORklHX0FSQ19NSVNTSU5HX0VTQ0FQRSAgICAgICAgICAgICAoMSA8PCA3KQorIyAgICAgICBkZWZpbmUgTENfUkVDT05GSUdfTk9XICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IDgpCisjICAgICAgIGRlZmluZSBMQ19SRU5FR09USUFUSU9OX1NVUFBPUlQgICAgICAgICAgICAgICAgICAgKDEgPDwgOSkKKyMgICAgICAgZGVmaW5lIExDX1JFTkVHT1RJQVRFX0VOICAgICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCAxMCkKKyMgICAgICAgZGVmaW5lIExDX1NIT1JUX1JFQ09ORklHX0VOICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCAxMSkKKyMgICAgICAgZGVmaW5lIExDX1VQQ09ORklHVVJFX1NVUFBPUlQgICAgICAgICAgICAgICAgICAgICAoMSA8PCAxMikKKyMgICAgICAgZGVmaW5lIExDX1VQQ09ORklHVVJFX0RJUyAgICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCAxMykKKyNkZWZpbmUgUENJRV9MQ19TUEVFRF9DTlRMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGE0IC8qIFBDSUVfUCAqLworIyAgICAgICBkZWZpbmUgTENfR0VOMl9FTl9TVFJBUCAgICAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IDApCisjICAgICAgIGRlZmluZSBMQ19UQVJHRVRfTElOS19TUEVFRF9PVkVSUklERV9FTiAgICAgICAgICAgKDEgPDwgMSkKKyMgICAgICAgZGVmaW5lIExDX0ZPUkNFX0VOX0hXX1NQRUVEX0NIQU5HRSAgICAgICAgICAgICAgICAoMSA8PCA1KQorIyAgICAgICBkZWZpbmUgTENfRk9SQ0VfRElTX0hXX1NQRUVEX0NIQU5HRSAgICAgICAgICAgICAgICgxIDw8IDYpCisjICAgICAgIGRlZmluZSBMQ19TUEVFRF9DSEFOR0VfQVRURU1QVFNfQUxMT1dFRF9NQVNLICAgICAgKDB4MyA8PCA4KQorIyAgICAgICBkZWZpbmUgTENfU1BFRURfQ0hBTkdFX0FUVEVNUFRTX0FMTE9XRURfU0hJRlQgICAgIDMKKyMgICAgICAgZGVmaW5lIExDX0NVUlJFTlRfREFUQV9SQVRFICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCAxMSkKKyMgICAgICAgZGVmaW5lIExDX1ZPTFRBR0VfVElNRVJfU0VMX01BU0sgICAgICAgICAgICAgICAgICAoMHhmIDw8IDE0KQorIyAgICAgICBkZWZpbmUgTENfQ0xSX0ZBSUxFRF9TUERfQ0hBTkdFX0NOVCAgICAgICAgICAgICAgICgxIDw8IDIxKQorIyAgICAgICBkZWZpbmUgTENfT1RIRVJfU0lERV9FVkVSX1NFTlRfR0VOMiAgICAgICAgICAgICAgICgxIDw8IDIzKQorIyAgICAgICBkZWZpbmUgTENfT1RIRVJfU0lERV9TVVBQT1JUU19HRU4yICAgICAgICAgICAgICAgICgxIDw8IDI0KQorI2RlZmluZSBNTV9DRkdSRUdTX0NOVEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NTQ0YworIyAgICAgICBkZWZpbmUgTU1fV1JfVE9fQ0ZHX0VOICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IDMpCisjZGVmaW5lIExJTktfQ05UTDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4OCAvKiBGMCAqLworIyAgICAgICBkZWZpbmUgVEFSR0VUX0xJTktfU1BFRURfTUFTSyAgICAgICAgICAgICAgICAgICAgICgweGYgPDwgMCkKKyMgICAgICAgZGVmaW5lIFNFTEVDVEFCTEVfREVFTVBIQVNJUyAgICAgICAgICAgICAgICAgICAgICAoMSA8PCA2KQorCiAvKgogICogUE00CiAgKi8KQEAgLTYwMyw3ICs2NDgsNyBAQAogI2RlZmluZQlQQUNLRVQzX05PUAkJCQkJMHgxMAogI2RlZmluZQlQQUNLRVQzX1NFVF9CQVNFCQkJCTB4MTEKICNkZWZpbmUJUEFDS0VUM19DTEVBUl9TVEFURQkJCQkweDEyCi0jZGVmaW5lCVBBQ0tFVDNfSU5ESVJFQ1RfQlVGRkVSX1NJWkUJCQkweDEzCisjZGVmaW5lCVBBQ0tFVDNfSU5ERVhfQlVGRkVSX1NJWkUJCQkweDEzCiAjZGVmaW5lCVBBQ0tFVDNfRElTUEFUQ0hfRElSRUNUCQkJCTB4MTUKICNkZWZpbmUJUEFDS0VUM19ESVNQQVRDSF9JTkRJUkVDVAkJCTB4MTYKICNkZWZpbmUJUEFDS0VUM19JTkRJUkVDVF9CVUZGRVJfRU5ECQkJMHgxNwpAQCAtNjQ0LDE0ICs2ODksMTQgQEAKICMgICAgICAgICAgICAgIGRlZmluZSBQQUNLRVQzX0NCOF9ERVNUX0JBU0VfRU5BICAgICgxIDw8IDE1KQogIyAgICAgICAgICAgICAgZGVmaW5lIFBBQ0tFVDNfQ0I5X0RFU1RfQkFTRV9FTkEgICAgKDEgPDwgMTYpCiAjICAgICAgICAgICAgICBkZWZpbmUgUEFDS0VUM19DQjEwX0RFU1RfQkFTRV9FTkEgICAoMSA8PCAxNykKLSMgICAgICAgICAgICAgIGRlZmluZSBQQUNLRVQzX0NCMTFfREVTVF9CQVNFX0VOQSAgICgxIDw8IDE3KQorIyAgICAgICAgICAgICAgZGVmaW5lIFBBQ0tFVDNfQ0IxMV9ERVNUX0JBU0VfRU5BICAgKDEgPDwgMTgpCiAjICAgICAgICAgICAgICBkZWZpbmUgUEFDS0VUM19GVUxMX0NBQ0hFX0VOQSAgICAgICAoMSA8PCAyMCkKICMgICAgICAgICAgICAgIGRlZmluZSBQQUNLRVQzX1RDX0FDVElPTl9FTkEgICAgICAgICgxIDw8IDIzKQogIyAgICAgICAgICAgICAgZGVmaW5lIFBBQ0tFVDNfVkNfQUNUSU9OX0VOQSAgICAgICAgKDEgPDwgMjQpCiAjICAgICAgICAgICAgICBkZWZpbmUgUEFDS0VUM19DQl9BQ1RJT05fRU5BICAgICAgICAoMSA8PCAyNSkKICMgICAgICAgICAgICAgIGRlZmluZSBQQUNLRVQzX0RCX0FDVElPTl9FTkEgICAgICAgICgxIDw8IDI2KQogIyAgICAgICAgICAgICAgZGVmaW5lIFBBQ0tFVDNfU0hfQUNUSU9OX0VOQSAgICAgICAgKDEgPDwgMjcpCi0jICAgICAgICAgICAgICBkZWZpbmUgUEFDS0VUM19TTVhfQUNUSU9OX0VOQSAgICAgICAoMSA8PCAyOCkKKyMgICAgICAgICAgICAgIGRlZmluZSBQQUNLRVQzX1NYX0FDVElPTl9FTkEgICAgICAgICgxIDw8IDI4KQogI2RlZmluZQlQQUNLRVQzX01FX0lOSVRJQUxJWkUJCQkJMHg0NAogI2RlZmluZQkJUEFDS0VUM19NRV9JTklUSUFMSVpFX0RFVklDRV9JRCh4KSAoKHgpIDw8IDE2KQogI2RlZmluZQlQQUNLRVQzX0NPTkRfV1JJVEUJCQkJMHg0NQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9uaS5jIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9uaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlMGJlZjgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL25pLmMKQEAgLTAsMCArMSwzMTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxMCBBZHZhbmNlZCBNaWNybyBEZXZpY2VzLCBJbmMuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQ09QWVJJR0hUIEhPTERFUihTKSBPUiBBVVRIT1IoUykgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogQXV0aG9yczogQWxleCBEZXVjaGVyCisgKi8KKyNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlICJkcm1QLmgiCisjaW5jbHVkZSAicmFkZW9uLmgiCisjaW5jbHVkZSAicmFkZW9uX2FzaWMuaCIKKyNpbmNsdWRlICJyYWRlb25fZHJtLmgiCisjaW5jbHVkZSAibmlkLmgiCisjaW5jbHVkZSAiYXRvbS5oIgorI2luY2x1ZGUgIm5pX3JlZy5oIgorCisjZGVmaW5lIEVWRVJHUkVFTl9QRlBfVUNPREVfU0laRSAxMTIwCisjZGVmaW5lIEVWRVJHUkVFTl9QTTRfVUNPREVfU0laRSAxMzc2CisjZGVmaW5lIEVWRVJHUkVFTl9STENfVUNPREVfU0laRSA3NjgKKyNkZWZpbmUgQlRDX01DX1VDT0RFX1NJWkUgNjAyNAorCisvKiBGaXJtd2FyZSBOYW1lcyAqLworTU9EVUxFX0ZJUk1XQVJFKCJyYWRlb24vQkFSVFNfcGZwLmJpbiIpOworTU9EVUxFX0ZJUk1XQVJFKCJyYWRlb24vQkFSVFNfbWUuYmluIik7CitNT0RVTEVfRklSTVdBUkUoInJhZGVvbi9CQVJUU19tYy5iaW4iKTsKK01PRFVMRV9GSVJNV0FSRSgicmFkZW9uL0JUQ19ybGMuYmluIik7CitNT0RVTEVfRklSTVdBUkUoInJhZGVvbi9UVVJLU19wZnAuYmluIik7CitNT0RVTEVfRklSTVdBUkUoInJhZGVvbi9UVVJLU19tZS5iaW4iKTsKK01PRFVMRV9GSVJNV0FSRSgicmFkZW9uL1RVUktTX21jLmJpbiIpOworTU9EVUxFX0ZJUk1XQVJFKCJyYWRlb24vQ0FJQ09TX3BmcC5iaW4iKTsKK01PRFVMRV9GSVJNV0FSRSgicmFkZW9uL0NBSUNPU19tZS5iaW4iKTsKK01PRFVMRV9GSVJNV0FSRSgicmFkZW9uL0NBSUNPU19tYy5iaW4iKTsKKworI2RlZmluZSBCVENfSU9fTUNfUkVHU19TSVpFIDI5CisKK3N0YXRpYyBjb25zdCB1MzIgYmFydHNfaW9fbWNfcmVnc1tCVENfSU9fTUNfUkVHU19TSVpFXVsyXSA9IHsKKwl7MHgwMDAwMDA3NywgMHhmZjAxMDEwMH0sCisJezB4MDAwMDAwNzgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAwMDc5LCAweDAwMDAxNDM0fSwKKwl7MHgwMDAwMDA3YSwgMHhjYzA4ZWMwOH0sCisJezB4MDAwMDAwN2IsIDB4MDAwNDAwMDB9LAorCXsweDAwMDAwMDdjLCAweDAwMDA4MGMwfSwKKwl7MHgwMDAwMDA3ZCwgMHgwOTAwMDAwMH0sCisJezB4MDAwMDAwN2UsIDB4MDAyMTA0MDR9LAorCXsweDAwMDAwMDgxLCAweDA4YThlODAwfSwKKwl7MHgwMDAwMDA4MiwgMHgwMDAzMDQ0NH0sCisJezB4MDAwMDAwODMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAwMDg1LCAweDAwMDAwMDAxfSwKKwl7MHgwMDAwMDA4NiwgMHgwMDAwMDAwMn0sCisJezB4MDAwMDAwODcsIDB4NDg0OTAwMDB9LAorCXsweDAwMDAwMDg4LCAweDIwMjQ0NjQ3fSwKKwl7MHgwMDAwMDA4OSwgMHgwMDAwMDAwNX0sCisJezB4MDAwMDAwOGIsIDB4NjYwMzAwMDB9LAorCXsweDAwMDAwMDhjLCAweDAwMDA2NjAzfSwKKwl7MHgwMDAwMDA4ZCwgMHgwMDAwMDEwMH0sCisJezB4MDAwMDAwOGYsIDB4MDAwMDFjMGF9LAorCXsweDAwMDAwMDkwLCAweGZmMDAwMDAxfSwKKwl7MHgwMDAwMDA5NCwgMHgwMDEwMTEwMX0sCisJezB4MDAwMDAwOTUsIDB4MDAwMDBmZmZ9LAorCXsweDAwMDAwMDk2LCAweDAwMTE2ZmZmfSwKKwl7MHgwMDAwMDA5NywgMHg2MDAxMDAwMH0sCisJezB4MDAwMDAwOTgsIDB4MTAwMTAwMDB9LAorCXsweDAwMDAwMDk5LCAweDAwMDA2MDAwfSwKKwl7MHgwMDAwMDA5YSwgMHgwMDAwMTAwMH0sCisJezB4MDAwMDAwOWYsIDB4MDA5NDZhMDB9Cit9OworCitzdGF0aWMgY29uc3QgdTMyIHR1cmtzX2lvX21jX3JlZ3NbQlRDX0lPX01DX1JFR1NfU0laRV1bMl0gPSB7CisJezB4MDAwMDAwNzcsIDB4ZmYwMTAxMDB9LAorCXsweDAwMDAwMDc4LCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMDA3OSwgMHgwMDAwMTQzNH0sCisJezB4MDAwMDAwN2EsIDB4Y2MwOGVjMDh9LAorCXsweDAwMDAwMDdiLCAweDAwMDQwMDAwfSwKKwl7MHgwMDAwMDA3YywgMHgwMDAwODBjMH0sCisJezB4MDAwMDAwN2QsIDB4MDkwMDAwMDB9LAorCXsweDAwMDAwMDdlLCAweDAwMjEwNDA0fSwKKwl7MHgwMDAwMDA4MSwgMHgwOGE4ZTgwMH0sCisJezB4MDAwMDAwODIsIDB4MDAwMzA0NDR9LAorCXsweDAwMDAwMDgzLCAweDAwMDAwMDAwfSwKKwl7MHgwMDAwMDA4NSwgMHgwMDAwMDAwMX0sCisJezB4MDAwMDAwODYsIDB4MDAwMDAwMDJ9LAorCXsweDAwMDAwMDg3LCAweDQ4NDkwMDAwfSwKKwl7MHgwMDAwMDA4OCwgMHgyMDI0NDY0N30sCisJezB4MDAwMDAwODksIDB4MDAwMDAwMDV9LAorCXsweDAwMDAwMDhiLCAweDY2MDMwMDAwfSwKKwl7MHgwMDAwMDA4YywgMHgwMDAwNjYwM30sCisJezB4MDAwMDAwOGQsIDB4MDAwMDAxMDB9LAorCXsweDAwMDAwMDhmLCAweDAwMDAxYzBhfSwKKwl7MHgwMDAwMDA5MCwgMHhmZjAwMDAwMX0sCisJezB4MDAwMDAwOTQsIDB4MDAxMDExMDF9LAorCXsweDAwMDAwMDk1LCAweDAwMDAwZmZmfSwKKwl7MHgwMDAwMDA5NiwgMHgwMDExNmZmZn0sCisJezB4MDAwMDAwOTcsIDB4NjAwMTAwMDB9LAorCXsweDAwMDAwMDk4LCAweDEwMDEwMDAwfSwKKwl7MHgwMDAwMDA5OSwgMHgwMDAwNjAwMH0sCisJezB4MDAwMDAwOWEsIDB4MDAwMDEwMDB9LAorCXsweDAwMDAwMDlmLCAweDAwOTM2YTAwfQorfTsKKworc3RhdGljIGNvbnN0IHUzMiBjYWljb3NfaW9fbWNfcmVnc1tCVENfSU9fTUNfUkVHU19TSVpFXVsyXSA9IHsKKwl7MHgwMDAwMDA3NywgMHhmZjAxMDEwMH0sCisJezB4MDAwMDAwNzgsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAwMDc5LCAweDAwMDAxNDM0fSwKKwl7MHgwMDAwMDA3YSwgMHhjYzA4ZWMwOH0sCisJezB4MDAwMDAwN2IsIDB4MDAwNDAwMDB9LAorCXsweDAwMDAwMDdjLCAweDAwMDA4MGMwfSwKKwl7MHgwMDAwMDA3ZCwgMHgwOTAwMDAwMH0sCisJezB4MDAwMDAwN2UsIDB4MDAyMTA0MDR9LAorCXsweDAwMDAwMDgxLCAweDA4YThlODAwfSwKKwl7MHgwMDAwMDA4MiwgMHgwMDAzMDQ0NH0sCisJezB4MDAwMDAwODMsIDB4MDAwMDAwMDB9LAorCXsweDAwMDAwMDg1LCAweDAwMDAwMDAxfSwKKwl7MHgwMDAwMDA4NiwgMHgwMDAwMDAwMn0sCisJezB4MDAwMDAwODcsIDB4NDg0OTAwMDB9LAorCXsweDAwMDAwMDg4LCAweDIwMjQ0NjQ3fSwKKwl7MHgwMDAwMDA4OSwgMHgwMDAwMDAwNX0sCisJezB4MDAwMDAwOGIsIDB4NjYwMzAwMDB9LAorCXsweDAwMDAwMDhjLCAweDAwMDA2NjAzfSwKKwl7MHgwMDAwMDA4ZCwgMHgwMDAwMDEwMH0sCisJezB4MDAwMDAwOGYsIDB4MDAwMDFjMGF9LAorCXsweDAwMDAwMDkwLCAweGZmMDAwMDAxfSwKKwl7MHgwMDAwMDA5NCwgMHgwMDEwMTEwMX0sCisJezB4MDAwMDAwOTUsIDB4MDAwMDBmZmZ9LAorCXsweDAwMDAwMDk2LCAweDAwMTE2ZmZmfSwKKwl7MHgwMDAwMDA5NywgMHg2MDAxMDAwMH0sCisJezB4MDAwMDAwOTgsIDB4MTAwMTAwMDB9LAorCXsweDAwMDAwMDk5LCAweDAwMDA2MDAwfSwKKwl7MHgwMDAwMDA5YSwgMHgwMDAwMTAwMH0sCisJezB4MDAwMDAwOWYsIDB4MDA5MTZhMDB9Cit9OworCitpbnQgYnRjX21jX2xvYWRfbWljcm9jb2RlKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQoreworCWNvbnN0IF9fYmUzMiAqZndfZGF0YTsKKwl1MzIgbWVtX3R5cGUsIHJ1bm5pbmcsIGJsYWNrb3V0ID0gMDsKKwl1MzIgKmlvX21jX3JlZ3M7CisJaW50IGk7CisKKwlpZiAoIXJkZXYtPm1jX2Z3KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXN3aXRjaCAocmRldi0+ZmFtaWx5KSB7CisJY2FzZSBDSElQX0JBUlRTOgorCQlpb19tY19yZWdzID0gKHUzMiAqKSZiYXJ0c19pb19tY19yZWdzOworCQlicmVhazsKKwljYXNlIENISVBfVFVSS1M6CisJCWlvX21jX3JlZ3MgPSAodTMyICopJnR1cmtzX2lvX21jX3JlZ3M7CisJCWJyZWFrOworCWNhc2UgQ0hJUF9DQUlDT1M6CisJZGVmYXVsdDoKKwkJaW9fbWNfcmVncyA9ICh1MzIgKikmY2FpY29zX2lvX21jX3JlZ3M7CisJCWJyZWFrOworCX0KKworCW1lbV90eXBlID0gKFJSRUczMihNQ19TRVFfTUlTQzApICYgTUNfU0VRX01JU0MwX0dERFI1X01BU0spID4+IE1DX1NFUV9NSVNDMF9HRERSNV9TSElGVDsKKwlydW5uaW5nID0gUlJFRzMyKE1DX1NFUV9TVVBfQ05UTCkgJiBSVU5fTUFTSzsKKworCWlmICgobWVtX3R5cGUgPT0gTUNfU0VRX01JU0MwX0dERFI1X1ZBTFVFKSAmJiAocnVubmluZyA9PSAwKSkgeworCQlpZiAocnVubmluZykgeworCQkJYmxhY2tvdXQgPSBSUkVHMzIoTUNfU0hBUkVEX0JMQUNLT1VUX0NOVEwpOworCQkJV1JFRzMyKE1DX1NIQVJFRF9CTEFDS09VVF9DTlRMLCAxKTsKKwkJfQorCisJCS8qIHJlc2V0IHRoZSBlbmdpbmUgYW5kIHNldCB0byB3cml0YWJsZSAqLworCQlXUkVHMzIoTUNfU0VRX1NVUF9DTlRMLCAweDAwMDAwMDA4KTsKKwkJV1JFRzMyKE1DX1NFUV9TVVBfQ05UTCwgMHgwMDAwMDAxMCk7CisKKwkJLyogbG9hZCBtYyBpbyByZWdzICovCisJCWZvciAoaSA9IDA7IGkgPCBCVENfSU9fTUNfUkVHU19TSVpFOyBpKyspIHsKKwkJCVdSRUczMihNQ19TRVFfSU9fREVCVUdfSU5ERVgsIGlvX21jX3JlZ3NbKGkgPDwgMSldKTsKKwkJCVdSRUczMihNQ19TRVFfSU9fREVCVUdfREFUQSwgaW9fbWNfcmVnc1soaSA8PCAxKSArIDFdKTsKKwkJfQorCQkvKiBsb2FkIHRoZSBNQyB1Y29kZSAqLworCQlmd19kYXRhID0gKGNvbnN0IF9fYmUzMiAqKXJkZXYtPm1jX2Z3LT5kYXRhOworCQlmb3IgKGkgPSAwOyBpIDwgQlRDX01DX1VDT0RFX1NJWkU7IGkrKykKKwkJCVdSRUczMihNQ19TRVFfU1VQX1BHTSwgYmUzMl90b19jcHVwKGZ3X2RhdGErKykpOworCisJCS8qIHB1dCB0aGUgZW5naW5lIGJhY2sgaW50byB0aGUgYWN0aXZlIHN0YXRlICovCisJCVdSRUczMihNQ19TRVFfU1VQX0NOVEwsIDB4MDAwMDAwMDgpOworCQlXUkVHMzIoTUNfU0VRX1NVUF9DTlRMLCAweDAwMDAwMDA0KTsKKwkJV1JFRzMyKE1DX1NFUV9TVVBfQ05UTCwgMHgwMDAwMDAwMSk7CisKKwkJLyogd2FpdCBmb3IgdHJhaW5pbmcgdG8gY29tcGxldGUgKi8KKwkJd2hpbGUgKCEoUlJFRzMyKE1DX0lPX1BBRF9DTlRMX0QwKSAmIE1FTV9GQUxMX09VVF9DTUQpKQorCQkJdWRlbGF5KDEwKTsKKworCQlpZiAocnVubmluZykKKwkJCVdSRUczMihNQ19TSEFSRURfQkxBQ0tPVVRfQ05UTCwgYmxhY2tvdXQpOworCX0KKworCXJldHVybiAwOworfQorCitpbnQgbmlfaW5pdF9taWNyb2NvZGUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldjsKKwljb25zdCBjaGFyICpjaGlwX25hbWU7CisJY29uc3QgY2hhciAqcmxjX2NoaXBfbmFtZTsKKwlzaXplX3QgcGZwX3JlcV9zaXplLCBtZV9yZXFfc2l6ZSwgcmxjX3JlcV9zaXplLCBtY19yZXFfc2l6ZTsKKwljaGFyIGZ3X25hbWVbMzBdOworCWludCBlcnI7CisKKwlEUk1fREVCVUcoIlxuIik7CisKKwlwZGV2ID0gcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyX3NpbXBsZSgicmFkZW9uX2NwIiwgMCwgTlVMTCwgMCk7CisJZXJyID0gSVNfRVJSKHBkZXYpOworCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJyYWRlb25fY3A6IEZhaWxlZCB0byByZWdpc3RlciBmaXJtd2FyZVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXN3aXRjaCAocmRldi0+ZmFtaWx5KSB7CisJY2FzZSBDSElQX0JBUlRTOgorCQljaGlwX25hbWUgPSAiQkFSVFMiOworCQlybGNfY2hpcF9uYW1lID0gIkJUQyI7CisJCWJyZWFrOworCWNhc2UgQ0hJUF9UVVJLUzoKKwkJY2hpcF9uYW1lID0gIlRVUktTIjsKKwkJcmxjX2NoaXBfbmFtZSA9ICJCVEMiOworCQlicmVhazsKKwljYXNlIENISVBfQ0FJQ09TOgorCQljaGlwX25hbWUgPSAiQ0FJQ09TIjsKKwkJcmxjX2NoaXBfbmFtZSA9ICJCVEMiOworCQlicmVhazsKKwlkZWZhdWx0OiBCVUcoKTsKKwl9CisKKwlwZnBfcmVxX3NpemUgPSBFVkVSR1JFRU5fUEZQX1VDT0RFX1NJWkUgKiA0OworCW1lX3JlcV9zaXplID0gRVZFUkdSRUVOX1BNNF9VQ09ERV9TSVpFICogNDsKKwlybGNfcmVxX3NpemUgPSBFVkVSR1JFRU5fUkxDX1VDT0RFX1NJWkUgKiA0OworCW1jX3JlcV9zaXplID0gQlRDX01DX1VDT0RFX1NJWkUgKiA0OworCisJRFJNX0lORk8oIkxvYWRpbmcgJXMgTWljcm9jb2RlXG4iLCBjaGlwX25hbWUpOworCisJc25wcmludGYoZndfbmFtZSwgc2l6ZW9mKGZ3X25hbWUpLCAicmFkZW9uLyVzX3BmcC5iaW4iLCBjaGlwX25hbWUpOworCWVyciA9IHJlcXVlc3RfZmlybXdhcmUoJnJkZXYtPnBmcF9mdywgZndfbmFtZSwgJnBkZXYtPmRldik7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisJaWYgKHJkZXYtPnBmcF9mdy0+c2l6ZSAhPSBwZnBfcmVxX3NpemUpIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCSAgICAgICAibmlfY3A6IEJvZ3VzIGxlbmd0aCAlenUgaW4gZmlybXdhcmUgXCIlc1wiXG4iLAorCQkgICAgICAgcmRldi0+cGZwX2Z3LT5zaXplLCBmd19uYW1lKTsKKwkJZXJyID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCisJc25wcmludGYoZndfbmFtZSwgc2l6ZW9mKGZ3X25hbWUpLCAicmFkZW9uLyVzX21lLmJpbiIsIGNoaXBfbmFtZSk7CisJZXJyID0gcmVxdWVzdF9maXJtd2FyZSgmcmRldi0+bWVfZncsIGZ3X25hbWUsICZwZGV2LT5kZXYpOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCWlmIChyZGV2LT5tZV9mdy0+c2l6ZSAhPSBtZV9yZXFfc2l6ZSkgeworCQlwcmludGsoS0VSTl9FUlIKKwkJICAgICAgICJuaV9jcDogQm9ndXMgbGVuZ3RoICV6dSBpbiBmaXJtd2FyZSBcIiVzXCJcbiIsCisJCSAgICAgICByZGV2LT5tZV9mdy0+c2l6ZSwgZndfbmFtZSk7CisJCWVyciA9IC1FSU5WQUw7CisJfQorCisJc25wcmludGYoZndfbmFtZSwgc2l6ZW9mKGZ3X25hbWUpLCAicmFkZW9uLyVzX3JsYy5iaW4iLCBybGNfY2hpcF9uYW1lKTsKKwllcnIgPSByZXF1ZXN0X2Zpcm13YXJlKCZyZGV2LT5ybGNfZncsIGZ3X25hbWUsICZwZGV2LT5kZXYpOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCWlmIChyZGV2LT5ybGNfZnctPnNpemUgIT0gcmxjX3JlcV9zaXplKSB7CisJCXByaW50ayhLRVJOX0VSUgorCQkgICAgICAgIm5pX3JsYzogQm9ndXMgbGVuZ3RoICV6dSBpbiBmaXJtd2FyZSBcIiVzXCJcbiIsCisJCSAgICAgICByZGV2LT5ybGNfZnctPnNpemUsIGZ3X25hbWUpOworCQllcnIgPSAtRUlOVkFMOworCX0KKworCXNucHJpbnRmKGZ3X25hbWUsIHNpemVvZihmd19uYW1lKSwgInJhZGVvbi8lc19tYy5iaW4iLCBjaGlwX25hbWUpOworCWVyciA9IHJlcXVlc3RfZmlybXdhcmUoJnJkZXYtPm1jX2Z3LCBmd19uYW1lLCAmcGRldi0+ZGV2KTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKwlpZiAocmRldi0+bWNfZnctPnNpemUgIT0gbWNfcmVxX3NpemUpIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCSAgICAgICAibmlfbWM6IEJvZ3VzIGxlbmd0aCAlenUgaW4gZmlybXdhcmUgXCIlc1wiXG4iLAorCQkgICAgICAgcmRldi0+bWNfZnctPnNpemUsIGZ3X25hbWUpOworCQllcnIgPSAtRUlOVkFMOworCX0KK291dDoKKwlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcihwZGV2KTsKKworCWlmIChlcnIpIHsKKwkJaWYgKGVyciAhPSAtRUlOVkFMKQorCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkgICAgICAgIm5pX2NwOiBGYWlsZWQgdG8gbG9hZCBmaXJtd2FyZSBcIiVzXCJcbiIsCisJCQkgICAgICAgZndfbmFtZSk7CisJCXJlbGVhc2VfZmlybXdhcmUocmRldi0+cGZwX2Z3KTsKKwkJcmRldi0+cGZwX2Z3ID0gTlVMTDsKKwkJcmVsZWFzZV9maXJtd2FyZShyZGV2LT5tZV9mdyk7CisJCXJkZXYtPm1lX2Z3ID0gTlVMTDsKKwkJcmVsZWFzZV9maXJtd2FyZShyZGV2LT5ybGNfZncpOworCQlyZGV2LT5ybGNfZncgPSBOVUxMOworCQlyZWxlYXNlX2Zpcm13YXJlKHJkZXYtPm1jX2Z3KTsKKwkJcmRldi0+bWNfZncgPSBOVUxMOworCX0KKwlyZXR1cm4gZXJyOworfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL25pX3JlZy5oIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9uaV9yZWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZGI3YjdkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9uaV9yZWcuaApAQCAtMCwwICsxLDg2IEBACisvKgorICogQ29weXJpZ2h0IDIwMTAgQWR2YW5jZWQgTWljcm8gRGV2aWNlcywgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIENPUFlSSUdIVCBIT0xERVIoUykgT1IgQVVUSE9SKFMpIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIEF1dGhvcnM6IEFsZXggRGV1Y2hlcgorICovCisjaWZuZGVmIF9fTklfUkVHX0hfXworI2RlZmluZSBfX05JX1JFR19IX18KKworLyogbm9ydGhlcm4gaXNsYW5kcyAtIERDRTUgKi8KKworI2RlZmluZSBOSV9JTlBVVF9HQU1NQV9DT05UUk9MICAgICAgICAgICAgICAgICAgICAgICAgIDB4Njg0MAorIyAgICAgICBkZWZpbmUgTklfR1JQSF9JTlBVVF9HQU1NQV9NT0RFKHgpICAgICAgICAgICAgICgoKHgpICYgMHgzKSA8PCAwKQorIyAgICAgICBkZWZpbmUgTklfSU5QVVRfR0FNTUFfVVNFX0xVVCAgICAgICAgICAgICAgICAgIDAKKyMgICAgICAgZGVmaW5lIE5JX0lOUFVUX0dBTU1BX0JZUEFTUyAgICAgICAgICAgICAgICAgICAxCisjICAgICAgIGRlZmluZSBOSV9JTlBVVF9HQU1NQV9TUkdCXzI0ICAgICAgICAgICAgICAgICAgMgorIyAgICAgICBkZWZpbmUgTklfSU5QVVRfR0FNTUFfWFZZQ0NfMjIyICAgICAgICAgICAgICAgIDMKKyMgICAgICAgZGVmaW5lIE5JX09WTF9JTlBVVF9HQU1NQV9NT0RFKHgpICAgICAgICAgICAgICAoKCh4KSAmIDB4MykgPDwgNCkKKworI2RlZmluZSBOSV9QUkVTQ0FMRV9HUlBIX0NPTlRST0wgICAgICAgICAgICAgICAgICAgICAgIDB4NjhiNAorIyAgICAgICBkZWZpbmUgTklfR1JQSF9QUkVTQ0FMRV9CWVBBU1MgICAgICAgICAgICAgICAgICgxIDw8IDQpCisKKyNkZWZpbmUgTklfUFJFU0NBTEVfT1ZMX0NPTlRST0wgICAgICAgICAgICAgICAgICAgICAgICAweDY4YzQKKyMgICAgICAgZGVmaW5lIE5JX09WTF9QUkVTQ0FMRV9CWVBBU1MgICAgICAgICAgICAgICAgICAoMSA8PCA0KQorCisjZGVmaW5lIE5JX0lOUFVUX0NTQ19DT05UUk9MICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg2OGQ0CisjICAgICAgIGRlZmluZSBOSV9JTlBVVF9DU0NfR1JQSF9NT0RFKHgpICAgICAgICAgICAgICAgKCgoeCkgJiAweDMpIDw8IDApCisjICAgICAgIGRlZmluZSBOSV9JTlBVVF9DU0NfQllQQVNTICAgICAgICAgICAgICAgICAgICAgMAorIyAgICAgICBkZWZpbmUgTklfSU5QVVRfQ1NDX1BST0dfQ09FRkYgICAgICAgICAgICAgICAgIDEKKyMgICAgICAgZGVmaW5lIE5JX0lOUFVUX0NTQ19QUk9HX1NIQVJFRF9NQVRSSVhBICAgICAgICAyCisjICAgICAgIGRlZmluZSBOSV9JTlBVVF9DU0NfT1ZMX01PREUoeCkgICAgICAgICAgICAgICAgKCgoeCkgJiAweDMpIDw8IDQpCisKKyNkZWZpbmUgTklfT1VUUFVUX0NTQ19DT05UUk9MICAgICAgICAgICAgICAgICAgICAgICAgICAweDY4ZjAKKyMgICAgICAgZGVmaW5lIE5JX09VVFBVVF9DU0NfR1JQSF9NT0RFKHgpICAgICAgICAgICAgICAoKCh4KSAmIDB4NykgPDwgMCkKKyMgICAgICAgZGVmaW5lIE5JX09VVFBVVF9DU0NfQllQQVNTICAgICAgICAgICAgICAgICAgICAwCisjICAgICAgIGRlZmluZSBOSV9PVVRQVVRfQ1NDX1RWX1JHQiAgICAgICAgICAgICAgICAgICAgMQorIyAgICAgICBkZWZpbmUgTklfT1VUUFVUX0NTQ19ZQ0JDUl82MDEgICAgICAgICAgICAgICAgIDIKKyMgICAgICAgZGVmaW5lIE5JX09VVFBVVF9DU0NfWUNCQ1JfNzA5ICAgICAgICAgICAgICAgICAzCisjICAgICAgIGRlZmluZSBOSV9PVVRQVVRfQ1NDX1BST0dfQ09FRkYgICAgICAgICAgICAgICAgNAorIyAgICAgICBkZWZpbmUgTklfT1VUUFVUX0NTQ19QUk9HX1NIQVJFRF9NQVRSSVhCICAgICAgIDUKKyMgICAgICAgZGVmaW5lIE5JX09VVFBVVF9DU0NfT1ZMX01PREUoeCkgICAgICAgICAgICAgICAoKCh4KSAmIDB4NykgPDwgNCkKKworI2RlZmluZSBOSV9ERUdBTU1BX0NPTlRST0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4Njk2MAorIyAgICAgICBkZWZpbmUgTklfR1JQSF9ERUdBTU1BX01PREUoeCkgICAgICAgICAgICAgICAgICgoKHgpICYgMHgzKSA8PCAwKQorIyAgICAgICBkZWZpbmUgTklfREVHQU1NQV9CWVBBU1MgICAgICAgICAgICAgICAgICAgICAgIDAKKyMgICAgICAgZGVmaW5lIE5JX0RFR0FNTUFfU1JHQl8yNCAgICAgICAgICAgICAgICAgICAgICAxCisjICAgICAgIGRlZmluZSBOSV9ERUdBTU1BX1hWWUNDXzIyMiAgICAgICAgICAgICAgICAgICAgMgorIyAgICAgICBkZWZpbmUgTklfT1ZMX0RFR0FNTUFfTU9ERSh4KSAgICAgICAgICAgICAgICAgICgoKHgpICYgMHgzKSA8PCA0KQorIyAgICAgICBkZWZpbmUgTklfSUNPTl9ERUdBTU1BX01PREUoeCkgICAgICAgICAgICAgICAgICgoKHgpICYgMHgzKSA8PCA4KQorIyAgICAgICBkZWZpbmUgTklfQ1VSU09SX0RFR0FNTUFfTU9ERSh4KSAgICAgICAgICAgICAgICgoKHgpICYgMHgzKSA8PCAxMikKKworI2RlZmluZSBOSV9HQU1VVF9SRU1BUF9DT05UUk9MICAgICAgICAgICAgICAgICAgICAgICAgIDB4Njk2NAorIyAgICAgICBkZWZpbmUgTklfR1JQSF9HQU1VVF9SRU1BUF9NT0RFKHgpICAgICAgICAgICAgICgoKHgpICYgMHgzKSA8PCAwKQorIyAgICAgICBkZWZpbmUgTklfR0FNVVRfUkVNQVBfQllQQVNTICAgICAgICAgICAgICAgICAgIDAKKyMgICAgICAgZGVmaW5lIE5JX0dBTVVUX1JFTUFQX1BST0dfQ09FRkYgICAgICAgICAgICAgICAxCisjICAgICAgIGRlZmluZSBOSV9HQU1VVF9SRU1BUF9QUk9HX1NIQVJFRF9NQVRSSVhBICAgICAgMgorIyAgICAgICBkZWZpbmUgTklfR0FNVVRfUkVNQVBfUFJPR19TSEFSRURfTUFUUklYQiAgICAgIDMKKyMgICAgICAgZGVmaW5lIE5JX09WTF9HQU1VVF9SRU1BUF9NT0RFKHgpICAgICAgICAgICAgICAoKCh4KSAmIDB4MykgPDwgNCkKKworI2RlZmluZSBOSV9SRUdBTU1BX0NPTlRST0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NmE4MAorIyAgICAgICBkZWZpbmUgTklfR1JQSF9SRUdBTU1BX01PREUoeCkgICAgICAgICAgICAgICAgICgoKHgpICYgMHg3KSA8PCAwKQorIyAgICAgICBkZWZpbmUgTklfUkVHQU1NQV9CWVBBU1MgICAgICAgICAgICAgICAgICAgICAgIDAKKyMgICAgICAgZGVmaW5lIE5JX1JFR0FNTUFfU1JHQl8yNCAgICAgICAgICAgICAgICAgICAgICAxCisjICAgICAgIGRlZmluZSBOSV9SRUdBTU1BX1hWWUNDXzIyMiAgICAgICAgICAgICAgICAgICAgMgorIyAgICAgICBkZWZpbmUgTklfUkVHQU1NQV9QUk9HX0EgICAgICAgICAgICAgICAgICAgICAgIDMKKyMgICAgICAgZGVmaW5lIE5JX1JFR0FNTUFfUFJPR19CICAgICAgICAgICAgICAgICAgICAgICA0CisjICAgICAgIGRlZmluZSBOSV9PVkxfUkVHQU1NQV9NT0RFKHgpICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDcpIDw8IDQpCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9uaWQuaCBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vbmlkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjdiNDQ1MwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vbmlkLmgKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDEwIEFkdmFuY2VkIE1pY3JvIERldmljZXMsIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBDT1BZUklHSFQgSE9MREVSKFMpIE9SIEFVVEhPUihTKSBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBBdXRob3JzOiBBbGV4IERldWNoZXIKKyAqLworI2lmbmRlZiBOSV9ICisjZGVmaW5lIE5JX0gKKworI2RlZmluZSBNQ19TSEFSRURfQkxBQ0tPVVRfQ05UTCAgICAgICAgICAgCQkweDIwYWMKKyNkZWZpbmUgTUNfU0VRX1NVUF9DTlRMICAgICAgICAgICAJCQkweDI4YzgKKyNkZWZpbmUJCVJVTl9NQVNLICAgICAgCQkJCSgxIDw8IDApCisjZGVmaW5lIE1DX1NFUV9TVVBfUEdNICAgICAgICAgICAJCQkweDI4Y2MKKyNkZWZpbmUgTUNfSU9fUEFEX0NOVExfRDAgICAgICAgICAgIAkJCTB4MjlkMAorI2RlZmluZQkJTUVNX0ZBTExfT1VUX0NNRCAgICAgIAkJCSgxIDw8IDgpCisjZGVmaW5lIE1DX1NFUV9NSVNDMCAgICAgICAgICAgCQkJCTB4MmEwMAorI2RlZmluZQkJTUNfU0VRX01JU0MwX0dERFI1X1NISUZUICAgICAgCQkyOAorI2RlZmluZQkJTUNfU0VRX01JU0MwX0dERFI1X01BU0sgICAgICAJCTB4ZjAwMDAwMDAKKyNkZWZpbmUJCU1DX1NFUV9NSVNDMF9HRERSNV9WQUxVRSAgICAgIAkJNQorI2RlZmluZSBNQ19TRVFfSU9fREVCVUdfSU5ERVggICAgICAgICAgIAkJMHgyYTQ0CisjZGVmaW5lIE1DX1NFUV9JT19ERUJVR19EQVRBICAgICAgICAgICAJCQkweDJhNDgKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcjEwMC5jIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yMTAwLmMKaW5kZXggOGUxMGFhOS4uZjYzNzU5NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yMTAwLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yMTAwLmMKQEAgLTY4LDYgKzY4LDU2IEBACiAgKiByMTAwLHJ2MTAwLHJzMTAwLHJ2MjAwLHJzMjAwLHIyMDAscnYyNTAscnMzMDAscnYyODAKICAqLwogCit2b2lkIHIxMDBfcHJlX3BhZ2VfZmxpcChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwgaW50IGNydGMpCit7CisJc3RydWN0IHJhZGVvbl9jcnRjICpyYWRlb25fY3J0YyA9IHJkZXYtPm1vZGVfaW5mby5jcnRjc1tjcnRjXTsKKwl1MzIgdG1wOworCisJLyogbWFrZSBzdXJlIGZsaXAgaXMgYXQgdmIgcmF0aGVyIHRoYW4gaGIgKi8KKwl0bXAgPSBSUkVHMzIoUkFERU9OX0NSVENfT0ZGU0VUX0NOVEwgKyByYWRlb25fY3J0Yy0+Y3J0Y19vZmZzZXQpOworCXRtcCAmPSB+UkFERU9OX0NSVENfT0ZGU0VUX0ZMSVBfQ05UTDsKKwkvKiBtYWtlIHN1cmUgcGVuZGluZyBiaXQgaXMgYXNzZXJ0ZWQgKi8KKwl0bXAgfD0gUkFERU9OX0NSVENfR1VJX1RSSUdfT0ZGU0VUX0xFRlRfRU47CisJV1JFRzMyKFJBREVPTl9DUlRDX09GRlNFVF9DTlRMICsgcmFkZW9uX2NydGMtPmNydGNfb2Zmc2V0LCB0bXApOworCisJLyogc2V0IHBhZ2VmbGlwIHRvIGhhcHBlbiBhcyBsYXRlIGFzIHBvc3NpYmxlIGluIHRoZSB2YmxhbmsgaW50ZXJ2YWwuCisJICogc2FtZSBmaWVsZCBmb3IgY3J0YzEvMgorCSAqLworCXRtcCA9IFJSRUczMihSQURFT05fQ1JUQ19HRU5fQ05UTCk7CisJdG1wICY9IH5SQURFT05fQ1JUQ19WU1RBVF9NT0RFX01BU0s7CisJV1JFRzMyKFJBREVPTl9DUlRDX0dFTl9DTlRMLCB0bXApOworCisJLyogZW5hYmxlIHRoZSBwZmxpcCBpbnQgKi8KKwlyYWRlb25faXJxX2ttc19wZmxpcF9pcnFfZ2V0KHJkZXYsIGNydGMpOworfQorCit2b2lkIHIxMDBfcG9zdF9wYWdlX2ZsaXAoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIGludCBjcnRjKQoreworCS8qIGRpc2FibGUgdGhlIHBmbGlwIGludCAqLworCXJhZGVvbl9pcnFfa21zX3BmbGlwX2lycV9wdXQocmRldiwgY3J0Yyk7Cit9CisKK3UzMiByMTAwX3BhZ2VfZmxpcChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwgaW50IGNydGNfaWQsIHU2NCBjcnRjX2Jhc2UpCit7CisJc3RydWN0IHJhZGVvbl9jcnRjICpyYWRlb25fY3J0YyA9IHJkZXYtPm1vZGVfaW5mby5jcnRjc1tjcnRjX2lkXTsKKwl1MzIgdG1wID0gKCh1MzIpY3J0Y19iYXNlKSB8IFJBREVPTl9DUlRDX09GRlNFVF9fT0ZGU0VUX0xPQ0s7CisKKwkvKiBMb2NrIHRoZSBncmFwaGljcyB1cGRhdGUgbG9jayAqLworCS8qIHVwZGF0ZSB0aGUgc2Nhbm91dCBhZGRyZXNzZXMgKi8KKwlXUkVHMzIoUkFERU9OX0NSVENfT0ZGU0VUICsgcmFkZW9uX2NydGMtPmNydGNfb2Zmc2V0LCB0bXApOworCisJLyogV2FpdCBmb3IgdXBkYXRlX3BlbmRpbmcgdG8gZ28gaGlnaC4gKi8KKwl3aGlsZSAoIShSUkVHMzIoUkFERU9OX0NSVENfT0ZGU0VUICsgcmFkZW9uX2NydGMtPmNydGNfb2Zmc2V0KSAmIFJBREVPTl9DUlRDX09GRlNFVF9fR1VJX1RSSUdfT0ZGU0VUKSk7CisJRFJNX0RFQlVHKCJVcGRhdGUgcGVuZGluZyBub3cgaGlnaC4gVW5sb2NraW5nIHZ1cGRhdGVfbG9jay5cbiIpOworCisJLyogVW5sb2NrIHRoZSBsb2NrLCBzbyBkb3VibGUtYnVmZmVyaW5nIGNhbiB0YWtlIHBsYWNlIGluc2lkZSB2YmxhbmsgKi8KKwl0bXAgJj0gflJBREVPTl9DUlRDX09GRlNFVF9fT0ZGU0VUX0xPQ0s7CisJV1JFRzMyKFJBREVPTl9DUlRDX09GRlNFVCArIHJhZGVvbl9jcnRjLT5jcnRjX29mZnNldCwgdG1wKTsKKworCS8qIFJldHVybiBjdXJyZW50IHVwZGF0ZV9wZW5kaW5nIHN0YXR1czogKi8KKwlyZXR1cm4gUlJFRzMyKFJBREVPTl9DUlRDX09GRlNFVCArIHJhZGVvbl9jcnRjLT5jcnRjX29mZnNldCkgJiBSQURFT05fQ1JUQ19PRkZTRVRfX0dVSV9UUklHX09GRlNFVDsKK30KKwogdm9pZCByMTAwX3BtX2dldF9keW5wbV9zdGF0ZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKIHsKIAlpbnQgaTsKQEAgLTUyNiwxMCArNTc2LDEyIEBACiAJaWYgKHJkZXYtPmlycS5ndWlfaWRsZSkgewogCQl0bXAgfD0gUkFERU9OX0dVSV9JRExFX01BU0s7CiAJfQotCWlmIChyZGV2LT5pcnEuY3J0Y192YmxhbmtfaW50WzBdKSB7CisJaWYgKHJkZXYtPmlycS5jcnRjX3ZibGFua19pbnRbMF0gfHwKKwkgICAgcmRldi0+aXJxLnBmbGlwWzBdKSB7CiAJCXRtcCB8PSBSQURFT05fQ1JUQ19WQkxBTktfTUFTSzsKIAl9Ci0JaWYgKHJkZXYtPmlycS5jcnRjX3ZibGFua19pbnRbMV0pIHsKKwlpZiAocmRldi0+aXJxLmNydGNfdmJsYW5rX2ludFsxXSB8fAorCSAgICByZGV2LT5pcnEucGZsaXBbMV0pIHsKIAkJdG1wIHw9IFJBREVPTl9DUlRDMl9WQkxBTktfTUFTSzsKIAl9CiAJaWYgKHJkZXYtPmlycS5ocGRbMF0pIHsKQEAgLTYwMCwxNCArNjUyLDIyIEBACiAJCX0KIAkJLyogVmVydGljYWwgYmxhbmsgaW50ZXJydXB0cyAqLwogCQlpZiAoc3RhdHVzICYgUkFERU9OX0NSVENfVkJMQU5LX1NUQVQpIHsKLQkJCWRybV9oYW5kbGVfdmJsYW5rKHJkZXYtPmRkZXYsIDApOwotCQkJcmRldi0+cG0udmJsYW5rX3N5bmMgPSB0cnVlOwotCQkJd2FrZV91cCgmcmRldi0+aXJxLnZibGFua19xdWV1ZSk7CisJCQlpZiAocmRldi0+aXJxLmNydGNfdmJsYW5rX2ludFswXSkgeworCQkJCWRybV9oYW5kbGVfdmJsYW5rKHJkZXYtPmRkZXYsIDApOworCQkJCXJkZXYtPnBtLnZibGFua19zeW5jID0gdHJ1ZTsKKwkJCQl3YWtlX3VwKCZyZGV2LT5pcnEudmJsYW5rX3F1ZXVlKTsKKwkJCX0KKwkJCWlmIChyZGV2LT5pcnEucGZsaXBbMF0pCisJCQkJcmFkZW9uX2NydGNfaGFuZGxlX2ZsaXAocmRldiwgMCk7CiAJCX0KIAkJaWYgKHN0YXR1cyAmIFJBREVPTl9DUlRDMl9WQkxBTktfU1RBVCkgewotCQkJZHJtX2hhbmRsZV92YmxhbmsocmRldi0+ZGRldiwgMSk7Ci0JCQlyZGV2LT5wbS52Ymxhbmtfc3luYyA9IHRydWU7Ci0JCQl3YWtlX3VwKCZyZGV2LT5pcnEudmJsYW5rX3F1ZXVlKTsKKwkJCWlmIChyZGV2LT5pcnEuY3J0Y192YmxhbmtfaW50WzFdKSB7CisJCQkJZHJtX2hhbmRsZV92YmxhbmsocmRldi0+ZGRldiwgMSk7CisJCQkJcmRldi0+cG0udmJsYW5rX3N5bmMgPSB0cnVlOworCQkJCXdha2VfdXAoJnJkZXYtPmlycS52YmxhbmtfcXVldWUpOworCQkJfQorCQkJaWYgKHJkZXYtPmlycS5wZmxpcFsxXSkKKwkJCQlyYWRlb25fY3J0Y19oYW5kbGVfZmxpcChyZGV2LCAxKTsKIAkJfQogCQlpZiAoc3RhdHVzICYgUkFERU9OX0ZQX0RFVEVDVF9TVEFUKSB7CiAJCQlxdWV1ZV9ob3RwbHVnID0gdHJ1ZTsKQEAgLTYyMiw3ICs2ODIsNyBAQAogCS8qIHJlc2V0IGd1aSBpZGxlIGFjay4gIHRoZSBzdGF0dXMgYml0IGlzIGJyb2tlbiAqLwogCXJkZXYtPmlycS5ndWlfaWRsZV9hY2tlZCA9IGZhbHNlOwogCWlmIChxdWV1ZV9ob3RwbHVnKQotCQlxdWV1ZV93b3JrKHJkZXYtPndxLCAmcmRldi0+aG90cGx1Z193b3JrKTsKKwkJc2NoZWR1bGVfd29yaygmcmRldi0+aG90cGx1Z193b3JrKTsKIAlpZiAocmRldi0+bXNpX2VuYWJsZWQpIHsKIAkJc3dpdGNoIChyZGV2LT5mYW1pbHkpIHsKIAkJY2FzZSBDSElQX1JTNDAwOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yMTAwZC5oIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yMTAwZC5oCmluZGV4IGIxMjFiNmMuLmVhYjkxNzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcjEwMGQuaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3IxMDBkLmgKQEAgLTU1MSw3ICs1NTEsNyBAQAogI2RlZmluZSAgIFNfMDAwMzYwX0NVUjJfTE9DSyh4KSAgICAgICAgICAgICAgICAgICAgICAgICgoKHgpICYgMHgxKSA8PCAzMSkKICNkZWZpbmUgICBHXzAwMDM2MF9DVVIyX0xPQ0soeCkgICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSA+PiAzMSkgJiAweDEpCiAjZGVmaW5lICAgQ18wMDAzNjBfQ1VSMl9MT0NLICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg3RkZGRkZGRgotI2RlZmluZSBSXzAwMDNDMl9HRU5NT19XVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDNDMAorI2RlZmluZSBSXzAwMDNDMl9HRU5NT19XVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDNDMgogI2RlZmluZSAgIFNfMDAwM0MyX0dFTk1PX01PTk9fQUREUkVTU19CKHgpICAgICAgICAgICAgICgoKHgpICYgMHgxKSA8PCAwKQogI2RlZmluZSAgIEdfMDAwM0MyX0dFTk1PX01PTk9fQUREUkVTU19CKHgpICAgICAgICAgICAgICgoKHgpID4+IDApICYgMHgxKQogI2RlZmluZSAgIENfMDAwM0MyX0dFTk1PX01PTk9fQUREUkVTU19CICAgICAgICAgICAgICAgIDB4RkUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcjMwMC5jIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yMzAwLmMKaW5kZXggY2RlMWQzNC4uZmFlNWU3MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yMzAwLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yMzAwLmMKQEAgLTU1OCwxMCArNTU4LDcgQEAKIAogCS8qIEZJWE1FIHdhaXQgZm9yIGlkbGUgKi8KIAotCWlmIChyZGV2LT5mYW1pbHkgPCBDSElQX1I2MDApCi0JCWxpbmtfd2lkdGhfY250bCA9IFJSRUczMl9QQ0lFKFJBREVPTl9QQ0lFX0xDX0xJTktfV0lEVEhfQ05UTCk7Ci0JZWxzZQotCQlsaW5rX3dpZHRoX2NudGwgPSBSUkVHMzJfUENJRV9QKFJBREVPTl9QQ0lFX0xDX0xJTktfV0lEVEhfQ05UTCk7CisJbGlua193aWR0aF9jbnRsID0gUlJFRzMyX1BDSUUoUkFERU9OX1BDSUVfTENfTElOS19XSURUSF9DTlRMKTsKIAogCXN3aXRjaCAoKGxpbmtfd2lkdGhfY250bCAmIFJBREVPTl9QQ0lFX0xDX0xJTktfV0lEVEhfUkRfTUFTSykgPj4gUkFERU9OX1BDSUVfTENfTElOS19XSURUSF9SRF9TSElGVCkgewogCWNhc2UgUkFERU9OX1BDSUVfTENfTElOS19XSURUSF9YMDoKQEAgLTc0NSw2ICs3NDIsMTEgQEAKIAkJYnJlYWs7CiAJY2FzZSAweDRFMDA6CiAJCS8qIFJCM0RfQ0NUTCAqLworCQlpZiAoKGlkeF92YWx1ZSAmICgxIDw8IDEwKSkgJiYgLyogQ01BU0tfRU5BQkxFICovCisJCSAgICBwLT5yZGV2LT5jbWFza19maWxwICE9IHAtPmZpbHApIHsKKwkJCURSTV9FUlJPUigiSW52YWxpZCBSQjNEX0NDVEw6IENhbm5vdCBlbmFibGUgQ01BU0suXG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CiAJCXRyYWNrLT5udW1fY2IgPSAoKGlkeF92YWx1ZSA+PiA1KSAmIDB4MykgKyAxOwogCQlicmVhazsKIAljYXNlIDB4NEUzODoKQEAgLTc4Nyw2ICs3ODksMTMgQEAKIAkJY2FzZSAxNToKIAkJCXRyYWNrLT5jYltpXS5jcHAgPSAyOwogCQkJYnJlYWs7CisJCWNhc2UgNToKKwkJCWlmIChwLT5yZGV2LT5mYW1pbHkgPCBDSElQX1JWNTE1KSB7CisJCQkJRFJNX0VSUk9SKCJJbnZhbGlkIGNvbG9yIGJ1ZmZlciBmb3JtYXQgKCVkKSFcbiIsCisJCQkJCSAgKChpZHhfdmFsdWUgPj4gMjEpICYgMHhGKSk7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisJCQkvKiBQYXNzIHRocm91Z2guICovCiAJCWNhc2UgNjoKIAkJCXRyYWNrLT5jYltpXS5jcHAgPSA0OwogCQkJYnJlYWs7CkBAIC0xMTk5LDYgKzEyMDgsMTAgQEAKIAkJaWYgKHAtPnJkZXYtPmh5cGVyel9maWxwICE9IHAtPmZpbHApCiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJYnJlYWs7CisJY2FzZSBQQUNLRVQzXzNEX0NMRUFSX0NNQVNLOgorCQlpZiAocC0+cmRldi0+Y21hc2tfZmlscCAhPSBwLT5maWxwKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWJyZWFrOwogCWNhc2UgUEFDS0VUM19OT1A6CiAJCWJyZWFrOwogCWRlZmF1bHQ6CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3IzMDBkLmggYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3IzMDBkLmgKaW5kZXggMGMwMzZjNi4uMWY1MTlhNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yMzAwZC5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcjMwMGQuaApAQCAtNTQsNiArNTQsNyBAQAogI2RlZmluZQkJUEFDS0VUM18zRF9EUkFXX0lNTURfMgkJMHgzNQogI2RlZmluZQkJUEFDS0VUM18zRF9EUkFXX0lORFhfMgkJMHgzNgogI2RlZmluZQkJUEFDS0VUM18zRF9DTEVBUl9ISVoJCTB4MzcKKyNkZWZpbmUJCVBBQ0tFVDNfM0RfQ0xFQVJfQ01BU0sJCTB4MzgKICNkZWZpbmUJCVBBQ0tFVDNfQklUQkxUX01VTFRJCQkweDlCCiAKICNkZWZpbmUgUEFDS0VUMChyZWcsIG4pCShDUF9QQUNLRVQwIHwJCQkJCVwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcjUwMF9yZWcuaCBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcjUwMF9yZWcuaAppbmRleCA2YWMxZjYwLi5mYzQzNzA1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3I1MDBfcmVnLmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yNTAwX3JlZy5oCkBAIC0zNTUsNiArMzU1LDggQEAKICNkZWZpbmUgQVZJVk9fRDFDUlRDX0ZSQU1FX0NPVU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDYwYTQKICNkZWZpbmUgQVZJVk9fRDFDUlRDX1NURVJFT19DT05UUk9MICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDYwYzQKIAorI2RlZmluZSBBVklWT19EMU1PREVfTUFTVEVSX1VQREFURV9NT0RFICAgICAgICAgICAgICAgICAgICAgICAgIDB4NjBlNAorCiAvKiBtYXN0ZXIgY29udHJvbHMgKi8KICNkZWZpbmUgQVZJVk9fRENfQ1JUQ19NQVNURVJfRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDYwZjgKICNkZWZpbmUgQVZJVk9fRENfQ1JUQ19UVl9DT05UUk9MICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDYwZmMKQEAgLTQwOSw4ICs0MTEsMTAgQEAKICNkZWZpbmUgQVZJVk9fRDFHUlBIX1hfRU5EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDYxMzQKICNkZWZpbmUgQVZJVk9fRDFHUlBIX1lfRU5EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDYxMzgKICNkZWZpbmUgQVZJVk9fRDFHUlBIX1VQREFURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDYxNDQKKyMgICAgICAgZGVmaW5lIEFWSVZPX0QxR1JQSF9TVVJGQUNFX1VQREFURV9QRU5ESU5HICAgICAgICAgICAgICAoMSA8PCAyKQogIyAgICAgICBkZWZpbmUgQVZJVk9fRDFHUlBIX1VQREFURV9MT0NLICAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IDE2KQogI2RlZmluZSBBVklWT19EMUdSUEhfRkxJUF9DT05UUk9MICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NjE0OAorIyAgICAgICBkZWZpbmUgQVZJVk9fRDFHUlBIX1NVUkZBQ0VfVVBEQVRFX0hfUkVUUkFDRV9FTiAgICAgICAgICgxIDw8IDApCiAKICNkZWZpbmUgQVZJVk9fRDFDVVJfQ09OVFJPTCAgICAgICAgICAgICAgICAgICAgIDB4NjQwMAogIyAgICAgICBkZWZpbmUgQVZJVk9fRDFDVVJTT1JfRU4gICAgICAgICAgICAgICAgKDEgPDwgMCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcjYwMC5jIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yNjAwLmMKaW5kZXggOWM5MmRiNy4uNmI1MDcxNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yNjAwLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yNjAwLmMKQEAgLTgzLDYgKzgzLDkgQEAKIE1PRFVMRV9GSVJNV0FSRSgicmFkZW9uL0NZUFJFU1NfcGZwLmJpbiIpOwogTU9EVUxFX0ZJUk1XQVJFKCJyYWRlb24vQ1lQUkVTU19tZS5iaW4iKTsKIE1PRFVMRV9GSVJNV0FSRSgicmFkZW9uL0NZUFJFU1NfcmxjLmJpbiIpOworTU9EVUxFX0ZJUk1XQVJFKCJyYWRlb24vUEFMTV9wZnAuYmluIik7CitNT0RVTEVfRklSTVdBUkUoInJhZGVvbi9QQUxNX21lLmJpbiIpOworTU9EVUxFX0ZJUk1XQVJFKCJyYWRlb24vU1VNT19ybGMuYmluIik7CiAKIGludCByNjAwX2RlYnVnZnNfbWNfaW5mb19pbml0KHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKIApAQCAtOTEsNiArOTQsNyBAQAogdm9pZCByNjAwX2dwdV9pbml0KHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKIHZvaWQgcjYwMF9maW5pKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKIHZvaWQgcjYwMF9pcnFfZGlzYWJsZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CitzdGF0aWMgdm9pZCByNjAwX3BjaWVfZ2VuMl9lbmFibGUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwogCiAvKiBnZXQgdGVtcGVyYXR1cmUgaW4gbWlsbGlkZWdyZWVzICovCiB1MzIgcnY2eHhfZ2V0X3RlbXAoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCkBAIC0xMTY0LDcgKzExNjgsNyBAQAogICogTm90ZTogR1RUIHN0YXJ0LCBlbmQsIHNpemUgc2hvdWxkIGJlIGluaXRpYWxpemVkIGJlZm9yZSBjYWxsaW5nIHRoaXMKICAqIGZ1bmN0aW9uIG9uIEFHUCBwbGF0Zm9ybS4KICAqLwotdm9pZCByNjAwX3ZyYW1fZ3R0X2xvY2F0aW9uKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LCBzdHJ1Y3QgcmFkZW9uX21jICptYykKK3N0YXRpYyB2b2lkIHI2MDBfdnJhbV9ndHRfbG9jYXRpb24oc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIHN0cnVjdCByYWRlb25fbWMgKm1jKQogewogCXU2NCBzaXplX2JmLCBzaXplX2FmOwogCkBAIC0yMDA5LDYgKzIwMTMsMTAgQEAKIAkJY2hpcF9uYW1lID0gIkNZUFJFU1MiOwogCQlybGNfY2hpcF9uYW1lID0gIkNZUFJFU1MiOwogCQlicmVhazsKKwljYXNlIENISVBfUEFMTToKKwkJY2hpcF9uYW1lID0gIlBBTE0iOworCQlybGNfY2hpcF9uYW1lID0gIlNVTU8iOworCQlicmVhazsKIAlkZWZhdWx0OiBCVUcoKTsKIAl9CiAKQEAgLTIzNzIsNiArMjM4MCw5IEBACiB7CiAJaW50IHI7CiAKKwkvKiBlbmFibGUgcGNpZSBnZW4yIGxpbmsgKi8KKwlyNjAwX3BjaWVfZ2VuMl9lbmFibGUocmRldik7CisKIAlpZiAoIXJkZXYtPm1lX2Z3IHx8ICFyZGV2LT5wZnBfZncgfHwgIXJkZXYtPnJsY19mdykgewogCQlyID0gcjYwMF9pbml0X21pY3JvY29kZShyZGV2KTsKIAkJaWYgKHIpIHsKQEAgLTI4NzQsNiArMjg4NSw4IEBACiAJV1JFRzMyKENQX0lOVF9DTlRMLCBDTlRYX0JVU1lfSU5UX0VOQUJMRSB8IENOVFhfRU1QVFlfSU5UX0VOQUJMRSk7CiAJV1JFRzMyKEdSQk1fSU5UX0NOVEwsIDApOwogCVdSRUczMihEeE1PREVfSU5UX01BU0ssIDApOworCVdSRUczMihEMUdSUEhfSU5URVJSVVBUX0NPTlRST0wsIDApOworCVdSRUczMihEMkdSUEhfSU5URVJSVVBUX0NPTlRST0wsIDApOwogCWlmIChBU0lDX0lTX0RDRTMocmRldikpIHsKIAkJV1JFRzMyKERDRTNfREFDQV9BVVRPREVURUNUX0lOVF9DT05UUk9MLCAwKTsKIAkJV1JFRzMyKERDRTNfREFDQl9BVVRPREVURUNUX0lOVF9DT05UUk9MLCAwKTsKQEAgLTI5OTgsNiArMzAxMSw3IEBACiAJdTMyIGhwZDEsIGhwZDIsIGhwZDMsIGhwZDQgPSAwLCBocGQ1ID0gMCwgaHBkNiA9IDA7CiAJdTMyIGdyYm1faW50X2NudGwgPSAwOwogCXUzMiBoZG1pMSwgaGRtaTI7CisJdTMyIGQxZ3JwaCA9IDAsIGQyZ3JwaCA9IDA7CiAKIAlpZiAoIXJkZXYtPmlycS5pbnN0YWxsZWQpIHsKIAkJV0FSTigxLCAiQ2FuJ3QgZW5hYmxlIElSUS9NU0kgYmVjYXVzZSBubyBoYW5kbGVyIGlzIGluc3RhbGxlZFxuIik7CkBAIC0zMDM0LDExICszMDQ4LDEzIEBACiAJCWNwX2ludF9jbnRsIHw9IFJCX0lOVF9FTkFCTEU7CiAJCWNwX2ludF9jbnRsIHw9IFRJTUVfU1RBTVBfSU5UX0VOQUJMRTsKIAl9Ci0JaWYgKHJkZXYtPmlycS5jcnRjX3ZibGFua19pbnRbMF0pIHsKKwlpZiAocmRldi0+aXJxLmNydGNfdmJsYW5rX2ludFswXSB8fAorCSAgICByZGV2LT5pcnEucGZsaXBbMF0pIHsKIAkJRFJNX0RFQlVHKCJyNjAwX2lycV9zZXQ6IHZibGFuayAwXG4iKTsKIAkJbW9kZV9pbnQgfD0gRDFNT0RFX1ZCTEFOS19JTlRfTUFTSzsKIAl9Ci0JaWYgKHJkZXYtPmlycS5jcnRjX3ZibGFua19pbnRbMV0pIHsKKwlpZiAocmRldi0+aXJxLmNydGNfdmJsYW5rX2ludFsxXSB8fAorCSAgICByZGV2LT5pcnEucGZsaXBbMV0pIHsKIAkJRFJNX0RFQlVHKCJyNjAwX2lycV9zZXQ6IHZibGFuayAxXG4iKTsKIAkJbW9kZV9pbnQgfD0gRDJNT0RFX1ZCTEFOS19JTlRfTUFTSzsKIAl9CkBAIC0zMDgxLDYgKzMwOTcsOCBAQAogCiAJV1JFRzMyKENQX0lOVF9DTlRMLCBjcF9pbnRfY250bCk7CiAJV1JFRzMyKER4TU9ERV9JTlRfTUFTSywgbW9kZV9pbnQpOworCVdSRUczMihEMUdSUEhfSU5URVJSVVBUX0NPTlRST0wsIGQxZ3JwaCk7CisJV1JFRzMyKEQyR1JQSF9JTlRFUlJVUFRfQ09OVFJPTCwgZDJncnBoKTsKIAlXUkVHMzIoR1JCTV9JTlRfQ05UTCwgZ3JibV9pbnRfY250bCk7CiAJV1JFRzMyKFI2MDBfSERNSV9CTE9DSzEgKyBSNjAwX0hETUlfQ05UTCwgaGRtaTEpOwogCWlmIChBU0lDX0lTX0RDRTMocmRldikpIHsKQEAgLTMxMDMsMzIgKzMxMjEsMzUgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIHI2MDBfaXJxX2FjayhzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwKLQkJCQl1MzIgKmRpc3BfaW50LAotCQkJCXUzMiAqZGlzcF9pbnRfY29udCwKLQkJCQl1MzIgKmRpc3BfaW50X2NvbnQyKQorc3RhdGljIGlubGluZSB2b2lkIHI2MDBfaXJxX2FjayhzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKIHsKIAl1MzIgdG1wOwogCiAJaWYgKEFTSUNfSVNfRENFMyhyZGV2KSkgewotCQkqZGlzcF9pbnQgPSBSUkVHMzIoRENFM19ESVNQX0lOVEVSUlVQVF9TVEFUVVMpOwotCQkqZGlzcF9pbnRfY29udCA9IFJSRUczMihEQ0UzX0RJU1BfSU5URVJSVVBUX1NUQVRVU19DT05USU5VRSk7Ci0JCSpkaXNwX2ludF9jb250MiA9IFJSRUczMihEQ0UzX0RJU1BfSU5URVJSVVBUX1NUQVRVU19DT05USU5VRTIpOworCQlyZGV2LT5pcnEuc3RhdF9yZWdzLnI2MDAuZGlzcF9pbnQgPSBSUkVHMzIoRENFM19ESVNQX0lOVEVSUlVQVF9TVEFUVVMpOworCQlyZGV2LT5pcnEuc3RhdF9yZWdzLnI2MDAuZGlzcF9pbnRfY29udCA9IFJSRUczMihEQ0UzX0RJU1BfSU5URVJSVVBUX1NUQVRVU19DT05USU5VRSk7CisJCXJkZXYtPmlycS5zdGF0X3JlZ3MucjYwMC5kaXNwX2ludF9jb250MiA9IFJSRUczMihEQ0UzX0RJU1BfSU5URVJSVVBUX1NUQVRVU19DT05USU5VRTIpOwogCX0gZWxzZSB7Ci0JCSpkaXNwX2ludCA9IFJSRUczMihESVNQX0lOVEVSUlVQVF9TVEFUVVMpOwotCQkqZGlzcF9pbnRfY29udCA9IFJSRUczMihESVNQX0lOVEVSUlVQVF9TVEFUVVNfQ09OVElOVUUpOwotCQkqZGlzcF9pbnRfY29udDIgPSAwOworCQlyZGV2LT5pcnEuc3RhdF9yZWdzLnI2MDAuZGlzcF9pbnQgPSBSUkVHMzIoRElTUF9JTlRFUlJVUFRfU1RBVFVTKTsKKwkJcmRldi0+aXJxLnN0YXRfcmVncy5yNjAwLmRpc3BfaW50X2NvbnQgPSBSUkVHMzIoRElTUF9JTlRFUlJVUFRfU1RBVFVTX0NPTlRJTlVFKTsKKwkJcmRldi0+aXJxLnN0YXRfcmVncy5yNjAwLmRpc3BfaW50X2NvbnQyID0gMDsKIAl9CisJcmRldi0+aXJxLnN0YXRfcmVncy5yNjAwLmQxZ3JwaF9pbnQgPSBSUkVHMzIoRDFHUlBIX0lOVEVSUlVQVF9TVEFUVVMpOworCXJkZXYtPmlycS5zdGF0X3JlZ3MucjYwMC5kMmdycGhfaW50ID0gUlJFRzMyKEQyR1JQSF9JTlRFUlJVUFRfU1RBVFVTKTsKIAotCWlmICgqZGlzcF9pbnQgJiBMQl9EMV9WQkxBTktfSU5URVJSVVBUKQorCWlmIChyZGV2LT5pcnEuc3RhdF9yZWdzLnI2MDAuZDFncnBoX2ludCAmIER4R1JQSF9QRkxJUF9JTlRfT0NDVVJSRUQpCisJCVdSRUczMihEMUdSUEhfSU5URVJSVVBUX1NUQVRVUywgRHhHUlBIX1BGTElQX0lOVF9DTEVBUik7CisJaWYgKHJkZXYtPmlycS5zdGF0X3JlZ3MucjYwMC5kMmdycGhfaW50ICYgRHhHUlBIX1BGTElQX0lOVF9PQ0NVUlJFRCkKKwkJV1JFRzMyKEQyR1JQSF9JTlRFUlJVUFRfU1RBVFVTLCBEeEdSUEhfUEZMSVBfSU5UX0NMRUFSKTsKKwlpZiAocmRldi0+aXJxLnN0YXRfcmVncy5yNjAwLmRpc3BfaW50ICYgTEJfRDFfVkJMQU5LX0lOVEVSUlVQVCkKIAkJV1JFRzMyKEQxTU9ERV9WQkxBTktfU1RBVFVTLCBEeE1PREVfVkJMQU5LX0FDSyk7Ci0JaWYgKCpkaXNwX2ludCAmIExCX0QxX1ZMSU5FX0lOVEVSUlVQVCkKKwlpZiAocmRldi0+aXJxLnN0YXRfcmVncy5yNjAwLmRpc3BfaW50ICYgTEJfRDFfVkxJTkVfSU5URVJSVVBUKQogCQlXUkVHMzIoRDFNT0RFX1ZMSU5FX1NUQVRVUywgRHhNT0RFX1ZMSU5FX0FDSyk7Ci0JaWYgKCpkaXNwX2ludCAmIExCX0QyX1ZCTEFOS19JTlRFUlJVUFQpCisJaWYgKHJkZXYtPmlycS5zdGF0X3JlZ3MucjYwMC5kaXNwX2ludCAmIExCX0QyX1ZCTEFOS19JTlRFUlJVUFQpCiAJCVdSRUczMihEMk1PREVfVkJMQU5LX1NUQVRVUywgRHhNT0RFX1ZCTEFOS19BQ0spOwotCWlmICgqZGlzcF9pbnQgJiBMQl9EMl9WTElORV9JTlRFUlJVUFQpCisJaWYgKHJkZXYtPmlycS5zdGF0X3JlZ3MucjYwMC5kaXNwX2ludCAmIExCX0QyX1ZMSU5FX0lOVEVSUlVQVCkKIAkJV1JFRzMyKEQyTU9ERV9WTElORV9TVEFUVVMsIER4TU9ERV9WTElORV9BQ0spOwotCWlmICgqZGlzcF9pbnQgJiBEQ19IUEQxX0lOVEVSUlVQVCkgeworCWlmIChyZGV2LT5pcnEuc3RhdF9yZWdzLnI2MDAuZGlzcF9pbnQgJiBEQ19IUEQxX0lOVEVSUlVQVCkgewogCQlpZiAoQVNJQ19JU19EQ0UzKHJkZXYpKSB7CiAJCQl0bXAgPSBSUkVHMzIoRENfSFBEMV9JTlRfQ09OVFJPTCk7CiAJCQl0bXAgfD0gRENfSFBEeF9JTlRfQUNLOwpAQCAtMzEzOSw3ICszMTYwLDcgQEAKIAkJCVdSRUczMihEQ19IT1RfUExVR19ERVRFQ1QxX0lOVF9DT05UUk9MLCB0bXApOwogCQl9CiAJfQotCWlmICgqZGlzcF9pbnQgJiBEQ19IUEQyX0lOVEVSUlVQVCkgeworCWlmIChyZGV2LT5pcnEuc3RhdF9yZWdzLnI2MDAuZGlzcF9pbnQgJiBEQ19IUEQyX0lOVEVSUlVQVCkgewogCQlpZiAoQVNJQ19JU19EQ0UzKHJkZXYpKSB7CiAJCQl0bXAgPSBSUkVHMzIoRENfSFBEMl9JTlRfQ09OVFJPTCk7CiAJCQl0bXAgfD0gRENfSFBEeF9JTlRfQUNLOwpAQCAtMzE1MCw3ICszMTcxLDcgQEAKIAkJCVdSRUczMihEQ19IT1RfUExVR19ERVRFQ1QyX0lOVF9DT05UUk9MLCB0bXApOwogCQl9CiAJfQotCWlmICgqZGlzcF9pbnRfY29udCAmIERDX0hQRDNfSU5URVJSVVBUKSB7CisJaWYgKHJkZXYtPmlycS5zdGF0X3JlZ3MucjYwMC5kaXNwX2ludF9jb250ICYgRENfSFBEM19JTlRFUlJVUFQpIHsKIAkJaWYgKEFTSUNfSVNfRENFMyhyZGV2KSkgewogCQkJdG1wID0gUlJFRzMyKERDX0hQRDNfSU5UX0NPTlRST0wpOwogCQkJdG1wIHw9IERDX0hQRHhfSU5UX0FDSzsKQEAgLTMxNjEsMTggKzMxODIsMTggQEAKIAkJCVdSRUczMihEQ19IT1RfUExVR19ERVRFQ1QzX0lOVF9DT05UUk9MLCB0bXApOwogCQl9CiAJfQotCWlmICgqZGlzcF9pbnRfY29udCAmIERDX0hQRDRfSU5URVJSVVBUKSB7CisJaWYgKHJkZXYtPmlycS5zdGF0X3JlZ3MucjYwMC5kaXNwX2ludF9jb250ICYgRENfSFBENF9JTlRFUlJVUFQpIHsKIAkJdG1wID0gUlJFRzMyKERDX0hQRDRfSU5UX0NPTlRST0wpOwogCQl0bXAgfD0gRENfSFBEeF9JTlRfQUNLOwogCQlXUkVHMzIoRENfSFBENF9JTlRfQ09OVFJPTCwgdG1wKTsKIAl9CiAJaWYgKEFTSUNfSVNfRENFMzIocmRldikpIHsKLQkJaWYgKCpkaXNwX2ludF9jb250MiAmIERDX0hQRDVfSU5URVJSVVBUKSB7CisJCWlmIChyZGV2LT5pcnEuc3RhdF9yZWdzLnI2MDAuZGlzcF9pbnRfY29udDIgJiBEQ19IUEQ1X0lOVEVSUlVQVCkgewogCQkJdG1wID0gUlJFRzMyKERDX0hQRDVfSU5UX0NPTlRST0wpOwogCQkJdG1wIHw9IERDX0hQRHhfSU5UX0FDSzsKIAkJCVdSRUczMihEQ19IUEQ1X0lOVF9DT05UUk9MLCB0bXApOwogCQl9Ci0JCWlmICgqZGlzcF9pbnRfY29udDIgJiBEQ19IUEQ2X0lOVEVSUlVQVCkgeworCQlpZiAocmRldi0+aXJxLnN0YXRfcmVncy5yNjAwLmRpc3BfaW50X2NvbnQyICYgRENfSFBENl9JTlRFUlJVUFQpIHsKIAkJCXRtcCA9IFJSRUczMihEQ19IUEQ1X0lOVF9DT05UUk9MKTsKIAkJCXRtcCB8PSBEQ19IUER4X0lOVF9BQ0s7CiAJCQlXUkVHMzIoRENfSFBENl9JTlRfQ09OVFJPTCwgdG1wKTsKQEAgLTMxOTQsMTIgKzMyMTUsMTAgQEAKIAogdm9pZCByNjAwX2lycV9kaXNhYmxlKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQogewotCXUzMiBkaXNwX2ludCwgZGlzcF9pbnRfY29udCwgZGlzcF9pbnRfY29udDI7Ci0KIAlyNjAwX2Rpc2FibGVfaW50ZXJydXB0cyhyZGV2KTsKIAkvKiBXYWl0IGFuZCBhY2tub3dsZWRnZSBpcnEgKi8KIAltZGVsYXkoMSk7Ci0JcjYwMF9pcnFfYWNrKHJkZXYsICZkaXNwX2ludCwgJmRpc3BfaW50X2NvbnQsICZkaXNwX2ludF9jb250Mik7CisJcjYwMF9pcnFfYWNrKHJkZXYpOwogCXI2MDBfZGlzYWJsZV9pbnRlcnJ1cHRfc3RhdGUocmRldik7CiB9CiAKQEAgLTMyNjIsNyArMzI4MSw3IEBACiAJdTMyIHdwdHIgPSByNjAwX2dldF9paF93cHRyKHJkZXYpOwogCXUzMiBycHRyID0gcmRldi0+aWgucnB0cjsKIAl1MzIgc3JjX2lkLCBzcmNfZGF0YTsKLQl1MzIgcmluZ19pbmRleCwgZGlzcF9pbnQsIGRpc3BfaW50X2NvbnQsIGRpc3BfaW50X2NvbnQyOworCXUzMiByaW5nX2luZGV4OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJYm9vbCBxdWV1ZV9ob3RwbHVnID0gZmFsc2U7CiAKQEAgLTMyODMsNyArMzMwMiw3IEBACiAKIHJlc3RhcnRfaWg6CiAJLyogZGlzcGxheSBpbnRlcnJ1cHRzICovCi0JcjYwMF9pcnFfYWNrKHJkZXYsICZkaXNwX2ludCwgJmRpc3BfaW50X2NvbnQsICZkaXNwX2ludF9jb250Mik7CisJcjYwMF9pcnFfYWNrKHJkZXYpOwogCiAJcmRldi0+aWgud3B0ciA9IHdwdHI7CiAJd2hpbGUgKHJwdHIgIT0gd3B0cikgewpAQCAtMzI5NiwxNyArMzMxNSwyMSBAQAogCQljYXNlIDE6IC8qIEQxIHZibGFuay92bGluZSAqLwogCQkJc3dpdGNoIChzcmNfZGF0YSkgewogCQkJY2FzZSAwOiAvKiBEMSB2YmxhbmsgKi8KLQkJCQlpZiAoZGlzcF9pbnQgJiBMQl9EMV9WQkxBTktfSU5URVJSVVBUKSB7Ci0JCQkJCWRybV9oYW5kbGVfdmJsYW5rKHJkZXYtPmRkZXYsIDApOwotCQkJCQlyZGV2LT5wbS52Ymxhbmtfc3luYyA9IHRydWU7Ci0JCQkJCXdha2VfdXAoJnJkZXYtPmlycS52YmxhbmtfcXVldWUpOwotCQkJCQlkaXNwX2ludCAmPSB+TEJfRDFfVkJMQU5LX0lOVEVSUlVQVDsKKwkJCQlpZiAocmRldi0+aXJxLnN0YXRfcmVncy5yNjAwLmRpc3BfaW50ICYgTEJfRDFfVkJMQU5LX0lOVEVSUlVQVCkgeworCQkJCQlpZiAocmRldi0+aXJxLmNydGNfdmJsYW5rX2ludFswXSkgeworCQkJCQkJZHJtX2hhbmRsZV92YmxhbmsocmRldi0+ZGRldiwgMCk7CisJCQkJCQlyZGV2LT5wbS52Ymxhbmtfc3luYyA9IHRydWU7CisJCQkJCQl3YWtlX3VwKCZyZGV2LT5pcnEudmJsYW5rX3F1ZXVlKTsKKwkJCQkJfQorCQkJCQlpZiAocmRldi0+aXJxLnBmbGlwWzBdKQorCQkJCQkJcmFkZW9uX2NydGNfaGFuZGxlX2ZsaXAocmRldiwgMCk7CisJCQkJCXJkZXYtPmlycS5zdGF0X3JlZ3MucjYwMC5kaXNwX2ludCAmPSB+TEJfRDFfVkJMQU5LX0lOVEVSUlVQVDsKIAkJCQkJRFJNX0RFQlVHKCJJSDogRDEgdmJsYW5rXG4iKTsKIAkJCQl9CiAJCQkJYnJlYWs7CiAJCQljYXNlIDE6IC8qIEQxIHZsaW5lICovCi0JCQkJaWYgKGRpc3BfaW50ICYgTEJfRDFfVkxJTkVfSU5URVJSVVBUKSB7Ci0JCQkJCWRpc3BfaW50ICY9IH5MQl9EMV9WTElORV9JTlRFUlJVUFQ7CisJCQkJaWYgKHJkZXYtPmlycS5zdGF0X3JlZ3MucjYwMC5kaXNwX2ludCAmIExCX0QxX1ZMSU5FX0lOVEVSUlVQVCkgeworCQkJCQlyZGV2LT5pcnEuc3RhdF9yZWdzLnI2MDAuZGlzcF9pbnQgJj0gfkxCX0QxX1ZMSU5FX0lOVEVSUlVQVDsKIAkJCQkJRFJNX0RFQlVHKCJJSDogRDEgdmxpbmVcbiIpOwogCQkJCX0KIAkJCQlicmVhazsKQEAgLTMzMTgsMTcgKzMzNDEsMjEgQEAKIAkJY2FzZSA1OiAvKiBEMiB2YmxhbmsvdmxpbmUgKi8KIAkJCXN3aXRjaCAoc3JjX2RhdGEpIHsKIAkJCWNhc2UgMDogLyogRDIgdmJsYW5rICovCi0JCQkJaWYgKGRpc3BfaW50ICYgTEJfRDJfVkJMQU5LX0lOVEVSUlVQVCkgewotCQkJCQlkcm1faGFuZGxlX3ZibGFuayhyZGV2LT5kZGV2LCAxKTsKLQkJCQkJcmRldi0+cG0udmJsYW5rX3N5bmMgPSB0cnVlOwotCQkJCQl3YWtlX3VwKCZyZGV2LT5pcnEudmJsYW5rX3F1ZXVlKTsKLQkJCQkJZGlzcF9pbnQgJj0gfkxCX0QyX1ZCTEFOS19JTlRFUlJVUFQ7CisJCQkJaWYgKHJkZXYtPmlycS5zdGF0X3JlZ3MucjYwMC5kaXNwX2ludCAmIExCX0QyX1ZCTEFOS19JTlRFUlJVUFQpIHsKKwkJCQkJaWYgKHJkZXYtPmlycS5jcnRjX3ZibGFua19pbnRbMV0pIHsKKwkJCQkJCWRybV9oYW5kbGVfdmJsYW5rKHJkZXYtPmRkZXYsIDEpOworCQkJCQkJcmRldi0+cG0udmJsYW5rX3N5bmMgPSB0cnVlOworCQkJCQkJd2FrZV91cCgmcmRldi0+aXJxLnZibGFua19xdWV1ZSk7CisJCQkJCX0KKwkJCQkJaWYgKHJkZXYtPmlycS5wZmxpcFsxXSkKKwkJCQkJCXJhZGVvbl9jcnRjX2hhbmRsZV9mbGlwKHJkZXYsIDEpOworCQkJCQlyZGV2LT5pcnEuc3RhdF9yZWdzLnI2MDAuZGlzcF9pbnQgJj0gfkxCX0QyX1ZCTEFOS19JTlRFUlJVUFQ7CiAJCQkJCURSTV9ERUJVRygiSUg6IEQyIHZibGFua1xuIik7CiAJCQkJfQogCQkJCWJyZWFrOwogCQkJY2FzZSAxOiAvKiBEMSB2bGluZSAqLwotCQkJCWlmIChkaXNwX2ludCAmIExCX0QyX1ZMSU5FX0lOVEVSUlVQVCkgewotCQkJCQlkaXNwX2ludCAmPSB+TEJfRDJfVkxJTkVfSU5URVJSVVBUOworCQkJCWlmIChyZGV2LT5pcnEuc3RhdF9yZWdzLnI2MDAuZGlzcF9pbnQgJiBMQl9EMl9WTElORV9JTlRFUlJVUFQpIHsKKwkJCQkJcmRldi0+aXJxLnN0YXRfcmVncy5yNjAwLmRpc3BfaW50ICY9IH5MQl9EMl9WTElORV9JTlRFUlJVUFQ7CiAJCQkJCURSTV9ERUJVRygiSUg6IEQyIHZsaW5lXG4iKTsKIAkJCQl9CiAJCQkJYnJlYWs7CkBAIC0zMzQwLDQzICszMzY3LDQzIEBACiAJCWNhc2UgMTk6IC8qIEhQRC9EQUMgaG90cGx1ZyAqLwogCQkJc3dpdGNoIChzcmNfZGF0YSkgewogCQkJY2FzZSAwOgotCQkJCWlmIChkaXNwX2ludCAmIERDX0hQRDFfSU5URVJSVVBUKSB7Ci0JCQkJCWRpc3BfaW50ICY9IH5EQ19IUEQxX0lOVEVSUlVQVDsKKwkJCQlpZiAocmRldi0+aXJxLnN0YXRfcmVncy5yNjAwLmRpc3BfaW50ICYgRENfSFBEMV9JTlRFUlJVUFQpIHsKKwkJCQkJcmRldi0+aXJxLnN0YXRfcmVncy5yNjAwLmRpc3BfaW50ICY9IH5EQ19IUEQxX0lOVEVSUlVQVDsKIAkJCQkJcXVldWVfaG90cGx1ZyA9IHRydWU7CiAJCQkJCURSTV9ERUJVRygiSUg6IEhQRDFcbiIpOwogCQkJCX0KIAkJCQlicmVhazsKIAkJCWNhc2UgMToKLQkJCQlpZiAoZGlzcF9pbnQgJiBEQ19IUEQyX0lOVEVSUlVQVCkgewotCQkJCQlkaXNwX2ludCAmPSB+RENfSFBEMl9JTlRFUlJVUFQ7CisJCQkJaWYgKHJkZXYtPmlycS5zdGF0X3JlZ3MucjYwMC5kaXNwX2ludCAmIERDX0hQRDJfSU5URVJSVVBUKSB7CisJCQkJCXJkZXYtPmlycS5zdGF0X3JlZ3MucjYwMC5kaXNwX2ludCAmPSB+RENfSFBEMl9JTlRFUlJVUFQ7CiAJCQkJCXF1ZXVlX2hvdHBsdWcgPSB0cnVlOwogCQkJCQlEUk1fREVCVUcoIklIOiBIUEQyXG4iKTsKIAkJCQl9CiAJCQkJYnJlYWs7CiAJCQljYXNlIDQ6Ci0JCQkJaWYgKGRpc3BfaW50X2NvbnQgJiBEQ19IUEQzX0lOVEVSUlVQVCkgewotCQkJCQlkaXNwX2ludF9jb250ICY9IH5EQ19IUEQzX0lOVEVSUlVQVDsKKwkJCQlpZiAocmRldi0+aXJxLnN0YXRfcmVncy5yNjAwLmRpc3BfaW50X2NvbnQgJiBEQ19IUEQzX0lOVEVSUlVQVCkgeworCQkJCQlyZGV2LT5pcnEuc3RhdF9yZWdzLnI2MDAuZGlzcF9pbnRfY29udCAmPSB+RENfSFBEM19JTlRFUlJVUFQ7CiAJCQkJCXF1ZXVlX2hvdHBsdWcgPSB0cnVlOwogCQkJCQlEUk1fREVCVUcoIklIOiBIUEQzXG4iKTsKIAkJCQl9CiAJCQkJYnJlYWs7CiAJCQljYXNlIDU6Ci0JCQkJaWYgKGRpc3BfaW50X2NvbnQgJiBEQ19IUEQ0X0lOVEVSUlVQVCkgewotCQkJCQlkaXNwX2ludF9jb250ICY9IH5EQ19IUEQ0X0lOVEVSUlVQVDsKKwkJCQlpZiAocmRldi0+aXJxLnN0YXRfcmVncy5yNjAwLmRpc3BfaW50X2NvbnQgJiBEQ19IUEQ0X0lOVEVSUlVQVCkgeworCQkJCQlyZGV2LT5pcnEuc3RhdF9yZWdzLnI2MDAuZGlzcF9pbnRfY29udCAmPSB+RENfSFBENF9JTlRFUlJVUFQ7CiAJCQkJCXF1ZXVlX2hvdHBsdWcgPSB0cnVlOwogCQkJCQlEUk1fREVCVUcoIklIOiBIUEQ0XG4iKTsKIAkJCQl9CiAJCQkJYnJlYWs7CiAJCQljYXNlIDEwOgotCQkJCWlmIChkaXNwX2ludF9jb250MiAmIERDX0hQRDVfSU5URVJSVVBUKSB7Ci0JCQkJCWRpc3BfaW50X2NvbnQyICY9IH5EQ19IUEQ1X0lOVEVSUlVQVDsKKwkJCQlpZiAocmRldi0+aXJxLnN0YXRfcmVncy5yNjAwLmRpc3BfaW50X2NvbnQyICYgRENfSFBENV9JTlRFUlJVUFQpIHsKKwkJCQkJcmRldi0+aXJxLnN0YXRfcmVncy5yNjAwLmRpc3BfaW50X2NvbnQyICY9IH5EQ19IUEQ1X0lOVEVSUlVQVDsKIAkJCQkJcXVldWVfaG90cGx1ZyA9IHRydWU7CiAJCQkJCURSTV9ERUJVRygiSUg6IEhQRDVcbiIpOwogCQkJCX0KIAkJCQlicmVhazsKIAkJCWNhc2UgMTI6Ci0JCQkJaWYgKGRpc3BfaW50X2NvbnQyICYgRENfSFBENl9JTlRFUlJVUFQpIHsKLQkJCQkJZGlzcF9pbnRfY29udDIgJj0gfkRDX0hQRDZfSU5URVJSVVBUOworCQkJCWlmIChyZGV2LT5pcnEuc3RhdF9yZWdzLnI2MDAuZGlzcF9pbnRfY29udDIgJiBEQ19IUEQ2X0lOVEVSUlVQVCkgeworCQkJCQlyZGV2LT5pcnEuc3RhdF9yZWdzLnI2MDAuZGlzcF9pbnRfY29udDIgJj0gfkRDX0hQRDZfSU5URVJSVVBUOwogCQkJCQlxdWV1ZV9ob3RwbHVnID0gdHJ1ZTsKIAkJCQkJRFJNX0RFQlVHKCJJSDogSFBENlxuIik7CiAJCQkJfQpAQCAtMzQxOSw3ICszNDQ2LDcgQEAKIAlpZiAod3B0ciAhPSByZGV2LT5paC53cHRyKQogCQlnb3RvIHJlc3RhcnRfaWg7CiAJaWYgKHF1ZXVlX2hvdHBsdWcpCi0JCXF1ZXVlX3dvcmsocmRldi0+d3EsICZyZGV2LT5ob3RwbHVnX3dvcmspOworCQlzY2hlZHVsZV93b3JrKCZyZGV2LT5ob3RwbHVnX3dvcmspOwogCXJkZXYtPmloLnJwdHIgPSBycHRyOwogCVdSRUczMihJSF9SQl9SUFRSLCByZGV2LT5paC5ycHRyKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyZGV2LT5paC5sb2NrLCBmbGFncyk7CkBAIC0zNTA4LDMgKzM1MzUsMjE5IEBACiAJfSBlbHNlCiAJCVdSRUczMihSXzAwNTQ4MF9IRFBfTUVNX0NPSEVSRU5DWV9GTFVTSF9DTlRMLCAweDEpOwogfQorCit2b2lkIHI2MDBfc2V0X3BjaWVfbGFuZXMoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIGludCBsYW5lcykKK3sKKwl1MzIgbGlua193aWR0aF9jbnRsLCBtYXNrLCB0YXJnZXRfcmVnOworCisJaWYgKHJkZXYtPmZsYWdzICYgUkFERU9OX0lTX0lHUCkKKwkJcmV0dXJuOworCisJaWYgKCEocmRldi0+ZmxhZ3MgJiBSQURFT05fSVNfUENJRSkpCisJCXJldHVybjsKKworCS8qIHgyIGNhcmRzIGhhdmUgYSBzcGVjaWFsIHNlcXVlbmNlICovCisJaWYgKEFTSUNfSVNfWDIocmRldikpCisJCXJldHVybjsKKworCS8qIEZJWE1FIHdhaXQgZm9yIGlkbGUgKi8KKworCXN3aXRjaCAobGFuZXMpIHsKKwljYXNlIDA6CisJCW1hc2sgPSBSQURFT05fUENJRV9MQ19MSU5LX1dJRFRIX1gwOworCQlicmVhazsKKwljYXNlIDE6CisJCW1hc2sgPSBSQURFT05fUENJRV9MQ19MSU5LX1dJRFRIX1gxOworCQlicmVhazsKKwljYXNlIDI6CisJCW1hc2sgPSBSQURFT05fUENJRV9MQ19MSU5LX1dJRFRIX1gyOworCQlicmVhazsKKwljYXNlIDQ6CisJCW1hc2sgPSBSQURFT05fUENJRV9MQ19MSU5LX1dJRFRIX1g0OworCQlicmVhazsKKwljYXNlIDg6CisJCW1hc2sgPSBSQURFT05fUENJRV9MQ19MSU5LX1dJRFRIX1g4OworCQlicmVhazsKKwljYXNlIDEyOgorCQltYXNrID0gUkFERU9OX1BDSUVfTENfTElOS19XSURUSF9YMTI7CisJCWJyZWFrOworCWNhc2UgMTY6CisJZGVmYXVsdDoKKwkJbWFzayA9IFJBREVPTl9QQ0lFX0xDX0xJTktfV0lEVEhfWDE2OworCQlicmVhazsKKwl9CisKKwlsaW5rX3dpZHRoX2NudGwgPSBSUkVHMzJfUENJRV9QKFJBREVPTl9QQ0lFX0xDX0xJTktfV0lEVEhfQ05UTCk7CisKKwlpZiAoKGxpbmtfd2lkdGhfY250bCAmIFJBREVPTl9QQ0lFX0xDX0xJTktfV0lEVEhfUkRfTUFTSykgPT0KKwkgICAgKG1hc2sgPDwgUkFERU9OX1BDSUVfTENfTElOS19XSURUSF9SRF9TSElGVCkpCisJCXJldHVybjsKKworCWlmIChsaW5rX3dpZHRoX2NudGwgJiBSNjAwX1BDSUVfTENfVVBDT05GSUdVUkVfRElTKQorCQlyZXR1cm47CisKKwlsaW5rX3dpZHRoX2NudGwgJj0gfihSQURFT05fUENJRV9MQ19MSU5LX1dJRFRIX01BU0sgfAorCQkJICAgICBSQURFT05fUENJRV9MQ19SRUNPTkZJR19OT1cgfAorCQkJICAgICBSNjAwX1BDSUVfTENfUkVORUdPVElBVEVfRU4gfAorCQkJICAgICBSNjAwX1BDSUVfTENfUkVDT05GSUdfQVJDX01JU1NJTkdfRVNDQVBFKTsKKwlsaW5rX3dpZHRoX2NudGwgfD0gbWFzazsKKworCVdSRUczMl9QQ0lFX1AoUkFERU9OX1BDSUVfTENfTElOS19XSURUSF9DTlRMLCBsaW5rX3dpZHRoX2NudGwpOworCisgICAgICAgIC8qIHNvbWUgbm9ydGhicmlkZ2VzIGNhbiByZW5lZ290aWF0ZSB0aGUgbGluayByYXRoZXIgdGhhbiByZXF1aXJpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAqIGEgY29tcGxldGUgcmUtY29uZmlnLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAqIGUuZy4sIEFNRCA3ODAvNzkwIG5vcnRoYnJpZGdlcyAocGNpIGlkczogMHg1OTU2LCAweDU5NTcsIDB4NTk1OCwgZXRjLikgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAqLworICAgICAgICBpZiAobGlua193aWR0aF9jbnRsICYgUjYwMF9QQ0lFX0xDX1JFTkVHT1RJQVRJT05fU1VQUE9SVCkKKwkJbGlua193aWR0aF9jbnRsIHw9IFI2MDBfUENJRV9MQ19SRU5FR09USUFURV9FTiB8IFI2MDBfUENJRV9MQ19VUENPTkZJR1VSRV9TVVBQT1JUOworICAgICAgICBlbHNlCisJCWxpbmtfd2lkdGhfY250bCB8PSBSNjAwX1BDSUVfTENfUkVDT05GSUdfQVJDX01JU1NJTkdfRVNDQVBFOworCisJV1JFRzMyX1BDSUVfUChSQURFT05fUENJRV9MQ19MSU5LX1dJRFRIX0NOVEwsIChsaW5rX3dpZHRoX2NudGwgfAorCQkJCQkJICAgICAgIFJBREVPTl9QQ0lFX0xDX1JFQ09ORklHX05PVykpOworCisgICAgICAgIGlmIChyZGV2LT5mYW1pbHkgPj0gQ0hJUF9SVjc3MCkKKwkJdGFyZ2V0X3JlZyA9IFI3MDBfVEFSR0VUX0FORF9DVVJSRU5UX1BST0ZJTEVfSU5ERVg7CisgICAgICAgIGVsc2UKKwkJdGFyZ2V0X3JlZyA9IFI2MDBfVEFSR0VUX0FORF9DVVJSRU5UX1BST0ZJTEVfSU5ERVg7CisKKyAgICAgICAgLyogd2FpdCBmb3IgbGFuZSBzZXQgdG8gY29tcGxldGUgKi8KKyAgICAgICAgbGlua193aWR0aF9jbnRsID0gUlJFRzMyKHRhcmdldF9yZWcpOworICAgICAgICB3aGlsZSAobGlua193aWR0aF9jbnRsID09IDB4ZmZmZmZmZmYpCisJCWxpbmtfd2lkdGhfY250bCA9IFJSRUczMih0YXJnZXRfcmVnKTsKKworfQorCitpbnQgcjYwMF9nZXRfcGNpZV9sYW5lcyhzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKK3sKKwl1MzIgbGlua193aWR0aF9jbnRsOworCisJaWYgKHJkZXYtPmZsYWdzICYgUkFERU9OX0lTX0lHUCkKKwkJcmV0dXJuIDA7CisKKwlpZiAoIShyZGV2LT5mbGFncyAmIFJBREVPTl9JU19QQ0lFKSkKKwkJcmV0dXJuIDA7CisKKwkvKiB4MiBjYXJkcyBoYXZlIGEgc3BlY2lhbCBzZXF1ZW5jZSAqLworCWlmIChBU0lDX0lTX1gyKHJkZXYpKQorCQlyZXR1cm4gMDsKKworCS8qIEZJWE1FIHdhaXQgZm9yIGlkbGUgKi8KKworCWxpbmtfd2lkdGhfY250bCA9IFJSRUczMl9QQ0lFX1AoUkFERU9OX1BDSUVfTENfTElOS19XSURUSF9DTlRMKTsKKworCXN3aXRjaCAoKGxpbmtfd2lkdGhfY250bCAmIFJBREVPTl9QQ0lFX0xDX0xJTktfV0lEVEhfUkRfTUFTSykgPj4gUkFERU9OX1BDSUVfTENfTElOS19XSURUSF9SRF9TSElGVCkgeworCWNhc2UgUkFERU9OX1BDSUVfTENfTElOS19XSURUSF9YMDoKKwkJcmV0dXJuIDA7CisJY2FzZSBSQURFT05fUENJRV9MQ19MSU5LX1dJRFRIX1gxOgorCQlyZXR1cm4gMTsKKwljYXNlIFJBREVPTl9QQ0lFX0xDX0xJTktfV0lEVEhfWDI6CisJCXJldHVybiAyOworCWNhc2UgUkFERU9OX1BDSUVfTENfTElOS19XSURUSF9YNDoKKwkJcmV0dXJuIDQ7CisJY2FzZSBSQURFT05fUENJRV9MQ19MSU5LX1dJRFRIX1g4OgorCQlyZXR1cm4gODsKKwljYXNlIFJBREVPTl9QQ0lFX0xDX0xJTktfV0lEVEhfWDE2OgorCWRlZmF1bHQ6CisJCXJldHVybiAxNjsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHI2MDBfcGNpZV9nZW4yX2VuYWJsZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKK3sKKwl1MzIgbGlua193aWR0aF9jbnRsLCBsYW5lcywgc3BlZWRfY250bCwgdHJhaW5pbmdfY250bCwgdG1wOworCXUxNiBsaW5rX2NudGwyOworCisJaWYgKHJkZXYtPmZsYWdzICYgUkFERU9OX0lTX0lHUCkKKwkJcmV0dXJuOworCisJaWYgKCEocmRldi0+ZmxhZ3MgJiBSQURFT05fSVNfUENJRSkpCisJCXJldHVybjsKKworCS8qIHgyIGNhcmRzIGhhdmUgYSBzcGVjaWFsIHNlcXVlbmNlICovCisJaWYgKEFTSUNfSVNfWDIocmRldikpCisJCXJldHVybjsKKworCS8qIG9ubHkgUlY2eHgrIGNoaXBzIGFyZSBzdXBwb3J0ZWQgKi8KKwlpZiAocmRldi0+ZmFtaWx5IDw9IENISVBfUjYwMCkKKwkJcmV0dXJuOworCisJLyogNTUgbm0gcjZ4eCBhc2ljcyAqLworCWlmICgocmRldi0+ZmFtaWx5ID09IENISVBfUlY2NzApIHx8CisJICAgIChyZGV2LT5mYW1pbHkgPT0gQ0hJUF9SVjYyMCkgfHwKKwkgICAgKHJkZXYtPmZhbWlseSA9PSBDSElQX1JWNjM1KSkgeworCQkvKiBhZHZlcnRpc2UgdXBjb25maWcgY2FwYWJpbGl0eSAqLworCQlsaW5rX3dpZHRoX2NudGwgPSBSUkVHMzJfUENJRV9QKFBDSUVfTENfTElOS19XSURUSF9DTlRMKTsKKwkJbGlua193aWR0aF9jbnRsICY9IH5MQ19VUENPTkZJR1VSRV9ESVM7CisJCVdSRUczMl9QQ0lFX1AoUENJRV9MQ19MSU5LX1dJRFRIX0NOVEwsIGxpbmtfd2lkdGhfY250bCk7CisJCWxpbmtfd2lkdGhfY250bCA9IFJSRUczMl9QQ0lFX1AoUENJRV9MQ19MSU5LX1dJRFRIX0NOVEwpOworCQlpZiAobGlua193aWR0aF9jbnRsICYgTENfUkVORUdPVElBVElPTl9TVVBQT1JUKSB7CisJCQlsYW5lcyA9IChsaW5rX3dpZHRoX2NudGwgJiBMQ19MSU5LX1dJRFRIX1JEX01BU0spID4+IExDX0xJTktfV0lEVEhfUkRfU0hJRlQ7CisJCQlsaW5rX3dpZHRoX2NudGwgJj0gfihMQ19MSU5LX1dJRFRIX01BU0sgfAorCQkJCQkgICAgIExDX1JFQ09ORklHX0FSQ19NSVNTSU5HX0VTQ0FQRSk7CisJCQlsaW5rX3dpZHRoX2NudGwgfD0gbGFuZXMgfCBMQ19SRUNPTkZJR19OT1cgfCBMQ19SRU5FR09USUFURV9FTjsKKwkJCVdSRUczMl9QQ0lFX1AoUENJRV9MQ19MSU5LX1dJRFRIX0NOVEwsIGxpbmtfd2lkdGhfY250bCk7CisJCX0gZWxzZSB7CisJCQlsaW5rX3dpZHRoX2NudGwgfD0gTENfVVBDT05GSUdVUkVfRElTOworCQkJV1JFRzMyX1BDSUVfUChQQ0lFX0xDX0xJTktfV0lEVEhfQ05UTCwgbGlua193aWR0aF9jbnRsKTsKKwkJfQorCX0KKworCXNwZWVkX2NudGwgPSBSUkVHMzJfUENJRV9QKFBDSUVfTENfU1BFRURfQ05UTCk7CisJaWYgKChzcGVlZF9jbnRsICYgTENfT1RIRVJfU0lERV9FVkVSX1NFTlRfR0VOMikgJiYKKwkgICAgKHNwZWVkX2NudGwgJiBMQ19PVEhFUl9TSURFX1NVUFBPUlRTX0dFTjIpKSB7CisKKwkJLyogNTUgbm0gcjZ4eCBhc2ljcyAqLworCQlpZiAoKHJkZXYtPmZhbWlseSA9PSBDSElQX1JWNjcwKSB8fAorCQkgICAgKHJkZXYtPmZhbWlseSA9PSBDSElQX1JWNjIwKSB8fAorCQkgICAgKHJkZXYtPmZhbWlseSA9PSBDSElQX1JWNjM1KSkgeworCQkJV1JFRzMyKE1NX0NGR1JFR1NfQ05UTCwgMHg4KTsKKwkJCWxpbmtfY250bDIgPSBSUkVHMzIoMHg0MDg4KTsKKwkJCVdSRUczMihNTV9DRkdSRUdTX0NOVEwsIDApOworCQkJLyogbm90IHN1cHBvcnRlZCB5ZXQgKi8KKwkJCWlmIChsaW5rX2NudGwyICYgU0VMRUNUQUJMRV9ERUVNUEhBU0lTKQorCQkJCXJldHVybjsKKwkJfQorCisJCXNwZWVkX2NudGwgJj0gfkxDX1NQRUVEX0NIQU5HRV9BVFRFTVBUU19BTExPV0VEX01BU0s7CisJCXNwZWVkX2NudGwgfD0gKDB4MyA8PCBMQ19TUEVFRF9DSEFOR0VfQVRURU1QVFNfQUxMT1dFRF9TSElGVCk7CisJCXNwZWVkX2NudGwgJj0gfkxDX1ZPTFRBR0VfVElNRVJfU0VMX01BU0s7CisJCXNwZWVkX2NudGwgJj0gfkxDX0ZPUkNFX0RJU19IV19TUEVFRF9DSEFOR0U7CisJCXNwZWVkX2NudGwgfD0gTENfRk9SQ0VfRU5fSFdfU1BFRURfQ0hBTkdFOworCQlXUkVHMzJfUENJRV9QKFBDSUVfTENfU1BFRURfQ05UTCwgc3BlZWRfY250bCk7CisKKwkJdG1wID0gUlJFRzMyKDB4NTQxYyk7CisJCVdSRUczMigweDU0MWMsIHRtcCB8IDB4OCk7CisJCVdSRUczMihNTV9DRkdSRUdTX0NOVEwsIE1NX1dSX1RPX0NGR19FTik7CisJCWxpbmtfY250bDIgPSBSUkVHMTYoMHg0MDg4KTsKKwkJbGlua19jbnRsMiAmPSB+VEFSR0VUX0xJTktfU1BFRURfTUFTSzsKKwkJbGlua19jbnRsMiB8PSAweDI7CisJCVdSRUcxNigweDQwODgsIGxpbmtfY250bDIpOworCQlXUkVHMzIoTU1fQ0ZHUkVHU19DTlRMLCAwKTsKKworCQlpZiAoKHJkZXYtPmZhbWlseSA9PSBDSElQX1JWNjcwKSB8fAorCQkgICAgKHJkZXYtPmZhbWlseSA9PSBDSElQX1JWNjIwKSB8fAorCQkgICAgKHJkZXYtPmZhbWlseSA9PSBDSElQX1JWNjM1KSkgeworCQkJdHJhaW5pbmdfY250bCA9IFJSRUczMl9QQ0lFX1AoUENJRV9MQ19UUkFJTklOR19DTlRMKTsKKwkJCXRyYWluaW5nX2NudGwgJj0gfkxDX1BPSU5UXzdfUExVU19FTjsKKwkJCVdSRUczMl9QQ0lFX1AoUENJRV9MQ19UUkFJTklOR19DTlRMLCB0cmFpbmluZ19jbnRsKTsKKwkJfSBlbHNlIHsKKwkJCXNwZWVkX2NudGwgPSBSUkVHMzJfUENJRV9QKFBDSUVfTENfU1BFRURfQ05UTCk7CisJCQlzcGVlZF9jbnRsICY9IH5MQ19UQVJHRVRfTElOS19TUEVFRF9PVkVSUklERV9FTjsKKwkJCVdSRUczMl9QQ0lFX1AoUENJRV9MQ19TUEVFRF9DTlRMLCBzcGVlZF9jbnRsKTsKKwkJfQorCisJCXNwZWVkX2NudGwgPSBSUkVHMzJfUENJRV9QKFBDSUVfTENfU1BFRURfQ05UTCk7CisJCXNwZWVkX2NudGwgfD0gTENfR0VOMl9FTl9TVFJBUDsKKwkJV1JFRzMyX1BDSUVfUChQQ0lFX0xDX1NQRUVEX0NOVEwsIHNwZWVkX2NudGwpOworCisJfSBlbHNlIHsKKwkJbGlua193aWR0aF9jbnRsID0gUlJFRzMyX1BDSUVfUChQQ0lFX0xDX0xJTktfV0lEVEhfQ05UTCk7CisJCS8qIFhYWDogb25seSBkaXNhYmxlIGl0IGlmIGdlbjEgYnJpZGdlIHZlbmRvciA9PSAweDExMWQgb3IgMHgxMTA2ICovCisJCWlmICgxKQorCQkJbGlua193aWR0aF9jbnRsIHw9IExDX1VQQ09ORklHVVJFX0RJUzsKKwkJZWxzZQorCQkJbGlua193aWR0aF9jbnRsICY9IH5MQ19VUENPTkZJR1VSRV9ESVM7CisJCVdSRUczMl9QQ0lFX1AoUENJRV9MQ19MSU5LX1dJRFRIX0NOVEwsIGxpbmtfd2lkdGhfY250bCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yNjAwZC5oIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yNjAwZC5oCmluZGV4IGJmZjRkYzQuLmE1ZDg5OGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcjYwMGQuaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3I2MDBkLmgKQEAgLTcyOCw2ICs3MjgsNTQgQEAKIC8qIERDRSAzLjIgKi8KICMgICAgICAgZGVmaW5lIERDX0hQRHhfRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCAyOCkKIAorI2RlZmluZSBEMUdSUEhfSU5URVJSVVBUX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NjE1OAorI2RlZmluZSBEMkdSUEhfSU5URVJSVVBUX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4Njk1OAorIyAgICAgICBkZWZpbmUgRHhHUlBIX1BGTElQX0lOVF9PQ0NVUlJFRCAgICAgICAgICAgICAgICAgICgxIDw8IDApCisjICAgICAgIGRlZmluZSBEeEdSUEhfUEZMSVBfSU5UX0NMRUFSICAgICAgICAgICAgICAgICAgICAgKDEgPDwgOCkKKyNkZWZpbmUgRDFHUlBIX0lOVEVSUlVQVF9DT05UUk9MICAgICAgICAgICAgICAgICAgICAgICAgICAweDYxNWMKKyNkZWZpbmUgRDJHUlBIX0lOVEVSUlVQVF9DT05UUk9MICAgICAgICAgICAgICAgICAgICAgICAgICAweDY5NWMKKyMgICAgICAgZGVmaW5lIER4R1JQSF9QRkxJUF9JTlRfTUFTSyAgICAgICAgICAgICAgICAgICAgICAoMSA8PCAwKQorIyAgICAgICBkZWZpbmUgRHhHUlBIX1BGTElQX0lOVF9UWVBFICAgICAgICAgICAgICAgICAgICAgICgxIDw8IDgpCisKKy8qIFBDSUUgbGluayBzdHVmZiAqLworI2RlZmluZSBQQ0lFX0xDX1RSQUlOSU5HX0NOVEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4YTEgLyogUENJRV9QICovCisjICAgICAgIGRlZmluZSBMQ19QT0lOVF83X1BMVVNfRU4gICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgNikKKyNkZWZpbmUgUENJRV9MQ19MSU5LX1dJRFRIX0NOVEwgICAgICAgICAgICAgICAgICAgICAgICAgICAweGEyIC8qIFBDSUVfUCAqLworIyAgICAgICBkZWZpbmUgTENfTElOS19XSURUSF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDAKKyMgICAgICAgZGVmaW5lIExDX0xJTktfV0lEVEhfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAweDcKKyMgICAgICAgZGVmaW5lIExDX0xJTktfV0lEVEhfWDAgICAgICAgICAgICAgICAgICAgICAgICAgICAwCisjICAgICAgIGRlZmluZSBMQ19MSU5LX1dJRFRIX1gxICAgICAgICAgICAgICAgICAgICAgICAgICAgMQorIyAgICAgICBkZWZpbmUgTENfTElOS19XSURUSF9YMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDIKKyMgICAgICAgZGVmaW5lIExDX0xJTktfV0lEVEhfWDQgICAgICAgICAgICAgICAgICAgICAgICAgICAzCisjICAgICAgIGRlZmluZSBMQ19MSU5LX1dJRFRIX1g4ICAgICAgICAgICAgICAgICAgICAgICAgICAgNAorIyAgICAgICBkZWZpbmUgTENfTElOS19XSURUSF9YMTYgICAgICAgICAgICAgICAgICAgICAgICAgIDYKKyMgICAgICAgZGVmaW5lIExDX0xJTktfV0lEVEhfUkRfU0hJRlQgICAgICAgICAgICAgICAgICAgICA0CisjICAgICAgIGRlZmluZSBMQ19MSU5LX1dJRFRIX1JEX01BU0sgICAgICAgICAgICAgICAgICAgICAgMHg3MAorIyAgICAgICBkZWZpbmUgTENfUkVDT05GSUdfQVJDX01JU1NJTkdfRVNDQVBFICAgICAgICAgICAgICgxIDw8IDcpCisjICAgICAgIGRlZmluZSBMQ19SRUNPTkZJR19OT1cgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgOCkKKyMgICAgICAgZGVmaW5lIExDX1JFTkVHT1RJQVRJT05fU1VQUE9SVCAgICAgICAgICAgICAgICAgICAoMSA8PCA5KQorIyAgICAgICBkZWZpbmUgTENfUkVORUdPVElBVEVfRU4gICAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IDEwKQorIyAgICAgICBkZWZpbmUgTENfU0hPUlRfUkVDT05GSUdfRU4gICAgICAgICAgICAgICAgICAgICAgICgxIDw8IDExKQorIyAgICAgICBkZWZpbmUgTENfVVBDT05GSUdVUkVfU1VQUE9SVCAgICAgICAgICAgICAgICAgICAgICgxIDw8IDEyKQorIyAgICAgICBkZWZpbmUgTENfVVBDT05GSUdVUkVfRElTICAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IDEzKQorI2RlZmluZSBQQ0lFX0xDX1NQRUVEX0NOVEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4YTQgLyogUENJRV9QICovCisjICAgICAgIGRlZmluZSBMQ19HRU4yX0VOX1NUUkFQICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgMCkKKyMgICAgICAgZGVmaW5lIExDX1RBUkdFVF9MSU5LX1NQRUVEX09WRVJSSURFX0VOICAgICAgICAgICAoMSA8PCAxKQorIyAgICAgICBkZWZpbmUgTENfRk9SQ0VfRU5fSFdfU1BFRURfQ0hBTkdFICAgICAgICAgICAgICAgICgxIDw8IDUpCisjICAgICAgIGRlZmluZSBMQ19GT1JDRV9ESVNfSFdfU1BFRURfQ0hBTkdFICAgICAgICAgICAgICAgKDEgPDwgNikKKyMgICAgICAgZGVmaW5lIExDX1NQRUVEX0NIQU5HRV9BVFRFTVBUU19BTExPV0VEX01BU0sgICAgICAoMHgzIDw8IDgpCisjICAgICAgIGRlZmluZSBMQ19TUEVFRF9DSEFOR0VfQVRURU1QVFNfQUxMT1dFRF9TSElGVCAgICAgMworIyAgICAgICBkZWZpbmUgTENfQ1VSUkVOVF9EQVRBX1JBVEUgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IDExKQorIyAgICAgICBkZWZpbmUgTENfVk9MVEFHRV9USU1FUl9TRUxfTUFTSyAgICAgICAgICAgICAgICAgICgweGYgPDwgMTQpCisjICAgICAgIGRlZmluZSBMQ19DTFJfRkFJTEVEX1NQRF9DSEFOR0VfQ05UICAgICAgICAgICAgICAgKDEgPDwgMjEpCisjICAgICAgIGRlZmluZSBMQ19PVEhFUl9TSURFX0VWRVJfU0VOVF9HRU4yICAgICAgICAgICAgICAgKDEgPDwgMjMpCisjICAgICAgIGRlZmluZSBMQ19PVEhFUl9TSURFX1NVUFBPUlRTX0dFTjIgICAgICAgICAgICAgICAgKDEgPDwgMjQpCisjZGVmaW5lIE1NX0NGR1JFR1NfQ05UTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg1NDRjCisjICAgICAgIGRlZmluZSBNTV9XUl9UT19DRkdfRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgMykKKyNkZWZpbmUgTElOS19DTlRMMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDg4IC8qIEYwICovCisjICAgICAgIGRlZmluZSBUQVJHRVRfTElOS19TUEVFRF9NQVNLICAgICAgICAgICAgICAgICAgICAgKDB4ZiA8PCAwKQorIyAgICAgICBkZWZpbmUgU0VMRUNUQUJMRV9ERUVNUEhBU0lTICAgICAgICAgICAgICAgICAgICAgICgxIDw8IDYpCisKIC8qCiAgKiBQTTQKICAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb24uaCBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uLmgKaW5kZXggM2E3MDk1Ny4uZTk0ODY2MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb24uaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbi5oCkBAIC02OSw2ICs2OSw3IEBACiAjaW5jbHVkZSA8dHRtL3R0bV9ib19kcml2ZXIuaD4KICNpbmNsdWRlIDx0dG0vdHRtX3BsYWNlbWVudC5oPgogI2luY2x1ZGUgPHR0bS90dG1fbW9kdWxlLmg+CisjaW5jbHVkZSA8dHRtL3R0bV9leGVjYnVmX3V0aWwuaD4KIAogI2luY2x1ZGUgInJhZGVvbl9mYW1pbHkuaCIKICNpbmNsdWRlICJyYWRlb25fbW9kZS5oIgpAQCAtMTgwLDYgKzE4MSw3IEBACiBleHRlcm4gdTMyIHJ2Nnh4X2dldF90ZW1wKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKIGV4dGVybiB1MzIgcnY3NzBfZ2V0X3RlbXAoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwogZXh0ZXJuIHUzMiBldmVyZ3JlZW5fZ2V0X3RlbXAoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOworZXh0ZXJuIHUzMiBzdW1vX2dldF90ZW1wKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKIAogLyoKICAqIEZlbmNlcy4KQEAgLTI1OSwxMyArMjYxLDEyIEBACiB9OwogCiBzdHJ1Y3QgcmFkZW9uX2JvX2xpc3QgewotCXN0cnVjdCBsaXN0X2hlYWQJbGlzdDsKKwlzdHJ1Y3QgdHRtX3ZhbGlkYXRlX2J1ZmZlciB0djsKIAlzdHJ1Y3QgcmFkZW9uX2JvCSpibzsKIAl1aW50NjRfdAkJZ3B1X29mZnNldDsKIAl1bnNpZ25lZAkJcmRvbWFpbjsKIAl1bnNpZ25lZAkJd2RvbWFpbjsKIAl1MzIJCQl0aWxpbmdfZmxhZ3M7Ci0JYm9vbAkJCXJlc2VydmVkOwogfTsKIAogLyoKQEAgLTM3NywxMSArMzc4LDU2IEBACiAvKgogICogSVJRUy4KICAqLworCitzdHJ1Y3QgcmFkZW9uX3VucGluX3dvcmsgeworCXN0cnVjdCB3b3JrX3N0cnVjdCB3b3JrOworCXN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2OworCWludCBjcnRjX2lkOworCXN0cnVjdCByYWRlb25fZmVuY2UgKmZlbmNlOworCXN0cnVjdCBkcm1fcGVuZGluZ192YmxhbmtfZXZlbnQgKmV2ZW50OworCXN0cnVjdCByYWRlb25fYm8gKm9sZF9yYm87CisJdTY0IG5ld19jcnRjX2Jhc2U7Cit9OworCitzdHJ1Y3QgcjUwMF9pcnFfc3RhdF9yZWdzIHsKKwl1MzIgZGlzcF9pbnQ7Cit9OworCitzdHJ1Y3QgcjYwMF9pcnFfc3RhdF9yZWdzIHsKKwl1MzIgZGlzcF9pbnQ7CisJdTMyIGRpc3BfaW50X2NvbnQ7CisJdTMyIGRpc3BfaW50X2NvbnQyOworCXUzMiBkMWdycGhfaW50OworCXUzMiBkMmdycGhfaW50OworfTsKKworc3RydWN0IGV2ZXJncmVlbl9pcnFfc3RhdF9yZWdzIHsKKwl1MzIgZGlzcF9pbnQ7CisJdTMyIGRpc3BfaW50X2NvbnQ7CisJdTMyIGRpc3BfaW50X2NvbnQyOworCXUzMiBkaXNwX2ludF9jb250MzsKKwl1MzIgZGlzcF9pbnRfY29udDQ7CisJdTMyIGRpc3BfaW50X2NvbnQ1OworCXUzMiBkMWdycGhfaW50OworCXUzMiBkMmdycGhfaW50OworCXUzMiBkM2dycGhfaW50OworCXUzMiBkNGdycGhfaW50OworCXUzMiBkNWdycGhfaW50OworCXUzMiBkNmdycGhfaW50OworfTsKKwordW5pb24gcmFkZW9uX2lycV9zdGF0X3JlZ3MgeworCXN0cnVjdCByNTAwX2lycV9zdGF0X3JlZ3MgcjUwMDsKKwlzdHJ1Y3QgcjYwMF9pcnFfc3RhdF9yZWdzIHI2MDA7CisJc3RydWN0IGV2ZXJncmVlbl9pcnFfc3RhdF9yZWdzIGV2ZXJncmVlbjsKK307CisKIHN0cnVjdCByYWRlb25faXJxIHsKIAlib29sCQlpbnN0YWxsZWQ7CiAJYm9vbAkJc3dfaW50OwogCS8qIEZJWE1FOiB1c2UgYSBkZWZpbmUgbWF4IGNydGMgcmF0aGVyIHRoYW4gaGFyZGNvZGUgaXQgKi8KIAlib29sCQljcnRjX3ZibGFua19pbnRbNl07CisJYm9vbAkJcGZsaXBbNl07CiAJd2FpdF9xdWV1ZV9oZWFkX3QJdmJsYW5rX3F1ZXVlOwogCS8qIEZJWE1FOiB1c2UgZGVmaW5lcyBmb3IgbWF4IGhwZC9kYWNzICovCiAJYm9vbCAgICAgICAgICAgIGhwZFs2XTsKQEAgLTM5MiwxMiArNDM4LDE3IEBACiAJYm9vbAkJaGRtaVsyXTsKIAlzcGlubG9ja190IHN3X2xvY2s7CiAJaW50IHN3X3JlZmNvdW50OworCXVuaW9uIHJhZGVvbl9pcnFfc3RhdF9yZWdzIHN0YXRfcmVnczsKKwlzcGlubG9ja190IHBmbGlwX2xvY2tbNl07CisJaW50IHBmbGlwX3JlZmNvdW50WzZdOwogfTsKIAogaW50IHJhZGVvbl9pcnFfa21zX2luaXQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwogdm9pZCByYWRlb25faXJxX2ttc19maW5pKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKIHZvaWQgcmFkZW9uX2lycV9rbXNfc3dfaXJxX2dldChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CiB2b2lkIHJhZGVvbl9pcnFfa21zX3N3X2lycV9wdXQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwordm9pZCByYWRlb25faXJxX2ttc19wZmxpcF9pcnFfZ2V0KHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LCBpbnQgY3J0Yyk7Cit2b2lkIHJhZGVvbl9pcnFfa21zX3BmbGlwX2lycV9wdXQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIGludCBjcnRjKTsKIAogLyoKICAqIENQICYgcmluZy4KQEAgLTY4Nyw2ICs3MzgsOCBAQAogCVRIRVJNQUxfVFlQRV9SVjZYWCwKIAlUSEVSTUFMX1RZUEVfUlY3NzAsCiAJVEhFUk1BTF9UWVBFX0VWRVJHUkVFTiwKKwlUSEVSTUFMX1RZUEVfU1VNTywKKwlUSEVSTUFMX1RZUEVfTkksCiB9OwogCiBzdHJ1Y3QgcmFkZW9uX3ZvbHRhZ2UgewpAQCAtNzcwLDYgKzgyMyw5IEBACiAJdTMyICAgICAgICAgICAgICAgICAgICAgY3VycmVudF9zY2xrOwogCXUzMiAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfbWNsazsKIAl1MzIgICAgICAgICAgICAgICAgICAgICBjdXJyZW50X3ZkZGM7CisJdTMyICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdF9zY2xrOworCXUzMiAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRfbWNsazsKKwl1MzIgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0X3ZkZGM7CiAJc3RydWN0IHJhZGVvbl9pMmNfY2hhbiAqaTJjX2J1czsKIAkvKiBzZWxlY3RlZCBwbSBtZXRob2QgKi8KIAllbnVtIHJhZGVvbl9wbV9tZXRob2QgICAgIHBtX21ldGhvZDsKQEAgLTg4MSw2ICs5MzcsMTAgQEAKIAl2b2lkICgqcG1fZmluaXNoKShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CiAJdm9pZCAoKnBtX2luaXRfcHJvZmlsZSkoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwogCXZvaWQgKCpwbV9nZXRfZHlucG1fc3RhdGUpKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKKwkvKiBwYWdlZmxpcHBpbmcgKi8KKwl2b2lkICgqcHJlX3BhZ2VfZmxpcCkoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIGludCBjcnRjKTsKKwl1MzIgKCpwYWdlX2ZsaXApKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LCBpbnQgY3J0YywgdTY0IGNydGNfYmFzZSk7CisJdm9pZCAoKnBvc3RfcGFnZV9mbGlwKShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwgaW50IGNydGMpOwogfTsKIAogLyoKQEAgLTk3NSw2ICsxMDM1LDcgQEAKIAl1bnNpZ25lZCB0aWxpbmdfbnBpcGVzOwogCXVuc2lnbmVkIHRpbGluZ19ncm91cF9zaXplOwogCXVuc2lnbmVkIHRpbGVfY29uZmlnOworCXN0cnVjdCByMTAwX2dwdV9sb2NrdXAJbG9ja3VwOwogfTsKIAogdW5pb24gcmFkZW9uX2FzaWNfY29uZmlnIHsKQEAgLTEwOTEsMTEgKzExNTIsMTEgQEAKIAljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKm1lX2Z3OwkvKiBhbGwgZmFtaWx5IE1FIGZpcm13YXJlICovCiAJY29uc3Qgc3RydWN0IGZpcm13YXJlICpwZnBfZnc7CS8qIHI2LzcwMCBQRlAgZmlybXdhcmUgKi8KIAljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKnJsY19mdzsJLyogcjYvNzAwIFJMQyBmaXJtd2FyZSAqLworCWNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqbWNfZnc7CS8qIE5JIE1DIGZpcm13YXJlICovCiAJc3RydWN0IHI2MDBfYmxpdCByNjAwX2JsaXQ7CiAJc3RydWN0IHI3MDBfdnJhbV9zY3JhdGNoIHZyYW1fc2NyYXRjaDsKIAlpbnQgbXNpX2VuYWJsZWQ7IC8qIG1zaSBlbmFibGVkICovCiAJc3RydWN0IHI2MDBfaWggaWg7IC8qIHI2LzcwMCBpbnRlcnJ1cHQgcmluZyAqLwotCXN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICp3cTsKIAlzdHJ1Y3Qgd29ya19zdHJ1Y3QgaG90cGx1Z193b3JrOwogCWludCBudW1fY3J0YzsgLyogbnVtYmVyIG9mIGNydGNzICovCiAJc3RydWN0IG11dGV4IGRjX2h3X2kyY19tdXRleDsgLyogZGlzcGxheSBjb250cm9sbGVyIGh3IGkyYyBtdXRleCAqLwpAQCAtMTExMCwxMCArMTE3MSwxMCBAQAogCXVpbnQ4X3QJCQlhdWRpb19zdGF0dXNfYml0czsKIAl1aW50OF90CQkJYXVkaW9fY2F0ZWdvcnlfY29kZTsKIAotCWJvb2wgcG93ZXJlZF9kb3duOwogCXN0cnVjdCBub3RpZmllcl9ibG9jayBhY3BpX25iOwotCS8qIG9ubHkgb25lIHVzZXJzcGFjZSBjYW4gdXNlIEh5cGVyeiBmZWF0dXJlcyBhdCBhIHRpbWUgKi8KKwkvKiBvbmx5IG9uZSB1c2Vyc3BhY2UgY2FuIHVzZSBIeXBlcnogZmVhdHVyZXMgb3IgQ01BU0sgYXQgYSB0aW1lICovCiAJc3RydWN0IGRybV9maWxlICpoeXBlcnpfZmlscDsKKwlzdHJ1Y3QgZHJtX2ZpbGUgKmNtYXNrX2ZpbHA7CiAJLyogaTJjIGJ1c2VzICovCiAJc3RydWN0IHJhZGVvbl9pMmNfY2hhbiAqaTJjX2J1c1tSQURFT05fTUFYX0kyQ19CVVNdOwogfTsKQEAgLTExODgsNiArMTI0OSw4IEBACiAgKi8KICNkZWZpbmUgUlJFRzgocmVnKSByZWFkYigoKHZvaWQgX19pb21lbSAqKXJkZXYtPnJtbWlvKSArIChyZWcpKQogI2RlZmluZSBXUkVHOChyZWcsIHYpIHdyaXRlYih2LCAoKHZvaWQgX19pb21lbSAqKXJkZXYtPnJtbWlvKSArIChyZWcpKQorI2RlZmluZSBSUkVHMTYocmVnKSByZWFkdygoKHZvaWQgX19pb21lbSAqKXJkZXYtPnJtbWlvKSArIChyZWcpKQorI2RlZmluZSBXUkVHMTYocmVnLCB2KSB3cml0ZXcodiwgKCh2b2lkIF9faW9tZW0gKilyZGV2LT5ybW1pbykgKyAocmVnKSkKICNkZWZpbmUgUlJFRzMyKHJlZykgcjEwMF9tbV9ycmVnKHJkZXYsIChyZWcpKQogI2RlZmluZSBEUkVHMzIocmVnKSBwcmludGsoS0VSTl9JTkZPICJSRUdJU1RFUjogIiAjcmVnICIgOiAweCUwOFhcbiIsIHIxMDBfbW1fcnJlZyhyZGV2LCAocmVnKSkpCiAjZGVmaW5lIFdSRUczMihyZWcsIHYpIHIxMDBfbW1fd3JlZyhyZGV2LCAocmVnKSwgKHYpKQpAQCAtMTI2MSw2ICsxMzI0LDE0IEBACiAJCShyZGV2LT5mYW1pbHkgPT0gQ0hJUF9SVjQxMCkgfHwJCQlcCiAJCShyZGV2LT5mYW1pbHkgPT0gQ0hJUF9SUzQwMCkgfHwJCQlcCiAJCShyZGV2LT5mYW1pbHkgPT0gQ0hJUF9SUzQ4MCkpCisjZGVmaW5lIEFTSUNfSVNfWDIocmRldikgKChyZGV2LT5kZGV2LT5wZGV2LT5kZXZpY2UgPT0gMHg5NDQxKSB8fCBcCisJCShyZGV2LT5kZGV2LT5wZGV2LT5kZXZpY2UgPT0gMHg5NDQzKSB8fCBcCisJCShyZGV2LT5kZGV2LT5wZGV2LT5kZXZpY2UgPT0gMHg5NDRCKSB8fCBcCisJCShyZGV2LT5kZGV2LT5wZGV2LT5kZXZpY2UgPT0gMHg5NTA2KSB8fCBcCisJCShyZGV2LT5kZGV2LT5wZGV2LT5kZXZpY2UgPT0gMHg5NTA5KSB8fCBcCisJCShyZGV2LT5kZGV2LT5wZGV2LT5kZXZpY2UgPT0gMHg5NTBGKSB8fCBcCisJCShyZGV2LT5kZGV2LT5wZGV2LT5kZXZpY2UgPT0gMHg2ODlDKSB8fCBcCisJCShyZGV2LT5kZGV2LT5wZGV2LT5kZXZpY2UgPT0gMHg2ODlEKSkKICNkZWZpbmUgQVNJQ19JU19BVklWTyhyZGV2KSAoKHJkZXYtPmZhbWlseSA+PSBDSElQX1JTNjAwKSkKICNkZWZpbmUgQVNJQ19JU19EQ0UyKHJkZXYpICgocmRldi0+ZmFtaWx5ID09IENISVBfUlM2MDApICB8fAlcCiAJCQkgICAgKHJkZXYtPmZhbWlseSA9PSBDSElQX1JTNjkwKSAgfHwJXApAQCAtMTI2OSw2ICsxMzQwLDkgQEAKICNkZWZpbmUgQVNJQ19JU19EQ0UzKHJkZXYpICgocmRldi0+ZmFtaWx5ID49IENISVBfUlY2MjApKQogI2RlZmluZSBBU0lDX0lTX0RDRTMyKHJkZXYpICgocmRldi0+ZmFtaWx5ID49IENISVBfUlY3MzApKQogI2RlZmluZSBBU0lDX0lTX0RDRTQocmRldikgKChyZGV2LT5mYW1pbHkgPj0gQ0hJUF9DRURBUikpCisjZGVmaW5lIEFTSUNfSVNfRENFNDEocmRldikgKChyZGV2LT5mYW1pbHkgPj0gQ0hJUF9QQUxNKSAmJiBcCisJCQkgICAgIChyZGV2LT5mbGFncyAmIFJBREVPTl9JU19JR1ApKQorI2RlZmluZSBBU0lDX0lTX0RDRTUocmRldikgKChyZGV2LT5mYW1pbHkgPj0gQ0hJUF9CQVJUUykpCiAKIC8qCiAgKiBCSU9TIGhlbHBlcnMuCkBAIC0xMzQ0LDYgKzE0MTgsOSBAQAogI2RlZmluZSByYWRlb25fcG1fZmluaXNoKHJkZXYpIChyZGV2KS0+YXNpYy0+cG1fZmluaXNoKChyZGV2KSkKICNkZWZpbmUgcmFkZW9uX3BtX2luaXRfcHJvZmlsZShyZGV2KSAocmRldiktPmFzaWMtPnBtX2luaXRfcHJvZmlsZSgocmRldikpCiAjZGVmaW5lIHJhZGVvbl9wbV9nZXRfZHlucG1fc3RhdGUocmRldikgKHJkZXYpLT5hc2ljLT5wbV9nZXRfZHlucG1fc3RhdGUoKHJkZXYpKQorI2RlZmluZSByYWRlb25fcHJlX3BhZ2VfZmxpcChyZGV2LCBjcnRjKSByZGV2LT5hc2ljLT5wcmVfcGFnZV9mbGlwKChyZGV2KSwgKGNydGMpKQorI2RlZmluZSByYWRlb25fcGFnZV9mbGlwKHJkZXYsIGNydGMsIGJhc2UpIHJkZXYtPmFzaWMtPnBhZ2VfZmxpcCgocmRldiksIChjcnRjKSwgKGJhc2UpKQorI2RlZmluZSByYWRlb25fcG9zdF9wYWdlX2ZsaXAocmRldiwgY3J0YykgcmRldi0+YXNpYy0+cG9zdF9wYWdlX2ZsaXAoKHJkZXYpLCAoY3J0YykpCiAKIC8qIENvbW1vbiBmdW5jdGlvbnMgKi8KIC8qIEFHUCAqLwpAQCAtMTM3Miw2NyArMTQ0OSw3IEBACiBleHRlcm4gaW50IHJhZGVvbl9yZXN1bWVfa21zKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwogZXh0ZXJuIGludCByYWRlb25fc3VzcGVuZF9rbXMoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgcG1fbWVzc2FnZV90IHN0YXRlKTsKIAotLyogcjEwMCxydjEwMCxyczEwMCxydjIwMCxyczIwMCxyMjAwLHJ2MjUwLHJzMzAwLHJ2MjgwICovCi1leHRlcm4gdm9pZCByMTAwX2dwdV9sb2NrdXBfdXBkYXRlKHN0cnVjdCByMTAwX2dwdV9sb2NrdXAgKmxvY2t1cCwgc3RydWN0IHJhZGVvbl9jcCAqY3ApOwotZXh0ZXJuIGJvb2wgcjEwMF9ncHVfY3BfaXNfbG9ja3VwKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LCBzdHJ1Y3QgcjEwMF9ncHVfbG9ja3VwICpsb2NrdXAsIHN0cnVjdCByYWRlb25fY3AgKmNwKTsKLQotLyogcnYyMDAscnYyNTAscnYyODAgKi8KLWV4dGVybiB2b2lkIHIyMDBfc2V0X3NhZmVfcmVnaXN0ZXJzKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKLQotLyogcjMwMCxyMzUwLHJ2MzUwLHJ2MzcwLHJ2MzgwICovCi1leHRlcm4gdm9pZCByMzAwX3NldF9yZWdfc2FmZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7Ci1leHRlcm4gdm9pZCByMzAwX21jX3Byb2dyYW0oc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwotZXh0ZXJuIHZvaWQgcjMwMF9tY19pbml0KHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKLWV4dGVybiB2b2lkIHIzMDBfY2xvY2tfc3RhcnR1cChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7Ci1leHRlcm4gaW50IHIzMDBfbWNfd2FpdF9mb3JfaWRsZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7Ci1leHRlcm4gaW50IHJ2MzcwX3BjaWVfZ2FydF9pbml0KHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKLWV4dGVybiB2b2lkIHJ2MzcwX3BjaWVfZ2FydF9maW5pKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKLWV4dGVybiBpbnQgcnYzNzBfcGNpZV9nYXJ0X2VuYWJsZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7Ci1leHRlcm4gdm9pZCBydjM3MF9wY2llX2dhcnRfZGlzYWJsZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7Ci0KLS8qIHI0MjAscjQyMyxydjQxMCAqLwotZXh0ZXJuIHUzMiByNDIwX21jX3JyZWcoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIHUzMiByZWcpOwotZXh0ZXJuIHZvaWQgcjQyMF9tY193cmVnKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LCB1MzIgcmVnLCB1MzIgdik7Ci1leHRlcm4gaW50IHI0MjBfZGVidWdmc19waXBlc19pbmZvX2luaXQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwotZXh0ZXJuIHZvaWQgcjQyMF9waXBlc19pbml0KHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKLQotLyogcnY1MTUgKi8KLXN0cnVjdCBydjUxNV9tY19zYXZlIHsKLQl1MzIgZDF2Z2FfY29udHJvbDsKLQl1MzIgZDJ2Z2FfY29udHJvbDsKLQl1MzIgdmdhX3JlbmRlcl9jb250cm9sOwotCXUzMiB2Z2FfaGRwX2NvbnRyb2w7Ci0JdTMyIGQxY3J0Y19jb250cm9sOwotCXUzMiBkMmNydGNfY29udHJvbDsKLX07Ci1leHRlcm4gdm9pZCBydjUxNV9iYW5kd2lkdGhfYXZpdm9fdXBkYXRlKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKLWV4dGVybiB2b2lkIHJ2NTE1X3ZnYV9yZW5kZXJfZGlzYWJsZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7Ci1leHRlcm4gdm9pZCBydjUxNV9zZXRfc2FmZV9yZWdpc3RlcnMoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwotZXh0ZXJuIHZvaWQgcnY1MTVfbWNfc3RvcChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwgc3RydWN0IHJ2NTE1X21jX3NhdmUgKnNhdmUpOwotZXh0ZXJuIHZvaWQgcnY1MTVfbWNfcmVzdW1lKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LCBzdHJ1Y3QgcnY1MTVfbWNfc2F2ZSAqc2F2ZSk7Ci1leHRlcm4gdm9pZCBydjUxNV9jbG9ja19zdGFydHVwKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKLWV4dGVybiB2b2lkIHJ2NTE1X2RlYnVnZnMoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwotZXh0ZXJuIGludCBydjUxNV9zdXNwZW5kKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKLQotLyogcnM0MDAgKi8KLWV4dGVybiBpbnQgcnM0MDBfZ2FydF9pbml0KHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKLWV4dGVybiBpbnQgcnM0MDBfZ2FydF9lbmFibGUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwotZXh0ZXJuIHZvaWQgcnM0MDBfZ2FydF9hZGp1c3Rfc2l6ZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7Ci1leHRlcm4gdm9pZCByczQwMF9nYXJ0X2Rpc2FibGUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwotZXh0ZXJuIHZvaWQgcnM0MDBfZ2FydF9maW5pKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKLQotLyogcnM2MDAgKi8KLWV4dGVybiB2b2lkIHJzNjAwX3NldF9zYWZlX3JlZ2lzdGVycyhzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7Ci1leHRlcm4gaW50IHJzNjAwX2lycV9zZXQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwotZXh0ZXJuIHZvaWQgcnM2MDBfaXJxX2Rpc2FibGUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwotCi0vKiByczY5MCwgcnM3NDAgKi8KLWV4dGVybiB2b2lkIHJzNjkwX2xpbmVfYnVmZmVyX2FkanVzdChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwKLQkJCQkJc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUxLAotCQkJCQlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZTIpOwotCiAvKiByNjAwLCBydjYxMCwgcnY2MzAsIHJ2NjIwLCBydjYzNSwgcnY2NzAsIHJzNzgwLCByczg4MCAqLwotZXh0ZXJuIHZvaWQgcjYwMF92cmFtX2d0dF9sb2NhdGlvbihzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwgc3RydWN0IHJhZGVvbl9tYyAqbWMpOwogZXh0ZXJuIGJvb2wgcjYwMF9jYXJkX3Bvc3RlZChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CiBleHRlcm4gdm9pZCByNjAwX2NwX3N0b3Aoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwogZXh0ZXJuIGludCByNjAwX2NwX3N0YXJ0KHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKQEAgLTE0NzgsNiArMTQ5NSw3IEBACiBleHRlcm4gaW50IHI2MDBfaGRtaV9idWZmZXJfc3RhdHVzX2NoYW5nZWQoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKTsKIGV4dGVybiB2b2lkIHI2MDBfaGRtaV91cGRhdGVfYXVkaW9fc2V0dGluZ3Moc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKTsKIAorZXh0ZXJuIHZvaWQgcjcwMF92cmFtX2d0dF9sb2NhdGlvbihzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwgc3RydWN0IHJhZGVvbl9tYyAqbWMpOwogZXh0ZXJuIHZvaWQgcjcwMF9jcF9zdG9wKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKIGV4dGVybiB2b2lkIHI3MDBfY3BfZmluaShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CiBleHRlcm4gdm9pZCBldmVyZ3JlZW5fZGlzYWJsZV9pbnRlcnJ1cHRfc3RhdGUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwpAQCAtMTQ4NSw2ICsxNTAzLDkgQEAKIGV4dGVybiBpbnQgZXZlcmdyZWVuX2JsaXRfaW5pdChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CiBleHRlcm4gdm9pZCBldmVyZ3JlZW5fYmxpdF9maW5pKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKIAorZXh0ZXJuIGludCBuaV9pbml0X21pY3JvY29kZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CitleHRlcm4gaW50IGJ0Y19tY19sb2FkX21pY3JvY29kZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CisKIC8qIHJhZGVvbl9hY3BpLmMgKi8gCiAjaWYgZGVmaW5lZChDT05GSUdfQUNQSSkgCiBleHRlcm4gaW50IHJhZGVvbl9hY3BpX2luaXQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOyAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2FzaWMuYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2FzaWMuYwppbmRleCA2NGZiODllLi4zYTFiMTYxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9hc2ljLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fYXNpYy5jCkBAIC05NCw3ICs5NCw3IEBACiAJCXJkZXYtPm1jX3JyZWcgPSAmcnM2MDBfbWNfcnJlZzsKIAkJcmRldi0+bWNfd3JlZyA9ICZyczYwMF9tY193cmVnOwogCX0KLQlpZiAoKHJkZXYtPmZhbWlseSA+PSBDSElQX1I2MDApICYmIChyZGV2LT5mYW1pbHkgPD0gQ0hJUF9SVjc0MCkpIHsKKwlpZiAoKHJkZXYtPmZhbWlseSA+PSBDSElQX1I2MDApICYmIChyZGV2LT5mYW1pbHkgPD0gQ0hJUF9IRU1MT0NLKSkgewogCQlyZGV2LT5wY2llcF9ycmVnID0gJnI2MDBfcGNpZXBfcnJlZzsKIAkJcmRldi0+cGNpZXBfd3JlZyA9ICZyNjAwX3BjaWVwX3dyZWc7CiAJfQpAQCAtMTcxLDYgKzE3MSw5IEBACiAJLnBtX2ZpbmlzaCA9ICZyMTAwX3BtX2ZpbmlzaCwKIAkucG1faW5pdF9wcm9maWxlID0gJnIxMDBfcG1faW5pdF9wcm9maWxlLAogCS5wbV9nZXRfZHlucG1fc3RhdGUgPSAmcjEwMF9wbV9nZXRfZHlucG1fc3RhdGUsCisJLnByZV9wYWdlX2ZsaXAgPSAmcjEwMF9wcmVfcGFnZV9mbGlwLAorCS5wYWdlX2ZsaXAgPSAmcjEwMF9wYWdlX2ZsaXAsCisJLnBvc3RfcGFnZV9mbGlwID0gJnIxMDBfcG9zdF9wYWdlX2ZsaXAsCiB9OwogCiBzdGF0aWMgc3RydWN0IHJhZGVvbl9hc2ljIHIyMDBfYXNpYyA9IHsKQEAgLTIxNSw2ICsyMTgsOSBAQAogCS5wbV9maW5pc2ggPSAmcjEwMF9wbV9maW5pc2gsCiAJLnBtX2luaXRfcHJvZmlsZSA9ICZyMTAwX3BtX2luaXRfcHJvZmlsZSwKIAkucG1fZ2V0X2R5bnBtX3N0YXRlID0gJnIxMDBfcG1fZ2V0X2R5bnBtX3N0YXRlLAorCS5wcmVfcGFnZV9mbGlwID0gJnIxMDBfcHJlX3BhZ2VfZmxpcCwKKwkucGFnZV9mbGlwID0gJnIxMDBfcGFnZV9mbGlwLAorCS5wb3N0X3BhZ2VfZmxpcCA9ICZyMTAwX3Bvc3RfcGFnZV9mbGlwLAogfTsKIAogc3RhdGljIHN0cnVjdCByYWRlb25fYXNpYyByMzAwX2FzaWMgPSB7CkBAIC0yNjAsNiArMjY2LDkgQEAKIAkucG1fZmluaXNoID0gJnIxMDBfcG1fZmluaXNoLAogCS5wbV9pbml0X3Byb2ZpbGUgPSAmcjEwMF9wbV9pbml0X3Byb2ZpbGUsCiAJLnBtX2dldF9keW5wbV9zdGF0ZSA9ICZyMTAwX3BtX2dldF9keW5wbV9zdGF0ZSwKKwkucHJlX3BhZ2VfZmxpcCA9ICZyMTAwX3ByZV9wYWdlX2ZsaXAsCisJLnBhZ2VfZmxpcCA9ICZyMTAwX3BhZ2VfZmxpcCwKKwkucG9zdF9wYWdlX2ZsaXAgPSAmcjEwMF9wb3N0X3BhZ2VfZmxpcCwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcmFkZW9uX2FzaWMgcjMwMF9hc2ljX3BjaWUgPSB7CkBAIC0zMDQsNiArMzEzLDkgQEAKIAkucG1fZmluaXNoID0gJnIxMDBfcG1fZmluaXNoLAogCS5wbV9pbml0X3Byb2ZpbGUgPSAmcjEwMF9wbV9pbml0X3Byb2ZpbGUsCiAJLnBtX2dldF9keW5wbV9zdGF0ZSA9ICZyMTAwX3BtX2dldF9keW5wbV9zdGF0ZSwKKwkucHJlX3BhZ2VfZmxpcCA9ICZyMTAwX3ByZV9wYWdlX2ZsaXAsCisJLnBhZ2VfZmxpcCA9ICZyMTAwX3BhZ2VfZmxpcCwKKwkucG9zdF9wYWdlX2ZsaXAgPSAmcjEwMF9wb3N0X3BhZ2VfZmxpcCwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcmFkZW9uX2FzaWMgcjQyMF9hc2ljID0gewpAQCAtMzQ5LDYgKzM2MSw5IEBACiAJLnBtX2ZpbmlzaCA9ICZyMTAwX3BtX2ZpbmlzaCwKIAkucG1faW5pdF9wcm9maWxlID0gJnI0MjBfcG1faW5pdF9wcm9maWxlLAogCS5wbV9nZXRfZHlucG1fc3RhdGUgPSAmcjEwMF9wbV9nZXRfZHlucG1fc3RhdGUsCisJLnByZV9wYWdlX2ZsaXAgPSAmcjEwMF9wcmVfcGFnZV9mbGlwLAorCS5wYWdlX2ZsaXAgPSAmcjEwMF9wYWdlX2ZsaXAsCisJLnBvc3RfcGFnZV9mbGlwID0gJnIxMDBfcG9zdF9wYWdlX2ZsaXAsCiB9OwogCiBzdGF0aWMgc3RydWN0IHJhZGVvbl9hc2ljIHJzNDAwX2FzaWMgPSB7CkBAIC0zOTQsNiArNDA5LDkgQEAKIAkucG1fZmluaXNoID0gJnIxMDBfcG1fZmluaXNoLAogCS5wbV9pbml0X3Byb2ZpbGUgPSAmcjEwMF9wbV9pbml0X3Byb2ZpbGUsCiAJLnBtX2dldF9keW5wbV9zdGF0ZSA9ICZyMTAwX3BtX2dldF9keW5wbV9zdGF0ZSwKKwkucHJlX3BhZ2VfZmxpcCA9ICZyMTAwX3ByZV9wYWdlX2ZsaXAsCisJLnBhZ2VfZmxpcCA9ICZyMTAwX3BhZ2VfZmxpcCwKKwkucG9zdF9wYWdlX2ZsaXAgPSAmcjEwMF9wb3N0X3BhZ2VfZmxpcCwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcmFkZW9uX2FzaWMgcnM2MDBfYXNpYyA9IHsKQEAgLTQzOSw2ICs0NTcsOSBAQAogCS5wbV9maW5pc2ggPSAmcnM2MDBfcG1fZmluaXNoLAogCS5wbV9pbml0X3Byb2ZpbGUgPSAmcjQyMF9wbV9pbml0X3Byb2ZpbGUsCiAJLnBtX2dldF9keW5wbV9zdGF0ZSA9ICZyMTAwX3BtX2dldF9keW5wbV9zdGF0ZSwKKwkucHJlX3BhZ2VfZmxpcCA9ICZyczYwMF9wcmVfcGFnZV9mbGlwLAorCS5wYWdlX2ZsaXAgPSAmcnM2MDBfcGFnZV9mbGlwLAorCS5wb3N0X3BhZ2VfZmxpcCA9ICZyczYwMF9wb3N0X3BhZ2VfZmxpcCwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcmFkZW9uX2FzaWMgcnM2OTBfYXNpYyA9IHsKQEAgLTQ4NCw2ICs1MDUsOSBAQAogCS5wbV9maW5pc2ggPSAmcnM2MDBfcG1fZmluaXNoLAogCS5wbV9pbml0X3Byb2ZpbGUgPSAmcjQyMF9wbV9pbml0X3Byb2ZpbGUsCiAJLnBtX2dldF9keW5wbV9zdGF0ZSA9ICZyMTAwX3BtX2dldF9keW5wbV9zdGF0ZSwKKwkucHJlX3BhZ2VfZmxpcCA9ICZyczYwMF9wcmVfcGFnZV9mbGlwLAorCS5wYWdlX2ZsaXAgPSAmcnM2MDBfcGFnZV9mbGlwLAorCS5wb3N0X3BhZ2VfZmxpcCA9ICZyczYwMF9wb3N0X3BhZ2VfZmxpcCwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcmFkZW9uX2FzaWMgcnY1MTVfYXNpYyA9IHsKQEAgLTUyOSw2ICs1NTMsOSBAQAogCS5wbV9maW5pc2ggPSAmcnM2MDBfcG1fZmluaXNoLAogCS5wbV9pbml0X3Byb2ZpbGUgPSAmcjQyMF9wbV9pbml0X3Byb2ZpbGUsCiAJLnBtX2dldF9keW5wbV9zdGF0ZSA9ICZyMTAwX3BtX2dldF9keW5wbV9zdGF0ZSwKKwkucHJlX3BhZ2VfZmxpcCA9ICZyczYwMF9wcmVfcGFnZV9mbGlwLAorCS5wYWdlX2ZsaXAgPSAmcnM2MDBfcGFnZV9mbGlwLAorCS5wb3N0X3BhZ2VfZmxpcCA9ICZyczYwMF9wb3N0X3BhZ2VfZmxpcCwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcmFkZW9uX2FzaWMgcjUyMF9hc2ljID0gewpAQCAtNTc0LDYgKzYwMSw5IEBACiAJLnBtX2ZpbmlzaCA9ICZyczYwMF9wbV9maW5pc2gsCiAJLnBtX2luaXRfcHJvZmlsZSA9ICZyNDIwX3BtX2luaXRfcHJvZmlsZSwKIAkucG1fZ2V0X2R5bnBtX3N0YXRlID0gJnIxMDBfcG1fZ2V0X2R5bnBtX3N0YXRlLAorCS5wcmVfcGFnZV9mbGlwID0gJnJzNjAwX3ByZV9wYWdlX2ZsaXAsCisJLnBhZ2VfZmxpcCA9ICZyczYwMF9wYWdlX2ZsaXAsCisJLnBvc3RfcGFnZV9mbGlwID0gJnJzNjAwX3Bvc3RfcGFnZV9mbGlwLAogfTsKIAogc3RhdGljIHN0cnVjdCByYWRlb25fYXNpYyByNjAwX2FzaWMgPSB7CkBAIC02MDEsOCArNjMxLDggQEAKIAkuc2V0X2VuZ2luZV9jbG9jayA9ICZyYWRlb25fYXRvbV9zZXRfZW5naW5lX2Nsb2NrLAogCS5nZXRfbWVtb3J5X2Nsb2NrID0gJnJhZGVvbl9hdG9tX2dldF9tZW1vcnlfY2xvY2ssCiAJLnNldF9tZW1vcnlfY2xvY2sgPSAmcmFkZW9uX2F0b21fc2V0X21lbW9yeV9jbG9jaywKLQkuZ2V0X3BjaWVfbGFuZXMgPSAmcnYzNzBfZ2V0X3BjaWVfbGFuZXMsCi0JLnNldF9wY2llX2xhbmVzID0gTlVMTCwKKwkuZ2V0X3BjaWVfbGFuZXMgPSAmcjYwMF9nZXRfcGNpZV9sYW5lcywKKwkuc2V0X3BjaWVfbGFuZXMgPSAmcjYwMF9zZXRfcGNpZV9sYW5lcywKIAkuc2V0X2Nsb2NrX2dhdGluZyA9IE5VTEwsCiAJLnNldF9zdXJmYWNlX3JlZyA9IHI2MDBfc2V0X3N1cmZhY2VfcmVnLAogCS5jbGVhcl9zdXJmYWNlX3JlZyA9IHI2MDBfY2xlYXJfc3VyZmFjZV9yZWcsCkBAIC02MTgsNiArNjQ4LDkgQEAKIAkucG1fZmluaXNoID0gJnJzNjAwX3BtX2ZpbmlzaCwKIAkucG1faW5pdF9wcm9maWxlID0gJnI2MDBfcG1faW5pdF9wcm9maWxlLAogCS5wbV9nZXRfZHlucG1fc3RhdGUgPSAmcjYwMF9wbV9nZXRfZHlucG1fc3RhdGUsCisJLnByZV9wYWdlX2ZsaXAgPSAmcnM2MDBfcHJlX3BhZ2VfZmxpcCwKKwkucGFnZV9mbGlwID0gJnJzNjAwX3BhZ2VfZmxpcCwKKwkucG9zdF9wYWdlX2ZsaXAgPSAmcnM2MDBfcG9zdF9wYWdlX2ZsaXAsCiB9OwogCiBzdGF0aWMgc3RydWN0IHJhZGVvbl9hc2ljIHJzNzgwX2FzaWMgPSB7CkBAIC02NjIsNiArNjk1LDkgQEAKIAkucG1fZmluaXNoID0gJnJzNjAwX3BtX2ZpbmlzaCwKIAkucG1faW5pdF9wcm9maWxlID0gJnJzNzgwX3BtX2luaXRfcHJvZmlsZSwKIAkucG1fZ2V0X2R5bnBtX3N0YXRlID0gJnI2MDBfcG1fZ2V0X2R5bnBtX3N0YXRlLAorCS5wcmVfcGFnZV9mbGlwID0gJnJzNjAwX3ByZV9wYWdlX2ZsaXAsCisJLnBhZ2VfZmxpcCA9ICZyczYwMF9wYWdlX2ZsaXAsCisJLnBvc3RfcGFnZV9mbGlwID0gJnJzNjAwX3Bvc3RfcGFnZV9mbGlwLAogfTsKIAogc3RhdGljIHN0cnVjdCByYWRlb25fYXNpYyBydjc3MF9hc2ljID0gewpAQCAtNjg5LDggKzcyNSw4IEBACiAJLnNldF9lbmdpbmVfY2xvY2sgPSAmcmFkZW9uX2F0b21fc2V0X2VuZ2luZV9jbG9jaywKIAkuZ2V0X21lbW9yeV9jbG9jayA9ICZyYWRlb25fYXRvbV9nZXRfbWVtb3J5X2Nsb2NrLAogCS5zZXRfbWVtb3J5X2Nsb2NrID0gJnJhZGVvbl9hdG9tX3NldF9tZW1vcnlfY2xvY2ssCi0JLmdldF9wY2llX2xhbmVzID0gJnJ2MzcwX2dldF9wY2llX2xhbmVzLAotCS5zZXRfcGNpZV9sYW5lcyA9IE5VTEwsCisJLmdldF9wY2llX2xhbmVzID0gJnI2MDBfZ2V0X3BjaWVfbGFuZXMsCisJLnNldF9wY2llX2xhbmVzID0gJnI2MDBfc2V0X3BjaWVfbGFuZXMsCiAJLnNldF9jbG9ja19nYXRpbmcgPSAmcmFkZW9uX2F0b21fc2V0X2Nsb2NrX2dhdGluZywKIAkuc2V0X3N1cmZhY2VfcmVnID0gcjYwMF9zZXRfc3VyZmFjZV9yZWcsCiAJLmNsZWFyX3N1cmZhY2VfcmVnID0gcjYwMF9jbGVhcl9zdXJmYWNlX3JlZywKQEAgLTcwNiw2ICs3NDIsOSBAQAogCS5wbV9maW5pc2ggPSAmcnM2MDBfcG1fZmluaXNoLAogCS5wbV9pbml0X3Byb2ZpbGUgPSAmcjYwMF9wbV9pbml0X3Byb2ZpbGUsCiAJLnBtX2dldF9keW5wbV9zdGF0ZSA9ICZyNjAwX3BtX2dldF9keW5wbV9zdGF0ZSwKKwkucHJlX3BhZ2VfZmxpcCA9ICZyczYwMF9wcmVfcGFnZV9mbGlwLAorCS5wYWdlX2ZsaXAgPSAmcnY3NzBfcGFnZV9mbGlwLAorCS5wb3N0X3BhZ2VfZmxpcCA9ICZyczYwMF9wb3N0X3BhZ2VfZmxpcCwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcmFkZW9uX2FzaWMgZXZlcmdyZWVuX2FzaWMgPSB7CkBAIC03MzMsNiArNzcyLDk1IEBACiAJLnNldF9lbmdpbmVfY2xvY2sgPSAmcmFkZW9uX2F0b21fc2V0X2VuZ2luZV9jbG9jaywKIAkuZ2V0X21lbW9yeV9jbG9jayA9ICZyYWRlb25fYXRvbV9nZXRfbWVtb3J5X2Nsb2NrLAogCS5zZXRfbWVtb3J5X2Nsb2NrID0gJnJhZGVvbl9hdG9tX3NldF9tZW1vcnlfY2xvY2ssCisJLmdldF9wY2llX2xhbmVzID0gJnI2MDBfZ2V0X3BjaWVfbGFuZXMsCisJLnNldF9wY2llX2xhbmVzID0gJnI2MDBfc2V0X3BjaWVfbGFuZXMsCisJLnNldF9jbG9ja19nYXRpbmcgPSBOVUxMLAorCS5zZXRfc3VyZmFjZV9yZWcgPSByNjAwX3NldF9zdXJmYWNlX3JlZywKKwkuY2xlYXJfc3VyZmFjZV9yZWcgPSByNjAwX2NsZWFyX3N1cmZhY2VfcmVnLAorCS5iYW5kd2lkdGhfdXBkYXRlID0gJmV2ZXJncmVlbl9iYW5kd2lkdGhfdXBkYXRlLAorCS5ocGRfaW5pdCA9ICZldmVyZ3JlZW5faHBkX2luaXQsCisJLmhwZF9maW5pID0gJmV2ZXJncmVlbl9ocGRfZmluaSwKKwkuaHBkX3NlbnNlID0gJmV2ZXJncmVlbl9ocGRfc2Vuc2UsCisJLmhwZF9zZXRfcG9sYXJpdHkgPSAmZXZlcmdyZWVuX2hwZF9zZXRfcG9sYXJpdHksCisJLmd1aV9pZGxlID0gJnI2MDBfZ3VpX2lkbGUsCisJLnBtX21pc2MgPSAmZXZlcmdyZWVuX3BtX21pc2MsCisJLnBtX3ByZXBhcmUgPSAmZXZlcmdyZWVuX3BtX3ByZXBhcmUsCisJLnBtX2ZpbmlzaCA9ICZldmVyZ3JlZW5fcG1fZmluaXNoLAorCS5wbV9pbml0X3Byb2ZpbGUgPSAmcjYwMF9wbV9pbml0X3Byb2ZpbGUsCisJLnBtX2dldF9keW5wbV9zdGF0ZSA9ICZyNjAwX3BtX2dldF9keW5wbV9zdGF0ZSwKKwkucHJlX3BhZ2VfZmxpcCA9ICZldmVyZ3JlZW5fcHJlX3BhZ2VfZmxpcCwKKwkucGFnZV9mbGlwID0gJmV2ZXJncmVlbl9wYWdlX2ZsaXAsCisJLnBvc3RfcGFnZV9mbGlwID0gJmV2ZXJncmVlbl9wb3N0X3BhZ2VfZmxpcCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmFkZW9uX2FzaWMgc3Vtb19hc2ljID0geworCS5pbml0ID0gJmV2ZXJncmVlbl9pbml0LAorCS5maW5pID0gJmV2ZXJncmVlbl9maW5pLAorCS5zdXNwZW5kID0gJmV2ZXJncmVlbl9zdXNwZW5kLAorCS5yZXN1bWUgPSAmZXZlcmdyZWVuX3Jlc3VtZSwKKwkuY3BfY29tbWl0ID0gJnI2MDBfY3BfY29tbWl0LAorCS5ncHVfaXNfbG9ja3VwID0gJmV2ZXJncmVlbl9ncHVfaXNfbG9ja3VwLAorCS5hc2ljX3Jlc2V0ID0gJmV2ZXJncmVlbl9hc2ljX3Jlc2V0LAorCS52Z2Ffc2V0X3N0YXRlID0gJnI2MDBfdmdhX3NldF9zdGF0ZSwKKwkuZ2FydF90bGJfZmx1c2ggPSAmZXZlcmdyZWVuX3BjaWVfZ2FydF90bGJfZmx1c2gsCisJLmdhcnRfc2V0X3BhZ2UgPSAmcnM2MDBfZ2FydF9zZXRfcGFnZSwKKwkucmluZ190ZXN0ID0gJnI2MDBfcmluZ190ZXN0LAorCS5yaW5nX2liX2V4ZWN1dGUgPSAmcjYwMF9yaW5nX2liX2V4ZWN1dGUsCisJLmlycV9zZXQgPSAmZXZlcmdyZWVuX2lycV9zZXQsCisJLmlycV9wcm9jZXNzID0gJmV2ZXJncmVlbl9pcnFfcHJvY2VzcywKKwkuZ2V0X3ZibGFua19jb3VudGVyID0gJmV2ZXJncmVlbl9nZXRfdmJsYW5rX2NvdW50ZXIsCisJLmZlbmNlX3JpbmdfZW1pdCA9ICZyNjAwX2ZlbmNlX3JpbmdfZW1pdCwKKwkuY3NfcGFyc2UgPSAmZXZlcmdyZWVuX2NzX3BhcnNlLAorCS5jb3B5X2JsaXQgPSAmZXZlcmdyZWVuX2NvcHlfYmxpdCwKKwkuY29weV9kbWEgPSAmZXZlcmdyZWVuX2NvcHlfYmxpdCwKKwkuY29weSA9ICZldmVyZ3JlZW5fY29weV9ibGl0LAorCS5nZXRfZW5naW5lX2Nsb2NrID0gJnJhZGVvbl9hdG9tX2dldF9lbmdpbmVfY2xvY2ssCisJLnNldF9lbmdpbmVfY2xvY2sgPSAmcmFkZW9uX2F0b21fc2V0X2VuZ2luZV9jbG9jaywKKwkuZ2V0X21lbW9yeV9jbG9jayA9IE5VTEwsCisJLnNldF9tZW1vcnlfY2xvY2sgPSBOVUxMLAorCS5nZXRfcGNpZV9sYW5lcyA9IE5VTEwsCisJLnNldF9wY2llX2xhbmVzID0gTlVMTCwKKwkuc2V0X2Nsb2NrX2dhdGluZyA9IE5VTEwsCisJLnNldF9zdXJmYWNlX3JlZyA9IHI2MDBfc2V0X3N1cmZhY2VfcmVnLAorCS5jbGVhcl9zdXJmYWNlX3JlZyA9IHI2MDBfY2xlYXJfc3VyZmFjZV9yZWcsCisJLmJhbmR3aWR0aF91cGRhdGUgPSAmZXZlcmdyZWVuX2JhbmR3aWR0aF91cGRhdGUsCisJLmhwZF9pbml0ID0gJmV2ZXJncmVlbl9ocGRfaW5pdCwKKwkuaHBkX2ZpbmkgPSAmZXZlcmdyZWVuX2hwZF9maW5pLAorCS5ocGRfc2Vuc2UgPSAmZXZlcmdyZWVuX2hwZF9zZW5zZSwKKwkuaHBkX3NldF9wb2xhcml0eSA9ICZldmVyZ3JlZW5faHBkX3NldF9wb2xhcml0eSwKKwkuZ3VpX2lkbGUgPSAmcjYwMF9ndWlfaWRsZSwKKwkucG1fbWlzYyA9ICZldmVyZ3JlZW5fcG1fbWlzYywKKwkucG1fcHJlcGFyZSA9ICZldmVyZ3JlZW5fcG1fcHJlcGFyZSwKKwkucG1fZmluaXNoID0gJmV2ZXJncmVlbl9wbV9maW5pc2gsCisJLnBtX2luaXRfcHJvZmlsZSA9ICZyczc4MF9wbV9pbml0X3Byb2ZpbGUsCisJLnBtX2dldF9keW5wbV9zdGF0ZSA9ICZyNjAwX3BtX2dldF9keW5wbV9zdGF0ZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmFkZW9uX2FzaWMgYnRjX2FzaWMgPSB7CisJLmluaXQgPSAmZXZlcmdyZWVuX2luaXQsCisJLmZpbmkgPSAmZXZlcmdyZWVuX2ZpbmksCisJLnN1c3BlbmQgPSAmZXZlcmdyZWVuX3N1c3BlbmQsCisJLnJlc3VtZSA9ICZldmVyZ3JlZW5fcmVzdW1lLAorCS5jcF9jb21taXQgPSAmcjYwMF9jcF9jb21taXQsCisJLmdwdV9pc19sb2NrdXAgPSAmZXZlcmdyZWVuX2dwdV9pc19sb2NrdXAsCisJLmFzaWNfcmVzZXQgPSAmZXZlcmdyZWVuX2FzaWNfcmVzZXQsCisJLnZnYV9zZXRfc3RhdGUgPSAmcjYwMF92Z2Ffc2V0X3N0YXRlLAorCS5nYXJ0X3RsYl9mbHVzaCA9ICZldmVyZ3JlZW5fcGNpZV9nYXJ0X3RsYl9mbHVzaCwKKwkuZ2FydF9zZXRfcGFnZSA9ICZyczYwMF9nYXJ0X3NldF9wYWdlLAorCS5yaW5nX3Rlc3QgPSAmcjYwMF9yaW5nX3Rlc3QsCisJLnJpbmdfaWJfZXhlY3V0ZSA9ICZyNjAwX3JpbmdfaWJfZXhlY3V0ZSwKKwkuaXJxX3NldCA9ICZldmVyZ3JlZW5faXJxX3NldCwKKwkuaXJxX3Byb2Nlc3MgPSAmZXZlcmdyZWVuX2lycV9wcm9jZXNzLAorCS5nZXRfdmJsYW5rX2NvdW50ZXIgPSAmZXZlcmdyZWVuX2dldF92YmxhbmtfY291bnRlciwKKwkuZmVuY2VfcmluZ19lbWl0ID0gJnI2MDBfZmVuY2VfcmluZ19lbWl0LAorCS5jc19wYXJzZSA9ICZldmVyZ3JlZW5fY3NfcGFyc2UsCisJLmNvcHlfYmxpdCA9ICZldmVyZ3JlZW5fY29weV9ibGl0LAorCS5jb3B5X2RtYSA9ICZldmVyZ3JlZW5fY29weV9ibGl0LAorCS5jb3B5ID0gJmV2ZXJncmVlbl9jb3B5X2JsaXQsCisJLmdldF9lbmdpbmVfY2xvY2sgPSAmcmFkZW9uX2F0b21fZ2V0X2VuZ2luZV9jbG9jaywKKwkuc2V0X2VuZ2luZV9jbG9jayA9ICZyYWRlb25fYXRvbV9zZXRfZW5naW5lX2Nsb2NrLAorCS5nZXRfbWVtb3J5X2Nsb2NrID0gJnJhZGVvbl9hdG9tX2dldF9tZW1vcnlfY2xvY2ssCisJLnNldF9tZW1vcnlfY2xvY2sgPSAmcmFkZW9uX2F0b21fc2V0X21lbW9yeV9jbG9jaywKIAkuZ2V0X3BjaWVfbGFuZXMgPSBOVUxMLAogCS5zZXRfcGNpZV9sYW5lcyA9IE5VTEwsCiAJLnNldF9jbG9ja19nYXRpbmcgPSBOVUxMLApAQCAtNzQ5LDYgKzg3Nyw5IEBACiAJLnBtX2ZpbmlzaCA9ICZldmVyZ3JlZW5fcG1fZmluaXNoLAogCS5wbV9pbml0X3Byb2ZpbGUgPSAmcjYwMF9wbV9pbml0X3Byb2ZpbGUsCiAJLnBtX2dldF9keW5wbV9zdGF0ZSA9ICZyNjAwX3BtX2dldF9keW5wbV9zdGF0ZSwKKwkucHJlX3BhZ2VfZmxpcCA9ICZldmVyZ3JlZW5fcHJlX3BhZ2VfZmxpcCwKKwkucGFnZV9mbGlwID0gJmV2ZXJncmVlbl9wYWdlX2ZsaXAsCisJLnBvc3RfcGFnZV9mbGlwID0gJmV2ZXJncmVlbl9wb3N0X3BhZ2VfZmxpcCwKIH07CiAKIGludCByYWRlb25fYXNpY19pbml0KHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQpAQCAtODM1LDYgKzk2NiwxNCBAQAogCWNhc2UgQ0hJUF9IRU1MT0NLOgogCQlyZGV2LT5hc2ljID0gJmV2ZXJncmVlbl9hc2ljOwogCQlicmVhazsKKwljYXNlIENISVBfUEFMTToKKwkJcmRldi0+YXNpYyA9ICZzdW1vX2FzaWM7CisJCWJyZWFrOworCWNhc2UgQ0hJUF9CQVJUUzoKKwljYXNlIENISVBfVFVSS1M6CisJY2FzZSBDSElQX0NBSUNPUzoKKwkJcmRldi0+YXNpYyA9ICZidGNfYXNpYzsKKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJLyogRklYTUU6IG5vdCBzdXBwb3J0ZWQgeWV0ICovCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtODQ5LDcgKzk4OCw5IEBACiAJaWYgKHJkZXYtPmZsYWdzICYgUkFERU9OX1NJTkdMRV9DUlRDKQogCQlyZGV2LT5udW1fY3J0YyA9IDE7CiAJZWxzZSB7Ci0JCWlmIChBU0lDX0lTX0RDRTQocmRldikpCisJCWlmIChBU0lDX0lTX0RDRTQxKHJkZXYpKQorCQkJcmRldi0+bnVtX2NydGMgPSAyOworCQllbHNlIGlmIChBU0lDX0lTX0RDRTQocmRldikpCiAJCQlyZGV2LT5udW1fY3J0YyA9IDY7CiAJCWVsc2UKIAkJCXJkZXYtPm51bV9jcnRjID0gMjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2FzaWMuaCBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2FzaWMuaAppbmRleCA3NDA5ODgyLi5lMDFmMDc3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9hc2ljLmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fYXNpYy5oCkBAIC0xMDIsNiArMTAyLDExIEBACiB2b2lkIHIxMDBfcGNpX2dhcnRfZGlzYWJsZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CiBpbnQgcjEwMF9kZWJ1Z2ZzX21jX2luZm9faW5pdChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CiBpbnQgcjEwMF9ndWlfd2FpdF9mb3JfaWRsZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7Cit2b2lkIHIxMDBfZ3B1X2xvY2t1cF91cGRhdGUoc3RydWN0IHIxMDBfZ3B1X2xvY2t1cCAqbG9ja3VwLAorCQkJICAgIHN0cnVjdCByYWRlb25fY3AgKmNwKTsKK2Jvb2wgcjEwMF9ncHVfY3BfaXNfbG9ja3VwKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LAorCQkJICAgc3RydWN0IHIxMDBfZ3B1X2xvY2t1cCAqbG9ja3VwLAorCQkJICAgc3RydWN0IHJhZGVvbl9jcCAqY3ApOwogdm9pZCByMTAwX2liX2Zpbmkoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwogaW50IHIxMDBfaWJfaW5pdChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CiB2b2lkIHIxMDBfaXJxX2Rpc2FibGUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwpAQCAtMTMwLDE1ICsxMzUsMTkgQEAKIGV4dGVybiB2b2lkIHIxMDBfcG1fZmluaXNoKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKIGV4dGVybiB2b2lkIHIxMDBfcG1faW5pdF9wcm9maWxlKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKIGV4dGVybiB2b2lkIHIxMDBfcG1fZ2V0X2R5bnBtX3N0YXRlKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKK2V4dGVybiB2b2lkIHIxMDBfcHJlX3BhZ2VfZmxpcChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwgaW50IGNydGMpOworZXh0ZXJuIHUzMiByMTAwX3BhZ2VfZmxpcChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwgaW50IGNydGMsIHU2NCBjcnRjX2Jhc2UpOworZXh0ZXJuIHZvaWQgcjEwMF9wb3N0X3BhZ2VfZmxpcChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwgaW50IGNydGMpOwogCiAvKgogICogcjIwMCxydjI1MCxyczMwMCxydjI4MAogICovCiBleHRlcm4gaW50IHIyMDBfY29weV9kbWEoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsCi0JCQl1aW50NjRfdCBzcmNfb2Zmc2V0LAotCQkJdWludDY0X3QgZHN0X29mZnNldCwKLQkJCXVuc2lnbmVkIG51bV9wYWdlcywKKwkJCSB1aW50NjRfdCBzcmNfb2Zmc2V0LAorCQkJIHVpbnQ2NF90IGRzdF9vZmZzZXQsCisJCQkgdW5zaWduZWQgbnVtX3BhZ2VzLAogCQkJIHN0cnVjdCByYWRlb25fZmVuY2UgKmZlbmNlKTsKK3ZvaWQgcjIwMF9zZXRfc2FmZV9yZWdpc3RlcnMoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwogCiAvKgogICogcjMwMCxyMzUwLHJ2MzUwLHJ2MzgwCkBAIC0xNTksNiArMTY4LDE1IEBACiBleHRlcm4gdm9pZCBydjM3MF9wY2llX3dyZWcoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIHVpbnQzMl90IHJlZywgdWludDMyX3Qgdik7CiBleHRlcm4gdm9pZCBydjM3MF9zZXRfcGNpZV9sYW5lcyhzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwgaW50IGxhbmVzKTsKIGV4dGVybiBpbnQgcnYzNzBfZ2V0X3BjaWVfbGFuZXMoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOworZXh0ZXJuIHZvaWQgcjMwMF9zZXRfcmVnX3NhZmUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOworZXh0ZXJuIHZvaWQgcjMwMF9tY19wcm9ncmFtKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKK2V4dGVybiB2b2lkIHIzMDBfbWNfaW5pdChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CitleHRlcm4gdm9pZCByMzAwX2Nsb2NrX3N0YXJ0dXAoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOworZXh0ZXJuIGludCByMzAwX21jX3dhaXRfZm9yX2lkbGUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOworZXh0ZXJuIGludCBydjM3MF9wY2llX2dhcnRfaW5pdChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CitleHRlcm4gdm9pZCBydjM3MF9wY2llX2dhcnRfZmluaShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CitleHRlcm4gaW50IHJ2MzcwX3BjaWVfZ2FydF9lbmFibGUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOworZXh0ZXJuIHZvaWQgcnYzNzBfcGNpZV9nYXJ0X2Rpc2FibGUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwogCiAvKgogICogcjQyMCxyNDIzLHJ2NDEwCkBAIC0xNjgsNiArMTg2LDEwIEBACiBleHRlcm4gaW50IHI0MjBfc3VzcGVuZChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CiBleHRlcm4gaW50IHI0MjBfcmVzdW1lKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKIGV4dGVybiB2b2lkIHI0MjBfcG1faW5pdF9wcm9maWxlKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKK2V4dGVybiB1MzIgcjQyMF9tY19ycmVnKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LCB1MzIgcmVnKTsKK2V4dGVybiB2b2lkIHI0MjBfbWNfd3JlZyhzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwgdTMyIHJlZywgdTMyIHYpOworZXh0ZXJuIGludCByNDIwX2RlYnVnZnNfcGlwZXNfaW5mb19pbml0KHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKK2V4dGVybiB2b2lkIHI0MjBfcGlwZXNfaW5pdChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CiAKIC8qCiAgKiByczQwMCxyczQ4MApAQCAtMTgwLDYgKzIwMiwxMiBAQAogaW50IHJzNDAwX2dhcnRfc2V0X3BhZ2Uoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIGludCBpLCB1aW50NjRfdCBhZGRyKTsKIHVpbnQzMl90IHJzNDAwX21jX3JyZWcoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIHVpbnQzMl90IHJlZyk7CiB2b2lkIHJzNDAwX21jX3dyZWcoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIHVpbnQzMl90IHJlZywgdWludDMyX3Qgdik7CitpbnQgcnM0MDBfZ2FydF9pbml0KHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKK2ludCByczQwMF9nYXJ0X2VuYWJsZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7Cit2b2lkIHJzNDAwX2dhcnRfYWRqdXN0X3NpemUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwordm9pZCByczQwMF9nYXJ0X2Rpc2FibGUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwordm9pZCByczQwMF9nYXJ0X2Zpbmkoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOworCiAKIC8qCiAgKiByczYwMC4KQEAgLTE5MSw2ICsyMTksNyBAQAogZXh0ZXJuIGludCByczYwMF9yZXN1bWUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwogaW50IHJzNjAwX2lycV9zZXQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwogaW50IHJzNjAwX2lycV9wcm9jZXNzKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKK3ZvaWQgcnM2MDBfaXJxX2Rpc2FibGUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwogdTMyIHJzNjAwX2dldF92YmxhbmtfY291bnRlcihzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwgaW50IGNydGMpOwogdm9pZCByczYwMF9nYXJ0X3RsYl9mbHVzaChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CiBpbnQgcnM2MDBfZ2FydF9zZXRfcGFnZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwgaW50IGksIHVpbnQ2NF90IGFkZHIpOwpAQCAtMjA1LDYgKzIzNCwxMSBAQAogZXh0ZXJuIHZvaWQgcnM2MDBfcG1fbWlzYyhzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CiBleHRlcm4gdm9pZCByczYwMF9wbV9wcmVwYXJlKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKIGV4dGVybiB2b2lkIHJzNjAwX3BtX2ZpbmlzaChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CitleHRlcm4gdm9pZCByczYwMF9wcmVfcGFnZV9mbGlwKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LCBpbnQgY3J0Yyk7CitleHRlcm4gdTMyIHJzNjAwX3BhZ2VfZmxpcChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwgaW50IGNydGMsIHU2NCBjcnRjX2Jhc2UpOworZXh0ZXJuIHZvaWQgcnM2MDBfcG9zdF9wYWdlX2ZsaXAoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIGludCBjcnRjKTsKK3ZvaWQgcnM2MDBfc2V0X3NhZmVfcmVnaXN0ZXJzKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKKwogCiAvKgogICogcnM2OTAscnM3NDAKQEAgLTIxNiwxMCArMjUwLDIxIEBACiB1aW50MzJfdCByczY5MF9tY19ycmVnKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LCB1aW50MzJfdCByZWcpOwogdm9pZCByczY5MF9tY193cmVnKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LCB1aW50MzJfdCByZWcsIHVpbnQzMl90IHYpOwogdm9pZCByczY5MF9iYW5kd2lkdGhfdXBkYXRlKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKK3ZvaWQgcnM2OTBfbGluZV9idWZmZXJfYWRqdXN0KHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LAorCQkJCQlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZTEsCisJCQkJCXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlMik7CiAKIC8qCiAgKiBydjUxNQogICovCitzdHJ1Y3QgcnY1MTVfbWNfc2F2ZSB7CisJdTMyIGQxdmdhX2NvbnRyb2w7CisJdTMyIGQydmdhX2NvbnRyb2w7CisJdTMyIHZnYV9yZW5kZXJfY29udHJvbDsKKwl1MzIgdmdhX2hkcF9jb250cm9sOworCXUzMiBkMWNydGNfY29udHJvbDsKKwl1MzIgZDJjcnRjX2NvbnRyb2w7Cit9OwogaW50IHJ2NTE1X2luaXQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwogdm9pZCBydjUxNV9maW5pKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKIHVpbnQzMl90IHJ2NTE1X21jX3JyZWcoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIHVpbnQzMl90IHJlZyk7CkBAIC0yMzAsNiArMjc1LDE0IEBACiB2b2lkIHJ2NTE1X2JhbmR3aWR0aF91cGRhdGUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwogaW50IHJ2NTE1X3Jlc3VtZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CiBpbnQgcnY1MTVfc3VzcGVuZChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7Cit2b2lkIHJ2NTE1X2JhbmR3aWR0aF9hdml2b191cGRhdGUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwordm9pZCBydjUxNV92Z2FfcmVuZGVyX2Rpc2FibGUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwordm9pZCBydjUxNV9zZXRfc2FmZV9yZWdpc3RlcnMoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwordm9pZCBydjUxNV9tY19zdG9wKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LCBzdHJ1Y3QgcnY1MTVfbWNfc2F2ZSAqc2F2ZSk7Cit2b2lkIHJ2NTE1X21jX3Jlc3VtZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwgc3RydWN0IHJ2NTE1X21jX3NhdmUgKnNhdmUpOwordm9pZCBydjUxNV9jbG9ja19zdGFydHVwKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKK3ZvaWQgcnY1MTVfZGVidWdmcyhzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CisKIAogLyoKICAqIHI1MjAscnY1MzAscnY1NjAscnY1NzAscjU4MApAQCAtMjc4LDYgKzMzMSw4IEBACiBleHRlcm4gdm9pZCByNjAwX3BtX2luaXRfcHJvZmlsZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CiBleHRlcm4gdm9pZCByczc4MF9wbV9pbml0X3Byb2ZpbGUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwogZXh0ZXJuIHZvaWQgcjYwMF9wbV9nZXRfZHlucG1fc3RhdGUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOworZXh0ZXJuIHZvaWQgcjYwMF9zZXRfcGNpZV9sYW5lcyhzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwgaW50IGxhbmVzKTsKK2V4dGVybiBpbnQgcjYwMF9nZXRfcGNpZV9sYW5lcyhzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CiAKIC8qCiAgKiBydjc3MCxydjczMCxydjcxMCxydjc0MApAQCAtMjg3LDYgKzM0Miw3IEBACiBpbnQgcnY3NzBfc3VzcGVuZChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CiBpbnQgcnY3NzBfcmVzdW1lKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKIGV4dGVybiB2b2lkIHJ2NzcwX3BtX21pc2Moc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOworZXh0ZXJuIHUzMiBydjc3MF9wYWdlX2ZsaXAoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIGludCBjcnRjLCB1NjQgY3J0Y19iYXNlKTsKIAogLyoKICAqIGV2ZXJncmVlbgpAQCAtMzE0LDUgKzM3MCw4IEBACiBleHRlcm4gdm9pZCBldmVyZ3JlZW5fcG1fbWlzYyhzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CiBleHRlcm4gdm9pZCBldmVyZ3JlZW5fcG1fcHJlcGFyZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CiBleHRlcm4gdm9pZCBldmVyZ3JlZW5fcG1fZmluaXNoKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKK2V4dGVybiB2b2lkIGV2ZXJncmVlbl9wcmVfcGFnZV9mbGlwKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LCBpbnQgY3J0Yyk7CitleHRlcm4gdTMyIGV2ZXJncmVlbl9wYWdlX2ZsaXAoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIGludCBjcnRjLCB1NjQgY3J0Y19iYXNlKTsKK2V4dGVybiB2b2lkIGV2ZXJncmVlbl9wb3N0X3BhZ2VfZmxpcChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwgaW50IGNydGMpOwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2F0b21iaW9zLmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9hdG9tYmlvcy5jCmluZGV4IGJjNWEyYzMuLjE1NzMyMDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2F0b21iaW9zLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fYXRvbWJpb3MuYwpAQCAtMzcsNyArMzcsNyBAQAogZXh0ZXJuIHZvaWQgcmFkZW9uX2xpbmtfZW5jb2Rlcl9jb25uZWN0b3Ioc3RydWN0IGRybV9kZXZpY2UgKmRldik7CiBleHRlcm4gdm9pZAogcmFkZW9uX2FkZF9hdG9tX2VuY29kZXIoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdWludDMyX3QgZW5jb2Rlcl9lbnVtLAotCQkJdWludDMyX3Qgc3VwcG9ydGVkX2RldmljZSk7CisJCQl1aW50MzJfdCBzdXBwb3J0ZWRfZGV2aWNlLCB1MTYgY2Fwcyk7CiAKIC8qIGZyb20gcmFkZW9uX2Nvbm5lY3Rvci5jICovCiBleHRlcm4gdm9pZApAQCAtMzEzLDcgKzMxMyw2IEBACiAJCQkJICAgICB1aW50MTZfdCAqbGluZV9tdXgsCiAJCQkJICAgICBzdHJ1Y3QgcmFkZW9uX2hwZCAqaHBkKQogewotCXN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAogCS8qIEFzdXMgTTJBLVZNIEhETUkgYm9hcmQgbGlzdHMgdGhlIERWSSBwb3J0IGFzIEhETUkgKi8KIAlpZiAoKGRldi0+cGRldi0+ZGV2aWNlID09IDB4NzkxZSkgJiYKQEAgLTM4OCw2ICszODcsMTcgQEAKIAkJCSpsaW5lX211eCA9IDB4OTA7CiAJfQogCisJLyogbWFjIHJ2NjMwICovCisJaWYgKChkZXYtPnBkZXYtPmRldmljZSA9PSAweDk1ODgpICYmCisJICAgIChkZXYtPnBkZXYtPnN1YnN5c3RlbV92ZW5kb3IgPT0gMHgxMDZiKSAmJgorCSAgICAoZGV2LT5wZGV2LT5zdWJzeXN0ZW1fZGV2aWNlID09IDB4MDBhNikpIHsKKwkJaWYgKChzdXBwb3J0ZWRfZGV2aWNlID09IEFUT01fREVWSUNFX1RWMV9TVVBQT1JUKSAmJgorCQkgICAgKCpjb25uZWN0b3JfdHlwZSA9PSBEUk1fTU9ERV9DT05ORUNUT1JfRFZJSSkpIHsKKwkJCSpjb25uZWN0b3JfdHlwZSA9IERSTV9NT0RFX0NPTk5FQ1RPUl85UGluRElOOworCQkJKmxpbmVfbXV4ID0gQ09OTkVDVE9SXzdQSU5fRElOX0VOVU1fSUQxOworCQl9CisJfQorCiAJLyogQVNVUyBIRCAzNjAwIFhUIGJvYXJkIGxpc3RzIHRoZSBEVkkgcG9ydCBhcyBIRE1JICovCiAJaWYgKChkZXYtPnBkZXYtPmRldmljZSA9PSAweDk1OTgpICYmCiAJICAgIChkZXYtPnBkZXYtPnN1YnN5c3RlbV92ZW5kb3IgPT0gMHgxMDQzKSAmJgpAQCAtNDI1LDIxICs0MzUsMjMgQEAKIAkJfQogCX0KIAotCS8qIEFjZXIgbGFwdG9wIHJlcG9ydHMgRFZJLUQgYXMgRFZJLUkgYW5kIGhwZCBwaW5zIHJldmVyc2VkICovCisJLyogQWNlciBsYXB0b3AgKEFjZXIgVHJhdmVsTWF0ZSA1NzMwRykgaGFzIGFuIEhETUkgcG9ydAorCSAqIG9uIHRoZSBsYXB0b3AgYW5kIGEgRFZJIHBvcnQgb24gdGhlIGRvY2tpbmcgc3RhdGlvbiBhbmQKKwkgKiBib3RoIHNoYXJlIHRoZSBzYW1lIGVuY29kZXIsIGhwZCBwaW4sIGFuZCBkZGMgbGluZS4KKwkgKiBTbyB3aGlsZSB0aGUgYmlvcyB0YWJsZSBpcyB0ZWNobmljYWxseSBjb3JyZWN0LAorCSAqIHdlIGRyb3AgdGhlIERWSSBwb3J0IGhlcmUgc2luY2UgeHJhbmRyIGhhcyBubyBjb25jZXB0IG9mCisJICogZW5jb2RlcnMgYW5kIHdpbGwgdHJ5IGFuZCBkcml2ZSBib3RoIGNvbm5lY3RvcnMKKwkgKiB3aXRoIGRpZmZlcmVudCBjcnRjcyB3aGljaCBpc24ndCBwb3NzaWJsZSBvbiB0aGUgaGFyZHdhcmUKKwkgKiBzaWRlIGFuZCBsZWF2ZXMgbm8gY3J0Y3MgZm9yIExWRFMgb3IgVkdBLgorCSAqLwogCWlmICgoZGV2LT5wZGV2LT5kZXZpY2UgPT0gMHg5NWM0KSAmJgogCSAgICAoZGV2LT5wZGV2LT5zdWJzeXN0ZW1fdmVuZG9yID09IDB4MTAyNSkgJiYKIAkgICAgKGRldi0+cGRldi0+c3Vic3lzdGVtX2RldmljZSA9PSAweDAxM2MpKSB7Ci0JCXN0cnVjdCByYWRlb25fZ3Bpb19yZWMgZ3BpbzsKLQogCQlpZiAoKCpjb25uZWN0b3JfdHlwZSA9PSBEUk1fTU9ERV9DT05ORUNUT1JfRFZJSSkgJiYKIAkJICAgIChzdXBwb3J0ZWRfZGV2aWNlID09IEFUT01fREVWSUNFX0RGUDFfU1VQUE9SVCkpIHsKLQkJCWdwaW8gPSByYWRlb25fbG9va3VwX2dwaW8ocmRldiwgNik7Ci0JCQkqaHBkID0gcmFkZW9uX2F0b21fZ2V0X2hwZF9pbmZvX2Zyb21fZ3BpbyhyZGV2LCAmZ3Bpbyk7CisJCQkvKiBhY3R1YWxseSBpdCdzIGEgRFZJLUQgcG9ydCBub3QgRFZJLUkgKi8KIAkJCSpjb25uZWN0b3JfdHlwZSA9IERSTV9NT0RFX0NPTk5FQ1RPUl9EVklEOwotCQl9IGVsc2UgaWYgKCgqY29ubmVjdG9yX3R5cGUgPT0gRFJNX01PREVfQ09OTkVDVE9SX0hETUlBKSAmJgotCQkJICAgKHN1cHBvcnRlZF9kZXZpY2UgPT0gQVRPTV9ERVZJQ0VfREZQMV9TVVBQT1JUKSkgewotCQkJZ3BpbyA9IHJhZGVvbl9sb29rdXBfZ3BpbyhyZGV2LCA3KTsKLQkJCSpocGQgPSByYWRlb25fYXRvbV9nZXRfaHBkX2luZm9fZnJvbV9ncGlvKHJkZXYsICZncGlvKTsKKwkJCXJldHVybiBmYWxzZTsKIAkJfQogCX0KIApAQCAtNTI1LDYgKzUzNyw3IEBACiAJdTE2IHNpemUsIGRhdGFfb2Zmc2V0OwogCXU4IGZyZXYsIGNyZXY7CiAJQVRPTV9DT05ORUNUT1JfT0JKRUNUX1RBQkxFICpjb25fb2JqOworCUFUT01fRU5DT0RFUl9PQkpFQ1RfVEFCTEUgKmVuY19vYmo7CiAJQVRPTV9PQkpFQ1RfVEFCTEUgKnJvdXRlcl9vYmo7CiAJQVRPTV9ESVNQTEFZX09CSkVDVF9QQVRIX1RBQkxFICpwYXRoX29iajsKIAlBVE9NX09CSkVDVF9IRUFERVIgKm9ial9oZWFkZXI7CkBAIC01NDksNiArNTYyLDkgQEAKIAljb25fb2JqID0gKEFUT01fQ09OTkVDVE9SX09CSkVDVF9UQUJMRSAqKQogCSAgICAoY3R4LT5iaW9zICsgZGF0YV9vZmZzZXQgKwogCSAgICAgbGUxNl90b19jcHUob2JqX2hlYWRlci0+dXNDb25uZWN0b3JPYmplY3RUYWJsZU9mZnNldCkpOworCWVuY19vYmogPSAoQVRPTV9FTkNPREVSX09CSkVDVF9UQUJMRSAqKQorCSAgICAoY3R4LT5iaW9zICsgZGF0YV9vZmZzZXQgKworCSAgICAgbGUxNl90b19jcHUob2JqX2hlYWRlci0+dXNFbmNvZGVyT2JqZWN0VGFibGVPZmZzZXQpKTsKIAlyb3V0ZXJfb2JqID0gKEFUT01fT0JKRUNUX1RBQkxFICopCiAJCShjdHgtPmJpb3MgKyBkYXRhX29mZnNldCArCiAJCSBsZTE2X3RvX2NwdShvYmpfaGVhZGVyLT51c1JvdXRlck9iamVjdFRhYmxlT2Zmc2V0KSk7CkBAIC02NTQsMTQgKzY3MCwzNSBAQAogCQkJCSAgICAgT0JKRUNUX1RZUEVfTUFTSykgPj4gT0JKRUNUX1RZUEVfU0hJRlQ7CiAKIAkJCQlpZiAoZ3JwaF9vYmpfdHlwZSA9PSBHUkFQSF9PQkpFQ1RfVFlQRV9FTkNPREVSKSB7Ci0JCQkJCXUxNiBlbmNvZGVyX29iaiA9IGxlMTZfdG9fY3B1KHBhdGgtPnVzR3JhcGhpY09iaklkc1tqXSk7CisJCQkJCWZvciAoayA9IDA7IGsgPCBlbmNfb2JqLT51Y051bWJlck9mT2JqZWN0czsgaysrKSB7CisJCQkJCQl1MTYgZW5jb2Rlcl9vYmogPSBsZTE2X3RvX2NwdShlbmNfb2JqLT5hc09iamVjdHNba10udXNPYmplY3RJRCk7CisJCQkJCQlpZiAobGUxNl90b19jcHUocGF0aC0+dXNHcmFwaGljT2JqSWRzW2pdKSA9PSBlbmNvZGVyX29iaikgeworCQkJCQkJCUFUT01fQ09NTU9OX1JFQ09SRF9IRUFERVIgKnJlY29yZCA9IChBVE9NX0NPTU1PTl9SRUNPUkRfSEVBREVSICopCisJCQkJCQkJCShjdHgtPmJpb3MgKyBkYXRhX29mZnNldCArCisJCQkJCQkJCSBsZTE2X3RvX2NwdShlbmNfb2JqLT5hc09iamVjdHNba10udXNSZWNvcmRPZmZzZXQpKTsKKwkJCQkJCQlBVE9NX0VOQ09ERVJfQ0FQX1JFQ09SRCAqY2FwX3JlY29yZDsKKwkJCQkJCQl1MTYgY2FwcyA9IDA7CiAKLQkJCQkJcmFkZW9uX2FkZF9hdG9tX2VuY29kZXIoZGV2LAotCQkJCQkJCQllbmNvZGVyX29iaiwKLQkJCQkJCQkJbGUxNl90b19jcHUKLQkJCQkJCQkJKHBhdGgtPgotCQkJCQkJCQkgdXNEZXZpY2VUYWcpKTsKLQorCQkJCQkJCXdoaWxlIChyZWNvcmQtPnVjUmVjb3JkVHlwZSA+IDAgJiYKKwkJCQkJCQkgICAgICAgcmVjb3JkLT51Y1JlY29yZFR5cGUgPD0gQVRPTV9NQVhfT0JKRUNUX1JFQ09SRF9OVU1CRVIpIHsKKwkJCQkJCQkJc3dpdGNoIChyZWNvcmQtPnVjUmVjb3JkVHlwZSkgeworCQkJCQkJCQljYXNlIEFUT01fRU5DT0RFUl9DQVBfUkVDT1JEX1RZUEU6CisJCQkJCQkJCQljYXBfcmVjb3JkID0oQVRPTV9FTkNPREVSX0NBUF9SRUNPUkQgKikKKwkJCQkJCQkJCQlyZWNvcmQ7CisJCQkJCQkJCQljYXBzID0gbGUxNl90b19jcHUoY2FwX3JlY29yZC0+dXNFbmNvZGVyQ2FwKTsKKwkJCQkJCQkJCWJyZWFrOworCQkJCQkJCQl9CisJCQkJCQkJCXJlY29yZCA9IChBVE9NX0NPTU1PTl9SRUNPUkRfSEVBREVSICopCisJCQkJCQkJCQkoKGNoYXIgKilyZWNvcmQgKyByZWNvcmQtPnVjUmVjb3JkU2l6ZSk7CisJCQkJCQkJfQorCQkJCQkJCXJhZGVvbl9hZGRfYXRvbV9lbmNvZGVyKGRldiwKKwkJCQkJCQkJCQllbmNvZGVyX29iaiwKKwkJCQkJCQkJCQlsZTE2X3RvX2NwdQorCQkJCQkJCQkJCShwYXRoLT4KKwkJCQkJCQkJCQkgdXNEZXZpY2VUYWcpLAorCQkJCQkJCQkJCWNhcHMpOworCQkJCQkJfQorCQkJCQl9CiAJCQkJfSBlbHNlIGlmIChncnBoX29ial90eXBlID09IEdSQVBIX09CSkVDVF9UWVBFX1JPVVRFUikgewogCQkJCQlmb3IgKGsgPSAwOyBrIDwgcm91dGVyX29iai0+dWNOdW1iZXJPZk9iamVjdHM7IGsrKykgewogCQkJCQkJdTE2IHJvdXRlcl9vYmpfaWQgPSBsZTE2X3RvX2NwdShyb3V0ZXJfb2JqLT5hc09iamVjdHNba10udXNPYmplY3RJRCk7CkBAIC05OTUsNyArMTAzMiw4IEBACiAJCQkJCQlyYWRlb25fZ2V0X2VuY29kZXJfZW51bShkZXYsCiAJCQkJCQkJCSAgICAgICgxIDw8IGkpLAogCQkJCQkJCQkgICAgICBkYWMpLAotCQkJCQkJKDEgPDwgaSkpOworCQkJCQkJKDEgPDwgaSksCisJCQkJCQkwKTsKIAkJZWxzZQogCQkJcmFkZW9uX2FkZF9sZWdhY3lfZW5jb2RlcihkZXYsCiAJCQkJCQkgIHJhZGVvbl9nZXRfZW5jb2Rlcl9lbnVtKGRldiwKQEAgLTEwNzQsNiArMTExMiw3IEBACiAJQVRPTV9GSVJNV0FSRV9JTkZPX1YxXzMgaW5mb18xMzsKIAlBVE9NX0ZJUk1XQVJFX0lORk9fVjFfNCBpbmZvXzE0OwogCUFUT01fRklSTVdBUkVfSU5GT19WMl8xIGluZm9fMjE7CisJQVRPTV9GSVJNV0FSRV9JTkZPX1YyXzIgaW5mb18yMjsKIH07CiAKIGJvb2wgcmFkZW9uX2F0b21fZ2V0X2Nsb2NrX2luZm8oc3RydWN0IGRybV9kZXZpY2UgKmRldikKQEAgLTExNDgsOCArMTE4NywxMiBAQAogCQkqcDJwbGwgPSAqcDFwbGw7CiAKIAkJLyogc3lzdGVtIGNsb2NrICovCi0JCXNwbGwtPnJlZmVyZW5jZV9mcmVxID0KLQkJICAgIGxlMTZfdG9fY3B1KGZpcm13YXJlX2luZm8tPmluZm8udXNSZWZlcmVuY2VDbG9jayk7CisJCWlmIChBU0lDX0lTX0RDRTQocmRldikpCisJCQlzcGxsLT5yZWZlcmVuY2VfZnJlcSA9CisJCQkJbGUxNl90b19jcHUoZmlybXdhcmVfaW5mby0+aW5mb18yMS51c0NvcmVSZWZlcmVuY2VDbG9jayk7CisJCWVsc2UKKwkJCXNwbGwtPnJlZmVyZW5jZV9mcmVxID0KKwkJCQlsZTE2X3RvX2NwdShmaXJtd2FyZV9pbmZvLT5pbmZvLnVzUmVmZXJlbmNlQ2xvY2spOwogCQlzcGxsLT5yZWZlcmVuY2VfZGl2ID0gMDsKIAogCQlzcGxsLT5wbGxfb3V0X21pbiA9CkBAIC0xMTcxLDggKzEyMTQsMTIgQEAKIAkJICAgIGxlMTZfdG9fY3B1KGZpcm13YXJlX2luZm8tPmluZm8udXNNYXhFbmdpbmVDbG9ja1BMTF9JbnB1dCk7CiAKIAkJLyogbWVtb3J5IGNsb2NrICovCi0JCW1wbGwtPnJlZmVyZW5jZV9mcmVxID0KLQkJICAgIGxlMTZfdG9fY3B1KGZpcm13YXJlX2luZm8tPmluZm8udXNSZWZlcmVuY2VDbG9jayk7CisJCWlmIChBU0lDX0lTX0RDRTQocmRldikpCisJCQltcGxsLT5yZWZlcmVuY2VfZnJlcSA9CisJCQkJbGUxNl90b19jcHUoZmlybXdhcmVfaW5mby0+aW5mb18yMS51c01lbW9yeVJlZmVyZW5jZUNsb2NrKTsKKwkJZWxzZQorCQkJbXBsbC0+cmVmZXJlbmNlX2ZyZXEgPQorCQkJCWxlMTZfdG9fY3B1KGZpcm13YXJlX2luZm8tPmluZm8udXNSZWZlcmVuY2VDbG9jayk7CiAJCW1wbGwtPnJlZmVyZW5jZV9kaXYgPSAwOwogCiAJCW1wbGwtPnBsbF9vdXRfbWluID0KQEAgLTEyMDEsOCArMTI0OCwxMiBAQAogCQlpZiAoQVNJQ19JU19EQ0U0KHJkZXYpKSB7CiAJCQlyZGV2LT5jbG9jay5kZWZhdWx0X2Rpc3BjbGsgPQogCQkJCWxlMzJfdG9fY3B1KGZpcm13YXJlX2luZm8tPmluZm9fMjEudWxEZWZhdWx0RGlzcEVuZ2luZUNsa0ZyZXEpOwotCQkJaWYgKHJkZXYtPmNsb2NrLmRlZmF1bHRfZGlzcGNsayA9PSAwKQotCQkJCXJkZXYtPmNsb2NrLmRlZmF1bHRfZGlzcGNsayA9IDYwMDAwOyAvKiA2MDAgTWh6ICovCisJCQlpZiAocmRldi0+Y2xvY2suZGVmYXVsdF9kaXNwY2xrID09IDApIHsKKwkJCQlpZiAoQVNJQ19JU19EQ0U1KHJkZXYpKQorCQkJCQlyZGV2LT5jbG9jay5kZWZhdWx0X2Rpc3BjbGsgPSA1NDAwMDsgLyogNTQwIE1oeiAqLworCQkJCWVsc2UKKwkJCQkJcmRldi0+Y2xvY2suZGVmYXVsdF9kaXNwY2xrID0gNjAwMDA7IC8qIDYwMCBNaHogKi8KKwkJCX0KIAkJCXJkZXYtPmNsb2NrLmRwX2V4dGNsayA9CiAJCQkJbGUxNl90b19jcHUoZmlybXdhcmVfaW5mby0+aW5mb18yMS51c1VuaXBoeURQTW9kZUV4dENsa0ZyZXEpOwogCQl9CkBAIC0xMzM3LDYgKzEzODgsNDMgQEAKIAlyZXR1cm4gZmFsc2U7CiB9CiAKK3N0YXRpYyB2b2lkIHJhZGVvbl9hdG9tYmlvc19nZXRfaWdwX3NzX292ZXJyaWRlcyhzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwKKwkJCQkJCSBzdHJ1Y3QgcmFkZW9uX2F0b21fc3MgKnNzLAorCQkJCQkJIGludCBpZCkKK3sKKwlzdHJ1Y3QgcmFkZW9uX21vZGVfaW5mbyAqbW9kZV9pbmZvID0gJnJkZXYtPm1vZGVfaW5mbzsKKwlpbnQgaW5kZXggPSBHZXRJbmRleEludG9NYXN0ZXJUYWJsZShEQVRBLCBJbnRlZ3JhdGVkU3lzdGVtSW5mbyk7CisJdTE2IGRhdGFfb2Zmc2V0LCBzaXplOworCXN0cnVjdCBfQVRPTV9JTlRFR1JBVEVEX1NZU1RFTV9JTkZPX1Y2ICppZ3BfaW5mbzsKKwl1OCBmcmV2LCBjcmV2OworCXUxNiBwZXJjZW50YWdlID0gMCwgcmF0ZSA9IDA7CisKKwkvKiBnZXQgYW55IGlncCBzcGVjaWZpYyBvdmVycmlkZXMgKi8KKwlpZiAoYXRvbV9wYXJzZV9kYXRhX2hlYWRlcihtb2RlX2luZm8tPmF0b21fY29udGV4dCwgaW5kZXgsICZzaXplLAorCQkJCSAgICZmcmV2LCAmY3JldiwgJmRhdGFfb2Zmc2V0KSkgeworCQlpZ3BfaW5mbyA9IChzdHJ1Y3QgX0FUT01fSU5URUdSQVRFRF9TWVNURU1fSU5GT19WNiAqKQorCQkJKG1vZGVfaW5mby0+YXRvbV9jb250ZXh0LT5iaW9zICsgZGF0YV9vZmZzZXQpOworCQlzd2l0Y2ggKGlkKSB7CisJCWNhc2UgQVNJQ19JTlRFUk5BTF9TU19PTl9UTURTOgorCQkJcGVyY2VudGFnZSA9IGxlMTZfdG9fY3B1KGlncF9pbmZvLT51c0RWSVNTUGVyY2VudGFnZSk7CisJCQlyYXRlID0gbGUxNl90b19jcHUoaWdwX2luZm8tPnVzRFZJU1NwcmVhZFJhdGVJbjEwSHopOworCQkJYnJlYWs7CisJCWNhc2UgQVNJQ19JTlRFUk5BTF9TU19PTl9IRE1JOgorCQkJcGVyY2VudGFnZSA9IGxlMTZfdG9fY3B1KGlncF9pbmZvLT51c0hETUlTU1BlcmNlbnRhZ2UpOworCQkJcmF0ZSA9IGxlMTZfdG9fY3B1KGlncF9pbmZvLT51c0hETUlTU3ByZWFkUmF0ZUluMTBIeik7CisJCQlicmVhazsKKwkJY2FzZSBBU0lDX0lOVEVSTkFMX1NTX09OX0xWRFM6CisJCQlwZXJjZW50YWdlID0gbGUxNl90b19jcHUoaWdwX2luZm8tPnVzTHZkc1NTUGVyY2VudGFnZSk7CisJCQlyYXRlID0gbGUxNl90b19jcHUoaWdwX2luZm8tPnVzTHZkc1NTcHJlYWRSYXRlSW4xMEh6KTsKKwkJCWJyZWFrOworCQl9CisJCWlmIChwZXJjZW50YWdlKQorCQkJc3MtPnBlcmNlbnRhZ2UgPSBwZXJjZW50YWdlOworCQlpZiAocmF0ZSkKKwkJCXNzLT5yYXRlID0gcmF0ZTsKKwl9Cit9CisKIHVuaW9uIGFzaWNfc3NfaW5mbyB7CiAJc3RydWN0IF9BVE9NX0FTSUNfSU5URVJOQUxfU1NfSU5GTyBpbmZvOwogCXN0cnVjdCBfQVRPTV9BU0lDX0lOVEVSTkFMX1NTX0lORk9fVjIgaW5mb18yOwpAQCAtMTQwMSw2ICsxNDg5LDggQEAKIAkJCQkJCWxlMTZfdG9fY3B1KHNzX2luZm8tPmluZm9fMy5hc1NwcmVhZFNwZWN0cnVtW2ldLnVzU3ByZWFkU3BlY3RydW1QZXJjZW50YWdlKTsKIAkJCQkJc3MtPnR5cGUgPSBzc19pbmZvLT5pbmZvXzMuYXNTcHJlYWRTcGVjdHJ1bVtpXS51Y1NwcmVhZFNwZWN0cnVtTW9kZTsKIAkJCQkJc3MtPnJhdGUgPSBsZTE2X3RvX2NwdShzc19pbmZvLT5pbmZvXzMuYXNTcHJlYWRTcGVjdHJ1bVtpXS51c1NwcmVhZFJhdGVJbjEwSHopOworCQkJCQlpZiAocmRldi0+ZmxhZ3MgJiBSQURFT05fSVNfSUdQKQorCQkJCQkJcmFkZW9uX2F0b21iaW9zX2dldF9pZ3Bfc3Nfb3ZlcnJpZGVzKHJkZXYsIHNzLCBpZCk7CiAJCQkJCXJldHVybiB0cnVlOwogCQkJCX0KIAkJCX0KQEAgLTE0NzcsNiArMTU2Nyw5IEBACiAJCWlmIChtaXNjICYgQVRPTV9ET1VCTEVfQ0xPQ0tfTU9ERSkKIAkJCWx2ZHMtPm5hdGl2ZV9tb2RlLmZsYWdzIHw9IERSTV9NT0RFX0ZMQUdfREJMU0NBTjsKIAorCQlsdmRzLT5uYXRpdmVfbW9kZS53aWR0aF9tbSA9IGx2ZHNfaW5mby0+aW5mby5zTENEVGltaW5nLnVzSW1hZ2VIU2l6ZTsKKwkJbHZkcy0+bmF0aXZlX21vZGUuaGVpZ2h0X21tID0gbHZkc19pbmZvLT5pbmZvLnNMQ0RUaW1pbmcudXNJbWFnZVZTaXplOworCiAJCS8qIHNldCBjcnRjIHZhbHVlcyAqLwogCQlkcm1fbW9kZV9zZXRfY3J0Y2luZm8oJmx2ZHMtPm5hdGl2ZV9tb2RlLCBDUlRDX0lOVEVSTEFDRV9IQUxWRV9WKTsKIApAQCAtMTQ4OSw2ICsxNTgyLDU5IEBACiAJCWVsc2UKIAkJCWx2ZHMtPmxpbmtiID0gZmFsc2U7CiAKKwkJLyogcGFyc2UgdGhlIGxjZCByZWNvcmQgdGFibGUgKi8KKwkJaWYgKGx2ZHNfaW5mby0+aW5mby51c01vZGVQYXRjaFRhYmxlT2Zmc2V0KSB7CisJCQlBVE9NX0ZBS0VfRURJRF9QQVRDSF9SRUNPUkQgKmZha2VfZWRpZF9yZWNvcmQ7CisJCQlBVE9NX1BBTkVMX1JFU09MVVRJT05fUEFUQ0hfUkVDT1JEICpwYW5lbF9yZXNfcmVjb3JkOworCQkJYm9vbCBiYWRfcmVjb3JkID0gZmFsc2U7CisJCQl1OCAqcmVjb3JkID0gKHU4ICopKG1vZGVfaW5mby0+YXRvbV9jb250ZXh0LT5iaW9zICsKKwkJCQkJICAgIGRhdGFfb2Zmc2V0ICsKKwkJCQkJICAgIGx2ZHNfaW5mby0+aW5mby51c01vZGVQYXRjaFRhYmxlT2Zmc2V0KTsKKwkJCXdoaWxlICgqcmVjb3JkICE9IEFUT01fUkVDT1JEX0VORF9UWVBFKSB7CisJCQkJc3dpdGNoICgqcmVjb3JkKSB7CisJCQkJY2FzZSBMQ0RfTU9ERV9QQVRDSF9SRUNPUkRfTU9ERV9UWVBFOgorCQkJCQlyZWNvcmQgKz0gc2l6ZW9mKEFUT01fUEFUQ0hfUkVDT1JEX01PREUpOworCQkJCQlicmVhazsKKwkJCQljYXNlIExDRF9SVFNfUkVDT1JEX1RZUEU6CisJCQkJCXJlY29yZCArPSBzaXplb2YoQVRPTV9MQ0RfUlRTX1JFQ09SRCk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgTENEX0NBUF9SRUNPUkRfVFlQRToKKwkJCQkJcmVjb3JkICs9IHNpemVvZihBVE9NX0xDRF9NT0RFX0NPTlRST0xfQ0FQKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBMQ0RfRkFLRV9FRElEX1BBVENIX1JFQ09SRF9UWVBFOgorCQkJCQlmYWtlX2VkaWRfcmVjb3JkID0gKEFUT01fRkFLRV9FRElEX1BBVENIX1JFQ09SRCAqKXJlY29yZDsKKwkJCQkJaWYgKGZha2VfZWRpZF9yZWNvcmQtPnVjRmFrZUVESURMZW5ndGgpIHsKKwkJCQkJCXN0cnVjdCBlZGlkICplZGlkOworCQkJCQkJaW50IGVkaWRfc2l6ZSA9CisJCQkJCQkJbWF4KChpbnQpRURJRF9MRU5HVEgsIChpbnQpZmFrZV9lZGlkX3JlY29yZC0+dWNGYWtlRURJRExlbmd0aCk7CisJCQkJCQllZGlkID0ga21hbGxvYyhlZGlkX3NpemUsIEdGUF9LRVJORUwpOworCQkJCQkJaWYgKGVkaWQpIHsKKwkJCQkJCQltZW1jcHkoKHU4ICopZWRpZCwgKHU4ICopJmZha2VfZWRpZF9yZWNvcmQtPnVjRmFrZUVESURTdHJpbmdbMF0sCisJCQkJCQkJICAgICAgIGZha2VfZWRpZF9yZWNvcmQtPnVjRmFrZUVESURMZW5ndGgpOworCisJCQkJCQkJaWYgKGRybV9lZGlkX2lzX3ZhbGlkKGVkaWQpKQorCQkJCQkJCQlyZGV2LT5tb2RlX2luZm8uYmlvc19oYXJkY29kZWRfZWRpZCA9IGVkaWQ7CisJCQkJCQkJZWxzZQorCQkJCQkJCQlrZnJlZShlZGlkKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQlyZWNvcmQgKz0gc2l6ZW9mKEFUT01fRkFLRV9FRElEX1BBVENIX1JFQ09SRCk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgTENEX1BBTkVMX1JFU09MVVRJT05fUkVDT1JEX1RZUEU6CisJCQkJCXBhbmVsX3Jlc19yZWNvcmQgPSAoQVRPTV9QQU5FTF9SRVNPTFVUSU9OX1BBVENIX1JFQ09SRCAqKXJlY29yZDsKKwkJCQkJbHZkcy0+bmF0aXZlX21vZGUud2lkdGhfbW0gPSBwYW5lbF9yZXNfcmVjb3JkLT51c0hTaXplOworCQkJCQlsdmRzLT5uYXRpdmVfbW9kZS5oZWlnaHRfbW0gPSBwYW5lbF9yZXNfcmVjb3JkLT51c1ZTaXplOworCQkJCQlyZWNvcmQgKz0gc2l6ZW9mKEFUT01fUEFORUxfUkVTT0xVVElPTl9QQVRDSF9SRUNPUkQpOworCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0OgorCQkJCQlEUk1fRVJST1IoIkJhZCBMQ0QgcmVjb3JkICVkXG4iLCAqcmVjb3JkKTsKKwkJCQkJYmFkX3JlY29yZCA9IHRydWU7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlpZiAoYmFkX3JlY29yZCkKKwkJCQkJYnJlYWs7CisJCQl9CisJCX0KIAl9CiAJcmV0dXJuIGx2ZHM7CiB9CkBAIC0xNzQwLDQ5NSArMTg4Niw2MTMgQEAKIAkiUlY2eHgiLAogCSJSVjc3MCIsCiAJImFkdDc0NzMiLAorCSJOT05FIiwKIAkiRXh0ZXJuYWwgR1BJTyIsCiAJIkV2ZXJncmVlbiIsCi0JImFkdDc0NzMgd2l0aCBpbnRlcm5hbCIsCi0KKwkiZW1jMjEwMyIsCisJIlN1bW8iLAorCSJOb3J0aGVybiBJc2xhbmRzIiwKIH07CiAKIHVuaW9uIHBvd2VyX2luZm8gewogCXN0cnVjdCBfQVRPTV9QT1dFUlBMQVlfSU5GTyBpbmZvOwogCXN0cnVjdCBfQVRPTV9QT1dFUlBMQVlfSU5GT19WMiBpbmZvXzI7CiAJc3RydWN0IF9BVE9NX1BPV0VSUExBWV9JTkZPX1YzIGluZm9fMzsKLQlzdHJ1Y3QgX0FUT01fUFBMSUJfUE9XRVJQTEFZVEFCTEUgaW5mb180OworCXN0cnVjdCBfQVRPTV9QUExJQl9QT1dFUlBMQVlUQUJMRSBwcGxpYjsKKwlzdHJ1Y3QgX0FUT01fUFBMSUJfUE9XRVJQTEFZVEFCTEUyIHBwbGliMjsKKwlzdHJ1Y3QgX0FUT01fUFBMSUJfUE9XRVJQTEFZVEFCTEUzIHBwbGliMzsKIH07CiAKK3VuaW9uIHBwbGliX2Nsb2NrX2luZm8geworCXN0cnVjdCBfQVRPTV9QUExJQl9SNjAwX0NMT0NLX0lORk8gcjYwMDsKKwlzdHJ1Y3QgX0FUT01fUFBMSUJfUlM3ODBfQ0xPQ0tfSU5GTyByczc4MDsKKwlzdHJ1Y3QgX0FUT01fUFBMSUJfRVZFUkdSRUVOX0NMT0NLX0lORk8gZXZlcmdyZWVuOworCXN0cnVjdCBfQVRPTV9QUExJQl9TVU1PX0NMT0NLX0lORk8gc3VtbzsKK307CisKK3VuaW9uIHBwbGliX3Bvd2VyX3N0YXRlIHsKKwlzdHJ1Y3QgX0FUT01fUFBMSUJfU1RBVEUgdjE7CisJc3RydWN0IF9BVE9NX1BQTElCX1NUQVRFX1YyIHYyOworfTsKKworc3RhdGljIHZvaWQgcmFkZW9uX2F0b21iaW9zX3BhcnNlX21pc2NfZmxhZ3NfMV8zKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LAorCQkJCQkJIGludCBzdGF0ZV9pbmRleCwKKwkJCQkJCSB1MzIgbWlzYywgdTMyIG1pc2MyKQoreworCXJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS5taXNjID0gbWlzYzsKKwlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0ubWlzYzIgPSBtaXNjMjsKKwkvKiBvcmRlciBtYXR0ZXJzISAqLworCWlmIChtaXNjICYgQVRPTV9QTV9NSVNDSU5GT19QT1dFUl9TQVZJTkdfTU9ERSkKKwkJcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLnR5cGUgPQorCQkJUE9XRVJfU1RBVEVfVFlQRV9QT1dFUlNBVkU7CisJaWYgKG1pc2MgJiBBVE9NX1BNX01JU0NJTkZPX0RFRkFVTFRfRENfU1RBVEVfRU5UUllfVFJVRSkKKwkJcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLnR5cGUgPQorCQkJUE9XRVJfU1RBVEVfVFlQRV9CQVRURVJZOworCWlmIChtaXNjICYgQVRPTV9QTV9NSVNDSU5GT19ERUZBVUxUX0xPV19EQ19TVEFURV9FTlRSWV9UUlVFKQorCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0udHlwZSA9CisJCQlQT1dFUl9TVEFURV9UWVBFX0JBVFRFUlk7CisJaWYgKG1pc2MgJiBBVE9NX1BNX01JU0NJTkZPX0xPQURfQkFMQU5DRV9FTikKKwkJcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLnR5cGUgPQorCQkJUE9XRVJfU1RBVEVfVFlQRV9CQUxBTkNFRDsKKwlpZiAobWlzYyAmIEFUT01fUE1fTUlTQ0lORk9fM0RfQUNDRUxFUkFUSU9OX0VOKSB7CisJCXJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS50eXBlID0KKwkJCVBPV0VSX1NUQVRFX1RZUEVfUEVSRk9STUFOQ0U7CisJCXJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS5mbGFncyAmPQorCQkJflJBREVPTl9QTV9TVEFURV9TSU5HTEVfRElTUExBWV9PTkxZOworCX0KKwlpZiAobWlzYzIgJiBBVE9NX1BNX01JU0NJTkZPMl9TWVNURU1fQUNfTElURV9NT0RFKQorCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0udHlwZSA9CisJCQlQT1dFUl9TVEFURV9UWVBFX0JBTEFOQ0VEOworCWlmIChtaXNjICYgQVRPTV9QTV9NSVNDSU5GT19EUklWRVJfREVGQVVMVF9NT0RFKSB7CisJCXJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS50eXBlID0KKwkJCVBPV0VSX1NUQVRFX1RZUEVfREVGQVVMVDsKKwkJcmRldi0+cG0uZGVmYXVsdF9wb3dlcl9zdGF0ZV9pbmRleCA9IHN0YXRlX2luZGV4OworCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0uZGVmYXVsdF9jbG9ja19tb2RlID0KKwkJCSZyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0uY2xvY2tfaW5mb1swXTsKKwl9IGVsc2UgaWYgKHN0YXRlX2luZGV4ID09IDApIHsKKwkJcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLmNsb2NrX2luZm9bMF0uZmxhZ3MgfD0KKwkJCVJBREVPTl9QTV9NT0RFX05PX0RJU1BMQVk7CisJfQorfQorCitzdGF0aWMgaW50IHJhZGVvbl9hdG9tYmlvc19wYXJzZV9wb3dlcl90YWJsZV8xXzMoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCit7CisJc3RydWN0IHJhZGVvbl9tb2RlX2luZm8gKm1vZGVfaW5mbyA9ICZyZGV2LT5tb2RlX2luZm87CisJdTMyIG1pc2MsIG1pc2MyID0gMDsKKwlpbnQgbnVtX21vZGVzID0gMCwgaTsKKwlpbnQgc3RhdGVfaW5kZXggPSAwOworCXN0cnVjdCByYWRlb25faTJjX2J1c19yZWMgaTJjX2J1czsKKwl1bmlvbiBwb3dlcl9pbmZvICpwb3dlcl9pbmZvOworCWludCBpbmRleCA9IEdldEluZGV4SW50b01hc3RlclRhYmxlKERBVEEsIFBvd2VyUGxheUluZm8pOworICAgICAgICB1MTYgZGF0YV9vZmZzZXQ7CisJdTggZnJldiwgY3JldjsKKworCWlmICghYXRvbV9wYXJzZV9kYXRhX2hlYWRlcihtb2RlX2luZm8tPmF0b21fY29udGV4dCwgaW5kZXgsIE5VTEwsCisJCQkJICAgJmZyZXYsICZjcmV2LCAmZGF0YV9vZmZzZXQpKQorCQlyZXR1cm4gc3RhdGVfaW5kZXg7CisJcG93ZXJfaW5mbyA9ICh1bmlvbiBwb3dlcl9pbmZvICopKG1vZGVfaW5mby0+YXRvbV9jb250ZXh0LT5iaW9zICsgZGF0YV9vZmZzZXQpOworCisJLyogYWRkIHRoZSBpMmMgYnVzIGZvciB0aGVybWFsL2ZhbiBjaGlwICovCisJaWYgKHBvd2VyX2luZm8tPmluZm8udWNPdmVyZHJpdmVUaGVybWFsQ29udHJvbGxlciA+IDApIHsKKwkJRFJNX0lORk8oIlBvc3NpYmxlICVzIHRoZXJtYWwgY29udHJvbGxlciBhdCAweCUwMnhcbiIsCisJCQkgdGhlcm1hbF9jb250cm9sbGVyX25hbWVzW3Bvd2VyX2luZm8tPmluZm8udWNPdmVyZHJpdmVUaGVybWFsQ29udHJvbGxlcl0sCisJCQkgcG93ZXJfaW5mby0+aW5mby51Y092ZXJkcml2ZUNvbnRyb2xsZXJBZGRyZXNzID4+IDEpOworCQlpMmNfYnVzID0gcmFkZW9uX2xvb2t1cF9pMmNfZ3BpbyhyZGV2LCBwb3dlcl9pbmZvLT5pbmZvLnVjT3ZlcmRyaXZlSTJjTGluZSk7CisJCXJkZXYtPnBtLmkyY19idXMgPSByYWRlb25faTJjX2xvb2t1cChyZGV2LCAmaTJjX2J1cyk7CisJCWlmIChyZGV2LT5wbS5pMmNfYnVzKSB7CisJCQlzdHJ1Y3QgaTJjX2JvYXJkX2luZm8gaW5mbyA9IHsgfTsKKwkJCWNvbnN0IGNoYXIgKm5hbWUgPSB0aGVybWFsX2NvbnRyb2xsZXJfbmFtZXNbcG93ZXJfaW5mby0+aW5mby4KKwkJCQkJCQkJICAgIHVjT3ZlcmRyaXZlVGhlcm1hbENvbnRyb2xsZXJdOworCQkJaW5mby5hZGRyID0gcG93ZXJfaW5mby0+aW5mby51Y092ZXJkcml2ZUNvbnRyb2xsZXJBZGRyZXNzID4+IDE7CisJCQlzdHJsY3B5KGluZm8udHlwZSwgbmFtZSwgc2l6ZW9mKGluZm8udHlwZSkpOworCQkJaTJjX25ld19kZXZpY2UoJnJkZXYtPnBtLmkyY19idXMtPmFkYXB0ZXIsICZpbmZvKTsKKwkJfQorCX0KKwludW1fbW9kZXMgPSBwb3dlcl9pbmZvLT5pbmZvLnVjTnVtT2ZQb3dlck1vZGVFbnRyaWVzOworCWlmIChudW1fbW9kZXMgPiBBVE9NX01BWF9OVU1CRVJPRl9QT1dFUl9CTE9DSykKKwkJbnVtX21vZGVzID0gQVRPTV9NQVhfTlVNQkVST0ZfUE9XRVJfQkxPQ0s7CisJLyogbGFzdCBtb2RlIGlzIHVzdWFsbHkgZGVmYXVsdCwgYXJyYXkgaXMgbG93IHRvIGhpZ2ggKi8KKwlmb3IgKGkgPSAwOyBpIDwgbnVtX21vZGVzOyBpKyspIHsKKwkJcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLmNsb2NrX2luZm9bMF0udm9sdGFnZS50eXBlID0gVk9MVEFHRV9OT05FOworCQlzd2l0Y2ggKGZyZXYpIHsKKwkJY2FzZSAxOgorCQkJcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLm51bV9jbG9ja19tb2RlcyA9IDE7CisJCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0uY2xvY2tfaW5mb1swXS5tY2xrID0KKwkJCQlsZTE2X3RvX2NwdShwb3dlcl9pbmZvLT5pbmZvLmFzUG93ZXJQbGF5SW5mb1tpXS51c01lbW9yeUNsb2NrKTsKKwkJCXJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS5jbG9ja19pbmZvWzBdLnNjbGsgPQorCQkJCWxlMTZfdG9fY3B1KHBvd2VyX2luZm8tPmluZm8uYXNQb3dlclBsYXlJbmZvW2ldLnVzRW5naW5lQ2xvY2spOworCQkJLyogc2tpcCBpbnZhbGlkIG1vZGVzICovCisJCQlpZiAoKHJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS5jbG9ja19pbmZvWzBdLm1jbGsgPT0gMCkgfHwKKwkJCSAgICAocmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLmNsb2NrX2luZm9bMF0uc2NsayA9PSAwKSkKKwkJCQljb250aW51ZTsKKwkJCXJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS5wY2llX2xhbmVzID0KKwkJCQlwb3dlcl9pbmZvLT5pbmZvLmFzUG93ZXJQbGF5SW5mb1tpXS51Y051bVBjaUVMYW5lczsKKwkJCW1pc2MgPSBsZTMyX3RvX2NwdShwb3dlcl9pbmZvLT5pbmZvLmFzUG93ZXJQbGF5SW5mb1tpXS51bE1pc2NJbmZvKTsKKwkJCWlmICgobWlzYyAmIEFUT01fUE1fTUlTQ0lORk9fVk9MVEFHRV9EUk9QX1NVUFBPUlQpIHx8CisJCQkgICAgKG1pc2MgJiBBVE9NX1BNX01JU0NJTkZPX1ZPTFRBR0VfRFJPUF9BQ1RJVkVfSElHSCkpIHsKKwkJCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0uY2xvY2tfaW5mb1swXS52b2x0YWdlLnR5cGUgPQorCQkJCQlWT0xUQUdFX0dQSU87CisJCQkJcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLmNsb2NrX2luZm9bMF0udm9sdGFnZS5ncGlvID0KKwkJCQkJcmFkZW9uX2xvb2t1cF9ncGlvKHJkZXYsCisJCQkJCQkJICAgcG93ZXJfaW5mby0+aW5mby5hc1Bvd2VyUGxheUluZm9baV0udWNWb2x0YWdlRHJvcEluZGV4KTsKKwkJCQlpZiAobWlzYyAmIEFUT01fUE1fTUlTQ0lORk9fVk9MVEFHRV9EUk9QX0FDVElWRV9ISUdIKQorCQkJCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0uY2xvY2tfaW5mb1swXS52b2x0YWdlLmFjdGl2ZV9oaWdoID0KKwkJCQkJCXRydWU7CisJCQkJZWxzZQorCQkJCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0uY2xvY2tfaW5mb1swXS52b2x0YWdlLmFjdGl2ZV9oaWdoID0KKwkJCQkJCWZhbHNlOworCQkJfSBlbHNlIGlmIChtaXNjICYgQVRPTV9QTV9NSVNDSU5GT19QUk9HUkFNX1ZPTFRBR0UpIHsKKwkJCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0uY2xvY2tfaW5mb1swXS52b2x0YWdlLnR5cGUgPQorCQkJCQlWT0xUQUdFX1ZEREM7CisJCQkJcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLmNsb2NrX2luZm9bMF0udm9sdGFnZS52ZGRjX2lkID0KKwkJCQkJcG93ZXJfaW5mby0+aW5mby5hc1Bvd2VyUGxheUluZm9baV0udWNWb2x0YWdlRHJvcEluZGV4OworCQkJfQorCQkJcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLmZsYWdzID0gUkFERU9OX1BNX1NUQVRFX1NJTkdMRV9ESVNQTEFZX09OTFk7CisJCQlyYWRlb25fYXRvbWJpb3NfcGFyc2VfbWlzY19mbGFnc18xXzMocmRldiwgc3RhdGVfaW5kZXgsIG1pc2MsIDApOworCQkJc3RhdGVfaW5kZXgrKzsKKwkJCWJyZWFrOworCQljYXNlIDI6CisJCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0ubnVtX2Nsb2NrX21vZGVzID0gMTsKKwkJCXJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS5jbG9ja19pbmZvWzBdLm1jbGsgPQorCQkJCWxlMzJfdG9fY3B1KHBvd2VyX2luZm8tPmluZm9fMi5hc1Bvd2VyUGxheUluZm9baV0udWxNZW1vcnlDbG9jayk7CisJCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0uY2xvY2tfaW5mb1swXS5zY2xrID0KKwkJCQlsZTMyX3RvX2NwdShwb3dlcl9pbmZvLT5pbmZvXzIuYXNQb3dlclBsYXlJbmZvW2ldLnVsRW5naW5lQ2xvY2spOworCQkJLyogc2tpcCBpbnZhbGlkIG1vZGVzICovCisJCQlpZiAoKHJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS5jbG9ja19pbmZvWzBdLm1jbGsgPT0gMCkgfHwKKwkJCSAgICAocmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLmNsb2NrX2luZm9bMF0uc2NsayA9PSAwKSkKKwkJCQljb250aW51ZTsKKwkJCXJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS5wY2llX2xhbmVzID0KKwkJCQlwb3dlcl9pbmZvLT5pbmZvXzIuYXNQb3dlclBsYXlJbmZvW2ldLnVjTnVtUGNpRUxhbmVzOworCQkJbWlzYyA9IGxlMzJfdG9fY3B1KHBvd2VyX2luZm8tPmluZm9fMi5hc1Bvd2VyUGxheUluZm9baV0udWxNaXNjSW5mbyk7CisJCQltaXNjMiA9IGxlMzJfdG9fY3B1KHBvd2VyX2luZm8tPmluZm9fMi5hc1Bvd2VyUGxheUluZm9baV0udWxNaXNjSW5mbzIpOworCQkJaWYgKChtaXNjICYgQVRPTV9QTV9NSVNDSU5GT19WT0xUQUdFX0RST1BfU1VQUE9SVCkgfHwKKwkJCSAgICAobWlzYyAmIEFUT01fUE1fTUlTQ0lORk9fVk9MVEFHRV9EUk9QX0FDVElWRV9ISUdIKSkgeworCQkJCXJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS5jbG9ja19pbmZvWzBdLnZvbHRhZ2UudHlwZSA9CisJCQkJCVZPTFRBR0VfR1BJTzsKKwkJCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0uY2xvY2tfaW5mb1swXS52b2x0YWdlLmdwaW8gPQorCQkJCQlyYWRlb25fbG9va3VwX2dwaW8ocmRldiwKKwkJCQkJCQkgICBwb3dlcl9pbmZvLT5pbmZvXzIuYXNQb3dlclBsYXlJbmZvW2ldLnVjVm9sdGFnZURyb3BJbmRleCk7CisJCQkJaWYgKG1pc2MgJiBBVE9NX1BNX01JU0NJTkZPX1ZPTFRBR0VfRFJPUF9BQ1RJVkVfSElHSCkKKwkJCQkJcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLmNsb2NrX2luZm9bMF0udm9sdGFnZS5hY3RpdmVfaGlnaCA9CisJCQkJCQl0cnVlOworCQkJCWVsc2UKKwkJCQkJcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLmNsb2NrX2luZm9bMF0udm9sdGFnZS5hY3RpdmVfaGlnaCA9CisJCQkJCQlmYWxzZTsKKwkJCX0gZWxzZSBpZiAobWlzYyAmIEFUT01fUE1fTUlTQ0lORk9fUFJPR1JBTV9WT0xUQUdFKSB7CisJCQkJcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLmNsb2NrX2luZm9bMF0udm9sdGFnZS50eXBlID0KKwkJCQkJVk9MVEFHRV9WRERDOworCQkJCXJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS5jbG9ja19pbmZvWzBdLnZvbHRhZ2UudmRkY19pZCA9CisJCQkJCXBvd2VyX2luZm8tPmluZm9fMi5hc1Bvd2VyUGxheUluZm9baV0udWNWb2x0YWdlRHJvcEluZGV4OworCQkJfQorCQkJcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLmZsYWdzID0gUkFERU9OX1BNX1NUQVRFX1NJTkdMRV9ESVNQTEFZX09OTFk7CisJCQlyYWRlb25fYXRvbWJpb3NfcGFyc2VfbWlzY19mbGFnc18xXzMocmRldiwgc3RhdGVfaW5kZXgsIG1pc2MsIG1pc2MyKTsKKwkJCXN0YXRlX2luZGV4Kys7CisJCQlicmVhazsKKwkJY2FzZSAzOgorCQkJcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLm51bV9jbG9ja19tb2RlcyA9IDE7CisJCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0uY2xvY2tfaW5mb1swXS5tY2xrID0KKwkJCQlsZTMyX3RvX2NwdShwb3dlcl9pbmZvLT5pbmZvXzMuYXNQb3dlclBsYXlJbmZvW2ldLnVsTWVtb3J5Q2xvY2spOworCQkJcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLmNsb2NrX2luZm9bMF0uc2NsayA9CisJCQkJbGUzMl90b19jcHUocG93ZXJfaW5mby0+aW5mb18zLmFzUG93ZXJQbGF5SW5mb1tpXS51bEVuZ2luZUNsb2NrKTsKKwkJCS8qIHNraXAgaW52YWxpZCBtb2RlcyAqLworCQkJaWYgKChyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0uY2xvY2tfaW5mb1swXS5tY2xrID09IDApIHx8CisJCQkgICAgKHJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS5jbG9ja19pbmZvWzBdLnNjbGsgPT0gMCkpCisJCQkJY29udGludWU7CisJCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0ucGNpZV9sYW5lcyA9CisJCQkJcG93ZXJfaW5mby0+aW5mb18zLmFzUG93ZXJQbGF5SW5mb1tpXS51Y051bVBjaUVMYW5lczsKKwkJCW1pc2MgPSBsZTMyX3RvX2NwdShwb3dlcl9pbmZvLT5pbmZvXzMuYXNQb3dlclBsYXlJbmZvW2ldLnVsTWlzY0luZm8pOworCQkJbWlzYzIgPSBsZTMyX3RvX2NwdShwb3dlcl9pbmZvLT5pbmZvXzMuYXNQb3dlclBsYXlJbmZvW2ldLnVsTWlzY0luZm8yKTsKKwkJCWlmICgobWlzYyAmIEFUT01fUE1fTUlTQ0lORk9fVk9MVEFHRV9EUk9QX1NVUFBPUlQpIHx8CisJCQkgICAgKG1pc2MgJiBBVE9NX1BNX01JU0NJTkZPX1ZPTFRBR0VfRFJPUF9BQ1RJVkVfSElHSCkpIHsKKwkJCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0uY2xvY2tfaW5mb1swXS52b2x0YWdlLnR5cGUgPQorCQkJCQlWT0xUQUdFX0dQSU87CisJCQkJcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLmNsb2NrX2luZm9bMF0udm9sdGFnZS5ncGlvID0KKwkJCQkJcmFkZW9uX2xvb2t1cF9ncGlvKHJkZXYsCisJCQkJCQkJICAgcG93ZXJfaW5mby0+aW5mb18zLmFzUG93ZXJQbGF5SW5mb1tpXS51Y1ZvbHRhZ2VEcm9wSW5kZXgpOworCQkJCWlmIChtaXNjICYgQVRPTV9QTV9NSVNDSU5GT19WT0xUQUdFX0RST1BfQUNUSVZFX0hJR0gpCisJCQkJCXJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS5jbG9ja19pbmZvWzBdLnZvbHRhZ2UuYWN0aXZlX2hpZ2ggPQorCQkJCQkJdHJ1ZTsKKwkJCQllbHNlCisJCQkJCXJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS5jbG9ja19pbmZvWzBdLnZvbHRhZ2UuYWN0aXZlX2hpZ2ggPQorCQkJCQkJZmFsc2U7CisJCQl9IGVsc2UgaWYgKG1pc2MgJiBBVE9NX1BNX01JU0NJTkZPX1BST0dSQU1fVk9MVEFHRSkgeworCQkJCXJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS5jbG9ja19pbmZvWzBdLnZvbHRhZ2UudHlwZSA9CisJCQkJCVZPTFRBR0VfVkREQzsKKwkJCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0uY2xvY2tfaW5mb1swXS52b2x0YWdlLnZkZGNfaWQgPQorCQkJCQlwb3dlcl9pbmZvLT5pbmZvXzMuYXNQb3dlclBsYXlJbmZvW2ldLnVjVm9sdGFnZURyb3BJbmRleDsKKwkJCQlpZiAobWlzYzIgJiBBVE9NX1BNX01JU0NJTkZPMl9WRERDSV9EWU5BTUlDX1ZPTFRBR0VfRU4pIHsKKwkJCQkJcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLmNsb2NrX2luZm9bMF0udm9sdGFnZS52ZGRjaV9lbmFibGVkID0KKwkJCQkJCXRydWU7CisJCQkJCXJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS5jbG9ja19pbmZvWzBdLnZvbHRhZ2UudmRkY2lfaWQgPQorCQkJCQkJcG93ZXJfaW5mby0+aW5mb18zLmFzUG93ZXJQbGF5SW5mb1tpXS51Y1ZERENJX1ZvbHRhZ2VEcm9wSW5kZXg7CisJCQkJfQorCQkJfQorCQkJcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLmZsYWdzID0gUkFERU9OX1BNX1NUQVRFX1NJTkdMRV9ESVNQTEFZX09OTFk7CisJCQlyYWRlb25fYXRvbWJpb3NfcGFyc2VfbWlzY19mbGFnc18xXzMocmRldiwgc3RhdGVfaW5kZXgsIG1pc2MsIG1pc2MyKTsKKwkJCXN0YXRlX2luZGV4Kys7CisJCQlicmVhazsKKwkJfQorCX0KKwkvKiBsYXN0IG1vZGUgaXMgdXN1YWxseSBkZWZhdWx0ICovCisJaWYgKHJkZXYtPnBtLmRlZmF1bHRfcG93ZXJfc3RhdGVfaW5kZXggPT0gLTEpIHsKKwkJcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXggLSAxXS50eXBlID0KKwkJCVBPV0VSX1NUQVRFX1RZUEVfREVGQVVMVDsKKwkJcmRldi0+cG0uZGVmYXVsdF9wb3dlcl9zdGF0ZV9pbmRleCA9IHN0YXRlX2luZGV4IC0gMTsKKwkJcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXggLSAxXS5kZWZhdWx0X2Nsb2NrX21vZGUgPQorCQkJJnJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4IC0gMV0uY2xvY2tfaW5mb1swXTsKKwkJcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLmZsYWdzICY9CisJCQl+UkFERU9OX1BNX1NUQVRFX1NJTkdMRV9ESVNQTEFZX09OTFk7CisJCXJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS5taXNjID0gMDsKKwkJcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLm1pc2MyID0gMDsKKwl9CisJcmV0dXJuIHN0YXRlX2luZGV4OworfQorCitzdGF0aWMgdm9pZCByYWRlb25fYXRvbWJpb3NfYWRkX3BwbGliX3RoZXJtYWxfY29udHJvbGxlcihzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwKKwkJCQkJCQkgQVRPTV9QUExJQl9USEVSTUFMQ09OVFJPTExFUiAqY29udHJvbGxlcikKK3sKKwlzdHJ1Y3QgcmFkZW9uX2kyY19idXNfcmVjIGkyY19idXM7CisKKwkvKiBhZGQgdGhlIGkyYyBidXMgZm9yIHRoZXJtYWwvZmFuIGNoaXAgKi8KKwlpZiAoY29udHJvbGxlci0+dWNUeXBlID4gMCkgeworCQlpZiAoY29udHJvbGxlci0+dWNUeXBlID09IEFUT01fUFBfVEhFUk1BTENPTlRST0xMRVJfUlY2eHgpIHsKKwkJCURSTV9JTkZPKCJJbnRlcm5hbCB0aGVybWFsIGNvbnRyb2xsZXIgJXMgZmFuIGNvbnRyb2xcbiIsCisJCQkJIChjb250cm9sbGVyLT51Y0ZhblBhcmFtZXRlcnMgJgorCQkJCSAgQVRPTV9QUF9GQU5QQVJBTUVURVJTX05PRkFOKSA/ICJ3aXRob3V0IiA6ICJ3aXRoIik7CisJCQlyZGV2LT5wbS5pbnRfdGhlcm1hbF90eXBlID0gVEhFUk1BTF9UWVBFX1JWNlhYOworCQl9IGVsc2UgaWYgKGNvbnRyb2xsZXItPnVjVHlwZSA9PSBBVE9NX1BQX1RIRVJNQUxDT05UUk9MTEVSX1JWNzcwKSB7CisJCQlEUk1fSU5GTygiSW50ZXJuYWwgdGhlcm1hbCBjb250cm9sbGVyICVzIGZhbiBjb250cm9sXG4iLAorCQkJCSAoY29udHJvbGxlci0+dWNGYW5QYXJhbWV0ZXJzICYKKwkJCQkgIEFUT01fUFBfRkFOUEFSQU1FVEVSU19OT0ZBTikgPyAid2l0aG91dCIgOiAid2l0aCIpOworCQkJcmRldi0+cG0uaW50X3RoZXJtYWxfdHlwZSA9IFRIRVJNQUxfVFlQRV9SVjc3MDsKKwkJfSBlbHNlIGlmIChjb250cm9sbGVyLT51Y1R5cGUgPT0gQVRPTV9QUF9USEVSTUFMQ09OVFJPTExFUl9FVkVSR1JFRU4pIHsKKwkJCURSTV9JTkZPKCJJbnRlcm5hbCB0aGVybWFsIGNvbnRyb2xsZXIgJXMgZmFuIGNvbnRyb2xcbiIsCisJCQkJIChjb250cm9sbGVyLT51Y0ZhblBhcmFtZXRlcnMgJgorCQkJCSAgQVRPTV9QUF9GQU5QQVJBTUVURVJTX05PRkFOKSA/ICJ3aXRob3V0IiA6ICJ3aXRoIik7CisJCQlyZGV2LT5wbS5pbnRfdGhlcm1hbF90eXBlID0gVEhFUk1BTF9UWVBFX0VWRVJHUkVFTjsKKwkJfSBlbHNlIGlmIChjb250cm9sbGVyLT51Y1R5cGUgPT0gQVRPTV9QUF9USEVSTUFMQ09OVFJPTExFUl9TVU1PKSB7CisJCQlEUk1fSU5GTygiSW50ZXJuYWwgdGhlcm1hbCBjb250cm9sbGVyICVzIGZhbiBjb250cm9sXG4iLAorCQkJCSAoY29udHJvbGxlci0+dWNGYW5QYXJhbWV0ZXJzICYKKwkJCQkgIEFUT01fUFBfRkFOUEFSQU1FVEVSU19OT0ZBTikgPyAid2l0aG91dCIgOiAid2l0aCIpOworCQkJcmRldi0+cG0uaW50X3RoZXJtYWxfdHlwZSA9IFRIRVJNQUxfVFlQRV9TVU1POworCQl9IGVsc2UgaWYgKGNvbnRyb2xsZXItPnVjVHlwZSA9PSBBVE9NX1BQX1RIRVJNQUxDT05UUk9MTEVSX05JU0xBTkRTKSB7CisJCQlEUk1fSU5GTygiSW50ZXJuYWwgdGhlcm1hbCBjb250cm9sbGVyICVzIGZhbiBjb250cm9sXG4iLAorCQkJCSAoY29udHJvbGxlci0+dWNGYW5QYXJhbWV0ZXJzICYKKwkJCQkgIEFUT01fUFBfRkFOUEFSQU1FVEVSU19OT0ZBTikgPyAid2l0aG91dCIgOiAid2l0aCIpOworCQkJcmRldi0+cG0uaW50X3RoZXJtYWxfdHlwZSA9IFRIRVJNQUxfVFlQRV9OSTsKKwkJfSBlbHNlIGlmICgoY29udHJvbGxlci0+dWNUeXBlID09CisJCQkgICAgQVRPTV9QUF9USEVSTUFMQ09OVFJPTExFUl9FWFRFUk5BTF9HUElPKSB8fAorCQkJICAgKGNvbnRyb2xsZXItPnVjVHlwZSA9PQorCQkJICAgIEFUT01fUFBfVEhFUk1BTENPTlRST0xMRVJfQURUNzQ3M19XSVRIX0lOVEVSTkFMKSB8fAorCQkJICAgKGNvbnRyb2xsZXItPnVjVHlwZSA9PQorCQkJICAgIEFUT01fUFBfVEhFUk1BTENPTlRST0xMRVJfRU1DMjEwM19XSVRIX0lOVEVSTkFMKSkgeworCQkJRFJNX0lORk8oIlNwZWNpYWwgdGhlcm1hbCBjb250cm9sbGVyIGNvbmZpZ1xuIik7CisJCX0gZWxzZSB7CisJCQlEUk1fSU5GTygiUG9zc2libGUgJXMgdGhlcm1hbCBjb250cm9sbGVyIGF0IDB4JTAyeCAlcyBmYW4gY29udHJvbFxuIiwKKwkJCQkgcHBfbGliX3RoZXJtYWxfY29udHJvbGxlcl9uYW1lc1tjb250cm9sbGVyLT51Y1R5cGVdLAorCQkJCSBjb250cm9sbGVyLT51Y0kyY0FkZHJlc3MgPj4gMSwKKwkJCQkgKGNvbnRyb2xsZXItPnVjRmFuUGFyYW1ldGVycyAmCisJCQkJICBBVE9NX1BQX0ZBTlBBUkFNRVRFUlNfTk9GQU4pID8gIndpdGhvdXQiIDogIndpdGgiKTsKKwkJCWkyY19idXMgPSByYWRlb25fbG9va3VwX2kyY19ncGlvKHJkZXYsIGNvbnRyb2xsZXItPnVjSTJjTGluZSk7CisJCQlyZGV2LT5wbS5pMmNfYnVzID0gcmFkZW9uX2kyY19sb29rdXAocmRldiwgJmkyY19idXMpOworCQkJaWYgKHJkZXYtPnBtLmkyY19idXMpIHsKKwkJCQlzdHJ1Y3QgaTJjX2JvYXJkX2luZm8gaW5mbyA9IHsgfTsKKwkJCQljb25zdCBjaGFyICpuYW1lID0gcHBfbGliX3RoZXJtYWxfY29udHJvbGxlcl9uYW1lc1tjb250cm9sbGVyLT51Y1R5cGVdOworCQkJCWluZm8uYWRkciA9IGNvbnRyb2xsZXItPnVjSTJjQWRkcmVzcyA+PiAxOworCQkJCXN0cmxjcHkoaW5mby50eXBlLCBuYW1lLCBzaXplb2YoaW5mby50eXBlKSk7CisJCQkJaTJjX25ld19kZXZpY2UoJnJkZXYtPnBtLmkyY19idXMtPmFkYXB0ZXIsICZpbmZvKTsKKwkJCX0KKwkJfQorCX0KK30KKworc3RhdGljIHUxNiByYWRlb25fYXRvbWJpb3NfZ2V0X2RlZmF1bHRfdmRkYyhzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKK3sKKwlzdHJ1Y3QgcmFkZW9uX21vZGVfaW5mbyAqbW9kZV9pbmZvID0gJnJkZXYtPm1vZGVfaW5mbzsKKwlpbnQgaW5kZXggPSBHZXRJbmRleEludG9NYXN0ZXJUYWJsZShEQVRBLCBGaXJtd2FyZUluZm8pOworCXU4IGZyZXYsIGNyZXY7CisJdTE2IGRhdGFfb2Zmc2V0OworCXVuaW9uIGZpcm13YXJlX2luZm8gKmZpcm13YXJlX2luZm87CisJdTE2IHZkZGMgPSAwOworCisJaWYgKGF0b21fcGFyc2VfZGF0YV9oZWFkZXIobW9kZV9pbmZvLT5hdG9tX2NvbnRleHQsIGluZGV4LCBOVUxMLAorCQkJCSAgICZmcmV2LCAmY3JldiwgJmRhdGFfb2Zmc2V0KSkgeworCQlmaXJtd2FyZV9pbmZvID0KKwkJCSh1bmlvbiBmaXJtd2FyZV9pbmZvICopKG1vZGVfaW5mby0+YXRvbV9jb250ZXh0LT5iaW9zICsKKwkJCQkJCWRhdGFfb2Zmc2V0KTsKKwkJdmRkYyA9IGZpcm13YXJlX2luZm8tPmluZm9fMTQudXNCb290VXBWRERDVm9sdGFnZTsKKwl9CisKKwlyZXR1cm4gdmRkYzsKK30KKworc3RhdGljIHZvaWQgcmFkZW9uX2F0b21iaW9zX3BhcnNlX3BwbGliX25vbl9jbG9ja19pbmZvKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LAorCQkJCQkJICAgICAgIGludCBzdGF0ZV9pbmRleCwgaW50IG1vZGVfaW5kZXgsCisJCQkJCQkgICAgICAgc3RydWN0IF9BVE9NX1BQTElCX05PTkNMT0NLX0lORk8gKm5vbl9jbG9ja19pbmZvKQoreworCWludCBqOworCXUzMiBtaXNjID0gbGUzMl90b19jcHUobm9uX2Nsb2NrX2luZm8tPnVsQ2Fwc0FuZFNldHRpbmdzKTsKKwl1MzIgbWlzYzIgPSBsZTE2X3RvX2NwdShub25fY2xvY2tfaW5mby0+dXNDbGFzc2lmaWNhdGlvbik7CisJdTE2IHZkZGMgPSByYWRlb25fYXRvbWJpb3NfZ2V0X2RlZmF1bHRfdmRkYyhyZGV2KTsKKworCXJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS5taXNjID0gbWlzYzsKKwlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0ubWlzYzIgPSBtaXNjMjsKKwlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0ucGNpZV9sYW5lcyA9CisJCSgobWlzYyAmIEFUT01fUFBMSUJfUENJRV9MSU5LX1dJRFRIX01BU0spID4+CisJCSBBVE9NX1BQTElCX1BDSUVfTElOS19XSURUSF9TSElGVCkgKyAxOworCXN3aXRjaCAobWlzYzIgJiBBVE9NX1BQTElCX0NMQVNTSUZJQ0FUSU9OX1VJX01BU0spIHsKKwljYXNlIEFUT01fUFBMSUJfQ0xBU1NJRklDQVRJT05fVUlfQkFUVEVSWToKKwkJcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLnR5cGUgPQorCQkJUE9XRVJfU1RBVEVfVFlQRV9CQVRURVJZOworCQlicmVhazsKKwljYXNlIEFUT01fUFBMSUJfQ0xBU1NJRklDQVRJT05fVUlfQkFMQU5DRUQ6CisJCXJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS50eXBlID0KKwkJCVBPV0VSX1NUQVRFX1RZUEVfQkFMQU5DRUQ7CisJCWJyZWFrOworCWNhc2UgQVRPTV9QUExJQl9DTEFTU0lGSUNBVElPTl9VSV9QRVJGT1JNQU5DRToKKwkJcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLnR5cGUgPQorCQkJUE9XRVJfU1RBVEVfVFlQRV9QRVJGT1JNQU5DRTsKKwkJYnJlYWs7CisJY2FzZSBBVE9NX1BQTElCX0NMQVNTSUZJQ0FUSU9OX1VJX05PTkU6CisJCWlmIChtaXNjMiAmIEFUT01fUFBMSUJfQ0xBU1NJRklDQVRJT05fM0RQRVJGT1JNQU5DRSkKKwkJCXJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS50eXBlID0KKwkJCQlQT1dFUl9TVEFURV9UWVBFX1BFUkZPUk1BTkNFOworCQlicmVhazsKKwl9CisJcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLmZsYWdzID0gMDsKKwlpZiAobWlzYyAmIEFUT01fUFBMSUJfU0lOR0xFX0RJU1BMQVlfT05MWSkKKwkJcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLmZsYWdzIHw9CisJCQlSQURFT05fUE1fU1RBVEVfU0lOR0xFX0RJU1BMQVlfT05MWTsKKwlpZiAobWlzYzIgJiBBVE9NX1BQTElCX0NMQVNTSUZJQ0FUSU9OX0JPT1QpIHsKKwkJcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLnR5cGUgPQorCQkJUE9XRVJfU1RBVEVfVFlQRV9ERUZBVUxUOworCQlyZGV2LT5wbS5kZWZhdWx0X3Bvd2VyX3N0YXRlX2luZGV4ID0gc3RhdGVfaW5kZXg7CisJCXJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS5kZWZhdWx0X2Nsb2NrX21vZGUgPQorCQkJJnJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS5jbG9ja19pbmZvW21vZGVfaW5kZXggLSAxXTsKKwkJaWYgKEFTSUNfSVNfRENFNShyZGV2KSkgeworCQkJLyogTkkgY2hpcHMgcG9zdCB3aXRob3V0IE1DIHVjb2RlLCBzbyBkZWZhdWx0IGNsb2NrcyBhcmUgc3Ryb2JlIG1vZGUgb25seSAqLworCQkJcmRldi0+cG0uZGVmYXVsdF9zY2xrID0gcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLmNsb2NrX2luZm9bMF0uc2NsazsKKwkJCXJkZXYtPnBtLmRlZmF1bHRfbWNsayA9IHJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS5jbG9ja19pbmZvWzBdLm1jbGs7CisJCQlyZGV2LT5wbS5kZWZhdWx0X3ZkZGMgPSByZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0uY2xvY2tfaW5mb1swXS52b2x0YWdlLnZvbHRhZ2U7CisJCX0gZWxzZSB7CisJCQkvKiBwYXRjaCB0aGUgdGFibGUgdmFsdWVzIHdpdGggdGhlIGRlZmF1bHQgc2xjay9tY2xrIGZyb20gZmlybXdhcmUgaW5mbyAqLworCQkJZm9yIChqID0gMDsgaiA8IG1vZGVfaW5kZXg7IGorKykgeworCQkJCXJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS5jbG9ja19pbmZvW2pdLm1jbGsgPQorCQkJCQlyZGV2LT5jbG9jay5kZWZhdWx0X21jbGs7CisJCQkJcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLmNsb2NrX2luZm9bal0uc2NsayA9CisJCQkJCXJkZXYtPmNsb2NrLmRlZmF1bHRfc2NsazsKKwkJCQlpZiAodmRkYykKKwkJCQkJcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLmNsb2NrX2luZm9bal0udm9sdGFnZS52b2x0YWdlID0KKwkJCQkJCXZkZGM7CisJCQl9CisJCX0KKwl9Cit9CisKK3N0YXRpYyBib29sIHJhZGVvbl9hdG9tYmlvc19wYXJzZV9wcGxpYl9jbG9ja19pbmZvKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LAorCQkJCQkJICAgaW50IHN0YXRlX2luZGV4LCBpbnQgbW9kZV9pbmRleCwKKwkJCQkJCSAgIHVuaW9uIHBwbGliX2Nsb2NrX2luZm8gKmNsb2NrX2luZm8pCit7CisJdTMyIHNjbGssIG1jbGs7CisKKwlpZiAocmRldi0+ZmxhZ3MgJiBSQURFT05fSVNfSUdQKSB7CisJCWlmIChyZGV2LT5mYW1pbHkgPj0gQ0hJUF9QQUxNKSB7CisJCQlzY2xrID0gbGUxNl90b19jcHUoY2xvY2tfaW5mby0+c3Vtby51c0VuZ2luZUNsb2NrTG93KTsKKwkJCXNjbGsgfD0gY2xvY2tfaW5mby0+c3Vtby51Y0VuZ2luZUNsb2NrSGlnaCA8PCAxNjsKKwkJCXJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS5jbG9ja19pbmZvW21vZGVfaW5kZXhdLnNjbGsgPSBzY2xrOworCQl9IGVsc2UgeworCQkJc2NsayA9IGxlMTZfdG9fY3B1KGNsb2NrX2luZm8tPnJzNzgwLnVzTG93RW5naW5lQ2xvY2tMb3cpOworCQkJc2NsayB8PSBjbG9ja19pbmZvLT5yczc4MC51Y0xvd0VuZ2luZUNsb2NrSGlnaCA8PCAxNjsKKwkJCXJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS5jbG9ja19pbmZvW21vZGVfaW5kZXhdLnNjbGsgPSBzY2xrOworCQl9CisJfSBlbHNlIGlmIChBU0lDX0lTX0RDRTQocmRldikpIHsKKwkJc2NsayA9IGxlMTZfdG9fY3B1KGNsb2NrX2luZm8tPmV2ZXJncmVlbi51c0VuZ2luZUNsb2NrTG93KTsKKwkJc2NsayB8PSBjbG9ja19pbmZvLT5ldmVyZ3JlZW4udWNFbmdpbmVDbG9ja0hpZ2ggPDwgMTY7CisJCW1jbGsgPSBsZTE2X3RvX2NwdShjbG9ja19pbmZvLT5ldmVyZ3JlZW4udXNNZW1vcnlDbG9ja0xvdyk7CisJCW1jbGsgfD0gY2xvY2tfaW5mby0+ZXZlcmdyZWVuLnVjTWVtb3J5Q2xvY2tIaWdoIDw8IDE2OworCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0uY2xvY2tfaW5mb1ttb2RlX2luZGV4XS5tY2xrID0gbWNsazsKKwkJcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLmNsb2NrX2luZm9bbW9kZV9pbmRleF0uc2NsayA9IHNjbGs7CisJCXJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS5jbG9ja19pbmZvW21vZGVfaW5kZXhdLnZvbHRhZ2UudHlwZSA9CisJCQlWT0xUQUdFX1NXOworCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0uY2xvY2tfaW5mb1ttb2RlX2luZGV4XS52b2x0YWdlLnZvbHRhZ2UgPQorCQkJY2xvY2tfaW5mby0+ZXZlcmdyZWVuLnVzVkREQzsKKwl9IGVsc2UgeworCQlzY2xrID0gbGUxNl90b19jcHUoY2xvY2tfaW5mby0+cjYwMC51c0VuZ2luZUNsb2NrTG93KTsKKwkJc2NsayB8PSBjbG9ja19pbmZvLT5yNjAwLnVjRW5naW5lQ2xvY2tIaWdoIDw8IDE2OworCQltY2xrID0gbGUxNl90b19jcHUoY2xvY2tfaW5mby0+cjYwMC51c01lbW9yeUNsb2NrTG93KTsKKwkJbWNsayB8PSBjbG9ja19pbmZvLT5yNjAwLnVjTWVtb3J5Q2xvY2tIaWdoIDw8IDE2OworCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0uY2xvY2tfaW5mb1ttb2RlX2luZGV4XS5tY2xrID0gbWNsazsKKwkJcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLmNsb2NrX2luZm9bbW9kZV9pbmRleF0uc2NsayA9IHNjbGs7CisJCXJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS5jbG9ja19pbmZvW21vZGVfaW5kZXhdLnZvbHRhZ2UudHlwZSA9CisJCQlWT0xUQUdFX1NXOworCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0uY2xvY2tfaW5mb1ttb2RlX2luZGV4XS52b2x0YWdlLnZvbHRhZ2UgPQorCQkJY2xvY2tfaW5mby0+cjYwMC51c1ZEREM7CisJfQorCisJaWYgKHJkZXYtPmZsYWdzICYgUkFERU9OX0lTX0lHUCkgeworCQkvKiBza2lwIGludmFsaWQgbW9kZXMgKi8KKwkJaWYgKHJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS5jbG9ja19pbmZvW21vZGVfaW5kZXhdLnNjbGsgPT0gMCkKKwkJCXJldHVybiBmYWxzZTsKKwl9IGVsc2UgeworCQkvKiBza2lwIGludmFsaWQgbW9kZXMgKi8KKwkJaWYgKChyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0uY2xvY2tfaW5mb1ttb2RlX2luZGV4XS5tY2xrID09IDApIHx8CisJCSAgICAocmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLmNsb2NrX2luZm9bbW9kZV9pbmRleF0uc2NsayA9PSAwKSkKKwkJCXJldHVybiBmYWxzZTsKKwl9CisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBpbnQgcmFkZW9uX2F0b21iaW9zX3BhcnNlX3Bvd2VyX3RhYmxlXzRfNShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKK3sKKwlzdHJ1Y3QgcmFkZW9uX21vZGVfaW5mbyAqbW9kZV9pbmZvID0gJnJkZXYtPm1vZGVfaW5mbzsKKwlzdHJ1Y3QgX0FUT01fUFBMSUJfTk9OQ0xPQ0tfSU5GTyAqbm9uX2Nsb2NrX2luZm87CisJdW5pb24gcHBsaWJfcG93ZXJfc3RhdGUgKnBvd2VyX3N0YXRlOworCWludCBpLCBqOworCWludCBzdGF0ZV9pbmRleCA9IDAsIG1vZGVfaW5kZXggPSAwOworCXVuaW9uIHBwbGliX2Nsb2NrX2luZm8gKmNsb2NrX2luZm87CisJYm9vbCB2YWxpZDsKKwl1bmlvbiBwb3dlcl9pbmZvICpwb3dlcl9pbmZvOworCWludCBpbmRleCA9IEdldEluZGV4SW50b01hc3RlclRhYmxlKERBVEEsIFBvd2VyUGxheUluZm8pOworICAgICAgICB1MTYgZGF0YV9vZmZzZXQ7CisJdTggZnJldiwgY3JldjsKKworCWlmICghYXRvbV9wYXJzZV9kYXRhX2hlYWRlcihtb2RlX2luZm8tPmF0b21fY29udGV4dCwgaW5kZXgsIE5VTEwsCisJCQkJICAgJmZyZXYsICZjcmV2LCAmZGF0YV9vZmZzZXQpKQorCQlyZXR1cm4gc3RhdGVfaW5kZXg7CisJcG93ZXJfaW5mbyA9ICh1bmlvbiBwb3dlcl9pbmZvICopKG1vZGVfaW5mby0+YXRvbV9jb250ZXh0LT5iaW9zICsgZGF0YV9vZmZzZXQpOworCisJcmFkZW9uX2F0b21iaW9zX2FkZF9wcGxpYl90aGVybWFsX2NvbnRyb2xsZXIocmRldiwgJnBvd2VyX2luZm8tPnBwbGliLnNUaGVybWFsQ29udHJvbGxlcik7CisJLyogZmlyc3QgbW9kZSBpcyB1c3VhbGx5IGRlZmF1bHQsIGZvbGxvd2VkIGJ5IGxvdyB0byBoaWdoICovCisJZm9yIChpID0gMDsgaSA8IHBvd2VyX2luZm8tPnBwbGliLnVjTnVtU3RhdGVzOyBpKyspIHsKKwkJbW9kZV9pbmRleCA9IDA7CisJCXBvd2VyX3N0YXRlID0gKHVuaW9uIHBwbGliX3Bvd2VyX3N0YXRlICopCisJCQkobW9kZV9pbmZvLT5hdG9tX2NvbnRleHQtPmJpb3MgKyBkYXRhX29mZnNldCArCisJCQkgbGUxNl90b19jcHUocG93ZXJfaW5mby0+cHBsaWIudXNTdGF0ZUFycmF5T2Zmc2V0KSArCisJCQkgaSAqIHBvd2VyX2luZm8tPnBwbGliLnVjU3RhdGVFbnRyeVNpemUpOworCQlub25fY2xvY2tfaW5mbyA9IChzdHJ1Y3QgX0FUT01fUFBMSUJfTk9OQ0xPQ0tfSU5GTyAqKQorCQkJKG1vZGVfaW5mby0+YXRvbV9jb250ZXh0LT5iaW9zICsgZGF0YV9vZmZzZXQgKworCQkJIGxlMTZfdG9fY3B1KHBvd2VyX2luZm8tPnBwbGliLnVzTm9uQ2xvY2tJbmZvQXJyYXlPZmZzZXQpICsKKwkJCSAocG93ZXJfc3RhdGUtPnYxLnVjTm9uQ2xvY2tTdGF0ZUluZGV4ICoKKwkJCSAgcG93ZXJfaW5mby0+cHBsaWIudWNOb25DbG9ja1NpemUpKTsKKwkJZm9yIChqID0gMDsgaiA8IChwb3dlcl9pbmZvLT5wcGxpYi51Y1N0YXRlRW50cnlTaXplIC0gMSk7IGorKykgeworCQkJY2xvY2tfaW5mbyA9ICh1bmlvbiBwcGxpYl9jbG9ja19pbmZvICopCisJCQkJKG1vZGVfaW5mby0+YXRvbV9jb250ZXh0LT5iaW9zICsgZGF0YV9vZmZzZXQgKworCQkJCSBsZTE2X3RvX2NwdShwb3dlcl9pbmZvLT5wcGxpYi51c0Nsb2NrSW5mb0FycmF5T2Zmc2V0KSArCisJCQkJIChwb3dlcl9zdGF0ZS0+djEudWNDbG9ja1N0YXRlSW5kaWNlc1tqXSAqCisJCQkJICBwb3dlcl9pbmZvLT5wcGxpYi51Y0Nsb2NrSW5mb1NpemUpKTsKKwkJCXZhbGlkID0gcmFkZW9uX2F0b21iaW9zX3BhcnNlX3BwbGliX2Nsb2NrX2luZm8ocmRldiwKKwkJCQkJCQkJICAgICAgIHN0YXRlX2luZGV4LCBtb2RlX2luZGV4LAorCQkJCQkJCQkgICAgICAgY2xvY2tfaW5mbyk7CisJCQlpZiAodmFsaWQpCisJCQkJbW9kZV9pbmRleCsrOworCQl9CisJCXJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS5udW1fY2xvY2tfbW9kZXMgPSBtb2RlX2luZGV4OworCQlpZiAobW9kZV9pbmRleCkgeworCQkJcmFkZW9uX2F0b21iaW9zX3BhcnNlX3BwbGliX25vbl9jbG9ja19pbmZvKHJkZXYsIHN0YXRlX2luZGV4LCBtb2RlX2luZGV4LAorCQkJCQkJCQkgICBub25fY2xvY2tfaW5mbyk7CisJCQlzdGF0ZV9pbmRleCsrOworCQl9CisJfQorCS8qIGlmIG11bHRpcGxlIGNsb2NrIG1vZGVzLCBtYXJrIHRoZSBsb3dlc3QgYXMgbm8gZGlzcGxheSAqLworCWZvciAoaSA9IDA7IGkgPCBzdGF0ZV9pbmRleDsgaSsrKSB7CisJCWlmIChyZGV2LT5wbS5wb3dlcl9zdGF0ZVtpXS5udW1fY2xvY2tfbW9kZXMgPiAxKQorCQkJcmRldi0+cG0ucG93ZXJfc3RhdGVbaV0uY2xvY2tfaW5mb1swXS5mbGFncyB8PQorCQkJCVJBREVPTl9QTV9NT0RFX05PX0RJU1BMQVk7CisJfQorCS8qIGZpcnN0IG1vZGUgaXMgdXN1YWxseSBkZWZhdWx0ICovCisJaWYgKHJkZXYtPnBtLmRlZmF1bHRfcG93ZXJfc3RhdGVfaW5kZXggPT0gLTEpIHsKKwkJcmRldi0+cG0ucG93ZXJfc3RhdGVbMF0udHlwZSA9CisJCQlQT1dFUl9TVEFURV9UWVBFX0RFRkFVTFQ7CisJCXJkZXYtPnBtLmRlZmF1bHRfcG93ZXJfc3RhdGVfaW5kZXggPSAwOworCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVswXS5kZWZhdWx0X2Nsb2NrX21vZGUgPQorCQkJJnJkZXYtPnBtLnBvd2VyX3N0YXRlWzBdLmNsb2NrX2luZm9bMF07CisJfQorCXJldHVybiBzdGF0ZV9pbmRleDsKK30KKworc3RhdGljIGludCByYWRlb25fYXRvbWJpb3NfcGFyc2VfcG93ZXJfdGFibGVfNihzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKK3sKKwlzdHJ1Y3QgcmFkZW9uX21vZGVfaW5mbyAqbW9kZV9pbmZvID0gJnJkZXYtPm1vZGVfaW5mbzsKKwlzdHJ1Y3QgX0FUT01fUFBMSUJfTk9OQ0xPQ0tfSU5GTyAqbm9uX2Nsb2NrX2luZm87CisJdW5pb24gcHBsaWJfcG93ZXJfc3RhdGUgKnBvd2VyX3N0YXRlOworCWludCBpLCBqLCBub25fY2xvY2tfYXJyYXlfaW5kZXgsIGNsb2NrX2FycmF5X2luZGV4OworCWludCBzdGF0ZV9pbmRleCA9IDAsIG1vZGVfaW5kZXggPSAwOworCXVuaW9uIHBwbGliX2Nsb2NrX2luZm8gKmNsb2NrX2luZm87CisJc3RydWN0IFN0YXRlQXJyYXkgKnN0YXRlX2FycmF5OworCXN0cnVjdCBDbG9ja0luZm9BcnJheSAqY2xvY2tfaW5mb19hcnJheTsKKwlzdHJ1Y3QgTm9uQ2xvY2tJbmZvQXJyYXkgKm5vbl9jbG9ja19pbmZvX2FycmF5OworCWJvb2wgdmFsaWQ7CisJdW5pb24gcG93ZXJfaW5mbyAqcG93ZXJfaW5mbzsKKwlpbnQgaW5kZXggPSBHZXRJbmRleEludG9NYXN0ZXJUYWJsZShEQVRBLCBQb3dlclBsYXlJbmZvKTsKKyAgICAgICAgdTE2IGRhdGFfb2Zmc2V0OworCXU4IGZyZXYsIGNyZXY7CisKKwlpZiAoIWF0b21fcGFyc2VfZGF0YV9oZWFkZXIobW9kZV9pbmZvLT5hdG9tX2NvbnRleHQsIGluZGV4LCBOVUxMLAorCQkJCSAgICZmcmV2LCAmY3JldiwgJmRhdGFfb2Zmc2V0KSkKKwkJcmV0dXJuIHN0YXRlX2luZGV4OworCXBvd2VyX2luZm8gPSAodW5pb24gcG93ZXJfaW5mbyAqKShtb2RlX2luZm8tPmF0b21fY29udGV4dC0+YmlvcyArIGRhdGFfb2Zmc2V0KTsKKworCXJhZGVvbl9hdG9tYmlvc19hZGRfcHBsaWJfdGhlcm1hbF9jb250cm9sbGVyKHJkZXYsICZwb3dlcl9pbmZvLT5wcGxpYi5zVGhlcm1hbENvbnRyb2xsZXIpOworCXN0YXRlX2FycmF5ID0gKHN0cnVjdCBTdGF0ZUFycmF5ICopCisJCShtb2RlX2luZm8tPmF0b21fY29udGV4dC0+YmlvcyArIGRhdGFfb2Zmc2V0ICsKKwkJIHBvd2VyX2luZm8tPnBwbGliLnVzU3RhdGVBcnJheU9mZnNldCk7CisJY2xvY2tfaW5mb19hcnJheSA9IChzdHJ1Y3QgQ2xvY2tJbmZvQXJyYXkgKikKKwkJKG1vZGVfaW5mby0+YXRvbV9jb250ZXh0LT5iaW9zICsgZGF0YV9vZmZzZXQgKworCQkgcG93ZXJfaW5mby0+cHBsaWIudXNDbG9ja0luZm9BcnJheU9mZnNldCk7CisJbm9uX2Nsb2NrX2luZm9fYXJyYXkgPSAoc3RydWN0IE5vbkNsb2NrSW5mb0FycmF5ICopCisJCShtb2RlX2luZm8tPmF0b21fY29udGV4dC0+YmlvcyArIGRhdGFfb2Zmc2V0ICsKKwkJIHBvd2VyX2luZm8tPnBwbGliLnVzTm9uQ2xvY2tJbmZvQXJyYXlPZmZzZXQpOworCWZvciAoaSA9IDA7IGkgPCBzdGF0ZV9hcnJheS0+dWNOdW1FbnRyaWVzOyBpKyspIHsKKwkJbW9kZV9pbmRleCA9IDA7CisJCXBvd2VyX3N0YXRlID0gKHVuaW9uIHBwbGliX3Bvd2VyX3N0YXRlICopJnN0YXRlX2FycmF5LT5zdGF0ZXNbaV07CisJCS8qIFhYWCB0aGlzIG1pZ2h0IGJlIGFuIGluYWd1YSBidWcuLi4gKi8KKwkJbm9uX2Nsb2NrX2FycmF5X2luZGV4ID0gaTsgLyogcG93ZXJfc3RhdGUtPnYyLm5vbkNsb2NrSW5mb0luZGV4ICovCisJCW5vbl9jbG9ja19pbmZvID0gKHN0cnVjdCBfQVRPTV9QUExJQl9OT05DTE9DS19JTkZPICopCisJCQkmbm9uX2Nsb2NrX2luZm9fYXJyYXktPm5vbkNsb2NrSW5mb1tub25fY2xvY2tfYXJyYXlfaW5kZXhdOworCQlmb3IgKGogPSAwOyBqIDwgcG93ZXJfc3RhdGUtPnYyLnVjTnVtRFBNTGV2ZWxzOyBqKyspIHsKKwkJCWNsb2NrX2FycmF5X2luZGV4ID0gcG93ZXJfc3RhdGUtPnYyLmNsb2NrSW5mb0luZGV4W2pdOworCQkJLyogWFhYIHRoaXMgbWlnaHQgYmUgYW4gaW5hZ3VhIGJ1Zy4uLiAqLworCQkJaWYgKGNsb2NrX2FycmF5X2luZGV4ID49IGNsb2NrX2luZm9fYXJyYXktPnVjTnVtRW50cmllcykKKwkJCQljb250aW51ZTsKKwkJCWNsb2NrX2luZm8gPSAodW5pb24gcHBsaWJfY2xvY2tfaW5mbyAqKQorCQkJCSZjbG9ja19pbmZvX2FycmF5LT5jbG9ja0luZm9bY2xvY2tfYXJyYXlfaW5kZXhdOworCQkJdmFsaWQgPSByYWRlb25fYXRvbWJpb3NfcGFyc2VfcHBsaWJfY2xvY2tfaW5mbyhyZGV2LAorCQkJCQkJCQkgICAgICAgc3RhdGVfaW5kZXgsIG1vZGVfaW5kZXgsCisJCQkJCQkJCSAgICAgICBjbG9ja19pbmZvKTsKKwkJCWlmICh2YWxpZCkKKwkJCQltb2RlX2luZGV4Kys7CisJCX0KKwkJcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLm51bV9jbG9ja19tb2RlcyA9IG1vZGVfaW5kZXg7CisJCWlmIChtb2RlX2luZGV4KSB7CisJCQlyYWRlb25fYXRvbWJpb3NfcGFyc2VfcHBsaWJfbm9uX2Nsb2NrX2luZm8ocmRldiwgc3RhdGVfaW5kZXgsIG1vZGVfaW5kZXgsCisJCQkJCQkJCSAgIG5vbl9jbG9ja19pbmZvKTsKKwkJCXN0YXRlX2luZGV4Kys7CisJCX0KKwl9CisJLyogaWYgbXVsdGlwbGUgY2xvY2sgbW9kZXMsIG1hcmsgdGhlIGxvd2VzdCBhcyBubyBkaXNwbGF5ICovCisJZm9yIChpID0gMDsgaSA8IHN0YXRlX2luZGV4OyBpKyspIHsKKwkJaWYgKHJkZXYtPnBtLnBvd2VyX3N0YXRlW2ldLm51bV9jbG9ja19tb2RlcyA+IDEpCisJCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtpXS5jbG9ja19pbmZvWzBdLmZsYWdzIHw9CisJCQkJUkFERU9OX1BNX01PREVfTk9fRElTUExBWTsKKwl9CisJLyogZmlyc3QgbW9kZSBpcyB1c3VhbGx5IGRlZmF1bHQgKi8KKwlpZiAocmRldi0+cG0uZGVmYXVsdF9wb3dlcl9zdGF0ZV9pbmRleCA9PSAtMSkgeworCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVswXS50eXBlID0KKwkJCVBPV0VSX1NUQVRFX1RZUEVfREVGQVVMVDsKKwkJcmRldi0+cG0uZGVmYXVsdF9wb3dlcl9zdGF0ZV9pbmRleCA9IDA7CisJCXJkZXYtPnBtLnBvd2VyX3N0YXRlWzBdLmRlZmF1bHRfY2xvY2tfbW9kZSA9CisJCQkmcmRldi0+cG0ucG93ZXJfc3RhdGVbMF0uY2xvY2tfaW5mb1swXTsKKwl9CisJcmV0dXJuIHN0YXRlX2luZGV4OworfQorCiB2b2lkIHJhZGVvbl9hdG9tYmlvc19nZXRfcG93ZXJfbW9kZXMoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCiB7CiAJc3RydWN0IHJhZGVvbl9tb2RlX2luZm8gKm1vZGVfaW5mbyA9ICZyZGV2LT5tb2RlX2luZm87CiAJaW50IGluZGV4ID0gR2V0SW5kZXhJbnRvTWFzdGVyVGFibGUoREFUQSwgUG93ZXJQbGF5SW5mbyk7CiAJdTE2IGRhdGFfb2Zmc2V0OwogCXU4IGZyZXYsIGNyZXY7Ci0JdTMyIG1pc2MsIG1pc2MyID0gMCwgc2NsaywgbWNsazsKLQl1bmlvbiBwb3dlcl9pbmZvICpwb3dlcl9pbmZvOwotCXN0cnVjdCBfQVRPTV9QUExJQl9OT05DTE9DS19JTkZPICpub25fY2xvY2tfaW5mbzsKLQlzdHJ1Y3QgX0FUT01fUFBMSUJfU1RBVEUgKnBvd2VyX3N0YXRlOwotCWludCBudW1fbW9kZXMgPSAwLCBpLCBqOwotCWludCBzdGF0ZV9pbmRleCA9IDAsIG1vZGVfaW5kZXggPSAwOwotCXN0cnVjdCByYWRlb25faTJjX2J1c19yZWMgaTJjX2J1czsKKwlpbnQgc3RhdGVfaW5kZXggPSAwOwogCiAJcmRldi0+cG0uZGVmYXVsdF9wb3dlcl9zdGF0ZV9pbmRleCA9IC0xOwogCiAJaWYgKGF0b21fcGFyc2VfZGF0YV9oZWFkZXIobW9kZV9pbmZvLT5hdG9tX2NvbnRleHQsIGluZGV4LCBOVUxMLAogCQkJCSAgICZmcmV2LCAmY3JldiwgJmRhdGFfb2Zmc2V0KSkgewotCQlwb3dlcl9pbmZvID0gKHVuaW9uIHBvd2VyX2luZm8gKikobW9kZV9pbmZvLT5hdG9tX2NvbnRleHQtPmJpb3MgKyBkYXRhX29mZnNldCk7Ci0JCWlmIChmcmV2IDwgNCkgewotCQkJLyogYWRkIHRoZSBpMmMgYnVzIGZvciB0aGVybWFsL2ZhbiBjaGlwICovCi0JCQlpZiAocG93ZXJfaW5mby0+aW5mby51Y092ZXJkcml2ZVRoZXJtYWxDb250cm9sbGVyID4gMCkgewotCQkJCURSTV9JTkZPKCJQb3NzaWJsZSAlcyB0aGVybWFsIGNvbnRyb2xsZXIgYXQgMHglMDJ4XG4iLAotCQkJCQkgdGhlcm1hbF9jb250cm9sbGVyX25hbWVzW3Bvd2VyX2luZm8tPmluZm8udWNPdmVyZHJpdmVUaGVybWFsQ29udHJvbGxlcl0sCi0JCQkJCSBwb3dlcl9pbmZvLT5pbmZvLnVjT3ZlcmRyaXZlQ29udHJvbGxlckFkZHJlc3MgPj4gMSk7Ci0JCQkJaTJjX2J1cyA9IHJhZGVvbl9sb29rdXBfaTJjX2dwaW8ocmRldiwgcG93ZXJfaW5mby0+aW5mby51Y092ZXJkcml2ZUkyY0xpbmUpOwotCQkJCXJkZXYtPnBtLmkyY19idXMgPSByYWRlb25faTJjX2xvb2t1cChyZGV2LCAmaTJjX2J1cyk7Ci0JCQkJaWYgKHJkZXYtPnBtLmkyY19idXMpIHsKLQkJCQkJc3RydWN0IGkyY19ib2FyZF9pbmZvIGluZm8gPSB7IH07Ci0JCQkJCWNvbnN0IGNoYXIgKm5hbWUgPSB0aGVybWFsX2NvbnRyb2xsZXJfbmFtZXNbcG93ZXJfaW5mby0+aW5mby4KLQkJCQkJCQkJCQkgICAgdWNPdmVyZHJpdmVUaGVybWFsQ29udHJvbGxlcl07Ci0JCQkJCWluZm8uYWRkciA9IHBvd2VyX2luZm8tPmluZm8udWNPdmVyZHJpdmVDb250cm9sbGVyQWRkcmVzcyA+PiAxOwotCQkJCQlzdHJsY3B5KGluZm8udHlwZSwgbmFtZSwgc2l6ZW9mKGluZm8udHlwZSkpOwotCQkJCQlpMmNfbmV3X2RldmljZSgmcmRldi0+cG0uaTJjX2J1cy0+YWRhcHRlciwgJmluZm8pOwotCQkJCX0KLQkJCX0KLQkJCW51bV9tb2RlcyA9IHBvd2VyX2luZm8tPmluZm8udWNOdW1PZlBvd2VyTW9kZUVudHJpZXM7Ci0JCQlpZiAobnVtX21vZGVzID4gQVRPTV9NQVhfTlVNQkVST0ZfUE9XRVJfQkxPQ0spCi0JCQkJbnVtX21vZGVzID0gQVRPTV9NQVhfTlVNQkVST0ZfUE9XRVJfQkxPQ0s7Ci0JCQkvKiBsYXN0IG1vZGUgaXMgdXN1YWxseSBkZWZhdWx0LCBhcnJheSBpcyBsb3cgdG8gaGlnaCAqLwotCQkJZm9yIChpID0gMDsgaSA8IG51bV9tb2RlczsgaSsrKSB7Ci0JCQkJcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLmNsb2NrX2luZm9bMF0udm9sdGFnZS50eXBlID0gVk9MVEFHRV9OT05FOwotCQkJCXN3aXRjaCAoZnJldikgewotCQkJCWNhc2UgMToKLQkJCQkJcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLm51bV9jbG9ja19tb2RlcyA9IDE7Ci0JCQkJCXJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS5jbG9ja19pbmZvWzBdLm1jbGsgPQotCQkJCQkJbGUxNl90b19jcHUocG93ZXJfaW5mby0+aW5mby5hc1Bvd2VyUGxheUluZm9baV0udXNNZW1vcnlDbG9jayk7Ci0JCQkJCXJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS5jbG9ja19pbmZvWzBdLnNjbGsgPQotCQkJCQkJbGUxNl90b19jcHUocG93ZXJfaW5mby0+aW5mby5hc1Bvd2VyUGxheUluZm9baV0udXNFbmdpbmVDbG9jayk7Ci0JCQkJCS8qIHNraXAgaW52YWxpZCBtb2RlcyAqLwotCQkJCQlpZiAoKHJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS5jbG9ja19pbmZvWzBdLm1jbGsgPT0gMCkgfHwKLQkJCQkJICAgIChyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0uY2xvY2tfaW5mb1swXS5zY2xrID09IDApKQotCQkJCQkJY29udGludWU7Ci0JCQkJCXJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS5wY2llX2xhbmVzID0KLQkJCQkJCXBvd2VyX2luZm8tPmluZm8uYXNQb3dlclBsYXlJbmZvW2ldLnVjTnVtUGNpRUxhbmVzOwotCQkJCQltaXNjID0gbGUzMl90b19jcHUocG93ZXJfaW5mby0+aW5mby5hc1Bvd2VyUGxheUluZm9baV0udWxNaXNjSW5mbyk7Ci0JCQkJCWlmICgobWlzYyAmIEFUT01fUE1fTUlTQ0lORk9fVk9MVEFHRV9EUk9QX1NVUFBPUlQpIHx8Ci0JCQkJCSAgICAobWlzYyAmIEFUT01fUE1fTUlTQ0lORk9fVk9MVEFHRV9EUk9QX0FDVElWRV9ISUdIKSkgewotCQkJCQkJcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLmNsb2NrX2luZm9bMF0udm9sdGFnZS50eXBlID0KLQkJCQkJCQlWT0xUQUdFX0dQSU87Ci0JCQkJCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0uY2xvY2tfaW5mb1swXS52b2x0YWdlLmdwaW8gPQotCQkJCQkJCXJhZGVvbl9sb29rdXBfZ3BpbyhyZGV2LAotCQkJCQkJCXBvd2VyX2luZm8tPmluZm8uYXNQb3dlclBsYXlJbmZvW2ldLnVjVm9sdGFnZURyb3BJbmRleCk7Ci0JCQkJCQlpZiAobWlzYyAmIEFUT01fUE1fTUlTQ0lORk9fVk9MVEFHRV9EUk9QX0FDVElWRV9ISUdIKQotCQkJCQkJCXJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS5jbG9ja19pbmZvWzBdLnZvbHRhZ2UuYWN0aXZlX2hpZ2ggPQotCQkJCQkJCQl0cnVlOwotCQkJCQkJZWxzZQotCQkJCQkJCXJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS5jbG9ja19pbmZvWzBdLnZvbHRhZ2UuYWN0aXZlX2hpZ2ggPQotCQkJCQkJCQlmYWxzZTsKLQkJCQkJfSBlbHNlIGlmIChtaXNjICYgQVRPTV9QTV9NSVNDSU5GT19QUk9HUkFNX1ZPTFRBR0UpIHsKLQkJCQkJCXJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS5jbG9ja19pbmZvWzBdLnZvbHRhZ2UudHlwZSA9Ci0JCQkJCQkJVk9MVEFHRV9WRERDOwotCQkJCQkJcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLmNsb2NrX2luZm9bMF0udm9sdGFnZS52ZGRjX2lkID0KLQkJCQkJCQlwb3dlcl9pbmZvLT5pbmZvLmFzUG93ZXJQbGF5SW5mb1tpXS51Y1ZvbHRhZ2VEcm9wSW5kZXg7Ci0JCQkJCX0KLQkJCQkJcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLmZsYWdzID0gUkFERU9OX1BNX1NUQVRFX1NJTkdMRV9ESVNQTEFZX09OTFk7Ci0JCQkJCXJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS5taXNjID0gbWlzYzsKLQkJCQkJLyogb3JkZXIgbWF0dGVycyEgKi8KLQkJCQkJaWYgKG1pc2MgJiBBVE9NX1BNX01JU0NJTkZPX1BPV0VSX1NBVklOR19NT0RFKQotCQkJCQkJcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLnR5cGUgPQotCQkJCQkJCVBPV0VSX1NUQVRFX1RZUEVfUE9XRVJTQVZFOwotCQkJCQlpZiAobWlzYyAmIEFUT01fUE1fTUlTQ0lORk9fREVGQVVMVF9EQ19TVEFURV9FTlRSWV9UUlVFKQotCQkJCQkJcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLnR5cGUgPQotCQkJCQkJCVBPV0VSX1NUQVRFX1RZUEVfQkFUVEVSWTsKLQkJCQkJaWYgKG1pc2MgJiBBVE9NX1BNX01JU0NJTkZPX0RFRkFVTFRfTE9XX0RDX1NUQVRFX0VOVFJZX1RSVUUpCi0JCQkJCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0udHlwZSA9Ci0JCQkJCQkJUE9XRVJfU1RBVEVfVFlQRV9CQVRURVJZOwotCQkJCQlpZiAobWlzYyAmIEFUT01fUE1fTUlTQ0lORk9fTE9BRF9CQUxBTkNFX0VOKQotCQkJCQkJcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLnR5cGUgPQotCQkJCQkJCVBPV0VSX1NUQVRFX1RZUEVfQkFMQU5DRUQ7Ci0JCQkJCWlmIChtaXNjICYgQVRPTV9QTV9NSVNDSU5GT18zRF9BQ0NFTEVSQVRJT05fRU4pIHsKLQkJCQkJCXJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS50eXBlID0KLQkJCQkJCQlQT1dFUl9TVEFURV9UWVBFX1BFUkZPUk1BTkNFOwotCQkJCQkJcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLmZsYWdzICY9Ci0JCQkJCQkJflJBREVPTl9QTV9TVEFURV9TSU5HTEVfRElTUExBWV9PTkxZOwotCQkJCQl9Ci0JCQkJCWlmIChtaXNjICYgQVRPTV9QTV9NSVNDSU5GT19EUklWRVJfREVGQVVMVF9NT0RFKSB7Ci0JCQkJCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0udHlwZSA9Ci0JCQkJCQkJUE9XRVJfU1RBVEVfVFlQRV9ERUZBVUxUOwotCQkJCQkJcmRldi0+cG0uZGVmYXVsdF9wb3dlcl9zdGF0ZV9pbmRleCA9IHN0YXRlX2luZGV4OwotCQkJCQkJcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLmRlZmF1bHRfY2xvY2tfbW9kZSA9Ci0JCQkJCQkJJnJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS5jbG9ja19pbmZvWzBdOwotCQkJCQkJcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLmZsYWdzICY9Ci0JCQkJCQkJflJBREVPTl9QTV9TVEFURV9TSU5HTEVfRElTUExBWV9PTkxZOwotCQkJCQl9IGVsc2UgaWYgKHN0YXRlX2luZGV4ID09IDApIHsKLQkJCQkJCXJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS5jbG9ja19pbmZvWzBdLmZsYWdzIHw9Ci0JCQkJCQkJUkFERU9OX1BNX01PREVfTk9fRElTUExBWTsKLQkJCQkJfQotCQkJCQlzdGF0ZV9pbmRleCsrOwotCQkJCQlicmVhazsKLQkJCQljYXNlIDI6Ci0JCQkJCXJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS5udW1fY2xvY2tfbW9kZXMgPSAxOwotCQkJCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0uY2xvY2tfaW5mb1swXS5tY2xrID0KLQkJCQkJCWxlMzJfdG9fY3B1KHBvd2VyX2luZm8tPmluZm9fMi5hc1Bvd2VyUGxheUluZm9baV0udWxNZW1vcnlDbG9jayk7Ci0JCQkJCXJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS5jbG9ja19pbmZvWzBdLnNjbGsgPQotCQkJCQkJbGUzMl90b19jcHUocG93ZXJfaW5mby0+aW5mb18yLmFzUG93ZXJQbGF5SW5mb1tpXS51bEVuZ2luZUNsb2NrKTsKLQkJCQkJLyogc2tpcCBpbnZhbGlkIG1vZGVzICovCi0JCQkJCWlmICgocmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLmNsb2NrX2luZm9bMF0ubWNsayA9PSAwKSB8fAotCQkJCQkgICAgKHJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS5jbG9ja19pbmZvWzBdLnNjbGsgPT0gMCkpCi0JCQkJCQljb250aW51ZTsKLQkJCQkJcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLnBjaWVfbGFuZXMgPQotCQkJCQkJcG93ZXJfaW5mby0+aW5mb18yLmFzUG93ZXJQbGF5SW5mb1tpXS51Y051bVBjaUVMYW5lczsKLQkJCQkJbWlzYyA9IGxlMzJfdG9fY3B1KHBvd2VyX2luZm8tPmluZm9fMi5hc1Bvd2VyUGxheUluZm9baV0udWxNaXNjSW5mbyk7Ci0JCQkJCW1pc2MyID0gbGUzMl90b19jcHUocG93ZXJfaW5mby0+aW5mb18yLmFzUG93ZXJQbGF5SW5mb1tpXS51bE1pc2NJbmZvMik7Ci0JCQkJCWlmICgobWlzYyAmIEFUT01fUE1fTUlTQ0lORk9fVk9MVEFHRV9EUk9QX1NVUFBPUlQpIHx8Ci0JCQkJCSAgICAobWlzYyAmIEFUT01fUE1fTUlTQ0lORk9fVk9MVEFHRV9EUk9QX0FDVElWRV9ISUdIKSkgewotCQkJCQkJcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLmNsb2NrX2luZm9bMF0udm9sdGFnZS50eXBlID0KLQkJCQkJCQlWT0xUQUdFX0dQSU87Ci0JCQkJCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0uY2xvY2tfaW5mb1swXS52b2x0YWdlLmdwaW8gPQotCQkJCQkJCXJhZGVvbl9sb29rdXBfZ3BpbyhyZGV2LAotCQkJCQkJCXBvd2VyX2luZm8tPmluZm9fMi5hc1Bvd2VyUGxheUluZm9baV0udWNWb2x0YWdlRHJvcEluZGV4KTsKLQkJCQkJCWlmIChtaXNjICYgQVRPTV9QTV9NSVNDSU5GT19WT0xUQUdFX0RST1BfQUNUSVZFX0hJR0gpCi0JCQkJCQkJcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLmNsb2NrX2luZm9bMF0udm9sdGFnZS5hY3RpdmVfaGlnaCA9Ci0JCQkJCQkJCXRydWU7Ci0JCQkJCQllbHNlCi0JCQkJCQkJcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLmNsb2NrX2luZm9bMF0udm9sdGFnZS5hY3RpdmVfaGlnaCA9Ci0JCQkJCQkJCWZhbHNlOwotCQkJCQl9IGVsc2UgaWYgKG1pc2MgJiBBVE9NX1BNX01JU0NJTkZPX1BST0dSQU1fVk9MVEFHRSkgewotCQkJCQkJcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLmNsb2NrX2luZm9bMF0udm9sdGFnZS50eXBlID0KLQkJCQkJCQlWT0xUQUdFX1ZEREM7Ci0JCQkJCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0uY2xvY2tfaW5mb1swXS52b2x0YWdlLnZkZGNfaWQgPQotCQkJCQkJCXBvd2VyX2luZm8tPmluZm9fMi5hc1Bvd2VyUGxheUluZm9baV0udWNWb2x0YWdlRHJvcEluZGV4OwotCQkJCQl9Ci0JCQkJCXJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS5mbGFncyA9IFJBREVPTl9QTV9TVEFURV9TSU5HTEVfRElTUExBWV9PTkxZOwotCQkJCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0ubWlzYyA9IG1pc2M7Ci0JCQkJCXJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS5taXNjMiA9IG1pc2MyOwotCQkJCQkvKiBvcmRlciBtYXR0ZXJzISAqLwotCQkJCQlpZiAobWlzYyAmIEFUT01fUE1fTUlTQ0lORk9fUE9XRVJfU0FWSU5HX01PREUpCi0JCQkJCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0udHlwZSA9Ci0JCQkJCQkJUE9XRVJfU1RBVEVfVFlQRV9QT1dFUlNBVkU7Ci0JCQkJCWlmIChtaXNjICYgQVRPTV9QTV9NSVNDSU5GT19ERUZBVUxUX0RDX1NUQVRFX0VOVFJZX1RSVUUpCi0JCQkJCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0udHlwZSA9Ci0JCQkJCQkJUE9XRVJfU1RBVEVfVFlQRV9CQVRURVJZOwotCQkJCQlpZiAobWlzYyAmIEFUT01fUE1fTUlTQ0lORk9fREVGQVVMVF9MT1dfRENfU1RBVEVfRU5UUllfVFJVRSkKLQkJCQkJCXJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS50eXBlID0KLQkJCQkJCQlQT1dFUl9TVEFURV9UWVBFX0JBVFRFUlk7Ci0JCQkJCWlmIChtaXNjICYgQVRPTV9QTV9NSVNDSU5GT19MT0FEX0JBTEFOQ0VfRU4pCi0JCQkJCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0udHlwZSA9Ci0JCQkJCQkJUE9XRVJfU1RBVEVfVFlQRV9CQUxBTkNFRDsKLQkJCQkJaWYgKG1pc2MgJiBBVE9NX1BNX01JU0NJTkZPXzNEX0FDQ0VMRVJBVElPTl9FTikgewotCQkJCQkJcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLnR5cGUgPQotCQkJCQkJCVBPV0VSX1NUQVRFX1RZUEVfUEVSRk9STUFOQ0U7Ci0JCQkJCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0uZmxhZ3MgJj0KLQkJCQkJCQl+UkFERU9OX1BNX1NUQVRFX1NJTkdMRV9ESVNQTEFZX09OTFk7Ci0JCQkJCX0KLQkJCQkJaWYgKG1pc2MyICYgQVRPTV9QTV9NSVNDSU5GTzJfU1lTVEVNX0FDX0xJVEVfTU9ERSkKLQkJCQkJCXJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS50eXBlID0KLQkJCQkJCQlQT1dFUl9TVEFURV9UWVBFX0JBTEFOQ0VEOwotCQkJCQlpZiAobWlzYzIgJiBBVE9NX1BNX01JU0NJTkZPMl9NVUxUSV9ESVNQTEFZX1NVUFBPUlQpCi0JCQkJCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0uZmxhZ3MgJj0KLQkJCQkJCQl+UkFERU9OX1BNX1NUQVRFX1NJTkdMRV9ESVNQTEFZX09OTFk7Ci0JCQkJCWlmIChtaXNjICYgQVRPTV9QTV9NSVNDSU5GT19EUklWRVJfREVGQVVMVF9NT0RFKSB7Ci0JCQkJCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0udHlwZSA9Ci0JCQkJCQkJUE9XRVJfU1RBVEVfVFlQRV9ERUZBVUxUOwotCQkJCQkJcmRldi0+cG0uZGVmYXVsdF9wb3dlcl9zdGF0ZV9pbmRleCA9IHN0YXRlX2luZGV4OwotCQkJCQkJcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLmRlZmF1bHRfY2xvY2tfbW9kZSA9Ci0JCQkJCQkJJnJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS5jbG9ja19pbmZvWzBdOwotCQkJCQkJcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLmZsYWdzICY9Ci0JCQkJCQkJflJBREVPTl9QTV9TVEFURV9TSU5HTEVfRElTUExBWV9PTkxZOwotCQkJCQl9IGVsc2UgaWYgKHN0YXRlX2luZGV4ID09IDApIHsKLQkJCQkJCXJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS5jbG9ja19pbmZvWzBdLmZsYWdzIHw9Ci0JCQkJCQkJUkFERU9OX1BNX01PREVfTk9fRElTUExBWTsKLQkJCQkJfQotCQkJCQlzdGF0ZV9pbmRleCsrOwotCQkJCQlicmVhazsKLQkJCQljYXNlIDM6Ci0JCQkJCXJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS5udW1fY2xvY2tfbW9kZXMgPSAxOwotCQkJCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0uY2xvY2tfaW5mb1swXS5tY2xrID0KLQkJCQkJCWxlMzJfdG9fY3B1KHBvd2VyX2luZm8tPmluZm9fMy5hc1Bvd2VyUGxheUluZm9baV0udWxNZW1vcnlDbG9jayk7Ci0JCQkJCXJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS5jbG9ja19pbmZvWzBdLnNjbGsgPQotCQkJCQkJbGUzMl90b19jcHUocG93ZXJfaW5mby0+aW5mb18zLmFzUG93ZXJQbGF5SW5mb1tpXS51bEVuZ2luZUNsb2NrKTsKLQkJCQkJLyogc2tpcCBpbnZhbGlkIG1vZGVzICovCi0JCQkJCWlmICgocmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLmNsb2NrX2luZm9bMF0ubWNsayA9PSAwKSB8fAotCQkJCQkgICAgKHJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS5jbG9ja19pbmZvWzBdLnNjbGsgPT0gMCkpCi0JCQkJCQljb250aW51ZTsKLQkJCQkJcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLnBjaWVfbGFuZXMgPQotCQkJCQkJcG93ZXJfaW5mby0+aW5mb18zLmFzUG93ZXJQbGF5SW5mb1tpXS51Y051bVBjaUVMYW5lczsKLQkJCQkJbWlzYyA9IGxlMzJfdG9fY3B1KHBvd2VyX2luZm8tPmluZm9fMy5hc1Bvd2VyUGxheUluZm9baV0udWxNaXNjSW5mbyk7Ci0JCQkJCW1pc2MyID0gbGUzMl90b19jcHUocG93ZXJfaW5mby0+aW5mb18zLmFzUG93ZXJQbGF5SW5mb1tpXS51bE1pc2NJbmZvMik7Ci0JCQkJCWlmICgobWlzYyAmIEFUT01fUE1fTUlTQ0lORk9fVk9MVEFHRV9EUk9QX1NVUFBPUlQpIHx8Ci0JCQkJCSAgICAobWlzYyAmIEFUT01fUE1fTUlTQ0lORk9fVk9MVEFHRV9EUk9QX0FDVElWRV9ISUdIKSkgewotCQkJCQkJcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLmNsb2NrX2luZm9bMF0udm9sdGFnZS50eXBlID0KLQkJCQkJCQlWT0xUQUdFX0dQSU87Ci0JCQkJCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0uY2xvY2tfaW5mb1swXS52b2x0YWdlLmdwaW8gPQotCQkJCQkJCXJhZGVvbl9sb29rdXBfZ3BpbyhyZGV2LAotCQkJCQkJCXBvd2VyX2luZm8tPmluZm9fMy5hc1Bvd2VyUGxheUluZm9baV0udWNWb2x0YWdlRHJvcEluZGV4KTsKLQkJCQkJCWlmIChtaXNjICYgQVRPTV9QTV9NSVNDSU5GT19WT0xUQUdFX0RST1BfQUNUSVZFX0hJR0gpCi0JCQkJCQkJcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLmNsb2NrX2luZm9bMF0udm9sdGFnZS5hY3RpdmVfaGlnaCA9Ci0JCQkJCQkJCXRydWU7Ci0JCQkJCQllbHNlCi0JCQkJCQkJcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLmNsb2NrX2luZm9bMF0udm9sdGFnZS5hY3RpdmVfaGlnaCA9Ci0JCQkJCQkJCWZhbHNlOwotCQkJCQl9IGVsc2UgaWYgKG1pc2MgJiBBVE9NX1BNX01JU0NJTkZPX1BST0dSQU1fVk9MVEFHRSkgewotCQkJCQkJcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLmNsb2NrX2luZm9bMF0udm9sdGFnZS50eXBlID0KLQkJCQkJCQlWT0xUQUdFX1ZEREM7Ci0JCQkJCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0uY2xvY2tfaW5mb1swXS52b2x0YWdlLnZkZGNfaWQgPQotCQkJCQkJCXBvd2VyX2luZm8tPmluZm9fMy5hc1Bvd2VyUGxheUluZm9baV0udWNWb2x0YWdlRHJvcEluZGV4OwotCQkJCQkJaWYgKG1pc2MyICYgQVRPTV9QTV9NSVNDSU5GTzJfVkREQ0lfRFlOQU1JQ19WT0xUQUdFX0VOKSB7Ci0JCQkJCQkJcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLmNsb2NrX2luZm9bMF0udm9sdGFnZS52ZGRjaV9lbmFibGVkID0KLQkJCQkJCQkJdHJ1ZTsKLQkJCQkJCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0uY2xvY2tfaW5mb1swXS52b2x0YWdlLnZkZGNpX2lkID0KLQkJCQkJCQlwb3dlcl9pbmZvLT5pbmZvXzMuYXNQb3dlclBsYXlJbmZvW2ldLnVjVkREQ0lfVm9sdGFnZURyb3BJbmRleDsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0uZmxhZ3MgPSBSQURFT05fUE1fU1RBVEVfU0lOR0xFX0RJU1BMQVlfT05MWTsKLQkJCQkJcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLm1pc2MgPSBtaXNjOwotCQkJCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0ubWlzYzIgPSBtaXNjMjsKLQkJCQkJLyogb3JkZXIgbWF0dGVycyEgKi8KLQkJCQkJaWYgKG1pc2MgJiBBVE9NX1BNX01JU0NJTkZPX1BPV0VSX1NBVklOR19NT0RFKQotCQkJCQkJcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLnR5cGUgPQotCQkJCQkJCVBPV0VSX1NUQVRFX1RZUEVfUE9XRVJTQVZFOwotCQkJCQlpZiAobWlzYyAmIEFUT01fUE1fTUlTQ0lORk9fREVGQVVMVF9EQ19TVEFURV9FTlRSWV9UUlVFKQotCQkJCQkJcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLnR5cGUgPQotCQkJCQkJCVBPV0VSX1NUQVRFX1RZUEVfQkFUVEVSWTsKLQkJCQkJaWYgKG1pc2MgJiBBVE9NX1BNX01JU0NJTkZPX0RFRkFVTFRfTE9XX0RDX1NUQVRFX0VOVFJZX1RSVUUpCi0JCQkJCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0udHlwZSA9Ci0JCQkJCQkJUE9XRVJfU1RBVEVfVFlQRV9CQVRURVJZOwotCQkJCQlpZiAobWlzYyAmIEFUT01fUE1fTUlTQ0lORk9fTE9BRF9CQUxBTkNFX0VOKQotCQkJCQkJcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLnR5cGUgPQotCQkJCQkJCVBPV0VSX1NUQVRFX1RZUEVfQkFMQU5DRUQ7Ci0JCQkJCWlmIChtaXNjICYgQVRPTV9QTV9NSVNDSU5GT18zRF9BQ0NFTEVSQVRJT05fRU4pIHsKLQkJCQkJCXJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS50eXBlID0KLQkJCQkJCQlQT1dFUl9TVEFURV9UWVBFX1BFUkZPUk1BTkNFOwotCQkJCQkJcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLmZsYWdzICY9Ci0JCQkJCQkJflJBREVPTl9QTV9TVEFURV9TSU5HTEVfRElTUExBWV9PTkxZOwotCQkJCQl9Ci0JCQkJCWlmIChtaXNjMiAmIEFUT01fUE1fTUlTQ0lORk8yX1NZU1RFTV9BQ19MSVRFX01PREUpCi0JCQkJCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0udHlwZSA9Ci0JCQkJCQkJUE9XRVJfU1RBVEVfVFlQRV9CQUxBTkNFRDsKLQkJCQkJaWYgKG1pc2MgJiBBVE9NX1BNX01JU0NJTkZPX0RSSVZFUl9ERUZBVUxUX01PREUpIHsKLQkJCQkJCXJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS50eXBlID0KLQkJCQkJCQlQT1dFUl9TVEFURV9UWVBFX0RFRkFVTFQ7Ci0JCQkJCQlyZGV2LT5wbS5kZWZhdWx0X3Bvd2VyX3N0YXRlX2luZGV4ID0gc3RhdGVfaW5kZXg7Ci0JCQkJCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0uZGVmYXVsdF9jbG9ja19tb2RlID0KLQkJCQkJCQkmcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLmNsb2NrX2luZm9bMF07Ci0JCQkJCX0gZWxzZSBpZiAoc3RhdGVfaW5kZXggPT0gMCkgewotCQkJCQkJcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLmNsb2NrX2luZm9bMF0uZmxhZ3MgfD0KLQkJCQkJCQlSQURFT05fUE1fTU9ERV9OT19ESVNQTEFZOwotCQkJCQl9Ci0JCQkJCXN0YXRlX2luZGV4Kys7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCS8qIGxhc3QgbW9kZSBpcyB1c3VhbGx5IGRlZmF1bHQgKi8KLQkJCWlmIChyZGV2LT5wbS5kZWZhdWx0X3Bvd2VyX3N0YXRlX2luZGV4ID09IC0xKSB7Ci0JCQkJcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXggLSAxXS50eXBlID0KLQkJCQkJUE9XRVJfU1RBVEVfVFlQRV9ERUZBVUxUOwotCQkJCXJkZXYtPnBtLmRlZmF1bHRfcG93ZXJfc3RhdGVfaW5kZXggPSBzdGF0ZV9pbmRleCAtIDE7Ci0JCQkJcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXggLSAxXS5kZWZhdWx0X2Nsb2NrX21vZGUgPQotCQkJCQkmcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXggLSAxXS5jbG9ja19pbmZvWzBdOwotCQkJCXJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS5mbGFncyAmPQotCQkJCQl+UkFERU9OX1BNX1NUQVRFX1NJTkdMRV9ESVNQTEFZX09OTFk7Ci0JCQkJcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLm1pc2MgPSAwOwotCQkJCXJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS5taXNjMiA9IDA7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlpbnQgZndfaW5kZXggPSBHZXRJbmRleEludG9NYXN0ZXJUYWJsZShEQVRBLCBGaXJtd2FyZUluZm8pOwotCQkJdWludDhfdCBmd19mcmV2LCBmd19jcmV2OwotCQkJdWludDE2X3QgZndfZGF0YV9vZmZzZXQsIHZkZGMgPSAwOwotCQkJdW5pb24gZmlybXdhcmVfaW5mbyAqZmlybXdhcmVfaW5mbzsKLQkJCUFUT01fUFBMSUJfVEhFUk1BTENPTlRST0xMRVIgKmNvbnRyb2xsZXIgPSAmcG93ZXJfaW5mby0+aW5mb180LnNUaGVybWFsQ29udHJvbGxlcjsKLQotCQkJaWYgKGF0b21fcGFyc2VfZGF0YV9oZWFkZXIobW9kZV9pbmZvLT5hdG9tX2NvbnRleHQsIGZ3X2luZGV4LCBOVUxMLAotCQkJCQkJICAgJmZ3X2ZyZXYsICZmd19jcmV2LCAmZndfZGF0YV9vZmZzZXQpKSB7Ci0JCQkJZmlybXdhcmVfaW5mbyA9Ci0JCQkJCSh1bmlvbiBmaXJtd2FyZV9pbmZvICopKG1vZGVfaW5mby0+YXRvbV9jb250ZXh0LT5iaW9zICsKLQkJCQkJCQkJZndfZGF0YV9vZmZzZXQpOwotCQkJCXZkZGMgPSBmaXJtd2FyZV9pbmZvLT5pbmZvXzE0LnVzQm9vdFVwVkREQ1ZvbHRhZ2U7Ci0JCQl9Ci0KLQkJCS8qIGFkZCB0aGUgaTJjIGJ1cyBmb3IgdGhlcm1hbC9mYW4gY2hpcCAqLwotCQkJaWYgKGNvbnRyb2xsZXItPnVjVHlwZSA+IDApIHsKLQkJCQlpZiAoY29udHJvbGxlci0+dWNUeXBlID09IEFUT01fUFBfVEhFUk1BTENPTlRST0xMRVJfUlY2eHgpIHsKLQkJCQkJRFJNX0lORk8oIkludGVybmFsIHRoZXJtYWwgY29udHJvbGxlciAlcyBmYW4gY29udHJvbFxuIiwKLQkJCQkJCSAoY29udHJvbGxlci0+dWNGYW5QYXJhbWV0ZXJzICYKLQkJCQkJCSAgQVRPTV9QUF9GQU5QQVJBTUVURVJTX05PRkFOKSA/ICJ3aXRob3V0IiA6ICJ3aXRoIik7Ci0JCQkJCXJkZXYtPnBtLmludF90aGVybWFsX3R5cGUgPSBUSEVSTUFMX1RZUEVfUlY2WFg7Ci0JCQkJfSBlbHNlIGlmIChjb250cm9sbGVyLT51Y1R5cGUgPT0gQVRPTV9QUF9USEVSTUFMQ09OVFJPTExFUl9SVjc3MCkgewotCQkJCQlEUk1fSU5GTygiSW50ZXJuYWwgdGhlcm1hbCBjb250cm9sbGVyICVzIGZhbiBjb250cm9sXG4iLAotCQkJCQkJIChjb250cm9sbGVyLT51Y0ZhblBhcmFtZXRlcnMgJgotCQkJCQkJICBBVE9NX1BQX0ZBTlBBUkFNRVRFUlNfTk9GQU4pID8gIndpdGhvdXQiIDogIndpdGgiKTsKLQkJCQkJcmRldi0+cG0uaW50X3RoZXJtYWxfdHlwZSA9IFRIRVJNQUxfVFlQRV9SVjc3MDsKLQkJCQl9IGVsc2UgaWYgKGNvbnRyb2xsZXItPnVjVHlwZSA9PSBBVE9NX1BQX1RIRVJNQUxDT05UUk9MTEVSX0VWRVJHUkVFTikgewotCQkJCQlEUk1fSU5GTygiSW50ZXJuYWwgdGhlcm1hbCBjb250cm9sbGVyICVzIGZhbiBjb250cm9sXG4iLAotCQkJCQkJIChjb250cm9sbGVyLT51Y0ZhblBhcmFtZXRlcnMgJgotCQkJCQkJICBBVE9NX1BQX0ZBTlBBUkFNRVRFUlNfTk9GQU4pID8gIndpdGhvdXQiIDogIndpdGgiKTsKLQkJCQkJcmRldi0+cG0uaW50X3RoZXJtYWxfdHlwZSA9IFRIRVJNQUxfVFlQRV9FVkVSR1JFRU47Ci0JCQkJfSBlbHNlIGlmICgoY29udHJvbGxlci0+dWNUeXBlID09Ci0JCQkJCSAgICBBVE9NX1BQX1RIRVJNQUxDT05UUk9MTEVSX0VYVEVSTkFMX0dQSU8pIHx8Ci0JCQkJCSAgIChjb250cm9sbGVyLT51Y1R5cGUgPT0KLQkJCQkJICAgIEFUT01fUFBfVEhFUk1BTENPTlRST0xMRVJfQURUNzQ3M19XSVRIX0lOVEVSTkFMKSkgewotCQkJCQlEUk1fSU5GTygiU3BlY2lhbCB0aGVybWFsIGNvbnRyb2xsZXIgY29uZmlnXG4iKTsKLQkJCQl9IGVsc2UgewotCQkJCQlEUk1fSU5GTygiUG9zc2libGUgJXMgdGhlcm1hbCBjb250cm9sbGVyIGF0IDB4JTAyeCAlcyBmYW4gY29udHJvbFxuIiwKLQkJCQkJCSBwcF9saWJfdGhlcm1hbF9jb250cm9sbGVyX25hbWVzW2NvbnRyb2xsZXItPnVjVHlwZV0sCi0JCQkJCQkgY29udHJvbGxlci0+dWNJMmNBZGRyZXNzID4+IDEsCi0JCQkJCQkgKGNvbnRyb2xsZXItPnVjRmFuUGFyYW1ldGVycyAmCi0JCQkJCQkgIEFUT01fUFBfRkFOUEFSQU1FVEVSU19OT0ZBTikgPyAid2l0aG91dCIgOiAid2l0aCIpOwotCQkJCQlpMmNfYnVzID0gcmFkZW9uX2xvb2t1cF9pMmNfZ3BpbyhyZGV2LCBjb250cm9sbGVyLT51Y0kyY0xpbmUpOwotCQkJCQlyZGV2LT5wbS5pMmNfYnVzID0gcmFkZW9uX2kyY19sb29rdXAocmRldiwgJmkyY19idXMpOwotCQkJCQlpZiAocmRldi0+cG0uaTJjX2J1cykgewotCQkJCQkJc3RydWN0IGkyY19ib2FyZF9pbmZvIGluZm8gPSB7IH07Ci0JCQkJCQljb25zdCBjaGFyICpuYW1lID0gcHBfbGliX3RoZXJtYWxfY29udHJvbGxlcl9uYW1lc1tjb250cm9sbGVyLT51Y1R5cGVdOwotCQkJCQkJaW5mby5hZGRyID0gY29udHJvbGxlci0+dWNJMmNBZGRyZXNzID4+IDE7Ci0JCQkJCQlzdHJsY3B5KGluZm8udHlwZSwgbmFtZSwgc2l6ZW9mKGluZm8udHlwZSkpOwotCQkJCQkJaTJjX25ld19kZXZpY2UoJnJkZXYtPnBtLmkyY19idXMtPmFkYXB0ZXIsICZpbmZvKTsKLQkJCQkJfQotCi0JCQkJfQotCQkJfQotCQkJLyogZmlyc3QgbW9kZSBpcyB1c3VhbGx5IGRlZmF1bHQsIGZvbGxvd2VkIGJ5IGxvdyB0byBoaWdoICovCi0JCQlmb3IgKGkgPSAwOyBpIDwgcG93ZXJfaW5mby0+aW5mb180LnVjTnVtU3RhdGVzOyBpKyspIHsKLQkJCQltb2RlX2luZGV4ID0gMDsKLQkJCQlwb3dlcl9zdGF0ZSA9IChzdHJ1Y3QgX0FUT01fUFBMSUJfU1RBVEUgKikKLQkJCQkJKG1vZGVfaW5mby0+YXRvbV9jb250ZXh0LT5iaW9zICsKLQkJCQkJIGRhdGFfb2Zmc2V0ICsKLQkJCQkJIGxlMTZfdG9fY3B1KHBvd2VyX2luZm8tPmluZm9fNC51c1N0YXRlQXJyYXlPZmZzZXQpICsKLQkJCQkJIGkgKiBwb3dlcl9pbmZvLT5pbmZvXzQudWNTdGF0ZUVudHJ5U2l6ZSk7Ci0JCQkJbm9uX2Nsb2NrX2luZm8gPSAoc3RydWN0IF9BVE9NX1BQTElCX05PTkNMT0NLX0lORk8gKikKLQkJCQkJKG1vZGVfaW5mby0+YXRvbV9jb250ZXh0LT5iaW9zICsKLQkJCQkJIGRhdGFfb2Zmc2V0ICsKLQkJCQkJIGxlMTZfdG9fY3B1KHBvd2VyX2luZm8tPmluZm9fNC51c05vbkNsb2NrSW5mb0FycmF5T2Zmc2V0KSArCi0JCQkJCSAocG93ZXJfc3RhdGUtPnVjTm9uQ2xvY2tTdGF0ZUluZGV4ICoKLQkJCQkJICBwb3dlcl9pbmZvLT5pbmZvXzQudWNOb25DbG9ja1NpemUpKTsKLQkJCQlmb3IgKGogPSAwOyBqIDwgKHBvd2VyX2luZm8tPmluZm9fNC51Y1N0YXRlRW50cnlTaXplIC0gMSk7IGorKykgewotCQkJCQlpZiAocmRldi0+ZmxhZ3MgJiBSQURFT05fSVNfSUdQKSB7Ci0JCQkJCQlzdHJ1Y3QgX0FUT01fUFBMSUJfUlM3ODBfQ0xPQ0tfSU5GTyAqY2xvY2tfaW5mbyA9Ci0JCQkJCQkJKHN0cnVjdCBfQVRPTV9QUExJQl9SUzc4MF9DTE9DS19JTkZPICopCi0JCQkJCQkJKG1vZGVfaW5mby0+YXRvbV9jb250ZXh0LT5iaW9zICsKLQkJCQkJCQkgZGF0YV9vZmZzZXQgKwotCQkJCQkJCSBsZTE2X3RvX2NwdShwb3dlcl9pbmZvLT5pbmZvXzQudXNDbG9ja0luZm9BcnJheU9mZnNldCkgKwotCQkJCQkJCSAocG93ZXJfc3RhdGUtPnVjQ2xvY2tTdGF0ZUluZGljZXNbal0gKgotCQkJCQkJCSAgcG93ZXJfaW5mby0+aW5mb180LnVjQ2xvY2tJbmZvU2l6ZSkpOwotCQkJCQkJc2NsayA9IGxlMTZfdG9fY3B1KGNsb2NrX2luZm8tPnVzTG93RW5naW5lQ2xvY2tMb3cpOwotCQkJCQkJc2NsayB8PSBjbG9ja19pbmZvLT51Y0xvd0VuZ2luZUNsb2NrSGlnaCA8PCAxNjsKLQkJCQkJCXJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS5jbG9ja19pbmZvW21vZGVfaW5kZXhdLnNjbGsgPSBzY2xrOwotCQkJCQkJLyogc2tpcCBpbnZhbGlkIG1vZGVzICovCi0JCQkJCQlpZiAocmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLmNsb2NrX2luZm9bbW9kZV9pbmRleF0uc2NsayA9PSAwKQotCQkJCQkJCWNvbnRpbnVlOwotCQkJCQkJLyogdm9sdGFnZSB3b3JrcyBkaWZmZXJlbnRseSBvbiBJR1BzICovCi0JCQkJCQltb2RlX2luZGV4Kys7Ci0JCQkJCX0gZWxzZSBpZiAoQVNJQ19JU19EQ0U0KHJkZXYpKSB7Ci0JCQkJCQlzdHJ1Y3QgX0FUT01fUFBMSUJfRVZFUkdSRUVOX0NMT0NLX0lORk8gKmNsb2NrX2luZm8gPQotCQkJCQkJCShzdHJ1Y3QgX0FUT01fUFBMSUJfRVZFUkdSRUVOX0NMT0NLX0lORk8gKikKLQkJCQkJCQkobW9kZV9pbmZvLT5hdG9tX2NvbnRleHQtPmJpb3MgKwotCQkJCQkJCSBkYXRhX29mZnNldCArCi0JCQkJCQkJIGxlMTZfdG9fY3B1KHBvd2VyX2luZm8tPmluZm9fNC51c0Nsb2NrSW5mb0FycmF5T2Zmc2V0KSArCi0JCQkJCQkJIChwb3dlcl9zdGF0ZS0+dWNDbG9ja1N0YXRlSW5kaWNlc1tqXSAqCi0JCQkJCQkJICBwb3dlcl9pbmZvLT5pbmZvXzQudWNDbG9ja0luZm9TaXplKSk7Ci0JCQkJCQlzY2xrID0gbGUxNl90b19jcHUoY2xvY2tfaW5mby0+dXNFbmdpbmVDbG9ja0xvdyk7Ci0JCQkJCQlzY2xrIHw9IGNsb2NrX2luZm8tPnVjRW5naW5lQ2xvY2tIaWdoIDw8IDE2OwotCQkJCQkJbWNsayA9IGxlMTZfdG9fY3B1KGNsb2NrX2luZm8tPnVzTWVtb3J5Q2xvY2tMb3cpOwotCQkJCQkJbWNsayB8PSBjbG9ja19pbmZvLT51Y01lbW9yeUNsb2NrSGlnaCA8PCAxNjsKLQkJCQkJCXJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS5jbG9ja19pbmZvW21vZGVfaW5kZXhdLm1jbGsgPSBtY2xrOwotCQkJCQkJcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLmNsb2NrX2luZm9bbW9kZV9pbmRleF0uc2NsayA9IHNjbGs7Ci0JCQkJCQkvKiBza2lwIGludmFsaWQgbW9kZXMgKi8KLQkJCQkJCWlmICgocmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLmNsb2NrX2luZm9bbW9kZV9pbmRleF0ubWNsayA9PSAwKSB8fAotCQkJCQkJICAgIChyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0uY2xvY2tfaW5mb1ttb2RlX2luZGV4XS5zY2xrID09IDApKQotCQkJCQkJCWNvbnRpbnVlOwotCQkJCQkJcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLmNsb2NrX2luZm9bbW9kZV9pbmRleF0udm9sdGFnZS50eXBlID0KLQkJCQkJCQlWT0xUQUdFX1NXOwotCQkJCQkJcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLmNsb2NrX2luZm9bbW9kZV9pbmRleF0udm9sdGFnZS52b2x0YWdlID0KLQkJCQkJCQljbG9ja19pbmZvLT51c1ZEREM7Ci0JCQkJCQkvKiBYWFggdXNWRERDSSAqLwotCQkJCQkJbW9kZV9pbmRleCsrOwotCQkJCQl9IGVsc2UgewotCQkJCQkJc3RydWN0IF9BVE9NX1BQTElCX1I2MDBfQ0xPQ0tfSU5GTyAqY2xvY2tfaW5mbyA9Ci0JCQkJCQkJKHN0cnVjdCBfQVRPTV9QUExJQl9SNjAwX0NMT0NLX0lORk8gKikKLQkJCQkJCQkobW9kZV9pbmZvLT5hdG9tX2NvbnRleHQtPmJpb3MgKwotCQkJCQkJCSBkYXRhX29mZnNldCArCi0JCQkJCQkJIGxlMTZfdG9fY3B1KHBvd2VyX2luZm8tPmluZm9fNC51c0Nsb2NrSW5mb0FycmF5T2Zmc2V0KSArCi0JCQkJCQkJIChwb3dlcl9zdGF0ZS0+dWNDbG9ja1N0YXRlSW5kaWNlc1tqXSAqCi0JCQkJCQkJICBwb3dlcl9pbmZvLT5pbmZvXzQudWNDbG9ja0luZm9TaXplKSk7Ci0JCQkJCQlzY2xrID0gbGUxNl90b19jcHUoY2xvY2tfaW5mby0+dXNFbmdpbmVDbG9ja0xvdyk7Ci0JCQkJCQlzY2xrIHw9IGNsb2NrX2luZm8tPnVjRW5naW5lQ2xvY2tIaWdoIDw8IDE2OwotCQkJCQkJbWNsayA9IGxlMTZfdG9fY3B1KGNsb2NrX2luZm8tPnVzTWVtb3J5Q2xvY2tMb3cpOwotCQkJCQkJbWNsayB8PSBjbG9ja19pbmZvLT51Y01lbW9yeUNsb2NrSGlnaCA8PCAxNjsKLQkJCQkJCXJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS5jbG9ja19pbmZvW21vZGVfaW5kZXhdLm1jbGsgPSBtY2xrOwotCQkJCQkJcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLmNsb2NrX2luZm9bbW9kZV9pbmRleF0uc2NsayA9IHNjbGs7Ci0JCQkJCQkvKiBza2lwIGludmFsaWQgbW9kZXMgKi8KLQkJCQkJCWlmICgocmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLmNsb2NrX2luZm9bbW9kZV9pbmRleF0ubWNsayA9PSAwKSB8fAotCQkJCQkJICAgIChyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0uY2xvY2tfaW5mb1ttb2RlX2luZGV4XS5zY2xrID09IDApKQotCQkJCQkJCWNvbnRpbnVlOwotCQkJCQkJcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLmNsb2NrX2luZm9bbW9kZV9pbmRleF0udm9sdGFnZS50eXBlID0KLQkJCQkJCQlWT0xUQUdFX1NXOwotCQkJCQkJcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLmNsb2NrX2luZm9bbW9kZV9pbmRleF0udm9sdGFnZS52b2x0YWdlID0KLQkJCQkJCQljbG9ja19pbmZvLT51c1ZEREM7Ci0JCQkJCQltb2RlX2luZGV4Kys7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLm51bV9jbG9ja19tb2RlcyA9IG1vZGVfaW5kZXg7Ci0JCQkJaWYgKG1vZGVfaW5kZXgpIHsKLQkJCQkJbWlzYyA9IGxlMzJfdG9fY3B1KG5vbl9jbG9ja19pbmZvLT51bENhcHNBbmRTZXR0aW5ncyk7Ci0JCQkJCW1pc2MyID0gbGUxNl90b19jcHUobm9uX2Nsb2NrX2luZm8tPnVzQ2xhc3NpZmljYXRpb24pOwotCQkJCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0ubWlzYyA9IG1pc2M7Ci0JCQkJCXJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS5taXNjMiA9IG1pc2MyOwotCQkJCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0ucGNpZV9sYW5lcyA9Ci0JCQkJCQkoKG1pc2MgJiBBVE9NX1BQTElCX1BDSUVfTElOS19XSURUSF9NQVNLKSA+PgotCQkJCQkJQVRPTV9QUExJQl9QQ0lFX0xJTktfV0lEVEhfU0hJRlQpICsgMTsKLQkJCQkJc3dpdGNoIChtaXNjMiAmIEFUT01fUFBMSUJfQ0xBU1NJRklDQVRJT05fVUlfTUFTSykgewotCQkJCQljYXNlIEFUT01fUFBMSUJfQ0xBU1NJRklDQVRJT05fVUlfQkFUVEVSWToKLQkJCQkJCXJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS50eXBlID0KLQkJCQkJCQlQT1dFUl9TVEFURV9UWVBFX0JBVFRFUlk7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBBVE9NX1BQTElCX0NMQVNTSUZJQ0FUSU9OX1VJX0JBTEFOQ0VEOgotCQkJCQkJcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLnR5cGUgPQotCQkJCQkJCVBPV0VSX1NUQVRFX1RZUEVfQkFMQU5DRUQ7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBBVE9NX1BQTElCX0NMQVNTSUZJQ0FUSU9OX1VJX1BFUkZPUk1BTkNFOgotCQkJCQkJcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLnR5cGUgPQotCQkJCQkJCVBPV0VSX1NUQVRFX1RZUEVfUEVSRk9STUFOQ0U7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBBVE9NX1BQTElCX0NMQVNTSUZJQ0FUSU9OX1VJX05PTkU6Ci0JCQkJCQlpZiAobWlzYzIgJiBBVE9NX1BQTElCX0NMQVNTSUZJQ0FUSU9OXzNEUEVSRk9STUFOQ0UpCi0JCQkJCQkJcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLnR5cGUgPQotCQkJCQkJCQlQT1dFUl9TVEFURV9UWVBFX1BFUkZPUk1BTkNFOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQkJcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLmZsYWdzID0gMDsKLQkJCQkJaWYgKG1pc2MgJiBBVE9NX1BQTElCX1NJTkdMRV9ESVNQTEFZX09OTFkpCi0JCQkJCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0uZmxhZ3MgfD0KLQkJCQkJCQlSQURFT05fUE1fU1RBVEVfU0lOR0xFX0RJU1BMQVlfT05MWTsKLQkJCQkJaWYgKG1pc2MyICYgQVRPTV9QUExJQl9DTEFTU0lGSUNBVElPTl9CT09UKSB7Ci0JCQkJCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0udHlwZSA9Ci0JCQkJCQkJUE9XRVJfU1RBVEVfVFlQRV9ERUZBVUxUOwotCQkJCQkJcmRldi0+cG0uZGVmYXVsdF9wb3dlcl9zdGF0ZV9pbmRleCA9IHN0YXRlX2luZGV4OwotCQkJCQkJcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLmRlZmF1bHRfY2xvY2tfbW9kZSA9Ci0JCQkJCQkJJnJkZXYtPnBtLnBvd2VyX3N0YXRlW3N0YXRlX2luZGV4XS5jbG9ja19pbmZvW21vZGVfaW5kZXggLSAxXTsKLQkJCQkJCS8qIHBhdGNoIHRoZSB0YWJsZSB2YWx1ZXMgd2l0aCB0aGUgZGVmYXVsdCBzbGNrL21jbGsgZnJvbSBmaXJtd2FyZSBpbmZvICovCi0JCQkJCQlmb3IgKGogPSAwOyBqIDwgbW9kZV9pbmRleDsgaisrKSB7Ci0JCQkJCQkJcmRldi0+cG0ucG93ZXJfc3RhdGVbc3RhdGVfaW5kZXhdLmNsb2NrX2luZm9bal0ubWNsayA9Ci0JCQkJCQkJCXJkZXYtPmNsb2NrLmRlZmF1bHRfbWNsazsKLQkJCQkJCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0uY2xvY2tfaW5mb1tqXS5zY2xrID0KLQkJCQkJCQkJcmRldi0+Y2xvY2suZGVmYXVsdF9zY2xrOwotCQkJCQkJCWlmICh2ZGRjKQotCQkJCQkJCQlyZGV2LT5wbS5wb3dlcl9zdGF0ZVtzdGF0ZV9pbmRleF0uY2xvY2tfaW5mb1tqXS52b2x0YWdlLnZvbHRhZ2UgPQotCQkJCQkJCQkJdmRkYzsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlzdGF0ZV9pbmRleCsrOwotCQkJCX0KLQkJCX0KLQkJCS8qIGlmIG11bHRpcGxlIGNsb2NrIG1vZGVzLCBtYXJrIHRoZSBsb3dlc3QgYXMgbm8gZGlzcGxheSAqLwotCQkJZm9yIChpID0gMDsgaSA8IHN0YXRlX2luZGV4OyBpKyspIHsKLQkJCQlpZiAocmRldi0+cG0ucG93ZXJfc3RhdGVbaV0ubnVtX2Nsb2NrX21vZGVzID4gMSkKLQkJCQkJcmRldi0+cG0ucG93ZXJfc3RhdGVbaV0uY2xvY2tfaW5mb1swXS5mbGFncyB8PQotCQkJCQkJUkFERU9OX1BNX01PREVfTk9fRElTUExBWTsKLQkJCX0KLQkJCS8qIGZpcnN0IG1vZGUgaXMgdXN1YWxseSBkZWZhdWx0ICovCi0JCQlpZiAocmRldi0+cG0uZGVmYXVsdF9wb3dlcl9zdGF0ZV9pbmRleCA9PSAtMSkgewotCQkJCXJkZXYtPnBtLnBvd2VyX3N0YXRlWzBdLnR5cGUgPQotCQkJCQlQT1dFUl9TVEFURV9UWVBFX0RFRkFVTFQ7Ci0JCQkJcmRldi0+cG0uZGVmYXVsdF9wb3dlcl9zdGF0ZV9pbmRleCA9IDA7Ci0JCQkJcmRldi0+cG0ucG93ZXJfc3RhdGVbMF0uZGVmYXVsdF9jbG9ja19tb2RlID0KLQkJCQkJJnJkZXYtPnBtLnBvd2VyX3N0YXRlWzBdLmNsb2NrX2luZm9bMF07Ci0JCQl9CisJCXN3aXRjaCAoZnJldikgeworCQljYXNlIDE6CisJCWNhc2UgMjoKKwkJY2FzZSAzOgorCQkJc3RhdGVfaW5kZXggPSByYWRlb25fYXRvbWJpb3NfcGFyc2VfcG93ZXJfdGFibGVfMV8zKHJkZXYpOworCQkJYnJlYWs7CisJCWNhc2UgNDoKKwkJY2FzZSA1OgorCQkJc3RhdGVfaW5kZXggPSByYWRlb25fYXRvbWJpb3NfcGFyc2VfcG93ZXJfdGFibGVfNF81KHJkZXYpOworCQkJYnJlYWs7CisJCWNhc2UgNjoKKwkJCXN0YXRlX2luZGV4ID0gcmFkZW9uX2F0b21iaW9zX3BhcnNlX3Bvd2VyX3RhYmxlXzYocmRldik7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOwogCQl9CiAJfSBlbHNlIHsKIAkJLyogYWRkIHRoZSBkZWZhdWx0IG1vZGUgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2Jpb3MuYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2Jpb3MuYwppbmRleCA4ZjJjN2I1Li4xYWJhODVjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9iaW9zLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fYmlvcy5jCkBAIC0xMzEsNiArMTMxLDQ1IEBACiAJcmV0dXJuIHRydWU7CiB9CiAKK3N0YXRpYyBib29sIG5pX3JlYWRfZGlzYWJsZWRfYmlvcyhzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKK3sKKwl1MzIgYnVzX2NudGw7CisJdTMyIGQxdmdhX2NvbnRyb2w7CisJdTMyIGQydmdhX2NvbnRyb2w7CisJdTMyIHZnYV9yZW5kZXJfY29udHJvbDsKKwl1MzIgcm9tX2NudGw7CisJYm9vbCByOworCisJYnVzX2NudGwgPSBSUkVHMzIoUjYwMF9CVVNfQ05UTCk7CisJZDF2Z2FfY29udHJvbCA9IFJSRUczMihBVklWT19EMVZHQV9DT05UUk9MKTsKKwlkMnZnYV9jb250cm9sID0gUlJFRzMyKEFWSVZPX0QyVkdBX0NPTlRST0wpOworCXZnYV9yZW5kZXJfY29udHJvbCA9IFJSRUczMihBVklWT19WR0FfUkVOREVSX0NPTlRST0wpOworCXJvbV9jbnRsID0gUlJFRzMyKFI2MDBfUk9NX0NOVEwpOworCisJLyogZW5hYmxlIHRoZSByb20gKi8KKwlXUkVHMzIoUjYwMF9CVVNfQ05UTCwgKGJ1c19jbnRsICYgflI2MDBfQklPU19ST01fRElTKSk7CisJLyogRGlzYWJsZSBWR0EgbW9kZSAqLworCVdSRUczMihBVklWT19EMVZHQV9DT05UUk9MLAorCSAgICAgICAoZDF2Z2FfY29udHJvbCAmIH4oQVZJVk9fRFZHQV9DT05UUk9MX01PREVfRU5BQkxFIHwKKwkJQVZJVk9fRFZHQV9DT05UUk9MX1RJTUlOR19TRUxFQ1QpKSk7CisJV1JFRzMyKEFWSVZPX0QyVkdBX0NPTlRST0wsCisJICAgICAgIChkMnZnYV9jb250cm9sICYgfihBVklWT19EVkdBX0NPTlRST0xfTU9ERV9FTkFCTEUgfAorCQlBVklWT19EVkdBX0NPTlRST0xfVElNSU5HX1NFTEVDVCkpKTsKKwlXUkVHMzIoQVZJVk9fVkdBX1JFTkRFUl9DT05UUk9MLAorCSAgICAgICAodmdhX3JlbmRlcl9jb250cm9sICYgfkFWSVZPX1ZHQV9WU1RBVFVTX0NOVExfTUFTSykpOworCVdSRUczMihSNjAwX1JPTV9DTlRMLCByb21fY250bCB8IFI2MDBfU0NLX09WRVJXUklURSk7CisKKwlyID0gcmFkZW9uX3JlYWRfYmlvcyhyZGV2KTsKKworCS8qIHJlc3RvcmUgcmVncyAqLworCVdSRUczMihSNjAwX0JVU19DTlRMLCBidXNfY250bCk7CisJV1JFRzMyKEFWSVZPX0QxVkdBX0NPTlRST0wsIGQxdmdhX2NvbnRyb2wpOworCVdSRUczMihBVklWT19EMlZHQV9DT05UUk9MLCBkMnZnYV9jb250cm9sKTsKKwlXUkVHMzIoQVZJVk9fVkdBX1JFTkRFUl9DT05UUk9MLCB2Z2FfcmVuZGVyX2NvbnRyb2wpOworCVdSRUczMihSNjAwX1JPTV9DTlRMLCByb21fY250bCk7CisJcmV0dXJuIHI7Cit9CisKIHN0YXRpYyBib29sIHI3MDBfcmVhZF9kaXNhYmxlZF9iaW9zKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQogewogCXVpbnQzMl90IHZpcGhfY29udHJvbDsKQEAgLTQxNiw2ICs0NTUsOCBAQAogewogCWlmIChyZGV2LT5mbGFncyAmIFJBREVPTl9JU19JR1ApCiAJCXJldHVybiBpZ3BfcmVhZF9iaW9zX2Zyb21fdnJhbShyZGV2KTsKKwllbHNlIGlmIChyZGV2LT5mYW1pbHkgPj0gQ0hJUF9CQVJUUykKKwkJcmV0dXJuIG5pX3JlYWRfZGlzYWJsZWRfYmlvcyhyZGV2KTsKIAllbHNlIGlmIChyZGV2LT5mYW1pbHkgPj0gQ0hJUF9SVjc3MCkKIAkJcmV0dXJuIHI3MDBfcmVhZF9kaXNhYmxlZF9iaW9zKHJkZXYpOwogCWVsc2UgaWYgKHJkZXYtPmZhbWlseSA+PSBDSElQX1I2MDApCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9jb21iaW9zLmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9jb21iaW9zLmMKaW5kZXggMTM3YjgwNy4uNTkxZmNhZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fY29tYmlvcy5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2NvbWJpb3MuYwpAQCAtNDcxLDggKzQ3MSw5IEBACiAJcmV0dXJuIHRydWU7CiB9CiAKKy8qIHRoaXMgaXMgdXNlZCBmb3IgYXRvbSBMQ0RzIGFzIHdlbGwgKi8KIHN0cnVjdCBlZGlkICoKLXJhZGVvbl9jb21iaW9zX2dldF9oYXJkY29kZWRfZWRpZChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKK3JhZGVvbl9iaW9zX2dldF9oYXJkY29kZWRfZWRpZChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKIHsKIAlpZiAocmRldi0+bW9kZV9pbmZvLmJpb3NfaGFyZGNvZGVkX2VkaWQpCiAJCXJldHVybiByZGV2LT5tb2RlX2luZm8uYmlvc19oYXJkY29kZWRfZWRpZDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2Nvbm5lY3RvcnMuYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2Nvbm5lY3RvcnMuYwppbmRleCA4YWZhZjdhLi4yMmI3ZTNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9jb25uZWN0b3JzLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fY29ubmVjdG9ycy5jCkBAIC00NzIsNiArNDcyLDkgQEAKIAlpZiAobW9kZSkgewogCQlyZXQgPSAxOwogCQlkcm1fbW9kZV9wcm9iZWRfYWRkKGNvbm5lY3RvciwgbW9kZSk7CisJCS8qIGFkZCB0aGUgd2lkdGgvaGVpZ2h0IGZyb20gdmJpb3MgdGFibGVzIGlmIGF2YWlsYWJsZSAqLworCQljb25uZWN0b3ItPmRpc3BsYXlfaW5mby53aWR0aF9tbSA9IG1vZGUtPndpZHRoX21tOworCQljb25uZWN0b3ItPmRpc3BsYXlfaW5mby5oZWlnaHRfbW0gPSBtb2RlLT5oZWlnaHRfbW07CiAJCS8qIGFkZCBzY2FsZWQgbW9kZXMgKi8KIAkJcmFkZW9uX2FkZF9jb21tb25fbW9kZXMoZW5jb2RlciwgY29ubmVjdG9yKTsKIAl9CkBAIC0xMjE2LDcgKzEyMTksNyBAQAogCQlpZiAoQVNJQ19JU19BVklWTyhyZGV2KSkgewogCQkJZHJtX2Nvbm5lY3Rvcl9hdHRhY2hfcHJvcGVydHkoJnJhZGVvbl9jb25uZWN0b3ItPmJhc2UsCiAJCQkJCQkgICAgICByZGV2LT5tb2RlX2luZm8udW5kZXJzY2FuX3Byb3BlcnR5LAotCQkJCQkJICAgICAgVU5ERVJTQ0FOX0FVVE8pOworCQkJCQkJICAgICAgVU5ERVJTQ0FOX09GRik7CiAJCQlkcm1fY29ubmVjdG9yX2F0dGFjaF9wcm9wZXJ0eSgmcmFkZW9uX2Nvbm5lY3Rvci0+YmFzZSwKIAkJCQkJCSAgICAgIHJkZXYtPm1vZGVfaW5mby51bmRlcnNjYW5faGJvcmRlcl9wcm9wZXJ0eSwKIAkJCQkJCSAgICAgIDApOwpAQCAtMTI1Niw3ICsxMjU5LDcgQEAKIAkJaWYgKEFTSUNfSVNfQVZJVk8ocmRldikpIHsKIAkJCWRybV9jb25uZWN0b3JfYXR0YWNoX3Byb3BlcnR5KCZyYWRlb25fY29ubmVjdG9yLT5iYXNlLAogCQkJCQkJICAgICAgcmRldi0+bW9kZV9pbmZvLnVuZGVyc2Nhbl9wcm9wZXJ0eSwKLQkJCQkJCSAgICAgIFVOREVSU0NBTl9BVVRPKTsKKwkJCQkJCSAgICAgIFVOREVSU0NBTl9PRkYpOwogCQkJZHJtX2Nvbm5lY3Rvcl9hdHRhY2hfcHJvcGVydHkoJnJhZGVvbl9jb25uZWN0b3ItPmJhc2UsCiAJCQkJCQkgICAgICByZGV2LT5tb2RlX2luZm8udW5kZXJzY2FuX2hib3JkZXJfcHJvcGVydHksCiAJCQkJCQkgICAgICAwKTsKQEAgLTEyOTksNyArMTMwMiw3IEBACiAJCWlmIChBU0lDX0lTX0FWSVZPKHJkZXYpKSB7CiAJCQlkcm1fY29ubmVjdG9yX2F0dGFjaF9wcm9wZXJ0eSgmcmFkZW9uX2Nvbm5lY3Rvci0+YmFzZSwKIAkJCQkJCSAgICAgIHJkZXYtPm1vZGVfaW5mby51bmRlcnNjYW5fcHJvcGVydHksCi0JCQkJCQkgICAgICBVTkRFUlNDQU5fQVVUTyk7CisJCQkJCQkgICAgICBVTkRFUlNDQU5fT0ZGKTsKIAkJCWRybV9jb25uZWN0b3JfYXR0YWNoX3Byb3BlcnR5KCZyYWRlb25fY29ubmVjdG9yLT5iYXNlLAogCQkJCQkJICAgICAgcmRldi0+bW9kZV9pbmZvLnVuZGVyc2Nhbl9oYm9yZGVyX3Byb3BlcnR5LAogCQkJCQkJICAgICAgMCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9jcy5jIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fY3MuYwppbmRleCA2ZDY0YTI3Li4zNWI1ZWI4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9jcy5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2NzLmMKQEAgLTc3LDEzICs3NywxMyBAQAogCQkJcC0+cmVsb2NzX3B0cltpXSA9ICZwLT5yZWxvY3NbaV07CiAJCQlwLT5yZWxvY3NbaV0ucm9iaiA9IHAtPnJlbG9jc1tpXS5nb2JqLT5kcml2ZXJfcHJpdmF0ZTsKIAkJCXAtPnJlbG9jc1tpXS5sb2JqLmJvID0gcC0+cmVsb2NzW2ldLnJvYmo7Ci0JCQlwLT5yZWxvY3NbaV0ubG9iai5yZG9tYWluID0gci0+cmVhZF9kb21haW5zOwogCQkJcC0+cmVsb2NzW2ldLmxvYmoud2RvbWFpbiA9IHItPndyaXRlX2RvbWFpbjsKKwkJCXAtPnJlbG9jc1tpXS5sb2JqLnJkb21haW4gPSByLT5yZWFkX2RvbWFpbnM7CisJCQlwLT5yZWxvY3NbaV0ubG9iai50di5ibyA9ICZwLT5yZWxvY3NbaV0ucm9iai0+dGJvOwogCQkJcC0+cmVsb2NzW2ldLmhhbmRsZSA9IHItPmhhbmRsZTsKIAkJCXAtPnJlbG9jc1tpXS5mbGFncyA9IHItPmZsYWdzOwotCQkJSU5JVF9MSVNUX0hFQUQoJnAtPnJlbG9jc1tpXS5sb2JqLmxpc3QpOwogCQkJcmFkZW9uX2JvX2xpc3RfYWRkX29iamVjdCgmcC0+cmVsb2NzW2ldLmxvYmosCi0JCQkJCQkmcC0+dmFsaWRhdGVkKTsKKwkJCQkJCSAgJnAtPnZhbGlkYXRlZCk7CiAJCX0KIAl9CiAJcmV0dXJuIHJhZGVvbl9ib19saXN0X3ZhbGlkYXRlKCZwLT52YWxpZGF0ZWQpOwpAQCAtMTg5LDEwICsxODksMTMgQEAKIHsKIAl1bnNpZ25lZCBpOwogCi0JaWYgKCFlcnJvciAmJiBwYXJzZXItPmliKSB7Ci0JCXJhZGVvbl9ib19saXN0X2ZlbmNlKCZwYXJzZXItPnZhbGlkYXRlZCwgcGFyc2VyLT5pYi0+ZmVuY2UpOwotCX0KLQlyYWRlb25fYm9fbGlzdF91bnJlc2VydmUoJnBhcnNlci0+dmFsaWRhdGVkKTsKKworCWlmICghZXJyb3IgJiYgcGFyc2VyLT5pYikKKwkJdHRtX2V1X2ZlbmNlX2J1ZmZlcl9vYmplY3RzKCZwYXJzZXItPnZhbGlkYXRlZCwKKwkJCQkJICAgIHBhcnNlci0+aWItPmZlbmNlKTsKKwllbHNlCisJCXR0bV9ldV9iYWNrb2ZmX3Jlc2VydmF0aW9uKCZwYXJzZXItPnZhbGlkYXRlZCk7CisKIAlpZiAocGFyc2VyLT5yZWxvY3MgIT0gTlVMTCkgewogCQlmb3IgKGkgPSAwOyBpIDwgcGFyc2VyLT5ucmVsb2NzOyBpKyspIHsKIAkJCWlmIChwYXJzZXItPnJlbG9jc1tpXS5nb2JqKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fZGV2aWNlLmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9kZXZpY2UuYwppbmRleCA1MDE5NjZhLi4yNjA5MWQ2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9kZXZpY2UuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9kZXZpY2UuYwpAQCAtODEsNiArODEsMTAgQEAKIAkiSlVOSVBFUiIsCiAJIkNZUFJFU1MiLAogCSJIRU1MT0NLIiwKKwkiUEFMTSIsCisJIkJBUlRTIiwKKwkiVFVSS1MiLAorCSJDQUlDT1MiLAogCSJMQVNUIiwKIH07CiAKQEAgLTIyNCw2ICsyMjgsMTEgQEAKIAkJCQlyZGV2LT53Yi51c2VfZXZlbnQgPSB0cnVlOwogCQl9CiAJfQorCS8qIGFsd2F5cyB1c2Ugd3JpdGViYWNrL2V2ZW50cyBvbiBOSSAqLworCWlmIChBU0lDX0lTX0RDRTUocmRldikpIHsKKwkJcmRldi0+d2IuZW5hYmxlZCA9IHRydWU7CisJCXJkZXYtPndiLnVzZV9ldmVudCA9IHRydWU7CisJfQogCiAJZGV2X2luZm8ocmRldi0+ZGV2LCAiV0IgJXNhYmxlZFxuIiwgcmRldi0+d2IuZW5hYmxlZCA/ICJlbiIgOiAiZGlzIik7CiAKQEAgLTMzNSw3ICszNDQsMTIgQEAKIAl1aW50MzJfdCByZWc7CiAKIAkvKiBmaXJzdCBjaGVjayBDUlRDcyAqLwotCWlmIChBU0lDX0lTX0RDRTQocmRldikpIHsKKwlpZiAoQVNJQ19JU19EQ0U0MShyZGV2KSkgeworCQlyZWcgPSBSUkVHMzIoRVZFUkdSRUVOX0NSVENfQ09OVFJPTCArIEVWRVJHUkVFTl9DUlRDMF9SRUdJU1RFUl9PRkZTRVQpIHwKKwkJCVJSRUczMihFVkVSR1JFRU5fQ1JUQ19DT05UUk9MICsgRVZFUkdSRUVOX0NSVEMxX1JFR0lTVEVSX09GRlNFVCk7CisJCWlmIChyZWcgJiBFVkVSR1JFRU5fQ1JUQ19NQVNURVJfRU4pCisJCQlyZXR1cm4gdHJ1ZTsKKwl9IGVsc2UgaWYgKEFTSUNfSVNfRENFNChyZGV2KSkgewogCQlyZWcgPSBSUkVHMzIoRVZFUkdSRUVOX0NSVENfQ09OVFJPTCArIEVWRVJHUkVFTl9DUlRDMF9SRUdJU1RFUl9PRkZTRVQpIHwKIAkJCVJSRUczMihFVkVSR1JFRU5fQ1JUQ19DT05UUk9MICsgRVZFUkdSRUVOX0NSVEMxX1JFR0lTVEVSX09GRlNFVCkgfAogCQkJUlJFRzMyKEVWRVJHUkVFTl9DUlRDX0NPTlRST0wgKyBFVkVSR1JFRU5fQ1JUQzJfUkVHSVNURVJfT0ZGU0VUKSB8CkBAIC02MzYsMjAgKzY1MCwyMCBAQAogc3RhdGljIHZvaWQgcmFkZW9uX3N3aXRjaGVyb29fc2V0X3N0YXRlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBlbnVtIHZnYV9zd2l0Y2hlcm9vX3N0YXRlIHN0YXRlKQogewogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7Ci0Jc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXBtX21lc3NhZ2VfdCBwbW0gPSB7IC5ldmVudCA9IFBNX0VWRU5UX1NVU1BFTkQgfTsKIAlpZiAoc3RhdGUgPT0gVkdBX1NXSVRDSEVST09fT04pIHsKIAkJcHJpbnRrKEtFUk5fSU5GTyAicmFkZW9uOiBzd2l0Y2hlZCBvblxuIik7CiAJCS8qIGRvbid0IHN1c3BlbmQgb3IgcmVzdW1lIGNhcmQgbm9ybWFsbHkgKi8KLQkJcmRldi0+cG93ZXJlZF9kb3duID0gZmFsc2U7CisJCWRldi0+c3dpdGNoX3Bvd2VyX3N0YXRlID0gRFJNX1NXSVRDSF9QT1dFUl9DSEFOR0lORzsKIAkJcmFkZW9uX3Jlc3VtZV9rbXMoZGV2KTsKKwkJZGV2LT5zd2l0Y2hfcG93ZXJfc3RhdGUgPSBEUk1fU1dJVENIX1BPV0VSX09OOwogCQlkcm1fa21zX2hlbHBlcl9wb2xsX2VuYWJsZShkZXYpOwogCX0gZWxzZSB7CiAJCXByaW50ayhLRVJOX0lORk8gInJhZGVvbjogc3dpdGNoZWQgb2ZmXG4iKTsKIAkJZHJtX2ttc19oZWxwZXJfcG9sbF9kaXNhYmxlKGRldik7CisJCWRldi0+c3dpdGNoX3Bvd2VyX3N0YXRlID0gRFJNX1NXSVRDSF9QT1dFUl9DSEFOR0lORzsKIAkJcmFkZW9uX3N1c3BlbmRfa21zKGRldiwgcG1tKTsKLQkJLyogZG9uJ3Qgc3VzcGVuZCBvciByZXN1bWUgY2FyZCBub3JtYWxseSAqLwotCQlyZGV2LT5wb3dlcmVkX2Rvd24gPSB0cnVlOworCQlkZXYtPnN3aXRjaF9wb3dlcl9zdGF0ZSA9IERSTV9TV0lUQ0hfUE9XRVJfT0ZGOwogCX0KIH0KIApAQCAtNzA0LDExICs3MTgsNiBAQAogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnJkZXYtPmlycS52YmxhbmtfcXVldWUpOwogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnJkZXYtPmlycS5pZGxlX3F1ZXVlKTsKIAotCS8qIHNldHVwIHdvcmtxdWV1ZSAqLwotCXJkZXYtPndxID0gY3JlYXRlX3dvcmtxdWV1ZSgicmFkZW9uIik7Ci0JaWYgKHJkZXYtPndxID09IE5VTEwpCi0JCXJldHVybiAtRU5PTUVNOwotCiAJLyogU2V0IGFzaWMgZnVuY3Rpb25zICovCiAJciA9IHJhZGVvbl9hc2ljX2luaXQocmRldik7CiAJaWYgKHIpCkBAIC03NzMsNiArNzgyLDcgQEAKIAl2Z2FfY2xpZW50X3JlZ2lzdGVyKHJkZXYtPnBkZXYsIHJkZXYsIE5VTEwsIHJhZGVvbl92Z2Ffc2V0X2RlY29kZSk7CiAJdmdhX3N3aXRjaGVyb29fcmVnaXN0ZXJfY2xpZW50KHJkZXYtPnBkZXYsCiAJCQkJICAgICAgIHJhZGVvbl9zd2l0Y2hlcm9vX3NldF9zdGF0ZSwKKwkJCQkgICAgICAgTlVMTCwKIAkJCQkgICAgICAgcmFkZW9uX3N3aXRjaGVyb29fY2FuX3N3aXRjaCk7CiAKIAlyID0gcmFkZW9uX2luaXQocmRldik7CkBAIC04MDYsNyArODE2LDYgQEAKIAkvKiBldmljdCB2cmFtIG1lbW9yeSAqLwogCXJhZGVvbl9ib19ldmljdF92cmFtKHJkZXYpOwogCXJhZGVvbl9maW5pKHJkZXYpOwotCWRlc3Ryb3lfd29ya3F1ZXVlKHJkZXYtPndxKTsKIAl2Z2Ffc3dpdGNoZXJvb191bnJlZ2lzdGVyX2NsaWVudChyZGV2LT5wZGV2KTsKIAl2Z2FfY2xpZW50X3JlZ2lzdGVyKHJkZXYtPnBkZXYsIE5VTEwsIE5VTEwsIE5VTEwpOwogCWlmIChyZGV2LT5yaW9fbWVtKQpAQCAtODM1LDcgKzg0NCw3IEBACiAJfQogCXJkZXYgPSBkZXYtPmRldl9wcml2YXRlOwogCi0JaWYgKHJkZXYtPnBvd2VyZWRfZG93bikKKwlpZiAoZGV2LT5zd2l0Y2hfcG93ZXJfc3RhdGUgPT0gRFJNX1NXSVRDSF9QT1dFUl9PRkYpCiAJCXJldHVybiAwOwogCiAJLyogdHVybiBvZmYgZGlzcGxheSBodyAqLwpAQCAtODkzLDcgKzkwMiw3IEBACiAJc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcjsKIAlzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAKLQlpZiAocmRldi0+cG93ZXJlZF9kb3duKQorCWlmIChkZXYtPnN3aXRjaF9wb3dlcl9zdGF0ZSA9PSBEUk1fU1dJVENIX1BPV0VSX09GRikKIAkJcmV0dXJuIDA7CiAKIAlhY3F1aXJlX2NvbnNvbGVfc2VtKCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9kaXNwbGF5LmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9kaXNwbGF5LmMKaW5kZXggMWRmNGRjNi4uZDI2ZGFiZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fZGlzcGxheS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2Rpc3BsYXkuYwpAQCAtNjgsNyArNjgsNyBAQAogCVdSRUczMihBVklWT19EMUdSUEhfTFVUX1NFTCArIHJhZGVvbl9jcnRjLT5jcnRjX29mZnNldCwgcmFkZW9uX2NydGMtPmNydGNfaWQpOwogfQogCi1zdGF0aWMgdm9pZCBldmVyZ3JlZW5fY3J0Y19sb2FkX2x1dChzdHJ1Y3QgZHJtX2NydGMgKmNydGMpCitzdGF0aWMgdm9pZCBkY2U0X2NydGNfbG9hZF9sdXQoc3RydWN0IGRybV9jcnRjICpjcnRjKQogewogCXN0cnVjdCByYWRlb25fY3J0YyAqcmFkZW9uX2NydGMgPSB0b19yYWRlb25fY3J0YyhjcnRjKTsKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY3J0Yy0+ZGV2OwpAQCAtOTgsNiArOTgsNjYgQEAKIAl9CiB9CiAKK3N0YXRpYyB2b2lkIGRjZTVfY3J0Y19sb2FkX2x1dChzdHJ1Y3QgZHJtX2NydGMgKmNydGMpCit7CisJc3RydWN0IHJhZGVvbl9jcnRjICpyYWRlb25fY3J0YyA9IHRvX3JhZGVvbl9jcnRjKGNydGMpOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjcnRjLT5kZXY7CisJc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYgPSBkZXYtPmRldl9wcml2YXRlOworCWludCBpOworCisJRFJNX0RFQlVHX0tNUygiJWRcbiIsIHJhZGVvbl9jcnRjLT5jcnRjX2lkKTsKKworCVdSRUczMihOSV9JTlBVVF9DU0NfQ09OVFJPTCArIHJhZGVvbl9jcnRjLT5jcnRjX29mZnNldCwKKwkgICAgICAgKE5JX0lOUFVUX0NTQ19HUlBIX01PREUoTklfSU5QVVRfQ1NDX0JZUEFTUykgfAorCQlOSV9JTlBVVF9DU0NfT1ZMX01PREUoTklfSU5QVVRfQ1NDX0JZUEFTUykpKTsKKwlXUkVHMzIoTklfUFJFU0NBTEVfR1JQSF9DT05UUk9MICsgcmFkZW9uX2NydGMtPmNydGNfb2Zmc2V0LAorCSAgICAgICBOSV9HUlBIX1BSRVNDQUxFX0JZUEFTUyk7CisJV1JFRzMyKE5JX1BSRVNDQUxFX09WTF9DT05UUk9MICsgcmFkZW9uX2NydGMtPmNydGNfb2Zmc2V0LAorCSAgICAgICBOSV9PVkxfUFJFU0NBTEVfQllQQVNTKTsKKwlXUkVHMzIoTklfSU5QVVRfR0FNTUFfQ09OVFJPTCArIHJhZGVvbl9jcnRjLT5jcnRjX29mZnNldCwKKwkgICAgICAgKE5JX0dSUEhfSU5QVVRfR0FNTUFfTU9ERShOSV9JTlBVVF9HQU1NQV9VU0VfTFVUKSB8CisJCU5JX09WTF9JTlBVVF9HQU1NQV9NT0RFKE5JX0lOUFVUX0dBTU1BX1VTRV9MVVQpKSk7CisKKwlXUkVHMzIoRVZFUkdSRUVOX0RDX0xVVF9DT05UUk9MICsgcmFkZW9uX2NydGMtPmNydGNfb2Zmc2V0LCAwKTsKKworCVdSRUczMihFVkVSR1JFRU5fRENfTFVUX0JMQUNLX09GRlNFVF9CTFVFICsgcmFkZW9uX2NydGMtPmNydGNfb2Zmc2V0LCAwKTsKKwlXUkVHMzIoRVZFUkdSRUVOX0RDX0xVVF9CTEFDS19PRkZTRVRfR1JFRU4gKyByYWRlb25fY3J0Yy0+Y3J0Y19vZmZzZXQsIDApOworCVdSRUczMihFVkVSR1JFRU5fRENfTFVUX0JMQUNLX09GRlNFVF9SRUQgKyByYWRlb25fY3J0Yy0+Y3J0Y19vZmZzZXQsIDApOworCisJV1JFRzMyKEVWRVJHUkVFTl9EQ19MVVRfV0hJVEVfT0ZGU0VUX0JMVUUgKyByYWRlb25fY3J0Yy0+Y3J0Y19vZmZzZXQsIDB4ZmZmZik7CisJV1JFRzMyKEVWRVJHUkVFTl9EQ19MVVRfV0hJVEVfT0ZGU0VUX0dSRUVOICsgcmFkZW9uX2NydGMtPmNydGNfb2Zmc2V0LCAweGZmZmYpOworCVdSRUczMihFVkVSR1JFRU5fRENfTFVUX1dISVRFX09GRlNFVF9SRUQgKyByYWRlb25fY3J0Yy0+Y3J0Y19vZmZzZXQsIDB4ZmZmZik7CisKKwlXUkVHMzIoRVZFUkdSRUVOX0RDX0xVVF9SV19NT0RFICsgcmFkZW9uX2NydGMtPmNydGNfb2Zmc2V0LCAwKTsKKwlXUkVHMzIoRVZFUkdSRUVOX0RDX0xVVF9XUklURV9FTl9NQVNLICsgcmFkZW9uX2NydGMtPmNydGNfb2Zmc2V0LCAweDAwMDAwMDA3KTsKKworCVdSRUczMihFVkVSR1JFRU5fRENfTFVUX1JXX0lOREVYICsgcmFkZW9uX2NydGMtPmNydGNfb2Zmc2V0LCAwKTsKKwlmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKKwkJV1JFRzMyKEVWRVJHUkVFTl9EQ19MVVRfMzBfQ09MT1IgKyByYWRlb25fY3J0Yy0+Y3J0Y19vZmZzZXQsCisJCSAgICAgICAocmFkZW9uX2NydGMtPmx1dF9yW2ldIDw8IDIwKSB8CisJCSAgICAgICAocmFkZW9uX2NydGMtPmx1dF9nW2ldIDw8IDEwKSB8CisJCSAgICAgICAocmFkZW9uX2NydGMtPmx1dF9iW2ldIDw8IDApKTsKKwl9CisKKwlXUkVHMzIoTklfREVHQU1NQV9DT05UUk9MICsgcmFkZW9uX2NydGMtPmNydGNfb2Zmc2V0LAorCSAgICAgICAoTklfR1JQSF9ERUdBTU1BX01PREUoTklfREVHQU1NQV9CWVBBU1MpIHwKKwkJTklfT1ZMX0RFR0FNTUFfTU9ERShOSV9ERUdBTU1BX0JZUEFTUykgfAorCQlOSV9JQ09OX0RFR0FNTUFfTU9ERShOSV9ERUdBTU1BX0JZUEFTUykgfAorCQlOSV9DVVJTT1JfREVHQU1NQV9NT0RFKE5JX0RFR0FNTUFfQllQQVNTKSkpOworCVdSRUczMihOSV9HQU1VVF9SRU1BUF9DT05UUk9MICsgcmFkZW9uX2NydGMtPmNydGNfb2Zmc2V0LAorCSAgICAgICAoTklfR1JQSF9HQU1VVF9SRU1BUF9NT0RFKE5JX0dBTVVUX1JFTUFQX0JZUEFTUykgfAorCQlOSV9PVkxfR0FNVVRfUkVNQVBfTU9ERShOSV9HQU1VVF9SRU1BUF9CWVBBU1MpKSk7CisJV1JFRzMyKE5JX1JFR0FNTUFfQ09OVFJPTCArIHJhZGVvbl9jcnRjLT5jcnRjX29mZnNldCwKKwkgICAgICAgKE5JX0dSUEhfUkVHQU1NQV9NT0RFKE5JX1JFR0FNTUFfQllQQVNTKSB8CisJCU5JX09WTF9SRUdBTU1BX01PREUoTklfUkVHQU1NQV9CWVBBU1MpKSk7CisJV1JFRzMyKE5JX09VVFBVVF9DU0NfQ09OVFJPTCArIHJhZGVvbl9jcnRjLT5jcnRjX29mZnNldCwKKwkgICAgICAgKE5JX09VVFBVVF9DU0NfR1JQSF9NT0RFKE5JX09VVFBVVF9DU0NfQllQQVNTKSB8CisJCU5JX09VVFBVVF9DU0NfT1ZMX01PREUoTklfT1VUUFVUX0NTQ19CWVBBU1MpKSk7CisJLyogWFhYIG1hdGNoIHRoaXMgdG8gdGhlIGRlcHRoIG9mIHRoZSBjcnRjIGZtdCBibG9jaywgbW92ZSB0byBtb2Rlc2V0PyAqLworCVdSRUczMigweDY5NDAgKyByYWRlb25fY3J0Yy0+Y3J0Y19vZmZzZXQsIDApOworCit9CisKIHN0YXRpYyB2b2lkIGxlZ2FjeV9jcnRjX2xvYWRfbHV0KHN0cnVjdCBkcm1fY3J0YyAqY3J0YykKIHsKIAlzdHJ1Y3QgcmFkZW9uX2NydGMgKnJhZGVvbl9jcnRjID0gdG9fcmFkZW9uX2NydGMoY3J0Yyk7CkBAIC0xMzAsOCArMTkwLDEwIEBACiAJaWYgKCFjcnRjLT5lbmFibGVkKQogCQlyZXR1cm47CiAKLQlpZiAoQVNJQ19JU19EQ0U0KHJkZXYpKQotCQlldmVyZ3JlZW5fY3J0Y19sb2FkX2x1dChjcnRjKTsKKwlpZiAoQVNJQ19JU19EQ0U1KHJkZXYpKQorCQlkY2U1X2NydGNfbG9hZF9sdXQoY3J0Yyk7CisJZWxzZSBpZiAoQVNJQ19JU19EQ0U0KHJkZXYpKQorCQlkY2U0X2NydGNfbG9hZF9sdXQoY3J0Yyk7CiAJZWxzZSBpZiAoQVNJQ19JU19BVklWTyhyZGV2KSkKIAkJYXZpdm9fY3J0Y19sb2FkX2x1dChjcnRjKTsKIAllbHNlCkBAIC0xODMsMTIgKzI0NSwyNzIgQEAKIAlrZnJlZShyYWRlb25fY3J0Yyk7CiB9CiAKKy8qCisgKiBIYW5kbGUgdW5waW4gZXZlbnRzIG91dHNpZGUgdGhlIGludGVycnVwdCBoYW5kbGVyIHByb3Blci4KKyAqLworc3RhdGljIHZvaWQgcmFkZW9uX3VucGluX3dvcmtfZnVuYyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKl9fd29yaykKK3sKKwlzdHJ1Y3QgcmFkZW9uX3VucGluX3dvcmsgKndvcmsgPQorCQljb250YWluZXJfb2YoX193b3JrLCBzdHJ1Y3QgcmFkZW9uX3VucGluX3dvcmssIHdvcmspOworCWludCByOworCisJLyogdW5waW4gb2YgdGhlIG9sZCBidWZmZXIgKi8KKwlyID0gcmFkZW9uX2JvX3Jlc2VydmUod29yay0+b2xkX3JibywgZmFsc2UpOworCWlmIChsaWtlbHkociA9PSAwKSkgeworCQlyID0gcmFkZW9uX2JvX3VucGluKHdvcmstPm9sZF9yYm8pOworCQlpZiAodW5saWtlbHkociAhPSAwKSkgeworCQkJRFJNX0VSUk9SKCJmYWlsZWQgdG8gdW5waW4gYnVmZmVyIGFmdGVyIGZsaXBcbiIpOworCQl9CisJCXJhZGVvbl9ib191bnJlc2VydmUod29yay0+b2xkX3Jibyk7CisJfSBlbHNlCisJCURSTV9FUlJPUigiZmFpbGVkIHRvIHJlc2VydmUgYnVmZmVyIGFmdGVyIGZsaXBcbiIpOworCWtmcmVlKHdvcmspOworfQorCit2b2lkIHJhZGVvbl9jcnRjX2hhbmRsZV9mbGlwKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LCBpbnQgY3J0Y19pZCkKK3sKKwlzdHJ1Y3QgcmFkZW9uX2NydGMgKnJhZGVvbl9jcnRjID0gcmRldi0+bW9kZV9pbmZvLmNydGNzW2NydGNfaWRdOworCXN0cnVjdCByYWRlb25fdW5waW5fd29yayAqd29yazsKKwlzdHJ1Y3QgZHJtX3BlbmRpbmdfdmJsYW5rX2V2ZW50ICplOworCXN0cnVjdCB0aW1ldmFsIG5vdzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXUzMiB1cGRhdGVfcGVuZGluZzsKKwlpbnQgdnBvcywgaHBvczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZyZGV2LT5kZGV2LT5ldmVudF9sb2NrLCBmbGFncyk7CisJd29yayA9IHJhZGVvbl9jcnRjLT51bnBpbl93b3JrOworCWlmICh3b3JrID09IE5VTEwgfHwKKwkgICAgIXJhZGVvbl9mZW5jZV9zaWduYWxlZCh3b3JrLT5mZW5jZSkpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcmRldi0+ZGRldi0+ZXZlbnRfbG9jaywgZmxhZ3MpOworCQlyZXR1cm47CisJfQorCS8qIE5ldyBwYWdlZmxpcCwgb3IganVzdCBjb21wbGV0aW9uIG9mIGEgcHJldmlvdXMgb25lPyAqLworCWlmICghcmFkZW9uX2NydGMtPmRlZmVycmVkX2ZsaXBfY29tcGxldGlvbikgeworCQkvKiBkbyB0aGUgZmxpcCAobW1pbykgKi8KKwkJdXBkYXRlX3BlbmRpbmcgPSByYWRlb25fcGFnZV9mbGlwKHJkZXYsIGNydGNfaWQsIHdvcmstPm5ld19jcnRjX2Jhc2UpOworCX0gZWxzZSB7CisJCS8qIFRoaXMgaXMganVzdCBhIGNvbXBsZXRpb24gb2YgYSBmbGlwIHF1ZXVlZCBpbiBjcnRjCisJCSAqIGF0IGxhc3QgaW52b2NhdGlvbi4gTWFrZSBzdXJlIHdlIGdvIGRpcmVjdGx5IHRvCisJCSAqIGNvbXBsZXRpb24gcm91dGluZS4KKwkJICovCisJCXVwZGF0ZV9wZW5kaW5nID0gMDsKKwkJcmFkZW9uX2NydGMtPmRlZmVycmVkX2ZsaXBfY29tcGxldGlvbiA9IDA7CisJfQorCisJLyogSGFzIHRoZSBwYWdlZmxpcCBhbHJlYWR5IGNvbXBsZXRlZCBpbiBjcnRjLCBvciBpcyBpdCBjZXJ0YWluCisJICogdG8gY29tcGxldGUgaW4gdGhpcyB2Ymxhbms/CisJICovCisJaWYgKHVwZGF0ZV9wZW5kaW5nICYmCisJICAgIChEUk1fU0NBTk9VVFBPU19WQUxJRCAmIHJhZGVvbl9nZXRfY3J0Y19zY2Fub3V0cG9zKHJkZXYtPmRkZXYsIGNydGNfaWQsCisJCQkJCQkJICAgICAgICZ2cG9zLCAmaHBvcykpICYmCisJICAgICh2cG9zID49MCkgJiYKKwkgICAgKHZwb3MgPCAoOTkgKiByZGV2LT5tb2RlX2luZm8uY3J0Y3NbY3J0Y19pZF0tPmJhc2UuaHdtb2RlLmNydGNfdmRpc3BsYXkpLzEwMCkpIHsKKwkJLyogY3J0YyBkaWRuJ3QgZmxpcCBpbiB0aGlzIHRhcmdldCB2YmxhbmsgaW50ZXJ2YWwsCisJCSAqIGJ1dCBmbGlwIGlzIHBlbmRpbmcgaW4gY3J0Yy4gSXQgd2lsbCBjb21wbGV0ZSBpdAorCQkgKiBpbiBuZXh0IHZibGFuayBpbnRlcnZhbCwgc28gY29tcGxldGUgdGhlIGZsaXAgYXQKKwkJICogbmV4dCB2YmxhbmsgaXJxLgorCQkgKi8KKwkJcmFkZW9uX2NydGMtPmRlZmVycmVkX2ZsaXBfY29tcGxldGlvbiA9IDE7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJkZXYtPmRkZXYtPmV2ZW50X2xvY2ssIGZsYWdzKTsKKwkJcmV0dXJuOworCX0KKworCS8qIFBhZ2VmbGlwICh3aWxsIGJlKSBjZXJ0YWlubHkgY29tcGxldGVkIGluIHRoaXMgdmJsYW5rLiBDbGVhbiB1cC4gKi8KKwlyYWRlb25fY3J0Yy0+dW5waW5fd29yayA9IE5VTEw7CisKKwkvKiB3YWtldXAgdXNlcnNwYWNlICovCisJaWYgKHdvcmstPmV2ZW50KSB7CisJCWUgPSB3b3JrLT5ldmVudDsKKwkJZS0+ZXZlbnQuc2VxdWVuY2UgPSBkcm1fdmJsYW5rX2NvdW50X2FuZF90aW1lKHJkZXYtPmRkZXYsIGNydGNfaWQsICZub3cpOworCQllLT5ldmVudC50dl9zZWMgPSBub3cudHZfc2VjOworCQllLT5ldmVudC50dl91c2VjID0gbm93LnR2X3VzZWM7CisJCWxpc3RfYWRkX3RhaWwoJmUtPmJhc2UubGluaywgJmUtPmJhc2UuZmlsZV9wcml2LT5ldmVudF9saXN0KTsKKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZlLT5iYXNlLmZpbGVfcHJpdi0+ZXZlbnRfd2FpdCk7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJkZXYtPmRkZXYtPmV2ZW50X2xvY2ssIGZsYWdzKTsKKworCWRybV92YmxhbmtfcHV0KHJkZXYtPmRkZXYsIHJhZGVvbl9jcnRjLT5jcnRjX2lkKTsKKwlyYWRlb25fZmVuY2VfdW5yZWYoJndvcmstPmZlbmNlKTsKKwlyYWRlb25fcG9zdF9wYWdlX2ZsaXAod29yay0+cmRldiwgd29yay0+Y3J0Y19pZCk7CisJc2NoZWR1bGVfd29yaygmd29yay0+d29yayk7Cit9CisKK3N0YXRpYyBpbnQgcmFkZW9uX2NydGNfcGFnZV9mbGlwKHN0cnVjdCBkcm1fY3J0YyAqY3J0YywKKwkJCQkgc3RydWN0IGRybV9mcmFtZWJ1ZmZlciAqZmIsCisJCQkJIHN0cnVjdCBkcm1fcGVuZGluZ192YmxhbmtfZXZlbnQgKmV2ZW50KQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjcnRjLT5kZXY7CisJc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCByYWRlb25fY3J0YyAqcmFkZW9uX2NydGMgPSB0b19yYWRlb25fY3J0YyhjcnRjKTsKKwlzdHJ1Y3QgcmFkZW9uX2ZyYW1lYnVmZmVyICpvbGRfcmFkZW9uX2ZiOworCXN0cnVjdCByYWRlb25fZnJhbWVidWZmZXIgKm5ld19yYWRlb25fZmI7CisJc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmo7CisJc3RydWN0IHJhZGVvbl9ibyAqcmJvOworCXN0cnVjdCByYWRlb25fZmVuY2UgKmZlbmNlOworCXN0cnVjdCByYWRlb25fdW5waW5fd29yayAqd29yazsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXUzMiB0aWxpbmdfZmxhZ3MsIHBpdGNoX3BpeGVsczsKKwl1NjQgYmFzZTsKKwlpbnQgcjsKKworCXdvcmsgPSBremFsbG9jKHNpemVvZiAqd29yaywgR0ZQX0tFUk5FTCk7CisJaWYgKHdvcmsgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyID0gcmFkZW9uX2ZlbmNlX2NyZWF0ZShyZGV2LCAmZmVuY2UpOworCWlmICh1bmxpa2VseShyICE9IDApKSB7CisJCWtmcmVlKHdvcmspOworCQlEUk1fRVJST1IoImZsaXAgcXVldWU6IGZhaWxlZCB0byBjcmVhdGUgZmVuY2UuXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCXdvcmstPmV2ZW50ID0gZXZlbnQ7CisJd29yay0+cmRldiA9IHJkZXY7CisJd29yay0+Y3J0Y19pZCA9IHJhZGVvbl9jcnRjLT5jcnRjX2lkOworCXdvcmstPmZlbmNlID0gcmFkZW9uX2ZlbmNlX3JlZihmZW5jZSk7CisJb2xkX3JhZGVvbl9mYiA9IHRvX3JhZGVvbl9mcmFtZWJ1ZmZlcihjcnRjLT5mYik7CisJbmV3X3JhZGVvbl9mYiA9IHRvX3JhZGVvbl9mcmFtZWJ1ZmZlcihmYik7CisJLyogc2NoZWR1bGUgdW5waW4gb2YgdGhlIG9sZCBidWZmZXIgKi8KKwlvYmogPSBvbGRfcmFkZW9uX2ZiLT5vYmo7CisJcmJvID0gb2JqLT5kcml2ZXJfcHJpdmF0ZTsKKwl3b3JrLT5vbGRfcmJvID0gcmJvOworCUlOSVRfV09SSygmd29yay0+d29yaywgcmFkZW9uX3VucGluX3dvcmtfZnVuYyk7CisKKwkvKiBXZSBib3Jyb3cgdGhlIGV2ZW50IHNwaW4gbG9jayBmb3IgcHJvdGVjdGluZyB1bnBpbl93b3JrICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+ZXZlbnRfbG9jaywgZmxhZ3MpOworCWlmIChyYWRlb25fY3J0Yy0+dW5waW5fd29yaykgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPmV2ZW50X2xvY2ssIGZsYWdzKTsKKwkJa2ZyZWUod29yayk7CisJCXJhZGVvbl9mZW5jZV91bnJlZigmZmVuY2UpOworCisJCURSTV9ERUJVR19EUklWRVIoImZsaXAgcXVldWU6IGNydGMgYWxyZWFkeSBidXN5XG4iKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisJcmFkZW9uX2NydGMtPnVucGluX3dvcmsgPSB3b3JrOworCXJhZGVvbl9jcnRjLT5kZWZlcnJlZF9mbGlwX2NvbXBsZXRpb24gPSAwOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+ZXZlbnRfbG9jaywgZmxhZ3MpOworCisJLyogcGluIHRoZSBuZXcgYnVmZmVyICovCisJb2JqID0gbmV3X3JhZGVvbl9mYi0+b2JqOworCXJibyA9IG9iai0+ZHJpdmVyX3ByaXZhdGU7CisKKwlEUk1fREVCVUdfRFJJVkVSKCJmbGlwLWlvY3RsKCkgY3VyX2ZibyA9ICVwLCBjdXJfYmJvID0gJXBcbiIsCisJCQkgd29yay0+b2xkX3JibywgcmJvKTsKKworCXIgPSByYWRlb25fYm9fcmVzZXJ2ZShyYm8sIGZhbHNlKTsKKwlpZiAodW5saWtlbHkociAhPSAwKSkgeworCQlEUk1fRVJST1IoImZhaWxlZCB0byByZXNlcnZlIG5ldyByYm8gYnVmZmVyIGJlZm9yZSBmbGlwXG4iKTsKKwkJZ290byBwZmxpcF9jbGVhbnVwOworCX0KKwlyID0gcmFkZW9uX2JvX3BpbihyYm8sIFJBREVPTl9HRU1fRE9NQUlOX1ZSQU0sICZiYXNlKTsKKwlpZiAodW5saWtlbHkociAhPSAwKSkgeworCQlyYWRlb25fYm9fdW5yZXNlcnZlKHJibyk7CisJCXIgPSAtRUlOVkFMOworCQlEUk1fRVJST1IoImZhaWxlZCB0byBwaW4gbmV3IHJibyBidWZmZXIgYmVmb3JlIGZsaXBcbiIpOworCQlnb3RvIHBmbGlwX2NsZWFudXA7CisJfQorCXJhZGVvbl9ib19nZXRfdGlsaW5nX2ZsYWdzKHJibywgJnRpbGluZ19mbGFncywgTlVMTCk7CisJcmFkZW9uX2JvX3VucmVzZXJ2ZShyYm8pOworCisJaWYgKCFBU0lDX0lTX0FWSVZPKHJkZXYpKSB7CisJCS8qIGNydGMgb2Zmc2V0IGlzIGZyb20gZGlzcGxheSBiYXNlIGFkZHIgbm90IEZCIGxvY2F0aW9uICovCisJCWJhc2UgLT0gcmFkZW9uX2NydGMtPmxlZ2FjeV9kaXNwbGF5X2Jhc2VfYWRkcjsKKwkJcGl0Y2hfcGl4ZWxzID0gZmItPnBpdGNoIC8gKGZiLT5iaXRzX3Blcl9waXhlbCAvIDgpOworCisJCWlmICh0aWxpbmdfZmxhZ3MgJiBSQURFT05fVElMSU5HX01BQ1JPKSB7CisJCQlpZiAoQVNJQ19JU19SMzAwKHJkZXYpKSB7CisJCQkJYmFzZSAmPSB+MHg3ZmY7CisJCQl9IGVsc2UgeworCQkJCWludCBieXRlc2hpZnQgPSBmYi0+Yml0c19wZXJfcGl4ZWwgPj4gNDsKKwkJCQlpbnQgdGlsZV9hZGRyID0gKCgoY3J0Yy0+eSA+PiAzKSAqIHBpdGNoX3BpeGVscyArICBjcnRjLT54KSA+PiAoOCAtIGJ5dGVzaGlmdCkpIDw8IDExOworCQkJCWJhc2UgKz0gdGlsZV9hZGRyICsgKChjcnRjLT54IDw8IGJ5dGVzaGlmdCkgJSAyNTYpICsgKChjcnRjLT55ICUgOCkgPDwgOCk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlpbnQgb2Zmc2V0ID0gY3J0Yy0+eSAqIHBpdGNoX3BpeGVscyArIGNydGMtPng7CisJCQlzd2l0Y2ggKGZiLT5iaXRzX3Blcl9waXhlbCkgeworCQkJY2FzZSA4OgorCQkJZGVmYXVsdDoKKwkJCQlvZmZzZXQgKj0gMTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMTU6CisJCQljYXNlIDE2OgorCQkJCW9mZnNldCAqPSAyOworCQkJCWJyZWFrOworCQkJY2FzZSAyNDoKKwkJCQlvZmZzZXQgKj0gMzsKKwkJCQlicmVhazsKKwkJCWNhc2UgMzI6CisJCQkJb2Zmc2V0ICo9IDQ7CisJCQkJYnJlYWs7CisJCQl9CisJCQliYXNlICs9IG9mZnNldDsKKwkJfQorCQliYXNlICY9IH43OworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPmV2ZW50X2xvY2ssIGZsYWdzKTsKKwl3b3JrLT5uZXdfY3J0Y19iYXNlID0gYmFzZTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPmV2ZW50X2xvY2ssIGZsYWdzKTsKKworCS8qIHVwZGF0ZSBjcnRjIGZiICovCisJY3J0Yy0+ZmIgPSBmYjsKKworCXIgPSBkcm1fdmJsYW5rX2dldChkZXYsIHJhZGVvbl9jcnRjLT5jcnRjX2lkKTsKKwlpZiAocikgeworCQlEUk1fRVJST1IoImZhaWxlZCB0byBnZXQgdmJsYW5rIGJlZm9yZSBmbGlwXG4iKTsKKwkJZ290byBwZmxpcF9jbGVhbnVwMTsKKwl9CisKKwkvKiAzMiBvdWdodCB0byBjb3ZlciB1cyAqLworCXIgPSByYWRlb25fcmluZ19sb2NrKHJkZXYsIDMyKTsKKwlpZiAocikgeworCQlEUk1fRVJST1IoImZhaWxlZCB0byBsb2NrIHRoZSByaW5nIGJlZm9yZSBmbGlwXG4iKTsKKwkJZ290byBwZmxpcF9jbGVhbnVwMjsKKwl9CisKKwkvKiBlbWl0IHRoZSBmZW5jZSAqLworCXJhZGVvbl9mZW5jZV9lbWl0KHJkZXYsIGZlbmNlKTsKKwkvKiBzZXQgdGhlIHByb3BlciBpbnRlcnJ1cHQgKi8KKwlyYWRlb25fcHJlX3BhZ2VfZmxpcChyZGV2LCByYWRlb25fY3J0Yy0+Y3J0Y19pZCk7CisJLyogZmlyZSB0aGUgcmluZyAqLworCXJhZGVvbl9yaW5nX3VubG9ja19jb21taXQocmRldik7CisKKwlyZXR1cm4gMDsKKworcGZsaXBfY2xlYW51cDI6CisJZHJtX3ZibGFua19wdXQoZGV2LCByYWRlb25fY3J0Yy0+Y3J0Y19pZCk7CisKK3BmbGlwX2NsZWFudXAxOgorCXIgPSByYWRlb25fYm9fcmVzZXJ2ZShyYm8sIGZhbHNlKTsKKwlpZiAodW5saWtlbHkociAhPSAwKSkgeworCQlEUk1fRVJST1IoImZhaWxlZCB0byByZXNlcnZlIG5ldyByYm8gaW4gZXJyb3IgcGF0aFxuIik7CisJCWdvdG8gcGZsaXBfY2xlYW51cDsKKwl9CisJciA9IHJhZGVvbl9ib191bnBpbihyYm8pOworCWlmICh1bmxpa2VseShyICE9IDApKSB7CisJCXJhZGVvbl9ib191bnJlc2VydmUocmJvKTsKKwkJciA9IC1FSU5WQUw7CisJCURSTV9FUlJPUigiZmFpbGVkIHRvIHVucGluIG5ldyByYm8gaW4gZXJyb3IgcGF0aFxuIik7CisJCWdvdG8gcGZsaXBfY2xlYW51cDsKKwl9CisJcmFkZW9uX2JvX3VucmVzZXJ2ZShyYm8pOworCitwZmxpcF9jbGVhbnVwOgorCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPmV2ZW50X2xvY2ssIGZsYWdzKTsKKwlyYWRlb25fY3J0Yy0+dW5waW5fd29yayA9IE5VTEw7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5ldmVudF9sb2NrLCBmbGFncyk7CisJcmFkZW9uX2ZlbmNlX3VucmVmKCZmZW5jZSk7CisJa2ZyZWUod29yayk7CisKKwlyZXR1cm4gcjsKK30KKwogc3RhdGljIGNvbnN0IHN0cnVjdCBkcm1fY3J0Y19mdW5jcyByYWRlb25fY3J0Y19mdW5jcyA9IHsKIAkuY3Vyc29yX3NldCA9IHJhZGVvbl9jcnRjX2N1cnNvcl9zZXQsCiAJLmN1cnNvcl9tb3ZlID0gcmFkZW9uX2NydGNfY3Vyc29yX21vdmUsCiAJLmdhbW1hX3NldCA9IHJhZGVvbl9jcnRjX2dhbW1hX3NldCwKIAkuc2V0X2NvbmZpZyA9IGRybV9jcnRjX2hlbHBlcl9zZXRfY29uZmlnLAogCS5kZXN0cm95ID0gcmFkZW9uX2NydGNfZGVzdHJveSwKKwkucGFnZV9mbGlwID0gcmFkZW9uX2NydGNfcGFnZV9mbGlwLAogfTsKIAogc3RhdGljIHZvaWQgcmFkZW9uX2NydGNfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgaW5kZXgpCkBAIC0yMjUsNyArNTQ3LDcgQEAKIAkJcmFkZW9uX2xlZ2FjeV9pbml0X2NydGMoZGV2LCByYWRlb25fY3J0Yyk7CiB9CiAKLXN0YXRpYyBjb25zdCBjaGFyICplbmNvZGVyX25hbWVzWzM0XSA9IHsKK3N0YXRpYyBjb25zdCBjaGFyICplbmNvZGVyX25hbWVzWzM2XSA9IHsKIAkiTk9ORSIsCiAJIklOVEVSTkFMX0xWRFMiLAogCSJJTlRFUk5BTF9UTURTMSIsCkBAIC0yNjAsNiArNTgyLDggQEAKIAkiSU5URVJOQUxfS0xEU0NQX0xWVE1BIiwKIAkiSU5URVJOQUxfVU5JUEhZMSIsCiAJIklOVEVSTkFMX1VOSVBIWTIiLAorCSJOVVRNRUciLAorCSJUUkFWSVMiLAogfTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKmNvbm5lY3Rvcl9uYW1lc1sxNV0gPSB7CkBAIC00MTcsOSArNzQxLDE3IEBACiAJaWYgKCFyYWRlb25fY29ubmVjdG9yLT5lZGlkKSB7CiAJCXJhZGVvbl9jb25uZWN0b3ItPmVkaWQgPSBkcm1fZ2V0X2VkaWQoJnJhZGVvbl9jb25uZWN0b3ItPmJhc2UsICZyYWRlb25fY29ubmVjdG9yLT5kZGNfYnVzLT5hZGFwdGVyKTsKIAl9Ci0JLyogc29tZSBzZXJ2ZXJzIHByb3ZpZGUgYSBoYXJkY29kZWQgZWRpZCBpbiByb20gZm9yIEtWTXMgKi8KLQlpZiAoIXJhZGVvbl9jb25uZWN0b3ItPmVkaWQpCi0JCXJhZGVvbl9jb25uZWN0b3ItPmVkaWQgPSByYWRlb25fY29tYmlvc19nZXRfaGFyZGNvZGVkX2VkaWQocmRldik7CisKKwlpZiAoIXJhZGVvbl9jb25uZWN0b3ItPmVkaWQpIHsKKwkJaWYgKHJkZXYtPmlzX2F0b21fYmlvcykgeworCQkJLyogc29tZSBsYXB0b3BzIHByb3ZpZGUgYSBoYXJkY29kZWQgZWRpZCBpbiByb20gZm9yIExDRHMgKi8KKwkJCWlmICgoKHJhZGVvbl9jb25uZWN0b3ItPmJhc2UuY29ubmVjdG9yX3R5cGUgPT0gRFJNX01PREVfQ09OTkVDVE9SX0xWRFMpIHx8CisJCQkgICAgIChyYWRlb25fY29ubmVjdG9yLT5iYXNlLmNvbm5lY3Rvcl90eXBlID09IERSTV9NT0RFX0NPTk5FQ1RPUl9lRFApKSkKKwkJCQlyYWRlb25fY29ubmVjdG9yLT5lZGlkID0gcmFkZW9uX2Jpb3NfZ2V0X2hhcmRjb2RlZF9lZGlkKHJkZXYpOworCQl9IGVsc2UKKwkJCS8qIHNvbWUgc2VydmVycyBwcm92aWRlIGEgaGFyZGNvZGVkIGVkaWQgaW4gcm9tIGZvciBLVk1zICovCisJCQlyYWRlb25fY29ubmVjdG9yLT5lZGlkID0gcmFkZW9uX2Jpb3NfZ2V0X2hhcmRjb2RlZF9lZGlkKHJkZXYpOworCX0KIAlpZiAocmFkZW9uX2Nvbm5lY3Rvci0+ZWRpZCkgewogCQlkcm1fbW9kZV9jb25uZWN0b3JfdXBkYXRlX2VkaWRfcHJvcGVydHkoJnJhZGVvbl9jb25uZWN0b3ItPmJhc2UsIHJhZGVvbl9jb25uZWN0b3ItPmVkaWQpOwogCQlyZXQgPSBkcm1fYWRkX2VkaWRfbW9kZXMoJnJhZGVvbl9jb25uZWN0b3ItPmJhc2UsIHJhZGVvbl9jb25uZWN0b3ItPmVkaWQpOwpAQCAtODQ5LDcgKzExODEsMTAgQEAKIAogCXJkZXYtPmRkZXYtPm1vZGVfY29uZmlnLmZ1bmNzID0gKHZvaWQgKikmcmFkZW9uX21vZGVfZnVuY3M7CiAKLQlpZiAoQVNJQ19JU19BVklWTyhyZGV2KSkgeworCWlmIChBU0lDX0lTX0RDRTUocmRldikpIHsKKwkJcmRldi0+ZGRldi0+bW9kZV9jb25maWcubWF4X3dpZHRoID0gMTYzODQ7CisJCXJkZXYtPmRkZXYtPm1vZGVfY29uZmlnLm1heF9oZWlnaHQgPSAxNjM4NDsKKwl9IGVsc2UgaWYgKEFTSUNfSVNfQVZJVk8ocmRldikpIHsKIAkJcmRldi0+ZGRldi0+bW9kZV9jb25maWcubWF4X3dpZHRoID0gODE5MjsKIAkJcmRldi0+ZGRldi0+bW9kZV9jb25maWcubWF4X2hlaWdodCA9IDgxOTI7CiAJfSBlbHNlIHsKQEAgLTEwMTksNyArMTM1NCw3IEBACiAvKgogICogUmV0cmlldmUgY3VycmVudCB2aWRlbyBzY2Fub3V0IHBvc2l0aW9uIG9mIGNydGMgb24gYSBnaXZlbiBncHUuCiAgKgotICogXHBhcmFtIHJkZXYgRGV2aWNlIHRvIHF1ZXJ5LgorICogXHBhcmFtIGRldiBEZXZpY2UgdG8gcXVlcnkuCiAgKiBccGFyYW0gY3J0YyBDcnRjIHRvIHF1ZXJ5LgogICogXHBhcmFtICp2cG9zIExvY2F0aW9uIHdoZXJlIHZlcnRpY2FsIHNjYW5vdXQgcG9zaXRpb24gc2hvdWxkIGJlIHN0b3JlZC4KICAqIFxwYXJhbSAqaHBvcyBMb2NhdGlvbiB3aGVyZSBob3Jpem9udGFsIHNjYW5vdXQgcG9zaXRpb24gc2hvdWxkIGdvLgpAQCAtMTAzMSw3MiArMTM2Niw3NCBAQAogICoKICAqIFxyZXR1cm4gRmxhZ3MsIG9yJ2VkIHRvZ2V0aGVyIGFzIGZvbGxvd3M6CiAgKgotICogUkFERU9OX1NDQU5PVVRQT1NfVkFMSUQgPSBRdWVyeSBzdWNjZXNzZnVsbC4KLSAqIFJBREVPTl9TQ0FOT1VUUE9TX0lOVkJMID0gSW5zaWRlIHZibGFuay4KLSAqIFJBREVPTl9TQ0FOT1VUUE9TX0FDQ1VSQVRFID0gUmV0dXJuZWQgcG9zaXRpb24gaXMgYWNjdXJhdGUuIEEgbGFjayBvZgorICogRFJNX1NDQU5PVVRQT1NfVkFMSUQgPSBRdWVyeSBzdWNjZXNzZnVsbC4KKyAqIERSTV9TQ0FOT1VUUE9TX0lOVkJMID0gSW5zaWRlIHZibGFuay4KKyAqIERSTV9TQ0FOT1VUUE9TX0FDQ1VSQVRFID0gUmV0dXJuZWQgcG9zaXRpb24gaXMgYWNjdXJhdGUuIEEgbGFjayBvZgogICogdGhpcyBmbGFnIG1lYW5zIHRoYXQgcmV0dXJuZWQgcG9zaXRpb24gbWF5IGJlIG9mZnNldCBieSBhIGNvbnN0YW50IGJ1dAogICogdW5rbm93biBzbWFsbCBudW1iZXIgb2Ygc2NhbmxpbmVzIHdydC4gcmVhbCBzY2Fub3V0IHBvc2l0aW9uLgogICoKICAqLwotaW50IHJhZGVvbl9nZXRfY3J0Y19zY2Fub3V0cG9zKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LCBpbnQgY3J0YywgaW50ICp2cG9zLCBpbnQgKmhwb3MpCitpbnQgcmFkZW9uX2dldF9jcnRjX3NjYW5vdXRwb3Moc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGNydGMsIGludCAqdnBvcywgaW50ICpocG9zKQogewogCXUzMiBzdGF0X2NydGMgPSAwLCB2YmwgPSAwLCBwb3NpdGlvbiA9IDA7CiAJaW50IHZibF9zdGFydCwgdmJsX2VuZCwgdnRvdGFsLCByZXQgPSAwOwogCWJvb2wgaW5fdmJsID0gdHJ1ZTsKIAorCXN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwogCWlmIChBU0lDX0lTX0RDRTQocmRldikpIHsKIAkJaWYgKGNydGMgPT0gMCkgewogCQkJdmJsID0gUlJFRzMyKEVWRVJHUkVFTl9DUlRDX1ZfQkxBTktfU1RBUlRfRU5EICsKIAkJCQkgICAgIEVWRVJHUkVFTl9DUlRDMF9SRUdJU1RFUl9PRkZTRVQpOwogCQkJcG9zaXRpb24gPSBSUkVHMzIoRVZFUkdSRUVOX0NSVENfU1RBVFVTX1BPU0lUSU9OICsKIAkJCQkJICBFVkVSR1JFRU5fQ1JUQzBfUkVHSVNURVJfT0ZGU0VUKTsKLQkJCXJldCB8PSBSQURFT05fU0NBTk9VVFBPU19WQUxJRDsKKwkJCXJldCB8PSBEUk1fU0NBTk9VVFBPU19WQUxJRDsKIAkJfQogCQlpZiAoY3J0YyA9PSAxKSB7CiAJCQl2YmwgPSBSUkVHMzIoRVZFUkdSRUVOX0NSVENfVl9CTEFOS19TVEFSVF9FTkQgKwogCQkJCSAgICAgRVZFUkdSRUVOX0NSVEMxX1JFR0lTVEVSX09GRlNFVCk7CiAJCQlwb3NpdGlvbiA9IFJSRUczMihFVkVSR1JFRU5fQ1JUQ19TVEFUVVNfUE9TSVRJT04gKwogCQkJCQkgIEVWRVJHUkVFTl9DUlRDMV9SRUdJU1RFUl9PRkZTRVQpOwotCQkJcmV0IHw9IFJBREVPTl9TQ0FOT1VUUE9TX1ZBTElEOworCQkJcmV0IHw9IERSTV9TQ0FOT1VUUE9TX1ZBTElEOwogCQl9CiAJCWlmIChjcnRjID09IDIpIHsKIAkJCXZibCA9IFJSRUczMihFVkVSR1JFRU5fQ1JUQ19WX0JMQU5LX1NUQVJUX0VORCArCiAJCQkJICAgICBFVkVSR1JFRU5fQ1JUQzJfUkVHSVNURVJfT0ZGU0VUKTsKIAkJCXBvc2l0aW9uID0gUlJFRzMyKEVWRVJHUkVFTl9DUlRDX1NUQVRVU19QT1NJVElPTiArCiAJCQkJCSAgRVZFUkdSRUVOX0NSVEMyX1JFR0lTVEVSX09GRlNFVCk7Ci0JCQlyZXQgfD0gUkFERU9OX1NDQU5PVVRQT1NfVkFMSUQ7CisJCQlyZXQgfD0gRFJNX1NDQU5PVVRQT1NfVkFMSUQ7CiAJCX0KIAkJaWYgKGNydGMgPT0gMykgewogCQkJdmJsID0gUlJFRzMyKEVWRVJHUkVFTl9DUlRDX1ZfQkxBTktfU1RBUlRfRU5EICsKIAkJCQkgICAgIEVWRVJHUkVFTl9DUlRDM19SRUdJU1RFUl9PRkZTRVQpOwogCQkJcG9zaXRpb24gPSBSUkVHMzIoRVZFUkdSRUVOX0NSVENfU1RBVFVTX1BPU0lUSU9OICsKIAkJCQkJICBFVkVSR1JFRU5fQ1JUQzNfUkVHSVNURVJfT0ZGU0VUKTsKLQkJCXJldCB8PSBSQURFT05fU0NBTk9VVFBPU19WQUxJRDsKKwkJCXJldCB8PSBEUk1fU0NBTk9VVFBPU19WQUxJRDsKIAkJfQogCQlpZiAoY3J0YyA9PSA0KSB7CiAJCQl2YmwgPSBSUkVHMzIoRVZFUkdSRUVOX0NSVENfVl9CTEFOS19TVEFSVF9FTkQgKwogCQkJCSAgICAgRVZFUkdSRUVOX0NSVEM0X1JFR0lTVEVSX09GRlNFVCk7CiAJCQlwb3NpdGlvbiA9IFJSRUczMihFVkVSR1JFRU5fQ1JUQ19TVEFUVVNfUE9TSVRJT04gKwogCQkJCQkgIEVWRVJHUkVFTl9DUlRDNF9SRUdJU1RFUl9PRkZTRVQpOwotCQkJcmV0IHw9IFJBREVPTl9TQ0FOT1VUUE9TX1ZBTElEOworCQkJcmV0IHw9IERSTV9TQ0FOT1VUUE9TX1ZBTElEOwogCQl9CiAJCWlmIChjcnRjID09IDUpIHsKIAkJCXZibCA9IFJSRUczMihFVkVSR1JFRU5fQ1JUQ19WX0JMQU5LX1NUQVJUX0VORCArCiAJCQkJICAgICBFVkVSR1JFRU5fQ1JUQzVfUkVHSVNURVJfT0ZGU0VUKTsKIAkJCXBvc2l0aW9uID0gUlJFRzMyKEVWRVJHUkVFTl9DUlRDX1NUQVRVU19QT1NJVElPTiArCiAJCQkJCSAgRVZFUkdSRUVOX0NSVEM1X1JFR0lTVEVSX09GRlNFVCk7Ci0JCQlyZXQgfD0gUkFERU9OX1NDQU5PVVRQT1NfVkFMSUQ7CisJCQlyZXQgfD0gRFJNX1NDQU5PVVRQT1NfVkFMSUQ7CiAJCX0KIAl9IGVsc2UgaWYgKEFTSUNfSVNfQVZJVk8ocmRldikpIHsKIAkJaWYgKGNydGMgPT0gMCkgewogCQkJdmJsID0gUlJFRzMyKEFWSVZPX0QxQ1JUQ19WX0JMQU5LX1NUQVJUX0VORCk7CiAJCQlwb3NpdGlvbiA9IFJSRUczMihBVklWT19EMUNSVENfU1RBVFVTX1BPU0lUSU9OKTsKLQkJCXJldCB8PSBSQURFT05fU0NBTk9VVFBPU19WQUxJRDsKKwkJCXJldCB8PSBEUk1fU0NBTk9VVFBPU19WQUxJRDsKIAkJfQogCQlpZiAoY3J0YyA9PSAxKSB7CiAJCQl2YmwgPSBSUkVHMzIoQVZJVk9fRDJDUlRDX1ZfQkxBTktfU1RBUlRfRU5EKTsKIAkJCXBvc2l0aW9uID0gUlJFRzMyKEFWSVZPX0QyQ1JUQ19TVEFUVVNfUE9TSVRJT04pOwotCQkJcmV0IHw9IFJBREVPTl9TQ0FOT1VUUE9TX1ZBTElEOworCQkJcmV0IHw9IERSTV9TQ0FOT1VUUE9TX1ZBTElEOwogCQl9CiAJfSBlbHNlIHsKIAkJLyogUHJlLUFWSVZPOiBEaWZmZXJlbnQgZW5jb2Rpbmcgb2Ygc2Nhbm91dCBwb3MgYW5kIHZibGFuayBpbnRlcnZhbC4gKi8KQEAgLTExMTIsNyArMTQ0OSw3IEBACiAJCQlpZiAoIShzdGF0X2NydGMgJiAxKSkKIAkJCQlpbl92YmwgPSBmYWxzZTsKIAotCQkJcmV0IHw9IFJBREVPTl9TQ0FOT1VUUE9TX1ZBTElEOworCQkJcmV0IHw9IERSTV9TQ0FOT1VUUE9TX1ZBTElEOwogCQl9CiAJCWlmIChjcnRjID09IDEpIHsKIAkJCXZibCA9IChSUkVHMzIoUkFERU9OX0NSVEMyX1ZfVE9UQUxfRElTUCkgJgpAQCAtMTEyMiw3ICsxNDU5LDcgQEAKIAkJCWlmICghKHN0YXRfY3J0YyAmIDEpKQogCQkJCWluX3ZibCA9IGZhbHNlOwogCi0JCQlyZXQgfD0gUkFERU9OX1NDQU5PVVRQT1NfVkFMSUQ7CisJCQlyZXQgfD0gRFJNX1NDQU5PVVRQT1NfVkFMSUQ7CiAJCX0KIAl9CiAKQEAgLTExMzMsMTMgKzE0NzAsMTMgQEAKIAkvKiBWYWxpZCB2YmxhbmsgYXJlYSBib3VuZGFyaWVzIGZyb20gZ3B1IHJldHJpZXZlZD8gKi8KIAlpZiAodmJsID4gMCkgewogCQkvKiBZZXM6IERlY29kZS4gKi8KLQkJcmV0IHw9IFJBREVPTl9TQ0FOT1VUUE9TX0FDQ1VSQVRFOworCQlyZXQgfD0gRFJNX1NDQU5PVVRQT1NfQUNDVVJBVEU7CiAJCXZibF9zdGFydCA9IHZibCAmIDB4MWZmZjsKIAkJdmJsX2VuZCA9ICh2YmwgPj4gMTYpICYgMHgxZmZmOwogCX0KIAllbHNlIHsKIAkJLyogTm86IEZha2Ugc29tZXRoaW5nIHJlYXNvbmFibGUgd2hpY2ggZ2l2ZXMgYXQgbGVhc3Qgb2sgcmVzdWx0cy4gKi8KLQkJdmJsX3N0YXJ0ID0gcmRldi0+bW9kZV9pbmZvLmNydGNzW2NydGNdLT5iYXNlLm1vZGUuY3J0Y192ZGlzcGxheTsKKwkJdmJsX3N0YXJ0ID0gcmRldi0+bW9kZV9pbmZvLmNydGNzW2NydGNdLT5iYXNlLmh3bW9kZS5jcnRjX3ZkaXNwbGF5OwogCQl2YmxfZW5kID0gMDsKIAl9CiAKQEAgLTExNTUsNyArMTQ5Miw3IEBACiAKIAkvKiBJbnNpZGUgInVwcGVyIHBhcnQiIG9mIHZibGFuayBhcmVhPyBBcHBseSBjb3JyZWN0aXZlIG9mZnNldCBpZiBzbzogKi8KIAlpZiAoaW5fdmJsICYmICgqdnBvcyA+PSB2Ymxfc3RhcnQpKSB7Ci0JCXZ0b3RhbCA9IHJkZXYtPm1vZGVfaW5mby5jcnRjc1tjcnRjXS0+YmFzZS5tb2RlLmNydGNfdnRvdGFsOworCQl2dG90YWwgPSByZGV2LT5tb2RlX2luZm8uY3J0Y3NbY3J0Y10tPmJhc2UuaHdtb2RlLmNydGNfdnRvdGFsOwogCQkqdnBvcyA9ICp2cG9zIC0gdnRvdGFsOwogCX0KIApAQCAtMTE2NCw3ICsxNTAxLDcgQEAKIAogCS8qIEluIHZibGFuaz8gKi8KIAlpZiAoaW5fdmJsKQotCQlyZXQgfD0gUkFERU9OX1NDQU5PVVRQT1NfSU5WQkw7CisJCXJldCB8PSBEUk1fU0NBTk9VVFBPU19JTlZCTDsKIAogCXJldHVybiByZXQ7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9kcnYuYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2Rydi5jCmluZGV4IDYwZTY4OWYuLmJlNWNiNGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2Rydi5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2Rydi5jCkBAIC00OCw5ICs0OCwxMCBAQAogICogLSAyLjUuMCAtIGFkZCBnZXQgYWNjZWwgMiB0byB3b3JrIGFyb3VuZCBkZHggYnJlYWthZ2UgZm9yIGV2ZXJncmVlbgogICogLSAyLjYuMCAtIGFkZCB0aWxpbmcgY29uZmlnIHF1ZXJ5IChyNnh4KyksIGFkZCBpbml0aWFsIEhpWiBzdXBwb3J0IChyMzAwLT5yNTAwKQogICogICAyLjcuMCAtIGZpeHVwcyBmb3IgcjYwMCAyRCB0aWxpbmcgc3VwcG9ydC4gKG5vIGV4dGVybmFsIEFCSSBjaGFuZ2UpLCBhZGQgZWcgZHluIGdwciByZWdzCisgKiAgIDIuOC4wIC0gcGFnZWZsaXAgc3VwcG9ydCwgcjUwMCBVU19GT1JNQVQgcmVncy4gcjUwMCBBUkdCMjEwMTAxMCBjb2xvcmJ1ZiwgcjMwMC0+cjUwMCBDTUFTSwogICovCiAjZGVmaW5lIEtNU19EUklWRVJfTUFKT1IJMgotI2RlZmluZSBLTVNfRFJJVkVSX01JTk9SCTcKKyNkZWZpbmUgS01TX0RSSVZFUl9NSU5PUgk4CiAjZGVmaW5lIEtNU19EUklWRVJfUEFUQ0hMRVZFTAkwCiBpbnQgcmFkZW9uX2RyaXZlcl9sb2FkX2ttcyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1bnNpZ25lZCBsb25nIGZsYWdzKTsKIGludCByYWRlb25fZHJpdmVyX3VubG9hZF9rbXMoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CkBAIC02Niw2ICs2NywxMCBAQAogdTMyIHJhZGVvbl9nZXRfdmJsYW5rX2NvdW50ZXJfa21zKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBjcnRjKTsKIGludCByYWRlb25fZW5hYmxlX3ZibGFua19rbXMoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGNydGMpOwogdm9pZCByYWRlb25fZGlzYWJsZV92Ymxhbmtfa21zKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBjcnRjKTsKK2ludCByYWRlb25fZ2V0X3ZibGFua190aW1lc3RhbXBfa21zKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBjcnRjLAorCQkJCSAgICBpbnQgKm1heF9lcnJvciwKKwkJCQkgICAgc3RydWN0IHRpbWV2YWwgKnZibGFua190aW1lLAorCQkJCSAgICB1bnNpZ25lZCBmbGFncyk7CiB2b2lkIHJhZGVvbl9kcml2ZXJfaXJxX3ByZWluc3RhbGxfa21zKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwogaW50IHJhZGVvbl9kcml2ZXJfaXJxX3Bvc3RpbnN0YWxsX2ttcyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKIHZvaWQgcmFkZW9uX2RyaXZlcl9pcnFfdW5pbnN0YWxsX2ttcyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKQEAgLTc0LDYgKzc5LDggQEAKIAkJCSBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdik7CiBpbnQgcmFkZW9uX2dlbV9vYmplY3RfaW5pdChzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iaik7CiB2b2lkIHJhZGVvbl9nZW1fb2JqZWN0X2ZyZWUoc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmopOworZXh0ZXJuIGludCByYWRlb25fZ2V0X2NydGNfc2Nhbm91dHBvcyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgY3J0YywKKwkJCQkgICAgICBpbnQgKnZwb3MsIGludCAqaHBvcyk7CiBleHRlcm4gc3RydWN0IGRybV9pb2N0bF9kZXNjIHJhZGVvbl9pb2N0bHNfa21zW107CiBleHRlcm4gaW50IHJhZGVvbl9tYXhfa21zX2lvY3RsOwogaW50IHJhZGVvbl9tbWFwKHN0cnVjdCBmaWxlICpmaWxwLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSk7CkBAIC0yOTYsNiArMzAzLDggQEAKIAkuZ2V0X3ZibGFua19jb3VudGVyID0gcmFkZW9uX2dldF92YmxhbmtfY291bnRlcl9rbXMsCiAJLmVuYWJsZV92YmxhbmsgPSByYWRlb25fZW5hYmxlX3ZibGFua19rbXMsCiAJLmRpc2FibGVfdmJsYW5rID0gcmFkZW9uX2Rpc2FibGVfdmJsYW5rX2ttcywKKwkuZ2V0X3ZibGFua190aW1lc3RhbXAgPSByYWRlb25fZ2V0X3ZibGFua190aW1lc3RhbXBfa21zLAorCS5nZXRfc2Nhbm91dF9wb3NpdGlvbiA9IHJhZGVvbl9nZXRfY3J0Y19zY2Fub3V0cG9zLAogI2lmIGRlZmluZWQoQ09ORklHX0RFQlVHX0ZTKQogCS5kZWJ1Z2ZzX2luaXQgPSByYWRlb25fZGVidWdmc19pbml0LAogCS5kZWJ1Z2ZzX2NsZWFudXAgPSByYWRlb25fZGVidWdmc19jbGVhbnVwLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fZW5jb2RlcnMuYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2VuY29kZXJzLmMKaW5kZXggMDQxOTQzZC4uOGZkMTg0MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fZW5jb2RlcnMuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9lbmNvZGVycy5jCkBAIC02NDEsNyArNjQxLDcgQEAKIAlzd2l0Y2ggKGNvbm5lY3Rvci0+Y29ubmVjdG9yX3R5cGUpIHsKIAljYXNlIERSTV9NT0RFX0NPTk5FQ1RPUl9EVklJOgogCWNhc2UgRFJNX01PREVfQ09OTkVDVE9SX0hETUlCOiAvKiBIRE1JLUIgaXMgYmFzaWNhbGx5IERMLURWSTsgYW5hbG9nIHdvcmtzIGZpbmUgKi8KLQkJaWYgKGRybV9kZXRlY3RfaGRtaV9tb25pdG9yKHJhZGVvbl9jb25uZWN0b3ItPmVkaWQpKSB7CisJCWlmIChkcm1fZGV0ZWN0X21vbml0b3JfYXVkaW8ocmFkZW9uX2Nvbm5lY3Rvci0+ZWRpZCkpIHsKIAkJCS8qIGZpeCBtZSAqLwogCQkJaWYgKEFTSUNfSVNfRENFNChyZGV2KSkKIAkJCQlyZXR1cm4gQVRPTV9FTkNPREVSX01PREVfRFZJOwpAQCAtNjU1LDcgKzY1NSw3IEBACiAJY2FzZSBEUk1fTU9ERV9DT05ORUNUT1JfRFZJRDoKIAljYXNlIERSTV9NT0RFX0NPTk5FQ1RPUl9IRE1JQToKIAlkZWZhdWx0OgotCQlpZiAoZHJtX2RldGVjdF9oZG1pX21vbml0b3IocmFkZW9uX2Nvbm5lY3Rvci0+ZWRpZCkpIHsKKwkJaWYgKGRybV9kZXRlY3RfbW9uaXRvcl9hdWRpbyhyYWRlb25fY29ubmVjdG9yLT5lZGlkKSkgewogCQkJLyogZml4IG1lICovCiAJCQlpZiAoQVNJQ19JU19EQ0U0KHJkZXYpKQogCQkJCXJldHVybiBBVE9NX0VOQ09ERVJfTU9ERV9EVkk7CkBAIC02NzMsNyArNjczLDcgQEAKIAkJaWYgKChkaWdfY29ubmVjdG9yLT5kcF9zaW5rX3R5cGUgPT0gQ09OTkVDVE9SX09CSkVDVF9JRF9ESVNQTEFZUE9SVCkgfHwKIAkJICAgIChkaWdfY29ubmVjdG9yLT5kcF9zaW5rX3R5cGUgPT0gQ09OTkVDVE9SX09CSkVDVF9JRF9lRFApKQogCQkJcmV0dXJuIEFUT01fRU5DT0RFUl9NT0RFX0RQOwotCQllbHNlIGlmIChkcm1fZGV0ZWN0X2hkbWlfbW9uaXRvcihyYWRlb25fY29ubmVjdG9yLT5lZGlkKSkgeworCQllbHNlIGlmIChkcm1fZGV0ZWN0X21vbml0b3JfYXVkaW8ocmFkZW9uX2Nvbm5lY3Rvci0+ZWRpZCkpIHsKIAkJCS8qIGZpeCBtZSAqLwogCQkJaWYgKEFTSUNfSVNfRENFNChyZGV2KSkKIAkJCQlyZXR1cm4gQVRPTV9FTkNPREVSX01PREVfRFZJOwpAQCAtNzEyLDggKzcxMiw4IEBACiAgKiAtIDIgRElHIGVuY29kZXIgYmxvY2tzLgogICogRElHMS8yIGNhbiBkcml2ZSBVTklQSFkwLzEvMiBsaW5rIEEgb3IgbGluayBCCiAgKgotICogRENFIDQuMAotICogLSAzIERJRyB0cmFuc21pdHRlciBibG9ja3MgVU5QSFkwLzEvMiAobGlua3MgQSBhbmQgQikuCisgKiBEQ0UgNC4wLzUuMAorICogLSAzIERJRyB0cmFuc21pdHRlciBibG9ja3MgVU5JUEhZMC8xLzIgKGxpbmtzIEEgYW5kIEIpLgogICogU3VwcG9ydHMgdXAgdG8gNiBkaWdpdGFsIG91dHB1dHMKICAqIC0gNiBESUcgZW5jb2RlciBibG9ja3MuCiAgKiAtIERJRyB0byBQSFkgbWFwcGluZyBpcyBoYXJkY29kZWQKQEAgLTcyNCw2ICs3MjQsMTIgQEAKICAqIERJRzUgZHJpdmVzIFVOSVBIWTIgbGluayBBLCBBK0IKICAqIERJRzYgZHJpdmVzIFVOSVBIWTIgbGluayBCCiAgKgorICogRENFIDQuMQorICogLSAzIERJRyB0cmFuc21pdHRlciBibG9ja3MgVU5JUEhZMC8xLzIgKGxpbmtzIEEgYW5kIEIpLgorICogU3VwcG9ydHMgdXAgdG8gNiBkaWdpdGFsIG91dHB1dHMKKyAqIC0gMiBESUcgZW5jb2RlciBibG9ja3MuCisgKiBESUcxLzIgY2FuIGRyaXZlIFVOSVBIWTAvMS8yIGxpbmsgQSBvciBsaW5rIEIKKyAqCiAgKiBSb3V0aW5nCiAgKiBjcnRjIC0+IGRpZyBlbmNvZGVyIC0+IFVOSVBIWS9MVlRNQSAoMSBvciAyIGxpbmtzKQogICogRXhhbXBsZXM6CkBAIC03MzcsNiArNzQzLDcgQEAKIAlESUdfRU5DT0RFUl9DT05UUk9MX1BTX0FMTE9DQVRJT04gdjE7CiAJRElHX0VOQ09ERVJfQ09OVFJPTF9QQVJBTUVURVJTX1YyIHYyOwogCURJR19FTkNPREVSX0NPTlRST0xfUEFSQU1FVEVSU19WMyB2MzsKKwlESUdfRU5DT0RFUl9DT05UUk9MX1BBUkFNRVRFUlNfVjQgdjQ7CiB9OwogCiB2b2lkCkBAIC03NTIsNiArNzU5LDcgQEAKIAl1aW50OF90IGZyZXYsIGNyZXY7CiAJaW50IGRwX2Nsb2NrID0gMDsKIAlpbnQgZHBfbGFuZV9jb3VudCA9IDA7CisJaW50IGhwZF9pZCA9IFJBREVPTl9IUERfTk9ORTsKIAogCWlmIChjb25uZWN0b3IpIHsKIAkJc3RydWN0IHJhZGVvbl9jb25uZWN0b3IgKnJhZGVvbl9jb25uZWN0b3IgPSB0b19yYWRlb25fY29ubmVjdG9yKGNvbm5lY3Rvcik7CkBAIC03NjAsNiArNzY4LDcgQEAKIAogCQlkcF9jbG9jayA9IGRpZ19jb25uZWN0b3ItPmRwX2Nsb2NrOwogCQlkcF9sYW5lX2NvdW50ID0gZGlnX2Nvbm5lY3Rvci0+ZHBfbGFuZV9jb3VudDsKKwkJaHBkX2lkID0gcmFkZW9uX2Nvbm5lY3Rvci0+aHBkLmhwZDsKIAl9CiAKIAkvKiBubyBkaWcgZW5jb2RlciBhc3NpZ25lZCAqLwpAQCAtNzg0LDE5ICs3OTMsMzYgQEAKIAlhcmdzLnYxLnVzUGl4ZWxDbG9jayA9IGNwdV90b19sZTE2KHJhZGVvbl9lbmNvZGVyLT5waXhlbF9jbG9jayAvIDEwKTsKIAlhcmdzLnYxLnVjRW5jb2Rlck1vZGUgPSBhdG9tYmlvc19nZXRfZW5jb2Rlcl9tb2RlKGVuY29kZXIpOwogCi0JaWYgKGFyZ3MudjEudWNFbmNvZGVyTW9kZSA9PSBBVE9NX0VOQ09ERVJfTU9ERV9EUCkgewotCQlpZiAoZHBfY2xvY2sgPT0gMjcwMDAwKQotCQkJYXJncy52MS51Y0NvbmZpZyB8PSBBVE9NX0VOQ09ERVJfQ09ORklHX0RQTElOS1JBVEVfMl83MEdIWjsKKwlpZiAoKGFyZ3MudjEudWNFbmNvZGVyTW9kZSA9PSBBVE9NX0VOQ09ERVJfTU9ERV9EUCkgfHwKKwkgICAgKGFyZ3MudjEudWNFbmNvZGVyTW9kZSA9PSBBVE9NX0VOQ09ERVJfTU9ERV9EUF9NU1QpKQogCQlhcmdzLnYxLnVjTGFuZU51bSA9IGRwX2xhbmVfY291bnQ7Ci0JfSBlbHNlIGlmIChyYWRlb25fZW5jb2Rlci0+cGl4ZWxfY2xvY2sgPiAxNjUwMDApCisJZWxzZSBpZiAocmFkZW9uX2VuY29kZXItPnBpeGVsX2Nsb2NrID4gMTY1MDAwKQogCQlhcmdzLnYxLnVjTGFuZU51bSA9IDg7CiAJZWxzZQogCQlhcmdzLnYxLnVjTGFuZU51bSA9IDQ7CiAKLQlpZiAoQVNJQ19JU19EQ0U0KHJkZXYpKSB7CisJaWYgKEFTSUNfSVNfRENFNShyZGV2KSkgeworCQlpZiAoKGFyZ3MudjEudWNFbmNvZGVyTW9kZSA9PSBBVE9NX0VOQ09ERVJfTU9ERV9EUCkgfHwKKwkJICAgIChhcmdzLnYxLnVjRW5jb2Rlck1vZGUgPT0gQVRPTV9FTkNPREVSX01PREVfRFBfTVNUKSkgeworCQkJaWYgKGRwX2Nsb2NrID09IDI3MDAwMCkKKwkJCQlhcmdzLnYxLnVjQ29uZmlnIHw9IEFUT01fRU5DT0RFUl9DT05GSUdfVjRfRFBMSU5LUkFURV8yXzcwR0haOworCQkJZWxzZSBpZiAoZHBfY2xvY2sgPT0gNTQwMDAwKQorCQkJCWFyZ3MudjEudWNDb25maWcgfD0gQVRPTV9FTkNPREVSX0NPTkZJR19WNF9EUExJTktSQVRFXzVfNDBHSFo7CisJCX0KKwkJYXJncy52NC5hY0NvbmZpZy51Y0RpZ1NlbCA9IGRpZy0+ZGlnX2VuY29kZXI7CisJCWFyZ3MudjQudWNCaXRQZXJDb2xvciA9IFBBTkVMXzhCSVRfUEVSX0NPTE9SOworCQlpZiAoaHBkX2lkID09IFJBREVPTl9IUERfTk9ORSkKKwkJCWFyZ3MudjQudWNIUERfSUQgPSAwOworCQllbHNlCisJCQlhcmdzLnY0LnVjSFBEX0lEID0gaHBkX2lkICsgMTsKKwl9IGVsc2UgaWYgKEFTSUNfSVNfRENFNChyZGV2KSkgeworCQlpZiAoKGFyZ3MudjEudWNFbmNvZGVyTW9kZSA9PSBBVE9NX0VOQ09ERVJfTU9ERV9EUCkgJiYgKGRwX2Nsb2NrID09IDI3MDAwMCkpCisJCQlhcmdzLnYxLnVjQ29uZmlnIHw9IEFUT01fRU5DT0RFUl9DT05GSUdfVjNfRFBMSU5LUkFURV8yXzcwR0haOwogCQlhcmdzLnYzLmFjQ29uZmlnLnVjRGlnU2VsID0gZGlnLT5kaWdfZW5jb2RlcjsKIAkJYXJncy52My51Y0JpdFBlckNvbG9yID0gUEFORUxfOEJJVF9QRVJfQ09MT1I7CiAJfSBlbHNlIHsKKwkJaWYgKChhcmdzLnYxLnVjRW5jb2Rlck1vZGUgPT0gQVRPTV9FTkNPREVSX01PREVfRFApICYmIChkcF9jbG9jayA9PSAyNzAwMDApKQorCQkJYXJncy52MS51Y0NvbmZpZyB8PSBBVE9NX0VOQ09ERVJfQ09ORklHX0RQTElOS1JBVEVfMl83MEdIWjsKIAkJc3dpdGNoIChyYWRlb25fZW5jb2Rlci0+ZW5jb2Rlcl9pZCkgewogCQljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX1VOSVBIWToKIAkJCWFyZ3MudjEudWNDb25maWcgPSBBVE9NX0VOQ09ERVJfQ09ORklHX1YyX1RSQU5TTUlUVEVSMTsKQEAgLTgyMyw2ICs4NDksNyBAQAogCURJR19UUkFOU01JVFRFUl9DT05UUk9MX1BTX0FMTE9DQVRJT04gdjE7CiAJRElHX1RSQU5TTUlUVEVSX0NPTlRST0xfUEFSQU1FVEVSU19WMiB2MjsKIAlESUdfVFJBTlNNSVRURVJfQ09OVFJPTF9QQVJBTUVURVJTX1YzIHYzOworCURJR19UUkFOU01JVFRFUl9DT05UUk9MX1BBUkFNRVRFUlNfVjQgdjQ7CiB9OwogCiB2b2lkCkBAIC05MTcsMTAgKzk0NCwxOCBAQAogCQkJc3RydWN0IHJhZGVvbl9jcnRjICpyYWRlb25fY3J0YyA9IHRvX3JhZGVvbl9jcnRjKGVuY29kZXItPmNydGMpOwogCQkJcGxsX2lkID0gcmFkZW9uX2NydGMtPnBsbF9pZDsKIAkJfQotCQlpZiAoaXNfZHAgJiYgcmRldi0+Y2xvY2suZHBfZXh0Y2xrKQotCQkJYXJncy52My5hY0NvbmZpZy51Y1JlZkNsa1NvdXJjZSA9IDI7IC8qIGV4dGVybmFsIHNyYyAqLwotCQllbHNlCi0JCQlhcmdzLnYzLmFjQ29uZmlnLnVjUmVmQ2xrU291cmNlID0gcGxsX2lkOworCisJCWlmIChBU0lDX0lTX0RDRTUocmRldikpIHsKKwkJCWlmIChpc19kcCAmJiByZGV2LT5jbG9jay5kcF9leHRjbGspCisJCQkJYXJncy52NC5hY0NvbmZpZy51Y1JlZkNsa1NvdXJjZSA9IDM7IC8qIGV4dGVybmFsIHNyYyAqLworCQkJZWxzZQorCQkJCWFyZ3MudjQuYWNDb25maWcudWNSZWZDbGtTb3VyY2UgPSBwbGxfaWQ7CisJCX0gZWxzZSB7CisJCQlpZiAoaXNfZHAgJiYgcmRldi0+Y2xvY2suZHBfZXh0Y2xrKQorCQkJCWFyZ3MudjMuYWNDb25maWcudWNSZWZDbGtTb3VyY2UgPSAyOyAvKiBleHRlcm5hbCBzcmMgKi8KKwkJCWVsc2UKKwkJCQlhcmdzLnYzLmFjQ29uZmlnLnVjUmVmQ2xrU291cmNlID0gcGxsX2lkOworCQl9CiAKIAkJc3dpdGNoIChyYWRlb25fZW5jb2Rlci0+ZW5jb2Rlcl9pZCkgewogCQljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX1VOSVBIWToKQEAgLTEwNDQsNiArMTA3OSw3IEBACiAKIHVuaW9uIGV4dGVybmFsX2VuY29kZXJfY29udHJvbCB7CiAJRVhURVJOQUxfRU5DT0RFUl9DT05UUk9MX1BTX0FMTE9DQVRJT04gdjE7CisJRVhURVJOQUxfRU5DT0RFUl9DT05UUk9MX1BTX0FMTE9DQVRJT05fVjMgdjM7CiB9OwogCiBzdGF0aWMgdm9pZApAQCAtMTA1NCw2ICsxMDkwLDcgQEAKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZW5jb2Rlci0+ZGV2OwogCXN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlzdHJ1Y3QgcmFkZW9uX2VuY29kZXIgKnJhZGVvbl9lbmNvZGVyID0gdG9fcmFkZW9uX2VuY29kZXIoZW5jb2Rlcik7CisJc3RydWN0IHJhZGVvbl9lbmNvZGVyICpleHRfcmFkZW9uX2VuY29kZXIgPSB0b19yYWRlb25fZW5jb2RlcihleHRfZW5jb2Rlcik7CiAJdW5pb24gZXh0ZXJuYWxfZW5jb2Rlcl9jb250cm9sIGFyZ3M7CiAJc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciA9IHJhZGVvbl9nZXRfY29ubmVjdG9yX2Zvcl9lbmNvZGVyKGVuY29kZXIpOwogCWludCBpbmRleCA9IEdldEluZGV4SW50b01hc3RlclRhYmxlKENPTU1BTkQsIEV4dGVybmFsRW5jb2RlckNvbnRyb2wpOwpAQCAtMTA2MSw2ICsxMDk4LDcgQEAKIAlpbnQgZHBfY2xvY2sgPSAwOwogCWludCBkcF9sYW5lX2NvdW50ID0gMDsKIAlpbnQgY29ubmVjdG9yX29iamVjdF9pZCA9IDA7CisJdTMyIGV4dF9lbnVtID0gKGV4dF9yYWRlb25fZW5jb2Rlci0+ZW5jb2Rlcl9lbnVtICYgRU5VTV9JRF9NQVNLKSA+PiBFTlVNX0lEX1NISUZUOwogCiAJaWYgKGNvbm5lY3RvcikgewogCQlzdHJ1Y3QgcmFkZW9uX2Nvbm5lY3RvciAqcmFkZW9uX2Nvbm5lY3RvciA9IHRvX3JhZGVvbl9jb25uZWN0b3IoY29ubmVjdG9yKTsKQEAgLTEwOTksNiArMTEzNywzNyBAQAogCQkJZWxzZQogCQkJCWFyZ3MudjEuc0RpZ0VuY29kZXIudWNMYW5lTnVtID0gNDsKIAkJCWJyZWFrOworCQljYXNlIDM6CisJCQlhcmdzLnYzLnNFeHRFbmNvZGVyLnVjQWN0aW9uID0gYWN0aW9uOworCQkJaWYgKGFjdGlvbiA9PSBFWFRFUk5BTF9FTkNPREVSX0FDVElPTl9WM19FTkNPREVSX0lOSVQpCisJCQkJYXJncy52My5zRXh0RW5jb2Rlci51c0Nvbm5lY3RvcklkID0gY29ubmVjdG9yX29iamVjdF9pZDsKKwkJCWVsc2UKKwkJCQlhcmdzLnYzLnNFeHRFbmNvZGVyLnVzUGl4ZWxDbG9jayA9IGNwdV90b19sZTE2KHJhZGVvbl9lbmNvZGVyLT5waXhlbF9jbG9jayAvIDEwKTsKKwkJCWFyZ3MudjMuc0V4dEVuY29kZXIudWNFbmNvZGVyTW9kZSA9IGF0b21iaW9zX2dldF9lbmNvZGVyX21vZGUoZW5jb2Rlcik7CisKKwkJCWlmIChhcmdzLnYzLnNFeHRFbmNvZGVyLnVjRW5jb2Rlck1vZGUgPT0gQVRPTV9FTkNPREVSX01PREVfRFApIHsKKwkJCQlpZiAoZHBfY2xvY2sgPT0gMjcwMDAwKQorCQkJCQlhcmdzLnYzLnNFeHRFbmNvZGVyLnVjQ29uZmlnIHw9IEVYVEVSTkFMX0VOQ09ERVJfQ09ORklHX1YzX0RQTElOS1JBVEVfMl83MEdIWjsKKwkJCQllbHNlIGlmIChkcF9jbG9jayA9PSA1NDAwMDApCisJCQkJCWFyZ3MudjMuc0V4dEVuY29kZXIudWNDb25maWcgfD0gRVhURVJOQUxfRU5DT0RFUl9DT05GSUdfVjNfRFBMSU5LUkFURV81XzQwR0haOworCQkJCWFyZ3MudjMuc0V4dEVuY29kZXIudWNMYW5lTnVtID0gZHBfbGFuZV9jb3VudDsKKwkJCX0gZWxzZSBpZiAocmFkZW9uX2VuY29kZXItPnBpeGVsX2Nsb2NrID4gMTY1MDAwKQorCQkJCWFyZ3MudjMuc0V4dEVuY29kZXIudWNMYW5lTnVtID0gODsKKwkJCWVsc2UKKwkJCQlhcmdzLnYzLnNFeHRFbmNvZGVyLnVjTGFuZU51bSA9IDQ7CisJCQlzd2l0Y2ggKGV4dF9lbnVtKSB7CisJCQljYXNlIEdSQVBIX09CSkVDVF9FTlVNX0lEMToKKwkJCQlhcmdzLnYzLnNFeHRFbmNvZGVyLnVjQ29uZmlnIHw9IEVYVEVSTkFMX0VOQ09ERVJfQ09ORklHX1YzX0VOQ09ERVIxOworCQkJCWJyZWFrOworCQkJY2FzZSBHUkFQSF9PQkpFQ1RfRU5VTV9JRDI6CisJCQkJYXJncy52My5zRXh0RW5jb2Rlci51Y0NvbmZpZyB8PSBFWFRFUk5BTF9FTkNPREVSX0NPTkZJR19WM19FTkNPREVSMjsKKwkJCQlicmVhazsKKwkJCWNhc2UgR1JBUEhfT0JKRUNUX0VOVU1fSUQzOgorCQkJCWFyZ3MudjMuc0V4dEVuY29kZXIudWNDb25maWcgfD0gRVhURVJOQUxfRU5DT0RFUl9DT05GSUdfVjNfRU5DT0RFUjM7CisJCQkJYnJlYWs7CisJCQl9CisJCQlhcmdzLnYzLnNFeHRFbmNvZGVyLnVjQml0UGVyQ29sb3IgPSBQQU5FTF84QklUX1BFUl9DT0xPUjsKKwkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJRFJNX0VSUk9SKCJVbmtub3duIHRhYmxlIHZlcnNpb246ICVkLCAlZFxuIiwgZnJldiwgY3Jldik7CiAJCQlyZXR1cm47CkBAIC0xMTU4LDYgKzEyMjcsOCBAQAogCURJU1BMQVlfREVWSUNFX09VVFBVVF9DT05UUk9MX1BTX0FMTE9DQVRJT04gYXJnczsKIAlpbnQgaW5kZXggPSAwOwogCWJvb2wgaXNfZGlnID0gZmFsc2U7CisJYm9vbCBpc19kY2U1X2RhYyA9IGZhbHNlOworCWJvb2wgaXNfZGNlNV9kdm8gPSBmYWxzZTsKIAogCW1lbXNldCgmYXJncywgMCwgc2l6ZW9mKGFyZ3MpKTsKIApAQCAtMTE4MCw3ICsxMjUxLDkgQEAKIAkJaW5kZXggPSBHZXRJbmRleEludG9NYXN0ZXJUYWJsZShDT01NQU5ELCBEVk9PdXRwdXRDb250cm9sKTsKIAkJYnJlYWs7CiAJY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9LTERTQ1BfRFZPMToKLQkJaWYgKEFTSUNfSVNfRENFMyhyZGV2KSkKKwkJaWYgKEFTSUNfSVNfRENFNShyZGV2KSkKKwkJCWlzX2RjZTVfZHZvID0gdHJ1ZTsKKwkJZWxzZSBpZiAoQVNJQ19JU19EQ0UzKHJkZXYpKQogCQkJaXNfZGlnID0gdHJ1ZTsKIAkJZWxzZQogCQkJaW5kZXggPSBHZXRJbmRleEludG9NYXN0ZXJUYWJsZShDT01NQU5ELCBEVk9PdXRwdXRDb250cm9sKTsKQEAgLTExOTYsMTIgKzEyNjksMTYgQEAKIAkJYnJlYWs7CiAJY2FzZSBFTkNPREVSX09CSkVDVF9JRF9JTlRFUk5BTF9EQUMxOgogCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfS0xEU0NQX0RBQzE6Ci0JCWlmIChyYWRlb25fZW5jb2Rlci0+YWN0aXZlX2RldmljZSAmIChBVE9NX0RFVklDRV9UVl9TVVBQT1JUKSkKLQkJCWluZGV4ID0gR2V0SW5kZXhJbnRvTWFzdGVyVGFibGUoQ09NTUFORCwgVFYxT3V0cHV0Q29udHJvbCk7Ci0JCWVsc2UgaWYgKHJhZGVvbl9lbmNvZGVyLT5hY3RpdmVfZGV2aWNlICYgKEFUT01fREVWSUNFX0NWX1NVUFBPUlQpKQotCQkJaW5kZXggPSBHZXRJbmRleEludG9NYXN0ZXJUYWJsZShDT01NQU5ELCBDVjFPdXRwdXRDb250cm9sKTsKLQkJZWxzZQotCQkJaW5kZXggPSBHZXRJbmRleEludG9NYXN0ZXJUYWJsZShDT01NQU5ELCBEQUMxT3V0cHV0Q29udHJvbCk7CisJCWlmIChBU0lDX0lTX0RDRTUocmRldikpCisJCQlpc19kY2U1X2RhYyA9IHRydWU7CisJCWVsc2UgeworCQkJaWYgKHJhZGVvbl9lbmNvZGVyLT5hY3RpdmVfZGV2aWNlICYgKEFUT01fREVWSUNFX1RWX1NVUFBPUlQpKQorCQkJCWluZGV4ID0gR2V0SW5kZXhJbnRvTWFzdGVyVGFibGUoQ09NTUFORCwgVFYxT3V0cHV0Q29udHJvbCk7CisJCQllbHNlIGlmIChyYWRlb25fZW5jb2Rlci0+YWN0aXZlX2RldmljZSAmIChBVE9NX0RFVklDRV9DVl9TVVBQT1JUKSkKKwkJCQlpbmRleCA9IEdldEluZGV4SW50b01hc3RlclRhYmxlKENPTU1BTkQsIENWMU91dHB1dENvbnRyb2wpOworCQkJZWxzZQorCQkJCWluZGV4ID0gR2V0SW5kZXhJbnRvTWFzdGVyVGFibGUoQ09NTUFORCwgREFDMU91dHB1dENvbnRyb2wpOworCQl9CiAJCWJyZWFrOwogCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfREFDMjoKIAljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX0tMRFNDUF9EQUMyOgpAQCAtMTI2MCw2ICsxMzM3LDI4IEBACiAJCQkJYXRvbWJpb3NfZGlnX3RyYW5zbWl0dGVyX3NldHVwKGVuY29kZXIsIEFUT01fVFJBTlNNSVRURVJfQUNUSU9OX0xDRF9CTE9GRiwgMCwgMCk7CiAJCQlicmVhazsKIAkJfQorCX0gZWxzZSBpZiAoaXNfZGNlNV9kYWMpIHsKKwkJc3dpdGNoIChtb2RlKSB7CisJCWNhc2UgRFJNX01PREVfRFBNU19PTjoKKwkJCWF0b21iaW9zX2RhY19zZXR1cChlbmNvZGVyLCBBVE9NX0VOQUJMRSk7CisJCQlicmVhazsKKwkJY2FzZSBEUk1fTU9ERV9EUE1TX1NUQU5EQlk6CisJCWNhc2UgRFJNX01PREVfRFBNU19TVVNQRU5EOgorCQljYXNlIERSTV9NT0RFX0RQTVNfT0ZGOgorCQkJYXRvbWJpb3NfZGFjX3NldHVwKGVuY29kZXIsIEFUT01fRElTQUJMRSk7CisJCQlicmVhazsKKwkJfQorCX0gZWxzZSBpZiAoaXNfZGNlNV9kdm8pIHsKKwkJc3dpdGNoIChtb2RlKSB7CisJCWNhc2UgRFJNX01PREVfRFBNU19PTjoKKwkJCWF0b21iaW9zX2R2b19zZXR1cChlbmNvZGVyLCBBVE9NX0VOQUJMRSk7CisJCQlicmVhazsKKwkJY2FzZSBEUk1fTU9ERV9EUE1TX1NUQU5EQlk6CisJCWNhc2UgRFJNX01PREVfRFBNU19TVVNQRU5EOgorCQljYXNlIERSTV9NT0RFX0RQTVNfT0ZGOgorCQkJYXRvbWJpb3NfZHZvX3NldHVwKGVuY29kZXIsIEFUT01fRElTQUJMRSk7CisJCQlicmVhazsKKwkJfQogCX0gZWxzZSB7CiAJCXN3aXRjaCAobW9kZSkgewogCQljYXNlIERSTV9NT0RFX0RQTVNfT046CkBAIC0xMjg5LDEyICsxMzg4LDE4IEBACiAJCXN3aXRjaCAobW9kZSkgewogCQljYXNlIERSTV9NT0RFX0RQTVNfT046CiAJCWRlZmF1bHQ6Ci0JCQlhY3Rpb24gPSBBVE9NX0VOQUJMRTsKKwkJCWlmIChBU0lDX0lTX0RDRTQxKHJkZXYpKQorCQkJCWFjdGlvbiA9IEVYVEVSTkFMX0VOQ09ERVJfQUNUSU9OX1YzX0VOQUJMRV9PVVRQVVQ7CisJCQllbHNlCisJCQkJYWN0aW9uID0gQVRPTV9FTkFCTEU7CiAJCQlicmVhazsKIAkJY2FzZSBEUk1fTU9ERV9EUE1TX1NUQU5EQlk6CiAJCWNhc2UgRFJNX01PREVfRFBNU19TVVNQRU5EOgogCQljYXNlIERSTV9NT0RFX0RQTVNfT0ZGOgotCQkJYWN0aW9uID0gQVRPTV9ESVNBQkxFOworCQkJaWYgKEFTSUNfSVNfRENFNDEocmRldikpCisJCQkJYWN0aW9uID0gRVhURVJOQUxfRU5DT0RFUl9BQ1RJT05fVjNfRElTQUJMRV9PVVRQVVQ7CisJCQllbHNlCisJCQkJYWN0aW9uID0gQVRPTV9ESVNBQkxFOwogCQkJYnJlYWs7CiAJCX0KIAkJYXRvbWJpb3NfZXh0ZXJuYWxfZW5jb2Rlcl9zZXR1cChlbmNvZGVyLCBleHRfZW5jb2RlciwgYWN0aW9uKTsKQEAgLTE0ODMsMjcgKzE1ODgsMzUgQEAKIAlzdHJ1Y3QgcmFkZW9uX2VuY29kZXJfYXRvbV9kaWcgKmRpZzsKIAl1aW50MzJfdCBkaWdfZW5jX2luX3VzZSA9IDA7CiAKKwkvKiBEQ0U0LzUgKi8KIAlpZiAoQVNJQ19JU19EQ0U0KHJkZXYpKSB7CiAJCWRpZyA9IHJhZGVvbl9lbmNvZGVyLT5lbmNfcHJpdjsKLQkJc3dpdGNoIChyYWRlb25fZW5jb2Rlci0+ZW5jb2Rlcl9pZCkgewotCQljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX1VOSVBIWToKKwkJaWYgKEFTSUNfSVNfRENFNDEocmRldikpIHsKIAkJCWlmIChkaWctPmxpbmtiKQogCQkJCXJldHVybiAxOwogCQkJZWxzZQogCQkJCXJldHVybiAwOwotCQkJYnJlYWs7Ci0JCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfVU5JUEhZMToKLQkJCWlmIChkaWctPmxpbmtiKQotCQkJCXJldHVybiAzOwotCQkJZWxzZQotCQkJCXJldHVybiAyOwotCQkJYnJlYWs7Ci0JCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfVU5JUEhZMjoKLQkJCWlmIChkaWctPmxpbmtiKQotCQkJCXJldHVybiA1OwotCQkJZWxzZQotCQkJCXJldHVybiA0OwotCQkJYnJlYWs7CisJCX0gZWxzZSB7CisJCQlzd2l0Y2ggKHJhZGVvbl9lbmNvZGVyLT5lbmNvZGVyX2lkKSB7CisJCQljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX1VOSVBIWToKKwkJCQlpZiAoZGlnLT5saW5rYikKKwkJCQkJcmV0dXJuIDE7CisJCQkJZWxzZQorCQkJCQlyZXR1cm4gMDsKKwkJCQlicmVhazsKKwkJCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfVU5JUEhZMToKKwkJCQlpZiAoZGlnLT5saW5rYikKKwkJCQkJcmV0dXJuIDM7CisJCQkJZWxzZQorCQkJCQlyZXR1cm4gMjsKKwkJCQlicmVhazsKKwkJCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfSU5URVJOQUxfVU5JUEhZMjoKKwkJCQlpZiAoZGlnLT5saW5rYikKKwkJCQkJcmV0dXJuIDU7CisJCQkJZWxzZQorCQkJCQlyZXR1cm4gNDsKKwkJCQlicmVhazsKKwkJCX0KIAkJfQogCX0KIApAQCAtMTYxMCw3ICsxNzIzLDEzIEBACiAJfQogCiAJaWYgKGV4dF9lbmNvZGVyKSB7Ci0JCWF0b21iaW9zX2V4dGVybmFsX2VuY29kZXJfc2V0dXAoZW5jb2RlciwgZXh0X2VuY29kZXIsIEFUT01fRU5BQkxFKTsKKwkJaWYgKEFTSUNfSVNfRENFNDEocmRldikpIHsKKwkJCWF0b21iaW9zX2V4dGVybmFsX2VuY29kZXJfc2V0dXAoZW5jb2RlciwgZXh0X2VuY29kZXIsCisJCQkJCQkJRVhURVJOQUxfRU5DT0RFUl9BQ1RJT05fVjNfRU5DT0RFUl9JTklUKTsKKwkJCWF0b21iaW9zX2V4dGVybmFsX2VuY29kZXJfc2V0dXAoZW5jb2RlciwgZXh0X2VuY29kZXIsCisJCQkJCQkJRVhURVJOQUxfRU5DT0RFUl9BQ1RJT05fVjNfRU5DT0RFUl9TRVRVUCk7CisJCX0gZWxzZQorCQkJYXRvbWJpb3NfZXh0ZXJuYWxfZW5jb2Rlcl9zZXR1cChlbmNvZGVyLCBleHRfZW5jb2RlciwgQVRPTV9FTkFCTEUpOwogCX0KIAogCWF0b21iaW9zX2FwcGx5X2VuY29kZXJfcXVpcmtzKGVuY29kZXIsIGFkanVzdGVkX21vZGUpOwpAQCAtMTkyNyw3ICsyMDQ2LDEwIEBACiB9CiAKIHZvaWQKLXJhZGVvbl9hZGRfYXRvbV9lbmNvZGVyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVpbnQzMl90IGVuY29kZXJfZW51bSwgdWludDMyX3Qgc3VwcG9ydGVkX2RldmljZSkKK3JhZGVvbl9hZGRfYXRvbV9lbmNvZGVyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCisJCQl1aW50MzJfdCBlbmNvZGVyX2VudW0sCisJCQl1aW50MzJfdCBzdXBwb3J0ZWRfZGV2aWNlLAorCQkJdTE2IGNhcHMpCiB7CiAJc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcjsKQEAgLTE5NzAsNiArMjA5Miw3IEBACiAJcmFkZW9uX2VuY29kZXItPnJteF90eXBlID0gUk1YX09GRjsKIAlyYWRlb25fZW5jb2Rlci0+dW5kZXJzY2FuX3R5cGUgPSBVTkRFUlNDQU5fT0ZGOwogCXJhZGVvbl9lbmNvZGVyLT5pc19leHRfZW5jb2RlciA9IGZhbHNlOworCXJhZGVvbl9lbmNvZGVyLT5jYXBzID0gY2FwczsKIAogCXN3aXRjaCAocmFkZW9uX2VuY29kZXItPmVuY29kZXJfaWQpIHsKIAljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX0lOVEVSTkFMX0xWRFM6CkBAIC0yMDI5LDYgKzIxNTIsOCBAQAogCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfVElURlA1MTM6CiAJY2FzZSBFTkNPREVSX09CSkVDVF9JRF9WVDE2MjM6CiAJY2FzZSBFTkNPREVSX09CSkVDVF9JRF9IRE1JX1NJMTkzMDoKKwljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX1RSQVZJUzoKKwljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX05VVE1FRzoKIAkJLyogdGhlc2UgYXJlIGhhbmRsZWQgYnkgdGhlIHByaW1hcnkgZW5jb2RlcnMgKi8KIAkJcmFkZW9uX2VuY29kZXItPmlzX2V4dF9lbmNvZGVyID0gdHJ1ZTsKIAkJaWYgKHJhZGVvbl9lbmNvZGVyLT5kZXZpY2VzICYgKEFUT01fREVWSUNFX0xDRF9TVVBQT1JUKSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2ZhbWlseS5oIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fZmFtaWx5LmgKaW5kZXggZTMyOTA2Ni4uMWNhNTVlYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fZmFtaWx5LmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fZmFtaWx5LmgKQEAgLTgwLDYgKzgwLDEwIEBACiAJQ0hJUF9KVU5JUEVSLAogCUNISVBfQ1lQUkVTUywKIAlDSElQX0hFTUxPQ0ssCisJQ0hJUF9QQUxNLAorCUNISVBfQkFSVFMsCisJQ0hJUF9UVVJLUywKKwlDSElQX0NBSUNPUywKIAlDSElQX0xBU1QsCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9mYi5jIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fZmIuYwppbmRleCA2YWJlYTMyLi5jYTMyZTljIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9mYi5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2ZiLmMKQEAgLTIyNSw4ICsyMjUsNiBAQAogCiAJc3RyY3B5KGluZm8tPmZpeC5pZCwgInJhZGVvbmRybWZiIik7CiAKLQlkcm1fZmJfaGVscGVyX2ZpbGxfZml4KGluZm8sIGZiLT5waXRjaCwgZmItPmRlcHRoKTsKLQogCWluZm8tPmZsYWdzID0gRkJJTkZPX0RFRkFVTFQgfCBGQklORk9fQ0FOX0ZPUkNFX09VVFBVVDsKIAlpbmZvLT5mYm9wcyA9ICZyYWRlb25mYl9vcHM7CiAKQEAgLTI0Nyw4ICsyNDUsNiBAQAogCWluZm8tPmFwZXJ0dXJlcy0+cmFuZ2VzWzBdLmJhc2UgPSByZGV2LT5kZGV2LT5tb2RlX2NvbmZpZy5mYl9iYXNlOwogCWluZm8tPmFwZXJ0dXJlcy0+cmFuZ2VzWzBdLnNpemUgPSByZGV2LT5tYy5hcGVyX3NpemU7CiAKLQlpbmZvLT5maXgubW1pb19zdGFydCA9IDA7Ci0JaW5mby0+Zml4Lm1taW9fbGVuID0gMDsKIAlpbmZvLT5waXhtYXAuc2l6ZSA9IDY0KjEwMjQ7CiAJaW5mby0+cGl4bWFwLmJ1Zl9hbGlnbiA9IDg7CiAJaW5mby0+cGl4bWFwLmFjY2Vzc19hbGlnbiA9IDMyOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fZmVuY2UuYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2ZlbmNlLmMKaW5kZXggZGFhY2IyOC4uMTcxYjBiMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fZmVuY2UuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9mZW5jZS5jCkBAIC0zOCw2ICszOCw3IEBACiAjaW5jbHVkZSAiZHJtLmgiCiAjaW5jbHVkZSAicmFkZW9uX3JlZy5oIgogI2luY2x1ZGUgInJhZGVvbi5oIgorI2luY2x1ZGUgInJhZGVvbl90cmFjZS5oIgogCiBpbnQgcmFkZW9uX2ZlbmNlX2VtaXQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIHN0cnVjdCByYWRlb25fZmVuY2UgKmZlbmNlKQogewpAQCAtNTcsNiArNTgsNyBAQAogCX0gZWxzZQogCQlyYWRlb25fZmVuY2VfcmluZ19lbWl0KHJkZXYsIGZlbmNlKTsKIAorCXRyYWNlX3JhZGVvbl9mZW5jZV9lbWl0KHJkZXYtPmRkZXYsIGZlbmNlLT5zZXEpOwogCWZlbmNlLT5lbWl0ZWQgPSB0cnVlOwogCWxpc3RfZGVsKCZmZW5jZS0+bGlzdCk7CiAJbGlzdF9hZGRfdGFpbCgmZmVuY2UtPmxpc3QsICZyZGV2LT5mZW5jZV9kcnYuZW1pdGVkKTsKQEAgLTIxMyw2ICsyMTUsNyBAQAogcmV0cnk6CiAJLyogc2F2ZSBjdXJyZW50IHNlcXVlbmNlIHVzZWQgdG8gY2hlY2sgZm9yIEdQVSBsb2NrdXAgKi8KIAlzZXEgPSByZGV2LT5mZW5jZV9kcnYubGFzdF9zZXE7CisJdHJhY2VfcmFkZW9uX2ZlbmNlX3dhaXRfYmVnaW4ocmRldi0+ZGRldiwgc2VxKTsKIAlpZiAoaW50cikgewogCQlyYWRlb25faXJxX2ttc19zd19pcnFfZ2V0KHJkZXYpOwogCQlyID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQocmRldi0+ZmVuY2VfZHJ2LnF1ZXVlLApAQCAtMjI3LDYgKzIzMCw3IEBACiAJCQkgcmFkZW9uX2ZlbmNlX3NpZ25hbGVkKGZlbmNlKSwgdGltZW91dCk7CiAJCXJhZGVvbl9pcnFfa21zX3N3X2lycV9wdXQocmRldik7CiAJfQorCXRyYWNlX3JhZGVvbl9mZW5jZV93YWl0X2VuZChyZGV2LT5kZGV2LCBzZXEpOwogCWlmICh1bmxpa2VseSghcmFkZW9uX2ZlbmNlX3NpZ25hbGVkKGZlbmNlKSkpIHsKIAkJLyogd2Ugd2VyZSBpbnRlcnJ1cHRlZCBmb3Igc29tZSByZWFzb24gYW5kIGZlbmNlIGlzbid0CiAJCSAqIGlzbid0IHNpZ25hbGVkIHlldCwgcmVzdW1lIHdhaXQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2lycV9rbXMuYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2lycV9rbXMuYwppbmRleCBhMTA4YzdlLi5hMjg5NjQ2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9pcnFfa21zLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25faXJxX2ttcy5jCkBAIC02NCwxNSArNjQsMTUgQEAKIAlzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJdW5zaWduZWQgaTsKIAotCUlOSVRfV09SSygmcmRldi0+aG90cGx1Z193b3JrLCByYWRlb25faG90cGx1Z193b3JrX2Z1bmMpOwotCiAJLyogRGlzYWJsZSAqYWxsKiBpbnRlcnJ1cHRzICovCiAJcmRldi0+aXJxLnN3X2ludCA9IGZhbHNlOwogCXJkZXYtPmlycS5ndWlfaWRsZSA9IGZhbHNlOwogCWZvciAoaSA9IDA7IGkgPCByZGV2LT5udW1fY3J0YzsgaSsrKQogCQlyZGV2LT5pcnEuY3J0Y192YmxhbmtfaW50W2ldID0gZmFsc2U7Ci0JZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKSB7CiAJCXJkZXYtPmlycS5ocGRbaV0gPSBmYWxzZTsKKwkJcmRldi0+aXJxLnBmbGlwW2ldID0gZmFsc2U7CisJfQogCXJhZGVvbl9pcnFfc2V0KHJkZXYpOwogCS8qIENsZWFyIGJpdHMgKi8KIAlyYWRlb25faXJxX3Byb2Nlc3MocmRldik7CkBAIC0xMDEsOCArMTAxLDEwIEBACiAJcmRldi0+aXJxLmd1aV9pZGxlID0gZmFsc2U7CiAJZm9yIChpID0gMDsgaSA8IHJkZXYtPm51bV9jcnRjOyBpKyspCiAJCXJkZXYtPmlycS5jcnRjX3ZibGFua19pbnRbaV0gPSBmYWxzZTsKLQlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspIHsKIAkJcmRldi0+aXJxLmhwZFtpXSA9IGZhbHNlOworCQlyZGV2LT5pcnEucGZsaXBbaV0gPSBmYWxzZTsKKwl9CiAJcmFkZW9uX2lycV9zZXQocmRldik7CiB9CiAKQEAgLTExMCw2ICsxMTIsOCBAQAogewogCWludCByID0gMDsKIAorCUlOSVRfV09SSygmcmRldi0+aG90cGx1Z193b3JrLCByYWRlb25faG90cGx1Z193b3JrX2Z1bmMpOworCiAJc3Bpbl9sb2NrX2luaXQoJnJkZXYtPmlycS5zd19sb2NrKTsKIAlyID0gZHJtX3ZibGFua19pbml0KHJkZXYtPmRkZXYsIHJkZXYtPm51bV9jcnRjKTsKIAlpZiAocikgewpAQCAtMTIxLDcgKzEyNSw3IEBACiAJICogY2hpcHMuICBEaXNhYmxlIE1TSSBvbiB0aGVtIGZvciBub3cuCiAJICovCiAJaWYgKChyZGV2LT5mYW1pbHkgPj0gQ0hJUF9SVjM4MCkgJiYKLQkgICAgKCEocmRldi0+ZmxhZ3MgJiBSQURFT05fSVNfSUdQKSkgJiYKKwkgICAgKCghKHJkZXYtPmZsYWdzICYgUkFERU9OX0lTX0lHUCkpIHx8IChyZGV2LT5mYW1pbHkgPj0gQ0hJUF9QQUxNKSkgJiYKIAkgICAgKCEocmRldi0+ZmxhZ3MgJiBSQURFT05fSVNfQUdQKSkpIHsKIAkJaW50IHJldCA9IHBjaV9lbmFibGVfbXNpKHJkZXYtPnBkZXYpOwogCQlpZiAoIXJldCkgewpAQCAtMTQ4LDYgKzE1Miw3IEBACiAJCWlmIChyZGV2LT5tc2lfZW5hYmxlZCkKIAkJCXBjaV9kaXNhYmxlX21zaShyZGV2LT5wZGV2KTsKIAl9CisJZmx1c2hfd29ya19zeW5jKCZyZGV2LT5ob3RwbHVnX3dvcmspOwogfQogCiB2b2lkIHJhZGVvbl9pcnFfa21zX3N3X2lycV9nZXQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCkBAIC0xNzUsMyArMTgwLDM0IEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcmRldi0+aXJxLnN3X2xvY2ssIGlycWZsYWdzKTsKIH0KIAordm9pZCByYWRlb25faXJxX2ttc19wZmxpcF9pcnFfZ2V0KHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LCBpbnQgY3J0YykKK3sKKwl1bnNpZ25lZCBsb25nIGlycWZsYWdzOworCisJaWYgKGNydGMgPCAwIHx8IGNydGMgPj0gcmRldi0+bnVtX2NydGMpCisJCXJldHVybjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZyZGV2LT5pcnEucGZsaXBfbG9ja1tjcnRjXSwgaXJxZmxhZ3MpOworCWlmIChyZGV2LT5kZGV2LT5pcnFfZW5hYmxlZCAmJiAoKytyZGV2LT5pcnEucGZsaXBfcmVmY291bnRbY3J0Y10gPT0gMSkpIHsKKwkJcmRldi0+aXJxLnBmbGlwW2NydGNdID0gdHJ1ZTsKKwkJcmFkZW9uX2lycV9zZXQocmRldik7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJkZXYtPmlycS5wZmxpcF9sb2NrW2NydGNdLCBpcnFmbGFncyk7Cit9CisKK3ZvaWQgcmFkZW9uX2lycV9rbXNfcGZsaXBfaXJxX3B1dChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwgaW50IGNydGMpCit7CisJdW5zaWduZWQgbG9uZyBpcnFmbGFnczsKKworCWlmIChjcnRjIDwgMCB8fCBjcnRjID49IHJkZXYtPm51bV9jcnRjKQorCQlyZXR1cm47CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcmRldi0+aXJxLnBmbGlwX2xvY2tbY3J0Y10sIGlycWZsYWdzKTsKKwlCVUdfT04ocmRldi0+ZGRldi0+aXJxX2VuYWJsZWQgJiYgcmRldi0+aXJxLnBmbGlwX3JlZmNvdW50W2NydGNdIDw9IDApOworCWlmIChyZGV2LT5kZGV2LT5pcnFfZW5hYmxlZCAmJiAoLS1yZGV2LT5pcnEucGZsaXBfcmVmY291bnRbY3J0Y10gPT0gMCkpIHsKKwkJcmRldi0+aXJxLnBmbGlwW2NydGNdID0gZmFsc2U7CisJCXJhZGVvbl9pcnFfc2V0KHJkZXYpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyZGV2LT5pcnEucGZsaXBfbG9ja1tjcnRjXSwgaXJxZmxhZ3MpOworfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9rbXMuYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2ttcy5jCmluZGV4IDhmYmJlMWMuLjI4YTUzZTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2ttcy5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2ttcy5jCkBAIC05Niw5ICs5NiwyNyBAQAogCXJldHVybiByOwogfQogCitzdGF0aWMgdm9pZCByYWRlb25fc2V0X2ZpbHBfcmlnaHRzKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCisJCQkJICAgc3RydWN0IGRybV9maWxlICoqb3duZXIsCisJCQkJICAgc3RydWN0IGRybV9maWxlICphcHBsaWVyLAorCQkJCSAgIHVpbnQzMl90ICp2YWx1ZSkKK3sKKwltdXRleF9sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CisJaWYgKCp2YWx1ZSA9PSAxKSB7CisJCS8qIHdhbnRzIHJpZ2h0cyAqLworCQlpZiAoISpvd25lcikKKwkJCSpvd25lciA9IGFwcGxpZXI7CisJfSBlbHNlIGlmICgqdmFsdWUgPT0gMCkgeworCQkvKiByZXZva2VzIHJpZ2h0cyAqLworCQlpZiAoKm93bmVyID09IGFwcGxpZXIpCisJCQkqb3duZXIgPSBOVUxMOworCX0KKwkqdmFsdWUgPSAqb3duZXIgPT0gYXBwbGllciA/IDEgOiAwOworCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOworfQogCiAvKgotICogVXNlcnNwYWNlIGdldCBpbmZvcm1hdGlvbnMgaW9jdGwKKyAqIFVzZXJzcGFjZSBnZXQgaW5mb3JtYXRpb24gaW9jdGwKICAqLwogaW50IHJhZGVvbl9pbmZvX2lvY3RsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEsIHN0cnVjdCBkcm1fZmlsZSAqZmlscCkKIHsKQEAgLTE3MywxOCArMTkxLDE1IEBACiAJCQlEUk1fREVCVUdfS01TKCJXQU5UX0hZUEVSWjogaW52YWxpZCB2YWx1ZSAlZFxuIiwgdmFsdWUpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KLQkJbXV0ZXhfbG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwotCQlpZiAodmFsdWUgPT0gMSkgewotCQkJLyogd2FudHMgaHlwZXIteiAqLwotCQkJaWYgKCFyZGV2LT5oeXBlcnpfZmlscCkKLQkJCQlyZGV2LT5oeXBlcnpfZmlscCA9IGZpbHA7Ci0JCX0gZWxzZSBpZiAodmFsdWUgPT0gMCkgewotCQkJLyogcmV2b2tlcyBoeXBlci16ICovCi0JCQlpZiAocmRldi0+aHlwZXJ6X2ZpbHAgPT0gZmlscCkKLQkJCQlyZGV2LT5oeXBlcnpfZmlscCA9IE5VTEw7CisJCXJhZGVvbl9zZXRfZmlscF9yaWdodHMoZGV2LCAmcmRldi0+aHlwZXJ6X2ZpbHAsIGZpbHAsICZ2YWx1ZSk7CisJCWJyZWFrOworCWNhc2UgUkFERU9OX0lORk9fV0FOVF9DTUFTSzoKKwkJLyogVGhlIHNhbWUgbG9naWMgYXMgSHlwZXItWi4gKi8KKwkJaWYgKHZhbHVlID49IDIpIHsKKwkJCURSTV9ERUJVR19LTVMoIldBTlRfQ01BU0s6IGludmFsaWQgdmFsdWUgJWRcbiIsIHZhbHVlKTsKKwkJCXJldHVybiAtRUlOVkFMOwogCQl9Ci0JCXZhbHVlID0gcmRldi0+aHlwZXJ6X2ZpbHAgPT0gZmlscCA/ICAxIDogMDsKLQkJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CisJCXJhZGVvbl9zZXRfZmlscF9yaWdodHMoZGV2LCAmcmRldi0+Y21hc2tfZmlscCwgZmlscCwgJnZhbHVlKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJRFJNX0RFQlVHX0tNUygiSW52YWxpZCByZXF1ZXN0ICVkXG4iLCBpbmZvLT5yZXF1ZXN0KTsKQEAgLTIwMywxMCArMjE4LDYgQEAKICAqLwogaW50IHJhZGVvbl9kcml2ZXJfZmlyc3RvcGVuX2ttcyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogewotCXN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQotCWlmIChyZGV2LT5wb3dlcmVkX2Rvd24pCi0JCXJldHVybiAtRUlOVkFMOwogCXJldHVybiAwOwogfQogCkBAIC0yNzcsNiArMjg4LDI3IEBACiAJcmFkZW9uX2lycV9zZXQocmRldik7CiB9CiAKK2ludCByYWRlb25fZ2V0X3ZibGFua190aW1lc3RhbXBfa21zKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBjcnRjLAorCQkJCSAgICBpbnQgKm1heF9lcnJvciwKKwkJCQkgICAgc3RydWN0IHRpbWV2YWwgKnZibGFua190aW1lLAorCQkJCSAgICB1bnNpZ25lZCBmbGFncykKK3sKKwlzdHJ1Y3QgZHJtX2NydGMgKmRybWNydGM7CisJc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYgPSBkZXYtPmRldl9wcml2YXRlOworCisJaWYgKGNydGMgPCAwIHx8IGNydGMgPj0gZGV2LT5udW1fY3J0Y3MpIHsKKwkJRFJNX0VSUk9SKCJJbnZhbGlkIGNydGMgJWRcbiIsIGNydGMpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBHZXQgYXNzb2NpYXRlZCBkcm1fY3J0YzogKi8KKwlkcm1jcnRjID0gJnJkZXYtPm1vZGVfaW5mby5jcnRjc1tjcnRjXS0+YmFzZTsKKworCS8qIEhlbHBlciByb3V0aW5lIGluIERSTSBjb3JlIGRvZXMgYWxsIHRoZSB3b3JrOiAqLworCXJldHVybiBkcm1fY2FsY192Ymx0aW1lc3RhbXBfZnJvbV9zY2Fub3V0cG9zKGRldiwgY3J0YywgbWF4X2Vycm9yLAorCQkJCQkJICAgICB2YmxhbmtfdGltZSwgZmxhZ3MsCisJCQkJCQkgICAgIGRybWNydGMpOworfQogCiAvKgogICogSU9DVEwuCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9tb2RlLmggYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9tb2RlLmgKaW5kZXggZTMwMWM2Zi4uMTJiZGVhYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fbW9kZS5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX21vZGUuaApAQCAtMjc3LDYgKzI3Nyw5IEBACiAJZml4ZWQyMF8xMiBoc2M7CiAJc3RydWN0IGRybV9kaXNwbGF5X21vZGUgbmF0aXZlX21vZGU7CiAJaW50IHBsbF9pZDsKKwkvKiBwYWdlIGZsaXBwaW5nICovCisJc3RydWN0IHJhZGVvbl91bnBpbl93b3JrICp1bnBpbl93b3JrOworCWludCBkZWZlcnJlZF9mbGlwX2NvbXBsZXRpb247CiB9OwogCiBzdHJ1Y3QgcmFkZW9uX2VuY29kZXJfcHJpbWFyeV9kYWMgewpAQCAtMzc2LDYgKzM3OSw3IEBACiAJaW50IGhkbWlfYXVkaW9fd29ya2Fyb3VuZDsKIAlpbnQgaGRtaV9idWZmZXJfc3RhdHVzOwogCWJvb2wgaXNfZXh0X2VuY29kZXI7CisJdTE2IGNhcHM7CiB9OwogCiBzdHJ1Y3QgcmFkZW9uX2Nvbm5lY3Rvcl9hdG9tX2RpZyB7CkBAIC00NDIsMTAgKzQ0Niw2IEBACiAJc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmo7CiB9OwogCi0vKiByYWRlb25fZ2V0X2NydGNfc2Nhbm91dHBvcygpIHJldHVybiBmbGFncyAqLwotI2RlZmluZSBSQURFT05fU0NBTk9VVFBPU19WQUxJRCAgICAgICAgKDEgPDwgMCkKLSNkZWZpbmUgUkFERU9OX1NDQU5PVVRQT1NfSU5WQkwgICAgICAgICgxIDw8IDEpCi0jZGVmaW5lIFJBREVPTl9TQ0FOT1VUUE9TX0FDQ1VSQVRFICAgICAoMSA8PCAyKQogCiBleHRlcm4gZW51bSByYWRlb25fdHZfc3RkCiByYWRlb25fY29tYmlvc19nZXRfdHZfaW5mbyhzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CkBAIC01NjIsMTEgKzU2MiwxMiBAQAogZXh0ZXJuIGludCByYWRlb25fY3J0Y19jdXJzb3JfbW92ZShzdHJ1Y3QgZHJtX2NydGMgKmNydGMsCiAJCQkJICAgaW50IHgsIGludCB5KTsKIAotZXh0ZXJuIGludCByYWRlb25fZ2V0X2NydGNfc2Nhbm91dHBvcyhzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwgaW50IGNydGMsIGludCAqdnBvcywgaW50ICpocG9zKTsKK2V4dGVybiBpbnQgcmFkZW9uX2dldF9jcnRjX3NjYW5vdXRwb3Moc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGNydGMsCisJCQkJICAgICAgaW50ICp2cG9zLCBpbnQgKmhwb3MpOwogCiBleHRlcm4gYm9vbCByYWRlb25fY29tYmlvc19jaGVja19oYXJkY29kZWRfZWRpZChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CiBleHRlcm4gc3RydWN0IGVkaWQgKgotcmFkZW9uX2NvbWJpb3NfZ2V0X2hhcmRjb2RlZF9lZGlkKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKK3JhZGVvbl9iaW9zX2dldF9oYXJkY29kZWRfZWRpZChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CiBleHRlcm4gYm9vbCByYWRlb25fYXRvbV9nZXRfY2xvY2tfaW5mbyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKIGV4dGVybiBib29sIHJhZGVvbl9jb21iaW9zX2dldF9jbG9ja19pbmZvKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwogZXh0ZXJuIHN0cnVjdCByYWRlb25fZW5jb2Rlcl9hdG9tX2RpZyAqCkBAIC02NjIsNCArNjYzLDcgQEAKIGJvb2wgcmFkZW9uX2ZiZGV2X3JvYmpfaXNfZmIoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIHN0cnVjdCByYWRlb25fYm8gKnJvYmopOwogCiB2b2lkIHJhZGVvbl9mYl9vdXRwdXRfcG9sbF9jaGFuZ2VkKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKKwordm9pZCByYWRlb25fY3J0Y19oYW5kbGVfZmxpcChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiwgaW50IGNydGNfaWQpOworCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX29iamVjdC5jIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fb2JqZWN0LmMKaW5kZXggYTU5OGQwMC4uN2Q2YjhlOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fb2JqZWN0LmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fb2JqZWN0LmMKQEAgLTM0LDYgKzM0LDcgQEAKICNpbmNsdWRlIDxkcm0vZHJtUC5oPgogI2luY2x1ZGUgInJhZGVvbl9kcm0uaCIKICNpbmNsdWRlICJyYWRlb24uaCIKKyNpbmNsdWRlICJyYWRlb25fdHJhY2UuaCIKIAogCiBpbnQgcmFkZW9uX3R0bV9pbml0KHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKQEAgLTE0Niw2ICsxNDcsNyBAQAogCQlsaXN0X2FkZF90YWlsKCZiby0+bGlzdCwgJnJkZXYtPmdlbS5vYmplY3RzKTsKIAkJbXV0ZXhfdW5sb2NrKCZiby0+cmRldi0+Z2VtLm11dGV4KTsKIAl9CisJdHJhY2VfcmFkZW9uX2JvX2NyZWF0ZShibyk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTMwMiwzNCArMzA0LDkgQEAKIAkJCQlzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkKQogewogCWlmIChsb2JqLT53ZG9tYWluKSB7Ci0JCWxpc3RfYWRkKCZsb2JqLT5saXN0LCBoZWFkKTsKKwkJbGlzdF9hZGQoJmxvYmotPnR2LmhlYWQsIGhlYWQpOwogCX0gZWxzZSB7Ci0JCWxpc3RfYWRkX3RhaWwoJmxvYmotPmxpc3QsIGhlYWQpOwotCX0KLX0KLQotaW50IHJhZGVvbl9ib19saXN0X3Jlc2VydmUoc3RydWN0IGxpc3RfaGVhZCAqaGVhZCkKLXsKLQlzdHJ1Y3QgcmFkZW9uX2JvX2xpc3QgKmxvYmo7Ci0JaW50IHI7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGxvYmosIGhlYWQsIGxpc3QpewotCQlyID0gcmFkZW9uX2JvX3Jlc2VydmUobG9iai0+Ym8sIGZhbHNlKTsKLQkJaWYgKHVubGlrZWx5KHIgIT0gMCkpCi0JCQlyZXR1cm4gcjsKLQkJbG9iai0+cmVzZXJ2ZWQgPSB0cnVlOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotdm9pZCByYWRlb25fYm9fbGlzdF91bnJlc2VydmUoc3RydWN0IGxpc3RfaGVhZCAqaGVhZCkKLXsKLQlzdHJ1Y3QgcmFkZW9uX2JvX2xpc3QgKmxvYmo7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGxvYmosIGhlYWQsIGxpc3QpIHsKLQkJLyogb25seSB1bnJlc2VydmUgb2JqZWN0IHdlIHN1Y2Nlc3NmdWxseSByZXNlcnZlZCAqLwotCQlpZiAobG9iai0+cmVzZXJ2ZWQgJiYgcmFkZW9uX2JvX2lzX3Jlc2VydmVkKGxvYmotPmJvKSkKLQkJCXJhZGVvbl9ib191bnJlc2VydmUobG9iai0+Ym8pOworCQlsaXN0X2FkZF90YWlsKCZsb2JqLT50di5oZWFkLCBoZWFkKTsKIAl9CiB9CiAKQEAgLTM0MCwxNCArMzE3LDExIEBACiAJdTMyIGRvbWFpbjsKIAlpbnQgcjsKIAotCWxpc3RfZm9yX2VhY2hfZW50cnkobG9iaiwgaGVhZCwgbGlzdCkgewotCQlsb2JqLT5yZXNlcnZlZCA9IGZhbHNlOwotCX0KLQlyID0gcmFkZW9uX2JvX2xpc3RfcmVzZXJ2ZShoZWFkKTsKKwlyID0gdHRtX2V1X3Jlc2VydmVfYnVmZmVycyhoZWFkKTsKIAlpZiAodW5saWtlbHkociAhPSAwKSkgewogCQlyZXR1cm4gcjsKIAl9Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeShsb2JqLCBoZWFkLCBsaXN0KSB7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShsb2JqLCBoZWFkLCB0di5oZWFkKSB7CiAJCWJvID0gbG9iai0+Ym87CiAJCWlmICghYm8tPnBpbl9jb3VudCkgewogCQkJZG9tYWluID0gbG9iai0+d2RvbWFpbiA/IGxvYmotPndkb21haW4gOiBsb2JqLT5yZG9tYWluOwpAQCAtMzcwLDI1ICszNDQsNiBAQAogCXJldHVybiAwOwogfQogCi12b2lkIHJhZGVvbl9ib19saXN0X2ZlbmNlKHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQsIHZvaWQgKmZlbmNlKQotewotCXN0cnVjdCByYWRlb25fYm9fbGlzdCAqbG9iajsKLQlzdHJ1Y3QgcmFkZW9uX2JvICpibzsKLQlzdHJ1Y3QgcmFkZW9uX2ZlbmNlICpvbGRfZmVuY2UgPSBOVUxMOwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShsb2JqLCBoZWFkLCBsaXN0KSB7Ci0JCWJvID0gbG9iai0+Ym87Ci0JCXNwaW5fbG9jaygmYm8tPnRiby5sb2NrKTsKLQkJb2xkX2ZlbmNlID0gKHN0cnVjdCByYWRlb25fZmVuY2UgKiliby0+dGJvLnN5bmNfb2JqOwotCQliby0+dGJvLnN5bmNfb2JqID0gcmFkZW9uX2ZlbmNlX3JlZihmZW5jZSk7Ci0JCWJvLT50Ym8uc3luY19vYmpfYXJnID0gTlVMTDsKLQkJc3Bpbl91bmxvY2soJmJvLT50Ym8ubG9jayk7Ci0JCWlmIChvbGRfZmVuY2UpIHsKLQkJCXJhZGVvbl9mZW5jZV91bnJlZigmb2xkX2ZlbmNlKTsKLQkJfQotCX0KLX0KLQogaW50IHJhZGVvbl9ib19mYmRldl9tbWFwKHN0cnVjdCByYWRlb25fYm8gKmJvLAogCQkJICAgICBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX29iamVjdC5oIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fb2JqZWN0LmgKaW5kZXggZDE0MzcwMi4uMjJkNGMyMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fb2JqZWN0LmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fb2JqZWN0LmgKQEAgLTEyNiwxMiArMTI2LDEyIEBACiAJciA9IHR0bV9ib19yZXNlcnZlKCZiby0+dGJvLCB0cnVlLCBub193YWl0LCBmYWxzZSwgMCk7CiAJaWYgKHVubGlrZWx5KHIgIT0gMCkpCiAJCXJldHVybiByOwotCXNwaW5fbG9jaygmYm8tPnRiby5sb2NrKTsKKwlzcGluX2xvY2soJmJvLT50Ym8uYmRldi0+ZmVuY2VfbG9jayk7CiAJaWYgKG1lbV90eXBlKQogCQkqbWVtX3R5cGUgPSBiby0+dGJvLm1lbS5tZW1fdHlwZTsKIAlpZiAoYm8tPnRiby5zeW5jX29iaikKIAkJciA9IHR0bV9ib193YWl0KCZiby0+dGJvLCB0cnVlLCB0cnVlLCBub193YWl0KTsKLQlzcGluX3VubG9jaygmYm8tPnRiby5sb2NrKTsKKwlzcGluX3VubG9jaygmYm8tPnRiby5iZGV2LT5mZW5jZV9sb2NrKTsKIAl0dG1fYm9fdW5yZXNlcnZlKCZiby0+dGJvKTsKIAlyZXR1cm4gcjsKIH0KQEAgLTE1MiwxMCArMTUyLDcgQEAKIGV4dGVybiB2b2lkIHJhZGVvbl9ib19maW5pKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KTsKIGV4dGVybiB2b2lkIHJhZGVvbl9ib19saXN0X2FkZF9vYmplY3Qoc3RydWN0IHJhZGVvbl9ib19saXN0ICpsb2JqLAogCQkJCXN0cnVjdCBsaXN0X2hlYWQgKmhlYWQpOwotZXh0ZXJuIGludCByYWRlb25fYm9fbGlzdF9yZXNlcnZlKHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQpOwotZXh0ZXJuIHZvaWQgcmFkZW9uX2JvX2xpc3RfdW5yZXNlcnZlKHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQpOwogZXh0ZXJuIGludCByYWRlb25fYm9fbGlzdF92YWxpZGF0ZShzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkKTsKLWV4dGVybiB2b2lkIHJhZGVvbl9ib19saXN0X2ZlbmNlKHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQsIHZvaWQgKmZlbmNlKTsKIGV4dGVybiBpbnQgcmFkZW9uX2JvX2ZiZGV2X21tYXAoc3RydWN0IHJhZGVvbl9ibyAqYm8sCiAJCQkJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpOwogZXh0ZXJuIGludCByYWRlb25fYm9fc2V0X3RpbGluZ19mbGFncyhzdHJ1Y3QgcmFkZW9uX2JvICpibywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX3BtLmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9wbS5jCmluZGV4IDhjOWIyZWYuLjNiMWIyYmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX3BtLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fcG0uYwpAQCAtMTY3LDEzICsxNjcsMTMgQEAKIAlpZiAocmFkZW9uX2d1aV9pZGxlKHJkZXYpKSB7CiAJCXNjbGsgPSByZGV2LT5wbS5wb3dlcl9zdGF0ZVtyZGV2LT5wbS5yZXF1ZXN0ZWRfcG93ZXJfc3RhdGVfaW5kZXhdLgogCQkJY2xvY2tfaW5mb1tyZGV2LT5wbS5yZXF1ZXN0ZWRfY2xvY2tfbW9kZV9pbmRleF0uc2NsazsKLQkJaWYgKHNjbGsgPiByZGV2LT5jbG9jay5kZWZhdWx0X3NjbGspCi0JCQlzY2xrID0gcmRldi0+Y2xvY2suZGVmYXVsdF9zY2xrOworCQlpZiAoc2NsayA+IHJkZXYtPnBtLmRlZmF1bHRfc2NsaykKKwkJCXNjbGsgPSByZGV2LT5wbS5kZWZhdWx0X3NjbGs7CiAKIAkJbWNsayA9IHJkZXYtPnBtLnBvd2VyX3N0YXRlW3JkZXYtPnBtLnJlcXVlc3RlZF9wb3dlcl9zdGF0ZV9pbmRleF0uCiAJCQljbG9ja19pbmZvW3JkZXYtPnBtLnJlcXVlc3RlZF9jbG9ja19tb2RlX2luZGV4XS5tY2xrOwotCQlpZiAobWNsayA+IHJkZXYtPmNsb2NrLmRlZmF1bHRfbWNsaykKLQkJCW1jbGsgPSByZGV2LT5jbG9jay5kZWZhdWx0X21jbGs7CisJCWlmIChtY2xrID4gcmRldi0+cG0uZGVmYXVsdF9tY2xrKQorCQkJbWNsayA9IHJkZXYtPnBtLmRlZmF1bHRfbWNsazsKIAogCQkvKiB1cHZvbHQgYmVmb3JlIHJhaXNpbmcgY2xvY2tzLCBkb3dudm9sdCBhZnRlciBsb3dlcmluZyBjbG9ja3MgKi8KIAkJaWYgKHNjbGsgPCByZGV2LT5wbS5jdXJyZW50X3NjbGspCkBAIC00MDUsMjAgKzQwNSwxMyBAQAogCQlyZGV2LT5wbS5keW5wbV9wbGFubmVkX2FjdGlvbiA9IERZTlBNX0FDVElPTl9ERUZBVUxUOwogCQltdXRleF91bmxvY2soJnJkZXYtPnBtLm11dGV4KTsKIAl9IGVsc2UgaWYgKHN0cm5jbXAoInByb2ZpbGUiLCBidWYsIHN0cmxlbigicHJvZmlsZSIpKSA9PSAwKSB7Ci0JCWJvb2wgZmx1c2hfd3EgPSBmYWxzZTsKLQogCQltdXRleF9sb2NrKCZyZGV2LT5wbS5tdXRleCk7Ci0JCWlmIChyZGV2LT5wbS5wbV9tZXRob2QgPT0gUE1fTUVUSE9EX0RZTlBNKSB7Ci0JCQljYW5jZWxfZGVsYXllZF93b3JrKCZyZGV2LT5wbS5keW5wbV9pZGxlX3dvcmspOwotCQkJZmx1c2hfd3EgPSB0cnVlOwotCQl9CiAJCS8qIGRpc2FibGUgZHlucG0gKi8KIAkJcmRldi0+cG0uZHlucG1fc3RhdGUgPSBEWU5QTV9TVEFURV9ESVNBQkxFRDsKIAkJcmRldi0+cG0uZHlucG1fcGxhbm5lZF9hY3Rpb24gPSBEWU5QTV9BQ1RJT05fTk9ORTsKIAkJcmRldi0+cG0ucG1fbWV0aG9kID0gUE1fTUVUSE9EX1BST0ZJTEU7CiAJCW11dGV4X3VubG9jaygmcmRldi0+cG0ubXV0ZXgpOwotCQlpZiAoZmx1c2hfd3EpCi0JCQlmbHVzaF93b3JrcXVldWUocmRldi0+d3EpOworCQljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJnJkZXYtPnBtLmR5bnBtX2lkbGVfd29yayk7CiAJfSBlbHNlIHsKIAkJRFJNX0VSUk9SKCJpbnZhbGlkIHBvd2VyIG1ldGhvZCFcbiIpOwogCQlnb3RvIGZhaWw7CkBAIC00NDcsOCArNDQwLDEyIEBACiAJCXRlbXAgPSBydjc3MF9nZXRfdGVtcChyZGV2KTsKIAkJYnJlYWs7CiAJY2FzZSBUSEVSTUFMX1RZUEVfRVZFUkdSRUVOOgorCWNhc2UgVEhFUk1BTF9UWVBFX05JOgogCQl0ZW1wID0gZXZlcmdyZWVuX2dldF90ZW1wKHJkZXYpOwogCQlicmVhazsKKwljYXNlIFRIRVJNQUxfVFlQRV9TVU1POgorCQl0ZW1wID0gc3Vtb19nZXRfdGVtcChyZGV2KTsKKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJdGVtcCA9IDA7CiAJCWJyZWFrOwpAQCAtNDg3LDYgKzQ4NCw3IEBACiAJY2FzZSBUSEVSTUFMX1RZUEVfUlY2WFg6CiAJY2FzZSBUSEVSTUFMX1RZUEVfUlY3NzA6CiAJY2FzZSBUSEVSTUFMX1RZUEVfRVZFUkdSRUVOOgorCWNhc2UgVEhFUk1BTF9UWVBFX1NVTU86CiAJCXJkZXYtPnBtLmludF9od21vbl9kZXYgPSBod21vbl9kZXZpY2VfcmVnaXN0ZXIocmRldi0+ZGV2KTsKIAkJaWYgKElTX0VSUihyZGV2LT5wbS5pbnRfaHdtb25fZGV2KSkgewogCQkJZXJyID0gUFRSX0VSUihyZGV2LT5wbS5pbnRfaHdtb25fZGV2KTsKQEAgLTUyMCwzNCArNTE4LDM5IEBACiAKIHZvaWQgcmFkZW9uX3BtX3N1c3BlbmQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCiB7Ci0JYm9vbCBmbHVzaF93cSA9IGZhbHNlOwotCiAJbXV0ZXhfbG9jaygmcmRldi0+cG0ubXV0ZXgpOwogCWlmIChyZGV2LT5wbS5wbV9tZXRob2QgPT0gUE1fTUVUSE9EX0RZTlBNKSB7Ci0JCWNhbmNlbF9kZWxheWVkX3dvcmsoJnJkZXYtPnBtLmR5bnBtX2lkbGVfd29yayk7CiAJCWlmIChyZGV2LT5wbS5keW5wbV9zdGF0ZSA9PSBEWU5QTV9TVEFURV9BQ1RJVkUpCiAJCQlyZGV2LT5wbS5keW5wbV9zdGF0ZSA9IERZTlBNX1NUQVRFX1NVU1BFTkRFRDsKLQkJZmx1c2hfd3EgPSB0cnVlOwogCX0KIAltdXRleF91bmxvY2soJnJkZXYtPnBtLm11dGV4KTsKLQlpZiAoZmx1c2hfd3EpCi0JCWZsdXNoX3dvcmtxdWV1ZShyZGV2LT53cSk7CisKKwljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJnJkZXYtPnBtLmR5bnBtX2lkbGVfd29yayk7CiB9CiAKIHZvaWQgcmFkZW9uX3BtX3Jlc3VtZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKIHsKKwkvKiBzZXQgdXAgdGhlIGRlZmF1bHQgY2xvY2tzIGlmIHRoZSBNQyB1Y29kZSBpcyBsb2FkZWQgKi8KKwlpZiAoQVNJQ19JU19EQ0U1KHJkZXYpICYmIHJkZXYtPm1jX2Z3KSB7CisJCWlmIChyZGV2LT5wbS5kZWZhdWx0X3ZkZGMpCisJCQlyYWRlb25fYXRvbV9zZXRfdm9sdGFnZShyZGV2LCByZGV2LT5wbS5kZWZhdWx0X3ZkZGMpOworCQlpZiAocmRldi0+cG0uZGVmYXVsdF9zY2xrKQorCQkJcmFkZW9uX3NldF9lbmdpbmVfY2xvY2socmRldiwgcmRldi0+cG0uZGVmYXVsdF9zY2xrKTsKKwkJaWYgKHJkZXYtPnBtLmRlZmF1bHRfbWNsaykKKwkJCXJhZGVvbl9zZXRfbWVtb3J5X2Nsb2NrKHJkZXYsIHJkZXYtPnBtLmRlZmF1bHRfbWNsayk7CisJfQogCS8qIGFzaWMgaW5pdCB3aWxsIHJlc2V0IHRoZSBkZWZhdWx0IHBvd2VyIHN0YXRlICovCiAJbXV0ZXhfbG9jaygmcmRldi0+cG0ubXV0ZXgpOwogCXJkZXYtPnBtLmN1cnJlbnRfcG93ZXJfc3RhdGVfaW5kZXggPSByZGV2LT5wbS5kZWZhdWx0X3Bvd2VyX3N0YXRlX2luZGV4OwogCXJkZXYtPnBtLmN1cnJlbnRfY2xvY2tfbW9kZV9pbmRleCA9IDA7Ci0JcmRldi0+cG0uY3VycmVudF9zY2xrID0gcmRldi0+Y2xvY2suZGVmYXVsdF9zY2xrOwotCXJkZXYtPnBtLmN1cnJlbnRfbWNsayA9IHJkZXYtPmNsb2NrLmRlZmF1bHRfbWNsazsKKwlyZGV2LT5wbS5jdXJyZW50X3NjbGsgPSByZGV2LT5wbS5kZWZhdWx0X3NjbGs7CisJcmRldi0+cG0uY3VycmVudF9tY2xrID0gcmRldi0+cG0uZGVmYXVsdF9tY2xrOwogCXJkZXYtPnBtLmN1cnJlbnRfdmRkYyA9IHJkZXYtPnBtLnBvd2VyX3N0YXRlW3JkZXYtPnBtLmRlZmF1bHRfcG93ZXJfc3RhdGVfaW5kZXhdLmNsb2NrX2luZm9bMF0udm9sdGFnZS52b2x0YWdlOwogCWlmIChyZGV2LT5wbS5wbV9tZXRob2QgPT0gUE1fTUVUSE9EX0RZTlBNCiAJICAgICYmIHJkZXYtPnBtLmR5bnBtX3N0YXRlID09IERZTlBNX1NUQVRFX1NVU1BFTkRFRCkgewogCQlyZGV2LT5wbS5keW5wbV9zdGF0ZSA9IERZTlBNX1NUQVRFX0FDVElWRTsKLQkJcXVldWVfZGVsYXllZF93b3JrKHJkZXYtPndxLCAmcmRldi0+cG0uZHlucG1faWRsZV93b3JrLAotCQkJCQltc2Vjc190b19qaWZmaWVzKFJBREVPTl9JRExFX0xPT1BfTVMpKTsKKwkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZyZGV2LT5wbS5keW5wbV9pZGxlX3dvcmssCisJCQkJICAgICAgbXNlY3NfdG9famlmZmllcyhSQURFT05fSURMRV9MT09QX01TKSk7CiAJfQogCW11dGV4X3VubG9jaygmcmRldi0+cG0ubXV0ZXgpOwogCXJhZGVvbl9wbV9jb21wdXRlX2Nsb2NrcyhyZGV2KTsKQEAgLTU2NCw2ICs1NjcsOCBAQAogCXJkZXYtPnBtLmR5bnBtX3BsYW5uZWRfYWN0aW9uID0gRFlOUE1fQUNUSU9OX05PTkU7CiAJcmRldi0+cG0uZHlucG1fY2FuX3VwY2xvY2sgPSB0cnVlOwogCXJkZXYtPnBtLmR5bnBtX2Nhbl9kb3duY2xvY2sgPSB0cnVlOworCXJkZXYtPnBtLmRlZmF1bHRfc2NsayA9IHJkZXYtPmNsb2NrLmRlZmF1bHRfc2NsazsKKwlyZGV2LT5wbS5kZWZhdWx0X21jbGsgPSByZGV2LT5jbG9jay5kZWZhdWx0X21jbGs7CiAJcmRldi0+cG0uY3VycmVudF9zY2xrID0gcmRldi0+Y2xvY2suZGVmYXVsdF9zY2xrOwogCXJkZXYtPnBtLmN1cnJlbnRfbWNsayA9IHJkZXYtPmNsb2NrLmRlZmF1bHRfbWNsazsKIAlyZGV2LT5wbS5pbnRfdGhlcm1hbF90eXBlID0gVEhFUk1BTF9UWVBFX05PTkU7CkBAIC01NzUsMTIgKzU4MCwyNCBAQAogCQkJcmFkZW9uX2NvbWJpb3NfZ2V0X3Bvd2VyX21vZGVzKHJkZXYpOwogCQlyYWRlb25fcG1fcHJpbnRfc3RhdGVzKHJkZXYpOwogCQlyYWRlb25fcG1faW5pdF9wcm9maWxlKHJkZXYpOworCQkvKiBzZXQgdXAgdGhlIGRlZmF1bHQgY2xvY2tzIGlmIHRoZSBNQyB1Y29kZSBpcyBsb2FkZWQgKi8KKwkJaWYgKEFTSUNfSVNfRENFNShyZGV2KSAmJiByZGV2LT5tY19mdykgeworCQkJaWYgKHJkZXYtPnBtLmRlZmF1bHRfdmRkYykKKwkJCQlyYWRlb25fYXRvbV9zZXRfdm9sdGFnZShyZGV2LCByZGV2LT5wbS5kZWZhdWx0X3ZkZGMpOworCQkJaWYgKHJkZXYtPnBtLmRlZmF1bHRfc2NsaykKKwkJCQlyYWRlb25fc2V0X2VuZ2luZV9jbG9jayhyZGV2LCByZGV2LT5wbS5kZWZhdWx0X3NjbGspOworCQkJaWYgKHJkZXYtPnBtLmRlZmF1bHRfbWNsaykKKwkJCQlyYWRlb25fc2V0X21lbW9yeV9jbG9jayhyZGV2LCByZGV2LT5wbS5kZWZhdWx0X21jbGspOworCQl9CiAJfQogCiAJLyogc2V0IHVwIHRoZSBpbnRlcm5hbCB0aGVybWFsIHNlbnNvciBpZiBhcHBsaWNhYmxlICovCiAJcmV0ID0gcmFkZW9uX2h3bW9uX2luaXQocmRldik7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKKworCUlOSVRfREVMQVlFRF9XT1JLKCZyZGV2LT5wbS5keW5wbV9pZGxlX3dvcmssIHJhZGVvbl9keW5wbV9pZGxlX3dvcmtfaGFuZGxlcik7CisKIAlpZiAocmRldi0+cG0ubnVtX3Bvd2VyX3N0YXRlcyA+IDEpIHsKIAkJLyogd2hlcmUncyB0aGUgYmVzdCBwbGFjZSB0byBwdXQgdGhlc2U/ICovCiAJCXJldCA9IGRldmljZV9jcmVhdGVfZmlsZShyZGV2LT5kZXYsICZkZXZfYXR0cl9wb3dlcl9wcm9maWxlKTsKQEAgLTU5NCw4ICs2MTEsNiBAQAogCQlyZGV2LT5hY3BpX25iLm5vdGlmaWVyX2NhbGwgPSByYWRlb25fYWNwaV9ldmVudDsKIAkJcmVnaXN0ZXJfYWNwaV9ub3RpZmllcigmcmRldi0+YWNwaV9uYik7CiAjZW5kaWYKLQkJSU5JVF9ERUxBWUVEX1dPUksoJnJkZXYtPnBtLmR5bnBtX2lkbGVfd29yaywgcmFkZW9uX2R5bnBtX2lkbGVfd29ya19oYW5kbGVyKTsKLQogCQlpZiAocmFkZW9uX2RlYnVnZnNfcG1faW5pdChyZGV2KSkgewogCQkJRFJNX0VSUk9SKCJGYWlsZWQgdG8gcmVnaXN0ZXIgZGVidWdmcyBmaWxlIGZvciBQTSFcbiIpOwogCQl9CkBAIC02MDksMjUgKzYyNCwyMCBAQAogdm9pZCByYWRlb25fcG1fZmluaShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKIHsKIAlpZiAocmRldi0+cG0ubnVtX3Bvd2VyX3N0YXRlcyA+IDEpIHsKLQkJYm9vbCBmbHVzaF93cSA9IGZhbHNlOwotCiAJCW11dGV4X2xvY2soJnJkZXYtPnBtLm11dGV4KTsKIAkJaWYgKHJkZXYtPnBtLnBtX21ldGhvZCA9PSBQTV9NRVRIT0RfUFJPRklMRSkgewogCQkJcmRldi0+cG0ucHJvZmlsZSA9IFBNX1BST0ZJTEVfREVGQVVMVDsKIAkJCXJhZGVvbl9wbV91cGRhdGVfcHJvZmlsZShyZGV2KTsKIAkJCXJhZGVvbl9wbV9zZXRfY2xvY2tzKHJkZXYpOwogCQl9IGVsc2UgaWYgKHJkZXYtPnBtLnBtX21ldGhvZCA9PSBQTV9NRVRIT0RfRFlOUE0pIHsKLQkJCS8qIGNhbmNlbCB3b3JrICovCi0JCQljYW5jZWxfZGVsYXllZF93b3JrKCZyZGV2LT5wbS5keW5wbV9pZGxlX3dvcmspOwotCQkJZmx1c2hfd3EgPSB0cnVlOwogCQkJLyogcmVzZXQgZGVmYXVsdCBjbG9ja3MgKi8KIAkJCXJkZXYtPnBtLmR5bnBtX3N0YXRlID0gRFlOUE1fU1RBVEVfRElTQUJMRUQ7CiAJCQlyZGV2LT5wbS5keW5wbV9wbGFubmVkX2FjdGlvbiA9IERZTlBNX0FDVElPTl9ERUZBVUxUOwogCQkJcmFkZW9uX3BtX3NldF9jbG9ja3MocmRldik7CiAJCX0KIAkJbXV0ZXhfdW5sb2NrKCZyZGV2LT5wbS5tdXRleCk7Ci0JCWlmIChmbHVzaF93cSkKLQkJCWZsdXNoX3dvcmtxdWV1ZShyZGV2LT53cSk7CisKKwkJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZyZGV2LT5wbS5keW5wbV9pZGxlX3dvcmspOwogCiAJCWRldmljZV9yZW1vdmVfZmlsZShyZGV2LT5kZXYsICZkZXZfYXR0cl9wb3dlcl9wcm9maWxlKTsKIAkJZGV2aWNlX3JlbW92ZV9maWxlKHJkZXYtPmRldiwgJmRldl9hdHRyX3Bvd2VyX21ldGhvZCk7CkBAIC02ODYsMTIgKzY5NiwxMiBAQAogCQkJCQlyYWRlb25fcG1fZ2V0X2R5bnBtX3N0YXRlKHJkZXYpOwogCQkJCQlyYWRlb25fcG1fc2V0X2Nsb2NrcyhyZGV2KTsKIAotCQkJCQlxdWV1ZV9kZWxheWVkX3dvcmsocmRldi0+d3EsICZyZGV2LT5wbS5keW5wbV9pZGxlX3dvcmssCi0JCQkJCQkJICAgbXNlY3NfdG9famlmZmllcyhSQURFT05fSURMRV9MT09QX01TKSk7CisJCQkJCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmcmRldi0+cG0uZHlucG1faWRsZV93b3JrLAorCQkJCQkJCSAgICAgIG1zZWNzX3RvX2ppZmZpZXMoUkFERU9OX0lETEVfTE9PUF9NUykpOwogCQkJCX0gZWxzZSBpZiAocmRldi0+cG0uZHlucG1fc3RhdGUgPT0gRFlOUE1fU1RBVEVfUEFVU0VEKSB7CiAJCQkJCXJkZXYtPnBtLmR5bnBtX3N0YXRlID0gRFlOUE1fU1RBVEVfQUNUSVZFOwotCQkJCQlxdWV1ZV9kZWxheWVkX3dvcmsocmRldi0+d3EsICZyZGV2LT5wbS5keW5wbV9pZGxlX3dvcmssCi0JCQkJCQkJICAgbXNlY3NfdG9famlmZmllcyhSQURFT05fSURMRV9MT09QX01TKSk7CisJCQkJCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmcmRldi0+cG0uZHlucG1faWRsZV93b3JrLAorCQkJCQkJCSAgICAgIG1zZWNzX3RvX2ppZmZpZXMoUkFERU9OX0lETEVfTE9PUF9NUykpOwogCQkJCQlEUk1fREVCVUdfRFJJVkVSKCJyYWRlb246IGR5bmFtaWMgcG93ZXIgbWFuYWdlbWVudCBhY3RpdmF0ZWRcbiIpOwogCQkJCX0KIAkJCX0gZWxzZSB7IC8qIGNvdW50ID09IDAgKi8KQEAgLTcyMCw5ICs3MzAsOSBAQAogCSAqLwogCWZvciAoY3J0YyA9IDA7IChjcnRjIDwgcmRldi0+bnVtX2NydGMpICYmIGluX3ZibDsgY3J0YysrKSB7CiAJCWlmIChyZGV2LT5wbS5hY3RpdmVfY3J0Y3MgJiAoMSA8PCBjcnRjKSkgewotCQkJdmJsX3N0YXR1cyA9IHJhZGVvbl9nZXRfY3J0Y19zY2Fub3V0cG9zKHJkZXYsIGNydGMsICZ2cG9zLCAmaHBvcyk7Ci0JCQlpZiAoKHZibF9zdGF0dXMgJiBSQURFT05fU0NBTk9VVFBPU19WQUxJRCkgJiYKLQkJCSAgICAhKHZibF9zdGF0dXMgJiBSQURFT05fU0NBTk9VVFBPU19JTlZCTCkpCisJCQl2Ymxfc3RhdHVzID0gcmFkZW9uX2dldF9jcnRjX3NjYW5vdXRwb3MocmRldi0+ZGRldiwgY3J0YywgJnZwb3MsICZocG9zKTsKKwkJCWlmICgodmJsX3N0YXR1cyAmIERSTV9TQ0FOT1VUUE9TX1ZBTElEKSAmJgorCQkJICAgICEodmJsX3N0YXR1cyAmIERSTV9TQ0FOT1VUUE9TX0lOVkJMKSkKIAkJCQlpbl92YmwgPSBmYWxzZTsKIAkJfQogCX0KQEAgLTc5Niw4ICs4MDYsOCBAQAogCQkJcmFkZW9uX3BtX3NldF9jbG9ja3MocmRldik7CiAJCX0KIAotCQlxdWV1ZV9kZWxheWVkX3dvcmsocmRldi0+d3EsICZyZGV2LT5wbS5keW5wbV9pZGxlX3dvcmssCi0JCQkJCW1zZWNzX3RvX2ppZmZpZXMoUkFERU9OX0lETEVfTE9PUF9NUykpOworCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJnJkZXYtPnBtLmR5bnBtX2lkbGVfd29yaywKKwkJCQkgICAgICBtc2Vjc190b19qaWZmaWVzKFJBREVPTl9JRExFX0xPT1BfTVMpKTsKIAl9CiAJbXV0ZXhfdW5sb2NrKCZyZGV2LT5wbS5tdXRleCk7CiAJdHRtX2JvX3VubG9ja19kZWxheWVkX3dvcmtxdWV1ZSgmcmRldi0+bW1hbi5iZGV2LCByZXNjaGVkKTsKQEAgLTgxNCw5ICs4MjQsOSBAQAogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBub2RlLT5taW5vci0+ZGV2OwogCXN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAotCXNlcV9wcmludGYobSwgImRlZmF1bHQgZW5naW5lIGNsb2NrOiAldTAga0h6XG4iLCByZGV2LT5jbG9jay5kZWZhdWx0X3NjbGspOworCXNlcV9wcmludGYobSwgImRlZmF1bHQgZW5naW5lIGNsb2NrOiAldTAga0h6XG4iLCByZGV2LT5wbS5kZWZhdWx0X3NjbGspOwogCXNlcV9wcmludGYobSwgImN1cnJlbnQgZW5naW5lIGNsb2NrOiAldTAga0h6XG4iLCByYWRlb25fZ2V0X2VuZ2luZV9jbG9jayhyZGV2KSk7Ci0Jc2VxX3ByaW50ZihtLCAiZGVmYXVsdCBtZW1vcnkgY2xvY2s6ICV1MCBrSHpcbiIsIHJkZXYtPmNsb2NrLmRlZmF1bHRfbWNsayk7CisJc2VxX3ByaW50ZihtLCAiZGVmYXVsdCBtZW1vcnkgY2xvY2s6ICV1MCBrSHpcbiIsIHJkZXYtPnBtLmRlZmF1bHRfbWNsayk7CiAJaWYgKHJkZXYtPmFzaWMtPmdldF9tZW1vcnlfY2xvY2spCiAJCXNlcV9wcmludGYobSwgImN1cnJlbnQgbWVtb3J5IGNsb2NrOiAldTAga0h6XG4iLCByYWRlb25fZ2V0X21lbW9yeV9jbG9jayhyZGV2KSk7CiAJaWYgKHJkZXYtPnBtLmN1cnJlbnRfdmRkYykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX3JlZy5oIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fcmVnLmgKaW5kZXggNjQ5Mjg4MS4uM2NkNGRhYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fcmVnLmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fcmVnLmgKQEAgLTU1LDYgKzU1LDcgQEAKICNpbmNsdWRlICJyNTAwX3JlZy5oIgogI2luY2x1ZGUgInI2MDBfcmVnLmgiCiAjaW5jbHVkZSAiZXZlcmdyZWVuX3JlZy5oIgorI2luY2x1ZGUgIm5pX3JlZy5oIgogCiAjZGVmaW5lIFJBREVPTl9NQ19BR1BfTE9DQVRJT04JCTB4MDE0YwogI2RlZmluZQkJUkFERU9OX01DX0FHUF9TVEFSVF9NQVNLCTB4MDAwMEZGRkYKQEAgLTMyMCw2ICszMjEsMTUgQEAKICMgICAgICAgZGVmaW5lIFJBREVPTl9QQ0lFX0xDX1JFQ09ORklHX05PVyAgICAgICAgICgxIDw8IDgpCiAjICAgICAgIGRlZmluZSBSQURFT05fUENJRV9MQ19SRUNPTkZJR19MQVRFUiAgICAgICAoMSA8PCA5KQogIyAgICAgICBkZWZpbmUgUkFERU9OX1BDSUVfTENfU0hPUlRfUkVDT05GSUdfRU4gICAgKDEgPDwgMTApCisjICAgICAgIGRlZmluZSBSNjAwX1BDSUVfTENfUkVDT05GSUdfQVJDX01JU1NJTkdfRVNDQVBFICAgKDEgPDwgNykKKyMgICAgICAgZGVmaW5lIFI2MDBfUENJRV9MQ19SRU5FR09USUFUSU9OX1NVUFBPUlQgICgxIDw8IDkpCisjICAgICAgIGRlZmluZSBSNjAwX1BDSUVfTENfUkVORUdPVElBVEVfRU4gICAgICAgICAoMSA8PCAxMCkKKyMgICAgICAgZGVmaW5lIFI2MDBfUENJRV9MQ19TSE9SVF9SRUNPTkZJR19FTiAgICAgICgxIDw8IDExKQorIyAgICAgICBkZWZpbmUgUjYwMF9QQ0lFX0xDX1VQQ09ORklHVVJFX1NVUFBPUlQgICAgKDEgPDwgMTIpCisjICAgICAgIGRlZmluZSBSNjAwX1BDSUVfTENfVVBDT05GSUdVUkVfRElTICAgICAgICAoMSA8PCAxMykKKworI2RlZmluZSBSNjAwX1RBUkdFVF9BTkRfQ1VSUkVOVF9QUk9GSUxFX0lOREVYICAgICAgMHg3MGMKKyNkZWZpbmUgUjcwMF9UQVJHRVRfQU5EX0NVUlJFTlRfUFJPRklMRV9JTkRFWCAgICAgIDB4NjZjCiAKICNkZWZpbmUgUkFERU9OX0NBQ0hFX0NOVEwgICAgICAgICAgICAgICAgICAgMHgxNzI0CiAjZGVmaW5lIFJBREVPTl9DQUNIRV9MSU5FICAgICAgICAgICAgICAgICAgIDB4MGYwYyAvKiBQQ0kgKi8KQEAgLTQyMiw2ICs0MzIsNyBAQAogIyAgICAgICBkZWZpbmUgUkFERU9OX0NSVENfQ1NZTkNfRU4gICAgICAgICAoMSA8PCAgNCkKICMgICAgICAgZGVmaW5lIFJBREVPTl9DUlRDX0lDT05fRU4gICAgICAgICAgKDEgPDwgMTUpCiAjICAgICAgIGRlZmluZSBSQURFT05fQ1JUQ19DVVJfRU4gICAgICAgICAgICgxIDw8IDE2KQorIyAgICAgICBkZWZpbmUgUkFERU9OX0NSVENfVlNUQVRfTU9ERV9NQVNLICAoMyA8PCAxNykKICMgICAgICAgZGVmaW5lIFJBREVPTl9DUlRDX0NVUl9NT0RFX01BU0sgICAgKDcgPDwgMjApCiAjICAgICAgIGRlZmluZSBSQURFT05fQ1JUQ19DVVJfTU9ERV9TSElGVCAgIDIwCiAjICAgICAgIGRlZmluZSBSQURFT05fQ1JUQ19DVVJfTU9ERV9NT05PICAgIDAKQEAgLTUwOSw2ICs1MjAsOCBAQAogIyAgICAgICBkZWZpbmUgUkFERU9OX0NSVENfVElMRV9FTiAgICAgICAgICAgICAgICAgICAgICAoMSA8PCAxNSkKICMgICAgICAgZGVmaW5lIFJBREVPTl9DUlRDX09GRlNFVF9GTElQX0NOVEwgICAgICAgICAgICAgKDEgPDwgMTYpCiAjICAgICAgIGRlZmluZSBSQURFT05fQ1JUQ19TVEVSRU9fT0ZGU0VUX0VOICAgICAgICAgICAgICgxIDw8IDE3KQorIyAgICAgICBkZWZpbmUgUkFERU9OX0NSVENfR1VJX1RSSUdfT0ZGU0VUX0xFRlRfRU4gICAgICAoMSA8PCAyOCkKKyMgICAgICAgZGVmaW5lIFJBREVPTl9DUlRDX0dVSV9UUklHX09GRlNFVF9SSUdIVF9FTiAgICAgKDEgPDwgMjkpCiAKICNkZWZpbmUgUjMwMF9DUlRDX1RJTEVfWDBfWTAJICAgICAgICAgICAgMHgwMzUwCiAjZGVmaW5lIFIzMDBfQ1JUQzJfVElMRV9YMF9ZMAkgICAgICAgICAgICAweDAzNTgKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX3RyYWNlLmggYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl90cmFjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhZmQ4MTYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl90cmFjZS5oCkBAIC0wLDAgKzEsODIgQEAKKyNpZiAhZGVmaW5lZChfUkFERU9OX1RSQUNFX0gpIHx8IGRlZmluZWQoVFJBQ0VfSEVBREVSX01VTFRJX1JFQUQpCisjZGVmaW5lIF9SQURFT05fVFJBQ0VfSF8KKworI2luY2x1ZGUgPGxpbnV4L3N0cmluZ2lmeS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvdHJhY2Vwb2ludC5oPgorCisjaW5jbHVkZSA8ZHJtL2RybVAuaD4KKworI3VuZGVmIFRSQUNFX1NZU1RFTQorI2RlZmluZSBUUkFDRV9TWVNURU0gcmFkZW9uCisjZGVmaW5lIFRSQUNFX1NZU1RFTV9TVFJJTkcgX19zdHJpbmdpZnkoVFJBQ0VfU1lTVEVNKQorI2RlZmluZSBUUkFDRV9JTkNMVURFX0ZJTEUgcmFkZW9uX3RyYWNlCisKK1RSQUNFX0VWRU5UKHJhZGVvbl9ib19jcmVhdGUsCisJICAgIFRQX1BST1RPKHN0cnVjdCByYWRlb25fYm8gKmJvKSwKKwkgICAgVFBfQVJHUyhibyksCisJICAgIFRQX1NUUlVDVF9fZW50cnkoCisJCQkgICAgIF9fZmllbGQoc3RydWN0IHJhZGVvbl9ibyAqLCBibykKKwkJCSAgICAgX19maWVsZCh1MzIsIHBhZ2VzKQorCQkJICAgICApLAorCisJICAgIFRQX2Zhc3RfYXNzaWduKAorCQkJICAgX19lbnRyeS0+Ym8gPSBibzsKKwkJCSAgIF9fZW50cnktPnBhZ2VzID0gYm8tPnRiby5udW1fcGFnZXM7CisJCQkgICApLAorCSAgICBUUF9wcmludGsoImJvPSVwLCBwYWdlcz0ldSIsIF9fZW50cnktPmJvLCBfX2VudHJ5LT5wYWdlcykKKyk7CisKK0RFQ0xBUkVfRVZFTlRfQ0xBU1MocmFkZW9uX2ZlbmNlX3JlcXVlc3QsCisKKwkgICAgVFBfUFJPVE8oc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdTMyIHNlcW5vKSwKKworCSAgICBUUF9BUkdTKGRldiwgc2Vxbm8pLAorCisJICAgIFRQX1NUUlVDVF9fZW50cnkoCisJCQkgICAgIF9fZmllbGQodTMyLCBkZXYpCisJCQkgICAgIF9fZmllbGQodTMyLCBzZXFubykKKwkJCSAgICAgKSwKKworCSAgICBUUF9mYXN0X2Fzc2lnbigKKwkJCSAgIF9fZW50cnktPmRldiA9IGRldi0+cHJpbWFyeS0+aW5kZXg7CisJCQkgICBfX2VudHJ5LT5zZXFubyA9IHNlcW5vOworCQkJICAgKSwKKworCSAgICBUUF9wcmludGsoImRldj0ldSwgc2Vxbm89JXUiLCBfX2VudHJ5LT5kZXYsIF9fZW50cnktPnNlcW5vKQorKTsKKworREVGSU5FX0VWRU5UKHJhZGVvbl9mZW5jZV9yZXF1ZXN0LCByYWRlb25fZmVuY2VfZW1pdCwKKworCSAgICBUUF9QUk9UTyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1MzIgc2Vxbm8pLAorCisJICAgIFRQX0FSR1MoZGV2LCBzZXFubykKKyk7CisKK0RFRklORV9FVkVOVChyYWRlb25fZmVuY2VfcmVxdWVzdCwgcmFkZW9uX2ZlbmNlX3JldGlyZSwKKworCSAgICBUUF9QUk9UTyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1MzIgc2Vxbm8pLAorCisJICAgIFRQX0FSR1MoZGV2LCBzZXFubykKKyk7CisKK0RFRklORV9FVkVOVChyYWRlb25fZmVuY2VfcmVxdWVzdCwgcmFkZW9uX2ZlbmNlX3dhaXRfYmVnaW4sCisKKwkgICAgVFBfUFJPVE8oc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdTMyIHNlcW5vKSwKKworCSAgICBUUF9BUkdTKGRldiwgc2Vxbm8pCispOworCitERUZJTkVfRVZFTlQocmFkZW9uX2ZlbmNlX3JlcXVlc3QsIHJhZGVvbl9mZW5jZV93YWl0X2VuZCwKKworCSAgICBUUF9QUk9UTyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1MzIgc2Vxbm8pLAorCisJICAgIFRQX0FSR1MoZGV2LCBzZXFubykKKyk7CisKKyNlbmRpZgorCisvKiBUaGlzIHBhcnQgbXVzdCBiZSBvdXRzaWRlIHByb3RlY3Rpb24gKi8KKyN1bmRlZiBUUkFDRV9JTkNMVURFX1BBVEgKKyNkZWZpbmUgVFJBQ0VfSU5DTFVERV9QQVRIIC4KKyNpbmNsdWRlIDx0cmFjZS9kZWZpbmVfdHJhY2UuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX3RyYWNlX3BvaW50cy5jIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fdHJhY2VfcG9pbnRzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODE3NTk5MwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX3RyYWNlX3BvaW50cy5jCkBAIC0wLDAgKzEsOSBAQAorLyogQ29weXJpZ2h0IFJlZCBIYXQgSW5jIDIwMTAuCisgKiBBdXRob3IgOiBEYXZlIEFpcmxpZSA8YWlybGllZEByZWRoYXQuY29tPgorICovCisjaW5jbHVkZSA8ZHJtL2RybVAuaD4KKyNpbmNsdWRlICJyYWRlb25fZHJtLmgiCisjaW5jbHVkZSAicmFkZW9uLmgiCisKKyNkZWZpbmUgQ1JFQVRFX1RSQUNFX1BPSU5UUworI2luY2x1ZGUgInJhZGVvbl90cmFjZS5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yZWdfc3Jjcy9ydjUxNSBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmVnX3NyY3MvcnY1MTUKaW5kZXggYjNmOWYxZC4uZWY0MjJiYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yZWdfc3Jjcy9ydjUxNQorKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JlZ19zcmNzL3J2NTE1CkBAIC0zMDQsNiArMzA0LDIyIEBACiAweDQ2MzAgVVNfQ09ERV9BRERSCiAweDQ2MzQgVVNfQ09ERV9SQU5HRQogMHg0NjM4IFVTX0NPREVfT0ZGU0VUCisweDQ2NDAgVVNfRk9STUFUMF8wCisweDQ2NDQgVVNfRk9STUFUMF8xCisweDQ2NDggVVNfRk9STUFUMF8yCisweDQ2NEMgVVNfRk9STUFUMF8zCisweDQ2NTAgVVNfRk9STUFUMF80CisweDQ2NTQgVVNfRk9STUFUMF81CisweDQ2NTggVVNfRk9STUFUMF82CisweDQ2NUMgVVNfRk9STUFUMF83CisweDQ2NjAgVVNfRk9STUFUMF84CisweDQ2NjQgVVNfRk9STUFUMF85CisweDQ2NjggVVNfRk9STUFUMF8xMAorMHg0NjZDIFVTX0ZPUk1BVDBfMTEKKzB4NDY3MCBVU19GT1JNQVQwXzEyCisweDQ2NzQgVVNfRk9STUFUMF8xMworMHg0Njc4IFVTX0ZPUk1BVDBfMTQKKzB4NDY3QyBVU19GT1JNQVQwXzE1CiAweDQ2QTQgVVNfT1VUX0ZNVF8wCiAweDQ2QTggVVNfT1VUX0ZNVF8xCiAweDQ2QUMgVVNfT1VUX0ZNVF8yCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JzNjAwLmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JzNjAwLmMKaW5kZXggZjFjNmUwMi4uYjQxOTJhYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yczYwMC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcnM2MDAuYwpAQCAtNDYsNiArNDYsNTYgQEAKIHZvaWQgcnM2MDBfZ3B1X2luaXQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwogaW50IHJzNjAwX21jX3dhaXRfZm9yX2lkbGUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOwogCit2b2lkIHJzNjAwX3ByZV9wYWdlX2ZsaXAoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIGludCBjcnRjKQoreworCXN0cnVjdCByYWRlb25fY3J0YyAqcmFkZW9uX2NydGMgPSByZGV2LT5tb2RlX2luZm8uY3J0Y3NbY3J0Y107CisJdTMyIHRtcDsKKworCS8qIG1ha2Ugc3VyZSBmbGlwIGlzIGF0IHZiIHJhdGhlciB0aGFuIGhiICovCisJdG1wID0gUlJFRzMyKEFWSVZPX0QxR1JQSF9GTElQX0NPTlRST0wgKyByYWRlb25fY3J0Yy0+Y3J0Y19vZmZzZXQpOworCXRtcCAmPSB+QVZJVk9fRDFHUlBIX1NVUkZBQ0VfVVBEQVRFX0hfUkVUUkFDRV9FTjsKKwlXUkVHMzIoQVZJVk9fRDFHUlBIX0ZMSVBfQ09OVFJPTCArIHJhZGVvbl9jcnRjLT5jcnRjX29mZnNldCwgdG1wKTsKKworCS8qIHNldCBwYWdlZmxpcCB0byBoYXBwZW4gYW55d2hlcmUgaW4gdmJsYW5rIGludGVydmFsICovCisJV1JFRzMyKEFWSVZPX0QxTU9ERV9NQVNURVJfVVBEQVRFX01PREUgKyByYWRlb25fY3J0Yy0+Y3J0Y19vZmZzZXQsIDApOworCisJLyogZW5hYmxlIHRoZSBwZmxpcCBpbnQgKi8KKwlyYWRlb25faXJxX2ttc19wZmxpcF9pcnFfZ2V0KHJkZXYsIGNydGMpOworfQorCit2b2lkIHJzNjAwX3Bvc3RfcGFnZV9mbGlwKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LCBpbnQgY3J0YykKK3sKKwkvKiBkaXNhYmxlIHRoZSBwZmxpcCBpbnQgKi8KKwlyYWRlb25faXJxX2ttc19wZmxpcF9pcnFfcHV0KHJkZXYsIGNydGMpOworfQorCit1MzIgcnM2MDBfcGFnZV9mbGlwKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LCBpbnQgY3J0Y19pZCwgdTY0IGNydGNfYmFzZSkKK3sKKwlzdHJ1Y3QgcmFkZW9uX2NydGMgKnJhZGVvbl9jcnRjID0gcmRldi0+bW9kZV9pbmZvLmNydGNzW2NydGNfaWRdOworCXUzMiB0bXAgPSBSUkVHMzIoQVZJVk9fRDFHUlBIX1VQREFURSArIHJhZGVvbl9jcnRjLT5jcnRjX29mZnNldCk7CisKKwkvKiBMb2NrIHRoZSBncmFwaGljcyB1cGRhdGUgbG9jayAqLworCXRtcCB8PSBBVklWT19EMUdSUEhfVVBEQVRFX0xPQ0s7CisJV1JFRzMyKEFWSVZPX0QxR1JQSF9VUERBVEUgKyByYWRlb25fY3J0Yy0+Y3J0Y19vZmZzZXQsIHRtcCk7CisKKwkvKiB1cGRhdGUgdGhlIHNjYW5vdXQgYWRkcmVzc2VzICovCisJV1JFRzMyKEFWSVZPX0QxR1JQSF9TRUNPTkRBUllfU1VSRkFDRV9BRERSRVNTICsgcmFkZW9uX2NydGMtPmNydGNfb2Zmc2V0LAorCSAgICAgICAodTMyKWNydGNfYmFzZSk7CisJV1JFRzMyKEFWSVZPX0QxR1JQSF9QUklNQVJZX1NVUkZBQ0VfQUREUkVTUyArIHJhZGVvbl9jcnRjLT5jcnRjX29mZnNldCwKKwkgICAgICAgKHUzMiljcnRjX2Jhc2UpOworCisJLyogV2FpdCBmb3IgdXBkYXRlX3BlbmRpbmcgdG8gZ28gaGlnaC4gKi8KKwl3aGlsZSAoIShSUkVHMzIoQVZJVk9fRDFHUlBIX1VQREFURSArIHJhZGVvbl9jcnRjLT5jcnRjX29mZnNldCkgJiBBVklWT19EMUdSUEhfU1VSRkFDRV9VUERBVEVfUEVORElORykpOworCURSTV9ERUJVRygiVXBkYXRlIHBlbmRpbmcgbm93IGhpZ2guIFVubG9ja2luZyB2dXBkYXRlX2xvY2suXG4iKTsKKworCS8qIFVubG9jayB0aGUgbG9jaywgc28gZG91YmxlLWJ1ZmZlcmluZyBjYW4gdGFrZSBwbGFjZSBpbnNpZGUgdmJsYW5rICovCisJdG1wICY9IH5BVklWT19EMUdSUEhfVVBEQVRFX0xPQ0s7CisJV1JFRzMyKEFWSVZPX0QxR1JQSF9VUERBVEUgKyByYWRlb25fY3J0Yy0+Y3J0Y19vZmZzZXQsIHRtcCk7CisKKwkvKiBSZXR1cm4gY3VycmVudCB1cGRhdGVfcGVuZGluZyBzdGF0dXM6ICovCisJcmV0dXJuIFJSRUczMihBVklWT19EMUdSUEhfVVBEQVRFICsgcmFkZW9uX2NydGMtPmNydGNfb2Zmc2V0KSAmIEFWSVZPX0QxR1JQSF9TVVJGQUNFX1VQREFURV9QRU5ESU5HOworfQorCiB2b2lkIHJzNjAwX3BtX21pc2Moc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCiB7CiAJaW50IHJlcXVlc3RlZF9pbmRleCA9IHJkZXYtPnBtLnJlcXVlc3RlZF9wb3dlcl9zdGF0ZV9pbmRleDsKQEAgLTUxNSwxMCArNTY1LDEyIEBACiAJaWYgKHJkZXYtPmlycS5ndWlfaWRsZSkgewogCQl0bXAgfD0gU18wMDAwNDBfR1VJX0lETEUoMSk7CiAJfQotCWlmIChyZGV2LT5pcnEuY3J0Y192YmxhbmtfaW50WzBdKSB7CisJaWYgKHJkZXYtPmlycS5jcnRjX3ZibGFua19pbnRbMF0gfHwKKwkgICAgcmRldi0+aXJxLnBmbGlwWzBdKSB7CiAJCW1vZGVfaW50IHw9IFNfMDA2NTQwX0QxTU9ERV9WQkxBTktfSU5UX01BU0soMSk7CiAJfQotCWlmIChyZGV2LT5pcnEuY3J0Y192YmxhbmtfaW50WzFdKSB7CisJaWYgKHJkZXYtPmlycS5jcnRjX3ZibGFua19pbnRbMV0gfHwKKwkgICAgcmRldi0+aXJxLnBmbGlwWzFdKSB7CiAJCW1vZGVfaW50IHw9IFNfMDA2NTQwX0QyTU9ERV9WQkxBTktfSU5UX01BU0soMSk7CiAJfQogCWlmIChyZGV2LT5pcnEuaHBkWzBdKSB7CkBAIC01MzQsNyArNTg2LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGlubGluZSB1aW50MzJfdCByczYwMF9pcnFfYWNrKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LCB1MzIgKnI1MDBfZGlzcF9pbnQpCitzdGF0aWMgaW5saW5lIHUzMiByczYwMF9pcnFfYWNrKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQogewogCXVpbnQzMl90IGlycXMgPSBSUkVHMzIoUl8wMDAwNDRfR0VOX0lOVF9TVEFUVVMpOwogCXVpbnQzMl90IGlycV9tYXNrID0gU18wMDAwNDRfU1dfSU5UKDEpOwpAQCAtNTQ3LDI3ICs1OTksMjcgQEAKIAl9CiAKIAlpZiAoR18wMDAwNDRfRElTUExBWV9JTlRfU1RBVChpcnFzKSkgewotCQkqcjUwMF9kaXNwX2ludCA9IFJSRUczMihSXzAwN0VEQ19ESVNQX0lOVEVSUlVQVF9TVEFUVVMpOwotCQlpZiAoR18wMDdFRENfTEJfRDFfVkJMQU5LX0lOVEVSUlVQVCgqcjUwMF9kaXNwX2ludCkpIHsKKwkJcmRldi0+aXJxLnN0YXRfcmVncy5yNTAwLmRpc3BfaW50ID0gUlJFRzMyKFJfMDA3RURDX0RJU1BfSU5URVJSVVBUX1NUQVRVUyk7CisJCWlmIChHXzAwN0VEQ19MQl9EMV9WQkxBTktfSU5URVJSVVBUKHJkZXYtPmlycS5zdGF0X3JlZ3MucjUwMC5kaXNwX2ludCkpIHsKIAkJCVdSRUczMihSXzAwNjUzNF9EMU1PREVfVkJMQU5LX1NUQVRVUywKIAkJCQlTXzAwNjUzNF9EMU1PREVfVkJMQU5LX0FDSygxKSk7CiAJCX0KLQkJaWYgKEdfMDA3RURDX0xCX0QyX1ZCTEFOS19JTlRFUlJVUFQoKnI1MDBfZGlzcF9pbnQpKSB7CisJCWlmIChHXzAwN0VEQ19MQl9EMl9WQkxBTktfSU5URVJSVVBUKHJkZXYtPmlycS5zdGF0X3JlZ3MucjUwMC5kaXNwX2ludCkpIHsKIAkJCVdSRUczMihSXzAwNkQzNF9EMk1PREVfVkJMQU5LX1NUQVRVUywKIAkJCQlTXzAwNkQzNF9EMk1PREVfVkJMQU5LX0FDSygxKSk7CiAJCX0KLQkJaWYgKEdfMDA3RURDX0RDX0hPVF9QTFVHX0RFVEVDVDFfSU5URVJSVVBUKCpyNTAwX2Rpc3BfaW50KSkgeworCQlpZiAoR18wMDdFRENfRENfSE9UX1BMVUdfREVURUNUMV9JTlRFUlJVUFQocmRldi0+aXJxLnN0YXRfcmVncy5yNTAwLmRpc3BfaW50KSkgewogCQkJdG1wID0gUlJFRzMyKFJfMDA3RDA4X0RDX0hPVF9QTFVHX0RFVEVDVDFfSU5UX0NPTlRST0wpOwogCQkJdG1wIHw9IFNfMDA3RDA4X0RDX0hPVF9QTFVHX0RFVEVDVDFfSU5UX0FDSygxKTsKIAkJCVdSRUczMihSXzAwN0QwOF9EQ19IT1RfUExVR19ERVRFQ1QxX0lOVF9DT05UUk9MLCB0bXApOwogCQl9Ci0JCWlmIChHXzAwN0VEQ19EQ19IT1RfUExVR19ERVRFQ1QyX0lOVEVSUlVQVCgqcjUwMF9kaXNwX2ludCkpIHsKKwkJaWYgKEdfMDA3RURDX0RDX0hPVF9QTFVHX0RFVEVDVDJfSU5URVJSVVBUKHJkZXYtPmlycS5zdGF0X3JlZ3MucjUwMC5kaXNwX2ludCkpIHsKIAkJCXRtcCA9IFJSRUczMihSXzAwN0QxOF9EQ19IT1RfUExVR19ERVRFQ1QyX0lOVF9DT05UUk9MKTsKIAkJCXRtcCB8PSBTXzAwN0QxOF9EQ19IT1RfUExVR19ERVRFQ1QyX0lOVF9BQ0soMSk7CiAJCQlXUkVHMzIoUl8wMDdEMThfRENfSE9UX1BMVUdfREVURUNUMl9JTlRfQ09OVFJPTCwgdG1wKTsKIAkJfQogCX0gZWxzZSB7Ci0JCSpyNTAwX2Rpc3BfaW50ID0gMDsKKwkJcmRldi0+aXJxLnN0YXRfcmVncy5yNTAwLmRpc3BfaW50ID0gMDsKIAl9CiAKIAlpZiAoaXJxcykgewpAQCAtNTc4LDMyICs2MzAsMzAgQEAKIAogdm9pZCByczYwMF9pcnFfZGlzYWJsZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKIHsKLQl1MzIgdG1wOwotCiAJV1JFRzMyKFJfMDAwMDQwX0dFTl9JTlRfQ05UTCwgMCk7CiAJV1JFRzMyKFJfMDA2NTQwX0R4TU9ERV9JTlRfTUFTSywgMCk7CiAJLyogV2FpdCBhbmQgYWNrbm93bGVkZ2UgaXJxICovCiAJbWRlbGF5KDEpOwotCXJzNjAwX2lycV9hY2socmRldiwgJnRtcCk7CisJcnM2MDBfaXJxX2FjayhyZGV2KTsKIH0KIAogaW50IHJzNjAwX2lycV9wcm9jZXNzKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQogewotCXVpbnQzMl90IHN0YXR1cywgbXNpX3JlYXJtOwotCXVpbnQzMl90IHI1MDBfZGlzcF9pbnQ7CisJdTMyIHN0YXR1cywgbXNpX3JlYXJtOwogCWJvb2wgcXVldWVfaG90cGx1ZyA9IGZhbHNlOwogCiAJLyogcmVzZXQgZ3VpIGlkbGUgYWNrLiAgdGhlIHN0YXR1cyBiaXQgaXMgYnJva2VuICovCiAJcmRldi0+aXJxLmd1aV9pZGxlX2Fja2VkID0gZmFsc2U7CiAKLQlzdGF0dXMgPSByczYwMF9pcnFfYWNrKHJkZXYsICZyNTAwX2Rpc3BfaW50KTsKLQlpZiAoIXN0YXR1cyAmJiAhcjUwMF9kaXNwX2ludCkgeworCXN0YXR1cyA9IHJzNjAwX2lycV9hY2socmRldik7CisJaWYgKCFzdGF0dXMgJiYgIXJkZXYtPmlycS5zdGF0X3JlZ3MucjUwMC5kaXNwX2ludCkgewogCQlyZXR1cm4gSVJRX05PTkU7CiAJfQotCXdoaWxlIChzdGF0dXMgfHwgcjUwMF9kaXNwX2ludCkgeworCXdoaWxlIChzdGF0dXMgfHwgcmRldi0+aXJxLnN0YXRfcmVncy5yNTAwLmRpc3BfaW50KSB7CiAJCS8qIFNXIGludGVycnVwdCAqLwotCQlpZiAoR18wMDAwNDRfU1dfSU5UKHN0YXR1cykpCisJCWlmIChHXzAwMDA0NF9TV19JTlQoc3RhdHVzKSkgewogCQkJcmFkZW9uX2ZlbmNlX3Byb2Nlc3MocmRldik7CisJCX0KIAkJLyogR1VJIGlkbGUgKi8KIAkJaWYgKEdfMDAwMDQwX0dVSV9JRExFKHN0YXR1cykpIHsKIAkJCXJkZXYtPmlycS5ndWlfaWRsZV9hY2tlZCA9IHRydWU7CkBAIC02MTEsMzAgKzY2MSwzOCBAQAogCQkJd2FrZV91cCgmcmRldi0+aXJxLmlkbGVfcXVldWUpOwogCQl9CiAJCS8qIFZlcnRpY2FsIGJsYW5rIGludGVycnVwdHMgKi8KLQkJaWYgKEdfMDA3RURDX0xCX0QxX1ZCTEFOS19JTlRFUlJVUFQocjUwMF9kaXNwX2ludCkpIHsKLQkJCWRybV9oYW5kbGVfdmJsYW5rKHJkZXYtPmRkZXYsIDApOwotCQkJcmRldi0+cG0udmJsYW5rX3N5bmMgPSB0cnVlOwotCQkJd2FrZV91cCgmcmRldi0+aXJxLnZibGFua19xdWV1ZSk7CisJCWlmIChHXzAwN0VEQ19MQl9EMV9WQkxBTktfSU5URVJSVVBUKHJkZXYtPmlycS5zdGF0X3JlZ3MucjUwMC5kaXNwX2ludCkpIHsKKwkJCWlmIChyZGV2LT5pcnEuY3J0Y192YmxhbmtfaW50WzBdKSB7CisJCQkJZHJtX2hhbmRsZV92YmxhbmsocmRldi0+ZGRldiwgMCk7CisJCQkJcmRldi0+cG0udmJsYW5rX3N5bmMgPSB0cnVlOworCQkJCXdha2VfdXAoJnJkZXYtPmlycS52YmxhbmtfcXVldWUpOworCQkJfQorCQkJaWYgKHJkZXYtPmlycS5wZmxpcFswXSkKKwkJCQlyYWRlb25fY3J0Y19oYW5kbGVfZmxpcChyZGV2LCAwKTsKIAkJfQotCQlpZiAoR18wMDdFRENfTEJfRDJfVkJMQU5LX0lOVEVSUlVQVChyNTAwX2Rpc3BfaW50KSkgewotCQkJZHJtX2hhbmRsZV92YmxhbmsocmRldi0+ZGRldiwgMSk7Ci0JCQlyZGV2LT5wbS52Ymxhbmtfc3luYyA9IHRydWU7Ci0JCQl3YWtlX3VwKCZyZGV2LT5pcnEudmJsYW5rX3F1ZXVlKTsKKwkJaWYgKEdfMDA3RURDX0xCX0QyX1ZCTEFOS19JTlRFUlJVUFQocmRldi0+aXJxLnN0YXRfcmVncy5yNTAwLmRpc3BfaW50KSkgeworCQkJaWYgKHJkZXYtPmlycS5jcnRjX3ZibGFua19pbnRbMV0pIHsKKwkJCQlkcm1faGFuZGxlX3ZibGFuayhyZGV2LT5kZGV2LCAxKTsKKwkJCQlyZGV2LT5wbS52Ymxhbmtfc3luYyA9IHRydWU7CisJCQkJd2FrZV91cCgmcmRldi0+aXJxLnZibGFua19xdWV1ZSk7CisJCQl9CisJCQlpZiAocmRldi0+aXJxLnBmbGlwWzFdKQorCQkJCXJhZGVvbl9jcnRjX2hhbmRsZV9mbGlwKHJkZXYsIDEpOwogCQl9Ci0JCWlmIChHXzAwN0VEQ19EQ19IT1RfUExVR19ERVRFQ1QxX0lOVEVSUlVQVChyNTAwX2Rpc3BfaW50KSkgeworCQlpZiAoR18wMDdFRENfRENfSE9UX1BMVUdfREVURUNUMV9JTlRFUlJVUFQocmRldi0+aXJxLnN0YXRfcmVncy5yNTAwLmRpc3BfaW50KSkgewogCQkJcXVldWVfaG90cGx1ZyA9IHRydWU7CiAJCQlEUk1fREVCVUcoIkhQRDFcbiIpOwogCQl9Ci0JCWlmIChHXzAwN0VEQ19EQ19IT1RfUExVR19ERVRFQ1QyX0lOVEVSUlVQVChyNTAwX2Rpc3BfaW50KSkgeworCQlpZiAoR18wMDdFRENfRENfSE9UX1BMVUdfREVURUNUMl9JTlRFUlJVUFQocmRldi0+aXJxLnN0YXRfcmVncy5yNTAwLmRpc3BfaW50KSkgewogCQkJcXVldWVfaG90cGx1ZyA9IHRydWU7CiAJCQlEUk1fREVCVUcoIkhQRDJcbiIpOwogCQl9Ci0JCXN0YXR1cyA9IHJzNjAwX2lycV9hY2socmRldiwgJnI1MDBfZGlzcF9pbnQpOworCQlzdGF0dXMgPSByczYwMF9pcnFfYWNrKHJkZXYpOwogCX0KIAkvKiByZXNldCBndWkgaWRsZSBhY2suICB0aGUgc3RhdHVzIGJpdCBpcyBicm9rZW4gKi8KIAlyZGV2LT5pcnEuZ3VpX2lkbGVfYWNrZWQgPSBmYWxzZTsKIAlpZiAocXVldWVfaG90cGx1ZykKLQkJcXVldWVfd29yayhyZGV2LT53cSwgJnJkZXYtPmhvdHBsdWdfd29yayk7CisJCXNjaGVkdWxlX3dvcmsoJnJkZXYtPmhvdHBsdWdfd29yayk7CiAJaWYgKHJkZXYtPm1zaV9lbmFibGVkKSB7CiAJCXN3aXRjaCAocmRldi0+ZmFtaWx5KSB7CiAJCWNhc2UgQ0hJUF9SUzYwMDoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcnY3NzAuYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcnY3NzAuYwppbmRleCA0ZGZlYWQ4Li4zYTI2NGFhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3J2NzcwLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9ydjc3MC5jCkBAIC00MSw2ICs0MSw0MSBAQAogCiBzdGF0aWMgdm9pZCBydjc3MF9ncHVfaW5pdChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CiB2b2lkIHJ2NzcwX2Zpbmkoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpOworc3RhdGljIHZvaWQgcnY3NzBfcGNpZV9nZW4yX2VuYWJsZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldik7CisKK3UzMiBydjc3MF9wYWdlX2ZsaXAoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsIGludCBjcnRjX2lkLCB1NjQgY3J0Y19iYXNlKQoreworCXN0cnVjdCByYWRlb25fY3J0YyAqcmFkZW9uX2NydGMgPSByZGV2LT5tb2RlX2luZm8uY3J0Y3NbY3J0Y19pZF07CisJdTMyIHRtcCA9IFJSRUczMihBVklWT19EMUdSUEhfVVBEQVRFICsgcmFkZW9uX2NydGMtPmNydGNfb2Zmc2V0KTsKKworCS8qIExvY2sgdGhlIGdyYXBoaWNzIHVwZGF0ZSBsb2NrICovCisJdG1wIHw9IEFWSVZPX0QxR1JQSF9VUERBVEVfTE9DSzsKKwlXUkVHMzIoQVZJVk9fRDFHUlBIX1VQREFURSArIHJhZGVvbl9jcnRjLT5jcnRjX29mZnNldCwgdG1wKTsKKworCS8qIHVwZGF0ZSB0aGUgc2Nhbm91dCBhZGRyZXNzZXMgKi8KKwlpZiAocmFkZW9uX2NydGMtPmNydGNfaWQpIHsKKwkJV1JFRzMyKEQyR1JQSF9TRUNPTkRBUllfU1VSRkFDRV9BRERSRVNTX0hJR0gsIHVwcGVyXzMyX2JpdHMoY3J0Y19iYXNlKSk7CisJCVdSRUczMihEMkdSUEhfUFJJTUFSWV9TVVJGQUNFX0FERFJFU1NfSElHSCwgdXBwZXJfMzJfYml0cyhjcnRjX2Jhc2UpKTsKKwl9IGVsc2UgeworCQlXUkVHMzIoRDFHUlBIX1NFQ09OREFSWV9TVVJGQUNFX0FERFJFU1NfSElHSCwgdXBwZXJfMzJfYml0cyhjcnRjX2Jhc2UpKTsKKwkJV1JFRzMyKEQxR1JQSF9QUklNQVJZX1NVUkZBQ0VfQUREUkVTU19ISUdILCB1cHBlcl8zMl9iaXRzKGNydGNfYmFzZSkpOworCX0KKwlXUkVHMzIoRDFHUlBIX1NFQ09OREFSWV9TVVJGQUNFX0FERFJFU1MgKyByYWRlb25fY3J0Yy0+Y3J0Y19vZmZzZXQsCisJICAgICAgICh1MzIpY3J0Y19iYXNlKTsKKwlXUkVHMzIoRDFHUlBIX1BSSU1BUllfU1VSRkFDRV9BRERSRVNTICsgcmFkZW9uX2NydGMtPmNydGNfb2Zmc2V0LAorCSAgICAgICAodTMyKWNydGNfYmFzZSk7CisKKwkvKiBXYWl0IGZvciB1cGRhdGVfcGVuZGluZyB0byBnbyBoaWdoLiAqLworCXdoaWxlICghKFJSRUczMihBVklWT19EMUdSUEhfVVBEQVRFICsgcmFkZW9uX2NydGMtPmNydGNfb2Zmc2V0KSAmIEFWSVZPX0QxR1JQSF9TVVJGQUNFX1VQREFURV9QRU5ESU5HKSk7CisJRFJNX0RFQlVHKCJVcGRhdGUgcGVuZGluZyBub3cgaGlnaC4gVW5sb2NraW5nIHZ1cGRhdGVfbG9jay5cbiIpOworCisJLyogVW5sb2NrIHRoZSBsb2NrLCBzbyBkb3VibGUtYnVmZmVyaW5nIGNhbiB0YWtlIHBsYWNlIGluc2lkZSB2YmxhbmsgKi8KKwl0bXAgJj0gfkFWSVZPX0QxR1JQSF9VUERBVEVfTE9DSzsKKwlXUkVHMzIoQVZJVk9fRDFHUlBIX1VQREFURSArIHJhZGVvbl9jcnRjLT5jcnRjX29mZnNldCwgdG1wKTsKKworCS8qIFJldHVybiBjdXJyZW50IHVwZGF0ZV9wZW5kaW5nIHN0YXR1czogKi8KKwlyZXR1cm4gUlJFRzMyKEFWSVZPX0QxR1JQSF9VUERBVEUgKyByYWRlb25fY3J0Yy0+Y3J0Y19vZmZzZXQpICYgQVZJVk9fRDFHUlBIX1NVUkZBQ0VfVVBEQVRFX1BFTkRJTkc7Cit9CiAKIC8qIGdldCB0ZW1wZXJhdHVyZSBpbiBtaWxsaWRlZ3JlZXMgKi8KIHUzMiBydjc3MF9nZXRfdGVtcChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKQEAgLTQ4OSw2ICs1MjQsNDkgQEAKIAlyZXR1cm4gYmFja2VuZF9tYXA7CiB9CiAKK3N0YXRpYyB2b2lkIHJ2NzcwX3Byb2dyYW1fY2hhbm5lbF9yZW1hcChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKK3sKKwl1MzIgdGNwX2NoYW5fc3RlZXIsIG1jX3NoYXJlZF9jaHJlbWFwLCB0bXA7CisJYm9vbCBmb3JjZV9ub19zd2l6emxlOworCisJc3dpdGNoIChyZGV2LT5mYW1pbHkpIHsKKwljYXNlIENISVBfUlY3NzA6CisJY2FzZSBDSElQX1JWNzMwOgorCQlmb3JjZV9ub19zd2l6emxlID0gZmFsc2U7CisJCWJyZWFrOworCWNhc2UgQ0hJUF9SVjcxMDoKKwljYXNlIENISVBfUlY3NDA6CisJZGVmYXVsdDoKKwkJZm9yY2Vfbm9fc3dpenpsZSA9IHRydWU7CisJCWJyZWFrOworCX0KKworCXRtcCA9IFJSRUczMihNQ19TSEFSRURfQ0hNQVApOworCXN3aXRjaCAoKHRtcCAmIE5PT0ZDSEFOX01BU0spID4+IE5PT0ZDSEFOX1NISUZUKSB7CisJY2FzZSAwOgorCWNhc2UgMToKKwlkZWZhdWx0OgorCQkvKiBkZWZhdWx0IG1hcHBpbmcgKi8KKwkJbWNfc2hhcmVkX2NocmVtYXAgPSAweDAwZmFjNjg4OworCQlicmVhazsKKwljYXNlIDI6CisJY2FzZSAzOgorCQlpZiAoZm9yY2Vfbm9fc3dpenpsZSkKKwkJCW1jX3NoYXJlZF9jaHJlbWFwID0gMHgwMGZhYzY4ODsKKwkJZWxzZQorCQkJbWNfc2hhcmVkX2NocmVtYXAgPSAweDAwYmJjMjk4OworCQlicmVhazsKKwl9CisKKwlpZiAocmRldi0+ZmFtaWx5ID09IENISVBfUlY3NDApCisJCXRjcF9jaGFuX3N0ZWVyID0gMHgwMGVmMmE2MDsKKwllbHNlCisJCXRjcF9jaGFuX3N0ZWVyID0gMHgwMGZhYzY4ODsKKworCVdSRUczMihUQ1BfQ0hBTl9TVEVFUiwgdGNwX2NoYW5fc3RlZXIpOworCVdSRUczMihNQ19TSEFSRURfQ0hSRU1BUCwgbWNfc2hhcmVkX2NocmVtYXApOworfQorCiBzdGF0aWMgdm9pZCBydjc3MF9ncHVfaW5pdChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKIHsKIAlpbnQgaSwgaiwgbnVtX3FkX3BpcGVzOwpAQCAtNjg4LDYgKzc2Niw4IEBACiAJV1JFRzMyKERDUF9USUxJTkdfQ09ORklHLCAoZ2JfdGlsaW5nX2NvbmZpZyAmIDB4ZmZmZikpOwogCVdSRUczMihIRFBfVElMSU5HX0NPTkZJRywgKGdiX3RpbGluZ19jb25maWcgJiAweGZmZmYpKTsKIAorCXJ2NzcwX3Byb2dyYW1fY2hhbm5lbF9yZW1hcChyZGV2KTsKKwogCVdSRUczMihDQ19SQl9CQUNLRU5EX0RJU0FCTEUsICAgICAgY2NfcmJfYmFja2VuZF9kaXNhYmxlKTsKIAlXUkVHMzIoQ0NfR0NfU0hBREVSX1BJUEVfQ09ORklHLCAgIGNjX2djX3NoYWRlcl9waXBlX2NvbmZpZyk7CiAJV1JFRzMyKEdDX1VTRVJfU0hBREVSX1BJUEVfQ09ORklHLCBjY19nY19zaGFkZXJfcGlwZV9jb25maWcpOwpAQCAtOTU2LDYgKzEwMzYsNDUgQEAKIAlyYWRlb25fYm9fdW5yZWYoJnJkZXYtPnZyYW1fc2NyYXRjaC5yb2JqKTsKIH0KIAordm9pZCByNzAwX3ZyYW1fZ3R0X2xvY2F0aW9uKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LCBzdHJ1Y3QgcmFkZW9uX21jICptYykKK3sKKwl1NjQgc2l6ZV9iZiwgc2l6ZV9hZjsKKworCWlmIChtYy0+bWNfdnJhbV9zaXplID4gMHhFMDAwMDAwMCkgeworCQkvKiBsZWF2ZSByb29tIGZvciBhdCBsZWFzdCA1MTJNIEdUVCAqLworCQlkZXZfd2FybihyZGV2LT5kZXYsICJsaW1pdGluZyBWUkFNXG4iKTsKKwkJbWMtPnJlYWxfdnJhbV9zaXplID0gMHhFMDAwMDAwMDsKKwkJbWMtPm1jX3ZyYW1fc2l6ZSA9IDB4RTAwMDAwMDA7CisJfQorCWlmIChyZGV2LT5mbGFncyAmIFJBREVPTl9JU19BR1ApIHsKKwkJc2l6ZV9iZiA9IG1jLT5ndHRfc3RhcnQ7CisJCXNpemVfYWYgPSAweEZGRkZGRkZGIC0gbWMtPmd0dF9lbmQgKyAxOworCQlpZiAoc2l6ZV9iZiA+IHNpemVfYWYpIHsKKwkJCWlmIChtYy0+bWNfdnJhbV9zaXplID4gc2l6ZV9iZikgeworCQkJCWRldl93YXJuKHJkZXYtPmRldiwgImxpbWl0aW5nIFZSQU1cbiIpOworCQkJCW1jLT5yZWFsX3ZyYW1fc2l6ZSA9IHNpemVfYmY7CisJCQkJbWMtPm1jX3ZyYW1fc2l6ZSA9IHNpemVfYmY7CisJCQl9CisJCQltYy0+dnJhbV9zdGFydCA9IG1jLT5ndHRfc3RhcnQgLSBtYy0+bWNfdnJhbV9zaXplOworCQl9IGVsc2UgeworCQkJaWYgKG1jLT5tY192cmFtX3NpemUgPiBzaXplX2FmKSB7CisJCQkJZGV2X3dhcm4ocmRldi0+ZGV2LCAibGltaXRpbmcgVlJBTVxuIik7CisJCQkJbWMtPnJlYWxfdnJhbV9zaXplID0gc2l6ZV9hZjsKKwkJCQltYy0+bWNfdnJhbV9zaXplID0gc2l6ZV9hZjsKKwkJCX0KKwkJCW1jLT52cmFtX3N0YXJ0ID0gbWMtPmd0dF9lbmQ7CisJCX0KKwkJbWMtPnZyYW1fZW5kID0gbWMtPnZyYW1fc3RhcnQgKyBtYy0+bWNfdnJhbV9zaXplIC0gMTsKKwkJZGV2X2luZm8ocmRldi0+ZGV2LCAiVlJBTTogJWxsdU0gMHglMDhsbFggLSAweCUwOGxsWCAoJWxsdU0gdXNlZClcbiIsCisJCQkJbWMtPm1jX3ZyYW1fc2l6ZSA+PiAyMCwgbWMtPnZyYW1fc3RhcnQsCisJCQkJbWMtPnZyYW1fZW5kLCBtYy0+cmVhbF92cmFtX3NpemUgPj4gMjApOworCX0gZWxzZSB7CisJCXJhZGVvbl92cmFtX2xvY2F0aW9uKHJkZXYsICZyZGV2LT5tYywgMCk7CisJCXJkZXYtPm1jLmd0dF9iYXNlX2FsaWduID0gMDsKKwkJcmFkZW9uX2d0dF9sb2NhdGlvbihyZGV2LCBtYyk7CisJfQorfQorCiBpbnQgcnY3NzBfbWNfaW5pdChzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKIHsKIAl1MzIgdG1wOwpAQCAtOTk2LDcgKzExMTUsNyBAQAogCXJkZXYtPm1jLnJlYWxfdnJhbV9zaXplID0gUlJFRzMyKENPTkZJR19NRU1TSVpFKTsKIAlyZGV2LT5tYy52aXNpYmxlX3ZyYW1fc2l6ZSA9IHJkZXYtPm1jLmFwZXJfc2l6ZTsKIAlyZGV2LT5tYy5hY3RpdmVfdnJhbV9zaXplID0gcmRldi0+bWMudmlzaWJsZV92cmFtX3NpemU7Ci0JcjYwMF92cmFtX2d0dF9sb2NhdGlvbihyZGV2LCAmcmRldi0+bWMpOworCXI3MDBfdnJhbV9ndHRfbG9jYXRpb24ocmRldiwgJnJkZXYtPm1jKTsKIAlyYWRlb25fdXBkYXRlX2JhbmR3aWR0aF9pbmZvKHJkZXYpOwogCiAJcmV0dXJuIDA7CkBAIC0xMDA2LDYgKzExMjUsOSBAQAogewogCWludCByOwogCisJLyogZW5hYmxlIHBjaWUgZ2VuMiBsaW5rICovCisJcnY3NzBfcGNpZV9nZW4yX2VuYWJsZShyZGV2KTsKKwogCWlmICghcmRldi0+bWVfZncgfHwgIXJkZXYtPnBmcF9mdyB8fCAhcmRldi0+cmxjX2Z3KSB7CiAJCXIgPSByNjAwX2luaXRfbWljcm9jb2RlKHJkZXYpOwogCQlpZiAocikgewpAQCAtMTI0NCwzICsxMzY2LDc1IEBACiAJcmRldi0+YmlvcyA9IE5VTEw7CiAJcmFkZW9uX2R1bW15X3BhZ2VfZmluaShyZGV2KTsKIH0KKworc3RhdGljIHZvaWQgcnY3NzBfcGNpZV9nZW4yX2VuYWJsZShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKK3sKKwl1MzIgbGlua193aWR0aF9jbnRsLCBsYW5lcywgc3BlZWRfY250bCwgdG1wOworCXUxNiBsaW5rX2NudGwyOworCisJaWYgKHJkZXYtPmZsYWdzICYgUkFERU9OX0lTX0lHUCkKKwkJcmV0dXJuOworCisJaWYgKCEocmRldi0+ZmxhZ3MgJiBSQURFT05fSVNfUENJRSkpCisJCXJldHVybjsKKworCS8qIHgyIGNhcmRzIGhhdmUgYSBzcGVjaWFsIHNlcXVlbmNlICovCisJaWYgKEFTSUNfSVNfWDIocmRldikpCisJCXJldHVybjsKKworCS8qIGFkdmVydGlzZSB1cGNvbmZpZyBjYXBhYmlsaXR5ICovCisJbGlua193aWR0aF9jbnRsID0gUlJFRzMyX1BDSUVfUChQQ0lFX0xDX0xJTktfV0lEVEhfQ05UTCk7CisJbGlua193aWR0aF9jbnRsICY9IH5MQ19VUENPTkZJR1VSRV9ESVM7CisJV1JFRzMyX1BDSUVfUChQQ0lFX0xDX0xJTktfV0lEVEhfQ05UTCwgbGlua193aWR0aF9jbnRsKTsKKwlsaW5rX3dpZHRoX2NudGwgPSBSUkVHMzJfUENJRV9QKFBDSUVfTENfTElOS19XSURUSF9DTlRMKTsKKwlpZiAobGlua193aWR0aF9jbnRsICYgTENfUkVORUdPVElBVElPTl9TVVBQT1JUKSB7CisJCWxhbmVzID0gKGxpbmtfd2lkdGhfY250bCAmIExDX0xJTktfV0lEVEhfUkRfTUFTSykgPj4gTENfTElOS19XSURUSF9SRF9TSElGVDsKKwkJbGlua193aWR0aF9jbnRsICY9IH4oTENfTElOS19XSURUSF9NQVNLIHwKKwkJCQkgICAgIExDX1JFQ09ORklHX0FSQ19NSVNTSU5HX0VTQ0FQRSk7CisJCWxpbmtfd2lkdGhfY250bCB8PSBsYW5lcyB8IExDX1JFQ09ORklHX05PVyB8CisJCQlMQ19SRU5FR09USUFURV9FTiB8IExDX1VQQ09ORklHVVJFX1NVUFBPUlQ7CisJCVdSRUczMl9QQ0lFX1AoUENJRV9MQ19MSU5LX1dJRFRIX0NOVEwsIGxpbmtfd2lkdGhfY250bCk7CisJfSBlbHNlIHsKKwkJbGlua193aWR0aF9jbnRsIHw9IExDX1VQQ09ORklHVVJFX0RJUzsKKwkJV1JFRzMyX1BDSUVfUChQQ0lFX0xDX0xJTktfV0lEVEhfQ05UTCwgbGlua193aWR0aF9jbnRsKTsKKwl9CisKKwlzcGVlZF9jbnRsID0gUlJFRzMyX1BDSUVfUChQQ0lFX0xDX1NQRUVEX0NOVEwpOworCWlmICgoc3BlZWRfY250bCAmIExDX09USEVSX1NJREVfRVZFUl9TRU5UX0dFTjIpICYmCisJICAgIChzcGVlZF9jbnRsICYgTENfT1RIRVJfU0lERV9TVVBQT1JUU19HRU4yKSkgeworCisJCXRtcCA9IFJSRUczMigweDU0MWMpOworCQlXUkVHMzIoMHg1NDFjLCB0bXAgfCAweDgpOworCQlXUkVHMzIoTU1fQ0ZHUkVHU19DTlRMLCBNTV9XUl9UT19DRkdfRU4pOworCQlsaW5rX2NudGwyID0gUlJFRzE2KDB4NDA4OCk7CisJCWxpbmtfY250bDIgJj0gflRBUkdFVF9MSU5LX1NQRUVEX01BU0s7CisJCWxpbmtfY250bDIgfD0gMHgyOworCQlXUkVHMTYoMHg0MDg4LCBsaW5rX2NudGwyKTsKKwkJV1JFRzMyKE1NX0NGR1JFR1NfQ05UTCwgMCk7CisKKwkJc3BlZWRfY250bCA9IFJSRUczMl9QQ0lFX1AoUENJRV9MQ19TUEVFRF9DTlRMKTsKKwkJc3BlZWRfY250bCAmPSB+TENfVEFSR0VUX0xJTktfU1BFRURfT1ZFUlJJREVfRU47CisJCVdSRUczMl9QQ0lFX1AoUENJRV9MQ19TUEVFRF9DTlRMLCBzcGVlZF9jbnRsKTsKKworCQlzcGVlZF9jbnRsID0gUlJFRzMyX1BDSUVfUChQQ0lFX0xDX1NQRUVEX0NOVEwpOworCQlzcGVlZF9jbnRsIHw9IExDX0NMUl9GQUlMRURfU1BEX0NIQU5HRV9DTlQ7CisJCVdSRUczMl9QQ0lFX1AoUENJRV9MQ19TUEVFRF9DTlRMLCBzcGVlZF9jbnRsKTsKKworCQlzcGVlZF9jbnRsID0gUlJFRzMyX1BDSUVfUChQQ0lFX0xDX1NQRUVEX0NOVEwpOworCQlzcGVlZF9jbnRsICY9IH5MQ19DTFJfRkFJTEVEX1NQRF9DSEFOR0VfQ05UOworCQlXUkVHMzJfUENJRV9QKFBDSUVfTENfU1BFRURfQ05UTCwgc3BlZWRfY250bCk7CisKKwkJc3BlZWRfY250bCA9IFJSRUczMl9QQ0lFX1AoUENJRV9MQ19TUEVFRF9DTlRMKTsKKwkJc3BlZWRfY250bCB8PSBMQ19HRU4yX0VOX1NUUkFQOworCQlXUkVHMzJfUENJRV9QKFBDSUVfTENfU1BFRURfQ05UTCwgc3BlZWRfY250bCk7CisKKwl9IGVsc2UgeworCQlsaW5rX3dpZHRoX2NudGwgPSBSUkVHMzJfUENJRV9QKFBDSUVfTENfTElOS19XSURUSF9DTlRMKTsKKwkJLyogWFhYOiBvbmx5IGRpc2FibGUgaXQgaWYgZ2VuMSBicmlkZ2UgdmVuZG9yID09IDB4MTExZCBvciAweDExMDYgKi8KKwkJaWYgKDEpCisJCQlsaW5rX3dpZHRoX2NudGwgfD0gTENfVVBDT05GSUdVUkVfRElTOworCQllbHNlCisJCQlsaW5rX3dpZHRoX2NudGwgJj0gfkxDX1VQQ09ORklHVVJFX0RJUzsKKwkJV1JFRzMyX1BDSUVfUChQQ0lFX0xDX0xJTktfV0lEVEhfQ05UTCwgbGlua193aWR0aF9jbnRsKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3J2NzcwZC5oIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9ydjc3MGQuaAppbmRleCBiN2E1YTIwLi5hYmM4Y2Y1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3J2NzcwZC5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcnY3NzBkLmgKQEAgLTEzOCw2ICsxMzgsNyBAQAogI2RlZmluZSBNQ19TSEFSRURfQ0hNQVAJCQkJCQkweDIwMDQKICNkZWZpbmUJCU5PT0ZDSEFOX1NISUZUCQkJCQkxMgogI2RlZmluZQkJTk9PRkNIQU5fTUFTSwkJCQkJMHgwMDAwMzAwMAorI2RlZmluZSBNQ19TSEFSRURfQ0hSRU1BUAkJCQkJMHgyMDA4CiAKICNkZWZpbmUJTUNfQVJCX1JBTUNGRwkJCQkJMHgyNzYwCiAjZGVmaW5lCQlOT09GQkFOS19TSElGVAkJCQkJMApAQCAtMzAzLDYgKzMwNCw3IEBACiAjZGVmaW5lCQlCSUxJTkVBUl9QUkVDSVNJT05fOF9CSVQJCQkoMSA8PCAzMSkKIAogI2RlZmluZQlUQ1BfQ05UTAkJCQkJMHg5NjEwCisjZGVmaW5lCVRDUF9DSEFOX1NURUVSCQkJCQkweDk2MTQKIAogI2RlZmluZQlWR1RfQ0FDSEVfSU5WQUxJREFUSU9OCQkJCTB4ODhDNAogI2RlZmluZQkJQ0FDSEVfSU5WQUxJREFUSU9OKHgpCQkJCSgoeCk8PDApCkBAIC0zNTEsNCArMzUzLDQ5IEBACiAKICNkZWZpbmUJU1JCTV9TVEFUVVMJCQkJICAgICAgICAweDBFNTAKIAorI2RlZmluZSBEMUdSUEhfUFJJTUFSWV9TVVJGQUNFX0FERFJFU1MgICAgICAgICAgICAgICAgICAgIDB4NjExMAorI2RlZmluZSBEMUdSUEhfUFJJTUFSWV9TVVJGQUNFX0FERFJFU1NfSElHSCAgICAgICAgICAgICAgIDB4NjkxNAorI2RlZmluZSBEMkdSUEhfUFJJTUFSWV9TVVJGQUNFX0FERFJFU1NfSElHSCAgICAgICAgICAgICAgIDB4NjExNAorI2RlZmluZSBEMUdSUEhfU0VDT05EQVJZX1NVUkZBQ0VfQUREUkVTUyAgICAgICAgICAgICAgICAgIDB4NjExOAorI2RlZmluZSBEMUdSUEhfU0VDT05EQVJZX1NVUkZBQ0VfQUREUkVTU19ISUdIICAgICAgICAgICAgIDB4NjkxYworI2RlZmluZSBEMkdSUEhfU0VDT05EQVJZX1NVUkZBQ0VfQUREUkVTU19ISUdIICAgICAgICAgICAgIDB4NjExYworCisvKiBQQ0lFIGxpbmsgc3R1ZmYgKi8KKyNkZWZpbmUgUENJRV9MQ19UUkFJTklOR19DTlRMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGExIC8qIFBDSUVfUCAqLworI2RlZmluZSBQQ0lFX0xDX0xJTktfV0lEVEhfQ05UTCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4YTIgLyogUENJRV9QICovCisjICAgICAgIGRlZmluZSBMQ19MSU5LX1dJRFRIX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMAorIyAgICAgICBkZWZpbmUgTENfTElOS19XSURUSF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgIDB4NworIyAgICAgICBkZWZpbmUgTENfTElOS19XSURUSF9YMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyMgICAgICAgZGVmaW5lIExDX0xJTktfV0lEVEhfWDEgICAgICAgICAgICAgICAgICAgICAgICAgICAxCisjICAgICAgIGRlZmluZSBMQ19MSU5LX1dJRFRIX1gyICAgICAgICAgICAgICAgICAgICAgICAgICAgMgorIyAgICAgICBkZWZpbmUgTENfTElOS19XSURUSF9YNCAgICAgICAgICAgICAgICAgICAgICAgICAgIDMKKyMgICAgICAgZGVmaW5lIExDX0xJTktfV0lEVEhfWDggICAgICAgICAgICAgICAgICAgICAgICAgICA0CisjICAgICAgIGRlZmluZSBMQ19MSU5LX1dJRFRIX1gxNiAgICAgICAgICAgICAgICAgICAgICAgICAgNgorIyAgICAgICBkZWZpbmUgTENfTElOS19XSURUSF9SRF9TSElGVCAgICAgICAgICAgICAgICAgICAgIDQKKyMgICAgICAgZGVmaW5lIExDX0xJTktfV0lEVEhfUkRfTUFTSyAgICAgICAgICAgICAgICAgICAgICAweDcwCisjICAgICAgIGRlZmluZSBMQ19SRUNPTkZJR19BUkNfTUlTU0lOR19FU0NBUEUgICAgICAgICAgICAgKDEgPDwgNykKKyMgICAgICAgZGVmaW5lIExDX1JFQ09ORklHX05PVyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCA4KQorIyAgICAgICBkZWZpbmUgTENfUkVORUdPVElBVElPTl9TVVBQT1JUICAgICAgICAgICAgICAgICAgICgxIDw8IDkpCisjICAgICAgIGRlZmluZSBMQ19SRU5FR09USUFURV9FTiAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgMTApCisjICAgICAgIGRlZmluZSBMQ19TSE9SVF9SRUNPTkZJR19FTiAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgMTEpCisjICAgICAgIGRlZmluZSBMQ19VUENPTkZJR1VSRV9TVVBQT1JUICAgICAgICAgICAgICAgICAgICAgKDEgPDwgMTIpCisjICAgICAgIGRlZmluZSBMQ19VUENPTkZJR1VSRV9ESVMgICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgMTMpCisjZGVmaW5lIFBDSUVfTENfU1BFRURfQ05UTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhhNCAvKiBQQ0lFX1AgKi8KKyMgICAgICAgZGVmaW5lIExDX0dFTjJfRU5fU1RSQVAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCAwKQorIyAgICAgICBkZWZpbmUgTENfVEFSR0VUX0xJTktfU1BFRURfT1ZFUlJJREVfRU4gICAgICAgICAgICgxIDw8IDEpCisjICAgICAgIGRlZmluZSBMQ19GT1JDRV9FTl9IV19TUEVFRF9DSEFOR0UgICAgICAgICAgICAgICAgKDEgPDwgNSkKKyMgICAgICAgZGVmaW5lIExDX0ZPUkNFX0RJU19IV19TUEVFRF9DSEFOR0UgICAgICAgICAgICAgICAoMSA8PCA2KQorIyAgICAgICBkZWZpbmUgTENfU1BFRURfQ0hBTkdFX0FUVEVNUFRTX0FMTE9XRURfTUFTSyAgICAgICgweDMgPDwgOCkKKyMgICAgICAgZGVmaW5lIExDX1NQRUVEX0NIQU5HRV9BVFRFTVBUU19BTExPV0VEX1NISUZUICAgICAzCisjICAgICAgIGRlZmluZSBMQ19DVVJSRU5UX0RBVEFfUkFURSAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgMTEpCisjICAgICAgIGRlZmluZSBMQ19WT0xUQUdFX1RJTUVSX1NFTF9NQVNLICAgICAgICAgICAgICAgICAgKDB4ZiA8PCAxNCkKKyMgICAgICAgZGVmaW5lIExDX0NMUl9GQUlMRURfU1BEX0NIQU5HRV9DTlQgICAgICAgICAgICAgICAoMSA8PCAyMSkKKyMgICAgICAgZGVmaW5lIExDX09USEVSX1NJREVfRVZFUl9TRU5UX0dFTjIgICAgICAgICAgICAgICAoMSA8PCAyMykKKyMgICAgICAgZGVmaW5lIExDX09USEVSX1NJREVfU1VQUE9SVFNfR0VOMiAgICAgICAgICAgICAgICAoMSA8PCAyNCkKKyNkZWZpbmUgTU1fQ0ZHUkVHU19DTlRMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDU0NGMKKyMgICAgICAgZGVmaW5lIE1NX1dSX1RPX0NGR19FTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCAzKQorI2RlZmluZSBMSU5LX0NOVEwyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODggLyogRjAgKi8KKyMgICAgICAgZGVmaW5lIFRBUkdFVF9MSU5LX1NQRUVEX01BU0sgICAgICAgICAgICAgICAgICAgICAoMHhmIDw8IDApCisjICAgICAgIGRlZmluZSBTRUxFQ1RBQkxFX0RFRU1QSEFTSVMgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgNikKKwogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vdHRtL3R0bV9iby5jIGIvZHJpdmVycy9ncHUvZHJtL3R0bS90dG1fYm8uYwppbmRleCA5MzRhOTZhLi5hZjYxZmMyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vdHRtL3R0bV9iby5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS90dG0vdHRtX2JvLmMKQEAgLTE2OSw3ICsxNjksNyBAQAogfQogRVhQT1JUX1NZTUJPTCh0dG1fYm9fd2FpdF91bnJlc2VydmVkKTsKIAotc3RhdGljIHZvaWQgdHRtX2JvX2FkZF90b19scnUoc3RydWN0IHR0bV9idWZmZXJfb2JqZWN0ICpibykKK3ZvaWQgdHRtX2JvX2FkZF90b19scnUoc3RydWN0IHR0bV9idWZmZXJfb2JqZWN0ICpibykKIHsKIAlzdHJ1Y3QgdHRtX2JvX2RldmljZSAqYmRldiA9IGJvLT5iZGV2OwogCXN0cnVjdCB0dG1fbWVtX3R5cGVfbWFuYWdlciAqbWFuOwpAQCAtMTkxLDExICsxOTEsNyBAQAogCX0KIH0KIAotLyoqCi0gKiBDYWxsIHdpdGggdGhlIGxydV9sb2NrIGhlbGQuCi0gKi8KLQotc3RhdGljIGludCB0dG1fYm9fZGVsX2Zyb21fbHJ1KHN0cnVjdCB0dG1fYnVmZmVyX29iamVjdCAqYm8pCitpbnQgdHRtX2JvX2RlbF9mcm9tX2xydShzdHJ1Y3QgdHRtX2J1ZmZlcl9vYmplY3QgKmJvKQogewogCWludCBwdXRfY291bnQgPSAwOwogCkBAIC0yMjcsOSArMjIzLDE4IEBACiAJCS8qKgogCQkgKiBEZWFkbG9jayBhdm9pZGFuY2UgZm9yIG11bHRpLWJvIHJlc2VydmluZy4KIAkJICovCi0JCWlmICh1c2Vfc2VxdWVuY2UgJiYgYm8tPnNlcV92YWxpZCAmJgotCQkJKHNlcXVlbmNlIC0gYm8tPnZhbF9zZXEgPCAoMSA8PCAzMSkpKSB7Ci0JCQlyZXR1cm4gLUVBR0FJTjsKKwkJaWYgKHVzZV9zZXF1ZW5jZSAmJiBiby0+c2VxX3ZhbGlkKSB7CisJCQkvKioKKwkJCSAqIFdlJ3ZlIGFscmVhZHkgcmVzZXJ2ZWQgdGhpcyBvbmUuCisJCQkgKi8KKwkJCWlmICh1bmxpa2VseShzZXF1ZW5jZSA9PSBiby0+dmFsX3NlcSkpCisJCQkJcmV0dXJuIC1FREVBRExLOworCQkJLyoqCisJCQkgKiBBbHJlYWR5IHJlc2VydmVkIGJ5IGEgdGhyZWFkIHRoYXQgd2lsbCBub3QgYmFjaworCQkJICogb2ZmIGZvciB1cy4gV2UgbmVlZCB0byBiYWNrIG9mZi4KKwkJCSAqLworCQkJaWYgKHVubGlrZWx5KHNlcXVlbmNlIC0gYm8tPnZhbF9zZXEgPCAoMSA8PCAzMSkpKQorCQkJCXJldHVybiAtRUFHQUlOOwogCQl9CiAKIAkJaWYgKG5vX3dhaXQpCkBAIC0yNjcsNiArMjcyLDEzIEBACiAJQlVHKCk7CiB9CiAKK3ZvaWQgdHRtX2JvX2xpc3RfcmVmX3N1YihzdHJ1Y3QgdHRtX2J1ZmZlcl9vYmplY3QgKmJvLCBpbnQgY291bnQsCisJCQkgYm9vbCBuZXZlcl9mcmVlKQoreworCWtyZWZfc3ViKCZiby0+bGlzdF9rcmVmLCBjb3VudCwKKwkJIChuZXZlcl9mcmVlKSA/IHR0bV9ib19yZWZfYnVnIDogdHRtX2JvX3JlbGVhc2VfbGlzdCk7Cit9CisKIGludCB0dG1fYm9fcmVzZXJ2ZShzdHJ1Y3QgdHRtX2J1ZmZlcl9vYmplY3QgKmJvLAogCQkgICBib29sIGludGVycnVwdGlibGUsCiAJCSAgIGJvb2wgbm9fd2FpdCwgYm9vbCB1c2Vfc2VxdWVuY2UsIHVpbnQzMl90IHNlcXVlbmNlKQpAQCAtMjgyLDIwICsyOTQsMjQgQEAKIAkJcHV0X2NvdW50ID0gdHRtX2JvX2RlbF9mcm9tX2xydShibyk7CiAJc3Bpbl91bmxvY2soJmdsb2ItPmxydV9sb2NrKTsKIAotCXdoaWxlIChwdXRfY291bnQtLSkKLQkJa3JlZl9wdXQoJmJvLT5saXN0X2tyZWYsIHR0bV9ib19yZWZfYnVnKTsKKwl0dG1fYm9fbGlzdF9yZWZfc3ViKGJvLCBwdXRfY291bnQsIHRydWUpOwogCiAJcmV0dXJuIHJldDsKIH0KIAordm9pZCB0dG1fYm9fdW5yZXNlcnZlX2xvY2tlZChzdHJ1Y3QgdHRtX2J1ZmZlcl9vYmplY3QgKmJvKQoreworCXR0bV9ib19hZGRfdG9fbHJ1KGJvKTsKKwlhdG9taWNfc2V0KCZiby0+cmVzZXJ2ZWQsIDApOworCXdha2VfdXBfYWxsKCZiby0+ZXZlbnRfcXVldWUpOworfQorCiB2b2lkIHR0bV9ib191bnJlc2VydmUoc3RydWN0IHR0bV9idWZmZXJfb2JqZWN0ICpibykKIHsKIAlzdHJ1Y3QgdHRtX2JvX2dsb2JhbCAqZ2xvYiA9IGJvLT5nbG9iOwogCiAJc3Bpbl9sb2NrKCZnbG9iLT5scnVfbG9jayk7Ci0JdHRtX2JvX2FkZF90b19scnUoYm8pOwotCWF0b21pY19zZXQoJmJvLT5yZXNlcnZlZCwgMCk7Ci0Jd2FrZV91cF9hbGwoJmJvLT5ldmVudF9xdWV1ZSk7CisJdHRtX2JvX3VucmVzZXJ2ZV9sb2NrZWQoYm8pOwogCXNwaW5fdW5sb2NrKCZnbG9iLT5scnVfbG9jayk7CiB9CiBFWFBPUlRfU1lNQk9MKHR0bV9ib191bnJlc2VydmUpOwpAQCAtMzYyLDggKzM3OCwxMyBAQAogCWludCByZXQgPSAwOwogCiAJaWYgKG9sZF9pc19wY2kgfHwgbmV3X2lzX3BjaSB8fAotCSAgICAoKG1lbS0+cGxhY2VtZW50ICYgYm8tPm1lbS5wbGFjZW1lbnQgJiBUVE1fUExfTUFTS19DQUNISU5HKSA9PSAwKSkKLQkJdHRtX2JvX3VubWFwX3ZpcnR1YWwoYm8pOworCSAgICAoKG1lbS0+cGxhY2VtZW50ICYgYm8tPm1lbS5wbGFjZW1lbnQgJiBUVE1fUExfTUFTS19DQUNISU5HKSA9PSAwKSkgeworCQlyZXQgPSB0dG1fbWVtX2lvX2xvY2sob2xkX21hbiwgdHJ1ZSk7CisJCWlmICh1bmxpa2VseShyZXQgIT0gMCkpCisJCQlnb3RvIG91dF9lcnI7CisJCXR0bV9ib191bm1hcF92aXJ0dWFsX2xvY2tlZChibyk7CisJCXR0bV9tZW1faW9fdW5sb2NrKG9sZF9tYW4pOworCX0KIAogCS8qCiAJICogQ3JlYXRlIGFuZCBiaW5kIGEgdHRtIGlmIHJlcXVpcmVkLgpAQCAtNDE2LDExICs0MzcsOSBAQAogCX0KIAogCWlmIChiby0+bWVtLm1tX25vZGUpIHsKLQkJc3Bpbl9sb2NrKCZiby0+bG9jayk7CiAJCWJvLT5vZmZzZXQgPSAoYm8tPm1lbS5zdGFydCA8PCBQQUdFX1NISUZUKSArCiAJCSAgICBiZGV2LT5tYW5bYm8tPm1lbS5tZW1fdHlwZV0uZ3B1X29mZnNldDsKIAkJYm8tPmN1cl9wbGFjZW1lbnQgPSBiby0+bWVtLnBsYWNlbWVudDsKLQkJc3Bpbl91bmxvY2soJmJvLT5sb2NrKTsKIAl9IGVsc2UKIAkJYm8tPm9mZnNldCA9IDA7CiAKQEAgLTQ1Miw3ICs0NzEsNiBAQAogCQl0dG1fdHRfZGVzdHJveShiby0+dHRtKTsKIAkJYm8tPnR0bSA9IE5VTEw7CiAJfQotCiAJdHRtX2JvX21lbV9wdXQoYm8sICZiby0+bWVtKTsKIAogCWF0b21pY19zZXQoJmJvLT5yZXNlcnZlZCwgMCk7CkBAIC00NzQsMTQgKzQ5MiwxNCBAQAogCWludCBwdXRfY291bnQ7CiAJaW50IHJldDsKIAotCXNwaW5fbG9jaygmYm8tPmxvY2spOworCXNwaW5fbG9jaygmYmRldi0+ZmVuY2VfbG9jayk7CiAJKHZvaWQpIHR0bV9ib193YWl0KGJvLCBmYWxzZSwgZmFsc2UsIHRydWUpOwogCWlmICghYm8tPnN5bmNfb2JqKSB7CiAKIAkJc3Bpbl9sb2NrKCZnbG9iLT5scnVfbG9jayk7CiAKIAkJLyoqCi0JCSAqIExvY2sgaW52ZXJzaW9uIGJldHdlZW4gYm86OnJlc2VydmUgYW5kIGJvOjpsb2NrIGhlcmUsCisJCSAqIExvY2sgaW52ZXJzaW9uIGJldHdlZW4gYm86cmVzZXJ2ZSBhbmQgYmRldjo6ZmVuY2VfbG9jayBoZXJlLAogCQkgKiBidXQgdGhhdCdzIE9LLCBzaW5jZSB3ZSdyZSBvbmx5IHRyeWxvY2tpbmcuCiAJCSAqLwogCkBAIC00OTAsMTQgKzUwOCwxMyBAQAogCQlpZiAodW5saWtlbHkocmV0ID09IC1FQlVTWSkpCiAJCQlnb3RvIHF1ZXVlOwogCi0JCXNwaW5fdW5sb2NrKCZiby0+bG9jayk7CisJCXNwaW5fdW5sb2NrKCZiZGV2LT5mZW5jZV9sb2NrKTsKIAkJcHV0X2NvdW50ID0gdHRtX2JvX2RlbF9mcm9tX2xydShibyk7CiAKIAkJc3Bpbl91bmxvY2soJmdsb2ItPmxydV9sb2NrKTsKIAkJdHRtX2JvX2NsZWFudXBfbWVtdHlwZV91c2UoYm8pOwogCi0JCXdoaWxlIChwdXRfY291bnQtLSkKLQkJCWtyZWZfcHV0KCZiby0+bGlzdF9rcmVmLCB0dG1fYm9fcmVmX2J1Zyk7CisJCXR0bV9ib19saXN0X3JlZl9zdWIoYm8sIHB1dF9jb3VudCwgdHJ1ZSk7CiAKIAkJcmV0dXJuOwogCX0gZWxzZSB7CkBAIC01MTIsNyArNTI5LDcgQEAKIAlrcmVmX2dldCgmYm8tPmxpc3Rfa3JlZik7CiAJbGlzdF9hZGRfdGFpbCgmYm8tPmRkZXN0cm95LCAmYmRldi0+ZGRlc3Ryb3kpOwogCXNwaW5fdW5sb2NrKCZnbG9iLT5scnVfbG9jayk7Ci0Jc3Bpbl91bmxvY2soJmJvLT5sb2NrKTsKKwlzcGluX3VubG9jaygmYmRldi0+ZmVuY2VfbG9jayk7CiAKIAlpZiAoc3luY19vYmopIHsKIAkJZHJpdmVyLT5zeW5jX29ial9mbHVzaChzeW5jX29iaiwgc3luY19vYmpfYXJnKTsKQEAgLTUzNywxNCArNTU0LDE1IEBACiAJCQkgICAgICAgYm9vbCBub193YWl0X3Jlc2VydmUsCiAJCQkgICAgICAgYm9vbCBub193YWl0X2dwdSkKIHsKKwlzdHJ1Y3QgdHRtX2JvX2RldmljZSAqYmRldiA9IGJvLT5iZGV2OwogCXN0cnVjdCB0dG1fYm9fZ2xvYmFsICpnbG9iID0gYm8tPmdsb2I7CiAJaW50IHB1dF9jb3VudDsKIAlpbnQgcmV0ID0gMDsKIAogcmV0cnk6Ci0Jc3Bpbl9sb2NrKCZiby0+bG9jayk7CisJc3Bpbl9sb2NrKCZiZGV2LT5mZW5jZV9sb2NrKTsKIAlyZXQgPSB0dG1fYm9fd2FpdChibywgZmFsc2UsIGludGVycnVwdGlibGUsIG5vX3dhaXRfZ3B1KTsKLQlzcGluX3VubG9jaygmYm8tPmxvY2spOworCXNwaW5fdW5sb2NrKCZiZGV2LT5mZW5jZV9sb2NrKTsKIAogCWlmICh1bmxpa2VseShyZXQgIT0gMCkpCiAJCXJldHVybiByZXQ7CkBAIC01ODAsOCArNTk4LDcgQEAKIAlzcGluX3VubG9jaygmZ2xvYi0+bHJ1X2xvY2spOwogCXR0bV9ib19jbGVhbnVwX21lbXR5cGVfdXNlKGJvKTsKIAotCXdoaWxlIChwdXRfY291bnQtLSkKLQkJa3JlZl9wdXQoJmJvLT5saXN0X2tyZWYsIHR0bV9ib19yZWZfYnVnKTsKKwl0dG1fYm9fbGlzdF9yZWZfc3ViKGJvLCBwdXRfY291bnQsIHRydWUpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC02NTIsNiArNjY5LDcgQEAKIAlzdHJ1Y3QgdHRtX2J1ZmZlcl9vYmplY3QgKmJvID0KIAkgICAgY29udGFpbmVyX29mKGtyZWYsIHN0cnVjdCB0dG1fYnVmZmVyX29iamVjdCwga3JlZik7CiAJc3RydWN0IHR0bV9ib19kZXZpY2UgKmJkZXYgPSBiby0+YmRldjsKKwlzdHJ1Y3QgdHRtX21lbV90eXBlX21hbmFnZXIgKm1hbiA9ICZiZGV2LT5tYW5bYm8tPm1lbS5tZW1fdHlwZV07CiAKIAlpZiAobGlrZWx5KGJvLT52bV9ub2RlICE9IE5VTEwpKSB7CiAJCXJiX2VyYXNlKCZiby0+dm1fcmIsICZiZGV2LT5hZGRyX3NwYWNlX3JiKTsKQEAgLTY1OSw2ICs2NzcsOSBAQAogCQliby0+dm1fbm9kZSA9IE5VTEw7CiAJfQogCXdyaXRlX3VubG9jaygmYmRldi0+dm1fbG9jayk7CisJdHRtX21lbV9pb19sb2NrKG1hbiwgZmFsc2UpOworCXR0bV9tZW1faW9fZnJlZV92bShibyk7CisJdHRtX21lbV9pb191bmxvY2sobWFuKTsKIAl0dG1fYm9fY2xlYW51cF9yZWZzX29yX3F1ZXVlKGJvKTsKIAlrcmVmX3B1dCgmYm8tPmxpc3Rfa3JlZiwgdHRtX2JvX3JlbGVhc2VfbGlzdCk7CiAJd3JpdGVfbG9jaygmYmRldi0+dm1fbG9jayk7CkBAIC02OTgsOSArNzE5LDkgQEAKIAlzdHJ1Y3QgdHRtX3BsYWNlbWVudCBwbGFjZW1lbnQ7CiAJaW50IHJldCA9IDA7CiAKLQlzcGluX2xvY2soJmJvLT5sb2NrKTsKKwlzcGluX2xvY2soJmJkZXYtPmZlbmNlX2xvY2spOwogCXJldCA9IHR0bV9ib193YWl0KGJvLCBmYWxzZSwgaW50ZXJydXB0aWJsZSwgbm9fd2FpdF9ncHUpOwotCXNwaW5fdW5sb2NrKCZiby0+bG9jayk7CisJc3Bpbl91bmxvY2soJmJkZXYtPmZlbmNlX2xvY2spOwogCiAJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkgewogCQlpZiAocmV0ICE9IC1FUkVTVEFSVFNZUykgewpAQCAtNzE1LDcgKzczNiw4IEBACiAKIAlldmljdF9tZW0gPSBiby0+bWVtOwogCWV2aWN0X21lbS5tbV9ub2RlID0gTlVMTDsKLQlldmljdF9tZW0uYnVzLmlvX3Jlc2VydmVkID0gZmFsc2U7CisJZXZpY3RfbWVtLmJ1cy5pb19yZXNlcnZlZF92bSA9IGZhbHNlOworCWV2aWN0X21lbS5idXMuaW9fcmVzZXJ2ZWRfY291bnQgPSAwOwogCiAJcGxhY2VtZW50LmZwZm4gPSAwOwogCXBsYWNlbWVudC5scGZuID0gMDsKQEAgLTgwMiw4ICs4MjQsNyBAQAogCiAJQlVHX09OKHJldCAhPSAwKTsKIAotCXdoaWxlIChwdXRfY291bnQtLSkKLQkJa3JlZl9wdXQoJmJvLT5saXN0X2tyZWYsIHR0bV9ib19yZWZfYnVnKTsKKwl0dG1fYm9fbGlzdF9yZWZfc3ViKGJvLCBwdXRfY291bnQsIHRydWUpOwogCiAJcmV0ID0gdHRtX2JvX2V2aWN0KGJvLCBpbnRlcnJ1cHRpYmxlLCBub193YWl0X3Jlc2VydmUsIG5vX3dhaXRfZ3B1KTsKIAl0dG1fYm9fdW5yZXNlcnZlKGJvKTsKQEAgLTEwMzYsNiArMTA1Nyw3IEBACiB7CiAJaW50IHJldCA9IDA7CiAJc3RydWN0IHR0bV9tZW1fcmVnIG1lbTsKKwlzdHJ1Y3QgdHRtX2JvX2RldmljZSAqYmRldiA9IGJvLT5iZGV2OwogCiAJQlVHX09OKCFhdG9taWNfcmVhZCgmYm8tPnJlc2VydmVkKSk7CiAKQEAgLTEwNDQsMTUgKzEwNjYsMTYgQEAKIAkgKiBIYXZlIHRoZSBkcml2ZXIgbW92ZSBmdW5jdGlvbiB3YWl0IGZvciBpZGxlIHdoZW4gbmVjZXNzYXJ5LAogCSAqIGluc3RlYWQgb2YgZG9pbmcgaXQgaGVyZS4KIAkgKi8KLQlzcGluX2xvY2soJmJvLT5sb2NrKTsKKwlzcGluX2xvY2soJmJkZXYtPmZlbmNlX2xvY2spOwogCXJldCA9IHR0bV9ib193YWl0KGJvLCBmYWxzZSwgaW50ZXJydXB0aWJsZSwgbm9fd2FpdF9ncHUpOwotCXNwaW5fdW5sb2NrKCZiby0+bG9jayk7CisJc3Bpbl91bmxvY2soJmJkZXYtPmZlbmNlX2xvY2spOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAJbWVtLm51bV9wYWdlcyA9IGJvLT5udW1fcGFnZXM7CiAJbWVtLnNpemUgPSBtZW0ubnVtX3BhZ2VzIDw8IFBBR0VfU0hJRlQ7CiAJbWVtLnBhZ2VfYWxpZ25tZW50ID0gYm8tPm1lbS5wYWdlX2FsaWdubWVudDsKLQltZW0uYnVzLmlvX3Jlc2VydmVkID0gZmFsc2U7CisJbWVtLmJ1cy5pb19yZXNlcnZlZF92bSA9IGZhbHNlOworCW1lbS5idXMuaW9fcmVzZXJ2ZWRfY291bnQgPSAwOwogCS8qCiAJICogRGV0ZXJtaW5lIHdoZXJlIHRvIG1vdmUgdGhlIGJ1ZmZlci4KIAkgKi8KQEAgLTExNjMsNyArMTE4Niw2IEBACiAJfQogCWJvLT5kZXN0cm95ID0gZGVzdHJveTsKIAotCXNwaW5fbG9ja19pbml0KCZiby0+bG9jayk7CiAJa3JlZl9pbml0KCZiby0+a3JlZik7CiAJa3JlZl9pbml0KCZiby0+bGlzdF9rcmVmKTsKIAlhdG9taWNfc2V0KCZiby0+Y3B1X3dyaXRlcnMsIDApOwpAQCAtMTE3Miw2ICsxMTk0LDcgQEAKIAlJTklUX0xJU1RfSEVBRCgmYm8tPmxydSk7CiAJSU5JVF9MSVNUX0hFQUQoJmJvLT5kZGVzdHJveSk7CiAJSU5JVF9MSVNUX0hFQUQoJmJvLT5zd2FwKTsKKwlJTklUX0xJU1RfSEVBRCgmYm8tPmlvX3Jlc2VydmVfbHJ1KTsKIAliby0+YmRldiA9IGJkZXY7CiAJYm8tPmdsb2IgPSBiZGV2LT5nbG9iOwogCWJvLT50eXBlID0gdHlwZTsKQEAgLTExODEsNyArMTIwNCw4IEBACiAJYm8tPm1lbS5udW1fcGFnZXMgPSBiby0+bnVtX3BhZ2VzOwogCWJvLT5tZW0ubW1fbm9kZSA9IE5VTEw7CiAJYm8tPm1lbS5wYWdlX2FsaWdubWVudCA9IHBhZ2VfYWxpZ25tZW50OwotCWJvLT5tZW0uYnVzLmlvX3Jlc2VydmVkID0gZmFsc2U7CisJYm8tPm1lbS5idXMuaW9fcmVzZXJ2ZWRfdm0gPSBmYWxzZTsKKwliby0+bWVtLmJ1cy5pb19yZXNlcnZlZF9jb3VudCA9IDA7CiAJYm8tPmJ1ZmZlcl9zdGFydCA9IGJ1ZmZlcl9zdGFydCAmIFBBR0VfTUFTSzsKIAliby0+cHJpdl9mbGFncyA9IDA7CiAJYm8tPm1lbS5wbGFjZW1lbnQgPSAoVFRNX1BMX0ZMQUdfU1lTVEVNIHwgVFRNX1BMX0ZMQUdfQ0FDSEVEKTsKQEAgLTEzNTUsNiArMTM3OSwxMCBAQAogCUJVR19PTih0eXBlID49IFRUTV9OVU1fTUVNX1RZUEVTKTsKIAltYW4gPSAmYmRldi0+bWFuW3R5cGVdOwogCUJVR19PTihtYW4tPmhhc190eXBlKTsKKwltYW4tPmlvX3Jlc2VydmVfZmFzdHBhdGggPSB0cnVlOworCW1hbi0+dXNlX2lvX3Jlc2VydmVfbHJ1ID0gZmFsc2U7CisJbXV0ZXhfaW5pdCgmbWFuLT5pb19yZXNlcnZlX211dGV4KTsKKwlJTklUX0xJU1RfSEVBRCgmbWFuLT5pb19yZXNlcnZlX2xydSk7CiAKIAlyZXQgPSBiZGV2LT5kcml2ZXItPmluaXRfbWVtX3R5cGUoYmRldiwgdHlwZSwgbWFuKTsKIAlpZiAocmV0KQpAQCAtMTUyNiw3ICsxNTU0LDggQEAKIAliZGV2LT5kZXZfbWFwcGluZyA9IE5VTEw7CiAJYmRldi0+Z2xvYiA9IGdsb2I7CiAJYmRldi0+bmVlZF9kbWEzMiA9IG5lZWRfZG1hMzI7Ci0KKwliZGV2LT52YWxfc2VxID0gMDsKKwlzcGluX2xvY2tfaW5pdCgmYmRldi0+ZmVuY2VfbG9jayk7CiAJbXV0ZXhfbG9jaygmZ2xvYi0+ZGV2aWNlX2xpc3RfbXV0ZXgpOwogCWxpc3RfYWRkX3RhaWwoJmJkZXYtPmRldmljZV9saXN0LCAmZ2xvYi0+ZGV2aWNlX2xpc3QpOwogCW11dGV4X3VubG9jaygmZ2xvYi0+ZGV2aWNlX2xpc3RfbXV0ZXgpOwpAQCAtMTU2MCw3ICsxNTg5LDcgQEAKIAlyZXR1cm4gdHJ1ZTsKIH0KIAotdm9pZCB0dG1fYm9fdW5tYXBfdmlydHVhbChzdHJ1Y3QgdHRtX2J1ZmZlcl9vYmplY3QgKmJvKQordm9pZCB0dG1fYm9fdW5tYXBfdmlydHVhbF9sb2NrZWQoc3RydWN0IHR0bV9idWZmZXJfb2JqZWN0ICpibykKIHsKIAlzdHJ1Y3QgdHRtX2JvX2RldmljZSAqYmRldiA9IGJvLT5iZGV2OwogCWxvZmZfdCBvZmZzZXQgPSAobG9mZl90KSBiby0+YWRkcl9zcGFjZV9vZmZzZXQ7CkBAIC0xNTY5LDggKzE1OTgsMjAgQEAKIAlpZiAoIWJkZXYtPmRldl9tYXBwaW5nKQogCQlyZXR1cm47CiAJdW5tYXBfbWFwcGluZ19yYW5nZShiZGV2LT5kZXZfbWFwcGluZywgb2Zmc2V0LCBob2xlbGVuLCAxKTsKLQl0dG1fbWVtX2lvX2ZyZWUoYmRldiwgJmJvLT5tZW0pOworCXR0bV9tZW1faW9fZnJlZV92bShibyk7CiB9CisKK3ZvaWQgdHRtX2JvX3VubWFwX3ZpcnR1YWwoc3RydWN0IHR0bV9idWZmZXJfb2JqZWN0ICpibykKK3sKKwlzdHJ1Y3QgdHRtX2JvX2RldmljZSAqYmRldiA9IGJvLT5iZGV2OworCXN0cnVjdCB0dG1fbWVtX3R5cGVfbWFuYWdlciAqbWFuID0gJmJkZXYtPm1hbltiby0+bWVtLm1lbV90eXBlXTsKKworCXR0bV9tZW1faW9fbG9jayhtYW4sIGZhbHNlKTsKKwl0dG1fYm9fdW5tYXBfdmlydHVhbF9sb2NrZWQoYm8pOworCXR0bV9tZW1faW9fdW5sb2NrKG1hbik7Cit9CisKKwogRVhQT1JUX1NZTUJPTCh0dG1fYm9fdW5tYXBfdmlydHVhbCk7CiAKIHN0YXRpYyB2b2lkIHR0bV9ib192bV9pbnNlcnRfcmIoc3RydWN0IHR0bV9idWZmZXJfb2JqZWN0ICpibykKQEAgLTE2NTAsNiArMTY5MSw3IEBACiAJCWJvb2wgbGF6eSwgYm9vbCBpbnRlcnJ1cHRpYmxlLCBib29sIG5vX3dhaXQpCiB7CiAJc3RydWN0IHR0bV9ib19kcml2ZXIgKmRyaXZlciA9IGJvLT5iZGV2LT5kcml2ZXI7CisJc3RydWN0IHR0bV9ib19kZXZpY2UgKmJkZXYgPSBiby0+YmRldjsKIAl2b2lkICpzeW5jX29iajsKIAl2b2lkICpzeW5jX29ial9hcmc7CiAJaW50IHJldCA9IDA7CkBAIC0xNjYzLDkgKzE3MDUsOSBAQAogCQkJdm9pZCAqdG1wX29iaiA9IGJvLT5zeW5jX29iajsKIAkJCWJvLT5zeW5jX29iaiA9IE5VTEw7CiAJCQljbGVhcl9iaXQoVFRNX0JPX1BSSVZfRkxBR19NT1ZJTkcsICZiby0+cHJpdl9mbGFncyk7Ci0JCQlzcGluX3VubG9jaygmYm8tPmxvY2spOworCQkJc3Bpbl91bmxvY2soJmJkZXYtPmZlbmNlX2xvY2spOwogCQkJZHJpdmVyLT5zeW5jX29ial91bnJlZigmdG1wX29iaik7Ci0JCQlzcGluX2xvY2soJmJvLT5sb2NrKTsKKwkJCXNwaW5fbG9jaygmYmRldi0+ZmVuY2VfbG9jayk7CiAJCQljb250aW51ZTsKIAkJfQogCkBAIC0xNjc0LDI5ICsxNzE2LDI5IEBACiAKIAkJc3luY19vYmogPSBkcml2ZXItPnN5bmNfb2JqX3JlZihiby0+c3luY19vYmopOwogCQlzeW5jX29ial9hcmcgPSBiby0+c3luY19vYmpfYXJnOwotCQlzcGluX3VubG9jaygmYm8tPmxvY2spOworCQlzcGluX3VubG9jaygmYmRldi0+ZmVuY2VfbG9jayk7CiAJCXJldCA9IGRyaXZlci0+c3luY19vYmpfd2FpdChzeW5jX29iaiwgc3luY19vYmpfYXJnLAogCQkJCQkgICAgbGF6eSwgaW50ZXJydXB0aWJsZSk7CiAJCWlmICh1bmxpa2VseShyZXQgIT0gMCkpIHsKIAkJCWRyaXZlci0+c3luY19vYmpfdW5yZWYoJnN5bmNfb2JqKTsKLQkJCXNwaW5fbG9jaygmYm8tPmxvY2spOworCQkJc3Bpbl9sb2NrKCZiZGV2LT5mZW5jZV9sb2NrKTsKIAkJCXJldHVybiByZXQ7CiAJCX0KLQkJc3Bpbl9sb2NrKCZiby0+bG9jayk7CisJCXNwaW5fbG9jaygmYmRldi0+ZmVuY2VfbG9jayk7CiAJCWlmIChsaWtlbHkoYm8tPnN5bmNfb2JqID09IHN5bmNfb2JqICYmCiAJCQkgICBiby0+c3luY19vYmpfYXJnID09IHN5bmNfb2JqX2FyZykpIHsKIAkJCXZvaWQgKnRtcF9vYmogPSBiby0+c3luY19vYmo7CiAJCQliby0+c3luY19vYmogPSBOVUxMOwogCQkJY2xlYXJfYml0KFRUTV9CT19QUklWX0ZMQUdfTU9WSU5HLAogCQkJCSAgJmJvLT5wcml2X2ZsYWdzKTsKLQkJCXNwaW5fdW5sb2NrKCZiby0+bG9jayk7CisJCQlzcGluX3VubG9jaygmYmRldi0+ZmVuY2VfbG9jayk7CiAJCQlkcml2ZXItPnN5bmNfb2JqX3VucmVmKCZzeW5jX29iaik7CiAJCQlkcml2ZXItPnN5bmNfb2JqX3VucmVmKCZ0bXBfb2JqKTsKLQkJCXNwaW5fbG9jaygmYm8tPmxvY2spOworCQkJc3Bpbl9sb2NrKCZiZGV2LT5mZW5jZV9sb2NrKTsKIAkJfSBlbHNlIHsKLQkJCXNwaW5fdW5sb2NrKCZiby0+bG9jayk7CisJCQlzcGluX3VubG9jaygmYmRldi0+ZmVuY2VfbG9jayk7CiAJCQlkcml2ZXItPnN5bmNfb2JqX3VucmVmKCZzeW5jX29iaik7Ci0JCQlzcGluX2xvY2soJmJvLT5sb2NrKTsKKwkJCXNwaW5fbG9jaygmYmRldi0+ZmVuY2VfbG9jayk7CiAJCX0KIAl9CiAJcmV0dXJuIDA7CkBAIC0xNzA1LDYgKzE3NDcsNyBAQAogCiBpbnQgdHRtX2JvX3N5bmNjcHVfd3JpdGVfZ3JhYihzdHJ1Y3QgdHRtX2J1ZmZlcl9vYmplY3QgKmJvLCBib29sIG5vX3dhaXQpCiB7CisJc3RydWN0IHR0bV9ib19kZXZpY2UgKmJkZXYgPSBiby0+YmRldjsKIAlpbnQgcmV0ID0gMDsKIAogCS8qCkBAIC0xNzE0LDkgKzE3NTcsOSBAQAogCXJldCA9IHR0bV9ib19yZXNlcnZlKGJvLCB0cnVlLCBub193YWl0LCBmYWxzZSwgMCk7CiAJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkKIAkJcmV0dXJuIHJldDsKLQlzcGluX2xvY2soJmJvLT5sb2NrKTsKKwlzcGluX2xvY2soJmJkZXYtPmZlbmNlX2xvY2spOwogCXJldCA9IHR0bV9ib193YWl0KGJvLCBmYWxzZSwgdHJ1ZSwgbm9fd2FpdCk7Ci0Jc3Bpbl91bmxvY2soJmJvLT5sb2NrKTsKKwlzcGluX3VubG9jaygmYmRldi0+ZmVuY2VfbG9jayk7CiAJaWYgKGxpa2VseShyZXQgPT0gMCkpCiAJCWF0b21pY19pbmMoJmJvLT5jcHVfd3JpdGVycyk7CiAJdHRtX2JvX3VucmVzZXJ2ZShibyk7CkBAIC0xNzgyLDE2ICsxODI1LDE1IEBACiAJcHV0X2NvdW50ID0gdHRtX2JvX2RlbF9mcm9tX2xydShibyk7CiAJc3Bpbl91bmxvY2soJmdsb2ItPmxydV9sb2NrKTsKIAotCXdoaWxlIChwdXRfY291bnQtLSkKLQkJa3JlZl9wdXQoJmJvLT5saXN0X2tyZWYsIHR0bV9ib19yZWZfYnVnKTsKKwl0dG1fYm9fbGlzdF9yZWZfc3ViKGJvLCBwdXRfY291bnQsIHRydWUpOwogCiAJLyoqCiAJICogV2FpdCBmb3IgR1BVLCB0aGVuIG1vdmUgdG8gc3lzdGVtIGNhY2hlZC4KIAkgKi8KIAotCXNwaW5fbG9jaygmYm8tPmxvY2spOworCXNwaW5fbG9jaygmYm8tPmJkZXYtPmZlbmNlX2xvY2spOwogCXJldCA9IHR0bV9ib193YWl0KGJvLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKLQlzcGluX3VubG9jaygmYm8tPmxvY2spOworCXNwaW5fdW5sb2NrKCZiby0+YmRldi0+ZmVuY2VfbG9jayk7CiAKIAlpZiAodW5saWtlbHkocmV0ICE9IDApKQogCQlnb3RvIG91dDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS90dG0vdHRtX2JvX3V0aWwuYyBiL2RyaXZlcnMvZ3B1L2RybS90dG0vdHRtX2JvX3V0aWwuYwppbmRleCAzMTA2ZDViLi43N2RiZjQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vdHRtL3R0bV9ib191dGlsLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3R0bS90dG1fYm9fdXRpbC5jCkBAIC03NSwzNyArNzUsMTIzIEBACiB9CiBFWFBPUlRfU1lNQk9MKHR0bV9ib19tb3ZlX3R0bSk7CiAKLWludCB0dG1fbWVtX2lvX3Jlc2VydmUoc3RydWN0IHR0bV9ib19kZXZpY2UgKmJkZXYsIHN0cnVjdCB0dG1fbWVtX3JlZyAqbWVtKQoraW50IHR0bV9tZW1faW9fbG9jayhzdHJ1Y3QgdHRtX21lbV90eXBlX21hbmFnZXIgKm1hbiwgYm9vbCBpbnRlcnJ1cHRpYmxlKQogeworCWlmIChsaWtlbHkobWFuLT5pb19yZXNlcnZlX2Zhc3RwYXRoKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoaW50ZXJydXB0aWJsZSkKKwkJcmV0dXJuIG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmbWFuLT5pb19yZXNlcnZlX211dGV4KTsKKworCW11dGV4X2xvY2soJm1hbi0+aW9fcmVzZXJ2ZV9tdXRleCk7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgdHRtX21lbV9pb191bmxvY2soc3RydWN0IHR0bV9tZW1fdHlwZV9tYW5hZ2VyICptYW4pCit7CisJaWYgKGxpa2VseShtYW4tPmlvX3Jlc2VydmVfZmFzdHBhdGgpKQorCQlyZXR1cm47CisKKwltdXRleF91bmxvY2soJm1hbi0+aW9fcmVzZXJ2ZV9tdXRleCk7Cit9CisKK3N0YXRpYyBpbnQgdHRtX21lbV9pb19ldmljdChzdHJ1Y3QgdHRtX21lbV90eXBlX21hbmFnZXIgKm1hbikKK3sKKwlzdHJ1Y3QgdHRtX2J1ZmZlcl9vYmplY3QgKmJvOworCisJaWYgKCFtYW4tPnVzZV9pb19yZXNlcnZlX2xydSB8fCBsaXN0X2VtcHR5KCZtYW4tPmlvX3Jlc2VydmVfbHJ1KSkKKwkJcmV0dXJuIC1FQUdBSU47CisKKwlibyA9IGxpc3RfZmlyc3RfZW50cnkoJm1hbi0+aW9fcmVzZXJ2ZV9scnUsCisJCQkgICAgICBzdHJ1Y3QgdHRtX2J1ZmZlcl9vYmplY3QsCisJCQkgICAgICBpb19yZXNlcnZlX2xydSk7CisJbGlzdF9kZWxfaW5pdCgmYm8tPmlvX3Jlc2VydmVfbHJ1KTsKKwl0dG1fYm9fdW5tYXBfdmlydHVhbF9sb2NrZWQoYm8pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdHRtX21lbV9pb19yZXNlcnZlKHN0cnVjdCB0dG1fYm9fZGV2aWNlICpiZGV2LAorCQkJICAgICAgc3RydWN0IHR0bV9tZW1fcmVnICptZW0pCit7CisJc3RydWN0IHR0bV9tZW1fdHlwZV9tYW5hZ2VyICptYW4gPSAmYmRldi0+bWFuW21lbS0+bWVtX3R5cGVdOworCWludCByZXQgPSAwOworCisJaWYgKCFiZGV2LT5kcml2ZXItPmlvX21lbV9yZXNlcnZlKQorCQlyZXR1cm4gMDsKKwlpZiAobGlrZWx5KG1hbi0+aW9fcmVzZXJ2ZV9mYXN0cGF0aCkpCisJCXJldHVybiBiZGV2LT5kcml2ZXItPmlvX21lbV9yZXNlcnZlKGJkZXYsIG1lbSk7CisKKwlpZiAoYmRldi0+ZHJpdmVyLT5pb19tZW1fcmVzZXJ2ZSAmJgorCSAgICBtZW0tPmJ1cy5pb19yZXNlcnZlZF9jb3VudCsrID09IDApIHsKK3JldHJ5OgorCQlyZXQgPSBiZGV2LT5kcml2ZXItPmlvX21lbV9yZXNlcnZlKGJkZXYsIG1lbSk7CisJCWlmIChyZXQgPT0gLUVBR0FJTikgeworCQkJcmV0ID0gdHRtX21lbV9pb19ldmljdChtYW4pOworCQkJaWYgKHJldCA9PSAwKQorCQkJCWdvdG8gcmV0cnk7CisJCX0KKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgdHRtX21lbV9pb19mcmVlKHN0cnVjdCB0dG1fYm9fZGV2aWNlICpiZGV2LAorCQkJICAgIHN0cnVjdCB0dG1fbWVtX3JlZyAqbWVtKQoreworCXN0cnVjdCB0dG1fbWVtX3R5cGVfbWFuYWdlciAqbWFuID0gJmJkZXYtPm1hblttZW0tPm1lbV90eXBlXTsKKworCWlmIChsaWtlbHkobWFuLT5pb19yZXNlcnZlX2Zhc3RwYXRoKSkKKwkJcmV0dXJuOworCisJaWYgKGJkZXYtPmRyaXZlci0+aW9fbWVtX3Jlc2VydmUgJiYKKwkgICAgLS1tZW0tPmJ1cy5pb19yZXNlcnZlZF9jb3VudCA9PSAwICYmCisJICAgIGJkZXYtPmRyaXZlci0+aW9fbWVtX2ZyZWUpCisJCWJkZXYtPmRyaXZlci0+aW9fbWVtX2ZyZWUoYmRldiwgbWVtKTsKKworfQorCitpbnQgdHRtX21lbV9pb19yZXNlcnZlX3ZtKHN0cnVjdCB0dG1fYnVmZmVyX29iamVjdCAqYm8pCit7CisJc3RydWN0IHR0bV9tZW1fcmVnICptZW0gPSAmYm8tPm1lbTsKIAlpbnQgcmV0OwogCi0JaWYgKCFtZW0tPmJ1cy5pb19yZXNlcnZlZCkgewotCQltZW0tPmJ1cy5pb19yZXNlcnZlZCA9IHRydWU7Ci0JCXJldCA9IGJkZXYtPmRyaXZlci0+aW9fbWVtX3Jlc2VydmUoYmRldiwgbWVtKTsKKwlpZiAoIW1lbS0+YnVzLmlvX3Jlc2VydmVkX3ZtKSB7CisJCXN0cnVjdCB0dG1fbWVtX3R5cGVfbWFuYWdlciAqbWFuID0KKwkJCSZiby0+YmRldi0+bWFuW21lbS0+bWVtX3R5cGVdOworCisJCXJldCA9IHR0bV9tZW1faW9fcmVzZXJ2ZShiby0+YmRldiwgbWVtKTsKIAkJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkKIAkJCXJldHVybiByZXQ7CisJCW1lbS0+YnVzLmlvX3Jlc2VydmVkX3ZtID0gdHJ1ZTsKKwkJaWYgKG1hbi0+dXNlX2lvX3Jlc2VydmVfbHJ1KQorCQkJbGlzdF9hZGRfdGFpbCgmYm8tPmlvX3Jlc2VydmVfbHJ1LAorCQkJCSAgICAgICZtYW4tPmlvX3Jlc2VydmVfbHJ1KTsKIAl9CiAJcmV0dXJuIDA7CiB9CiAKLXZvaWQgdHRtX21lbV9pb19mcmVlKHN0cnVjdCB0dG1fYm9fZGV2aWNlICpiZGV2LCBzdHJ1Y3QgdHRtX21lbV9yZWcgKm1lbSkKK3ZvaWQgdHRtX21lbV9pb19mcmVlX3ZtKHN0cnVjdCB0dG1fYnVmZmVyX29iamVjdCAqYm8pCiB7Ci0JaWYgKGJkZXYtPmRyaXZlci0+aW9fbWVtX3Jlc2VydmUpIHsKLQkJaWYgKG1lbS0+YnVzLmlvX3Jlc2VydmVkKSB7Ci0JCQltZW0tPmJ1cy5pb19yZXNlcnZlZCA9IGZhbHNlOwotCQkJYmRldi0+ZHJpdmVyLT5pb19tZW1fZnJlZShiZGV2LCBtZW0pOwotCQl9CisJc3RydWN0IHR0bV9tZW1fcmVnICptZW0gPSAmYm8tPm1lbTsKKworCWlmIChtZW0tPmJ1cy5pb19yZXNlcnZlZF92bSkgeworCQltZW0tPmJ1cy5pb19yZXNlcnZlZF92bSA9IGZhbHNlOworCQlsaXN0X2RlbF9pbml0KCZiby0+aW9fcmVzZXJ2ZV9scnUpOworCQl0dG1fbWVtX2lvX2ZyZWUoYm8tPmJkZXYsIG1lbSk7CiAJfQogfQogCiBpbnQgdHRtX21lbV9yZWdfaW9yZW1hcChzdHJ1Y3QgdHRtX2JvX2RldmljZSAqYmRldiwgc3RydWN0IHR0bV9tZW1fcmVnICptZW0sCiAJCQl2b2lkICoqdmlydHVhbCkKIHsKKwlzdHJ1Y3QgdHRtX21lbV90eXBlX21hbmFnZXIgKm1hbiA9ICZiZGV2LT5tYW5bbWVtLT5tZW1fdHlwZV07CiAJaW50IHJldDsKIAl2b2lkICphZGRyOwogCiAJKnZpcnR1YWwgPSBOVUxMOworCSh2b2lkKSB0dG1fbWVtX2lvX2xvY2sobWFuLCBmYWxzZSk7CiAJcmV0ID0gdHRtX21lbV9pb19yZXNlcnZlKGJkZXYsIG1lbSk7CisJdHRtX21lbV9pb191bmxvY2sobWFuKTsKIAlpZiAocmV0IHx8ICFtZW0tPmJ1cy5pc19pb21lbSkKIAkJcmV0dXJuIHJldDsKIApAQCAtMTE3LDcgKzIwMyw5IEBACiAJCWVsc2UKIAkJCWFkZHIgPSBpb3JlbWFwX25vY2FjaGUobWVtLT5idXMuYmFzZSArIG1lbS0+YnVzLm9mZnNldCwgbWVtLT5idXMuc2l6ZSk7CiAJCWlmICghYWRkcikgeworCQkJKHZvaWQpIHR0bV9tZW1faW9fbG9jayhtYW4sIGZhbHNlKTsKIAkJCXR0bV9tZW1faW9fZnJlZShiZGV2LCBtZW0pOworCQkJdHRtX21lbV9pb191bmxvY2sobWFuKTsKIAkJCXJldHVybiAtRU5PTUVNOwogCQl9CiAJfQpAQCAtMTM0LDcgKzIyMiw5IEBACiAKIAlpZiAodmlydHVhbCAmJiBtZW0tPmJ1cy5hZGRyID09IE5VTEwpCiAJCWlvdW5tYXAodmlydHVhbCk7CisJKHZvaWQpIHR0bV9tZW1faW9fbG9jayhtYW4sIGZhbHNlKTsKIAl0dG1fbWVtX2lvX2ZyZWUoYmRldiwgbWVtKTsKKwl0dG1fbWVtX2lvX3VubG9jayhtYW4pOwogfQogCiBzdGF0aWMgaW50IHR0bV9jb3B5X2lvX3BhZ2Uodm9pZCAqZHN0LCB2b2lkICpzcmMsIHVuc2lnbmVkIGxvbmcgcGFnZSkKQEAgLTIzMSw3ICszMjEsNyBAQAogCXN0cnVjdCB0dG1fbWVtX3R5cGVfbWFuYWdlciAqbWFuID0gJmJkZXYtPm1hbltuZXdfbWVtLT5tZW1fdHlwZV07CiAJc3RydWN0IHR0bV90dCAqdHRtID0gYm8tPnR0bTsKIAlzdHJ1Y3QgdHRtX21lbV9yZWcgKm9sZF9tZW0gPSAmYm8tPm1lbTsKLQlzdHJ1Y3QgdHRtX21lbV9yZWcgb2xkX2NvcHkgPSAqb2xkX21lbTsKKwlzdHJ1Y3QgdHRtX21lbV9yZWcgb2xkX2NvcHk7CiAJdm9pZCAqb2xkX2lvbWFwOwogCXZvaWQgKm5ld19pb21hcDsKIAlpbnQgcmV0OwpAQCAtMjgwLDggKzM3MCw3IEBACiAJfQogCW1iKCk7CiBvdXQyOgotCXR0bV9ib19mcmVlX29sZF9ub2RlKGJvKTsKLQorCW9sZF9jb3B5ID0gKm9sZF9tZW07CiAJKm9sZF9tZW0gPSAqbmV3X21lbTsKIAluZXdfbWVtLT5tbV9ub2RlID0gTlVMTDsKIApAQCAtMjkyLDkgKzM4MSwxMCBAQAogCX0KIAogb3V0MToKLQl0dG1fbWVtX3JlZ19pb3VubWFwKGJkZXYsIG5ld19tZW0sIG5ld19pb21hcCk7CisJdHRtX21lbV9yZWdfaW91bm1hcChiZGV2LCBvbGRfbWVtLCBuZXdfaW9tYXApOwogb3V0OgogCXR0bV9tZW1fcmVnX2lvdW5tYXAoYmRldiwgJm9sZF9jb3B5LCBvbGRfaW9tYXApOworCXR0bV9ib19tZW1fcHV0KGJvLCAmb2xkX2NvcHkpOwogCXJldHVybiByZXQ7CiB9CiBFWFBPUlRfU1lNQk9MKHR0bV9ib19tb3ZlX21lbWNweSk7CkBAIC0zMzcsMTEgKzQyNywxMSBAQAogCSAqIFRPRE86IEV4cGxpY2l0IG1lbWJlciBjb3B5IHdvdWxkIHByb2JhYmx5IGJlIGJldHRlciBoZXJlLgogCSAqLwogCi0Jc3Bpbl9sb2NrX2luaXQoJmZiby0+bG9jayk7CiAJaW5pdF93YWl0cXVldWVfaGVhZCgmZmJvLT5ldmVudF9xdWV1ZSk7CiAJSU5JVF9MSVNUX0hFQUQoJmZiby0+ZGRlc3Ryb3kpOwogCUlOSVRfTElTVF9IRUFEKCZmYm8tPmxydSk7CiAJSU5JVF9MSVNUX0hFQUQoJmZiby0+c3dhcCk7CisJSU5JVF9MSVNUX0hFQUQoJmZiby0+aW9fcmVzZXJ2ZV9scnUpOwogCWZiby0+dm1fbm9kZSA9IE5VTEw7CiAJYXRvbWljX3NldCgmZmJvLT5jcHVfd3JpdGVycywgMCk7CiAKQEAgLTQ1Myw2ICs1NDMsOCBAQAogCQl1bnNpZ25lZCBsb25nIHN0YXJ0X3BhZ2UsIHVuc2lnbmVkIGxvbmcgbnVtX3BhZ2VzLAogCQlzdHJ1Y3QgdHRtX2JvX2ttYXBfb2JqICptYXApCiB7CisJc3RydWN0IHR0bV9tZW1fdHlwZV9tYW5hZ2VyICptYW4gPQorCQkmYm8tPmJkZXYtPm1hbltiby0+bWVtLm1lbV90eXBlXTsKIAl1bnNpZ25lZCBsb25nIG9mZnNldCwgc2l6ZTsKIAlpbnQgcmV0OwogCkBAIC00NjcsNyArNTU5LDkgQEAKIAlpZiAobnVtX3BhZ2VzID4gMSAmJiAhRFJNX1NVU0VSKERSTV9DVVJQUk9DKSkKIAkJcmV0dXJuIC1FUEVSTTsKICNlbmRpZgorCSh2b2lkKSB0dG1fbWVtX2lvX2xvY2sobWFuLCBmYWxzZSk7CiAJcmV0ID0gdHRtX21lbV9pb19yZXNlcnZlKGJvLT5iZGV2LCAmYm8tPm1lbSk7CisJdHRtX21lbV9pb191bmxvY2sobWFuKTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCWlmICghYm8tPm1lbS5idXMuaXNfaW9tZW0pIHsKQEAgLTQ4MiwxMiArNTc2LDE1IEBACiAKIHZvaWQgdHRtX2JvX2t1bm1hcChzdHJ1Y3QgdHRtX2JvX2ttYXBfb2JqICptYXApCiB7CisJc3RydWN0IHR0bV9idWZmZXJfb2JqZWN0ICpibyA9IG1hcC0+Ym87CisJc3RydWN0IHR0bV9tZW1fdHlwZV9tYW5hZ2VyICptYW4gPQorCQkmYm8tPmJkZXYtPm1hbltiby0+bWVtLm1lbV90eXBlXTsKKwogCWlmICghbWFwLT52aXJ0dWFsKQogCQlyZXR1cm47CiAJc3dpdGNoIChtYXAtPmJvX2ttYXBfdHlwZSkgewogCWNhc2UgdHRtX2JvX21hcF9pb21hcDoKIAkJaW91bm1hcChtYXAtPnZpcnR1YWwpOwotCQl0dG1fbWVtX2lvX2ZyZWUobWFwLT5iby0+YmRldiwgJm1hcC0+Ym8tPm1lbSk7CiAJCWJyZWFrOwogCWNhc2UgdHRtX2JvX21hcF92bWFwOgogCQl2dW5tYXAobWFwLT52aXJ0dWFsKTsKQEAgLTUwMCw2ICs1OTcsOSBAQAogCWRlZmF1bHQ6CiAJCUJVRygpOwogCX0KKwkodm9pZCkgdHRtX21lbV9pb19sb2NrKG1hbiwgZmFsc2UpOworCXR0bV9tZW1faW9fZnJlZShtYXAtPmJvLT5iZGV2LCAmbWFwLT5iby0+bWVtKTsKKwl0dG1fbWVtX2lvX3VubG9jayhtYW4pOwogCW1hcC0+dmlydHVhbCA9IE5VTEw7CiAJbWFwLT5wYWdlID0gTlVMTDsKIH0KQEAgLTUyMCw3ICs2MjAsNyBAQAogCXN0cnVjdCB0dG1fYnVmZmVyX29iamVjdCAqZ2hvc3Rfb2JqOwogCXZvaWQgKnRtcF9vYmogPSBOVUxMOwogCi0Jc3Bpbl9sb2NrKCZiby0+bG9jayk7CisJc3Bpbl9sb2NrKCZiZGV2LT5mZW5jZV9sb2NrKTsKIAlpZiAoYm8tPnN5bmNfb2JqKSB7CiAJCXRtcF9vYmogPSBiby0+c3luY19vYmo7CiAJCWJvLT5zeW5jX29iaiA9IE5VTEw7CkBAIC01MjksNyArNjI5LDcgQEAKIAliby0+c3luY19vYmpfYXJnID0gc3luY19vYmpfYXJnOwogCWlmIChldmljdCkgewogCQlyZXQgPSB0dG1fYm9fd2FpdChibywgZmFsc2UsIGZhbHNlLCBmYWxzZSk7Ci0JCXNwaW5fdW5sb2NrKCZiby0+bG9jayk7CisJCXNwaW5fdW5sb2NrKCZiZGV2LT5mZW5jZV9sb2NrKTsKIAkJaWYgKHRtcF9vYmopCiAJCQlkcml2ZXItPnN5bmNfb2JqX3VucmVmKCZ0bXBfb2JqKTsKIAkJaWYgKHJldCkKQEAgLTU1Miw3ICs2NTIsNyBAQAogCQkgKi8KIAogCQlzZXRfYml0KFRUTV9CT19QUklWX0ZMQUdfTU9WSU5HLCAmYm8tPnByaXZfZmxhZ3MpOwotCQlzcGluX3VubG9jaygmYm8tPmxvY2spOworCQlzcGluX3VubG9jaygmYmRldi0+ZmVuY2VfbG9jayk7CiAJCWlmICh0bXBfb2JqKQogCQkJZHJpdmVyLT5zeW5jX29ial91bnJlZigmdG1wX29iaik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS90dG0vdHRtX2JvX3ZtLmMgYi9kcml2ZXJzL2dwdS9kcm0vdHRtL3R0bV9ib192bS5jCmluZGV4IGZlNmNiNzcuLjIyMWI5MjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS90dG0vdHRtX2JvX3ZtLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3R0bS90dG1fYm9fdm0uYwpAQCAtODMsNiArODMsOCBAQAogCWludCBpOwogCXVuc2lnbmVkIGxvbmcgYWRkcmVzcyA9ICh1bnNpZ25lZCBsb25nKXZtZi0+dmlydHVhbF9hZGRyZXNzOwogCWludCByZXR2YWwgPSBWTV9GQVVMVF9OT1BBR0U7CisJc3RydWN0IHR0bV9tZW1fdHlwZV9tYW5hZ2VyICptYW4gPQorCQkmYmRldi0+bWFuW2JvLT5tZW0ubWVtX3R5cGVdOwogCiAJLyoKIAkgKiBXb3JrIGFyb3VuZCBsb2NraW5nIG9yZGVyIHJldmVyc2FsIGluIGZhdWx0IC8gbm9wZm4KQEAgLTExOCwyNCArMTIwLDI4IEBACiAJICogbW92ZS4KIAkgKi8KIAotCXNwaW5fbG9jaygmYm8tPmxvY2spOworCXNwaW5fbG9jaygmYmRldi0+ZmVuY2VfbG9jayk7CiAJaWYgKHRlc3RfYml0KFRUTV9CT19QUklWX0ZMQUdfTU9WSU5HLCAmYm8tPnByaXZfZmxhZ3MpKSB7CiAJCXJldCA9IHR0bV9ib193YWl0KGJvLCBmYWxzZSwgdHJ1ZSwgZmFsc2UpOwotCQlzcGluX3VubG9jaygmYm8tPmxvY2spOworCQlzcGluX3VubG9jaygmYmRldi0+ZmVuY2VfbG9jayk7CiAJCWlmICh1bmxpa2VseShyZXQgIT0gMCkpIHsKIAkJCXJldHZhbCA9IChyZXQgIT0gLUVSRVNUQVJUU1lTKSA/CiAJCQkgICAgVk1fRkFVTFRfU0lHQlVTIDogVk1fRkFVTFRfTk9QQUdFOwogCQkJZ290byBvdXRfdW5sb2NrOwogCQl9CiAJfSBlbHNlCi0JCXNwaW5fdW5sb2NrKCZiby0+bG9jayk7CisJCXNwaW5fdW5sb2NrKCZiZGV2LT5mZW5jZV9sb2NrKTsKIAotCi0JcmV0ID0gdHRtX21lbV9pb19yZXNlcnZlKGJkZXYsICZiby0+bWVtKTsKLQlpZiAocmV0KSB7Ci0JCXJldHZhbCA9IFZNX0ZBVUxUX1NJR0JVUzsKKwlyZXQgPSB0dG1fbWVtX2lvX2xvY2sobWFuLCB0cnVlKTsKKwlpZiAodW5saWtlbHkocmV0ICE9IDApKSB7CisJCXJldHZhbCA9IFZNX0ZBVUxUX05PUEFHRTsKIAkJZ290byBvdXRfdW5sb2NrOwogCX0KKwlyZXQgPSB0dG1fbWVtX2lvX3Jlc2VydmVfdm0oYm8pOworCWlmICh1bmxpa2VseShyZXQgIT0gMCkpIHsKKwkJcmV0dmFsID0gVk1fRkFVTFRfU0lHQlVTOworCQlnb3RvIG91dF9pb191bmxvY2s7CisJfQogCiAJcGFnZV9vZmZzZXQgPSAoKGFkZHJlc3MgLSB2bWEtPnZtX3N0YXJ0KSA+PiBQQUdFX1NISUZUKSArCiAJICAgIGJvLT52bV9ub2RlLT5zdGFydCAtIHZtYS0+dm1fcGdvZmY7CkBAIC0xNDQsNyArMTUwLDcgQEAKIAogCWlmICh1bmxpa2VseShwYWdlX29mZnNldCA+PSBiby0+bnVtX3BhZ2VzKSkgewogCQlyZXR2YWwgPSBWTV9GQVVMVF9TSUdCVVM7Ci0JCWdvdG8gb3V0X3VubG9jazsKKwkJZ290byBvdXRfaW9fdW5sb2NrOwogCX0KIAogCS8qCkBAIC0xODIsNyArMTg4LDcgQEAKIAkJCXBhZ2UgPSB0dG1fdHRfZ2V0X3BhZ2UodHRtLCBwYWdlX29mZnNldCk7CiAJCQlpZiAodW5saWtlbHkoIXBhZ2UgJiYgaSA9PSAwKSkgewogCQkJCXJldHZhbCA9IFZNX0ZBVUxUX09PTTsKLQkJCQlnb3RvIG91dF91bmxvY2s7CisJCQkJZ290byBvdXRfaW9fdW5sb2NrOwogCQkJfSBlbHNlIGlmICh1bmxpa2VseSghcGFnZSkpIHsKIAkJCQlicmVhazsKIAkJCX0KQEAgLTIwMCwxNCArMjA2LDE1IEBACiAJCWVsc2UgaWYgKHVubGlrZWx5KHJldCAhPSAwKSkgewogCQkJcmV0dmFsID0KIAkJCSAgICAocmV0ID09IC1FTk9NRU0pID8gVk1fRkFVTFRfT09NIDogVk1fRkFVTFRfU0lHQlVTOwotCQkJZ290byBvdXRfdW5sb2NrOworCQkJZ290byBvdXRfaW9fdW5sb2NrOwogCQl9CiAKIAkJYWRkcmVzcyArPSBQQUdFX1NJWkU7CiAJCWlmICh1bmxpa2VseSgrK3BhZ2Vfb2Zmc2V0ID49IHBhZ2VfbGFzdCkpCiAJCQlicmVhazsKIAl9Ci0KK291dF9pb191bmxvY2s6CisJdHRtX21lbV9pb191bmxvY2sobWFuKTsKIG91dF91bmxvY2s6CiAJdHRtX2JvX3VucmVzZXJ2ZShibyk7CiAJcmV0dXJuIHJldHZhbDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS90dG0vdHRtX2V4ZWNidWZfdXRpbC5jIGIvZHJpdmVycy9ncHUvZHJtL3R0bS90dG1fZXhlY2J1Zl91dGlsLmMKaW5kZXggYzI4NWMyOS4uMzgzMmZlMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3R0bS90dG1fZXhlY2J1Zl91dGlsLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3R0bS90dG1fZXhlY2J1Zl91dGlsLmMKQEAgLTMyLDcgKzMyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCi12b2lkIHR0bV9ldV9iYWNrb2ZmX3Jlc2VydmF0aW9uKHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QpCitzdGF0aWMgdm9pZCB0dG1fZXVfYmFja29mZl9yZXNlcnZhdGlvbl9sb2NrZWQoc3RydWN0IGxpc3RfaGVhZCAqbGlzdCkKIHsKIAlzdHJ1Y3QgdHRtX3ZhbGlkYXRlX2J1ZmZlciAqZW50cnk7CiAKQEAgLTQxLDEwICs0MSw3NyBAQAogCQlpZiAoIWVudHJ5LT5yZXNlcnZlZCkKIAkJCWNvbnRpbnVlOwogCisJCWlmIChlbnRyeS0+cmVtb3ZlZCkgeworCQkJdHRtX2JvX2FkZF90b19scnUoYm8pOworCQkJZW50cnktPnJlbW92ZWQgPSBmYWxzZTsKKworCQl9CiAJCWVudHJ5LT5yZXNlcnZlZCA9IGZhbHNlOwotCQl0dG1fYm9fdW5yZXNlcnZlKGJvKTsKKwkJYXRvbWljX3NldCgmYm8tPnJlc2VydmVkLCAwKTsKKwkJd2FrZV91cF9hbGwoJmJvLT5ldmVudF9xdWV1ZSk7CiAJfQogfQorCitzdGF0aWMgdm9pZCB0dG1fZXVfZGVsX2Zyb21fbHJ1X2xvY2tlZChzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0KQoreworCXN0cnVjdCB0dG1fdmFsaWRhdGVfYnVmZmVyICplbnRyeTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoZW50cnksIGxpc3QsIGhlYWQpIHsKKwkJc3RydWN0IHR0bV9idWZmZXJfb2JqZWN0ICpibyA9IGVudHJ5LT5ibzsKKwkJaWYgKCFlbnRyeS0+cmVzZXJ2ZWQpCisJCQljb250aW51ZTsKKworCQlpZiAoIWVudHJ5LT5yZW1vdmVkKSB7CisJCQllbnRyeS0+cHV0X2NvdW50ID0gdHRtX2JvX2RlbF9mcm9tX2xydShibyk7CisJCQllbnRyeS0+cmVtb3ZlZCA9IHRydWU7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIHR0bV9ldV9saXN0X3JlZl9zdWIoc3RydWN0IGxpc3RfaGVhZCAqbGlzdCkKK3sKKwlzdHJ1Y3QgdHRtX3ZhbGlkYXRlX2J1ZmZlciAqZW50cnk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGVudHJ5LCBsaXN0LCBoZWFkKSB7CisJCXN0cnVjdCB0dG1fYnVmZmVyX29iamVjdCAqYm8gPSBlbnRyeS0+Ym87CisKKwkJaWYgKGVudHJ5LT5wdXRfY291bnQpIHsKKwkJCXR0bV9ib19saXN0X3JlZl9zdWIoYm8sIGVudHJ5LT5wdXRfY291bnQsIHRydWUpOworCQkJZW50cnktPnB1dF9jb3VudCA9IDA7CisJCX0KKwl9Cit9CisKK3N0YXRpYyBpbnQgdHRtX2V1X3dhaXRfdW5yZXNlcnZlZF9sb2NrZWQoc3RydWN0IGxpc3RfaGVhZCAqbGlzdCwKKwkJCQkJIHN0cnVjdCB0dG1fYnVmZmVyX29iamVjdCAqYm8pCit7CisJc3RydWN0IHR0bV9ib19nbG9iYWwgKmdsb2IgPSBiby0+Z2xvYjsKKwlpbnQgcmV0OworCisJdHRtX2V1X2RlbF9mcm9tX2xydV9sb2NrZWQobGlzdCk7CisJc3Bpbl91bmxvY2soJmdsb2ItPmxydV9sb2NrKTsKKwlyZXQgPSB0dG1fYm9fd2FpdF91bnJlc2VydmVkKGJvLCB0cnVlKTsKKwlzcGluX2xvY2soJmdsb2ItPmxydV9sb2NrKTsKKwlpZiAodW5saWtlbHkocmV0ICE9IDApKQorCQl0dG1fZXVfYmFja29mZl9yZXNlcnZhdGlvbl9sb2NrZWQobGlzdCk7CisJcmV0dXJuIHJldDsKK30KKworCit2b2lkIHR0bV9ldV9iYWNrb2ZmX3Jlc2VydmF0aW9uKHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QpCit7CisJc3RydWN0IHR0bV92YWxpZGF0ZV9idWZmZXIgKmVudHJ5OworCXN0cnVjdCB0dG1fYm9fZ2xvYmFsICpnbG9iOworCisJaWYgKGxpc3RfZW1wdHkobGlzdCkpCisJCXJldHVybjsKKworCWVudHJ5ID0gbGlzdF9maXJzdF9lbnRyeShsaXN0LCBzdHJ1Y3QgdHRtX3ZhbGlkYXRlX2J1ZmZlciwgaGVhZCk7CisJZ2xvYiA9IGVudHJ5LT5iby0+Z2xvYjsKKwlzcGluX2xvY2soJmdsb2ItPmxydV9sb2NrKTsKKwl0dG1fZXVfYmFja29mZl9yZXNlcnZhdGlvbl9sb2NrZWQobGlzdCk7CisJc3Bpbl91bmxvY2soJmdsb2ItPmxydV9sb2NrKTsKK30KIEVYUE9SVF9TWU1CT0wodHRtX2V1X2JhY2tvZmZfcmVzZXJ2YXRpb24pOwogCiAvKgpAQCAtNTksMzcgKzEyNiw3NiBAQAogICogYnVmZmVycyBpbiBkaWZmZXJlbnQgb3JkZXJzLgogICovCiAKLWludCB0dG1fZXVfcmVzZXJ2ZV9idWZmZXJzKHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsIHVpbnQzMl90IHZhbF9zZXEpCitpbnQgdHRtX2V1X3Jlc2VydmVfYnVmZmVycyhzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0KQogeworCXN0cnVjdCB0dG1fYm9fZ2xvYmFsICpnbG9iOwogCXN0cnVjdCB0dG1fdmFsaWRhdGVfYnVmZmVyICplbnRyeTsKIAlpbnQgcmV0OworCXVpbnQzMl90IHZhbF9zZXE7CisKKwlpZiAobGlzdF9lbXB0eShsaXN0KSkKKwkJcmV0dXJuIDA7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGVudHJ5LCBsaXN0LCBoZWFkKSB7CisJCWVudHJ5LT5yZXNlcnZlZCA9IGZhbHNlOworCQllbnRyeS0+cHV0X2NvdW50ID0gMDsKKwkJZW50cnktPnJlbW92ZWQgPSBmYWxzZTsKKwl9CisKKwllbnRyeSA9IGxpc3RfZmlyc3RfZW50cnkobGlzdCwgc3RydWN0IHR0bV92YWxpZGF0ZV9idWZmZXIsIGhlYWQpOworCWdsb2IgPSBlbnRyeS0+Ym8tPmdsb2I7CiAKIHJldHJ5OgorCXNwaW5fbG9jaygmZ2xvYi0+bHJ1X2xvY2spOworCXZhbF9zZXEgPSBlbnRyeS0+Ym8tPmJkZXYtPnZhbF9zZXErKzsKKwogCWxpc3RfZm9yX2VhY2hfZW50cnkoZW50cnksIGxpc3QsIGhlYWQpIHsKIAkJc3RydWN0IHR0bV9idWZmZXJfb2JqZWN0ICpibyA9IGVudHJ5LT5ibzsKIAotCQllbnRyeS0+cmVzZXJ2ZWQgPSBmYWxzZTsKLQkJcmV0ID0gdHRtX2JvX3Jlc2VydmUoYm8sIHRydWUsIGZhbHNlLCB0cnVlLCB2YWxfc2VxKTsKLQkJaWYgKHJldCAhPSAwKSB7Ci0JCQl0dG1fZXVfYmFja29mZl9yZXNlcnZhdGlvbihsaXN0KTsKLQkJCWlmIChyZXQgPT0gLUVBR0FJTikgewotCQkJCXJldCA9IHR0bV9ib193YWl0X3VucmVzZXJ2ZWQoYm8sIHRydWUpOwotCQkJCWlmICh1bmxpa2VseShyZXQgIT0gMCkpCi0JCQkJCXJldHVybiByZXQ7Ci0JCQkJZ290byByZXRyeTsKLQkJCX0gZWxzZQorcmV0cnlfdGhpc19ibzoKKwkJcmV0ID0gdHRtX2JvX3Jlc2VydmVfbG9ja2VkKGJvLCB0cnVlLCB0cnVlLCB0cnVlLCB2YWxfc2VxKTsKKwkJc3dpdGNoIChyZXQpIHsKKwkJY2FzZSAwOgorCQkJYnJlYWs7CisJCWNhc2UgLUVCVVNZOgorCQkJcmV0ID0gdHRtX2V1X3dhaXRfdW5yZXNlcnZlZF9sb2NrZWQobGlzdCwgYm8pOworCQkJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkgeworCQkJCXNwaW5fdW5sb2NrKCZnbG9iLT5scnVfbG9jayk7CisJCQkJdHRtX2V1X2xpc3RfcmVmX3N1YihsaXN0KTsKIAkJCQlyZXR1cm4gcmV0OworCQkJfQorCQkJZ290byByZXRyeV90aGlzX2JvOworCQljYXNlIC1FQUdBSU46CisJCQl0dG1fZXVfYmFja29mZl9yZXNlcnZhdGlvbl9sb2NrZWQobGlzdCk7CisJCQlzcGluX3VubG9jaygmZ2xvYi0+bHJ1X2xvY2spOworCQkJdHRtX2V1X2xpc3RfcmVmX3N1YihsaXN0KTsKKwkJCXJldCA9IHR0bV9ib193YWl0X3VucmVzZXJ2ZWQoYm8sIHRydWUpOworCQkJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkKKwkJCQlyZXR1cm4gcmV0OworCQkJZ290byByZXRyeTsKKwkJZGVmYXVsdDoKKwkJCXR0bV9ldV9iYWNrb2ZmX3Jlc2VydmF0aW9uX2xvY2tlZChsaXN0KTsKKwkJCXNwaW5fdW5sb2NrKCZnbG9iLT5scnVfbG9jayk7CisJCQl0dG1fZXVfbGlzdF9yZWZfc3ViKGxpc3QpOworCQkJcmV0dXJuIHJldDsKIAkJfQogCiAJCWVudHJ5LT5yZXNlcnZlZCA9IHRydWU7CiAJCWlmICh1bmxpa2VseShhdG9taWNfcmVhZCgmYm8tPmNwdV93cml0ZXJzKSA+IDApKSB7Ci0JCQl0dG1fZXVfYmFja29mZl9yZXNlcnZhdGlvbihsaXN0KTsKKwkJCXR0bV9ldV9iYWNrb2ZmX3Jlc2VydmF0aW9uX2xvY2tlZChsaXN0KTsKKwkJCXNwaW5fdW5sb2NrKCZnbG9iLT5scnVfbG9jayk7CisJCQl0dG1fZXVfbGlzdF9yZWZfc3ViKGxpc3QpOwogCQkJcmV0ID0gdHRtX2JvX3dhaXRfY3B1KGJvLCBmYWxzZSk7CiAJCQlpZiAocmV0KQogCQkJCXJldHVybiByZXQ7CiAJCQlnb3RvIHJldHJ5OwogCQl9CiAJfQorCisJdHRtX2V1X2RlbF9mcm9tX2xydV9sb2NrZWQobGlzdCk7CisJc3Bpbl91bmxvY2soJmdsb2ItPmxydV9sb2NrKTsKKwl0dG1fZXVfbGlzdF9yZWZfc3ViKGxpc3QpOworCiAJcmV0dXJuIDA7CiB9CiBFWFBPUlRfU1lNQk9MKHR0bV9ldV9yZXNlcnZlX2J1ZmZlcnMpOwpAQCAtOTcsMjEgKzIwMywzNiBAQAogdm9pZCB0dG1fZXVfZmVuY2VfYnVmZmVyX29iamVjdHMoc3RydWN0IGxpc3RfaGVhZCAqbGlzdCwgdm9pZCAqc3luY19vYmopCiB7CiAJc3RydWN0IHR0bV92YWxpZGF0ZV9idWZmZXIgKmVudHJ5OworCXN0cnVjdCB0dG1fYnVmZmVyX29iamVjdCAqYm87CisJc3RydWN0IHR0bV9ib19nbG9iYWwgKmdsb2I7CisJc3RydWN0IHR0bV9ib19kZXZpY2UgKmJkZXY7CisJc3RydWN0IHR0bV9ib19kcml2ZXIgKmRyaXZlcjsKKworCWlmIChsaXN0X2VtcHR5KGxpc3QpKQorCQlyZXR1cm47CisKKwlibyA9IGxpc3RfZmlyc3RfZW50cnkobGlzdCwgc3RydWN0IHR0bV92YWxpZGF0ZV9idWZmZXIsIGhlYWQpLT5ibzsKKwliZGV2ID0gYm8tPmJkZXY7CisJZHJpdmVyID0gYmRldi0+ZHJpdmVyOworCWdsb2IgPSBiby0+Z2xvYjsKKworCXNwaW5fbG9jaygmYmRldi0+ZmVuY2VfbG9jayk7CisJc3Bpbl9sb2NrKCZnbG9iLT5scnVfbG9jayk7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGVudHJ5LCBsaXN0LCBoZWFkKSB7Ci0JCXN0cnVjdCB0dG1fYnVmZmVyX29iamVjdCAqYm8gPSBlbnRyeS0+Ym87Ci0JCXN0cnVjdCB0dG1fYm9fZHJpdmVyICpkcml2ZXIgPSBiby0+YmRldi0+ZHJpdmVyOwotCQl2b2lkICpvbGRfc3luY19vYmo7Ci0KLQkJc3Bpbl9sb2NrKCZiby0+bG9jayk7Ci0JCW9sZF9zeW5jX29iaiA9IGJvLT5zeW5jX29iajsKKwkJYm8gPSBlbnRyeS0+Ym87CisJCWVudHJ5LT5vbGRfc3luY19vYmogPSBiby0+c3luY19vYmo7CiAJCWJvLT5zeW5jX29iaiA9IGRyaXZlci0+c3luY19vYmpfcmVmKHN5bmNfb2JqKTsKIAkJYm8tPnN5bmNfb2JqX2FyZyA9IGVudHJ5LT5uZXdfc3luY19vYmpfYXJnOwotCQlzcGluX3VubG9jaygmYm8tPmxvY2spOwotCQl0dG1fYm9fdW5yZXNlcnZlKGJvKTsKKwkJdHRtX2JvX3VucmVzZXJ2ZV9sb2NrZWQoYm8pOwogCQllbnRyeS0+cmVzZXJ2ZWQgPSBmYWxzZTsKLQkJaWYgKG9sZF9zeW5jX29iaikKLQkJCWRyaXZlci0+c3luY19vYmpfdW5yZWYoJm9sZF9zeW5jX29iaik7CisJfQorCXNwaW5fdW5sb2NrKCZnbG9iLT5scnVfbG9jayk7CisJc3Bpbl91bmxvY2soJmJkZXYtPmZlbmNlX2xvY2spOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShlbnRyeSwgbGlzdCwgaGVhZCkgeworCQlpZiAoZW50cnktPm9sZF9zeW5jX29iaikKKwkJCWRyaXZlci0+c3luY19vYmpfdW5yZWYoJmVudHJ5LT5vbGRfc3luY19vYmopOwogCX0KIH0KIEVYUE9SVF9TWU1CT0wodHRtX2V1X2ZlbmNlX2J1ZmZlcl9vYmplY3RzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS92bXdnZngvdm13Z2Z4X2Rydi5oIGIvZHJpdmVycy9ncHUvZHJtL3Ztd2dmeC92bXdnZnhfZHJ2LmgKaW5kZXggZTdhNThkMC4uMTBmYzAxZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3Ztd2dmeC92bXdnZnhfZHJ2LmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL3Ztd2dmeC92bXdnZnhfZHJ2LmgKQEAgLTI2NCw3ICsyNjQsNiBAQAogCSAqLwogCiAJc3RydWN0IHZtd19zd19jb250ZXh0IGN0eDsKLQl1aW50MzJfdCB2YWxfc2VxOwogCXN0cnVjdCBtdXRleCBjbWRidWZfbXV0ZXg7CiAKIAkvKioKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS92bXdnZngvdm13Z2Z4X2V4ZWNidWYuYyBiL2RyaXZlcnMvZ3B1L2RybS92bXdnZngvdm13Z2Z4X2V4ZWNidWYuYwppbmRleCA3Njk1NGUzLi40MWI5NWVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vdm13Z2Z4L3Ztd2dmeF9leGVjYnVmLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3Ztd2dmeC92bXdnZnhfZXhlY2J1Zi5jCkBAIC02NTMsOCArNjUzLDcgQEAKIAlyZXQgPSB2bXdfY21kX2NoZWNrX2FsbChkZXZfcHJpdiwgc3dfY29udGV4dCwgY21kLCBhcmctPmNvbW1hbmRfc2l6ZSk7CiAJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkKIAkJZ290byBvdXRfZXJyOwotCXJldCA9IHR0bV9ldV9yZXNlcnZlX2J1ZmZlcnMoJnN3X2NvbnRleHQtPnZhbGlkYXRlX25vZGVzLAotCQkJCSAgICAgZGV2X3ByaXYtPnZhbF9zZXErKyk7CisJcmV0ID0gdHRtX2V1X3Jlc2VydmVfYnVmZmVycygmc3dfY29udGV4dC0+dmFsaWRhdGVfbm9kZXMpOwogCWlmICh1bmxpa2VseShyZXQgIT0gMCkpCiAJCWdvdG8gb3V0X2VycjsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3Ztd2dmeC92bXdnZnhfZmIuYyBiL2RyaXZlcnMvZ3B1L2RybS92bXdnZngvdm13Z2Z4X2ZiLmMKaW5kZXggZmUwOTZhNy4uYmZhYjYwYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3Ztd2dmeC92bXdnZnhfZmIuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vdm13Z2Z4L3Ztd2dmeF9mYi5jCkBAIC00ODAsOSArNDgwLDYgQEAKIAlpbmZvLT5maXguc21lbV9zdGFydCA9IDA7CiAJaW5mby0+Zml4LnNtZW1fbGVuID0gZmJfc2l6ZTsKIAotCWluZm8tPmZpeC5tbWlvX3N0YXJ0ID0gMDsKLQlpbmZvLT5maXgubW1pb19sZW4gPSAwOwotCiAJaW5mby0+cHNldWRvX3BhbGV0dGUgPSBwYXItPnBzZXVkb19wYWxldHRlOwogCWluZm8tPnNjcmVlbl9iYXNlID0gcGFyLT52bWFsbG9jOwogCWluZm8tPnNjcmVlbl9zaXplID0gZmJfc2l6ZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L3ZnYS92Z2Ffc3dpdGNoZXJvby5jIGIvZHJpdmVycy9ncHUvdmdhL3ZnYV9zd2l0Y2hlcm9vLmMKaW5kZXggYzg3NjhmMy4uZTAxY2FjYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvdmdhL3ZnYV9zd2l0Y2hlcm9vLmMKKysrIGIvZHJpdmVycy9ncHUvdmdhL3ZnYV9zd2l0Y2hlcm9vLmMKQEAgLTMzLDYgKzMzLDcgQEAKIAlzdHJ1Y3QgZmJfaW5mbyAqZmJfaW5mbzsKIAlpbnQgcHdyX3N0YXRlOwogCXZvaWQgKCpzZXRfZ3B1X3N0YXRlKShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgZW51bSB2Z2Ffc3dpdGNoZXJvb19zdGF0ZSk7CisJdm9pZCAoKnJlcHJvYmUpKHN0cnVjdCBwY2lfZGV2ICpwZGV2KTsKIAlib29sICgqY2FuX3N3aXRjaCkoc3RydWN0IHBjaV9kZXYgKnBkZXYpOwogCWludCBpZDsKIAlib29sIGFjdGl2ZTsKQEAgLTEwMyw2ICsxMDQsNyBAQAogCiBpbnQgdmdhX3N3aXRjaGVyb29fcmVnaXN0ZXJfY2xpZW50KHN0cnVjdCBwY2lfZGV2ICpwZGV2LAogCQkJCSAgIHZvaWQgKCpzZXRfZ3B1X3N0YXRlKShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgZW51bSB2Z2Ffc3dpdGNoZXJvb19zdGF0ZSksCisJCQkJICAgdm9pZCAoKnJlcHJvYmUpKHN0cnVjdCBwY2lfZGV2ICpwZGV2KSwKIAkJCQkgICBib29sICgqY2FuX3N3aXRjaCkoc3RydWN0IHBjaV9kZXYgKnBkZXYpKQogewogCWludCBpbmRleDsKQEAgLTExNyw2ICsxMTksNyBAQAogCXZnYXNyX3ByaXYuY2xpZW50c1tpbmRleF0ucHdyX3N0YXRlID0gVkdBX1NXSVRDSEVST09fT047CiAJdmdhc3JfcHJpdi5jbGllbnRzW2luZGV4XS5wZGV2ID0gcGRldjsKIAl2Z2Fzcl9wcml2LmNsaWVudHNbaW5kZXhdLnNldF9ncHVfc3RhdGUgPSBzZXRfZ3B1X3N0YXRlOworCXZnYXNyX3ByaXYuY2xpZW50c1tpbmRleF0ucmVwcm9iZSA9IHJlcHJvYmU7CiAJdmdhc3JfcHJpdi5jbGllbnRzW2luZGV4XS5jYW5fc3dpdGNoID0gY2FuX3N3aXRjaDsKIAl2Z2Fzcl9wcml2LmNsaWVudHNbaW5kZXhdLmlkID0gLTE7CiAJaWYgKHBkZXYtPnJlc291cmNlW1BDSV9ST01fUkVTT1VSQ0VdLmZsYWdzICYgSU9SRVNPVVJDRV9ST01fU0hBRE9XKQpAQCAtMTc0LDcgKzE3Nyw4IEBACiAJaW50IGk7CiAJbXV0ZXhfbG9jaygmdmdhc3JfbXV0ZXgpOwogCWZvciAoaSA9IDA7IGkgPCBWR0FfU1dJVENIRVJPT19NQVhfQ0xJRU5UUzsgaSsrKSB7Ci0JCXNlcV9wcmludGYobSwgIiVkOiVjOiVzOiVzXG4iLCBpLAorCQlzZXFfcHJpbnRmKG0sICIlZDolczolYzolczolc1xuIiwgaSwKKwkJCSAgIHZnYXNyX3ByaXYuY2xpZW50c1tpXS5pZCA9PSBWR0FfU1dJVENIRVJPT19ESVMgPyAiRElTIiA6ICJJR0QiLAogCQkJICAgdmdhc3JfcHJpdi5jbGllbnRzW2ldLmFjdGl2ZSA/ICcrJyA6ICcgJywKIAkJCSAgIHZnYXNyX3ByaXYuY2xpZW50c1tpXS5wd3Jfc3RhdGUgPyAiUHdyIiA6ICJPZmYiLAogCQkJICAgcGNpX25hbWUodmdhc3JfcHJpdi5jbGllbnRzW2ldLnBkZXYpKTsKQEAgLTE5MCw5ICsxOTQsOCBAQAogCiBzdGF0aWMgaW50IHZnYV9zd2l0Y2hvbihzdHJ1Y3QgdmdhX3N3aXRjaGVyb29fY2xpZW50ICpjbGllbnQpCiB7Ci0JaW50IHJldDsKLQotCXJldCA9IHZnYXNyX3ByaXYuaGFuZGxlci0+cG93ZXJfc3RhdGUoY2xpZW50LT5pZCwgVkdBX1NXSVRDSEVST09fT04pOworCWlmICh2Z2Fzcl9wcml2LmhhbmRsZXItPnBvd2VyX3N0YXRlKQorCQl2Z2Fzcl9wcml2LmhhbmRsZXItPnBvd2VyX3N0YXRlKGNsaWVudC0+aWQsIFZHQV9TV0lUQ0hFUk9PX09OKTsKIAkvKiBjYWxsIHRoZSBkcml2ZXIgY2FsbGJhY2sgdG8gdHVybiBvbiBkZXZpY2UgKi8KIAljbGllbnQtPnNldF9ncHVfc3RhdGUoY2xpZW50LT5wZGV2LCBWR0FfU1dJVENIRVJPT19PTik7CiAJY2xpZW50LT5wd3Jfc3RhdGUgPSBWR0FfU1dJVENIRVJPT19PTjsKQEAgLTIwMywxMiArMjA2LDE0IEBACiB7CiAJLyogY2FsbCB0aGUgZHJpdmVyIGNhbGxiYWNrIHRvIHR1cm4gb2ZmIGRldmljZSAqLwogCWNsaWVudC0+c2V0X2dwdV9zdGF0ZShjbGllbnQtPnBkZXYsIFZHQV9TV0lUQ0hFUk9PX09GRik7Ci0Jdmdhc3JfcHJpdi5oYW5kbGVyLT5wb3dlcl9zdGF0ZShjbGllbnQtPmlkLCBWR0FfU1dJVENIRVJPT19PRkYpOworCWlmICh2Z2Fzcl9wcml2LmhhbmRsZXItPnBvd2VyX3N0YXRlKQorCQl2Z2Fzcl9wcml2LmhhbmRsZXItPnBvd2VyX3N0YXRlKGNsaWVudC0+aWQsIFZHQV9TV0lUQ0hFUk9PX09GRik7CiAJY2xpZW50LT5wd3Jfc3RhdGUgPSBWR0FfU1dJVENIRVJPT19PRkY7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgdmdhX3N3aXRjaHRvKHN0cnVjdCB2Z2Ffc3dpdGNoZXJvb19jbGllbnQgKm5ld19jbGllbnQpCisvKiBzdGFnZSBvbmUgaGFwcGVucyBiZWZvcmUgZGVsYXkgKi8KK3N0YXRpYyBpbnQgdmdhX3N3aXRjaHRvX3N0YWdlMShzdHJ1Y3QgdmdhX3N3aXRjaGVyb29fY2xpZW50ICpuZXdfY2xpZW50KQogewogCWludCByZXQ7CiAJaW50IGk7CkBAIC0yMzUsMTAgKzI0MCwyOCBAQAogCQl2Z2Ffc3dpdGNob24obmV3X2NsaWVudCk7CiAKIAkvKiBzd2FwIHNoYWRvdyByZXNvdXJjZSB0byBkZW5vdGUgYm9vdCBWR0EgZGV2aWNlIGhhcyBjaGFuZ2VkIHNvIFggc3RhcnRzIG9uIG5ldyBkZXZpY2UgKi8KLQlhY3RpdmUtPmFjdGl2ZSA9IGZhbHNlOwotCiAJYWN0aXZlLT5wZGV2LT5yZXNvdXJjZVtQQ0lfUk9NX1JFU09VUkNFXS5mbGFncyAmPSB+SU9SRVNPVVJDRV9ST01fU0hBRE9XOwogCW5ld19jbGllbnQtPnBkZXYtPnJlc291cmNlW1BDSV9ST01fUkVTT1VSQ0VdLmZsYWdzIHw9IElPUkVTT1VSQ0VfUk9NX1NIQURPVzsKKwlyZXR1cm4gMDsKK30KKworLyogcG9zdCBkZWxheSAqLworc3RhdGljIGludCB2Z2Ffc3dpdGNodG9fc3RhZ2UyKHN0cnVjdCB2Z2Ffc3dpdGNoZXJvb19jbGllbnQgKm5ld19jbGllbnQpCit7CisJaW50IHJldDsKKwlpbnQgaTsKKwlzdHJ1Y3QgdmdhX3N3aXRjaGVyb29fY2xpZW50ICphY3RpdmUgPSBOVUxMOworCisJZm9yIChpID0gMDsgaSA8IFZHQV9TV0lUQ0hFUk9PX01BWF9DTElFTlRTOyBpKyspIHsKKwkJaWYgKHZnYXNyX3ByaXYuY2xpZW50c1tpXS5hY3RpdmUgPT0gdHJ1ZSkgeworCQkJYWN0aXZlID0gJnZnYXNyX3ByaXYuY2xpZW50c1tpXTsKKwkJCWJyZWFrOworCQl9CisJfQorCWlmICghYWN0aXZlKQorCQlyZXR1cm4gMDsKKworCWFjdGl2ZS0+YWN0aXZlID0gZmFsc2U7CiAKIAlpZiAobmV3X2NsaWVudC0+ZmJfaW5mbykgewogCQlzdHJ1Y3QgZmJfZXZlbnQgZXZlbnQ7CkBAIC0yNTAsNiArMjczLDkgQEAKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCisJaWYgKG5ld19jbGllbnQtPnJlcHJvYmUpCisJCW5ld19jbGllbnQtPnJlcHJvYmUobmV3X2NsaWVudC0+cGRldik7CisKIAlpZiAoYWN0aXZlLT5wd3Jfc3RhdGUgPT0gVkdBX1NXSVRDSEVST09fT04pCiAJCXZnYV9zd2l0Y2hvZmYoYWN0aXZlKTsKIApAQCAtMjY1LDYgKzI5MSw3IEBACiAJY29uc3QgY2hhciAqcGRldl9uYW1lOwogCWludCBpLCByZXQ7CiAJYm9vbCBkZWxheSA9IGZhbHNlLCBjYW5fc3dpdGNoOworCWJvb2wganVzdF9tdXggPSBmYWxzZTsKIAlpbnQgY2xpZW50X2lkID0gLTE7CiAJc3RydWN0IHZnYV9zd2l0Y2hlcm9vX2NsaWVudCAqY2xpZW50ID0gTlVMTDsKIApAQCAtMzE5LDYgKzM0NiwxNSBAQAogCWlmIChzdHJuY21wKHVzZXJjbWQsICJESVMiLCAzKSA9PSAwKQogCQljbGllbnRfaWQgPSBWR0FfU1dJVENIRVJPT19ESVM7CiAKKwlpZiAoc3RybmNtcCh1c2VyY21kLCAiTUlHRCIsIDQpID09IDApIHsKKwkJanVzdF9tdXggPSB0cnVlOworCQljbGllbnRfaWQgPSBWR0FfU1dJVENIRVJPT19JR0Q7CisJfQorCWlmIChzdHJuY21wKHVzZXJjbWQsICJNRElTIiwgNCkgPT0gMCkgeworCQlqdXN0X211eCA9IHRydWU7CisJCWNsaWVudF9pZCA9IFZHQV9TV0lUQ0hFUk9PX0RJUzsKKwl9CisKIAlpZiAoY2xpZW50X2lkID09IC0xKQogCQlnb3RvIG91dDsKIApAQCAtMzMwLDYgKzM2NiwxMiBAQAogCX0KIAogCXZnYXNyX3ByaXYuZGVsYXllZF9zd2l0Y2hfYWN0aXZlID0gZmFsc2U7CisKKwlpZiAoanVzdF9tdXgpIHsKKwkJcmV0ID0gdmdhc3JfcHJpdi5oYW5kbGVyLT5zd2l0Y2h0byhjbGllbnRfaWQpOworCQlnb3RvIG91dDsKKwl9CisKIAkvKiBva2F5IHdlIHdhbnQgYSBzd2l0Y2ggLSB0ZXN0IGlmIGRldmljZXMgYXJlIHdpbGxpbmcgdG8gc3dpdGNoICovCiAJY2FuX3N3aXRjaCA9IHRydWU7CiAJZm9yIChpID0gMDsgaSA8IFZHQV9TV0lUQ0hFUk9PX01BWF9DTElFTlRTOyBpKyspIHsKQEAgLTM0NSwxOCArMzg3LDIyIEBACiAKIAlpZiAoY2FuX3N3aXRjaCA9PSB0cnVlKSB7CiAJCXBkZXZfbmFtZSA9IHBjaV9uYW1lKGNsaWVudC0+cGRldik7Ci0JCXJldCA9IHZnYV9zd2l0Y2h0byhjbGllbnQpOworCQlyZXQgPSB2Z2Ffc3dpdGNodG9fc3RhZ2UxKGNsaWVudCk7CiAJCWlmIChyZXQpCi0JCQlwcmludGsoS0VSTl9FUlIgInZnYV9zd2l0Y2hlcm9vOiBzd2l0Y2hpbmcgZmFpbGVkICVkXG4iLCByZXQpOworCQkJcHJpbnRrKEtFUk5fRVJSICJ2Z2Ffc3dpdGNoZXJvbzogc3dpdGNoaW5nIGZhaWxlZCBzdGFnZSAxICVkXG4iLCByZXQpOworCisJCXJldCA9IHZnYV9zd2l0Y2h0b19zdGFnZTIoY2xpZW50KTsKKwkJaWYgKHJldCkKKwkJCXByaW50ayhLRVJOX0VSUiAidmdhX3N3aXRjaGVyb286IHN3aXRjaGluZyBmYWlsZWQgc3RhZ2UgMiAlZFxuIiwgcmV0KTsKKwogCX0gZWxzZSB7CiAJCXByaW50ayhLRVJOX0lORk8gInZnYV9zd2l0Y2hlcm9vOiBzZXR0aW5nIGRlbGF5ZWQgc3dpdGNoIHRvIGNsaWVudCAlZFxuIiwgY2xpZW50LT5pZCk7CiAJCXZnYXNyX3ByaXYuZGVsYXllZF9zd2l0Y2hfYWN0aXZlID0gdHJ1ZTsKIAkJdmdhc3JfcHJpdi5kZWxheWVkX2NsaWVudF9pZCA9IGNsaWVudF9pZDsKIAotCQkvKiB3ZSBzaG91bGQgYXQgbGVhc3QgcG93ZXIgdXAgdGhlIGNhcmQgdG8KLQkJICAgbWFrZSB0aGUgc3dpdGNoIGZhc3RlciAqLwotCQlpZiAoY2xpZW50LT5wd3Jfc3RhdGUgPT0gVkdBX1NXSVRDSEVST09fT0ZGKQotCQkJdmdhX3N3aXRjaG9uKGNsaWVudCk7CisJCXJldCA9IHZnYV9zd2l0Y2h0b19zdGFnZTEoY2xpZW50KTsKKwkJaWYgKHJldCkKKwkJCXByaW50ayhLRVJOX0VSUiAidmdhX3N3aXRjaGVyb286IGRlbGF5ZWQgc3dpdGNoaW5nIHN0YWdlIDEgZmFpbGVkICVkXG4iLCByZXQpOwogCX0KIAogb3V0OgpAQCAtNDM4LDkgKzQ4NCw5IEBACiAJCWdvdG8gZXJyOwogCiAJcGRldl9uYW1lID0gcGNpX25hbWUoY2xpZW50LT5wZGV2KTsKLQlyZXQgPSB2Z2Ffc3dpdGNodG8oY2xpZW50KTsKKwlyZXQgPSB2Z2Ffc3dpdGNodG9fc3RhZ2UyKGNsaWVudCk7CiAJaWYgKHJldCkKLQkJcHJpbnRrKEtFUk5fRVJSICJ2Z2Ffc3dpdGNoZXJvbzogZGVsYXllZCBzd2l0Y2hpbmcgZmFpbGVkICVkXG4iLCByZXQpOworCQlwcmludGsoS0VSTl9FUlIgInZnYV9zd2l0Y2hlcm9vOiBkZWxheWVkIHN3aXRjaGluZyBmYWlsZWQgc3RhZ2UgMiAlZFxuIiwgcmV0KTsKIAogCXZnYXNyX3ByaXYuZGVsYXllZF9zd2l0Y2hfYWN0aXZlID0gZmFsc2U7CiAJZXJyID0gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL0tjb25maWcgYi9kcml2ZXJzL2hpZC9LY29uZmlnCmluZGV4IDQwMWFjZWMuLmZmYmMyNzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaGlkL0tjb25maWcKKysrIGIvZHJpdmVycy9oaWQvS2NvbmZpZwpAQCAtMTUwLDYgKzE1MCwxNiBAQAogCVNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gZW5hYmxlIGZvcmNlIGZlZWRiYWNrIHN1cHBvcnQgZm9yIERyYWdvblJpc2UgSW5jLgogCWdhbWUgY29udHJvbGxlcnMuCiAKK2NvbmZpZyBISURfRU1TX0ZGCisJdHJpc3RhdGUgIkVNUyBQcm9kdWN0aW9uIEluYy4gZm9yY2UgZmVlZGJhY2sgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFVTQl9ISUQKKwlzZWxlY3QgSU5QVVRfRkZfTUVNTEVTUworCS0tLWhlbHAtLS0KKwlTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIGVuYWJsZSBmb3JjZSBmZWVkYmFjayBzdXBwb3J0IGZvciBkZXZpY2VzIGJ5CisJRU1TIFByb2R1Y3Rpb24gTHRkLgorCUN1cnJlbnRseSB0aGUgZm9sbG93aW5nIGRldmljZXMgYXJlIGtub3duIHRvIGJlIHN1cHBvcnRlZDoKKwkgLSBUcmlvIExpbmtlciBQbHVzIElJCisKIGNvbmZpZyBISURfRUdBTEFYCiAJdHJpc3RhdGUgImVHYWxheCBtdWx0aS10b3VjaCBwYW5lbCIKIAlkZXBlbmRzIG9uIFVTQl9ISUQKQEAgLTM5Nyw2ICs0MDcsMTMgQEAKIAktLS1oZWxwLS0tCiAJU3VwcG9ydCBmb3IgUm9jY2F0IEtvbmUgbW91c2UuCiAKK2NvbmZpZyBISURfUk9DQ0FUX0tPTkVQTFVTCisJdHJpc3RhdGUgIlJvY2NhdCBLb25lWytdIG1vdXNlIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBVU0JfSElECisJc2VsZWN0IEhJRF9ST0NDQVQKKwktLS1oZWxwLS0tCisJU3VwcG9ydCBmb3IgUm9jY2F0IEtvbmVbK10gbW91c2UuCisKIGNvbmZpZyBISURfUk9DQ0FUX1BZUkEKIAl0cmlzdGF0ZSAiUm9jY2F0IFB5cmEgbW91c2Ugc3VwcG9ydCIKIAlkZXBlbmRzIG9uIFVTQl9ISUQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL01ha2VmaWxlIGIvZHJpdmVycy9oaWQvTWFrZWZpbGUKaW5kZXggYzMzNTYwNS4uNmVhZTlhOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9oaWQvTWFrZWZpbGUKQEAgLTEsNyArMSw3IEBACiAjCiAjIE1ha2VmaWxlIGZvciB0aGUgSElEIGRyaXZlcgogIwotaGlkLW9ianMJCQk6PSBoaWQtY29yZS5vIGhpZC1pbnB1dC5vCitoaWQteQkJCTo9IGhpZC1jb3JlLm8gaGlkLWlucHV0Lm8KIAogaWZkZWYgQ09ORklHX0RFQlVHX0ZTCiAJaGlkLW9ianMJCSs9IGhpZC1kZWJ1Zy5vCkBAIC0xMSwxOCArMTEsMTggQEAKIAogaGlkLSQoQ09ORklHX0hJRFJBVykJCSs9IGhpZHJhdy5vCiAKLWhpZC1sb2dpdGVjaC1vYmpzCQk6PSBoaWQtbGcubworaGlkLWxvZ2l0ZWNoLXkJCTo9IGhpZC1sZy5vCiBpZmRlZiBDT05GSUdfTE9HSVRFQ0hfRkYKLQloaWQtbG9naXRlY2gtb2JqcwkrPSBoaWQtbGdmZi5vCisJaGlkLWxvZ2l0ZWNoLXkJKz0gaGlkLWxnZmYubwogZW5kaWYKIGlmZGVmIENPTkZJR19MT0dJUlVNQkxFUEFEMl9GRgotCWhpZC1sb2dpdGVjaC1vYmpzCSs9IGhpZC1sZzJmZi5vCisJaGlkLWxvZ2l0ZWNoLXkJKz0gaGlkLWxnMmZmLm8KIGVuZGlmCiBpZmRlZiBDT05GSUdfTE9HSUc5NDBfRkYKLQloaWQtbG9naXRlY2gtb2JqcwkrPSBoaWQtbGczZmYubworCWhpZC1sb2dpdGVjaC15CSs9IGhpZC1sZzNmZi5vCiBlbmRpZgogaWZkZWYgQ09ORklHX0xPR0lXSUlfRkYKLQloaWQtbG9naXRlY2gtb2JqcwkrPSBoaWQtbGc0ZmYubworCWhpZC1sb2dpdGVjaC15CSs9IGhpZC1sZzRmZi5vCiBlbmRpZgogCiBvYmotJChDT05GSUdfSElEXzNNX1BDVCkJKz0gaGlkLTNtLXBjdC5vCkBAIC0zNSw2ICszNSw3IEBACiBvYmotJChDT05GSUdfSElEX0NISUNPTlkpCSs9IGhpZC1jaGljb255Lm8KIG9iai0kKENPTkZJR19ISURfQ1lQUkVTUykJKz0gaGlkLWN5cHJlc3Mubwogb2JqLSQoQ09ORklHX0hJRF9EUkFHT05SSVNFKQkrPSBoaWQtZHJmZi5vCitvYmotJChDT05GSUdfSElEX0VNU19GRikJKz0gaGlkLWVtc2ZmLm8KIG9iai0kKENPTkZJR19ISURfRUdBTEFYKQkrPSBoaWQtZWdhbGF4Lm8KIG9iai0kKENPTkZJR19ISURfRUxFQ09NKQkrPSBoaWQtZWxlY29tLm8KIG9iai0kKENPTkZJR19ISURfRVpLRVkpCQkrPSBoaWQtZXprZXkubwpAQCAtNTUsNiArNTYsNyBAQAogb2JqLSQoQ09ORklHX0hJRF9QSUNPTENEKQkrPSBoaWQtcGljb2xjZC5vCiBvYmotJChDT05GSUdfSElEX1JPQ0NBVCkJKz0gaGlkLXJvY2NhdC5vCiBvYmotJChDT05GSUdfSElEX1JPQ0NBVF9LT05FKQkrPSBoaWQtcm9jY2F0LWtvbmUubworb2JqLSQoQ09ORklHX0hJRF9ST0NDQVRfS09ORVBMVVMpCSs9IGhpZC1yb2NjYXQta29uZXBsdXMubwogb2JqLSQoQ09ORklHX0hJRF9ST0NDQVRfUFlSQSkJKz0gaGlkLXJvY2NhdC1weXJhLm8KIG9iai0kKENPTkZJR19ISURfU0FNU1VORykJKz0gaGlkLXNhbXN1bmcubwogb2JqLSQoQ09ORklHX0hJRF9TTUFSVEpPWVBMVVMpCSs9IGhpZC1zam95Lm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL2hpZC0zbS1wY3QuYyBiL2RyaXZlcnMvaGlkL2hpZC0zbS1wY3QuYwppbmRleCA0ZmI3Yzc1Li41MjQzYWUyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC9oaWQtM20tcGN0LmMKKysrIGIvZHJpdmVycy9oaWQvaGlkLTNtLXBjdC5jCkBAIC0yNDYsNyArMjQ2LDcgQEAKIAogCW1kID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG1tbV9kYXRhKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFtZCkgewotCQlkZXZfZXJyKCZoZGV2LT5kZXYsICJjYW5ub3QgYWxsb2NhdGUgM00gZGF0YVxuIik7CisJCWhpZF9lcnIoaGRldiwgImNhbm5vdCBhbGxvY2F0ZSAzTSBkYXRhXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCWhpZF9zZXRfZHJ2ZGF0YShoZGV2LCBtZCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC9oaWQtYTR0ZWNoLmMgYi9kcml2ZXJzL2hpZC9oaWQtYTR0ZWNoLmMKaW5kZXggMTY2NmMxNi4uOTAyZDFkZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvaGlkLWE0dGVjaC5jCisrKyBiL2RyaXZlcnMvaGlkL2hpZC1hNHRlY2guYwpAQCAtOTMsNyArOTMsNyBAQAogCiAJYTQgPSBremFsbG9jKHNpemVvZigqYTQpLCBHRlBfS0VSTkVMKTsKIAlpZiAoYTQgPT0gTlVMTCkgewotCQlkZXZfZXJyKCZoZGV2LT5kZXYsICJjYW4ndCBhbGxvYyBkZXZpY2UgZGVzY3JpcHRvclxuIik7CisJCWhpZF9lcnIoaGRldiwgImNhbid0IGFsbG9jIGRldmljZSBkZXNjcmlwdG9yXG4iKTsKIAkJcmV0ID0gLUVOT01FTTsKIAkJZ290byBlcnJfZnJlZTsKIAl9CkBAIC0xMDQsMTMgKzEwNCwxMyBAQAogCiAJcmV0ID0gaGlkX3BhcnNlKGhkZXYpOwogCWlmIChyZXQpIHsKLQkJZGV2X2VycigmaGRldi0+ZGV2LCAicGFyc2UgZmFpbGVkXG4iKTsKKwkJaGlkX2VycihoZGV2LCAicGFyc2UgZmFpbGVkXG4iKTsKIAkJZ290byBlcnJfZnJlZTsKIAl9CiAKIAlyZXQgPSBoaWRfaHdfc3RhcnQoaGRldiwgSElEX0NPTk5FQ1RfREVGQVVMVCk7CiAJaWYgKHJldCkgewotCQlkZXZfZXJyKCZoZGV2LT5kZXYsICJodyBzdGFydCBmYWlsZWRcbiIpOworCQloaWRfZXJyKGhkZXYsICJodyBzdGFydCBmYWlsZWRcbiIpOwogCQlnb3RvIGVycl9mcmVlOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvaGlkLWFwcGxlLmMgYi9kcml2ZXJzL2hpZC9oaWQtYXBwbGUuYwppbmRleCBlYWVjYTU2Li42MWFhNzEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC9oaWQtYXBwbGUuYworKysgYi9kcml2ZXJzL2hpZC9oaWQtYXBwbGUuYwpAQCAtMTYsNiArMTYsOCBAQAogICogYW55IGxhdGVyIHZlcnNpb24uCiAgKi8KIAorI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvaGlkLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CkBAIC01OSw2ICs2MSwyNyBAQAogCXU4IGZsYWdzOwogfTsKIAorc3RhdGljIGNvbnN0IHN0cnVjdCBhcHBsZV9rZXlfdHJhbnNsYXRpb24gbWFjYm9va2Fpcl9mbl9rZXlzW10gPSB7CisJeyBLRVlfQkFDS1NQQUNFLCBLRVlfREVMRVRFIH0sCisJeyBLRVlfRU5URVIsCUtFWV9JTlNFUlQgfSwKKwl7IEtFWV9GMSwJS0VZX0JSSUdIVE5FU1NET1dOLCBBUFBMRV9GTEFHX0ZLRVkgfSwKKwl7IEtFWV9GMiwJS0VZX0JSSUdIVE5FU1NVUCwgICBBUFBMRV9GTEFHX0ZLRVkgfSwKKwl7IEtFWV9GMywJS0VZX1NDQUxFLCAgICAgICAgICBBUFBMRV9GTEFHX0ZLRVkgfSwKKwl7IEtFWV9GNCwJS0VZX0RBU0hCT0FSRCwgICAgICBBUFBMRV9GTEFHX0ZLRVkgfSwKKwl7IEtFWV9GNiwJS0VZX1BSRVZJT1VTU09ORywgICBBUFBMRV9GTEFHX0ZLRVkgfSwKKwl7IEtFWV9GNywJS0VZX1BMQVlQQVVTRSwgICAgICBBUFBMRV9GTEFHX0ZLRVkgfSwKKwl7IEtFWV9GOCwJS0VZX05FWFRTT05HLCAgICAgICBBUFBMRV9GTEFHX0ZLRVkgfSwKKwl7IEtFWV9GOSwJS0VZX01VVEUsICAgICAgICAgICBBUFBMRV9GTEFHX0ZLRVkgfSwKKwl7IEtFWV9GMTAsCUtFWV9WT0xVTUVET1dOLCAgICAgQVBQTEVfRkxBR19GS0VZIH0sCisJeyBLRVlfRjExLAlLRVlfVk9MVU1FVVAsICAgICAgIEFQUExFX0ZMQUdfRktFWSB9LAorCXsgS0VZX0YxMiwJS0VZX0VKRUNUQ0QsICAgICAgICBBUFBMRV9GTEFHX0ZLRVkgfSwKKwl7IEtFWV9VUCwJS0VZX1BBR0VVUCB9LAorCXsgS0VZX0RPV04sCUtFWV9QQUdFRE9XTiB9LAorCXsgS0VZX0xFRlQsCUtFWV9IT01FIH0sCisJeyBLRVlfUklHSFQsCUtFWV9FTkQgfSwKKwl7IH0KK307CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYXBwbGVfa2V5X3RyYW5zbGF0aW9uIGFwcGxlX2ZuX2tleXNbXSA9IHsKIAl7IEtFWV9CQUNLU1BBQ0UsIEtFWV9ERUxFVEUgfSwKIAl7IEtFWV9FTlRFUiwJS0VZX0lOU0VSVCB9LApAQCAtMTQ2LDcgKzE2OSw3IEBACiAJCXN0cnVjdCBoaWRfdXNhZ2UgKnVzYWdlLCBfX3MzMiB2YWx1ZSkKIHsKIAlzdHJ1Y3QgYXBwbGVfc2MgKmFzYyA9IGhpZF9nZXRfZHJ2ZGF0YShoaWQpOwotCWNvbnN0IHN0cnVjdCBhcHBsZV9rZXlfdHJhbnNsYXRpb24gKnRyYW5zOworCWNvbnN0IHN0cnVjdCBhcHBsZV9rZXlfdHJhbnNsYXRpb24gKnRyYW5zLCAqdGFibGU7CiAKIAlpZiAodXNhZ2UtPmNvZGUgPT0gS0VZX0ZOKSB7CiAJCWFzYy0+Zm5fb24gPSAhIXZhbHVlOwpAQCAtMTU3LDEwICsxODAsMTYgQEAKIAlpZiAoZm5tb2RlKSB7CiAJCWludCBkb190cmFuc2xhdGU7CiAKLQkJdHJhbnMgPSBhcHBsZV9maW5kX3RyYW5zbGF0aW9uKChoaWQtPnByb2R1Y3QgPCAweDIxZCB8fAotCQkJCQloaWQtPnByb2R1Y3QgPj0gMHgzMDApID8KLQkJCQkJcG93ZXJib29rX2ZuX2tleXMgOiBhcHBsZV9mbl9rZXlzLAotCQkJCQl1c2FnZS0+Y29kZSk7CisJCWlmIChoaWQtPnByb2R1Y3QgPj0gVVNCX0RFVklDRV9JRF9BUFBMRV9XRUxMU1BSSU5HNF9BTlNJICYmCisJCQkJaGlkLT5wcm9kdWN0IDw9IFVTQl9ERVZJQ0VfSURfQVBQTEVfV0VMTFNQUklORzRBX0pJUykKKwkJCXRhYmxlID0gbWFjYm9va2Fpcl9mbl9rZXlzOworCQllbHNlIGlmIChoaWQtPnByb2R1Y3QgPCAweDIxZCB8fCBoaWQtPnByb2R1Y3QgPj0gMHgzMDApCisJCQl0YWJsZSA9IHBvd2VyYm9va19mbl9rZXlzOworCQllbHNlCisJCQl0YWJsZSA9IGFwcGxlX2ZuX2tleXM7CisKKwkJdHJhbnMgPSBhcHBsZV9maW5kX3RyYW5zbGF0aW9uICh0YWJsZSwgdXNhZ2UtPmNvZGUpOworCiAJCWlmICh0cmFucykgewogCQkJaWYgKHRlc3RfYml0KHVzYWdlLT5jb2RlLCBhc2MtPnByZXNzZWRfZm4pKQogCQkJCWRvX3RyYW5zbGF0ZSA9IDE7CkBAIC0yNTMsOCArMjgyLDggQEAKIAogCWlmICgoYXNjLT5xdWlya3MgJiBBUFBMRV9SREVTQ19KSVMpICYmICpyc2l6ZSA+PSA2MCAmJgogCQkJcmRlc2NbNTNdID09IDB4NjUgJiYgcmRlc2NbNTldID09IDB4NjUpIHsKLQkJZGV2X2luZm8oJmhkZXYtPmRldiwgImZpeGluZyB1cCBNYWNCb29rIEpJUyBrZXlib2FyZCByZXBvcnQgIgotCQkJCSJkZXNjcmlwdG9yXG4iKTsKKwkJaGlkX2luZm8oaGRldiwKKwkJCSAiZml4aW5nIHVwIE1hY0Jvb2sgSklTIGtleWJvYXJkIHJlcG9ydCBkZXNjcmlwdG9yXG4iKTsKIAkJcmRlc2NbNTNdID0gcmRlc2NbNTldID0gMHhlNzsKIAl9CiAJcmV0dXJuIHJkZXNjOwpAQCAtMzI0LDcgKzM1Myw3IEBACiAKIAlhc2MgPSBremFsbG9jKHNpemVvZigqYXNjKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKGFzYyA9PSBOVUxMKSB7Ci0JCWRldl9lcnIoJmhkZXYtPmRldiwgImNhbid0IGFsbG9jIGFwcGxlIGRlc2NyaXB0b3JcbiIpOworCQloaWRfZXJyKGhkZXYsICJjYW4ndCBhbGxvYyBhcHBsZSBkZXNjcmlwdG9yXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCkBAIC0zMzQsNyArMzYzLDcgQEAKIAogCXJldCA9IGhpZF9wYXJzZShoZGV2KTsKIAlpZiAocmV0KSB7Ci0JCWRldl9lcnIoJmhkZXYtPmRldiwgInBhcnNlIGZhaWxlZFxuIik7CisJCWhpZF9lcnIoaGRldiwgInBhcnNlIGZhaWxlZFxuIik7CiAJCWdvdG8gZXJyX2ZyZWU7CiAJfQogCkBAIC0zNDUsNyArMzc0LDcgQEAKIAogCXJldCA9IGhpZF9od19zdGFydChoZGV2LCBjb25uZWN0X21hc2spOwogCWlmIChyZXQpIHsKLQkJZGV2X2VycigmaGRldi0+ZGV2LCAiaHcgc3RhcnQgZmFpbGVkXG4iKTsKKwkJaGlkX2VycihoZGV2LCAiaHcgc3RhcnQgZmFpbGVkXG4iKTsKIAkJZ290byBlcnJfZnJlZTsKIAl9CiAKQEAgLTQ0MCw2ICs0NjksMTggQEAKIAkJLmRyaXZlcl9kYXRhID0gQVBQTEVfSEFTX0ZOIHwgQVBQTEVfSVNPX0tFWUJPQVJEIH0sCiAJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0FQUExFLCBVU0JfREVWSUNFX0lEX0FQUExFX1dFTExTUFJJTkczX0pJUyksCiAJCS5kcml2ZXJfZGF0YSA9IEFQUExFX0hBU19GTiB8IEFQUExFX1JERVNDX0pJUyB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9BUFBMRSwgVVNCX0RFVklDRV9JRF9BUFBMRV9XRUxMU1BSSU5HNF9BTlNJKSwKKwkJLmRyaXZlcl9kYXRhID0gQVBQTEVfSEFTX0ZOIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0FQUExFLCBVU0JfREVWSUNFX0lEX0FQUExFX1dFTExTUFJJTkc0X0lTTyksCisJCS5kcml2ZXJfZGF0YSA9IEFQUExFX0hBU19GTiB8IEFQUExFX0lTT19LRVlCT0FSRCB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9BUFBMRSwgVVNCX0RFVklDRV9JRF9BUFBMRV9XRUxMU1BSSU5HNF9KSVMpLAorCQkuZHJpdmVyX2RhdGEgPSBBUFBMRV9IQVNfRk4gfCBBUFBMRV9SREVTQ19KSVMgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQVBQTEUsIFVTQl9ERVZJQ0VfSURfQVBQTEVfV0VMTFNQUklORzRBX0FOU0kpLAorCQkuZHJpdmVyX2RhdGEgPSBBUFBMRV9IQVNfRk4gfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQVBQTEUsIFVTQl9ERVZJQ0VfSURfQVBQTEVfV0VMTFNQUklORzRBX0lTTyksCisJCS5kcml2ZXJfZGF0YSA9IEFQUExFX0hBU19GTiB8IEFQUExFX0lTT19LRVlCT0FSRCB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9BUFBMRSwgVVNCX0RFVklDRV9JRF9BUFBMRV9XRUxMU1BSSU5HNEFfSklTKSwKKwkJLmRyaXZlcl9kYXRhID0gQVBQTEVfSEFTX0ZOIHwgQVBQTEVfUkRFU0NfSklTIH0sCiAJeyBISURfQkxVRVRPT1RIX0RFVklDRShVU0JfVkVORE9SX0lEX0FQUExFLCBVU0JfREVWSUNFX0lEX0FQUExFX0FMVV9XSVJFTEVTU18yMDA5X0FOU0kpLAogCQkuZHJpdmVyX2RhdGEgPSBBUFBMRV9OVU1MT0NLX0VNVUxBVElPTiB8IEFQUExFX0hBU19GTiB9LAogCXsgSElEX0JMVUVUT09USF9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9BUFBMRSwgVVNCX0RFVklDRV9JRF9BUFBMRV9BTFVfV0lSRUxFU1NfMjAwOV9JU08pLApAQCAtNDczLDcgKzUxNCw3IEBACiAKIAlyZXQgPSBoaWRfcmVnaXN0ZXJfZHJpdmVyKCZhcHBsZV9kcml2ZXIpOwogCWlmIChyZXQpCi0JCXByaW50ayhLRVJOX0VSUiAiY2FuJ3QgcmVnaXN0ZXIgYXBwbGUgZHJpdmVyXG4iKTsKKwkJcHJfZXJyKCJjYW4ndCByZWdpc3RlciBhcHBsZSBkcml2ZXJcbiIpOwogCiAJcmV0dXJuIHJldDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL2hpZC1heGZmLmMgYi9kcml2ZXJzL2hpZC9oaWQtYXhmZi5jCmluZGV4IGY0MmVlMTQuLmU1Yjk2MWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaGlkL2hpZC1heGZmLmMKKysrIGIvZHJpdmVycy9oaWQvaGlkLWF4ZmYuYwpAQCAtNzMsMTQgKzczLDE0IEBACiAJaW50IGVycm9yOwogCiAJaWYgKGxpc3RfZW1wdHkocmVwb3J0X2xpc3QpKSB7Ci0JCWRldl9lcnIoJmhpZC0+ZGV2LCAibm8gb3V0cHV0IHJlcG9ydHMgZm91bmRcbiIpOworCQloaWRfZXJyKGhpZCwgIm5vIG91dHB1dCByZXBvcnRzIGZvdW5kXG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCiAJcmVwb3J0ID0gbGlzdF9maXJzdF9lbnRyeShyZXBvcnRfbGlzdCwgc3RydWN0IGhpZF9yZXBvcnQsIGxpc3QpOwogCiAJaWYgKHJlcG9ydC0+bWF4ZmllbGQgPCA0KSB7Ci0JCWRldl9lcnIoJmhpZC0+ZGV2LCAibm8gZmllbGRzIGluIHRoZSByZXBvcnQ6ICVkXG4iLCByZXBvcnQtPm1heGZpZWxkKTsKKwkJaGlkX2VycihoaWQsICJubyBmaWVsZHMgaW4gdGhlIHJlcG9ydDogJWRcbiIsIHJlcG9ydC0+bWF4ZmllbGQpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKQEAgLTEwMSw3ICsxMDEsNyBAQAogCWF4ZmYtPnJlcG9ydC0+ZmllbGRbM10tPnZhbHVlWzBdID0gMHgwMDsKIAl1c2JoaWRfc3VibWl0X3JlcG9ydChoaWQsIGF4ZmYtPnJlcG9ydCwgVVNCX0RJUl9PVVQpOwogCi0JZGV2X2luZm8oJmhpZC0+ZGV2LCAiRm9yY2UgRmVlZGJhY2sgZm9yIEFDUlVYIGdhbWUgY29udHJvbGxlcnMgYnkgU2VyZ2VpIEtvbHp1bjx4MHJAZHYtbGlmZS5ydT5cbiIpOworCWhpZF9pbmZvKGhpZCwgIkZvcmNlIEZlZWRiYWNrIGZvciBBQ1JVWCBnYW1lIGNvbnRyb2xsZXJzIGJ5IFNlcmdlaSBLb2x6dW48eDByQGR2LWxpZmUucnU+XG4iKTsKIAogCXJldHVybiAwOwogCkBAIC0xMTQsMTcgKzExNCwxNyBAQAogewogCWludCBlcnJvcjsKIAotCWRldl9kYmcoJmhkZXYtPmRldiwgIkFDUlVYIEhJRCBoYXJkd2FyZSBwcm9iZS4uLiIpOworCWRldl9kYmcoJmhkZXYtPmRldiwgIkFDUlVYIEhJRCBoYXJkd2FyZSBwcm9iZS4uLlxuIik7CiAKIAllcnJvciA9IGhpZF9wYXJzZShoZGV2KTsKIAlpZiAoZXJyb3IpIHsKLQkJZGV2X2VycigmaGRldi0+ZGV2LCAicGFyc2UgZmFpbGVkXG4iKTsKKwkJaGlkX2VycihoZGV2LCAicGFyc2UgZmFpbGVkXG4iKTsKIAkJcmV0dXJuIGVycm9yOwogCX0KIAogCWVycm9yID0gaGlkX2h3X3N0YXJ0KGhkZXYsIEhJRF9DT05ORUNUX0RFRkFVTFQgJiB+SElEX0NPTk5FQ1RfRkYpOwogCWlmIChlcnJvcikgewotCQlkZXZfZXJyKCZoZGV2LT5kZXYsICJodyBzdGFydCBmYWlsZWRcbiIpOworCQloaWRfZXJyKGhkZXYsICJodyBzdGFydCBmYWlsZWRcbiIpOwogCQlyZXR1cm4gZXJyb3I7CiAJfQogCkBAIC0xMzQsNyArMTM0LDcgQEAKIAkJICogRG8gbm90IGZhaWwgZGV2aWNlIGluaXRpYWxpemF0aW9uIGNvbXBsZXRlbHkgYXMgZGV2aWNlCiAJCSAqIG1heSBzdGlsbCBiZSBwYXJ0aWFsbHkgb3BlcmFibGUsIGp1c3Qgd2Fybi4KIAkJICovCi0JCWRldl93YXJuKCZoZGV2LT5kZXYsCisJCWhpZF93YXJuKGhkZXYsCiAJCQkgIkZhaWxlZCB0byBlbmFibGUgZm9yY2UgZmVlZGJhY2sgc3VwcG9ydCwgZXJyb3I6ICVkXG4iLAogCQkJIGVycm9yKTsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC9oaWQtYmVsa2luLmMgYi9kcml2ZXJzL2hpZC9oaWQtYmVsa2luLmMKaW5kZXggNGNlN2FhMy4uYTFhNzY1YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvaGlkLWJlbGtpbi5jCisrKyBiL2RyaXZlcnMvaGlkL2hpZC1iZWxraW4uYwpAQCAtNTYsMTQgKzU2LDE0IEBACiAKIAlyZXQgPSBoaWRfcGFyc2UoaGRldik7CiAJaWYgKHJldCkgewotCQlkZXZfZXJyKCZoZGV2LT5kZXYsICJwYXJzZSBmYWlsZWRcbiIpOworCQloaWRfZXJyKGhkZXYsICJwYXJzZSBmYWlsZWRcbiIpOwogCQlnb3RvIGVycl9mcmVlOwogCX0KIAogCXJldCA9IGhpZF9od19zdGFydChoZGV2LCBISURfQ09OTkVDVF9ERUZBVUxUIHwKIAkJKChxdWlya3MgJiBCRUxLSU5fSElEREVWKSA/IEhJRF9DT05ORUNUX0hJRERFVl9GT1JDRSA6IDApKTsKIAlpZiAocmV0KSB7Ci0JCWRldl9lcnIoJmhkZXYtPmRldiwgImh3IHN0YXJ0IGZhaWxlZFxuIik7CisJCWhpZF9lcnIoaGRldiwgImh3IHN0YXJ0IGZhaWxlZFxuIik7CiAJCWdvdG8gZXJyX2ZyZWU7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC9oaWQtY2FuZG8uYyBiL2RyaXZlcnMvaGlkL2hpZC1jYW5kby5jCmluZGV4IDU5MjViZGMuLjM3NWI1MDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaGlkL2hpZC1jYW5kby5jCisrKyBiL2RyaXZlcnMvaGlkL2hpZC1jYW5kby5jCkBAIC0yMDcsNyArMjA3LDcgQEAKIAogCXRkID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGNhbmRvX2RhdGEpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXRkKSB7Ci0JCWRldl9lcnIoJmhkZXYtPmRldiwgImNhbm5vdCBhbGxvY2F0ZSBDYW5kbyBUb3VjaCBkYXRhXG4iKTsKKwkJaGlkX2VycihoZGV2LCAiY2Fubm90IGFsbG9jYXRlIENhbmRvIFRvdWNoIGRhdGFcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAJaGlkX3NldF9kcnZkYXRhKGhkZXYsIHRkKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL2hpZC1jaGVycnkuYyBiL2RyaXZlcnMvaGlkL2hpZC1jaGVycnkuYwppbmRleCBlODgwMDg2Li44ODhlY2U2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC9oaWQtY2hlcnJ5LmMKKysrIGIvZHJpdmVycy9oaWQvaGlkLWNoZXJyeS5jCkBAIC0zMCw4ICszMCw3IEBACiAJCXVuc2lnbmVkIGludCAqcnNpemUpCiB7CiAJaWYgKCpyc2l6ZSA+PSAxNyAmJiByZGVzY1sxMV0gPT0gMHgzYyAmJiByZGVzY1sxMl0gPT0gMHgwMikgewotCQlkZXZfaW5mbygmaGRldi0+ZGV2LCAiZml4aW5nIHVwIENoZXJyeSBDeW1vdGlvbiByZXBvcnQgIgotCQkJCSJkZXNjcmlwdG9yXG4iKTsKKwkJaGlkX2luZm8oaGRldiwgImZpeGluZyB1cCBDaGVycnkgQ3ltb3Rpb24gcmVwb3J0IGRlc2NyaXB0b3JcbiIpOwogCQlyZGVzY1sxMV0gPSByZGVzY1sxNl0gPSAweGZmOwogCQlyZGVzY1sxMl0gPSByZGVzY1sxN10gPSAweDAzOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL2hpZC1jb3JlLmMgYi9kcml2ZXJzL2hpZC9oaWQtY29yZS5jCmluZGV4IDNmOTY3M2QuLjI2MTE2ODYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaGlkL2hpZC1jb3JlLmMKKysrIGIvZHJpdmVycy9oaWQvaGlkLWNvcmUuYwpAQCAtMTQsNiArMTQsOCBAQAogICogYW55IGxhdGVyIHZlcnNpb24uCiAgKi8KIAorI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KQEAgLTU5LDcgKzYxLDggQEAKIAlpZiAocmVwb3J0X2VudW0tPnJlcG9ydF9pZF9oYXNoW2lkXSkKIAkJcmV0dXJuIHJlcG9ydF9lbnVtLT5yZXBvcnRfaWRfaGFzaFtpZF07CiAKLQlpZiAoIShyZXBvcnQgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgaGlkX3JlcG9ydCksIEdGUF9LRVJORUwpKSkKKwlyZXBvcnQgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgaGlkX3JlcG9ydCksIEdGUF9LRVJORUwpOworCWlmICghcmVwb3J0KQogCQlyZXR1cm4gTlVMTDsKIAogCWlmIChpZCAhPSAwKQpAQCAtOTAsOCArOTMsMTEgQEAKIAkJcmV0dXJuIE5VTEw7CiAJfQogCi0JaWYgKCEoZmllbGQgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgaGlkX2ZpZWxkKSArIHVzYWdlcyAqIHNpemVvZihzdHJ1Y3QgaGlkX3VzYWdlKQotCQkrIHZhbHVlcyAqIHNpemVvZih1bnNpZ25lZCksIEdGUF9LRVJORUwpKSkgcmV0dXJuIE5VTEw7CisJZmllbGQgPSBremFsbG9jKChzaXplb2Yoc3RydWN0IGhpZF9maWVsZCkgKworCQkJIHVzYWdlcyAqIHNpemVvZihzdHJ1Y3QgaGlkX3VzYWdlKSArCisJCQkgdmFsdWVzICogc2l6ZW9mKHVuc2lnbmVkKSksIEdGUF9LRVJORUwpOworCWlmICghZmllbGQpCisJCXJldHVybiBOVUxMOwogCiAJZmllbGQtPmluZGV4ID0gcmVwb3J0LT5tYXhmaWVsZCsrOwogCXJlcG9ydC0+ZmllbGRbZmllbGQtPmluZGV4XSA9IGZpZWxkOwpAQCAtMTcyLDEwICsxNzgsMTQgQEAKIAogc3RhdGljIHVuc2lnbmVkIGhpZF9sb29rdXBfY29sbGVjdGlvbihzdHJ1Y3QgaGlkX3BhcnNlciAqcGFyc2VyLCB1bnNpZ25lZCB0eXBlKQogeworCXN0cnVjdCBoaWRfY29sbGVjdGlvbiAqY29sbGVjdGlvbiA9IHBhcnNlci0+ZGV2aWNlLT5jb2xsZWN0aW9uOwogCWludCBuOwotCWZvciAobiA9IHBhcnNlci0+Y29sbGVjdGlvbl9zdGFja19wdHIgLSAxOyBuID49IDA7IG4tLSkKLQkJaWYgKHBhcnNlci0+ZGV2aWNlLT5jb2xsZWN0aW9uW3BhcnNlci0+Y29sbGVjdGlvbl9zdGFja1tuXV0udHlwZSA9PSB0eXBlKQotCQkJcmV0dXJuIHBhcnNlci0+ZGV2aWNlLT5jb2xsZWN0aW9uW3BhcnNlci0+Y29sbGVjdGlvbl9zdGFja1tuXV0udXNhZ2U7CisKKwlmb3IgKG4gPSBwYXJzZXItPmNvbGxlY3Rpb25fc3RhY2tfcHRyIC0gMTsgbiA+PSAwOyBuLS0pIHsKKwkJdW5zaWduZWQgaW5kZXggPSBwYXJzZXItPmNvbGxlY3Rpb25fc3RhY2tbbl07CisJCWlmIChjb2xsZWN0aW9uW2luZGV4XS50eXBlID09IHR5cGUpCisJCQlyZXR1cm4gY29sbGVjdGlvbltpbmRleF0udXNhZ2U7CisJfQogCXJldHVybiAwOyAvKiB3ZSBrbm93IG5vdGhpbmcgYWJvdXQgdGhpcyB1c2FnZSB0eXBlICovCiB9CiAKQEAgLTIwOSw3ICsyMTksOCBAQAogCXVuc2lnbmVkIG9mZnNldDsKIAlpbnQgaTsKIAotCWlmICghKHJlcG9ydCA9IGhpZF9yZWdpc3Rlcl9yZXBvcnQocGFyc2VyLT5kZXZpY2UsIHJlcG9ydF90eXBlLCBwYXJzZXItPmdsb2JhbC5yZXBvcnRfaWQpKSkgeworCXJlcG9ydCA9IGhpZF9yZWdpc3Rlcl9yZXBvcnQocGFyc2VyLT5kZXZpY2UsIHJlcG9ydF90eXBlLCBwYXJzZXItPmdsb2JhbC5yZXBvcnRfaWQpOworCWlmICghcmVwb3J0KSB7CiAJCWRiZ19oaWQoImhpZF9yZWdpc3Rlcl9yZXBvcnQgZmFpbGVkXG4iKTsKIAkJcmV0dXJuIC0xOwogCX0KQEAgLTIyNyw3ICsyMzgsOCBAQAogCiAJdXNhZ2VzID0gbWF4X3QoaW50LCBwYXJzZXItPmxvY2FsLnVzYWdlX2luZGV4LCBwYXJzZXItPmdsb2JhbC5yZXBvcnRfY291bnQpOwogCi0JaWYgKChmaWVsZCA9IGhpZF9yZWdpc3Rlcl9maWVsZChyZXBvcnQsIHVzYWdlcywgcGFyc2VyLT5nbG9iYWwucmVwb3J0X2NvdW50KSkgPT0gTlVMTCkKKwlmaWVsZCA9IGhpZF9yZWdpc3Rlcl9maWVsZChyZXBvcnQsIHVzYWdlcywgcGFyc2VyLT5nbG9iYWwucmVwb3J0X2NvdW50KTsKKwlpZiAoIWZpZWxkKQogCQlyZXR1cm4gMDsKIAogCWZpZWxkLT5waHlzaWNhbCA9IGhpZF9sb29rdXBfY29sbGVjdGlvbihwYXJzZXIsIEhJRF9DT0xMRUNUSU9OX1BIWVNJQ0FMKTsKQEAgLTY1MiwxMyArNjY0LDEyIEBACiAJCXJldHVybiAtRU5PTUVNOwogCWRldmljZS0+cnNpemUgPSBzaXplOwogCi0JcGFyc2VyID0gdm1hbGxvYyhzaXplb2Yoc3RydWN0IGhpZF9wYXJzZXIpKTsKKwlwYXJzZXIgPSB2emFsbG9jKHNpemVvZihzdHJ1Y3QgaGlkX3BhcnNlcikpOwogCWlmICghcGFyc2VyKSB7CiAJCXJldCA9IC1FTk9NRU07CiAJCWdvdG8gZXJyOwogCX0KIAotCW1lbXNldChwYXJzZXIsIDAsIHNpemVvZihzdHJ1Y3QgaGlkX3BhcnNlcikpOwogCXBhcnNlci0+ZGV2aWNlID0gZGV2aWNlOwogCiAJZW5kID0gc3RhcnQgKyBzaXplOwpAQCAtNjcyLDcgKzY4Myw4IEBACiAKIAkJaWYgKGRpc3BhdGNoX3R5cGVbaXRlbS50eXBlXShwYXJzZXIsICZpdGVtKSkgewogCQkJZGJnX2hpZCgiaXRlbSAldSAldSAldSAldSBwYXJzaW5nIGZhaWxlZFxuIiwKLQkJCQlpdGVtLmZvcm1hdCwgKHVuc2lnbmVkKWl0ZW0uc2l6ZSwgKHVuc2lnbmVkKWl0ZW0udHlwZSwgKHVuc2lnbmVkKWl0ZW0udGFnKTsKKwkJCQlpdGVtLmZvcm1hdCwgKHVuc2lnbmVkKWl0ZW0uc2l6ZSwKKwkJCQkodW5zaWduZWQpaXRlbS50eXBlLCAodW5zaWduZWQpaXRlbS50YWcpOwogCQkJZ290byBlcnI7CiAJCX0KIApAQCAtNzM3LDEzICs3NDksMTQgQEAKICAqIFNlYXJjaCBsaW51eC1rZXJuZWwgYW5kIGxpbnV4LXVzYi1kZXZlbCBhcmNoaXZlcyBmb3IgImhpZC1jb3JlIGV4dHJhY3QiLgogICovCiAKLXN0YXRpYyBfX2lubGluZV9fIF9fdTMyIGV4dHJhY3QoX191OCAqcmVwb3J0LCB1bnNpZ25lZCBvZmZzZXQsIHVuc2lnbmVkIG4pCitzdGF0aWMgX191MzIgZXh0cmFjdChjb25zdCBzdHJ1Y3QgaGlkX2RldmljZSAqaGlkLCBfX3U4ICpyZXBvcnQsCisJCSAgICAgdW5zaWduZWQgb2Zmc2V0LCB1bnNpZ25lZCBuKQogewogCXU2NCB4OwogCiAJaWYgKG4gPiAzMikKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiSElEOiBleHRyYWN0KCkgY2FsbGVkIHdpdGggbiAoJWQpID4gMzIhICglcylcbiIsCi0JCQkJbiwgY3VycmVudC0+Y29tbSk7CisJCWhpZF93YXJuKGhpZCwgImV4dHJhY3QoKSBjYWxsZWQgd2l0aCBuICglZCkgPiAzMiEgKCVzKVxuIiwKKwkJCSBuLCBjdXJyZW50LT5jb21tKTsKIAogCXJlcG9ydCArPSBvZmZzZXQgPj4gMzsgIC8qIGFkanVzdCBieXRlIGluZGV4ICovCiAJb2Zmc2V0ICY9IDc7ICAgICAgICAgICAgLyogbm93IG9ubHkgbmVlZCBiaXQgb2Zmc2V0IGludG8gb25lIGJ5dGUgKi8KQEAgLTc2MCwxOCArNzczLDE5IEBACiAgKiBlbmRpYW5uZXNzIG9mIHJlZ2lzdGVyIHZhbHVlcyBieSBjb25zaWRlcmluZyBhIHJlZ2lzdGVyCiAgKiBhICJjYWNoZWQiIGNvcHkgb2YgdGhlIGxpdHRsZSBlbmRpYWQgYml0IHN0cmVhbS4KICAqLwotc3RhdGljIF9faW5saW5lX18gdm9pZCBpbXBsZW1lbnQoX191OCAqcmVwb3J0LCB1bnNpZ25lZCBvZmZzZXQsIHVuc2lnbmVkIG4sIF9fdTMyIHZhbHVlKQorc3RhdGljIHZvaWQgaW1wbGVtZW50KGNvbnN0IHN0cnVjdCBoaWRfZGV2aWNlICpoaWQsIF9fdTggKnJlcG9ydCwKKwkJICAgICAgdW5zaWduZWQgb2Zmc2V0LCB1bnNpZ25lZCBuLCBfX3UzMiB2YWx1ZSkKIHsKIAl1NjQgeDsKIAl1NjQgbSA9ICgxVUxMIDw8IG4pIC0gMTsKIAogCWlmIChuID4gMzIpCi0JCXByaW50ayhLRVJOX1dBUk5JTkcgIkhJRDogaW1wbGVtZW50KCkgY2FsbGVkIHdpdGggbiAoJWQpID4gMzIhICglcylcbiIsCi0JCQkJbiwgY3VycmVudC0+Y29tbSk7CisJCWhpZF93YXJuKGhpZCwgIiVzKCkgY2FsbGVkIHdpdGggbiAoJWQpID4gMzIhICglcylcbiIsCisJCQkgX19mdW5jX18sIG4sIGN1cnJlbnQtPmNvbW0pOwogCiAJaWYgKHZhbHVlID4gbSkKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiSElEOiBpbXBsZW1lbnQoKSBjYWxsZWQgd2l0aCB0b28gbGFyZ2UgdmFsdWUgJWQhICglcylcbiIsCi0JCQkJdmFsdWUsIGN1cnJlbnQtPmNvbW0pOworCQloaWRfd2FybihoaWQsICIlcygpIGNhbGxlZCB3aXRoIHRvbyBsYXJnZSB2YWx1ZSAlZCEgKCVzKVxuIiwKKwkJCSBfX2Z1bmNfXywgdmFsdWUsIGN1cnJlbnQtPmNvbW0pOwogCVdBUk5fT04odmFsdWUgPiBtKTsKIAl2YWx1ZSAmPSBtOwogCkBAIC03ODgsNyArODAyLDcgQEAKICAqIFNlYXJjaCBhbiBhcnJheSBmb3IgYSB2YWx1ZS4KICAqLwogCi1zdGF0aWMgX19pbmxpbmVfXyBpbnQgc2VhcmNoKF9fczMyICphcnJheSwgX19zMzIgdmFsdWUsIHVuc2lnbmVkIG4pCitzdGF0aWMgaW50IHNlYXJjaChfX3MzMiAqYXJyYXksIF9fczMyIHZhbHVlLCB1bnNpZ25lZCBuKQogewogCXdoaWxlIChuLS0pIHsKIAkJaWYgKCphcnJheSsrID09IHZhbHVlKQpAQCAtODg3LDE4ICs5MDEsMjIgQEAKIAlfX3MzMiBtYXggPSBmaWVsZC0+bG9naWNhbF9tYXhpbXVtOwogCV9fczMyICp2YWx1ZTsKIAotCWlmICghKHZhbHVlID0ga21hbGxvYyhzaXplb2YoX19zMzIpICogY291bnQsIEdGUF9BVE9NSUMpKSkKKwl2YWx1ZSA9IGttYWxsb2Moc2l6ZW9mKF9fczMyKSAqIGNvdW50LCBHRlBfQVRPTUlDKTsKKwlpZiAoIXZhbHVlKQogCQlyZXR1cm47CiAKIAlmb3IgKG4gPSAwOyBuIDwgY291bnQ7IG4rKykgewogCi0JCQl2YWx1ZVtuXSA9IG1pbiA8IDAgPyBzbnRvMzIoZXh0cmFjdChkYXRhLCBvZmZzZXQgKyBuICogc2l6ZSwgc2l6ZSksIHNpemUpIDoKLQkJCQkJCSAgICBleHRyYWN0KGRhdGEsIG9mZnNldCArIG4gKiBzaXplLCBzaXplKTsKKwkJdmFsdWVbbl0gPSBtaW4gPCAwID8KKwkJCXNudG8zMihleHRyYWN0KGhpZCwgZGF0YSwgb2Zmc2V0ICsgbiAqIHNpemUsIHNpemUpLAorCQkJICAgICAgIHNpemUpIDoKKwkJCWV4dHJhY3QoaGlkLCBkYXRhLCBvZmZzZXQgKyBuICogc2l6ZSwgc2l6ZSk7CiAKLQkJCWlmICghKGZpZWxkLT5mbGFncyAmIEhJRF9NQUlOX0lURU1fVkFSSUFCTEUpIC8qIElnbm9yZSByZXBvcnQgaWYgRXJyb3JSb2xsT3ZlciAqLwotCQkJICAgICYmIHZhbHVlW25dID49IG1pbiAmJiB2YWx1ZVtuXSA8PSBtYXgKLQkJCSAgICAmJiBmaWVsZC0+dXNhZ2VbdmFsdWVbbl0gLSBtaW5dLmhpZCA9PSBISURfVVBfS0VZQk9BUkQgKyAxKQotCQkJCWdvdG8gZXhpdDsKKwkJLyogSWdub3JlIHJlcG9ydCBpZiBFcnJvclJvbGxPdmVyICovCisJCWlmICghKGZpZWxkLT5mbGFncyAmIEhJRF9NQUlOX0lURU1fVkFSSUFCTEUpICYmCisJCSAgICB2YWx1ZVtuXSA+PSBtaW4gJiYgdmFsdWVbbl0gPD0gbWF4ICYmCisJCSAgICBmaWVsZC0+dXNhZ2VbdmFsdWVbbl0gLSBtaW5dLmhpZCA9PSBISURfVVBfS0VZQk9BUkQgKyAxKQorCQkJZ290byBleGl0OwogCX0KIAogCWZvciAobiA9IDA7IG4gPCBjb3VudDsgbisrKSB7CkBAIC05MjgsNyArOTQ2LDggQEAKICAqIE91dHB1dCB0aGUgZmllbGQgaW50byB0aGUgcmVwb3J0LgogICovCiAKLXN0YXRpYyB2b2lkIGhpZF9vdXRwdXRfZmllbGQoc3RydWN0IGhpZF9maWVsZCAqZmllbGQsIF9fdTggKmRhdGEpCitzdGF0aWMgdm9pZCBoaWRfb3V0cHV0X2ZpZWxkKGNvbnN0IHN0cnVjdCBoaWRfZGV2aWNlICpoaWQsCisJCQkgICAgIHN0cnVjdCBoaWRfZmllbGQgKmZpZWxkLCBfX3U4ICpkYXRhKQogewogCXVuc2lnbmVkIGNvdW50ID0gZmllbGQtPnJlcG9ydF9jb3VudDsKIAl1bnNpZ25lZCBvZmZzZXQgPSBmaWVsZC0+cmVwb3J0X29mZnNldDsKQEAgLTkzNyw5ICs5NTYsMTEgQEAKIAogCWZvciAobiA9IDA7IG4gPCBjb3VudDsgbisrKSB7CiAJCWlmIChmaWVsZC0+bG9naWNhbF9taW5pbXVtIDwgMCkJLyogc2lnbmVkIHZhbHVlcyAqLwotCQkJaW1wbGVtZW50KGRhdGEsIG9mZnNldCArIG4gKiBzaXplLCBzaXplLCBzMzJ0b24oZmllbGQtPnZhbHVlW25dLCBzaXplKSk7CisJCQlpbXBsZW1lbnQoaGlkLCBkYXRhLCBvZmZzZXQgKyBuICogc2l6ZSwgc2l6ZSwKKwkJCQkgIHMzMnRvbihmaWVsZC0+dmFsdWVbbl0sIHNpemUpKTsKIAkJZWxzZQkJCQkvKiB1bnNpZ25lZCB2YWx1ZXMgKi8KLQkJCWltcGxlbWVudChkYXRhLCBvZmZzZXQgKyBuICogc2l6ZSwgc2l6ZSwgZmllbGQtPnZhbHVlW25dKTsKKwkJCWltcGxlbWVudChoaWQsIGRhdGEsIG9mZnNldCArIG4gKiBzaXplLCBzaXplLAorCQkJCSAgZmllbGQtPnZhbHVlW25dKTsKIAl9CiB9CiAKQEAgLTk1Niw3ICs5NzcsNyBAQAogCiAJbWVtc2V0KGRhdGEsIDAsICgocmVwb3J0LT5zaXplIC0gMSkgPj4gMykgKyAxKTsKIAlmb3IgKG4gPSAwOyBuIDwgcmVwb3J0LT5tYXhmaWVsZDsgbisrKQotCQloaWRfb3V0cHV0X2ZpZWxkKHJlcG9ydC0+ZmllbGRbbl0sIGRhdGEpOworCQloaWRfb3V0cHV0X2ZpZWxkKHJlcG9ydC0+ZGV2aWNlLCByZXBvcnQtPmZpZWxkW25dLCBkYXRhKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGhpZF9vdXRwdXRfcmVwb3J0KTsKIApAQCAtMTE2OSw4ICsxMTkwLDcgQEAKIAkJaGRldi0+Y2xhaW1lZCB8PSBISURfQ0xBSU1FRF9ISURSQVc7CiAKIAlpZiAoIWhkZXYtPmNsYWltZWQpIHsKLQkJZGV2X2VycigmaGRldi0+ZGV2LCAiY2xhaW1lZCBieSBuZWl0aGVyIGlucHV0LCBoaWRkZXYgbm9yICIKLQkJCQkiaGlkcmF3XG4iKTsKKwkJaGlkX2VycihoZGV2LCAiY2xhaW1lZCBieSBuZWl0aGVyIGlucHV0LCBoaWRkZXYgbm9yIGhpZHJhd1xuIik7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIApAQCAtMTIxMCw5ICsxMjMwLDkgQEAKIAkJYnVzID0gIjxVTktOT1dOPiI7CiAJfQogCi0JZGV2X2luZm8oJmhkZXYtPmRldiwgIiVzOiAlcyBISUQgdiV4LiUwMnggJXMgWyVzXSBvbiAlc1xuIiwKLQkJCWJ1ZiwgYnVzLCBoZGV2LT52ZXJzaW9uID4+IDgsIGhkZXYtPnZlcnNpb24gJiAweGZmLAotCQkJdHlwZSwgaGRldi0+bmFtZSwgaGRldi0+cGh5cyk7CisJaGlkX2luZm8oaGRldiwgIiVzOiAlcyBISUQgdiV4LiUwMnggJXMgWyVzXSBvbiAlc1xuIiwKKwkJIGJ1ZiwgYnVzLCBoZGV2LT52ZXJzaW9uID4+IDgsIGhkZXYtPnZlcnNpb24gJiAweGZmLAorCQkgdHlwZSwgaGRldi0+bmFtZSwgaGRldi0+cGh5cyk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTEyMzAsNyArMTI1MCw3IEBACiBFWFBPUlRfU1lNQk9MX0dQTChoaWRfZGlzY29ubmVjdCk7CiAKIC8qIGEgbGlzdCBvZiBkZXZpY2VzIGZvciB3aGljaCB0aGVyZSBpcyBhIHNwZWNpYWxpemVkIGRyaXZlciBvbiBISUQgYnVzICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhpZF9kZXZpY2VfaWQgaGlkX2JsYWNrbGlzdFtdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBoaWRfZGV2aWNlX2lkIGhpZF9oYXZlX3NwZWNpYWxfZHJpdmVyW10gPSB7CiAJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEXzNNLCBVU0JfREVWSUNFX0lEXzNNMTk2OCkgfSwKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfM00sIFVTQl9ERVZJQ0VfSURfM00yMjU2KSB9LAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9BNFRFQ0gsIFVTQl9ERVZJQ0VfSURfQTRURUNIX1dDUDMyUFUpIH0sCkBAIC0xMjc2LDYgKzEyOTYsMTIgQEAKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQVBQTEUsIFVTQl9ERVZJQ0VfSURfQVBQTEVfV0VMTFNQUklORzNfQU5TSSkgfSwKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQVBQTEUsIFVTQl9ERVZJQ0VfSURfQVBQTEVfV0VMTFNQUklORzNfSVNPKSB9LAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9BUFBMRSwgVVNCX0RFVklDRV9JRF9BUFBMRV9XRUxMU1BSSU5HM19KSVMpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0FQUExFLCBVU0JfREVWSUNFX0lEX0FQUExFX1dFTExTUFJJTkc0X0FOU0kpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0FQUExFLCBVU0JfREVWSUNFX0lEX0FQUExFX1dFTExTUFJJTkc0X0lTTykgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQVBQTEUsIFVTQl9ERVZJQ0VfSURfQVBQTEVfV0VMTFNQUklORzRfSklTKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9BUFBMRSwgVVNCX0RFVklDRV9JRF9BUFBMRV9XRUxMU1BSSU5HNEFfQU5TSSkgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQVBQTEUsIFVTQl9ERVZJQ0VfSURfQVBQTEVfV0VMTFNQUklORzRBX0lTTykgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQVBQTEUsIFVTQl9ERVZJQ0VfSURfQVBQTEVfV0VMTFNQUklORzRBX0pJUykgfSwKIAl7IEhJRF9CTFVFVE9PVEhfREVWSUNFKFVTQl9WRU5ET1JfSURfQVBQTEUsIFVTQl9ERVZJQ0VfSURfQVBQTEVfQUxVX1dJUkVMRVNTXzIwMDlfQU5TSSkgfSwKIAl7IEhJRF9CTFVFVE9PVEhfREVWSUNFKFVTQl9WRU5ET1JfSURfQVBQTEUsIFVTQl9ERVZJQ0VfSURfQVBQTEVfQUxVX1dJUkVMRVNTXzIwMDlfSVNPKSB9LAogCXsgSElEX0JMVUVUT09USF9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9BUFBMRSwgVVNCX0RFVklDRV9JRF9BUFBMRV9BTFVfV0lSRUxFU1NfMjAwOV9KSVMpIH0sCkBAIC0xMjkyLDYgKzEzMTgsNyBAQAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9DSEVSUlksIFVTQl9ERVZJQ0VfSURfQ0hFUlJZX0NZTU9USU9OKSB9LAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9DSEVSUlksIFVTQl9ERVZJQ0VfSURfQ0hFUlJZX0NZTU9USU9OX1NPTEFSKSB9LAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9DSElDT05ZLCBVU0JfREVWSUNFX0lEX0NISUNPTllfVEFDVElDQUxfUEFEKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9DSElDT05ZLCBVU0JfREVWSUNFX0lEX0NISUNPTllfV0lSRUxFU1MpIH0sCiAJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0NSRUFUSVZFTEFCUywgVVNCX0RFVklDRV9JRF9QUk9ESUtFWVNfUENNSURJKSB9LAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9DWVBSRVNTLCBVU0JfREVWSUNFX0lEX0NZUFJFU1NfQkFSQ09ERV8xKSB9LAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9DWVBSRVNTLCBVU0JfREVWSUNFX0lEX0NZUFJFU1NfQkFSQ09ERV8yKSB9LApAQCAtMTMwNCw2ICsxMzMxLDcgQEAKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfRFdBViwgVVNCX0RFVklDRV9JRF9EV0FWX0VHQUxBWF9NVUxUSVRPVUNIMykgfSwKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfRFdBViwgVVNCX0RFVklDRV9JRF9EV0FWX0VHQUxBWF9NVUxUSVRPVUNINCkgfSwKIAl7IEhJRF9CTFVFVE9PVEhfREVWSUNFKFVTQl9WRU5ET1JfSURfRUxFQ09NLCBVU0JfREVWSUNFX0lEX0VMRUNPTV9CTTA4NCkgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfRU1TLCBVU0JfREVWSUNFX0lEX0VNU19UUklPX0xJTktFUl9QTFVTX0lJKSB9LAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9FWktFWSwgVVNCX0RFVklDRV9JRF9CVENfODE5MykgfSwKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfR0FNRVJPTiwgVVNCX0RFVklDRV9JRF9HQU1FUk9OX0RVQUxfUFNYX0FEQVBUT1IpIH0sCiAJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0dBTUVST04sIFVTQl9ERVZJQ0VfSURfR0FNRVJPTl9EVUFMX1BDU19BREFQVE9SKSB9LApAQCAtMTM3Miw2ICsxNDAwLDcgQEAKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfUVVBTlRBLCBVU0JfREVWSUNFX0lEX1FVQU5UQV9PUFRJQ0FMX1RPVUNIKSB9LAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9RVUFOVEEsIFVTQl9ERVZJQ0VfSURfUElYQVJUX0lNQUdJTkdfSU5DX09QVElDQUxfVE9VQ0hfU0NSRUVOKSB9LAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9ST0NDQVQsIFVTQl9ERVZJQ0VfSURfUk9DQ0FUX0tPTkUpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX1JPQ0NBVCwgVVNCX0RFVklDRV9JRF9ST0NDQVRfS09ORVBMVVMpIH0sCiAJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX1JPQ0NBVCwgVVNCX0RFVklDRV9JRF9ST0NDQVRfUFlSQV9XSVJFRCkgfSwKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfU0FNU1VORywgVVNCX0RFVklDRV9JRF9TQU1TVU5HX0lSX1JFTU9URSkgfSwKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfU0FNU1VORywgVVNCX0RFVklDRV9JRF9TQU1TVU5HX1dJUkVMRVNTX0tCRF9NT1VTRSkgfSwKQEAgLTE0OTksOSArMTUyOCw5IEBACiAJaWYgKCFoaWRfbWF0Y2hfZGV2aWNlKGhkZXYsIGhkcnYpKQogCQlyZXR1cm4gMDsKIAotCS8qIGdlbmVyaWMgd2FudHMgYWxsIG5vbi1ibGFja2xpc3RlZCAqLworCS8qIGdlbmVyaWMgd2FudHMgYWxsIHRoYXQgZG9uJ3QgaGF2ZSBzcGVjaWFsaXplZCBkcml2ZXIgKi8KIAlpZiAoIXN0cm5jbXAoaGRydi0+bmFtZSwgImdlbmVyaWMtIiwgOCkpCi0JCXJldHVybiAhaGlkX21hdGNoX2lkKGhkZXYsIGhpZF9ibGFja2xpc3QpOworCQlyZXR1cm4gIWhpZF9tYXRjaF9pZChoZGV2LCBoaWRfaGF2ZV9zcGVjaWFsX2RyaXZlcik7CiAKIAlyZXR1cm4gMTsKIH0KQEAgLTE3NjEsNiArMTc5MCwxMiBAQAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9BUFBMRSwgVVNCX0RFVklDRV9JRF9BUFBMRV9XRUxMU1BSSU5HM19BTlNJKSB9LAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9BUFBMRSwgVVNCX0RFVklDRV9JRF9BUFBMRV9XRUxMU1BSSU5HM19JU08pIH0sCiAJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0FQUExFLCBVU0JfREVWSUNFX0lEX0FQUExFX1dFTExTUFJJTkczX0pJUykgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQVBQTEUsIFVTQl9ERVZJQ0VfSURfQVBQTEVfV0VMTFNQUklORzRfQU5TSSkgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQVBQTEUsIFVTQl9ERVZJQ0VfSURfQVBQTEVfV0VMTFNQUklORzRfSVNPKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9BUFBMRSwgVVNCX0RFVklDRV9JRF9BUFBMRV9XRUxMU1BSSU5HNF9KSVMpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0FQUExFLCBVU0JfREVWSUNFX0lEX0FQUExFX1dFTExTUFJJTkc0QV9BTlNJKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9BUFBMRSwgVVNCX0RFVklDRV9JRF9BUFBMRV9XRUxMU1BSSU5HNEFfSVNPKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9BUFBMRSwgVVNCX0RFVklDRV9JRF9BUFBMRV9XRUxMU1BSSU5HNEFfSklTKSB9LAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9BUFBMRSwgVVNCX0RFVklDRV9JRF9BUFBMRV9GT1VOVEFJTl9UUF9PTkxZKSB9LAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9BUFBMRSwgVVNCX0RFVklDRV9JRF9BUFBMRV9HRVlTRVIxX1RQX09OTFkpIH0sCiAJeyB9CkBAIC0xOTUyLDEyICsxOTg3LDEyIEBACiAJaW50IHJldDsKIAogCWlmIChoaWRfZGVidWcpCi0JCXByaW50ayhLRVJOX1dBUk5JTkcgIkhJRDogaGlkX2RlYnVnIGlzIG5vdyB1c2VkIHNvbGVseSBmb3IgcGFyc2VyIGFuZCBkcml2ZXIgZGVidWdnaW5nLlxuIgotCQkJCSJISUQ6IGRlYnVnZnMgaXMgbm93IHVzZWQgZm9yIGluc3BlY3RpbmcgdGhlIGRldmljZSAocmVwb3J0IGRlc2NyaXB0b3IsIHJlcG9ydHMpXG4iKTsKKwkJcHJfd2FybigiaGlkX2RlYnVnIGlzIG5vdyB1c2VkIHNvbGVseSBmb3IgcGFyc2VyIGFuZCBkcml2ZXIgZGVidWdnaW5nLlxuIgorCQkJImRlYnVnZnMgaXMgbm93IHVzZWQgZm9yIGluc3BlY3RpbmcgdGhlIGRldmljZSAocmVwb3J0IGRlc2NyaXB0b3IsIHJlcG9ydHMpXG4iKTsKIAogCXJldCA9IGJ1c19yZWdpc3RlcigmaGlkX2J1c190eXBlKTsKIAlpZiAocmV0KSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiSElEOiBjYW4ndCByZWdpc3RlciBoaWQgYnVzXG4iKTsKKwkJcHJfZXJyKCJjYW4ndCByZWdpc3RlciBoaWQgYnVzXG4iKTsKIAkJZ290byBlcnI7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC9oaWQtY3lwcmVzcy5jIGIvZHJpdmVycy9oaWQvaGlkLWN5cHJlc3MuYwppbmRleCA0Y2QwZTIzLi4yZjBiZTRjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC9oaWQtY3lwcmVzcy5jCisrKyBiL2RyaXZlcnMvaGlkL2hpZC1jeXByZXNzLmMKQEAgLTEwNywxMyArMTA3LDEzIEBACiAKIAlyZXQgPSBoaWRfcGFyc2UoaGRldik7CiAJaWYgKHJldCkgewotCQlkZXZfZXJyKCZoZGV2LT5kZXYsICJwYXJzZSBmYWlsZWRcbiIpOworCQloaWRfZXJyKGhkZXYsICJwYXJzZSBmYWlsZWRcbiIpOwogCQlnb3RvIGVycl9mcmVlOwogCX0KIAogCXJldCA9IGhpZF9od19zdGFydChoZGV2LCBISURfQ09OTkVDVF9ERUZBVUxUKTsKIAlpZiAocmV0KSB7Ci0JCWRldl9lcnIoJmhkZXYtPmRldiwgImh3IHN0YXJ0IGZhaWxlZFxuIik7CisJCWhpZF9lcnIoaGRldiwgImh3IHN0YXJ0IGZhaWxlZFxuIik7CiAJCWdvdG8gZXJyX2ZyZWU7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC9oaWQtZGVidWcuYyBiL2RyaXZlcnMvaGlkL2hpZC1kZWJ1Zy5jCmluZGV4IDc1YzVlMjMuLjU1NTM4MmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaGlkL2hpZC1kZWJ1Zy5jCisrKyBiL2RyaXZlcnMvaGlkL2hpZC1kZWJ1Zy5jCkBAIC0yNiw2ICsyNiw4IEBACiAgKiBWb2p0ZWNoIFBhdmxpaywgU2ltdW5rb3ZhIDE1OTQsIFByYWd1ZSA4LCAxODIgMDAgQ3plY2ggUmVwdWJsaWMKICAqLwogCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisKICNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgpAQCAtMzkzLDcgKzM5NSw3IEBACiAKIAlidWYgPSByZXNvbHZfdXNhZ2VfcGFnZSh1c2FnZSA+PiAxNiwgZik7CiAJaWYgKElTX0VSUihidWYpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiZXJyb3IgYWxsb2NhdGluZyBISUQgZGVidWcgYnVmZmVyXG4iKTsKKwkJcHJfZXJyKCJlcnJvciBhbGxvY2F0aW5nIEhJRCBkZWJ1ZyBidWZmZXJcbiIpOwogCQlyZXR1cm4gTlVMTDsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL2hpZC1kcmZmLmMgYi9kcml2ZXJzL2hpZC9oaWQtZHJmZi5jCmluZGV4IDk2OGIwNGYuLmFmY2YzZDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaGlkL2hpZC1kcmZmLmMKKysrIGIvZHJpdmVycy9oaWQvaGlkLWRyZmYuYwpAQCAtOTYsMTggKzk2LDE4IEBACiAJaW50IGVycm9yOwogCiAJaWYgKGxpc3RfZW1wdHkocmVwb3J0X2xpc3QpKSB7Ci0JCWRldl9lcnIoJmhpZC0+ZGV2LCAibm8gb3V0cHV0IHJlcG9ydHMgZm91bmRcbiIpOworCQloaWRfZXJyKGhpZCwgIm5vIG91dHB1dCByZXBvcnRzIGZvdW5kXG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCiAJcmVwb3J0ID0gbGlzdF9maXJzdF9lbnRyeShyZXBvcnRfbGlzdCwgc3RydWN0IGhpZF9yZXBvcnQsIGxpc3QpOwogCWlmIChyZXBvcnQtPm1heGZpZWxkIDwgMSkgewotCQlkZXZfZXJyKCZoaWQtPmRldiwgIm5vIGZpZWxkcyBpbiB0aGUgcmVwb3J0XG4iKTsKKwkJaGlkX2VycihoaWQsICJubyBmaWVsZHMgaW4gdGhlIHJlcG9ydFxuIik7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIAogCWlmIChyZXBvcnQtPmZpZWxkWzBdLT5yZXBvcnRfY291bnQgPCA3KSB7Ci0JCWRldl9lcnIoJmhpZC0+ZGV2LCAibm90IGVub3VnaCB2YWx1ZXMgaW4gdGhlIGZpZWxkXG4iKTsKKwkJaGlkX2VycihoaWQsICJub3QgZW5vdWdoIHZhbHVlcyBpbiB0aGUgZmllbGRcbiIpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKQEAgLTEzMyw4ICsxMzMsOCBAQAogCWRyZmYtPnJlcG9ydC0+ZmllbGRbMF0tPnZhbHVlWzZdID0gMHgwMDsKIAl1c2JoaWRfc3VibWl0X3JlcG9ydChoaWQsIGRyZmYtPnJlcG9ydCwgVVNCX0RJUl9PVVQpOwogCi0JZGV2X2luZm8oJmhpZC0+ZGV2LCAiRm9yY2UgRmVlZGJhY2sgZm9yIERyYWdvblJpc2UgSW5jLiBnYW1lICIKLQkgICAgICAgImNvbnRyb2xsZXJzIGJ5IFJpY2hhcmQgV2FsbXNsZXkgPHJpY2h3YWxtQGdtYWlsLmNvbT5cbiIpOworCWhpZF9pbmZvKGhpZCwgIkZvcmNlIEZlZWRiYWNrIGZvciBEcmFnb25SaXNlIEluYy4gIgorCQkgImdhbWUgY29udHJvbGxlcnMgYnkgUmljaGFyZCBXYWxtc2xleSA8cmljaHdhbG1AZ21haWwuY29tPlxuIik7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTE1MywxMyArMTUzLDEzIEBACiAKIAlyZXQgPSBoaWRfcGFyc2UoaGRldik7CiAJaWYgKHJldCkgewotCQlkZXZfZXJyKCZoZGV2LT5kZXYsICJwYXJzZSBmYWlsZWRcbiIpOworCQloaWRfZXJyKGhkZXYsICJwYXJzZSBmYWlsZWRcbiIpOwogCQlnb3RvIGVycjsKIAl9CiAKIAlyZXQgPSBoaWRfaHdfc3RhcnQoaGRldiwgSElEX0NPTk5FQ1RfREVGQVVMVCAmIH5ISURfQ09OTkVDVF9GRik7CiAJaWYgKHJldCkgewotCQlkZXZfZXJyKCZoZGV2LT5kZXYsICJodyBzdGFydCBmYWlsZWRcbiIpOworCQloaWRfZXJyKGhkZXYsICJodyBzdGFydCBmYWlsZWRcbiIpOwogCQlnb3RvIGVycjsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL2hpZC1lZ2FsYXguYyBiL2RyaXZlcnMvaGlkL2hpZC1lZ2FsYXguYwppbmRleCA4ZmJmZjIzLi4wM2JlZTE5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC9oaWQtZWdhbGF4LmMKKysrIGIvZHJpdmVycy9oaWQvaGlkLWVnYWxheC5jCkBAIC0yMDAsNyArMjAwLDcgQEAKIAogCXRkID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGVnYWxheF9kYXRhKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCF0ZCkgewotCQlkZXZfZXJyKCZoZGV2LT5kZXYsICJjYW5ub3QgYWxsb2NhdGUgZUdhbGF4IGRhdGFcbiIpOworCQloaWRfZXJyKGhkZXYsICJjYW5ub3QgYWxsb2NhdGUgZUdhbGF4IGRhdGFcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAJaGlkX3NldF9kcnZkYXRhKGhkZXYsIHRkKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL2hpZC1lbGVjb20uYyBiL2RyaXZlcnMvaGlkL2hpZC1lbGVjb20uYwppbmRleCA2ZTMxZjMwLi43OWQwYzYxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC9oaWQtZWxlY29tLmMKKysrIGIvZHJpdmVycy9oaWQvaGlkLWVsZWNvbS5jCkBAIC0yNCw4ICsyNCw3IEBACiAJCXVuc2lnbmVkIGludCAqcnNpemUpCiB7CiAJaWYgKCpyc2l6ZSA+PSA0OCAmJiByZGVzY1s0Nl0gPT0gMHgwNSAmJiByZGVzY1s0N10gPT0gMHgwYykgewotCQlkZXZfaW5mbygmaGRldi0+ZGV2LCAiRml4aW5nIHVwIEVsZWNvbSBCTTA4NCAiCi0JCQkJInJlcG9ydCBkZXNjcmlwdG9yLlxuIik7CisJCWhpZF9pbmZvKGhkZXYsICJGaXhpbmcgdXAgRWxlY29tIEJNMDg0IHJlcG9ydCBkZXNjcmlwdG9yXG4iKTsKIAkJcmRlc2NbNDddID0gMHgwMDsKIAl9CiAgICAgcmV0dXJuIHJkZXNjOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvaGlkLWVtc2ZmLmMgYi9kcml2ZXJzL2hpZC9oaWQtZW1zZmYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTg3N2M2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9oaWQvaGlkLWVtc2ZmLmMKQEAgLTAsMCArMSwxNjEgQEAKKy8qCisgKiAgRm9yY2UgZmVlZGJhY2sgc3VwcG9ydCBmb3IgRU1TIFRyaW8gTGlua2VyIFBsdXMgSUkKKyAqCisgKiAgQ29weXJpZ2h0IChjKSAyMDEwIElnbmF6IEZvcnN0ZXIgPGlnbmF6LmZvcnN0ZXJAZ214LmRlPgorICovCisKKy8qCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKworI2luY2x1ZGUgPGxpbnV4L2hpZC5oPgorI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CisjaW5jbHVkZSA8bGludXgvdXNiLmg+CisKKyNpbmNsdWRlICJoaWQtaWRzLmgiCisjaW5jbHVkZSAidXNiaGlkL3VzYmhpZC5oIgorCitzdHJ1Y3QgZW1zZmZfZGV2aWNlIHsKKwlzdHJ1Y3QgaGlkX3JlcG9ydCAqcmVwb3J0OworfTsKKworc3RhdGljIGludCBlbXNmZl9wbGF5KHN0cnVjdCBpbnB1dF9kZXYgKmRldiwgdm9pZCAqZGF0YSwKKwkJCSBzdHJ1Y3QgZmZfZWZmZWN0ICplZmZlY3QpCit7CisJc3RydWN0IGhpZF9kZXZpY2UgKmhpZCA9IGlucHV0X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGVtc2ZmX2RldmljZSAqZW1zZmYgPSBkYXRhOworCWludCB3ZWFrLCBzdHJvbmc7CisKKwl3ZWFrID0gZWZmZWN0LT51LnJ1bWJsZS53ZWFrX21hZ25pdHVkZTsKKwlzdHJvbmcgPSBlZmZlY3QtPnUucnVtYmxlLnN0cm9uZ19tYWduaXR1ZGU7CisKKwlkYmdfaGlkKCJjYWxsZWQgd2l0aCAweCUwNHggMHglMDR4XG4iLCBzdHJvbmcsIHdlYWspOworCisJd2VhayA9IHdlYWsgKiAweGZmIC8gMHhmZmZmOworCXN0cm9uZyA9IHN0cm9uZyAqIDB4ZmYgLyAweGZmZmY7CisKKwllbXNmZi0+cmVwb3J0LT5maWVsZFswXS0+dmFsdWVbMV0gPSB3ZWFrOworCWVtc2ZmLT5yZXBvcnQtPmZpZWxkWzBdLT52YWx1ZVsyXSA9IHN0cm9uZzsKKworCWRiZ19oaWQoInJ1bm5pbmcgd2l0aCAweCUwMnggMHglMDJ4XG4iLCBzdHJvbmcsIHdlYWspOworCXVzYmhpZF9zdWJtaXRfcmVwb3J0KGhpZCwgZW1zZmYtPnJlcG9ydCwgVVNCX0RJUl9PVVQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZW1zZmZfaW5pdChzdHJ1Y3QgaGlkX2RldmljZSAqaGlkKQoreworCXN0cnVjdCBlbXNmZl9kZXZpY2UgKmVtc2ZmOworCXN0cnVjdCBoaWRfcmVwb3J0ICpyZXBvcnQ7CisJc3RydWN0IGhpZF9pbnB1dCAqaGlkaW5wdXQgPSBsaXN0X2ZpcnN0X2VudHJ5KCZoaWQtPmlucHV0cywKKwkJCQkJCXN0cnVjdCBoaWRfaW5wdXQsIGxpc3QpOworCXN0cnVjdCBsaXN0X2hlYWQgKnJlcG9ydF9saXN0ID0KKwkJCSZoaWQtPnJlcG9ydF9lbnVtW0hJRF9PVVRQVVRfUkVQT1JUXS5yZXBvcnRfbGlzdDsKKwlzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYgPSBoaWRpbnB1dC0+aW5wdXQ7CisJaW50IGVycm9yOworCisJaWYgKGxpc3RfZW1wdHkocmVwb3J0X2xpc3QpKSB7CisJCWhpZF9lcnIoaGlkLCAibm8gb3V0cHV0IHJlcG9ydHMgZm91bmRcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlyZXBvcnQgPSBsaXN0X2ZpcnN0X2VudHJ5KHJlcG9ydF9saXN0LCBzdHJ1Y3QgaGlkX3JlcG9ydCwgbGlzdCk7CisJaWYgKHJlcG9ydC0+bWF4ZmllbGQgPCAxKSB7CisJCWhpZF9lcnIoaGlkLCAibm8gZmllbGRzIGluIHRoZSByZXBvcnRcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlpZiAocmVwb3J0LT5maWVsZFswXS0+cmVwb3J0X2NvdW50IDwgNykgeworCQloaWRfZXJyKGhpZCwgIm5vdCBlbm91Z2ggdmFsdWVzIGluIHRoZSBmaWVsZFxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWVtc2ZmID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGVtc2ZmX2RldmljZSksIEdGUF9LRVJORUwpOworCWlmICghZW1zZmYpCisJCXJldHVybiAtRU5PTUVNOworCisJc2V0X2JpdChGRl9SVU1CTEUsIGRldi0+ZmZiaXQpOworCisJZXJyb3IgPSBpbnB1dF9mZl9jcmVhdGVfbWVtbGVzcyhkZXYsIGVtc2ZmLCBlbXNmZl9wbGF5KTsKKwlpZiAoZXJyb3IpIHsKKwkJa2ZyZWUoZW1zZmYpOworCQlyZXR1cm4gZXJyb3I7CisJfQorCisJZW1zZmYtPnJlcG9ydCA9IHJlcG9ydDsKKwllbXNmZi0+cmVwb3J0LT5maWVsZFswXS0+dmFsdWVbMF0gPSAweDAxOworCWVtc2ZmLT5yZXBvcnQtPmZpZWxkWzBdLT52YWx1ZVsxXSA9IDB4MDA7CisJZW1zZmYtPnJlcG9ydC0+ZmllbGRbMF0tPnZhbHVlWzJdID0gMHgwMDsKKwllbXNmZi0+cmVwb3J0LT5maWVsZFswXS0+dmFsdWVbM10gPSAweDAwOworCWVtc2ZmLT5yZXBvcnQtPmZpZWxkWzBdLT52YWx1ZVs0XSA9IDB4MDA7CisJZW1zZmYtPnJlcG9ydC0+ZmllbGRbMF0tPnZhbHVlWzVdID0gMHgwMDsKKwllbXNmZi0+cmVwb3J0LT5maWVsZFswXS0+dmFsdWVbNl0gPSAweDAwOworCXVzYmhpZF9zdWJtaXRfcmVwb3J0KGhpZCwgZW1zZmYtPnJlcG9ydCwgVVNCX0RJUl9PVVQpOworCisJaGlkX2luZm8oaGlkLCAiZm9yY2UgZmVlZGJhY2sgZm9yIEVNUyBiYXNlZCBkZXZpY2VzIGJ5IElnbmF6IEZvcnN0ZXIgPGlnbmF6LmZvcnN0ZXJAZ214LmRlPlxuIik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBlbXNfcHJvYmUoc3RydWN0IGhpZF9kZXZpY2UgKmhkZXYsIGNvbnN0IHN0cnVjdCBoaWRfZGV2aWNlX2lkICppZCkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gaGlkX3BhcnNlKGhkZXYpOworCWlmIChyZXQpIHsKKwkJaGlkX2VycihoZGV2LCAicGFyc2UgZmFpbGVkXG4iKTsKKwkJZ290byBlcnI7CisJfQorCisJcmV0ID0gaGlkX2h3X3N0YXJ0KGhkZXYsIEhJRF9DT05ORUNUX0RFRkFVTFQgJiB+SElEX0NPTk5FQ1RfRkYpOworCWlmIChyZXQpIHsKKwkJaGlkX2VycihoZGV2LCAiaHcgc3RhcnQgZmFpbGVkXG4iKTsKKwkJZ290byBlcnI7CisJfQorCisJZW1zZmZfaW5pdChoZGV2KTsKKworCXJldHVybiAwOworZXJyOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGlkX2RldmljZV9pZCBlbXNfZGV2aWNlc1tdID0geworCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9FTVMsIDB4MTE4KSB9LAorCXsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUoaGlkLCBlbXNfZGV2aWNlcyk7CisKK3N0YXRpYyBzdHJ1Y3QgaGlkX2RyaXZlciBlbXNfZHJpdmVyID0geworCS5uYW1lID0gImhrZW1zIiwKKwkuaWRfdGFibGUgPSBlbXNfZGV2aWNlcywKKwkucHJvYmUgPSBlbXNfcHJvYmUsCit9OworCitzdGF0aWMgaW50IGVtc19pbml0KHZvaWQpCit7CisJcmV0dXJuIGhpZF9yZWdpc3Rlcl9kcml2ZXIoJmVtc19kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBlbXNfZXhpdCh2b2lkKQoreworCWhpZF91bnJlZ2lzdGVyX2RyaXZlcigmZW1zX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGVtc19pbml0KTsKK21vZHVsZV9leGl0KGVtc19leGl0KTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvaGlkLWdhZmYuYyBiL2RyaXZlcnMvaGlkL2hpZC1nYWZmLmMKaW5kZXggODhkZmNmNC4uMjc5YmE1MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvaGlkLWdhZmYuYworKysgYi9kcml2ZXJzL2hpZC9oaWQtZ2FmZi5jCkBAIC04Nyw3ICs4Nyw3IEBACiAJaW50IGVycm9yOwogCiAJaWYgKGxpc3RfZW1wdHkocmVwb3J0X2xpc3QpKSB7Ci0JCWRldl9lcnIoJmhpZC0+ZGV2LCAibm8gb3V0cHV0IHJlcG9ydHMgZm91bmRcbiIpOworCQloaWRfZXJyKGhpZCwgIm5vIG91dHB1dCByZXBvcnRzIGZvdW5kXG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCkBAIC05NSwxMiArOTUsMTIgQEAKIAogCXJlcG9ydCA9IGxpc3RfZW50cnkocmVwb3J0X3B0ciwgc3RydWN0IGhpZF9yZXBvcnQsIGxpc3QpOwogCWlmIChyZXBvcnQtPm1heGZpZWxkIDwgMSkgewotCQlkZXZfZXJyKCZoaWQtPmRldiwgIm5vIGZpZWxkcyBpbiB0aGUgcmVwb3J0XG4iKTsKKwkJaGlkX2VycihoaWQsICJubyBmaWVsZHMgaW4gdGhlIHJlcG9ydFxuIik7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIAogCWlmIChyZXBvcnQtPmZpZWxkWzBdLT5yZXBvcnRfY291bnQgPCA2KSB7Ci0JCWRldl9lcnIoJmhpZC0+ZGV2LCAibm90IGVub3VnaCB2YWx1ZXMgaW4gdGhlIGZpZWxkXG4iKTsKKwkJaGlkX2VycihoaWQsICJub3QgZW5vdWdoIHZhbHVlcyBpbiB0aGUgZmllbGRcbiIpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKQEAgLTEyOCw4ICsxMjgsNyBAQAogCiAJdXNiaGlkX3N1Ym1pdF9yZXBvcnQoaGlkLCBnYWZmLT5yZXBvcnQsIFVTQl9ESVJfT1VUKTsKIAotCWRldl9pbmZvKCZoaWQtPmRldiwgIkZvcmNlIEZlZWRiYWNrIGZvciBHcmVlbkFzaWEgMHgxMiIKLQkgICAgICAgIiBkZXZpY2VzIGJ5IEx1a2FzeiBMdWJvamFuc2tpIDxsdWthc3pAbHVib2phbnNraS5pbmZvPlxuIik7CisJaGlkX2luZm8oaGlkLCAiRm9yY2UgRmVlZGJhY2sgZm9yIEdyZWVuQXNpYSAweDEyIGRldmljZXMgYnkgTHVrYXN6IEx1Ym9qYW5za2kgPGx1a2FzekBsdWJvamFuc2tpLmluZm8+XG4iKTsKIAogCXJldHVybiAwOwogfQpAQCAtMTQ4LDEzICsxNDcsMTMgQEAKIAogCXJldCA9IGhpZF9wYXJzZShoZGV2KTsKIAlpZiAocmV0KSB7Ci0JCWRldl9lcnIoJmhkZXYtPmRldiwgInBhcnNlIGZhaWxlZFxuIik7CisJCWhpZF9lcnIoaGRldiwgInBhcnNlIGZhaWxlZFxuIik7CiAJCWdvdG8gZXJyOwogCX0KIAogCXJldCA9IGhpZF9od19zdGFydChoZGV2LCBISURfQ09OTkVDVF9ERUZBVUxUICYgfkhJRF9DT05ORUNUX0ZGKTsKIAlpZiAocmV0KSB7Ci0JCWRldl9lcnIoJmhkZXYtPmRldiwgImh3IHN0YXJ0IGZhaWxlZFxuIik7CisJCWhpZF9lcnIoaGRldiwgImh3IHN0YXJ0IGZhaWxlZFxuIik7CiAJCWdvdG8gZXJyOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvaGlkLWlkcy5oIGIvZHJpdmVycy9oaWQvaGlkLWlkcy5oCmluZGV4IDhlMTFhZjguLmY2NWNhY2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaGlkL2hpZC1pZHMuaAorKysgYi9kcml2ZXJzL2hpZC9oaWQtaWRzLmgKQEAgLTk3LDYgKzk3LDEyIEBACiAjZGVmaW5lIFVTQl9ERVZJQ0VfSURfQVBQTEVfV0VMTFNQUklORzNfQU5TSQkweDAyMzYKICNkZWZpbmUgVVNCX0RFVklDRV9JRF9BUFBMRV9XRUxMU1BSSU5HM19JU08JMHgwMjM3CiAjZGVmaW5lIFVTQl9ERVZJQ0VfSURfQVBQTEVfV0VMTFNQUklORzNfSklTCTB4MDIzOAorI2RlZmluZSBVU0JfREVWSUNFX0lEX0FQUExFX1dFTExTUFJJTkc0X0FOU0kJMHgwMjNmCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfQVBQTEVfV0VMTFNQUklORzRfSVNPCTB4MDI0MAorI2RlZmluZSBVU0JfREVWSUNFX0lEX0FQUExFX1dFTExTUFJJTkc0X0pJUwkweDAyNDEKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9BUFBMRV9XRUxMU1BSSU5HNEFfQU5TSQkweDAyNDIKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9BUFBMRV9XRUxMU1BSSU5HNEFfSVNPCTB4MDI0MworI2RlZmluZSBVU0JfREVWSUNFX0lEX0FQUExFX1dFTExTUFJJTkc0QV9KSVMJMHgwMjQ0CiAjZGVmaW5lIFVTQl9ERVZJQ0VfSURfQVBQTEVfQUxVX1dJUkVMRVNTXzIwMDlfQU5TSSAgMHgwMjM5CiAjZGVmaW5lIFVTQl9ERVZJQ0VfSURfQVBQTEVfQUxVX1dJUkVMRVNTXzIwMDlfSVNPICAgMHgwMjNhCiAjZGVmaW5lIFVTQl9ERVZJQ0VfSURfQVBQTEVfQUxVX1dJUkVMRVNTXzIwMDlfSklTICAgMHgwMjNiCkBAIC0xNTYsNiArMTYyLDcgQEAKICNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9DSElDT05ZCQkweDA0ZjIKICNkZWZpbmUgVVNCX0RFVklDRV9JRF9DSElDT05ZX1RBQ1RJQ0FMX1BBRAkweDA0MTgKICNkZWZpbmUgVVNCX0RFVklDRV9JRF9DSElDT05ZX01VTFRJX1RPVUNICTB4YjE5ZAorI2RlZmluZSBVU0JfREVWSUNFX0lEX0NISUNPTllfV0lSRUxFU1MJMHgwNjE4CiAKICNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9DSURDCQkweDE2NzcKIApAQCAtMjA4LDYgKzIxNSw5IEBACiAjZGVmaW5lIFVTQl9WRU5ET1JfSURfRUxPCQkweDA0RTcKICNkZWZpbmUgVVNCX0RFVklDRV9JRF9FTE9fVFMyNzAwCTB4MDAyMAogCisjZGVmaW5lIFVTQl9WRU5ET1JfSURfRU1TCQkweDIwMDYKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9FTVNfVFJJT19MSU5LRVJfUExVU19JSSAweDAxMTgKKwogI2RlZmluZSBVU0JfVkVORE9SX0lEX0VTU0VOVElBTF9SRUFMSVRZCTB4MGQ3ZgogI2RlZmluZSBVU0JfREVWSUNFX0lEX0VTU0VOVElBTF9SRUFMSVRZX1A1IDB4MDEwMAogCkBAIC00ODAsNiArNDkwLDcgQEAKIAogI2RlZmluZSBVU0JfVkVORE9SX0lEX1JPQ0NBVAkJMHgxZTdkCiAjZGVmaW5lIFVTQl9ERVZJQ0VfSURfUk9DQ0FUX0tPTkUJMHgyY2VkCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfUk9DQ0FUX0tPTkVQTFVTCTB4MmQ1MQogI2RlZmluZSBVU0JfREVWSUNFX0lEX1JPQ0NBVF9QWVJBX1dJUkVECTB4MmMyNAogI2RlZmluZSBVU0JfREVWSUNFX0lEX1JPQ0NBVF9QWVJBX1dJUkVMRVNTCTB4MmNmNgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC9oaWQtaW5wdXQuYyBiL2RyaXZlcnMvaGlkL2hpZC1pbnB1dC5jCmluZGV4IGQ4ZDM3MmIuLmU2MGZkYjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaGlkL2hpZC1pbnB1dC5jCisrKyBiL2RyaXZlcnMvaGlkL2hpZC1pbnB1dC5jCkBAIC0zMTksMjEgKzMxOSwyMSBAQAogCiAJCXN3aXRjaCAoZmllbGQtPmFwcGxpY2F0aW9uKSB7CiAJCWNhc2UgSElEX0dEX01PVVNFOgotCQljYXNlIEhJRF9HRF9QT0lOVEVSOiAgY29kZSArPSAweDExMDsgYnJlYWs7CisJCWNhc2UgSElEX0dEX1BPSU5URVI6ICBjb2RlICs9IEJUTl9NT1VTRTsgYnJlYWs7CiAJCWNhc2UgSElEX0dEX0pPWVNUSUNLOgogCQkJCWlmIChjb2RlIDw9IDB4ZikKIAkJCQkJY29kZSArPSBCVE5fSk9ZU1RJQ0s7CiAJCQkJZWxzZQogCQkJCQljb2RlICs9IEJUTl9UUklHR0VSX0hBUFBZOwogCQkJCWJyZWFrOwotCQljYXNlIEhJRF9HRF9HQU1FUEFEOiAgY29kZSArPSAweDEzMDsgYnJlYWs7CisJCWNhc2UgSElEX0dEX0dBTUVQQUQ6ICBjb2RlICs9IEJUTl9HQU1FUEFEOyBicmVhazsKIAkJZGVmYXVsdDoKIAkJCXN3aXRjaCAoZmllbGQtPnBoeXNpY2FsKSB7CiAJCQljYXNlIEhJRF9HRF9NT1VTRToKLQkJCWNhc2UgSElEX0dEX1BPSU5URVI6ICBjb2RlICs9IDB4MTEwOyBicmVhazsKLQkJCWNhc2UgSElEX0dEX0pPWVNUSUNLOiBjb2RlICs9IDB4MTIwOyBicmVhazsKLQkJCWNhc2UgSElEX0dEX0dBTUVQQUQ6ICBjb2RlICs9IDB4MTMwOyBicmVhazsKLQkJCWRlZmF1bHQ6ICAgICAgICAgICAgICBjb2RlICs9IDB4MTAwOworCQkJY2FzZSBISURfR0RfUE9JTlRFUjogIGNvZGUgKz0gQlROX01PVVNFOyBicmVhazsKKwkJCWNhc2UgSElEX0dEX0pPWVNUSUNLOiBjb2RlICs9IEJUTl9KT1lTVElDSzsgYnJlYWs7CisJCQljYXNlIEhJRF9HRF9HQU1FUEFEOiAgY29kZSArPSBCVE5fR0FNRVBBRDsgYnJlYWs7CisJCQlkZWZhdWx0OiAgICAgICAgICAgICAgY29kZSArPSBCVE5fTUlTQzsKIAkJCX0KIAkJfQogCkBAIC04MTcsMTQgKzgxNywxNCBAQAogewogCXN0cnVjdCBoaWRfZGV2aWNlICpoaWQgPSBpbnB1dF9nZXRfZHJ2ZGF0YShkZXYpOwogCi0JcmV0dXJuIGhpZC0+bGxfZHJpdmVyLT5vcGVuKGhpZCk7CisJcmV0dXJuIGhpZF9od19vcGVuKGhpZCk7CiB9CiAKIHN0YXRpYyB2b2lkIGhpZGlucHV0X2Nsb3NlKHN0cnVjdCBpbnB1dF9kZXYgKmRldikKIHsKIAlzdHJ1Y3QgaGlkX2RldmljZSAqaGlkID0gaW5wdXRfZ2V0X2RydmRhdGEoZGV2KTsKIAotCWhpZC0+bGxfZHJpdmVyLT5jbG9zZShoaWQpOworCWhpZF9od19jbG9zZShoaWQpOwogfQogCiAvKgpAQCAtODcxLDcgKzg3MSw3IEBACiAJCQkJaWYgKCFoaWRpbnB1dCB8fCAhaW5wdXRfZGV2KSB7CiAJCQkJCWtmcmVlKGhpZGlucHV0KTsKIAkJCQkJaW5wdXRfZnJlZV9kZXZpY2UoaW5wdXRfZGV2KTsKLQkJCQkJZXJyX2hpZCgiT3V0IG9mIG1lbW9yeSBkdXJpbmcgaGlkIGlucHV0IHByb2JlIik7CisJCQkJCWhpZF9lcnIoaGlkLCAiT3V0IG9mIG1lbW9yeSBkdXJpbmcgaGlkIGlucHV0IHByb2JlXG4iKTsKIAkJCQkJZ290byBvdXRfdW53aW5kOwogCQkJCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvaGlkLWt5ZS5jIGIvZHJpdmVycy9oaWQvaGlkLWt5ZS5jCmluZGV4IDgxNzI0N2UuLmYyYmE5ZWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaGlkL2hpZC1reWUuYworKysgYi9kcml2ZXJzL2hpZC9oaWQta3llLmMKQEAgLTMyLDggKzMyLDggQEAKIAkJcmRlc2NbNjVdID09IDB4MjkgJiYgcmRlc2NbNjZdID09IDB4MGYgJiYKIAkJcmRlc2NbNzFdID09IDB4NzUgJiYgcmRlc2NbNzJdID09IDB4MDggJiYKIAkJcmRlc2NbNzNdID09IDB4OTUgJiYgcmRlc2NbNzRdID09IDB4MDEpIHsKLQkJZGV2X2luZm8oJmhkZXYtPmRldiwgImZpeGluZyB1cCBLeWUvR2VuaXVzIEVyZ28gTW91c2UgcmVwb3J0ICIKLQkJCQkiZGVzY3JpcHRvclxuIik7CisJCWhpZF9pbmZvKGhkZXYsCisJCQkgImZpeGluZyB1cCBLeWUvR2VuaXVzIEVyZ28gTW91c2UgcmVwb3J0IGRlc2NyaXB0b3JcbiIpOwogCQlyZGVzY1s2Ml0gPSAweDA5OwogCQlyZGVzY1s2NF0gPSAweDA0OwogCQlyZGVzY1s2Nl0gPSAweDA3OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvaGlkLWxnLmMgYi9kcml2ZXJzL2hpZC9oaWQtbGcuYwppbmRleCBiNjI5ZmJhLi5hZWY0MTA0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC9oaWQtbGcuYworKysgYi9kcml2ZXJzL2hpZC9oaWQtbGcuYwpAQCAtNTMsMjMgKzUzLDIyIEBACiAKIAlpZiAoKHF1aXJrcyAmIExHX1JERVNDKSAmJiAqcnNpemUgPj0gOTAgJiYgcmRlc2NbODNdID09IDB4MjYgJiYKIAkJCXJkZXNjWzg0XSA9PSAweDhjICYmIHJkZXNjWzg1XSA9PSAweDAyKSB7Ci0JCWRldl9pbmZvKCZoZGV2LT5kZXYsICJmaXhpbmcgdXAgTG9naXRlY2gga2V5Ym9hcmQgcmVwb3J0ICIKLQkJCQkiZGVzY3JpcHRvclxuIik7CisJCWhpZF9pbmZvKGhkZXYsCisJCQkgImZpeGluZyB1cCBMb2dpdGVjaCBrZXlib2FyZCByZXBvcnQgZGVzY3JpcHRvclxuIik7CiAJCXJkZXNjWzg0XSA9IHJkZXNjWzg5XSA9IDB4NGQ7CiAJCXJkZXNjWzg1XSA9IHJkZXNjWzkwXSA9IDB4MTA7CiAJfQogCWlmICgocXVpcmtzICYgTEdfUkRFU0NfUkVMX0FCUykgJiYgKnJzaXplID49IDUwICYmCiAJCQlyZGVzY1szMl0gPT0gMHg4MSAmJiByZGVzY1szM10gPT0gMHgwNiAmJgogCQkJcmRlc2NbNDldID09IDB4ODEgJiYgcmRlc2NbNTBdID09IDB4MDYpIHsKLQkJZGV2X2luZm8oJmhkZXYtPmRldiwgImZpeGluZyB1cCByZWwvYWJzIGluIExvZ2l0ZWNoICIKLQkJCQkicmVwb3J0IGRlc2NyaXB0b3JcbiIpOworCQloaWRfaW5mbyhoZGV2LAorCQkJICJmaXhpbmcgdXAgcmVsL2FicyBpbiBMb2dpdGVjaCByZXBvcnQgZGVzY3JpcHRvclxuIik7CiAJCXJkZXNjWzMzXSA9IHJkZXNjWzUwXSA9IDB4MDI7CiAJfQogCWlmICgocXVpcmtzICYgTEdfRkY0KSAmJiAqcnNpemUgPj0gMTAxICYmCiAJCQlyZGVzY1s0MV0gPT0gMHg5NSAmJiByZGVzY1s0Ml0gPT0gMHgwQiAmJgogCQkJcmRlc2NbNDddID09IDB4MDUgJiYgcmRlc2NbNDhdID09IDB4MDkpIHsKLQkJZGV2X2luZm8oJmhkZXYtPmRldiwgImZpeGluZyB1cCBMb2dpdGVjaCBTcGVlZCBGb3JjZSBXaXJlbGVzcyAiCi0JCQkiYnV0dG9uIGRlc2NyaXB0b3JcbiIpOworCQloaWRfaW5mbyhoZGV2LCAiZml4aW5nIHVwIExvZ2l0ZWNoIFNwZWVkIEZvcmNlIFdpcmVsZXNzIGJ1dHRvbiBkZXNjcmlwdG9yXG4iKTsKIAkJcmRlc2NbNDFdID0gMHgwNTsKIAkJcmRlc2NbNDJdID0gMHgwOTsKIAkJcmRlc2NbNDddID0gMHg5NTsKQEAgLTI4OCw3ICsyODcsNyBAQAogCiAJcmV0ID0gaGlkX3BhcnNlKGhkZXYpOwogCWlmIChyZXQpIHsKLQkJZGV2X2VycigmaGRldi0+ZGV2LCAicGFyc2UgZmFpbGVkXG4iKTsKKwkJaGlkX2VycihoZGV2LCAicGFyc2UgZmFpbGVkXG4iKTsKIAkJZ290byBlcnJfZnJlZTsKIAl9CiAKQEAgLTI5Nyw3ICsyOTYsNyBAQAogCiAJcmV0ID0gaGlkX2h3X3N0YXJ0KGhkZXYsIGNvbm5lY3RfbWFzayk7CiAJaWYgKHJldCkgewotCQlkZXZfZXJyKCZoZGV2LT5kZXYsICJodyBzdGFydCBmYWlsZWRcbiIpOworCQloaWRfZXJyKGhkZXYsICJodyBzdGFydCBmYWlsZWRcbiIpOwogCQlnb3RvIGVycl9mcmVlOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvaGlkLWxnMmZmLmMgYi9kcml2ZXJzL2hpZC9oaWQtbGcyZmYuYwppbmRleCA0MjU4MjUzYy4uM2MzMWJjNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvaGlkLWxnMmZmLmMKKysrIGIvZHJpdmVycy9oaWQvaGlkLWxnMmZmLmMKQEAgLTcyLDE4ICs3MiwxOCBAQAogCWludCBlcnJvcjsKIAogCWlmIChsaXN0X2VtcHR5KHJlcG9ydF9saXN0KSkgewotCQlkZXZfZXJyKCZoaWQtPmRldiwgIm5vIG91dHB1dCByZXBvcnQgZm91bmRcbiIpOworCQloaWRfZXJyKGhpZCwgIm5vIG91dHB1dCByZXBvcnQgZm91bmRcbiIpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKIAlyZXBvcnQgPSBsaXN0X2VudHJ5KHJlcG9ydF9saXN0LT5uZXh0LCBzdHJ1Y3QgaGlkX3JlcG9ydCwgbGlzdCk7CiAKIAlpZiAocmVwb3J0LT5tYXhmaWVsZCA8IDEpIHsKLQkJZGV2X2VycigmaGlkLT5kZXYsICJvdXRwdXQgcmVwb3J0IGlzIGVtcHR5XG4iKTsKKwkJaGlkX2VycihoaWQsICJvdXRwdXQgcmVwb3J0IGlzIGVtcHR5XG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCWlmIChyZXBvcnQtPmZpZWxkWzBdLT5yZXBvcnRfY291bnQgPCA3KSB7Ci0JCWRldl9lcnIoJmhpZC0+ZGV2LCAibm90IGVub3VnaCB2YWx1ZXMgaW4gdGhlIGZpZWxkXG4iKTsKKwkJaGlkX2VycihoaWQsICJub3QgZW5vdWdoIHZhbHVlcyBpbiB0aGUgZmllbGRcbiIpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKQEAgLTExMCw4ICsxMTAsNyBAQAogCiAJdXNiaGlkX3N1Ym1pdF9yZXBvcnQoaGlkLCByZXBvcnQsIFVTQl9ESVJfT1VUKTsKIAotCWRldl9pbmZvKCZoaWQtPmRldiwgIkZvcmNlIGZlZWRiYWNrIGZvciBMb2dpdGVjaCBSdW1ibGVQYWQvUnVtYmxlcGFkIDIgYnkgIgotCSAgICAgICAiQW5zc2kgSGFubnVsYSA8YW5zc2kuaGFubnVsYUBnbWFpbC5jb20+XG4iKTsKKwloaWRfaW5mbyhoaWQsICJGb3JjZSBmZWVkYmFjayBmb3IgTG9naXRlY2ggUnVtYmxlUGFkL1J1bWJsZXBhZCAyIGJ5IEFuc3NpIEhhbm51bGEgPGFuc3NpLmhhbm51bGFAZ21haWwuY29tPlxuIik7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL2hpZC1sZzNmZi5jIGIvZHJpdmVycy9oaWQvaGlkLWxnM2ZmLmMKaW5kZXggNDAwMjgzMi4uZjk4NjQ0YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvaGlkLWxnM2ZmLmMKKysrIGIvZHJpdmVycy9oaWQvaGlkLWxnM2ZmLmMKQEAgLTE0MSwyMCArMTQxLDIwIEBACiAKIAkvKiBGaW5kIHRoZSByZXBvcnQgdG8gdXNlICovCiAJaWYgKGxpc3RfZW1wdHkocmVwb3J0X2xpc3QpKSB7Ci0JCWVycl9oaWQoIk5vIG91dHB1dCByZXBvcnQgZm91bmQiKTsKKwkJaGlkX2VycihoaWQsICJObyBvdXRwdXQgcmVwb3J0IGZvdW5kXG4iKTsKIAkJcmV0dXJuIC0xOwogCX0KIAogCS8qIENoZWNrIHRoYXQgdGhlIHJlcG9ydCBsb29rcyBvayAqLwogCXJlcG9ydCA9IGxpc3RfZW50cnkocmVwb3J0X2xpc3QtPm5leHQsIHN0cnVjdCBoaWRfcmVwb3J0LCBsaXN0KTsKIAlpZiAoIXJlcG9ydCkgewotCQllcnJfaGlkKCJOVUxMIG91dHB1dCByZXBvcnQiKTsKKwkJaGlkX2VycihoaWQsICJOVUxMIG91dHB1dCByZXBvcnRcbiIpOwogCQlyZXR1cm4gLTE7CiAJfQogCiAJZmllbGQgPSByZXBvcnQtPmZpZWxkWzBdOwogCWlmICghZmllbGQpIHsKLQkJZXJyX2hpZCgiTlVMTCBmaWVsZCIpOworCQloaWRfZXJyKGhpZCwgIk5VTEwgZmllbGRcbiIpOwogCQlyZXR1cm4gLTE7CiAJfQogCkBAIC0xNjksOCArMTY5LDcgQEAKIAlpZiAodGVzdF9iaXQoRkZfQVVUT0NFTlRFUiwgZGV2LT5mZmJpdCkpCiAJCWRldi0+ZmYtPnNldF9hdXRvY2VudGVyID0gaGlkX2xnM2ZmX3NldF9hdXRvY2VudGVyOwogCi0JZGV2X2luZm8oJmhpZC0+ZGV2LCAiRm9yY2UgZmVlZGJhY2sgZm9yIExvZ2l0ZWNoIEZsaWdodCBTeXN0ZW0gRzk0MCBieSAiCi0JCQkiR2FyeSBTdGVpbiA8TG9yZENuaWRhcmlhbkBnbWFpbC5jb20+XG4iKTsKKwloaWRfaW5mbyhoaWQsICJGb3JjZSBmZWVkYmFjayBmb3IgTG9naXRlY2ggRmxpZ2h0IFN5c3RlbSBHOTQwIGJ5IEdhcnkgU3RlaW4gPExvcmRDbmlkYXJpYW5AZ21haWwuY29tPlxuIik7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL2hpZC1sZzRmZi5jIGIvZHJpdmVycy9oaWQvaGlkLWxnNGZmLmMKaW5kZXggN2VlZjVhMi4uZmE1NTBjOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvaGlkLWxnNGZmLmMKKysrIGIvZHJpdmVycy9oaWQvaGlkLWxnNGZmLmMKQEAgLTEwMSwyMCArMTAxLDIwIEBACiAKIAkvKiBGaW5kIHRoZSByZXBvcnQgdG8gdXNlICovCiAJaWYgKGxpc3RfZW1wdHkocmVwb3J0X2xpc3QpKSB7Ci0JCWVycl9oaWQoIk5vIG91dHB1dCByZXBvcnQgZm91bmQiKTsKKwkJaGlkX2VycihoaWQsICJObyBvdXRwdXQgcmVwb3J0IGZvdW5kXG4iKTsKIAkJcmV0dXJuIC0xOwogCX0KIAogCS8qIENoZWNrIHRoYXQgdGhlIHJlcG9ydCBsb29rcyBvayAqLwogCXJlcG9ydCA9IGxpc3RfZW50cnkocmVwb3J0X2xpc3QtPm5leHQsIHN0cnVjdCBoaWRfcmVwb3J0LCBsaXN0KTsKIAlpZiAoIXJlcG9ydCkgewotCQllcnJfaGlkKCJOVUxMIG91dHB1dCByZXBvcnQiKTsKKwkJaGlkX2VycihoaWQsICJOVUxMIG91dHB1dCByZXBvcnRcbiIpOwogCQlyZXR1cm4gLTE7CiAJfQogCiAJZmllbGQgPSByZXBvcnQtPmZpZWxkWzBdOwogCWlmICghZmllbGQpIHsKLQkJZXJyX2hpZCgiTlVMTCBmaWVsZCIpOworCQloaWRfZXJyKGhpZCwgIk5VTEwgZmllbGRcbiIpOwogCQlyZXR1cm4gLTE7CiAJfQogCkBAIC0xMjksOCArMTI5LDcgQEAKIAlpZiAodGVzdF9iaXQoRkZfQVVUT0NFTlRFUiwgZGV2LT5mZmJpdCkpCiAJCWRldi0+ZmYtPnNldF9hdXRvY2VudGVyID0gaGlkX2xnNGZmX3NldF9hdXRvY2VudGVyOwogCi0JZGV2X2luZm8oJmhpZC0+ZGV2LCAiRm9yY2UgZmVlZGJhY2sgZm9yIExvZ2l0ZWNoIFNwZWVkIEZvcmNlIFdpcmVsZXNzIGJ5ICIKLQkJCSJTaW1vbiBXb29kIDxzaW1vbkBtdW5nZXdlbGwub3JnPlxuIik7CisJaGlkX2luZm8oaGlkLCAiRm9yY2UgZmVlZGJhY2sgZm9yIExvZ2l0ZWNoIFNwZWVkIEZvcmNlIFdpcmVsZXNzIGJ5IFNpbW9uIFdvb2QgPHNpbW9uQG11bmdld2VsbC5vcmc+XG4iKTsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvaGlkLWxnZmYuYyBiL2RyaXZlcnMvaGlkL2hpZC1sZ2ZmLmMKaW5kZXggNjExNDJiNy4uOTBkMGVmMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvaGlkLWxnZmYuYworKysgYi9kcml2ZXJzL2hpZC9oaWQtbGdmZi5jCkBAIC0yNyw2ICsyNyw4IEBACiAgKiBlLW1haWwgLSBtYWlsIHlvdXIgbWVzc2FnZSB0byA8am9oYW5uLmRlbmV1eEBpdC51dS5zZT4KICAqLwogCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisKICNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgogI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgogI2luY2x1ZGUgPGxpbnV4L2hpZC5oPgpAQCAtMTQ2LDcgKzE0OCw3IEBACiAKIAkvKiBGaW5kIHRoZSByZXBvcnQgdG8gdXNlICovCiAJaWYgKGxpc3RfZW1wdHkocmVwb3J0X2xpc3QpKSB7Ci0JCWVycl9oaWQoIk5vIG91dHB1dCByZXBvcnQgZm91bmQiKTsKKwkJaGlkX2VycihoaWQsICJObyBvdXRwdXQgcmVwb3J0IGZvdW5kXG4iKTsKIAkJcmV0dXJuIC0xOwogCX0KIApAQCAtMTU0LDcgKzE1Niw3IEBACiAJcmVwb3J0ID0gbGlzdF9lbnRyeShyZXBvcnRfbGlzdC0+bmV4dCwgc3RydWN0IGhpZF9yZXBvcnQsIGxpc3QpOwogCWZpZWxkID0gcmVwb3J0LT5maWVsZFswXTsKIAlpZiAoIWZpZWxkKSB7Ci0JCWVycl9oaWQoIk5VTEwgZmllbGQiKTsKKwkJaGlkX2VycihoaWQsICJOVUxMIGZpZWxkXG4iKTsKIAkJcmV0dXJuIC0xOwogCX0KIApAQCAtMTc2LDcgKzE3OCw3IEBACiAJaWYgKCB0ZXN0X2JpdChGRl9BVVRPQ0VOVEVSLCBkZXYtPmZmYml0KSApCiAJCWRldi0+ZmYtPnNldF9hdXRvY2VudGVyID0gaGlkX2xnZmZfc2V0X2F1dG9jZW50ZXI7CiAKLQlwcmludGsoS0VSTl9JTkZPICJGb3JjZSBmZWVkYmFjayBmb3IgTG9naXRlY2ggZm9yY2UgZmVlZGJhY2sgZGV2aWNlcyBieSBKb2hhbm4gRGVuZXV4IDxqb2hhbm4uZGVuZXV4QGl0LnV1LnNlPlxuIik7CisJcHJfaW5mbygiRm9yY2UgZmVlZGJhY2sgZm9yIExvZ2l0ZWNoIGZvcmNlIGZlZWRiYWNrIGRldmljZXMgYnkgSm9oYW5uIERlbmV1eCA8am9oYW5uLmRlbmV1eEBpdC51dS5zZT5cbiIpOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC9oaWQtbWFnaWNtb3VzZS5jIGIvZHJpdmVycy9oaWQvaGlkLW1hZ2ljbW91c2UuYwppbmRleCBlNmRjMTUxLi42OThlNjQ1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC9oaWQtbWFnaWNtb3VzZS5jCisrKyBiL2RyaXZlcnMvaGlkL2hpZC1tYWdpY21vdXNlLmMKQEAgLTEyLDYgKzEyLDggQEAKICAqIGFueSBsYXRlciB2ZXJzaW9uLgogICovCiAKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKwogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2hpZC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgpAQCAtNDMzLDYgKzQzNSwxMSBAQAogCWlmICghbXNjLT5pbnB1dCkKIAkJbXNjLT5pbnB1dCA9IGhpLT5pbnB1dDsKIAorCS8qIE1hZ2ljIFRyYWNrcGFkIGRvZXMgbm90IGdpdmUgcmVsYXRpdmUgZGF0YSBhZnRlciBzd2l0Y2hpbmcgdG8gTVQgKi8KKwlpZiAoaGktPmlucHV0LT5pZC5wcm9kdWN0ID09IFVTQl9ERVZJQ0VfSURfQVBQTEVfTUFHSUNUUkFDS1BBRCAmJgorCSAgICBmaWVsZC0+ZmxhZ3MgJiBISURfTUFJTl9JVEVNX1JFTEFUSVZFKQorCQlyZXR1cm4gLTE7CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtNDQ2LDcgKzQ1Myw3IEBACiAKIAltc2MgPSBremFsbG9jKHNpemVvZigqbXNjKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKG1zYyA9PSBOVUxMKSB7Ci0JCWRldl9lcnIoJmhkZXYtPmRldiwgImNhbid0IGFsbG9jIG1hZ2ljbW91c2UgZGVzY3JpcHRvclxuIik7CisJCWhpZF9lcnIoaGRldiwgImNhbid0IGFsbG9jIG1hZ2ljbW91c2UgZGVzY3JpcHRvclxuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIApAQCAtNDU5LDEzICs0NjYsMTMgQEAKIAogCXJldCA9IGhpZF9wYXJzZShoZGV2KTsKIAlpZiAocmV0KSB7Ci0JCWRldl9lcnIoJmhkZXYtPmRldiwgIm1hZ2ljbW91c2UgaGlkIHBhcnNlIGZhaWxlZFxuIik7CisJCWhpZF9lcnIoaGRldiwgIm1hZ2ljbW91c2UgaGlkIHBhcnNlIGZhaWxlZFxuIik7CiAJCWdvdG8gZXJyX2ZyZWU7CiAJfQogCiAJcmV0ID0gaGlkX2h3X3N0YXJ0KGhkZXYsIEhJRF9DT05ORUNUX0RFRkFVTFQpOwogCWlmIChyZXQpIHsKLQkJZGV2X2VycigmaGRldi0+ZGV2LCAibWFnaWNtb3VzZSBodyBzdGFydCBmYWlsZWRcbiIpOworCQloaWRfZXJyKGhkZXYsICJtYWdpY21vdXNlIGh3IHN0YXJ0IGZhaWxlZFxuIik7CiAJCWdvdG8gZXJyX2ZyZWU7CiAJfQogCkBAIC00ODYsNyArNDkzLDcgQEAKIAl9CiAKIAlpZiAoIXJlcG9ydCkgewotCQlkZXZfZXJyKCZoZGV2LT5kZXYsICJ1bmFibGUgdG8gcmVnaXN0ZXIgdG91Y2ggcmVwb3J0XG4iKTsKKwkJaGlkX2VycihoZGV2LCAidW5hYmxlIHRvIHJlZ2lzdGVyIHRvdWNoIHJlcG9ydFxuIik7CiAJCXJldCA9IC1FTk9NRU07CiAJCWdvdG8gZXJyX3N0b3BfaHc7CiAJfQpAQCAtNDk1LDggKzUwMiw3IEBACiAJcmV0ID0gaGRldi0+aGlkX291dHB1dF9yYXdfcmVwb3J0KGhkZXYsIGZlYXR1cmUsIHNpemVvZihmZWF0dXJlKSwKIAkJCUhJRF9GRUFUVVJFX1JFUE9SVCk7CiAJaWYgKHJldCAhPSBzaXplb2YoZmVhdHVyZSkpIHsKLQkJZGV2X2VycigmaGRldi0+ZGV2LCAidW5hYmxlIHRvIHJlcXVlc3QgdG91Y2ggZGF0YSAoJWQpXG4iLAotCQkJCXJldCk7CisJCWhpZF9lcnIoaGRldiwgInVuYWJsZSB0byByZXF1ZXN0IHRvdWNoIGRhdGEgKCVkKVxuIiwgcmV0KTsKIAkJZ290byBlcnJfc3RvcF9odzsKIAl9CiAKQEAgLTU0MCw3ICs1NDYsNyBAQAogCiAJcmV0ID0gaGlkX3JlZ2lzdGVyX2RyaXZlcigmbWFnaWNtb3VzZV9kcml2ZXIpOwogCWlmIChyZXQpCi0JCXByaW50ayhLRVJOX0VSUiAiY2FuJ3QgcmVnaXN0ZXIgbWFnaWNtb3VzZSBkcml2ZXJcbiIpOworCQlwcl9lcnIoImNhbid0IHJlZ2lzdGVyIG1hZ2ljbW91c2UgZHJpdmVyXG4iKTsKIAogCXJldHVybiByZXQ7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC9oaWQtbWljcm9zb2Z0LmMgYi9kcml2ZXJzL2hpZC9oaWQtbWljcm9zb2Z0LmMKaW5kZXggZGM2MThjMy4uMGY2ZmM1NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvaGlkLW1pY3Jvc29mdC5jCisrKyBiL2RyaXZlcnMvaGlkL2hpZC1taWNyb3NvZnQuYwpAQCAtNDAsOCArNDAsNyBAQAogCiAJaWYgKChxdWlya3MgJiBNU19SREVTQykgJiYgKnJzaXplID09IDU3MSAmJiByZGVzY1s1NTddID09IDB4MTkgJiYKIAkJCXJkZXNjWzU1OV0gPT0gMHgyOSkgewotCQlkZXZfaW5mbygmaGRldi0+ZGV2LCAiZml4aW5nIHVwIE1pY3Jvc29mdCBXaXJlbGVzcyBSZWNlaXZlciAiCi0JCQkJIk1vZGVsIDEwMjggcmVwb3J0IGRlc2NyaXB0b3JcbiIpOworCQloaWRfaW5mbyhoZGV2LCAiZml4aW5nIHVwIE1pY3Jvc29mdCBXaXJlbGVzcyBSZWNlaXZlciBNb2RlbCAxMDI4IHJlcG9ydCBkZXNjcmlwdG9yXG4iKTsKIAkJcmRlc2NbNTU3XSA9IDB4MzU7CiAJCXJkZXNjWzU1OV0gPSAweDQ1OwogCX0KQEAgLTE1NSwxNCArMTU0LDE0IEBACiAKIAlyZXQgPSBoaWRfcGFyc2UoaGRldik7CiAJaWYgKHJldCkgewotCQlkZXZfZXJyKCZoZGV2LT5kZXYsICJwYXJzZSBmYWlsZWRcbiIpOworCQloaWRfZXJyKGhkZXYsICJwYXJzZSBmYWlsZWRcbiIpOwogCQlnb3RvIGVycl9mcmVlOwogCX0KIAogCXJldCA9IGhpZF9od19zdGFydChoZGV2LCBISURfQ09OTkVDVF9ERUZBVUxUIHwgKChxdWlya3MgJiBNU19ISURJTlBVVCkgPwogCQkJCUhJRF9DT05ORUNUX0hJRElOUFVUX0ZPUkNFIDogMCkpOwogCWlmIChyZXQpIHsKLQkJZGV2X2VycigmaGRldi0+ZGV2LCAiaHcgc3RhcnQgZmFpbGVkXG4iKTsKKwkJaGlkX2VycihoZGV2LCAiaHcgc3RhcnQgZmFpbGVkXG4iKTsKIAkJZ290byBlcnJfZnJlZTsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL2hpZC1tb250ZXJleS5jIGIvZHJpdmVycy9oaWQvaGlkLW1vbnRlcmV5LmMKaW5kZXggYzk1YzMxZS4uZGVkZjc1NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvaGlkLW1vbnRlcmV5LmMKKysrIGIvZHJpdmVycy9oaWQvaGlkLW1vbnRlcmV5LmMKQEAgLTI2LDggKzI2LDcgQEAKIAkJdW5zaWduZWQgaW50ICpyc2l6ZSkKIHsKIAlpZiAoKnJzaXplID49IDMwICYmIHJkZXNjWzI5XSA9PSAweDA1ICYmIHJkZXNjWzMwXSA9PSAweDA5KSB7Ci0JCWRldl9pbmZvKCZoZGV2LT5kZXYsICJmaXhpbmcgdXAgYnV0dG9uL2NvbnN1bWVyIGluIEhJRCByZXBvcnQgIgotCQkJCSJkZXNjcmlwdG9yXG4iKTsKKwkJaGlkX2luZm8oaGRldiwgImZpeGluZyB1cCBidXR0b24vY29uc3VtZXIgaW4gSElEIHJlcG9ydCBkZXNjcmlwdG9yXG4iKTsKIAkJcmRlc2NbMzBdID0gMHgwYzsKIAl9CiAJcmV0dXJuIHJkZXNjOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvaGlkLW1vc2FydC5jIGIvZHJpdmVycy9oaWQvaGlkLW1vc2FydC5jCmluZGV4IGFjNTQyMWQuLjlmYjA1MGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaGlkL2hpZC1tb3NhcnQuYworKysgYi9kcml2ZXJzL2hpZC9oaWQtbW9zYXJ0LmMKQEAgLTkwLDYgKzkwLDEwIEBACiAJY2FzZSAweGZmMDAwMDAwOgogCQkvKiBpZ25vcmUgSElEIGZlYXR1cmVzICovCiAJCXJldHVybiAtMTsKKworCWNhc2UgSElEX1VQX0JVVFRPTjoKKwkJLyogaWdub3JlIGJ1dHRvbnMgKi8KKwkJcmV0dXJuIC0xOwogCX0KIAogCXJldHVybiAwOwpAQCAtMTk5LDcgKzIwMyw3IEBACiAKIAl0ZCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBtb3NhcnRfZGF0YSksIEdGUF9LRVJORUwpOwogCWlmICghdGQpIHsKLQkJZGV2X2VycigmaGRldi0+ZGV2LCAiY2Fubm90IGFsbG9jYXRlIE1vc0FydCBkYXRhXG4iKTsKKwkJaGlkX2VycihoZGV2LCAiY2Fubm90IGFsbG9jYXRlIE1vc0FydCBkYXRhXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCXRkLT52YWxpZCA9IGZhbHNlOwpAQCAtMjMwLDYgKzIzNCwxOSBAQAogCXJldHVybiByZXQ7CiB9CiAKKyNpZmRlZiBDT05GSUdfUE0KK3N0YXRpYyBpbnQgbW9zYXJ0X3Jlc2V0X3Jlc3VtZShzdHJ1Y3QgaGlkX2RldmljZSAqaGRldikKK3sKKwlzdHJ1Y3QgaGlkX3JlcG9ydF9lbnVtICpyZSA9IGhkZXYtPnJlcG9ydF9lbnVtCisJCQkJCQkrIEhJRF9GRUFUVVJFX1JFUE9SVDsKKwlzdHJ1Y3QgaGlkX3JlcG9ydCAqciA9IHJlLT5yZXBvcnRfaWRfaGFzaFs3XTsKKworCXItPmZpZWxkWzBdLT52YWx1ZVswXSA9IDB4MDI7CisJdXNiaGlkX3N1Ym1pdF9yZXBvcnQoaGRldiwgciwgVVNCX0RJUl9PVVQpOworCXJldHVybiAwOworfQorI2VuZGlmCisKIHN0YXRpYyB2b2lkIG1vc2FydF9yZW1vdmUoc3RydWN0IGhpZF9kZXZpY2UgKmhkZXYpCiB7CiAJaGlkX2h3X3N0b3AoaGRldik7CkBAIC0yNTgsNiArMjc1LDkgQEAKIAkuaW5wdXRfbWFwcGVkID0gbW9zYXJ0X2lucHV0X21hcHBlZCwKIAkudXNhZ2VfdGFibGUgPSBtb3NhcnRfZ3JhYmJlZF91c2FnZXMsCiAJLmV2ZW50ID0gbW9zYXJ0X2V2ZW50LAorI2lmZGVmIENPTkZJR19QTQorCS5yZXNldF9yZXN1bWUgPSBtb3NhcnRfcmVzZXRfcmVzdW1lLAorI2VuZGlmCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBtb3NhcnRfaW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvaGlkLW50cmlnLmMgYi9kcml2ZXJzL2hpZC9oaWQtbnRyaWcuYwppbmRleCA2OTE2OWVmLi5iZWI0MDM0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC9oaWQtbnRyaWcuYworKysgYi9kcml2ZXJzL2hpZC9oaWQtbnRyaWcuYwpAQCAtMTMwLDggKzEzMCw3IEBACiAJaWYgKHJldCA9PSA4KSB7CiAJCXJldCA9IG50cmlnX3ZlcnNpb25fc3RyaW5nKCZkYXRhWzJdLCBidWYpOwogCi0JCWRldl9pbmZvKCZoZGV2LT5kZXYsCi0JCQkgIkZpcm13YXJlIHZlcnNpb246ICVzICglMDJ4JTAyeCAlMDJ4JTAyeClcbiIsCisJCWhpZF9pbmZvKGhkZXYsICJGaXJtd2FyZSB2ZXJzaW9uOiAlcyAoJTAyeCUwMnggJTAyeCUwMngpXG4iLAogCQkJIGJ1ZiwgZGF0YVsyXSwgZGF0YVszXSwgZGF0YVs0XSwgZGF0YVs1XSk7CiAJfQogCkBAIC04MzEsNyArODMwLDcgQEAKIAogCW5kID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IG50cmlnX2RhdGEpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIW5kKSB7Ci0JCWRldl9lcnIoJmhkZXYtPmRldiwgImNhbm5vdCBhbGxvY2F0ZSBOLVRyaWcgZGF0YVxuIik7CisJCWhpZF9lcnIoaGRldiwgImNhbm5vdCBhbGxvY2F0ZSBOLVRyaWcgZGF0YVxuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIApAQCAtODUwLDEzICs4NDksMTMgQEAKIAogCXJldCA9IGhpZF9wYXJzZShoZGV2KTsKIAlpZiAocmV0KSB7Ci0JCWRldl9lcnIoJmhkZXYtPmRldiwgInBhcnNlIGZhaWxlZFxuIik7CisJCWhpZF9lcnIoaGRldiwgInBhcnNlIGZhaWxlZFxuIik7CiAJCWdvdG8gZXJyX2ZyZWU7CiAJfQogCiAJcmV0ID0gaGlkX2h3X3N0YXJ0KGhkZXYsIEhJRF9DT05ORUNUX0RFRkFVTFQgJiB+SElEX0NPTk5FQ1RfRkYpOwogCWlmIChyZXQpIHsKLQkJZGV2X2VycigmaGRldi0+ZGV2LCAiaHcgc3RhcnQgZmFpbGVkXG4iKTsKKwkJaGlkX2VycihoZGV2LCAiaHcgc3RhcnQgZmFpbGVkXG4iKTsKIAkJZ290byBlcnJfZnJlZTsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL2hpZC1vcnRlay5jIGIvZHJpdmVycy9oaWQvaGlkLW9ydGVrLmMKaW5kZXggMmU3OTcxNi4uZTkwZWRmYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvaGlkLW9ydGVrLmMKKysrIGIvZHJpdmVycy9oaWQvaGlkLW9ydGVrLmMKQEAgLTIzLDggKzIzLDcgQEAKIAkJdW5zaWduZWQgaW50ICpyc2l6ZSkKIHsKIAlpZiAoKnJzaXplID49IDU2ICYmIHJkZXNjWzU0XSA9PSAweDI1ICYmIHJkZXNjWzU1XSA9PSAweDAxKSB7Ci0JCWRldl9pbmZvKCZoZGV2LT5kZXYsICJGaXhpbmcgdXAgT3J0ZWsgV0tCLTIwMDAgIgotCQkJCSJyZXBvcnQgZGVzY3JpcHRvci5cbiIpOworCQloaWRfaW5mbyhoZGV2LCAiRml4aW5nIHVwIE9ydGVrIFdLQi0yMDAwIHJlcG9ydCBkZXNjcmlwdG9yXG4iKTsKIAkJcmRlc2NbNTVdID0gMHg5MjsKIAl9CiAJcmV0dXJuIHJkZXNjOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvaGlkLXBldGFseW54LmMgYi9kcml2ZXJzL2hpZC9oaWQtcGV0YWx5bnguYwppbmRleCAzMDhkNmFlLi5mMWVhM2ZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC9oaWQtcGV0YWx5bnguYworKysgYi9kcml2ZXJzL2hpZC9oaWQtcGV0YWx5bnguYwpAQCAtMjksOCArMjksNyBAQAogCWlmICgqcnNpemUgPj0gNjAgJiYgcmRlc2NbMzldID09IDB4MmEgJiYgcmRlc2NbNDBdID09IDB4ZjUgJiYKIAkJCXJkZXNjWzQxXSA9PSAweDAwICYmIHJkZXNjWzU5XSA9PSAweDI2ICYmCiAJCQlyZGVzY1s2MF0gPT0gMHhmOSAmJiByZGVzY1s2MV0gPT0gMHgwMCkgewotCQlkZXZfaW5mbygmaGRldi0+ZGV2LCAiZml4aW5nIHVwIFBldGFseW54IE1heHRlciBSZW1vdGUgcmVwb3J0ICIKLQkJCQkiZGVzY3JpcHRvclxuIik7CisJCWhpZF9pbmZvKGhkZXYsICJmaXhpbmcgdXAgUGV0YWx5bnggTWF4dGVyIFJlbW90ZSByZXBvcnQgZGVzY3JpcHRvclxuIik7CiAJCXJkZXNjWzYwXSA9IDB4ZmE7CiAJCXJkZXNjWzQwXSA9IDB4ZmE7CiAJfQpAQCAtNzcsMTMgKzc2LDEzIEBACiAKIAlyZXQgPSBoaWRfcGFyc2UoaGRldik7CiAJaWYgKHJldCkgewotCQlkZXZfZXJyKCZoZGV2LT5kZXYsICJwYXJzZSBmYWlsZWRcbiIpOworCQloaWRfZXJyKGhkZXYsICJwYXJzZSBmYWlsZWRcbiIpOwogCQlnb3RvIGVycl9mcmVlOwogCX0KIAogCXJldCA9IGhpZF9od19zdGFydChoZGV2LCBISURfQ09OTkVDVF9ERUZBVUxUKTsKIAlpZiAocmV0KSB7Ci0JCWRldl9lcnIoJmhkZXYtPmRldiwgImh3IHN0YXJ0IGZhaWxlZFxuIik7CisJCWhpZF9lcnIoaGRldiwgImh3IHN0YXJ0IGZhaWxlZFxuIik7CiAJCWdvdG8gZXJyX2ZyZWU7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC9oaWQtcGljb2xjZC5jIGIvZHJpdmVycy9oaWQvaGlkLXBpY29sY2QuYwppbmRleCBiYzJlMDc3Li5kZTljZjIxYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvaGlkLXBpY29sY2QuYworKysgYi9kcml2ZXJzL2hpZC9oaWQtcGljb2xjZC5jCkBAIC0yNTMsNyArMjUzLDcgQEAKIAkJaWYgKHJlcG9ydC0+aWQgPT0gaWQpCiAJCQlyZXR1cm4gcmVwb3J0OwogCX0KLQlkZXZfd2FybigmaGRldi0+ZGV2LCAiTm8gcmVwb3J0IHdpdGggaWQgMHgleCBmb3VuZFxuIiwgaWQpOworCWhpZF93YXJuKGhkZXYsICJObyByZXBvcnQgd2l0aCBpZCAweCV4IGZvdW5kXG4iLCBpZCk7CiAJcmV0dXJuIE5VTEw7CiB9CiAKQEAgLTEzMjksNyArMTMyOSw3IEBACiAKIAl2ZXJpbmZvID0gcGljb2xjZF9zZW5kX2FuZF93YWl0KGhkZXYsIFJFUE9SVF9WRVJTSU9OLCBOVUxMLCAwKTsKIAlpZiAoIXZlcmluZm8pIHsKLQkJZGV2X2VycigmaGRldi0+ZGV2LCAibm8gdmVyc2lvbiByZXNwb25zZSBmcm9tIFBpY29MQ0QiKTsKKwkJaGlkX2VycihoZGV2LCAibm8gdmVyc2lvbiByZXNwb25zZSBmcm9tIFBpY29MQ0RcbiIpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKQEAgLTEzMzcsMTQgKzEzMzcsMTQgQEAKIAkJZGF0YS0+dmVyc2lvblswXSA9IHZlcmluZm8tPnJhd19kYXRhWzFdOwogCQlkYXRhLT52ZXJzaW9uWzFdID0gdmVyaW5mby0+cmF3X2RhdGFbMF07CiAJCWlmIChkYXRhLT5zdGF0dXMgJiBQSUNPTENEX0JPT1RMT0FERVIpIHsKLQkJCWRldl9pbmZvKCZoZGV2LT5kZXYsICJQaWNvTENELCBib290bG9hZGVyIHZlcnNpb24gJWQuJWRcbiIsCi0JCQkJCXZlcmluZm8tPnJhd19kYXRhWzFdLCB2ZXJpbmZvLT5yYXdfZGF0YVswXSk7CisJCQloaWRfaW5mbyhoZGV2LCAiUGljb0xDRCwgYm9vdGxvYWRlciB2ZXJzaW9uICVkLiVkXG4iLAorCQkJCSB2ZXJpbmZvLT5yYXdfZGF0YVsxXSwgdmVyaW5mby0+cmF3X2RhdGFbMF0pOwogCQl9IGVsc2UgewotCQkJZGV2X2luZm8oJmhkZXYtPmRldiwgIlBpY29MQ0QsIGZpcm13YXJlIHZlcnNpb24gJWQuJWRcbiIsCi0JCQkJCXZlcmluZm8tPnJhd19kYXRhWzFdLCB2ZXJpbmZvLT5yYXdfZGF0YVswXSk7CisJCQloaWRfaW5mbyhoZGV2LCAiUGljb0xDRCwgZmlybXdhcmUgdmVyc2lvbiAlZC4lZFxuIiwKKwkJCQkgdmVyaW5mby0+cmF3X2RhdGFbMV0sIHZlcmluZm8tPnJhd19kYXRhWzBdKTsKIAkJfQogCX0gZWxzZSB7Ci0JCWRldl9lcnIoJmhkZXYtPmRldiwgImNvbmZ1c2VkLCBnb3QgdW5leHBlY3RlZCB2ZXJzaW9uIHJlc3BvbnNlIGZyb20gUGljb0xDRFxuIik7CisJCWhpZF9lcnIoaGRldiwgImNvbmZ1c2VkLCBnb3QgdW5leHBlY3RlZCB2ZXJzaW9uIHJlc3BvbnNlIGZyb20gUGljb0xDRFxuIik7CiAJCXJldCA9IC1FSU5WQUw7CiAJfQogCWtmcmVlKHZlcmluZm8pOwpAQCAtMTU0NCw3ICsxNTQ0LDcgQEAKIAogCS8qIHByZXBhcmUgYnVmZmVyIHdpdGggaW5mbyBhYm91dCB3aGF0IHdlIHdhbnQgdG8gcmVhZCAoYWRkciAmIGxlbikgKi8KIAlyYXdfZGF0YVswXSA9ICpvZmYgJiAweGZmOwotCXJhd19kYXRhWzFdID0gKCpvZmYgPj4gOCkgJiYgMHhmZjsKKwlyYXdfZGF0YVsxXSA9ICgqb2ZmID4+IDgpICYgMHhmZjsKIAlyYXdfZGF0YVsyXSA9IHMgPCAyMCA/IHMgOiAyMDsKIAlpZiAoKm9mZiArIHJhd19kYXRhWzJdID4gMHhmZikKIAkJcmF3X2RhdGFbMl0gPSAweDEwMCAtICpvZmY7CkBAIC0xNTgzLDcgKzE1ODMsNyBAQAogCiAJbWVtc2V0KHJhd19kYXRhLCAwLCBzaXplb2YocmF3X2RhdGEpKTsKIAlyYXdfZGF0YVswXSA9ICpvZmYgJiAweGZmOwotCXJhd19kYXRhWzFdID0gKCpvZmYgPj4gOCkgJiYgMHhmZjsKKwlyYXdfZGF0YVsxXSA9ICgqb2ZmID4+IDgpICYgMHhmZjsKIAlyYXdfZGF0YVsyXSA9IHMgPCAyMCA/IHMgOiAyMDsKIAlpZiAoKm9mZiArIHJhd19kYXRhWzJdID4gMHhmZikKIAkJcmF3X2RhdGFbMl0gPSAweDEwMCAtICpvZmY7CkBAIC0xODY3LDYgKzE4NjcsNyBAQAogCQkJcmVwb3J0LT5pZCwgcmF3X3NpemUpOwogCWhpZF9kZWJ1Z19ldmVudChoZGV2LCBidWZmKTsKIAlpZiAocmF3X3NpemUgKyA1ID4gc2l6ZW9mKHJhd19kYXRhKSkgeworCQlrZnJlZShidWZmKTsKIAkJaGlkX2RlYnVnX2V2ZW50KGhkZXYsICIgVE9PIEJJR1xuIik7CiAJCXJldHVybjsKIAl9IGVsc2UgewpAQCAtMjMyOCw4ICsyMzI5LDcgQEAKIAkJCShmbGFzaF93ID8gU19JV1VTUiA6IDApIHwgKGZsYXNoX3IgPyBTX0lSVVNSIDogMCksCiAJCQloZGV2LT5kZWJ1Z19kaXIsIGRhdGEsICZwaWNvbGNkX2RlYnVnX2ZsYXNoX2ZvcHMpOwogCX0gZWxzZSBpZiAoZmxhc2hfciB8fCBmbGFzaF93KQotCQlkZXZfd2FybigmaGRldi0+ZGV2LCAiVW5leHBlY3RlZCBGTEFTSCBhY2Nlc3MgcmVwb3J0cywgIgotCQkJCSJwbGVhc2Ugc3VibWl0IHJkZXNjIGZvciByZXZpZXdcbiIpOworCQloaWRfd2FybihoZGV2LCAiVW5leHBlY3RlZCBGTEFTSCBhY2Nlc3MgcmVwb3J0cywgcGxlYXNlIHN1Ym1pdCByZGVzYyBmb3IgcmV2aWV3XG4iKTsKIH0KIAogc3RhdGljIHZvaWQgcGljb2xjZF9leGl0X2RldmZzKHN0cnVjdCBwaWNvbGNkX2RhdGEgKmRhdGEpCkBAIC0yNDU3LDEzICsyNDU3LDEzIEBACiAJCXJldHVybiAtRU5PREVWOwogCWlmIChyZXBvcnQtPm1heGZpZWxkICE9IDEgfHwgcmVwb3J0LT5maWVsZFswXS0+cmVwb3J0X2NvdW50ICE9IDIgfHwKIAkJCXJlcG9ydC0+ZmllbGRbMF0tPnJlcG9ydF9zaXplICE9IDgpIHsKLQkJZGV2X2VycigmaGRldi0+ZGV2LCAidW5zdXBwb3J0ZWQgS0VZX1NUQVRFIHJlcG9ydCIpOworCQloaWRfZXJyKGhkZXYsICJ1bnN1cHBvcnRlZCBLRVlfU1RBVEUgcmVwb3J0XG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJaWRldiA9IGlucHV0X2FsbG9jYXRlX2RldmljZSgpOwogCWlmIChpZGV2ID09IE5VTEwpIHsKLQkJZGV2X2VycigmaGRldi0+ZGV2LCAiZmFpbGVkIHRvIGFsbG9jYXRlIGlucHV0IGRldmljZSIpOworCQloaWRfZXJyKGhkZXYsICJmYWlsZWQgdG8gYWxsb2NhdGUgaW5wdXQgZGV2aWNlXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCWlucHV0X3NldF9kcnZkYXRhKGlkZXYsIGhkZXYpOwpAQCAtMjQ4NSw3ICsyNDg1LDcgQEAKIAkJaW5wdXRfc2V0X2NhcGFiaWxpdHkoaWRldiwgRVZfS0VZLCBkYXRhLT5rZXljb2RlW2ldKTsKIAllcnJvciA9IGlucHV0X3JlZ2lzdGVyX2RldmljZShpZGV2KTsKIAlpZiAoZXJyb3IpIHsKLQkJZGV2X2VycigmaGRldi0+ZGV2LCAiZXJyb3IgcmVnaXN0ZXJpbmcgdGhlIGlucHV0IGRldmljZSIpOworCQloaWRfZXJyKGhkZXYsICJlcnJvciByZWdpc3RlcmluZyB0aGUgaW5wdXQgZGV2aWNlXG4iKTsKIAkJaW5wdXRfZnJlZV9kZXZpY2UoaWRldik7CiAJCXJldHVybiBlcnJvcjsKIAl9CkBAIC0yNTIyLDkgKzI1MjIsOCBAQAogCQlyZXR1cm4gZXJyb3I7CiAKIAlpZiAoZGF0YS0+dmVyc2lvblswXSAhPSAwICYmIGRhdGEtPnZlcnNpb25bMV0gIT0gMykKLQkJZGV2X2luZm8oJmhkZXYtPmRldiwgIkRldmljZSB3aXRoIHVudGVzdGVkIGZpcm13YXJlIHJldmlzaW9uLCAiCi0JCQkJInBsZWFzZSBzdWJtaXQgL3N5cy9rZXJuZWwvZGVidWcvaGlkLyVzL3JkZXNjIGZvciB0aGlzIGRldmljZS5cbiIsCi0JCQkJZGV2X25hbWUoJmhkZXYtPmRldikpOworCQloaWRfaW5mbyhoZGV2LCAiRGV2aWNlIHdpdGggdW50ZXN0ZWQgZmlybXdhcmUgcmV2aXNpb24sIHBsZWFzZSBzdWJtaXQgL3N5cy9rZXJuZWwvZGVidWcvaGlkLyVzL3JkZXNjIGZvciB0aGlzIGRldmljZS5cbiIsCisJCQkgZGV2X25hbWUoJmhkZXYtPmRldikpOwogCiAJLyogU2V0dXAga2V5cGFkIGlucHV0IGRldmljZSAqLwogCWVycm9yID0gcGljb2xjZF9pbml0X2tleXMoZGF0YSwgcGljb2xjZF9pbl9yZXBvcnQoUkVQT1JUX0tFWV9TVEFURSwgaGRldikpOwpAQCAtMjU4MSw5ICsyNTgwLDggQEAKIAkJcmV0dXJuIGVycm9yOwogCiAJaWYgKGRhdGEtPnZlcnNpb25bMF0gIT0gMSAmJiBkYXRhLT52ZXJzaW9uWzFdICE9IDApCi0JCWRldl9pbmZvKCZoZGV2LT5kZXYsICJEZXZpY2Ugd2l0aCB1bnRlc3RlZCBib290bG9hZGVyIHJldmlzaW9uLCAiCi0JCQkJInBsZWFzZSBzdWJtaXQgL3N5cy9rZXJuZWwvZGVidWcvaGlkLyVzL3JkZXNjIGZvciB0aGlzIGRldmljZS5cbiIsCi0JCQkJZGV2X25hbWUoJmhkZXYtPmRldikpOworCQloaWRfaW5mbyhoZGV2LCAiRGV2aWNlIHdpdGggdW50ZXN0ZWQgYm9vdGxvYWRlciByZXZpc2lvbiwgcGxlYXNlIHN1Ym1pdCAvc3lzL2tlcm5lbC9kZWJ1Zy9oaWQvJXMvcmRlc2MgZm9yIHRoaXMgZGV2aWNlLlxuIiwKKwkJCSBkZXZfbmFtZSgmaGRldi0+ZGV2KSk7CiAKIAlwaWNvbGNkX2luaXRfZGV2ZnMoZGF0YSwgTlVMTCwgTlVMTCwKIAkJCXBpY29sY2Rfb3V0X3JlcG9ydChSRVBPUlRfQkxfUkVBRF9NRU1PUlksIGhkZXYpLApAQCAtMjYwNSw3ICsyNjAzLDcgQEAKIAkgKi8KIAlkYXRhID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHBpY29sY2RfZGF0YSksIEdGUF9LRVJORUwpOwogCWlmIChkYXRhID09IE5VTEwpIHsKLQkJZGV2X2VycigmaGRldi0+ZGV2LCAiY2FuJ3QgYWxsb2NhdGUgc3BhY2UgZm9yIE1pbmlib3ggUGljb0xDRCBkZXZpY2UgZGF0YVxuIik7CisJCWhpZF9lcnIoaGRldiwgImNhbid0IGFsbG9jYXRlIHNwYWNlIGZvciBNaW5pYm94IFBpY29MQ0QgZGV2aWNlIGRhdGFcbiIpOwogCQllcnJvciA9IC1FTk9NRU07CiAJCWdvdG8gZXJyX25vX2NsZWFudXA7CiAJfQpAQCAtMjYyMSw3ICsyNjE5LDcgQEAKIAkvKiBQYXJzZSB0aGUgZGV2aWNlIHJlcG9ydHMgYW5kIHN0YXJ0IGl0IHVwICovCiAJZXJyb3IgPSBoaWRfcGFyc2UoaGRldik7CiAJaWYgKGVycm9yKSB7Ci0JCWRldl9lcnIoJmhkZXYtPmRldiwgImRldmljZSByZXBvcnQgcGFyc2UgZmFpbGVkXG4iKTsKKwkJaGlkX2VycihoZGV2LCAiZGV2aWNlIHJlcG9ydCBwYXJzZSBmYWlsZWRcbiIpOwogCQlnb3RvIGVycl9jbGVhbnVwX2RhdGE7CiAJfQogCkBAIC0yNjMxLDI1ICsyNjI5LDI1IEBACiAJZXJyb3IgPSBoaWRfaHdfc3RhcnQoaGRldiwgMCk7CiAJaGRldi0+Y2xhaW1lZCA9IDA7CiAJaWYgKGVycm9yKSB7Ci0JCWRldl9lcnIoJmhkZXYtPmRldiwgImhhcmR3YXJlIHN0YXJ0IGZhaWxlZFxuIik7CisJCWhpZF9lcnIoaGRldiwgImhhcmR3YXJlIHN0YXJ0IGZhaWxlZFxuIik7CiAJCWdvdG8gZXJyX2NsZWFudXBfZGF0YTsKIAl9CiAKLQllcnJvciA9IGhkZXYtPmxsX2RyaXZlci0+b3BlbihoZGV2KTsKKwllcnJvciA9IGhpZF9od19vcGVuKGhkZXYpOwogCWlmIChlcnJvcikgewotCQlkZXZfZXJyKCZoZGV2LT5kZXYsICJmYWlsZWQgdG8gb3BlbiBpbnB1dCBpbnRlcnJ1cHQgcGlwZSBmb3Iga2V5IGFuZCBJUiBldmVudHNcbiIpOworCQloaWRfZXJyKGhkZXYsICJmYWlsZWQgdG8gb3BlbiBpbnB1dCBpbnRlcnJ1cHQgcGlwZSBmb3Iga2V5IGFuZCBJUiBldmVudHNcbiIpOwogCQlnb3RvIGVycl9jbGVhbnVwX2hpZF9odzsKIAl9CiAKIAllcnJvciA9IGRldmljZV9jcmVhdGVfZmlsZSgmaGRldi0+ZGV2LCAmZGV2X2F0dHJfb3BlcmF0aW9uX21vZGVfZGVsYXkpOwogCWlmIChlcnJvcikgewotCQlkZXZfZXJyKCZoZGV2LT5kZXYsICJmYWlsZWQgdG8gY3JlYXRlIHN5c2ZzIGF0dHJpYnV0ZXNcbiIpOworCQloaWRfZXJyKGhkZXYsICJmYWlsZWQgdG8gY3JlYXRlIHN5c2ZzIGF0dHJpYnV0ZXNcbiIpOwogCQlnb3RvIGVycl9jbGVhbnVwX2hpZF9sbDsKIAl9CiAKIAllcnJvciA9IGRldmljZV9jcmVhdGVfZmlsZSgmaGRldi0+ZGV2LCAmZGV2X2F0dHJfb3BlcmF0aW9uX21vZGUpOwogCWlmIChlcnJvcikgewotCQlkZXZfZXJyKCZoZGV2LT5kZXYsICJmYWlsZWQgdG8gY3JlYXRlIHN5c2ZzIGF0dHJpYnV0ZXNcbiIpOworCQloaWRfZXJyKGhkZXYsICJmYWlsZWQgdG8gY3JlYXRlIHN5c2ZzIGF0dHJpYnV0ZXNcbiIpOwogCQlnb3RvIGVycl9jbGVhbnVwX3N5c2ZzMTsKIAl9CiAKQEAgLTI2NjgsNyArMjY2Niw3IEBACiBlcnJfY2xlYW51cF9zeXNmczE6CiAJZGV2aWNlX3JlbW92ZV9maWxlKCZoZGV2LT5kZXYsICZkZXZfYXR0cl9vcGVyYXRpb25fbW9kZV9kZWxheSk7CiBlcnJfY2xlYW51cF9oaWRfbGw6Ci0JaGRldi0+bGxfZHJpdmVyLT5jbG9zZShoZGV2KTsKKwloaWRfaHdfY2xvc2UoaGRldik7CiBlcnJfY2xlYW51cF9oaWRfaHc6CiAJaGlkX2h3X3N0b3AoaGRldik7CiBlcnJfY2xlYW51cF9kYXRhOgpAQCAtMjY5OSw3ICsyNjk3LDcgQEAKIAlwaWNvbGNkX2V4aXRfZGV2ZnMoZGF0YSk7CiAJZGV2aWNlX3JlbW92ZV9maWxlKCZoZGV2LT5kZXYsICZkZXZfYXR0cl9vcGVyYXRpb25fbW9kZSk7CiAJZGV2aWNlX3JlbW92ZV9maWxlKCZoZGV2LT5kZXYsICZkZXZfYXR0cl9vcGVyYXRpb25fbW9kZV9kZWxheSk7Ci0JaGRldi0+bGxfZHJpdmVyLT5jbG9zZShoZGV2KTsKKwloaWRfaHdfY2xvc2UoaGRldik7CiAJaGlkX2h3X3N0b3AoaGRldik7CiAJaGlkX3NldF9kcnZkYXRhKGhkZXYsIE5VTEwpOwogCkBAIC0yNzUzLDcgKzI3NTEsNyBAQAogewogCWhpZF91bnJlZ2lzdGVyX2RyaXZlcigmcGljb2xjZF9kcml2ZXIpOwogI2lmZGVmIENPTkZJR19ISURfUElDT0xDRF9GQgotCWZsdXNoX3NjaGVkdWxlZF93b3JrKCk7CisJZmx1c2hfd29ya19zeW5jKCZwaWNvbGNkX2ZiX2NsZWFudXApOwogCVdBUk5fT04oZmJfcGVuZGluZyk7CiAjZW5kaWYKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL2hpZC1wbC5jIGIvZHJpdmVycy9oaWQvaGlkLXBsLmMKaW5kZXggOWY0MWUyYi4uMDZlNTMwMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvaGlkLXBsLmMKKysrIGIvZHJpdmVycy9oaWQvaGlkLXBsLmMKQEAgLTEwMyw3ICsxMDMsNyBAQAogCSovCiAKIAlpZiAobGlzdF9lbXB0eShyZXBvcnRfbGlzdCkpIHsKLQkJZGV2X2VycigmaGlkLT5kZXYsICJubyBvdXRwdXQgcmVwb3J0cyBmb3VuZFxuIik7CisJCWhpZF9lcnIoaGlkLCAibm8gb3V0cHV0IHJlcG9ydHMgZm91bmRcbiIpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKQEAgLTExMiwxNCArMTEyLDEzIEBACiAJCXJlcG9ydF9wdHIgPSByZXBvcnRfcHRyLT5uZXh0OwogCiAJCWlmIChyZXBvcnRfcHRyID09IHJlcG9ydF9saXN0KSB7Ci0JCQlkZXZfZXJyKCZoaWQtPmRldiwgInJlcXVpcmVkIG91dHB1dCByZXBvcnQgaXMgIgotCQkJCQkibWlzc2luZ1xuIik7CisJCQloaWRfZXJyKGhpZCwgInJlcXVpcmVkIG91dHB1dCByZXBvcnQgaXMgbWlzc2luZ1xuIik7CiAJCQlyZXR1cm4gLUVOT0RFVjsKIAkJfQogCiAJCXJlcG9ydCA9IGxpc3RfZW50cnkocmVwb3J0X3B0ciwgc3RydWN0IGhpZF9yZXBvcnQsIGxpc3QpOwogCQlpZiAocmVwb3J0LT5tYXhmaWVsZCA8IDEpIHsKLQkJCWRldl9lcnIoJmhpZC0+ZGV2LCAibm8gZmllbGRzIGluIHRoZSByZXBvcnRcbiIpOworCQkJaGlkX2VycihoaWQsICJubyBmaWVsZHMgaW4gdGhlIHJlcG9ydFxuIik7CiAJCQlyZXR1cm4gLUVOT0RFVjsKIAkJfQogCkBAIC0xMzcsNyArMTM2LDcgQEAKIAkJCXdlYWsgPSAmcmVwb3J0LT5maWVsZFszXS0+dmFsdWVbMF07CiAJCQlkZWJ1ZygiZGV0ZWN0ZWQgNC1maWVsZCBkZXZpY2UiKTsKIAkJfSBlbHNlIHsKLQkJCWRldl9lcnIoJmhpZC0+ZGV2LCAibm90IGVub3VnaCBmaWVsZHMgb3IgdmFsdWVzXG4iKTsKKwkJCWhpZF9lcnIoaGlkLCAibm90IGVub3VnaCBmaWVsZHMgb3IgdmFsdWVzXG4iKTsKIAkJCXJldHVybiAtRU5PREVWOwogCQl9CiAKQEAgLTE2NCw4ICsxNjMsNyBAQAogCQl1c2JoaWRfc3VibWl0X3JlcG9ydChoaWQsIHBsZmYtPnJlcG9ydCwgVVNCX0RJUl9PVVQpOwogCX0KIAotCWRldl9pbmZvKCZoaWQtPmRldiwgIkZvcmNlIGZlZWRiYWNrIGZvciBQYW50aGVyTG9yZC9HcmVlbkFzaWEgIgotCSAgICAgICAiZGV2aWNlcyBieSBBbnNzaSBIYW5udWxhIDxhbnNzaS5oYW5udWxhQGdtYWlsLmNvbT5cbiIpOworCWhpZF9pbmZvKGhpZCwgIkZvcmNlIGZlZWRiYWNrIGZvciBQYW50aGVyTG9yZC9HcmVlbkFzaWEgZGV2aWNlcyBieSBBbnNzaSBIYW5udWxhIDxhbnNzaS5oYW5udWxhQGdtYWlsLmNvbT5cbiIpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xODUsMTMgKzE4MywxMyBAQAogCiAJcmV0ID0gaGlkX3BhcnNlKGhkZXYpOwogCWlmIChyZXQpIHsKLQkJZGV2X2VycigmaGRldi0+ZGV2LCAicGFyc2UgZmFpbGVkXG4iKTsKKwkJaGlkX2VycihoZGV2LCAicGFyc2UgZmFpbGVkXG4iKTsKIAkJZ290byBlcnI7CiAJfQogCiAJcmV0ID0gaGlkX2h3X3N0YXJ0KGhkZXYsIEhJRF9DT05ORUNUX0RFRkFVTFQgJiB+SElEX0NPTk5FQ1RfRkYpOwogCWlmIChyZXQpIHsKLQkJZGV2X2VycigmaGRldi0+ZGV2LCAiaHcgc3RhcnQgZmFpbGVkXG4iKTsKKwkJaGlkX2VycihoZGV2LCAiaHcgc3RhcnQgZmFpbGVkXG4iKTsKIAkJZ290byBlcnI7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC9oaWQtcHJvZGlrZXlzLmMgYi9kcml2ZXJzL2hpZC9oaWQtcHJvZGlrZXlzLmMKaW5kZXggNDhlYWI4NC4uYWIxOWYyOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvaGlkLXByb2Rpa2V5cy5jCisrKyBiL2RyaXZlcnMvaGlkL2hpZC1wcm9kaWtleXMuYwpAQCAtMTYsNiArMTYsOCBAQAogICogYW55IGxhdGVyIHZlcnNpb24uCiAgKi8KIAorI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvdXNiLmg+CkBAIC0xMzAsNyArMTMyLDcgQEAKIAlyZXR1cm4gLUVJTlZBTDsKIH0KIAotc3RhdGljIERFVklDRV9BVFRSKGNoYW5uZWwsIFNfSVJVR08gfCBTX0lXVUdPLCBzaG93X2NoYW5uZWwsCitzdGF0aWMgREVWSUNFX0FUVFIoY2hhbm5lbCwgU19JUlVHTyB8IFNfSVdVU1IgfCBTX0lXR1JQICwgc2hvd19jaGFubmVsLAogCQlzdG9yZV9jaGFubmVsKTsKIAogc3RhdGljIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpzeXNmc19kZXZpY2VfYXR0cl9jaGFubmVsID0gewpAQCAtMTY5LDcgKzE3MSw3IEBACiAJcmV0dXJuIC1FSU5WQUw7CiB9CiAKLXN0YXRpYyBERVZJQ0VfQVRUUihzdXN0YWluLCBTX0lSVUdPIHwgU19JV1VHTywgc2hvd19zdXN0YWluLAorc3RhdGljIERFVklDRV9BVFRSKHN1c3RhaW4sIFNfSVJVR08gfCBTX0lXVVNSIHwgU19JV0dSUCwgc2hvd19zdXN0YWluLAogCQlzdG9yZV9zdXN0YWluKTsKIAogc3RhdGljIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpzeXNmc19kZXZpY2VfYXR0cl9zdXN0YWluID0gewpAQCAtMjA3LDcgKzIwOSw3IEBACiAJcmV0dXJuIC1FSU5WQUw7CiB9CiAKLXN0YXRpYyBERVZJQ0VfQVRUUihvY3RhdmUsIFNfSVJVR08gfCBTX0lXVUdPLCBzaG93X29jdGF2ZSwKK3N0YXRpYyBERVZJQ0VfQVRUUihvY3RhdmUsIFNfSVJVR08gfCBTX0lXVVNSIHwgU19JV0dSUCwgc2hvd19vY3RhdmUsCiAJCXN0b3JlX29jdGF2ZSk7CiAKIHN0YXRpYyBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqc3lzZnNfZGV2aWNlX2F0dHJfb2N0YXZlID0gewpAQCAtMjg1LDExICsyODcsMTEgQEAKIAkJCWNvbnRpbnVlOwogCiAJCWlmIChyZXBvcnQtPm1heGZpZWxkIDwgMSkgewotCQkJZGV2X2VycigmaGRldi0+ZGV2LCAib3V0cHV0IHJlcG9ydCBpcyBlbXB0eVxuIik7CisJCQloaWRfZXJyKGhkZXYsICJvdXRwdXQgcmVwb3J0IGlzIGVtcHR5XG4iKTsKIAkJCWJyZWFrOwogCQl9CiAJCWlmIChyZXBvcnQtPmZpZWxkWzBdLT5yZXBvcnRfY291bnQgIT0gMikgewotCQkJZGV2X2VycigmaGRldi0+ZGV2LCAiZmllbGQgY291bnQgdG9vIGxvd1xuIik7CisJCQloaWRfZXJyKGhkZXYsICJmaWVsZCBjb3VudCB0b28gbG93XG4iKTsKIAkJCWJyZWFrOwogCQl9CiAJCXBtLT5wY21pZGlfcmVwb3J0NiA9IHJlcG9ydDsKQEAgLTc0Niw4ICs3NDgsOCBAQAogCWlmICgqcnNpemUgPT0gMTc4ICYmCiAJICAgICAgcmRlc2NbMTExXSA9PSAweDA2ICYmIHJkZXNjWzExMl0gPT0gMHgwMCAmJgogCSAgICAgIHJkZXNjWzExM10gPT0gMHhmZikgewotCQlkZXZfaW5mbygmaGRldi0+ZGV2LCAiZml4aW5nIHVwIHBjLW1pZGkga2V5Ym9hcmQgcmVwb3J0ICIKLQkJCSJkZXNjcmlwdG9yXG4iKTsKKwkJaGlkX2luZm8oaGRldiwKKwkJCSAiZml4aW5nIHVwIHBjLW1pZGkga2V5Ym9hcmQgcmVwb3J0IGRlc2NyaXB0b3JcbiIpOwogCiAJCXJkZXNjWzE0NF0gPSAweDE4OyAvKiByZXBvcnQgNDogd2FzIDB4MTAgcmVwb3J0IGNvdW50ICovCiAJfQpAQCAtODA1LDcgKzgwNyw3IEBACiAKIAlwayA9IGt6YWxsb2Moc2l6ZW9mKCpwayksIEdGUF9LRVJORUwpOwogCWlmIChwayA9PSBOVUxMKSB7Ci0JCWRldl9lcnIoJmhkZXYtPmRldiwgInByb2Rpa2V5czogY2FuJ3QgYWxsb2MgZGVzY3JpcHRvclxuIik7CisJCWhpZF9lcnIoaGRldiwgImNhbid0IGFsbG9jIGRlc2NyaXB0b3JcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKQEAgLTgxMyw4ICs4MTUsNyBAQAogCiAJcG0gPSBremFsbG9jKHNpemVvZigqcG0pLCBHRlBfS0VSTkVMKTsKIAlpZiAocG0gPT0gTlVMTCkgewotCQlkZXZfZXJyKCZoZGV2LT5kZXYsCi0JCQkicHJvZGlrZXlzOiBjYW4ndCBhbGxvYyBkZXNjcmlwdG9yXG4iKTsKKwkJaGlkX2VycihoZGV2LCAiY2FuJ3QgYWxsb2MgZGVzY3JpcHRvclxuIik7CiAJCXJldCA9IC1FTk9NRU07CiAJCWdvdG8gZXJyX2ZyZWU7CiAJfQpAQCAtODI3LDcgKzgyOCw3IEBACiAKIAlyZXQgPSBoaWRfcGFyc2UoaGRldik7CiAJaWYgKHJldCkgewotCQlkZXZfZXJyKCZoZGV2LT5kZXYsICJwcm9kaWtleXM6IGhpZCBwYXJzZSBmYWlsZWRcbiIpOworCQloaWRfZXJyKGhkZXYsICJoaWQgcGFyc2UgZmFpbGVkXG4iKTsKIAkJZ290byBlcnJfZnJlZTsKIAl9CiAKQEAgLTgzNyw3ICs4MzgsNyBAQAogCiAJcmV0ID0gaGlkX2h3X3N0YXJ0KGhkZXYsIEhJRF9DT05ORUNUX0RFRkFVTFQpOwogCWlmIChyZXQpIHsKLQkJZGV2X2VycigmaGRldi0+ZGV2LCAicHJvZGlrZXlzOiBodyBzdGFydCBmYWlsZWRcbiIpOworCQloaWRfZXJyKGhkZXYsICJodyBzdGFydCBmYWlsZWRcbiIpOwogCQlnb3RvIGVycl9mcmVlOwogCX0KIApAQCAtODk2LDcgKzg5Nyw3IEBACiAKIAlyZXQgPSBoaWRfcmVnaXN0ZXJfZHJpdmVyKCZwa19kcml2ZXIpOwogCWlmIChyZXQpCi0JCXByaW50ayhLRVJOX0VSUiAiY2FuJ3QgcmVnaXN0ZXIgcHJvZGlrZXlzIGRyaXZlclxuIik7CisJCXByX2VycigiY2FuJ3QgcmVnaXN0ZXIgcHJvZGlrZXlzIGRyaXZlclxuIik7CiAKIAlyZXR1cm4gcmV0OwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvaGlkLXF1YW50YS5jIGIvZHJpdmVycy9oaWQvaGlkLXF1YW50YS5jCmluZGV4IDU0ZDNkYjUuLjg3YTU0ZGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaGlkL2hpZC1xdWFudGEuYworKysgYi9kcml2ZXJzL2hpZC9oaWQtcXVhbnRhLmMKQEAgLTE5NSw3ICsxOTUsNyBAQAogCiAJdGQgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcXVhbnRhX2RhdGEpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXRkKSB7Ci0JCWRldl9lcnIoJmhkZXYtPmRldiwgImNhbm5vdCBhbGxvY2F0ZSBRdWFudGEgVG91Y2ggZGF0YVxuIik7CisJCWhpZF9lcnIoaGRldiwgImNhbm5vdCBhbGxvY2F0ZSBRdWFudGEgVG91Y2ggZGF0YVxuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAl0ZC0+dmFsaWQgPSBmYWxzZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL2hpZC1yb2NjYXQta29uZS5jIGIvZHJpdmVycy9oaWQvaGlkLXJvY2NhdC1rb25lLmMKaW5kZXggZjc3Njk1Ny4uY2JkOGNjNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvaGlkLXJvY2NhdC1rb25lLmMKKysrIGIvZHJpdmVycy9oaWQvaGlkLXJvY2NhdC1rb25lLmMKQEAgLTM1LDYgKzM1LDExIEBACiAjaW5jbHVkZSAiaGlkLXJvY2NhdC5oIgogI2luY2x1ZGUgImhpZC1yb2NjYXQta29uZS5oIgogCitzdGF0aWMgdWludCBwcm9maWxlX251bWJlcnNbNV0gPSB7MCwgMSwgMiwgMywgNH07CisKKy8qIGtvbmVfY2xhc3MgaXMgdXNlZCBmb3IgY3JlYXRpbmcgc3lzZnMgYXR0cmlidXRlcyB2aWEgcm9jY2F0IGNoYXIgZGV2aWNlICovCitzdGF0aWMgc3RydWN0IGNsYXNzICprb25lX2NsYXNzOworCiBzdGF0aWMgdm9pZCBrb25lX3NldF9zZXR0aW5nc19jaGVja3N1bShzdHJ1Y3Qga29uZV9zZXR0aW5ncyAqc2V0dGluZ3MpCiB7CiAJdWludDE2X3QgY2hlY2tzdW0gPSAwOwpAQCAtOTAsOCArOTUsNyBAQAogCQlrZnJlZShkYXRhKTsKIAkJcmV0dXJuIDA7CiAJfSBlbHNlIHsgLyogdW5rbm93biBhbnN3ZXIgKi8KLQkJZGV2X2VycigmdXNiX2Rldi0+ZGV2LCAiZ290IHJldHZhbCAlZCB3aGVuIGNoZWNraW5nIHdyaXRlXG4iLAotCQkJCSpkYXRhKTsKKwkJaGlkX2Vycih1c2JfZGV2LCAiZ290IHJldHZhbCAlZCB3aGVuIGNoZWNraW5nIHdyaXRlXG4iLCAqZGF0YSk7CiAJCWtmcmVlKGRhdGEpOwogCQlyZXR1cm4gLUVJTzsKIAl9CkBAIC0yNjIsNyArMjY2LDggQEAKIHN0YXRpYyBzc2l6ZV90IGtvbmVfc3lzZnNfcmVhZF9zZXR0aW5ncyhzdHJ1Y3QgZmlsZSAqZnAsIHN0cnVjdCBrb2JqZWN0ICprb2JqLAogCQlzdHJ1Y3QgYmluX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmLAogCQlsb2ZmX3Qgb2ZmLCBzaXplX3QgY291bnQpIHsKLQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBjb250YWluZXJfb2Yoa29iaiwgc3RydWN0IGRldmljZSwga29iaik7CisJc3RydWN0IGRldmljZSAqZGV2ID0KKwkJCWNvbnRhaW5lcl9vZihrb2JqLCBzdHJ1Y3QgZGV2aWNlLCBrb2JqKS0+cGFyZW50LT5wYXJlbnQ7CiAJc3RydWN0IGtvbmVfZGV2aWNlICprb25lID0gaGlkX2dldF9kcnZkYXRhKGRldl9nZXRfZHJ2ZGF0YShkZXYpKTsKIAogCWlmIChvZmYgPj0gc2l6ZW9mKHN0cnVjdCBrb25lX3NldHRpbmdzKSkKQEAgLTI4Niw3ICsyOTEsOCBAQAogc3RhdGljIHNzaXplX3Qga29uZV9zeXNmc193cml0ZV9zZXR0aW5ncyhzdHJ1Y3QgZmlsZSAqZnAsIHN0cnVjdCBrb2JqZWN0ICprb2JqLAogCQlzdHJ1Y3QgYmluX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmLAogCQlsb2ZmX3Qgb2ZmLCBzaXplX3QgY291bnQpIHsKLQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBjb250YWluZXJfb2Yoa29iaiwgc3RydWN0IGRldmljZSwga29iaik7CisJc3RydWN0IGRldmljZSAqZGV2ID0KKwkJCWNvbnRhaW5lcl9vZihrb2JqLCBzdHJ1Y3QgZGV2aWNlLCBrb2JqKS0+cGFyZW50LT5wYXJlbnQ7CiAJc3RydWN0IGtvbmVfZGV2aWNlICprb25lID0gaGlkX2dldF9kcnZkYXRhKGRldl9nZXRfZHJ2ZGF0YShkZXYpKTsKIAlzdHJ1Y3QgdXNiX2RldmljZSAqdXNiX2RldiA9IGludGVyZmFjZV90b191c2JkZXYodG9fdXNiX2ludGVyZmFjZShkZXYpKTsKIAlpbnQgcmV0dmFsID0gMCwgZGlmZmVyZW5jZTsKQEAgLTMxOSwxMCArMzI1LDExIEBACiAJcmV0dXJuIHNpemVvZihzdHJ1Y3Qga29uZV9zZXR0aW5ncyk7CiB9CiAKLXN0YXRpYyBzc2l6ZV90IGtvbmVfc3lzZnNfcmVhZF9wcm9maWxleChzdHJ1Y3Qga29iamVjdCAqa29iaiwKLQkJc3RydWN0IGJpbl9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZiwKLQkJbG9mZl90IG9mZiwgc2l6ZV90IGNvdW50LCBpbnQgbnVtYmVyKSB7Ci0Jc3RydWN0IGRldmljZSAqZGV2ID0gY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBkZXZpY2UsIGtvYmopOworc3RhdGljIHNzaXplX3Qga29uZV9zeXNmc19yZWFkX3Byb2ZpbGV4KHN0cnVjdCBmaWxlICpmcCwKKwkJc3RydWN0IGtvYmplY3QgKmtvYmosIHN0cnVjdCBiaW5fYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYsIGxvZmZfdCBvZmYsIHNpemVfdCBjb3VudCkgeworCXN0cnVjdCBkZXZpY2UgKmRldiA9CisJCQljb250YWluZXJfb2Yoa29iaiwgc3RydWN0IGRldmljZSwga29iaiktPnBhcmVudC0+cGFyZW50OwogCXN0cnVjdCBrb25lX2RldmljZSAqa29uZSA9IGhpZF9nZXRfZHJ2ZGF0YShkZXZfZ2V0X2RydmRhdGEoZGV2KSk7CiAKIAlpZiAob2ZmID49IHNpemVvZihzdHJ1Y3Qga29uZV9wcm9maWxlKSkKQEAgLTMzMiw0NyArMzM5LDE4IEBACiAJCWNvdW50ID0gc2l6ZW9mKHN0cnVjdCBrb25lX3Byb2ZpbGUpIC0gb2ZmOwogCiAJbXV0ZXhfbG9jaygma29uZS0+a29uZV9sb2NrKTsKLQltZW1jcHkoYnVmLCAoKGNoYXIgY29uc3QgKikma29uZS0+cHJvZmlsZXNbbnVtYmVyIC0gMV0pICsgb2ZmLCBjb3VudCk7CisJbWVtY3B5KGJ1ZiwgKChjaGFyIGNvbnN0ICopJmtvbmUtPnByb2ZpbGVzWyoodWludCAqKShhdHRyLT5wcml2YXRlKV0pICsgb2ZmLCBjb3VudCk7CiAJbXV0ZXhfdW5sb2NrKCZrb25lLT5rb25lX2xvY2spOwogCiAJcmV0dXJuIGNvdW50OwogfQogCi1zdGF0aWMgc3NpemVfdCBrb25lX3N5c2ZzX3JlYWRfcHJvZmlsZTEoc3RydWN0IGZpbGUgKmZwLCBzdHJ1Y3Qga29iamVjdCAqa29iaiwKLQkJc3RydWN0IGJpbl9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZiwKLQkJbG9mZl90IG9mZiwgc2l6ZV90IGNvdW50KSB7Ci0JcmV0dXJuIGtvbmVfc3lzZnNfcmVhZF9wcm9maWxleChrb2JqLCBhdHRyLCBidWYsIG9mZiwgY291bnQsIDEpOwotfQotCi1zdGF0aWMgc3NpemVfdCBrb25lX3N5c2ZzX3JlYWRfcHJvZmlsZTIoc3RydWN0IGZpbGUgKmZwLCBzdHJ1Y3Qga29iamVjdCAqa29iaiwKLQkJc3RydWN0IGJpbl9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZiwKLQkJbG9mZl90IG9mZiwgc2l6ZV90IGNvdW50KSB7Ci0JcmV0dXJuIGtvbmVfc3lzZnNfcmVhZF9wcm9maWxleChrb2JqLCBhdHRyLCBidWYsIG9mZiwgY291bnQsIDIpOwotfQotCi1zdGF0aWMgc3NpemVfdCBrb25lX3N5c2ZzX3JlYWRfcHJvZmlsZTMoc3RydWN0IGZpbGUgKmZwLCBzdHJ1Y3Qga29iamVjdCAqa29iaiwKLQkJc3RydWN0IGJpbl9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZiwKLQkJbG9mZl90IG9mZiwgc2l6ZV90IGNvdW50KSB7Ci0JcmV0dXJuIGtvbmVfc3lzZnNfcmVhZF9wcm9maWxleChrb2JqLCBhdHRyLCBidWYsIG9mZiwgY291bnQsIDMpOwotfQotCi1zdGF0aWMgc3NpemVfdCBrb25lX3N5c2ZzX3JlYWRfcHJvZmlsZTQoc3RydWN0IGZpbGUgKmZwLCBzdHJ1Y3Qga29iamVjdCAqa29iaiwKLQkJc3RydWN0IGJpbl9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZiwKLQkJbG9mZl90IG9mZiwgc2l6ZV90IGNvdW50KSB7Ci0JcmV0dXJuIGtvbmVfc3lzZnNfcmVhZF9wcm9maWxleChrb2JqLCBhdHRyLCBidWYsIG9mZiwgY291bnQsIDQpOwotfQotCi1zdGF0aWMgc3NpemVfdCBrb25lX3N5c2ZzX3JlYWRfcHJvZmlsZTUoc3RydWN0IGZpbGUgKmZwLCBzdHJ1Y3Qga29iamVjdCAqa29iaiwKLQkJc3RydWN0IGJpbl9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZiwKLQkJbG9mZl90IG9mZiwgc2l6ZV90IGNvdW50KSB7Ci0JcmV0dXJuIGtvbmVfc3lzZnNfcmVhZF9wcm9maWxleChrb2JqLCBhdHRyLCBidWYsIG9mZiwgY291bnQsIDUpOwotfQotCiAvKiBXcml0ZXMgZGF0YSBvbmx5IGlmIGRpZmZlcmVudCB0byBzdG9yZWQgZGF0YSAqLwotc3RhdGljIHNzaXplX3Qga29uZV9zeXNmc193cml0ZV9wcm9maWxleChzdHJ1Y3Qga29iamVjdCAqa29iaiwKLQkJc3RydWN0IGJpbl9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZiwKLQkJbG9mZl90IG9mZiwgc2l6ZV90IGNvdW50LCBpbnQgbnVtYmVyKSB7Ci0Jc3RydWN0IGRldmljZSAqZGV2ID0gY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBkZXZpY2UsIGtvYmopOworc3RhdGljIHNzaXplX3Qga29uZV9zeXNmc193cml0ZV9wcm9maWxleChzdHJ1Y3QgZmlsZSAqZnAsCisJCXN0cnVjdCBrb2JqZWN0ICprb2JqLCBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmLCBsb2ZmX3Qgb2ZmLCBzaXplX3QgY291bnQpIHsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPQorCQkJY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBkZXZpY2UsIGtvYmopLT5wYXJlbnQtPnBhcmVudDsKIAlzdHJ1Y3Qga29uZV9kZXZpY2UgKmtvbmUgPSBoaWRfZ2V0X2RydmRhdGEoZGV2X2dldF9kcnZkYXRhKGRldikpOwogCXN0cnVjdCB1c2JfZGV2aWNlICp1c2JfZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldih0b191c2JfaW50ZXJmYWNlKGRldikpOwogCXN0cnVjdCBrb25lX3Byb2ZpbGUgKnByb2ZpbGU7CkBAIC0zODIsMTMgKzM2MCwxNCBAQAogCWlmIChvZmYgIT0gMCB8fCBjb3VudCAhPSBzaXplb2Yoc3RydWN0IGtvbmVfcHJvZmlsZSkpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JcHJvZmlsZSA9ICZrb25lLT5wcm9maWxlc1tudW1iZXIgLSAxXTsKKwlwcm9maWxlID0gJmtvbmUtPnByb2ZpbGVzWyoodWludCAqKShhdHRyLT5wcml2YXRlKV07CiAKIAltdXRleF9sb2NrKCZrb25lLT5rb25lX2xvY2spOwogCWRpZmZlcmVuY2UgPSBtZW1jbXAoYnVmLCBwcm9maWxlLCBzaXplb2Yoc3RydWN0IGtvbmVfcHJvZmlsZSkpOwogCWlmIChkaWZmZXJlbmNlKSB7CiAJCXJldHZhbCA9IGtvbmVfc2V0X3Byb2ZpbGUodXNiX2RldiwKLQkJCQkoc3RydWN0IGtvbmVfcHJvZmlsZSBjb25zdCAqKWJ1ZiwgbnVtYmVyKTsKKwkJCQkoc3RydWN0IGtvbmVfcHJvZmlsZSBjb25zdCAqKWJ1ZiwKKwkJCQkqKHVpbnQgKikoYXR0ci0+cHJpdmF0ZSkgKyAxKTsKIAkJaWYgKCFyZXR2YWwpCiAJCQltZW1jcHkocHJvZmlsZSwgYnVmLCBzaXplb2Yoc3RydWN0IGtvbmVfcHJvZmlsZSkpOwogCX0KQEAgLTQwMCw0NyArMzc5LDE5IEBACiAJcmV0dXJuIHNpemVvZihzdHJ1Y3Qga29uZV9wcm9maWxlKTsKIH0KIAotc3RhdGljIHNzaXplX3Qga29uZV9zeXNmc193cml0ZV9wcm9maWxlMShzdHJ1Y3QgZmlsZSAqZnAsIHN0cnVjdCBrb2JqZWN0ICprb2JqLAotCQlzdHJ1Y3QgYmluX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmLAotCQlsb2ZmX3Qgb2ZmLCBzaXplX3QgY291bnQpIHsKLQlyZXR1cm4ga29uZV9zeXNmc193cml0ZV9wcm9maWxleChrb2JqLCBhdHRyLCBidWYsIG9mZiwgY291bnQsIDEpOwotfQotCi1zdGF0aWMgc3NpemVfdCBrb25lX3N5c2ZzX3dyaXRlX3Byb2ZpbGUyKHN0cnVjdCBmaWxlICpmcCwgc3RydWN0IGtvYmplY3QgKmtvYmosCi0JCXN0cnVjdCBiaW5fYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYsCi0JCWxvZmZfdCBvZmYsIHNpemVfdCBjb3VudCkgewotCXJldHVybiBrb25lX3N5c2ZzX3dyaXRlX3Byb2ZpbGV4KGtvYmosIGF0dHIsIGJ1Ziwgb2ZmLCBjb3VudCwgMik7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGtvbmVfc3lzZnNfd3JpdGVfcHJvZmlsZTMoc3RydWN0IGZpbGUgKmZwLCBzdHJ1Y3Qga29iamVjdCAqa29iaiwKLQkJc3RydWN0IGJpbl9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZiwKLQkJbG9mZl90IG9mZiwgc2l6ZV90IGNvdW50KSB7Ci0JcmV0dXJuIGtvbmVfc3lzZnNfd3JpdGVfcHJvZmlsZXgoa29iaiwgYXR0ciwgYnVmLCBvZmYsIGNvdW50LCAzKTsKLX0KLQotc3RhdGljIHNzaXplX3Qga29uZV9zeXNmc193cml0ZV9wcm9maWxlNChzdHJ1Y3QgZmlsZSAqZnAsIHN0cnVjdCBrb2JqZWN0ICprb2JqLAotCQlzdHJ1Y3QgYmluX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmLAotCQlsb2ZmX3Qgb2ZmLCBzaXplX3QgY291bnQpIHsKLQlyZXR1cm4ga29uZV9zeXNmc193cml0ZV9wcm9maWxleChrb2JqLCBhdHRyLCBidWYsIG9mZiwgY291bnQsIDQpOwotfQotCi1zdGF0aWMgc3NpemVfdCBrb25lX3N5c2ZzX3dyaXRlX3Byb2ZpbGU1KHN0cnVjdCBmaWxlICpmcCwgc3RydWN0IGtvYmplY3QgKmtvYmosCi0JCXN0cnVjdCBiaW5fYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYsCi0JCWxvZmZfdCBvZmYsIHNpemVfdCBjb3VudCkgewotCXJldHVybiBrb25lX3N5c2ZzX3dyaXRlX3Byb2ZpbGV4KGtvYmosIGF0dHIsIGJ1Ziwgb2ZmLCBjb3VudCwgNSk7Ci19Ci0KIHN0YXRpYyBzc2l6ZV90IGtvbmVfc3lzZnNfc2hvd19hY3R1YWxfcHJvZmlsZShzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCiB7Ci0Jc3RydWN0IGtvbmVfZGV2aWNlICprb25lID0gaGlkX2dldF9kcnZkYXRhKGRldl9nZXRfZHJ2ZGF0YShkZXYpKTsKKwlzdHJ1Y3Qga29uZV9kZXZpY2UgKmtvbmUgPQorCQkJaGlkX2dldF9kcnZkYXRhKGRldl9nZXRfZHJ2ZGF0YShkZXYtPnBhcmVudC0+cGFyZW50KSk7CiAJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWRcbiIsIGtvbmUtPmFjdHVhbF9wcm9maWxlKTsKIH0KIAogc3RhdGljIHNzaXplX3Qga29uZV9zeXNmc19zaG93X2FjdHVhbF9kcGkoc3RydWN0IGRldmljZSAqZGV2LAogCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogewotCXN0cnVjdCBrb25lX2RldmljZSAqa29uZSA9IGhpZF9nZXRfZHJ2ZGF0YShkZXZfZ2V0X2RydmRhdGEoZGV2KSk7CisJc3RydWN0IGtvbmVfZGV2aWNlICprb25lID0KKwkJCWhpZF9nZXRfZHJ2ZGF0YShkZXZfZ2V0X2RydmRhdGEoZGV2LT5wYXJlbnQtPnBhcmVudCkpOwogCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkXG4iLCBrb25lLT5hY3R1YWxfZHBpKTsKIH0KIApAQCAtNDQ4LDExICszOTksMTUgQEAKIHN0YXRpYyBzc2l6ZV90IGtvbmVfc3lzZnNfc2hvd193ZWlnaHQoc3RydWN0IGRldmljZSAqZGV2LAogCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogewotCXN0cnVjdCBrb25lX2RldmljZSAqa29uZSA9IGhpZF9nZXRfZHJ2ZGF0YShkZXZfZ2V0X2RydmRhdGEoZGV2KSk7Ci0Jc3RydWN0IHVzYl9kZXZpY2UgKnVzYl9kZXYgPSBpbnRlcmZhY2VfdG9fdXNiZGV2KHRvX3VzYl9pbnRlcmZhY2UoZGV2KSk7CisJc3RydWN0IGtvbmVfZGV2aWNlICprb25lOworCXN0cnVjdCB1c2JfZGV2aWNlICp1c2JfZGV2OwogCWludCB3ZWlnaHQgPSAwOwogCWludCByZXR2YWw7CiAKKwlkZXYgPSBkZXYtPnBhcmVudC0+cGFyZW50OworCWtvbmUgPSBoaWRfZ2V0X2RydmRhdGEoZGV2X2dldF9kcnZkYXRhKGRldikpOworCXVzYl9kZXYgPSBpbnRlcmZhY2VfdG9fdXNiZGV2KHRvX3VzYl9pbnRlcmZhY2UoZGV2KSk7CisKIAltdXRleF9sb2NrKCZrb25lLT5rb25lX2xvY2spOwogCXJldHZhbCA9IGtvbmVfZ2V0X3dlaWdodCh1c2JfZGV2LCAmd2VpZ2h0KTsKIAltdXRleF91bmxvY2soJmtvbmUtPmtvbmVfbG9jayk7CkBAIC00NjUsMTQgKzQyMCwxNiBAQAogc3RhdGljIHNzaXplX3Qga29uZV9zeXNmc19zaG93X2Zpcm13YXJlX3ZlcnNpb24oc3RydWN0IGRldmljZSAqZGV2LAogCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogewotCXN0cnVjdCBrb25lX2RldmljZSAqa29uZSA9IGhpZF9nZXRfZHJ2ZGF0YShkZXZfZ2V0X2RydmRhdGEoZGV2KSk7CisJc3RydWN0IGtvbmVfZGV2aWNlICprb25lID0KKwkJCWhpZF9nZXRfZHJ2ZGF0YShkZXZfZ2V0X2RydmRhdGEoZGV2LT5wYXJlbnQtPnBhcmVudCkpOwogCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkXG4iLCBrb25lLT5maXJtd2FyZV92ZXJzaW9uKTsKIH0KIAogc3RhdGljIHNzaXplX3Qga29uZV9zeXNmc19zaG93X3RjdShzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCiB7Ci0Jc3RydWN0IGtvbmVfZGV2aWNlICprb25lID0gaGlkX2dldF9kcnZkYXRhKGRldl9nZXRfZHJ2ZGF0YShkZXYpKTsKKwlzdHJ1Y3Qga29uZV9kZXZpY2UgKmtvbmUgPQorCQkJaGlkX2dldF9kcnZkYXRhKGRldl9nZXRfZHJ2ZGF0YShkZXYtPnBhcmVudC0+cGFyZW50KSk7CiAJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWRcbiIsIGtvbmUtPnNldHRpbmdzLnRjdSk7CiB9CiAKQEAgLTUwNCwxMSArNDYxLDE1IEBACiBzdGF0aWMgc3NpemVfdCBrb25lX3N5c2ZzX3NldF90Y3Uoc3RydWN0IGRldmljZSAqZGV2LAogCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciBjb25zdCAqYnVmLCBzaXplX3Qgc2l6ZSkKIHsKLQlzdHJ1Y3Qga29uZV9kZXZpY2UgKmtvbmUgPSBoaWRfZ2V0X2RydmRhdGEoZGV2X2dldF9kcnZkYXRhKGRldikpOwotCXN0cnVjdCB1c2JfZGV2aWNlICp1c2JfZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldih0b191c2JfaW50ZXJmYWNlKGRldikpOworCXN0cnVjdCBrb25lX2RldmljZSAqa29uZTsKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdXNiX2RldjsKIAlpbnQgcmV0dmFsOwogCXVuc2lnbmVkIGxvbmcgc3RhdGU7CiAKKwlkZXYgPSBkZXYtPnBhcmVudC0+cGFyZW50OworCWtvbmUgPSBoaWRfZ2V0X2RydmRhdGEoZGV2X2dldF9kcnZkYXRhKGRldikpOworCXVzYl9kZXYgPSBpbnRlcmZhY2VfdG9fdXNiZGV2KHRvX3VzYl9pbnRlcmZhY2UoZGV2KSk7CisKIAlyZXR2YWwgPSBzdHJpY3Rfc3RydG91bChidWYsIDEwLCAmc3RhdGUpOwogCWlmIChyZXR2YWwpCiAJCXJldHVybiByZXR2YWw7CkBAIC01NTYsNyArNTE3LDcgQEAKIAogCQlyZXR2YWwgPSBrb25lX3NldF9zZXR0aW5ncyh1c2JfZGV2LCAma29uZS0+c2V0dGluZ3MpOwogCQlpZiAocmV0dmFsKSB7Ci0JCQlkZXZfZXJyKCZ1c2JfZGV2LT5kZXYsICJjb3VsZG4ndCBzZXQgdGN1IHN0YXRlXG4iKTsKKwkJCWhpZF9lcnIodXNiX2RldiwgImNvdWxkbid0IHNldCB0Y3Ugc3RhdGVcbiIpOwogCQkJLyoKIAkJCSAqIHRyeSB0byByZXJlYWQgdmFsaWQgc2V0dGluZ3MgaW50byBidWZmZXIgb3ZlcndyaXRpbmcKIAkJCSAqIGZpcnN0IGVycm9yIGNvZGUKQEAgLTU3MCw3ICs1MzEsNyBAQAogCiAJcmV0dmFsID0gc2l6ZTsKIGV4aXRfbm9fc2V0dGluZ3M6Ci0JZGV2X2VycigmdXNiX2Rldi0+ZGV2LCAiY291bGRuJ3QgcmVhZCBzZXR0aW5nc1xuIik7CisJaGlkX2Vycih1c2JfZGV2LCAiY291bGRuJ3QgcmVhZCBzZXR0aW5nc1xuIik7CiBleGl0X3VubG9jazoKIAltdXRleF91bmxvY2soJmtvbmUtPmtvbmVfbG9jayk7CiAJcmV0dXJuIHJldHZhbDsKQEAgLTU3OSwxOCArNTQwLDIzIEBACiBzdGF0aWMgc3NpemVfdCBrb25lX3N5c2ZzX3Nob3dfc3RhcnR1cF9wcm9maWxlKHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKLQlzdHJ1Y3Qga29uZV9kZXZpY2UgKmtvbmUgPSBoaWRfZ2V0X2RydmRhdGEoZGV2X2dldF9kcnZkYXRhKGRldikpOworCXN0cnVjdCBrb25lX2RldmljZSAqa29uZSA9CisJCQloaWRfZ2V0X2RydmRhdGEoZGV2X2dldF9kcnZkYXRhKGRldi0+cGFyZW50LT5wYXJlbnQpKTsKIAlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZFxuIiwga29uZS0+c2V0dGluZ3Muc3RhcnR1cF9wcm9maWxlKTsKIH0KIAogc3RhdGljIHNzaXplX3Qga29uZV9zeXNmc19zZXRfc3RhcnR1cF9wcm9maWxlKHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgY29uc3QgKmJ1Ziwgc2l6ZV90IHNpemUpCiB7Ci0Jc3RydWN0IGtvbmVfZGV2aWNlICprb25lID0gaGlkX2dldF9kcnZkYXRhKGRldl9nZXRfZHJ2ZGF0YShkZXYpKTsKLQlzdHJ1Y3QgdXNiX2RldmljZSAqdXNiX2RldiA9IGludGVyZmFjZV90b191c2JkZXYodG9fdXNiX2ludGVyZmFjZShkZXYpKTsKKwlzdHJ1Y3Qga29uZV9kZXZpY2UgKmtvbmU7CisJc3RydWN0IHVzYl9kZXZpY2UgKnVzYl9kZXY7CiAJaW50IHJldHZhbDsKIAl1bnNpZ25lZCBsb25nIG5ld19zdGFydHVwX3Byb2ZpbGU7CiAKKwlkZXYgPSBkZXYtPnBhcmVudC0+cGFyZW50OworCWtvbmUgPSBoaWRfZ2V0X2RydmRhdGEoZGV2X2dldF9kcnZkYXRhKGRldikpOworCXVzYl9kZXYgPSBpbnRlcmZhY2VfdG9fdXNiZGV2KHRvX3VzYl9pbnRlcmZhY2UoZGV2KSk7CisKIAlyZXR2YWwgPSBzdHJpY3Rfc3RydG91bChidWYsIDEwLCAmbmV3X3N0YXJ0dXBfcHJvZmlsZSk7CiAJaWYgKHJldHZhbCkKIAkJcmV0dXJuIHJldHZhbDsKQEAgLTYxNywxNjAgKzU4Myw5MiBAQAogCXJldHVybiBzaXplOwogfQogCi0vKgotICogUmVhZCBhY3R1YWwgZHBpIHNldHRpbmdzLgotICogUmV0dXJucyByYXcgdmFsdWUgZm9yIGZ1cnRoZXIgcHJvY2Vzc2luZy4gUmVmZXIgdG8gZW51bSBrb25lX3BvbGxpbmdfcmF0ZXMgdG8KLSAqIGdldCByZWFsIHZhbHVlLgotICovCi1zdGF0aWMgREVWSUNFX0FUVFIoYWN0dWFsX2RwaSwgMDQ0MCwga29uZV9zeXNmc19zaG93X2FjdHVhbF9kcGksIE5VTEwpOworc3RhdGljIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlIGtvbmVfYXR0cmlidXRlc1tdID0geworCS8qCisJICogUmVhZCBhY3R1YWwgZHBpIHNldHRpbmdzLgorCSAqIFJldHVybnMgcmF3IHZhbHVlIGZvciBmdXJ0aGVyIHByb2Nlc3NpbmcuIFJlZmVyIHRvIGVudW0KKwkgKiBrb25lX3BvbGxpbmdfcmF0ZXMgdG8gZ2V0IHJlYWwgdmFsdWUuCisJICovCisJX19BVFRSKGFjdHVhbF9kcGksIDA0NDAsIGtvbmVfc3lzZnNfc2hvd19hY3R1YWxfZHBpLCBOVUxMKSwKKwlfX0FUVFIoYWN0dWFsX3Byb2ZpbGUsIDA0NDAsIGtvbmVfc3lzZnNfc2hvd19hY3R1YWxfcHJvZmlsZSwgTlVMTCksCiAKLXN0YXRpYyBERVZJQ0VfQVRUUihhY3R1YWxfcHJvZmlsZSwgMDQ0MCwga29uZV9zeXNmc19zaG93X2FjdHVhbF9wcm9maWxlLCBOVUxMKTsKKwkvKgorCSAqIFRoZSBtb3VzZSBjYW4gYmUgZXF1aXBwZWQgd2l0aCBvbmUgb2YgZm91ciBzdXBwbGllZCB3ZWlnaHRzIGZyb20gNQorCSAqIHRvIDIwIGdyYW1zIHdoaWNoIGFyZSByZWNvZ25pemVkIGFuZCBpdHMgdmFsdWUgY2FuIGJlIHJlYWQgb3V0LgorCSAqIFRoaXMgcmV0dXJucyB0aGUgcmF3IHZhbHVlIHJlcG9ydGVkIGJ5IHRoZSBtb3VzZSBmb3IgZWFzeSBldmFsdWF0aW9uCisJICogYnkgc29mdHdhcmUuIFJlZmVyIHRvIGVudW0ga29uZV93ZWlnaHRzIHRvIGdldCBjb3JyZXNwb25kaW5nIHJlYWwKKwkgKiB3ZWlnaHQuCisJICovCisJX19BVFRSKHdlaWdodCwgMDQ0MCwga29uZV9zeXNmc19zaG93X3dlaWdodCwgTlVMTCksCiAKLS8qCi0gKiBUaGUgbW91c2UgY2FuIGJlIGVxdWlwcGVkIHdpdGggb25lIG9mIGZvdXIgc3VwcGxpZWQgd2VpZ2h0cyBmcm9tIDUgdG8gMjAKLSAqIGdyYW1zIHdoaWNoIGFyZSByZWNvZ25pemVkIGFuZCBpdHMgdmFsdWUgY2FuIGJlIHJlYWQgb3V0LgotICogVGhpcyByZXR1cm5zIHRoZSByYXcgdmFsdWUgcmVwb3J0ZWQgYnkgdGhlIG1vdXNlIGZvciBlYXN5IGV2YWx1YXRpb24gYnkKLSAqIHNvZnR3YXJlLiBSZWZlciB0byBlbnVtIGtvbmVfd2VpZ2h0cyB0byBnZXQgY29ycmVzcG9uZGluZyByZWFsIHdlaWdodC4KLSAqLwotc3RhdGljIERFVklDRV9BVFRSKHdlaWdodCwgMDQ0MCwga29uZV9zeXNmc19zaG93X3dlaWdodCwgTlVMTCk7CisJLyoKKwkgKiBQcmludHMgZmlybXdhcmUgdmVyc2lvbiBzdG9yZWQgaW4gbW91c2UgYXMgaW50ZWdlci4KKwkgKiBUaGUgcmF3IHZhbHVlIHJlcG9ydGVkIGJ5IHRoZSBtb3VzZSBpcyByZXR1cm5lZCBmb3IgZWFzeSBldmFsdWF0aW9uLAorCSAqIHRvIGdldCB0aGUgcmVhbCB2ZXJzaW9uIG51bWJlciB0aGUgZGVjaW1hbCBwb2ludCBoYXMgdG8gYmUgc2hpZnRlZCAyCisJICogcG9zaXRpb25zIHRvIHRoZSBsZWZ0LiBFLmcuIGEgdmFsdWUgb2YgMTM4IG1lYW5zIDEuMzguCisJICovCisJX19BVFRSKGZpcm13YXJlX3ZlcnNpb24sIDA0NDAsCisJCQlrb25lX3N5c2ZzX3Nob3dfZmlybXdhcmVfdmVyc2lvbiwgTlVMTCksCiAKLS8qCi0gKiBQcmludHMgZmlybXdhcmUgdmVyc2lvbiBzdG9yZWQgaW4gbW91c2UgYXMgaW50ZWdlci4KLSAqIFRoZSByYXcgdmFsdWUgcmVwb3J0ZWQgYnkgdGhlIG1vdXNlIGlzIHJldHVybmVkIGZvciBlYXN5IGV2YWx1YXRpb24sIHRvIGdldAotICogdGhlIHJlYWwgdmVyc2lvbiBudW1iZXIgdGhlIGRlY2ltYWwgcG9pbnQgaGFzIHRvIGJlIHNoaWZ0ZWQgMiBwb3NpdGlvbnMgdG8KLSAqIHRoZSBsZWZ0LiBFLmcuIGEgdmFsdWUgb2YgMTM4IG1lYW5zIDEuMzguCi0gKi8KLXN0YXRpYyBERVZJQ0VfQVRUUihmaXJtd2FyZV92ZXJzaW9uLCAwNDQwLAotCQlrb25lX3N5c2ZzX3Nob3dfZmlybXdhcmVfdmVyc2lvbiwgTlVMTCk7CisJLyoKKwkgKiBQcmludHMgc3RhdGUgb2YgVHJhY2tpbmcgQ29udHJvbCBVbml0IGFzIG51bWJlciB3aGVyZSAwID0gb2ZmIGFuZAorCSAqIDEgPSBvbi4gV3JpdGluZyAwIGRlYWN0aXZhdGVzIHRjdSBhbmQgd3JpdGluZyAxIGNhbGlicmF0ZXMgYW5kCisJICogYWN0aXZhdGVzIHRoZSB0Y3UKKwkgKi8KKwlfX0FUVFIodGN1LCAwNjYwLCBrb25lX3N5c2ZzX3Nob3dfdGN1LCBrb25lX3N5c2ZzX3NldF90Y3UpLAogCi0vKgotICogUHJpbnRzIHN0YXRlIG9mIFRyYWNraW5nIENvbnRyb2wgVW5pdCBhcyBudW1iZXIgd2hlcmUgMCA9IG9mZiBhbmQgMSA9IG9uCi0gKiBXcml0aW5nIDAgZGVhY3RpdmF0ZXMgdGN1IGFuZCB3cml0aW5nIDEgY2FsaWJyYXRlcyBhbmQgYWN0aXZhdGVzIHRoZSB0Y3UKLSAqLwotc3RhdGljIERFVklDRV9BVFRSKHRjdSwgMDY2MCwga29uZV9zeXNmc19zaG93X3RjdSwga29uZV9zeXNmc19zZXRfdGN1KTsKLQotLyogUHJpbnRzIGFuZCB0YWtlcyB0aGUgbnVtYmVyIG9mIHRoZSBwcm9maWxlIHRoZSBtb3VzZSBzdGFydHMgd2l0aCAqLwotc3RhdGljIERFVklDRV9BVFRSKHN0YXJ0dXBfcHJvZmlsZSwgMDY2MCwKLQkJa29uZV9zeXNmc19zaG93X3N0YXJ0dXBfcHJvZmlsZSwKLQkJa29uZV9zeXNmc19zZXRfc3RhcnR1cF9wcm9maWxlKTsKLQotc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmtvbmVfYXR0cmlidXRlc1tdID0gewotCQkmZGV2X2F0dHJfYWN0dWFsX2RwaS5hdHRyLAotCQkmZGV2X2F0dHJfYWN0dWFsX3Byb2ZpbGUuYXR0ciwKLQkJJmRldl9hdHRyX3dlaWdodC5hdHRyLAotCQkmZGV2X2F0dHJfZmlybXdhcmVfdmVyc2lvbi5hdHRyLAotCQkmZGV2X2F0dHJfdGN1LmF0dHIsCi0JCSZkZXZfYXR0cl9zdGFydHVwX3Byb2ZpbGUuYXR0ciwKLQkJTlVMTAorCS8qIFByaW50cyBhbmQgdGFrZXMgdGhlIG51bWJlciBvZiB0aGUgcHJvZmlsZSB0aGUgbW91c2Ugc3RhcnRzIHdpdGggKi8KKwlfX0FUVFIoc3RhcnR1cF9wcm9maWxlLCAwNjYwLAorCQkJa29uZV9zeXNmc19zaG93X3N0YXJ0dXBfcHJvZmlsZSwKKwkJCWtvbmVfc3lzZnNfc2V0X3N0YXJ0dXBfcHJvZmlsZSksCisJX19BVFRSX05VTEwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGtvbmVfYXR0cmlidXRlX2dyb3VwID0gewotCQkuYXR0cnMgPSBrb25lX2F0dHJpYnV0ZXMKK3N0YXRpYyBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSBrb25lX2Jpbl9hdHRyaWJ1dGVzW10gPSB7CisJeworCQkuYXR0ciA9IHsgLm5hbWUgPSAic2V0dGluZ3MiLCAubW9kZSA9IDA2NjAgfSwKKwkJLnNpemUgPSBzaXplb2Yoc3RydWN0IGtvbmVfc2V0dGluZ3MpLAorCQkucmVhZCA9IGtvbmVfc3lzZnNfcmVhZF9zZXR0aW5ncywKKwkJLndyaXRlID0ga29uZV9zeXNmc193cml0ZV9zZXR0aW5ncworCX0sCisJeworCQkuYXR0ciA9IHsgLm5hbWUgPSAicHJvZmlsZTEiLCAubW9kZSA9IDA2NjAgfSwKKwkJLnNpemUgPSBzaXplb2Yoc3RydWN0IGtvbmVfcHJvZmlsZSksCisJCS5yZWFkID0ga29uZV9zeXNmc19yZWFkX3Byb2ZpbGV4LAorCQkud3JpdGUgPSBrb25lX3N5c2ZzX3dyaXRlX3Byb2ZpbGV4LAorCQkucHJpdmF0ZSA9ICZwcm9maWxlX251bWJlcnNbMF0KKwl9LAorCXsKKwkJLmF0dHIgPSB7IC5uYW1lID0gInByb2ZpbGUyIiwgLm1vZGUgPSAwNjYwIH0sCisJCS5zaXplID0gc2l6ZW9mKHN0cnVjdCBrb25lX3Byb2ZpbGUpLAorCQkucmVhZCA9IGtvbmVfc3lzZnNfcmVhZF9wcm9maWxleCwKKwkJLndyaXRlID0ga29uZV9zeXNmc193cml0ZV9wcm9maWxleCwKKwkJLnByaXZhdGUgPSAmcHJvZmlsZV9udW1iZXJzWzFdCisJfSwKKwl7CisJCS5hdHRyID0geyAubmFtZSA9ICJwcm9maWxlMyIsIC5tb2RlID0gMDY2MCB9LAorCQkuc2l6ZSA9IHNpemVvZihzdHJ1Y3Qga29uZV9wcm9maWxlKSwKKwkJLnJlYWQgPSBrb25lX3N5c2ZzX3JlYWRfcHJvZmlsZXgsCisJCS53cml0ZSA9IGtvbmVfc3lzZnNfd3JpdGVfcHJvZmlsZXgsCisJCS5wcml2YXRlID0gJnByb2ZpbGVfbnVtYmVyc1syXQorCX0sCisJeworCQkuYXR0ciA9IHsgLm5hbWUgPSAicHJvZmlsZTQiLCAubW9kZSA9IDA2NjAgfSwKKwkJLnNpemUgPSBzaXplb2Yoc3RydWN0IGtvbmVfcHJvZmlsZSksCisJCS5yZWFkID0ga29uZV9zeXNmc19yZWFkX3Byb2ZpbGV4LAorCQkud3JpdGUgPSBrb25lX3N5c2ZzX3dyaXRlX3Byb2ZpbGV4LAorCQkucHJpdmF0ZSA9ICZwcm9maWxlX251bWJlcnNbM10KKwl9LAorCXsKKwkJLmF0dHIgPSB7IC5uYW1lID0gInByb2ZpbGU1IiwgLm1vZGUgPSAwNjYwIH0sCisJCS5zaXplID0gc2l6ZW9mKHN0cnVjdCBrb25lX3Byb2ZpbGUpLAorCQkucmVhZCA9IGtvbmVfc3lzZnNfcmVhZF9wcm9maWxleCwKKwkJLndyaXRlID0ga29uZV9zeXNmc193cml0ZV9wcm9maWxleCwKKwkJLnByaXZhdGUgPSAmcHJvZmlsZV9udW1iZXJzWzRdCisJfSwKKwlfX0FUVFJfTlVMTAogfTsKIAotc3RhdGljIHN0cnVjdCBiaW5fYXR0cmlidXRlIGtvbmVfc2V0dGluZ3NfYXR0ciA9IHsKLQkuYXR0ciA9IHsgLm5hbWUgPSAic2V0dGluZ3MiLCAubW9kZSA9IDA2NjAgfSwKLQkuc2l6ZSA9IHNpemVvZihzdHJ1Y3Qga29uZV9zZXR0aW5ncyksCi0JLnJlYWQgPSBrb25lX3N5c2ZzX3JlYWRfc2V0dGluZ3MsCi0JLndyaXRlID0ga29uZV9zeXNmc193cml0ZV9zZXR0aW5ncwotfTsKLQotc3RhdGljIHN0cnVjdCBiaW5fYXR0cmlidXRlIGtvbmVfcHJvZmlsZTFfYXR0ciA9IHsKLQkuYXR0ciA9IHsgLm5hbWUgPSAicHJvZmlsZTEiLCAubW9kZSA9IDA2NjAgfSwKLQkuc2l6ZSA9IHNpemVvZihzdHJ1Y3Qga29uZV9wcm9maWxlKSwKLQkucmVhZCA9IGtvbmVfc3lzZnNfcmVhZF9wcm9maWxlMSwKLQkud3JpdGUgPSBrb25lX3N5c2ZzX3dyaXRlX3Byb2ZpbGUxCi19OwotCi1zdGF0aWMgc3RydWN0IGJpbl9hdHRyaWJ1dGUga29uZV9wcm9maWxlMl9hdHRyID0gewotCS5hdHRyID0geyAubmFtZSA9ICJwcm9maWxlMiIsIC5tb2RlID0gMDY2MCB9LAotCS5zaXplID0gc2l6ZW9mKHN0cnVjdCBrb25lX3Byb2ZpbGUpLAotCS5yZWFkID0ga29uZV9zeXNmc19yZWFkX3Byb2ZpbGUyLAotCS53cml0ZSA9IGtvbmVfc3lzZnNfd3JpdGVfcHJvZmlsZTIKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSBrb25lX3Byb2ZpbGUzX2F0dHIgPSB7Ci0JLmF0dHIgPSB7IC5uYW1lID0gInByb2ZpbGUzIiwgLm1vZGUgPSAwNjYwIH0sCi0JLnNpemUgPSBzaXplb2Yoc3RydWN0IGtvbmVfcHJvZmlsZSksCi0JLnJlYWQgPSBrb25lX3N5c2ZzX3JlYWRfcHJvZmlsZTMsCi0JLndyaXRlID0ga29uZV9zeXNmc193cml0ZV9wcm9maWxlMwotfTsKLQotc3RhdGljIHN0cnVjdCBiaW5fYXR0cmlidXRlIGtvbmVfcHJvZmlsZTRfYXR0ciA9IHsKLQkuYXR0ciA9IHsgLm5hbWUgPSAicHJvZmlsZTQiLCAubW9kZSA9IDA2NjAgfSwKLQkuc2l6ZSA9IHNpemVvZihzdHJ1Y3Qga29uZV9wcm9maWxlKSwKLQkucmVhZCA9IGtvbmVfc3lzZnNfcmVhZF9wcm9maWxlNCwKLQkud3JpdGUgPSBrb25lX3N5c2ZzX3dyaXRlX3Byb2ZpbGU0Ci19OwotCi1zdGF0aWMgc3RydWN0IGJpbl9hdHRyaWJ1dGUga29uZV9wcm9maWxlNV9hdHRyID0gewotCS5hdHRyID0geyAubmFtZSA9ICJwcm9maWxlNSIsIC5tb2RlID0gMDY2MCB9LAotCS5zaXplID0gc2l6ZW9mKHN0cnVjdCBrb25lX3Byb2ZpbGUpLAotCS5yZWFkID0ga29uZV9zeXNmc19yZWFkX3Byb2ZpbGU1LAotCS53cml0ZSA9IGtvbmVfc3lzZnNfd3JpdGVfcHJvZmlsZTUKLX07Ci0KLXN0YXRpYyBpbnQga29uZV9jcmVhdGVfc3lzZnNfYXR0cmlidXRlcyhzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKLXsKLQlpbnQgcmV0dmFsOwotCi0JcmV0dmFsID0gc3lzZnNfY3JlYXRlX2dyb3VwKCZpbnRmLT5kZXYua29iaiwgJmtvbmVfYXR0cmlidXRlX2dyb3VwKTsKLQlpZiAocmV0dmFsKQotCQlnb3RvIGV4aXRfMTsKLQotCXJldHZhbCA9IHN5c2ZzX2NyZWF0ZV9iaW5fZmlsZSgmaW50Zi0+ZGV2LmtvYmosICZrb25lX3NldHRpbmdzX2F0dHIpOwotCWlmIChyZXR2YWwpCi0JCWdvdG8gZXhpdF8yOwotCi0JcmV0dmFsID0gc3lzZnNfY3JlYXRlX2Jpbl9maWxlKCZpbnRmLT5kZXYua29iaiwgJmtvbmVfcHJvZmlsZTFfYXR0cik7Ci0JaWYgKHJldHZhbCkKLQkJZ290byBleGl0XzM7Ci0KLQlyZXR2YWwgPSBzeXNmc19jcmVhdGVfYmluX2ZpbGUoJmludGYtPmRldi5rb2JqLCAma29uZV9wcm9maWxlMl9hdHRyKTsKLQlpZiAocmV0dmFsKQotCQlnb3RvIGV4aXRfNDsKLQotCXJldHZhbCA9IHN5c2ZzX2NyZWF0ZV9iaW5fZmlsZSgmaW50Zi0+ZGV2LmtvYmosICZrb25lX3Byb2ZpbGUzX2F0dHIpOwotCWlmIChyZXR2YWwpCi0JCWdvdG8gZXhpdF81OwotCi0JcmV0dmFsID0gc3lzZnNfY3JlYXRlX2Jpbl9maWxlKCZpbnRmLT5kZXYua29iaiwgJmtvbmVfcHJvZmlsZTRfYXR0cik7Ci0JaWYgKHJldHZhbCkKLQkJZ290byBleGl0XzY7Ci0KLQlyZXR2YWwgPSBzeXNmc19jcmVhdGVfYmluX2ZpbGUoJmludGYtPmRldi5rb2JqLCAma29uZV9wcm9maWxlNV9hdHRyKTsKLQlpZiAocmV0dmFsKQotCQlnb3RvIGV4aXRfNzsKLQotCXJldHVybiAwOwotCi1leGl0Xzc6Ci0Jc3lzZnNfcmVtb3ZlX2Jpbl9maWxlKCZpbnRmLT5kZXYua29iaiwgJmtvbmVfcHJvZmlsZTRfYXR0cik7Ci1leGl0XzY6Ci0Jc3lzZnNfcmVtb3ZlX2Jpbl9maWxlKCZpbnRmLT5kZXYua29iaiwgJmtvbmVfcHJvZmlsZTNfYXR0cik7Ci1leGl0XzU6Ci0Jc3lzZnNfcmVtb3ZlX2Jpbl9maWxlKCZpbnRmLT5kZXYua29iaiwgJmtvbmVfcHJvZmlsZTJfYXR0cik7Ci1leGl0XzQ6Ci0Jc3lzZnNfcmVtb3ZlX2Jpbl9maWxlKCZpbnRmLT5kZXYua29iaiwgJmtvbmVfcHJvZmlsZTFfYXR0cik7Ci1leGl0XzM6Ci0Jc3lzZnNfcmVtb3ZlX2Jpbl9maWxlKCZpbnRmLT5kZXYua29iaiwgJmtvbmVfc2V0dGluZ3NfYXR0cik7Ci1leGl0XzI6Ci0Jc3lzZnNfcmVtb3ZlX2dyb3VwKCZpbnRmLT5kZXYua29iaiwgJmtvbmVfYXR0cmlidXRlX2dyb3VwKTsKLWV4aXRfMToKLQlyZXR1cm4gcmV0dmFsOwotfQotCi1zdGF0aWMgdm9pZCBrb25lX3JlbW92ZV9zeXNmc19hdHRyaWJ1dGVzKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQotewotCXN5c2ZzX3JlbW92ZV9iaW5fZmlsZSgmaW50Zi0+ZGV2LmtvYmosICZrb25lX3Byb2ZpbGU1X2F0dHIpOwotCXN5c2ZzX3JlbW92ZV9iaW5fZmlsZSgmaW50Zi0+ZGV2LmtvYmosICZrb25lX3Byb2ZpbGU0X2F0dHIpOwotCXN5c2ZzX3JlbW92ZV9iaW5fZmlsZSgmaW50Zi0+ZGV2LmtvYmosICZrb25lX3Byb2ZpbGUzX2F0dHIpOwotCXN5c2ZzX3JlbW92ZV9iaW5fZmlsZSgmaW50Zi0+ZGV2LmtvYmosICZrb25lX3Byb2ZpbGUyX2F0dHIpOwotCXN5c2ZzX3JlbW92ZV9iaW5fZmlsZSgmaW50Zi0+ZGV2LmtvYmosICZrb25lX3Byb2ZpbGUxX2F0dHIpOwotCXN5c2ZzX3JlbW92ZV9iaW5fZmlsZSgmaW50Zi0+ZGV2LmtvYmosICZrb25lX3NldHRpbmdzX2F0dHIpOwotCXN5c2ZzX3JlbW92ZV9ncm91cCgmaW50Zi0+ZGV2LmtvYmosICZrb25lX2F0dHJpYnV0ZV9ncm91cCk7Ci19Ci0KIHN0YXRpYyBpbnQga29uZV9pbml0X2tvbmVfZGV2aWNlX3N0cnVjdChzdHJ1Y3QgdXNiX2RldmljZSAqdXNiX2RldiwKIAkJc3RydWN0IGtvbmVfZGV2aWNlICprb25lKQogewpAQCAtODE4LDMyICs3MTYsMjUgQEAKIAogCQlrb25lID0ga3phbGxvYyhzaXplb2YoKmtvbmUpLCBHRlBfS0VSTkVMKTsKIAkJaWYgKCFrb25lKSB7Ci0JCQlkZXZfZXJyKCZoZGV2LT5kZXYsICJjYW4ndCBhbGxvYyBkZXZpY2UgZGVzY3JpcHRvclxuIik7CisJCQloaWRfZXJyKGhkZXYsICJjYW4ndCBhbGxvYyBkZXZpY2UgZGVzY3JpcHRvclxuIik7CiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJfQogCQloaWRfc2V0X2RydmRhdGEoaGRldiwga29uZSk7CiAKIAkJcmV0dmFsID0ga29uZV9pbml0X2tvbmVfZGV2aWNlX3N0cnVjdCh1c2JfZGV2LCBrb25lKTsKIAkJaWYgKHJldHZhbCkgewotCQkJZGV2X2VycigmaGRldi0+ZGV2LAotCQkJCQkiY291bGRuJ3QgaW5pdCBzdHJ1Y3Qga29uZV9kZXZpY2VcbiIpOworCQkJaGlkX2VycihoZGV2LCAiY291bGRuJ3QgaW5pdCBzdHJ1Y3Qga29uZV9kZXZpY2VcbiIpOwogCQkJZ290byBleGl0X2ZyZWU7CiAJCX0KIAotCQlyZXR2YWwgPSByb2NjYXRfY29ubmVjdChoZGV2KTsKKwkJcmV0dmFsID0gcm9jY2F0X2Nvbm5lY3Qoa29uZV9jbGFzcywgaGRldik7CiAJCWlmIChyZXR2YWwgPCAwKSB7Ci0JCQlkZXZfZXJyKCZoZGV2LT5kZXYsICJjb3VsZG4ndCBpbml0IGNoYXIgZGV2XG4iKTsKKwkJCWhpZF9lcnIoaGRldiwgImNvdWxkbid0IGluaXQgY2hhciBkZXZcbiIpOwogCQkJLyogYmUgdG9sZXJhbnQgYWJvdXQgbm90IGdldHRpbmcgY2hyZGV2ICovCiAJCX0gZWxzZSB7CiAJCQlrb25lLT5yb2NjYXRfY2xhaW1lZCA9IDE7CiAJCQlrb25lLT5jaHJkZXZfbWlub3IgPSByZXR2YWw7CiAJCX0KLQotCQlyZXR2YWwgPSBrb25lX2NyZWF0ZV9zeXNmc19hdHRyaWJ1dGVzKGludGYpOwotCQlpZiAocmV0dmFsKSB7Ci0JCQlkZXZfZXJyKCZoZGV2LT5kZXYsICJjYW5ub3QgY3JlYXRlIHN5c2ZzIGZpbGVzXG4iKTsKLQkJCWdvdG8gZXhpdF9mcmVlOwotCQl9CiAJfSBlbHNlIHsKIAkJaGlkX3NldF9kcnZkYXRhKGhkZXYsIE5VTEwpOwogCX0KQEAgLTg1NCw3ICs3NDUsNiBAQAogCXJldHVybiByZXR2YWw7CiB9CiAKLQogc3RhdGljIHZvaWQga29uZV9yZW1vdmVfc3BlY2lhbHMoc3RydWN0IGhpZF9kZXZpY2UgKmhkZXYpCiB7CiAJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYgPSB0b191c2JfaW50ZXJmYWNlKGhkZXYtPmRldi5wYXJlbnQpOwpAQCAtODYyLDcgKzc1Miw2IEBACiAKIAlpZiAoaW50Zi0+Y3VyX2FsdHNldHRpbmctPmRlc2MuYkludGVyZmFjZVByb3RvY29sCiAJCQk9PSBVU0JfSU5URVJGQUNFX1BST1RPQ09MX01PVVNFKSB7Ci0JCWtvbmVfcmVtb3ZlX3N5c2ZzX2F0dHJpYnV0ZXMoaW50Zik7CiAJCWtvbmUgPSBoaWRfZ2V0X2RydmRhdGEoaGRldik7CiAJCWlmIChrb25lLT5yb2NjYXRfY2xhaW1lZCkKIAkJCXJvY2NhdF9kaXNjb25uZWN0KGtvbmUtPmNocmRldl9taW5vcik7CkBAIC04NzYsMTkgKzc2NSwxOSBAQAogCiAJcmV0dmFsID0gaGlkX3BhcnNlKGhkZXYpOwogCWlmIChyZXR2YWwpIHsKLQkJZGV2X2VycigmaGRldi0+ZGV2LCAicGFyc2UgZmFpbGVkXG4iKTsKKwkJaGlkX2VycihoZGV2LCAicGFyc2UgZmFpbGVkXG4iKTsKIAkJZ290byBleGl0OwogCX0KIAogCXJldHZhbCA9IGhpZF9od19zdGFydChoZGV2LCBISURfQ09OTkVDVF9ERUZBVUxUKTsKIAlpZiAocmV0dmFsKSB7Ci0JCWRldl9lcnIoJmhkZXYtPmRldiwgImh3IHN0YXJ0IGZhaWxlZFxuIik7CisJCWhpZF9lcnIoaGRldiwgImh3IHN0YXJ0IGZhaWxlZFxuIik7CiAJCWdvdG8gZXhpdDsKIAl9CiAKIAlyZXR2YWwgPSBrb25lX2luaXRfc3BlY2lhbHMoaGRldik7CiAJaWYgKHJldHZhbCkgewotCQlkZXZfZXJyKCZoZGV2LT5kZXYsICJjb3VsZG4ndCBpbnN0YWxsIG1vdXNlXG4iKTsKKwkJaGlkX2VycihoZGV2LCAiY291bGRuJ3QgaW5zdGFsbCBtb3VzZVxuIik7CiAJCWdvdG8gZXhpdF9zdG9wOwogCX0KIApAQCAtMTAwNiwxMSArODk1LDI0IEBACiAKIHN0YXRpYyBpbnQgX19pbml0IGtvbmVfaW5pdCh2b2lkKQogewotCXJldHVybiBoaWRfcmVnaXN0ZXJfZHJpdmVyKCZrb25lX2RyaXZlcik7CisJaW50IHJldHZhbDsKKworCS8qIGNsYXNzIG5hbWUgaGFzIHRvIGJlIHNhbWUgYXMgZHJpdmVyIG5hbWUgKi8KKwlrb25lX2NsYXNzID0gY2xhc3NfY3JlYXRlKFRISVNfTU9EVUxFLCAia29uZSIpOworCWlmIChJU19FUlIoa29uZV9jbGFzcykpCisJCXJldHVybiBQVFJfRVJSKGtvbmVfY2xhc3MpOworCWtvbmVfY2xhc3MtPmRldl9hdHRycyA9IGtvbmVfYXR0cmlidXRlczsKKwlrb25lX2NsYXNzLT5kZXZfYmluX2F0dHJzID0ga29uZV9iaW5fYXR0cmlidXRlczsKKworCXJldHZhbCA9IGhpZF9yZWdpc3Rlcl9kcml2ZXIoJmtvbmVfZHJpdmVyKTsKKwlpZiAocmV0dmFsKQorCQljbGFzc19kZXN0cm95KGtvbmVfY2xhc3MpOworCXJldHVybiByZXR2YWw7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBrb25lX2V4aXQodm9pZCkKIHsKKwljbGFzc19kZXN0cm95KGtvbmVfY2xhc3MpOwogCWhpZF91bnJlZ2lzdGVyX2RyaXZlcigma29uZV9kcml2ZXIpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC9oaWQtcm9jY2F0LWtvbmUuaCBiL2RyaXZlcnMvaGlkL2hpZC1yb2NjYXQta29uZS5oCmluZGV4IDEzMGQ2NTYuLjY0YWJiNWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaGlkL2hpZC1yb2NjYXQta29uZS5oCisrKyBiL2RyaXZlcnMvaGlkL2hpZC1yb2NjYXQta29uZS5oCkBAIC0xNCwxNCArMTQsMTEgQEAKIAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAKLSNwcmFnbWEgcGFjayhwdXNoKQotI3ByYWdtYSBwYWNrKDEpCi0KIHN0cnVjdCBrb25lX2tleXN0cm9rZSB7CiAJdWludDhfdCBrZXk7CiAJdWludDhfdCBhY3Rpb247CiAJdWludDE2X3QgcGVyaW9kOyAvKiBpbiBtaWxsaXNlY29uZHMgKi8KLX07Cit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSk7CiAKIGVudW0ga29uZV9rZXlzdHJva2VfYnV0dG9ucyB7CiAJa29uZV9rZXlzdHJva2VfYnV0dG9uXzEgPSAweGYwLCAvKiBsZWZ0IG1vdXNlIGJ1dHRvbiAqLwpAQCAtNDQsNyArNDEsNyBAQAogCXVpbnQ4X3QgbWFjcm9fbmFtZVsxNl07IC8qIGNhbiBiZSBtYXggMTUgY2hhcnMgbG9uZyAqLwogCXVpbnQ4X3QgY291bnQ7CiAJc3RydWN0IGtvbmVfa2V5c3Ryb2tlIGtleXN0cm9rZXNbMjBdOwotfTsKK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKTsKIAogZW51bSBrb25lX2J1dHRvbl9pbmZvX3R5cGVzIHsKIAkvKiB2YWxpZCBidXR0b24gdHlwZXMgdW50aWwgZmlybXdhcmUgMS4zMiAqLwpAQCAtOTUsNyArOTIsNyBAQAogCXVpbnQ4X3QgcmVkOyAgIC8qIHJhbmdlIDB4MDAtMHhmZiAqLwogCXVpbnQ4X3QgZ3JlZW47IC8qIHJhbmdlIDB4MDAtMHhmZiAqLwogCXVpbnQ4X3QgYmx1ZTsgIC8qIHJhbmdlIDB4MDAtMHhmZiAqLwotfTsKK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKTsKIAogc3RydWN0IGtvbmVfcHJvZmlsZSB7CiAJdWludDE2X3Qgc2l6ZTsgLyogYWx3YXlzIDk3NSAqLwpAQCAtMTMwLDcgKzEyNyw3IEBACiAJc3RydWN0IGtvbmVfYnV0dG9uX2luZm8gYnV0dG9uX2luZm9zWzhdOwogCiAJdWludDE2X3QgY2hlY2tzdW07IC8qIFxicmllZiBob2xkcyBjaGVja3N1bSBvZiBzdHJ1Y3QgKi8KLX07Cit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSk7CiAKIGVudW0ga29uZV9wb2xsaW5nX3JhdGVzIHsKIAlrb25lX3BvbGxpbmdfcmF0ZV8xMjUgPSAxLApAQCAtMTQ3LDcgKzE0NCw3IEBACiAJdWludDhfdCAgY2FsaWJyYXRpb25fZGF0YVs0XTsKIAl1aW50OF90ICB1bmtub3duM1syXTsKIAl1aW50MTZfdCBjaGVja3N1bTsKLX07Cit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSk7CiAKIC8qCiAgKiAxMiBieXRlIG1vdXNlIGV2ZW50IHJlYWQgYnkgaW50ZXJydXB0X3JlYWQKQEAgLTE2Myw3ICsxNjAsNyBAQAogCXVpbnQ4X3QgZXZlbnQ7CiAJdWludDhfdCB2YWx1ZTsgLyogcHJlc3MgPSAwLCByZWxlYXNlID0gMSAqLwogCXVpbnQ4X3QgbWFjcm9fa2V5OyAvKiAwIHRvIDggKi8KLX07Cit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSk7CiAKIGVudW0ga29uZV9tb3VzZV9ldmVudHMgewogCS8qIG9zZCBldmVudHMgYXJlIHRob3VnaHQgdG8gYmUgZGlzcGxheSBvbiBzY3JlZW4gKi8KQEAgLTE5MSw5ICsxODgsNyBAQAogCXVpbnQ4X3QgZXZlbnQ7CiAJdWludDhfdCB2YWx1ZTsgLyogaG9sZHMgZHBpIG9yIHByb2ZpbGUgdmFsdWUgKi8KIAl1aW50OF90IGtleTsgLyogbWFjcm8ga2V5IG9uIG92ZXJsb25nIG1hY3JvIGV4ZWN1dGlvbiAqLwotfTsKLQotI3ByYWdtYSBwYWNrKHBvcCkKK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKTsKIAogc3RydWN0IGtvbmVfZGV2aWNlIHsKIAkvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvaGlkLXJvY2NhdC1rb25lcGx1cy5jIGIvZHJpdmVycy9oaWQvaGlkLXJvY2NhdC1rb25lcGx1cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2MDhjOGQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2hpZC9oaWQtcm9jY2F0LWtvbmVwbHVzLmMKQEAgLTAsMCArMSw4MzcgQEAKKy8qCisgKiBSb2NjYXQgS29uZVsrXSBkcml2ZXIgZm9yIExpbnV4CisgKgorICogQ29weXJpZ2h0IChjKSAyMDEwIFN0ZWZhbiBBY2hhdHogPGVyYXpvcl9kZUB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisgKi8KKworLyoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworLyoKKyAqIFJvY2NhdCBLb25lWytdIGlzIGFuIHVwZGF0ZWQvaW1wcm92ZWQgdmVyc2lvbiBvZiB0aGUgS29uZSB3aXRoIG1vcmUgbWVtb3J5CisgKiBhbmQgZnVuY3Rpb25hbGl0eSBhbmQgd2l0aG91dCB0aGUgbm9uLXN0YW5kYXJkIGJlaGF2aW91cnMgdGhlIEtvbmUgaGFkLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgorI2luY2x1ZGUgPGxpbnV4L2hpZC5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlICJoaWQtaWRzLmgiCisjaW5jbHVkZSAiaGlkLXJvY2NhdC5oIgorI2luY2x1ZGUgImhpZC1yb2NjYXQta29uZXBsdXMuaCIKKworc3RhdGljIHVpbnQgcHJvZmlsZV9udW1iZXJzWzVdID0gezAsIDEsIDIsIDMsIDR9OworCitzdGF0aWMgc3RydWN0IGNsYXNzICprb25lcGx1c19jbGFzczsKKworc3RhdGljIHZvaWQga29uZXBsdXNfcHJvZmlsZV9hY3RpdmF0ZWQoc3RydWN0IGtvbmVwbHVzX2RldmljZSAqa29uZXBsdXMsCisJCXVpbnQgbmV3X3Byb2ZpbGUpCit7CisJa29uZXBsdXMtPmFjdHVhbF9wcm9maWxlID0gbmV3X3Byb2ZpbGU7Cit9CisKK3N0YXRpYyBpbnQga29uZXBsdXNfc2VuZF9jb250cm9sKHN0cnVjdCB1c2JfZGV2aWNlICp1c2JfZGV2LCB1aW50IHZhbHVlLAorCQllbnVtIGtvbmVwbHVzX2NvbnRyb2xfcmVxdWVzdHMgcmVxdWVzdCkKK3sKKwlpbnQgbGVuOworCXN0cnVjdCBrb25lcGx1c19jb250cm9sICpjb250cm9sOworCisJaWYgKChyZXF1ZXN0ID09IEtPTkVQTFVTX0NPTlRST0xfUkVRVUVTVF9QUk9GSUxFX1NFVFRJTkdTIHx8CisJCQlyZXF1ZXN0ID09IEtPTkVQTFVTX0NPTlRST0xfUkVRVUVTVF9QUk9GSUxFX0JVVFRPTlMpICYmCisJCQl2YWx1ZSA+IDQpCisJCXJldHVybiAtRUlOVkFMOworCisJY29udHJvbCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBrb25lcGx1c19jb250cm9sKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFjb250cm9sKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWNvbnRyb2wtPmNvbW1hbmQgPSBLT05FUExVU19DT01NQU5EX0NPTlRST0w7CisJY29udHJvbC0+dmFsdWUgPSB2YWx1ZTsKKwljb250cm9sLT5yZXF1ZXN0ID0gcmVxdWVzdDsKKworCWxlbiA9IHVzYl9jb250cm9sX21zZyh1c2JfZGV2LCB1c2Jfc25kY3RybHBpcGUodXNiX2RldiwgMCksCisJCQlVU0JfUkVRX1NFVF9DT05GSUdVUkFUSU9OLAorCQkJVVNCX1RZUEVfQ0xBU1MgfCBVU0JfUkVDSVBfSU5URVJGQUNFIHwgVVNCX0RJUl9PVVQsCisJCQlLT05FUExVU19VU0JfQ09NTUFORF9DT05UUk9MLCAwLCBjb250cm9sLAorCQkJc2l6ZW9mKHN0cnVjdCBrb25lcGx1c19jb250cm9sKSwKKwkJCVVTQl9DVFJMX1NFVF9USU1FT1VUKTsKKworCWtmcmVlKGNvbnRyb2wpOworCisJaWYgKGxlbiAhPSBzaXplb2Yoc3RydWN0IGtvbmVwbHVzX2NvbnRyb2wpKQorCQlyZXR1cm4gbGVuOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQga29uZXBsdXNfcmVjZWl2ZShzdHJ1Y3QgdXNiX2RldmljZSAqdXNiX2RldiwgdWludCB1c2JfY29tbWFuZCwKKwkJdm9pZCAqYnVmLCB1aW50IHNpemUpIHsKKwlpbnQgbGVuOworCisJbGVuID0gdXNiX2NvbnRyb2xfbXNnKHVzYl9kZXYsIHVzYl9yY3ZjdHJscGlwZSh1c2JfZGV2LCAwKSwKKwkJCVVTQl9SRVFfQ0xFQVJfRkVBVFVSRSwKKwkJCVVTQl9UWVBFX0NMQVNTIHwgVVNCX1JFQ0lQX0lOVEVSRkFDRSB8IFVTQl9ESVJfSU4sCisJCQl1c2JfY29tbWFuZCwgMCwgYnVmLCBzaXplLCBVU0JfQ1RSTF9TRVRfVElNRU9VVCk7CisKKwlyZXR1cm4gKGxlbiAhPSBzaXplKSA/IC1FSU8gOiAwOworfQorCitzdGF0aWMgaW50IGtvbmVwbHVzX3JlY2VpdmVfY29udHJvbF9zdGF0dXMoc3RydWN0IHVzYl9kZXZpY2UgKnVzYl9kZXYpCit7CisJaW50IHJldHZhbDsKKwlzdHJ1Y3Qga29uZXBsdXNfY29udHJvbCAqY29udHJvbDsKKworCWNvbnRyb2wgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qga29uZXBsdXNfY29udHJvbCksIEdGUF9LRVJORUwpOworCWlmICghY29udHJvbCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlkbyB7CisJCXJldHZhbCA9IGtvbmVwbHVzX3JlY2VpdmUodXNiX2RldiwgS09ORVBMVVNfVVNCX0NPTU1BTkRfQ09OVFJPTCwKKwkJCQljb250cm9sLCBzaXplb2Yoc3RydWN0IGtvbmVwbHVzX2NvbnRyb2wpKTsKKworCQkvKiBjaGVjayBpZiB3ZSBnZXQgYSBjb21wbGV0ZWx5IHdyb25nIGFuc3dlciAqLworCQlpZiAocmV0dmFsKQorCQkJZ290byBvdXQ7CisKKwkJaWYgKGNvbnRyb2wtPnZhbHVlID09IEtPTkVQTFVTX0NPTlRST0xfUkVRVUVTVF9TVEFUVVNfT0spIHsKKwkJCXJldHZhbCA9IDA7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCS8qIGluZGljYXRlcyB0aGF0IGhhcmR3YXJlIG5lZWRzIHNvbWUgbW9yZSB0aW1lIHRvIGNvbXBsZXRlIGFjdGlvbiAqLworCQlpZiAoY29udHJvbC0+dmFsdWUgPT0gS09ORVBMVVNfQ09OVFJPTF9SRVFVRVNUX1NUQVRVU19XQUlUKSB7CisJCQltc2xlZXAoNTAwKTsgLyogd2luZG93cyBkcml2ZXIgdXNlcyAxMDAwICovCisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIHNlZW1zIHRvIGJlIGNyaXRpY2FsIC0gcmVwbHVnIG5lY2Vzc2FyeSAqLworCQlpZiAoY29udHJvbC0+dmFsdWUgPT0gS09ORVBMVVNfQ09OVFJPTF9SRVFVRVNUX1NUQVRVU19PVkVSTE9BRCkgeworCQkJcmV0dmFsID0gLUVJTlZBTDsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJZGV2X2VycigmdXNiX2Rldi0+ZGV2LCAia29uZXBsdXNfcmVjZWl2ZV9jb250cm9sX3N0YXR1czogIgorCQkJCSJ1bmtub3duIHJlc3BvbnNlIHZhbHVlIDB4JXhcbiIsIGNvbnRyb2wtPnZhbHVlKTsKKwkJcmV0dmFsID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisKKwl9IHdoaWxlICgxKTsKK291dDoKKwlrZnJlZShjb250cm9sKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgaW50IGtvbmVwbHVzX3NlbmQoc3RydWN0IHVzYl9kZXZpY2UgKnVzYl9kZXYsIHVpbnQgY29tbWFuZCwKKwkJdm9pZCAqYnVmLCB1aW50IHNpemUpIHsKKwlpbnQgbGVuOworCisJbGVuID0gdXNiX2NvbnRyb2xfbXNnKHVzYl9kZXYsIHVzYl9zbmRjdHJscGlwZSh1c2JfZGV2LCAwKSwKKwkJCVVTQl9SRVFfU0VUX0NPTkZJR1VSQVRJT04sCisJCQlVU0JfVFlQRV9DTEFTUyB8IFVTQl9SRUNJUF9JTlRFUkZBQ0UgfCBVU0JfRElSX09VVCwKKwkJCWNvbW1hbmQsIDAsIGJ1Ziwgc2l6ZSwgVVNCX0NUUkxfU0VUX1RJTUVPVVQpOworCisJaWYgKGxlbiAhPSBzaXplKQorCQlyZXR1cm4gLUVJTzsKKworCWlmIChrb25lcGx1c19yZWNlaXZlX2NvbnRyb2xfc3RhdHVzKHVzYl9kZXYpKQorCQlyZXR1cm4gLUVJTzsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGtvbmVwbHVzX3NlbGVjdF9wcm9maWxlKHN0cnVjdCB1c2JfZGV2aWNlICp1c2JfZGV2LCB1aW50IG51bWJlciwKKwkJZW51bSBrb25lcGx1c19jb250cm9sX3JlcXVlc3RzIHJlcXVlc3QpCit7CisJaW50IHJldHZhbDsKKworCXJldHZhbCA9IGtvbmVwbHVzX3NlbmRfY29udHJvbCh1c2JfZGV2LCBudW1iZXIsIHJlcXVlc3QpOworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisKKwkvKiBhbGxvdyB0aW1lIHRvIHNldHRsZSB0aGluZ3MgLSB3aW5kb3dzIGRyaXZlciB1c2VzIDUwMCAqLworCW1zbGVlcCgxMDApOworCisJcmV0dmFsID0ga29uZXBsdXNfcmVjZWl2ZV9jb250cm9sX3N0YXR1cyh1c2JfZGV2KTsKKwlpZiAocmV0dmFsKQorCQlyZXR1cm4gcmV0dmFsOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQga29uZXBsdXNfZ2V0X2luZm8oc3RydWN0IHVzYl9kZXZpY2UgKnVzYl9kZXYsCisJCXN0cnVjdCBrb25lcGx1c19pbmZvICpidWYpCit7CisJcmV0dXJuIGtvbmVwbHVzX3JlY2VpdmUodXNiX2RldiwgS09ORVBMVVNfVVNCX0NPTU1BTkRfSU5GTywKKwkJCWJ1Ziwgc2l6ZW9mKHN0cnVjdCBrb25lcGx1c19pbmZvKSk7Cit9CisKK3N0YXRpYyBpbnQga29uZXBsdXNfZ2V0X3Byb2ZpbGVfc2V0dGluZ3Moc3RydWN0IHVzYl9kZXZpY2UgKnVzYl9kZXYsCisJCXN0cnVjdCBrb25lcGx1c19wcm9maWxlX3NldHRpbmdzICpidWYsIHVpbnQgbnVtYmVyKQoreworCWludCByZXR2YWw7CisKKwlyZXR2YWwgPSBrb25lcGx1c19zZWxlY3RfcHJvZmlsZSh1c2JfZGV2LCBudW1iZXIsCisJCQlLT05FUExVU19DT05UUk9MX1JFUVVFU1RfUFJPRklMRV9TRVRUSU5HUyk7CisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIHJldHZhbDsKKworCXJldHVybiBrb25lcGx1c19yZWNlaXZlKHVzYl9kZXYsIEtPTkVQTFVTX1VTQl9DT01NQU5EX1BST0ZJTEVfU0VUVElOR1MsCisJCQlidWYsIHNpemVvZihzdHJ1Y3Qga29uZXBsdXNfcHJvZmlsZV9zZXR0aW5ncykpOworfQorCitzdGF0aWMgaW50IGtvbmVwbHVzX3NldF9wcm9maWxlX3NldHRpbmdzKHN0cnVjdCB1c2JfZGV2aWNlICp1c2JfZGV2LAorCQlzdHJ1Y3Qga29uZXBsdXNfcHJvZmlsZV9zZXR0aW5ncyBjb25zdCAqc2V0dGluZ3MpCit7CisJcmV0dXJuIGtvbmVwbHVzX3NlbmQodXNiX2RldiwgS09ORVBMVVNfVVNCX0NPTU1BTkRfUFJPRklMRV9TRVRUSU5HUywKKwkJCSh2b2lkICopc2V0dGluZ3MsIHNpemVvZihzdHJ1Y3Qga29uZXBsdXNfcHJvZmlsZV9zZXR0aW5ncykpOworfQorCitzdGF0aWMgaW50IGtvbmVwbHVzX2dldF9wcm9maWxlX2J1dHRvbnMoc3RydWN0IHVzYl9kZXZpY2UgKnVzYl9kZXYsCisJCXN0cnVjdCBrb25lcGx1c19wcm9maWxlX2J1dHRvbnMgKmJ1ZiwgaW50IG51bWJlcikKK3sKKwlpbnQgcmV0dmFsOworCisJcmV0dmFsID0ga29uZXBsdXNfc2VsZWN0X3Byb2ZpbGUodXNiX2RldiwgbnVtYmVyLAorCQkJS09ORVBMVVNfQ09OVFJPTF9SRVFVRVNUX1BST0ZJTEVfQlVUVE9OUyk7CisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIHJldHZhbDsKKworCXJldHVybiBrb25lcGx1c19yZWNlaXZlKHVzYl9kZXYsIEtPTkVQTFVTX1VTQl9DT01NQU5EX1BST0ZJTEVfQlVUVE9OUywKKwkJCWJ1Ziwgc2l6ZW9mKHN0cnVjdCBrb25lcGx1c19wcm9maWxlX2J1dHRvbnMpKTsKK30KKworc3RhdGljIGludCBrb25lcGx1c19zZXRfcHJvZmlsZV9idXR0b25zKHN0cnVjdCB1c2JfZGV2aWNlICp1c2JfZGV2LAorCQlzdHJ1Y3Qga29uZXBsdXNfcHJvZmlsZV9idXR0b25zIGNvbnN0ICpidXR0b25zKQoreworCXJldHVybiBrb25lcGx1c19zZW5kKHVzYl9kZXYsIEtPTkVQTFVTX1VTQl9DT01NQU5EX1BST0ZJTEVfQlVUVE9OUywKKwkJCSh2b2lkICopYnV0dG9ucywgc2l6ZW9mKHN0cnVjdCBrb25lcGx1c19wcm9maWxlX2J1dHRvbnMpKTsKK30KKworLyogcmV0dmFsIGlzIDAtNCBvbiBzdWNjZXNzLCA8IDAgb24gZXJyb3IgKi8KK3N0YXRpYyBpbnQga29uZXBsdXNfZ2V0X3N0YXJ0dXBfcHJvZmlsZShzdHJ1Y3QgdXNiX2RldmljZSAqdXNiX2RldikKK3sKKwlzdHJ1Y3Qga29uZXBsdXNfc3RhcnR1cF9wcm9maWxlICpidWY7CisJaW50IHJldHZhbDsKKworCWJ1ZiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBrb25lcGx1c19zdGFydHVwX3Byb2ZpbGUpLCBHRlBfS0VSTkVMKTsKKworCXJldHZhbCA9IGtvbmVwbHVzX3JlY2VpdmUodXNiX2RldiwgS09ORVBMVVNfVVNCX0NPTU1BTkRfU1RBUlRVUF9QUk9GSUxFLAorCQkJYnVmLCBzaXplb2Yoc3RydWN0IGtvbmVwbHVzX3N0YXJ0dXBfcHJvZmlsZSkpOworCisJaWYgKHJldHZhbCkKKwkJZ290byBvdXQ7CisKKwlyZXR2YWwgPSBidWYtPnN0YXJ0dXBfcHJvZmlsZTsKK291dDoKKwlrZnJlZShidWYpOworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBpbnQga29uZXBsdXNfc2V0X3N0YXJ0dXBfcHJvZmlsZShzdHJ1Y3QgdXNiX2RldmljZSAqdXNiX2RldiwKKwkJaW50IHN0YXJ0dXBfcHJvZmlsZSkKK3sKKwlzdHJ1Y3Qga29uZXBsdXNfc3RhcnR1cF9wcm9maWxlIGJ1ZjsKKworCWJ1Zi5jb21tYW5kID0gS09ORVBMVVNfQ09NTUFORF9TVEFSVFVQX1BST0ZJTEU7CisJYnVmLnNpemUgPSBzaXplb2Yoc3RydWN0IGtvbmVwbHVzX3N0YXJ0dXBfcHJvZmlsZSk7CisJYnVmLnN0YXJ0dXBfcHJvZmlsZSA9IHN0YXJ0dXBfcHJvZmlsZTsKKworCXJldHVybiBrb25lcGx1c19zZW5kKHVzYl9kZXYsIEtPTkVQTFVTX1VTQl9DT01NQU5EX1NUQVJUVVBfUFJPRklMRSwKKwkJCShjaGFyICopJmJ1Ziwgc2l6ZW9mKHN0cnVjdCBrb25lcGx1c19wcm9maWxlX2J1dHRvbnMpKTsKK30KKworc3RhdGljIHNzaXplX3Qga29uZXBsdXNfc3lzZnNfcmVhZChzdHJ1Y3QgZmlsZSAqZnAsIHN0cnVjdCBrb2JqZWN0ICprb2JqLAorCQljaGFyICpidWYsIGxvZmZfdCBvZmYsIHNpemVfdCBjb3VudCwKKwkJc2l6ZV90IHJlYWxfc2l6ZSwgdWludCBjb21tYW5kKQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9CisJCQljb250YWluZXJfb2Yoa29iaiwgc3RydWN0IGRldmljZSwga29iaiktPnBhcmVudC0+cGFyZW50OworCXN0cnVjdCBrb25lcGx1c19kZXZpY2UgKmtvbmVwbHVzID0gaGlkX2dldF9kcnZkYXRhKGRldl9nZXRfZHJ2ZGF0YShkZXYpKTsKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdXNiX2RldiA9IGludGVyZmFjZV90b191c2JkZXYodG9fdXNiX2ludGVyZmFjZShkZXYpKTsKKwlpbnQgcmV0dmFsOworCisJaWYgKG9mZiAhPSAwIHx8IGNvdW50ICE9IHJlYWxfc2l6ZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltdXRleF9sb2NrKCZrb25lcGx1cy0+a29uZXBsdXNfbG9jayk7CisJcmV0dmFsID0ga29uZXBsdXNfcmVjZWl2ZSh1c2JfZGV2LCBjb21tYW5kLCBidWYsIHJlYWxfc2l6ZSk7CisJbXV0ZXhfdW5sb2NrKCZrb25lcGx1cy0+a29uZXBsdXNfbG9jayk7CisKKwlpZiAocmV0dmFsKQorCQlyZXR1cm4gcmV0dmFsOworCisJcmV0dXJuIHJlYWxfc2l6ZTsKK30KKworc3RhdGljIHNzaXplX3Qga29uZXBsdXNfc3lzZnNfd3JpdGUoc3RydWN0IGZpbGUgKmZwLCBzdHJ1Y3Qga29iamVjdCAqa29iaiwKKwkJdm9pZCBjb25zdCAqYnVmLCBsb2ZmX3Qgb2ZmLCBzaXplX3QgY291bnQsCisJCXNpemVfdCByZWFsX3NpemUsIHVpbnQgY29tbWFuZCkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPQorCQkJY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBkZXZpY2UsIGtvYmopLT5wYXJlbnQtPnBhcmVudDsKKwlzdHJ1Y3Qga29uZXBsdXNfZGV2aWNlICprb25lcGx1cyA9IGhpZF9nZXRfZHJ2ZGF0YShkZXZfZ2V0X2RydmRhdGEoZGV2KSk7CisJc3RydWN0IHVzYl9kZXZpY2UgKnVzYl9kZXYgPSBpbnRlcmZhY2VfdG9fdXNiZGV2KHRvX3VzYl9pbnRlcmZhY2UoZGV2KSk7CisJaW50IHJldHZhbDsKKworCWlmIChvZmYgIT0gMCB8fCBjb3VudCAhPSByZWFsX3NpemUpCisJCXJldHVybiAtRUlOVkFMOworCisJbXV0ZXhfbG9jaygma29uZXBsdXMtPmtvbmVwbHVzX2xvY2spOworCXJldHZhbCA9IGtvbmVwbHVzX3NlbmQodXNiX2RldiwgY29tbWFuZCwgKHZvaWQgKilidWYsIHJlYWxfc2l6ZSk7CisJbXV0ZXhfdW5sb2NrKCZrb25lcGx1cy0+a29uZXBsdXNfbG9jayk7CisKKwlpZiAocmV0dmFsKQorCQlyZXR1cm4gcmV0dmFsOworCisJcmV0dXJuIHJlYWxfc2l6ZTsKK30KKworc3RhdGljIHNzaXplX3Qga29uZXBsdXNfc3lzZnNfd3JpdGVfbWFjcm8oc3RydWN0IGZpbGUgKmZwLAorCQlzdHJ1Y3Qga29iamVjdCAqa29iaiwgc3RydWN0IGJpbl9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZiwKKwkJbG9mZl90IG9mZiwgc2l6ZV90IGNvdW50KQoreworCXJldHVybiBrb25lcGx1c19zeXNmc193cml0ZShmcCwga29iaiwgYnVmLCBvZmYsIGNvdW50LAorCQkJc2l6ZW9mKHN0cnVjdCBrb25lcGx1c19tYWNybyksIEtPTkVQTFVTX1VTQl9DT01NQU5EX01BQ1JPKTsKK30KKworc3RhdGljIHNzaXplX3Qga29uZXBsdXNfc3lzZnNfcmVhZF9zZW5zb3Ioc3RydWN0IGZpbGUgKmZwLAorCQlzdHJ1Y3Qga29iamVjdCAqa29iaiwgc3RydWN0IGJpbl9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZiwKKwkJbG9mZl90IG9mZiwgc2l6ZV90IGNvdW50KQoreworCXJldHVybiBrb25lcGx1c19zeXNmc19yZWFkKGZwLCBrb2JqLCBidWYsIG9mZiwgY291bnQsCisJCQlzaXplb2Yoc3RydWN0IGtvbmVwbHVzX3NlbnNvciksIEtPTkVQTFVTX1VTQl9DT01NQU5EX1NFTlNPUik7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGtvbmVwbHVzX3N5c2ZzX3dyaXRlX3NlbnNvcihzdHJ1Y3QgZmlsZSAqZnAsCisJCXN0cnVjdCBrb2JqZWN0ICprb2JqLCBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmLAorCQlsb2ZmX3Qgb2ZmLCBzaXplX3QgY291bnQpCit7CisJcmV0dXJuIGtvbmVwbHVzX3N5c2ZzX3dyaXRlKGZwLCBrb2JqLCBidWYsIG9mZiwgY291bnQsCisJCQlzaXplb2Yoc3RydWN0IGtvbmVwbHVzX3NlbnNvciksIEtPTkVQTFVTX1VTQl9DT01NQU5EX1NFTlNPUik7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGtvbmVwbHVzX3N5c2ZzX3dyaXRlX3RjdShzdHJ1Y3QgZmlsZSAqZnAsCisJCXN0cnVjdCBrb2JqZWN0ICprb2JqLCBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmLAorCQlsb2ZmX3Qgb2ZmLCBzaXplX3QgY291bnQpCit7CisJcmV0dXJuIGtvbmVwbHVzX3N5c2ZzX3dyaXRlKGZwLCBrb2JqLCBidWYsIG9mZiwgY291bnQsCisJCQlzaXplb2Yoc3RydWN0IGtvbmVwbHVzX3RjdSksIEtPTkVQTFVTX1VTQl9DT01NQU5EX1RDVSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGtvbmVwbHVzX3N5c2ZzX3JlYWRfdGN1X2ltYWdlKHN0cnVjdCBmaWxlICpmcCwKKwkJc3RydWN0IGtvYmplY3QgKmtvYmosIHN0cnVjdCBiaW5fYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYsCisJCWxvZmZfdCBvZmYsIHNpemVfdCBjb3VudCkKK3sKKwlyZXR1cm4ga29uZXBsdXNfc3lzZnNfcmVhZChmcCwga29iaiwgYnVmLCBvZmYsIGNvdW50LAorCQkJc2l6ZW9mKHN0cnVjdCBrb25lcGx1c190Y3VfaW1hZ2UpLCBLT05FUExVU19VU0JfQ09NTUFORF9UQ1UpOworfQorCitzdGF0aWMgc3NpemVfdCBrb25lcGx1c19zeXNmc19yZWFkX3Byb2ZpbGV4X3NldHRpbmdzKHN0cnVjdCBmaWxlICpmcCwKKwkJc3RydWN0IGtvYmplY3QgKmtvYmosIHN0cnVjdCBiaW5fYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYsCisJCWxvZmZfdCBvZmYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPQorCQkJY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBkZXZpY2UsIGtvYmopLT5wYXJlbnQtPnBhcmVudDsKKwlzdHJ1Y3Qga29uZXBsdXNfZGV2aWNlICprb25lcGx1cyA9IGhpZF9nZXRfZHJ2ZGF0YShkZXZfZ2V0X2RydmRhdGEoZGV2KSk7CisKKwlpZiAob2ZmID49IHNpemVvZihzdHJ1Y3Qga29uZXBsdXNfcHJvZmlsZV9zZXR0aW5ncykpCisJCXJldHVybiAwOworCisJaWYgKG9mZiArIGNvdW50ID4gc2l6ZW9mKHN0cnVjdCBrb25lcGx1c19wcm9maWxlX3NldHRpbmdzKSkKKwkJY291bnQgPSBzaXplb2Yoc3RydWN0IGtvbmVwbHVzX3Byb2ZpbGVfc2V0dGluZ3MpIC0gb2ZmOworCisJbXV0ZXhfbG9jaygma29uZXBsdXMtPmtvbmVwbHVzX2xvY2spOworCW1lbWNweShidWYsICgodm9pZCBjb25zdCAqKSZrb25lcGx1cy0+cHJvZmlsZV9zZXR0aW5nc1sqKHVpbnQgKikoYXR0ci0+cHJpdmF0ZSldKSArIG9mZiwKKwkJCWNvdW50KTsKKwltdXRleF91bmxvY2soJmtvbmVwbHVzLT5rb25lcGx1c19sb2NrKTsKKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHNzaXplX3Qga29uZXBsdXNfc3lzZnNfd3JpdGVfcHJvZmlsZV9zZXR0aW5ncyhzdHJ1Y3QgZmlsZSAqZnAsCisJCXN0cnVjdCBrb2JqZWN0ICprb2JqLCBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmLAorCQlsb2ZmX3Qgb2ZmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0KKwkJCWNvbnRhaW5lcl9vZihrb2JqLCBzdHJ1Y3QgZGV2aWNlLCBrb2JqKS0+cGFyZW50LT5wYXJlbnQ7CisJc3RydWN0IGtvbmVwbHVzX2RldmljZSAqa29uZXBsdXMgPSBoaWRfZ2V0X2RydmRhdGEoZGV2X2dldF9kcnZkYXRhKGRldikpOworCXN0cnVjdCB1c2JfZGV2aWNlICp1c2JfZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldih0b191c2JfaW50ZXJmYWNlKGRldikpOworCWludCByZXR2YWwgPSAwOworCWludCBkaWZmZXJlbmNlOworCWludCBwcm9maWxlX251bWJlcjsKKwlzdHJ1Y3Qga29uZXBsdXNfcHJvZmlsZV9zZXR0aW5ncyAqcHJvZmlsZV9zZXR0aW5nczsKKworCWlmIChvZmYgIT0gMCB8fCBjb3VudCAhPSBzaXplb2Yoc3RydWN0IGtvbmVwbHVzX3Byb2ZpbGVfc2V0dGluZ3MpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXByb2ZpbGVfbnVtYmVyID0gKChzdHJ1Y3Qga29uZXBsdXNfcHJvZmlsZV9zZXR0aW5ncyBjb25zdCAqKWJ1ZiktPm51bWJlcjsKKwlwcm9maWxlX3NldHRpbmdzID0gJmtvbmVwbHVzLT5wcm9maWxlX3NldHRpbmdzW3Byb2ZpbGVfbnVtYmVyXTsKKworCW11dGV4X2xvY2soJmtvbmVwbHVzLT5rb25lcGx1c19sb2NrKTsKKwlkaWZmZXJlbmNlID0gbWVtY21wKGJ1ZiwgcHJvZmlsZV9zZXR0aW5ncywKKwkJCXNpemVvZihzdHJ1Y3Qga29uZXBsdXNfcHJvZmlsZV9zZXR0aW5ncykpOworCWlmIChkaWZmZXJlbmNlKSB7CisJCXJldHZhbCA9IGtvbmVwbHVzX3NldF9wcm9maWxlX3NldHRpbmdzKHVzYl9kZXYsCisJCQkJKHN0cnVjdCBrb25lcGx1c19wcm9maWxlX3NldHRpbmdzIGNvbnN0ICopYnVmKTsKKwkJaWYgKCFyZXR2YWwpCisJCQltZW1jcHkocHJvZmlsZV9zZXR0aW5ncywgYnVmLAorCQkJCQlzaXplb2Yoc3RydWN0IGtvbmVwbHVzX3Byb2ZpbGVfc2V0dGluZ3MpKTsKKwl9CisJbXV0ZXhfdW5sb2NrKCZrb25lcGx1cy0+a29uZXBsdXNfbG9jayk7CisKKwlpZiAocmV0dmFsKQorCQlyZXR1cm4gcmV0dmFsOworCisJcmV0dXJuIHNpemVvZihzdHJ1Y3Qga29uZXBsdXNfcHJvZmlsZV9zZXR0aW5ncyk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGtvbmVwbHVzX3N5c2ZzX3JlYWRfcHJvZmlsZXhfYnV0dG9ucyhzdHJ1Y3QgZmlsZSAqZnAsCisJCXN0cnVjdCBrb2JqZWN0ICprb2JqLCBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmLAorCQlsb2ZmX3Qgb2ZmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0KKwkJCWNvbnRhaW5lcl9vZihrb2JqLCBzdHJ1Y3QgZGV2aWNlLCBrb2JqKS0+cGFyZW50LT5wYXJlbnQ7CisJc3RydWN0IGtvbmVwbHVzX2RldmljZSAqa29uZXBsdXMgPSBoaWRfZ2V0X2RydmRhdGEoZGV2X2dldF9kcnZkYXRhKGRldikpOworCisJaWYgKG9mZiA+PSBzaXplb2Yoc3RydWN0IGtvbmVwbHVzX3Byb2ZpbGVfYnV0dG9ucykpCisJCXJldHVybiAwOworCisJaWYgKG9mZiArIGNvdW50ID4gc2l6ZW9mKHN0cnVjdCBrb25lcGx1c19wcm9maWxlX2J1dHRvbnMpKQorCQljb3VudCA9IHNpemVvZihzdHJ1Y3Qga29uZXBsdXNfcHJvZmlsZV9idXR0b25zKSAtIG9mZjsKKworCW11dGV4X2xvY2soJmtvbmVwbHVzLT5rb25lcGx1c19sb2NrKTsKKwltZW1jcHkoYnVmLCAoKHZvaWQgY29uc3QgKikma29uZXBsdXMtPnByb2ZpbGVfYnV0dG9uc1sqKHVpbnQgKikoYXR0ci0+cHJpdmF0ZSldKSArIG9mZiwKKwkJCWNvdW50KTsKKwltdXRleF91bmxvY2soJmtvbmVwbHVzLT5rb25lcGx1c19sb2NrKTsKKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHNzaXplX3Qga29uZXBsdXNfc3lzZnNfd3JpdGVfcHJvZmlsZV9idXR0b25zKHN0cnVjdCBmaWxlICpmcCwKKwkJc3RydWN0IGtvYmplY3QgKmtvYmosIHN0cnVjdCBiaW5fYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYsCisJCWxvZmZfdCBvZmYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPQorCQkJY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBkZXZpY2UsIGtvYmopLT5wYXJlbnQtPnBhcmVudDsKKwlzdHJ1Y3Qga29uZXBsdXNfZGV2aWNlICprb25lcGx1cyA9IGhpZF9nZXRfZHJ2ZGF0YShkZXZfZ2V0X2RydmRhdGEoZGV2KSk7CisJc3RydWN0IHVzYl9kZXZpY2UgKnVzYl9kZXYgPSBpbnRlcmZhY2VfdG9fdXNiZGV2KHRvX3VzYl9pbnRlcmZhY2UoZGV2KSk7CisJaW50IHJldHZhbCA9IDA7CisJaW50IGRpZmZlcmVuY2U7CisJdWludCBwcm9maWxlX251bWJlcjsKKwlzdHJ1Y3Qga29uZXBsdXNfcHJvZmlsZV9idXR0b25zICpwcm9maWxlX2J1dHRvbnM7CisKKwlpZiAob2ZmICE9IDAgfHwgY291bnQgIT0gc2l6ZW9mKHN0cnVjdCBrb25lcGx1c19wcm9maWxlX2J1dHRvbnMpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXByb2ZpbGVfbnVtYmVyID0gKChzdHJ1Y3Qga29uZXBsdXNfcHJvZmlsZV9idXR0b25zIGNvbnN0ICopYnVmKS0+bnVtYmVyOworCXByb2ZpbGVfYnV0dG9ucyA9ICZrb25lcGx1cy0+cHJvZmlsZV9idXR0b25zW3Byb2ZpbGVfbnVtYmVyXTsKKworCW11dGV4X2xvY2soJmtvbmVwbHVzLT5rb25lcGx1c19sb2NrKTsKKwlkaWZmZXJlbmNlID0gbWVtY21wKGJ1ZiwgcHJvZmlsZV9idXR0b25zLAorCQkJc2l6ZW9mKHN0cnVjdCBrb25lcGx1c19wcm9maWxlX2J1dHRvbnMpKTsKKwlpZiAoZGlmZmVyZW5jZSkgeworCQlyZXR2YWwgPSBrb25lcGx1c19zZXRfcHJvZmlsZV9idXR0b25zKHVzYl9kZXYsCisJCQkJKHN0cnVjdCBrb25lcGx1c19wcm9maWxlX2J1dHRvbnMgY29uc3QgKilidWYpOworCQlpZiAoIXJldHZhbCkKKwkJCW1lbWNweShwcm9maWxlX2J1dHRvbnMsIGJ1ZiwKKwkJCQkJc2l6ZW9mKHN0cnVjdCBrb25lcGx1c19wcm9maWxlX2J1dHRvbnMpKTsKKwl9CisJbXV0ZXhfdW5sb2NrKCZrb25lcGx1cy0+a29uZXBsdXNfbG9jayk7CisKKwlpZiAocmV0dmFsKQorCQlyZXR1cm4gcmV0dmFsOworCisJcmV0dXJuIHNpemVvZihzdHJ1Y3Qga29uZXBsdXNfcHJvZmlsZV9idXR0b25zKTsKK30KKworc3RhdGljIHNzaXplX3Qga29uZXBsdXNfc3lzZnNfc2hvd19zdGFydHVwX3Byb2ZpbGUoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBrb25lcGx1c19kZXZpY2UgKmtvbmVwbHVzID0KKwkJCWhpZF9nZXRfZHJ2ZGF0YShkZXZfZ2V0X2RydmRhdGEoZGV2LT5wYXJlbnQtPnBhcmVudCkpOworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkXG4iLCBrb25lcGx1cy0+c3RhcnR1cF9wcm9maWxlKTsKK30KKworc3RhdGljIHNzaXplX3Qga29uZXBsdXNfc3lzZnNfc2V0X3N0YXJ0dXBfcHJvZmlsZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyIGNvbnN0ICpidWYsIHNpemVfdCBzaXplKQoreworCXN0cnVjdCBrb25lcGx1c19kZXZpY2UgKmtvbmVwbHVzOworCXN0cnVjdCB1c2JfZGV2aWNlICp1c2JfZGV2OworCXVuc2lnbmVkIGxvbmcgcHJvZmlsZTsKKwlpbnQgcmV0dmFsOworCisJZGV2ID0gZGV2LT5wYXJlbnQtPnBhcmVudDsKKwlrb25lcGx1cyA9IGhpZF9nZXRfZHJ2ZGF0YShkZXZfZ2V0X2RydmRhdGEoZGV2KSk7CisJdXNiX2RldiA9IGludGVyZmFjZV90b191c2JkZXYodG9fdXNiX2ludGVyZmFjZShkZXYpKTsKKworCXJldHZhbCA9IHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMTAsICZwcm9maWxlKTsKKwlpZiAocmV0dmFsKQorCQlyZXR1cm4gcmV0dmFsOworCisJbXV0ZXhfbG9jaygma29uZXBsdXMtPmtvbmVwbHVzX2xvY2spOworCXJldHZhbCA9IGtvbmVwbHVzX3NldF9zdGFydHVwX3Byb2ZpbGUodXNiX2RldiwgcHJvZmlsZSk7CisJbXV0ZXhfdW5sb2NrKCZrb25lcGx1cy0+a29uZXBsdXNfbG9jayk7CisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIHJldHZhbDsKKworCXJldHVybiBzaXplOworfQorCitzdGF0aWMgc3NpemVfdCBrb25lcGx1c19zeXNmc19zaG93X2FjdHVhbF9wcm9maWxlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3Qga29uZXBsdXNfZGV2aWNlICprb25lcGx1cyA9CisJCQloaWRfZ2V0X2RydmRhdGEoZGV2X2dldF9kcnZkYXRhKGRldi0+cGFyZW50LT5wYXJlbnQpKTsKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZFxuIiwga29uZXBsdXMtPmFjdHVhbF9wcm9maWxlKTsKK30KKworc3RhdGljIHNzaXplX3Qga29uZXBsdXNfc3lzZnNfc2hvd19maXJtd2FyZV92ZXJzaW9uKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3Qga29uZXBsdXNfZGV2aWNlICprb25lcGx1cyA9CisJCQloaWRfZ2V0X2RydmRhdGEoZGV2X2dldF9kcnZkYXRhKGRldi0+cGFyZW50LT5wYXJlbnQpKTsKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZFxuIiwga29uZXBsdXMtPmluZm8uZmlybXdhcmVfdmVyc2lvbik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSBrb25lcGx1c19hdHRyaWJ1dGVzW10gPSB7CisJX19BVFRSKHN0YXJ0dXBfcHJvZmlsZSwgMDY2MCwKKwkJCWtvbmVwbHVzX3N5c2ZzX3Nob3dfc3RhcnR1cF9wcm9maWxlLAorCQkJa29uZXBsdXNfc3lzZnNfc2V0X3N0YXJ0dXBfcHJvZmlsZSksCisJX19BVFRSKGFjdHVhbF9wcm9maWxlLCAwNDQwLAorCQkJa29uZXBsdXNfc3lzZnNfc2hvd19hY3R1YWxfcHJvZmlsZSwgTlVMTCksCisJX19BVFRSKGZpcm13YXJlX3ZlcnNpb24sIDA0NDAsCisJCQlrb25lcGx1c19zeXNmc19zaG93X2Zpcm13YXJlX3ZlcnNpb24sIE5VTEwpLAorCV9fQVRUUl9OVUxMCit9OworCitzdGF0aWMgc3RydWN0IGJpbl9hdHRyaWJ1dGUga29uZXBsdXNfYmluX2F0dHJpYnV0ZXNbXSA9IHsKKwl7CisJCS5hdHRyID0geyAubmFtZSA9ICJzZW5zb3IiLCAubW9kZSA9IDAyMjAgfSwKKwkJLnNpemUgPSBzaXplb2Yoc3RydWN0IGtvbmVwbHVzX3NlbnNvciksCisJCS5yZWFkID0ga29uZXBsdXNfc3lzZnNfcmVhZF9zZW5zb3IsCisJCS53cml0ZSA9IGtvbmVwbHVzX3N5c2ZzX3dyaXRlX3NlbnNvcgorCX0sCisJeworCQkuYXR0ciA9IHsgLm5hbWUgPSAidGN1IiwgLm1vZGUgPSAwMjIwIH0sCisJCS5zaXplID0gc2l6ZW9mKHN0cnVjdCBrb25lcGx1c190Y3UpLAorCQkud3JpdGUgPSBrb25lcGx1c19zeXNmc193cml0ZV90Y3UKKwl9LAorCXsKKwkJLmF0dHIgPSB7IC5uYW1lID0gInRjdV9pbWFnZSIsIC5tb2RlID0gMDQ0MCB9LAorCQkuc2l6ZSA9IHNpemVvZihzdHJ1Y3Qga29uZXBsdXNfdGN1X2ltYWdlKSwKKwkJLnJlYWQgPSBrb25lcGx1c19zeXNmc19yZWFkX3RjdV9pbWFnZQorCX0sCisJeworCQkuYXR0ciA9IHsgLm5hbWUgPSAicHJvZmlsZV9zZXR0aW5ncyIsIC5tb2RlID0gMDIyMCB9LAorCQkuc2l6ZSA9IHNpemVvZihzdHJ1Y3Qga29uZXBsdXNfcHJvZmlsZV9zZXR0aW5ncyksCisJCS53cml0ZSA9IGtvbmVwbHVzX3N5c2ZzX3dyaXRlX3Byb2ZpbGVfc2V0dGluZ3MKKwl9LAorCXsKKwkJLmF0dHIgPSB7IC5uYW1lID0gInByb2ZpbGUxX3NldHRpbmdzIiwgLm1vZGUgPSAwNDQwIH0sCisJCS5zaXplID0gc2l6ZW9mKHN0cnVjdCBrb25lcGx1c19wcm9maWxlX3NldHRpbmdzKSwKKwkJLnJlYWQgPSBrb25lcGx1c19zeXNmc19yZWFkX3Byb2ZpbGV4X3NldHRpbmdzLAorCQkucHJpdmF0ZSA9ICZwcm9maWxlX251bWJlcnNbMF0KKwl9LAorCXsKKwkJLmF0dHIgPSB7IC5uYW1lID0gInByb2ZpbGUyX3NldHRpbmdzIiwgLm1vZGUgPSAwNDQwIH0sCisJCS5zaXplID0gc2l6ZW9mKHN0cnVjdCBrb25lcGx1c19wcm9maWxlX3NldHRpbmdzKSwKKwkJLnJlYWQgPSBrb25lcGx1c19zeXNmc19yZWFkX3Byb2ZpbGV4X3NldHRpbmdzLAorCQkucHJpdmF0ZSA9ICZwcm9maWxlX251bWJlcnNbMV0KKwl9LAorCXsKKwkJLmF0dHIgPSB7IC5uYW1lID0gInByb2ZpbGUzX3NldHRpbmdzIiwgLm1vZGUgPSAwNDQwIH0sCisJCS5zaXplID0gc2l6ZW9mKHN0cnVjdCBrb25lcGx1c19wcm9maWxlX3NldHRpbmdzKSwKKwkJLnJlYWQgPSBrb25lcGx1c19zeXNmc19yZWFkX3Byb2ZpbGV4X3NldHRpbmdzLAorCQkucHJpdmF0ZSA9ICZwcm9maWxlX251bWJlcnNbMl0KKwl9LAorCXsKKwkJLmF0dHIgPSB7IC5uYW1lID0gInByb2ZpbGU0X3NldHRpbmdzIiwgLm1vZGUgPSAwNDQwIH0sCisJCS5zaXplID0gc2l6ZW9mKHN0cnVjdCBrb25lcGx1c19wcm9maWxlX3NldHRpbmdzKSwKKwkJLnJlYWQgPSBrb25lcGx1c19zeXNmc19yZWFkX3Byb2ZpbGV4X3NldHRpbmdzLAorCQkucHJpdmF0ZSA9ICZwcm9maWxlX251bWJlcnNbM10KKwl9LAorCXsKKwkJLmF0dHIgPSB7IC5uYW1lID0gInByb2ZpbGU1X3NldHRpbmdzIiwgLm1vZGUgPSAwNDQwIH0sCisJCS5zaXplID0gc2l6ZW9mKHN0cnVjdCBrb25lcGx1c19wcm9maWxlX3NldHRpbmdzKSwKKwkJLnJlYWQgPSBrb25lcGx1c19zeXNmc19yZWFkX3Byb2ZpbGV4X3NldHRpbmdzLAorCQkucHJpdmF0ZSA9ICZwcm9maWxlX251bWJlcnNbNF0KKwl9LAorCXsKKwkJLmF0dHIgPSB7IC5uYW1lID0gInByb2ZpbGVfYnV0dG9ucyIsIC5tb2RlID0gMDIyMCB9LAorCQkuc2l6ZSA9IHNpemVvZihzdHJ1Y3Qga29uZXBsdXNfcHJvZmlsZV9idXR0b25zKSwKKwkJLndyaXRlID0ga29uZXBsdXNfc3lzZnNfd3JpdGVfcHJvZmlsZV9idXR0b25zCisJfSwKKwl7CisJCS5hdHRyID0geyAubmFtZSA9ICJwcm9maWxlMV9idXR0b25zIiwgLm1vZGUgPSAwNDQwIH0sCisJCS5zaXplID0gc2l6ZW9mKHN0cnVjdCBrb25lcGx1c19wcm9maWxlX2J1dHRvbnMpLAorCQkucmVhZCA9IGtvbmVwbHVzX3N5c2ZzX3JlYWRfcHJvZmlsZXhfYnV0dG9ucywKKwkJLnByaXZhdGUgPSAmcHJvZmlsZV9udW1iZXJzWzBdCisJfSwKKwl7CisJCS5hdHRyID0geyAubmFtZSA9ICJwcm9maWxlMl9idXR0b25zIiwgLm1vZGUgPSAwNDQwIH0sCisJCS5zaXplID0gc2l6ZW9mKHN0cnVjdCBrb25lcGx1c19wcm9maWxlX2J1dHRvbnMpLAorCQkucmVhZCA9IGtvbmVwbHVzX3N5c2ZzX3JlYWRfcHJvZmlsZXhfYnV0dG9ucywKKwkJLnByaXZhdGUgPSAmcHJvZmlsZV9udW1iZXJzWzFdCisJfSwKKwl7CisJCS5hdHRyID0geyAubmFtZSA9ICJwcm9maWxlM19idXR0b25zIiwgLm1vZGUgPSAwNDQwIH0sCisJCS5zaXplID0gc2l6ZW9mKHN0cnVjdCBrb25lcGx1c19wcm9maWxlX2J1dHRvbnMpLAorCQkucmVhZCA9IGtvbmVwbHVzX3N5c2ZzX3JlYWRfcHJvZmlsZXhfYnV0dG9ucywKKwkJLnByaXZhdGUgPSAmcHJvZmlsZV9udW1iZXJzWzJdCisJfSwKKwl7CisJCS5hdHRyID0geyAubmFtZSA9ICJwcm9maWxlNF9idXR0b25zIiwgLm1vZGUgPSAwNDQwIH0sCisJCS5zaXplID0gc2l6ZW9mKHN0cnVjdCBrb25lcGx1c19wcm9maWxlX2J1dHRvbnMpLAorCQkucmVhZCA9IGtvbmVwbHVzX3N5c2ZzX3JlYWRfcHJvZmlsZXhfYnV0dG9ucywKKwkJLnByaXZhdGUgPSAmcHJvZmlsZV9udW1iZXJzWzNdCisJfSwKKwl7CisJCS5hdHRyID0geyAubmFtZSA9ICJwcm9maWxlNV9idXR0b25zIiwgLm1vZGUgPSAwNDQwIH0sCisJCS5zaXplID0gc2l6ZW9mKHN0cnVjdCBrb25lcGx1c19wcm9maWxlX2J1dHRvbnMpLAorCQkucmVhZCA9IGtvbmVwbHVzX3N5c2ZzX3JlYWRfcHJvZmlsZXhfYnV0dG9ucywKKwkJLnByaXZhdGUgPSAmcHJvZmlsZV9udW1iZXJzWzRdCisJfSwKKwl7CisJCS5hdHRyID0geyAubmFtZSA9ICJtYWNybyIsIC5tb2RlID0gMDIyMCB9LAorCQkuc2l6ZSA9IHNpemVvZihzdHJ1Y3Qga29uZXBsdXNfbWFjcm8pLAorCQkud3JpdGUgPSBrb25lcGx1c19zeXNmc193cml0ZV9tYWNybworCX0sCisJX19BVFRSX05VTEwKK307CisKK3N0YXRpYyBpbnQga29uZXBsdXNfaW5pdF9rb25lcGx1c19kZXZpY2Vfc3RydWN0KHN0cnVjdCB1c2JfZGV2aWNlICp1c2JfZGV2LAorCQlzdHJ1Y3Qga29uZXBsdXNfZGV2aWNlICprb25lcGx1cykKK3sKKwlpbnQgcmV0dmFsLCBpOworCXN0YXRpYyB1aW50IHdhaXQgPSA3MDsgLyogZGV2aWNlIHdpbGwgZnJlZXplIHdpdGgganVzdCA2MCAqLworCisJbXV0ZXhfaW5pdCgma29uZXBsdXMtPmtvbmVwbHVzX2xvY2spOworCisJa29uZXBsdXMtPnN0YXJ0dXBfcHJvZmlsZSA9IGtvbmVwbHVzX2dldF9zdGFydHVwX3Byb2ZpbGUodXNiX2Rldik7CisKKwltc2xlZXAod2FpdCk7CisJcmV0dmFsID0ga29uZXBsdXNfZ2V0X2luZm8odXNiX2RldiwgJmtvbmVwbHVzLT5pbmZvKTsKKwlpZiAocmV0dmFsKQorCQlyZXR1cm4gcmV0dmFsOworCisJZm9yIChpID0gMDsgaSA8IDU7ICsraSkgeworCQltc2xlZXAod2FpdCk7CisJCXJldHZhbCA9IGtvbmVwbHVzX2dldF9wcm9maWxlX3NldHRpbmdzKHVzYl9kZXYsCisJCQkJJmtvbmVwbHVzLT5wcm9maWxlX3NldHRpbmdzW2ldLCBpKTsKKwkJaWYgKHJldHZhbCkKKwkJCXJldHVybiByZXR2YWw7CisKKwkJbXNsZWVwKHdhaXQpOworCQlyZXR2YWwgPSBrb25lcGx1c19nZXRfcHJvZmlsZV9idXR0b25zKHVzYl9kZXYsCisJCQkJJmtvbmVwbHVzLT5wcm9maWxlX2J1dHRvbnNbaV0sIGkpOworCQlpZiAocmV0dmFsKQorCQkJcmV0dXJuIHJldHZhbDsKKwl9CisKKwlrb25lcGx1c19wcm9maWxlX2FjdGl2YXRlZChrb25lcGx1cywga29uZXBsdXMtPnN0YXJ0dXBfcHJvZmlsZSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBrb25lcGx1c19pbml0X3NwZWNpYWxzKHN0cnVjdCBoaWRfZGV2aWNlICpoZGV2KQoreworCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmID0gdG9fdXNiX2ludGVyZmFjZShoZGV2LT5kZXYucGFyZW50KTsKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdXNiX2RldiA9IGludGVyZmFjZV90b191c2JkZXYoaW50Zik7CisJc3RydWN0IGtvbmVwbHVzX2RldmljZSAqa29uZXBsdXM7CisJaW50IHJldHZhbDsKKworCWlmIChpbnRmLT5jdXJfYWx0c2V0dGluZy0+ZGVzYy5iSW50ZXJmYWNlUHJvdG9jb2wKKwkJCT09IFVTQl9JTlRFUkZBQ0VfUFJPVE9DT0xfTU9VU0UpIHsKKworCQlrb25lcGx1cyA9IGt6YWxsb2Moc2l6ZW9mKCprb25lcGx1cyksIEdGUF9LRVJORUwpOworCQlpZiAoIWtvbmVwbHVzKSB7CisJCQlkZXZfZXJyKCZoZGV2LT5kZXYsICJjYW4ndCBhbGxvYyBkZXZpY2UgZGVzY3JpcHRvclxuIik7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCQloaWRfc2V0X2RydmRhdGEoaGRldiwga29uZXBsdXMpOworCisJCXJldHZhbCA9IGtvbmVwbHVzX2luaXRfa29uZXBsdXNfZGV2aWNlX3N0cnVjdCh1c2JfZGV2LCBrb25lcGx1cyk7CisJCWlmIChyZXR2YWwpIHsKKwkJCWRldl9lcnIoJmhkZXYtPmRldiwKKwkJCQkJImNvdWxkbid0IGluaXQgc3RydWN0IGtvbmVwbHVzX2RldmljZVxuIik7CisJCQlnb3RvIGV4aXRfZnJlZTsKKwkJfQorCisJCXJldHZhbCA9IHJvY2NhdF9jb25uZWN0KGtvbmVwbHVzX2NsYXNzLCBoZGV2KTsKKwkJaWYgKHJldHZhbCA8IDApIHsKKwkJCWRldl9lcnIoJmhkZXYtPmRldiwgImNvdWxkbid0IGluaXQgY2hhciBkZXZcbiIpOworCQl9IGVsc2UgeworCQkJa29uZXBsdXMtPmNocmRldl9taW5vciA9IHJldHZhbDsKKwkJCWtvbmVwbHVzLT5yb2NjYXRfY2xhaW1lZCA9IDE7CisJCX0KKwl9IGVsc2UgeworCQloaWRfc2V0X2RydmRhdGEoaGRldiwgTlVMTCk7CisJfQorCisJcmV0dXJuIDA7CitleGl0X2ZyZWU6CisJa2ZyZWUoa29uZXBsdXMpOworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyB2b2lkIGtvbmVwbHVzX3JlbW92ZV9zcGVjaWFscyhzdHJ1Y3QgaGlkX2RldmljZSAqaGRldikKK3sKKwlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiA9IHRvX3VzYl9pbnRlcmZhY2UoaGRldi0+ZGV2LnBhcmVudCk7CisJc3RydWN0IGtvbmVwbHVzX2RldmljZSAqa29uZXBsdXM7CisKKwlpZiAoaW50Zi0+Y3VyX2FsdHNldHRpbmctPmRlc2MuYkludGVyZmFjZVByb3RvY29sCisJCQk9PSBVU0JfSU5URVJGQUNFX1BST1RPQ09MX01PVVNFKSB7CisJCWtvbmVwbHVzID0gaGlkX2dldF9kcnZkYXRhKGhkZXYpOworCQlpZiAoa29uZXBsdXMtPnJvY2NhdF9jbGFpbWVkKQorCQkJcm9jY2F0X2Rpc2Nvbm5lY3Qoa29uZXBsdXMtPmNocmRldl9taW5vcik7CisJCWtmcmVlKGtvbmVwbHVzKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQga29uZXBsdXNfcHJvYmUoc3RydWN0IGhpZF9kZXZpY2UgKmhkZXYsCisJCWNvbnN0IHN0cnVjdCBoaWRfZGV2aWNlX2lkICppZCkKK3sKKwlpbnQgcmV0dmFsOworCisJcmV0dmFsID0gaGlkX3BhcnNlKGhkZXYpOworCWlmIChyZXR2YWwpIHsKKwkJZGV2X2VycigmaGRldi0+ZGV2LCAicGFyc2UgZmFpbGVkXG4iKTsKKwkJZ290byBleGl0OworCX0KKworCXJldHZhbCA9IGhpZF9od19zdGFydChoZGV2LCBISURfQ09OTkVDVF9ERUZBVUxUKTsKKwlpZiAocmV0dmFsKSB7CisJCWRldl9lcnIoJmhkZXYtPmRldiwgImh3IHN0YXJ0IGZhaWxlZFxuIik7CisJCWdvdG8gZXhpdDsKKwl9CisKKwlyZXR2YWwgPSBrb25lcGx1c19pbml0X3NwZWNpYWxzKGhkZXYpOworCWlmIChyZXR2YWwpIHsKKwkJZGV2X2VycigmaGRldi0+ZGV2LCAiY291bGRuJ3QgaW5zdGFsbCBtb3VzZVxuIik7CisJCWdvdG8gZXhpdF9zdG9wOworCX0KKworCXJldHVybiAwOworCitleGl0X3N0b3A6CisJaGlkX2h3X3N0b3AoaGRldik7CitleGl0OgorCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyB2b2lkIGtvbmVwbHVzX3JlbW92ZShzdHJ1Y3QgaGlkX2RldmljZSAqaGRldikKK3sKKwlrb25lcGx1c19yZW1vdmVfc3BlY2lhbHMoaGRldik7CisJaGlkX2h3X3N0b3AoaGRldik7Cit9CisKK3N0YXRpYyB2b2lkIGtvbmVwbHVzX2tlZXBfdmFsdWVzX3VwX3RvX2RhdGUoc3RydWN0IGtvbmVwbHVzX2RldmljZSAqa29uZXBsdXMsCisJCXU4IGNvbnN0ICpkYXRhKQoreworCXN0cnVjdCBrb25lcGx1c19tb3VzZV9yZXBvcnRfYnV0dG9uIGNvbnN0ICpidXR0b25fcmVwb3J0OworCisJc3dpdGNoIChkYXRhWzBdKSB7CisJY2FzZSBLT05FUExVU19NT1VTRV9SRVBPUlRfTlVNQkVSX0JVVFRPTjoKKwkJYnV0dG9uX3JlcG9ydCA9IChzdHJ1Y3Qga29uZXBsdXNfbW91c2VfcmVwb3J0X2J1dHRvbiBjb25zdCAqKWRhdGE7CisJCXN3aXRjaCAoYnV0dG9uX3JlcG9ydC0+dHlwZSkgeworCQljYXNlIEtPTkVQTFVTX01PVVNFX1JFUE9SVF9CVVRUT05fVFlQRV9QUk9GSUxFOgorCQkJa29uZXBsdXNfcHJvZmlsZV9hY3RpdmF0ZWQoa29uZXBsdXMsIGJ1dHRvbl9yZXBvcnQtPmRhdGExIC0gMSk7CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGtvbmVwbHVzX3JlcG9ydF90b19jaHJkZXYoc3RydWN0IGtvbmVwbHVzX2RldmljZSBjb25zdCAqa29uZXBsdXMsCisJCXU4IGNvbnN0ICpkYXRhKQoreworCXN0cnVjdCBrb25lcGx1c19yb2NjYXRfcmVwb3J0IHJvY2NhdF9yZXBvcnQ7CisJc3RydWN0IGtvbmVwbHVzX21vdXNlX3JlcG9ydF9idXR0b24gY29uc3QgKmJ1dHRvbl9yZXBvcnQ7CisKKwlpZiAoZGF0YVswXSAhPSBLT05FUExVU19NT1VTRV9SRVBPUlRfTlVNQkVSX0JVVFRPTikKKwkJcmV0dXJuOworCisJYnV0dG9uX3JlcG9ydCA9IChzdHJ1Y3Qga29uZXBsdXNfbW91c2VfcmVwb3J0X2J1dHRvbiBjb25zdCAqKWRhdGE7CisKKwlpZiAoKGJ1dHRvbl9yZXBvcnQtPnR5cGUgPT0gS09ORVBMVVNfTU9VU0VfUkVQT1JUX0JVVFRPTl9UWVBFX1FVSUNLTEFVTkNIIHx8CisJCQlidXR0b25fcmVwb3J0LT50eXBlID09IEtPTkVQTFVTX01PVVNFX1JFUE9SVF9CVVRUT05fVFlQRV9USU1FUikgJiYKKwkJCWJ1dHRvbl9yZXBvcnQtPmRhdGEyICE9IEtPTkVQTFVTX01PVVNFX1JFUE9SVF9CVVRUT05fQUNUSU9OX1BSRVNTKQorCQlyZXR1cm47CisKKwlyb2NjYXRfcmVwb3J0LnR5cGUgPSBidXR0b25fcmVwb3J0LT50eXBlOworCXJvY2NhdF9yZXBvcnQuZGF0YTEgPSBidXR0b25fcmVwb3J0LT5kYXRhMTsKKwlyb2NjYXRfcmVwb3J0LmRhdGEyID0gYnV0dG9uX3JlcG9ydC0+ZGF0YTI7CisJcm9jY2F0X3JlcG9ydC5wcm9maWxlID0ga29uZXBsdXMtPmFjdHVhbF9wcm9maWxlICsgMTsKKwlyb2NjYXRfcmVwb3J0X2V2ZW50KGtvbmVwbHVzLT5jaHJkZXZfbWlub3IsCisJCQkodWludDhfdCBjb25zdCAqKSZyb2NjYXRfcmVwb3J0LAorCQkJc2l6ZW9mKHN0cnVjdCBrb25lcGx1c19yb2NjYXRfcmVwb3J0KSk7Cit9CisKK3N0YXRpYyBpbnQga29uZXBsdXNfcmF3X2V2ZW50KHN0cnVjdCBoaWRfZGV2aWNlICpoZGV2LAorCQlzdHJ1Y3QgaGlkX3JlcG9ydCAqcmVwb3J0LCB1OCAqZGF0YSwgaW50IHNpemUpCit7CisJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYgPSB0b191c2JfaW50ZXJmYWNlKGhkZXYtPmRldi5wYXJlbnQpOworCXN0cnVjdCBrb25lcGx1c19kZXZpY2UgKmtvbmVwbHVzID0gaGlkX2dldF9kcnZkYXRhKGhkZXYpOworCisJaWYgKGludGYtPmN1cl9hbHRzZXR0aW5nLT5kZXNjLmJJbnRlcmZhY2VQcm90b2NvbAorCQkJIT0gVVNCX0lOVEVSRkFDRV9QUk9UT0NPTF9NT1VTRSkKKwkJcmV0dXJuIDA7CisKKwlrb25lcGx1c19rZWVwX3ZhbHVlc191cF90b19kYXRlKGtvbmVwbHVzLCBkYXRhKTsKKworCWlmIChrb25lcGx1cy0+cm9jY2F0X2NsYWltZWQpCisJCWtvbmVwbHVzX3JlcG9ydF90b19jaHJkZXYoa29uZXBsdXMsIGRhdGEpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGlkX2RldmljZV9pZCBrb25lcGx1c19kZXZpY2VzW10gPSB7CisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX1JPQ0NBVCwgVVNCX0RFVklDRV9JRF9ST0NDQVRfS09ORVBMVVMpIH0sCisJeyB9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKGhpZCwga29uZXBsdXNfZGV2aWNlcyk7CisKK3N0YXRpYyBzdHJ1Y3QgaGlkX2RyaXZlciBrb25lcGx1c19kcml2ZXIgPSB7CisJCS5uYW1lID0gImtvbmVwbHVzIiwKKwkJLmlkX3RhYmxlID0ga29uZXBsdXNfZGV2aWNlcywKKwkJLnByb2JlID0ga29uZXBsdXNfcHJvYmUsCisJCS5yZW1vdmUgPSBrb25lcGx1c19yZW1vdmUsCisJCS5yYXdfZXZlbnQgPSBrb25lcGx1c19yYXdfZXZlbnQKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGtvbmVwbHVzX2luaXQodm9pZCkKK3sKKwlpbnQgcmV0dmFsOworCisJLyogY2xhc3MgbmFtZSBoYXMgdG8gYmUgc2FtZSBhcyBkcml2ZXIgbmFtZSAqLworCWtvbmVwbHVzX2NsYXNzID0gY2xhc3NfY3JlYXRlKFRISVNfTU9EVUxFLCAia29uZXBsdXMiKTsKKwlpZiAoSVNfRVJSKGtvbmVwbHVzX2NsYXNzKSkKKwkJcmV0dXJuIFBUUl9FUlIoa29uZXBsdXNfY2xhc3MpOworCWtvbmVwbHVzX2NsYXNzLT5kZXZfYXR0cnMgPSBrb25lcGx1c19hdHRyaWJ1dGVzOworCWtvbmVwbHVzX2NsYXNzLT5kZXZfYmluX2F0dHJzID0ga29uZXBsdXNfYmluX2F0dHJpYnV0ZXM7CisKKwlyZXR2YWwgPSBoaWRfcmVnaXN0ZXJfZHJpdmVyKCZrb25lcGx1c19kcml2ZXIpOworCWlmIChyZXR2YWwpCisJCWNsYXNzX2Rlc3Ryb3koa29uZXBsdXNfY2xhc3MpOworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBrb25lcGx1c19leGl0KHZvaWQpCit7CisJY2xhc3NfZGVzdHJveShrb25lcGx1c19jbGFzcyk7CisJaGlkX3VucmVnaXN0ZXJfZHJpdmVyKCZrb25lcGx1c19kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChrb25lcGx1c19pbml0KTsKK21vZHVsZV9leGl0KGtvbmVwbHVzX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJTdGVmYW4gQWNoYXR6Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlVTQiBSb2NjYXQgS29uZVsrXSBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL2hpZC1yb2NjYXQta29uZXBsdXMuaCBiL2RyaXZlcnMvaGlkL2hpZC1yb2NjYXQta29uZXBsdXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41N2E1YzFhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9oaWQvaGlkLXJvY2NhdC1rb25lcGx1cy5oCkBAIC0wLDAgKzEsMjI0IEBACisjaWZuZGVmIF9fSElEX1JPQ0NBVF9LT05FUExVU19ICisjZGVmaW5lIF9fSElEX1JPQ0NBVF9LT05FUExVU19ICisKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgU3RlZmFuIEFjaGF0eiA8ZXJhem9yX2RlQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKyAqLworCisvKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworLyoKKyAqIGNhc2UgMTogd3JpdGVzIHJlcXVlc3QgODAgYW5kIHJlYWRzIHZhbHVlIDEKKyAqCisgKi8KK3N0cnVjdCBrb25lcGx1c19jb250cm9sIHsKKwl1aW50OF90IGNvbW1hbmQ7IC8qIEtPTkVQTFVTX0NPTU1BTkRfQ09OVFJPTCAqLworCS8qCisJICogdmFsdWUgaXMgcHJvZmlsZSBudW1iZXIgaW4gcmFuZ2UgMC00IGZvciByZXF1ZXN0aW5nIHNldHRpbmdzIGFuZCBidXR0b25zCisJICogMSBpZiBzdGF0dXMgb2sgZm9yIHJlcXVlc3Rpbmcgc3RhdHVzCisJICovCisJdWludDhfdCB2YWx1ZTsKKwl1aW50OF90IHJlcXVlc3Q7Cit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSk7CisKK2VudW0ga29uZXBsdXNfY29udHJvbF9yZXF1ZXN0cyB7CisJS09ORVBMVVNfQ09OVFJPTF9SRVFVRVNUX1NUQVRVUyA9IDB4MDAsCisJS09ORVBMVVNfQ09OVFJPTF9SRVFVRVNUX1BST0ZJTEVfU0VUVElOR1MgPSAweDgwLAorCUtPTkVQTFVTX0NPTlRST0xfUkVRVUVTVF9QUk9GSUxFX0JVVFRPTlMgPSAweDkwLAorfTsKKworZW51bSBrb25lcGx1c19jb250cm9sX3ZhbHVlcyB7CisJS09ORVBMVVNfQ09OVFJPTF9SRVFVRVNUX1NUQVRVU19PVkVSTE9BRCA9IDAsCisJS09ORVBMVVNfQ09OVFJPTF9SRVFVRVNUX1NUQVRVU19PSyA9IDEsCisJS09ORVBMVVNfQ09OVFJPTF9SRVFVRVNUX1NUQVRVU19XQUlUID0gMywKK307CisKK3N0cnVjdCBrb25lcGx1c19zdGFydHVwX3Byb2ZpbGUgeworCXVpbnQ4X3QgY29tbWFuZDsgLyogS09ORVBMVVNfQ09NTUFORF9TVEFSVFVQX1BST0ZJTEUgKi8KKwl1aW50OF90IHNpemU7IC8qIGFsd2F5cyAzICovCisJdWludDhfdCBzdGFydHVwX3Byb2ZpbGU7IC8qIFJhbmdlIDAtNCEgKi8KK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKTsKKworc3RydWN0IGtvbmVwbHVzX3Byb2ZpbGVfc2V0dGluZ3MgeworCXVpbnQ4X3QgY29tbWFuZDsgLyogS09ORVBMVVNfQ09NTUFORF9QUk9GSUxFX1NFVFRJTkdTICovCisJdWludDhfdCBzaXplOyAvKiBhbHdheXMgNDMgKi8KKwl1aW50OF90IG51bWJlcjsgLyogcmFuZ2UgMC00ICovCisJdWludDhfdCBhZHZhbmNlZF9zZW5zaXRpdml0eTsKKwl1aW50OF90IHNlbnNpdGl2aXR5X3g7CisJdWludDhfdCBzZW5zaXRpdml0eV95OworCXVpbnQ4X3QgY3BpX2xldmVsc19lbmFibGVkOworCXVpbnQ4X3QgY3BpX2xldmVsc194WzVdOworCXVpbnQ4X3QgY3BpX3N0YXJ0dXBfbGV2ZWw7IC8qIHJhbmdlIDAtNCAqLworCXVpbnQ4X3QgY3BpX2xldmVsc195WzVdOyAvKiByYW5nZSAxLTYwIG1lYW5zIDEwMC02MDAwIGNwaSAqLworCXVpbnQ4X3QgdW5rbm93bjE7CisJdWludDhfdCBwb2xsaW5nX3JhdGU7CisJdWludDhfdCBsaWdodHNfZW5hYmxlZDsKKwl1aW50OF90IGxpZ2h0X2VmZmVjdF9tb2RlOworCXVpbnQ4X3QgY29sb3JfZmxvd19lZmZlY3Q7CisJdWludDhfdCBsaWdodF9lZmZlY3RfdHlwZTsKKwl1aW50OF90IGxpZ2h0X2VmZmVjdF9zcGVlZDsKKwl1aW50OF90IGxpZ2h0c1sxNl07CisJdWludDE2X3QgY2hlY2tzdW07Cit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSk7CisKK3N0cnVjdCBrb25lcGx1c19wcm9maWxlX2J1dHRvbnMgeworCXVpbnQ4X3QgY29tbWFuZDsgLyogS09ORVBMVVNfQ09NTUFORF9QUk9GSUxFX0JVVFRPTlMgKi8KKwl1aW50OF90IHNpemU7IC8qIGFsd2F5cyA3NyAqLworCXVpbnQ4X3QgbnVtYmVyOyAvKiByYW5nZSAwLTQgKi8KKwl1aW50OF90IGRhdGFbNzJdOworCXVpbnQxNl90IGNoZWNrc3VtOworfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpOworCitzdHJ1Y3Qga29uZXBsdXNfbWFjcm8geworCXVpbnQ4X3QgY29tbWFuZDsgLyogS09ORVBMVVNfQ09NTUFORF9NQUNSTyAqLworCXVpbnQxNl90IHNpemU7IC8qIGFsd2F5cyAweDgyMiBsaXR0bGUgZW5kaWFuICovCisJdWludDhfdCBwcm9maWxlOyAvKiByYW5nZSAwLTQgKi8KKwl1aW50OF90IGJ1dHRvbjsgLyogcmFuZ2UgMC0yMyAqLworCXVpbnQ4X3QgZGF0YVsyMDc1XTsKKwl1aW50MTZfdCBjaGVja3N1bTsKK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKTsKKworc3RydWN0IGtvbmVwbHVzX2luZm8geworCXVpbnQ4X3QgY29tbWFuZDsgLyogS09ORVBMVVNfQ09NTUFORF9JTkZPICovCisJdWludDhfdCBzaXplOyAvKiBhbHdheXMgNiAqLworCXVpbnQ4X3QgZmlybXdhcmVfdmVyc2lvbjsKKwl1aW50OF90IHVua25vd25bM107Cit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSk7CisKK3N0cnVjdCBrb25lcGx1c19lIHsKKwl1aW50OF90IGNvbW1hbmQ7IC8qIEtPTkVQTFVTX0NPTU1BTkRfRSAqLworCXVpbnQ4X3Qgc2l6ZTsgLyogYWx3YXlzIDMgKi8KKwl1aW50OF90IHVua25vd247IC8qIFRPRE8gMTsgMCBiZWZvcmUgZmlybXdhcmUgdXBkYXRlICovCit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSk7CisKK3N0cnVjdCBrb25lcGx1c19zZW5zb3IgeworCXVpbnQ4X3QgY29tbWFuZDsgIC8qIEtPTkVQTFVTX0NPTU1BTkRfU0VOU09SICovCisJdWludDhfdCBzaXplOyAvKiBhbHdheXMgNiAqLworCXVpbnQ4X3QgZGF0YVs0XTsKK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKTsKKworc3RydWN0IGtvbmVwbHVzX2Zpcm13YXJlX3dyaXRlIHsKKwl1aW50OF90IGNvbW1hbmQ7IC8qIEtPTkVQTFVTX0NPTU1BTkRfRklSTVdBUkVfV1JJVEUgKi8KKwl1aW50OF90IHVua25vd25bMTAyNV07Cit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSk7CisKK3N0cnVjdCBrb25lcGx1c19maXJtd2FyZV93cml0ZV9jb250cm9sIHsKKwl1aW50OF90IGNvbW1hbmQ7IC8qIEtPTkVQTFVTX0NPTU1BTkRfRklSTVdBUkVfV1JJVEVfQ09OVFJPTCAqLworCS8qCisJICogdmFsdWUgaXMgMSBvbiBzdWNjZXNzCisJICogMyBtZWFucyAibm90IGZpbmlzaGVkIHlldCIKKwkgKi8KKwl1aW50OF90IHZhbHVlOworCXVpbnQ4X3QgdW5rbm93bjsgLyogYWx3YXlzIDB4NzUgKi8KK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKTsKKworc3RydWN0IGtvbmVwbHVzX3RjdSB7CisJdWludDE2X3QgdXNiX2NvbW1hbmQ7IC8qIEtPTkVQTFVTX1VTQl9DT01NQU5EX1RDVSAqLworCXVpbnQ4X3QgZGF0YVsyXTsKK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKTsKKworc3RydWN0IGtvbmVwbHVzX3RjdV9pbWFnZSB7CisJdWludDE2X3QgdXNiX2NvbW1hbmQ7IC8qIEtPTkVQTFVTX1VTQl9DT01NQU5EX1RDVSAqLworCXVpbnQ4X3QgZGF0YVsxMDI0XTsKKwl1aW50MTZfdCBjaGVja3N1bTsKK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKTsKKworZW51bSBrb25lcGx1c19jb21tYW5kcyB7CisJS09ORVBMVVNfQ09NTUFORF9DT05UUk9MID0gMHg0LAorCUtPTkVQTFVTX0NPTU1BTkRfU1RBUlRVUF9QUk9GSUxFID0gMHg1LAorCUtPTkVQTFVTX0NPTU1BTkRfUFJPRklMRV9TRVRUSU5HUyA9IDB4NiwKKwlLT05FUExVU19DT01NQU5EX1BST0ZJTEVfQlVUVE9OUyA9IDB4NywKKwlLT05FUExVU19DT01NQU5EX01BQ1JPID0gMHg4LAorCUtPTkVQTFVTX0NPTU1BTkRfSU5GTyA9IDB4OSwKKwlLT05FUExVU19DT01NQU5EX0UgPSAweGUsCisJS09ORVBMVVNfQ09NTUFORF9TRU5TT1IgPSAweGYsCisJS09ORVBMVVNfQ09NTUFORF9GSVJNV0FSRV9XUklURSA9IDB4MWIsCisJS09ORVBMVVNfQ09NTUFORF9GSVJNV0FSRV9XUklURV9DT05UUk9MID0gMHgxYywKK307CisKK2VudW0ga29uZXBsdXNfdXNiX2NvbW1hbmRzIHsKKwlLT05FUExVU19VU0JfQ09NTUFORF9DT05UUk9MID0gMHgzMDQsCisJS09ORVBMVVNfVVNCX0NPTU1BTkRfU1RBUlRVUF9QUk9GSUxFID0gMHgzMDUsCisJS09ORVBMVVNfVVNCX0NPTU1BTkRfUFJPRklMRV9TRVRUSU5HUyA9IDB4MzA2LAorCUtPTkVQTFVTX1VTQl9DT01NQU5EX1BST0ZJTEVfQlVUVE9OUyA9IDB4MzA3LAorCUtPTkVQTFVTX1VTQl9DT01NQU5EX01BQ1JPID0gMHgzMDgsCisJS09ORVBMVVNfVVNCX0NPTU1BTkRfSU5GTyA9IDB4MzA5LAorCUtPTkVQTFVTX1VTQl9DT01NQU5EX1RDVSA9IDB4MzBjLAorCUtPTkVQTFVTX1VTQl9DT01NQU5EX0UgPSAweDMwZSwKKwlLT05FUExVU19VU0JfQ09NTUFORF9TRU5TT1IgPSAweDMwZiwKKwlLT05FUExVU19VU0JfQ09NTUFORF9GSVJNV0FSRV9XUklURSA9IDB4MzFiLAorCUtPTkVQTFVTX1VTQl9DT01NQU5EX0ZJUk1XQVJFX1dSSVRFX0NPTlRST0wgPSAweDMxYywKK307CisKK2VudW0ga29uZXBsdXNfbW91c2VfcmVwb3J0X251bWJlcnMgeworCUtPTkVQTFVTX01PVVNFX1JFUE9SVF9OVU1CRVJfSElEID0gMSwKKwlLT05FUExVU19NT1VTRV9SRVBPUlRfTlVNQkVSX0FVRElPID0gMiwKKwlLT05FUExVU19NT1VTRV9SRVBPUlRfTlVNQkVSX0JVVFRPTiA9IDMsCit9OworCitzdHJ1Y3Qga29uZXBsdXNfbW91c2VfcmVwb3J0X2J1dHRvbiB7CisJdWludDhfdCByZXBvcnRfbnVtYmVyOyAvKiBhbHdheXMgS09ORVBMVVNfTU9VU0VfUkVQT1JUX05VTUJFUl9CVVRUT04gKi8KKwl1aW50OF90IHplcm8xOworCXVpbnQ4X3QgdHlwZTsKKwl1aW50OF90IGRhdGExOworCXVpbnQ4X3QgZGF0YTI7CisJdWludDhfdCB6ZXJvMjsKKwl1aW50OF90IHVua25vd25bMl07Cit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSk7CisKK2VudW0ga29uZXBsdXNfbW91c2VfcmVwb3J0X2J1dHRvbl90eXBlcyB7CisJLyogZGF0YTEgPSBuZXcgcHJvZmlsZSByYW5nZSAxLTUgKi8KKwlLT05FUExVU19NT1VTRV9SRVBPUlRfQlVUVE9OX1RZUEVfUFJPRklMRSA9IDB4MjAsCisKKwkvKiBkYXRhMSA9IGJ1dHRvbiBudW1iZXIgcmFuZ2UgMS0yNDsgZGF0YTIgPSBhY3Rpb24gKi8KKwlLT05FUExVU19NT1VTRV9SRVBPUlRfQlVUVE9OX1RZUEVfUVVJQ0tMQVVOQ0ggPSAweDYwLAorCisJLyogZGF0YTEgPSBidXR0b24gbnVtYmVyIHJhbmdlIDEtMjQ7IGRhdGEyID0gYWN0aW9uICovCisJS09ORVBMVVNfTU9VU0VfUkVQT1JUX0JVVFRPTl9UWVBFX1RJTUVSID0gMHg4MCwKKworCS8qIGRhdGExID0gc2V0dGluZyBudW1iZXIgcmFuZ2UgMS01ICovCisJS09ORVBMVVNfTU9VU0VfUkVQT1JUX0JVVFRPTl9UWVBFX0NQSSA9IDB4YjAsCisKKwkvKiBkYXRhMSBhbmQgZGF0YTIgPSByYW5nZSAweDEtMHhiICovCisJS09ORVBMVVNfTU9VU0VfUkVQT1JUX0JVVFRPTl9UWVBFX1NFTlNJVElWSVRZID0gMHhjMCwKKworCS8qIGRhdGExID0gMjIgPSBuZXh0IHRyYWNrLi4uCisJICogZGF0YTIgPSBhY3Rpb24KKwkgKi8KKwlLT05FUExVU19NT1VTRV9SRVBPUlRfQlVUVE9OX1RZUEVfTVVMVElNRURJQSA9IDB4ZjAsCit9OworCitlbnVtIGtvbmVwbHVzX21vdXNlX3JlcG9ydF9idXR0b25fYWN0aW9uIHsKKwlLT05FUExVU19NT1VTRV9SRVBPUlRfQlVUVE9OX0FDVElPTl9QUkVTUyA9IDAsCisJS09ORVBMVVNfTU9VU0VfUkVQT1JUX0JVVFRPTl9BQ1RJT05fUkVMRUFTRSA9IDEsCit9OworCitzdHJ1Y3Qga29uZXBsdXNfcm9jY2F0X3JlcG9ydCB7CisJdWludDhfdCB0eXBlOworCXVpbnQ4X3QgZGF0YTE7CisJdWludDhfdCBkYXRhMjsKKwl1aW50OF90IHByb2ZpbGU7Cit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSk7CisKK3N0cnVjdCBrb25lcGx1c19kZXZpY2UgeworCWludCBhY3R1YWxfcHJvZmlsZTsKKworCWludCByb2NjYXRfY2xhaW1lZDsKKwlpbnQgY2hyZGV2X21pbm9yOworCisJc3RydWN0IG11dGV4IGtvbmVwbHVzX2xvY2s7CisKKwlpbnQgc3RhcnR1cF9wcm9maWxlOworCXN0cnVjdCBrb25lcGx1c19pbmZvIGluZm87CisJc3RydWN0IGtvbmVwbHVzX3Byb2ZpbGVfc2V0dGluZ3MgcHJvZmlsZV9zZXR0aW5nc1s1XTsKKwlzdHJ1Y3Qga29uZXBsdXNfcHJvZmlsZV9idXR0b25zIHByb2ZpbGVfYnV0dG9uc1s1XTsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvaGlkLXJvY2NhdC1weXJhLmMgYi9kcml2ZXJzL2hpZC9oaWQtcm9jY2F0LXB5cmEuYwppbmRleCA5YmYyMzA0Li4wMmM1OGUwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC9oaWQtcm9jY2F0LXB5cmEuYworKysgYi9kcml2ZXJzL2hpZC9oaWQtcm9jY2F0LXB5cmEuYwpAQCAtMjcsNiArMjcsMTEgQEAKICNpbmNsdWRlICJoaWQtcm9jY2F0LmgiCiAjaW5jbHVkZSAiaGlkLXJvY2NhdC1weXJhLmgiCiAKK3N0YXRpYyB1aW50IHByb2ZpbGVfbnVtYmVyc1s1XSA9IHswLCAxLCAyLCAzLCA0fTsKKworLyogcHlyYV9jbGFzcyBpcyB1c2VkIGZvciBjcmVhdGluZyBzeXNmcyBhdHRyaWJ1dGVzIHZpYSByb2NjYXQgY2hhciBkZXZpY2UgKi8KK3N0YXRpYyBzdHJ1Y3QgY2xhc3MgKnB5cmFfY2xhc3M7CisKIHN0YXRpYyB2b2lkIHByb2ZpbGVfYWN0aXZhdGVkKHN0cnVjdCBweXJhX2RldmljZSAqcHlyYSwKIAkJdW5zaWduZWQgaW50IG5ld19wcm9maWxlKQogewpAQCAtODcsOSArOTIsOCBAQAogCQkJY29udHJvbC52YWx1ZSA9PSAxKQogCQkJcmV0dXJuIDA7CiAJZWxzZSB7Ci0JCWRldl9lcnIoJnVzYl9kZXYtPmRldiwgInJlY2VpdmUgY29udHJvbCBzdGF0dXM6ICIKLQkJCQkidW5rbm93biByZXNwb25zZSAweCV4IDB4JXhcbiIsCi0JCQkJY29udHJvbC5yZXF1ZXN0LCBjb250cm9sLnZhbHVlKTsKKwkJaGlkX2Vycih1c2JfZGV2LCAicmVjZWl2ZSBjb250cm9sIHN0YXR1czogdW5rbm93biByZXNwb25zZSAweCV4IDB4JXhcbiIsCisJCQljb250cm9sLnJlcXVlc3QsIGNvbnRyb2wudmFsdWUpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiB9CkBAIC0yMjEsOSArMjI1LDEwIEBACiAKIHN0YXRpYyBzc2l6ZV90IHB5cmFfc3lzZnNfcmVhZF9wcm9maWxleF9zZXR0aW5ncyhzdHJ1Y3QgZmlsZSAqZnAsCiAJCXN0cnVjdCBrb2JqZWN0ICprb2JqLCBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmLAotCQlsb2ZmX3Qgb2ZmLCBzaXplX3QgY291bnQsIGludCBudW1iZXIpCisJCWxvZmZfdCBvZmYsIHNpemVfdCBjb3VudCkKIHsKLQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBjb250YWluZXJfb2Yoa29iaiwgc3RydWN0IGRldmljZSwga29iaik7CisJc3RydWN0IGRldmljZSAqZGV2ID0KKwkJCWNvbnRhaW5lcl9vZihrb2JqLCBzdHJ1Y3QgZGV2aWNlLCBrb2JqKS0+cGFyZW50LT5wYXJlbnQ7CiAJc3RydWN0IHB5cmFfZGV2aWNlICpweXJhID0gaGlkX2dldF9kcnZkYXRhKGRldl9nZXRfZHJ2ZGF0YShkZXYpKTsKIAogCWlmIChvZmYgPj0gc2l6ZW9mKHN0cnVjdCBweXJhX3Byb2ZpbGVfc2V0dGluZ3MpKQpAQCAtMjMzLDU4ICsyMzgsMTkgQEAKIAkJY291bnQgPSBzaXplb2Yoc3RydWN0IHB5cmFfcHJvZmlsZV9zZXR0aW5ncykgLSBvZmY7CiAKIAltdXRleF9sb2NrKCZweXJhLT5weXJhX2xvY2spOwotCW1lbWNweShidWYsICgoY2hhciBjb25zdCAqKSZweXJhLT5wcm9maWxlX3NldHRpbmdzW251bWJlcl0pICsgb2ZmLAorCW1lbWNweShidWYsICgoY2hhciBjb25zdCAqKSZweXJhLT5wcm9maWxlX3NldHRpbmdzWyoodWludCAqKShhdHRyLT5wcml2YXRlKV0pICsgb2ZmLAogCQkJY291bnQpOwogCW11dGV4X3VubG9jaygmcHlyYS0+cHlyYV9sb2NrKTsKIAogCXJldHVybiBjb3VudDsKIH0KIAotc3RhdGljIHNzaXplX3QgcHlyYV9zeXNmc19yZWFkX3Byb2ZpbGUxX3NldHRpbmdzKHN0cnVjdCBmaWxlICpmcCwKLQkJc3RydWN0IGtvYmplY3QgKmtvYmosIHN0cnVjdCBiaW5fYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYsCi0JCWxvZmZfdCBvZmYsIHNpemVfdCBjb3VudCkKLXsKLQlyZXR1cm4gcHlyYV9zeXNmc19yZWFkX3Byb2ZpbGV4X3NldHRpbmdzKGZwLCBrb2JqLAotCQkJYXR0ciwgYnVmLCBvZmYsIGNvdW50LCAwKTsKLX0KLQotc3RhdGljIHNzaXplX3QgcHlyYV9zeXNmc19yZWFkX3Byb2ZpbGUyX3NldHRpbmdzKHN0cnVjdCBmaWxlICpmcCwKLQkJc3RydWN0IGtvYmplY3QgKmtvYmosIHN0cnVjdCBiaW5fYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYsCi0JCWxvZmZfdCBvZmYsIHNpemVfdCBjb3VudCkKLXsKLQlyZXR1cm4gcHlyYV9zeXNmc19yZWFkX3Byb2ZpbGV4X3NldHRpbmdzKGZwLCBrb2JqLAotCQkJYXR0ciwgYnVmLCBvZmYsIGNvdW50LCAxKTsKLX0KLQotc3RhdGljIHNzaXplX3QgcHlyYV9zeXNmc19yZWFkX3Byb2ZpbGUzX3NldHRpbmdzKHN0cnVjdCBmaWxlICpmcCwKLQkJc3RydWN0IGtvYmplY3QgKmtvYmosIHN0cnVjdCBiaW5fYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYsCi0JCWxvZmZfdCBvZmYsIHNpemVfdCBjb3VudCkKLXsKLQlyZXR1cm4gcHlyYV9zeXNmc19yZWFkX3Byb2ZpbGV4X3NldHRpbmdzKGZwLCBrb2JqLAotCQkJYXR0ciwgYnVmLCBvZmYsIGNvdW50LCAyKTsKLX0KLQotc3RhdGljIHNzaXplX3QgcHlyYV9zeXNmc19yZWFkX3Byb2ZpbGU0X3NldHRpbmdzKHN0cnVjdCBmaWxlICpmcCwKLQkJc3RydWN0IGtvYmplY3QgKmtvYmosIHN0cnVjdCBiaW5fYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYsCi0JCWxvZmZfdCBvZmYsIHNpemVfdCBjb3VudCkKLXsKLQlyZXR1cm4gcHlyYV9zeXNmc19yZWFkX3Byb2ZpbGV4X3NldHRpbmdzKGZwLCBrb2JqLAotCQkJYXR0ciwgYnVmLCBvZmYsIGNvdW50LCAzKTsKLX0KLQotc3RhdGljIHNzaXplX3QgcHlyYV9zeXNmc19yZWFkX3Byb2ZpbGU1X3NldHRpbmdzKHN0cnVjdCBmaWxlICpmcCwKLQkJc3RydWN0IGtvYmplY3QgKmtvYmosIHN0cnVjdCBiaW5fYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYsCi0JCWxvZmZfdCBvZmYsIHNpemVfdCBjb3VudCkKLXsKLQlyZXR1cm4gcHlyYV9zeXNmc19yZWFkX3Byb2ZpbGV4X3NldHRpbmdzKGZwLCBrb2JqLAotCQkJYXR0ciwgYnVmLCBvZmYsIGNvdW50LCA0KTsKLX0KLQogc3RhdGljIHNzaXplX3QgcHlyYV9zeXNmc19yZWFkX3Byb2ZpbGV4X2J1dHRvbnMoc3RydWN0IGZpbGUgKmZwLAogCQlzdHJ1Y3Qga29iamVjdCAqa29iaiwgc3RydWN0IGJpbl9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZiwKLQkJbG9mZl90IG9mZiwgc2l6ZV90IGNvdW50LCBpbnQgbnVtYmVyKQorCQlsb2ZmX3Qgb2ZmLCBzaXplX3QgY291bnQpCiB7Ci0Jc3RydWN0IGRldmljZSAqZGV2ID0gY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBkZXZpY2UsIGtvYmopOworCXN0cnVjdCBkZXZpY2UgKmRldiA9CisJCQljb250YWluZXJfb2Yoa29iaiwgc3RydWN0IGRldmljZSwga29iaiktPnBhcmVudC0+cGFyZW50OwogCXN0cnVjdCBweXJhX2RldmljZSAqcHlyYSA9IGhpZF9nZXRfZHJ2ZGF0YShkZXZfZ2V0X2RydmRhdGEoZGV2KSk7CiAKIAlpZiAob2ZmID49IHNpemVvZihzdHJ1Y3QgcHlyYV9wcm9maWxlX2J1dHRvbnMpKQpAQCAtMjk0LDU4ICsyNjAsMTkgQEAKIAkJY291bnQgPSBzaXplb2Yoc3RydWN0IHB5cmFfcHJvZmlsZV9idXR0b25zKSAtIG9mZjsKIAogCW11dGV4X2xvY2soJnB5cmEtPnB5cmFfbG9jayk7Ci0JbWVtY3B5KGJ1ZiwgKChjaGFyIGNvbnN0ICopJnB5cmEtPnByb2ZpbGVfYnV0dG9uc1tudW1iZXJdKSArIG9mZiwKKwltZW1jcHkoYnVmLCAoKGNoYXIgY29uc3QgKikmcHlyYS0+cHJvZmlsZV9idXR0b25zWyoodWludCAqKShhdHRyLT5wcml2YXRlKV0pICsgb2ZmLAogCQkJY291bnQpOwogCW11dGV4X3VubG9jaygmcHlyYS0+cHlyYV9sb2NrKTsKIAogCXJldHVybiBjb3VudDsKIH0KIAotc3RhdGljIHNzaXplX3QgcHlyYV9zeXNmc19yZWFkX3Byb2ZpbGUxX2J1dHRvbnMoc3RydWN0IGZpbGUgKmZwLAotCQlzdHJ1Y3Qga29iamVjdCAqa29iaiwgc3RydWN0IGJpbl9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZiwKLQkJbG9mZl90IG9mZiwgc2l6ZV90IGNvdW50KQotewotCXJldHVybiBweXJhX3N5c2ZzX3JlYWRfcHJvZmlsZXhfYnV0dG9ucyhmcCwga29iaiwKLQkJCWF0dHIsIGJ1Ziwgb2ZmLCBjb3VudCwgMCk7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IHB5cmFfc3lzZnNfcmVhZF9wcm9maWxlMl9idXR0b25zKHN0cnVjdCBmaWxlICpmcCwKLQkJc3RydWN0IGtvYmplY3QgKmtvYmosIHN0cnVjdCBiaW5fYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYsCi0JCWxvZmZfdCBvZmYsIHNpemVfdCBjb3VudCkKLXsKLQlyZXR1cm4gcHlyYV9zeXNmc19yZWFkX3Byb2ZpbGV4X2J1dHRvbnMoZnAsIGtvYmosCi0JCQlhdHRyLCBidWYsIG9mZiwgY291bnQsIDEpOwotfQotCi1zdGF0aWMgc3NpemVfdCBweXJhX3N5c2ZzX3JlYWRfcHJvZmlsZTNfYnV0dG9ucyhzdHJ1Y3QgZmlsZSAqZnAsCi0JCXN0cnVjdCBrb2JqZWN0ICprb2JqLCBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmLAotCQlsb2ZmX3Qgb2ZmLCBzaXplX3QgY291bnQpCi17Ci0JcmV0dXJuIHB5cmFfc3lzZnNfcmVhZF9wcm9maWxleF9idXR0b25zKGZwLCBrb2JqLAotCQkJYXR0ciwgYnVmLCBvZmYsIGNvdW50LCAyKTsKLX0KLQotc3RhdGljIHNzaXplX3QgcHlyYV9zeXNmc19yZWFkX3Byb2ZpbGU0X2J1dHRvbnMoc3RydWN0IGZpbGUgKmZwLAotCQlzdHJ1Y3Qga29iamVjdCAqa29iaiwgc3RydWN0IGJpbl9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZiwKLQkJbG9mZl90IG9mZiwgc2l6ZV90IGNvdW50KQotewotCXJldHVybiBweXJhX3N5c2ZzX3JlYWRfcHJvZmlsZXhfYnV0dG9ucyhmcCwga29iaiwKLQkJCWF0dHIsIGJ1Ziwgb2ZmLCBjb3VudCwgMyk7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IHB5cmFfc3lzZnNfcmVhZF9wcm9maWxlNV9idXR0b25zKHN0cnVjdCBmaWxlICpmcCwKLQkJc3RydWN0IGtvYmplY3QgKmtvYmosIHN0cnVjdCBiaW5fYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYsCi0JCWxvZmZfdCBvZmYsIHNpemVfdCBjb3VudCkKLXsKLQlyZXR1cm4gcHlyYV9zeXNmc19yZWFkX3Byb2ZpbGV4X2J1dHRvbnMoZnAsIGtvYmosCi0JCQlhdHRyLCBidWYsIG9mZiwgY291bnQsIDQpOwotfQotCiBzdGF0aWMgc3NpemVfdCBweXJhX3N5c2ZzX3dyaXRlX3Byb2ZpbGVfc2V0dGluZ3Moc3RydWN0IGZpbGUgKmZwLAogCQlzdHJ1Y3Qga29iamVjdCAqa29iaiwgc3RydWN0IGJpbl9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZiwKIAkJbG9mZl90IG9mZiwgc2l6ZV90IGNvdW50KQogewotCXN0cnVjdCBkZXZpY2UgKmRldiA9IGNvbnRhaW5lcl9vZihrb2JqLCBzdHJ1Y3QgZGV2aWNlLCBrb2JqKTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPQorCQkJY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBkZXZpY2UsIGtvYmopLT5wYXJlbnQtPnBhcmVudDsKIAlzdHJ1Y3QgcHlyYV9kZXZpY2UgKnB5cmEgPSBoaWRfZ2V0X2RydmRhdGEoZGV2X2dldF9kcnZkYXRhKGRldikpOwogCXN0cnVjdCB1c2JfZGV2aWNlICp1c2JfZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldih0b191c2JfaW50ZXJmYWNlKGRldikpOwogCWludCByZXR2YWwgPSAwOwpAQCAtMzgxLDcgKzMwOCw4IEBACiAJCXN0cnVjdCBrb2JqZWN0ICprb2JqLCBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmLAogCQlsb2ZmX3Qgb2ZmLCBzaXplX3QgY291bnQpCiB7Ci0Jc3RydWN0IGRldmljZSAqZGV2ID0gY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBkZXZpY2UsIGtvYmopOworCXN0cnVjdCBkZXZpY2UgKmRldiA9CisJCQljb250YWluZXJfb2Yoa29iaiwgc3RydWN0IGRldmljZSwga29iaiktPnBhcmVudC0+cGFyZW50OwogCXN0cnVjdCBweXJhX2RldmljZSAqcHlyYSA9IGhpZF9nZXRfZHJ2ZGF0YShkZXZfZ2V0X2RydmRhdGEoZGV2KSk7CiAJc3RydWN0IHVzYl9kZXZpY2UgKnVzYl9kZXYgPSBpbnRlcmZhY2VfdG9fdXNiZGV2KHRvX3VzYl9pbnRlcmZhY2UoZGV2KSk7CiAJaW50IHJldHZhbCA9IDA7CkBAIC00MTcsNyArMzQ1LDggQEAKIAkJc3RydWN0IGtvYmplY3QgKmtvYmosIHN0cnVjdCBiaW5fYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYsCiAJCWxvZmZfdCBvZmYsIHNpemVfdCBjb3VudCkKIHsKLQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBjb250YWluZXJfb2Yoa29iaiwgc3RydWN0IGRldmljZSwga29iaik7CisJc3RydWN0IGRldmljZSAqZGV2ID0KKwkJCWNvbnRhaW5lcl9vZihrb2JqLCBzdHJ1Y3QgZGV2aWNlLCBrb2JqKS0+cGFyZW50LT5wYXJlbnQ7CiAJc3RydWN0IHB5cmFfZGV2aWNlICpweXJhID0gaGlkX2dldF9kcnZkYXRhKGRldl9nZXRfZHJ2ZGF0YShkZXYpKTsKIAogCWlmIChvZmYgPj0gc2l6ZW9mKHN0cnVjdCBweXJhX3NldHRpbmdzKSkKQEAgLTQzNyw3ICszNjYsOCBAQAogCQlzdHJ1Y3Qga29iamVjdCAqa29iaiwgc3RydWN0IGJpbl9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZiwKIAkJbG9mZl90IG9mZiwgc2l6ZV90IGNvdW50KQogewotCXN0cnVjdCBkZXZpY2UgKmRldiA9IGNvbnRhaW5lcl9vZihrb2JqLCBzdHJ1Y3QgZGV2aWNlLCBrb2JqKTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPQorCQkJY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBkZXZpY2UsIGtvYmopLT5wYXJlbnQtPnBhcmVudDsKIAlzdHJ1Y3QgcHlyYV9kZXZpY2UgKnB5cmEgPSBoaWRfZ2V0X2RydmRhdGEoZGV2X2dldF9kcnZkYXRhKGRldikpOwogCXN0cnVjdCB1c2JfZGV2aWNlICp1c2JfZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldih0b191c2JfaW50ZXJmYWNlKGRldikpOwogCWludCByZXR2YWwgPSAwOwpAQCAtNDY5LDI1NSArMzk5LDEyNSBAQAogc3RhdGljIHNzaXplX3QgcHlyYV9zeXNmc19zaG93X2FjdHVhbF9jcGkoc3RydWN0IGRldmljZSAqZGV2LAogCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogewotCXN0cnVjdCBweXJhX2RldmljZSAqcHlyYSA9IGhpZF9nZXRfZHJ2ZGF0YShkZXZfZ2V0X2RydmRhdGEoZGV2KSk7CisJc3RydWN0IHB5cmFfZGV2aWNlICpweXJhID0KKwkJCWhpZF9nZXRfZHJ2ZGF0YShkZXZfZ2V0X2RydmRhdGEoZGV2LT5wYXJlbnQtPnBhcmVudCkpOwogCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkXG4iLCBweXJhLT5hY3R1YWxfY3BpKTsKIH0KIAogc3RhdGljIHNzaXplX3QgcHlyYV9zeXNmc19zaG93X2FjdHVhbF9wcm9maWxlKHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKLQlzdHJ1Y3QgcHlyYV9kZXZpY2UgKnB5cmEgPSBoaWRfZ2V0X2RydmRhdGEoZGV2X2dldF9kcnZkYXRhKGRldikpOworCXN0cnVjdCBweXJhX2RldmljZSAqcHlyYSA9CisJCQloaWRfZ2V0X2RydmRhdGEoZGV2X2dldF9kcnZkYXRhKGRldi0+cGFyZW50LT5wYXJlbnQpKTsKIAlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZFxuIiwgcHlyYS0+YWN0dWFsX3Byb2ZpbGUpOwogfQogCiBzdGF0aWMgc3NpemVfdCBweXJhX3N5c2ZzX3Nob3dfZmlybXdhcmVfdmVyc2lvbihzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCiB7Ci0Jc3RydWN0IHB5cmFfZGV2aWNlICpweXJhID0gaGlkX2dldF9kcnZkYXRhKGRldl9nZXRfZHJ2ZGF0YShkZXYpKTsKKwlzdHJ1Y3QgcHlyYV9kZXZpY2UgKnB5cmEgPQorCQkJaGlkX2dldF9kcnZkYXRhKGRldl9nZXRfZHJ2ZGF0YShkZXYtPnBhcmVudC0+cGFyZW50KSk7CiAJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWRcbiIsIHB5cmEtPmZpcm13YXJlX3ZlcnNpb24pOwogfQogCiBzdGF0aWMgc3NpemVfdCBweXJhX3N5c2ZzX3Nob3dfc3RhcnR1cF9wcm9maWxlKHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKLQlzdHJ1Y3QgcHlyYV9kZXZpY2UgKnB5cmEgPSBoaWRfZ2V0X2RydmRhdGEoZGV2X2dldF9kcnZkYXRhKGRldikpOworCXN0cnVjdCBweXJhX2RldmljZSAqcHlyYSA9CisJCQloaWRfZ2V0X2RydmRhdGEoZGV2X2dldF9kcnZkYXRhKGRldi0+cGFyZW50LT5wYXJlbnQpKTsKIAlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZFxuIiwgcHlyYS0+c2V0dGluZ3Muc3RhcnR1cF9wcm9maWxlKTsKIH0KIAotc3RhdGljIERFVklDRV9BVFRSKGFjdHVhbF9jcGksIDA0NDAsIHB5cmFfc3lzZnNfc2hvd19hY3R1YWxfY3BpLCBOVUxMKTsKLQotc3RhdGljIERFVklDRV9BVFRSKGFjdHVhbF9wcm9maWxlLCAwNDQwLCBweXJhX3N5c2ZzX3Nob3dfYWN0dWFsX3Byb2ZpbGUsIE5VTEwpOwotCi1zdGF0aWMgREVWSUNFX0FUVFIoZmlybXdhcmVfdmVyc2lvbiwgMDQ0MCwKLQkJcHlyYV9zeXNmc19zaG93X2Zpcm13YXJlX3ZlcnNpb24sIE5VTEwpOwotCi1zdGF0aWMgREVWSUNFX0FUVFIoc3RhcnR1cF9wcm9maWxlLCAwNDQwLAotCQlweXJhX3N5c2ZzX3Nob3dfc3RhcnR1cF9wcm9maWxlLCBOVUxMKTsKLQotc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKnB5cmFfYXR0cmlidXRlc1tdID0gewotCQkmZGV2X2F0dHJfYWN0dWFsX2NwaS5hdHRyLAotCQkmZGV2X2F0dHJfYWN0dWFsX3Byb2ZpbGUuYXR0ciwKLQkJJmRldl9hdHRyX2Zpcm13YXJlX3ZlcnNpb24uYXR0ciwKLQkJJmRldl9hdHRyX3N0YXJ0dXBfcHJvZmlsZS5hdHRyLAotCQlOVUxMCitzdGF0aWMgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgcHlyYV9hdHRyaWJ1dGVzW10gPSB7CisJX19BVFRSKGFjdHVhbF9jcGksIDA0NDAsIHB5cmFfc3lzZnNfc2hvd19hY3R1YWxfY3BpLCBOVUxMKSwKKwlfX0FUVFIoYWN0dWFsX3Byb2ZpbGUsIDA0NDAsIHB5cmFfc3lzZnNfc2hvd19hY3R1YWxfcHJvZmlsZSwgTlVMTCksCisJX19BVFRSKGZpcm13YXJlX3ZlcnNpb24sIDA0NDAsCisJCQlweXJhX3N5c2ZzX3Nob3dfZmlybXdhcmVfdmVyc2lvbiwgTlVMTCksCisJX19BVFRSKHN0YXJ0dXBfcHJvZmlsZSwgMDQ0MCwKKwkJCXB5cmFfc3lzZnNfc2hvd19zdGFydHVwX3Byb2ZpbGUsIE5VTEwpLAorCV9fQVRUUl9OVUxMCiB9OwogCi1zdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBweXJhX2F0dHJpYnV0ZV9ncm91cCA9IHsKLQkJLmF0dHJzID0gcHlyYV9hdHRyaWJ1dGVzCi19OwotCi1zdGF0aWMgc3RydWN0IGJpbl9hdHRyaWJ1dGUgcHlyYV9wcm9maWxlX3NldHRpbmdzX2F0dHIgPSB7CitzdGF0aWMgc3RydWN0IGJpbl9hdHRyaWJ1dGUgcHlyYV9iaW5fYXR0cmlidXRlc1tdID0geworCXsKIAkJLmF0dHIgPSB7IC5uYW1lID0gInByb2ZpbGVfc2V0dGluZ3MiLCAubW9kZSA9IDAyMjAgfSwKIAkJLnNpemUgPSBzaXplb2Yoc3RydWN0IHB5cmFfcHJvZmlsZV9zZXR0aW5ncyksCiAJCS53cml0ZSA9IHB5cmFfc3lzZnNfd3JpdGVfcHJvZmlsZV9zZXR0aW5ncwotfTsKLQotc3RhdGljIHN0cnVjdCBiaW5fYXR0cmlidXRlIHB5cmFfcHJvZmlsZTFfc2V0dGluZ3NfYXR0ciA9IHsKKwl9LAorCXsKIAkJLmF0dHIgPSB7IC5uYW1lID0gInByb2ZpbGUxX3NldHRpbmdzIiwgLm1vZGUgPSAwNDQwIH0sCiAJCS5zaXplID0gc2l6ZW9mKHN0cnVjdCBweXJhX3Byb2ZpbGVfc2V0dGluZ3MpLAotCQkucmVhZCA9IHB5cmFfc3lzZnNfcmVhZF9wcm9maWxlMV9zZXR0aW5ncwotfTsKLQotc3RhdGljIHN0cnVjdCBiaW5fYXR0cmlidXRlIHB5cmFfcHJvZmlsZTJfc2V0dGluZ3NfYXR0ciA9IHsKKwkJLnJlYWQgPSBweXJhX3N5c2ZzX3JlYWRfcHJvZmlsZXhfc2V0dGluZ3MsCisJCS5wcml2YXRlID0gJnByb2ZpbGVfbnVtYmVyc1swXQorCX0sCisJewogCQkuYXR0ciA9IHsgLm5hbWUgPSAicHJvZmlsZTJfc2V0dGluZ3MiLCAubW9kZSA9IDA0NDAgfSwKIAkJLnNpemUgPSBzaXplb2Yoc3RydWN0IHB5cmFfcHJvZmlsZV9zZXR0aW5ncyksCi0JCS5yZWFkID0gcHlyYV9zeXNmc19yZWFkX3Byb2ZpbGUyX3NldHRpbmdzCi19OwotCi1zdGF0aWMgc3RydWN0IGJpbl9hdHRyaWJ1dGUgcHlyYV9wcm9maWxlM19zZXR0aW5nc19hdHRyID0geworCQkucmVhZCA9IHB5cmFfc3lzZnNfcmVhZF9wcm9maWxleF9zZXR0aW5ncywKKwkJLnByaXZhdGUgPSAmcHJvZmlsZV9udW1iZXJzWzFdCisJfSwKKwl7CiAJCS5hdHRyID0geyAubmFtZSA9ICJwcm9maWxlM19zZXR0aW5ncyIsIC5tb2RlID0gMDQ0MCB9LAogCQkuc2l6ZSA9IHNpemVvZihzdHJ1Y3QgcHlyYV9wcm9maWxlX3NldHRpbmdzKSwKLQkJLnJlYWQgPSBweXJhX3N5c2ZzX3JlYWRfcHJvZmlsZTNfc2V0dGluZ3MKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSBweXJhX3Byb2ZpbGU0X3NldHRpbmdzX2F0dHIgPSB7CisJCS5yZWFkID0gcHlyYV9zeXNmc19yZWFkX3Byb2ZpbGV4X3NldHRpbmdzLAorCQkucHJpdmF0ZSA9ICZwcm9maWxlX251bWJlcnNbMl0KKwl9LAorCXsKIAkJLmF0dHIgPSB7IC5uYW1lID0gInByb2ZpbGU0X3NldHRpbmdzIiwgLm1vZGUgPSAwNDQwIH0sCiAJCS5zaXplID0gc2l6ZW9mKHN0cnVjdCBweXJhX3Byb2ZpbGVfc2V0dGluZ3MpLAotCQkucmVhZCA9IHB5cmFfc3lzZnNfcmVhZF9wcm9maWxlNF9zZXR0aW5ncwotfTsKLQotc3RhdGljIHN0cnVjdCBiaW5fYXR0cmlidXRlIHB5cmFfcHJvZmlsZTVfc2V0dGluZ3NfYXR0ciA9IHsKKwkJLnJlYWQgPSBweXJhX3N5c2ZzX3JlYWRfcHJvZmlsZXhfc2V0dGluZ3MsCisJCS5wcml2YXRlID0gJnByb2ZpbGVfbnVtYmVyc1szXQorCX0sCisJewogCQkuYXR0ciA9IHsgLm5hbWUgPSAicHJvZmlsZTVfc2V0dGluZ3MiLCAubW9kZSA9IDA0NDAgfSwKIAkJLnNpemUgPSBzaXplb2Yoc3RydWN0IHB5cmFfcHJvZmlsZV9zZXR0aW5ncyksCi0JCS5yZWFkID0gcHlyYV9zeXNmc19yZWFkX3Byb2ZpbGU1X3NldHRpbmdzCi19OwotCi1zdGF0aWMgc3RydWN0IGJpbl9hdHRyaWJ1dGUgcHlyYV9wcm9maWxlX2J1dHRvbnNfYXR0ciA9IHsKKwkJLnJlYWQgPSBweXJhX3N5c2ZzX3JlYWRfcHJvZmlsZXhfc2V0dGluZ3MsCisJCS5wcml2YXRlID0gJnByb2ZpbGVfbnVtYmVyc1s0XQorCX0sCisJewogCQkuYXR0ciA9IHsgLm5hbWUgPSAicHJvZmlsZV9idXR0b25zIiwgLm1vZGUgPSAwMjIwIH0sCiAJCS5zaXplID0gc2l6ZW9mKHN0cnVjdCBweXJhX3Byb2ZpbGVfYnV0dG9ucyksCiAJCS53cml0ZSA9IHB5cmFfc3lzZnNfd3JpdGVfcHJvZmlsZV9idXR0b25zCi19OwotCi1zdGF0aWMgc3RydWN0IGJpbl9hdHRyaWJ1dGUgcHlyYV9wcm9maWxlMV9idXR0b25zX2F0dHIgPSB7CisJfSwKKwl7CiAJCS5hdHRyID0geyAubmFtZSA9ICJwcm9maWxlMV9idXR0b25zIiwgLm1vZGUgPSAwNDQwIH0sCiAJCS5zaXplID0gc2l6ZW9mKHN0cnVjdCBweXJhX3Byb2ZpbGVfYnV0dG9ucyksCi0JCS5yZWFkID0gcHlyYV9zeXNmc19yZWFkX3Byb2ZpbGUxX2J1dHRvbnMKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSBweXJhX3Byb2ZpbGUyX2J1dHRvbnNfYXR0ciA9IHsKKwkJLnJlYWQgPSBweXJhX3N5c2ZzX3JlYWRfcHJvZmlsZXhfYnV0dG9ucywKKwkJLnByaXZhdGUgPSAmcHJvZmlsZV9udW1iZXJzWzBdCisJfSwKKwl7CiAJCS5hdHRyID0geyAubmFtZSA9ICJwcm9maWxlMl9idXR0b25zIiwgLm1vZGUgPSAwNDQwIH0sCiAJCS5zaXplID0gc2l6ZW9mKHN0cnVjdCBweXJhX3Byb2ZpbGVfYnV0dG9ucyksCi0JCS5yZWFkID0gcHlyYV9zeXNmc19yZWFkX3Byb2ZpbGUyX2J1dHRvbnMKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSBweXJhX3Byb2ZpbGUzX2J1dHRvbnNfYXR0ciA9IHsKKwkJLnJlYWQgPSBweXJhX3N5c2ZzX3JlYWRfcHJvZmlsZXhfYnV0dG9ucywKKwkJLnByaXZhdGUgPSAmcHJvZmlsZV9udW1iZXJzWzFdCisJfSwKKwl7CiAJCS5hdHRyID0geyAubmFtZSA9ICJwcm9maWxlM19idXR0b25zIiwgLm1vZGUgPSAwNDQwIH0sCiAJCS5zaXplID0gc2l6ZW9mKHN0cnVjdCBweXJhX3Byb2ZpbGVfYnV0dG9ucyksCi0JCS5yZWFkID0gcHlyYV9zeXNmc19yZWFkX3Byb2ZpbGUzX2J1dHRvbnMKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSBweXJhX3Byb2ZpbGU0X2J1dHRvbnNfYXR0ciA9IHsKKwkJLnJlYWQgPSBweXJhX3N5c2ZzX3JlYWRfcHJvZmlsZXhfYnV0dG9ucywKKwkJLnByaXZhdGUgPSAmcHJvZmlsZV9udW1iZXJzWzJdCisJfSwKKwl7CiAJCS5hdHRyID0geyAubmFtZSA9ICJwcm9maWxlNF9idXR0b25zIiwgLm1vZGUgPSAwNDQwIH0sCiAJCS5zaXplID0gc2l6ZW9mKHN0cnVjdCBweXJhX3Byb2ZpbGVfYnV0dG9ucyksCi0JCS5yZWFkID0gcHlyYV9zeXNmc19yZWFkX3Byb2ZpbGU0X2J1dHRvbnMKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSBweXJhX3Byb2ZpbGU1X2J1dHRvbnNfYXR0ciA9IHsKKwkJLnJlYWQgPSBweXJhX3N5c2ZzX3JlYWRfcHJvZmlsZXhfYnV0dG9ucywKKwkJLnByaXZhdGUgPSAmcHJvZmlsZV9udW1iZXJzWzNdCisJfSwKKwl7CiAJCS5hdHRyID0geyAubmFtZSA9ICJwcm9maWxlNV9idXR0b25zIiwgLm1vZGUgPSAwNDQwIH0sCiAJCS5zaXplID0gc2l6ZW9mKHN0cnVjdCBweXJhX3Byb2ZpbGVfYnV0dG9ucyksCi0JCS5yZWFkID0gcHlyYV9zeXNmc19yZWFkX3Byb2ZpbGU1X2J1dHRvbnMKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSBweXJhX3NldHRpbmdzX2F0dHIgPSB7CisJCS5yZWFkID0gcHlyYV9zeXNmc19yZWFkX3Byb2ZpbGV4X2J1dHRvbnMsCisJCS5wcml2YXRlID0gJnByb2ZpbGVfbnVtYmVyc1s0XQorCX0sCisJewogCQkuYXR0ciA9IHsgLm5hbWUgPSAic2V0dGluZ3MiLCAubW9kZSA9IDA2NjAgfSwKIAkJLnNpemUgPSBzaXplb2Yoc3RydWN0IHB5cmFfc2V0dGluZ3MpLAogCQkucmVhZCA9IHB5cmFfc3lzZnNfcmVhZF9zZXR0aW5ncywKIAkJLndyaXRlID0gcHlyYV9zeXNmc193cml0ZV9zZXR0aW5ncworCX0sCisJX19BVFRSX05VTEwKIH07CiAKLXN0YXRpYyBpbnQgcHlyYV9jcmVhdGVfc3lzZnNfYXR0cmlidXRlcyhzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKLXsKLQlpbnQgcmV0dmFsOwotCi0JcmV0dmFsID0gc3lzZnNfY3JlYXRlX2dyb3VwKCZpbnRmLT5kZXYua29iaiwgJnB5cmFfYXR0cmlidXRlX2dyb3VwKTsKLQlpZiAocmV0dmFsKQotCQlnb3RvIGV4aXRfMTsKLQotCXJldHZhbCA9IHN5c2ZzX2NyZWF0ZV9iaW5fZmlsZSgmaW50Zi0+ZGV2LmtvYmosCi0JCQkmcHlyYV9wcm9maWxlX3NldHRpbmdzX2F0dHIpOwotCWlmIChyZXR2YWwpCi0JCWdvdG8gZXhpdF8yOwotCi0JcmV0dmFsID0gc3lzZnNfY3JlYXRlX2Jpbl9maWxlKCZpbnRmLT5kZXYua29iaiwKLQkJCSZweXJhX3Byb2ZpbGUxX3NldHRpbmdzX2F0dHIpOwotCWlmIChyZXR2YWwpCi0JCWdvdG8gZXhpdF8zOwotCi0JcmV0dmFsID0gc3lzZnNfY3JlYXRlX2Jpbl9maWxlKCZpbnRmLT5kZXYua29iaiwKLQkJCSZweXJhX3Byb2ZpbGUyX3NldHRpbmdzX2F0dHIpOwotCWlmIChyZXR2YWwpCi0JCWdvdG8gZXhpdF80OwotCi0JcmV0dmFsID0gc3lzZnNfY3JlYXRlX2Jpbl9maWxlKCZpbnRmLT5kZXYua29iaiwKLQkJCSZweXJhX3Byb2ZpbGUzX3NldHRpbmdzX2F0dHIpOwotCWlmIChyZXR2YWwpCi0JCWdvdG8gZXhpdF81OwotCi0JcmV0dmFsID0gc3lzZnNfY3JlYXRlX2Jpbl9maWxlKCZpbnRmLT5kZXYua29iaiwKLQkJCSZweXJhX3Byb2ZpbGU0X3NldHRpbmdzX2F0dHIpOwotCWlmIChyZXR2YWwpCi0JCWdvdG8gZXhpdF82OwotCi0JcmV0dmFsID0gc3lzZnNfY3JlYXRlX2Jpbl9maWxlKCZpbnRmLT5kZXYua29iaiwKLQkJCSZweXJhX3Byb2ZpbGU1X3NldHRpbmdzX2F0dHIpOwotCWlmIChyZXR2YWwpCi0JCWdvdG8gZXhpdF83OwotCi0JcmV0dmFsID0gc3lzZnNfY3JlYXRlX2Jpbl9maWxlKCZpbnRmLT5kZXYua29iaiwKLQkJCSZweXJhX3Byb2ZpbGVfYnV0dG9uc19hdHRyKTsKLQlpZiAocmV0dmFsKQotCQlnb3RvIGV4aXRfODsKLQotCXJldHZhbCA9IHN5c2ZzX2NyZWF0ZV9iaW5fZmlsZSgmaW50Zi0+ZGV2LmtvYmosCi0JCQkmcHlyYV9wcm9maWxlMV9idXR0b25zX2F0dHIpOwotCWlmIChyZXR2YWwpCi0JCWdvdG8gZXhpdF85OwotCi0JcmV0dmFsID0gc3lzZnNfY3JlYXRlX2Jpbl9maWxlKCZpbnRmLT5kZXYua29iaiwKLQkJCSZweXJhX3Byb2ZpbGUyX2J1dHRvbnNfYXR0cik7Ci0JaWYgKHJldHZhbCkKLQkJZ290byBleGl0XzEwOwotCi0JcmV0dmFsID0gc3lzZnNfY3JlYXRlX2Jpbl9maWxlKCZpbnRmLT5kZXYua29iaiwKLQkJCSZweXJhX3Byb2ZpbGUzX2J1dHRvbnNfYXR0cik7Ci0JaWYgKHJldHZhbCkKLQkJZ290byBleGl0XzExOwotCi0JcmV0dmFsID0gc3lzZnNfY3JlYXRlX2Jpbl9maWxlKCZpbnRmLT5kZXYua29iaiwKLQkJCSZweXJhX3Byb2ZpbGU0X2J1dHRvbnNfYXR0cik7Ci0JaWYgKHJldHZhbCkKLQkJZ290byBleGl0XzEyOwotCi0JcmV0dmFsID0gc3lzZnNfY3JlYXRlX2Jpbl9maWxlKCZpbnRmLT5kZXYua29iaiwKLQkJCSZweXJhX3Byb2ZpbGU1X2J1dHRvbnNfYXR0cik7Ci0JaWYgKHJldHZhbCkKLQkJZ290byBleGl0XzEzOwotCi0JcmV0dmFsID0gc3lzZnNfY3JlYXRlX2Jpbl9maWxlKCZpbnRmLT5kZXYua29iaiwKLQkJCSZweXJhX3NldHRpbmdzX2F0dHIpOwotCWlmIChyZXR2YWwpCi0JCWdvdG8gZXhpdF8xNDsKLQotCXJldHVybiAwOwotCi1leGl0XzE0OgotCXN5c2ZzX3JlbW92ZV9iaW5fZmlsZSgmaW50Zi0+ZGV2LmtvYmosICZweXJhX3Byb2ZpbGU1X2J1dHRvbnNfYXR0cik7Ci1leGl0XzEzOgotCXN5c2ZzX3JlbW92ZV9iaW5fZmlsZSgmaW50Zi0+ZGV2LmtvYmosICZweXJhX3Byb2ZpbGU0X2J1dHRvbnNfYXR0cik7Ci1leGl0XzEyOgotCXN5c2ZzX3JlbW92ZV9iaW5fZmlsZSgmaW50Zi0+ZGV2LmtvYmosICZweXJhX3Byb2ZpbGUzX2J1dHRvbnNfYXR0cik7Ci1leGl0XzExOgotCXN5c2ZzX3JlbW92ZV9iaW5fZmlsZSgmaW50Zi0+ZGV2LmtvYmosICZweXJhX3Byb2ZpbGUyX2J1dHRvbnNfYXR0cik7Ci1leGl0XzEwOgotCXN5c2ZzX3JlbW92ZV9iaW5fZmlsZSgmaW50Zi0+ZGV2LmtvYmosICZweXJhX3Byb2ZpbGUxX2J1dHRvbnNfYXR0cik7Ci1leGl0Xzk6Ci0Jc3lzZnNfcmVtb3ZlX2Jpbl9maWxlKCZpbnRmLT5kZXYua29iaiwgJnB5cmFfcHJvZmlsZV9idXR0b25zX2F0dHIpOwotZXhpdF84OgotCXN5c2ZzX3JlbW92ZV9iaW5fZmlsZSgmaW50Zi0+ZGV2LmtvYmosICZweXJhX3Byb2ZpbGU1X3NldHRpbmdzX2F0dHIpOwotZXhpdF83OgotCXN5c2ZzX3JlbW92ZV9iaW5fZmlsZSgmaW50Zi0+ZGV2LmtvYmosICZweXJhX3Byb2ZpbGU0X3NldHRpbmdzX2F0dHIpOwotZXhpdF82OgotCXN5c2ZzX3JlbW92ZV9iaW5fZmlsZSgmaW50Zi0+ZGV2LmtvYmosICZweXJhX3Byb2ZpbGUzX3NldHRpbmdzX2F0dHIpOwotZXhpdF81OgotCXN5c2ZzX3JlbW92ZV9iaW5fZmlsZSgmaW50Zi0+ZGV2LmtvYmosICZweXJhX3Byb2ZpbGUyX3NldHRpbmdzX2F0dHIpOwotZXhpdF80OgotCXN5c2ZzX3JlbW92ZV9iaW5fZmlsZSgmaW50Zi0+ZGV2LmtvYmosICZweXJhX3Byb2ZpbGUxX3NldHRpbmdzX2F0dHIpOwotZXhpdF8zOgotCXN5c2ZzX3JlbW92ZV9iaW5fZmlsZSgmaW50Zi0+ZGV2LmtvYmosICZweXJhX3Byb2ZpbGVfc2V0dGluZ3NfYXR0cik7Ci1leGl0XzI6Ci0Jc3lzZnNfcmVtb3ZlX2dyb3VwKCZpbnRmLT5kZXYua29iaiwgJnB5cmFfYXR0cmlidXRlX2dyb3VwKTsKLWV4aXRfMToKLQlyZXR1cm4gcmV0dmFsOwotfQotCi1zdGF0aWMgdm9pZCBweXJhX3JlbW92ZV9zeXNmc19hdHRyaWJ1dGVzKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQotewotCXN5c2ZzX3JlbW92ZV9iaW5fZmlsZSgmaW50Zi0+ZGV2LmtvYmosICZweXJhX3NldHRpbmdzX2F0dHIpOwotCXN5c2ZzX3JlbW92ZV9iaW5fZmlsZSgmaW50Zi0+ZGV2LmtvYmosICZweXJhX3Byb2ZpbGU1X2J1dHRvbnNfYXR0cik7Ci0Jc3lzZnNfcmVtb3ZlX2Jpbl9maWxlKCZpbnRmLT5kZXYua29iaiwgJnB5cmFfcHJvZmlsZTRfYnV0dG9uc19hdHRyKTsKLQlzeXNmc19yZW1vdmVfYmluX2ZpbGUoJmludGYtPmRldi5rb2JqLCAmcHlyYV9wcm9maWxlM19idXR0b25zX2F0dHIpOwotCXN5c2ZzX3JlbW92ZV9iaW5fZmlsZSgmaW50Zi0+ZGV2LmtvYmosICZweXJhX3Byb2ZpbGUyX2J1dHRvbnNfYXR0cik7Ci0Jc3lzZnNfcmVtb3ZlX2Jpbl9maWxlKCZpbnRmLT5kZXYua29iaiwgJnB5cmFfcHJvZmlsZTFfYnV0dG9uc19hdHRyKTsKLQlzeXNmc19yZW1vdmVfYmluX2ZpbGUoJmludGYtPmRldi5rb2JqLCAmcHlyYV9wcm9maWxlX2J1dHRvbnNfYXR0cik7Ci0Jc3lzZnNfcmVtb3ZlX2Jpbl9maWxlKCZpbnRmLT5kZXYua29iaiwgJnB5cmFfcHJvZmlsZTVfc2V0dGluZ3NfYXR0cik7Ci0Jc3lzZnNfcmVtb3ZlX2Jpbl9maWxlKCZpbnRmLT5kZXYua29iaiwgJnB5cmFfcHJvZmlsZTRfc2V0dGluZ3NfYXR0cik7Ci0Jc3lzZnNfcmVtb3ZlX2Jpbl9maWxlKCZpbnRmLT5kZXYua29iaiwgJnB5cmFfcHJvZmlsZTNfc2V0dGluZ3NfYXR0cik7Ci0Jc3lzZnNfcmVtb3ZlX2Jpbl9maWxlKCZpbnRmLT5kZXYua29iaiwgJnB5cmFfcHJvZmlsZTJfc2V0dGluZ3NfYXR0cik7Ci0Jc3lzZnNfcmVtb3ZlX2Jpbl9maWxlKCZpbnRmLT5kZXYua29iaiwgJnB5cmFfcHJvZmlsZTFfc2V0dGluZ3NfYXR0cik7Ci0Jc3lzZnNfcmVtb3ZlX2Jpbl9maWxlKCZpbnRmLT5kZXYua29iaiwgJnB5cmFfcHJvZmlsZV9zZXR0aW5nc19hdHRyKTsKLQlzeXNmc19yZW1vdmVfZ3JvdXAoJmludGYtPmRldi5rb2JqLCAmcHlyYV9hdHRyaWJ1dGVfZ3JvdXApOwotfQotCiBzdGF0aWMgaW50IHB5cmFfaW5pdF9weXJhX2RldmljZV9zdHJ1Y3Qoc3RydWN0IHVzYl9kZXZpY2UgKnVzYl9kZXYsCiAJCXN0cnVjdCBweXJhX2RldmljZSAqcHlyYSkKIHsKQEAgLTc3MCwzMSArNTcwLDI0IEBACiAKIAkJcHlyYSA9IGt6YWxsb2Moc2l6ZW9mKCpweXJhKSwgR0ZQX0tFUk5FTCk7CiAJCWlmICghcHlyYSkgewotCQkJZGV2X2VycigmaGRldi0+ZGV2LCAiY2FuJ3QgYWxsb2MgZGV2aWNlIGRlc2NyaXB0b3JcbiIpOworCQkJaGlkX2VycihoZGV2LCAiY2FuJ3QgYWxsb2MgZGV2aWNlIGRlc2NyaXB0b3JcbiIpOwogCQkJcmV0dXJuIC1FTk9NRU07CiAJCX0KIAkJaGlkX3NldF9kcnZkYXRhKGhkZXYsIHB5cmEpOwogCiAJCXJldHZhbCA9IHB5cmFfaW5pdF9weXJhX2RldmljZV9zdHJ1Y3QodXNiX2RldiwgcHlyYSk7CiAJCWlmIChyZXR2YWwpIHsKLQkJCWRldl9lcnIoJmhkZXYtPmRldiwKLQkJCQkJImNvdWxkbid0IGluaXQgc3RydWN0IHB5cmFfZGV2aWNlXG4iKTsKKwkJCWhpZF9lcnIoaGRldiwgImNvdWxkbid0IGluaXQgc3RydWN0IHB5cmFfZGV2aWNlXG4iKTsKIAkJCWdvdG8gZXhpdF9mcmVlOwogCQl9CiAKLQkJcmV0dmFsID0gcm9jY2F0X2Nvbm5lY3QoaGRldik7CisJCXJldHZhbCA9IHJvY2NhdF9jb25uZWN0KHB5cmFfY2xhc3MsIGhkZXYpOwogCQlpZiAocmV0dmFsIDwgMCkgewotCQkJZGV2X2VycigmaGRldi0+ZGV2LCAiY291bGRuJ3QgaW5pdCBjaGFyIGRldlxuIik7CisJCQloaWRfZXJyKGhkZXYsICJjb3VsZG4ndCBpbml0IGNoYXIgZGV2XG4iKTsKIAkJfSBlbHNlIHsKIAkJCXB5cmEtPmNocmRldl9taW5vciA9IHJldHZhbDsKIAkJCXB5cmEtPnJvY2NhdF9jbGFpbWVkID0gMTsKIAkJfQotCi0JCXJldHZhbCA9IHB5cmFfY3JlYXRlX3N5c2ZzX2F0dHJpYnV0ZXMoaW50Zik7Ci0JCWlmIChyZXR2YWwpIHsKLQkJCWRldl9lcnIoJmhkZXYtPmRldiwgImNhbm5vdCBjcmVhdGUgc3lzZnMgZmlsZXNcbiIpOwotCQkJZ290byBleGl0X2ZyZWU7Ci0JCX0KIAl9IGVsc2UgewogCQloaWRfc2V0X2RydmRhdGEoaGRldiwgTlVMTCk7CiAJfQpAQCAtODEyLDcgKzYwNSw2IEBACiAKIAlpZiAoaW50Zi0+Y3VyX2FsdHNldHRpbmctPmRlc2MuYkludGVyZmFjZVByb3RvY29sCiAJCQk9PSBVU0JfSU5URVJGQUNFX1BST1RPQ09MX01PVVNFKSB7Ci0JCXB5cmFfcmVtb3ZlX3N5c2ZzX2F0dHJpYnV0ZXMoaW50Zik7CiAJCXB5cmEgPSBoaWRfZ2V0X2RydmRhdGEoaGRldik7CiAJCWlmIChweXJhLT5yb2NjYXRfY2xhaW1lZCkKIAkJCXJvY2NhdF9kaXNjb25uZWN0KHB5cmEtPmNocmRldl9taW5vcik7CkBAIC04MjYsMTkgKzYxOCwxOSBAQAogCiAJcmV0dmFsID0gaGlkX3BhcnNlKGhkZXYpOwogCWlmIChyZXR2YWwpIHsKLQkJZGV2X2VycigmaGRldi0+ZGV2LCAicGFyc2UgZmFpbGVkXG4iKTsKKwkJaGlkX2VycihoZGV2LCAicGFyc2UgZmFpbGVkXG4iKTsKIAkJZ290byBleGl0OwogCX0KIAogCXJldHZhbCA9IGhpZF9od19zdGFydChoZGV2LCBISURfQ09OTkVDVF9ERUZBVUxUKTsKIAlpZiAocmV0dmFsKSB7Ci0JCWRldl9lcnIoJmhkZXYtPmRldiwgImh3IHN0YXJ0IGZhaWxlZFxuIik7CisJCWhpZF9lcnIoaGRldiwgImh3IHN0YXJ0IGZhaWxlZFxuIik7CiAJCWdvdG8gZXhpdDsKIAl9CiAKIAlyZXR2YWwgPSBweXJhX2luaXRfc3BlY2lhbHMoaGRldik7CiAJaWYgKHJldHZhbCkgewotCQlkZXZfZXJyKCZoZGV2LT5kZXYsICJjb3VsZG4ndCBpbnN0YWxsIG1vdXNlXG4iKTsKKwkJaGlkX2VycihoZGV2LCAiY291bGRuJ3QgaW5zdGFsbCBtb3VzZVxuIik7CiAJCWdvdG8gZXhpdF9zdG9wOwogCX0KIAlyZXR1cm4gMDsKQEAgLTk1MiwxMSArNzQ0LDI0IEBACiAKIHN0YXRpYyBpbnQgX19pbml0IHB5cmFfaW5pdCh2b2lkKQogewotCXJldHVybiBoaWRfcmVnaXN0ZXJfZHJpdmVyKCZweXJhX2RyaXZlcik7CisJaW50IHJldHZhbDsKKworCS8qIGNsYXNzIG5hbWUgaGFzIHRvIGJlIHNhbWUgYXMgZHJpdmVyIG5hbWUgKi8KKwlweXJhX2NsYXNzID0gY2xhc3NfY3JlYXRlKFRISVNfTU9EVUxFLCAicHlyYSIpOworCWlmIChJU19FUlIocHlyYV9jbGFzcykpCisJCXJldHVybiBQVFJfRVJSKHB5cmFfY2xhc3MpOworCXB5cmFfY2xhc3MtPmRldl9hdHRycyA9IHB5cmFfYXR0cmlidXRlczsKKwlweXJhX2NsYXNzLT5kZXZfYmluX2F0dHJzID0gcHlyYV9iaW5fYXR0cmlidXRlczsKKworCXJldHZhbCA9IGhpZF9yZWdpc3Rlcl9kcml2ZXIoJnB5cmFfZHJpdmVyKTsKKwlpZiAocmV0dmFsKQorCQljbGFzc19kZXN0cm95KHB5cmFfY2xhc3MpOworCXJldHVybiByZXR2YWw7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBweXJhX2V4aXQodm9pZCkKIHsKKwljbGFzc19kZXN0cm95KHB5cmFfY2xhc3MpOwogCWhpZF91bnJlZ2lzdGVyX2RyaXZlcigmcHlyYV9kcml2ZXIpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC9oaWQtcm9jY2F0LXB5cmEuaCBiL2RyaXZlcnMvaGlkL2hpZC1yb2NjYXQtcHlyYS5oCmluZGV4IDIyZjgwYTguLjE0Y2JiZTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaGlkL2hpZC1yb2NjYXQtcHlyYS5oCisrKyBiL2RyaXZlcnMvaGlkL2hpZC1yb2NjYXQtcHlyYS5oCkBAIC0xNCwxNCArMTQsMTEgQEAKIAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAKLSNwcmFnbWEgcGFjayhwdXNoKQotI3ByYWdtYSBwYWNrKDEpCi0KIHN0cnVjdCBweXJhX2IgewogCXVpbnQ4X3QgY29tbWFuZDsgLyogUFlSQV9DT01NQU5EX0IgKi8KIAl1aW50OF90IHNpemU7IC8qIGFsd2F5cyAzICovCiAJdWludDhfdCB1bmtub3duOyAvKiAxICovCi19OworfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpOwogCiBzdHJ1Y3QgcHlyYV9jb250cm9sIHsKIAl1aW50OF90IGNvbW1hbmQ7IC8qIFBZUkFfQ09NTUFORF9DT05UUk9MICovCkBAIC0zMSw3ICsyOCw3IEBACiAJICovCiAJdWludDhfdCB2YWx1ZTsgLyogUmFuZ2UgMC00ICovCiAJdWludDhfdCByZXF1ZXN0OwotfTsKK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKTsKIAogZW51bSBweXJhX2NvbnRyb2xfcmVxdWVzdHMgewogCVBZUkFfQ09OVFJPTF9SRVFVRVNUX1NUQVRVUyA9IDB4MDAsCkBAIC00Myw3ICs0MCw3IEBACiAJdWludDhfdCBjb21tYW5kOyAvKiBQWVJBX0NPTU1BTkRfU0VUVElOR1MgKi8KIAl1aW50OF90IHNpemU7IC8qIGFsd2F5cyAzICovCiAJdWludDhfdCBzdGFydHVwX3Byb2ZpbGU7IC8qIFJhbmdlIDAtNCEgKi8KLX07Cit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSk7CiAKIHN0cnVjdCBweXJhX3Byb2ZpbGVfc2V0dGluZ3MgewogCXVpbnQ4X3QgY29tbWFuZDsgLyogUFlSQV9DT01NQU5EX1BST0ZJTEVfU0VUVElOR1MgKi8KQEAgLTU4LDcgKzU1LDcgQEAKIAl1aW50OF90IGxpZ2h0X2VmZmVjdDsKIAl1aW50OF90IGhhbmRlZG5lc3M7CiAJdWludDE2X3QgY2hlY2tzdW07IC8qIGJ5dGUgc3VtICovCi19OworfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpOwogCiBzdHJ1Y3QgcHlyYV9wcm9maWxlX2J1dHRvbnMgewogCXVpbnQ4X3QgY29tbWFuZDsgLyogUFlSQV9DT01NQU5EX1BST0ZJTEVfQlVUVE9OUyAqLwpAQCAtNjYsNyArNjMsNyBAQAogCXVpbnQ4X3QgbnVtYmVyOyAvKiBSYW5nZSAwLTQgKi8KIAl1aW50OF90IGJ1dHRvbnNbMTRdOwogCXVpbnQxNl90IGNoZWNrc3VtOyAvKiBieXRlIHN1bSAqLwotfTsKK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKTsKIAogc3RydWN0IHB5cmFfaW5mbyB7CiAJdWludDhfdCBjb21tYW5kOyAvKiBQWVJBX0NPTU1BTkRfSU5GTyAqLwpAQCAtNzUsNyArNzIsNyBAQAogCXVpbnQ4X3QgdW5rbm93bjE7IC8qIGFsd2F5cyAwICovCiAJdWludDhfdCB1bmtub3duMjsgLyogYWx3YXlzIDEgKi8KIAl1aW50OF90IHVua25vd24zOyAvKiBhbHdheXMgMCAqLwotfTsKK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKTsKIAogZW51bSBweXJhX2NvbW1hbmRzIHsKIAlQWVJBX0NPTU1BTkRfQ09OVFJPTCA9IDB4NCwKQEAgLTEwNywxMyArMTA0LDEzIEBACiAJdWludDhfdCB0eXBlOwogCXVpbnQ4X3QgZGF0YTE7CiAJdWludDhfdCBkYXRhMjsKLX07Cit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSk7CiAKIHN0cnVjdCBweXJhX21vdXNlX2V2ZW50X2F1ZGlvIHsKIAl1aW50OF90IHJlcG9ydF9udW1iZXI7IC8qIGFsd2F5cyAyICovCiAJdWludDhfdCB0eXBlOwogCXVpbnQ4X3QgdW51c2VkOyAvKiBhbHdheXMgMCAqLwotfTsKK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKTsKIAogLyogaGlkIGF1ZGlvIGNvbnRyb2xzICovCiBlbnVtIHB5cmFfbW91c2VfZXZlbnRfYXVkaW9fdHlwZXMgewpAQCAtMTY3LDkgKzE2NCw3IEBACiAJdWludDhfdCB0eXBlOwogCXVpbnQ4X3QgdmFsdWU7CiAJdWludDhfdCBrZXk7Ci19OwotCi0jcHJhZ21hIHBhY2socG9wKQorfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpOwogCiBzdHJ1Y3QgcHlyYV9kZXZpY2UgewogCWludCBhY3R1YWxfcHJvZmlsZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL2hpZC1yb2NjYXQuYyBiL2RyaXZlcnMvaGlkL2hpZC1yb2NjYXQuYwppbmRleCA1YTY4NzllMjMuLmExNGM1NzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaGlkL2hpZC1yb2NjYXQuYworKysgYi9kcml2ZXJzL2hpZC9oaWQtcm9jY2F0LmMKQEAgLTIxLDYgKzIxLDggQEAKICAqIEl0IGlzIGluc3BpcmVkIGJ5IGhpZHJhdywgYnV0IHVzZXMgb25seSBvbmUgY2lyY3VsYXIgYnVmZmVyIGZvciBhbGwgcmVhZGVycy4KICAqLwogCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisKICNpbmNsdWRlIDxsaW51eC9jZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvcG9sbC5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CkBAIC02NSw3ICs2Nyw2IEBACiB9OwogCiBzdGF0aWMgaW50IHJvY2NhdF9tYWpvcjsKLXN0YXRpYyBzdHJ1Y3QgY2xhc3MgKnJvY2NhdF9jbGFzczsKIHN0YXRpYyBzdHJ1Y3QgY2RldiByb2NjYXRfY2RldjsKIAogc3RhdGljIHN0cnVjdCByb2NjYXRfZGV2aWNlICpkZXZpY2VzW1JPQ0NBVF9NQVhfREVWSUNFU107CkBAIC0xNjUsMjcgKzE2NiwyMiBAQAogCW11dGV4X2xvY2soJmRldmljZS0+cmVhZGVyc19sb2NrKTsKIAogCWlmICghZGV2aWNlKSB7Ci0JCXByaW50ayhLRVJOX0VNRVJHICJyb2NjYXQgZGV2aWNlIHdpdGggbWlub3IgJWQgZG9lc24ndCBleGlzdFxuIiwKLQkJCQltaW5vcik7CisJCXByX2VtZXJnKCJyb2NjYXQgZGV2aWNlIHdpdGggbWlub3IgJWQgZG9lc24ndCBleGlzdFxuIiwgbWlub3IpOwogCQllcnJvciA9IC1FTk9ERVY7CiAJCWdvdG8gZXhpdF9lcnI7CiAJfQogCiAJaWYgKCFkZXZpY2UtPm9wZW4rKykgewogCQkvKiBwb3dlciBvbiBkZXZpY2Ugb24gYWRkaW5nIGZpcnN0IHJlYWRlciAqLwotCQlpZiAoZGV2aWNlLT5oaWQtPmxsX2RyaXZlci0+cG93ZXIpIHsKLQkJCWVycm9yID0gZGV2aWNlLT5oaWQtPmxsX2RyaXZlci0+cG93ZXIoZGV2aWNlLT5oaWQsCi0JCQkJCVBNX0hJTlRfRlVMTE9OKTsKLQkJCWlmIChlcnJvciA8IDApIHsKLQkJCQktLWRldmljZS0+b3BlbjsKLQkJCQlnb3RvIGV4aXRfZXJyOwotCQkJfQotCQl9Ci0JCWVycm9yID0gZGV2aWNlLT5oaWQtPmxsX2RyaXZlci0+b3BlbihkZXZpY2UtPmhpZCk7CisJCWVycm9yID0gaGlkX2h3X3Bvd2VyKGRldmljZS0+aGlkLCBQTV9ISU5UX0ZVTExPTik7CiAJCWlmIChlcnJvciA8IDApIHsKLQkJCWlmIChkZXZpY2UtPmhpZC0+bGxfZHJpdmVyLT5wb3dlcikKLQkJCQlkZXZpY2UtPmhpZC0+bGxfZHJpdmVyLT5wb3dlcihkZXZpY2UtPmhpZCwKLQkJCQkJCVBNX0hJTlRfTk9STUFMKTsKKwkJCS0tZGV2aWNlLT5vcGVuOworCQkJZ290byBleGl0X2VycjsKKwkJfQorCisJCWVycm9yID0gaGlkX2h3X29wZW4oZGV2aWNlLT5oaWQpOworCQlpZiAoZXJyb3IgPCAwKSB7CisJCQloaWRfaHdfcG93ZXIoZGV2aWNlLT5oaWQsIFBNX0hJTlRfTk9STUFMKTsKIAkJCS0tZGV2aWNlLT5vcGVuOwogCQkJZ290byBleGl0X2VycjsKIAkJfQpAQCAtMjE4LDggKzIxNCw3IEBACiAJZGV2aWNlID0gZGV2aWNlc1ttaW5vcl07CiAJaWYgKCFkZXZpY2UpIHsKIAkJbXV0ZXhfdW5sb2NrKCZkZXZpY2VzX2xvY2spOwotCQlwcmludGsoS0VSTl9FTUVSRyAicm9jY2F0IGRldmljZSB3aXRoIG1pbm9yICVkIGRvZXNuJ3QgZXhpc3RcbiIsCi0JCQkJbWlub3IpOworCQlwcl9lbWVyZygicm9jY2F0IGRldmljZSB3aXRoIG1pbm9yICVkIGRvZXNuJ3QgZXhpc3RcbiIsIG1pbm9yKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCkBAIC0yMzEsMTAgKzIyNiw4IEBACiAJaWYgKCEtLWRldmljZS0+b3BlbikgewogCQkvKiByZW1vdmluZyBsYXN0IHJlYWRlciAqLwogCQlpZiAoZGV2aWNlLT5leGlzdCkgewotCQkJaWYgKGRldmljZS0+aGlkLT5sbF9kcml2ZXItPnBvd2VyKQotCQkJCWRldmljZS0+aGlkLT5sbF9kcml2ZXItPnBvd2VyKGRldmljZS0+aGlkLAotCQkJCQkJUE1fSElOVF9OT1JNQUwpOwotCQkJZGV2aWNlLT5oaWQtPmxsX2RyaXZlci0+Y2xvc2UoZGV2aWNlLT5oaWQpOworCQkJaGlkX2h3X3Bvd2VyKGRldmljZS0+aGlkLCBQTV9ISU5UX05PUk1BTCk7CisJCQloaWRfaHdfY2xvc2UoZGV2aWNlLT5oaWQpOwogCQl9IGVsc2UgewogCQkJa2ZyZWUoZGV2aWNlKTsKIAkJfQpAQCAtMjk1LDEyICsyODgsMTQgQEAKIAogLyoKICAqIHJvY2NhdF9jb25uZWN0KCkgLSBjcmVhdGUgYSBjaGFyIGRldmljZSBmb3Igc3BlY2lhbCBldmVudCBvdXRwdXQKKyAqIEBjbGFzczogdGhlIGNsYXNzIHRoYXRzIHVzZWQgdG8gY3JlYXRlIHRoZSBkZXZpY2UuIE1lYW50IHRvIGhvbGQgZGV2aWNlCisgKiBzcGVjaWZpYyBzeXNmcyBhdHRyaWJ1dGVzLgogICogQGhpZDogdGhlIGhpZCBkZXZpY2UgdGhlIGNoYXIgZGV2aWNlIHNob3VsZCBiZSBjb25uZWN0ZWQgdG8uCiAgKgogICogUmV0dXJuIHZhbHVlIGlzIG1pbm9yIGRldmljZSBudW1iZXIgaW4gUmFuZ2UgWzAsIFJPQ0NBVF9NQVhfREVWSUNFU10gb24KICAqIHN1Y2Nlc3MsIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLgogICovCi1pbnQgcm9jY2F0X2Nvbm5lY3Qoc3RydWN0IGhpZF9kZXZpY2UgKmhpZCkKK2ludCByb2NjYXRfY29ubmVjdChzdHJ1Y3QgY2xhc3MgKmtsYXNzLCBzdHJ1Y3QgaGlkX2RldmljZSAqaGlkKQogewogCXVuc2lnbmVkIGludCBtaW5vcjsKIAlzdHJ1Y3Qgcm9jY2F0X2RldmljZSAqZGV2aWNlOwpAQCAtMzI2LDcgKzMyMSw3IEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCWRldmljZS0+ZGV2ID0gZGV2aWNlX2NyZWF0ZShyb2NjYXRfY2xhc3MsICZoaWQtPmRldiwKKwlkZXZpY2UtPmRldiA9IGRldmljZV9jcmVhdGUoa2xhc3MsICZoaWQtPmRldiwKIAkJCU1LREVWKHJvY2NhdF9tYWpvciwgbWlub3IpLCBOVUxMLAogCQkJIiVzJXMlZCIsICJyb2NjYXQiLCBoaWQtPmRyaXZlci0+bmFtZSwgbWlub3IpOwogCkBAIC0zNjcsMTAgKzM2MiwxMCBAQAogCiAJZGV2aWNlLT5leGlzdCA9IDA7IC8qIFRPRE8gZXhpc3QgbWF5YmUgbm90IG5lZWRlZCAqLwogCi0JZGV2aWNlX2Rlc3Ryb3kocm9jY2F0X2NsYXNzLCBNS0RFVihyb2NjYXRfbWFqb3IsIG1pbm9yKSk7CisJZGV2aWNlX2Rlc3Ryb3koZGV2aWNlLT5kZXYtPmNsYXNzLCBNS0RFVihyb2NjYXRfbWFqb3IsIG1pbm9yKSk7CiAKIAlpZiAoZGV2aWNlLT5vcGVuKSB7Ci0JCWRldmljZS0+aGlkLT5sbF9kcml2ZXItPmNsb3NlKGRldmljZS0+aGlkKTsKKwkJaGlkX2h3X2Nsb3NlKGRldmljZS0+aGlkKTsKIAkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZkZXZpY2UtPndhaXQpOwogCX0gZWxzZSB7CiAJCWtmcmVlKGRldmljZSk7CkBAIC0zOTgsMTQgKzM5Myw3IEBACiAJcm9jY2F0X21ham9yID0gTUFKT1IoZGV2X2lkKTsKIAogCWlmIChyZXR2YWwgPCAwKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgInJvY2NhdDogY2FuJ3QgZ2V0IG1ham9yIG51bWJlclxuIik7Ci0JCXJldHVybiByZXR2YWw7Ci0JfQotCi0Jcm9jY2F0X2NsYXNzID0gY2xhc3NfY3JlYXRlKFRISVNfTU9EVUxFLCAicm9jY2F0Iik7Ci0JaWYgKElTX0VSUihyb2NjYXRfY2xhc3MpKSB7Ci0JCXJldHZhbCA9IFBUUl9FUlIocm9jY2F0X2NsYXNzKTsKLQkJdW5yZWdpc3Rlcl9jaHJkZXZfcmVnaW9uKGRldl9pZCwgUk9DQ0FUX01BWF9ERVZJQ0VTKTsKKwkJcHJfd2FybigiY2FuJ3QgZ2V0IG1ham9yIG51bWJlclxuIik7CiAJCXJldHVybiByZXR2YWw7CiAJfQogCkBAIC00MjAsNyArNDA4LDYgQEAKIAlkZXZfdCBkZXZfaWQgPSBNS0RFVihyb2NjYXRfbWFqb3IsIDApOwogCiAJY2Rldl9kZWwoJnJvY2NhdF9jZGV2KTsKLQljbGFzc19kZXN0cm95KHJvY2NhdF9jbGFzcyk7CiAJdW5yZWdpc3Rlcl9jaHJkZXZfcmVnaW9uKGRldl9pZCwgUk9DQ0FUX01BWF9ERVZJQ0VTKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvaGlkLXJvY2NhdC5oIGIvZHJpdmVycy9oaWQvaGlkLXJvY2NhdC5oCmluZGV4IDA5ZTg2NGUuLjU3ODQyODEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaGlkL2hpZC1yb2NjYXQuaAorKysgYi9kcml2ZXJzL2hpZC9oaWQtcm9jY2F0LmgKQEAgLTE2LDExICsxNiwxMiBAQAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAKICNpZiBkZWZpbmVkKENPTkZJR19ISURfUk9DQ0FUKSB8fCBkZWZpbmVkKENPTkZJR19ISURfUk9DQ0FUX01PRFVMRSkKLWludCByb2NjYXRfY29ubmVjdChzdHJ1Y3QgaGlkX2RldmljZSAqaGlkKTsKK2ludCByb2NjYXRfY29ubmVjdChzdHJ1Y3QgY2xhc3MgKmtsYXNzLCBzdHJ1Y3QgaGlkX2RldmljZSAqaGlkKTsKIHZvaWQgcm9jY2F0X2Rpc2Nvbm5lY3QoaW50IG1pbm9yKTsKIGludCByb2NjYXRfcmVwb3J0X2V2ZW50KGludCBtaW5vciwgdTggY29uc3QgKmRhdGEsIGludCBsZW4pOwogI2Vsc2UKLXN0YXRpYyBpbmxpbmUgaW50IHJvY2NhdF9jb25uZWN0KHN0cnVjdCBoaWRfZGV2aWNlICpoaWQpIHsgcmV0dXJuIC0xOyB9CitzdGF0aWMgaW5saW5lIGludCByb2NjYXRfY29ubmVjdChzdHJ1Y3QgY2xhc3MgKmtsYXNzLAorCQlzdHJ1Y3QgaGlkX2RldmljZSAqaGlkKSB7IHJldHVybiAtMTsgfQogc3RhdGljIGlubGluZSB2b2lkIHJvY2NhdF9kaXNjb25uZWN0KGludCBtaW5vcikge30KIHN0YXRpYyBpbmxpbmUgaW50IHJvY2NhdF9yZXBvcnRfZXZlbnQoaW50IG1pbm9yLCB1OCBjb25zdCAqZGF0YSwgaW50IGxlbikKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL2hpZC1zYW1zdW5nLmMgYi9kcml2ZXJzL2hpZC9oaWQtc2Ftc3VuZy5jCmluZGV4IDM1ODk0NDQuLjNjMWZkOGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaGlkL2hpZC1zYW1zdW5nLmMKKysrIGIvZHJpdmVycy9oaWQvaGlkLXNhbXN1bmcuYwpAQCAtNTcsOCArNTcsOCBAQAogc3RhdGljIGlubGluZSB2b2lkIHNhbXN1bmdfaXJkYV9kZXZfdHJhY2Uoc3RydWN0IGhpZF9kZXZpY2UgKmhkZXYsCiAJCXVuc2lnbmVkIGludCByc2l6ZSkKIHsKLQlkZXZfaW5mbygmaGRldi0+ZGV2LCAiZml4aW5nIHVwIFNhbXN1bmcgSXJEQSAlZCBieXRlIHJlcG9ydCAiCi0JCQkiZGVzY3JpcHRvclxuIiwgcnNpemUpOworCWhpZF9pbmZvKGhkZXYsICJmaXhpbmcgdXAgU2Ftc3VuZyBJckRBICVkIGJ5dGUgcmVwb3J0IGRlc2NyaXB0b3JcbiIsCisJCSByc2l6ZSk7CiB9CiAKIHN0YXRpYyBfX3U4ICpzYW1zdW5nX2lyZGFfcmVwb3J0X2ZpeHVwKHN0cnVjdCBoaWRfZGV2aWNlICpoZGV2LCBfX3U4ICpyZGVzYywKQEAgLTE2MCw3ICsxNjAsNyBAQAogCiAJcmV0ID0gaGlkX3BhcnNlKGhkZXYpOwogCWlmIChyZXQpIHsKLQkJZGV2X2VycigmaGRldi0+ZGV2LCAicGFyc2UgZmFpbGVkXG4iKTsKKwkJaGlkX2VycihoZGV2LCAicGFyc2UgZmFpbGVkXG4iKTsKIAkJZ290byBlcnJfZnJlZTsKIAl9CiAKQEAgLTE3NCw3ICsxNzQsNyBAQAogCiAJcmV0ID0gaGlkX2h3X3N0YXJ0KGhkZXYsIGNtYXNrKTsKIAlpZiAocmV0KSB7Ci0JCWRldl9lcnIoJmhkZXYtPmRldiwgImh3IHN0YXJ0IGZhaWxlZFxuIik7CisJCWhpZF9lcnIoaGRldiwgImh3IHN0YXJ0IGZhaWxlZFxuIik7CiAJCWdvdG8gZXJyX2ZyZWU7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC9oaWQtc2pveS5jIGIvZHJpdmVycy9oaWQvaGlkLXNqb3kuYwppbmRleCBlMTBhNzY4Li4xNmY3Y2FmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC9oaWQtc2pveS5jCisrKyBiL2RyaXZlcnMvaGlkL2hpZC1zam95LmMKQEAgLTc0LDI2ICs3NCwyNSBAQAogCWludCBlcnJvcjsKIAogCWlmIChsaXN0X2VtcHR5KHJlcG9ydF9saXN0KSkgewotCQlkZXZfZXJyKCZoaWQtPmRldiwgIm5vIG91dHB1dCByZXBvcnRzIGZvdW5kXG4iKTsKKwkJaGlkX2VycihoaWQsICJubyBvdXRwdXQgcmVwb3J0cyBmb3VuZFxuIik7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIAogCXJlcG9ydF9wdHIgPSByZXBvcnRfcHRyLT5uZXh0OwogCiAJaWYgKHJlcG9ydF9wdHIgPT0gcmVwb3J0X2xpc3QpIHsKLQkJZGV2X2VycigmaGlkLT5kZXYsICJyZXF1aXJlZCBvdXRwdXQgcmVwb3J0IGlzICIKLQkJCQkibWlzc2luZ1xuIik7CisJCWhpZF9lcnIoaGlkLCAicmVxdWlyZWQgb3V0cHV0IHJlcG9ydCBpcyBtaXNzaW5nXG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCiAJcmVwb3J0ID0gbGlzdF9lbnRyeShyZXBvcnRfcHRyLCBzdHJ1Y3QgaGlkX3JlcG9ydCwgbGlzdCk7CiAJaWYgKHJlcG9ydC0+bWF4ZmllbGQgPCAxKSB7Ci0JCWRldl9lcnIoJmhpZC0+ZGV2LCAibm8gZmllbGRzIGluIHRoZSByZXBvcnRcbiIpOworCQloaWRfZXJyKGhpZCwgIm5vIGZpZWxkcyBpbiB0aGUgcmVwb3J0XG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCiAJaWYgKHJlcG9ydC0+ZmllbGRbMF0tPnJlcG9ydF9jb3VudCA8IDMpIHsKLQkJZGV2X2VycigmaGlkLT5kZXYsICJub3QgZW5vdWdoIHZhbHVlcyBpbiB0aGUgZmllbGRcbiIpOworCQloaWRfZXJyKGhpZCwgIm5vdCBlbm91Z2ggdmFsdWVzIGluIHRoZSBmaWVsZFxuIik7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIApAQCAtMTE3LDggKzExNiw3IEBACiAJc2pveWZmLT5yZXBvcnQtPmZpZWxkWzBdLT52YWx1ZVsyXSA9IDB4MDA7CiAJdXNiaGlkX3N1Ym1pdF9yZXBvcnQoaGlkLCBzam95ZmYtPnJlcG9ydCwgVVNCX0RJUl9PVVQpOwogCi0JZGV2X2luZm8oJmhpZC0+ZGV2LAotCQkiRm9yY2UgZmVlZGJhY2sgZm9yIFNtYXJ0Sm95IFBMVVMgUFMyL1VTQiBhZGFwdGVyXG4iKTsKKwloaWRfaW5mbyhoaWQsICJGb3JjZSBmZWVkYmFjayBmb3IgU21hcnRKb3kgUExVUyBQUzIvVVNCIGFkYXB0ZXJcbiIpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xMzUsMTMgKzEzMywxMyBAQAogCiAJcmV0ID0gaGlkX3BhcnNlKGhkZXYpOwogCWlmIChyZXQpIHsKLQkJZGV2X2VycigmaGRldi0+ZGV2LCAicGFyc2UgZmFpbGVkXG4iKTsKKwkJaGlkX2VycihoZGV2LCAicGFyc2UgZmFpbGVkXG4iKTsKIAkJZ290byBlcnI7CiAJfQogCiAJcmV0ID0gaGlkX2h3X3N0YXJ0KGhkZXYsIEhJRF9DT05ORUNUX0RFRkFVTFQgJiB+SElEX0NPTk5FQ1RfRkYpOwogCWlmIChyZXQpIHsKLQkJZGV2X2VycigmaGRldi0+ZGV2LCAiaHcgc3RhcnQgZmFpbGVkXG4iKTsKKwkJaGlkX2VycihoZGV2LCAiaHcgc3RhcnQgZmFpbGVkXG4iKTsKIAkJZ290byBlcnI7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC9oaWQtc29ueS5jIGIvZHJpdmVycy9oaWQvaGlkLXNvbnkuYwppbmRleCA2NzdiYjNkLi42OGQ3YjM2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC9oaWQtc29ueS5jCisrKyBiL2RyaXZlcnMvaGlkL2hpZC1zb255LmMKQEAgLTQwLDggKzQwLDcgQEAKIAogCWlmICgoc2MtPnF1aXJrcyAmIFZBSU9fUkRFU0NfQ09OU1RBTlQpICYmCiAJCQkqcnNpemUgPj0gNTYgJiYgcmRlc2NbNTRdID09IDB4ODEgJiYgcmRlc2NbNTVdID09IDB4MDcpIHsKLQkJZGV2X2luZm8oJmhkZXYtPmRldiwgIkZpeGluZyB1cCBTb255IFZhaW8gVkdYIHJlcG9ydCAiCi0JCQkJImRlc2NyaXB0b3JcbiIpOworCQloaWRfaW5mbyhoZGV2LCAiRml4aW5nIHVwIFNvbnkgVmFpbyBWR1ggcmVwb3J0IGRlc2NyaXB0b3JcbiIpOwogCQlyZGVzY1s1NV0gPSAweDA2OwogCX0KIAlyZXR1cm4gcmRlc2M7CkBAIC04OSw3ICs4OCw3IEBACiAJCQkJICgzIDw8IDgpIHwgMHhmMiwgaWZudW0sIGJ1ZiwgMTcsCiAJCQkJIFVTQl9DVFJMX0dFVF9USU1FT1VUKTsKIAlpZiAocmV0IDwgMCkKLQkJZGV2X2VycigmaGRldi0+ZGV2LCAiY2FuJ3Qgc2V0IG9wZXJhdGlvbmFsIG1vZGVcbiIpOworCQloaWRfZXJyKGhkZXYsICJjYW4ndCBzZXQgb3BlcmF0aW9uYWwgbW9kZVxuIik7CiAKIAlrZnJlZShidWYpOwogCkBAIC0xMTAsNyArMTA5LDcgQEAKIAogCXNjID0ga3phbGxvYyhzaXplb2YoKnNjKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKHNjID09IE5VTEwpIHsKLQkJZGV2X2VycigmaGRldi0+ZGV2LCAiY2FuJ3QgYWxsb2Mgc29ueSBkZXNjcmlwdG9yXG4iKTsKKwkJaGlkX2VycihoZGV2LCAiY2FuJ3QgYWxsb2Mgc29ueSBkZXNjcmlwdG9yXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCkBAIC0xMTksMTQgKzExOCwxNCBAQAogCiAJcmV0ID0gaGlkX3BhcnNlKGhkZXYpOwogCWlmIChyZXQpIHsKLQkJZGV2X2VycigmaGRldi0+ZGV2LCAicGFyc2UgZmFpbGVkXG4iKTsKKwkJaGlkX2VycihoZGV2LCAicGFyc2UgZmFpbGVkXG4iKTsKIAkJZ290byBlcnJfZnJlZTsKIAl9CiAKIAlyZXQgPSBoaWRfaHdfc3RhcnQoaGRldiwgSElEX0NPTk5FQ1RfREVGQVVMVCB8CiAJCQlISURfQ09OTkVDVF9ISURERVZfRk9SQ0UpOwogCWlmIChyZXQpIHsKLQkJZGV2X2VycigmaGRldi0+ZGV2LCAiaHcgc3RhcnQgZmFpbGVkXG4iKTsKKwkJaGlkX2VycihoZGV2LCAiaHcgc3RhcnQgZmFpbGVkXG4iKTsKIAkJZ290byBlcnJfZnJlZTsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL2hpZC1zdGFudHVtLmMgYi9kcml2ZXJzL2hpZC9oaWQtc3RhbnR1bS5jCmluZGV4IDMxNzFiZTIuLmIyYmUxZDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaGlkL2hpZC1zdGFudHVtLmMKKysrIGIvZHJpdmVycy9oaWQvaGlkLXN0YW50dW0uYwpAQCAtMjIyLDcgKzIyMiw3IEBACiAKIAlzZCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBzdGFudHVtX2RhdGEpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXNkKSB7Ci0JCWRldl9lcnIoJmhkZXYtPmRldiwgImNhbm5vdCBhbGxvY2F0ZSBTdGFudHVtIGRhdGFcbiIpOworCQloaWRfZXJyKGhkZXYsICJjYW5ub3QgYWxsb2NhdGUgU3RhbnR1bSBkYXRhXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCXNkLT52YWxpZCA9IGZhbHNlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvaGlkLXN1bnBsdXMuYyBiL2RyaXZlcnMvaGlkL2hpZC1zdW5wbHVzLmMKaW5kZXggMTY0ZWQ1Ni4uZDQ4NGEwMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvaGlkLXN1bnBsdXMuYworKysgYi9kcml2ZXJzL2hpZC9oaWQtc3VucGx1cy5jCkBAIC0yNyw4ICsyNyw3IEBACiB7CiAJaWYgKCpyc2l6ZSA+PSAxMDcgJiYgcmRlc2NbMTA0XSA9PSAweDI2ICYmIHJkZXNjWzEwNV0gPT0gMHg4MCAmJgogCQkJcmRlc2NbMTA2XSA9PSAweDAzKSB7Ci0JCWRldl9pbmZvKCZoZGV2LT5kZXYsICJmaXhpbmcgdXAgU3VucGx1cyBXaXJlbGVzcyBEZXNrdG9wICIKLQkJCQkicmVwb3J0IGRlc2NyaXB0b3JcbiIpOworCQloaWRfaW5mbyhoZGV2LCAiZml4aW5nIHVwIFN1bnBsdXMgV2lyZWxlc3MgRGVza3RvcCByZXBvcnQgZGVzY3JpcHRvclxuIik7CiAJCXJkZXNjWzEwNV0gPSByZGVzY1sxMTBdID0gMHgwMzsKIAkJcmRlc2NbMTA2XSA9IHJkZXNjWzExMV0gPSAweDIxOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL2hpZC10bWZmLmMgYi9kcml2ZXJzL2hpZC9oaWQtdG1mZi5jCmluZGV4IDI1YmU0ZTEuLjU3NTg2MmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaGlkL2hpZC10bWZmLmMKKysrIGIvZHJpdmVycy9oaWQvaGlkLXRtZmYuYwpAQCAtMTUxLDI4ICsxNTEsMjMgQEAKIAkJCXN3aXRjaCAoZmllbGQtPnVzYWdlWzBdLmhpZCkgewogCQkJY2FzZSBUSFJVU1RNQVNURVJfVVNBR0VfRkY6CiAJCQkJaWYgKGZpZWxkLT5yZXBvcnRfY291bnQgPCAyKSB7Ci0JCQkJCWRldl93YXJuKCZoaWQtPmRldiwgImlnbm9yaW5nIEZGIGZpZWxkICIKLQkJCQkJCSJ3aXRoIHJlcG9ydF9jb3VudCA8IDJcbiIpOworCQkJCQloaWRfd2FybihoaWQsICJpZ25vcmluZyBGRiBmaWVsZCB3aXRoIHJlcG9ydF9jb3VudCA8IDJcbiIpOwogCQkJCQljb250aW51ZTsKIAkJCQl9CiAKIAkJCQlpZiAoZmllbGQtPmxvZ2ljYWxfbWF4aW11bSA9PQogCQkJCQkJZmllbGQtPmxvZ2ljYWxfbWluaW11bSkgewotCQkJCQlkZXZfd2FybigmaGlkLT5kZXYsICJpZ25vcmluZyBGRiBmaWVsZCAiCi0JCQkJCQkJIndpdGggbG9naWNhbF9tYXhpbXVtICIKLQkJCQkJCQkiPT0gbG9naWNhbF9taW5pbXVtXG4iKTsKKwkJCQkJaGlkX3dhcm4oaGlkLCAiaWdub3JpbmcgRkYgZmllbGQgd2l0aCBsb2dpY2FsX21heGltdW0gPT0gbG9naWNhbF9taW5pbXVtXG4iKTsKIAkJCQkJY29udGludWU7CiAJCQkJfQogCiAJCQkJaWYgKHRtZmYtPnJlcG9ydCAmJiB0bWZmLT5yZXBvcnQgIT0gcmVwb3J0KSB7Ci0JCQkJCWRldl93YXJuKCZoaWQtPmRldiwgImlnbm9yaW5nIEZGIGZpZWxkICIKLQkJCQkJCQkiaW4gb3RoZXIgcmVwb3J0XG4iKTsKKwkJCQkJaGlkX3dhcm4oaGlkLCAiaWdub3JpbmcgRkYgZmllbGQgaW4gb3RoZXIgcmVwb3J0XG4iKTsKIAkJCQkJY29udGludWU7CiAJCQkJfQogCiAJCQkJaWYgKHRtZmYtPmZmX2ZpZWxkICYmIHRtZmYtPmZmX2ZpZWxkICE9IGZpZWxkKSB7Ci0JCQkJCWRldl93YXJuKCZoaWQtPmRldiwgImlnbm9yaW5nICIKLQkJCQkJCQkiZHVwbGljYXRlIEZGIGZpZWxkXG4iKTsKKwkJCQkJaGlkX3dhcm4oaGlkLCAiaWdub3JpbmcgZHVwbGljYXRlIEZGIGZpZWxkXG4iKTsKIAkJCQkJY29udGludWU7CiAJCQkJfQogCkBAIC0xODUsMTYgKzE4MCwxNSBAQAogCQkJCWJyZWFrOwogCiAJCQlkZWZhdWx0OgotCQkJCWRldl93YXJuKCZoaWQtPmRldiwgImlnbm9yaW5nIHVua25vd24gb3V0cHV0ICIKLQkJCQkJCSJ1c2FnZSAlMDh4XG4iLAotCQkJCQkJZmllbGQtPnVzYWdlWzBdLmhpZCk7CisJCQkJaGlkX3dhcm4oaGlkLCAiaWdub3JpbmcgdW5rbm93biBvdXRwdXQgdXNhZ2UgJTA4eFxuIiwKKwkJCQkJIGZpZWxkLT51c2FnZVswXS5oaWQpOwogCQkJCWNvbnRpbnVlOwogCQkJfQogCQl9CiAJfQogCiAJaWYgKCF0bWZmLT5yZXBvcnQpIHsKLQkJZGV2X2VycigmaGlkLT5kZXYsICJjYW4ndCBmaW5kIEZGIGZpZWxkIGluIG91dHB1dCByZXBvcnRzXG4iKTsKKwkJaGlkX2VycihoaWQsICJjYW4ndCBmaW5kIEZGIGZpZWxkIGluIG91dHB1dCByZXBvcnRzXG4iKTsKIAkJZXJyb3IgPSAtRU5PREVWOwogCQlnb3RvIGZhaWw7CiAJfQpAQCAtMjAzLDggKzE5Nyw3IEBACiAJaWYgKGVycm9yKQogCQlnb3RvIGZhaWw7CiAKLQlkZXZfaW5mbygmaGlkLT5kZXYsICJmb3JjZSBmZWVkYmFjayBmb3IgVGhydXN0TWFzdGVyIGRldmljZXMgYnkgWmlueCAiCi0JCQkiVmVyaXR1c2UgPHppbnhAZXBpY3NvbC5vcmc+Iik7CisJaGlkX2luZm8oaGlkLCAiZm9yY2UgZmVlZGJhY2sgZm9yIFRocnVzdE1hc3RlciBkZXZpY2VzIGJ5IFppbnggVmVyaXR1c2UgPHppbnhAZXBpY3NvbC5vcmc+XG4iKTsKIAlyZXR1cm4gMDsKIAogZmFpbDoKQEAgLTIyNCwxMyArMjE3LDEzIEBACiAKIAlyZXQgPSBoaWRfcGFyc2UoaGRldik7CiAJaWYgKHJldCkgewotCQlkZXZfZXJyKCZoZGV2LT5kZXYsICJwYXJzZSBmYWlsZWRcbiIpOworCQloaWRfZXJyKGhkZXYsICJwYXJzZSBmYWlsZWRcbiIpOwogCQlnb3RvIGVycjsKIAl9CiAKIAlyZXQgPSBoaWRfaHdfc3RhcnQoaGRldiwgSElEX0NPTk5FQ1RfREVGQVVMVCAmIH5ISURfQ09OTkVDVF9GRik7CiAJaWYgKHJldCkgewotCQlkZXZfZXJyKCZoZGV2LT5kZXYsICJodyBzdGFydCBmYWlsZWRcbiIpOworCQloaWRfZXJyKGhkZXYsICJodyBzdGFydCBmYWlsZWRcbiIpOwogCQlnb3RvIGVycjsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL2hpZC10b3BzZWVkLmMgYi9kcml2ZXJzL2hpZC9oaWQtdG9wc2VlZC5jCmluZGV4IDk1NmVkOWEuLjYxM2ZmN2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaGlkL2hpZC10b3BzZWVkLmMKKysrIGIvZHJpdmVycy9oaWQvaGlkLXRvcHNlZWQuYwpAQCAtNjYsNiArNjYsNyBAQAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9CVEMsIFVTQl9ERVZJQ0VfSURfQlRDX0VNUFJFWF9SRU1PVEUpIH0sCiAJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0JUQywgVVNCX0RFVklDRV9JRF9CVENfRU1QUkVYX1JFTU9URV8yKSB9LAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9UT1BTRUVEMiwgVVNCX0RFVklDRV9JRF9UT1BTRUVEMl9SRl9DT01CTykgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQ0hJQ09OWSwgVVNCX0RFVklDRV9JRF9DSElDT05ZX1dJUkVMRVNTKSB9LAogCXsgfQogfTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUoaGlkLCB0c19kZXZpY2VzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL2hpZC13YWNvbS5jIGIvZHJpdmVycy9oaWQvaGlkLXdhY29tLmMKaW5kZXggNzI0ZjQ2ZS4uMDY4ODgzMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvaGlkLXdhY29tLmMKKysrIGIvZHJpdmVycy9oaWQvaGlkLXdhY29tLmMKQEAgLTE4LDYgKzE4LDggQEAKICAqIGFueSBsYXRlciB2ZXJzaW9uLgogICovCiAKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKwogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2hpZC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgpAQCAtMTQxLDggKzE0Myw4IEBACiAJICogTm90ZSB0aGF0IGlmIHRoZSByYXcgcXVlcmllcyBmYWlsLCBpdCdzIG5vdCBhIGhhcmQgZmFpbHVyZSBhbmQgaXQKIAkgKiBpcyBzYWZlIHRvIGNvbnRpbnVlCiAJICovCi0JZGV2X3dhcm4oJmhkZXYtPmRldiwgImZhaWxlZCB0byBwb2tlIGRldmljZSwgY29tbWFuZCAlZCwgZXJyICVkXG4iLAotCQkJCXJlcF9kYXRhWzBdLCByZXQpOworCWhpZF93YXJuKGhkZXYsICJmYWlsZWQgdG8gcG9rZSBkZXZpY2UsIGNvbW1hbmQgJWQsIGVyciAlZFxuIiwKKwkJIHJlcF9kYXRhWzBdLCByZXQpOwogCXJldHVybjsKIH0KIApAQCAtMTcyLDcgKzE3NCw3IEBACiAJCXJldHVybiAtRUlOVkFMOwogfQogCi1zdGF0aWMgREVWSUNFX0FUVFIoc3BlZWQsIFNfSVJVR08gfCBTX0lXVUdPLAorc3RhdGljIERFVklDRV9BVFRSKHNwZWVkLCBTX0lSVUdPIHwgU19JV1VTUiB8IFNfSVdHUlAsCiAJCXdhY29tX3Nob3dfc3BlZWQsIHdhY29tX3N0b3JlX3NwZWVkKTsKIAogc3RhdGljIGludCB3YWNvbV9yYXdfZXZlbnQoc3RydWN0IGhpZF9kZXZpY2UgKmhkZXYsIHN0cnVjdCBoaWRfcmVwb3J0ICpyZXBvcnQsCkBAIC0zMTIsNyArMzE0LDcgQEAKIAogCXdkYXRhID0ga3phbGxvYyhzaXplb2YoKndkYXRhKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKHdkYXRhID09IE5VTEwpIHsKLQkJZGV2X2VycigmaGRldi0+ZGV2LCAiY2FuJ3QgYWxsb2Mgd2Fjb20gZGVzY3JpcHRvclxuIik7CisJCWhpZF9lcnIoaGRldiwgImNhbid0IGFsbG9jIHdhY29tIGRlc2NyaXB0b3JcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKQEAgLTMyMSwyMCArMzIzLDIwIEBACiAJLyogUGFyc2UgdGhlIEhJRCByZXBvcnQgbm93ICovCiAJcmV0ID0gaGlkX3BhcnNlKGhkZXYpOwogCWlmIChyZXQpIHsKLQkJZGV2X2VycigmaGRldi0+ZGV2LCAicGFyc2UgZmFpbGVkXG4iKTsKKwkJaGlkX2VycihoZGV2LCAicGFyc2UgZmFpbGVkXG4iKTsKIAkJZ290byBlcnJfZnJlZTsKIAl9CiAKIAlyZXQgPSBoaWRfaHdfc3RhcnQoaGRldiwgSElEX0NPTk5FQ1RfREVGQVVMVCk7CiAJaWYgKHJldCkgewotCQlkZXZfZXJyKCZoZGV2LT5kZXYsICJodyBzdGFydCBmYWlsZWRcbiIpOworCQloaWRfZXJyKGhkZXYsICJodyBzdGFydCBmYWlsZWRcbiIpOwogCQlnb3RvIGVycl9mcmVlOwogCX0KIAogCXJldCA9IGRldmljZV9jcmVhdGVfZmlsZSgmaGRldi0+ZGV2LCAmZGV2X2F0dHJfc3BlZWQpOwogCWlmIChyZXQpCi0JCWRldl93YXJuKCZoZGV2LT5kZXYsCi0JCQkiY2FuJ3QgY3JlYXRlIHN5c2ZzIHNwZWVkIGF0dHJpYnV0ZSBlcnI6ICVkXG4iLCByZXQpOworCQloaWRfd2FybihoZGV2LAorCQkJICJjYW4ndCBjcmVhdGUgc3lzZnMgc3BlZWQgYXR0cmlidXRlIGVycjogJWRcbiIsIHJldCk7CiAKIAkvKiBTZXQgV2Fjb20gbW9kZSAyIHdpdGggaGlnaCByZXBvcnRpbmcgc3BlZWQgKi8KIAl3YWNvbV9wb2tlKGhkZXYsIDEpOwpAQCAtMzQ5LDggKzM1MSw4IEBACiAKIAlyZXQgPSBwb3dlcl9zdXBwbHlfcmVnaXN0ZXIoJmhkZXYtPmRldiwgJndkYXRhLT5iYXR0ZXJ5KTsKIAlpZiAocmV0KSB7Ci0JCWRldl93YXJuKCZoZGV2LT5kZXYsCi0JCQkiY2FuJ3QgY3JlYXRlIHN5c2ZzIGJhdHRlcnkgYXR0cmlidXRlLCBlcnI6ICVkXG4iLCByZXQpOworCQloaWRfd2FybihoZGV2LCAiY2FuJ3QgY3JlYXRlIHN5c2ZzIGJhdHRlcnkgYXR0cmlidXRlLCBlcnI6ICVkXG4iLAorCQkJIHJldCk7CiAJCS8qCiAJCSAqIGJhdHRlcnkgYXR0cmlidXRlIGlzIG5vdCBjcml0aWNhbCBmb3IgdGhlIHRhYmxldCwgYnV0IGlmIGl0CiAJCSAqIGZhaWxlZCB0aGVuIHRoZXJlIGlzIG5vIG5lZWQgdG8gY3JlYXRlIGFjIGF0dHJpYnV0ZQpAQCAtMzY3LDggKzM2OSw4IEBACiAKIAlyZXQgPSBwb3dlcl9zdXBwbHlfcmVnaXN0ZXIoJmhkZXYtPmRldiwgJndkYXRhLT5hYyk7CiAJaWYgKHJldCkgewotCQlkZXZfd2FybigmaGRldi0+ZGV2LAotCQkJImNhbid0IGNyZWF0ZSBhYyBiYXR0ZXJ5IGF0dHJpYnV0ZSwgZXJyOiAlZFxuIiwgcmV0KTsKKwkJaGlkX3dhcm4oaGRldiwKKwkJCSAiY2FuJ3QgY3JlYXRlIGFjIGJhdHRlcnkgYXR0cmlidXRlLCBlcnI6ICVkXG4iLCByZXQpOwogCQkvKgogCQkgKiBhYyBhdHRyaWJ1dGUgaXMgbm90IGNyaXRpY2FsIGZvciB0aGUgdGFibGV0LCBidXQgaWYgaXQKIAkJICogZmFpbGVkIHRoZW4gd2UgZG9uJ3Qgd2FudCB0byBiYXR0ZXJ5IGF0dHJpYnV0ZSB0byBleGlzdApAQCAtNDU0LDcgKzQ1Niw3IEBACiAKIAlyZXQgPSBoaWRfcmVnaXN0ZXJfZHJpdmVyKCZ3YWNvbV9kcml2ZXIpOwogCWlmIChyZXQpCi0JCXByaW50ayhLRVJOX0VSUiAiY2FuJ3QgcmVnaXN0ZXIgd2Fjb20gZHJpdmVyXG4iKTsKKwkJcHJfZXJyKCJjYW4ndCByZWdpc3RlciB3YWNvbSBkcml2ZXJcbiIpOwogCXJldHVybiByZXQ7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL2hpZC16cGZmLmMgYi9kcml2ZXJzL2hpZC9oaWQtenBmZi5jCmluZGV4IGI3YWNjZWEuLmYzMWZhYjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaGlkL2hpZC16cGZmLmMKKysrIGIvZHJpdmVycy9oaWQvaGlkLXpwZmYuYwpAQCAtNzUsMTQgKzc1LDE0IEBACiAJaW50IGVycm9yOwogCiAJaWYgKGxpc3RfZW1wdHkocmVwb3J0X2xpc3QpKSB7Ci0JCWRldl9lcnIoJmhpZC0+ZGV2LCAibm8gb3V0cHV0IHJlcG9ydCBmb3VuZFxuIik7CisJCWhpZF9lcnIoaGlkLCAibm8gb3V0cHV0IHJlcG9ydCBmb3VuZFxuIik7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIAogCXJlcG9ydCA9IGxpc3RfZW50cnkocmVwb3J0X2xpc3QtPm5leHQsIHN0cnVjdCBoaWRfcmVwb3J0LCBsaXN0KTsKIAogCWlmIChyZXBvcnQtPm1heGZpZWxkIDwgNCkgewotCQlkZXZfZXJyKCZoaWQtPmRldiwgIm5vdCBlbm91Z2ggZmllbGRzIGluIHJlcG9ydFxuIik7CisJCWhpZF9lcnIoaGlkLCAibm90IGVub3VnaCBmaWVsZHMgaW4gcmVwb3J0XG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCkBAIC0xMDUsOCArMTA1LDcgQEAKIAl6cGZmLT5yZXBvcnQtPmZpZWxkWzNdLT52YWx1ZVswXSA9IDB4MDA7CiAJdXNiaGlkX3N1Ym1pdF9yZXBvcnQoaGlkLCB6cGZmLT5yZXBvcnQsIFVTQl9ESVJfT1VUKTsKIAotCWRldl9pbmZvKCZoaWQtPmRldiwgImZvcmNlIGZlZWRiYWNrIGZvciBaZXJvcGx1cyBiYXNlZCBkZXZpY2VzIGJ5ICIKLQkgICAgICAgIkFuc3NpIEhhbm51bGEgPGFuc3NpLmhhbm51bGFAZ21haWwuY29tPlxuIik7CisJaGlkX2luZm8oaGlkLCAiZm9yY2UgZmVlZGJhY2sgZm9yIFplcm9wbHVzIGJhc2VkIGRldmljZXMgYnkgQW5zc2kgSGFubnVsYSA8YW5zc2kuaGFubnVsYUBnbWFpbC5jb20+XG4iKTsKIAogCXJldHVybiAwOwogfQpAQCAtMTIzLDEzICsxMjIsMTMgQEAKIAogCXJldCA9IGhpZF9wYXJzZShoZGV2KTsKIAlpZiAocmV0KSB7Ci0JCWRldl9lcnIoJmhkZXYtPmRldiwgInBhcnNlIGZhaWxlZFxuIik7CisJCWhpZF9lcnIoaGRldiwgInBhcnNlIGZhaWxlZFxuIik7CiAJCWdvdG8gZXJyOwogCX0KIAogCXJldCA9IGhpZF9od19zdGFydChoZGV2LCBISURfQ09OTkVDVF9ERUZBVUxUICYgfkhJRF9DT05ORUNUX0ZGKTsKIAlpZiAocmV0KSB7Ci0JCWRldl9lcnIoJmhkZXYtPmRldiwgImh3IHN0YXJ0IGZhaWxlZFxuIik7CisJCWhpZF9lcnIoaGRldiwgImh3IHN0YXJ0IGZhaWxlZFxuIik7CiAJCWdvdG8gZXJyOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvaGlkLXp5ZGFjcm9uLmMgYi9kcml2ZXJzL2hpZC9oaWQtenlkYWNyb24uYwppbmRleCBhYWMxZjkyLi5lOTAzNzE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC9oaWQtenlkYWNyb24uYworKysgYi9kcml2ZXJzL2hpZC9oaWQtenlkYWNyb24uYwpAQCAtMzQsOSArMzQsOCBAQAogCQlyZGVzY1sweDk2XSA9PSAweGJjICYmIHJkZXNjWzB4OTddID09IDB4ZmYgJiYKIAkJcmRlc2NbMHhjYV0gPT0gMHhiYyAmJiByZGVzY1sweGNiXSA9PSAweGZmICYmCiAJCXJkZXNjWzB4ZTFdID09IDB4YmMgJiYgcmRlc2NbMHhlMl0gPT0gMHhmZikgewotCQkJZGV2X2luZm8oJmhkZXYtPmRldiwKLQkJCQkiZml4aW5nIHVwIHp5ZGFjcm9uIHJlbW90ZSBjb250cm9sIHJlcG9ydCAiCi0JCQkJImRlc2NyaXB0b3JcbiIpOworCQkJaGlkX2luZm8oaGRldiwKKwkJCQkiZml4aW5nIHVwIHp5ZGFjcm9uIHJlbW90ZSBjb250cm9sIHJlcG9ydCBkZXNjcmlwdG9yXG4iKTsKIAkJCXJkZXNjWzB4OTZdID0gcmRlc2NbMHhjYV0gPSByZGVzY1sweGUxXSA9IDB4MGM7CiAJCQlyZGVzY1sweDk3XSA9IHJkZXNjWzB4Y2JdID0gcmRlc2NbMHhlMl0gPSAweDAwOwogCQl9CkBAIC0xNzIsNyArMTcxLDcgQEAKIAogCXpjID0ga3phbGxvYyhzaXplb2YoKnpjKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKHpjID09IE5VTEwpIHsKLQkJZGV2X2VycigmaGRldi0+ZGV2LCAienlkYWNyb246IGNhbid0IGFsbG9jIGRlc2NyaXB0b3JcbiIpOworCQloaWRfZXJyKGhkZXYsICJjYW4ndCBhbGxvYyBkZXNjcmlwdG9yXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCkBAIC0xODAsMTMgKzE3OSwxMyBAQAogCiAJcmV0ID0gaGlkX3BhcnNlKGhkZXYpOwogCWlmIChyZXQpIHsKLQkJZGV2X2VycigmaGRldi0+ZGV2LCAienlkYWNyb246IHBhcnNlIGZhaWxlZFxuIik7CisJCWhpZF9lcnIoaGRldiwgInBhcnNlIGZhaWxlZFxuIik7CiAJCWdvdG8gZXJyX2ZyZWU7CiAJfQogCiAJcmV0ID0gaGlkX2h3X3N0YXJ0KGhkZXYsIEhJRF9DT05ORUNUX0RFRkFVTFQpOwogCWlmIChyZXQpIHsKLQkJZGV2X2VycigmaGRldi0+ZGV2LCAienlkYWNyb246IGh3IHN0YXJ0IGZhaWxlZFxuIik7CisJCWhpZF9lcnIoaGRldiwgImh3IHN0YXJ0IGZhaWxlZFxuIik7CiAJCWdvdG8gZXJyX2ZyZWU7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC9oaWRyYXcuYyBiL2RyaXZlcnMvaGlkL2hpZHJhdy5jCmluZGV4IGUxZjA3NDguLjQ2OGU4N2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaGlkL2hpZHJhdy5jCisrKyBiL2RyaXZlcnMvaGlkL2hpZHJhdy5jCkBAIC0xOSw2ICsxOSw4IEBACiAgKiA1MSBGcmFua2xpbiBTdCAtIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgogICovCiAKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKwogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KQEAgLTEyMiwxNSArMTI0LDE1IEBACiAJfQogCiAJaWYgKGNvdW50ID4gSElEX01BWF9CVUZGRVJfU0laRSkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJoaWRyYXc6IHBpZCAlZCBwYXNzZWQgdG9vIGxhcmdlIHJlcG9ydFxuIiwKLQkJCQl0YXNrX3BpZF9ucihjdXJyZW50KSk7CisJCWhpZF93YXJuKGRldiwgInBpZCAlZCBwYXNzZWQgdG9vIGxhcmdlIHJlcG9ydFxuIiwKKwkJCSB0YXNrX3BpZF9ucihjdXJyZW50KSk7CiAJCXJldCA9IC1FSU5WQUw7CiAJCWdvdG8gb3V0OwogCX0KIAogCWlmIChjb3VudCA8IDIpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiaGlkcmF3OiBwaWQgJWQgcGFzc2VkIHRvbyBzaG9ydCByZXBvcnRcbiIsCi0JCQkJdGFza19waWRfbnIoY3VycmVudCkpOworCQloaWRfd2FybihkZXYsICJwaWQgJWQgcGFzc2VkIHRvbyBzaG9ydCByZXBvcnRcbiIsCisJCQkgdGFza19waWRfbnIoY3VycmVudCkpOwogCQlyZXQgPSAtRUlOVkFMOwogCQlnb3RvIG91dDsKIAl9CkBAIC0xOTIsMTUgKzE5NCwxMyBAQAogCiAJZGV2ID0gaGlkcmF3X3RhYmxlW21pbm9yXTsKIAlpZiAoIWRldi0+b3BlbisrKSB7Ci0JCWlmIChkZXYtPmhpZC0+bGxfZHJpdmVyLT5wb3dlcikgewotCQkJZXJyID0gZGV2LT5oaWQtPmxsX2RyaXZlci0+cG93ZXIoZGV2LT5oaWQsIFBNX0hJTlRfRlVMTE9OKTsKLQkJCWlmIChlcnIgPCAwKQotCQkJCWdvdG8gb3V0X3VubG9jazsKLQkJfQotCQllcnIgPSBkZXYtPmhpZC0+bGxfZHJpdmVyLT5vcGVuKGRldi0+aGlkKTsKKwkJZXJyID0gaGlkX2h3X3Bvd2VyKGRldi0+aGlkLCBQTV9ISU5UX0ZVTExPTik7CisJCWlmIChlcnIgPCAwKQorCQkJZ290byBvdXRfdW5sb2NrOworCisJCWVyciA9IGhpZF9od19vcGVuKGRldi0+aGlkKTsKIAkJaWYgKGVyciA8IDApIHsKLQkJCWlmIChkZXYtPmhpZC0+bGxfZHJpdmVyLT5wb3dlcikKLQkJCQlkZXYtPmhpZC0+bGxfZHJpdmVyLT5wb3dlcihkZXYtPmhpZCwgUE1fSElOVF9OT1JNQUwpOworCQkJaGlkX2h3X3Bvd2VyKGRldi0+aGlkLCBQTV9ISU5UX05PUk1BTCk7CiAJCQlkZXYtPm9wZW4tLTsKIAkJfQogCX0KQEAgLTIyOSw5ICsyMjksOCBAQAogCWRldiA9IGhpZHJhd190YWJsZVttaW5vcl07CiAJaWYgKCEtLWRldi0+b3BlbikgewogCQlpZiAobGlzdC0+aGlkcmF3LT5leGlzdCkgewotCQkJaWYgKGRldi0+aGlkLT5sbF9kcml2ZXItPnBvd2VyKQotCQkJCWRldi0+aGlkLT5sbF9kcml2ZXItPnBvd2VyKGRldi0+aGlkLCBQTV9ISU5UX05PUk1BTCk7Ci0JCQlkZXYtPmhpZC0+bGxfZHJpdmVyLT5jbG9zZShkZXYtPmhpZCk7CisJCQloaWRfaHdfcG93ZXIoZGV2LT5oaWQsIFBNX0hJTlRfTk9STUFMKTsKKwkJCWhpZF9od19jbG9zZShkZXYtPmhpZCk7CiAJCX0gZWxzZSB7CiAJCQlrZnJlZShsaXN0LT5oaWRyYXcpOwogCQl9CkBAIC0zNDUsNiArMzQ0LDkgQEAKIAkub3BlbiA9ICAgICAgICAgaGlkcmF3X29wZW4sCiAJLnJlbGVhc2UgPSAgICAgIGhpZHJhd19yZWxlYXNlLAogCS51bmxvY2tlZF9pb2N0bCA9IGhpZHJhd19pb2N0bCwKKyNpZmRlZiBDT05GSUdfQ09NUEFUCisJLmNvbXBhdF9pb2N0bCAgID0gaGlkcmF3X2lvY3RsLAorI2VuZGlmCiAJLmxsc2VlayA9CW5vb3BfbGxzZWVrLAogfTsKIApAQCAtNDMzLDcgKzQzNSw3IEBACiAJZGV2aWNlX2Rlc3Ryb3koaGlkcmF3X2NsYXNzLCBNS0RFVihoaWRyYXdfbWFqb3IsIGhpZHJhdy0+bWlub3IpKTsKIAogCWlmIChoaWRyYXctPm9wZW4pIHsKLQkJaGlkLT5sbF9kcml2ZXItPmNsb3NlKGhpZCk7CisJCWhpZF9od19jbG9zZShoaWQpOwogCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmhpZHJhdy0+d2FpdCk7CiAJfSBlbHNlIHsKIAkJa2ZyZWUoaGlkcmF3KTsKQEAgLTQ1Miw3ICs0NTQsNyBAQAogCWhpZHJhd19tYWpvciA9IE1BSk9SKGRldl9pZCk7CiAKIAlpZiAocmVzdWx0IDwgMCkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJoaWRyYXc6IGNhbid0IGdldCBtYWpvciBudW1iZXJcbiIpOworCQlwcl93YXJuKCJjYW4ndCBnZXQgbWFqb3IgbnVtYmVyXG4iKTsKIAkJcmVzdWx0ID0gMDsKIAkJZ290byBvdXQ7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvdXNiaGlkL01ha2VmaWxlIGIvZHJpdmVycy9oaWQvdXNiaGlkL01ha2VmaWxlCmluZGV4IDEzMjllY2IuLmRiM2NmMzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaGlkL3VzYmhpZC9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2hpZC91c2JoaWQvTWFrZWZpbGUKQEAgLTMsMTUgKzMsMTUgQEAKICMKIAogIyBNdWx0aXBhcnQgb2JqZWN0cy4KLXVzYmhpZC1vYmpzCTo9IGhpZC1jb3JlLm8gaGlkLXF1aXJrcy5vCit1c2JoaWQteQk6PSBoaWQtY29yZS5vIGhpZC1xdWlya3MubwogCiAjIE9wdGlvbmFsIHBhcnRzIG9mIG11bHRpcGFydCBvYmplY3RzLgogCiBpZmVxICgkKENPTkZJR19VU0JfSElEREVWKSx5KQotCXVzYmhpZC1vYmpzCSs9IGhpZGRldi5vCisJdXNiaGlkLXkJKz0gaGlkZGV2Lm8KIGVuZGlmCiBpZmVxICgkKENPTkZJR19ISURfUElEKSx5KQotCXVzYmhpZC1vYmpzCSs9IGhpZC1waWRmZi5vCisJdXNiaGlkLXkJKz0gaGlkLXBpZGZmLm8KIGVuZGlmCiAKIG9iai0kKENPTkZJR19VU0JfSElEKQkJKz0gdXNiaGlkLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL3VzYmhpZC9oaWQtY29yZS5jIGIvZHJpdmVycy9oaWQvdXNiaGlkL2hpZC1jb3JlLmMKaW5kZXggNTQ4OWVhYi4uYjMzNmRkOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvdXNiaGlkL2hpZC1jb3JlLmMKKysrIGIvZHJpdmVycy9oaWQvdXNiaGlkL2hpZC1jb3JlLmMKQEAgLTY3LDcgKzY3LDYgQEAKICAqIElucHV0IHN1Ym1pc3Npb24gYW5kIEkvTyBlcnJvciBoYW5kbGVyLgogICovCiBzdGF0aWMgREVGSU5FX01VVEVYKGhpZF9vcGVuX211dCk7Ci1zdGF0aWMgc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKnJlc3VtcHRpb25fd2FrZXI7CiAKIHN0YXRpYyB2b2lkIGhpZF9pb19lcnJvcihzdHJ1Y3QgaGlkX2RldmljZSAqaGlkKTsKIHN0YXRpYyBpbnQgaGlkX3N1Ym1pdF9vdXQoc3RydWN0IGhpZF9kZXZpY2UgKmhpZCk7CkBAIC0xMzYsMTAgKzEzNSwxMCBAQAogCQkJaGlkX2lvX2Vycm9yKGhpZCk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCWVycl9oaWQoImNhbid0IHJlc2V0IGRldmljZSwgJXMtJXMvaW5wdXQlZCwgc3RhdHVzICVkIiwKLQkJCQloaWRfdG9fdXNiX2RldihoaWQpLT5idXMtPmJ1c19uYW1lLAotCQkJCWhpZF90b191c2JfZGV2KGhpZCktPmRldnBhdGgsCi0JCQkJdXNiaGlkLT5pZm51bSwgcmMpOworCQloaWRfZXJyKGhpZCwgImNhbid0IHJlc2V0IGRldmljZSwgJXMtJXMvaW5wdXQlZCwgc3RhdHVzICVkXG4iLAorCQkJaGlkX3RvX3VzYl9kZXYoaGlkKS0+YnVzLT5idXNfbmFtZSwKKwkJCWhpZF90b191c2JfZGV2KGhpZCktPmRldnBhdGgsCisJCQl1c2JoaWQtPmlmbnVtLCByYyk7CiAJCS8qIEZBTExUSFJPVUdIICovCiAJY2FzZSAtRUhPU1RVTlJFQUNIOgogCWNhc2UgLUVOT0RFVjoKQEAgLTI3OCwxOCArMjc3LDE4IEBACiAJCWhpZF9pb19lcnJvcihoaWQpOwogCQlyZXR1cm47CiAJZGVmYXVsdDoJCS8qIGVycm9yICovCi0JCWRldl93YXJuKCZ1cmItPmRldi0+ZGV2LCAiaW5wdXQgaXJxIHN0YXR1cyAlZCAgIgotCQkJCSJyZWNlaXZlZFxuIiwgdXJiLT5zdGF0dXMpOworCQloaWRfd2Fybih1cmItPmRldiwgImlucHV0IGlycSBzdGF0dXMgJWQgcmVjZWl2ZWRcbiIsCisJCQkgdXJiLT5zdGF0dXMpOwogCX0KIAogCXN0YXR1cyA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgR0ZQX0FUT01JQyk7CiAJaWYgKHN0YXR1cykgewogCQljbGVhcl9iaXQoSElEX0lOX1JVTk5JTkcsICZ1c2JoaWQtPmlvZmwpOwogCQlpZiAoc3RhdHVzICE9IC1FUEVSTSkgewotCQkJZXJyX2hpZCgiY2FuJ3QgcmVzdWJtaXQgaW50ciwgJXMtJXMvaW5wdXQlZCwgc3RhdHVzICVkIiwKLQkJCQkJaGlkX3RvX3VzYl9kZXYoaGlkKS0+YnVzLT5idXNfbmFtZSwKLQkJCQkJaGlkX3RvX3VzYl9kZXYoaGlkKS0+ZGV2cGF0aCwKLQkJCQkJdXNiaGlkLT5pZm51bSwgc3RhdHVzKTsKKwkJCWhpZF9lcnIoaGlkLCAiY2FuJ3QgcmVzdWJtaXQgaW50ciwgJXMtJXMvaW5wdXQlZCwgc3RhdHVzICVkXG4iLAorCQkJCWhpZF90b191c2JfZGV2KGhpZCktPmJ1cy0+YnVzX25hbWUsCisJCQkJaGlkX3RvX3VzYl9kZXYoaGlkKS0+ZGV2cGF0aCwKKwkJCQl1c2JoaWQtPmlmbnVtLCBzdGF0dXMpOwogCQkJaGlkX2lvX2Vycm9yKGhpZCk7CiAJCX0KIAl9CkBAIC0zMDAsMTAgKzI5OSwxOSBAQAogCXN0cnVjdCBoaWRfcmVwb3J0ICpyZXBvcnQ7CiAJY2hhciAqcmF3X3JlcG9ydDsKIAlzdHJ1Y3QgdXNiaGlkX2RldmljZSAqdXNiaGlkID0gaGlkLT5kcml2ZXJfZGF0YTsKKwlpbnQgcjsKIAogCXJlcG9ydCA9IHVzYmhpZC0+b3V0W3VzYmhpZC0+b3V0dGFpbF0ucmVwb3J0OwogCXJhd19yZXBvcnQgPSB1c2JoaWQtPm91dFt1c2JoaWQtPm91dHRhaWxdLnJhd19yZXBvcnQ7CiAKKwlyID0gdXNiX2F1dG9wbV9nZXRfaW50ZXJmYWNlX2FzeW5jKHVzYmhpZC0+aW50Zik7CisJaWYgKHIgPCAwKQorCQlyZXR1cm4gLTE7CisKKwkvKgorCSAqIGlmIHRoZSBkZXZpY2UgaGFzbid0IGJlZW4gd29rZW4sIHdlIGxlYXZlIHRoZSBvdXRwdXQKKwkgKiB0byByZXN1bWUoKQorCSAqLwogCWlmICghdGVzdF9iaXQoSElEX1JFUE9SVEVEX0lETEUsICZ1c2JoaWQtPmlvZmwpKSB7CiAJCXVzYmhpZC0+dXJib3V0LT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoID0gKChyZXBvcnQtPnNpemUgLSAxKSA+PiAzKSArIDEgKyAocmVwb3J0LT5pZCA+IDApOwogCQl1c2JoaWQtPnVyYm91dC0+ZGV2ID0gaGlkX3RvX3VzYl9kZXYoaGlkKTsKQEAgLTMxMywxNyArMzIxLDExIEBACiAJCWRiZ19oaWQoInN1Ym1pdHRpbmcgb3V0IHVyYlxuIik7CiAKIAkJaWYgKHVzYl9zdWJtaXRfdXJiKHVzYmhpZC0+dXJib3V0LCBHRlBfQVRPTUlDKSkgewotCQkJZXJyX2hpZCgidXNiX3N1Ym1pdF91cmIob3V0KSBmYWlsZWQiKTsKKwkJCWhpZF9lcnIoaGlkLCAidXNiX3N1Ym1pdF91cmIob3V0KSBmYWlsZWRcbiIpOworCQkJdXNiX2F1dG9wbV9wdXRfaW50ZXJmYWNlX2FzeW5jKHVzYmhpZC0+aW50Zik7CiAJCQlyZXR1cm4gLTE7CiAJCX0KIAkJdXNiaGlkLT5sYXN0X291dCA9IGppZmZpZXM7Ci0JfSBlbHNlIHsKLQkJLyoKLQkJICogcXVldWUgd29yayB0byB3YWtlIHVwIHRoZSBkZXZpY2UuCi0JCSAqIGFzIHRoZSB3b3JrIHF1ZXVlIGlzIGZyZWV6ZWFibGUsIHRoaXMgaXMgc2FmZQotCQkgKiB3aXRoIHJlc3BlY3QgdG8gU1REIGFuZCBTVFIKLQkJICovCi0JCXF1ZXVlX3dvcmsocmVzdW1wdGlvbl93YWtlciwgJnVzYmhpZC0+cmVzdGFydF93b3JrKTsKIAl9CiAKIAlyZXR1cm4gMDsKQEAgLTMzNCwxMyArMzM2LDE2IEBACiAJc3RydWN0IGhpZF9yZXBvcnQgKnJlcG9ydDsKIAl1bnNpZ25lZCBjaGFyIGRpcjsKIAljaGFyICpyYXdfcmVwb3J0OwotCWludCBsZW47CisJaW50IGxlbiwgcjsKIAlzdHJ1Y3QgdXNiaGlkX2RldmljZSAqdXNiaGlkID0gaGlkLT5kcml2ZXJfZGF0YTsKIAogCXJlcG9ydCA9IHVzYmhpZC0+Y3RybFt1c2JoaWQtPmN0cmx0YWlsXS5yZXBvcnQ7CiAJcmF3X3JlcG9ydCA9IHVzYmhpZC0+Y3RybFt1c2JoaWQtPmN0cmx0YWlsXS5yYXdfcmVwb3J0OwogCWRpciA9IHVzYmhpZC0+Y3RybFt1c2JoaWQtPmN0cmx0YWlsXS5kaXI7CiAKKwlyID0gdXNiX2F1dG9wbV9nZXRfaW50ZXJmYWNlX2FzeW5jKHVzYmhpZC0+aW50Zik7CisJaWYgKHIgPCAwKQorCQlyZXR1cm4gLTE7CiAJaWYgKCF0ZXN0X2JpdChISURfUkVQT1JURURfSURMRSwgJnVzYmhpZC0+aW9mbCkpIHsKIAkJbGVuID0gKChyZXBvcnQtPnNpemUgLSAxKSA+PiAzKSArIDEgKyAocmVwb3J0LT5pZCA+IDApOwogCQlpZiAoZGlyID09IFVTQl9ESVJfT1VUKSB7CkBAIC0zNzUsMTcgKzM4MCwxMSBAQAogCQkJdXNiaGlkLT5jci0+d1ZhbHVlLCB1c2JoaWQtPmNyLT53SW5kZXgsIHVzYmhpZC0+Y3ItPndMZW5ndGgpOwogCiAJCWlmICh1c2Jfc3VibWl0X3VyYih1c2JoaWQtPnVyYmN0cmwsIEdGUF9BVE9NSUMpKSB7Ci0JCQllcnJfaGlkKCJ1c2Jfc3VibWl0X3VyYihjdHJsKSBmYWlsZWQiKTsKKwkJCXVzYl9hdXRvcG1fcHV0X2ludGVyZmFjZV9hc3luYyh1c2JoaWQtPmludGYpOworCQkJaGlkX2VycihoaWQsICJ1c2Jfc3VibWl0X3VyYihjdHJsKSBmYWlsZWRcbiIpOwogCQkJcmV0dXJuIC0xOwogCQl9CiAJCXVzYmhpZC0+bGFzdF9jdHJsID0gamlmZmllczsKLQl9IGVsc2UgewotCQkvKgotCQkgKiBxdWV1ZSB3b3JrIHRvIHdha2UgdXAgdGhlIGRldmljZS4KLQkJICogYXMgdGhlIHdvcmsgcXVldWUgaXMgZnJlZXplYWJsZSwgdGhpcyBpcyBzYWZlCi0JCSAqIHdpdGggcmVzcGVjdCB0byBTVEQgYW5kIFNUUgotCQkgKi8KLQkJcXVldWVfd29yayhyZXN1bXB0aW9uX3dha2VyLCAmdXNiaGlkLT5yZXN0YXJ0X3dvcmspOwogCX0KIAogCXJldHVybiAwOwpAQCAtNDEzLDggKzQxMiw4IEBACiAJY2FzZSAtRU5PRU5UOgogCQlicmVhazsKIAlkZWZhdWx0OgkJLyogZXJyb3IgKi8KLQkJZGV2X3dhcm4oJnVyYi0+ZGV2LT5kZXYsICJvdXRwdXQgaXJxIHN0YXR1cyAlZCAiCi0JCQkJInJlY2VpdmVkXG4iLCB1cmItPnN0YXR1cyk7CisJCWhpZF93YXJuKHVyYi0+ZGV2LCAib3V0cHV0IGlycSBzdGF0dXMgJWQgcmVjZWl2ZWRcbiIsCisJCQkgdXJiLT5zdGF0dXMpOwogCX0KIAogCXNwaW5fbG9ja19pcnFzYXZlKCZ1c2JoaWQtPmxvY2ssIGZsYWdzKTsKQEAgLTQzNSw2ICs0MzQsNyBAQAogCiAJY2xlYXJfYml0KEhJRF9PVVRfUlVOTklORywgJnVzYmhpZC0+aW9mbCk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdXNiaGlkLT5sb2NrLCBmbGFncyk7CisJdXNiX2F1dG9wbV9wdXRfaW50ZXJmYWNlX2FzeW5jKHVzYmhpZC0+aW50Zik7CiAJd2FrZV91cCgmdXNiaGlkLT53YWl0KTsKIH0KIApAQCAtNDY2LDggKzQ2Niw3IEBACiAJY2FzZSAtRVBJUEU6CQkvKiByZXBvcnQgbm90IGF2YWlsYWJsZSAqLwogCQlicmVhazsKIAlkZWZhdWx0OgkJLyogZXJyb3IgKi8KLQkJZGV2X3dhcm4oJnVyYi0+ZGV2LT5kZXYsICJjdHJsIHVyYiBzdGF0dXMgJWQgIgotCQkJCSJyZWNlaXZlZFxuIiwgc3RhdHVzKTsKKwkJaGlkX3dhcm4odXJiLT5kZXYsICJjdHJsIHVyYiBzdGF0dXMgJWQgcmVjZWl2ZWRcbiIsIHN0YXR1cyk7CiAJfQogCiAJaWYgKHVucGx1ZykKQEAgLTQ4MSwxMSArNDgwLDEzIEBACiAJCQl3YWtlX3VwKCZ1c2JoaWQtPndhaXQpOwogCQl9CiAJCXNwaW5fdW5sb2NrKCZ1c2JoaWQtPmxvY2spOworCQl1c2JfYXV0b3BtX3B1dF9pbnRlcmZhY2VfYXN5bmModXNiaGlkLT5pbnRmKTsKIAkJcmV0dXJuOwogCX0KIAogCWNsZWFyX2JpdChISURfQ1RSTF9SVU5OSU5HLCAmdXNiaGlkLT5pb2ZsKTsKIAlzcGluX3VubG9jaygmdXNiaGlkLT5sb2NrKTsKKwl1c2JfYXV0b3BtX3B1dF9pbnRlcmZhY2VfYXN5bmModXNiaGlkLT5pbnRmKTsKIAl3YWtlX3VwKCZ1c2JoaWQtPndhaXQpOwogfQogCkBAIC01MDEsMTMgKzUwMiwxMyBAQAogCiAJaWYgKHVzYmhpZC0+dXJib3V0ICYmIGRpciA9PSBVU0JfRElSX09VVCAmJiByZXBvcnQtPnR5cGUgPT0gSElEX09VVFBVVF9SRVBPUlQpIHsKIAkJaWYgKChoZWFkID0gKHVzYmhpZC0+b3V0aGVhZCArIDEpICYgKEhJRF9PVVRQVVRfRklGT19TSVpFIC0gMSkpID09IHVzYmhpZC0+b3V0dGFpbCkgewotCQkJZGV2X3dhcm4oJmhpZC0+ZGV2LCAib3V0cHV0IHF1ZXVlIGZ1bGxcbiIpOworCQkJaGlkX3dhcm4oaGlkLCAib3V0cHV0IHF1ZXVlIGZ1bGxcbiIpOwogCQkJcmV0dXJuOwogCQl9CiAKIAkJdXNiaGlkLT5vdXRbdXNiaGlkLT5vdXRoZWFkXS5yYXdfcmVwb3J0ID0ga21hbGxvYyhsZW4sIEdGUF9BVE9NSUMpOwogCQlpZiAoIXVzYmhpZC0+b3V0W3VzYmhpZC0+b3V0aGVhZF0ucmF3X3JlcG9ydCkgewotCQkJZGV2X3dhcm4oJmhpZC0+ZGV2LCAib3V0cHV0IHF1ZXVlaW5nIGZhaWxlZFxuIik7CisJCQloaWRfd2FybihoaWQsICJvdXRwdXQgcXVldWVpbmcgZmFpbGVkXG4iKTsKIAkJCXJldHVybjsKIAkJfQogCQloaWRfb3V0cHV0X3JlcG9ydChyZXBvcnQsIHVzYmhpZC0+b3V0W3VzYmhpZC0+b3V0aGVhZF0ucmF3X3JlcG9ydCk7CkBAIC01MzIsMTQgKzUzMywxNCBAQAogCX0KIAogCWlmICgoaGVhZCA9ICh1c2JoaWQtPmN0cmxoZWFkICsgMSkgJiAoSElEX0NPTlRST0xfRklGT19TSVpFIC0gMSkpID09IHVzYmhpZC0+Y3RybHRhaWwpIHsKLQkJZGV2X3dhcm4oJmhpZC0+ZGV2LCAiY29udHJvbCBxdWV1ZSBmdWxsXG4iKTsKKwkJaGlkX3dhcm4oaGlkLCAiY29udHJvbCBxdWV1ZSBmdWxsXG4iKTsKIAkJcmV0dXJuOwogCX0KIAogCWlmIChkaXIgPT0gVVNCX0RJUl9PVVQpIHsKIAkJdXNiaGlkLT5jdHJsW3VzYmhpZC0+Y3RybGhlYWRdLnJhd19yZXBvcnQgPSBrbWFsbG9jKGxlbiwgR0ZQX0FUT01JQyk7CiAJCWlmICghdXNiaGlkLT5jdHJsW3VzYmhpZC0+Y3RybGhlYWRdLnJhd19yZXBvcnQpIHsKLQkJCWRldl93YXJuKCZoaWQtPmRldiwgImNvbnRyb2wgcXVldWVpbmcgZmFpbGVkXG4iKTsKKwkJCWhpZF93YXJuKGhpZCwgImNvbnRyb2wgcXVldWVpbmcgZmFpbGVkXG4iKTsKIAkJCXJldHVybjsKIAkJfQogCQloaWRfb3V0cHV0X3JlcG9ydChyZXBvcnQsIHVzYmhpZC0+Y3RybFt1c2JoaWQtPmN0cmxoZWFkXS5yYXdfcmVwb3J0KTsKQEAgLTU5MCw3ICs1OTEsNyBAQAogCQlyZXR1cm4gLTE7CiAKIAlpZiAoKG9mZnNldCA9IGhpZGlucHV0X2ZpbmRfZmllbGQoaGlkLCB0eXBlLCBjb2RlLCAmZmllbGQpKSA9PSAtMSkgewotCQlkZXZfd2FybigmZGV2LT5kZXYsICJldmVudCBmaWVsZCBub3QgZm91bmRcbiIpOworCQloaWRfd2FybihkZXYsICJldmVudCBmaWVsZCBub3QgZm91bmRcbiIpOwogCQlyZXR1cm4gLTE7CiAJfQogCkBAIC02NTYsNyArNjU3LDcgQEAKIAltdXRleF9sb2NrKCZoaWRfb3Blbl9tdXQpOwogCWlmICghaGlkLT5vcGVuKyspIHsKIAkJcmVzID0gdXNiX2F1dG9wbV9nZXRfaW50ZXJmYWNlKHVzYmhpZC0+aW50Zik7Ci0JCS8qIHRoZSBkZXZpY2UgbXVzdCBiZSBhd2FrZSB0byByZWxpYWJsZSByZXF1ZXN0IHJlbW90ZSB3YWtldXAgKi8KKwkJLyogdGhlIGRldmljZSBtdXN0IGJlIGF3YWtlIHRvIHJlbGlhYmx5IHJlcXVlc3QgcmVtb3RlIHdha2V1cCAqLwogCQlpZiAocmVzIDwgMCkgewogCQkJaGlkLT5vcGVuLS07CiAJCQltdXRleF91bmxvY2soJmhpZF9vcGVuX211dCk7CkBAIC03MjIsNyArNzIzLDcgQEAKIAl9CiAKIAlpZiAoZXJyKQotCQlkZXZfd2FybigmaGlkLT5kZXYsICJ0aW1lb3V0IGluaXRpYWxpemluZyByZXBvcnRzXG4iKTsKKwkJaGlkX3dhcm4oaGlkLCAidGltZW91dCBpbml0aWFsaXppbmcgcmVwb3J0c1xuIik7CiB9CiAKIC8qCkBAIC04NTcsMTggKzg1OCw2IEBACiAJdXNiaGlkX3Jlc3RhcnRfY3RybF9xdWV1ZSh1c2JoaWQpOwogfQogCi1zdGF0aWMgdm9pZCBfX3VzYmhpZF9yZXN0YXJ0X3F1ZXVlcyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCi17Ci0Jc3RydWN0IHVzYmhpZF9kZXZpY2UgKnVzYmhpZCA9Ci0JCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgdXNiaGlkX2RldmljZSwgcmVzdGFydF93b3JrKTsKLQlpbnQgcjsKLQotCXIgPSB1c2JfYXV0b3BtX2dldF9pbnRlcmZhY2UodXNiaGlkLT5pbnRmKTsKLQlpZiAociA8IDApCi0JCXJldHVybjsKLQl1c2JfYXV0b3BtX3B1dF9pbnRlcmZhY2UodXNiaGlkLT5pbnRmKTsKLX0KLQogc3RhdGljIHZvaWQgaGlkX2ZyZWVfYnVmZmVycyhzdHJ1Y3QgdXNiX2RldmljZSAqZGV2LCBzdHJ1Y3QgaGlkX2RldmljZSAqaGlkKQogewogCXN0cnVjdCB1c2JoaWRfZGV2aWNlICp1c2JoaWQgPSBoaWQtPmRyaXZlcl9kYXRhOwpAQCAtMTE0MCw4ICsxMTI5LDcgQEAKIAkJaWYgKHVzYl9lbmRwb2ludF9pc19pbnRfaW4oJmludGVyZmFjZS0+ZW5kcG9pbnRbbl0uZGVzYykpCiAJCQloYXNfaW4rKzsKIAlpZiAoIWhhc19pbikgewotCQlkZXZfZXJyKCZpbnRmLT5kZXYsICJjb3VsZG4ndCBmaW5kIGFuIGlucHV0IGludGVycnVwdCAiCi0JCQkJImVuZHBvaW50XG4iKTsKKwkJaGlkX2VycihpbnRmLCAiY291bGRuJ3QgZmluZCBhbiBpbnB1dCBpbnRlcnJ1cHQgZW5kcG9pbnRcbiIpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKQEAgLTEyMDYsMTQgKzExOTQsMTMgQEAKIAogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnVzYmhpZC0+d2FpdCk7CiAJSU5JVF9XT1JLKCZ1c2JoaWQtPnJlc2V0X3dvcmssIGhpZF9yZXNldCk7Ci0JSU5JVF9XT1JLKCZ1c2JoaWQtPnJlc3RhcnRfd29yaywgX191c2JoaWRfcmVzdGFydF9xdWV1ZXMpOwogCXNldHVwX3RpbWVyKCZ1c2JoaWQtPmlvX3JldHJ5LCBoaWRfcmV0cnlfdGltZW91dCwgKHVuc2lnbmVkIGxvbmcpIGhpZCk7CiAJc3Bpbl9sb2NrX2luaXQoJnVzYmhpZC0+bG9jayk7CiAKIAlyZXQgPSBoaWRfYWRkX2RldmljZShoaWQpOwogCWlmIChyZXQpIHsKIAkJaWYgKHJldCAhPSAtRU5PREVWKQotCQkJZGV2X2VycigmaW50Zi0+ZGV2LCAiY2FuJ3QgYWRkIGhpZCBkZXZpY2U6ICVkXG4iLCByZXQpOworCQkJaGlkX2VycihpbnRmLCAiY2FuJ3QgYWRkIGhpZCBkZXZpY2U6ICVkXG4iLCByZXQpOwogCQlnb3RvIGVycl9mcmVlOwogCX0KIApAQCAtMTI0MSw3ICsxMjI4LDYgQEAKIHN0YXRpYyB2b2lkIGhpZF9jYW5jZWxfZGVsYXllZF9zdHVmZihzdHJ1Y3QgdXNiaGlkX2RldmljZSAqdXNiaGlkKQogewogCWRlbF90aW1lcl9zeW5jKCZ1c2JoaWQtPmlvX3JldHJ5KTsKLQljYW5jZWxfd29ya19zeW5jKCZ1c2JoaWQtPnJlc3RhcnRfd29yayk7CiAJY2FuY2VsX3dvcmtfc3luYygmdXNiaGlkLT5yZXNldF93b3JrKTsKIH0KIApAQCAtMTI2Miw3ICsxMjQ4LDYgQEAKIAlzcGluX2xvY2tfaXJxKCZ1c2JoaWQtPmxvY2spOwogCXNldF9iaXQoSElEX1JFU0VUX1BFTkRJTkcsICZ1c2JoaWQtPmlvZmwpOwogCXNwaW5fdW5sb2NrX2lycSgmdXNiaGlkLT5sb2NrKTsKLQljYW5jZWxfd29ya19zeW5jKCZ1c2JoaWQtPnJlc3RhcnRfd29yayk7CiAJaGlkX2NlYXNlX2lvKHVzYmhpZCk7CiAKIAlyZXR1cm4gMDsKQEAgLTE0NjEsOSArMTQ0Niw2IEBACiB7CiAJaW50IHJldHZhbCA9IC1FTk9NRU07CiAKLQlyZXN1bXB0aW9uX3dha2VyID0gY3JlYXRlX2ZyZWV6ZWFibGVfd29ya3F1ZXVlKCJ1c2JoaWRfcmVzdW1lciIpOwotCWlmICghcmVzdW1wdGlvbl93YWtlcikKLQkJZ290byBub19xdWV1ZTsKIAlyZXR2YWwgPSBoaWRfcmVnaXN0ZXJfZHJpdmVyKCZoaWRfdXNiX2RyaXZlcik7CiAJaWYgKHJldHZhbCkKIAkJZ290byBoaWRfcmVnaXN0ZXJfZmFpbDsKQEAgLTE0ODEsOCArMTQ2Myw2IEBACiB1c2JoaWRfcXVpcmtzX2luaXRfZmFpbDoKIAloaWRfdW5yZWdpc3Rlcl9kcml2ZXIoJmhpZF91c2JfZHJpdmVyKTsKIGhpZF9yZWdpc3Rlcl9mYWlsOgotCWRlc3Ryb3lfd29ya3F1ZXVlKHJlc3VtcHRpb25fd2FrZXIpOwotbm9fcXVldWU6CiAJcmV0dXJuIHJldHZhbDsKIH0KIApAQCAtMTQ5MSw3ICsxNDcxLDYgQEAKIAl1c2JfZGVyZWdpc3RlcigmaGlkX2RyaXZlcik7CiAJdXNiaGlkX3F1aXJrc19leGl0KCk7CiAJaGlkX3VucmVnaXN0ZXJfZHJpdmVyKCZoaWRfdXNiX2RyaXZlcik7Ci0JZGVzdHJveV93b3JrcXVldWUocmVzdW1wdGlvbl93YWtlcik7CiB9CiAKIG1vZHVsZV9pbml0KGhpZF9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL3VzYmhpZC9oaWQtcGlkZmYuYyBiL2RyaXZlcnMvaGlkL3VzYmhpZC9oaWQtcGlkZmYuYwppbmRleCBlZjM4MWQ3Li5mOTFjMTM2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC91c2JoaWQvaGlkLXBpZGZmLmMKKysrIGIvZHJpdmVycy9oaWQvdXNiaGlkL2hpZC1waWRmZi5jCkBAIC0yMiw3ICsyMiw3IEBACiAKIC8qICNkZWZpbmUgREVCVUcgKi8KIAotI2RlZmluZSBkZWJ1Zyhmb3JtYXQsIGFyZy4uLikgcHJfZGVidWcoImhpZC1waWRmZjogIiBmb3JtYXQgIlxuIiAsICMjIGFyZykKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKIAogI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgpAQCAtMjIwLDcgKzIyMCw3IEBACiBzdGF0aWMgdm9pZCBwaWRmZl9zZXQoc3RydWN0IHBpZGZmX3VzYWdlICp1c2FnZSwgdTE2IHZhbHVlKQogewogCXVzYWdlLT52YWx1ZVswXSA9IHBpZGZmX3Jlc2NhbGUodmFsdWUsIDB4ZmZmZiwgdXNhZ2UtPmZpZWxkKTsKLQlkZWJ1ZygiY2FsY3VsYXRlZCBmcm9tICVkIHRvICVkIiwgdmFsdWUsIHVzYWdlLT52YWx1ZVswXSk7CisJcHJfZGVidWcoImNhbGN1bGF0ZWQgZnJvbSAlZCB0byAlZFxuIiwgdmFsdWUsIHVzYWdlLT52YWx1ZVswXSk7CiB9CiAKIHN0YXRpYyB2b2lkIHBpZGZmX3NldF9zaWduZWQoc3RydWN0IHBpZGZmX3VzYWdlICp1c2FnZSwgczE2IHZhbHVlKQpAQCAtMjM1LDcgKzIzNSw3IEBACiAJCQl1c2FnZS0+dmFsdWVbMF0gPQogCQkJICAgIHBpZGZmX3Jlc2NhbGUodmFsdWUsIDB4N2ZmZiwgdXNhZ2UtPmZpZWxkKTsKIAl9Ci0JZGVidWcoImNhbGN1bGF0ZWQgZnJvbSAlZCB0byAlZCIsIHZhbHVlLCB1c2FnZS0+dmFsdWVbMF0pOworCXByX2RlYnVnKCJjYWxjdWxhdGVkIGZyb20gJWQgdG8gJWRcbiIsIHZhbHVlLCB1c2FnZS0+dmFsdWVbMF0pOwogfQogCiAvKgpAQCAtMjU5LDggKzI1OSw5IEBACiAJcGlkZmYtPnNldF9lbnZlbG9wZVtQSURfQVRUQUNLX1RJTUVdLnZhbHVlWzBdID0gZW52ZWxvcGUtPmF0dGFja19sZW5ndGg7CiAJcGlkZmYtPnNldF9lbnZlbG9wZVtQSURfRkFERV9USU1FXS52YWx1ZVswXSA9IGVudmVsb3BlLT5mYWRlX2xlbmd0aDsKIAotCWRlYnVnKCJhdHRhY2sgJXUgPT4gJWQiLCBlbnZlbG9wZS0+YXR0YWNrX2xldmVsLAotCSAgICAgIHBpZGZmLT5zZXRfZW52ZWxvcGVbUElEX0FUVEFDS19MRVZFTF0udmFsdWVbMF0pOworCWhpZF9kYmcocGlkZmYtPmhpZCwgImF0dGFjayAldSA9PiAlZFxuIiwKKwkJZW52ZWxvcGUtPmF0dGFja19sZXZlbCwKKwkJcGlkZmYtPnNldF9lbnZlbG9wZVtQSURfQVRUQUNLX0xFVkVMXS52YWx1ZVswXSk7CiAKIAl1c2JoaWRfc3VibWl0X3JlcG9ydChwaWRmZi0+aGlkLCBwaWRmZi0+cmVwb3J0c1tQSURfU0VUX0VOVkVMT1BFXSwKIAkJCSAgVVNCX0RJUl9PVVQpOwpAQCAtNDY2LDMzICs0NjcsMzMgQEAKIAlwaWRmZi0+Y3JlYXRlX25ld19lZmZlY3RfdHlwZS0+dmFsdWVbMF0gPSBlZm51bTsKIAl1c2JoaWRfc3VibWl0X3JlcG9ydChwaWRmZi0+aGlkLCBwaWRmZi0+cmVwb3J0c1tQSURfQ1JFQVRFX05FV19FRkZFQ1RdLAogCQkJICBVU0JfRElSX09VVCk7Ci0JZGVidWcoImNyZWF0ZV9uZXdfZWZmZWN0IHNlbnQsIHR5cGU6ICVkIiwgZWZudW0pOworCWhpZF9kYmcocGlkZmYtPmhpZCwgImNyZWF0ZV9uZXdfZWZmZWN0IHNlbnQsIHR5cGU6ICVkXG4iLCBlZm51bSk7CiAKIAlwaWRmZi0+YmxvY2tfbG9hZFtQSURfRUZGRUNUX0JMT0NLX0lOREVYXS52YWx1ZVswXSA9IDA7CiAJcGlkZmYtPmJsb2NrX2xvYWRfc3RhdHVzLT52YWx1ZVswXSA9IDA7CiAJdXNiaGlkX3dhaXRfaW8ocGlkZmYtPmhpZCk7CiAKIAlmb3IgKGogPSAwOyBqIDwgNjA7IGorKykgewotCQlkZWJ1ZygicGlkX2Jsb2NrX2xvYWQgcmVxdWVzdGVkIik7CisJCWhpZF9kYmcocGlkZmYtPmhpZCwgInBpZF9ibG9ja19sb2FkIHJlcXVlc3RlZFxuIik7CiAJCXVzYmhpZF9zdWJtaXRfcmVwb3J0KHBpZGZmLT5oaWQsIHBpZGZmLT5yZXBvcnRzW1BJRF9CTE9DS19MT0FEXSwKIAkJCQkgIFVTQl9ESVJfSU4pOwogCQl1c2JoaWRfd2FpdF9pbyhwaWRmZi0+aGlkKTsKIAkJaWYgKHBpZGZmLT5ibG9ja19sb2FkX3N0YXR1cy0+dmFsdWVbMF0gPT0KIAkJICAgIHBpZGZmLT5zdGF0dXNfaWRbUElEX0JMT0NLX0xPQURfU1VDQ0VTU10pIHsKLQkJCWRlYnVnKCJkZXZpY2UgcmVwb3J0ZWQgZnJlZSBtZW1vcnk6ICVkIGJ5dGVzIiwKLQkJCSAgICAgIHBpZGZmLT5ibG9ja19sb2FkW1BJRF9SQU1fUE9PTF9BVkFJTEFCTEVdLnZhbHVlID8KLQkJCQlwaWRmZi0+YmxvY2tfbG9hZFtQSURfUkFNX1BPT0xfQVZBSUxBQkxFXS52YWx1ZVswXSA6IC0xKTsKKwkJCWhpZF9kYmcocGlkZmYtPmhpZCwgImRldmljZSByZXBvcnRlZCBmcmVlIG1lbW9yeTogJWQgYnl0ZXNcbiIsCisJCQkJIHBpZGZmLT5ibG9ja19sb2FkW1BJRF9SQU1fUE9PTF9BVkFJTEFCTEVdLnZhbHVlID8KKwkJCQkgcGlkZmYtPmJsb2NrX2xvYWRbUElEX1JBTV9QT09MX0FWQUlMQUJMRV0udmFsdWVbMF0gOiAtMSk7CiAJCQlyZXR1cm4gMDsKIAkJfQogCQlpZiAocGlkZmYtPmJsb2NrX2xvYWRfc3RhdHVzLT52YWx1ZVswXSA9PQogCQkgICAgcGlkZmYtPnN0YXR1c19pZFtQSURfQkxPQ0tfTE9BRF9GVUxMXSkgewotCQkJZGVidWcoIm5vdCBlbm91Z2ggbWVtb3J5IGZyZWU6ICVkIGJ5dGVzIiwKLQkJCSAgICAgIHBpZGZmLT5ibG9ja19sb2FkW1BJRF9SQU1fUE9PTF9BVkFJTEFCTEVdLnZhbHVlID8KKwkJCWhpZF9kYmcocGlkZmYtPmhpZCwgIm5vdCBlbm91Z2ggbWVtb3J5IGZyZWU6ICVkIGJ5dGVzXG4iLAorCQkJCXBpZGZmLT5ibG9ja19sb2FkW1BJRF9SQU1fUE9PTF9BVkFJTEFCTEVdLnZhbHVlID8KIAkJCQlwaWRmZi0+YmxvY2tfbG9hZFtQSURfUkFNX1BPT0xfQVZBSUxBQkxFXS52YWx1ZVswXSA6IC0xKTsKIAkJCXJldHVybiAtRU5PU1BDOwogCQl9CiAJfQotCXByaW50ayhLRVJOX0VSUiAiaGlkLXBpZGZmOiBwaWRfYmxvY2tfbG9hZCBmYWlsZWQgNjAgdGltZXNcbiIpOworCWhpZF9lcnIocGlkZmYtPmhpZCwgInBpZF9ibG9ja19sb2FkIGZhaWxlZCA2MCB0aW1lc1xuIik7CiAJcmV0dXJuIC1FSU87CiB9CiAKQEAgLTU0Niw3ICs1NDcsOCBAQAogCXN0cnVjdCBwaWRmZl9kZXZpY2UgKnBpZGZmID0gZGV2LT5mZi0+cHJpdmF0ZTsKIAlpbnQgcGlkX2lkID0gcGlkZmYtPnBpZF9pZFtlZmZlY3RfaWRdOwogCi0JZGVidWcoInN0YXJ0aW5nIHRvIGVyYXNlICVkLyVkIiwgZWZmZWN0X2lkLCBwaWRmZi0+cGlkX2lkW2VmZmVjdF9pZF0pOworCWhpZF9kYmcocGlkZmYtPmhpZCwgInN0YXJ0aW5nIHRvIGVyYXNlICVkLyVkXG4iLAorCQllZmZlY3RfaWQsIHBpZGZmLT5waWRfaWRbZWZmZWN0X2lkXSk7CiAJLyogV2FpdCBmb3IgdGhlIHF1ZXVlIHRvIGNsZWFyLiBXZSBkbyBub3Qgd2FudCBhIGZ1bGwgZmlmbyB0bwogCSAgIHByZXZlbnQgdGhlIGVmZmVjdCByZW1vdmFsLiAqLwogCXVzYmhpZF93YWl0X2lvKHBpZGZmLT5oaWQpOwpAQCAtNjA0LDggKzYwNiw3IEBACiAJCQkJdHlwZV9pZCA9IFBJRF9TQVdfRE9XTjsKIAkJCQlicmVhazsKIAkJCWRlZmF1bHQ6Ci0JCQkJcHJpbnRrKEtFUk5fRVJSCi0JCQkJICAgICAgICJoaWQtcGlkZmY6IGludmFsaWQgd2F2ZWZvcm1cbiIpOworCQkJCWhpZF9lcnIocGlkZmYtPmhpZCwgImludmFsaWQgd2F2ZWZvcm1cbiIpOwogCQkJCXJldHVybiAtRUlOVkFMOwogCQkJfQogCkBAIC02OTYsNyArNjk3LDcgQEAKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgotCQlwcmludGsoS0VSTl9FUlIgImhpZC1waWRmZjogaW52YWxpZCB0eXBlXG4iKTsKKwkJaGlkX2VycihwaWRmZi0+aGlkLCAiaW52YWxpZCB0eXBlXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC03MDQsNyArNzA1LDcgQEAKIAkJcGlkZmYtPnBpZF9pZFtlZmZlY3QtPmlkXSA9CiAJCSAgICBwaWRmZi0+YmxvY2tfbG9hZFtQSURfRUZGRUNUX0JMT0NLX0lOREVYXS52YWx1ZVswXTsKIAotCWRlYnVnKCJ1cGxvYWRlZCIpOworCWhpZF9kYmcocGlkZmYtPmhpZCwgInVwbG9hZGVkXG4iKTsKIAogCXJldHVybiAwOwogfQpAQCAtNzcwLDE0ICs3NzEsMTQgQEAKIAkJZm9yIChpID0gMDsgaSA8IHJlcG9ydC0+bWF4ZmllbGQ7IGkrKykgewogCQkJaWYgKHJlcG9ydC0+ZmllbGRbaV0tPm1heHVzYWdlICE9CiAJCQkgICAgcmVwb3J0LT5maWVsZFtpXS0+cmVwb3J0X2NvdW50KSB7Ci0JCQkJZGVidWcoIm1heHVzYWdlIGFuZCByZXBvcnRfY291bnQgZG8gbm90IG1hdGNoLCAiCi0JCQkJICAgICAgInNraXBwaW5nIik7CisJCQkJcHJfZGVidWcoIm1heHVzYWdlIGFuZCByZXBvcnRfY291bnQgZG8gbm90IG1hdGNoLCBza2lwcGluZ1xuIik7CiAJCQkJY29udGludWU7CiAJCQl9CiAJCQlmb3IgKGogPSAwOyBqIDwgcmVwb3J0LT5maWVsZFtpXS0+bWF4dXNhZ2U7IGorKykgewogCQkJCWlmIChyZXBvcnQtPmZpZWxkW2ldLT51c2FnZVtqXS5oaWQgPT0KIAkJCQkgICAgKEhJRF9VUF9QSUQgfCB0YWJsZVtrXSkpIHsKLQkJCQkJZGVidWcoImZvdW5kICVkIGF0ICVkLT4lZCIsIGssIGksIGopOworCQkJCQlwcl9kZWJ1ZygiZm91bmQgJWQgYXQgJWQtPiVkXG4iLAorCQkJCQkJIGssIGksIGopOwogCQkJCQl1c2FnZVtrXS5maWVsZCA9IHJlcG9ydC0+ZmllbGRbaV07CiAJCQkJCXVzYWdlW2tdLnZhbHVlID0KIAkJCQkJCSZyZXBvcnQtPmZpZWxkW2ldLT52YWx1ZVtqXTsKQEAgLTc4OSw3ICs3OTAsNyBAQAogCQkJCWJyZWFrOwogCQl9CiAJCWlmICghZm91bmQgJiYgc3RyaWN0KSB7Ci0JCQlkZWJ1ZygiZmFpbGVkIHRvIGxvY2F0ZSAlZCIsIGspOworCQkJcHJfZGVidWcoImZhaWxlZCB0byBsb2NhdGUgJWRcbiIsIGspOwogCQkJcmV0dXJuIC0xOwogCQl9CiAJfQpAQCAtODI2LDggKzgyNyw4IEBACiAJCQljb250aW51ZTsKIAkJcmV0ID0gcGlkZmZfY2hlY2tfdXNhZ2UocmVwb3J0LT5maWVsZFswXS0+bG9naWNhbCk7CiAJCWlmIChyZXQgIT0gLTEpIHsKLQkJCWRlYnVnKCJmb3VuZCB1c2FnZSAweCUwMnggZnJvbSBmaWVsZC0+bG9naWNhbCIsCi0JCQkgICAgICBwaWRmZl9yZXBvcnRzW3JldF0pOworCQkJaGlkX2RiZyhoaWQsICJmb3VuZCB1c2FnZSAweCUwMnggZnJvbSBmaWVsZC0+bG9naWNhbFxuIiwKKwkJCQlwaWRmZl9yZXBvcnRzW3JldF0pOwogCQkJcGlkZmYtPnJlcG9ydHNbcmV0XSA9IHJlcG9ydDsKIAkJCWNvbnRpbnVlOwogCQl9CkBAIC04NDUsOCArODQ2LDkgQEAKIAkJCWNvbnRpbnVlOwogCQlyZXQgPSBwaWRmZl9jaGVja191c2FnZShoaWQtPmNvbGxlY3Rpb25baSAtIDFdLnVzYWdlKTsKIAkJaWYgKHJldCAhPSAtMSAmJiAhcGlkZmYtPnJlcG9ydHNbcmV0XSkgewotCQkJZGVidWcoImZvdW5kIHVzYWdlIDB4JTAyeCBmcm9tIGNvbGxlY3Rpb24gYXJyYXkiLAotCQkJICAgICAgcGlkZmZfcmVwb3J0c1tyZXRdKTsKKwkJCWhpZF9kYmcoaGlkLAorCQkJCSJmb3VuZCB1c2FnZSAweCUwMnggZnJvbSBjb2xsZWN0aW9uIGFycmF5XG4iLAorCQkJCXBpZGZmX3JlcG9ydHNbcmV0XSk7CiAJCQlwaWRmZi0+cmVwb3J0c1tyZXRdID0gcmVwb3J0OwogCQl9CiAJfQpAQCAtODYxLDcgKzg2Myw3IEBACiAKIAlmb3IgKGkgPSAwOyBpIDw9IFBJRF9SRVFVSVJFRF9SRVBPUlRTOyBpKyspIHsKIAkJaWYgKCFwaWRmZi0+cmVwb3J0c1tpXSkgewotCQkJZGVidWcoIiVkIG1pc3NpbmciLCBpKTsKKwkJCWhpZF9kYmcocGlkZmYtPmhpZCwgIiVkIG1pc3NpbmdcbiIsIGkpOwogCQkJcmV0dXJuIDA7CiAJCX0KIAl9CkBAIC04ODQsOCArODg2LDcgQEAKIAkJCSAgICByZXBvcnQtPmZpZWxkW2ldLT5sb2dpY2FsX21pbmltdW0gPT0gMSkKIAkJCQlyZXR1cm4gcmVwb3J0LT5maWVsZFtpXTsKIAkJCWVsc2UgewotCQkJCXByaW50ayhLRVJOX0VSUiAiaGlkLXBpZGZmOiBsb2dpY2FsX21pbmltdW0gIgotCQkJCQkiaXMgbm90IDEgYXMgaXQgc2hvdWxkIGJlXG4iKTsKKwkJCQlwcl9lcnIoImxvZ2ljYWxfbWluaW11bSBpcyBub3QgMSBhcyBpdCBzaG91bGQgYmVcbiIpOwogCQkJCXJldHVybiBOVUxMOwogCQkJfQogCQl9CkBAIC05MjQsNyArOTI1LDcgQEAKICAqLwogc3RhdGljIGludCBwaWRmZl9maW5kX3NwZWNpYWxfZmllbGRzKHN0cnVjdCBwaWRmZl9kZXZpY2UgKnBpZGZmKQogewotCWRlYnVnKCJmaW5kaW5nIHNwZWNpYWwgZmllbGRzIik7CisJaGlkX2RiZyhwaWRmZi0+aGlkLCAiZmluZGluZyBzcGVjaWFsIGZpZWxkc1xuIik7CiAKIAlwaWRmZi0+Y3JlYXRlX25ld19lZmZlY3RfdHlwZSA9CiAJCXBpZGZmX2ZpbmRfc3BlY2lhbF9maWVsZChwaWRmZi0+cmVwb3J0c1tQSURfQ1JFQVRFX05FV19FRkZFQ1RdLApAQCAtOTQ1LDMyICs5NDYsMzAgQEAKIAkJcGlkZmZfZmluZF9zcGVjaWFsX2ZpZWxkKHBpZGZmLT5yZXBvcnRzW1BJRF9FRkZFQ1RfT1BFUkFUSU9OXSwKIAkJCQkJIDB4NzgsIDEpOwogCi0JZGVidWcoInNlYXJjaCBkb25lIik7CisJaGlkX2RiZyhwaWRmZi0+aGlkLCAic2VhcmNoIGRvbmVcbiIpOwogCiAJaWYgKCFwaWRmZi0+Y3JlYXRlX25ld19lZmZlY3RfdHlwZSB8fCAhcGlkZmYtPnNldF9lZmZlY3RfdHlwZSkgewotCQlwcmludGsoS0VSTl9FUlIgImhpZC1waWRmZjogZWZmZWN0IGxpc3RzIG5vdCBmb3VuZFxuIik7CisJCWhpZF9lcnIocGlkZmYtPmhpZCwgImVmZmVjdCBsaXN0cyBub3QgZm91bmRcbiIpOwogCQlyZXR1cm4gLTE7CiAJfQogCiAJaWYgKCFwaWRmZi0+ZWZmZWN0X2RpcmVjdGlvbikgewotCQlwcmludGsoS0VSTl9FUlIgImhpZC1waWRmZjogZGlyZWN0aW9uIGZpZWxkIG5vdCBmb3VuZFxuIik7CisJCWhpZF9lcnIocGlkZmYtPmhpZCwgImRpcmVjdGlvbiBmaWVsZCBub3QgZm91bmRcbiIpOwogCQlyZXR1cm4gLTE7CiAJfQogCiAJaWYgKCFwaWRmZi0+ZGV2aWNlX2NvbnRyb2wpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJoaWQtcGlkZmY6IGRldmljZSBjb250cm9sIGZpZWxkIG5vdCBmb3VuZFxuIik7CisJCWhpZF9lcnIocGlkZmYtPmhpZCwgImRldmljZSBjb250cm9sIGZpZWxkIG5vdCBmb3VuZFxuIik7CiAJCXJldHVybiAtMTsKIAl9CiAKIAlpZiAoIXBpZGZmLT5ibG9ja19sb2FkX3N0YXR1cykgewotCQlwcmludGsoS0VSTl9FUlIKLQkJICAgICAgICJoaWQtcGlkZmY6IGJsb2NrIGxvYWQgc3RhdHVzIGZpZWxkIG5vdCBmb3VuZFxuIik7CisJCWhpZF9lcnIocGlkZmYtPmhpZCwgImJsb2NrIGxvYWQgc3RhdHVzIGZpZWxkIG5vdCBmb3VuZFxuIik7CiAJCXJldHVybiAtMTsKIAl9CiAKIAlpZiAoIXBpZGZmLT5lZmZlY3Rfb3BlcmF0aW9uX3N0YXR1cykgewotCQlwcmludGsoS0VSTl9FUlIKLQkJICAgICAgICJoaWQtcGlkZmY6IGVmZmVjdCBvcGVyYXRpb24gZmllbGQgbm90IGZvdW5kXG4iKTsKKwkJaGlkX2VycihwaWRmZi0+aGlkLCAiZWZmZWN0IG9wZXJhdGlvbiBmaWVsZCBub3QgZm91bmRcbiIpOwogCQlyZXR1cm4gLTE7CiAJfQogCkBAIC05ODIsMjMgKzk4MSwyMiBAQAogCiAJaWYgKCFQSURGRl9GSU5EX1NQRUNJQUxfS0VZUyh0eXBlX2lkLCBjcmVhdGVfbmV3X2VmZmVjdF90eXBlLAogCQkJCSAgICAgZWZmZWN0X3R5cGVzKSkgewotCQlwcmludGsoS0VSTl9FUlIgImhpZC1waWRmZjogbm8gZWZmZWN0IHR5cGVzIGZvdW5kXG4iKTsKKwkJaGlkX2VycihwaWRmZi0+aGlkLCAibm8gZWZmZWN0IHR5cGVzIGZvdW5kXG4iKTsKIAkJcmV0dXJuIC0xOwogCX0KIAogCWlmIChQSURGRl9GSU5EX1NQRUNJQUxfS0VZUyhzdGF0dXNfaWQsIGJsb2NrX2xvYWRfc3RhdHVzLAogCQkJCSAgICBibG9ja19sb2FkX3N0YXR1cykgIT0KIAkJCXNpemVvZihwaWRmZl9ibG9ja19sb2FkX3N0YXR1cykpIHsKLQkJcHJpbnRrKEtFUk5fRVJSCi0JCSAgICAgICAiaGlkcGlkZmY6IGJsb2NrIGxvYWQgc3RhdHVzIGlkZW50aWZpZXJzIG5vdCBmb3VuZFxuIik7CisJCWhpZF9lcnIocGlkZmYtPmhpZCwKKwkJCSJibG9jayBsb2FkIHN0YXR1cyBpZGVudGlmaWVycyBub3QgZm91bmRcbiIpOwogCQlyZXR1cm4gLTE7CiAJfQogCiAJaWYgKFBJREZGX0ZJTkRfU1BFQ0lBTF9LRVlTKG9wZXJhdGlvbl9pZCwgZWZmZWN0X29wZXJhdGlvbl9zdGF0dXMsCiAJCQkJICAgIGVmZmVjdF9vcGVyYXRpb25fc3RhdHVzKSAhPQogCQkJc2l6ZW9mKHBpZGZmX2VmZmVjdF9vcGVyYXRpb25fc3RhdHVzKSkgewotCQlwcmludGsoS0VSTl9FUlIKLQkJICAgICAgICJoaWRwaWRmZjogZWZmZWN0IG9wZXJhdGlvbiBpZGVudGlmaWVycyBub3QgZm91bmRcbiIpOworCQloaWRfZXJyKHBpZGZmLT5oaWQsICJlZmZlY3Qgb3BlcmF0aW9uIGlkZW50aWZpZXJzIG5vdCBmb3VuZFxuIik7CiAJCXJldHVybiAtMTsKIAl9CiAKQEAgLTEwMTcsOCArMTAxNSw4IEBACiAJCWludCBwaWRmZl90eXBlID0gcGlkZmYtPnR5cGVfaWRbaV07CiAJCWlmIChwaWRmZi0+c2V0X2VmZmVjdF90eXBlLT51c2FnZVtwaWRmZl90eXBlXS5oaWQgIT0KIAkJICAgIHBpZGZmLT5jcmVhdGVfbmV3X2VmZmVjdF90eXBlLT51c2FnZVtwaWRmZl90eXBlXS5oaWQpIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiaGlkLXBpZGZmOiAiCi0JCQkgICAgICAgImVmZmVjdCB0eXBlIG51bWJlciAlZCBpcyBpbnZhbGlkXG4iLCBpKTsKKwkJCWhpZF9lcnIocGlkZmYtPmhpZCwKKwkJCQkiZWZmZWN0IHR5cGUgbnVtYmVyICVkIGlzIGludmFsaWRcbiIsIGkpOwogCQkJcmV0dXJuIC0xOwogCQl9CiAJfQpAQCAtMTA3MywyNyArMTA3MSwyMyBAQAogCWludCBlbnZlbG9wZV9vayA9IDA7CiAKIAlpZiAoUElERkZfRklORF9GSUVMRFMoc2V0X2VmZmVjdCwgUElEX1NFVF9FRkZFQ1QsIDEpKSB7Ci0JCXByaW50ayhLRVJOX0VSUgotCQkgICAgICAgImhpZC1waWRmZjogdW5rbm93biBzZXRfZWZmZWN0IHJlcG9ydCBsYXlvdXRcbiIpOworCQloaWRfZXJyKHBpZGZmLT5oaWQsICJ1bmtub3duIHNldF9lZmZlY3QgcmVwb3J0IGxheW91dFxuIik7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIAogCVBJREZGX0ZJTkRfRklFTERTKGJsb2NrX2xvYWQsIFBJRF9CTE9DS19MT0FELCAwKTsKIAlpZiAoIXBpZGZmLT5ibG9ja19sb2FkW1BJRF9FRkZFQ1RfQkxPQ0tfSU5ERVhdLnZhbHVlKSB7Ci0JCXByaW50ayhLRVJOX0VSUgotCQkgICAgICAgImhpZC1waWRmZjogdW5rbm93biBwaWRfYmxvY2tfbG9hZCByZXBvcnQgbGF5b3V0XG4iKTsKKwkJaGlkX2VycihwaWRmZi0+aGlkLCAidW5rbm93biBwaWRfYmxvY2tfbG9hZCByZXBvcnQgbGF5b3V0XG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCiAJaWYgKFBJREZGX0ZJTkRfRklFTERTKGVmZmVjdF9vcGVyYXRpb24sIFBJRF9FRkZFQ1RfT1BFUkFUSU9OLCAxKSkgewotCQlwcmludGsoS0VSTl9FUlIKLQkJICAgICAgICJoaWQtcGlkZmY6IHVua25vd24gZWZmZWN0X29wZXJhdGlvbiByZXBvcnQgbGF5b3V0XG4iKTsKKwkJaGlkX2VycihwaWRmZi0+aGlkLCAidW5rbm93biBlZmZlY3Rfb3BlcmF0aW9uIHJlcG9ydCBsYXlvdXRcbiIpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKIAlpZiAoUElERkZfRklORF9GSUVMRFMoYmxvY2tfZnJlZSwgUElEX0JMT0NLX0ZSRUUsIDEpKSB7Ci0JCXByaW50ayhLRVJOX0VSUgotCQkgICAgICAgImhpZC1waWRmZjogdW5rbm93biBwaWRfYmxvY2tfZnJlZSByZXBvcnQgbGF5b3V0XG4iKTsKKwkJaGlkX2VycihwaWRmZi0+aGlkLCAidW5rbm93biBwaWRfYmxvY2tfZnJlZSByZXBvcnQgbGF5b3V0XG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCkBAIC0xMTA1LDI3ICsxMDk5LDI2IEBACiAKIAlpZiAoIWVudmVsb3BlX29rKSB7CiAJCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoRkZfQ09OU1RBTlQsIGRldi0+ZmZiaXQpKQotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiaGlkLXBpZGZmOiAiCi0JCQkgICAgICAgImhhcyBjb25zdGFudCBlZmZlY3QgYnV0IG5vIGVudmVsb3BlXG4iKTsKKwkJCWhpZF93YXJuKHBpZGZmLT5oaWQsCisJCQkJICJoYXMgY29uc3RhbnQgZWZmZWN0IGJ1dCBubyBlbnZlbG9wZVxuIik7CiAJCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoRkZfUkFNUCwgZGV2LT5mZmJpdCkpCi0JCQlwcmludGsoS0VSTl9XQVJOSU5HICJoaWQtcGlkZmY6ICIKLQkJCQkiaGFzIHJhbXAgZWZmZWN0IGJ1dCBubyBlbnZlbG9wZVxuIik7CisJCQloaWRfd2FybihwaWRmZi0+aGlkLAorCQkJCSAiaGFzIHJhbXAgZWZmZWN0IGJ1dCBubyBlbnZlbG9wZVxuIik7CiAKIAkJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChGRl9QRVJJT0RJQywgZGV2LT5mZmJpdCkpCi0JCQlwcmludGsoS0VSTl9XQVJOSU5HICJoaWQtcGlkZmY6ICIKLQkJCQkiaGFzIHBlcmlvZGljIGVmZmVjdCBidXQgbm8gZW52ZWxvcGVcbiIpOworCQkJaGlkX3dhcm4ocGlkZmYtPmhpZCwKKwkJCQkgImhhcyBwZXJpb2RpYyBlZmZlY3QgYnV0IG5vIGVudmVsb3BlXG4iKTsKIAl9CiAKIAlpZiAodGVzdF9iaXQoRkZfQ09OU1RBTlQsIGRldi0+ZmZiaXQpICYmCiAJICAgIFBJREZGX0ZJTkRfRklFTERTKHNldF9jb25zdGFudCwgUElEX1NFVF9DT05TVEFOVCwgMSkpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORwotCQkgICAgICAgImhpZC1waWRmZjogdW5rbm93biBjb25zdGFudCBlZmZlY3QgbGF5b3V0XG4iKTsKKwkJaGlkX3dhcm4ocGlkZmYtPmhpZCwgInVua25vd24gY29uc3RhbnQgZWZmZWN0IGxheW91dFxuIik7CiAJCWNsZWFyX2JpdChGRl9DT05TVEFOVCwgZGV2LT5mZmJpdCk7CiAJfQogCiAJaWYgKHRlc3RfYml0KEZGX1JBTVAsIGRldi0+ZmZiaXQpICYmCiAJICAgIFBJREZGX0ZJTkRfRklFTERTKHNldF9yYW1wLCBQSURfU0VUX1JBTVAsIDEpKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgImhpZC1waWRmZjogdW5rbm93biByYW1wIGVmZmVjdCBsYXlvdXRcbiIpOworCQloaWRfd2FybihwaWRmZi0+aGlkLCAidW5rbm93biByYW1wIGVmZmVjdCBsYXlvdXRcbiIpOwogCQljbGVhcl9iaXQoRkZfUkFNUCwgZGV2LT5mZmJpdCk7CiAJfQogCkBAIC0xMTM0LDggKzExMjcsNyBAQAogCSAgICAgdGVzdF9iaXQoRkZfRlJJQ1RJT04sIGRldi0+ZmZiaXQpIHx8CiAJICAgICB0ZXN0X2JpdChGRl9JTkVSVElBLCBkZXYtPmZmYml0KSkgJiYKIAkgICAgUElERkZfRklORF9GSUVMRFMoc2V0X2NvbmRpdGlvbiwgUElEX1NFVF9DT05ESVRJT04sIDEpKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcKLQkJICAgICAgICJoaWQtcGlkZmY6IHVua25vd24gY29uZGl0aW9uIGVmZmVjdCBsYXlvdXRcbiIpOworCQloaWRfd2FybihwaWRmZi0+aGlkLCAidW5rbm93biBjb25kaXRpb24gZWZmZWN0IGxheW91dFxuIik7CiAJCWNsZWFyX2JpdChGRl9TUFJJTkcsIGRldi0+ZmZiaXQpOwogCQljbGVhcl9iaXQoRkZfREFNUEVSLCBkZXYtPmZmYml0KTsKIAkJY2xlYXJfYml0KEZGX0ZSSUNUSU9OLCBkZXYtPmZmYml0KTsKQEAgLTExNDQsOCArMTEzNiw3IEBACiAKIAlpZiAodGVzdF9iaXQoRkZfUEVSSU9ESUMsIGRldi0+ZmZiaXQpICYmCiAJICAgIFBJREZGX0ZJTkRfRklFTERTKHNldF9wZXJpb2RpYywgUElEX1NFVF9QRVJJT0RJQywgMSkpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORwotCQkgICAgICAgImhpZC1waWRmZjogdW5rbm93biBwZXJpb2RpYyBlZmZlY3QgbGF5b3V0XG4iKTsKKwkJaGlkX3dhcm4ocGlkZmYtPmhpZCwgInVua25vd24gcGVyaW9kaWMgZWZmZWN0IGxheW91dFxuIik7CiAJCWNsZWFyX2JpdChGRl9QRVJJT0RJQywgZGV2LT5mZmJpdCk7CiAJfQogCkBAIC0xMTg0LDEyICsxMTc1LDEyIEBACiAJaWYgKHBpZGZmLT5wb29sW1BJRF9TSU1VTFRBTkVPVVNfTUFYXS52YWx1ZSkgewogCQl3aGlsZSAocGlkZmYtPnBvb2xbUElEX1NJTVVMVEFORU9VU19NQVhdLnZhbHVlWzBdIDwgMikgewogCQkJaWYgKGkrKyA+IDIwKSB7Ci0JCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiaGlkLXBpZGZmOiBkZXZpY2UgcmVwb3J0cyAiCi0JCQkJICAgICAgICIlZCBzaW11bHRhbmVvdXMgZWZmZWN0c1xuIiwKLQkJCQkgICAgICAgcGlkZmYtPnBvb2xbUElEX1NJTVVMVEFORU9VU19NQVhdLnZhbHVlWzBdKTsKKwkJCQloaWRfd2FybihwaWRmZi0+aGlkLAorCQkJCQkgImRldmljZSByZXBvcnRzICVkIHNpbXVsdGFuZW91cyBlZmZlY3RzXG4iLAorCQkJCQkgcGlkZmYtPnBvb2xbUElEX1NJTVVMVEFORU9VU19NQVhdLnZhbHVlWzBdKTsKIAkJCQlicmVhazsKIAkJCX0KLQkJCWRlYnVnKCJwaWRfcG9vbCByZXF1ZXN0ZWQgYWdhaW4iKTsKKwkJCWhpZF9kYmcocGlkZmYtPmhpZCwgInBpZF9wb29sIHJlcXVlc3RlZCBhZ2FpblxuIik7CiAJCQl1c2JoaWRfc3VibWl0X3JlcG9ydChoaWQsIHBpZGZmLT5yZXBvcnRzW1BJRF9QT09MXSwKIAkJCQkJICBVU0JfRElSX0lOKTsKIAkJCXVzYmhpZF93YWl0X2lvKGhpZCk7CkBAIC0xMjE1LDcgKzEyMDYsNyBAQAogCiAJZXJyb3IgPSBwaWRmZl9yZXF1ZXN0X2VmZmVjdF91cGxvYWQocGlkZmYsIDEpOwogCWlmIChlcnJvcikgewotCQlwcmludGsoS0VSTl9FUlIgImhpZC1waWRmZjogdXBsb2FkIHJlcXVlc3QgZmFpbGVkXG4iKTsKKwkJaGlkX2VycihwaWRmZi0+aGlkLCAidXBsb2FkIHJlcXVlc3QgZmFpbGVkXG4iKTsKIAkJcmV0dXJuIGVycm9yOwogCX0KIApAQCAtMTIyNCw4ICsxMjE1LDggQEAKIAkJcGlkZmZfYXV0b2NlbnRlcihwaWRmZiwgMHhmZmZmKTsKIAkJc2V0X2JpdChGRl9BVVRPQ0VOVEVSLCBkZXYtPmZmYml0KTsKIAl9IGVsc2UgewotCQlwcmludGsoS0VSTl9OT1RJQ0UgImhpZC1waWRmZjogIgotCQkgICAgICAgImRldmljZSBoYXMgdW5rbm93biBhdXRvY2VudGVyIGNvbnRyb2wgbWV0aG9kXG4iKTsKKwkJaGlkX25vdGljZShwaWRmZi0+aGlkLAorCQkJICAgImRldmljZSBoYXMgdW5rbm93biBhdXRvY2VudGVyIGNvbnRyb2wgbWV0aG9kXG4iKTsKIAl9CiAKIAlwaWRmZl9lcmFzZV9waWQocGlkZmYsCkBAIC0xMjQ4LDEwICsxMjM5LDEwIEBACiAJaW50IG1heF9lZmZlY3RzOwogCWludCBlcnJvcjsKIAotCWRlYnVnKCJzdGFydGluZyBwaWQgaW5pdCIpOworCWhpZF9kYmcoaGlkLCAic3RhcnRpbmcgcGlkIGluaXRcbiIpOwogCiAJaWYgKGxpc3RfZW1wdHkoJmhpZC0+cmVwb3J0X2VudW1bSElEX09VVFBVVF9SRVBPUlRdLnJlcG9ydF9saXN0KSkgewotCQlkZWJ1Zygibm90IGEgUElEIGRldmljZSwgbm8gb3V0cHV0IHJlcG9ydCIpOworCQloaWRfZGJnKGhpZCwgIm5vdCBhIFBJRCBkZXZpY2UsIG5vIG91dHB1dCByZXBvcnRcbiIpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKQEAgLTEyNjUsNyArMTI1Niw3IEBACiAJcGlkZmZfZmluZF9yZXBvcnRzKGhpZCwgSElEX0ZFQVRVUkVfUkVQT1JULCBwaWRmZik7CiAKIAlpZiAoIXBpZGZmX3JlcG9ydHNfb2socGlkZmYpKSB7Ci0JCWRlYnVnKCJyZXBvcnRzIG5vdCBvaywgYWJvcnRpbmciKTsKKwkJaGlkX2RiZyhoaWQsICJyZXBvcnRzIG5vdCBvaywgYWJvcnRpbmdcbiIpOwogCQllcnJvciA9IC1FTk9ERVY7CiAJCWdvdG8gZmFpbDsKIAl9CkBAIC0xMjc4LDggKzEyNjksOCBAQAogCiAJaWYgKHRlc3RfYml0KEZGX0dBSU4sIGRldi0+ZmZiaXQpKSB7CiAJCXBpZGZmX3NldCgmcGlkZmYtPmRldmljZV9nYWluW1BJRF9ERVZJQ0VfR0FJTl9GSUVMRF0sIDB4ZmZmZik7Ci0JCXVzYmhpZF9zdWJtaXRfcmVwb3J0KHBpZGZmLT5oaWQsIHBpZGZmLT5yZXBvcnRzW1BJRF9ERVZJQ0VfR0FJTl0sCi0JCQkJICBVU0JfRElSX09VVCk7CisJCXVzYmhpZF9zdWJtaXRfcmVwb3J0KGhpZCwgcGlkZmYtPnJlcG9ydHNbUElEX0RFVklDRV9HQUlOXSwKKwkJCQkgICAgIFVTQl9ESVJfT1VUKTsKIAl9CiAKIAllcnJvciA9IHBpZGZmX2NoZWNrX2F1dG9jZW50ZXIocGlkZmYsIGRldik7CkBAIC0xMjkwLDIzICsxMjgxLDIzIEBACiAJICAgIHBpZGZmLT5ibG9ja19sb2FkW1BJRF9FRkZFQ1RfQkxPQ0tfSU5ERVhdLmZpZWxkLT5sb2dpY2FsX21heGltdW0gLQogCSAgICBwaWRmZi0+YmxvY2tfbG9hZFtQSURfRUZGRUNUX0JMT0NLX0lOREVYXS5maWVsZC0+bG9naWNhbF9taW5pbXVtICsKIAkgICAgMTsKLQlkZWJ1ZygibWF4IGVmZmVjdHMgaXMgJWQiLCBtYXhfZWZmZWN0cyk7CisJaGlkX2RiZyhoaWQsICJtYXggZWZmZWN0cyBpcyAlZFxuIiwgbWF4X2VmZmVjdHMpOwogCiAJaWYgKG1heF9lZmZlY3RzID4gUElEX0VGRkVDVFNfTUFYKQogCQltYXhfZWZmZWN0cyA9IFBJRF9FRkZFQ1RTX01BWDsKIAogCWlmIChwaWRmZi0+cG9vbFtQSURfU0lNVUxUQU5FT1VTX01BWF0udmFsdWUpCi0JCWRlYnVnKCJtYXggc2ltdWx0YW5lb3VzIGVmZmVjdHMgaXMgJWQiLAotCQkgICAgICBwaWRmZi0+cG9vbFtQSURfU0lNVUxUQU5FT1VTX01BWF0udmFsdWVbMF0pOworCQloaWRfZGJnKGhpZCwgIm1heCBzaW11bHRhbmVvdXMgZWZmZWN0cyBpcyAlZFxuIiwKKwkJCXBpZGZmLT5wb29sW1BJRF9TSU1VTFRBTkVPVVNfTUFYXS52YWx1ZVswXSk7CiAKIAlpZiAocGlkZmYtPnBvb2xbUElEX1JBTV9QT09MX1NJWkVdLnZhbHVlKQotCQlkZWJ1ZygiZGV2aWNlIG1lbW9yeSBzaXplIGlzICVkIGJ5dGVzIiwKLQkJICAgICAgcGlkZmYtPnBvb2xbUElEX1JBTV9QT09MX1NJWkVdLnZhbHVlWzBdKTsKKwkJaGlkX2RiZyhoaWQsICJkZXZpY2UgbWVtb3J5IHNpemUgaXMgJWQgYnl0ZXNcbiIsCisJCQlwaWRmZi0+cG9vbFtQSURfUkFNX1BPT0xfU0laRV0udmFsdWVbMF0pOwogCiAJaWYgKHBpZGZmLT5wb29sW1BJRF9ERVZJQ0VfTUFOQUdFRF9QT09MXS52YWx1ZSAmJgogCSAgICBwaWRmZi0+cG9vbFtQSURfREVWSUNFX01BTkFHRURfUE9PTF0udmFsdWVbMF0gPT0gMCkgewotCQlwcmludGsoS0VSTl9OT1RJQ0UgImhpZC1waWRmZjogIgotCQkgICAgICAgImRldmljZSBkb2VzIG5vdCBzdXBwb3J0IGRldmljZSBtYW5hZ2VkIHBvb2xcbiIpOworCQloaWRfbm90aWNlKGhpZCwKKwkJCSAgICJkZXZpY2UgZG9lcyBub3Qgc3VwcG9ydCBkZXZpY2UgbWFuYWdlZCBwb29sXG4iKTsKIAkJZ290byBmYWlsOwogCX0KIApAQCAtMTMyMiw4ICsxMzEzLDcgQEAKIAlmZi0+c2V0X2F1dG9jZW50ZXIgPSBwaWRmZl9zZXRfYXV0b2NlbnRlcjsKIAlmZi0+cGxheWJhY2sgPSBwaWRmZl9wbGF5YmFjazsKIAotCXByaW50ayhLRVJOX0lORk8gIkZvcmNlIGZlZWRiYWNrIGZvciBVU0IgSElEIFBJRCBkZXZpY2VzIGJ5ICIKLQkgICAgICAgIkFuc3NpIEhhbm51bGEgPGFuc3NpLmhhbm51bGFAZ21haWwuY29tPlxuIik7CisJaGlkX2luZm8oZGV2LCAiRm9yY2UgZmVlZGJhY2sgZm9yIFVTQiBISUQgUElEIGRldmljZXMgYnkgQW5zc2kgSGFubnVsYSA8YW5zc2kuaGFubnVsYUBnbWFpbC5jb20+XG4iKTsKIAogCXJldHVybiAwOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC91c2JoaWQvaGlkLXF1aXJrcy5jIGIvZHJpdmVycy9oaWQvdXNiaGlkL2hpZC1xdWlya3MuYwppbmRleCAyYzE4NTQ3Li43NmI5YTE0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC91c2JoaWQvaGlkLXF1aXJrcy5jCisrKyBiL2RyaXZlcnMvaGlkL3VzYmhpZC9oaWQtcXVpcmtzLmMKQEAgLTg1LDcgKzg1LDcgQEAKIAl7IFVTQl9WRU5ET1JfSURfUElfRU5HSU5FRVJJTkcsIFVTQl9ERVZJQ0VfSURfUElfRU5HSU5FRVJJTkdfVkVDX1VTQl9GT09UUEVEQUwsIEhJRF9RVUlSS19ISURJTlBVVF9GT1JDRSB9LAogCiAJeyBVU0JfVkVORE9SX0lEX0NISUNPTlksIFVTQl9ERVZJQ0VfSURfQ0hJQ09OWV9NVUxUSV9UT1VDSCwgSElEX1FVSVJLX01VTFRJX0lOUFVUIH0sCi0KKwl7IFVTQl9WRU5ET1JfSURfQ0hJQ09OWSwgVVNCX0RFVklDRV9JRF9DSElDT05ZX1dJUkVMRVNTLCBISURfUVVJUktfTVVMVElfSU5QVVQgfSwKIAl7IDAsIDAgfQogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvdXNiaGlkL2hpZGRldi5jIGIvZHJpdmVycy9oaWQvdXNiaGlkL2hpZGRldi5jCmluZGV4IDk4NGZlYjMuLmFmMGE3YzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaGlkL3VzYmhpZC9oaWRkZXYuYworKysgYi9kcml2ZXJzL2hpZC91c2JoaWQvaGlkZGV2LmMKQEAgLTU4NSwxNjMgKzU4NSwxNjggQEAKIHsKIAlzdHJ1Y3QgaGlkZGV2X2xpc3QgKmxpc3QgPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAJc3RydWN0IGhpZGRldiAqaGlkZGV2ID0gbGlzdC0+aGlkZGV2OwotCXN0cnVjdCBoaWRfZGV2aWNlICpoaWQgPSBoaWRkZXYtPmhpZDsKLQlzdHJ1Y3QgdXNiX2RldmljZSAqZGV2OworCXN0cnVjdCBoaWRfZGV2aWNlICpoaWQ7CiAJc3RydWN0IGhpZGRldl9jb2xsZWN0aW9uX2luZm8gY2luZm87CiAJc3RydWN0IGhpZGRldl9yZXBvcnRfaW5mbyByaW5mbzsKIAlzdHJ1Y3QgaGlkZGV2X2ZpZWxkX2luZm8gZmluZm87CiAJc3RydWN0IGhpZGRldl9kZXZpbmZvIGRpbmZvOwogCXN0cnVjdCBoaWRfcmVwb3J0ICpyZXBvcnQ7CiAJc3RydWN0IGhpZF9maWVsZCAqZmllbGQ7Ci0Jc3RydWN0IHVzYmhpZF9kZXZpY2UgKnVzYmhpZCA9IGhpZC0+ZHJpdmVyX2RhdGE7CiAJdm9pZCBfX3VzZXIgKnVzZXJfYXJnID0gKHZvaWQgX191c2VyICopYXJnOwotCWludCBpLCByOwotCQorCWludCBpLCByID0gLUVJTlZBTDsKKwogCS8qIENhbGxlZCB3aXRob3V0IEJLTCBieSBjb21wYXQgbWV0aG9kcyBzbyBubyBCS0wgdGFrZW4gKi8KIAotCS8qIEZJWE1FOiBXaG8gb3Igd2hhdCBzdG9wIHRoaXMgcmFjaW5nIHdpdGggYSBkaXNjb25uZWN0ID8/ICovCi0JaWYgKCFoaWRkZXYtPmV4aXN0IHx8ICFoaWQpCi0JCXJldHVybiAtRUlPOworCW11dGV4X2xvY2soJmhpZGRldi0+ZXhpc3RhbmNlbG9jayk7CisJaWYgKCFoaWRkZXYtPmV4aXN0KSB7CisJCXIgPSAtRU5PREVWOworCQlnb3RvIHJldF91bmxvY2s7CisJfQogCi0JZGV2ID0gaGlkX3RvX3VzYl9kZXYoaGlkKTsKKwloaWQgPSBoaWRkZXYtPmhpZDsKIAogCXN3aXRjaCAoY21kKSB7CiAKIAljYXNlIEhJRElPQ0dWRVJTSU9OOgotCQlyZXR1cm4gcHV0X3VzZXIoSElEX1ZFUlNJT04sIChpbnQgX191c2VyICopYXJnKTsKKwkJciA9IHB1dF91c2VyKEhJRF9WRVJTSU9OLCAoaW50IF9fdXNlciAqKWFyZykgPworCQkJLUVGQVVMVCA6IDA7CisJCWJyZWFrOwogCiAJY2FzZSBISURJT0NBUFBMSUNBVElPTjoKIAkJaWYgKGFyZyA8IDAgfHwgYXJnID49IGhpZC0+bWF4YXBwbGljYXRpb24pCi0JCQlyZXR1cm4gLUVJTlZBTDsKKwkJCWJyZWFrOwogCiAJCWZvciAoaSA9IDA7IGkgPCBoaWQtPm1heGNvbGxlY3Rpb247IGkrKykKIAkJCWlmIChoaWQtPmNvbGxlY3Rpb25baV0udHlwZSA9PQogCQkJICAgIEhJRF9DT0xMRUNUSU9OX0FQUExJQ0FUSU9OICYmIGFyZy0tID09IDApCiAJCQkJYnJlYWs7CiAKLQkJaWYgKGkgPT0gaGlkLT5tYXhjb2xsZWN0aW9uKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkJcmV0dXJuIGhpZC0+Y29sbGVjdGlvbltpXS51c2FnZTsKKwkJaWYgKGkgPCBoaWQtPm1heGNvbGxlY3Rpb24pCisJCQlyID0gaGlkLT5jb2xsZWN0aW9uW2ldLnVzYWdlOworCQlicmVhazsKIAogCWNhc2UgSElESU9DR0RFVklORk86Ci0JCWRpbmZvLmJ1c3R5cGUgPSBCVVNfVVNCOwotCQlkaW5mby5idXNudW0gPSBkZXYtPmJ1cy0+YnVzbnVtOwotCQlkaW5mby5kZXZudW0gPSBkZXYtPmRldm51bTsKLQkJZGluZm8uaWZudW0gPSB1c2JoaWQtPmlmbnVtOwotCQlkaW5mby52ZW5kb3IgPSBsZTE2X3RvX2NwdShkZXYtPmRlc2NyaXB0b3IuaWRWZW5kb3IpOwotCQlkaW5mby5wcm9kdWN0ID0gbGUxNl90b19jcHUoZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCk7Ci0JCWRpbmZvLnZlcnNpb24gPSBsZTE2X3RvX2NwdShkZXYtPmRlc2NyaXB0b3IuYmNkRGV2aWNlKTsKLQkJZGluZm8ubnVtX2FwcGxpY2F0aW9ucyA9IGhpZC0+bWF4YXBwbGljYXRpb247Ci0JCWlmIChjb3B5X3RvX3VzZXIodXNlcl9hcmcsICZkaW5mbywgc2l6ZW9mKGRpbmZvKSkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKKwkJeworCQkJc3RydWN0IHVzYl9kZXZpY2UgKmRldiA9IGhpZF90b191c2JfZGV2KGhpZCk7CisJCQlzdHJ1Y3QgdXNiaGlkX2RldmljZSAqdXNiaGlkID0gaGlkLT5kcml2ZXJfZGF0YTsKIAotCQlyZXR1cm4gMDsKKwkJCWRpbmZvLmJ1c3R5cGUgPSBCVVNfVVNCOworCQkJZGluZm8uYnVzbnVtID0gZGV2LT5idXMtPmJ1c251bTsKKwkJCWRpbmZvLmRldm51bSA9IGRldi0+ZGV2bnVtOworCQkJZGluZm8uaWZudW0gPSB1c2JoaWQtPmlmbnVtOworCQkJZGluZm8udmVuZG9yID0gbGUxNl90b19jcHUoZGV2LT5kZXNjcmlwdG9yLmlkVmVuZG9yKTsKKwkJCWRpbmZvLnByb2R1Y3QgPSBsZTE2X3RvX2NwdShkZXYtPmRlc2NyaXB0b3IuaWRQcm9kdWN0KTsKKwkJCWRpbmZvLnZlcnNpb24gPSBsZTE2X3RvX2NwdShkZXYtPmRlc2NyaXB0b3IuYmNkRGV2aWNlKTsKKwkJCWRpbmZvLm51bV9hcHBsaWNhdGlvbnMgPSBoaWQtPm1heGFwcGxpY2F0aW9uOworCisJCQlyID0gY29weV90b191c2VyKHVzZXJfYXJnLCAmZGluZm8sIHNpemVvZihkaW5mbykpID8KKwkJCQktRUZBVUxUIDogMDsKKwkJCWJyZWFrOworCQl9CiAKIAljYXNlIEhJRElPQ0dGTEFHOgotCQlpZiAocHV0X3VzZXIobGlzdC0+ZmxhZ3MsIChpbnQgX191c2VyICopYXJnKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCi0JCXJldHVybiAwOworCQlyID0gcHV0X3VzZXIobGlzdC0+ZmxhZ3MsIChpbnQgX191c2VyICopYXJnKSA/CisJCQktRUZBVUxUIDogMDsKKwkJYnJlYWs7CiAKIAljYXNlIEhJRElPQ1NGTEFHOgogCQl7CiAJCQlpbnQgbmV3ZmxhZ3M7Ci0JCQlpZiAoZ2V0X3VzZXIobmV3ZmxhZ3MsIChpbnQgX191c2VyICopYXJnKSkKLQkJCQlyZXR1cm4gLUVGQVVMVDsKKworCQkJaWYgKGdldF91c2VyKG5ld2ZsYWdzLCAoaW50IF9fdXNlciAqKWFyZykpIHsKKwkJCQlyID0gLUVGQVVMVDsKKwkJCQlicmVhazsKKwkJCX0KIAogCQkJaWYgKChuZXdmbGFncyAmIH5ISURERVZfRkxBR1MpICE9IDAgfHwKIAkJCSAgICAoKG5ld2ZsYWdzICYgSElEREVWX0ZMQUdfUkVQT1JUKSAhPSAwICYmCiAJCQkgICAgIChuZXdmbGFncyAmIEhJRERFVl9GTEFHX1VSRUYpID09IDApKQotCQkJCXJldHVybiAtRUlOVkFMOworCQkJCWJyZWFrOwogCiAJCQlsaXN0LT5mbGFncyA9IG5ld2ZsYWdzOwogCi0JCQlyZXR1cm4gMDsKKwkJCXIgPSAwOworCQkJYnJlYWs7CiAJCX0KIAogCWNhc2UgSElESU9DR1NUUklORzoKLQkJbXV0ZXhfbG9jaygmaGlkZGV2LT5leGlzdGFuY2Vsb2NrKTsKLQkJaWYgKGhpZGRldi0+ZXhpc3QpCi0JCQlyID0gaGlkZGV2X2lvY3RsX3N0cmluZyhoaWRkZXYsIGNtZCwgdXNlcl9hcmcpOwotCQllbHNlCi0JCQlyID0gLUVOT0RFVjsKLQkJbXV0ZXhfdW5sb2NrKCZoaWRkZXYtPmV4aXN0YW5jZWxvY2spOwotCQlyZXR1cm4gcjsKKwkJciA9IGhpZGRldl9pb2N0bF9zdHJpbmcoaGlkZGV2LCBjbWQsIHVzZXJfYXJnKTsKKwkJYnJlYWs7CiAKIAljYXNlIEhJRElPQ0lOSVRSRVBPUlQ6Ci0JCW11dGV4X2xvY2soJmhpZGRldi0+ZXhpc3RhbmNlbG9jayk7Ci0JCWlmICghaGlkZGV2LT5leGlzdCkgewotCQkJbXV0ZXhfdW5sb2NrKCZoaWRkZXYtPmV4aXN0YW5jZWxvY2spOwotCQkJcmV0dXJuIC1FTk9ERVY7Ci0JCX0KIAkJdXNiaGlkX2luaXRfcmVwb3J0cyhoaWQpOwotCQltdXRleF91bmxvY2soJmhpZGRldi0+ZXhpc3RhbmNlbG9jayk7Ci0KLQkJcmV0dXJuIDA7CisJCXIgPSAwOworCQlicmVhazsKIAogCWNhc2UgSElESU9DR1JFUE9SVDoKLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZyaW5mbywgdXNlcl9hcmcsIHNpemVvZihyaW5mbykpKQotCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWlmIChjb3B5X2Zyb21fdXNlcigmcmluZm8sIHVzZXJfYXJnLCBzaXplb2YocmluZm8pKSkgeworCQkJciA9IC1FRkFVTFQ7CisJCQlicmVhazsKKwkJfQogCiAJCWlmIChyaW5mby5yZXBvcnRfdHlwZSA9PSBISURfUkVQT1JUX1RZUEVfT1VUUFVUKQotCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlicmVhazsKIAotCQlpZiAoKHJlcG9ydCA9IGhpZGRldl9sb29rdXBfcmVwb3J0KGhpZCwgJnJpbmZvKSkgPT0gTlVMTCkKLQkJCXJldHVybiAtRUlOVkFMOworCQlyZXBvcnQgPSBoaWRkZXZfbG9va3VwX3JlcG9ydChoaWQsICZyaW5mbyk7CisJCWlmIChyZXBvcnQgPT0gTlVMTCkKKwkJCWJyZWFrOwogCi0JCW11dGV4X2xvY2soJmhpZGRldi0+ZXhpc3RhbmNlbG9jayk7Ci0JCWlmIChoaWRkZXYtPmV4aXN0KSB7Ci0JCQl1c2JoaWRfc3VibWl0X3JlcG9ydChoaWQsIHJlcG9ydCwgVVNCX0RJUl9JTik7Ci0JCQl1c2JoaWRfd2FpdF9pbyhoaWQpOwotCQl9Ci0JCW11dGV4X3VubG9jaygmaGlkZGV2LT5leGlzdGFuY2Vsb2NrKTsKKwkJdXNiaGlkX3N1Ym1pdF9yZXBvcnQoaGlkLCByZXBvcnQsIFVTQl9ESVJfSU4pOworCQl1c2JoaWRfd2FpdF9pbyhoaWQpOwogCi0JCXJldHVybiAwOworCQlyID0gMDsKKwkJYnJlYWs7CiAKIAljYXNlIEhJRElPQ1NSRVBPUlQ6Ci0JCWlmIChjb3B5X2Zyb21fdXNlcigmcmluZm8sIHVzZXJfYXJnLCBzaXplb2YocmluZm8pKSkKLQkJCXJldHVybiAtRUZBVUxUOworCQlpZiAoY29weV9mcm9tX3VzZXIoJnJpbmZvLCB1c2VyX2FyZywgc2l6ZW9mKHJpbmZvKSkpIHsKKwkJCXIgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KIAogCQlpZiAocmluZm8ucmVwb3J0X3R5cGUgPT0gSElEX1JFUE9SVF9UWVBFX0lOUFVUKQotCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlicmVhazsKIAotCQlpZiAoKHJlcG9ydCA9IGhpZGRldl9sb29rdXBfcmVwb3J0KGhpZCwgJnJpbmZvKSkgPT0gTlVMTCkKLQkJCXJldHVybiAtRUlOVkFMOworCQlyZXBvcnQgPSBoaWRkZXZfbG9va3VwX3JlcG9ydChoaWQsICZyaW5mbyk7CisJCWlmIChyZXBvcnQgPT0gTlVMTCkKKwkJCWJyZWFrOwogCi0JCW11dGV4X2xvY2soJmhpZGRldi0+ZXhpc3RhbmNlbG9jayk7Ci0JCWlmIChoaWRkZXYtPmV4aXN0KSB7Ci0JCQl1c2JoaWRfc3VibWl0X3JlcG9ydChoaWQsIHJlcG9ydCwgVVNCX0RJUl9PVVQpOwotCQkJdXNiaGlkX3dhaXRfaW8oaGlkKTsKLQkJfQotCQltdXRleF91bmxvY2soJmhpZGRldi0+ZXhpc3RhbmNlbG9jayk7CisJCXVzYmhpZF9zdWJtaXRfcmVwb3J0KGhpZCwgcmVwb3J0LCBVU0JfRElSX09VVCk7CisJCXVzYmhpZF93YWl0X2lvKGhpZCk7CiAKLQkJcmV0dXJuIDA7CisJCXIgPSAwOworCQlicmVhazsKIAogCWNhc2UgSElESU9DR1JFUE9SVElORk86Ci0JCWlmIChjb3B5X2Zyb21fdXNlcigmcmluZm8sIHVzZXJfYXJnLCBzaXplb2YocmluZm8pKSkKLQkJCXJldHVybiAtRUZBVUxUOworCQlpZiAoY29weV9mcm9tX3VzZXIoJnJpbmZvLCB1c2VyX2FyZywgc2l6ZW9mKHJpbmZvKSkpIHsKKwkJCXIgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KIAotCQlpZiAoKHJlcG9ydCA9IGhpZGRldl9sb29rdXBfcmVwb3J0KGhpZCwgJnJpbmZvKSkgPT0gTlVMTCkKLQkJCXJldHVybiAtRUlOVkFMOworCQlyZXBvcnQgPSBoaWRkZXZfbG9va3VwX3JlcG9ydChoaWQsICZyaW5mbyk7CisJCWlmIChyZXBvcnQgPT0gTlVMTCkKKwkJCWJyZWFrOwogCiAJCXJpbmZvLm51bV9maWVsZHMgPSByZXBvcnQtPm1heGZpZWxkOwogCi0JCWlmIChjb3B5X3RvX3VzZXIodXNlcl9hcmcsICZyaW5mbywgc2l6ZW9mKHJpbmZvKSkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQotCQlyZXR1cm4gMDsKKwkJciA9IGNvcHlfdG9fdXNlcih1c2VyX2FyZywgJnJpbmZvLCBzaXplb2YocmluZm8pKSA/CisJCQktRUZBVUxUIDogMDsKKwkJYnJlYWs7CiAKIAljYXNlIEhJRElPQ0dGSUVMRElORk86Ci0JCWlmIChjb3B5X2Zyb21fdXNlcigmZmluZm8sIHVzZXJfYXJnLCBzaXplb2YoZmluZm8pKSkKLQkJCXJldHVybiAtRUZBVUxUOworCQlpZiAoY29weV9mcm9tX3VzZXIoJmZpbmZvLCB1c2VyX2FyZywgc2l6ZW9mKGZpbmZvKSkpIHsKKwkJCXIgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KKwogCQlyaW5mby5yZXBvcnRfdHlwZSA9IGZpbmZvLnJlcG9ydF90eXBlOwogCQlyaW5mby5yZXBvcnRfaWQgPSBmaW5mby5yZXBvcnRfaWQ7Ci0JCWlmICgocmVwb3J0ID0gaGlkZGV2X2xvb2t1cF9yZXBvcnQoaGlkLCAmcmluZm8pKSA9PSBOVUxMKQotCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJcmVwb3J0ID0gaGlkZGV2X2xvb2t1cF9yZXBvcnQoaGlkLCAmcmluZm8pOworCQlpZiAocmVwb3J0ID09IE5VTEwpCisJCQlicmVhazsKIAogCQlpZiAoZmluZm8uZmllbGRfaW5kZXggPj0gcmVwb3J0LT5tYXhmaWVsZCkKLQkJCXJldHVybiAtRUlOVkFMOworCQkJYnJlYWs7CiAKIAkJZmllbGQgPSByZXBvcnQtPmZpZWxkW2ZpbmZvLmZpZWxkX2luZGV4XTsKIAkJbWVtc2V0KCZmaW5mbywgMCwgc2l6ZW9mKGZpbmZvKSk7CkBAIC03NjAsMTAgKzc2NSw5IEBACiAJCWZpbmZvLnVuaXRfZXhwb25lbnQgPSBmaWVsZC0+dW5pdF9leHBvbmVudDsKIAkJZmluZm8udW5pdCA9IGZpZWxkLT51bml0OwogCi0JCWlmIChjb3B5X3RvX3VzZXIodXNlcl9hcmcsICZmaW5mbywgc2l6ZW9mKGZpbmZvKSkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQotCQlyZXR1cm4gMDsKKwkJciA9IGNvcHlfdG9fdXNlcih1c2VyX2FyZywgJmZpbmZvLCBzaXplb2YoZmluZm8pKSA/CisJCQktRUZBVUxUIDogMDsKKwkJYnJlYWs7CiAKIAljYXNlIEhJRElPQ0dVQ09ERToKIAkJLyogZmFsbCB0aHJvdWdoICovCkBAIC03NzIsNTcgKzc3Niw2NiBAQAogCWNhc2UgSElESU9DR1VTQUdFUzoKIAljYXNlIEhJRElPQ1NVU0FHRVM6CiAJY2FzZSBISURJT0NHQ09MTEVDVElPTklOREVYOgotCQltdXRleF9sb2NrKCZoaWRkZXYtPmV4aXN0YW5jZWxvY2spOwotCQlpZiAoaGlkZGV2LT5leGlzdCkKLQkJCXIgPSBoaWRkZXZfaW9jdGxfdXNhZ2UoaGlkZGV2LCBjbWQsIHVzZXJfYXJnKTsKLQkJZWxzZQotCQkJciA9IC1FTk9ERVY7Ci0JCW11dGV4X3VubG9jaygmaGlkZGV2LT5leGlzdGFuY2Vsb2NrKTsKLQkJcmV0dXJuIHI7CisJCXIgPSBoaWRkZXZfaW9jdGxfdXNhZ2UoaGlkZGV2LCBjbWQsIHVzZXJfYXJnKTsKKwkJYnJlYWs7CiAKIAljYXNlIEhJRElPQ0dDT0xMRUNUSU9OSU5GTzoKLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZjaW5mbywgdXNlcl9hcmcsIHNpemVvZihjaW5mbykpKQotCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWlmIChjb3B5X2Zyb21fdXNlcigmY2luZm8sIHVzZXJfYXJnLCBzaXplb2YoY2luZm8pKSkgeworCQkJciA9IC1FRkFVTFQ7CisJCQlicmVhazsKKwkJfQogCiAJCWlmIChjaW5mby5pbmRleCA+PSBoaWQtPm1heGNvbGxlY3Rpb24pCi0JCQlyZXR1cm4gLUVJTlZBTDsKKwkJCWJyZWFrOwogCiAJCWNpbmZvLnR5cGUgPSBoaWQtPmNvbGxlY3Rpb25bY2luZm8uaW5kZXhdLnR5cGU7CiAJCWNpbmZvLnVzYWdlID0gaGlkLT5jb2xsZWN0aW9uW2NpbmZvLmluZGV4XS51c2FnZTsKIAkJY2luZm8ubGV2ZWwgPSBoaWQtPmNvbGxlY3Rpb25bY2luZm8uaW5kZXhdLmxldmVsOwogCi0JCWlmIChjb3B5X3RvX3VzZXIodXNlcl9hcmcsICZjaW5mbywgc2l6ZW9mKGNpbmZvKSkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJcmV0dXJuIDA7CisJCXIgPSBjb3B5X3RvX3VzZXIodXNlcl9hcmcsICZjaW5mbywgc2l6ZW9mKGNpbmZvKSkgPworCQkJLUVGQVVMVCA6IDA7CisJCWJyZWFrOwogCiAJZGVmYXVsdDoKLQogCQlpZiAoX0lPQ19UWVBFKGNtZCkgIT0gJ0gnIHx8IF9JT0NfRElSKGNtZCkgIT0gX0lPQ19SRUFEKQotCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlicmVhazsKIAogCQlpZiAoX0lPQ19OUihjbWQpID09IF9JT0NfTlIoSElESU9DR05BTUUoMCkpKSB7CiAJCQlpbnQgbGVuOwotCQkJaWYgKCFoaWQtPm5hbWUpCi0JCQkJcmV0dXJuIDA7CisKKwkJCWlmICghaGlkLT5uYW1lKSB7CisJCQkJciA9IDA7CisJCQkJYnJlYWs7CisJCQl9CisKIAkJCWxlbiA9IHN0cmxlbihoaWQtPm5hbWUpICsgMTsKIAkJCWlmIChsZW4gPiBfSU9DX1NJWkUoY21kKSkKIAkJCQkgbGVuID0gX0lPQ19TSVpFKGNtZCk7Ci0JCQlyZXR1cm4gY29weV90b191c2VyKHVzZXJfYXJnLCBoaWQtPm5hbWUsIGxlbikgPworCQkJciA9IGNvcHlfdG9fdXNlcih1c2VyX2FyZywgaGlkLT5uYW1lLCBsZW4pID8KIAkJCQktRUZBVUxUIDogbGVuOworCQkJYnJlYWs7CiAJCX0KIAogCQlpZiAoX0lPQ19OUihjbWQpID09IF9JT0NfTlIoSElESU9DR1BIWVMoMCkpKSB7CiAJCQlpbnQgbGVuOwotCQkJaWYgKCFoaWQtPnBoeXMpCi0JCQkJcmV0dXJuIDA7CisKKwkJCWlmICghaGlkLT5waHlzKSB7CisJCQkJciA9IDA7CisJCQkJYnJlYWs7CisJCQl9CisKIAkJCWxlbiA9IHN0cmxlbihoaWQtPnBoeXMpICsgMTsKIAkJCWlmIChsZW4gPiBfSU9DX1NJWkUoY21kKSkKIAkJCQlsZW4gPSBfSU9DX1NJWkUoY21kKTsKLQkJCXJldHVybiBjb3B5X3RvX3VzZXIodXNlcl9hcmcsIGhpZC0+cGh5cywgbGVuKSA/CisJCQlyID0gY29weV90b191c2VyKHVzZXJfYXJnLCBoaWQtPnBoeXMsIGxlbikgPwogCQkJCS1FRkFVTFQgOiBsZW47CisJCQlicmVhazsKIAkJfQogCX0KLQlyZXR1cm4gLUVJTlZBTDsKKworcmV0X3VubG9jazoKKwltdXRleF91bmxvY2soJmhpZGRldi0+ZXhpc3RhbmNlbG9jayk7CisJcmV0dXJuIHI7CiB9CiAKICNpZmRlZiBDT05GSUdfQ09NUEFUCkBAIC04OTIsNyArOTA1LDcgQEAKIAloaWRkZXYtPmV4aXN0ID0gMTsKIAlyZXR2YWwgPSB1c2JfcmVnaXN0ZXJfZGV2KHVzYmhpZC0+aW50ZiwgJmhpZGRldl9jbGFzcyk7CiAJaWYgKHJldHZhbCkgewotCQllcnJfaGlkKCJOb3QgYWJsZSB0byBnZXQgYSBtaW5vciBmb3IgdGhpcyBkZXZpY2UuIik7CisJCWhpZF9lcnIoaGlkLCAiTm90IGFibGUgdG8gZ2V0IGEgbWlub3IgZm9yIHRoaXMgZGV2aWNlXG4iKTsKIAkJaGlkLT5oaWRkZXYgPSBOVUxMOwogCQlrZnJlZShoaWRkZXYpOwogCQlyZXR1cm4gLTE7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC91c2JoaWQvdXNiaGlkLmggYi9kcml2ZXJzL2hpZC91c2JoaWQvdXNiaGlkLmgKaW5kZXggODlkMmU4NC4uMTY3M2NhYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvdXNiaGlkL3VzYmhpZC5oCisrKyBiL2RyaXZlcnMvaGlkL3VzYmhpZC91c2JoaWQuaApAQCAtOTUsNyArOTUsNiBAQAogCXVuc2lnbmVkIGxvbmcgc3RvcF9yZXRyeTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUaW1lIHRvIGdpdmUgdXAsIGluIGppZmZpZXMgKi8KIAl1bnNpZ25lZCBpbnQgcmV0cnlfZGVsYXk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVsYXkgbGVuZ3RoIGluIG1zICovCiAJc3RydWN0IHdvcmtfc3RydWN0IHJlc2V0X3dvcms7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRhc2sgY29udGV4dCBmb3IgcmVzZXRzICovCi0Jc3RydWN0IHdvcmtfc3RydWN0IHJlc3RhcnRfd29yazsJCQkJLyogd2FraW5nIHVwIGZvciBvdXRwdXQgdG8gYmUgZG9uZSBpbiBhIHRhc2sgKi8KIAl3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0OwkJCQkJCS8qIEZvciBzbGVlcGluZyAqLwogCWludCBsZWRjb3VudDsJCQkJCQkJLyogY291bnRpbmcgdGhlIG51bWJlciBvZiBhY3RpdmUgbGVkcyAqLwogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL3VzYmhpZC91c2JrYmQuYyBiL2RyaXZlcnMvaGlkL3VzYmhpZC91c2JrYmQuYwppbmRleCBhOTQ4NjA1Li4wNjU4MTczIDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC91c2JoaWQvdXNia2JkLmMKKysrIGIvZHJpdmVycy9oaWQvdXNiaGlkL3VzYmtiZC5jCkBAIC0yNCw2ICsyNCw4IEBACiAgKiBWb2p0ZWNoIFBhdmxpaywgU2ltdW5rb3ZhIDE1OTQsIFByYWd1ZSA4LCAxODIgMDAgQ3plY2ggUmVwdWJsaWMKICAqLwogCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CkBAIC0xMDQsMTYgKzEwNiwxOCBAQAogCQkJaWYgKHVzYl9rYmRfa2V5Y29kZVtrYmQtPm9sZFtpXV0pCiAJCQkJaW5wdXRfcmVwb3J0X2tleShrYmQtPmRldiwgdXNiX2tiZF9rZXljb2RlW2tiZC0+b2xkW2ldXSwgMCk7CiAJCQllbHNlCi0JCQkJZGV2X2luZm8oJnVyYi0+ZGV2LT5kZXYsCi0JCQkJCQkiVW5rbm93biBrZXkgKHNjYW5jb2RlICUjeCkgcmVsZWFzZWQuXG4iLCBrYmQtPm9sZFtpXSk7CisJCQkJaGlkX2luZm8odXJiLT5kZXYsCisJCQkJCSAiVW5rbm93biBrZXkgKHNjYW5jb2RlICUjeCkgcmVsZWFzZWQuXG4iLAorCQkJCQkga2JkLT5vbGRbaV0pOwogCQl9CiAKIAkJaWYgKGtiZC0+bmV3W2ldID4gMyAmJiBtZW1zY2FuKGtiZC0+b2xkICsgMiwga2JkLT5uZXdbaV0sIDYpID09IGtiZC0+b2xkICsgOCkgewogCQkJaWYgKHVzYl9rYmRfa2V5Y29kZVtrYmQtPm5ld1tpXV0pCiAJCQkJaW5wdXRfcmVwb3J0X2tleShrYmQtPmRldiwgdXNiX2tiZF9rZXljb2RlW2tiZC0+bmV3W2ldXSwgMSk7CiAJCQllbHNlCi0JCQkJZGV2X2luZm8oJnVyYi0+ZGV2LT5kZXYsCi0JCQkJCQkiVW5rbm93biBrZXkgKHNjYW5jb2RlICUjeCkgcmVsZWFzZWQuXG4iLCBrYmQtPm5ld1tpXSk7CisJCQkJaGlkX2luZm8odXJiLT5kZXYsCisJCQkJCSAiVW5rbm93biBrZXkgKHNjYW5jb2RlICUjeCkgcmVsZWFzZWQuXG4iLAorCQkJCQkga2JkLT5uZXdbaV0pOwogCQl9CiAJfQogCkBAIC0xMjQsOSArMTI4LDkgQEAKIHJlc3VibWl0OgogCWkgPSB1c2Jfc3VibWl0X3VyYiAodXJiLCBHRlBfQVRPTUlDKTsKIAlpZiAoaSkKLQkJZXJyX2hpZCAoImNhbid0IHJlc3VibWl0IGludHIsICVzLSVzL2lucHV0MCwgc3RhdHVzICVkIiwKLQkJCQlrYmQtPnVzYmRldi0+YnVzLT5idXNfbmFtZSwKLQkJCQlrYmQtPnVzYmRldi0+ZGV2cGF0aCwgaSk7CisJCWhpZF9lcnIodXJiLT5kZXYsICJjYW4ndCByZXN1Ym1pdCBpbnRyLCAlcy0lcy9pbnB1dDAsIHN0YXR1cyAlZCIsCisJCQlrYmQtPnVzYmRldi0+YnVzLT5idXNfbmFtZSwKKwkJCWtiZC0+dXNiZGV2LT5kZXZwYXRoLCBpKTsKIH0KIAogc3RhdGljIGludCB1c2Jfa2JkX2V2ZW50KHN0cnVjdCBpbnB1dF9kZXYgKmRldiwgdW5zaWduZWQgaW50IHR5cGUsCkBAIC0xNTAsNyArMTU0LDcgQEAKIAkqKGtiZC0+bGVkcykgPSBrYmQtPm5ld2xlZHM7CiAJa2JkLT5sZWQtPmRldiA9IGtiZC0+dXNiZGV2OwogCWlmICh1c2Jfc3VibWl0X3VyYihrYmQtPmxlZCwgR0ZQX0FUT01JQykpCi0JCWVycl9oaWQoInVzYl9zdWJtaXRfdXJiKGxlZHMpIGZhaWxlZCIpOworCQlwcl9lcnIoInVzYl9zdWJtaXRfdXJiKGxlZHMpIGZhaWxlZFxuIik7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTE2MCw3ICsxNjQsNyBAQAogCXN0cnVjdCB1c2Jfa2JkICprYmQgPSB1cmItPmNvbnRleHQ7CiAKIAlpZiAodXJiLT5zdGF0dXMpCi0JCWRldl93YXJuKCZ1cmItPmRldi0+ZGV2LCAibGVkIHVyYiBzdGF0dXMgJWQgcmVjZWl2ZWRcbiIsCisJCWhpZF93YXJuKHVyYi0+ZGV2LCAibGVkIHVyYiBzdGF0dXMgJWQgcmVjZWl2ZWRcbiIsCiAJCQkgdXJiLT5zdGF0dXMpOwogCiAJaWYgKCooa2JkLT5sZWRzKSA9PSBrYmQtPm5ld2xlZHMpCkBAIC0xNjksNyArMTczLDcgQEAKIAkqKGtiZC0+bGVkcykgPSBrYmQtPm5ld2xlZHM7CiAJa2JkLT5sZWQtPmRldiA9IGtiZC0+dXNiZGV2OwogCWlmICh1c2Jfc3VibWl0X3VyYihrYmQtPmxlZCwgR0ZQX0FUT01JQykpCi0JCWVycl9oaWQoInVzYl9zdWJtaXRfdXJiKGxlZHMpIGZhaWxlZCIpOworCQloaWRfZXJyKHVyYi0+ZGV2LCAidXNiX3N1Ym1pdF91cmIobGVkcykgZmFpbGVkXG4iKTsKIH0KIAogc3RhdGljIGludCB1c2Jfa2JkX29wZW4oc3RydWN0IGlucHV0X2RldiAqZGV2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9LY29uZmlnIGIvZHJpdmVycy9od21vbi9LY29uZmlnCmluZGV4IGE1NmY2YWQuLmJkYzEzZDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vS2NvbmZpZworKysgYi9kcml2ZXJzL2h3bW9uL0tjb25maWcKQEAgLTI3NCw2ICsyNzQsMTYgQEAKIAkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKIAkgIHdpbGwgYmUgY2FsbGVkIGF0eHAxLgogCitjb25maWcgU0VOU09SU19EUzYyMAorCXRyaXN0YXRlICJEYWxsYXMgU2VtaWNvbmR1Y3RvciBEUzYyMCIKKwlkZXBlbmRzIG9uIEkyQworCWhlbHAKKwkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciBEYWxsYXMgU2VtaWNvbmR1Y3RvcgorCSAgRFM2MjAgc2Vuc29yIGNoaXAuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIGRzNjIwLgorCiBjb25maWcgU0VOU09SU19EUzE2MjEKIAl0cmlzdGF0ZSAiRGFsbGFzIFNlbWljb25kdWN0b3IgRFMxNjIxIGFuZCBEUzE2MjUiCiAJZGVwZW5kcyBvbiBJMkMKQEAgLTczNCw2ICs3NDQsMTYgQEAKIAkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKIAkgIHdpbGwgYmUgY2FsbGVkIHNodDE1LgogCitjb25maWcgU0VOU09SU19TSFQyMQorCXRyaXN0YXRlICJTZW5zaXJvbiBodW1pZGl0eSBhbmQgdGVtcGVyYXR1cmUgc2Vuc29ycy4gU0hUMjEgYW5kIGNvbXBhdC4iCisJZGVwZW5kcyBvbiBJMkMKKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgdGhlIFNlbnNpcm9uIFNIVDIxLCBTSFQyNQorCSAgaHVtaWRpdHkgYW5kIHRlbXBlcmF0dXJlIHNlbnNvcnMuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIHNodDIxLgorCiBjb25maWcgU0VOU09SU19TM0MKIAl0cmlzdGF0ZSAiU2Ftc3VuZyBidWlsdC1pbiBBREMiCiAJZGVwZW5kcyBvbiBTM0NfQURDCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL01ha2VmaWxlIGIvZHJpdmVycy9od21vbi9NYWtlZmlsZQppbmRleCAyNDc5YjNkLi5kZGUwMmQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvaHdtb24vTWFrZWZpbGUKQEAgLTQxLDYgKzQxLDcgQEAKIG9iai0kKENPTkZJR19TRU5TT1JTX0NPUkVURU1QKQkrPSBjb3JldGVtcC5vCiBvYmotJChDT05GSUdfU0VOU09SU19QS0dURU1QKQkrPSBwa2d0ZW1wLm8KIG9iai0kKENPTkZJR19TRU5TT1JTX0RNRTE3MzcpCSs9IGRtZTE3Mzcubworb2JqLSQoQ09ORklHX1NFTlNPUlNfRFM2MjApCSs9IGRzNjIwLm8KIG9iai0kKENPTkZJR19TRU5TT1JTX0RTMTYyMSkJKz0gZHMxNjIxLm8KIG9iai0kKENPTkZJR19TRU5TT1JTX0VNQzE0MDMpCSs9IGVtYzE0MDMubwogb2JqLSQoQ09ORklHX1NFTlNPUlNfRU1DMjEwMykJKz0gZW1jMjEwMy5vCkBAIC05MCw2ICs5MSw3IEBACiBvYmotJChDT05GSUdfU0VOU09SU19QQ0Y4NTkxKQkrPSBwY2Y4NTkxLm8KIG9iai0kKENPTkZJR19TRU5TT1JTX1MzQykJKz0gczNjLWh3bW9uLm8KIG9iai0kKENPTkZJR19TRU5TT1JTX1NIVDE1KQkrPSBzaHQxNS5vCitvYmotJChDT05GSUdfU0VOU09SU19TSFQyMSkJKz0gc2h0MjEubwogb2JqLSQoQ09ORklHX1NFTlNPUlNfU0lTNTU5NSkJKz0gc2lzNTU5NS5vCiBvYmotJChDT05GSUdfU0VOU09SU19TTU02NjUpCSs9IHNtbTY2NS5vCiBvYmotJChDT05GSUdfU0VOU09SU19TTVNDNDdCMzk3KSs9IHNtc2M0N2IzOTcubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9hYml0dWd1cnUuYyBiL2RyaXZlcnMvaHdtb24vYWJpdHVndXJ1LmMKaW5kZXggMDM2OTRjYy4uOGYwN2E5ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9hYml0dWd1cnUuYworKysgYi9kcml2ZXJzL2h3bW9uL2FiaXR1Z3VydS5jCkBAIC0yMCw2ICsyMCw5IEBACiAgICAgdGhlIGN1c3RvbSBBYml0IHVHdXJ1IGNoaXAgZm91bmQgb24gQWJpdCB1R3VydSBtb3RoZXJib2FyZHMuIE5vdGU6IGJlY2F1c2UKICAgICBvZiBsYWNrIG9mIHNwZWNzIHRoZSBDUFUvUkFNIHZvbHRhZ2UgJiBmcmVxdWVuY3kgY29udHJvbCBpcyBub3Qgc3VwcG9ydGVkIQogKi8KKworI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CkBAIC0yMjAsNiArMjIzLDEwIEBACiAJdTggcHdtX3NldHRpbmdzW0FCSVRfVUdVUlVfTUFYX1BXTVNdWzVdOwogfTsKIAorc3RhdGljIGNvbnN0IGNoYXIgKm5ldmVyX2hhcHBlbiA9ICJUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4uIjsKK3N0YXRpYyBjb25zdCBjaGFyICpyZXBvcnRfdGhpcyA9CisJIlBsZWFzZSByZXBvcnQgdGhpcyB0byB0aGUgYWJpdHVndXJ1IG1haW50YWluZXIgKHNlZSBNQUlOVEFJTkVSUykiOworCiAvKiB3YWl0IHRpbGwgdGhlIHVndXJ1IGlzIGluIHRoZSBzcGVjaWZpZWQgc3RhdGUgKi8KIHN0YXRpYyBpbnQgYWJpdHVndXJ1X3dhaXQoc3RydWN0IGFiaXR1Z3VydV9kYXRhICpkYXRhLCB1OCBzdGF0ZSkKIHsKQEAgLTQzOCw4ICs0NDUsNyBAQAogCiAJLyogVGVzdCB2YWwgaXMgc2FuZSAvIHVzYWJsZSBmb3Igc2Vuc29yIHR5cGUgZGV0ZWN0aW9uLiAqLwogCWlmICgodmFsIDwgMTB1KSB8fCAodmFsID4gMjUwdSkpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyBBQklUX1VHVVJVX05BTUUKLQkJCSI6IGJhbmsxLXNlbnNvcjogJWQgcmVhZGluZyAoJWQpIHRvbyBjbG9zZSB0byBsaW1pdHMsICIKKwkJcHJfd2FybigiYmFuazEtc2Vuc29yOiAlZCByZWFkaW5nICglZCkgdG9vIGNsb3NlIHRvIGxpbWl0cywgIgogCQkJInVuYWJsZSB0byBkZXRlcm1pbmUgc2Vuc29yIHR5cGUsIHNraXBwaW5nIHNlbnNvclxuIiwKIAkJCShpbnQpc2Vuc29yX2FkZHIsIChpbnQpdmFsKTsKIAkJLyogYXNzdW1lIG5vIHNlbnNvciBpcyB0aGVyZSBmb3Igc2Vuc29ycyBmb3Igd2hpY2ggd2UgY2FuJ3QKQEAgLTUzNSwxMCArNTQxLDggQEAKIAkJCQkzKSA9PSAzKQogCQkJYnJlYWs7CiAJaWYgKGkgPT0gMykgewotCQlwcmludGsoS0VSTl9FUlIgQUJJVF9VR1VSVV9OQU1FCi0JCQkiOiBGYXRhbCBlcnJvciBjb3VsZCBub3QgcmVzdG9yZSBvcmlnaW5hbCBzZXR0aW5ncy4gIgotCQkJIlRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiBwbGVhc2UgcmVwb3J0IHRoaXMgdG8gdGhlICIKLQkJCSJhYml0dWd1cnUgbWFpbnRhaW5lciAoc2VlIE1BSU5UQUlORVJTKVxuIik7CisJCXByX2VycigiRmF0YWwgZXJyb3IgY291bGQgbm90IHJlc3RvcmUgb3JpZ2luYWwgc2V0dGluZ3MuICVzICVzXG4iLAorCQkgICAgICAgbmV2ZXJfaGFwcGVuLCByZXBvcnRfdGhpcyk7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIAlyZXR1cm4gcmV0OwpAQCAtMTI2OCwxNCArMTI3MiwxMiBAQAogCX0KIAkvKiBGYWlsIHNhZmUgY2hlY2ssIHRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiEgKi8KIAlpZiAoc3lzZnNfbmFtZXNfZnJlZSA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSIEFCSVRfVUdVUlVfTkFNRSAiOiBGYXRhbCBlcnJvciByYW4gb3V0IG9mICIKLQkJICAgICAgICJzcGFjZSBmb3Igc3lzZnMgYXR0ciBuYW1lcy4gVGhpcyBzaG91bGQgbmV2ZXIgIgotCQkgICAgICAgImhhcHBlbiBwbGVhc2UgcmVwb3J0IHRvIHRoZSBhYml0dWd1cnUgbWFpbnRhaW5lciAiCi0JCSAgICAgICAiKHNlZSBNQUlOVEFJTkVSUylcbiIpOworCQlwcl9lcnIoIkZhdGFsIGVycm9yIHJhbiBvdXQgb2Ygc3BhY2UgZm9yIHN5c2ZzIGF0dHIgbmFtZXMuICVzICVzIiwKKwkJICAgICAgIG5ldmVyX2hhcHBlbiwgcmVwb3J0X3RoaXMpOwogCQlyZXMgPSAtRU5BTUVUT09MT05HOwogCQlnb3RvIGFiaXR1Z3VydV9wcm9iZV9lcnJvcjsKIAl9Ci0JcHJpbnRrKEtFUk5fSU5GTyBBQklUX1VHVVJVX05BTUUgIjogZm91bmQgQWJpdCB1R3VydVxuIik7CisJcHJfaW5mbygiZm91bmQgQWJpdCB1R3VydVxuIik7CiAKIAkvKiBSZWdpc3RlciBzeXNmcyBob29rcyAqLwogCWZvciAoaSA9IDA7IGkgPCBzeXNmc19hdHRyX2k7IGkrKykKQEAgLTE0MzIsOCArMTQzNCw3IEBACiAJCSIweCUwMlhcbiIsICh1bnNpZ25lZCBpbnQpZGF0YV92YWwsICh1bnNpZ25lZCBpbnQpY21kX3ZhbCk7CiAKIAlpZiAoZm9yY2UpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyBBQklUX1VHVVJVX05BTUUgIjogQXNzdW1pbmcgQWJpdCB1R3VydSBpcyAiCi0JCQkJInByZXNlbnQgYmVjYXVzZSBvZiBcImZvcmNlXCIgcGFyYW1ldGVyXG4iKTsKKwkJcHJfaW5mbygiQXNzdW1pbmcgQWJpdCB1R3VydSBpcyBwcmVzZW50IGJlY2F1c2Ugb2YgXCJmb3JjZVwiIHBhcmFtZXRlclxuIik7CiAJCXJldHVybiBBQklUX1VHVVJVX0JBU0U7CiAJfQogCkBAIC0xNDY3LDggKzE0NjgsNyBAQAogCiAJYWJpdHVndXJ1X3BkZXYgPSBwbGF0Zm9ybV9kZXZpY2VfYWxsb2MoQUJJVF9VR1VSVV9OQU1FLCBhZGRyZXNzKTsKIAlpZiAoIWFiaXR1Z3VydV9wZGV2KSB7Ci0JCXByaW50ayhLRVJOX0VSUiBBQklUX1VHVVJVX05BTUUKLQkJCSI6IERldmljZSBhbGxvY2F0aW9uIGZhaWxlZFxuIik7CisJCXByX2VycigiRGV2aWNlIGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKIAkJZXJyID0gLUVOT01FTTsKIAkJZ290byBleGl0X2RyaXZlcl91bnJlZ2lzdGVyOwogCX0KQEAgLTE0NzksMTUgKzE0NzksMTMgQEAKIAogCWVyciA9IHBsYXRmb3JtX2RldmljZV9hZGRfcmVzb3VyY2VzKGFiaXR1Z3VydV9wZGV2LCAmcmVzLCAxKTsKIAlpZiAoZXJyKSB7Ci0JCXByaW50ayhLRVJOX0VSUiBBQklUX1VHVVJVX05BTUUKLQkJCSI6IERldmljZSByZXNvdXJjZSBhZGRpdGlvbiBmYWlsZWQgKCVkKVxuIiwgZXJyKTsKKwkJcHJfZXJyKCJEZXZpY2UgcmVzb3VyY2UgYWRkaXRpb24gZmFpbGVkICglZClcbiIsIGVycik7CiAJCWdvdG8gZXhpdF9kZXZpY2VfcHV0OwogCX0KIAogCWVyciA9IHBsYXRmb3JtX2RldmljZV9hZGQoYWJpdHVndXJ1X3BkZXYpOwogCWlmIChlcnIpIHsKLQkJcHJpbnRrKEtFUk5fRVJSIEFCSVRfVUdVUlVfTkFNRQotCQkJIjogRGV2aWNlIGFkZGl0aW9uIGZhaWxlZCAoJWQpXG4iLCBlcnIpOworCQlwcl9lcnIoIkRldmljZSBhZGRpdGlvbiBmYWlsZWQgKCVkKVxuIiwgZXJyKTsKIAkJZ290byBleGl0X2RldmljZV9wdXQ7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2FiaXR1Z3VydTMuYyBiL2RyaXZlcnMvaHdtb24vYWJpdHVndXJ1My5jCmluZGV4IDNjZjI4YWYuLjQ4ZDIxZTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vYWJpdHVndXJ1My5jCisrKyBiL2RyaXZlcnMvaHdtb24vYWJpdHVndXJ1My5jCkBAIC0yMyw2ICsyMyw5IEBACiAgICAgY2hpcCBmb3VuZCBvbiBuZXdlciBBYml0IHVHdXJ1IG1vdGhlcmJvYXJkcy4gTm90ZTogYmVjYXVzZSBvZiBsYWNrIG9mIHNwZWNzCiAgICAgb25seSByZWFkaW5nIHRoZSBzZW5zb3JzIGFuZCB0aGVpciBzZXR0aW5ncyBpcyBzdXBwb3J0ZWQuCiAqLworCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgpAQCAtNjA4LDYgKzYxMSw5IEBACiBtb2R1bGVfcGFyYW0odmVyYm9zZSwgYm9vbCwgMDY0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKHZlcmJvc2UsICJFbmFibGUvZGlzYWJsZSB2ZXJib3NlIGVycm9yIHJlcG9ydGluZyIpOwogCitzdGF0aWMgY29uc3QgY2hhciAqbmV2ZXJfaGFwcGVuID0gIlRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbi4iOworc3RhdGljIGNvbnN0IGNoYXIgKnJlcG9ydF90aGlzID0KKwkiUGxlYXNlIHJlcG9ydCB0aGlzIHRvIHRoZSBhYml0dWd1cnUzIG1haW50YWluZXIgKHNlZSBNQUlOVEFJTkVSUykiOwogCiAvKiB3YWl0IHdoaWxlIHRoZSB1Z3VydSBpcyBidXN5ICh1c3VhbGx5IGFmdGVyIGEgd3JpdGUpICovCiBzdGF0aWMgaW50IGFiaXR1Z3VydTNfd2FpdF93aGlsZV9idXN5KHN0cnVjdCBhYml0dWd1cnUzX2RhdGEgKmRhdGEpCkBAIC05NDAsMTUgKzk0NiwxMyBAQAogCQlpZiAoYWJpdHVndXJ1M19tb3RoZXJib2FyZHNbaV0uaWQgPT0gaWQpCiAJCQlicmVhazsKIAlpZiAoIWFiaXR1Z3VydTNfbW90aGVyYm9hcmRzW2ldLmlkKSB7Ci0JCXByaW50ayhLRVJOX0VSUiBBQklUX1VHVVJVM19OQU1FICI6IGVycm9yIHVua25vd24gbW90aGVyYm9hcmQgIgotCQkJIklEOiAlMDRYLiBQbGVhc2UgcmVwb3J0IHRoaXMgdG8gdGhlIGFiaXR1Z3VydTMgIgotCQkJIm1haW50YWluZXIgKHNlZSBNQUlOVEFJTkVSUylcbiIsICh1bnNpZ25lZCBpbnQpaWQpOworCQlwcl9lcnIoImVycm9yIHVua25vd24gbW90aGVyYm9hcmQgSUQ6ICUwNFguICVzXG4iLAorCQkgICAgICAgKHVuc2lnbmVkIGludClpZCwgcmVwb3J0X3RoaXMpOwogCQlnb3RvIGFiaXR1Z3VydTNfcHJvYmVfZXJyb3I7CiAJfQogCWRhdGEtPnNlbnNvcnMgPSBhYml0dWd1cnUzX21vdGhlcmJvYXJkc1tpXS5zZW5zb3JzOwogCi0JcHJpbnRrKEtFUk5fSU5GTyBBQklUX1VHVVJVM19OQU1FICI6IGZvdW5kIEFiaXQgdUd1cnUzLCBtb3RoZXJib2FyZCAiCi0JCSJJRDogJTA0WFxuIiwgKHVuc2lnbmVkIGludClpZCk7CisJcHJfaW5mbygiZm91bmQgQWJpdCB1R3VydTMsIG1vdGhlcmJvYXJkIElEOiAlMDRYXG4iLCAodW5zaWduZWQgaW50KWlkKTsKIAogCS8qIEZpbGwgdGhlIHN5c2ZzIGF0dHIgYXJyYXkgKi8KIAlzeXNmc19hdHRyX2kgPSAwOwpAQCAtOTU3LDExICs5NjEsOCBAQAogCWZvciAoaSA9IDA7IGRhdGEtPnNlbnNvcnNbaV0ubmFtZTsgaSsrKSB7CiAJCS8qIEZhaWwgc2FmZSBjaGVjaywgdGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuISAqLwogCQlpZiAoaSA+PSBBQklUX1VHVVJVM19NQVhfTk9fU0VOU09SUykgewotCQkJcHJpbnRrKEtFUk5fRVJSIEFCSVRfVUdVUlUzX05BTUUKLQkJCQkiOiBGYXRhbCBlcnJvciBtb3RoZXJib2FyZCBoYXMgbW9yZSBzZW5zb3JzICIKLQkJCQkidGhlbiBBQklUX1VHVVJVM19NQVhfTk9fU0VOU09SUy4gVGhpcyBzaG91bGQgIgotCQkJCSJuZXZlciBoYXBwZW4gcGxlYXNlIHJlcG9ydCB0byB0aGUgYWJpdHVndXJ1MyAiCi0JCQkJIm1haW50YWluZXIgKHNlZSBNQUlOVEFJTkVSUylcbiIpOworCQkJcHJfZXJyKCJGYXRhbCBlcnJvciBtb3RoZXJib2FyZCBoYXMgbW9yZSBzZW5zb3JzIHRoZW4gQUJJVF9VR1VSVTNfTUFYX05PX1NFTlNPUlMuICVzICVzXG4iLAorCQkJICAgICAgIG5ldmVyX2hhcHBlbiwgcmVwb3J0X3RoaXMpOwogCQkJcmVzID0gLUVOQU1FVE9PTE9ORzsKIAkJCWdvdG8gYWJpdHVndXJ1M19wcm9iZV9lcnJvcjsKIAkJfQpAQCAtOTgzLDEwICs5ODQsOCBAQAogCX0KIAkvKiBGYWlsIHNhZmUgY2hlY2ssIHRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiEgKi8KIAlpZiAoc3lzZnNfbmFtZXNfZnJlZSA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSIEFCSVRfVUdVUlUzX05BTUUKLQkJCSI6IEZhdGFsIGVycm9yIHJhbiBvdXQgb2Ygc3BhY2UgZm9yIHN5c2ZzIGF0dHIgbmFtZXMuICIKLQkJCSJUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4gcGxlYXNlIHJlcG9ydCB0byB0aGUgIgotCQkJImFiaXR1Z3VydTMgbWFpbnRhaW5lciAoc2VlIE1BSU5UQUlORVJTKVxuIik7CisJCXByX2VycigiRmF0YWwgZXJyb3IgcmFuIG91dCBvZiBzcGFjZSBmb3Igc3lzZnMgYXR0ciBuYW1lcy4gJXMgJXNcbiIsCisJCSAgICAgICBuZXZlcl9oYXBwZW4sIHJlcG9ydF90aGlzKTsKIAkJcmVzID0gLUVOQU1FVE9PTE9ORzsKIAkJZ290byBhYml0dWd1cnUzX3Byb2JlX2Vycm9yOwogCX0KQEAgLTExODksOCArMTE4OCw3IEBACiAJCSIweCUwMlhcbiIsICh1bnNpZ25lZCBpbnQpZGF0YV92YWwsICh1bnNpZ25lZCBpbnQpY21kX3ZhbCk7CiAKIAlpZiAoZm9yY2UpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyBBQklUX1VHVVJVM19OQU1FICI6IEFzc3VtaW5nIEFiaXQgdUd1cnUzIGlzICIKLQkJCQkicHJlc2VudCBiZWNhdXNlIG9mIFwiZm9yY2VcIiBwYXJhbWV0ZXJcbiIpOworCQlwcl9pbmZvKCJBc3N1bWluZyBBYml0IHVHdXJ1MyBpcyBwcmVzZW50IGJlY2F1c2Ugb2YgXCJmb3JjZVwiIHBhcmFtZXRlclxuIik7CiAJCXJldHVybiAwOwogCX0KIApAQCAtMTIxOSwxMCArMTIxNyw4IEBACiAJCQlyZXR1cm4gZXJyOwogCiAjaWZkZWYgQ09ORklHX0RNSQotCQlwcmludGsoS0VSTl9XQVJOSU5HIEFCSVRfVUdVUlUzX05BTUUgIjogdGhpcyBtb3RoZXJib2FyZCB3YXMgIgotCQkJIm5vdCBkZXRlY3RlZCB1c2luZyBETUkuIFBsZWFzZSBzZW5kIHRoZSBvdXRwdXQgb2YgIgotCQkJIlwiZG1pZGVjb2RlXCIgdG8gdGhlIGFiaXR1Z3VydTMgbWFpbnRhaW5lciAiCi0JCQkiKHNlZSBNQUlOVEFJTkVSUylcbiIpOworCQlwcl93YXJuKCJ0aGlzIG1vdGhlcmJvYXJkIHdhcyBub3QgZGV0ZWN0ZWQgdXNpbmcgRE1JLiAiCisJCQkiUGxlYXNlIHNlbmQgdGhlIG91dHB1dCBvZiBcImRtaWRlY29kZVwiIHRvIHRoZSBhYml0dWd1cnUzIG1haW50YWluZXIgKHNlZSBNQUlOVEFJTkVSUylcbiIpOwogI2VuZGlmCiAJfQogCkBAIC0xMjMzLDggKzEyMjksNyBAQAogCWFiaXR1Z3VydTNfcGRldiA9IHBsYXRmb3JtX2RldmljZV9hbGxvYyhBQklUX1VHVVJVM19OQU1FLAogCQkJCQkJQUJJVF9VR1VSVTNfQkFTRSk7CiAJaWYgKCFhYml0dWd1cnUzX3BkZXYpIHsKLQkJcHJpbnRrKEtFUk5fRVJSIEFCSVRfVUdVUlUzX05BTUUKLQkJCSI6IERldmljZSBhbGxvY2F0aW9uIGZhaWxlZFxuIik7CisJCXByX2VycigiRGV2aWNlIGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKIAkJZXJyID0gLUVOT01FTTsKIAkJZ290byBleGl0X2RyaXZlcl91bnJlZ2lzdGVyOwogCX0KQEAgLTEyNDUsMTUgKzEyNDAsMTMgQEAKIAogCWVyciA9IHBsYXRmb3JtX2RldmljZV9hZGRfcmVzb3VyY2VzKGFiaXR1Z3VydTNfcGRldiwgJnJlcywgMSk7CiAJaWYgKGVycikgewotCQlwcmludGsoS0VSTl9FUlIgQUJJVF9VR1VSVTNfTkFNRQotCQkJIjogRGV2aWNlIHJlc291cmNlIGFkZGl0aW9uIGZhaWxlZCAoJWQpXG4iLCBlcnIpOworCQlwcl9lcnIoIkRldmljZSByZXNvdXJjZSBhZGRpdGlvbiBmYWlsZWQgKCVkKVxuIiwgZXJyKTsKIAkJZ290byBleGl0X2RldmljZV9wdXQ7CiAJfQogCiAJZXJyID0gcGxhdGZvcm1fZGV2aWNlX2FkZChhYml0dWd1cnUzX3BkZXYpOwogCWlmIChlcnIpIHsKLQkJcHJpbnRrKEtFUk5fRVJSIEFCSVRfVUdVUlUzX05BTUUKLQkJCSI6IERldmljZSBhZGRpdGlvbiBmYWlsZWQgKCVkKVxuIiwgZXJyKTsKKwkJcHJfZXJyKCJEZXZpY2UgYWRkaXRpb24gZmFpbGVkICglZClcbiIsIGVycik7CiAJCWdvdG8gZXhpdF9kZXZpY2VfcHV0OwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9hZHQ3NDcwLmMgYi9kcml2ZXJzL2h3bW9uL2FkdDc0NzAuYwppbmRleCA4N2Q5MmE1Li5jNmQxY2UwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL2FkdDc0NzAuYworKysgYi9kcml2ZXJzL2h3bW9uL2FkdDc0NzAuYwpAQCAtMTksNiArMTksOCBAQAogICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQogICovCiAKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKwogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KQEAgLTI3NCw3ICsyNzYsNyBAQAogCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBBRFQ3NDcwX1JFR19QV01fQ0ZHKDIpLCBwd21fY2ZnWzFdKTsKIAogCWlmIChyZXMpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJoYSBoYSwgaW50ZXJydXB0ZWQiKTsKKwkJcHJfZXJyKCJoYSBoYSwgaW50ZXJydXB0ZWRcbiIpOwogCQlyZXR1cm4gLUVBR0FJTjsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vYXBwbGVzbWMuYyBiL2RyaXZlcnMvaHdtb24vYXBwbGVzbWMuYwppbmRleCBiNjU5OGFhLi5jZTAzNzJmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL2FwcGxlc21jLmMKKysrIGIvZHJpdmVycy9od21vbi9hcHBsZXNtYy5jCkBAIC00LDYgKzQsNyBAQAogICogY29tcHV0ZXJzLgogICoKICAqIENvcHlyaWdodCAoQykgMjAwNyBOaWNvbGFzIEJvaWNoYXQgPG5pY29sYXNAYm9pY2hhdC5jaD4KKyAqIENvcHlyaWdodCAoQykgMjAxMCBIZW5yaWsgUnlkYmVyZyA8cnlkYmVyZ0BldXJvbWFpbC5zZT4KICAqCiAgKiBCYXNlZCBvbiBoZGFwcy5jIGRyaXZlcjoKICAqIENvcHlyaWdodCAoQykgMjAwNSBSb2JlcnQgTG92ZSA8cm1sQG5vdmVsbC5jb20+CkBAIC0yNiwxMCArMjcsMTMgQEAKICAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEsIFVTQQogICovCiAKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKwogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5wdXQtcG9sbGRldi5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC90aW1lci5oPgogI2luY2x1ZGUgPGxpbnV4L2RtaS5oPgpAQCAtNDksNiArNTMsNyBAQAogCiAjZGVmaW5lIEFQUExFU01DX01BWF9EQVRBX0xFTkdUSCAzMgogCisvKiB3YWl0IHVwIHRvIDMyIG1zIGZvciBhIHN0YXR1cyBjaGFuZ2UuICovCiAjZGVmaW5lIEFQUExFU01DX01JTl9XQUlUCTB4MDA0MAogI2RlZmluZSBBUFBMRVNNQ19NQVhfV0FJVAkweDgwMDAKIApAQCAtNzMsMTA0ICs3OCwxNSBAQAogCiAjZGVmaW5lIEZBTlNfQ09VTlQJCSJGTnVtIiAvKiByLW8gdWk4ICovCiAjZGVmaW5lIEZBTlNfTUFOVUFMCQkiRlMhICIgLyogci13IHVpMTYgKi8KLSNkZWZpbmUgRkFOX0FDVFVBTF9TUEVFRAkiRjBBYyIgLyogci1vIGZwZTIgKDIgYnl0ZXMpICovCi0jZGVmaW5lIEZBTl9NSU5fU1BFRUQJCSJGME1uIiAvKiByLW8gZnBlMiAoMiBieXRlcykgKi8KLSNkZWZpbmUgRkFOX01BWF9TUEVFRAkJIkYwTXgiIC8qIHItbyBmcGUyICgyIGJ5dGVzKSAqLwotI2RlZmluZSBGQU5fU0FGRV9TUEVFRAkJIkYwU2YiIC8qIHItbyBmcGUyICgyIGJ5dGVzKSAqLwotI2RlZmluZSBGQU5fVEFSR0VUX1NQRUVECSJGMFRnIiAvKiByLXcgZnBlMiAoMiBieXRlcykgKi8KLSNkZWZpbmUgRkFOX1BPU0lUSU9OCQkiRjBJRCIgLyogci1vIGNoYXJbMTZdICovCi0KLS8qCi0gKiBUZW1wZXJhdHVyZSBzZW5zb3JzIGtleXMgKHNwNzggLSAyIGJ5dGVzKS4KLSAqLwotc3RhdGljIGNvbnN0IGNoYXIgKnRlbXBlcmF0dXJlX3NlbnNvcnNfc2V0c1tdWzQxXSA9IHsKLS8qIFNldCAwOiBNYWNib29rIFBybyAqLwotCXsgIlRBMFAiLCAiVEIwVCIsICJUQzBEIiwgIlRDMFAiLCAiVEcwSCIsICJURzBQIiwgIlRHMFQiLCAiVGgwSCIsCi0JICAiVGgxSCIsICJUbTBQIiwgIlRzMFAiLCAiVHMxUCIsIE5VTEwgfSwKLS8qIFNldCAxOiBNYWNib29rMiBzZXQgKi8KLQl7ICJUQjBUIiwgIlRDMEQiLCAiVEMwUCIsICJUTTBQIiwgIlROMFAiLCAiVE4xUCIsICJUVEYwIiwgIlRoMEgiLAotCSAgIlRoMFMiLCAiVGgxSCIsIE5VTEwgfSwKLS8qIFNldCAyOiBNYWNib29rIHNldCAqLwotCXsgIlRCMFQiLCAiVEMwRCIsICJUQzBQIiwgIlRNMFAiLCAiVE4wUCIsICJUTjFQIiwgIlRoMEgiLCAiVGgwUyIsCi0JICAiVGgxSCIsICJUczBQIiwgTlVMTCB9LAotLyogU2V0IDM6IE1hY21pbmkgc2V0ICovCi0JeyAiVEMwRCIsICJUQzBQIiwgTlVMTCB9LAotLyogU2V0IDQ6IE1hYyBQcm8gKDIgeCBRdWFkLUNvcmUpICovCi0JeyAiVEEwUCIsICJUQ0FHIiwgIlRDQUgiLCAiVENCRyIsICJUQ0JIIiwgIlRDMEMiLCAiVEMwRCIsICJUQzBQIiwKLQkgICJUQzFDIiwgIlRDMUQiLCAiVEMyQyIsICJUQzJEIiwgIlRDM0MiLCAiVEMzRCIsICJUSFRHIiwgIlRIMFAiLAotCSAgIlRIMVAiLCAiVEgyUCIsICJUSDNQIiwgIlRNQVAiLCAiVE1BUyIsICJUTUJTIiwgIlRNMFAiLCAiVE0wUyIsCi0JICAiVE0xUCIsICJUTTFTIiwgIlRNMlAiLCAiVE0yUyIsICJUTTNTIiwgIlRNOFAiLCAiVE04UyIsICJUTTlQIiwKLQkgICJUTTlTIiwgIlROMEgiLCAiVFMwQyIsIE5VTEwgfSwKLS8qIFNldCA1OiBpTWFjICovCi0JeyAiVEMwRCIsICJUQTBQIiwgIlRHMFAiLCAiVEcwRCIsICJURzBIIiwgIlRIMFAiLCAiVG0wUCIsICJUTzBQIiwKLQkgICJUcDBDIiwgTlVMTCB9LAotLyogU2V0IDY6IE1hY2Jvb2szIHNldCAqLwotCXsgIlRCMFQiLCAiVEMwRCIsICJUQzBQIiwgIlRNMFAiLCAiVE4wUCIsICJUVEYwIiwgIlRXMFAiLCAiVGgwSCIsCi0JICAiVGgwUyIsICJUaDFIIiwgTlVMTCB9LAotLyogU2V0IDc6IE1hY2Jvb2sgQWlyICovCi0JeyAiVEIwVCIsICJUQjFTIiwgIlRCMVQiLCAiVEIyUyIsICJUQjJUIiwgIlRDMEQiLCAiVEMwUCIsICJUQ0ZQIiwKLQkgICJUVEYwIiwgIlRXMFAiLCAiVGgwSCIsICJUcDBQIiwgIlRwRlAiLCAiVHMwUCIsICJUczBTIiwgTlVMTCB9LAotLyogU2V0IDg6IE1hY2Jvb2sgUHJvIDQsMSAoUGVucnluKSAqLwotCXsgIlRCMFQiLCAiVEMwRCIsICJUQzBQIiwgIlRHMEQiLCAiVEcwSCIsICJUVEYwIiwgIlRXMFAiLCAiVGgwSCIsCi0JICAiVGgxSCIsICJUaDJIIiwgIlRtMFAiLCAiVHMwUCIsIE5VTEwgfSwKLS8qIFNldCA5OiBNYWNib29rIFBybyAzLDEgKFNhbnRhIFJvc2EpICovCi0JeyAiVEFMUCIsICJUQjBUIiwgIlRDMEQiLCAiVEMwUCIsICJURzBEIiwgIlRHMEgiLCAiVFRGMCIsICJUVzBQIiwKLQkgICJUaDBIIiwgIlRoMUgiLCAiVGgySCIsICJUbTBQIiwgIlRzMFAiLCBOVUxMIH0sCi0vKiBTZXQgMTA6IGlNYWMgNSwxICovCi0JeyAiVEEwUCIsICJUQzBEIiwgIlRDMFAiLCAiVEcwRCIsICJUSDBQIiwgIlRPMFAiLCAiVG0wUCIsIE5VTEwgfSwKLS8qIFNldCAxMTogTWFjYm9vayA1LDEgKi8KLQl7ICJUQjBUIiwgIlRCMVQiLCAiVEIyVCIsICJUQjNUIiwgIlRDMEQiLCAiVEMwUCIsICJUTjBEIiwgIlROMFAiLAotCSAgIlRURjAiLCAiVGgwSCIsICJUaDFIIiwgIlRoRkgiLCAiVHMwUCIsICJUczBTIiwgTlVMTCB9LAotLyogU2V0IDEyOiBNYWNib29rIFBybyA1LDEgKi8KLQl7ICJUQjBUIiwgIlRCMVQiLCAiVEIyVCIsICJUQjNUIiwgIlRDMEQiLCAiVEMwRiIsICJUQzBQIiwgIlRHMEQiLAotCSAgIlRHMEYiLCAiVEcwSCIsICJURzBQIiwgIlRHMFQiLCAiVEcxSCIsICJUTjBEIiwgIlROMFAiLCAiVFRGMCIsCi0JICAiVGgySCIsICJUbTBQIiwgIlRzMFAiLCAiVHMwUyIsIE5VTEwgfSwKLS8qIFNldCAxMzogaU1hYyA4LDEgKi8KLQl7ICJUQTBQIiwgIlRDMEQiLCAiVEMwSCIsICJUQzBQIiwgIlRHMEQiLCAiVEcwSCIsICJURzBQIiwgIlRIMFAiLAotCSAgIlRMMFAiLCAiVE8wUCIsICJUVzBQIiwgIlRtMFAiLCAiVHAwUCIsIE5VTEwgfSwKLS8qIFNldCAxNDogaU1hYyA2LDEgKi8KLQl7ICJUQTBQIiwgIlRDMEQiLCAiVEMwSCIsICJUQzBQIiwgIlRHMEQiLCAiVEcwSCIsICJURzBQIiwgIlRIMFAiLAotCSAgIlRPMFAiLCAiVHAwUCIsIE5VTEwgfSwKLS8qIFNldCAxNTogTWFjQm9vayBBaXIgMiwxICovCi0JeyAiVEIwVCIsICJUQjFTIiwgIlRCMVQiLCAiVEIyUyIsICJUQjJUIiwgIlRDMEQiLCAiVE4wRCIsICJUVEYwIiwKLQkgICJUVjBQIiwgIlRWRlAiLCAiVFcwUCIsICJUaDBQIiwgIlRwMFAiLCAiVHAxUCIsICJUcEZQIiwgIlRzMFAiLAotCSAgIlRzMFMiLCBOVUxMIH0sCi0vKiBTZXQgMTY6IE1hYyBQcm8gMywxICgyIHggUXVhZC1Db3JlKSAqLwotCXsgIlRBMFAiLCAiVENBRyIsICJUQ0FIIiwgIlRDQkciLCAiVENCSCIsICJUQzBDIiwgIlRDMEQiLCAiVEMwUCIsCi0JICAiVEMxQyIsICJUQzFEIiwgIlRDMkMiLCAiVEMyRCIsICJUQzNDIiwgIlRDM0QiLCAiVEgwUCIsICJUSDFQIiwKLQkgICJUSDJQIiwgIlRIM1AiLCAiVE1BUCIsICJUTUFTIiwgIlRNQlMiLCAiVE0wUCIsICJUTTBTIiwgIlRNMVAiLAotCSAgIlRNMVMiLCAiVE0yUCIsICJUTTJTIiwgIlRNM1MiLCAiVE04UCIsICJUTThTIiwgIlRNOVAiLCAiVE05UyIsCi0JICAiVE4wQyIsICJUTjBEIiwgIlROMEgiLCAiVFMwQyIsICJUcDBDIiwgIlRwMUMiLCAiVHYwUyIsICJUdjFTIiwKLQkgIE5VTEwgfSwKLS8qIFNldCAxNzogaU1hYyA5LDEgKi8KLQl7ICJUQTBQIiwgIlRDMEQiLCAiVEMwSCIsICJUQzBQIiwgIlRHMEQiLCAiVEcwSCIsICJUSDBQIiwgIlRMMFAiLAotCSAgIlROMEQiLCAiVE4wSCIsICJUTjBQIiwgIlRPMFAiLCAiVG0wUCIsICJUcDBQIiwgTlVMTCB9LAotLyogU2V0IDE4OiBNYWNCb29rIFBybyAyLDIgKi8KLQl7ICJUQjBUIiwgIlRDMEQiLCAiVEMwUCIsICJURzBIIiwgIlRHMFAiLCAiVEcwVCIsICJUTTBQIiwgIlRURjAiLAotCSAgIlRoMEgiLCAiVGgxSCIsICJUbTBQIiwgIlRzMFAiLCBOVUxMIH0sCi0vKiBTZXQgMTk6IE1hY2Jvb2sgUHJvIDUsMyAqLwotCXsgIlRCMFQiLCAiVEIxVCIsICJUQjJUIiwgIlRCM1QiLCAiVEMwRCIsICJUQzBGIiwgIlRDMFAiLCAiVEcwRCIsCi0JICAiVEcwRiIsICJURzBIIiwgIlRHMFAiLCAiVEcwVCIsICJUTjBEIiwgIlROMFAiLCAiVFRGMCIsICJUaDJIIiwKLQkgICJUbTBQIiwgIlRzMFAiLCAiVHMwUyIsIE5VTEwgfSwKLS8qIFNldCAyMDogTWFjQm9vayBQcm8gNSw0ICovCi0JeyAiVEIwVCIsICJUQjFUIiwgIlRCMlQiLCAiVEIzVCIsICJUQzBEIiwgIlRDMEYiLCAiVEMwUCIsICJUTjBEIiwKLQkgICJUTjBQIiwgIlRURjAiLCAiVGgySCIsICJUczBQIiwgIlRzMFMiLCBOVUxMIH0sCi0vKiBTZXQgMjE6IE1hY0Jvb2sgUHJvIDYsMiAqLwotCXsgIlRCMFQiLCAiVEIxVCIsICJUQjJUIiwgIlRDMEMiLCAiVEMwRCIsICJUQzBQIiwgIlRDMUMiLCAiVEcwRCIsCi0JICAiVEcwUCIsICJURzBUIiwgIlRNQ0QiLCAiVFAwUCIsICJUUENEIiwgIlRoMUgiLCAiVGgySCIsICJUbTBQIiwKLQkgICJUczBQIiwgIlRzMFMiLCBOVUxMIH0sCi0vKiBTZXQgMjI6IE1hY0Jvb2sgUHJvIDcsMSAqLwotCXsgIlRCMFQiLCAiVEIxVCIsICJUQjJUIiwgIlRDMEQiLCAiVEMwUCIsICJUTjBEIiwgIlROMFAiLCAiVE4wUyIsCi0JICAiVE4xRCIsICJUTjFGIiwgIlROMUciLCAiVE4xUyIsICJUaDFIIiwgIlRzMFAiLCAiVHMwUyIsIE5VTEwgfSwKLX07CisjZGVmaW5lIEZBTl9JRF9GTVQJCSJGJWRJRCIgLyogci1vIGNoYXJbMTZdICovCiAKIC8qIExpc3Qgb2Yga2V5cyB1c2VkIHRvIHJlYWQvd3JpdGUgZmFuIHNwZWVkcyAqLwotc3RhdGljIGNvbnN0IGNoYXIqIGZhbl9zcGVlZF9rZXlzW10gPSB7Ci0JRkFOX0FDVFVBTF9TUEVFRCwKLQlGQU5fTUlOX1NQRUVELAotCUZBTl9NQVhfU1BFRUQsCi0JRkFOX1NBRkVfU1BFRUQsCi0JRkFOX1RBUkdFVF9TUEVFRAorc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGZhbl9zcGVlZF9mbXRbXSA9IHsKKwkiRiVkQWMiLAkJLyogYWN0dWFsIHNwZWVkICovCisJIkYlZE1uIiwJCS8qIG1pbmltdW0gc3BlZWQgKHJ3KSAqLworCSJGJWRNeCIsCQkvKiBtYXhpbXVtIHNwZWVkICovCisJIkYlZFNmIiwJCS8qIHNhZmUgc3BlZWQgLSBub3QgYWxsIG1vZGVscyAqLworCSJGJWRUZyIsCQkvKiB0YXJnZXQgc3BlZWQgKG1hbnVhbDogcncpICovCiB9OwogCiAjZGVmaW5lIElOSVRfVElNRU9VVF9NU0VDUwk1MDAwCS8qIHdhaXQgdXAgdG8gNXMgZm9yIGRldmljZSBpbml0IC4uLiAqLwpAQCAtMTg0LDE0ICsxMDAsNDggQEAKICNkZWZpbmUgU0VOU09SX1kgMQogI2RlZmluZSBTRU5TT1JfWiAyCiAKLS8qIFN0cnVjdHVyZSB0byBiZSBwYXNzZWQgdG8gRE1JX01BVENIIGZ1bmN0aW9uICovCi1zdHJ1Y3QgZG1pX21hdGNoX2RhdGEgewotLyogSW5kaWNhdGVzIHdoZXRoZXIgdGhpcyBjb21wdXRlciBoYXMgYW4gYWNjZWxlcm9tZXRlci4gKi8KLQlpbnQgYWNjZWxlcm9tZXRlcjsKLS8qIEluZGljYXRlcyB3aGV0aGVyIHRoaXMgY29tcHV0ZXIgaGFzIGxpZ2h0IHNlbnNvcnMgYW5kIGtleWJvYXJkIGJhY2tsaWdodC4gKi8KLQlpbnQgbGlnaHQ7Ci0vKiBJbmRpY2F0ZXMgd2hpY2ggdGVtcGVyYXR1cmUgc2Vuc29ycyBzZXQgdG8gdXNlLiAqLwotCWludCB0ZW1wZXJhdHVyZV9zZXQ7CisjZGVmaW5lIHRvX2luZGV4KGF0dHIpICh0b19zZW5zb3JfZGV2X2F0dHIoYXR0ciktPmluZGV4ICYgMHhmZmZmKQorI2RlZmluZSB0b19vcHRpb24oYXR0cikgKHRvX3NlbnNvcl9kZXZfYXR0cihhdHRyKS0+aW5kZXggPj4gMTYpCisKKy8qIER5bmFtaWMgZGV2aWNlIG5vZGUgYXR0cmlidXRlcyAqLworc3RydWN0IGFwcGxlc21jX2Rldl9hdHRyIHsKKwlzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGUgc2RhOwkvKiBod21vbiBhdHRyaWJ1dGVzICovCisJY2hhciBuYW1lWzMyXTsJCQkJLyogcm9vbSBmb3Igbm9kZSBmaWxlIG5hbWUgKi8KK307CisKKy8qIER5bmFtaWMgZGV2aWNlIG5vZGUgZ3JvdXAgKi8KK3N0cnVjdCBhcHBsZXNtY19ub2RlX2dyb3VwIHsKKwljaGFyICpmb3JtYXQ7CQkJCS8qIGZvcm1hdCBzdHJpbmcgKi8KKwl2b2lkICpzaG93OwkJCQkvKiBzaG93IGZ1bmN0aW9uICovCisJdm9pZCAqc3RvcmU7CQkJCS8qIHN0b3JlIGZ1bmN0aW9uICovCisJaW50IG9wdGlvbjsJCQkJLyogZnVuY3Rpb24gYXJndW1lbnQgKi8KKwlzdHJ1Y3QgYXBwbGVzbWNfZGV2X2F0dHIgKm5vZGVzOwkvKiBkeW5hbWljIG5vZGUgYXJyYXkgKi8KK307CisKKy8qIEFwcGxlU01DIGVudHJ5IC0gY2FjaGVkIHJlZ2lzdGVyIGluZm9ybWF0aW9uICovCitzdHJ1Y3QgYXBwbGVzbWNfZW50cnkgeworCWNoYXIga2V5WzVdOwkJLyogZm91ci1sZXR0ZXIga2V5IGNvZGUgKi8KKwl1OCB2YWxpZDsJCS8qIHNldCB3aGVuIGVudHJ5IGlzIHN1Y2Nlc3NmdWxseSByZWFkIG9uY2UgKi8KKwl1OCBsZW47CQkJLyogYm91bmRlZCBieSBBUFBMRVNNQ19NQVhfREFUQV9MRU5HVEggKi8KKwljaGFyIHR5cGVbNV07CQkvKiBmb3VyLWxldHRlciB0eXBlIGNvZGUgKi8KKwl1OCBmbGFnczsJCS8qIDB4MTA6IGZ1bmM7IDB4NDA6IHdyaXRlOyAweDgwOiByZWFkICovCit9OworCisvKiBSZWdpc3RlciBsb29rdXAgYW5kIHJlZ2lzdGVycyBjb21tb24gdG8gYWxsIFNNQ3MgKi8KK3N0YXRpYyBzdHJ1Y3QgYXBwbGVzbWNfcmVnaXN0ZXJzIHsKKwlzdHJ1Y3QgbXV0ZXggbXV0ZXg7CQkvKiByZWdpc3RlciByZWFkL3dyaXRlIG11dGV4ICovCisJdW5zaWduZWQgaW50IGtleV9jb3VudDsJCS8qIG51bWJlciBvZiBTTUMgcmVnaXN0ZXJzICovCisJdW5zaWduZWQgaW50IGZhbl9jb3VudDsJCS8qIG51bWJlciBvZiBmYW5zICovCisJdW5zaWduZWQgaW50IHRlbXBfY291bnQ7CS8qIG51bWJlciBvZiB0ZW1wZXJhdHVyZSByZWdpc3RlcnMgKi8KKwl1bnNpZ25lZCBpbnQgdGVtcF9iZWdpbjsJLyogdGVtcGVyYXR1cmUgbG93ZXIgaW5kZXggYm91bmQgKi8KKwl1bnNpZ25lZCBpbnQgdGVtcF9lbmQ7CQkvKiB0ZW1wZXJhdHVyZSB1cHBlciBpbmRleCBib3VuZCAqLworCWludCBudW1fbGlnaHRfc2Vuc29yczsJCS8qIG51bWJlciBvZiBsaWdodCBzZW5zb3JzICovCisJYm9vbCBoYXNfYWNjZWxlcm9tZXRlcjsJCS8qIGhhcyBtb3Rpb24gc2Vuc29yICovCisJYm9vbCBoYXNfa2V5X2JhY2tsaWdodDsJCS8qIGhhcyBrZXlib2FyZCBiYWNrbGlnaHQgKi8KKwlib29sIGluaXRfY29tcGxldGU7CQkvKiB0cnVlIHdoZW4gZnVsbHkgaW5pdGlhbGl6ZWQgKi8KKwlzdHJ1Y3QgYXBwbGVzbWNfZW50cnkgKmNhY2hlOwkvKiBjYWNoZWQga2V5IGVudHJpZXMgKi8KK30gc21jcmVnID0geworCS5tdXRleCA9IF9fTVVURVhfSU5JVElBTElaRVIoc21jcmVnLm11dGV4KSwKIH07CiAKIHN0YXRpYyBjb25zdCBpbnQgZGVidWc7CkBAIC0yMDMsMjAgKzE1Myw2IEBACiBzdGF0aWMgc3RydWN0IGRldmljZSAqaHdtb25fZGV2Owogc3RhdGljIHN0cnVjdCBpbnB1dF9wb2xsZWRfZGV2ICphcHBsZXNtY19pZGV2OwogCi0vKiBJbmRpY2F0ZXMgd2hldGhlciB0aGlzIGNvbXB1dGVyIGhhcyBhbiBhY2NlbGVyb21ldGVyLiAqLwotc3RhdGljIHVuc2lnbmVkIGludCBhcHBsZXNtY19hY2NlbGVyb21ldGVyOwotCi0vKiBJbmRpY2F0ZXMgd2hldGhlciB0aGlzIGNvbXB1dGVyIGhhcyBsaWdodCBzZW5zb3JzIGFuZCBrZXlib2FyZCBiYWNrbGlnaHQuICovCi1zdGF0aWMgdW5zaWduZWQgaW50IGFwcGxlc21jX2xpZ2h0OwotCi0vKiBUaGUgbnVtYmVyIG9mIGZhbnMgaGFuZGxlZCBieSB0aGUgZHJpdmVyICovCi1zdGF0aWMgdW5zaWduZWQgaW50IGZhbnNfaGFuZGxlZDsKLQotLyogSW5kaWNhdGVzIHdoaWNoIHRlbXBlcmF0dXJlIHNlbnNvcnMgc2V0IHRvIHVzZS4gKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQgYXBwbGVzbWNfdGVtcGVyYXR1cmVfc2V0OwotCi1zdGF0aWMgREVGSU5FX01VVEVYKGFwcGxlc21jX2xvY2spOwotCiAvKgogICogTGFzdCBpbmRleCB3cml0dGVuIHRvIGtleV9hdF9pbmRleCBzeXNmcyBmaWxlLCBhbmQgdmFsdWUgdG8gdXNlIGZvciBhbGwgb3RoZXIKICAqIGtleV9hdF9pbmRleF8qIHN5c2ZzIGZpbGVzLgpAQCAtMjM4LDE4ICsxNzQsMTAgQEAKIAogCWZvciAodXMgPSBBUFBMRVNNQ19NSU5fV0FJVDsgdXMgPCBBUFBMRVNNQ19NQVhfV0FJVDsgdXMgPDw9IDEpIHsKIAkJdWRlbGF5KHVzKTsKLQkJaWYgKChpbmIoQVBQTEVTTUNfQ01EX1BPUlQpICYgQVBQTEVTTUNfU1RBVFVTX01BU0spID09IHZhbCkgewotCQkJaWYgKGRlYnVnKQotCQkJCXByaW50ayhLRVJOX0RFQlVHCi0JCQkJCSJXYWl0ZWQgJWQgdXMgZm9yIHN0YXR1cyAleFxuIiwKLQkJCQkJMiAqIHVzIC0gQVBQTEVTTUNfTUlOX1dBSVQsIHZhbCk7CisJCWlmICgoaW5iKEFQUExFU01DX0NNRF9QT1JUKSAmIEFQUExFU01DX1NUQVRVU19NQVNLKSA9PSB2YWwpCiAJCQlyZXR1cm4gMDsKLQkJfQogCX0KIAotCXByaW50ayhLRVJOX1dBUk5JTkcgImFwcGxlc21jOiB3YWl0IHN0YXR1cyBmYWlsZWQ6ICV4ICE9ICV4XG4iLAotCQkJCQkJdmFsLCBpbmIoQVBQTEVTTUNfQ01EX1BPUlQpKTsKLQogCXJldHVybiAtRUlPOwogfQogCkBAIC0yNjcsMTU5ICsxOTUsMjQyIEBACiAJCWlmICgoaW5iKEFQUExFU01DX0NNRF9QT1JUKSAmIEFQUExFU01DX1NUQVRVU19NQVNLKSA9PSAweDBjKQogCQkJcmV0dXJuIDA7CiAJfQotCXByaW50ayhLRVJOX1dBUk5JTkcgImFwcGxlc21jOiBjb21tYW5kIGZhaWxlZDogJXggLT4gJXhcbiIsCi0JCWNtZCwgaW5iKEFQUExFU01DX0NNRF9QT1JUKSk7CiAJcmV0dXJuIC1FSU87CiB9CiAKLS8qCi0gKiBhcHBsZXNtY19yZWFkX2tleSAtIHJlYWRzIGxlbiBieXRlcyBmcm9tIGEgZ2l2ZW4ga2V5LCBhbmQgcHV0IHRoZW0gaW4gYnVmZmVyLgotICogUmV0dXJucyB6ZXJvIG9uIHN1Y2Nlc3Mgb3IgYSBuZWdhdGl2ZSBlcnJvciBvbiBmYWlsdXJlLiBDYWxsZXJzIG11c3QKLSAqIGhvbGQgYXBwbGVzbWNfbG9jay4KLSAqLwotc3RhdGljIGludCBhcHBsZXNtY19yZWFkX2tleShjb25zdCBjaGFyKiBrZXksIHU4KiBidWZmZXIsIHU4IGxlbikKK3N0YXRpYyBpbnQgc2VuZF9hcmd1bWVudChjb25zdCBjaGFyICprZXkpCiB7CiAJaW50IGk7CiAKLQlpZiAobGVuID4gQVBQTEVTTUNfTUFYX0RBVEFfTEVOR1RIKSB7Ci0JCXByaW50ayhLRVJOX0VSUgkiYXBwbGVzbWNfcmVhZF9rZXk6IGNhbm5vdCByZWFkIG1vcmUgdGhhbiAiCi0JCQkJCSIlZCBieXRlc1xuIiwgQVBQTEVTTUNfTUFYX0RBVEFfTEVOR1RIKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaWYgKHNlbmRfY29tbWFuZChBUFBMRVNNQ19SRUFEX0NNRCkpCi0JCXJldHVybiAtRUlPOwotCiAJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgewogCQlvdXRiKGtleVtpXSwgQVBQTEVTTUNfREFUQV9QT1JUKTsKIAkJaWYgKF9fd2FpdF9zdGF0dXMoMHgwNCkpCiAJCQlyZXR1cm4gLUVJTzsKIAl9Ci0JaWYgKGRlYnVnKQotCQlwcmludGsoS0VSTl9ERUJVRyAiPCVzIiwga2V5KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByZWFkX3NtYyh1OCBjbWQsIGNvbnN0IGNoYXIgKmtleSwgdTggKmJ1ZmZlciwgdTggbGVuKQoreworCWludCBpOworCisJaWYgKHNlbmRfY29tbWFuZChjbWQpIHx8IHNlbmRfYXJndW1lbnQoa2V5KSkgeworCQlwcl93YXJuKCIlczogcmVhZCBhcmcgZmFpbFxuIiwga2V5KTsKKwkJcmV0dXJuIC1FSU87CisJfQogCiAJb3V0YihsZW4sIEFQUExFU01DX0RBVEFfUE9SVCk7Ci0JaWYgKGRlYnVnKQotCQlwcmludGsoS0VSTl9ERUJVRyAiPiV4IiwgbGVuKTsKIAogCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQlpZiAoX193YWl0X3N0YXR1cygweDA1KSkKKwkJaWYgKF9fd2FpdF9zdGF0dXMoMHgwNSkpIHsKKwkJCXByX3dhcm4oIiVzOiByZWFkIGRhdGEgZmFpbFxuIiwga2V5KTsKIAkJCXJldHVybiAtRUlPOworCQl9CiAJCWJ1ZmZlcltpXSA9IGluYihBUFBMRVNNQ19EQVRBX1BPUlQpOwotCQlpZiAoZGVidWcpCi0JCQlwcmludGsoS0VSTl9ERUJVRyAiPCV4IiwgYnVmZmVyW2ldKTsKIAl9Ci0JaWYgKGRlYnVnKQotCQlwcmludGsoS0VSTl9ERUJVRyAiXG4iKTsKIAogCXJldHVybiAwOwogfQogCi0vKgotICogYXBwbGVzbWNfd3JpdGVfa2V5IC0gd3JpdGVzIGxlbiBieXRlcyBmcm9tIGJ1ZmZlciB0byBhIGdpdmVuIGtleS4KLSAqIFJldHVybnMgemVybyBvbiBzdWNjZXNzIG9yIGEgbmVnYXRpdmUgZXJyb3Igb24gZmFpbHVyZS4gQ2FsbGVycyBtdXN0Ci0gKiBob2xkIGFwcGxlc21jX2xvY2suCi0gKi8KLXN0YXRpYyBpbnQgYXBwbGVzbWNfd3JpdGVfa2V5KGNvbnN0IGNoYXIqIGtleSwgdTgqIGJ1ZmZlciwgdTggbGVuKQorc3RhdGljIGludCB3cml0ZV9zbWModTggY21kLCBjb25zdCBjaGFyICprZXksIGNvbnN0IHU4ICpidWZmZXIsIHU4IGxlbikKIHsKIAlpbnQgaTsKIAotCWlmIChsZW4gPiBBUFBMRVNNQ19NQVhfREFUQV9MRU5HVEgpIHsKLQkJcHJpbnRrKEtFUk5fRVJSCSJhcHBsZXNtY193cml0ZV9rZXk6IGNhbm5vdCB3cml0ZSBtb3JlIHRoYW4gIgotCQkJCQkiJWQgYnl0ZXNcbiIsIEFQUExFU01DX01BWF9EQVRBX0xFTkdUSCk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWlmIChzZW5kX2NvbW1hbmQoQVBQTEVTTUNfV1JJVEVfQ01EKSkKKwlpZiAoc2VuZF9jb21tYW5kKGNtZCkgfHwgc2VuZF9hcmd1bWVudChrZXkpKSB7CisJCXByX3dhcm4oIiVzOiB3cml0ZSBhcmcgZmFpbFxuIiwga2V5KTsKIAkJcmV0dXJuIC1FSU87Ci0KLQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7Ci0JCW91dGIoa2V5W2ldLCBBUFBMRVNNQ19EQVRBX1BPUlQpOwotCQlpZiAoX193YWl0X3N0YXR1cygweDA0KSkKLQkJCXJldHVybiAtRUlPOwogCX0KIAogCW91dGIobGVuLCBBUFBMRVNNQ19EQVRBX1BPUlQpOwogCiAJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCWlmIChfX3dhaXRfc3RhdHVzKDB4MDQpKQorCQlpZiAoX193YWl0X3N0YXR1cygweDA0KSkgeworCQkJcHJfd2FybigiJXM6IHdyaXRlIGRhdGEgZmFpbFxuIiwga2V5KTsKIAkJCXJldHVybiAtRUlPOworCQl9CiAJCW91dGIoYnVmZmVyW2ldLCBBUFBMRVNNQ19EQVRBX1BPUlQpOwogCX0KIAogCXJldHVybiAwOwogfQogCi0vKgotICogYXBwbGVzbWNfZ2V0X2tleV9hdF9pbmRleCAtIGdldCBrZXkgYXQgaW5kZXgsIGFuZCBwdXQgdGhlIHJlc3VsdCBpbiBrZXkKLSAqIChjaGFyWzZdKS4gUmV0dXJucyB6ZXJvIG9uIHN1Y2Nlc3Mgb3IgYSBuZWdhdGl2ZSBlcnJvciBvbiBmYWlsdXJlLiBDYWxsZXJzCi0gKiBtdXN0IGhvbGQgYXBwbGVzbWNfbG9jay4KLSAqLwotc3RhdGljIGludCBhcHBsZXNtY19nZXRfa2V5X2F0X2luZGV4KGludCBpbmRleCwgY2hhcioga2V5KQorc3RhdGljIGludCByZWFkX3JlZ2lzdGVyX2NvdW50KHVuc2lnbmVkIGludCAqY291bnQpCiB7Ci0JaW50IGk7Ci0JdTggcmVhZGtleVs0XTsKLQlyZWFka2V5WzBdID0gaW5kZXggPj4gMjQ7Ci0JcmVhZGtleVsxXSA9IGluZGV4ID4+IDE2OwotCXJlYWRrZXlbMl0gPSBpbmRleCA+PiA4OwotCXJlYWRrZXlbM10gPSBpbmRleDsKKwlfX2JlMzIgYmU7CisJaW50IHJldDsKIAotCWlmIChzZW5kX2NvbW1hbmQoQVBQTEVTTUNfR0VUX0tFWV9CWV9JTkRFWF9DTUQpKQotCQlyZXR1cm4gLUVJTzsKKwlyZXQgPSByZWFkX3NtYyhBUFBMRVNNQ19SRUFEX0NNRCwgS0VZX0NPVU5UX0tFWSwgKHU4ICopJmJlLCA0KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OwogCi0JZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgewotCQlvdXRiKHJlYWRrZXlbaV0sIEFQUExFU01DX0RBVEFfUE9SVCk7Ci0JCWlmIChfX3dhaXRfc3RhdHVzKDB4MDQpKQotCQkJcmV0dXJuIC1FSU87Ci0JfQotCi0Jb3V0Yig0LCBBUFBMRVNNQ19EQVRBX1BPUlQpOwotCi0JZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgewotCQlpZiAoX193YWl0X3N0YXR1cygweDA1KSkKLQkJCXJldHVybiAtRUlPOwotCQlrZXlbaV0gPSBpbmIoQVBQTEVTTUNfREFUQV9QT1JUKTsKLQl9Ci0Ja2V5WzRdID0gMDsKLQorCSpjb3VudCA9IGJlMzJfdG9fY3B1KGJlKTsKIAlyZXR1cm4gMDsKIH0KIAogLyoKLSAqIGFwcGxlc21jX2dldF9rZXlfdHlwZSAtIGdldCBrZXkgdHlwZSwgYW5kIHB1dCB0aGUgcmVzdWx0IGluIHR5cGUgKGNoYXJbNl0pLgotICogUmV0dXJucyB6ZXJvIG9uIHN1Y2Nlc3Mgb3IgYSBuZWdhdGl2ZSBlcnJvciBvbiBmYWlsdXJlLiBDYWxsZXJzIG11c3QKLSAqIGhvbGQgYXBwbGVzbWNfbG9jay4KKyAqIFNlcmlhbGl6ZWQgSS9PCisgKgorICogUmV0dXJucyB6ZXJvIG9uIHN1Y2Nlc3Mgb3IgYSBuZWdhdGl2ZSBlcnJvciBvbiBmYWlsdXJlLgorICogQWxsIGZ1bmN0aW9ucyBiZWxvdyBhcmUgY29uY3VycmVuY3kgc2FmZSAtIGNhbGxlcnMgc2hvdWxkIE5PVCBob2xkIGxvY2suCiAgKi8KLXN0YXRpYyBpbnQgYXBwbGVzbWNfZ2V0X2tleV90eXBlKGNoYXIqIGtleSwgY2hhciogdHlwZSkKKworc3RhdGljIGludCBhcHBsZXNtY19yZWFkX2VudHJ5KGNvbnN0IHN0cnVjdCBhcHBsZXNtY19lbnRyeSAqZW50cnksCisJCQkgICAgICAgdTggKmJ1ZiwgdTggbGVuKQogewotCWludCBpOworCWludCByZXQ7CiAKLQlpZiAoc2VuZF9jb21tYW5kKEFQUExFU01DX0dFVF9LRVlfVFlQRV9DTUQpKQotCQlyZXR1cm4gLUVJTzsKKwlpZiAoZW50cnktPmxlbiAhPSBsZW4pCisJCXJldHVybiAtRUlOVkFMOworCW11dGV4X2xvY2soJnNtY3JlZy5tdXRleCk7CisJcmV0ID0gcmVhZF9zbWMoQVBQTEVTTUNfUkVBRF9DTUQsIGVudHJ5LT5rZXksIGJ1ZiwgbGVuKTsKKwltdXRleF91bmxvY2soJnNtY3JlZy5tdXRleCk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7Ci0JCW91dGIoa2V5W2ldLCBBUFBMRVNNQ19EQVRBX1BPUlQpOwotCQlpZiAoX193YWl0X3N0YXR1cygweDA0KSkKLQkJCXJldHVybiAtRUlPOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYXBwbGVzbWNfd3JpdGVfZW50cnkoY29uc3Qgc3RydWN0IGFwcGxlc21jX2VudHJ5ICplbnRyeSwKKwkJCQljb25zdCB1OCAqYnVmLCB1OCBsZW4pCit7CisJaW50IHJldDsKKworCWlmIChlbnRyeS0+bGVuICE9IGxlbikKKwkJcmV0dXJuIC1FSU5WQUw7CisJbXV0ZXhfbG9jaygmc21jcmVnLm11dGV4KTsKKwlyZXQgPSB3cml0ZV9zbWMoQVBQTEVTTUNfV1JJVEVfQ01ELCBlbnRyeS0+a2V5LCBidWYsIGxlbik7CisJbXV0ZXhfdW5sb2NrKCZzbWNyZWcubXV0ZXgpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXBwbGVzbWNfZW50cnkgKmFwcGxlc21jX2dldF9lbnRyeV9ieV9pbmRleChpbnQgaW5kZXgpCit7CisJc3RydWN0IGFwcGxlc21jX2VudHJ5ICpjYWNoZSA9ICZzbWNyZWcuY2FjaGVbaW5kZXhdOworCXU4IGtleVs0XSwgaW5mb1s2XTsKKwlfX2JlMzIgYmU7CisJaW50IHJldCA9IDA7CisKKwlpZiAoY2FjaGUtPnZhbGlkKQorCQlyZXR1cm4gY2FjaGU7CisKKwltdXRleF9sb2NrKCZzbWNyZWcubXV0ZXgpOworCisJaWYgKGNhY2hlLT52YWxpZCkKKwkJZ290byBvdXQ7CisJYmUgPSBjcHVfdG9fYmUzMihpbmRleCk7CisJcmV0ID0gcmVhZF9zbWMoQVBQTEVTTUNfR0VUX0tFWV9CWV9JTkRFWF9DTUQsICh1OCAqKSZiZSwga2V5LCA0KTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKwlyZXQgPSByZWFkX3NtYyhBUFBMRVNNQ19HRVRfS0VZX1RZUEVfQ01ELCBrZXksIGluZm8sIDYpOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCisJbWVtY3B5KGNhY2hlLT5rZXksIGtleSwgNCk7CisJY2FjaGUtPmxlbiA9IGluZm9bMF07CisJbWVtY3B5KGNhY2hlLT50eXBlLCAmaW5mb1sxXSwgNCk7CisJY2FjaGUtPmZsYWdzID0gaW5mb1s1XTsKKwljYWNoZS0+dmFsaWQgPSAxOworCitvdXQ6CisJbXV0ZXhfdW5sb2NrKCZzbWNyZWcubXV0ZXgpOworCWlmIChyZXQpCisJCXJldHVybiBFUlJfUFRSKHJldCk7CisJcmV0dXJuIGNhY2hlOworfQorCitzdGF0aWMgaW50IGFwcGxlc21jX2dldF9sb3dlcl9ib3VuZCh1bnNpZ25lZCBpbnQgKmxvLCBjb25zdCBjaGFyICprZXkpCit7CisJaW50IGJlZ2luID0gMCwgZW5kID0gc21jcmVnLmtleV9jb3VudDsKKwljb25zdCBzdHJ1Y3QgYXBwbGVzbWNfZW50cnkgKmVudHJ5OworCisJd2hpbGUgKGJlZ2luICE9IGVuZCkgeworCQlpbnQgbWlkZGxlID0gYmVnaW4gKyAoZW5kIC0gYmVnaW4pIC8gMjsKKwkJZW50cnkgPSBhcHBsZXNtY19nZXRfZW50cnlfYnlfaW5kZXgobWlkZGxlKTsKKwkJaWYgKElTX0VSUihlbnRyeSkpCisJCQlyZXR1cm4gUFRSX0VSUihlbnRyeSk7CisJCWlmIChzdHJjbXAoZW50cnktPmtleSwga2V5KSA8IDApCisJCQliZWdpbiA9IG1pZGRsZSArIDE7CisJCWVsc2UKKwkJCWVuZCA9IG1pZGRsZTsKIAl9CiAKLQlvdXRiKDYsIEFQUExFU01DX0RBVEFfUE9SVCk7CisJKmxvID0gYmVnaW47CisJcmV0dXJuIDA7Cit9CiAKLQlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKSB7Ci0JCWlmIChfX3dhaXRfc3RhdHVzKDB4MDUpKQotCQkJcmV0dXJuIC1FSU87Ci0JCXR5cGVbaV0gPSBpbmIoQVBQTEVTTUNfREFUQV9QT1JUKTsKK3N0YXRpYyBpbnQgYXBwbGVzbWNfZ2V0X3VwcGVyX2JvdW5kKHVuc2lnbmVkIGludCAqaGksIGNvbnN0IGNoYXIgKmtleSkKK3sKKwlpbnQgYmVnaW4gPSAwLCBlbmQgPSBzbWNyZWcua2V5X2NvdW50OworCWNvbnN0IHN0cnVjdCBhcHBsZXNtY19lbnRyeSAqZW50cnk7CisKKwl3aGlsZSAoYmVnaW4gIT0gZW5kKSB7CisJCWludCBtaWRkbGUgPSBiZWdpbiArIChlbmQgLSBiZWdpbikgLyAyOworCQllbnRyeSA9IGFwcGxlc21jX2dldF9lbnRyeV9ieV9pbmRleChtaWRkbGUpOworCQlpZiAoSVNfRVJSKGVudHJ5KSkKKwkJCXJldHVybiBQVFJfRVJSKGVudHJ5KTsKKwkJaWYgKHN0cmNtcChrZXksIGVudHJ5LT5rZXkpIDwgMCkKKwkJCWVuZCA9IG1pZGRsZTsKKwkJZWxzZQorCQkJYmVnaW4gPSBtaWRkbGUgKyAxOwogCX0KLQl0eXBlWzVdID0gMDsKIAorCSpoaSA9IGJlZ2luOworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGFwcGxlc21jX2VudHJ5ICphcHBsZXNtY19nZXRfZW50cnlfYnlfa2V5KGNvbnN0IGNoYXIgKmtleSkKK3sKKwlpbnQgYmVnaW4sIGVuZDsKKwlpbnQgcmV0OworCisJcmV0ID0gYXBwbGVzbWNfZ2V0X2xvd2VyX2JvdW5kKCZiZWdpbiwga2V5KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gRVJSX1BUUihyZXQpOworCXJldCA9IGFwcGxlc21jX2dldF91cHBlcl9ib3VuZCgmZW5kLCBrZXkpOworCWlmIChyZXQpCisJCXJldHVybiBFUlJfUFRSKHJldCk7CisJaWYgKGVuZCAtIGJlZ2luICE9IDEpCisJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworCisJcmV0dXJuIGFwcGxlc21jX2dldF9lbnRyeV9ieV9pbmRleChiZWdpbik7Cit9CisKK3N0YXRpYyBpbnQgYXBwbGVzbWNfcmVhZF9rZXkoY29uc3QgY2hhciAqa2V5LCB1OCAqYnVmZmVyLCB1OCBsZW4pCit7CisJY29uc3Qgc3RydWN0IGFwcGxlc21jX2VudHJ5ICplbnRyeTsKKworCWVudHJ5ID0gYXBwbGVzbWNfZ2V0X2VudHJ5X2J5X2tleShrZXkpOworCWlmIChJU19FUlIoZW50cnkpKQorCQlyZXR1cm4gUFRSX0VSUihlbnRyeSk7CisKKwlyZXR1cm4gYXBwbGVzbWNfcmVhZF9lbnRyeShlbnRyeSwgYnVmZmVyLCBsZW4pOworfQorCitzdGF0aWMgaW50IGFwcGxlc21jX3dyaXRlX2tleShjb25zdCBjaGFyICprZXksIGNvbnN0IHU4ICpidWZmZXIsIHU4IGxlbikKK3sKKwljb25zdCBzdHJ1Y3QgYXBwbGVzbWNfZW50cnkgKmVudHJ5OworCisJZW50cnkgPSBhcHBsZXNtY19nZXRfZW50cnlfYnlfa2V5KGtleSk7CisJaWYgKElTX0VSUihlbnRyeSkpCisJCXJldHVybiBQVFJfRVJSKGVudHJ5KTsKKworCXJldHVybiBhcHBsZXNtY193cml0ZV9lbnRyeShlbnRyeSwgYnVmZmVyLCBsZW4pOworfQorCitzdGF0aWMgaW50IGFwcGxlc21jX2hhc19rZXkoY29uc3QgY2hhciAqa2V5LCBib29sICp2YWx1ZSkKK3sKKwljb25zdCBzdHJ1Y3QgYXBwbGVzbWNfZW50cnkgKmVudHJ5OworCisJZW50cnkgPSBhcHBsZXNtY19nZXRfZW50cnlfYnlfa2V5KGtleSk7CisJaWYgKElTX0VSUihlbnRyeSkgJiYgUFRSX0VSUihlbnRyeSkgIT0gLUVJTlZBTCkKKwkJcmV0dXJuIFBUUl9FUlIoZW50cnkpOworCisJKnZhbHVlID0gIUlTX0VSUihlbnRyeSk7CiAJcmV0dXJuIDA7CiB9CiAKIC8qCi0gKiBhcHBsZXNtY19yZWFkX21vdGlvbl9zZW5zb3IgLSBSZWFkIG1vdGlvbiBzZW5zb3IgKFgsIFkgb3IgWikuIENhbGxlcnMgbXVzdAotICogaG9sZCBhcHBsZXNtY19sb2NrLgorICogYXBwbGVzbWNfcmVhZF9tb3Rpb25fc2Vuc29yIC0gUmVhZCBtb3Rpb24gc2Vuc29yIChYLCBZIG9yIFopLgogICovCi1zdGF0aWMgaW50IGFwcGxlc21jX3JlYWRfbW90aW9uX3NlbnNvcihpbnQgaW5kZXgsIHMxNiogdmFsdWUpCitzdGF0aWMgaW50IGFwcGxlc21jX3JlYWRfbW90aW9uX3NlbnNvcihpbnQgaW5kZXgsIHMxNiAqdmFsdWUpCiB7CiAJdTggYnVmZmVyWzJdOwogCWludCByZXQ7CkBAIC00NDQsNjkgKzQ1NSwxMjAgQEAKIH0KIAogLyoKLSAqIGFwcGxlc21jX2RldmljZV9pbml0IC0gaW5pdGlhbGl6ZSB0aGUgYWNjZWxlcm9tZXRlci4gIFJldHVybnMgemVybyBvbiBzdWNjZXNzCi0gKiBhbmQgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLiAgQ2FuIHNsZWVwLgorICogYXBwbGVzbWNfZGV2aWNlX2luaXQgLSBpbml0aWFsaXplIHRoZSBhY2NlbGVyb21ldGVyLiAgQ2FuIHNsZWVwLgogICovCi1zdGF0aWMgaW50IGFwcGxlc21jX2RldmljZV9pbml0KHZvaWQpCitzdGF0aWMgdm9pZCBhcHBsZXNtY19kZXZpY2VfaW5pdCh2b2lkKQogewotCWludCB0b3RhbCwgcmV0ID0gLUVOWElPOworCWludCB0b3RhbDsKIAl1OCBidWZmZXJbMl07CiAKLQlpZiAoIWFwcGxlc21jX2FjY2VsZXJvbWV0ZXIpCi0JCXJldHVybiAwOwotCi0JbXV0ZXhfbG9jaygmYXBwbGVzbWNfbG9jayk7CisJaWYgKCFzbWNyZWcuaGFzX2FjY2VsZXJvbWV0ZXIpCisJCXJldHVybjsKIAogCWZvciAodG90YWwgPSBJTklUX1RJTUVPVVRfTVNFQ1M7IHRvdGFsID4gMDsgdG90YWwgLT0gSU5JVF9XQUlUX01TRUNTKSB7Ci0JCWlmIChkZWJ1ZykKLQkJCXByaW50ayhLRVJOX0RFQlVHICJhcHBsZXNtYyB0cnkgJWRcbiIsIHRvdGFsKTsKIAkJaWYgKCFhcHBsZXNtY19yZWFkX2tleShNT1RJT05fU0VOU09SX0tFWSwgYnVmZmVyLCAyKSAmJgotCQkJCShidWZmZXJbMF0gIT0gMHgwMCB8fCBidWZmZXJbMV0gIT0gMHgwMCkpIHsKLQkJCWlmICh0b3RhbCA9PSBJTklUX1RJTUVPVVRfTVNFQ1MpIHsKLQkJCQlwcmludGsoS0VSTl9ERUJVRyAiYXBwbGVzbWM6IGRldmljZSBoYXMiCi0JCQkJCQkiIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZCIKLQkJCQkJCSIgKDB4JTAyeCwgMHglMDJ4KS5cbiIsCi0JCQkJCQlidWZmZXJbMF0sIGJ1ZmZlclsxXSk7Ci0JCQl9IGVsc2UgewotCQkJCXByaW50ayhLRVJOX0RFQlVHICJhcHBsZXNtYzogZGV2aWNlIgotCQkJCQkJIiBzdWNjZXNzZnVsbHkgaW5pdGlhbGl6ZWQiCi0JCQkJCQkiICgweCUwMngsIDB4JTAyeCkuXG4iLAotCQkJCQkJYnVmZmVyWzBdLCBidWZmZXJbMV0pOwotCQkJfQotCQkJcmV0ID0gMDsKLQkJCWdvdG8gb3V0OwotCQl9CisJCQkJKGJ1ZmZlclswXSAhPSAweDAwIHx8IGJ1ZmZlclsxXSAhPSAweDAwKSkKKwkJCXJldHVybjsKIAkJYnVmZmVyWzBdID0gMHhlMDsKIAkJYnVmZmVyWzFdID0gMHgwMDsKIAkJYXBwbGVzbWNfd3JpdGVfa2V5KE1PVElPTl9TRU5TT1JfS0VZLCBidWZmZXIsIDIpOwogCQltc2xlZXAoSU5JVF9XQUlUX01TRUNTKTsKIAl9CiAKLQlwcmludGsoS0VSTl9XQVJOSU5HICJhcHBsZXNtYzogZmFpbGVkIHRvIGluaXQgdGhlIGRldmljZVxuIik7Ci0KLW91dDoKLQltdXRleF91bmxvY2soJmFwcGxlc21jX2xvY2spOwotCXJldHVybiByZXQ7CisJcHJfd2FybigiZmFpbGVkIHRvIGluaXQgdGhlIGRldmljZVxuIik7CiB9CiAKIC8qCi0gKiBhcHBsZXNtY19nZXRfZmFuX2NvdW50IC0gZ2V0IHRoZSBudW1iZXIgb2YgZmFucy4gQ2FsbGVycyBtdXN0IE5PVCBob2xkCi0gKiBhcHBsZXNtY19sb2NrLgorICogYXBwbGVzbWNfaW5pdF9zbWNyZWdfdHJ5IC0gVHJ5IHRvIGluaXRpYWxpemUgcmVnaXN0ZXIgY2FjaGUuIElkZW1wb3RlbnQuCiAgKi8KLXN0YXRpYyBpbnQgYXBwbGVzbWNfZ2V0X2Zhbl9jb3VudCh2b2lkKQorc3RhdGljIGludCBhcHBsZXNtY19pbml0X3NtY3JlZ190cnkodm9pZCkKIHsKKwlzdHJ1Y3QgYXBwbGVzbWNfcmVnaXN0ZXJzICpzID0gJnNtY3JlZzsKKwlib29sIGxlZnRfbGlnaHRfc2Vuc29yLCByaWdodF9saWdodF9zZW5zb3I7CisJdTggdG1wWzFdOwogCWludCByZXQ7Ci0JdTggYnVmZmVyWzFdOwogCi0JbXV0ZXhfbG9jaygmYXBwbGVzbWNfbG9jayk7CisJaWYgKHMtPmluaXRfY29tcGxldGUpCisJCXJldHVybiAwOwogCi0JcmV0ID0gYXBwbGVzbWNfcmVhZF9rZXkoRkFOU19DT1VOVCwgYnVmZmVyLCAxKTsKLQotCW11dGV4X3VubG9jaygmYXBwbGVzbWNfbG9jayk7CisJcmV0ID0gcmVhZF9yZWdpc3Rlcl9jb3VudCgmcy0+a2V5X2NvdW50KTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwotCWVsc2UKLQkJcmV0dXJuIGJ1ZmZlclswXTsKKworCWlmICghcy0+Y2FjaGUpCisJCXMtPmNhY2hlID0ga2NhbGxvYyhzLT5rZXlfY291bnQsIHNpemVvZigqcy0+Y2FjaGUpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXMtPmNhY2hlKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJldCA9IGFwcGxlc21jX3JlYWRfa2V5KEZBTlNfQ09VTlQsIHRtcCwgMSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwlzLT5mYW5fY291bnQgPSB0bXBbMF07CisKKwlyZXQgPSBhcHBsZXNtY19nZXRfbG93ZXJfYm91bmQoJnMtPnRlbXBfYmVnaW4sICJUIik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwlyZXQgPSBhcHBsZXNtY19nZXRfbG93ZXJfYm91bmQoJnMtPnRlbXBfZW5kLCAiVSIpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisJcy0+dGVtcF9jb3VudCA9IHMtPnRlbXBfZW5kIC0gcy0+dGVtcF9iZWdpbjsKKworCXJldCA9IGFwcGxlc21jX2hhc19rZXkoTElHSFRfU0VOU09SX0xFRlRfS0VZLCAmbGVmdF9saWdodF9zZW5zb3IpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisJcmV0ID0gYXBwbGVzbWNfaGFzX2tleShMSUdIVF9TRU5TT1JfUklHSFRfS0VZLCAmcmlnaHRfbGlnaHRfc2Vuc29yKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCXJldCA9IGFwcGxlc21jX2hhc19rZXkoTU9USU9OX1NFTlNPUl9LRVksICZzLT5oYXNfYWNjZWxlcm9tZXRlcik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwlyZXQgPSBhcHBsZXNtY19oYXNfa2V5KEJBQ0tMSUdIVF9LRVksICZzLT5oYXNfa2V5X2JhY2tsaWdodCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXMtPm51bV9saWdodF9zZW5zb3JzID0gbGVmdF9saWdodF9zZW5zb3IgKyByaWdodF9saWdodF9zZW5zb3I7CisJcy0+aW5pdF9jb21wbGV0ZSA9IHRydWU7CisKKwlwcl9pbmZvKCJrZXk9JWQgZmFuPSVkIHRlbXA9JWQgYWNjPSVkIGx1eD0lZCBrYmQ9JWRcbiIsCisJICAgICAgIHMtPmtleV9jb3VudCwgcy0+ZmFuX2NvdW50LCBzLT50ZW1wX2NvdW50LAorCSAgICAgICBzLT5oYXNfYWNjZWxlcm9tZXRlciwKKwkgICAgICAgcy0+bnVtX2xpZ2h0X3NlbnNvcnMsCisJICAgICAgIHMtPmhhc19rZXlfYmFja2xpZ2h0KTsKKworCXJldHVybiAwOworfQorCisvKgorICogYXBwbGVzbWNfaW5pdF9zbWNyZWcgLSBJbml0aWFsaXplIHJlZ2lzdGVyIGNhY2hlLgorICoKKyAqIFJldHJpZXMgdW50aWwgaW5pdGlhbGl6YXRpb24gaXMgc3VjY2Vzc2Z1bCwgb3IgdGhlIG9wZXJhdGlvbiB0aW1lcyBvdXQuCisgKgorICovCitzdGF0aWMgaW50IGFwcGxlc21jX2luaXRfc21jcmVnKHZvaWQpCit7CisJaW50IG1zLCByZXQ7CisKKwlmb3IgKG1zID0gMDsgbXMgPCBJTklUX1RJTUVPVVRfTVNFQ1M7IG1zICs9IElOSVRfV0FJVF9NU0VDUykgeworCQlyZXQgPSBhcHBsZXNtY19pbml0X3NtY3JlZ190cnkoKTsKKwkJaWYgKCFyZXQpIHsKKwkJCWlmIChtcykKKwkJCQlwcl9pbmZvKCJpbml0X3NtY3JlZygpIHRvb2sgJWQgbXNcbiIsIG1zKTsKKwkJCXJldHVybiAwOworCQl9CisJCW1zbGVlcChJTklUX1dBSVRfTVNFQ1MpOworCX0KKworCWtmcmVlKHNtY3JlZy5jYWNoZSk7CisJc21jcmVnLmNhY2hlID0gTlVMTDsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGFwcGxlc21jX2Rlc3Ryb3lfc21jcmVnKHZvaWQpCit7CisJa2ZyZWUoc21jcmVnLmNhY2hlKTsKKwlzbWNyZWcuY2FjaGUgPSBOVUxMOworCXNtY3JlZy5pbml0X2NvbXBsZXRlID0gZmFsc2U7CiB9CiAKIC8qIERldmljZSBtb2RlbCBzdHVmZiAqLwpAQCAtNTE0LDMwICs1NzYsMjcgQEAKIHsKIAlpbnQgcmV0OwogCi0JcmV0ID0gYXBwbGVzbWNfZGV2aWNlX2luaXQoKTsKKwlyZXQgPSBhcHBsZXNtY19pbml0X3NtY3JlZygpOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKLQlwcmludGsoS0VSTl9JTkZPICJhcHBsZXNtYzogZGV2aWNlIHN1Y2Nlc3NmdWxseSBpbml0aWFsaXplZC5cbiIpOworCWFwcGxlc21jX2RldmljZV9pbml0KCk7CisKIAlyZXR1cm4gMDsKIH0KIAogLyogU3luY2hyb25pemUgZGV2aWNlIHdpdGggbWVtb3JpemVkIGJhY2tsaWdodCBzdGF0ZSAqLwogc3RhdGljIGludCBhcHBsZXNtY19wbV9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQogewotCW11dGV4X2xvY2soJmFwcGxlc21jX2xvY2spOwotCWlmIChhcHBsZXNtY19saWdodCkKKwlpZiAoc21jcmVnLmhhc19rZXlfYmFja2xpZ2h0KQogCQlhcHBsZXNtY193cml0ZV9rZXkoQkFDS0xJR0hUX0tFWSwgYmFja2xpZ2h0X3N0YXRlLCAyKTsKLQltdXRleF91bmxvY2soJmFwcGxlc21jX2xvY2spOwogCXJldHVybiAwOwogfQogCiAvKiBSZWluaXRpYWxpemUgZGV2aWNlIG9uIHJlc3VtZSBmcm9tIGhpYmVybmF0aW9uICovCiBzdGF0aWMgaW50IGFwcGxlc21jX3BtX3Jlc3RvcmUoc3RydWN0IGRldmljZSAqZGV2KQogewotCWludCByZXQgPSBhcHBsZXNtY19kZXZpY2VfaW5pdCgpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7CisJYXBwbGVzbWNfZGV2aWNlX2luaXQoKTsKIAlyZXR1cm4gYXBwbGVzbWNfcG1fcmVzdW1lKGRldik7CiB9CiAKQEAgLTU3MSwyMCArNjMwLDE1IEBACiAJc3RydWN0IGlucHV0X2RldiAqaWRldiA9IGRldi0+aW5wdXQ7CiAJczE2IHgsIHk7CiAKLQltdXRleF9sb2NrKCZhcHBsZXNtY19sb2NrKTsKLQogCWlmIChhcHBsZXNtY19yZWFkX21vdGlvbl9zZW5zb3IoU0VOU09SX1gsICZ4KSkKLQkJZ290byBvdXQ7CisJCXJldHVybjsKIAlpZiAoYXBwbGVzbWNfcmVhZF9tb3Rpb25fc2Vuc29yKFNFTlNPUl9ZLCAmeSkpCi0JCWdvdG8gb3V0OworCQlyZXR1cm47CiAKIAl4ID0gLXg7CiAJaW5wdXRfcmVwb3J0X2FicyhpZGV2LCBBQlNfWCwgeCAtIHJlc3RfeCk7CiAJaW5wdXRfcmVwb3J0X2FicyhpZGV2LCBBQlNfWSwgeSAtIHJlc3RfeSk7CiAJaW5wdXRfc3luYyhpZGV2KTsKLQotb3V0OgotCW11dGV4X3VubG9jaygmYXBwbGVzbWNfbG9jayk7CiB9CiAKIC8qIFN5c2ZzIEZpbGVzICovCkBAIC02MDEsOCArNjU1LDYgQEAKIAlpbnQgcmV0OwogCXMxNiB4LCB5LCB6OwogCi0JbXV0ZXhfbG9jaygmYXBwbGVzbWNfbG9jayk7Ci0KIAlyZXQgPSBhcHBsZXNtY19yZWFkX21vdGlvbl9zZW5zb3IoU0VOU09SX1gsICZ4KTsKIAlpZiAocmV0KQogCQlnb3RvIG91dDsKQEAgLTYxNCw3ICs2NjYsNiBAQAogCQlnb3RvIG91dDsKIAogb3V0OgotCW11dGV4X3VubG9jaygmYXBwbGVzbWNfbG9jayk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAllbHNlCkBAIC02MjQsMjAgKzY3NSwyMCBAQAogc3RhdGljIHNzaXplX3QgYXBwbGVzbWNfbGlnaHRfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKnN5c2ZzYnVmKQogeworCWNvbnN0IHN0cnVjdCBhcHBsZXNtY19lbnRyeSAqZW50cnk7CiAJc3RhdGljIGludCBkYXRhX2xlbmd0aDsKIAlpbnQgcmV0OwogCXU4IGxlZnQgPSAwLCByaWdodCA9IDA7Ci0JdTggYnVmZmVyWzEwXSwgcXVlcnlbNl07Ci0KLQltdXRleF9sb2NrKCZhcHBsZXNtY19sb2NrKTsKKwl1OCBidWZmZXJbMTBdOwogCiAJaWYgKCFkYXRhX2xlbmd0aCkgewotCQlyZXQgPSBhcHBsZXNtY19nZXRfa2V5X3R5cGUoTElHSFRfU0VOU09SX0xFRlRfS0VZLCBxdWVyeSk7Ci0JCWlmIChyZXQpCi0JCQlnb3RvIG91dDsKLQkJZGF0YV9sZW5ndGggPSBjbGFtcF92YWwocXVlcnlbMF0sIDAsIDEwKTsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiYXBwbGVzbWM6IGxpZ2h0IHNlbnNvciBkYXRhIGxlbmd0aCBzZXQgdG8gIgotCQkJIiVkXG4iLCBkYXRhX2xlbmd0aCk7CisJCWVudHJ5ID0gYXBwbGVzbWNfZ2V0X2VudHJ5X2J5X2tleShMSUdIVF9TRU5TT1JfTEVGVF9LRVkpOworCQlpZiAoSVNfRVJSKGVudHJ5KSkKKwkJCXJldHVybiBQVFJfRVJSKGVudHJ5KTsKKwkJaWYgKGVudHJ5LT5sZW4gPiAxMCkKKwkJCXJldHVybiAtRU5YSU87CisJCWRhdGFfbGVuZ3RoID0gZW50cnktPmxlbjsKKwkJcHJfaW5mbygibGlnaHQgc2Vuc29yIGRhdGEgbGVuZ3RoIHNldCB0byAlZFxuIiwgZGF0YV9sZW5ndGgpOwogCX0KIAogCXJldCA9IGFwcGxlc21jX3JlYWRfa2V5KExJR0hUX1NFTlNPUl9MRUZUX0tFWSwgYnVmZmVyLCBkYXRhX2xlbmd0aCk7CkBAIC02NTMsNyArNzA0LDYgQEAKIAlyaWdodCA9IGJ1ZmZlclsyXTsKIAogb3V0OgotCW11dGV4X3VubG9jaygmYXBwbGVzbWNfbG9jayk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAllbHNlCkBAIC02NjQsMzYgKzcxNCw0NCBAQAogc3RhdGljIHNzaXplX3QgYXBwbGVzbWNfc2hvd19zZW5zb3JfbGFiZWwoc3RydWN0IGRldmljZSAqZGV2LAogCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHIsIGNoYXIgKnN5c2ZzYnVmKQogewotCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciA9IHRvX3NlbnNvcl9kZXZfYXR0cihkZXZhdHRyKTsKLQljb25zdCBjaGFyICprZXkgPQotCQl0ZW1wZXJhdHVyZV9zZW5zb3JzX3NldHNbYXBwbGVzbWNfdGVtcGVyYXR1cmVfc2V0XVthdHRyLT5pbmRleF07CisJaW50IGluZGV4ID0gc21jcmVnLnRlbXBfYmVnaW4gKyB0b19pbmRleChkZXZhdHRyKTsKKwljb25zdCBzdHJ1Y3QgYXBwbGVzbWNfZW50cnkgKmVudHJ5OwogCi0JcmV0dXJuIHNucHJpbnRmKHN5c2ZzYnVmLCBQQUdFX1NJWkUsICIlc1xuIiwga2V5KTsKKwllbnRyeSA9IGFwcGxlc21jX2dldF9lbnRyeV9ieV9pbmRleChpbmRleCk7CisJaWYgKElTX0VSUihlbnRyeSkpCisJCXJldHVybiBQVFJfRVJSKGVudHJ5KTsKKworCXJldHVybiBzbnByaW50ZihzeXNmc2J1ZiwgUEFHRV9TSVpFLCAiJXNcbiIsIGVudHJ5LT5rZXkpOwogfQogCiAvKiBEaXNwbGF5cyBkZWdyZWUgQ2Vsc2l1cyAqIDEwMDAgKi8KIHN0YXRpYyBzc2l6ZV90IGFwcGxlc21jX3Nob3dfdGVtcGVyYXR1cmUoc3RydWN0IGRldmljZSAqZGV2LAogCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHIsIGNoYXIgKnN5c2ZzYnVmKQogeworCWludCBpbmRleCA9IHNtY3JlZy50ZW1wX2JlZ2luICsgdG9faW5kZXgoZGV2YXR0cik7CisJY29uc3Qgc3RydWN0IGFwcGxlc21jX2VudHJ5ICplbnRyeTsKIAlpbnQgcmV0OwogCXU4IGJ1ZmZlclsyXTsKIAl1bnNpZ25lZCBpbnQgdGVtcDsKLQlzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGUgKmF0dHIgPSB0b19zZW5zb3JfZGV2X2F0dHIoZGV2YXR0cik7Ci0JY29uc3QgY2hhcioga2V5ID0KLQkJdGVtcGVyYXR1cmVfc2Vuc29yc19zZXRzW2FwcGxlc21jX3RlbXBlcmF0dXJlX3NldF1bYXR0ci0+aW5kZXhdOwogCi0JbXV0ZXhfbG9jaygmYXBwbGVzbWNfbG9jayk7CisJZW50cnkgPSBhcHBsZXNtY19nZXRfZW50cnlfYnlfaW5kZXgoaW5kZXgpOworCWlmIChJU19FUlIoZW50cnkpKQorCQlyZXR1cm4gUFRSX0VSUihlbnRyeSk7CisJaWYgKGVudHJ5LT5sZW4gPiAyKQorCQlyZXR1cm4gLUVJTlZBTDsKIAotCXJldCA9IGFwcGxlc21jX3JlYWRfa2V5KGtleSwgYnVmZmVyLCAyKTsKLQl0ZW1wID0gYnVmZmVyWzBdKjEwMDA7Ci0JdGVtcCArPSAoYnVmZmVyWzFdID4+IDYpICogMjUwOwotCi0JbXV0ZXhfdW5sb2NrKCZhcHBsZXNtY19sb2NrKTsKLQorCXJldCA9IGFwcGxlc21jX3JlYWRfZW50cnkoZW50cnksIGJ1ZmZlciwgZW50cnktPmxlbik7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKLQllbHNlCi0JCXJldHVybiBzbnByaW50ZihzeXNmc2J1ZiwgUEFHRV9TSVpFLCAiJXVcbiIsIHRlbXApOworCisJaWYgKGVudHJ5LT5sZW4gPT0gMikgeworCQl0ZW1wID0gYnVmZmVyWzBdICogMTAwMDsKKwkJdGVtcCArPSAoYnVmZmVyWzFdID4+IDYpICogMjUwOworCX0gZWxzZSB7CisJCXRlbXAgPSBidWZmZXJbMF0gKiA0MDAwOworCX0KKworCXJldHVybiBzbnByaW50ZihzeXNmc2J1ZiwgUEFHRV9TSVpFLCAiJXVcbiIsIHRlbXApOwogfQogCiBzdGF0aWMgc3NpemVfdCBhcHBsZXNtY19zaG93X2Zhbl9zcGVlZChzdHJ1Y3QgZGV2aWNlICpkZXYsCkBAIC03MDMsMjEgKzc2MSwxMiBAQAogCXVuc2lnbmVkIGludCBzcGVlZCA9IDA7CiAJY2hhciBuZXdrZXlbNV07CiAJdTggYnVmZmVyWzJdOwotCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZV8yICpzZW5zb3JfYXR0ciA9Ci0JCQkJCQl0b19zZW5zb3JfZGV2X2F0dHJfMihhdHRyKTsKIAotCW5ld2tleVswXSA9IGZhbl9zcGVlZF9rZXlzW3NlbnNvcl9hdHRyLT5ucl1bMF07Ci0JbmV3a2V5WzFdID0gJzAnICsgc2Vuc29yX2F0dHItPmluZGV4OwotCW5ld2tleVsyXSA9IGZhbl9zcGVlZF9rZXlzW3NlbnNvcl9hdHRyLT5ucl1bMl07Ci0JbmV3a2V5WzNdID0gZmFuX3NwZWVkX2tleXNbc2Vuc29yX2F0dHItPm5yXVszXTsKLQluZXdrZXlbNF0gPSAwOwotCi0JbXV0ZXhfbG9jaygmYXBwbGVzbWNfbG9jayk7CisJc3ByaW50ZihuZXdrZXksIGZhbl9zcGVlZF9mbXRbdG9fb3B0aW9uKGF0dHIpXSwgdG9faW5kZXgoYXR0cikpOwogCiAJcmV0ID0gYXBwbGVzbWNfcmVhZF9rZXkobmV3a2V5LCBidWZmZXIsIDIpOwogCXNwZWVkID0gKChidWZmZXJbMF0gPDwgOCB8IGJ1ZmZlclsxXSkgPj4gMik7CiAKLQltdXRleF91bmxvY2soJmFwcGxlc21jX2xvY2spOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAJZWxzZQpAQCAtNzI5LDMwICs3NzgsMTkgQEAKIAkJCQkJY29uc3QgY2hhciAqc3lzZnNidWYsIHNpemVfdCBjb3VudCkKIHsKIAlpbnQgcmV0OwotCXUzMiBzcGVlZDsKKwl1bnNpZ25lZCBsb25nIHNwZWVkOwogCWNoYXIgbmV3a2V5WzVdOwogCXU4IGJ1ZmZlclsyXTsKLQlzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGVfMiAqc2Vuc29yX2F0dHIgPQotCQkJCQkJdG9fc2Vuc29yX2Rldl9hdHRyXzIoYXR0cik7CiAKLQlzcGVlZCA9IHNpbXBsZV9zdHJ0b3VsKHN5c2ZzYnVmLCBOVUxMLCAxMCk7CisJaWYgKHN0cmljdF9zdHJ0b3VsKHN5c2ZzYnVmLCAxMCwgJnNwZWVkKSA8IDAgfHwgc3BlZWQgPj0gMHg0MDAwKQorCQlyZXR1cm4gLUVJTlZBTDsJCS8qIEJpZ2dlciB0aGFuIGEgMTQtYml0IHZhbHVlICovCiAKLQlpZiAoc3BlZWQgPiAweDQwMDApIC8qIEJpZ2dlciB0aGFuIGEgMTQtYml0IHZhbHVlICovCi0JCXJldHVybiAtRUlOVkFMOwotCi0JbmV3a2V5WzBdID0gZmFuX3NwZWVkX2tleXNbc2Vuc29yX2F0dHItPm5yXVswXTsKLQluZXdrZXlbMV0gPSAnMCcgKyBzZW5zb3JfYXR0ci0+aW5kZXg7Ci0JbmV3a2V5WzJdID0gZmFuX3NwZWVkX2tleXNbc2Vuc29yX2F0dHItPm5yXVsyXTsKLQluZXdrZXlbM10gPSBmYW5fc3BlZWRfa2V5c1tzZW5zb3JfYXR0ci0+bnJdWzNdOwotCW5ld2tleVs0XSA9IDA7Ci0KLQltdXRleF9sb2NrKCZhcHBsZXNtY19sb2NrKTsKKwlzcHJpbnRmKG5ld2tleSwgZmFuX3NwZWVkX2ZtdFt0b19vcHRpb24oYXR0cildLCB0b19pbmRleChhdHRyKSk7CiAKIAlidWZmZXJbMF0gPSAoc3BlZWQgPj4gNikgJiAweGZmOwogCWJ1ZmZlclsxXSA9IChzcGVlZCA8PCAyKSAmIDB4ZmY7CiAJcmV0ID0gYXBwbGVzbWNfd3JpdGVfa2V5KG5ld2tleSwgYnVmZmVyLCAyKTsKIAotCW11dGV4X3VubG9jaygmYXBwbGVzbWNfbG9jayk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAllbHNlCkBAIC03NjAsMTkgKzc5OCwxNSBAQAogfQogCiBzdGF0aWMgc3NpemVfdCBhcHBsZXNtY19zaG93X2Zhbl9tYW51YWwoc3RydWN0IGRldmljZSAqZGV2LAotCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHIsIGNoYXIgKnN5c2ZzYnVmKQorCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKnN5c2ZzYnVmKQogewogCWludCByZXQ7CiAJdTE2IG1hbnVhbCA9IDA7CiAJdTggYnVmZmVyWzJdOwotCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciA9IHRvX3NlbnNvcl9kZXZfYXR0cihkZXZhdHRyKTsKLQotCW11dGV4X2xvY2soJmFwcGxlc21jX2xvY2spOwogCiAJcmV0ID0gYXBwbGVzbWNfcmVhZF9rZXkoRkFOU19NQU5VQUwsIGJ1ZmZlciwgMik7Ci0JbWFudWFsID0gKChidWZmZXJbMF0gPDwgOCB8IGJ1ZmZlclsxXSkgPj4gYXR0ci0+aW5kZXgpICYgMHgwMTsKKwltYW51YWwgPSAoKGJ1ZmZlclswXSA8PCA4IHwgYnVmZmVyWzFdKSA+PiB0b19pbmRleChhdHRyKSkgJiAweDAxOwogCi0JbXV0ZXhfdW5sb2NrKCZhcHBsZXNtY19sb2NrKTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCWVsc2UKQEAgLTc4MCwxOCArODE0LDE2IEBACiB9CiAKIHN0YXRpYyBzc2l6ZV90IGFwcGxlc21jX3N0b3JlX2Zhbl9tYW51YWwoc3RydWN0IGRldmljZSAqZGV2LAotCQkJCQkgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHIsCisJCQkJCSBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKIAkJCQkJIGNvbnN0IGNoYXIgKnN5c2ZzYnVmLCBzaXplX3QgY291bnQpCiB7CiAJaW50IHJldDsKIAl1OCBidWZmZXJbMl07Ci0JdTMyIGlucHV0OworCXVuc2lnbmVkIGxvbmcgaW5wdXQ7CiAJdTE2IHZhbDsKLQlzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGUgKmF0dHIgPSB0b19zZW5zb3JfZGV2X2F0dHIoZGV2YXR0cik7CiAKLQlpbnB1dCA9IHNpbXBsZV9zdHJ0b3VsKHN5c2ZzYnVmLCBOVUxMLCAxMCk7Ci0KLQltdXRleF9sb2NrKCZhcHBsZXNtY19sb2NrKTsKKwlpZiAoc3RyaWN0X3N0cnRvdWwoc3lzZnNidWYsIDEwLCAmaW5wdXQpIDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CiAKIAlyZXQgPSBhcHBsZXNtY19yZWFkX2tleShGQU5TX01BTlVBTCwgYnVmZmVyLCAyKTsKIAl2YWwgPSAoYnVmZmVyWzBdIDw8IDggfCBidWZmZXJbMV0pOwpAQCAtNzk5LDkgKzgzMSw5IEBACiAJCWdvdG8gb3V0OwogCiAJaWYgKGlucHV0KQotCQl2YWwgPSB2YWwgfCAoMHgwMSA8PCBhdHRyLT5pbmRleCk7CisJCXZhbCA9IHZhbCB8ICgweDAxIDw8IHRvX2luZGV4KGF0dHIpKTsKIAllbHNlCi0JCXZhbCA9IHZhbCAmIH4oMHgwMSA8PCBhdHRyLT5pbmRleCk7CisJCXZhbCA9IHZhbCAmIH4oMHgwMSA8PCB0b19pbmRleChhdHRyKSk7CiAKIAlidWZmZXJbMF0gPSAodmFsID4+IDgpICYgMHhGRjsKIAlidWZmZXJbMV0gPSB2YWwgJiAweEZGOwpAQCAtODA5LDcgKzg0MSw2IEBACiAJcmV0ID0gYXBwbGVzbWNfd3JpdGVfa2V5KEZBTlNfTUFOVUFMLCBidWZmZXIsIDIpOwogCiBvdXQ6Ci0JbXV0ZXhfdW5sb2NrKCZhcHBsZXNtY19sb2NrKTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCWVsc2UKQEAgLTgyMiwyMSArODUzLDEyIEBACiAJaW50IHJldDsKIAljaGFyIG5ld2tleVs1XTsKIAl1OCBidWZmZXJbMTddOwotCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZV8yICpzZW5zb3JfYXR0ciA9Ci0JCQkJCQl0b19zZW5zb3JfZGV2X2F0dHJfMihhdHRyKTsKIAotCW5ld2tleVswXSA9IEZBTl9QT1NJVElPTlswXTsKLQluZXdrZXlbMV0gPSAnMCcgKyBzZW5zb3JfYXR0ci0+aW5kZXg7Ci0JbmV3a2V5WzJdID0gRkFOX1BPU0lUSU9OWzJdOwotCW5ld2tleVszXSA9IEZBTl9QT1NJVElPTlszXTsKLQluZXdrZXlbNF0gPSAwOwotCi0JbXV0ZXhfbG9jaygmYXBwbGVzbWNfbG9jayk7CisJc3ByaW50ZihuZXdrZXksIEZBTl9JRF9GTVQsIHRvX2luZGV4KGF0dHIpKTsKIAogCXJldCA9IGFwcGxlc21jX3JlYWRfa2V5KG5ld2tleSwgYnVmZmVyLCAxNik7CiAJYnVmZmVyWzE2XSA9IDA7CiAKLQltdXRleF91bmxvY2soJmFwcGxlc21jX2xvY2spOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAJZWxzZQpAQCAtODUyLDE4ICs4NzQsMTQgQEAKIHN0YXRpYyBzc2l6ZV90IGFwcGxlc21jX2NhbGlicmF0ZV9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKnN5c2ZzYnVmLCBzaXplX3QgY291bnQpCiB7Ci0JbXV0ZXhfbG9jaygmYXBwbGVzbWNfbG9jayk7CiAJYXBwbGVzbWNfY2FsaWJyYXRlKCk7Ci0JbXV0ZXhfdW5sb2NrKCZhcHBsZXNtY19sb2NrKTsKIAogCXJldHVybiBjb3VudDsKIH0KIAogc3RhdGljIHZvaWQgYXBwbGVzbWNfYmFja2xpZ2h0X3NldChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7Ci0JbXV0ZXhfbG9jaygmYXBwbGVzbWNfbG9jayk7CiAJYXBwbGVzbWNfd3JpdGVfa2V5KEJBQ0tMSUdIVF9LRVksIGJhY2tsaWdodF9zdGF0ZSwgMik7Ci0JbXV0ZXhfdW5sb2NrKCZhcHBsZXNtY19sb2NrKTsKIH0KIHN0YXRpYyBERUNMQVJFX1dPUksoYmFja2xpZ2h0X3dvcmssICZhcHBsZXNtY19iYWNrbGlnaHRfc2V0KTsKIApAQCAtODg2LDEzICs5MDQsMTAgQEAKIAl1OCBidWZmZXJbNF07CiAJdTMyIGNvdW50OwogCi0JbXV0ZXhfbG9jaygmYXBwbGVzbWNfbG9jayk7Ci0KIAlyZXQgPSBhcHBsZXNtY19yZWFkX2tleShLRVlfQ09VTlRfS0VZLCBidWZmZXIsIDQpOwogCWNvdW50ID0gKCh1MzIpYnVmZmVyWzBdPDwyNCkgKyAoKHUzMilidWZmZXJbMV08PDE2KSArCiAJCQkJCQkoKHUzMilidWZmZXJbMl08PDgpICsgYnVmZmVyWzNdOwogCi0JbXV0ZXhfdW5sb2NrKCZhcHBsZXNtY19sb2NrKTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCWVsc2UKQEAgLTkwMiwxMTMgKzkxNyw1MyBAQAogc3RhdGljIHNzaXplX3QgYXBwbGVzbWNfa2V5X2F0X2luZGV4X3JlYWRfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKnN5c2ZzYnVmKQogewotCWNoYXIga2V5WzVdOwotCWNoYXIgaW5mb1s2XTsKKwljb25zdCBzdHJ1Y3QgYXBwbGVzbWNfZW50cnkgKmVudHJ5OwogCWludCByZXQ7CiAKLQltdXRleF9sb2NrKCZhcHBsZXNtY19sb2NrKTsKLQotCXJldCA9IGFwcGxlc21jX2dldF9rZXlfYXRfaW5kZXgoa2V5X2F0X2luZGV4LCBrZXkpOwotCi0JaWYgKHJldCB8fCAha2V5WzBdKSB7Ci0JCW11dGV4X3VubG9jaygmYXBwbGVzbWNfbG9jayk7Ci0KLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JcmV0ID0gYXBwbGVzbWNfZ2V0X2tleV90eXBlKGtleSwgaW5mbyk7Ci0KLQlpZiAocmV0KSB7Ci0JCW11dGV4X3VubG9jaygmYXBwbGVzbWNfbG9jayk7Ci0KKwllbnRyeSA9IGFwcGxlc21jX2dldF9lbnRyeV9ieV9pbmRleChrZXlfYXRfaW5kZXgpOworCWlmIChJU19FUlIoZW50cnkpKQorCQlyZXR1cm4gUFRSX0VSUihlbnRyeSk7CisJcmV0ID0gYXBwbGVzbWNfcmVhZF9lbnRyeShlbnRyeSwgc3lzZnNidWYsIGVudHJ5LT5sZW4pOworCWlmIChyZXQpCiAJCXJldHVybiByZXQ7Ci0JfQogCi0JLyoKLQkgKiBpbmZvWzBdIG1heGltdW0gdmFsdWUgKEFQUExFU01DX01BWF9EQVRBX0xFTkdUSCkgaXMgbXVjaCBsb3dlciB0aGFuCi0JICogUEFHRV9TSVpFLCBzbyB3ZSBkb24ndCBuZWVkIGFueSBjaGVja3MgYmVmb3JlIHdyaXRpbmcgdG8gc3lzZnNidWYuCi0JICovCi0JcmV0ID0gYXBwbGVzbWNfcmVhZF9rZXkoa2V5LCBzeXNmc2J1ZiwgaW5mb1swXSk7Ci0KLQltdXRleF91bmxvY2soJmFwcGxlc21jX2xvY2spOwotCi0JaWYgKCFyZXQpIHsKLQkJcmV0dXJuIGluZm9bMF07Ci0JfSBlbHNlIHsKLQkJcmV0dXJuIHJldDsKLQl9CisJcmV0dXJuIGVudHJ5LT5sZW47CiB9CiAKIHN0YXRpYyBzc2l6ZV90IGFwcGxlc21jX2tleV9hdF9pbmRleF9kYXRhX2xlbmd0aF9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqc3lzZnNidWYpCiB7Ci0JY2hhciBrZXlbNV07Ci0JY2hhciBpbmZvWzZdOwotCWludCByZXQ7CisJY29uc3Qgc3RydWN0IGFwcGxlc21jX2VudHJ5ICplbnRyeTsKIAotCW11dGV4X2xvY2soJmFwcGxlc21jX2xvY2spOworCWVudHJ5ID0gYXBwbGVzbWNfZ2V0X2VudHJ5X2J5X2luZGV4KGtleV9hdF9pbmRleCk7CisJaWYgKElTX0VSUihlbnRyeSkpCisJCXJldHVybiBQVFJfRVJSKGVudHJ5KTsKIAotCXJldCA9IGFwcGxlc21jX2dldF9rZXlfYXRfaW5kZXgoa2V5X2F0X2luZGV4LCBrZXkpOwotCi0JaWYgKHJldCB8fCAha2V5WzBdKSB7Ci0JCW11dGV4X3VubG9jaygmYXBwbGVzbWNfbG9jayk7Ci0KLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JcmV0ID0gYXBwbGVzbWNfZ2V0X2tleV90eXBlKGtleSwgaW5mbyk7Ci0KLQltdXRleF91bmxvY2soJmFwcGxlc21jX2xvY2spOwotCi0JaWYgKCFyZXQpCi0JCXJldHVybiBzbnByaW50ZihzeXNmc2J1ZiwgUEFHRV9TSVpFLCAiJWRcbiIsIGluZm9bMF0pOwotCWVsc2UKLQkJcmV0dXJuIHJldDsKKwlyZXR1cm4gc25wcmludGYoc3lzZnNidWYsIFBBR0VfU0laRSwgIiVkXG4iLCBlbnRyeS0+bGVuKTsKIH0KIAogc3RhdGljIHNzaXplX3QgYXBwbGVzbWNfa2V5X2F0X2luZGV4X3R5cGVfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKnN5c2ZzYnVmKQogewotCWNoYXIga2V5WzVdOwotCWNoYXIgaW5mb1s2XTsKLQlpbnQgcmV0OworCWNvbnN0IHN0cnVjdCBhcHBsZXNtY19lbnRyeSAqZW50cnk7CiAKLQltdXRleF9sb2NrKCZhcHBsZXNtY19sb2NrKTsKKwllbnRyeSA9IGFwcGxlc21jX2dldF9lbnRyeV9ieV9pbmRleChrZXlfYXRfaW5kZXgpOworCWlmIChJU19FUlIoZW50cnkpKQorCQlyZXR1cm4gUFRSX0VSUihlbnRyeSk7CiAKLQlyZXQgPSBhcHBsZXNtY19nZXRfa2V5X2F0X2luZGV4KGtleV9hdF9pbmRleCwga2V5KTsKLQotCWlmIChyZXQgfHwgIWtleVswXSkgewotCQltdXRleF91bmxvY2soJmFwcGxlc21jX2xvY2spOwotCi0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXJldCA9IGFwcGxlc21jX2dldF9rZXlfdHlwZShrZXksIGluZm8pOwotCi0JbXV0ZXhfdW5sb2NrKCZhcHBsZXNtY19sb2NrKTsKLQotCWlmICghcmV0KQotCQlyZXR1cm4gc25wcmludGYoc3lzZnNidWYsIFBBR0VfU0laRSwgIiVzXG4iLCBpbmZvKzEpOwotCWVsc2UKLQkJcmV0dXJuIHJldDsKKwlyZXR1cm4gc25wcmludGYoc3lzZnNidWYsIFBBR0VfU0laRSwgIiVzXG4iLCBlbnRyeS0+dHlwZSk7CiB9CiAKIHN0YXRpYyBzc2l6ZV90IGFwcGxlc21jX2tleV9hdF9pbmRleF9uYW1lX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAogCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpzeXNmc2J1ZikKIHsKLQljaGFyIGtleVs1XTsKLQlpbnQgcmV0OworCWNvbnN0IHN0cnVjdCBhcHBsZXNtY19lbnRyeSAqZW50cnk7CiAKLQltdXRleF9sb2NrKCZhcHBsZXNtY19sb2NrKTsKKwllbnRyeSA9IGFwcGxlc21jX2dldF9lbnRyeV9ieV9pbmRleChrZXlfYXRfaW5kZXgpOworCWlmIChJU19FUlIoZW50cnkpKQorCQlyZXR1cm4gUFRSX0VSUihlbnRyeSk7CiAKLQlyZXQgPSBhcHBsZXNtY19nZXRfa2V5X2F0X2luZGV4KGtleV9hdF9pbmRleCwga2V5KTsKLQotCW11dGV4X3VubG9jaygmYXBwbGVzbWNfbG9jayk7Ci0KLQlpZiAoIXJldCAmJiBrZXlbMF0pCi0JCXJldHVybiBzbnByaW50ZihzeXNmc2J1ZiwgUEFHRV9TSVpFLCAiJXNcbiIsIGtleSk7Ci0JZWxzZQotCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gc25wcmludGYoc3lzZnNidWYsIFBBR0VfU0laRSwgIiVzXG4iLCBlbnRyeS0+a2V5KTsKIH0KIAogc3RhdGljIHNzaXplX3QgYXBwbGVzbWNfa2V5X2F0X2luZGV4X3Nob3coc3RydWN0IGRldmljZSAqZGV2LApAQCAtMTAyMCwxMiArOTc1LDEzIEBACiBzdGF0aWMgc3NpemVfdCBhcHBsZXNtY19rZXlfYXRfaW5kZXhfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAogCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpzeXNmc2J1Ziwgc2l6ZV90IGNvdW50KQogewotCW11dGV4X2xvY2soJmFwcGxlc21jX2xvY2spOworCXVuc2lnbmVkIGxvbmcgbmV3a2V5OwogCi0Ja2V5X2F0X2luZGV4ID0gc2ltcGxlX3N0cnRvdWwoc3lzZnNidWYsIE5VTEwsIDEwKTsKKwlpZiAoc3RyaWN0X3N0cnRvdWwoc3lzZnNidWYsIDEwLCAmbmV3a2V5KSA8IDAKKwkgICAgfHwgbmV3a2V5ID49IHNtY3JlZy5rZXlfY291bnQpCisJCXJldHVybiAtRUlOVkFMOwogCi0JbXV0ZXhfdW5sb2NrKCZhcHBsZXNtY19sb2NrKTsKLQorCWtleV9hdF9pbmRleCA9IG5ld2tleTsKIAlyZXR1cm4gY291bnQ7CiB9CiAKQEAgLTEwMzUsMzg3ICs5OTEsMTAxIEBACiAJLmJyaWdodG5lc3Nfc2V0CQk9IGFwcGxlc21jX2JyaWdodG5lc3Nfc2V0LAogfTsKIAotc3RhdGljIERFVklDRV9BVFRSKG5hbWUsIDA0NDQsIGFwcGxlc21jX25hbWVfc2hvdywgTlVMTCk7Ci0KLXN0YXRpYyBERVZJQ0VfQVRUUihwb3NpdGlvbiwgMDQ0NCwgYXBwbGVzbWNfcG9zaXRpb25fc2hvdywgTlVMTCk7Ci1zdGF0aWMgREVWSUNFX0FUVFIoY2FsaWJyYXRlLCAwNjQ0LAotCQkJYXBwbGVzbWNfY2FsaWJyYXRlX3Nob3csIGFwcGxlc21jX2NhbGlicmF0ZV9zdG9yZSk7Ci0KLXN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICphY2NlbGVyb21ldGVyX2F0dHJpYnV0ZXNbXSA9IHsKLQkmZGV2X2F0dHJfcG9zaXRpb24uYXR0ciwKLQkmZGV2X2F0dHJfY2FsaWJyYXRlLmF0dHIsCi0JTlVMTAorc3RhdGljIHN0cnVjdCBhcHBsZXNtY19ub2RlX2dyb3VwIGluZm9fZ3JvdXBbXSA9IHsKKwl7ICJuYW1lIiwgYXBwbGVzbWNfbmFtZV9zaG93IH0sCisJeyAia2V5X2NvdW50IiwgYXBwbGVzbWNfa2V5X2NvdW50X3Nob3cgfSwKKwl7ICJrZXlfYXRfaW5kZXgiLCBhcHBsZXNtY19rZXlfYXRfaW5kZXhfc2hvdywgYXBwbGVzbWNfa2V5X2F0X2luZGV4X3N0b3JlIH0sCisJeyAia2V5X2F0X2luZGV4X25hbWUiLCBhcHBsZXNtY19rZXlfYXRfaW5kZXhfbmFtZV9zaG93IH0sCisJeyAia2V5X2F0X2luZGV4X3R5cGUiLCBhcHBsZXNtY19rZXlfYXRfaW5kZXhfdHlwZV9zaG93IH0sCisJeyAia2V5X2F0X2luZGV4X2RhdGFfbGVuZ3RoIiwgYXBwbGVzbWNfa2V5X2F0X2luZGV4X2RhdGFfbGVuZ3RoX3Nob3cgfSwKKwl7ICJrZXlfYXRfaW5kZXhfZGF0YSIsIGFwcGxlc21jX2tleV9hdF9pbmRleF9yZWFkX3Nob3cgfSwKKwl7IH0KIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGFjY2VsZXJvbWV0ZXJfYXR0cmlidXRlc19ncm91cCA9Ci0JeyAuYXR0cnMgPSBhY2NlbGVyb21ldGVyX2F0dHJpYnV0ZXMgfTsKLQotc3RhdGljIERFVklDRV9BVFRSKGxpZ2h0LCAwNDQ0LCBhcHBsZXNtY19saWdodF9zaG93LCBOVUxMKTsKLQotc3RhdGljIERFVklDRV9BVFRSKGtleV9jb3VudCwgMDQ0NCwgYXBwbGVzbWNfa2V5X2NvdW50X3Nob3csIE5VTEwpOwotc3RhdGljIERFVklDRV9BVFRSKGtleV9hdF9pbmRleCwgMDY0NCwKLQkJYXBwbGVzbWNfa2V5X2F0X2luZGV4X3Nob3csIGFwcGxlc21jX2tleV9hdF9pbmRleF9zdG9yZSk7Ci1zdGF0aWMgREVWSUNFX0FUVFIoa2V5X2F0X2luZGV4X25hbWUsIDA0NDQsCi0JCQkJCWFwcGxlc21jX2tleV9hdF9pbmRleF9uYW1lX3Nob3csIE5VTEwpOwotc3RhdGljIERFVklDRV9BVFRSKGtleV9hdF9pbmRleF90eXBlLCAwNDQ0LAotCQkJCQlhcHBsZXNtY19rZXlfYXRfaW5kZXhfdHlwZV9zaG93LCBOVUxMKTsKLXN0YXRpYyBERVZJQ0VfQVRUUihrZXlfYXRfaW5kZXhfZGF0YV9sZW5ndGgsIDA0NDQsCi0JCQkJYXBwbGVzbWNfa2V5X2F0X2luZGV4X2RhdGFfbGVuZ3RoX3Nob3csIE5VTEwpOwotc3RhdGljIERFVklDRV9BVFRSKGtleV9hdF9pbmRleF9kYXRhLCAwNDQ0LAotCQkJCWFwcGxlc21jX2tleV9hdF9pbmRleF9yZWFkX3Nob3csIE5VTEwpOwotCi1zdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqa2V5X2VudW1lcmF0aW9uX2F0dHJpYnV0ZXNbXSA9IHsKLQkmZGV2X2F0dHJfa2V5X2NvdW50LmF0dHIsCi0JJmRldl9hdHRyX2tleV9hdF9pbmRleC5hdHRyLAotCSZkZXZfYXR0cl9rZXlfYXRfaW5kZXhfbmFtZS5hdHRyLAotCSZkZXZfYXR0cl9rZXlfYXRfaW5kZXhfdHlwZS5hdHRyLAotCSZkZXZfYXR0cl9rZXlfYXRfaW5kZXhfZGF0YV9sZW5ndGguYXR0ciwKLQkmZGV2X2F0dHJfa2V5X2F0X2luZGV4X2RhdGEuYXR0ciwKLQlOVUxMCitzdGF0aWMgc3RydWN0IGFwcGxlc21jX25vZGVfZ3JvdXAgYWNjZWxlcm9tZXRlcl9ncm91cFtdID0geworCXsgInBvc2l0aW9uIiwgYXBwbGVzbWNfcG9zaXRpb25fc2hvdyB9LAorCXsgImNhbGlicmF0ZSIsIGFwcGxlc21jX2NhbGlicmF0ZV9zaG93LCBhcHBsZXNtY19jYWxpYnJhdGVfc3RvcmUgfSwKKwl7IH0KIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGtleV9lbnVtZXJhdGlvbl9ncm91cCA9Ci0JeyAuYXR0cnMgPSBrZXlfZW51bWVyYXRpb25fYXR0cmlidXRlcyB9OwotCi0vKgotICogTWFjcm8gZGVmaW5pbmcgU0VOU09SX0RFVklDRV9BVFRSIGZvciBhIGZhbiBzeXNmcyBlbnRyaWVzLgotICogIC0gc2hvdyBhY3R1YWwgc3BlZWQKLSAqICAtIHNob3cvc3RvcmUgbWluaW11bSBzcGVlZAotICogIC0gc2hvdyBtYXhpbXVtIHNwZWVkCi0gKiAgLSBzaG93IHNhZmUgc3BlZWQKLSAqICAtIHNob3cvc3RvcmUgdGFyZ2V0IHNwZWVkCi0gKiAgLSBzaG93L3N0b3JlIG1hbnVhbCBtb2RlCi0gKi8KLSNkZWZpbmUgc3lzZnNfZmFuX3NwZWVkc19vZmZzZXQob2Zmc2V0KSBcCi1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSXzIoZmFuIyNvZmZzZXQjI19pbnB1dCwgU19JUlVHTywgXAotCQkJYXBwbGVzbWNfc2hvd19mYW5fc3BlZWQsIE5VTEwsIDAsIG9mZnNldC0xKTsgXAotXAotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUl8yKGZhbiMjb2Zmc2V0IyNfbWluLCBTX0lSVUdPIHwgU19JV1VTUiwgXAotCWFwcGxlc21jX3Nob3dfZmFuX3NwZWVkLCBhcHBsZXNtY19zdG9yZV9mYW5fc3BlZWQsIDEsIG9mZnNldC0xKTsgXAotXAotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUl8yKGZhbiMjb2Zmc2V0IyNfbWF4LCBTX0lSVUdPLCBcCi0JCQlhcHBsZXNtY19zaG93X2Zhbl9zcGVlZCwgTlVMTCwgMiwgb2Zmc2V0LTEpOyBcCi1cCi1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSXzIoZmFuIyNvZmZzZXQjI19zYWZlLCBTX0lSVUdPLCBcCi0JCQlhcHBsZXNtY19zaG93X2Zhbl9zcGVlZCwgTlVMTCwgMywgb2Zmc2V0LTEpOyBcCi1cCi1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSXzIoZmFuIyNvZmZzZXQjI19vdXRwdXQsIFNfSVJVR08gfCBTX0lXVVNSLCBcCi0JYXBwbGVzbWNfc2hvd19mYW5fc3BlZWQsIGFwcGxlc21jX3N0b3JlX2Zhbl9zcGVlZCwgNCwgb2Zmc2V0LTEpOyBcCi1cCi1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGZhbiMjb2Zmc2V0IyNfbWFudWFsLCBTX0lSVUdPIHwgU19JV1VTUiwgXAotCWFwcGxlc21jX3Nob3dfZmFuX21hbnVhbCwgYXBwbGVzbWNfc3RvcmVfZmFuX21hbnVhbCwgb2Zmc2V0LTEpOyBcCi1cCi1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGZhbiMjb2Zmc2V0IyNfbGFiZWwsIFNfSVJVR08sIFwKLQlhcHBsZXNtY19zaG93X2Zhbl9wb3NpdGlvbiwgTlVMTCwgb2Zmc2V0LTEpOyBcCi1cCi1zdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqZmFuIyNvZmZzZXQjI19hdHRyaWJ1dGVzW10gPSB7IFwKLQkmc2Vuc29yX2Rldl9hdHRyX2ZhbiMjb2Zmc2V0IyNfaW5wdXQuZGV2X2F0dHIuYXR0ciwgXAotCSZzZW5zb3JfZGV2X2F0dHJfZmFuIyNvZmZzZXQjI19taW4uZGV2X2F0dHIuYXR0ciwgXAotCSZzZW5zb3JfZGV2X2F0dHJfZmFuIyNvZmZzZXQjI19tYXguZGV2X2F0dHIuYXR0ciwgXAotCSZzZW5zb3JfZGV2X2F0dHJfZmFuIyNvZmZzZXQjI19zYWZlLmRldl9hdHRyLmF0dHIsIFwKLQkmc2Vuc29yX2Rldl9hdHRyX2ZhbiMjb2Zmc2V0IyNfb3V0cHV0LmRldl9hdHRyLmF0dHIsIFwKLQkmc2Vuc29yX2Rldl9hdHRyX2ZhbiMjb2Zmc2V0IyNfbWFudWFsLmRldl9hdHRyLmF0dHIsIFwKLQkmc2Vuc29yX2Rldl9hdHRyX2ZhbiMjb2Zmc2V0IyNfbGFiZWwuZGV2X2F0dHIuYXR0ciwgXAotCU5VTEwgXAorc3RhdGljIHN0cnVjdCBhcHBsZXNtY19ub2RlX2dyb3VwIGxpZ2h0X3NlbnNvcl9ncm91cFtdID0geworCXsgImxpZ2h0IiwgYXBwbGVzbWNfbGlnaHRfc2hvdyB9LAorCXsgfQogfTsKIAotLyoKLSAqIENyZWF0ZSB0aGUgbmVlZGVkIGZ1bmN0aW9ucyBmb3IgZWFjaCBmYW4gdXNpbmcgdGhlIG1hY3JvIGRlZmluZWQgYWJvdmUKLSAqICg0IGZhbnMgYXJlIHN1cHBvcnRlZCkKLSAqLwotc3lzZnNfZmFuX3NwZWVkc19vZmZzZXQoMSk7Ci1zeXNmc19mYW5fc3BlZWRzX29mZnNldCgyKTsKLXN5c2ZzX2Zhbl9zcGVlZHNfb2Zmc2V0KDMpOwotc3lzZnNfZmFuX3NwZWVkc19vZmZzZXQoNCk7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGZhbl9hdHRyaWJ1dGVfZ3JvdXBzW10gPSB7Ci0JeyAuYXR0cnMgPSBmYW4xX2F0dHJpYnV0ZXMgfSwKLQl7IC5hdHRycyA9IGZhbjJfYXR0cmlidXRlcyB9LAotCXsgLmF0dHJzID0gZmFuM19hdHRyaWJ1dGVzIH0sCi0JeyAuYXR0cnMgPSBmYW40X2F0dHJpYnV0ZXMgfSwKK3N0YXRpYyBzdHJ1Y3QgYXBwbGVzbWNfbm9kZV9ncm91cCBmYW5fZ3JvdXBbXSA9IHsKKwl7ICJmYW4lZF9sYWJlbCIsIGFwcGxlc21jX3Nob3dfZmFuX3Bvc2l0aW9uIH0sCisJeyAiZmFuJWRfaW5wdXQiLCBhcHBsZXNtY19zaG93X2Zhbl9zcGVlZCwgTlVMTCwgMCB9LAorCXsgImZhbiVkX21pbiIsIGFwcGxlc21jX3Nob3dfZmFuX3NwZWVkLCBhcHBsZXNtY19zdG9yZV9mYW5fc3BlZWQsIDEgfSwKKwl7ICJmYW4lZF9tYXgiLCBhcHBsZXNtY19zaG93X2Zhbl9zcGVlZCwgTlVMTCwgMiB9LAorCXsgImZhbiVkX3NhZmUiLCBhcHBsZXNtY19zaG93X2Zhbl9zcGVlZCwgTlVMTCwgMyB9LAorCXsgImZhbiVkX291dHB1dCIsIGFwcGxlc21jX3Nob3dfZmFuX3NwZWVkLCBhcHBsZXNtY19zdG9yZV9mYW5fc3BlZWQsIDQgfSwKKwl7ICJmYW4lZF9tYW51YWwiLCBhcHBsZXNtY19zaG93X2Zhbl9tYW51YWwsIGFwcGxlc21jX3N0b3JlX2Zhbl9tYW51YWwgfSwKKwl7IH0KIH07CiAKLS8qCi0gKiBUZW1wZXJhdHVyZSBzZW5zb3JzIHN5c2ZzIGVudHJpZXMuCi0gKi8KLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDFfbGFiZWwsIFNfSVJVR08sCi0JCQkJCWFwcGxlc21jX3Nob3dfc2Vuc29yX2xhYmVsLCBOVUxMLCAwKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDJfbGFiZWwsIFNfSVJVR08sCi0JCQkJCWFwcGxlc21jX3Nob3dfc2Vuc29yX2xhYmVsLCBOVUxMLCAxKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDNfbGFiZWwsIFNfSVJVR08sCi0JCQkJCWFwcGxlc21jX3Nob3dfc2Vuc29yX2xhYmVsLCBOVUxMLCAyKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDRfbGFiZWwsIFNfSVJVR08sCi0JCQkJCWFwcGxlc21jX3Nob3dfc2Vuc29yX2xhYmVsLCBOVUxMLCAzKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDVfbGFiZWwsIFNfSVJVR08sCi0JCQkJCWFwcGxlc21jX3Nob3dfc2Vuc29yX2xhYmVsLCBOVUxMLCA0KTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDZfbGFiZWwsIFNfSVJVR08sCi0JCQkJCWFwcGxlc21jX3Nob3dfc2Vuc29yX2xhYmVsLCBOVUxMLCA1KTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDdfbGFiZWwsIFNfSVJVR08sCi0JCQkJCWFwcGxlc21jX3Nob3dfc2Vuc29yX2xhYmVsLCBOVUxMLCA2KTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDhfbGFiZWwsIFNfSVJVR08sCi0JCQkJCWFwcGxlc21jX3Nob3dfc2Vuc29yX2xhYmVsLCBOVUxMLCA3KTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDlfbGFiZWwsIFNfSVJVR08sCi0JCQkJCWFwcGxlc21jX3Nob3dfc2Vuc29yX2xhYmVsLCBOVUxMLCA4KTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDEwX2xhYmVsLCBTX0lSVUdPLAotCQkJCQlhcHBsZXNtY19zaG93X3NlbnNvcl9sYWJlbCwgTlVMTCwgOSk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAxMV9sYWJlbCwgU19JUlVHTywKLQkJCQkJYXBwbGVzbWNfc2hvd19zZW5zb3JfbGFiZWwsIE5VTEwsIDEwKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDEyX2xhYmVsLCBTX0lSVUdPLAotCQkJCQlhcHBsZXNtY19zaG93X3NlbnNvcl9sYWJlbCwgTlVMTCwgMTEpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMTNfbGFiZWwsIFNfSVJVR08sCi0JCQkJCWFwcGxlc21jX3Nob3dfc2Vuc29yX2xhYmVsLCBOVUxMLCAxMik7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAxNF9sYWJlbCwgU19JUlVHTywKLQkJCQkJYXBwbGVzbWNfc2hvd19zZW5zb3JfbGFiZWwsIE5VTEwsIDEzKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDE1X2xhYmVsLCBTX0lSVUdPLAotCQkJCQlhcHBsZXNtY19zaG93X3NlbnNvcl9sYWJlbCwgTlVMTCwgMTQpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMTZfbGFiZWwsIFNfSVJVR08sCi0JCQkJCWFwcGxlc21jX3Nob3dfc2Vuc29yX2xhYmVsLCBOVUxMLCAxNSk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAxN19sYWJlbCwgU19JUlVHTywKLQkJCQkJYXBwbGVzbWNfc2hvd19zZW5zb3JfbGFiZWwsIE5VTEwsIDE2KTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDE4X2xhYmVsLCBTX0lSVUdPLAotCQkJCQlhcHBsZXNtY19zaG93X3NlbnNvcl9sYWJlbCwgTlVMTCwgMTcpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMTlfbGFiZWwsIFNfSVJVR08sCi0JCQkJCWFwcGxlc21jX3Nob3dfc2Vuc29yX2xhYmVsLCBOVUxMLCAxOCk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAyMF9sYWJlbCwgU19JUlVHTywKLQkJCQkJYXBwbGVzbWNfc2hvd19zZW5zb3JfbGFiZWwsIE5VTEwsIDE5KTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDIxX2xhYmVsLCBTX0lSVUdPLAotCQkJCQlhcHBsZXNtY19zaG93X3NlbnNvcl9sYWJlbCwgTlVMTCwgMjApOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMjJfbGFiZWwsIFNfSVJVR08sCi0JCQkJCWFwcGxlc21jX3Nob3dfc2Vuc29yX2xhYmVsLCBOVUxMLCAyMSk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAyM19sYWJlbCwgU19JUlVHTywKLQkJCQkJYXBwbGVzbWNfc2hvd19zZW5zb3JfbGFiZWwsIE5VTEwsIDIyKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDI0X2xhYmVsLCBTX0lSVUdPLAotCQkJCQlhcHBsZXNtY19zaG93X3NlbnNvcl9sYWJlbCwgTlVMTCwgMjMpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMjVfbGFiZWwsIFNfSVJVR08sCi0JCQkJCWFwcGxlc21jX3Nob3dfc2Vuc29yX2xhYmVsLCBOVUxMLCAyNCk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAyNl9sYWJlbCwgU19JUlVHTywKLQkJCQkJYXBwbGVzbWNfc2hvd19zZW5zb3JfbGFiZWwsIE5VTEwsIDI1KTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDI3X2xhYmVsLCBTX0lSVUdPLAotCQkJCQlhcHBsZXNtY19zaG93X3NlbnNvcl9sYWJlbCwgTlVMTCwgMjYpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMjhfbGFiZWwsIFNfSVJVR08sCi0JCQkJCWFwcGxlc21jX3Nob3dfc2Vuc29yX2xhYmVsLCBOVUxMLCAyNyk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAyOV9sYWJlbCwgU19JUlVHTywKLQkJCQkJYXBwbGVzbWNfc2hvd19zZW5zb3JfbGFiZWwsIE5VTEwsIDI4KTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDMwX2xhYmVsLCBTX0lSVUdPLAotCQkJCQlhcHBsZXNtY19zaG93X3NlbnNvcl9sYWJlbCwgTlVMTCwgMjkpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMzFfbGFiZWwsIFNfSVJVR08sCi0JCQkJCWFwcGxlc21jX3Nob3dfc2Vuc29yX2xhYmVsLCBOVUxMLCAzMCk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAzMl9sYWJlbCwgU19JUlVHTywKLQkJCQkJYXBwbGVzbWNfc2hvd19zZW5zb3JfbGFiZWwsIE5VTEwsIDMxKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDMzX2xhYmVsLCBTX0lSVUdPLAotCQkJCQlhcHBsZXNtY19zaG93X3NlbnNvcl9sYWJlbCwgTlVMTCwgMzIpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMzRfbGFiZWwsIFNfSVJVR08sCi0JCQkJCWFwcGxlc21jX3Nob3dfc2Vuc29yX2xhYmVsLCBOVUxMLCAzMyk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAzNV9sYWJlbCwgU19JUlVHTywKLQkJCQkJYXBwbGVzbWNfc2hvd19zZW5zb3JfbGFiZWwsIE5VTEwsIDM0KTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDM2X2xhYmVsLCBTX0lSVUdPLAotCQkJCQlhcHBsZXNtY19zaG93X3NlbnNvcl9sYWJlbCwgTlVMTCwgMzUpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMzdfbGFiZWwsIFNfSVJVR08sCi0JCQkJCWFwcGxlc21jX3Nob3dfc2Vuc29yX2xhYmVsLCBOVUxMLCAzNik7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAzOF9sYWJlbCwgU19JUlVHTywKLQkJCQkJYXBwbGVzbWNfc2hvd19zZW5zb3JfbGFiZWwsIE5VTEwsIDM3KTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDM5X2xhYmVsLCBTX0lSVUdPLAotCQkJCQlhcHBsZXNtY19zaG93X3NlbnNvcl9sYWJlbCwgTlVMTCwgMzgpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wNDBfbGFiZWwsIFNfSVJVR08sCi0JCQkJCWFwcGxlc21jX3Nob3dfc2Vuc29yX2xhYmVsLCBOVUxMLCAzOSk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAxX2lucHV0LCBTX0lSVUdPLAotCQkJCQlhcHBsZXNtY19zaG93X3RlbXBlcmF0dXJlLCBOVUxMLCAwKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDJfaW5wdXQsIFNfSVJVR08sCi0JCQkJCWFwcGxlc21jX3Nob3dfdGVtcGVyYXR1cmUsIE5VTEwsIDEpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wM19pbnB1dCwgU19JUlVHTywKLQkJCQkJYXBwbGVzbWNfc2hvd190ZW1wZXJhdHVyZSwgTlVMTCwgMik7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXA0X2lucHV0LCBTX0lSVUdPLAotCQkJCQlhcHBsZXNtY19zaG93X3RlbXBlcmF0dXJlLCBOVUxMLCAzKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDVfaW5wdXQsIFNfSVJVR08sCi0JCQkJCWFwcGxlc21jX3Nob3dfdGVtcGVyYXR1cmUsIE5VTEwsIDQpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wNl9pbnB1dCwgU19JUlVHTywKLQkJCQkJYXBwbGVzbWNfc2hvd190ZW1wZXJhdHVyZSwgTlVMTCwgNSk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXA3X2lucHV0LCBTX0lSVUdPLAotCQkJCQlhcHBsZXNtY19zaG93X3RlbXBlcmF0dXJlLCBOVUxMLCA2KTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDhfaW5wdXQsIFNfSVJVR08sCi0JCQkJCWFwcGxlc21jX3Nob3dfdGVtcGVyYXR1cmUsIE5VTEwsIDcpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wOV9pbnB1dCwgU19JUlVHTywKLQkJCQkJYXBwbGVzbWNfc2hvd190ZW1wZXJhdHVyZSwgTlVMTCwgOCk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAxMF9pbnB1dCwgU19JUlVHTywKLQkJCQkJYXBwbGVzbWNfc2hvd190ZW1wZXJhdHVyZSwgTlVMTCwgOSk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAxMV9pbnB1dCwgU19JUlVHTywKLQkJCQkJYXBwbGVzbWNfc2hvd190ZW1wZXJhdHVyZSwgTlVMTCwgMTApOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMTJfaW5wdXQsIFNfSVJVR08sCi0JCQkJCWFwcGxlc21jX3Nob3dfdGVtcGVyYXR1cmUsIE5VTEwsIDExKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDEzX2lucHV0LCBTX0lSVUdPLAotCQkJCQlhcHBsZXNtY19zaG93X3RlbXBlcmF0dXJlLCBOVUxMLCAxMik7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAxNF9pbnB1dCwgU19JUlVHTywKLQkJCQkJYXBwbGVzbWNfc2hvd190ZW1wZXJhdHVyZSwgTlVMTCwgMTMpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMTVfaW5wdXQsIFNfSVJVR08sCi0JCQkJCWFwcGxlc21jX3Nob3dfdGVtcGVyYXR1cmUsIE5VTEwsIDE0KTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDE2X2lucHV0LCBTX0lSVUdPLAotCQkJCQlhcHBsZXNtY19zaG93X3RlbXBlcmF0dXJlLCBOVUxMLCAxNSk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAxN19pbnB1dCwgU19JUlVHTywKLQkJCQkJYXBwbGVzbWNfc2hvd190ZW1wZXJhdHVyZSwgTlVMTCwgMTYpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMThfaW5wdXQsIFNfSVJVR08sCi0JCQkJCWFwcGxlc21jX3Nob3dfdGVtcGVyYXR1cmUsIE5VTEwsIDE3KTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDE5X2lucHV0LCBTX0lSVUdPLAotCQkJCQlhcHBsZXNtY19zaG93X3RlbXBlcmF0dXJlLCBOVUxMLCAxOCk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAyMF9pbnB1dCwgU19JUlVHTywKLQkJCQkJYXBwbGVzbWNfc2hvd190ZW1wZXJhdHVyZSwgTlVMTCwgMTkpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMjFfaW5wdXQsIFNfSVJVR08sCi0JCQkJCWFwcGxlc21jX3Nob3dfdGVtcGVyYXR1cmUsIE5VTEwsIDIwKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDIyX2lucHV0LCBTX0lSVUdPLAotCQkJCQlhcHBsZXNtY19zaG93X3RlbXBlcmF0dXJlLCBOVUxMLCAyMSk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAyM19pbnB1dCwgU19JUlVHTywKLQkJCQkJYXBwbGVzbWNfc2hvd190ZW1wZXJhdHVyZSwgTlVMTCwgMjIpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMjRfaW5wdXQsIFNfSVJVR08sCi0JCQkJCWFwcGxlc21jX3Nob3dfdGVtcGVyYXR1cmUsIE5VTEwsIDIzKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDI1X2lucHV0LCBTX0lSVUdPLAotCQkJCQlhcHBsZXNtY19zaG93X3RlbXBlcmF0dXJlLCBOVUxMLCAyNCk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAyNl9pbnB1dCwgU19JUlVHTywKLQkJCQkJYXBwbGVzbWNfc2hvd190ZW1wZXJhdHVyZSwgTlVMTCwgMjUpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMjdfaW5wdXQsIFNfSVJVR08sCi0JCQkJCWFwcGxlc21jX3Nob3dfdGVtcGVyYXR1cmUsIE5VTEwsIDI2KTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDI4X2lucHV0LCBTX0lSVUdPLAotCQkJCQlhcHBsZXNtY19zaG93X3RlbXBlcmF0dXJlLCBOVUxMLCAyNyk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAyOV9pbnB1dCwgU19JUlVHTywKLQkJCQkJYXBwbGVzbWNfc2hvd190ZW1wZXJhdHVyZSwgTlVMTCwgMjgpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMzBfaW5wdXQsIFNfSVJVR08sCi0JCQkJCWFwcGxlc21jX3Nob3dfdGVtcGVyYXR1cmUsIE5VTEwsIDI5KTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDMxX2lucHV0LCBTX0lSVUdPLAotCQkJCQlhcHBsZXNtY19zaG93X3RlbXBlcmF0dXJlLCBOVUxMLCAzMCk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAzMl9pbnB1dCwgU19JUlVHTywKLQkJCQkJYXBwbGVzbWNfc2hvd190ZW1wZXJhdHVyZSwgTlVMTCwgMzEpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMzNfaW5wdXQsIFNfSVJVR08sCi0JCQkJCWFwcGxlc21jX3Nob3dfdGVtcGVyYXR1cmUsIE5VTEwsIDMyKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDM0X2lucHV0LCBTX0lSVUdPLAotCQkJCQlhcHBsZXNtY19zaG93X3RlbXBlcmF0dXJlLCBOVUxMLCAzMyk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAzNV9pbnB1dCwgU19JUlVHTywKLQkJCQkJYXBwbGVzbWNfc2hvd190ZW1wZXJhdHVyZSwgTlVMTCwgMzQpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMzZfaW5wdXQsIFNfSVJVR08sCi0JCQkJCWFwcGxlc21jX3Nob3dfdGVtcGVyYXR1cmUsIE5VTEwsIDM1KTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDM3X2lucHV0LCBTX0lSVUdPLAotCQkJCQlhcHBsZXNtY19zaG93X3RlbXBlcmF0dXJlLCBOVUxMLCAzNik7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAzOF9pbnB1dCwgU19JUlVHTywKLQkJCQkJYXBwbGVzbWNfc2hvd190ZW1wZXJhdHVyZSwgTlVMTCwgMzcpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMzlfaW5wdXQsIFNfSVJVR08sCi0JCQkJCWFwcGxlc21jX3Nob3dfdGVtcGVyYXR1cmUsIE5VTEwsIDM4KTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDQwX2lucHV0LCBTX0lSVUdPLAotCQkJCQlhcHBsZXNtY19zaG93X3RlbXBlcmF0dXJlLCBOVUxMLCAzOSk7Ci0KLXN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpsYWJlbF9hdHRyaWJ1dGVzW10gPSB7Ci0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wMV9sYWJlbC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDJfbGFiZWwuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAzX2xhYmVsLmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wNF9sYWJlbC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDVfbGFiZWwuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXA2X2xhYmVsLmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wN19sYWJlbC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDhfbGFiZWwuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXA5X2xhYmVsLmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wMTBfbGFiZWwuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAxMV9sYWJlbC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDEyX2xhYmVsLmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wMTNfbGFiZWwuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAxNF9sYWJlbC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDE1X2xhYmVsLmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wMTZfbGFiZWwuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAxN19sYWJlbC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDE4X2xhYmVsLmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wMTlfbGFiZWwuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAyMF9sYWJlbC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDIxX2xhYmVsLmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wMjJfbGFiZWwuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAyM19sYWJlbC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDI0X2xhYmVsLmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wMjVfbGFiZWwuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAyNl9sYWJlbC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDI3X2xhYmVsLmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wMjhfbGFiZWwuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAyOV9sYWJlbC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDMwX2xhYmVsLmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wMzFfbGFiZWwuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAzMl9sYWJlbC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDMzX2xhYmVsLmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wMzRfbGFiZWwuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAzNV9sYWJlbC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDM2X2xhYmVsLmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wMzdfbGFiZWwuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAzOF9sYWJlbC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDM5X2xhYmVsLmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wNDBfbGFiZWwuZGV2X2F0dHIuYXR0ciwKLQlOVUxMCi19OwotCi1zdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqdGVtcGVyYXR1cmVfYXR0cmlidXRlc1tdID0gewotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDFfaW5wdXQuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAyX2lucHV0LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wM19pbnB1dC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDRfaW5wdXQuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXA1X2lucHV0LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wNl9pbnB1dC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDdfaW5wdXQuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXA4X2lucHV0LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wOV9pbnB1dC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDEwX2lucHV0LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wMTFfaW5wdXQuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAxMl9pbnB1dC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDEzX2lucHV0LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wMTRfaW5wdXQuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAxNV9pbnB1dC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDE2X2lucHV0LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wMTdfaW5wdXQuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAxOF9pbnB1dC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDE5X2lucHV0LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wMjBfaW5wdXQuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAyMV9pbnB1dC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDIyX2lucHV0LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wMjNfaW5wdXQuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAyNF9pbnB1dC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDI1X2lucHV0LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wMjZfaW5wdXQuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAyN19pbnB1dC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDI4X2lucHV0LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wMjlfaW5wdXQuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAzMF9pbnB1dC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDMxX2lucHV0LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wMzJfaW5wdXQuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAzM19pbnB1dC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDM0X2lucHV0LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wMzVfaW5wdXQuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAzNl9pbnB1dC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDM3X2lucHV0LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wMzhfaW5wdXQuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAzOV9pbnB1dC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDQwX2lucHV0LmRldl9hdHRyLmF0dHIsCi0JTlVMTAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgdGVtcGVyYXR1cmVfYXR0cmlidXRlc19ncm91cCA9Ci0JeyAuYXR0cnMgPSB0ZW1wZXJhdHVyZV9hdHRyaWJ1dGVzIH07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGxhYmVsX2F0dHJpYnV0ZXNfZ3JvdXAgPSB7Ci0JLmF0dHJzID0gbGFiZWxfYXR0cmlidXRlcworc3RhdGljIHN0cnVjdCBhcHBsZXNtY19ub2RlX2dyb3VwIHRlbXBfZ3JvdXBbXSA9IHsKKwl7ICJ0ZW1wJWRfbGFiZWwiLCBhcHBsZXNtY19zaG93X3NlbnNvcl9sYWJlbCB9LAorCXsgInRlbXAlZF9pbnB1dCIsIGFwcGxlc21jX3Nob3dfdGVtcGVyYXR1cmUgfSwKKwl7IH0KIH07CiAKIC8qIE1vZHVsZSBzdHVmZiAqLwogCiAvKgotICogYXBwbGVzbWNfZG1pX21hdGNoIC0gZm91bmQgYSBtYXRjaC4gIHJldHVybiBvbmUsIHNob3J0LWNpcmN1aXRpbmcgdGhlIGh1bnQuCisgKiBhcHBsZXNtY19kZXN0cm95X25vZGVzIC0gcmVtb3ZlIGZpbGVzIGFuZCBmcmVlIGFzc29jaWF0ZWQgbWVtb3J5CiAgKi8KLXN0YXRpYyBpbnQgYXBwbGVzbWNfZG1pX21hdGNoKGNvbnN0IHN0cnVjdCBkbWlfc3lzdGVtX2lkICppZCkKK3N0YXRpYyB2b2lkIGFwcGxlc21jX2Rlc3Ryb3lfbm9kZXMoc3RydWN0IGFwcGxlc21jX25vZGVfZ3JvdXAgKmdyb3VwcykKIHsKLQlpbnQgaSA9IDA7Ci0Jc3RydWN0IGRtaV9tYXRjaF9kYXRhKiBkbWlfZGF0YSA9IGlkLT5kcml2ZXJfZGF0YTsKLQlwcmludGsoS0VSTl9JTkZPICJhcHBsZXNtYzogJXMgZGV0ZWN0ZWQ6XG4iLCBpZC0+aWRlbnQpOwotCWFwcGxlc21jX2FjY2VsZXJvbWV0ZXIgPSBkbWlfZGF0YS0+YWNjZWxlcm9tZXRlcjsKLQlwcmludGsoS0VSTl9JTkZPICJhcHBsZXNtYzogIC0gTW9kZWwgJXMgYWNjZWxlcm9tZXRlclxuIiwKLQkJCQlhcHBsZXNtY19hY2NlbGVyb21ldGVyID8gIndpdGgiIDogIndpdGhvdXQiKTsKLQlhcHBsZXNtY19saWdodCA9IGRtaV9kYXRhLT5saWdodDsKLQlwcmludGsoS0VSTl9JTkZPICJhcHBsZXNtYzogIC0gTW9kZWwgJXMgbGlnaHQgc2Vuc29ycyBhbmQgYmFja2xpZ2h0XG4iLAotCQkJCQlhcHBsZXNtY19saWdodCA/ICJ3aXRoIiA6ICJ3aXRob3V0Iik7CisJc3RydWN0IGFwcGxlc21jX25vZGVfZ3JvdXAgKmdycDsKKwlzdHJ1Y3QgYXBwbGVzbWNfZGV2X2F0dHIgKm5vZGU7CiAKLQlhcHBsZXNtY190ZW1wZXJhdHVyZV9zZXQgPSAgZG1pX2RhdGEtPnRlbXBlcmF0dXJlX3NldDsKLQl3aGlsZSAodGVtcGVyYXR1cmVfc2Vuc29yc19zZXRzW2FwcGxlc21jX3RlbXBlcmF0dXJlX3NldF1baV0gIT0gTlVMTCkKLQkJaSsrOwotCXByaW50ayhLRVJOX0lORk8gImFwcGxlc21jOiAgLSBNb2RlbCB3aXRoICVkIHRlbXBlcmF0dXJlIHNlbnNvcnNcbiIsIGkpOwotCXJldHVybiAxOworCWZvciAoZ3JwID0gZ3JvdXBzOyBncnAtPm5vZGVzOyBncnArKykgeworCQlmb3IgKG5vZGUgPSBncnAtPm5vZGVzOyBub2RlLT5zZGEuZGV2X2F0dHIuYXR0ci5uYW1lOyBub2RlKyspCisJCQlzeXNmc19yZW1vdmVfZmlsZSgmcGRldi0+ZGV2LmtvYmosCisJCQkJCSAgJm5vZGUtPnNkYS5kZXZfYXR0ci5hdHRyKTsKKwkJa2ZyZWUoZ3JwLT5ub2Rlcyk7CisJCWdycC0+bm9kZXMgPSBOVUxMOworCX0KK30KKworLyoKKyAqIGFwcGxlc21jX2NyZWF0ZV9ub2RlcyAtIGNyZWF0ZSBhIHR3by1kaW1lbnNpb25hbCBncm91cCBvZiBzeXNmcyBmaWxlcworICovCitzdGF0aWMgaW50IGFwcGxlc21jX2NyZWF0ZV9ub2RlcyhzdHJ1Y3QgYXBwbGVzbWNfbm9kZV9ncm91cCAqZ3JvdXBzLCBpbnQgbnVtKQoreworCXN0cnVjdCBhcHBsZXNtY19ub2RlX2dyb3VwICpncnA7CisJc3RydWN0IGFwcGxlc21jX2Rldl9hdHRyICpub2RlOworCXN0cnVjdCBhdHRyaWJ1dGUgKmF0dHI7CisJaW50IHJldCwgaTsKKworCWZvciAoZ3JwID0gZ3JvdXBzOyBncnAtPmZvcm1hdDsgZ3JwKyspIHsKKwkJZ3JwLT5ub2RlcyA9IGtjYWxsb2MobnVtICsgMSwgc2l6ZW9mKCpub2RlKSwgR0ZQX0tFUk5FTCk7CisJCWlmICghZ3JwLT5ub2RlcykgeworCQkJcmV0ID0gLUVOT01FTTsKKwkJCWdvdG8gb3V0OworCQl9CisJCWZvciAoaSA9IDA7IGkgPCBudW07IGkrKykgeworCQkJbm9kZSA9ICZncnAtPm5vZGVzW2ldOworCQkJc3ByaW50Zihub2RlLT5uYW1lLCBncnAtPmZvcm1hdCwgaSArIDEpOworCQkJbm9kZS0+c2RhLmluZGV4ID0gKGdycC0+b3B0aW9uIDw8IDE2KSB8IChpICYgMHhmZmZmKTsKKwkJCW5vZGUtPnNkYS5kZXZfYXR0ci5zaG93ID0gZ3JwLT5zaG93OworCQkJbm9kZS0+c2RhLmRldl9hdHRyLnN0b3JlID0gZ3JwLT5zdG9yZTsKKwkJCWF0dHIgPSAmbm9kZS0+c2RhLmRldl9hdHRyLmF0dHI7CisJCQlhdHRyLT5uYW1lID0gbm9kZS0+bmFtZTsKKwkJCWF0dHItPm1vZGUgPSBTX0lSVUdPIHwgKGdycC0+c3RvcmUgPyBTX0lXVVNSIDogMCk7CisJCQlyZXQgPSBzeXNmc19jcmVhdGVfZmlsZSgmcGRldi0+ZGV2LmtvYmosIGF0dHIpOworCQkJaWYgKHJldCkgeworCQkJCWF0dHItPm5hbWUgPSBOVUxMOworCQkJCWdvdG8gb3V0OworCQkJfQorCQl9CisJfQorCisJcmV0dXJuIDA7CitvdXQ6CisJYXBwbGVzbWNfZGVzdHJveV9ub2Rlcyhncm91cHMpOworCXJldHVybiByZXQ7CiB9CiAKIC8qIENyZWF0ZSBhY2NlbGVyb21ldGVyIHJlc3NvdXJjZXMgKi8KQEAgLTE0MjQsOCArMTA5NCwxMCBAQAogCXN0cnVjdCBpbnB1dF9kZXYgKmlkZXY7CiAJaW50IHJldDsKIAotCXJldCA9IHN5c2ZzX2NyZWF0ZV9ncm91cCgmcGRldi0+ZGV2LmtvYmosCi0JCQkJCSZhY2NlbGVyb21ldGVyX2F0dHJpYnV0ZXNfZ3JvdXApOworCWlmICghc21jcmVnLmhhc19hY2NlbGVyb21ldGVyKQorCQlyZXR1cm4gMDsKKworCXJldCA9IGFwcGxlc21jX2NyZWF0ZV9ub2RlcyhhY2NlbGVyb21ldGVyX2dyb3VwLCAxKTsKIAlpZiAocmV0KQogCQlnb3RvIG91dDsKIApAQCAtMTQ2MiwxODQgKzExMzQsOTYgQEAKIAlpbnB1dF9mcmVlX3BvbGxlZF9kZXZpY2UoYXBwbGVzbWNfaWRldik7CiAKIG91dF9zeXNmczoKLQlzeXNmc19yZW1vdmVfZ3JvdXAoJnBkZXYtPmRldi5rb2JqLCAmYWNjZWxlcm9tZXRlcl9hdHRyaWJ1dGVzX2dyb3VwKTsKKwlhcHBsZXNtY19kZXN0cm95X25vZGVzKGFjY2VsZXJvbWV0ZXJfZ3JvdXApOwogCiBvdXQ6Ci0JcHJpbnRrKEtFUk5fV0FSTklORyAiYXBwbGVzbWM6IGRyaXZlciBpbml0IGZhaWxlZCAocmV0PSVkKSFcbiIsIHJldCk7CisJcHJfd2FybigiZHJpdmVyIGluaXQgZmFpbGVkIChyZXQ9JWQpIVxuIiwgcmV0KTsKIAlyZXR1cm4gcmV0OwogfQogCiAvKiBSZWxlYXNlIGFsbCByZXNzb3VyY2VzIHVzZWQgYnkgdGhlIGFjY2VsZXJvbWV0ZXIgKi8KIHN0YXRpYyB2b2lkIGFwcGxlc21jX3JlbGVhc2VfYWNjZWxlcm9tZXRlcih2b2lkKQogeworCWlmICghc21jcmVnLmhhc19hY2NlbGVyb21ldGVyKQorCQlyZXR1cm47CiAJaW5wdXRfdW5yZWdpc3Rlcl9wb2xsZWRfZGV2aWNlKGFwcGxlc21jX2lkZXYpOwogCWlucHV0X2ZyZWVfcG9sbGVkX2RldmljZShhcHBsZXNtY19pZGV2KTsKLQlzeXNmc19yZW1vdmVfZ3JvdXAoJnBkZXYtPmRldi5rb2JqLCAmYWNjZWxlcm9tZXRlcl9hdHRyaWJ1dGVzX2dyb3VwKTsKKwlhcHBsZXNtY19kZXN0cm95X25vZGVzKGFjY2VsZXJvbWV0ZXJfZ3JvdXApOwogfQogCi1zdGF0aWMgX19pbml0ZGF0YSBzdHJ1Y3QgZG1pX21hdGNoX2RhdGEgYXBwbGVzbWNfZG1pX2RhdGFbXSA9IHsKLS8qIE1hY0Jvb2sgUHJvOiBhY2NlbGVyb21ldGVyLCBiYWNrbGlnaHQgYW5kIHRlbXBlcmF0dXJlIHNldCAwICovCi0JeyAuYWNjZWxlcm9tZXRlciA9IDEsIC5saWdodCA9IDEsIC50ZW1wZXJhdHVyZV9zZXQgPSAwIH0sCi0vKiBNYWNCb29rMjogYWNjZWxlcm9tZXRlciBhbmQgdGVtcGVyYXR1cmUgc2V0IDEgKi8KLQl7IC5hY2NlbGVyb21ldGVyID0gMSwgLmxpZ2h0ID0gMCwgLnRlbXBlcmF0dXJlX3NldCA9IDEgfSwKLS8qIE1hY0Jvb2s6IGFjY2VsZXJvbWV0ZXIgYW5kIHRlbXBlcmF0dXJlIHNldCAyICovCi0JeyAuYWNjZWxlcm9tZXRlciA9IDEsIC5saWdodCA9IDAsIC50ZW1wZXJhdHVyZV9zZXQgPSAyIH0sCi0vKiBNYWNNaW5pOiB0ZW1wZXJhdHVyZSBzZXQgMyAqLwotCXsgLmFjY2VsZXJvbWV0ZXIgPSAwLCAubGlnaHQgPSAwLCAudGVtcGVyYXR1cmVfc2V0ID0gMyB9LAotLyogTWFjUHJvOiB0ZW1wZXJhdHVyZSBzZXQgNCAqLwotCXsgLmFjY2VsZXJvbWV0ZXIgPSAwLCAubGlnaHQgPSAwLCAudGVtcGVyYXR1cmVfc2V0ID0gNCB9LAotLyogaU1hYzogdGVtcGVyYXR1cmUgc2V0IDUgKi8KLQl7IC5hY2NlbGVyb21ldGVyID0gMCwgLmxpZ2h0ID0gMCwgLnRlbXBlcmF0dXJlX3NldCA9IDUgfSwKLS8qIE1hY0Jvb2szLCBNYWNCb29rNDogYWNjZWxlcm9tZXRlciBhbmQgdGVtcGVyYXR1cmUgc2V0IDYgKi8KLQl7IC5hY2NlbGVyb21ldGVyID0gMSwgLmxpZ2h0ID0gMCwgLnRlbXBlcmF0dXJlX3NldCA9IDYgfSwKLS8qIE1hY0Jvb2sgQWlyOiBhY2NlbGVyb21ldGVyLCBiYWNrbGlnaHQgYW5kIHRlbXBlcmF0dXJlIHNldCA3ICovCi0JeyAuYWNjZWxlcm9tZXRlciA9IDEsIC5saWdodCA9IDEsIC50ZW1wZXJhdHVyZV9zZXQgPSA3IH0sCi0vKiBNYWNCb29rIFBybyA0OiBhY2NlbGVyb21ldGVyLCBiYWNrbGlnaHQgYW5kIHRlbXBlcmF0dXJlIHNldCA4ICovCi0JeyAuYWNjZWxlcm9tZXRlciA9IDEsIC5saWdodCA9IDEsIC50ZW1wZXJhdHVyZV9zZXQgPSA4IH0sCi0vKiBNYWNCb29rIFBybyAzOiBhY2NlbGVyb21ldGVyLCBiYWNrbGlnaHQgYW5kIHRlbXBlcmF0dXJlIHNldCA5ICovCi0JeyAuYWNjZWxlcm9tZXRlciA9IDEsIC5saWdodCA9IDEsIC50ZW1wZXJhdHVyZV9zZXQgPSA5IH0sCi0vKiBpTWFjIDU6IGxpZ2h0IHNlbnNvciBvbmx5LCB0ZW1wZXJhdHVyZSBzZXQgMTAgKi8KLQl7IC5hY2NlbGVyb21ldGVyID0gMCwgLmxpZ2h0ID0gMCwgLnRlbXBlcmF0dXJlX3NldCA9IDEwIH0sCi0vKiBNYWNCb29rIDU6IGFjY2VsZXJvbWV0ZXIsIGJhY2tsaWdodCBhbmQgdGVtcGVyYXR1cmUgc2V0IDExICovCi0JeyAuYWNjZWxlcm9tZXRlciA9IDEsIC5saWdodCA9IDEsIC50ZW1wZXJhdHVyZV9zZXQgPSAxMSB9LAotLyogTWFjQm9vayBQcm8gNTogYWNjZWxlcm9tZXRlciwgYmFja2xpZ2h0IGFuZCB0ZW1wZXJhdHVyZSBzZXQgMTIgKi8KLQl7IC5hY2NlbGVyb21ldGVyID0gMSwgLmxpZ2h0ID0gMSwgLnRlbXBlcmF0dXJlX3NldCA9IDEyIH0sCi0vKiBpTWFjIDg6IGxpZ2h0IHNlbnNvciBvbmx5LCB0ZW1wZXJhdHVyZSBzZXQgMTMgKi8KLQl7IC5hY2NlbGVyb21ldGVyID0gMCwgLmxpZ2h0ID0gMCwgLnRlbXBlcmF0dXJlX3NldCA9IDEzIH0sCi0vKiBpTWFjIDY6IGxpZ2h0IHNlbnNvciBvbmx5LCB0ZW1wZXJhdHVyZSBzZXQgMTQgKi8KLQl7IC5hY2NlbGVyb21ldGVyID0gMCwgLmxpZ2h0ID0gMCwgLnRlbXBlcmF0dXJlX3NldCA9IDE0IH0sCi0vKiBNYWNCb29rIEFpciAyLDE6IGFjY2VsZXJvbWV0ZXIsIGJhY2tsaWdodCBhbmQgdGVtcGVyYXR1cmUgc2V0IDE1ICovCi0JeyAuYWNjZWxlcm9tZXRlciA9IDEsIC5saWdodCA9IDEsIC50ZW1wZXJhdHVyZV9zZXQgPSAxNSB9LAotLyogTWFjUHJvMywxOiB0ZW1wZXJhdHVyZSBzZXQgMTYgKi8KLQl7IC5hY2NlbGVyb21ldGVyID0gMCwgLmxpZ2h0ID0gMCwgLnRlbXBlcmF0dXJlX3NldCA9IDE2IH0sCi0vKiBpTWFjIDksMTogbGlnaHQgc2Vuc29yIG9ubHksIHRlbXBlcmF0dXJlIHNldCAxNyAqLwotCXsgLmFjY2VsZXJvbWV0ZXIgPSAwLCAubGlnaHQgPSAwLCAudGVtcGVyYXR1cmVfc2V0ID0gMTcgfSwKLS8qIE1hY0Jvb2sgUHJvIDIsMjogYWNjZWxlcm9tZXRlciwgYmFja2xpZ2h0IGFuZCB0ZW1wZXJhdHVyZSBzZXQgMTggKi8KLQl7IC5hY2NlbGVyb21ldGVyID0gMSwgLmxpZ2h0ID0gMSwgLnRlbXBlcmF0dXJlX3NldCA9IDE4IH0sCi0vKiBNYWNCb29rIFBybyA1LDM6IGFjY2VsZXJvbWV0ZXIsIGJhY2tsaWdodCBhbmQgdGVtcGVyYXR1cmUgc2V0IDE5ICovCi0JeyAuYWNjZWxlcm9tZXRlciA9IDEsIC5saWdodCA9IDEsIC50ZW1wZXJhdHVyZV9zZXQgPSAxOSB9LAotLyogTWFjQm9vayBQcm8gNSw0OiBhY2NlbGVyb21ldGVyLCBiYWNrbGlnaHQgYW5kIHRlbXBlcmF0dXJlIHNldCAyMCAqLwotCXsgLmFjY2VsZXJvbWV0ZXIgPSAxLCAubGlnaHQgPSAxLCAudGVtcGVyYXR1cmVfc2V0ID0gMjAgfSwKLS8qIE1hY0Jvb2sgUHJvIDYsMjogYWNjZWxlcm9tZXRlciwgYmFja2xpZ2h0IGFuZCB0ZW1wZXJhdHVyZSBzZXQgMjEgKi8KLQl7IC5hY2NlbGVyb21ldGVyID0gMSwgLmxpZ2h0ID0gMSwgLnRlbXBlcmF0dXJlX3NldCA9IDIxIH0sCi0vKiBNYWNCb29rIFBybyA3LDE6IGFjY2VsZXJvbWV0ZXIsIGJhY2tsaWdodCBhbmQgdGVtcGVyYXR1cmUgc2V0IDIyICovCi0JeyAuYWNjZWxlcm9tZXRlciA9IDEsIC5saWdodCA9IDEsIC50ZW1wZXJhdHVyZV9zZXQgPSAyMiB9LAotfTsKK3N0YXRpYyBpbnQgYXBwbGVzbWNfY3JlYXRlX2xpZ2h0X3NlbnNvcih2b2lkKQoreworCWlmICghc21jcmVnLm51bV9saWdodF9zZW5zb3JzKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gYXBwbGVzbWNfY3JlYXRlX25vZGVzKGxpZ2h0X3NlbnNvcl9ncm91cCwgMSk7Cit9CisKK3N0YXRpYyB2b2lkIGFwcGxlc21jX3JlbGVhc2VfbGlnaHRfc2Vuc29yKHZvaWQpCit7CisJaWYgKCFzbWNyZWcubnVtX2xpZ2h0X3NlbnNvcnMpCisJCXJldHVybjsKKwlhcHBsZXNtY19kZXN0cm95X25vZGVzKGxpZ2h0X3NlbnNvcl9ncm91cCk7Cit9CisKK3N0YXRpYyBpbnQgYXBwbGVzbWNfY3JlYXRlX2tleV9iYWNrbGlnaHQodm9pZCkKK3sKKwlpZiAoIXNtY3JlZy5oYXNfa2V5X2JhY2tsaWdodCkKKwkJcmV0dXJuIDA7CisJYXBwbGVzbWNfbGVkX3dxID0gY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoImFwcGxlc21jLWxlZCIpOworCWlmICghYXBwbGVzbWNfbGVkX3dxKQorCQlyZXR1cm4gLUVOT01FTTsKKwlyZXR1cm4gbGVkX2NsYXNzZGV2X3JlZ2lzdGVyKCZwZGV2LT5kZXYsICZhcHBsZXNtY19iYWNrbGlnaHQpOworfQorCitzdGF0aWMgdm9pZCBhcHBsZXNtY19yZWxlYXNlX2tleV9iYWNrbGlnaHQodm9pZCkKK3sKKwlpZiAoIXNtY3JlZy5oYXNfa2V5X2JhY2tsaWdodCkKKwkJcmV0dXJuOworCWxlZF9jbGFzc2Rldl91bnJlZ2lzdGVyKCZhcHBsZXNtY19iYWNrbGlnaHQpOworCWRlc3Ryb3lfd29ya3F1ZXVlKGFwcGxlc21jX2xlZF93cSk7Cit9CisKK3N0YXRpYyBpbnQgYXBwbGVzbWNfZG1pX21hdGNoKGNvbnN0IHN0cnVjdCBkbWlfc3lzdGVtX2lkICppZCkKK3sKKwlyZXR1cm4gMTsKK30KIAogLyogTm90ZSB0aGF0IERNSV9NQVRDSCguLi4sIk1hY0Jvb2siKSB3aWxsIG1hdGNoICJNYWNCb29rUHJvMSwxIi4KICAqIFNvIHdlIG5lZWQgdG8gcHV0ICJBcHBsZSBNYWNCb29rIFBybyIgYmVmb3JlICJBcHBsZSBNYWNCb29rIi4gKi8KIHN0YXRpYyBfX2luaXRkYXRhIHN0cnVjdCBkbWlfc3lzdGVtX2lkIGFwcGxlc21jX3doaXRlbGlzdFtdID0gewotCXsgYXBwbGVzbWNfZG1pX21hdGNoLCAiQXBwbGUgTWFjQm9vayBBaXIgMiIsIHsKLQkgIERNSV9NQVRDSChETUlfQk9BUkRfVkVORE9SLCAiQXBwbGUiKSwKLQkgIERNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiTWFjQm9va0FpcjIiKSB9LAotCQkmYXBwbGVzbWNfZG1pX2RhdGFbMTVdfSwKIAl7IGFwcGxlc21jX2RtaV9tYXRjaCwgIkFwcGxlIE1hY0Jvb2sgQWlyIiwgewogCSAgRE1JX01BVENIKERNSV9CT0FSRF9WRU5ET1IsICJBcHBsZSIpLAogCSAgRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJNYWNCb29rQWlyIikgfSwKLQkJJmFwcGxlc21jX2RtaV9kYXRhWzddfSwKLQl7IGFwcGxlc21jX2RtaV9tYXRjaCwgIkFwcGxlIE1hY0Jvb2sgUHJvIDciLCB7Ci0JICBETUlfTUFUQ0goRE1JX0JPQVJEX1ZFTkRPUiwgIkFwcGxlIiksCi0JICBETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIk1hY0Jvb2tQcm83IikgfSwKLQkJJmFwcGxlc21jX2RtaV9kYXRhWzIyXX0sCi0JeyBhcHBsZXNtY19kbWlfbWF0Y2gsICJBcHBsZSBNYWNCb29rIFBybyA1LDQiLCB7Ci0JICBETUlfTUFUQ0goRE1JX0JPQVJEX1ZFTkRPUiwgIkFwcGxlIiksCi0JICBETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIk1hY0Jvb2tQcm81LDQiKSB9LAotCQkmYXBwbGVzbWNfZG1pX2RhdGFbMjBdfSwKLQl7IGFwcGxlc21jX2RtaV9tYXRjaCwgIkFwcGxlIE1hY0Jvb2sgUHJvIDUsMyIsIHsKLQkgIERNSV9NQVRDSChETUlfQk9BUkRfVkVORE9SLCAiQXBwbGUiKSwKLQkgIERNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiTWFjQm9va1BybzUsMyIpIH0sCi0JCSZhcHBsZXNtY19kbWlfZGF0YVsxOV19LAotCXsgYXBwbGVzbWNfZG1pX21hdGNoLCAiQXBwbGUgTWFjQm9vayBQcm8gNiIsIHsKLQkgIERNSV9NQVRDSChETUlfQk9BUkRfVkVORE9SLCAiQXBwbGUiKSwKLQkgIERNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiTWFjQm9va1BybzYiKSB9LAotCQkmYXBwbGVzbWNfZG1pX2RhdGFbMjFdfSwKLQl7IGFwcGxlc21jX2RtaV9tYXRjaCwgIkFwcGxlIE1hY0Jvb2sgUHJvIDUiLCB7Ci0JICBETUlfTUFUQ0goRE1JX0JPQVJEX1ZFTkRPUiwgIkFwcGxlIiksCi0JICBETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIk1hY0Jvb2tQcm81IikgfSwKLQkJJmFwcGxlc21jX2RtaV9kYXRhWzEyXX0sCi0JeyBhcHBsZXNtY19kbWlfbWF0Y2gsICJBcHBsZSBNYWNCb29rIFBybyA0IiwgewotCSAgRE1JX01BVENIKERNSV9CT0FSRF9WRU5ET1IsICJBcHBsZSIpLAotCSAgRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJNYWNCb29rUHJvNCIpIH0sCi0JCSZhcHBsZXNtY19kbWlfZGF0YVs4XX0sCi0JeyBhcHBsZXNtY19kbWlfbWF0Y2gsICJBcHBsZSBNYWNCb29rIFBybyAzIiwgewotCSAgRE1JX01BVENIKERNSV9CT0FSRF9WRU5ET1IsICJBcHBsZSIpLAotCSAgRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJNYWNCb29rUHJvMyIpIH0sCi0JCSZhcHBsZXNtY19kbWlfZGF0YVs5XX0sCi0JeyBhcHBsZXNtY19kbWlfbWF0Y2gsICJBcHBsZSBNYWNCb29rIFBybyAyLDIiLCB7Ci0JICBETUlfTUFUQ0goRE1JX0JPQVJEX1ZFTkRPUiwgIkFwcGxlIENvbXB1dGVyLCBJbmMuIiksCi0JICBETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIk1hY0Jvb2tQcm8yLDIiKSB9LAotCQkmYXBwbGVzbWNfZG1pX2RhdGFbMThdfSwKKwl9LAogCXsgYXBwbGVzbWNfZG1pX21hdGNoLCAiQXBwbGUgTWFjQm9vayBQcm8iLCB7Ci0JICBETUlfTUFUQ0goRE1JX0JPQVJEX1ZFTkRPUiwiQXBwbGUiKSwKLQkgIERNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCJNYWNCb29rUHJvIikgfSwKLQkJJmFwcGxlc21jX2RtaV9kYXRhWzBdfSwKLQl7IGFwcGxlc21jX2RtaV9tYXRjaCwgIkFwcGxlIE1hY0Jvb2sgKHYyKSIsIHsKLQkgIERNSV9NQVRDSChETUlfQk9BUkRfVkVORE9SLCJBcHBsZSIpLAotCSAgRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsIk1hY0Jvb2syIikgfSwKLQkJJmFwcGxlc21jX2RtaV9kYXRhWzFdfSwKLQl7IGFwcGxlc21jX2RtaV9tYXRjaCwgIkFwcGxlIE1hY0Jvb2sgKHYzKSIsIHsKLQkgIERNSV9NQVRDSChETUlfQk9BUkRfVkVORE9SLCJBcHBsZSIpLAotCSAgRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsIk1hY0Jvb2szIikgfSwKLQkJJmFwcGxlc21jX2RtaV9kYXRhWzZdfSwKLQl7IGFwcGxlc21jX2RtaV9tYXRjaCwgIkFwcGxlIE1hY0Jvb2sgNCIsIHsKIAkgIERNSV9NQVRDSChETUlfQk9BUkRfVkVORE9SLCAiQXBwbGUiKSwKLQkgIERNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiTWFjQm9vazQiKSB9LAotCQkmYXBwbGVzbWNfZG1pX2RhdGFbNl19LAotCXsgYXBwbGVzbWNfZG1pX21hdGNoLCAiQXBwbGUgTWFjQm9vayA1IiwgewotCSAgRE1JX01BVENIKERNSV9CT0FSRF9WRU5ET1IsICJBcHBsZSIpLAotCSAgRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJNYWNCb29rNSIpIH0sCi0JCSZhcHBsZXNtY19kbWlfZGF0YVsxMV19LAorCSAgRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJNYWNCb29rUHJvIikgfSwKKwl9LAogCXsgYXBwbGVzbWNfZG1pX21hdGNoLCAiQXBwbGUgTWFjQm9vayIsIHsKLQkgIERNSV9NQVRDSChETUlfQk9BUkRfVkVORE9SLCJBcHBsZSIpLAotCSAgRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsIk1hY0Jvb2siKSB9LAotCQkmYXBwbGVzbWNfZG1pX2RhdGFbMl19LAotCXsgYXBwbGVzbWNfZG1pX21hdGNoLCAiQXBwbGUgTWFjbWluaSIsIHsKLQkgIERNSV9NQVRDSChETUlfQk9BUkRfVkVORE9SLCJBcHBsZSIpLAotCSAgRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsIk1hY21pbmkiKSB9LAotCQkmYXBwbGVzbWNfZG1pX2RhdGFbM119LAotCXsgYXBwbGVzbWNfZG1pX21hdGNoLCAiQXBwbGUgTWFjUHJvMiIsIHsKLQkgIERNSV9NQVRDSChETUlfQk9BUkRfVkVORE9SLCJBcHBsZSIpLAotCSAgRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsIk1hY1BybzIiKSB9LAotCQkmYXBwbGVzbWNfZG1pX2RhdGFbNF19LAotCXsgYXBwbGVzbWNfZG1pX21hdGNoLCAiQXBwbGUgTWFjUHJvMyIsIHsKIAkgIERNSV9NQVRDSChETUlfQk9BUkRfVkVORE9SLCAiQXBwbGUiKSwKLQkgIERNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiTWFjUHJvMyIpIH0sCi0JCSZhcHBsZXNtY19kbWlfZGF0YVsxNl19LAorCSAgRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJNYWNCb29rIikgfSwKKwl9LAorCXsgYXBwbGVzbWNfZG1pX21hdGNoLCAiQXBwbGUgTWFjbWluaSIsIHsKKwkgIERNSV9NQVRDSChETUlfQk9BUkRfVkVORE9SLCAiQXBwbGUiKSwKKwkgIERNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiTWFjbWluaSIpIH0sCisJfSwKIAl7IGFwcGxlc21jX2RtaV9tYXRjaCwgIkFwcGxlIE1hY1BybyIsIHsKIAkgIERNSV9NQVRDSChETUlfQk9BUkRfVkVORE9SLCAiQXBwbGUiKSwKIAkgIERNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiTWFjUHJvIikgfSwKLQkJJmFwcGxlc21jX2RtaV9kYXRhWzRdfSwKLQl7IGFwcGxlc21jX2RtaV9tYXRjaCwgIkFwcGxlIGlNYWMgOSwxIiwgewotCSAgRE1JX01BVENIKERNSV9CT0FSRF9WRU5ET1IsICJBcHBsZSBJbmMuIiksCi0JICBETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgImlNYWM5LDEiKSB9LAotCQkmYXBwbGVzbWNfZG1pX2RhdGFbMTddfSwKLQl7IGFwcGxlc21jX2RtaV9tYXRjaCwgIkFwcGxlIGlNYWMgOCIsIHsKLQkgIERNSV9NQVRDSChETUlfQk9BUkRfVkVORE9SLCAiQXBwbGUiKSwKLQkgIERNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiaU1hYzgiKSB9LAotCQkmYXBwbGVzbWNfZG1pX2RhdGFbMTNdfSwKLQl7IGFwcGxlc21jX2RtaV9tYXRjaCwgIkFwcGxlIGlNYWMgNiIsIHsKLQkgIERNSV9NQVRDSChETUlfQk9BUkRfVkVORE9SLCAiQXBwbGUiKSwKLQkgIERNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiaU1hYzYiKSB9LAotCQkmYXBwbGVzbWNfZG1pX2RhdGFbMTRdfSwKLQl7IGFwcGxlc21jX2RtaV9tYXRjaCwgIkFwcGxlIGlNYWMgNSIsIHsKLQkgIERNSV9NQVRDSChETUlfQk9BUkRfVkVORE9SLCAiQXBwbGUiKSwKLQkgIERNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiaU1hYzUiKSB9LAotCQkmYXBwbGVzbWNfZG1pX2RhdGFbMTBdfSwKKwl9LAogCXsgYXBwbGVzbWNfZG1pX21hdGNoLCAiQXBwbGUgaU1hYyIsIHsKLQkgIERNSV9NQVRDSChETUlfQk9BUkRfVkVORE9SLCJBcHBsZSIpLAotCSAgRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsImlNYWMiKSB9LAotCQkmYXBwbGVzbWNfZG1pX2RhdGFbNV19LAorCSAgRE1JX01BVENIKERNSV9CT0FSRF9WRU5ET1IsICJBcHBsZSIpLAorCSAgRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJpTWFjIikgfSwKKwl9LAogCXsgLmlkZW50ID0gTlVMTCB9CiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBhcHBsZXNtY19pbml0KHZvaWQpCiB7CiAJaW50IHJldDsKLQlpbnQgY291bnQ7Ci0JaW50IGk7CiAKIAlpZiAoIWRtaV9jaGVja19zeXN0ZW0oYXBwbGVzbWNfd2hpdGVsaXN0KSkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJhcHBsZXNtYzogc3VwcG9ydGVkIGxhcHRvcCBub3QgZm91bmQhXG4iKTsKKwkJcHJfd2Fybigic3VwcG9ydGVkIGxhcHRvcCBub3QgZm91bmQhXG4iKTsKIAkJcmV0ID0gLUVOT0RFVjsKIAkJZ290byBvdXQ7CiAJfQpAQCAtMTY2MSw4MyArMTI0NSwzNCBAQAogCQlnb3RvIG91dF9kcml2ZXI7CiAJfQogCi0JcmV0ID0gc3lzZnNfY3JlYXRlX2ZpbGUoJnBkZXYtPmRldi5rb2JqLCAmZGV2X2F0dHJfbmFtZS5hdHRyKTsKKwkvKiBjcmVhdGUgcmVnaXN0ZXIgY2FjaGUgKi8KKwlyZXQgPSBhcHBsZXNtY19pbml0X3NtY3JlZygpOwogCWlmIChyZXQpCiAJCWdvdG8gb3V0X2RldmljZTsKIAotCS8qIENyZWF0ZSBrZXkgZW51bWVyYXRpb24gc3lzZnMgZmlsZXMgKi8KLQlyZXQgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJnBkZXYtPmRldi5rb2JqLCAma2V5X2VudW1lcmF0aW9uX2dyb3VwKTsKKwlyZXQgPSBhcHBsZXNtY19jcmVhdGVfbm9kZXMoaW5mb19ncm91cCwgMSk7CiAJaWYgKHJldCkKLQkJZ290byBvdXRfbmFtZTsKKwkJZ290byBvdXRfc21jcmVnOwogCi0JLyogY3JlYXRlIGZhbiBmaWxlcyAqLwotCWNvdW50ID0gYXBwbGVzbWNfZ2V0X2Zhbl9jb3VudCgpOwotCWlmIChjb3VudCA8IDApCi0JCXByaW50ayhLRVJOX0VSUiAiYXBwbGVzbWM6IENhbm5vdCBnZXQgdGhlIG51bWJlciBvZiBmYW5zLlxuIik7Ci0JZWxzZQotCQlwcmludGsoS0VSTl9JTkZPICJhcHBsZXNtYzogJWQgZmFucyBmb3VuZC5cbiIsIGNvdW50KTsKKwlyZXQgPSBhcHBsZXNtY19jcmVhdGVfbm9kZXMoZmFuX2dyb3VwLCBzbWNyZWcuZmFuX2NvdW50KTsKKwlpZiAocmV0KQorCQlnb3RvIG91dF9pbmZvOwogCi0JaWYgKGNvdW50ID4gNCkgewotCQljb3VudCA9IDQ7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgImFwcGxlc21jOiBNb3JlIHRoYW4gNCBmYW5zIGZvdW5kLCIKLQkJICAgICAgICIgYnV0IGF0IG1vc3QgNCBmYW5zIGFyZSBzdXBwb3J0ZWQiCi0JCSAgICAgICAiIGJ5IHRoZSBkcml2ZXIuXG4iKTsKLQl9CisJcmV0ID0gYXBwbGVzbWNfY3JlYXRlX25vZGVzKHRlbXBfZ3JvdXAsIHNtY3JlZy50ZW1wX2NvdW50KTsKKwlpZiAocmV0KQorCQlnb3RvIG91dF9mYW5zOwogCi0Jd2hpbGUgKGZhbnNfaGFuZGxlZCA8IGNvdW50KSB7Ci0JCXJldCA9IHN5c2ZzX2NyZWF0ZV9ncm91cCgmcGRldi0+ZGV2LmtvYmosCi0JCQkJCSAmZmFuX2F0dHJpYnV0ZV9ncm91cHNbZmFuc19oYW5kbGVkXSk7Ci0JCWlmIChyZXQpCi0JCQlnb3RvIG91dF9mYW5zOwotCQlmYW5zX2hhbmRsZWQrKzsKLQl9CisJcmV0ID0gYXBwbGVzbWNfY3JlYXRlX2FjY2VsZXJvbWV0ZXIoKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dF90ZW1wZXJhdHVyZTsKIAotCWZvciAoaSA9IDA7Ci0JICAgICB0ZW1wZXJhdHVyZV9zZW5zb3JzX3NldHNbYXBwbGVzbWNfdGVtcGVyYXR1cmVfc2V0XVtpXSAhPSBOVUxMOwotCSAgICAgaSsrKSB7Ci0JCWlmICh0ZW1wZXJhdHVyZV9hdHRyaWJ1dGVzW2ldID09IE5VTEwgfHwKLQkJICAgIGxhYmVsX2F0dHJpYnV0ZXNbaV0gPT0gTlVMTCkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJhcHBsZXNtYzogTW9yZSB0ZW1wZXJhdHVyZSBzZW5zb3JzICIKLQkJCQkiaW4gdGVtcGVyYXR1cmVfc2Vuc29yc19zZXRzIChhdCBsZWFzdCAlaSkiCi0JCQkJInRoYW4gYXZhaWxhYmxlIHN5c2ZzIGZpbGVzIGluICIKLQkJCQkidGVtcGVyYXR1cmVfYXR0cmlidXRlcyAoJWkpLCBwbGVhc2UgcmVwb3J0ICIKLQkJCQkidGhpcyBidWcuXG4iLCBpLCBpLTEpOwotCQkJZ290byBvdXRfdGVtcGVyYXR1cmU7Ci0JCX0KLQkJcmV0ID0gc3lzZnNfY3JlYXRlX2ZpbGUoJnBkZXYtPmRldi5rb2JqLAotCQkJCQkJdGVtcGVyYXR1cmVfYXR0cmlidXRlc1tpXSk7Ci0JCWlmIChyZXQpCi0JCQlnb3RvIG91dF90ZW1wZXJhdHVyZTsKLQkJcmV0ID0gc3lzZnNfY3JlYXRlX2ZpbGUoJnBkZXYtPmRldi5rb2JqLAotCQkJCQkJbGFiZWxfYXR0cmlidXRlc1tpXSk7Ci0JCWlmIChyZXQpCi0JCQlnb3RvIG91dF90ZW1wZXJhdHVyZTsKLQl9CisJcmV0ID0gYXBwbGVzbWNfY3JlYXRlX2xpZ2h0X3NlbnNvcigpOworCWlmIChyZXQpCisJCWdvdG8gb3V0X2FjY2VsZXJvbWV0ZXI7CiAKLQlpZiAoYXBwbGVzbWNfYWNjZWxlcm9tZXRlcikgewotCQlyZXQgPSBhcHBsZXNtY19jcmVhdGVfYWNjZWxlcm9tZXRlcigpOwotCQlpZiAocmV0KQotCQkJZ290byBvdXRfdGVtcGVyYXR1cmU7Ci0JfQotCi0JaWYgKGFwcGxlc21jX2xpZ2h0KSB7Ci0JCS8qIEFkZCBsaWdodCBzZW5zb3IgZmlsZSAqLwotCQlyZXQgPSBzeXNmc19jcmVhdGVfZmlsZSgmcGRldi0+ZGV2LmtvYmosICZkZXZfYXR0cl9saWdodC5hdHRyKTsKLQkJaWYgKHJldCkKLQkJCWdvdG8gb3V0X2FjY2VsZXJvbWV0ZXI7Ci0KLQkJLyogQ3JlYXRlIHRoZSB3b3JrcXVldWUgKi8KLQkJYXBwbGVzbWNfbGVkX3dxID0gY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoImFwcGxlc21jLWxlZCIpOwotCQlpZiAoIWFwcGxlc21jX2xlZF93cSkgewotCQkJcmV0ID0gLUVOT01FTTsKLQkJCWdvdG8gb3V0X2xpZ2h0X3N5c2ZzOwotCQl9Ci0KLQkJLyogcmVnaXN0ZXIgYXMgYSBsZWQgZGV2aWNlICovCi0JCXJldCA9IGxlZF9jbGFzc2Rldl9yZWdpc3RlcigmcGRldi0+ZGV2LCAmYXBwbGVzbWNfYmFja2xpZ2h0KTsKLQkJaWYgKHJldCA8IDApCi0JCQlnb3RvIG91dF9saWdodF93cTsKLQl9CisJcmV0ID0gYXBwbGVzbWNfY3JlYXRlX2tleV9iYWNrbGlnaHQoKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dF9saWdodF9zeXNmczsKIAogCWh3bW9uX2RldiA9IGh3bW9uX2RldmljZV9yZWdpc3RlcigmcGRldi0+ZGV2KTsKIAlpZiAoSVNfRVJSKGh3bW9uX2RldikpIHsKQEAgLTE3NDUsMzIgKzEyODAsMjIgQEAKIAkJZ290byBvdXRfbGlnaHRfbGVkY2xhc3M7CiAJfQogCi0JcHJpbnRrKEtFUk5fSU5GTyAiYXBwbGVzbWM6IGRyaXZlciBzdWNjZXNzZnVsbHkgbG9hZGVkLlxuIik7Ci0KIAlyZXR1cm4gMDsKIAogb3V0X2xpZ2h0X2xlZGNsYXNzOgotCWlmIChhcHBsZXNtY19saWdodCkKLQkJbGVkX2NsYXNzZGV2X3VucmVnaXN0ZXIoJmFwcGxlc21jX2JhY2tsaWdodCk7Ci1vdXRfbGlnaHRfd3E6Ci0JaWYgKGFwcGxlc21jX2xpZ2h0KQotCQlkZXN0cm95X3dvcmtxdWV1ZShhcHBsZXNtY19sZWRfd3EpOworCWFwcGxlc21jX3JlbGVhc2Vfa2V5X2JhY2tsaWdodCgpOwogb3V0X2xpZ2h0X3N5c2ZzOgotCWlmIChhcHBsZXNtY19saWdodCkKLQkJc3lzZnNfcmVtb3ZlX2ZpbGUoJnBkZXYtPmRldi5rb2JqLCAmZGV2X2F0dHJfbGlnaHQuYXR0cik7CisJYXBwbGVzbWNfcmVsZWFzZV9saWdodF9zZW5zb3IoKTsKIG91dF9hY2NlbGVyb21ldGVyOgotCWlmIChhcHBsZXNtY19hY2NlbGVyb21ldGVyKQotCQlhcHBsZXNtY19yZWxlYXNlX2FjY2VsZXJvbWV0ZXIoKTsKKwlhcHBsZXNtY19yZWxlYXNlX2FjY2VsZXJvbWV0ZXIoKTsKIG91dF90ZW1wZXJhdHVyZToKLQlzeXNmc19yZW1vdmVfZ3JvdXAoJnBkZXYtPmRldi5rb2JqLCAmbGFiZWxfYXR0cmlidXRlc19ncm91cCk7Ci0Jc3lzZnNfcmVtb3ZlX2dyb3VwKCZwZGV2LT5kZXYua29iaiwgJnRlbXBlcmF0dXJlX2F0dHJpYnV0ZXNfZ3JvdXApOworCWFwcGxlc21jX2Rlc3Ryb3lfbm9kZXModGVtcF9ncm91cCk7CiBvdXRfZmFuczoKLQl3aGlsZSAoZmFuc19oYW5kbGVkKQotCQlzeXNmc19yZW1vdmVfZ3JvdXAoJnBkZXYtPmRldi5rb2JqLAotCQkJCSAgICZmYW5fYXR0cmlidXRlX2dyb3Vwc1stLWZhbnNfaGFuZGxlZF0pOwotCXN5c2ZzX3JlbW92ZV9ncm91cCgmcGRldi0+ZGV2LmtvYmosICZrZXlfZW51bWVyYXRpb25fZ3JvdXApOwotb3V0X25hbWU6Ci0Jc3lzZnNfcmVtb3ZlX2ZpbGUoJnBkZXYtPmRldi5rb2JqLCAmZGV2X2F0dHJfbmFtZS5hdHRyKTsKKwlhcHBsZXNtY19kZXN0cm95X25vZGVzKGZhbl9ncm91cCk7CitvdXRfaW5mbzoKKwlhcHBsZXNtY19kZXN0cm95X25vZGVzKGluZm9fZ3JvdXApOworb3V0X3NtY3JlZzoKKwlhcHBsZXNtY19kZXN0cm95X3NtY3JlZygpOwogb3V0X2RldmljZToKIAlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcihwZGV2KTsKIG91dF9kcml2ZXI6CkBAIC0xNzc4LDMyICsxMzAzLDIzIEBACiBvdXRfcmVnaW9uOgogCXJlbGVhc2VfcmVnaW9uKEFQUExFU01DX0RBVEFfUE9SVCwgQVBQTEVTTUNfTlJfUE9SVFMpOwogb3V0OgotCXByaW50ayhLRVJOX1dBUk5JTkcgImFwcGxlc21jOiBkcml2ZXIgaW5pdCBmYWlsZWQgKHJldD0lZCkhXG4iLCByZXQpOworCXByX3dhcm4oImRyaXZlciBpbml0IGZhaWxlZCAocmV0PSVkKSFcbiIsIHJldCk7CiAJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IGFwcGxlc21jX2V4aXQodm9pZCkKIHsKIAlod21vbl9kZXZpY2VfdW5yZWdpc3Rlcihod21vbl9kZXYpOwotCWlmIChhcHBsZXNtY19saWdodCkgewotCQlsZWRfY2xhc3NkZXZfdW5yZWdpc3RlcigmYXBwbGVzbWNfYmFja2xpZ2h0KTsKLQkJZGVzdHJveV93b3JrcXVldWUoYXBwbGVzbWNfbGVkX3dxKTsKLQkJc3lzZnNfcmVtb3ZlX2ZpbGUoJnBkZXYtPmRldi5rb2JqLCAmZGV2X2F0dHJfbGlnaHQuYXR0cik7Ci0JfQotCWlmIChhcHBsZXNtY19hY2NlbGVyb21ldGVyKQotCQlhcHBsZXNtY19yZWxlYXNlX2FjY2VsZXJvbWV0ZXIoKTsKLQlzeXNmc19yZW1vdmVfZ3JvdXAoJnBkZXYtPmRldi5rb2JqLCAmbGFiZWxfYXR0cmlidXRlc19ncm91cCk7Ci0Jc3lzZnNfcmVtb3ZlX2dyb3VwKCZwZGV2LT5kZXYua29iaiwgJnRlbXBlcmF0dXJlX2F0dHJpYnV0ZXNfZ3JvdXApOwotCXdoaWxlIChmYW5zX2hhbmRsZWQpCi0JCXN5c2ZzX3JlbW92ZV9ncm91cCgmcGRldi0+ZGV2LmtvYmosCi0JCQkJICAgJmZhbl9hdHRyaWJ1dGVfZ3JvdXBzWy0tZmFuc19oYW5kbGVkXSk7Ci0Jc3lzZnNfcmVtb3ZlX2dyb3VwKCZwZGV2LT5kZXYua29iaiwgJmtleV9lbnVtZXJhdGlvbl9ncm91cCk7Ci0Jc3lzZnNfcmVtb3ZlX2ZpbGUoJnBkZXYtPmRldi5rb2JqLCAmZGV2X2F0dHJfbmFtZS5hdHRyKTsKKwlhcHBsZXNtY19yZWxlYXNlX2tleV9iYWNrbGlnaHQoKTsKKwlhcHBsZXNtY19yZWxlYXNlX2xpZ2h0X3NlbnNvcigpOworCWFwcGxlc21jX3JlbGVhc2VfYWNjZWxlcm9tZXRlcigpOworCWFwcGxlc21jX2Rlc3Ryb3lfbm9kZXModGVtcF9ncm91cCk7CisJYXBwbGVzbWNfZGVzdHJveV9ub2RlcyhmYW5fZ3JvdXApOworCWFwcGxlc21jX2Rlc3Ryb3lfbm9kZXMoaW5mb19ncm91cCk7CisJYXBwbGVzbWNfZGVzdHJveV9zbWNyZWcoKTsKIAlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcihwZGV2KTsKIAlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmYXBwbGVzbWNfZHJpdmVyKTsKIAlyZWxlYXNlX3JlZ2lvbihBUFBMRVNNQ19EQVRBX1BPUlQsIEFQUExFU01DX05SX1BPUlRTKTsKLQotCXByaW50ayhLRVJOX0lORk8gImFwcGxlc21jOiBkcml2ZXIgdW5sb2FkZWQuXG4iKTsKIH0KIAogbW9kdWxlX2luaXQoYXBwbGVzbWNfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2FzYjEwMC5jIGIvZHJpdmVycy9od21vbi9hc2IxMDAuYwppbmRleCA3ZGFkYTU1Li5jMDJhMDUyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL2FzYjEwMC5jCisrKyBiL2RyaXZlcnMvaHdtb24vYXNiMTAwLmMKQEAgLTM2LDYgKzM2LDggQEAKICAgICBhc2IxMDAJNwkzCTEJNAkweDMxCTB4MDY5NAl5ZXMJbm8KICovCiAKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKwogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KQEAgLTcwMSw4ICs3MDMsNyBAQAogCWludCB2YWwxLCB2YWwyOwogCiAJaWYgKCFpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eShhZGFwdGVyLCBJMkNfRlVOQ19TTUJVU19CWVRFX0RBVEEpKSB7Ci0JCXByX2RlYnVnKCJhc2IxMDAubzogZGV0ZWN0IGZhaWxlZCwgIgotCQkJCSJzbWJ1cyBieXRlIGRhdGEgbm90IHN1cHBvcnRlZCFcbiIpOworCQlwcl9kZWJ1ZygiZGV0ZWN0IGZhaWxlZCwgc21idXMgYnl0ZSBkYXRhIG5vdCBzdXBwb3J0ZWQhXG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCkBAIC03MTUsNyArNzE2LDcgQEAKIAkJCSgoKCEodmFsMSAmIDB4ODApKSAmJiAodmFsMiAhPSAweDk0KSkgfHwKIAkJCS8qIENoZWNrIGZvciBBU0IxMDAgSUQgKGhpZ2ggYnl0ZSApICovCiAJCQkoKHZhbDEgJiAweDgwKSAmJiAodmFsMiAhPSAweDA2KSkpKSB7Ci0JCXByX2RlYnVnKCJhc2IxMDA6IGRldGVjdCBmYWlsZWQsIGJhZCBjaGlwIGlkIDB4JTAyeCFcbiIsIHZhbDIpOworCQlwcl9kZWJ1ZygiZGV0ZWN0IGZhaWxlZCwgYmFkIGNoaXAgaWQgMHglMDJ4IVxuIiwgdmFsMik7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIApAQCAtNzQ0LDcgKzc0NSw3IEBACiAKIAlkYXRhID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGFzYjEwMF9kYXRhKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFkYXRhKSB7Ci0JCXByX2RlYnVnKCJhc2IxMDAubzogcHJvYmUgZmFpbGVkLCBremFsbG9jIGZhaWxlZCFcbiIpOworCQlwcl9kZWJ1ZygicHJvYmUgZmFpbGVkLCBremFsbG9jIGZhaWxlZCFcbiIpOwogCQllcnIgPSAtRU5PTUVNOwogCQlnb3RvIEVSUk9SMDsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2FzdXNfYXRrMDExMC5jIGIvZHJpdmVycy9od21vbi9hc3VzX2F0azAxMTAuYwppbmRleCAyM2I4NTU1Li4yZDY4Y2YzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL2FzdXNfYXRrMDExMC5jCisrKyBiL2RyaXZlcnMvaHdtb24vYXN1c19hdGswMTEwLmMKQEAgLTUsNiArNSw4IEBACiAgKiBTZWUgQ09QWUlORyBpbiB0aGUgdG9wIGxldmVsIGRpcmVjdG9yeSBvZiB0aGUga2VybmVsIHRyZWUuCiAgKi8KIAorI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCiAjaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2h3bW9uLmg+CkBAIC0xNDE0LDE0ICsxNDE2LDEzIEBACiAKIAkvKiBNYWtlIHN1cmUgaXQncyBzYWZlIHRvIGFjY2VzcyB0aGUgZGV2aWNlIHRocm91Z2ggQUNQSSAqLwogCWlmICghYWNwaV9yZXNvdXJjZXNfYXJlX2VuZm9yY2VkKCkpIHsKLQkJcHJfZXJyKCJhdGs6IFJlc291cmNlcyBub3Qgc2FmZWx5IHVzYWJsZSBkdWUgdG8gIgotCQkgICAgICAgImFjcGlfZW5mb3JjZV9yZXNvdXJjZXMga2VybmVsIHBhcmFtZXRlclxuIik7CisJCXByX2VycigiUmVzb3VyY2VzIG5vdCBzYWZlbHkgdXNhYmxlIGR1ZSB0byBhY3BpX2VuZm9yY2VfcmVzb3VyY2VzIGtlcm5lbCBwYXJhbWV0ZXJcbiIpOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KIAogCXJldCA9IGFjcGlfYnVzX3JlZ2lzdGVyX2RyaXZlcigmYXRrX2RyaXZlcik7CiAJaWYgKHJldCkKLQkJcHJfaW5mbygiYXRrOiBhY3BpX2J1c19yZWdpc3Rlcl9kcml2ZXIgZmFpbGVkOiAlZFxuIiwgcmV0KTsKKwkJcHJfaW5mbygiYWNwaV9idXNfcmVnaXN0ZXJfZHJpdmVyIGZhaWxlZDogJWRcbiIsIHJldCk7CiAKIAlyZXR1cm4gcmV0OwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9jb3JldGVtcC5jIGIvZHJpdmVycy9od21vbi9jb3JldGVtcC5jCmluZGV4IDQyZGU5OGQuLjE5NGNhMGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vY29yZXRlbXAuYworKysgYi9kcml2ZXJzL2h3bW9uL2NvcmV0ZW1wLmMKQEAgLTIwLDYgKzIwLDggQEAKICAqIDAyMTEwLTEzMDEgVVNBLgogICovCiAKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKwogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CkBAIC00NDUsOCArNDQ3LDggQEAKIAkgKiB3aXRob3V0IHRoZXJtYWwgc2Vuc29ycyB3aWxsIGJlIGZpbHRlcmVkIG91dC4KIAkgKi8KIAlpZiAoIWNwdV9oYXMoYywgWDg2X0ZFQVRVUkVfRFRTKSkgewotCQlwcmludGsoS0VSTl9JTkZPIERSVk5BTUUgIjogQ1BVIChtb2RlbD0weCV4KSIKLQkJICAgICAgICIgaGFzIG5vIHRoZXJtYWwgc2Vuc29yLlxuIiwgYy0+eDg2X21vZGVsKTsKKwkJcHJfaW5mbygiQ1BVIChtb2RlbD0weCV4KSBoYXMgbm8gdGhlcm1hbCBzZW5zb3JcbiIsCisJCQljLT54ODZfbW9kZWwpOwogCQlyZXR1cm4gMDsKIAl9CiAKQEAgLTQ2Niw3ICs0NjgsNyBAQAogCXBkZXYgPSBwbGF0Zm9ybV9kZXZpY2VfYWxsb2MoRFJWTkFNRSwgY3B1KTsKIAlpZiAoIXBkZXYpIHsKIAkJZXJyID0gLUVOT01FTTsKLQkJcHJpbnRrKEtFUk5fRVJSIERSVk5BTUUgIjogRGV2aWNlIGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKKwkJcHJfZXJyKCJEZXZpY2UgYWxsb2NhdGlvbiBmYWlsZWRcbiIpOwogCQlnb3RvIGV4aXQ7CiAJfQogCkBAIC00NzgsOCArNDgwLDcgQEAKIAogCWVyciA9IHBsYXRmb3JtX2RldmljZV9hZGQocGRldik7CiAJaWYgKGVycikgewotCQlwcmludGsoS0VSTl9FUlIgRFJWTkFNRSAiOiBEZXZpY2UgYWRkaXRpb24gZmFpbGVkICglZClcbiIsCi0JCSAgICAgICBlcnIpOworCQlwcl9lcnIoIkRldmljZSBhZGRpdGlvbiBmYWlsZWQgKCVkKVxuIiwgZXJyKTsKIAkJZ290byBleGl0X2RldmljZV9mcmVlOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9kbWUxNzM3LmMgYi9kcml2ZXJzL2h3bW9uL2RtZTE3MzcuYwppbmRleCA5ODBjMTdkLi5lOWE2MTBiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL2RtZTE3MzcuYworKysgYi9kcml2ZXJzL2h3bW9uL2RtZTE3MzcuYwpAQCAtMjUsNiArMjUsOCBAQAogICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCiAgKi8KIAorI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KQEAgLTI0NDYsNyArMjQ0OCw3IEBACiAJLyogR2V0IHRoZSBiYXNlIGFkZHJlc3Mgb2YgdGhlIHJ1bnRpbWUgcmVnaXN0ZXJzICovCiAJaWYgKCEoYmFzZV9hZGRyID0gKGRtZTE3Mzdfc2lvX2luYihzaW9fY2lwLCAweDYwKSA8PCA4KSB8CiAJCQkgICBkbWUxNzM3X3Npb19pbmIoc2lvX2NpcCwgMHg2MSkpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiZG1lMTczNzogQmFzZSBhZGRyZXNzIG5vdCBzZXQuXG4iKTsKKwkJcHJfZXJyKCJCYXNlIGFkZHJlc3Mgbm90IHNldFxuIik7CiAJCWVyciA9IC1FTk9ERVY7CiAJCWdvdG8gZXhpdDsKIAl9CkBAIC0yNDc1LDIwICsyNDc3LDE4IEBACiAJCWdvdG8gZXhpdDsKIAogCWlmICghKHBkZXYgPSBwbGF0Zm9ybV9kZXZpY2VfYWxsb2MoImRtZTE3MzciLCBhZGRyKSkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJkbWUxNzM3OiBGYWlsZWQgdG8gYWxsb2NhdGUgZGV2aWNlLlxuIik7CisJCXByX2VycigiRmFpbGVkIHRvIGFsbG9jYXRlIGRldmljZVxuIik7CiAJCWVyciA9IC1FTk9NRU07CiAJCWdvdG8gZXhpdDsKIAl9CiAKIAlpZiAoKGVyciA9IHBsYXRmb3JtX2RldmljZV9hZGRfcmVzb3VyY2VzKHBkZXYsICZyZXMsIDEpKSkgewotCQlwcmludGsoS0VSTl9FUlIgImRtZTE3Mzc6IEZhaWxlZCB0byBhZGQgZGV2aWNlIHJlc291cmNlICIKLQkJICAgICAgICIoZXJyID0gJWQpLlxuIiwgZXJyKTsKKwkJcHJfZXJyKCJGYWlsZWQgdG8gYWRkIGRldmljZSByZXNvdXJjZSAoZXJyID0gJWQpXG4iLCBlcnIpOwogCQlnb3RvIGV4aXRfZGV2aWNlX3B1dDsKIAl9CiAKIAlpZiAoKGVyciA9IHBsYXRmb3JtX2RldmljZV9hZGQocGRldikpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiZG1lMTczNzogRmFpbGVkIHRvIGFkZCBkZXZpY2UgKGVyciA9ICVkKS5cbiIsCi0JCSAgICAgICBlcnIpOworCQlwcl9lcnIoIkZhaWxlZCB0byBhZGQgZGV2aWNlIChlcnIgPSAlZClcbiIsIGVycik7CiAJCWdvdG8gZXhpdF9kZXZpY2VfcHV0OwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9kczYyMC5jIGIvZHJpdmVycy9od21vbi9kczYyMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1Nzk1N2MKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2h3bW9uL2RzNjIwLmMKQEAgLTAsMCArMSwzMzcgQEAKKy8qCisgKiAgZHM2MjAuYyAtIFN1cHBvcnQgZm9yIHRlbXBlcmF0dXJlIHNlbnNvciBhbmQgdGhlcm1vc3RhdCBEUzYyMAorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMTAsIDIwMTEgUm9sYW5kIFN0aWdnZSA8c3RpZ2dlQGFudGNvbS5kZT4KKyAqCisgKiAgYmFzZWQgb24gZHMxNjIxLmMgYnkgQ2hyaXN0aWFuIFcuIFp1Y2tzY2h3ZXJkdCAgPHphbnlAdHJpcS5uZXQ+CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvaHdtb24uaD4KKyNpbmNsdWRlIDxsaW51eC9od21vbi1zeXNmcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMvZHM2MjAuaD4KKworLyoKKyAqIE1hbnkgRFM2MjAgY29uc3RhbnRzIHNwZWNpZmllZCBiZWxvdworICogIDE1ICAgMTQgICAxMyAgIDEyICAgMTEgICAxMCAgIDA5ICAgIDA4CisgKiB8RG9uZXxOVkIgfFRIRiB8VExGIHxSMSAgfFIwICB8QVVUT0N8MVNIT1R8CisgKgorICogIDA3ICAgMDYgICAwNSAgIDA0ICAgMDMgICAwMiAgIDAxICAgIDAwCisgKiB8UE8yIHxQTzEgfEEyICB8QTEgIHxBMCAgfCAgICB8ICAgICB8ICAgICB8CisgKi8KKyNkZWZpbmUgRFM2MjBfUkVHX0NPTkZJR19ET05FCQkweDgwMDAKKyNkZWZpbmUgRFM2MjBfUkVHX0NPTkZJR19OVkIJCTB4NDAwMAorI2RlZmluZSBEUzYyMF9SRUdfQ09ORklHX1RIRgkJMHgyMDAwCisjZGVmaW5lIERTNjIwX1JFR19DT05GSUdfVExGCQkweDEwMDAKKyNkZWZpbmUgRFM2MjBfUkVHX0NPTkZJR19SMQkJMHgwODAwCisjZGVmaW5lIERTNjIwX1JFR19DT05GSUdfUjAJCTB4MDQwMAorI2RlZmluZSBEUzYyMF9SRUdfQ09ORklHX0FVVE9DCQkweDAyMDAKKyNkZWZpbmUgRFM2MjBfUkVHX0NPTkZJR18xU0hPVAkJMHgwMTAwCisjZGVmaW5lIERTNjIwX1JFR19DT05GSUdfUE8yCQkweDAwODAKKyNkZWZpbmUgRFM2MjBfUkVHX0NPTkZJR19QTzEJCTB4MDA0MAorI2RlZmluZSBEUzYyMF9SRUdfQ09ORklHX0EyCQkweDAwMjAKKyNkZWZpbmUgRFM2MjBfUkVHX0NPTkZJR19BMQkJMHgwMDEwCisjZGVmaW5lIERTNjIwX1JFR19DT05GSUdfQTAJCTB4MDAwOAorCisvKiBUaGUgRFM2MjAgcmVnaXN0ZXJzICovCitzdGF0aWMgY29uc3QgdTggRFM2MjBfUkVHX1RFTVBbM10gPSB7CisJMHhBQSwJCQkvKiBpbnB1dCwgd29yZCwgUk8gKi8KKwkweEEyLAkJCS8qIG1pbiwgd29yZCwgUlcgKi8KKwkweEEwLAkJCS8qIG1heCwgd29yZCwgUlcgKi8KK307CisKKyNkZWZpbmUgRFM2MjBfUkVHX0NPTkYJCTB4QUMJLyogd29yZCwgUlcgKi8KKyNkZWZpbmUgRFM2MjBfQ09NX1NUQVJUCQkweDUxCS8qIG5vIGRhdGEgKi8KKyNkZWZpbmUgRFM2MjBfQ09NX1NUT1AJCTB4MjIJLyogbm8gZGF0YSAqLworCisvKiBFYWNoIGNsaWVudCBoYXMgdGhpcyBhZGRpdGlvbmFsIGRhdGEgKi8KK3N0cnVjdCBkczYyMF9kYXRhIHsKKwlzdHJ1Y3QgZGV2aWNlICpod21vbl9kZXY7CisJc3RydWN0IG11dGV4IHVwZGF0ZV9sb2NrOworCWNoYXIgdmFsaWQ7CQkvKiAhPTAgaWYgZm9sbG93aW5nIGZpZWxkcyBhcmUgdmFsaWQgKi8KKwl1bnNpZ25lZCBsb25nIGxhc3RfdXBkYXRlZDsJLyogSW4gamlmZmllcyAqLworCisJdTE2IHRlbXBbM107CQkvKiBSZWdpc3RlciB2YWx1ZXMsIHdvcmQgKi8KK307CisKKy8qCisgKiAgVGVtcGVyYXR1cmUgcmVnaXN0ZXJzIGFyZSB3b3JkLXNpemVkLgorICogIERTNjIwIHVzZXMgYSBoaWdoLWJ5dGUgZmlyc3QgY29udmVudGlvbiwgd2hpY2ggaXMgZXhhY3RseSBvcHBvc2l0ZSB0bworICogIHRoZSBTTUJ1cyBzdGFuZGFyZC4KKyAqLworc3RhdGljIGludCBkczYyMF9yZWFkX3RlbXAoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggcmVnKQoreworCWludCByZXQ7CisKKwlyZXQgPSBpMmNfc21idXNfcmVhZF93b3JkX2RhdGEoY2xpZW50LCByZWcpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCXJldHVybiBzd2FiMTYocmV0KTsKK30KKworc3RhdGljIGludCBkczYyMF93cml0ZV90ZW1wKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IHJlZywgdTE2IHZhbHVlKQoreworCXJldHVybiBpMmNfc21idXNfd3JpdGVfd29yZF9kYXRhKGNsaWVudCwgcmVnLCBzd2FiMTYodmFsdWUpKTsKK30KKworc3RhdGljIHZvaWQgZHM2MjBfaW5pdF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlzdHJ1Y3QgZHM2MjBfcGxhdGZvcm1fZGF0YSAqZHM2MjBfaW5mbyA9IGNsaWVudC0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJdTE2IGNvbmYsIG5ld19jb25mOworCisJbmV3X2NvbmYgPSBjb25mID0KKwkgICAgc3dhYjE2KGkyY19zbWJ1c19yZWFkX3dvcmRfZGF0YShjbGllbnQsIERTNjIwX1JFR19DT05GKSk7CisKKwkvKiBzd2l0Y2ggdG8gY29udGludW91cyBjb252ZXJzaW9uIG1vZGUgKi8KKwluZXdfY29uZiAmPSB+RFM2MjBfUkVHX0NPTkZJR18xU0hPVDsKKwkvKiBhbHJlYWR5IGhpZ2ggYXQgcG93ZXItb24sIGJ1dCBkb24ndCB0cnVzdCB0aGUgQklPUyEgKi8KKwluZXdfY29uZiB8PSBEUzYyMF9SRUdfQ09ORklHX1BPMjsKKwkvKiB0aGVybW9zdGF0IG1vZGUgYWNjb3JkaW5nIHRvIHBsYXRmb3JtIGRhdGEgKi8KKwlpZiAoZHM2MjBfaW5mbyAmJiBkczYyMF9pbmZvLT5wb21vZGUgPT0gMSkKKwkJbmV3X2NvbmYgJj0gfkRTNjIwX1JFR19DT05GSUdfUE8xOyAvKiBQT19MT1cgKi8KKwllbHNlIGlmIChkczYyMF9pbmZvICYmIGRzNjIwX2luZm8tPnBvbW9kZSA9PSAyKQorCQluZXdfY29uZiB8PSBEUzYyMF9SRUdfQ09ORklHX1BPMTsgLyogUE9fSElHSCAqLworCWVsc2UKKwkJbmV3X2NvbmYgJj0gfkRTNjIwX1JFR19DT05GSUdfUE8yOyAvKiBhbHdheXMgbG93ICovCisJLyogd2l0aCBoaWdoZXN0IHByZWNpc2lvbiAqLworCW5ld19jb25mIHw9IERTNjIwX1JFR19DT05GSUdfUjEgfCBEUzYyMF9SRUdfQ09ORklHX1IwOworCisJaWYgKGNvbmYgIT0gbmV3X2NvbmYpCisJCWkyY19zbWJ1c193cml0ZV93b3JkX2RhdGEoY2xpZW50LCBEUzYyMF9SRUdfQ09ORiwKKwkJCQkJICBzd2FiMTYobmV3X2NvbmYpKTsKKworCS8qIHN0YXJ0IGNvbnZlcnNpb24gKi8KKwlpMmNfc21idXNfd3JpdGVfYnl0ZShjbGllbnQsIERTNjIwX0NPTV9TVEFSVCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZHM2MjBfZGF0YSAqZHM2MjBfdXBkYXRlX2NsaWVudChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgZHM2MjBfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXN0cnVjdCBkczYyMF9kYXRhICpyZXQgPSBkYXRhOworCisJbXV0ZXhfbG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOworCisJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgZGF0YS0+bGFzdF91cGRhdGVkICsgSFogKyBIWiAvIDIpCisJICAgIHx8ICFkYXRhLT52YWxpZCkgeworCQlpbnQgaTsKKwkJaW50IHJlczsKKworCQlkZXZfZGJnKCZjbGllbnQtPmRldiwgIlN0YXJ0aW5nIGRzNjIwIHVwZGF0ZVxuIik7CisKKwkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZGF0YS0+dGVtcCk7IGkrKykgeworCQkJcmVzID0gZHM2MjBfcmVhZF90ZW1wKGNsaWVudCwKKwkJCQkJICAgICAgRFM2MjBfUkVHX1RFTVBbaV0pOworCQkJaWYgKHJlcyA8IDApIHsKKwkJCQlyZXQgPSBFUlJfUFRSKHJlcyk7CisJCQkJZ290byBhYm9ydDsKKwkJCX0KKworCQkJZGF0YS0+dGVtcFtpXSA9IHJlczsKKwkJfQorCisJCWRhdGEtPmxhc3RfdXBkYXRlZCA9IGppZmZpZXM7CisJCWRhdGEtPnZhbGlkID0gMTsKKwl9CithYm9ydDoKKwltdXRleF91bmxvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfdGVtcChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkYSwKKwkJCSBjaGFyICpidWYpCit7CisJc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlICphdHRyID0gdG9fc2Vuc29yX2Rldl9hdHRyKGRhKTsKKwlzdHJ1Y3QgZHM2MjBfZGF0YSAqZGF0YSA9IGRzNjIwX3VwZGF0ZV9jbGllbnQoZGV2KTsKKworCWlmIChJU19FUlIoZGF0YSkpCisJCXJldHVybiBQVFJfRVJSKGRhdGEpOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsICgoZGF0YS0+dGVtcFthdHRyLT5pbmRleF0gLyA4KSAqIDYyNSkgLyAxMCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNldF90ZW1wKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRhLAorCQkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJaW50IHJlczsKKwlsb25nIHZhbDsKKworCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciA9IHRvX3NlbnNvcl9kZXZfYXR0cihkYSk7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgZHM2MjBfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCisJcmVzID0gc3RyaWN0X3N0cnRvbChidWYsIDEwLCAmdmFsKTsKKworCWlmIChyZXMpCisJCXJldHVybiByZXM7CisKKwl2YWwgPSAodmFsICogMTAgLyA2MjUpICogODsKKworCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlkYXRhLT50ZW1wW2F0dHItPmluZGV4XSA9IHZhbDsKKwlkczYyMF93cml0ZV90ZW1wKGNsaWVudCwgRFM2MjBfUkVHX1RFTVBbYXR0ci0+aW5kZXhdLAorCQkJIGRhdGEtPnRlbXBbYXR0ci0+aW5kZXhdKTsKKwltdXRleF91bmxvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfYWxhcm0oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGEsCisJCQkgIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGUgKmF0dHIgPSB0b19zZW5zb3JfZGV2X2F0dHIoZGEpOworCXN0cnVjdCBkczYyMF9kYXRhICpkYXRhID0gZHM2MjBfdXBkYXRlX2NsaWVudChkZXYpOworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJdTE2IGNvbmYsIG5ld19jb25mOworCWludCByZXM7CisKKwlpZiAoSVNfRVJSKGRhdGEpKQorCQlyZXR1cm4gUFRSX0VSUihkYXRhKTsKKworCS8qIHJlc2V0IGFsYXJtcyBpZiBuZWNlc3NhcnkgKi8KKwlyZXMgPSBpMmNfc21idXNfcmVhZF93b3JkX2RhdGEoY2xpZW50LCBEUzYyMF9SRUdfQ09ORik7CisJaWYgKHJlcyA8IDApCisJCXJldHVybiByZXM7CisKKwljb25mID0gc3dhYjE2KHJlcyk7CisJbmV3X2NvbmYgPSBjb25mOworCW5ld19jb25mICY9IH5hdHRyLT5pbmRleDsKKwlpZiAoY29uZiAhPSBuZXdfY29uZikgeworCQlyZXMgPSBpMmNfc21idXNfd3JpdGVfd29yZF9kYXRhKGNsaWVudCwgRFM2MjBfUkVHX0NPTkYsCisJCQkJCQlzd2FiMTYobmV3X2NvbmYpKTsKKwkJaWYgKHJlcyA8IDApCisJCQlyZXR1cm4gcmVzOworCX0KKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCAhIShjb25mICYgYXR0ci0+aW5kZXgpKTsKK30KKworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMV9pbnB1dCwgU19JUlVHTywgc2hvd190ZW1wLCBOVUxMLCAwKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDFfbWluLCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd190ZW1wLCBzZXRfdGVtcCwgMSk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAxX21heCwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfdGVtcCwgc2V0X3RlbXAsIDIpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMV9taW5fYWxhcm0sIFNfSVJVR08sIHNob3dfYWxhcm0sIE5VTEwsCisJCQkgIERTNjIwX1JFR19DT05GSUdfVExGKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDFfbWF4X2FsYXJtLCBTX0lSVUdPLCBzaG93X2FsYXJtLCBOVUxMLAorCQkJICBEUzYyMF9SRUdfQ09ORklHX1RIRik7CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpkczYyMF9hdHRyaWJ1dGVzW10gPSB7CisJJnNlbnNvcl9kZXZfYXR0cl90ZW1wMV9pbnB1dC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDFfbWluLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl90ZW1wMV9tYXguZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX3RlbXAxX21pbl9hbGFybS5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDFfbWF4X2FsYXJtLmRldl9hdHRyLmF0dHIsCisJTlVMTAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgZHM2MjBfZ3JvdXAgPSB7CisJLmF0dHJzID0gZHM2MjBfYXR0cmlidXRlcywKK307CisKK3N0YXRpYyBpbnQgZHM2MjBfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKKwkJICAgICAgIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3QgZHM2MjBfZGF0YSAqZGF0YTsKKwlpbnQgZXJyOworCisJZGF0YSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBkczYyMF9kYXRhKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkYXRhKSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZXhpdDsKKwl9CisKKwlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBkYXRhKTsKKwltdXRleF9pbml0KCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwkvKiBJbml0aWFsaXplIHRoZSBEUzYyMCBjaGlwICovCisJZHM2MjBfaW5pdF9jbGllbnQoY2xpZW50KTsKKworCS8qIFJlZ2lzdGVyIHN5c2ZzIGhvb2tzICovCisJZXJyID0gc3lzZnNfY3JlYXRlX2dyb3VwKCZjbGllbnQtPmRldi5rb2JqLCAmZHM2MjBfZ3JvdXApOworCWlmIChlcnIpCisJCWdvdG8gZXhpdF9mcmVlOworCisJZGF0YS0+aHdtb25fZGV2ID0gaHdtb25fZGV2aWNlX3JlZ2lzdGVyKCZjbGllbnQtPmRldik7CisJaWYgKElTX0VSUihkYXRhLT5od21vbl9kZXYpKSB7CisJCWVyciA9IFBUUl9FUlIoZGF0YS0+aHdtb25fZGV2KTsKKwkJZ290byBleGl0X3JlbW92ZV9maWxlczsKKwl9CisKKwlkZXZfaW5mbygmY2xpZW50LT5kZXYsICJ0ZW1wZXJhdHVyZSBzZW5zb3IgZm91bmRcbiIpOworCisJcmV0dXJuIDA7CisKK2V4aXRfcmVtb3ZlX2ZpbGVzOgorCXN5c2ZzX3JlbW92ZV9ncm91cCgmY2xpZW50LT5kZXYua29iaiwgJmRzNjIwX2dyb3VwKTsKK2V4aXRfZnJlZToKKwlrZnJlZShkYXRhKTsKK2V4aXQ6CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBkczYyMF9yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlzdHJ1Y3QgZHM2MjBfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCisJaHdtb25fZGV2aWNlX3VucmVnaXN0ZXIoZGF0YS0+aHdtb25fZGV2KTsKKwlzeXNmc19yZW1vdmVfZ3JvdXAoJmNsaWVudC0+ZGV2LmtvYmosICZkczYyMF9ncm91cCk7CisKKwlrZnJlZShkYXRhKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgZHM2MjBfaWRbXSA9IHsKKwl7ImRzNjIwIiwgMH0sCisJe30KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCBkczYyMF9pZCk7CisKKy8qIFRoaXMgaXMgdGhlIGRyaXZlciB0aGF0IHdpbGwgYmUgaW5zZXJ0ZWQgKi8KK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBkczYyMF9kcml2ZXIgPSB7CisJLmNsYXNzID0gSTJDX0NMQVNTX0hXTU9OLAorCS5kcml2ZXIgPSB7CisJCSAgIC5uYW1lID0gImRzNjIwIiwKKwl9LAorCS5wcm9iZSA9IGRzNjIwX3Byb2JlLAorCS5yZW1vdmUgPSBkczYyMF9yZW1vdmUsCisJLmlkX3RhYmxlID0gZHM2MjBfaWQsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBkczYyMF9pbml0KHZvaWQpCit7CisJcmV0dXJuIGkyY19hZGRfZHJpdmVyKCZkczYyMF9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZHM2MjBfZXhpdCh2b2lkKQoreworCWkyY19kZWxfZHJpdmVyKCZkczYyMF9kcml2ZXIpOworfQorCitNT0RVTEVfQVVUSE9SKCJSb2xhbmQgU3RpZ2dlIDxzdGlnZ2VAYW50Y29tLmRlPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJEUzYyMCBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworbW9kdWxlX2luaXQoZHM2MjBfaW5pdCk7Cittb2R1bGVfZXhpdChkczYyMF9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vZjcxODA1Zi5jIGIvZHJpdmVycy9od21vbi9mNzE4MDVmLmMKaW5kZXggNTI1YTAwYi4uOTJmOTQ5NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9mNzE4MDVmLmMKKysrIGIvZHJpdmVycy9od21vbi9mNzE4MDVmLmMKQEAgLTI4LDYgKzI4LDggQEAKICAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgogICovCiAKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKwogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CkBAIC0xMzA5LDcgKzEzMTEsNyBAQAogCiAJaWYgKCEoZGF0YSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBmNzE4MDVmX2RhdGEpLCBHRlBfS0VSTkVMKSkpIHsKIAkJZXJyID0gLUVOT01FTTsKLQkJcHJpbnRrKEtFUk5fRVJSIERSVk5BTUUgIjogT3V0IG9mIG1lbW9yeVxuIik7CisJCXByX2VycigiT3V0IG9mIG1lbW9yeVxuIik7CiAJCWdvdG8gZXhpdDsKIAl9CiAKQEAgLTE0NTEsNyArMTQ1Myw3IEBACiAJcGRldiA9IHBsYXRmb3JtX2RldmljZV9hbGxvYyhEUlZOQU1FLCBhZGRyZXNzKTsKIAlpZiAoIXBkZXYpIHsKIAkJZXJyID0gLUVOT01FTTsKLQkJcHJpbnRrKEtFUk5fRVJSIERSVk5BTUUgIjogRGV2aWNlIGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKKwkJcHJfZXJyKCJEZXZpY2UgYWxsb2NhdGlvbiBmYWlsZWRcbiIpOwogCQlnb3RvIGV4aXQ7CiAJfQogCkBAIC0xNDYyLDIyICsxNDY0LDIwIEBACiAKIAllcnIgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkX3Jlc291cmNlcyhwZGV2LCAmcmVzLCAxKTsKIAlpZiAoZXJyKSB7Ci0JCXByaW50ayhLRVJOX0VSUiBEUlZOQU1FICI6IERldmljZSByZXNvdXJjZSBhZGRpdGlvbiBmYWlsZWQgIgotCQkgICAgICAgIiglZClcbiIsIGVycik7CisJCXByX2VycigiRGV2aWNlIHJlc291cmNlIGFkZGl0aW9uIGZhaWxlZCAoJWQpXG4iLCBlcnIpOwogCQlnb3RvIGV4aXRfZGV2aWNlX3B1dDsKIAl9CiAKIAllcnIgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkX2RhdGEocGRldiwgc2lvX2RhdGEsCiAJCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgZjcxODA1Zl9zaW9fZGF0YSkpOwogCWlmIChlcnIpIHsKLQkJcHJpbnRrKEtFUk5fRVJSIERSVk5BTUUgIjogUGxhdGZvcm0gZGF0YSBhbGxvY2F0aW9uIGZhaWxlZFxuIik7CisJCXByX2VycigiUGxhdGZvcm0gZGF0YSBhbGxvY2F0aW9uIGZhaWxlZFxuIik7CiAJCWdvdG8gZXhpdF9kZXZpY2VfcHV0OwogCX0KIAogCWVyciA9IHBsYXRmb3JtX2RldmljZV9hZGQocGRldik7CiAJaWYgKGVycikgewotCQlwcmludGsoS0VSTl9FUlIgRFJWTkFNRSAiOiBEZXZpY2UgYWRkaXRpb24gZmFpbGVkICglZClcbiIsCi0JCSAgICAgICBlcnIpOworCQlwcl9lcnIoIkRldmljZSBhZGRpdGlvbiBmYWlsZWQgKCVkKVxuIiwgZXJyKTsKIAkJZ290byBleGl0X2RldmljZV9wdXQ7CiAJfQogCkBAIC0xNTE2LDMwICsxNTE2LDI3IEBACiAJCXNpb19kYXRhLT5mbnNlbDEgPSBzdXBlcmlvX2luYihzaW9hZGRyLCBTSU9fUkVHX0ZOU0VMMSk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCXByaW50ayhLRVJOX0lORk8gRFJWTkFNRSAiOiBVbnN1cHBvcnRlZCBGaW50ZWsgZGV2aWNlLCAiCi0JCSAgICAgICAic2tpcHBpbmdcbiIpOworCQlwcl9pbmZvKCJVbnN1cHBvcnRlZCBGaW50ZWsgZGV2aWNlLCBza2lwcGluZ1xuIik7CiAJCWdvdG8gZXhpdDsKIAl9CiAKIAlzdXBlcmlvX3NlbGVjdChzaW9hZGRyLCBGNzE4MDVGX0xEX0hXTSk7CiAJaWYgKCEoc3VwZXJpb19pbmIoc2lvYWRkciwgU0lPX1JFR19FTkFCTEUpICYgMHgwMSkpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyBEUlZOQU1FICI6IERldmljZSBub3QgYWN0aXZhdGVkLCAiCi0JCSAgICAgICAic2tpcHBpbmdcbiIpOworCQlwcl93YXJuKCJEZXZpY2Ugbm90IGFjdGl2YXRlZCwgc2tpcHBpbmdcbiIpOwogCQlnb3RvIGV4aXQ7CiAJfQogCiAJKmFkZHJlc3MgPSBzdXBlcmlvX2ludyhzaW9hZGRyLCBTSU9fUkVHX0FERFIpOwogCWlmICgqYWRkcmVzcyA9PSAwKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgRFJWTkFNRSAiOiBCYXNlIGFkZHJlc3Mgbm90IHNldCwgIgotCQkgICAgICAgInNraXBwaW5nXG4iKTsKKwkJcHJfd2FybigiQmFzZSBhZGRyZXNzIG5vdCBzZXQsIHNraXBwaW5nXG4iKTsKIAkJZ290byBleGl0OwogCX0KIAkqYWRkcmVzcyAmPSB+KFJFR0lPTl9MRU5HVEggLSAxKTsJLyogSWdub3JlIDMgTFNCICovCiAKIAllcnIgPSAwOwotCXByaW50ayhLRVJOX0lORk8gRFJWTkFNRSAiOiBGb3VuZCAlcyBjaGlwIGF0ICUjeCwgcmV2aXNpb24gJXVcbiIsCi0JICAgICAgIG5hbWVzW3Npb19kYXRhLT5raW5kXSwgKmFkZHJlc3MsCi0JICAgICAgIHN1cGVyaW9faW5iKHNpb2FkZHIsIFNJT19SRUdfREVWUkVWKSk7CisJcHJfaW5mbygiRm91bmQgJXMgY2hpcCBhdCAlI3gsIHJldmlzaW9uICV1XG4iLAorCQluYW1lc1tzaW9fZGF0YS0+a2luZF0sICphZGRyZXNzLAorCQlzdXBlcmlvX2luYihzaW9hZGRyLCBTSU9fUkVHX0RFVlJFVikpOwogCiBleGl0OgogCXN1cGVyaW9fZXhpdChzaW9hZGRyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vZjcxODgyZmcuYyBiL2RyaXZlcnMvaHdtb24vZjcxODgyZmcuYwppbmRleCA3NWFmYjNiLi4zZjQ5ZGQzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL2Y3MTg4MmZnLmMKKysrIGIvZHJpdmVycy9od21vbi9mNzE4ODJmZy5jCkBAIC0xOCw2ICsxOCw4IEBACiAgKiAgIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgpAQCAtODY1LDggKzg2Nyw3IEBACiB7CiAJLyogRG9uJ3Qgc3RlcCBvbiBvdGhlciBkcml2ZXJzJyBJL08gc3BhY2UgYnkgYWNjaWRlbnQgKi8KIAlpZiAoIXJlcXVlc3RfbXV4ZWRfcmVnaW9uKGJhc2UsIDIsIERSVk5BTUUpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiBEUlZOQU1FICI6IEkvTyBhZGRyZXNzIDB4JTA0eCBhbHJlYWR5IGluIHVzZVxuIiwKLQkJCQliYXNlKTsKKwkJcHJfZXJyKCJJL08gYWRkcmVzcyAweCUwNHggYWxyZWFkeSBpbiB1c2VcbiIsIGJhc2UpOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KIApAQCAtMjE5Miw3ICsyMTkzLDcgQEAKIAogCWRldmlkID0gc3VwZXJpb19pbncoc2lvYWRkciwgU0lPX1JFR19NQU5JRCk7CiAJaWYgKGRldmlkICE9IFNJT19GSU5URUtfSUQpIHsKLQkJcHJfZGVidWcoRFJWTkFNRSAiOiBOb3QgYSBGaW50ZWsgZGV2aWNlXG4iKTsKKwkJcHJfZGVidWcoIk5vdCBhIEZpbnRlayBkZXZpY2VcbiIpOwogCQllcnIgPSAtRU5PREVWOwogCQlnb3RvIGV4aXQ7CiAJfQpAQCAtMjIxNSw4ICsyMjE2LDggQEAKIAkJc2lvX2RhdGEtPnR5cGUgPSBmODAwMDsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJcHJpbnRrKEtFUk5fSU5GTyBEUlZOQU1FICI6IFVuc3VwcG9ydGVkIEZpbnRlayBkZXZpY2U6ICUwNHhcbiIsCi0JCSAgICAgICAodW5zaWduZWQgaW50KWRldmlkKTsKKwkJcHJfaW5mbygiVW5zdXBwb3J0ZWQgRmludGVrIGRldmljZTogJTA0eFxuIiwKKwkJCSh1bnNpZ25lZCBpbnQpZGV2aWQpOwogCQllcnIgPSAtRU5PREVWOwogCQlnb3RvIGV4aXQ7CiAJfQpAQCAtMjIyNywyMSArMjIyOCwyMSBAQAogCQlzdXBlcmlvX3NlbGVjdChzaW9hZGRyLCBTSU9fRjcxODgyRkdfTERfSFdNKTsKIAogCWlmICghKHN1cGVyaW9faW5iKHNpb2FkZHIsIFNJT19SRUdfRU5BQkxFKSAmIDB4MDEpKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgRFJWTkFNRSAiOiBEZXZpY2Ugbm90IGFjdGl2YXRlZFxuIik7CisJCXByX3dhcm4oIkRldmljZSBub3QgYWN0aXZhdGVkXG4iKTsKIAkJZXJyID0gLUVOT0RFVjsKIAkJZ290byBleGl0OwogCX0KIAogCSphZGRyZXNzID0gc3VwZXJpb19pbncoc2lvYWRkciwgU0lPX1JFR19BRERSKTsKIAlpZiAoKmFkZHJlc3MgPT0gMCkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HIERSVk5BTUUgIjogQmFzZSBhZGRyZXNzIG5vdCBzZXRcbiIpOworCQlwcl93YXJuKCJCYXNlIGFkZHJlc3Mgbm90IHNldFxuIik7CiAJCWVyciA9IC1FTk9ERVY7CiAJCWdvdG8gZXhpdDsKIAl9CiAJKmFkZHJlc3MgJj0gfihSRUdJT05fTEVOR1RIIC0gMSk7CS8qIElnbm9yZSAzIExTQiAqLwogCiAJZXJyID0gMDsKLQlwcmludGsoS0VSTl9JTkZPIERSVk5BTUUgIjogRm91bmQgJXMgY2hpcCBhdCAlI3gsIHJldmlzaW9uICVkXG4iLAorCXByX2luZm8oIkZvdW5kICVzIGNoaXAgYXQgJSN4LCByZXZpc2lvbiAlZFxuIiwKIAkJZjcxODgyZmdfbmFtZXNbc2lvX2RhdGEtPnR5cGVdLAkodW5zaWduZWQgaW50KSphZGRyZXNzLAogCQkoaW50KXN1cGVyaW9faW5iKHNpb2FkZHIsIFNJT19SRUdfREVWUkVWKSk7CiBleGl0OgpAQCAtMjI3MCwyMCArMjI3MSwyMCBAQAogCiAJZXJyID0gcGxhdGZvcm1fZGV2aWNlX2FkZF9yZXNvdXJjZXMoZjcxODgyZmdfcGRldiwgJnJlcywgMSk7CiAJaWYgKGVycikgewotCQlwcmludGsoS0VSTl9FUlIgRFJWTkFNRSAiOiBEZXZpY2UgcmVzb3VyY2UgYWRkaXRpb24gZmFpbGVkXG4iKTsKKwkJcHJfZXJyKCJEZXZpY2UgcmVzb3VyY2UgYWRkaXRpb24gZmFpbGVkXG4iKTsKIAkJZ290byBleGl0X2RldmljZV9wdXQ7CiAJfQogCiAJZXJyID0gcGxhdGZvcm1fZGV2aWNlX2FkZF9kYXRhKGY3MTg4MmZnX3BkZXYsIHNpb19kYXRhLAogCQkJCSAgICAgICBzaXplb2Yoc3RydWN0IGY3MTg4MmZnX3Npb19kYXRhKSk7CiAJaWYgKGVycikgewotCQlwcmludGsoS0VSTl9FUlIgRFJWTkFNRSAiOiBQbGF0Zm9ybSBkYXRhIGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKKwkJcHJfZXJyKCJQbGF0Zm9ybSBkYXRhIGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKIAkJZ290byBleGl0X2RldmljZV9wdXQ7CiAJfQogCiAJZXJyID0gcGxhdGZvcm1fZGV2aWNlX2FkZChmNzE4ODJmZ19wZGV2KTsKIAlpZiAoZXJyKSB7Ci0JCXByaW50ayhLRVJOX0VSUiBEUlZOQU1FICI6IERldmljZSBhZGRpdGlvbiBmYWlsZWRcbiIpOworCQlwcl9lcnIoIkRldmljZSBhZGRpdGlvbiBmYWlsZWRcbiIpOwogCQlnb3RvIGV4aXRfZGV2aWNlX3B1dDsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vaHBfYWNjZWwuYyBiL2RyaXZlcnMvaHdtb24vaHBfYWNjZWwuYwppbmRleCBhNTZhNzg0Li4zZDIxZmEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL2hwX2FjY2VsLmMKKysrIGIvZHJpdmVycy9od21vbi9ocF9hY2NlbC5jCkBAIC0yMCw2ICsyMCw4IEBACiAgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQogICovCiAKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKwogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9kbWkuaD4KQEAgLTE0Nyw3ICsxNDksNyBAQAogc3RhdGljIGludCBsaXMzbHYwMmRfZG1pX21hdGNoZWQoY29uc3Qgc3RydWN0IGRtaV9zeXN0ZW1faWQgKmRtaSkKIHsKIAlsaXMzX2Rldi5hYyA9ICooKHVuaW9uIGF4aXNfY29udmVyc2lvbiAqKWRtaS0+ZHJpdmVyX2RhdGEpOwotCXByaW50ayhLRVJOX0lORk8gRFJJVkVSX05BTUUgIjogaGFyZHdhcmUgdHlwZSAlcyBmb3VuZC5cbiIsIGRtaS0+aWRlbnQpOworCXByX2luZm8oImhhcmR3YXJlIHR5cGUgJXMgZm91bmRcbiIsIGRtaS0+aWRlbnQpOwogCiAJcmV0dXJuIDE7CiB9CkBAIC0zMDMsMTEgKzMwNSwxMCBAQAogCiAJLyogSWYgcG9zc2libGUgdXNlIGEgInN0YW5kYXJkIiBheGVzIG9yZGVyICovCiAJaWYgKGxpczNfZGV2LmFjLnggJiYgbGlzM19kZXYuYWMueSAmJiBsaXMzX2Rldi5hYy56KSB7Ci0JCXByaW50ayhLRVJOX0lORk8gRFJJVkVSX05BTUUgIjogVXNpbmcgY3VzdG9tIGF4ZXMgJWQsJWQsJWRcbiIsCi0JCSAgICAgICBsaXMzX2Rldi5hYy54LCBsaXMzX2Rldi5hYy55LCBsaXMzX2Rldi5hYy56KTsKKwkJcHJfaW5mbygiVXNpbmcgY3VzdG9tIGF4ZXMgJWQsJWQsJWRcbiIsCisJCQlsaXMzX2Rldi5hYy54LCBsaXMzX2Rldi5hYy55LCBsaXMzX2Rldi5hYy56KTsKIAl9IGVsc2UgaWYgKGRtaV9jaGVja19zeXN0ZW0obGlzM2x2MDJkX2RtaV9pZHMpID09IDApIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyBEUklWRVJfTkFNRSAiOiBsYXB0b3AgbW9kZWwgdW5rbm93biwgIgotCQkJCSAidXNpbmcgZGVmYXVsdCBheGVzIGNvbmZpZ3VyYXRpb25cbiIpOworCQlwcl9pbmZvKCJsYXB0b3AgbW9kZWwgdW5rbm93biwgdXNpbmcgZGVmYXVsdCBheGVzIGNvbmZpZ3VyYXRpb25cbiIpOwogCQlsaXMzX2Rldi5hYyA9IGxpczNsdjAyZF9heGlzX25vcm1hbDsKIAl9CiAKQEAgLTM4NSw3ICszODYsNyBAQAogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCi0JcHJpbnRrKEtFUk5fSU5GTyBEUklWRVJfTkFNRSAiIGRyaXZlciBsb2FkZWQuXG4iKTsKKwlwcl9pbmZvKCJkcml2ZXIgbG9hZGVkXG4iKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9od21vbi12aWQuYyBiL2RyaXZlcnMvaHdtb24vaHdtb24tdmlkLmMKaW5kZXggMmIyY2ExNi4uMjU4MmJmZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9od21vbi12aWQuYworKysgYi9kcml2ZXJzL2h3bW9uL2h3bW9uLXZpZC5jCkBAIC0yMiw2ICsyMiw4IEBACiAgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KICAqLwogCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9od21vbi12aWQuaD4KQEAgLTE0Niw4ICsxNDgsOCBAQAogCQlyZXR1cm4odmFsID4gMHg3NyA/IDAgOiAoMTUwMDAwMCAtICh2YWwgKiAxMjUwMCkgKyA1MDApIC8gMTAwMCk7CiAJZGVmYXVsdDoJCS8qIHJlcG9ydCAwIGZvciB1bmtub3duICovCiAJCWlmICh2cm0pCi0JCQlwcmludGsoS0VSTl9XQVJOSU5HICJod21vbi12aWQ6IFJlcXVlc3RlZCB1bnN1cHBvcnRlZCAiCi0JCQkgICAgICAgIlZSTSB2ZXJzaW9uICgldSlcbiIsICh1bnNpZ25lZCBpbnQpdnJtKTsKKwkJCXByX3dhcm4oIlJlcXVlc3RlZCB1bnN1cHBvcnRlZCBWUk0gdmVyc2lvbiAoJXUpXG4iLAorCQkJCSh1bnNpZ25lZCBpbnQpdnJtKTsKIAkJcmV0dXJuIDA7CiAJfQogfQpAQCAtMjQ2LDggKzI0OCw3IEBACiAJfQogCXZybV9yZXQgPSBmaW5kX3ZybShlZmZfZmFtaWx5LCBlZmZfbW9kZWwsIGVmZl9zdGVwcGluZywgYy0+eDg2X3ZlbmRvcik7CiAJaWYgKHZybV9yZXQgPT0gMCkKLQkJcHJpbnRrKEtFUk5fSU5GTyAiaHdtb24tdmlkOiBVbmtub3duIFZSTSB2ZXJzaW9uIG9mIHlvdXIgIgotCQkgICAgICAgIng4NiBDUFVcbiIpOworCQlwcl9pbmZvKCJVbmtub3duIFZSTSB2ZXJzaW9uIG9mIHlvdXIgeDg2IENQVVxuIik7CiAJcmV0dXJuIHZybV9yZXQ7CiB9CiAKQEAgLTI1NSw3ICsyNTYsNyBAQAogI2Vsc2UKIHU4IHZpZF93aGljaF92cm0odm9pZCkKIHsKLQlwcmludGsoS0VSTl9JTkZPICJod21vbi12aWQ6IFVua25vd24gVlJNIHZlcnNpb24gb2YgeW91ciBDUFVcbiIpOworCXByX2luZm8oIlVua25vd24gVlJNIHZlcnNpb24gb2YgeW91ciBDUFVcbiIpOwogCXJldHVybiAwOwogfQogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2h3bW9uLmMgYi9kcml2ZXJzL2h3bW9uL2h3bW9uLmMKaW5kZXggMjllYTY3NS4uYTYxZTc4MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9od21vbi5jCisrKyBiL2RyaXZlcnMvaHdtb24vaHdtb24uYwpAQCAtMTAsNiArMTAsOCBAQAogICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZS4KICovCiAKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKwogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgpAQCAtMTE5LDcgKzEyMSw3IEBACiAKIAlod21vbl9jbGFzcyA9IGNsYXNzX2NyZWF0ZShUSElTX01PRFVMRSwgImh3bW9uIik7CiAJaWYgKElTX0VSUihod21vbl9jbGFzcykpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJod21vbi5jOiBjb3VsZG4ndCBjcmVhdGUgc3lzZnMgY2xhc3NcbiIpOworCQlwcl9lcnIoImNvdWxkbid0IGNyZWF0ZSBzeXNmcyBjbGFzc1xuIik7CiAJCXJldHVybiBQVFJfRVJSKGh3bW9uX2NsYXNzKTsKIAl9CiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2libWFlbS5jIGIvZHJpdmVycy9od21vbi9pYm1hZW0uYwppbmRleCBlYWVlNTQ2Li5iYzZlMmFiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL2libWFlbS5jCisrKyBiL2RyaXZlcnMvaHdtb24vaWJtYWVtLmMKQEAgLTIwLDYgKzIwLDggQEAKICAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKICAqLwogCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisKICNpbmNsdWRlIDxsaW51eC9pcG1pLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaHdtb24uaD4KQEAgLTEwOTAsNyArMTA5Miw3IEBACiAKIAlyZXMgPSBkcml2ZXJfcmVnaXN0ZXIoJmFlbV9kcml2ZXIuZHJpdmVyKTsKIAlpZiAocmVzKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiQ2FuJ3QgcmVnaXN0ZXIgYWVtIGRyaXZlclxuIik7CisJCXByX2VycigiQ2FuJ3QgcmVnaXN0ZXIgYWVtIGRyaXZlclxuIik7CiAJCXJldHVybiByZXM7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2xpczNsdjAyZC5jIGIvZHJpdmVycy9od21vbi9saXMzbHYwMmQuYwppbmRleCAwY2VlNzNhLi4xYjY3NGI3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL2xpczNsdjAyZC5jCisrKyBiL2RyaXZlcnMvaHdtb24vbGlzM2x2MDJkLmMKQEAgLTIwLDYgKzIwLDggQEAKICAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCiAgKi8KIAorI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2RtaS5oPgpAQCAtODYwLDggKzg2Miw3IEBACiAJCQkJCShwLT5pcnFfZmxhZ3MyICYgSVJRRl9UUklHR0VSX01BU0spLAogCQkJCQlEUklWRVJfTkFNRSwgJmxpczNfZGV2KTsKIAkJaWYgKGVyciA8IDApCi0JCQlwcmludGsoS0VSTl9FUlIgRFJJVkVSX05BTUUKLQkJCQkiTm8gc2Vjb25kIElSUS4gTGltaXRlZCBmdW5jdGlvbmFsaXR5XG4iKTsKKwkJCXByX2VycigiTm8gc2Vjb25kIElSUS4gTGltaXRlZCBmdW5jdGlvbmFsaXR5XG4iKTsKIAl9CiB9CiAKQEAgLTg3OSw3ICs4ODAsNyBAQAogCiAJc3dpdGNoIChkZXYtPndob2FtaSkgewogCWNhc2UgV0FJXzEyQjoKLQkJcHJpbnRrKEtFUk5fSU5GTyBEUklWRVJfTkFNRSAiOiAxMiBiaXRzIHNlbnNvciBmb3VuZFxuIik7CisJCXByX2luZm8oIjEyIGJpdHMgc2Vuc29yIGZvdW5kXG4iKTsKIAkJZGV2LT5yZWFkX2RhdGEgPSBsaXMzbHYwMmRfcmVhZF8xMjsKIAkJZGV2LT5tZHBzX21heF92YWwgPSAyMDQ4OwogCQlkZXYtPnB3cm9uX2RlbGF5ID0gTElTM19QV1JPTl9ERUxBWV9XQUlfMTJCOwpAQCAtODkwLDcgKzg5MSw3IEBACiAJCWRldi0+cmVnc19zaXplID0gQVJSQVlfU0laRShsaXMzX3dhaTEyX3JlZ3MpOwogCQlicmVhazsKIAljYXNlIFdBSV84QjoKLQkJcHJpbnRrKEtFUk5fSU5GTyBEUklWRVJfTkFNRSAiOiA4IGJpdHMgc2Vuc29yIGZvdW5kXG4iKTsKKwkJcHJfaW5mbygiOCBiaXRzIHNlbnNvciBmb3VuZFxuIik7CiAJCWRldi0+cmVhZF9kYXRhID0gbGlzM2x2MDJkX3JlYWRfODsKIAkJZGV2LT5tZHBzX21heF92YWwgPSAxMjg7CiAJCWRldi0+cHdyb25fZGVsYXkgPSBMSVMzX1BXUk9OX0RFTEFZX1dBSV84QjsKQEAgLTkwMSw3ICs5MDIsNyBAQAogCQlkZXYtPnJlZ3Nfc2l6ZSA9IEFSUkFZX1NJWkUobGlzM193YWk4X3JlZ3MpOwogCQlicmVhazsKIAljYXNlIFdBSV8zREM6Ci0JCXByaW50ayhLRVJOX0lORk8gRFJJVkVSX05BTUUgIjogOCBiaXRzIDNEQyBzZW5zb3IgZm91bmRcbiIpOworCQlwcl9pbmZvKCI4IGJpdHMgM0RDIHNlbnNvciBmb3VuZFxuIik7CiAJCWRldi0+cmVhZF9kYXRhID0gbGlzM2x2MDJkX3JlYWRfODsKIAkJZGV2LT5tZHBzX21heF92YWwgPSAxMjg7CiAJCWRldi0+cHdyb25fZGVsYXkgPSBMSVMzX1BXUk9OX0RFTEFZX1dBSV84QjsKQEAgLTkxMCw4ICs5MTEsNyBAQAogCQlkZXYtPnNjYWxlID0gTElTM19TRU5TSVRJVklUWV84QjsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJcHJpbnRrKEtFUk5fRVJSIERSSVZFUl9OQU1FCi0JCQkiOiB1bmtub3duIHNlbnNvciB0eXBlIDB4JVhcbiIsIGRldi0+d2hvYW1pKTsKKwkJcHJfZXJyKCJ1bmtub3duIHNlbnNvciB0eXBlIDB4JVhcbiIsIGRldi0+d2hvYW1pKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC05MzUsNyArOTM1LDcgQEAKIAl9CiAKIAlpZiAobGlzM2x2MDJkX2pveXN0aWNrX2VuYWJsZSgpKQotCQlwcmludGsoS0VSTl9FUlIgRFJJVkVSX05BTUUgIjogam95c3RpY2sgaW5pdGlhbGl6YXRpb24gZmFpbGVkXG4iKTsKKwkJcHJfZXJyKCJqb3lzdGljayBpbml0aWFsaXphdGlvbiBmYWlsZWRcbiIpOwogCiAJLyogcGFzc2luZyBpbiBwbGF0Zm9ybSBzcGVjaWZpYyBkYXRhIGlzIHB1cmVseSBvcHRpb25hbCBhbmQgb25seQogCSAqIHVzZWQgYnkgdGhlIFNQSSB0cmFuc3BvcnQgbGF5ZXIgYXQgdGhlIG1vbWVudCAqLwpAQCAtOTU3LDggKzk1Nyw3IEBACiAKIAkvKiBiYWlsIGlmIHdlIGRpZCBub3QgZ2V0IGFuIElSUSBmcm9tIHRoZSBidXMgbGF5ZXIgKi8KIAlpZiAoIWRldi0+aXJxKSB7Ci0JCXByaW50ayhLRVJOX0VSUiBEUklWRVJfTkFNRQotCQkJIjogTm8gSVJRLiBEaXNhYmxpbmcgL2Rldi9mcmVlZmFsbFxuIik7CisJCXByX2VycigiTm8gSVJRLiBEaXNhYmxpbmcgL2Rldi9mcmVlZmFsbFxuIik7CiAJCWdvdG8gb3V0OwogCX0KIApAQCAtOTg1LDEyICs5ODQsMTIgQEAKIAkJCQlEUklWRVJfTkFNRSwgJmxpczNfZGV2KTsKIAogCWlmIChlcnIgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiBEUklWRVJfTkFNRSAiQ2Fubm90IGdldCBJUlFcbiIpOworCQlwcl9lcnIoIkNhbm5vdCBnZXQgSVJRXG4iKTsKIAkJZ290byBvdXQ7CiAJfQogCiAJaWYgKG1pc2NfcmVnaXN0ZXIoJmxpczNsdjAyZF9taXNjX2RldmljZSkpCi0JCXByaW50ayhLRVJOX0VSUiBEUklWRVJfTkFNRSAiOiBtaXNjX3JlZ2lzdGVyIGZhaWxlZFxuIik7CisJCXByX2VycigibWlzY19yZWdpc3RlciBmYWlsZWRcbiIpOwogb3V0OgogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9sbTcwLmMgYi9kcml2ZXJzL2h3bW9uL2xtNzAuYwppbmRleCBmZDEwOGNmLi4zYjg0ZmI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL2xtNzAuYworKysgYi9kcml2ZXJzL2h3bW9uL2xtNzAuYwpAQCAtMjQsNiArMjQsOCBAQAogICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCiAgKi8KIAorI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgpAQCAtNjcsOCArNjksNyBAQAogCSAqLwogCXN0YXR1cyA9IHNwaV93cml0ZV90aGVuX3JlYWQoc3BpLCBOVUxMLCAwLCAmcnhidWZbMF0sIDIpOwogCWlmIChzdGF0dXMgPCAwKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcKLQkJInNwaV93cml0ZV90aGVuX3JlYWQgZmFpbGVkIHdpdGggc3RhdHVzICVkXG4iLCBzdGF0dXMpOworCQlwcl93YXJuKCJzcGlfd3JpdGVfdGhlbl9yZWFkIGZhaWxlZCB3aXRoIHN0YXR1cyAlZFxuIiwgc3RhdHVzKTsKIAkJZ290byBvdXQ7CiAJfQogCXJhdyA9IChyeGJ1ZlswXSA8PCA4KSArIHJ4YnVmWzFdOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9sbTk1MjQxLmMgYi9kcml2ZXJzL2h3bW9uL2xtOTUyNDEuYwppbmRleCA0NTQ2ZDgyLi4xYTZkZmI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL2xtOTUyNDEuYworKysgYi9kcml2ZXJzL2h3bW9uL2xtOTUyNDEuYwpAQCAtMSwxMyArMSw5IEBACiAvKgotICogbG05NTI0MS5jIC0gUGFydCBvZiBsbV9zZW5zb3JzLCBMaW51eCBrZXJuZWwgbW9kdWxlcyBmb3IgaGFyZHdhcmUKLSAqICAgICAgICAgICAgIG1vbml0b3JpbmcKLSAqIENvcHlyaWdodCAoQykgMjAwOCBEYXZpZGUgUml6em8gPGVscGEtcml6em9AZ21haWwuY29tPgorICogQ29weXJpZ2h0IChDKSAyMDA4LCAyMDEwIERhdmlkZSBSaXp6byA8ZWxwYS5yaXp6b0BnbWFpbC5jb20+CiAgKgotICogQmFzZWQgb24gdGhlIG1heDE2MTkgZHJpdmVyLiBUaGUgTE05NTI0MSBpcyBhIHNlbnNvciBjaGlwIG1hZGUgYnkgTmF0aW9uYWwKLSAqICAgU2VtaWNvbmR1Y3RvcnMuCi0gKiBJdCByZXBvcnRzIHVwIHRvIHRocmVlIHRlbXBlcmF0dXJlcyAoaXRzIG93biBwbHVzIHVwIHRvCi0gKiB0d28gZXh0ZXJuYWwgb25lcykuIENvbXBsZXRlIGRhdGFzaGVldCBjYW4gYmUKLSAqIG9idGFpbmVkIGZyb20gTmF0aW9uYWwncyB3ZWJzaXRlIGF0OgorICogVGhlIExNOTUyNDEgaXMgYSBzZW5zb3IgY2hpcCBtYWRlIGJ5IE5hdGlvbmFsIFNlbWljb25kdWN0b3JzLgorICogSXQgcmVwb3J0cyB1cCB0byB0aHJlZSB0ZW1wZXJhdHVyZXMgKGl0cyBvd24gcGx1cyB1cCB0byB0d28gZXh0ZXJuYWwgb25lcykuCisgKiBDb21wbGV0ZSBkYXRhc2hlZXQgY2FuIGJlIG9idGFpbmVkIGZyb20gTmF0aW9uYWwncyB3ZWJzaXRlIGF0OgogICogICBodHRwOi8vd3d3Lm5hdGlvbmFsLmNvbS9kcy5jZ2kvTE0vTE05NTI0MS5wZGYKICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQpAQCAtMzYsOCArMzIsMTAgQEAKICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+CiAKKyNkZWZpbmUgREVWTkFNRSAibG05NTI0MSIKKwogc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IG5vcm1hbF9pMmNbXSA9IHsKLQkweDE5LCAweDJhLCAweDJiLCBJMkNfQ0xJRU5UX0VORH07CisJMHgxOSwgMHgyYSwgMHgyYiwgSTJDX0NMSUVOVF9FTkQgfTsKIAogLyogTE05NTI0MSByZWdpc3RlcnMgKi8KICNkZWZpbmUgTE05NTI0MV9SRUdfUl9NQU5fSUQJCTB4RkUKQEAgLTQ2LDcgKzQ0LDcgQEAKICNkZWZpbmUgTE05NTI0MV9SRUdfUldfQ09ORklHCQkweDAzCiAjZGVmaW5lIExNOTUyNDFfUkVHX1JXX1JFTV9GSUxURVIJMHgwNgogI2RlZmluZSBMTTk1MjQxX1JFR19SV19UUlVUSEVSTQkJMHgwNwotI2RlZmluZSBMTTk1MjQxX1JFR19XX09ORV9TSE9UICAJMHgwRgorI2RlZmluZSBMTTk1MjQxX1JFR19XX09ORV9TSE9UCQkweDBGCiAjZGVmaW5lIExNOTUyNDFfUkVHX1JfTE9DQUxfVEVNUEgJMHgxMAogI2RlZmluZSBMTTk1MjQxX1JFR19SX1JFTU9URTFfVEVNUEgJMHgxMQogI2RlZmluZSBMTTk1MjQxX1JFR19SX1JFTU9URTJfVEVNUEgJMHgxMgpAQCAtNzksNTIgKzc3LDIwNSBAQAogI2RlZmluZSBNQU5VRkFDVFVSRVJfSUQgMHgwMQogI2RlZmluZSBERUZBVUxUX1JFVklTSU9OIDB4QTQKIAotLyogQ29udmVyc2lvbnMgYW5kIHZhcmlvdXMgbWFjcm9zICovCi0jZGVmaW5lIFRFTVBfRlJPTV9SRUcodmFsX2gsIHZhbF9sKSAoKCh2YWxfaCkgJiAweDgwID8gKHZhbF9oKSAtIDB4MTAwIDogXAotICAgICh2YWxfaCkpICogMTAwMCArICh2YWxfbCkgKiAxMDAwIC8gMjU2KQotCi0vKiBGdW5jdGlvbnMgZGVjbGFyYXRpb24gKi8KLXN0YXRpYyB2b2lkIGxtOTUyNDFfaW5pdF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCk7Ci1zdGF0aWMgc3RydWN0IGxtOTUyNDFfZGF0YSAqbG05NTI0MV91cGRhdGVfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldik7CitzdGF0aWMgY29uc3QgdTggbG05NTI0MV9yZWdfYWRkcmVzc1tdID0geworCUxNOTUyNDFfUkVHX1JfTE9DQUxfVEVNUEgsCisJTE05NTI0MV9SRUdfUl9MT0NBTF9URU1QTCwKKwlMTTk1MjQxX1JFR19SX1JFTU9URTFfVEVNUEgsCisJTE05NTI0MV9SRUdfUl9SRU1PVEUxX1RFTVBMLAorCUxNOTUyNDFfUkVHX1JfUkVNT1RFMl9URU1QSCwKKwlMTTk1MjQxX1JFR19SX1JFTU9URTJfVEVNUEwKK307CiAKIC8qIENsaWVudCBkYXRhIChlYWNoIGNsaWVudCBnZXRzIGl0cyBvd24pICovCiBzdHJ1Y3QgbG05NTI0MV9kYXRhIHsKIAlzdHJ1Y3QgZGV2aWNlICpod21vbl9kZXY7CiAJc3RydWN0IG11dGV4IHVwZGF0ZV9sb2NrOwotCXVuc2lnbmVkIGxvbmcgbGFzdF91cGRhdGVkLCBpbnRlcnZhbDsgLyogaW4gamlmZmllcyAqLwotCWNoYXIgdmFsaWQ7IC8qIHplcm8gdW50aWwgZm9sbG93aW5nIGZpZWxkcyBhcmUgdmFsaWQgKi8KKwl1bnNpZ25lZCBsb25nIGxhc3RfdXBkYXRlZCwgaW50ZXJ2YWw7CS8qIGluIGppZmZpZXMgKi8KKwljaGFyIHZhbGlkOwkJLyogemVybyB1bnRpbCBmb2xsb3dpbmcgZmllbGRzIGFyZSB2YWxpZCAqLwogCS8qIHJlZ2lzdGVycyB2YWx1ZXMgKi8KLQl1OCBsb2NhbF9oLCBsb2NhbF9sOyAvKiBsb2NhbCAqLwotCXU4IHJlbW90ZTFfaCwgcmVtb3RlMV9sOyAvKiByZW1vdGUxICovCi0JdTggcmVtb3RlMl9oLCByZW1vdGUyX2w7IC8qIHJlbW90ZTIgKi8KKwl1OCB0ZW1wW0FSUkFZX1NJWkUobG05NTI0MV9yZWdfYWRkcmVzcyldOwogCXU4IGNvbmZpZywgbW9kZWwsIHRydXRoZXJtOwogfTsKIAotLyogU3lzZnMgc3R1ZmYgKi8KLSNkZWZpbmUgc2hvd190ZW1wKHZhbHVlKSBcCi1zdGF0aWMgc3NpemVfdCBzaG93XyMjdmFsdWUoc3RydWN0IGRldmljZSAqZGV2LCBcCi0gICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikgXAoteyBcCi0Jc3RydWN0IGxtOTUyNDFfZGF0YSAqZGF0YSA9IGxtOTUyNDFfdXBkYXRlX2RldmljZShkZXYpOyBcCi0Jc25wcmludGYoYnVmLCBQQUdFX1NJWkUgLSAxLCAiJWRcbiIsIFwKLQkJVEVNUF9GUk9NX1JFRyhkYXRhLT52YWx1ZSMjX2gsIGRhdGEtPnZhbHVlIyNfbCkpOyBcCi0JcmV0dXJuIHN0cmxlbihidWYpOyBcCisvKiBDb252ZXJzaW9ucyAqLworc3RhdGljIGludCBUZW1wRnJvbVJlZyh1OCB2YWxfaCwgdTggdmFsX2wpCit7CisJaWYgKHZhbF9oICYgMHg4MCkKKwkJcmV0dXJuIHZhbF9oIC0gMHgxMDA7CisJcmV0dXJuIHZhbF9oICogMTAwMCArIHZhbF9sICogMTAwMCAvIDI1NjsKIH0KLXNob3dfdGVtcChsb2NhbCk7Ci1zaG93X3RlbXAocmVtb3RlMSk7Ci1zaG93X3RlbXAocmVtb3RlMik7CiAKLXN0YXRpYyBzc2l6ZV90IHNob3dfaW50ZXJ2YWwoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCSBjaGFyICpidWYpCitzdGF0aWMgc3RydWN0IGxtOTUyNDFfZGF0YSAqbG05NTI0MV91cGRhdGVfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCBsbTk1MjQxX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKworCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKworCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIGRhdGEtPmxhc3RfdXBkYXRlZCArIGRhdGEtPmludGVydmFsKSB8fAorCSAgICAhZGF0YS0+dmFsaWQpIHsKKwkJaW50IGk7CisKKwkJZGV2X2RiZygmY2xpZW50LT5kZXYsICJVcGRhdGluZyBsbTk1MjQxIGRhdGEuXG4iKTsKKwkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobG05NTI0MV9yZWdfYWRkcmVzcyk7IGkrKykKKwkJCWRhdGEtPnRlbXBbaV0KKwkJCSAgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LAorCQkJCQkJICAgICBsbTk1MjQxX3JlZ19hZGRyZXNzW2ldKTsKKwkJZGF0YS0+bGFzdF91cGRhdGVkID0gamlmZmllczsKKwkJZGF0YS0+dmFsaWQgPSAxOworCX0KKworCW11dGV4X3VubG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOworCisJcmV0dXJuIGRhdGE7Cit9CisKKy8qIFN5c2ZzIHN0dWZmICovCitzdGF0aWMgc3NpemVfdCBzaG93X2lucHV0KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgIGNoYXIgKmJ1ZikKIHsKIAlzdHJ1Y3QgbG05NTI0MV9kYXRhICpkYXRhID0gbG05NTI0MV91cGRhdGVfZGV2aWNlKGRldik7CiAKLQlzbnByaW50ZihidWYsIFBBR0VfU0laRSAtIDEsICIlbHVcbiIsIDEwMDAgKiBkYXRhLT5pbnRlcnZhbCAvIEhaKTsKLQlyZXR1cm4gc3RybGVuKGJ1Zik7CisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFIC0gMSwgIiVkXG4iLAorCQlUZW1wRnJvbVJlZyhkYXRhLT50ZW1wW3RvX3NlbnNvcl9kZXZfYXR0cihhdHRyKS0+aW5kZXhdLAorCQkJICAgIGRhdGEtPnRlbXBbdG9fc2Vuc29yX2Rldl9hdHRyKGF0dHIpLT5pbmRleCArIDFdKSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfdHlwZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCBsbTk1MjQxX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSAtIDEsCisJCWRhdGEtPm1vZGVsICYgdG9fc2Vuc29yX2Rldl9hdHRyKGF0dHIpLT5pbmRleCA/ICIxXG4iIDogIjJcbiIpOworfQorCitzdGF0aWMgc3NpemVfdCBzZXRfdHlwZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgbG05NTI0MV9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJdW5zaWduZWQgbG9uZyB2YWw7CisJaW50IHNoaWZ0OworCXU4IG1hc2sgPSB0b19zZW5zb3JfZGV2X2F0dHIoYXR0ciktPmluZGV4OworCisJaWYgKHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMTAsICZ2YWwpIDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKHZhbCAhPSAxICYmIHZhbCAhPSAyKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXNoaWZ0ID0gbWFzayA9PSBSMU1TX01BU0sgPyBUVDFfU0hJRlQgOiBUVDJfU0hJRlQ7CisKKwltdXRleF9sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwlkYXRhLT50cnV0aGVybSAmPSB+KFRUX01BU0sgPDwgc2hpZnQpOworCWlmICh2YWwgPT0gMSkgeworCQlkYXRhLT5tb2RlbCB8PSBtYXNrOworCQlkYXRhLT50cnV0aGVybSB8PSAoVFRfT04gPDwgc2hpZnQpOworCX0gZWxzZSB7CisJCWRhdGEtPm1vZGVsICY9IH5tYXNrOworCQlkYXRhLT50cnV0aGVybSB8PSAoVFRfT0ZGIDw8IHNoaWZ0KTsKKwl9CisJZGF0YS0+dmFsaWQgPSAwOworCisJaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIExNOTUyNDFfUkVHX1JXX1JFTU9URV9NT0RFTCwKKwkJCQkgIGRhdGEtPm1vZGVsKTsKKwlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgTE05NTI0MV9SRUdfUldfVFJVVEhFUk0sCisJCQkJICBkYXRhLT50cnV0aGVybSk7CisKKwltdXRleF91bmxvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHNzaXplX3Qgc2hvd19taW4oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCBsbTk1MjQxX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSAtIDEsCisJCQlkYXRhLT5jb25maWcgJiB0b19zZW5zb3JfZGV2X2F0dHIoYXR0ciktPmluZGV4ID8KKwkJCSItMTI3MDAwXG4iIDogIjBcbiIpOworfQorCitzdGF0aWMgc3NpemVfdCBzZXRfbWluKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCSAgICAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCBsbTk1MjQxX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlsb25nIHZhbDsKKworCWlmIChzdHJpY3Rfc3RydG9sKGJ1ZiwgMTAsICZ2YWwpIDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKHZhbCA8IC0xMjgwMDApCisJCXJldHVybiAtRUlOVkFMOworCisJbXV0ZXhfbG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOworCisJaWYgKHZhbCA8IDApCisJCWRhdGEtPmNvbmZpZyB8PSB0b19zZW5zb3JfZGV2X2F0dHIoYXR0ciktPmluZGV4OworCWVsc2UKKwkJZGF0YS0+Y29uZmlnICY9IH50b19zZW5zb3JfZGV2X2F0dHIoYXR0ciktPmluZGV4OworCWRhdGEtPnZhbGlkID0gMDsKKworCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBMTTk1MjQxX1JFR19SV19DT05GSUcsIGRhdGEtPmNvbmZpZyk7CisKKwltdXRleF91bmxvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHNzaXplX3Qgc2hvd19tYXgoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCBsbTk1MjQxX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSAtIDEsCisJCQlkYXRhLT5jb25maWcgJiB0b19zZW5zb3JfZGV2X2F0dHIoYXR0ciktPmluZGV4ID8KKwkJCSIxMjcwMDBcbiIgOiAiMjU1MDAwXG4iKTsKK30KKworc3RhdGljIHNzaXplX3Qgc2V0X21heChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkgICAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgbG05NTI0MV9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJbG9uZyB2YWw7CisKKwlpZiAoc3RyaWN0X3N0cnRvbChidWYsIDEwLCAmdmFsKSA8IDApCisJCXJldHVybiAtRUlOVkFMOworCWlmICh2YWwgPj0gMjU2MDAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKworCWlmICh2YWwgPD0gMTI3MDAwKQorCQlkYXRhLT5jb25maWcgfD0gdG9fc2Vuc29yX2Rldl9hdHRyKGF0dHIpLT5pbmRleDsKKwllbHNlCisJCWRhdGEtPmNvbmZpZyAmPSB+dG9fc2Vuc29yX2Rldl9hdHRyKGF0dHIpLT5pbmRleDsKKwlkYXRhLT52YWxpZCA9IDA7CisKKwlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgTE05NTI0MV9SRUdfUldfQ09ORklHLCBkYXRhLT5jb25maWcpOworCisJbXV0ZXhfdW5sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfaW50ZXJ2YWwoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgICAgY2hhciAqYnVmKQoreworCXN0cnVjdCBsbTk1MjQxX2RhdGEgKmRhdGEgPSBsbTk1MjQxX3VwZGF0ZV9kZXZpY2UoZGV2KTsKKworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSAtIDEsICIlbHVcbiIsIDEwMDAgKiBkYXRhLT5pbnRlcnZhbAorCQkJLyBIWik7CiB9CiAKIHN0YXRpYyBzc2l6ZV90IHNldF9pbnRlcnZhbChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCisJCQkgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7CiAJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKIAlzdHJ1Y3QgbG05NTI0MV9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CkBAIC0xMzgsMTc2ICsyODksMzQgQEAKIAlyZXR1cm4gY291bnQ7CiB9CiAKLSNkZWZpbmUgc2hvd190eXBlKGZsYWcpIFwKLXN0YXRpYyBzc2l6ZV90IHNob3dfdHlwZSMjZmxhZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIFwKLQkJCQkgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKSBcCi17IFwKLQlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOyBcCi0Jc3RydWN0IGxtOTUyNDFfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOyBcCi1cCi0Jc25wcmludGYoYnVmLCBQQUdFX1NJWkUgLSAxLCBcCi0JCWRhdGEtPm1vZGVsICYgUiMjZmxhZyMjTVNfTUFTSyA/ICIxXG4iIDogIjJcbiIpOyBcCi0JcmV0dXJuIHN0cmxlbihidWYpOyBcCi19Ci1zaG93X3R5cGUoMSk7Ci1zaG93X3R5cGUoMik7Ci0KLSNkZWZpbmUgc2hvd19taW4oZmxhZykgXAotc3RhdGljIHNzaXplX3Qgc2hvd19taW4jI2ZsYWcoc3RydWN0IGRldmljZSAqZGV2LCBcCi0gICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikgXAoteyBcCi0Jc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsgXAotCXN0cnVjdCBsbTk1MjQxX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsgXAotXAotCXNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFIC0gMSwgXAotCQlkYXRhLT5jb25maWcgJiBSIyNmbGFnIyNERl9NQVNLID8JXAotCQkiLTEyNzAwMFxuIiA6ICIwXG4iKTsgXAotCXJldHVybiBzdHJsZW4oYnVmKTsgXAotfQotc2hvd19taW4oMSk7Ci1zaG93X21pbigyKTsKLQotI2RlZmluZSBzaG93X21heChmbGFnKSBcCi1zdGF0aWMgc3NpemVfdCBzaG93X21heCMjZmxhZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIFwKLSAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKSBcCi17IFwKLQlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOyBcCi0Jc3RydWN0IGxtOTUyNDFfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOyBcCi1cCi0Jc25wcmludGYoYnVmLCBQQUdFX1NJWkUgLSAxLCBcCi0JCWRhdGEtPmNvbmZpZyAmIFIjI2ZsYWcjI0RGX01BU0sgPyBcCi0JCSIxMjcwMDBcbiIgOiAiMjU1MDAwXG4iKTsgXAotCXJldHVybiBzdHJsZW4oYnVmKTsgXAotfQotc2hvd19tYXgoMSk7Ci1zaG93X21heCgyKTsKLQotI2RlZmluZSBzZXRfdHlwZShmbGFnKSBcCi1zdGF0aWMgc3NpemVfdCBzZXRfdHlwZSMjZmxhZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIFwKLQkJCQkgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBcCi0JCQkJICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkgXAoteyBcCi0Jc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsgXAotCXN0cnVjdCBsbTk1MjQxX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsgXAotXAotCWxvbmcgdmFsOyBcCi1cCi0JaWYgKHN0cmljdF9zdHJ0b2woYnVmLCAxMCwgJnZhbCkgPCAwKSBcCi0JCXJldHVybiAtRUlOVkFMOyBcCi1cCi0JaWYgKCh2YWwgPT0gMSkgfHwgKHZhbCA9PSAyKSkgeyBcCi1cCi0JCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsgXAotXAotCQlkYXRhLT50cnV0aGVybSAmPSB+KFRUX01BU0sgPDwgVFQjI2ZsYWcjI19TSElGVCk7IFwKLQkJaWYgKHZhbCA9PSAxKSB7IFwKLQkJCWRhdGEtPm1vZGVsIHw9IFIjI2ZsYWcjI01TX01BU0s7IFwKLQkJCWRhdGEtPnRydXRoZXJtIHw9IChUVF9PTiA8PCBUVCMjZmxhZyMjX1NISUZUKTsgXAotCQl9IFwKLQkJZWxzZSB7IFwKLQkJCWRhdGEtPm1vZGVsICY9IH5SIyNmbGFnIyNNU19NQVNLOyBcCi0JCQlkYXRhLT50cnV0aGVybSB8PSAoVFRfT0ZGIDw8IFRUIyNmbGFnIyNfU0hJRlQpOyBcCi0JCX0gXAotXAotCQlkYXRhLT52YWxpZCA9IDA7IFwKLVwKLQkJaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIExNOTUyNDFfUkVHX1JXX1JFTU9URV9NT0RFTCwgXAotCQkJCQkgIGRhdGEtPm1vZGVsKTsgXAotCQlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgTE05NTI0MV9SRUdfUldfVFJVVEhFUk0sIFwKLQkJCQkJICBkYXRhLT50cnV0aGVybSk7IFwKLVwKLQkJbXV0ZXhfdW5sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7IFwKLVwKLQl9IFwKLQlyZXR1cm4gY291bnQ7IFwKLX0KLXNldF90eXBlKDEpOwotc2V0X3R5cGUoMik7Ci0KLSNkZWZpbmUgc2V0X21pbihmbGFnKSBcCi1zdGF0aWMgc3NpemVfdCBzZXRfbWluIyNmbGFnKHN0cnVjdCBkZXZpY2UgKmRldiwgXAotCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZhdHRyLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkgXAoteyBcCi0Jc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsgXAotCXN0cnVjdCBsbTk1MjQxX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsgXAotXAotCWxvbmcgdmFsOyBcCi1cCi0JaWYgKHN0cmljdF9zdHJ0b2woYnVmLCAxMCwgJnZhbCkgPCAwKSBcCi0JCXJldHVybiAtRUlOVkFMO1wKLVwKLQltdXRleF9sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7IFwKLVwKLQlpZiAodmFsIDwgMCkgXAotCQlkYXRhLT5jb25maWcgfD0gUiMjZmxhZyMjREZfTUFTSzsgXAotCWVsc2UgXAotCQlkYXRhLT5jb25maWcgJj0gflIjI2ZsYWcjI0RGX01BU0s7IFwKLVwKLQlkYXRhLT52YWxpZCA9IDA7IFwKLVwKLQlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgTE05NTI0MV9SRUdfUldfQ09ORklHLCBcCi0JCWRhdGEtPmNvbmZpZyk7IFwKLVwKLQltdXRleF91bmxvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsgXAotXAotCXJldHVybiBjb3VudDsgXAotfQotc2V0X21pbigxKTsKLXNldF9taW4oMik7Ci0KLSNkZWZpbmUgc2V0X21heChmbGFnKSBcCi1zdGF0aWMgc3NpemVfdCBzZXRfbWF4IyNmbGFnKHN0cnVjdCBkZXZpY2UgKmRldiwgXAotCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZhdHRyLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkgXAoteyBcCi0Jc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsgXAotCXN0cnVjdCBsbTk1MjQxX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsgXAotXAotCWxvbmcgdmFsOyBcCi1cCi0JaWYgKHN0cmljdF9zdHJ0b2woYnVmLCAxMCwgJnZhbCkgPCAwKSBcCi0JCXJldHVybiAtRUlOVkFMOyBcCi1cCi0JbXV0ZXhfbG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOyBcCi1cCi0JaWYgKHZhbCA8PSAxMjcwMDApIFwKLQkJZGF0YS0+Y29uZmlnIHw9IFIjI2ZsYWcjI0RGX01BU0s7IFwKLQllbHNlIFwKLQkJZGF0YS0+Y29uZmlnICY9IH5SIyNmbGFnIyNERl9NQVNLOyBcCi1cCi0JZGF0YS0+dmFsaWQgPSAwOyBcCi1cCi0JaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIExNOTUyNDFfUkVHX1JXX0NPTkZJRywgXAotCQlkYXRhLT5jb25maWcpOyBcCi1cCi0JbXV0ZXhfdW5sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7IFwKLVwKLQlyZXR1cm4gY291bnQ7IFwKLX0KLXNldF9tYXgoMSk7Ci1zZXRfbWF4KDIpOwotCi1zdGF0aWMgREVWSUNFX0FUVFIodGVtcDFfaW5wdXQsIFNfSVJVR08sIHNob3dfbG9jYWwsIE5VTEwpOwotc3RhdGljIERFVklDRV9BVFRSKHRlbXAyX2lucHV0LCBTX0lSVUdPLCBzaG93X3JlbW90ZTEsIE5VTEwpOwotc3RhdGljIERFVklDRV9BVFRSKHRlbXAzX2lucHV0LCBTX0lSVUdPLCBzaG93X3JlbW90ZTIsIE5VTEwpOwotc3RhdGljIERFVklDRV9BVFRSKHRlbXAyX3R5cGUsIFNfSVdVU1IgfCBTX0lSVUdPLCBzaG93X3R5cGUxLCBzZXRfdHlwZTEpOwotc3RhdGljIERFVklDRV9BVFRSKHRlbXAzX3R5cGUsIFNfSVdVU1IgfCBTX0lSVUdPLCBzaG93X3R5cGUyLCBzZXRfdHlwZTIpOwotc3RhdGljIERFVklDRV9BVFRSKHRlbXAyX21pbiwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfbWluMSwgc2V0X21pbjEpOwotc3RhdGljIERFVklDRV9BVFRSKHRlbXAzX21pbiwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfbWluMiwgc2V0X21pbjIpOwotc3RhdGljIERFVklDRV9BVFRSKHRlbXAyX21heCwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfbWF4MSwgc2V0X21heDEpOwotc3RhdGljIERFVklDRV9BVFRSKHRlbXAzX21heCwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfbWF4Miwgc2V0X21heDIpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMV9pbnB1dCwgU19JUlVHTywgc2hvd19pbnB1dCwgTlVMTCwgMCk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAyX2lucHV0LCBTX0lSVUdPLCBzaG93X2lucHV0LCBOVUxMLCAyKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDNfaW5wdXQsIFNfSVJVR08sIHNob3dfaW5wdXQsIE5VTEwsIDQpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMl90eXBlLCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd190eXBlLCBzZXRfdHlwZSwKKwkJCSAgUjFNU19NQVNLKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDNfdHlwZSwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfdHlwZSwgc2V0X3R5cGUsCisJCQkgIFIyTVNfTUFTSyk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAyX21pbiwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfbWluLCBzZXRfbWluLAorCQkJICBSMURGX01BU0spOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wM19taW4sIFNfSVdVU1IgfCBTX0lSVUdPLCBzaG93X21pbiwgc2V0X21pbiwKKwkJCSAgUjJERl9NQVNLKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDJfbWF4LCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd19tYXgsIHNldF9tYXgsCisJCQkgIFIxREZfTUFTSyk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAzX21heCwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfbWF4LCBzZXRfbWF4LAorCQkJICBSMkRGX01BU0spOwogc3RhdGljIERFVklDRV9BVFRSKHVwZGF0ZV9pbnRlcnZhbCwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfaW50ZXJ2YWwsCiAJCSAgIHNldF9pbnRlcnZhbCk7CiAKIHN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpsbTk1MjQxX2F0dHJpYnV0ZXNbXSA9IHsKLQkmZGV2X2F0dHJfdGVtcDFfaW5wdXQuYXR0ciwKLQkmZGV2X2F0dHJfdGVtcDJfaW5wdXQuYXR0ciwKLQkmZGV2X2F0dHJfdGVtcDNfaW5wdXQuYXR0ciwKLQkmZGV2X2F0dHJfdGVtcDJfdHlwZS5hdHRyLAotCSZkZXZfYXR0cl90ZW1wM190eXBlLmF0dHIsCi0JJmRldl9hdHRyX3RlbXAyX21pbi5hdHRyLAotCSZkZXZfYXR0cl90ZW1wM19taW4uYXR0ciwKLQkmZGV2X2F0dHJfdGVtcDJfbWF4LmF0dHIsCi0JJmRldl9hdHRyX3RlbXAzX21heC5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDFfaW5wdXQuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX3RlbXAyX2lucHV0LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl90ZW1wM19pbnB1dC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDJfdHlwZS5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDNfdHlwZS5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDJfbWluLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl90ZW1wM19taW4uZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX3RlbXAyX21heC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDNfbWF4LmRldl9hdHRyLmF0dHIsCiAJJmRldl9hdHRyX3VwZGF0ZV9pbnRlcnZhbC5hdHRyLAogCU5VTEwKIH07CkBAIC0zMjksOSArMzM4LDkgQEAKIAogCWlmICgoaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKG5ld19jbGllbnQsIExNOTUyNDFfUkVHX1JfTUFOX0lEKQogCSAgICAgPT0gTUFOVUZBQ1RVUkVSX0lEKQotCSAmJiAoaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKG5ld19jbGllbnQsIExNOTUyNDFfUkVHX1JfQ0hJUF9JRCkKLQkgICAgID49IERFRkFVTFRfUkVWSVNJT04pKSB7Ci0JCW5hbWUgPSAibG05NTI0MSI7CisJICAgICYmIChpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEobmV3X2NsaWVudCwgTE05NTI0MV9SRUdfUl9DSElQX0lEKQorCQk+PSBERUZBVUxUX1JFVklTSU9OKSkgeworCQluYW1lID0gREVWTkFNRTsKIAl9IGVsc2UgewogCQlkZXZfZGJnKCZhZGFwdGVyLT5kZXYsICJMTTk1MjQxIGRldGVjdGlvbiBmYWlsZWQgYXQgMHglMDJ4XG4iLAogCQkJYWRkcmVzcyk7CkBAIC0zNDMsNiArMzUyLDI1IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyB2b2lkIGxtOTUyNDFfaW5pdF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlzdHJ1Y3QgbG05NTI0MV9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisKKwlkYXRhLT5pbnRlcnZhbCA9IEhaOwkvKiAxIHNlYyBkZWZhdWx0ICovCisJZGF0YS0+dmFsaWQgPSAwOworCWRhdGEtPmNvbmZpZyA9IENGR19DUjAwNzY7CisJZGF0YS0+bW9kZWwgPSAwOworCWRhdGEtPnRydXRoZXJtID0gKFRUX09GRiA8PCBUVDFfU0hJRlQpIHwgKFRUX09GRiA8PCBUVDJfU0hJRlQpOworCisJaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIExNOTUyNDFfUkVHX1JXX0NPTkZJRywgZGF0YS0+Y29uZmlnKTsKKwlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgTE05NTI0MV9SRUdfUldfUkVNX0ZJTFRFUiwKKwkJCQkgIFIxRkVfTUFTSyB8IFIyRkVfTUFTSyk7CisJaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIExNOTUyNDFfUkVHX1JXX1RSVVRIRVJNLAorCQkJCSAgZGF0YS0+dHJ1dGhlcm0pOworCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBMTTk1MjQxX1JFR19SV19SRU1PVEVfTU9ERUwsCisJCQkJICBkYXRhLT5tb2RlbCk7Cit9CisKIHN0YXRpYyBpbnQgbG05NTI0MV9wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqbmV3X2NsaWVudCwKIAkJCSBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCiB7CkBAIC0zODIsMjYgKzQxMCw2IEBACiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIHZvaWQgbG05NTI0MV9pbml0X2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQotewotCXN0cnVjdCBsbTk1MjQxX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKLQotCWRhdGEtPmludGVydmFsID0gSFo7ICAgIC8qIDEgc2VjIGRlZmF1bHQgKi8KLQlkYXRhLT52YWxpZCA9IDA7Ci0JZGF0YS0+Y29uZmlnID0gQ0ZHX0NSMDA3NjsKLQlkYXRhLT5tb2RlbCA9IDA7Ci0JZGF0YS0+dHJ1dGhlcm0gPSAoVFRfT0ZGIDw8IFRUMV9TSElGVCkgfCAoVFRfT0ZGIDw8IFRUMl9TSElGVCk7Ci0KLQlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgTE05NTI0MV9SRUdfUldfQ09ORklHLAotCQkJCSAgZGF0YS0+Y29uZmlnKTsKLQlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgTE05NTI0MV9SRUdfUldfUkVNX0ZJTFRFUiwKLQkJCQkgIFIxRkVfTUFTSyB8IFIyRkVfTUFTSyk7Ci0JaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIExNOTUyNDFfUkVHX1JXX1RSVVRIRVJNLAotCQkJCSAgZGF0YS0+dHJ1dGhlcm0pOwotCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBMTTk1MjQxX1JFR19SV19SRU1PVEVfTU9ERUwsCi0JCQkJICBkYXRhLT5tb2RlbCk7Ci19Ci0KIHN0YXRpYyBpbnQgbG05NTI0MV9yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKIHsKIAlzdHJ1Y3QgbG05NTI0MV9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CkBAIC00MTMsNDYgKzQyMSw5IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgbG05NTI0MV9kYXRhICpsbTk1MjQxX3VwZGF0ZV9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2KQotewotCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7Ci0Jc3RydWN0IGxtOTUyNDFfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwotCi0JbXV0ZXhfbG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOwotCi0JaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgZGF0YS0+bGFzdF91cGRhdGVkICsgZGF0YS0+aW50ZXJ2YWwpIHx8Ci0JICAgICFkYXRhLT52YWxpZCkgewotCQlkZXZfZGJnKCZjbGllbnQtPmRldiwgIlVwZGF0aW5nIGxtOTUyNDEgZGF0YS5cbiIpOwotCQlkYXRhLT5sb2NhbF9oID0KLQkJCWkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsCi0JCQkJCQkgTE05NTI0MV9SRUdfUl9MT0NBTF9URU1QSCk7Ci0JCWRhdGEtPmxvY2FsX2wgPQotCQkJaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwKLQkJCQkJCSBMTTk1MjQxX1JFR19SX0xPQ0FMX1RFTVBMKTsKLQkJZGF0YS0+cmVtb3RlMV9oID0KLQkJCWkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsCi0JCQkJCQkgTE05NTI0MV9SRUdfUl9SRU1PVEUxX1RFTVBIKTsKLQkJZGF0YS0+cmVtb3RlMV9sID0KLQkJCWkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsCi0JCQkJCQkgTE05NTI0MV9SRUdfUl9SRU1PVEUxX1RFTVBMKTsKLQkJZGF0YS0+cmVtb3RlMl9oID0KLQkJCWkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsCi0JCQkJCQkgTE05NTI0MV9SRUdfUl9SRU1PVEUyX1RFTVBIKTsKLQkJZGF0YS0+cmVtb3RlMl9sID0KLQkJCWkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsCi0JCQkJCQkgTE05NTI0MV9SRUdfUl9SRU1PVEUyX1RFTVBMKTsKLQkJZGF0YS0+bGFzdF91cGRhdGVkID0gamlmZmllczsKLQkJZGF0YS0+dmFsaWQgPSAxOwotCX0KLQotCW11dGV4X3VubG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOwotCi0JcmV0dXJuIGRhdGE7Ci19Ci0KIC8qIERyaXZlciBkYXRhIChjb21tb24gdG8gYWxsIGNsaWVudHMpICovCiBzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgbG05NTI0MV9pZFtdID0gewotCXsgImxtOTUyNDEiLCAwIH0sCisJeyBERVZOQU1FLCAwIH0sCiAJeyB9CiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIGxtOTUyNDFfaWQpOwpAQCAtNDYwLDcgKzQzMSw3IEBACiBzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgbG05NTI0MV9kcml2ZXIgPSB7CiAJLmNsYXNzCQk9IEkyQ19DTEFTU19IV01PTiwKIAkuZHJpdmVyID0gewotCQkubmFtZSAgID0gImxtOTUyNDEiLAorCQkubmFtZQk9IERFVk5BTUUsCiAJfSwKIAkucHJvYmUJCT0gbG05NTI0MV9wcm9iZSwKIAkucmVtb3ZlCQk9IGxtOTUyNDFfcmVtb3ZlLApAQCAtNDc5LDcgKzQ1MCw3IEBACiAJaTJjX2RlbF9kcml2ZXIoJmxtOTUyNDFfZHJpdmVyKTsKIH0KIAotTU9EVUxFX0FVVEhPUigiRGF2aWRlIFJpenpvIDxlbHBhLXJpenpvQGdtYWlsLmNvbT4iKTsKK01PRFVMRV9BVVRIT1IoIkRhdmlkZSBSaXp6byA8ZWxwYS5yaXp6b0BnbWFpbC5jb20+Iik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIkxNOTUyNDEgc2Vuc29yIGRyaXZlciIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL3BjZjg1OTEuYyBiL2RyaXZlcnMvaHdtb24vcGNmODU5MS5jCmluZGV4IGRjNzI1OWQuLjczMWIwOWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vcGNmODU5MS5jCisrKyBiL2RyaXZlcnMvaHdtb24vcGNmODU5MS5jCkBAIC0xOCw2ICsxOCw4IEBACiAgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCiAqLwogCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgpAQCAtMjkwLDggKzI5Miw3IEBACiBzdGF0aWMgaW50IF9faW5pdCBwY2Y4NTkxX2luaXQodm9pZCkKIHsKIAlpZiAoaW5wdXRfbW9kZSA8IDAgfHwgaW5wdXRfbW9kZSA+IDMpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAicGNmODU5MTogaW52YWxpZCBpbnB1dF9tb2RlICglZClcbiIsCi0JCSAgICAgICBpbnB1dF9tb2RlKTsKKwkJcHJfd2FybigiaW52YWxpZCBpbnB1dF9tb2RlICglZClcbiIsIGlucHV0X21vZGUpOwogCQlpbnB1dF9tb2RlID0gMDsKIAl9CiAJcmV0dXJuIGkyY19hZGRfZHJpdmVyKCZwY2Y4NTkxX2RyaXZlcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL3BrZ3RlbXAuYyBiL2RyaXZlcnMvaHdtb24vcGtndGVtcC5jCmluZGV4IDA3OTgyMTAuLjIxYzgxN2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vcGtndGVtcC5jCisrKyBiL2RyaXZlcnMvaHdtb24vcGtndGVtcC5jCkBAIC0yMCw2ICsyMCw4IEBACiAgKiAwMjExMC0xMzAxIFVTQS4KICAqLwogCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgpAQCAtMzAzLDcgKzMwNSw3IEBACiAJcGRldiA9IHBsYXRmb3JtX2RldmljZV9hbGxvYyhEUlZOQU1FLCBjcHUpOwogCWlmICghcGRldikgewogCQllcnIgPSAtRU5PTUVNOwotCQlwcmludGsoS0VSTl9FUlIgRFJWTkFNRSAiOiBEZXZpY2UgYWxsb2NhdGlvbiBmYWlsZWRcbiIpOworCQlwcl9lcnIoIkRldmljZSBhbGxvY2F0aW9uIGZhaWxlZFxuIik7CiAJCWdvdG8gZXhpdDsKIAl9CiAKQEAgLTMxNSw4ICszMTcsNyBAQAogCiAJZXJyID0gcGxhdGZvcm1fZGV2aWNlX2FkZChwZGV2KTsKIAlpZiAoZXJyKSB7Ci0JCXByaW50ayhLRVJOX0VSUiBEUlZOQU1FICI6IERldmljZSBhZGRpdGlvbiBmYWlsZWQgKCVkKVxuIiwKLQkJICAgICAgIGVycik7CisJCXByX2VycigiRGV2aWNlIGFkZGl0aW9uIGZhaWxlZCAoJWQpXG4iLCBlcnIpOwogCQlnb3RvIGV4aXRfZGV2aWNlX2ZyZWU7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL3NodDIxLmMgYi9kcml2ZXJzL2h3bW9uL3NodDIxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWM4Yzk4MQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaHdtb24vc2h0MjEuYwpAQCAtMCwwICsxLDMwNyBAQAorLyogU2Vuc2lyaW9uIFNIVDIxIGh1bWlkaXR5IGFuZCB0ZW1wZXJhdHVyZSBzZW5zb3IgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFVycyBGbGVpc2NoIDx1cnMuZmxlaXNjaEBzZW5zaXJpb24uY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0IC0gRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqCisgKiBEYXRhIHNoZWV0IGF2YWlsYWJsZSAoNS8yMDEwKSBhdAorICogaHR0cDovL3d3dy5zZW5zaXJpb24uY29tL2VuL3BkZi9wcm9kdWN0X2luZm9ybWF0aW9uL0RhdGFzaGVldC1odW1pZGl0eS1zZW5zb3ItU0hUMjEucGRmCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvaHdtb24uaD4KKyNpbmNsdWRlIDxsaW51eC9od21vbi1zeXNmcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisKKy8qIEkyQyBjb21tYW5kIGJ5dGVzICovCisjZGVmaW5lIFNIVDIxX1RSSUdfVF9NRUFTVVJFTUVOVF9ITSAgMHhlMworI2RlZmluZSBTSFQyMV9UUklHX1JIX01FQVNVUkVNRU5UX0hNIDB4ZTUKKworLyoqCisgKiBzdHJ1Y3Qgc2h0MjEgLSBTSFQyMSBkZXZpY2Ugc3BlY2lmaWMgZGF0YQorICogQGh3bW9uX2RldjogZGV2aWNlIHJlZ2lzdGVyZWQgd2l0aCBod21vbgorICogQGxvY2s6IG11dGV4IHRvIHByb3RlY3QgbWVhc3VyZW1lbnQgdmFsdWVzCisgKiBAdmFsaWQ6IG9ubHkgMCBiZWZvcmUgZmlyc3QgbWVhc3VyZW1lbnQgaXMgdGFrZW4KKyAqIEBsYXN0X3VwZGF0ZTogdGltZSBvZiBsYXN0IHVwZGF0ZSAoamlmZmllcykKKyAqIEB0ZW1wZXJhdHVyZTogY2FjaGVkIHRlbXBlcmF0dXJlIG1lYXN1cmVtZW50IHZhbHVlCisgKiBAaHVtaWRpdHk6IGNhY2hlZCBodW1pZGl0eSBtZWFzdXJlbWVudCB2YWx1ZQorICovCitzdHJ1Y3Qgc2h0MjEgeworCXN0cnVjdCBkZXZpY2UgKmh3bW9uX2RldjsKKwlzdHJ1Y3QgbXV0ZXggbG9jazsKKwljaGFyIHZhbGlkOworCXVuc2lnbmVkIGxvbmcgbGFzdF91cGRhdGU7CisJaW50IHRlbXBlcmF0dXJlOworCWludCBodW1pZGl0eTsKK307CisKKy8qKgorICogc2h0MjFfdGVtcF90aWNrc190b19taWxsaWNlbHNpdXMoKSAtIGNvbnZlcnQgcmF3IHRlbXBlcmF0dXJlIHRpY2tzIHRvCisgKiBtaWxsaSBjZWxzaXVzCisgKiBAdGlja3M6IHRlbXBlcmF0dXJlIHRpY2tzIHZhbHVlIHJlY2VpdmVkIGZyb20gc2Vuc29yCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHNodDIxX3RlbXBfdGlja3NfdG9fbWlsbGljZWxzaXVzKGludCB0aWNrcykKK3sKKwl0aWNrcyAmPSB+MHgwMDAzOyAvKiBjbGVhciBzdGF0dXMgYml0cyAqLworCS8qCisJICogRm9ybXVsYSBUID0gLTQ2Ljg1ICsgMTc1LjcyICogU1QgLyAyXjE2IGZyb20gZGF0YSBzaGVldCA2LjIsCisJICogb3B0aW1pemVkIGZvciBpbnRlZ2VyIGZpeGVkIHBvaW50ICgzIGRpZ2l0cykgYXJpdGhtZXRpYworCSAqLworCXJldHVybiAoKDIxOTY1ICogdGlja3MpID4+IDEzKSAtIDQ2ODUwOworfQorCisvKioKKyAqIHNodDIxX3JoX3RpY2tzX3RvX3Blcl9jZW50X21pbGxlKCkgLSBjb252ZXJ0IHJhdyBodW1pZGl0eSB0aWNrcyB0bworICogb25lLXRob3VzYW5kdGhzIG9mIGEgcGVyY2VudCByZWxhdGl2ZSBodW1pZGl0eQorICogQHRpY2tzOiBodW1pZGl0eSB0aWNrcyB2YWx1ZSByZWNlaXZlZCBmcm9tIHNlbnNvcgorICovCitzdGF0aWMgaW5saW5lIGludCBzaHQyMV9yaF90aWNrc190b19wZXJfY2VudF9taWxsZShpbnQgdGlja3MpCit7CisJdGlja3MgJj0gfjB4MDAwMzsgLyogY2xlYXIgc3RhdHVzIGJpdHMgKi8KKwkvKgorCSAqIEZvcm11bGEgUkggPSAtNiArIDEyNSAqIFNSSCAvIDJeMTYgZnJvbSBkYXRhIHNoZWV0IDYuMSwKKwkgKiBvcHRpbWl6ZWQgZm9yIGludGVnZXIgZml4ZWQgcG9pbnQgKDMgZGlnaXRzKSBhcml0aG1ldGljCisJICovCisJcmV0dXJuICgoMTU2MjUgKiB0aWNrcykgPj4gMTMpIC0gNjAwMDsKK30KKworLyoqCisgKiBzaHQyMV9yZWFkX3dvcmRfZGF0YSgpIC0gcmVhZCB3b3JkIGZyb20gcmVnaXN0ZXIKKyAqIEBjbGllbnQ6IEkyQyBjbGllbnQgZGV2aWNlCisgKiBAcmVnOiBJMkMgY29tbWFuZCBieXRlCisgKgorICogUmV0dXJucyB2YWx1ZSwgbmVnYXRpdmUgZXJybm8gb24gZXJyb3IuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHNodDIxX3JlYWRfd29yZF9kYXRhKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IHJlZykKK3sKKwlpbnQgcmV0ID0gaTJjX3NtYnVzX3JlYWRfd29yZF9kYXRhKGNsaWVudCwgcmVnKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwkvKgorCSAqIFNNQnVzIHNwZWNpZmllcyBsb3cgYnl0ZSBmaXJzdCwgYnV0IHRoZSBTSFQyMSByZXR1cm5zIE1TQgorCSAqIGZpcnN0LCBzbyB3ZSBoYXZlIHRvIHN3YWIxNiB0aGUgdmFsdWVzCisJICovCisJcmV0dXJuIHN3YWIxNihyZXQpOworfQorCisvKioKKyAqIHNodDIxX3VwZGF0ZV9tZWFzdXJlbWVudHMoKSAtIGdldCB1cGRhdGVkIG1lYXN1cmVtZW50cyBmcm9tIGRldmljZQorICogQGNsaWVudDogSTJDIGNsaWVudCBkZXZpY2UKKyAqCisgKiBSZXR1cm5zIDAgb24gc3VjY2VzcywgZWxzZSBuZWdhdGl2ZSBlcnJuby4KKyAqLworc3RhdGljIGludCBzaHQyMV91cGRhdGVfbWVhc3VyZW1lbnRzKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IHNodDIxICpzaHQyMSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCisJbXV0ZXhfbG9jaygmc2h0MjEtPmxvY2spOworCS8qCisJICogRGF0YSBzaGVldCAyLjQ6CisJICogU0hUMnggc2hvdWxkIG5vdCBiZSBhY3RpdmUgZm9yIG1vcmUgdGhhbiAxMCUgb2YgdGhlIHRpbWUgLSBlLmcuCisJICogbWF4aW11bSB0d28gbWVhc3VyZW1lbnRzIHBlciBzZWNvbmQgYXQgMTJiaXQgYWNjdXJhY3kgc2hhbGwgYmUgbWFkZS4KKwkgKi8KKwlpZiAodGltZV9hZnRlcihqaWZmaWVzLCBzaHQyMS0+bGFzdF91cGRhdGUgKyBIWiAvIDIpIHx8ICFzaHQyMS0+dmFsaWQpIHsKKwkJcmV0ID0gc2h0MjFfcmVhZF93b3JkX2RhdGEoY2xpZW50LCBTSFQyMV9UUklHX1RfTUVBU1VSRU1FTlRfSE0pOworCQlpZiAocmV0IDwgMCkKKwkJCWdvdG8gb3V0OworCQlzaHQyMS0+dGVtcGVyYXR1cmUgPSBzaHQyMV90ZW1wX3RpY2tzX3RvX21pbGxpY2Vsc2l1cyhyZXQpOworCQlyZXQgPSBzaHQyMV9yZWFkX3dvcmRfZGF0YShjbGllbnQsCisJCQkJCVNIVDIxX1RSSUdfUkhfTUVBU1VSRU1FTlRfSE0pOworCQlpZiAocmV0IDwgMCkKKwkJCWdvdG8gb3V0OworCQlzaHQyMS0+aHVtaWRpdHkgPSBzaHQyMV9yaF90aWNrc190b19wZXJfY2VudF9taWxsZShyZXQpOworCQlzaHQyMS0+bGFzdF91cGRhdGUgPSBqaWZmaWVzOworCQlzaHQyMS0+dmFsaWQgPSAxOworCX0KK291dDoKKwltdXRleF91bmxvY2soJnNodDIxLT5sb2NrKTsKKworCXJldHVybiByZXQgPj0gMCA/IDAgOiByZXQ7Cit9CisKKy8qKgorICogc2h0MjFfc2hvd190ZW1wZXJhdHVyZSgpIC0gc2hvdyB0ZW1wZXJhdHVyZSBtZWFzdXJlbWVudCB2YWx1ZSBpbiBzeXNmcworICogQGRldjogZGV2aWNlCisgKiBAYXR0cjogZGV2aWNlIGF0dHJpYnV0ZQorICogQGJ1Zjogc3lzZnMgYnVmZmVyIChQQUdFX1NJWkUpIHdoZXJlIG1lYXN1cmVtZW50IHZhbHVlcyBhcmUgd3JpdHRlbiB0bworICoKKyAqIFdpbGwgYmUgY2FsbGVkIG9uIHJlYWQgYWNjZXNzIHRvIHRlbXAxX2lucHV0IHN5c2ZzIGF0dHJpYnV0ZS4KKyAqIFJldHVybnMgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4gaW50byBidWZmZXIsIG5lZ2F0aXZlIGVycm5vIG9uIGVycm9yLgorICovCitzdGF0aWMgc3NpemVfdCBzaHQyMV9zaG93X3RlbXBlcmF0dXJlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwljaGFyICpidWYpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3Qgc2h0MjEgKnNodDIxID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJaW50IHJldCA9IHNodDIxX3VwZGF0ZV9tZWFzdXJlbWVudHMoY2xpZW50KTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgc2h0MjEtPnRlbXBlcmF0dXJlKTsKK30KKworLyoqCisgKiBzaHQyMV9zaG93X2h1bWlkaXR5KCkgLSBzaG93IGh1bWlkaXR5IG1lYXN1cmVtZW50IHZhbHVlIGluIHN5c2ZzCisgKiBAZGV2OiBkZXZpY2UKKyAqIEBhdHRyOiBkZXZpY2UgYXR0cmlidXRlCisgKiBAYnVmOiBzeXNmcyBidWZmZXIgKFBBR0VfU0laRSkgd2hlcmUgbWVhc3VyZW1lbnQgdmFsdWVzIGFyZSB3cml0dGVuIHRvCisgKgorICogV2lsbCBiZSBjYWxsZWQgb24gcmVhZCBhY2Nlc3MgdG8gaHVtaWRpdHkxX2lucHV0IHN5c2ZzIGF0dHJpYnV0ZS4KKyAqIFJldHVybnMgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4gaW50byBidWZmZXIsIG5lZ2F0aXZlIGVycm5vIG9uIGVycm9yLgorICovCitzdGF0aWMgc3NpemVfdCBzaHQyMV9zaG93X2h1bWlkaXR5KHN0cnVjdCBkZXZpY2UgKmRldiwKKwlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwljaGFyICpidWYpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3Qgc2h0MjEgKnNodDIxID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJaW50IHJldCA9IHNodDIxX3VwZGF0ZV9tZWFzdXJlbWVudHMoY2xpZW50KTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgc2h0MjEtPmh1bWlkaXR5KTsKK30KKworLyogc3lzZnMgYXR0cmlidXRlcyAqLworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMV9pbnB1dCwgU19JUlVHTywgc2h0MjFfc2hvd190ZW1wZXJhdHVyZSwKKwlOVUxMLCAwKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoaHVtaWRpdHkxX2lucHV0LCBTX0lSVUdPLCBzaHQyMV9zaG93X2h1bWlkaXR5LAorCU5VTEwsIDApOworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqc2h0MjFfYXR0cmlidXRlc1tdID0geworCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDFfaW5wdXQuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2h1bWlkaXR5MV9pbnB1dC5kZXZfYXR0ci5hdHRyLAorCU5VTEwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIHNodDIxX2F0dHJfZ3JvdXAgPSB7CisJLmF0dHJzID0gc2h0MjFfYXR0cmlidXRlcywKK307CisKKy8qKgorICogc2h0MjFfcHJvYmUoKSAtIHByb2JlIGRldmljZQorICogQGNsaWVudDogSTJDIGNsaWVudCBkZXZpY2UKKyAqIEBpZDogZGV2aWNlIElECisgKgorICogQ2FsbGVkIGJ5IHRoZSBJMkMgY29yZSB3aGVuIGFuIGVudHJ5IGluIHRoZSBJRCB0YWJsZSBtYXRjaGVzIGEKKyAqIGRldmljZSdzIG5hbWUuCisgKiBSZXR1cm5zIDAgb24gc3VjY2Vzcy4KKyAqLworc3RhdGljIGludCBfX2RldmluaXQgc2h0MjFfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKKwljb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IHNodDIxICpzaHQyMTsKKwlpbnQgZXJyOworCisJaWYgKCFpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eShjbGllbnQtPmFkYXB0ZXIsCisJCQkJICAgICBJMkNfRlVOQ19TTUJVU19XT1JEX0RBVEEpKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LAorCQkJImFkYXB0ZXIgZG9lcyBub3Qgc3VwcG9ydCBTTUJ1cyB3b3JkIHRyYW5zYWN0aW9uc1xuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXNodDIxID0ga3phbGxvYyhzaXplb2YoKnNodDIxKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzaHQyMSkgeworCQlkZXZfZGJnKCZjbGllbnQtPmRldiwgImt6YWxsb2MgZmFpbGVkXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIHNodDIxKTsKKworCW11dGV4X2luaXQoJnNodDIxLT5sb2NrKTsKKworCWVyciA9IHN5c2ZzX2NyZWF0ZV9ncm91cCgmY2xpZW50LT5kZXYua29iaiwgJnNodDIxX2F0dHJfZ3JvdXApOworCWlmIChlcnIpIHsKKwkJZGV2X2RiZygmY2xpZW50LT5kZXYsICJjb3VsZCBub3QgY3JlYXRlIHN5c2ZzIGZpbGVzXG4iKTsKKwkJZ290byBmYWlsX2ZyZWU7CisJfQorCXNodDIxLT5od21vbl9kZXYgPSBod21vbl9kZXZpY2VfcmVnaXN0ZXIoJmNsaWVudC0+ZGV2KTsKKwlpZiAoSVNfRVJSKHNodDIxLT5od21vbl9kZXYpKSB7CisJCWRldl9kYmcoJmNsaWVudC0+ZGV2LCAidW5hYmxlIHRvIHJlZ2lzdGVyIGh3bW9uIGRldmljZVxuIik7CisJCWVyciA9IFBUUl9FUlIoc2h0MjEtPmh3bW9uX2Rldik7CisJCWdvdG8gZmFpbF9yZW1vdmVfc3lzZnM7CisJfQorCisJZGV2X2luZm8oJmNsaWVudC0+ZGV2LCAiaW5pdGlhbGl6ZWRcbiIpOworCisJcmV0dXJuIDA7CisKK2ZhaWxfcmVtb3ZlX3N5c2ZzOgorCXN5c2ZzX3JlbW92ZV9ncm91cCgmY2xpZW50LT5kZXYua29iaiwgJnNodDIxX2F0dHJfZ3JvdXApOworZmFpbF9mcmVlOgorCWtmcmVlKHNodDIxKTsKKworCXJldHVybiBlcnI7Cit9CisKKy8qKgorICogc2h0MjFfcmVtb3ZlKCkgLSByZW1vdmUgZGV2aWNlCisgKiBAY2xpZW50OiBJMkMgY2xpZW50IGRldmljZQorICovCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBzaHQyMV9yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlzdHJ1Y3Qgc2h0MjEgKnNodDIxID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisKKwlod21vbl9kZXZpY2VfdW5yZWdpc3RlcihzaHQyMS0+aHdtb25fZGV2KTsKKwlzeXNmc19yZW1vdmVfZ3JvdXAoJmNsaWVudC0+ZGV2LmtvYmosICZzaHQyMV9hdHRyX2dyb3VwKTsKKwlrZnJlZShzaHQyMSk7CisKKwlyZXR1cm4gMDsKK30KKworLyogRGV2aWNlIElEIHRhYmxlICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgc2h0MjFfaWRbXSA9IHsKKwl7ICJzaHQyMSIsIDAgfSwKKwl7IH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgc2h0MjFfaWQpOworCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgc2h0MjFfZHJpdmVyID0geworCS5kcml2ZXIubmFtZSA9ICJzaHQyMSIsCisJLnByb2JlICAgICAgID0gc2h0MjFfcHJvYmUsCisJLnJlbW92ZSAgICAgID0gX19kZXZleGl0X3Aoc2h0MjFfcmVtb3ZlKSwKKwkuaWRfdGFibGUgICAgPSBzaHQyMV9pZCwKK307CisKKy8qKgorICogc2h0MjFfaW5pdCgpIC0gaW5pdGlhbGl6ZSBkcml2ZXIKKyAqCisgKiBDYWxsZWQgd2hlbiBrZXJuZWwgaXMgYm9vdGVkIG9yIG1vZHVsZSBpcyBpbnNlcnRlZC4KKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzLgorICovCitzdGF0aWMgaW50IF9faW5pdCBzaHQyMV9pbml0KHZvaWQpCit7CisJcmV0dXJuIGkyY19hZGRfZHJpdmVyKCZzaHQyMV9kcml2ZXIpOworfQorbW9kdWxlX2luaXQoc2h0MjFfaW5pdCk7CisKKy8qKgorICogc2h0MjFfaW5pdCgpIC0gY2xlYW4gdXAgZHJpdmVyCisgKgorICogQ2FsbGVkIHdoZW4gbW9kdWxlIGlzIHJlbW92ZWQuCisgKi8KK3N0YXRpYyB2b2lkIF9fZXhpdCBzaHQyMV9leGl0KHZvaWQpCit7CisJaTJjX2RlbF9kcml2ZXIoJnNodDIxX2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdChzaHQyMV9leGl0KTsKKworTU9EVUxFX0FVVEhPUigiVXJzIEZsZWlzY2ggPHVycy5mbGVpc2NoQHNlbnNpcmlvbi5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlNlbnNpcmlvbiBTSFQyMSBodW1pZGl0eSBhbmQgdGVtcGVyYXR1cmUgc2Vuc29yIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9zaXM1NTk1LmMgYi9kcml2ZXJzL2h3bW9uL3NpczU1OTUuYwppbmRleCA3OWMyOTMxLi40N2Q3Y2U5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL3NpczU1OTUuYworKysgYi9kcml2ZXJzL2h3bW9uL3NpczU1OTUuYwpAQCAtNTAsNiArNTAsOCBAQAogCSA3MzUJCTAwMDgJCTA3MzUKICovCiAKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKwogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KQEAgLTczNSwyMSArNzM3LDE5IEBACiAJcGRldiA9IHBsYXRmb3JtX2RldmljZV9hbGxvYygic2lzNTU5NSIsIGFkZHJlc3MpOwogCWlmICghcGRldikgewogCQllcnIgPSAtRU5PTUVNOwotCQlwcmludGsoS0VSTl9FUlIgInNpczU1OTU6IERldmljZSBhbGxvY2F0aW9uIGZhaWxlZFxuIik7CisJCXByX2VycigiRGV2aWNlIGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKIAkJZ290byBleGl0OwogCX0KIAogCWVyciA9IHBsYXRmb3JtX2RldmljZV9hZGRfcmVzb3VyY2VzKHBkZXYsICZyZXMsIDEpOwogCWlmIChlcnIpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJzaXM1NTk1OiBEZXZpY2UgcmVzb3VyY2UgYWRkaXRpb24gZmFpbGVkICIKLQkJICAgICAgICIoJWQpXG4iLCBlcnIpOworCQlwcl9lcnIoIkRldmljZSByZXNvdXJjZSBhZGRpdGlvbiBmYWlsZWQgKCVkKVxuIiwgZXJyKTsKIAkJZ290byBleGl0X2RldmljZV9wdXQ7CiAJfQogCiAJZXJyID0gcGxhdGZvcm1fZGV2aWNlX2FkZChwZGV2KTsKIAlpZiAoZXJyKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAic2lzNTU5NTogRGV2aWNlIGFkZGl0aW9uIGZhaWxlZCAoJWQpXG4iLAotCQkgICAgICAgZXJyKTsKKwkJcHJfZXJyKCJEZXZpY2UgYWRkaXRpb24gZmFpbGVkICglZClcbiIsIGVycik7CiAJCWdvdG8gZXhpdF9kZXZpY2VfcHV0OwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9zbXNjNDdiMzk3LmMgYi9kcml2ZXJzL2h3bW9uL3Ntc2M0N2IzOTcuYwppbmRleCBmNDZkOTM2Li45ZmI3NTE2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL3Ntc2M0N2IzOTcuYworKysgYi9kcml2ZXJzL2h3bW9uL3Ntc2M0N2IzOTcuYwpAQCAtMjYsNiArMjYsOCBAQAogICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgogKi8KIAorI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgpAQCAtMzExLDIxICszMTMsMTkgQEAKIAlwZGV2ID0gcGxhdGZvcm1fZGV2aWNlX2FsbG9jKERSVk5BTUUsIGFkZHJlc3MpOwogCWlmICghcGRldikgewogCQllcnIgPSAtRU5PTUVNOwotCQlwcmludGsoS0VSTl9FUlIgRFJWTkFNRSAiOiBEZXZpY2UgYWxsb2NhdGlvbiBmYWlsZWRcbiIpOworCQlwcl9lcnIoIkRldmljZSBhbGxvY2F0aW9uIGZhaWxlZFxuIik7CiAJCWdvdG8gZXhpdDsKIAl9CiAKIAllcnIgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkX3Jlc291cmNlcyhwZGV2LCAmcmVzLCAxKTsKIAlpZiAoZXJyKSB7Ci0JCXByaW50ayhLRVJOX0VSUiBEUlZOQU1FICI6IERldmljZSByZXNvdXJjZSBhZGRpdGlvbiBmYWlsZWQgIgotCQkgICAgICAgIiglZClcbiIsIGVycik7CisJCXByX2VycigiRGV2aWNlIHJlc291cmNlIGFkZGl0aW9uIGZhaWxlZCAoJWQpXG4iLCBlcnIpOwogCQlnb3RvIGV4aXRfZGV2aWNlX3B1dDsKIAl9CiAKIAllcnIgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkKHBkZXYpOwogCWlmIChlcnIpIHsKLQkJcHJpbnRrKEtFUk5fRVJSIERSVk5BTUUgIjogRGV2aWNlIGFkZGl0aW9uIGZhaWxlZCAoJWQpXG4iLAotCQkgICAgICAgZXJyKTsKKwkJcHJfZXJyKCJEZXZpY2UgYWRkaXRpb24gZmFpbGVkICglZClcbiIsIGVycik7CiAJCWdvdG8gZXhpdF9kZXZpY2VfcHV0OwogCX0KIApAQCAtMzY3LDggKzM2Nyw3IEBACiAJKmFkZHIgPSAoc3VwZXJpb19pbmIoU1VQRVJJT19SRUdfQkFTRV9NU0IpIDw8IDgpCiAJCSB8ICBzdXBlcmlvX2luYihTVVBFUklPX1JFR19CQVNFX0xTQik7CiAKLQlwcmludGsoS0VSTl9JTkZPIERSVk5BTUUgIjogZm91bmQgU01TQyAlcyAiCi0JCSIoYmFzZSBhZGRyZXNzIDB4JTA0eCwgcmV2aXNpb24gJXUpXG4iLAorCXByX2luZm8oImZvdW5kIFNNU0MgJXMgKGJhc2UgYWRkcmVzcyAweCUwNHgsIHJldmlzaW9uICV1KVxuIiwKIAkJbmFtZSwgKmFkZHIsIHJldik7CiAKIAlzdXBlcmlvX2V4aXQoKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vc21zYzQ3bTEuYyBiL2RyaXZlcnMvaHdtb24vc21zYzQ3bTEuYwppbmRleCA4ZmE0NjJmLi5mNDRhODlhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL3Ntc2M0N20xLmMKKysrIGIvZHJpdmVycy9od21vbi9zbXNjNDdtMS5jCkBAIC0yNiw2ICsyNiw4IEBACiAgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCiAqLwogCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CkBAIC00MzUsMzAgKzQzNywyOSBAQAogCSAqLwogCXN3aXRjaCAodmFsKSB7CiAJY2FzZSAweDUxOgotCQlwcl9pbmZvKERSVk5BTUUgIjogRm91bmQgU01TQyBMUEM0N0IyN3hcbiIpOworCQlwcl9pbmZvKCJGb3VuZCBTTVNDIExQQzQ3QjI3eFxuIik7CiAJCXNpb19kYXRhLT50eXBlID0gc21zYzQ3bTE7CiAJCWJyZWFrOwogCWNhc2UgMHg1OToKLQkJcHJfaW5mbyhEUlZOQU1FICI6IEZvdW5kIFNNU0MgTFBDNDdNMTB4L0xQQzQ3TTExMi9MUEM0N00xM3hcbiIpOworCQlwcl9pbmZvKCJGb3VuZCBTTVNDIExQQzQ3TTEweC9MUEM0N00xMTIvTFBDNDdNMTN4XG4iKTsKIAkJc2lvX2RhdGEtPnR5cGUgPSBzbXNjNDdtMTsKIAkJYnJlYWs7CiAJY2FzZSAweDVGOgotCQlwcl9pbmZvKERSVk5BTUUgIjogRm91bmQgU01TQyBMUEM0N00xNHhcbiIpOworCQlwcl9pbmZvKCJGb3VuZCBTTVNDIExQQzQ3TTE0eFxuIik7CiAJCXNpb19kYXRhLT50eXBlID0gc21zYzQ3bTE7CiAJCWJyZWFrOwogCWNhc2UgMHg2MDoKLQkJcHJfaW5mbyhEUlZOQU1FICI6IEZvdW5kIFNNU0MgTFBDNDdNMTV4L0xQQzQ3TTE5Mi9MUEM0N005OTdcbiIpOworCQlwcl9pbmZvKCJGb3VuZCBTTVNDIExQQzQ3TTE1eC9MUEM0N00xOTIvTFBDNDdNOTk3XG4iKTsKIAkJc2lvX2RhdGEtPnR5cGUgPSBzbXNjNDdtMTsKIAkJYnJlYWs7CiAJY2FzZSAweDZCOgogCQlpZiAoc3VwZXJpb19pbmIoU1VQRVJJT19SRUdfREVWUkVWKSAmIDB4ODApIHsKLQkJCXByX2RlYnVnKERSVk5BTUUgIjogIgotCQkJCSAiRm91bmQgU01TQyBMUEM0N00yMzMsIHVuc3VwcG9ydGVkXG4iKTsKKwkJCXByX2RlYnVnKCJGb3VuZCBTTVNDIExQQzQ3TTIzMywgdW5zdXBwb3J0ZWRcbiIpOwogCQkJc3VwZXJpb19leGl0KCk7CiAJCQlyZXR1cm4gLUVOT0RFVjsKIAkJfQogCi0JCXByX2luZm8oRFJWTkFNRSAiOiBGb3VuZCBTTVNDIExQQzQ3TTI5MlxuIik7CisJCXByX2luZm8oIkZvdW5kIFNNU0MgTFBDNDdNMjkyXG4iKTsKIAkJc2lvX2RhdGEtPnR5cGUgPSBzbXNjNDdtMjsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKQEAgLTQ3MCw3ICs0NzEsNyBAQAogCSphZGRyID0gKHN1cGVyaW9faW5iKFNVUEVSSU9fUkVHX0JBU0UpIDw8IDgpCiAJICAgICAgfCAgc3VwZXJpb19pbmIoU1VQRVJJT19SRUdfQkFTRSArIDEpOwogCWlmICgqYWRkciA9PSAwKSB7Ci0JCXByX2luZm8oRFJWTkFNRSAiOiBEZXZpY2UgYWRkcmVzcyBub3Qgc2V0LCB3aWxsIG5vdCB1c2VcbiIpOworCQlwcl9pbmZvKCJEZXZpY2UgYWRkcmVzcyBub3Qgc2V0LCB3aWxsIG5vdCB1c2VcbiIpOwogCQlzdXBlcmlvX2V4aXQoKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQpAQCAtNDc5LDcgKzQ4MCw3IEBACiAJICogQ29tcGFxIFByZXNhcmlvIFM0MDAwTlgpICovCiAJc2lvX2RhdGEtPmFjdGl2YXRlID0gc3VwZXJpb19pbmIoU1VQRVJJT19SRUdfQUNUKTsKIAlpZiAoKHNpb19kYXRhLT5hY3RpdmF0ZSAmIDB4MDEpID09IDApIHsKLQkJcHJfaW5mbyhEUlZOQU1FICI6IEVuYWJsaW5nIGRldmljZVxuIik7CisJCXByX2luZm8oIkVuYWJsaW5nIGRldmljZVxuIik7CiAJCXN1cGVyaW9fb3V0YihTVVBFUklPX1JFR19BQ1QsIHNpb19kYXRhLT5hY3RpdmF0ZSB8IDB4MDEpOwogCX0KIApAQCAtNDk0LDcgKzQ5NSw3IEBACiAJCXN1cGVyaW9fZW50ZXIoKTsKIAkJc3VwZXJpb19zZWxlY3QoKTsKIAotCQlwcl9pbmZvKERSVk5BTUUgIjogRGlzYWJsaW5nIGRldmljZVxuIik7CisJCXByX2luZm8oIkRpc2FibGluZyBkZXZpY2VcbiIpOwogCQlzdXBlcmlvX291dGIoU1VQRVJJT19SRUdfQUNULCBzaW9fZGF0YS0+YWN0aXZhdGUpOwogCiAJCXN1cGVyaW9fZXhpdCgpOwpAQCAtODIzLDI4ICs4MjQsMjYgQEAKIAlwZGV2ID0gcGxhdGZvcm1fZGV2aWNlX2FsbG9jKERSVk5BTUUsIGFkZHJlc3MpOwogCWlmICghcGRldikgewogCQllcnIgPSAtRU5PTUVNOwotCQlwcmludGsoS0VSTl9FUlIgRFJWTkFNRSAiOiBEZXZpY2UgYWxsb2NhdGlvbiBmYWlsZWRcbiIpOworCQlwcl9lcnIoIkRldmljZSBhbGxvY2F0aW9uIGZhaWxlZFxuIik7CiAJCWdvdG8gZXhpdDsKIAl9CiAKIAllcnIgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkX3Jlc291cmNlcyhwZGV2LCAmcmVzLCAxKTsKIAlpZiAoZXJyKSB7Ci0JCXByaW50ayhLRVJOX0VSUiBEUlZOQU1FICI6IERldmljZSByZXNvdXJjZSBhZGRpdGlvbiBmYWlsZWQgIgotCQkgICAgICAgIiglZClcbiIsIGVycik7CisJCXByX2VycigiRGV2aWNlIHJlc291cmNlIGFkZGl0aW9uIGZhaWxlZCAoJWQpXG4iLCBlcnIpOwogCQlnb3RvIGV4aXRfZGV2aWNlX3B1dDsKIAl9CiAKIAllcnIgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkX2RhdGEocGRldiwgc2lvX2RhdGEsCiAJCQkJICAgICAgIHNpemVvZihzdHJ1Y3Qgc21zYzQ3bTFfc2lvX2RhdGEpKTsKIAlpZiAoZXJyKSB7Ci0JCXByaW50ayhLRVJOX0VSUiBEUlZOQU1FICI6IFBsYXRmb3JtIGRhdGEgYWxsb2NhdGlvbiBmYWlsZWRcbiIpOworCQlwcl9lcnIoIlBsYXRmb3JtIGRhdGEgYWxsb2NhdGlvbiBmYWlsZWRcbiIpOwogCQlnb3RvIGV4aXRfZGV2aWNlX3B1dDsKIAl9CiAKIAllcnIgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkKHBkZXYpOwogCWlmIChlcnIpIHsKLQkJcHJpbnRrKEtFUk5fRVJSIERSVk5BTUUgIjogRGV2aWNlIGFkZGl0aW9uIGZhaWxlZCAoJWQpXG4iLAotCQkgICAgICAgZXJyKTsKKwkJcHJfZXJyKCJEZXZpY2UgYWRkaXRpb24gZmFpbGVkICglZClcbiIsIGVycik7CiAJCWdvdG8gZXhpdF9kZXZpY2VfcHV0OwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi92aWEtY3B1dGVtcC5jIGIvZHJpdmVycy9od21vbi92aWEtY3B1dGVtcC5jCmluZGV4IGVjN2ZhZDcuLjBkMThkZTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vdmlhLWNwdXRlbXAuYworKysgYi9kcml2ZXJzL2h3bW9uL3ZpYS1jcHV0ZW1wLmMKQEAgLTIxLDYgKzIxLDggQEAKICAqIDAyMTEwLTEzMDEgVVNBLgogICovCiAKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKwogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CkBAIC0yMDIsNyArMjA0LDcgQEAKIAlwZGV2ID0gcGxhdGZvcm1fZGV2aWNlX2FsbG9jKERSVk5BTUUsIGNwdSk7CiAJaWYgKCFwZGV2KSB7CiAJCWVyciA9IC1FTk9NRU07Ci0JCXByaW50ayhLRVJOX0VSUiBEUlZOQU1FICI6IERldmljZSBhbGxvY2F0aW9uIGZhaWxlZFxuIik7CisJCXByX2VycigiRGV2aWNlIGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKIAkJZ290byBleGl0OwogCX0KIApAQCAtMjE0LDggKzIxNiw3IEBACiAKIAllcnIgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkKHBkZXYpOwogCWlmIChlcnIpIHsKLQkJcHJpbnRrKEtFUk5fRVJSIERSVk5BTUUgIjogRGV2aWNlIGFkZGl0aW9uIGZhaWxlZCAoJWQpXG4iLAotCQkgICAgICAgZXJyKTsKKwkJcHJfZXJyKCJEZXZpY2UgYWRkaXRpb24gZmFpbGVkICglZClcbiIsIGVycik7CiAJCWdvdG8gZXhpdF9kZXZpY2VfZnJlZTsKIAl9CiAKQEAgLTIzNywxMyArMjM4LDE2IEBACiAKIHN0YXRpYyB2b2lkIF9fY3B1aW5pdCB2aWFfY3B1dGVtcF9kZXZpY2VfcmVtb3ZlKHVuc2lnbmVkIGludCBjcHUpCiB7Ci0Jc3RydWN0IHBkZXZfZW50cnkgKnAsICpuOworCXN0cnVjdCBwZGV2X2VudHJ5ICpwOworCiAJbXV0ZXhfbG9jaygmcGRldl9saXN0X211dGV4KTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocCwgbiwgJnBkZXZfbGlzdCwgbGlzdCkgeworCWxpc3RfZm9yX2VhY2hfZW50cnkocCwgJnBkZXZfbGlzdCwgbGlzdCkgewogCQlpZiAocC0+Y3B1ID09IGNwdSkgewogCQkJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIocC0+cGRldik7CiAJCQlsaXN0X2RlbCgmcC0+bGlzdCk7CisJCQltdXRleF91bmxvY2soJnBkZXZfbGlzdF9tdXRleCk7CiAJCQlrZnJlZShwKTsKKwkJCXJldHVybjsKIAkJfQogCX0KIAltdXRleF91bmxvY2soJnBkZXZfbGlzdF9tdXRleCk7CkBAIC0yNzMsNyArMjc3LDYgQEAKIHN0YXRpYyBpbnQgX19pbml0IHZpYV9jcHV0ZW1wX2luaXQodm9pZCkKIHsKIAlpbnQgaSwgZXJyOwotCXN0cnVjdCBwZGV2X2VudHJ5ICpwLCAqbjsKIAogCWlmIChjcHVfZGF0YSgwKS54ODZfdmVuZG9yICE9IFg4Nl9WRU5ET1JfQ0VOVEFVUikgewogCQlwcmludGsoS0VSTl9ERUJVRyBEUlZOQU1FICI6IE5vdCBhIFZJQSBDUFVcbiIpOwpAQCAtMjk1LDMzICsyOTgsMjcgQEAKIAkJCWNvbnRpbnVlOwogCiAJCWlmIChjLT54ODZfbW9kZWwgPiAweDBmKSB7Ci0JCQlwcmludGsoS0VSTl9XQVJOSU5HIERSVk5BTUUgIjogVW5rbm93biBDUFUgIgotCQkJCSJtb2RlbCAweCV4XG4iLCBjLT54ODZfbW9kZWwpOworCQkJcHJfd2FybigiVW5rbm93biBDUFUgbW9kZWwgMHgleFxuIiwgYy0+eDg2X21vZGVsKTsKIAkJCWNvbnRpbnVlOwogCQl9CiAKLQkJZXJyID0gdmlhX2NwdXRlbXBfZGV2aWNlX2FkZChpKTsKLQkJaWYgKGVycikKLQkJCWdvdG8gZXhpdF9kZXZpY2VzX3VucmVnOworCQl2aWFfY3B1dGVtcF9kZXZpY2VfYWRkKGkpOwogCX0KKworI2lmbmRlZiBDT05GSUdfSE9UUExVR19DUFUKIAlpZiAobGlzdF9lbXB0eSgmcGRldl9saXN0KSkgewogCQllcnIgPSAtRU5PREVWOwogCQlnb3RvIGV4aXRfZHJpdmVyX3VucmVnOwogCX0KKyNlbmRpZgogCiAJcmVnaXN0ZXJfaG90Y3B1X25vdGlmaWVyKCZ2aWFfY3B1dGVtcF9jcHVfbm90aWZpZXIpOwogCXJldHVybiAwOwogCi1leGl0X2RldmljZXNfdW5yZWc6Ci0JbXV0ZXhfbG9jaygmcGRldl9saXN0X211dGV4KTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocCwgbiwgJnBkZXZfbGlzdCwgbGlzdCkgewotCQlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcihwLT5wZGV2KTsKLQkJbGlzdF9kZWwoJnAtPmxpc3QpOwotCQlrZnJlZShwKTsKLQl9Ci0JbXV0ZXhfdW5sb2NrKCZwZGV2X2xpc3RfbXV0ZXgpOworI2lmbmRlZiBDT05GSUdfSE9UUExVR19DUFUKIGV4aXRfZHJpdmVyX3VucmVnOgogCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZ2aWFfY3B1dGVtcF9kcml2ZXIpOworI2VuZGlmCiBleGl0OgogCXJldHVybiBlcnI7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL3ZpYTY4NmEuYyBiL2RyaXZlcnMvaHdtb24vdmlhNjg2YS5jCmluZGV4IGYzOTdjZTcuLjEzZThkMjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vdmlhNjg2YS5jCisrKyBiL2RyaXZlcnMvaHdtb24vdmlhNjg2YS5jCkBAIC0zMCw2ICszMCw4IEBACiAgICAgV2FybmluZyAtIG9ubHkgc3VwcG9ydHMgYSBzaW5nbGUgZGV2aWNlLgogKi8KIAorI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgpAQCAtNzkxLDIxICs3OTMsMTkgQEAKIAlwZGV2ID0gcGxhdGZvcm1fZGV2aWNlX2FsbG9jKCJ2aWE2ODZhIiwgYWRkcmVzcyk7CiAJaWYgKCFwZGV2KSB7CiAJCWVyciA9IC1FTk9NRU07Ci0JCXByaW50ayhLRVJOX0VSUiAidmlhNjg2YTogRGV2aWNlIGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKKwkJcHJfZXJyKCJEZXZpY2UgYWxsb2NhdGlvbiBmYWlsZWRcbiIpOwogCQlnb3RvIGV4aXQ7CiAJfQogCiAJZXJyID0gcGxhdGZvcm1fZGV2aWNlX2FkZF9yZXNvdXJjZXMocGRldiwgJnJlcywgMSk7CiAJaWYgKGVycikgewotCQlwcmludGsoS0VSTl9FUlIgInZpYTY4NmE6IERldmljZSByZXNvdXJjZSBhZGRpdGlvbiBmYWlsZWQgIgotCQkgICAgICAgIiglZClcbiIsIGVycik7CisJCXByX2VycigiRGV2aWNlIHJlc291cmNlIGFkZGl0aW9uIGZhaWxlZCAoJWQpXG4iLCBlcnIpOwogCQlnb3RvIGV4aXRfZGV2aWNlX3B1dDsKIAl9CiAKIAllcnIgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkKHBkZXYpOwogCWlmIChlcnIpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJ2aWE2ODZhOiBEZXZpY2UgYWRkaXRpb24gZmFpbGVkICglZClcbiIsCi0JCSAgICAgICBlcnIpOworCQlwcl9lcnIoIkRldmljZSBhZGRpdGlvbiBmYWlsZWQgKCVkKVxuIiwgZXJyKTsKIAkJZ290byBleGl0X2RldmljZV9wdXQ7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL3Z0MTIxMS5jIGIvZHJpdmVycy9od21vbi92dDEyMTEuYwppbmRleCBhZTMzYmJiLi40OTE2M2Q0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL3Z0MTIxMS5jCisrKyBiL2RyaXZlcnMvaHdtb24vdnQxMjExLmMKQEAgLTIxLDYgKzIxLDggQEAKICAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgogICovCiAKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKwogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CkBAIC0xMjU0LDggKzEyNTYsNyBAQAogCXBkZXYgPSBwbGF0Zm9ybV9kZXZpY2VfYWxsb2MoRFJWTkFNRSwgYWRkcmVzcyk7CiAJaWYgKCFwZGV2KSB7CiAJCWVyciA9IC1FTk9NRU07Ci0JCXByaW50ayhLRVJOX0VSUiBEUlZOQU1FICI6IERldmljZSBhbGxvY2F0aW9uIGZhaWxlZCAoJWQpXG4iLAotCQkgICAgICAgZXJyKTsKKwkJcHJfZXJyKCJEZXZpY2UgYWxsb2NhdGlvbiBmYWlsZWQgKCVkKVxuIiwgZXJyKTsKIAkJZ290byBFWElUOwogCX0KIApAQCAtMTI2NiwxNSArMTI2NywxMyBAQAogCiAJZXJyID0gcGxhdGZvcm1fZGV2aWNlX2FkZF9yZXNvdXJjZXMocGRldiwgJnJlcywgMSk7CiAJaWYgKGVycikgewotCQlwcmludGsoS0VSTl9FUlIgRFJWTkFNRSAiOiBEZXZpY2UgcmVzb3VyY2UgYWRkaXRpb24gZmFpbGVkICIKLQkJICAgICAgICIoJWQpXG4iLCBlcnIpOworCQlwcl9lcnIoIkRldmljZSByZXNvdXJjZSBhZGRpdGlvbiBmYWlsZWQgKCVkKVxuIiwgZXJyKTsKIAkJZ290byBFWElUX0RFVl9QVVQ7CiAJfQogCiAJZXJyID0gcGxhdGZvcm1fZGV2aWNlX2FkZChwZGV2KTsKIAlpZiAoZXJyKSB7Ci0JCXByaW50ayhLRVJOX0VSUiBEUlZOQU1FICI6IERldmljZSBhZGRpdGlvbiBmYWlsZWQgKCVkKVxuIiwKLQkJICAgICAgIGVycik7CisJCXByX2VycigiRGV2aWNlIGFkZGl0aW9uIGZhaWxlZCAoJWQpXG4iLCBlcnIpOwogCQlnb3RvIEVYSVRfREVWX1BVVDsKIAl9CiAKQEAgLTEzMDEsMjMgKzEzMDAsMjAgQEAKIAlzdXBlcmlvX3NlbGVjdChzaW9fY2lwLCBTSU9fVlQxMjExX0xETl9IV01PTik7CiAKIAlpZiAoKHN1cGVyaW9faW5iKHNpb19jaXAsIFNJT19WVDEyMTFfQUNUSVZFKSAmIDEpID09IDApIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyBEUlZOQU1FICI6IEhXIG1vbml0b3IgaXMgZGlzYWJsZWQsICIKLQkJICAgICAgICJza2lwcGluZ1xuIik7CisJCXByX3dhcm4oIkhXIG1vbml0b3IgaXMgZGlzYWJsZWQsIHNraXBwaW5nXG4iKTsKIAkJZ290byBFWElUOwogCX0KIAogCSphZGRyZXNzID0gKChzdXBlcmlvX2luYihzaW9fY2lwLCBTSU9fVlQxMjExX0JBRERSKSA8PCA4KSB8CiAJCSAgICAoc3VwZXJpb19pbmIoc2lvX2NpcCwgU0lPX1ZUMTIxMV9CQUREUiArIDEpKSkgJiAweGZmMDA7CiAJaWYgKCphZGRyZXNzID09IDApIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyBEUlZOQU1FICI6IEJhc2UgYWRkcmVzcyBpcyBub3Qgc2V0LCAiCi0JCSAgICAgICAic2tpcHBpbmdcbiIpOworCQlwcl93YXJuKCJCYXNlIGFkZHJlc3MgaXMgbm90IHNldCwgc2tpcHBpbmdcbiIpOwogCQlnb3RvIEVYSVQ7CiAJfQogCiAJZXJyID0gMDsKLQlwcmludGsoS0VSTl9JTkZPIERSVk5BTUUgIjogRm91bmQgVlQxMjExIGNoaXAgYXQgMHglMDR4LCAiCi0JICAgICAgICJyZXZpc2lvbiAldVxuIiwgKmFkZHJlc3MsCi0JICAgICAgIHN1cGVyaW9faW5iKHNpb19jaXAsIFNJT19WVDEyMTFfREVWUkVWKSk7CisJcHJfaW5mbygiRm91bmQgVlQxMjExIGNoaXAgYXQgMHglMDR4LCByZXZpc2lvbiAldVxuIiwKKwkJKmFkZHJlc3MsIHN1cGVyaW9faW5iKHNpb19jaXAsIFNJT19WVDEyMTFfREVWUkVWKSk7CiAKIEVYSVQ6CiAJc3VwZXJpb19leGl0KHNpb19jaXApOwpAQCAtMTMzNiwxNSArMTMzMiwxNSBAQAogCiAJaWYgKCh1Y2hfY29uZmlnIDwgLTEpIHx8ICh1Y2hfY29uZmlnID4gMzEpKSB7CiAJCWVyciA9IC1FSU5WQUw7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgRFJWTkFNRSAiOiBJbnZhbGlkIFVDSCBjb25maWd1cmF0aW9uICVkLiAiCi0JCSAgICAgICAiQ2hvb3NlIGEgdmFsdWUgYmV0d2VlbiAwIGFuZCAzMS5cbiIsIHVjaF9jb25maWcpOworCQlwcl93YXJuKCJJbnZhbGlkIFVDSCBjb25maWd1cmF0aW9uICVkLiAiCisJCQkiQ2hvb3NlIGEgdmFsdWUgYmV0d2VlbiAwIGFuZCAzMS5cbiIsIHVjaF9jb25maWcpOwogCSAgZ290byBFWElUOwogCX0KIAogCWlmICgoaW50X21vZGUgPCAtMSkgfHwgKGludF9tb2RlID4gMCkpIHsKIAkJZXJyID0gLUVJTlZBTDsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyBEUlZOQU1FICI6IEludmFsaWQgaW50ZXJydXB0IG1vZGUgJWQuICIKLQkJICAgICAgICJPbmx5IG1vZGUgMCBpcyBzdXBwb3J0ZWQuXG4iLCBpbnRfbW9kZSk7CisJCXByX3dhcm4oIkludmFsaWQgaW50ZXJydXB0IG1vZGUgJWQuICIKKwkJCSJPbmx5IG1vZGUgMCBpcyBzdXBwb3J0ZWQuXG4iLCBpbnRfbW9kZSk7CiAJICBnb3RvIEVYSVQ7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL3Z0ODIzMS5jIGIvZHJpdmVycy9od21vbi92dDgyMzEuYwppbmRleCBlNjA3OGM5Li5kYjNiMmU4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL3Z0ODIzMS5jCisrKyBiL2RyaXZlcnMvaHdtb24vdnQ4MjMxLmMKQEAgLTI0LDYgKzI0LDggQEAKIC8qIFN1cHBvcnRzIFZJQSBWVDgyMzEgU291dGggQnJpZGdlIGVtYmVkZGVkIHNlbnNvcnMKICovCiAKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKwogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CkBAIC05MDIsMjEgKzkwNCwxOSBAQAogCXBkZXYgPSBwbGF0Zm9ybV9kZXZpY2VfYWxsb2MoInZ0ODIzMSIsIGFkZHJlc3MpOwogCWlmICghcGRldikgewogCQllcnIgPSAtRU5PTUVNOwotCQlwcmludGsoS0VSTl9FUlIgInZ0ODIzMTogRGV2aWNlIGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKKwkJcHJfZXJyKCJEZXZpY2UgYWxsb2NhdGlvbiBmYWlsZWRcbiIpOwogCQlnb3RvIGV4aXQ7CiAJfQogCiAJZXJyID0gcGxhdGZvcm1fZGV2aWNlX2FkZF9yZXNvdXJjZXMocGRldiwgJnJlcywgMSk7CiAJaWYgKGVycikgewotCQlwcmludGsoS0VSTl9FUlIgInZ0ODIzMTogRGV2aWNlIHJlc291cmNlIGFkZGl0aW9uIGZhaWxlZCAiCi0JCSAgICAgICAiKCVkKVxuIiwgZXJyKTsKKwkJcHJfZXJyKCJEZXZpY2UgcmVzb3VyY2UgYWRkaXRpb24gZmFpbGVkICglZClcbiIsIGVycik7CiAJCWdvdG8gZXhpdF9kZXZpY2VfcHV0OwogCX0KIAogCWVyciA9IHBsYXRmb3JtX2RldmljZV9hZGQocGRldik7CiAJaWYgKGVycikgewotCQlwcmludGsoS0VSTl9FUlIgInZ0ODIzMTogRGV2aWNlIGFkZGl0aW9uIGZhaWxlZCAoJWQpXG4iLAotCQkgICAgICAgZXJyKTsKKwkJcHJfZXJyKCJEZXZpY2UgYWRkaXRpb24gZmFpbGVkICglZClcbiIsIGVycik7CiAJCWdvdG8gZXhpdF9kZXZpY2VfcHV0OwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi93ODM2MjdlaGYuYyBiL2RyaXZlcnMvaHdtb24vdzgzNjI3ZWhmLmMKaW5kZXggMDcyYzU4MC4uMDczZWFiZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi93ODM2MjdlaGYuYworKysgYi9kcml2ZXJzL2h3bW9uL3c4MzYyN2VoZi5jCkBAIC00Miw2ICs0Miw4IEBACiAgICAgdzgzNjY3aGctYiAgIDkgICAgICA1ICAgICAgIDMgICAgICAgMyAgICAgIDB4YjM1MCAweGMxICAgIDB4NWNhMwogKi8KIAorI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KQEAgLTE2NjgsOCArMTY3MCw3IEBACiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCWlmICh2YWwgIT0gMHhmZmZmKQotCQkJcHJfZGVidWcoRFJWTkFNRSAiOiB1bnN1cHBvcnRlZCBjaGlwIElEOiAweCUwNHhcbiIsCi0JCQkJIHZhbCk7CisJCQlwcl9kZWJ1ZygidW5zdXBwb3J0ZWQgY2hpcCBJRDogMHglMDR4XG4iLCB2YWwpOwogCQlzdXBlcmlvX2V4aXQoc2lvYWRkcik7CiAJCXJldHVybiAtRU5PREVWOwogCX0KQEAgLTE2ODAsOCArMTY4MSw3IEBACiAJICAgIHwgc3VwZXJpb19pbmIoc2lvYWRkciwgU0lPX1JFR19BRERSICsgMSk7CiAJKmFkZHIgPSB2YWwgJiBJT1JFR0lPTl9BTElHTk1FTlQ7CiAJaWYgKCphZGRyID09IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSIERSVk5BTUUgIjogUmVmdXNpbmcgdG8gZW5hYmxlIGEgU3VwZXItSS9PICIKLQkJICAgICAgICJkZXZpY2Ugd2l0aCBhIGJhc2UgSS9PIHBvcnQgMC5cbiIpOworCQlwcl9lcnIoIlJlZnVzaW5nIHRvIGVuYWJsZSBhIFN1cGVyLUkvTyBkZXZpY2Ugd2l0aCBhIGJhc2UgSS9PIHBvcnQgMFxuIik7CiAJCXN1cGVyaW9fZXhpdChzaW9hZGRyKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQpAQCAtMTY4OSwxMyArMTY4OSwxMiBAQAogCS8qIEFjdGl2YXRlIGxvZ2ljYWwgZGV2aWNlIGlmIG5lZWRlZCAqLwogCXZhbCA9IHN1cGVyaW9faW5iKHNpb2FkZHIsIFNJT19SRUdfRU5BQkxFKTsKIAlpZiAoISh2YWwgJiAweDAxKSkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HIERSVk5BTUUgIjogRm9yY2libHkgZW5hYmxpbmcgU3VwZXItSS9PLiAiCi0JCSAgICAgICAiU2Vuc29yIGlzIHByb2JhYmx5IHVudXNhYmxlLlxuIik7CisJCXByX3dhcm4oIkZvcmNpYmx5IGVuYWJsaW5nIFN1cGVyLUkvTy4gU2Vuc29yIGlzIHByb2JhYmx5IHVudXNhYmxlLlxuIik7CiAJCXN1cGVyaW9fb3V0YihzaW9hZGRyLCBTSU9fUkVHX0VOQUJMRSwgdmFsIHwgMHgwMSk7CiAJfQogCiAJc3VwZXJpb19leGl0KHNpb2FkZHIpOwotCXByX2luZm8oRFJWTkFNRSAiOiBGb3VuZCAlcyBjaGlwIGF0ICUjeFxuIiwgc2lvX25hbWUsICphZGRyKTsKKwlwcl9pbmZvKCJGb3VuZCAlcyBjaGlwIGF0ICUjeFxuIiwgc2lvX25hbWUsICphZGRyKTsKIAlzaW9fZGF0YS0+c2lvcmVnID0gc2lvYWRkcjsKIAogCXJldHVybiAwOwpAQCAtMTcyOSwxNCArMTcyOCwxNCBAQAogCiAJaWYgKCEocGRldiA9IHBsYXRmb3JtX2RldmljZV9hbGxvYyhEUlZOQU1FLCBhZGRyZXNzKSkpIHsKIAkJZXJyID0gLUVOT01FTTsKLQkJcHJpbnRrKEtFUk5fRVJSIERSVk5BTUUgIjogRGV2aWNlIGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKKwkJcHJfZXJyKCJEZXZpY2UgYWxsb2NhdGlvbiBmYWlsZWRcbiIpOwogCQlnb3RvIGV4aXRfdW5yZWdpc3RlcjsKIAl9CiAKIAllcnIgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkX2RhdGEocGRldiwgJnNpb19kYXRhLAogCQkJCSAgICAgICBzaXplb2Yoc3RydWN0IHc4MzYyN2VoZl9zaW9fZGF0YSkpOwogCWlmIChlcnIpIHsKLQkJcHJpbnRrKEtFUk5fRVJSIERSVk5BTUUgIjogUGxhdGZvcm0gZGF0YSBhbGxvY2F0aW9uIGZhaWxlZFxuIik7CisJCXByX2VycigiUGxhdGZvcm0gZGF0YSBhbGxvY2F0aW9uIGZhaWxlZFxuIik7CiAJCWdvdG8gZXhpdF9kZXZpY2VfcHV0OwogCX0KIApAQCAtMTc1MiwxNiArMTc1MSwxNCBAQAogCiAJZXJyID0gcGxhdGZvcm1fZGV2aWNlX2FkZF9yZXNvdXJjZXMocGRldiwgJnJlcywgMSk7CiAJaWYgKGVycikgewotCQlwcmludGsoS0VSTl9FUlIgRFJWTkFNRSAiOiBEZXZpY2UgcmVzb3VyY2UgYWRkaXRpb24gZmFpbGVkICIKLQkJICAgICAgICIoJWQpXG4iLCBlcnIpOworCQlwcl9lcnIoIkRldmljZSByZXNvdXJjZSBhZGRpdGlvbiBmYWlsZWQgKCVkKVxuIiwgZXJyKTsKIAkJZ290byBleGl0X2RldmljZV9wdXQ7CiAJfQogCiAJLyogcGxhdGZvcm1fZGV2aWNlX2FkZCBjYWxscyBwcm9iZSgpICovCiAJZXJyID0gcGxhdGZvcm1fZGV2aWNlX2FkZChwZGV2KTsKIAlpZiAoZXJyKSB7Ci0JCXByaW50ayhLRVJOX0VSUiBEUlZOQU1FICI6IERldmljZSBhZGRpdGlvbiBmYWlsZWQgKCVkKVxuIiwKLQkJICAgICAgIGVycik7CisJCXByX2VycigiRGV2aWNlIGFkZGl0aW9uIGZhaWxlZCAoJWQpXG4iLCBlcnIpOwogCQlnb3RvIGV4aXRfZGV2aWNlX3B1dDsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vdzgzNjI3aGYuYyBiL2RyaXZlcnMvaHdtb24vdzgzNjI3aGYuYwppbmRleCAzOGUyODA1Li5iZGU1MGUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL3c4MzYyN2hmLmMKKysrIGIvZHJpdmVycy9od21vbi93ODM2MjdoZi5jCkBAIC0zOSw2ICszOSw4IEBACiAgICAgc3VwcG9ydGVkIHlldC4KICovCiAKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKwogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CkBAIC0xMTY2LDE0ICsxMTY4LDEzIEBACiAJICAgICAgIHN1cGVyaW9faW5iKHNpb19kYXRhLCBXSU5CX0JBU0VfUkVHICsgMSk7CiAJKmFkZHIgPSB2YWwgJiBXSU5CX0FMSUdOTUVOVDsKIAlpZiAoKmFkZHIgPT0gMCkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HIERSVk5BTUUgIjogQmFzZSBhZGRyZXNzIG5vdCBzZXQsICIKLQkJICAgICAgICJza2lwcGluZ1xuIik7CisJCXByX3dhcm4oIkJhc2UgYWRkcmVzcyBub3Qgc2V0LCBza2lwcGluZ1xuIik7CiAJCWdvdG8gZXhpdDsKIAl9CiAKIAl2YWwgPSBzdXBlcmlvX2luYihzaW9fZGF0YSwgV0lOQl9BQ1RfUkVHKTsKIAlpZiAoISh2YWwgJiAweDAxKSkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HIERSVk5BTUUgIjogRW5hYmxpbmcgSFdNIGxvZ2ljYWwgZGV2aWNlXG4iKTsKKwkJcHJfd2FybigiRW5hYmxpbmcgSFdNIGxvZ2ljYWwgZGV2aWNlXG4iKTsKIAkJc3VwZXJpb19vdXRiKHNpb19kYXRhLCBXSU5CX0FDVF9SRUcsIHZhbCB8IDB4MDEpOwogCX0KIApAQCAtMTc4OSwyOCArMTc5MCwyNiBAQAogCXBkZXYgPSBwbGF0Zm9ybV9kZXZpY2VfYWxsb2MoRFJWTkFNRSwgYWRkcmVzcyk7CiAJaWYgKCFwZGV2KSB7CiAJCWVyciA9IC1FTk9NRU07Ci0JCXByaW50ayhLRVJOX0VSUiBEUlZOQU1FICI6IERldmljZSBhbGxvY2F0aW9uIGZhaWxlZFxuIik7CisJCXByX2VycigiRGV2aWNlIGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKIAkJZ290byBleGl0OwogCX0KIAogCWVyciA9IHBsYXRmb3JtX2RldmljZV9hZGRfcmVzb3VyY2VzKHBkZXYsICZyZXMsIDEpOwogCWlmIChlcnIpIHsKLQkJcHJpbnRrKEtFUk5fRVJSIERSVk5BTUUgIjogRGV2aWNlIHJlc291cmNlIGFkZGl0aW9uIGZhaWxlZCAiCi0JCSAgICAgICAiKCVkKVxuIiwgZXJyKTsKKwkJcHJfZXJyKCJEZXZpY2UgcmVzb3VyY2UgYWRkaXRpb24gZmFpbGVkICglZClcbiIsIGVycik7CiAJCWdvdG8gZXhpdF9kZXZpY2VfcHV0OwogCX0KIAogCWVyciA9IHBsYXRmb3JtX2RldmljZV9hZGRfZGF0YShwZGV2LCBzaW9fZGF0YSwKIAkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCB3ODM2MjdoZl9zaW9fZGF0YSkpOwogCWlmIChlcnIpIHsKLQkJcHJpbnRrKEtFUk5fRVJSIERSVk5BTUUgIjogUGxhdGZvcm0gZGF0YSBhbGxvY2F0aW9uIGZhaWxlZFxuIik7CisJCXByX2VycigiUGxhdGZvcm0gZGF0YSBhbGxvY2F0aW9uIGZhaWxlZFxuIik7CiAJCWdvdG8gZXhpdF9kZXZpY2VfcHV0OwogCX0KIAogCWVyciA9IHBsYXRmb3JtX2RldmljZV9hZGQocGRldik7CiAJaWYgKGVycikgewotCQlwcmludGsoS0VSTl9FUlIgRFJWTkFNRSAiOiBEZXZpY2UgYWRkaXRpb24gZmFpbGVkICglZClcbiIsCi0JCSAgICAgICBlcnIpOworCQlwcl9lcnIoIkRldmljZSBhZGRpdGlvbiBmYWlsZWQgKCVkKVxuIiwgZXJyKTsKIAkJZ290byBleGl0X2RldmljZV9wdXQ7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9hbGdvcy9pMmMtYWxnby1iaXQuYyBiL2RyaXZlcnMvaTJjL2FsZ29zL2kyYy1hbGdvLWJpdC5jCmluZGV4IGEzOWU2Y2YuLjM4MzE5YTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2FsZ29zL2kyYy1hbGdvLWJpdC5jCisrKyBiL2RyaXZlcnMvaTJjL2FsZ29zL2kyYy1hbGdvLWJpdC5jCkBAIC02MDAsMTIgKzYwMCwxNCBAQAogLyoKICAqIHJlZ2lzdGVyaW5nIGZ1bmN0aW9ucyB0byBsb2FkIGFsZ29yaXRobXMgYXQgcnVudGltZQogICovCi1zdGF0aWMgaW50IGkyY19iaXRfcHJlcGFyZV9idXMoc3RydWN0IGkyY19hZGFwdGVyICphZGFwKQorc3RhdGljIGludCBfX2kyY19iaXRfYWRkX2J1cyhzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXAsCisJCQkgICAgIGludCAoKmFkZF9hZGFwdGVyKShzdHJ1Y3QgaTJjX2FkYXB0ZXIgKikpCiB7CiAJc3RydWN0IGkyY19hbGdvX2JpdF9kYXRhICpiaXRfYWRhcCA9IGFkYXAtPmFsZ29fZGF0YTsKKwlpbnQgcmV0OwogCiAJaWYgKGJpdF90ZXN0KSB7Ci0JCWludCByZXQgPSB0ZXN0X2J1cyhiaXRfYWRhcCwgYWRhcC0+bmFtZSk7CisJCXJldCA9IHRlc3RfYnVzKGJpdF9hZGFwLCBhZGFwLT5uYW1lKTsKIAkJaWYgKHJldCA8IDApCiAJCQlyZXR1cm4gLUVOT0RFVjsKIAl9CkBAIC02MTQsMzAgKzYxNiwyNyBAQAogCWFkYXAtPmFsZ28gPSAmaTJjX2JpdF9hbGdvOwogCWFkYXAtPnJldHJpZXMgPSAzOwogCisJcmV0ID0gYWRkX2FkYXB0ZXIoYWRhcCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwkvKiBDb21wbGFpbiBpZiBTQ0wgY2FuJ3QgYmUgcmVhZCAqLworCWlmIChiaXRfYWRhcC0+Z2V0c2NsID09IE5VTEwpIHsKKwkJZGV2X3dhcm4oJmFkYXAtPmRldiwgIk5vdCBJMkMgY29tcGxpYW50OiBjYW4ndCByZWFkIFNDTFxuIik7CisJCWRldl93YXJuKCZhZGFwLT5kZXYsICJCdXMgbWF5IGJlIHVucmVsaWFibGVcbiIpOworCX0KIAlyZXR1cm4gMDsKIH0KIAogaW50IGkyY19iaXRfYWRkX2J1cyhzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXApCiB7Ci0JaW50IGVycjsKLQotCWVyciA9IGkyY19iaXRfcHJlcGFyZV9idXMoYWRhcCk7Ci0JaWYgKGVycikKLQkJcmV0dXJuIGVycjsKLQotCXJldHVybiBpMmNfYWRkX2FkYXB0ZXIoYWRhcCk7CisJcmV0dXJuIF9faTJjX2JpdF9hZGRfYnVzKGFkYXAsIGkyY19hZGRfYWRhcHRlcik7CiB9CiBFWFBPUlRfU1lNQk9MKGkyY19iaXRfYWRkX2J1cyk7CiAKIGludCBpMmNfYml0X2FkZF9udW1iZXJlZF9idXMoc3RydWN0IGkyY19hZGFwdGVyICphZGFwKQogewotCWludCBlcnI7Ci0KLQllcnIgPSBpMmNfYml0X3ByZXBhcmVfYnVzKGFkYXApOwotCWlmIChlcnIpCi0JCXJldHVybiBlcnI7Ci0KLQlyZXR1cm4gaTJjX2FkZF9udW1iZXJlZF9hZGFwdGVyKGFkYXApOworCXJldHVybiBfX2kyY19iaXRfYWRkX2J1cyhhZGFwLCBpMmNfYWRkX251bWJlcmVkX2FkYXB0ZXIpOwogfQogRVhQT1JUX1NZTUJPTChpMmNfYml0X2FkZF9udW1iZXJlZF9idXMpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWk4MDEuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtaTgwMS5jCmluZGV4IDAyODM1Y2UuLjc5NzlhZWY3ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1pODAxLmMKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1pODAxLmMKQEAgLTcyLDYgKzcyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9hY3BpLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9kbWkuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAKIC8qIEk4MDEgU01CdXMgYWRkcmVzcyBvZmZzZXRzICovCiAjZGVmaW5lIFNNQkhTVFNUUyhwKQkoMCArIChwKS0+c21iYSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtbmZvcmNlMi5jIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1uZm9yY2UyLmMKaW5kZXggYTYwNWE1MC4uZmYxZTEyNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1uZm9yY2UyLmMKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1uZm9yY2UyLmMKQEAgLTQzMiw3ICs0MzIsNyBAQAogCiBzdGF0aWMgdm9pZCBfX2RldmV4aXQgbmZvcmNlMl9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKmRldikKIHsKLQlzdHJ1Y3QgbmZvcmNlMl9zbWJ1cyAqc21idXNlcyA9ICh2b2lkKikgcGNpX2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IG5mb3JjZTJfc21idXMgKnNtYnVzZXMgPSBwY2lfZ2V0X2RydmRhdGEoZGV2KTsKIAogCW5mb3JjZTJfc2V0X3JlZmVyZW5jZShOVUxMKTsKIAlpZiAoc21idXNlc1swXS5iYXNlKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9pMmMtY29yZS5jIGIvZHJpdmVycy9pMmMvaTJjLWNvcmUuYwppbmRleCA2YjRjYzU2Li5jN2RiNjk4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9pMmMtY29yZS5jCisrKyBiL2RyaXZlcnMvaTJjL2kyYy1jb3JlLmMKQEAgLTEzNjIsNyArMTM2Miw3IEBACiAgKgogICogUmV0dXJucyBuZWdhdGl2ZSBlcnJubywgb3IgZWxzZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4uCiAgKi8KLWludCBpMmNfbWFzdGVyX3NlbmQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgY29uc3QgY2hhciAqYnVmLCBpbnQgY291bnQpCitpbnQgaTJjX21hc3Rlcl9zZW5kKGNvbnN0IHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIGNvbnN0IGNoYXIgKmJ1ZiwgaW50IGNvdW50KQogewogCWludCByZXQ7CiAJc3RydWN0IGkyY19hZGFwdGVyICphZGFwID0gY2xpZW50LT5hZGFwdGVyOwpAQCAtMTM4OSw3ICsxMzg5LDcgQEAKICAqCiAgKiBSZXR1cm5zIG5lZ2F0aXZlIGVycm5vLCBvciBlbHNlIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZC4KICAqLwotaW50IGkyY19tYXN0ZXJfcmVjdihzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBjaGFyICpidWYsIGludCBjb3VudCkKK2ludCBpMmNfbWFzdGVyX3JlY3YoY29uc3Qgc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgY2hhciAqYnVmLCBpbnQgY291bnQpCiB7CiAJc3RydWN0IGkyY19hZGFwdGVyICphZGFwID0gY2xpZW50LT5hZGFwdGVyOwogCXN0cnVjdCBpMmNfbXNnIG1zZzsKQEAgLTE2NzksNyArMTY3OSw3IEBACiAgKiBUaGlzIGV4ZWN1dGVzIHRoZSBTTUJ1cyAicmVjZWl2ZSBieXRlIiBwcm90b2NvbCwgcmV0dXJuaW5nIG5lZ2F0aXZlIGVycm5vCiAgKiBlbHNlIHRoZSBieXRlIHJlY2VpdmVkIGZyb20gdGhlIGRldmljZS4KICAqLwotczMyIGkyY19zbWJ1c19yZWFkX2J5dGUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3MzMiBpMmNfc21idXNfcmVhZF9ieXRlKGNvbnN0IHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCiB7CiAJdW5pb24gaTJjX3NtYnVzX2RhdGEgZGF0YTsKIAlpbnQgc3RhdHVzOwpAQCAtMTY5OSw3ICsxNjk5LDcgQEAKICAqIFRoaXMgZXhlY3V0ZXMgdGhlIFNNQnVzICJzZW5kIGJ5dGUiIHByb3RvY29sLCByZXR1cm5pbmcgbmVnYXRpdmUgZXJybm8KICAqIGVsc2UgemVybyBvbiBzdWNjZXNzLgogICovCi1zMzIgaTJjX3NtYnVzX3dyaXRlX2J5dGUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggdmFsdWUpCitzMzIgaTJjX3NtYnVzX3dyaXRlX2J5dGUoY29uc3Qgc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggdmFsdWUpCiB7CiAJcmV0dXJuIGkyY19zbWJ1c194ZmVyKGNsaWVudC0+YWRhcHRlciwgY2xpZW50LT5hZGRyLCBjbGllbnQtPmZsYWdzLAogCSAgICAgICAgICAgICAgICAgICAgICBJMkNfU01CVVNfV1JJVEUsIHZhbHVlLCBJMkNfU01CVVNfQllURSwgTlVMTCk7CkBAIC0xNzE0LDcgKzE3MTQsNyBAQAogICogVGhpcyBleGVjdXRlcyB0aGUgU01CdXMgInJlYWQgYnl0ZSIgcHJvdG9jb2wsIHJldHVybmluZyBuZWdhdGl2ZSBlcnJubwogICogZWxzZSBhIGRhdGEgYnl0ZSByZWNlaXZlZCBmcm9tIHRoZSBkZXZpY2UuCiAgKi8KLXMzMiBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggY29tbWFuZCkKK3MzMiBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY29uc3Qgc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggY29tbWFuZCkKIHsKIAl1bmlvbiBpMmNfc21idXNfZGF0YSBkYXRhOwogCWludCBzdGF0dXM7CkBAIC0xNzM1LDcgKzE3MzUsOCBAQAogICogVGhpcyBleGVjdXRlcyB0aGUgU01CdXMgIndyaXRlIGJ5dGUiIHByb3RvY29sLCByZXR1cm5pbmcgbmVnYXRpdmUgZXJybm8KICAqIGVsc2UgemVybyBvbiBzdWNjZXNzLgogICovCi1zMzIgaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCBjb21tYW5kLCB1OCB2YWx1ZSkKK3MzMiBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNvbnN0IHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IGNvbW1hbmQsCisJCQkgICAgICB1OCB2YWx1ZSkKIHsKIAl1bmlvbiBpMmNfc21idXNfZGF0YSBkYXRhOwogCWRhdGEuYnl0ZSA9IHZhbHVlOwpAQCAtMTc1Myw3ICsxNzU0LDcgQEAKICAqIFRoaXMgZXhlY3V0ZXMgdGhlIFNNQnVzICJyZWFkIHdvcmQiIHByb3RvY29sLCByZXR1cm5pbmcgbmVnYXRpdmUgZXJybm8KICAqIGVsc2UgYSAxNi1iaXQgdW5zaWduZWQgIndvcmQiIHJlY2VpdmVkIGZyb20gdGhlIGRldmljZS4KICAqLwotczMyIGkyY19zbWJ1c19yZWFkX3dvcmRfZGF0YShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCBjb21tYW5kKQorczMyIGkyY19zbWJ1c19yZWFkX3dvcmRfZGF0YShjb25zdCBzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCBjb21tYW5kKQogewogCXVuaW9uIGkyY19zbWJ1c19kYXRhIGRhdGE7CiAJaW50IHN0YXR1czsKQEAgLTE3NzQsNyArMTc3NSw4IEBACiAgKiBUaGlzIGV4ZWN1dGVzIHRoZSBTTUJ1cyAid3JpdGUgd29yZCIgcHJvdG9jb2wsIHJldHVybmluZyBuZWdhdGl2ZSBlcnJubwogICogZWxzZSB6ZXJvIG9uIHN1Y2Nlc3MuCiAgKi8KLXMzMiBpMmNfc21idXNfd3JpdGVfd29yZF9kYXRhKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IGNvbW1hbmQsIHUxNiB2YWx1ZSkKK3MzMiBpMmNfc21idXNfd3JpdGVfd29yZF9kYXRhKGNvbnN0IHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IGNvbW1hbmQsCisJCQkgICAgICB1MTYgdmFsdWUpCiB7CiAJdW5pb24gaTJjX3NtYnVzX2RhdGEgZGF0YTsKIAlkYXRhLndvcmQgPSB2YWx1ZTsKQEAgLTE3OTMsNyArMTc5NSw4IEBACiAgKiBUaGlzIGV4ZWN1dGVzIHRoZSBTTUJ1cyAicHJvY2VzcyBjYWxsIiBwcm90b2NvbCwgcmV0dXJuaW5nIG5lZ2F0aXZlIGVycm5vCiAgKiBlbHNlIGEgMTYtYml0IHVuc2lnbmVkICJ3b3JkIiByZWNlaXZlZCBmcm9tIHRoZSBkZXZpY2UuCiAgKi8KLXMzMiBpMmNfc21idXNfcHJvY2Vzc19jYWxsKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IGNvbW1hbmQsIHUxNiB2YWx1ZSkKK3MzMiBpMmNfc21idXNfcHJvY2Vzc19jYWxsKGNvbnN0IHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IGNvbW1hbmQsCisJCQkgICB1MTYgdmFsdWUpCiB7CiAJdW5pb24gaTJjX3NtYnVzX2RhdGEgZGF0YTsKIAlpbnQgc3RhdHVzOwpAQCAtMTgyMSw3ICsxODI0LDcgQEAKICAqIHN1cHBvcnQgdGhpczsgaXRzIGVtdWxhdGlvbiB0aHJvdWdoIEkyQyBtZXNzYWdpbmcgcmVsaWVzIG9uIGEgc3BlY2lmaWMKICAqIG1lY2hhbmlzbSAoSTJDX01fUkVDVl9MRU4pIHdoaWNoIG1heSBub3QgYmUgaW1wbGVtZW50ZWQuCiAgKi8KLXMzMiBpMmNfc21idXNfcmVhZF9ibG9ja19kYXRhKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IGNvbW1hbmQsCitzMzIgaTJjX3NtYnVzX3JlYWRfYmxvY2tfZGF0YShjb25zdCBzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCBjb21tYW5kLAogCQkJICAgICAgdTggKnZhbHVlcykKIHsKIAl1bmlvbiBpMmNfc21idXNfZGF0YSBkYXRhOwpAQCAtMTg0OCw3ICsxODUxLDcgQEAKICAqIFRoaXMgZXhlY3V0ZXMgdGhlIFNNQnVzICJibG9jayB3cml0ZSIgcHJvdG9jb2wsIHJldHVybmluZyBuZWdhdGl2ZSBlcnJubwogICogZWxzZSB6ZXJvIG9uIHN1Y2Nlc3MuCiAgKi8KLXMzMiBpMmNfc21idXNfd3JpdGVfYmxvY2tfZGF0YShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCBjb21tYW5kLAorczMyIGkyY19zbWJ1c193cml0ZV9ibG9ja19kYXRhKGNvbnN0IHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IGNvbW1hbmQsCiAJCQkgICAgICAgdTggbGVuZ3RoLCBjb25zdCB1OCAqdmFsdWVzKQogewogCXVuaW9uIGkyY19zbWJ1c19kYXRhIGRhdGE7CkBAIC0xODY0LDcgKzE4NjcsNyBAQAogRVhQT1JUX1NZTUJPTChpMmNfc21idXNfd3JpdGVfYmxvY2tfZGF0YSk7CiAKIC8qIFJldHVybnMgdGhlIG51bWJlciBvZiByZWFkIGJ5dGVzICovCi1zMzIgaTJjX3NtYnVzX3JlYWRfaTJjX2Jsb2NrX2RhdGEoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggY29tbWFuZCwKK3MzMiBpMmNfc21idXNfcmVhZF9pMmNfYmxvY2tfZGF0YShjb25zdCBzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCBjb21tYW5kLAogCQkJCSAgdTggbGVuZ3RoLCB1OCAqdmFsdWVzKQogewogCXVuaW9uIGkyY19zbWJ1c19kYXRhIGRhdGE7CkBAIC0xODg0LDcgKzE4ODcsNyBAQAogfQogRVhQT1JUX1NZTUJPTChpMmNfc21idXNfcmVhZF9pMmNfYmxvY2tfZGF0YSk7CiAKLXMzMiBpMmNfc21idXNfd3JpdGVfaTJjX2Jsb2NrX2RhdGEoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggY29tbWFuZCwKK3MzMiBpMmNfc21idXNfd3JpdGVfaTJjX2Jsb2NrX2RhdGEoY29uc3Qgc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggY29tbWFuZCwKIAkJCQkgICB1OCBsZW5ndGgsIGNvbnN0IHU4ICp2YWx1ZXMpCiB7CiAJdW5pb24gaTJjX3NtYnVzX2RhdGEgZGF0YTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL211eGVzL0tjb25maWcgYi9kcml2ZXJzL2kyYy9tdXhlcy9LY29uZmlnCmluZGV4IDRkOTFkODAuLjkwYjdhMDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL211eGVzL0tjb25maWcKKysrIGIvZHJpdmVycy9pMmMvbXV4ZXMvS2NvbmZpZwpAQCAtNSw2ICs1LDE4IEBACiBtZW51ICJNdWx0aXBsZXhlciBJMkMgQ2hpcCBzdXBwb3J0IgogCWRlcGVuZHMgb24gSTJDX01VWAogCitjb25maWcgSTJDX01VWF9HUElPCisJdHJpc3RhdGUgIkdQSU8tYmFzZWQgSTJDIG11bHRpcGxleGVyIgorCWRlcGVuZHMgb24gR0VORVJJQ19HUElPCisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgdG8gdGhpcyBvcHRpb24sIHN1cHBvcnQgd2lsbCBiZSBpbmNsdWRlZCBmb3IgYQorCSAgR1BJTyBiYXNlZCBJMkMgbXVsdGlwbGV4ZXIuIFRoaXMgZHJpdmVyIHByb3ZpZGVzIGFjY2VzcyB0bworCSAgSTJDIGJ1c3NlcyBjb25uZWN0ZWQgdGhyb3VnaCBhIE1VWCwgd2hpY2ggaXMgY29udHJvbGxlZAorCSAgdGhyb3VnaCBHUElPIHBpbnMuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIGdwaW8taTJjbXV4LgorCiBjb25maWcgSTJDX01VWF9QQ0E5NTQxCiAJdHJpc3RhdGUgIk5YUCBQQ0E5NTQxIEkyQyBNYXN0ZXIgU2VsZWN0b3IiCiAJZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL211eGVzL01ha2VmaWxlIGIvZHJpdmVycy9pMmMvbXV4ZXMvTWFrZWZpbGUKaW5kZXggZDc0MzgwNi4uNDY0MDQzNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvbXV4ZXMvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9pMmMvbXV4ZXMvTWFrZWZpbGUKQEAgLTEsNiArMSw3IEBACiAjCiAjIE1ha2VmaWxlIGZvciBtdWx0aXBsZXhlciBJMkMgY2hpcCBkcml2ZXJzLgogCitvYmotJChDT05GSUdfSTJDX01VWF9HUElPKQkrPSBncGlvLWkyY211eC5vCiBvYmotJChDT05GSUdfSTJDX01VWF9QQ0E5NTQxKQkrPSBwY2E5NTQxLm8KIG9iai0kKENPTkZJR19JMkNfTVVYX1BDQTk1NHgpCSs9IHBjYTk1NHgubwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9tdXhlcy9ncGlvLWkyY211eC5jIGIvZHJpdmVycy9pMmMvbXV4ZXMvZ3Bpby1pMmNtdXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjZjZTYyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pMmMvbXV4ZXMvZ3Bpby1pMmNtdXguYwpAQCAtMCwwICsxLDE4NCBAQAorLyoKKyAqIEkyQyBtdWx0aXBsZXhlciB1c2luZyBHUElPIEFQSQorICoKKyAqIFBldGVyIEtvcnNnYWFyZCA8cGV0ZXIua29yc2dhYXJkQGJhcmNvLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMtbXV4Lmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby1pMmNtdXguaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKworc3RydWN0IGdwaW9tdXggeworCXN0cnVjdCBpMmNfYWRhcHRlciAqcGFyZW50OworCXN0cnVjdCBpMmNfYWRhcHRlciAqKmFkYXA7IC8qIGNoaWxkIGJ1c3NlcyAqLworCXN0cnVjdCBncGlvX2kyY211eF9wbGF0Zm9ybV9kYXRhIGRhdGE7Cit9OworCitzdGF0aWMgdm9pZCBncGlvbXV4X3NldChjb25zdCBzdHJ1Y3QgZ3Bpb211eCAqbXV4LCB1bnNpZ25lZCB2YWwpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbXV4LT5kYXRhLm5fZ3Bpb3M7IGkrKykKKwkJZ3Bpb19zZXRfdmFsdWUobXV4LT5kYXRhLmdwaW9zW2ldLCB2YWwgJiAoMSA8PCBpKSk7Cit9CisKK3N0YXRpYyBpbnQgZ3Bpb211eF9zZWxlY3Qoc3RydWN0IGkyY19hZGFwdGVyICphZGFwLCB2b2lkICpkYXRhLCB1MzIgY2hhbikKK3sKKwlzdHJ1Y3QgZ3Bpb211eCAqbXV4ID0gZGF0YTsKKworCWdwaW9tdXhfc2V0KG11eCwgbXV4LT5kYXRhLnZhbHVlc1tjaGFuXSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBncGlvbXV4X2Rlc2VsZWN0KHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCwgdm9pZCAqZGF0YSwgdTMyIGNoYW4pCit7CisJc3RydWN0IGdwaW9tdXggKm11eCA9IGRhdGE7CisKKwlncGlvbXV4X3NldChtdXgsIG11eC0+ZGF0YS5pZGxlKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBncGlvbXV4X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGdwaW9tdXggKm11eDsKKwlzdHJ1Y3QgZ3Bpb19pMmNtdXhfcGxhdGZvcm1fZGF0YSAqcGRhdGE7CisJc3RydWN0IGkyY19hZGFwdGVyICpwYXJlbnQ7CisJaW50ICgqZGVzZWxlY3QpIChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKiwgdm9pZCAqLCB1MzIpOworCXVuc2lnbmVkIGluaXRpYWxfc3RhdGU7CisJaW50IGksIHJldDsKKworCXBkYXRhID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJaWYgKCFwZGF0YSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJNaXNzaW5nIHBsYXRmb3JtIGRhdGFcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlwYXJlbnQgPSBpMmNfZ2V0X2FkYXB0ZXIocGRhdGEtPnBhcmVudCk7CisJaWYgKCFwYXJlbnQpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiUGFyZW50IGFkYXB0ZXIgKCVkKSBub3QgZm91bmRcbiIsCisJCQlwZGF0YS0+cGFyZW50KTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJbXV4ID0ga3phbGxvYyhzaXplb2YoKm11eCksIEdGUF9LRVJORUwpOworCWlmICghbXV4KSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gYWxsb2NfZmFpbGVkOworCX0KKworCW11eC0+cGFyZW50ID0gcGFyZW50OworCW11eC0+ZGF0YSA9ICpwZGF0YTsKKwltdXgtPmFkYXAgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKikgKiBwZGF0YS0+bl92YWx1ZXMsCisJCQkgICAgR0ZQX0tFUk5FTCk7CisJaWYgKCFtdXgtPmFkYXApIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBhbGxvY19mYWlsZWQyOworCX0KKworCWlmIChwZGF0YS0+aWRsZSAhPSBHUElPX0kyQ01VWF9OT19JRExFKSB7CisJCWluaXRpYWxfc3RhdGUgPSBwZGF0YS0+aWRsZTsKKwkJZGVzZWxlY3QgPSBncGlvbXV4X2Rlc2VsZWN0OworCX0gZWxzZSB7CisJCWluaXRpYWxfc3RhdGUgPSBwZGF0YS0+dmFsdWVzWzBdOworCQlkZXNlbGVjdCA9IE5VTEw7CisJfQorCisJZm9yIChpID0gMDsgaSA8IHBkYXRhLT5uX2dwaW9zOyBpKyspIHsKKwkJcmV0ID0gZ3Bpb19yZXF1ZXN0KHBkYXRhLT5ncGlvc1tpXSwgImdwaW8taTJjbXV4Iik7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycl9yZXF1ZXN0X2dwaW87CisJCWdwaW9fZGlyZWN0aW9uX291dHB1dChwZGF0YS0+Z3Bpb3NbaV0sCisJCQkJICAgICAgaW5pdGlhbF9zdGF0ZSAmICgxIDw8IGkpKTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgcGRhdGEtPm5fdmFsdWVzOyBpKyspIHsKKwkJdTMyIG5yID0gcGRhdGEtPmJhc2VfbnIgPyAocGRhdGEtPmJhc2VfbnIgKyBpKSA6IDA7CisKKwkJbXV4LT5hZGFwW2ldID0gaTJjX2FkZF9tdXhfYWRhcHRlcihwYXJlbnQsIG11eCwgbnIsIGksCisJCQkJCQkgICBncGlvbXV4X3NlbGVjdCwgZGVzZWxlY3QpOworCQlpZiAoIW11eC0+YWRhcFtpXSkgeworCQkJcmV0ID0gLUVOT0RFVjsKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwgIkZhaWxlZCB0byBhZGQgYWRhcHRlciAlZFxuIiwgaSk7CisJCQlnb3RvIGFkZF9hZGFwdGVyX2ZhaWxlZDsKKwkJfQorCX0KKworCWRldl9pbmZvKCZwZGV2LT5kZXYsICIlZCBwb3J0IG11eCBvbiAlcyBhZGFwdGVyXG4iLAorCQkgcGRhdGEtPm5fdmFsdWVzLCBwYXJlbnQtPm5hbWUpOworCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgbXV4KTsKKworCXJldHVybiAwOworCithZGRfYWRhcHRlcl9mYWlsZWQ6CisJZm9yICg7IGkgPiAwOyBpLS0pCisJCWkyY19kZWxfbXV4X2FkYXB0ZXIobXV4LT5hZGFwW2kgLSAxXSk7CisJaSA9IHBkYXRhLT5uX2dwaW9zOworZXJyX3JlcXVlc3RfZ3BpbzoKKwlmb3IgKDsgaSA+IDA7IGktLSkKKwkJZ3Bpb19mcmVlKHBkYXRhLT5ncGlvc1tpIC0gMV0pOworCWtmcmVlKG11eC0+YWRhcCk7CithbGxvY19mYWlsZWQyOgorCWtmcmVlKG11eCk7CithbGxvY19mYWlsZWQ6CisJaTJjX3B1dF9hZGFwdGVyKHBhcmVudCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBncGlvbXV4X3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBncGlvbXV4ICptdXggPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBtdXgtPmRhdGEubl92YWx1ZXM7IGkrKykKKwkJaTJjX2RlbF9tdXhfYWRhcHRlcihtdXgtPmFkYXBbaV0pOworCisJZm9yIChpID0gMDsgaSA8IG11eC0+ZGF0YS5uX2dwaW9zOyBpKyspCisJCWdwaW9fZnJlZShtdXgtPmRhdGEuZ3Bpb3NbaV0pOworCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisJaTJjX3B1dF9hZGFwdGVyKG11eC0+cGFyZW50KTsKKwlrZnJlZShtdXgtPmFkYXApOworCWtmcmVlKG11eCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgZ3Bpb211eF9kcml2ZXIgPSB7CisJLnByb2JlCT0gZ3Bpb211eF9wcm9iZSwKKwkucmVtb3ZlCT0gX19kZXZleGl0X3AoZ3Bpb211eF9yZW1vdmUpLAorCS5kcml2ZXIJPSB7CisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCQkubmFtZQk9ICJncGlvLWkyY211eCIsCisJfSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGdwaW9tdXhfaW5pdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmdwaW9tdXhfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGdwaW9tdXhfZXhpdCh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZncGlvbXV4X2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGdwaW9tdXhfaW5pdCk7Cittb2R1bGVfZXhpdChncGlvbXV4X2V4aXQpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIkdQSU8tYmFzZWQgSTJDIG11bHRpcGxleGVyIGRyaXZlciIpOworTU9EVUxFX0FVVEhPUigiUGV0ZXIgS29yc2dhYXJkIDxwZXRlci5rb3JzZ2FhcmRAYmFyY28uY29tPiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTpncGlvLWkyY211eCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2N4Z2IzL2N4aW9faGFsLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvY3hnYjMvY3hpb19oYWwuYwppbmRleCAwOWRkYTBiLi5jM2Y1YWNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvY3hnYjMvY3hpb19oYWwuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvY3hnYjMvY3hpb19oYWwuYwpAQCAtMTg5LDYgKzE4OSw3IEBACiAJcmV0dXJuIChyZGV2X3AtPnQzY2Rldl9wLT5jdGwocmRldl9wLT50M2NkZXZfcCwgUkRNQV9DUV9TRVRVUCwgJnNldHVwKSk7CiB9CiAKKyNpZmRlZiBub3R5ZXQKIGludCBjeGlvX3Jlc2l6ZV9jcShzdHJ1Y3QgY3hpb19yZGV2ICpyZGV2X3AsIHN0cnVjdCB0M19jcSAqY3EpCiB7CiAJc3RydWN0IHJkbWFfY3Ffc2V0dXAgc2V0dXA7CkBAIC0yMDAsNiArMjAxLDcgQEAKIAlzZXR1cC5vdmZsX21vZGUgPSAxOwogCXJldHVybiAocmRldl9wLT50M2NkZXZfcC0+Y3RsKHJkZXZfcC0+dDNjZGV2X3AsIFJETUFfQ1FfU0VUVVAsICZzZXR1cCkpOwogfQorI2VuZGlmCiAKIHN0YXRpYyB1MzIgZ2V0X3FwaWQoc3RydWN0IGN4aW9fcmRldiAqcmRldl9wLCBzdHJ1Y3QgY3hpb191Y29udGV4dCAqdWN0eCkKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9jeGdiMy9pd2NoX3Byb3ZpZGVyLmggYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvY3hnYjMvaXdjaF9wcm92aWRlci5oCmluZGV4IGEyMzdkNDkuLmM1NDA2ZGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9jeGdiMy9pd2NoX3Byb3ZpZGVyLmgKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2N4Z2IzL2l3Y2hfcHJvdmlkZXIuaApAQCAtMzM1LDggKzMzNSw2IEBACiBpbnQgaXdjaF9wb3N0X3piX3JlYWQoc3RydWN0IGl3Y2hfcXAgKnFocCk7CiBpbnQgaXdjaF9yZWdpc3Rlcl9kZXZpY2Uoc3RydWN0IGl3Y2hfZGV2ICpkZXYpOwogdm9pZCBpd2NoX3VucmVnaXN0ZXJfZGV2aWNlKHN0cnVjdCBpd2NoX2RldiAqZGV2KTsKLWludCBpd2NoX3F1aWVzY2VfcXBzKHN0cnVjdCBpd2NoX2NxICpjaHApOwotaW50IGl3Y2hfcmVzdW1lX3FwcyhzdHJ1Y3QgaXdjaF9jcSAqY2hwKTsKIHZvaWQgc3RvcF9yZWFkX3JlcF90aW1lcihzdHJ1Y3QgaXdjaF9xcCAqcWhwKTsKIGludCBpd2NoX3JlZ2lzdGVyX21lbShzdHJ1Y3QgaXdjaF9kZXYgKnJocCwgc3RydWN0IGl3Y2hfcGQgKnBocCwKIAkJICAgICAgc3RydWN0IGl3Y2hfbXIgKm1ocCwgaW50IHNoaWZ0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9jeGdiMy9pd2NoX3FwLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvY3hnYjMvaXdjaF9xcC5jCmluZGV4IDA5OTMxMzcuLjFiNGNkMDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9jeGdiMy9pd2NoX3FwLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2N4Z2IzL2l3Y2hfcXAuYwpAQCAtMTE0OSw1OSArMTE0OSwzIEBACiAJUERCRygiJXMgZXhpdCBzdGF0ZSAlZFxuIiwgX19mdW5jX18sIHFocC0+YXR0ci5zdGF0ZSk7CiAJcmV0dXJuIHJldDsKIH0KLQotc3RhdGljIGludCBxdWllc2NlX3FwKHN0cnVjdCBpd2NoX3FwICpxaHApCi17Ci0Jc3Bpbl9sb2NrX2lycSgmcWhwLT5sb2NrKTsKLQlpd2NoX3F1aWVzY2VfdGlkKHFocC0+ZXApOwotCXFocC0+ZmxhZ3MgfD0gUVBfUVVJRVNDRUQ7Ci0Jc3Bpbl91bmxvY2tfaXJxKCZxaHAtPmxvY2spOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHJlc3VtZV9xcChzdHJ1Y3QgaXdjaF9xcCAqcWhwKQotewotCXNwaW5fbG9ja19pcnEoJnFocC0+bG9jayk7Ci0JaXdjaF9yZXN1bWVfdGlkKHFocC0+ZXApOwotCXFocC0+ZmxhZ3MgJj0gflFQX1FVSUVTQ0VEOwotCXNwaW5fdW5sb2NrX2lycSgmcWhwLT5sb2NrKTsKLQlyZXR1cm4gMDsKLX0KLQotaW50IGl3Y2hfcXVpZXNjZV9xcHMoc3RydWN0IGl3Y2hfY3EgKmNocCkKLXsKLQlpbnQgaTsKLQlzdHJ1Y3QgaXdjaF9xcCAqcWhwOwotCi0JZm9yIChpPTA7IGkgPCBUM19NQVhfTlVNX1FQOyBpKyspIHsKLQkJcWhwID0gZ2V0X3FocChjaHAtPnJocCwgaSk7Ci0JCWlmICghcWhwKQotCQkJY29udGludWU7Ci0JCWlmICgocWhwLT5hdHRyLnJjcSA9PSBjaHAtPmNxLmNxaWQpICYmICFxcF9xdWllc2NlZChxaHApKSB7Ci0JCQlxdWllc2NlX3FwKHFocCk7Ci0JCQljb250aW51ZTsKLQkJfQotCQlpZiAoKHFocC0+YXR0ci5zY3EgPT0gY2hwLT5jcS5jcWlkKSAmJiAhcXBfcXVpZXNjZWQocWhwKSkKLQkJCXF1aWVzY2VfcXAocWhwKTsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLWludCBpd2NoX3Jlc3VtZV9xcHMoc3RydWN0IGl3Y2hfY3EgKmNocCkKLXsKLQlpbnQgaTsKLQlzdHJ1Y3QgaXdjaF9xcCAqcWhwOwotCi0JZm9yIChpPTA7IGkgPCBUM19NQVhfTlVNX1FQOyBpKyspIHsKLQkJcWhwID0gZ2V0X3FocChjaHAtPnJocCwgaSk7Ci0JCWlmICghcWhwKQotCQkJY29udGludWU7Ci0JCWlmICgocWhwLT5hdHRyLnJjcSA9PSBjaHAtPmNxLmNxaWQpICYmIHFwX3F1aWVzY2VkKHFocCkpIHsKLQkJCXJlc3VtZV9xcChxaHApOwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKChxaHAtPmF0dHIuc2NxID09IGNocC0+Y3EuY3FpZCkgJiYgcXBfcXVpZXNjZWQocWhwKSkKLQkJCXJlc3VtZV9xcChxaHApOwotCX0KLQlyZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9jeGdiNC9pd19jeGdiNC5oIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2N4Z2I0L2l3X2N4Z2I0LmgKaW5kZXggMTYwMzJjZC4uY2M2MDBjMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2N4Z2I0L2l3X2N4Z2I0LmgKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2N4Z2I0L2l3X2N4Z2I0LmgKQEAgLTc2MCw3ICs3NjAsNiBAQAogaW50IGM0aXdfZmx1c2hfc3Eoc3RydWN0IHQ0X3dxICp3cSwgc3RydWN0IHQ0X2NxICpjcSwgaW50IGNvdW50KTsKIGludCBjNGl3X2V2X2hhbmRsZXIoc3RydWN0IGM0aXdfZGV2ICpybmljcCwgdTMyIHFpZCk7CiB1MTYgYzRpd19ycWVzX3Bvc3RlZChzdHJ1Y3QgYzRpd19xcCAqcWhwKTsKLWludCBjNGl3X3Bvc3RfemJfcmVhZChzdHJ1Y3QgYzRpd19xcCAqcWhwKTsKIGludCBjNGl3X3Bvc3RfdGVybWluYXRlKHN0cnVjdCBjNGl3X3FwICpxaHAsIHN0cnVjdCB0NF9jcWUgKmVycl9jcWUpOwogdTMyIGM0aXdfZ2V0X2NxaWQoc3RydWN0IGM0aXdfcmRldiAqcmRldiwgc3RydWN0IGM0aXdfZGV2X3Vjb250ZXh0ICp1Y3R4KTsKIHZvaWQgYzRpd19wdXRfY3FpZChzdHJ1Y3QgYzRpd19yZGV2ICpyZGV2LCB1MzIgcWlkLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2N4Z2I0L3FwLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvY3hnYjQvcXAuYwppbmRleCAwNTdjYjI1Li4yMDgwMDkwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvY3hnYjQvcXAuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvY3hnYjQvcXAuYwpAQCAtODkyLDM2ICs4OTIsNiBAQAogCX0KIH0KIAotaW50IGM0aXdfcG9zdF96Yl9yZWFkKHN0cnVjdCBjNGl3X3FwICpxaHApCi17Ci0JdW5pb24gdDRfd3IgKndxZTsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwotCXU4IGxlbjE2OwotCi0JUERCRygiJXMgZW50ZXJcbiIsIF9fZnVuY19fKTsKLQlza2IgPSBhbGxvY19za2IoNDAsIEdGUF9LRVJORUwpOwotCWlmICghc2tiKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXMgY2Fubm90IHNlbmQgemJfcmVhZCEhXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQlzZXRfd3JfdHhxKHNrYiwgQ1BMX1BSSU9SSVRZX0RBVEEsIHFocC0+ZXAtPnR4cV9pZHgpOwotCi0Jd3FlID0gKHVuaW9uIHQ0X3dyICopc2tiX3B1dChza2IsIHNpemVvZiB3cWUtPnJlYWQpOwotCW1lbXNldCh3cWUsIDAsIHNpemVvZiB3cWUtPnJlYWQpOwotCXdxZS0+cmVhZC5yMiA9IGNwdV90b19iZTY0KDApOwotCXdxZS0+cmVhZC5zdGFnX3NpbmsgPSBjcHVfdG9fYmUzMigxKTsKLQl3cWUtPnJlYWQudG9fc2lua19oaSA9IGNwdV90b19iZTMyKDApOwotCXdxZS0+cmVhZC50b19zaW5rX2xvID0gY3B1X3RvX2JlMzIoMSk7Ci0Jd3FlLT5yZWFkLnN0YWdfc3JjID0gY3B1X3RvX2JlMzIoMSk7Ci0Jd3FlLT5yZWFkLnBsZW4gPSBjcHVfdG9fYmUzMigwKTsKLQl3cWUtPnJlYWQudG9fc3JjX2hpID0gY3B1X3RvX2JlMzIoMCk7Ci0Jd3FlLT5yZWFkLnRvX3NyY19sbyA9IGNwdV90b19iZTMyKDEpOwotCWxlbjE2ID0gRElWX1JPVU5EX1VQKHNpemVvZiB3cWUtPnJlYWQsIDE2KTsKLQlpbml0X3dyX2hkcih3cWUsIDAsIEZXX1JJX1JETUFfUkVBRF9XUiwgRldfUklfQ09NUExFVElPTl9GTEFHLCBsZW4xNik7Ci0KLQlyZXR1cm4gYzRpd19vZmxkX3NlbmQoJnFocC0+cmhwLT5yZGV2LCBza2IpOwotfQotCiBzdGF0aWMgdm9pZCBwb3N0X3Rlcm1pbmF0ZShzdHJ1Y3QgYzRpd19xcCAqcWhwLCBzdHJ1Y3QgdDRfY3FlICplcnJfY3FlLAogCQkJICAgZ2ZwX3QgZ2ZwKQogewpAQCAtMTAyOSw3ICs5OTksNiBAQAogCXdxZS0+Y29va2llID0gKHVuc2lnbmVkIGxvbmcpICZlcC0+Y29tLndyX3dhaXQ7CiAKIAl3cWUtPnUuZmluaS50eXBlID0gRldfUklfVFlQRV9GSU5JOwotCWM0aXdfaW5pdF93cl93YWl0KCZlcC0+Y29tLndyX3dhaXQpOwogCXJldCA9IGM0aXdfb2ZsZF9zZW5kKCZyaHAtPnJkZXYsIHNrYik7CiAJaWYgKHJldCkKIAkJZ290byBvdXQ7CkBAIC0xMTI1LDcgKzEwOTQsNiBAQAogCWlmIChxaHAtPmF0dHIubXBhX2F0dHIuaW5pdGlhdG9yKQogCQlidWlsZF9ydHJfbXNnKHFocC0+YXR0ci5tcGFfYXR0ci5wMnBfdHlwZSwgJndxZS0+dS5pbml0KTsKIAotCWM0aXdfaW5pdF93cl93YWl0KCZxaHAtPmVwLT5jb20ud3Jfd2FpdCk7CiAJcmV0ID0gYzRpd19vZmxkX3NlbmQoJnJocC0+cmRldiwgc2tiKTsKIAlpZiAocmV0KQogCQlnb3RvIG91dDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pcGF0aC9pcGF0aF9kcml2ZXIuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pcGF0aC9pcGF0aF9kcml2ZXIuYwppbmRleCA3NjVmMGZjLi5iMzNmMDQ1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvaXBhdGgvaXBhdGhfZHJpdmVyLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2lwYXRoL2lwYXRoX2RyaXZlci5jCkBAIC01MzAsOSArNTMwLDggQEAKIAlmb3IgKGogPSAwOyBqIDwgNjsgaisrKSB7CiAJCWlmICghcGRldi0+cmVzb3VyY2Vbal0uc3RhcnQpCiAJCQljb250aW51ZTsKLQkJaXBhdGhfY2RiZyhWRVJCT1NFLCAiQkFSICVkIHN0YXJ0ICVsbHgsIGVuZCAlbGx4LCBsZW4gJWxseFxuIiwKLQkJCSAgIGosICh1bnNpZ25lZCBsb25nIGxvbmcpcGRldi0+cmVzb3VyY2Vbal0uc3RhcnQsCi0JCQkgICAodW5zaWduZWQgbG9uZyBsb25nKXBkZXYtPnJlc291cmNlW2pdLmVuZCwKKwkJaXBhdGhfY2RiZyhWRVJCT1NFLCAiQkFSICVkICVwUiwgbGVuICVsbHhcbiIsCisJCQkgICBqLCAmcGRldi0+cmVzb3VyY2Vbal0sCiAJCQkgICAodW5zaWduZWQgbG9uZyBsb25nKXBjaV9yZXNvdXJjZV9sZW4ocGRldiwgaikpOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L21seDQvY3EuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tbHg0L2NxLmMKaW5kZXggNWEyMTlhMi4uZThkZjE1NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L21seDQvY3EuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbWx4NC9jcS5jCkBAIC0zOTcsMTAgKzM5NywxNCBAQAogCQljcS0+cmVzaXplX2J1ZiA9IE5VTEw7CiAJCWNxLT5yZXNpemVfdW1lbSA9IE5VTEw7CiAJfSBlbHNlIHsKKwkJc3RydWN0IG1seDRfaWJfY3FfYnVmIHRtcF9idWY7CisJCWludCB0bXBfY3FlID0gMDsKKwogCQlzcGluX2xvY2tfaXJxKCZjcS0+bG9jayk7CiAJCWlmIChjcS0+cmVzaXplX2J1ZikgewogCQkJbWx4NF9pYl9jcV9yZXNpemVfY29weV9jcWVzKGNxKTsKLQkJCW1seDRfaWJfZnJlZV9jcV9idWYoZGV2LCAmY3EtPmJ1ZiwgY3EtPmliY3EuY3FlKTsKKwkJCXRtcF9idWYgPSBjcS0+YnVmOworCQkJdG1wX2NxZSA9IGNxLT5pYmNxLmNxZTsKIAkJCWNxLT5idWYgICAgICA9IGNxLT5yZXNpemVfYnVmLT5idWY7CiAJCQljcS0+aWJjcS5jcWUgPSBjcS0+cmVzaXplX2J1Zi0+Y3FlOwogCkBAIC00MDgsNiArNDEyLDkgQEAKIAkJCWNxLT5yZXNpemVfYnVmID0gTlVMTDsKIAkJfQogCQlzcGluX3VubG9ja19pcnEoJmNxLT5sb2NrKTsKKworCQlpZiAodG1wX2NxZSkKKwkJCW1seDRfaWJfZnJlZV9jcV9idWYoZGV2LCAmdG1wX2J1ZiwgdG1wX2NxZSk7CiAJfQogCiAJZ290byBvdXQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbWx4NC9tYWQuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tbHg0L21hZC5jCmluZGV4IGM5YThkZDYuLjU3ZmZhNTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tbHg0L21hZC5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tbHg0L21hZC5jCkBAIC0yMTEsNiArMjExLDggQEAKIAlpZiAoYWdlbnQpIHsKIAkJc2VuZF9idWYgPSBpYl9jcmVhdGVfc2VuZF9tYWQoYWdlbnQsIHFwbiwgMCwgMCwgSUJfTUdNVF9NQURfSERSLAogCQkJCQkgICAgICBJQl9NR01UX01BRF9EQVRBLCBHRlBfQVRPTUlDKTsKKwkJaWYgKElTX0VSUihzZW5kX2J1ZikpCisJCQlyZXR1cm47CiAJCS8qCiAJCSAqIFdlIHJlbHkgaGVyZSBvbiB0aGUgZmFjdCB0aGF0IE1MWCBRUHMgZG9uJ3QgdXNlIHRoZQogCQkgKiBhZGRyZXNzIGhhbmRsZSBhZnRlciB0aGUgc2VuZCBpcyBwb3N0ZWQgKHRoaXMgaXMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV9tYWQuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV9tYWQuYwppbmRleCA1NjQ4NjU5Li4wM2E1OTUzNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX21hZC5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV9tYWQuYwpAQCAtMTcxLDYgKzE3MSw4IEBACiAJaWYgKGFnZW50KSB7CiAJCXNlbmRfYnVmID0gaWJfY3JlYXRlX3NlbmRfbWFkKGFnZW50LCBxcG4sIDAsIDAsIElCX01HTVRfTUFEX0hEUiwKIAkJCQkJICAgICAgSUJfTUdNVF9NQURfREFUQSwgR0ZQX0FUT01JQyk7CisJCWlmIChJU19FUlIoc2VuZF9idWYpKQorCQkJcmV0dXJuOwogCQkvKgogCQkgKiBXZSByZWx5IGhlcmUgb24gdGhlIGZhY3QgdGhhdCBNTFggUVBzIGRvbid0IHVzZSB0aGUKIAkJICogYWRkcmVzcyBoYW5kbGUgYWZ0ZXIgdGhlIHNlbmQgaXMgcG9zdGVkICh0aGlzIGlzCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbmVzL25lc19uaWMuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9uZXMvbmVzX25pYy5jCmluZGV4IDM4OTJlMmMuLjVhNGMzNjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9uZXMvbmVzX25pYy5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9uZXMvbmVzX25pYy5jCkBAIC05MDgsOCArOTA4LDggQEAKIAkJCQkJbmVzdm5pYy0+bmljX2luZGV4ICYmCiAJCQkJCW1jX2luZGV4IDwgbWF4X3BmdF9lbnRyaWVzX2F2YWlhYmxlKSB7CiAJCQkJCQluZXNfZGVidWcoTkVTX0RCR19OSUNfUlgsCi0JCQkJCSJtY19pbmRleD0lZCBza2lwcGluZyBuaWNfaW5kZXg9JWQsXAotCQkJCQl1c2VkIGZvcj0lZCBcbiIsIG1jX2luZGV4LAorCQkJCQkibWNfaW5kZXg9JWQgc2tpcHBpbmcgbmljX2luZGV4PSVkLCAiCisJCQkJCSJ1c2VkIGZvcj0lZCBcbiIsIG1jX2luZGV4LAogCQkJCQluZXN2bmljLT5uaWNfaW5kZXgsCiAJCQkJCW5lc2FkYXB0ZXItPnBmdF9tY2FzdF9tYXBbbWNfaW5kZXhdKTsKIAkJCQltY19pbmRleCsrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWIuaCBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliLmgKaW5kZXggNjRjOWU3ZC4uNzMyMjVlZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWIuaAorKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYi5oCkBAIC03NjYsNyArNzY2LDcgQEAKIAl2b2lkICgqZl9zZG1hX2h3X3N0YXJ0X3VwKShzdHJ1Y3QgcWliX3Bwb3J0ZGF0YSAqKTsKIAl2b2lkICgqZl9zZG1hX2luaXRfZWFybHkpKHN0cnVjdCBxaWJfcHBvcnRkYXRhICopOwogCXZvaWQgKCpmX3NldF9jbnRyX3NhbXBsZSkoc3RydWN0IHFpYl9wcG9ydGRhdGEgKiwgdTMyLCB1MzIpOwotCXZvaWQgKCpmX3VwZGF0ZV91c3JoZWFkKShzdHJ1Y3QgcWliX2N0eHRkYXRhICosIHU2NCwgdTMyLCB1MzIpOworCXZvaWQgKCpmX3VwZGF0ZV91c3JoZWFkKShzdHJ1Y3QgcWliX2N0eHRkYXRhICosIHU2NCwgdTMyLCB1MzIsIHUzMik7CiAJdTMyICgqZl9oZHJxZW1wdHkpKHN0cnVjdCBxaWJfY3R4dGRhdGEgKik7CiAJdTY0ICgqZl9wb3J0Y250cikoc3RydWN0IHFpYl9wcG9ydGRhdGEgKiwgdTMyKTsKIAl1MzIgKCpmX3JlYWRfY250cnMpKHN0cnVjdCBxaWJfZGV2ZGF0YSAqLCBsb2ZmX3QsIGNoYXIgKiosCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl9jcS5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfY3EuYwppbmRleCBhODZjYmY4Li41MjQ2YWE0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl9jcS5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX2NxLmMKQEAgLTEwMCw3ICsxMDAsOCBAQAogCXdjLT5oZWFkID0gbmV4dDsKIAogCWlmIChjcS0+bm90aWZ5ID09IElCX0NRX05FWFRfQ09NUCB8fAotCSAgICAoY3EtPm5vdGlmeSA9PSBJQl9DUV9TT0xJQ0lURUQgJiYgc29saWNpdGVkKSkgeworCSAgICAoY3EtPm5vdGlmeSA9PSBJQl9DUV9TT0xJQ0lURUQgJiYKKwkgICAgIChzb2xpY2l0ZWQgfHwgZW50cnktPnN0YXR1cyAhPSBJQl9XQ19TVUNDRVNTKSkpIHsKIAkJY3EtPm5vdGlmeSA9IElCX0NRX05PTkU7CiAJCWNxLT50cmlnZ2VyZWQrKzsKIAkJLyoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX2RyaXZlci5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfZHJpdmVyLmMKaW5kZXggOWNkMTkzNi4uMjNlNTg0ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfZHJpdmVyLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfZHJpdmVyLmMKQEAgLTcxLDYgKzcxLDExIEBACiAgKi8KICNkZWZpbmUgUUlCX1BJT19NQVhJQkhEUiAxMjgKIAorLyoKKyAqIFFJQl9NQVhfUEtUX1JDViBpcyB0aGUgbWF4ICMgaWYgcGFja2V0cyBwcm9jZXNzZWQgcGVyIHJlY2VpdmUgaW50ZXJydXB0LgorICovCisjZGVmaW5lIFFJQl9NQVhfUEtUX1JFQ1YgNjQKKwogc3RydWN0IHFsb2dpY19pYl9zdGF0cyBxaWJfc3RhdHM7CiAKIGNvbnN0IGNoYXIgKnFpYl9nZXRfdW5pdF9uYW1lKGludCB1bml0KQpAQCAtMjg0LDE0ICsyODksMTQ3IEBACiAgKiBSZXR1cm5zIDEgaWYgZXJyb3Igd2FzIGEgQ1JDLCBlbHNlIDAuCiAgKiBOZWVkZWQgZm9yIHNvbWUgY2hpcCdzIHN5bnRoZXNpemVkIGVycm9yIGNvdW50ZXJzLgogICovCi1zdGF0aWMgdTMyIHFpYl9yY3ZfaGRyZXJyKHN0cnVjdCBxaWJfcHBvcnRkYXRhICpwcGQsIHUzMiBjdHh0LAotCQkJICB1MzIgZWZsYWdzLCB1MzIgbCwgdTMyIGV0YWlsLCBfX2xlMzIgKnJoZl9hZGRyLAotCQkJICBzdHJ1Y3QgcWliX21lc3NhZ2VfaGVhZGVyICpoZHIpCitzdGF0aWMgdTMyIHFpYl9yY3ZfaGRyZXJyKHN0cnVjdCBxaWJfY3R4dGRhdGEgKnJjZCwgc3RydWN0IHFpYl9wcG9ydGRhdGEgKnBwZCwKKwkJCSAgdTMyIGN0eHQsIHUzMiBlZmxhZ3MsIHUzMiBsLCB1MzIgZXRhaWwsCisJCQkgIF9fbGUzMiAqcmhmX2FkZHIsIHN0cnVjdCBxaWJfbWVzc2FnZV9oZWFkZXIgKnJoZHIpCiB7CiAJdTMyIHJldCA9IDA7CiAKIAlpZiAoZWZsYWdzICYgKFFMT0dJQ19JQl9SSEZfSF9JQ1JDRVJSIHwgUUxPR0lDX0lCX1JIRl9IX1ZDUkNFUlIpKQogCQlyZXQgPSAxOworCWVsc2UgaWYgKGVmbGFncyA9PSBRTE9HSUNfSUJfUkhGX0hfVElERVJSKSB7CisJCS8qIEZvciBUSURFUlIgYW5kIFJDIFFQcyBwcmVtcHRpdmVseSBzY2hlZHVsZSBhIE5BSyAqLworCQlzdHJ1Y3QgcWliX2liX2hlYWRlciAqaGRyID0gKHN0cnVjdCBxaWJfaWJfaGVhZGVyICopIHJoZHI7CisJCXN0cnVjdCBxaWJfb3RoZXJfaGVhZGVycyAqb2hkciA9IE5VTEw7CisJCXN0cnVjdCBxaWJfaWJwb3J0ICppYnAgPSAmcHBkLT5pYnBvcnRfZGF0YTsKKwkJc3RydWN0IHFpYl9xcCAqcXAgPSBOVUxMOworCQl1MzIgdGxlbiA9IHFpYl9oZHJnZXRfbGVuZ3RoX2luX2J5dGVzKHJoZl9hZGRyKTsKKwkJdTE2IGxpZCAgPSBiZTE2X3RvX2NwdShoZHItPmxyaFsxXSk7CisJCWludCBsbmggPSBiZTE2X3RvX2NwdShoZHItPmxyaFswXSkgJiAzOworCQl1MzIgcXBfbnVtOworCQl1MzIgb3Bjb2RlOworCQl1MzIgcHNuOworCQlpbnQgZGlmZjsKKwkJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCQkvKiBTYW5pdHkgY2hlY2sgcGFja2V0ICovCisJCWlmICh0bGVuIDwgMjQpCisJCQlnb3RvIGRyb3A7CisKKwkJaWYgKGxpZCA8IFFJQl9NVUxUSUNBU1RfTElEX0JBU0UpIHsKKwkJCWxpZCAmPSB+KCgxIDw8IHBwZC0+bG1jKSAtIDEpOworCQkJaWYgKHVubGlrZWx5KGxpZCAhPSBwcGQtPmxpZCkpCisJCQkJZ290byBkcm9wOworCQl9CisKKwkJLyogQ2hlY2sgZm9yIEdSSCAqLworCQlpZiAobG5oID09IFFJQl9MUkhfQlRIKQorCQkJb2hkciA9ICZoZHItPnUub3RoOworCQllbHNlIGlmIChsbmggPT0gUUlCX0xSSF9HUkgpIHsKKwkJCXUzMiB2dGY7CisKKwkJCW9oZHIgPSAmaGRyLT51Lmwub3RoOworCQkJaWYgKGhkci0+dS5sLmdyaC5uZXh0X2hkciAhPSBJQl9HUkhfTkVYVF9IRFIpCisJCQkJZ290byBkcm9wOworCQkJdnRmID0gYmUzMl90b19jcHUoaGRyLT51LmwuZ3JoLnZlcnNpb25fdGNsYXNzX2Zsb3cpOworCQkJaWYgKCh2dGYgPj4gSUJfR1JIX1ZFUlNJT05fU0hJRlQpICE9IElCX0dSSF9WRVJTSU9OKQorCQkJCWdvdG8gZHJvcDsKKwkJfSBlbHNlCisJCQlnb3RvIGRyb3A7CisKKwkJLyogR2V0IG9wY29kZSBhbmQgUFNOIGZyb20gcGFja2V0ICovCisJCW9wY29kZSA9IGJlMzJfdG9fY3B1KG9oZHItPmJ0aFswXSk7CisJCW9wY29kZSA+Pj0gMjQ7CisJCXBzbiA9IGJlMzJfdG9fY3B1KG9oZHItPmJ0aFsyXSk7CisKKwkJLyogR2V0IHRoZSBkZXN0aW5hdGlvbiBRUCBudW1iZXIuICovCisJCXFwX251bSA9IGJlMzJfdG9fY3B1KG9oZHItPmJ0aFsxXSkgJiBRSUJfUVBOX01BU0s7CisJCWlmIChxcF9udW0gIT0gUUlCX01VTFRJQ0FTVF9RUE4pIHsKKwkJCWludCBydWNfcmVzOworCQkJcXAgPSBxaWJfbG9va3VwX3FwbihpYnAsIHFwX251bSk7CisJCQlpZiAoIXFwKQorCQkJCWdvdG8gZHJvcDsKKworCQkJLyoKKwkJCSAqIEhhbmRsZSBvbmx5IFJDIFFQcyAtIGZvciBvdGhlciBRUCB0eXBlcyBkcm9wIGVycm9yCisJCQkgKiBwYWNrZXQuCisJCQkgKi8KKwkJCXNwaW5fbG9jaygmcXAtPnJfbG9jayk7CisKKwkJCS8qIENoZWNrIGZvciB2YWxpZCByZWNlaXZlIHN0YXRlLiAqLworCQkJaWYgKCEoaWJfcWliX3N0YXRlX29wc1txcC0+c3RhdGVdICYKKwkJCSAgICAgIFFJQl9QUk9DRVNTX1JFQ1ZfT0spKSB7CisJCQkJaWJwLT5uX3BrdF9kcm9wcysrOworCQkJCWdvdG8gdW5sb2NrOworCQkJfQorCisJCQlzd2l0Y2ggKHFwLT5pYnFwLnFwX3R5cGUpIHsKKwkJCWNhc2UgSUJfUVBUX1JDOgorCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZxcC0+c19sb2NrLCBmbGFncyk7CisJCQkJcnVjX3JlcyA9CisJCQkJCXFpYl9ydWNfY2hlY2tfaGRyKAorCQkJCQkJaWJwLCBoZHIsCisJCQkJCQlsbmggPT0gUUlCX0xSSF9HUkgsCisJCQkJCQlxcCwKKwkJCQkJCWJlMzJfdG9fY3B1KG9oZHItPmJ0aFswXSkpOworCQkJCWlmIChydWNfcmVzKSB7CisJCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnFwLT5zX2xvY2ssCisJCQkJCQkJICAgICAgIGZsYWdzKTsKKwkJCQkJZ290byB1bmxvY2s7CisJCQkJfQorCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnFwLT5zX2xvY2ssIGZsYWdzKTsKKworCQkJCS8qIE9ubHkgZGVhbCB3aXRoIFJETUEgV3JpdGVzIGZvciBub3cgKi8KKwkJCQlpZiAob3Bjb2RlIDwKKwkJCQkgICAgSUJfT1BDT0RFX1JDX1JETUFfUkVBRF9SRVNQT05TRV9GSVJTVCkgeworCQkJCQlkaWZmID0gcWliX2NtcDI0KHBzbiwgcXAtPnJfcHNuKTsKKwkJCQkJaWYgKCFxcC0+cl9uYWtfc3RhdGUgJiYgZGlmZiA+PSAwKSB7CisJCQkJCQlpYnAtPm5fcmNfc2VxbmFrKys7CisJCQkJCQlxcC0+cl9uYWtfc3RhdGUgPQorCQkJCQkJCUlCX05BS19QU05fRVJST1I7CisJCQkJCQkvKiBVc2UgdGhlIGV4cGVjdGVkIFBTTi4gKi8KKwkJCQkJCXFwLT5yX2Fja19wc24gPSBxcC0+cl9wc247CisJCQkJCQkvKgorCQkJCQkJICogV2FpdCB0byBzZW5kIHRoZSBzZXF1ZW5jZQorCQkJCQkJICogTkFLIHVudGlsIGFsbCBwYWNrZXRzCisJCQkJCQkgKiBpbiB0aGUgcmVjZWl2ZSBxdWV1ZSBoYXZlCisJCQkJCQkgKiBiZWVuIHByb2Nlc3NlZC4KKwkJCQkJCSAqIE90aGVyd2lzZSwgd2UgZW5kIHVwCisJCQkJCQkgKiBwcm9wYWdhdGluZyBjb25nZXN0aW9uLgorCQkJCQkJICovCisJCQkJCQlpZiAobGlzdF9lbXB0eSgmcXAtPnJzcHdhaXQpKSB7CisJCQkJCQkJcXAtPnJfZmxhZ3MgfD0KKwkJCQkJCQkJUUlCX1JfUlNQX05BSzsKKwkJCQkJCQlhdG9taWNfaW5jKAorCQkJCQkJCQkmcXAtPnJlZmNvdW50KTsKKwkJCQkJCQlsaXN0X2FkZF90YWlsKAorCQkJCQkJCSAmcXAtPnJzcHdhaXQsCisJCQkJCQkJICZyY2QtPnFwX3dhaXRfbGlzdCk7CisJCQkJCQl9CisJCQkJCX0gLyogT3V0IG9mIHNlcXVlbmNlIE5BSyAqLworCQkJCX0gLyogUVAgUmVxdWVzdCBOQUtzICovCisJCQkJYnJlYWs7CisJCQljYXNlIElCX1FQVF9TTUk6CisJCQljYXNlIElCX1FQVF9HU0k6CisJCQljYXNlIElCX1FQVF9VRDoKKwkJCWNhc2UgSUJfUVBUX1VDOgorCQkJZGVmYXVsdDoKKwkJCQkvKiBGb3Igbm93IGRvbid0IGhhbmRsZSBhbnkgb3RoZXIgUVAgdHlwZXMgKi8KKwkJCQlicmVhazsKKwkJCX0KKwordW5sb2NrOgorCQkJc3Bpbl91bmxvY2soJnFwLT5yX2xvY2spOworCQkJLyoKKwkJCSAqIE5vdGlmeSBxaWJfZGVzdHJveV9xcCgpIGlmIGl0IGlzIHdhaXRpbmcKKwkJCSAqIGZvciB1cyB0byBmaW5pc2guCisJCQkgKi8KKwkJCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZxcC0+cmVmY291bnQpKQorCQkJCXdha2VfdXAoJnFwLT53YWl0KTsKKwkJfSAvKiBVbmljYXN0IFFQICovCisJfSAvKiBWYWxpZCBwYWNrZXQgd2l0aCBUSURFcnIgKi8KKworZHJvcDoKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0zMzUsNyArNDczLDcgQEAKIAkJc21wX3JtYigpOyAgLyogcHJldmVudCBzcGVjdWxhdGl2ZSByZWFkcyBvZiBkbWEnZWQgaGRycSAqLwogCX0KIAotCWZvciAobGFzdCA9IDAsIGkgPSAxOyAhbGFzdCAmJiBpIDw9IDY0OyBpICs9ICFsYXN0KSB7CisJZm9yIChsYXN0ID0gMCwgaSA9IDE7ICFsYXN0OyBpICs9ICFsYXN0KSB7CiAJCWhkciA9IGRkLT5mX2dldF9tc2doZWFkZXIoZGQsIHJoZl9hZGRyKTsKIAkJZWZsYWdzID0gcWliX2hkcmdldF9lcnJfZmxhZ3MocmhmX2FkZHIpOwogCQlldHlwZSA9IHFpYl9oZHJnZXRfcmN2X3R5cGUocmhmX2FkZHIpOwpAQCAtMzcxLDcgKzUwOSw3IEBACiAJCSAqIHBhY2tldHM7IG9ubHkgcWliaGRyZXJyIHNob3VsZCBiZSBzZXQuCiAJCSAqLwogCQlpZiAodW5saWtlbHkoZWZsYWdzKSkKLQkJCWNyY3MgKz0gcWliX3Jjdl9oZHJlcnIocHBkLCByY2QtPmN0eHQsIGVmbGFncywgbCwKKwkJCWNyY3MgKz0gcWliX3Jjdl9oZHJlcnIocmNkLCBwcGQsIHJjZC0+Y3R4dCwgZWZsYWdzLCBsLAogCQkJCQkgICAgICAgZXRhaWwsIHJoZl9hZGRyLCBoZHIpOwogCQllbHNlIGlmIChldHlwZSA9PSBSQ1ZIUV9SQ1ZfVFlQRV9OT05fS0QpIHsKIAkJCXFpYl9pYl9yY3YocmNkLCBoZHIsIGVidWYsIHRsZW4pOwpAQCAtMzg0LDYgKzUyMiw5IEBACiAJCWwgKz0gcnNpemU7CiAJCWlmIChsID49IG1heGNudCkKIAkJCWwgPSAwOworCQlpZiAoaSA9PSBRSUJfTUFYX1BLVF9SRUNWKQorCQkJbGFzdCA9IDE7CisKIAkJcmhmX2FkZHIgPSAoX19sZTMyICopIHJjZC0+cmN2aGRycSArIGwgKyBkZC0+cmhmX29mZnNldDsKIAkJaWYgKGRkLT5mbGFncyAmIFFJQl9OT0RNQV9SVEFJTCkgewogCQkJdTMyIHNlcSA9IHFpYl9oZHJnZXRfc2VxKHJoZl9hZGRyKTsKQEAgLTQwMiw3ICs1NDMsNyBAQAogCQkgKi8KIAkJbHZhbCA9IGw7CiAJCWlmICghbGFzdCAmJiAhKGkgJiAweGYpKSB7Ci0JCQlkZC0+Zl91cGRhdGVfdXNyaGVhZChyY2QsIGx2YWwsIHVwZGVnciwgZXRhaWwpOworCQkJZGQtPmZfdXBkYXRlX3VzcmhlYWQocmNkLCBsdmFsLCB1cGRlZ3IsIGV0YWlsLCBpKTsKIAkJCXVwZGVnciA9IDA7CiAJCX0KIAl9CkBAIC00NDQsNyArNTg1LDcgQEAKIAkgKiBpZiBubyBwYWNrZXRzIHdlcmUgcHJvY2Vzc2VkLgogCSAqLwogCWx2YWwgPSAodTY0KXJjZC0+aGVhZCB8IGRkLT5yaGRyaGVhZF9pbnRyX29mZjsKLQlkZC0+Zl91cGRhdGVfdXNyaGVhZChyY2QsIGx2YWwsIHVwZGVnciwgZXRhaWwpOworCWRkLT5mX3VwZGF0ZV91c3JoZWFkKHJjZCwgbHZhbCwgdXBkZWdyLCBldGFpbCwgaSk7CiAJcmV0dXJuIGNyY3M7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX2ZpbGVfb3BzLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl9maWxlX29wcy5jCmluZGV4IDc5ZDk5NzEuLjc1YmZhZDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX2ZpbGVfb3BzLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfZmlsZV9vcHMuYwpAQCAtMTM3OSwxNyArMTM3OSwxNyBAQAogCQkvKiBmaW5kIGRldmljZSAod2l0aCBBQ1RJVkUgcG9ydHMpIHdpdGggZmV3ZXN0IGN0eHRzIGluIHVzZSAqLwogCQlmb3IgKG5kZXYgPSAwOyBuZGV2IDwgZGV2bWF4OyBuZGV2KyspIHsKIAkJCXN0cnVjdCBxaWJfZGV2ZGF0YSAqZGQgPSBxaWJfbG9va3VwKG5kZXYpOwotCQkJdW5zaWduZWQgY3VzZWQgPSAwLCBjZnJlZSA9IDA7CisJCQl1bnNpZ25lZCBjdXNlZCA9IDAsIGNmcmVlID0gMCwgcHVzYWJsZSA9IDA7CiAJCQlpZiAoIWRkKQogCQkJCWNvbnRpbnVlOwogCQkJaWYgKHBvcnQgJiYgcG9ydCA8PSBkZC0+bnVtX3Bwb3J0cyAmJgogCQkJICAgIHVzYWJsZShkZC0+cHBvcnQgKyBwb3J0IC0gMSkpCi0JCQkJZHVzYWJsZSA9IDE7CisJCQkJcHVzYWJsZSA9IDE7CiAJCQllbHNlCiAJCQkJZm9yIChpID0gMDsgaSA8IGRkLT5udW1fcHBvcnRzOyBpKyspCiAJCQkJCWlmICh1c2FibGUoZGQtPnBwb3J0ICsgaSkpCi0JCQkJCQlkdXNhYmxlKys7Ci0JCQlpZiAoIWR1c2FibGUpCisJCQkJCQlwdXNhYmxlKys7CisJCQlpZiAoIXB1c2FibGUpCiAJCQkJY29udGludWU7CiAJCQlmb3IgKGN0eHQgPSBkZC0+Zmlyc3RfdXNlcl9jdHh0OyBjdHh0IDwgZGQtPmNmZ2N0eHRzOwogCQkJICAgICBjdHh0KyspCkBAIC0xMzk3LDcgKzEzOTcsNyBAQAogCQkJCQljdXNlZCsrOwogCQkJCWVsc2UKIAkJCQkJY2ZyZWUrKzsKLQkJCWlmIChjZnJlZSAmJiBjdXNlZCA8IGludXNlKSB7CisJCQlpZiAocHVzYWJsZSAmJiBjZnJlZSAmJiBjdXNlZCA8IGludXNlKSB7CiAJCQkJdWRkID0gZGQ7CiAJCQkJaW51c2UgPSBjdXNlZDsKIAkJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX2liYTYxMjAuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX2liYTYxMjAuYwppbmRleCBhNWUyOWRiLi43NzRkZWE4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl9pYmE2MTIwLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfaWJhNjEyMC5jCkBAIC0yMDc0LDcgKzIwNzQsNyBAQAogfQogCiBzdGF0aWMgdm9pZCBxaWJfdXBkYXRlXzYxMjBfdXNyaGVhZChzdHJ1Y3QgcWliX2N0eHRkYXRhICpyY2QsIHU2NCBoZCwKLQkJCQkgICAgdTMyIHVwZGVnciwgdTMyIGVncmhkKQorCQkJCSAgICB1MzIgdXBkZWdyLCB1MzIgZWdyaGQsIHUzMiBucGt0cykKIHsKIAlxaWJfd3JpdGVfdXJlZyhyY2QtPmRkLCB1cl9yY3ZoZHJoZWFkLCBoZCwgcmNkLT5jdHh0KTsKIAlpZiAodXBkZWdyKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfaWJhNzIyMC5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfaWJhNzIyMC5jCmluZGV4IDZmZDhkNzQuLjEyN2EwZDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX2liYTcyMjAuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl9pYmE3MjIwLmMKQEAgLTIyOTcsNyArMjI5Nyw3IEBACiAJbmNoaXBjdHh0cyA9IHFpYl9yZWFkX2tyZWczMihkZCwga3JfcG9ydGNudCk7CiAJZGQtPmNzcGVjLT5udW1jdHh0cyA9IG5jaGlwY3R4dHM7CiAJaWYgKHFpYl9uX2tyY3ZfcXVldWVzID4gMSkgewotCQlkZC0+cXBuX21hc2sgPSAweDNmOworCQlkZC0+cXBuX21hc2sgPSAweDNlOwogCQlkZC0+Zmlyc3RfdXNlcl9jdHh0ID0gcWliX25fa3Jjdl9xdWV1ZXMgKiBkZC0+bnVtX3Bwb3J0czsKIAkJaWYgKGRkLT5maXJzdF91c2VyX2N0eHQgPiBuY2hpcGN0eHRzKQogCQkJZGQtPmZpcnN0X3VzZXJfY3R4dCA9IG5jaGlwY3R4dHM7CkBAIC0yNzAzLDcgKzI3MDMsNyBAQAogfQogCiBzdGF0aWMgdm9pZCBxaWJfdXBkYXRlXzcyMjBfdXNyaGVhZChzdHJ1Y3QgcWliX2N0eHRkYXRhICpyY2QsIHU2NCBoZCwKLQkJCQkgICAgdTMyIHVwZGVnciwgdTMyIGVncmhkKQorCQkJCSAgICB1MzIgdXBkZWdyLCB1MzIgZWdyaGQsIHUzMiBucGt0cykKIHsKIAlxaWJfd3JpdGVfdXJlZyhyY2QtPmRkLCB1cl9yY3ZoZHJoZWFkLCBoZCwgcmNkLT5jdHh0KTsKIAlpZiAodXBkZWdyKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfaWJhNzMyMi5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfaWJhNzMyMi5jCmluZGV4IDU4NGQ0NDMuLmRiYmIwZTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX2liYTczMjIuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl9pYmE3MzIyLmMKQEAgLTcxLDYgKzcxLDkgQEAKIAogc3RhdGljIHUzMiBhaGJfbW9kKHN0cnVjdCBxaWJfZGV2ZGF0YSAqLCBpbnQsIGludCwgaW50LCB1MzIsIHUzMik7CiBzdGF0aWMgdm9pZCBpYnNkX3dyX2FsbGNoYW5zKHN0cnVjdCBxaWJfcHBvcnRkYXRhICosIGludCwgdW5zaWduZWQsIHVuc2lnbmVkKTsKK3N0YXRpYyB2b2lkIHNlcmRlc183MzIyX2xvc19lbmFibGUoc3RydWN0IHFpYl9wcG9ydGRhdGEgKiwgaW50KTsKK3N0YXRpYyBpbnQgc2VyZGVzXzczMjJfaW5pdF9vbGQoc3RydWN0IHFpYl9wcG9ydGRhdGEgKik7CitzdGF0aWMgaW50IHNlcmRlc183MzIyX2luaXRfbmV3KHN0cnVjdCBxaWJfcHBvcnRkYXRhICopOwogCiAjZGVmaW5lIEJNQVNLKG1zYiwgbHNiKSAoKCgxIDw8ICgobXNiKSArIDEgLSAobHNiKSkpIC0gMSkgPDwgKGxzYikpCiAKQEAgLTExMSw2ICsxMTQsMjEgQEAKIG1vZHVsZV9wYXJhbV9uYW1lZChzaW5nbGVwb3J0LCBxaWJfc2luZ2xlcG9ydCwgdXNob3J0LCBTX0lSVUdPKTsKIE1PRFVMRV9QQVJNX0RFU0Moc2luZ2xlcG9ydCwgIlVzZSBvbmx5IElCIHBvcnQgMTsgbW9yZSBwZXItcG9ydCBidWZmZXIgc3BhY2UiKTsKIAorLyoKKyAqIFJlY2VpdmUgaGVhZGVyIHF1ZXVlIHNpemVzCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBxaWJfcmN2aGRyY250OworbW9kdWxlX3BhcmFtX25hbWVkKHJjdmhkcmNudCwgcWliX3JjdmhkcmNudCwgdWludCwgU19JUlVHTyk7CitNT0RVTEVfUEFSTV9ERVNDKHJjdmhkcmNudCwgInJlY2VpdmUgaGVhZGVyIGNvdW50Iik7CisKK3N0YXRpYyB1bnNpZ25lZCBxaWJfcmN2aGRyc2l6ZTsKK21vZHVsZV9wYXJhbV9uYW1lZChyY3ZoZHJzaXplLCBxaWJfcmN2aGRyc2l6ZSwgdWludCwgU19JUlVHTyk7CitNT0RVTEVfUEFSTV9ERVNDKHJjdmhkcnNpemUsICJyZWNlaXZlIGhlYWRlciBzaXplIGluIDMyLWJpdCB3b3JkcyIpOworCitzdGF0aWMgdW5zaWduZWQgcWliX3JjdmhkcmVudHNpemU7Cittb2R1bGVfcGFyYW1fbmFtZWQocmN2aGRyZW50c2l6ZSwgcWliX3JjdmhkcmVudHNpemUsIHVpbnQsIFNfSVJVR08pOworTU9EVUxFX1BBUk1fREVTQyhyY3ZoZHJlbnRzaXplLCAicmVjZWl2ZSBoZWFkZXIgZW50cnkgc2l6ZSBpbiAzMi1iaXQgd29yZHMiKTsKKwogI2RlZmluZSBNQVhfQVRURU5fTEVOIDY0IC8qIHBsZW50eSBmb3IgYW55IHJlYWwgc3lzdGVtICovCiAvKiBmb3IgcmVhZCBiYWNrLCBkZWZhdWx0IGluZGV4IGlzIH41bSBjb3BwZXIgY2FibGUgKi8KIHN0YXRpYyBjaGFyIHR4c2VsZWN0X2xpc3RbTUFYX0FUVEVOX0xFTl0gPSAiMTAiOwpAQCAtNTQ0LDYgKzU2Miw3IEBACiAKICNkZWZpbmUgVFhERFNfVEFCTEVfU1ogMTYgLyogbnVtYmVyIG9mIGVudHJpZXMgcGVyIHNwZWVkIGluIG9uY2hpcCB0YWJsZSAqLwogI2RlZmluZSBUWEREU19FWFRSQV9TWiAxMyAvKiBudW1iZXIgb2YgZXh0cmEgdHggc2V0dGluZ3MgZW50cmllcyAqLworI2RlZmluZSBUWEREU19NRkdfU1ogMiAgICAvKiBudW1iZXIgb2YgbWZnIHR4IHNldHRpbmdzIGVudHJpZXMgKi8KICNkZWZpbmUgU0VSREVTX0NIQU5TIDQgLyogeWVzLCBpdCdzIG9idmlvdXMsIGJ1dCBvbmUgbGVzcyBtYWdpYyBudW1iZXIgKi8KIAogI2RlZmluZSBIMV9GT1JDRV9WQUwgOApAQCAtNjA0LDYgKzYyMyw3IEBACiAJdTggaWJtYWxmdXNlc25hcDsKIAlzdHJ1Y3QgcWliX3FzZnBfZGF0YSBxc2ZwX2RhdGE7CiAJY2hhciBlcG1zZ2J1ZlsxOTJdOyAvKiBmb3IgcG9ydCBlcnJvciBpbnRlcnJ1cHQgbXNnIGJ1ZmZlciAqLworCXU4IGJvdW5jZWQ7CiB9OwogCiBzdGF0aWMgc3RydWN0IHsKQEAgLTE2NzcsNiArMTY5Nyw4IEBACiAJICAgIChpYmNzdCAmIFNZTV9NQVNLKElCQ1N0YXR1c0FfMCwgTGlua1NwZWVkUURSKSkpIHsKIAkJZm9yY2VfaDEocHBkKTsKIAkJcHBkLT5jcHNwZWMtPnFkcl9yZWZvcmNlID0gMTsKKwkJaWYgKCFwcGQtPmRkLT5jc3BlYy0+cjEpCisJCQlzZXJkZXNfNzMyMl9sb3NfZW5hYmxlKHBwZCwgMCk7CiAJfSBlbHNlIGlmIChwcGQtPmNwc3BlYy0+cWRyX3JlZm9yY2UgJiYKIAkJKGliY3N0ICYgU1lNX01BU0soSUJDU3RhdHVzQV8wLCBMaW5rU3BlZWRRRFIpKSAmJgogCQkgKGliY2x0ID09IElCXzczMjJfTFRfU1RBVEVfQ0ZHRU5IIHx8CkBAIC0xNjkyLDE4ICsxNzE0LDM3IEBACiAJICAgICAgaWJjbHQgPD0gSUJfNzMyMl9MVF9TVEFURV9TTEVFUFFVSUVUKSkpCiAJCWFkal90eF9zZXJkZXMocHBkKTsKIAotCWlmICghcHBkLT5jcHNwZWMtPnFkcl9kZmVfb24gJiYgaWJjbHQgIT0gSUJfNzMyMl9MVF9TVEFURV9MSU5LVVAgJiYKLQkgICAgaWJjbHQgPD0gSUJfNzMyMl9MVF9TVEFURV9TTEVFUFFVSUVUKSB7Ci0JCXBwZC0+Y3BzcGVjLT5xZHJfZGZlX29uID0gMTsKLQkJcHBkLT5jcHNwZWMtPnFkcl9kZmVfdGltZSA9IDA7Ci0JCS8qIE9uIGxpbmsgZG93biwgcmVlbmFibGUgUURSIGFkYXB0YXRpb24gKi8KLQkJcWliX3dyaXRlX2tyZWdfcG9ydChwcGQsIGtycF9zdGF0aWNfYWRhcHRfZGlzKDIpLAotCQkJcHBkLT5kZC0+Y3NwZWMtPnIxID8KLQkJCQkgICAgUURSX1NUQVRJQ19BREFQVF9ET1dOX1IxIDoKLQkJCQkgICAgUURSX1NUQVRJQ19BREFQVF9ET1dOKTsKKwlpZiAoaWJjbHQgIT0gSUJfNzMyMl9MVF9TVEFURV9MSU5LVVApIHsKKwkJdTggbHRzdGF0ZSA9IHFpYl83MzIyX3BoeXNfcG9ydHN0YXRlKGliY3N0KTsKKwkJdTggcGliY2x0ID0gKHU4KVNZTV9GSUVMRChwcGQtPmxhc3RpYmNzdGF0LCBJQkNTdGF0dXNBXzAsCisJCQkJCSAgTGlua1RyYWluaW5nU3RhdGUpOworCQlpZiAoIXBwZC0+ZGQtPmNzcGVjLT5yMSAmJgorCQkgICAgcGliY2x0ID09IElCXzczMjJfTFRfU1RBVEVfTElOS1VQICYmCisJCSAgICBsdHN0YXRlICE9IElCX1BIWVNQT1JUU1RBVEVfTElOS19FUlJfUkVDT1ZFUiAmJgorCQkgICAgbHRzdGF0ZSAhPSBJQl9QSFlTUE9SVFNUQVRFX1JFQ09WRVJZX1JFVFJBSU4gJiYKKwkJICAgIGx0c3RhdGUgIT0gSUJfUEhZU1BPUlRTVEFURV9SRUNPVkVSWV9XQUlUUk1UICYmCisJCSAgICBsdHN0YXRlICE9IElCX1BIWVNQT1JUU1RBVEVfUkVDT1ZFUllfSURMRSkKKwkJCS8qIElmIHRoZSBsaW5rIHdlbnQgZG93biAoYnV0IG5vIGludG8gcmVjb3ZlcnksCisJCQkgKiB0dXJuIExPUyBiYWNrIG9uICovCisJCQlzZXJkZXNfNzMyMl9sb3NfZW5hYmxlKHBwZCwgMSk7CisJCWlmICghcHBkLT5jcHNwZWMtPnFkcl9kZmVfb24gJiYKKwkJICAgIGliY2x0IDw9IElCXzczMjJfTFRfU1RBVEVfU0xFRVBRVUlFVCkgeworCQkJcHBkLT5jcHNwZWMtPnFkcl9kZmVfb24gPSAxOworCQkJcHBkLT5jcHNwZWMtPnFkcl9kZmVfdGltZSA9IDA7CisJCQkvKiBPbiBsaW5rIGRvd24sIHJlZW5hYmxlIFFEUiBhZGFwdGF0aW9uICovCisJCQlxaWJfd3JpdGVfa3JlZ19wb3J0KHBwZCwga3JwX3N0YXRpY19hZGFwdF9kaXMoMiksCisJCQkJCSAgICBwcGQtPmRkLT5jc3BlYy0+cjEgPworCQkJCQkgICAgUURSX1NUQVRJQ19BREFQVF9ET1dOX1IxIDoKKwkJCQkJICAgIFFEUl9TVEFUSUNfQURBUFRfRE9XTik7CisJCQlwcmludGsoS0VSTl9JTkZPIFFJQl9EUlZfTkFNRQorCQkJCSIgSUIldToldSByZS1lbmFibGVkIFFEUiBhZGFwdGF0aW9uICIKKwkJCQkiaWJjbHQgJXhcbiIsIHBwZC0+ZGQtPnVuaXQsIHBwZC0+cG9ydCwgaWJjbHQpOworCQl9CiAJfQogfQogCitzdGF0aWMgaW50IHFpYl83MzIyX3NldF9pYl9jZmcoc3RydWN0IHFpYl9wcG9ydGRhdGEgKiwgaW50LCB1MzIpOworCiAvKgogICogVGhpcyBpcyBwZXItcHBvcnQgZXJyb3IgaGFuZGxpbmcuCiAgKiB3aWxsIGxpa2VseSBnZXQgaXQncyBvd24gTVNJeCBpbnRlcnJ1cHQgKG9uZSBmb3IgZWFjaCBwb3J0LApAQCAtMTg0MCw3ICsxODgxLDIzIEBACiAJCSAgICBJQl9QSFlTUE9SVFNUQVRFX0RJU0FCTEVEKQogCQkJcWliX3NldF9pYl83MzIyX2xzdGF0ZShwcGQsIDAsCiAJCQkgICAgICAgUUxPR0lDX0lCX0lCQ0NfTElOS0lOSVRDTURfRElTQUJMRSk7Ci0JCWVsc2UKKwkJZWxzZSB7CisJCQl1MzIgbHN0YXRlOworCQkJLyoKKwkJCSAqIFdlIG5lZWQgdGhlIGN1cnJlbnQgbG9naWNhbCBsaW5rIHN0YXRlIGJlZm9yZQorCQkJICogbGZsYWdzIGFyZSBzZXQgaW4gaGFuZGxlX2VfaWJzdGF0dXNjaGFuZ2VkLgorCQkJICovCisJCQlsc3RhdGUgPSBxaWJfNzMyMl9pYmxpbmtfc3RhdGUoaWJjcyk7CisKKwkJCWlmIChJU19RTUgoZGQpICYmICFwcGQtPmNwc3BlYy0+Ym91bmNlZCAmJgorCQkJICAgIGx0c3RhdGUgPT0gSUJfUEhZU1BPUlRTVEFURV9MSU5LVVAgJiYKKwkJCSAgICAobHN0YXRlID49IElCX1BPUlRfSU5JVCAmJgorCQkJCWxzdGF0ZSA8PSBJQl9QT1JUX0FDVElWRSkpIHsKKwkJCQlwcGQtPmNwc3BlYy0+Ym91bmNlZCA9IDE7CisJCQkJcWliXzczMjJfc2V0X2liX2NmZyhwcGQsIFFJQl9JQl9DRkdfTFNUQVRFLAorCQkJCQlJQl9MSU5LQ01EX0RPV04gfCBJQl9MSU5LSU5JVENNRF9QT0xMKTsKKwkJCX0KKwogCQkJLyoKIAkJCSAqIFNpbmNlIGdvaW5nIGludG8gYSByZWNvdmVyeSBzdGF0ZSBjYXVzZXMgdGhlIGxpbmsKIAkJCSAqIHN0YXRlIHRvIGdvIGRvd24gYW5kIHNpbmNlIHJlY292ZXJ5IGlzIHRyYW5zaXRvcnksCkBAIC0xODU0LDYgKzE5MTEsNyBAQAogCQkJICAgIGx0c3RhdGUgIT0gSUJfUEhZU1BPUlRTVEFURV9SRUNPVkVSWV9XQUlUUk1UICYmCiAJCQkgICAgbHRzdGF0ZSAhPSBJQl9QSFlTUE9SVFNUQVRFX1JFQ09WRVJZX0lETEUpCiAJCQkJcWliX2hhbmRsZV9lX2lic3RhdHVzY2hhbmdlZChwcGQsIGliY3MpOworCQl9CiAJfQogCWlmICgqbXNnICYmIGlzZXJyKQogCQlxaWJfZGV2X3BvcnRlcnIoZGQsIHBwZC0+cG9ydCwgIiVzIGVycm9yXG4iLCBtc2cpOwpAQCAtMjc4NSw3ICsyODQzLDYgQEAKIAkJCQljdHh0cmJpdHMgJj0gfnJtYXNrOwogCQkJCWlmIChkZC0+cmNkW2ldKSB7CiAJCQkJCXFpYl9rcmVjZWl2ZShkZC0+cmNkW2ldLCBOVUxMLCAmbnBrdHMpOwotCQkJCQlhZGp1c3RfcmN2X3RpbWVvdXQoZGQtPnJjZFtpXSwgbnBrdHMpOwogCQkJCX0KIAkJCX0KIAkJCXJtYXNrIDw8PSAxOwpAQCAtMjgzNSw3ICsyODkyLDYgQEAKIAkJICAgICAgICgxVUxMIDw8IFFJQl9JX1JDVlVSR19MU0IpKSA8PCByY2QtPmN0eHQpOwogCiAJcWliX2tyZWNlaXZlKHJjZCwgTlVMTCwgJm5wa3RzKTsKLQlhZGp1c3RfcmN2X3RpbWVvdXQocmNkLCBucGt0cyk7CiAKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CkBAIC0zMTU3LDYgKzMyMTMsMTAgQEAKIAljYXNlIEJPQVJEX1FNRTczNDI6CiAJCW4gPSAiSW5maW5pUGF0aF9RTUU3MzQyIjsKIAkJYnJlYWs7CisJY2FzZSA4OgorCQluID0gIkluZmluaVBhdGhfUU1FNzM2MiI7CisJCWRkLT5mbGFncyB8PSBRSUJfSEFTX1FTRlA7CisJCWJyZWFrOwogCWNhc2UgMTU6CiAJCW4gPSAiSW5maW5pUGF0aF9RTEU3MzQyX1RFU1QiOwogCQlkZC0+ZmxhZ3MgfD0gUUlCX0hBU19RU0ZQOwpAQCAtMzQ3NSwxMSArMzUzNSw2IEBACiAJbmNoaXBjdHh0cyA9IHFpYl9yZWFkX2tyZWczMihkZCwga3JfY29udGV4dGNudCk7CiAJZGQtPmNzcGVjLT5udW1jdHh0cyA9IG5jaGlwY3R4dHM7CiAJaWYgKHFpYl9uX2tyY3ZfcXVldWVzID4gMSAmJiBkZC0+bnVtX3Bwb3J0cykgewotCQkvKgotCQkgKiBTZXQgdGhlIG1hc2sgZm9yIHdoaWNoIGJpdHMgZnJvbSB0aGUgUVBOIGFyZSB1c2VkCi0JCSAqIHRvIHNlbGVjdCBhIGNvbnRleHQgbnVtYmVyLgotCQkgKi8KLQkJZGQtPnFwbl9tYXNrID0gMHgzZjsKIAkJZGQtPmZpcnN0X3VzZXJfY3R4dCA9IE5VTV9JQl9QT1JUUyArCiAJCQkocWliX25fa3Jjdl9xdWV1ZXMgLSAxKSAqIGRkLT5udW1fcHBvcnRzOwogCQlpZiAoZGQtPmZpcnN0X3VzZXJfY3R4dCA+IG5jaGlwY3R4dHMpCkBAIC0zNTMwLDggKzM1ODUsMTEgQEAKIAogCS8qIGtyX3JjdmVncmNudCBjaGFuZ2VzIGJhc2VkIG9uIHRoZSBudW1iZXIgb2YgY29udGV4dHMgZW5hYmxlZCAqLwogCWRkLT5jc3BlYy0+cmN2ZWdyY250ID0gcWliX3JlYWRfa3JlZzMyKGRkLCBrcl9yY3ZlZ3JjbnQpOwotCWRkLT5yY3ZoZHJjbnQgPSBtYXgoZGQtPmNzcGVjLT5yY3ZlZ3JjbnQsCi0JCQkJZGQtPm51bV9wcG9ydHMgPiAxID8gMTAyNFUgOiAyMDQ4VSk7CisJaWYgKHFpYl9yY3ZoZHJjbnQpCisJCWRkLT5yY3ZoZHJjbnQgPSBtYXgoZGQtPmNzcGVjLT5yY3ZlZ3JjbnQsIHFpYl9yY3ZoZHJjbnQpOworCWVsc2UKKwkJZGQtPnJjdmhkcmNudCA9IG1heChkZC0+Y3NwZWMtPnJjdmVncmNudCwKKwkJCQkgICAgZGQtPm51bV9wcG9ydHMgPiAxID8gMTAyNFUgOiAyMDQ4VSk7CiB9CiAKIHN0YXRpYyBpbnQgcWliXzczMjJfZ2V0X2liX2NmZyhzdHJ1Y3QgcWliX3Bwb3J0ZGF0YSAqcHBkLCBpbnQgd2hpY2gpCkBAIC00MDAyLDggKzQwNjAsMTQgQEAKIH0KIAogc3RhdGljIHZvaWQgcWliX3VwZGF0ZV83MzIyX3VzcmhlYWQoc3RydWN0IHFpYl9jdHh0ZGF0YSAqcmNkLCB1NjQgaGQsCi0JCQkJICAgIHUzMiB1cGRlZ3IsIHUzMiBlZ3JoZCkKKwkJCQkgICAgdTMyIHVwZGVnciwgdTMyIGVncmhkLCB1MzIgbnBrdHMpCiB7CisJLyoKKwkgKiBOZWVkIHRvIHdyaXRlIHRpbWVvdXQgcmVnaXN0ZXIgYmVmb3JlIHVwZGF0aW5nIHJjdmhkcmhlYWQgdG8gZW5zdXJlCisJICogdGhhdCB0aGUgdGltZXIgaXMgZW5hYmxlZCBvbiByZWNlcHRpb24gb2YgYSBwYWNrZXQuCisJICovCisJaWYgKGhkID4+IElCQTczMjJfSERSSEVBRF9QS1RJTlRfU0hJRlQpCisJCWFkanVzdF9yY3ZfdGltZW91dChyY2QsIG5wa3RzKTsKIAlxaWJfd3JpdGVfdXJlZyhyY2QtPmRkLCB1cl9yY3ZoZHJoZWFkLCBoZCwgcmNkLT5jdHh0KTsKIAlxaWJfd3JpdGVfdXJlZyhyY2QtPmRkLCB1cl9yY3ZoZHJoZWFkLCBoZCwgcmNkLT5jdHh0KTsKIAlpZiAodXBkZWdyKQpAQCAtNTUyMiw3ICs1NTg2LDcgQEAKIAkJdTY0IG5vdyA9IGdldF9qaWZmaWVzXzY0KCk7CiAJCWlmICh0aW1lX2FmdGVyNjQobm93LCBwd3J1cCkpCiAJCQlicmVhazsKLQkJbXNsZWVwKDEpOworCQltc2xlZXAoMjApOwogCX0KIAlyZXQgPSBxaWJfcmVmcmVzaF9xc2ZwX2NhY2hlKHBwZCwgJnFkLT5jYWNoZSk7CiAJLyoKQEAgLTU1NzksNiArNTY0Myw3IEBACiAJdTMyIHBpZHgsIHVuaXQsIHBvcnQsIGRlZmx0LCBoMTsKIAl1bnNpZ25lZCBsb25nIHZhbDsKIAlpbnQgYW55ID0gMCwgc2V0aDE7CisJaW50IHR4ZGRzX3NpemU7CiAKIAlzdHIgPSB0eHNlbGVjdF9saXN0OwogCkBAIC01NTg3LDYgKzU2NTIsMTAgQEAKIAlmb3IgKHBpZHggPSAwOyBwaWR4IDwgZGQtPm51bV9wcG9ydHM7ICsrcGlkeCkKIAkJZGQtPnBwb3J0W3BpZHhdLmNwc3BlYy0+bm9fZWVwID0gZGVmbHQ7CiAKKwl0eGRkc19zaXplID0gVFhERFNfVEFCTEVfU1ogKyBUWEREU19FWFRSQV9TWjsKKwlpZiAoSVNfUU1FKGRkKSB8fCBJU19RTUgoZGQpKQorCQl0eGRkc19zaXplICs9IFRYRERTX01GR19TWjsKKwogCXdoaWxlICgqbnh0ICYmIG54dFsxXSkgewogCQlzdHIgPSArK254dDsKIAkJdW5pdCA9IHNpbXBsZV9zdHJ0b3VsKHN0ciwgJm54dCwgMCk7CkBAIC01NjA5LDcgKzU2NzgsNyBAQAogCQkJCTsKIAkJCWNvbnRpbnVlOwogCQl9Ci0JCWlmICh2YWwgPj0gVFhERFNfVEFCTEVfU1ogKyBUWEREU19FWFRSQV9TWikKKwkJaWYgKHZhbCA+PSB0eGRkc19zaXplKQogCQkJY29udGludWU7CiAJCXNldGgxID0gMDsKIAkJaDEgPSAwOyAvKiBnY2MgdGhpbmtzIGl0IG1pZ2h0IGJlIHVzZWQgdW5pbml0dGVkICovCkBAIC01NjYxLDEwICs1NzMwLDExIEBACiAJCXJldHVybiAtRU5PU1BDOwogCX0KIAl2YWwgPSBzaW1wbGVfc3RydG91bChzdHIsICZuLCAwKTsKLQlpZiAobiA9PSBzdHIgfHwgdmFsID49IChUWEREU19UQUJMRV9TWiArIFRYRERTX0VYVFJBX1NaKSkgeworCWlmIChuID09IHN0ciB8fCB2YWwgPj0gKFRYRERTX1RBQkxFX1NaICsgVFhERFNfRVhUUkFfU1ogKworCQkJCVRYRERTX01GR19TWikpIHsKIAkJcHJpbnRrKEtFUk5fSU5GTyBRSUJfRFJWX05BTUUKIAkJICAgICAgICJ0eHNlbGVjdF92YWx1ZXMgbXVzdCBzdGFydCB3aXRoIGEgbnVtYmVyIDwgJWRcbiIsCi0JCQlUWEREU19UQUJMRV9TWiArIFRYRERTX0VYVFJBX1NaKTsKKwkJCVRYRERTX1RBQkxFX1NaICsgVFhERFNfRVhUUkFfU1ogKyBUWEREU19NRkdfU1opOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAJc3RyY3B5KHR4c2VsZWN0X2xpc3QsIHN0cik7CkBAIC01ODEwLDcgKzU4ODAsOCBAQAogCQl1bnNpZ25lZCBuLCByZWdubzsKIAkJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCQlpZiAoIWRkLT5xcG5fbWFzayB8fCAhZGQtPnBwb3J0W3BpZHhdLmxpbmtfc3BlZWRfc3VwcG9ydGVkKQorCQlpZiAoZGQtPm5fa3Jjdl9xdWV1ZXMgPCAyIHx8CisJCQkhZGQtPnBwb3J0W3BpZHhdLmxpbmtfc3BlZWRfc3VwcG9ydGVkKQogCQkJY29udGludWU7CiAKIAkJcHBkID0gJmRkLT5wcG9ydFtwaWR4XTsKQEAgLTYwOTcsOCArNjE2OCwxMCBAQAogCQlwcGQrKzsKIAl9CiAKLQlkZC0+cmN2aGRyZW50c2l6ZSA9IFFJQl9SQ1ZIRFJfRU5UU0laRTsKLQlkZC0+cmN2aGRyc2l6ZSA9IFFJQl9ERkxUX1JDVkhEUlNJWkU7CisJZGQtPnJjdmhkcmVudHNpemUgPSBxaWJfcmN2aGRyZW50c2l6ZSA/CisJCXFpYl9yY3ZoZHJlbnRzaXplIDogUUlCX1JDVkhEUl9FTlRTSVpFOworCWRkLT5yY3ZoZHJzaXplID0gcWliX3JjdmhkcnNpemUgPworCQlxaWJfcmN2aGRyc2l6ZSA6IFFJQl9ERkxUX1JDVkhEUlNJWkU7CiAJZGQtPnJoZl9vZmZzZXQgPSBkZC0+cmN2aGRyZW50c2l6ZSAtIHNpemVvZih1NjQpIC8gc2l6ZW9mKHUzMik7CiAKIAkvKiB3ZSBhbHdheXMgYWxsb2NhdGUgYXQgbGVhc3QgMjA0OCBieXRlcyBmb3IgZWFnZXIgYnVmZmVycyAqLwpAQCAtNjQ5NSw3ICs2NTY4LDcgQEAKIAkJLyogbWFrZSBzdXJlIHdlIHNlZSBhbiB1cGRhdGVkIGNvcHkgbmV4dCB0aW1lIGFyb3VuZCAqLwogCQlzZW5kY3RybF83MzIyX21vZChkZC0+cHBvcnQsIFFJQl9TRU5EQ1RSTF9BVkFJTF9CTElQKTsKIAkJc2xlZXBzKys7Ci0JCW1zbGVlcCgxKTsKKwkJbXNsZWVwKDIwKTsKIAl9CiAKIAlzd2l0Y2ggKHdoaWNoKSB7CkBAIC02OTkzLDYgKzcwNjYsMTIgQEAKIAl7ICAwLCAxLCAgMCwgMTIgfSwJLyogUU1INzM0MiBiYWNrcGxhbmUgc2V0dGluZ3MgKi8KIH07CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdHhkZHNfZW50IHR4ZGRzX2V4dHJhX21mZ1tUWEREU19NRkdfU1pdID0geworCS8qIGFtcCwgcHJlLCBtYWluLCBwb3N0ICovCisJeyAwLCAwLCAwLCAwIH0sICAgICAgICAgLyogUU1FNzM0MiBtZmcgc2V0dGluZ3MgKi8KKwl7IDAsIDAsIDAsIDYgfSwgICAgICAgICAvKiBRTUU3MzQyIFAyIG1mZyBzZXR0aW5ncyAqLworfTsKKwogc3RhdGljIGNvbnN0IHN0cnVjdCB0eGRkc19lbnQgKmdldF9hdHRlbl90YWJsZShjb25zdCBzdHJ1Y3QgdHhkZHNfZW50ICp0eGRkcywKIAkJCQkJICAgICAgIHVuc2lnbmVkIGF0dGVuKQogewpAQCAtNzA2Niw2ICs3MTQ1LDE2IEBACiAJCSpzZHJfZGRzID0gJnR4ZGRzX2V4dHJhX3NkcltpZHhdOwogCQkqZGRyX2RkcyA9ICZ0eGRkc19leHRyYV9kZHJbaWR4XTsKIAkJKnFkcl9kZHMgPSAmdHhkZHNfZXh0cmFfcWRyW2lkeF07CisJfSBlbHNlIGlmICgoSVNfUU1FKHBwZC0+ZGQpIHx8IElTX1FNSChwcGQtPmRkKSkgJiYKKwkJICAgcHBkLT5jcHNwZWMtPm5vX2VlcCA8IChUWEREU19UQUJMRV9TWiArIFRYRERTX0VYVFJBX1NaICsKKwkJCQkJICBUWEREU19NRkdfU1opKSB7CisJCWlkeCA9IHBwZC0+Y3BzcGVjLT5ub19lZXAgLSAoVFhERFNfVEFCTEVfU1ogKyBUWEREU19FWFRSQV9TWik7CisJCXByaW50ayhLRVJOX0lORk8gUUlCX0RSVl9OQU1FCisJCQkiIElCJXU6JXUgdXNlIGlkeCAldSBpbnRvIHR4ZGRzX21mZ1xuIiwKKwkJCXBwZC0+ZGQtPnVuaXQsIHBwZC0+cG9ydCwgaWR4KTsKKwkJKnNkcl9kZHMgPSAmdHhkZHNfZXh0cmFfbWZnW2lkeF07CisJCSpkZHJfZGRzID0gJnR4ZGRzX2V4dHJhX21mZ1tpZHhdOworCQkqcWRyX2RkcyA9ICZ0eGRkc19leHRyYV9tZmdbaWR4XTsKIAl9IGVsc2UgewogCQkvKiB0aGlzIHNob3VsZG4ndCBoYXBwZW4sIGl0J3MgcmFuZ2UgY2hlY2tlZCAqLwogCQkqc2RyX2RkcyA9IHR4ZGRzX3NkciArIHFpYl9sb25nX2F0dGVuOwpAQCAtNzIxMCw5ICs3Mjk5LDMwIEBACiAJfQogfQogCitzdGF0aWMgdm9pZCBzZXJkZXNfNzMyMl9sb3NfZW5hYmxlKHN0cnVjdCBxaWJfcHBvcnRkYXRhICpwcGQsIGludCBlbmFibGUpCit7CisJdTY0IGRhdGEgPSBxaWJfcmVhZF9rcmVnX3BvcnQocHBkLCBrcnBfc2VyZGVzY3RybCk7CisJcHJpbnRrKEtFUk5fSU5GTyBRSUJfRFJWX05BTUUgIiBJQiV1OiV1IFR1cm5pbmcgTE9TICVzXG4iLAorCQlwcGQtPmRkLT51bml0LCBwcGQtPnBvcnQsIChlbmFibGUgPyAib24iIDogIm9mZiIpKTsKKwlpZiAoZW5hYmxlKQorCQlkYXRhIHw9IFNZTV9NQVNLKElCU2VyZGVzQ3RybF8wLCBSWExPU0VOKTsKKwllbHNlCisJCWRhdGEgJj0gflNZTV9NQVNLKElCU2VyZGVzQ3RybF8wLCBSWExPU0VOKTsKKwlxaWJfd3JpdGVfa3JlZ19wb3J0KHBwZCwga3JwX3NlcmRlc2N0cmwsIGRhdGEpOworfQorCiBzdGF0aWMgaW50IHNlcmRlc183MzIyX2luaXQoc3RydWN0IHFpYl9wcG9ydGRhdGEgKnBwZCkKIHsKLQl1NjQgZGF0YTsKKwlpbnQgcmV0ID0gMDsKKwlpZiAocHBkLT5kZC0+Y3NwZWMtPnIxKQorCQlyZXQgPSBzZXJkZXNfNzMyMl9pbml0X29sZChwcGQpOworCWVsc2UKKwkJcmV0ID0gc2VyZGVzXzczMjJfaW5pdF9uZXcocHBkKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHNlcmRlc183MzIyX2luaXRfb2xkKHN0cnVjdCBxaWJfcHBvcnRkYXRhICpwcGQpCit7CiAJdTMyIGxlX3ZhbDsKIAogCS8qCkBAIC03MjcwLDExICs3MzgwLDcgQEAKIAlpYnNkX3dyX2FsbGNoYW5zKHBwZCwgMjAsICgyIDw8IDEwKSwgQk1BU0soMTIsIDEwKSk7IC8qIEREUiAqLwogCWlic2Rfd3JfYWxsY2hhbnMocHBkLCAyMCwgKDQgPDwgMTMpLCBCTUFTSygxNSwgMTMpKTsgLyogU0RSICovCiAKLQlkYXRhID0gcWliX3JlYWRfa3JlZ19wb3J0KHBwZCwga3JwX3NlcmRlc2N0cmwpOwotCS8qIFR1cm4gb2ZmIElCIGxhdGVuY3kgbW9kZSAqLwotCWRhdGEgJj0gflNZTV9NQVNLKElCU2VyZGVzQ3RybF8wLCBJQl9MQVRfTU9ERSk7Ci0JcWliX3dyaXRlX2tyZWdfcG9ydChwcGQsIGtycF9zZXJkZXNjdHJsLCBkYXRhIHwKLQkJU1lNX01BU0soSUJTZXJkZXNDdHJsXzAsIFJYTE9TRU4pKTsKKwlzZXJkZXNfNzMyMl9sb3NfZW5hYmxlKHBwZCwgMSk7CiAKIAkvKiByeGJpc3RlbmE7IHNldCAwIHRvIGF2b2lkIGVmZmVjdHMgb2YgaXQgc3dpdGNoIGxhdGVyICovCiAJaWJzZF93cl9hbGxjaGFucyhwcGQsIDksIDAgPDwgMTUsIDEgPDwgMTUpOwpAQCAtNzMxNCw2ICs3NDIwLDIwNSBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IHNlcmRlc183MzIyX2luaXRfbmV3KHN0cnVjdCBxaWJfcHBvcnRkYXRhICpwcGQpCit7CisJdTY0IHRzdGFydDsKKwl1MzIgbGVfdmFsLCByeGNhbGRvbmU7CisJaW50IGNoYW4sIGNoYW5fZG9uZSA9ICgxIDw8IFNFUkRFU19DSEFOUykgLSAxOworCisJLyoKKwkgKiBJbml0aWFsaXplIHRoZSBUeCBERFMgdGFibGVzLiAgQWxzbyBkb25lIGV2ZXJ5IFFTRlAgZXZlbnQsCisJICogZm9yIGFkYXB0ZXJzIHdpdGggUVNGUAorCSAqLworCWluaXRfdHhkZHNfdGFibGUocHBkLCAwKTsKKworCS8qIENsZWFyIGNtb2RlLW92ZXJyaWRlLCBtYXkgYmUgc2V0IGZyb20gb2xkZXIgZHJpdmVyICovCisJYWhiX21vZChwcGQtPmRkLCBJQlNEKHBwZC0+aHdfcGlkeCksIDUsIDEwLCAwIDw8IDE0LCAxIDw8IDE0KTsKKworCS8qIGVuc3VyZSBubyB0eCBvdmVycmlkZXMgZnJvbSBlYXJsaWVyIGRyaXZlciBsb2FkcyAqLworCXFpYl93cml0ZV9rcmVnX3BvcnQocHBkLCBrcnBfdHhfZGVlbXBoX292ZXJyaWRlLAorCQlTWU1fTUFTSyhJQlNEX1RYX0RFRU1QSEFTSVNfT1ZFUlJJREVfMCwKKwkJcmVzZXRfdHhfZGVlbXBoYXNpc19vdmVycmlkZSkpOworCisJLyogU1RBUlQgT0YgTFNJIFNVR0dFU1RFRCBTRVJERVMgQlJJTkdVUCAqLworCS8qIFJlc2V0IC0gQ2FsaWJyYXRpb24gU2V0dXAgKi8KKwkvKiAgICAgICBTdG9wIERGRSBhZGFwdGFpb24gKi8KKwlpYnNkX3dyX2FsbGNoYW5zKHBwZCwgMSwgMCwgQk1BU0soOSwgMSkpOworCS8qICAgICAgIERpc2FibGUgTEUxICovCisJaWJzZF93cl9hbGxjaGFucyhwcGQsIDEzLCAwLCBCTUFTSyg1LCA1KSk7CisJLyogICAgICAgRGlzYWJsZSBhdXRvYWRhcHQgZm9yIExFMSAqLworCWlic2Rfd3JfYWxsY2hhbnMocHBkLCAxLCAwLCBCTUFTSygxNSwgMTUpKTsKKwkvKiAgICAgICBEaXNhYmxlIExFMiAqLworCWlic2Rfd3JfYWxsY2hhbnMocHBkLCAxMywgMCwgQk1BU0soNiwgNikpOworCS8qICAgICAgIERpc2FibGUgVkdBICovCisJaWJzZF93cl9hbGxjaGFucyhwcGQsIDUsIDAsIEJNQVNLKDAsIDApKTsKKwkvKiAgICAgICBEaXNhYmxlIEFGRSBPZmZzZXQgQ2FuY2VsICovCisJaWJzZF93cl9hbGxjaGFucyhwcGQsIDEyLCAwLCBCTUFTSygxMiwgMTIpKTsKKwkvKiAgICAgICBEaXNhYmxlIFRpbWluZyBMb29wICovCisJaWJzZF93cl9hbGxjaGFucyhwcGQsIDIsIDAsIEJNQVNLKDMsIDMpKTsKKwkvKiAgICAgICBEaXNhYmxlIEZyZXF1ZW5jeSBMb29wICovCisJaWJzZF93cl9hbGxjaGFucyhwcGQsIDIsIDAsIEJNQVNLKDQsIDQpKTsKKwkvKiAgICAgICBEaXNhYmxlIEJhc2VsaW5lIFdhbmRlciBDb3JyZWN0aW9uICovCisJaWJzZF93cl9hbGxjaGFucyhwcGQsIDEzLCAwLCBCTUFTSygxMywgMTMpKTsKKwkvKiAgICAgICBEaXNhYmxlIFJYIENhbGlicmF0aW9uICovCisJaWJzZF93cl9hbGxjaGFucyhwcGQsIDQsIDAsIEJNQVNLKDEwLCAxMCkpOworCS8qICAgICAgIERpc2FibGUgUlggT2Zmc2V0IENhbGlicmF0aW9uICovCisJaWJzZF93cl9hbGxjaGFucyhwcGQsIDEyLCAwLCBCTUFTSyg0LCA0KSk7CisJLyogICAgICAgU2VsZWN0IEJCIENEUiAqLworCWlic2Rfd3JfYWxsY2hhbnMocHBkLCAyLCAoMSA8PCAxNSksIEJNQVNLKDE1LCAxNSkpOworCS8qICAgICAgIENEUiBTdGVwIFNpemUgKi8KKwlpYnNkX3dyX2FsbGNoYW5zKHBwZCwgNSwgMCwgQk1BU0soOSwgOCkpOworCS8qICAgICAgIEVuYWJsZSBwaGFzZSBDYWxpYnJhdGlvbiAqLworCWlic2Rfd3JfYWxsY2hhbnMocHBkLCAxMiwgKDEgPDwgNSksIEJNQVNLKDUsIDUpKTsKKwkvKiAgICAgICBERkUgQmFuZHdpZHRoIFsyOjE0LTEyXSAqLworCWlic2Rfd3JfYWxsY2hhbnMocHBkLCAyLCAoNCA8PCAxMiksIEJNQVNLKDE0LCAxMikpOworCS8qICAgICAgIERGRSBDb25maWcgKDQgdGFwcyBvbmx5KSAqLworCWlic2Rfd3JfYWxsY2hhbnMocHBkLCAxNiwgMCwgQk1BU0soMSwgMCkpOworCS8qICAgICAgIEdhaW4gTG9vcCBCYW5kd2lkdGggKi8KKwlpZiAoIXBwZC0+ZGQtPmNzcGVjLT5yMSkgeworCQlpYnNkX3dyX2FsbGNoYW5zKHBwZCwgMTIsIDEgPDwgMTIsIEJNQVNLKDEyLCAxMikpOworCQlpYnNkX3dyX2FsbGNoYW5zKHBwZCwgMTIsIDIgPDwgOCwgQk1BU0soMTEsIDgpKTsKKwl9IGVsc2UgeworCQlpYnNkX3dyX2FsbGNoYW5zKHBwZCwgMTksICgzIDw8IDExKSwgQk1BU0soMTMsIDExKSk7CisJfQorCS8qICAgICAgIEJhc2VsaW5lIFdhbmRlciBDb3JyZWN0aW9uIEdhaW4gWzEzOjQtMF0gKGxlYXZlIGFzIGRlZmF1bHQpICovCisJLyogICAgICAgQmFzZWxpbmUgV2FuZGVyIENvcnJlY3Rpb24gR2FpbiBbMzo3LTVdIChsZWF2ZSBhcyBkZWZhdWx0KSAqLworCS8qICAgICAgIERhdGEgUmF0ZSBTZWxlY3QgWzU6Ny02XSAobGVhdmUgYXMgZGVmYXVsdCkgKi8KKwkvKiAgICAgICBSWCBQYXJyYWxlbCBXb3JkIFdpZHRoIFszOjEwLThdIChsZWF2ZSBhcyBkZWZhdWx0KSAqLworCisJLyogUlggUkVTVCAqLworCS8qICAgICAgIFNpbmdsZS0gb3IgTXVsdGktY2hhbm5lbCByZXNldCAqLworCS8qICAgICAgIFJYIEFuYWxvZyByZXNldCAqLworCS8qICAgICAgIFJYIERpZ2l0YWwgcmVzZXQgKi8KKwlpYnNkX3dyX2FsbGNoYW5zKHBwZCwgMCwgMCwgQk1BU0soMTUsIDEzKSk7CisJbXNsZWVwKDIwKTsKKwkvKiAgICAgICBSWCBBbmFsb2cgcmVzZXQgKi8KKwlpYnNkX3dyX2FsbGNoYW5zKHBwZCwgMCwgKDEgPDwgMTQpLCBCTUFTSygxNCwgMTQpKTsKKwltc2xlZXAoMjApOworCS8qICAgICAgIFJYIERpZ2l0YWwgcmVzZXQgKi8KKwlpYnNkX3dyX2FsbGNoYW5zKHBwZCwgMCwgKDEgPDwgMTMpLCBCTUFTSygxMywgMTMpKTsKKwltc2xlZXAoMjApOworCisJLyogc2V0dXAgTG9TIHBhcmFtczsgdGhlc2UgYXJlIHN1YnN5c3RlbSwgc28gY2hhbiA9PSA1ICovCisJLyogTG9TIGZpbHRlciB0aHJlc2hvbGRfY291bnQgb24sIGNoIDAtMywgc2V0IHRvIDggKi8KKwlhaGJfbW9kKHBwZC0+ZGQsIElCU0QocHBkLT5od19waWR4KSwgNSwgNSwgOCA8PCAxMSwgQk1BU0soMTQsIDExKSk7CisJYWhiX21vZChwcGQtPmRkLCBJQlNEKHBwZC0+aHdfcGlkeCksIDUsIDcsIDggPDwgNCwgQk1BU0soNywgNCkpOworCWFoYl9tb2QocHBkLT5kZCwgSUJTRChwcGQtPmh3X3BpZHgpLCA1LCA4LCA4IDw8IDExLCBCTUFTSygxNCwgMTEpKTsKKwlhaGJfbW9kKHBwZC0+ZGQsIElCU0QocHBkLT5od19waWR4KSwgNSwgMTAsIDggPDwgNCwgQk1BU0soNywgNCkpOworCisJLyogTG9TIGZpbHRlciB0aHJlc2hvbGRfY291bnQgb2ZmLCBjaCAwLTMsIHNldCB0byA0ICovCisJYWhiX21vZChwcGQtPmRkLCBJQlNEKHBwZC0+aHdfcGlkeCksIDUsIDYsIDQgPDwgMCwgQk1BU0soMywgMCkpOworCWFoYl9tb2QocHBkLT5kZCwgSUJTRChwcGQtPmh3X3BpZHgpLCA1LCA3LCA0IDw8IDgsIEJNQVNLKDExLCA4KSk7CisJYWhiX21vZChwcGQtPmRkLCBJQlNEKHBwZC0+aHdfcGlkeCksIDUsIDksIDQgPDwgMCwgQk1BU0soMywgMCkpOworCWFoYl9tb2QocHBkLT5kZCwgSUJTRChwcGQtPmh3X3BpZHgpLCA1LCAxMCwgNCA8PCA4LCBCTUFTSygxMSwgOCkpOworCisJLyogTG9TIGZpbHRlciBzZWxlY3QgZW5hYmxlZCAqLworCWFoYl9tb2QocHBkLT5kZCwgSUJTRChwcGQtPmh3X3BpZHgpLCA1LCA5LCAxIDw8IDE1LCAxIDw8IDE1KTsKKworCS8qIExvUyB0YXJnZXQgZGF0YTogIFNEUj00LCBERFI9MiwgUURSPTEgKi8KKwlpYnNkX3dyX2FsbGNoYW5zKHBwZCwgMTQsICgxIDw8IDMpLCBCTUFTSyg1LCAzKSk7IC8qIFFEUiAqLworCWlic2Rfd3JfYWxsY2hhbnMocHBkLCAyMCwgKDIgPDwgMTApLCBCTUFTSygxMiwgMTApKTsgLyogRERSICovCisJaWJzZF93cl9hbGxjaGFucyhwcGQsIDIwLCAoNCA8PCAxMyksIEJNQVNLKDE1LCAxMykpOyAvKiBTRFIgKi8KKworCS8qIFR1cm4gb24gTE9TIG9uIGluaXRpYWwgU0VSREVTIGluaXQgKi8KKwlzZXJkZXNfNzMyMl9sb3NfZW5hYmxlKHBwZCwgMSk7CisJLyogRkxvb3AgTE9TIGdhdGU6IFBQTSBmaWx0ZXIgIGVuYWJsZWQgKi8KKwlpYnNkX3dyX2FsbGNoYW5zKHBwZCwgMzgsIDAgPDwgMTAsIDEgPDwgMTApOworCisJLyogUlggTEFUQ0ggQ0FMSUJSQVRJT04gKi8KKwkvKiAgICAgICBFbmFibGUgRXllZmluZGVyIFBoYXNlIENhbGlicmF0aW9uIGxhdGNoICovCisJaWJzZF93cl9hbGxjaGFucyhwcGQsIDE1LCAxLCBCTUFTSygwLCAwKSk7CisJLyogICAgICAgRW5hYmxlIFJYIE9mZnNldCBDYWxpYnJhdGlvbiBsYXRjaCAqLworCWlic2Rfd3JfYWxsY2hhbnMocHBkLCAxMiwgKDEgPDwgNCksIEJNQVNLKDQsIDQpKTsKKwltc2xlZXAoMjApOworCS8qICAgICAgIFN0YXJ0IENhbGlicmF0aW9uICovCisJaWJzZF93cl9hbGxjaGFucyhwcGQsIDQsICgxIDw8IDEwKSwgQk1BU0soMTAsIDEwKSk7CisJdHN0YXJ0ID0gZ2V0X2ppZmZpZXNfNjQoKTsKKwl3aGlsZSAoY2hhbl9kb25lICYmCisJICAgICAgICF0aW1lX2FmdGVyNjQodHN0YXJ0LCB0c3RhcnQgKyBtc2Vjc190b19qaWZmaWVzKDUwMCkpKSB7CisJCW1zbGVlcCgyMCk7CisJCWZvciAoY2hhbiA9IDA7IGNoYW4gPCBTRVJERVNfQ0hBTlM7ICsrY2hhbikgeworCQkJcnhjYWxkb25lID0gYWhiX21vZChwcGQtPmRkLCBJQlNEKHBwZC0+aHdfcGlkeCksCisJCQkJCSAgICAoY2hhbiArIChjaGFuID4+IDEpKSwKKwkJCQkJICAgIDI1LCAwLCAwKTsKKwkJCWlmICgofnJ4Y2FsZG9uZSAmICh1MzIpQk1BU0soOSwgOSkpID09IDAgJiYKKwkJCSAgICAofmNoYW5fZG9uZSAmICgxIDw8IGNoYW4pKSA9PSAwKQorCQkJCWNoYW5fZG9uZSAmPSB+KDEgPDwgY2hhbik7CisJCX0KKwl9CisJaWYgKGNoYW5fZG9uZSkgeworCQlwcmludGsoS0VSTl9JTkZPIFFJQl9EUlZfTkFNRQorCQkJICIgU2VyZGVzICVkIGNhbGlicmF0aW9uIG5vdCBkb25lIGFmdGVyIC41IHNlYzogMHgleFxuIiwKKwkJCSBJQlNEKHBwZC0+aHdfcGlkeCksIGNoYW5fZG9uZSk7CisJfSBlbHNlIHsKKwkJZm9yIChjaGFuID0gMDsgY2hhbiA8IFNFUkRFU19DSEFOUzsgKytjaGFuKSB7CisJCQlyeGNhbGRvbmUgPSBhaGJfbW9kKHBwZC0+ZGQsIElCU0QocHBkLT5od19waWR4KSwKKwkJCQkJICAgIChjaGFuICsgKGNoYW4gPj4gMSkpLAorCQkJCQkgICAgMjUsIDAsIDApOworCQkJaWYgKCh+cnhjYWxkb25lICYgKHUzMilCTUFTSygxMCwgMTApKSA9PSAwKQorCQkJCXByaW50ayhLRVJOX0lORk8gUUlCX0RSVl9OQU1FCisJCQkJCSAiIFNlcmRlcyAlZCBjaGFuICVkIGNhbGlicmF0aW9uICIKKwkJCQkJICJmYWlsZWRcbiIsIElCU0QocHBkLT5od19waWR4KSwgY2hhbik7CisJCX0KKwl9CisKKwkvKiAgICAgICBUdXJuIG9mZiBDYWxpYnJhdGlvbiAqLworCWlic2Rfd3JfYWxsY2hhbnMocHBkLCA0LCAwLCBCTUFTSygxMCwgMTApKTsKKwltc2xlZXAoMjApOworCisJLyogQlJJTkcgUlggVVAgKi8KKwkvKiAgICAgICBTZXQgTEUyIHZhbHVlIChNYXkgYmUgb3ZlcnJpZGRlbiBpbiBxc2ZwXzczMjJfZXZlbnQpICovCisJbGVfdmFsID0gSVNfUU1FKHBwZC0+ZGQpID8gTEUyX1FNRSA6IExFMl9ERUZBVUxUOworCWlic2Rfd3JfYWxsY2hhbnMocHBkLCAxMywgKGxlX3ZhbCA8PCA3KSwgQk1BU0soOSwgNykpOworCS8qICAgICAgIFNldCBMRTIgTG9vcCBiYW5kd2lkdGggKi8KKwlpYnNkX3dyX2FsbGNoYW5zKHBwZCwgMywgKDcgPDwgNSksIEJNQVNLKDcsIDUpKTsKKwkvKiAgICAgICBFbmFibGUgTEUyICovCisJaWJzZF93cl9hbGxjaGFucyhwcGQsIDEzLCAoMSA8PCA2KSwgQk1BU0soNiwgNikpOworCW1zbGVlcCgyMCk7CisJLyogICAgICAgRW5hYmxlIEgwIG9ubHkgKi8KKwlpYnNkX3dyX2FsbGNoYW5zKHBwZCwgMSwgMSwgQk1BU0soOSwgMSkpOworCS8qIGdhaW4gaGkgc3RvcCAzMiAoMjIpICg2OjEpIGxvIHN0b3AgNyAoMTA6NykgdGFyZ2V0IDIyICgxMykgKDE1OjExKSAqLworCWxlX3ZhbCA9IChwcGQtPmRkLT5jc3BlYy0+cjEgfHwgSVNfUU1FKHBwZC0+ZGQpKSA/IDB4YjZjMCA6IDB4NmJhYzsKKwlpYnNkX3dyX2FsbGNoYW5zKHBwZCwgMjEsIGxlX3ZhbCwgMHhmZmZlKTsKKwkvKiAgICAgICBFbmFibGUgVkdBICovCisJaWJzZF93cl9hbGxjaGFucyhwcGQsIDUsIDAsIEJNQVNLKDAsIDApKTsKKwltc2xlZXAoMjApOworCS8qICAgICAgIFNldCBGcmVxdWVuY3kgTG9vcCBCYW5kd2lkdGggKi8KKwlpYnNkX3dyX2FsbGNoYW5zKHBwZCwgMiwgKDcgPDwgNSksIEJNQVNLKDgsIDUpKTsKKwkvKiAgICAgICBFbmFibGUgRnJlcXVlbmN5IExvb3AgKi8KKwlpYnNkX3dyX2FsbGNoYW5zKHBwZCwgMiwgKDEgPDwgNCksIEJNQVNLKDQsIDQpKTsKKwkvKiAgICAgICBTZXQgVGltaW5nIExvb3AgQmFuZHdpZHRoICovCisJaWJzZF93cl9hbGxjaGFucyhwcGQsIDIsIDAsIEJNQVNLKDExLCA5KSk7CisJLyogICAgICAgRW5hYmxlIFRpbWluZyBMb29wICovCisJaWJzZF93cl9hbGxjaGFucyhwcGQsIDIsICgxIDw8IDMpLCBCTUFTSygzLCAzKSk7CisJbXNsZWVwKDUwKTsKKwkvKiAgICAgICBFbmFibGUgREZFCisJICogICAgICAgU2V0IHJlY2VpdmUgYWRhcHRhdGlvbiBtb2RlLiAgU0RSIGFuZCBERFIgYWRhcHRhdGlvbiBhcmUKKwkgKiAgICAgICBhbHdheXMgb24sIGFuZCBRRFIgaXMgaW5pdGlhbGx5IGVuYWJsZWQ7IGxhdGVyIGRpc2FibGVkLgorCSAqLworCXFpYl93cml0ZV9rcmVnX3BvcnQocHBkLCBrcnBfc3RhdGljX2FkYXB0X2RpcygwKSwgMFVMTCk7CisJcWliX3dyaXRlX2tyZWdfcG9ydChwcGQsIGtycF9zdGF0aWNfYWRhcHRfZGlzKDEpLCAwVUxMKTsKKwlxaWJfd3JpdGVfa3JlZ19wb3J0KHBwZCwga3JwX3N0YXRpY19hZGFwdF9kaXMoMiksCisJCQkgICAgcHBkLT5kZC0+Y3NwZWMtPnIxID8KKwkJCSAgICBRRFJfU1RBVElDX0FEQVBUX0RPV05fUjEgOiBRRFJfU1RBVElDX0FEQVBUX0RPV04pOworCXBwZC0+Y3BzcGVjLT5xZHJfZGZlX29uID0gMTsKKwkvKiAgICAgICBEaXNhYmxlIExFMSAgKi8KKwlpYnNkX3dyX2FsbGNoYW5zKHBwZCwgMTMsICgwIDw8IDUpLCAoMSA8PCA1KSk7CisJLyogICAgICAgRGlzYWJsZSBhdXRvIGFkYXB0IGZvciBMRTEgKi8KKwlpYnNkX3dyX2FsbGNoYW5zKHBwZCwgMSwgKDAgPDwgMTUpLCBCTUFTSygxNSwgMTUpKTsKKwltc2xlZXAoMjApOworCS8qICAgICAgIEVuYWJsZSBBRkUgT2Zmc2V0IENhbmNlbCAqLworCWlic2Rfd3JfYWxsY2hhbnMocHBkLCAxMiwgKDEgPDwgMTIpLCBCTUFTSygxMiwgMTIpKTsKKwkvKiAgICAgICBFbmFibGUgQmFzZWxpbmUgV2FuZGVyIENvcnJlY3Rpb24gKi8KKwlpYnNkX3dyX2FsbGNoYW5zKHBwZCwgMTIsICgxIDw8IDEzKSwgQk1BU0soMTMsIDEzKSk7CisJLyogVGVybWluYXRpb246IHJ4dGVybWN0cmxfcjJkIGFkZHIgMTEgYml0cyBbMTI6MTFdID0gMSAqLworCWlic2Rfd3JfYWxsY2hhbnMocHBkLCAxMSwgKDEgPDwgMTEpLCBCTUFTSygxMiwgMTEpKTsKKwkvKiBWR0Egb3V0cHV0IGNvbW1vbiBtb2RlICovCisJaWJzZF93cl9hbGxjaGFucyhwcGQsIDEyLCAoMyA8PCAyKSwgQk1BU0soMywgMikpOworCisJcmV0dXJuIDA7Cit9CisKIC8qIHN0YXJ0IGFkanVzdCBRTUggc2VyZGVzIHBhcmFtZXRlcnMgKi8KIAogc3RhdGljIHZvaWQgc2V0X21hbl9jb2RlKHN0cnVjdCBxaWJfcHBvcnRkYXRhICpwcGQsIGludCBjaGFuLCBpbnQgY29kZSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX2luaXQuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX2luaXQuYwppbmRleCBmM2I1MDM5Li43ODk2YWZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl9pbml0LmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfaW5pdC5jCkBAIC05Miw5ICs5MiwxMSBAQAogLyogc2V0IG51bWJlciBvZiBjb250ZXh0cyB3ZSdsbCBhY3R1YWxseSB1c2UgKi8KIHZvaWQgcWliX3NldF9jdHh0Y250KHN0cnVjdCBxaWJfZGV2ZGF0YSAqZGQpCiB7Ci0JaWYgKCFxaWJfY2ZnY3R4dHMpCisJaWYgKCFxaWJfY2ZnY3R4dHMpIHsKIAkJZGQtPmNmZ2N0eHRzID0gZGQtPmZpcnN0X3VzZXJfY3R4dCArIG51bV9vbmxpbmVfY3B1cygpOwotCWVsc2UgaWYgKHFpYl9jZmdjdHh0cyA8IGRkLT5udW1fcHBvcnRzKQorCQlpZiAoZGQtPmNmZ2N0eHRzID4gZGQtPmN0eHRjbnQpCisJCQlkZC0+Y2ZnY3R4dHMgPSBkZC0+Y3R4dGNudDsKKwl9IGVsc2UgaWYgKHFpYl9jZmdjdHh0cyA8IGRkLT5udW1fcHBvcnRzKQogCQlkZC0+Y2ZnY3R4dHMgPSBkZC0+Y3R4dGNudDsKIAllbHNlIGlmIChxaWJfY2ZnY3R4dHMgPD0gZGQtPmN0eHRjbnQpCiAJCWRkLT5jZmdjdHh0cyA9IHFpYl9jZmdjdHh0czsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX2ludHIuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX2ludHIuYwppbmRleCA1NGE0MDgyLi5hNjkzYzU2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl9pbnRyLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfaW50ci5jCkBAIC0xMzEsNyArMTMxLDggQEAKIAkJCS8qIHN0YXJ0IGEgNzVtc2VjIHRpbWVyIHRvIGNsZWFyIHN5bWJvbCBlcnJvcnMgKi8KIAkJCW1vZF90aW1lcigmcHBkLT5zeW1lcnJfY2xlYXJfdGltZXIsCiAJCQkJICBtc2Vjc190b19qaWZmaWVzKDc1KSk7Ci0JCX0gZWxzZSBpZiAobHRzdGF0ZSA9PSBJQl9QSFlTUE9SVFNUQVRFX0xJTktVUCkgeworCQl9IGVsc2UgaWYgKGx0c3RhdGUgPT0gSUJfUEhZU1BPUlRTVEFURV9MSU5LVVAgJiYKKwkJCSAgICEocHBkLT5sZmxhZ3MgJiBRSUJMX0xJTktBQ1RJVkUpKSB7CiAJCQkvKiBhY3RpdmUsIGJ1dCBub3QgYWN0aXZlIGRlZmVyZWQgKi8KIAkJCXFpYl9ob2xfdXAocHBkKTsgLyogdXNlZnVsIG9ubHkgZm9yIDYxMjAgbm93ICovCiAJCQkqcHBkLT5zdGF0dXNwIHw9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl9rZXlzLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl9rZXlzLmMKaW5kZXggNGI4MGViMS4uOGZkMTlhNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfa2V5cy5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX2tleXMuYwpAQCAtMTM2LDcgKzEzNiw2IEBACiAJc3RydWN0IHFpYl9tcmVnaW9uICptcjsKIAl1bnNpZ25lZCBuLCBtOwogCXNpemVfdCBvZmY7Ci0JaW50IHJldCA9IDA7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCS8qCkBAIC0xNTIsNiArMTUxLDggQEAKIAkJaWYgKCFkZXYtPmRtYV9tcikKIAkJCWdvdG8gYmFpbDsKIAkJYXRvbWljX2luYygmZGV2LT5kbWFfbXItPnJlZmNvdW50KTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcmt0LT5sb2NrLCBmbGFncyk7CisKIAkJaXNnZS0+bXIgPSBkZXYtPmRtYV9tcjsKIAkJaXNnZS0+dmFkZHIgPSAodm9pZCAqKSBzZ2UtPmFkZHI7CiAJCWlzZ2UtPmxlbmd0aCA9IHNnZS0+bGVuZ3RoOwpAQCAtMTcwLDE5ICsxNzEsMzQgQEAKIAkJICAgICBvZmYgKyBzZ2UtPmxlbmd0aCA+IG1yLT5sZW5ndGggfHwKIAkJICAgICAobXItPmFjY2Vzc19mbGFncyAmIGFjYykgIT0gYWNjKSkKIAkJZ290byBiYWlsOworCWF0b21pY19pbmMoJm1yLT5yZWZjb3VudCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcmt0LT5sb2NrLCBmbGFncyk7CiAKIAlvZmYgKz0gbXItPm9mZnNldDsKLQltID0gMDsKLQluID0gMDsKLQl3aGlsZSAob2ZmID49IG1yLT5tYXBbbV0tPnNlZ3Nbbl0ubGVuZ3RoKSB7Ci0JCW9mZiAtPSBtci0+bWFwW21dLT5zZWdzW25dLmxlbmd0aDsKLQkJbisrOwotCQlpZiAobiA+PSBRSUJfU0VHU1opIHsKLQkJCW0rKzsKLQkJCW4gPSAwOworCWlmIChtci0+cGFnZV9zaGlmdCkgeworCQkvKgorCQlwYWdlIHNpemVzIGFyZSB1bmlmb3JtIHBvd2VyIG9mIDIgc28gbm8gbG9vcCBpcyBuZWNlc3NhcnkKKwkJZW50cmllc19zcGFubmVkX2J5X29mZiBpcyB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBsb29wIGJlbG93CisJCXdvdWxkIGhhdmUgZXhlY3V0ZWQuCisJCSovCisJCXNpemVfdCBlbnRyaWVzX3NwYW5uZWRfYnlfb2ZmOworCisJCWVudHJpZXNfc3Bhbm5lZF9ieV9vZmYgPSBvZmYgPj4gbXItPnBhZ2Vfc2hpZnQ7CisJCW9mZiAtPSAoZW50cmllc19zcGFubmVkX2J5X29mZiA8PCBtci0+cGFnZV9zaGlmdCk7CisJCW0gPSBlbnRyaWVzX3NwYW5uZWRfYnlfb2ZmL1FJQl9TRUdTWjsKKwkJbiA9IGVudHJpZXNfc3Bhbm5lZF9ieV9vZmYlUUlCX1NFR1NaOworCX0gZWxzZSB7CisJCW0gPSAwOworCQluID0gMDsKKwkJd2hpbGUgKG9mZiA+PSBtci0+bWFwW21dLT5zZWdzW25dLmxlbmd0aCkgeworCQkJb2ZmIC09IG1yLT5tYXBbbV0tPnNlZ3Nbbl0ubGVuZ3RoOworCQkJbisrOworCQkJaWYgKG4gPj0gUUlCX1NFR1NaKSB7CisJCQkJbSsrOworCQkJCW4gPSAwOworCQkJfQogCQl9CiAJfQotCWF0b21pY19pbmMoJm1yLT5yZWZjb3VudCk7CiAJaXNnZS0+bXIgPSBtcjsKIAlpc2dlLT52YWRkciA9IG1yLT5tYXBbbV0tPnNlZ3Nbbl0udmFkZHIgKyBvZmY7CiAJaXNnZS0+bGVuZ3RoID0gbXItPm1hcFttXS0+c2Vnc1tuXS5sZW5ndGggLSBvZmY7CkBAIC0xOTAsMTAgKzIwNiwxMCBAQAogCWlzZ2UtPm0gPSBtOwogCWlzZ2UtPm4gPSBuOwogb2s6Ci0JcmV0ID0gMTsKKwlyZXR1cm4gMTsKIGJhaWw6CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcmt0LT5sb2NrLCBmbGFncyk7Ci0JcmV0dXJuIHJldDsKKwlyZXR1cm4gMDsKIH0KIAogLyoqCkBAIC0yMTQsNyArMjMwLDYgQEAKIAlzdHJ1Y3QgcWliX21yZWdpb24gKm1yOwogCXVuc2lnbmVkIG4sIG07CiAJc2l6ZV90IG9mZjsKLQlpbnQgcmV0ID0gMDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJLyoKQEAgLTIzMSw2ICsyNDYsOCBAQAogCQlpZiAoIWRldi0+ZG1hX21yKQogCQkJZ290byBiYWlsOwogCQlhdG9taWNfaW5jKCZkZXYtPmRtYV9tci0+cmVmY291bnQpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZya3QtPmxvY2ssIGZsYWdzKTsKKwogCQlzZ2UtPm1yID0gZGV2LT5kbWFfbXI7CiAJCXNnZS0+dmFkZHIgPSAodm9pZCAqKSB2YWRkcjsKIAkJc2dlLT5sZW5ndGggPSBsZW47CkBAIC0yNDgsMTkgKzI2NSwzNCBAQAogCWlmICh1bmxpa2VseSh2YWRkciA8IG1yLT5pb3ZhIHx8IG9mZiArIGxlbiA+IG1yLT5sZW5ndGggfHwKIAkJICAgICAobXItPmFjY2Vzc19mbGFncyAmIGFjYykgPT0gMCkpCiAJCWdvdG8gYmFpbDsKKwlhdG9taWNfaW5jKCZtci0+cmVmY291bnQpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJrdC0+bG9jaywgZmxhZ3MpOwogCiAJb2ZmICs9IG1yLT5vZmZzZXQ7Ci0JbSA9IDA7Ci0JbiA9IDA7Ci0Jd2hpbGUgKG9mZiA+PSBtci0+bWFwW21dLT5zZWdzW25dLmxlbmd0aCkgewotCQlvZmYgLT0gbXItPm1hcFttXS0+c2Vnc1tuXS5sZW5ndGg7Ci0JCW4rKzsKLQkJaWYgKG4gPj0gUUlCX1NFR1NaKSB7Ci0JCQltKys7Ci0JCQluID0gMDsKKwlpZiAobXItPnBhZ2Vfc2hpZnQpIHsKKwkJLyoKKwkJcGFnZSBzaXplcyBhcmUgdW5pZm9ybSBwb3dlciBvZiAyIHNvIG5vIGxvb3AgaXMgbmVjZXNzYXJ5CisJCWVudHJpZXNfc3Bhbm5lZF9ieV9vZmYgaXMgdGhlIG51bWJlciBvZiB0aW1lcyB0aGUgbG9vcCBiZWxvdworCQl3b3VsZCBoYXZlIGV4ZWN1dGVkLgorCQkqLworCQlzaXplX3QgZW50cmllc19zcGFubmVkX2J5X29mZjsKKworCQllbnRyaWVzX3NwYW5uZWRfYnlfb2ZmID0gb2ZmID4+IG1yLT5wYWdlX3NoaWZ0OworCQlvZmYgLT0gKGVudHJpZXNfc3Bhbm5lZF9ieV9vZmYgPDwgbXItPnBhZ2Vfc2hpZnQpOworCQltID0gZW50cmllc19zcGFubmVkX2J5X29mZi9RSUJfU0VHU1o7CisJCW4gPSBlbnRyaWVzX3NwYW5uZWRfYnlfb2ZmJVFJQl9TRUdTWjsKKwl9IGVsc2UgeworCQltID0gMDsKKwkJbiA9IDA7CisJCXdoaWxlIChvZmYgPj0gbXItPm1hcFttXS0+c2Vnc1tuXS5sZW5ndGgpIHsKKwkJCW9mZiAtPSBtci0+bWFwW21dLT5zZWdzW25dLmxlbmd0aDsKKwkJCW4rKzsKKwkJCWlmIChuID49IFFJQl9TRUdTWikgeworCQkJCW0rKzsKKwkJCQluID0gMDsKKwkJCX0KIAkJfQogCX0KLQlhdG9taWNfaW5jKCZtci0+cmVmY291bnQpOwogCXNnZS0+bXIgPSBtcjsKIAlzZ2UtPnZhZGRyID0gbXItPm1hcFttXS0+c2Vnc1tuXS52YWRkciArIG9mZjsKIAlzZ2UtPmxlbmd0aCA9IG1yLT5tYXBbbV0tPnNlZ3Nbbl0ubGVuZ3RoIC0gb2ZmOwpAQCAtMjY4LDEwICszMDAsMTAgQEAKIAlzZ2UtPm0gPSBtOwogCXNnZS0+biA9IG47CiBvazoKLQlyZXQgPSAxOworCXJldHVybiAxOwogYmFpbDoKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZya3QtPmxvY2ssIGZsYWdzKTsKLQlyZXR1cm4gcmV0OworCXJldHVybiAwOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfbWFkLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl9tYWQuYwppbmRleCA5NGIwZDFmLi41YWQyMjRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl9tYWQuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl9tYWQuYwpAQCAtNjY4LDggKzY2OCw4IEBACiAJbGlkID0gYmUxNl90b19jcHUocGlwLT5saWQpOwogCS8qIE11c3QgYmUgYSB2YWxpZCB1bmljYXN0IExJRCBhZGRyZXNzLiAqLwogCWlmIChsaWQgPT0gMCB8fCBsaWQgPj0gUUlCX01VTFRJQ0FTVF9MSURfQkFTRSkKLQkJZ290byBlcnI7Ci0JaWYgKHBwZC0+bGlkICE9IGxpZCB8fCBwcGQtPmxtYyAhPSAocGlwLT5ta2V5cHJvdF9yZXN2X2xtYyAmIDcpKSB7CisJCXNtcC0+c3RhdHVzIHw9IElCX1NNUF9JTlZBTElEX0ZJRUxEOworCWVsc2UgaWYgKHBwZC0+bGlkICE9IGxpZCB8fCBwcGQtPmxtYyAhPSAocGlwLT5ta2V5cHJvdF9yZXN2X2xtYyAmIDcpKSB7CiAJCWlmIChwcGQtPmxpZCAhPSBsaWQpCiAJCQlxaWJfc2V0X3VldmVudF9iaXRzKHBwZCwgX1FJQl9FVkVOVF9MSURfQ0hBTkdFX0JJVCk7CiAJCWlmIChwcGQtPmxtYyAhPSAocGlwLT5ta2V5cHJvdF9yZXN2X2xtYyAmIDcpKQpAQCAtNjgzLDggKzY4Myw4IEBACiAJbXNsID0gcGlwLT5uZWlnaGJvcm10dV9tYXN0ZXJzbXNsICYgMHhGOwogCS8qIE11c3QgYmUgYSB2YWxpZCB1bmljYXN0IExJRCBhZGRyZXNzLiAqLwogCWlmIChzbWxpZCA9PSAwIHx8IHNtbGlkID49IFFJQl9NVUxUSUNBU1RfTElEX0JBU0UpCi0JCWdvdG8gZXJyOwotCWlmIChzbWxpZCAhPSBpYnAtPnNtX2xpZCB8fCBtc2wgIT0gaWJwLT5zbV9zbCkgeworCQlzbXAtPnN0YXR1cyB8PSBJQl9TTVBfSU5WQUxJRF9GSUVMRDsKKwllbHNlIGlmIChzbWxpZCAhPSBpYnAtPnNtX2xpZCB8fCBtc2wgIT0gaWJwLT5zbV9zbCkgewogCQlzcGluX2xvY2tfaXJxc2F2ZSgmaWJwLT5sb2NrLCBmbGFncyk7CiAJCWlmIChpYnAtPnNtX2FoKSB7CiAJCQlpZiAoc21saWQgIT0gaWJwLT5zbV9saWQpCkBAIC03MDcsOCArNzA3LDkgQEAKIAkJaWYgKGx3ZSA9PSAweEZGKQogCQkJbHdlID0gcHBkLT5saW5rX3dpZHRoX3N1cHBvcnRlZDsKIAkJZWxzZSBpZiAobHdlID49IDE2IHx8IChsd2UgJiB+cHBkLT5saW5rX3dpZHRoX3N1cHBvcnRlZCkpCi0JCQlnb3RvIGVycjsKLQkJc2V0X2xpbmtfd2lkdGhfZW5hYmxlZChwcGQsIGx3ZSk7CisJCQlzbXAtPnN0YXR1cyB8PSBJQl9TTVBfSU5WQUxJRF9GSUVMRDsKKwkJZWxzZSBpZiAobHdlICE9IHBwZC0+bGlua193aWR0aF9lbmFibGVkKQorCQkJc2V0X2xpbmtfd2lkdGhfZW5hYmxlZChwcGQsIGx3ZSk7CiAJfQogCiAJbHNlID0gcGlwLT5saW5rc3BlZWRhY3RpdmVfZW5hYmxlZCAmIDB4RjsKQEAgLTcyMSw4ICs3MjIsOSBAQAogCQlpZiAobHNlID09IDE1KQogCQkJbHNlID0gcHBkLT5saW5rX3NwZWVkX3N1cHBvcnRlZDsKIAkJZWxzZSBpZiAobHNlID49IDggfHwgKGxzZSAmIH5wcGQtPmxpbmtfc3BlZWRfc3VwcG9ydGVkKSkKLQkJCWdvdG8gZXJyOwotCQlzZXRfbGlua19zcGVlZF9lbmFibGVkKHBwZCwgbHNlKTsKKwkJCXNtcC0+c3RhdHVzIHw9IElCX1NNUF9JTlZBTElEX0ZJRUxEOworCQllbHNlIGlmIChsc2UgIT0gcHBkLT5saW5rX3NwZWVkX2VuYWJsZWQpCisJCQlzZXRfbGlua19zcGVlZF9lbmFibGVkKHBwZCwgbHNlKTsKIAl9CiAKIAkvKiBTZXQgbGluayBkb3duIGRlZmF1bHQgc3RhdGUuICovCkBAIC03MzgsNyArNzQwLDcgQEAKIAkJCQkJSUJfTElOS0lOSVRDTURfUE9MTCk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCWdvdG8gZXJyOworCQlzbXAtPnN0YXR1cyB8PSBJQl9TTVBfSU5WQUxJRF9GSUVMRDsKIAl9CiAKIAlpYnAtPm1rZXlwcm90ID0gcGlwLT5ta2V5cHJvdF9yZXN2X2xtYyA+PiA2OwpAQCAtNzQ4LDE1ICs3NTAsMTcgQEAKIAogCW10dSA9IGliX210dV9lbnVtX3RvX2ludCgocGlwLT5uZWlnaGJvcm10dV9tYXN0ZXJzbXNsID4+IDQpICYgMHhGKTsKIAlpZiAobXR1ID09IC0xKQotCQlnb3RvIGVycjsKLQlxaWJfc2V0X210dShwcGQsIG10dSk7CisJCXNtcC0+c3RhdHVzIHw9IElCX1NNUF9JTlZBTElEX0ZJRUxEOworCWVsc2UKKwkJcWliX3NldF9tdHUocHBkLCBtdHUpOwogCiAJLyogU2V0IG9wZXJhdGlvbmFsIFZMcyAqLwogCXZscyA9IChwaXAtPm9wZXJhdGlvbmFsdmxfcGVpX3Blb19mcGlfZnBvID4+IDQpICYgMHhGOwogCWlmICh2bHMpIHsKIAkJaWYgKHZscyA+IHBwZC0+dmxzX3N1cHBvcnRlZCkKLQkJCWdvdG8gZXJyOwotCQkodm9pZCkgZGQtPmZfc2V0X2liX2NmZyhwcGQsIFFJQl9JQl9DRkdfT1BfVkxTLCB2bHMpOworCQkJc21wLT5zdGF0dXMgfD0gSUJfU01QX0lOVkFMSURfRklFTEQ7CisJCWVsc2UKKwkJCSh2b2lkKSBkZC0+Zl9zZXRfaWJfY2ZnKHBwZCwgUUlCX0lCX0NGR19PUF9WTFMsIHZscyk7CiAJfQogCiAJaWYgKHBpcC0+bWtleV92aW9sYXRpb25zID09IDApCkBAIC03NzAsMTAgKzc3NCwxMCBAQAogCiAJb3JlID0gcGlwLT5sb2NhbHBoeWVycm9yc19vdmVycnVuZXJyb3JzOwogCWlmIChzZXRfcGh5ZXJydGhyZXNob2xkKHBwZCwgKG9yZSA+PiA0KSAmIDB4RikpCi0JCWdvdG8gZXJyOworCQlzbXAtPnN0YXR1cyB8PSBJQl9TTVBfSU5WQUxJRF9GSUVMRDsKIAogCWlmIChzZXRfb3ZlcnJ1bnRocmVzaG9sZChwcGQsIChvcmUgJiAweEYpKSkKLQkJZ290byBlcnI7CisJCXNtcC0+c3RhdHVzIHw9IElCX1NNUF9JTlZBTElEX0ZJRUxEOwogCiAJaWJwLT5zdWJuZXRfdGltZW91dCA9IHBpcC0+Y2xpZW50cmVyZWdfcmVzdl9zdWJuZXR0byAmIDB4MUY7CiAKQEAgLTc5Miw3ICs3OTYsNyBAQAogCXN0YXRlID0gcGlwLT5saW5rc3BlZWRfcG9ydHN0YXRlICYgMHhGOwogCWxzdGF0ZSA9IChwaXAtPnBvcnRwaHlzc3RhdGVfbGlua2Rvd24gPj4gNCkgJiAweEY7CiAJaWYgKGxzdGF0ZSAmJiAhKHN0YXRlID09IElCX1BPUlRfRE9XTiB8fCBzdGF0ZSA9PSBJQl9QT1JUX05PUCkpCi0JCWdvdG8gZXJyOworCQlzbXAtPnN0YXR1cyB8PSBJQl9TTVBfSU5WQUxJRF9GSUVMRDsKIAogCS8qCiAJICogT25seSBzdGF0ZSBjaGFuZ2VzIG9mIERPV04sIEFSTSwgYW5kIEFDVElWRSBhcmUgdmFsaWQKQEAgLTgxMiw4ICs4MTYsMTAgQEAKIAkJCWxzdGF0ZSA9IFFJQl9JQl9MSU5LRE9XTjsKIAkJZWxzZSBpZiAobHN0YXRlID09IDMpCiAJCQlsc3RhdGUgPSBRSUJfSUJfTElOS0RPV05fRElTQUJMRTsKLQkJZWxzZQotCQkJZ290byBlcnI7CisJCWVsc2UgeworCQkJc21wLT5zdGF0dXMgfD0gSUJfU01QX0lOVkFMSURfRklFTEQ7CisJCQlicmVhazsKKwkJfQogCQlzcGluX2xvY2tfaXJxc2F2ZSgmcHBkLT5sZmxhZ3NfbG9jaywgZmxhZ3MpOwogCQlwcGQtPmxmbGFncyAmPSB+UUlCTF9MSU5LVjsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHBkLT5sZmxhZ3NfbG9jaywgZmxhZ3MpOwpAQCAtODM1LDggKzg0MSw3IEBACiAJCXFpYl9zZXRfbGlua3N0YXRlKHBwZCwgUUlCX0lCX0xJTktBQ1RJVkUpOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQkvKiBYWFggV2UgaGF2ZSBhbHJlYWR5IHBhcnRpYWxseSB1cGRhdGVkIG91ciBzdGF0ZSEgKi8KLQkJZ290byBlcnI7CisJCXNtcC0+c3RhdHVzIHw9IElCX1NNUF9JTlZBTElEX0ZJRUxEOwogCX0KIAogCXJldCA9IHN1Ym5fZ2V0X3BvcnRpbmZvKHNtcCwgaWJkZXYsIHBvcnQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfbXIuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX21yLmMKaW5kZXggNWY5NWYwZi4uMDg5NDRlMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfbXIuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl9tci5jCkBAIC0zOSw3ICszOSw2IEBACiAvKiBGYXN0IG1lbW9yeSByZWdpb24gKi8KIHN0cnVjdCBxaWJfZm1yIHsKIAlzdHJ1Y3QgaWJfZm1yIGliZm1yOwotCXU4IHBhZ2Vfc2hpZnQ7CiAJc3RydWN0IHFpYl9tcmVnaW9uIG1yOyAgICAgICAgLyogbXVzdCBiZSBsYXN0ICovCiB9OwogCkBAIC0xMDcsNiArMTA2LDcgQEAKIAkJCWdvdG8gYmFpbDsKIAl9CiAJbXItPm1yLm1hcHN6ID0gbTsKKwltci0+bXIucGFnZV9zaGlmdCA9IDA7CiAJbXItPm1yLm1heF9zZWdzID0gY291bnQ7CiAKIAkvKgpAQCAtMjMxLDYgKzIzMSw4IEBACiAJbXItPm1yLmFjY2Vzc19mbGFncyA9IG1yX2FjY2Vzc19mbGFnczsKIAltci0+dW1lbSA9IHVtZW07CiAKKwlpZiAoaXNfcG93ZXJfb2ZfMih1bWVtLT5wYWdlX3NpemUpKQorCQltci0+bXIucGFnZV9zaGlmdCA9IGlsb2cyKHVtZW0tPnBhZ2Vfc2l6ZSk7CiAJbSA9IDA7CiAJbiA9IDA7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeShjaHVuaywgJnVtZW0tPmNodW5rX2xpc3QsIGxpc3QpIHsKQEAgLTM5MCw3ICszOTIsNyBAQAogCWZtci0+bXIub2Zmc2V0ID0gMDsKIAlmbXItPm1yLmFjY2Vzc19mbGFncyA9IG1yX2FjY2Vzc19mbGFnczsKIAlmbXItPm1yLm1heF9zZWdzID0gZm1yX2F0dHItPm1heF9wYWdlczsKLQlmbXItPnBhZ2Vfc2hpZnQgPSBmbXJfYXR0ci0+cGFnZV9zaGlmdDsKKwlmbXItPm1yLnBhZ2Vfc2hpZnQgPSBmbXJfYXR0ci0+cGFnZV9zaGlmdDsKIAogCWF0b21pY19zZXQoJmZtci0+bXIucmVmY291bnQsIDApOwogCXJldCA9ICZmbXItPmliZm1yOwpAQCAtNDM3LDcgKzQzOSw3IEBACiAJc3Bpbl9sb2NrX2lycXNhdmUoJnJrdC0+bG9jaywgZmxhZ3MpOwogCWZtci0+bXIudXNlcl9iYXNlID0gaW92YTsKIAlmbXItPm1yLmlvdmEgPSBpb3ZhOwotCXBzID0gMSA8PCBmbXItPnBhZ2Vfc2hpZnQ7CisJcHMgPSAxIDw8IGZtci0+bXIucGFnZV9zaGlmdDsKIAlmbXItPm1yLmxlbmd0aCA9IGxpc3RfbGVuICogcHM7CiAJbSA9IDA7CiAJbiA9IDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl9xcC5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfcXAuYwppbmRleCA2YzM5ODUxLi5lMTY3NTFmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl9xcC5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX3FwLmMKQEAgLTQ4LDEzICs0OCwxMiBAQAogCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGZpbmRfbmV4dF9vZmZzZXQoc3RydWN0IHFpYl9xcG5fdGFibGUgKnFwdCwKIAkJCQkJc3RydWN0IHFwbl9tYXAgKm1hcCwgdW5zaWduZWQgb2ZmLAotCQkJCQl1bnNpZ25lZCByKQorCQkJCQl1bnNpZ25lZCBuKQogewogCWlmIChxcHQtPm1hc2spIHsKIAkJb2ZmKys7Ci0JCWlmICgob2ZmICYgcXB0LT5tYXNrKSA+PiAxICE9IHIpCi0JCQlvZmYgPSAoKG9mZiAmIHFwdC0+bWFzaykgPwotCQkJCShvZmYgfCBxcHQtPm1hc2spICsgMSA6IG9mZikgfCAociA8PCAxKTsKKwkJaWYgKCgob2ZmICYgcXB0LT5tYXNrKSA+PiAxKSA+PSBuKQorCQkJb2ZmID0gKG9mZiB8IHFwdC0+bWFzaykgKyAyOwogCX0gZWxzZQogCQlvZmYgPSBmaW5kX25leHRfemVyb19iaXQobWFwLT5wYWdlLCBCSVRTX1BFUl9QQUdFLCBvZmYpOwogCXJldHVybiBvZmY7CkBAIC0xMjMsNyArMTIyLDYgQEAKIAl1MzIgaSwgb2Zmc2V0LCBtYXhfc2NhbiwgcXBuOwogCXN0cnVjdCBxcG5fbWFwICptYXA7CiAJdTMyIHJldDsKLQlpbnQgcjsKIAogCWlmICh0eXBlID09IElCX1FQVF9TTUkgfHwgdHlwZSA9PSBJQl9RUFRfR1NJKSB7CiAJCXVuc2lnbmVkIG47CkBAIC0xMzksMTUgKzEzNywxMSBAQAogCQlnb3RvIGJhaWw7CiAJfQogCi0JciA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKLQlpZiAociA+PSBkZC0+bl9rcmN2X3F1ZXVlcykKLQkJciAlPSBkZC0+bl9rcmN2X3F1ZXVlczsKLQlxcG4gPSBxcHQtPmxhc3QgKyAxOworCXFwbiA9IHFwdC0+bGFzdCArIDI7CiAJaWYgKHFwbiA+PSBRUE5fTUFYKQogCQlxcG4gPSAyOwotCWlmIChxcHQtPm1hc2sgJiYgKChxcG4gJiBxcHQtPm1hc2spID4+IDEpICE9IHIpCi0JCXFwbiA9ICgocXBuICYgcXB0LT5tYXNrKSA/IChxcG4gfCBxcHQtPm1hc2spICsgMSA6IHFwbikgfAotCQkJKHIgPDwgMSk7CisJaWYgKHFwdC0+bWFzayAmJiAoKHFwbiAmIHFwdC0+bWFzaykgPj4gMSkgPj0gZGQtPm5fa3Jjdl9xdWV1ZXMpCisJCXFwbiA9IChxcG4gfCBxcHQtPm1hc2spICsgMjsKIAlvZmZzZXQgPSBxcG4gJiBCSVRTX1BFUl9QQUdFX01BU0s7CiAJbWFwID0gJnFwdC0+bWFwW3FwbiAvIEJJVFNfUEVSX1BBR0VdOwogCW1heF9zY2FuID0gcXB0LT5ubWFwcyAtICFvZmZzZXQ7CkBAIC0xNjMsNyArMTU3LDggQEAKIAkJCQlyZXQgPSBxcG47CiAJCQkJZ290byBiYWlsOwogCQkJfQotCQkJb2Zmc2V0ID0gZmluZF9uZXh0X29mZnNldChxcHQsIG1hcCwgb2Zmc2V0LCByKTsKKwkJCW9mZnNldCA9IGZpbmRfbmV4dF9vZmZzZXQocXB0LCBtYXAsIG9mZnNldCwKKwkJCQlkZC0+bl9rcmN2X3F1ZXVlcyk7CiAJCQlxcG4gPSBta19xcG4ocXB0LCBtYXAsIG9mZnNldCk7CiAJCQkvKgogCQkJICogVGhpcyB0ZXN0IGRpZmZlcnMgZnJvbSBhbGxvY19waWRtYXAoKS4KQEAgLTE4MywxMyArMTc4LDEzIEBACiAJCQlpZiAocXB0LT5ubWFwcyA9PSBRUE5NQVBfRU5UUklFUykKIAkJCQlicmVhazsKIAkJCW1hcCA9ICZxcHQtPm1hcFtxcHQtPm5tYXBzKytdOwotCQkJb2Zmc2V0ID0gcXB0LT5tYXNrID8gKHIgPDwgMSkgOiAwOworCQkJb2Zmc2V0ID0gMDsKIAkJfSBlbHNlIGlmIChtYXAgPCAmcXB0LT5tYXBbcXB0LT5ubWFwc10pIHsKIAkJCSsrbWFwOwotCQkJb2Zmc2V0ID0gcXB0LT5tYXNrID8gKHIgPDwgMSkgOiAwOworCQkJb2Zmc2V0ID0gMDsKIAkJfSBlbHNlIHsKIAkJCW1hcCA9ICZxcHQtPm1hcFswXTsKLQkJCW9mZnNldCA9IHFwdC0+bWFzayA/IChyIDw8IDEpIDogMjsKKwkJCW9mZnNldCA9IDI7CiAJCX0KIAkJcXBuID0gbWtfcXBuKHFwdCwgbWFwLCBvZmZzZXQpOwogCX0KQEAgLTQ2OCw2ICs0NjMsMTAgQEAKIAkJcXAtPnNfZmxhZ3MgJj0gfihRSUJfU19USU1FUiB8IFFJQl9TX1dBSVRfUk5SKTsKIAkJZGVsX3RpbWVyKCZxcC0+c190aW1lcik7CiAJfQorCisJaWYgKHFwLT5zX2ZsYWdzICYgUUlCX1NfQU5ZX1dBSVRfU0VORCkKKwkJcXAtPnNfZmxhZ3MgJj0gflFJQl9TX0FOWV9XQUlUX1NFTkQ7CisKIAlzcGluX2xvY2soJmRldi0+cGVuZGluZ19sb2NrKTsKIAlpZiAoIWxpc3RfZW1wdHkoJnFwLT5pb3dhaXQpICYmICEocXAtPnNfZmxhZ3MgJiBRSUJfU19CVVNZKSkgewogCQlxcC0+c19mbGFncyAmPSB+UUlCX1NfQU5ZX1dBSVRfSU87CkBAIC0xMDYxLDcgKzEwNjAsNiBAQAogCQl9CiAJCXFwLT5pYnFwLnFwX251bSA9IGVycjsKIAkJcXAtPnBvcnRfbnVtID0gaW5pdF9hdHRyLT5wb3J0X251bTsKLQkJcXAtPnByb2Nlc3Nvcl9pZCA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKIAkJcWliX3Jlc2V0X3FwKHFwLCBpbml0X2F0dHItPnFwX3R5cGUpOwogCQlicmVhazsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfcmMuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX3JjLmMKaW5kZXggOTU1ZmI3MS4uODI0NTIzNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfcmMuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl9yYy5jCkBAIC0xNDA3LDYgKzE0MDcsNyBAQAogCQkJICAgIHN0cnVjdCBxaWJfY3R4dGRhdGEgKnJjZCkKIHsKIAlzdHJ1Y3QgcWliX3N3cWUgKndxZTsKKwlzdHJ1Y3QgcWliX3Bwb3J0ZGF0YSAqcHBkID0gcHBkX2Zyb21faWJwKGlicCk7CiAJZW51bSBpYl93Y19zdGF0dXMgc3RhdHVzOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IGRpZmY7CkBAIC0xNDE0LDYgKzE0MTUsMjkgQEAKIAl1MzIgYWV0aDsKIAl1NjQgdmFsOwogCisJaWYgKG9wY29kZSAhPSBPUChSRE1BX1JFQURfUkVTUE9OU0VfTUlERExFKSkgeworCQkvKgorCQkgKiBJZiBBQ0snZCBQU04gb24gU0RNQSBidXN5IGxpc3QgdHJ5IHRvIG1ha2UgcHJvZ3Jlc3MgdG8KKwkJICogcmVjbGFpbSBTRE1BIGNyZWRpdHMuCisJCSAqLworCQlpZiAoKHFpYl9jbXAyNChwc24sIHFwLT5zX3NlbmRpbmdfcHNuKSA+PSAwKSAmJgorCQkgICAgKHFpYl9jbXAyNChxcC0+c19zZW5kaW5nX3BzbiwgcXAtPnNfc2VuZGluZ19ocHNuKSA8PSAwKSkgeworCisJCQkvKgorCQkJICogSWYgc2VuZCB0YXNrbGV0IG5vdCBydW5uaW5nIGF0dGVtcHQgdG8gcHJvZ3Jlc3MKKwkJCSAqIFNETUEgcXVldWUuCisJCQkgKi8KKwkJCWlmICghKHFwLT5zX2ZsYWdzICYgUUlCX1NfQlVTWSkpIHsKKwkJCQkvKiBBY3F1aXJlIFNETUEgTG9jayAqLworCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZwcGQtPnNkbWFfbG9jaywgZmxhZ3MpOworCQkJCS8qIEludm9rZSBzZG1hIG1ha2UgcHJvZ3Jlc3MgKi8KKwkJCQlxaWJfc2RtYV9tYWtlX3Byb2dyZXNzKHBwZCk7CisJCQkJLyogUmVsZWFzZSBTRE1BIExvY2sgKi8KKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcGQtPnNkbWFfbG9jaywgZmxhZ3MpOworCQkJfQorCQl9CisJfQorCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnFwLT5zX2xvY2ssIGZsYWdzKTsKIAogCS8qIElnbm9yZSBpbnZhbGlkIHJlc3BvbnNlcy4gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX3VkLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl91ZC5jCmluZGV4IGUxYjNkYTIuLjRhNTFmZDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX3VkLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfdWQuYwpAQCAtNDQ1LDEzICs0NDUsMTQgQEAKIAlxa2V5ID0gYmUzMl90b19jcHUob2hkci0+dS51ZC5kZXRoWzBdKTsKIAlzcmNfcXAgPSBiZTMyX3RvX2NwdShvaGRyLT51LnVkLmRldGhbMV0pICYgUUlCX1FQTl9NQVNLOwogCi0JLyogR2V0IHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhlIG1lc3NhZ2Ugd2FzIHBhZGRlZCBieS4gKi8KKwkvKgorCSAqIEdldCB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoZSBtZXNzYWdlIHdhcyBwYWRkZWQgYnkKKwkgKiBhbmQgZHJvcCBpbmNvbXBsZXRlIHBhY2tldHMuCisJICovCiAJcGFkID0gKGJlMzJfdG9fY3B1KG9oZHItPmJ0aFswXSkgPj4gMjApICYgMzsKLQlpZiAodW5saWtlbHkodGxlbiA8IChoZHJzaXplICsgcGFkICsgNCkpKSB7Ci0JCS8qIERyb3AgaW5jb21wbGV0ZSBwYWNrZXRzLiAqLwotCQlpYnAtPm5fcGt0X2Ryb3BzKys7Ci0JCWdvdG8gYmFpbDsKLQl9CisJaWYgKHVubGlrZWx5KHRsZW4gPCAoaGRyc2l6ZSArIHBhZCArIDQpKSkKKwkJZ290byBkcm9wOworCiAJdGxlbiAtPSBoZHJzaXplICsgcGFkICsgNDsKIAogCS8qCkBAIC00NjAsMTAgKzQ2MSw4IEBACiAJICovCiAJaWYgKHFwLT5pYnFwLnFwX251bSkgewogCQlpZiAodW5saWtlbHkoaGRyLT5scmhbMV0gPT0gSUJfTElEX1BFUk1JU1NJVkUgfHwKLQkJCSAgICAgaGRyLT5scmhbM10gPT0gSUJfTElEX1BFUk1JU1NJVkUpKSB7Ci0JCQlpYnAtPm5fcGt0X2Ryb3BzKys7Ci0JCQlnb3RvIGJhaWw7Ci0JCX0KKwkJCSAgICAgaGRyLT5scmhbM10gPT0gSUJfTElEX1BFUk1JU1NJVkUpKQorCQkJZ290byBkcm9wOwogCQlpZiAocXAtPmlicXAucXBfbnVtID4gMSkgewogCQkJdTE2IHBrZXkxLCBwa2V5MjsKIApAQCAtNDc2LDcgKzQ3NSw3IEBACiAJCQkJCQkweEYsCiAJCQkJCSAgICAgIHNyY19xcCwgcXAtPmlicXAucXBfbnVtLAogCQkJCQkgICAgICBoZHItPmxyaFszXSwgaGRyLT5scmhbMV0pOwotCQkJCWdvdG8gYmFpbDsKKwkJCQlyZXR1cm47CiAJCQl9CiAJCX0KIAkJaWYgKHVubGlrZWx5KHFrZXkgIT0gcXAtPnFrZXkpKSB7CkBAIC00ODQsMzAgKzQ4MywyNCBAQAogCQkJCSAgICAgIChiZTE2X3RvX2NwdShoZHItPmxyaFswXSkgPj4gNCkgJiAweEYsCiAJCQkJICAgICAgc3JjX3FwLCBxcC0+aWJxcC5xcF9udW0sCiAJCQkJICAgICAgaGRyLT5scmhbM10sIGhkci0+bHJoWzFdKTsKLQkJCWdvdG8gYmFpbDsKKwkJCXJldHVybjsKIAkJfQogCQkvKiBEcm9wIGludmFsaWQgTUFEIHBhY2tldHMgKHNlZSAxMy41LjMuMSkuICovCiAJCWlmICh1bmxpa2VseShxcC0+aWJxcC5xcF9udW0gPT0gMSAmJgogCQkJICAgICAodGxlbiAhPSAyNTYgfHwKLQkJCSAgICAgIChiZTE2X3RvX2NwdShoZHItPmxyaFswXSkgPj4gMTIpID09IDE1KSkpIHsKLQkJCWlicC0+bl9wa3RfZHJvcHMrKzsKLQkJCWdvdG8gYmFpbDsKLQkJfQorCQkJICAgICAgKGJlMTZfdG9fY3B1KGhkci0+bHJoWzBdKSA+PiAxMikgPT0gMTUpKSkKKwkJCWdvdG8gZHJvcDsKIAl9IGVsc2UgewogCQlzdHJ1Y3QgaWJfc21wICpzbXA7CiAKIAkJLyogRHJvcCBpbnZhbGlkIE1BRCBwYWNrZXRzIChzZWUgMTMuNS4zLjEpLiAqLwotCQlpZiAodGxlbiAhPSAyNTYgfHwgKGJlMTZfdG9fY3B1KGhkci0+bHJoWzBdKSA+PiAxMikgIT0gMTUpIHsKLQkJCWlicC0+bl9wa3RfZHJvcHMrKzsKLQkJCWdvdG8gYmFpbDsKLQkJfQorCQlpZiAodGxlbiAhPSAyNTYgfHwgKGJlMTZfdG9fY3B1KGhkci0+bHJoWzBdKSA+PiAxMikgIT0gMTUpCisJCQlnb3RvIGRyb3A7CiAJCXNtcCA9IChzdHJ1Y3QgaWJfc21wICopIGRhdGE7CiAJCWlmICgoaGRyLT5scmhbMV0gPT0gSUJfTElEX1BFUk1JU1NJVkUgfHwKIAkJICAgICBoZHItPmxyaFszXSA9PSBJQl9MSURfUEVSTUlTU0lWRSkgJiYKLQkJICAgIHNtcC0+bWdtdF9jbGFzcyAhPSBJQl9NR01UX0NMQVNTX1NVQk5fRElSRUNURURfUk9VVEUpIHsKLQkJCWlicC0+bl9wa3RfZHJvcHMrKzsKLQkJCWdvdG8gYmFpbDsKLQkJfQorCQkgICAgc21wLT5tZ210X2NsYXNzICE9IElCX01HTVRfQ0xBU1NfU1VCTl9ESVJFQ1RFRF9ST1VURSkKKwkJCWdvdG8gZHJvcDsKIAl9CiAKIAkvKgpAQCAtNTE5LDE0ICs1MTIsMTIgQEAKIAkgICAgb3Bjb2RlID09IElCX09QQ09ERV9VRF9TRU5EX09OTFlfV0lUSF9JTU1FRElBVEUpIHsKIAkJd2MuZXguaW1tX2RhdGEgPSBvaGRyLT51LnVkLmltbV9kYXRhOwogCQl3Yy53Y19mbGFncyA9IElCX1dDX1dJVEhfSU1NOwotCQloZHJzaXplICs9IHNpemVvZih1MzIpOworCQl0bGVuIC09IHNpemVvZih1MzIpOwogCX0gZWxzZSBpZiAob3Bjb2RlID09IElCX09QQ09ERV9VRF9TRU5EX09OTFkpIHsKIAkJd2MuZXguaW1tX2RhdGEgPSAwOwogCQl3Yy53Y19mbGFncyA9IDA7Ci0JfSBlbHNlIHsKLQkJaWJwLT5uX3BrdF9kcm9wcysrOwotCQlnb3RvIGJhaWw7Ci0JfQorCX0gZWxzZQorCQlnb3RvIGRyb3A7CiAKIAkvKgogCSAqIEEgR1JIIGlzIGV4cGVjdGVkIHRvIHByZWNlZWQgdGhlIGRhdGEgZXZlbiBpZiBub3QKQEAgLTU1Niw4ICs1NDcsNyBAQAogCS8qIFNpbGVudGx5IGRyb3AgcGFja2V0cyB3aGljaCBhcmUgdG9vIGJpZy4gKi8KIAlpZiAodW5saWtlbHkod2MuYnl0ZV9sZW4gPiBxcC0+cl9sZW4pKSB7CiAJCXFwLT5yX2ZsYWdzIHw9IFFJQl9SX1JFVVNFX1NHRTsKLQkJaWJwLT5uX3BrdF9kcm9wcysrOwotCQlyZXR1cm47CisJCWdvdG8gZHJvcDsKIAl9CiAJaWYgKGhhc19ncmgpIHsKIAkJcWliX2NvcHlfc2dlKCZxcC0+cl9zZ2UsICZoZHItPnUubC5ncmgsCkBAIC01OTQsNSArNTg0LDggQEAKIAlxaWJfY3FfZW50ZXIodG9faWNxKHFwLT5pYnFwLnJlY3ZfY3EpLCAmd2MsCiAJCSAgICAgKG9oZHItPmJ0aFswXSAmCiAJCQljcHVfdG9fYmUzMihJQl9CVEhfU09MSUNJVEVEKSkgIT0gMCk7Ci1iYWlsOjsKKwlyZXR1cm47CisKK2Ryb3A6CisJaWJwLT5uX3BrdF9kcm9wcysrOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfdXNlcl9zZG1hLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl91c2VyX3NkbWEuYwppbmRleCA0YzE5ZTA2Li42NjIwOGJjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl91c2VyX3NkbWEuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl91c2VyX3NkbWEuYwpAQCAtMzgyLDYgKzM4Miw3IEBACiAKIAkJa21lbV9jYWNoZV9mcmVlKHBxLT5wa3Rfc2xhYiwgcGt0KTsKIAl9CisJSU5JVF9MSVNUX0hFQUQobGlzdCk7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl92ZXJicy5oIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfdmVyYnMuaAppbmRleCBiZDU3YzEyLi42M2IyMmE5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl92ZXJicy5oCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX3ZlcmJzLmgKQEAgLTMwMSw2ICszMDEsNyBAQAogCWludCBhY2Nlc3NfZmxhZ3M7CiAJdTMyIG1heF9zZWdzOyAgICAgICAgICAgLyogbnVtYmVyIG9mIHFpYl9zZWdzIGluIGFsbCB0aGUgYXJyYXlzICovCiAJdTMyIG1hcHN6OyAgICAgICAgICAgICAgLyogc2l6ZSBvZiB0aGUgbWFwIGFycmF5ICovCisJdTggIHBhZ2Vfc2hpZnQ7ICAgICAgICAgLyogMCAtIG5vbiB1bmZvcm0vbm9uIHBvd2Vyb2YyIHNpemVzICovCiAJYXRvbWljX3QgcmVmY291bnQ7CiAJc3RydWN0IHFpYl9zZWdhcnJheSAqbWFwWzBdOyAgICAvKiB0aGUgc2VnbWVudHMgKi8KIH07CkBAIC00MzUsNyArNDM2LDYgQEAKIAlzcGlubG9ja190IHJfbG9jazsgICAgICAvKiB1c2VkIGZvciBBUE0gKi8KIAlzcGlubG9ja190IHNfbG9jazsKIAlhdG9taWNfdCBzX2RtYV9idXN5OwotCXVuc2lnbmVkIHByb2Nlc3Nvcl9pZDsJLyogUHJvY2Vzc29yIElEIFFQIGlzIGJvdW5kIHRvICovCiAJdTMyIHNfZmxhZ3M7CiAJdTMyIHNfY3VyX3NpemU7ICAgICAgICAgLyogc2l6ZSBvZiBzZW5kIHBhY2tldCBpbiBieXRlcyAqLwogCXUzMiBzX2xlbjsgICAgICAgICAgICAgIC8qIHRvdGFsIGxlbmd0aCBvZiBzX3NnZSAqLwpAQCAtODEzLDEzICs4MTMsOCBAQAogICovCiBzdGF0aWMgaW5saW5lIHZvaWQgcWliX3NjaGVkdWxlX3NlbmQoc3RydWN0IHFpYl9xcCAqcXApCiB7Ci0JaWYgKHFpYl9zZW5kX29rKHFwKSkgewotCQlpZiAocXAtPnByb2Nlc3Nvcl9pZCA9PSBzbXBfcHJvY2Vzc29yX2lkKCkpCi0JCQlxdWV1ZV93b3JrKHFpYl93cSwgJnFwLT5zX3dvcmspOwotCQllbHNlCi0JCQlxdWV1ZV93b3JrX29uKHFwLT5wcm9jZXNzb3JfaWQsCi0JCQkJICAgICAgcWliX3dxLCAmcXAtPnNfd29yayk7Ci0JfQorCWlmIChxaWJfc2VuZF9vayhxcCkpCisJCXF1ZXVlX3dvcmsocWliX3dxLCAmcXAtPnNfd29yayk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IHFpYl9wa2V5X29rKHUxNiBwa2V5MSwgdTE2IHBrZXkyKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pcG9pYi9LY29uZmlnIGIvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pcG9pYi9LY29uZmlnCmluZGV4IDlkOWE5ZGMuLjU1ODU1ZWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXBvaWIvS2NvbmZpZworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lwb2liL0tjb25maWcKQEAgLTEsNyArMSw2IEBACiBjb25maWcgSU5GSU5JQkFORF9JUE9JQgogCXRyaXN0YXRlICJJUC1vdmVyLUluZmluaUJhbmQiCiAJZGVwZW5kcyBvbiBORVRERVZJQ0VTICYmIElORVQgJiYgKElQVjYgfHwgSVBWNj1uKQotCXNlbGVjdCBJTkVUX0xSTwogCS0tLWhlbHAtLS0KIAkgIFN1cHBvcnQgZm9yIHRoZSBJUC1vdmVyLUluZmluaUJhbmQgcHJvdG9jb2wgKElQb0lCKS4gVGhpcwogCSAgdHJhbnNwb3J0cyBJUCBwYWNrZXRzIG92ZXIgSW5maW5pQmFuZCBzbyB5b3UgY2FuIHVzZSB5b3VyIElCCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lwb2liL2lwb2liLmggYi9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lwb2liL2lwb2liLmgKaW5kZXggNzUzYTk4My4uYWI5N2Y5MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pcG9pYi9pcG9pYi5oCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXBvaWIvaXBvaWIuaApAQCAtNTAsNyArNTAsNyBAQAogI2luY2x1ZGUgPHJkbWEvaWJfdmVyYnMuaD4KICNpbmNsdWRlIDxyZG1hL2liX3BhY2suaD4KICNpbmNsdWRlIDxyZG1hL2liX3NhLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5ldF9scm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogCiAvKiBjb25zdGFudHMgKi8KIApAQCAtMTAwLDkgKzEwMCw2IEBACiAJSVBPSUJfTUNBU1RfRkxBR19CVVNZCSAgPSAyLAkvKiBqb2luaW5nIG9yIGFscmVhZHkgam9pbmVkICovCiAJSVBPSUJfTUNBU1RfRkxBR19BVFRBQ0hFRCA9IDMsCiAKLQlJUE9JQl9NQVhfTFJPX0RFU0NSSVBUT1JTID0gOCwKLQlJUE9JQl9MUk9fTUFYX0FHR1IgCSAgPSA2NCwKLQogCU1BWF9TRU5EX0NRRQkJICA9IDE2LAogCUlQT0lCX0NNX0NPUFlCUkVBSwkgID0gMjU2LAogfTsKQEAgLTI2MiwxMSArMjU5LDYgQEAKIAl1MTYgICAgIG1heF9jb2FsZXNjZWRfZnJhbWVzOwogfTsKIAotc3RydWN0IGlwb2liX2xybyB7Ci0Jc3RydWN0IG5ldF9scm9fbWdyIGxyb19tZ3I7Ci0Jc3RydWN0IG5ldF9scm9fZGVzYyBscm9fZGVzY1tJUE9JQl9NQVhfTFJPX0RFU0NSSVBUT1JTXTsKLX07Ci0KIC8qCiAgKiBEZXZpY2UgcHJpdmF0ZSBsb2NraW5nOiBuZXR3b3JrIHN0YWNrIHR4X2xvY2sgcHJvdGVjdHMgbWVtYmVycyB1c2VkCiAgKiBpbiBUWCBmYXN0IHBhdGgsIGxvY2sgcHJvdGVjdHMgZXZlcnl0aGluZyBlbHNlLiAgbG9jayBuZXN0cyBpbnNpZGUKQEAgLTM1Miw4ICszNDQsNiBAQAogCWludAloY2FfY2FwczsKIAlzdHJ1Y3QgaXBvaWJfZXRodG9vbF9zdCBldGh0b29sOwogCXN0cnVjdCB0aW1lcl9saXN0IHBvbGxfdGltZXI7Ci0KLQlzdHJ1Y3QgaXBvaWJfbHJvIGxybzsKIH07CiAKIHN0cnVjdCBpcG9pYl9haCB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lwb2liL2lwb2liX2NtLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lwb2liL2lwb2liX2NtLmMKaW5kZXggYmIxMDA0MS4uYzFjNDlmMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pcG9pYi9pcG9pYl9jbS5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXBvaWIvaXBvaWJfY20uYwpAQCAtMTQ4MCw2ICsxNDgwLDcgQEAKIAogCQlpZiAodGVzdF9iaXQoSVBPSUJfRkxBR19DU1VNLCAmcHJpdi0+ZmxhZ3MpKSB7CiAJCQlkZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfSVBfQ1NVTSB8IE5FVElGX0ZfU0c7CisJCQlwcml2LT5kZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfR1JPOwogCQkJaWYgKHByaXYtPmhjYV9jYXBzICYgSUJfREVWSUNFX1VEX1RTTykKIAkJCQlkZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfVFNPOwogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lwb2liL2lwb2liX2V0aHRvb2wuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXBvaWIvaXBvaWJfZXRodG9vbC5jCmluZGV4IDFhMTY1N2MuLjE5ZjdmNTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXBvaWIvaXBvaWJfZXRodG9vbC5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXBvaWIvaXBvaWJfZXRodG9vbC5jCkBAIC0xMDYsNjMgKzEwNiwxMiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgY29uc3QgY2hhciBpcG9pYl9zdGF0c19rZXlzW11bRVRIX0dTVFJJTkdfTEVOXSA9IHsKLQkiTFJPIGFnZ3JlZ2F0ZWQiLCAiTFJPIGZsdXNoZWQiLAotCSJMUk8gYXZnIGFnZ3IiLCAiTFJPIG5vIGRlc2MiCi19OwotCi1zdGF0aWMgdm9pZCBpcG9pYl9nZXRfc3RyaW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCB1MzIgc3RyaW5nc2V0LCB1OCAqZGF0YSkKLXsKLQlzd2l0Y2ggKHN0cmluZ3NldCkgewotCWNhc2UgRVRIX1NTX1NUQVRTOgotCQltZW1jcHkoZGF0YSwgKmlwb2liX3N0YXRzX2tleXMsCXNpemVvZihpcG9pYl9zdGF0c19rZXlzKSk7Ci0JCWJyZWFrOwotCX0KLX0KLQotc3RhdGljIGludCBpcG9pYl9nZXRfc3NldF9jb3VudChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgc3NldCkKLXsKLQlzd2l0Y2ggKHNzZXQpIHsKLQljYXNlIEVUSF9TU19TVEFUUzoKLQkJcmV0dXJuIEFSUkFZX1NJWkUoaXBvaWJfc3RhdHNfa2V5cyk7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuIC1FT1BOT1RTVVBQOwotCX0KLX0KLQotc3RhdGljIHZvaWQgaXBvaWJfZ2V0X2V0aHRvb2xfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCQlzdHJ1Y3QgZXRodG9vbF9zdGF0cyAqc3RhdHMsIHVpbnQ2NF90ICpkYXRhKQotewotCXN0cnVjdCBpcG9pYl9kZXZfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7Ci0JaW50IGluZGV4ID0gMDsKLQotCS8qIEdldCBMUk8gc3RhdGlzdGljcyAqLwotCWRhdGFbaW5kZXgrK10gPSBwcml2LT5scm8ubHJvX21nci5zdGF0cy5hZ2dyZWdhdGVkOwotCWRhdGFbaW5kZXgrK10gPSBwcml2LT5scm8ubHJvX21nci5zdGF0cy5mbHVzaGVkOwotCWlmIChwcml2LT5scm8ubHJvX21nci5zdGF0cy5mbHVzaGVkKQotCQlkYXRhW2luZGV4KytdID0gcHJpdi0+bHJvLmxyb19tZ3Iuc3RhdHMuYWdncmVnYXRlZCAvCi0JCQkJcHJpdi0+bHJvLmxyb19tZ3Iuc3RhdHMuZmx1c2hlZDsKLQllbHNlCi0JCWRhdGFbaW5kZXgrK10gPSAwOwotCWRhdGFbaW5kZXgrK10gPSBwcml2LT5scm8ubHJvX21nci5zdGF0cy5ub19kZXNjOwotfQotCi1zdGF0aWMgaW50IGlwb2liX3NldF9mbGFncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgZmxhZ3MpCi17Ci0JcmV0dXJuIGV0aHRvb2xfb3Bfc2V0X2ZsYWdzKGRldiwgZmxhZ3MsIEVUSF9GTEFHX0xSTyk7Ci19Ci0KIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZXRodG9vbF9vcHMgaXBvaWJfZXRodG9vbF9vcHMgPSB7CiAJLmdldF9kcnZpbmZvCQk9IGlwb2liX2dldF9kcnZpbmZvLAogCS5nZXRfcnhfY3N1bQkJPSBpcG9pYl9nZXRfcnhfY3N1bSwKIAkuc2V0X3RzbwkJPSBpcG9pYl9zZXRfdHNvLAogCS5nZXRfY29hbGVzY2UJCT0gaXBvaWJfZ2V0X2NvYWxlc2NlLAogCS5zZXRfY29hbGVzY2UJCT0gaXBvaWJfc2V0X2NvYWxlc2NlLAotCS5nZXRfZmxhZ3MJCT0gZXRodG9vbF9vcF9nZXRfZmxhZ3MsCi0JLnNldF9mbGFncwkJPSBpcG9pYl9zZXRfZmxhZ3MsCi0JLmdldF9zdHJpbmdzCQk9IGlwb2liX2dldF9zdHJpbmdzLAotCS5nZXRfc3NldF9jb3VudAkJPSBpcG9pYl9nZXRfc3NldF9jb3VudCwKLQkuZ2V0X2V0aHRvb2xfc3RhdHMJPSBpcG9pYl9nZXRfZXRodG9vbF9zdGF0cywKIH07CiAKIHZvaWQgaXBvaWJfc2V0X2V0aHRvb2xfb3BzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lwb2liL2lwb2liX2liLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lwb2liL2lwb2liX2liLmMKaW5kZXggZGZhNzE5MC4uODA2ZDAyOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pcG9pYi9pcG9pYl9pYi5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXBvaWIvaXBvaWJfaWIuYwpAQCAtMjk1LDEwICsyOTUsNyBAQAogCWlmICh0ZXN0X2JpdChJUE9JQl9GTEFHX0NTVU0sICZwcml2LT5mbGFncykgJiYgbGlrZWx5KHdjLT5jc3VtX29rKSkKIAkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9VTk5FQ0VTU0FSWTsKIAotCWlmIChkZXYtPmZlYXR1cmVzICYgTkVUSUZfRl9MUk8pCi0JCWxyb19yZWNlaXZlX3NrYigmcHJpdi0+bHJvLmxyb19tZ3IsIHNrYiwgTlVMTCk7Ci0JZWxzZQotCQluZXRpZl9yZWNlaXZlX3NrYihza2IpOworCW5hcGlfZ3JvX3JlY2VpdmUoJnByaXYtPm5hcGksIHNrYik7CiAKIHJlcG9zdDoKIAlpZiAodW5saWtlbHkoaXBvaWJfaWJfcG9zdF9yZWNlaXZlKGRldiwgd3JfaWQpKSkKQEAgLTQ1MCw5ICs0NDcsNiBAQAogCX0KIAogCWlmIChkb25lIDwgYnVkZ2V0KSB7Ci0JCWlmIChkZXYtPmZlYXR1cmVzICYgTkVUSUZfRl9MUk8pCi0JCQlscm9fZmx1c2hfYWxsKCZwcml2LT5scm8ubHJvX21ncik7Ci0KIAkJbmFwaV9jb21wbGV0ZShuYXBpKTsKIAkJaWYgKHVubGlrZWx5KGliX3JlcV9ub3RpZnlfY3EocHJpdi0+cmVjdl9jcSwKIAkJCQkJICAgICAgSUJfQ1FfTkVYVF9DT01QIHwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXBvaWIvaXBvaWJfbWFpbi5jIGIvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pcG9pYi9pcG9pYl9tYWluLmMKaW5kZXggOWZmN2JjNy4uN2EwN2E3MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pcG9pYi9pcG9pYl9tYWluLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pcG9pYi9pcG9pYl9tYWluLmMKQEAgLTYwLDE1ICs2MCw2IEBACiBtb2R1bGVfcGFyYW1fbmFtZWQocmVjdl9xdWV1ZV9zaXplLCBpcG9pYl9yZWN2cV9zaXplLCBpbnQsIDA0NDQpOwogTU9EVUxFX1BBUk1fREVTQyhyZWN2X3F1ZXVlX3NpemUsICJOdW1iZXIgb2YgZGVzY3JpcHRvcnMgaW4gcmVjZWl2ZSBxdWV1ZSIpOwogCi1zdGF0aWMgaW50IGxybzsKLW1vZHVsZV9wYXJhbShscm8sIGJvb2wsIDA0NDQpOwotTU9EVUxFX1BBUk1fREVTQyhscm8sICAiRW5hYmxlIExSTyAoTGFyZ2UgUmVjZWl2ZSBPZmZsb2FkKSIpOwotCi1zdGF0aWMgaW50IGxyb19tYXhfYWdnciA9IElQT0lCX0xST19NQVhfQUdHUjsKLW1vZHVsZV9wYXJhbShscm9fbWF4X2FnZ3IsIGludCwgMDY0NCk7Ci1NT0RVTEVfUEFSTV9ERVNDKGxyb19tYXhfYWdnciwgIkxSTzogTWF4IHBhY2tldHMgdG8gYmUgYWdncmVnYXRlZCAiCi0JCSIoZGVmYXVsdCA9IDY0KSIpOwotCiAjaWZkZWYgQ09ORklHX0lORklOSUJBTkRfSVBPSUJfREVCVUcKIGludCBpcG9pYl9kZWJ1Z19sZXZlbDsKIApAQCAtOTc2LDU0ICs5NjcsNiBAQAogCS5jcmVhdGUJPSBpcG9pYl9oYXJkX2hlYWRlciwKIH07CiAKLXN0YXRpYyBpbnQgZ2V0X3NrYl9oZHIoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdm9pZCAqKmlwaGRyLAotCQkgICAgICAgdm9pZCAqKnRjcGgsIHU2NCAqaGRyX2ZsYWdzLCB2b2lkICpwcml2KQotewotCXVuc2lnbmVkIGludCBpcF9sZW47Ci0Jc3RydWN0IGlwaGRyICppcGg7Ci0KLQlpZiAodW5saWtlbHkoc2tiLT5wcm90b2NvbCAhPSBodG9ucyhFVEhfUF9JUCkpKQotCQlyZXR1cm4gLTE7Ci0KLQkvKgotCSAqIEluIHRoZSBmdXR1cmUgd2UgbWF5IGFkZCBhbiBlbHNlIGNsYXVzZSB0aGF0IHZlcmlmaWVzIHRoZQotCSAqIGNoZWNrc3VtIGFuZCBhbGxvd3MgZGV2aWNlcyB3aGljaCBkbyBub3QgY2FsY3VsYXRlIGNoZWNrc3VtCi0JICogdG8gdXNlIExSTy4KLQkgKi8KLQlpZiAodW5saWtlbHkoc2tiLT5pcF9zdW1tZWQgIT0gQ0hFQ0tTVU1fVU5ORUNFU1NBUlkpKQotCQlyZXR1cm4gLTE7Ci0KLQkvKiBDaGVjayBmb3Igbm9uLVRDUCBwYWNrZXQgKi8KLQlza2JfcmVzZXRfbmV0d29ya19oZWFkZXIoc2tiKTsKLQlpcGggPSBpcF9oZHIoc2tiKTsKLQlpZiAoaXBoLT5wcm90b2NvbCAhPSBJUFBST1RPX1RDUCkKLQkJcmV0dXJuIC0xOwotCi0JaXBfbGVuID0gaXBfaGRybGVuKHNrYik7Ci0Jc2tiX3NldF90cmFuc3BvcnRfaGVhZGVyKHNrYiwgaXBfbGVuKTsKLQkqdGNwaCA9IHRjcF9oZHIoc2tiKTsKLQotCS8qIGNoZWNrIGlmIElQIGhlYWRlciBhbmQgVENQIGhlYWRlciBhcmUgY29tcGxldGUgKi8KLQlpZiAobnRvaHMoaXBoLT50b3RfbGVuKSA8IGlwX2xlbiArIHRjcF9oZHJsZW4oc2tiKSkKLQkJcmV0dXJuIC0xOwotCi0JKmhkcl9mbGFncyA9IExST19JUFY0IHwgTFJPX1RDUDsKLQkqaXBoZHIgPSBpcGg7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgaXBvaWJfbHJvX3NldHVwKHN0cnVjdCBpcG9pYl9kZXZfcHJpdiAqcHJpdikKLXsKLQlwcml2LT5scm8ubHJvX21nci5tYXhfYWdncgkgPSBscm9fbWF4X2FnZ3I7Ci0JcHJpdi0+bHJvLmxyb19tZ3IubWF4X2Rlc2MJID0gSVBPSUJfTUFYX0xST19ERVNDUklQVE9SUzsKLQlwcml2LT5scm8ubHJvX21nci5scm9fYXJyCSA9IHByaXYtPmxyby5scm9fZGVzYzsKLQlwcml2LT5scm8ubHJvX21nci5nZXRfc2tiX2hlYWRlciA9IGdldF9za2JfaGRyOwotCXByaXYtPmxyby5scm9fbWdyLmZlYXR1cmVzCSA9IExST19GX05BUEk7Ci0JcHJpdi0+bHJvLmxyb19tZ3IuZGV2CQkgPSBwcml2LT5kZXY7Ci0JcHJpdi0+bHJvLmxyb19tZ3IuaXBfc3VtbWVkX2FnZ3IgPSBDSEVDS1NVTV9VTk5FQ0VTU0FSWTsKLX0KLQogc3RhdGljIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyBpcG9pYl9uZXRkZXZfb3BzID0gewogCS5uZG9fb3BlbgkJID0gaXBvaWJfb3BlbiwKIAkubmRvX3N0b3AJCSA9IGlwb2liX3N0b3AsCkBAIC0xMDY3LDggKzEwMTAsNiBAQAogCiAJcHJpdi0+ZGV2ID0gZGV2OwogCi0JaXBvaWJfbHJvX3NldHVwKHByaXYpOwotCiAJc3Bpbl9sb2NrX2luaXQoJnByaXYtPmxvY2spOwogCiAJbXV0ZXhfaW5pdCgmcHJpdi0+dmxhbl9tdXRleCk7CkBAIC0xMjE4LDggKzExNTksNyBAQAogCQlwcml2LT5kZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfU0cgfCBORVRJRl9GX0lQX0NTVU07CiAJfQogCi0JaWYgKGxybykKLQkJcHJpdi0+ZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX0xSTzsKKwlwcml2LT5kZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfR1JPOwogCiAJaWYgKHByaXYtPmRldi0+ZmVhdHVyZXMgJiBORVRJRl9GX1NHICYmIHByaXYtPmhjYV9jYXBzICYgSUJfREVWSUNFX1VEX1RTTykKIAkJcHJpdi0+ZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX1RTTzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvc3JwL2liX3NycC5jIGIvZHJpdmVycy9pbmZpbmliYW5kL3VscC9zcnAvaWJfc3JwLmMKaW5kZXggMWUxZTM0Ny4uNGI2MjEwNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL3VscC9zcnAvaWJfc3JwLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL3VscC9zcnAvaWJfc3JwLmMKQEAgLTQ0MSwxOCArNDQxLDI4IEBACiAJd2FpdF9mb3JfY29tcGxldGlvbigmdGFyZ2V0LT5kb25lKTsKIH0KIAorc3RhdGljIGJvb2wgc3JwX2NoYW5nZV9zdGF0ZShzdHJ1Y3Qgc3JwX3RhcmdldF9wb3J0ICp0YXJnZXQsCisJCQkgICAgZW51bSBzcnBfdGFyZ2V0X3N0YXRlIG9sZCwKKwkJCSAgICBlbnVtIHNycF90YXJnZXRfc3RhdGUgbmV3KQoreworCWJvb2wgY2hhbmdlZCA9IGZhbHNlOworCisJc3Bpbl9sb2NrX2lycSgmdGFyZ2V0LT5sb2NrKTsKKwlpZiAodGFyZ2V0LT5zdGF0ZSA9PSBvbGQpIHsKKwkJdGFyZ2V0LT5zdGF0ZSA9IG5ldzsKKwkJY2hhbmdlZCA9IHRydWU7CisJfQorCXNwaW5fdW5sb2NrX2lycSgmdGFyZ2V0LT5sb2NrKTsKKwlyZXR1cm4gY2hhbmdlZDsKK30KKwogc3RhdGljIHZvaWQgc3JwX3JlbW92ZV93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKIAlzdHJ1Y3Qgc3JwX3RhcmdldF9wb3J0ICp0YXJnZXQgPQogCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IHNycF90YXJnZXRfcG9ydCwgd29yayk7CiAKLQlzcGluX2xvY2tfaXJxKHRhcmdldC0+c2NzaV9ob3N0LT5ob3N0X2xvY2spOwotCWlmICh0YXJnZXQtPnN0YXRlICE9IFNSUF9UQVJHRVRfREVBRCkgewotCQlzcGluX3VubG9ja19pcnEodGFyZ2V0LT5zY3NpX2hvc3QtPmhvc3RfbG9jayk7CisJaWYgKCFzcnBfY2hhbmdlX3N0YXRlKHRhcmdldCwgU1JQX1RBUkdFVF9ERUFELCBTUlBfVEFSR0VUX1JFTU9WRUQpKQogCQlyZXR1cm47Ci0JfQotCXRhcmdldC0+c3RhdGUgPSBTUlBfVEFSR0VUX1JFTU9WRUQ7Ci0Jc3Bpbl91bmxvY2tfaXJxKHRhcmdldC0+c2NzaV9ob3N0LT5ob3N0X2xvY2spOwogCiAJc3Bpbl9sb2NrKCZ0YXJnZXQtPnNycF9ob3N0LT50YXJnZXRfbG9jayk7CiAJbGlzdF9kZWwoJnRhcmdldC0+bGlzdCk7CkBAIC01MzksMzMgKzU0OSwzNCBAQAogCQkJc2NzaV9zZ19jb3VudChzY21uZCksIHNjbW5kLT5zY19kYXRhX2RpcmVjdGlvbik7CiB9CiAKLXN0YXRpYyB2b2lkIHNycF9yZW1vdmVfcmVxKHN0cnVjdCBzcnBfdGFyZ2V0X3BvcnQgKnRhcmdldCwgc3RydWN0IHNycF9yZXF1ZXN0ICpyZXEpCitzdGF0aWMgdm9pZCBzcnBfcmVtb3ZlX3JlcShzdHJ1Y3Qgc3JwX3RhcmdldF9wb3J0ICp0YXJnZXQsCisJCQkgICBzdHJ1Y3Qgc3JwX3JlcXVlc3QgKnJlcSwgczMyIHJlcV9saW1fZGVsdGEpCiB7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwogCXNycF91bm1hcF9kYXRhKHJlcS0+c2NtbmQsIHRhcmdldCwgcmVxKTsKLQlsaXN0X21vdmVfdGFpbCgmcmVxLT5saXN0LCAmdGFyZ2V0LT5mcmVlX3JlcXMpOworCXNwaW5fbG9ja19pcnFzYXZlKCZ0YXJnZXQtPmxvY2ssIGZsYWdzKTsKKwl0YXJnZXQtPnJlcV9saW0gKz0gcmVxX2xpbV9kZWx0YTsKKwlyZXEtPnNjbW5kID0gTlVMTDsKKwlsaXN0X2FkZF90YWlsKCZyZXEtPmxpc3QsICZ0YXJnZXQtPmZyZWVfcmVxcyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdGFyZ2V0LT5sb2NrLCBmbGFncyk7CiB9CiAKIHN0YXRpYyB2b2lkIHNycF9yZXNldF9yZXEoc3RydWN0IHNycF90YXJnZXRfcG9ydCAqdGFyZ2V0LCBzdHJ1Y3Qgc3JwX3JlcXVlc3QgKnJlcSkKIHsKIAlyZXEtPnNjbW5kLT5yZXN1bHQgPSBESURfUkVTRVQgPDwgMTY7CiAJcmVxLT5zY21uZC0+c2NzaV9kb25lKHJlcS0+c2NtbmQpOwotCXNycF9yZW1vdmVfcmVxKHRhcmdldCwgcmVxKTsKKwlzcnBfcmVtb3ZlX3JlcSh0YXJnZXQsIHJlcSwgMCk7CiB9CiAKIHN0YXRpYyBpbnQgc3JwX3JlY29ubmVjdF90YXJnZXQoc3RydWN0IHNycF90YXJnZXRfcG9ydCAqdGFyZ2V0KQogewogCXN0cnVjdCBpYl9xcF9hdHRyIHFwX2F0dHI7Ci0Jc3RydWN0IHNycF9yZXF1ZXN0ICpyZXEsICp0bXA7CiAJc3RydWN0IGliX3djIHdjOwotCWludCByZXQ7CisJaW50IGksIHJldDsKIAotCXNwaW5fbG9ja19pcnEodGFyZ2V0LT5zY3NpX2hvc3QtPmhvc3RfbG9jayk7Ci0JaWYgKHRhcmdldC0+c3RhdGUgIT0gU1JQX1RBUkdFVF9MSVZFKSB7Ci0JCXNwaW5fdW5sb2NrX2lycSh0YXJnZXQtPnNjc2lfaG9zdC0+aG9zdF9sb2NrKTsKKwlpZiAoIXNycF9jaGFuZ2Vfc3RhdGUodGFyZ2V0LCBTUlBfVEFSR0VUX0xJVkUsIFNSUF9UQVJHRVRfQ09OTkVDVElORykpCiAJCXJldHVybiAtRUFHQUlOOwotCX0KLQl0YXJnZXQtPnN0YXRlID0gU1JQX1RBUkdFVF9DT05ORUNUSU5HOwotCXNwaW5fdW5sb2NrX2lycSh0YXJnZXQtPnNjc2lfaG9zdC0+aG9zdF9sb2NrKTsKIAogCXNycF9kaXNjb25uZWN0X3RhcmdldCh0YXJnZXQpOwogCS8qCkBAIC01OTAsMjcgKzYwMSwyMyBAQAogCXdoaWxlIChpYl9wb2xsX2NxKHRhcmdldC0+c2VuZF9jcSwgMSwgJndjKSA+IDApCiAJCTsgLyogbm90aGluZyAqLwogCi0Jc3Bpbl9sb2NrX2lycSh0YXJnZXQtPnNjc2lfaG9zdC0+aG9zdF9sb2NrKTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocmVxLCB0bXAsICZ0YXJnZXQtPnJlcV9xdWV1ZSwgbGlzdCkKLQkJc3JwX3Jlc2V0X3JlcSh0YXJnZXQsIHJlcSk7Ci0Jc3Bpbl91bmxvY2tfaXJxKHRhcmdldC0+c2NzaV9ob3N0LT5ob3N0X2xvY2spOworCWZvciAoaSA9IDA7IGkgPCBTUlBfQ01EX1NRX1NJWkU7ICsraSkgeworCQlzdHJ1Y3Qgc3JwX3JlcXVlc3QgKnJlcSA9ICZ0YXJnZXQtPnJlcV9yaW5nW2ldOworCQlpZiAocmVxLT5zY21uZCkKKwkJCXNycF9yZXNldF9yZXEodGFyZ2V0LCByZXEpOworCX0KIAotCXRhcmdldC0+cnhfaGVhZAkgPSAwOwotCXRhcmdldC0+dHhfaGVhZAkgPSAwOwotCXRhcmdldC0+dHhfdGFpbCAgPSAwOworCUlOSVRfTElTVF9IRUFEKCZ0YXJnZXQtPmZyZWVfdHgpOworCWZvciAoaSA9IDA7IGkgPCBTUlBfU1FfU0laRTsgKytpKQorCQlsaXN0X2FkZCgmdGFyZ2V0LT50eF9yaW5nW2ldLT5saXN0LCAmdGFyZ2V0LT5mcmVlX3R4KTsKIAogCXRhcmdldC0+cXBfaW5fZXJyb3IgPSAwOwogCXJldCA9IHNycF9jb25uZWN0X3RhcmdldCh0YXJnZXQpOwogCWlmIChyZXQpCiAJCWdvdG8gZXJyOwogCi0Jc3Bpbl9sb2NrX2lycSh0YXJnZXQtPnNjc2lfaG9zdC0+aG9zdF9sb2NrKTsKLQlpZiAodGFyZ2V0LT5zdGF0ZSA9PSBTUlBfVEFSR0VUX0NPTk5FQ1RJTkcpIHsKLQkJcmV0ID0gMDsKLQkJdGFyZ2V0LT5zdGF0ZSA9IFNSUF9UQVJHRVRfTElWRTsKLQl9IGVsc2UKKwlpZiAoIXNycF9jaGFuZ2Vfc3RhdGUodGFyZ2V0LCBTUlBfVEFSR0VUX0NPTk5FQ1RJTkcsIFNSUF9UQVJHRVRfTElWRSkpCiAJCXJldCA9IC1FQUdBSU47Ci0Jc3Bpbl91bmxvY2tfaXJxKHRhcmdldC0+c2NzaV9ob3N0LT5ob3N0X2xvY2spOwogCiAJcmV0dXJuIHJldDsKIApAQCAtNjIwLDE3ICs2MjcsMjAgQEAKIAogCS8qCiAJICogV2UgY291bGRuJ3QgcmVjb25uZWN0LCBzbyBraWxsIG91ciB0YXJnZXQgcG9ydCBvZmYuCi0JICogSG93ZXZlciwgd2UgaGF2ZSB0byBkZWZlciB0aGUgcmVhbCByZW1vdmFsIGJlY2F1c2Ugd2UgbWlnaHQKLQkgKiBiZSBpbiB0aGUgY29udGV4dCBvZiB0aGUgU0NTSSBlcnJvciBoYW5kbGVyIG5vdywgd2hpY2gKLQkgKiB3b3VsZCBkZWFkbG9jayBpZiB3ZSBjYWxsIHNjc2lfcmVtb3ZlX2hvc3QoKS4KKwkgKiBIb3dldmVyLCB3ZSBoYXZlIHRvIGRlZmVyIHRoZSByZWFsIHJlbW92YWwgYmVjYXVzZSB3ZQorCSAqIGFyZSBpbiB0aGUgY29udGV4dCBvZiB0aGUgU0NTSSBlcnJvciBoYW5kbGVyIG5vdywgd2hpY2gKKwkgKiB3aWxsIGRlYWRsb2NrIGlmIHdlIGNhbGwgc2NzaV9yZW1vdmVfaG9zdCgpLgorCSAqCisJICogU2NoZWR1bGUgb3VyIHdvcmsgaW5zaWRlIHRoZSBsb2NrIHRvIGF2b2lkIGEgcmFjZSB3aXRoCisJICogdGhlIGZsdXNoX3NjaGVkdWxlZF93b3JrKCkgaW4gc3JwX3JlbW92ZV9vbmUoKS4KIAkgKi8KLQlzcGluX2xvY2tfaXJxKHRhcmdldC0+c2NzaV9ob3N0LT5ob3N0X2xvY2spOworCXNwaW5fbG9ja19pcnEoJnRhcmdldC0+bG9jayk7CiAJaWYgKHRhcmdldC0+c3RhdGUgPT0gU1JQX1RBUkdFVF9DT05ORUNUSU5HKSB7CiAJCXRhcmdldC0+c3RhdGUgPSBTUlBfVEFSR0VUX0RFQUQ7CiAJCUlOSVRfV09SSygmdGFyZ2V0LT53b3JrLCBzcnBfcmVtb3ZlX3dvcmspOwogCQlzY2hlZHVsZV93b3JrKCZ0YXJnZXQtPndvcmspOwogCX0KLQlzcGluX3VubG9ja19pcnEodGFyZ2V0LT5zY3NpX2hvc3QtPmhvc3RfbG9jayk7CisJc3Bpbl91bmxvY2tfaXJxKCZ0YXJnZXQtPmxvY2spOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTc1OCw3ICs3NjgsNyBAQAogCQlzdHJ1Y3Qgc3JwX2RpcmVjdF9idWYgKmJ1ZiA9ICh2b2lkICopIGNtZC0+YWRkX2RhdGE7CiAKIAkJYnVmLT52YSAgPSBjcHVfdG9fYmU2NChpYl9zZ19kbWFfYWRkcmVzcyhpYmRldiwgc2NhdCkpOwotCQlidWYtPmtleSA9IGNwdV90b19iZTMyKGRldi0+bXItPnJrZXkpOworCQlidWYtPmtleSA9IGNwdV90b19iZTMyKHRhcmdldC0+cmtleSk7CiAJCWJ1Zi0+bGVuID0gY3B1X3RvX2JlMzIoaWJfc2dfZG1hX2xlbihpYmRldiwgc2NhdCkpOwogCX0gZWxzZSBpZiAoc3JwX21hcF9mbXIodGFyZ2V0LCBzY2F0LCBjb3VudCwgcmVxLAogCQkJICAgICAgICh2b2lkICopIGNtZC0+YWRkX2RhdGEpKSB7CkBAIC03ODMsNyArNzkzLDcgQEAKIAkJCWJ1Zi0+ZGVzY19saXN0W2ldLnZhICA9CiAJCQkJY3B1X3RvX2JlNjQoaWJfc2dfZG1hX2FkZHJlc3MoaWJkZXYsIHNnKSk7CiAJCQlidWYtPmRlc2NfbGlzdFtpXS5rZXkgPQotCQkJCWNwdV90b19iZTMyKGRldi0+bXItPnJrZXkpOworCQkJCWNwdV90b19iZTMyKHRhcmdldC0+cmtleSk7CiAJCQlidWYtPmRlc2NfbGlzdFtpXS5sZW4gPSBjcHVfdG9fYmUzMihkbWFfbGVuKTsKIAkJCWRhdGFsZW4gKz0gZG1hX2xlbjsKIAkJfQpAQCAtNzk2LDcgKzgwNiw3IEBACiAJCWJ1Zi0+dGFibGVfZGVzYy52YSAgPQogCQkJY3B1X3RvX2JlNjQocmVxLT5jbWQtPmRtYSArIHNpemVvZiAqY21kICsgc2l6ZW9mICpidWYpOwogCQlidWYtPnRhYmxlX2Rlc2Mua2V5ID0KLQkJCWNwdV90b19iZTMyKHRhcmdldC0+c3JwX2hvc3QtPnNycF9kZXYtPm1yLT5ya2V5KTsKKwkJCWNwdV90b19iZTMyKHRhcmdldC0+cmtleSk7CiAJCWJ1Zi0+dGFibGVfZGVzYy5sZW4gPQogCQkJY3B1X3RvX2JlMzIoY291bnQgKiBzaXplb2YgKHN0cnVjdCBzcnBfZGlyZWN0X2J1ZikpOwogCkBAIC04MTIsOSArODIyLDIzIEBACiB9CiAKIC8qCi0gKiBNdXN0IGJlIGNhbGxlZCB3aXRoIHRhcmdldC0+c2NzaV9ob3N0LT5ob3N0X2xvY2sgaGVsZCB0byBwcm90ZWN0Ci0gKiByZXFfbGltIGFuZCB0eF9oZWFkLiAgTG9jayBjYW5ub3QgYmUgZHJvcHBlZCBiZXR3ZWVuIGNhbGwgaGVyZSBhbmQKLSAqIGNhbGwgdG8gX19zcnBfcG9zdF9zZW5kKCkuCisgKiBSZXR1cm4gYW4gSVUgYW5kIHBvc3NpYmxlIGNyZWRpdCB0byB0aGUgZnJlZSBwb29sCisgKi8KK3N0YXRpYyB2b2lkIHNycF9wdXRfdHhfaXUoc3RydWN0IHNycF90YXJnZXRfcG9ydCAqdGFyZ2V0LCBzdHJ1Y3Qgc3JwX2l1ICppdSwKKwkJCSAgZW51bSBzcnBfaXVfdHlwZSBpdV90eXBlKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdGFyZ2V0LT5sb2NrLCBmbGFncyk7CisJbGlzdF9hZGQoJml1LT5saXN0LCAmdGFyZ2V0LT5mcmVlX3R4KTsKKwlpZiAoaXVfdHlwZSAhPSBTUlBfSVVfUlNQKQorCQkrK3RhcmdldC0+cmVxX2xpbTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0YXJnZXQtPmxvY2ssIGZsYWdzKTsKK30KKworLyoKKyAqIE11c3QgYmUgY2FsbGVkIHdpdGggdGFyZ2V0LT5sb2NrIGhlbGQgdG8gcHJvdGVjdCByZXFfbGltIGFuZCBmcmVlX3R4LgorICogSWYgSVUgaXMgbm90IHNlbnQsIGl0IG11c3QgYmUgcmV0dXJuZWQgdXNpbmcgc3JwX3B1dF90eF9pdSgpLgogICoKICAqIE5vdGU6CiAgKiBBbiB1cHBlciBsaW1pdCBmb3IgdGhlIG51bWJlciBvZiBhbGxvY2F0ZWQgaW5mb3JtYXRpb24gdW5pdHMgZm9yIGVhY2gKQEAgLTgzMyw4MyArODU3LDU5IEBACiAKIAlzcnBfc2VuZF9jb21wbGV0aW9uKHRhcmdldC0+c2VuZF9jcSwgdGFyZ2V0KTsKIAotCWlmICh0YXJnZXQtPnR4X2hlYWQgLSB0YXJnZXQtPnR4X3RhaWwgPj0gU1JQX1NRX1NJWkUpCisJaWYgKGxpc3RfZW1wdHkoJnRhcmdldC0+ZnJlZV90eCkpCiAJCXJldHVybiBOVUxMOwogCiAJLyogSW5pdGlhdG9yIHJlc3BvbnNlcyB0byB0YXJnZXQgcmVxdWVzdHMgZG8gbm90IGNvbnN1bWUgY3JlZGl0cyAqLwotCWlmICh0YXJnZXQtPnJlcV9saW0gPD0gcnN2ICYmIGl1X3R5cGUgIT0gU1JQX0lVX1JTUCkgewotCQkrK3RhcmdldC0+emVyb19yZXFfbGltOwotCQlyZXR1cm4gTlVMTDsKKwlpZiAoaXVfdHlwZSAhPSBTUlBfSVVfUlNQKSB7CisJCWlmICh0YXJnZXQtPnJlcV9saW0gPD0gcnN2KSB7CisJCQkrK3RhcmdldC0+emVyb19yZXFfbGltOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKworCQktLXRhcmdldC0+cmVxX2xpbTsKIAl9CiAKLQlpdSA9IHRhcmdldC0+dHhfcmluZ1t0YXJnZXQtPnR4X2hlYWQgJiBTUlBfU1FfTUFTS107Ci0JaXUtPnR5cGUgPSBpdV90eXBlOworCWl1ID0gbGlzdF9maXJzdF9lbnRyeSgmdGFyZ2V0LT5mcmVlX3R4LCBzdHJ1Y3Qgc3JwX2l1LCBsaXN0KTsKKwlsaXN0X2RlbCgmaXUtPmxpc3QpOwogCXJldHVybiBpdTsKIH0KIAotLyoKLSAqIE11c3QgYmUgY2FsbGVkIHdpdGggdGFyZ2V0LT5zY3NpX2hvc3QtPmhvc3RfbG9jayBoZWxkIHRvIHByb3RlY3QKLSAqIHJlcV9saW0gYW5kIHR4X2hlYWQuCi0gKi8KLXN0YXRpYyBpbnQgX19zcnBfcG9zdF9zZW5kKHN0cnVjdCBzcnBfdGFyZ2V0X3BvcnQgKnRhcmdldCwKLQkJCSAgIHN0cnVjdCBzcnBfaXUgKml1LCBpbnQgbGVuKQorc3RhdGljIGludCBzcnBfcG9zdF9zZW5kKHN0cnVjdCBzcnBfdGFyZ2V0X3BvcnQgKnRhcmdldCwKKwkJCSBzdHJ1Y3Qgc3JwX2l1ICppdSwgaW50IGxlbikKIHsKIAlzdHJ1Y3QgaWJfc2dlIGxpc3Q7CiAJc3RydWN0IGliX3NlbmRfd3Igd3IsICpiYWRfd3I7Ci0JaW50IHJldCA9IDA7CiAKIAlsaXN0LmFkZHIgICA9IGl1LT5kbWE7CiAJbGlzdC5sZW5ndGggPSBsZW47Ci0JbGlzdC5sa2V5ICAgPSB0YXJnZXQtPnNycF9ob3N0LT5zcnBfZGV2LT5tci0+bGtleTsKKwlsaXN0LmxrZXkgICA9IHRhcmdldC0+bGtleTsKIAogCXdyLm5leHQgICAgICAgPSBOVUxMOwotCXdyLndyX2lkICAgICAgPSB0YXJnZXQtPnR4X2hlYWQgJiBTUlBfU1FfTUFTSzsKKwl3ci53cl9pZCAgICAgID0gKHVpbnRwdHJfdCkgaXU7CiAJd3Iuc2dfbGlzdCAgICA9ICZsaXN0OwogCXdyLm51bV9zZ2UgICAgPSAxOwogCXdyLm9wY29kZSAgICAgPSBJQl9XUl9TRU5EOwogCXdyLnNlbmRfZmxhZ3MgPSBJQl9TRU5EX1NJR05BTEVEOwogCi0JcmV0ID0gaWJfcG9zdF9zZW5kKHRhcmdldC0+cXAsICZ3ciwgJmJhZF93cik7Ci0KLQlpZiAoIXJldCkgewotCQkrK3RhcmdldC0+dHhfaGVhZDsKLQkJaWYgKGl1LT50eXBlICE9IFNSUF9JVV9SU1ApCi0JCQktLXRhcmdldC0+cmVxX2xpbTsKLQl9Ci0KLQlyZXR1cm4gcmV0OworCXJldHVybiBpYl9wb3N0X3NlbmQodGFyZ2V0LT5xcCwgJndyLCAmYmFkX3dyKTsKIH0KIAotc3RhdGljIGludCBzcnBfcG9zdF9yZWN2KHN0cnVjdCBzcnBfdGFyZ2V0X3BvcnQgKnRhcmdldCkKK3N0YXRpYyBpbnQgc3JwX3Bvc3RfcmVjdihzdHJ1Y3Qgc3JwX3RhcmdldF9wb3J0ICp0YXJnZXQsIHN0cnVjdCBzcnBfaXUgKml1KQogewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3RydWN0IHNycF9pdSAqaXU7Ci0Jc3RydWN0IGliX3NnZSBsaXN0OwogCXN0cnVjdCBpYl9yZWN2X3dyIHdyLCAqYmFkX3dyOwotCXVuc2lnbmVkIGludCBuZXh0OwotCWludCByZXQ7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSh0YXJnZXQtPnNjc2lfaG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7Ci0KLQluZXh0CSA9IHRhcmdldC0+cnhfaGVhZCAmIFNSUF9SUV9NQVNLOwotCXdyLndyX2lkID0gbmV4dDsKLQlpdQkgPSB0YXJnZXQtPnJ4X3JpbmdbbmV4dF07CisJc3RydWN0IGliX3NnZSBsaXN0OwogCiAJbGlzdC5hZGRyICAgPSBpdS0+ZG1hOwogCWxpc3QubGVuZ3RoID0gaXUtPnNpemU7Ci0JbGlzdC5sa2V5ICAgPSB0YXJnZXQtPnNycF9ob3N0LT5zcnBfZGV2LT5tci0+bGtleTsKKwlsaXN0LmxrZXkgICA9IHRhcmdldC0+bGtleTsKIAogCXdyLm5leHQgICAgID0gTlVMTDsKKwl3ci53cl9pZCAgICA9ICh1aW50cHRyX3QpIGl1OwogCXdyLnNnX2xpc3QgID0gJmxpc3Q7CiAJd3IubnVtX3NnZSAgPSAxOwogCi0JcmV0ID0gaWJfcG9zdF9yZWN2KHRhcmdldC0+cXAsICZ3ciwgJmJhZF93cik7Ci0JaWYgKCFyZXQpCi0JCSsrdGFyZ2V0LT5yeF9oZWFkOwotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSh0YXJnZXQtPnNjc2lfaG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7Ci0KLQlyZXR1cm4gcmV0OworCXJldHVybiBpYl9wb3N0X3JlY3YodGFyZ2V0LT5xcCwgJndyLCAmYmFkX3dyKTsKIH0KIAogc3RhdGljIHZvaWQgc3JwX3Byb2Nlc3NfcnNwKHN0cnVjdCBzcnBfdGFyZ2V0X3BvcnQgKnRhcmdldCwgc3RydWN0IHNycF9yc3AgKnJzcCkKQEAgLTkxNywyMyArOTE3LDE4IEBACiAJc3RydWN0IHNycF9yZXF1ZXN0ICpyZXE7CiAJc3RydWN0IHNjc2lfY21uZCAqc2NtbmQ7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzMzIgZGVsdGE7Ci0KLQlkZWx0YSA9IChzMzIpIGJlMzJfdG9fY3B1KHJzcC0+cmVxX2xpbV9kZWx0YSk7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSh0YXJnZXQtPnNjc2lfaG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7Ci0KLQl0YXJnZXQtPnJlcV9saW0gKz0gZGVsdGE7Ci0KLQlyZXEgPSAmdGFyZ2V0LT5yZXFfcmluZ1tyc3AtPnRhZyAmIH5TUlBfVEFHX1RTS19NR01UXTsKIAogCWlmICh1bmxpa2VseShyc3AtPnRhZyAmIFNSUF9UQUdfVFNLX01HTVQpKSB7Ci0JCWlmIChiZTMyX3RvX2NwdShyc3AtPnJlc3BfZGF0YV9sZW4pIDwgNCkKLQkJCXJlcS0+dHNrX3N0YXR1cyA9IC0xOwotCQllbHNlCi0JCQlyZXEtPnRza19zdGF0dXMgPSByc3AtPmRhdGFbM107Ci0JCWNvbXBsZXRlKCZyZXEtPmRvbmUpOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmdGFyZ2V0LT5sb2NrLCBmbGFncyk7CisJCXRhcmdldC0+cmVxX2xpbSArPSBiZTMyX3RvX2NwdShyc3AtPnJlcV9saW1fZGVsdGEpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0YXJnZXQtPmxvY2ssIGZsYWdzKTsKKworCQl0YXJnZXQtPnRza19tZ210X3N0YXR1cyA9IC0xOworCQlpZiAoYmUzMl90b19jcHUocnNwLT5yZXNwX2RhdGFfbGVuKSA+PSA0KQorCQkJdGFyZ2V0LT50c2tfbWdtdF9zdGF0dXMgPSByc3AtPmRhdGFbM107CisJCWNvbXBsZXRlKCZ0YXJnZXQtPnRza19tZ210X2RvbmUpOwogCX0gZWxzZSB7CisJCXJlcSA9ICZ0YXJnZXQtPnJlcV9yaW5nW3JzcC0+dGFnXTsKIAkJc2NtbmQgPSByZXEtPnNjbW5kOwogCQlpZiAoIXNjbW5kKQogCQkJc2hvc3RfcHJpbnRrKEtFUk5fRVJSLCB0YXJnZXQtPnNjc2lfaG9zdCwKQEAgLTk1Myw0OSArOTQ4LDQyIEBACiAJCWVsc2UgaWYgKHJzcC0+ZmxhZ3MgJiAoU1JQX1JTUF9GTEFHX0RJT1ZFUiB8IFNSUF9SU1BfRkxBR19ESVVOREVSKSkKIAkJCXNjc2lfc2V0X3Jlc2lkKHNjbW5kLCBiZTMyX3RvX2NwdShyc3AtPmRhdGFfaW5fcmVzX2NudCkpOwogCi0JCWlmICghcmVxLT50c2tfbWdtdCkgewotCQkJc2NtbmQtPmhvc3Rfc2NyaWJibGUgPSAodm9pZCAqKSAtMUw7Ci0JCQlzY21uZC0+c2NzaV9kb25lKHNjbW5kKTsKLQotCQkJc3JwX3JlbW92ZV9yZXEodGFyZ2V0LCByZXEpOwotCQl9IGVsc2UKLQkJCXJlcS0+Y21kX2RvbmUgPSAxOworCQlzcnBfcmVtb3ZlX3JlcSh0YXJnZXQsIHJlcSwgYmUzMl90b19jcHUocnNwLT5yZXFfbGltX2RlbHRhKSk7CisJCXNjbW5kLT5ob3N0X3NjcmliYmxlID0gTlVMTDsKKwkJc2NtbmQtPnNjc2lfZG9uZShzY21uZCk7CiAJfQotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSh0YXJnZXQtPnNjc2lfaG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CiB9CiAKIHN0YXRpYyBpbnQgc3JwX3Jlc3BvbnNlX2NvbW1vbihzdHJ1Y3Qgc3JwX3RhcmdldF9wb3J0ICp0YXJnZXQsIHMzMiByZXFfZGVsdGEsCiAJCQkgICAgICAgdm9pZCAqcnNwLCBpbnQgbGVuKQogewotCXN0cnVjdCBpYl9kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgaWJfZGV2aWNlICpkZXYgPSB0YXJnZXQtPnNycF9ob3N0LT5zcnBfZGV2LT5kZXY7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzdHJ1Y3Qgc3JwX2l1ICppdTsKLQlpbnQgZXJyID0gMTsKKwlpbnQgZXJyOwogCi0JZGV2ID0gdGFyZ2V0LT5zcnBfaG9zdC0+c3JwX2Rldi0+ZGV2OwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUodGFyZ2V0LT5zY3NpX2hvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOworCXNwaW5fbG9ja19pcnFzYXZlKCZ0YXJnZXQtPmxvY2ssIGZsYWdzKTsKIAl0YXJnZXQtPnJlcV9saW0gKz0gcmVxX2RlbHRhOwotCiAJaXUgPSBfX3NycF9nZXRfdHhfaXUodGFyZ2V0LCBTUlBfSVVfUlNQKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0YXJnZXQtPmxvY2ssIGZsYWdzKTsKKwogCWlmICghaXUpIHsKIAkJc2hvc3RfcHJpbnRrKEtFUk5fRVJSLCB0YXJnZXQtPnNjc2lfaG9zdCwgUEZYCiAJCQkgICAgICJubyBJVSBhdmFpbGFibGUgdG8gc2VuZCByZXNwb25zZVxuIik7Ci0JCWdvdG8gb3V0OworCQlyZXR1cm4gMTsKIAl9CiAKIAlpYl9kbWFfc3luY19zaW5nbGVfZm9yX2NwdShkZXYsIGl1LT5kbWEsIGxlbiwgRE1BX1RPX0RFVklDRSk7CiAJbWVtY3B5KGl1LT5idWYsIHJzcCwgbGVuKTsKIAlpYl9kbWFfc3luY19zaW5nbGVfZm9yX2RldmljZShkZXYsIGl1LT5kbWEsIGxlbiwgRE1BX1RPX0RFVklDRSk7CiAKLQllcnIgPSBfX3NycF9wb3N0X3NlbmQodGFyZ2V0LCBpdSwgbGVuKTsKLQlpZiAoZXJyKQorCWVyciA9IHNycF9wb3N0X3NlbmQodGFyZ2V0LCBpdSwgbGVuKTsKKwlpZiAoZXJyKSB7CiAJCXNob3N0X3ByaW50ayhLRVJOX0VSUiwgdGFyZ2V0LT5zY3NpX2hvc3QsIFBGWAogCQkJICAgICAidW5hYmxlIHRvIHBvc3QgcmVzcG9uc2U6ICVkXG4iLCBlcnIpOworCQlzcnBfcHV0X3R4X2l1KHRhcmdldCwgaXUsIFNSUF9JVV9SU1ApOworCX0KIAotb3V0OgotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUodGFyZ2V0LT5zY3NpX2hvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOwogCXJldHVybiBlcnI7CiB9CiAKQEAgLTEwMzIsMTQgKzEwMjAsMTEgQEAKIAogc3RhdGljIHZvaWQgc3JwX2hhbmRsZV9yZWN2KHN0cnVjdCBzcnBfdGFyZ2V0X3BvcnQgKnRhcmdldCwgc3RydWN0IGliX3djICp3YykKIHsKLQlzdHJ1Y3QgaWJfZGV2aWNlICpkZXY7Ci0Jc3RydWN0IHNycF9pdSAqaXU7CisJc3RydWN0IGliX2RldmljZSAqZGV2ID0gdGFyZ2V0LT5zcnBfaG9zdC0+c3JwX2Rldi0+ZGV2OworCXN0cnVjdCBzcnBfaXUgKml1ID0gKHN0cnVjdCBzcnBfaXUgKikgd2MtPndyX2lkOwogCWludCByZXM7CiAJdTggb3Bjb2RlOwogCi0JaXUgPSB0YXJnZXQtPnJ4X3Jpbmdbd2MtPndyX2lkXTsKLQotCWRldiA9IHRhcmdldC0+c3JwX2hvc3QtPnNycF9kZXYtPmRldjsKIAlpYl9kbWFfc3luY19zaW5nbGVfZm9yX2NwdShkZXYsIGl1LT5kbWEsIHRhcmdldC0+bWF4X3RpX2l1X2xlbiwKIAkJCQkgICBETUFfRlJPTV9ERVZJQ0UpOwogCkBAIC0xMDgwLDcgKzEwNjUsNyBAQAogCWliX2RtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKGRldiwgaXUtPmRtYSwgdGFyZ2V0LT5tYXhfdGlfaXVfbGVuLAogCQkJCSAgICAgIERNQV9GUk9NX0RFVklDRSk7CiAKLQlyZXMgPSBzcnBfcG9zdF9yZWN2KHRhcmdldCk7CisJcmVzID0gc3JwX3Bvc3RfcmVjdih0YXJnZXQsIGl1KTsKIAlpZiAocmVzICE9IDApCiAJCXNob3N0X3ByaW50ayhLRVJOX0VSUiwgdGFyZ2V0LT5zY3NpX2hvc3QsCiAJCQkgICAgIFBGWCAiUmVjdiBmYWlsZWQgd2l0aCBlcnJvciBjb2RlICVkXG4iLCByZXMpOwpAQCAtMTEwOSw2ICsxMDk0LDcgQEAKIHsKIAlzdHJ1Y3Qgc3JwX3RhcmdldF9wb3J0ICp0YXJnZXQgPSB0YXJnZXRfcHRyOwogCXN0cnVjdCBpYl93YyB3YzsKKwlzdHJ1Y3Qgc3JwX2l1ICppdTsKIAogCXdoaWxlIChpYl9wb2xsX2NxKGNxLCAxLCAmd2MpID4gMCkgewogCQlpZiAod2Muc3RhdHVzKSB7CkBAIC0xMTE5LDE4ICsxMTA1LDE5IEBACiAJCQlicmVhazsKIAkJfQogCi0JCSsrdGFyZ2V0LT50eF90YWlsOworCQlpdSA9IChzdHJ1Y3Qgc3JwX2l1ICopIHdjLndyX2lkOworCQlsaXN0X2FkZCgmaXUtPmxpc3QsICZ0YXJnZXQtPmZyZWVfdHgpOwogCX0KIH0KIAotc3RhdGljIGludCBzcnBfcXVldWVjb21tYW5kX2xjayhzdHJ1Y3Qgc2NzaV9jbW5kICpzY21uZCwKLQkJCSAgICB2b2lkICgqZG9uZSkoc3RydWN0IHNjc2lfY21uZCAqKSkKK3N0YXRpYyBpbnQgc3JwX3F1ZXVlY29tbWFuZChzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCwgc3RydWN0IHNjc2lfY21uZCAqc2NtbmQpCiB7Ci0Jc3RydWN0IHNycF90YXJnZXRfcG9ydCAqdGFyZ2V0ID0gaG9zdF90b190YXJnZXQoc2NtbmQtPmRldmljZS0+aG9zdCk7CisJc3RydWN0IHNycF90YXJnZXRfcG9ydCAqdGFyZ2V0ID0gaG9zdF90b190YXJnZXQoc2hvc3QpOwogCXN0cnVjdCBzcnBfcmVxdWVzdCAqcmVxOwogCXN0cnVjdCBzcnBfaXUgKml1OwogCXN0cnVjdCBzcnBfY21kICpjbWQ7CiAJc3RydWN0IGliX2RldmljZSAqZGV2OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IGxlbjsKIAogCWlmICh0YXJnZXQtPnN0YXRlID09IFNSUF9UQVJHRVRfQ09OTkVDVElORykKQEAgLTExMzksMTEgKzExMjYsMTkgQEAKIAlpZiAodGFyZ2V0LT5zdGF0ZSA9PSBTUlBfVEFSR0VUX0RFQUQgfHwKIAkgICAgdGFyZ2V0LT5zdGF0ZSA9PSBTUlBfVEFSR0VUX1JFTU9WRUQpIHsKIAkJc2NtbmQtPnJlc3VsdCA9IERJRF9CQURfVEFSR0VUIDw8IDE2OwotCQlkb25lKHNjbW5kKTsKKwkJc2NtbmQtPnNjc2lfZG9uZShzY21uZCk7CiAJCXJldHVybiAwOwogCX0KIAorCXNwaW5fbG9ja19pcnFzYXZlKCZ0YXJnZXQtPmxvY2ssIGZsYWdzKTsKIAlpdSA9IF9fc3JwX2dldF90eF9pdSh0YXJnZXQsIFNSUF9JVV9DTUQpOworCWlmIChpdSkgeworCQlyZXEgPSBsaXN0X2ZpcnN0X2VudHJ5KCZ0YXJnZXQtPmZyZWVfcmVxcywgc3RydWN0IHNycF9yZXF1ZXN0LAorCQkJCSAgICAgIGxpc3QpOworCQlsaXN0X2RlbCgmcmVxLT5saXN0KTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdGFyZ2V0LT5sb2NrLCBmbGFncyk7CisKIAlpZiAoIWl1KQogCQlnb3RvIGVycjsKIApAQCAtMTE1MSwxMSArMTE0Niw4IEBACiAJaWJfZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUoZGV2LCBpdS0+ZG1hLCBzcnBfbWF4X2l1X2xlbiwKIAkJCQkgICBETUFfVE9fREVWSUNFKTsKIAotCXJlcSA9IGxpc3RfZmlyc3RfZW50cnkoJnRhcmdldC0+ZnJlZV9yZXFzLCBzdHJ1Y3Qgc3JwX3JlcXVlc3QsIGxpc3QpOwotCi0Jc2NtbmQtPnNjc2lfZG9uZSAgICAgPSBkb25lOwogCXNjbW5kLT5yZXN1bHQgICAgICAgID0gMDsKLQlzY21uZC0+aG9zdF9zY3JpYmJsZSA9ICh2b2lkICopIChsb25nKSByZXEtPmluZGV4OworCXNjbW5kLT5ob3N0X3NjcmliYmxlID0gKHZvaWQgKikgcmVxOwogCiAJY21kID0gaXUtPmJ1ZjsKIAltZW1zZXQoY21kLCAwLCBzaXplb2YgKmNtZCk7CkBAIC0xMTY3LDM3ICsxMTU5LDM4IEBACiAKIAlyZXEtPnNjbW5kICAgID0gc2NtbmQ7CiAJcmVxLT5jbWQgICAgICA9IGl1OwotCXJlcS0+Y21kX2RvbmUgPSAwOwotCXJlcS0+dHNrX21nbXQgPSBOVUxMOwogCiAJbGVuID0gc3JwX21hcF9kYXRhKHNjbW5kLCB0YXJnZXQsIHJlcSk7CiAJaWYgKGxlbiA8IDApIHsKIAkJc2hvc3RfcHJpbnRrKEtFUk5fRVJSLCB0YXJnZXQtPnNjc2lfaG9zdCwKIAkJCSAgICAgUEZYICJGYWlsZWQgdG8gbWFwIGRhdGFcbiIpOwotCQlnb3RvIGVycjsKKwkJZ290byBlcnJfaXU7CiAJfQogCiAJaWJfZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2UoZGV2LCBpdS0+ZG1hLCBzcnBfbWF4X2l1X2xlbiwKIAkJCQkgICAgICBETUFfVE9fREVWSUNFKTsKIAotCWlmIChfX3NycF9wb3N0X3NlbmQodGFyZ2V0LCBpdSwgbGVuKSkgeworCWlmIChzcnBfcG9zdF9zZW5kKHRhcmdldCwgaXUsIGxlbikpIHsKIAkJc2hvc3RfcHJpbnRrKEtFUk5fRVJSLCB0YXJnZXQtPnNjc2lfaG9zdCwgUEZYICJTZW5kIGZhaWxlZFxuIik7CiAJCWdvdG8gZXJyX3VubWFwOwogCX0KIAotCWxpc3RfbW92ZV90YWlsKCZyZXEtPmxpc3QsICZ0YXJnZXQtPnJlcV9xdWV1ZSk7Ci0KIAlyZXR1cm4gMDsKIAogZXJyX3VubWFwOgogCXNycF91bm1hcF9kYXRhKHNjbW5kLCB0YXJnZXQsIHJlcSk7CiAKK2Vycl9pdToKKwlzcnBfcHV0X3R4X2l1KHRhcmdldCwgaXUsIFNSUF9JVV9DTUQpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnRhcmdldC0+bG9jaywgZmxhZ3MpOworCWxpc3RfYWRkKCZyZXEtPmxpc3QsICZ0YXJnZXQtPmZyZWVfcmVxcyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdGFyZ2V0LT5sb2NrLCBmbGFncyk7CisKIGVycjoKIAlyZXR1cm4gU0NTSV9NTFFVRVVFX0hPU1RfQlVTWTsKIH0KIAotc3RhdGljIERFRl9TQ1NJX1FDTUQoc3JwX3F1ZXVlY29tbWFuZCkKLQogc3RhdGljIGludCBzcnBfYWxsb2NfaXVfYnVmcyhzdHJ1Y3Qgc3JwX3RhcmdldF9wb3J0ICp0YXJnZXQpCiB7CiAJaW50IGk7CkBAIC0xMjE2LDYgKzEyMDksOCBAQAogCQkJCQkJICBHRlBfS0VSTkVMLCBETUFfVE9fREVWSUNFKTsKIAkJaWYgKCF0YXJnZXQtPnR4X3JpbmdbaV0pCiAJCQlnb3RvIGVycjsKKworCQlsaXN0X2FkZCgmdGFyZ2V0LT50eF9yaW5nW2ldLT5saXN0LCAmdGFyZ2V0LT5mcmVlX3R4KTsKIAl9CiAKIAlyZXR1cm4gMDsKQEAgLTEzNzcsNyArMTM3Miw4IEBACiAJCQlicmVhazsKIAogCQlmb3IgKGkgPSAwOyBpIDwgU1JQX1JRX1NJWkU7IGkrKykgewotCQkJdGFyZ2V0LT5zdGF0dXMgPSBzcnBfcG9zdF9yZWN2KHRhcmdldCk7CisJCQlzdHJ1Y3Qgc3JwX2l1ICppdSA9IHRhcmdldC0+cnhfcmluZ1tpXTsKKwkJCXRhcmdldC0+c3RhdHVzID0gc3JwX3Bvc3RfcmVjdih0YXJnZXQsIGl1KTsKIAkJCWlmICh0YXJnZXQtPnN0YXR1cykKIAkJCQlicmVhazsKIAkJfQpAQCAtMTQ0MiwyNSArMTQzOCwyNCBAQAogfQogCiBzdGF0aWMgaW50IHNycF9zZW5kX3Rza19tZ210KHN0cnVjdCBzcnBfdGFyZ2V0X3BvcnQgKnRhcmdldCwKLQkJCSAgICAgc3RydWN0IHNycF9yZXF1ZXN0ICpyZXEsIHU4IGZ1bmMpCisJCQkgICAgIHU2NCByZXFfdGFnLCB1bnNpZ25lZCBpbnQgbHVuLCB1OCBmdW5jKQogewogCXN0cnVjdCBpYl9kZXZpY2UgKmRldiA9IHRhcmdldC0+c3JwX2hvc3QtPnNycF9kZXYtPmRldjsKIAlzdHJ1Y3Qgc3JwX2l1ICppdTsKIAlzdHJ1Y3Qgc3JwX3Rza19tZ210ICp0c2tfbWdtdDsKIAotCXNwaW5fbG9ja19pcnEodGFyZ2V0LT5zY3NpX2hvc3QtPmhvc3RfbG9jayk7Ci0KIAlpZiAodGFyZ2V0LT5zdGF0ZSA9PSBTUlBfVEFSR0VUX0RFQUQgfHwKLQkgICAgdGFyZ2V0LT5zdGF0ZSA9PSBTUlBfVEFSR0VUX1JFTU9WRUQpIHsKLQkJcmVxLT5zY21uZC0+cmVzdWx0ID0gRElEX0JBRF9UQVJHRVQgPDwgMTY7Ci0JCWdvdG8gb3V0OwotCX0KKwkgICAgdGFyZ2V0LT5zdGF0ZSA9PSBTUlBfVEFSR0VUX1JFTU9WRUQpCisJCXJldHVybiAtMTsKIAotCWluaXRfY29tcGxldGlvbigmcmVxLT5kb25lKTsKKwlpbml0X2NvbXBsZXRpb24oJnRhcmdldC0+dHNrX21nbXRfZG9uZSk7CiAKKwlzcGluX2xvY2tfaXJxKCZ0YXJnZXQtPmxvY2spOwogCWl1ID0gX19zcnBfZ2V0X3R4X2l1KHRhcmdldCwgU1JQX0lVX1RTS19NR01UKTsKKwlzcGluX3VubG9ja19pcnEoJnRhcmdldC0+bG9jayk7CisKIAlpZiAoIWl1KQotCQlnb3RvIG91dDsKKwkJcmV0dXJuIC0xOwogCiAJaWJfZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUoZGV2LCBpdS0+ZG1hLCBzaXplb2YgKnRza19tZ210LAogCQkJCSAgIERNQV9UT19ERVZJQ0UpOwpAQCAtMTQ2OCw3MCArMTQ2Myw0NiBAQAogCW1lbXNldCh0c2tfbWdtdCwgMCwgc2l6ZW9mICp0c2tfbWdtdCk7CiAKIAl0c2tfbWdtdC0+b3Bjb2RlIAk9IFNSUF9UU0tfTUdNVDsKLQl0c2tfbWdtdC0+bHVuIAkJPSBjcHVfdG9fYmU2NCgodTY0KSByZXEtPnNjbW5kLT5kZXZpY2UtPmx1biA8PCA0OCk7Ci0JdHNrX21nbXQtPnRhZyAJCT0gcmVxLT5pbmRleCB8IFNSUF9UQUdfVFNLX01HTVQ7CisJdHNrX21nbXQtPmx1bgkJPSBjcHVfdG9fYmU2NCgodTY0KSBsdW4gPDwgNDgpOworCXRza19tZ210LT50YWcJCT0gcmVxX3RhZyB8IFNSUF9UQUdfVFNLX01HTVQ7CiAJdHNrX21nbXQtPnRza19tZ210X2Z1bmMgPSBmdW5jOwotCXRza19tZ210LT50YXNrX3RhZyAJPSByZXEtPmluZGV4OworCXRza19tZ210LT50YXNrX3RhZwk9IHJlcV90YWc7CiAKIAlpYl9kbWFfc3luY19zaW5nbGVfZm9yX2RldmljZShkZXYsIGl1LT5kbWEsIHNpemVvZiAqdHNrX21nbXQsCiAJCQkJICAgICAgRE1BX1RPX0RFVklDRSk7Ci0JaWYgKF9fc3JwX3Bvc3Rfc2VuZCh0YXJnZXQsIGl1LCBzaXplb2YgKnRza19tZ210KSkKLQkJZ290byBvdXQ7CisJaWYgKHNycF9wb3N0X3NlbmQodGFyZ2V0LCBpdSwgc2l6ZW9mICp0c2tfbWdtdCkpIHsKKwkJc3JwX3B1dF90eF9pdSh0YXJnZXQsIGl1LCBTUlBfSVVfVFNLX01HTVQpOworCQlyZXR1cm4gLTE7CisJfQogCi0JcmVxLT50c2tfbWdtdCA9IGl1OwotCi0Jc3Bpbl91bmxvY2tfaXJxKHRhcmdldC0+c2NzaV9ob3N0LT5ob3N0X2xvY2spOwotCi0JaWYgKCF3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJnJlcS0+ZG9uZSwKKwlpZiAoIXdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmdGFyZ2V0LT50c2tfbWdtdF9kb25lLAogCQkJCQkgbXNlY3NfdG9famlmZmllcyhTUlBfQUJPUlRfVElNRU9VVF9NUykpKQogCQlyZXR1cm4gLTE7CiAKIAlyZXR1cm4gMDsKLQotb3V0OgotCXNwaW5fdW5sb2NrX2lycSh0YXJnZXQtPnNjc2lfaG9zdC0+aG9zdF9sb2NrKTsKLQlyZXR1cm4gLTE7Ci19Ci0KLXN0YXRpYyBpbnQgc3JwX2ZpbmRfcmVxKHN0cnVjdCBzcnBfdGFyZ2V0X3BvcnQgKnRhcmdldCwKLQkJCXN0cnVjdCBzY3NpX2NtbmQgKnNjbW5kLAotCQkJc3RydWN0IHNycF9yZXF1ZXN0ICoqcmVxKQotewotCWlmIChzY21uZC0+aG9zdF9zY3JpYmJsZSA9PSAodm9pZCAqKSAtMUwpCi0JCXJldHVybiAtMTsKLQotCSpyZXEgPSAmdGFyZ2V0LT5yZXFfcmluZ1sobG9uZykgc2NtbmQtPmhvc3Rfc2NyaWJibGVdOwotCi0JcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgc3JwX2Fib3J0KHN0cnVjdCBzY3NpX2NtbmQgKnNjbW5kKQogewogCXN0cnVjdCBzcnBfdGFyZ2V0X3BvcnQgKnRhcmdldCA9IGhvc3RfdG9fdGFyZ2V0KHNjbW5kLT5kZXZpY2UtPmhvc3QpOwotCXN0cnVjdCBzcnBfcmVxdWVzdCAqcmVxOworCXN0cnVjdCBzcnBfcmVxdWVzdCAqcmVxID0gKHN0cnVjdCBzcnBfcmVxdWVzdCAqKSBzY21uZC0+aG9zdF9zY3JpYmJsZTsKIAlpbnQgcmV0ID0gU1VDQ0VTUzsKIAogCXNob3N0X3ByaW50ayhLRVJOX0VSUiwgdGFyZ2V0LT5zY3NpX2hvc3QsICJTUlAgYWJvcnQgY2FsbGVkXG4iKTsKIAotCWlmICh0YXJnZXQtPnFwX2luX2Vycm9yKQorCWlmICghcmVxIHx8IHRhcmdldC0+cXBfaW5fZXJyb3IpCiAJCXJldHVybiBGQUlMRUQ7Ci0JaWYgKHNycF9maW5kX3JlcSh0YXJnZXQsIHNjbW5kLCAmcmVxKSkKLQkJcmV0dXJuIEZBSUxFRDsKLQlpZiAoc3JwX3NlbmRfdHNrX21nbXQodGFyZ2V0LCByZXEsIFNSUF9UU0tfQUJPUlRfVEFTSykpCisJaWYgKHNycF9zZW5kX3Rza19tZ210KHRhcmdldCwgcmVxLT5pbmRleCwgc2NtbmQtPmRldmljZS0+bHVuLAorCQkJICAgICAgU1JQX1RTS19BQk9SVF9UQVNLKSkKIAkJcmV0dXJuIEZBSUxFRDsKIAotCXNwaW5fbG9ja19pcnEodGFyZ2V0LT5zY3NpX2hvc3QtPmhvc3RfbG9jayk7Ci0KLQlpZiAocmVxLT5jbWRfZG9uZSkgewotCQlzcnBfcmVtb3ZlX3JlcSh0YXJnZXQsIHJlcSk7Ci0JCXNjbW5kLT5zY3NpX2RvbmUoc2NtbmQpOwotCX0gZWxzZSBpZiAoIXJlcS0+dHNrX3N0YXR1cykgewotCQlzcnBfcmVtb3ZlX3JlcSh0YXJnZXQsIHJlcSk7Ci0JCXNjbW5kLT5yZXN1bHQgPSBESURfQUJPUlQgPDwgMTY7Ci0JfSBlbHNlCi0JCXJldCA9IEZBSUxFRDsKLQotCXNwaW5fdW5sb2NrX2lycSh0YXJnZXQtPnNjc2lfaG9zdC0+aG9zdF9sb2NrKTsKKwlpZiAocmVxLT5zY21uZCkgeworCQlpZiAoIXRhcmdldC0+dHNrX21nbXRfc3RhdHVzKSB7CisJCQlzcnBfcmVtb3ZlX3JlcSh0YXJnZXQsIHJlcSwgMCk7CisJCQlzY21uZC0+cmVzdWx0ID0gRElEX0FCT1JUIDw8IDE2OworCQl9IGVsc2UKKwkJCXJldCA9IEZBSUxFRDsKKwl9CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtMTUzOSwyNiArMTUxMCwyMyBAQAogc3RhdGljIGludCBzcnBfcmVzZXRfZGV2aWNlKHN0cnVjdCBzY3NpX2NtbmQgKnNjbW5kKQogewogCXN0cnVjdCBzcnBfdGFyZ2V0X3BvcnQgKnRhcmdldCA9IGhvc3RfdG9fdGFyZ2V0KHNjbW5kLT5kZXZpY2UtPmhvc3QpOwotCXN0cnVjdCBzcnBfcmVxdWVzdCAqcmVxLCAqdG1wOworCWludCBpOwogCiAJc2hvc3RfcHJpbnRrKEtFUk5fRVJSLCB0YXJnZXQtPnNjc2lfaG9zdCwgIlNSUCByZXNldF9kZXZpY2UgY2FsbGVkXG4iKTsKIAogCWlmICh0YXJnZXQtPnFwX2luX2Vycm9yKQogCQlyZXR1cm4gRkFJTEVEOwotCWlmIChzcnBfZmluZF9yZXEodGFyZ2V0LCBzY21uZCwgJnJlcSkpCisJaWYgKHNycF9zZW5kX3Rza19tZ210KHRhcmdldCwgU1JQX1RBR19OT19SRVEsIHNjbW5kLT5kZXZpY2UtPmx1biwKKwkJCSAgICAgIFNSUF9UU0tfTFVOX1JFU0VUKSkKIAkJcmV0dXJuIEZBSUxFRDsKLQlpZiAoc3JwX3NlbmRfdHNrX21nbXQodGFyZ2V0LCByZXEsIFNSUF9UU0tfTFVOX1JFU0VUKSkKLQkJcmV0dXJuIEZBSUxFRDsKLQlpZiAocmVxLT50c2tfc3RhdHVzKQorCWlmICh0YXJnZXQtPnRza19tZ210X3N0YXR1cykKIAkJcmV0dXJuIEZBSUxFRDsKIAotCXNwaW5fbG9ja19pcnEodGFyZ2V0LT5zY3NpX2hvc3QtPmhvc3RfbG9jayk7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocmVxLCB0bXAsICZ0YXJnZXQtPnJlcV9xdWV1ZSwgbGlzdCkKLQkJaWYgKHJlcS0+c2NtbmQtPmRldmljZSA9PSBzY21uZC0+ZGV2aWNlKQorCWZvciAoaSA9IDA7IGkgPCBTUlBfQ01EX1NRX1NJWkU7ICsraSkgeworCQlzdHJ1Y3Qgc3JwX3JlcXVlc3QgKnJlcSA9ICZ0YXJnZXQtPnJlcV9yaW5nW2ldOworCQlpZiAocmVxLT5zY21uZCAmJiByZXEtPnNjbW5kLT5kZXZpY2UgPT0gc2NtbmQtPmRldmljZSkKIAkJCXNycF9yZXNldF9yZXEodGFyZ2V0LCByZXEpOwotCi0Jc3Bpbl91bmxvY2tfaXJxKHRhcmdldC0+c2NzaV9ob3N0LT5ob3N0X2xvY2spOworCX0KIAogCXJldHVybiBTVUNDRVNTOwogfQpAQCAtMTk4Nyw5ICsxOTU1LDEyIEBACiAJdGFyZ2V0LT5pb19jbGFzcyAgID0gU1JQX1JFVjE2QV9JQl9JT19DTEFTUzsKIAl0YXJnZXQtPnNjc2lfaG9zdCAgPSB0YXJnZXRfaG9zdDsKIAl0YXJnZXQtPnNycF9ob3N0ICAgPSBob3N0OworCXRhcmdldC0+bGtleQkgICA9IGhvc3QtPnNycF9kZXYtPm1yLT5sa2V5OworCXRhcmdldC0+cmtleQkgICA9IGhvc3QtPnNycF9kZXYtPm1yLT5ya2V5OwogCisJc3Bpbl9sb2NrX2luaXQoJnRhcmdldC0+bG9jayk7CisJSU5JVF9MSVNUX0hFQUQoJnRhcmdldC0+ZnJlZV90eCk7CiAJSU5JVF9MSVNUX0hFQUQoJnRhcmdldC0+ZnJlZV9yZXFzKTsKLQlJTklUX0xJU1RfSEVBRCgmdGFyZ2V0LT5yZXFfcXVldWUpOwogCWZvciAoaSA9IDA7IGkgPCBTUlBfQ01EX1NRX1NJWkU7ICsraSkgewogCQl0YXJnZXQtPnJlcV9yaW5nW2ldLmluZGV4ID0gaTsKIAkJbGlzdF9hZGRfdGFpbCgmdGFyZ2V0LT5yZXFfcmluZ1tpXS5saXN0LCAmdGFyZ2V0LT5mcmVlX3JlcXMpOwpAQCAtMjIxNyw5ICsyMTg4LDkgQEAKIAkJICovCiAJCXNwaW5fbG9jaygmaG9zdC0+dGFyZ2V0X2xvY2spOwogCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHRhcmdldCwgJmhvc3QtPnRhcmdldF9saXN0LCBsaXN0KSB7Ci0JCQlzcGluX2xvY2tfaXJxKHRhcmdldC0+c2NzaV9ob3N0LT5ob3N0X2xvY2spOworCQkJc3Bpbl9sb2NrX2lycSgmdGFyZ2V0LT5sb2NrKTsKIAkJCXRhcmdldC0+c3RhdGUgPSBTUlBfVEFSR0VUX1JFTU9WRUQ7Ci0JCQlzcGluX3VubG9ja19pcnEodGFyZ2V0LT5zY3NpX2hvc3QtPmhvc3RfbG9jayk7CisJCQlzcGluX3VubG9ja19pcnEoJnRhcmdldC0+bG9jayk7CiAJCX0KIAkJc3Bpbl91bmxvY2soJmhvc3QtPnRhcmdldF9sb2NrKTsKIApAQCAtMjI1OCw4ICsyMjI5LDcgQEAKIHsKIAlpbnQgcmV0OwogCi0JQlVJTERfQlVHX09OX05PVF9QT1dFUl9PRl8yKFNSUF9TUV9TSVpFKTsKLQlCVUlMRF9CVUdfT05fTk9UX1BPV0VSX09GXzIoU1JQX1JRX1NJWkUpOworCUJVSUxEX0JVR19PTihGSUVMRF9TSVpFT0Yoc3RydWN0IGliX3djLCB3cl9pZCkgPCBzaXplb2Yodm9pZCAqKSk7CiAKIAlpZiAoc3JwX3NnX3RhYmxlc2l6ZSA+IDI1NSkgewogCQlwcmludGsoS0VSTl9XQVJOSU5HIFBGWCAiQ2xhbXBpbmcgc3JwX3NnX3RhYmxlc2l6ZSB0byAyNTVcbiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL3VscC9zcnAvaWJfc3JwLmggYi9kcml2ZXJzL2luZmluaWJhbmQvdWxwL3NycC9pYl9zcnAuaAppbmRleCBlZDBkY2U5Li45ZGM2ZmMzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvdWxwL3NycC9pYl9zcnAuaAorKysgYi9kcml2ZXJzL2luZmluaWJhbmQvdWxwL3NycC9pYl9zcnAuaApAQCAtNTksMTYgKzU5LDE1IEBACiAKIAlTUlBfUlFfU0hJRlQgICAgCT0gNiwKIAlTUlBfUlFfU0laRQkJPSAxIDw8IFNSUF9SUV9TSElGVCwKLQlTUlBfUlFfTUFTSwkJPSBTUlBfUlFfU0laRSAtIDEsCiAKIAlTUlBfU1FfU0laRQkJPSBTUlBfUlFfU0laRSwKLQlTUlBfU1FfTUFTSwkJPSBTUlBfU1FfU0laRSAtIDEsCiAJU1JQX1JTUF9TUV9TSVpFCQk9IDEsCiAJU1JQX1JFUV9TUV9TSVpFCQk9IFNSUF9TUV9TSVpFIC0gU1JQX1JTUF9TUV9TSVpFLAogCVNSUF9UU0tfTUdNVF9TUV9TSVpFCT0gMSwKIAlTUlBfQ01EX1NRX1NJWkUJCT0gU1JQX1JFUV9TUV9TSVpFIC0gU1JQX1RTS19NR01UX1NRX1NJWkUsCiAKLQlTUlBfVEFHX1RTS19NR01UCT0gMSA8PCAoU1JQX1JRX1NISUZUICsgMSksCisJU1JQX1RBR19OT19SRVEJCT0gfjBVLAorCVNSUF9UQUdfVFNLX01HTVQJPSAxVSA8PCAzMSwKIAogCVNSUF9GTVJfU0laRQkJPSAyNTYsCiAJU1JQX0ZNUl9QT09MX1NJWkUJPSAxMDI0LApAQCAtMTEzLDE1ICsxMTIsMjkgQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkCWxpc3Q7CiAJc3RydWN0IHNjc2lfY21uZCAgICAgICAqc2NtbmQ7CiAJc3RydWN0IHNycF9pdQkgICAgICAgKmNtZDsKLQlzdHJ1Y3Qgc3JwX2l1CSAgICAgICAqdHNrX21nbXQ7CiAJc3RydWN0IGliX3Bvb2xfZm1yICAgICAqZm1yOwotCXN0cnVjdCBjb21wbGV0aW9uCWRvbmU7CiAJc2hvcnQJCQlpbmRleDsKLQl1OAkJCWNtZF9kb25lOwotCXU4CQkJdHNrX3N0YXR1czsKIH07CiAKIHN0cnVjdCBzcnBfdGFyZ2V0X3BvcnQgeworCS8qIFRoZXNlIGFyZSBSVyBpbiB0aGUgaG90IHBhdGgsIGFuZCBjb21tb25seSB1c2VkIHRvZ2V0aGVyICovCisJc3RydWN0IGxpc3RfaGVhZAlmcmVlX3R4OworCXN0cnVjdCBsaXN0X2hlYWQJZnJlZV9yZXFzOworCXNwaW5sb2NrX3QJCWxvY2s7CisJczMyCQkJcmVxX2xpbTsKKworCS8qIFRoZXNlIGFyZSByZWFkLW9ubHkgaW4gdGhlIGhvdCBwYXRoICovCisJc3RydWN0IGliX2NxCSAgICAgICAqc2VuZF9jcSBfX19fY2FjaGVsaW5lX2FsaWduZWRfaW5fc21wOworCXN0cnVjdCBpYl9jcQkgICAgICAgKnJlY3ZfY3E7CisJc3RydWN0IGliX3FwCSAgICAgICAqcXA7CisJdTMyCQkJbGtleTsKKwl1MzIJCQlya2V5OworCWVudW0gc3JwX3RhcmdldF9zdGF0ZQlzdGF0ZTsKKworCS8qIEV2ZXJ5dGhpbmcgYWJvdmUgdGhpcyBwb2ludCBpcyB1c2VkIGluIHRoZSBob3QgcGF0aCBvZgorCSAqIGNvbW1hbmQgcHJvY2Vzc2luZy4gVHJ5IHRvIGtlZXAgdGhlbSBwYWNrZWQgaW50byBjYWNoZWxpbmVzLgorCSAqLworCiAJX19iZTY0CQkJaWRfZXh0OwogCV9fYmU2NAkJCWlvY19ndWlkOwogCV9fYmU2NAkJCXNlcnZpY2VfaWQ7CkBAIC0xMzgsMjQgKzE1MSwxMyBAQAogCWludAkJCXBhdGhfcXVlcnlfaWQ7CiAKIAlzdHJ1Y3QgaWJfY21faWQJICAgICAgICpjbV9pZDsKLQlzdHJ1Y3QgaWJfY3EJICAgICAgICpyZWN2X2NxOwotCXN0cnVjdCBpYl9jcQkgICAgICAgKnNlbmRfY3E7Ci0Jc3RydWN0IGliX3FwCSAgICAgICAqcXA7CiAKIAlpbnQJCQltYXhfdGlfaXVfbGVuOwotCXMzMgkJCXJlcV9saW07CiAKIAlpbnQJCQl6ZXJvX3JlcV9saW07CiAKLQl1bnNpZ25lZAkJcnhfaGVhZDsKLQlzdHJ1Y3Qgc3JwX2l1CSAgICAgICAqcnhfcmluZ1tTUlBfUlFfU0laRV07Ci0KLQl1bnNpZ25lZAkJdHhfaGVhZDsKLQl1bnNpZ25lZAkJdHhfdGFpbDsKIAlzdHJ1Y3Qgc3JwX2l1CSAgICAgICAqdHhfcmluZ1tTUlBfU1FfU0laRV07Ci0KLQlzdHJ1Y3QgbGlzdF9oZWFkCWZyZWVfcmVxczsKLQlzdHJ1Y3QgbGlzdF9oZWFkCXJlcV9xdWV1ZTsKKwlzdHJ1Y3Qgc3JwX2l1CSAgICAgICAqcnhfcmluZ1tTUlBfUlFfU0laRV07CiAJc3RydWN0IHNycF9yZXF1ZXN0CXJlcV9yaW5nW1NSUF9DTURfU1FfU0laRV07CiAKIAlzdHJ1Y3Qgd29ya19zdHJ1Y3QJd29yazsKQEAgLTE2MywxNiArMTY1LDE4IEBACiAJc3RydWN0IGxpc3RfaGVhZAlsaXN0OwogCXN0cnVjdCBjb21wbGV0aW9uCWRvbmU7CiAJaW50CQkJc3RhdHVzOwotCWVudW0gc3JwX3RhcmdldF9zdGF0ZQlzdGF0ZTsKIAlpbnQJCQlxcF9pbl9lcnJvcjsKKworCXN0cnVjdCBjb21wbGV0aW9uCXRza19tZ210X2RvbmU7CisJdTgJCQl0c2tfbWdtdF9zdGF0dXM7CiB9OwogCiBzdHJ1Y3Qgc3JwX2l1IHsKKwlzdHJ1Y3QgbGlzdF9oZWFkCWxpc3Q7CiAJdTY0CQkJZG1hOwogCXZvaWQJCSAgICAgICAqYnVmOwogCXNpemVfdAkJCXNpemU7CiAJZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24JZGlyZWN0aW9uOwotCWVudW0gc3JwX2l1X3R5cGUJdHlwZTsKIH07CiAKICNlbmRpZiAvKiBJQl9TUlBfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9tb3VzZS9iY201OTc0LmMgYi9kcml2ZXJzL2lucHV0L21vdXNlL2JjbTU5NzQuYwppbmRleCBiOTUyMzE3Li5lZTgyODUxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L21vdXNlL2JjbTU5NzQuYworKysgYi9kcml2ZXJzL2lucHV0L21vdXNlL2JjbTU5NzQuYwpAQCAtNTUsNiArNTUsMTQgQEAKICNkZWZpbmUgVVNCX0RFVklDRV9JRF9BUFBMRV9XRUxMU1BSSU5HM19BTlNJCTB4MDIzNgogI2RlZmluZSBVU0JfREVWSUNFX0lEX0FQUExFX1dFTExTUFJJTkczX0lTTwkweDAyMzcKICNkZWZpbmUgVVNCX0RFVklDRV9JRF9BUFBMRV9XRUxMU1BSSU5HM19KSVMJMHgwMjM4CisvKiBNYWNib29rQWlyMywyICh1bmlib2R5KSwgYWthIHdlbGxzcHJpbmc1ICovCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfQVBQTEVfV0VMTFNQUklORzRfQU5TSQkweDAyM2YKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9BUFBMRV9XRUxMU1BSSU5HNF9JU08JMHgwMjQwCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfQVBQTEVfV0VMTFNQUklORzRfSklTCTB4MDI0MQorLyogTWFjYm9va0FpcjMsMSAodW5pYm9keSksIGFrYSB3ZWxsc3ByaW5nNCAqLworI2RlZmluZSBVU0JfREVWSUNFX0lEX0FQUExFX1dFTExTUFJJTkc0QV9BTlNJCTB4MDI0MgorI2RlZmluZSBVU0JfREVWSUNFX0lEX0FQUExFX1dFTExTUFJJTkc0QV9JU08JMHgwMjQzCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfQVBQTEVfV0VMTFNQUklORzRBX0pJUwkweDAyNDQKIAogI2RlZmluZSBCQ001OTc0X0RFVklDRShwcm9kKSB7CQkJCQlcCiAJLm1hdGNoX2ZsYWdzID0gKFVTQl9ERVZJQ0VfSURfTUFUQ0hfREVWSUNFIHwJCVwKQEAgLTgwLDYgKzg4LDE0IEBACiAJQkNNNTk3NF9ERVZJQ0UoVVNCX0RFVklDRV9JRF9BUFBMRV9XRUxMU1BSSU5HM19BTlNJKSwKIAlCQ001OTc0X0RFVklDRShVU0JfREVWSUNFX0lEX0FQUExFX1dFTExTUFJJTkczX0lTTyksCiAJQkNNNTk3NF9ERVZJQ0UoVVNCX0RFVklDRV9JRF9BUFBMRV9XRUxMU1BSSU5HM19KSVMpLAorCS8qIE1hY2Jvb2tBaXIzLDIgKi8KKwlCQ001OTc0X0RFVklDRShVU0JfREVWSUNFX0lEX0FQUExFX1dFTExTUFJJTkc0X0FOU0kpLAorCUJDTTU5NzRfREVWSUNFKFVTQl9ERVZJQ0VfSURfQVBQTEVfV0VMTFNQUklORzRfSVNPKSwKKwlCQ001OTc0X0RFVklDRShVU0JfREVWSUNFX0lEX0FQUExFX1dFTExTUFJJTkc0X0pJUyksCisJLyogTWFjYm9va0FpcjMsMSAqLworCUJDTTU5NzRfREVWSUNFKFVTQl9ERVZJQ0VfSURfQVBQTEVfV0VMTFNQUklORzRBX0FOU0kpLAorCUJDTTU5NzRfREVWSUNFKFVTQl9ERVZJQ0VfSURfQVBQTEVfV0VMTFNQUklORzRBX0lTTyksCisJQkNNNTk3NF9ERVZJQ0UoVVNCX0RFVklDRV9JRF9BUFBMRV9XRUxMU1BSSU5HNEFfSklTKSwKIAkvKiBUZXJtaW5hdGluZyBlbnRyeSAqLwogCXt9CiB9OwpAQCAtMjM0LDYgKzI1MCwzMCBAQAogCQl7IERJTV9YLCBESU1fWCAvIFNOX0NPT1JELCAtNDQ2MCwgNTE2NiB9LAogCQl7IERJTV9ZLCBESU1fWSAvIFNOX0NPT1JELCAtNzUsIDY3MDAgfQogCX0sCisJeworCQlVU0JfREVWSUNFX0lEX0FQUExFX1dFTExTUFJJTkc0X0FOU0ksCisJCVVTQl9ERVZJQ0VfSURfQVBQTEVfV0VMTFNQUklORzRfSVNPLAorCQlVU0JfREVWSUNFX0lEX0FQUExFX1dFTExTUFJJTkc0X0pJUywKKwkJSEFTX0lOVEVHUkFURURfQlVUVE9OLAorCQkweDg0LCBzaXplb2Yoc3RydWN0IGJ0X2RhdGEpLAorCQkweDgxLCBUWVBFMiwgRklOR0VSX1RZUEUyLCBGSU5HRVJfVFlQRTIgKyBTSVpFT0ZfQUxMX0ZJTkdFUlMsCisJCXsgRElNX1BSRVNTVVJFLCBESU1fUFJFU1NVUkUgLyBTTl9QUkVTU1VSRSwgMCwgMzAwIH0sCisJCXsgRElNX1dJRFRILCBESU1fV0lEVEggLyBTTl9XSURUSCwgMCwgMjA0OCB9LAorCQl7IERJTV9YLCBESU1fWCAvIFNOX0NPT1JELCAtNDYyMCwgNTE0MCB9LAorCQl7IERJTV9ZLCBESU1fWSAvIFNOX0NPT1JELCAtMTUwLCA2NjAwIH0KKwl9LAorCXsKKwkJVVNCX0RFVklDRV9JRF9BUFBMRV9XRUxMU1BSSU5HNEFfQU5TSSwKKwkJVVNCX0RFVklDRV9JRF9BUFBMRV9XRUxMU1BSSU5HNEFfSVNPLAorCQlVU0JfREVWSUNFX0lEX0FQUExFX1dFTExTUFJJTkc0QV9KSVMsCisJCUhBU19JTlRFR1JBVEVEX0JVVFRPTiwKKwkJMHg4NCwgc2l6ZW9mKHN0cnVjdCBidF9kYXRhKSwKKwkJMHg4MSwgVFlQRTIsIEZJTkdFUl9UWVBFMiwgRklOR0VSX1RZUEUyICsgU0laRU9GX0FMTF9GSU5HRVJTLAorCQl7IERJTV9QUkVTU1VSRSwgRElNX1BSRVNTVVJFIC8gU05fUFJFU1NVUkUsIDAsIDMwMCB9LAorCQl7IERJTV9XSURUSCwgRElNX1dJRFRIIC8gU05fV0lEVEgsIDAsIDIwNDggfSwKKwkJeyBESU1fWCwgRElNX1ggLyBTTl9DT09SRCwgLTQ2MTYsIDUxMTIgfSwKKwkJeyBESU1fWSwgRElNX1kgLyBTTl9DT09SRCwgLTE0MiwgNTIzNCB9CisJfSwKIAl7fQogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tYWNpbnRvc2gvbWFjaW9fYXNpYy5jIGIvZHJpdmVycy9tYWNpbnRvc2gvbWFjaW9fYXNpYy5jCmluZGV4IGI2ZTdkZGMuLjRkYWY5ZTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWFjaW50b3NoL21hY2lvX2FzaWMuYworKysgYi9kcml2ZXJzL21hY2ludG9zaC9tYWNpb19hc2ljLmMKQEAgLTM4NywxMSArMzg3LDEwIEBACiAJLyogU2V0IHRoZSBETUEgb3BzIHRvIHRoZSBvbmVzIGZyb20gdGhlIFBDSSBkZXZpY2UsIHRoaXMgY291bGQgYmUKIAkgKiBmaXNoeSBpZiB3ZSBkaWRuJ3Qga25vdyB0aGF0IG9uIFBvd2VyTWFjIGl0J3MgYWx3YXlzIGRpcmVjdCBvcHMKIAkgKiBvciBpb21tdSBvcHMgdGhhdCB3aWxsIHdvcmsgZmluZQorCSAqCisJICogVG8gZ2V0IGFsbCB0aGUgZmllbGRzLCBjb3B5IGFsbCBhcmNoZGF0YQogCSAqLwotCWRldi0+b2ZkZXYuZGV2LmFyY2hkYXRhLmRtYV9vcHMgPQotCQljaGlwLT5sYnVzLnBkZXYtPmRldi5hcmNoZGF0YS5kbWFfb3BzOwotCWRldi0+b2ZkZXYuZGV2LmFyY2hkYXRhLmRtYV9kYXRhID0KLQkJY2hpcC0+bGJ1cy5wZGV2LT5kZXYuYXJjaGRhdGEuZG1hX2RhdGE7CisJZGV2LT5vZmRldi5kZXYuYXJjaGRhdGEgPSBjaGlwLT5sYnVzLnBkZXYtPmRldi5hcmNoZGF0YTsKICNlbmRpZiAvKiBDT05GSUdfUENJICovCiAKICNpZmRlZiBERUJVRwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tYWNpbnRvc2gvdGhlcm1fcG03Mi5jIGIvZHJpdmVycy9tYWNpbnRvc2gvdGhlcm1fcG03Mi5jCmluZGV4IDQ0NTQ5MjcuLjJlMDQxZmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWFjaW50b3NoL3RoZXJtX3BtNzIuYworKysgYi9kcml2ZXJzL21hY2ludG9zaC90aGVybV9wbTcyLmMKQEAgLTIyMTMsNiArMjIxMyw5IEBACiBzdGF0aWMgaW50IGZjdV9vZl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlKiBkZXYsIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoKQogewogCXN0YXRlID0gc3RhdGVfZGV0YWNoZWQ7CisJb2ZfZGV2ID0gZGV2OworCisJZGV2X2luZm8oJmRldi0+ZGV2LCAiUG93ZXJNYWMgRzUgVGhlcm1hbCBjb250cm9sIGRyaXZlciAlc1xuIiwgVkVSU0lPTik7CiAKIAkvKiBMb29rdXAgdGhlIGZhbnMgaW4gdGhlIGRldmljZSB0cmVlICovCiAJZmN1X2xvb2t1cF9mYW5zKGRldi0+ZGV2Lm9mX25vZGUpOwpAQCAtMjIzNSw2ICsyMjM4LDcgQEAKIAl9LAogCXt9LAogfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIGZjdV9tYXRjaCk7CiAKIHN0YXRpYyBzdHJ1Y3Qgb2ZfcGxhdGZvcm1fZHJpdmVyIGZjdV9vZl9wbGF0Zm9ybV9kcml2ZXIgPSAKIHsKQEAgLTIyNTIsOCArMjI1Niw2IEBACiAgKi8KIHN0YXRpYyBpbnQgX19pbml0IHRoZXJtX3BtNzJfaW5pdCh2b2lkKQogewotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7Ci0KIAlyYWNrbWFjID0gb2ZfbWFjaGluZV9pc19jb21wYXRpYmxlKCJSYWNrTWFjMywxIik7CiAKIAlpZiAoIW9mX21hY2hpbmVfaXNfY29tcGF0aWJsZSgiUG93ZXJNYWM3LDIiKSAmJgpAQCAtMjI2MSwzNCArMjI2MywxMiBAQAogCSAgICAhcmFja21hYykKIAkgICAgCXJldHVybiAtRU5PREVWOwogCi0JcHJpbnRrKEtFUk5fSU5GTyAiUG93ZXJNYWMgRzUgVGhlcm1hbCBjb250cm9sIGRyaXZlciAlc1xuIiwgVkVSU0lPTik7Ci0KLQlucCA9IG9mX2ZpbmRfbm9kZV9ieV90eXBlKE5VTEwsICJmY3UiKTsKLQlpZiAobnAgPT0gTlVMTCkgewotCQkvKiBTb21lIG1hY2hpbmVzIGhhdmUgc3RyYW5nZWx5IGJyb2tlbiBkZXZpY2UtdHJlZSAqLwotCQlucCA9IG9mX2ZpbmRfbm9kZV9ieV9wYXRoKCIvdTNAMCxmODAwMDAwMC9pMmNAZjgwMDEwMDAvZmFuQDE1ZSIpOwotCQlpZiAobnAgPT0gTlVMTCkgewotCQkJICAgIHByaW50ayhLRVJOX0VSUiAiQ2FuJ3QgZmluZCBGQ1UgaW4gZGV2aWNlLXRyZWUgIVxuIik7Ci0JCQkgICAgcmV0dXJuIC1FTk9ERVY7Ci0JCX0KLQl9Ci0Jb2ZfZGV2ID0gb2ZfcGxhdGZvcm1fZGV2aWNlX2NyZWF0ZShucCwgInRlbXBlcmF0dXJlIiwgTlVMTCk7Ci0JaWYgKG9mX2RldiA9PSBOVUxMKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiQ2FuJ3QgcmVnaXN0ZXIgRkNVIHBsYXRmb3JtIGRldmljZSAhXG4iKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCi0Jb2ZfcmVnaXN0ZXJfcGxhdGZvcm1fZHJpdmVyKCZmY3Vfb2ZfcGxhdGZvcm1fZHJpdmVyKTsKLQkKLQlyZXR1cm4gMDsKKwlyZXR1cm4gb2ZfcmVnaXN0ZXJfcGxhdGZvcm1fZHJpdmVyKCZmY3Vfb2ZfcGxhdGZvcm1fZHJpdmVyKTsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IHRoZXJtX3BtNzJfZXhpdCh2b2lkKQogewogCW9mX3VucmVnaXN0ZXJfcGxhdGZvcm1fZHJpdmVyKCZmY3Vfb2ZfcGxhdGZvcm1fZHJpdmVyKTsKLQotCWlmIChvZl9kZXYpCi0JCW9mX2RldmljZV91bnJlZ2lzdGVyKG9mX2Rldik7CiB9CiAKIG1vZHVsZV9pbml0KHRoZXJtX3BtNzJfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC9zaF9tb2JpbGVfc2RoaS5jIGIvZHJpdmVycy9tZmQvc2hfbW9iaWxlX3NkaGkuYwppbmRleCBmMTcxNGY5Li4wYTdkZjQ0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21mZC9zaF9tb2JpbGVfc2RoaS5jCisrKyBiL2RyaXZlcnMvbWZkL3NoX21vYmlsZV9zZGhpLmMKQEAgLTEzMSwxMSArMTMxLDE3IEBACiAJICovCiAJbW1jX2RhdGEtPmZsYWdzIHw9IFRNSU9fTU1DX0JMS1NaXzJCWVRFUzsKIAorCS8qCisJICogQWxsIFNESEkgYmxvY2tzIHN1cHBvcnQgU0RJTyBJUlEgc2lnbmFsbGluZy4KKwkgKi8KKwltbWNfZGF0YS0+ZmxhZ3MgfD0gVE1JT19NTUNfU0RJT19JUlE7CisKIAlpZiAocCAmJiBwLT5kbWFfc2xhdmVfdHggPj0gMCAmJiBwLT5kbWFfc2xhdmVfcnggPj0gMCkgewogCQlwcml2LT5wYXJhbV90eC5zbGF2ZV9pZCA9IHAtPmRtYV9zbGF2ZV90eDsKIAkJcHJpdi0+cGFyYW1fcnguc2xhdmVfaWQgPSBwLT5kbWFfc2xhdmVfcng7CiAJCXByaXYtPmRtYV9wcml2LmNoYW5fcHJpdl90eCA9ICZwcml2LT5wYXJhbV90eDsKIAkJcHJpdi0+ZG1hX3ByaXYuY2hhbl9wcml2X3J4ID0gJnByaXYtPnBhcmFtX3J4OworCQlwcml2LT5kbWFfcHJpdi5hbGlnbm1lbnRfc2hpZnQgPSAxOyAvKiAyLWJ5dGUgYWxpZ25tZW50ICovCiAJCW1tY19kYXRhLT5kbWEgPSAmcHJpdi0+ZG1hX3ByaXY7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvZWVwcm9tL2F0MjQuYyBiL2RyaXZlcnMvbWlzYy9lZXByb20vYXQyNC5jCmluZGV4IDU1OWIwYjMuLmFiMWFkNDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9lZXByb20vYXQyNC5jCisrKyBiL2RyaXZlcnMvbWlzYy9lZXByb20vYXQyNC5jCkBAIC0yMCw2ICsyMCw3IEBACiAjaW5jbHVkZSA8bGludXgvbG9nMi5oPgogI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgogI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy9hdDI0Lmg+CiAKQEAgLTQ1Nyw2ICs0NTgsMjcgQEAKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAorI2lmZGVmIENPTkZJR19PRgorc3RhdGljIHZvaWQgYXQyNF9nZXRfb2ZkYXRhKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJCXN0cnVjdCBhdDI0X3BsYXRmb3JtX2RhdGEgKmNoaXApCit7CisJY29uc3QgX19iZTMyICp2YWw7CisJc3RydWN0IGRldmljZV9ub2RlICpub2RlID0gY2xpZW50LT5kZXYub2Zfbm9kZTsKKworCWlmIChub2RlKSB7CisJCWlmIChvZl9nZXRfcHJvcGVydHkobm9kZSwgInJlYWQtb25seSIsIE5VTEwpKQorCQkJY2hpcC0+ZmxhZ3MgfD0gQVQyNF9GTEFHX1JFQURPTkxZOworCQl2YWwgPSBvZl9nZXRfcHJvcGVydHkobm9kZSwgInBhZ2VzaXplIiwgTlVMTCk7CisJCWlmICh2YWwpCisJCQljaGlwLT5wYWdlX3NpemUgPSBiZTMyX3RvX2NwdXAodmFsKTsKKwl9Cit9CisjZWxzZQorc3RhdGljIHZvaWQgYXQyNF9nZXRfb2ZkYXRhKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJCXN0cnVjdCBhdDI0X3BsYXRmb3JtX2RhdGEgKmNoaXApCit7IH0KKyNlbmRpZiAvKiBDT05GSUdfT0YgKi8KKwogc3RhdGljIGludCBhdDI0X3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKIHsKIAlzdHJ1Y3QgYXQyNF9wbGF0Zm9ybV9kYXRhIGNoaXA7CkBAIC00ODUsNiArNTA3LDkgQEAKIAkJICovCiAJCWNoaXAucGFnZV9zaXplID0gMTsKIAorCQkvKiB1cGRhdGUgY2hpcGRhdGEgaWYgT0YgaXMgcHJlc2VudCAqLworCQlhdDI0X2dldF9vZmRhdGEoY2xpZW50LCAmY2hpcCk7CisKIAkJY2hpcC5zZXR1cCA9IE5VTEw7CiAJCWNoaXAuY29udGV4dCA9IE5VTEw7CiAJfQpAQCAtNDkyLDYgKzUxNywxMSBAQAogCWlmICghaXNfcG93ZXJfb2ZfMihjaGlwLmJ5dGVfbGVuKSkKIAkJZGV2X3dhcm4oJmNsaWVudC0+ZGV2LAogCQkJImJ5dGVfbGVuIGxvb2tzIHN1c3BpY2lvdXMgKG5vIHBvd2VyIG9mIDIpIVxuIik7CisJaWYgKCFjaGlwLnBhZ2Vfc2l6ZSkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgInBhZ2Vfc2l6ZSBtdXN0IG5vdCBiZSAwIVxuIik7CisJCWVyciA9IC1FSU5WQUw7CisJCWdvdG8gZXJyX291dDsKKwl9CiAJaWYgKCFpc19wb3dlcl9vZl8yKGNoaXAucGFnZV9zaXplKSkKIAkJZGV2X3dhcm4oJmNsaWVudC0+ZGV2LAogCQkJInBhZ2Vfc2l6ZSBsb29rcyBzdXNwaWNpb3VzIChubyBwb3dlciBvZiAyKSFcbiIpOwpAQCAtNTk3LDE5ICs2MjcsMTUgQEAKIAogCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIGF0MjQpOwogCi0JZGV2X2luZm8oJmNsaWVudC0+ZGV2LCAiJXp1IGJ5dGUgJXMgRUVQUk9NICVzXG4iLAorCWRldl9pbmZvKCZjbGllbnQtPmRldiwgIiV6dSBieXRlICVzIEVFUFJPTSwgJXMsICV1IGJ5dGVzL3dyaXRlXG4iLAogCQlhdDI0LT5iaW4uc2l6ZSwgY2xpZW50LT5uYW1lLAotCQl3cml0YWJsZSA/ICIod3JpdGFibGUpIiA6ICIocmVhZC1vbmx5KSIpOworCQl3cml0YWJsZSA/ICJ3cml0YWJsZSIgOiAicmVhZC1vbmx5IiwgYXQyNC0+d3JpdGVfbWF4KTsKIAlpZiAodXNlX3NtYnVzID09IEkyQ19TTUJVU19XT1JEX0RBVEEgfHwKIAkgICAgdXNlX3NtYnVzID09IEkyQ19TTUJVU19CWVRFX0RBVEEpIHsKIAkJZGV2X25vdGljZSgmY2xpZW50LT5kZXYsICJGYWxsaW5nIGJhY2sgdG8gJXMgcmVhZHMsICIKIAkJCSAgICJwZXJmb3JtYW5jZSB3aWxsIHN1ZmZlclxuIiwgdXNlX3NtYnVzID09CiAJCQkgICBJMkNfU01CVVNfV09SRF9EQVRBID8gIndvcmQiIDogImJ5dGUiKTsKIAl9Ci0JZGV2X2RiZygmY2xpZW50LT5kZXYsCi0JCSJwYWdlX3NpemUgJWQsIG51bV9hZGRyZXNzZXMgJWQsIHdyaXRlX21heCAlZCwgdXNlX3NtYnVzICVkXG4iLAotCQljaGlwLnBhZ2Vfc2l6ZSwgbnVtX2FkZHJlc3NlcywKLQkJYXQyNC0+d3JpdGVfbWF4LCB1c2Vfc21idXMpOwogCiAJLyogZXhwb3J0IGRhdGEgdG8ga2VybmVsIGNvZGUgKi8KIAlpZiAoY2hpcC5zZXR1cCkKQEAgLTY2MCw2ICs2ODYsMTEgQEAKIAogc3RhdGljIGludCBfX2luaXQgYXQyNF9pbml0KHZvaWQpCiB7CisJaWYgKCFpb19saW1pdCkgeworCQlwcl9lcnIoImF0MjQ6IGlvX2xpbWl0IG11c3Qgbm90IGJlIDAhXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCiAJaW9fbGltaXQgPSByb3VuZGRvd25fcG93X29mX3R3byhpb19saW1pdCk7CiAJcmV0dXJuIGkyY19hZGRfZHJpdmVyKCZhdDI0X2RyaXZlcik7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9jYXJkL0tjb25maWcgYi9kcml2ZXJzL21tYy9jYXJkL0tjb25maWcKaW5kZXggNTdlNDQxNi4uMmE4NzZjNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvY2FyZC9LY29uZmlnCisrKyBiL2RyaXZlcnMvbW1jL2NhcmQvS2NvbmZpZwpAQCAtMTYsNiArMTYsNyBAQAogCiBjb25maWcgTU1DX0JMT0NLX01JTk9SUwogCWludCAiTnVtYmVyIG9mIG1pbm9ycyBwZXIgYmxvY2sgZGV2aWNlIgorCWRlcGVuZHMgb24gTU1DX0JMT0NLCiAJcmFuZ2UgNCAyNTYKIAlkZWZhdWx0IDgKIAloZWxwCmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9jb3JlL0tjb25maWcgYi9kcml2ZXJzL21tYy9jb3JlL0tjb25maWcKaW5kZXggYmIyMmZmZC4uZWYxMDM4NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvY29yZS9LY29uZmlnCisrKyBiL2RyaXZlcnMvbW1jL2NvcmUvS2NvbmZpZwpAQCAtMTYsMyArMTYsMTQgQEAKIAogCSAgVGhpcyBvcHRpb24gc2V0cyBhIGRlZmF1bHQgd2hpY2ggY2FuIGJlIG92ZXJyaWRkZW4gYnkgdGhlCiAJICBtb2R1bGUgcGFyYW1ldGVyICJyZW1vdmFibGU9MCIgb3IgInJlbW92YWJsZT0xIi4KKworY29uZmlnIE1NQ19DTEtHQVRFCisJYm9vbCAiTU1DIGhvc3QgY2xvY2sgZ2F0aW5nIChFWFBFUklNRU5UQUwpIgorCWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMCisJaGVscAorCSAgVGhpcyB3aWxsIGF0dGVtcHQgdG8gYWdncmVzc2l2ZWx5IGdhdGUgdGhlIGNsb2NrIHRvIHRoZSBNTUMgY2FyZC4KKwkgIFRoaXMgaXMgZG9uZSB0byBzYXZlIHBvd2VyIGR1ZSB0byBnYXRpbmcgb2ZmIHRoZSBsb2dpYyBhbmQgYnVzCisJICBub2lzZSB3aGVuIHRoZSBNTUMgY2FyZCBpcyBub3QgaW4gdXNlLiBZb3VyIGhvc3QgZHJpdmVyIGhhcyB0bworCSAgc3VwcG9ydCBoYW5kbGluZyB0aGlzIGluIG9yZGVyIGZvciBpdCB0byBiZSBvZiBhbnkgdXNlLgorCisJICBJZiB1bnN1cmUsIHNheSBOLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvY29yZS9idXMuYyBiL2RyaXZlcnMvbW1jL2NvcmUvYnVzLmMKaW5kZXggYWY4ZGM2YS4uNjM2NjdhOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvY29yZS9idXMuYworKysgYi9kcml2ZXJzL21tYy9jb3JlL2J1cy5jCkBAIC0zMDMsMTQgKzMwMywxNCBAQAogCQkJdHlwZSwgY2FyZC0+cmNhKTsKIAl9CiAKLQlyZXQgPSBkZXZpY2VfYWRkKCZjYXJkLT5kZXYpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KICNpZmRlZiBDT05GSUdfREVCVUdfRlMKIAltbWNfYWRkX2NhcmRfZGVidWdmcyhjYXJkKTsKICNlbmRpZgogCisJcmV0ID0gZGV2aWNlX2FkZCgmY2FyZC0+ZGV2KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCiAJbW1jX2NhcmRfc2V0X3ByZXNlbnQoY2FyZCk7CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2NvcmUvY29yZS5jIGIvZHJpdmVycy9tbWMvY29yZS9jb3JlLmMKaW5kZXggYTNhNzgwZi4uNjYyNWMwNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvY29yZS9jb3JlLmMKKysrIGIvZHJpdmVycy9tbWMvY29yZS9jb3JlLmMKQEAgLTIyLDYgKzIyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zY2F0dGVybGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L2xvZzIuaD4KICNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvY29uc3VtZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9wbV9ydW50aW1lLmg+CiAKICNpbmNsdWRlIDxsaW51eC9tbWMvY2FyZC5oPgogI2luY2x1ZGUgPGxpbnV4L21tYy9ob3N0Lmg+CkBAIC0xMzAsNiArMTMxLDggQEAKIAogCQlpZiAobXJxLT5kb25lKQogCQkJbXJxLT5kb25lKG1ycSk7CisKKwkJbW1jX2hvc3RfY2xrX2dhdGUoaG9zdCk7CiAJfQogfQogCkBAIC0xOTAsNiArMTkzLDcgQEAKIAkJCW1ycS0+c3RvcC0+bXJxID0gbXJxOwogCQl9CiAJfQorCW1tY19ob3N0X2Nsa191bmdhdGUoaG9zdCk7CiAJaG9zdC0+b3BzLT5yZXF1ZXN0KGhvc3QsIG1ycSk7CiB9CiAKQEAgLTI5NSw4ICsyOTksOSBAQAogCQl1bnNpZ25lZCBpbnQgdGltZW91dF91cywgbGltaXRfdXM7CiAKIAkJdGltZW91dF91cyA9IGRhdGEtPnRpbWVvdXRfbnMgLyAxMDAwOwotCQl0aW1lb3V0X3VzICs9IGRhdGEtPnRpbWVvdXRfY2xrcyAqIDEwMDAgLwotCQkJKGNhcmQtPmhvc3QtPmlvcy5jbG9jayAvIDEwMDApOworCQlpZiAobW1jX2hvc3RfY2xrX3JhdGUoY2FyZC0+aG9zdCkpCisJCQl0aW1lb3V0X3VzICs9IGRhdGEtPnRpbWVvdXRfY2xrcyAqIDEwMDAgLworCQkJCShtbWNfaG9zdF9jbGtfcmF0ZShjYXJkLT5ob3N0KSAvIDEwMDApOwogCiAJCWlmIChkYXRhLT5mbGFncyAmIE1NQ19EQVRBX1dSSVRFKQogCQkJLyoKQEAgLTYxNCw2ICs2MTksOCBAQAogCQkgaW9zLT5wb3dlcl9tb2RlLCBpb3MtPmNoaXBfc2VsZWN0LCBpb3MtPnZkZCwKIAkJIGlvcy0+YnVzX3dpZHRoLCBpb3MtPnRpbWluZyk7CiAKKwlpZiAoaW9zLT5jbG9jayA+IDApCisJCW1tY19zZXRfdW5nYXRlZChob3N0KTsKIAlob3N0LT5vcHMtPnNldF9pb3MoaG9zdCwgaW9zKTsKIH0KIApAQCAtNjQxLDYgKzY0OCw2MSBAQAogCW1tY19zZXRfaW9zKGhvc3QpOwogfQogCisjaWZkZWYgQ09ORklHX01NQ19DTEtHQVRFCisvKgorICogVGhpcyBnYXRlcyB0aGUgY2xvY2sgYnkgc2V0dGluZyBpdCB0byAwIEh6LgorICovCit2b2lkIG1tY19nYXRlX2Nsb2NrKHN0cnVjdCBtbWNfaG9zdCAqaG9zdCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmhvc3QtPmNsa19sb2NrLCBmbGFncyk7CisJaG9zdC0+Y2xrX29sZCA9IGhvc3QtPmlvcy5jbG9jazsKKwlob3N0LT5pb3MuY2xvY2sgPSAwOworCWhvc3QtPmNsa19nYXRlZCA9IHRydWU7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaG9zdC0+Y2xrX2xvY2ssIGZsYWdzKTsKKwltbWNfc2V0X2lvcyhob3N0KTsKK30KKworLyoKKyAqIFRoaXMgcmVzdG9yZXMgdGhlIGNsb2NrIGZyb20gZ2F0aW5nIGJ5IHVzaW5nIHRoZSBjYWNoZWQKKyAqIGNsb2NrIHZhbHVlLgorICovCit2b2lkIG1tY191bmdhdGVfY2xvY2soc3RydWN0IG1tY19ob3N0ICpob3N0KQoreworCS8qCisJICogV2Ugc2hvdWxkIHByZXZpb3VzbHkgaGF2ZSBnYXRlZCB0aGUgY2xvY2ssIHNvIHRoZSBjbG9jayBzaGFsbAorCSAqIGJlIDAgaGVyZSEgVGhlIGNsb2NrIG1heSBob3dldmVyIGJlIDAgZHVyaW5nIGluaXRpYWxpemF0aW9uLAorCSAqIHdoZW4gc29tZSByZXF1ZXN0IG9wZXJhdGlvbnMgYXJlIHBlcmZvcm1lZCBiZWZvcmUgc2V0dGluZworCSAqIHRoZSBmcmVxdWVuY3kuIFdoZW4gdW5nYXRlIGlzIHJlcXVlc3RlZCBpbiB0aGF0IHNpdHVhdGlvbgorCSAqIHdlIGp1c3QgaWdub3JlIHRoZSBjYWxsLgorCSAqLworCWlmIChob3N0LT5jbGtfb2xkKSB7CisJCUJVR19PTihob3N0LT5pb3MuY2xvY2spOworCQkvKiBUaGlzIGNhbGwgd2lsbCBhbHNvIHNldCBob3N0LT5jbGtfZ2F0ZWQgdG8gZmFsc2UgKi8KKwkJbW1jX3NldF9jbG9jayhob3N0LCBob3N0LT5jbGtfb2xkKTsKKwl9Cit9CisKK3ZvaWQgbW1jX3NldF91bmdhdGVkKHN0cnVjdCBtbWNfaG9zdCAqaG9zdCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyoKKwkgKiBXZSd2ZSBiZWVuIGdpdmVuIGEgbmV3IGZyZXF1ZW5jeSB3aGlsZSB0aGUgY2xvY2sgaXMgZ2F0ZWQsCisJICogc28gbWFrZSBzdXJlIHdlIHJlZ2FyZCB0aGlzIGFzIHVuZ2F0aW5nIGl0LgorCSAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZob3N0LT5jbGtfbG9jaywgZmxhZ3MpOworCWhvc3QtPmNsa19nYXRlZCA9IGZhbHNlOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhvc3QtPmNsa19sb2NrLCBmbGFncyk7Cit9CisKKyNlbHNlCit2b2lkIG1tY19zZXRfdW5nYXRlZChzdHJ1Y3QgbW1jX2hvc3QgKmhvc3QpCit7Cit9CisjZW5kaWYKKwogLyoKICAqIENoYW5nZSB0aGUgYnVzIG1vZGUgKG9wZW4gZHJhaW4vcHVzaC1wdWxsKSBvZiBhIGhvc3QuCiAgKi8KQEAgLTE0MjQsMzUgKzE0ODYsNTcgQEAKIH0KIEVYUE9SVF9TWU1CT0wobW1jX3NldF9ibG9ja2xlbik7CiAKK3N0YXRpYyBpbnQgbW1jX3Jlc2Nhbl90cnlfZnJlcShzdHJ1Y3QgbW1jX2hvc3QgKmhvc3QsIHVuc2lnbmVkIGZyZXEpCit7CisJaG9zdC0+Zl9pbml0ID0gZnJlcTsKKworI2lmZGVmIENPTkZJR19NTUNfREVCVUcKKwlwcl9pbmZvKCIlczogJXM6IHRyeWluZyB0byBpbml0IGNhcmQgYXQgJXUgSHpcbiIsCisJCW1tY19ob3N0bmFtZShob3N0KSwgX19mdW5jX18sIGhvc3QtPmZfaW5pdCk7CisjZW5kaWYKKwltbWNfcG93ZXJfdXAoaG9zdCk7CisJc2Rpb19yZXNldChob3N0KTsKKwltbWNfZ29faWRsZShob3N0KTsKKworCW1tY19zZW5kX2lmX2NvbmQoaG9zdCwgaG9zdC0+b2NyX2F2YWlsKTsKKworCS8qIE9yZGVyJ3MgaW1wb3J0YW50OiBwcm9iZSBTRElPLCB0aGVuIFNELCB0aGVuIE1NQyAqLworCWlmICghbW1jX2F0dGFjaF9zZGlvKGhvc3QpKQorCQlyZXR1cm4gMDsKKwlpZiAoIW1tY19hdHRhY2hfc2QoaG9zdCkpCisJCXJldHVybiAwOworCWlmICghbW1jX2F0dGFjaF9tbWMoaG9zdCkpCisJCXJldHVybiAwOworCisJbW1jX3Bvd2VyX29mZihob3N0KTsKKwlyZXR1cm4gLUVJTzsKK30KKwogdm9pZCBtbWNfcmVzY2FuKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKKwlzdGF0aWMgY29uc3QgdW5zaWduZWQgZnJlcXNbXSA9IHsgNDAwMDAwLCAzMDAwMDAsIDIwMDAwMCwgMTAwMDAwIH07CiAJc3RydWN0IG1tY19ob3N0ICpob3N0ID0KIAkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBtbWNfaG9zdCwgZGV0ZWN0LndvcmspOwotCXUzMiBvY3I7Ci0JaW50IGVycjsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCBpOwotCWNvbnN0IHVuc2lnbmVkIGZyZXFzW10gPSB7IDQwMDAwMCwgMzAwMDAwLCAyMDAwMDAsIDEwMDAwMCB9OwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmhvc3QtPmxvY2ssIGZsYWdzKTsKLQotCWlmIChob3N0LT5yZXNjYW5fZGlzYWJsZSkgewotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZob3N0LT5sb2NrLCBmbGFncyk7CisJaWYgKGhvc3QtPnJlc2Nhbl9kaXNhYmxlKQogCQlyZXR1cm47Ci0JfQotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaG9zdC0+bG9jaywgZmxhZ3MpOwotCiAKIAltbWNfYnVzX2dldChob3N0KTsKIAotCS8qIGlmIHRoZXJlIGlzIGEgY2FyZCByZWdpc3RlcmVkLCBjaGVjayB3aGV0aGVyIGl0IGlzIHN0aWxsIHByZXNlbnQgKi8KLQlpZiAoKGhvc3QtPmJ1c19vcHMgIT0gTlVMTCkgJiYgaG9zdC0+YnVzX29wcy0+ZGV0ZWN0ICYmICFob3N0LT5idXNfZGVhZCkKKwkvKgorCSAqIGlmIHRoZXJlIGlzIGEgX3JlbW92YWJsZV8gY2FyZCByZWdpc3RlcmVkLCBjaGVjayB3aGV0aGVyIGl0IGlzCisJICogc3RpbGwgcHJlc2VudAorCSAqLworCWlmIChob3N0LT5idXNfb3BzICYmIGhvc3QtPmJ1c19vcHMtPmRldGVjdCAmJiAhaG9zdC0+YnVzX2RlYWQKKwkgICAgJiYgbW1jX2NhcmRfaXNfcmVtb3ZhYmxlKGhvc3QpKQogCQlob3N0LT5idXNfb3BzLT5kZXRlY3QoaG9zdCk7CiAKKwkvKgorCSAqIExldCBtbWNfYnVzX3B1dCgpIGZyZWUgdGhlIGJ1cy9idXNfb3BzIGlmIHdlJ3ZlIGZvdW5kIHRoYXQKKwkgKiB0aGUgY2FyZCBpcyBubyBsb25nZXIgcHJlc2VudC4KKwkgKi8KIAltbWNfYnVzX3B1dChob3N0KTsKLQotCiAJbW1jX2J1c19nZXQoaG9zdCk7CiAKIAkvKiBpZiB0aGVyZSBzdGlsbCBpcyBhIGNhcmQgcHJlc2VudCwgc3RvcCBoZXJlICovCkBAIC0xNDYxLDggKzE1NDUsNiBAQAogCQlnb3RvIG91dDsKIAl9CiAKLQkvKiBkZXRlY3QgYSBuZXdseSBpbnNlcnRlZCBjYXJkICovCi0KIAkvKgogCSAqIE9ubHkgd2UgY2FuIGFkZCBhIG5ldyBoYW5kbGVyLCBzbyBpdCdzIHNhZmUgdG8KIAkgKiByZWxlYXNlIHRoZSBsb2NrIGhlcmUuCkBAIC0xNDcyLDcyICsxNTU0LDE2IEBACiAJaWYgKGhvc3QtPm9wcy0+Z2V0X2NkICYmIGhvc3QtPm9wcy0+Z2V0X2NkKGhvc3QpID09IDApCiAJCWdvdG8gb3V0OwogCisJbW1jX2NsYWltX2hvc3QoaG9zdCk7CiAJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZnJlcXMpOyBpKyspIHsKLQkJbW1jX2NsYWltX2hvc3QoaG9zdCk7Ci0KLQkJaWYgKGZyZXFzW2ldID49IGhvc3QtPmZfbWluKQotCQkJaG9zdC0+Zl9pbml0ID0gZnJlcXNbaV07Ci0JCWVsc2UgaWYgKCFpIHx8IGZyZXFzW2ktMV0gPiBob3N0LT5mX21pbikKLQkJCWhvc3QtPmZfaW5pdCA9IGhvc3QtPmZfbWluOwotCQllbHNlIHsKLQkJCW1tY19yZWxlYXNlX2hvc3QoaG9zdCk7Ci0JCQlnb3RvIG91dDsKLQkJfQotI2lmZGVmIENPTkZJR19NTUNfREVCVUcKLQkJcHJfaW5mbygiJXM6ICVzOiB0cnlpbmcgdG8gaW5pdCBjYXJkIGF0ICV1IEh6XG4iLAotCQkJbW1jX2hvc3RuYW1lKGhvc3QpLCBfX2Z1bmNfXywgaG9zdC0+Zl9pbml0KTsKLSNlbmRpZgotCQltbWNfcG93ZXJfdXAoaG9zdCk7Ci0JCXNkaW9fcmVzZXQoaG9zdCk7Ci0JCW1tY19nb19pZGxlKGhvc3QpOwotCi0JCW1tY19zZW5kX2lmX2NvbmQoaG9zdCwgaG9zdC0+b2NyX2F2YWlsKTsKLQotCQkvKgotCQkgKiBGaXJzdCB3ZSBzZWFyY2ggZm9yIFNESU8uLi4KLQkJICovCi0JCWVyciA9IG1tY19zZW5kX2lvX29wX2NvbmQoaG9zdCwgMCwgJm9jcik7Ci0JCWlmICghZXJyKSB7Ci0JCQlpZiAobW1jX2F0dGFjaF9zZGlvKGhvc3QsIG9jcikpIHsKLQkJCQltbWNfY2xhaW1faG9zdChob3N0KTsKLQkJCQkvKgotCQkJCSAqIFRyeSBTRE1FTSAoYnV0IG5vdCBNTUMpIGV2ZW4gaWYgU0RJTwotCQkJCSAqIGlzIGJyb2tlbi4KLQkJCQkgKi8KLQkJCQlpZiAobW1jX3NlbmRfYXBwX29wX2NvbmQoaG9zdCwgMCwgJm9jcikpCi0JCQkJCWdvdG8gb3V0X2ZhaWw7Ci0KLQkJCQlpZiAobW1jX2F0dGFjaF9zZChob3N0LCBvY3IpKQotCQkJCQltbWNfcG93ZXJfb2ZmKGhvc3QpOwotCQkJfQotCQkJZ290byBvdXQ7Ci0JCX0KLQotCQkvKgotCQkgKiAuLi50aGVuIG5vcm1hbCBTRC4uLgotCQkgKi8KLQkJZXJyID0gbW1jX3NlbmRfYXBwX29wX2NvbmQoaG9zdCwgMCwgJm9jcik7Ci0JCWlmICghZXJyKSB7Ci0JCQlpZiAobW1jX2F0dGFjaF9zZChob3N0LCBvY3IpKQotCQkJCW1tY19wb3dlcl9vZmYoaG9zdCk7Ci0JCQlnb3RvIG91dDsKLQkJfQotCi0JCS8qCi0JCSAqIC4uLmFuZCBmaW5hbGx5IE1NQy4KLQkJICovCi0JCWVyciA9IG1tY19zZW5kX29wX2NvbmQoaG9zdCwgMCwgJm9jcik7Ci0JCWlmICghZXJyKSB7Ci0JCQlpZiAobW1jX2F0dGFjaF9tbWMoaG9zdCwgb2NyKSkKLQkJCQltbWNfcG93ZXJfb2ZmKGhvc3QpOwotCQkJZ290byBvdXQ7Ci0JCX0KLQotb3V0X2ZhaWw6Ci0JCW1tY19yZWxlYXNlX2hvc3QoaG9zdCk7Ci0JCW1tY19wb3dlcl9vZmYoaG9zdCk7CisJCWlmICghbW1jX3Jlc2Nhbl90cnlfZnJlcShob3N0LCBtYXgoZnJlcXNbaV0sIGhvc3QtPmZfbWluKSkpCisJCQlicmVhazsKKwkJaWYgKGZyZXFzW2ldIDwgaG9zdC0+Zl9taW4pCisJCQlicmVhazsKIAl9Ci1vdXQ6CisJbW1jX3JlbGVhc2VfaG9zdChob3N0KTsKKworIG91dDoKIAlpZiAoaG9zdC0+Y2FwcyAmIE1NQ19DQVBfTkVFRFNfUE9MTCkKIAkJbW1jX3NjaGVkdWxlX2RlbGF5ZWRfd29yaygmaG9zdC0+ZGV0ZWN0LCBIWik7CiB9CkBAIC0xNzIxLDYgKzE3NDcsMTggQEAKIAkJaWYgKCEoaG9zdC0+cG1fZmxhZ3MgJiBNTUNfUE1fS0VFUF9QT1dFUikpIHsKIAkJCW1tY19wb3dlcl91cChob3N0KTsKIAkJCW1tY19zZWxlY3Rfdm9sdGFnZShob3N0LCBob3N0LT5vY3IpOworCQkJLyoKKwkJCSAqIFRlbGwgcnVudGltZSBQTSBjb3JlIHdlIGp1c3QgcG93ZXJlZCB1cCB0aGUgY2FyZCwKKwkJCSAqIHNpbmNlIGl0IHN0aWxsIGJlbGlldmVzIHRoZSBjYXJkIGlzIHBvd2VyZWQgb2ZmLgorCQkJICogTm90ZSB0aGF0IGN1cnJlbnRseSBydW50aW1lIFBNIGlzIG9ubHkgZW5hYmxlZAorCQkJICogZm9yIFNESU8gY2FyZHMgdGhhdCBhcmUgTU1DX0NBUF9QT1dFUl9PRkZfQ0FSRAorCQkJICovCisJCQlpZiAobW1jX2NhcmRfc2Rpbyhob3N0LT5jYXJkKSAmJgorCQkJICAgIChob3N0LT5jYXBzICYgTU1DX0NBUF9QT1dFUl9PRkZfQ0FSRCkpIHsKKwkJCQlwbV9ydW50aW1lX2Rpc2FibGUoJmhvc3QtPmNhcmQtPmRldik7CisJCQkJcG1fcnVudGltZV9zZXRfYWN0aXZlKCZob3N0LT5jYXJkLT5kZXYpOworCQkJCXBtX3J1bnRpbWVfZW5hYmxlKCZob3N0LT5jYXJkLT5kZXYpOworCQkJfQogCQl9CiAJCUJVR19PTighaG9zdC0+YnVzX29wcy0+cmVzdW1lKTsKIAkJZXJyID0gaG9zdC0+YnVzX29wcy0+cmVzdW1lKGhvc3QpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvY29yZS9jb3JlLmggYi9kcml2ZXJzL21tYy9jb3JlL2NvcmUuaAppbmRleCA3NzI0MGNkLi5jYTFmZGRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9jb3JlL2NvcmUuaAorKysgYi9kcml2ZXJzL21tYy9jb3JlL2NvcmUuaApAQCAtMzMsNiArMzMsOSBAQAogCiB2b2lkIG1tY19zZXRfY2hpcF9zZWxlY3Qoc3RydWN0IG1tY19ob3N0ICpob3N0LCBpbnQgbW9kZSk7CiB2b2lkIG1tY19zZXRfY2xvY2soc3RydWN0IG1tY19ob3N0ICpob3N0LCB1bnNpZ25lZCBpbnQgaHopOwordm9pZCBtbWNfZ2F0ZV9jbG9jayhzdHJ1Y3QgbW1jX2hvc3QgKmhvc3QpOwordm9pZCBtbWNfdW5nYXRlX2Nsb2NrKHN0cnVjdCBtbWNfaG9zdCAqaG9zdCk7Cit2b2lkIG1tY19zZXRfdW5nYXRlZChzdHJ1Y3QgbW1jX2hvc3QgKmhvc3QpOwogdm9pZCBtbWNfc2V0X2J1c19tb2RlKHN0cnVjdCBtbWNfaG9zdCAqaG9zdCwgdW5zaWduZWQgaW50IG1vZGUpOwogdm9pZCBtbWNfc2V0X2J1c193aWR0aChzdHJ1Y3QgbW1jX2hvc3QgKmhvc3QsIHVuc2lnbmVkIGludCB3aWR0aCk7CiB2b2lkIG1tY19zZXRfYnVzX3dpZHRoX2RkcihzdHJ1Y3QgbW1jX2hvc3QgKmhvc3QsIHVuc2lnbmVkIGludCB3aWR0aCwKQEAgLTU0LDkgKzU3LDkgQEAKIHZvaWQgbW1jX3N0YXJ0X2hvc3Qoc3RydWN0IG1tY19ob3N0ICpob3N0KTsKIHZvaWQgbW1jX3N0b3BfaG9zdChzdHJ1Y3QgbW1jX2hvc3QgKmhvc3QpOwogCi1pbnQgbW1jX2F0dGFjaF9tbWMoc3RydWN0IG1tY19ob3N0ICpob3N0LCB1MzIgb2NyKTsKLWludCBtbWNfYXR0YWNoX3NkKHN0cnVjdCBtbWNfaG9zdCAqaG9zdCwgdTMyIG9jcik7Ci1pbnQgbW1jX2F0dGFjaF9zZGlvKHN0cnVjdCBtbWNfaG9zdCAqaG9zdCwgdTMyIG9jcik7CitpbnQgbW1jX2F0dGFjaF9tbWMoc3RydWN0IG1tY19ob3N0ICpob3N0KTsKK2ludCBtbWNfYXR0YWNoX3NkKHN0cnVjdCBtbWNfaG9zdCAqaG9zdCk7CitpbnQgbW1jX2F0dGFjaF9zZGlvKHN0cnVjdCBtbWNfaG9zdCAqaG9zdCk7CiAKIC8qIE1vZHVsZSBwYXJhbWV0ZXJzICovCiBleHRlcm4gaW50IHVzZV9zcGlfY3JjOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvY29yZS9kZWJ1Z2ZzLmMgYi9kcml2ZXJzL21tYy9jb3JlL2RlYnVnZnMuYwppbmRleCBlZWQxNDA1Li45OTg3OTdlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9jb3JlL2RlYnVnZnMuYworKysgYi9kcml2ZXJzL21tYy9jb3JlL2RlYnVnZnMuYwpAQCAtMTgzLDYgKzE4MywxMSBAQAogCQkJJm1tY19jbG9ja19mb3BzKSkKIAkJZ290byBlcnJfbm9kZTsKIAorI2lmZGVmIENPTkZJR19NTUNfQ0xLR0FURQorCWlmICghZGVidWdmc19jcmVhdGVfdTMyKCJjbGtfZGVsYXkiLCAoU19JUlVTUiB8IFNfSVdVU1IpLAorCQkJCXJvb3QsICZob3N0LT5jbGtfZGVsYXkpKQorCQlnb3RvIGVycl9ub2RlOworI2VuZGlmCiAJcmV0dXJuOwogCiBlcnJfbm9kZToKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2NvcmUvaG9zdC5jIGIvZHJpdmVycy9tbWMvY29yZS9ob3N0LmMKaW5kZXggMTBiOGFmMi4uYjNhYzZjNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvY29yZS9ob3N0LmMKKysrIGIvZHJpdmVycy9tbWMvY29yZS9ob3N0LmMKQEAgLTMsNiArMyw3IEBACiAgKgogICogIENvcHlyaWdodCAoQykgMjAwMyBSdXNzZWxsIEtpbmcsIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiAgQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggUGllcnJlIE9zc21hbgorICogIENvcHlyaWdodCAoQykgMjAxMCBMaW51cyBXYWxsZWlqCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCkBAIC0yMCw2ICsyMSw3IEBACiAjaW5jbHVkZSA8bGludXgvc3VzcGVuZC5oPgogCiAjaW5jbHVkZSA8bGludXgvbW1jL2hvc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9tbWMvY2FyZC5oPgogCiAjaW5jbHVkZSAiY29yZS5oIgogI2luY2x1ZGUgImhvc3QuaCIKQEAgLTUwLDYgKzUyLDIwNSBAQAogc3RhdGljIERFRklORV9JRFIobW1jX2hvc3RfaWRyKTsKIHN0YXRpYyBERUZJTkVfU1BJTkxPQ0sobW1jX2hvc3RfbG9jayk7CiAKKyNpZmRlZiBDT05GSUdfTU1DX0NMS0dBVEUKKworLyoKKyAqIEVuYWJsaW5nIGNsb2NrIGdhdGluZyB3aWxsIG1ha2UgdGhlIGNvcmUgY2FsbCBvdXQgdG8gdGhlIGhvc3QKKyAqIG9uY2UgdXAgYW5kIG9uY2UgZG93biB3aGVuIGl0IHBlcmZvcm1zIGEgcmVxdWVzdCBvciBjYXJkIG9wZXJhdGlvbgorICogaW50ZXJtaW5nbGVkIGluIGFueSBmYXNoaW9uLiBUaGUgZHJpdmVyIHdpbGwgc2VlIHRoaXMgdGhyb3VnaAorICogc2V0X2lvcygpIG9wZXJhdGlvbnMgd2l0aCBpb3MuY2xvY2sgZmllbGQgc2V0IHRvIDAgdG8gZ2F0ZSAoZGlzYWJsZSkKKyAqIHRoZSBibG9jayBjbG9jaywgYW5kIHRvIHRoZSBvbGQgZnJlcXVlbmN5IHRvIGVuYWJsZSBpdCBhZ2Fpbi4KKyAqLworc3RhdGljIHZvaWQgbW1jX2hvc3RfY2xrX2dhdGVfZGVsYXllZChzdHJ1Y3QgbW1jX2hvc3QgKmhvc3QpCit7CisJdW5zaWduZWQgbG9uZyB0aWNrX25zOworCXVuc2lnbmVkIGxvbmcgZnJlcSA9IGhvc3QtPmlvcy5jbG9jazsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKCFmcmVxKSB7CisJCXByX2RlYnVnKCIlczogZnJlcXVlbmN5IHNldCB0byAwIGluIGRpc2FibGUgZnVuY3Rpb24sICIKKwkJCSAidGhpcyBtZWFucyB0aGUgY2xvY2sgaXMgYWxyZWFkeSBkaXNhYmxlZC5cbiIsCisJCQkgbW1jX2hvc3RuYW1lKGhvc3QpKTsKKwkJcmV0dXJuOworCX0KKwkvKgorCSAqIE5ldyByZXF1ZXN0cyBtYXkgaGF2ZSBhcHBlYXJlZCB3aGlsZSB3ZSB3ZXJlIHNjaGVkdWxpbmcsCisJICogdGhlbiB0aGVyZSBpcyBubyByZWFzb24gdG8gZGVsYXkgdGhlIGNoZWNrIGJlZm9yZQorCSAqIGNsa19kaXNhYmxlKCkuCisJICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmhvc3QtPmNsa19sb2NrLCBmbGFncyk7CisKKwkvKgorCSAqIERlbGF5IG4gYnVzIGN5Y2xlcyAoYXQgbGVhc3QgOCBmcm9tIE1NQyBzcGVjKSBiZWZvcmUgYXR0ZW1wdGluZworCSAqIHRvIGRpc2FibGUgdGhlIE1DSSBibG9jayBjbG9jay4gVGhlIHJlZmVyZW5jZSBjb3VudCBtYXkgaGF2ZQorCSAqIGdvbmUgdXAgYWdhaW4gYWZ0ZXIgdGhpcyBkZWxheSBkdWUgdG8gcmVzY2hlZHVsaW5nIQorCSAqLworCWlmICghaG9zdC0+Y2xrX3JlcXVlc3RzKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhvc3QtPmNsa19sb2NrLCBmbGFncyk7CisJCXRpY2tfbnMgPSBESVZfUk9VTkRfVVAoMTAwMDAwMDAwMCwgZnJlcSk7CisJCW5kZWxheShob3N0LT5jbGtfZGVsYXkgKiB0aWNrX25zKTsKKwl9IGVsc2UgeworCQkvKiBOZXcgdXNlcnMgYXBwZWFyZWQgd2hpbGUgd2FpdGluZyBmb3IgdGhpcyB3b3JrICovCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhvc3QtPmNsa19sb2NrLCBmbGFncyk7CisJCXJldHVybjsKKwl9CisJbXV0ZXhfbG9jaygmaG9zdC0+Y2xrX2dhdGVfbXV0ZXgpOworCXNwaW5fbG9ja19pcnFzYXZlKCZob3N0LT5jbGtfbG9jaywgZmxhZ3MpOworCWlmICghaG9zdC0+Y2xrX3JlcXVlc3RzKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhvc3QtPmNsa19sb2NrLCBmbGFncyk7CisJCS8qIFRoaXMgd2lsbCBzZXQgaG9zdC0+aW9zLmNsb2NrIHRvIDAgKi8KKwkJbW1jX2dhdGVfY2xvY2soaG9zdCk7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZob3N0LT5jbGtfbG9jaywgZmxhZ3MpOworCQlwcl9kZWJ1ZygiJXM6IGdhdGVkIE1DSSBjbG9ja1xuIiwgbW1jX2hvc3RuYW1lKGhvc3QpKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaG9zdC0+Y2xrX2xvY2ssIGZsYWdzKTsKKwltdXRleF91bmxvY2soJmhvc3QtPmNsa19nYXRlX211dGV4KTsKK30KKworLyoKKyAqIEludGVybmFsIHdvcmsuIFdvcmsgdG8gZGlzYWJsZSB0aGUgY2xvY2sgYXQgc29tZSBsYXRlciBwb2ludC4KKyAqLworc3RhdGljIHZvaWQgbW1jX2hvc3RfY2xrX2dhdGVfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IG1tY19ob3N0ICpob3N0ID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBtbWNfaG9zdCwKKwkJCQkJICAgICAgY2xrX2dhdGVfd29yayk7CisKKwltbWNfaG9zdF9jbGtfZ2F0ZV9kZWxheWVkKGhvc3QpOworfQorCisvKioKKyAqCW1tY19ob3N0X2Nsa191bmdhdGUgLSB1bmdhdGUgaGFyZHdhcmUgTUNJIGNsb2NrcworICoJQGhvc3Q6IGhvc3QgdG8gdW5nYXRlLgorICoKKyAqCU1ha2VzIHN1cmUgdGhlIGhvc3QgaW9zLmNsb2NrIGlzIHJlc3RvcmVkIHRvIGEgbm9uLXplcm8gdmFsdWUKKyAqCXBhc3QgdGhpcyBjYWxsLglJbmNyZWFzZSBjbG9jayByZWZlcmVuY2UgY291bnQgYW5kIHVuZ2F0ZSBjbG9jaworICoJaWYgd2UncmUgdGhlIGZpcnN0IHVzZXIuCisgKi8KK3ZvaWQgbW1jX2hvc3RfY2xrX3VuZ2F0ZShzdHJ1Y3QgbW1jX2hvc3QgKmhvc3QpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCW11dGV4X2xvY2soJmhvc3QtPmNsa19nYXRlX211dGV4KTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaG9zdC0+Y2xrX2xvY2ssIGZsYWdzKTsKKwlpZiAoaG9zdC0+Y2xrX2dhdGVkKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhvc3QtPmNsa19sb2NrLCBmbGFncyk7CisJCW1tY191bmdhdGVfY2xvY2soaG9zdCk7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZob3N0LT5jbGtfbG9jaywgZmxhZ3MpOworCQlwcl9kZWJ1ZygiJXM6IHVuZ2F0ZWQgTUNJIGNsb2NrXG4iLCBtbWNfaG9zdG5hbWUoaG9zdCkpOworCX0KKwlob3N0LT5jbGtfcmVxdWVzdHMrKzsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZob3N0LT5jbGtfbG9jaywgZmxhZ3MpOworCW11dGV4X3VubG9jaygmaG9zdC0+Y2xrX2dhdGVfbXV0ZXgpOworfQorCisvKioKKyAqCW1tY19ob3N0X21heV9nYXRlX2NhcmQgLSBjaGVjayBpZiB0aGlzIGNhcmQgbWF5IGJlIGdhdGVkCisgKglAY2FyZDogY2FyZCB0byBjaGVjay4KKyAqLworc3RhdGljIGJvb2wgbW1jX2hvc3RfbWF5X2dhdGVfY2FyZChzdHJ1Y3QgbW1jX2NhcmQgKmNhcmQpCit7CisJLyogSWYgdGhlcmUgaXMgbm8gY2FyZCB3ZSBtYXkgZ2F0ZSBpdCAqLworCWlmICghY2FyZCkKKwkJcmV0dXJuIHRydWU7CisJLyoKKwkgKiBEb24ndCBnYXRlIFNESU8gY2FyZHMhIFRoZXNlIG5lZWQgdG8gYmUgY2xvY2tlZCBhdCBhbGwgdGltZXMKKwkgKiBzaW5jZSB0aGV5IG1heSBiZSBpbmRlcGVuZGVudCBzeXN0ZW1zIGdlbmVyYXRpbmcgaW50ZXJydXB0cworCSAqIGFuZCBvdGhlciBldmVudHMuIFRoZSBjbG9jayByZXF1ZXN0cyBjb3VudGVyIGZyb20gdGhlIGNvcmUgd2lsbAorCSAqIGdvIGRvd24gdG8gemVybyBzaW5jZSB0aGUgY29yZSBkb2VzIG5vdCBuZWVkIGl0LCBidXQgd2Ugd2lsbCBub3QKKwkgKiBnYXRlIHRoZSBjbG9jaywgYmVjYXVzZSB0aGVyZSBpcyBzb21lYm9keSBvdXQgdGhlcmUgdGhhdCBtYXkgc3RpbGwKKwkgKiBiZSB1c2luZyBpdC4KKwkgKi8KKwlpZiAobW1jX2NhcmRfc2RpbyhjYXJkKSkKKwkJcmV0dXJuIGZhbHNlOworCisJcmV0dXJuIHRydWU7Cit9CisKKy8qKgorICoJbW1jX2hvc3RfY2xrX2dhdGUgLSBnYXRlIG9mZiBoYXJkd2FyZSBNQ0kgY2xvY2tzCisgKglAaG9zdDogaG9zdCB0byBnYXRlLgorICoKKyAqCUNhbGxzIHRoZSBob3N0IGRyaXZlciB3aXRoIGlvcy5jbG9jayBzZXQgdG8gemVybyBhcyBvZnRlbiBhcyBwb3NzaWJsZQorICoJaW4gb3JkZXIgdG8gZ2F0ZSBvZmYgaGFyZHdhcmUgTUNJIGNsb2Nrcy4gRGVjcmVhc2UgY2xvY2sgcmVmZXJlbmNlCisgKgljb3VudCBhbmQgc2NoZWR1bGUgZGlzYWJsaW5nIG9mIGNsb2NrLgorICovCit2b2lkIG1tY19ob3N0X2Nsa19nYXRlKHN0cnVjdCBtbWNfaG9zdCAqaG9zdCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmhvc3QtPmNsa19sb2NrLCBmbGFncyk7CisJaG9zdC0+Y2xrX3JlcXVlc3RzLS07CisJaWYgKG1tY19ob3N0X21heV9nYXRlX2NhcmQoaG9zdC0+Y2FyZCkgJiYKKwkgICAgIWhvc3QtPmNsa19yZXF1ZXN0cykKKwkJc2NoZWR1bGVfd29yaygmaG9zdC0+Y2xrX2dhdGVfd29yayk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaG9zdC0+Y2xrX2xvY2ssIGZsYWdzKTsKK30KKworLyoqCisgKgltbWNfaG9zdF9jbGtfcmF0ZSAtIGdldCBjdXJyZW50IGNsb2NrIGZyZXF1ZW5jeSBzZXR0aW5nCisgKglAaG9zdDogaG9zdCB0byBnZXQgdGhlIGNsb2NrIGZyZXF1ZW5jeSBmb3IuCisgKgorICoJUmV0dXJucyBjdXJyZW50IGNsb2NrIGZyZXF1ZW5jeSByZWdhcmRsZXNzIG9mIGdhdGluZy4KKyAqLwordW5zaWduZWQgaW50IG1tY19ob3N0X2Nsa19yYXRlKHN0cnVjdCBtbWNfaG9zdCAqaG9zdCkKK3sKKwl1bnNpZ25lZCBsb25nIGZyZXE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZob3N0LT5jbGtfbG9jaywgZmxhZ3MpOworCWlmIChob3N0LT5jbGtfZ2F0ZWQpCisJCWZyZXEgPSBob3N0LT5jbGtfb2xkOworCWVsc2UKKwkJZnJlcSA9IGhvc3QtPmlvcy5jbG9jazsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZob3N0LT5jbGtfbG9jaywgZmxhZ3MpOworCXJldHVybiBmcmVxOworfQorCisvKioKKyAqCW1tY19ob3N0X2Nsa19pbml0IC0gc2V0IHVwIGNsb2NrIGdhdGluZyBjb2RlCisgKglAaG9zdDogaG9zdCB3aXRoIHBvdGVudGlhbCBjbG9jayB0byBjb250cm9sCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBtbWNfaG9zdF9jbGtfaW5pdChzdHJ1Y3QgbW1jX2hvc3QgKmhvc3QpCit7CisJaG9zdC0+Y2xrX3JlcXVlc3RzID0gMDsKKwkvKiBIb2xkIE1DSSBjbG9jayBmb3IgOCBjeWNsZXMgYnkgZGVmYXVsdCAqLworCWhvc3QtPmNsa19kZWxheSA9IDg7CisJaG9zdC0+Y2xrX2dhdGVkID0gZmFsc2U7CisJSU5JVF9XT1JLKCZob3N0LT5jbGtfZ2F0ZV93b3JrLCBtbWNfaG9zdF9jbGtfZ2F0ZV93b3JrKTsKKwlzcGluX2xvY2tfaW5pdCgmaG9zdC0+Y2xrX2xvY2spOworCW11dGV4X2luaXQoJmhvc3QtPmNsa19nYXRlX211dGV4KTsKK30KKworLyoqCisgKgltbWNfaG9zdF9jbGtfZXhpdCAtIHNodXQgZG93biBjbG9jayBnYXRpbmcgY29kZQorICoJQGhvc3Q6IGhvc3Qgd2l0aCBwb3RlbnRpYWwgY2xvY2sgdG8gY29udHJvbAorICovCitzdGF0aWMgaW5saW5lIHZvaWQgbW1jX2hvc3RfY2xrX2V4aXQoc3RydWN0IG1tY19ob3N0ICpob3N0KQoreworCS8qCisJICogV2FpdCBmb3IgYW55IG91dHN0YW5kaW5nIGdhdGUgYW5kIHRoZW4gbWFrZSBzdXJlIHdlJ3JlCisJICogdW5nYXRlZCBiZWZvcmUgZXhpdGluZy4KKwkgKi8KKwlpZiAoY2FuY2VsX3dvcmtfc3luYygmaG9zdC0+Y2xrX2dhdGVfd29yaykpCisJCW1tY19ob3N0X2Nsa19nYXRlX2RlbGF5ZWQoaG9zdCk7CisJaWYgKGhvc3QtPmNsa19nYXRlZCkKKwkJbW1jX2hvc3RfY2xrX3VuZ2F0ZShob3N0KTsKKwkvKiBUaGVyZSBzaG91bGQgYmUgb25seSBvbmUgdXNlciBub3cgKi8KKwlXQVJOX09OKGhvc3QtPmNsa19yZXF1ZXN0cyA+IDEpOworfQorCisjZWxzZQorCitzdGF0aWMgaW5saW5lIHZvaWQgbW1jX2hvc3RfY2xrX2luaXQoc3RydWN0IG1tY19ob3N0ICpob3N0KQoreworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbW1jX2hvc3RfY2xrX2V4aXQoc3RydWN0IG1tY19ob3N0ICpob3N0KQoreworfQorCisjZW5kaWYKKwogLyoqCiAgKgltbWNfYWxsb2NfaG9zdCAtIGluaXRpYWxpc2UgdGhlIHBlci1ob3N0IHN0cnVjdHVyZS4KICAqCUBleHRyYTogc2l6ZW9mIHByaXZhdGUgZGF0YSBzdHJ1Y3R1cmUKQEAgLTgyLDYgKzI4Myw4IEBACiAJaG9zdC0+Y2xhc3NfZGV2LmNsYXNzID0gJm1tY19ob3N0X2NsYXNzOwogCWRldmljZV9pbml0aWFsaXplKCZob3N0LT5jbGFzc19kZXYpOwogCisJbW1jX2hvc3RfY2xrX2luaXQoaG9zdCk7CisKIAlzcGluX2xvY2tfaW5pdCgmaG9zdC0+bG9jayk7CiAJaW5pdF93YWl0cXVldWVfaGVhZCgmaG9zdC0+d3EpOwogCUlOSVRfREVMQVlFRF9XT1JLKCZob3N0LT5kZXRlY3QsIG1tY19yZXNjYW4pOwpAQCAtMTYzLDYgKzM2Niw4IEBACiAJZGV2aWNlX2RlbCgmaG9zdC0+Y2xhc3NfZGV2KTsKIAogCWxlZF90cmlnZ2VyX3VucmVnaXN0ZXJfc2ltcGxlKGhvc3QtPmxlZCk7CisKKwltbWNfaG9zdF9jbGtfZXhpdChob3N0KTsKIH0KIAogRVhQT1JUX1NZTUJPTChtbWNfcmVtb3ZlX2hvc3QpOwpAQCAtMTgzLDQgKzM4OCwzIEBACiB9CiAKIEVYUE9SVF9TWU1CT0wobW1jX2ZyZWVfaG9zdCk7Ci0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2NvcmUvaG9zdC5oIGIvZHJpdmVycy9tbWMvY29yZS9ob3N0LmgKaW5kZXggOGM4N2UxMS4uZGUxOTlmOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvY29yZS9ob3N0LmgKKysrIGIvZHJpdmVycy9tbWMvY29yZS9ob3N0LmgKQEAgLTEwLDEwICsxMCwzMSBAQAogICovCiAjaWZuZGVmIF9NTUNfQ09SRV9IT1NUX0gKICNkZWZpbmUgX01NQ19DT1JFX0hPU1RfSAorI2luY2x1ZGUgPGxpbnV4L21tYy9ob3N0Lmg+CiAKIGludCBtbWNfcmVnaXN0ZXJfaG9zdF9jbGFzcyh2b2lkKTsKIHZvaWQgbW1jX3VucmVnaXN0ZXJfaG9zdF9jbGFzcyh2b2lkKTsKIAorI2lmZGVmIENPTkZJR19NTUNfQ0xLR0FURQordm9pZCBtbWNfaG9zdF9jbGtfdW5nYXRlKHN0cnVjdCBtbWNfaG9zdCAqaG9zdCk7Cit2b2lkIG1tY19ob3N0X2Nsa19nYXRlKHN0cnVjdCBtbWNfaG9zdCAqaG9zdCk7Cit1bnNpZ25lZCBpbnQgbW1jX2hvc3RfY2xrX3JhdGUoc3RydWN0IG1tY19ob3N0ICpob3N0KTsKKworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCBtbWNfaG9zdF9jbGtfdW5nYXRlKHN0cnVjdCBtbWNfaG9zdCAqaG9zdCkKK3sKK30KKworc3RhdGljIGlubGluZSB2b2lkIG1tY19ob3N0X2Nsa19nYXRlKHN0cnVjdCBtbWNfaG9zdCAqaG9zdCkKK3sKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgbW1jX2hvc3RfY2xrX3JhdGUoc3RydWN0IG1tY19ob3N0ICpob3N0KQoreworCXJldHVybiBob3N0LT5pb3MuY2xvY2s7Cit9CisjZW5kaWYKKwogdm9pZCBtbWNfaG9zdF9kZWVwZXJfZGlzYWJsZShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2NvcmUvbW1jLmMgYi9kcml2ZXJzL21tYy9jb3JlL21tYy5jCmluZGV4IDc3ZjkzYzMuLjE2MDA2ZWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2NvcmUvbW1jLmMKKysrIGIvZHJpdmVycy9tbWMvY29yZS9tbWMuYwpAQCAtNTM0LDM5ICs1MzQsNTcgQEAKIAkgKi8KIAlpZiAoKGNhcmQtPmNzZC5tbWNhX3ZzbiA+PSBDU0RfU1BFQ19WRVJfNCkgJiYKIAkgICAgKGhvc3QtPmNhcHMgJiAoTU1DX0NBUF80X0JJVF9EQVRBIHwgTU1DX0NBUF84X0JJVF9EQVRBKSkpIHsKLQkJdW5zaWduZWQgZXh0X2NzZF9iaXQsIGJ1c193aWR0aDsKKwkJc3RhdGljIHVuc2lnbmVkIGV4dF9jc2RfYml0c1tdWzJdID0geworCQkJeyBFWFRfQ1NEX0JVU19XSURUSF84LCBFWFRfQ1NEX0REUl9CVVNfV0lEVEhfOCB9LAorCQkJeyBFWFRfQ1NEX0JVU19XSURUSF80LCBFWFRfQ1NEX0REUl9CVVNfV0lEVEhfNCB9LAorCQkJeyBFWFRfQ1NEX0JVU19XSURUSF8xLCBFWFRfQ1NEX0JVU19XSURUSF8xIH0sCisJCX07CisJCXN0YXRpYyB1bnNpZ25lZCBidXNfd2lkdGhzW10gPSB7CisJCQlNTUNfQlVTX1dJRFRIXzgsCisJCQlNTUNfQlVTX1dJRFRIXzQsCisJCQlNTUNfQlVTX1dJRFRIXzEKKwkJfTsKKwkJdW5zaWduZWQgaWR4LCBidXNfd2lkdGggPSAwOwogCi0JCWlmIChob3N0LT5jYXBzICYgTU1DX0NBUF84X0JJVF9EQVRBKSB7Ci0JCQlpZiAoZGRyKQotCQkJCWV4dF9jc2RfYml0ID0gRVhUX0NTRF9ERFJfQlVTX1dJRFRIXzg7Ci0JCQllbHNlCi0JCQkJZXh0X2NzZF9iaXQgPSBFWFRfQ1NEX0JVU19XSURUSF84OwotCQkJYnVzX3dpZHRoID0gTU1DX0JVU19XSURUSF84OwotCQl9IGVsc2UgewotCQkJaWYgKGRkcikKLQkJCQlleHRfY3NkX2JpdCA9IEVYVF9DU0RfRERSX0JVU19XSURUSF80OwotCQkJZWxzZQotCQkJCWV4dF9jc2RfYml0ID0gRVhUX0NTRF9CVVNfV0lEVEhfNDsKLQkJCWJ1c193aWR0aCA9IE1NQ19CVVNfV0lEVEhfNDsKKwkJaWYgKGhvc3QtPmNhcHMgJiBNTUNfQ0FQXzhfQklUX0RBVEEpCisJCQlpZHggPSAwOworCQllbHNlCisJCQlpZHggPSAxOworCQlmb3IgKDsgaWR4IDwgQVJSQVlfU0laRShidXNfd2lkdGhzKTsgaWR4KyspIHsKKwkJCWJ1c193aWR0aCA9IGJ1c193aWR0aHNbaWR4XTsKKwkJCWlmIChidXNfd2lkdGggPT0gTU1DX0JVU19XSURUSF8xKQorCQkJCWRkciA9IDA7IC8qIG5vIEREUiBmb3IgMS1iaXQgd2lkdGggKi8KKwkJCWVyciA9IG1tY19zd2l0Y2goY2FyZCwgRVhUX0NTRF9DTURfU0VUX05PUk1BTCwKKwkJCQkJIEVYVF9DU0RfQlVTX1dJRFRILAorCQkJCQkgZXh0X2NzZF9iaXRzW2lkeF1bMF0pOworCQkJaWYgKCFlcnIpIHsKKwkJCQltbWNfc2V0X2J1c193aWR0aF9kZHIoY2FyZC0+aG9zdCwKKwkJCQkJCSAgICAgIGJ1c193aWR0aCwgTU1DX1NEUl9NT0RFKTsKKwkJCQkvKgorCQkJCSAqIElmIGNvbnRyb2xsZXIgY2FuJ3QgaGFuZGxlIGJ1cyB3aWR0aCB0ZXN0LAorCQkJCSAqIHVzZSB0aGUgaGlnaGVzdCBidXMgd2lkdGggdG8gbWFpbnRhaW4KKwkJCQkgKiBjb21wYXRpYmlsaXR5IHdpdGggcHJldmlvdXMgTU1DIGJlaGF2aW9yLgorCQkJCSAqLworCQkJCWlmICghKGhvc3QtPmNhcHMgJiBNTUNfQ0FQX0JVU19XSURUSF9URVNUKSkKKwkJCQkJYnJlYWs7CisJCQkJZXJyID0gbW1jX2J1c190ZXN0KGNhcmQsIGJ1c193aWR0aCk7CisJCQkJaWYgKCFlcnIpCisJCQkJCWJyZWFrOworCQkJfQogCQl9CiAKLQkJZXJyID0gbW1jX3N3aXRjaChjYXJkLCBFWFRfQ1NEX0NNRF9TRVRfTk9STUFMLAotCQkJCSBFWFRfQ1NEX0JVU19XSURUSCwgZXh0X2NzZF9iaXQpOwotCi0JCWlmIChlcnIgJiYgZXJyICE9IC1FQkFETVNHKQotCQkJZ290byBmcmVlX2NhcmQ7Ci0KKwkJaWYgKCFlcnIgJiYgZGRyKSB7CisJCQllcnIgPSBtbWNfc3dpdGNoKGNhcmQsIEVYVF9DU0RfQ01EX1NFVF9OT1JNQUwsCisJCQkJCUVYVF9DU0RfQlVTX1dJRFRILAorCQkJCQlleHRfY3NkX2JpdHNbaWR4XVsxXSk7CisJCX0KIAkJaWYgKGVycikgewogCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHN3aXRjaCB0byBidXMgd2lkdGggJWQgZGRyICVkICIKLQkJCSAgICAgICAiZmFpbGVkXG4iLCBtbWNfaG9zdG5hbWUoY2FyZC0+aG9zdCksCi0JCQkgICAgICAgMSA8PCBidXNfd2lkdGgsIGRkcik7Ci0JCQllcnIgPSAwOwotCQl9IGVsc2UgewotCQkJaWYgKGRkcikKLQkJCQltbWNfY2FyZF9zZXRfZGRyX21vZGUoY2FyZCk7Ci0JCQllbHNlCi0JCQkJZGRyID0gTU1DX1NEUl9NT0RFOwotCisJCQkJImZhaWxlZFxuIiwgbW1jX2hvc3RuYW1lKGNhcmQtPmhvc3QpLAorCQkJCTEgPDwgYnVzX3dpZHRoLCBkZHIpOworCQkJZ290byBmcmVlX2NhcmQ7CisJCX0gZWxzZSBpZiAoZGRyKSB7CisJCQltbWNfY2FyZF9zZXRfZGRyX21vZGUoY2FyZCk7CiAJCQltbWNfc2V0X2J1c193aWR0aF9kZHIoY2FyZC0+aG9zdCwgYnVzX3dpZHRoLCBkZHIpOwogCQl9CiAJfQpAQCAtNzM3LDE0ICs3NTUsMjEgQEAKIC8qCiAgKiBTdGFydGluZyBwb2ludCBmb3IgTU1DIGNhcmQgaW5pdC4KICAqLwotaW50IG1tY19hdHRhY2hfbW1jKHN0cnVjdCBtbWNfaG9zdCAqaG9zdCwgdTMyIG9jcikKK2ludCBtbWNfYXR0YWNoX21tYyhzdHJ1Y3QgbW1jX2hvc3QgKmhvc3QpCiB7CiAJaW50IGVycjsKKwl1MzIgb2NyOwogCiAJQlVHX09OKCFob3N0KTsKIAlXQVJOX09OKCFob3N0LT5jbGFpbWVkKTsKIAorCWVyciA9IG1tY19zZW5kX29wX2NvbmQoaG9zdCwgMCwgJm9jcik7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKwogCW1tY19hdHRhY2hfYnVzX29wcyhob3N0KTsKKwlpZiAoaG9zdC0+b2NyX2F2YWlsX21tYykKKwkJaG9zdC0+b2NyX2F2YWlsID0gaG9zdC0+b2NyX2F2YWlsX21tYzsKIAogCS8qCiAJICogV2UgbmVlZCB0byBnZXQgT0NSIGEgZGlmZmVyZW50IHdheSBmb3IgU1BJLgpAQCAtNzg0LDIwICs4MDksMjAgQEAKIAkJZ290byBlcnI7CiAKIAltbWNfcmVsZWFzZV9ob3N0KGhvc3QpOwotCiAJZXJyID0gbW1jX2FkZF9jYXJkKGhvc3QtPmNhcmQpOworCW1tY19jbGFpbV9ob3N0KGhvc3QpOwogCWlmIChlcnIpCiAJCWdvdG8gcmVtb3ZlX2NhcmQ7CiAKIAlyZXR1cm4gMDsKIAogcmVtb3ZlX2NhcmQ6CisJbW1jX3JlbGVhc2VfaG9zdChob3N0KTsKIAltbWNfcmVtb3ZlX2NhcmQoaG9zdC0+Y2FyZCk7Ci0JaG9zdC0+Y2FyZCA9IE5VTEw7CiAJbW1jX2NsYWltX2hvc3QoaG9zdCk7CisJaG9zdC0+Y2FyZCA9IE5VTEw7CiBlcnI6CiAJbW1jX2RldGFjaF9idXMoaG9zdCk7Ci0JbW1jX3JlbGVhc2VfaG9zdChob3N0KTsKIAogCXByaW50ayhLRVJOX0VSUiAiJXM6IGVycm9yICVkIHdoaWxzdCBpbml0aWFsaXNpbmcgTU1DIGNhcmRcbiIsCiAJCW1tY19ob3N0bmFtZShob3N0KSwgZXJyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2NvcmUvbW1jX29wcy5jIGIvZHJpdmVycy9tbWMvY29yZS9tbWNfb3BzLmMKaW5kZXggMzI2NDQ3Yy4uNjA4NDJmOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvY29yZS9tbWNfb3BzLmMKKysrIGIvZHJpdmVycy9tbWMvY29yZS9tbWNfb3BzLmMKQEAgLTQ2MiwzICs0NjIsMTA0IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQKK21tY19zZW5kX2J1c190ZXN0KHN0cnVjdCBtbWNfY2FyZCAqY2FyZCwgc3RydWN0IG1tY19ob3N0ICpob3N0LCB1OCBvcGNvZGUsCisJCSAgdTggbGVuKQoreworCXN0cnVjdCBtbWNfcmVxdWVzdCBtcnE7CisJc3RydWN0IG1tY19jb21tYW5kIGNtZDsKKwlzdHJ1Y3QgbW1jX2RhdGEgZGF0YTsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3Qgc2c7CisJdTggKmRhdGFfYnVmOworCXU4ICp0ZXN0X2J1ZjsKKwlpbnQgaSwgZXJyOworCXN0YXRpYyB1OCB0ZXN0ZGF0YV84Yml0WzhdID0geyAweDU1LCAweGFhLCAwLCAwLCAwLCAwLCAwLCAwIH07CisJc3RhdGljIHU4IHRlc3RkYXRhXzRiaXRbNF0gPSB7IDB4NWEsIDAsIDAsIDAgfTsKKworCS8qIGRtYSBvbnRvIHN0YWNrIGlzIHVuc2FmZS9ub25wb3J0YWJsZSwgYnV0IGNhbGxlcnMgdG8gdGhpcworCSAqIHJvdXRpbmUgbm9ybWFsbHkgcHJvdmlkZSB0ZW1wb3Jhcnkgb24tc3RhY2sgYnVmZmVycyAuLi4KKwkgKi8KKwlkYXRhX2J1ZiA9IGttYWxsb2MobGVuLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRhdGFfYnVmKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWlmIChsZW4gPT0gOCkKKwkJdGVzdF9idWYgPSB0ZXN0ZGF0YV84Yml0OworCWVsc2UgaWYgKGxlbiA9PSA0KQorCQl0ZXN0X2J1ZiA9IHRlc3RkYXRhXzRiaXQ7CisJZWxzZSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IEludmFsaWQgYnVzX3dpZHRoICVkXG4iLAorCQkgICAgICAgbW1jX2hvc3RuYW1lKGhvc3QpLCBsZW4pOworCQlrZnJlZShkYXRhX2J1Zik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChvcGNvZGUgPT0gTU1DX0JVU19URVNUX1cpCisJCW1lbWNweShkYXRhX2J1ZiwgdGVzdF9idWYsIGxlbik7CisKKwltZW1zZXQoJm1ycSwgMCwgc2l6ZW9mKHN0cnVjdCBtbWNfcmVxdWVzdCkpOworCW1lbXNldCgmY21kLCAwLCBzaXplb2Yoc3RydWN0IG1tY19jb21tYW5kKSk7CisJbWVtc2V0KCZkYXRhLCAwLCBzaXplb2Yoc3RydWN0IG1tY19kYXRhKSk7CisKKwltcnEuY21kID0gJmNtZDsKKwltcnEuZGF0YSA9ICZkYXRhOworCWNtZC5vcGNvZGUgPSBvcGNvZGU7CisJY21kLmFyZyA9IDA7CisKKwkvKiBOT1RFIEhBQ0s6ICB0aGUgTU1DX1JTUF9TUElfUjEgaXMgYWx3YXlzIGNvcnJlY3QgaGVyZSwgYnV0IHdlCisJICogcmVseSBvbiBjYWxsZXJzIHRvIG5ldmVyIHVzZSB0aGlzIHdpdGggIm5hdGl2ZSIgY2FsbHMgZm9yIHJlYWRpbmcKKwkgKiBDU0Qgb3IgQ0lELiAgTmF0aXZlIHZlcnNpb25zIG9mIHRob3NlIGNvbW1hbmRzIHVzZSB0aGUgUjIgdHlwZSwKKwkgKiBub3QgUjEgcGx1cyBhIGRhdGEgYmxvY2suCisJICovCisJY21kLmZsYWdzID0gTU1DX1JTUF9TUElfUjEgfCBNTUNfUlNQX1IxIHwgTU1DX0NNRF9BRFRDOworCisJZGF0YS5ibGtzeiA9IGxlbjsKKwlkYXRhLmJsb2NrcyA9IDE7CisJaWYgKG9wY29kZSA9PSBNTUNfQlVTX1RFU1RfUikKKwkJZGF0YS5mbGFncyA9IE1NQ19EQVRBX1JFQUQ7CisJZWxzZQorCQlkYXRhLmZsYWdzID0gTU1DX0RBVEFfV1JJVEU7CisKKwlkYXRhLnNnID0gJnNnOworCWRhdGEuc2dfbGVuID0gMTsKKwlzZ19pbml0X29uZSgmc2csIGRhdGFfYnVmLCBsZW4pOworCW1tY193YWl0X2Zvcl9yZXEoaG9zdCwgJm1ycSk7CisJZXJyID0gMDsKKwlpZiAob3Bjb2RlID09IE1NQ19CVVNfVEVTVF9SKSB7CisJCWZvciAoaSA9IDA7IGkgPCBsZW4gLyA0OyBpKyspCisJCQlpZiAoKHRlc3RfYnVmW2ldIF4gZGF0YV9idWZbaV0pICE9IDB4ZmYpIHsKKwkJCQllcnIgPSAtRUlPOworCQkJCWJyZWFrOworCQkJfQorCX0KKwlrZnJlZShkYXRhX2J1Zik7CisKKwlpZiAoY21kLmVycm9yKQorCQlyZXR1cm4gY21kLmVycm9yOworCWlmIChkYXRhLmVycm9yKQorCQlyZXR1cm4gZGF0YS5lcnJvcjsKKworCXJldHVybiBlcnI7Cit9CisKK2ludCBtbWNfYnVzX3Rlc3Qoc3RydWN0IG1tY19jYXJkICpjYXJkLCB1OCBidXNfd2lkdGgpCit7CisJaW50IGVyciwgd2lkdGg7CisKKwlpZiAoYnVzX3dpZHRoID09IE1NQ19CVVNfV0lEVEhfOCkKKwkJd2lkdGggPSA4OworCWVsc2UgaWYgKGJ1c193aWR0aCA9PSBNTUNfQlVTX1dJRFRIXzQpCisJCXdpZHRoID0gNDsKKwllbHNlIGlmIChidXNfd2lkdGggPT0gTU1DX0JVU19XSURUSF8xKQorCQlyZXR1cm4gMDsgLyogbm8gbmVlZCBmb3IgdGVzdCAqLworCWVsc2UKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKgorCSAqIElnbm9yZSBlcnJvcnMgZnJvbSBCVVNfVEVTVF9XLiAgQlVTX1RFU1RfUiB3aWxsIGZhaWwgaWYgdGhlcmUKKwkgKiBpcyBhIHByb2JsZW0uICBUaGlzIGltcHJvdmVzIGNoYW5jZXMgdGhhdCB0aGUgdGVzdCB3aWxsIHdvcmsuCisJICovCisJbW1jX3NlbmRfYnVzX3Rlc3QoY2FyZCwgY2FyZC0+aG9zdCwgTU1DX0JVU19URVNUX1csIHdpZHRoKTsKKwllcnIgPSBtbWNfc2VuZF9idXNfdGVzdChjYXJkLCBjYXJkLT5ob3N0LCBNTUNfQlVTX1RFU1RfUiwgd2lkdGgpOworCXJldHVybiBlcnI7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9jb3JlL21tY19vcHMuaCBiL2RyaXZlcnMvbW1jL2NvcmUvbW1jX29wcy5oCmluZGV4IDY1M2ViOGUuLmU2ZDQ0YjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2NvcmUvbW1jX29wcy5oCisrKyBiL2RyaXZlcnMvbW1jL2NvcmUvbW1jX29wcy5oCkBAIC0yNiw2ICsyNiw3IEBACiBpbnQgbW1jX3NwaV9yZWFkX29jcihzdHJ1Y3QgbW1jX2hvc3QgKmhvc3QsIGludCBoaWdoY2FwLCB1MzIgKm9jcnApOwogaW50IG1tY19zcGlfc2V0X2NyYyhzdHJ1Y3QgbW1jX2hvc3QgKmhvc3QsIGludCB1c2VfY3JjKTsKIGludCBtbWNfY2FyZF9zbGVlcGF3YWtlKHN0cnVjdCBtbWNfaG9zdCAqaG9zdCwgaW50IHNsZWVwKTsKK2ludCBtbWNfYnVzX3Rlc3Qoc3RydWN0IG1tY19jYXJkICpjYXJkLCB1OCBidXNfd2lkdGgpOwogCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvY29yZS9zZC5jIGIvZHJpdmVycy9tbWMvY29yZS9zZC5jCmluZGV4IDQ5ZGE0ZGYuLmQxOGMzMmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2NvcmUvc2QuYworKysgYi9kcml2ZXJzL21tYy9jb3JlL3NkLmMKQEAgLTc2NCwxNCArNzY0LDIxIEBACiAvKgogICogU3RhcnRpbmcgcG9pbnQgZm9yIFNEIGNhcmQgaW5pdC4KICAqLwotaW50IG1tY19hdHRhY2hfc2Qoc3RydWN0IG1tY19ob3N0ICpob3N0LCB1MzIgb2NyKQoraW50IG1tY19hdHRhY2hfc2Qoc3RydWN0IG1tY19ob3N0ICpob3N0KQogewogCWludCBlcnI7CisJdTMyIG9jcjsKIAogCUJVR19PTighaG9zdCk7CiAJV0FSTl9PTighaG9zdC0+Y2xhaW1lZCk7CiAKKwllcnIgPSBtbWNfc2VuZF9hcHBfb3BfY29uZChob3N0LCAwLCAmb2NyKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCiAJbW1jX3NkX2F0dGFjaF9idXNfb3BzKGhvc3QpOworCWlmIChob3N0LT5vY3JfYXZhaWxfc2QpCisJCWhvc3QtPm9jcl9hdmFpbCA9IGhvc3QtPm9jcl9hdmFpbF9zZDsKIAogCS8qCiAJICogV2UgbmVlZCB0byBnZXQgT0NSIGEgZGlmZmVyZW50IHdheSBmb3IgU1BJLgpAQCAtNzk1LDcgKzgwMiw4IEBACiAJCW9jciAmPSB+MHg3RjsKIAl9CiAKLQlpZiAob2NyICYgTU1DX1ZERF8xNjVfMTk1KSB7CisJaWYgKChvY3IgJiBNTUNfVkREXzE2NV8xOTUpICYmCisJICAgICEoaG9zdC0+b2NyX2F2YWlsX3NkICYgTU1DX1ZERF8xNjVfMTk1KSkgewogCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogU0QgY2FyZCBjbGFpbXMgdG8gc3VwcG9ydCB0aGUgIgogCQkgICAgICAgImluY29tcGxldGVseSBkZWZpbmVkICdsb3cgdm9sdGFnZSByYW5nZScuIFRoaXMgIgogCQkgICAgICAgIndpbGwgYmUgaWdub3JlZC5cbiIsIG1tY19ob3N0bmFtZShob3N0KSk7CkBAIC04MjAsMjAgKzgyOCwyMCBAQAogCQlnb3RvIGVycjsKIAogCW1tY19yZWxlYXNlX2hvc3QoaG9zdCk7Ci0KIAllcnIgPSBtbWNfYWRkX2NhcmQoaG9zdC0+Y2FyZCk7CisJbW1jX2NsYWltX2hvc3QoaG9zdCk7CiAJaWYgKGVycikKIAkJZ290byByZW1vdmVfY2FyZDsKIAogCXJldHVybiAwOwogCiByZW1vdmVfY2FyZDoKKwltbWNfcmVsZWFzZV9ob3N0KGhvc3QpOwogCW1tY19yZW1vdmVfY2FyZChob3N0LT5jYXJkKTsKIAlob3N0LT5jYXJkID0gTlVMTDsKIAltbWNfY2xhaW1faG9zdChob3N0KTsKIGVycjoKIAltbWNfZGV0YWNoX2J1cyhob3N0KTsKLQltbWNfcmVsZWFzZV9ob3N0KGhvc3QpOwogCiAJcHJpbnRrKEtFUk5fRVJSICIlczogZXJyb3IgJWQgd2hpbHN0IGluaXRpYWxpc2luZyBTRCBjYXJkXG4iLAogCQltbWNfaG9zdG5hbWUoaG9zdCksIGVycik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9jb3JlL3NkaW8uYyBiL2RyaXZlcnMvbW1jL2NvcmUvc2Rpby5jCmluZGV4IGVmZWY1ZjkuLjVjNGE1NGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2NvcmUvc2Rpby5jCisrKyBiL2RyaXZlcnMvbW1jL2NvcmUvc2Rpby5jCkBAIC02MjcsMTUgKzYyNywyNyBAQAogCiBzdGF0aWMgaW50IG1tY19zZGlvX3Jlc3VtZShzdHJ1Y3QgbW1jX2hvc3QgKmhvc3QpCiB7Ci0JaW50IGksIGVycjsKKwlpbnQgaSwgZXJyID0gMDsKIAogCUJVR19PTighaG9zdCk7CiAJQlVHX09OKCFob3N0LT5jYXJkKTsKIAogCS8qIEJhc2ljIGNhcmQgcmVpbml0aWFsaXphdGlvbi4gKi8KIAltbWNfY2xhaW1faG9zdChob3N0KTsKLQllcnIgPSBtbWNfc2Rpb19pbml0X2NhcmQoaG9zdCwgaG9zdC0+b2NyLCBob3N0LT5jYXJkLAorCisJLyogTm8gbmVlZCB0byByZWluaXRpYWxpemUgcG93ZXJlZC1yZXN1bWVkIG5vbnJlbW92YWJsZSBjYXJkcyAqLworCWlmIChtbWNfY2FyZF9pc19yZW1vdmFibGUoaG9zdCkgfHwgIW1tY19jYXJkX2lzX3Bvd2VyZWRfcmVzdW1lZChob3N0KSkKKwkJZXJyID0gbW1jX3NkaW9faW5pdF9jYXJkKGhvc3QsIGhvc3QtPm9jciwgaG9zdC0+Y2FyZCwKIAkJCQkgKGhvc3QtPnBtX2ZsYWdzICYgTU1DX1BNX0tFRVBfUE9XRVIpKTsKKwllbHNlIGlmIChtbWNfY2FyZF9pc19wb3dlcmVkX3Jlc3VtZWQoaG9zdCkpIHsKKwkJLyogV2UgbWF5IGhhdmUgc3dpdGNoZWQgdG8gMS1iaXQgbW9kZSBkdXJpbmcgc3VzcGVuZCAqLworCQllcnIgPSBzZGlvX2VuYWJsZV80Yml0X2J1cyhob3N0LT5jYXJkKTsKKwkJaWYgKGVyciA+IDApIHsKKwkJCW1tY19zZXRfYnVzX3dpZHRoKGhvc3QsIE1NQ19CVVNfV0lEVEhfNCk7CisJCQllcnIgPSAwOworCQl9CisJfQorCiAJaWYgKCFlcnIgJiYgaG9zdC0+c2Rpb19pcnFzKQogCQltbWNfc2lnbmFsX3NkaW9faXJxKGhvc3QpOwogCW1tY19yZWxlYXNlX2hvc3QoaG9zdCk7CkBAIC02OTAsMTYgKzcwMiwyMiBAQAogLyoKICAqIFN0YXJ0aW5nIHBvaW50IGZvciBTRElPIGNhcmQgaW5pdC4KICAqLwotaW50IG1tY19hdHRhY2hfc2RpbyhzdHJ1Y3QgbW1jX2hvc3QgKmhvc3QsIHUzMiBvY3IpCitpbnQgbW1jX2F0dGFjaF9zZGlvKHN0cnVjdCBtbWNfaG9zdCAqaG9zdCkKIHsKLQlpbnQgZXJyOwotCWludCBpLCBmdW5jczsKKwlpbnQgZXJyLCBpLCBmdW5jczsKKwl1MzIgb2NyOwogCXN0cnVjdCBtbWNfY2FyZCAqY2FyZDsKIAogCUJVR19PTighaG9zdCk7CiAJV0FSTl9PTighaG9zdC0+Y2xhaW1lZCk7CiAKKwllcnIgPSBtbWNfc2VuZF9pb19vcF9jb25kKGhvc3QsIDAsICZvY3IpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKIAltbWNfYXR0YWNoX2J1cyhob3N0LCAmbW1jX3NkaW9fb3BzKTsKKwlpZiAoaG9zdC0+b2NyX2F2YWlsX3NkaW8pCisJCWhvc3QtPm9jcl9hdmFpbCA9IGhvc3QtPm9jcl9hdmFpbF9zZGlvOwogCiAJLyoKIAkgKiBTYW5pdHkgY2hlY2sgdGhlIHZvbHRhZ2VzIHRoYXQgdGhlIGNhcmQgY2xhaW1zIHRvCkBAIC03NjksMTIgKzc4NywxMiBAQAogCQkJcG1fcnVudGltZV9lbmFibGUoJmNhcmQtPnNkaW9fZnVuY1tpXS0+ZGV2KTsKIAl9CiAKLQltbWNfcmVsZWFzZV9ob3N0KGhvc3QpOwotCiAJLyoKIAkgKiBGaXJzdCBhZGQgdGhlIGNhcmQgdG8gdGhlIGRyaXZlciBtb2RlbC4uLgogCSAqLworCW1tY19yZWxlYXNlX2hvc3QoaG9zdCk7CiAJZXJyID0gbW1jX2FkZF9jYXJkKGhvc3QtPmNhcmQpOworCW1tY19jbGFpbV9ob3N0KGhvc3QpOwogCWlmIChlcnIpCiAJCWdvdG8gcmVtb3ZlX2FkZGVkOwogCkBAIC03OTIsMTUgKzgxMCwxNyBAQAogCiByZW1vdmVfYWRkZWQ6CiAJLyogUmVtb3ZlIHdpdGhvdXQgbG9jayBpZiB0aGUgZGV2aWNlIGhhcyBiZWVuIGFkZGVkLiAqLworCW1tY19yZWxlYXNlX2hvc3QoaG9zdCk7CiAJbW1jX3NkaW9fcmVtb3ZlKGhvc3QpOwogCW1tY19jbGFpbV9ob3N0KGhvc3QpOwogcmVtb3ZlOgogCS8qIEFuZCB3aXRoIGxvY2sgaWYgaXQgaGFzbid0IGJlZW4gYWRkZWQuICovCisJbW1jX3JlbGVhc2VfaG9zdChob3N0KTsKIAlpZiAoaG9zdC0+Y2FyZCkKIAkJbW1jX3NkaW9fcmVtb3ZlKGhvc3QpOworCW1tY19jbGFpbV9ob3N0KGhvc3QpOwogZXJyOgogCW1tY19kZXRhY2hfYnVzKGhvc3QpOwotCW1tY19yZWxlYXNlX2hvc3QoaG9zdCk7CiAKIAlwcmludGsoS0VSTl9FUlIgIiVzOiBlcnJvciAlZCB3aGlsc3QgaW5pdGlhbGlzaW5nIFNESU8gY2FyZFxuIiwKIAkJbW1jX2hvc3RuYW1lKGhvc3QpLCBlcnIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvY29yZS9zZGlvX2J1cy5jIGIvZHJpdmVycy9tbWMvY29yZS9zZGlvX2J1cy5jCmluZGV4IDIwM2RhNDQuLmQyOWI5YzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2NvcmUvc2Rpb19idXMuYworKysgYi9kcml2ZXJzL21tYy9jb3JlL3NkaW9fYnVzLmMKQEAgLTE5Nyw0NCArMTk3LDEyIEBACiAKICNpZmRlZiBDT05GSUdfUE1fUlVOVElNRQogCi1zdGF0aWMgaW50IHNkaW9fYnVzX3BtX3ByZXBhcmUoc3RydWN0IGRldmljZSAqZGV2KQotewotCXN0cnVjdCBzZGlvX2Z1bmMgKmZ1bmMgPSBkZXZfdG9fc2Rpb19mdW5jKGRldik7Ci0KLQkvKgotCSAqIFJlc3VtZSBhbiBTRElPIGRldmljZSB3aGljaCB3YXMgc3VzcGVuZGVkIGF0IHJ1biB0aW1lIGF0IHRoaXMKLQkgKiBwb2ludCwgaW4gb3JkZXIgdG8gYWxsb3cgc3RhbmRhcmQgU0RJTyBzdXNwZW5kL3Jlc3VtZSBwYXRocwotCSAqIHRvIGtlZXAgd29ya2luZyBhcyB1c3VhbC4KLQkgKgotCSAqIFVsdGltYXRlbHksIHRoZSBTRElPIGRyaXZlciBpdHNlbGYgd2lsbCBkZWNpZGUgKGluIGl0cwotCSAqIHN1c3BlbmQgaGFuZGxlciwgb3IgbGFjayB0aGVyZW9mKSB3aGV0aGVyIHRoZSBjYXJkIHNob3VsZCBiZQotCSAqIHJlbW92ZWQgb3Iga2VwdCwgYW5kIGlmIGtlcHQsIGF0IHdoYXQgcG93ZXIgc3RhdGUuCi0JICoKLQkgKiBBdCB0aGlzIHBvaW50LCBQTSBjb3JlIGhhdmUgaW5jcmVhc2VkIG91ciB1c2UgY291bnQsIHNvIGl0J3MKLQkgKiBzYWZlIHRvIGRpcmVjdGx5IHJlc3VtZSB0aGUgZGV2aWNlLiBBZnRlciBzeXN0ZW0gaXMgcmVzdW1lZAotCSAqIGFnYWluLCBQTSBjb3JlIHdpbGwgZHJvcCBiYWNrIGl0cyBydW50aW1lIFBNIHVzZSBjb3VudCwgYW5kIGlmCi0JICogbmVlZGVkIGRldmljZSB3aWxsIGJlIHN1c3BlbmRlZCBhZ2Fpbi4KLQkgKgotCSAqIFRoZSBlbmQgcmVzdWx0IGlzIGd1YXJhbnRlZWQgdG8gYmUgYSBwb3dlciBzdGF0ZSB0aGF0IGlzCi0JICogY29oZXJlbnQgd2l0aCB0aGUgZGV2aWNlJ3MgcnVudGltZSBQTSB1c2UgY291bnQuCi0JICoKLQkgKiBUaGUgcmV0dXJuIHZhbHVlIG9mIHBtX3J1bnRpbWVfcmVzdW1lIGlzIGRlbGliZXJhdGVseSB1bmNoZWNrZWQKLQkgKiBzaW5jZSB0aGVyZSBpcyBsaXR0bGUgcG9pbnQgaW4gZmFpbGluZyBzeXN0ZW0gc3VzcGVuZCBpZiBhCi0JICogZGV2aWNlIGNhbid0IGJlIHJlc3VtZWQuCi0JICovCi0JaWYgKGZ1bmMtPmNhcmQtPmhvc3QtPmNhcHMgJiBNTUNfQ0FQX1BPV0VSX09GRl9DQVJEKQotCQlwbV9ydW50aW1lX3Jlc3VtZShkZXYpOwotCi0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyBzZGlvX2J1c19wbV9vcHMgPSB7CiAJU0VUX1JVTlRJTUVfUE1fT1BTKAogCQlwbV9nZW5lcmljX3J1bnRpbWVfc3VzcGVuZCwKIAkJcG1fZ2VuZXJpY19ydW50aW1lX3Jlc3VtZSwKIAkJcG1fZ2VuZXJpY19ydW50aW1lX2lkbGUKIAkpCi0JLnByZXBhcmUgPSBzZGlvX2J1c19wbV9wcmVwYXJlLAogfTsKIAogI2RlZmluZSBTRElPX1BNX09QU19QVFIJKCZzZGlvX2J1c19wbV9vcHMpCmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9ob3N0L0tjb25maWcgYi9kcml2ZXJzL21tYy9ob3N0L0tjb25maWcKaW5kZXggZDYxOGU4Ni4uYzIyYTRjMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvaG9zdC9LY29uZmlnCisrKyBiL2RyaXZlcnMvbW1jL2hvc3QvS2NvbmZpZwpAQCAtODMsNyArODMsNyBAQAogCiBjb25maWcgTU1DX1NESENJX09GCiAJdHJpc3RhdGUgIlNESENJIHN1cHBvcnQgb24gT3BlbkZpcm13YXJlIHBsYXRmb3JtcyIKLQlkZXBlbmRzIG9uIE1NQ19TREhDSSAmJiBQUENfT0YKKwlkZXBlbmRzIG9uIE1NQ19TREhDSSAmJiBPRgogCWhlbHAKIAkgIFRoaXMgc2VsZWN0cyB0aGUgT0Ygc3VwcG9ydCBmb3IgU2VjdXJlIERpZ2l0YWwgSG9zdCBDb250cm9sbGVyCiAJICBJbnRlcmZhY2VzLgpAQCAtOTMsNiArOTMsNyBAQAogY29uZmlnIE1NQ19TREhDSV9PRl9FU0RIQwogCWJvb2wgIlNESENJIE9GIHN1cHBvcnQgZm9yIHRoZSBGcmVlc2NhbGUgZVNESEMgY29udHJvbGxlciIKIAlkZXBlbmRzIG9uIE1NQ19TREhDSV9PRgorCWRlcGVuZHMgb24gUFBDX09GCiAJc2VsZWN0IE1NQ19TREhDSV9CSUdfRU5ESUFOXzMyQklUX0JZVEVfU1dBUFBFUgogCWhlbHAKIAkgIFRoaXMgc2VsZWN0cyB0aGUgRnJlZXNjYWxlIGVTREhDIGNvbnRyb2xsZXIgc3VwcG9ydC4KQEAgLTEwMiw2ICsxMDMsNyBAQAogY29uZmlnIE1NQ19TREhDSV9PRl9ITFdECiAJYm9vbCAiU0RIQ0kgT0Ygc3VwcG9ydCBmb3IgdGhlIE5pbnRlbmRvIFdpaSBTREhDSSBjb250cm9sbGVycyIKIAlkZXBlbmRzIG9uIE1NQ19TREhDSV9PRgorCWRlcGVuZHMgb24gUFBDX09GCiAJc2VsZWN0IE1NQ19TREhDSV9CSUdfRU5ESUFOXzMyQklUX0JZVEVfU1dBUFBFUgogCWhlbHAKIAkgIFRoaXMgc2VsZWN0cyB0aGUgU2VjdXJlIERpZ2l0YWwgSG9zdCBDb250cm9sbGVyIEludGVyZmFjZSAoU0RIQ0kpCkBAIC0xNDAsNiArMTQyLDI3IEBACiAKIAkgIElmIHVuc3VyZSwgc2F5IE4uCiAKK2NvbmZpZyBNTUNfU0RIQ0lfRE9WRQorCWJvb2wgIlNESENJIHN1cHBvcnQgb24gTWFydmVsbCdzIERvdmUgU29DIgorCWRlcGVuZHMgb24gQVJDSF9ET1ZFCisJZGVwZW5kcyBvbiBNTUNfU0RIQ0lfUExURk0KKwlzZWxlY3QgTU1DX1NESENJX0lPX0FDQ0VTU09SUworCWhlbHAKKwkgIFRoaXMgc2VsZWN0cyB0aGUgU2VjdXJlIERpZ2l0YWwgSG9zdCBDb250cm9sbGVyIEludGVyZmFjZSBpbgorCSAgTWFydmVsbCdzIERvdmUgU29DLgorCisJICBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgTU1DX1NESENJX1RFR1JBCisJdHJpc3RhdGUgIlNESENJIHBsYXRmb3JtIHN1cHBvcnQgZm9yIHRoZSBUZWdyYSBTRC9NTUMgQ29udHJvbGxlciIKKwlkZXBlbmRzIG9uIE1NQ19TREhDSV9QTFRGTSAmJiBBUkNIX1RFR1JBCisJc2VsZWN0IE1NQ19TREhDSV9JT19BQ0NFU1NPUlMKKwloZWxwCisJICBUaGlzIHNlbGVjdHMgdGhlIFRlZ3JhIFNEL01NQyBjb250cm9sbGVyLiBJZiB5b3UgaGF2ZSBhIFRlZ3JhCisJICBwbGF0Zm9ybSB3aXRoIFNEIG9yIE1NQyBkZXZpY2VzLCBzYXkgWSBvciBNIGhlcmUuCisKKwkgIElmIHVuc3VyZSwgc2F5IE4uCisKIGNvbmZpZyBNTUNfU0RIQ0lfUzNDCiAJdHJpc3RhdGUgIlNESENJIHN1cHBvcnQgb24gU2Ftc3VuZyBTM0MgU29DIgogCWRlcGVuZHMgb24gTU1DX1NESENJICYmIFBMQVRfU0FNU1VORwpAQCAtNDU4LDYgKzQ4MSwyMiBAQAogCWhlbHAKIAkgIElmIHlvdSBzYXkgeWVzIGhlcmUgU0QtQ2FyZHMgbWF5IHdvcmsgb24gdGhlIEVaa2l0LgogCitjb25maWcgTU1DX0RXCisJdHJpc3RhdGUgIlN5bm9wc3lzIERlc2lnbldhcmUgTWVtb3J5IENhcmQgSW50ZXJmYWNlIgorCWRlcGVuZHMgb24gQVJNCisJaGVscAorCSAgVGhpcyBzZWxlY3RzIHN1cHBvcnQgZm9yIHRoZSBTeW5vcHN5cyBEZXNpZ25XYXJlIE1vYmlsZSBTdG9yYWdlIElQCisJICBibG9jaywgdGhpcyBwcm92aWRlcyBob3N0IHN1cHBvcnQgZm9yIFNEIGFuZCBNTUMgaW50ZXJmYWNlcywgaW4gYm90aAorCSAgUElPIGFuZCBleHRlcm5hbCBETUEgbW9kZXMuCisKK2NvbmZpZyBNTUNfRFdfSURNQUMKKwlib29sICJJbnRlcm5hbCBETUFDIGludGVyZmFjZSIKKwlkZXBlbmRzIG9uIE1NQ19EVworCWhlbHAKKwkgIFRoaXMgc2VsZWN0cyBzdXBwb3J0IGZvciB0aGUgaW50ZXJuYWwgRE1BQyBibG9jayB3aXRoaW4gdGhlIFN5bm9wc3lzCisJICBEZXNpZ253YXJlIE1vYmlsZSBTdG9yYWdlIElQIGJsb2NrLiBUaGlzIGRpc2FibGVzIHRoZSBleHRlcm5hbCBETUEKKwkgIGludGVyZmFjZS4KKwogY29uZmlnIE1NQ19TSF9NTUNJRgogCXRyaXN0YXRlICJTdXBlckggSW50ZXJuYWwgTU1DSUYgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIE1NQ19CTE9DSyAmJiAoU1VQRVJIIHx8IEFSQ0hfU0hNT0JJTEUpCmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9ob3N0L01ha2VmaWxlIGIvZHJpdmVycy9tbWMvaG9zdC9NYWtlZmlsZQppbmRleCA3YjY0NWZmLi5lODM0ZmIyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9ob3N0L01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbW1jL2hvc3QvTWFrZWZpbGUKQEAgLTMxLDYgKzMxLDcgQEAKIG9iai0kKENPTkZJR19NTUNfQ0I3MTApCSs9IGNiNzEwLW1tYy5vCiBvYmotJChDT05GSUdfTU1DX1ZJQV9TRE1NQykJKz0gdmlhLXNkbW1jLm8KIG9iai0kKENPTkZJR19TREhfQkZJTikJCSs9IGJmaW5fc2RoLm8KK29iai0kKENPTkZJR19NTUNfRFcpCQkrPSBkd19tbWMubwogb2JqLSQoQ09ORklHX01NQ19TSF9NTUNJRikJKz0gc2hfbW1jaWYubwogb2JqLSQoQ09ORklHX01NQ19KWjQ3NDApCSs9IGp6NDc0MF9tbWMubwogb2JqLSQoQ09ORklHX01NQ19VU0hDKQkJKz0gdXNoYy5vCkBAIC0zOSw2ICs0MCw4IEBACiBzZGhjaS1wbGF0Zm9ybS15CQkJCTo9IHNkaGNpLXBsdGZtLm8KIHNkaGNpLXBsYXRmb3JtLSQoQ09ORklHX01NQ19TREhDSV9DTlMzWFhYKQkrPSBzZGhjaS1jbnMzeHh4Lm8KIHNkaGNpLXBsYXRmb3JtLSQoQ09ORklHX01NQ19TREhDSV9FU0RIQ19JTVgpCSs9IHNkaGNpLWVzZGhjLWlteC5vCitzZGhjaS1wbGF0Zm9ybS0kKENPTkZJR19NTUNfU0RIQ0lfRE9WRSkJCSs9IHNkaGNpLWRvdmUubworc2RoY2ktcGxhdGZvcm0tJChDT05GSUdfTU1DX1NESENJX1RFR1JBKQkrPSBzZGhjaS10ZWdyYS5vCiAKIG9iai0kKENPTkZJR19NTUNfU0RIQ0lfT0YpCSs9IHNkaGNpLW9mLm8KIHNkaGNpLW9mLXkJCQkJOj0gc2RoY2ktb2YtY29yZS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9ob3N0L2RhdmluY2lfbW1jLmMgYi9kcml2ZXJzL21tYy9ob3N0L2RhdmluY2lfbW1jLmMKaW5kZXggZTE1NTQ3Yy4uMDA3NmM3NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvaG9zdC9kYXZpbmNpX21tYy5jCisrKyBiL2RyaXZlcnMvbW1jL2hvc3QvZGF2aW5jaV9tbWMuYwpAQCAtNjYsOCArNjYsOCBAQAogI2RlZmluZSBEQVZJTkNJX01NQ0JMTkMgICAgICAweDYwCiAjZGVmaW5lIERBVklOQ0lfU0RJT0NUTCAgICAgIDB4NjQKICNkZWZpbmUgREFWSU5DSV9TRElPU1QwICAgICAgMHg2OAotI2RlZmluZSBEQVZJTkNJX1NESU9FTiAgICAgICAweDZDCi0jZGVmaW5lIERBVklOQ0lfU0RJT1NUICAgICAgIDB4NzAKKyNkZWZpbmUgREFWSU5DSV9TRElPSUVOICAgICAgMHg2QworI2RlZmluZSBEQVZJTkNJX1NESU9JU1QgICAgICAweDcwCiAjZGVmaW5lIERBVklOQ0lfTU1DRklGT0NUTCAgIDB4NzQgLyogRklGTyBDb250cm9sIFJlZ2lzdGVyICAgICAgICAgICAgICovCiAKIC8qIERBVklOQ0lfTU1DQ1RMIGRlZmluaXRpb25zICovCkBAIC0xMzEsNiArMTMxLDE0IEBACiAjZGVmaW5lIE1NQ0ZJRk9DVExfQUNDV0RfMiAgICAoMiA8PCAzKSAvKiBhY2Nlc3Mgd2lkdGggb2YgMiBieXRlcyAgICAqLwogI2RlZmluZSBNTUNGSUZPQ1RMX0FDQ1dEXzEgICAgKDMgPDwgMykgLyogYWNjZXNzIHdpZHRoIG9mIDEgYnl0ZSAgICAgKi8KIAorLyogREFWSU5DSV9TRElPU1QwIGRlZmluaXRpb25zICovCisjZGVmaW5lIFNESU9TVDBfREFUMV9ISSAgICAgICBCSVQoMCkKKworLyogREFWSU5DSV9TRElPSUVOIGRlZmluaXRpb25zICovCisjZGVmaW5lIFNESU9JRU5fSU9JTlRFTiAgICAgICBCSVQoMCkKKworLyogREFWSU5DSV9TRElPSVNUIGRlZmluaXRpb25zICovCisjZGVmaW5lIFNESU9JU1RfSU9JTlQgICAgICAgICBCSVQoMCkKIAogLyogTU1DU0QgSW5pdCBjbG9jayBpbiBIeiBpbiBvcGVuZHJhaW4gbW9kZSAqLwogI2RlZmluZSBNTUNTRF9JTklUX0NMT0NLCQkyMDAwMDAKQEAgLTE2NCw3ICsxNzIsNyBAQAogCXVuc2lnbmVkIGludCBtbWNfaW5wdXRfY2xrOwogCXZvaWQgX19pb21lbSAqYmFzZTsKIAlzdHJ1Y3QgcmVzb3VyY2UgKm1lbV9yZXM7Ci0JaW50IGlycTsKKwlpbnQgbW1jX2lycSwgc2Rpb19pcnE7CiAJdW5zaWduZWQgY2hhciBidXNfbW9kZTsKIAogI2RlZmluZSBEQVZJTkNJX01NQ19EQVRBRElSX05PTkUJMApAQCAtMTg0LDYgKzE5Miw3IEBACiAJdTMyIHJ4ZG1hLCB0eGRtYTsKIAlib29sIHVzZV9kbWE7CiAJYm9vbCBkb19kbWE7CisJYm9vbCBzZGlvX2ludDsKIAogCS8qIFNjYXR0ZXJsaXN0IERNQSB1c2VzIG9uZSBvciBtb3JlIHBhcmFtZXRlciBSQU0gZW50cmllczoKIAkgKiB0aGUgbWFpbiBvbmUgKGFzc29jaWF0ZWQgd2l0aCByeGRtYSBvciB0eGRtYSkgcGx1cyB6ZXJvIG9yCkBAIC00ODAsNyArNDg5LDcgQEAKIAlzdHJ1Y3Qgc2NhdHRlcmxpc3QJKnNnOwogCXVuc2lnbmVkCQlzZ19sZW47CiAJdW5zaWduZWQJCWJ5dGVzX2xlZnQgPSBob3N0LT5ieXRlc19sZWZ0OwotCWNvbnN0IHVuc2lnbmVkCQlzaGlmdCA9IGZmcyhyd190aHJlc2hvbGQpIC0gMTs7CisJY29uc3QgdW5zaWduZWQJCXNoaWZ0ID0gZmZzKHJ3X3RocmVzaG9sZCkgLSAxOwogCiAJaWYgKGhvc3QtPmRhdGFfZGlyID09IERBVklOQ0lfTU1DX0RBVEFESVJfV1JJVEUpIHsKIAkJdGVtcGxhdGUgPSAmaG9zdC0+dHhfdGVtcGxhdGU7CkBAIC04NjYsNiArODc1LDE5IEBACiB7CiAJaG9zdC0+ZGF0YSA9IE5VTEw7CiAKKwlpZiAoaG9zdC0+bW1jLT5jYXBzICYgTU1DX0NBUF9TRElPX0lSUSkgeworCQkvKgorCQkgKiBTRElPIEludGVycnVwdCBEZXRlY3Rpb24gd29yay1hcm91bmQgYXMgc3VnZ2VzdGVkIGJ5CisJCSAqIERhdmluY2kgRXJyYXRhIChUTVMzMjBETTM1NSBTaWxpY29uIFJldmlzaW9uIDEuMSBFcnJhdGEKKwkJICogMi4xLjYpOiBTaWduYWwgU0RJTyBpbnRlcnJ1cHQgb25seSBpZiBpdCBpcyBlbmFibGVkIGJ5IGNvcmUKKwkJICovCisJCWlmIChob3N0LT5zZGlvX2ludCAmJiAhKHJlYWRsKGhvc3QtPmJhc2UgKyBEQVZJTkNJX1NESU9TVDApICYKKwkJCQkJU0RJT1NUMF9EQVQxX0hJKSkgeworCQkJd3JpdGVsKFNESU9JU1RfSU9JTlQsIGhvc3QtPmJhc2UgKyBEQVZJTkNJX1NESU9JU1QpOworCQkJbW1jX3NpZ25hbF9zZGlvX2lycShob3N0LT5tbWMpOworCQl9CisJfQorCiAJaWYgKGhvc3QtPmRvX2RtYSkgewogCQlkYXZpbmNpX2Fib3J0X2RtYShob3N0KTsKIApAQCAtOTMyLDYgKzk1NCwyMSBAQAogCW1tY19kYXZpbmNpX3Jlc2V0X2N0cmwoaG9zdCwgMCk7CiB9CiAKK3N0YXRpYyBpcnFyZXR1cm5fdCBtbWNfZGF2aW5jaV9zZGlvX2lycShpbnQgaXJxLCB2b2lkICpkZXZfaWQpCit7CisJc3RydWN0IG1tY19kYXZpbmNpX2hvc3QgKmhvc3QgPSBkZXZfaWQ7CisJdW5zaWduZWQgaW50IHN0YXR1czsKKworCXN0YXR1cyA9IHJlYWRsKGhvc3QtPmJhc2UgKyBEQVZJTkNJX1NESU9JU1QpOworCWlmIChzdGF0dXMgJiBTRElPSVNUX0lPSU5UKSB7CisJCWRldl9kYmcobW1jX2Rldihob3N0LT5tbWMpLAorCQkJIlNESU8gaW50ZXJydXB0IHN0YXR1cyAleFxuIiwgc3RhdHVzKTsKKwkJd3JpdGVsKHN0YXR1cyB8IFNESU9JU1RfSU9JTlQsIGhvc3QtPmJhc2UgKyBEQVZJTkNJX1NESU9JU1QpOworCQltbWNfc2lnbmFsX3NkaW9faXJxKGhvc3QtPm1tYyk7CisJfQorCXJldHVybiBJUlFfSEFORExFRDsKK30KKwogc3RhdGljIGlycXJldHVybl90IG1tY19kYXZpbmNpX2lycShpbnQgaXJxLCB2b2lkICpkZXZfaWQpCiB7CiAJc3RydWN0IG1tY19kYXZpbmNpX2hvc3QgKmhvc3QgPSAoc3RydWN0IG1tY19kYXZpbmNpX2hvc3QgKilkZXZfaWQ7CkBAIC0xMDc2LDExICsxMTEzLDMyIEBACiAJcmV0dXJuIGNvbmZpZy0+Z2V0X3JvKHBkZXYtPmlkKTsKIH0KIAorc3RhdGljIHZvaWQgbW1jX2RhdmluY2lfZW5hYmxlX3NkaW9faXJxKHN0cnVjdCBtbWNfaG9zdCAqbW1jLCBpbnQgZW5hYmxlKQoreworCXN0cnVjdCBtbWNfZGF2aW5jaV9ob3N0ICpob3N0ID0gbW1jX3ByaXYobW1jKTsKKworCWlmIChlbmFibGUpIHsKKwkJaWYgKCEocmVhZGwoaG9zdC0+YmFzZSArIERBVklOQ0lfU0RJT1NUMCkgJiBTRElPU1QwX0RBVDFfSEkpKSB7CisJCQl3cml0ZWwoU0RJT0lTVF9JT0lOVCwgaG9zdC0+YmFzZSArIERBVklOQ0lfU0RJT0lTVCk7CisJCQltbWNfc2lnbmFsX3NkaW9faXJxKGhvc3QtPm1tYyk7CisJCX0gZWxzZSB7CisJCQlob3N0LT5zZGlvX2ludCA9IHRydWU7CisJCQl3cml0ZWwocmVhZGwoaG9zdC0+YmFzZSArIERBVklOQ0lfU0RJT0lFTikgfAorCQkJICAgICAgIFNESU9JRU5fSU9JTlRFTiwgaG9zdC0+YmFzZSArIERBVklOQ0lfU0RJT0lFTik7CisJCX0KKwl9IGVsc2UgeworCQlob3N0LT5zZGlvX2ludCA9IGZhbHNlOworCQl3cml0ZWwocmVhZGwoaG9zdC0+YmFzZSArIERBVklOQ0lfU0RJT0lFTikgJiB+U0RJT0lFTl9JT0lOVEVOLAorCQkgICAgICAgaG9zdC0+YmFzZSArIERBVklOQ0lfU0RJT0lFTik7CisJfQorfQorCiBzdGF0aWMgc3RydWN0IG1tY19ob3N0X29wcyBtbWNfZGF2aW5jaV9vcHMgPSB7CiAJLnJlcXVlc3QJPSBtbWNfZGF2aW5jaV9yZXF1ZXN0LAogCS5zZXRfaW9zCT0gbW1jX2RhdmluY2lfc2V0X2lvcywKIAkuZ2V0X2NkCQk9IG1tY19kYXZpbmNpX2dldF9jZCwKIAkuZ2V0X3JvCQk9IG1tY19kYXZpbmNpX2dldF9ybywKKwkuZW5hYmxlX3NkaW9faXJxID0gbW1jX2RhdmluY2lfZW5hYmxlX3NkaW9faXJxLAogfTsKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KQEAgLTEyMDksNyArMTI2Nyw4IEBACiAJCWhvc3QtPm5yX3NnID0gTUFYX05SX1NHOwogCiAJaG9zdC0+dXNlX2RtYSA9IHVzZV9kbWE7Ci0JaG9zdC0+aXJxID0gaXJxOworCWhvc3QtPm1tY19pcnEgPSBpcnE7CisJaG9zdC0+c2Rpb19pcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDEpOwogCiAJaWYgKGhvc3QtPnVzZV9kbWEgJiYgZGF2aW5jaV9hY3F1aXJlX2RtYV9jaGFubmVscyhob3N0KSAhPSAwKQogCQlob3N0LT51c2VfZG1hID0gMDsKQEAgLTEyNzAsNiArMTMyOSwxMyBAQAogCWlmIChyZXQpCiAJCWdvdG8gb3V0OwogCisJaWYgKGhvc3QtPnNkaW9faXJxID49IDApIHsKKwkJcmV0ID0gcmVxdWVzdF9pcnEoaG9zdC0+c2Rpb19pcnEsIG1tY19kYXZpbmNpX3NkaW9faXJxLCAwLAorCQkJCSAgbW1jX2hvc3RuYW1lKG1tYyksIGhvc3QpOworCQlpZiAoIXJldCkKKwkJCW1tYy0+Y2FwcyB8PSBNTUNfQ0FQX1NESU9fSVJROworCX0KKwogCXJlbmFtZV9yZWdpb24obWVtLCBtbWNfaG9zdG5hbWUobW1jKSk7CiAKIAlkZXZfaW5mbyhtbWNfZGV2KGhvc3QtPm1tYyksICJVc2luZyAlcywgJWQtYml0IG1vZGVcbiIsCkBAIC0xMzEzLDcgKzEzNzksOSBAQAogCQltbWNfZGF2aW5jaV9jcHVmcmVxX2RlcmVnaXN0ZXIoaG9zdCk7CiAKIAkJbW1jX3JlbW92ZV9ob3N0KGhvc3QtPm1tYyk7Ci0JCWZyZWVfaXJxKGhvc3QtPmlycSwgaG9zdCk7CisJCWZyZWVfaXJxKGhvc3QtPm1tY19pcnEsIGhvc3QpOworCQlpZiAoaG9zdC0+bW1jLT5jYXBzICYgTU1DX0NBUF9TRElPX0lSUSkKKwkJCWZyZWVfaXJxKGhvc3QtPnNkaW9faXJxLCBob3N0KTsKIAogCQlkYXZpbmNpX3JlbGVhc2VfZG1hX2NoYW5uZWxzKGhvc3QpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9ob3N0L2R3X21tYy5jIGIvZHJpdmVycy9tbWMvaG9zdC9kd19tbWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZmNjODI1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tbWMvaG9zdC9kd19tbWMuYwpAQCAtMCwwICsxLDE3OTYgQEAKKy8qCisgKiBTeW5vcHN5cyBEZXNpZ25XYXJlIE11bHRpbWVkaWEgQ2FyZCBJbnRlcmZhY2UgZHJpdmVyCisgKiAgKEJhc2VkIG9uIE5YUCBkcml2ZXIgZm9yIGxwYyAzMXh4KQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBOWFAgU2VtaWNvbmR1Y3RvcnMKKyAqIENvcHlyaWdodCAoQykgMjAwOSwgMjAxMCBJbWFnaW5hdGlvbiBUZWNobm9sb2dpZXMgTHRkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2F0dGVybGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L21tYy9ob3N0Lmg+CisjaW5jbHVkZSA8bGludXgvbW1jL21tYy5oPgorI2luY2x1ZGUgPGxpbnV4L21tYy9kd19tbWMuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKworI2luY2x1ZGUgImR3X21tYy5oIgorCisvKiBDb21tb24gZmxhZyBjb21iaW5hdGlvbnMgKi8KKyNkZWZpbmUgRFdfTUNJX0RBVEFfRVJST1JfRkxBR1MJKFNETU1DX0lOVF9EVE8gfCBTRE1NQ19JTlRfRENSQyB8IFwKKwkJCQkgU0RNTUNfSU5UX0hUTyB8IFNETU1DX0lOVF9TQkUgIHwgXAorCQkJCSBTRE1NQ19JTlRfRUJFKQorI2RlZmluZSBEV19NQ0lfQ01EX0VSUk9SX0ZMQUdTCShTRE1NQ19JTlRfUlRPIHwgU0RNTUNfSU5UX1JDUkMgfCBcCisJCQkJIFNETU1DX0lOVF9SRVNQX0VSUikKKyNkZWZpbmUgRFdfTUNJX0VSUk9SX0ZMQUdTCShEV19NQ0lfREFUQV9FUlJPUl9GTEFHUyB8IFwKKwkJCQkgRFdfTUNJX0NNRF9FUlJPUl9GTEFHUyAgfCBTRE1NQ19JTlRfSExFKQorI2RlZmluZSBEV19NQ0lfU0VORF9TVEFUVVMJMQorI2RlZmluZSBEV19NQ0lfUkVDVl9TVEFUVVMJMgorI2RlZmluZSBEV19NQ0lfRE1BX1RIUkVTSE9MRAkxNgorCisjaWZkZWYgQ09ORklHX01NQ19EV19JRE1BQworc3RydWN0IGlkbWFjX2Rlc2MgeworCXUzMgkJZGVzMDsJLyogQ29udHJvbCBEZXNjcmlwdG9yICovCisjZGVmaW5lIElETUFDX0RFUzBfRElDCUJJVCgxKQorI2RlZmluZSBJRE1BQ19ERVMwX0xECUJJVCgyKQorI2RlZmluZSBJRE1BQ19ERVMwX0ZECUJJVCgzKQorI2RlZmluZSBJRE1BQ19ERVMwX0NICUJJVCg0KQorI2RlZmluZSBJRE1BQ19ERVMwX0VSCUJJVCg1KQorI2RlZmluZSBJRE1BQ19ERVMwX0NFUwlCSVQoMzApCisjZGVmaW5lIElETUFDX0RFUzBfT1dOCUJJVCgzMSkKKworCXUzMgkJZGVzMTsJLyogQnVmZmVyIHNpemVzICovCisjZGVmaW5lIElETUFDX1NFVF9CVUZGRVIxX1NJWkUoZCwgcykgXAorCSgoZCktPmRlczEgPSAoKGQpLT5kZXMxICYgMHgwM2ZmYzAwMCkgfCAoKHMpICYgMHgzZmZmKSkKKworCXUzMgkJZGVzMjsJLyogYnVmZmVyIDEgcGh5c2ljYWwgYWRkcmVzcyAqLworCisJdTMyCQlkZXMzOwkvKiBidWZmZXIgMiBwaHlzaWNhbCBhZGRyZXNzICovCit9OworI2VuZGlmIC8qIENPTkZJR19NTUNfRFdfSURNQUMgKi8KKworLyoqCisgKiBzdHJ1Y3QgZHdfbWNpX3Nsb3QgLSBNTUMgc2xvdCBzdGF0ZQorICogQG1tYzogVGhlIG1tY19ob3N0IHJlcHJlc2VudGluZyB0aGlzIHNsb3QuCisgKiBAaG9zdDogVGhlIE1NQyBjb250cm9sbGVyIHRoaXMgc2xvdCBpcyB1c2luZy4KKyAqIEBjdHlwZTogQ2FyZCB0eXBlIGZvciB0aGlzIHNsb3QuCisgKiBAbXJxOiBtbWNfcmVxdWVzdCBjdXJyZW50bHkgYmVpbmcgcHJvY2Vzc2VkIG9yIHdhaXRpbmcgdG8gYmUKKyAqCXByb2Nlc3NlZCwgb3IgTlVMTCB3aGVuIHRoZSBzbG90IGlzIGlkbGUuCisgKiBAcXVldWVfbm9kZTogTGlzdCBub2RlIGZvciBwbGFjaW5nIHRoaXMgbm9kZSBpbiB0aGUgQHF1ZXVlIGxpc3Qgb2YKKyAqCSZzdHJ1Y3QgZHdfbWNpLgorICogQGNsb2NrOiBDbG9jayByYXRlIGNvbmZpZ3VyZWQgYnkgc2V0X2lvcygpLiBQcm90ZWN0ZWQgYnkgaG9zdC0+bG9jay4KKyAqIEBmbGFnczogUmFuZG9tIHN0YXRlIGJpdHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBzbG90LgorICogQGlkOiBOdW1iZXIgb2YgdGhpcyBzbG90LgorICogQGxhc3RfZGV0ZWN0X3N0YXRlOiBNb3N0IHJlY2VudGx5IG9ic2VydmVkIGNhcmQgZGV0ZWN0IHN0YXRlLgorICovCitzdHJ1Y3QgZHdfbWNpX3Nsb3QgeworCXN0cnVjdCBtbWNfaG9zdAkJKm1tYzsKKwlzdHJ1Y3QgZHdfbWNpCQkqaG9zdDsKKworCXUzMgkJCWN0eXBlOworCisJc3RydWN0IG1tY19yZXF1ZXN0CSptcnE7CisJc3RydWN0IGxpc3RfaGVhZAlxdWV1ZV9ub2RlOworCisJdW5zaWduZWQgaW50CQljbG9jazsKKwl1bnNpZ25lZCBsb25nCQlmbGFnczsKKyNkZWZpbmUgRFdfTU1DX0NBUkRfUFJFU0VOVAkwCisjZGVmaW5lIERXX01NQ19DQVJEX05FRURfSU5JVAkxCisJaW50CQkJaWQ7CisJaW50CQkJbGFzdF9kZXRlY3Rfc3RhdGU7Cit9OworCisjaWYgZGVmaW5lZChDT05GSUdfREVCVUdfRlMpCitzdGF0aWMgaW50IGR3X21jaV9yZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHZvaWQgKnYpCit7CisJc3RydWN0IGR3X21jaV9zbG90ICpzbG90ID0gcy0+cHJpdmF0ZTsKKwlzdHJ1Y3QgbW1jX3JlcXVlc3QgKm1ycTsKKwlzdHJ1Y3QgbW1jX2NvbW1hbmQgKmNtZDsKKwlzdHJ1Y3QgbW1jX2NvbW1hbmQgKnN0b3A7CisJc3RydWN0IG1tY19kYXRhCSpkYXRhOworCisJLyogTWFrZSBzdXJlIHdlIGdldCBhIGNvbnNpc3RlbnQgc25hcHNob3QgKi8KKwlzcGluX2xvY2tfYmgoJnNsb3QtPmhvc3QtPmxvY2spOworCW1ycSA9IHNsb3QtPm1ycTsKKworCWlmIChtcnEpIHsKKwkJY21kID0gbXJxLT5jbWQ7CisJCWRhdGEgPSBtcnEtPmRhdGE7CisJCXN0b3AgPSBtcnEtPnN0b3A7CisKKwkJaWYgKGNtZCkKKwkJCXNlcV9wcmludGYocywKKwkJCQkgICAiQ01EJXUoMHgleCkgZmxnICV4IHJzcCAleCAleCAleCAleCBlcnIgJWRcbiIsCisJCQkJICAgY21kLT5vcGNvZGUsIGNtZC0+YXJnLCBjbWQtPmZsYWdzLAorCQkJCSAgIGNtZC0+cmVzcFswXSwgY21kLT5yZXNwWzFdLCBjbWQtPnJlc3BbMl0sCisJCQkJICAgY21kLT5yZXNwWzJdLCBjbWQtPmVycm9yKTsKKwkJaWYgKGRhdGEpCisJCQlzZXFfcHJpbnRmKHMsICJEQVRBICV1IC8gJXUgKiAldSBmbGcgJXggZXJyICVkXG4iLAorCQkJCSAgIGRhdGEtPmJ5dGVzX3hmZXJlZCwgZGF0YS0+YmxvY2tzLAorCQkJCSAgIGRhdGEtPmJsa3N6LCBkYXRhLT5mbGFncywgZGF0YS0+ZXJyb3IpOworCQlpZiAoc3RvcCkKKwkJCXNlcV9wcmludGYocywKKwkJCQkgICAiQ01EJXUoMHgleCkgZmxnICV4IHJzcCAleCAleCAleCAleCBlcnIgJWRcbiIsCisJCQkJICAgc3RvcC0+b3Bjb2RlLCBzdG9wLT5hcmcsIHN0b3AtPmZsYWdzLAorCQkJCSAgIHN0b3AtPnJlc3BbMF0sIHN0b3AtPnJlc3BbMV0sIHN0b3AtPnJlc3BbMl0sCisJCQkJICAgc3RvcC0+cmVzcFsyXSwgc3RvcC0+ZXJyb3IpOworCX0KKworCXNwaW5fdW5sb2NrX2JoKCZzbG90LT5ob3N0LT5sb2NrKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGR3X21jaV9yZXFfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgZHdfbWNpX3JlcV9zaG93LCBpbm9kZS0+aV9wcml2YXRlKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZHdfbWNpX3JlcV9mb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkub3BlbgkJPSBkd19tY2lfcmVxX29wZW4sCisJLnJlYWQJCT0gc2VxX3JlYWQsCisJLmxsc2VlawkJPSBzZXFfbHNlZWssCisJLnJlbGVhc2UJPSBzaW5nbGVfcmVsZWFzZSwKK307CisKK3N0YXRpYyBpbnQgZHdfbWNpX3JlZ3Nfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHZvaWQgKnYpCit7CisJc2VxX3ByaW50ZihzLCAiU1RBVFVTOlx0MHglMDh4XG4iLCBTRE1NQ19TVEFUVVMpOworCXNlcV9wcmludGYocywgIlJJTlRTVFM6XHQweCUwOHhcbiIsIFNETU1DX1JJTlRTVFMpOworCXNlcV9wcmludGYocywgIkNNRDpcdDB4JTA4eFxuIiwgU0RNTUNfQ01EKTsKKwlzZXFfcHJpbnRmKHMsICJDVFJMOlx0MHglMDh4XG4iLCBTRE1NQ19DVFJMKTsKKwlzZXFfcHJpbnRmKHMsICJJTlRNQVNLOlx0MHglMDh4XG4iLCBTRE1NQ19JTlRNQVNLKTsKKwlzZXFfcHJpbnRmKHMsICJDTEtFTkE6XHQweCUwOHhcbiIsIFNETU1DX0NMS0VOQSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkd19tY2lfcmVnc19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBkd19tY2lfcmVnc19zaG93LCBpbm9kZS0+aV9wcml2YXRlKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZHdfbWNpX3JlZ3NfZm9wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm9wZW4JCT0gZHdfbWNpX3JlZ3Nfb3BlbiwKKwkucmVhZAkJPSBzZXFfcmVhZCwKKwkubGxzZWVrCQk9IHNlcV9sc2VlaywKKwkucmVsZWFzZQk9IHNpbmdsZV9yZWxlYXNlLAorfTsKKworc3RhdGljIHZvaWQgZHdfbWNpX2luaXRfZGVidWdmcyhzdHJ1Y3QgZHdfbWNpX3Nsb3QgKnNsb3QpCit7CisJc3RydWN0IG1tY19ob3N0CSptbWMgPSBzbG90LT5tbWM7CisJc3RydWN0IGR3X21jaSAqaG9zdCA9IHNsb3QtPmhvc3Q7CisJc3RydWN0IGRlbnRyeSAqcm9vdDsKKwlzdHJ1Y3QgZGVudHJ5ICpub2RlOworCisJcm9vdCA9IG1tYy0+ZGVidWdmc19yb290OworCWlmICghcm9vdCkKKwkJcmV0dXJuOworCisJbm9kZSA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoInJlZ3MiLCBTX0lSVVNSLCByb290LCBob3N0LAorCQkJCSAgICZkd19tY2lfcmVnc19mb3BzKTsKKwlpZiAoIW5vZGUpCisJCWdvdG8gZXJyOworCisJbm9kZSA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoInJlcSIsIFNfSVJVU1IsIHJvb3QsIHNsb3QsCisJCQkJICAgJmR3X21jaV9yZXFfZm9wcyk7CisJaWYgKCFub2RlKQorCQlnb3RvIGVycjsKKworCW5vZGUgPSBkZWJ1Z2ZzX2NyZWF0ZV91MzIoInN0YXRlIiwgU19JUlVTUiwgcm9vdCwgKHUzMiAqKSZob3N0LT5zdGF0ZSk7CisJaWYgKCFub2RlKQorCQlnb3RvIGVycjsKKworCW5vZGUgPSBkZWJ1Z2ZzX2NyZWF0ZV94MzIoInBlbmRpbmdfZXZlbnRzIiwgU19JUlVTUiwgcm9vdCwKKwkJCQkgICh1MzIgKikmaG9zdC0+cGVuZGluZ19ldmVudHMpOworCWlmICghbm9kZSkKKwkJZ290byBlcnI7CisKKwlub2RlID0gZGVidWdmc19jcmVhdGVfeDMyKCJjb21wbGV0ZWRfZXZlbnRzIiwgU19JUlVTUiwgcm9vdCwKKwkJCQkgICh1MzIgKikmaG9zdC0+Y29tcGxldGVkX2V2ZW50cyk7CisJaWYgKCFub2RlKQorCQlnb3RvIGVycjsKKworCXJldHVybjsKKworZXJyOgorCWRldl9lcnIoJm1tYy0+Y2xhc3NfZGV2LCAiZmFpbGVkIHRvIGluaXRpYWxpemUgZGVidWdmcyBmb3Igc2xvdFxuIik7Cit9CisjZW5kaWYgLyogZGVmaW5lZChDT05GSUdfREVCVUdfRlMpICovCisKK3N0YXRpYyB2b2lkIGR3X21jaV9zZXRfdGltZW91dChzdHJ1Y3QgZHdfbWNpICpob3N0KQoreworCS8qIHRpbWVvdXQgKG1heGltdW0pICovCisJbWNpX3dyaXRlbChob3N0LCBUTU9VVCwgMHhmZmZmZmZmZik7Cit9CisKK3N0YXRpYyB1MzIgZHdfbWNpX3ByZXBhcmVfY29tbWFuZChzdHJ1Y3QgbW1jX2hvc3QgKm1tYywgc3RydWN0IG1tY19jb21tYW5kICpjbWQpCit7CisJc3RydWN0IG1tY19kYXRhCSpkYXRhOworCXUzMiBjbWRyOworCWNtZC0+ZXJyb3IgPSAtRUlOUFJPR1JFU1M7CisKKwljbWRyID0gY21kLT5vcGNvZGU7CisKKwlpZiAoY21kciA9PSBNTUNfU1RPUF9UUkFOU01JU1NJT04pCisJCWNtZHIgfD0gU0RNTUNfQ01EX1NUT1A7CisJZWxzZQorCQljbWRyIHw9IFNETU1DX0NNRF9QUlZfREFUX1dBSVQ7CisKKwlpZiAoY21kLT5mbGFncyAmIE1NQ19SU1BfUFJFU0VOVCkgeworCQkvKiBXZSBleHBlY3QgYSByZXNwb25zZSwgc28gc2V0IHRoaXMgYml0ICovCisJCWNtZHIgfD0gU0RNTUNfQ01EX1JFU1BfRVhQOworCQlpZiAoY21kLT5mbGFncyAmIE1NQ19SU1BfMTM2KQorCQkJY21kciB8PSBTRE1NQ19DTURfUkVTUF9MT05HOworCX0KKworCWlmIChjbWQtPmZsYWdzICYgTU1DX1JTUF9DUkMpCisJCWNtZHIgfD0gU0RNTUNfQ01EX1JFU1BfQ1JDOworCisJZGF0YSA9IGNtZC0+ZGF0YTsKKwlpZiAoZGF0YSkgeworCQljbWRyIHw9IFNETU1DX0NNRF9EQVRfRVhQOworCQlpZiAoZGF0YS0+ZmxhZ3MgJiBNTUNfREFUQV9TVFJFQU0pCisJCQljbWRyIHw9IFNETU1DX0NNRF9TVFJNX01PREU7CisJCWlmIChkYXRhLT5mbGFncyAmIE1NQ19EQVRBX1dSSVRFKQorCQkJY21kciB8PSBTRE1NQ19DTURfREFUX1dSOworCX0KKworCXJldHVybiBjbWRyOworfQorCitzdGF0aWMgdm9pZCBkd19tY2lfc3RhcnRfY29tbWFuZChzdHJ1Y3QgZHdfbWNpICpob3N0LAorCQkJCSBzdHJ1Y3QgbW1jX2NvbW1hbmQgKmNtZCwgdTMyIGNtZF9mbGFncykKK3sKKwlob3N0LT5jbWQgPSBjbWQ7CisJZGV2X3ZkYmcoJmhvc3QtPnBkZXYtPmRldiwKKwkJICJzdGFydCBjb21tYW5kOiBBUkdSPTB4JTA4eCBDTURSPTB4JTA4eFxuIiwKKwkJIGNtZC0+YXJnLCBjbWRfZmxhZ3MpOworCisJbWNpX3dyaXRlbChob3N0LCBDTURBUkcsIGNtZC0+YXJnKTsKKwl3bWIoKTsKKworCW1jaV93cml0ZWwoaG9zdCwgQ01ELCBjbWRfZmxhZ3MgfCBTRE1NQ19DTURfU1RBUlQpOworfQorCitzdGF0aWMgdm9pZCBzZW5kX3N0b3BfY21kKHN0cnVjdCBkd19tY2kgKmhvc3QsIHN0cnVjdCBtbWNfZGF0YSAqZGF0YSkKK3sKKwlkd19tY2lfc3RhcnRfY29tbWFuZChob3N0LCBkYXRhLT5zdG9wLCBob3N0LT5zdG9wX2NtZHIpOworfQorCisvKiBETUEgaW50ZXJmYWNlIGZ1bmN0aW9ucyAqLworc3RhdGljIHZvaWQgZHdfbWNpX3N0b3BfZG1hKHN0cnVjdCBkd19tY2kgKmhvc3QpCit7CisJaWYgKGhvc3QtPnVzZV9kbWEpIHsKKwkJaG9zdC0+ZG1hX29wcy0+c3RvcChob3N0KTsKKwkJaG9zdC0+ZG1hX29wcy0+Y2xlYW51cChob3N0KTsKKwl9IGVsc2UgeworCQkvKiBEYXRhIHRyYW5zZmVyIHdhcyBzdG9wcGVkIGJ5IHRoZSBpbnRlcnJ1cHQgaGFuZGxlciAqLworCQlzZXRfYml0KEVWRU5UX1hGRVJfQ09NUExFVEUsICZob3N0LT5wZW5kaW5nX2V2ZW50cyk7CisJfQorfQorCisjaWZkZWYgQ09ORklHX01NQ19EV19JRE1BQworc3RhdGljIHZvaWQgZHdfbWNpX2RtYV9jbGVhbnVwKHN0cnVjdCBkd19tY2kgKmhvc3QpCit7CisJc3RydWN0IG1tY19kYXRhICpkYXRhID0gaG9zdC0+ZGF0YTsKKworCWlmIChkYXRhKQorCQlkbWFfdW5tYXBfc2coJmhvc3QtPnBkZXYtPmRldiwgZGF0YS0+c2csIGRhdGEtPnNnX2xlbiwKKwkJCSAgICAgKChkYXRhLT5mbGFncyAmIE1NQ19EQVRBX1dSSVRFKQorCQkJICAgICAgPyBETUFfVE9fREVWSUNFIDogRE1BX0ZST01fREVWSUNFKSk7Cit9CisKK3N0YXRpYyB2b2lkIGR3X21jaV9pZG1hY19zdG9wX2RtYShzdHJ1Y3QgZHdfbWNpICpob3N0KQoreworCXUzMiB0ZW1wOworCisJLyogRGlzYWJsZSBhbmQgcmVzZXQgdGhlIElETUFDIGludGVyZmFjZSAqLworCXRlbXAgPSBtY2lfcmVhZGwoaG9zdCwgQ1RSTCk7CisJdGVtcCAmPSB+U0RNTUNfQ1RSTF9VU0VfSURNQUM7CisJdGVtcCB8PSBTRE1NQ19DVFJMX0RNQV9SRVNFVDsKKwltY2lfd3JpdGVsKGhvc3QsIENUUkwsIHRlbXApOworCisJLyogU3RvcCB0aGUgSURNQUMgcnVubmluZyAqLworCXRlbXAgPSBtY2lfcmVhZGwoaG9zdCwgQk1PRCk7CisJdGVtcCAmPSB+U0RNTUNfSURNQUNfRU5BQkxFOworCW1jaV93cml0ZWwoaG9zdCwgQk1PRCwgdGVtcCk7Cit9CisKK3N0YXRpYyB2b2lkIGR3X21jaV9pZG1hY19jb21wbGV0ZV9kbWEoc3RydWN0IGR3X21jaSAqaG9zdCkKK3sKKwlzdHJ1Y3QgbW1jX2RhdGEgKmRhdGEgPSBob3N0LT5kYXRhOworCisJZGV2X3ZkYmcoJmhvc3QtPnBkZXYtPmRldiwgIkRNQSBjb21wbGV0ZVxuIik7CisKKwlob3N0LT5kbWFfb3BzLT5jbGVhbnVwKGhvc3QpOworCisJLyoKKwkgKiBJZiB0aGUgY2FyZCB3YXMgcmVtb3ZlZCwgZGF0YSB3aWxsIGJlIE5VTEwuIE5vIHBvaW50IGluIHRyeWluZyB0bworCSAqIHNlbmQgdGhlIHN0b3AgY29tbWFuZCBvciB3YWl0aW5nIGZvciBOQlVTWSBpbiB0aGlzIGNhc2UuCisJICovCisJaWYgKGRhdGEpIHsKKwkJc2V0X2JpdChFVkVOVF9YRkVSX0NPTVBMRVRFLCAmaG9zdC0+cGVuZGluZ19ldmVudHMpOworCQl0YXNrbGV0X3NjaGVkdWxlKCZob3N0LT50YXNrbGV0KTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGR3X21jaV90cmFuc2xhdGVfc2dsaXN0KHN0cnVjdCBkd19tY2kgKmhvc3QsIHN0cnVjdCBtbWNfZGF0YSAqZGF0YSwKKwkJCQkgICAgdW5zaWduZWQgaW50IHNnX2xlbikKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgaWRtYWNfZGVzYyAqZGVzYyA9IGhvc3QtPnNnX2NwdTsKKworCWZvciAoaSA9IDA7IGkgPCBzZ19sZW47IGkrKywgZGVzYysrKSB7CisJCXVuc2lnbmVkIGludCBsZW5ndGggPSBzZ19kbWFfbGVuKCZkYXRhLT5zZ1tpXSk7CisJCXUzMiBtZW1fYWRkciA9IHNnX2RtYV9hZGRyZXNzKCZkYXRhLT5zZ1tpXSk7CisKKwkJLyogU2V0IHRoZSBPV04gYml0IGFuZCBkaXNhYmxlIGludGVycnVwdHMgZm9yIHRoaXMgZGVzY3JpcHRvciAqLworCQlkZXNjLT5kZXMwID0gSURNQUNfREVTMF9PV04gfCBJRE1BQ19ERVMwX0RJQyB8IElETUFDX0RFUzBfQ0g7CisKKwkJLyogQnVmZmVyIGxlbmd0aCAqLworCQlJRE1BQ19TRVRfQlVGRkVSMV9TSVpFKGRlc2MsIGxlbmd0aCk7CisKKwkJLyogUGh5c2ljYWwgYWRkcmVzcyB0byBETUEgdG8vZnJvbSAqLworCQlkZXNjLT5kZXMyID0gbWVtX2FkZHI7CisJfQorCisJLyogU2V0IGZpcnN0IGRlc2NyaXB0b3IgKi8KKwlkZXNjID0gaG9zdC0+c2dfY3B1OworCWRlc2MtPmRlczAgfD0gSURNQUNfREVTMF9GRDsKKworCS8qIFNldCBsYXN0IGRlc2NyaXB0b3IgKi8KKwlkZXNjID0gaG9zdC0+c2dfY3B1ICsgKGkgLSAxKSAqIHNpemVvZihzdHJ1Y3QgaWRtYWNfZGVzYyk7CisJZGVzYy0+ZGVzMCAmPSB+KElETUFDX0RFUzBfQ0ggfCBJRE1BQ19ERVMwX0RJQyk7CisJZGVzYy0+ZGVzMCB8PSBJRE1BQ19ERVMwX0xEOworCisJd21iKCk7Cit9CisKK3N0YXRpYyB2b2lkIGR3X21jaV9pZG1hY19zdGFydF9kbWEoc3RydWN0IGR3X21jaSAqaG9zdCwgdW5zaWduZWQgaW50IHNnX2xlbikKK3sKKwl1MzIgdGVtcDsKKworCWR3X21jaV90cmFuc2xhdGVfc2dsaXN0KGhvc3QsIGhvc3QtPmRhdGEsIHNnX2xlbik7CisKKwkvKiBTZWxlY3QgSURNQUMgaW50ZXJmYWNlICovCisJdGVtcCA9IG1jaV9yZWFkbChob3N0LCBDVFJMKTsKKwl0ZW1wIHw9IFNETU1DX0NUUkxfVVNFX0lETUFDOworCW1jaV93cml0ZWwoaG9zdCwgQ1RSTCwgdGVtcCk7CisKKwl3bWIoKTsKKworCS8qIEVuYWJsZSB0aGUgSURNQUMgKi8KKwl0ZW1wID0gbWNpX3JlYWRsKGhvc3QsIEJNT0QpOworCXRlbXAgfD0gU0RNTUNfSURNQUNfRU5BQkxFOworCW1jaV93cml0ZWwoaG9zdCwgQk1PRCwgdGVtcCk7CisKKwkvKiBTdGFydCBpdCBydW5uaW5nICovCisJbWNpX3dyaXRlbChob3N0LCBQTERNTkQsIDEpOworfQorCitzdGF0aWMgaW50IGR3X21jaV9pZG1hY19pbml0KHN0cnVjdCBkd19tY2kgKmhvc3QpCit7CisJc3RydWN0IGlkbWFjX2Rlc2MgKnA7CisJaW50IGk7CisKKwkvKiBOdW1iZXIgb2YgZGVzY3JpcHRvcnMgaW4gdGhlIHJpbmcgYnVmZmVyICovCisJaG9zdC0+cmluZ19zaXplID0gUEFHRV9TSVpFIC8gc2l6ZW9mKHN0cnVjdCBpZG1hY19kZXNjKTsKKworCS8qIEZvcndhcmQgbGluayB0aGUgZGVzY3JpcHRvciBsaXN0ICovCisJZm9yIChpID0gMCwgcCA9IGhvc3QtPnNnX2NwdTsgaSA8IGhvc3QtPnJpbmdfc2l6ZSAtIDE7IGkrKywgcCsrKQorCQlwLT5kZXMzID0gaG9zdC0+c2dfZG1hICsgKHNpemVvZihzdHJ1Y3QgaWRtYWNfZGVzYykgKiAoaSArIDEpKTsKKworCS8qIFNldCB0aGUgbGFzdCBkZXNjcmlwdG9yIGFzIHRoZSBlbmQtb2YtcmluZyBkZXNjcmlwdG9yICovCisJcC0+ZGVzMyA9IGhvc3QtPnNnX2RtYTsKKwlwLT5kZXMwID0gSURNQUNfREVTMF9FUjsKKworCS8qIE1hc2sgb3V0IGludGVycnVwdHMgLSBnZXQgVHggJiBSeCBjb21wbGV0ZSBvbmx5ICovCisJbWNpX3dyaXRlbChob3N0LCBJRElOVEVOLCBTRE1NQ19JRE1BQ19JTlRfTkkgfCBTRE1NQ19JRE1BQ19JTlRfUkkgfAorCQkgICBTRE1NQ19JRE1BQ19JTlRfVEkpOworCisJLyogU2V0IHRoZSBkZXNjcmlwdG9yIGJhc2UgYWRkcmVzcyAqLworCW1jaV93cml0ZWwoaG9zdCwgREJBRERSLCBob3N0LT5zZ19kbWEpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGR3X21jaV9kbWFfb3BzIGR3X21jaV9pZG1hY19vcHMgPSB7CisJLmluaXQgPSBkd19tY2lfaWRtYWNfaW5pdCwKKwkuc3RhcnQgPSBkd19tY2lfaWRtYWNfc3RhcnRfZG1hLAorCS5zdG9wID0gZHdfbWNpX2lkbWFjX3N0b3BfZG1hLAorCS5jb21wbGV0ZSA9IGR3X21jaV9pZG1hY19jb21wbGV0ZV9kbWEsCisJLmNsZWFudXAgPSBkd19tY2lfZG1hX2NsZWFudXAsCit9OworI2VuZGlmIC8qIENPTkZJR19NTUNfRFdfSURNQUMgKi8KKworc3RhdGljIGludCBkd19tY2lfc3VibWl0X2RhdGFfZG1hKHN0cnVjdCBkd19tY2kgKmhvc3QsIHN0cnVjdCBtbWNfZGF0YSAqZGF0YSkKK3sKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnOworCXVuc2lnbmVkIGludCBpLCBkaXJlY3Rpb24sIHNnX2xlbjsKKwl1MzIgdGVtcDsKKworCS8qIElmIHdlIGRvbid0IGhhdmUgYSBjaGFubmVsLCB3ZSBjYW4ndCBkbyBETUEgKi8KKwlpZiAoIWhvc3QtPnVzZV9kbWEpCisJCXJldHVybiAtRU5PREVWOworCisJLyoKKwkgKiBXZSBkb24ndCBkbyBETUEgb24gImNvbXBsZXgiIHRyYW5zZmVycywgaS5lLiB3aXRoCisJICogbm9uLXdvcmQtYWxpZ25lZCBidWZmZXJzIG9yIGxlbmd0aHMuIEFsc28sIHdlIGRvbid0IGJvdGhlcgorCSAqIHdpdGggYWxsIHRoZSBETUEgc2V0dXAgb3ZlcmhlYWQgZm9yIHNob3J0IHRyYW5zZmVycy4KKwkgKi8KKwlpZiAoZGF0YS0+YmxvY2tzICogZGF0YS0+Ymxrc3ogPCBEV19NQ0lfRE1BX1RIUkVTSE9MRCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGRhdGEtPmJsa3N6ICYgMykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlmb3JfZWFjaF9zZyhkYXRhLT5zZywgc2csIGRhdGEtPnNnX2xlbiwgaSkgeworCQlpZiAoc2ctPm9mZnNldCAmIDMgfHwgc2ctPmxlbmd0aCAmIDMpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoZGF0YS0+ZmxhZ3MgJiBNTUNfREFUQV9SRUFEKQorCQlkaXJlY3Rpb24gPSBETUFfRlJPTV9ERVZJQ0U7CisJZWxzZQorCQlkaXJlY3Rpb24gPSBETUFfVE9fREVWSUNFOworCisJc2dfbGVuID0gZG1hX21hcF9zZygmaG9zdC0+cGRldi0+ZGV2LCBkYXRhLT5zZywgZGF0YS0+c2dfbGVuLAorCQkJICAgIGRpcmVjdGlvbik7CisKKwlkZXZfdmRiZygmaG9zdC0+cGRldi0+ZGV2LAorCQkgInNkIHNnX2NwdTogJSNseCBzZ19kbWE6ICUjbHggc2dfbGVuOiAlZFxuIiwKKwkJICh1bnNpZ25lZCBsb25nKWhvc3QtPnNnX2NwdSwgKHVuc2lnbmVkIGxvbmcpaG9zdC0+c2dfZG1hLAorCQkgc2dfbGVuKTsKKworCS8qIEVuYWJsZSB0aGUgRE1BIGludGVyZmFjZSAqLworCXRlbXAgPSBtY2lfcmVhZGwoaG9zdCwgQ1RSTCk7CisJdGVtcCB8PSBTRE1NQ19DVFJMX0RNQV9FTkFCTEU7CisJbWNpX3dyaXRlbChob3N0LCBDVFJMLCB0ZW1wKTsKKworCS8qIERpc2FibGUgUlgvVFggSVJRcywgbGV0IERNQSBoYW5kbGUgaXQgKi8KKwl0ZW1wID0gbWNpX3JlYWRsKGhvc3QsIElOVE1BU0spOworCXRlbXAgICY9IH4oU0RNTUNfSU5UX1JYRFIgfCBTRE1NQ19JTlRfVFhEUik7CisJbWNpX3dyaXRlbChob3N0LCBJTlRNQVNLLCB0ZW1wKTsKKworCWhvc3QtPmRtYV9vcHMtPnN0YXJ0KGhvc3QsIHNnX2xlbik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZHdfbWNpX3N1Ym1pdF9kYXRhKHN0cnVjdCBkd19tY2kgKmhvc3QsIHN0cnVjdCBtbWNfZGF0YSAqZGF0YSkKK3sKKwl1MzIgdGVtcDsKKworCWRhdGEtPmVycm9yID0gLUVJTlBST0dSRVNTOworCisJV0FSTl9PTihob3N0LT5kYXRhKTsKKwlob3N0LT5zZyA9IE5VTEw7CisJaG9zdC0+ZGF0YSA9IGRhdGE7CisKKwlpZiAoZHdfbWNpX3N1Ym1pdF9kYXRhX2RtYShob3N0LCBkYXRhKSkgeworCQlob3N0LT5zZyA9IGRhdGEtPnNnOworCQlob3N0LT5waW9fb2Zmc2V0ID0gMDsKKwkJaWYgKGRhdGEtPmZsYWdzICYgTU1DX0RBVEFfUkVBRCkKKwkJCWhvc3QtPmRpcl9zdGF0dXMgPSBEV19NQ0lfUkVDVl9TVEFUVVM7CisJCWVsc2UKKwkJCWhvc3QtPmRpcl9zdGF0dXMgPSBEV19NQ0lfU0VORF9TVEFUVVM7CisKKwkJdGVtcCA9IG1jaV9yZWFkbChob3N0LCBJTlRNQVNLKTsKKwkJdGVtcCB8PSBTRE1NQ19JTlRfVFhEUiB8IFNETU1DX0lOVF9SWERSOworCQltY2lfd3JpdGVsKGhvc3QsIElOVE1BU0ssIHRlbXApOworCisJCXRlbXAgPSBtY2lfcmVhZGwoaG9zdCwgQ1RSTCk7CisJCXRlbXAgJj0gflNETU1DX0NUUkxfRE1BX0VOQUJMRTsKKwkJbWNpX3dyaXRlbChob3N0LCBDVFJMLCB0ZW1wKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIG1jaV9zZW5kX2NtZChzdHJ1Y3QgZHdfbWNpX3Nsb3QgKnNsb3QsIHUzMiBjbWQsIHUzMiBhcmcpCit7CisJc3RydWN0IGR3X21jaSAqaG9zdCA9IHNsb3QtPmhvc3Q7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0ID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoNTAwKTsKKwl1bnNpZ25lZCBpbnQgY21kX3N0YXR1cyA9IDA7CisKKwltY2lfd3JpdGVsKGhvc3QsIENNREFSRywgYXJnKTsKKwl3bWIoKTsKKwltY2lfd3JpdGVsKGhvc3QsIENNRCwgU0RNTUNfQ01EX1NUQVJUIHwgY21kKTsKKworCXdoaWxlICh0aW1lX2JlZm9yZShqaWZmaWVzLCB0aW1lb3V0KSkgeworCQljbWRfc3RhdHVzID0gbWNpX3JlYWRsKGhvc3QsIENNRCk7CisJCWlmICghKGNtZF9zdGF0dXMgJiBTRE1NQ19DTURfU1RBUlQpKQorCQkJcmV0dXJuOworCX0KKwlkZXZfZXJyKCZzbG90LT5tbWMtPmNsYXNzX2RldiwKKwkJIlRpbWVvdXQgc2VuZGluZyBjb21tYW5kIChjbWQgJSN4IGFyZyAlI3ggc3RhdHVzICUjeClcbiIsCisJCWNtZCwgYXJnLCBjbWRfc3RhdHVzKTsKK30KKworc3RhdGljIHZvaWQgZHdfbWNpX3NldHVwX2J1cyhzdHJ1Y3QgZHdfbWNpX3Nsb3QgKnNsb3QpCit7CisJc3RydWN0IGR3X21jaSAqaG9zdCA9IHNsb3QtPmhvc3Q7CisJdTMyIGRpdjsKKworCWlmIChzbG90LT5jbG9jayAhPSBob3N0LT5jdXJyZW50X3NwZWVkKSB7CisJCWlmIChob3N0LT5idXNfaHogJSBzbG90LT5jbG9jaykKKwkJCS8qCisJCQkgKiBtb3ZlIHRoZSArIDEgYWZ0ZXIgdGhlIGRpdmlkZSB0byBwcmV2ZW50CisJCQkgKiBvdmVyLWNsb2NraW5nIHRoZSBjYXJkLgorCQkJICovCisJCQlkaXYgPSAoKGhvc3QtPmJ1c19oeiAvIHNsb3QtPmNsb2NrKSA+PiAxKSArIDE7CisJCWVsc2UKKwkJCWRpdiA9IChob3N0LT5idXNfaHogIC8gc2xvdC0+Y2xvY2spID4+IDE7CisKKwkJZGV2X2luZm8oJnNsb3QtPm1tYy0+Y2xhc3NfZGV2LAorCQkJICJCdXMgc3BlZWQgKHNsb3QgJWQpID0gJWRIeiAoc2xvdCByZXEgJWRIeiwgYWN0dWFsICVkSFoiCisJCQkgIiBkaXYgPSAlZClcbiIsIHNsb3QtPmlkLCBob3N0LT5idXNfaHosIHNsb3QtPmNsb2NrLAorCQkJIGRpdiA/ICgoaG9zdC0+YnVzX2h6IC8gZGl2KSA+PiAxKSA6IGhvc3QtPmJ1c19oeiwgZGl2KTsKKworCQkvKiBkaXNhYmxlIGNsb2NrICovCisJCW1jaV93cml0ZWwoaG9zdCwgQ0xLRU5BLCAwKTsKKwkJbWNpX3dyaXRlbChob3N0LCBDTEtTUkMsIDApOworCisJCS8qIGluZm9ybSBDSVUgKi8KKwkJbWNpX3NlbmRfY21kKHNsb3QsCisJCQkgICAgIFNETU1DX0NNRF9VUERfQ0xLIHwgU0RNTUNfQ01EX1BSVl9EQVRfV0FJVCwgMCk7CisKKwkJLyogc2V0IGNsb2NrIHRvIGRlc2lyZWQgc3BlZWQgKi8KKwkJbWNpX3dyaXRlbChob3N0LCBDTEtESVYsIGRpdik7CisKKwkJLyogaW5mb3JtIENJVSAqLworCQltY2lfc2VuZF9jbWQoc2xvdCwKKwkJCSAgICAgU0RNTUNfQ01EX1VQRF9DTEsgfCBTRE1NQ19DTURfUFJWX0RBVF9XQUlULCAwKTsKKworCQkvKiBlbmFibGUgY2xvY2sgKi8KKwkJbWNpX3dyaXRlbChob3N0LCBDTEtFTkEsIFNETU1DX0NMS0VOX0VOQUJMRSk7CisKKwkJLyogaW5mb3JtIENJVSAqLworCQltY2lfc2VuZF9jbWQoc2xvdCwKKwkJCSAgICAgU0RNTUNfQ01EX1VQRF9DTEsgfCBTRE1NQ19DTURfUFJWX0RBVF9XQUlULCAwKTsKKworCQlob3N0LT5jdXJyZW50X3NwZWVkID0gc2xvdC0+Y2xvY2s7CisJfQorCisJLyogU2V0IHRoZSBjdXJyZW50IHNsb3QgYnVzIHdpZHRoICovCisJbWNpX3dyaXRlbChob3N0LCBDVFlQRSwgc2xvdC0+Y3R5cGUpOworfQorCitzdGF0aWMgdm9pZCBkd19tY2lfc3RhcnRfcmVxdWVzdChzdHJ1Y3QgZHdfbWNpICpob3N0LAorCQkJCSBzdHJ1Y3QgZHdfbWNpX3Nsb3QgKnNsb3QpCit7CisJc3RydWN0IG1tY19yZXF1ZXN0ICptcnE7CisJc3RydWN0IG1tY19jb21tYW5kICpjbWQ7CisJc3RydWN0IG1tY19kYXRhCSpkYXRhOworCXUzMiBjbWRmbGFnczsKKworCW1ycSA9IHNsb3QtPm1ycTsKKwlpZiAoaG9zdC0+cGRhdGEtPnNlbGVjdF9zbG90KQorCQlob3N0LT5wZGF0YS0+c2VsZWN0X3Nsb3Qoc2xvdC0+aWQpOworCisJLyogU2xvdCBzcGVjaWZpYyB0aW1pbmcgYW5kIHdpZHRoIGFkanVzdG1lbnQgKi8KKwlkd19tY2lfc2V0dXBfYnVzKHNsb3QpOworCisJaG9zdC0+Y3VyX3Nsb3QgPSBzbG90OworCWhvc3QtPm1ycSA9IG1ycTsKKworCWhvc3QtPnBlbmRpbmdfZXZlbnRzID0gMDsKKwlob3N0LT5jb21wbGV0ZWRfZXZlbnRzID0gMDsKKwlob3N0LT5kYXRhX3N0YXR1cyA9IDA7CisKKwlkYXRhID0gbXJxLT5kYXRhOworCWlmIChkYXRhKSB7CisJCWR3X21jaV9zZXRfdGltZW91dChob3N0KTsKKwkJbWNpX3dyaXRlbChob3N0LCBCWVRDTlQsIGRhdGEtPmJsa3N6KmRhdGEtPmJsb2Nrcyk7CisJCW1jaV93cml0ZWwoaG9zdCwgQkxLU0laLCBkYXRhLT5ibGtzeik7CisJfQorCisJY21kID0gbXJxLT5jbWQ7CisJY21kZmxhZ3MgPSBkd19tY2lfcHJlcGFyZV9jb21tYW5kKHNsb3QtPm1tYywgY21kKTsKKworCS8qIHRoaXMgaXMgdGhlIGZpcnN0IGNvbW1hbmQsIHNlbmQgdGhlIGluaXRpYWxpemF0aW9uIGNsb2NrICovCisJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChEV19NTUNfQ0FSRF9ORUVEX0lOSVQsICZzbG90LT5mbGFncykpCisJCWNtZGZsYWdzIHw9IFNETU1DX0NNRF9JTklUOworCisJaWYgKGRhdGEpIHsKKwkJZHdfbWNpX3N1Ym1pdF9kYXRhKGhvc3QsIGRhdGEpOworCQl3bWIoKTsKKwl9CisKKwlkd19tY2lfc3RhcnRfY29tbWFuZChob3N0LCBjbWQsIGNtZGZsYWdzKTsKKworCWlmIChtcnEtPnN0b3ApCisJCWhvc3QtPnN0b3BfY21kciA9IGR3X21jaV9wcmVwYXJlX2NvbW1hbmQoc2xvdC0+bW1jLCBtcnEtPnN0b3ApOworfQorCitzdGF0aWMgdm9pZCBkd19tY2lfcXVldWVfcmVxdWVzdChzdHJ1Y3QgZHdfbWNpICpob3N0LCBzdHJ1Y3QgZHdfbWNpX3Nsb3QgKnNsb3QsCisJCQkJIHN0cnVjdCBtbWNfcmVxdWVzdCAqbXJxKQoreworCWRldl92ZGJnKCZzbG90LT5tbWMtPmNsYXNzX2RldiwgInF1ZXVlIHJlcXVlc3Q6IHN0YXRlPSVkXG4iLAorCQkgaG9zdC0+c3RhdGUpOworCisJc3Bpbl9sb2NrX2JoKCZob3N0LT5sb2NrKTsKKwlzbG90LT5tcnEgPSBtcnE7CisKKwlpZiAoaG9zdC0+c3RhdGUgPT0gU1RBVEVfSURMRSkgeworCQlob3N0LT5zdGF0ZSA9IFNUQVRFX1NFTkRJTkdfQ01EOworCQlkd19tY2lfc3RhcnRfcmVxdWVzdChob3N0LCBzbG90KTsKKwl9IGVsc2UgeworCQlsaXN0X2FkZF90YWlsKCZzbG90LT5xdWV1ZV9ub2RlLCAmaG9zdC0+cXVldWUpOworCX0KKworCXNwaW5fdW5sb2NrX2JoKCZob3N0LT5sb2NrKTsKK30KKworc3RhdGljIHZvaWQgZHdfbWNpX3JlcXVlc3Qoc3RydWN0IG1tY19ob3N0ICptbWMsIHN0cnVjdCBtbWNfcmVxdWVzdCAqbXJxKQoreworCXN0cnVjdCBkd19tY2lfc2xvdCAqc2xvdCA9IG1tY19wcml2KG1tYyk7CisJc3RydWN0IGR3X21jaSAqaG9zdCA9IHNsb3QtPmhvc3Q7CisKKwlXQVJOX09OKHNsb3QtPm1ycSk7CisKKwlpZiAoIXRlc3RfYml0KERXX01NQ19DQVJEX1BSRVNFTlQsICZzbG90LT5mbGFncykpIHsKKwkJbXJxLT5jbWQtPmVycm9yID0gLUVOT01FRElVTTsKKwkJbW1jX3JlcXVlc3RfZG9uZShtbWMsIG1ycSk7CisJCXJldHVybjsKKwl9CisKKwkvKiBXZSBkb24ndCBzdXBwb3J0IG11bHRpcGxlIGJsb2NrcyBvZiB3ZWlyZCBsZW5ndGhzLiAqLworCWR3X21jaV9xdWV1ZV9yZXF1ZXN0KGhvc3QsIHNsb3QsIG1ycSk7Cit9CisKK3N0YXRpYyB2b2lkIGR3X21jaV9zZXRfaW9zKHN0cnVjdCBtbWNfaG9zdCAqbW1jLCBzdHJ1Y3QgbW1jX2lvcyAqaW9zKQoreworCXN0cnVjdCBkd19tY2lfc2xvdCAqc2xvdCA9IG1tY19wcml2KG1tYyk7CisKKwkvKiBzZXQgZGVmYXVsdCAxIGJpdCBtb2RlICovCisJc2xvdC0+Y3R5cGUgPSBTRE1NQ19DVFlQRV8xQklUOworCisJc3dpdGNoIChpb3MtPmJ1c193aWR0aCkgeworCWNhc2UgTU1DX0JVU19XSURUSF8xOgorCQlzbG90LT5jdHlwZSA9IFNETU1DX0NUWVBFXzFCSVQ7CisJCWJyZWFrOworCWNhc2UgTU1DX0JVU19XSURUSF80OgorCQlzbG90LT5jdHlwZSA9IFNETU1DX0NUWVBFXzRCSVQ7CisJCWJyZWFrOworCX0KKworCWlmIChpb3MtPmNsb2NrKSB7CisJCS8qCisJCSAqIFVzZSBtaXJyb3Igb2YgaW9zLT5jbG9jayB0byBwcmV2ZW50IHJhY2Ugd2l0aCBtbWMKKwkJICogY29yZSBpb3MgdXBkYXRlIHdoZW4gZmluZGluZyB0aGUgbWluaW11bS4KKwkJICovCisJCXNsb3QtPmNsb2NrID0gaW9zLT5jbG9jazsKKwl9CisKKwlzd2l0Y2ggKGlvcy0+cG93ZXJfbW9kZSkgeworCWNhc2UgTU1DX1BPV0VSX1VQOgorCQlzZXRfYml0KERXX01NQ19DQVJEX05FRURfSU5JVCwgJnNsb3QtPmZsYWdzKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgaW50IGR3X21jaV9nZXRfcm8oc3RydWN0IG1tY19ob3N0ICptbWMpCit7CisJaW50IHJlYWRfb25seTsKKwlzdHJ1Y3QgZHdfbWNpX3Nsb3QgKnNsb3QgPSBtbWNfcHJpdihtbWMpOworCXN0cnVjdCBkd19tY2lfYm9hcmQgKmJyZCA9IHNsb3QtPmhvc3QtPnBkYXRhOworCisJLyogVXNlIHBsYXRmb3JtIGdldF9ybyBmdW5jdGlvbiwgZWxzZSB0cnkgb24gYm9hcmQgd3JpdGUgcHJvdGVjdCAqLworCWlmIChicmQtPmdldF9ybykKKwkJcmVhZF9vbmx5ID0gYnJkLT5nZXRfcm8oc2xvdC0+aWQpOworCWVsc2UKKwkJcmVhZF9vbmx5ID0KKwkJCW1jaV9yZWFkbChzbG90LT5ob3N0LCBXUlRQUlQpICYgKDEgPDwgc2xvdC0+aWQpID8gMSA6IDA7CisKKwlkZXZfZGJnKCZtbWMtPmNsYXNzX2RldiwgImNhcmQgaXMgJXNcbiIsCisJCXJlYWRfb25seSA/ICJyZWFkLW9ubHkiIDogInJlYWQtd3JpdGUiKTsKKworCXJldHVybiByZWFkX29ubHk7Cit9CisKK3N0YXRpYyBpbnQgZHdfbWNpX2dldF9jZChzdHJ1Y3QgbW1jX2hvc3QgKm1tYykKK3sKKwlpbnQgcHJlc2VudDsKKwlzdHJ1Y3QgZHdfbWNpX3Nsb3QgKnNsb3QgPSBtbWNfcHJpdihtbWMpOworCXN0cnVjdCBkd19tY2lfYm9hcmQgKmJyZCA9IHNsb3QtPmhvc3QtPnBkYXRhOworCisJLyogVXNlIHBsYXRmb3JtIGdldF9jZCBmdW5jdGlvbiwgZWxzZSB0cnkgb25ib2FyZCBjYXJkIGRldGVjdCAqLworCWlmIChicmQtPmdldF9jZCkKKwkJcHJlc2VudCA9ICFicmQtPmdldF9jZChzbG90LT5pZCk7CisJZWxzZQorCQlwcmVzZW50ID0gKG1jaV9yZWFkbChzbG90LT5ob3N0LCBDREVURUNUKSAmICgxIDw8IHNsb3QtPmlkKSkKKwkJCT09IDAgPyAxIDogMDsKKworCWlmIChwcmVzZW50KQorCQlkZXZfZGJnKCZtbWMtPmNsYXNzX2RldiwgImNhcmQgaXMgcHJlc2VudFxuIik7CisJZWxzZQorCQlkZXZfZGJnKCZtbWMtPmNsYXNzX2RldiwgImNhcmQgaXMgbm90IHByZXNlbnRcbiIpOworCisJcmV0dXJuIHByZXNlbnQ7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbW1jX2hvc3Rfb3BzIGR3X21jaV9vcHMgPSB7CisJLnJlcXVlc3QJPSBkd19tY2lfcmVxdWVzdCwKKwkuc2V0X2lvcwk9IGR3X21jaV9zZXRfaW9zLAorCS5nZXRfcm8JCT0gZHdfbWNpX2dldF9ybywKKwkuZ2V0X2NkCQk9IGR3X21jaV9nZXRfY2QsCit9OworCitzdGF0aWMgdm9pZCBkd19tY2lfcmVxdWVzdF9lbmQoc3RydWN0IGR3X21jaSAqaG9zdCwgc3RydWN0IG1tY19yZXF1ZXN0ICptcnEpCisJX19yZWxlYXNlcygmaG9zdC0+bG9jaykKKwlfX2FjcXVpcmVzKCZob3N0LT5sb2NrKQoreworCXN0cnVjdCBkd19tY2lfc2xvdCAqc2xvdDsKKwlzdHJ1Y3QgbW1jX2hvc3QJKnByZXZfbW1jID0gaG9zdC0+Y3VyX3Nsb3QtPm1tYzsKKworCVdBUk5fT04oaG9zdC0+Y21kIHx8IGhvc3QtPmRhdGEpOworCisJaG9zdC0+Y3VyX3Nsb3QtPm1ycSA9IE5VTEw7CisJaG9zdC0+bXJxID0gTlVMTDsKKwlpZiAoIWxpc3RfZW1wdHkoJmhvc3QtPnF1ZXVlKSkgeworCQlzbG90ID0gbGlzdF9lbnRyeShob3N0LT5xdWV1ZS5uZXh0LAorCQkJCSAgc3RydWN0IGR3X21jaV9zbG90LCBxdWV1ZV9ub2RlKTsKKwkJbGlzdF9kZWwoJnNsb3QtPnF1ZXVlX25vZGUpOworCQlkZXZfdmRiZygmaG9zdC0+cGRldi0+ZGV2LCAibGlzdCBub3QgZW1wdHk6ICVzIGlzIG5leHRcbiIsCisJCQkgbW1jX2hvc3RuYW1lKHNsb3QtPm1tYykpOworCQlob3N0LT5zdGF0ZSA9IFNUQVRFX1NFTkRJTkdfQ01EOworCQlkd19tY2lfc3RhcnRfcmVxdWVzdChob3N0LCBzbG90KTsKKwl9IGVsc2UgeworCQlkZXZfdmRiZygmaG9zdC0+cGRldi0+ZGV2LCAibGlzdCBlbXB0eVxuIik7CisJCWhvc3QtPnN0YXRlID0gU1RBVEVfSURMRTsKKwl9CisKKwlzcGluX3VubG9jaygmaG9zdC0+bG9jayk7CisJbW1jX3JlcXVlc3RfZG9uZShwcmV2X21tYywgbXJxKTsKKwlzcGluX2xvY2soJmhvc3QtPmxvY2spOworfQorCitzdGF0aWMgdm9pZCBkd19tY2lfY29tbWFuZF9jb21wbGV0ZShzdHJ1Y3QgZHdfbWNpICpob3N0LCBzdHJ1Y3QgbW1jX2NvbW1hbmQgKmNtZCkKK3sKKwl1MzIgc3RhdHVzID0gaG9zdC0+Y21kX3N0YXR1czsKKworCWhvc3QtPmNtZF9zdGF0dXMgPSAwOworCisJLyogUmVhZCB0aGUgcmVzcG9uc2UgZnJvbSB0aGUgY2FyZCAodXAgdG8gMTYgYnl0ZXMpICovCisJaWYgKGNtZC0+ZmxhZ3MgJiBNTUNfUlNQX1BSRVNFTlQpIHsKKwkJaWYgKGNtZC0+ZmxhZ3MgJiBNTUNfUlNQXzEzNikgeworCQkJY21kLT5yZXNwWzNdID0gbWNpX3JlYWRsKGhvc3QsIFJFU1AwKTsKKwkJCWNtZC0+cmVzcFsyXSA9IG1jaV9yZWFkbChob3N0LCBSRVNQMSk7CisJCQljbWQtPnJlc3BbMV0gPSBtY2lfcmVhZGwoaG9zdCwgUkVTUDIpOworCQkJY21kLT5yZXNwWzBdID0gbWNpX3JlYWRsKGhvc3QsIFJFU1AzKTsKKwkJfSBlbHNlIHsKKwkJCWNtZC0+cmVzcFswXSA9IG1jaV9yZWFkbChob3N0LCBSRVNQMCk7CisJCQljbWQtPnJlc3BbMV0gPSAwOworCQkJY21kLT5yZXNwWzJdID0gMDsKKwkJCWNtZC0+cmVzcFszXSA9IDA7CisJCX0KKwl9CisKKwlpZiAoc3RhdHVzICYgU0RNTUNfSU5UX1JUTykKKwkJY21kLT5lcnJvciA9IC1FVElNRURPVVQ7CisJZWxzZSBpZiAoKGNtZC0+ZmxhZ3MgJiBNTUNfUlNQX0NSQykgJiYgKHN0YXR1cyAmIFNETU1DX0lOVF9SQ1JDKSkKKwkJY21kLT5lcnJvciA9IC1FSUxTRVE7CisJZWxzZSBpZiAoc3RhdHVzICYgU0RNTUNfSU5UX1JFU1BfRVJSKQorCQljbWQtPmVycm9yID0gLUVJTzsKKwllbHNlCisJCWNtZC0+ZXJyb3IgPSAwOworCisJaWYgKGNtZC0+ZXJyb3IpIHsKKwkJLyogbmV3ZXIgaXAgdmVyc2lvbnMgbmVlZCBhIGRlbGF5IGJldHdlZW4gcmV0cmllcyAqLworCQlpZiAoaG9zdC0+cXVpcmtzICYgRFdfTUNJX1FVSVJLX1JFVFJZX0RFTEFZKQorCQkJbWRlbGF5KDIwKTsKKworCQlpZiAoY21kLT5kYXRhKSB7CisJCQlob3N0LT5kYXRhID0gTlVMTDsKKwkJCWR3X21jaV9zdG9wX2RtYShob3N0KTsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgZHdfbWNpX3Rhc2tsZXRfZnVuYyh1bnNpZ25lZCBsb25nIHByaXYpCit7CisJc3RydWN0IGR3X21jaSAqaG9zdCA9IChzdHJ1Y3QgZHdfbWNpICopcHJpdjsKKwlzdHJ1Y3QgbW1jX2RhdGEJKmRhdGE7CisJc3RydWN0IG1tY19jb21tYW5kICpjbWQ7CisJZW51bSBkd19tY2lfc3RhdGUgc3RhdGU7CisJZW51bSBkd19tY2lfc3RhdGUgcHJldl9zdGF0ZTsKKwl1MzIgc3RhdHVzOworCisJc3Bpbl9sb2NrKCZob3N0LT5sb2NrKTsKKworCXN0YXRlID0gaG9zdC0+c3RhdGU7CisJZGF0YSA9IGhvc3QtPmRhdGE7CisKKwlkbyB7CisJCXByZXZfc3RhdGUgPSBzdGF0ZTsKKworCQlzd2l0Y2ggKHN0YXRlKSB7CisJCWNhc2UgU1RBVEVfSURMRToKKwkJCWJyZWFrOworCisJCWNhc2UgU1RBVEVfU0VORElOR19DTUQ6CisJCQlpZiAoIXRlc3RfYW5kX2NsZWFyX2JpdChFVkVOVF9DTURfQ09NUExFVEUsCisJCQkJCQkmaG9zdC0+cGVuZGluZ19ldmVudHMpKQorCQkJCWJyZWFrOworCisJCQljbWQgPSBob3N0LT5jbWQ7CisJCQlob3N0LT5jbWQgPSBOVUxMOworCQkJc2V0X2JpdChFVkVOVF9DTURfQ09NUExFVEUsICZob3N0LT5jb21wbGV0ZWRfZXZlbnRzKTsKKwkJCWR3X21jaV9jb21tYW5kX2NvbXBsZXRlKGhvc3QsIGhvc3QtPm1ycS0+Y21kKTsKKwkJCWlmICghaG9zdC0+bXJxLT5kYXRhIHx8IGNtZC0+ZXJyb3IpIHsKKwkJCQlkd19tY2lfcmVxdWVzdF9lbmQoaG9zdCwgaG9zdC0+bXJxKTsKKwkJCQlnb3RvIHVubG9jazsKKwkJCX0KKworCQkJcHJldl9zdGF0ZSA9IHN0YXRlID0gU1RBVEVfU0VORElOR19EQVRBOworCQkJLyogZmFsbCB0aHJvdWdoICovCisKKwkJY2FzZSBTVEFURV9TRU5ESU5HX0RBVEE6CisJCQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KEVWRU5UX0RBVEFfRVJST1IsCisJCQkJCSAgICAgICAmaG9zdC0+cGVuZGluZ19ldmVudHMpKSB7CisJCQkJZHdfbWNpX3N0b3BfZG1hKGhvc3QpOworCQkJCWlmIChkYXRhLT5zdG9wKQorCQkJCQlzZW5kX3N0b3BfY21kKGhvc3QsIGRhdGEpOworCQkJCXN0YXRlID0gU1RBVEVfREFUQV9FUlJPUjsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJaWYgKCF0ZXN0X2FuZF9jbGVhcl9iaXQoRVZFTlRfWEZFUl9DT01QTEVURSwKKwkJCQkJCSZob3N0LT5wZW5kaW5nX2V2ZW50cykpCisJCQkJYnJlYWs7CisKKwkJCXNldF9iaXQoRVZFTlRfWEZFUl9DT01QTEVURSwgJmhvc3QtPmNvbXBsZXRlZF9ldmVudHMpOworCQkJcHJldl9zdGF0ZSA9IHN0YXRlID0gU1RBVEVfREFUQV9CVVNZOworCQkJLyogZmFsbCB0aHJvdWdoICovCisKKwkJY2FzZSBTVEFURV9EQVRBX0JVU1k6CisJCQlpZiAoIXRlc3RfYW5kX2NsZWFyX2JpdChFVkVOVF9EQVRBX0NPTVBMRVRFLAorCQkJCQkJJmhvc3QtPnBlbmRpbmdfZXZlbnRzKSkKKwkJCQlicmVhazsKKworCQkJaG9zdC0+ZGF0YSA9IE5VTEw7CisJCQlzZXRfYml0KEVWRU5UX0RBVEFfQ09NUExFVEUsICZob3N0LT5jb21wbGV0ZWRfZXZlbnRzKTsKKwkJCXN0YXR1cyA9IGhvc3QtPmRhdGFfc3RhdHVzOworCisJCQlpZiAoc3RhdHVzICYgRFdfTUNJX0RBVEFfRVJST1JfRkxBR1MpIHsKKwkJCQlpZiAoc3RhdHVzICYgU0RNTUNfSU5UX0RUTykgeworCQkJCQlkZXZfZXJyKCZob3N0LT5wZGV2LT5kZXYsCisJCQkJCQkiZGF0YSB0aW1lb3V0IGVycm9yXG4iKTsKKwkJCQkJZGF0YS0+ZXJyb3IgPSAtRVRJTUVET1VUOworCQkJCX0gZWxzZSBpZiAoc3RhdHVzICYgU0RNTUNfSU5UX0RDUkMpIHsKKwkJCQkJZGV2X2VycigmaG9zdC0+cGRldi0+ZGV2LAorCQkJCQkJImRhdGEgQ1JDIGVycm9yXG4iKTsKKwkJCQkJZGF0YS0+ZXJyb3IgPSAtRUlMU0VROworCQkJCX0gZWxzZSB7CisJCQkJCWRldl9lcnIoJmhvc3QtPnBkZXYtPmRldiwKKwkJCQkJCSJkYXRhIEZJRk8gZXJyb3IgIgorCQkJCQkJIihzdGF0dXM9JTA4eClcbiIsCisJCQkJCQlzdGF0dXMpOworCQkJCQlkYXRhLT5lcnJvciA9IC1FSU87CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlkYXRhLT5ieXRlc194ZmVyZWQgPSBkYXRhLT5ibG9ja3MgKiBkYXRhLT5ibGtzejsKKwkJCQlkYXRhLT5lcnJvciA9IDA7CisJCQl9CisKKwkJCWlmICghZGF0YS0+c3RvcCkgeworCQkJCWR3X21jaV9yZXF1ZXN0X2VuZChob3N0LCBob3N0LT5tcnEpOworCQkJCWdvdG8gdW5sb2NrOworCQkJfQorCisJCQlwcmV2X3N0YXRlID0gc3RhdGUgPSBTVEFURV9TRU5ESU5HX1NUT1A7CisJCQlpZiAoIWRhdGEtPmVycm9yKQorCQkJCXNlbmRfc3RvcF9jbWQoaG9zdCwgZGF0YSk7CisJCQkvKiBmYWxsIHRocm91Z2ggKi8KKworCQljYXNlIFNUQVRFX1NFTkRJTkdfU1RPUDoKKwkJCWlmICghdGVzdF9hbmRfY2xlYXJfYml0KEVWRU5UX0NNRF9DT01QTEVURSwKKwkJCQkJCSZob3N0LT5wZW5kaW5nX2V2ZW50cykpCisJCQkJYnJlYWs7CisKKwkJCWhvc3QtPmNtZCA9IE5VTEw7CisJCQlkd19tY2lfY29tbWFuZF9jb21wbGV0ZShob3N0LCBob3N0LT5tcnEtPnN0b3ApOworCQkJZHdfbWNpX3JlcXVlc3RfZW5kKGhvc3QsIGhvc3QtPm1ycSk7CisJCQlnb3RvIHVubG9jazsKKworCQljYXNlIFNUQVRFX0RBVEFfRVJST1I6CisJCQlpZiAoIXRlc3RfYW5kX2NsZWFyX2JpdChFVkVOVF9YRkVSX0NPTVBMRVRFLAorCQkJCQkJJmhvc3QtPnBlbmRpbmdfZXZlbnRzKSkKKwkJCQlicmVhazsKKworCQkJc3RhdGUgPSBTVEFURV9EQVRBX0JVU1k7CisJCQlicmVhazsKKwkJfQorCX0gd2hpbGUgKHN0YXRlICE9IHByZXZfc3RhdGUpOworCisJaG9zdC0+c3RhdGUgPSBzdGF0ZTsKK3VubG9jazoKKwlzcGluX3VubG9jaygmaG9zdC0+bG9jayk7CisKK30KKworc3RhdGljIHZvaWQgZHdfbWNpX3B1c2hfZGF0YTE2KHN0cnVjdCBkd19tY2kgKmhvc3QsIHZvaWQgKmJ1ZiwgaW50IGNudCkKK3sKKwl1MTYgKnBkYXRhID0gKHUxNiAqKWJ1ZjsKKworCVdBUk5fT04oY250ICUgMiAhPSAwKTsKKworCWNudCA9IGNudCA+PiAxOworCXdoaWxlIChjbnQgPiAwKSB7CisJCW1jaV93cml0ZXcoaG9zdCwgREFUQSwgKnBkYXRhKyspOworCQljbnQtLTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGR3X21jaV9wdWxsX2RhdGExNihzdHJ1Y3QgZHdfbWNpICpob3N0LCB2b2lkICpidWYsIGludCBjbnQpCit7CisJdTE2ICpwZGF0YSA9ICh1MTYgKilidWY7CisKKwlXQVJOX09OKGNudCAlIDIgIT0gMCk7CisKKwljbnQgPSBjbnQgPj4gMTsKKwl3aGlsZSAoY250ID4gMCkgeworCQkqcGRhdGErKyA9IG1jaV9yZWFkdyhob3N0LCBEQVRBKTsKKwkJY250LS07CisJfQorfQorCitzdGF0aWMgdm9pZCBkd19tY2lfcHVzaF9kYXRhMzIoc3RydWN0IGR3X21jaSAqaG9zdCwgdm9pZCAqYnVmLCBpbnQgY250KQoreworCXUzMiAqcGRhdGEgPSAodTMyICopYnVmOworCisJV0FSTl9PTihjbnQgJSA0ICE9IDApOworCVdBUk5fT04oKHVuc2lnbmVkIGxvbmcpcGRhdGEgJiAweDMpOworCisJY250ID0gY250ID4+IDI7CisJd2hpbGUgKGNudCA+IDApIHsKKwkJbWNpX3dyaXRlbChob3N0LCBEQVRBLCAqcGRhdGErKyk7CisJCWNudC0tOworCX0KK30KKworc3RhdGljIHZvaWQgZHdfbWNpX3B1bGxfZGF0YTMyKHN0cnVjdCBkd19tY2kgKmhvc3QsIHZvaWQgKmJ1ZiwgaW50IGNudCkKK3sKKwl1MzIgKnBkYXRhID0gKHUzMiAqKWJ1ZjsKKworCVdBUk5fT04oY250ICUgNCAhPSAwKTsKKwlXQVJOX09OKCh1bnNpZ25lZCBsb25nKXBkYXRhICYgMHgzKTsKKworCWNudCA9IGNudCA+PiAyOworCXdoaWxlIChjbnQgPiAwKSB7CisJCSpwZGF0YSsrID0gbWNpX3JlYWRsKGhvc3QsIERBVEEpOworCQljbnQtLTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGR3X21jaV9wdXNoX2RhdGE2NChzdHJ1Y3QgZHdfbWNpICpob3N0LCB2b2lkICpidWYsIGludCBjbnQpCit7CisJdTY0ICpwZGF0YSA9ICh1NjQgKilidWY7CisKKwlXQVJOX09OKGNudCAlIDggIT0gMCk7CisKKwljbnQgPSBjbnQgPj4gMzsKKwl3aGlsZSAoY250ID4gMCkgeworCQltY2lfd3JpdGVxKGhvc3QsIERBVEEsICpwZGF0YSsrKTsKKwkJY250LS07CisJfQorfQorCitzdGF0aWMgdm9pZCBkd19tY2lfcHVsbF9kYXRhNjQoc3RydWN0IGR3X21jaSAqaG9zdCwgdm9pZCAqYnVmLCBpbnQgY250KQoreworCXU2NCAqcGRhdGEgPSAodTY0ICopYnVmOworCisJV0FSTl9PTihjbnQgJSA4ICE9IDApOworCisJY250ID0gY250ID4+IDM7CisJd2hpbGUgKGNudCA+IDApIHsKKwkJKnBkYXRhKysgPSBtY2lfcmVhZHEoaG9zdCwgREFUQSk7CisJCWNudC0tOworCX0KK30KKworc3RhdGljIHZvaWQgZHdfbWNpX3JlYWRfZGF0YV9waW8oc3RydWN0IGR3X21jaSAqaG9zdCkKK3sKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnID0gaG9zdC0+c2c7CisJdm9pZCAqYnVmID0gc2dfdmlydChzZyk7CisJdW5zaWduZWQgaW50IG9mZnNldCA9IGhvc3QtPnBpb19vZmZzZXQ7CisJc3RydWN0IG1tY19kYXRhCSpkYXRhID0gaG9zdC0+ZGF0YTsKKwlpbnQgc2hpZnQgPSBob3N0LT5kYXRhX3NoaWZ0OworCXUzMiBzdGF0dXM7CisJdW5zaWduZWQgaW50IG5ieXRlcyA9IDAsIGxlbiwgb2xkX2xlbiwgY291bnQgPSAwOworCisJZG8geworCQlsZW4gPSBTRE1NQ19HRVRfRkNOVChtY2lfcmVhZGwoaG9zdCwgU1RBVFVTKSkgPDwgc2hpZnQ7CisJCWlmIChjb3VudCA9PSAwKQorCQkJb2xkX2xlbiA9IGxlbjsKKworCQlpZiAob2Zmc2V0ICsgbGVuIDw9IHNnLT5sZW5ndGgpIHsKKwkJCWhvc3QtPnB1bGxfZGF0YShob3N0LCAodm9pZCAqKShidWYgKyBvZmZzZXQpLCBsZW4pOworCisJCQlvZmZzZXQgKz0gbGVuOworCQkJbmJ5dGVzICs9IGxlbjsKKworCQkJaWYgKG9mZnNldCA9PSBzZy0+bGVuZ3RoKSB7CisJCQkJZmx1c2hfZGNhY2hlX3BhZ2Uoc2dfcGFnZShzZykpOworCQkJCWhvc3QtPnNnID0gc2cgPSBzZ19uZXh0KHNnKTsKKwkJCQlpZiAoIXNnKQorCQkJCQlnb3RvIGRvbmU7CisKKwkJCQlvZmZzZXQgPSAwOworCQkJCWJ1ZiA9IHNnX3ZpcnQoc2cpOworCQkJfQorCQl9IGVsc2UgeworCQkJdW5zaWduZWQgaW50IHJlbWFpbmluZyA9IHNnLT5sZW5ndGggLSBvZmZzZXQ7CisJCQlob3N0LT5wdWxsX2RhdGEoaG9zdCwgKHZvaWQgKikoYnVmICsgb2Zmc2V0KSwKKwkJCQkJcmVtYWluaW5nKTsKKwkJCW5ieXRlcyArPSByZW1haW5pbmc7CisKKwkJCWZsdXNoX2RjYWNoZV9wYWdlKHNnX3BhZ2Uoc2cpKTsKKwkJCWhvc3QtPnNnID0gc2cgPSBzZ19uZXh0KHNnKTsKKwkJCWlmICghc2cpCisJCQkJZ290byBkb25lOworCisJCQlvZmZzZXQgPSBsZW4gLSByZW1haW5pbmc7CisJCQlidWYgPSBzZ192aXJ0KHNnKTsKKwkJCWhvc3QtPnB1bGxfZGF0YShob3N0LCBidWYsIG9mZnNldCk7CisJCQluYnl0ZXMgKz0gb2Zmc2V0OworCQl9CisKKwkJc3RhdHVzID0gbWNpX3JlYWRsKGhvc3QsIE1JTlRTVFMpOworCQltY2lfd3JpdGVsKGhvc3QsIFJJTlRTVFMsIFNETU1DX0lOVF9SWERSKTsKKwkJaWYgKHN0YXR1cyAmIERXX01DSV9EQVRBX0VSUk9SX0ZMQUdTKSB7CisJCQlob3N0LT5kYXRhX3N0YXR1cyA9IHN0YXR1czsKKwkJCWRhdGEtPmJ5dGVzX3hmZXJlZCArPSBuYnl0ZXM7CisJCQlzbXBfd21iKCk7CisKKwkJCXNldF9iaXQoRVZFTlRfREFUQV9FUlJPUiwgJmhvc3QtPnBlbmRpbmdfZXZlbnRzKTsKKworCQkJdGFza2xldF9zY2hlZHVsZSgmaG9zdC0+dGFza2xldCk7CisJCQlyZXR1cm47CisJCX0KKwkJY291bnQrKzsKKwl9IHdoaWxlIChzdGF0dXMgJiBTRE1NQ19JTlRfUlhEUik7IC8qaWYgdGhlIFJYRFIgaXMgcmVhZHkgcmVhZCBhZ2FpbiovCisJbGVuID0gU0RNTUNfR0VUX0ZDTlQobWNpX3JlYWRsKGhvc3QsIFNUQVRVUykpOworCWhvc3QtPnBpb19vZmZzZXQgPSBvZmZzZXQ7CisJZGF0YS0+Ynl0ZXNfeGZlcmVkICs9IG5ieXRlczsKKwlyZXR1cm47CisKK2RvbmU6CisJZGF0YS0+Ynl0ZXNfeGZlcmVkICs9IG5ieXRlczsKKwlzbXBfd21iKCk7CisJc2V0X2JpdChFVkVOVF9YRkVSX0NPTVBMRVRFLCAmaG9zdC0+cGVuZGluZ19ldmVudHMpOworfQorCitzdGF0aWMgdm9pZCBkd19tY2lfd3JpdGVfZGF0YV9waW8oc3RydWN0IGR3X21jaSAqaG9zdCkKK3sKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnID0gaG9zdC0+c2c7CisJdm9pZCAqYnVmID0gc2dfdmlydChzZyk7CisJdW5zaWduZWQgaW50IG9mZnNldCA9IGhvc3QtPnBpb19vZmZzZXQ7CisJc3RydWN0IG1tY19kYXRhCSpkYXRhID0gaG9zdC0+ZGF0YTsKKwlpbnQgc2hpZnQgPSBob3N0LT5kYXRhX3NoaWZ0OworCXUzMiBzdGF0dXM7CisJdW5zaWduZWQgaW50IG5ieXRlcyA9IDAsIGxlbjsKKworCWRvIHsKKwkJbGVuID0gU0RNTUNfRklGT19TWiAtCisJCQkoU0RNTUNfR0VUX0ZDTlQobWNpX3JlYWRsKGhvc3QsIFNUQVRVUykpIDw8IHNoaWZ0KTsKKwkJaWYgKG9mZnNldCArIGxlbiA8PSBzZy0+bGVuZ3RoKSB7CisJCQlob3N0LT5wdXNoX2RhdGEoaG9zdCwgKHZvaWQgKikoYnVmICsgb2Zmc2V0KSwgbGVuKTsKKworCQkJb2Zmc2V0ICs9IGxlbjsKKwkJCW5ieXRlcyArPSBsZW47CisJCQlpZiAob2Zmc2V0ID09IHNnLT5sZW5ndGgpIHsKKwkJCQlob3N0LT5zZyA9IHNnID0gc2dfbmV4dChzZyk7CisJCQkJaWYgKCFzZykKKwkJCQkJZ290byBkb25lOworCisJCQkJb2Zmc2V0ID0gMDsKKwkJCQlidWYgPSBzZ192aXJ0KHNnKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXVuc2lnbmVkIGludCByZW1haW5pbmcgPSBzZy0+bGVuZ3RoIC0gb2Zmc2V0OworCisJCQlob3N0LT5wdXNoX2RhdGEoaG9zdCwgKHZvaWQgKikoYnVmICsgb2Zmc2V0KSwKKwkJCQkJcmVtYWluaW5nKTsKKwkJCW5ieXRlcyArPSByZW1haW5pbmc7CisKKwkJCWhvc3QtPnNnID0gc2cgPSBzZ19uZXh0KHNnKTsKKwkJCWlmICghc2cpCisJCQkJZ290byBkb25lOworCisJCQlvZmZzZXQgPSBsZW4gLSByZW1haW5pbmc7CisJCQlidWYgPSBzZ192aXJ0KHNnKTsKKwkJCWhvc3QtPnB1c2hfZGF0YShob3N0LCAodm9pZCAqKWJ1Ziwgb2Zmc2V0KTsKKwkJCW5ieXRlcyArPSBvZmZzZXQ7CisJCX0KKworCQlzdGF0dXMgPSBtY2lfcmVhZGwoaG9zdCwgTUlOVFNUUyk7CisJCW1jaV93cml0ZWwoaG9zdCwgUklOVFNUUywgU0RNTUNfSU5UX1RYRFIpOworCQlpZiAoc3RhdHVzICYgRFdfTUNJX0RBVEFfRVJST1JfRkxBR1MpIHsKKwkJCWhvc3QtPmRhdGFfc3RhdHVzID0gc3RhdHVzOworCQkJZGF0YS0+Ynl0ZXNfeGZlcmVkICs9IG5ieXRlczsKKworCQkJc21wX3dtYigpOworCisJCQlzZXRfYml0KEVWRU5UX0RBVEFfRVJST1IsICZob3N0LT5wZW5kaW5nX2V2ZW50cyk7CisKKwkJCXRhc2tsZXRfc2NoZWR1bGUoJmhvc3QtPnRhc2tsZXQpOworCQkJcmV0dXJuOworCQl9CisJfSB3aGlsZSAoc3RhdHVzICYgU0RNTUNfSU5UX1RYRFIpOyAvKiBpZiBUWERSIHdyaXRlIGFnYWluICovCisKKwlob3N0LT5waW9fb2Zmc2V0ID0gb2Zmc2V0OworCWRhdGEtPmJ5dGVzX3hmZXJlZCArPSBuYnl0ZXM7CisKKwlyZXR1cm47CisKK2RvbmU6CisJZGF0YS0+Ynl0ZXNfeGZlcmVkICs9IG5ieXRlczsKKwlzbXBfd21iKCk7CisJc2V0X2JpdChFVkVOVF9YRkVSX0NPTVBMRVRFLCAmaG9zdC0+cGVuZGluZ19ldmVudHMpOworfQorCitzdGF0aWMgdm9pZCBkd19tY2lfY21kX2ludGVycnVwdChzdHJ1Y3QgZHdfbWNpICpob3N0LCB1MzIgc3RhdHVzKQoreworCWlmICghaG9zdC0+Y21kX3N0YXR1cykKKwkJaG9zdC0+Y21kX3N0YXR1cyA9IHN0YXR1czsKKworCXNtcF93bWIoKTsKKworCXNldF9iaXQoRVZFTlRfQ01EX0NPTVBMRVRFLCAmaG9zdC0+cGVuZGluZ19ldmVudHMpOworCXRhc2tsZXRfc2NoZWR1bGUoJmhvc3QtPnRhc2tsZXQpOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgZHdfbWNpX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQpCit7CisJc3RydWN0IGR3X21jaSAqaG9zdCA9IGRldl9pZDsKKwl1MzIgc3RhdHVzLCBwZW5kaW5nOworCXVuc2lnbmVkIGludCBwYXNzX2NvdW50ID0gMDsKKworCWRvIHsKKwkJc3RhdHVzID0gbWNpX3JlYWRsKGhvc3QsIFJJTlRTVFMpOworCQlwZW5kaW5nID0gbWNpX3JlYWRsKGhvc3QsIE1JTlRTVFMpOyAvKiByZWFkLW9ubHkgbWFzayByZWcgKi8KKworCQkvKgorCQkgKiBEVE8gZml4IC0gdmVyc2lvbiAyLjEwYSBhbmQgYmVsb3csIGFuZCBvbmx5IGlmIGludGVybmFsIERNQQorCQkgKiBpcyBjb25maWd1cmVkLgorCQkgKi8KKwkJaWYgKGhvc3QtPnF1aXJrcyAmIERXX01DSV9RVUlSS19JRE1BQ19EVE8pIHsKKwkJCWlmICghcGVuZGluZyAmJgorCQkJICAgICgobWNpX3JlYWRsKGhvc3QsIFNUQVRVUykgPj4gMTcpICYgMHgxZmZmKSkKKwkJCQlwZW5kaW5nIHw9IFNETU1DX0lOVF9EQVRBX09WRVI7CisJCX0KKworCQlpZiAoIXBlbmRpbmcpCisJCQlicmVhazsKKworCQlpZiAocGVuZGluZyAmIERXX01DSV9DTURfRVJST1JfRkxBR1MpIHsKKwkJCW1jaV93cml0ZWwoaG9zdCwgUklOVFNUUywgRFdfTUNJX0NNRF9FUlJPUl9GTEFHUyk7CisJCQlob3N0LT5jbWRfc3RhdHVzID0gc3RhdHVzOworCQkJc21wX3dtYigpOworCQkJc2V0X2JpdChFVkVOVF9DTURfQ09NUExFVEUsICZob3N0LT5wZW5kaW5nX2V2ZW50cyk7CisJCQl0YXNrbGV0X3NjaGVkdWxlKCZob3N0LT50YXNrbGV0KTsKKwkJfQorCisJCWlmIChwZW5kaW5nICYgRFdfTUNJX0RBVEFfRVJST1JfRkxBR1MpIHsKKwkJCS8qIGlmIHRoZXJlIGlzIGFuIGVycm9yIHJlcG9ydCBEQVRBX0VSUk9SICovCisJCQltY2lfd3JpdGVsKGhvc3QsIFJJTlRTVFMsIERXX01DSV9EQVRBX0VSUk9SX0ZMQUdTKTsKKwkJCWhvc3QtPmRhdGFfc3RhdHVzID0gc3RhdHVzOworCQkJc21wX3dtYigpOworCQkJc2V0X2JpdChFVkVOVF9EQVRBX0VSUk9SLCAmaG9zdC0+cGVuZGluZ19ldmVudHMpOworCQkJdGFza2xldF9zY2hlZHVsZSgmaG9zdC0+dGFza2xldCk7CisJCX0KKworCQlpZiAocGVuZGluZyAmIFNETU1DX0lOVF9EQVRBX09WRVIpIHsKKwkJCW1jaV93cml0ZWwoaG9zdCwgUklOVFNUUywgU0RNTUNfSU5UX0RBVEFfT1ZFUik7CisJCQlpZiAoIWhvc3QtPmRhdGFfc3RhdHVzKQorCQkJCWhvc3QtPmRhdGFfc3RhdHVzID0gc3RhdHVzOworCQkJc21wX3dtYigpOworCQkJaWYgKGhvc3QtPmRpcl9zdGF0dXMgPT0gRFdfTUNJX1JFQ1ZfU1RBVFVTKSB7CisJCQkJaWYgKGhvc3QtPnNnICE9IE5VTEwpCisJCQkJCWR3X21jaV9yZWFkX2RhdGFfcGlvKGhvc3QpOworCQkJfQorCQkJc2V0X2JpdChFVkVOVF9EQVRBX0NPTVBMRVRFLCAmaG9zdC0+cGVuZGluZ19ldmVudHMpOworCQkJdGFza2xldF9zY2hlZHVsZSgmaG9zdC0+dGFza2xldCk7CisJCX0KKworCQlpZiAocGVuZGluZyAmIFNETU1DX0lOVF9SWERSKSB7CisJCQltY2lfd3JpdGVsKGhvc3QsIFJJTlRTVFMsIFNETU1DX0lOVF9SWERSKTsKKwkJCWlmIChob3N0LT5zZykKKwkJCQlkd19tY2lfcmVhZF9kYXRhX3Bpbyhob3N0KTsKKwkJfQorCisJCWlmIChwZW5kaW5nICYgU0RNTUNfSU5UX1RYRFIpIHsKKwkJCW1jaV93cml0ZWwoaG9zdCwgUklOVFNUUywgU0RNTUNfSU5UX1RYRFIpOworCQkJaWYgKGhvc3QtPnNnKQorCQkJCWR3X21jaV93cml0ZV9kYXRhX3Bpbyhob3N0KTsKKwkJfQorCisJCWlmIChwZW5kaW5nICYgU0RNTUNfSU5UX0NNRF9ET05FKSB7CisJCQltY2lfd3JpdGVsKGhvc3QsIFJJTlRTVFMsIFNETU1DX0lOVF9DTURfRE9ORSk7CisJCQlkd19tY2lfY21kX2ludGVycnVwdChob3N0LCBzdGF0dXMpOworCQl9CisKKwkJaWYgKHBlbmRpbmcgJiBTRE1NQ19JTlRfQ0QpIHsKKwkJCW1jaV93cml0ZWwoaG9zdCwgUklOVFNUUywgU0RNTUNfSU5UX0NEKTsKKwkJCXRhc2tsZXRfc2NoZWR1bGUoJmhvc3QtPmNhcmRfdGFza2xldCk7CisJCX0KKworCX0gd2hpbGUgKHBhc3NfY291bnQrKyA8IDUpOworCisjaWZkZWYgQ09ORklHX01NQ19EV19JRE1BQworCS8qIEhhbmRsZSBETUEgaW50ZXJydXB0cyAqLworCXBlbmRpbmcgPSBtY2lfcmVhZGwoaG9zdCwgSURTVFMpOworCWlmIChwZW5kaW5nICYgKFNETU1DX0lETUFDX0lOVF9USSB8IFNETU1DX0lETUFDX0lOVF9SSSkpIHsKKwkJbWNpX3dyaXRlbChob3N0LCBJRFNUUywgU0RNTUNfSURNQUNfSU5UX1RJIHwgU0RNTUNfSURNQUNfSU5UX1JJKTsKKwkJbWNpX3dyaXRlbChob3N0LCBJRFNUUywgU0RNTUNfSURNQUNfSU5UX05JKTsKKwkJc2V0X2JpdChFVkVOVF9EQVRBX0NPTVBMRVRFLCAmaG9zdC0+cGVuZGluZ19ldmVudHMpOworCQlob3N0LT5kbWFfb3BzLT5jb21wbGV0ZShob3N0KTsKKwl9CisjZW5kaWYKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIHZvaWQgZHdfbWNpX3Rhc2tsZXRfY2FyZCh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IGR3X21jaSAqaG9zdCA9IChzdHJ1Y3QgZHdfbWNpICopZGF0YTsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBob3N0LT5udW1fc2xvdHM7IGkrKykgeworCQlzdHJ1Y3QgZHdfbWNpX3Nsb3QgKnNsb3QgPSBob3N0LT5zbG90W2ldOworCQlzdHJ1Y3QgbW1jX2hvc3QgKm1tYyA9IHNsb3QtPm1tYzsKKwkJc3RydWN0IG1tY19yZXF1ZXN0ICptcnE7CisJCWludCBwcmVzZW50OworCQl1MzIgY3RybDsKKworCQlwcmVzZW50ID0gZHdfbWNpX2dldF9jZChtbWMpOworCQl3aGlsZSAocHJlc2VudCAhPSBzbG90LT5sYXN0X2RldGVjdF9zdGF0ZSkgeworCQkJc3Bpbl9sb2NrKCZob3N0LT5sb2NrKTsKKworCQkJZGV2X2RiZygmc2xvdC0+bW1jLT5jbGFzc19kZXYsICJjYXJkICVzXG4iLAorCQkJCXByZXNlbnQgPyAiaW5zZXJ0ZWQiIDogInJlbW92ZWQiKTsKKworCQkJLyogQ2FyZCBjaGFuZ2UgZGV0ZWN0ZWQgKi8KKwkJCXNsb3QtPmxhc3RfZGV0ZWN0X3N0YXRlID0gcHJlc2VudDsKKworCQkJLyogUG93ZXIgdXAgc2xvdCAqLworCQkJaWYgKHByZXNlbnQgIT0gMCkgeworCQkJCWlmIChob3N0LT5wZGF0YS0+c2V0cG93ZXIpCisJCQkJCWhvc3QtPnBkYXRhLT5zZXRwb3dlcihzbG90LT5pZCwKKwkJCQkJCQkgICAgICBtbWMtPm9jcl9hdmFpbCk7CisKKwkJCQlzZXRfYml0KERXX01NQ19DQVJEX1BSRVNFTlQsICZzbG90LT5mbGFncyk7CisJCQl9CisKKwkJCS8qIENsZWFuIHVwIHF1ZXVlIGlmIHByZXNlbnQgKi8KKwkJCW1ycSA9IHNsb3QtPm1ycTsKKwkJCWlmIChtcnEpIHsKKwkJCQlpZiAobXJxID09IGhvc3QtPm1ycSkgeworCQkJCQlob3N0LT5kYXRhID0gTlVMTDsKKwkJCQkJaG9zdC0+Y21kID0gTlVMTDsKKworCQkJCQlzd2l0Y2ggKGhvc3QtPnN0YXRlKSB7CisJCQkJCWNhc2UgU1RBVEVfSURMRToKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIFNUQVRFX1NFTkRJTkdfQ01EOgorCQkJCQkJbXJxLT5jbWQtPmVycm9yID0gLUVOT01FRElVTTsKKwkJCQkJCWlmICghbXJxLT5kYXRhKQorCQkJCQkJCWJyZWFrOworCQkJCQkJLyogZmFsbCB0aHJvdWdoICovCisJCQkJCWNhc2UgU1RBVEVfU0VORElOR19EQVRBOgorCQkJCQkJbXJxLT5kYXRhLT5lcnJvciA9IC1FTk9NRURJVU07CisJCQkJCQlkd19tY2lfc3RvcF9kbWEoaG9zdCk7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSBTVEFURV9EQVRBX0JVU1k6CisJCQkJCWNhc2UgU1RBVEVfREFUQV9FUlJPUjoKKwkJCQkJCWlmIChtcnEtPmRhdGEtPmVycm9yID09IC1FSU5QUk9HUkVTUykKKwkJCQkJCQltcnEtPmRhdGEtPmVycm9yID0gLUVOT01FRElVTTsKKwkJCQkJCWlmICghbXJxLT5zdG9wKQorCQkJCQkJCWJyZWFrOworCQkJCQkJLyogZmFsbCB0aHJvdWdoICovCisJCQkJCWNhc2UgU1RBVEVfU0VORElOR19TVE9QOgorCQkJCQkJbXJxLT5zdG9wLT5lcnJvciA9IC1FTk9NRURJVU07CisJCQkJCQlicmVhazsKKwkJCQkJfQorCisJCQkJCWR3X21jaV9yZXF1ZXN0X2VuZChob3N0LCBtcnEpOworCQkJCX0gZWxzZSB7CisJCQkJCWxpc3RfZGVsKCZzbG90LT5xdWV1ZV9ub2RlKTsKKwkJCQkJbXJxLT5jbWQtPmVycm9yID0gLUVOT01FRElVTTsKKwkJCQkJaWYgKG1ycS0+ZGF0YSkKKwkJCQkJCW1ycS0+ZGF0YS0+ZXJyb3IgPSAtRU5PTUVESVVNOworCQkJCQlpZiAobXJxLT5zdG9wKQorCQkJCQkJbXJxLT5zdG9wLT5lcnJvciA9IC1FTk9NRURJVU07CisKKwkJCQkJc3Bpbl91bmxvY2soJmhvc3QtPmxvY2spOworCQkJCQltbWNfcmVxdWVzdF9kb25lKHNsb3QtPm1tYywgbXJxKTsKKwkJCQkJc3Bpbl9sb2NrKCZob3N0LT5sb2NrKTsKKwkJCQl9CisJCQl9CisKKwkJCS8qIFBvd2VyIGRvd24gc2xvdCAqLworCQkJaWYgKHByZXNlbnQgPT0gMCkgeworCQkJCWlmIChob3N0LT5wZGF0YS0+c2V0cG93ZXIpCisJCQkJCWhvc3QtPnBkYXRhLT5zZXRwb3dlcihzbG90LT5pZCwgMCk7CisJCQkJY2xlYXJfYml0KERXX01NQ19DQVJEX1BSRVNFTlQsICZzbG90LT5mbGFncyk7CisKKwkJCQkvKgorCQkJCSAqIENsZWFyIGRvd24gdGhlIEZJRk8gLSBkb2luZyBzbyBnZW5lcmF0ZXMgYQorCQkJCSAqIGJsb2NrIGludGVycnVwdCwgaGVuY2Ugc2V0dGluZyB0aGUKKwkJCQkgKiBzY2F0dGVyLWdhdGhlciBwb2ludGVyIHRvIE5VTEwuCisJCQkJICovCisJCQkJaG9zdC0+c2cgPSBOVUxMOworCisJCQkJY3RybCA9IG1jaV9yZWFkbChob3N0LCBDVFJMKTsKKwkJCQljdHJsIHw9IFNETU1DX0NUUkxfRklGT19SRVNFVDsKKwkJCQltY2lfd3JpdGVsKGhvc3QsIENUUkwsIGN0cmwpOworCisjaWZkZWYgQ09ORklHX01NQ19EV19JRE1BQworCQkJCWN0cmwgPSBtY2lfcmVhZGwoaG9zdCwgQk1PRCk7CisJCQkJY3RybCB8PSAweDAxOyAvKiBTb2Z0d2FyZSByZXNldCBvZiBETUEgKi8KKwkJCQltY2lfd3JpdGVsKGhvc3QsIEJNT0QsIGN0cmwpOworI2VuZGlmCisKKwkJCX0KKworCQkJc3Bpbl91bmxvY2soJmhvc3QtPmxvY2spOworCQkJcHJlc2VudCA9IGR3X21jaV9nZXRfY2QobW1jKTsKKwkJfQorCisJCW1tY19kZXRlY3RfY2hhbmdlKHNsb3QtPm1tYywKKwkJCW1zZWNzX3RvX2ppZmZpZXMoaG9zdC0+cGRhdGEtPmRldGVjdF9kZWxheV9tcykpOworCX0KK30KKworc3RhdGljIGludCBfX2luaXQgZHdfbWNpX2luaXRfc2xvdChzdHJ1Y3QgZHdfbWNpICpob3N0LCB1bnNpZ25lZCBpbnQgaWQpCit7CisJc3RydWN0IG1tY19ob3N0ICptbWM7CisJc3RydWN0IGR3X21jaV9zbG90ICpzbG90OworCisJbW1jID0gbW1jX2FsbG9jX2hvc3Qoc2l6ZW9mKHN0cnVjdCBkd19tY2lfc2xvdCksICZob3N0LT5wZGV2LT5kZXYpOworCWlmICghbW1jKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXNsb3QgPSBtbWNfcHJpdihtbWMpOworCXNsb3QtPmlkID0gaWQ7CisJc2xvdC0+bW1jID0gbW1jOworCXNsb3QtPmhvc3QgPSBob3N0OworCisJbW1jLT5vcHMgPSAmZHdfbWNpX29wczsKKwltbWMtPmZfbWluID0gRElWX1JPVU5EX1VQKGhvc3QtPmJ1c19oeiwgNTEwKTsKKwltbWMtPmZfbWF4ID0gaG9zdC0+YnVzX2h6OworCisJaWYgKGhvc3QtPnBkYXRhLT5nZXRfb2NyKQorCQltbWMtPm9jcl9hdmFpbCA9IGhvc3QtPnBkYXRhLT5nZXRfb2NyKGlkKTsKKwllbHNlCisJCW1tYy0+b2NyX2F2YWlsID0gTU1DX1ZERF8zMl8zMyB8IE1NQ19WRERfMzNfMzQ7CisKKwkvKgorCSAqIFN0YXJ0IHdpdGggc2xvdCBwb3dlciBkaXNhYmxlZCwgaXQgd2lsbCBiZSBlbmFibGVkIHdoZW4gYSBjYXJkCisJICogaXMgZGV0ZWN0ZWQuCisJICovCisJaWYgKGhvc3QtPnBkYXRhLT5zZXRwb3dlcikKKwkJaG9zdC0+cGRhdGEtPnNldHBvd2VyKGlkLCAwKTsKKworCW1tYy0+Y2FwcyA9IDA7CisJaWYgKGhvc3QtPnBkYXRhLT5nZXRfYnVzX3dkKQorCQlpZiAoaG9zdC0+cGRhdGEtPmdldF9idXNfd2Qoc2xvdC0+aWQpID49IDQpCisJCQltbWMtPmNhcHMgfD0gTU1DX0NBUF80X0JJVF9EQVRBOworCisJaWYgKGhvc3QtPnBkYXRhLT5xdWlya3MgJiBEV19NQ0lfUVVJUktfSElHSFNQRUVEKQorCQltbWMtPmNhcHMgfD0gTU1DX0NBUF9TRF9ISUdIU1BFRUQ7CisKKyNpZmRlZiBDT05GSUdfTU1DX0RXX0lETUFDCisJbW1jLT5tYXhfc2VncyA9IGhvc3QtPnJpbmdfc2l6ZTsKKwltbWMtPm1heF9ibGtfc2l6ZSA9IDY1NTM2OworCW1tYy0+bWF4X2Jsa19jb3VudCA9IGhvc3QtPnJpbmdfc2l6ZTsKKwltbWMtPm1heF9zZWdfc2l6ZSA9IDB4MTAwMDsKKwltbWMtPm1heF9yZXFfc2l6ZSA9IG1tYy0+bWF4X3NlZ19zaXplICogbW1jLT5tYXhfYmxrX2NvdW50OworI2Vsc2UKKwlpZiAoaG9zdC0+cGRhdGEtPmJsa19zZXR0aW5ncykgeworCQltbWMtPm1heF9zZWdzID0gaG9zdC0+cGRhdGEtPmJsa19zZXR0aW5ncy0+bWF4X3NlZ3M7CisJCW1tYy0+bWF4X2Jsa19zaXplID0gaG9zdC0+cGRhdGEtPmJsa19zZXR0aW5ncy0+bWF4X2Jsa19zaXplOworCQltbWMtPm1heF9ibGtfY291bnQgPSBob3N0LT5wZGF0YS0+YmxrX3NldHRpbmdzLT5tYXhfYmxrX2NvdW50OworCQltbWMtPm1heF9yZXFfc2l6ZSA9IGhvc3QtPnBkYXRhLT5ibGtfc2V0dGluZ3MtPm1heF9yZXFfc2l6ZTsKKwkJbW1jLT5tYXhfc2VnX3NpemUgPSBob3N0LT5wZGF0YS0+YmxrX3NldHRpbmdzLT5tYXhfc2VnX3NpemU7CisJfSBlbHNlIHsKKwkJLyogVXNlZnVsIGRlZmF1bHRzIGlmIHBsYXRmb3JtIGRhdGEgaXMgdW5zZXQuICovCisJCW1tYy0+bWF4X3NlZ3MgPSA2NDsKKwkJbW1jLT5tYXhfYmxrX3NpemUgPSA2NTUzNjsgLyogQkxLU0laIGlzIDE2IGJpdHMgKi8KKwkJbW1jLT5tYXhfYmxrX2NvdW50ID0gNTEyOworCQltbWMtPm1heF9yZXFfc2l6ZSA9IG1tYy0+bWF4X2Jsa19zaXplICogbW1jLT5tYXhfYmxrX2NvdW50OworCQltbWMtPm1heF9zZWdfc2l6ZSA9IG1tYy0+bWF4X3JlcV9zaXplOworCX0KKyNlbmRpZiAvKiBDT05GSUdfTU1DX0RXX0lETUFDICovCisKKwlpZiAoZHdfbWNpX2dldF9jZChtbWMpKQorCQlzZXRfYml0KERXX01NQ19DQVJEX1BSRVNFTlQsICZzbG90LT5mbGFncyk7CisJZWxzZQorCQljbGVhcl9iaXQoRFdfTU1DX0NBUkRfUFJFU0VOVCwgJnNsb3QtPmZsYWdzKTsKKworCWhvc3QtPnNsb3RbaWRdID0gc2xvdDsKKwltbWNfYWRkX2hvc3QobW1jKTsKKworI2lmIGRlZmluZWQoQ09ORklHX0RFQlVHX0ZTKQorCWR3X21jaV9pbml0X2RlYnVnZnMoc2xvdCk7CisjZW5kaWYKKworCS8qIENhcmQgaW5pdGlhbGx5IHVuZGV0ZWN0ZWQgKi8KKwlzbG90LT5sYXN0X2RldGVjdF9zdGF0ZSA9IDA7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZHdfbWNpX2NsZWFudXBfc2xvdChzdHJ1Y3QgZHdfbWNpX3Nsb3QgKnNsb3QsIHVuc2lnbmVkIGludCBpZCkKK3sKKwkvKiBTaHV0ZG93biBkZXRlY3QgSVJRICovCisJaWYgKHNsb3QtPmhvc3QtPnBkYXRhLT5leGl0KQorCQlzbG90LT5ob3N0LT5wZGF0YS0+ZXhpdChpZCk7CisKKwkvKiBEZWJ1Z2ZzIHN0dWZmIGlzIGNsZWFuZWQgdXAgYnkgbW1jIGNvcmUgKi8KKwltbWNfcmVtb3ZlX2hvc3Qoc2xvdC0+bW1jKTsKKwlzbG90LT5ob3N0LT5zbG90W2lkXSA9IE5VTEw7CisJbW1jX2ZyZWVfaG9zdChzbG90LT5tbWMpOworfQorCitzdGF0aWMgdm9pZCBkd19tY2lfaW5pdF9kbWEoc3RydWN0IGR3X21jaSAqaG9zdCkKK3sKKwkvKiBBbGxvYyBtZW1vcnkgZm9yIHNnIHRyYW5zbGF0aW9uICovCisJaG9zdC0+c2dfY3B1ID0gZG1hX2FsbG9jX2NvaGVyZW50KCZob3N0LT5wZGV2LT5kZXYsIFBBR0VfU0laRSwKKwkJCQkJICAmaG9zdC0+c2dfZG1hLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWhvc3QtPnNnX2NwdSkgeworCQlkZXZfZXJyKCZob3N0LT5wZGV2LT5kZXYsICIlczogY291bGQgbm90IGFsbG9jIERNQSBtZW1vcnlcbiIsCisJCQlfX2Z1bmNfXyk7CisJCWdvdG8gbm9fZG1hOworCX0KKworCS8qIERldGVybWluZSB3aGljaCBETUEgaW50ZXJmYWNlIHRvIHVzZSAqLworI2lmZGVmIENPTkZJR19NTUNfRFdfSURNQUMKKwlob3N0LT5kbWFfb3BzID0gJmR3X21jaV9pZG1hY19vcHM7CisJZGV2X2luZm8oJmhvc3QtPnBkZXYtPmRldiwgIlVzaW5nIGludGVybmFsIERNQSBjb250cm9sbGVyLlxuIik7CisjZW5kaWYKKworCWlmICghaG9zdC0+ZG1hX29wcykKKwkJZ290byBub19kbWE7CisKKwlpZiAoaG9zdC0+ZG1hX29wcy0+aW5pdCkgeworCQlpZiAoaG9zdC0+ZG1hX29wcy0+aW5pdChob3N0KSkgeworCQkJZGV2X2VycigmaG9zdC0+cGRldi0+ZGV2LCAiJXM6IFVuYWJsZSB0byBpbml0aWFsaXplICIKKwkJCQkiRE1BIENvbnRyb2xsZXIuXG4iLCBfX2Z1bmNfXyk7CisJCQlnb3RvIG5vX2RtYTsKKwkJfQorCX0gZWxzZSB7CisJCWRldl9lcnIoJmhvc3QtPnBkZXYtPmRldiwgIkRNQSBpbml0aWFsaXphdGlvbiBub3QgZm91bmQuXG4iKTsKKwkJZ290byBub19kbWE7CisJfQorCisJaG9zdC0+dXNlX2RtYSA9IDE7CisJcmV0dXJuOworCitub19kbWE6CisJZGV2X2luZm8oJmhvc3QtPnBkZXYtPmRldiwgIlVzaW5nIFBJTyBtb2RlLlxuIik7CisJaG9zdC0+dXNlX2RtYSA9IDA7CisJcmV0dXJuOworfQorCitzdGF0aWMgYm9vbCBtY2lfd2FpdF9yZXNldChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkd19tY2kgKmhvc3QpCit7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0ID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoNTAwKTsKKwl1bnNpZ25lZCBpbnQgY3RybDsKKworCW1jaV93cml0ZWwoaG9zdCwgQ1RSTCwgKFNETU1DX0NUUkxfUkVTRVQgfCBTRE1NQ19DVFJMX0ZJRk9fUkVTRVQgfAorCQkJCVNETU1DX0NUUkxfRE1BX1JFU0VUKSk7CisKKwkvKiB3YWl0IHRpbGwgcmVzZXRzIGNsZWFyICovCisJZG8geworCQljdHJsID0gbWNpX3JlYWRsKGhvc3QsIENUUkwpOworCQlpZiAoIShjdHJsICYgKFNETU1DX0NUUkxfUkVTRVQgfCBTRE1NQ19DVFJMX0ZJRk9fUkVTRVQgfAorCQkJICAgICAgU0RNTUNfQ1RSTF9ETUFfUkVTRVQpKSkKKwkJCXJldHVybiB0cnVlOworCX0gd2hpbGUgKHRpbWVfYmVmb3JlKGppZmZpZXMsIHRpbWVvdXQpKTsKKworCWRldl9lcnIoZGV2LCAiVGltZW91dCByZXNldHRpbmcgYmxvY2sgKGN0cmwgJSN4KVxuIiwgY3RybCk7CisKKwlyZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBpbnQgZHdfbWNpX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGR3X21jaSAqaG9zdDsKKwlzdHJ1Y3QgcmVzb3VyY2UJKnJlZ3M7CisJc3RydWN0IGR3X21jaV9ib2FyZCAqcGRhdGE7CisJaW50IGlycSwgcmV0LCBpLCB3aWR0aDsKKwl1MzIgZmlmb19zaXplOworCisJcmVncyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJaWYgKCFyZWdzKQorCQlyZXR1cm4gLUVOWElPOworCisJaXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKKwlpZiAoaXJxIDwgMCkKKwkJcmV0dXJuIGlycTsKKworCWhvc3QgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZHdfbWNpKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFob3N0KQorCQlyZXR1cm4gLUVOT01FTTsKKworCWhvc3QtPnBkZXYgPSBwZGV2OworCWhvc3QtPnBkYXRhID0gcGRhdGEgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlpZiAoIXBkYXRhIHx8ICFwZGF0YS0+aW5pdCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsCisJCQkiUGxhdGZvcm0gZGF0YSBtdXN0IHN1cHBseSBpbml0IGZ1bmN0aW9uXG4iKTsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBlcnJfZnJlZWhvc3Q7CisJfQorCisJaWYgKCFwZGF0YS0+c2VsZWN0X3Nsb3QgJiYgcGRhdGEtPm51bV9zbG90cyA+IDEpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LAorCQkJIlBsYXRmb3JtIGRhdGEgbXVzdCBzdXBwbHkgc2VsZWN0X3Nsb3QgZnVuY3Rpb25cbiIpOworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIGVycl9mcmVlaG9zdDsKKwl9CisKKwlpZiAoIXBkYXRhLT5idXNfaHopIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LAorCQkJIlBsYXRmb3JtIGRhdGEgbXVzdCBzdXBwbHkgYnVzIHNwZWVkXG4iKTsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBlcnJfZnJlZWhvc3Q7CisJfQorCisJaG9zdC0+YnVzX2h6ID0gcGRhdGEtPmJ1c19oejsKKwlob3N0LT5xdWlya3MgPSBwZGF0YS0+cXVpcmtzOworCisJc3Bpbl9sb2NrX2luaXQoJmhvc3QtPmxvY2spOworCUlOSVRfTElTVF9IRUFEKCZob3N0LT5xdWV1ZSk7CisKKwlyZXQgPSAtRU5PTUVNOworCWhvc3QtPnJlZ3MgPSBpb3JlbWFwKHJlZ3MtPnN0YXJ0LCByZWdzLT5lbmQgLSByZWdzLT5zdGFydCArIDEpOworCWlmICghaG9zdC0+cmVncykKKwkJZ290byBlcnJfZnJlZWhvc3Q7CisKKwlob3N0LT5kbWFfb3BzID0gcGRhdGEtPmRtYV9vcHM7CisJZHdfbWNpX2luaXRfZG1hKGhvc3QpOworCisJLyoKKwkgKiBHZXQgdGhlIGhvc3QgZGF0YSB3aWR0aCAtIHRoaXMgYXNzdW1lcyB0aGF0IEhDT04gaGFzIGJlZW4gc2V0IHdpdGgKKwkgKiB0aGUgY29ycmVjdCB2YWx1ZXMuCisJICovCisJaSA9IChtY2lfcmVhZGwoaG9zdCwgSENPTikgPj4gNykgJiAweDc7CisJaWYgKCFpKSB7CisJCWhvc3QtPnB1c2hfZGF0YSA9IGR3X21jaV9wdXNoX2RhdGExNjsKKwkJaG9zdC0+cHVsbF9kYXRhID0gZHdfbWNpX3B1bGxfZGF0YTE2OworCQl3aWR0aCA9IDE2OworCQlob3N0LT5kYXRhX3NoaWZ0ID0gMTsKKwl9IGVsc2UgaWYgKGkgPT0gMikgeworCQlob3N0LT5wdXNoX2RhdGEgPSBkd19tY2lfcHVzaF9kYXRhNjQ7CisJCWhvc3QtPnB1bGxfZGF0YSA9IGR3X21jaV9wdWxsX2RhdGE2NDsKKwkJd2lkdGggPSA2NDsKKwkJaG9zdC0+ZGF0YV9zaGlmdCA9IDM7CisJfSBlbHNlIHsKKwkJLyogQ2hlY2sgZm9yIGEgcmVzZXJ2ZWQgdmFsdWUsIGFuZCB3YXJuIGlmIGl0IGlzICovCisJCVdBUk4oKGkgIT0gMSksCisJCSAgICAgIkhDT04gcmVwb3J0cyBhIHJlc2VydmVkIGhvc3QgZGF0YSB3aWR0aCFcbiIKKwkJICAgICAiRGVmYXVsdGluZyB0byAzMi1iaXQgYWNjZXNzLlxuIik7CisJCWhvc3QtPnB1c2hfZGF0YSA9IGR3X21jaV9wdXNoX2RhdGEzMjsKKwkJaG9zdC0+cHVsbF9kYXRhID0gZHdfbWNpX3B1bGxfZGF0YTMyOworCQl3aWR0aCA9IDMyOworCQlob3N0LT5kYXRhX3NoaWZ0ID0gMjsKKwl9CisKKwkvKiBSZXNldCBhbGwgYmxvY2tzICovCisJaWYgKCFtY2lfd2FpdF9yZXNldCgmcGRldi0+ZGV2LCBob3N0KSkgeworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIGVycl9kbWF1bm1hcDsKKwl9CisKKwkvKiBDbGVhciB0aGUgaW50ZXJydXB0cyBmb3IgdGhlIGhvc3QgY29udHJvbGxlciAqLworCW1jaV93cml0ZWwoaG9zdCwgUklOVFNUUywgMHhGRkZGRkZGRik7CisJbWNpX3dyaXRlbChob3N0LCBJTlRNQVNLLCAwKTsgLyogZGlzYWJsZSBhbGwgbW1jIGludGVycnVwdCBmaXJzdCAqLworCisJLyogUHV0IGluIG1heCB0aW1lb3V0ICovCisJbWNpX3dyaXRlbChob3N0LCBUTU9VVCwgMHhGRkZGRkZGRik7CisKKwkvKgorCSAqIEZJRk8gdGhyZXNob2xkIHNldHRpbmdzICBSeE1hcmsgID0gZmlmb19zaXplIC8gMiAtIDEsCisJICogICAgICAgICAgICAgICAgICAgICAgICAgIFR4IE1hcmsgPSBmaWZvX3NpemUgLyAyIERNQSBTaXplID0gOAorCSAqLworCWZpZm9fc2l6ZSA9IG1jaV9yZWFkbChob3N0LCBGSUZPVEgpOworCWZpZm9fc2l6ZSA9IChmaWZvX3NpemUgPj4gMTYpICYgMHg3ZmY7CisJbWNpX3dyaXRlbChob3N0LCBGSUZPVEgsICgoMHgyIDw8IDI4KSB8ICgoZmlmb19zaXplLzIgLSAxKSA8PCAxNikgfAorCQkJCSAgKChmaWZvX3NpemUvMikgPDwgMCkpKTsKKworCS8qIGRpc2FibGUgY2xvY2sgdG8gQ0lVICovCisJbWNpX3dyaXRlbChob3N0LCBDTEtFTkEsIDApOworCW1jaV93cml0ZWwoaG9zdCwgQ0xLU1JDLCAwKTsKKworCXRhc2tsZXRfaW5pdCgmaG9zdC0+dGFza2xldCwgZHdfbWNpX3Rhc2tsZXRfZnVuYywgKHVuc2lnbmVkIGxvbmcpaG9zdCk7CisJdGFza2xldF9pbml0KCZob3N0LT5jYXJkX3Rhc2tsZXQsCisJCSAgICAgZHdfbWNpX3Rhc2tsZXRfY2FyZCwgKHVuc2lnbmVkIGxvbmcpaG9zdCk7CisKKwlyZXQgPSByZXF1ZXN0X2lycShpcnEsIGR3X21jaV9pbnRlcnJ1cHQsIDAsICJkdy1tY2kiLCBob3N0KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl9kbWF1bm1hcDsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGhvc3QpOworCisJaWYgKGhvc3QtPnBkYXRhLT5udW1fc2xvdHMpCisJCWhvc3QtPm51bV9zbG90cyA9IGhvc3QtPnBkYXRhLT5udW1fc2xvdHM7CisJZWxzZQorCQlob3N0LT5udW1fc2xvdHMgPSAoKG1jaV9yZWFkbChob3N0LCBIQ09OKSA+PiAxKSAmIDB4MUYpICsgMTsKKworCS8qIFdlIG5lZWQgYXQgbGVhc3Qgb25lIHNsb3QgdG8gc3VjY2VlZCAqLworCWZvciAoaSA9IDA7IGkgPCBob3N0LT5udW1fc2xvdHM7IGkrKykgeworCQlyZXQgPSBkd19tY2lfaW5pdF9zbG90KGhvc3QsIGkpOworCQlpZiAocmV0KSB7CisJCQlyZXQgPSAtRU5PREVWOworCQkJZ290byBlcnJfaW5pdF9zbG90OworCQl9CisJfQorCisJLyoKKwkgKiBFbmFibGUgaW50ZXJydXB0cyBmb3IgY29tbWFuZCBkb25lLCBkYXRhIG92ZXIsIGRhdGEgZW1wdHksIGNhcmQgZGV0LAorCSAqIHJlY2VpdmUgcmVhZHkgYW5kIGVycm9yIHN1Y2ggYXMgdHJhbnNtaXQsIHJlY2VpdmUgdGltZW91dCwgY3JjIGVycm9yCisJICovCisJbWNpX3dyaXRlbChob3N0LCBSSU5UU1RTLCAweEZGRkZGRkZGKTsKKwltY2lfd3JpdGVsKGhvc3QsIElOVE1BU0ssIFNETU1DX0lOVF9DTURfRE9ORSB8IFNETU1DX0lOVF9EQVRBX09WRVIgfAorCQkgICBTRE1NQ19JTlRfVFhEUiB8IFNETU1DX0lOVF9SWERSIHwKKwkJICAgRFdfTUNJX0VSUk9SX0ZMQUdTIHwgU0RNTUNfSU5UX0NEKTsKKwltY2lfd3JpdGVsKGhvc3QsIENUUkwsIFNETU1DX0NUUkxfSU5UX0VOQUJMRSk7IC8qIEVuYWJsZSBtY2kgaW50ZXJydXB0ICovCisKKwlkZXZfaW5mbygmcGRldi0+ZGV2LCAiRFcgTU1DIGNvbnRyb2xsZXIgYXQgaXJxICVkLCAiCisJCSAiJWQgYml0IGhvc3QgZGF0YSB3aWR0aFxuIiwgaXJxLCB3aWR0aCk7CisJaWYgKGhvc3QtPnF1aXJrcyAmIERXX01DSV9RVUlSS19JRE1BQ19EVE8pCisJCWRldl9pbmZvKCZwZGV2LT5kZXYsICJJbnRlcm5hbCBETUFDIGludGVycnVwdCBmaXggZW5hYmxlZC5cbiIpOworCisJcmV0dXJuIDA7CisKK2Vycl9pbml0X3Nsb3Q6CisJLyogRGUtaW5pdCBhbnkgaW5pdGlhbGl6ZWQgc2xvdHMgKi8KKwl3aGlsZSAoaSA+IDApIHsKKwkJaWYgKGhvc3QtPnNsb3RbaV0pCisJCQlkd19tY2lfY2xlYW51cF9zbG90KGhvc3QtPnNsb3RbaV0sIGkpOworCQlpLS07CisJfQorCWZyZWVfaXJxKGlycSwgaG9zdCk7CisKK2Vycl9kbWF1bm1hcDoKKwlpZiAoaG9zdC0+dXNlX2RtYSAmJiBob3N0LT5kbWFfb3BzLT5leGl0KQorCQlob3N0LT5kbWFfb3BzLT5leGl0KGhvc3QpOworCWRtYV9mcmVlX2NvaGVyZW50KCZob3N0LT5wZGV2LT5kZXYsIFBBR0VfU0laRSwKKwkJCSAgaG9zdC0+c2dfY3B1LCBob3N0LT5zZ19kbWEpOworCWlvdW5tYXAoaG9zdC0+cmVncyk7CisKK2Vycl9mcmVlaG9zdDoKKwlrZnJlZShob3N0KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9fZXhpdCBkd19tY2lfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGR3X21jaSAqaG9zdCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCWludCBpOworCisJbWNpX3dyaXRlbChob3N0LCBSSU5UU1RTLCAweEZGRkZGRkZGKTsKKwltY2lfd3JpdGVsKGhvc3QsIElOVE1BU0ssIDApOyAvKiBkaXNhYmxlIGFsbCBtbWMgaW50ZXJydXB0IGZpcnN0ICovCisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKworCWZvciAoaSA9IDA7IGkgPCBob3N0LT5udW1fc2xvdHM7IGkrKykgeworCQlkZXZfZGJnKCZwZGV2LT5kZXYsICJyZW1vdmUgc2xvdCAlZFxuIiwgaSk7CisJCWlmIChob3N0LT5zbG90W2ldKQorCQkJZHdfbWNpX2NsZWFudXBfc2xvdChob3N0LT5zbG90W2ldLCBpKTsKKwl9CisKKwkvKiBkaXNhYmxlIGNsb2NrIHRvIENJVSAqLworCW1jaV93cml0ZWwoaG9zdCwgQ0xLRU5BLCAwKTsKKwltY2lfd3JpdGVsKGhvc3QsIENMS1NSQywgMCk7CisKKwlmcmVlX2lycShwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApLCBob3N0KTsKKwlkbWFfZnJlZV9jb2hlcmVudCgmcGRldi0+ZGV2LCBQQUdFX1NJWkUsIGhvc3QtPnNnX2NwdSwgaG9zdC0+c2dfZG1hKTsKKworCWlmIChob3N0LT51c2VfZG1hICYmIGhvc3QtPmRtYV9vcHMtPmV4aXQpCisJCWhvc3QtPmRtYV9vcHMtPmV4aXQoaG9zdCk7CisKKwlpb3VubWFwKGhvc3QtPnJlZ3MpOworCisJa2ZyZWUoaG9zdCk7CisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBDT05GSUdfUE0KKy8qCisgKiBUT0RPOiB3ZSBzaG91bGQgcHJvYmFibHkgZGlzYWJsZSB0aGUgY2xvY2sgdG8gdGhlIGNhcmQgaW4gdGhlIHN1c3BlbmQgcGF0aC4KKyAqLworc3RhdGljIGludCBkd19tY2lfc3VzcGVuZChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LCBwbV9tZXNzYWdlX3QgbWVzZykKK3sKKwlpbnQgaSwgcmV0OworCXN0cnVjdCBkd19tY2kgKmhvc3QgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCWZvciAoaSA9IDA7IGkgPCBob3N0LT5udW1fc2xvdHM7IGkrKykgeworCQlzdHJ1Y3QgZHdfbWNpX3Nsb3QgKnNsb3QgPSBob3N0LT5zbG90W2ldOworCQlpZiAoIXNsb3QpCisJCQljb250aW51ZTsKKwkJcmV0ID0gbW1jX3N1c3BlbmRfaG9zdChzbG90LT5tbWMpOworCQlpZiAocmV0IDwgMCkgeworCQkJd2hpbGUgKC0taSA+PSAwKSB7CisJCQkJc2xvdCA9IGhvc3QtPnNsb3RbaV07CisJCQkJaWYgKHNsb3QpCisJCQkJCW1tY19yZXN1bWVfaG9zdChob3N0LT5zbG90W2ldLT5tbWMpOworCQkJfQorCQkJcmV0dXJuIHJldDsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGR3X21jaV9yZXN1bWUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlpbnQgaSwgcmV0OworCXN0cnVjdCBkd19tY2kgKmhvc3QgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCWZvciAoaSA9IDA7IGkgPCBob3N0LT5udW1fc2xvdHM7IGkrKykgeworCQlzdHJ1Y3QgZHdfbWNpX3Nsb3QgKnNsb3QgPSBob3N0LT5zbG90W2ldOworCQlpZiAoIXNsb3QpCisJCQljb250aW51ZTsKKwkJcmV0ID0gbW1jX3Jlc3VtZV9ob3N0KGhvc3QtPnNsb3RbaV0tPm1tYyk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKyNlbHNlCisjZGVmaW5lIGR3X21jaV9zdXNwZW5kCU5VTEwKKyNkZWZpbmUgZHdfbWNpX3Jlc3VtZQlOVUxMCisjZW5kaWYgLyogQ09ORklHX1BNICovCisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGR3X21jaV9kcml2ZXIgPSB7CisJLnJlbW92ZQkJPSBfX2V4aXRfcChkd19tY2lfcmVtb3ZlKSwKKwkuc3VzcGVuZAk9IGR3X21jaV9zdXNwZW5kLAorCS5yZXN1bWUJCT0gZHdfbWNpX3Jlc3VtZSwKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJCT0gImR3X21tYyIsCisJfSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGR3X21jaV9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9wcm9iZSgmZHdfbWNpX2RyaXZlciwgZHdfbWNpX3Byb2JlKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGR3X21jaV9leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmR3X21jaV9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChkd19tY2lfaW5pdCk7Cittb2R1bGVfZXhpdChkd19tY2lfZXhpdCk7CisKK01PRFVMRV9ERVNDUklQVElPTigiRFcgTXVsdGltZWRpYSBDYXJkIEludGVyZmFjZSBkcml2ZXIiKTsKK01PRFVMRV9BVVRIT1IoIk5YUCBTZW1pY29uZHVjdG9yIFZpZXROYW0iKTsKK01PRFVMRV9BVVRIT1IoIkltYWdpbmF0aW9uIFRlY2hub2xvZ2llcyBMdGQiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2hvc3QvZHdfbW1jLmggYi9kcml2ZXJzL21tYy9ob3N0L2R3X21tYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkZDU1YTcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21tYy9ob3N0L2R3X21tYy5oCkBAIC0wLDAgKzEsMTY4IEBACisvKgorICogU3lub3BzeXMgRGVzaWduV2FyZSBNdWx0aW1lZGlhIENhcmQgSW50ZXJmYWNlIGRyaXZlcgorICogIChCYXNlZCBvbiBOWFAgZHJpdmVyIGZvciBscGMgMzF4eCkKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgTlhQIFNlbWljb25kdWN0b3JzCisgKiBDb3B5cmlnaHQgKEMpIDIwMDksIDIwMTAgSW1hZ2luYXRpb24gVGVjaG5vbG9naWVzIEx0ZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpZm5kZWYgX0RXX01NQ19IXworI2RlZmluZSBfRFdfTU1DX0hfCisKKyNkZWZpbmUgU0RNTUNfQ1RSTAkJMHgwMDAKKyNkZWZpbmUgU0RNTUNfUFdSRU4JCTB4MDA0CisjZGVmaW5lIFNETU1DX0NMS0RJVgkJMHgwMDgKKyNkZWZpbmUgU0RNTUNfQ0xLU1JDCQkweDAwYworI2RlZmluZSBTRE1NQ19DTEtFTkEJCTB4MDEwCisjZGVmaW5lIFNETU1DX1RNT1VUCQkweDAxNAorI2RlZmluZSBTRE1NQ19DVFlQRQkJMHgwMTgKKyNkZWZpbmUgU0RNTUNfQkxLU0laCQkweDAxYworI2RlZmluZSBTRE1NQ19CWVRDTlQJCTB4MDIwCisjZGVmaW5lIFNETU1DX0lOVE1BU0sJCTB4MDI0CisjZGVmaW5lIFNETU1DX0NNREFSRwkJMHgwMjgKKyNkZWZpbmUgU0RNTUNfQ01ECQkweDAyYworI2RlZmluZSBTRE1NQ19SRVNQMAkJMHgwMzAKKyNkZWZpbmUgU0RNTUNfUkVTUDEJCTB4MDM0CisjZGVmaW5lIFNETU1DX1JFU1AyCQkweDAzOAorI2RlZmluZSBTRE1NQ19SRVNQMwkJMHgwM2MKKyNkZWZpbmUgU0RNTUNfTUlOVFNUUwkJMHgwNDAKKyNkZWZpbmUgU0RNTUNfUklOVFNUUwkJMHgwNDQKKyNkZWZpbmUgU0RNTUNfU1RBVFVTCQkweDA0OAorI2RlZmluZSBTRE1NQ19GSUZPVEgJCTB4MDRjCisjZGVmaW5lIFNETU1DX0NERVRFQ1QJCTB4MDUwCisjZGVmaW5lIFNETU1DX1dSVFBSVAkJMHgwNTQKKyNkZWZpbmUgU0RNTUNfR1BJTwkJMHgwNTgKKyNkZWZpbmUgU0RNTUNfVENCQ05UCQkweDA1YworI2RlZmluZSBTRE1NQ19UQkJDTlQJCTB4MDYwCisjZGVmaW5lIFNETU1DX0RFQk5DRQkJMHgwNjQKKyNkZWZpbmUgU0RNTUNfVVNSSUQJCTB4MDY4CisjZGVmaW5lIFNETU1DX1ZFUklECQkweDA2YworI2RlZmluZSBTRE1NQ19IQ09OCQkweDA3MAorI2RlZmluZSBTRE1NQ19CTU9ECQkweDA4MAorI2RlZmluZSBTRE1NQ19QTERNTkQJCTB4MDg0CisjZGVmaW5lIFNETU1DX0RCQUREUgkJMHgwODgKKyNkZWZpbmUgU0RNTUNfSURTVFMJCTB4MDhjCisjZGVmaW5lIFNETU1DX0lESU5URU4JCTB4MDkwCisjZGVmaW5lIFNETU1DX0RTQ0FERFIJCTB4MDk0CisjZGVmaW5lIFNETU1DX0JVRkFERFIJCTB4MDk4CisjZGVmaW5lIFNETU1DX0RBVEEJCTB4MTAwCisjZGVmaW5lIFNETU1DX0RBVEFfQURSCQkweDEwMAorCisvKiBzaGlmdCBiaXQgZmllbGQgKi8KKyNkZWZpbmUgX1NCRihmLCB2KQkJKCh2KSA8PCAoZikpCisKKy8qIENvbnRyb2wgcmVnaXN0ZXIgZGVmaW5lcyAqLworI2RlZmluZSBTRE1NQ19DVFJMX1VTRV9JRE1BQwkJQklUKDI1KQorI2RlZmluZSBTRE1NQ19DVFJMX0NFQVRBX0lOVF9FTgkJQklUKDExKQorI2RlZmluZSBTRE1NQ19DVFJMX1NFTkRfQVNfQ0NTRAkJQklUKDEwKQorI2RlZmluZSBTRE1NQ19DVFJMX1NFTkRfQ0NTRAkJQklUKDkpCisjZGVmaW5lIFNETU1DX0NUUkxfQUJSVF9SRUFEX0RBVEEJQklUKDgpCisjZGVmaW5lIFNETU1DX0NUUkxfU0VORF9JUlFfUkVTUAlCSVQoNykKKyNkZWZpbmUgU0RNTUNfQ1RSTF9SRUFEX1dBSVQJCUJJVCg2KQorI2RlZmluZSBTRE1NQ19DVFJMX0RNQV9FTkFCTEUJCUJJVCg1KQorI2RlZmluZSBTRE1NQ19DVFJMX0lOVF9FTkFCTEUJCUJJVCg0KQorI2RlZmluZSBTRE1NQ19DVFJMX0RNQV9SRVNFVAkJQklUKDIpCisjZGVmaW5lIFNETU1DX0NUUkxfRklGT19SRVNFVAkJQklUKDEpCisjZGVmaW5lIFNETU1DX0NUUkxfUkVTRVQJCUJJVCgwKQorLyogQ2xvY2sgRW5hYmxlIHJlZ2lzdGVyIGRlZmluZXMgKi8KKyNkZWZpbmUgU0RNTUNfQ0xLRU5fTE9XX1BXUgkJQklUKDE2KQorI2RlZmluZSBTRE1NQ19DTEtFTl9FTkFCTEUJCUJJVCgwKQorLyogdGltZS1vdXQgcmVnaXN0ZXIgZGVmaW5lcyAqLworI2RlZmluZSBTRE1NQ19UTU9VVF9EQVRBKG4pCQlfU0JGKDgsIChuKSkKKyNkZWZpbmUgU0RNTUNfVE1PVVRfREFUQV9NU0sJCTB4RkZGRkZGMDAKKyNkZWZpbmUgU0RNTUNfVE1PVVRfUkVTUChuKQkJKChuKSAmIDB4RkYpCisjZGVmaW5lIFNETU1DX1RNT1VUX1JFU1BfTVNLCQkweEZGCisvKiBjYXJkLXR5cGUgcmVnaXN0ZXIgZGVmaW5lcyAqLworI2RlZmluZSBTRE1NQ19DVFlQRV84QklUCQlCSVQoMTYpCisjZGVmaW5lIFNETU1DX0NUWVBFXzRCSVQJCUJJVCgwKQorI2RlZmluZSBTRE1NQ19DVFlQRV8xQklUCQkwCisvKiBJbnRlcnJ1cHQgc3RhdHVzICYgbWFzayByZWdpc3RlciBkZWZpbmVzICovCisjZGVmaW5lIFNETU1DX0lOVF9TRElPCQkJQklUKDE2KQorI2RlZmluZSBTRE1NQ19JTlRfRUJFCQkJQklUKDE1KQorI2RlZmluZSBTRE1NQ19JTlRfQUNECQkJQklUKDE0KQorI2RlZmluZSBTRE1NQ19JTlRfU0JFCQkJQklUKDEzKQorI2RlZmluZSBTRE1NQ19JTlRfSExFCQkJQklUKDEyKQorI2RlZmluZSBTRE1NQ19JTlRfRlJVTgkJCUJJVCgxMSkKKyNkZWZpbmUgU0RNTUNfSU5UX0hUTwkJCUJJVCgxMCkKKyNkZWZpbmUgU0RNTUNfSU5UX0RUTwkJCUJJVCg5KQorI2RlZmluZSBTRE1NQ19JTlRfUlRPCQkJQklUKDgpCisjZGVmaW5lIFNETU1DX0lOVF9EQ1JDCQkJQklUKDcpCisjZGVmaW5lIFNETU1DX0lOVF9SQ1JDCQkJQklUKDYpCisjZGVmaW5lIFNETU1DX0lOVF9SWERSCQkJQklUKDUpCisjZGVmaW5lIFNETU1DX0lOVF9UWERSCQkJQklUKDQpCisjZGVmaW5lIFNETU1DX0lOVF9EQVRBX09WRVIJCUJJVCgzKQorI2RlZmluZSBTRE1NQ19JTlRfQ01EX0RPTkUJCUJJVCgyKQorI2RlZmluZSBTRE1NQ19JTlRfUkVTUF9FUlIJCUJJVCgxKQorI2RlZmluZSBTRE1NQ19JTlRfQ0QJCQlCSVQoMCkKKyNkZWZpbmUgU0RNTUNfSU5UX0VSUk9SCQkJMHhiZmMyCisvKiBDb21tYW5kIHJlZ2lzdGVyIGRlZmluZXMgKi8KKyNkZWZpbmUgU0RNTUNfQ01EX1NUQVJUCQkJQklUKDMxKQorI2RlZmluZSBTRE1NQ19DTURfQ0NTX0VYUAkJQklUKDIzKQorI2RlZmluZSBTRE1NQ19DTURfQ0VBVEFfUkQJCUJJVCgyMikKKyNkZWZpbmUgU0RNTUNfQ01EX1VQRF9DTEsJCUJJVCgyMSkKKyNkZWZpbmUgU0RNTUNfQ01EX0lOSVQJCQlCSVQoMTUpCisjZGVmaW5lIFNETU1DX0NNRF9TVE9QCQkJQklUKDE0KQorI2RlZmluZSBTRE1NQ19DTURfUFJWX0RBVF9XQUlUCQlCSVQoMTMpCisjZGVmaW5lIFNETU1DX0NNRF9TRU5EX1NUT1AJCUJJVCgxMikKKyNkZWZpbmUgU0RNTUNfQ01EX1NUUk1fTU9ERQkJQklUKDExKQorI2RlZmluZSBTRE1NQ19DTURfREFUX1dSCQlCSVQoMTApCisjZGVmaW5lIFNETU1DX0NNRF9EQVRfRVhQCQlCSVQoOSkKKyNkZWZpbmUgU0RNTUNfQ01EX1JFU1BfQ1JDCQlCSVQoOCkKKyNkZWZpbmUgU0RNTUNfQ01EX1JFU1BfTE9ORwkJQklUKDcpCisjZGVmaW5lIFNETU1DX0NNRF9SRVNQX0VYUAkJQklUKDYpCisjZGVmaW5lIFNETU1DX0NNRF9JTkRYKG4pCQkoKG4pICYgMHgxRikKKy8qIFN0YXR1cyByZWdpc3RlciBkZWZpbmVzICovCisjZGVmaW5lIFNETU1DX0dFVF9GQ05UKHgpCQkoKCh4KT4+MTcpICYgMHgxRkYpCisjZGVmaW5lIFNETU1DX0ZJRk9fU1oJCQkzMgorLyogSW50ZXJuYWwgRE1BQyBpbnRlcnJ1cHQgZGVmaW5lcyAqLworI2RlZmluZSBTRE1NQ19JRE1BQ19JTlRfQUkJCUJJVCg5KQorI2RlZmluZSBTRE1NQ19JRE1BQ19JTlRfTkkJCUJJVCg4KQorI2RlZmluZSBTRE1NQ19JRE1BQ19JTlRfQ0VTCQlCSVQoNSkKKyNkZWZpbmUgU0RNTUNfSURNQUNfSU5UX0RVCQlCSVQoNCkKKyNkZWZpbmUgU0RNTUNfSURNQUNfSU5UX0ZCRQkJQklUKDIpCisjZGVmaW5lIFNETU1DX0lETUFDX0lOVF9SSQkJQklUKDEpCisjZGVmaW5lIFNETU1DX0lETUFDX0lOVF9USQkJQklUKDApCisvKiBJbnRlcm5hbCBETUFDIGJ1cyBtb2RlIGJpdHMgKi8KKyNkZWZpbmUgU0RNTUNfSURNQUNfRU5BQkxFCQlCSVQoNykKKyNkZWZpbmUgU0RNTUNfSURNQUNfRkIJCQlCSVQoMSkKKyNkZWZpbmUgU0RNTUNfSURNQUNfU1dSRVNFVAkJQklUKDApCisKKy8qIFJlZ2lzdGVyIGFjY2VzcyBtYWNyb3MgKi8KKyNkZWZpbmUgbWNpX3JlYWRsKGRldiwgcmVnKQkJCVwKKwlfX3Jhd19yZWFkbChkZXYtPnJlZ3MgKyBTRE1NQ18jI3JlZykKKyNkZWZpbmUgbWNpX3dyaXRlbChkZXYsIHJlZywgdmFsdWUpCQkJXAorCV9fcmF3X3dyaXRlbCgodmFsdWUpLCBkZXYtPnJlZ3MgKyBTRE1NQ18jI3JlZykKKworLyogMTYtYml0IEZJRk8gYWNjZXNzIG1hY3JvcyAqLworI2RlZmluZSBtY2lfcmVhZHcoZGV2LCByZWcpCQkJXAorCV9fcmF3X3JlYWR3KGRldi0+cmVncyArIFNETU1DXyMjcmVnKQorI2RlZmluZSBtY2lfd3JpdGV3KGRldiwgcmVnLCB2YWx1ZSkJCQlcCisJX19yYXdfd3JpdGV3KCh2YWx1ZSksIGRldi0+cmVncyArIFNETU1DXyMjcmVnKQorCisvKiA2NC1iaXQgRklGTyBhY2Nlc3MgbWFjcm9zICovCisjaWZkZWYgcmVhZHEKKyNkZWZpbmUgbWNpX3JlYWRxKGRldiwgcmVnKQkJCVwKKwlfX3Jhd19yZWFkcShkZXYtPnJlZ3MgKyBTRE1NQ18jI3JlZykKKyNkZWZpbmUgbWNpX3dyaXRlcShkZXYsIHJlZywgdmFsdWUpCQkJXAorCV9fcmF3X3dyaXRlcSgodmFsdWUpLCBkZXYtPnJlZ3MgKyBTRE1NQ18jI3JlZykKKyNlbHNlCisvKgorICogRHVtbXkgcmVhZHEgaW1wbGVtZW50YXRpb24gZm9yIGFyY2hpdGVjdHVyZXMgdGhhdCBkb24ndCBkZWZpbmUgaXQuCisgKgorICogV2Ugd291bGQgYXNzdW1lIHRoYXQgbm9uZSBvZiB0aGVzZSBhcmNoaXRlY3R1cmVzIHdvdWxkIGNvbmZpZ3VyZQorICogdGhlIElQIGJsb2NrIHdpdGggYSA2NGJpdCBGSUZPIHdpZHRoLCBzbyB0aGlzIGNvZGUgd2lsbCBuZXZlciBiZQorICogZXhlY3V0ZWQgb24gdGhvc2UgbWFjaGluZXMuIERlZmluaW5nIHRoZXNlIG1hY3JvcyBoZXJlIGtlZXBzIHRoZQorICogcmVzdCBvZiB0aGUgY29kZSBmcmVlIGZyb20gaWZkZWZzLgorICovCisjZGVmaW5lIG1jaV9yZWFkcShkZXYsIHJlZykJCQlcCisJKCoodm9sYXRpbGUgdTY0IF9fZm9yY2UgKikoZGV2LT5yZWdzICsgU0RNTUNfIyNyZWcpKQorI2RlZmluZSBtY2lfd3JpdGVxKGRldiwgcmVnLCB2YWx1ZSkJCQlcCisJKCoodm9sYXRpbGUgdTY0IF9fZm9yY2UgKikoZGV2LT5yZWdzICsgU0RNTUNfIyNyZWcpID0gdmFsdWUpCisjZW5kaWYKKworI2VuZGlmIC8qIF9EV19NTUNfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2hvc3QvbXhjbW1jLmMgYi9kcml2ZXJzL21tYy9ob3N0L214Y21tYy5jCmluZGV4IGJkZDJjYmIuLjQ0Mjg1OTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2hvc3QvbXhjbW1jLmMKKysrIGIvZHJpdmVycy9tbWMvaG9zdC9teGNtbWMuYwpAQCAtMzEsNiArMzEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9jb25zdW1lci5oPgogCiAjaW5jbHVkZSA8YXNtL2RtYS5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KQEAgLTE0MSwxMCArMTQyLDQ5IEBACiAKIAlzdHJ1Y3Qgd29ya19zdHJ1Y3QJZGF0YXdvcms7CiAJc3BpbmxvY2tfdAkJbG9jazsKKworCXN0cnVjdCByZWd1bGF0b3IJKnZjYzsKIH07CiAKIHN0YXRpYyB2b2lkIG14Y21jaV9zZXRfY2xrX3JhdGUoc3RydWN0IG14Y21jaV9ob3N0ICpob3N0LCB1bnNpZ25lZCBpbnQgY2xrX2lvcyk7CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCBteGNtY2lfaW5pdF9vY3Ioc3RydWN0IG14Y21jaV9ob3N0ICpob3N0KQoreworCWhvc3QtPnZjYyA9IHJlZ3VsYXRvcl9nZXQobW1jX2Rldihob3N0LT5tbWMpLCAidm1tYyIpOworCisJaWYgKElTX0VSUihob3N0LT52Y2MpKSB7CisJCWhvc3QtPnZjYyA9IE5VTEw7CisJfSBlbHNlIHsKKwkJaG9zdC0+bW1jLT5vY3JfYXZhaWwgPSBtbWNfcmVndWxhdG9yX2dldF9vY3JtYXNrKGhvc3QtPnZjYyk7CisJCWlmIChob3N0LT5wZGF0YSAmJiBob3N0LT5wZGF0YS0+b2NyX2F2YWlsKQorCQkJZGV2X3dhcm4obW1jX2Rldihob3N0LT5tbWMpLAorCQkJCSJwZGF0YS0+b2NyX2F2YWlsIHdpbGwgbm90IGJlIHVzZWRcbiIpOworCX0KKworCWlmIChob3N0LT52Y2MgPT0gTlVMTCkgeworCQkvKiBmYWxsLWJhY2sgdG8gcGxhdGZvcm0gZGF0YSAqLworCQlpZiAoaG9zdC0+cGRhdGEgJiYgaG9zdC0+cGRhdGEtPm9jcl9hdmFpbCkKKwkJCWhvc3QtPm1tYy0+b2NyX2F2YWlsID0gaG9zdC0+cGRhdGEtPm9jcl9hdmFpbDsKKwkJZWxzZQorCQkJaG9zdC0+bW1jLT5vY3JfYXZhaWwgPSBNTUNfVkREXzMyXzMzIHwgTU1DX1ZERF8zM18zNDsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBteGNtY2lfc2V0X3Bvd2VyKHN0cnVjdCBteGNtY2lfaG9zdCAqaG9zdCwKKwkJCQkgICAgdW5zaWduZWQgY2hhciBwb3dlcl9tb2RlLAorCQkJCSAgICB1bnNpZ25lZCBpbnQgdmRkKQoreworCWlmIChob3N0LT52Y2MpIHsKKwkJaWYgKHBvd2VyX21vZGUgPT0gTU1DX1BPV0VSX1VQKQorCQkJbW1jX3JlZ3VsYXRvcl9zZXRfb2NyKGhvc3QtPm1tYywgaG9zdC0+dmNjLCB2ZGQpOworCQllbHNlIGlmIChwb3dlcl9tb2RlID09IE1NQ19QT1dFUl9PRkYpCisJCQltbWNfcmVndWxhdG9yX3NldF9vY3IoaG9zdC0+bW1jLCBob3N0LT52Y2MsIDApOworCX0KKworCWlmIChob3N0LT5wZGF0YSAmJiBob3N0LT5wZGF0YS0+c2V0cG93ZXIpCisJCWhvc3QtPnBkYXRhLT5zZXRwb3dlcihtbWNfZGV2KGhvc3QtPm1tYyksIHZkZCk7Cit9CisKIHN0YXRpYyBpbmxpbmUgaW50IG14Y21jaV91c2VfZG1hKHN0cnVjdCBteGNtY2lfaG9zdCAqaG9zdCkKIHsKIAlyZXR1cm4gaG9zdC0+ZG9fZG1hOwpAQCAtNjgwLDkgKzcyMCw5IEBACiAJCWhvc3QtPmNtZGF0ICY9IH5DTURfREFUX0NPTlRfQlVTX1dJRFRIXzQ7CiAKIAlpZiAoaG9zdC0+cG93ZXJfbW9kZSAhPSBpb3MtPnBvd2VyX21vZGUpIHsKLQkJaWYgKGhvc3QtPnBkYXRhICYmIGhvc3QtPnBkYXRhLT5zZXRwb3dlcikKLQkJCWhvc3QtPnBkYXRhLT5zZXRwb3dlcihtbWNfZGV2KG1tYyksIGlvcy0+dmRkKTsKKwkJbXhjbWNpX3NldF9wb3dlcihob3N0LCBpb3MtPnBvd2VyX21vZGUsIGlvcy0+dmRkKTsKIAkJaG9zdC0+cG93ZXJfbW9kZSA9IGlvcy0+cG93ZXJfbW9kZTsKKwogCQlpZiAoaW9zLT5wb3dlcl9tb2RlID09IE1NQ19QT1dFUl9PTikKIAkJCWhvc3QtPmNtZGF0IHw9IENNRF9EQVRfQ09OVF9JTklUOwogCX0KQEAgLTgwNywxMCArODQ3LDcgQEAKIAlob3N0LT5wZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOwogCXNwaW5fbG9ja19pbml0KCZob3N0LT5sb2NrKTsKIAotCWlmIChob3N0LT5wZGF0YSAmJiBob3N0LT5wZGF0YS0+b2NyX2F2YWlsKQotCQltbWMtPm9jcl9hdmFpbCA9IGhvc3QtPnBkYXRhLT5vY3JfYXZhaWw7Ci0JZWxzZQotCQltbWMtPm9jcl9hdmFpbCA9IE1NQ19WRERfMzJfMzMgfCBNTUNfVkREXzMzXzM0OworCW14Y21jaV9pbml0X29jcihob3N0KTsKIAogCWlmIChob3N0LT5wZGF0YSAmJiBob3N0LT5wZGF0YS0+ZGF0M19jYXJkX2RldGVjdCkKIAkJaG9zdC0+ZGVmYXVsdF9pcnFfbWFzayA9CkBAIC05MTUsNiArOTUyLDkgQEAKIAogCW1tY19yZW1vdmVfaG9zdChtbWMpOwogCisJaWYgKGhvc3QtPnZjYykKKwkJcmVndWxhdG9yX3B1dChob3N0LT52Y2MpOworCiAJaWYgKGhvc3QtPnBkYXRhICYmIGhvc3QtPnBkYXRhLT5leGl0KQogCQlob3N0LT5wZGF0YS0+ZXhpdCgmcGRldi0+ZGV2LCBtbWMpOwogCkBAIC05MjcsNyArOTY3LDYgQEAKIAljbGtfcHV0KGhvc3QtPmNsayk7CiAKIAlyZWxlYXNlX21lbV9yZWdpb24oaG9zdC0+cmVzLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShob3N0LT5yZXMpKTsKLQlyZWxlYXNlX3Jlc291cmNlKGhvc3QtPnJlcyk7CiAKIAltbWNfZnJlZV9ob3N0KG1tYyk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktZG92ZS5jIGIvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1kb3ZlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmFlZWY0ZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktZG92ZS5jCkBAIC0wLDAgKzEsNzAgQEAKKy8qCisgKiBzZGhjaS1kb3ZlLmMgU3VwcG9ydCBmb3IgU0RIQ0kgb24gTWFydmVsbCdzIERvdmUgU29DCisgKgorICogQXV0aG9yOiBTYWVlZCBCaXNoYXJhIDxzYWVlZEBtYXJ2ZWxsLmNvbT4KKyAqCSAgIE1pa2UgUmFwb3BvcnQgPG1pa2VAY29tcHVsYWIuY28uaWw+CisgKiBCYXNlZCBvbiBzZGhjaS1jbnMzeHh4LmMKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9tbWMvaG9zdC5oPgorCisjaW5jbHVkZSAic2RoY2kuaCIKKyNpbmNsdWRlICJzZGhjaS1wbHRmbS5oIgorCitzdGF0aWMgdTE2IHNkaGNpX2RvdmVfcmVhZHcoc3RydWN0IHNkaGNpX2hvc3QgKmhvc3QsIGludCByZWcpCit7CisJdTE2IHJldDsKKworCXN3aXRjaCAocmVnKSB7CisJY2FzZSBTREhDSV9IT1NUX1ZFUlNJT046CisJY2FzZSBTREhDSV9TTE9UX0lOVF9TVEFUVVM6CisJCS8qIHRob3NlIHJlZ2lzdGVycyBkb24ndCBleGlzdCAqLworCQlyZXR1cm4gMDsKKwlkZWZhdWx0OgorCQlyZXQgPSByZWFkdyhob3N0LT5pb2FkZHIgKyByZWcpOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdTMyIHNkaGNpX2RvdmVfcmVhZGwoc3RydWN0IHNkaGNpX2hvc3QgKmhvc3QsIGludCByZWcpCit7CisJdTMyIHJldDsKKworCXN3aXRjaCAocmVnKSB7CisJY2FzZSBTREhDSV9DQVBBQklMSVRJRVM6CisJCXJldCA9IHJlYWRsKGhvc3QtPmlvYWRkciArIHJlZyk7CisJCS8qIE1hc2sgdGhlIHN1cHBvcnQgZm9yIDMuMFYgKi8KKwkJcmV0ICY9IH5TREhDSV9DQU5fVkREXzMwMDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0ID0gcmVhZGwoaG9zdC0+aW9hZGRyICsgcmVnKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdCBzZGhjaV9vcHMgc2RoY2lfZG92ZV9vcHMgPSB7CisJLnJlYWRfdwk9IHNkaGNpX2RvdmVfcmVhZHcsCisJLnJlYWRfbAk9IHNkaGNpX2RvdmVfcmVhZGwsCit9OworCitzdHJ1Y3Qgc2RoY2lfcGx0Zm1fZGF0YSBzZGhjaV9kb3ZlX3BkYXRhID0geworCS5vcHMJPSAmc2RoY2lfZG92ZV9vcHMsCisJLnF1aXJrcwk9IFNESENJX1FVSVJLX05PX1NJTVVMVF9WRERfQU5EX1BPV0VSIHwKKwkJICBTREhDSV9RVUlSS19OT19CVVNZX0lSUSB8CisJCSAgU0RIQ0lfUVVJUktfQlJPS0VOX1RJTUVPVVRfVkFMIHwKKwkJICBTREhDSV9RVUlSS19GT1JDRV9ETUEsCit9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1vZi1jb3JlLmMgYi9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLW9mLWNvcmUuYwppbmRleCBjNTFiNzExLi5mYTE5ZDg0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLW9mLWNvcmUuYworKysgYi9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLW9mLWNvcmUuYwpAQCAtMTIyLDcgKzEyMiw3IEBACiAJc3RydWN0IHNkaGNpX29mX2RhdGEgKnNkaGNpX29mX2RhdGEgPSBtYXRjaC0+ZGF0YTsKIAlzdHJ1Y3Qgc2RoY2lfaG9zdCAqaG9zdDsKIAlzdHJ1Y3Qgc2RoY2lfb2ZfaG9zdCAqb2ZfaG9zdDsKLQljb25zdCB1MzIgKmNsazsKKwljb25zdCBfX2JlMzIgKmNsazsKIAlpbnQgc2l6ZTsKIAlpbnQgcmV0OwogCkBAIC0xNjYsNyArMTY2LDcgQEAKIAogCWNsayA9IG9mX2dldF9wcm9wZXJ0eShucCwgImNsb2NrLWZyZXF1ZW5jeSIsICZzaXplKTsKIAlpZiAoY2xrICYmIHNpemUgPT0gc2l6ZW9mKCpjbGspICYmICpjbGspCi0JCW9mX2hvc3QtPmNsb2NrID0gKmNsazsKKwkJb2ZfaG9zdC0+Y2xvY2sgPSBiZTMyX3RvX2NwdXAoY2xrKTsKIAogCXJldCA9IHNkaGNpX2FkZF9ob3N0KGhvc3QpOwogCWlmIChyZXQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLXBjaS5jIGIvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1wY2kuYwppbmRleCAzZDljMjQ2Li4wZGM5MDViIDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLXBjaS5jCisrKyBiL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktcGNpLmMKQEAgLTE3Niw2ICsxNzYsNzQgQEAKIAkucXVpcmtzCQk9IFNESENJX1FVSVJLX05PX0VOREFUVFJfSU5fTk9QREVTQywKIH07CiAKKy8qIE8yTWljcm8gZXh0cmEgcmVnaXN0ZXJzICovCisjZGVmaW5lIE8yX1NEX0xPQ0tfV1AJCTB4RDMKKyNkZWZpbmUgTzJfU0RfTVVMVElfVkNDM1YJMHhFRQorI2RlZmluZSBPMl9TRF9DTEtSRVEJCTB4RUMKKyNkZWZpbmUgTzJfU0RfQ0FQUwkJMHhFMAorI2RlZmluZSBPMl9TRF9BRE1BMQkJMHhFMgorI2RlZmluZSBPMl9TRF9BRE1BMgkJMHhFNworI2RlZmluZSBPMl9TRF9JTkZfTU9ECQkweEYxCisKK3N0YXRpYyBpbnQgbzJfcHJvYmUoc3RydWN0IHNkaGNpX3BjaV9jaGlwICpjaGlwKQoreworCWludCByZXQ7CisJdTggc2NyYXRjaDsKKworCXN3aXRjaCAoY2hpcC0+cGRldi0+ZGV2aWNlKSB7CisJY2FzZSBQQ0lfREVWSUNFX0lEX08yXzgyMjA6CisJY2FzZSBQQ0lfREVWSUNFX0lEX08yXzgyMjE6CisJY2FzZSBQQ0lfREVWSUNFX0lEX08yXzgzMjA6CisJY2FzZSBQQ0lfREVWSUNFX0lEX08yXzgzMjE6CisJCS8qIFRoaXMgZXh0cmEgc2V0dXAgaXMgcmVxdWlyZWQgZHVlIHRvIGJyb2tlbiBBRE1BLiAqLworCQlyZXQgPSBwY2lfcmVhZF9jb25maWdfYnl0ZShjaGlwLT5wZGV2LCBPMl9TRF9MT0NLX1dQLCAmc2NyYXRjaCk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCQlzY3JhdGNoICY9IDB4N2Y7CisJCXBjaV93cml0ZV9jb25maWdfYnl0ZShjaGlwLT5wZGV2LCBPMl9TRF9MT0NLX1dQLCBzY3JhdGNoKTsKKworCQkvKiBTZXQgTXVsdGkgMyB0byBWQ0MzViMgKi8KKwkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGNoaXAtPnBkZXYsIE8yX1NEX01VTFRJX1ZDQzNWLCAweDA4KTsKKworCQkvKiBEaXNhYmxlIENMS19SRVEjIHN1cHBvcnQgYWZ0ZXIgbWVkaWEgREVUICovCisJCXJldCA9IHBjaV9yZWFkX2NvbmZpZ19ieXRlKGNoaXAtPnBkZXYsIE8yX1NEX0NMS1JFUSwgJnNjcmF0Y2gpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwkJc2NyYXRjaCB8PSAweDIwOworCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoY2hpcC0+cGRldiwgTzJfU0RfQ0xLUkVRLCBzY3JhdGNoKTsKKworCQkvKiBDaG9vc2UgY2FwYWJpbGl0aWVzLCBlbmFibGUgU0RNQS4gIFdlIGhhdmUgdG8gd3JpdGUgMHgwMQorCQkgKiB0byB0aGUgY2FwYWJpbGl0aWVzIHJlZ2lzdGVyIGZpcnN0IHRvIHVubG9jayBpdC4KKwkJICovCisJCXJldCA9IHBjaV9yZWFkX2NvbmZpZ19ieXRlKGNoaXAtPnBkZXYsIE8yX1NEX0NBUFMsICZzY3JhdGNoKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJCXNjcmF0Y2ggfD0gMHgwMTsKKwkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGNoaXAtPnBkZXYsIE8yX1NEX0NBUFMsIHNjcmF0Y2gpOworCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoY2hpcC0+cGRldiwgTzJfU0RfQ0FQUywgMHg3Myk7CisKKwkJLyogRGlzYWJsZSBBRE1BMS8yICovCisJCXBjaV93cml0ZV9jb25maWdfYnl0ZShjaGlwLT5wZGV2LCBPMl9TRF9BRE1BMSwgMHgzOSk7CisJCXBjaV93cml0ZV9jb25maWdfYnl0ZShjaGlwLT5wZGV2LCBPMl9TRF9BRE1BMiwgMHgwOCk7CisKKwkJLyogRGlzYWJsZSB0aGUgaW5maW5pdGUgdHJhbnNmZXIgbW9kZSAqLworCQlyZXQgPSBwY2lfcmVhZF9jb25maWdfYnl0ZShjaGlwLT5wZGV2LCBPMl9TRF9JTkZfTU9ELCAmc2NyYXRjaCk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCQlzY3JhdGNoIHw9IDB4MDg7CisJCXBjaV93cml0ZV9jb25maWdfYnl0ZShjaGlwLT5wZGV2LCBPMl9TRF9JTkZfTU9ELCBzY3JhdGNoKTsKKworCQkvKiBMb2NrIFdQICovCisJCXJldCA9IHBjaV9yZWFkX2NvbmZpZ19ieXRlKGNoaXAtPnBkZXYsIE8yX1NEX0xPQ0tfV1AsICZzY3JhdGNoKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJCXNjcmF0Y2ggfD0gMHg4MDsKKwkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGNoaXAtPnBkZXYsIE8yX1NEX0xPQ0tfV1AsIHNjcmF0Y2gpOworCX0KKworCXJldHVybiAwOworfQorCiBzdGF0aWMgaW50IGptaWNyb25fcG1vcyhzdHJ1Y3Qgc2RoY2lfcGNpX2NoaXAgKmNoaXAsIGludCBvbikKIHsKIAl1OCBzY3JhdGNoOwpAQCAtMjA0LDYgKzI3Miw3IEBACiBzdGF0aWMgaW50IGptaWNyb25fcHJvYmUoc3RydWN0IHNkaGNpX3BjaV9jaGlwICpjaGlwKQogewogCWludCByZXQ7CisJdTE2IG1tY2RldiA9IDA7CiAKIAlpZiAoY2hpcC0+cGRldi0+cmV2aXNpb24gPT0gMCkgewogCQljaGlwLT5xdWlya3MgfD0gU0RIQ0lfUVVJUktfMzJCSVRfRE1BX0FERFIgfApAQCAtMjI1LDEyICsyOTQsMTcgQEAKIAkgKiAyLiBUaGUgTU1DIGludGVyZmFjZSBoYXMgYSBsb3dlciBzdWJmdW5jdGlvbiBudW1iZXIKIAkgKiAgICB0aGFuIHRoZSBTRCBpbnRlcmZhY2UuCiAJICovCi0JaWYgKGNoaXAtPnBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0pNSUNST05fSk1CMzhYX1NEKSB7CisJaWYgKGNoaXAtPnBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0pNSUNST05fSk1CMzhYX1NEKQorCQltbWNkZXYgPSBQQ0lfREVWSUNFX0lEX0pNSUNST05fSk1CMzhYX01NQzsKKwllbHNlIGlmIChjaGlwLT5wZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9KTUlDUk9OX0pNQjM4OF9TRCkKKwkJbW1jZGV2ID0gUENJX0RFVklDRV9JRF9KTUlDUk9OX0pNQjM4OF9FU0Q7CisKKwlpZiAobW1jZGV2KSB7CiAJCXN0cnVjdCBwY2lfZGV2ICpzZF9kZXY7CiAKIAkJc2RfZGV2ID0gTlVMTDsKIAkJd2hpbGUgKChzZF9kZXYgPSBwY2lfZ2V0X2RldmljZShQQ0lfVkVORE9SX0lEX0pNSUNST04sCi0JCQlQQ0lfREVWSUNFX0lEX0pNSUNST05fSk1CMzhYX01NQywgc2RfZGV2KSkgIT0gTlVMTCkgeworCQkJCQkJbW1jZGV2LCBzZF9kZXYpKSAhPSBOVUxMKSB7CiAJCQlpZiAoKFBDSV9TTE9UKGNoaXAtPnBkZXYtPmRldmZuKSA9PQogCQkJCVBDSV9TTE9UKHNkX2Rldi0+ZGV2Zm4pKSAmJgogCQkJCShjaGlwLT5wZGV2LT5idXMgPT0gc2RfZGV2LT5idXMpKQpAQCAtMjkwLDEzICszNjQsMjUgQEAKIAkJCXNsb3QtPmhvc3QtPnF1aXJrcyB8PSBTREhDSV9RVUlSS19CUk9LRU5fQURNQTsKIAl9CiAKKwkvKiBKTTM4OCBNTUMgZG9lc24ndCBzdXBwb3J0IDEuOFYgd2hpbGUgU0Qgc3VwcG9ydHMgaXQgKi8KKwlpZiAoc2xvdC0+Y2hpcC0+cGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfSk1JQ1JPTl9KTUIzODhfRVNEKSB7CisJCXNsb3QtPmhvc3QtPm9jcl9hdmFpbF9zZCA9IE1NQ19WRERfMzJfMzMgfCBNTUNfVkREXzMzXzM0IHwKKwkJCU1NQ19WRERfMjlfMzAgfCBNTUNfVkREXzMwXzMxIHwKKwkJCU1NQ19WRERfMTY1XzE5NTsgLyogYWxsb3cgMS44ViAqLworCQlzbG90LT5ob3N0LT5vY3JfYXZhaWxfbW1jID0gTU1DX1ZERF8zMl8zMyB8IE1NQ19WRERfMzNfMzQgfAorCQkJTU1DX1ZERF8yOV8zMCB8IE1NQ19WRERfMzBfMzE7IC8qIG5vIDEuOFYgZm9yIE1NQyAqLworCX0KKwogCS8qCiAJICogVGhlIHNlY29uZGFyeSBpbnRlcmZhY2UgcmVxdWlyZXMgYSBiaXQgc2V0IHRvIGdldCB0aGUKIAkgKiBpbnRlcnJ1cHRzLgogCSAqLwotCWlmIChzbG90LT5jaGlwLT5wZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9KTUlDUk9OX0pNQjM4WF9NTUMpCisJaWYgKHNsb3QtPmNoaXAtPnBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0pNSUNST05fSk1CMzhYX01NQyB8fAorCSAgICBzbG90LT5jaGlwLT5wZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9KTUlDUk9OX0pNQjM4OF9FU0QpCiAJCWptaWNyb25fZW5hYmxlX21tYyhzbG90LT5ob3N0LCAxKTsKIAorCXNsb3QtPmhvc3QtPm1tYy0+Y2FwcyB8PSBNTUNfQ0FQX0JVU19XSURUSF9URVNUOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTMwNSw3ICszOTEsOCBAQAogCWlmIChkZWFkKQogCQlyZXR1cm47CiAKLQlpZiAoc2xvdC0+Y2hpcC0+cGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfSk1JQ1JPTl9KTUIzOFhfTU1DKQorCWlmIChzbG90LT5jaGlwLT5wZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9KTUlDUk9OX0pNQjM4WF9NTUMgfHwKKwkgICAgc2xvdC0+Y2hpcC0+cGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfSk1JQ1JPTl9KTUIzODhfRVNEKQogCQlqbWljcm9uX2VuYWJsZV9tbWMoc2xvdC0+aG9zdCwgMCk7CiB9CiAKQEAgLTMxMyw3ICs0MDAsOCBAQAogewogCWludCBpOwogCi0JaWYgKGNoaXAtPnBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0pNSUNST05fSk1CMzhYX01NQykgeworCWlmIChjaGlwLT5wZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9KTUlDUk9OX0pNQjM4WF9NTUMgfHwKKwkgICAgY2hpcC0+cGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfSk1JQ1JPTl9KTUIzODhfRVNEKSB7CiAJCWZvciAoaSA9IDA7aSA8IGNoaXAtPm51bV9zbG90cztpKyspCiAJCQlqbWljcm9uX2VuYWJsZV9tbWMoY2hpcC0+c2xvdHNbaV0tPmhvc3QsIDApOwogCX0KQEAgLTMyNSw3ICs0MTMsOCBAQAogewogCWludCByZXQsIGk7CiAKLQlpZiAoY2hpcC0+cGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfSk1JQ1JPTl9KTUIzOFhfTU1DKSB7CisJaWYgKGNoaXAtPnBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0pNSUNST05fSk1CMzhYX01NQyB8fAorCSAgICBjaGlwLT5wZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9KTUlDUk9OX0pNQjM4OF9FU0QpIHsKIAkJZm9yIChpID0gMDtpIDwgY2hpcC0+bnVtX3Nsb3RzO2krKykKIAkJCWptaWNyb25fZW5hYmxlX21tYyhjaGlwLT5zbG90c1tpXS0+aG9zdCwgMSk7CiAJfQpAQCAtMzM5LDYgKzQyOCwxMCBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgY29uc3Qgc3RydWN0IHNkaGNpX3BjaV9maXhlcyBzZGhjaV9vMiA9IHsKKwkucHJvYmUJCT0gbzJfcHJvYmUsCit9OworCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNkaGNpX3BjaV9maXhlcyBzZGhjaV9qbWljcm9uID0gewogCS5wcm9iZQkJPSBqbWljcm9uX3Byb2JlLAogCkBAIC01MTAsNiArNjAzLDIyIEBACiAJfSwKIAogCXsKKwkJLnZlbmRvcgkJPSBQQ0lfVkVORE9SX0lEX0pNSUNST04sCisJCS5kZXZpY2UJCT0gUENJX0RFVklDRV9JRF9KTUlDUk9OX0pNQjM4OF9TRCwKKwkJLnN1YnZlbmRvcgk9IFBDSV9BTllfSUQsCisJCS5zdWJkZXZpY2UJPSBQQ0lfQU5ZX0lELAorCQkuZHJpdmVyX2RhdGEJPSAoa2VybmVsX3Vsb25nX3QpJnNkaGNpX2ptaWNyb24sCisJfSwKKworCXsKKwkJLnZlbmRvcgkJPSBQQ0lfVkVORE9SX0lEX0pNSUNST04sCisJCS5kZXZpY2UJCT0gUENJX0RFVklDRV9JRF9KTUlDUk9OX0pNQjM4OF9FU0QsCisJCS5zdWJ2ZW5kb3IJPSBQQ0lfQU5ZX0lELAorCQkuc3ViZGV2aWNlCT0gUENJX0FOWV9JRCwKKwkJLmRyaXZlcl9kYXRhCT0gKGtlcm5lbF91bG9uZ190KSZzZGhjaV9qbWljcm9uLAorCX0sCisKKwl7CiAJCS52ZW5kb3IJCT0gUENJX1ZFTkRPUl9JRF9TWVNLT05ORUNULAogCQkuZGV2aWNlCQk9IDB4ODAwMCwKIAkJLnN1YnZlbmRvcgk9IFBDSV9BTllfSUQsCkBAIC01ODksNiArNjk4LDQ2IEBACiAJCS5kcml2ZXJfZGF0YQk9IChrZXJuZWxfdWxvbmdfdCkmc2RoY2lfaW50ZWxfbWZkX2VtbWNfc2RpbywKIAl9LAogCisJeworCQkudmVuZG9yCQk9IFBDSV9WRU5ET1JfSURfTzIsCisJCS5kZXZpY2UJCT0gUENJX0RFVklDRV9JRF9PMl84MTIwLAorCQkuc3VidmVuZG9yCT0gUENJX0FOWV9JRCwKKwkJLnN1YmRldmljZQk9IFBDSV9BTllfSUQsCisJCS5kcml2ZXJfZGF0YQk9IChrZXJuZWxfdWxvbmdfdCkmc2RoY2lfbzIsCisJfSwKKworCXsKKwkJLnZlbmRvcgkJPSBQQ0lfVkVORE9SX0lEX08yLAorCQkuZGV2aWNlCQk9IFBDSV9ERVZJQ0VfSURfTzJfODIyMCwKKwkJLnN1YnZlbmRvcgk9IFBDSV9BTllfSUQsCisJCS5zdWJkZXZpY2UJPSBQQ0lfQU5ZX0lELAorCQkuZHJpdmVyX2RhdGEJPSAoa2VybmVsX3Vsb25nX3QpJnNkaGNpX28yLAorCX0sCisKKwl7CisJCS52ZW5kb3IJCT0gUENJX1ZFTkRPUl9JRF9PMiwKKwkJLmRldmljZQkJPSBQQ0lfREVWSUNFX0lEX08yXzgyMjEsCisJCS5zdWJ2ZW5kb3IJPSBQQ0lfQU5ZX0lELAorCQkuc3ViZGV2aWNlCT0gUENJX0FOWV9JRCwKKwkJLmRyaXZlcl9kYXRhCT0gKGtlcm5lbF91bG9uZ190KSZzZGhjaV9vMiwKKwl9LAorCisJeworCQkudmVuZG9yCQk9IFBDSV9WRU5ET1JfSURfTzIsCisJCS5kZXZpY2UJCT0gUENJX0RFVklDRV9JRF9PMl84MzIwLAorCQkuc3VidmVuZG9yCT0gUENJX0FOWV9JRCwKKwkJLnN1YmRldmljZQk9IFBDSV9BTllfSUQsCisJCS5kcml2ZXJfZGF0YQk9IChrZXJuZWxfdWxvbmdfdCkmc2RoY2lfbzIsCisJfSwKKworCXsKKwkJLnZlbmRvcgkJPSBQQ0lfVkVORE9SX0lEX08yLAorCQkuZGV2aWNlCQk9IFBDSV9ERVZJQ0VfSURfTzJfODMyMSwKKwkJLnN1YnZlbmRvcgk9IFBDSV9BTllfSUQsCisJCS5zdWJkZXZpY2UJPSBQQ0lfQU5ZX0lELAorCQkuZHJpdmVyX2RhdGEJPSAoa2VybmVsX3Vsb25nX3QpJnNkaGNpX28yLAorCX0sCisKIAl7CS8qIEdlbmVyaWMgU0QgaG9zdCBjb250cm9sbGVyICovCiAJCVBDSV9ERVZJQ0VfQ0xBU1MoKFBDSV9DTEFTU19TWVNURU1fU0RIQ0kgPDwgOCksIDB4RkZGRjAwKQogCX0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLXBsdGZtLmMgYi9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLXBsdGZtLmMKaW5kZXggMDUwMmY4OS4uZGJhYjA0MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1wbHRmbS5jCisrKyBiL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktcGx0Zm0uYwpAQCAtMTcwLDYgKzE3MCwxMiBAQAogI2lmZGVmIENPTkZJR19NTUNfU0RIQ0lfRVNESENfSU1YCiAJeyAic2RoY2ktZXNkaGMtaW14IiwgKGtlcm5lbF91bG9uZ190KSZzZGhjaV9lc2RoY19pbXhfcGRhdGEgfSwKICNlbmRpZgorI2lmZGVmIENPTkZJR19NTUNfU0RIQ0lfRE9WRQorCXsgInNkaGNpLWRvdmUiLCAoa2VybmVsX3Vsb25nX3QpJnNkaGNpX2RvdmVfcGRhdGEgfSwKKyNlbmRpZgorI2lmZGVmIENPTkZJR19NTUNfU0RIQ0lfVEVHUkEKKwl7ICJzZGhjaS10ZWdyYSIsIChrZXJuZWxfdWxvbmdfdCkmc2RoY2lfdGVncmFfcGRhdGEgfSwKKyNlbmRpZgogCXsgfSwKIH07CiBNT0RVTEVfREVWSUNFX1RBQkxFKHBsYXRmb3JtLCBzZGhjaV9wbHRmbV9pZHMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1wbHRmbS5oIGIvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1wbHRmbS5oCmluZGV4IGMxYmZlNDguLmVhMmU0NGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktcGx0Zm0uaAorKysgYi9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLXBsdGZtLmgKQEAgLTIyLDUgKzIyLDcgQEAKIAogZXh0ZXJuIHN0cnVjdCBzZGhjaV9wbHRmbV9kYXRhIHNkaGNpX2NuczN4eHhfcGRhdGE7CiBleHRlcm4gc3RydWN0IHNkaGNpX3BsdGZtX2RhdGEgc2RoY2lfZXNkaGNfaW14X3BkYXRhOworZXh0ZXJuIHN0cnVjdCBzZGhjaV9wbHRmbV9kYXRhIHNkaGNpX2RvdmVfcGRhdGE7CitleHRlcm4gc3RydWN0IHNkaGNpX3BsdGZtX2RhdGEgc2RoY2lfdGVncmFfcGRhdGE7CiAKICNlbmRpZiAvKiBfRFJJVkVSU19NTUNfU0RIQ0lfUExURk1fSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1zM2MuYyBiL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktczNjLmMKaW5kZXggYWFjYjg2Mi4uMTcyMDM1OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1zM2MuYworKysgYi9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLXMzYy5jCkBAIC0xMzAsNiArMTMwLDE1IEBACiAJaWYgKCFjbGtzcmMpCiAJCXJldHVybiBVSU5UX01BWDsKIAorCS8qCisJICogQ2xvY2sgZGl2aWRlcidzIHN0ZXAgaXMgZGlmZmVyZW50IGFzIDEgZnJvbSB0aGF0IG9mIGhvc3QgY29udHJvbGxlcgorCSAqIHdoZW4gJ2Nsa190eXBlJyBpcyBTM0NfU0RIQ0lfQ0xLX0RJVl9FWFRFUk5BTC4KKwkgKi8KKwlpZiAob3VyaG9zdC0+cGRhdGEtPmNsa190eXBlKSB7CisJCXJhdGUgPSBjbGtfcm91bmRfcmF0ZShjbGtzcmMsIHdhbnRlZCk7CisJCXJldHVybiB3YW50ZWQgLSByYXRlOworCX0KKwogCXJhdGUgPSBjbGtfZ2V0X3JhdGUoY2xrc3JjKTsKIAogCWZvciAoZGl2ID0gMTsgZGl2IDwgMjU2OyBkaXYgKj0gMikgewpAQCAtMjMyLDYgKzI0MSw0MiBAQAogCXJldHVybiBtaW47CiB9CiAKKy8qIHNkaGNpX2NtdV9nZXRfbWF4X2NsayAtIGNhbGxiYWNrIHRvIGdldCBtYXhpbXVtIGNsb2NrIGZyZXF1ZW5jeS4qLworc3RhdGljIHVuc2lnbmVkIGludCBzZGhjaV9jbXVfZ2V0X21heF9jbG9jayhzdHJ1Y3Qgc2RoY2lfaG9zdCAqaG9zdCkKK3sKKwlzdHJ1Y3Qgc2RoY2lfczNjICpvdXJob3N0ID0gdG9fczNjKGhvc3QpOworCisJcmV0dXJuIGNsa19yb3VuZF9yYXRlKG91cmhvc3QtPmNsa19idXNbb3VyaG9zdC0+Y3VyX2Nsa10sIFVJTlRfTUFYKTsKK30KKworLyogc2RoY2lfY211X2dldF9taW5fY2xvY2sgLSBjYWxsYmFjayB0byBnZXQgbWluaW1hbCBzdXBwb3J0ZWQgY2xvY2sgdmFsdWUuICovCitzdGF0aWMgdW5zaWduZWQgaW50IHNkaGNpX2NtdV9nZXRfbWluX2Nsb2NrKHN0cnVjdCBzZGhjaV9ob3N0ICpob3N0KQoreworCXN0cnVjdCBzZGhjaV9zM2MgKm91cmhvc3QgPSB0b19zM2MoaG9zdCk7CisKKwkvKgorCSAqIGluaXRpYWwgY2xvY2sgY2FuIGJlIGluIHRoZSBmcmVxdWVuY3kgcmFuZ2Ugb2YKKwkgKiAxMDBLSHotNDAwS0h6LCBzbyB3ZSBzZXQgaXQgYXMgbWF4IHZhbHVlLgorCSAqLworCXJldHVybiBjbGtfcm91bmRfcmF0ZShvdXJob3N0LT5jbGtfYnVzW291cmhvc3QtPmN1cl9jbGtdLCA0MDAwMDApOworfQorCisvKiBzZGhjaV9jbXVfc2V0X2Nsb2NrIC0gY2FsbGJhY2sgb24gY2xvY2sgY2hhbmdlLiovCitzdGF0aWMgdm9pZCBzZGhjaV9jbXVfc2V0X2Nsb2NrKHN0cnVjdCBzZGhjaV9ob3N0ICpob3N0LCB1bnNpZ25lZCBpbnQgY2xvY2spCit7CisJc3RydWN0IHNkaGNpX3MzYyAqb3VyaG9zdCA9IHRvX3MzYyhob3N0KTsKKworCS8qIGRvbid0IGJvdGhlciBpZiB0aGUgY2xvY2sgaXMgZ29pbmcgb2ZmICovCisJaWYgKGNsb2NrID09IDApCisJCXJldHVybjsKKworCXNkaGNpX3MzY19zZXRfY2xvY2soaG9zdCwgY2xvY2spOworCisJY2xrX3NldF9yYXRlKG91cmhvc3QtPmNsa19idXNbb3VyaG9zdC0+Y3VyX2Nsa10sIGNsb2NrKTsKKworCWhvc3QtPmNsb2NrID0gY2xvY2s7Cit9CisKIHN0YXRpYyBzdHJ1Y3Qgc2RoY2lfb3BzIHNkaGNpX3MzY19vcHMgPSB7CiAJLmdldF9tYXhfY2xvY2sJCT0gc2RoY2lfczNjX2dldF9tYXhfY2xrLAogCS5zZXRfY2xvY2sJCT0gc2RoY2lfczNjX3NldF9jbG9jaywKQEAgLTM2MSw2ICs0MDYsMTMgQEAKIAogCQljbGtzKys7CiAJCXNjLT5jbGtfYnVzW3B0cl0gPSBjbGs7CisKKwkJLyoKKwkJICogc2F2ZSBjdXJyZW50IGNsb2NrIGluZGV4IHRvIGtub3cgd2hpY2ggY2xvY2sgYnVzCisJCSAqIGlzIHVzZWQgbGF0ZXIgaW4gb3ZlcnJpZGluZyBmdW5jdGlvbnMuCisJCSAqLworCQlzYy0+Y3VyX2NsayA9IHB0cjsKKwogCQljbGtfZW5hYmxlKGNsayk7CiAKIAkJZGV2X2luZm8oZGV2LCAiY2xvY2sgc291cmNlICVkOiAlcyAoJWxkIEh6KVxuIiwKQEAgLTQyNyw2ICs0NzksMjAgQEAKIAkvKiBIU01NQyBvbiBTYW1zdW5nIFNvQ3MgdXNlcyBTRENMSyBhcyB0aW1lb3V0IGNsb2NrICovCiAJaG9zdC0+cXVpcmtzIHw9IFNESENJX1FVSVJLX0RBVEFfVElNRU9VVF9VU0VTX1NEQ0xLOwogCisJLyoKKwkgKiBJZiBjb250cm9sbGVyIGRvZXMgbm90IGhhdmUgaW50ZXJuYWwgY2xvY2sgZGl2aWRlciwKKwkgKiB3ZSBjYW4gdXNlIG92ZXJyaWRpbmcgZnVuY3Rpb25zIGluc3RlYWQgb2YgZGVmYXVsdC4KKwkgKi8KKwlpZiAocGRhdGEtPmNsa190eXBlKSB7CisJCXNkaGNpX3MzY19vcHMuc2V0X2Nsb2NrID0gc2RoY2lfY211X3NldF9jbG9jazsKKwkJc2RoY2lfczNjX29wcy5nZXRfbWluX2Nsb2NrID0gc2RoY2lfY211X2dldF9taW5fY2xvY2s7CisJCXNkaGNpX3MzY19vcHMuZ2V0X21heF9jbG9jayA9IHNkaGNpX2NtdV9nZXRfbWF4X2Nsb2NrOworCX0KKworCS8qIEl0IHN1cHBvcnRzIGFkZGl0aW9uYWwgaG9zdCBjYXBhYmlsaXRpZXMgaWYgbmVlZGVkICovCisJaWYgKHBkYXRhLT5ob3N0X2NhcHMpCisJCWhvc3QtPm1tYy0+Y2FwcyB8PSBwZGF0YS0+aG9zdF9jYXBzOworCiAJcmV0ID0gc2RoY2lfYWRkX2hvc3QoaG9zdCk7CiAJaWYgKHJldCkgewogCQlkZXZfZXJyKGRldiwgInNkaGNpX2FkZF9ob3N0KCkgZmFpbGVkXG4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktdGVncmEuYyBiL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktdGVncmEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODIzZWU5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS10ZWdyYS5jCkBAIC0wLDAgKzEsMjU3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSwgSW5jLgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisgKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvbW1jL2NhcmQuaD4KKyNpbmNsdWRlIDxsaW51eC9tbWMvaG9zdC5oPgorCisjaW5jbHVkZSA8bWFjaC9ncGlvLmg+CisjaW5jbHVkZSA8bWFjaC9zZGhjaS5oPgorCisjaW5jbHVkZSAic2RoY2kuaCIKKyNpbmNsdWRlICJzZGhjaS1wbHRmbS5oIgorCitzdGF0aWMgdTMyIHRlZ3JhX3NkaGNpX3JlYWRsKHN0cnVjdCBzZGhjaV9ob3N0ICpob3N0LCBpbnQgcmVnKQoreworCXUzMiB2YWw7CisKKwlpZiAodW5saWtlbHkocmVnID09IFNESENJX1BSRVNFTlRfU1RBVEUpKSB7CisJCS8qIFVzZSB3cF9ncGlvIGhlcmUgaW5zdGVhZD8gKi8KKwkJdmFsID0gcmVhZGwoaG9zdC0+aW9hZGRyICsgcmVnKTsKKwkJcmV0dXJuIHZhbCB8IFNESENJX1dSSVRFX1BST1RFQ1Q7CisJfQorCisJcmV0dXJuIHJlYWRsKGhvc3QtPmlvYWRkciArIHJlZyk7Cit9CisKK3N0YXRpYyB1MTYgdGVncmFfc2RoY2lfcmVhZHcoc3RydWN0IHNkaGNpX2hvc3QgKmhvc3QsIGludCByZWcpCit7CisJaWYgKHVubGlrZWx5KHJlZyA9PSBTREhDSV9IT1NUX1ZFUlNJT04pKSB7CisJCS8qIEVycmF0dW06IFZlcnNpb24gcmVnaXN0ZXIgaXMgaW52YWxpZCBpbiBIVy4gKi8KKwkJcmV0dXJuIFNESENJX1NQRUNfMjAwOworCX0KKworCXJldHVybiByZWFkdyhob3N0LT5pb2FkZHIgKyByZWcpOworfQorCitzdGF0aWMgdm9pZCB0ZWdyYV9zZGhjaV93cml0ZWwoc3RydWN0IHNkaGNpX2hvc3QgKmhvc3QsIHUzMiB2YWwsIGludCByZWcpCit7CisJLyogU2VlbXMgbGlrZSB3ZSdyZSBnZXR0aW5nIHNwdXJpb3VzIHRpbWVvdXQgYW5kIGNyYyBlcnJvcnMsIHNvCisJICogZGlzYWJsZSBzaWduYWxsaW5nIG9mIHRoZW0uIEluIGNhc2Ugb2YgcmVhbCBlcnJvcnMgc29mdHdhcmUKKwkgKiB0aW1lcnMgc2hvdWxkIHRha2UgY2FyZSBvZiBldmVudHVhbGx5IGRldGVjdGluZyB0aGVtLgorCSAqLworCWlmICh1bmxpa2VseShyZWcgPT0gU0RIQ0lfU0lHTkFMX0VOQUJMRSkpCisJCXZhbCAmPSB+KFNESENJX0lOVF9USU1FT1VUfFNESENJX0lOVF9DUkMpOworCisJd3JpdGVsKHZhbCwgaG9zdC0+aW9hZGRyICsgcmVnKTsKKworCWlmICh1bmxpa2VseShyZWcgPT0gU0RIQ0lfSU5UX0VOQUJMRSkpIHsKKwkJLyogRXJyYXR1bTogTXVzdCBlbmFibGUgYmxvY2sgZ2FwIGludGVycnVwdCBkZXRlY3Rpb24gKi8KKwkJdTggZ2FwX2N0cmwgPSByZWFkYihob3N0LT5pb2FkZHIgKyBTREhDSV9CTE9DS19HQVBfQ09OVFJPTCk7CisJCWlmICh2YWwgJiBTREhDSV9JTlRfQ0FSRF9JTlQpCisJCQlnYXBfY3RybCB8PSAweDg7CisJCWVsc2UKKwkJCWdhcF9jdHJsICY9IH4weDg7CisJCXdyaXRlYihnYXBfY3RybCwgaG9zdC0+aW9hZGRyICsgU0RIQ0lfQkxPQ0tfR0FQX0NPTlRST0wpOworCX0KK30KKworc3RhdGljIHVuc2lnbmVkIGludCB0ZWdyYV9zZGhjaV9nZXRfcm8oc3RydWN0IHNkaGNpX2hvc3QgKnNkaGNpKQoreworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UobW1jX2RldihzZGhjaS0+bW1jKSk7CisJc3RydWN0IHRlZ3JhX3NkaGNpX3BsYXRmb3JtX2RhdGEgKnBsYXQ7CisKKwlwbGF0ID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisKKwlpZiAoIWdwaW9faXNfdmFsaWQocGxhdC0+d3BfZ3BpbykpCisJCXJldHVybiAtMTsKKworCXJldHVybiBncGlvX2dldF92YWx1ZShwbGF0LT53cF9ncGlvKTsKK30KKworc3RhdGljIGlycXJldHVybl90IGNhcmRkZXRlY3RfaXJxKGludCBpcnEsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHNkaGNpX2hvc3QgKnNkaG9zdCA9IChzdHJ1Y3Qgc2RoY2lfaG9zdCAqKWRhdGE7CisKKwl0YXNrbGV0X3NjaGVkdWxlKCZzZGhvc3QtPmNhcmRfdGFza2xldCk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfTsKKworc3RhdGljIGludCB0ZWdyYV9zZGhjaV84Yml0KHN0cnVjdCBzZGhjaV9ob3N0ICpob3N0LCBpbnQgYnVzX3dpZHRoKQoreworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UobW1jX2Rldihob3N0LT5tbWMpKTsKKwlzdHJ1Y3QgdGVncmFfc2RoY2lfcGxhdGZvcm1fZGF0YSAqcGxhdDsKKwl1MzIgY3RybDsKKworCXBsYXQgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKworCWN0cmwgPSBzZGhjaV9yZWFkYihob3N0LCBTREhDSV9IT1NUX0NPTlRST0wpOworCWlmIChwbGF0LT5pc184Yml0ICYmIGJ1c193aWR0aCA9PSBNTUNfQlVTX1dJRFRIXzgpIHsKKwkJY3RybCAmPSB+U0RIQ0lfQ1RSTF80QklUQlVTOworCQljdHJsIHw9IFNESENJX0NUUkxfOEJJVEJVUzsKKwl9IGVsc2UgeworCQljdHJsICY9IH5TREhDSV9DVFJMXzhCSVRCVVM7CisJCWlmIChidXNfd2lkdGggPT0gTU1DX0JVU19XSURUSF80KQorCQkJY3RybCB8PSBTREhDSV9DVFJMXzRCSVRCVVM7CisJCWVsc2UKKwkJCWN0cmwgJj0gflNESENJX0NUUkxfNEJJVEJVUzsKKwl9CisJc2RoY2lfd3JpdGViKGhvc3QsIGN0cmwsIFNESENJX0hPU1RfQ09OVFJPTCk7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCB0ZWdyYV9zZGhjaV9wbHRmbV9pbml0KHN0cnVjdCBzZGhjaV9ob3N0ICpob3N0LAorCQkJCSAgc3RydWN0IHNkaGNpX3BsdGZtX2RhdGEgKnBkYXRhKQoreworCXN0cnVjdCBzZGhjaV9wbHRmbV9ob3N0ICpwbHRmbV9ob3N0ID0gc2RoY2lfcHJpdihob3N0KTsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKG1tY19kZXYoaG9zdC0+bW1jKSk7CisJc3RydWN0IHRlZ3JhX3NkaGNpX3BsYXRmb3JtX2RhdGEgKnBsYXQ7CisJc3RydWN0IGNsayAqY2xrOworCWludCByYzsKKworCXBsYXQgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlpZiAocGxhdCA9PSBOVUxMKSB7CisJCWRldl9lcnIobW1jX2Rldihob3N0LT5tbWMpLCAibWlzc2luZyBwbGF0Zm9ybSBkYXRhXG4iKTsKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisKKwlpZiAoZ3Bpb19pc192YWxpZChwbGF0LT5wb3dlcl9ncGlvKSkgeworCQlyYyA9IGdwaW9fcmVxdWVzdChwbGF0LT5wb3dlcl9ncGlvLCAic2RoY2lfcG93ZXIiKTsKKwkJaWYgKHJjKSB7CisJCQlkZXZfZXJyKG1tY19kZXYoaG9zdC0+bW1jKSwKKwkJCQkiZmFpbGVkIHRvIGFsbG9jYXRlIHBvd2VyIGdwaW9cbiIpOworCQkJZ290byBvdXQ7CisJCX0KKwkJdGVncmFfZ3Bpb19lbmFibGUocGxhdC0+cG93ZXJfZ3Bpbyk7CisJCWdwaW9fZGlyZWN0aW9uX291dHB1dChwbGF0LT5wb3dlcl9ncGlvLCAxKTsKKwl9CisKKwlpZiAoZ3Bpb19pc192YWxpZChwbGF0LT5jZF9ncGlvKSkgeworCQlyYyA9IGdwaW9fcmVxdWVzdChwbGF0LT5jZF9ncGlvLCAic2RoY2lfY2QiKTsKKwkJaWYgKHJjKSB7CisJCQlkZXZfZXJyKG1tY19kZXYoaG9zdC0+bW1jKSwKKwkJCQkiZmFpbGVkIHRvIGFsbG9jYXRlIGNkIGdwaW9cbiIpOworCQkJZ290byBvdXRfcG93ZXI7CisJCX0KKwkJdGVncmFfZ3Bpb19lbmFibGUocGxhdC0+Y2RfZ3Bpbyk7CisJCWdwaW9fZGlyZWN0aW9uX2lucHV0KHBsYXQtPmNkX2dwaW8pOworCisJCXJjID0gcmVxdWVzdF9pcnEoZ3Bpb190b19pcnEocGxhdC0+Y2RfZ3BpbyksIGNhcmRkZXRlY3RfaXJxLAorCQkJCSBJUlFGX1RSSUdHRVJfRkFMTElORyB8IElSUUZfVFJJR0dFUl9SSVNJTkcsCisJCQkJIG1tY19ob3N0bmFtZShob3N0LT5tbWMpLCBob3N0KTsKKworCQlpZiAocmMpCXsKKwkJCWRldl9lcnIobW1jX2Rldihob3N0LT5tbWMpLCAicmVxdWVzdCBpcnEgZXJyb3JcbiIpOworCQkJZ290byBvdXRfY2Q7CisJCX0KKworCX0KKworCWlmIChncGlvX2lzX3ZhbGlkKHBsYXQtPndwX2dwaW8pKSB7CisJCXJjID0gZ3Bpb19yZXF1ZXN0KHBsYXQtPndwX2dwaW8sICJzZGhjaV93cCIpOworCQlpZiAocmMpIHsKKwkJCWRldl9lcnIobW1jX2Rldihob3N0LT5tbWMpLAorCQkJCSJmYWlsZWQgdG8gYWxsb2NhdGUgd3AgZ3Bpb1xuIik7CisJCQlnb3RvIG91dF9jZDsKKwkJfQorCQl0ZWdyYV9ncGlvX2VuYWJsZShwbGF0LT53cF9ncGlvKTsKKwkJZ3Bpb19kaXJlY3Rpb25faW5wdXQocGxhdC0+d3BfZ3Bpbyk7CisJfQorCisJY2xrID0gY2xrX2dldChtbWNfZGV2KGhvc3QtPm1tYyksIE5VTEwpOworCWlmIChJU19FUlIoY2xrKSkgeworCQlkZXZfZXJyKG1tY19kZXYoaG9zdC0+bW1jKSwgImNsayBlcnJcbiIpOworCQlyYyA9IFBUUl9FUlIoY2xrKTsKKwkJZ290byBvdXRfd3A7CisJfQorCWNsa19lbmFibGUoY2xrKTsKKwlwbHRmbV9ob3N0LT5jbGsgPSBjbGs7CisKKwlpZiAocGxhdC0+aXNfOGJpdCkKKwkJaG9zdC0+bW1jLT5jYXBzIHw9IE1NQ19DQVBfOF9CSVRfREFUQTsKKworCXJldHVybiAwOworCitvdXRfd3A6CisJaWYgKGdwaW9faXNfdmFsaWQocGxhdC0+d3BfZ3BpbykpIHsKKwkJdGVncmFfZ3Bpb19kaXNhYmxlKHBsYXQtPndwX2dwaW8pOworCQlncGlvX2ZyZWUocGxhdC0+d3BfZ3Bpbyk7CisJfQorCitvdXRfY2Q6CisJaWYgKGdwaW9faXNfdmFsaWQocGxhdC0+Y2RfZ3BpbykpIHsKKwkJdGVncmFfZ3Bpb19kaXNhYmxlKHBsYXQtPmNkX2dwaW8pOworCQlncGlvX2ZyZWUocGxhdC0+Y2RfZ3Bpbyk7CisJfQorCitvdXRfcG93ZXI6CisJaWYgKGdwaW9faXNfdmFsaWQocGxhdC0+cG93ZXJfZ3BpbykpIHsKKwkJdGVncmFfZ3Bpb19kaXNhYmxlKHBsYXQtPnBvd2VyX2dwaW8pOworCQlncGlvX2ZyZWUocGxhdC0+cG93ZXJfZ3Bpbyk7CisJfQorCitvdXQ6CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgdm9pZCB0ZWdyYV9zZGhjaV9wbHRmbV9leGl0KHN0cnVjdCBzZGhjaV9ob3N0ICpob3N0KQoreworCXN0cnVjdCBzZGhjaV9wbHRmbV9ob3N0ICpwbHRmbV9ob3N0ID0gc2RoY2lfcHJpdihob3N0KTsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKG1tY19kZXYoaG9zdC0+bW1jKSk7CisJc3RydWN0IHRlZ3JhX3NkaGNpX3BsYXRmb3JtX2RhdGEgKnBsYXQ7CisKKwlwbGF0ID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisKKwlpZiAoZ3Bpb19pc192YWxpZChwbGF0LT53cF9ncGlvKSkgeworCQl0ZWdyYV9ncGlvX2Rpc2FibGUocGxhdC0+d3BfZ3Bpbyk7CisJCWdwaW9fZnJlZShwbGF0LT53cF9ncGlvKTsKKwl9CisKKwlpZiAoZ3Bpb19pc192YWxpZChwbGF0LT5jZF9ncGlvKSkgeworCQl0ZWdyYV9ncGlvX2Rpc2FibGUocGxhdC0+Y2RfZ3Bpbyk7CisJCWdwaW9fZnJlZShwbGF0LT5jZF9ncGlvKTsKKwl9CisKKwlpZiAoZ3Bpb19pc192YWxpZChwbGF0LT5wb3dlcl9ncGlvKSkgeworCQl0ZWdyYV9ncGlvX2Rpc2FibGUocGxhdC0+cG93ZXJfZ3Bpbyk7CisJCWdwaW9fZnJlZShwbGF0LT5wb3dlcl9ncGlvKTsKKwl9CisKKwljbGtfZGlzYWJsZShwbHRmbV9ob3N0LT5jbGspOworCWNsa19wdXQocGx0Zm1faG9zdC0+Y2xrKTsKK30KKworc3RhdGljIHN0cnVjdCBzZGhjaV9vcHMgdGVncmFfc2RoY2lfb3BzID0geworCS5nZXRfcm8gICAgID0gdGVncmFfc2RoY2lfZ2V0X3JvLAorCS5yZWFkX2wgICAgID0gdGVncmFfc2RoY2lfcmVhZGwsCisJLnJlYWRfdyAgICAgPSB0ZWdyYV9zZGhjaV9yZWFkdywKKwkud3JpdGVfbCAgICA9IHRlZ3JhX3NkaGNpX3dyaXRlbCwKKwkucGxhdGZvcm1fOGJpdF93aWR0aCA9IHRlZ3JhX3NkaGNpXzhiaXQsCit9OworCitzdHJ1Y3Qgc2RoY2lfcGx0Zm1fZGF0YSBzZGhjaV90ZWdyYV9wZGF0YSA9IHsKKwkucXVpcmtzID0gU0RIQ0lfUVVJUktfQlJPS0VOX1RJTUVPVVRfVkFMIHwKKwkJICBTREhDSV9RVUlSS19TSU5HTEVfUE9XRVJfV1JJVEUgfAorCQkgIFNESENJX1FVSVJLX05PX0hJU1BEX0JJVCB8CisJCSAgU0RIQ0lfUVVJUktfQlJPS0VOX0FETUFfWkVST0xFTl9ERVNDLAorCS5vcHMgID0gJnRlZ3JhX3NkaGNpX29wcywKKwkuaW5pdCA9IHRlZ3JhX3NkaGNpX3BsdGZtX2luaXQsCisJLmV4aXQgPSB0ZWdyYV9zZGhjaV9wbHRmbV9leGl0LAorfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2kuYyBiL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2kuYwppbmRleCBhMjVkYjQyLi45ZTE1ZjQxIDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLmMKKysrIGIvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS5jCkBAIC0yMyw2ICsyMyw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9sZWRzLmg+CiAKKyNpbmNsdWRlIDxsaW51eC9tbWMvbW1jLmg+CiAjaW5jbHVkZSA8bGludXgvbW1jL2hvc3QuaD4KIAogI2luY2x1ZGUgInNkaGNpLmgiCkBAIC03Nyw4ICs3OCwxMSBAQAogCXByaW50ayhLRVJOX0RFQlVHIERSSVZFUl9OQU1FICI6IEFDMTIgZXJyOiAweCUwOHggfCBTbG90IGludDogMHglMDh4XG4iLAogCQlzZGhjaV9yZWFkdyhob3N0LCBTREhDSV9BQ01EMTJfRVJSKSwKIAkJc2RoY2lfcmVhZHcoaG9zdCwgU0RIQ0lfU0xPVF9JTlRfU1RBVFVTKSk7Ci0JcHJpbnRrKEtFUk5fREVCVUcgRFJJVkVSX05BTUUgIjogQ2FwczogICAgIDB4JTA4eCB8IE1heCBjdXJyOiAweCUwOHhcbiIsCisJcHJpbnRrKEtFUk5fREVCVUcgRFJJVkVSX05BTUUgIjogQ2FwczogICAgIDB4JTA4eCB8IENhcHNfMTogICAweCUwOHhcbiIsCiAJCXNkaGNpX3JlYWRsKGhvc3QsIFNESENJX0NBUEFCSUxJVElFUyksCisJCXNkaGNpX3JlYWRsKGhvc3QsIFNESENJX0NBUEFCSUxJVElFU18xKSk7CisJcHJpbnRrKEtFUk5fREVCVUcgRFJJVkVSX05BTUUgIjogQ21kOiAgICAgIDB4JTA4eCB8IE1heCBjdXJyOiAweCUwOHhcbiIsCisJCXNkaGNpX3JlYWR3KGhvc3QsIFNESENJX0NPTU1BTkQpLAogCQlzZGhjaV9yZWFkbChob3N0LCBTREhDSV9NQVhfQ1VSUkVOVCkpOwogCiAJaWYgKGhvc3QtPmZsYWdzICYgU0RIQ0lfVVNFX0FETUEpCkBAIC0xNTE4LDcgKzE1MjIsMTEgQEAKIAogCWlmIChpbnRtYXNrICYgU0RIQ0lfSU5UX0RBVEFfVElNRU9VVCkKIAkJaG9zdC0+ZGF0YS0+ZXJyb3IgPSAtRVRJTUVET1VUOwotCWVsc2UgaWYgKGludG1hc2sgJiAoU0RIQ0lfSU5UX0RBVEFfQ1JDIHwgU0RIQ0lfSU5UX0RBVEFfRU5EX0JJVCkpCisJZWxzZSBpZiAoaW50bWFzayAmIFNESENJX0lOVF9EQVRBX0VORF9CSVQpCisJCWhvc3QtPmRhdGEtPmVycm9yID0gLUVJTFNFUTsKKwllbHNlIGlmICgoaW50bWFzayAmIFNESENJX0lOVF9EQVRBX0NSQykgJiYKKwkJU0RIQ0lfR0VUX0NNRChzZGhjaV9yZWFkdyhob3N0LCBTREhDSV9DT01NQU5EKSkKKwkJCSE9IE1NQ19CVVNfVEVTVF9SKQogCQlob3N0LT5kYXRhLT5lcnJvciA9IC1FSUxTRVE7CiAJZWxzZSBpZiAoaW50bWFzayAmIFNESENJX0lOVF9BRE1BX0VSUk9SKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiJXM6IEFETUEgZXJyb3JcbiIsIG1tY19ob3N0bmFtZShob3N0LT5tbWMpKTsKQEAgLTE3MzYsNyArMTc0NCw3IEBACiBpbnQgc2RoY2lfYWRkX2hvc3Qoc3RydWN0IHNkaGNpX2hvc3QgKmhvc3QpCiB7CiAJc3RydWN0IG1tY19ob3N0ICptbWM7Ci0JdW5zaWduZWQgaW50IGNhcHM7CisJdW5zaWduZWQgaW50IGNhcHMsIG9jcl9hdmFpbDsKIAlpbnQgcmV0OwogCiAJV0FSTl9PTihob3N0ID09IE5VTEwpOwpAQCAtMTg5MCwxMyArMTg5OCwyNiBAQAogCSAgICBtbWNfY2FyZF9pc19yZW1vdmFibGUobW1jKSkKIAkJbW1jLT5jYXBzIHw9IE1NQ19DQVBfTkVFRFNfUE9MTDsKIAotCW1tYy0+b2NyX2F2YWlsID0gMDsKKwlvY3JfYXZhaWwgPSAwOwogCWlmIChjYXBzICYgU0RIQ0lfQ0FOX1ZERF8zMzApCi0JCW1tYy0+b2NyX2F2YWlsIHw9IE1NQ19WRERfMzJfMzN8TU1DX1ZERF8zM18zNDsKKwkJb2NyX2F2YWlsIHw9IE1NQ19WRERfMzJfMzMgfCBNTUNfVkREXzMzXzM0OwogCWlmIChjYXBzICYgU0RIQ0lfQ0FOX1ZERF8zMDApCi0JCW1tYy0+b2NyX2F2YWlsIHw9IE1NQ19WRERfMjlfMzB8TU1DX1ZERF8zMF8zMTsKKwkJb2NyX2F2YWlsIHw9IE1NQ19WRERfMjlfMzAgfCBNTUNfVkREXzMwXzMxOwogCWlmIChjYXBzICYgU0RIQ0lfQ0FOX1ZERF8xODApCi0JCW1tYy0+b2NyX2F2YWlsIHw9IE1NQ19WRERfMTY1XzE5NTsKKwkJb2NyX2F2YWlsIHw9IE1NQ19WRERfMTY1XzE5NTsKKworCW1tYy0+b2NyX2F2YWlsID0gb2NyX2F2YWlsOworCW1tYy0+b2NyX2F2YWlsX3NkaW8gPSBvY3JfYXZhaWw7CisJaWYgKGhvc3QtPm9jcl9hdmFpbF9zZGlvKQorCQltbWMtPm9jcl9hdmFpbF9zZGlvICY9IGhvc3QtPm9jcl9hdmFpbF9zZGlvOworCW1tYy0+b2NyX2F2YWlsX3NkID0gb2NyX2F2YWlsOworCWlmIChob3N0LT5vY3JfYXZhaWxfc2QpCisJCW1tYy0+b2NyX2F2YWlsX3NkICY9IGhvc3QtPm9jcl9hdmFpbF9zZDsKKwllbHNlIC8qIG5vcm1hbCBTRCBjb250cm9sbGVycyBkb24ndCBzdXBwb3J0IDEuOFYgKi8KKwkJbW1jLT5vY3JfYXZhaWxfc2QgJj0gfk1NQ19WRERfMTY1XzE5NTsKKwltbWMtPm9jcl9hdmFpbF9tbWMgPSBvY3JfYXZhaWw7CisJaWYgKGhvc3QtPm9jcl9hdmFpbF9tbWMpCisJCW1tYy0+b2NyX2F2YWlsX21tYyAmPSBob3N0LT5vY3JfYXZhaWxfbW1jOwogCiAJaWYgKG1tYy0+b2NyX2F2YWlsID09IDApIHsKIAkJcHJpbnRrKEtFUk5fRVJSICIlczogSGFyZHdhcmUgZG9lc24ndCByZXBvcnQgYW55ICIKQEAgLTE5MjgsMTAgKzE5NDksMTQgQEAKIAkgKiBvZiBieXRlcy4gV2hlbiBkb2luZyBoYXJkd2FyZSBzY2F0dGVyL2dhdGhlciwgZWFjaCBlbnRyeSBjYW5ub3QKIAkgKiBiZSBsYXJnZXIgdGhhbiA2NCBLaUIgdGhvdWdoLgogCSAqLwotCWlmIChob3N0LT5mbGFncyAmIFNESENJX1VTRV9BRE1BKQotCQltbWMtPm1heF9zZWdfc2l6ZSA9IDY1NTM2OwotCWVsc2UKKwlpZiAoaG9zdC0+ZmxhZ3MgJiBTREhDSV9VU0VfQURNQSkgeworCQlpZiAoaG9zdC0+cXVpcmtzICYgU0RIQ0lfUVVJUktfQlJPS0VOX0FETUFfWkVST0xFTl9ERVNDKQorCQkJbW1jLT5tYXhfc2VnX3NpemUgPSA2NTUzNTsKKwkJZWxzZQorCQkJbW1jLT5tYXhfc2VnX3NpemUgPSA2NTUzNjsKKwl9IGVsc2UgewogCQltbWMtPm1heF9zZWdfc2l6ZSA9IG1tYy0+bWF4X3JlcV9zaXplOworCX0KIAogCS8qCiAJICogTWF4aW11bSBibG9jayBzaXplLiBUaGlzIHZhcmllcyBmcm9tIGNvbnRyb2xsZXIgdG8gY29udHJvbGxlciBhbmQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2kuaCBiL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2kuaAppbmRleCBlNDJkN2YwLi42ZTA5NjllIDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLmgKKysrIGIvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS5oCkBAIC01Miw2ICs1Miw3IEBACiAjZGVmaW5lICBTREhDSV9DTURfUkVTUF9TSE9SVF9CVVNZIDB4MDMKIAogI2RlZmluZSBTREhDSV9NQUtFX0NNRChjLCBmKSAoKChjICYgMHhmZikgPDwgOCkgfCAoZiAmIDB4ZmYpKQorI2RlZmluZSBTREhDSV9HRVRfQ01EKGMpICgoYz4+OCkgJiAweDNmKQogCiAjZGVmaW5lIFNESENJX1JFU1BPTlNFCQkweDEwCiAKQEAgLTE2NSw3ICsxNjYsNyBAQAogI2RlZmluZSAgU0RIQ0lfQ0FOX1ZERF8xODAJMHgwNDAwMDAwMAogI2RlZmluZSAgU0RIQ0lfQ0FOXzY0QklUCTB4MTAwMDAwMDAKIAotLyogNDQtNDcgcmVzZXJ2ZWQgZm9yIG1vcmUgY2FwcyAqLworI2RlZmluZSBTREhDSV9DQVBBQklMSVRJRVNfMQkweDQ0CiAKICNkZWZpbmUgU0RIQ0lfTUFYX0NVUlJFTlQJMHg0OAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9ob3N0L3RtaW9fbW1jLmMgYi9kcml2ZXJzL21tYy9ob3N0L3RtaW9fbW1jLmMKaW5kZXggZTc3NjVhOC4uZTNjNmVmMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvaG9zdC90bWlvX21tYy5jCisrKyBiL2RyaXZlcnMvbW1jL2hvc3QvdG1pb19tbWMuYwpAQCAtMjUsMTYgKzI1LDI2MSBAQAogICogICBkb3VibGUgYnVmZmVyIHN1cHBvcnQKICAqCiAgKi8KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9pcnEuaD4KLSNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKwogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZG1hZW5naW5lLmg+Ci0jaW5jbHVkZSA8bGludXgvbW1jL2hvc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KICNpbmNsdWRlIDxsaW51eC9tZmQvY29yZS5oPgogI2luY2x1ZGUgPGxpbnV4L21mZC90bWlvLmg+CisjaW5jbHVkZSA8bGludXgvbW1jL2hvc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisjaW5jbHVkZSA8bGludXgvc2NhdHRlcmxpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogCi0jaW5jbHVkZSAidG1pb19tbWMuaCIKKyNkZWZpbmUgQ1RMX1NEX0NNRCAweDAwCisjZGVmaW5lIENUTF9BUkdfUkVHIDB4MDQKKyNkZWZpbmUgQ1RMX1NUT1BfSU5URVJOQUxfQUNUSU9OIDB4MDgKKyNkZWZpbmUgQ1RMX1hGRVJfQkxLX0NPVU5UIDB4YQorI2RlZmluZSBDVExfUkVTUE9OU0UgMHgwYworI2RlZmluZSBDVExfU1RBVFVTIDB4MWMKKyNkZWZpbmUgQ1RMX0lSUV9NQVNLIDB4MjAKKyNkZWZpbmUgQ1RMX1NEX0NBUkRfQ0xLX0NUTCAweDI0CisjZGVmaW5lIENUTF9TRF9YRkVSX0xFTiAweDI2CisjZGVmaW5lIENUTF9TRF9NRU1fQ0FSRF9PUFQgMHgyOAorI2RlZmluZSBDVExfU0RfRVJST1JfREVUQUlMX1NUQVRVUyAweDJjCisjZGVmaW5lIENUTF9TRF9EQVRBX1BPUlQgMHgzMAorI2RlZmluZSBDVExfVFJBTlNBQ1RJT05fQ1RMIDB4MzQKKyNkZWZpbmUgQ1RMX1NESU9fU1RBVFVTIDB4MzYKKyNkZWZpbmUgQ1RMX1NESU9fSVJRX01BU0sgMHgzOAorI2RlZmluZSBDVExfUkVTRVRfU0QgMHhlMAorI2RlZmluZSBDVExfU0RJT19SRUdTIDB4MTAwCisjZGVmaW5lIENUTF9DTEtfQU5EX1dBSVRfQ1RMIDB4MTM4CisjZGVmaW5lIENUTF9SRVNFVF9TRElPIDB4MWUwCisKKy8qIERlZmluaXRpb25zIGZvciB2YWx1ZXMgdGhlIENUUkxfU1RBVFVTIHJlZ2lzdGVyIGNhbiB0YWtlLiAqLworI2RlZmluZSBUTUlPX1NUQVRfQ01EUkVTUEVORCAgICAweDAwMDAwMDAxCisjZGVmaW5lIFRNSU9fU1RBVF9EQVRBRU5EICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgVE1JT19TVEFUX0NBUkRfUkVNT1ZFICAgMHgwMDAwMDAwOAorI2RlZmluZSBUTUlPX1NUQVRfQ0FSRF9JTlNFUlQgICAweDAwMDAwMDEwCisjZGVmaW5lIFRNSU9fU1RBVF9TSUdTVEFURSAgICAgIDB4MDAwMDAwMjAKKyNkZWZpbmUgVE1JT19TVEFUX1dSUFJPVEVDVCAgICAgMHgwMDAwMDA4MAorI2RlZmluZSBUTUlPX1NUQVRfQ0FSRF9SRU1PVkVfQSAweDAwMDAwMTAwCisjZGVmaW5lIFRNSU9fU1RBVF9DQVJEX0lOU0VSVF9BIDB4MDAwMDAyMDAKKyNkZWZpbmUgVE1JT19TVEFUX1NJR1NUQVRFX0EgICAgMHgwMDAwMDQwMAorI2RlZmluZSBUTUlPX1NUQVRfQ01EX0lEWF9FUlIgICAweDAwMDEwMDAwCisjZGVmaW5lIFRNSU9fU1RBVF9DUkNGQUlMICAgICAgIDB4MDAwMjAwMDAKKyNkZWZpbmUgVE1JT19TVEFUX1NUT1BCSVRfRVJSICAgMHgwMDA0MDAwMAorI2RlZmluZSBUTUlPX1NUQVRfREFUQVRJTUVPVVQgICAweDAwMDgwMDAwCisjZGVmaW5lIFRNSU9fU1RBVF9SWE9WRVJGTE9XICAgIDB4MDAxMDAwMDAKKyNkZWZpbmUgVE1JT19TVEFUX1RYVU5ERVJSVU4gICAgMHgwMDIwMDAwMAorI2RlZmluZSBUTUlPX1NUQVRfQ01EVElNRU9VVCAgICAweDAwNDAwMDAwCisjZGVmaW5lIFRNSU9fU1RBVF9SWFJEWSAgICAgICAgIDB4MDEwMDAwMDAKKyNkZWZpbmUgVE1JT19TVEFUX1RYUlEgICAgICAgICAgMHgwMjAwMDAwMAorI2RlZmluZSBUTUlPX1NUQVRfSUxMX0ZVTkMgICAgICAweDIwMDAwMDAwCisjZGVmaW5lIFRNSU9fU1RBVF9DTURfQlVTWSAgICAgIDB4NDAwMDAwMDAKKyNkZWZpbmUgVE1JT19TVEFUX0lMTF9BQ0NFU1MgICAgMHg4MDAwMDAwMAorCisvKiBEZWZpbml0aW9ucyBmb3IgdmFsdWVzIHRoZSBDVFJMX1NESU9fU1RBVFVTIHJlZ2lzdGVyIGNhbiB0YWtlLiAqLworI2RlZmluZSBUTUlPX1NESU9fU1RBVF9JT0lSUQkweDAwMDEKKyNkZWZpbmUgVE1JT19TRElPX1NUQVRfRVhQVUI1MgkweDQwMDAKKyNkZWZpbmUgVE1JT19TRElPX1NUQVRfRVhXVAkweDgwMDAKKyNkZWZpbmUgVE1JT19TRElPX01BU0tfQUxMCTB4YzAwNworCisvKiBEZWZpbmUgc29tZSBJUlEgbWFza3MgKi8KKy8qIFRoaXMgaXMgdGhlIG1hc2sgdXNlZCBhdCByZXNldCBieSB0aGUgY2hpcCAqLworI2RlZmluZSBUTUlPX01BU0tfQUxMICAgICAgICAgICAweDgzN2YwMzFkCisjZGVmaW5lIFRNSU9fTUFTS19SRUFET1AgIChUTUlPX1NUQVRfUlhSRFkgfCBUTUlPX1NUQVRfREFUQUVORCkKKyNkZWZpbmUgVE1JT19NQVNLX1dSSVRFT1AgKFRNSU9fU1RBVF9UWFJRIHwgVE1JT19TVEFUX0RBVEFFTkQpCisjZGVmaW5lIFRNSU9fTUFTS19DTUQgICAgIChUTUlPX1NUQVRfQ01EUkVTUEVORCB8IFRNSU9fU1RBVF9DTURUSU1FT1VUIHwgXAorCQlUTUlPX1NUQVRfQ0FSRF9SRU1PVkUgfCBUTUlPX1NUQVRfQ0FSRF9JTlNFUlQpCisjZGVmaW5lIFRNSU9fTUFTS19JUlEgICAgIChUTUlPX01BU0tfUkVBRE9QIHwgVE1JT19NQVNLX1dSSVRFT1AgfCBUTUlPX01BU0tfQ01EKQorCisjZGVmaW5lIGVuYWJsZV9tbWNfaXJxcyhob3N0LCBpKSBcCisJZG8geyBcCisJCXUzMiBtYXNrO1wKKwkJbWFzayAgPSBzZF9jdHJsX3JlYWQzMigoaG9zdCksIENUTF9JUlFfTUFTSyk7IFwKKwkJbWFzayAmPSB+KChpKSAmIFRNSU9fTUFTS19JUlEpOyBcCisJCXNkX2N0cmxfd3JpdGUzMigoaG9zdCksIENUTF9JUlFfTUFTSywgbWFzayk7IFwKKwl9IHdoaWxlICgwKQorCisjZGVmaW5lIGRpc2FibGVfbW1jX2lycXMoaG9zdCwgaSkgXAorCWRvIHsgXAorCQl1MzIgbWFzaztcCisJCW1hc2sgID0gc2RfY3RybF9yZWFkMzIoKGhvc3QpLCBDVExfSVJRX01BU0spOyBcCisJCW1hc2sgfD0gKChpKSAmIFRNSU9fTUFTS19JUlEpOyBcCisJCXNkX2N0cmxfd3JpdGUzMigoaG9zdCksIENUTF9JUlFfTUFTSywgbWFzayk7IFwKKwl9IHdoaWxlICgwKQorCisjZGVmaW5lIGFja19tbWNfaXJxcyhob3N0LCBpKSBcCisJZG8geyBcCisJCXNkX2N0cmxfd3JpdGUzMigoaG9zdCksIENUTF9TVEFUVVMsIH4oaSkpOyBcCisJfSB3aGlsZSAoMCkKKworLyogVGhpcyBpcyBhcmJpdHJhcnksIGp1c3Qgbm9vbmUgbmVlZGVkIGFueSBoaWdoZXIgYWxpZ25tZW50IHlldCAqLworI2RlZmluZSBNQVhfQUxJR04gNAorCitzdHJ1Y3QgdG1pb19tbWNfaG9zdCB7CisJdm9pZCBfX2lvbWVtICpjdGw7CisJdW5zaWduZWQgbG9uZyBidXNfc2hpZnQ7CisJc3RydWN0IG1tY19jb21tYW5kICAgICAgKmNtZDsKKwlzdHJ1Y3QgbW1jX3JlcXVlc3QgICAgICAqbXJxOworCXN0cnVjdCBtbWNfZGF0YSAgICAgICAgICpkYXRhOworCXN0cnVjdCBtbWNfaG9zdCAgICAgICAgICptbWM7CisJaW50ICAgICAgICAgICAgICAgICAgICAgaXJxOworCXVuc2lnbmVkIGludAkJc2Rpb19pcnFfZW5hYmxlZDsKKworCS8qIENhbGxiYWNrcyBmb3IgY2xvY2sgLyBwb3dlciBjb250cm9sICovCisJdm9pZCAoKnNldF9wd3IpKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmhvc3QsIGludCBzdGF0ZSk7CisJdm9pZCAoKnNldF9jbGtfZGl2KShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpob3N0LCBpbnQgc3RhdGUpOworCisJLyogcGlvIHJlbGF0ZWQgc3R1ZmYgKi8KKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgICAgICAqc2dfcHRyOworCXN0cnVjdCBzY2F0dGVybGlzdCAgICAgICpzZ19vcmlnOworCXVuc2lnbmVkIGludCAgICAgICAgICAgIHNnX2xlbjsKKwl1bnNpZ25lZCBpbnQgICAgICAgICAgICBzZ19vZmY7CisKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2OworCisJLyogRE1BIHN1cHBvcnQgKi8KKwlzdHJ1Y3QgZG1hX2NoYW4JCSpjaGFuX3J4OworCXN0cnVjdCBkbWFfY2hhbgkJKmNoYW5fdHg7CisJc3RydWN0IHRhc2tsZXRfc3RydWN0CWRtYV9jb21wbGV0ZTsKKwlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QJZG1hX2lzc3VlOworI2lmZGVmIENPTkZJR19UTUlPX01NQ19ETUEKKwl1bnNpZ25lZCBpbnQgICAgICAgICAgICBkbWFfc2dsZW47CisJdTgJCQlib3VuY2VfYnVmW1BBR0VfQ0FDSEVfU0laRV0gX19hdHRyaWJ1dGVfXygoYWxpZ25lZChNQVhfQUxJR04pKSk7CisJc3RydWN0IHNjYXR0ZXJsaXN0CWJvdW5jZV9zZzsKKyNlbmRpZgorCisJLyogVHJhY2sgbG9zdCBpbnRlcnJ1cHRzICovCisJc3RydWN0IGRlbGF5ZWRfd29yawlkZWxheWVkX3Jlc2V0X3dvcms7CisJc3BpbmxvY2tfdAkJbG9jazsKKwl1bnNpZ25lZCBsb25nCQlsYXN0X3JlcV90czsKK307CisKK3N0YXRpYyB2b2lkIHRtaW9fY2hlY2tfYm91bmNlX2J1ZmZlcihzdHJ1Y3QgdG1pb19tbWNfaG9zdCAqaG9zdCk7CisKK3N0YXRpYyB1MTYgc2RfY3RybF9yZWFkMTYoc3RydWN0IHRtaW9fbW1jX2hvc3QgKmhvc3QsIGludCBhZGRyKQoreworCXJldHVybiByZWFkdyhob3N0LT5jdGwgKyAoYWRkciA8PCBob3N0LT5idXNfc2hpZnQpKTsKK30KKworc3RhdGljIHZvaWQgc2RfY3RybF9yZWFkMTZfcmVwKHN0cnVjdCB0bWlvX21tY19ob3N0ICpob3N0LCBpbnQgYWRkciwKKwkJdTE2ICpidWYsIGludCBjb3VudCkKK3sKKwlyZWFkc3coaG9zdC0+Y3RsICsgKGFkZHIgPDwgaG9zdC0+YnVzX3NoaWZ0KSwgYnVmLCBjb3VudCk7Cit9CisKK3N0YXRpYyB1MzIgc2RfY3RybF9yZWFkMzIoc3RydWN0IHRtaW9fbW1jX2hvc3QgKmhvc3QsIGludCBhZGRyKQoreworCXJldHVybiByZWFkdyhob3N0LT5jdGwgKyAoYWRkciA8PCBob3N0LT5idXNfc2hpZnQpKSB8CisJICAgICAgIHJlYWR3KGhvc3QtPmN0bCArICgoYWRkciArIDIpIDw8IGhvc3QtPmJ1c19zaGlmdCkpIDw8IDE2OworfQorCitzdGF0aWMgdm9pZCBzZF9jdHJsX3dyaXRlMTYoc3RydWN0IHRtaW9fbW1jX2hvc3QgKmhvc3QsIGludCBhZGRyLCB1MTYgdmFsKQoreworCXdyaXRldyh2YWwsIGhvc3QtPmN0bCArIChhZGRyIDw8IGhvc3QtPmJ1c19zaGlmdCkpOworfQorCitzdGF0aWMgdm9pZCBzZF9jdHJsX3dyaXRlMTZfcmVwKHN0cnVjdCB0bWlvX21tY19ob3N0ICpob3N0LCBpbnQgYWRkciwKKwkJdTE2ICpidWYsIGludCBjb3VudCkKK3sKKwl3cml0ZXN3KGhvc3QtPmN0bCArIChhZGRyIDw8IGhvc3QtPmJ1c19zaGlmdCksIGJ1ZiwgY291bnQpOworfQorCitzdGF0aWMgdm9pZCBzZF9jdHJsX3dyaXRlMzIoc3RydWN0IHRtaW9fbW1jX2hvc3QgKmhvc3QsIGludCBhZGRyLCB1MzIgdmFsKQoreworCXdyaXRldyh2YWwsIGhvc3QtPmN0bCArIChhZGRyIDw8IGhvc3QtPmJ1c19zaGlmdCkpOworCXdyaXRldyh2YWwgPj4gMTYsIGhvc3QtPmN0bCArICgoYWRkciArIDIpIDw8IGhvc3QtPmJ1c19zaGlmdCkpOworfQorCitzdGF0aWMgdm9pZCB0bWlvX21tY19pbml0X3NnKHN0cnVjdCB0bWlvX21tY19ob3N0ICpob3N0LCBzdHJ1Y3QgbW1jX2RhdGEgKmRhdGEpCit7CisJaG9zdC0+c2dfbGVuID0gZGF0YS0+c2dfbGVuOworCWhvc3QtPnNnX3B0ciA9IGRhdGEtPnNnOworCWhvc3QtPnNnX29yaWcgPSBkYXRhLT5zZzsKKwlob3N0LT5zZ19vZmYgPSAwOworfQorCitzdGF0aWMgaW50IHRtaW9fbW1jX25leHRfc2coc3RydWN0IHRtaW9fbW1jX2hvc3QgKmhvc3QpCit7CisJaG9zdC0+c2dfcHRyID0gc2dfbmV4dChob3N0LT5zZ19wdHIpOworCWhvc3QtPnNnX29mZiA9IDA7CisJcmV0dXJuIC0taG9zdC0+c2dfbGVuOworfQorCitzdGF0aWMgY2hhciAqdG1pb19tbWNfa21hcF9hdG9taWMoc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywgdW5zaWduZWQgbG9uZyAqZmxhZ3MpCit7CisJbG9jYWxfaXJxX3NhdmUoKmZsYWdzKTsKKwlyZXR1cm4ga21hcF9hdG9taWMoc2dfcGFnZShzZyksIEtNX0JJT19TUkNfSVJRKSArIHNnLT5vZmZzZXQ7Cit9CisKK3N0YXRpYyB2b2lkIHRtaW9fbW1jX2t1bm1hcF9hdG9taWModm9pZCAqdmlydCwgdW5zaWduZWQgbG9uZyAqZmxhZ3MpCit7CisJa3VubWFwX2F0b21pYyh2aXJ0LCBLTV9CSU9fU1JDX0lSUSk7CisJbG9jYWxfaXJxX3Jlc3RvcmUoKmZsYWdzKTsKK30KKworI2lmZGVmIENPTkZJR19NTUNfREVCVUcKKworI2RlZmluZSBTVEFUVVNfVE9fVEVYVChhKSBcCisJZG8geyBcCisJCWlmIChzdGF0dXMgJiBUTUlPX1NUQVRfIyNhKSBcCisJCQlwcmludGsoI2EpOyBcCisJfSB3aGlsZSAoMCkKKwordm9pZCBwcl9kZWJ1Z19zdGF0dXModTMyIHN0YXR1cykKK3sKKwlwcmludGsoS0VSTl9ERUJVRyAic3RhdHVzOiAlMDh4ID0gIiwgc3RhdHVzKTsKKwlTVEFUVVNfVE9fVEVYVChDQVJEX1JFTU9WRSk7CisJU1RBVFVTX1RPX1RFWFQoQ0FSRF9JTlNFUlQpOworCVNUQVRVU19UT19URVhUKFNJR1NUQVRFKTsKKwlTVEFUVVNfVE9fVEVYVChXUlBST1RFQ1QpOworCVNUQVRVU19UT19URVhUKENBUkRfUkVNT1ZFX0EpOworCVNUQVRVU19UT19URVhUKENBUkRfSU5TRVJUX0EpOworCVNUQVRVU19UT19URVhUKFNJR1NUQVRFX0EpOworCVNUQVRVU19UT19URVhUKENNRF9JRFhfRVJSKTsKKwlTVEFUVVNfVE9fVEVYVChTVE9QQklUX0VSUik7CisJU1RBVFVTX1RPX1RFWFQoSUxMX0ZVTkMpOworCVNUQVRVU19UT19URVhUKENNRF9CVVNZKTsKKwlTVEFUVVNfVE9fVEVYVChDTURSRVNQRU5EKTsKKwlTVEFUVVNfVE9fVEVYVChEQVRBRU5EKTsKKwlTVEFUVVNfVE9fVEVYVChDUkNGQUlMKTsKKwlTVEFUVVNfVE9fVEVYVChEQVRBVElNRU9VVCk7CisJU1RBVFVTX1RPX1RFWFQoQ01EVElNRU9VVCk7CisJU1RBVFVTX1RPX1RFWFQoUlhPVkVSRkxPVyk7CisJU1RBVFVTX1RPX1RFWFQoVFhVTkRFUlJVTik7CisJU1RBVFVTX1RPX1RFWFQoUlhSRFkpOworCVNUQVRVU19UT19URVhUKFRYUlEpOworCVNUQVRVU19UT19URVhUKElMTF9BQ0NFU1MpOworCXByaW50aygiXG4iKTsKK30KKworI2Vsc2UKKyNkZWZpbmUgcHJfZGVidWdfc3RhdHVzKHMpICBkbyB7IH0gd2hpbGUgKDApCisjZW5kaWYKKworc3RhdGljIHZvaWQgdG1pb19tbWNfZW5hYmxlX3NkaW9faXJxKHN0cnVjdCBtbWNfaG9zdCAqbW1jLCBpbnQgZW5hYmxlKQoreworCXN0cnVjdCB0bWlvX21tY19ob3N0ICpob3N0ID0gbW1jX3ByaXYobW1jKTsKKworCWlmIChlbmFibGUpIHsKKwkJaG9zdC0+c2Rpb19pcnFfZW5hYmxlZCA9IDE7CisJCXNkX2N0cmxfd3JpdGUxNihob3N0LCBDVExfVFJBTlNBQ1RJT05fQ1RMLCAweDAwMDEpOworCQlzZF9jdHJsX3dyaXRlMTYoaG9zdCwgQ1RMX1NESU9fSVJRX01BU0ssCisJCQkoVE1JT19TRElPX01BU0tfQUxMICYgflRNSU9fU0RJT19TVEFUX0lPSVJRKSk7CisJfSBlbHNlIHsKKwkJc2RfY3RybF93cml0ZTE2KGhvc3QsIENUTF9TRElPX0lSUV9NQVNLLCBUTUlPX1NESU9fTUFTS19BTEwpOworCQlzZF9jdHJsX3dyaXRlMTYoaG9zdCwgQ1RMX1RSQU5TQUNUSU9OX0NUTCwgMHgwMDAwKTsKKwkJaG9zdC0+c2Rpb19pcnFfZW5hYmxlZCA9IDA7CisJfQorfQogCiBzdGF0aWMgdm9pZCB0bWlvX21tY19zZXRfY2xvY2soc3RydWN0IHRtaW9fbW1jX2hvc3QgKmhvc3QsIGludCBuZXdfY2xvY2spCiB7CkBAIC01NSw4ICszMDAsMjMgQEAKIAogc3RhdGljIHZvaWQgdG1pb19tbWNfY2xrX3N0b3Aoc3RydWN0IHRtaW9fbW1jX2hvc3QgKmhvc3QpCiB7CisJc3RydWN0IG1mZF9jZWxsICpjZWxsID0gaG9zdC0+cGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJc3RydWN0IHRtaW9fbW1jX2RhdGEgKnBkYXRhID0gY2VsbC0+ZHJpdmVyX2RhdGE7CisKKwkvKgorCSAqIFRlc3Rpbmcgb24gc2gtbW9iaWxlIHNob3dlZCB0aGF0IFNESU8gSVJRcyBhcmUgdW5tYXNrZWQgd2hlbgorCSAqIENUTF9DTEtfQU5EX1dBSVRfQ1RMIGdldHMgd3JpdHRlbiwgc28gd2UgaGF2ZSB0byBkaXNhYmxlIHRoZQorCSAqIGRldmljZSBJUlEgaGVyZSBhbmQgcmVzdG9yZSB0aGUgU0RJTyBJUlEgbWFzayBiZWZvcmUKKwkgKiByZS1lbmFibGluZyB0aGUgZGV2aWNlIElSUS4KKwkgKi8KKwlpZiAocGRhdGEtPmZsYWdzICYgVE1JT19NTUNfU0RJT19JUlEpCisJCWRpc2FibGVfaXJxKGhvc3QtPmlycSk7CiAJc2RfY3RybF93cml0ZTE2KGhvc3QsIENUTF9DTEtfQU5EX1dBSVRfQ1RMLCAweDAwMDApOwogCW1zbGVlcCgxMCk7CisJaWYgKHBkYXRhLT5mbGFncyAmIFRNSU9fTU1DX1NESU9fSVJRKSB7CisJCXRtaW9fbW1jX2VuYWJsZV9zZGlvX2lycShob3N0LT5tbWMsIGhvc3QtPnNkaW9faXJxX2VuYWJsZWQpOworCQllbmFibGVfaXJxKGhvc3QtPmlycSk7CisJfQogCXNkX2N0cmxfd3JpdGUxNihob3N0LCBDVExfU0RfQ0FSRF9DTEtfQ1RMLCB+MHgwMTAwICYKIAkJc2RfY3RybF9yZWFkMTYoaG9zdCwgQ1RMX1NEX0NBUkRfQ0xLX0NUTCkpOwogCW1zbGVlcCgxMCk7CkBAIC02NCwxMSArMzI0LDIxIEBACiAKIHN0YXRpYyB2b2lkIHRtaW9fbW1jX2Nsa19zdGFydChzdHJ1Y3QgdG1pb19tbWNfaG9zdCAqaG9zdCkKIHsKKwlzdHJ1Y3QgbWZkX2NlbGwgKmNlbGwgPSBob3N0LT5wZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlzdHJ1Y3QgdG1pb19tbWNfZGF0YSAqcGRhdGEgPSBjZWxsLT5kcml2ZXJfZGF0YTsKKwogCXNkX2N0cmxfd3JpdGUxNihob3N0LCBDVExfU0RfQ0FSRF9DTEtfQ1RMLCAweDAxMDAgfAogCQlzZF9jdHJsX3JlYWQxNihob3N0LCBDVExfU0RfQ0FSRF9DTEtfQ1RMKSk7CiAJbXNsZWVwKDEwKTsKKwkvKiBzZWUgY29tbWVudCBpbiB0bWlvX21tY19jbGtfc3RvcCBhYm92ZSAqLworCWlmIChwZGF0YS0+ZmxhZ3MgJiBUTUlPX01NQ19TRElPX0lSUSkKKwkJZGlzYWJsZV9pcnEoaG9zdC0+aXJxKTsKIAlzZF9jdHJsX3dyaXRlMTYoaG9zdCwgQ1RMX0NMS19BTkRfV0FJVF9DVEwsIDB4MDEwMCk7CiAJbXNsZWVwKDEwKTsKKwlpZiAocGRhdGEtPmZsYWdzICYgVE1JT19NTUNfU0RJT19JUlEpIHsKKwkJdG1pb19tbWNfZW5hYmxlX3NkaW9faXJxKGhvc3QtPm1tYywgaG9zdC0+c2Rpb19pcnFfZW5hYmxlZCk7CisJCWVuYWJsZV9pcnEoaG9zdC0+aXJxKTsKKwl9CiB9CiAKIHN0YXRpYyB2b2lkIHJlc2V0KHN0cnVjdCB0bWlvX21tY19ob3N0ICpob3N0KQpAQCAtODIsMTUgKzM1Miw2MCBAQAogCW1zbGVlcCgxMCk7CiB9CiAKK3N0YXRpYyB2b2lkIHRtaW9fbW1jX3Jlc2V0X3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCB0bWlvX21tY19ob3N0ICpob3N0ID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCB0bWlvX21tY19ob3N0LAorCQkJCQkJICBkZWxheWVkX3Jlc2V0X3dvcmsud29yayk7CisJc3RydWN0IG1tY19yZXF1ZXN0ICptcnE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZob3N0LT5sb2NrLCBmbGFncyk7CisJbXJxID0gaG9zdC0+bXJxOworCisJLyogcmVxdWVzdCBhbHJlYWR5IGZpbmlzaGVkICovCisJaWYgKCFtcnEKKwkgICAgfHwgdGltZV9pc19hZnRlcl9qaWZmaWVzKGhvc3QtPmxhc3RfcmVxX3RzICsKKwkJbXNlY3NfdG9famlmZmllcygyMDAwKSkpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaG9zdC0+bG9jaywgZmxhZ3MpOworCQlyZXR1cm47CisJfQorCisJZGV2X3dhcm4oJmhvc3QtPnBkZXYtPmRldiwKKwkJInRpbWVvdXQgd2FpdGluZyBmb3IgaGFyZHdhcmUgaW50ZXJydXB0IChDTUQldSlcbiIsCisJCW1ycS0+Y21kLT5vcGNvZGUpOworCisJaWYgKGhvc3QtPmRhdGEpCisJCWhvc3QtPmRhdGEtPmVycm9yID0gLUVUSU1FRE9VVDsKKwllbHNlIGlmIChob3N0LT5jbWQpCisJCWhvc3QtPmNtZC0+ZXJyb3IgPSAtRVRJTUVET1VUOworCWVsc2UKKwkJbXJxLT5jbWQtPmVycm9yID0gLUVUSU1FRE9VVDsKKworCWhvc3QtPmNtZCA9IE5VTEw7CisJaG9zdC0+ZGF0YSA9IE5VTEw7CisJaG9zdC0+bXJxID0gTlVMTDsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhvc3QtPmxvY2ssIGZsYWdzKTsKKworCXJlc2V0KGhvc3QpOworCisJbW1jX3JlcXVlc3RfZG9uZShob3N0LT5tbWMsIG1ycSk7Cit9CisKIHN0YXRpYyB2b2lkCiB0bWlvX21tY19maW5pc2hfcmVxdWVzdChzdHJ1Y3QgdG1pb19tbWNfaG9zdCAqaG9zdCkKIHsKIAlzdHJ1Y3QgbW1jX3JlcXVlc3QgKm1ycSA9IGhvc3QtPm1ycTsKIAorCWlmICghbXJxKQorCQlyZXR1cm47CisKIAlob3N0LT5tcnEgPSBOVUxMOwogCWhvc3QtPmNtZCA9IE5VTEw7CiAJaG9zdC0+ZGF0YSA9IE5VTEw7CiAKKwljYW5jZWxfZGVsYXllZF93b3JrKCZob3N0LT5kZWxheWVkX3Jlc2V0X3dvcmspOworCiAJbW1jX3JlcXVlc3RfZG9uZShob3N0LT5tbWMsIG1ycSk7CiB9CiAKQEAgLTIwMCw2ICs1MTUsNyBAQAogCXJldHVybjsKIH0KIAorLyogbmVlZHMgdG8gYmUgY2FsbGVkIHdpdGggaG9zdC0+bG9jayBoZWxkICovCiBzdGF0aWMgdm9pZCB0bWlvX21tY19kb19kYXRhX2lycShzdHJ1Y3QgdG1pb19tbWNfaG9zdCAqaG9zdCkKIHsKIAlzdHJ1Y3QgbW1jX2RhdGEgKmRhdGEgPSBob3N0LT5kYXRhOwpAQCAtMjMzLDYgKzU0OSw4IEBACiAJaWYgKGRhdGEtPmZsYWdzICYgTU1DX0RBVEFfUkVBRCkgewogCQlpZiAoIWhvc3QtPmNoYW5fcngpCiAJCQlkaXNhYmxlX21tY19pcnFzKGhvc3QsIFRNSU9fTUFTS19SRUFET1ApOworCQllbHNlCisJCQl0bWlvX2NoZWNrX2JvdW5jZV9idWZmZXIoaG9zdCk7CiAJCWRldl9kYmcoJmhvc3QtPnBkZXYtPmRldiwgIkNvbXBsZXRlIFJ4IHJlcXVlc3QgJXBcbiIsCiAJCQlob3N0LT5tcnEpOwogCX0gZWxzZSB7CkBAIC0yNTQsMTAgKzU3MiwxMiBAQAogCiBzdGF0aWMgdm9pZCB0bWlvX21tY19kYXRhX2lycShzdHJ1Y3QgdG1pb19tbWNfaG9zdCAqaG9zdCkKIHsKLQlzdHJ1Y3QgbW1jX2RhdGEgKmRhdGEgPSBob3N0LT5kYXRhOworCXN0cnVjdCBtbWNfZGF0YSAqZGF0YTsKKwlzcGluX2xvY2soJmhvc3QtPmxvY2spOworCWRhdGEgPSBob3N0LT5kYXRhOwogCiAJaWYgKCFkYXRhKQotCQlyZXR1cm47CisJCWdvdG8gb3V0OwogCiAJaWYgKGhvc3QtPmNoYW5fdHggJiYgKGRhdGEtPmZsYWdzICYgTU1DX0RBVEFfV1JJVEUpKSB7CiAJCS8qCkBAIC0yNzgsNiArNTk4LDggQEAKIAl9IGVsc2UgewogCQl0bWlvX21tY19kb19kYXRhX2lycShob3N0KTsKIAl9CitvdXQ6CisJc3Bpbl91bmxvY2soJmhvc3QtPmxvY2spOwogfQogCiBzdGF0aWMgdm9pZCB0bWlvX21tY19jbWRfaXJxKHN0cnVjdCB0bWlvX21tY19ob3N0ICpob3N0LApAQCAtMjg2LDkgKzYwOCwxMSBAQAogCXN0cnVjdCBtbWNfY29tbWFuZCAqY21kID0gaG9zdC0+Y21kOwogCWludCBpLCBhZGRyOwogCisJc3Bpbl9sb2NrKCZob3N0LT5sb2NrKTsKKwogCWlmICghaG9zdC0+Y21kKSB7CiAJCXByX2RlYnVnKCJTcHVyaW91cyBDTUQgaXJxXG4iKTsKLQkJcmV0dXJuOworCQlnb3RvIG91dDsKIAl9CiAKIAlob3N0LT5jbWQgPSBOVUxMOwpAQCAtMzI0LDggKzY0OCw3IEBACiAJCQlpZiAoIWhvc3QtPmNoYW5fcngpCiAJCQkJZW5hYmxlX21tY19pcnFzKGhvc3QsIFRNSU9fTUFTS19SRUFET1ApOwogCQl9IGVsc2UgewotCQkJc3RydWN0IGRtYV9jaGFuICpjaGFuID0gaG9zdC0+Y2hhbl90eDsKLQkJCWlmICghY2hhbikKKwkJCWlmICghaG9zdC0+Y2hhbl90eCkKIAkJCQllbmFibGVfbW1jX2lycXMoaG9zdCwgVE1JT19NQVNLX1dSSVRFT1ApOwogCQkJZWxzZQogCQkJCXRhc2tsZXRfc2NoZWR1bGUoJmhvc3QtPmRtYV9pc3N1ZSk7CkBAIC0zMzQsMTMgKzY1NywxOSBAQAogCQl0bWlvX21tY19maW5pc2hfcmVxdWVzdChob3N0KTsKIAl9CiAKK291dDoKKwlzcGluX3VubG9jaygmaG9zdC0+bG9jayk7CisKIAlyZXR1cm47CiB9CiAKIHN0YXRpYyBpcnFyZXR1cm5fdCB0bWlvX21tY19pcnEoaW50IGlycSwgdm9pZCAqZGV2aWQpCiB7CiAJc3RydWN0IHRtaW9fbW1jX2hvc3QgKmhvc3QgPSBkZXZpZDsKKwlzdHJ1Y3QgbWZkX2NlbGwJKmNlbGwgPSBob3N0LT5wZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlzdHJ1Y3QgdG1pb19tbWNfZGF0YSAqcGRhdGEgPSBjZWxsLT5kcml2ZXJfZGF0YTsKIAl1bnNpZ25lZCBpbnQgaXJlZywgaXJxX21hc2ssIHN0YXR1czsKKwl1bnNpZ25lZCBpbnQgc2Rpb19pcmVnLCBzZGlvX2lycV9tYXNrLCBzZGlvX3N0YXR1czsKIAogCXByX2RlYnVnKCJNTUMgSVJRIGJlZ2luXG4iKTsKIApAQCAtMzQ4LDYgKzY3NywyOSBAQAogCWlycV9tYXNrID0gc2RfY3RybF9yZWFkMzIoaG9zdCwgQ1RMX0lSUV9NQVNLKTsKIAlpcmVnID0gc3RhdHVzICYgVE1JT19NQVNLX0lSUSAmIH5pcnFfbWFzazsKIAorCXNkaW9faXJlZyA9IDA7CisJaWYgKCFpcmVnICYmIHBkYXRhLT5mbGFncyAmIFRNSU9fTU1DX1NESU9fSVJRKSB7CisJCXNkaW9fc3RhdHVzID0gc2RfY3RybF9yZWFkMTYoaG9zdCwgQ1RMX1NESU9fU1RBVFVTKTsKKwkJc2Rpb19pcnFfbWFzayA9IHNkX2N0cmxfcmVhZDE2KGhvc3QsIENUTF9TRElPX0lSUV9NQVNLKTsKKwkJc2Rpb19pcmVnID0gc2Rpb19zdGF0dXMgJiBUTUlPX1NESU9fTUFTS19BTEwgJiB+c2Rpb19pcnFfbWFzazsKKworCQlzZF9jdHJsX3dyaXRlMTYoaG9zdCwgQ1RMX1NESU9fU1RBVFVTLCBzZGlvX3N0YXR1cyAmIH5UTUlPX1NESU9fTUFTS19BTEwpOworCisJCWlmIChzZGlvX2lyZWcgJiYgIWhvc3QtPnNkaW9faXJxX2VuYWJsZWQpIHsKKwkJCXByX3dhcm5pbmcoInRtaW9fbW1jOiBTcHVyaW91cyBTRElPIElSUSwgZGlzYWJsaW5nISAweCUwNHggMHglMDR4IDB4JTA0eFxuIiwKKwkJCQkgICBzZGlvX3N0YXR1cywgc2Rpb19pcnFfbWFzaywgc2Rpb19pcmVnKTsKKwkJCXRtaW9fbW1jX2VuYWJsZV9zZGlvX2lycShob3N0LT5tbWMsIDApOworCQkJZ290byBvdXQ7CisJCX0KKworCQlpZiAoaG9zdC0+bW1jLT5jYXBzICYgTU1DX0NBUF9TRElPX0lSUSAmJgorCQkJc2Rpb19pcmVnICYgVE1JT19TRElPX1NUQVRfSU9JUlEpCisJCQltbWNfc2lnbmFsX3NkaW9faXJxKGhvc3QtPm1tYyk7CisKKwkJaWYgKHNkaW9faXJlZykKKwkJCWdvdG8gb3V0OworCX0KKwogCXByX2RlYnVnX3N0YXR1cyhzdGF0dXMpOwogCXByX2RlYnVnX3N0YXR1cyhpcmVnKTsKIApAQCAtMzc1LDggKzcyNywxMCBAQAogICovCiAKIAkJLyogQ29tbWFuZCBjb21wbGV0aW9uICovCi0JCWlmIChpcmVnICYgVE1JT19NQVNLX0NNRCkgewotCQkJYWNrX21tY19pcnFzKGhvc3QsIFRNSU9fTUFTS19DTUQpOworCQlpZiAoaXJlZyAmIChUTUlPX1NUQVRfQ01EUkVTUEVORCB8IFRNSU9fU1RBVF9DTURUSU1FT1VUKSkgeworCQkJYWNrX21tY19pcnFzKGhvc3QsCisJCQkJICAgICBUTUlPX1NUQVRfQ01EUkVTUEVORCB8CisJCQkJICAgICBUTUlPX1NUQVRfQ01EVElNRU9VVCk7CiAJCQl0bWlvX21tY19jbWRfaXJxKGhvc3QsIHN0YXR1cyk7CiAJCX0KIApAQCAtNDA3LDYgKzc2MSwxNiBAQAogfQogCiAjaWZkZWYgQ09ORklHX1RNSU9fTU1DX0RNQQorc3RhdGljIHZvaWQgdG1pb19jaGVja19ib3VuY2VfYnVmZmVyKHN0cnVjdCB0bWlvX21tY19ob3N0ICpob3N0KQoreworCWlmIChob3N0LT5zZ19wdHIgPT0gJmhvc3QtPmJvdW5jZV9zZykgeworCQl1bnNpZ25lZCBsb25nIGZsYWdzOworCQl2b2lkICpzZ192YWRkciA9IHRtaW9fbW1jX2ttYXBfYXRvbWljKGhvc3QtPnNnX29yaWcsICZmbGFncyk7CisJCW1lbWNweShzZ192YWRkciwgaG9zdC0+Ym91bmNlX2J1ZiwgaG9zdC0+Ym91bmNlX3NnLmxlbmd0aCk7CisJCXRtaW9fbW1jX2t1bm1hcF9hdG9taWMoc2dfdmFkZHIsICZmbGFncyk7CisJfQorfQorCiBzdGF0aWMgdm9pZCB0bWlvX21tY19lbmFibGVfZG1hKHN0cnVjdCB0bWlvX21tY19ob3N0ICpob3N0LCBib29sIGVuYWJsZSkKIHsKICNpZiBkZWZpbmVkKENPTkZJR19TVVBFUkgpIHx8IGRlZmluZWQoQ09ORklHX0FSQ0hfU0hNT0JJTEUpCkBAIC00MjcsMTIgKzc5MSwzOSBAQAogCQllbmFibGVfbW1jX2lycXMoaG9zdCwgVE1JT19TVEFUX0RBVEFFTkQpOwogfQogCi1zdGF0aWMgaW50IHRtaW9fbW1jX3N0YXJ0X2RtYV9yeChzdHJ1Y3QgdG1pb19tbWNfaG9zdCAqaG9zdCkKK3N0YXRpYyB2b2lkIHRtaW9fbW1jX3N0YXJ0X2RtYV9yeChzdHJ1Y3QgdG1pb19tbWNfaG9zdCAqaG9zdCkKIHsKLQlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnID0gaG9zdC0+c2dfcHRyOworCXN0cnVjdCBzY2F0dGVybGlzdCAqc2cgPSBob3N0LT5zZ19wdHIsICpzZ190bXA7CiAJc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICpkZXNjID0gTlVMTDsKIAlzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4gPSBob3N0LT5jaGFuX3J4OwotCWludCByZXQ7CisJc3RydWN0IG1mZF9jZWxsCSpjZWxsID0gaG9zdC0+cGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJc3RydWN0IHRtaW9fbW1jX2RhdGEgKnBkYXRhID0gY2VsbC0+ZHJpdmVyX2RhdGE7CisJZG1hX2Nvb2tpZV90IGNvb2tpZTsKKwlpbnQgcmV0LCBpOworCWJvb2wgYWxpZ25lZCA9IHRydWUsIG11bHRpcGxlID0gdHJ1ZTsKKwl1bnNpZ25lZCBpbnQgYWxpZ24gPSAoMSA8PCBwZGF0YS0+ZG1hLT5hbGlnbm1lbnRfc2hpZnQpIC0gMTsKKworCWZvcl9lYWNoX3NnKHNnLCBzZ190bXAsIGhvc3QtPnNnX2xlbiwgaSkgeworCQlpZiAoc2dfdG1wLT5vZmZzZXQgJiBhbGlnbikKKwkJCWFsaWduZWQgPSBmYWxzZTsKKwkJaWYgKHNnX3RtcC0+bGVuZ3RoICYgYWxpZ24pIHsKKwkJCW11bHRpcGxlID0gZmFsc2U7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmICgoIWFsaWduZWQgJiYgKGhvc3QtPnNnX2xlbiA+IDEgfHwgc2ctPmxlbmd0aCA+IFBBR0VfQ0FDSEVfU0laRSB8fAorCQkJICBhbGlnbiA+PSBNQVhfQUxJR04pKSB8fCAhbXVsdGlwbGUpIHsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBwaW87CisJfQorCisJLyogVGhlIG9ubHkgc2cgZWxlbWVudCBjYW4gYmUgdW5hbGlnbmVkLCB1c2Ugb3VyIGJvdW5jZSBidWZmZXIgdGhlbiAqLworCWlmICghYWxpZ25lZCkgeworCQlzZ19pbml0X29uZSgmaG9zdC0+Ym91bmNlX3NnLCBob3N0LT5ib3VuY2VfYnVmLCBzZy0+bGVuZ3RoKTsKKwkJaG9zdC0+c2dfcHRyID0gJmhvc3QtPmJvdW5jZV9zZzsKKwkJc2cgPSBob3N0LT5zZ19wdHI7CisJfQogCiAJcmV0ID0gZG1hX21hcF9zZygmaG9zdC0+cGRldi0+ZGV2LCBzZywgaG9zdC0+c2dfbGVuLCBETUFfRlJPTV9ERVZJQ0UpOwogCWlmIChyZXQgPiAwKSB7CkBAIC00NDIsMjEgKzgzMywyMSBAQAogCX0KIAogCWlmIChkZXNjKSB7Ci0JCWhvc3QtPmRlc2MgPSBkZXNjOwogCQlkZXNjLT5jYWxsYmFjayA9IHRtaW9fZG1hX2NvbXBsZXRlOwogCQlkZXNjLT5jYWxsYmFja19wYXJhbSA9IGhvc3Q7Ci0JCWhvc3QtPmNvb2tpZSA9IGRlc2MtPnR4X3N1Ym1pdChkZXNjKTsKLQkJaWYgKGhvc3QtPmNvb2tpZSA8IDApIHsKLQkJCWhvc3QtPmRlc2MgPSBOVUxMOwotCQkJcmV0ID0gaG9zdC0+Y29va2llOworCQljb29raWUgPSBkZXNjLT50eF9zdWJtaXQoZGVzYyk7CisJCWlmIChjb29raWUgPCAwKSB7CisJCQlkZXNjID0gTlVMTDsKKwkJCXJldCA9IGNvb2tpZTsKIAkJfSBlbHNlIHsKIAkJCWNoYW4tPmRldmljZS0+ZGV2aWNlX2lzc3VlX3BlbmRpbmcoY2hhbik7CiAJCX0KIAl9CiAJZGV2X2RiZygmaG9zdC0+cGRldi0+ZGV2LCAiJXMoKTogbWFwcGVkICVkIC0+ICVkLCBjb29raWUgJWQsIHJxICVwXG4iLAotCQlfX2Z1bmNfXywgaG9zdC0+c2dfbGVuLCByZXQsIGhvc3QtPmNvb2tpZSwgaG9zdC0+bXJxKTsKKwkJX19mdW5jX18sIGhvc3QtPnNnX2xlbiwgcmV0LCBjb29raWUsIGhvc3QtPm1ycSk7CiAKLQlpZiAoIWhvc3QtPmRlc2MpIHsKK3BpbzoKKwlpZiAoIWRlc2MpIHsKIAkJLyogRE1BIGZhaWxlZCwgZmFsbCBiYWNrIHRvIFBJTyAqLwogCQlpZiAocmV0ID49IDApCiAJCQlyZXQgPSAtRUlPOwpAQCAtNDcxLDI0ICs4NjIsNDkgQEAKIAkJZGV2X3dhcm4oJmhvc3QtPnBkZXYtPmRldiwKIAkJCSAiRE1BIGZhaWxlZDogJWQsIGZhbGxpbmcgYmFjayB0byBQSU9cbiIsIHJldCk7CiAJCXRtaW9fbW1jX2VuYWJsZV9kbWEoaG9zdCwgZmFsc2UpOwotCQlyZXNldChob3N0KTsKLQkJLyogRmFpbCB0aGlzIHJlcXVlc3QsIGxldCBhYm92ZSBsYXllcnMgcmVjb3ZlciAqLwotCQlob3N0LT5tcnEtPmNtZC0+ZXJyb3IgPSByZXQ7Ci0JCXRtaW9fbW1jX2ZpbmlzaF9yZXF1ZXN0KGhvc3QpOwogCX0KIAogCWRldl9kYmcoJmhvc3QtPnBkZXYtPmRldiwgIiVzKCk6IGRlc2MgJXAsIGNvb2tpZSAlZCwgc2dbJWRdXG4iLCBfX2Z1bmNfXywKLQkJZGVzYywgaG9zdC0+Y29va2llLCBob3N0LT5zZ19sZW4pOwotCi0JcmV0dXJuIHJldCA+IDAgPyAwIDogcmV0OworCQlkZXNjLCBjb29raWUsIGhvc3QtPnNnX2xlbik7CiB9CiAKLXN0YXRpYyBpbnQgdG1pb19tbWNfc3RhcnRfZG1hX3R4KHN0cnVjdCB0bWlvX21tY19ob3N0ICpob3N0KQorc3RhdGljIHZvaWQgdG1pb19tbWNfc3RhcnRfZG1hX3R4KHN0cnVjdCB0bWlvX21tY19ob3N0ICpob3N0KQogewotCXN0cnVjdCBzY2F0dGVybGlzdCAqc2cgPSBob3N0LT5zZ19wdHI7CisJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZyA9IGhvc3QtPnNnX3B0ciwgKnNnX3RtcDsKIAlzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKmRlc2MgPSBOVUxMOwogCXN0cnVjdCBkbWFfY2hhbiAqY2hhbiA9IGhvc3QtPmNoYW5fdHg7Ci0JaW50IHJldDsKKwlzdHJ1Y3QgbWZkX2NlbGwJKmNlbGwgPSBob3N0LT5wZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlzdHJ1Y3QgdG1pb19tbWNfZGF0YSAqcGRhdGEgPSBjZWxsLT5kcml2ZXJfZGF0YTsKKwlkbWFfY29va2llX3QgY29va2llOworCWludCByZXQsIGk7CisJYm9vbCBhbGlnbmVkID0gdHJ1ZSwgbXVsdGlwbGUgPSB0cnVlOworCXVuc2lnbmVkIGludCBhbGlnbiA9ICgxIDw8IHBkYXRhLT5kbWEtPmFsaWdubWVudF9zaGlmdCkgLSAxOworCisJZm9yX2VhY2hfc2coc2csIHNnX3RtcCwgaG9zdC0+c2dfbGVuLCBpKSB7CisJCWlmIChzZ190bXAtPm9mZnNldCAmIGFsaWduKQorCQkJYWxpZ25lZCA9IGZhbHNlOworCQlpZiAoc2dfdG1wLT5sZW5ndGggJiBhbGlnbikgeworCQkJbXVsdGlwbGUgPSBmYWxzZTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKCghYWxpZ25lZCAmJiAoaG9zdC0+c2dfbGVuID4gMSB8fCBzZy0+bGVuZ3RoID4gUEFHRV9DQUNIRV9TSVpFIHx8CisJCQkgIGFsaWduID49IE1BWF9BTElHTikpIHx8ICFtdWx0aXBsZSkgeworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIHBpbzsKKwl9CisKKwkvKiBUaGUgb25seSBzZyBlbGVtZW50IGNhbiBiZSB1bmFsaWduZWQsIHVzZSBvdXIgYm91bmNlIGJ1ZmZlciB0aGVuICovCisJaWYgKCFhbGlnbmVkKSB7CisJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCXZvaWQgKnNnX3ZhZGRyID0gdG1pb19tbWNfa21hcF9hdG9taWMoc2csICZmbGFncyk7CisJCXNnX2luaXRfb25lKCZob3N0LT5ib3VuY2Vfc2csIGhvc3QtPmJvdW5jZV9idWYsIHNnLT5sZW5ndGgpOworCQltZW1jcHkoaG9zdC0+Ym91bmNlX2J1Ziwgc2dfdmFkZHIsIGhvc3QtPmJvdW5jZV9zZy5sZW5ndGgpOworCQl0bWlvX21tY19rdW5tYXBfYXRvbWljKHNnX3ZhZGRyLCAmZmxhZ3MpOworCQlob3N0LT5zZ19wdHIgPSAmaG9zdC0+Ym91bmNlX3NnOworCQlzZyA9IGhvc3QtPnNnX3B0cjsKKwl9CiAKIAlyZXQgPSBkbWFfbWFwX3NnKCZob3N0LT5wZGV2LT5kZXYsIHNnLCBob3N0LT5zZ19sZW4sIERNQV9UT19ERVZJQ0UpOwogCWlmIChyZXQgPiAwKSB7CkBAIC00OTgsMTkgKzkxNCwxOSBAQAogCX0KIAogCWlmIChkZXNjKSB7Ci0JCWhvc3QtPmRlc2MgPSBkZXNjOwogCQlkZXNjLT5jYWxsYmFjayA9IHRtaW9fZG1hX2NvbXBsZXRlOwogCQlkZXNjLT5jYWxsYmFja19wYXJhbSA9IGhvc3Q7Ci0JCWhvc3QtPmNvb2tpZSA9IGRlc2MtPnR4X3N1Ym1pdChkZXNjKTsKLQkJaWYgKGhvc3QtPmNvb2tpZSA8IDApIHsKLQkJCWhvc3QtPmRlc2MgPSBOVUxMOwotCQkJcmV0ID0gaG9zdC0+Y29va2llOworCQljb29raWUgPSBkZXNjLT50eF9zdWJtaXQoZGVzYyk7CisJCWlmIChjb29raWUgPCAwKSB7CisJCQlkZXNjID0gTlVMTDsKKwkJCXJldCA9IGNvb2tpZTsKIAkJfQogCX0KIAlkZXZfZGJnKCZob3N0LT5wZGV2LT5kZXYsICIlcygpOiBtYXBwZWQgJWQgLT4gJWQsIGNvb2tpZSAlZCwgcnEgJXBcbiIsCi0JCV9fZnVuY19fLCBob3N0LT5zZ19sZW4sIHJldCwgaG9zdC0+Y29va2llLCBob3N0LT5tcnEpOworCQlfX2Z1bmNfXywgaG9zdC0+c2dfbGVuLCByZXQsIGNvb2tpZSwgaG9zdC0+bXJxKTsKIAotCWlmICghaG9zdC0+ZGVzYykgeworcGlvOgorCWlmICghZGVzYykgewogCQkvKiBETUEgZmFpbGVkLCBmYWxsIGJhY2sgdG8gUElPICovCiAJCWlmIChyZXQgPj0gMCkKIAkJCXJldCA9IC1FSU87CkBAIC01MjUsMzAgKzk0MSwyMiBAQAogCQlkZXZfd2FybigmaG9zdC0+cGRldi0+ZGV2LAogCQkJICJETUEgZmFpbGVkOiAlZCwgZmFsbGluZyBiYWNrIHRvIFBJT1xuIiwgcmV0KTsKIAkJdG1pb19tbWNfZW5hYmxlX2RtYShob3N0LCBmYWxzZSk7Ci0JCXJlc2V0KGhvc3QpOwotCQkvKiBGYWlsIHRoaXMgcmVxdWVzdCwgbGV0IGFib3ZlIGxheWVycyByZWNvdmVyICovCi0JCWhvc3QtPm1ycS0+Y21kLT5lcnJvciA9IHJldDsKLQkJdG1pb19tbWNfZmluaXNoX3JlcXVlc3QoaG9zdCk7CiAJfQogCiAJZGV2X2RiZygmaG9zdC0+cGRldi0+ZGV2LCAiJXMoKTogZGVzYyAlcCwgY29va2llICVkXG4iLCBfX2Z1bmNfXywKLQkJZGVzYywgaG9zdC0+Y29va2llKTsKLQotCXJldHVybiByZXQgPiAwID8gMCA6IHJldDsKKwkJZGVzYywgY29va2llKTsKIH0KIAotc3RhdGljIGludCB0bWlvX21tY19zdGFydF9kbWEoc3RydWN0IHRtaW9fbW1jX2hvc3QgKmhvc3QsCitzdGF0aWMgdm9pZCB0bWlvX21tY19zdGFydF9kbWEoc3RydWN0IHRtaW9fbW1jX2hvc3QgKmhvc3QsCiAJCQkgICAgICAgc3RydWN0IG1tY19kYXRhICpkYXRhKQogewogCWlmIChkYXRhLT5mbGFncyAmIE1NQ19EQVRBX1JFQUQpIHsKIAkJaWYgKGhvc3QtPmNoYW5fcngpCi0JCQlyZXR1cm4gdG1pb19tbWNfc3RhcnRfZG1hX3J4KGhvc3QpOworCQkJdG1pb19tbWNfc3RhcnRfZG1hX3J4KGhvc3QpOwogCX0gZWxzZSB7CiAJCWlmIChob3N0LT5jaGFuX3R4KQotCQkJcmV0dXJuIHRtaW9fbW1jX3N0YXJ0X2RtYV90eChob3N0KTsKKwkJCXRtaW9fbW1jX3N0YXJ0X2RtYV90eChob3N0KTsKIAl9Ci0KLQlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgdG1pb19pc3N1ZV90YXNrbGV0X2ZuKHVuc2lnbmVkIGxvbmcgcHJpdikKQEAgLTU2Miw2ICs5NzAsMTIgQEAKIHN0YXRpYyB2b2lkIHRtaW9fdGFza2xldF9mbih1bnNpZ25lZCBsb25nIGFyZykKIHsKIAlzdHJ1Y3QgdG1pb19tbWNfaG9zdCAqaG9zdCA9IChzdHJ1Y3QgdG1pb19tbWNfaG9zdCAqKWFyZzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmhvc3QtPmxvY2ssIGZsYWdzKTsKKworCWlmICghaG9zdC0+ZGF0YSkKKwkJZ290byBvdXQ7CiAKIAlpZiAoaG9zdC0+ZGF0YS0+ZmxhZ3MgJiBNTUNfREFUQV9SRUFEKQogCQlkbWFfdW5tYXBfc2coJmhvc3QtPnBkZXYtPmRldiwgaG9zdC0+c2dfcHRyLCBob3N0LT5kbWFfc2dsZW4sCkBAIC01NzEsNiArOTg1LDggQEAKIAkJCSAgICAgRE1BX1RPX0RFVklDRSk7CiAKIAl0bWlvX21tY19kb19kYXRhX2lycShob3N0KTsKK291dDoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZob3N0LT5sb2NrLCBmbGFncyk7CiB9CiAKIC8qIEl0IG1pZ2h0IGJlIG5lY2Vzc2FyeSB0byBtYWtlIGZpbHRlciBNRkQgc3BlY2lmaWMgKi8KQEAgLTU4NCw5ICsxMDAwLDYgQEAKIHN0YXRpYyB2b2lkIHRtaW9fbW1jX3JlcXVlc3RfZG1hKHN0cnVjdCB0bWlvX21tY19ob3N0ICpob3N0LAogCQkJCSBzdHJ1Y3QgdG1pb19tbWNfZGF0YSAqcGRhdGEpCiB7Ci0JaG9zdC0+Y29va2llID0gLUVJTlZBTDsKLQlob3N0LT5kZXNjID0gTlVMTDsKLQogCS8qIFdlIGNhbiBvbmx5IGVpdGhlciB1c2UgRE1BIGZvciBib3RoIFR4IGFuZCBSeCBvciBub3QgdXNlIGl0IGF0IGFsbCAqLwogCWlmIChwZGF0YS0+ZG1hKSB7CiAJCWRtYV9jYXBfbWFza190IG1hc2s7CkBAIC02MzIsMTUgKzEwNDUsMTUgQEAKIAkJaG9zdC0+Y2hhbl9yeCA9IE5VTEw7CiAJCWRtYV9yZWxlYXNlX2NoYW5uZWwoY2hhbik7CiAJfQotCi0JaG9zdC0+Y29va2llID0gLUVJTlZBTDsKLQlob3N0LT5kZXNjID0gTlVMTDsKIH0KICNlbHNlCi1zdGF0aWMgaW50IHRtaW9fbW1jX3N0YXJ0X2RtYShzdHJ1Y3QgdG1pb19tbWNfaG9zdCAqaG9zdCwKK3N0YXRpYyB2b2lkIHRtaW9fY2hlY2tfYm91bmNlX2J1ZmZlcihzdHJ1Y3QgdG1pb19tbWNfaG9zdCAqaG9zdCkKK3sKK30KKworc3RhdGljIHZvaWQgdG1pb19tbWNfc3RhcnRfZG1hKHN0cnVjdCB0bWlvX21tY19ob3N0ICpob3N0LAogCQkJICAgICAgIHN0cnVjdCBtbWNfZGF0YSAqZGF0YSkKIHsKLQlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgdG1pb19tbWNfcmVxdWVzdF9kbWEoc3RydWN0IHRtaW9fbW1jX2hvc3QgKmhvc3QsCkBAIC02ODIsNyArMTA5NSw5IEBACiAJc2RfY3RybF93cml0ZTE2KGhvc3QsIENUTF9TRF9YRkVSX0xFTiwgZGF0YS0+Ymxrc3opOwogCXNkX2N0cmxfd3JpdGUxNihob3N0LCBDVExfWEZFUl9CTEtfQ09VTlQsIGRhdGEtPmJsb2Nrcyk7CiAKLQlyZXR1cm4gdG1pb19tbWNfc3RhcnRfZG1hKGhvc3QsIGRhdGEpOworCXRtaW9fbW1jX3N0YXJ0X2RtYShob3N0LCBkYXRhKTsKKworCXJldHVybiAwOwogfQogCiAvKiBQcm9jZXNzIHJlcXVlc3RzIGZyb20gdGhlIE1NQyBsYXllciAqLwpAQCAtNjk0LDYgKzExMDksOCBAQAogCWlmIChob3N0LT5tcnEpCiAJCXByX2RlYnVnKCJyZXF1ZXN0IG5vdCBudWxsXG4iKTsKIAorCWhvc3QtPmxhc3RfcmVxX3RzID0gamlmZmllczsKKwl3bWIoKTsKIAlob3N0LT5tcnEgPSBtcnE7CiAKIAlpZiAobXJxLT5kYXRhKSB7CkBAIC03MDMsMTAgKzExMjAsMTQgQEAKIAl9CiAKIAlyZXQgPSB0bWlvX21tY19zdGFydF9jb21tYW5kKGhvc3QsIG1ycS0+Y21kKTsKLQlpZiAoIXJldCkKKwlpZiAoIXJldCkgeworCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmhvc3QtPmRlbGF5ZWRfcmVzZXRfd29yaywKKwkJCQkgICAgICBtc2Vjc190b19qaWZmaWVzKDIwMDApKTsKIAkJcmV0dXJuOworCX0KIAogZmFpbDoKKwlob3N0LT5tcnEgPSBOVUxMOwogCW1ycS0+Y21kLT5lcnJvciA9IHJldDsKIAltbWNfcmVxdWVzdF9kb25lKG1tYywgbXJxKTsKIH0KQEAgLTc4MCw2ICsxMjAxLDcgQEAKIAkuc2V0X2lvcwk9IHRtaW9fbW1jX3NldF9pb3MsCiAJLmdldF9ybyAgICAgICAgID0gdG1pb19tbWNfZ2V0X3JvLAogCS5nZXRfY2QJCT0gdG1pb19tbWNfZ2V0X2NkLAorCS5lbmFibGVfc2Rpb19pcnEgPSB0bWlvX21tY19lbmFibGVfc2Rpb19pcnEsCiB9OwogCiAjaWZkZWYgQ09ORklHX1BNCkBAIC04NjQsMTAgKzEyODYsMTUgQEAKIAkJZ290byBob3N0X2ZyZWU7CiAKIAltbWMtPm9wcyA9ICZ0bWlvX21tY19vcHM7Ci0JbW1jLT5jYXBzID0gTU1DX0NBUF80X0JJVF9EQVRBOwotCW1tYy0+Y2FwcyB8PSBwZGF0YS0+Y2FwYWJpbGl0aWVzOworCW1tYy0+Y2FwcyA9IE1NQ19DQVBfNF9CSVRfREFUQSB8IHBkYXRhLT5jYXBhYmlsaXRpZXM7CiAJbW1jLT5mX21heCA9IHBkYXRhLT5oY2xrOwogCW1tYy0+Zl9taW4gPSBtbWMtPmZfbWF4IC8gNTEyOworCW1tYy0+bWF4X3NlZ3MgPSAzMjsKKwltbWMtPm1heF9ibGtfc2l6ZSA9IDUxMjsKKwltbWMtPm1heF9ibGtfY291bnQgPSAoUEFHRV9DQUNIRV9TSVpFIC8gbW1jLT5tYXhfYmxrX3NpemUpICoKKwkJbW1jLT5tYXhfc2VnczsKKwltbWMtPm1heF9yZXFfc2l6ZSA9IG1tYy0+bWF4X2Jsa19zaXplICogbW1jLT5tYXhfYmxrX2NvdW50OworCW1tYy0+bWF4X3NlZ19zaXplID0gbW1jLT5tYXhfcmVxX3NpemU7CiAJaWYgKHBkYXRhLT5vY3JfbWFzaykKIAkJbW1jLT5vY3JfYXZhaWwgPSBwZGF0YS0+b2NyX21hc2s7CiAJZWxzZQpAQCAtODkwLDEyICsxMzE3LDE5IEBACiAJCWdvdG8gY2VsbF9kaXNhYmxlOwogCiAJZGlzYWJsZV9tbWNfaXJxcyhob3N0LCBUTUlPX01BU0tfQUxMKTsKKwlpZiAocGRhdGEtPmZsYWdzICYgVE1JT19NTUNfU0RJT19JUlEpCisJCXRtaW9fbW1jX2VuYWJsZV9zZGlvX2lycShtbWMsIDApOwogCiAJcmV0ID0gcmVxdWVzdF9pcnEoaG9zdC0+aXJxLCB0bWlvX21tY19pcnEsIElSUUZfRElTQUJMRUQgfAogCQlJUlFGX1RSSUdHRVJfRkFMTElORywgZGV2X25hbWUoJmRldi0+ZGV2KSwgaG9zdCk7CiAJaWYgKHJldCkKIAkJZ290byBjZWxsX2Rpc2FibGU7CiAKKwlzcGluX2xvY2tfaW5pdCgmaG9zdC0+bG9jayk7CisKKwkvKiBJbml0IGRlbGF5ZWQgd29yayBmb3IgcmVxdWVzdCB0aW1lb3V0cyAqLworCUlOSVRfREVMQVlFRF9XT1JLKCZob3N0LT5kZWxheWVkX3Jlc2V0X3dvcmssIHRtaW9fbW1jX3Jlc2V0X3dvcmspOworCiAJLyogU2VlIGlmIHdlIGFsc28gZ2V0IERNQSAqLwogCXRtaW9fbW1jX3JlcXVlc3RfZG1hKGhvc3QsIHBkYXRhKTsKIApAQCAtOTM0LDYgKzEzNjgsNyBAQAogCWlmIChtbWMpIHsKIAkJc3RydWN0IHRtaW9fbW1jX2hvc3QgKmhvc3QgPSBtbWNfcHJpdihtbWMpOwogCQltbWNfcmVtb3ZlX2hvc3QobW1jKTsKKwkJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZob3N0LT5kZWxheWVkX3Jlc2V0X3dvcmspOwogCQl0bWlvX21tY19yZWxlYXNlX2RtYShob3N0KTsKIAkJZnJlZV9pcnEoaG9zdC0+aXJxLCBob3N0KTsKIAkJaWYgKGNlbGwtPmRpc2FibGUpCmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9ob3N0L3RtaW9fbW1jLmggYi9kcml2ZXJzL21tYy9ob3N0L3RtaW9fbW1jLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmZWRjNzguLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9tbWMvaG9zdC90bWlvX21tYy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjI4ICswLDAgQEAKLS8qIERlZmluaXRvbnMgZm9yIHVzZSB3aXRoIHRoZSB0bWlvX21tYy5jCi0gKgotICogKGMpIDIwMDQgSWFuIE1vbHRvbiA8c3B5cm9AZjJzLmNvbT4KLSAqIChjKSAyMDA3IElhbiBNb2x0b24gPHNweXJvQGYycy5jb20+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9kbWFlbmdpbmUuaD4KLQotI2RlZmluZSBDVExfU0RfQ01EIDB4MDAKLSNkZWZpbmUgQ1RMX0FSR19SRUcgMHgwNAotI2RlZmluZSBDVExfU1RPUF9JTlRFUk5BTF9BQ1RJT04gMHgwOAotI2RlZmluZSBDVExfWEZFUl9CTEtfQ09VTlQgMHhhCi0jZGVmaW5lIENUTF9SRVNQT05TRSAweDBjCi0jZGVmaW5lIENUTF9TVEFUVVMgMHgxYwotI2RlZmluZSBDVExfSVJRX01BU0sgMHgyMAotI2RlZmluZSBDVExfU0RfQ0FSRF9DTEtfQ1RMIDB4MjQKLSNkZWZpbmUgQ1RMX1NEX1hGRVJfTEVOIDB4MjYKLSNkZWZpbmUgQ1RMX1NEX01FTV9DQVJEX09QVCAweDI4Ci0jZGVmaW5lIENUTF9TRF9FUlJPUl9ERVRBSUxfU1RBVFVTIDB4MmMKLSNkZWZpbmUgQ1RMX1NEX0RBVEFfUE9SVCAweDMwCi0jZGVmaW5lIENUTF9UUkFOU0FDVElPTl9DVEwgMHgzNAotI2RlZmluZSBDVExfUkVTRVRfU0QgMHhlMAotI2RlZmluZSBDVExfU0RJT19SRUdTIDB4MTAwCi0jZGVmaW5lIENUTF9DTEtfQU5EX1dBSVRfQ1RMIDB4MTM4Ci0jZGVmaW5lIENUTF9SRVNFVF9TRElPIDB4MWUwCi0KLS8qIERlZmluaXRpb25zIGZvciB2YWx1ZXMgdGhlIENUUkxfU1RBVFVTIHJlZ2lzdGVyIGNhbiB0YWtlLiAqLwotI2RlZmluZSBUTUlPX1NUQVRfQ01EUkVTUEVORCAgICAweDAwMDAwMDAxCi0jZGVmaW5lIFRNSU9fU1RBVF9EQVRBRU5EICAgICAgIDB4MDAwMDAwMDQKLSNkZWZpbmUgVE1JT19TVEFUX0NBUkRfUkVNT1ZFICAgMHgwMDAwMDAwOAotI2RlZmluZSBUTUlPX1NUQVRfQ0FSRF9JTlNFUlQgICAweDAwMDAwMDEwCi0jZGVmaW5lIFRNSU9fU1RBVF9TSUdTVEFURSAgICAgIDB4MDAwMDAwMjAKLSNkZWZpbmUgVE1JT19TVEFUX1dSUFJPVEVDVCAgICAgMHgwMDAwMDA4MAotI2RlZmluZSBUTUlPX1NUQVRfQ0FSRF9SRU1PVkVfQSAweDAwMDAwMTAwCi0jZGVmaW5lIFRNSU9fU1RBVF9DQVJEX0lOU0VSVF9BIDB4MDAwMDAyMDAKLSNkZWZpbmUgVE1JT19TVEFUX1NJR1NUQVRFX0EgICAgMHgwMDAwMDQwMAotI2RlZmluZSBUTUlPX1NUQVRfQ01EX0lEWF9FUlIgICAweDAwMDEwMDAwCi0jZGVmaW5lIFRNSU9fU1RBVF9DUkNGQUlMICAgICAgIDB4MDAwMjAwMDAKLSNkZWZpbmUgVE1JT19TVEFUX1NUT1BCSVRfRVJSICAgMHgwMDA0MDAwMAotI2RlZmluZSBUTUlPX1NUQVRfREFUQVRJTUVPVVQgICAweDAwMDgwMDAwCi0jZGVmaW5lIFRNSU9fU1RBVF9SWE9WRVJGTE9XICAgIDB4MDAxMDAwMDAKLSNkZWZpbmUgVE1JT19TVEFUX1RYVU5ERVJSVU4gICAgMHgwMDIwMDAwMAotI2RlZmluZSBUTUlPX1NUQVRfQ01EVElNRU9VVCAgICAweDAwNDAwMDAwCi0jZGVmaW5lIFRNSU9fU1RBVF9SWFJEWSAgICAgICAgIDB4MDEwMDAwMDAKLSNkZWZpbmUgVE1JT19TVEFUX1RYUlEgICAgICAgICAgMHgwMjAwMDAwMAotI2RlZmluZSBUTUlPX1NUQVRfSUxMX0ZVTkMgICAgICAweDIwMDAwMDAwCi0jZGVmaW5lIFRNSU9fU1RBVF9DTURfQlVTWSAgICAgIDB4NDAwMDAwMDAKLSNkZWZpbmUgVE1JT19TVEFUX0lMTF9BQ0NFU1MgICAgMHg4MDAwMDAwMAotCi0vKiBEZWZpbmUgc29tZSBJUlEgbWFza3MgKi8KLS8qIFRoaXMgaXMgdGhlIG1hc2sgdXNlZCBhdCByZXNldCBieSB0aGUgY2hpcCAqLwotI2RlZmluZSBUTUlPX01BU0tfQUxMICAgICAgICAgICAweDgzN2YwMzFkCi0jZGVmaW5lIFRNSU9fTUFTS19SRUFET1AgIChUTUlPX1NUQVRfUlhSRFkgfCBUTUlPX1NUQVRfREFUQUVORCkKLSNkZWZpbmUgVE1JT19NQVNLX1dSSVRFT1AgKFRNSU9fU1RBVF9UWFJRIHwgVE1JT19TVEFUX0RBVEFFTkQpCi0jZGVmaW5lIFRNSU9fTUFTS19DTUQgICAgIChUTUlPX1NUQVRfQ01EUkVTUEVORCB8IFRNSU9fU1RBVF9DTURUSU1FT1VUIHwgXAotCQlUTUlPX1NUQVRfQ0FSRF9SRU1PVkUgfCBUTUlPX1NUQVRfQ0FSRF9JTlNFUlQpCi0jZGVmaW5lIFRNSU9fTUFTS19JUlEgICAgIChUTUlPX01BU0tfUkVBRE9QIHwgVE1JT19NQVNLX1dSSVRFT1AgfCBUTUlPX01BU0tfQ01EKQotCi0KLSNkZWZpbmUgZW5hYmxlX21tY19pcnFzKGhvc3QsIGkpIFwKLQlkbyB7IFwKLQkJdTMyIG1hc2s7XAotCQltYXNrICA9IHNkX2N0cmxfcmVhZDMyKChob3N0KSwgQ1RMX0lSUV9NQVNLKTsgXAotCQltYXNrICY9IH4oKGkpICYgVE1JT19NQVNLX0lSUSk7IFwKLQkJc2RfY3RybF93cml0ZTMyKChob3N0KSwgQ1RMX0lSUV9NQVNLLCBtYXNrKTsgXAotCX0gd2hpbGUgKDApCi0KLSNkZWZpbmUgZGlzYWJsZV9tbWNfaXJxcyhob3N0LCBpKSBcCi0JZG8geyBcCi0JCXUzMiBtYXNrO1wKLQkJbWFzayAgPSBzZF9jdHJsX3JlYWQzMigoaG9zdCksIENUTF9JUlFfTUFTSyk7IFwKLQkJbWFzayB8PSAoKGkpICYgVE1JT19NQVNLX0lSUSk7IFwKLQkJc2RfY3RybF93cml0ZTMyKChob3N0KSwgQ1RMX0lSUV9NQVNLLCBtYXNrKTsgXAotCX0gd2hpbGUgKDApCi0KLSNkZWZpbmUgYWNrX21tY19pcnFzKGhvc3QsIGkpIFwKLQlkbyB7IFwKLQkJc2RfY3RybF93cml0ZTMyKChob3N0KSwgQ1RMX1NUQVRVUywgfihpKSk7IFwKLQl9IHdoaWxlICgwKQotCi0KLXN0cnVjdCB0bWlvX21tY19ob3N0IHsKLQl2b2lkIF9faW9tZW0gKmN0bDsKLQl1bnNpZ25lZCBsb25nIGJ1c19zaGlmdDsKLQlzdHJ1Y3QgbW1jX2NvbW1hbmQgICAgICAqY21kOwotCXN0cnVjdCBtbWNfcmVxdWVzdCAgICAgICptcnE7Ci0Jc3RydWN0IG1tY19kYXRhICAgICAgICAgKmRhdGE7Ci0Jc3RydWN0IG1tY19ob3N0ICAgICAgICAgKm1tYzsKLQlpbnQgICAgICAgICAgICAgICAgICAgICBpcnE7Ci0KLQkvKiBDYWxsYmFja3MgZm9yIGNsb2NrIC8gcG93ZXIgY29udHJvbCAqLwotCXZvaWQgKCpzZXRfcHdyKShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpob3N0LCBpbnQgc3RhdGUpOwotCXZvaWQgKCpzZXRfY2xrX2Rpdikoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqaG9zdCwgaW50IHN0YXRlKTsKLQotCS8qIHBpbyByZWxhdGVkIHN0dWZmICovCi0Jc3RydWN0IHNjYXR0ZXJsaXN0ICAgICAgKnNnX3B0cjsKLQl1bnNpZ25lZCBpbnQgICAgICAgICAgICBzZ19sZW47Ci0JdW5zaWduZWQgaW50ICAgICAgICAgICAgc2dfb2ZmOwotCi0Jc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldjsKLQotCS8qIERNQSBzdXBwb3J0ICovCi0Jc3RydWN0IGRtYV9jaGFuCQkqY2hhbl9yeDsKLQlzdHJ1Y3QgZG1hX2NoYW4JCSpjaGFuX3R4OwotCXN0cnVjdCB0YXNrbGV0X3N0cnVjdAlkbWFfY29tcGxldGU7Ci0Jc3RydWN0IHRhc2tsZXRfc3RydWN0CWRtYV9pc3N1ZTsKLSNpZmRlZiBDT05GSUdfVE1JT19NTUNfRE1BCi0Jc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICpkZXNjOwotCXVuc2lnbmVkIGludCAgICAgICAgICAgIGRtYV9zZ2xlbjsKLQlkbWFfY29va2llX3QJCWNvb2tpZTsKLSNlbmRpZgotfTsKLQotI2luY2x1ZGUgPGxpbnV4L2lvLmg+Ci0KLXN0YXRpYyBpbmxpbmUgdTE2IHNkX2N0cmxfcmVhZDE2KHN0cnVjdCB0bWlvX21tY19ob3N0ICpob3N0LCBpbnQgYWRkcikKLXsKLQlyZXR1cm4gcmVhZHcoaG9zdC0+Y3RsICsgKGFkZHIgPDwgaG9zdC0+YnVzX3NoaWZ0KSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBzZF9jdHJsX3JlYWQxNl9yZXAoc3RydWN0IHRtaW9fbW1jX2hvc3QgKmhvc3QsIGludCBhZGRyLAotCQl1MTYgKmJ1ZiwgaW50IGNvdW50KQotewotCXJlYWRzdyhob3N0LT5jdGwgKyAoYWRkciA8PCBob3N0LT5idXNfc2hpZnQpLCBidWYsIGNvdW50KTsKLX0KLQotc3RhdGljIGlubGluZSB1MzIgc2RfY3RybF9yZWFkMzIoc3RydWN0IHRtaW9fbW1jX2hvc3QgKmhvc3QsIGludCBhZGRyKQotewotCXJldHVybiByZWFkdyhob3N0LT5jdGwgKyAoYWRkciA8PCBob3N0LT5idXNfc2hpZnQpKSB8Ci0JICAgICAgIHJlYWR3KGhvc3QtPmN0bCArICgoYWRkciArIDIpIDw8IGhvc3QtPmJ1c19zaGlmdCkpIDw8IDE2OwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgc2RfY3RybF93cml0ZTE2KHN0cnVjdCB0bWlvX21tY19ob3N0ICpob3N0LCBpbnQgYWRkciwKLQkJdTE2IHZhbCkKLXsKLQl3cml0ZXcodmFsLCBob3N0LT5jdGwgKyAoYWRkciA8PCBob3N0LT5idXNfc2hpZnQpKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHNkX2N0cmxfd3JpdGUxNl9yZXAoc3RydWN0IHRtaW9fbW1jX2hvc3QgKmhvc3QsIGludCBhZGRyLAotCQl1MTYgKmJ1ZiwgaW50IGNvdW50KQotewotCXdyaXRlc3coaG9zdC0+Y3RsICsgKGFkZHIgPDwgaG9zdC0+YnVzX3NoaWZ0KSwgYnVmLCBjb3VudCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBzZF9jdHJsX3dyaXRlMzIoc3RydWN0IHRtaW9fbW1jX2hvc3QgKmhvc3QsIGludCBhZGRyLAotCQl1MzIgdmFsKQotewotCXdyaXRldyh2YWwsIGhvc3QtPmN0bCArIChhZGRyIDw8IGhvc3QtPmJ1c19zaGlmdCkpOwotCXdyaXRldyh2YWwgPj4gMTYsIGhvc3QtPmN0bCArICgoYWRkciArIDIpIDw8IGhvc3QtPmJ1c19zaGlmdCkpOwotfQotCi0jaW5jbHVkZSA8bGludXgvc2NhdHRlcmxpc3QuaD4KLSNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KLQotc3RhdGljIGlubGluZSB2b2lkIHRtaW9fbW1jX2luaXRfc2coc3RydWN0IHRtaW9fbW1jX2hvc3QgKmhvc3QsCi0Jc3RydWN0IG1tY19kYXRhICpkYXRhKQotewotCWhvc3QtPnNnX2xlbiA9IGRhdGEtPnNnX2xlbjsKLQlob3N0LT5zZ19wdHIgPSBkYXRhLT5zZzsKLQlob3N0LT5zZ19vZmYgPSAwOwotfQotCi1zdGF0aWMgaW5saW5lIGludCB0bWlvX21tY19uZXh0X3NnKHN0cnVjdCB0bWlvX21tY19ob3N0ICpob3N0KQotewotCWhvc3QtPnNnX3B0ciA9IHNnX25leHQoaG9zdC0+c2dfcHRyKTsKLQlob3N0LT5zZ19vZmYgPSAwOwotCXJldHVybiAtLWhvc3QtPnNnX2xlbjsKLX0KLQotc3RhdGljIGlubGluZSBjaGFyICp0bWlvX21tY19rbWFwX2F0b21pYyhzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLAotCXVuc2lnbmVkIGxvbmcgKmZsYWdzKQotewotCWxvY2FsX2lycV9zYXZlKCpmbGFncyk7Ci0JcmV0dXJuIGttYXBfYXRvbWljKHNnX3BhZ2Uoc2cpLCBLTV9CSU9fU1JDX0lSUSkgKyBzZy0+b2Zmc2V0OwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgdG1pb19tbWNfa3VubWFwX2F0b21pYyh2b2lkICp2aXJ0LAotCXVuc2lnbmVkIGxvbmcgKmZsYWdzKQotewotCWt1bm1hcF9hdG9taWModmlydCwgS01fQklPX1NSQ19JUlEpOwotCWxvY2FsX2lycV9yZXN0b3JlKCpmbGFncyk7Ci19Ci0KLSNpZmRlZiBDT05GSUdfTU1DX0RFQlVHCi0KLSNkZWZpbmUgU1RBVFVTX1RPX1RFWFQoYSkgXAotCWRvIHsgXAotCQlpZiAoc3RhdHVzICYgVE1JT19TVEFUXyMjYSkgXAotCQkJcHJpbnRrKCNhKTsgXAotCX0gd2hpbGUgKDApCi0KLXZvaWQgcHJfZGVidWdfc3RhdHVzKHUzMiBzdGF0dXMpCi17Ci0JcHJpbnRrKEtFUk5fREVCVUcgInN0YXR1czogJTA4eCA9ICIsIHN0YXR1cyk7Ci0JU1RBVFVTX1RPX1RFWFQoQ0FSRF9SRU1PVkUpOwotCVNUQVRVU19UT19URVhUKENBUkRfSU5TRVJUKTsKLQlTVEFUVVNfVE9fVEVYVChTSUdTVEFURSk7Ci0JU1RBVFVTX1RPX1RFWFQoV1JQUk9URUNUKTsKLQlTVEFUVVNfVE9fVEVYVChDQVJEX1JFTU9WRV9BKTsKLQlTVEFUVVNfVE9fVEVYVChDQVJEX0lOU0VSVF9BKTsKLQlTVEFUVVNfVE9fVEVYVChTSUdTVEFURV9BKTsKLQlTVEFUVVNfVE9fVEVYVChDTURfSURYX0VSUik7Ci0JU1RBVFVTX1RPX1RFWFQoU1RPUEJJVF9FUlIpOwotCVNUQVRVU19UT19URVhUKElMTF9GVU5DKTsKLQlTVEFUVVNfVE9fVEVYVChDTURfQlVTWSk7Ci0JU1RBVFVTX1RPX1RFWFQoQ01EUkVTUEVORCk7Ci0JU1RBVFVTX1RPX1RFWFQoREFUQUVORCk7Ci0JU1RBVFVTX1RPX1RFWFQoQ1JDRkFJTCk7Ci0JU1RBVFVTX1RPX1RFWFQoREFUQVRJTUVPVVQpOwotCVNUQVRVU19UT19URVhUKENNRFRJTUVPVVQpOwotCVNUQVRVU19UT19URVhUKFJYT1ZFUkZMT1cpOwotCVNUQVRVU19UT19URVhUKFRYVU5ERVJSVU4pOwotCVNUQVRVU19UT19URVhUKFJYUkRZKTsKLQlTVEFUVVNfVE9fVEVYVChUWFJRKTsKLQlTVEFUVVNfVE9fVEVYVChJTExfQUNDRVNTKTsKLQlwcmludGsoIlxuIik7Ci19Ci0KLSNlbHNlCi0jZGVmaW5lIHByX2RlYnVnX3N0YXR1cyhzKSAgZG8geyB9IHdoaWxlICgwKQotI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9LY29uZmlnIGIvZHJpdmVycy9tdGQvS2NvbmZpZwppbmRleCAxZTJjYmY1Li5iMWY3Njg5IDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9LY29uZmlnCisrKyBiL2RyaXZlcnMvbXRkL0tjb25maWcKQEAgLTE1OSw3ICsxNTksNyBAQAogCiBjb25maWcgTVREX09GX1BBUlRTCiAJdHJpc3RhdGUgIkZsYXNoIHBhcnRpdGlvbiBtYXAgYmFzZWQgb24gT0YgZGVzY3JpcHRpb24iCi0JZGVwZW5kcyBvbiAoTUlDUk9CTEFaRSB8fCBQUENfT0YpICYmIE1URF9QQVJUSVRJT05TCisJZGVwZW5kcyBvbiBPRiAmJiBNVERfUEFSVElUSU9OUwogCWhlbHAKIAkgIFRoaXMgcHJvdmlkZXMgYSBwYXJ0aXRpb24gcGFyc2luZyBmdW5jdGlvbiB3aGljaCBkZXJpdmVzCiAJICB0aGUgcGFydGl0aW9uIG1hcCBmcm9tIHRoZSBjaGlsZHJlbiBvZiB0aGUgZmxhc2ggbm9kZSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL21hcHMvS2NvbmZpZyBiL2RyaXZlcnMvbXRkL21hcHMvS2NvbmZpZwppbmRleCBhMGRkN2JiLi41ZDM3ZDMxIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9tYXBzL0tjb25maWcKKysrIGIvZHJpdmVycy9tdGQvbWFwcy9LY29uZmlnCkBAIC03Miw3ICs3Miw3IEBACiAKIGNvbmZpZyBNVERfUEhZU01BUF9PRgogCXRyaXN0YXRlICJGbGFzaCBkZXZpY2UgaW4gcGh5c2ljYWwgbWVtb3J5IG1hcCBiYXNlZCBvbiBPRiBkZXNjcmlwdGlvbiIKLQlkZXBlbmRzIG9uIChNSUNST0JMQVpFIHx8IFBQQ19PRikgJiYgKE1URF9DRkkgfHwgTVREX0pFREVDUFJPQkUgfHwgTVREX1JPTSkKKwlkZXBlbmRzIG9uIE9GICYmIChNVERfQ0ZJIHx8IE1URF9KRURFQ1BST0JFIHx8IE1URF9ST00pCiAJaGVscAogCSAgVGhpcyBwcm92aWRlcyBhICdtYXBwaW5nJyBkcml2ZXIgd2hpY2ggYWxsb3dzIHRoZSBOT1IgRmxhc2ggYW5kCiAJICBST00gZHJpdmVyIGNvZGUgdG8gY29tbXVuaWNhdGUgd2l0aCBjaGlwcyB3aGljaCBhcmUgbWFwcGVkCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ib25kaW5nL2JvbmRpbmcuaCBiL2RyaXZlcnMvbmV0L2JvbmRpbmcvYm9uZGluZy5oCmluZGV4IDRkYTM4NGMuLjMxZmU5ODAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2JvbmRpbmcvYm9uZGluZy5oCisrKyBiL2RyaXZlcnMvbmV0L2JvbmRpbmcvYm9uZGluZy5oCkBAIC0xOCw3ICsxOCw2IEBACiAjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KICNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvaWZfYm9uZGluZy5oPgotI2luY2x1ZGUgPGxpbnV4L2tvYmplY3QuaD4KICNpbmNsdWRlIDxsaW51eC9jcHVtYXNrLmg+CiAjaW5jbHVkZSA8bGludXgvaW42Lmg+CiAjaW5jbHVkZSAiYm9uZF8zYWQuaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2ZzX2VuZXQvZnNfZW5ldC1tYWluLmMgYi9kcml2ZXJzL25ldC9mc19lbmV0L2ZzX2VuZXQtbWFpbi5jCmluZGV4IGQ2ODRmMTguLjdhMWYzZDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2ZzX2VuZXQvZnNfZW5ldC1tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvZnNfZW5ldC9mc19lbmV0LW1haW4uYwpAQCAtNDAsNiArNDAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L29mX21kaW8uaD4KICNpbmNsdWRlIDxsaW51eC9vZl9wbGF0Zm9ybS5oPgogI2luY2x1ZGUgPGxpbnV4L29mX2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9uZXQuaD4KIAogI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KICNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZ2lhbmZhci5jIGIvZHJpdmVycy9uZXQvZ2lhbmZhci5jCmluZGV4IDQ1YzRiN2IuLjZkZTQ2NzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2dpYW5mYXIuYworKysgYi9kcml2ZXJzL25ldC9naWFuZmFyLmMKQEAgLTk1LDYgKzk1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9waHkuaD4KICNpbmNsdWRlIDxsaW51eC9waHlfZml4ZWQuaD4KICNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L29mX25ldC5oPgogCiAjaW5jbHVkZSAiZ2lhbmZhci5oIgogI2luY2x1ZGUgImZzbF9wcV9tZGlvLmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pcmRhL2JmaW5fc2lyLmggYi9kcml2ZXJzL25ldC9pcmRhL2JmaW5fc2lyLmgKaW5kZXggYjU0YTZmMC4uZTNiMjg1YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaXJkYS9iZmluX3Npci5oCisrKyBiL2RyaXZlcnMvbmV0L2lyZGEvYmZpbl9zaXIuaApAQCAtMjYsNiArMjYsOCBAQAogI2luY2x1ZGUgPGFzbS9jYWNoZWZsdXNoLmg+CiAjaW5jbHVkZSA8YXNtL2RtYS5oPgogI2luY2x1ZGUgPGFzbS9wb3J0bXV4Lmg+CisjaW5jbHVkZSA8bWFjaC9iZmluX3NlcmlhbF81eHguaD4KKyN1bmRlZiBEUklWRVJfTkFNRQogCiAjaWZkZWYgQ09ORklHX1NJUl9CRklOX0RNQQogc3RydWN0IGRtYV9yeF9idWYgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbWx4NC9hbGxvYy5jIGIvZHJpdmVycy9uZXQvbWx4NC9hbGxvYy5jCmluZGV4IDhmNGJmMWYuLjNhNDI3N2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L21seDQvYWxsb2MuYworKysgYi9kcml2ZXJzL25ldC9tbHg0L2FsbG9jLmMKQEAgLTE3OCw2ICsxNzgsNyBAQAogCX0gZWxzZSB7CiAJCWludCBpOwogCisJCWJ1Zi0+ZGlyZWN0LmJ1ZiAgPSBOVUxMOwogCQlidWYtPm5idWZzICAgICAgID0gKHNpemUgKyBQQUdFX1NJWkUgLSAxKSAvIFBBR0VfU0laRTsKIAkJYnVmLT5ucGFnZXMgICAgICA9IGJ1Zi0+bmJ1ZnM7CiAJCWJ1Zi0+cGFnZV9zaGlmdCAgPSBQQUdFX1NISUZUOwpAQCAtMjI5LDcgKzIzMCw3IEBACiAJCWRtYV9mcmVlX2NvaGVyZW50KCZkZXYtPnBkZXYtPmRldiwgc2l6ZSwgYnVmLT5kaXJlY3QuYnVmLAogCQkJCSAgYnVmLT5kaXJlY3QubWFwKTsKIAllbHNlIHsKLQkJaWYgKEJJVFNfUEVSX0xPTkcgPT0gNjQpCisJCWlmIChCSVRTX1BFUl9MT05HID09IDY0ICYmIGJ1Zi0+ZGlyZWN0LmJ1ZikKIAkJCXZ1bm1hcChidWYtPmRpcmVjdC5idWYpOwogCiAJCWZvciAoaSA9IDA7IGkgPCBidWYtPm5idWZzOyArK2kpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9tbHg0L2Z3LmMgYi9kcml2ZXJzL25ldC9tbHg0L2Z3LmMKaW5kZXggN2E3ZTE4Yi4uNWRlMWRiOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvbWx4NC9mdy5jCisrKyBiL2RyaXZlcnMvbmV0L21seDQvZncuYwpAQCAtMjg5LDEwICsyODksOCBAQAogCQlNTFg0X0dFVChmaWVsZCwgb3V0Ym94LCBRVUVSWV9ERVZfQ0FQX0xPR19CRl9SRUdfU1pfT0ZGU0VUKTsKIAkJZGV2X2NhcC0+YmZfcmVnX3NpemUgPSAxIDw8IChmaWVsZCAmIDB4MWYpOwogCQlNTFg0X0dFVChmaWVsZCwgb3V0Ym94LCBRVUVSWV9ERVZfQ0FQX0xPR19NQVhfQkZfUkVHU19QRVJfUEFHRV9PRkZTRVQpOwotCQlpZiAoKDEgPDwgKGZpZWxkICYgMHgzZikpID4gKFBBR0VfU0laRSAvIGRldl9jYXAtPmJmX3JlZ19zaXplKSkgewotCQkJbWx4NF93YXJuKGRldiwgImZpcm13YXJlIGJ1ZzogbG9nMiAjIG9mIGJsdWUgZmxhbWUgcmVncyBpcyBpbnZhbGlkICglZCksIGZvcmNpbmcgM1xuIiwgZmllbGQgJiAweDFmKTsKKwkJaWYgKCgxIDw8IChmaWVsZCAmIDB4M2YpKSA+IChQQUdFX1NJWkUgLyBkZXZfY2FwLT5iZl9yZWdfc2l6ZSkpCiAJCQlmaWVsZCA9IDM7Ci0JCX0KIAkJZGV2X2NhcC0+YmZfcmVnc19wZXJfcGFnZSA9IDEgPDwgKGZpZWxkICYgMHgzZik7CiAJCW1seDRfZGJnKGRldiwgIkJsdWVGbGFtZSBhdmFpbGFibGUgKHJlZyBzaXplICVkLCByZWdzL3BhZ2UgJWQpXG4iLAogCQkJIGRldl9jYXAtPmJmX3JlZ19zaXplLCBkZXZfY2FwLT5iZl9yZWdzX3Blcl9wYWdlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3VjY19nZXRoLmMgYi9kcml2ZXJzL25ldC91Y2NfZ2V0aC5jCmluZGV4IGFjYmRhYjMuLjczYTNlMGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3VjY19nZXRoLmMKKysrIGIvZHJpdmVycy9uZXQvdWNjX2dldGguYwpAQCAtMjgsNiArMjgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BoeS5oPgogI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgogI2luY2x1ZGUgPGxpbnV4L29mX21kaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9uZXQuaD4KICNpbmNsdWRlIDxsaW51eC9vZl9wbGF0Zm9ybS5oPgogCiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3hpbGlueF9lbWFjbGl0ZS5jIGIvZHJpdmVycy9uZXQveGlsaW54X2VtYWNsaXRlLmMKaW5kZXggZGU2YzMwOC4uY2FkNjZjZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQveGlsaW54X2VtYWNsaXRlLmMKKysrIGIvZHJpdmVycy9uZXQveGlsaW54X2VtYWNsaXRlLmMKQEAgLTI0LDYgKzI0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9vZl9wbGF0Zm9ybS5oPgogI2luY2x1ZGUgPGxpbnV4L29mX21kaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9uZXQuaD4KICNpbmNsdWRlIDxsaW51eC9waHkuaD4KIAogI2RlZmluZSBEUklWRVJfTkFNRSAieGlsaW54X2VtYWNsaXRlIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9vZi9LY29uZmlnIGIvZHJpdmVycy9vZi9LY29uZmlnCmluZGV4IGFhNjc1ZWIuLjNjNmUxMDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvb2YvS2NvbmZpZworKysgYi9kcml2ZXJzL29mL0tjb25maWcKQEAgLTE5LDYgKzE5LDEwIEBACiAJYm9vbAogCXNlbGVjdCBEVEMKIAorY29uZmlnIE9GX0VBUkxZX0ZMQVRUUkVFCisJYm9vbAorCXNlbGVjdCBPRl9GTEFUVFJFRQorCiBjb25maWcgT0ZfUFJPTVRSRUUKIAlib29sCiAKQEAgLTQ5LDYgKzUzLDEwIEBACiAJaGVscAogCSAgT3BlbkZpcm13YXJlIEkyQyBhY2Nlc3NvcnMKIAorY29uZmlnIE9GX05FVAorCWRlcGVuZHMgb24gTkVUREVWSUNFUworCWRlZl9ib29sIHkKKwogY29uZmlnIE9GX1NQSQogCWRlZl90cmlzdGF0ZSBTUEkKIAlkZXBlbmRzIG9uIFNQSSAmJiAhU1BBUkMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvb2YvTWFrZWZpbGUgYi9kcml2ZXJzL29mL01ha2VmaWxlCmluZGV4IDc4ODgxNTUuLjNhYjIxYTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvb2YvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9vZi9NYWtlZmlsZQpAQCAtNiw1ICs2LDYgQEAKIG9iai0kKENPTkZJR19PRl9ERVZJQ0UpICs9IGRldmljZS5vIHBsYXRmb3JtLm8KIG9iai0kKENPTkZJR19PRl9HUElPKSAgICs9IGdwaW8ubwogb2JqLSQoQ09ORklHX09GX0kyQykJKz0gb2ZfaTJjLm8KK29iai0kKENPTkZJR19PRl9ORVQpCSs9IG9mX25ldC5vCiBvYmotJChDT05GSUdfT0ZfU1BJKQkrPSBvZl9zcGkubwogb2JqLSQoQ09ORklHX09GX01ESU8pCSs9IG9mX21kaW8ubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9vZi9hZGRyZXNzLmMgYi9kcml2ZXJzL29mL2FkZHJlc3MuYwppbmRleCAzYTFjN2U3Li5iNDU1OWM1IDEwMDY0NAotLS0gYS9kcml2ZXJzL29mL2FkZHJlc3MuYworKysgYi9kcml2ZXJzL29mL2FkZHJlc3MuYwpAQCAtMTIsMTMgKzEyLDEzIEBACiAJCQkobnMpID4gMCkKIAogc3RhdGljIHN0cnVjdCBvZl9idXMgKm9mX21hdGNoX2J1cyhzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKTsKLXN0YXRpYyBpbnQgX19vZl9hZGRyZXNzX3RvX3Jlc291cmNlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZGV2LCBjb25zdCB1MzIgKmFkZHJwLAotCQkJCSAgICB1NjQgc2l6ZSwgdW5zaWduZWQgaW50IGZsYWdzLAorc3RhdGljIGludCBfX29mX2FkZHJlc3NfdG9fcmVzb3VyY2Uoc3RydWN0IGRldmljZV9ub2RlICpkZXYsCisJCWNvbnN0IF9fYmUzMiAqYWRkcnAsIHU2NCBzaXplLCB1bnNpZ25lZCBpbnQgZmxhZ3MsCiAJCQkJICAgIHN0cnVjdCByZXNvdXJjZSAqcik7CiAKIC8qIERlYnVnIHV0aWxpdHkgKi8KICNpZmRlZiBERUJVRwotc3RhdGljIHZvaWQgb2ZfZHVtcF9hZGRyKGNvbnN0IGNoYXIgKnMsIGNvbnN0IHUzMiAqYWRkciwgaW50IG5hKQorc3RhdGljIHZvaWQgb2ZfZHVtcF9hZGRyKGNvbnN0IGNoYXIgKnMsIGNvbnN0IF9fYmUzMiAqYWRkciwgaW50IG5hKQogewogCXByaW50ayhLRVJOX0RFQlVHICIlcyIsIHMpOwogCXdoaWxlIChuYS0tKQpAQCAtMjYsNyArMjYsNyBAQAogCXByaW50aygiXG4iKTsKIH0KICNlbHNlCi1zdGF0aWMgdm9pZCBvZl9kdW1wX2FkZHIoY29uc3QgY2hhciAqcywgY29uc3QgdTMyICphZGRyLCBpbnQgbmEpIHsgfQorc3RhdGljIHZvaWQgb2ZfZHVtcF9hZGRyKGNvbnN0IGNoYXIgKnMsIGNvbnN0IF9fYmUzMiAqYWRkciwgaW50IG5hKSB7IH0KICNlbmRpZgogCiAvKiBDYWxsYmFja3MgZm9yIGJ1cyBzcGVjaWZpYyB0cmFuc2xhdG9ycyAqLwpAQCAtMzYsMTAgKzM2LDEwIEBACiAJaW50CQkoKm1hdGNoKShzdHJ1Y3QgZGV2aWNlX25vZGUgKnBhcmVudCk7CiAJdm9pZAkJKCpjb3VudF9jZWxscykoc3RydWN0IGRldmljZV9ub2RlICpjaGlsZCwKIAkJCQkgICAgICAgaW50ICphZGRyYywgaW50ICpzaXplYyk7Ci0JdTY0CQkoKm1hcCkodTMyICphZGRyLCBjb25zdCB1MzIgKnJhbmdlLAorCXU2NAkJKCptYXApKHUzMiAqYWRkciwgY29uc3QgX19iZTMyICpyYW5nZSwKIAkJCQlpbnQgbmEsIGludCBucywgaW50IHBuYSk7CiAJaW50CQkoKnRyYW5zbGF0ZSkodTMyICphZGRyLCB1NjQgb2Zmc2V0LCBpbnQgbmEpOwotCXVuc2lnbmVkIGludAkoKmdldF9mbGFncykoY29uc3QgdTMyICphZGRyKTsKKwl1bnNpZ25lZCBpbnQJKCpnZXRfZmxhZ3MpKGNvbnN0IF9fYmUzMiAqYWRkcik7CiB9OwogCiAvKgpAQCAtNTUsNyArNTUsNyBAQAogCQkqc2l6ZWMgPSBvZl9uX3NpemVfY2VsbHMoZGV2KTsKIH0KIAotc3RhdGljIHU2NCBvZl9idXNfZGVmYXVsdF9tYXAodTMyICphZGRyLCBjb25zdCB1MzIgKnJhbmdlLAorc3RhdGljIHU2NCBvZl9idXNfZGVmYXVsdF9tYXAodTMyICphZGRyLCBjb25zdCBfX2JlMzIgKnJhbmdlLAogCQlpbnQgbmEsIGludCBucywgaW50IHBuYSkKIHsKIAl1NjQgY3AsIHMsIGRhOwpAQCAtODUsNyArODUsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdW5zaWduZWQgaW50IG9mX2J1c19kZWZhdWx0X2dldF9mbGFncyhjb25zdCB1MzIgKmFkZHIpCitzdGF0aWMgdW5zaWduZWQgaW50IG9mX2J1c19kZWZhdWx0X2dldF9mbGFncyhjb25zdCBfX2JlMzIgKmFkZHIpCiB7CiAJcmV0dXJuIElPUkVTT1VSQ0VfTUVNOwogfQpAQCAtMTEwLDEwICsxMTAsMTAgQEAKIAkJKnNpemVjID0gMjsKIH0KIAotc3RhdGljIHVuc2lnbmVkIGludCBvZl9idXNfcGNpX2dldF9mbGFncyhjb25zdCB1MzIgKmFkZHIpCitzdGF0aWMgdW5zaWduZWQgaW50IG9mX2J1c19wY2lfZ2V0X2ZsYWdzKGNvbnN0IF9fYmUzMiAqYWRkcikKIHsKIAl1bnNpZ25lZCBpbnQgZmxhZ3MgPSAwOwotCXUzMiB3ID0gYWRkclswXTsKKwl1MzIgdyA9IGJlMzJfdG9fY3B1cChhZGRyKTsKIAogCXN3aXRjaCgodyA+PiAyNCkgJiAweDAzKSB7CiAJY2FzZSAweDAxOgpAQCAtMTI5LDcgKzEyOSw4IEBACiAJcmV0dXJuIGZsYWdzOwogfQogCi1zdGF0aWMgdTY0IG9mX2J1c19wY2lfbWFwKHUzMiAqYWRkciwgY29uc3QgdTMyICpyYW5nZSwgaW50IG5hLCBpbnQgbnMsIGludCBwbmEpCitzdGF0aWMgdTY0IG9mX2J1c19wY2lfbWFwKHUzMiAqYWRkciwgY29uc3QgX19iZTMyICpyYW5nZSwgaW50IG5hLCBpbnQgbnMsCisJCWludCBwbmEpCiB7CiAJdTY0IGNwLCBzLCBkYTsKIAl1bnNpZ25lZCBpbnQgYWYsIHJmOwpAQCAtMTYwLDcgKzE2MSw3IEBACiAJcmV0dXJuIG9mX2J1c19kZWZhdWx0X3RyYW5zbGF0ZShhZGRyICsgMSwgb2Zmc2V0LCBuYSAtIDEpOwogfQogCi1jb25zdCB1MzIgKm9mX2dldF9wY2lfYWRkcmVzcyhzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldiwgaW50IGJhcl9ubywgdTY0ICpzaXplLAorY29uc3QgX19iZTMyICpvZl9nZXRfcGNpX2FkZHJlc3Moc3RydWN0IGRldmljZV9ub2RlICpkZXYsIGludCBiYXJfbm8sIHU2NCAqc2l6ZSwKIAkJCXVuc2lnbmVkIGludCAqZmxhZ3MpCiB7CiAJY29uc3QgX19iZTMyICpwcm9wOwpAQCAtMjA3LDcgKzIwOCw3IEBACiBpbnQgb2ZfcGNpX2FkZHJlc3NfdG9fcmVzb3VyY2Uoc3RydWN0IGRldmljZV9ub2RlICpkZXYsIGludCBiYXIsCiAJCQkgICAgICAgc3RydWN0IHJlc291cmNlICpyKQogewotCWNvbnN0IHUzMgkqYWRkcnA7CisJY29uc3QgX19iZTMyCSphZGRycDsKIAl1NjQJCXNpemU7CiAJdW5zaWduZWQgaW50CWZsYWdzOwogCkBAIC0yMzcsMTIgKzIzOCwxMyBAQAogCQkqc2l6ZWMgPSAxOwogfQogCi1zdGF0aWMgdTY0IG9mX2J1c19pc2FfbWFwKHUzMiAqYWRkciwgY29uc3QgdTMyICpyYW5nZSwgaW50IG5hLCBpbnQgbnMsIGludCBwbmEpCitzdGF0aWMgdTY0IG9mX2J1c19pc2FfbWFwKHUzMiAqYWRkciwgY29uc3QgX19iZTMyICpyYW5nZSwgaW50IG5hLCBpbnQgbnMsCisJCWludCBwbmEpCiB7CiAJdTY0IGNwLCBzLCBkYTsKIAogCS8qIENoZWNrIGFkZHJlc3MgdHlwZSBtYXRjaCAqLwotCWlmICgoYWRkclswXSBeIHJhbmdlWzBdKSAmIDB4MDAwMDAwMDEpCisJaWYgKChhZGRyWzBdIF4gcmFuZ2VbMF0pICYgY3B1X3RvX2JlMzIoMSkpCiAJCXJldHVybiBPRl9CQURfQUREUjsKIAogCS8qIFJlYWQgYWRkcmVzcyB2YWx1ZXMsIHNraXBwaW5nIGhpZ2ggY2VsbCAqLwpAQCAtMjY0LDEwICsyNjYsMTAgQEAKIAlyZXR1cm4gb2ZfYnVzX2RlZmF1bHRfdHJhbnNsYXRlKGFkZHIgKyAxLCBvZmZzZXQsIG5hIC0gMSk7CiB9CiAKLXN0YXRpYyB1bnNpZ25lZCBpbnQgb2ZfYnVzX2lzYV9nZXRfZmxhZ3MoY29uc3QgdTMyICphZGRyKQorc3RhdGljIHVuc2lnbmVkIGludCBvZl9idXNfaXNhX2dldF9mbGFncyhjb25zdCBfX2JlMzIgKmFkZHIpCiB7CiAJdW5zaWduZWQgaW50IGZsYWdzID0gMDsKLQl1MzIgdyA9IGFkZHJbMF07CisJdTMyIHcgPSBiZTMyX3RvX2NwdXAoYWRkcik7CiAKIAlpZiAodyAmIDEpCiAJCWZsYWdzIHw9IElPUkVTT1VSQ0VfSU87CkBAIC0zMzAsNyArMzMyLDcgQEAKIAkJCSAgICBzdHJ1Y3Qgb2ZfYnVzICpwYnVzLCB1MzIgKmFkZHIsCiAJCQkgICAgaW50IG5hLCBpbnQgbnMsIGludCBwbmEsIGNvbnN0IGNoYXIgKnJwcm9wKQogewotCWNvbnN0IHUzMiAqcmFuZ2VzOworCWNvbnN0IF9fYmUzMiAqcmFuZ2VzOwogCXVuc2lnbmVkIGludCBybGVuOwogCWludCByb25lOwogCXU2NCBvZmZzZXQgPSBPRl9CQURfQUREUjsKQEAgLTM5OCw3ICs0MDAsNyBAQAogICogdGhhdCBjYW4gYmUgbWFwcGVkIHRvIGEgY3B1IHBoeXNpY2FsIGFkZHJlc3MpLiBUaGlzIGlzIG5vdCByZWFsbHkgc3BlY2lmaWVkCiAgKiB0aGF0IHdheSwgYnV0IHRoaXMgaXMgdHJhZGl0aW9uYWxseSB0aGUgd2F5IElCTSBhdCBsZWFzdCBkbyB0aGluZ3MKICAqLwotdTY0IF9fb2ZfdHJhbnNsYXRlX2FkZHJlc3Moc3RydWN0IGRldmljZV9ub2RlICpkZXYsIGNvbnN0IHUzMiAqaW5fYWRkciwKK3U2NCBfX29mX3RyYW5zbGF0ZV9hZGRyZXNzKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZGV2LCBjb25zdCBfX2JlMzIgKmluX2FkZHIsCiAJCQkgICBjb25zdCBjaGFyICpycHJvcCkKIHsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKnBhcmVudCA9IE5VTEw7CkBAIC00NzUsMjIgKzQ3NywyMiBAQAogCXJldHVybiByZXN1bHQ7CiB9CiAKLXU2NCBvZl90cmFuc2xhdGVfYWRkcmVzcyhzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldiwgY29uc3QgdTMyICppbl9hZGRyKQordTY0IG9mX3RyYW5zbGF0ZV9hZGRyZXNzKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZGV2LCBjb25zdCBfX2JlMzIgKmluX2FkZHIpCiB7CiAJcmV0dXJuIF9fb2ZfdHJhbnNsYXRlX2FkZHJlc3MoZGV2LCBpbl9hZGRyLCAicmFuZ2VzIik7CiB9CiBFWFBPUlRfU1lNQk9MKG9mX3RyYW5zbGF0ZV9hZGRyZXNzKTsKIAotdTY0IG9mX3RyYW5zbGF0ZV9kbWFfYWRkcmVzcyhzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldiwgY29uc3QgdTMyICppbl9hZGRyKQordTY0IG9mX3RyYW5zbGF0ZV9kbWFfYWRkcmVzcyhzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldiwgY29uc3QgX19iZTMyICppbl9hZGRyKQogewogCXJldHVybiBfX29mX3RyYW5zbGF0ZV9hZGRyZXNzKGRldiwgaW5fYWRkciwgImRtYS1yYW5nZXMiKTsKIH0KIEVYUE9SVF9TWU1CT0wob2ZfdHJhbnNsYXRlX2RtYV9hZGRyZXNzKTsKIAotY29uc3QgdTMyICpvZl9nZXRfYWRkcmVzcyhzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldiwgaW50IGluZGV4LCB1NjQgKnNpemUsCitjb25zdCBfX2JlMzIgKm9mX2dldF9hZGRyZXNzKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZGV2LCBpbnQgaW5kZXgsIHU2NCAqc2l6ZSwKIAkJICAgIHVuc2lnbmVkIGludCAqZmxhZ3MpCiB7Ci0JY29uc3QgdTMyICpwcm9wOworCWNvbnN0IF9fYmUzMiAqcHJvcDsKIAl1bnNpZ25lZCBpbnQgcHNpemU7CiAJc3RydWN0IGRldmljZV9ub2RlICpwYXJlbnQ7CiAJc3RydWN0IG9mX2J1cyAqYnVzOwpAQCAtNTI1LDggKzUyNyw4IEBACiB9CiBFWFBPUlRfU1lNQk9MKG9mX2dldF9hZGRyZXNzKTsKIAotc3RhdGljIGludCBfX29mX2FkZHJlc3NfdG9fcmVzb3VyY2Uoc3RydWN0IGRldmljZV9ub2RlICpkZXYsIGNvbnN0IHUzMiAqYWRkcnAsCi0JCQkJICAgIHU2NCBzaXplLCB1bnNpZ25lZCBpbnQgZmxhZ3MsCitzdGF0aWMgaW50IF9fb2ZfYWRkcmVzc190b19yZXNvdXJjZShzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldiwKKwkJY29uc3QgX19iZTMyICphZGRycCwgdTY0IHNpemUsIHVuc2lnbmVkIGludCBmbGFncywKIAkJCQkgICAgc3RydWN0IHJlc291cmNlICpyKQogewogCXU2NCB0YWRkcjsKQEAgLTU2NCw3ICs1NjYsNyBAQAogaW50IG9mX2FkZHJlc3NfdG9fcmVzb3VyY2Uoc3RydWN0IGRldmljZV9ub2RlICpkZXYsIGludCBpbmRleCwKIAkJCSAgIHN0cnVjdCByZXNvdXJjZSAqcikKIHsKLQljb25zdCB1MzIJKmFkZHJwOworCWNvbnN0IF9fYmUzMgkqYWRkcnA7CiAJdTY0CQlzaXplOwogCXVuc2lnbmVkIGludAlmbGFnczsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9vZi9mZHQuYyBiL2RyaXZlcnMvb2YvZmR0LmMKaW5kZXggYzEzNjBlMC4uYzc4N2MzZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9vZi9mZHQuYworKysgYi9kcml2ZXJzL29mL2ZkdC5jCkBAIC0xMSwxMCArMTEsMTIgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXRyZC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L29mLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfZmR0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAKICNpZmRlZiBDT05GSUdfUFBDCiAjaW5jbHVkZSA8YXNtL21hY2hkZXAuaD4KQEAgLTIyLDEwNCArMjQsMTkgQEAKIAogI2luY2x1ZGUgPGFzbS9wYWdlLmg+CiAKLWludCBfX2luaXRkYXRhIGR0X3Jvb3RfYWRkcl9jZWxsczsKLWludCBfX2luaXRkYXRhIGR0X3Jvb3Rfc2l6ZV9jZWxsczsKLQotc3RydWN0IGJvb3RfcGFyYW1faGVhZGVyICppbml0aWFsX2Jvb3RfcGFyYW1zOwotCi1jaGFyICpmaW5kX2ZsYXRfZHRfc3RyaW5nKHUzMiBvZmZzZXQpCitjaGFyICpvZl9mZHRfZ2V0X3N0cmluZyhzdHJ1Y3QgYm9vdF9wYXJhbV9oZWFkZXIgKmJsb2IsIHUzMiBvZmZzZXQpCiB7Ci0JcmV0dXJuICgoY2hhciAqKWluaXRpYWxfYm9vdF9wYXJhbXMpICsKLQkJYmUzMl90b19jcHUoaW5pdGlhbF9ib290X3BhcmFtcy0+b2ZmX2R0X3N0cmluZ3MpICsgb2Zmc2V0OworCXJldHVybiAoKGNoYXIgKilibG9iKSArCisJCWJlMzJfdG9fY3B1KGJsb2ItPm9mZl9kdF9zdHJpbmdzKSArIG9mZnNldDsKIH0KIAogLyoqCi0gKiBvZl9zY2FuX2ZsYXRfZHQgLSBzY2FuIGZsYXR0ZW5lZCB0cmVlIGJsb2IgYW5kIGNhbGwgY2FsbGJhY2sgb24gZWFjaC4KLSAqIEBpdDogY2FsbGJhY2sgZnVuY3Rpb24KLSAqIEBkYXRhOiBjb250ZXh0IGRhdGEgcG9pbnRlcgotICoKLSAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBzY2FuIHRoZSBmbGF0dGVuZWQgZGV2aWNlLXRyZWUsIGl0IGlzCi0gKiB1c2VkIHRvIGV4dHJhY3QgdGhlIG1lbW9yeSBpbmZvcm1hdGlvbiBhdCBib290IGJlZm9yZSB3ZSBjYW4KLSAqIHVuZmxhdHRlbiB0aGUgdHJlZQorICogb2ZfZmR0X2dldF9wcm9wZXJ0eSAtIEdpdmVuIGEgbm9kZSBpbiB0aGUgZ2l2ZW4gZmxhdCBibG9iLCByZXR1cm4KKyAqIHRoZSBwcm9wZXJ0eSBwdHIKICAqLwotaW50IF9faW5pdCBvZl9zY2FuX2ZsYXRfZHQoaW50ICgqaXQpKHVuc2lnbmVkIGxvbmcgbm9kZSwKLQkJCQkgICAgIGNvbnN0IGNoYXIgKnVuYW1lLCBpbnQgZGVwdGgsCi0JCQkJICAgICB2b2lkICpkYXRhKSwKLQkJCSAgIHZvaWQgKmRhdGEpCi17Ci0JdW5zaWduZWQgbG9uZyBwID0gKCh1bnNpZ25lZCBsb25nKWluaXRpYWxfYm9vdF9wYXJhbXMpICsKLQkJYmUzMl90b19jcHUoaW5pdGlhbF9ib290X3BhcmFtcy0+b2ZmX2R0X3N0cnVjdCk7Ci0JaW50IHJjID0gMDsKLQlpbnQgZGVwdGggPSAtMTsKLQotCWRvIHsKLQkJdTMyIHRhZyA9IGJlMzJfdG9fY3B1cCgoX19iZTMyICopcCk7Ci0JCWNoYXIgKnBhdGhwOwotCi0JCXAgKz0gNDsKLQkJaWYgKHRhZyA9PSBPRl9EVF9FTkRfTk9ERSkgewotCQkJZGVwdGgtLTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmICh0YWcgPT0gT0ZfRFRfTk9QKQotCQkJY29udGludWU7Ci0JCWlmICh0YWcgPT0gT0ZfRFRfRU5EKQotCQkJYnJlYWs7Ci0JCWlmICh0YWcgPT0gT0ZfRFRfUFJPUCkgewotCQkJdTMyIHN6ID0gYmUzMl90b19jcHVwKChfX2JlMzIgKilwKTsKLQkJCXAgKz0gODsKLQkJCWlmIChiZTMyX3RvX2NwdShpbml0aWFsX2Jvb3RfcGFyYW1zLT52ZXJzaW9uKSA8IDB4MTApCi0JCQkJcCA9IEFMSUdOKHAsIHN6ID49IDggPyA4IDogNCk7Ci0JCQlwICs9IHN6OwotCQkJcCA9IEFMSUdOKHAsIDQpOwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKHRhZyAhPSBPRl9EVF9CRUdJTl9OT0RFKSB7Ci0JCQlwcl9lcnIoIkludmFsaWQgdGFnICV4IGluIGZsYXQgZGV2aWNlIHRyZWUhXG4iLCB0YWcpOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQkJZGVwdGgrKzsKLQkJcGF0aHAgPSAoY2hhciAqKXA7Ci0JCXAgPSBBTElHTihwICsgc3RybGVuKHBhdGhwKSArIDEsIDQpOwotCQlpZiAoKCpwYXRocCkgPT0gJy8nKSB7Ci0JCQljaGFyICpscCwgKm5wOwotCQkJZm9yIChscCA9IE5VTEwsIG5wID0gcGF0aHA7ICpucDsgbnArKykKLQkJCQlpZiAoKCpucCkgPT0gJy8nKQotCQkJCQlscCA9IG5wKzE7Ci0JCQlpZiAobHAgIT0gTlVMTCkKLQkJCQlwYXRocCA9IGxwOwotCQl9Ci0JCXJjID0gaXQocCwgcGF0aHAsIGRlcHRoLCBkYXRhKTsKLQkJaWYgKHJjICE9IDApCi0JCQlicmVhazsKLQl9IHdoaWxlICgxKTsKLQotCXJldHVybiByYzsKLX0KLQotLyoqCi0gKiBvZl9nZXRfZmxhdF9kdF9yb290IC0gZmluZCB0aGUgcm9vdCBub2RlIGluIHRoZSBmbGF0IGJsb2IKLSAqLwotdW5zaWduZWQgbG9uZyBfX2luaXQgb2ZfZ2V0X2ZsYXRfZHRfcm9vdCh2b2lkKQotewotCXVuc2lnbmVkIGxvbmcgcCA9ICgodW5zaWduZWQgbG9uZylpbml0aWFsX2Jvb3RfcGFyYW1zKSArCi0JCWJlMzJfdG9fY3B1KGluaXRpYWxfYm9vdF9wYXJhbXMtPm9mZl9kdF9zdHJ1Y3QpOwotCi0Jd2hpbGUgKGJlMzJfdG9fY3B1cCgoX19iZTMyICopcCkgPT0gT0ZfRFRfTk9QKQotCQlwICs9IDQ7Ci0JQlVHX09OKGJlMzJfdG9fY3B1cCgoX19iZTMyICopcCkgIT0gT0ZfRFRfQkVHSU5fTk9ERSk7Ci0JcCArPSA0OwotCXJldHVybiBBTElHTihwICsgc3RybGVuKChjaGFyICopcCkgKyAxLCA0KTsKLX0KLQotLyoqCi0gKiBvZl9nZXRfZmxhdF9kdF9wcm9wIC0gR2l2ZW4gYSBub2RlIGluIHRoZSBmbGF0IGJsb2IsIHJldHVybiB0aGUgcHJvcGVydHkgcHRyCi0gKgotICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB3aXRoaW4gc2Nhbl9mbGF0dGVuZWRfZHQgY2FsbGJhY2sgdG8gZ2V0Ci0gKiBhY2Nlc3MgdG8gcHJvcGVydGllcwotICovCi12b2lkICpfX2luaXQgb2ZfZ2V0X2ZsYXRfZHRfcHJvcCh1bnNpZ25lZCBsb25nIG5vZGUsIGNvbnN0IGNoYXIgKm5hbWUsCi0JCQkJIHVuc2lnbmVkIGxvbmcgKnNpemUpCit2b2lkICpvZl9mZHRfZ2V0X3Byb3BlcnR5KHN0cnVjdCBib290X3BhcmFtX2hlYWRlciAqYmxvYiwKKwkJICAgICAgIHVuc2lnbmVkIGxvbmcgbm9kZSwgY29uc3QgY2hhciAqbmFtZSwKKwkJICAgICAgIHVuc2lnbmVkIGxvbmcgKnNpemUpCiB7CiAJdW5zaWduZWQgbG9uZyBwID0gbm9kZTsKIApAQCAtMTM3LDEwICs1NCwxMCBAQAogCQlzeiA9IGJlMzJfdG9fY3B1cCgoX19iZTMyICopcCk7CiAJCW5vZmYgPSBiZTMyX3RvX2NwdXAoKF9fYmUzMiAqKShwICsgNCkpOwogCQlwICs9IDg7Ci0JCWlmIChiZTMyX3RvX2NwdShpbml0aWFsX2Jvb3RfcGFyYW1zLT52ZXJzaW9uKSA8IDB4MTApCisJCWlmIChiZTMyX3RvX2NwdShibG9iLT52ZXJzaW9uKSA8IDB4MTApCiAJCQlwID0gQUxJR04ocCwgc3ogPj0gOCA/IDggOiA0KTsKIAotCQluc3RyID0gZmluZF9mbGF0X2R0X3N0cmluZyhub2ZmKTsKKwkJbnN0ciA9IG9mX2ZkdF9nZXRfc3RyaW5nKGJsb2IsIG5vZmYpOwogCQlpZiAobnN0ciA9PSBOVUxMKSB7CiAJCQlwcl93YXJuaW5nKCJDYW4ndCBmaW5kIHByb3BlcnR5IGluZGV4IG5hbWUgIVxuIik7CiAJCQlyZXR1cm4gTlVMTDsKQEAgLTE1NiwyMSArNzMsMjggQEAKIH0KIAogLyoqCi0gKiBvZl9mbGF0X2R0X2lzX2NvbXBhdGlibGUgLSBSZXR1cm4gdHJ1ZSBpZiBnaXZlbiBub2RlIGhhcyBjb21wYXQgaW4gY29tcGF0aWJsZSBsaXN0CisgKiBvZl9mZHRfaXNfY29tcGF0aWJsZSAtIFJldHVybiB0cnVlIGlmIGdpdmVuIG5vZGUgZnJvbSB0aGUgZ2l2ZW4gYmxvYiBoYXMKKyAqIGNvbXBhdCBpbiBpdHMgY29tcGF0aWJsZSBsaXN0CisgKiBAYmxvYjogQSBkZXZpY2UgdHJlZSBibG9iCiAgKiBAbm9kZTogbm9kZSB0byB0ZXN0CiAgKiBAY29tcGF0OiBjb21wYXRpYmxlIHN0cmluZyB0byBjb21wYXJlIHdpdGggY29tcGF0aWJsZSBsaXN0LgorICoKKyAqIE9uIG1hdGNoLCByZXR1cm5zIGEgbm9uLXplcm8gdmFsdWUgd2l0aCBzbWFsbGVyIHZhbHVlcyByZXR1cm5lZCBmb3IgbW9yZQorICogc3BlY2lmaWMgY29tcGF0aWJsZSB2YWx1ZXMuCiAgKi8KLWludCBfX2luaXQgb2ZfZmxhdF9kdF9pc19jb21wYXRpYmxlKHVuc2lnbmVkIGxvbmcgbm9kZSwgY29uc3QgY2hhciAqY29tcGF0KQoraW50IG9mX2ZkdF9pc19jb21wYXRpYmxlKHN0cnVjdCBib290X3BhcmFtX2hlYWRlciAqYmxvYiwKKwkJICAgICAgdW5zaWduZWQgbG9uZyBub2RlLCBjb25zdCBjaGFyICpjb21wYXQpCiB7CiAJY29uc3QgY2hhciAqY3A7Ci0JdW5zaWduZWQgbG9uZyBjcGxlbiwgbDsKKwl1bnNpZ25lZCBsb25nIGNwbGVuLCBsLCBzY29yZSA9IDA7CiAKLQljcCA9IG9mX2dldF9mbGF0X2R0X3Byb3Aobm9kZSwgImNvbXBhdGlibGUiLCAmY3BsZW4pOworCWNwID0gb2ZfZmR0X2dldF9wcm9wZXJ0eShibG9iLCBub2RlLCAiY29tcGF0aWJsZSIsICZjcGxlbik7CiAJaWYgKGNwID09IE5VTEwpCiAJCXJldHVybiAwOwogCXdoaWxlIChjcGxlbiA+IDApIHsKKwkJc2NvcmUrKzsKIAkJaWYgKG9mX2NvbXBhdF9jbXAoY3AsIGNvbXBhdCwgc3RybGVuKGNvbXBhdCkpID09IDApCi0JCQlyZXR1cm4gMTsKKwkJCXJldHVybiBzY29yZTsKIAkJbCA9IHN0cmxlbihjcCkgKyAxOwogCQljcCArPSBsOwogCQljcGxlbiAtPSBsOwpAQCAtMTc5LDcgKzEwMywyOCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCAqX19pbml0IHVuZmxhdHRlbl9kdF9hbGxvYyh1bnNpZ25lZCBsb25nICptZW0sIHVuc2lnbmVkIGxvbmcgc2l6ZSwKKy8qKgorICogb2ZfZmR0X21hdGNoIC0gUmV0dXJuIHRydWUgaWYgbm9kZSBtYXRjaGVzIGEgbGlzdCBvZiBjb21wYXRpYmxlIHZhbHVlcworICovCitpbnQgb2ZfZmR0X21hdGNoKHN0cnVjdCBib290X3BhcmFtX2hlYWRlciAqYmxvYiwgdW5zaWduZWQgbG9uZyBub2RlLAorICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICoqY29tcGF0KQoreworCXVuc2lnbmVkIGludCB0bXAsIHNjb3JlID0gMDsKKworCWlmICghY29tcGF0KQorCQlyZXR1cm4gMDsKKworCXdoaWxlICgqY29tcGF0KSB7CisJCXRtcCA9IG9mX2ZkdF9pc19jb21wYXRpYmxlKGJsb2IsIG5vZGUsICpjb21wYXQpOworCQlpZiAodG1wICYmIChzY29yZSA9PSAwIHx8ICh0bXAgPCBzY29yZSkpKQorCQkJc2NvcmUgPSB0bXA7CisJCWNvbXBhdCsrOworCX0KKworCXJldHVybiBzY29yZTsKK30KKworc3RhdGljIHZvaWQgKnVuZmxhdHRlbl9kdF9hbGxvYyh1bnNpZ25lZCBsb25nICptZW0sIHVuc2lnbmVkIGxvbmcgc2l6ZSwKIAkJCQkgICAgICAgdW5zaWduZWQgbG9uZyBhbGlnbikKIHsKIAl2b2lkICpyZXM7CkBAIC0xOTMsMTYgKzEzOCwxOCBAQAogCiAvKioKICAqIHVuZmxhdHRlbl9kdF9ub2RlIC0gQWxsb2MgYW5kIHBvcHVsYXRlIGEgZGV2aWNlX25vZGUgZnJvbSB0aGUgZmxhdCB0cmVlCisgKiBAYmxvYjogVGhlIHBhcmVudCBkZXZpY2UgdHJlZSBibG9iCiAgKiBAcDogcG9pbnRlciB0byBub2RlIGluIGZsYXQgdHJlZQogICogQGRhZDogUGFyZW50IHN0cnVjdCBkZXZpY2Vfbm9kZQogICogQGFsbG5leHRwcDogcG9pbnRlciB0byAtPmFsbG5leHQgZnJvbSBsYXN0IGFsbG9jYXRlZCBkZXZpY2Vfbm9kZQogICogQGZwc2l6ZTogU2l6ZSBvZiB0aGUgbm9kZSBwYXRoIHVwIGF0IHRoZSBjdXJyZW50IGRlcHRoLgogICovCi11bnNpZ25lZCBsb25nIF9faW5pdCB1bmZsYXR0ZW5fZHRfbm9kZSh1bnNpZ25lZCBsb25nIG1lbSwKLQkJCQkJdW5zaWduZWQgbG9uZyAqcCwKLQkJCQkJc3RydWN0IGRldmljZV9ub2RlICpkYWQsCi0JCQkJCXN0cnVjdCBkZXZpY2Vfbm9kZSAqKiphbGxuZXh0cHAsCi0JCQkJCXVuc2lnbmVkIGxvbmcgZnBzaXplKQordW5zaWduZWQgbG9uZyB1bmZsYXR0ZW5fZHRfbm9kZShzdHJ1Y3QgYm9vdF9wYXJhbV9oZWFkZXIgKmJsb2IsCisJCQkJdW5zaWduZWQgbG9uZyBtZW0sCisJCQkJdW5zaWduZWQgbG9uZyAqcCwKKwkJCQlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRhZCwKKwkJCQlzdHJ1Y3QgZGV2aWNlX25vZGUgKioqYWxsbmV4dHBwLAorCQkJCXVuc2lnbmVkIGxvbmcgZnBzaXplKQogewogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7CiAJc3RydWN0IHByb3BlcnR5ICpwcCwgKipwcmV2X3BwID0gTlVMTDsKQEAgLTI5OCwxMCArMjQ1LDEwIEBACiAJCXN6ID0gYmUzMl90b19jcHVwKChfX2JlMzIgKikoKnApKTsKIAkJbm9mZiA9IGJlMzJfdG9fY3B1cCgoX19iZTMyICopKCgqcCkgKyA0KSk7CiAJCSpwICs9IDg7Ci0JCWlmIChiZTMyX3RvX2NwdShpbml0aWFsX2Jvb3RfcGFyYW1zLT52ZXJzaW9uKSA8IDB4MTApCisJCWlmIChiZTMyX3RvX2NwdShibG9iLT52ZXJzaW9uKSA8IDB4MTApCiAJCQkqcCA9IEFMSUdOKCpwLCBzeiA+PSA4ID8gOCA6IDQpOwogCi0JCXBuYW1lID0gZmluZF9mbGF0X2R0X3N0cmluZyhub2ZmKTsKKwkJcG5hbWUgPSBvZl9mZHRfZ2V0X3N0cmluZyhibG9iLCBub2ZmKTsKIAkJaWYgKHBuYW1lID09IE5VTEwpIHsKIAkJCXByX2luZm8oIkNhbid0IGZpbmQgcHJvcGVydHkgbmFtZSBpbiBsaXN0ICFcbiIpOwogCQkJYnJlYWs7CkBAIC0zODAsNyArMzI3LDggQEAKIAkJaWYgKHRhZyA9PSBPRl9EVF9OT1ApCiAJCQkqcCArPSA0OwogCQllbHNlCi0JCQltZW0gPSB1bmZsYXR0ZW5fZHRfbm9kZShtZW0sIHAsIG5wLCBhbGxuZXh0cHAsIGZwc2l6ZSk7CisJCQltZW0gPSB1bmZsYXR0ZW5fZHRfbm9kZShibG9iLCBtZW0sIHAsIG5wLCBhbGxuZXh0cHAsCisJCQkJCQlmcHNpemUpOwogCQl0YWcgPSBiZTMyX3RvX2NwdXAoKF9fYmUzMiAqKSgqcCkpOwogCX0KIAlpZiAodGFnICE9IE9GX0RUX0VORF9OT0RFKSB7CkBAIC0zOTEsNiArMzM5LDIxMSBAQAogCXJldHVybiBtZW07CiB9CiAKKy8qKgorICogX191bmZsYXR0ZW5fZGV2aWNlX3RyZWUgLSBjcmVhdGUgdHJlZSBvZiBkZXZpY2Vfbm9kZXMgZnJvbSBmbGF0IGJsb2IKKyAqCisgKiB1bmZsYXR0ZW5zIGEgZGV2aWNlLXRyZWUsIGNyZWF0aW5nIHRoZQorICogdHJlZSBvZiBzdHJ1Y3QgZGV2aWNlX25vZGUuIEl0IGFsc28gZmlsbHMgdGhlICJuYW1lIiBhbmQgInR5cGUiCisgKiBwb2ludGVycyBvZiB0aGUgbm9kZXMgc28gdGhlIG5vcm1hbCBkZXZpY2UtdHJlZSB3YWxraW5nIGZ1bmN0aW9ucworICogY2FuIGJlIHVzZWQuCisgKiBAYmxvYjogVGhlIGJsb2IgdG8gZXhwYW5kCisgKiBAbXlub2RlczogVGhlIGRldmljZV9ub2RlIHRyZWUgY3JlYXRlZCBieSB0aGUgY2FsbAorICogQGR0X2FsbG9jOiBBbiBhbGxvY2F0b3IgdGhhdCBwcm92aWRlcyBhIHZpcnR1YWwgYWRkcmVzcyB0byBtZW1vcnkKKyAqIGZvciB0aGUgcmVzdWx0aW5nIHRyZWUKKyAqLwordm9pZCBfX3VuZmxhdHRlbl9kZXZpY2VfdHJlZShzdHJ1Y3QgYm9vdF9wYXJhbV9oZWFkZXIgKmJsb2IsCisJCQkgICAgIHN0cnVjdCBkZXZpY2Vfbm9kZSAqKm15bm9kZXMsCisJCQkgICAgIHZvaWQgKiAoKmR0X2FsbG9jKSh1NjQgc2l6ZSwgdTY0IGFsaWduKSkKK3sKKwl1bnNpZ25lZCBsb25nIHN0YXJ0LCBtZW0sIHNpemU7CisJc3RydWN0IGRldmljZV9ub2RlICoqYWxsbmV4dHAgPSBteW5vZGVzOworCisJcHJfZGVidWcoIiAtPiB1bmZsYXR0ZW5fZGV2aWNlX3RyZWUoKVxuIik7CisKKwlpZiAoIWJsb2IpIHsKKwkJcHJfZGVidWcoIk5vIGRldmljZSB0cmVlIHBvaW50ZXJcbiIpOworCQlyZXR1cm47CisJfQorCisJcHJfZGVidWcoIlVuZmxhdHRlbmluZyBkZXZpY2UgdHJlZTpcbiIpOworCXByX2RlYnVnKCJtYWdpYzogJTA4eFxuIiwgYmUzMl90b19jcHUoYmxvYi0+bWFnaWMpKTsKKwlwcl9kZWJ1Zygic2l6ZTogJTA4eFxuIiwgYmUzMl90b19jcHUoYmxvYi0+dG90YWxzaXplKSk7CisJcHJfZGVidWcoInZlcnNpb246ICUwOHhcbiIsIGJlMzJfdG9fY3B1KGJsb2ItPnZlcnNpb24pKTsKKworCWlmIChiZTMyX3RvX2NwdShibG9iLT5tYWdpYykgIT0gT0ZfRFRfSEVBREVSKSB7CisJCXByX2VycigiSW52YWxpZCBkZXZpY2UgdHJlZSBibG9iIGhlYWRlclxuIik7CisJCXJldHVybjsKKwl9CisKKwkvKiBGaXJzdCBwYXNzLCBzY2FuIGZvciBzaXplICovCisJc3RhcnQgPSAoKHVuc2lnbmVkIGxvbmcpYmxvYikgKworCQliZTMyX3RvX2NwdShibG9iLT5vZmZfZHRfc3RydWN0KTsKKwlzaXplID0gdW5mbGF0dGVuX2R0X25vZGUoYmxvYiwgMCwgJnN0YXJ0LCBOVUxMLCBOVUxMLCAwKTsKKwlzaXplID0gKHNpemUgfCAzKSArIDE7CisKKwlwcl9kZWJ1ZygiICBzaXplIGlzICVseCwgYWxsb2NhdGluZy4uLlxuIiwgc2l6ZSk7CisKKwkvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBleHBhbmRlZCBkZXZpY2UgdHJlZSAqLworCW1lbSA9ICh1bnNpZ25lZCBsb25nKQorCQlkdF9hbGxvYyhzaXplICsgNCwgX19hbGlnbm9mX18oc3RydWN0IGRldmljZV9ub2RlKSk7CisKKwkoKF9fYmUzMiAqKW1lbSlbc2l6ZSAvIDRdID0gY3B1X3RvX2JlMzIoMHhkZWFkYmVlZik7CisKKwlwcl9kZWJ1ZygiICB1bmZsYXR0ZW5pbmcgJWx4Li4uXG4iLCBtZW0pOworCisJLyogU2Vjb25kIHBhc3MsIGRvIGFjdHVhbCB1bmZsYXR0ZW5pbmcgKi8KKwlzdGFydCA9ICgodW5zaWduZWQgbG9uZylibG9iKSArCisJCWJlMzJfdG9fY3B1KGJsb2ItPm9mZl9kdF9zdHJ1Y3QpOworCXVuZmxhdHRlbl9kdF9ub2RlKGJsb2IsIG1lbSwgJnN0YXJ0LCBOVUxMLCAmYWxsbmV4dHAsIDApOworCWlmIChiZTMyX3RvX2NwdXAoKF9fYmUzMiAqKXN0YXJ0KSAhPSBPRl9EVF9FTkQpCisJCXByX3dhcm5pbmcoIldlaXJkIHRhZyBhdCBlbmQgb2YgdHJlZTogJTA4eFxuIiwgKigodTMyICopc3RhcnQpKTsKKwlpZiAoYmUzMl90b19jcHUoKChfX2JlMzIgKiltZW0pW3NpemUgLyA0XSkgIT0gMHhkZWFkYmVlZikKKwkJcHJfd2FybmluZygiRW5kIG9mIHRyZWUgbWFya2VyIG92ZXJ3cml0dGVuOiAlMDh4XG4iLAorCQkJICAgYmUzMl90b19jcHUoKChfX2JlMzIgKiltZW0pW3NpemUgLyA0XSkpOworCSphbGxuZXh0cCA9IE5VTEw7CisKKwlwcl9kZWJ1ZygiIDwtIHVuZmxhdHRlbl9kZXZpY2VfdHJlZSgpXG4iKTsKK30KKworc3RhdGljIHZvaWQgKmtlcm5lbF90cmVlX2FsbG9jKHU2NCBzaXplLCB1NjQgYWxpZ24pCit7CisJcmV0dXJuIGt6YWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7Cit9CisKKy8qKgorICogb2ZfZmR0X3VuZmxhdHRlbl90cmVlIC0gY3JlYXRlIHRyZWUgb2YgZGV2aWNlX25vZGVzIGZyb20gZmxhdCBibG9iCisgKgorICogdW5mbGF0dGVucyB0aGUgZGV2aWNlLXRyZWUgcGFzc2VkIGJ5IHRoZSBmaXJtd2FyZSwgY3JlYXRpbmcgdGhlCisgKiB0cmVlIG9mIHN0cnVjdCBkZXZpY2Vfbm9kZS4gSXQgYWxzbyBmaWxscyB0aGUgIm5hbWUiIGFuZCAidHlwZSIKKyAqIHBvaW50ZXJzIG9mIHRoZSBub2RlcyBzbyB0aGUgbm9ybWFsIGRldmljZS10cmVlIHdhbGtpbmcgZnVuY3Rpb25zCisgKiBjYW4gYmUgdXNlZC4KKyAqLwordm9pZCBvZl9mZHRfdW5mbGF0dGVuX3RyZWUodW5zaWduZWQgbG9uZyAqYmxvYiwKKwkJCXN0cnVjdCBkZXZpY2Vfbm9kZSAqKm15bm9kZXMpCit7CisJc3RydWN0IGJvb3RfcGFyYW1faGVhZGVyICpkZXZpY2VfdHJlZSA9CisJCShzdHJ1Y3QgYm9vdF9wYXJhbV9oZWFkZXIgKilibG9iOworCV9fdW5mbGF0dGVuX2RldmljZV90cmVlKGRldmljZV90cmVlLCBteW5vZGVzLCAma2VybmVsX3RyZWVfYWxsb2MpOworfQorRVhQT1JUX1NZTUJPTF9HUEwob2ZfZmR0X3VuZmxhdHRlbl90cmVlKTsKKworLyogRXZlcnl0aGluZyBiZWxvdyBoZXJlIHJlZmVyZW5jZXMgaW5pdGlhbF9ib290X3BhcmFtcyBkaXJlY3RseS4gKi8KK2ludCBfX2luaXRkYXRhIGR0X3Jvb3RfYWRkcl9jZWxsczsKK2ludCBfX2luaXRkYXRhIGR0X3Jvb3Rfc2l6ZV9jZWxsczsKKworc3RydWN0IGJvb3RfcGFyYW1faGVhZGVyICppbml0aWFsX2Jvb3RfcGFyYW1zOworCisjaWZkZWYgQ09ORklHX09GX0VBUkxZX0ZMQVRUUkVFCisKKy8qKgorICogb2Zfc2Nhbl9mbGF0X2R0IC0gc2NhbiBmbGF0dGVuZWQgdHJlZSBibG9iIGFuZCBjYWxsIGNhbGxiYWNrIG9uIGVhY2guCisgKiBAaXQ6IGNhbGxiYWNrIGZ1bmN0aW9uCisgKiBAZGF0YTogY29udGV4dCBkYXRhIHBvaW50ZXIKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gc2NhbiB0aGUgZmxhdHRlbmVkIGRldmljZS10cmVlLCBpdCBpcworICogdXNlZCB0byBleHRyYWN0IHRoZSBtZW1vcnkgaW5mb3JtYXRpb24gYXQgYm9vdCBiZWZvcmUgd2UgY2FuCisgKiB1bmZsYXR0ZW4gdGhlIHRyZWUKKyAqLworaW50IF9faW5pdCBvZl9zY2FuX2ZsYXRfZHQoaW50ICgqaXQpKHVuc2lnbmVkIGxvbmcgbm9kZSwKKwkJCQkgICAgIGNvbnN0IGNoYXIgKnVuYW1lLCBpbnQgZGVwdGgsCisJCQkJICAgICB2b2lkICpkYXRhKSwKKwkJCSAgIHZvaWQgKmRhdGEpCit7CisJdW5zaWduZWQgbG9uZyBwID0gKCh1bnNpZ25lZCBsb25nKWluaXRpYWxfYm9vdF9wYXJhbXMpICsKKwkJYmUzMl90b19jcHUoaW5pdGlhbF9ib290X3BhcmFtcy0+b2ZmX2R0X3N0cnVjdCk7CisJaW50IHJjID0gMDsKKwlpbnQgZGVwdGggPSAtMTsKKworCWRvIHsKKwkJdTMyIHRhZyA9IGJlMzJfdG9fY3B1cCgoX19iZTMyICopcCk7CisJCWNoYXIgKnBhdGhwOworCisJCXAgKz0gNDsKKwkJaWYgKHRhZyA9PSBPRl9EVF9FTkRfTk9ERSkgeworCQkJZGVwdGgtLTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICh0YWcgPT0gT0ZfRFRfTk9QKQorCQkJY29udGludWU7CisJCWlmICh0YWcgPT0gT0ZfRFRfRU5EKQorCQkJYnJlYWs7CisJCWlmICh0YWcgPT0gT0ZfRFRfUFJPUCkgeworCQkJdTMyIHN6ID0gYmUzMl90b19jcHVwKChfX2JlMzIgKilwKTsKKwkJCXAgKz0gODsKKwkJCWlmIChiZTMyX3RvX2NwdShpbml0aWFsX2Jvb3RfcGFyYW1zLT52ZXJzaW9uKSA8IDB4MTApCisJCQkJcCA9IEFMSUdOKHAsIHN6ID49IDggPyA4IDogNCk7CisJCQlwICs9IHN6OworCQkJcCA9IEFMSUdOKHAsIDQpOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKHRhZyAhPSBPRl9EVF9CRUdJTl9OT0RFKSB7CisJCQlwcl9lcnIoIkludmFsaWQgdGFnICV4IGluIGZsYXQgZGV2aWNlIHRyZWUhXG4iLCB0YWcpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJZGVwdGgrKzsKKwkJcGF0aHAgPSAoY2hhciAqKXA7CisJCXAgPSBBTElHTihwICsgc3RybGVuKHBhdGhwKSArIDEsIDQpOworCQlpZiAoKCpwYXRocCkgPT0gJy8nKSB7CisJCQljaGFyICpscCwgKm5wOworCQkJZm9yIChscCA9IE5VTEwsIG5wID0gcGF0aHA7ICpucDsgbnArKykKKwkJCQlpZiAoKCpucCkgPT0gJy8nKQorCQkJCQlscCA9IG5wKzE7CisJCQlpZiAobHAgIT0gTlVMTCkKKwkJCQlwYXRocCA9IGxwOworCQl9CisJCXJjID0gaXQocCwgcGF0aHAsIGRlcHRoLCBkYXRhKTsKKwkJaWYgKHJjICE9IDApCisJCQlicmVhazsKKwl9IHdoaWxlICgxKTsKKworCXJldHVybiByYzsKK30KKworLyoqCisgKiBvZl9nZXRfZmxhdF9kdF9yb290IC0gZmluZCB0aGUgcm9vdCBub2RlIGluIHRoZSBmbGF0IGJsb2IKKyAqLwordW5zaWduZWQgbG9uZyBfX2luaXQgb2ZfZ2V0X2ZsYXRfZHRfcm9vdCh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgcCA9ICgodW5zaWduZWQgbG9uZylpbml0aWFsX2Jvb3RfcGFyYW1zKSArCisJCWJlMzJfdG9fY3B1KGluaXRpYWxfYm9vdF9wYXJhbXMtPm9mZl9kdF9zdHJ1Y3QpOworCisJd2hpbGUgKGJlMzJfdG9fY3B1cCgoX19iZTMyICopcCkgPT0gT0ZfRFRfTk9QKQorCQlwICs9IDQ7CisJQlVHX09OKGJlMzJfdG9fY3B1cCgoX19iZTMyICopcCkgIT0gT0ZfRFRfQkVHSU5fTk9ERSk7CisJcCArPSA0OworCXJldHVybiBBTElHTihwICsgc3RybGVuKChjaGFyICopcCkgKyAxLCA0KTsKK30KKworLyoqCisgKiBvZl9nZXRfZmxhdF9kdF9wcm9wIC0gR2l2ZW4gYSBub2RlIGluIHRoZSBmbGF0IGJsb2IsIHJldHVybiB0aGUgcHJvcGVydHkgcHRyCisgKgorICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB3aXRoaW4gc2Nhbl9mbGF0dGVuZWRfZHQgY2FsbGJhY2sgdG8gZ2V0CisgKiBhY2Nlc3MgdG8gcHJvcGVydGllcworICovCit2b2lkICpfX2luaXQgb2ZfZ2V0X2ZsYXRfZHRfcHJvcCh1bnNpZ25lZCBsb25nIG5vZGUsIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkJIHVuc2lnbmVkIGxvbmcgKnNpemUpCit7CisJcmV0dXJuIG9mX2ZkdF9nZXRfcHJvcGVydHkoaW5pdGlhbF9ib290X3BhcmFtcywgbm9kZSwgbmFtZSwgc2l6ZSk7Cit9CisKKy8qKgorICogb2ZfZmxhdF9kdF9pc19jb21wYXRpYmxlIC0gUmV0dXJuIHRydWUgaWYgZ2l2ZW4gbm9kZSBoYXMgY29tcGF0IGluIGNvbXBhdGlibGUgbGlzdAorICogQG5vZGU6IG5vZGUgdG8gdGVzdAorICogQGNvbXBhdDogY29tcGF0aWJsZSBzdHJpbmcgdG8gY29tcGFyZSB3aXRoIGNvbXBhdGlibGUgbGlzdC4KKyAqLworaW50IF9faW5pdCBvZl9mbGF0X2R0X2lzX2NvbXBhdGlibGUodW5zaWduZWQgbG9uZyBub2RlLCBjb25zdCBjaGFyICpjb21wYXQpCit7CisJcmV0dXJuIG9mX2ZkdF9pc19jb21wYXRpYmxlKGluaXRpYWxfYm9vdF9wYXJhbXMsIG5vZGUsIGNvbXBhdCk7Cit9CisKKy8qKgorICogb2ZfZmxhdF9kdF9tYXRjaCAtIFJldHVybiB0cnVlIGlmIG5vZGUgbWF0Y2hlcyBhIGxpc3Qgb2YgY29tcGF0aWJsZSB2YWx1ZXMKKyAqLworaW50IF9faW5pdCBvZl9mbGF0X2R0X21hdGNoKHVuc2lnbmVkIGxvbmcgbm9kZSwgY29uc3QgY2hhciAqKmNvbXBhdCkKK3sKKwlyZXR1cm4gb2ZfZmR0X21hdGNoKGluaXRpYWxfYm9vdF9wYXJhbXMsIG5vZGUsIGNvbXBhdCk7Cit9CisKICNpZmRlZiBDT05GSUdfQkxLX0RFVl9JTklUUkQKIC8qKgogICogZWFybHlfaW5pdF9kdF9jaGVja19mb3JfaW5pdHJkIC0gRGVjb2RlIGluaXRyZCBsb2NhdGlvbiBmcm9tIGZsYXQgdHJlZQpAQCAtNTM5LDYgKzY5MiwxMiBAQAogCXJldHVybiAxOwogfQogCitzdGF0aWMgdm9pZCAqX19pbml0IGVhcmx5X2RldmljZV90cmVlX2FsbG9jKHU2NCBzaXplLCB1NjQgYWxpZ24pCit7CisJdW5zaWduZWQgbG9uZyBtZW0gPSBlYXJseV9pbml0X2R0X2FsbG9jX21lbW9yeV9hcmNoKHNpemUsIGFsaWduKTsKKwlyZXR1cm4gX192YShtZW0pOworfQorCiAvKioKICAqIHVuZmxhdHRlbl9kZXZpY2VfdHJlZSAtIGNyZWF0ZSB0cmVlIG9mIGRldmljZV9ub2RlcyBmcm9tIGZsYXQgYmxvYgogICoKQEAgLTU0OSw1OCArNzA4LDEzIEBACiAgKi8KIHZvaWQgX19pbml0IHVuZmxhdHRlbl9kZXZpY2VfdHJlZSh2b2lkKQogewotCXVuc2lnbmVkIGxvbmcgc3RhcnQsIG1lbSwgc2l6ZTsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKiphbGxuZXh0cCA9ICZhbGxub2RlczsKLQotCXByX2RlYnVnKCIgLT4gdW5mbGF0dGVuX2RldmljZV90cmVlKClcbiIpOwotCi0JaWYgKCFpbml0aWFsX2Jvb3RfcGFyYW1zKSB7Ci0JCXByX2RlYnVnKCJObyBkZXZpY2UgdHJlZSBwb2ludGVyXG4iKTsKLQkJcmV0dXJuOwotCX0KLQotCXByX2RlYnVnKCJVbmZsYXR0ZW5pbmcgZGV2aWNlIHRyZWU6XG4iKTsKLQlwcl9kZWJ1ZygibWFnaWM6ICUwOHhcbiIsIGJlMzJfdG9fY3B1KGluaXRpYWxfYm9vdF9wYXJhbXMtPm1hZ2ljKSk7Ci0JcHJfZGVidWcoInNpemU6ICUwOHhcbiIsIGJlMzJfdG9fY3B1KGluaXRpYWxfYm9vdF9wYXJhbXMtPnRvdGFsc2l6ZSkpOwotCXByX2RlYnVnKCJ2ZXJzaW9uOiAlMDh4XG4iLCBiZTMyX3RvX2NwdShpbml0aWFsX2Jvb3RfcGFyYW1zLT52ZXJzaW9uKSk7Ci0KLQlpZiAoYmUzMl90b19jcHUoaW5pdGlhbF9ib290X3BhcmFtcy0+bWFnaWMpICE9IE9GX0RUX0hFQURFUikgewotCQlwcl9lcnIoIkludmFsaWQgZGV2aWNlIHRyZWUgYmxvYiBoZWFkZXJcbiIpOwotCQlyZXR1cm47Ci0JfQotCi0JLyogRmlyc3QgcGFzcywgc2NhbiBmb3Igc2l6ZSAqLwotCXN0YXJ0ID0gKCh1bnNpZ25lZCBsb25nKWluaXRpYWxfYm9vdF9wYXJhbXMpICsKLQkJYmUzMl90b19jcHUoaW5pdGlhbF9ib290X3BhcmFtcy0+b2ZmX2R0X3N0cnVjdCk7Ci0Jc2l6ZSA9IHVuZmxhdHRlbl9kdF9ub2RlKDAsICZzdGFydCwgTlVMTCwgTlVMTCwgMCk7Ci0Jc2l6ZSA9IChzaXplIHwgMykgKyAxOwotCi0JcHJfZGVidWcoIiAgc2l6ZSBpcyAlbHgsIGFsbG9jYXRpbmcuLi5cbiIsIHNpemUpOwotCi0JLyogQWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgZXhwYW5kZWQgZGV2aWNlIHRyZWUgKi8KLQltZW0gPSBlYXJseV9pbml0X2R0X2FsbG9jX21lbW9yeV9hcmNoKHNpemUgKyA0LAotCQkJX19hbGlnbm9mX18oc3RydWN0IGRldmljZV9ub2RlKSk7Ci0JbWVtID0gKHVuc2lnbmVkIGxvbmcpIF9fdmEobWVtKTsKLQotCSgoX19iZTMyICopbWVtKVtzaXplIC8gNF0gPSBjcHVfdG9fYmUzMigweGRlYWRiZWVmKTsKLQotCXByX2RlYnVnKCIgIHVuZmxhdHRlbmluZyAlbHguLi5cbiIsIG1lbSk7Ci0KLQkvKiBTZWNvbmQgcGFzcywgZG8gYWN0dWFsIHVuZmxhdHRlbmluZyAqLwotCXN0YXJ0ID0gKCh1bnNpZ25lZCBsb25nKWluaXRpYWxfYm9vdF9wYXJhbXMpICsKLQkJYmUzMl90b19jcHUoaW5pdGlhbF9ib290X3BhcmFtcy0+b2ZmX2R0X3N0cnVjdCk7Ci0JdW5mbGF0dGVuX2R0X25vZGUobWVtLCAmc3RhcnQsIE5VTEwsICZhbGxuZXh0cCwgMCk7Ci0JaWYgKGJlMzJfdG9fY3B1cCgoX19iZTMyICopc3RhcnQpICE9IE9GX0RUX0VORCkKLQkJcHJfd2FybmluZygiV2VpcmQgdGFnIGF0IGVuZCBvZiB0cmVlOiAlMDh4XG4iLCAqKCh1MzIgKilzdGFydCkpOwotCWlmIChiZTMyX3RvX2NwdSgoKF9fYmUzMiAqKW1lbSlbc2l6ZSAvIDRdKSAhPSAweGRlYWRiZWVmKQotCQlwcl93YXJuaW5nKCJFbmQgb2YgdHJlZSBtYXJrZXIgb3ZlcndyaXR0ZW46ICUwOHhcbiIsCi0JCQkgICBiZTMyX3RvX2NwdSgoKF9fYmUzMiAqKW1lbSlbc2l6ZSAvIDRdKSk7Ci0JKmFsbG5leHRwID0gTlVMTDsKKwlfX3VuZmxhdHRlbl9kZXZpY2VfdHJlZShpbml0aWFsX2Jvb3RfcGFyYW1zLCAmYWxsbm9kZXMsCisJCQkJZWFybHlfZGV2aWNlX3RyZWVfYWxsb2MpOwogCiAJLyogR2V0IHBvaW50ZXIgdG8gT0YgIi9jaG9zZW4iIG5vZGUgZm9yIHVzZSBldmVyeXdoZXJlICovCiAJb2ZfY2hvc2VuID0gb2ZfZmluZF9ub2RlX2J5X3BhdGgoIi9jaG9zZW4iKTsKIAlpZiAob2ZfY2hvc2VuID09IE5VTEwpCiAJCW9mX2Nob3NlbiA9IG9mX2ZpbmRfbm9kZV9ieV9wYXRoKCIvY2hvc2VuQDAiKTsKLQotCXByX2RlYnVnKCIgPC0gdW5mbGF0dGVuX2RldmljZV90cmVlKClcbiIpOwogfQorCisjZW5kaWYgLyogQ09ORklHX09GX0VBUkxZX0ZMQVRUUkVFICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL29mL29mX21kaW8uYyBiL2RyaXZlcnMvb2Yvb2ZfbWRpby5jCmluZGV4IDFmY2UwMGUuLmRjZDc4NTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvb2Yvb2ZfbWRpby5jCisrKyBiL2RyaXZlcnMvb2Yvb2ZfbWRpby5jCkBAIC01MiwyNyArNTIsMzUgQEAKIAogCS8qIExvb3Agb3ZlciB0aGUgY2hpbGQgbm9kZXMgYW5kIHJlZ2lzdGVyIGEgcGh5X2RldmljZSBmb3IgZWFjaCBvbmUgKi8KIAlmb3JfZWFjaF9jaGlsZF9vZl9ub2RlKG5wLCBjaGlsZCkgewotCQljb25zdCBfX2JlMzIgKmFkZHI7CisJCWNvbnN0IF9fYmUzMiAqcGFkZHI7CisJCXUzMiBhZGRyOwogCQlpbnQgbGVuOwogCiAJCS8qIEEgUEhZIG11c3QgaGF2ZSBhIHJlZyBwcm9wZXJ0eSBpbiB0aGUgcmFuZ2UgWzAtMzFdICovCi0JCWFkZHIgPSBvZl9nZXRfcHJvcGVydHkoY2hpbGQsICJyZWciLCAmbGVuKTsKLQkJaWYgKCFhZGRyIHx8IGxlbiA8IHNpemVvZigqYWRkcikgfHwgKmFkZHIgPj0gMzIgfHwgKmFkZHIgPCAwKSB7CisJCXBhZGRyID0gb2ZfZ2V0X3Byb3BlcnR5KGNoaWxkLCAicmVnIiwgJmxlbik7CisJCWlmICghcGFkZHIgfHwgbGVuIDwgc2l6ZW9mKCpwYWRkcikpIHsKIAkJCWRldl9lcnIoJm1kaW8tPmRldiwgIiVzIGhhcyBpbnZhbGlkIFBIWSBhZGRyZXNzXG4iLAogCQkJCWNoaWxkLT5mdWxsX25hbWUpOwogCQkJY29udGludWU7CiAJCX0KIAotCQlpZiAobWRpby0+aXJxKSB7Ci0JCQltZGlvLT5pcnFbKmFkZHJdID0gaXJxX29mX3BhcnNlX2FuZF9tYXAoY2hpbGQsIDApOwotCQkJaWYgKCFtZGlvLT5pcnFbKmFkZHJdKQotCQkJCW1kaW8tPmlycVsqYWRkcl0gPSBQSFlfUE9MTDsKKwkJYWRkciA9IGJlMzJfdG9fY3B1cChwYWRkcik7CisJCWlmIChhZGRyID49IDMyKSB7CisJCQlkZXZfZXJyKCZtZGlvLT5kZXYsICIlcyBQSFkgYWRkcmVzcyAlaSBpcyB0b28gbGFyZ2VcbiIsCisJCQkJY2hpbGQtPmZ1bGxfbmFtZSwgYWRkcik7CisJCQljb250aW51ZTsKIAkJfQogCi0JCXBoeSA9IGdldF9waHlfZGV2aWNlKG1kaW8sIGJlMzJfdG9fY3B1cChhZGRyKSk7CisJCWlmIChtZGlvLT5pcnEpIHsKKwkJCW1kaW8tPmlycVthZGRyXSA9IGlycV9vZl9wYXJzZV9hbmRfbWFwKGNoaWxkLCAwKTsKKwkJCWlmICghbWRpby0+aXJxW2FkZHJdKQorCQkJCW1kaW8tPmlycVthZGRyXSA9IFBIWV9QT0xMOworCQl9CisKKwkJcGh5ID0gZ2V0X3BoeV9kZXZpY2UobWRpbywgYWRkcik7CiAJCWlmICghcGh5IHx8IElTX0VSUihwaHkpKSB7CiAJCQlkZXZfZXJyKCZtZGlvLT5kZXYsICJlcnJvciBwcm9iaW5nIFBIWSBhdCBhZGRyZXNzICVpXG4iLAotCQkJCSphZGRyKTsKKwkJCQlhZGRyKTsKIAkJCWNvbnRpbnVlOwogCQl9CiAJCXBoeV9zY2FuX2ZpeHVwcyhwaHkpOwpAQCAtOTEsNyArOTksNyBAQAogCQl9CiAKIAkJZGV2X2RiZygmbWRpby0+ZGV2LCAicmVnaXN0ZXJlZCBwaHkgJXMgYXQgYWRkcmVzcyAlaVxuIiwKLQkJCWNoaWxkLT5uYW1lLCAqYWRkcik7CisJCQljaGlsZC0+bmFtZSwgYWRkcik7CiAJfQogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL29mL29mX25ldC5jIGIvZHJpdmVycy9vZi9vZl9uZXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NmYzMzRhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9vZi9vZl9uZXQuYwpAQCAtMCwwICsxLDQ4IEBACisvKgorICogT0YgaGVscGVycyBmb3IgbmV0d29yayBkZXZpY2VzLgorICoKKyAqIFRoaXMgZmlsZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgR1BMdjIKKyAqCisgKiBJbml0aWFsbHkgY29waWVkIG91dCBvZiBhcmNoL3Bvd2VycGMva2VybmVsL3Byb21fcGFyc2UuYworICovCisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9uZXQuaD4KKworLyoqCisgKiBTZWFyY2ggdGhlIGRldmljZSB0cmVlIGZvciB0aGUgYmVzdCBNQUMgYWRkcmVzcyB0byB1c2UuICAnbWFjLWFkZHJlc3MnIGlzCisgKiBjaGVja2VkIGZpcnN0LCBiZWNhdXNlIHRoYXQgaXMgc3VwcG9zZWQgdG8gY29udGFpbiB0byAibW9zdCByZWNlbnQiIE1BQworICogYWRkcmVzcy4gSWYgdGhhdCBpc24ndCBzZXQsIHRoZW4gJ2xvY2FsLW1hYy1hZGRyZXNzJyBpcyBjaGVja2VkIG5leHQsCisgKiBiZWNhdXNlIHRoYXQgaXMgdGhlIGRlZmF1bHQgYWRkcmVzcy4gIElmIHRoYXQgaXNuJ3Qgc2V0LCB0aGVuIHRoZSBvYnNvbGV0ZQorICogJ2FkZHJlc3MnIGlzIGNoZWNrZWQsIGp1c3QgaW4gY2FzZSB3ZSdyZSB1c2luZyBhbiBvbGQgZGV2aWNlIHRyZWUuCisgKgorICogTm90ZSB0aGF0IHRoZSAnYWRkcmVzcycgcHJvcGVydHkgaXMgc3VwcG9zZWQgdG8gY29udGFpbiBhIHZpcnR1YWwgYWRkcmVzcyBvZgorICogdGhlIHJlZ2lzdGVyIHNldCwgYnV0IHNvbWUgRFRTIGZpbGVzIGhhdmUgcmVkZWZpbmVkIHRoYXQgcHJvcGVydHkgdG8gYmUgdGhlCisgKiBNQUMgYWRkcmVzcy4KKyAqCisgKiBBbGwtemVybyBNQUMgYWRkcmVzc2VzIGFyZSByZWplY3RlZCwgYmVjYXVzZSB0aG9zZSBjb3VsZCBiZSBwcm9wZXJ0aWVzIHRoYXQKKyAqIGV4aXN0IGluIHRoZSBkZXZpY2UgdHJlZSwgYnV0IHdlcmUgbm90IHNldCBieSBVLUJvb3QuICBGb3IgZXhhbXBsZSwgdGhlCisgKiBEVFMgY291bGQgZGVmaW5lICdtYWMtYWRkcmVzcycgYW5kICdsb2NhbC1tYWMtYWRkcmVzcycsIHdpdGggemVybyBNQUMKKyAqIGFkZHJlc3Nlcy4gIFNvbWUgb2xkZXIgVS1Cb290cyBvbmx5IGluaXRpYWxpemVkICdsb2NhbC1tYWMtYWRkcmVzcycuICBJbgorICogdGhpcyBjYXNlLCB0aGUgcmVhbCBNQUMgaXMgaW4gJ2xvY2FsLW1hYy1hZGRyZXNzJywgYW5kICdtYWMtYWRkcmVzcycgZXhpc3RzCisgKiBidXQgaXMgYWxsIHplcm9zLgorKi8KK2NvbnN0IHZvaWQgKm9mX2dldF9tYWNfYWRkcmVzcyhzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKQoreworCXN0cnVjdCBwcm9wZXJ0eSAqcHA7CisKKwlwcCA9IG9mX2ZpbmRfcHJvcGVydHkobnAsICJtYWMtYWRkcmVzcyIsIE5VTEwpOworCWlmIChwcCAmJiAocHAtPmxlbmd0aCA9PSA2KSAmJiBpc192YWxpZF9ldGhlcl9hZGRyKHBwLT52YWx1ZSkpCisJCXJldHVybiBwcC0+dmFsdWU7CisKKwlwcCA9IG9mX2ZpbmRfcHJvcGVydHkobnAsICJsb2NhbC1tYWMtYWRkcmVzcyIsIE5VTEwpOworCWlmIChwcCAmJiAocHAtPmxlbmd0aCA9PSA2KSAmJiBpc192YWxpZF9ldGhlcl9hZGRyKHBwLT52YWx1ZSkpCisJCXJldHVybiBwcC0+dmFsdWU7CisKKwlwcCA9IG9mX2ZpbmRfcHJvcGVydHkobnAsICJhZGRyZXNzIiwgTlVMTCk7CisJaWYgKHBwICYmIChwcC0+bGVuZ3RoID09IDYpICYmIGlzX3ZhbGlkX2V0aGVyX2FkZHIocHAtPnZhbHVlKSkKKwkJcmV0dXJuIHBwLT52YWx1ZTsKKworCXJldHVybiBOVUxMOworfQorRVhQT1JUX1NZTUJPTChvZl9nZXRfbWFjX2FkZHJlc3MpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9vZi9wbGF0Zm9ybS5jIGIvZHJpdmVycy9vZi9wbGF0Zm9ybS5jCmluZGV4IDViNGEwN2YuLmMwMWNkMWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvb2YvcGxhdGZvcm0uYworKysgYi9kcml2ZXJzL29mL3BsYXRmb3JtLmMKQEAgLTYzMyw2ICs2MzMsOSBAQAogICogQG5wOiBwb2ludGVyIHRvIG5vZGUgdG8gY3JlYXRlIGRldmljZSBmb3IKICAqIEBidXNfaWQ6IG5hbWUgdG8gYXNzaWduIGRldmljZQogICogQHBhcmVudDogTGludXggZGV2aWNlIG1vZGVsIHBhcmVudCBkZXZpY2UuCisgKgorICogUmV0dXJucyBwb2ludGVyIHRvIGNyZWF0ZWQgcGxhdGZvcm0gZGV2aWNlLCBvciBOVUxMIGlmIGEgZGV2aWNlIHdhcyBub3QKKyAqIHJlZ2lzdGVyZWQuICBVbmF2YWlsYWJsZSBkZXZpY2VzIHdpbGwgbm90IGdldCByZWdpc3RlcmVkLgogICovCiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpvZl9wbGF0Zm9ybV9kZXZpY2VfY3JlYXRlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsCiAJCQkJCSAgICBjb25zdCBjaGFyICpidXNfaWQsCkBAIC02NDAsNiArNjQzLDkgQEAKIHsKIAlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXY7CiAKKwlpZiAoIW9mX2RldmljZV9pc19hdmFpbGFibGUobnApKQorCQlyZXR1cm4gTlVMTDsKKwogCWRldiA9IG9mX2RldmljZV9hbGxvYyhucCwgYnVzX2lkLCBwYXJlbnQpOwogCWlmICghZGV2KQogCQlyZXR1cm4gTlVMTDsKQEAgLTY4Myw4ICs2ODksOSBAQAogCQlwcl9kZWJ1ZygiICAgY3JlYXRlIGNoaWxkOiAlc1xuIiwgY2hpbGQtPmZ1bGxfbmFtZSk7CiAJCWRldiA9IG9mX3BsYXRmb3JtX2RldmljZV9jcmVhdGUoY2hpbGQsIE5VTEwsIHBhcmVudCk7CiAJCWlmIChkZXYgPT0gTlVMTCkKLQkJCXJjID0gLUVOT01FTTsKLQkJZWxzZSBpZiAoIW9mX21hdGNoX25vZGUobWF0Y2hlcywgY2hpbGQpKQorCQkJY29udGludWU7CisKKwkJaWYgKCFvZl9tYXRjaF9ub2RlKG1hdGNoZXMsIGNoaWxkKSkKIAkJCWNvbnRpbnVlOwogCQlpZiAocmMgPT0gMCkgewogCQkJcHJfZGVidWcoIiAgIGFuZCBzdWIgYnVzc2VzXG4iKTsKQEAgLTczMywxMCArNzQwLDkgQEAKIAlpZiAob2ZfbWF0Y2hfbm9kZShtYXRjaGVzLCByb290KSkgewogCQlwcl9kZWJ1ZygiIHJvb3QgbWF0Y2gsIGNyZWF0ZSBhbGwgc3ViIGRldmljZXNcbiIpOwogCQlkZXYgPSBvZl9wbGF0Zm9ybV9kZXZpY2VfY3JlYXRlKHJvb3QsIE5VTEwsIHBhcmVudCk7Ci0JCWlmIChkZXYgPT0gTlVMTCkgewotCQkJcmMgPSAtRU5PTUVNOworCQlpZiAoZGV2ID09IE5VTEwpCiAJCQlnb3RvIGJhaWw7Ci0JCX0KKwogCQlwcl9kZWJ1ZygiIGNyZWF0ZSBhbGwgc3ViIGJ1c3Nlc1xuIik7CiAJCXJjID0gb2ZfcGxhdGZvcm1fYnVzX2NyZWF0ZShyb290LCBtYXRjaGVzLCAmZGV2LT5kZXYpOwogCQlnb3RvIGJhaWw7CkBAIC03NDgsOSArNzU0LDkgQEAKIAkJcHJfZGVidWcoIiAgbWF0Y2g6ICVzXG4iLCBjaGlsZC0+ZnVsbF9uYW1lKTsKIAkJZGV2ID0gb2ZfcGxhdGZvcm1fZGV2aWNlX2NyZWF0ZShjaGlsZCwgTlVMTCwgcGFyZW50KTsKIAkJaWYgKGRldiA9PSBOVUxMKQotCQkJcmMgPSAtRU5PTUVNOwotCQllbHNlCi0JCQlyYyA9IG9mX3BsYXRmb3JtX2J1c19jcmVhdGUoY2hpbGQsIG1hdGNoZXMsICZkZXYtPmRldik7CisJCQljb250aW51ZTsKKworCQlyYyA9IG9mX3BsYXRmb3JtX2J1c19jcmVhdGUoY2hpbGQsIG1hdGNoZXMsICZkZXYtPmRldik7CiAJCWlmIChyYykgewogCQkJb2Zfbm9kZV9wdXQoY2hpbGQpOwogCQkJYnJlYWs7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3RwbHVnL2FjcGlwaHAuaCBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvYWNwaXBocC5oCmluZGV4IGJhYjUyMDQuLjc3MjIxMDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvYWNwaXBocC5oCisrKyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvYWNwaXBocC5oCkBAIC0zNiw3ICszNiw2IEBACiAjZGVmaW5lIF9BQ1BJUEhQX0gKIAogI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KLSNpbmNsdWRlIDxsaW51eC9rb2JqZWN0Lmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxsaW51eC9wY2lfaG90cGx1Zy5oPgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3RwbHVnL3JwYXBocF9zbG90LmMgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL3JwYXBocF9zbG90LmMKaW5kZXggMmVhOWNmMS4uYjI4M2JiZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvaG90cGx1Zy9ycGFwaHBfc2xvdC5jCisrKyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvcnBhcGhwX3Nsb3QuYwpAQCAtMjQsNyArMjQsNiBAQAogICovCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgva29iamVjdC5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9LY29uZmlnIGIvZHJpdmVycy9wbGF0Zm9ybS94ODYvS2NvbmZpZwppbmRleCBmYWVjNzc3Li5kMTYzYmMyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9LY29uZmlnCisrKyBiL2RyaXZlcnMvcGxhdGZvcm0veDg2L0tjb25maWcKQEAgLTE4LDEyICsxOCwxNCBAQAogY29uZmlnIEFDRVJfV01JCiAJdHJpc3RhdGUgIkFjZXIgV01JIExhcHRvcCBFeHRyYXMiCiAJZGVwZW5kcyBvbiBBQ1BJCi0JZGVwZW5kcyBvbiBMRURTX0NMQVNTCi0JZGVwZW5kcyBvbiBORVdfTEVEUworCXNlbGVjdCBMRURTX0NMQVNTCisJc2VsZWN0IE5FV19MRURTCiAJZGVwZW5kcyBvbiBCQUNLTElHSFRfQ0xBU1NfREVWSUNFCiAJZGVwZW5kcyBvbiBTRVJJT19JODA0MgorCWRlcGVuZHMgb24gSU5QVVQKIAlkZXBlbmRzIG9uIFJGS0lMTCB8fCBSRktJTEwgPSBuCi0Jc2VsZWN0IEFDUElfV01JCisJZGVwZW5kcyBvbiBBQ1BJX1dNSQorCXNlbGVjdCBJTlBVVF9TUEFSU0VLTUFQCiAJLS0taGVscC0tLQogCSAgVGhpcyBpcyBhIGRyaXZlciBmb3IgbmV3ZXIgQWNlciAoYW5kIFdpc3Ryb24pIGxhcHRvcHMuIEl0IGFkZHMKIAkgIHdpcmVsZXNzIHJhZGlvIGFuZCBibHVldG9vdGggY29udHJvbCwgYW5kIG9uIHNvbWUgbGFwdG9wcywKQEAgLTEzMSw3ICsxMzMsNyBAQAogCWRlcGVuZHMgb24gIVg4Nl82NAogCWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMCiAJZGVwZW5kcyBvbiBBQ1BJCi0Jc2VsZWN0IEFDUElfV01JCisJZGVwZW5kcyBvbiBBQ1BJX1dNSQogCS0tLWhlbHAtLS0KIAkgIFRoaXMgaXMgYSBkcml2ZXIgZm9yIHRoZSBXTUkgZXh0ZW5zaW9ucyAod2lyZWxlc3MgYW5kIGJsdWV0b290aCBwb3dlcgogCSAgY29udHJvbCkgb2YgdGhlIEhQIENvbXBhcSBUQzExMDAgdGFibGV0LgpAQCAtMjI2LDYgKzIyOCw3IEBACiAJdHJpc3RhdGUgIkxlbm92byBJZGVhUGFkIExhcHRvcCBFeHRyYXMiCiAJZGVwZW5kcyBvbiBBQ1BJCiAJZGVwZW5kcyBvbiBSRktJTEwKKwlzZWxlY3QgSU5QVVRfU1BBUlNFS01BUAogCWhlbHAKIAkgIFRoaXMgaXMgYSBkcml2ZXIgZm9yIHRoZSByZmtpbGwgc3dpdGNoZXMgb24gTGVub3ZvIElkZWFQYWQgbmV0Ym9va3MuCiAKQEAgLTQyNSw3ICs0MjgsMTAgQEAKIAlkZXBlbmRzIG9uIElOUFVUCiAJZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwKIAlkZXBlbmRzIG9uIEJBQ0tMSUdIVF9DTEFTU19ERVZJQ0UKKwlkZXBlbmRzIG9uIFJGS0lMTCB8fCBSRktJTEwgPSBuCiAJc2VsZWN0IElOUFVUX1NQQVJTRUtNQVAKKwlzZWxlY3QgTEVEU19DTEFTUworCXNlbGVjdCBORVdfTEVEUwogCS0tLWhlbHAtLS0KIAkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gc3VwcG9ydCBXTUktYmFzZWQgaG90a2V5cyBvbiBFZWUgUEMgbGFwdG9wcy4KIApAQCAtNTEwLDggKzUxNiw4IEBACiBjb25maWcgQUNQSV9UT1NISUJBCiAJdHJpc3RhdGUgIlRvc2hpYmEgTGFwdG9wIEV4dHJhcyIKIAlkZXBlbmRzIG9uIEFDUEkKLQlkZXBlbmRzIG9uIExFRFNfQ0xBU1MKLQlkZXBlbmRzIG9uIE5FV19MRURTCisJc2VsZWN0IExFRFNfQ0xBU1MKKwlzZWxlY3QgTkVXX0xFRFMKIAlkZXBlbmRzIG9uIEJBQ0tMSUdIVF9DTEFTU19ERVZJQ0UKIAlkZXBlbmRzIG9uIElOUFVUCiAJZGVwZW5kcyBvbiBSRktJTEwgfHwgUkZLSUxMID0gbgpAQCAtNTc2LDYgKzU4MiwxNSBAQAogCSAgc29tZSBlbWJlZGRlZCBJbnRlbCB4ODYgcGxhdGZvcm1zLiBUaGlzIGlzIG5vdCBuZWVkZWQgZm9yIFBDLXR5cGUKIAkgIG1hY2hpbmVzLgogCitjb25maWcgSU5URUxfU0NVX0lQQ19VVElMCisJdHJpc3RhdGUgIkludGVsIFNDVSBJUEMgdXRpbGl0eSBkcml2ZXIiCisJZGVwZW5kcyBvbiBJTlRFTF9TQ1VfSVBDCisJZGVmYXVsdCB5CisJLS0taGVscC0tLQorCSAgVGhlIElQQyBVdGlsIGRyaXZlciBwcm92aWRlcyBhbiBpbnRlcmZhY2Ugd2l0aCB0aGUgU0NVIGVuYWJsaW5nCisJICBsb3cgbGV2ZWwgYWNjZXNzIGZvciBkZWJ1ZyB3b3JrIGFuZCB1cGRhdGluZyB0aGUgZmlybXdhcmUuIFNheQorCSAgTiB1bmxlc3MgeW91IHdpbGwgYmUgZG9pbmcgdGhpcyBvbiBhbiBJbnRlbCBNSUQgcGxhdGZvcm0uCisKIGNvbmZpZyBHUElPX0lOVEVMX1BNSUMKIAlib29sICJJbnRlbCBQTUlDIEdQSU8gc3VwcG9ydCIKIAlkZXBlbmRzIG9uIElOVEVMX1NDVV9JUEMgJiYgR1BJT0xJQgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wbGF0Zm9ybS94ODYvTWFrZWZpbGUgYi9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9NYWtlZmlsZQppbmRleCA5OTUwY2NjLi40ZWM0ZmY4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9NYWtlZmlsZQpAQCAtMjgsNiArMjgsNyBAQAogb2JqLSQoQ09ORklHX0FDUElfVE9TSElCQSkJKz0gdG9zaGliYV9hY3BpLm8KIG9iai0kKENPTkZJR19UT1NISUJBX0JUX1JGS0lMTCkJKz0gdG9zaGliYV9ibHVldG9vdGgubwogb2JqLSQoQ09ORklHX0lOVEVMX1NDVV9JUEMpCSs9IGludGVsX3NjdV9pcGMubworb2JqLSQoQ09ORklHX0lOVEVMX1NDVV9JUENfVVRJTCkrPSBpbnRlbF9zY3VfaXBjdXRpbC5vCiBvYmotJChDT05GSUdfUkFSX1JFR0lTVEVSKQkrPSBpbnRlbF9yYXJfcmVnaXN0ZXIubwogb2JqLSQoQ09ORklHX0lOVEVMX0lQUykJCSs9IGludGVsX2lwcy5vCiBvYmotJChDT05GSUdfR1BJT19JTlRFTF9QTUlDKQkrPSBpbnRlbF9wbWljX2dwaW8ubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wbGF0Zm9ybS94ODYvYWNlci13bWkuYyBiL2RyaXZlcnMvcGxhdGZvcm0veDg2L2FjZXItd21pLmMKaW5kZXggYzhjNjUzNy4uZWU0MGQ2OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wbGF0Zm9ybS94ODYvYWNlci13bWkuYworKysgYi9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9hY2VyLXdtaS5jCkBAIC0zNyw2ICszNyw5IEBACiAjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CiAjaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgorI2luY2x1ZGUgPGxpbnV4L2lucHV0L3NwYXJzZS1rZXltYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWkuaD4KIAogI2luY2x1ZGUgPGFjcGkvYWNwaV9kcml2ZXJzLmg+CiAKQEAgLTQ4LDYgKzUxLDcgQEAKICNkZWZpbmUgQUNFUl9FUlIgS0VSTl9FUlIgQUNFUl9MT0dQUkVGSVgKICNkZWZpbmUgQUNFUl9OT1RJQ0UgS0VSTl9OT1RJQ0UgQUNFUl9MT0dQUkVGSVgKICNkZWZpbmUgQUNFUl9JTkZPIEtFUk5fSU5GTyBBQ0VSX0xPR1BSRUZJWAorI2RlZmluZSBBQ0VSX1dBUk5JTkcgS0VSTl9XQVJOSU5HIEFDRVJfTE9HUFJFRklYCiAKIC8qCiAgKiBNYWdpYyBOdW1iZXIKQEAgLTgyLDkgKzg2LDgyIEBACiAjZGVmaW5lIEFNVzBfR1VJRDIJCSI0MzFGMTZFRC0wQzJCLTQ0NEMtQjI2Ny0yN0RFQjE0MENGOUMiCiAjZGVmaW5lIFdNSURfR1VJRDEJCSI2QUY0RjI1OC1CNDAxLTQyZmQtQkU5MS0zRDRBQzJEN0MwRDMiCiAjZGVmaW5lIFdNSURfR1VJRDIJCSI5NTc2NEUwOS1GQjU2LTRlODMtQjMxQS0zNzc2MUY2MDk5NEEiCisjZGVmaW5lIFdNSURfR1VJRDMJCSI2MUVGNjlFQS04NjVDLTRCQzMtQTUwMi1BMERFQkEwQ0I1MzEiCisKKy8qCisgKiBBY2VyIEFDUEkgZXZlbnQgR1VJRHMKKyAqLworI2RlZmluZSBBQ0VSV01JRF9FVkVOVF9HVUlEICI2NzZBQTE1RS02QTQ3LTREOUYtQTJDQy0xRTZEMThEMTQwMjYiCiAKIE1PRFVMRV9BTElBUygid21pOjY3QzMzNzFELTk1QTMtNEMzNy1CQjYxLURENDdCNDkxREFBQiIpOwogTU9EVUxFX0FMSUFTKCJ3bWk6NkFGNEYyNTgtQjQwMS00MmZkLUJFOTEtM0Q0QUMyRDdDMEQzIik7CitNT0RVTEVfQUxJQVMoIndtaTo2NzZBQTE1RS02QTQ3LTREOUYtQTJDQy0xRTZEMThEMTQwMjYiKTsKKworZW51bSBhY2VyX3dtaV9ldmVudF9pZHMgeworCVdNSURfSE9US0VZX0VWRU5UID0gMHgxLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBrZXlfZW50cnkgYWNlcl93bWlfa2V5bWFwW10gPSB7CisJe0tFX0tFWSwgMHgwMSwge0tFWV9XTEFOfSB9LCAgICAgLyogV2lGaSAqLworCXtLRV9LRVksIDB4MTIsIHtLRVlfQkxVRVRPT1RIfSB9LAkvKiBCVCAqLworCXtLRV9LRVksIDB4MjEsIHtLRVlfUFJPRzF9IH0sICAgIC8qIEJhY2t1cCAqLworCXtLRV9LRVksIDB4MjIsIHtLRVlfUFJPRzJ9IH0sICAgIC8qIEFyY2FkZSAqLworCXtLRV9LRVksIDB4MjMsIHtLRVlfUFJPRzN9IH0sICAgIC8qIFBfS2V5ICovCisJe0tFX0tFWSwgMHgyNCwge0tFWV9QUk9HNH0gfSwgICAgLyogU29jaWFsIG5ldHdvcmtpbmdfS2V5ICovCisJe0tFX0tFWSwgMHg2NCwge0tFWV9TV0lUQ0hWSURFT01PREV9IH0sCS8qIERpc3BsYXkgU3dpdGNoICovCisJe0tFX0tFWSwgMHg4Miwge0tFWV9GMjJ9IH0sICAgICAgLyogVG91Y2ggUGFkIE9uL09mZiAqLworCXtLRV9FTkQsIDB9Cit9OworCitzdGF0aWMgc3RydWN0IGlucHV0X2RldiAqYWNlcl93bWlfaW5wdXRfZGV2OworCitzdHJ1Y3QgZXZlbnRfcmV0dXJuX3ZhbHVlIHsKKwl1OCBmdW5jdGlvbjsKKwl1OCBrZXlfbnVtOworCXUxNiBkZXZpY2Vfc3RhdGU7CisJdTMyIHJlc2VydmVkOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworLyoKKyAqIEdVSUQzIEdldCBEZXZpY2UgU3RhdHVzIGRldmljZSBmbGFncworICovCisjZGVmaW5lIEFDRVJfV01JRDNfR0RTX1dJUkVMRVNTCQkoMTw8MCkJLyogV2lGaSAqLworI2RlZmluZSBBQ0VSX1dNSUQzX0dEU19USFJFRUcJCSgxPDw2KQkvKiAzRyAqLworI2RlZmluZSBBQ0VSX1dNSUQzX0dEU19CTFVFVE9PVEgJKDE8PDExKQkvKiBCVCAqLworCitzdHJ1Y3QgbG1faW5wdXRfcGFyYW1zIHsKKwl1OCBmdW5jdGlvbl9udW07ICAgICAgICAvKiBGdW5jdGlvbiBOdW1iZXIgKi8KKwl1MTYgY29tbXVuX2RldmljZXM7ICAgICAvKiBDb21tdW5pY2F0aW9uIHR5cGUgZGV2aWNlcyBkZWZhdWx0IHN0YXR1cyAqLworCXUxNiBkZXZpY2VzOyAgICAgICAgICAgIC8qIE90aGVyIHR5cGUgZGV2aWNlcyBkZWZhdWx0IHN0YXR1cyAqLworCXU4IGxtX3N0YXR1czsgICAgICAgICAgIC8qIExhdW5jaCBNYW5hZ2VyIFN0YXR1cyAqLworCXUxNiByZXNlcnZlZDsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0cnVjdCBsbV9yZXR1cm5fdmFsdWUgeworCXU4IGVycm9yX2NvZGU7ICAgICAgICAgIC8qIEVycm9yIENvZGUgKi8KKwl1OCBlY19yZXR1cm5fdmFsdWU7ICAgICAvKiBFQyBSZXR1cm4gVmFsdWUgKi8KKwl1MTYgcmVzZXJ2ZWQ7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3Qgd21pZDNfZ2RzX2lucHV0X3BhcmFtIHsJLyogR2V0IERldmljZSBTdGF0dXMgaW5wdXQgcGFyYW1ldGVyICovCisJdTggZnVuY3Rpb25fbnVtOwkvKiBGdW5jdGlvbiBOdW1iZXIgKi8KKwl1OCBob3RrZXlfbnVtYmVyOwkvKiBIb3RrZXkgTnVtYmVyICovCisJdTE2IGRldmljZXM7CQkvKiBHZXQgRGV2aWNlICovCit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3Qgd21pZDNfZ2RzX3JldHVybl92YWx1ZSB7CS8qIEdldCBEZXZpY2UgU3RhdHVzIHJldHVybiB2YWx1ZSovCisJdTggZXJyb3JfY29kZTsJCS8qIEVycm9yIENvZGUgKi8KKwl1OCBlY19yZXR1cm5fdmFsdWU7CS8qIEVDIFJldHVybiBWYWx1ZSAqLworCXUxNiBkZXZpY2VzOwkJLyogQ3VycmVudCBEZXZpY2UgU3RhdHVzICovCisJdTMyIHJlc2VydmVkOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IGhvdGtleV9mdW5jdGlvbl90eXBlX2FhIHsKKwl1OCB0eXBlOworCXU4IGxlbmd0aDsKKwl1MTYgaGFuZGxlOworCXUxNiBjb21tdW5fZnVuY19iaXRtYXA7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCiAvKgogICogSW50ZXJmYWNlIGNhcGFiaWxpdHkgZmxhZ3MKQEAgLTExNiwxNSArMTkzLDE5IEBACiBzdGF0aWMgaW50IGJyaWdodG5lc3MgPSAtMTsKIHN0YXRpYyBpbnQgdGhyZWVnID0gLTE7CiBzdGF0aWMgaW50IGZvcmNlX3NlcmllczsKK3N0YXRpYyBib29sIGVjX3Jhd19tb2RlOworc3RhdGljIGJvb2wgaGFzX3R5cGVfYWE7CiAKIG1vZHVsZV9wYXJhbShtYWlsbGVkLCBpbnQsIDA0NDQpOwogbW9kdWxlX3BhcmFtKGJyaWdodG5lc3MsIGludCwgMDQ0NCk7CiBtb2R1bGVfcGFyYW0odGhyZWVnLCBpbnQsIDA0NDQpOwogbW9kdWxlX3BhcmFtKGZvcmNlX3NlcmllcywgaW50LCAwNDQ0KTsKK21vZHVsZV9wYXJhbShlY19yYXdfbW9kZSwgYm9vbCwgMDQ0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKG1haWxsZWQsICJTZXQgaW5pdGlhbCBzdGF0ZSBvZiBNYWlsIExFRCIpOwogTU9EVUxFX1BBUk1fREVTQyhicmlnaHRuZXNzLCAiU2V0IGluaXRpYWwgTENEIGJhY2tsaWdodCBicmlnaHRuZXNzIik7CiBNT0RVTEVfUEFSTV9ERVNDKHRocmVlZywgIlNldCBpbml0aWFsIHN0YXRlIG9mIDNHIGhhcmR3YXJlIik7CiBNT0RVTEVfUEFSTV9ERVNDKGZvcmNlX3NlcmllcywgIkZvcmNlIGEgZGlmZmVyZW50IGxhcHRvcCBzZXJpZXMiKTsKK01PRFVMRV9QQVJNX0RFU0MoZWNfcmF3X21vZGUsICJFbmFibGUgRUMgcmF3IG1vZGUiKTsKIAogc3RydWN0IGFjZXJfZGF0YSB7CiAJaW50IG1haWxsZWQ7CkBAIC0xNDAsNiArMjIxLDcgQEAKIAogc3RhdGljIHN0cnVjdCByZmtpbGwgKndpcmVsZXNzX3Jma2lsbDsKIHN0YXRpYyBzdHJ1Y3QgcmZraWxsICpibHVldG9vdGhfcmZraWxsOworc3RhdGljIHN0cnVjdCByZmtpbGwgKnRocmVlZ19yZmtpbGw7CiAKIC8qIEVhY2ggbG93LWxldmVsIGludGVyZmFjZSBtdXN0IGRlZmluZSBhdCBsZWFzdCBzb21lIG9mIHRoZSBmb2xsb3dpbmcgKi8KIHN0cnVjdCB3bWlfaW50ZXJmYWNlIHsKQEAgLTc1Myw2ICs4MzUsMjggQEAKIAlyZXR1cm4gV01JX2V4ZWN1dGVfdTMyKG1ldGhvZF9pZCwgKHUzMil2YWx1ZSwgTlVMTCk7CiB9CiAKK3N0YXRpYyB2b2lkIHR5cGVfYWFfZG1pX2RlY29kZShjb25zdCBzdHJ1Y3QgZG1pX2hlYWRlciAqaGVhZGVyLCB2b2lkICpkdW1teSkKK3sKKwlzdHJ1Y3QgaG90a2V5X2Z1bmN0aW9uX3R5cGVfYWEgKnR5cGVfYWE7CisKKwkvKiBXZSBhcmUgbG9va2luZyBmb3IgT0VNLXNwZWNpZmljIFR5cGUgQUFoICovCisJaWYgKGhlYWRlci0+dHlwZSAhPSAweEFBKQorCQlyZXR1cm47CisKKwloYXNfdHlwZV9hYSA9IHRydWU7CisJdHlwZV9hYSA9IChzdHJ1Y3QgaG90a2V5X2Z1bmN0aW9uX3R5cGVfYWEgKikgaGVhZGVyOworCisJcHJpbnRrKEFDRVJfSU5GTyAiRnVuY3Rpb24gYml0bWFwIGZvciBDb21tdW5pY2F0aW9uIEJ1dHRvbjogMHgleFxuIiwKKwkJdHlwZV9hYS0+Y29tbXVuX2Z1bmNfYml0bWFwKTsKKworCWlmICh0eXBlX2FhLT5jb21tdW5fZnVuY19iaXRtYXAgJiBBQ0VSX1dNSUQzX0dEU19XSVJFTEVTUykKKwkJaW50ZXJmYWNlLT5jYXBhYmlsaXR5IHw9IEFDRVJfQ0FQX1dJUkVMRVNTOworCWlmICh0eXBlX2FhLT5jb21tdW5fZnVuY19iaXRtYXAgJiBBQ0VSX1dNSUQzX0dEU19USFJFRUcpCisJCWludGVyZmFjZS0+Y2FwYWJpbGl0eSB8PSBBQ0VSX0NBUF9USFJFRUc7CisJaWYgKHR5cGVfYWEtPmNvbW11bl9mdW5jX2JpdG1hcCAmIEFDRVJfV01JRDNfR0RTX0JMVUVUT09USCkKKwkJaW50ZXJmYWNlLT5jYXBhYmlsaXR5IHw9IEFDRVJfQ0FQX0JMVUVUT09USDsKK30KKwogc3RhdGljIGFjcGlfc3RhdHVzIFdNSURfc2V0X2NhcGFiaWxpdGllcyh2b2lkKQogewogCXN0cnVjdCBhY3BpX2J1ZmZlciBvdXQgPSB7QUNQSV9BTExPQ0FURV9CVUZGRVIsIE5VTEx9OwpAQCAtNzczLDE2ICs4NzcsMTcgQEAKIAkJcmV0dXJuIEFFX0VSUk9SOwogCX0KIAotCS8qIE5vdCBzdXJlIG9uIHRoZSBtZWFuaW5nIG9mIHRoZSByZWxldmFudCBiaXRzIHlldCB0byBkZXRlY3QgdGhlc2UgKi8KLQlpbnRlcmZhY2UtPmNhcGFiaWxpdHkgfD0gQUNFUl9DQVBfV0lSRUxFU1M7Ci0JaW50ZXJmYWNlLT5jYXBhYmlsaXR5IHw9IEFDRVJfQ0FQX1RIUkVFRzsKKwlkbWlfd2Fsayh0eXBlX2FhX2RtaV9kZWNvZGUsIE5VTEwpOworCWlmICghaGFzX3R5cGVfYWEpIHsKKwkJaW50ZXJmYWNlLT5jYXBhYmlsaXR5IHw9IEFDRVJfQ0FQX1dJUkVMRVNTOworCQlpbnRlcmZhY2UtPmNhcGFiaWxpdHkgfD0gQUNFUl9DQVBfVEhSRUVHOworCQlpZiAoZGV2aWNlcyAmIDB4MTApCisJCQlpbnRlcmZhY2UtPmNhcGFiaWxpdHkgfD0gQUNFUl9DQVBfQkxVRVRPT1RIOworCX0KIAogCS8qIFdNSUQgYWx3YXlzIHByb3ZpZGVzIGJyaWdodG5lc3MgbWV0aG9kcyAqLwogCWludGVyZmFjZS0+Y2FwYWJpbGl0eSB8PSBBQ0VSX0NBUF9CUklHSFRORVNTOwogCi0JaWYgKGRldmljZXMgJiAweDEwKQotCQlpbnRlcmZhY2UtPmNhcGFiaWxpdHkgfD0gQUNFUl9DQVBfQkxVRVRPT1RIOwotCiAJaWYgKCEoZGV2aWNlcyAmIDB4MjApKQogCQltYXhfYnJpZ2h0bmVzcyA9IDB4OTsKIApAQCAtODYxLDcgKzk2Niw4IEBACiAJICogY2FwYWJpbGl0eSBpc24ndCBhdmFpbGFibGUgb24gdGhlIGdpdmVuIGludGVyZmFjZQogCSAqLwogCXNldF91MzIobWFpbGxlZCwgQUNFUl9DQVBfTUFJTExFRCk7Ci0Jc2V0X3UzMih0aHJlZWcsIEFDRVJfQ0FQX1RIUkVFRyk7CisJaWYgKCFoYXNfdHlwZV9hYSkKKwkJc2V0X3UzMih0aHJlZWcsIEFDRVJfQ0FQX1RIUkVFRyk7CiAJc2V0X3UzMihicmlnaHRuZXNzLCBBQ0VSX0NBUF9CUklHSFRORVNTKTsKIH0KIApAQCAtOTQ4LDYgKzEwNTQsNzkgQEAKIAliYWNrbGlnaHRfZGV2aWNlX3VucmVnaXN0ZXIoYWNlcl9iYWNrbGlnaHRfZGV2aWNlKTsKIH0KIAorc3RhdGljIGFjcGlfc3RhdHVzIHdtaWQzX2dldF9kZXZpY2Vfc3RhdHVzKHUzMiAqdmFsdWUsIHUxNiBkZXZpY2UpCit7CisJc3RydWN0IHdtaWQzX2dkc19yZXR1cm5fdmFsdWUgcmV0dXJuX3ZhbHVlOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwl1bmlvbiBhY3BpX29iamVjdCAqb2JqOworCXN0cnVjdCB3bWlkM19nZHNfaW5wdXRfcGFyYW0gcGFyYW1zID0geworCQkuZnVuY3Rpb25fbnVtID0gMHgxLAorCQkuaG90a2V5X251bWJlciA9IDB4MDEsCisJCS5kZXZpY2VzID0gZGV2aWNlLAorCX07CisJc3RydWN0IGFjcGlfYnVmZmVyIGlucHV0ID0geworCQlzaXplb2Yoc3RydWN0IHdtaWQzX2dkc19pbnB1dF9wYXJhbSksCisJCSZwYXJhbXMKKwl9OworCXN0cnVjdCBhY3BpX2J1ZmZlciBvdXRwdXQgPSB7IEFDUElfQUxMT0NBVEVfQlVGRkVSLCBOVUxMIH07CisKKwlzdGF0dXMgPSB3bWlfZXZhbHVhdGVfbWV0aG9kKFdNSURfR1VJRDMsIDAsIDB4MiwgJmlucHV0LCAmb3V0cHV0KTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpCisJCXJldHVybiBzdGF0dXM7CisKKwlvYmogPSBvdXRwdXQucG9pbnRlcjsKKworCWlmICghb2JqKQorCQlyZXR1cm4gQUVfRVJST1I7CisJZWxzZSBpZiAob2JqLT50eXBlICE9IEFDUElfVFlQRV9CVUZGRVIpIHsKKwkJa2ZyZWUob2JqKTsKKwkJcmV0dXJuIEFFX0VSUk9SOworCX0KKwlpZiAob2JqLT5idWZmZXIubGVuZ3RoICE9IDgpIHsKKwkJcHJpbnRrKEFDRVJfV0FSTklORyAiVW5rbm93biBidWZmZXIgbGVuZ3RoICVkXG4iLAorCQkJb2JqLT5idWZmZXIubGVuZ3RoKTsKKwkJa2ZyZWUob2JqKTsKKwkJcmV0dXJuIEFFX0VSUk9SOworCX0KKworCXJldHVybl92YWx1ZSA9ICooKHN0cnVjdCB3bWlkM19nZHNfcmV0dXJuX3ZhbHVlICopb2JqLT5idWZmZXIucG9pbnRlcik7CisJa2ZyZWUob2JqKTsKKworCWlmIChyZXR1cm5fdmFsdWUuZXJyb3JfY29kZSB8fCByZXR1cm5fdmFsdWUuZWNfcmV0dXJuX3ZhbHVlKQorCQlwcmludGsoQUNFUl9XQVJOSU5HICJHZXQgRGV2aWNlIFN0YXR1cyBmYWlsZWQ6ICIKKwkJCSIweCV4IC0gMHgleFxuIiwgcmV0dXJuX3ZhbHVlLmVycm9yX2NvZGUsCisJCQlyZXR1cm5fdmFsdWUuZWNfcmV0dXJuX3ZhbHVlKTsKKwllbHNlCisJCSp2YWx1ZSA9ICEhKHJldHVybl92YWx1ZS5kZXZpY2VzICYgZGV2aWNlKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBhY3BpX3N0YXR1cyBnZXRfZGV2aWNlX3N0YXR1cyh1MzIgKnZhbHVlLCB1MzIgY2FwKQoreworCWlmICh3bWlfaGFzX2d1aWQoV01JRF9HVUlEMykpIHsKKwkJdTE2IGRldmljZTsKKworCQlzd2l0Y2ggKGNhcCkgeworCQljYXNlIEFDRVJfQ0FQX1dJUkVMRVNTOgorCQkJZGV2aWNlID0gQUNFUl9XTUlEM19HRFNfV0lSRUxFU1M7CisJCQlicmVhazsKKwkJY2FzZSBBQ0VSX0NBUF9CTFVFVE9PVEg6CisJCQlkZXZpY2UgPSBBQ0VSX1dNSUQzX0dEU19CTFVFVE9PVEg7CisJCQlicmVhazsKKwkJY2FzZSBBQ0VSX0NBUF9USFJFRUc6CisJCQlkZXZpY2UgPSBBQ0VSX1dNSUQzX0dEU19USFJFRUc7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiBBRV9FUlJPUjsKKwkJfQorCQlyZXR1cm4gd21pZDNfZ2V0X2RldmljZV9zdGF0dXModmFsdWUsIGRldmljZSk7CisKKwl9IGVsc2UgeworCQlyZXR1cm4gZ2V0X3UzMih2YWx1ZSwgY2FwKTsKKwl9Cit9CisKIC8qCiAgKiBSZmtpbGwgZGV2aWNlcwogICovCkBAIC05NjgsNiArMTE0NywxMyBAQAogCQkJcmZraWxsX3NldF9zd19zdGF0ZShibHVldG9vdGhfcmZraWxsLCAhc3RhdGUpOwogCX0KIAorCWlmIChoYXNfY2FwKEFDRVJfQ0FQX1RIUkVFRykgJiYgd21pX2hhc19ndWlkKFdNSURfR1VJRDMpKSB7CisJCXN0YXR1cyA9IHdtaWQzX2dldF9kZXZpY2Vfc3RhdHVzKCZzdGF0ZSwKKwkJCQlBQ0VSX1dNSUQzX0dEU19USFJFRUcpOworCQlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpCisJCQlyZmtpbGxfc2V0X3N3X3N0YXRlKHRocmVlZ19yZmtpbGwsICFzdGF0ZSk7CisJfQorCiAJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZhY2VyX3Jma2lsbF93b3JrLCByb3VuZF9qaWZmaWVzX3JlbGF0aXZlKEhaKSk7CiB9CiAKQEAgLTk5MSw2ICsxMTc3LDggQEAKIHsKIAlpbnQgZXJyOwogCXN0cnVjdCByZmtpbGwgKnJma2lsbF9kZXY7CisJdTMyIHN0YXRlOworCWFjcGlfc3RhdHVzIHN0YXR1czsKIAogCXJma2lsbF9kZXYgPSByZmtpbGxfYWxsb2MobmFtZSwgZGV2LCB0eXBlLAogCQkJCSAgJmFjZXJfcmZraWxsX29wcywKQEAgLTk5OCw2ICsxMTg2LDEwIEBACiAJaWYgKCFyZmtpbGxfZGV2KQogCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKIAorCXN0YXR1cyA9IGdldF9kZXZpY2Vfc3RhdHVzKCZzdGF0ZSwgY2FwKTsKKwlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpCisJCXJma2lsbF9pbml0X3N3X3N0YXRlKHJma2lsbF9kZXYsICFzdGF0ZSk7CisKIAllcnIgPSByZmtpbGxfcmVnaXN0ZXIocmZraWxsX2Rldik7CiAJaWYgKGVycikgewogCQlyZmtpbGxfZGVzdHJveShyZmtpbGxfZGV2KTsKQEAgLTEwMjQsNiArMTIxNiwxOSBAQAogCQl9CiAJfQogCisJaWYgKGhhc19jYXAoQUNFUl9DQVBfVEhSRUVHKSkgeworCQl0aHJlZWdfcmZraWxsID0gYWNlcl9yZmtpbGxfcmVnaXN0ZXIoZGV2LAorCQkJUkZLSUxMX1RZUEVfV1dBTiwgImFjZXItdGhyZWVnIiwKKwkJCUFDRVJfQ0FQX1RIUkVFRyk7CisJCWlmIChJU19FUlIodGhyZWVnX3Jma2lsbCkpIHsKKwkJCXJma2lsbF91bnJlZ2lzdGVyKHdpcmVsZXNzX3Jma2lsbCk7CisJCQlyZmtpbGxfZGVzdHJveSh3aXJlbGVzc19yZmtpbGwpOworCQkJcmZraWxsX3VucmVnaXN0ZXIoYmx1ZXRvb3RoX3Jma2lsbCk7CisJCQlyZmtpbGxfZGVzdHJveShibHVldG9vdGhfcmZraWxsKTsKKwkJCXJldHVybiBQVFJfRVJSKHRocmVlZ19yZmtpbGwpOworCQl9CisJfQorCiAJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZhY2VyX3Jma2lsbF93b3JrLCByb3VuZF9qaWZmaWVzX3JlbGF0aXZlKEhaKSk7CiAKIAlyZXR1cm4gMDsKQEAgLTEwNDAsNiArMTI0NSwxMSBAQAogCQlyZmtpbGxfdW5yZWdpc3RlcihibHVldG9vdGhfcmZraWxsKTsKIAkJcmZraWxsX2Rlc3Ryb3koYmx1ZXRvb3RoX3Jma2lsbCk7CiAJfQorCisJaWYgKGhhc19jYXAoQUNFUl9DQVBfVEhSRUVHKSkgeworCQlyZmtpbGxfdW5yZWdpc3Rlcih0aHJlZWdfcmZraWxsKTsKKwkJcmZraWxsX2Rlc3Ryb3kodGhyZWVnX3Jma2lsbCk7CisJfQogCXJldHVybjsKIH0KIApAQCAtMTA1MCw3ICsxMjYwLDEyIEBACiAJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKIAl1MzIgcmVzdWx0OyBcCi0JYWNwaV9zdGF0dXMgc3RhdHVzID0gZ2V0X3UzMigmcmVzdWx0LCBBQ0VSX0NBUF9USFJFRUcpOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwlpZiAod21pX2hhc19ndWlkKFdNSURfR1VJRDMpKQorCQlzdGF0dXMgPSB3bWlkM19nZXRfZGV2aWNlX3N0YXR1cygmcmVzdWx0LAorCQkJCUFDRVJfV01JRDNfR0RTX1RIUkVFRyk7CisJZWxzZQorCQlzdGF0dXMgPSBnZXRfdTMyKCZyZXN1bHQsIEFDRVJfQ0FQX1RIUkVFRyk7CiAJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKQogCQlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgcmVzdWx0KTsKIAlyZXR1cm4gc3ByaW50ZihidWYsICJSZWFkIGVycm9yXG4iKTsKQEAgLTEwODUsNiArMTMwMCwxNzggQEAKIAogc3RhdGljIERFVklDRV9BVFRSKGludGVyZmFjZSwgU19JUlVHTywgc2hvd19pbnRlcmZhY2UsIE5VTEwpOwogCitzdGF0aWMgdm9pZCBhY2VyX3dtaV9ub3RpZnkodTMyIHZhbHVlLCB2b2lkICpjb250ZXh0KQoreworCXN0cnVjdCBhY3BpX2J1ZmZlciByZXNwb25zZSA9IHsgQUNQSV9BTExPQ0FURV9CVUZGRVIsIE5VTEwgfTsKKwl1bmlvbiBhY3BpX29iamVjdCAqb2JqOworCXN0cnVjdCBldmVudF9yZXR1cm5fdmFsdWUgcmV0dXJuX3ZhbHVlOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKworCXN0YXR1cyA9IHdtaV9nZXRfZXZlbnRfZGF0YSh2YWx1ZSwgJnJlc3BvbnNlKTsKKwlpZiAoc3RhdHVzICE9IEFFX09LKSB7CisJCXByaW50ayhBQ0VSX1dBUk5JTkcgImJhZCBldmVudCBzdGF0dXMgMHgleFxuIiwgc3RhdHVzKTsKKwkJcmV0dXJuOworCX0KKworCW9iaiA9ICh1bmlvbiBhY3BpX29iamVjdCAqKXJlc3BvbnNlLnBvaW50ZXI7CisKKwlpZiAoIW9iaikKKwkJcmV0dXJuOworCWlmIChvYmotPnR5cGUgIT0gQUNQSV9UWVBFX0JVRkZFUikgeworCQlwcmludGsoQUNFUl9XQVJOSU5HICJVbmtub3duIHJlc3BvbnNlIHJlY2VpdmVkICVkXG4iLAorCQkJb2JqLT50eXBlKTsKKwkJa2ZyZWUob2JqKTsKKwkJcmV0dXJuOworCX0KKwlpZiAob2JqLT5idWZmZXIubGVuZ3RoICE9IDgpIHsKKwkJcHJpbnRrKEFDRVJfV0FSTklORyAiVW5rbm93biBidWZmZXIgbGVuZ3RoICVkXG4iLAorCQkJb2JqLT5idWZmZXIubGVuZ3RoKTsKKwkJa2ZyZWUob2JqKTsKKwkJcmV0dXJuOworCX0KKworCXJldHVybl92YWx1ZSA9ICooKHN0cnVjdCBldmVudF9yZXR1cm5fdmFsdWUgKilvYmotPmJ1ZmZlci5wb2ludGVyKTsKKwlrZnJlZShvYmopOworCisJc3dpdGNoIChyZXR1cm5fdmFsdWUuZnVuY3Rpb24pIHsKKwljYXNlIFdNSURfSE9US0VZX0VWRU5UOgorCQlpZiAoIXNwYXJzZV9rZXltYXBfcmVwb3J0X2V2ZW50KGFjZXJfd21pX2lucHV0X2RldiwKKwkJCQlyZXR1cm5fdmFsdWUua2V5X251bSwgMSwgdHJ1ZSkpCisJCQlwcmludGsoQUNFUl9XQVJOSU5HICJVbmtub3duIGtleSBudW1iZXIgLSAweCV4XG4iLAorCQkJCXJldHVybl92YWx1ZS5rZXlfbnVtKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRrKEFDRVJfV0FSTklORyAiVW5rbm93biBmdW5jdGlvbiBudW1iZXIgLSAlZCAtICVkXG4iLAorCQkJcmV0dXJuX3ZhbHVlLmZ1bmN0aW9uLCByZXR1cm5fdmFsdWUua2V5X251bSk7CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIGFjcGlfc3RhdHVzCit3bWlkM19zZXRfbG1fbW9kZShzdHJ1Y3QgbG1faW5wdXRfcGFyYW1zICpwYXJhbXMsCisJCSAgc3RydWN0IGxtX3JldHVybl92YWx1ZSAqcmV0dXJuX3ZhbHVlKQoreworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwl1bmlvbiBhY3BpX29iamVjdCAqb2JqOworCisJc3RydWN0IGFjcGlfYnVmZmVyIGlucHV0ID0geyBzaXplb2Yoc3RydWN0IGxtX2lucHV0X3BhcmFtcyksIHBhcmFtcyB9OworCXN0cnVjdCBhY3BpX2J1ZmZlciBvdXRwdXQgPSB7IEFDUElfQUxMT0NBVEVfQlVGRkVSLCBOVUxMIH07CisKKwlzdGF0dXMgPSB3bWlfZXZhbHVhdGVfbWV0aG9kKFdNSURfR1VJRDMsIDAsIDB4MSwgJmlucHV0LCAmb3V0cHV0KTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpCisJCXJldHVybiBzdGF0dXM7CisKKwlvYmogPSBvdXRwdXQucG9pbnRlcjsKKworCWlmICghb2JqKQorCQlyZXR1cm4gQUVfRVJST1I7CisJZWxzZSBpZiAob2JqLT50eXBlICE9IEFDUElfVFlQRV9CVUZGRVIpIHsKKwkJa2ZyZWUob2JqKTsKKwkJcmV0dXJuIEFFX0VSUk9SOworCX0KKwlpZiAob2JqLT5idWZmZXIubGVuZ3RoICE9IDQpIHsKKwkJcHJpbnRrKEFDRVJfV0FSTklORyAiVW5rbm93biBidWZmZXIgbGVuZ3RoICVkXG4iLAorCQkgICAgICAgb2JqLT5idWZmZXIubGVuZ3RoKTsKKwkJa2ZyZWUob2JqKTsKKwkJcmV0dXJuIEFFX0VSUk9SOworCX0KKworCSpyZXR1cm5fdmFsdWUgPSAqKChzdHJ1Y3QgbG1fcmV0dXJuX3ZhbHVlICopb2JqLT5idWZmZXIucG9pbnRlcik7CisJa2ZyZWUob2JqKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgYWNlcl93bWlfZW5hYmxlX2VjX3Jhdyh2b2lkKQoreworCXN0cnVjdCBsbV9yZXR1cm5fdmFsdWUgcmV0dXJuX3ZhbHVlOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwlzdHJ1Y3QgbG1faW5wdXRfcGFyYW1zIHBhcmFtcyA9IHsKKwkJLmZ1bmN0aW9uX251bSA9IDB4MSwKKwkJLmNvbW11bl9kZXZpY2VzID0gMHhGRkZGLAorCQkuZGV2aWNlcyA9IDB4RkZGRiwKKwkJLmxtX3N0YXR1cyA9IDB4MDAsICAgICAgICAgICAgLyogTGF1bmNoIE1hbmFnZXIgRGVhY3RpdmUgKi8KKwl9OworCisJc3RhdHVzID0gd21pZDNfc2V0X2xtX21vZGUoJnBhcmFtcywgJnJldHVybl92YWx1ZSk7CisKKwlpZiAocmV0dXJuX3ZhbHVlLmVycm9yX2NvZGUgfHwgcmV0dXJuX3ZhbHVlLmVjX3JldHVybl92YWx1ZSkKKwkJcHJpbnRrKEFDRVJfV0FSTklORyAiRW5hYmxpbmcgRUMgcmF3IG1vZGUgZmFpbGVkOiAiCisJCSAgICAgICAiMHgleCAtIDB4JXhcbiIsIHJldHVybl92YWx1ZS5lcnJvcl9jb2RlLAorCQkgICAgICAgcmV0dXJuX3ZhbHVlLmVjX3JldHVybl92YWx1ZSk7CisJZWxzZQorCQlwcmludGsoQUNFUl9JTkZPICJFbmFibGVkIEVDIHJhdyBtb2RlIik7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IGFjZXJfd21pX2VuYWJsZV9sbSh2b2lkKQoreworCXN0cnVjdCBsbV9yZXR1cm5fdmFsdWUgcmV0dXJuX3ZhbHVlOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwlzdHJ1Y3QgbG1faW5wdXRfcGFyYW1zIHBhcmFtcyA9IHsKKwkJLmZ1bmN0aW9uX251bSA9IDB4MSwKKwkJLmNvbW11bl9kZXZpY2VzID0gMHhGRkZGLAorCQkuZGV2aWNlcyA9IDB4RkZGRiwKKwkJLmxtX3N0YXR1cyA9IDB4MDEsICAgICAgICAgICAgLyogTGF1bmNoIE1hbmFnZXIgQWN0aXZlICovCisJfTsKKworCXN0YXR1cyA9IHdtaWQzX3NldF9sbV9tb2RlKCZwYXJhbXMsICZyZXR1cm5fdmFsdWUpOworCisJaWYgKHJldHVybl92YWx1ZS5lcnJvcl9jb2RlIHx8IHJldHVybl92YWx1ZS5lY19yZXR1cm5fdmFsdWUpCisJCXByaW50ayhBQ0VSX1dBUk5JTkcgIkVuYWJsaW5nIExhdW5jaCBNYW5hZ2VyIGZhaWxlZDogIgorCQkgICAgICAgIjB4JXggLSAweCV4XG4iLCByZXR1cm5fdmFsdWUuZXJyb3JfY29kZSwKKwkJICAgICAgIHJldHVybl92YWx1ZS5lY19yZXR1cm5fdmFsdWUpOworCisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBfX2luaXQgYWNlcl93bWlfaW5wdXRfc2V0dXAodm9pZCkKK3sKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJaW50IGVycjsKKworCWFjZXJfd21pX2lucHV0X2RldiA9IGlucHV0X2FsbG9jYXRlX2RldmljZSgpOworCWlmICghYWNlcl93bWlfaW5wdXRfZGV2KQorCQlyZXR1cm4gLUVOT01FTTsKKworCWFjZXJfd21pX2lucHV0X2Rldi0+bmFtZSA9ICJBY2VyIFdNSSBob3RrZXlzIjsKKwlhY2VyX3dtaV9pbnB1dF9kZXYtPnBoeXMgPSAid21pL2lucHV0MCI7CisJYWNlcl93bWlfaW5wdXRfZGV2LT5pZC5idXN0eXBlID0gQlVTX0hPU1Q7CisKKwllcnIgPSBzcGFyc2Vfa2V5bWFwX3NldHVwKGFjZXJfd21pX2lucHV0X2RldiwgYWNlcl93bWlfa2V5bWFwLCBOVUxMKTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycl9mcmVlX2RldjsKKworCXN0YXR1cyA9IHdtaV9pbnN0YWxsX25vdGlmeV9oYW5kbGVyKEFDRVJXTUlEX0VWRU5UX0dVSUQsCisJCQkJCQlhY2VyX3dtaV9ub3RpZnksIE5VTEwpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQllcnIgPSAtRUlPOworCQlnb3RvIGVycl9mcmVlX2tleW1hcDsKKwl9CisKKwllcnIgPSBpbnB1dF9yZWdpc3Rlcl9kZXZpY2UoYWNlcl93bWlfaW5wdXRfZGV2KTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycl91bmluc3RhbGxfbm90aWZpZXI7CisKKwlyZXR1cm4gMDsKKworZXJyX3VuaW5zdGFsbF9ub3RpZmllcjoKKwl3bWlfcmVtb3ZlX25vdGlmeV9oYW5kbGVyKEFDRVJXTUlEX0VWRU5UX0dVSUQpOworZXJyX2ZyZWVfa2V5bWFwOgorCXNwYXJzZV9rZXltYXBfZnJlZShhY2VyX3dtaV9pbnB1dF9kZXYpOworZXJyX2ZyZWVfZGV2OgorCWlucHV0X2ZyZWVfZGV2aWNlKGFjZXJfd21pX2lucHV0X2Rldik7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgYWNlcl93bWlfaW5wdXRfZGVzdHJveSh2b2lkKQoreworCXdtaV9yZW1vdmVfbm90aWZ5X2hhbmRsZXIoQUNFUldNSURfRVZFTlRfR1VJRCk7CisJc3BhcnNlX2tleW1hcF9mcmVlKGFjZXJfd21pX2lucHV0X2Rldik7CisJaW5wdXRfdW5yZWdpc3Rlcl9kZXZpY2UoYWNlcl93bWlfaW5wdXRfZGV2KTsKK30KKwogLyoKICAqIGRlYnVnZnMgZnVuY3Rpb25zCiAgKi8KQEAgLTEzMjcsNiArMTcxNCwyNiBAQAogCQkgICAgICAgImdlbmVyaWMgdmlkZW8gZHJpdmVyXG4iKTsKIAl9CiAKKwlpZiAod21pX2hhc19ndWlkKFdNSURfR1VJRDMpKSB7CisJCWlmIChlY19yYXdfbW9kZSkgeworCQkJaWYgKEFDUElfRkFJTFVSRShhY2VyX3dtaV9lbmFibGVfZWNfcmF3KCkpKSB7CisJCQkJcHJpbnRrKEFDRVJfRVJSICJDYW5ub3QgZW5hYmxlIEVDIHJhdyBtb2RlXG4iKTsKKwkJCQlyZXR1cm4gLUVOT0RFVjsKKwkJCX0KKwkJfSBlbHNlIGlmIChBQ1BJX0ZBSUxVUkUoYWNlcl93bWlfZW5hYmxlX2xtKCkpKSB7CisJCQlwcmludGsoQUNFUl9FUlIgIkNhbm5vdCBlbmFibGUgTGF1bmNoIE1hbmFnZXIgbW9kZVxuIik7CisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJfQorCX0gZWxzZSBpZiAoZWNfcmF3X21vZGUpIHsKKwkJcHJpbnRrKEFDRVJfSU5GTyAiTm8gV01JRCBFQyByYXcgbW9kZSBlbmFibGUgbWV0aG9kXG4iKTsKKwl9CisKKwlpZiAod21pX2hhc19ndWlkKEFDRVJXTUlEX0VWRU5UX0dVSUQpKSB7CisJCWVyciA9IGFjZXJfd21pX2lucHV0X3NldHVwKCk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCX0KKwogCWVyciA9IHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmYWNlcl9wbGF0Zm9ybV9kcml2ZXIpOwogCWlmIChlcnIpIHsKIAkJcHJpbnRrKEFDRVJfRVJSICJVbmFibGUgdG8gcmVnaXN0ZXIgcGxhdGZvcm0gZHJpdmVyLlxuIik7CkBAIC0xMzY4LDExICsxNzc1LDE3IEBACiBlcnJvcl9kZXZpY2VfYWxsb2M6CiAJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmFjZXJfcGxhdGZvcm1fZHJpdmVyKTsKIGVycm9yX3BsYXRmb3JtX3JlZ2lzdGVyOgorCWlmICh3bWlfaGFzX2d1aWQoQUNFUldNSURfRVZFTlRfR1VJRCkpCisJCWFjZXJfd21pX2lucHV0X2Rlc3Ryb3koKTsKKwogCXJldHVybiBlcnI7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBhY2VyX3dtaV9leGl0KHZvaWQpCiB7CisJaWYgKHdtaV9oYXNfZ3VpZChBQ0VSV01JRF9FVkVOVF9HVUlEKSkKKwkJYWNlcl93bWlfaW5wdXRfZGVzdHJveSgpOworCiAJcmVtb3ZlX3N5c2ZzKGFjZXJfcGxhdGZvcm1fZGV2aWNlKTsKIAlyZW1vdmVfZGVidWdmcygpOwogCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKGFjZXJfcGxhdGZvcm1fZGV2aWNlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGxhdGZvcm0veDg2L2NsYXNzbWF0ZS1sYXB0b3AuYyBiL2RyaXZlcnMvcGxhdGZvcm0veDg2L2NsYXNzbWF0ZS1sYXB0b3AuYwppbmRleCAzNDFjYmZlLi45MTExMzU0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9jbGFzc21hdGUtbGFwdG9wLmMKKysrIGIvZHJpdmVycy9wbGF0Zm9ybS94ODYvY2xhc3NtYXRlLWxhcHRvcC5jCkBAIC01MjIsMTggKzUyMiwyMCBAQAogCWFjcGlfc3RhdHVzIHN0YXR1czsKIAlhY3BpX2hhbmRsZSBoYW5kbGU7CiAJdW5zaWduZWQgbG9uZyBsb25nIHN0YXRlOworCWJvb2wgaXNfYmxvY2tlZDsKIAogCWhhbmRsZSA9IGRhdGE7CiAJc3RhdHVzID0gY21wY19nZXRfcmZraWxsX3dsYW4oaGFuZGxlLCAmc3RhdGUpOwogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkKIAkJcmV0dXJuIC1FTk9ERVY7Ci0JaWYgKGJsb2NrZWQpCi0JCXN0YXRlICY9IH4xOwotCWVsc2UKLQkJc3RhdGUgfD0gMTsKLQlzdGF0dXMgPSBjbXBjX3NldF9yZmtpbGxfd2xhbihoYW5kbGUsIHN0YXRlKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpCi0JCXJldHVybiAtRU5PREVWOworCS8qIENoZWNrIGlmIHdlIHJlYWxseSBuZWVkIHRvIGNhbGwgY21wY19zZXRfcmZraWxsX3dsYW4gKi8KKwlpc19ibG9ja2VkID0gc3RhdGUgJiAxID8gZmFsc2UgOiB0cnVlOworCWlmIChpc19ibG9ja2VkICE9IGJsb2NrZWQpIHsKKwkJc3RhdGUgPSBibG9ja2VkID8gMCA6IDE7CisJCXN0YXR1cyA9IGNtcGNfc2V0X3Jma2lsbF93bGFuKGhhbmRsZSwgc3RhdGUpOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpCisJCQlyZXR1cm4gLUVOT0RFVjsKKwl9CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTY1Myw4ICs2NTUsOSBAQAogCiAJaWYgKChldmVudCAmIDB4MEYpIDwgQVJSQVlfU0laRShjbXBjX2tleXNfY29kZXMpKQogCQljb2RlID0gY21wY19rZXlzX2NvZGVzW2V2ZW50ICYgMHgwRl07Ci0JaW5wdXRkZXYgPSBkZXZfZ2V0X2RydmRhdGEoJmRldi0+ZGV2KTs7CisJaW5wdXRkZXYgPSBkZXZfZ2V0X2RydmRhdGEoJmRldi0+ZGV2KTsKIAlpbnB1dF9yZXBvcnRfa2V5KGlucHV0ZGV2LCBjb2RlLCAhKGV2ZW50ICYgMHgxMCkpOworCWlucHV0X3N5bmMoaW5wdXRkZXYpOwogfQogCiBzdGF0aWMgdm9pZCBjbXBjX2tleXNfaWRldl9pbml0KHN0cnVjdCBpbnB1dF9kZXYgKmlucHV0ZGV2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wbGF0Zm9ybS94ODYvY29tcGFsLWxhcHRvcC5jIGIvZHJpdmVycy9wbGF0Zm9ybS94ODYvY29tcGFsLWxhcHRvcC5jCmluZGV4IDA5NzA4M2MuLjAzNDU3MmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGxhdGZvcm0veDg2L2NvbXBhbC1sYXB0b3AuYworKysgYi9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9jb21wYWwtbGFwdG9wLmMKQEAgLTg3Miw2ICs4NzIsMTQgQEAKIAkJfSwKIAkJLmNhbGxiYWNrID0gZG1pX2NoZWNrX2NiX2V4dHJhCiAJfSwKKwl7CisJCS5pZGVudCA9ICJLSExCMiIsCisJCS5tYXRjaGVzID0geworCQkJRE1JX01BVENIKERNSV9CT0FSRF9OQU1FLCAiS0hMQjIiKSwKKwkJCURNSV9NQVRDSChETUlfQk9BUkRfVkVSU0lPTiwgIlJFRkVSRU5DRSIpLAorCQl9LAorCQkuY2FsbGJhY2sgPSBkbWlfY2hlY2tfY2JfZXh0cmEKKwl9LAogCXsgfQogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wbGF0Zm9ybS94ODYvZWVlcGMtbGFwdG9wLmMgYi9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9lZWVwYy1sYXB0b3AuYwppbmRleCBiMmVkZmRjLi5lOWZjNTMwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9lZWVwYy1sYXB0b3AuYworKysgYi9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9lZWVwYy1sYXB0b3AuYwpAQCAtNTI5LDYgKzUyOSwxNSBAQAogCXF1ZXVlX3dvcmsoZWVlcGMtPmxlZF93b3JrcXVldWUsICZlZWVwYy0+dHBkX2xlZF93b3JrKTsKIH0KIAorc3RhdGljIGVudW0gbGVkX2JyaWdodG5lc3MgdHBkX2xlZF9nZXQoc3RydWN0IGxlZF9jbGFzc2RldiAqbGVkX2NkZXYpCit7CisJc3RydWN0IGVlZXBjX2xhcHRvcCAqZWVlcGM7CisKKwllZWVwYyA9IGNvbnRhaW5lcl9vZihsZWRfY2Rldiwgc3RydWN0IGVlZXBjX2xhcHRvcCwgdHBkX2xlZCk7CisKKwlyZXR1cm4gZ2V0X2FjcGkoZWVlcGMsIENNX0FTTF9UUEQpOworfQorCiBzdGF0aWMgaW50IGVlZXBjX2xlZF9pbml0KHN0cnVjdCBlZWVwY19sYXB0b3AgKmVlZXBjKQogewogCWludCBydjsKQEAgLTU0Myw2ICs1NTIsOCBAQAogCiAJZWVlcGMtPnRwZF9sZWQubmFtZSA9ICJlZWVwYzo6dG91Y2hwYWQiOwogCWVlZXBjLT50cGRfbGVkLmJyaWdodG5lc3Nfc2V0ID0gdHBkX2xlZF9zZXQ7CisJaWYgKGdldF9hY3BpKGVlZXBjLCBDTV9BU0xfVFBEKSA+PSAwKSAvKiBpZiBtZXRob2QgaXMgYXZhaWxhYmxlICovCisJICBlZWVwYy0+dHBkX2xlZC5icmlnaHRuZXNzX2dldCA9IHRwZF9sZWRfZ2V0OwogCWVlZXBjLT50cGRfbGVkLm1heF9icmlnaHRuZXNzID0gMTsKIAogCXJ2ID0gbGVkX2NsYXNzZGV2X3JlZ2lzdGVyKCZlZWVwYy0+cGxhdGZvcm1fZGV2aWNlLT5kZXYsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9lZWVwYy13bWkuYyBiL2RyaXZlcnMvcGxhdGZvcm0veDg2L2VlZXBjLXdtaS5jCmluZGV4IDBkNTBmYmIuLjRkMzhmOTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGxhdGZvcm0veDg2L2VlZXBjLXdtaS5jCisrKyBiL2RyaXZlcnMvcGxhdGZvcm0veDg2L2VlZXBjLXdtaS5jCkBAIC0yLDYgKzIsNyBAQAogICogRWVlIFBDIFdNSSBob3RrZXkgZHJpdmVyCiAgKgogICogQ29weXJpZ2h0KEMpIDIwMTAgSW50ZWwgQ29ycG9yYXRpb24uCisgKiBDb3B5cmlnaHQoQykgMjAxMCBDb3JlbnRpbiBDaGFyeSA8Y29yZW50aW4uY2hhcnlAZ21haWwuY29tPgogICoKICAqIFBvcnRpb25zIGJhc2VkIG9uIHdpc3Ryb25fYnRucy5jOgogICogQ29weXJpZ2h0IChDKSAyMDA1IE1pbG9zbGF2IFRybWFjIDxtaXRyQHZvbG55LmN6PgpAQCAtMzQsNiArMzUsMTAgQEAKICNpbmNsdWRlIDxsaW51eC9pbnB1dC9zcGFyc2Uta2V5bWFwLmg+CiAjaW5jbHVkZSA8bGludXgvZmIuaD4KICNpbmNsdWRlIDxsaW51eC9iYWNrbGlnaHQuaD4KKyNpbmNsdWRlIDxsaW51eC9sZWRzLmg+CisjaW5jbHVkZSA8bGludXgvcmZraWxsLmg+CisjaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8YWNwaS9hY3BpX2J1cy5oPgogI2luY2x1ZGUgPGFjcGkvYWNwaV9kcml2ZXJzLmg+CkBAIC00NCw2ICs0OSw4IEBACiBNT0RVTEVfREVTQ1JJUFRJT04oIkVlZSBQQyBXTUkgSG90a2V5IERyaXZlciIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogCisjZGVmaW5lIEVFRVBDX0FDUElfSElECQkiQVNVUzAxMCIgLyogb2xkIF9ISUQgdXNlZCBpbiBlZWVwYy1sYXB0b3AgKi8KKwogI2RlZmluZSBFRUVQQ19XTUlfRVZFTlRfR1VJRAkiQUJCQzBGNzItOEVBMS0xMUQxLTAwQTAtQzkwNjI5MTAwMDAwIgogI2RlZmluZSBFRUVQQ19XTUlfTUdNVF9HVUlECSI5Nzg0NUVEMC00RTZELTExREUtOEEzOS0wODAwMjAwQzlBNjYiCiAKQEAgLTYwLDYgKzY3LDEwIEBACiAjZGVmaW5lIEVFRVBDX1dNSV9NRVRIT0RJRF9DRlZTCTB4NTM1NjQ2NDMKIAogI2RlZmluZSBFRUVQQ19XTUlfREVWSURfQkFDS0xJR0hUCTB4MDAwNTAwMTIKKyNkZWZpbmUgRUVFUENfV01JX0RFVklEX1RQRExFRAkJMHgwMDEwMDAxMQorI2RlZmluZSBFRUVQQ19XTUlfREVWSURfV0xBTgkJMHgwMDAxMDAxMQorI2RlZmluZSBFRUVQQ19XTUlfREVWSURfQkxVRVRPT1RICTB4MDAwMTAwMTMKKyNkZWZpbmUgRUVFUENfV01JX0RFVklEX1dXQU4zRwkJMHgwMDAxMDAxOQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGtleV9lbnRyeSBlZWVwY193bWlfa2V5bWFwW10gPSB7CiAJLyogU2xlZXAgYWxyZWFkeSBoYW5kbGVkIHZpYSBnZW5lcmljIEFDUEkgY29kZSAqLwpAQCAtODMsMTEgKzk0LDM3IEBACiAJdTMyCWN0cmxfcGFyYW07CiB9OwogCisvKgorICogZWVlcGMtd21pLyAgICAtIGRlYnVnZnMgcm9vdCBkaXJlY3RvcnkKKyAqICAgZGV2X2lkICAgICAgLSBjdXJyZW50IGRldl9pZAorICogICBjdHJsX3BhcmFtICAtIGN1cnJlbnQgY3RybF9wYXJhbQorICogICBkZXZzICAgICAgICAtIGNhbGwgREVWUyhkZXZfaWQsIGN0cmxfcGFyYW0pIGFuZCBwcmludCByZXN1bHQKKyAqICAgZHN0cyAgICAgICAgLSBjYWxsIERTVFMoZGV2X2lkKSAgYW5kIHByaW50IHJlc3VsdAorICovCitzdHJ1Y3QgZWVlcGNfd21pX2RlYnVnIHsKKwlzdHJ1Y3QgZGVudHJ5ICpyb290OworCXUzMiBkZXZfaWQ7CisJdTMyIGN0cmxfcGFyYW07Cit9OworCiBzdHJ1Y3QgZWVlcGNfd21pIHsKIAlzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dGRldjsKIAlzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZSAqYmFja2xpZ2h0X2RldmljZTsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwbGF0Zm9ybV9kZXZpY2U7CisKKwlzdHJ1Y3QgbGVkX2NsYXNzZGV2IHRwZF9sZWQ7CisJaW50IHRwZF9sZWRfd2s7CisJc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKmxlZF93b3JrcXVldWU7CisJc3RydWN0IHdvcmtfc3RydWN0IHRwZF9sZWRfd29yazsKKworCXN0cnVjdCByZmtpbGwgKndsYW5fcmZraWxsOworCXN0cnVjdCByZmtpbGwgKmJsdWV0b290aF9yZmtpbGw7CisJc3RydWN0IHJma2lsbCAqd3dhbjNnX3Jma2lsbDsKKworCXN0cnVjdCBlZWVwY193bWlfZGVidWcgZGVidWc7CiB9OwogCisvKiBPbmx5IHVzZWQgaW4gZWVlcGNfd21pX2luaXQoKSBhbmQgZWVlcGNfd21pX2V4aXQoKSAqLwogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBsYXRmb3JtX2RldmljZTsKIAogc3RhdGljIGludCBlZWVwY193bWlfaW5wdXRfaW5pdChzdHJ1Y3QgZWVlcGNfd21pICplZWVwYykKQEAgLTEwMSw3ICsxMzgsNyBAQAogCWVlZXBjLT5pbnB1dGRldi0+bmFtZSA9ICJFZWUgUEMgV01JIGhvdGtleXMiOwogCWVlZXBjLT5pbnB1dGRldi0+cGh5cyA9IEVFRVBDX1dNSV9GSUxFICIvaW5wdXQwIjsKIAllZWVwYy0+aW5wdXRkZXYtPmlkLmJ1c3R5cGUgPSBCVVNfSE9TVDsKLQllZWVwYy0+aW5wdXRkZXYtPmRldi5wYXJlbnQgPSAmcGxhdGZvcm1fZGV2aWNlLT5kZXY7CisJZWVlcGMtPmlucHV0ZGV2LT5kZXYucGFyZW50ID0gJmVlZXBjLT5wbGF0Zm9ybV9kZXZpY2UtPmRldjsKIAogCWVyciA9IHNwYXJzZV9rZXltYXBfc2V0dXAoZWVlcGMtPmlucHV0ZGV2LCBlZWVwY193bWlfa2V5bWFwLCBOVUxMKTsKIAlpZiAoZXJyKQpAQCAtMTMwLDcgKzE2Nyw3IEBACiAJZWVlcGMtPmlucHV0ZGV2ID0gTlVMTDsKIH0KIAotc3RhdGljIGFjcGlfc3RhdHVzIGVlZXBjX3dtaV9nZXRfZGV2c3RhdGUodTMyIGRldl9pZCwgdTMyICpjdHJsX3BhcmFtKQorc3RhdGljIGFjcGlfc3RhdHVzIGVlZXBjX3dtaV9nZXRfZGV2c3RhdGUodTMyIGRldl9pZCwgdTMyICpyZXR2YWwpCiB7CiAJc3RydWN0IGFjcGlfYnVmZmVyIGlucHV0ID0geyAoYWNwaV9zaXplKXNpemVvZih1MzIpLCAmZGV2X2lkIH07CiAJc3RydWN0IGFjcGlfYnVmZmVyIG91dHB1dCA9IHsgQUNQSV9BTExPQ0FURV9CVUZGRVIsIE5VTEwgfTsKQEAgLTE1MCw4ICsxODcsOCBAQAogCWVsc2UKIAkJdG1wID0gMDsKIAotCWlmIChjdHJsX3BhcmFtKQotCQkqY3RybF9wYXJhbSA9IHRtcDsKKwlpZiAocmV0dmFsKQorCQkqcmV0dmFsID0gdG1wOwogCiAJa2ZyZWUob2JqKTsKIApAQCAtMTU5LDcgKzE5Niw4IEBACiAKIH0KIAotc3RhdGljIGFjcGlfc3RhdHVzIGVlZXBjX3dtaV9zZXRfZGV2c3RhdGUodTMyIGRldl9pZCwgdTMyIGN0cmxfcGFyYW0pCitzdGF0aWMgYWNwaV9zdGF0dXMgZWVlcGNfd21pX3NldF9kZXZzdGF0ZSh1MzIgZGV2X2lkLCB1MzIgY3RybF9wYXJhbSwKKwkJCQkJICB1MzIgKnJldHZhbCkKIHsKIAlzdHJ1Y3QgYmlvc19hcmdzIGFyZ3MgPSB7CiAJCS5kZXZfaWQgPSBkZXZfaWQsCkBAIC0xNjgsMzQgKzIwNiwyODEgQEAKIAlzdHJ1Y3QgYWNwaV9idWZmZXIgaW5wdXQgPSB7IChhY3BpX3NpemUpc2l6ZW9mKGFyZ3MpLCAmYXJncyB9OwogCWFjcGlfc3RhdHVzIHN0YXR1czsKIAotCXN0YXR1cyA9IHdtaV9ldmFsdWF0ZV9tZXRob2QoRUVFUENfV01JX01HTVRfR1VJRCwKLQkJCTEsIEVFRVBDX1dNSV9NRVRIT0RJRF9ERVZTLCAmaW5wdXQsIE5VTEwpOworCWlmICghcmV0dmFsKSB7CisJCXN0YXR1cyA9IHdtaV9ldmFsdWF0ZV9tZXRob2QoRUVFUENfV01JX01HTVRfR1VJRCwgMSwKKwkJCQkJICAgICBFRUVQQ19XTUlfTUVUSE9ESURfREVWUywKKwkJCQkJICAgICAmaW5wdXQsIE5VTEwpOworCX0gZWxzZSB7CisJCXN0cnVjdCBhY3BpX2J1ZmZlciBvdXRwdXQgPSB7IEFDUElfQUxMT0NBVEVfQlVGRkVSLCBOVUxMIH07CisJCXVuaW9uIGFjcGlfb2JqZWN0ICpvYmo7CisJCXUzMiB0bXA7CisKKwkJc3RhdHVzID0gd21pX2V2YWx1YXRlX21ldGhvZChFRUVQQ19XTUlfTUdNVF9HVUlELCAxLAorCQkJCQkgICAgIEVFRVBDX1dNSV9NRVRIT0RJRF9ERVZTLAorCQkJCQkgICAgICZpbnB1dCwgJm91dHB1dCk7CisKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKQorCQkJcmV0dXJuIHN0YXR1czsKKworCQlvYmogPSAodW5pb24gYWNwaV9vYmplY3QgKilvdXRwdXQucG9pbnRlcjsKKwkJaWYgKG9iaiAmJiBvYmotPnR5cGUgPT0gQUNQSV9UWVBFX0lOVEVHRVIpCisJCQl0bXAgPSAodTMyKW9iai0+aW50ZWdlci52YWx1ZTsKKwkJZWxzZQorCQkJdG1wID0gMDsKKworCQkqcmV0dmFsID0gdG1wOworCisJCWtmcmVlKG9iaik7CisJfQogCiAJcmV0dXJuIHN0YXR1czsKIH0KIAotc3RhdGljIGludCByZWFkX2JyaWdodG5lc3Moc3RydWN0IGJhY2tsaWdodF9kZXZpY2UgKmJkKQorLyoKKyAqIExFRHMKKyAqLworLyoKKyAqIFRoZXNlIGZ1bmN0aW9ucyBhY3R1YWxseSB1cGRhdGUgdGhlIExFRCdzLCBhbmQgYXJlIGNhbGxlZCBmcm9tIGEKKyAqIHdvcmtxdWV1ZS4gQnkgZG9pbmcgdGhpcyBhcyBzZXBhcmF0ZSB3b3JrIHJhdGhlciB0aGFuIHdoZW4gdGhlIExFRAorICogc3Vic3lzdGVtIGFza3MsIHdlIGF2b2lkIG1lc3Npbmcgd2l0aCB0aGUgRWVlcGMgQUNQSSBzdHVmZiBkdXJpbmcgYQorICogcG90ZW50aWFsbHkgYmFkIHRpbWUsIHN1Y2ggYXMgYSB0aW1lciBpbnRlcnJ1cHQuCisgKi8KK3N0YXRpYyB2b2lkIHRwZF9sZWRfdXBkYXRlKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKLQlzdGF0aWMgdTMyIGN0cmxfcGFyYW07CisJaW50IGN0cmxfcGFyYW07CisJc3RydWN0IGVlZXBjX3dtaSAqZWVlcGM7CisKKwllZWVwYyA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgZWVlcGNfd21pLCB0cGRfbGVkX3dvcmspOworCisJY3RybF9wYXJhbSA9IGVlZXBjLT50cGRfbGVkX3drOworCWVlZXBjX3dtaV9zZXRfZGV2c3RhdGUoRUVFUENfV01JX0RFVklEX1RQRExFRCwgY3RybF9wYXJhbSwgTlVMTCk7Cit9CisKK3N0YXRpYyB2b2lkIHRwZF9sZWRfc2V0KHN0cnVjdCBsZWRfY2xhc3NkZXYgKmxlZF9jZGV2LAorCQkJZW51bSBsZWRfYnJpZ2h0bmVzcyB2YWx1ZSkKK3sKKwlzdHJ1Y3QgZWVlcGNfd21pICplZWVwYzsKKworCWVlZXBjID0gY29udGFpbmVyX29mKGxlZF9jZGV2LCBzdHJ1Y3QgZWVlcGNfd21pLCB0cGRfbGVkKTsKKworCWVlZXBjLT50cGRfbGVkX3drID0gISF2YWx1ZTsKKwlxdWV1ZV93b3JrKGVlZXBjLT5sZWRfd29ya3F1ZXVlLCAmZWVlcGMtPnRwZF9sZWRfd29yayk7Cit9CisKK3N0YXRpYyBpbnQgcmVhZF90cGRfc3RhdGUoc3RydWN0IGVlZXBjX3dtaSAqZWVlcGMpCit7CisJdTMyIHJldHZhbDsKIAlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKLQlzdGF0dXMgPSBlZWVwY193bWlfZ2V0X2RldnN0YXRlKEVFRVBDX1dNSV9ERVZJRF9CQUNLTElHSFQsICZjdHJsX3BhcmFtKTsKKwlzdGF0dXMgPSBlZWVwY193bWlfZ2V0X2RldnN0YXRlKEVFRVBDX1dNSV9ERVZJRF9UUERMRUQsICZyZXR2YWwpOworCisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKQorCQlyZXR1cm4gLTE7CisJZWxzZSBpZiAoIXJldHZhbCB8fCByZXR2YWwgPT0gMHgwMDA2MDAwMCkKKwkJLyoKKwkJICogaWYgdG91Y2hwYWQgbGVkIGlzIHByZXNlbnQsIERTVFMgd2lsbCBzZXQgc29tZSBiaXRzLAorCQkgKiB1c3VhbGx5IDB4MDAwMjAwMDAuCisJCSAqIDB4MDAwNjAwMDAgbWVhbnMgdGhhdCB0aGUgZGV2aWNlIGlzIG5vdCBzdXBwb3J0ZWQKKwkJICovCisJCXJldHVybiAtRU5PREVWOworCWVsc2UKKwkJLyogU3RhdHVzIGlzIHN0b3JlZCBpbiB0aGUgZmlyc3QgYml0ICovCisJCXJldHVybiByZXR2YWwgJiAweDE7Cit9CisKK3N0YXRpYyBlbnVtIGxlZF9icmlnaHRuZXNzIHRwZF9sZWRfZ2V0KHN0cnVjdCBsZWRfY2xhc3NkZXYgKmxlZF9jZGV2KQoreworCXN0cnVjdCBlZWVwY193bWkgKmVlZXBjOworCisJZWVlcGMgPSBjb250YWluZXJfb2YobGVkX2NkZXYsIHN0cnVjdCBlZWVwY193bWksIHRwZF9sZWQpOworCisJcmV0dXJuIHJlYWRfdHBkX3N0YXRlKGVlZXBjKTsKK30KKworc3RhdGljIGludCBlZWVwY193bWlfbGVkX2luaXQoc3RydWN0IGVlZXBjX3dtaSAqZWVlcGMpCit7CisJaW50IHJ2OworCisJaWYgKHJlYWRfdHBkX3N0YXRlKGVlZXBjKSA8IDApCisJCXJldHVybiAwOworCisJZWVlcGMtPmxlZF93b3JrcXVldWUgPSBjcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZSgibGVkX3dvcmtxdWV1ZSIpOworCWlmICghZWVlcGMtPmxlZF93b3JrcXVldWUpCisJCXJldHVybiAtRU5PTUVNOworCUlOSVRfV09SSygmZWVlcGMtPnRwZF9sZWRfd29yaywgdHBkX2xlZF91cGRhdGUpOworCisJZWVlcGMtPnRwZF9sZWQubmFtZSA9ICJlZWVwYzo6dG91Y2hwYWQiOworCWVlZXBjLT50cGRfbGVkLmJyaWdodG5lc3Nfc2V0ID0gdHBkX2xlZF9zZXQ7CisJZWVlcGMtPnRwZF9sZWQuYnJpZ2h0bmVzc19nZXQgPSB0cGRfbGVkX2dldDsKKwllZWVwYy0+dHBkX2xlZC5tYXhfYnJpZ2h0bmVzcyA9IDE7CisKKwlydiA9IGxlZF9jbGFzc2Rldl9yZWdpc3RlcigmZWVlcGMtPnBsYXRmb3JtX2RldmljZS0+ZGV2LAorCQkJCSAgICZlZWVwYy0+dHBkX2xlZCk7CisJaWYgKHJ2KSB7CisJCWRlc3Ryb3lfd29ya3F1ZXVlKGVlZXBjLT5sZWRfd29ya3F1ZXVlKTsKKwkJcmV0dXJuIHJ2OworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBlZWVwY193bWlfbGVkX2V4aXQoc3RydWN0IGVlZXBjX3dtaSAqZWVlcGMpCit7CisJaWYgKGVlZXBjLT50cGRfbGVkLmRldikKKwkJbGVkX2NsYXNzZGV2X3VucmVnaXN0ZXIoJmVlZXBjLT50cGRfbGVkKTsKKwlpZiAoZWVlcGMtPmxlZF93b3JrcXVldWUpCisJCWRlc3Ryb3lfd29ya3F1ZXVlKGVlZXBjLT5sZWRfd29ya3F1ZXVlKTsKK30KKworLyoKKyAqIFJma2lsbCBkZXZpY2VzCisgKi8KK3N0YXRpYyBpbnQgZWVlcGNfcmZraWxsX3NldCh2b2lkICpkYXRhLCBib29sIGJsb2NrZWQpCit7CisJaW50IGRldl9pZCA9ICh1bnNpZ25lZCBsb25nKWRhdGE7CisJdTMyIGN0cmxfcGFyYW0gPSAhYmxvY2tlZDsKKworCXJldHVybiBlZWVwY193bWlfc2V0X2RldnN0YXRlKGRldl9pZCwgY3RybF9wYXJhbSwgTlVMTCk7Cit9CisKK3N0YXRpYyB2b2lkIGVlZXBjX3Jma2lsbF9xdWVyeShzdHJ1Y3QgcmZraWxsICpyZmtpbGwsIHZvaWQgKmRhdGEpCit7CisJaW50IGRldl9pZCA9ICh1bnNpZ25lZCBsb25nKWRhdGE7CisJdTMyIHJldHZhbDsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisKKwlzdGF0dXMgPSBlZWVwY193bWlfZ2V0X2RldnN0YXRlKGRldl9pZCwgJnJldHZhbCk7CisKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpCisJCXJldHVybiA7CisKKwlyZmtpbGxfc2V0X3N3X3N0YXRlKHJma2lsbCwgIShyZXR2YWwgJiAweDEpKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCByZmtpbGxfb3BzIGVlZXBjX3Jma2lsbF9vcHMgPSB7CisJLnNldF9ibG9jayA9IGVlZXBjX3Jma2lsbF9zZXQsCisJLnF1ZXJ5ID0gZWVlcGNfcmZraWxsX3F1ZXJ5LAorfTsKKworc3RhdGljIGludCBlZWVwY19uZXdfcmZraWxsKHN0cnVjdCBlZWVwY193bWkgKmVlZXBjLAorCQkJICAgIHN0cnVjdCByZmtpbGwgKipyZmtpbGwsCisJCQkgICAgY29uc3QgY2hhciAqbmFtZSwKKwkJCSAgICBlbnVtIHJma2lsbF90eXBlIHR5cGUsIGludCBkZXZfaWQpCit7CisJaW50IHJlc3VsdDsKKwl1MzIgcmV0dmFsOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKworCXN0YXR1cyA9IGVlZXBjX3dtaV9nZXRfZGV2c3RhdGUoZGV2X2lkLCAmcmV0dmFsKTsKKworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkKKwkJcmV0dXJuIC0xOworCisJLyogSWYgdGhlIGRldmljZSBpcyBwcmVzZW50LCBEU1RTIHdpbGwgYWx3YXlzIHNldCBzb21lIGJpdHMKKwkgKiAweDAwMDcwMDAwIC0gMTExMDAwMDAwMDAwMDAwMDAwMCAtIGRldmljZSBzdXBwb3J0ZWQKKwkgKiAweDAwMDYwMDAwIC0gMTEwMDAwMDAwMDAwMDAwMDAwMCAtIG5vdCBzdXBwb3J0ZWQKKwkgKiAweDAwMDIwMDAwIC0gMDEwMDAwMDAwMDAwMDAwMDAwMCAtIGRldmljZSBzdXBwb3J0ZWQKKwkgKiAweDAwMDEwMDAwIC0gMDAxMDAwMDAwMDAwMDAwMDAwMCAtIG5vdCBzdXBwb3J0ZWQgLyBzcGVjaWFsIG1vZGUgPworCSAqLworCWlmICghcmV0dmFsIHx8IHJldHZhbCA9PSAweDAwMDYwMDAwKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCSpyZmtpbGwgPSByZmtpbGxfYWxsb2MobmFtZSwgJmVlZXBjLT5wbGF0Zm9ybV9kZXZpY2UtPmRldiwgdHlwZSwKKwkJCSAgICAgICAmZWVlcGNfcmZraWxsX29wcywgKHZvaWQgKikobG9uZylkZXZfaWQpOworCisJaWYgKCEqcmZraWxsKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJma2lsbF9pbml0X3N3X3N0YXRlKCpyZmtpbGwsICEocmV0dmFsICYgMHgxKSk7CisJcmVzdWx0ID0gcmZraWxsX3JlZ2lzdGVyKCpyZmtpbGwpOworCWlmIChyZXN1bHQpIHsKKwkJcmZraWxsX2Rlc3Ryb3koKnJma2lsbCk7CisJCSpyZmtpbGwgPSBOVUxMOworCQlyZXR1cm4gcmVzdWx0OworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZWVlcGNfd21pX3Jma2lsbF9leGl0KHN0cnVjdCBlZWVwY193bWkgKmVlZXBjKQoreworCWlmIChlZWVwYy0+d2xhbl9yZmtpbGwpIHsKKwkJcmZraWxsX3VucmVnaXN0ZXIoZWVlcGMtPndsYW5fcmZraWxsKTsKKwkJcmZraWxsX2Rlc3Ryb3koZWVlcGMtPndsYW5fcmZraWxsKTsKKwkJZWVlcGMtPndsYW5fcmZraWxsID0gTlVMTDsKKwl9CisJaWYgKGVlZXBjLT5ibHVldG9vdGhfcmZraWxsKSB7CisJCXJma2lsbF91bnJlZ2lzdGVyKGVlZXBjLT5ibHVldG9vdGhfcmZraWxsKTsKKwkJcmZraWxsX2Rlc3Ryb3koZWVlcGMtPmJsdWV0b290aF9yZmtpbGwpOworCQllZWVwYy0+Ymx1ZXRvb3RoX3Jma2lsbCA9IE5VTEw7CisJfQorCWlmIChlZWVwYy0+d3dhbjNnX3Jma2lsbCkgeworCQlyZmtpbGxfdW5yZWdpc3RlcihlZWVwYy0+d3dhbjNnX3Jma2lsbCk7CisJCXJma2lsbF9kZXN0cm95KGVlZXBjLT53d2FuM2dfcmZraWxsKTsKKwkJZWVlcGMtPnd3YW4zZ19yZmtpbGwgPSBOVUxMOworCX0KK30KKworc3RhdGljIGludCBlZWVwY193bWlfcmZraWxsX2luaXQoc3RydWN0IGVlZXBjX3dtaSAqZWVlcGMpCit7CisJaW50IHJlc3VsdCA9IDA7CisKKwlyZXN1bHQgPSBlZWVwY19uZXdfcmZraWxsKGVlZXBjLCAmZWVlcGMtPndsYW5fcmZraWxsLAorCQkJCSAgImVlZXBjLXdsYW4iLCBSRktJTExfVFlQRV9XTEFOLAorCQkJCSAgRUVFUENfV01JX0RFVklEX1dMQU4pOworCisJaWYgKHJlc3VsdCAmJiByZXN1bHQgIT0gLUVOT0RFVikKKwkJZ290byBleGl0OworCisJcmVzdWx0ID0gZWVlcGNfbmV3X3Jma2lsbChlZWVwYywgJmVlZXBjLT5ibHVldG9vdGhfcmZraWxsLAorCQkJCSAgImVlZXBjLWJsdWV0b290aCIsIFJGS0lMTF9UWVBFX0JMVUVUT09USCwKKwkJCQkgIEVFRVBDX1dNSV9ERVZJRF9CTFVFVE9PVEgpOworCisJaWYgKHJlc3VsdCAmJiByZXN1bHQgIT0gLUVOT0RFVikKKwkJZ290byBleGl0OworCisJcmVzdWx0ID0gZWVlcGNfbmV3X3Jma2lsbChlZWVwYywgJmVlZXBjLT53d2FuM2dfcmZraWxsLAorCQkJCSAgImVlZXBjLXd3YW4zZyIsIFJGS0lMTF9UWVBFX1dXQU4sCisJCQkJICBFRUVQQ19XTUlfREVWSURfV1dBTjNHKTsKKworCWlmIChyZXN1bHQgJiYgcmVzdWx0ICE9IC1FTk9ERVYpCisJCWdvdG8gZXhpdDsKKworZXhpdDoKKwlpZiAocmVzdWx0ICYmIHJlc3VsdCAhPSAtRU5PREVWKQorCQllZWVwY193bWlfcmZraWxsX2V4aXQoZWVlcGMpOworCisJaWYgKHJlc3VsdCA9PSAtRU5PREVWKQorCQlyZXN1bHQgPSAwOworCisJcmV0dXJuIHJlc3VsdDsKK30KKworLyoKKyAqIEJhY2tsaWdodAorICovCitzdGF0aWMgaW50IHJlYWRfYnJpZ2h0bmVzcyhzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZSAqYmQpCit7CisJdTMyIHJldHZhbDsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisKKwlzdGF0dXMgPSBlZWVwY193bWlfZ2V0X2RldnN0YXRlKEVFRVBDX1dNSV9ERVZJRF9CQUNLTElHSFQsICZyZXR2YWwpOwogCiAJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKQogCQlyZXR1cm4gLTE7CiAJZWxzZQotCQlyZXR1cm4gY3RybF9wYXJhbSAmIDB4RkY7CisJCXJldHVybiByZXR2YWwgJiAweEZGOwogfQogCiBzdGF0aWMgaW50IHVwZGF0ZV9ibF9zdGF0dXMoc3RydWN0IGJhY2tsaWdodF9kZXZpY2UgKmJkKQogewogCi0Jc3RhdGljIHUzMiBjdHJsX3BhcmFtOworCXUzMiBjdHJsX3BhcmFtOwogCWFjcGlfc3RhdHVzIHN0YXR1czsKIAogCWN0cmxfcGFyYW0gPSBiZC0+cHJvcHMuYnJpZ2h0bmVzczsKIAotCXN0YXR1cyA9IGVlZXBjX3dtaV9zZXRfZGV2c3RhdGUoRUVFUENfV01JX0RFVklEX0JBQ0tMSUdIVCwgY3RybF9wYXJhbSk7CisJc3RhdHVzID0gZWVlcGNfd21pX3NldF9kZXZzdGF0ZShFRUVQQ19XTUlfREVWSURfQkFDS0xJR0hULAorCQkJCQljdHJsX3BhcmFtLCBOVUxMKTsKIAogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkKIAkJcmV0dXJuIC0xOwpAQCAtMjM0LDcgKzUxOSw3IEBACiAJbWVtc2V0KCZwcm9wcywgMCwgc2l6ZW9mKHN0cnVjdCBiYWNrbGlnaHRfcHJvcGVydGllcykpOwogCXByb3BzLm1heF9icmlnaHRuZXNzID0gMTU7CiAJYmQgPSBiYWNrbGlnaHRfZGV2aWNlX3JlZ2lzdGVyKEVFRVBDX1dNSV9GSUxFLAotCQkJCSAgICAgICAmcGxhdGZvcm1fZGV2aWNlLT5kZXYsIGVlZXBjLAorCQkJCSAgICAgICAmZWVlcGMtPnBsYXRmb3JtX2RldmljZS0+ZGV2LCBlZWVwYywKIAkJCQkgICAgICAgJmVlZXBjX3dtaV9ibF9vcHMsICZwcm9wcyk7CiAJaWYgKElTX0VSUihiZCkpIHsKIAkJcHJfZXJyKCJDb3VsZCBub3QgcmVnaXN0ZXIgYmFja2xpZ2h0IGRldmljZVxuIik7CkBAIC0zMjEsNjUgKzYwNiwyNDAgQEAKIAogc3RhdGljIERFVklDRV9BVFRSKGNwdWZ2LCBTX0lSVUdPIHwgU19JV1VTUiwgTlVMTCwgc3RvcmVfY3B1ZnYpOwogCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqcGxhdGZvcm1fYXR0cmlidXRlc1tdID0geworCSZkZXZfYXR0cl9jcHVmdi5hdHRyLAorCU5VTEwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIHBsYXRmb3JtX2F0dHJpYnV0ZV9ncm91cCA9IHsKKwkuYXR0cnMgPSBwbGF0Zm9ybV9hdHRyaWJ1dGVzCit9OworCiBzdGF0aWMgdm9pZCBlZWVwY193bWlfc3lzZnNfZXhpdChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXZpY2UpCiB7Ci0JZGV2aWNlX3JlbW92ZV9maWxlKCZkZXZpY2UtPmRldiwgJmRldl9hdHRyX2NwdWZ2KTsKKwlzeXNmc19yZW1vdmVfZ3JvdXAoJmRldmljZS0+ZGV2LmtvYmosICZwbGF0Zm9ybV9hdHRyaWJ1dGVfZ3JvdXApOwogfQogCiBzdGF0aWMgaW50IGVlZXBjX3dtaV9zeXNmc19pbml0KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldmljZSkKIHsKLQlpbnQgcmV0dmFsID0gLUVOT01FTTsKLQotCXJldHZhbCA9IGRldmljZV9jcmVhdGVfZmlsZSgmZGV2aWNlLT5kZXYsICZkZXZfYXR0cl9jcHVmdik7Ci0JaWYgKHJldHZhbCkKLQkJZ290byBlcnJvcl9zeXNmczsKLQotCXJldHVybiAwOwotCi1lcnJvcl9zeXNmczoKLQllZWVwY193bWlfc3lzZnNfZXhpdChwbGF0Zm9ybV9kZXZpY2UpOwotCXJldHVybiByZXR2YWw7CisJcmV0dXJuIHN5c2ZzX2NyZWF0ZV9ncm91cCgmZGV2aWNlLT5kZXYua29iaiwgJnBsYXRmb3JtX2F0dHJpYnV0ZV9ncm91cCk7CiB9CiAKLXN0YXRpYyBpbnQgX19kZXZpbml0IGVlZXBjX3dtaV9wbGF0Zm9ybV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXZpY2UpCisvKgorICogUGxhdGZvcm0gZGV2aWNlCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IGVlZXBjX3dtaV9wbGF0Zm9ybV9pbml0KHN0cnVjdCBlZWVwY193bWkgKmVlZXBjKQogewotCXN0cnVjdCBlZWVwY193bWkgKmVlZXBjOwogCWludCBlcnI7Ci0JYWNwaV9zdGF0dXMgc3RhdHVzOwogCi0JZWVlcGMgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShkZXZpY2UpOworCWVlZXBjLT5wbGF0Zm9ybV9kZXZpY2UgPSBwbGF0Zm9ybV9kZXZpY2VfYWxsb2MoRUVFUENfV01JX0ZJTEUsIC0xKTsKKwlpZiAoIWVlZXBjLT5wbGF0Zm9ybV9kZXZpY2UpCisJCXJldHVybiAtRU5PTUVNOworCXBsYXRmb3JtX3NldF9kcnZkYXRhKGVlZXBjLT5wbGF0Zm9ybV9kZXZpY2UsIGVlZXBjKTsKIAotCWVyciA9IGVlZXBjX3dtaV9pbnB1dF9pbml0KGVlZXBjKTsKKwllcnIgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkKGVlZXBjLT5wbGF0Zm9ybV9kZXZpY2UpOwogCWlmIChlcnIpCi0JCWdvdG8gZXJyb3JfaW5wdXQ7CisJCWdvdG8gZmFpbF9wbGF0Zm9ybV9kZXZpY2U7CiAKLQlpZiAoIWFjcGlfdmlkZW9fYmFja2xpZ2h0X3N1cHBvcnQoKSkgewotCQllcnIgPSBlZWVwY193bWlfYmFja2xpZ2h0X2luaXQoZWVlcGMpOwotCQlpZiAoZXJyKQotCQkJZ290byBlcnJvcl9iYWNrbGlnaHQ7Ci0JfSBlbHNlCi0JCXByX2luZm8oIkJhY2tsaWdodCBjb250cm9sbGVkIGJ5IEFDUEkgdmlkZW8gZHJpdmVyXG4iKTsKKwllcnIgPSBlZWVwY193bWlfc3lzZnNfaW5pdChlZWVwYy0+cGxhdGZvcm1fZGV2aWNlKTsKKwlpZiAoZXJyKQorCQlnb3RvIGZhaWxfc3lzZnM7CisJcmV0dXJuIDA7CiAKLQlzdGF0dXMgPSB3bWlfaW5zdGFsbF9ub3RpZnlfaGFuZGxlcihFRUVQQ19XTUlfRVZFTlRfR1VJRCwKLQkJCQkJZWVlcGNfd21pX25vdGlmeSwgZWVlcGMpOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlwcl9lcnIoIlVuYWJsZSB0byByZWdpc3RlciBub3RpZnkgaGFuZGxlciAtICVkXG4iLAotCQkJc3RhdHVzKTsKLQkJZXJyID0gLUVOT0RFVjsKLQkJZ290byBlcnJvcl93bWk7CitmYWlsX3N5c2ZzOgorCXBsYXRmb3JtX2RldmljZV9kZWwoZWVlcGMtPnBsYXRmb3JtX2RldmljZSk7CitmYWlsX3BsYXRmb3JtX2RldmljZToKKwlwbGF0Zm9ybV9kZXZpY2VfcHV0KGVlZXBjLT5wbGF0Zm9ybV9kZXZpY2UpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIGVlZXBjX3dtaV9wbGF0Zm9ybV9leGl0KHN0cnVjdCBlZWVwY193bWkgKmVlZXBjKQoreworCWVlZXBjX3dtaV9zeXNmc19leGl0KGVlZXBjLT5wbGF0Zm9ybV9kZXZpY2UpOworCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKGVlZXBjLT5wbGF0Zm9ybV9kZXZpY2UpOworfQorCisvKgorICogZGVidWdmcworICovCitzdHJ1Y3QgZWVlcGNfd21pX2RlYnVnZnNfbm9kZSB7CisJc3RydWN0IGVlZXBjX3dtaSAqZWVlcGM7CisJY2hhciAqbmFtZTsKKwlpbnQgKCpzaG93KShzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKmRhdGEpOworfTsKKworc3RhdGljIGludCBzaG93X2RzdHMoc3RydWN0IHNlcV9maWxlICptLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBlZWVwY193bWkgKmVlZXBjID0gbS0+cHJpdmF0ZTsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJdTMyIHJldHZhbCA9IC0xOworCisJc3RhdHVzID0gZWVlcGNfd21pX2dldF9kZXZzdGF0ZShlZWVwYy0+ZGVidWcuZGV2X2lkLCAmcmV0dmFsKTsKKworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkKKwkJcmV0dXJuIC1FSU87CisKKwlzZXFfcHJpbnRmKG0sICJEU1RTKCV4KSA9ICV4XG4iLCBlZWVwYy0+ZGVidWcuZGV2X2lkLCByZXR2YWwpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2hvd19kZXZzKHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgZWVlcGNfd21pICplZWVwYyA9IG0tPnByaXZhdGU7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCXUzMiByZXR2YWwgPSAtMTsKKworCXN0YXR1cyA9IGVlZXBjX3dtaV9zZXRfZGV2c3RhdGUoZWVlcGMtPmRlYnVnLmRldl9pZCwKKwkJCQkJZWVlcGMtPmRlYnVnLmN0cmxfcGFyYW0sICZyZXR2YWwpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkKKwkJcmV0dXJuIC1FSU87CisKKwlzZXFfcHJpbnRmKG0sICJERVZTKCV4LCAleCkgPSAleFxuIiwgZWVlcGMtPmRlYnVnLmRldl9pZCwKKwkJICAgZWVlcGMtPmRlYnVnLmN0cmxfcGFyYW0sIHJldHZhbCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBlZWVwY193bWlfZGVidWdmc19ub2RlIGVlZXBjX3dtaV9kZWJ1Z19maWxlc1tdID0geworCXsgTlVMTCwgImRldnMiLCBzaG93X2RldnMgfSwKKwl7IE5VTEwsICJkc3RzIiwgc2hvd19kc3RzIH0sCit9OworCitzdGF0aWMgaW50IGVlZXBjX3dtaV9kZWJ1Z2ZzX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IGVlZXBjX3dtaV9kZWJ1Z2ZzX25vZGUgKm5vZGUgPSBpbm9kZS0+aV9wcml2YXRlOworCisJcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIG5vZGUtPnNob3csIG5vZGUtPmVlZXBjKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZWVlcGNfd21pX2RlYnVnZnNfaW9fb3BzID0geworCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5vcGVuICA9IGVlZXBjX3dtaV9kZWJ1Z2ZzX29wZW4sCisJLnJlYWQgPSBzZXFfcmVhZCwKKwkubGxzZWVrID0gc2VxX2xzZWVrLAorCS5yZWxlYXNlID0gc2luZ2xlX3JlbGVhc2UsCit9OworCitzdGF0aWMgdm9pZCBlZWVwY193bWlfZGVidWdmc19leGl0KHN0cnVjdCBlZWVwY193bWkgKmVlZXBjKQoreworCWRlYnVnZnNfcmVtb3ZlX3JlY3Vyc2l2ZShlZWVwYy0+ZGVidWcucm9vdCk7Cit9CisKK3N0YXRpYyBpbnQgZWVlcGNfd21pX2RlYnVnZnNfaW5pdChzdHJ1Y3QgZWVlcGNfd21pICplZWVwYykKK3sKKwlzdHJ1Y3QgZGVudHJ5ICpkZW50OworCWludCBpOworCisJZWVlcGMtPmRlYnVnLnJvb3QgPSBkZWJ1Z2ZzX2NyZWF0ZV9kaXIoRUVFUENfV01JX0ZJTEUsIE5VTEwpOworCWlmICghZWVlcGMtPmRlYnVnLnJvb3QpIHsKKwkJcHJfZXJyKCJmYWlsZWQgdG8gY3JlYXRlIGRlYnVnZnMgZGlyZWN0b3J5Iik7CisJCWdvdG8gZXJyb3JfZGVidWdmczsKKwl9CisKKwlkZW50ID0gZGVidWdmc19jcmVhdGVfeDMyKCJkZXZfaWQiLCBTX0lSVUdPfFNfSVdVU1IsCisJCQkJICBlZWVwYy0+ZGVidWcucm9vdCwgJmVlZXBjLT5kZWJ1Zy5kZXZfaWQpOworCWlmICghZGVudCkKKwkJZ290byBlcnJvcl9kZWJ1Z2ZzOworCisJZGVudCA9IGRlYnVnZnNfY3JlYXRlX3gzMigiY3RybF9wYXJhbSIsIFNfSVJVR098U19JV1VTUiwKKwkJCQkgIGVlZXBjLT5kZWJ1Zy5yb290LCAmZWVlcGMtPmRlYnVnLmN0cmxfcGFyYW0pOworCWlmICghZGVudCkKKwkJZ290byBlcnJvcl9kZWJ1Z2ZzOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZWVlcGNfd21pX2RlYnVnX2ZpbGVzKTsgaSsrKSB7CisJCXN0cnVjdCBlZWVwY193bWlfZGVidWdmc19ub2RlICpub2RlID0gJmVlZXBjX3dtaV9kZWJ1Z19maWxlc1tpXTsKKworCQlub2RlLT5lZWVwYyA9IGVlZXBjOworCQlkZW50ID0gZGVidWdmc19jcmVhdGVfZmlsZShub2RlLT5uYW1lLCBTX0lGUkVHIHwgU19JUlVHTywKKwkJCQkJICAgZWVlcGMtPmRlYnVnLnJvb3QsIG5vZGUsCisJCQkJCSAgICZlZWVwY193bWlfZGVidWdmc19pb19vcHMpOworCQlpZiAoIWRlbnQpIHsKKwkJCXByX2VycigiZmFpbGVkIHRvIGNyZWF0ZSBkZWJ1ZyBmaWxlOiAlc1xuIiwgbm9kZS0+bmFtZSk7CisJCQlnb3RvIGVycm9yX2RlYnVnZnM7CisJCX0KIAl9CiAKIAlyZXR1cm4gMDsKIAotZXJyb3Jfd21pOgotCWVlZXBjX3dtaV9iYWNrbGlnaHRfZXhpdChlZWVwYyk7Ci1lcnJvcl9iYWNrbGlnaHQ6Ci0JZWVlcGNfd21pX2lucHV0X2V4aXQoZWVlcGMpOwotZXJyb3JfaW5wdXQ6Ci0JcmV0dXJuIGVycjsKK2Vycm9yX2RlYnVnZnM6CisJZWVlcGNfd21pX2RlYnVnZnNfZXhpdChlZWVwYyk7CisJcmV0dXJuIC1FTk9NRU07CiB9CiAKLXN0YXRpYyBpbnQgX19kZXZleGl0IGVlZXBjX3dtaV9wbGF0Zm9ybV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2aWNlKQorLyoKKyAqIFdNSSBEcml2ZXIKKyAqLworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKiBfX2luaXQgZWVlcGNfd21pX2FkZCh2b2lkKQoreworCXN0cnVjdCBlZWVwY193bWkgKmVlZXBjOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwlpbnQgZXJyOworCisJZWVlcGMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZWVlcGNfd21pKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFlZWVwYykKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwkvKgorCSAqIFJlZ2lzdGVyIHRoZSBwbGF0Zm9ybSBkZXZpY2UgZmlyc3QuICBJdCBpcyB1c2VkIGFzIGEgcGFyZW50IGZvciB0aGUKKwkgKiBzdWItZGV2aWNlcyBiZWxvdy4KKwkgKi8KKwllcnIgPSBlZWVwY193bWlfcGxhdGZvcm1faW5pdChlZWVwYyk7CisJaWYgKGVycikKKwkJZ290byBmYWlsX3BsYXRmb3JtOworCisJZXJyID0gZWVlcGNfd21pX2lucHV0X2luaXQoZWVlcGMpOworCWlmIChlcnIpCisJCWdvdG8gZmFpbF9pbnB1dDsKKworCWVyciA9IGVlZXBjX3dtaV9sZWRfaW5pdChlZWVwYyk7CisJaWYgKGVycikKKwkJZ290byBmYWlsX2xlZHM7CisKKwllcnIgPSBlZWVwY193bWlfcmZraWxsX2luaXQoZWVlcGMpOworCWlmIChlcnIpCisJCWdvdG8gZmFpbF9yZmtpbGw7CisKKwlpZiAoIWFjcGlfdmlkZW9fYmFja2xpZ2h0X3N1cHBvcnQoKSkgeworCQllcnIgPSBlZWVwY193bWlfYmFja2xpZ2h0X2luaXQoZWVlcGMpOworCQlpZiAoZXJyKQorCQkJZ290byBmYWlsX2JhY2tsaWdodDsKKwl9IGVsc2UKKwkJcHJfaW5mbygiQmFja2xpZ2h0IGNvbnRyb2xsZWQgYnkgQUNQSSB2aWRlbyBkcml2ZXJcbiIpOworCisJc3RhdHVzID0gd21pX2luc3RhbGxfbm90aWZ5X2hhbmRsZXIoRUVFUENfV01JX0VWRU5UX0dVSUQsCisJCQkJCSAgICBlZWVwY193bWlfbm90aWZ5LCBlZWVwYyk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXByX2VycigiVW5hYmxlIHRvIHJlZ2lzdGVyIG5vdGlmeSBoYW5kbGVyIC0gJWRcbiIsCisJCQlzdGF0dXMpOworCQllcnIgPSAtRU5PREVWOworCQlnb3RvIGZhaWxfd21pX2hhbmRsZXI7CisJfQorCisJZXJyID0gZWVlcGNfd21pX2RlYnVnZnNfaW5pdChlZWVwYyk7CisJaWYgKGVycikKKwkJZ290byBmYWlsX2RlYnVnZnM7CisKKwlyZXR1cm4gZWVlcGMtPnBsYXRmb3JtX2RldmljZTsKKworZmFpbF9kZWJ1Z2ZzOgorCXdtaV9yZW1vdmVfbm90aWZ5X2hhbmRsZXIoRUVFUENfV01JX0VWRU5UX0dVSUQpOworZmFpbF93bWlfaGFuZGxlcjoKKwllZWVwY193bWlfYmFja2xpZ2h0X2V4aXQoZWVlcGMpOworZmFpbF9iYWNrbGlnaHQ6CisJZWVlcGNfd21pX3Jma2lsbF9leGl0KGVlZXBjKTsKK2ZhaWxfcmZraWxsOgorCWVlZXBjX3dtaV9sZWRfZXhpdChlZWVwYyk7CitmYWlsX2xlZHM6CisJZWVlcGNfd21pX2lucHV0X2V4aXQoZWVlcGMpOworZmFpbF9pbnB1dDoKKwllZWVwY193bWlfcGxhdGZvcm1fZXhpdChlZWVwYyk7CitmYWlsX3BsYXRmb3JtOgorCWtmcmVlKGVlZXBjKTsKKwlyZXR1cm4gRVJSX1BUUihlcnIpOworfQorCitzdGF0aWMgaW50IGVlZXBjX3dtaV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2aWNlKQogewogCXN0cnVjdCBlZWVwY193bWkgKmVlZXBjOwogCkBAIC0zODcsNyArODQ3LDEyIEBACiAJd21pX3JlbW92ZV9ub3RpZnlfaGFuZGxlcihFRUVQQ19XTUlfRVZFTlRfR1VJRCk7CiAJZWVlcGNfd21pX2JhY2tsaWdodF9leGl0KGVlZXBjKTsKIAllZWVwY193bWlfaW5wdXRfZXhpdChlZWVwYyk7CisJZWVlcGNfd21pX2xlZF9leGl0KGVlZXBjKTsKKwllZWVwY193bWlfcmZraWxsX2V4aXQoZWVlcGMpOworCWVlZXBjX3dtaV9kZWJ1Z2ZzX2V4aXQoZWVlcGMpOworCWVlZXBjX3dtaV9wbGF0Zm9ybV9leGl0KGVlZXBjKTsKIAorCWtmcmVlKGVlZXBjKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMzk2LDEzICs4NjEsMzEgQEAKIAkJLm5hbWUgPSBFRUVQQ19XTUlfRklMRSwKIAkJLm93bmVyID0gVEhJU19NT0RVTEUsCiAJfSwKLQkucHJvYmUgPSBlZWVwY193bWlfcGxhdGZvcm1fcHJvYmUsCi0JLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKGVlZXBjX3dtaV9wbGF0Zm9ybV9yZW1vdmUpLAogfTsKIAorc3RhdGljIGFjcGlfc3RhdHVzIF9faW5pdCBlZWVwY193bWlfcGFyc2VfZGV2aWNlKGFjcGlfaGFuZGxlIGhhbmRsZSwgdTMyIGxldmVsLAorCQkJCQkJIHZvaWQgKmNvbnRleHQsIHZvaWQgKipyZXR2YWwpCit7CisJcHJfd2FybmluZygiRm91bmQgbGVnYWN5IEFUS0QgZGV2aWNlICglcykiLCBFRUVQQ19BQ1BJX0hJRCk7CisJKihib29sICopY29udGV4dCA9IHRydWU7CisJcmV0dXJuIEFFX0NUUkxfVEVSTUlOQVRFOworfQorCitzdGF0aWMgaW50IF9faW5pdCBlZWVwY193bWlfY2hlY2tfYXRrZCh2b2lkKQoreworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwlib29sIGZvdW5kID0gZmFsc2U7CisKKwlzdGF0dXMgPSBhY3BpX2dldF9kZXZpY2VzKEVFRVBDX0FDUElfSElELCBlZWVwY193bWlfcGFyc2VfZGV2aWNlLAorCQkJCSAgJmZvdW5kLCBOVUxMKTsKKworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSB8fCAhZm91bmQpCisJCXJldHVybiAwOworCXJldHVybiAtMTsKK30KKwogc3RhdGljIGludCBfX2luaXQgZWVlcGNfd21pX2luaXQodm9pZCkKIHsKLQlzdHJ1Y3QgZWVlcGNfd21pICplZWVwYzsKIAlpbnQgZXJyOwogCiAJaWYgKCF3bWlfaGFzX2d1aWQoRUVFUENfV01JX0VWRU5UX0dVSUQpIHx8CkBAIC00MTEsNTggKzg5NCw0MCBAQAogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKLQllZWVwYyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBlZWVwY193bWkpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWVlZXBjKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCXBsYXRmb3JtX2RldmljZSA9IHBsYXRmb3JtX2RldmljZV9hbGxvYyhFRUVQQ19XTUlfRklMRSwgLTEpOwotCWlmICghcGxhdGZvcm1fZGV2aWNlKSB7Ci0JCXByX3dhcm5pbmcoIlVuYWJsZSB0byBhbGxvY2F0ZSBwbGF0Zm9ybSBkZXZpY2VcbiIpOwotCQllcnIgPSAtRU5PTUVNOwotCQlnb3RvIGZhaWxfcGxhdGZvcm07CisJaWYgKGVlZXBjX3dtaV9jaGVja19hdGtkKCkpIHsKKwkJcHJfd2FybmluZygiV01JIGRldmljZSBwcmVzZW50LCBidXQgbGVnYWN5IEFUS0QgZGV2aWNlIGlzIGFsc28gIgorCQkJICAgInByZXNlbnQgYW5kIGVuYWJsZWQuIik7CisJCXByX3dhcm5pbmcoIllvdSBwcm9iYWJseSBib290ZWQgd2l0aCBhY3BpX29zaT1cIkxpbnV4XCIgb3IgIgorCQkJICAgImFjcGlfb3NpPVwiIVdpbmRvd3MgMjAwOVwiIik7CisJCXByX3dhcm5pbmcoIkNhbid0IGxvYWQgZWVlcGMtd21pLCB1c2UgZGVmYXVsdCBhY3BpX29zaSAiCisJCQkgICAiKHByZWZlcnJlZCkgb3IgZWVlcGMtbGFwdG9wIik7CisJCXJldHVybiAtRU5PREVWOwogCX0KIAotCWVyciA9IHBsYXRmb3JtX2RldmljZV9hZGQocGxhdGZvcm1fZGV2aWNlKTsKLQlpZiAoZXJyKSB7Ci0JCXByX3dhcm5pbmcoIlVuYWJsZSB0byBhZGQgcGxhdGZvcm0gZGV2aWNlXG4iKTsKLQkJZ290byBwdXRfZGV2OworCXBsYXRmb3JtX2RldmljZSA9IGVlZXBjX3dtaV9hZGQoKTsKKwlpZiAoSVNfRVJSKHBsYXRmb3JtX2RldmljZSkpIHsKKwkJZXJyID0gUFRSX0VSUihwbGF0Zm9ybV9kZXZpY2UpOworCQlnb3RvIGZhaWxfZWVlcGNfd21pOwogCX0KIAotCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBsYXRmb3JtX2RldmljZSwgZWVlcGMpOwotCiAJZXJyID0gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZwbGF0Zm9ybV9kcml2ZXIpOwogCWlmIChlcnIpIHsKIAkJcHJfd2FybmluZygiVW5hYmxlIHRvIHJlZ2lzdGVyIHBsYXRmb3JtIGRyaXZlclxuIik7Ci0JCWdvdG8gZGVsX2RldjsKKwkJZ290byBmYWlsX3BsYXRmb3JtX2RyaXZlcjsKIAl9CiAKLQllcnIgPSBlZWVwY193bWlfc3lzZnNfaW5pdChwbGF0Zm9ybV9kZXZpY2UpOwotCWlmIChlcnIpCi0JCWdvdG8gZGVsX3N5c2ZzOwotCiAJcmV0dXJuIDA7CiAKLWRlbF9zeXNmczoKLQllZWVwY193bWlfc3lzZnNfZXhpdChwbGF0Zm9ybV9kZXZpY2UpOwotZGVsX2RldjoKLQlwbGF0Zm9ybV9kZXZpY2VfZGVsKHBsYXRmb3JtX2RldmljZSk7Ci1wdXRfZGV2OgotCXBsYXRmb3JtX2RldmljZV9wdXQocGxhdGZvcm1fZGV2aWNlKTsKLWZhaWxfcGxhdGZvcm06Ci0Ja2ZyZWUoZWVlcGMpOwotCitmYWlsX3BsYXRmb3JtX2RyaXZlcjoKKwllZWVwY193bWlfcmVtb3ZlKHBsYXRmb3JtX2RldmljZSk7CitmYWlsX2VlZXBjX3dtaToKIAlyZXR1cm4gZXJyOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgZWVlcGNfd21pX2V4aXQodm9pZCkKIHsKLQlzdHJ1Y3QgZWVlcGNfd21pICplZWVwYzsKLQotCWVlZXBjX3dtaV9zeXNmc19leGl0KHBsYXRmb3JtX2RldmljZSk7Ci0JZWVlcGMgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwbGF0Zm9ybV9kZXZpY2UpOworCWVlZXBjX3dtaV9yZW1vdmUocGxhdGZvcm1fZGV2aWNlKTsKIAlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmcGxhdGZvcm1fZHJpdmVyKTsKLQlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcihwbGF0Zm9ybV9kZXZpY2UpOwotCWtmcmVlKGVlZXBjKTsKIH0KIAogbW9kdWxlX2luaXQoZWVlcGNfd21pX2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wbGF0Zm9ybS94ODYvZnVqaXRzdS1sYXB0b3AuYyBiL2RyaXZlcnMvcGxhdGZvcm0veDg2L2Z1aml0c3UtbGFwdG9wLmMKaW5kZXggZjQ0Y2QyNi4uYWQ4OGIyZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wbGF0Zm9ybS94ODYvZnVqaXRzdS1sYXB0b3AuYworKysgYi9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9mdWppdHN1LWxhcHRvcC5jCkBAIC0xMjQwLDcgKzEyNDAsNyBAQAogTU9EVUxFX0FMSUFTKCJkbWk6Kjpzdm5GVUpJVFNVU0lFTUVOUzoqOnB2cjpydm5GVUpJVFNVOnJuRkpOQjFFNjoqOmN2clM2NDIwOioiKTsKIE1PRFVMRV9BTElBUygiZG1pOio6c3ZuRlVKSVRTVToqOnB2cjpydm5GVUpJVFNVOnJuRkpOQjE5QzoqOmN2clM3MDIwOioiKTsKIAotc3RhdGljIHN0cnVjdCBwbnBfZGV2aWNlX2lkIHBucF9pZHNbXSA9IHsKK3N0YXRpYyBzdHJ1Y3QgcG5wX2RldmljZV9pZCBwbnBfaWRzW10gX191c2VkID0gewogCXsuaWQgPSAiRlVKMDJiZiJ9LAogCXsuaWQgPSAiRlVKMDJCMSJ9LAogCXsuaWQgPSAiRlVKMDJFMyJ9LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wbGF0Zm9ybS94ODYvaWRlYXBhZC1sYXB0b3AuYyBiL2RyaXZlcnMvcGxhdGZvcm0veDg2L2lkZWFwYWQtbGFwdG9wLmMKaW5kZXggNWZmMTIyMC4uMTE0ZDk1MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wbGF0Zm9ybS94ODYvaWRlYXBhZC1sYXB0b3AuYworKysgYi9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9pZGVhcGFkLWxhcHRvcC5jCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqICBpZGVhcGFkX2FjcGkuYyAtIExlbm92byBJZGVhUGFkIEFDUEkgRXh0cmFzCisgKiAgaWRlYXBhZC1sYXB0b3AuYyAtIExlbm92byBJZGVhUGFkIEFDUEkgRXh0cmFzCiAgKgogICogIENvcHlyaWdodCDCqSAyMDEwIEludGVsIENvcnBvcmF0aW9uCiAgKiAgQ29weXJpZ2h0IMKpIDIwMTAgRGF2aWQgV29vZGhvdXNlIDxkd213MkBpbmZyYWRlYWQub3JnPgpAQCAtMjcsMzEgKzI3LDE5IEBACiAjaW5jbHVkZSA8YWNwaS9hY3BpX2J1cy5oPgogI2luY2x1ZGUgPGFjcGkvYWNwaV9kcml2ZXJzLmg+CiAjaW5jbHVkZSA8bGludXgvcmZraWxsLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnB1dC9zcGFyc2Uta2V5bWFwLmg+CiAKLSNkZWZpbmUgSURFQVBBRF9ERVZfQ0FNRVJBCTAKLSNkZWZpbmUgSURFQVBBRF9ERVZfV0xBTgkxCi0jZGVmaW5lIElERUFQQURfREVWX0JMVUVUT09USAkyCi0jZGVmaW5lIElERUFQQURfREVWXzNHCQkzCi0jZGVmaW5lIElERUFQQURfREVWX0tJTExTVwk0CisjZGVmaW5lIElERUFQQURfUkZLSUxMX0RFVl9OVU0JKDMpCiAKIHN0cnVjdCBpZGVhcGFkX3ByaXZhdGUgewotCWFjcGlfaGFuZGxlIGhhbmRsZTsKLQlzdHJ1Y3QgcmZraWxsICpyZmtbNV07Ci19ICppZGVhcGFkX3ByaXY7Ci0KLXN0YXRpYyBzdHJ1Y3QgewotCWNoYXIgKm5hbWU7Ci0JaW50IGNmZ2JpdDsKLQlpbnQgb3Bjb2RlOwotCWludCB0eXBlOwotfSBpZGVhcGFkX3Jma19kYXRhW10gPSB7Ci0JeyAiaWRlYXBhZF9jYW1lcmEiLAkxOSwgMHgxRSwgTlVNX1JGS0lMTF9UWVBFUyB9LAotCXsgImlkZWFwYWRfd2xhbiIsCTE4LCAweDE1LCBSRktJTExfVFlQRV9XTEFOIH0sCi0JeyAiaWRlYXBhZF9ibHVldG9vdGgiLAkxNiwgMHgxNywgUkZLSUxMX1RZUEVfQkxVRVRPT1RIIH0sCi0JeyAiaWRlYXBhZF8zZyIsCQkxNywgMHgyMCwgUkZLSUxMX1RZUEVfV1dBTiB9LAotCXsgImlkZWFwYWRfa2lsbHN3IiwJMCwgIDAsICAgIFJGS0lMTF9UWVBFX1dMQU4gfQorCXN0cnVjdCByZmtpbGwgKnJma1tJREVBUEFEX1JGS0lMTF9ERVZfTlVNXTsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwbGF0Zm9ybV9kZXZpY2U7CisJc3RydWN0IGlucHV0X2RldiAqaW5wdXRkZXY7CiB9OwogCitzdGF0aWMgYWNwaV9oYW5kbGUgaWRlYXBhZF9oYW5kbGU7CiBzdGF0aWMgYm9vbCBub19idF9yZmtpbGw7CiBtb2R1bGVfcGFyYW0obm9fYnRfcmZraWxsLCBib29sLCAwNDQ0KTsKIE1PRFVMRV9QQVJNX0RFU0Mobm9fYnRfcmZraWxsLCAiTm8gcmZraWxsIGZvciBibHVldG9vdGguIik7CkBAIC0xNjMsMTcgKzE1MSwxNyBAQAogCXByX2VycigidGltZW91dCBpbiB3cml0ZV9lY19jbWRcbiIpOwogCXJldHVybiAtMTsKIH0KLS8qIHRoZSBhYm92ZSBpcyBBQ1BJIGhlbHBlcnMgKi8KIAorLyoKKyAqIGNhbWVyYSBwb3dlcgorICovCiBzdGF0aWMgc3NpemVfdCBzaG93X2lkZWFwYWRfY2FtKHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKIAkJCQljaGFyICpidWYpCiB7Ci0Jc3RydWN0IGlkZWFwYWRfcHJpdmF0ZSAqcHJpdiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCWFjcGlfaGFuZGxlIGhhbmRsZSA9IHByaXYtPmhhbmRsZTsKIAl1bnNpZ25lZCBsb25nIHJlc3VsdDsKIAotCWlmIChyZWFkX2VjX2RhdGEoaGFuZGxlLCAweDFELCAmcmVzdWx0KSkKKwlpZiAocmVhZF9lY19kYXRhKGlkZWFwYWRfaGFuZGxlLCAweDFELCAmcmVzdWx0KSkKIAkJcmV0dXJuIHNwcmludGYoYnVmLCAiLTFcbiIpOwogCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVsdVxuIiwgcmVzdWx0KTsKIH0KQEAgLTE4MiwxNSArMTcwLDEzIEBACiAJCQkJIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAogCQkJCSBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKIHsKLQlzdHJ1Y3QgaWRlYXBhZF9wcml2YXRlICpwcml2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0JYWNwaV9oYW5kbGUgaGFuZGxlID0gcHJpdi0+aGFuZGxlOwogCWludCByZXQsIHN0YXRlOwogCiAJaWYgKCFjb3VudCkKIAkJcmV0dXJuIDA7CiAJaWYgKHNzY2FuZihidWYsICIlaSIsICZzdGF0ZSkgIT0gMSkKIAkJcmV0dXJuIC1FSU5WQUw7Ci0JcmV0ID0gd3JpdGVfZWNfY21kKGhhbmRsZSwgMHgxRSwgc3RhdGUpOworCXJldCA9IHdyaXRlX2VjX2NtZChpZGVhcGFkX2hhbmRsZSwgMHgxRSwgc3RhdGUpOwogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCXJldHVybiBjb3VudDsKQEAgLTE5OCwxNiArMTg0LDI3IEBACiAKIHN0YXRpYyBERVZJQ0VfQVRUUihjYW1lcmFfcG93ZXIsIDA2NDQsIHNob3dfaWRlYXBhZF9jYW0sIHN0b3JlX2lkZWFwYWRfY2FtKTsKIAorLyoKKyAqIFJma2lsbAorICovCitzdHJ1Y3QgaWRlYXBhZF9yZmtfZGF0YSB7CisJY2hhciAqbmFtZTsKKwlpbnQgY2ZnYml0OworCWludCBvcGNvZGU7CisJaW50IHR5cGU7Cit9OworCitjb25zdCBzdHJ1Y3QgaWRlYXBhZF9yZmtfZGF0YSBpZGVhcGFkX3Jma19kYXRhW10gPSB7CisJeyAiaWRlYXBhZF93bGFuIiwJMTgsIDB4MTUsIFJGS0lMTF9UWVBFX1dMQU4gfSwKKwl7ICJpZGVhcGFkX2JsdWV0b290aCIsCTE2LCAweDE3LCBSRktJTExfVFlQRV9CTFVFVE9PVEggfSwKKwl7ICJpZGVhcGFkXzNnIiwJCTE3LCAweDIwLCBSRktJTExfVFlQRV9XV0FOIH0sCit9OworCiBzdGF0aWMgaW50IGlkZWFwYWRfcmZrX3NldCh2b2lkICpkYXRhLCBib29sIGJsb2NrZWQpCiB7Ci0JaW50IGRldmljZSA9ICh1bnNpZ25lZCBsb25nKWRhdGE7CisJdW5zaWduZWQgbG9uZyBvcGNvZGUgPSAodW5zaWduZWQgbG9uZylkYXRhOwogCi0JaWYgKGRldmljZSA9PSBJREVBUEFEX0RFVl9LSUxMU1cpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JcmV0dXJuIHdyaXRlX2VjX2NtZChpZGVhcGFkX3ByaXYtPmhhbmRsZSwKLQkJCSAgICBpZGVhcGFkX3Jma19kYXRhW2RldmljZV0ub3Bjb2RlLAotCQkJICAgICFibG9ja2VkKTsKKwlyZXR1cm4gd3JpdGVfZWNfY21kKGlkZWFwYWRfaGFuZGxlLCBvcGNvZGUsICFibG9ja2VkKTsKIH0KIAogc3RhdGljIHN0cnVjdCByZmtpbGxfb3BzIGlkZWFwYWRfcmZrX29wcyA9IHsKQEAgLTIxNywyMCArMjE0LDIwIEBACiBzdGF0aWMgdm9pZCBpZGVhcGFkX3N5bmNfcmZrX3N0YXRlKHN0cnVjdCBhY3BpX2RldmljZSAqYWRldmljZSkKIHsKIAlzdHJ1Y3QgaWRlYXBhZF9wcml2YXRlICpwcml2ID0gZGV2X2dldF9kcnZkYXRhKCZhZGV2aWNlLT5kZXYpOwotCWFjcGlfaGFuZGxlIGhhbmRsZSA9IHByaXYtPmhhbmRsZTsKIAl1bnNpZ25lZCBsb25nIGh3X2Jsb2NrZWQ7CiAJaW50IGk7CiAKLQlpZiAocmVhZF9lY19kYXRhKGhhbmRsZSwgMHgyMywgJmh3X2Jsb2NrZWQpKQorCWlmIChyZWFkX2VjX2RhdGEoaWRlYXBhZF9oYW5kbGUsIDB4MjMsICZod19ibG9ja2VkKSkKIAkJcmV0dXJuOwogCWh3X2Jsb2NrZWQgPSAhaHdfYmxvY2tlZDsKIAotCWZvciAoaSA9IElERUFQQURfREVWX1dMQU47IGkgPD0gSURFQVBBRF9ERVZfS0lMTFNXOyBpKyspCisJZm9yIChpID0gMDsgaSA8IElERUFQQURfUkZLSUxMX0RFVl9OVU07IGkrKykKIAkJaWYgKHByaXYtPnJma1tpXSkKIAkJCXJma2lsbF9zZXRfaHdfc3RhdGUocHJpdi0+cmZrW2ldLCBod19ibG9ja2VkKTsKIH0KIAotc3RhdGljIGludCBpZGVhcGFkX3JlZ2lzdGVyX3Jma2lsbChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmFkZXZpY2UsIGludCBkZXYpCitzdGF0aWMgaW50IF9fZGV2aW5pdCBpZGVhcGFkX3JlZ2lzdGVyX3Jma2lsbChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmFkZXZpY2UsCisJCQkJCSAgICAgaW50IGRldikKIHsKIAlzdHJ1Y3QgaWRlYXBhZF9wcml2YXRlICpwcml2ID0gZGV2X2dldF9kcnZkYXRhKCZhZGV2aWNlLT5kZXYpOwogCWludCByZXQ7CkBAIC0yMzksNyArMjM2LDcgQEAKIAlpZiAobm9fYnRfcmZraWxsICYmCiAJICAgIChpZGVhcGFkX3Jma19kYXRhW2Rldl0udHlwZSA9PSBSRktJTExfVFlQRV9CTFVFVE9PVEgpKSB7CiAJCS8qIEZvcmNlIHRvIGVuYWJsZSBibHVldG9vdGggd2hlbiBub19idF9yZmtpbGw9MSAqLwotCQl3cml0ZV9lY19jbWQoaWRlYXBhZF9wcml2LT5oYW5kbGUsCisJCXdyaXRlX2VjX2NtZChpZGVhcGFkX2hhbmRsZSwKIAkJCSAgICAgaWRlYXBhZF9yZmtfZGF0YVtkZXZdLm9wY29kZSwgMSk7CiAJCXJldHVybiAwOwogCX0KQEAgLTI1MCw3ICsyNDcsNyBAQAogCWlmICghcHJpdi0+cmZrW2Rldl0pCiAJCXJldHVybiAtRU5PTUVNOwogCi0JaWYgKHJlYWRfZWNfZGF0YShpZGVhcGFkX3ByaXYtPmhhbmRsZSwgaWRlYXBhZF9yZmtfZGF0YVtkZXZdLm9wY29kZS0xLAorCWlmIChyZWFkX2VjX2RhdGEoaWRlYXBhZF9oYW5kbGUsIGlkZWFwYWRfcmZrX2RhdGFbZGV2XS5vcGNvZGUtMSwKIAkJCSAmc3dfYmxvY2tlZCkpIHsKIAkJcmZraWxsX2luaXRfc3dfc3RhdGUocHJpdi0+cmZrW2Rldl0sIDApOwogCX0gZWxzZSB7CkBAIC0yNjYsNyArMjYzLDggQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgaWRlYXBhZF91bnJlZ2lzdGVyX3Jma2lsbChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmFkZXZpY2UsIGludCBkZXYpCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgaWRlYXBhZF91bnJlZ2lzdGVyX3Jma2lsbChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmFkZXZpY2UsCisJCQkJCQlpbnQgZGV2KQogewogCXN0cnVjdCBpZGVhcGFkX3ByaXZhdGUgKnByaXYgPSBkZXZfZ2V0X2RydmRhdGEoJmFkZXZpY2UtPmRldik7CiAKQEAgLTI3Nyw3MyArMjc1LDE3NyBAQAogCXJma2lsbF9kZXN0cm95KHByaXYtPnJma1tkZXZdKTsKIH0KIAorLyoKKyAqIFBsYXRmb3JtIGRldmljZQorICovCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqaWRlYXBhZF9hdHRyaWJ1dGVzW10gPSB7CisJJmRldl9hdHRyX2NhbWVyYV9wb3dlci5hdHRyLAorCU5VTEwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGlkZWFwYWRfYXR0cmlidXRlX2dyb3VwID0geworCS5hdHRycyA9IGlkZWFwYWRfYXR0cmlidXRlcworfTsKKworc3RhdGljIGludCBfX2RldmluaXQgaWRlYXBhZF9wbGF0Zm9ybV9pbml0KHN0cnVjdCBpZGVhcGFkX3ByaXZhdGUgKnByaXYpCit7CisJaW50IHJlc3VsdDsKKworCXByaXYtPnBsYXRmb3JtX2RldmljZSA9IHBsYXRmb3JtX2RldmljZV9hbGxvYygiaWRlYXBhZCIsIC0xKTsKKwlpZiAoIXByaXYtPnBsYXRmb3JtX2RldmljZSkKKwkJcmV0dXJuIC1FTk9NRU07CisJcGxhdGZvcm1fc2V0X2RydmRhdGEocHJpdi0+cGxhdGZvcm1fZGV2aWNlLCBwcml2KTsKKworCXJlc3VsdCA9IHBsYXRmb3JtX2RldmljZV9hZGQocHJpdi0+cGxhdGZvcm1fZGV2aWNlKTsKKwlpZiAocmVzdWx0KQorCQlnb3RvIGZhaWxfcGxhdGZvcm1fZGV2aWNlOworCisJcmVzdWx0ID0gc3lzZnNfY3JlYXRlX2dyb3VwKCZwcml2LT5wbGF0Zm9ybV9kZXZpY2UtPmRldi5rb2JqLAorCQkJCSAgICAmaWRlYXBhZF9hdHRyaWJ1dGVfZ3JvdXApOworCWlmIChyZXN1bHQpCisJCWdvdG8gZmFpbF9zeXNmczsKKwlyZXR1cm4gMDsKKworZmFpbF9zeXNmczoKKwlwbGF0Zm9ybV9kZXZpY2VfZGVsKHByaXYtPnBsYXRmb3JtX2RldmljZSk7CitmYWlsX3BsYXRmb3JtX2RldmljZToKKwlwbGF0Zm9ybV9kZXZpY2VfcHV0KHByaXYtPnBsYXRmb3JtX2RldmljZSk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIHZvaWQgaWRlYXBhZF9wbGF0Zm9ybV9leGl0KHN0cnVjdCBpZGVhcGFkX3ByaXZhdGUgKnByaXYpCit7CisJc3lzZnNfcmVtb3ZlX2dyb3VwKCZwcml2LT5wbGF0Zm9ybV9kZXZpY2UtPmRldi5rb2JqLAorCQkJICAgJmlkZWFwYWRfYXR0cmlidXRlX2dyb3VwKTsKKwlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3Rlcihwcml2LT5wbGF0Zm9ybV9kZXZpY2UpOworfQorCisvKgorICogaW5wdXQgZGV2aWNlCisgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qga2V5X2VudHJ5IGlkZWFwYWRfa2V5bWFwW10gPSB7CisJeyBLRV9LRVksIDB4MDYsIHsgS0VZX1NXSVRDSFZJREVPTU9ERSB9IH0sCisJeyBLRV9LRVksIDB4MEQsIHsgS0VZX1dMQU4gfSB9LAorCXsgS0VfRU5ELCAwIH0sCit9OworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBpZGVhcGFkX2lucHV0X2luaXQoc3RydWN0IGlkZWFwYWRfcHJpdmF0ZSAqcHJpdikKK3sKKwlzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dGRldjsKKwlpbnQgZXJyb3I7CisKKwlpbnB1dGRldiA9IGlucHV0X2FsbG9jYXRlX2RldmljZSgpOworCWlmICghaW5wdXRkZXYpIHsKKwkJcHJfaW5mbygiVW5hYmxlIHRvIGFsbG9jYXRlIGlucHV0IGRldmljZVxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWlucHV0ZGV2LT5uYW1lID0gIklkZWFwYWQgZXh0cmEgYnV0dG9ucyI7CisJaW5wdXRkZXYtPnBoeXMgPSAiaWRlYXBhZC9pbnB1dDAiOworCWlucHV0ZGV2LT5pZC5idXN0eXBlID0gQlVTX0hPU1Q7CisJaW5wdXRkZXYtPmRldi5wYXJlbnQgPSAmcHJpdi0+cGxhdGZvcm1fZGV2aWNlLT5kZXY7CisKKwllcnJvciA9IHNwYXJzZV9rZXltYXBfc2V0dXAoaW5wdXRkZXYsIGlkZWFwYWRfa2V5bWFwLCBOVUxMKTsKKwlpZiAoZXJyb3IpIHsKKwkJcHJfZXJyKCJVbmFibGUgdG8gc2V0dXAgaW5wdXQgZGV2aWNlIGtleW1hcFxuIik7CisJCWdvdG8gZXJyX2ZyZWVfZGV2OworCX0KKworCWVycm9yID0gaW5wdXRfcmVnaXN0ZXJfZGV2aWNlKGlucHV0ZGV2KTsKKwlpZiAoZXJyb3IpIHsKKwkJcHJfZXJyKCJVbmFibGUgdG8gcmVnaXN0ZXIgaW5wdXQgZGV2aWNlXG4iKTsKKwkJZ290byBlcnJfZnJlZV9rZXltYXA7CisJfQorCisJcHJpdi0+aW5wdXRkZXYgPSBpbnB1dGRldjsKKwlyZXR1cm4gMDsKKworZXJyX2ZyZWVfa2V5bWFwOgorCXNwYXJzZV9rZXltYXBfZnJlZShpbnB1dGRldik7CitlcnJfZnJlZV9kZXY6CisJaW5wdXRfZnJlZV9kZXZpY2UoaW5wdXRkZXYpOworCXJldHVybiBlcnJvcjsKK30KKworc3RhdGljIHZvaWQgX19kZXZleGl0IGlkZWFwYWRfaW5wdXRfZXhpdChzdHJ1Y3QgaWRlYXBhZF9wcml2YXRlICpwcml2KQoreworCXNwYXJzZV9rZXltYXBfZnJlZShwcml2LT5pbnB1dGRldik7CisJaW5wdXRfdW5yZWdpc3Rlcl9kZXZpY2UocHJpdi0+aW5wdXRkZXYpOworCXByaXYtPmlucHV0ZGV2ID0gTlVMTDsKK30KKworc3RhdGljIHZvaWQgaWRlYXBhZF9pbnB1dF9yZXBvcnQoc3RydWN0IGlkZWFwYWRfcHJpdmF0ZSAqcHJpdiwKKwkJCQkgdW5zaWduZWQgbG9uZyBzY2FuY29kZSkKK3sKKwlzcGFyc2Vfa2V5bWFwX3JlcG9ydF9ldmVudChwcml2LT5pbnB1dGRldiwgc2NhbmNvZGUsIDEsIHRydWUpOworfQorCisvKgorICogbW9kdWxlIGluaXQvZXhpdAorICovCiBzdGF0aWMgY29uc3Qgc3RydWN0IGFjcGlfZGV2aWNlX2lkIGlkZWFwYWRfZGV2aWNlX2lkc1tdID0gewogCXsgIlZQQzIwMDQiLCAwfSwKIAl7ICIiLCAwfSwKIH07CiBNT0RVTEVfREVWSUNFX1RBQkxFKGFjcGksIGlkZWFwYWRfZGV2aWNlX2lkcyk7CiAKLXN0YXRpYyBpbnQgaWRlYXBhZF9hY3BpX2FkZChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmFkZXZpY2UpCitzdGF0aWMgaW50IF9fZGV2aW5pdCBpZGVhcGFkX2FjcGlfYWRkKHN0cnVjdCBhY3BpX2RldmljZSAqYWRldmljZSkKIHsKLQlpbnQgaSwgY2ZnOwotCWludCBkZXZzX3ByZXNlbnRbNV07CisJaW50IHJldCwgaSwgY2ZnOwogCXN0cnVjdCBpZGVhcGFkX3ByaXZhdGUgKnByaXY7CiAKIAlpZiAocmVhZF9tZXRob2RfaW50KGFkZXZpY2UtPmhhbmRsZSwgIl9DRkciLCAmY2ZnKSkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKLQlmb3IgKGkgPSBJREVBUEFEX0RFVl9DQU1FUkE7IGkgPCBJREVBUEFEX0RFVl9LSUxMU1c7IGkrKykgewotCQlpZiAodGVzdF9iaXQoaWRlYXBhZF9yZmtfZGF0YVtpXS5jZmdiaXQsICh1bnNpZ25lZCBsb25nICopJmNmZykpCi0JCQlkZXZzX3ByZXNlbnRbaV0gPSAxOwotCQllbHNlCi0JCQlkZXZzX3ByZXNlbnRbaV0gPSAwOwotCX0KLQotCS8qIFRoZSBoYXJkd2FyZSBzd2l0Y2ggaXMgYWx3YXlzIHByZXNlbnQgKi8KLQlkZXZzX3ByZXNlbnRbSURFQVBBRF9ERVZfS0lMTFNXXSA9IDE7Ci0KIAlwcml2ID0ga3phbGxvYyhzaXplb2YoKnByaXYpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXByaXYpCiAJCXJldHVybiAtRU5PTUVNOwotCi0JaWYgKGRldnNfcHJlc2VudFtJREVBUEFEX0RFVl9DQU1FUkFdKSB7Ci0JCWludCByZXQgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJmFkZXZpY2UtPmRldiwgJmRldl9hdHRyX2NhbWVyYV9wb3dlcik7Ci0JCWlmIChyZXQpIHsKLQkJCWtmcmVlKHByaXYpOwotCQkJcmV0dXJuIHJldDsKLQkJfQotCX0KLQotCXByaXYtPmhhbmRsZSA9IGFkZXZpY2UtPmhhbmRsZTsKIAlkZXZfc2V0X2RydmRhdGEoJmFkZXZpY2UtPmRldiwgcHJpdik7Ci0JaWRlYXBhZF9wcml2ID0gcHJpdjsKLQlmb3IgKGkgPSBJREVBUEFEX0RFVl9XTEFOOyBpIDw9IElERUFQQURfREVWX0tJTExTVzsgaSsrKSB7Ci0JCWlmICghZGV2c19wcmVzZW50W2ldKQotCQkJY29udGludWU7CisJaWRlYXBhZF9oYW5kbGUgPSBhZGV2aWNlLT5oYW5kbGU7CiAKLQkJaWRlYXBhZF9yZWdpc3Rlcl9yZmtpbGwoYWRldmljZSwgaSk7CisJcmV0ID0gaWRlYXBhZF9wbGF0Zm9ybV9pbml0KHByaXYpOworCWlmIChyZXQpCisJCWdvdG8gcGxhdGZvcm1fZmFpbGVkOworCisJcmV0ID0gaWRlYXBhZF9pbnB1dF9pbml0KHByaXYpOworCWlmIChyZXQpCisJCWdvdG8gaW5wdXRfZmFpbGVkOworCisJZm9yIChpID0gMDsgaSA8IElERUFQQURfUkZLSUxMX0RFVl9OVU07IGkrKykgeworCQlpZiAodGVzdF9iaXQoaWRlYXBhZF9yZmtfZGF0YVtpXS5jZmdiaXQsICh1bnNpZ25lZCBsb25nICopJmNmZykpCisJCQlpZGVhcGFkX3JlZ2lzdGVyX3Jma2lsbChhZGV2aWNlLCBpKTsKKwkJZWxzZQorCQkJcHJpdi0+cmZrW2ldID0gTlVMTDsKIAl9CiAJaWRlYXBhZF9zeW5jX3Jma19zdGF0ZShhZGV2aWNlKTsKKwogCXJldHVybiAwOworCitpbnB1dF9mYWlsZWQ6CisJaWRlYXBhZF9wbGF0Zm9ybV9leGl0KHByaXYpOworcGxhdGZvcm1fZmFpbGVkOgorCWtmcmVlKHByaXYpOworCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgaWRlYXBhZF9hY3BpX3JlbW92ZShzdHJ1Y3QgYWNwaV9kZXZpY2UgKmFkZXZpY2UsIGludCB0eXBlKQorc3RhdGljIGludCBfX2RldmV4aXQgaWRlYXBhZF9hY3BpX3JlbW92ZShzdHJ1Y3QgYWNwaV9kZXZpY2UgKmFkZXZpY2UsIGludCB0eXBlKQogewogCXN0cnVjdCBpZGVhcGFkX3ByaXZhdGUgKnByaXYgPSBkZXZfZ2V0X2RydmRhdGEoJmFkZXZpY2UtPmRldik7CiAJaW50IGk7CiAKLQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJmFkZXZpY2UtPmRldiwgJmRldl9hdHRyX2NhbWVyYV9wb3dlcik7Ci0KLQlmb3IgKGkgPSBJREVBUEFEX0RFVl9XTEFOOyBpIDw9IElERUFQQURfREVWX0tJTExTVzsgaSsrKQorCWZvciAoaSA9IDA7IGkgPCBJREVBUEFEX1JGS0lMTF9ERVZfTlVNOyBpKyspCiAJCWlkZWFwYWRfdW5yZWdpc3Rlcl9yZmtpbGwoYWRldmljZSwgaSk7Ci0KKwlpZGVhcGFkX2lucHV0X2V4aXQocHJpdik7CisJaWRlYXBhZF9wbGF0Zm9ybV9leGl0KHByaXYpOwogCWRldl9zZXRfZHJ2ZGF0YSgmYWRldmljZS0+ZGV2LCBOVUxMKTsKIAlrZnJlZShwcml2KTsKKwogCXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZCBpZGVhcGFkX2FjcGlfbm90aWZ5KHN0cnVjdCBhY3BpX2RldmljZSAqYWRldmljZSwgdTMyIGV2ZW50KQogeworCXN0cnVjdCBpZGVhcGFkX3ByaXZhdGUgKnByaXYgPSBkZXZfZ2V0X2RydmRhdGEoJmFkZXZpY2UtPmRldik7CiAJYWNwaV9oYW5kbGUgaGFuZGxlID0gYWRldmljZS0+aGFuZGxlOwogCXVuc2lnbmVkIGxvbmcgdnBjMSwgdnBjMiwgdnBjX2JpdDsKIApAQCAtMzU3LDYgKzQ1OSw4IEBACiAJCWlmICh0ZXN0X2JpdCh2cGNfYml0LCAmdnBjMSkpIHsKIAkJCWlmICh2cGNfYml0ID09IDkpCiAJCQkJaWRlYXBhZF9zeW5jX3Jma19zdGF0ZShhZGV2aWNlKTsKKwkJCWVsc2UKKwkJCQlpZGVhcGFkX2lucHV0X3JlcG9ydChwcml2LCB2cGNfYml0KTsKIAkJfQogCX0KIH0KQEAgLTM3MSwxOSArNDc1LDE0IEBACiAJLm93bmVyID0gVEhJU19NT0RVTEUsCiB9OwogCi0KIHN0YXRpYyBpbnQgX19pbml0IGlkZWFwYWRfYWNwaV9tb2R1bGVfaW5pdCh2b2lkKQogewotCWFjcGlfYnVzX3JlZ2lzdGVyX2RyaXZlcigmaWRlYXBhZF9hY3BpX2RyaXZlcik7Ci0KLQlyZXR1cm4gMDsKKwlyZXR1cm4gYWNwaV9idXNfcmVnaXN0ZXJfZHJpdmVyKCZpZGVhcGFkX2FjcGlfZHJpdmVyKTsKIH0KIAotCiBzdGF0aWMgdm9pZCBfX2V4aXQgaWRlYXBhZF9hY3BpX21vZHVsZV9leGl0KHZvaWQpCiB7CiAJYWNwaV9idXNfdW5yZWdpc3Rlcl9kcml2ZXIoJmlkZWFwYWRfYWNwaV9kcml2ZXIpOwotCiB9CiAKIE1PRFVMRV9BVVRIT1IoIkRhdmlkIFdvb2Rob3VzZSA8ZHdtdzJAaW5mcmFkZWFkLm9yZz4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGxhdGZvcm0veDg2L2ludGVsX2lwcy5jIGIvZHJpdmVycy9wbGF0Zm9ybS94ODYvaW50ZWxfaXBzLmMKaW5kZXggZjBiM2FkMS4uMTI5NGEzOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wbGF0Zm9ybS94ODYvaW50ZWxfaXBzLmMKKysrIGIvZHJpdmVycy9wbGF0Zm9ybS94ODYvaW50ZWxfaXBzLmMKQEAgLTE0NzQsNyArMTQ3NCw3IEBACiB9CiAKIHZvaWQKLWlwc19saW5rX3RvX2k5MTVfZHJpdmVyKCkKK2lwc19saW5rX3RvX2k5MTVfZHJpdmVyKHZvaWQpCiB7CiAJLyogV2UgY2FuJ3QgY2xlYW5seSBnZXQgYXQgdGhlIHZhcmlvdXMgaXBzX2RyaXZlciBzdHJ1Y3RzIGZyb20KIAkgKiB0aGlzIGNhbGxlciAodGhlIGk5MTUgZHJpdmVyKSwgc28ganVzdCBzZXQgYSBmbGFnIHNheWluZwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wbGF0Zm9ybS94ODYvaW50ZWxfcG1pY19ncGlvLmMgYi9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9pbnRlbF9wbWljX2dwaW8uYwppbmRleCBlNjFkYjlkLi45MzBlNjI3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9pbnRlbF9wbWljX2dwaW8uYworKysgYi9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9pbnRlbF9wbWljX2dwaW8uYwpAQCAtMjQ0LDcgKzI0NCwxMSBAQAogCQkJZ2VuZXJpY19oYW5kbGVfaXJxKHBnLT5pcnFfYmFzZSArIGdwaW8pOwogCQl9CiAJfQotCWRlc2MtPmNoaXAtPmVvaShpcnEpOworCisJaWYgKGRlc2MtPmNoaXAtPmlycV9lb2kpCisJCWRlc2MtPmNoaXAtPmlycV9lb2koaXJxX2dldF9pcnFfZGF0YShpcnEpKTsKKwllbHNlCisJCWRldl93YXJuKHBnLT5jaGlwLmRldiwgIm1pc3NpbmcgRU9JIGhhbmRsZXIgZm9yIGlycSAlZFxuIiwgaXJxKTsKIH0KIAogc3RhdGljIGludCBfX2RldmluaXQgcGxhdGZvcm1fcG1pY19ncGlvX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9pbnRlbF9zY3VfaXBjLmMgYi9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9pbnRlbF9zY3VfaXBjLmMKaW5kZXggY2EzNWIwYy4uMTc1MmVmMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wbGF0Zm9ybS94ODYvaW50ZWxfc2N1X2lwYy5jCisrKyBiL2RyaXZlcnMvcGxhdGZvcm0veDg2L2ludGVsX3NjdV9pcGMuYwpAQCAtNDk3LDcgKzQ5Nyw3IEBACiAJCQkiaW50ZWxfc2N1X2lwYzogSTJDIElOVkFMSURfQ01EID0gMHgleFxuIiwgY21kKTsKIAogCQltdXRleF91bmxvY2soJmlwY2xvY2spOwotCQlyZXR1cm4gLTE7CisJCXJldHVybiAtRUlPOwogCX0KIAltdXRleF91bmxvY2soJmlwY2xvY2spOwogCXJldHVybiAwOwpAQCAtNjQyLDcgKzY0Miw3IEBACiAKIAlpZiAoc3RhdHVzID09IElQQ19GV19VUERBVEVfU1VDQ0VTUykKIAkJcmV0dXJuIDA7Ci0JcmV0dXJuIC0xOworCXJldHVybiAtRUlPOwogfQogRVhQT1JUX1NZTUJPTChpbnRlbF9zY3VfaXBjX2Z3X3VwZGF0ZSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGxhdGZvcm0veDg2L2ludGVsX3NjdV9pcGN1dGlsLmMgYi9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9pbnRlbF9zY3VfaXBjdXRpbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhMzIzMWQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9pbnRlbF9zY3VfaXBjdXRpbC5jCkBAIC0wLDAgKzEsMTMzIEBACisvKgorICogaW50ZWxfc2N1X2lwYy5jOiBEcml2ZXIgZm9yIHRoZSBJbnRlbCBTQ1UgSVBDIG1lY2hhbmlzbQorICoKKyAqIChDKSBDb3B5cmlnaHQgMjAwOC0yMDEwIEludGVsIENvcnBvcmF0aW9uCisgKiBBdXRob3I6IFNyZWVkaGFyYSBEUyAoc3JlZWRoYXJhLmRzQGludGVsLmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHZlcnNpb24gMgorICogb2YgdGhlIExpY2Vuc2UuCisgKgorICogVGhpcyBkcml2ZXIgcHJvdmlkZXMgaW9jdGwgaW50ZXJmYWNlcyB0byBjYWxsIGludGVsIHNjdSBpcGMgZHJpdmVyIGFwaQorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8YXNtL2ludGVsX3NjdV9pcGMuaD4KKworc3RhdGljIHUzMiBtYWpvcjsKKworI2RlZmluZSBNQVhfRldfU0laRSAyNjQxOTIKKworLyogaW9jdGwgY29tbW5kcyAqLworI2RlZmluZQlJTlRFX1NDVV9JUENfUkVHSVNURVJfUkVBRAkwCisjZGVmaW5lIElOVEVfU0NVX0lQQ19SRUdJU1RFUl9XUklURQkxCisjZGVmaW5lIElOVEVfU0NVX0lQQ19SRUdJU1RFUl9VUERBVEUJMgorI2RlZmluZSBJTlRFX1NDVV9JUENfRldfVVBEQVRFCQkweEEyCisKK3N0cnVjdCBzY3VfaXBjX2RhdGEgeworCXUzMiAgICAgY291bnQ7ICAvKiBOby4gb2YgcmVnaXN0ZXJzICovCisJdTE2ICAgICBhZGRyWzVdOyAvKiBSZWdpc3RlciBhZGRyZXNzZXMgKi8KKwl1OCAgICAgIGRhdGFbNV07IC8qIFJlZ2lzdGVyIGRhdGEgKi8KKwl1OCAgICAgIG1hc2s7IC8qIFZhbGlkIGZvciByZWFkLW1vZGlmeS13cml0ZSAqLworfTsKKworLyoqCisgKglzY3VfcmVnX2FjY2VzcwkJLQlpbXBsZW1lbnQgcmVnaXN0ZXIgYWNjZXNzIGlvY3RscworICoJQGNtZDogY29tbWFuZCB3ZSBhcmUgZG9pbmcgKHJlYWQvd3JpdGUvdXBkYXRlKQorICoJQGRhdGE6IGtlcm5lbCBjb3B5IG9mIGlvY3RsIGRhdGEKKyAqCisgKglBbGxvdyB0aGUgdXNlciB0byBwZXJmb3JtIHJlZ2lzdGVyIGFjY2Vzc2VzIG9uIHRoZSBTQ1UgdmlhIHRoZQorICoJa2VybmVsIGludGVyZmFjZQorICovCisKK3N0YXRpYyBpbnQgc2N1X3JlZ19hY2Nlc3ModTMyIGNtZCwgc3RydWN0IHNjdV9pcGNfZGF0YSAgKmRhdGEpCit7CisJaW50IGNvdW50ID0gZGF0YS0+Y291bnQ7CisKKwlpZiAoY291bnQgPT0gMCB8fCBjb3VudCA9PSAzIHx8IGNvdW50ID4gNCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgSU5URV9TQ1VfSVBDX1JFR0lTVEVSX1JFQUQ6CisJCXJldHVybiBpbnRlbF9zY3VfaXBjX3JlYWR2KGRhdGEtPmFkZHIsIGRhdGEtPmRhdGEsIGNvdW50KTsKKwljYXNlIElOVEVfU0NVX0lQQ19SRUdJU1RFUl9XUklURToKKwkJcmV0dXJuIGludGVsX3NjdV9pcGNfd3JpdGV2KGRhdGEtPmFkZHIsIGRhdGEtPmRhdGEsIGNvdW50KTsKKwljYXNlIElOVEVfU0NVX0lQQ19SRUdJU1RFUl9VUERBVEU6CisJCXJldHVybiBpbnRlbF9zY3VfaXBjX3VwZGF0ZV9yZWdpc3RlcihkYXRhLT5hZGRyWzBdLAorCQkJCQkJICAgIGRhdGEtPmRhdGFbMF0sIGRhdGEtPm1hc2spOworCWRlZmF1bHQ6CisJCXJldHVybiAtRU5PVFRZOworCX0KK30KKworLyoqCisgKglzY3VfaXBjX2lvY3RsCQktCWNvbnRyb2wgaW9jdGxzIGZvciB0aGUgU0NVCisgKglAZnA6IGZpbGUgaGFuZGxlIG9mIHRoZSBTQ1UgZGV2aWNlCisgKglAY21kOiBpb2N0bCBjb2NlCisgKglAYXJnOiBwb2ludGVyIHRvIHVzZXIgcGFzc2VkIHN0cnVjdHVyZQorICoKKyAqCVN1cHBvcnQgdGhlIEkvTyBhbmQgZmlybXdhcmUgZmxhc2hpbmcgaW50ZXJmYWNlcyBvZiB0aGUgU0NVCisgKi8KK3N0YXRpYyBsb25nIHNjdV9pcGNfaW9jdGwoc3RydWN0IGZpbGUgKmZwLCB1bnNpZ25lZCBpbnQgY21kLAorCQkJCQkJCXVuc2lnbmVkIGxvbmcgYXJnKQoreworCWludCByZXQ7CisJc3RydWN0IHNjdV9pcGNfZGF0YSAgZGF0YTsKKwl2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKworCWlmICghY2FwYWJsZShDQVBfU1lTX1JBV0lPKSkKKwkJcmV0dXJuIC1FUEVSTTsKKworCWlmIChjbWQgPT0gSU5URV9TQ1VfSVBDX0ZXX1VQREFURSkgeworCQkJdTggKmZ3YnVmID0ga21hbGxvYyhNQVhfRldfU0laRSwgR0ZQX0tFUk5FTCk7CisJCQlpZiAoZndidWYgPT0gTlVMTCkKKwkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCWlmIChjb3B5X2Zyb21fdXNlcihmd2J1ZiwgKHU4ICopYXJnLCBNQVhfRldfU0laRSkpIHsKKwkJCQlrZnJlZShmd2J1Zik7CisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQl9CisJCQlyZXQgPSBpbnRlbF9zY3VfaXBjX2Z3X3VwZGF0ZShmd2J1ZiwgTUFYX0ZXX1NJWkUpOworCQkJa2ZyZWUoZndidWYpOworCQkJcmV0dXJuIHJldDsKKwl9IGVsc2UgeworCQlpZiAoY29weV9mcm9tX3VzZXIoJmRhdGEsIGFyZ3AsIHNpemVvZihzdHJ1Y3Qgc2N1X2lwY19kYXRhKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcmV0ID0gc2N1X3JlZ19hY2Nlc3MoY21kLCAmZGF0YSk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmZGF0YSwgc2l6ZW9mKHN0cnVjdCBzY3VfaXBjX2RhdGEpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlyZXR1cm4gMDsKKwl9Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHNjdV9pcGNfZm9wcyA9IHsKKwkudW5sb2NrZWRfaW9jdGwgPSBzY3VfaXBjX2lvY3RsLAorfTsKKworc3RhdGljIGludCBfX2luaXQgaXBjX21vZHVsZV9pbml0KHZvaWQpCit7CisJcmV0dXJuIHJlZ2lzdGVyX2NocmRldigwLCAiaW50ZWxfbWlkX3NjdSIsICZzY3VfaXBjX2ZvcHMpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgaXBjX21vZHVsZV9leGl0KHZvaWQpCit7CisJdW5yZWdpc3Rlcl9jaHJkZXYobWFqb3IsICJpbnRlbF9taWRfc2N1Iik7Cit9CisKK21vZHVsZV9pbml0KGlwY19tb2R1bGVfaW5pdCk7Cittb2R1bGVfZXhpdChpcGNfbW9kdWxlX2V4aXQpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIFYyIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlV0aWxpdHkgZHJpdmVyIGZvciBpbnRlbCBzY3UgaXBjIik7CitNT0RVTEVfQVVUSE9SKCJTcmVlZGhhcmEgPHNyZWVkaGFyYS5kc0BpbnRlbC5jb20+Iik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9zb255LWxhcHRvcC5jIGIvZHJpdmVycy9wbGF0Zm9ybS94ODYvc29ueS1sYXB0b3AuYwppbmRleCBmMjAwNjc3Li5iNGE5NWJiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9zb255LWxhcHRvcC5jCisrKyBiL2RyaXZlcnMvcGxhdGZvcm0veDg2L3NvbnktbGFwdG9wLmMKQEAgLTIzNSw2ICsyMzUsNyBAQAogCTU3LAkvKiA3MCBTT05ZUElfRVZFTlRfVk9MVU1FX0RFQ19QUkVTU0VEICovCiAJLTEsCS8qIDcxIFNPTllQSV9FVkVOVF9CUklHSFRORVNTX1BSRVNTRUQgKi8KIAk1OCwJLyogNzIgU09OWVBJX0VWRU5UX01FRElBX1BSRVNTRUQgKi8KKwk1OSwJLyogNzIgU09OWVBJX0VWRU5UX1ZFTkRPUl9QUkVTU0VEICovCiB9OwogCiBzdGF0aWMgaW50IHNvbnlfbGFwdG9wX2lucHV0X2tleWNvZGVfbWFwW10gPSB7CkBAIC0yOTcsNiArMjk4LDcgQEAKIAlLRVlfVk9MVU1FVVAsCS8qIDU2IFNPTllQSV9FVkVOVF9WT0xVTUVfSU5DX1BSRVNTRUQgKi8KIAlLRVlfVk9MVU1FRE9XTiwJLyogNTcgU09OWVBJX0VWRU5UX1ZPTFVNRV9ERUNfUFJFU1NFRCAqLwogCUtFWV9NRURJQSwJLyogNTggU09OWVBJX0VWRU5UX01FRElBX1BSRVNTRUQgKi8KKwlLRVlfVkVORE9SLAkvKiA1OSBTT05ZUElfRVZFTlRfVkVORE9SX1BSRVNTRUQgKi8KIH07CiAKIC8qIHJlbGVhc2UgYnV0dG9ucyBhZnRlciBhIHNob3J0IGRlbGF5IGlmIHByZXNzZWQgKi8KQEAgLTg5NCwxMCArODk2LDE4IEBACiAJeyAweDBBLCBTT05ZUElfRVZFTlRfRk5LRVlfUkVMRUFTRUQgfSwKIAl7IDB4OEMsIFNPTllQSV9FVkVOVF9GTktFWV9GMTIgfSwKIAl7IDB4MEMsIFNPTllQSV9FVkVOVF9GTktFWV9SRUxFQVNFRCB9LAorCXsgMHg5ZCwgU09OWVBJX0VWRU5UX1pPT01fUFJFU1NFRCB9LAorCXsgMHgxZCwgU09OWVBJX0VWRU5UX0FOWUJVVFRPTl9SRUxFQVNFRCB9LAogCXsgMHg5ZiwgU09OWVBJX0VWRU5UX0NEX0VKRUNUX1BSRVNTRUQgfSwKIAl7IDB4MWYsIFNPTllQSV9FVkVOVF9BTllCVVRUT05fUkVMRUFTRUQgfSwKIAl7IDB4YTEsIFNPTllQSV9FVkVOVF9NRURJQV9QUkVTU0VEIH0sCiAJeyAweDIxLCBTT05ZUElfRVZFTlRfQU5ZQlVUVE9OX1JFTEVBU0VEIH0sCisJeyAweGE0LCBTT05ZUElfRVZFTlRfQ0RfRUpFQ1RfUFJFU1NFRCB9LAorCXsgMHgyNCwgU09OWVBJX0VWRU5UX0FOWUJVVFRPTl9SRUxFQVNFRCB9LAorCXsgMHhhNSwgU09OWVBJX0VWRU5UX1ZFTkRPUl9QUkVTU0VEIH0sCisJeyAweDI1LCBTT05ZUElfRVZFTlRfQU5ZQlVUVE9OX1JFTEVBU0VEIH0sCisJeyAweGE2LCBTT05ZUElfRVZFTlRfSEVMUF9QUkVTU0VEIH0sCisJeyAweDI2LCBTT05ZUElfRVZFTlRfQU5ZQlVUVE9OX1JFTEVBU0VEIH0sCiAJeyAwLCAwIH0sCiB9OwogCkBAIC0xMTMxLDcgKzExNDEsNyBAQAogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyB2b2lkIHNvbnlfbmNfcmZraWxsX3VwZGF0ZSgpCitzdGF0aWMgdm9pZCBzb255X25jX3Jma2lsbF91cGRhdGUodm9pZCkKIHsKIAllbnVtIHNvbnlfbmNfcmZraWxsIGk7CiAJaW50IHJlc3VsdDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGxhdGZvcm0veDg2L3RoaW5rcGFkX2FjcGkuYyBiL2RyaXZlcnMvcGxhdGZvcm0veDg2L3RoaW5rcGFkX2FjcGkuYwppbmRleCBlOGMyMTk5Li5hOTc0Y2EzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BsYXRmb3JtL3g4Ni90aGlua3BhZF9hY3BpLmMKKysrIGIvZHJpdmVycy9wbGF0Zm9ybS94ODYvdGhpbmtwYWRfYWNwaS5jCkBAIC01ODksNiArNTg5LDcgQEAKIAkJZGVmYXVsdDoKIAkJCXByaW50ayhUUEFDUElfRVJSICJhY3BpX2V2YWxmKCkgY2FsbGVkICIKIAkJCSAgICAgICAid2l0aCBpbnZhbGlkIGZvcm1hdCBjaGFyYWN0ZXIgJyVjJ1xuIiwgYyk7CisJCQl2YV9lbmQoYXApOwogCQkJcmV0dXJuIDA7CiAJCX0KIAl9CkBAIC02MzQ1LDcgKzYzNDYsNyBAQAogCQkJImFzIGNoYW5nZSBub3RpZmljYXRpb25cbiIpOwogCXRwYWNwaV9ob3RrZXlfZHJpdmVyX21hc2tfc2V0KGhvdGtleV9kcml2ZXJfbWFzawogCQkJCXwgVFBfQUNQSV9IS0VZX0JSR0hUVVBfTUFTSwotCQkJCXwgVFBfQUNQSV9IS0VZX0JSR0hURFdOX01BU0spOzsKKwkJCQl8IFRQX0FDUElfSEtFWV9CUkdIVERXTl9NQVNLKTsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wbGF0Zm9ybS94ODYvd21pLmMgYi9kcml2ZXJzL3BsYXRmb3JtL3g4Ni93bWkuYwppbmRleCBhZWNkOWE5Li4wNWNjNzk2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BsYXRmb3JtL3g4Ni93bWkuYworKysgYi9kcml2ZXJzL3BsYXRmb3JtL3g4Ni93bWkuYwpAQCAtNTQ5LDIxICs1NDksMzQgQEAKIHdtaV9ub3RpZnlfaGFuZGxlciBoYW5kbGVyLCB2b2lkICpkYXRhKQogewogCXN0cnVjdCB3bWlfYmxvY2sgKmJsb2NrOwotCWFjcGlfc3RhdHVzIHN0YXR1czsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9OT1RfRVhJU1Q7CisJY2hhciB0bXBbMTZdLCBndWlkX2lucHV0WzE2XTsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwOwogCiAJaWYgKCFndWlkIHx8ICFoYW5kbGVyKQogCQlyZXR1cm4gQUVfQkFEX1BBUkFNRVRFUjsKIAotCWlmICghZmluZF9ndWlkKGd1aWQsICZibG9jaykpCi0JCXJldHVybiBBRV9OT1RfRVhJU1Q7CisJd21pX3BhcnNlX2d1aWQoZ3VpZCwgdG1wKTsKKwl3bWlfc3dhcF9ieXRlcyh0bXAsIGd1aWRfaW5wdXQpOwogCi0JaWYgKGJsb2NrLT5oYW5kbGVyICYmIGJsb2NrLT5oYW5kbGVyICE9IHdtaV9ub3RpZnlfZGVidWcpCi0JCXJldHVybiBBRV9BTFJFQURZX0FDUVVJUkVEOworCWxpc3RfZm9yX2VhY2gocCwgJndtaV9ibG9ja19saXN0KSB7CisJCWFjcGlfc3RhdHVzIHdtaV9zdGF0dXM7CisJCWJsb2NrID0gbGlzdF9lbnRyeShwLCBzdHJ1Y3Qgd21pX2Jsb2NrLCBsaXN0KTsKIAotCWJsb2NrLT5oYW5kbGVyID0gaGFuZGxlcjsKLQlibG9jay0+aGFuZGxlcl9kYXRhID0gZGF0YTsKKwkJaWYgKG1lbWNtcChibG9jay0+Z2Jsb2NrLmd1aWQsIGd1aWRfaW5wdXQsIDE2KSA9PSAwKSB7CisJCQlpZiAoYmxvY2stPmhhbmRsZXIgJiYKKwkJCSAgICBibG9jay0+aGFuZGxlciAhPSB3bWlfbm90aWZ5X2RlYnVnKQorCQkJCXJldHVybiBBRV9BTFJFQURZX0FDUVVJUkVEOwogCi0Jc3RhdHVzID0gd21pX21ldGhvZF9lbmFibGUoYmxvY2ssIDEpOworCQkJYmxvY2stPmhhbmRsZXIgPSBoYW5kbGVyOworCQkJYmxvY2stPmhhbmRsZXJfZGF0YSA9IGRhdGE7CisKKwkJCXdtaV9zdGF0dXMgPSB3bWlfbWV0aG9kX2VuYWJsZShibG9jaywgMSk7CisJCQlpZiAoKHdtaV9zdGF0dXMgIT0gQUVfT0spIHx8CisJCQkgICAgKCh3bWlfc3RhdHVzID09IEFFX09LKSAmJiAoc3RhdHVzID09IEFFX05PVF9FWElTVCkpKQorCQkJCXN0YXR1cyA9IHdtaV9zdGF0dXM7CisJCX0KKwl9CiAKIAlyZXR1cm4gc3RhdHVzOwogfQpAQCAtNTc3LDI0ICs1OTAsNDAgQEAKIGFjcGlfc3RhdHVzIHdtaV9yZW1vdmVfbm90aWZ5X2hhbmRsZXIoY29uc3QgY2hhciAqZ3VpZCkKIHsKIAlzdHJ1Y3Qgd21pX2Jsb2NrICpibG9jazsKLQlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9OT1RfRVhJU1Q7CisJY2hhciB0bXBbMTZdLCBndWlkX2lucHV0WzE2XTsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwOwogCiAJaWYgKCFndWlkKQogCQlyZXR1cm4gQUVfQkFEX1BBUkFNRVRFUjsKIAotCWlmICghZmluZF9ndWlkKGd1aWQsICZibG9jaykpCi0JCXJldHVybiBBRV9OT1RfRVhJU1Q7CisJd21pX3BhcnNlX2d1aWQoZ3VpZCwgdG1wKTsKKwl3bWlfc3dhcF9ieXRlcyh0bXAsIGd1aWRfaW5wdXQpOwogCi0JaWYgKCFibG9jay0+aGFuZGxlciB8fCBibG9jay0+aGFuZGxlciA9PSB3bWlfbm90aWZ5X2RlYnVnKQotCQlyZXR1cm4gQUVfTlVMTF9FTlRSWTsKKwlsaXN0X2Zvcl9lYWNoKHAsICZ3bWlfYmxvY2tfbGlzdCkgeworCQlhY3BpX3N0YXR1cyB3bWlfc3RhdHVzOworCQlibG9jayA9IGxpc3RfZW50cnkocCwgc3RydWN0IHdtaV9ibG9jaywgbGlzdCk7CiAKLQlpZiAoZGVidWdfZXZlbnQpIHsKLQkJYmxvY2stPmhhbmRsZXIgPSB3bWlfbm90aWZ5X2RlYnVnOwotCX0gZWxzZSB7Ci0JCXN0YXR1cyA9IHdtaV9tZXRob2RfZW5hYmxlKGJsb2NrLCAwKTsKLQkJYmxvY2stPmhhbmRsZXIgPSBOVUxMOwotCQlibG9jay0+aGFuZGxlcl9kYXRhID0gTlVMTDsKKwkJaWYgKG1lbWNtcChibG9jay0+Z2Jsb2NrLmd1aWQsIGd1aWRfaW5wdXQsIDE2KSA9PSAwKSB7CisJCQlpZiAoIWJsb2NrLT5oYW5kbGVyIHx8CisJCQkgICAgYmxvY2stPmhhbmRsZXIgPT0gd21pX25vdGlmeV9kZWJ1ZykKKwkJCQlyZXR1cm4gQUVfTlVMTF9FTlRSWTsKKworCQkJaWYgKGRlYnVnX2V2ZW50KSB7CisJCQkJYmxvY2stPmhhbmRsZXIgPSB3bWlfbm90aWZ5X2RlYnVnOworCQkJCXN0YXR1cyA9IEFFX09LOworCQkJfSBlbHNlIHsKKwkJCQl3bWlfc3RhdHVzID0gd21pX21ldGhvZF9lbmFibGUoYmxvY2ssIDApOworCQkJCWJsb2NrLT5oYW5kbGVyID0gTlVMTDsKKwkJCQlibG9jay0+aGFuZGxlcl9kYXRhID0gTlVMTDsKKwkJCQlpZiAoKHdtaV9zdGF0dXMgIT0gQUVfT0spIHx8CisJCQkJICAgICgod21pX3N0YXR1cyA9PSBBRV9PSykgJiYKKwkJCQkgICAgIChzdGF0dXMgPT0gQUVfTk9UX0VYSVNUKSkpCisJCQkJCXN0YXR1cyA9IHdtaV9zdGF0dXM7CisJCQl9CisJCX0KIAl9CisKIAlyZXR1cm4gc3RhdHVzOwogfQogRVhQT1JUX1NZTUJPTF9HUEwod21pX3JlbW92ZV9ub3RpZnlfaGFuZGxlcik7CkBAIC03MDUsMjIgKzczNCwxMSBAQAogCS5kZXZfYXR0cnMgPSB3bWlfZGV2X2F0dHJzLAogfTsKIAotc3RhdGljIHN0cnVjdCB3bWlfYmxvY2sgKndtaV9jcmVhdGVfZGV2aWNlKGNvbnN0IHN0cnVjdCBndWlkX2Jsb2NrICpnYmxvY2ssCi0JCQkJCSAgIGFjcGlfaGFuZGxlIGhhbmRsZSkKK3N0YXRpYyBpbnQgd21pX2NyZWF0ZV9kZXZpY2UoY29uc3Qgc3RydWN0IGd1aWRfYmxvY2sgKmdibG9jaywKKwkJCSAgICAgc3RydWN0IHdtaV9ibG9jayAqd2Jsb2NrLCBhY3BpX2hhbmRsZSBoYW5kbGUpCiB7Ci0Jc3RydWN0IHdtaV9ibG9jayAqd2Jsb2NrOwotCWludCBlcnJvcjsKIAljaGFyIGd1aWRfc3RyaW5nWzM3XTsKIAotCXdibG9jayA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB3bWlfYmxvY2spLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXdibG9jaykgewotCQllcnJvciA9IC1FTk9NRU07Ci0JCWdvdG8gZXJyX291dDsKLQl9Ci0KLQl3YmxvY2stPmhhbmRsZSA9IGhhbmRsZTsKLQl3YmxvY2stPmdibG9jayA9ICpnYmxvY2s7Ci0KIAl3YmxvY2stPmRldi5jbGFzcyA9ICZ3bWlfY2xhc3M7CiAKIAl3bWlfZ3RvYShnYmxvY2stPmd1aWQsIGd1aWRfc3RyaW5nKTsKQEAgLTcyOCwxNyArNzQ2LDcgQEAKIAogCWRldl9zZXRfZHJ2ZGF0YSgmd2Jsb2NrLT5kZXYsIHdibG9jayk7CiAKLQllcnJvciA9IGRldmljZV9yZWdpc3Rlcigmd2Jsb2NrLT5kZXYpOwotCWlmIChlcnJvcikKLQkJZ290byBlcnJfZnJlZTsKLQotCWxpc3RfYWRkX3RhaWwoJndibG9jay0+bGlzdCwgJndtaV9ibG9ja19saXN0KTsKLQlyZXR1cm4gd2Jsb2NrOwotCi1lcnJfZnJlZToKLQlrZnJlZSh3YmxvY2spOwotZXJyX291dDoKLQlyZXR1cm4gRVJSX1BUUihlcnJvcik7CisJcmV0dXJuIGRldmljZV9yZWdpc3Rlcigmd2Jsb2NrLT5kZXYpOwogfQogCiBzdGF0aWMgdm9pZCB3bWlfZnJlZV9kZXZpY2VzKHZvaWQpCkBAIC03NDcsNyArNzU1LDggQEAKIAogCS8qIERlbGV0ZSBkZXZpY2VzIGZvciBhbGwgdGhlIEdVSURzICovCiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHdibG9jaywgbmV4dCwgJndtaV9ibG9ja19saXN0LCBsaXN0KQotCQlkZXZpY2VfdW5yZWdpc3Rlcigmd2Jsb2NrLT5kZXYpOworCQlpZiAod2Jsb2NrLT5kZXYuY2xhc3MpCisJCQlkZXZpY2VfdW5yZWdpc3Rlcigmd2Jsb2NrLT5kZXYpOwogfQogCiBzdGF0aWMgYm9vbCBndWlkX2FscmVhZHlfcGFyc2VkKGNvbnN0IGNoYXIgKmd1aWRfc3RyaW5nKQpAQCAtNzcwLDcgKzc3OSw2IEBACiAJdW5pb24gYWNwaV9vYmplY3QgKm9iajsKIAljb25zdCBzdHJ1Y3QgZ3VpZF9ibG9jayAqZ2Jsb2NrOwogCXN0cnVjdCB3bWlfYmxvY2sgKndibG9jazsKLQljaGFyIGd1aWRfc3RyaW5nWzM3XTsKIAlhY3BpX3N0YXR1cyBzdGF0dXM7CiAJaW50IHJldHZhbDsKIAl1MzIgaSwgdG90YWw7CkBAIC03OTIsMjkgKzgwMCwzMiBAQAogCXRvdGFsID0gb2JqLT5idWZmZXIubGVuZ3RoIC8gc2l6ZW9mKHN0cnVjdCBndWlkX2Jsb2NrKTsKIAogCWZvciAoaSA9IDA7IGkgPCB0b3RhbDsgaSsrKSB7Ci0JCS8qCi0JCSAgU29tZSBXTUkgZGV2aWNlcywgbGlrZSB0aG9zZSBmb3IgblZpZGlhIGhvb2tzLCBoYXZlIGEKLQkJICBkdXBsaWNhdGUgR1VJRC4gSXQncyBub3QgY2xlYXIgd2hhdCB3ZSBzaG91bGQgZG8gaW4gdGhpcwotCQkgIGNhc2UgeWV0LCBzbyBmb3Igbm93LCB3ZSdsbCBqdXN0IGlnbm9yZSB0aGUgZHVwbGljYXRlLgotCQkgIEFueW9uZSB3aG8gd2FudHMgdG8gYWRkIHN1cHBvcnQgZm9yIHRoYXQgZGV2aWNlIGNhbiBjb21lCi0JCSAgdXAgd2l0aCBhIGJldHRlciB3b3JrYXJvdW5kIGZvciB0aGUgbWVzcyB0aGVuLgotCQkqLwotCQlpZiAoZ3VpZF9hbHJlYWR5X3BhcnNlZChnYmxvY2tbaV0uZ3VpZCkgPT0gdHJ1ZSkgewotCQkJd21pX2d0b2EoZ2Jsb2NrW2ldLmd1aWQsIGd1aWRfc3RyaW5nKTsKLQkJCXByX2luZm8oIlNraXBwaW5nIGR1cGxpY2F0ZSBHVUlEICVzXG4iLCBndWlkX3N0cmluZyk7Ci0JCQljb250aW51ZTsKLQkJfQotCiAJCWlmIChkZWJ1Z19kdW1wX3dkZykKIAkJCXdtaV9kdW1wX3dkZygmZ2Jsb2NrW2ldKTsKIAotCQl3YmxvY2sgPSB3bWlfY3JlYXRlX2RldmljZSgmZ2Jsb2NrW2ldLCBoYW5kbGUpOwotCQlpZiAoSVNfRVJSKHdibG9jaykpIHsKLQkJCXJldHZhbCA9IFBUUl9FUlIod2Jsb2NrKTsKLQkJCXdtaV9mcmVlX2RldmljZXMoKTsKLQkJCWJyZWFrOworCQl3YmxvY2sgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgd21pX2Jsb2NrKSwgR0ZQX0tFUk5FTCk7CisJCWlmICghd2Jsb2NrKQorCQkJcmV0dXJuIEFFX05PX01FTU9SWTsKKworCQl3YmxvY2stPmhhbmRsZSA9IGhhbmRsZTsKKwkJd2Jsb2NrLT5nYmxvY2sgPSBnYmxvY2tbaV07CisKKwkJLyoKKwkJICBTb21lIFdNSSBkZXZpY2VzLCBsaWtlIHRob3NlIGZvciBuVmlkaWEgaG9va3MsIGhhdmUgYQorCQkgIGR1cGxpY2F0ZSBHVUlELiBJdCdzIG5vdCBjbGVhciB3aGF0IHdlIHNob3VsZCBkbyBpbiB0aGlzCisJCSAgY2FzZSB5ZXQsIHNvIGZvciBub3csIHdlJ2xsIGp1c3QgaWdub3JlIHRoZSBkdXBsaWNhdGUKKwkJICBmb3IgZGV2aWNlIGNyZWF0aW9uLgorCQkqLworCQlpZiAoIWd1aWRfYWxyZWFkeV9wYXJzZWQoZ2Jsb2NrW2ldLmd1aWQpKSB7CisJCQlyZXR2YWwgPSB3bWlfY3JlYXRlX2RldmljZSgmZ2Jsb2NrW2ldLCB3YmxvY2ssIGhhbmRsZSk7CisJCQlpZiAocmV0dmFsKSB7CisJCQkJd21pX2ZyZWVfZGV2aWNlcygpOworCQkJCWdvdG8gb3V0X2ZyZWVfcG9pbnRlcjsKKwkJCX0KIAkJfQogCisJCWxpc3RfYWRkX3RhaWwoJndibG9jay0+bGlzdCwgJndtaV9ibG9ja19saXN0KTsKKwogCQlpZiAoZGVidWdfZXZlbnQpIHsKIAkJCXdibG9jay0+aGFuZGxlciA9IHdtaV9ub3RpZnlfZGVidWc7CiAJCQl3bWlfbWV0aG9kX2VuYWJsZSh3YmxvY2ssIDEpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wczMvTWFrZWZpbGUgYi9kcml2ZXJzL3BzMy9NYWtlZmlsZQppbmRleCBjY2VhMTVjLi41MGNiMWUxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BzMy9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3BzMy9NYWtlZmlsZQpAQCAtMSw2ICsxLDYgQEAKIG9iai0kKENPTkZJR19QUzNfVlVBUlQpICs9IHBzMy12dWFydC5vCiBvYmotJChDT05GSUdfUFMzX1BTM0FWKSArPSBwczNhdl9tb2QubwotcHMzYXZfbW9kLW9ianMJCSs9IHBzM2F2Lm8gcHMzYXZfY21kLm8KK3BzM2F2X21vZC15CQk6PSBwczNhdi5vIHBzM2F2X2NtZC5vCiBvYmotJChDT05GSUdfUFBDX1BTMykgKz0gc3lzLW1hbmFnZXItY29yZS5vCiBvYmotJChDT05GSUdfUFMzX1NZU19NQU5BR0VSKSArPSBwczMtc3lzLW1hbmFnZXIubwogb2JqLSQoQ09ORklHX1BTM19TVE9SQUdFKSArPSBwczNzdG9yX2xpYi5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3J0Yy9jbGFzcy5jIGIvZHJpdmVycy9ydGMvY2xhc3MuYwppbmRleCBlNjUzOWNiLi45NTgzY2JjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3J0Yy9jbGFzcy5jCisrKyBiL2RyaXZlcnMvcnRjL2NsYXNzLmMKQEAgLTE2LDYgKzE2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9rZGV2X3QuaD4KICNpbmNsdWRlIDxsaW51eC9pZHIuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CiAKICNpbmNsdWRlICJydGMtY29yZS5oIgogCkBAIC0xNTIsNiArMTUzLDE4IEBACiAJc3Bpbl9sb2NrX2luaXQoJnJ0Yy0+aXJxX3Rhc2tfbG9jayk7CiAJaW5pdF93YWl0cXVldWVfaGVhZCgmcnRjLT5pcnFfcXVldWUpOwogCisJLyogSW5pdCB0aW1lcnF1ZXVlICovCisJdGltZXJxdWV1ZV9pbml0X2hlYWQoJnJ0Yy0+dGltZXJxdWV1ZSk7CisJSU5JVF9XT1JLKCZydGMtPmlycXdvcmssIHJ0Y190aW1lcl9kb193b3JrKTsKKwkvKiBJbml0IGFpZSB0aW1lciAqLworCXJ0Y190aW1lcl9pbml0KCZydGMtPmFpZV90aW1lciwgcnRjX2FpZV91cGRhdGVfaXJxLCAodm9pZCAqKXJ0Yyk7CisJLyogSW5pdCB1aWUgdGltZXIgKi8KKwlydGNfdGltZXJfaW5pdCgmcnRjLT51aWVfcnRjdGltZXIsIHJ0Y191aWVfdXBkYXRlX2lycSwgKHZvaWQgKilydGMpOworCS8qIEluaXQgcGllIHRpbWVyICovCisJaHJ0aW1lcl9pbml0KCZydGMtPnBpZV90aW1lciwgQ0xPQ0tfTU9OT1RPTklDLCBIUlRJTUVSX01PREVfUkVMKTsKKwlydGMtPnBpZV90aW1lci5mdW5jdGlvbiA9IHJ0Y19waWVfdXBkYXRlX2lycTsKKwlydGMtPnBpZV9lbmFibGVkID0gMDsKKwogCXN0cmxjcHkocnRjLT5uYW1lLCBuYW1lLCBSVENfREVWSUNFX05BTUVfU0laRSk7CiAJZGV2X3NldF9uYW1lKCZydGMtPmRldiwgInJ0YyVkIiwgaWQpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3J0Yy9pbnRlcmZhY2UuYyBiL2RyaXZlcnMvcnRjL2ludGVyZmFjZS5jCmluZGV4IGEwYzgxNjIuLjkwMzg0YjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcnRjL2ludGVyZmFjZS5jCisrKyBiL2RyaXZlcnMvcnRjL2ludGVyZmFjZS5jCkBAIC0xNCw2ICsxNCwyMSBAQAogI2luY2x1ZGUgPGxpbnV4L3J0Yy5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvbG9nMi5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorCitzdGF0aWMgaW50IF9fcnRjX3JlYWRfdGltZShzdHJ1Y3QgcnRjX2RldmljZSAqcnRjLCBzdHJ1Y3QgcnRjX3RpbWUgKnRtKQoreworCWludCBlcnI7CisJaWYgKCFydGMtPm9wcykKKwkJZXJyID0gLUVOT0RFVjsKKwllbHNlIGlmICghcnRjLT5vcHMtPnJlYWRfdGltZSkKKwkJZXJyID0gLUVJTlZBTDsKKwllbHNlIHsKKwkJbWVtc2V0KHRtLCAwLCBzaXplb2Yoc3RydWN0IHJ0Y190aW1lKSk7CisJCWVyciA9IHJ0Yy0+b3BzLT5yZWFkX3RpbWUocnRjLT5kZXYucGFyZW50LCB0bSk7CisJfQorCXJldHVybiBlcnI7Cit9CiAKIGludCBydGNfcmVhZF90aW1lKHN0cnVjdCBydGNfZGV2aWNlICpydGMsIHN0cnVjdCBydGNfdGltZSAqdG0pCiB7CkBAIC0yMywxNSArMzgsNyBAQAogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CiAKLQlpZiAoIXJ0Yy0+b3BzKQotCQllcnIgPSAtRU5PREVWOwotCWVsc2UgaWYgKCFydGMtPm9wcy0+cmVhZF90aW1lKQotCQllcnIgPSAtRUlOVkFMOwotCWVsc2UgewotCQltZW1zZXQodG0sIDAsIHNpemVvZihzdHJ1Y3QgcnRjX3RpbWUpKTsKLQkJZXJyID0gcnRjLT5vcHMtPnJlYWRfdGltZShydGMtPmRldi5wYXJlbnQsIHRtKTsKLQl9Ci0KKwllcnIgPSBfX3J0Y19yZWFkX3RpbWUocnRjLCB0bSk7CiAJbXV0ZXhfdW5sb2NrKCZydGMtPm9wc19sb2NrKTsKIAlyZXR1cm4gZXJyOwogfQpAQCAtMTA2LDE4OSArMTEzLDU1IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChydGNfc2V0X21tc3MpOwogCi1zdGF0aWMgaW50IHJ0Y19yZWFkX2FsYXJtX2ludGVybmFsKHN0cnVjdCBydGNfZGV2aWNlICpydGMsIHN0cnVjdCBydGNfd2thbHJtICphbGFybSkKK2ludCBydGNfcmVhZF9hbGFybShzdHJ1Y3QgcnRjX2RldmljZSAqcnRjLCBzdHJ1Y3QgcnRjX3drYWxybSAqYWxhcm0pCiB7CiAJaW50IGVycjsKIAogCWVyciA9IG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmcnRjLT5vcHNfbG9jayk7CiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKLQotCWlmIChydGMtPm9wcyA9PSBOVUxMKQotCQllcnIgPSAtRU5PREVWOwotCWVsc2UgaWYgKCFydGMtPm9wcy0+cmVhZF9hbGFybSkKLQkJZXJyID0gLUVJTlZBTDsKLQllbHNlIHsKLQkJbWVtc2V0KGFsYXJtLCAwLCBzaXplb2Yoc3RydWN0IHJ0Y193a2Fscm0pKTsKLQkJZXJyID0gcnRjLT5vcHMtPnJlYWRfYWxhcm0ocnRjLT5kZXYucGFyZW50LCBhbGFybSk7Ci0JfQotCisJYWxhcm0tPmVuYWJsZWQgPSBydGMtPmFpZV90aW1lci5lbmFibGVkOworCWlmIChhbGFybS0+ZW5hYmxlZCkKKwkJYWxhcm0tPnRpbWUgPSBydGNfa3RpbWVfdG9fdG0ocnRjLT5haWVfdGltZXIubm9kZS5leHBpcmVzKTsKIAltdXRleF91bmxvY2soJnJ0Yy0+b3BzX2xvY2spOwotCXJldHVybiBlcnI7Ci19CiAKLWludCBydGNfcmVhZF9hbGFybShzdHJ1Y3QgcnRjX2RldmljZSAqcnRjLCBzdHJ1Y3QgcnRjX3drYWxybSAqYWxhcm0pCi17Ci0JaW50IGVycjsKLQlzdHJ1Y3QgcnRjX3RpbWUgYmVmb3JlLCBub3c7Ci0JaW50IGZpcnN0X3RpbWUgPSAxOwotCXVuc2lnbmVkIGxvbmcgdF9ub3csIHRfYWxtOwotCWVudW0geyBub25lLCBkYXksIG1vbnRoLCB5ZWFyIH0gbWlzc2luZyA9IG5vbmU7Ci0JdW5zaWduZWQgZGF5czsKLQotCS8qIFRoZSBsb3dlciBsZXZlbCBSVEMgZHJpdmVyIG1heSByZXR1cm4gLTEgaW4gc29tZSBmaWVsZHMsCi0JICogY3JlYXRpbmcgaW52YWxpZCBhbGFybS0+dGltZSB2YWx1ZXMsIGZvciByZWFzb25zIGxpa2U6Ci0JICoKLQkgKiAgIC0gVGhlIGhhcmR3YXJlIG1heSBub3QgYmUgY2FwYWJsZSBvZiBmaWxsaW5nIHRoZW0gaW47Ci0JICogICAgIG1hbnkgYWxhcm1zIG1hdGNoIG9ubHkgb24gdGltZS1vZi1kYXkgZmllbGRzLCBub3QKLQkgKiAgICAgZGF5L21vbnRoL3llYXIgY2FsZW5kYXIgZGF0YS4KLQkgKgotCSAqICAgLSBTb21lIGhhcmR3YXJlIHVzZXMgaWxsZWdhbCB2YWx1ZXMgYXMgIndpbGRjYXJkIiBtYXRjaAotCSAqICAgICB2YWx1ZXMsIHdoaWNoIG5vbi1MaW51eCBmaXJtd2FyZSAobGlrZSBhIEJJT1MpIG1heSB0cnkKLQkgKiAgICAgdG8gc2V0IHVwIGFzIGUuZy4gImFsYXJtIDE1IG1pbnV0ZXMgYWZ0ZXIgZWFjaCBob3VyIi4KLQkgKiAgICAgTGludXggdXNlcyBvbmx5IG9uZXNob3QgYWxhcm1zLgotCSAqCi0JICogV2hlbiB3ZSBzZWUgdGhhdCBoZXJlLCB3ZSBkZWFsIHdpdGggaXQgYnkgdXNpbmcgdmFsdWVzIGZyb20KLQkgKiBhIGN1cnJlbnQgUlRDIHRpbWVzdGFtcCBmb3IgYW55IG1pc3NpbmcgKC0xKSB2YWx1ZXMuICBUaGUKLQkgKiBSVEMgZHJpdmVyIHByZXZlbnRzICJwZXJpb2RpYyBhbGFybSIgbW9kZXMuCi0JICoKLQkgKiBCdXQgdGhpcyBjYW4gYmUgcmFjZXksIGJlY2F1c2Ugc29tZSBmaWVsZHMgb2YgdGhlIFJUQyB0aW1lc3RhbXAKLQkgKiBtYXkgaGF2ZSB3cmFwcGVkIGluIHRoZSBpbnRlcnZhbCBzaW5jZSB3ZSByZWFkIHRoZSBSVEMgYWxhcm0sCi0JICogd2hpY2ggd291bGQgbGVhZCB0byB1cyBpbnNlcnRpbmcgaW5jb25zaXN0ZW50IHZhbHVlcyBpbiBwbGFjZQotCSAqIG9mIHRoZSAtMSBmaWVsZHMuCi0JICoKLQkgKiBSZWFkaW5nIHRoZSBhbGFybSBhbmQgdGltZXN0YW1wIGluIHRoZSByZXZlcnNlIHNlcXVlbmNlCi0JICogd291bGQgaGF2ZSB0aGUgc2FtZSByYWNlIGNvbmRpdGlvbiwgYW5kIG5vdCBzb2x2ZSB0aGUgaXNzdWUuCi0JICoKLQkgKiBTbywgd2UgbXVzdCBmaXJzdCByZWFkIHRoZSBSVEMgdGltZXN0YW1wLAotCSAqIHRoZW4gcmVhZCB0aGUgUlRDIGFsYXJtIHZhbHVlLAotCSAqIGFuZCB0aGVuIHJlYWQgYSBzZWNvbmQgUlRDIHRpbWVzdGFtcC4KLQkgKgotCSAqIElmIGFueSBmaWVsZHMgb2YgdGhlIHNlY29uZCB0aW1lc3RhbXAgaGF2ZSBjaGFuZ2VkCi0JICogd2hlbiBjb21wYXJlZCB3aXRoIHRoZSBmaXJzdCB0aW1lc3RhbXAsIHRoZW4gd2Uga25vdwotCSAqIG91ciB0aW1lc3RhbXAgbWF5IGJlIGluY29uc2lzdGVudCB3aXRoIHRoYXQgdXNlZCBieQotCSAqIHRoZSBsb3ctbGV2ZWwgcnRjX3JlYWRfYWxhcm1faW50ZXJuYWwoKSBmdW5jdGlvbi4KLQkgKgotCSAqIFNvLCB3aGVuIHRoZSB0d28gdGltZXN0YW1wcyBkaXNhZ3JlZSwgd2UganVzdCBsb29wIGFuZCBkbwotCSAqIHRoZSBwcm9jZXNzIGFnYWluIHRvIGdldCBhIGZ1bGx5IGNvbnNpc3RlbnQgc2V0IG9mIHZhbHVlcy4KLQkgKgotCSAqIFRoaXMgY291bGQgYWxsIGluc3RlYWQgYmUgZG9uZSBpbiB0aGUgbG93ZXIgbGV2ZWwgZHJpdmVyLAotCSAqIGJ1dCBzaW5jZSBtb3JlIHRoYW4gb25lIGxvd2VyIGxldmVsIFJUQyBpbXBsZW1lbnRhdGlvbiBuZWVkcyBpdCwKLQkgKiB0aGVuIGl0J3MgcHJvYmFibHkgYmVzdCBiZXN0IHRvIGRvIGl0IGhlcmUgaW5zdGVhZCBvZiB0aGVyZS4uCi0JICovCi0KLQkvKiBHZXQgdGhlICJiZWZvcmUiIHRpbWVzdGFtcCAqLwotCWVyciA9IHJ0Y19yZWFkX3RpbWUocnRjLCAmYmVmb3JlKTsKLQlpZiAoZXJyIDwgMCkKLQkJcmV0dXJuIGVycjsKLQlkbyB7Ci0JCWlmICghZmlyc3RfdGltZSkKLQkJCW1lbWNweSgmYmVmb3JlLCAmbm93LCBzaXplb2Yoc3RydWN0IHJ0Y190aW1lKSk7Ci0JCWZpcnN0X3RpbWUgPSAwOwotCi0JCS8qIGdldCB0aGUgUlRDIGFsYXJtIHZhbHVlcywgd2hpY2ggbWF5IGJlIGluY29tcGxldGUgKi8KLQkJZXJyID0gcnRjX3JlYWRfYWxhcm1faW50ZXJuYWwocnRjLCBhbGFybSk7Ci0JCWlmIChlcnIpCi0JCQlyZXR1cm4gZXJyOwotCQlpZiAoIWFsYXJtLT5lbmFibGVkKQotCQkJcmV0dXJuIDA7Ci0KLQkJLyogZnVsbC1mdW5jdGlvbiBSVENzIHdvbid0IGhhdmUgc3VjaCBtaXNzaW5nIGZpZWxkcyAqLwotCQlpZiAocnRjX3ZhbGlkX3RtKCZhbGFybS0+dGltZSkgPT0gMCkKLQkJCXJldHVybiAwOwotCi0JCS8qIGdldCB0aGUgImFmdGVyIiB0aW1lc3RhbXAsIHRvIGRldGVjdCB3cmFwcGVkIGZpZWxkcyAqLwotCQllcnIgPSBydGNfcmVhZF90aW1lKHJ0YywgJm5vdyk7Ci0JCWlmIChlcnIgPCAwKQotCQkJcmV0dXJuIGVycjsKLQotCQkvKiBub3RlIHRoYXQgdG1fc2VjIGlzIGEgImRvbid0IGNhcmUiIHZhbHVlIGhlcmU6ICovCi0JfSB3aGlsZSAoICAgYmVmb3JlLnRtX21pbiAgICE9IG5vdy50bV9taW4KLQkJIHx8IGJlZm9yZS50bV9ob3VyICAhPSBub3cudG1faG91cgotCQkgfHwgYmVmb3JlLnRtX21vbiAgICE9IG5vdy50bV9tb24KLQkJIHx8IGJlZm9yZS50bV95ZWFyICAhPSBub3cudG1feWVhcik7Ci0KLQkvKiBGaWxsIGluIHRoZSBtaXNzaW5nIGFsYXJtIGZpZWxkcyB1c2luZyB0aGUgdGltZXN0YW1wOyB3ZQotCSAqIGtub3cgdGhlcmUncyBhdCBsZWFzdCBvbmUgc2luY2UgYWxhcm0tPnRpbWUgaXMgaW52YWxpZC4KLQkgKi8KLQlpZiAoYWxhcm0tPnRpbWUudG1fc2VjID09IC0xKQotCQlhbGFybS0+dGltZS50bV9zZWMgPSBub3cudG1fc2VjOwotCWlmIChhbGFybS0+dGltZS50bV9taW4gPT0gLTEpCi0JCWFsYXJtLT50aW1lLnRtX21pbiA9IG5vdy50bV9taW47Ci0JaWYgKGFsYXJtLT50aW1lLnRtX2hvdXIgPT0gLTEpCi0JCWFsYXJtLT50aW1lLnRtX2hvdXIgPSBub3cudG1faG91cjsKLQotCS8qIEZvciBzaW1wbGljaXR5LCBvbmx5IHN1cHBvcnQgZGF0ZSByb2xsb3ZlciBmb3Igbm93ICovCi0JaWYgKGFsYXJtLT50aW1lLnRtX21kYXkgPT0gLTEpIHsKLQkJYWxhcm0tPnRpbWUudG1fbWRheSA9IG5vdy50bV9tZGF5OwotCQltaXNzaW5nID0gZGF5OwotCX0KLQlpZiAoYWxhcm0tPnRpbWUudG1fbW9uID09IC0xKSB7Ci0JCWFsYXJtLT50aW1lLnRtX21vbiA9IG5vdy50bV9tb247Ci0JCWlmIChtaXNzaW5nID09IG5vbmUpCi0JCQltaXNzaW5nID0gbW9udGg7Ci0JfQotCWlmIChhbGFybS0+dGltZS50bV95ZWFyID09IC0xKSB7Ci0JCWFsYXJtLT50aW1lLnRtX3llYXIgPSBub3cudG1feWVhcjsKLQkJaWYgKG1pc3NpbmcgPT0gbm9uZSkKLQkJCW1pc3NpbmcgPSB5ZWFyOwotCX0KLQotCS8qIHdpdGggbHVjaywgbm8gcm9sbG92ZXIgaXMgbmVlZGVkICovCi0JcnRjX3RtX3RvX3RpbWUoJm5vdywgJnRfbm93KTsKLQlydGNfdG1fdG9fdGltZSgmYWxhcm0tPnRpbWUsICZ0X2FsbSk7Ci0JaWYgKHRfbm93IDwgdF9hbG0pCi0JCWdvdG8gZG9uZTsKLQotCXN3aXRjaCAobWlzc2luZykgewotCi0JLyogMjQgaG91ciByb2xsb3ZlciAuLi4gaWYgaXQncyBub3cgMTBhbSBNb25kYXksIGFuIGFsYXJtIHRoYXQKLQkgKiB0aGF0IHdpbGwgdHJpZ2dlciBhdCA1YW0gd2lsbCBkbyBzbyBhdCA1YW0gVHVlc2RheSwgd2hpY2gKLQkgKiBjb3VsZCBhbHNvIGJlIGluIHRoZSBuZXh0IG1vbnRoIG9yIHllYXIuICBUaGlzIGlzIGEgY29tbW9uCi0JICogY2FzZSwgZXNwZWNpYWxseSBmb3IgUENzLgotCSAqLwotCWNhc2UgZGF5OgotCQlkZXZfZGJnKCZydGMtPmRldiwgImFsYXJtIHJvbGxvdmVyOiAlc1xuIiwgImRheSIpOwotCQl0X2FsbSArPSAyNCAqIDYwICogNjA7Ci0JCXJ0Y190aW1lX3RvX3RtKHRfYWxtLCAmYWxhcm0tPnRpbWUpOwotCQlicmVhazsKLQotCS8qIE1vbnRoIHJvbGxvdmVyIC4uLiBpZiBpdCdzIHRoZSAzMXRoLCBhbiBhbGFybSBvbiB0aGUgM3JkIHdpbGwKLQkgKiBiZSBuZXh0IG1vbnRoLiAgQW4gYWxhcm0gbWF0Y2hpbmcgb24gdGhlIDMwdGgsIDI5dGgsIG9yIDI4dGgKLQkgKiBtYXkgZW5kIHVwIGluIHRoZSBtb250aCBhZnRlciB0aGF0ISAgTWFueSBuZXdlciBQQ3Mgc3VwcG9ydAotCSAqIHRoaXMgdHlwZSBvZiBhbGFybS4KLQkgKi8KLQljYXNlIG1vbnRoOgotCQlkZXZfZGJnKCZydGMtPmRldiwgImFsYXJtIHJvbGxvdmVyOiAlc1xuIiwgIm1vbnRoIik7Ci0JCWRvIHsKLQkJCWlmIChhbGFybS0+dGltZS50bV9tb24gPCAxMSkKLQkJCQlhbGFybS0+dGltZS50bV9tb24rKzsKLQkJCWVsc2UgewotCQkJCWFsYXJtLT50aW1lLnRtX21vbiA9IDA7Ci0JCQkJYWxhcm0tPnRpbWUudG1feWVhcisrOwotCQkJfQotCQkJZGF5cyA9IHJ0Y19tb250aF9kYXlzKGFsYXJtLT50aW1lLnRtX21vbiwKLQkJCQkJYWxhcm0tPnRpbWUudG1feWVhcik7Ci0JCX0gd2hpbGUgKGRheXMgPCBhbGFybS0+dGltZS50bV9tZGF5KTsKLQkJYnJlYWs7Ci0KLQkvKiBZZWFyIHJvbGxvdmVyIC4uLiBlYXN5IGV4Y2VwdCBmb3IgbGVhcCB5ZWFycyEgKi8KLQljYXNlIHllYXI6Ci0JCWRldl9kYmcoJnJ0Yy0+ZGV2LCAiYWxhcm0gcm9sbG92ZXI6ICVzXG4iLCAieWVhciIpOwotCQlkbyB7Ci0JCQlhbGFybS0+dGltZS50bV95ZWFyKys7Ci0JCX0gd2hpbGUgKHJ0Y192YWxpZF90bSgmYWxhcm0tPnRpbWUpICE9IDApOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCWRldl93YXJuKCZydGMtPmRldiwgImFsYXJtIHJvbGxvdmVyIG5vdCBoYW5kbGVkXG4iKTsKLQl9Ci0KLWRvbmU6CiAJcmV0dXJuIDA7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChydGNfcmVhZF9hbGFybSk7CiAKK2ludCBfX3J0Y19zZXRfYWxhcm0oc3RydWN0IHJ0Y19kZXZpY2UgKnJ0Yywgc3RydWN0IHJ0Y193a2Fscm0gKmFsYXJtKQoreworCXN0cnVjdCBydGNfdGltZSB0bTsKKwlsb25nIG5vdywgc2NoZWR1bGVkOworCWludCBlcnI7CisKKwllcnIgPSBydGNfdmFsaWRfdG0oJmFsYXJtLT50aW1lKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCXJ0Y190bV90b190aW1lKCZhbGFybS0+dGltZSwgJnNjaGVkdWxlZCk7CisKKwkvKiBNYWtlIHN1cmUgd2UncmUgbm90IHNldHRpbmcgYWxhcm1zIGluIHRoZSBwYXN0ICovCisJZXJyID0gX19ydGNfcmVhZF90aW1lKHJ0YywgJnRtKTsKKwlydGNfdG1fdG9fdGltZSgmdG0sICZub3cpOworCWlmIChzY2hlZHVsZWQgPD0gbm93KQorCQlyZXR1cm4gLUVUSU1FOworCS8qCisJICogWFhYIC0gV2UganVzdCBjaGVja2VkIHRvIG1ha2Ugc3VyZSB0aGUgYWxhcm0gdGltZSBpcyBub3QKKwkgKiBpbiB0aGUgcGFzdCwgYnV0IHRoZXJlIGlzIHN0aWxsIGEgcmFjZSB3aW5kb3cgd2hlcmUgaWYKKwkgKiB0aGUgaXMgYWxhcm0gc2V0IGZvciB0aGUgbmV4dCBzZWNvbmQgYW5kIHRoZSBzZWNvbmQgdGlja3MKKwkgKiBvdmVyIHJpZ2h0IGhlcmUsIGJlZm9yZSB3ZSBzZXQgdGhlIGFsYXJtLgorCSAqLworCisJaWYgKCFydGMtPm9wcykKKwkJZXJyID0gLUVOT0RFVjsKKwllbHNlIGlmICghcnRjLT5vcHMtPnNldF9hbGFybSkKKwkJZXJyID0gLUVJTlZBTDsKKwllbHNlCisJCWVyciA9IHJ0Yy0+b3BzLT5zZXRfYWxhcm0ocnRjLT5kZXYucGFyZW50LCBhbGFybSk7CisKKwlyZXR1cm4gZXJyOworfQorCiBpbnQgcnRjX3NldF9hbGFybShzdHJ1Y3QgcnRjX2RldmljZSAqcnRjLCBzdHJ1Y3QgcnRjX3drYWxybSAqYWxhcm0pCiB7CiAJaW50IGVycjsKQEAgLTMwMCwxNiArMTczLDE4IEBACiAJZXJyID0gbXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZydGMtPm9wc19sb2NrKTsKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwotCi0JaWYgKCFydGMtPm9wcykKLQkJZXJyID0gLUVOT0RFVjsKLQllbHNlIGlmICghcnRjLT5vcHMtPnNldF9hbGFybSkKLQkJZXJyID0gLUVJTlZBTDsKLQllbHNlCi0JCWVyciA9IHJ0Yy0+b3BzLT5zZXRfYWxhcm0ocnRjLT5kZXYucGFyZW50LCBhbGFybSk7Ci0KKwlpZiAocnRjLT5haWVfdGltZXIuZW5hYmxlZCkgeworCQlydGNfdGltZXJfcmVtb3ZlKHJ0YywgJnJ0Yy0+YWllX3RpbWVyKTsKKwkJcnRjLT5haWVfdGltZXIuZW5hYmxlZCA9IDA7CisJfQorCXJ0Yy0+YWllX3RpbWVyLm5vZGUuZXhwaXJlcyA9IHJ0Y190bV90b19rdGltZShhbGFybS0+dGltZSk7CisJcnRjLT5haWVfdGltZXIucGVyaW9kID0ga3RpbWVfc2V0KDAsIDApOworCWlmIChhbGFybS0+ZW5hYmxlZCkgeworCQlydGMtPmFpZV90aW1lci5lbmFibGVkID0gMTsKKwkJcnRjX3RpbWVyX2VucXVldWUocnRjLCAmcnRjLT5haWVfdGltZXIpOworCX0KIAltdXRleF91bmxvY2soJnJ0Yy0+b3BzX2xvY2spOwotCXJldHVybiBlcnI7CisJcmV0dXJuIDA7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChydGNfc2V0X2FsYXJtKTsKIApAQCAtMzE5LDYgKzE5NCwxNiBAQAogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CiAKKwlpZiAocnRjLT5haWVfdGltZXIuZW5hYmxlZCAhPSBlbmFibGVkKSB7CisJCWlmIChlbmFibGVkKSB7CisJCQlydGMtPmFpZV90aW1lci5lbmFibGVkID0gMTsKKwkJCXJ0Y190aW1lcl9lbnF1ZXVlKHJ0YywgJnJ0Yy0+YWllX3RpbWVyKTsKKwkJfSBlbHNlIHsKKwkJCXJ0Y190aW1lcl9yZW1vdmUocnRjLCAmcnRjLT5haWVfdGltZXIpOworCQkJcnRjLT5haWVfdGltZXIuZW5hYmxlZCA9IDA7CisJCX0KKwl9CisKIAlpZiAoIXJ0Yy0+b3BzKQogCQllcnIgPSAtRU5PREVWOwogCWVsc2UgaWYgKCFydGMtPm9wcy0+YWxhcm1faXJxX2VuYWJsZSkKQEAgLTMzNywzOCArMjIyLDExNCBAQAogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CiAKLSNpZmRlZiBDT05GSUdfUlRDX0lOVEZfREVWX1VJRV9FTVVMCi0JaWYgKGVuYWJsZWQgPT0gMCAmJiBydGMtPnVpZV9pcnFfYWN0aXZlKSB7Ci0JCW11dGV4X3VubG9jaygmcnRjLT5vcHNfbG9jayk7Ci0JCXJldHVybiBydGNfZGV2X3VwZGF0ZV9pcnFfZW5hYmxlX2VtdWwocnRjLCBlbmFibGVkKTsKKwkvKiBtYWtlIHN1cmUgd2UncmUgY2hhbmdpbmcgc3RhdGUgKi8KKwlpZiAocnRjLT51aWVfcnRjdGltZXIuZW5hYmxlZCA9PSBlbmFibGVkKQorCQlnb3RvIG91dDsKKworCWlmIChlbmFibGVkKSB7CisJCXN0cnVjdCBydGNfdGltZSB0bTsKKwkJa3RpbWVfdCBub3csIG9uZXNlYzsKKworCQlfX3J0Y19yZWFkX3RpbWUocnRjLCAmdG0pOworCQlvbmVzZWMgPSBrdGltZV9zZXQoMSwgMCk7CisJCW5vdyA9IHJ0Y190bV90b19rdGltZSh0bSk7CisJCXJ0Yy0+dWllX3J0Y3RpbWVyLm5vZGUuZXhwaXJlcyA9IGt0aW1lX2FkZChub3csIG9uZXNlYyk7CisJCXJ0Yy0+dWllX3J0Y3RpbWVyLnBlcmlvZCA9IGt0aW1lX3NldCgxLCAwKTsKKwkJcnRjLT51aWVfcnRjdGltZXIuZW5hYmxlZCA9IDE7CisJCXJ0Y190aW1lcl9lbnF1ZXVlKHJ0YywgJnJ0Yy0+dWllX3J0Y3RpbWVyKTsKKwl9IGVsc2UgeworCQlydGNfdGltZXJfcmVtb3ZlKHJ0YywgJnJ0Yy0+dWllX3J0Y3RpbWVyKTsKKwkJcnRjLT51aWVfcnRjdGltZXIuZW5hYmxlZCA9IDA7CiAJfQotI2VuZGlmCiAKLQlpZiAoIXJ0Yy0+b3BzKQotCQllcnIgPSAtRU5PREVWOwotCWVsc2UgaWYgKCFydGMtPm9wcy0+dXBkYXRlX2lycV9lbmFibGUpCi0JCWVyciA9IC1FSU5WQUw7Ci0JZWxzZQotCQllcnIgPSBydGMtPm9wcy0+dXBkYXRlX2lycV9lbmFibGUocnRjLT5kZXYucGFyZW50LCBlbmFibGVkKTsKLQorb3V0OgogCW11dGV4X3VubG9jaygmcnRjLT5vcHNfbG9jayk7Ci0KLSNpZmRlZiBDT05GSUdfUlRDX0lOVEZfREVWX1VJRV9FTVVMCi0JLyoKLQkgKiBFbmFibGUgZW11bGF0aW9uIGlmIHRoZSBkcml2ZXIgZGlkIG5vdCBwcm92aWRlCi0JICogdGhlIHVwZGF0ZV9pcnFfZW5hYmxlIGZ1bmN0aW9uIHBvaW50ZXIgb3IgaWYgcmV0dXJuZWQKLQkgKiAtRUlOVkFMIHRvIHNpZ25hbCB0aGF0IGl0IGhhcyBiZWVuIGNvbmZpZ3VyZWQgd2l0aG91dAotCSAqIGludGVycnVwdHMgb3IgdGhhdCBhcmUgbm90IGF2YWlsYWJsZSBhdCB0aGUgbW9tZW50LgotCSAqLwotCWlmIChlcnIgPT0gLUVJTlZBTCkKLQkJZXJyID0gcnRjX2Rldl91cGRhdGVfaXJxX2VuYWJsZV9lbXVsKHJ0YywgZW5hYmxlZCk7Ci0jZW5kaWYKIAlyZXR1cm4gZXJyOworCiB9CiBFWFBPUlRfU1lNQk9MX0dQTChydGNfdXBkYXRlX2lycV9lbmFibGUpOwogCisKIC8qKgotICogcnRjX3VwZGF0ZV9pcnEgLSByZXBvcnQgUlRDIHBlcmlvZGljLCBhbGFybSwgYW5kL29yIHVwZGF0ZSBpcnFzCisgKiBydGNfaGFuZGxlX2xlZ2FjeV9pcnEgLSBBSUUsIFVJRSBhbmQgUElFIGV2ZW50IGhvb2sKKyAqIEBydGM6IHBvaW50ZXIgdG8gdGhlIHJ0YyBkZXZpY2UKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIGFuIEFJRSwgVUlFIG9yIFBJRSBtb2RlIGludGVycnVwdAorICogaGFzIG9jY3VyZWQgKG9yIGJlZW4gZW11bGF0ZWQpLgorICoKKyAqIFRyaWdnZXJzIHRoZSByZWdpc3RlcmVkIGlycV90YXNrIGZ1bmN0aW9uIGNhbGxiYWNrLgorICovCitzdGF0aWMgdm9pZCBydGNfaGFuZGxlX2xlZ2FjeV9pcnEoc3RydWN0IHJ0Y19kZXZpY2UgKnJ0YywgaW50IG51bSwgaW50IG1vZGUpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8qIG1hcmsgb25lIGlycSBvZiB0aGUgYXBwcm9wcmlhdGUgbW9kZSAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZydGMtPmlycV9sb2NrLCBmbGFncyk7CisJcnRjLT5pcnFfZGF0YSA9IChydGMtPmlycV9kYXRhICsgKG51bSA8PCA4KSkgfCAoUlRDX0lSUUZ8bW9kZSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnRjLT5pcnFfbG9jaywgZmxhZ3MpOworCisJLyogY2FsbCB0aGUgdGFzayBmdW5jICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJnJ0Yy0+aXJxX3Rhc2tfbG9jaywgZmxhZ3MpOworCWlmIChydGMtPmlycV90YXNrKQorCQlydGMtPmlycV90YXNrLT5mdW5jKHJ0Yy0+aXJxX3Rhc2stPnByaXZhdGVfZGF0YSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnRjLT5pcnFfdGFza19sb2NrLCBmbGFncyk7CisKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJnJ0Yy0+aXJxX3F1ZXVlKTsKKwlraWxsX2Zhc3luYygmcnRjLT5hc3luY19xdWV1ZSwgU0lHSU8sIFBPTExfSU4pOworfQorCisKKy8qKgorICogcnRjX2FpZV91cGRhdGVfaXJxIC0gQUlFIG1vZGUgcnRjdGltZXIgaG9vaworICogQHByaXZhdGU6IHBvaW50ZXIgdG8gdGhlIHJ0Y19kZXZpY2UKKyAqCisgKiBUaGlzIGZ1bmN0aW9ucyBpcyBjYWxsZWQgd2hlbiB0aGUgYWllX3RpbWVyIGV4cGlyZXMuCisgKi8KK3ZvaWQgcnRjX2FpZV91cGRhdGVfaXJxKHZvaWQgKnByaXZhdGUpCit7CisJc3RydWN0IHJ0Y19kZXZpY2UgKnJ0YyA9IChzdHJ1Y3QgcnRjX2RldmljZSAqKXByaXZhdGU7CisJcnRjX2hhbmRsZV9sZWdhY3lfaXJxKHJ0YywgMSwgUlRDX0FGKTsKK30KKworCisvKioKKyAqIHJ0Y191aWVfdXBkYXRlX2lycSAtIFVJRSBtb2RlIHJ0Y3RpbWVyIGhvb2sKKyAqIEBwcml2YXRlOiBwb2ludGVyIHRvIHRoZSBydGNfZGV2aWNlCisgKgorICogVGhpcyBmdW5jdGlvbnMgaXMgY2FsbGVkIHdoZW4gdGhlIHVpZV90aW1lciBleHBpcmVzLgorICovCit2b2lkIHJ0Y191aWVfdXBkYXRlX2lycSh2b2lkICpwcml2YXRlKQoreworCXN0cnVjdCBydGNfZGV2aWNlICpydGMgPSAoc3RydWN0IHJ0Y19kZXZpY2UgKilwcml2YXRlOworCXJ0Y19oYW5kbGVfbGVnYWN5X2lycShydGMsIDEsICBSVENfVUYpOworfQorCisKKy8qKgorICogcnRjX3BpZV91cGRhdGVfaXJxIC0gUElFIG1vZGUgaHJ0aW1lciBob29rCisgKiBAdGltZXI6IHBvaW50ZXIgdG8gdGhlIHBpZSBtb2RlIGhydGltZXIKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gZW11bGF0ZSBQSUUgbW9kZSBpbnRlcnJ1cHRzCisgKiB1c2luZyBhbiBocnRpbWVyLiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHRoZSBwZXJpb2RpYworICogaHJ0aW1lciBleHBpcmVzLgorICovCitlbnVtIGhydGltZXJfcmVzdGFydCBydGNfcGllX3VwZGF0ZV9pcnEoc3RydWN0IGhydGltZXIgKnRpbWVyKQoreworCXN0cnVjdCBydGNfZGV2aWNlICpydGM7CisJa3RpbWVfdCBwZXJpb2Q7CisJaW50IGNvdW50OworCXJ0YyA9IGNvbnRhaW5lcl9vZih0aW1lciwgc3RydWN0IHJ0Y19kZXZpY2UsIHBpZV90aW1lcik7CisKKwlwZXJpb2QgPSBrdGltZV9zZXQoMCwgTlNFQ19QRVJfU0VDL3J0Yy0+aXJxX2ZyZXEpOworCWNvdW50ID0gaHJ0aW1lcl9mb3J3YXJkX25vdyh0aW1lciwgcGVyaW9kKTsKKworCXJ0Y19oYW5kbGVfbGVnYWN5X2lycShydGMsIGNvdW50LCBSVENfUEYpOworCisJcmV0dXJuIEhSVElNRVJfUkVTVEFSVDsKK30KKworLyoqCisgKiBydGNfdXBkYXRlX2lycSAtIFRyaWdnZXJlZCB3aGVuIGEgUlRDIGludGVycnVwdCBvY2N1cnMuCiAgKiBAcnRjOiB0aGUgcnRjIGRldmljZQogICogQG51bTogaG93IG1hbnkgaXJxcyBhcmUgYmVpbmcgcmVwb3J0ZWQgKHVzdWFsbHkgb25lKQogICogQGV2ZW50czogbWFzayBvZiBSVENfSVJRRiB3aXRoIG9uZSBvciBtb3JlIG9mIFJUQ19QRiwgUlRDX0FGLCBSVENfVUYKQEAgLTM3NywxOSArMzM4LDcgQEAKIHZvaWQgcnRjX3VwZGF0ZV9pcnEoc3RydWN0IHJ0Y19kZXZpY2UgKnJ0YywKIAkJdW5zaWduZWQgbG9uZyBudW0sIHVuc2lnbmVkIGxvbmcgZXZlbnRzKQogewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcnRjLT5pcnFfbG9jaywgZmxhZ3MpOwotCXJ0Yy0+aXJxX2RhdGEgPSAocnRjLT5pcnFfZGF0YSArIChudW0gPDwgOCkpIHwgZXZlbnRzOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJ0Yy0+aXJxX2xvY2ssIGZsYWdzKTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZydGMtPmlycV90YXNrX2xvY2ssIGZsYWdzKTsKLQlpZiAocnRjLT5pcnFfdGFzaykKLQkJcnRjLT5pcnFfdGFzay0+ZnVuYyhydGMtPmlycV90YXNrLT5wcml2YXRlX2RhdGEpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJ0Yy0+aXJxX3Rhc2tfbG9jaywgZmxhZ3MpOwotCi0Jd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZydGMtPmlycV9xdWV1ZSk7Ci0Ja2lsbF9mYXN5bmMoJnJ0Yy0+YXN5bmNfcXVldWUsIFNJR0lPLCBQT0xMX0lOKTsKKwlzY2hlZHVsZV93b3JrKCZydGMtPmlycXdvcmspOwogfQogRVhQT1JUX1NZTUJPTF9HUEwocnRjX3VwZGF0ZV9pcnEpOwogCkBAIC00NzcsMTggKzQyNiwyMCBAQAogCWludCBlcnIgPSAwOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlpZiAocnRjLT5vcHMtPmlycV9zZXRfc3RhdGUgPT0gTlVMTCkKLQkJcmV0dXJuIC1FTlhJTzsKLQogCXNwaW5fbG9ja19pcnFzYXZlKCZydGMtPmlycV90YXNrX2xvY2ssIGZsYWdzKTsKIAlpZiAocnRjLT5pcnFfdGFzayAhPSBOVUxMICYmIHRhc2sgPT0gTlVMTCkKIAkJZXJyID0gLUVCVVNZOwogCWlmIChydGMtPmlycV90YXNrICE9IHRhc2spCiAJCWVyciA9IC1FQUNDRVM7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnRjLT5pcnFfdGFza19sb2NrLCBmbGFncyk7CiAKLQlpZiAoZXJyID09IDApCi0JCWVyciA9IHJ0Yy0+b3BzLT5pcnFfc2V0X3N0YXRlKHJ0Yy0+ZGV2LnBhcmVudCwgZW5hYmxlZCk7CisJaWYgKGVuYWJsZWQpIHsKKwkJa3RpbWVfdCBwZXJpb2QgPSBrdGltZV9zZXQoMCwgTlNFQ19QRVJfU0VDL3J0Yy0+aXJxX2ZyZXEpOworCQlocnRpbWVyX3N0YXJ0KCZydGMtPnBpZV90aW1lciwgcGVyaW9kLCBIUlRJTUVSX01PREVfUkVMKTsKKwl9IGVsc2UgeworCQlocnRpbWVyX2NhbmNlbCgmcnRjLT5waWVfdGltZXIpOworCX0KKwlydGMtPnBpZV9lbmFibGVkID0gZW5hYmxlZDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZydGMtPmlycV90YXNrX2xvY2ssIGZsYWdzKTsKIAogCXJldHVybiBlcnI7CiB9CkBAIC01MDksMjEgKzQ2MCwxOTQgQEAKIAlpbnQgZXJyID0gMDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JaWYgKHJ0Yy0+b3BzLT5pcnFfc2V0X2ZyZXEgPT0gTlVMTCkKLQkJcmV0dXJuIC1FTlhJTzsKLQogCXNwaW5fbG9ja19pcnFzYXZlKCZydGMtPmlycV90YXNrX2xvY2ssIGZsYWdzKTsKIAlpZiAocnRjLT5pcnFfdGFzayAhPSBOVUxMICYmIHRhc2sgPT0gTlVMTCkKIAkJZXJyID0gLUVCVVNZOwogCWlmIChydGMtPmlycV90YXNrICE9IHRhc2spCiAJCWVyciA9IC1FQUNDRVM7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnRjLT5pcnFfdGFza19sb2NrLCBmbGFncyk7Ci0KIAlpZiAoZXJyID09IDApIHsKLQkJZXJyID0gcnRjLT5vcHMtPmlycV9zZXRfZnJlcShydGMtPmRldi5wYXJlbnQsIGZyZXEpOwotCQlpZiAoZXJyID09IDApCi0JCQlydGMtPmlycV9mcmVxID0gZnJlcTsKKwkJcnRjLT5pcnFfZnJlcSA9IGZyZXE7CisJCWlmIChydGMtPnBpZV9lbmFibGVkKSB7CisJCQlrdGltZV90IHBlcmlvZDsKKwkJCWhydGltZXJfY2FuY2VsKCZydGMtPnBpZV90aW1lcik7CisJCQlwZXJpb2QgPSBrdGltZV9zZXQoMCwgTlNFQ19QRVJfU0VDL3J0Yy0+aXJxX2ZyZXEpOworCQkJaHJ0aW1lcl9zdGFydCgmcnRjLT5waWVfdGltZXIsIHBlcmlvZCwKKwkJCQkJSFJUSU1FUl9NT0RFX1JFTCk7CisJCX0KIAl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnRjLT5pcnFfdGFza19sb2NrLCBmbGFncyk7CiAJcmV0dXJuIGVycjsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHJ0Y19pcnFfc2V0X2ZyZXEpOworCisvKioKKyAqIHJ0Y190aW1lcl9lbnF1ZXVlIC0gQWRkcyBhIHJ0Y190aW1lciB0byB0aGUgcnRjX2RldmljZSB0aW1lcnF1ZXVlCisgKiBAcnRjIHJ0YyBkZXZpY2UKKyAqIEB0aW1lciB0aW1lciBiZWluZyBhZGRlZC4KKyAqCisgKiBFbnF1ZXVlcyBhIHRpbWVyIG9udG8gdGhlIHJ0YyBkZXZpY2VzIHRpbWVycXVldWUgYW5kIHNldHMKKyAqIHRoZSBuZXh0IGFsYXJtIGV2ZW50IGFwcHJvcHJpYXRlbHkuCisgKgorICogTXVzdCBob2xkIG9wc19sb2NrIGZvciBwcm9wZXIgc2VyaWFsaXphdGlvbiBvZiB0aW1lcnF1ZXVlCisgKi8KK3ZvaWQgcnRjX3RpbWVyX2VucXVldWUoc3RydWN0IHJ0Y19kZXZpY2UgKnJ0Yywgc3RydWN0IHJ0Y190aW1lciAqdGltZXIpCit7CisJdGltZXJxdWV1ZV9hZGQoJnJ0Yy0+dGltZXJxdWV1ZSwgJnRpbWVyLT5ub2RlKTsKKwlpZiAoJnRpbWVyLT5ub2RlID09IHRpbWVycXVldWVfZ2V0bmV4dCgmcnRjLT50aW1lcnF1ZXVlKSkgeworCQlzdHJ1Y3QgcnRjX3drYWxybSBhbGFybTsKKwkJaW50IGVycjsKKwkJYWxhcm0udGltZSA9IHJ0Y19rdGltZV90b190bSh0aW1lci0+bm9kZS5leHBpcmVzKTsKKwkJYWxhcm0uZW5hYmxlZCA9IDE7CisJCWVyciA9IF9fcnRjX3NldF9hbGFybShydGMsICZhbGFybSk7CisJCWlmIChlcnIgPT0gLUVUSU1FKQorCQkJc2NoZWR1bGVfd29yaygmcnRjLT5pcnF3b3JrKTsKKwl9Cit9CisKKy8qKgorICogcnRjX3RpbWVyX3JlbW92ZSAtIFJlbW92ZXMgYSBydGNfdGltZXIgZnJvbSB0aGUgcnRjX2RldmljZSB0aW1lcnF1ZXVlCisgKiBAcnRjIHJ0YyBkZXZpY2UKKyAqIEB0aW1lciB0aW1lciBiZWluZyByZW1vdmVkLgorICoKKyAqIFJlbW92ZXMgYSB0aW1lciBvbnRvIHRoZSBydGMgZGV2aWNlcyB0aW1lcnF1ZXVlIGFuZCBzZXRzCisgKiB0aGUgbmV4dCBhbGFybSBldmVudCBhcHByb3ByaWF0ZWx5LgorICoKKyAqIE11c3QgaG9sZCBvcHNfbG9jayBmb3IgcHJvcGVyIHNlcmlhbGl6YXRpb24gb2YgdGltZXJxdWV1ZQorICovCit2b2lkIHJ0Y190aW1lcl9yZW1vdmUoc3RydWN0IHJ0Y19kZXZpY2UgKnJ0Yywgc3RydWN0IHJ0Y190aW1lciAqdGltZXIpCit7CisJc3RydWN0IHRpbWVycXVldWVfbm9kZSAqbmV4dCA9IHRpbWVycXVldWVfZ2V0bmV4dCgmcnRjLT50aW1lcnF1ZXVlKTsKKwl0aW1lcnF1ZXVlX2RlbCgmcnRjLT50aW1lcnF1ZXVlLCAmdGltZXItPm5vZGUpOworCisJaWYgKG5leHQgPT0gJnRpbWVyLT5ub2RlKSB7CisJCXN0cnVjdCBydGNfd2thbHJtIGFsYXJtOworCQlpbnQgZXJyOworCQluZXh0ID0gdGltZXJxdWV1ZV9nZXRuZXh0KCZydGMtPnRpbWVycXVldWUpOworCQlpZiAoIW5leHQpCisJCQlyZXR1cm47CisJCWFsYXJtLnRpbWUgPSBydGNfa3RpbWVfdG9fdG0obmV4dC0+ZXhwaXJlcyk7CisJCWFsYXJtLmVuYWJsZWQgPSAxOworCQllcnIgPSBfX3J0Y19zZXRfYWxhcm0ocnRjLCAmYWxhcm0pOworCQlpZiAoZXJyID09IC1FVElNRSkKKwkJCXNjaGVkdWxlX3dvcmsoJnJ0Yy0+aXJxd29yayk7CisJfQorfQorCisvKioKKyAqIHJ0Y190aW1lcl9kb193b3JrIC0gRXhwaXJlcyBydGMgdGltZXJzCisgKiBAcnRjIHJ0YyBkZXZpY2UKKyAqIEB0aW1lciB0aW1lciBiZWluZyByZW1vdmVkLgorICoKKyAqIEV4cGlyZXMgcnRjIHRpbWVycy4gUmVwcm9ncmFtcyBuZXh0IGFsYXJtIGV2ZW50IGlmIG5lZWRlZC4KKyAqIENhbGxlZCB2aWEgd29ya3Rhc2suCisgKgorICogU2VyaWFsaXplcyBhY2Nlc3MgdG8gdGltZXJxdWV1ZSB2aWEgb3BzX2xvY2sgbXV0ZXgKKyAqLwordm9pZCBydGNfdGltZXJfZG9fd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IHJ0Y190aW1lciAqdGltZXI7CisJc3RydWN0IHRpbWVycXVldWVfbm9kZSAqbmV4dDsKKwlrdGltZV90IG5vdzsKKwlzdHJ1Y3QgcnRjX3RpbWUgdG07CisKKwlzdHJ1Y3QgcnRjX2RldmljZSAqcnRjID0KKwkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBydGNfZGV2aWNlLCBpcnF3b3JrKTsKKworCW11dGV4X2xvY2soJnJ0Yy0+b3BzX2xvY2spOworYWdhaW46CisJX19ydGNfcmVhZF90aW1lKHJ0YywgJnRtKTsKKwlub3cgPSBydGNfdG1fdG9fa3RpbWUodG0pOworCXdoaWxlICgobmV4dCA9IHRpbWVycXVldWVfZ2V0bmV4dCgmcnRjLT50aW1lcnF1ZXVlKSkpIHsKKwkJaWYgKG5leHQtPmV4cGlyZXMudHY2NCA+IG5vdy50djY0KQorCQkJYnJlYWs7CisKKwkJLyogZXhwaXJlIHRpbWVyICovCisJCXRpbWVyID0gY29udGFpbmVyX29mKG5leHQsIHN0cnVjdCBydGNfdGltZXIsIG5vZGUpOworCQl0aW1lcnF1ZXVlX2RlbCgmcnRjLT50aW1lcnF1ZXVlLCAmdGltZXItPm5vZGUpOworCQl0aW1lci0+ZW5hYmxlZCA9IDA7CisJCWlmICh0aW1lci0+dGFzay5mdW5jKQorCQkJdGltZXItPnRhc2suZnVuYyh0aW1lci0+dGFzay5wcml2YXRlX2RhdGEpOworCisJCS8qIFJlLWFkZC9md2QgcGVyaW9kaWMgdGltZXJzICovCisJCWlmIChrdGltZV90b19ucyh0aW1lci0+cGVyaW9kKSkgeworCQkJdGltZXItPm5vZGUuZXhwaXJlcyA9IGt0aW1lX2FkZCh0aW1lci0+bm9kZS5leHBpcmVzLAorCQkJCQkJCXRpbWVyLT5wZXJpb2QpOworCQkJdGltZXItPmVuYWJsZWQgPSAxOworCQkJdGltZXJxdWV1ZV9hZGQoJnJ0Yy0+dGltZXJxdWV1ZSwgJnRpbWVyLT5ub2RlKTsKKwkJfQorCX0KKworCS8qIFNldCBuZXh0IGFsYXJtICovCisJaWYgKG5leHQpIHsKKwkJc3RydWN0IHJ0Y193a2Fscm0gYWxhcm07CisJCWludCBlcnI7CisJCWFsYXJtLnRpbWUgPSBydGNfa3RpbWVfdG9fdG0obmV4dC0+ZXhwaXJlcyk7CisJCWFsYXJtLmVuYWJsZWQgPSAxOworCQllcnIgPSBfX3J0Y19zZXRfYWxhcm0ocnRjLCAmYWxhcm0pOworCQlpZiAoZXJyID09IC1FVElNRSkKKwkJCWdvdG8gYWdhaW47CisJfQorCisJbXV0ZXhfdW5sb2NrKCZydGMtPm9wc19sb2NrKTsKK30KKworCisvKiBydGNfdGltZXJfaW5pdCAtIEluaXRpYWxpemVzIGFuIHJ0Y190aW1lcgorICogQHRpbWVyOiB0aW1lciB0byBiZSBpbnRpaWFsaXplZAorICogQGY6IGZ1bmN0aW9uIHBvaW50ZXIgdG8gYmUgY2FsbGVkIHdoZW4gdGltZXIgZmlyZXMKKyAqIEBkYXRhOiBwcml2YXRlIGRhdGEgcGFzc2VkIHRvIGZ1bmN0aW9uIHBvaW50ZXIKKyAqCisgKiBLZXJuZWwgaW50ZXJmYWNlIHRvIGluaXRpYWxpemluZyBhbiBydGNfdGltZXIuCisgKi8KK3ZvaWQgcnRjX3RpbWVyX2luaXQoc3RydWN0IHJ0Y190aW1lciAqdGltZXIsIHZvaWQgKCpmKSh2b2lkKiBwKSwgdm9pZCogZGF0YSkKK3sKKwl0aW1lcnF1ZXVlX2luaXQoJnRpbWVyLT5ub2RlKTsKKwl0aW1lci0+ZW5hYmxlZCA9IDA7CisJdGltZXItPnRhc2suZnVuYyA9IGY7CisJdGltZXItPnRhc2sucHJpdmF0ZV9kYXRhID0gZGF0YTsKK30KKworLyogcnRjX3RpbWVyX3N0YXJ0IC0gU2V0cyBhbiBydGNfdGltZXIgdG8gZmlyZSBpbiB0aGUgZnV0dXJlCisgKiBAIHJ0YzogcnRjIGRldmljZSB0byBiZSB1c2VkCisgKiBAIHRpbWVyOiB0aW1lciBiZWluZyBzZXQKKyAqIEAgZXhwaXJlczogdGltZSBhdCB3aGljaCB0byBleHBpcmUgdGhlIHRpbWVyCisgKiBAIHBlcmlvZDogcGVyaW9kIHRoYXQgdGhlIHRpbWVyIHdpbGwgcmVjdXIKKyAqCisgKiBLZXJuZWwgaW50ZXJmYWNlIHRvIHNldCBhbiBydGNfdGltZXIKKyAqLworaW50IHJ0Y190aW1lcl9zdGFydChzdHJ1Y3QgcnRjX2RldmljZSAqcnRjLCBzdHJ1Y3QgcnRjX3RpbWVyKiB0aW1lciwKKwkJCWt0aW1lX3QgZXhwaXJlcywga3RpbWVfdCBwZXJpb2QpCit7CisJaW50IHJldCA9IDA7CisJbXV0ZXhfbG9jaygmcnRjLT5vcHNfbG9jayk7CisJaWYgKHRpbWVyLT5lbmFibGVkKQorCQlydGNfdGltZXJfcmVtb3ZlKHJ0YywgdGltZXIpOworCisJdGltZXItPm5vZGUuZXhwaXJlcyA9IGV4cGlyZXM7CisJdGltZXItPnBlcmlvZCA9IHBlcmlvZDsKKworCXRpbWVyLT5lbmFibGVkID0gMTsKKwlydGNfdGltZXJfZW5xdWV1ZShydGMsIHRpbWVyKTsKKworCW11dGV4X3VubG9jaygmcnRjLT5vcHNfbG9jayk7CisJcmV0dXJuIHJldDsKK30KKworLyogcnRjX3RpbWVyX2NhbmNlbCAtIFN0b3BzIGFuIHJ0Y190aW1lcgorICogQCBydGM6IHJ0YyBkZXZpY2UgdG8gYmUgdXNlZAorICogQCB0aW1lcjogdGltZXIgYmVpbmcgc2V0CisgKgorICogS2VybmVsIGludGVyZmFjZSB0byBjYW5jZWwgYW4gcnRjX3RpbWVyCisgKi8KK2ludCBydGNfdGltZXJfY2FuY2VsKHN0cnVjdCBydGNfZGV2aWNlICpydGMsIHN0cnVjdCBydGNfdGltZXIqIHRpbWVyKQoreworCWludCByZXQgPSAwOworCW11dGV4X2xvY2soJnJ0Yy0+b3BzX2xvY2spOworCWlmICh0aW1lci0+ZW5hYmxlZCkKKwkJcnRjX3RpbWVyX3JlbW92ZShydGMsIHRpbWVyKTsKKwl0aW1lci0+ZW5hYmxlZCA9IDA7CisJbXV0ZXhfdW5sb2NrKCZydGMtPm9wc19sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnRjL3J0Yy1jbW9zLmMgYi9kcml2ZXJzL3J0Yy9ydGMtY21vcy5jCmluZGV4IDU4NTYxNjcuLjdlNmNlNjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcnRjL3J0Yy1jbW9zLmMKKysrIGIvZHJpdmVycy9ydGMvcnRjLWNtb3MuYwpAQCAtNjg3LDcgKzY4Nyw4IEBACiAjaWYJZGVmaW5lZChDT05GSUdfQVRBUkkpCiAJYWRkcmVzc19zcGFjZSA9IDY0OwogI2VsaWYgZGVmaW5lZChfX2kzODZfXykgfHwgZGVmaW5lZChfX3g4Nl82NF9fKSB8fCBkZWZpbmVkKF9fYXJtX18pIFwKLQkJCXx8IGRlZmluZWQoX19zcGFyY19fKSB8fCBkZWZpbmVkKF9fbWlwc19fKQorCQkJfHwgZGVmaW5lZChfX3NwYXJjX18pIHx8IGRlZmluZWQoX19taXBzX18pIFwKKwkJCXx8IGRlZmluZWQoX19wb3dlcnBjX18pCiAJYWRkcmVzc19zcGFjZSA9IDEyODsKICNlbHNlCiAjd2FybmluZyBBc3N1bWluZyAxMjggYnl0ZXMgb2YgUlRDK05WUkFNIGFkZHJlc3Mgc3BhY2UsIG5vdCA2NCBieXRlcy4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnRjL3J0Yy1kZXYuYyBiL2RyaXZlcnMvcnRjL3J0Yy1kZXYuYwppbmRleCAwY2MwOTg0Li4yMTJiMTZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3J0Yy9ydGMtZGV2LmMKKysrIGIvZHJpdmVycy9ydGMvcnRjLWRldi5jCkBAIC00NiwxMDUgKzQ2LDYgQEAKIAlyZXR1cm4gZXJyOwogfQogCi0jaWZkZWYgQ09ORklHX1JUQ19JTlRGX0RFVl9VSUVfRU1VTAotLyoKLSAqIFJvdXRpbmUgdG8gcG9sbCBSVEMgc2Vjb25kcyBmaWVsZCBmb3IgY2hhbmdlIGFzIG9mdGVuIGFzIHBvc3NpYmxlLAotICogYWZ0ZXIgZmlyc3QgUlRDX1VJRSB1c2UgdGltZXIgdG8gcmVkdWNlIHBvbGxpbmcKLSAqLwotc3RhdGljIHZvaWQgcnRjX3VpZV90YXNrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKLXsKLQlzdHJ1Y3QgcnRjX2RldmljZSAqcnRjID0KLQkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBydGNfZGV2aWNlLCB1aWVfdGFzayk7Ci0Jc3RydWN0IHJ0Y190aW1lIHRtOwotCWludCBudW0gPSAwOwotCWludCBlcnI7Ci0KLQllcnIgPSBydGNfcmVhZF90aW1lKHJ0YywgJnRtKTsKLQotCXNwaW5fbG9ja19pcnEoJnJ0Yy0+aXJxX2xvY2spOwotCWlmIChydGMtPnN0b3BfdWllX3BvbGxpbmcgfHwgZXJyKSB7Ci0JCXJ0Yy0+dWllX3Rhc2tfYWN0aXZlID0gMDsKLQl9IGVsc2UgaWYgKHJ0Yy0+b2xkc2VjcyAhPSB0bS50bV9zZWMpIHsKLQkJbnVtID0gKHRtLnRtX3NlYyArIDYwIC0gcnRjLT5vbGRzZWNzKSAlIDYwOwotCQlydGMtPm9sZHNlY3MgPSB0bS50bV9zZWM7Ci0JCXJ0Yy0+dWllX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgSFogLSAoSFovMTApOwotCQlydGMtPnVpZV90aW1lcl9hY3RpdmUgPSAxOwotCQlydGMtPnVpZV90YXNrX2FjdGl2ZSA9IDA7Ci0JCWFkZF90aW1lcigmcnRjLT51aWVfdGltZXIpOwotCX0gZWxzZSBpZiAoc2NoZWR1bGVfd29yaygmcnRjLT51aWVfdGFzaykgPT0gMCkgewotCQlydGMtPnVpZV90YXNrX2FjdGl2ZSA9IDA7Ci0JfQotCXNwaW5fdW5sb2NrX2lycSgmcnRjLT5pcnFfbG9jayk7Ci0JaWYgKG51bSkKLQkJcnRjX3VwZGF0ZV9pcnEocnRjLCBudW0sIFJUQ19VRiB8IFJUQ19JUlFGKTsKLX0KLXN0YXRpYyB2b2lkIHJ0Y191aWVfdGltZXIodW5zaWduZWQgbG9uZyBkYXRhKQotewotCXN0cnVjdCBydGNfZGV2aWNlICpydGMgPSAoc3RydWN0IHJ0Y19kZXZpY2UgKilkYXRhOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcnRjLT5pcnFfbG9jaywgZmxhZ3MpOwotCXJ0Yy0+dWllX3RpbWVyX2FjdGl2ZSA9IDA7Ci0JcnRjLT51aWVfdGFza19hY3RpdmUgPSAxOwotCWlmICgoc2NoZWR1bGVfd29yaygmcnRjLT51aWVfdGFzaykgPT0gMCkpCi0JCXJ0Yy0+dWllX3Rhc2tfYWN0aXZlID0gMDsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZydGMtPmlycV9sb2NrLCBmbGFncyk7Ci19Ci0KLXN0YXRpYyBpbnQgY2xlYXJfdWllKHN0cnVjdCBydGNfZGV2aWNlICpydGMpCi17Ci0Jc3Bpbl9sb2NrX2lycSgmcnRjLT5pcnFfbG9jayk7Ci0JaWYgKHJ0Yy0+dWllX2lycV9hY3RpdmUpIHsKLQkJcnRjLT5zdG9wX3VpZV9wb2xsaW5nID0gMTsKLQkJaWYgKHJ0Yy0+dWllX3RpbWVyX2FjdGl2ZSkgewotCQkJc3Bpbl91bmxvY2tfaXJxKCZydGMtPmlycV9sb2NrKTsKLQkJCWRlbF90aW1lcl9zeW5jKCZydGMtPnVpZV90aW1lcik7Ci0JCQlzcGluX2xvY2tfaXJxKCZydGMtPmlycV9sb2NrKTsKLQkJCXJ0Yy0+dWllX3RpbWVyX2FjdGl2ZSA9IDA7Ci0JCX0KLQkJaWYgKHJ0Yy0+dWllX3Rhc2tfYWN0aXZlKSB7Ci0JCQlzcGluX3VubG9ja19pcnEoJnJ0Yy0+aXJxX2xvY2spOwotCQkJZmx1c2hfd29ya19zeW5jKCZydGMtPnVpZV90YXNrKTsKLQkJCXNwaW5fbG9ja19pcnEoJnJ0Yy0+aXJxX2xvY2spOwotCQl9Ci0JCXJ0Yy0+dWllX2lycV9hY3RpdmUgPSAwOwotCX0KLQlzcGluX3VubG9ja19pcnEoJnJ0Yy0+aXJxX2xvY2spOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHNldF91aWUoc3RydWN0IHJ0Y19kZXZpY2UgKnJ0YykKLXsKLQlzdHJ1Y3QgcnRjX3RpbWUgdG07Ci0JaW50IGVycjsKLQotCWVyciA9IHJ0Y19yZWFkX3RpbWUocnRjLCAmdG0pOwotCWlmIChlcnIpCi0JCXJldHVybiBlcnI7Ci0Jc3Bpbl9sb2NrX2lycSgmcnRjLT5pcnFfbG9jayk7Ci0JaWYgKCFydGMtPnVpZV9pcnFfYWN0aXZlKSB7Ci0JCXJ0Yy0+dWllX2lycV9hY3RpdmUgPSAxOwotCQlydGMtPnN0b3BfdWllX3BvbGxpbmcgPSAwOwotCQlydGMtPm9sZHNlY3MgPSB0bS50bV9zZWM7Ci0JCXJ0Yy0+dWllX3Rhc2tfYWN0aXZlID0gMTsKLQkJaWYgKHNjaGVkdWxlX3dvcmsoJnJ0Yy0+dWllX3Rhc2spID09IDApCi0JCQlydGMtPnVpZV90YXNrX2FjdGl2ZSA9IDA7Ci0JfQotCXJ0Yy0+aXJxX2RhdGEgPSAwOwotCXNwaW5fdW5sb2NrX2lycSgmcnRjLT5pcnFfbG9jayk7Ci0JcmV0dXJuIDA7Ci19Ci0KLWludCBydGNfZGV2X3VwZGF0ZV9pcnFfZW5hYmxlX2VtdWwoc3RydWN0IHJ0Y19kZXZpY2UgKnJ0YywgdW5zaWduZWQgaW50IGVuYWJsZWQpCi17Ci0JaWYgKGVuYWJsZWQpCi0JCXJldHVybiBzZXRfdWllKHJ0Yyk7Ci0JZWxzZQotCQlyZXR1cm4gY2xlYXJfdWllKHJ0Yyk7Ci19Ci1FWFBPUlRfU1lNQk9MKHJ0Y19kZXZfdXBkYXRlX2lycV9lbmFibGVfZW11bCk7Ci0KLSNlbmRpZiAvKiBDT05GSUdfUlRDX0lOVEZfREVWX1VJRV9FTVVMICovCiAKIHN0YXRpYyBzc2l6ZV90CiBydGNfZGV2X3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQpAQCAtNDkzLDExICszOTQsNiBAQAogCiAJcnRjLT5kZXYuZGV2dCA9IE1LREVWKE1BSk9SKHJ0Y19kZXZ0KSwgcnRjLT5pZCk7CiAKLSNpZmRlZiBDT05GSUdfUlRDX0lOVEZfREVWX1VJRV9FTVVMCi0JSU5JVF9XT1JLKCZydGMtPnVpZV90YXNrLCBydGNfdWllX3Rhc2spOwotCXNldHVwX3RpbWVyKCZydGMtPnVpZV90aW1lciwgcnRjX3VpZV90aW1lciwgKHVuc2lnbmVkIGxvbmcpcnRjKTsKLSNlbmRpZgotCiAJY2Rldl9pbml0KCZydGMtPmNoYXJfZGV2LCAmcnRjX2Rldl9mb3BzKTsKIAlydGMtPmNoYXJfZGV2Lm93bmVyID0gcnRjLT5vd25lcjsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnRjL3J0Yy1kczEzMDcuYyBiL2RyaXZlcnMvcnRjL3J0Yy1kczEzMDcuYwppbmRleCBkODI3Y2U1Li4wZDU1OWI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3J0Yy9ydGMtZHMxMzA3LmMKKysrIGIvZHJpdmVycy9ydGMvcnRjLWRzMTMwNy5jCkBAIC0xMDYsOSArMTA2LDkgQEAKIAlzdHJ1Y3QgaTJjX2NsaWVudAkqY2xpZW50OwogCXN0cnVjdCBydGNfZGV2aWNlCSpydGM7CiAJc3RydWN0IHdvcmtfc3RydWN0CXdvcms7Ci0JczMyICgqcmVhZF9ibG9ja19kYXRhKShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCBjb21tYW5kLAorCXMzMiAoKnJlYWRfYmxvY2tfZGF0YSkoY29uc3Qgc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggY29tbWFuZCwKIAkJCSAgICAgICB1OCBsZW5ndGgsIHU4ICp2YWx1ZXMpOwotCXMzMiAoKndyaXRlX2Jsb2NrX2RhdGEpKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IGNvbW1hbmQsCisJczMyICgqd3JpdGVfYmxvY2tfZGF0YSkoY29uc3Qgc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggY29tbWFuZCwKIAkJCQl1OCBsZW5ndGgsIGNvbnN0IHU4ICp2YWx1ZXMpOwogfTsKIApAQCAtMTU4LDggKzE1OCw4IEBACiAKICNkZWZpbmUgQkxPQ0tfREFUQV9NQVhfVFJJRVMgMTAKIAotc3RhdGljIHMzMiBkczEzMDdfcmVhZF9ibG9ja19kYXRhX29uY2Uoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggY29tbWFuZCwKLQkJCQkgIHU4IGxlbmd0aCwgdTggKnZhbHVlcykKK3N0YXRpYyBzMzIgZHMxMzA3X3JlYWRfYmxvY2tfZGF0YV9vbmNlKGNvbnN0IHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJCQkJICAgICAgIHU4IGNvbW1hbmQsIHU4IGxlbmd0aCwgdTggKnZhbHVlcykKIHsKIAlzMzIgaSwgZGF0YTsKIApAQCAtMTcyLDcgKzE3Miw3IEBACiAJcmV0dXJuIGk7CiB9CiAKLXN0YXRpYyBzMzIgZHMxMzA3X3JlYWRfYmxvY2tfZGF0YShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCBjb21tYW5kLAorc3RhdGljIHMzMiBkczEzMDdfcmVhZF9ibG9ja19kYXRhKGNvbnN0IHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IGNvbW1hbmQsCiAJCQkJICB1OCBsZW5ndGgsIHU4ICp2YWx1ZXMpCiB7CiAJdTggb2xkdmFsdWVzW0kyQ19TTUJVU19CTE9DS19NQVhdOwpAQCAtMTk4LDcgKzE5OCw3IEBACiAJcmV0dXJuIGxlbmd0aDsKIH0KIAotc3RhdGljIHMzMiBkczEzMDdfd3JpdGVfYmxvY2tfZGF0YShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCBjb21tYW5kLAorc3RhdGljIHMzMiBkczEzMDdfd3JpdGVfYmxvY2tfZGF0YShjb25zdCBzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCBjb21tYW5kLAogCQkJCSAgIHU4IGxlbmd0aCwgY29uc3QgdTggKnZhbHVlcykKIHsKIAl1OCBjdXJydmFsdWVzW0kyQ19TTUJVU19CTE9DS19NQVhdOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ydGMvcnRjLWxpYi5jIGIvZHJpdmVycy9ydGMvcnRjLWxpYi5jCmluZGV4IDc3Mzg1MWYuLjA3NWYxNzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcnRjL3J0Yy1saWIuYworKysgYi9kcml2ZXJzL3J0Yy9ydGMtbGliLmMKQEAgLTExNyw0ICsxMTcsMzIgQEAKIH0KIEVYUE9SVF9TWU1CT0wocnRjX3RtX3RvX3RpbWUpOwogCisvKgorICogQ29udmVydCBydGNfdGltZSB0byBrdGltZQorICovCitrdGltZV90IHJ0Y190bV90b19rdGltZShzdHJ1Y3QgcnRjX3RpbWUgdG0pCit7CisJdGltZV90IHRpbWU7CisJcnRjX3RtX3RvX3RpbWUoJnRtLCAmdGltZSk7CisJcmV0dXJuIGt0aW1lX3NldCh0aW1lLCAwKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHJ0Y190bV90b19rdGltZSk7CisKKy8qCisgKiBDb252ZXJ0IGt0aW1lIHRvIHJ0Y190aW1lCisgKi8KK3N0cnVjdCBydGNfdGltZSBydGNfa3RpbWVfdG9fdG0oa3RpbWVfdCBrdCkKK3sKKwlzdHJ1Y3QgdGltZXNwZWMgdHM7CisJc3RydWN0IHJ0Y190aW1lIHJldDsKKworCXRzID0ga3RpbWVfdG9fdGltZXNwZWMoa3QpOworCS8qIFJvdW5kIHVwIGFueSBucyAqLworCWlmICh0cy50dl9uc2VjKQorCQl0cy50dl9zZWMrKzsKKwlydGNfdGltZV90b190bSh0cy50dl9zZWMsICZyZXQpOworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChydGNfa3RpbWVfdG9fdG0pOworCiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY2hhci90YXBlX2NsYXNzLmggYi9kcml2ZXJzL3MzOTAvY2hhci90YXBlX2NsYXNzLmgKaW5kZXggNzA3YjdmNC4uOWUzMjc4MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2NoYXIvdGFwZV9jbGFzcy5oCisrKyBiL2RyaXZlcnMvczM5MC9jaGFyL3RhcGVfY2xhc3MuaApAQCAtMTQsNyArMTQsNiBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvbWFqb3IuaD4KLSNpbmNsdWRlIDxsaW51eC9rb2JqZWN0Lmg+CiAjaW5jbHVkZSA8bGludXgva29ial9tYXAuaD4KICNpbmNsdWRlIDxsaW51eC9jZGV2Lmg+CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2J1cy9jaGFyL2pzZmxhc2guYyBiL2RyaXZlcnMvc2J1cy9jaGFyL2pzZmxhc2guYwppbmRleCBhNjI0ZjVhLi5lODU2NjIyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NidXMvY2hhci9qc2ZsYXNoLmMKKysrIGIvZHJpdmVycy9zYnVzL2NoYXIvanNmbGFzaC5jCkBAIC00NjcsNyArNDY3LDcgQEAKIAogCW5vZGUgPSBwcm9tX2dldGNoaWxkKHByb21fcm9vdF9ub2RlKTsKIAlub2RlID0gcHJvbV9zZWFyY2hzaWJsaW5ncyhub2RlLCAiZmxhc2gtbWVtb3J5Iik7Ci0JaWYgKG5vZGUgIT0gMCAmJiBub2RlICE9IC0xKSB7CisJaWYgKG5vZGUgIT0gMCAmJiAoczMyKW5vZGUgIT0gLTEpIHsKIAkJaWYgKHByb21fZ2V0cHJvcGVydHkobm9kZSwgInJlZyIsCiAJCSAgICAoY2hhciAqKSZyZWcwLCBzaXplb2YocmVnMCkpID09IC0xKSB7CiAJCQlwcmludGsoImpzZmxhc2g6IG5vIFwicmVnXCIgcHJvcGVydHlcbiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2lwci5jIGIvZHJpdmVycy9zY3NpL2lwci5jCmluZGV4IGRlMmUwOWUuLmQzYzU5MDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9pcHIuYworKysgYi9kcml2ZXJzL3Njc2kvaXByLmMKQEAgLTU3NDgsNyArNTc0OCw3IEBACiAJfQogCiAJaWYgKGlwcl9pc19nYXRhKHJlcykgJiYgcmVzLT5zYXRhX3BvcnQpCi0JCXJldHVybiBhdGFfc2FzX3F1ZXVlY21kKHNjc2lfY21kLCBkb25lLCByZXMtPnNhdGFfcG9ydC0+YXApOworCQlyZXR1cm4gYXRhX3Nhc19xdWV1ZWNtZChzY3NpX2NtZCwgcmVzLT5zYXRhX3BvcnQtPmFwKTsKIAogCWlwcl9jbWQgPSBpcHJfZ2V0X2ZyZWVfaXByX2NtbmQoaW9hX2NmZyk7CiAJaW9hcmNiID0gJmlwcl9jbWQtPmlvYXJjYjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9saWJzYXMvc2FzX3Njc2lfaG9zdC5jIGIvZHJpdmVycy9zY3NpL2xpYnNhcy9zYXNfc2NzaV9ob3N0LmMKaW5kZXggMjkyNTFmYS4uNTgxNWNiZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xpYnNhcy9zYXNfc2NzaV9ob3N0LmMKKysrIGIvZHJpdmVycy9zY3NpL2xpYnNhcy9zYXNfc2NzaV9ob3N0LmMKQEAgLTIxMSw4ICsyMTEsNyBAQAogCQkJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCQkJc3Bpbl9sb2NrX2lycXNhdmUoZGV2LT5zYXRhX2Rldi5hcC0+bG9jaywgZmxhZ3MpOwotCQkJcmVzID0gYXRhX3Nhc19xdWV1ZWNtZChjbWQsIHNjc2lfZG9uZSwKLQkJCQkJICAgICAgIGRldi0+c2F0YV9kZXYuYXApOworCQkJcmVzID0gYXRhX3Nhc19xdWV1ZWNtZChjbWQsIGRldi0+c2F0YV9kZXYuYXApOwogCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShkZXYtPnNhdGFfZGV2LmFwLT5sb2NrLCBmbGFncyk7CiAJCQlnb3RvIG91dDsKIAkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvS2NvbmZpZyBiL2RyaXZlcnMvc2VyaWFsL0tjb25maWcKaW5kZXggZWMzYzIxNC4uYzFkZjc2NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvS2NvbmZpZworKysgYi9kcml2ZXJzL3NlcmlhbC9LY29uZmlnCkBAIC03NzYsMjQgKzc3Niw3IEBACiAJYm9vbCAiRW5hYmxlIFVBUlQwIGhhcmR3YXJlIGZsb3cgY29udHJvbCIKIAlkZXBlbmRzIG9uIFNFUklBTF9CRklOX1VBUlQwCiAJaGVscAotCSAgRW5hYmxlIGhhcmR3YXJlIGZsb3cgY29udHJvbCBpbiB0aGUgZHJpdmVyLiBVc2luZyBHUElPIGVtdWxhdGUgdGhlIENUUy9SVFMKLQkgIHNpZ25hbC4KLQotY29uZmlnIFVBUlQwX0NUU19QSU4KLQlpbnQgIlVBUlQwIENUUyBwaW4iCi0JZGVwZW5kcyBvbiBCRklOX1VBUlQwX0NUU1JUUyAmJiAhQkY1NDgKLQlkZWZhdWx0IDIzCi0JaGVscAotCSAgVGhlIGRlZmF1bHQgcGluIGlzIEdQSU9fR1A3LgotCSAgUmVmZXIgdG8gYXJjaC9ibGFja2Zpbi9tYWNoLSovaW5jbHVkZS9tYWNoL2dwaW8uaCB0byBzZWUgdGhlIEdQSU8gbWFwLgotCi1jb25maWcgVUFSVDBfUlRTX1BJTgotCWludCAiVUFSVDAgUlRTIHBpbiIKLQlkZXBlbmRzIG9uIEJGSU5fVUFSVDBfQ1RTUlRTICYmICFCRjU0OAotCWRlZmF1bHQgMjIKLQloZWxwCi0JICBUaGUgZGVmYXVsdCBwaW4gaXMgR1BJT19HUDYuCi0JICBSZWZlciB0byBhcmNoL2JsYWNrZmluL21hY2gtKi9pbmNsdWRlL21hY2gvZ3Bpby5oIHRvIHNlZSB0aGUgR1BJTyBtYXAuCisJICBFbmFibGUgaGFyZHdhcmUgZmxvdyBjb250cm9sIGluIHRoZSBkcml2ZXIuCiAKIGNvbmZpZyBTRVJJQUxfQkZJTl9VQVJUMQogCWJvb2wgIkVuYWJsZSBVQVJUMSIKQEAgLTgwNSwyMiArNzg4LDcgQEAKIAlib29sICJFbmFibGUgVUFSVDEgaGFyZHdhcmUgZmxvdyBjb250cm9sIgogCWRlcGVuZHMgb24gU0VSSUFMX0JGSU5fVUFSVDEKIAloZWxwCi0JICBFbmFibGUgaGFyZHdhcmUgZmxvdyBjb250cm9sIGluIHRoZSBkcml2ZXIuIFVzaW5nIEdQSU8gZW11bGF0ZSB0aGUgQ1RTL1JUUwotCSAgc2lnbmFsLgotCi1jb25maWcgVUFSVDFfQ1RTX1BJTgotCWludCAiVUFSVDEgQ1RTIHBpbiIKLQlkZXBlbmRzIG9uIEJGSU5fVUFSVDFfQ1RTUlRTICYmICFCRjU0OAotCWRlZmF1bHQgLTEKLQloZWxwCi0JICBSZWZlciB0byBhcmNoL2JsYWNrZmluL21hY2gtKi9pbmNsdWRlL21hY2gvZ3Bpby5oIHRvIHNlZSB0aGUgR1BJTyBtYXAuCi0KLWNvbmZpZyBVQVJUMV9SVFNfUElOCi0JaW50ICJVQVJUMSBSVFMgcGluIgotCWRlcGVuZHMgb24gQkZJTl9VQVJUMV9DVFNSVFMgJiYgIUJGNTQ4Ci0JZGVmYXVsdCAtMQotCWhlbHAKLQkgIFJlZmVyIHRvIGFyY2gvYmxhY2tmaW4vbWFjaC0qL2luY2x1ZGUvbWFjaC9ncGlvLmggdG8gc2VlIHRoZSBHUElPIG1hcC4KKwkgIEVuYWJsZSBoYXJkd2FyZSBmbG93IGNvbnRyb2wgaW4gdGhlIGRyaXZlci4KIAogY29uZmlnIFNFUklBTF9CRklOX1VBUlQyCiAJYm9vbCAiRW5hYmxlIFVBUlQyIgpAQCAtODMyLDIyICs4MDAsNyBAQAogCWJvb2wgIkVuYWJsZSBVQVJUMiBoYXJkd2FyZSBmbG93IGNvbnRyb2wiCiAJZGVwZW5kcyBvbiBTRVJJQUxfQkZJTl9VQVJUMgogCWhlbHAKLQkgIEVuYWJsZSBoYXJkd2FyZSBmbG93IGNvbnRyb2wgaW4gdGhlIGRyaXZlci4gVXNpbmcgR1BJTyBlbXVsYXRlIHRoZSBDVFMvUlRTCi0JICBzaWduYWwuCi0KLWNvbmZpZyBVQVJUMl9DVFNfUElOCi0JaW50ICJVQVJUMiBDVFMgcGluIgotCWRlcGVuZHMgb24gQkZJTl9VQVJUMl9DVFNSVFMgJiYgIUJGNTQ4Ci0JZGVmYXVsdCAtMQotCWhlbHAKLQkgIFJlZmVyIHRvIGFyY2gvYmxhY2tmaW4vbWFjaC0qL2luY2x1ZGUvbWFjaC9ncGlvLmggdG8gc2VlIHRoZSBHUElPIG1hcC4KLQotY29uZmlnIFVBUlQyX1JUU19QSU4KLQlpbnQgIlVBUlQyIFJUUyBwaW4iCi0JZGVwZW5kcyBvbiBCRklOX1VBUlQyX0NUU1JUUyAmJiAhQkY1NDgKLQlkZWZhdWx0IC0xCi0JaGVscAotCSAgUmVmZXIgdG8gYXJjaC9ibGFja2Zpbi9tYWNoLSovaW5jbHVkZS9tYWNoL2dwaW8uaCB0byBzZWUgdGhlIEdQSU8gbWFwLgorCSAgRW5hYmxlIGhhcmR3YXJlIGZsb3cgY29udHJvbCBpbiB0aGUgZHJpdmVyLgogCiBjb25maWcgU0VSSUFMX0JGSU5fVUFSVDMKIAlib29sICJFbmFibGUgVUFSVDMiCkBAIC04NTksMjIgKzgxMiw3IEBACiAJYm9vbCAiRW5hYmxlIFVBUlQzIGhhcmR3YXJlIGZsb3cgY29udHJvbCIKIAlkZXBlbmRzIG9uIFNFUklBTF9CRklOX1VBUlQzCiAJaGVscAotCSAgRW5hYmxlIGhhcmR3YXJlIGZsb3cgY29udHJvbCBpbiB0aGUgZHJpdmVyLiBVc2luZyBHUElPIGVtdWxhdGUgdGhlIENUUy9SVFMKLQkgIHNpZ25hbC4KLQotY29uZmlnIFVBUlQzX0NUU19QSU4KLQlpbnQgIlVBUlQzIENUUyBwaW4iCi0JZGVwZW5kcyBvbiBCRklOX1VBUlQzX0NUU1JUUyAmJiAhQkY1NDgKLQlkZWZhdWx0IC0xCi0JaGVscAotCSAgUmVmZXIgdG8gYXJjaC9ibGFja2Zpbi9tYWNoLSovaW5jbHVkZS9tYWNoL2dwaW8uaCB0byBzZWUgdGhlIEdQSU8gbWFwLgotCi1jb25maWcgVUFSVDNfUlRTX1BJTgotCWludCAiVUFSVDMgUlRTIHBpbiIKLQlkZXBlbmRzIG9uIEJGSU5fVUFSVDNfQ1RTUlRTICYmICFCRjU0OAotCWRlZmF1bHQgLTEKLQloZWxwCi0JICBSZWZlciB0byBhcmNoL2JsYWNrZmluL21hY2gtKi9pbmNsdWRlL21hY2gvZ3Bpby5oIHRvIHNlZSB0aGUgR1BJTyBtYXAuCisJICBFbmFibGUgaGFyZHdhcmUgZmxvdyBjb250cm9sIGluIHRoZSBkcml2ZXIuCiAKIGNvbmZpZyBTRVJJQUxfSU1YCiAJYm9vbCAiSU1YIHNlcmlhbCBwb3J0IHN1cHBvcnQiCkBAIC0xNDEyLDcgKzEzNTAsNyBAQAogCiBjb25maWcgU0VSSUFMX09GX1BMQVRGT1JNCiAJdHJpc3RhdGUgIlNlcmlhbCBwb3J0IG9uIE9wZW4gRmlybXdhcmUgcGxhdGZvcm0gYnVzIgotCWRlcGVuZHMgb24gUFBDX09GIHx8IE1JQ1JPQkxBWkUKKwlkZXBlbmRzIG9uIE9GCiAJZGVwZW5kcyBvbiBTRVJJQUxfODI1MCB8fCBTRVJJQUxfT0ZfUExBVEZPUk1fTldQU0VSSUFMCiAJaGVscAogCSAgSWYgeW91IGhhdmUgYSBQb3dlclBDIGJhc2VkIHN5c3RlbSB0aGF0IGhhcyBzZXJpYWwgcG9ydHMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsL2JmaW5fNXh4LmMgYi9kcml2ZXJzL3NlcmlhbC9iZmluXzV4eC5jCmluZGV4IDE5Y2FjOWYuLmUzODFiODkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsL2JmaW5fNXh4LmMKKysrIGIvZHJpdmVycy9zZXJpYWwvYmZpbl81eHguYwpAQCAtMSw3ICsxLDcgQEAKIC8qCiAgKiBCbGFja2ZpbiBPbi1DaGlwIFNlcmlhbCBEcml2ZXIKICAqCi0gKiBDb3B5cmlnaHQgMjAwNi0yMDA4IEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqIENvcHlyaWdodCAyMDA2LTIwMTAgQW5hbG9nIERldmljZXMgSW5jLgogICoKICAqIEVudGVyIGJ1Z3MgYXQgaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnLwogICoKQEAgLTEyLDYgKzEyLDkgQEAKICNkZWZpbmUgU1VQUE9SVF9TWVNSUQogI2VuZGlmCiAKKyNkZWZpbmUgRFJJVkVSX05BTUUgImJmaW4tdWFydCIKKyNkZWZpbmUgcHJfZm10KGZtdCkgRFJJVkVSX05BTUUgIjogIiBmbXQKKwogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2dmcC5oPgpAQCAtMjMsMjEgKzI2LDIwIEBACiAjaW5jbHVkZSA8bGludXgvdHR5Lmg+CiAjaW5jbHVkZSA8bGludXgvdHR5X2ZsaXAuaD4KICNpbmNsdWRlIDxsaW51eC9zZXJpYWxfY29yZS5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9rZ2RiLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAKLSNpZiBkZWZpbmVkKENPTkZJR19LR0RCX1NFUklBTF9DT05TT0xFKSB8fCBcCi0JZGVmaW5lZChDT05GSUdfS0dEQl9TRVJJQUxfQ09OU09MRV9NT0RVTEUpCi0jaW5jbHVkZSA8bGludXgva2dkYi5oPgotI2luY2x1ZGUgPGFzbS9pcnFfcmVncy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxhc20vZ3Bpby5oPgotI2luY2x1ZGUgPG1hY2gvYmZpbl9zZXJpYWxfNXh4Lmg+Ci0KLSNpbmNsdWRlIDxhc20vZG1hLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+Ci0jaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9wb3J0bXV4Lmg+CiAjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KKyNpbmNsdWRlIDxhc20vZG1hLmg+CisKKyNkZWZpbmUgcG9ydF9tZW1iYXNlKHVhcnQpICAgICAoKChzdHJ1Y3QgYmZpbl9zZXJpYWxfcG9ydCAqKSh1YXJ0KSktPnBvcnQubWVtYmFzZSkKKyNkZWZpbmUgZ2V0X2xzcl9jYWNoZSh1YXJ0KSAgICAoKChzdHJ1Y3QgYmZpbl9zZXJpYWxfcG9ydCAqKSh1YXJ0KSktPmxzcikKKyNkZWZpbmUgcHV0X2xzcl9jYWNoZSh1YXJ0LCB2KSAoKChzdHJ1Y3QgYmZpbl9zZXJpYWxfcG9ydCAqKSh1YXJ0KSktPmxzciA9ICh2KSkKKyNpbmNsdWRlIDxhc20vYmZpbl9zZXJpYWwuaD4KIAogI2lmZGVmIENPTkZJR19TRVJJQUxfQkZJTl9NT0RVTEUKICMgdW5kZWYgQ09ORklHX0VBUkxZX1BSSU5USwpAQCAtNDgsMTIgKzUwLDExIEBACiAjZW5kaWYKIAogLyogVUFSVCBuYW1lIGFuZCBkZXZpY2UgZGVmaW5pdGlvbnMgKi8KLSNkZWZpbmUgQkZJTl9TRVJJQUxfTkFNRQkidHR5QkYiCisjZGVmaW5lIEJGSU5fU0VSSUFMX0RFVl9OQU1FCSJ0dHlCRiIKICNkZWZpbmUgQkZJTl9TRVJJQUxfTUFKT1IJMjA0CiAjZGVmaW5lIEJGSU5fU0VSSUFMX01JTk9SCTY0CiAKLXN0YXRpYyBzdHJ1Y3QgYmZpbl9zZXJpYWxfcG9ydCBiZmluX3NlcmlhbF9wb3J0c1tCRklOX1VBUlRfTlJfUE9SVFNdOwotc3RhdGljIGludCBucl9hY3RpdmVfcG9ydHMgPSBBUlJBWV9TSVpFKGJmaW5fc2VyaWFsX3Jlc291cmNlKTsKK3N0YXRpYyBzdHJ1Y3QgYmZpbl9zZXJpYWxfcG9ydCAqYmZpbl9zZXJpYWxfcG9ydHNbQkZJTl9VQVJUX05SX1BPUlRTXTsKIAogI2lmIGRlZmluZWQoQ09ORklHX0tHREJfU0VSSUFMX0NPTlNPTEUpIHx8IFwKIAlkZWZpbmVkKENPTkZJR19LR0RCX1NFUklBTF9DT05TT0xFX01PRFVMRSkKQEAgLTc0MywxNCArNzQ0LDE0IEBACiAJCX0KIAl9CiAJaWYgKHVhcnQtPnJ0c19waW4gPj0gMCkgewotCQlncGlvX3JlcXVlc3QodWFydC0+cnRzX3BpbiwgRFJJVkVSX05BTUUpOwogCQlncGlvX2RpcmVjdGlvbl9vdXRwdXQodWFydC0+cnRzX3BpbiwgMCk7CiAJfQogI2VuZGlmCiAjaWZkZWYgQ09ORklHX1NFUklBTF9CRklOX0hBUkRfQ1RTUlRTCi0JaWYgKHJlcXVlc3RfaXJxKHVhcnQtPnN0YXR1c19pcnEsCisJaWYgKHVhcnQtPmN0c19waW4gPj0gMCAmJiByZXF1ZXN0X2lycSh1YXJ0LT5zdGF0dXNfaXJxLAogCQliZmluX3NlcmlhbF9tY3RybF9jdHNfaW50LAogCQlJUlFGX0RJU0FCTEVELCAiQkZJTl9VQVJUX01PREVNX1NUQVRVUyIsIHVhcnQpKSB7CisJCXVhcnQtPmN0c19waW4gPSAtMTsKIAkJcHJfaW5mbygiVW5hYmxlIHRvIGF0dGFjaCBCbGFja0ZpbiBVQVJUIE1vZGVtIFN0YXR1cyBpbnRlcnJ1cHQuXG4iKTsKIAl9CiAKQEAgLTc5NiwxMSArNzk3LDkgQEAKICNpZmRlZiBDT05GSUdfU0VSSUFMX0JGSU5fQ1RTUlRTCiAJaWYgKHVhcnQtPmN0c19waW4gPj0gMCkKIAkJZnJlZV9pcnEoZ3Bpb190b19pcnEodWFydC0+Y3RzX3BpbiksIHVhcnQpOwotCWlmICh1YXJ0LT5ydHNfcGluID49IDApCi0JCWdwaW9fZnJlZSh1YXJ0LT5ydHNfcGluKTsKICNlbmRpZgogI2lmZGVmIENPTkZJR19TRVJJQUxfQkZJTl9IQVJEX0NUU1JUUwotCWlmIChVQVJUX0dFVF9JRVIodWFydCkgJiBFRFNTSSkKKwlpZiAodWFydC0+Y3RzX3BpbiA+PSAwKQogCQlmcmVlX2lycSh1YXJ0LT5zdGF0dXNfaXJxLCB1YXJ0KTsKICNlbmRpZgogfQpAQCAtOTYyLDMzICs5NjEsMzMgQEAKICAqLwogc3RhdGljIHZvaWQgYmZpbl9zZXJpYWxfc2V0X2xkaXNjKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsIGludCBsZCkKIHsKLQlpbnQgbGluZSA9IHBvcnQtPmxpbmU7CisJc3RydWN0IGJmaW5fc2VyaWFsX3BvcnQgKnVhcnQgPSAoc3RydWN0IGJmaW5fc2VyaWFsX3BvcnQgKilwb3J0OwogCXVuc2lnbmVkIHNob3J0IHZhbDsKIAogCXN3aXRjaCAobGQpIHsKIAljYXNlIE5fSVJEQToKLQkJdmFsID0gVUFSVF9HRVRfR0NUTCgmYmZpbl9zZXJpYWxfcG9ydHNbbGluZV0pOworCQl2YWwgPSBVQVJUX0dFVF9HQ1RMKHVhcnQpOwogCQl2YWwgfD0gKElSRU4gfCBSUE9MQyk7Ci0JCVVBUlRfUFVUX0dDVEwoJmJmaW5fc2VyaWFsX3BvcnRzW2xpbmVdLCB2YWwpOworCQlVQVJUX1BVVF9HQ1RMKHVhcnQsIHZhbCk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCXZhbCA9IFVBUlRfR0VUX0dDVEwoJmJmaW5fc2VyaWFsX3BvcnRzW2xpbmVdKTsKKwkJdmFsID0gVUFSVF9HRVRfR0NUTCh1YXJ0KTsKIAkJdmFsICY9IH4oSVJFTiB8IFJQT0xDKTsKLQkJVUFSVF9QVVRfR0NUTCgmYmZpbl9zZXJpYWxfcG9ydHNbbGluZV0sIHZhbCk7CisJCVVBUlRfUFVUX0dDVEwodWFydCwgdmFsKTsKIAl9CiB9CiAKIHN0YXRpYyB2b2lkIGJmaW5fc2VyaWFsX3Jlc2V0X2lyZGEoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKIHsKLQlpbnQgbGluZSA9IHBvcnQtPmxpbmU7CisJc3RydWN0IGJmaW5fc2VyaWFsX3BvcnQgKnVhcnQgPSAoc3RydWN0IGJmaW5fc2VyaWFsX3BvcnQgKilwb3J0OwogCXVuc2lnbmVkIHNob3J0IHZhbDsKIAotCXZhbCA9IFVBUlRfR0VUX0dDVEwoJmJmaW5fc2VyaWFsX3BvcnRzW2xpbmVdKTsKKwl2YWwgPSBVQVJUX0dFVF9HQ1RMKHVhcnQpOwogCXZhbCAmPSB+KElSRU4gfCBSUE9MQyk7Ci0JVUFSVF9QVVRfR0NUTCgmYmZpbl9zZXJpYWxfcG9ydHNbbGluZV0sIHZhbCk7CisJVUFSVF9QVVRfR0NUTCh1YXJ0LCB2YWwpOwogCVNTWU5DKCk7CiAJdmFsIHw9IChJUkVOIHwgUlBPTEMpOwotCVVBUlRfUFVUX0dDVEwoJmJmaW5fc2VyaWFsX3BvcnRzW2xpbmVdLCB2YWwpOworCVVBUlRfUFVUX0dDVEwodWFydCwgdmFsKTsKIAlTU1lOQygpOwogfQogCkBAIC0xMDcwLDg1ICsxMDY5LDYgQEAKICNlbmRpZgogfTsKIAotc3RhdGljIHZvaWQgX19pbml0IGJmaW5fc2VyaWFsX2h3X2luaXQodm9pZCkKLXsKLSNpZmRlZiBDT05GSUdfU0VSSUFMX0JGSU5fVUFSVDAKLQlwZXJpcGhlcmFsX3JlcXVlc3QoUF9VQVJUMF9UWCwgRFJJVkVSX05BTUUpOwotCXBlcmlwaGVyYWxfcmVxdWVzdChQX1VBUlQwX1JYLCBEUklWRVJfTkFNRSk7Ci0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19TRVJJQUxfQkZJTl9VQVJUMQotCXBlcmlwaGVyYWxfcmVxdWVzdChQX1VBUlQxX1RYLCBEUklWRVJfTkFNRSk7Ci0JcGVyaXBoZXJhbF9yZXF1ZXN0KFBfVUFSVDFfUlgsIERSSVZFUl9OQU1FKTsKLQotIyBpZiBkZWZpbmVkKENPTkZJR19CRklOX1VBUlQxX0NUU1JUUykgJiYgZGVmaW5lZChDT05GSUdfQkY1NHgpCi0JcGVyaXBoZXJhbF9yZXF1ZXN0KFBfVUFSVDFfUlRTLCBEUklWRVJfTkFNRSk7Ci0JcGVyaXBoZXJhbF9yZXF1ZXN0KFBfVUFSVDFfQ1RTLCBEUklWRVJfTkFNRSk7Ci0jIGVuZGlmCi0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19TRVJJQUxfQkZJTl9VQVJUMgotCXBlcmlwaGVyYWxfcmVxdWVzdChQX1VBUlQyX1RYLCBEUklWRVJfTkFNRSk7Ci0JcGVyaXBoZXJhbF9yZXF1ZXN0KFBfVUFSVDJfUlgsIERSSVZFUl9OQU1FKTsKLSNlbmRpZgotCi0jaWZkZWYgQ09ORklHX1NFUklBTF9CRklOX1VBUlQzCi0JcGVyaXBoZXJhbF9yZXF1ZXN0KFBfVUFSVDNfVFgsIERSSVZFUl9OQU1FKTsKLQlwZXJpcGhlcmFsX3JlcXVlc3QoUF9VQVJUM19SWCwgRFJJVkVSX05BTUUpOwotCi0jIGlmIGRlZmluZWQoQ09ORklHX0JGSU5fVUFSVDNfQ1RTUlRTKSAmJiBkZWZpbmVkKENPTkZJR19CRjU0eCkKLQlwZXJpcGhlcmFsX3JlcXVlc3QoUF9VQVJUM19SVFMsIERSSVZFUl9OQU1FKTsKLQlwZXJpcGhlcmFsX3JlcXVlc3QoUF9VQVJUM19DVFMsIERSSVZFUl9OQU1FKTsKLSMgZW5kaWYKLSNlbmRpZgotfQotCi1zdGF0aWMgdm9pZCBfX2luaXQgYmZpbl9zZXJpYWxfaW5pdF9wb3J0cyh2b2lkKQotewotCXN0YXRpYyBpbnQgZmlyc3QgPSAxOwotCWludCBpOwotCi0JaWYgKCFmaXJzdCkKLQkJcmV0dXJuOwotCWZpcnN0ID0gMDsKLQotCWJmaW5fc2VyaWFsX2h3X2luaXQoKTsKLQotCWZvciAoaSA9IDA7IGkgPCBucl9hY3RpdmVfcG9ydHM7IGkrKykgewotCQlzcGluX2xvY2tfaW5pdCgmYmZpbl9zZXJpYWxfcG9ydHNbaV0ucG9ydC5sb2NrKTsKLQkJYmZpbl9zZXJpYWxfcG9ydHNbaV0ucG9ydC51YXJ0Y2xrICAgPSBnZXRfc2NsaygpOwotCQliZmluX3NlcmlhbF9wb3J0c1tpXS5wb3J0LmZpZm9zaXplICA9IEJGSU5fVUFSVF9UWF9GSUZPX1NJWkU7Ci0JCWJmaW5fc2VyaWFsX3BvcnRzW2ldLnBvcnQub3BzICAgICAgID0gJmJmaW5fc2VyaWFsX3BvcHM7Ci0JCWJmaW5fc2VyaWFsX3BvcnRzW2ldLnBvcnQubGluZSAgICAgID0gaTsKLQkJYmZpbl9zZXJpYWxfcG9ydHNbaV0ucG9ydC5pb3R5cGUgICAgPSBVUElPX01FTTsKLQkJYmZpbl9zZXJpYWxfcG9ydHNbaV0ucG9ydC5tZW1iYXNlICAgPQotCQkJKHZvaWQgX19pb21lbSAqKWJmaW5fc2VyaWFsX3Jlc291cmNlW2ldLnVhcnRfYmFzZV9hZGRyOwotCQliZmluX3NlcmlhbF9wb3J0c1tpXS5wb3J0Lm1hcGJhc2UgICA9Ci0JCQliZmluX3NlcmlhbF9yZXNvdXJjZVtpXS51YXJ0X2Jhc2VfYWRkcjsKLQkJYmZpbl9zZXJpYWxfcG9ydHNbaV0ucG9ydC5pcnEgICAgICAgPQotCQkJYmZpbl9zZXJpYWxfcmVzb3VyY2VbaV0udWFydF9pcnE7Ci0JCWJmaW5fc2VyaWFsX3BvcnRzW2ldLnN0YXR1c19pcnEJICAgID0KLQkJCWJmaW5fc2VyaWFsX3Jlc291cmNlW2ldLnVhcnRfc3RhdHVzX2lycTsKLQkJYmZpbl9zZXJpYWxfcG9ydHNbaV0ucG9ydC5mbGFncyAgICAgPSBVUEZfQk9PVF9BVVRPQ09ORjsKLSNpZmRlZiBDT05GSUdfU0VSSUFMX0JGSU5fRE1BCi0JCWJmaW5fc2VyaWFsX3BvcnRzW2ldLnR4X2RvbmUJICAgID0gMTsKLQkJYmZpbl9zZXJpYWxfcG9ydHNbaV0udHhfY291bnQJICAgID0gMDsKLQkJYmZpbl9zZXJpYWxfcG9ydHNbaV0udHhfZG1hX2NoYW5uZWwgPQotCQkJYmZpbl9zZXJpYWxfcmVzb3VyY2VbaV0udWFydF90eF9kbWFfY2hhbm5lbDsKLQkJYmZpbl9zZXJpYWxfcG9ydHNbaV0ucnhfZG1hX2NoYW5uZWwgPQotCQkJYmZpbl9zZXJpYWxfcmVzb3VyY2VbaV0udWFydF9yeF9kbWFfY2hhbm5lbDsKLQkJaW5pdF90aW1lcigmKGJmaW5fc2VyaWFsX3BvcnRzW2ldLnJ4X2RtYV90aW1lcikpOwotI2VuZGlmCi0jaWYgZGVmaW5lZChDT05GSUdfU0VSSUFMX0JGSU5fQ1RTUlRTKSB8fCBcCi0JZGVmaW5lZChDT05GSUdfU0VSSUFMX0JGSU5fSEFSRF9DVFNSVFMpCi0JCWJmaW5fc2VyaWFsX3BvcnRzW2ldLmN0c19waW4JICAgID0KLQkJCWJmaW5fc2VyaWFsX3Jlc291cmNlW2ldLnVhcnRfY3RzX3BpbjsKLQkJYmZpbl9zZXJpYWxfcG9ydHNbaV0ucnRzX3BpbgkgICAgPQotCQkJYmZpbl9zZXJpYWxfcmVzb3VyY2VbaV0udWFydF9ydHNfcGluOwotI2VuZGlmCi0JfQotfQotCiAjaWYgZGVmaW5lZChDT05GSUdfU0VSSUFMX0JGSU5fQ09OU09MRSkgfHwgZGVmaW5lZChDT05GSUdfRUFSTFlfUFJJTlRLKQogLyoKICAqIElmIHRoZSBwb3J0IHdhcyBhbHJlYWR5IGluaXRpYWxpc2VkIChlZywgYnkgYSBib290IGxvYWRlciksCkBAIC0xMTk2LDYgKzExMTYsMzQgQEAKIAogc3RhdGljIHN0cnVjdCB1YXJ0X2RyaXZlciBiZmluX3NlcmlhbF9yZWc7CiAKK3N0YXRpYyB2b2lkIGJmaW5fc2VyaWFsX2NvbnNvbGVfcHV0Y2hhcihzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LCBpbnQgY2gpCit7CisJc3RydWN0IGJmaW5fc2VyaWFsX3BvcnQgKnVhcnQgPSAoc3RydWN0IGJmaW5fc2VyaWFsX3BvcnQgKilwb3J0OworCXdoaWxlICghKFVBUlRfR0VUX0xTUih1YXJ0KSAmIFRIUkUpKQorCQliYXJyaWVyKCk7CisJVUFSVF9QVVRfQ0hBUih1YXJ0LCBjaCk7Cit9CisKKyNlbmRpZiAvKiBkZWZpbmVkIChDT05GSUdfU0VSSUFMX0JGSU5fQ09OU09MRSkgfHwKKwkJIGRlZmluZWQgKENPTkZJR19FQVJMWV9QUklOVEspICovCisKKyNpZmRlZiBDT05GSUdfU0VSSUFMX0JGSU5fQ09OU09MRQorI2RlZmluZSBDTEFTU19CRklOX0NPTlNPTEUJImJmaW4tY29uc29sZSIKKy8qCisgKiBJbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZCBvbiBlbnRlcmluZworICovCitzdGF0aWMgdm9pZAorYmZpbl9zZXJpYWxfY29uc29sZV93cml0ZShzdHJ1Y3QgY29uc29sZSAqY28sIGNvbnN0IGNoYXIgKnMsIHVuc2lnbmVkIGludCBjb3VudCkKK3sKKwlzdHJ1Y3QgYmZpbl9zZXJpYWxfcG9ydCAqdWFydCA9IGJmaW5fc2VyaWFsX3BvcnRzW2NvLT5pbmRleF07CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ1YXJ0LT5wb3J0LmxvY2ssIGZsYWdzKTsKKwl1YXJ0X2NvbnNvbGVfd3JpdGUoJnVhcnQtPnBvcnQsIHMsIGNvdW50LCBiZmluX3NlcmlhbF9jb25zb2xlX3B1dGNoYXIpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnVhcnQtPnBvcnQubG9jaywgZmxhZ3MpOworCit9CisKIHN0YXRpYyBpbnQgX19pbml0CiBiZmluX3NlcmlhbF9jb25zb2xlX3NldHVwKHN0cnVjdCBjb25zb2xlICpjbywgY2hhciAqb3B0aW9ucykKIHsKQEAgLTEyMTUsOSArMTE2MywxMiBAQAogCSAqIGlmIHNvLCBzZWFyY2ggZm9yIHRoZSBmaXJzdCBhdmFpbGFibGUgcG9ydCB0aGF0IGRvZXMgaGF2ZQogCSAqIGNvbnNvbGUgc3VwcG9ydC4KIAkgKi8KLQlpZiAoY28tPmluZGV4ID09IC0xIHx8IGNvLT5pbmRleCA+PSBucl9hY3RpdmVfcG9ydHMpCi0JCWNvLT5pbmRleCA9IDA7Ci0JdWFydCA9ICZiZmluX3NlcmlhbF9wb3J0c1tjby0+aW5kZXhdOworCWlmIChjby0+aW5kZXggPCAwIHx8IGNvLT5pbmRleCA+PSBCRklOX1VBUlRfTlJfUE9SVFMpCisJCXJldHVybiAtRU5PREVWOworCisJdWFydCA9IGJmaW5fc2VyaWFsX3BvcnRzW2NvLT5pbmRleF07CisJaWYgKCF1YXJ0KQorCQlyZXR1cm4gLUVOT0RFVjsKIAogCWlmIChvcHRpb25zKQogCQl1YXJ0X3BhcnNlX29wdGlvbnMob3B0aW9ucywgJmJhdWQsICZwYXJpdHksICZiaXRzLCAmZmxvdyk7CkBAIC0xMjI2LDM2ICsxMTc3LDkgQEAKIAogCXJldHVybiB1YXJ0X3NldF9vcHRpb25zKCZ1YXJ0LT5wb3J0LCBjbywgYmF1ZCwgcGFyaXR5LCBiaXRzLCBmbG93KTsKIH0KLSNlbmRpZiAvKiBkZWZpbmVkIChDT05GSUdfU0VSSUFMX0JGSU5fQ09OU09MRSkgfHwKLQkJCQkgZGVmaW5lZCAoQ09ORklHX0VBUkxZX1BSSU5USykgKi8KLQotI2lmZGVmIENPTkZJR19TRVJJQUxfQkZJTl9DT05TT0xFCi1zdGF0aWMgdm9pZCBiZmluX3NlcmlhbF9jb25zb2xlX3B1dGNoYXIoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwgaW50IGNoKQotewotCXN0cnVjdCBiZmluX3NlcmlhbF9wb3J0ICp1YXJ0ID0gKHN0cnVjdCBiZmluX3NlcmlhbF9wb3J0ICopcG9ydDsKLQl3aGlsZSAoIShVQVJUX0dFVF9MU1IodWFydCkgJiBUSFJFKSkKLQkJYmFycmllcigpOwotCVVBUlRfUFVUX0NIQVIodWFydCwgY2gpOwotCVNTWU5DKCk7Ci19Ci0KLS8qCi0gKiBJbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZCBvbiBlbnRlcmluZwotICovCi1zdGF0aWMgdm9pZAotYmZpbl9zZXJpYWxfY29uc29sZV93cml0ZShzdHJ1Y3QgY29uc29sZSAqY28sIGNvbnN0IGNoYXIgKnMsIHVuc2lnbmVkIGludCBjb3VudCkKLXsKLQlzdHJ1Y3QgYmZpbl9zZXJpYWxfcG9ydCAqdWFydCA9ICZiZmluX3NlcmlhbF9wb3J0c1tjby0+aW5kZXhdOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmdWFydC0+cG9ydC5sb2NrLCBmbGFncyk7Ci0JdWFydF9jb25zb2xlX3dyaXRlKCZ1YXJ0LT5wb3J0LCBzLCBjb3VudCwgYmZpbl9zZXJpYWxfY29uc29sZV9wdXRjaGFyKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ1YXJ0LT5wb3J0LmxvY2ssIGZsYWdzKTsKLQotfQogCiBzdGF0aWMgc3RydWN0IGNvbnNvbGUgYmZpbl9zZXJpYWxfY29uc29sZSA9IHsKLQkubmFtZQkJPSBCRklOX1NFUklBTF9OQU1FLAorCS5uYW1lCQk9IEJGSU5fU0VSSUFMX0RFVl9OQU1FLAogCS53cml0ZQkJPSBiZmluX3NlcmlhbF9jb25zb2xlX3dyaXRlLAogCS5kZXZpY2UJCT0gdWFydF9jb25zb2xlX2RldmljZSwKIAkuc2V0dXAJCT0gYmZpbl9zZXJpYWxfY29uc29sZV9zZXR1cCwKQEAgLTEyNjMsNDQgKzExODcsMzAgQEAKIAkuaW5kZXgJCT0gLTEsCiAJLmRhdGEJCT0gJmJmaW5fc2VyaWFsX3JlZywKIH07Ci0KLXN0YXRpYyBpbnQgX19pbml0IGJmaW5fc2VyaWFsX3JzX2NvbnNvbGVfaW5pdCh2b2lkKQotewotCWJmaW5fc2VyaWFsX2luaXRfcG9ydHMoKTsKLQlyZWdpc3Rlcl9jb25zb2xlKCZiZmluX3NlcmlhbF9jb25zb2xlKTsKLQotCXJldHVybiAwOwotfQotY29uc29sZV9pbml0Y2FsbChiZmluX3NlcmlhbF9yc19jb25zb2xlX2luaXQpOwotCiAjZGVmaW5lIEJGSU5fU0VSSUFMX0NPTlNPTEUJJmJmaW5fc2VyaWFsX2NvbnNvbGUKICNlbHNlCiAjZGVmaW5lIEJGSU5fU0VSSUFMX0NPTlNPTEUJTlVMTAogI2VuZGlmIC8qIENPTkZJR19TRVJJQUxfQkZJTl9DT05TT0xFICovCiAKKyNpZmRlZglDT05GSUdfRUFSTFlfUFJJTlRLCitzdGF0aWMgc3RydWN0IGJmaW5fc2VyaWFsX3BvcnQgYmZpbl9lYXJseXByaW50a19wb3J0OworI2RlZmluZSBDTEFTU19CRklOX0VBUkxZUFJJTlRLCSJiZmluLWVhcmx5cHJpbnRrIgogCi0jaWZkZWYgQ09ORklHX0VBUkxZX1BSSU5USwotc3RhdGljIF9faW5pdCB2b2lkIGVhcmx5X3NlcmlhbF9wdXRjKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsIGludCBjaCkKKy8qCisgKiBJbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZCBvbiBlbnRlcmluZworICovCitzdGF0aWMgdm9pZAorYmZpbl9lYXJseXByaW50a19jb25zb2xlX3dyaXRlKHN0cnVjdCBjb25zb2xlICpjbywgY29uc3QgY2hhciAqcywgdW5zaWduZWQgaW50IGNvdW50KQogewotCXVuc2lnbmVkIHRpbWVvdXQgPSAweGZmZmY7Ci0Jc3RydWN0IGJmaW5fc2VyaWFsX3BvcnQgKnVhcnQgPSAoc3RydWN0IGJmaW5fc2VyaWFsX3BvcnQgKilwb3J0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQl3aGlsZSAoKCEoVUFSVF9HRVRfTFNSKHVhcnQpICYgVEhSRSkpICYmIC0tdGltZW91dCkKLQkJY3B1X3JlbGF4KCk7Ci0JVUFSVF9QVVRfQ0hBUih1YXJ0LCBjaCk7Ci19CisJaWYgKGJmaW5fZWFybHlwcmludGtfcG9ydC5wb3J0LmxpbmUgIT0gY28tPmluZGV4KQorCQlyZXR1cm47CiAKLXN0YXRpYyBfX2luaXQgdm9pZCBlYXJseV9zZXJpYWxfd3JpdGUoc3RydWN0IGNvbnNvbGUgKmNvbiwgY29uc3QgY2hhciAqcywKLQkJCQkJdW5zaWduZWQgaW50IG4pCi17Ci0Jc3RydWN0IGJmaW5fc2VyaWFsX3BvcnQgKnVhcnQgPSAmYmZpbl9zZXJpYWxfcG9ydHNbY29uLT5pbmRleF07Ci0JdW5zaWduZWQgaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrLCBzKyspIHsKLQkJaWYgKCpzID09ICdcbicpCi0JCQllYXJseV9zZXJpYWxfcHV0YygmdWFydC0+cG9ydCwgJ1xyJyk7Ci0JCWVhcmx5X3NlcmlhbF9wdXRjKCZ1YXJ0LT5wb3J0LCAqcyk7Ci0JfQorCXNwaW5fbG9ja19pcnFzYXZlKCZiZmluX2Vhcmx5cHJpbnRrX3BvcnQucG9ydC5sb2NrLCBmbGFncyk7CisJdWFydF9jb25zb2xlX3dyaXRlKCZiZmluX2Vhcmx5cHJpbnRrX3BvcnQucG9ydCwgcywgY291bnQsCisJCWJmaW5fc2VyaWFsX2NvbnNvbGVfcHV0Y2hhcik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmZpbl9lYXJseXByaW50a19wb3J0LnBvcnQubG9jaywgZmxhZ3MpOwogfQogCiAvKgpAQCAtMTMxMSwxOCArMTIyMSwzMjYgQEAKICAqLwogc3RhdGljIHN0cnVjdCBfX2luaXRkYXRhIGNvbnNvbGUgYmZpbl9lYXJseV9zZXJpYWxfY29uc29sZSA9IHsKIAkubmFtZSA9ICJlYXJseV9CRnVhcnQiLAotCS53cml0ZSA9IGVhcmx5X3NlcmlhbF93cml0ZSwKKwkud3JpdGUgPSBiZmluX2Vhcmx5cHJpbnRrX2NvbnNvbGVfd3JpdGUsCiAJLmRldmljZSA9IHVhcnRfY29uc29sZV9kZXZpY2UsCiAJLmZsYWdzID0gQ09OX1BSSU5UQlVGRkVSLAogCS5pbmRleCA9IC0xLAogCS5kYXRhICA9ICZiZmluX3NlcmlhbF9yZWcsCiB9OworI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3QgdWFydF9kcml2ZXIgYmZpbl9zZXJpYWxfcmVnID0geworCS5vd25lcgkJCT0gVEhJU19NT0RVTEUsCisJLmRyaXZlcl9uYW1lCQk9IERSSVZFUl9OQU1FLAorCS5kZXZfbmFtZQkJPSBCRklOX1NFUklBTF9ERVZfTkFNRSwKKwkubWFqb3IJCQk9IEJGSU5fU0VSSUFMX01BSk9SLAorCS5taW5vcgkJCT0gQkZJTl9TRVJJQUxfTUlOT1IsCisJLm5yCQkJPSBCRklOX1VBUlRfTlJfUE9SVFMsCisJLmNvbnMJCQk9IEJGSU5fU0VSSUFMX0NPTlNPTEUsCit9OworCitzdGF0aWMgaW50IGJmaW5fc2VyaWFsX3N1c3BlbmQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQoreworCXN0cnVjdCBiZmluX3NlcmlhbF9wb3J0ICp1YXJ0ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwlyZXR1cm4gdWFydF9zdXNwZW5kX3BvcnQoJmJmaW5fc2VyaWFsX3JlZywgJnVhcnQtPnBvcnQpOworfQorCitzdGF0aWMgaW50IGJmaW5fc2VyaWFsX3Jlc3VtZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBiZmluX3NlcmlhbF9wb3J0ICp1YXJ0ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwlyZXR1cm4gdWFydF9yZXN1bWVfcG9ydCgmYmZpbl9zZXJpYWxfcmVnLCAmdWFydC0+cG9ydCk7Cit9CisKK3N0YXRpYyBpbnQgYmZpbl9zZXJpYWxfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKwlzdHJ1Y3QgYmZpbl9zZXJpYWxfcG9ydCAqdWFydCA9IE5VTEw7CisJaW50IHJldCA9IDA7CisKKwlpZiAocGRldi0+aWQgPCAwIHx8IHBkZXYtPmlkID49IEJGSU5fVUFSVF9OUl9QT1JUUykgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJXcm9uZyBiZmluIHVhcnQgcGxhdGZvcm0gZGV2aWNlIGlkLlxuIik7CisJCXJldHVybiAtRU5PRU5UOworCX0KKworCWlmIChiZmluX3NlcmlhbF9wb3J0c1twZGV2LT5pZF0gPT0gTlVMTCkgeworCisJCXVhcnQgPSBremFsbG9jKHNpemVvZigqdWFydCksIEdGUF9LRVJORUwpOworCQlpZiAoIXVhcnQpIHsKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwKKwkJCQkiZmFpbCB0byBtYWxsb2MgYmZpbl9zZXJpYWxfcG9ydFxuIik7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCQliZmluX3NlcmlhbF9wb3J0c1twZGV2LT5pZF0gPSB1YXJ0OworCisjaWZkZWYgQ09ORklHX0VBUkxZX1BSSU5USworCQlpZiAoIShiZmluX2Vhcmx5cHJpbnRrX3BvcnQucG9ydC5tZW1iYXNlCisJCQkmJiBiZmluX2Vhcmx5cHJpbnRrX3BvcnQucG9ydC5saW5lID09IHBkZXYtPmlkKSkgeworCQkJLyoKKwkJCSAqIElmIHRoZSBwZXJpcGhlcmFsIFBJTnMgb2YgY3VycmVudCBwb3J0IGlzIGFsbG9jYXRlZAorCQkJICogaW4gZWFybHlwcmludGsgcHJvYmUgc3RhZ2UsIGRvbid0IGRvIGl0IGFnYWluLgorCQkJICovCisjZW5kaWYKKwkJcmV0ID0gcGVyaXBoZXJhbF9yZXF1ZXN0X2xpc3QoCisJCQkodW5zaWduZWQgc2hvcnQgKilwZGV2LT5kZXYucGxhdGZvcm1fZGF0YSwgRFJJVkVSX05BTUUpOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsCisJCQkJImZhaWwgdG8gcmVxdWVzdCBiZmluIHNlcmlhbCBwZXJpcGhlcmFsc1xuIik7CisJCQlnb3RvIG91dF9lcnJvcl9mcmVlX21lbTsKKwkJfQorI2lmZGVmIENPTkZJR19FQVJMWV9QUklOVEsKKwkJfQorI2VuZGlmCisKKwkJc3Bpbl9sb2NrX2luaXQoJnVhcnQtPnBvcnQubG9jayk7CisJCXVhcnQtPnBvcnQudWFydGNsayAgID0gZ2V0X3NjbGsoKTsKKwkJdWFydC0+cG9ydC5maWZvc2l6ZSAgPSBCRklOX1VBUlRfVFhfRklGT19TSVpFOworCQl1YXJ0LT5wb3J0Lm9wcyAgICAgICA9ICZiZmluX3NlcmlhbF9wb3BzOworCQl1YXJ0LT5wb3J0LmxpbmUgICAgICA9IHBkZXYtPmlkOworCQl1YXJ0LT5wb3J0LmlvdHlwZSAgICA9IFVQSU9fTUVNOworCQl1YXJ0LT5wb3J0LmZsYWdzICAgICA9IFVQRl9CT09UX0FVVE9DT05GOworCisJCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJCWlmIChyZXMgPT0gTlVMTCkgeworCQkJZGV2X2VycigmcGRldi0+ZGV2LCAiQ2Fubm90IGdldCBJT1JFU09VUkNFX01FTVxuIik7CisJCQlyZXQgPSAtRU5PRU5UOworCQkJZ290byBvdXRfZXJyb3JfZnJlZV9wZXJpcGhlcmFsczsKKwkJfQorCisJCXVhcnQtPnBvcnQubWVtYmFzZSA9IGlvcmVtYXAocmVzLT5zdGFydCwKKwkJCXJlcy0+ZW5kIC0gcmVzLT5zdGFydCk7CisJCWlmICghdWFydC0+cG9ydC5tZW1iYXNlKSB7CisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJDYW5ub3QgbWFwIHVhcnQgSU9cbiIpOworCQkJcmV0ID0gLUVOWElPOworCQkJZ290byBvdXRfZXJyb3JfZnJlZV9wZXJpcGhlcmFsczsKKwkJfQorCQl1YXJ0LT5wb3J0Lm1hcGJhc2UgPSByZXMtPnN0YXJ0OworCisJCXVhcnQtPnBvcnQuaXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKKwkJaWYgKHVhcnQtPnBvcnQuaXJxIDwgMCkgeworCQkJZGV2X2VycigmcGRldi0+ZGV2LCAiTm8gdWFydCBSWC9UWCBJUlEgc3BlY2lmaWVkXG4iKTsKKwkJCXJldCA9IC1FTk9FTlQ7CisJCQlnb3RvIG91dF9lcnJvcl91bm1hcDsKKwkJfQorCisJCXVhcnQtPnN0YXR1c19pcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDEpOworCQlpZiAodWFydC0+c3RhdHVzX2lycSA8IDApIHsKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwgIk5vIHVhcnQgc3RhdHVzIElSUSBzcGVjaWZpZWRcbiIpOworCQkJcmV0ID0gLUVOT0VOVDsKKwkJCWdvdG8gb3V0X2Vycm9yX3VubWFwOworCQl9CisKKyNpZmRlZiBDT05GSUdfU0VSSUFMX0JGSU5fRE1BCisJCXVhcnQtPnR4X2RvbmUJICAgID0gMTsKKwkJdWFydC0+dHhfY291bnQJICAgID0gMDsKKworCQlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9ETUEsIDApOworCQlpZiAocmVzID09IE5VTEwpIHsKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwgIk5vIHVhcnQgVFggRE1BIGNoYW5uZWwgc3BlY2lmaWVkXG4iKTsKKwkJCXJldCA9IC1FTk9FTlQ7CisJCQlnb3RvIG91dF9lcnJvcl91bm1hcDsKKwkJfQorCQl1YXJ0LT50eF9kbWFfY2hhbm5lbCA9IHJlcy0+c3RhcnQ7CisKKwkJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfRE1BLCAxKTsKKwkJaWYgKHJlcyA9PSBOVUxMKSB7CisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJObyB1YXJ0IFJYIERNQSBjaGFubmVsIHNwZWNpZmllZFxuIik7CisJCQlyZXQgPSAtRU5PRU5UOworCQkJZ290byBvdXRfZXJyb3JfdW5tYXA7CisJCX0KKwkJdWFydC0+cnhfZG1hX2NoYW5uZWwgPSByZXMtPnN0YXJ0OworCisJCWluaXRfdGltZXIoJih1YXJ0LT5yeF9kbWFfdGltZXIpKTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfU0VSSUFMX0JGSU5fQ1RTUlRTKSB8fCBcCisJZGVmaW5lZChDT05GSUdfU0VSSUFMX0JGSU5fSEFSRF9DVFNSVFMpCisJCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX0lPLCAwKTsKKwkJaWYgKHJlcyA9PSBOVUxMKQorCQkJdWFydC0+Y3RzX3BpbiA9IC0xOworCQllbHNlCisJCQl1YXJ0LT5jdHNfcGluID0gcmVzLT5zdGFydDsKKworCQlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9JTywgMSk7CisJCWlmIChyZXMgPT0gTlVMTCkKKwkJCXVhcnQtPnJ0c19waW4gPSAtMTsKKwkJZWxzZQorCQkJdWFydC0+cnRzX3BpbiA9IHJlcy0+c3RhcnQ7CisjIGlmIGRlZmluZWQoQ09ORklHX1NFUklBTF9CRklOX0NUU1JUUykKKwkJaWYgKHVhcnQtPnJ0c19waW4gPj0gMCkKKwkJCWdwaW9fcmVxdWVzdCh1YXJ0LT5ydHNfcGluLCBEUklWRVJfTkFNRSk7CisjIGVuZGlmCisjZW5kaWYKKwl9CisKKyNpZmRlZiBDT05GSUdfU0VSSUFMX0JGSU5fQ09OU09MRQorCWlmICghaXNfZWFybHlfcGxhdGZvcm1fZGV2aWNlKHBkZXYpKSB7CisjZW5kaWYKKwkJdWFydCA9IGJmaW5fc2VyaWFsX3BvcnRzW3BkZXYtPmlkXTsKKwkJdWFydC0+cG9ydC5kZXYgPSAmcGRldi0+ZGV2OworCQlkZXZfc2V0X2RydmRhdGEoJnBkZXYtPmRldiwgdWFydCk7CisJCXJldCA9IHVhcnRfYWRkX29uZV9wb3J0KCZiZmluX3NlcmlhbF9yZWcsICZ1YXJ0LT5wb3J0KTsKKyNpZmRlZiBDT05GSUdfU0VSSUFMX0JGSU5fQ09OU09MRQorCX0KKyNlbmRpZgorCisJaWYgKCFyZXQpCisJCXJldHVybiAwOworCisJaWYgKHVhcnQpIHsKK291dF9lcnJvcl91bm1hcDoKKwkJaW91bm1hcCh1YXJ0LT5wb3J0Lm1lbWJhc2UpOworb3V0X2Vycm9yX2ZyZWVfcGVyaXBoZXJhbHM6CisJCXBlcmlwaGVyYWxfZnJlZV9saXN0KAorCQkJKHVuc2lnbmVkIHNob3J0ICopcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGEpOworb3V0X2Vycm9yX2ZyZWVfbWVtOgorCQlrZnJlZSh1YXJ0KTsKKwkJYmZpbl9zZXJpYWxfcG9ydHNbcGRldi0+aWRdID0gTlVMTDsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBiZmluX3NlcmlhbF9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgYmZpbl9zZXJpYWxfcG9ydCAqdWFydCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCisJZGV2X3NldF9kcnZkYXRhKCZwZGV2LT5kZXYsIE5VTEwpOworCisJaWYgKHVhcnQpIHsKKwkJdWFydF9yZW1vdmVfb25lX3BvcnQoJmJmaW5fc2VyaWFsX3JlZywgJnVhcnQtPnBvcnQpOworI2lmZGVmIENPTkZJR19TRVJJQUxfQkZJTl9DVFNSVFMKKwkJaWYgKHVhcnQtPnJ0c19waW4gPj0gMCkKKwkJCWdwaW9fZnJlZSh1YXJ0LT5ydHNfcGluKTsKKyNlbmRpZgorCQlpb3VubWFwKHVhcnQtPnBvcnQubWVtYmFzZSk7CisJCXBlcmlwaGVyYWxfZnJlZV9saXN0KAorCQkJKHVuc2lnbmVkIHNob3J0ICopcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGEpOworCQlrZnJlZSh1YXJ0KTsKKwkJYmZpbl9zZXJpYWxfcG9ydHNbcGRldi0+aWRdID0gTlVMTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgYmZpbl9zZXJpYWxfZHJpdmVyID0geworCS5wcm9iZQkJPSBiZmluX3NlcmlhbF9wcm9iZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKGJmaW5fc2VyaWFsX3JlbW92ZSksCisJLnN1c3BlbmQJPSBiZmluX3NlcmlhbF9zdXNwZW5kLAorCS5yZXN1bWUJCT0gYmZpbl9zZXJpYWxfcmVzdW1lLAorCS5kcml2ZXIJCT0geworCQkubmFtZQk9IERSSVZFUl9OQU1FLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwl9LAorfTsKKworI2lmIGRlZmluZWQoQ09ORklHX1NFUklBTF9CRklOX0NPTlNPTEUpCitzdGF0aWMgX19pbml0ZGF0YSBzdHJ1Y3QgZWFybHlfcGxhdGZvcm1fZHJpdmVyIGVhcmx5X2JmaW5fc2VyaWFsX2RyaXZlciA9IHsKKwkuY2xhc3Nfc3RyID0gQ0xBU1NfQkZJTl9DT05TT0xFLAorCS5wZHJ2ID0gJmJmaW5fc2VyaWFsX2RyaXZlciwKKwkucmVxdWVzdGVkX2lkID0gRUFSTFlfUExBVEZPUk1fSURfVU5TRVQsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBiZmluX3NlcmlhbF9yc19jb25zb2xlX2luaXQodm9pZCkKK3sKKwllYXJseV9wbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmVhcmx5X2JmaW5fc2VyaWFsX2RyaXZlciwgRFJJVkVSX05BTUUpOworCisJZWFybHlfcGxhdGZvcm1fZHJpdmVyX3Byb2JlKENMQVNTX0JGSU5fQ09OU09MRSwgQkZJTl9VQVJUX05SX1BPUlRTLCAwKTsKKworCXJlZ2lzdGVyX2NvbnNvbGUoJmJmaW5fc2VyaWFsX2NvbnNvbGUpOworCisJcmV0dXJuIDA7Cit9Citjb25zb2xlX2luaXRjYWxsKGJmaW5fc2VyaWFsX3JzX2NvbnNvbGVfaW5pdCk7CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19FQVJMWV9QUklOVEsKKy8qCisgKiBNZW1vcnkgY2FuJ3QgYmUgYWxsb2NhdGVkIGR5bmFtaWNhbGx5IGR1cmluZyBlYXJseXByaW5rIGluaXQgc3RhZ2UuCisgKiBTbywgZG8gaW5kaXZpZHVhbCBwcm9iZSBmb3IgZWFybHlwcmluayB3aXRoIGEgc3RhdGljIHVhcnQgcG9ydCB2YXJpYWJsZS4KKyAqLworc3RhdGljIGludCBiZmluX2Vhcmx5cHJpbnRrX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHJlc291cmNlICpyZXM7CisJaW50IHJldDsKKworCWlmIChwZGV2LT5pZCA8IDAgfHwgcGRldi0+aWQgPj0gQkZJTl9VQVJUX05SX1BPUlRTKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIldyb25nIGVhcmx5cHJpbnRrIHBsYXRmb3JtIGRldmljZSBpZC5cbiIpOworCQlyZXR1cm4gLUVOT0VOVDsKKwl9CisKKwlyZXQgPSBwZXJpcGhlcmFsX3JlcXVlc3RfbGlzdCgKKwkJKHVuc2lnbmVkIHNob3J0ICopcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGEsIERSSVZFUl9OQU1FKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwKKwkJCQkiZmFpbCB0byByZXF1ZXN0IGJmaW4gc2VyaWFsIHBlcmlwaGVyYWxzXG4iKTsKKwkJCXJldHVybiByZXQ7CisJfQorCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlpZiAocmVzID09IE5VTEwpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiQ2Fubm90IGdldCBJT1JFU09VUkNFX01FTVxuIik7CisJCXJldCA9IC1FTk9FTlQ7CisJCWdvdG8gb3V0X2Vycm9yX2ZyZWVfcGVyaXBoZXJhbHM7CisJfQorCisJYmZpbl9lYXJseXByaW50a19wb3J0LnBvcnQubWVtYmFzZSA9IGlvcmVtYXAocmVzLT5zdGFydCwKKwkJCXJlcy0+ZW5kIC0gcmVzLT5zdGFydCk7CisJaWYgKCFiZmluX2Vhcmx5cHJpbnRrX3BvcnQucG9ydC5tZW1iYXNlKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkNhbm5vdCBtYXAgdWFydCBJT1xuIik7CisJCXJldCA9IC1FTlhJTzsKKwkJZ290byBvdXRfZXJyb3JfZnJlZV9wZXJpcGhlcmFsczsKKwl9CisJYmZpbl9lYXJseXByaW50a19wb3J0LnBvcnQubWFwYmFzZSA9IHJlcy0+c3RhcnQ7CisJYmZpbl9lYXJseXByaW50a19wb3J0LnBvcnQubGluZSA9IHBkZXYtPmlkOworCWJmaW5fZWFybHlwcmludGtfcG9ydC5wb3J0LnVhcnRjbGsgPSBnZXRfc2NsaygpOworCWJmaW5fZWFybHlwcmludGtfcG9ydC5wb3J0LmZpZm9zaXplICA9IEJGSU5fVUFSVF9UWF9GSUZPX1NJWkU7CisJc3Bpbl9sb2NrX2luaXQoJmJmaW5fZWFybHlwcmludGtfcG9ydC5wb3J0LmxvY2spOworCisJcmV0dXJuIDA7CisKK291dF9lcnJvcl9mcmVlX3BlcmlwaGVyYWxzOgorCXBlcmlwaGVyYWxfZnJlZV9saXN0KAorCQkodW5zaWduZWQgc2hvcnQgKilwZGV2LT5kZXYucGxhdGZvcm1fZGF0YSk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBiZmluX2Vhcmx5cHJpbnRrX2RyaXZlciA9IHsKKwkucHJvYmUJCT0gYmZpbl9lYXJseXByaW50a19wcm9iZSwKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJPSBEUklWRVJfTkFNRSwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJfSwKK307CisKK3N0YXRpYyBfX2luaXRkYXRhIHN0cnVjdCBlYXJseV9wbGF0Zm9ybV9kcml2ZXIgZWFybHlfYmZpbl9lYXJseXByaW50a19kcml2ZXIgPSB7CisJLmNsYXNzX3N0ciA9IENMQVNTX0JGSU5fRUFSTFlQUklOVEssCisJLnBkcnYgPSAmYmZpbl9lYXJseXByaW50a19kcml2ZXIsCisJLnJlcXVlc3RlZF9pZCA9IEVBUkxZX1BMQVRGT1JNX0lEX1VOU0VULAorfTsKIAogc3RydWN0IGNvbnNvbGUgX19pbml0ICpiZmluX2Vhcmx5c2VyaWFsX2luaXQodW5zaWduZWQgaW50IHBvcnQsCiAJCQkJCQl1bnNpZ25lZCBpbnQgY2ZsYWcpCiB7Ci0Jc3RydWN0IGJmaW5fc2VyaWFsX3BvcnQgKnVhcnQ7CiAJc3RydWN0IGt0ZXJtaW9zIHQ7CisJY2hhciBwb3J0X25hbWVbMjBdOworCisJaWYgKHBvcnQgPCAwIHx8IHBvcnQgPj0gQkZJTl9VQVJUX05SX1BPUlRTKQorCQlyZXR1cm4gTlVMTDsKKworCS8qCisJICogT25seSBwcm9iZSByZXNvdXJjZSBvZiB0aGUgZ2l2ZW4gcG9ydCBpbiBlYXJseXByaW50ayBib290IGFyZy4KKwkgKiBUaGUgZXhwZWN0ZWQgcG9ydCBpZCBzaG91bGQgYmUgaW5kaWNhdGVkIGluIHBvcnQgbmFtZSBzdHJpbmcuCisJICovCisJc25wcmludGYocG9ydF9uYW1lLCAyMCwgRFJJVkVSX05BTUUgIi4lZCIsIHBvcnQpOworCWVhcmx5X3BsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmZWFybHlfYmZpbl9lYXJseXByaW50a19kcml2ZXIsCisJCXBvcnRfbmFtZSk7CisJZWFybHlfcGxhdGZvcm1fZHJpdmVyX3Byb2JlKENMQVNTX0JGSU5fRUFSTFlQUklOVEssIDEsIDApOworCisJaWYgKCFiZmluX2Vhcmx5cHJpbnRrX3BvcnQucG9ydC5tZW1iYXNlKQorCQlyZXR1cm4gTlVMTDsKIAogI2lmZGVmIENPTkZJR19TRVJJQUxfQkZJTl9DT05TT0xFCiAJLyoKQEAgLTEzMzIsMTI0ICsxNTUwLDM2IEBACiAJYmZpbl9zZXJpYWxfY29uc29sZS5mbGFncyAmPSB+Q09OX1BSSU5UQlVGRkVSOwogI2VuZGlmCiAKLQlpZiAocG9ydCA9PSAtMSB8fCBwb3J0ID49IG5yX2FjdGl2ZV9wb3J0cykKLQkJcG9ydCA9IDA7Ci0JYmZpbl9zZXJpYWxfaW5pdF9wb3J0cygpOwogCWJmaW5fZWFybHlfc2VyaWFsX2NvbnNvbGUuaW5kZXggPSBwb3J0OwotCXVhcnQgPSAmYmZpbl9zZXJpYWxfcG9ydHNbcG9ydF07CiAJdC5jX2NmbGFnID0gY2ZsYWc7CiAJdC5jX2lmbGFnID0gMDsKIAl0LmNfb2ZsYWcgPSAwOwogCXQuY19sZmxhZyA9IElDQU5PTjsKIAl0LmNfbGluZSA9IHBvcnQ7Ci0JYmZpbl9zZXJpYWxfc2V0X3Rlcm1pb3MoJnVhcnQtPnBvcnQsICZ0LCAmdCk7CisJYmZpbl9zZXJpYWxfc2V0X3Rlcm1pb3MoJmJmaW5fZWFybHlwcmludGtfcG9ydC5wb3J0LCAmdCwgJnQpOworCiAJcmV0dXJuICZiZmluX2Vhcmx5X3NlcmlhbF9jb25zb2xlOwogfQotCiAjZW5kaWYgLyogQ09ORklHX0VBUkxZX1BSSU5USyAqLwogCi1zdGF0aWMgc3RydWN0IHVhcnRfZHJpdmVyIGJmaW5fc2VyaWFsX3JlZyA9IHsKLQkub3duZXIJCQk9IFRISVNfTU9EVUxFLAotCS5kcml2ZXJfbmFtZQkJPSAiYmZpbi11YXJ0IiwKLQkuZGV2X25hbWUJCT0gQkZJTl9TRVJJQUxfTkFNRSwKLQkubWFqb3IJCQk9IEJGSU5fU0VSSUFMX01BSk9SLAotCS5taW5vcgkJCT0gQkZJTl9TRVJJQUxfTUlOT1IsCi0JLm5yCQkJPSBCRklOX1VBUlRfTlJfUE9SVFMsCi0JLmNvbnMJCQk9IEJGSU5fU0VSSUFMX0NPTlNPTEUsCi19OwotCi1zdGF0aWMgaW50IGJmaW5fc2VyaWFsX3N1c3BlbmQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCi17Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgbnJfYWN0aXZlX3BvcnRzOyBpKyspIHsKLQkJaWYgKGJmaW5fc2VyaWFsX3BvcnRzW2ldLnBvcnQuZGV2ICE9ICZkZXYtPmRldikKLQkJCWNvbnRpbnVlOwotCQl1YXJ0X3N1c3BlbmRfcG9ydCgmYmZpbl9zZXJpYWxfcmVnLCAmYmZpbl9zZXJpYWxfcG9ydHNbaV0ucG9ydCk7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgYmZpbl9zZXJpYWxfcmVzdW1lKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKLXsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBucl9hY3RpdmVfcG9ydHM7IGkrKykgewotCQlpZiAoYmZpbl9zZXJpYWxfcG9ydHNbaV0ucG9ydC5kZXYgIT0gJmRldi0+ZGV2KQotCQkJY29udGludWU7Ci0JCXVhcnRfcmVzdW1lX3BvcnQoJmJmaW5fc2VyaWFsX3JlZywgJmJmaW5fc2VyaWFsX3BvcnRzW2ldLnBvcnQpOwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGJmaW5fc2VyaWFsX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgcmVzb3VyY2UgKnJlcyA9IGRldi0+cmVzb3VyY2U7Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgZGV2LT5udW1fcmVzb3VyY2VzOyBpKyssIHJlcysrKQotCQlpZiAocmVzLT5mbGFncyAmIElPUkVTT1VSQ0VfTUVNKQotCQkJYnJlYWs7Ci0KLQlpZiAoaSA8IGRldi0+bnVtX3Jlc291cmNlcykgewotCQlmb3IgKGkgPSAwOyBpIDwgbnJfYWN0aXZlX3BvcnRzOyBpKyssIHJlcysrKSB7Ci0JCQlpZiAoYmZpbl9zZXJpYWxfcG9ydHNbaV0ucG9ydC5tYXBiYXNlICE9IHJlcy0+c3RhcnQpCi0JCQkJY29udGludWU7Ci0JCQliZmluX3NlcmlhbF9wb3J0c1tpXS5wb3J0LmRldiA9ICZkZXYtPmRldjsKLQkJCXVhcnRfYWRkX29uZV9wb3J0KCZiZmluX3NlcmlhbF9yZWcsICZiZmluX3NlcmlhbF9wb3J0c1tpXS5wb3J0KTsKLQkJfQotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGJmaW5fc2VyaWFsX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCi17Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgbnJfYWN0aXZlX3BvcnRzOyBpKyspIHsKLQkJaWYgKGJmaW5fc2VyaWFsX3BvcnRzW2ldLnBvcnQuZGV2ICE9ICZkZXYtPmRldikKLQkJCWNvbnRpbnVlOwotCQl1YXJ0X3JlbW92ZV9vbmVfcG9ydCgmYmZpbl9zZXJpYWxfcmVnLCAmYmZpbl9zZXJpYWxfcG9ydHNbaV0ucG9ydCk7Ci0JCWJmaW5fc2VyaWFsX3BvcnRzW2ldLnBvcnQuZGV2ID0gTlVMTDsKLSNpZiBkZWZpbmVkKENPTkZJR19TRVJJQUxfQkZJTl9DVFNSVFMpCi0JCWdwaW9fZnJlZShiZmluX3NlcmlhbF9wb3J0c1tpXS5jdHNfcGluKTsKLQkJZ3Bpb19mcmVlKGJmaW5fc2VyaWFsX3BvcnRzW2ldLnJ0c19waW4pOwotI2VuZGlmCi0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGJmaW5fc2VyaWFsX2RyaXZlciA9IHsKLQkucHJvYmUJCT0gYmZpbl9zZXJpYWxfcHJvYmUsCi0JLnJlbW92ZQkJPSBiZmluX3NlcmlhbF9yZW1vdmUsCi0JLnN1c3BlbmQJPSBiZmluX3NlcmlhbF9zdXNwZW5kLAotCS5yZXN1bWUJCT0gYmZpbl9zZXJpYWxfcmVzdW1lLAotCS5kcml2ZXIJCT0gewotCQkubmFtZQk9ICJiZmluLXVhcnQiLAotCQkub3duZXIJPSBUSElTX01PRFVMRSwKLQl9LAotfTsKLQogc3RhdGljIGludCBfX2luaXQgYmZpbl9zZXJpYWxfaW5pdCh2b2lkKQogewogCWludCByZXQ7CiAKLQlwcl9pbmZvKCJTZXJpYWw6IEJsYWNrZmluIHNlcmlhbCBkcml2ZXJcbiIpOwotCi0JYmZpbl9zZXJpYWxfaW5pdF9wb3J0cygpOworCXByX2luZm8oIkJsYWNrZmluIHNlcmlhbCBkcml2ZXJcbiIpOwogCiAJcmV0ID0gdWFydF9yZWdpc3Rlcl9kcml2ZXIoJmJmaW5fc2VyaWFsX3JlZyk7Ci0JaWYgKHJldCA9PSAwKSB7Ci0JCXJldCA9IHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmYmZpbl9zZXJpYWxfZHJpdmVyKTsKLQkJaWYgKHJldCkgewotCQkJcHJfZGVidWcoInVhcnQgcmVnaXN0ZXIgZmFpbGVkXG4iKTsKLQkJCXVhcnRfdW5yZWdpc3Rlcl9kcml2ZXIoJmJmaW5fc2VyaWFsX3JlZyk7Ci0JCX0KKwlpZiAocmV0KSB7CisJCXByX2VycigiZmFpbGVkIHRvIHJlZ2lzdGVyICVzOiVkXG4iLAorCQkJYmZpbl9zZXJpYWxfcmVnLmRyaXZlcl9uYW1lLCByZXQpOwogCX0KKworCXJldCA9IHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmYmZpbl9zZXJpYWxfZHJpdmVyKTsKKwlpZiAocmV0KSB7CisJCXByX2VycigiZmFpbCB0byByZWdpc3RlciBiZmluIHVhcnRcbiIpOworCQl1YXJ0X3VucmVnaXN0ZXJfZHJpdmVyKCZiZmluX3NlcmlhbF9yZWcpOworCX0KKwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTE0NjMsNyArMTU5Myw3IEBACiBtb2R1bGVfaW5pdChiZmluX3NlcmlhbF9pbml0KTsKIG1vZHVsZV9leGl0KGJmaW5fc2VyaWFsX2V4aXQpOwogCi1NT0RVTEVfQVVUSE9SKCJBdWJyZXkuTGkgPGF1YnJleS5saUBhbmFsb2cuY29tPiIpOworTU9EVUxFX0FVVEhPUigiU29uaWMgWmhhbmcsIEF1YnJleSBMaSIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJCbGFja2ZpbiBnZW5lcmljIHNlcmlhbCBwb3J0IGRyaXZlciIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogTU9EVUxFX0FMSUFTX0NIQVJERVZfTUFKT1IoQkZJTl9TRVJJQUxfTUFKT1IpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvb2Zfc2VyaWFsLmMgYi9kcml2ZXJzL3NlcmlhbC9vZl9zZXJpYWwuYwppbmRleCAxNzg0OWRjLi41YzdhYmU0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC9vZl9zZXJpYWwuYworKysgYi9kcml2ZXJzL3NlcmlhbC9vZl9zZXJpYWwuYwpAQCAtMTUsNiArMTUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF9jb3JlLmg+CiAjaW5jbHVkZSA8bGludXgvc2VyaWFsXzgyNTAuaD4KICNpbmNsdWRlIDxsaW51eC9vZl9hZGRyZXNzLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfaXJxLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfcGxhdGZvcm0uaD4KICNpbmNsdWRlIDxsaW51eC9ud3BzZXJpYWwuaD4KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zaC9jbGsvY29yZS5jIGIvZHJpdmVycy9zaC9jbGsvY29yZS5jCmluZGV4IDNmNWUzODcuLjVmNjNjM2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2gvY2xrL2NvcmUuYworKysgYi9kcml2ZXJzL3NoL2Nsay9jb3JlLmMKQEAgLTIxLDcgKzIxLDYgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KLSNpbmNsdWRlIDxsaW51eC9rb2JqZWN0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3lzZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaS5jIGIvZHJpdmVycy9zcGkvc3BpLmMKaW5kZXggYjAyZDBjYi4uMzRiYjE3ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvc3BpLmMKKysrIGIvZHJpdmVycy9zcGkvc3BpLmMKQEAgLTI4LDYgKzI4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tb2RfZGV2aWNldGFibGUuaD4KICNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CiAjaW5jbHVkZSA8bGludXgvb2Zfc3BpLmg+CisjaW5jbHVkZSA8bGludXgvcG1fcnVudGltZS5oPgogCiBzdGF0aWMgdm9pZCBzcGlkZXZfcmVsZWFzZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CkBAIC0xMDAsOSArMTAxLDggQEAKIAlyZXR1cm4gMDsKIH0KIAotI2lmZGVmCUNPTkZJR19QTQotCi1zdGF0aWMgaW50IHNwaV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldiwgcG1fbWVzc2FnZV90IG1lc3NhZ2UpCisjaWZkZWYgQ09ORklHX1BNX1NMRUVQCitzdGF0aWMgaW50IHNwaV9sZWdhY3lfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHBtX21lc3NhZ2VfdCBtZXNzYWdlKQogewogCWludAkJCXZhbHVlID0gMDsKIAlzdHJ1Y3Qgc3BpX2RyaXZlcgkqZHJ2ID0gdG9fc3BpX2RyaXZlcihkZXYtPmRyaXZlcik7CkBAIC0xMTcsNyArMTE3LDcgQEAKIAlyZXR1cm4gdmFsdWU7CiB9CiAKLXN0YXRpYyBpbnQgc3BpX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCitzdGF0aWMgaW50IHNwaV9sZWdhY3lfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlpbnQJCQl2YWx1ZSA9IDA7CiAJc3RydWN0IHNwaV9kcml2ZXIJKmRydiA9IHRvX3NwaV9kcml2ZXIoZGV2LT5kcml2ZXIpOwpAQCAtMTMyLDE4ICsxMzIsOTQgQEAKIAlyZXR1cm4gdmFsdWU7CiB9CiAKK3N0YXRpYyBpbnQgc3BpX3BtX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQoreworCWNvbnN0IHN0cnVjdCBkZXZfcG1fb3BzICpwbSA9IGRldi0+ZHJpdmVyID8gZGV2LT5kcml2ZXItPnBtIDogTlVMTDsKKworCWlmIChwbSkKKwkJcmV0dXJuIHBtX2dlbmVyaWNfc3VzcGVuZChkZXYpOworCWVsc2UKKwkJcmV0dXJuIHNwaV9sZWdhY3lfc3VzcGVuZChkZXYsIFBNU0dfU1VTUEVORCk7Cit9CisKK3N0YXRpYyBpbnQgc3BpX3BtX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJY29uc3Qgc3RydWN0IGRldl9wbV9vcHMgKnBtID0gZGV2LT5kcml2ZXIgPyBkZXYtPmRyaXZlci0+cG0gOiBOVUxMOworCisJaWYgKHBtKQorCQlyZXR1cm4gcG1fZ2VuZXJpY19yZXN1bWUoZGV2KTsKKwllbHNlCisJCXJldHVybiBzcGlfbGVnYWN5X3Jlc3VtZShkZXYpOworfQorCitzdGF0aWMgaW50IHNwaV9wbV9mcmVlemUoc3RydWN0IGRldmljZSAqZGV2KQoreworCWNvbnN0IHN0cnVjdCBkZXZfcG1fb3BzICpwbSA9IGRldi0+ZHJpdmVyID8gZGV2LT5kcml2ZXItPnBtIDogTlVMTDsKKworCWlmIChwbSkKKwkJcmV0dXJuIHBtX2dlbmVyaWNfZnJlZXplKGRldik7CisJZWxzZQorCQlyZXR1cm4gc3BpX2xlZ2FjeV9zdXNwZW5kKGRldiwgUE1TR19GUkVFWkUpOworfQorCitzdGF0aWMgaW50IHNwaV9wbV90aGF3KHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwljb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyAqcG0gPSBkZXYtPmRyaXZlciA/IGRldi0+ZHJpdmVyLT5wbSA6IE5VTEw7CisKKwlpZiAocG0pCisJCXJldHVybiBwbV9nZW5lcmljX3RoYXcoZGV2KTsKKwllbHNlCisJCXJldHVybiBzcGlfbGVnYWN5X3Jlc3VtZShkZXYpOworfQorCitzdGF0aWMgaW50IHNwaV9wbV9wb3dlcm9mZihzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJY29uc3Qgc3RydWN0IGRldl9wbV9vcHMgKnBtID0gZGV2LT5kcml2ZXIgPyBkZXYtPmRyaXZlci0+cG0gOiBOVUxMOworCisJaWYgKHBtKQorCQlyZXR1cm4gcG1fZ2VuZXJpY19wb3dlcm9mZihkZXYpOworCWVsc2UKKwkJcmV0dXJuIHNwaV9sZWdhY3lfc3VzcGVuZChkZXYsIFBNU0dfSElCRVJOQVRFKTsKK30KKworc3RhdGljIGludCBzcGlfcG1fcmVzdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJY29uc3Qgc3RydWN0IGRldl9wbV9vcHMgKnBtID0gZGV2LT5kcml2ZXIgPyBkZXYtPmRyaXZlci0+cG0gOiBOVUxMOworCisJaWYgKHBtKQorCQlyZXR1cm4gcG1fZ2VuZXJpY19yZXN0b3JlKGRldik7CisJZWxzZQorCQlyZXR1cm4gc3BpX2xlZ2FjeV9yZXN1bWUoZGV2KTsKK30KICNlbHNlCi0jZGVmaW5lIHNwaV9zdXNwZW5kCU5VTEwKLSNkZWZpbmUgc3BpX3Jlc3VtZQlOVUxMCisjZGVmaW5lIHNwaV9wbV9zdXNwZW5kCU5VTEwKKyNkZWZpbmUgc3BpX3BtX3Jlc3VtZQlOVUxMCisjZGVmaW5lIHNwaV9wbV9mcmVlemUJTlVMTAorI2RlZmluZSBzcGlfcG1fdGhhdwlOVUxMCisjZGVmaW5lIHNwaV9wbV9wb3dlcm9mZglOVUxMCisjZGVmaW5lIHNwaV9wbV9yZXN0b3JlCU5VTEwKICNlbmRpZgogCitzdGF0aWMgY29uc3Qgc3RydWN0IGRldl9wbV9vcHMgc3BpX3BtID0geworCS5zdXNwZW5kID0gc3BpX3BtX3N1c3BlbmQsCisJLnJlc3VtZSA9IHNwaV9wbV9yZXN1bWUsCisJLmZyZWV6ZSA9IHNwaV9wbV9mcmVlemUsCisJLnRoYXcgPSBzcGlfcG1fdGhhdywKKwkucG93ZXJvZmYgPSBzcGlfcG1fcG93ZXJvZmYsCisJLnJlc3RvcmUgPSBzcGlfcG1fcmVzdG9yZSwKKwlTRVRfUlVOVElNRV9QTV9PUFMoCisJCXBtX2dlbmVyaWNfcnVudGltZV9zdXNwZW5kLAorCQlwbV9nZW5lcmljX3J1bnRpbWVfcmVzdW1lLAorCQlwbV9nZW5lcmljX3J1bnRpbWVfaWRsZQorCSkKK307CisKIHN0cnVjdCBidXNfdHlwZSBzcGlfYnVzX3R5cGUgPSB7CiAJLm5hbWUJCT0gInNwaSIsCiAJLmRldl9hdHRycwk9IHNwaV9kZXZfYXR0cnMsCiAJLm1hdGNoCQk9IHNwaV9tYXRjaF9kZXZpY2UsCiAJLnVldmVudAkJPSBzcGlfdWV2ZW50LAotCS5zdXNwZW5kCT0gc3BpX3N1c3BlbmQsCi0JLnJlc3VtZQkJPSBzcGlfcmVzdW1lLAorCS5wbQkJPSAmc3BpX3BtLAogfTsKIEVYUE9SVF9TWU1CT0xfR1BMKHNwaV9idXNfdHlwZSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9LY29uZmlnIGIvZHJpdmVycy9zdGFnaW5nL0tjb25maWcKaW5kZXggYmRjNjMyYjYuLmUyZDU4NjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9LY29uZmlnCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9LY29uZmlnCkBAIC0xMTksNiArMTE5LDggQEAKIAogc291cmNlICJkcml2ZXJzL3N0YWdpbmcvbWVtcmFyL0tjb25maWciCiAKK3NvdXJjZSAiZHJpdmVycy9zdGFnaW5nL3NlcC9LY29uZmlnIgorCiBzb3VyY2UgImRyaXZlcnMvc3RhZ2luZy9paW8vS2NvbmZpZyIKIAogc291cmNlICJkcml2ZXJzL3N0YWdpbmcvenJhbS9LY29uZmlnIgpAQCAtMTI3LDggKzEyOSw2IEBACiAKIHNvdXJjZSAiZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDI1L0tjb25maWciCiAKLXNvdXJjZSAiZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvS2NvbmZpZyIKLQogc291cmNlICJkcml2ZXJzL3N0YWdpbmcvc2Ftc3VuZy1sYXB0b3AvS2NvbmZpZyIKIAogc291cmNlICJkcml2ZXJzL3N0YWdpbmcvc203eHgvS2NvbmZpZyIKQEAgLTE0MSw4ICsxNDEsNiBAQAogCiBzb3VyY2UgImRyaXZlcnMvc3RhZ2luZy90aS1zdC9LY29uZmlnIgogCi1zb3VyY2UgImRyaXZlcnMvc3RhZ2luZy9hZGlzMTYyNTUvS2NvbmZpZyIKLQogc291cmNlICJkcml2ZXJzL3N0YWdpbmcveGdpZmIvS2NvbmZpZyIKIAogc291cmNlICJkcml2ZXJzL3N0YWdpbmcvbXNtL0tjb25maWciCkBAIC0xNzUsNSArMTczLDkgQEAKIAogc291cmNlICJkcml2ZXJzL3N0YWdpbmcvc3BlYWt1cC9LY29uZmlnIgogCitzb3VyY2UgImRyaXZlcnMvc3RhZ2luZy9jcHRtMTIxNy9LY29uZmlnIgorCitzb3VyY2UgImRyaXZlcnMvc3RhZ2luZy9zdGVfcm1pNC9LY29uZmlnIgorCiBlbmRpZiAjICFTVEFHSU5HX0VYQ0xVREVfQlVJTEQKIGVuZGlmICMgU1RBR0lORwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL01ha2VmaWxlIGIvZHJpdmVycy9zdGFnaW5nL01ha2VmaWxlCmluZGV4IDNlZGE1YzcuLmM3ZDIyMjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3N0YWdpbmcvTWFrZWZpbGUKQEAgLTQyLDE4ICs0MiwxNyBAQAogb2JqLSQoQ09ORklHX0hZUEVSVikJCSs9IGh2Lwogb2JqLSQoQ09ORklHX1ZNRV9CVVMpCQkrPSB2bWUvCiBvYmotJChDT05GSUdfTVJTVF9SQVJfSEFORExFUikJKz0gbWVtcmFyLworb2JqLSQoQ09ORklHX0RYX1NFUCkgICAgICAgICAgICArPSBzZXAvCiBvYmotJChDT05GSUdfSUlPKQkJKz0gaWlvLwogb2JqLSQoQ09ORklHX1pSQU0pCQkrPSB6cmFtLwogb2JqLSQoQ09ORklHX1dMQUdTNDlfSDIpCSs9IHdsYWdzNDlfaDIvCiBvYmotJChDT05GSUdfV0xBR1M0OV9IMjUpCSs9IHdsYWdzNDlfaDI1Lwotb2JqLSQoQ09ORklHX0JBVE1BTl9BRFYpCSs9IGJhdG1hbi1hZHYvCiBvYmotJChDT05GSUdfU0FNU1VOR19MQVBUT1ApCSs9IHNhbXN1bmctbGFwdG9wLwogb2JqLSQoQ09ORklHX0ZCX1NNN1hYKQkJKz0gc203eHgvCiBvYmotJChDT05GSUdfVklERU9fRFQzMTU1KQkrPSBkdDMxNTV2NGwvCiBvYmotJChDT05GSUdfQ1JZU1RBTEhEKQkJKz0gY3J5c3RhbGhkLwogb2JqLSQoQ09ORklHX0NYVDFFMSkJCSs9IGN4dDFlMS8KIG9iai0kKENPTkZJR19USV9TVCkJCSs9IHRpLXN0Lwotb2JqLSQoQ09ORklHX0FESVMxNjI1NSkJCSs9IGFkaXMxNjI1NS8KIG9iai0kKENPTkZJR19GQl9YR0kpCQkrPSB4Z2lmYi8KIG9iai0kKENPTkZJR19NU01fU1RBR0lORykJKz0gbXNtLwogb2JqLSQoQ09ORklHX0VBU1lDQVApCQkrPSBlYXN5Y2FwLwpAQCAtNjgsMyArNjcsNSBAQAogb2JqLSQoQ09ORklHX0ZUMTAwMCkJCSs9IGZ0MTAwMC8KIG9iai0kKENPTkZJR19TTkRfSU5URUxfU1NUKQkJKz0gaW50ZWxfc3N0Lwogb2JqLSQoQ09ORklHX1NQRUFLVVApCSs9IHNwZWFrdXAvCitvYmotJChDT05GSUdfVE9VQ0hTQ1JFRU5fQ0xFQVJQQURfVE0xMjE3KQkrPSBjcHRtMTIxNy8KK29iai0kKENPTkZJR19UT1VDSFNDUkVFTl9TWU5BUFRJQ1NfSTJDX1JNSTQpCSs9IHN0ZV9ybWk0LwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2FkaXMxNjI1NS9LY29uZmlnIGIvZHJpdmVycy9zdGFnaW5nL2FkaXMxNjI1NS9LY29uZmlnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODgzYzFmLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9hZGlzMTYyNTUvS2NvbmZpZworKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLWNvbmZpZyBBRElTMTYyNTUKLQl0cmlzdGF0ZSAiQW5hbG9nIERldmljZXMgQURJUzE2MjUwLzE2MjU1IgotCWRlcGVuZHMgb24gU1BJICYmIFNZU0ZTCi0JLS0taGVscC0tLQotCUlmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciB0aGUgQW5hbG9nIERldmljZXMKLQlBRElTMTYyNTAvMTYyNTUgTG93IFBvd2VyIEd5cm9zY29wZS4gVGhlIGRyaXZlciBleHBvc2VzCi0Jb3JpZW50YXRpb24gYW5kIGd5cm9zY29wZSB2YWx1ZSwgYXMgd2VsbCBhcyBzYW1wbGUgcmF0ZQotCXRvIHRoZSBzeXNmcy4KLQotCVRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiBJZiBzbywgdGhlIG1vZHVsZQotCXdpbGwgYmUgY2FsbGVkIGFkaXMxNjI1NS4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9hZGlzMTYyNTUvTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvYWRpczE2MjU1L01ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzM5MDgxLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9hZGlzMTYyNTUvTWFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1vYmotJChDT05GSUdfQURJUzE2MjU1KQkJKz0gYWRpczE2MjU1Lm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9hZGlzMTYyNTUvYWRpczE2MjU1LmMgYi9kcml2ZXJzL3N0YWdpbmcvYWRpczE2MjU1L2FkaXMxNjI1NS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDRkN2NiLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9hZGlzMTYyNTUvYWRpczE2MjU1LmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NjggKzAsMCBAQAotLyoKLSAqIEFuYWxvZyBEZXZpY2VzIEFESVMxNjI1MC9BRElTMTYyNTUgTG93IFBvd2VyIEd5cm9zY29wZQotICoKLSAqIFdyaXR0ZW4gYnk6IE1hdHRoaWFzIEJydWdnZXIgPG1fYnJ1Z2dlckB3ZWIuZGU+Ci0gKgotICogQ29weXJpZ2h0IChDKSAyMDEwIEZyYXVuaG9mZXIgSW5zdGl0dXRlIGZvciBJbnRlZ3JhdGVkIENpcmN1aXRzCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgotICovCi0KLS8qCi0gKiBUaGUgZHJpdmVyIGp1c3QgaGFzIGEgYmFyZSBpbnRlcmZhY2UgdG8gdGhlIHN5c2ZzIChzYW1wbGUgcmF0ZSBpbiBIeiwKLSAqIG9yaWVudGF0aW9uICh4LCB5LCB6KSBhbmQgZ3lyb3Njb3BlIGRhdGEgaW4gwrAvc2VjLgotICoKLSAqIEl0IHNob3VsZCBiZSBhZGRlZCB0byBpaW8gc3Vic3lzdGVtIHdoZW4gdGhpcyBoYXMgbGVmdCBzdGFnaW5nLgotICoKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KLSNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgotI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotCi0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLQotI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KLQotI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KLSNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KLQotI2luY2x1ZGUgImFkaXMxNjI1NS5oIgotCi0jZGVmaW5lIEFESVNfU1RBVFVTICAgICAgICAweDNkCi0jZGVmaW5lIEFESVNfU01QTF9QUkRfTVNCICAweDM3Ci0jZGVmaW5lIEFESVNfU01QTF9QUkRfTFNCICAweDM2Ci0jZGVmaW5lIEFESVNfTVNDX0NUUkxfTVNCICAweDM1Ci0jZGVmaW5lIEFESVNfTVNDX0NUUkxfTFNCICAweDM0Ci0jZGVmaW5lIEFESVNfR1BJT19DVFJMICAgICAweDMzCi0jZGVmaW5lIEFESVNfQUxNX1NNUEwxICAgICAweDI1Ci0jZGVmaW5lIEFESVNfQUxNX01BRzEgICAgICAweDIxCi0jZGVmaW5lIEFESVNfR1lST19TQ0FMRSAgICAweDE3Ci0jZGVmaW5lIEFESVNfR1lST19PVVQgICAgICAweDA1Ci0jZGVmaW5lIEFESVNfU1VQUExZX09VVCAgICAweDAzCi0jZGVmaW5lIEFESVNfRU5EVVJBTkNFICAgICAweDAxCi0KLS8qCi0gKiBkYXRhIHN0cnVjdHVyZSBmb3IgZXZlcnkgc2Vuc29yCi0gKgotICogQGRldjogICAgICAgRHJpdmVyIG1vZGVsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBkZXZpY2UuCi0gKiBAc3BpOiAgICAgICBQb2ludGVyIHRvIHRoZSBzcGkgZGV2aWNlIHdoaWNoIHdpbGwgbWFuYWdlIGkvbyB0byBzcGkgYnVzLgotICogQGRhdGE6ICAgICAgTGFzdCByZWFkIGRhdGEgZnJvbSBkZXZpY2UuCi0gKiBAaXJxX2FkaXM6ICBHUElPIE51bWJlciBvZiBJUlEgc2lnbmFsCi0gKiBAaXJxOiAgICAgICBpcnEgbGluZSBtYW5hZ2UgYnkga2VybmVsCi0gKiBAbmVnYXRpdmU6ICBpbmRpY2F0ZXMgaWYgc2Vuc29yIGlzIHVwc2lkZSBkb3duIChuZWdhdGl2ZSA9PSAxKQotICogQGRpcmVjdGlvbjogaW5kaWNhdGVzIGF4aXMgKHgsIHksIHopIHRoZSBzZW5zb3IgaXMgbWVhc3N1cmluZwotICovCi1zdHJ1Y3Qgc3BpX2FkaXMxNjI1NV9kYXRhIHsKLQlzdHJ1Y3QgZGV2aWNlIGRldjsKLQlzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpOwotCXMxNiBkYXRhOwotCWludCBpcnE7Ci0JdTggbmVnYXRpdmU7Ci0JY2hhciBkaXJlY3Rpb247Ci19OwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgaW50IHNwaV9hZGlzMTYyNTVfcmVhZF9kYXRhKHN0cnVjdCBzcGlfYWRpczE2MjU1X2RhdGEgKnNwaWFkaXMsCi0JCQkJCXU4IGFkciwKLQkJCQkJdTggKnJidWYpCi17Ci0Jc3RydWN0IHNwaV9kZXZpY2UgKnNwaSA9IHNwaWFkaXMtPnNwaTsKLQlzdHJ1Y3Qgc3BpX21lc3NhZ2UgbXNnOwotCXN0cnVjdCBzcGlfdHJhbnNmZXIgeGZlcjEsIHhmZXIyOwotCXU4ICpidWYsICpyeDsKLQlpbnQgcmV0OwotCi0JYnVmID0ga3phbGxvYyg0LCBHRlBfS0VSTkVMKTsKLQlpZiAoYnVmID09IE5VTEwpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JcnggPSBremFsbG9jKDQsIEdGUF9LRVJORUwpOwotCWlmIChyeCA9PSBOVUxMKSB7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gZXJyX2J1ZjsKLQl9Ci0KLQlidWZbMF0gPSBhZHI7Ci0KLQlzcGlfbWVzc2FnZV9pbml0KCZtc2cpOwotCW1lbXNldCgmeGZlcjEsIDAsIHNpemVvZih4ZmVyMSkpOwotCW1lbXNldCgmeGZlcjIsIDAsIHNpemVvZih4ZmVyMikpOwotCi0JeGZlcjEudHhfYnVmID0gYnVmOwotCXhmZXIxLnJ4X2J1ZiA9IGJ1ZiArIDI7Ci0JeGZlcjEubGVuID0gMjsKLQl4ZmVyMS5kZWxheV91c2VjcyA9IDk7Ci0KLQl4ZmVyMi50eF9idWYgPSByeCArIDI7Ci0JeGZlcjIucnhfYnVmID0gcng7Ci0JeGZlcjIubGVuID0gMjsKLQotCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZ4ZmVyMSwgJm1zZyk7Ci0Jc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnhmZXIyLCAmbXNnKTsKLQotCXJldCA9IHNwaV9zeW5jKHNwaSwgJm1zZyk7Ci0JaWYgKHJldCA9PSAwKSB7Ci0JCXJidWZbMF0gPSByeFswXTsKLQkJcmJ1ZlsxXSA9IHJ4WzFdOwotCX0KLQotCWtmcmVlKHJ4KTsKLWVycl9idWY6Ci0Ja2ZyZWUoYnVmKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgc3BpX2FkaXMxNjI1NV93cml0ZV9kYXRhKHN0cnVjdCBzcGlfYWRpczE2MjU1X2RhdGEgKnNwaWFkaXMsCi0JCQkJCXU4IGFkcjEsCi0JCQkJCXU4IGFkcjIsCi0JCQkJCXU4ICp3YnVmKQotewotCXN0cnVjdCBzcGlfZGV2aWNlICpzcGkgPSBzcGlhZGlzLT5zcGk7Ci0Jc3RydWN0IHNwaV9tZXNzYWdlICAgbXNnOwotCXN0cnVjdCBzcGlfdHJhbnNmZXIgIHhmZXIxLCB4ZmVyMjsKLQl1OCAgICAgICAqYnVmLCAqcng7Ci0JaW50ICAgICAgICAgcmV0OwotCi0JYnVmID0ga21hbGxvYyg0LCBHRlBfS0VSTkVMKTsKLQlpZiAoYnVmID09IE5VTEwpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JcnggPSBremFsbG9jKDQsIEdGUF9LRVJORUwpOwotCWlmIChyeCA9PSBOVUxMKSB7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gZXJyX2J1ZjsKLQl9Ci0KLQlzcGlfbWVzc2FnZV9pbml0KCZtc2cpOwotCW1lbXNldCgmeGZlcjEsIDAsIHNpemVvZih4ZmVyMSkpOwotCW1lbXNldCgmeGZlcjIsIDAsIHNpemVvZih4ZmVyMikpOwotCi0JYnVmWzBdID0gYWRyMSB8IDB4ODA7Ci0JYnVmWzFdID0gKndidWY7Ci0KLQlidWZbMl0gPSBhZHIyIHwgMHg4MDsKLQlidWZbM10gPSAqKHdidWYgKyAxKTsKLQotCXhmZXIxLnR4X2J1ZiA9IGJ1ZjsKLQl4ZmVyMS5yeF9idWYgPSByeDsKLQl4ZmVyMS5sZW4gPSAyOwotCXhmZXIxLmRlbGF5X3VzZWNzID0gOTsKLQotCXhmZXIyLnR4X2J1ZiA9IGJ1ZisyOwotCXhmZXIyLnJ4X2J1ZiA9IHJ4KzI7Ci0JeGZlcjIubGVuID0gMjsKLQotCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZ4ZmVyMSwgJm1zZyk7Ci0Jc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnhmZXIyLCAmbXNnKTsKLQotCXJldCA9IHNwaV9zeW5jKHNwaSwgJm1zZyk7Ci0JaWYgKHJldCAhPSAwKQotCQlkZXZfd2Fybigmc3BpLT5kZXYsICJ3cml0ZSBkYXRhIHRvICUjeCAlI3ggZmFpbGVkXG4iLAotCQkJCWJ1ZlswXSwgYnVmWzJdKTsKLQotCWtmcmVlKHJ4KTsKLWVycl9idWY6Ci0Ja2ZyZWUoYnVmKTsKLQlyZXR1cm4gcmV0OwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgaXJxcmV0dXJuX3QgYWRpc19pcnFfdGhyZWFkKGludCBpcnEsIHZvaWQgKmRldl9pZCkKLXsKLQlzdHJ1Y3Qgc3BpX2FkaXMxNjI1NV9kYXRhICpzcGlhZGlzID0gZGV2X2lkOwotCWludCBzdGF0dXM7Ci0JdTE2IHZhbHVlID0gMDsKLQotCXN0YXR1cyA9ICBzcGlfYWRpczE2MjU1X3JlYWRfZGF0YShzcGlhZGlzLCBBRElTX0dZUk9fT1VULCAodTggKikmdmFsdWUpOwotCWlmIChzdGF0dXMgIT0gMCkgewotCQlkZXZfd2Fybigmc3BpYWRpcy0+c3BpLT5kZXYsICJTUEkgRkFJTEVEXG4iKTsKLQkJZ290byBleGl0OwotCX0KLQotCS8qIHBlcmZvcm0gb24gbmV3IGRhdGEgb25seS4uLiAqLwotCWlmICh2YWx1ZSAmIDB4ODAwMCkgewotCQkvKiBkZWxldGUgZXJyb3IgYW5kIG5ldyBkYXRhIGJpdCAqLwotCQl2YWx1ZSA9IHZhbHVlICYgMHgzZmZmOwotCQkvKiBzZXQgbmVnYXRpdmUgdmFsdWUgKi8KLQkJaWYgKHZhbHVlICYgMHgyMDAwKQotCQkJdmFsdWUgPSB2YWx1ZSB8IDB4ZTAwMDsKLQotCQlpZiAobGlrZWx5KHNwaWFkaXMtPm5lZ2F0aXZlKSkKLQkJCXZhbHVlID0gLXZhbHVlOwotCi0JCXNwaWFkaXMtPmRhdGEgPSAoczE2KSB2YWx1ZTsKLQl9Ci0KLWV4aXQ6Ci0JcmV0dXJuIElSUV9IQU5ETEVEOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zc2l6ZV90IGFkaXMxNjI1NV9zaG93X2RhdGEoc3RydWN0IGRldmljZSAqZGV2aWNlLAotCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGEsCi0JCWNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3Qgc3BpX2FkaXMxNjI1NV9kYXRhICpzcGlhZGlzID0gZGV2X2dldF9kcnZkYXRhKGRldmljZSk7Ci0JcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWRcbiIsIHNwaWFkaXMtPmRhdGEpOwotfQotREVWSUNFX0FUVFIoZGF0YSwgU19JUlVHTyAsIGFkaXMxNjI1NV9zaG93X2RhdGEsIE5VTEwpOwotCi1zc2l6ZV90IGFkaXMxNjI1NV9zaG93X2RpcmVjdGlvbihzdHJ1Y3QgZGV2aWNlICpkZXZpY2UsCi0JCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkYSwKLQkJY2hhciAqYnVmKQotewotCXN0cnVjdCBzcGlfYWRpczE2MjU1X2RhdGEgKnNwaWFkaXMgPSBkZXZfZ2V0X2RydmRhdGEoZGV2aWNlKTsKLQlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlY1xuIiwgc3BpYWRpcy0+ZGlyZWN0aW9uKTsKLX0KLURFVklDRV9BVFRSKGRpcmVjdGlvbiwgU19JUlVHTyAsIGFkaXMxNjI1NV9zaG93X2RpcmVjdGlvbiwgTlVMTCk7Ci0KLXNzaXplX3QgYWRpczE2MjU1X3Nob3dfc2FtcGxlX3JhdGUoc3RydWN0IGRldmljZSAqZGV2aWNlLAotCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGEsCi0JCWNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3Qgc3BpX2FkaXMxNjI1NV9kYXRhICpzcGlhZGlzID0gZGV2X2dldF9kcnZkYXRhKGRldmljZSk7Ci0JaW50IHN0YXR1cyA9IDA7Ci0JdTE2IHZhbHVlID0gMDsKLQlpbnQgdHMgPSAwOwotCi0Jc3RhdHVzID0gc3BpX2FkaXMxNjI1NV9yZWFkX2RhdGEoc3BpYWRpcywgQURJU19TTVBMX1BSRF9NU0IsCi0JCQkJKHU4ICopJnZhbHVlKTsKLQlpZiAoc3RhdHVzICE9IDApCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKHZhbHVlICYgMHg4MCkgewotCQkvKiB0aW1lYmFzZSA9IDYwLjU0IG1zICovCi0JCXRzID0gNjA1NDAgKiAoKDB4N2YgJiB2YWx1ZSkgKyAxKTsKLQl9IGVsc2UgewotCQkvKiB0aW1lYmFzZSA9IDEuOTUzIG1zICovCi0JCXRzID0gMTk1MyAqICgoMHg3ZiAmIHZhbHVlKSArIDEpOwotCX0KLQotCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkXG4iLCAoMTAwMCoxMDAwKS90cyk7Ci19Ci1ERVZJQ0VfQVRUUihzYW1wbGVfcmF0ZSwgU19JUlVHTyAsIGFkaXMxNjI1NV9zaG93X3NhbXBsZV9yYXRlLCBOVUxMKTsKLQotc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmFkaXMxNjI1NV9hdHRyaWJ1dGVzW10gPSB7Ci0JJmRldl9hdHRyX2RhdGEuYXR0ciwKLQkmZGV2X2F0dHJfZGlyZWN0aW9uLmF0dHIsCi0JJmRldl9hdHRyX3NhbXBsZV9yYXRlLmF0dHIsCi0JTlVMTAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgYWRpczE2MjU1X2F0dHJfZ3JvdXAgPSB7Ci0JLmF0dHJzID0gYWRpczE2MjU1X2F0dHJpYnV0ZXMsCi19OwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgaW50IHNwaV9hZGlzMTYyNTVfc2h1dGRvd24oc3RydWN0IHNwaV9hZGlzMTYyNTVfZGF0YSAqc3BpYWRpcykKLXsKLQl1MTYgdmFsdWUgPSAwOwotCS8qIHR1cm4gc2Vuc29yIG9mZiAqLwotCXNwaV9hZGlzMTYyNTVfd3JpdGVfZGF0YShzcGlhZGlzLAotCQkJQURJU19TTVBMX1BSRF9NU0IsIEFESVNfU01QTF9QUkRfTFNCLAotCQkJKHU4ICopJnZhbHVlKTsKLQlzcGlfYWRpczE2MjU1X3dyaXRlX2RhdGEoc3BpYWRpcywKLQkJCUFESVNfTVNDX0NUUkxfTVNCLCBBRElTX01TQ19DVFJMX0xTQiwKLQkJCSh1OCAqKSZ2YWx1ZSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgc3BpX2FkaXMxNjI1NV9icmluZ3VwKHN0cnVjdCBzcGlfYWRpczE2MjU1X2RhdGEgKnNwaWFkaXMpCi17Ci0JaW50IHN0YXR1cyA9IDA7Ci0JdTE2IHZhbHVlID0gMDsKLQotCXN0YXR1cyA9IHNwaV9hZGlzMTYyNTVfcmVhZF9kYXRhKHNwaWFkaXMsIEFESVNfR1lST19TQ0FMRSwKLQkJCQkodTggKikmdmFsdWUpOwotCWlmIChzdGF0dXMgIT0gMCkKLQkJZ290byBlcnI7Ci0JaWYgKHZhbHVlICE9IDB4MDgwMCkgewotCQlkZXZfd2Fybigmc3BpYWRpcy0+c3BpLT5kZXYsICJTY2FsZSBmYWN0b3IgaXMgbm9uZSBkZWZhdWx0ICIKLQkJCQkidmFsdWUgKCUuNHgpXG4iLCB2YWx1ZSk7Ci0JfQotCi0JLyogdGltZWJhc2UgPSAxLjk1MyBtcywgTnMgPSAwIC0+IDUxMiBIeiBzYW1wbGUgcmF0ZSAqLwotCXZhbHVlID0gIDB4MDAwMTsKLQlzdGF0dXMgPSBzcGlfYWRpczE2MjU1X3dyaXRlX2RhdGEoc3BpYWRpcywKLQkJCQlBRElTX1NNUExfUFJEX01TQiwgQURJU19TTVBMX1BSRF9MU0IsCi0JCQkJKHU4ICopJnZhbHVlKTsKLQlpZiAoc3RhdHVzICE9IDApCi0JCWdvdG8gZXJyOwotCi0JLyogc3RhcnQgaW50ZXJuYWwgc2VsZi10ZXN0ICovCi0JdmFsdWUgPSAweDA0MDA7Ci0Jc3RhdHVzID0gc3BpX2FkaXMxNjI1NV93cml0ZV9kYXRhKHNwaWFkaXMsCi0JCQkJQURJU19NU0NfQ1RSTF9NU0IsIEFESVNfTVNDX0NUUkxfTFNCLAotCQkJCSh1OCAqKSZ2YWx1ZSk7Ci0JaWYgKHN0YXR1cyAhPSAwKQotCQlnb3RvIGVycjsKLQotCS8qIHdhaXQgMzUgbXMgdG8gZmluaXNoIHNlbGYtdGVzdCAqLwotCW1zbGVlcCgzNSk7Ci0KLQl2YWx1ZSA9IDB4MDAwMDsKLQlzdGF0dXMgPSBzcGlfYWRpczE2MjU1X3JlYWRfZGF0YShzcGlhZGlzLCBBRElTX1NUQVRVUywKLQkJCQkodTggKikmdmFsdWUpOwotCWlmIChzdGF0dXMgIT0gMCkKLQkJZ290byBlcnI7Ci0KLQlpZiAodmFsdWUgJiAweDIzKSB7Ci0JCWlmICh2YWx1ZSAmIDB4MjApIHsKLQkJCWRldl93YXJuKCZzcGlhZGlzLT5zcGktPmRldiwgInNlbGYtdGVzdCBlcnJvclxuIik7Ci0JCQlzdGF0dXMgPSAtRU5PREVWOwotCQkJZ290byBlcnI7Ci0JCX0gZWxzZSBpZiAodmFsdWUgJiAweDMpCXsKLQkJCWRldl93YXJuKCZzcGlhZGlzLT5zcGktPmRldiwgIlNlbnNvciB2b2x0YWdlICIKLQkJCQkJCSJvdXQgb2YgcmFuZ2UuXG4iKTsKLQkJCXN0YXR1cyA9IC1FTk9ERVY7Ci0JCQlnb3RvIGVycjsKLQkJfQotCX0KLQotCS8qIHNldCBpbnRlcnJ1cHQgdG8gYWN0aXZlIGhpZ2ggb24gRElPMCB3aGVuIGRhdGEgcmVhZHkgKi8KLQl2YWx1ZSA9IDB4MDAwNjsKLQlzdGF0dXMgPSBzcGlfYWRpczE2MjU1X3dyaXRlX2RhdGEoc3BpYWRpcywKLQkJCQlBRElTX01TQ19DVFJMX01TQiwgQURJU19NU0NfQ1RSTF9MU0IsCi0JCQkJKHU4ICopJnZhbHVlKTsKLQlpZiAoc3RhdHVzICE9IDApCi0JCWdvdG8gZXJyOwotCXJldHVybiBzdGF0dXM7Ci0KLWVycjoKLQlzcGlfYWRpczE2MjU1X3NodXRkb3duKHNwaWFkaXMpOwotCXJldHVybiBzdGF0dXM7Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyBpbnQgX19kZXZpbml0IHNwaV9hZGlzMTYyNTVfcHJvYmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKLXsKLQotCXN0cnVjdCBhZGlzMTYyNTVfaW5pdF9kYXRhICppbml0X2RhdGEgPSBzcGktPmRldi5wbGF0Zm9ybV9kYXRhOwotCXN0cnVjdCBzcGlfYWRpczE2MjU1X2RhdGEgICpzcGlhZGlzOwotCWludCBzdGF0dXMgPSAwOwotCi0Jc3BpYWRpcyA9IGt6YWxsb2Moc2l6ZW9mKCpzcGlhZGlzKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFzcGlhZGlzKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCXNwaWFkaXMtPnNwaSA9IHNwaTsKLQlzcGlhZGlzLT5kaXJlY3Rpb24gPSBpbml0X2RhdGEtPmRpcmVjdGlvbjsKLQotCWlmIChpbml0X2RhdGEtPm5lZ2F0aXZlKQotCQlzcGlhZGlzLT5uZWdhdGl2ZSA9IDE7Ci0KLQlzdGF0dXMgPSBncGlvX3JlcXVlc3QoaW5pdF9kYXRhLT5pcnEsICJhZGlzMTYyNTUiKTsKLQlpZiAoc3RhdHVzICE9IDApCi0JCWdvdG8gZXJyOwotCi0Jc3RhdHVzID0gZ3Bpb19kaXJlY3Rpb25faW5wdXQoaW5pdF9kYXRhLT5pcnEpOwotCWlmIChzdGF0dXMgIT0gMCkKLQkJZ290byBncGlvX2VycjsKLQotCXNwaWFkaXMtPmlycSA9IGdwaW9fdG9faXJxKGluaXRfZGF0YS0+aXJxKTsKLQotCXN0YXR1cyA9IHJlcXVlc3RfdGhyZWFkZWRfaXJxKHNwaWFkaXMtPmlycSwKLQkJCU5VTEwsIGFkaXNfaXJxX3RocmVhZCwKLQkJCUlSUUZfRElTQUJMRUQsICJhZGlzLWRyaXZlciIsIHNwaWFkaXMpOwotCi0JaWYgKHN0YXR1cyAhPSAwKSB7Ci0JCWRldl9lcnIoJnNwaS0+ZGV2LCAiSVJRIHJlcXVlc3QgZmFpbGVkXG4iKTsKLQkJZ290byBncGlvX2VycjsKLQl9Ci0KLQlkZXZfZGJnKCZzcGktPmRldiwgIkdQSU8gJWQgSVJRICVkXG4iLCBpbml0X2RhdGEtPmlycSwgc3BpYWRpcy0+aXJxKTsKLQotCWRldl9zZXRfZHJ2ZGF0YSgmc3BpLT5kZXYsIHNwaWFkaXMpOwotCXN0YXR1cyA9IHN5c2ZzX2NyZWF0ZV9ncm91cCgmc3BpLT5kZXYua29iaiwgJmFkaXMxNjI1NV9hdHRyX2dyb3VwKTsKLQlpZiAoc3RhdHVzICE9IDApCi0JCWdvdG8gaXJxX2VycjsKLQotCXN0YXR1cyA9IHNwaV9hZGlzMTYyNTVfYnJpbmd1cChzcGlhZGlzKTsKLQlpZiAoc3RhdHVzICE9IDApCi0JCWdvdG8gc3lzZnNfZXJyOwotCi0JZGV2X2luZm8oJnNwaS0+ZGV2LCAic3BpX2FkaXMxNjI1NSBkcml2ZXIgYWRkZWQhXG4iKTsKLQotCXJldHVybiBzdGF0dXM7Ci0KLXN5c2ZzX2VycjoKLQlzeXNmc19yZW1vdmVfZ3JvdXAoJnNwaWFkaXMtPnNwaS0+ZGV2LmtvYmosICZhZGlzMTYyNTVfYXR0cl9ncm91cCk7Ci1pcnFfZXJyOgotCWZyZWVfaXJxKHNwaWFkaXMtPmlycSwgc3BpYWRpcyk7Ci1ncGlvX2VycjoKLQlncGlvX2ZyZWUoaW5pdF9kYXRhLT5pcnEpOwotZXJyOgotCWtmcmVlKHNwaWFkaXMpOwotCXJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXRpYyBpbnQgX19kZXZleGl0IHNwaV9hZGlzMTYyNTVfcmVtb3ZlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCi17Ci0Jc3RydWN0IHNwaV9hZGlzMTYyNTVfZGF0YSAgKnNwaWFkaXMgICAgPSBkZXZfZ2V0X2RydmRhdGEoJnNwaS0+ZGV2KTsKLQotCXNwaV9hZGlzMTYyNTVfc2h1dGRvd24oc3BpYWRpcyk7Ci0KLQlmcmVlX2lycShzcGlhZGlzLT5pcnEsIHNwaWFkaXMpOwotCWdwaW9fZnJlZShpcnFfdG9fZ3BpbyhzcGlhZGlzLT5pcnEpKTsKLQotCXN5c2ZzX3JlbW92ZV9ncm91cCgmc3BpYWRpcy0+c3BpLT5kZXYua29iaiwgJmFkaXMxNjI1NV9hdHRyX2dyb3VwKTsKLQotCWtmcmVlKHNwaWFkaXMpOwotCi0JZGV2X2luZm8oJnNwaS0+ZGV2LCAic3BpX2FkaXMxNjI1NSBkcml2ZXIgcmVtb3ZlZCFcbiIpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3RydWN0IHNwaV9kcml2ZXIgc3BpX2FkaXMxNjI1NV9kcnYgPSB7Ci0JLmRyaXZlciA9IHsKLQkJLm5hbWUgPSAgInNwaV9hZGlzMTYyNTUiLAotCQkub3duZXIgPSBUSElTX01PRFVMRSwKLQl9LAotCS5wcm9iZSA9IHNwaV9hZGlzMTYyNTVfcHJvYmUsCi0JLnJlbW92ZSA9ICAgX19kZXZleGl0X3Aoc3BpX2FkaXMxNjI1NV9yZW1vdmUpLAotfTsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIGludCBfX2luaXQgc3BpX2FkaXMxNjI1NV9pbml0KHZvaWQpCi17Ci0JcmV0dXJuIHNwaV9yZWdpc3Rlcl9kcml2ZXIoJnNwaV9hZGlzMTYyNTVfZHJ2KTsKLX0KLW1vZHVsZV9pbml0KHNwaV9hZGlzMTYyNTVfaW5pdCk7Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBzcGlfYWRpczE2MjU1X2V4aXQodm9pZCkKLXsKLQlzcGlfdW5yZWdpc3Rlcl9kcml2ZXIoJnNwaV9hZGlzMTYyNTVfZHJ2KTsKLX0KLW1vZHVsZV9leGl0KHNwaV9hZGlzMTYyNTVfZXhpdCk7Ci0KLU1PRFVMRV9BVVRIT1IoIk1hdHRoaWFzIEJydWdnZXIiKTsKLU1PRFVMRV9ERVNDUklQVElPTigiU1BJIGRldmljZSBkcml2ZXIgZm9yIEFESVMxNjI1NSBzZW5zb3IiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9hZGlzMTYyNTUvYWRpczE2MjU1LmggYi9kcml2ZXJzL3N0YWdpbmcvYWRpczE2MjU1L2FkaXMxNjI1NS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwM2UwNzAwLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9hZGlzMTYyNTUvYWRpczE2MjU1LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jaWZuZGVmIEFESVMxNjI1NV9ICi0jZGVmaW5lIEFESVMxNjI1NV9ICi0KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotCi1zdHJ1Y3QgYWRpczE2MjU1X2luaXRfZGF0YSB7Ci0JY2hhciBkaXJlY3Rpb247Ci0JdTggICBuZWdhdGl2ZTsKLQlpbnQgIGlycTsKLX07Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2FzdXNfb2xlZC9hc3VzX29sZWQuYyBiL2RyaXZlcnMvc3RhZ2luZy9hc3VzX29sZWQvYXN1c19vbGVkLmMKaW5kZXggMDE2YzZmNy4uN2JiN2RhNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2FzdXNfb2xlZC9hc3VzX29sZWQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvYXN1c19vbGVkL2FzdXNfb2xlZC5jCkBAIC03MCw3ICs3MCw3IEBACiBNT0RVTEVfUEFSTV9ERVNDKHN0YXJ0X29mZiwKIAkJICJTZXQgdG8gMSB0byBzd2l0Y2ggb2ZmIE9MRUQgZGlzcGxheSBhZnRlciBpdCBpcyBhdHRhY2hlZCIpOwogCi1lbnVtIG9sZWRfcGFja19tb2RleworZW51bSBvbGVkX3BhY2tfbW9kZSB7CiAJUEFDS19NT0RFX0cxLAogCVBBQ0tfTU9ERV9HNTAsCiAJUEFDS19NT0RFX0xBU1QKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9hdGg2a2wvaGlmL3NkaW8vbGludXhfc2Rpby9zcmMvaGlmLmMgYi9kcml2ZXJzL3N0YWdpbmcvYXRoNmtsL2hpZi9zZGlvL2xpbnV4X3NkaW8vc3JjL2hpZi5jCmluZGV4IGMzMDdhNTUuLmU5NjY2MmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9hdGg2a2wvaGlmL3NkaW8vbGludXhfc2Rpby9zcmMvaGlmLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2F0aDZrbC9oaWYvc2Rpby9saW51eF9zZGlvL3NyYy9oaWYuYwpAQCAtODc2LDcgKzg3Niw3IEBACiB2b2lkCiBISUZVbk1hc2tJbnRlcnJ1cHQoSElGX0RFVklDRSAqZGV2aWNlKQogewotICAgIGludCByZXQ7OworICAgIGludCByZXQ7CiAKICAgICBBUl9ERUJVR19BU1NFUlQoZGV2aWNlICE9IE5VTEwpOwogICAgIEFSX0RFQlVHX0FTU0VSVChkZXZpY2UtPmZ1bmMgIT0gTlVMTCk7CkBAIC0xMTg4LDcgKzExODgsNyBAQAogICAgIEhJRl9ERVZJQ0UgKmhpZmRldmljZTsKICAgICBBUl9ERUJVR19QUklOVEYoQVRIX0RFQlVHX1RSQUNFLCAoIkFSNjAwMDogYWRkSGlmRGV2aWNlXG4iKSk7CiAgICAgQVJfREVCVUdfQVNTRVJUKGZ1bmMgIT0gTlVMTCk7Ci0gICAgaGlmZGV2aWNlID0gKEhJRl9ERVZJQ0UgKilremFsbG9jKHNpemVvZihISUZfREVWSUNFKSwgR0ZQX0tFUk5FTCk7CisgICAgaGlmZGV2aWNlID0ga3phbGxvYyhzaXplb2YoSElGX0RFVklDRSksIEdGUF9LRVJORUwpOwogICAgIEFSX0RFQlVHX0FTU0VSVChoaWZkZXZpY2UgIT0gTlVMTCk7CiAjaWYgSElGX1VTRV9ETUFfQk9VTkNFX0JVRkZFUgogICAgIGhpZmRldmljZS0+ZG1hX2J1ZmZlciA9IGttYWxsb2MoSElGX0RNQV9CVUZGRVJfU0laRSwgR0ZQX0tFUk5FTCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYXRoNmtsL29zL2xpbnV4L2FyNjAwMF9kcnYuYyBiL2RyaXZlcnMvc3RhZ2luZy9hdGg2a2wvb3MvbGludXgvYXI2MDAwX2Rydi5jCmluZGV4IGE2NTlmNzAuLjEyNmEzNmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9hdGg2a2wvb3MvbGludXgvYXI2MDAwX2Rydi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9hdGg2a2wvb3MvbGludXgvYXI2MDAwX2Rydi5jCkBAIC00NDM5LDcgKzQ0MzksNyBAQAogICAgICAgICBmb3IgKGkgPSBhc3NvY19yZXFfaWVfcG9zOyBpIDwgYXNzb2NfcmVxX2llX3BvcyArIGFzc29jUmVxTGVuIC0gNDsgaSsrKSB7CiAgICAgICAgICAgICBBUl9ERUJVR19QUklOVEYoQVRIX0RFQlVHX1dMQU5fQ09OTkVDVCwoIiUyLjJ4ICIsIGFzc29jSW5mb1tpXSkpOwogICAgICAgICAgICAgc3ByaW50Zihwb3MsICIlMi4yeCIsIGFzc29jSW5mb1tpXSk7Ci0gICAgICAgICAgICBwb3MgKz0gMjs7CisgICAgICAgICAgICBwb3MgKz0gMjsKICAgICAgICAgfQogICAgICAgICBBUl9ERUJVR19QUklOVEYoQVRIX0RFQlVHX1dMQU5fQ09OTkVDVCwoIlxuIikpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYXV0b2ZzL2Rpcmhhc2guYyBiL2RyaXZlcnMvc3RhZ2luZy9hdXRvZnMvZGlyaGFzaC5jCmluZGV4IDhmM2UyYjguLmQzZjQyYzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9hdXRvZnMvZGlyaGFzaC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9hdXRvZnMvZGlyaGFzaC5jCkBAIC0zMCw3ICszMCw3IEBACiAJCQkgc3RydWN0IGF1dG9mc19kaXJfZW50ICplbnQpCiB7CiAJYXV0b2ZzX2RlbGV0ZV91c2FnZShlbnQpOyAgIC8qIFVubGluayBmcm9tIGN1cnJlbnQgcG9zaXRpb24gKi8KLQlhdXRvZnNfaW5pdF91c2FnZShkaCxlbnQpOyAgLyogUmVsaW5rIGF0IHF1ZXVlIHRhaWwgKi8KKwlhdXRvZnNfaW5pdF91c2FnZShkaCwgZW50KTsgIC8qIFJlbGluayBhdCBxdWV1ZSB0YWlsICovCiB9CiAKIHN0cnVjdCBhdXRvZnNfZGlyX2VudCAqYXV0b2ZzX2V4cGlyZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLApAQCAtNDUsMTcgKzQ1LDE4IEBACiAJCXN0cnVjdCBwYXRoIHBhdGg7CiAJCWludCB1bW91bnRfb2s7CiAKLQkJaWYgKCBsaXN0X2VtcHR5KCZkaC0+ZXhwaXJ5X2hlYWQpIHx8IHNiaS0+Y2F0YXRvbmljICkKKwkJaWYgKGxpc3RfZW1wdHkoJmRoLT5leHBpcnlfaGVhZCkgfHwgc2JpLT5jYXRhdG9uaWMpCiAJCQlyZXR1cm4gTlVMTDsJLyogTm8gZW50cmllcyAqLwogCQkvKiBXZSBrZWVwIHRoZSBsaXN0IHNvcnRlZCBieSBsYXN0X3VzYWdlIGFuZCB3YW50IG9sZCBzdHVmZiAqLwotCQllbnQgPSBsaXN0X2VudHJ5KGRoLT5leHBpcnlfaGVhZC5uZXh0LCBzdHJ1Y3QgYXV0b2ZzX2Rpcl9lbnQsIGV4cCk7CisJCWVudCA9IGxpc3RfZW50cnkoZGgtPmV4cGlyeV9oZWFkLm5leHQsCisJCQkJCQlzdHJ1Y3QgYXV0b2ZzX2Rpcl9lbnQsIGV4cCk7CiAJCWlmIChqaWZmaWVzIC0gZW50LT5sYXN0X3VzYWdlIDwgdGltZW91dCkKIAkJCWJyZWFrOwogCQkvKiBNb3ZlIHRvIGVuZCBvZiBsaXN0IGluIGNhc2UgZXhwaXJ5IGlzbid0IGRlc2lyYWJsZSAqLwogCQlhdXRvZnNfdXBkYXRlX3VzYWdlKGRoLCBlbnQpOwogCiAJCS8qIENoZWNrIHRvIHNlZSB0aGF0IGVudHJ5IGlzIGV4cGlyYWJsZSAqLwotCQlpZiAoIGVudC0+aW5vIDwgQVVUT0ZTX0ZJUlNUX0RJUl9JTk8gKQorCQlpZiAoZW50LT5pbm8gPCBBVVRPRlNfRklSU1RfRElSX0lOTykKIAkJCXJldHVybiBlbnQ7IC8qIFN5bWxpbmtzIGFyZSBhbHdheXMgZXhwaXJhYmxlICovCiAKIAkJLyogR2V0IHRoZSBkZW50cnkgZm9yIHRoZSBhdXRvZnMgc3ViZGlyZWN0b3J5ICovCkBAIC02MywxNCArNjQsMTUgQEAKIAogCQlpZiAoIXBhdGguZGVudHJ5KSB7CiAJCQkvKiBTaG91bGQgb25seSBoYXBwZW4gaW4gY2F0YXRvbmljIG1vZGUgKi8KLQkJCXByaW50aygiYXV0b2ZzOiBkZW50cnkgPT0gTlVMTCBidXQgaW5vZGUgcmFuZ2UgaXMgZGlyZWN0b3J5LCBlbnRyeSAlc1xuIiwgZW50LT5uYW1lKTsKKwkJCXByaW50ayhLRVJOX0RFQlVHICJhdXRvZnM6IGRlbnRyeSA9PSBOVUxMIGJ1dCBpbm9kZSBcCisJCQkJcmFuZ2UgaXMgZGlyZWN0b3J5LCBlbnRyeSAlc1xuIiwgZW50LT5uYW1lKTsKIAkJCWF1dG9mc19kZWxldGVfdXNhZ2UoZW50KTsKIAkJCWNvbnRpbnVlOwogCQl9CiAKIAkJaWYgKCFwYXRoLmRlbnRyeS0+ZF9pbm9kZSkgewogCQkJZHB1dChwYXRoLmRlbnRyeSk7Ci0JCQlwcmludGsoImF1dG9mczogbmVnYXRpdmUgZGVudHJ5IG9uIGV4cGlyeSBxdWV1ZTogJXNcbiIsCisJCQlwcmludGsoS0VSTl9ERUJVRyAiYXV0b2ZzOiBuZWdhdGl2ZSBkZW50cnkgb24gZXhwaXJ5IHF1ZXVlOiAlc1xuIiwKIAkJCSAgICAgICBlbnQtPm5hbWUpOwogCQkJYXV0b2ZzX2RlbGV0ZV91c2FnZShlbnQpOwogCQkJY29udGludWU7CkBAIC04MCwxNCArODIsMTYgQEAKIAkJICAgcG9pbnQgdG8gdGhlIG1vdW50ZWQtb24tdG9wIHJvb3QuICovCiAJCWlmICghU19JU0RJUihwYXRoLmRlbnRyeS0+ZF9pbm9kZS0+aV9tb2RlKSB8fAogCQkgICAgIWRfbW91bnRwb2ludChwYXRoLmRlbnRyeSkpIHsKLQkJCURQUklOVEsoKCJhdXRvZnM6IG5vdCBleHBpcmFibGUgKG5vdCBhIG1vdW50ZWQgZGlyZWN0b3J5KTogJXNcbiIsIGVudC0+bmFtZSkpOworCQkJRFBSSU5USygoImF1dG9mczogbm90IGV4cGlyYWJsZSBcCisJCQkJKG5vdCBhIG1vdW50ZWQgZGlyZWN0b3J5KTogJXNcbiIsIGVudC0+bmFtZSkpOwogCQkJY29udGludWU7CiAJCX0KIAkJcGF0aC5tbnQgPSBtbnQ7CiAJCXBhdGhfZ2V0KCZwYXRoKTsKIAkJaWYgKCFmb2xsb3dfZG93bigmcGF0aCkpIHsKIAkJCXBhdGhfcHV0KCZwYXRoKTsKLQkJCURQUklOVEsoKCJhdXRvZnM6IG5vdCBleHBpcmFibGUgKG5vdCBhIG1vdW50ZWQgZGlyZWN0b3J5KTogJXNcbiIsIGVudC0+bmFtZSkpOworCQkJRFBSSU5USygoImF1dG9mczogbm90IGV4cGlyYWJsZVwKKwkJCShub3QgYSBtb3VudGVkIGRpcmVjdG9yeSk6ICVzXG4iLCBlbnQtPm5hbWUpKTsKIAkJCWNvbnRpbnVlOwogCQl9CiAJCXdoaWxlIChkX21vdW50cG9pbnQocGF0aC5kZW50cnkpICYmIGZvbGxvd19kb3duKCZwYXRoKSkKQEAgLTk2LDMwICsxMDAsMzcgQEAKIAkJcGF0aF9wdXQoJnBhdGgpOwogCiAJCWlmICh1bW91bnRfb2spIHsKLQkJCURQUklOVEsoKCJhdXRvZnM6IHNpZ25hbGluZyBleHBpcmUgb24gJXNcbiIsIGVudC0+bmFtZSkpOworCQkJRFBSSU5USygoImF1dG9mczogc2lnbmFsaW5nIGV4cGlyZSBvbiAlc1xuIiwKKwkJCQkJCQkJZW50LT5uYW1lKSk7CiAJCQlyZXR1cm4gZW50OyAvKiBFeHBpcmFibGUhICovCiAJCX0KLQkJRFBSSU5USygoImF1dG9mczogZGlkbid0IGV4cGlyZSBkdWUgdG8gbWF5X3Vtb3VudDogJXNcbiIsIGVudC0+bmFtZSkpOworCisJCURQUklOVEsoKCJhdXRvZnM6IGRpZG4ndCBleHBpcmUgZHVlIHRvIG1heV91bW91bnQ6ICVzXG4iLAorCQkJCQkJCQllbnQtPm5hbWUpKTsKIAl9CiAJcmV0dXJuIE5VTEw7CQkvKiBObyBleHBpcmFibGUgZW50cmllcyAqLwogfQogCi12b2lkIGF1dG9mc19pbml0aWFsaXplX2hhc2goc3RydWN0IGF1dG9mc19kaXJoYXNoICpkaCkgewordm9pZCBhdXRvZnNfaW5pdGlhbGl6ZV9oYXNoKHN0cnVjdCBhdXRvZnNfZGlyaGFzaCAqZGgpCit7CiAJbWVtc2V0KCZkaC0+aCwgMCwgQVVUT0ZTX0hBU0hfU0laRSpzaXplb2Yoc3RydWN0IGF1dG9mc19kaXJfZW50ICopKTsKIAlJTklUX0xJU1RfSEVBRCgmZGgtPmV4cGlyeV9oZWFkKTsKIH0KIAotc3RydWN0IGF1dG9mc19kaXJfZW50ICphdXRvZnNfaGFzaF9sb29rdXAoY29uc3Qgc3RydWN0IGF1dG9mc19kaXJoYXNoICpkaCwgc3RydWN0IHFzdHIgKm5hbWUpCitzdHJ1Y3QgYXV0b2ZzX2Rpcl9lbnQgKmF1dG9mc19oYXNoX2xvb2t1cChjb25zdCBzdHJ1Y3QgYXV0b2ZzX2Rpcmhhc2ggKmRoLAorCQkJCQkJc3RydWN0IHFzdHIgKm5hbWUpCiB7CiAJc3RydWN0IGF1dG9mc19kaXJfZW50ICpkaG47CiAKIAlEUFJJTlRLKCgiYXV0b2ZzX2hhc2hfbG9va3VwOiBoYXNoID0gMHglMDh4LCBuYW1lID0gIiwgbmFtZS0+aGFzaCkpOwotCWF1dG9mc19zYXkobmFtZS0+bmFtZSxuYW1lLT5sZW4pOworCWF1dG9mc19zYXkobmFtZS0+bmFtZSwgbmFtZS0+bGVuKTsKIAotCWZvciAoIGRobiA9IGRoLT5oWyh1bnNpZ25lZCkgbmFtZS0+aGFzaCAlIEFVVE9GU19IQVNIX1NJWkVdIDsgZGhuIDsgZGhuID0gZGhuLT5uZXh0ICkgewotCQlpZiAoIG5hbWUtPmhhc2ggPT0gZGhuLT5oYXNoICYmCisJZm9yIChkaG4gPSBkaC0+aFsodW5zaWduZWQpIG5hbWUtPmhhc2ggJSBBVVRPRlNfSEFTSF9TSVpFXTsKKwkJZGhuOworCQlkaG4gPSBkaG4tPm5leHQpIHsKKwkJaWYgKG5hbWUtPmhhc2ggPT0gZGhuLT5oYXNoICYmCiAJCSAgICAgbmFtZS0+bGVuID09IGRobi0+bGVuICYmCi0JCSAgICAgIW1lbWNtcChuYW1lLT5uYW1lLCBkaG4tPm5hbWUsIG5hbWUtPmxlbikgKQorCQkgICAgICFtZW1jbXAobmFtZS0+bmFtZSwgZGhuLT5uYW1lLCBuYW1lLT5sZW4pKQogCQkJYnJlYWs7CiAJfQogCkBAIC0xMzEsOSArMTQyLDkgQEAKIAlzdHJ1Y3QgYXV0b2ZzX2Rpcl9lbnQgKipkaG5wOwogCiAJRFBSSU5USygoImF1dG9mc19oYXNoX2luc2VydDogaGFzaCA9IDB4JTA4eCwgbmFtZSA9ICIsIGVudC0+aGFzaCkpOwotCWF1dG9mc19zYXkoZW50LT5uYW1lLGVudC0+bGVuKTsKKwlhdXRvZnNfc2F5KGVudC0+bmFtZSwgZW50LT5sZW4pOwogCi0JYXV0b2ZzX2luaXRfdXNhZ2UoZGgsZW50KTsKKwlhdXRvZnNfaW5pdF91c2FnZShkaCwgZW50KTsKIAlpZiAoZW50LT5kZW50cnkpCiAJCWRnZXQoZW50LT5kZW50cnkpOwogCkBAIC0xNDEsMTkgKzE1MiwxOSBAQAogCWVudC0+bmV4dCA9ICpkaG5wOwogCWVudC0+YmFjayA9IGRobnA7CiAJKmRobnAgPSBlbnQ7Ci0JaWYgKCBlbnQtPm5leHQgKQorCWlmIChlbnQtPm5leHQpCiAJCWVudC0+bmV4dC0+YmFjayA9ICYoZW50LT5uZXh0KTsKIH0KIAogdm9pZCBhdXRvZnNfaGFzaF9kZWxldGUoc3RydWN0IGF1dG9mc19kaXJfZW50ICplbnQpCiB7CiAJKihlbnQtPmJhY2spID0gZW50LT5uZXh0OwotCWlmICggZW50LT5uZXh0ICkKKwlpZiAoZW50LT5uZXh0KQogCQllbnQtPm5leHQtPmJhY2sgPSBlbnQtPmJhY2s7CiAKIAlhdXRvZnNfZGVsZXRlX3VzYWdlKGVudCk7CiAKLQlpZiAoIGVudC0+ZGVudHJ5ICkKKwlpZiAoZW50LT5kZW50cnkpCiAJCWRwdXQoZW50LT5kZW50cnkpOwogCWtmcmVlKGVudC0+bmFtZSk7CiAJa2ZyZWUoZW50KTsKQEAgLTE3NiwzNyArMTg3LDM3IEBACiAJYnVja2V0ID0gKCpwdHIgPj4gMTYpIC0gMTsKIAllY291bnQgPSAqcHRyICYgMHhmZmZmOwogCi0JaWYgKCBidWNrZXQgPCAwICkgeworCWlmIChidWNrZXQgPCAwKQogCQlidWNrZXQgPSBlY291bnQgPSAwOwotCX0gCiAKIAlEUFJJTlRLKCgiYXV0b2ZzX2hhc2hfZW51bTogYnVja2V0ICVkLCBlbnRyeSAlZFxuIiwgYnVja2V0LCBlY291bnQpKTsKIAogCWVudCA9IGxhc3QgPyBsYXN0LT5uZXh0IDogTlVMTDsKIAotCWlmICggZW50ICkgeworCWlmIChlbnQpIHsKIAkJZWNvdW50Kys7CiAJfSBlbHNlIHsKLQkJd2hpbGUgICggYnVja2V0IDwgQVVUT0ZTX0hBU0hfU0laRSApIHsKKwkJd2hpbGUgIChidWNrZXQgPCBBVVRPRlNfSEFTSF9TSVpFKSB7CiAJCQllbnQgPSBkaC0+aFtidWNrZXRdOwotCQkJZm9yICggaSA9IGVjb3VudCA7IGVudCAmJiBpIDsgaS0tICkKKwkJCWZvciAoaSA9IGVjb3VudCA7IGVudCAmJiBpIDsgaS0tKQogCQkJCWVudCA9IGVudC0+bmV4dDsKLQkJCQorCiAJCQlpZiAoZW50KSB7CiAJCQkJZWNvdW50Kys7IC8qIFBvaW50IHRvICpuZXh0KiBlbnRyeSAqLwogCQkJCWJyZWFrOwogCQkJfQotCQkJCisKIAkJCWJ1Y2tldCsrOyBlY291bnQgPSAwOwogCQl9CiAJfQogCiAjaWZkZWYgREVCVUcKLQlpZiAoICFlbnQgKQotCQlwcmludGsoImF1dG9mc19oYXNoX2VudW06IG5vdGhpbmcgZm91bmRcbiIpOworCWlmICghZW50KQorCQlwcmludGsoS0VSTl9ERUJVRyAiYXV0b2ZzX2hhc2hfZW51bTogbm90aGluZyBmb3VuZFxuIik7CiAJZWxzZSB7Ci0JCXByaW50aygiYXV0b2ZzX2hhc2hfZW51bTogZm91bmQgaGFzaCAlMDh4LCBuYW1lIiwgZW50LT5oYXNoKTsKLQkJYXV0b2ZzX3NheShlbnQtPm5hbWUsZW50LT5sZW4pOworCQlwcmludGsoS0VSTl9ERUJVRyAiYXV0b2ZzX2hhc2hfZW51bTogZm91bmQgaGFzaCAlMDh4LCBuYW1lIiwKKwkJCQkJCQkJZW50LT5oYXNoKTsKKwkJYXV0b2ZzX3NheShlbnQtPm5hbWUsIGVudC0+bGVuKTsKIAl9CiAjZW5kaWYKIApAQCAtMjIxLDkgKzIzMiw5IEBACiAJaW50IGk7CiAJc3RydWN0IGF1dG9mc19kaXJfZW50ICplbnQ7CiAKLQlmb3IgKCBpID0gMCA7IGkgPCBBVVRPRlNfSEFTSF9TSVpFIDsgaSsrICkgewotCQlmb3IgKCBlbnQgPSBkaC0+aFtpXSA7IGVudCA7IGVudCA9IGVudC0+bmV4dCApIHsKLQkJCWlmICggZW50LT5kZW50cnkgKSB7CisJZm9yIChpID0gMCA7IGkgPCBBVVRPRlNfSEFTSF9TSVpFIDsgaSsrKSB7CisJCWZvciAoZW50ID0gZGgtPmhbaV0gOyBlbnQgOyBlbnQgPSBlbnQtPm5leHQpIHsKKwkJCWlmIChlbnQtPmRlbnRyeSkgewogCQkJCWRwdXQoZW50LT5kZW50cnkpOwogCQkJCWVudC0+ZGVudHJ5ID0gTlVMTDsKIAkJCX0KQEAgLTIzOCwxMCArMjQ5LDEwIEBACiAJaW50IGk7CiAJc3RydWN0IGF1dG9mc19kaXJfZW50ICplbnQsICpuZW50OwogCi0JZm9yICggaSA9IDAgOyBpIDwgQVVUT0ZTX0hBU0hfU0laRSA7IGkrKyApIHsKLQkJZm9yICggZW50ID0gc2JpLT5kaXJoYXNoLmhbaV0gOyBlbnQgOyBlbnQgPSBuZW50ICkgeworCWZvciAoaSA9IDAgOyBpIDwgQVVUT0ZTX0hBU0hfU0laRSA7IGkrKykgeworCQlmb3IgKGVudCA9IHNiaS0+ZGlyaGFzaC5oW2ldIDsgZW50IDsgZW50ID0gbmVudCkgewogCQkJbmVudCA9IGVudC0+bmV4dDsKLQkJCWlmICggZW50LT5kZW50cnkgKQorCQkJaWYgKGVudC0+ZGVudHJ5KQogCQkJCWRwdXQoZW50LT5kZW50cnkpOwogCQkJa2ZyZWUoZW50LT5uYW1lKTsKIAkJCWtmcmVlKGVudCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9LY29uZmlnIGIvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvS2NvbmZpZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODU1M2YzNS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9LY29uZmlnCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotIwotIyBCLkEuVC5NLkEuTiBtZXNoaW5nIHByb3RvY29sCi0jCi0KLWNvbmZpZyBCQVRNQU5fQURWCi0JdHJpc3RhdGUgIkIuQS5ULk0uQS5OLiBBZHZhbmNlZCBNZXNoaW5nIFByb3RvY29sIgotCWRlcGVuZHMgb24gTkVUCi0gICAgICAgIGRlZmF1bHQgbgotCS0tLWhlbHAtLS0KLQotICAgICAgICBCLkEuVC5NLkEuTi4gKGJldHRlciBhcHByb2FjaCB0byBtb2JpbGUgYWQtaG9jIG5ldHdvcmtpbmcpIGlzCi0gICAgICAgIGEgcm91dGluZyBwcm90b2NvbCBmb3IgbXVsdGktaG9wIGFkLWhvYyBtZXNoIG5ldHdvcmtzLiBUaGUKLSAgICAgICAgbmV0d29ya3MgbWF5IGJlIHdpcmVkIG9yIHdpcmVsZXNzLiBTZWUKLSAgICAgICAgaHR0cDovL3d3dy5vcGVuLW1lc2gub3JnLyBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhbmQgdXNlciBzcGFjZQotICAgICAgICB0b29scy4KLQotY29uZmlnIEJBVE1BTl9BRFZfREVCVUcKLQlib29sICJCLkEuVC5NLkEuTi4gZGVidWdnaW5nIgotCWRlcGVuZHMgb24gQkFUTUFOX0FEViAhPSBuCi0JLS0taGVscC0tLQotCi0JICBUaGlzIGlzIGFuIG9wdGlvbiBmb3IgdXNlIGJ5IGRldmVsb3BlcnM7IG1vc3QgcGVvcGxlIHNob3VsZAotCSAgc2F5IE4gaGVyZS4gVGhpcyBlbmFibGVzIGNvbXBpbGF0aW9uIG9mIHN1cHBvcnQgZm9yCi0JICBvdXRwdXR0aW5nIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiB0byB0aGUga2VybmVsIGxvZy4gVGhlCi0JICBvdXRwdXQgaXMgY29udHJvbGxlZCB2aWEgdGhlIG1vZHVsZSBwYXJhbWV0ZXIgZGVidWcuCi0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L01ha2VmaWxlIGIvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvTWFrZWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4OTI0MjguLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvTWFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0jCi0jIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIEIuQS5ULk0uQS5OLiBjb250cmlidXRvcnM6Ci0jCi0jIE1hcmVrIExpbmRuZXIsIFNpbW9uIFd1bmRlcmxpY2gKLSMKLSMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0jIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0jCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSMgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCi0jIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQotIyAwMjExMC0xMzAxLCBVU0EKLSMKLQotb2JqLSQoQ09ORklHX0JBVE1BTl9BRFYpICs9IGJhdG1hbi1hZHYubwotYmF0bWFuLWFkdi15IDo9IG1haW4ubyBiYXRfZGVidWdmcy5vIGJhdF9zeXNmcy5vIHNlbmQubyByb3V0aW5nLm8gc29mdC1pbnRlcmZhY2UubyBpY21wX3NvY2tldC5vIHRyYW5zbGF0aW9uLXRhYmxlLm8gYml0YXJyYXkubyBoYXNoLm8gcmluZ19idWZmZXIubyB2aXMubyBoYXJkLWludGVyZmFjZS5vIGFnZ3JlZ2F0aW9uLm8gb3JpZ2luYXRvci5vIHVuaWNhc3QubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvUkVBRE1FIGIvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvUkVBRE1FCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Yzg3OGJiLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L1JFQURNRQorKysgL2Rldi9udWxsCkBAIC0xLDI0MCArMCwwIEBACi1bc3RhdGU6IDA0LTA5LTIwMTBdCi0KLUJBVE1BTi1BRFYKLS0tLS0tLS0tLS0KLQotQmF0bWFuICBhZHZhbmNlZCAgaXMgIGEgbmV3IGFwcHJvYWNoIHRvIHdpcmVsZXNzIG5ldHdvcmtpbmcgd2hpY2gKLWRvZXMgbm8gbG9uZ2VyIG9wZXJhdGUgb24gdGhlIElQIGJhc2lzLiBVbmxpa2UgdGhlIGJhdG1hbiBkYWVtb24sCi13aGljaCAgZXhjaGFuZ2VzICBpbmZvcm1hdGlvbiAgdXNpbmcgVURQIHBhY2tldHMgYW5kIHNldHMgcm91dGluZwotdGFibGVzLCBiYXRtYW4tYWR2YW5jZWQgb3BlcmF0ZXMgb24gSVNPL09TSSBMYXllciAyIG9ubHkgYW5kIHVzZXMKLWFuZCAgcm91dGVzICAob3IgIGJldHRlcjogYnJpZGdlcykgRXRoZXJuZXQgRnJhbWVzLiBJdCBlbXVsYXRlcyBhCi12aXJ0dWFsIG5ldHdvcmsgc3dpdGNoIG9mIGFsbCBub2RlcyBwYXJ0aWNpcGF0aW5nLiAgVGhlcmVmb3JlIGFsbAotbm9kZXMgIGFwcGVhciAgdG8gYmUgbGluayBsb2NhbCwgdGh1cyBhbGwgaGlnaGVyIG9wZXJhdGluZyBwcm90by0KLWNvbHMgd29uJ3QgYmUgYWZmZWN0ZWQgYnkgYW55IGNoYW5nZXMgd2l0aGluIHRoZSBuZXR3b3JrLiBZb3UgY2FuCi1ydW4gYWxtb3N0IGFueSBwcm90b2NvbCBhYm92ZSBiYXRtYW4gYWR2YW5jZWQsIHByb21pbmVudCBleGFtcGxlcwotYXJlOiBJUHY0LCBJUHY2LCBESENQLCBJUFguCi0KLUJhdG1hbiBhZHZhbmNlZCB3YXMgaW1wbGVtZW50ZWQgYXMgYSBMaW51eCBrZXJuZWwgZHJpdmVyICB0byAgcmUtCi1kdWNlIHRoZSBvdmVyaGVhZCB0byBhIG1pbmltdW0uIEl0IGRvZXMgbm90IGRlcGVuZCBvbiBhbnkgKG90aGVyKQotbmV0d29yayBkcml2ZXIsIGFuZCBjYW4gYmUgdXNlZCBvbiB3aWZpIGFzIHdlbGwgYXMgZXRoZXJuZXQgIGxhbiwKLXZwbiwgIGV0YyAuLi4gKGFueXRoaW5nIHdpdGggZXRoZXJuZXQtc3R5bGUgbGF5ZXIgMikuCi0KLUNPTkZJR1VSQVRJT04KLS0tLS0tLS0tLS0tLS0KLQotTG9hZCB0aGUgYmF0bWFuLWFkdiBtb2R1bGUgaW50byB5b3VyIGtlcm5lbDoKLQotIyBpbnNtb2QgYmF0bWFuLWFkdi5rbwotCi1UaGUgIG1vZHVsZSAgaXMgbm93IHdhaXRpbmcgZm9yIGFjdGl2YXRpb24uIFlvdSBtdXN0IGFkZCBzb21lIGluLQotdGVyZmFjZXMgb24gd2hpY2ggYmF0bWFuIGNhbiBvcGVyYXRlLiBBZnRlciAgbG9hZGluZyAgdGhlICBtb2R1bGUKLWJhdG1hbiAgYWR2YW5jZWQgIHdpbGwgc2NhbiB5b3VyIHN5c3RlbXMgaW50ZXJmYWNlcyB0byBzZWFyY2ggZm9yCi1jb21wYXRpYmxlIGludGVyZmFjZXMuIE9uY2UgZm91bmQsIGl0IHdpbGwgY3JlYXRlICBzdWJmb2xkZXJzICBpbgotdGhlIC9zeXMgZGlyZWN0b3JpZXMgb2YgZWFjaCBzdXBwb3J0ZWQgaW50ZXJmYWNlLCBlLmcuCi0KLSMgbHMgL3N5cy9jbGFzcy9uZXQvZXRoMC9iYXRtYW5fYWR2LwotIyBpZmFjZV9zdGF0dXMgIG1lc2hfaWZhY2UKLQotSWYgYW4gaW50ZXJmYWNlIGRvZXMgbm90IGhhdmUgdGhlICJiYXRtYW5fYWR2IiBzdWJmb2xkZXIgaXQgcHJvYi0KLWFibHkgaXMgbm90IHN1cHBvcnRlZC4gTm90IHN1cHBvcnRlZCAgaW50ZXJmYWNlcyAgYXJlOiAgbG9vcGJhY2ssCi1ub24tZXRoZXJuZXQgYW5kIGJhdG1hbidzIG93biBpbnRlcmZhY2VzLgotCi1Ob3RlOiAgQWZ0ZXIgdGhlIG1vZHVsZSB3YXMgbG9hZGVkIGl0IHdpbGwgY29udGludW91c2x5IHdhdGNoIGZvcgotbmV3IGludGVyZmFjZXMgdG8gdmVyaWZ5IHRoZSBjb21wYXRpYmlsaXR5LiBUaGVyZSBpcyBubyAgbmVlZCAgdG8KLXJlbG9hZCB0aGUgbW9kdWxlIGlmIHlvdSBwbHVnIHlvdXIgVVNCIHdpZmkgYWRhcHRlciBpbnRvIHlvdXIgbWEtCi1jaGluZSBhZnRlciBiYXRtYW4gYWR2YW5jZWQgd2FzIGluaXRpYWxseSBsb2FkZWQuCi0KLVRvIGFjdGl2YXRlIGEgIGdpdmVuICBpbnRlcmZhY2UgIHNpbXBseSAgd3JpdGUgICJiYXQwIiAgaW50byAgaXRzCi0ibWVzaF9pZmFjZSIgZmlsZSBpbnNpZGUgdGhlIGJhdG1hbl9hZHYgc3ViZm9sZGVyOgotCi0jIGVjaG8gYmF0MCA+IC9zeXMvY2xhc3MvbmV0L2V0aDAvYmF0bWFuX2Fkdi9tZXNoX2lmYWNlCi0KLVJlcGVhdCAgdGhpcyBzdGVwIGZvciBhbGwgaW50ZXJmYWNlcyB5b3Ugd2lzaCB0byBhZGQuICBOb3cgYmF0bWFuCi1zdGFydHMgdXNpbmcvYnJvYWRjYXN0aW5nIG9uIHRoaXMvdGhlc2UgaW50ZXJmYWNlKHMpLgotCi1CeSByZWFkaW5nIHRoZSAiaWZhY2Vfc3RhdHVzIiBmaWxlIHlvdSBjYW4gY2hlY2sgaXRzIHN0YXR1czoKLQotIyBjYXQgL3N5cy9jbGFzcy9uZXQvZXRoMC9iYXRtYW5fYWR2L2lmYWNlX3N0YXR1cwotIyBhY3RpdmUKLQotVG8gZGVhY3RpdmF0ZSBhbiBpbnRlcmZhY2UgeW91IGhhdmUgIHRvICB3cml0ZSAgIm5vbmUiICBpbnRvICBpdHMKLSJtZXNoX2lmYWNlIiBmaWxlOgotCi0jIGVjaG8gbm9uZSA+IC9zeXMvY2xhc3MvbmV0L2V0aDAvYmF0bWFuX2Fkdi9tZXNoX2lmYWNlCi0KLQotQWxsICBtZXNoICB3aWRlICBzZXR0aW5ncyAgY2FuIGJlIGZvdW5kIGluIGJhdG1hbidzIG93biBpbnRlcmZhY2UKLWZvbGRlcjoKLQotIyAgbHMgIC9zeXMvY2xhc3MvbmV0L2JhdDAvbWVzaC8KLSMgIGFnZ3JlZ2F0ZWRfb2dtcyAgYm9uZGluZyAgb3JpZ19pbnRlcnZhbCAgdmlzX21vZGUKLQotCi1UaGVyZSBpcyBhIHNwZWNpYWwgZm9sZGVyIGZvciBkZWJ1Z2dpbmcgaW5mb3JtYXRpb25zOgotCi0jICBscyAvc3lzL2tlcm5lbC9kZWJ1Zy9iYXRtYW5fYWR2L2JhdDAvCi0jICBvcmlnaW5hdG9ycyAgc29ja2V0ICB0cmFuc3RhYmxlX2dsb2JhbCAgdHJhbnN0YWJsZV9sb2NhbAotIyAgdmlzX2RhdGEKLQotCi1Tb21lIG9mIHRoZSBmaWxlcyBjb250YWluIGFsbCBzb3J0IG9mIHN0YXR1cyBpbmZvcm1hdGlvbiAgcmVnYXJkLQotaW5nICB0aGUgIG1lc2ggIG5ldHdvcmsuICBGb3IgIGV4YW1wbGUsIHlvdSBjYW4gdmlldyB0aGUgdGFibGUgb2YKLW9yaWdpbmF0b3JzIChtZXNoIHBhcnRpY2lwYW50cykgd2l0aDoKLQotIyBjYXQgL3N5cy9rZXJuZWwvZGVidWcvYmF0bWFuX2Fkdi9iYXQwL29yaWdpbmF0b3JzCi0KLU90aGVyIGZpbGVzIGFsbG93IHRvIGNoYW5nZSBiYXRtYW4ncyBiZWhhdmlvdXIgdG8gYmV0dGVyIGZpdCB5b3VyCi1yZXF1aXJlbWVudHMuICBGb3IgaW5zdGFuY2UsIHlvdSBjYW4gY2hlY2sgdGhlIGN1cnJlbnQgb3JpZ2luYXRvcgotaW50ZXJ2YWwgKHZhbHVlIGluIG1pbGxpc2Vjb25kcyB3aGljaCBkZXRlcm1pbmVzIGhvdyBvZnRlbiBiYXRtYW4KLXNlbmRzIGl0cyBicm9hZGNhc3QgcGFja2V0cyk6Ci0KLSMgY2F0IC9zeXMvY2xhc3MvbmV0L2JhdDAvbWVzaC9vcmlnX2ludGVydmFsCi0jIDEwMDAKLQotYW5kIGFsc28gY2hhbmdlIGl0cyB2YWx1ZToKLQotIyBlY2hvIDMwMDAgPiAvc3lzL2NsYXNzL25ldC9iYXQwL21lc2gvb3JpZ19pbnRlcnZhbAotCi1JbiB2ZXJ5IG1vYmlsZSBzY2VuYXJpb3MsIHlvdSBtaWdodCB3YW50IHRvIGFkanVzdCB0aGUgb3JpZ2luYXRvcgotaW50ZXJ2YWwgdG8gYSBsb3dlciB2YWx1ZS4gVGhpcyB3aWxsIG1ha2UgdGhlIG1lc2ggIG1vcmUgIHJlc3Bvbi0KLXNpdmUgdG8gdG9wb2xvZ3kgY2hhbmdlcywgYnV0IHdpbGwgYWxzbyBpbmNyZWFzZSB0aGUgb3ZlcmhlYWQuCi0KLQotVVNBR0UKLS0tLS0tCi0KLVRvICBtYWtlIHVzZSBvZiB5b3VyIG5ld2x5IGNyZWF0ZWQgbWVzaCwgYmF0bWFuIGFkdmFuY2VkIHByb3ZpZGVzCi1hIG5ldyBpbnRlcmZhY2UgImJhdDAiIHdoaWNoIHlvdSBzaG91bGQgdXNlIGZyb20gdGhpcyAgcG9pbnQgIG9uLgotQWxsICBpbnRlcmZhY2VzICBhZGRlZCAgdG8gIGJhdG1hbiAgYWR2YW5jZWQgYXJlIG5vdCByZWxldmFudCBhbnkKLWxvbmdlciBiZWNhdXNlIGJhdG1hbiBoYW5kbGVzIHRoZW0gZm9yIHlvdS4gQmFzaWNhbGx5LCBvbmUgImhhbmRzCi1vdmVyIiB0aGUgZGF0YSBieSB1c2luZyB0aGUgYmF0bWFuIGludGVyZmFjZSBhbmQgYmF0bWFuIHdpbGwgbWFrZQotc3VyZSBpdCByZWFjaGVzIGl0cyBkZXN0aW5hdGlvbi4KLQotVGhlICJiYXQwIiBpbnRlcmZhY2UgY2FuIGJlIHVzZWQgbGlrZSBhbnkgIG90aGVyICByZWd1bGFyICBpbnRlci0KLWZhY2UuICBJdCBuZWVkcyBhbiBJUCBhZGRyZXNzIHdoaWNoIGNhbiBiZSBlaXRoZXIgc3RhdGljYWxseSBjb24tCi1maWd1cmVkIG9yIGR5bmFtaWNhbGx5IChieSB1c2luZyBESENQIG9yIHNpbWlsYXIgc2VydmljZXMpOgotCi0jIE5vZGVBOiBpZmNvbmZpZyBiYXQwIDE5Mi4xNjguMC4xCi0jIE5vZGVCOiBpZmNvbmZpZyBiYXQwIDE5Mi4xNjguMC4yCi0jIE5vZGVCOiBwaW5nIDE5Mi4xNjguMC4xCi0KLU5vdGU6ICBJbiAgb3JkZXIgdG8gYXZvaWQgcHJvYmxlbXMgcmVtb3ZlIGFsbCBJUCBhZGRyZXNzZXMgcHJldmktCi1vdXNseSBhc3NpZ25lZCB0byBpbnRlcmZhY2VzIG5vdyB1c2VkIGJ5IGJhdG1hbiBhZHZhbmNlZCwgZS5nLgotCi0jIGlmY29uZmlnIGV0aDAgMC4wLjAuMAotCi0KLVZJU1VBTElaQVRJT04KLS0tLS0tLS0tLS0tLS0KLQotSWYgeW91IHdhbnQgdG9wb2xvZ3kgdmlzdWFsaXphdGlvbiwgYXQgbGVhc3Qgb25lIG1lc2ggIG5vZGUgIG11c3QKLWJlIGNvbmZpZ3VyZWQgYXMgVklTLXNlcnZlcjoKLQotIyBlY2hvICJzZXJ2ZXIiID4gL3N5cy9jbGFzcy9uZXQvYmF0MC9tZXNoL3Zpc19tb2RlCi0KLUVhY2ggIG5vZGUgIGlzICBlaXRoZXIgY29uZmlndXJlZCBhcyAic2VydmVyIiBvciBhcyAiY2xpZW50IiAoZGUtCi1mYXVsdDogImNsaWVudCIpLiAgQ2xpZW50cyBzZW5kIHRoZWlyIHRvcG9sb2d5IGRhdGEgdG8gdGhlIHNlcnZlcgotbmV4dCB0byB0aGVtLCBhbmQgc2VydmVyIHN5bmNocm9uaXplIHdpdGggb3RoZXIgc2VydmVycy4gSWYgdGhlcmUKLWlzIG5vIHNlcnZlciBjb25maWd1cmVkIChkZWZhdWx0KSB3aXRoaW4gdGhlICBtZXNoLCAgbm8gIHRvcG9sb2d5Ci1pbmZvcm1hdGlvbiAgIHdpbGwgIGJlICB0cmFuc21pdHRlZC4gIFdpdGggIHRoZXNlICAic3luY2hyb25pemluZwotc2VydmVycyIsIHRoZXJlIGNhbiBiZSAxIG9yIG1vcmUgdmlzIHNlcnZlcnMgc2hhcmluZyB0aGUgc2FtZSAob3IKLWF0IGxlYXN0IHZlcnkgc2ltaWxhcikgZGF0YS4KLQotV2hlbiAgY29uZmlndXJlZCAgYXMgIHNlcnZlciwgIHlvdSBjYW4gZ2V0IGEgdG9wb2xvZ3kgc25hcHNob3Qgb2YKLXlvdXIgbWVzaDoKLQotIyBjYXQgL3N5cy9rZXJuZWwvZGVidWcvYmF0bWFuX2Fkdi9iYXQwL3Zpc19kYXRhCi0KLVRoaXMgcmF3IG91dHB1dCBpcyBpbnRlbmRlZCB0byBiZSBlYXNpbHkgcGFyc2FibGUgYW5kIGNvbnZlcnRhYmxlCi13aXRoICBvdGhlciB0b29scy4gSGF2ZSBhIGxvb2sgYXQgdGhlIGJhdGN0bCBSRUFETUUgaWYgeW91IHdhbnQgYQotdmlzIG91dHB1dCBpbiBkb3Qgb3IganNvbiBmb3JtYXQgZm9yIGluc3RhbmNlIGFuZCBob3cgdGhvc2UgIG91dC0KLXB1dHMgY291bGQgdGhlbiBiZSB2aXN1YWxpc2VkIGluIGFuIGltYWdlLgotCi1UaGUgcmF3IGZvcm1hdCBjb25zaXN0cyBvZiBjb21tYSBzZXBhcmF0ZWQgdmFsdWVzIHBlciBlbnRyeSB3aGVyZQotZWFjaCBlbnRyeSBpcyBnaXZpbmcgaW5mb3JtYXRpb24gYWJvdXQgYSAgY2VydGFpbiAgc291cmNlICBpbnRlci0KLWZhY2UuICBFYWNoICBlbnRyeSBjYW4vaGFzIHRvIGhhdmUgdGhlIGZvbGxvd2luZyB2YWx1ZXM6Ci0tPiAibWFjIiAtIG1hYyBhZGRyZXNzIG9mIGFuIG9yaWdpbmF0b3IncyBzb3VyY2UgaW50ZXJmYWNlCi0gICAgICAgICAgIChlYWNoIGxpbmUgYmVnaW5zIHdpdGggaXQpCi0tPiAiVFEgbWFjICB2YWx1ZSIgIC0gIHNyYyBtYWMncyBsaW5rIHF1YWxpdHkgdG93YXJkcyBtYWMgYWRkcmVzcwotICAgICAgICAgICAgICAgICAgICAgICBvZiBhIG5laWdoYm9yIG9yaWdpbmF0b3IncyBpbnRlcmZhY2Ugd2hpY2gKLSAgICAgICAgICAgICAgICAgICAgICAgaXMgYmVpbmcgdXNlZCBmb3Igcm91dGluZwotLT4gIkhOQSBtYWMiIC0gSE5BIGFubm91bmNlZCBieSBzb3VyY2UgbWFjCi0tPiAiUFJJTUFSWSIgLSB0aGlzICBpcyBhIHByaW1hcnkgaW50ZXJmYWNlCi0tPiAiU0VDIG1hYyIgLSBzZWNvbmRhcnkgbWFjIGFkZHJlc3Mgb2Ygc291cmNlCi0gICAgICAgICAgICAgICAocmVxdWlyZXMgcHJlY2VkaW5nIFBSSU1BUlkpCi0KLVRoZSBUUSB2YWx1ZSBoYXMgYSByYW5nZSBmcm9tIDQgdG8gMjU1IHdpdGggMjU1IGJlaW5nICB0aGUgIGJlc3QuCi1UaGUgSE5BIGVudHJpZXMgYXJlIHNob3dpbmcgd2hpY2ggaG9zdHMgYXJlIGNvbm5lY3RlZCB0byB0aGUgbWVzaAotdmlhIGJhdDAgb3IgYmVpbmcgYnJpZGdlZCBpbnRvIHRoZSBtZXNoIG5ldHdvcmsuICBUaGUgUFJJTUFSWS9TRUMKLXZhbHVlcyBhcmUgb25seSBhcHBsaWVkIG9uIHByaW1hcnkgaW50ZXJmYWNlcwotCi0KLUxPR0dJTkcvREVCVUdHSU5HCi0tLS0tLS0tLS0tLS0tLS0tLQotCi1BbGwgZXJyb3IgbWVzc2FnZXMsIHdhcm5pbmdzIGFuZCBpbmZvcm1hdGlvbiBtZXNzYWdlcyBhcmUgc2VudCB0bwotdGhlIGtlcm5lbCBsb2cuIERlcGVuZGluZyBvbiB5b3VyIG9wZXJhdGluZyAgc3lzdGVtICBkaXN0cmlidXRpb24KLXRoaXMgIGNhbiAgYmUgcmVhZCBpbiBvbmUgb2YgYSBudW1iZXIgb2Ygd2F5cy4gVHJ5IHVzaW5nIHRoZSBjb20tCi1tYW5kczogZG1lc2csIGxvZ3JlYWQsIG9yIGxvb2tpbmcgaW4gdGhlIGZpbGVzICAvdmFyL2xvZy9rZXJuLmxvZwotb3IgIC92YXIvbG9nL3N5c2xvZy4gIEFsbCAgYmF0bWFuLWFkdiAgbWVzc2FnZXMgYXJlIHByZWZpeGVkIHdpdGgKLSJiYXRtYW4tYWR2OiIgU28gdG8gc2VlIGp1c3QgdGhlc2UgbWVzc2FnZXMgdHJ5Ci0KLSMgZG1lc2cgfCBncmVwIGJhdG1hbi1hZHYKLQotV2hlbiBpbnZlc3RpZ2F0aW5nIHByb2JsZW1zIHdpdGggeW91ciBtZXNoIG5ldHdvcmsgIGl0ICBpcyAgc29tZS0KLXRpbWVzICBuZWNlc3NhcnkgIHRvIHNlZSBtb3JlIGRldGFpbCBkZWJ1ZyBtZXNzYWdlcy4gVGhpcyBtdXN0IGJlCi1lbmFibGVkIHdoZW4gY29tcGlsaW5nIHRoZSBiYXRtYW4tYWR2IG1vZHVsZS4gV2hlbiBidWlsZGluZyAgYmF0LQotbWFuLWFkdiAgYXMgIHBhcnQgb2Yga2VybmVsLCB1c2UgIm1ha2UgbWVudWNvbmZpZyIgYW5kIGVuYWJsZSB0aGUKLW9wdGlvbiAiQi5BLlQuTS5BLk4uIGRlYnVnZ2luZyIuCi0KLVRob3NlIGFkZGl0aW9uYWwgIGRlYnVnIG1lc3NhZ2VzIGNhbiBiZSBhY2Nlc3NlZCAgdXNpbmcgYSBzcGVjaWFsCi1maWxlIGluIGRlYnVnZnMKLQotIyBjYXQgL3N5cy9rZXJuZWwvZGVidWcvYmF0bWFuX2Fkdi9iYXQwL2xvZwotCi1UaGUgYWRkaXRpb25hbCBkZWJ1ZyBvdXRwdXQgaXMgYnkgZGVmYXVsdCBkaXNhYmxlZC4gSXQgY2FuIGJlIGVuLQotYWJsZWQgIGR1cmluZyBydW4gdGltZS4gRm9sbG93aW5nIGxvZ19sZXZlbHMgYXJlIGRlZmluZWQ6Ci0KLTAgLSBBbGwgIGRlYnVnICBvdXRwdXQgIGRpc2FibGVkCi0xIC0gRW5hYmxlIG1lc3NhZ2VzIHJlbGF0ZWQgdG8gcm91dGluZyAvIGZsb29kaW5nIC8gYnJvYWRjYXN0aW5nCi0yIC0gRW5hYmxlIHJvdXRlIG9yIGhuYSBhZGRlZCAvIGNoYW5nZWQgLyBkZWxldGVkCi0zIC0gRW5hYmxlIGFsbCBtZXNzYWdlcwotCi1UaGUgZGVidWcgb3V0cHV0IGNhbiBiZSBjaGFuZ2VkIGF0IHJ1bnRpbWUgIHVzaW5nICB0aGUgIGZpbGUKLS9zeXMvY2xhc3MvbmV0L2JhdDAvbWVzaC9sb2dfbGV2ZWwuIGUuZy4KLQotIyBlY2hvIDIgPiAvc3lzL2NsYXNzL25ldC9iYXQwL21lc2gvbG9nX2xldmVsCi0KLXdpbGwgZW5hYmxlIGRlYnVnIG1lc3NhZ2VzIGZvciB3aGVuIHJvdXRlcyBvciBITkFzIGNoYW5nZS4KLQotCi1CQVRDVEwKLS0tLS0tLQotCi1BcyBiYXRtYW4gYWR2YW5jZWQgb3BlcmF0ZXMgb24gbGF5ZXIgMiBhbGwgaG9zdHMgcGFydGljaXBhdGluZyBpbgotdGhlICB2aXJ0dWFsIHN3aXRjaCBhcmUgY29tcGxldGVseSB0cmFuc3BhcmVudCBmb3IgYWxsICBwcm90b2NvbHMKLWFib3ZlIGxheWVyIDIuIFRoZXJlZm9yZSB0aGUgY29tbW9uIGRpYWdub3NpcyB0b29scyBkbyAgbm90ICB3b3JrCi1hcyAgZXhwZWN0ZWQuICBUbyAgb3ZlcmNvbWUgdGhlc2UgcHJvYmxlbXMgYmF0Y3RsIHdhcyBjcmVhdGVkLiBBdAotdGhlICBtb21lbnQgdGhlICBiYXRjdGwgY29udGFpbnMgcGluZywgIHRyYWNlcm91dGUsICB0Y3BkdW1wICBhbmQKLWludGVyZmFjZXMgdG8gdGhlIGtlcm5lbCBtb2R1bGUgc2V0dGluZ3MuCi0KLUZvciBtb3JlIGluZm9ybWF0aW9uLCBwbGVhc2Ugc2VlIHRoZSBtYW5wYWdlIChtYW4gYmF0Y3RsKS4KLQotYmF0Y3RsIGlzIGF2YWlsYWJsZSBvbiBodHRwOi8vd3d3Lm9wZW4tbWVzaC5vcmcvCi0KLQotQ09OVEFDVAotLS0tLS0tLQotCi1QbGVhc2Ugc2VuZCB1cyBjb21tZW50cywgZXhwZXJpZW5jZXMsIHF1ZXN0aW9ucywgYW55dGhpbmcgOikKLQotSVJDOiAgICAgICAgICAgICNiYXRtYW4gICBvbiAgIGlyYy5mcmVlbm9kZS5vcmcKLU1haWxpbmctbGlzdDogICBiLmEudC5tLmEubkBiLmEudC5tLmEubkBsaXN0cy5vcGVuLW1lc2gub3JnCi0gICAgICAgICAgICAgICAgKG9wdGlvbmFsICAgc3Vic2NyaXB0aW9uICAgYXQKLSAgICAgICAgICAgICAgICAgaHR0cHM6Ly9saXN0cy5vcGVuLW1lc2gub3JnL21tL2xpc3RpbmZvL2IuYS50Lm0uYS5uKQotCi1Zb3UgY2FuIGFsc28gY29udGFjdCB0aGUgQXV0aG9yczoKLQotTWFyZWsgIExpbmRuZXIgIDxsaW5kbmVyX21hcmVrQHlhaG9vLmRlPgotU2ltb24gIFd1bmRlcmxpY2ggIDxzaXd1QGhyei50dS1jaGVtbml0ei5kZT4KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvVE9ETyBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L1RPRE8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExYzM4NGYuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvVE9ETworKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLSAqIHJlbW92ZSBvd24gbGlzdCBmdW5jdGlvbmFsaXR5IGZyb20gaGFzaAotICogdXNlIGhsaXN0X2hlYWQsIGhsaXN0X25vZGUgaW4gaGFzaAotICogZG9uJ3QgdXNlIGNhbGxiYWNrcyBmb3IgY29tcGFyZStjaG9vc2UgaW4gaGFzaAotICogdGhpbmsgYWJvdXQgbW9yZSBlZmZpY2llbnQgd2F5cyBpbnN0ZWFkIG9mIGFic3RyYWN0aW9uIG9mIGhhc2gKLSAqIFJlcXVlc3QgYSBuZXcgcmV2aWV3Ci0gKiBQcm9jZXNzIHRoZSBjb21tZW50cyBmcm9tIHRoZSByZXZpZXcKLSAqIE1vdmUgaW50byBtYWlubGluZSBwcm9wZXIKLQotUGxlYXNlIHNlbmQgYWxsIHBhdGNoZXMgdG86Ci0JTWFyZWsgTGluZG5lciA8bGluZG5lcl9tYXJla0B5YWhvby5kZT4KLQlTaW1vbiBXdW5kZXJsaWNoIDxzaXd1QGhyei50dS1jaGVtbml0ei5kZT4KLQlBbmRyZXcgTHVubiA8YW5kcmV3QGx1bm4uY2g+Ci0JYi5hLnQubS5hLm5AbGlzdHMub3Blbi1tZXNoLm9yZwotCUdyZWcgS3JvYWgtSGFydG1hbiA8Z3JlZ2toQHN1c2UuZGU+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9hZ2dyZWdhdGlvbi5jIGIvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvYWdncmVnYXRpb24uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDg2MjRkNC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9hZ2dyZWdhdGlvbi5jCisrKyAvZGV2L251bGwKQEAgLTEsMjc1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBCLkEuVC5NLkEuTi4gY29udHJpYnV0b3JzOgotICoKLSAqIE1hcmVrIExpbmRuZXIsIFNpbW9uIFd1bmRlcmxpY2gKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKLSAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKLSAqIDAyMTEwLTEzMDEsIFVTQQotICoKLSAqLwotCi0jaW5jbHVkZSAibWFpbi5oIgotI2luY2x1ZGUgImFnZ3JlZ2F0aW9uLmgiCi0jaW5jbHVkZSAic2VuZC5oIgotI2luY2x1ZGUgInJvdXRpbmcuaCIKLQotLyogY2FsY3VsYXRlIHRoZSBzaXplIG9mIHRoZSBobmEgaW5mb3JtYXRpb24gZm9yIGEgZ2l2ZW4gcGFja2V0ICovCi1zdGF0aWMgaW50IGhuYV9sZW4oc3RydWN0IGJhdG1hbl9wYWNrZXQgKmJhdG1hbl9wYWNrZXQpCi17Ci0JcmV0dXJuIGJhdG1hbl9wYWNrZXQtPm51bV9obmEgKiBFVEhfQUxFTjsKLX0KLQotLyogcmV0dXJuIHRydWUgaWYgbmV3X3BhY2tldCBjYW4gYmUgYWdncmVnYXRlZCB3aXRoIGZvcndfcGFja2V0ICovCi1zdGF0aWMgYm9vbCBjYW5fYWdncmVnYXRlX3dpdGgoc3RydWN0IGJhdG1hbl9wYWNrZXQgKm5ld19iYXRtYW5fcGFja2V0LAotCQkJICAgICAgIGludCBwYWNrZXRfbGVuLAotCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgc2VuZF90aW1lLAotCQkJICAgICAgIGJvb2wgZGlyZWN0bGluaywKLQkJCSAgICAgICBzdHJ1Y3QgYmF0bWFuX2lmICppZl9pbmNvbWluZywKLQkJCSAgICAgICBzdHJ1Y3QgZm9yd19wYWNrZXQgKmZvcndfcGFja2V0KQotewotCXN0cnVjdCBiYXRtYW5fcGFja2V0ICpiYXRtYW5fcGFja2V0ID0KLQkJKHN0cnVjdCBiYXRtYW5fcGFja2V0ICopZm9yd19wYWNrZXQtPnNrYi0+ZGF0YTsKLQlpbnQgYWdncmVnYXRlZF9ieXRlcyA9IGZvcndfcGFja2V0LT5wYWNrZXRfbGVuICsgcGFja2V0X2xlbjsKLQotCS8qKgotCSAqIHdlIGNhbiBhZ2dyZWdhdGUgdGhlIGN1cnJlbnQgcGFja2V0IHRvIHRoaXMgYWdncmVnYXRlZCBwYWNrZXQKLQkgKiBpZjoKLQkgKgotCSAqIC0gdGhlIHNlbmQgdGltZSBpcyB3aXRoaW4gb3VyIE1BWF9BR0dSRUdBVElPTl9NUyB0aW1lCi0JICogLSB0aGUgcmVzdWx0aW5nIHBhY2tldCB3b250IGJlIGJpZ2dlciB0aGFuCi0JICogICBNQVhfQUdHUkVHQVRJT05fQllURVMKLQkgKi8KLQotCWlmICh0aW1lX2JlZm9yZShzZW5kX3RpbWUsIGZvcndfcGFja2V0LT5zZW5kX3RpbWUpICYmCi0JICAgIHRpbWVfYWZ0ZXJfZXEoc2VuZF90aW1lICsgbXNlY3NfdG9famlmZmllcyhNQVhfQUdHUkVHQVRJT05fTVMpLAotCQkJCQlmb3J3X3BhY2tldC0+c2VuZF90aW1lKSAmJgotCSAgICAoYWdncmVnYXRlZF9ieXRlcyA8PSBNQVhfQUdHUkVHQVRJT05fQllURVMpKSB7Ci0KLQkJLyoqCi0JCSAqIGNoZWNrIGFnZ3JlZ2F0aW9uIGNvbXBhdGliaWxpdHkKLQkJICogLT4gZGlyZWN0IGxpbmsgcGFja2V0cyBhcmUgYnJvYWRjYXN0ZWQgb24KLQkJICogICAgdGhlaXIgaW50ZXJmYWNlIG9ubHkKLQkJICogLT4gYWdncmVnYXRlIHBhY2tldCBpZiB0aGUgY3VycmVudCBwYWNrZXQgaXMKLQkJICogICAgYSAiZ2xvYmFsIiBwYWNrZXQgYXMgd2VsbCBhcyB0aGUgYmFzZQotCQkgKiAgICBwYWNrZXQKLQkJICovCi0KLQkJLyogcGFja2V0cyB3aXRob3V0IGRpcmVjdCBsaW5rIGZsYWcgYW5kIGhpZ2ggVFRMCi0JCSAqIGFyZSBmbG9vZGVkIHRocm91Z2ggdGhlIG5ldCAgKi8KLQkJaWYgKCghZGlyZWN0bGluaykgJiYKLQkJICAgICghKGJhdG1hbl9wYWNrZXQtPmZsYWdzICYgRElSRUNUTElOSykpICYmCi0JCSAgICAoYmF0bWFuX3BhY2tldC0+dHRsICE9IDEpICYmCi0KLQkJICAgIC8qIG93biBwYWNrZXRzIG9yaWdpbmF0aW5nIG5vbi1wcmltYXJ5Ci0JCSAgICAgKiBpbnRlcmZhY2VzIGxlYXZlIG9ubHkgdGhhdCBpbnRlcmZhY2UgKi8KLQkJICAgICgoIWZvcndfcGFja2V0LT5vd24pIHx8Ci0JCSAgICAgKGZvcndfcGFja2V0LT5pZl9pbmNvbWluZy0+aWZfbnVtID09IDApKSkKLQkJCXJldHVybiB0cnVlOwotCi0JCS8qIGlmIHRoZSBpbmNvbWluZyBwYWNrZXQgaXMgc2VudCB2aWEgdGhpcyBvbmUKLQkJICogaW50ZXJmYWNlIG9ubHkgLSB3ZSBzdGlsbCBjYW4gYWdncmVnYXRlICovCi0JCWlmICgoZGlyZWN0bGluaykgJiYKLQkJICAgIChuZXdfYmF0bWFuX3BhY2tldC0+dHRsID09IDEpICYmCi0JCSAgICAoZm9yd19wYWNrZXQtPmlmX2luY29taW5nID09IGlmX2luY29taW5nKSAmJgotCi0JCSAgICAvKiBwYWNrZXRzIGZyb20gZGlyZWN0IG5laWdoYm9ycyBvcgotCQkgICAgICogb3duIHNlY29uZGFyeSBpbnRlcmZhY2UgcGFja2V0cwotCQkgICAgICogKD0gc2Vjb25kYXJ5IGludGVyZmFjZSBwYWNrZXRzIGluIGdlbmVyYWwpICovCi0JCSAgICAoYmF0bWFuX3BhY2tldC0+ZmxhZ3MgJiBESVJFQ1RMSU5LIHx8Ci0JCSAgICAgKGZvcndfcGFja2V0LT5vd24gJiYKLQkJICAgICAgZm9yd19wYWNrZXQtPmlmX2luY29taW5nLT5pZl9udW0gIT0gMCkpKQotCQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcmV0dXJuIGZhbHNlOwotfQotCi0jZGVmaW5lIGF0b21pY19kZWNfbm90X3plcm8odikgICAgICAgICAgYXRvbWljX2FkZF91bmxlc3MoKHYpLCAtMSwgMCkKLS8qIGNyZWF0ZSBhIG5ldyBhZ2dyZWdhdGVkIHBhY2tldCBhbmQgYWRkIHRoaXMgcGFja2V0IHRvIGl0ICovCi1zdGF0aWMgdm9pZCBuZXdfYWdncmVnYXRlZF9wYWNrZXQodW5zaWduZWQgY2hhciAqcGFja2V0X2J1ZmYsIGludCBwYWNrZXRfbGVuLAotCQkJCSAgdW5zaWduZWQgbG9uZyBzZW5kX3RpbWUsIGJvb2wgZGlyZWN0X2xpbmssCi0JCQkJICBzdHJ1Y3QgYmF0bWFuX2lmICppZl9pbmNvbWluZywKLQkJCQkgIGludCBvd25fcGFja2V0KQotewotCXN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYgPSBuZXRkZXZfcHJpdihpZl9pbmNvbWluZy0+c29mdF9pZmFjZSk7Ci0Jc3RydWN0IGZvcndfcGFja2V0ICpmb3J3X3BhY2tldF9hZ2dyOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdW5zaWduZWQgY2hhciAqc2tiX2J1ZmY7Ci0KLQkvKiBvd24gcGFja2V0IHNob3VsZCBhbHdheXMgYmUgc2NoZWR1bGVkICovCi0JaWYgKCFvd25fcGFja2V0KSB7Ci0JCWlmICghYXRvbWljX2RlY19ub3RfemVybygmYmF0X3ByaXYtPmJhdG1hbl9xdWV1ZV9sZWZ0KSkgewotCQkJYmF0X2RiZyhEQkdfQkFUTUFOLCBiYXRfcHJpdiwKLQkJCQkiYmF0bWFuIHBhY2tldCBxdWV1ZSBmdWxsXG4iKTsKLQkJCXJldHVybjsKLQkJfQotCX0KLQotCWZvcndfcGFja2V0X2FnZ3IgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgZm9yd19wYWNrZXQpLCBHRlBfQVRPTUlDKTsKLQlpZiAoIWZvcndfcGFja2V0X2FnZ3IpIHsKLQkJaWYgKCFvd25fcGFja2V0KQotCQkJYXRvbWljX2luYygmYmF0X3ByaXYtPmJhdG1hbl9xdWV1ZV9sZWZ0KTsKLQkJcmV0dXJuOwotCX0KLQotCWlmICgoYXRvbWljX3JlYWQoJmJhdF9wcml2LT5hZ2dyZWdhdGlvbl9lbmFibGVkKSkgJiYKLQkgICAgKHBhY2tldF9sZW4gPCBNQVhfQUdHUkVHQVRJT05fQllURVMpKQotCQlmb3J3X3BhY2tldF9hZ2dyLT5za2IgPSBkZXZfYWxsb2Nfc2tiKE1BWF9BR0dSRUdBVElPTl9CWVRFUyArCi0JCQkJCQkgICAgICBzaXplb2Yoc3RydWN0IGV0aGhkcikpOwotCWVsc2UKLQkJZm9yd19wYWNrZXRfYWdnci0+c2tiID0gZGV2X2FsbG9jX3NrYihwYWNrZXRfbGVuICsKLQkJCQkJCSAgICAgIHNpemVvZihzdHJ1Y3QgZXRoaGRyKSk7Ci0KLQlpZiAoIWZvcndfcGFja2V0X2FnZ3ItPnNrYikgewotCQlpZiAoIW93bl9wYWNrZXQpCi0JCQlhdG9taWNfaW5jKCZiYXRfcHJpdi0+YmF0bWFuX3F1ZXVlX2xlZnQpOwotCQlrZnJlZShmb3J3X3BhY2tldF9hZ2dyKTsKLQkJcmV0dXJuOwotCX0KLQlza2JfcmVzZXJ2ZShmb3J3X3BhY2tldF9hZ2dyLT5za2IsIHNpemVvZihzdHJ1Y3QgZXRoaGRyKSk7Ci0KLQlJTklUX0hMSVNUX05PREUoJmZvcndfcGFja2V0X2FnZ3ItPmxpc3QpOwotCi0Jc2tiX2J1ZmYgPSBza2JfcHV0KGZvcndfcGFja2V0X2FnZ3ItPnNrYiwgcGFja2V0X2xlbik7Ci0JZm9yd19wYWNrZXRfYWdnci0+cGFja2V0X2xlbiA9IHBhY2tldF9sZW47Ci0JbWVtY3B5KHNrYl9idWZmLCBwYWNrZXRfYnVmZiwgcGFja2V0X2xlbik7Ci0KLQlmb3J3X3BhY2tldF9hZ2dyLT5vd24gPSBvd25fcGFja2V0OwotCWZvcndfcGFja2V0X2FnZ3ItPmlmX2luY29taW5nID0gaWZfaW5jb21pbmc7Ci0JZm9yd19wYWNrZXRfYWdnci0+bnVtX3BhY2tldHMgPSAwOwotCWZvcndfcGFja2V0X2FnZ3ItPmRpcmVjdF9saW5rX2ZsYWdzID0gMDsKLQlmb3J3X3BhY2tldF9hZ2dyLT5zZW5kX3RpbWUgPSBzZW5kX3RpbWU7Ci0KLQkvKiBzYXZlIHBhY2tldCBkaXJlY3QgbGluayBmbGFnIHN0YXR1cyAqLwotCWlmIChkaXJlY3RfbGluaykKLQkJZm9yd19wYWNrZXRfYWdnci0+ZGlyZWN0X2xpbmtfZmxhZ3MgfD0gMTsKLQotCS8qIGFkZCBuZXcgcGFja2V0IHRvIHBhY2tldCBsaXN0ICovCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmJhdF9wcml2LT5mb3J3X2JhdF9saXN0X2xvY2ssIGZsYWdzKTsKLQlobGlzdF9hZGRfaGVhZCgmZm9yd19wYWNrZXRfYWdnci0+bGlzdCwgJmJhdF9wcml2LT5mb3J3X2JhdF9saXN0KTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiYXRfcHJpdi0+Zm9yd19iYXRfbGlzdF9sb2NrLCBmbGFncyk7Ci0KLQkvKiBzdGFydCB0aW1lciBmb3IgdGhpcyBwYWNrZXQgKi8KLQlJTklUX0RFTEFZRURfV09SSygmZm9yd19wYWNrZXRfYWdnci0+ZGVsYXllZF93b3JrLAotCQkJICBzZW5kX291dHN0YW5kaW5nX2JhdF9wYWNrZXQpOwotCXF1ZXVlX2RlbGF5ZWRfd29yayhiYXRfZXZlbnRfd29ya3F1ZXVlLAotCQkJICAgJmZvcndfcGFja2V0X2FnZ3ItPmRlbGF5ZWRfd29yaywKLQkJCSAgIHNlbmRfdGltZSAtIGppZmZpZXMpOwotfQotCi0vKiBhZ2dyZWdhdGUgYSBuZXcgcGFja2V0IGludG8gdGhlIGV4aXN0aW5nIGFnZ3JlZ2F0aW9uICovCi1zdGF0aWMgdm9pZCBhZ2dyZWdhdGUoc3RydWN0IGZvcndfcGFja2V0ICpmb3J3X3BhY2tldF9hZ2dyLAotCQkgICAgICB1bnNpZ25lZCBjaGFyICpwYWNrZXRfYnVmZiwKLQkJICAgICAgaW50IHBhY2tldF9sZW4sCi0JCSAgICAgIGJvb2wgZGlyZWN0X2xpbmspCi17Ci0JdW5zaWduZWQgY2hhciAqc2tiX2J1ZmY7Ci0KLQlza2JfYnVmZiA9IHNrYl9wdXQoZm9yd19wYWNrZXRfYWdnci0+c2tiLCBwYWNrZXRfbGVuKTsKLQltZW1jcHkoc2tiX2J1ZmYsIHBhY2tldF9idWZmLCBwYWNrZXRfbGVuKTsKLQlmb3J3X3BhY2tldF9hZ2dyLT5wYWNrZXRfbGVuICs9IHBhY2tldF9sZW47Ci0JZm9yd19wYWNrZXRfYWdnci0+bnVtX3BhY2tldHMrKzsKLQotCS8qIHNhdmUgcGFja2V0IGRpcmVjdCBsaW5rIGZsYWcgc3RhdHVzICovCi0JaWYgKGRpcmVjdF9saW5rKQotCQlmb3J3X3BhY2tldF9hZ2dyLT5kaXJlY3RfbGlua19mbGFncyB8PQotCQkJKDEgPDwgZm9yd19wYWNrZXRfYWdnci0+bnVtX3BhY2tldHMpOwotfQotCi12b2lkIGFkZF9iYXRfcGFja2V0X3RvX2xpc3Qoc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiwKLQkJCSAgICB1bnNpZ25lZCBjaGFyICpwYWNrZXRfYnVmZiwgaW50IHBhY2tldF9sZW4sCi0JCQkgICAgc3RydWN0IGJhdG1hbl9pZiAqaWZfaW5jb21pbmcsIGNoYXIgb3duX3BhY2tldCwKLQkJCSAgICB1bnNpZ25lZCBsb25nIHNlbmRfdGltZSkKLXsKLQkvKioKLQkgKiBfYWdnciAtPiBwb2ludGVyIHRvIHRoZSBwYWNrZXQgd2Ugd2FudCB0byBhZ2dyZWdhdGUgd2l0aAotCSAqIF9wb3MgLT4gcG9pbnRlciB0byB0aGUgcG9zaXRpb24gaW4gdGhlIHF1ZXVlCi0JICovCi0Jc3RydWN0IGZvcndfcGFja2V0ICpmb3J3X3BhY2tldF9hZ2dyID0gTlVMTCwgKmZvcndfcGFja2V0X3BvcyA9IE5VTEw7Ci0Jc3RydWN0IGhsaXN0X25vZGUgKnRtcF9ub2RlOwotCXN0cnVjdCBiYXRtYW5fcGFja2V0ICpiYXRtYW5fcGFja2V0ID0KLQkJKHN0cnVjdCBiYXRtYW5fcGFja2V0ICopcGFja2V0X2J1ZmY7Ci0JYm9vbCBkaXJlY3RfbGluayA9IGJhdG1hbl9wYWNrZXQtPmZsYWdzICYgRElSRUNUTElOSyA/IDEgOiAwOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQkvKiBmaW5kIHBvc2l0aW9uIGZvciB0aGUgcGFja2V0IGluIHRoZSBmb3J3YXJkIHF1ZXVlICovCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmJhdF9wcml2LT5mb3J3X2JhdF9saXN0X2xvY2ssIGZsYWdzKTsKLQkvKiBvd24gcGFja2V0cyBhcmUgbm90IHRvIGJlIGFnZ3JlZ2F0ZWQgKi8KLQlpZiAoKGF0b21pY19yZWFkKCZiYXRfcHJpdi0+YWdncmVnYXRpb25fZW5hYmxlZCkpICYmICghb3duX3BhY2tldCkpIHsKLQkJaGxpc3RfZm9yX2VhY2hfZW50cnkoZm9yd19wYWNrZXRfcG9zLCB0bXBfbm9kZSwKLQkJCQkgICAgICZiYXRfcHJpdi0+Zm9yd19iYXRfbGlzdCwgbGlzdCkgewotCQkJaWYgKGNhbl9hZ2dyZWdhdGVfd2l0aChiYXRtYW5fcGFja2V0LAotCQkJCQkgICAgICAgcGFja2V0X2xlbiwKLQkJCQkJICAgICAgIHNlbmRfdGltZSwKLQkJCQkJICAgICAgIGRpcmVjdF9saW5rLAotCQkJCQkgICAgICAgaWZfaW5jb21pbmcsCi0JCQkJCSAgICAgICBmb3J3X3BhY2tldF9wb3MpKSB7Ci0JCQkJZm9yd19wYWNrZXRfYWdnciA9IGZvcndfcGFja2V0X3BvczsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLQotCS8qIG5vdGhpbmcgdG8gYWdncmVnYXRlIHdpdGggLSBlaXRoZXIgYWdncmVnYXRpb24gZGlzYWJsZWQgb3Igbm8KLQkgKiBzdWl0YWJsZSBhZ2dyZWdhdGlvbiBwYWNrZXQgZm91bmQgKi8KLQlpZiAoZm9yd19wYWNrZXRfYWdnciA9PSBOVUxMKSB7Ci0JCS8qIHRoZSBmb2xsb3dpbmcgc2VjdGlvbiBjYW4gcnVuIHdpdGhvdXQgdGhlIGxvY2sgKi8KLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmF0X3ByaXYtPmZvcndfYmF0X2xpc3RfbG9jaywgZmxhZ3MpOwotCi0JCS8qKgotCQkgKiBpZiB3ZSBjb3VsZCBub3QgYWdncmVnYXRlIHRoaXMgcGFja2V0IHdpdGggb25lIG9mIHRoZSBvdGhlcnMKLQkJICogd2UgaG9sZCBpdCBiYWNrIGZvciBhIHdoaWxlLCBzbyB0aGF0IGl0IG1pZ2h0IGJlIGFnZ3JlZ2F0ZWQKLQkJICogbGF0ZXIgb24KLQkJICovCi0JCWlmICgoIW93bl9wYWNrZXQpICYmCi0JCSAgICAoYXRvbWljX3JlYWQoJmJhdF9wcml2LT5hZ2dyZWdhdGlvbl9lbmFibGVkKSkpCi0JCQlzZW5kX3RpbWUgKz0gbXNlY3NfdG9famlmZmllcyhNQVhfQUdHUkVHQVRJT05fTVMpOwotCi0JCW5ld19hZ2dyZWdhdGVkX3BhY2tldChwYWNrZXRfYnVmZiwgcGFja2V0X2xlbiwKLQkJCQkgICAgICBzZW5kX3RpbWUsIGRpcmVjdF9saW5rLAotCQkJCSAgICAgIGlmX2luY29taW5nLCBvd25fcGFja2V0KTsKLQl9IGVsc2UgewotCQlhZ2dyZWdhdGUoZm9yd19wYWNrZXRfYWdnciwKLQkJCSAgcGFja2V0X2J1ZmYsIHBhY2tldF9sZW4sCi0JCQkgIGRpcmVjdF9saW5rKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmF0X3ByaXYtPmZvcndfYmF0X2xpc3RfbG9jaywgZmxhZ3MpOwotCX0KLX0KLQotLyogdW5wYWNrIHRoZSBhZ2dyZWdhdGVkIHBhY2tldHMgYW5kIHByb2Nlc3MgdGhlbSBvbmUgYnkgb25lICovCi12b2lkIHJlY2VpdmVfYWdncl9iYXRfcGFja2V0KHN0cnVjdCBldGhoZHIgKmV0aGhkciwgdW5zaWduZWQgY2hhciAqcGFja2V0X2J1ZmYsCi0JCQkgICAgIGludCBwYWNrZXRfbGVuLCBzdHJ1Y3QgYmF0bWFuX2lmICppZl9pbmNvbWluZykKLXsKLQlzdHJ1Y3QgYmF0bWFuX3BhY2tldCAqYmF0bWFuX3BhY2tldDsKLQlpbnQgYnVmZl9wb3MgPSAwOwotCXVuc2lnbmVkIGNoYXIgKmhuYV9idWZmOwotCi0JYmF0bWFuX3BhY2tldCA9IChzdHJ1Y3QgYmF0bWFuX3BhY2tldCAqKXBhY2tldF9idWZmOwotCi0JZG8gewotCQkvKiBuZXR3b3JrIHRvIGhvc3Qgb3JkZXIgZm9yIG91ciAzMmJpdCBzZXFubywgYW5kIHRoZQotCQkgICBvcmlnX2ludGVydmFsLiAqLwotCQliYXRtYW5fcGFja2V0LT5zZXFubyA9IG50b2hsKGJhdG1hbl9wYWNrZXQtPnNlcW5vKTsKLQotCQlobmFfYnVmZiA9IHBhY2tldF9idWZmICsgYnVmZl9wb3MgKyBCQVRfUEFDS0VUX0xFTjsKLQkJcmVjZWl2ZV9iYXRfcGFja2V0KGV0aGhkciwgYmF0bWFuX3BhY2tldCwKLQkJCQkgICBobmFfYnVmZiwgaG5hX2xlbihiYXRtYW5fcGFja2V0KSwKLQkJCQkgICBpZl9pbmNvbWluZyk7Ci0KLQkJYnVmZl9wb3MgKz0gQkFUX1BBQ0tFVF9MRU4gKyBobmFfbGVuKGJhdG1hbl9wYWNrZXQpOwotCQliYXRtYW5fcGFja2V0ID0gKHN0cnVjdCBiYXRtYW5fcGFja2V0ICopCi0JCQkocGFja2V0X2J1ZmYgKyBidWZmX3Bvcyk7Ci0JfSB3aGlsZSAoYWdncmVnYXRlZF9wYWNrZXQoYnVmZl9wb3MsIHBhY2tldF9sZW4sCi0JCQkJICAgYmF0bWFuX3BhY2tldC0+bnVtX2huYSkpOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvYWdncmVnYXRpb24uaCBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L2FnZ3JlZ2F0aW9uLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxYTkxYjMuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvYWdncmVnYXRpb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBCLkEuVC5NLkEuTi4gY29udHJpYnV0b3JzOgotICoKLSAqIE1hcmVrIExpbmRuZXIsIFNpbW9uIFd1bmRlcmxpY2gKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKLSAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKLSAqIDAyMTEwLTEzMDEsIFVTQQotICoKLSAqLwotCi0jaWZuZGVmIF9ORVRfQkFUTUFOX0FEVl9BR0dSRUdBVElPTl9IXwotI2RlZmluZSBfTkVUX0JBVE1BTl9BRFZfQUdHUkVHQVRJT05fSF8KLQotI2luY2x1ZGUgIm1haW4uaCIKLQotLyogaXMgdGhlcmUgYW5vdGhlciBhZ2dyZWdhdGVkIHBhY2tldCBoZXJlPyAqLwotc3RhdGljIGlubGluZSBpbnQgYWdncmVnYXRlZF9wYWNrZXQoaW50IGJ1ZmZfcG9zLCBpbnQgcGFja2V0X2xlbiwgaW50IG51bV9obmEpCi17Ci0JaW50IG5leHRfYnVmZl9wb3MgPSBidWZmX3BvcyArIEJBVF9QQUNLRVRfTEVOICsgKG51bV9obmEgKiBFVEhfQUxFTik7Ci0KLQlyZXR1cm4gKG5leHRfYnVmZl9wb3MgPD0gcGFja2V0X2xlbikgJiYKLQkJKG5leHRfYnVmZl9wb3MgPD0gTUFYX0FHR1JFR0FUSU9OX0JZVEVTKTsKLX0KLQotdm9pZCBhZGRfYmF0X3BhY2tldF90b19saXN0KHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYsCi0JCQkgICAgdW5zaWduZWQgY2hhciAqcGFja2V0X2J1ZmYsIGludCBwYWNrZXRfbGVuLAotCQkJICAgIHN0cnVjdCBiYXRtYW5faWYgKmlmX2luY29taW5nLCBjaGFyIG93bl9wYWNrZXQsCi0JCQkgICAgdW5zaWduZWQgbG9uZyBzZW5kX3RpbWUpOwotdm9pZCByZWNlaXZlX2FnZ3JfYmF0X3BhY2tldChzdHJ1Y3QgZXRoaGRyICpldGhoZHIsIHVuc2lnbmVkIGNoYXIgKnBhY2tldF9idWZmLAotCQkJICAgICBpbnQgcGFja2V0X2xlbiwgc3RydWN0IGJhdG1hbl9pZiAqaWZfaW5jb21pbmcpOwotCi0jZW5kaWYgLyogX05FVF9CQVRNQU5fQURWX0FHR1JFR0FUSU9OX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9iYXRfZGVidWdmcy5jIGIvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvYmF0X2RlYnVnZnMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTdmODRhOS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9iYXRfZGVidWdmcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMzQzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgQi5BLlQuTS5BLk4uIGNvbnRyaWJ1dG9yczoKLSAqCi0gKiBNYXJlayBMaW5kbmVyCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCi0gKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCi0gKiAwMjExMC0xMzAxLCBVU0EKLSAqCi0gKi8KLQotI2luY2x1ZGUgIm1haW4uaCIKLQotI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KLQotI2luY2x1ZGUgImJhdF9kZWJ1Z2ZzLmgiCi0jaW5jbHVkZSAidHJhbnNsYXRpb24tdGFibGUuaCIKLSNpbmNsdWRlICJvcmlnaW5hdG9yLmgiCi0jaW5jbHVkZSAiaGFyZC1pbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJ2aXMuaCIKLSNpbmNsdWRlICJpY21wX3NvY2tldC5oIgotCi1zdGF0aWMgc3RydWN0IGRlbnRyeSAqYmF0X2RlYnVnZnM7Ci0KLSNpZmRlZiBDT05GSUdfQkFUTUFOX0FEVl9ERUJVRwotI2RlZmluZSBMT0dfQlVGRl9NQVNLIChsb2dfYnVmZl9sZW4tMSkKLSNkZWZpbmUgTE9HX0JVRkYoaWR4KSAoZGVidWdfbG9nLT5sb2dfYnVmZlsoaWR4KSAmIExPR19CVUZGX01BU0tdKQotCi1zdGF0aWMgaW50IGxvZ19idWZmX2xlbiA9IExPR19CVUZfTEVOOwotCi1zdGF0aWMgdm9pZCBlbWl0X2xvZ19jaGFyKHN0cnVjdCBkZWJ1Z19sb2cgKmRlYnVnX2xvZywgY2hhciBjKQotewotCUxPR19CVUZGKGRlYnVnX2xvZy0+bG9nX2VuZCkgPSBjOwotCWRlYnVnX2xvZy0+bG9nX2VuZCsrOwotCi0JaWYgKGRlYnVnX2xvZy0+bG9nX2VuZCAtIGRlYnVnX2xvZy0+bG9nX3N0YXJ0ID4gbG9nX2J1ZmZfbGVuKQotCQlkZWJ1Z19sb2ctPmxvZ19zdGFydCA9IGRlYnVnX2xvZy0+bG9nX2VuZCAtIGxvZ19idWZmX2xlbjsKLX0KLQotc3RhdGljIGludCBmZGVidWdfbG9nKHN0cnVjdCBkZWJ1Z19sb2cgKmRlYnVnX2xvZywgY2hhciAqZm10LCAuLi4pCi17Ci0JaW50IHByaW50ZWRfbGVuOwotCXZhX2xpc3QgYXJnczsKLQlzdGF0aWMgY2hhciBkZWJ1Z19sb2dfYnVmWzI1Nl07Ci0JY2hhciAqcDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JaWYgKCFkZWJ1Z19sb2cpCi0JCXJldHVybiAwOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmRlYnVnX2xvZy0+bG9jaywgZmxhZ3MpOwotCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7Ci0JcHJpbnRlZF9sZW4gPSB2c2NucHJpbnRmKGRlYnVnX2xvZ19idWYsIHNpemVvZihkZWJ1Z19sb2dfYnVmKSwKLQkJCQkgZm10LCBhcmdzKTsKLQl2YV9lbmQoYXJncyk7Ci0KLQlmb3IgKHAgPSBkZWJ1Z19sb2dfYnVmOyAqcCAhPSAwOyBwKyspCi0JCWVtaXRfbG9nX2NoYXIoZGVidWdfbG9nLCAqcCk7Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZWJ1Z19sb2ctPmxvY2ssIGZsYWdzKTsKLQotCXdha2VfdXAoJmRlYnVnX2xvZy0+cXVldWVfd2FpdCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotaW50IGRlYnVnX2xvZyhzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2LCBjaGFyICpmbXQsIC4uLikKLXsKLQl2YV9saXN0IGFyZ3M7Ci0JY2hhciB0bXBfbG9nX2J1ZlsyNTZdOwotCi0JdmFfc3RhcnQoYXJncywgZm10KTsKLQl2c2NucHJpbnRmKHRtcF9sb2dfYnVmLCBzaXplb2YodG1wX2xvZ19idWYpLCBmbXQsIGFyZ3MpOwotCWZkZWJ1Z19sb2coYmF0X3ByaXYtPmRlYnVnX2xvZywgIlslMTB1XSAlcyIsCi0JCSAgIChqaWZmaWVzIC8gSFopLCB0bXBfbG9nX2J1Zik7Ci0JdmFfZW5kKGFyZ3MpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbG9nX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0Jbm9uc2Vla2FibGVfb3Blbihpbm9kZSwgZmlsZSk7Ci0JZmlsZS0+cHJpdmF0ZV9kYXRhID0gaW5vZGUtPmlfcHJpdmF0ZTsKLQlpbmNfbW9kdWxlX2NvdW50KCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbG9nX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0JZGVjX21vZHVsZV9jb3VudCgpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3NpemVfdCBsb2dfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZiwKLQkJCXNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQotewotCXN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IGRlYnVnX2xvZyAqZGVidWdfbG9nID0gYmF0X3ByaXYtPmRlYnVnX2xvZzsKLQlpbnQgZXJyb3IsIGkgPSAwOwotCWNoYXIgYzsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JaWYgKChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgJiYKLQkgICAgIShkZWJ1Z19sb2ctPmxvZ19lbmQgLSBkZWJ1Z19sb2ctPmxvZ19zdGFydCkpCi0JCXJldHVybiAtRUFHQUlOOwotCi0JaWYgKCghYnVmKSB8fCAoY291bnQgPCAwKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlpZiAoY291bnQgPT0gMCkKLQkJcmV0dXJuIDA7Ci0KLQlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIGJ1ZiwgY291bnQpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQotCWVycm9yID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGRlYnVnX2xvZy0+cXVldWVfd2FpdCwKLQkJCQkoZGVidWdfbG9nLT5sb2dfc3RhcnQgLSBkZWJ1Z19sb2ctPmxvZ19lbmQpKTsKLQotCWlmIChlcnJvcikKLQkJcmV0dXJuIGVycm9yOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmRlYnVnX2xvZy0+bG9jaywgZmxhZ3MpOwotCi0Jd2hpbGUgKCghZXJyb3IpICYmIChpIDwgY291bnQpICYmCi0JICAgICAgIChkZWJ1Z19sb2ctPmxvZ19zdGFydCAhPSBkZWJ1Z19sb2ctPmxvZ19lbmQpKSB7Ci0JCWMgPSBMT0dfQlVGRihkZWJ1Z19sb2ctPmxvZ19zdGFydCk7Ci0KLQkJZGVidWdfbG9nLT5sb2dfc3RhcnQrKzsKLQotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZWJ1Z19sb2ctPmxvY2ssIGZsYWdzKTsKLQotCQllcnJvciA9IF9fcHV0X3VzZXIoYywgYnVmKTsKLQotCQlzcGluX2xvY2tfaXJxc2F2ZSgmZGVidWdfbG9nLT5sb2NrLCBmbGFncyk7Ci0KLQkJYnVmKys7Ci0JCWkrKzsKLQotCX0KLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRlYnVnX2xvZy0+bG9jaywgZmxhZ3MpOwotCi0JaWYgKCFlcnJvcikKLQkJcmV0dXJuIGk7Ci0KLQlyZXR1cm4gZXJyb3I7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgbG9nX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHBvbGxfdGFibGUgKndhaXQpCi17Ci0Jc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgZGVidWdfbG9nICpkZWJ1Z19sb2cgPSBiYXRfcHJpdi0+ZGVidWdfbG9nOwotCi0JcG9sbF93YWl0KGZpbGUsICZkZWJ1Z19sb2ctPnF1ZXVlX3dhaXQsIHdhaXQpOwotCi0JaWYgKGRlYnVnX2xvZy0+bG9nX2VuZCAtIGRlYnVnX2xvZy0+bG9nX3N0YXJ0KQotCQlyZXR1cm4gUE9MTElOIHwgUE9MTFJETk9STTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBsb2dfZm9wcyA9IHsKLQkub3BlbiAgICAgICAgICAgPSBsb2dfb3BlbiwKLQkucmVsZWFzZSAgICAgICAgPSBsb2dfcmVsZWFzZSwKLQkucmVhZCAgICAgICAgICAgPSBsb2dfcmVhZCwKLQkucG9sbCAgICAgICAgICAgPSBsb2dfcG9sbCwKLQkubGxzZWVrICAgICAgICAgPSBub19sbHNlZWssCi19OwotCi1zdGF0aWMgaW50IGRlYnVnX2xvZ19zZXR1cChzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2KQotewotCXN0cnVjdCBkZW50cnkgKmQ7Ci0KLQlpZiAoIWJhdF9wcml2LT5kZWJ1Z19kaXIpCi0JCWdvdG8gZXJyOwotCi0JYmF0X3ByaXYtPmRlYnVnX2xvZyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBkZWJ1Z19sb2cpLCBHRlBfQVRPTUlDKTsKLQlpZiAoIWJhdF9wcml2LT5kZWJ1Z19sb2cpCi0JCWdvdG8gZXJyOwotCi0Jc3Bpbl9sb2NrX2luaXQoJmJhdF9wcml2LT5kZWJ1Z19sb2ctPmxvY2spOwotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmJhdF9wcml2LT5kZWJ1Z19sb2ctPnF1ZXVlX3dhaXQpOwotCi0JZCA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoImxvZyIsIFNfSUZSRUcgfCBTX0lSVVNSLAotCQkJCWJhdF9wcml2LT5kZWJ1Z19kaXIsIGJhdF9wcml2LCAmbG9nX2ZvcHMpOwotCWlmIChkKQotCQlnb3RvIGVycjsKLQotCXJldHVybiAwOwotCi1lcnI6Ci0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyB2b2lkIGRlYnVnX2xvZ19jbGVhbnVwKHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYpCi17Ci0Ja2ZyZWUoYmF0X3ByaXYtPmRlYnVnX2xvZyk7Ci0JYmF0X3ByaXYtPmRlYnVnX2xvZyA9IE5VTEw7Ci19Ci0jZWxzZSAvKiBDT05GSUdfQkFUTUFOX0FEVl9ERUJVRyAqLwotc3RhdGljIGludCBkZWJ1Z19sb2dfc2V0dXAoc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdikKLXsKLQliYXRfcHJpdi0+ZGVidWdfbG9nID0gTlVMTDsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgZGVidWdfbG9nX2NsZWFudXAoc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdikKLXsKLQlyZXR1cm47Ci19Ci0jZW5kaWYKLQotc3RhdGljIGludCBvcmlnaW5hdG9yc19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopaW5vZGUtPmlfcHJpdmF0ZTsKLQlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgb3JpZ19zZXFfcHJpbnRfdGV4dCwgbmV0X2Rldik7Ci19Ci0KLXN0YXRpYyBpbnQgdHJhbnN0YWJsZV9nbG9iYWxfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKWlub2RlLT5pX3ByaXZhdGU7Ci0JcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIGhuYV9nbG9iYWxfc2VxX3ByaW50X3RleHQsIG5ldF9kZXYpOwotfQotCi1zdGF0aWMgaW50IHRyYW5zdGFibGVfbG9jYWxfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKWlub2RlLT5pX3ByaXZhdGU7Ci0JcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIGhuYV9sb2NhbF9zZXFfcHJpbnRfdGV4dCwgbmV0X2Rldik7Ci19Ci0KLXN0YXRpYyBpbnQgdmlzX2RhdGFfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKWlub2RlLT5pX3ByaXZhdGU7Ci0JcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIHZpc19zZXFfcHJpbnRfdGV4dCwgbmV0X2Rldik7Ci19Ci0KLXN0cnVjdCBiYXRfZGVidWdpbmZvIHsKLQlzdHJ1Y3QgYXR0cmlidXRlIGF0dHI7Ci0JY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBmb3BzOwotfTsKLQotI2RlZmluZSBCQVRfREVCVUdJTkZPKF9uYW1lLCBfbW9kZSwgX29wZW4pCVwKLXN0cnVjdCBiYXRfZGVidWdpbmZvIGJhdF9kZWJ1Z2luZm9fIyNfbmFtZSA9IHsJXAotCS5hdHRyID0geyAubmFtZSA9IF9fc3RyaW5naWZ5KF9uYW1lKSwJXAotCQkgIC5tb2RlID0gX21vZGUsIH0sCQlcCi0JLmZvcHMgPSB7IC5vd25lciA9IFRISVNfTU9EVUxFLAkJXAotCQkgIC5vcGVuID0gX29wZW4sCQlcCi0JCSAgLnJlYWQJPSBzZXFfcmVhZCwJCVwKLQkJICAubGxzZWVrID0gc2VxX2xzZWVrLAkJXAotCQkgIC5yZWxlYXNlID0gc2luZ2xlX3JlbGVhc2UsCVwKLQkJfQkJCQlcCi19OwotCi1zdGF0aWMgQkFUX0RFQlVHSU5GTyhvcmlnaW5hdG9ycywgU19JUlVHTywgb3JpZ2luYXRvcnNfb3Blbik7Ci1zdGF0aWMgQkFUX0RFQlVHSU5GTyh0cmFuc3RhYmxlX2dsb2JhbCwgU19JUlVHTywgdHJhbnN0YWJsZV9nbG9iYWxfb3Blbik7Ci1zdGF0aWMgQkFUX0RFQlVHSU5GTyh0cmFuc3RhYmxlX2xvY2FsLCBTX0lSVUdPLCB0cmFuc3RhYmxlX2xvY2FsX29wZW4pOwotc3RhdGljIEJBVF9ERUJVR0lORk8odmlzX2RhdGEsIFNfSVJVR08sIHZpc19kYXRhX29wZW4pOwotCi1zdGF0aWMgc3RydWN0IGJhdF9kZWJ1Z2luZm8gKm1lc2hfZGVidWdpbmZvc1tdID0gewotCSZiYXRfZGVidWdpbmZvX29yaWdpbmF0b3JzLAotCSZiYXRfZGVidWdpbmZvX3RyYW5zdGFibGVfZ2xvYmFsLAotCSZiYXRfZGVidWdpbmZvX3RyYW5zdGFibGVfbG9jYWwsCi0JJmJhdF9kZWJ1Z2luZm9fdmlzX2RhdGEsCi0JTlVMTCwKLX07Ci0KLXZvaWQgZGVidWdmc19pbml0KHZvaWQpCi17Ci0JYmF0X2RlYnVnZnMgPSBkZWJ1Z2ZzX2NyZWF0ZV9kaXIoREVCVUdGU19CQVRfU1VCRElSLCBOVUxMKTsKLQlpZiAoYmF0X2RlYnVnZnMgPT0gRVJSX1BUUigtRU5PREVWKSkKLQkJYmF0X2RlYnVnZnMgPSBOVUxMOwotfQotCi12b2lkIGRlYnVnZnNfZGVzdHJveSh2b2lkKQotewotCWlmIChiYXRfZGVidWdmcykgewotCQlkZWJ1Z2ZzX3JlbW92ZV9yZWN1cnNpdmUoYmF0X2RlYnVnZnMpOwotCQliYXRfZGVidWdmcyA9IE5VTEw7Ci0JfQotfQotCi1pbnQgZGVidWdmc19hZGRfbWVzaGlmKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiA9IG5ldGRldl9wcml2KGRldik7Ci0Jc3RydWN0IGJhdF9kZWJ1Z2luZm8gKipiYXRfZGVidWc7Ci0Jc3RydWN0IGRlbnRyeSAqZmlsZTsKLQotCWlmICghYmF0X2RlYnVnZnMpCi0JCWdvdG8gb3V0OwotCi0JYmF0X3ByaXYtPmRlYnVnX2RpciA9IGRlYnVnZnNfY3JlYXRlX2RpcihkZXYtPm5hbWUsIGJhdF9kZWJ1Z2ZzKTsKLQlpZiAoIWJhdF9wcml2LT5kZWJ1Z19kaXIpCi0JCWdvdG8gb3V0OwotCi0JYmF0X3NvY2tldF9zZXR1cChiYXRfcHJpdik7Ci0JZGVidWdfbG9nX3NldHVwKGJhdF9wcml2KTsKLQotCWZvciAoYmF0X2RlYnVnID0gbWVzaF9kZWJ1Z2luZm9zOyAqYmF0X2RlYnVnOyArK2JhdF9kZWJ1ZykgewotCQlmaWxlID0gZGVidWdmc19jcmVhdGVfZmlsZSgoKCpiYXRfZGVidWcpLT5hdHRyKS5uYW1lLAotCQkJCQkgIFNfSUZSRUcgfCAoKCpiYXRfZGVidWcpLT5hdHRyKS5tb2RlLAotCQkJCQkgIGJhdF9wcml2LT5kZWJ1Z19kaXIsCi0JCQkJCSAgZGV2LCAmKCpiYXRfZGVidWcpLT5mb3BzKTsKLQkJaWYgKCFmaWxlKSB7Ci0JCQliYXRfZXJyKGRldiwgIkNhbid0IGFkZCBkZWJ1Z2ZzIGZpbGU6ICVzLyVzXG4iLAotCQkJCWRldi0+bmFtZSwgKCgqYmF0X2RlYnVnKS0+YXR0cikubmFtZSk7Ci0JCQlnb3RvIHJlbV9hdHRyOwotCQl9Ci0JfQotCi0JcmV0dXJuIDA7Ci1yZW1fYXR0cjoKLQlkZWJ1Z2ZzX3JlbW92ZV9yZWN1cnNpdmUoYmF0X3ByaXYtPmRlYnVnX2Rpcik7Ci0JYmF0X3ByaXYtPmRlYnVnX2RpciA9IE5VTEw7Ci1vdXQ6Ci0jaWZkZWYgQ09ORklHX0RFQlVHX0ZTCi0JcmV0dXJuIC1FTk9NRU07Ci0jZWxzZQotCXJldHVybiAwOwotI2VuZGlmIC8qIENPTkZJR19ERUJVR19GUyAqLwotfQotCi12b2lkIGRlYnVnZnNfZGVsX21lc2hpZihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQotewotCXN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYgPSBuZXRkZXZfcHJpdihkZXYpOwotCi0JZGVidWdfbG9nX2NsZWFudXAoYmF0X3ByaXYpOwotCi0JaWYgKGJhdF9kZWJ1Z2ZzKSB7Ci0JCWRlYnVnZnNfcmVtb3ZlX3JlY3Vyc2l2ZShiYXRfcHJpdi0+ZGVidWdfZGlyKTsKLQkJYmF0X3ByaXYtPmRlYnVnX2RpciA9IE5VTEw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvYmF0X2RlYnVnZnMuaCBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L2JhdF9kZWJ1Z2ZzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyZGY1MzIuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvYmF0X2RlYnVnZnMuaAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgQi5BLlQuTS5BLk4uIGNvbnRyaWJ1dG9yczoKLSAqCi0gKiBNYXJlayBMaW5kbmVyCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCi0gKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCi0gKiAwMjExMC0xMzAxLCBVU0EKLSAqCi0gKi8KLQotCi0jaWZuZGVmIF9ORVRfQkFUTUFOX0FEVl9ERUJVR0ZTX0hfCi0jZGVmaW5lIF9ORVRfQkFUTUFOX0FEVl9ERUJVR0ZTX0hfCi0KLSNkZWZpbmUgREVCVUdGU19CQVRfU1VCRElSICJiYXRtYW5fYWR2IgotCi12b2lkIGRlYnVnZnNfaW5pdCh2b2lkKTsKLXZvaWQgZGVidWdmc19kZXN0cm95KHZvaWQpOwotaW50IGRlYnVnZnNfYWRkX21lc2hpZihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKLXZvaWQgZGVidWdmc19kZWxfbWVzaGlmKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwotCi0jZW5kaWYgLyogX05FVF9CQVRNQU5fQURWX0RFQlVHRlNfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L2JhdF9zeXNmcy5jIGIvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvYmF0X3N5c2ZzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjMTdmYjguLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvYmF0X3N5c2ZzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1NTggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBCLkEuVC5NLkEuTi4gY29udHJpYnV0b3JzOgotICoKLSAqIE1hcmVrIExpbmRuZXIKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKLSAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKLSAqIDAyMTEwLTEzMDEsIFVTQQotICoKLSAqLwotCi0jaW5jbHVkZSAibWFpbi5oIgotI2luY2x1ZGUgImJhdF9zeXNmcy5oIgotI2luY2x1ZGUgInRyYW5zbGF0aW9uLXRhYmxlLmgiCi0jaW5jbHVkZSAib3JpZ2luYXRvci5oIgotI2luY2x1ZGUgImhhcmQtaW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAidmlzLmgiCi0KLSNkZWZpbmUgdG9fZGV2KG9iaikgICAgIGNvbnRhaW5lcl9vZihvYmosIHN0cnVjdCBkZXZpY2UsIGtvYmopCi0KLSNkZWZpbmUgQkFUX0FUVFIoX25hbWUsIF9tb2RlLCBfc2hvdywgX3N0b3JlKQlcCi1zdHJ1Y3QgYmF0X2F0dHJpYnV0ZSBiYXRfYXR0cl8jI19uYW1lID0gewlcCi0JLmF0dHIgPSB7Lm5hbWUgPSBfX3N0cmluZ2lmeShfbmFtZSksCVwKLQkJIC5tb2RlID0gX21vZGUgfSwJCVwKLQkuc2hvdyAgID0gX3Nob3csCQkJXAotCS5zdG9yZSAgPSBfc3RvcmUsCQkJXAotfTsKLQotc3RhdGljIHNzaXplX3Qgc2hvd19hZ2dyX29nbXMoc3RydWN0IGtvYmplY3QgKmtvYmosIHN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIsCi0JCQkgICAgIGNoYXIgKmJ1ZmYpCi17Ci0Jc3RydWN0IGRldmljZSAqZGV2ID0gdG9fZGV2KGtvYmotPnBhcmVudCk7Ci0Jc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiA9IG5ldGRldl9wcml2KHRvX25ldF9kZXYoZGV2KSk7Ci0JaW50IGFnZ3Jfc3RhdHVzID0gYXRvbWljX3JlYWQoJmJhdF9wcml2LT5hZ2dyZWdhdGlvbl9lbmFibGVkKTsKLQotCXJldHVybiBzcHJpbnRmKGJ1ZmYsICIlc1xuIiwKLQkJICAgICAgIGFnZ3Jfc3RhdHVzID09IDAgPyAiZGlzYWJsZWQiIDogImVuYWJsZWQiKTsKLX0KLQotc3RhdGljIHNzaXplX3Qgc3RvcmVfYWdncl9vZ21zKHN0cnVjdCBrb2JqZWN0ICprb2JqLCBzdHJ1Y3QgYXR0cmlidXRlICphdHRyLAotCQkJICAgICAgY2hhciAqYnVmZiwgc2l6ZV90IGNvdW50KQotewotCXN0cnVjdCBkZXZpY2UgKmRldiA9IHRvX2Rldihrb2JqLT5wYXJlbnQpOwotCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2ID0gdG9fbmV0X2RldihkZXYpOwotCXN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYgPSBuZXRkZXZfcHJpdihuZXRfZGV2KTsKLQlpbnQgYWdncl90bXAgPSAtMTsKLQotCWlmICgoKGNvdW50ID09IDIpICYmIChidWZmWzBdID09ICcxJykpIHx8Ci0JICAgIChzdHJuY21wKGJ1ZmYsICJlbmFibGUiLCA2KSA9PSAwKSkKLQkJYWdncl90bXAgPSAxOwotCi0JaWYgKCgoY291bnQgPT0gMikgJiYgKGJ1ZmZbMF0gPT0gJzAnKSkgfHwKLQkgICAgKHN0cm5jbXAoYnVmZiwgImRpc2FibGUiLCA3KSA9PSAwKSkKLQkJYWdncl90bXAgPSAwOwotCi0JaWYgKGFnZ3JfdG1wIDwgMCkgewotCQlpZiAoYnVmZltjb3VudCAtIDFdID09ICdcbicpCi0JCQlidWZmW2NvdW50IC0gMV0gPSAnXDAnOwotCi0JCWJhdF9pbmZvKG5ldF9kZXYsCi0JCQkgIkludmFsaWQgcGFyYW1ldGVyIGZvciAnYWdncmVnYXRlIE9HTScgc2V0dGluZyIKLQkJCSAicmVjZWl2ZWQ6ICVzXG4iLCBidWZmKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaWYgKGF0b21pY19yZWFkKCZiYXRfcHJpdi0+YWdncmVnYXRpb25fZW5hYmxlZCkgPT0gYWdncl90bXApCi0JCXJldHVybiBjb3VudDsKLQotCWJhdF9pbmZvKG5ldF9kZXYsICJDaGFuZ2luZyBhZ2dyZWdhdGlvbiBmcm9tOiAlcyB0bzogJXNcbiIsCi0JCSBhdG9taWNfcmVhZCgmYmF0X3ByaXYtPmFnZ3JlZ2F0aW9uX2VuYWJsZWQpID09IDEgPwotCQkgImVuYWJsZWQiIDogImRpc2FibGVkIiwgYWdncl90bXAgPT0gMSA/ICJlbmFibGVkIiA6Ci0JCSAiZGlzYWJsZWQiKTsKLQotCWF0b21pY19zZXQoJmJhdF9wcml2LT5hZ2dyZWdhdGlvbl9lbmFibGVkLCAodW5zaWduZWQpYWdncl90bXApOwotCXJldHVybiBjb3VudDsKLX0KLQotc3RhdGljIHNzaXplX3Qgc2hvd19ib25kKHN0cnVjdCBrb2JqZWN0ICprb2JqLCBzdHJ1Y3QgYXR0cmlidXRlICphdHRyLAotCQkJICAgICBjaGFyICpidWZmKQotewotCXN0cnVjdCBkZXZpY2UgKmRldiA9IHRvX2Rldihrb2JqLT5wYXJlbnQpOwotCXN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYgPSBuZXRkZXZfcHJpdih0b19uZXRfZGV2KGRldikpOwotCWludCBib25kX3N0YXR1cyA9IGF0b21pY19yZWFkKCZiYXRfcHJpdi0+Ym9uZGluZ19lbmFibGVkKTsKLQotCXJldHVybiBzcHJpbnRmKGJ1ZmYsICIlc1xuIiwKLQkJICAgICAgIGJvbmRfc3RhdHVzID09IDAgPyAiZGlzYWJsZWQiIDogImVuYWJsZWQiKTsKLX0KLQotc3RhdGljIHNzaXplX3Qgc3RvcmVfYm9uZChzdHJ1Y3Qga29iamVjdCAqa29iaiwgc3RydWN0IGF0dHJpYnV0ZSAqYXR0ciwKLQkJCSAgY2hhciAqYnVmZiwgc2l6ZV90IGNvdW50KQotewotCXN0cnVjdCBkZXZpY2UgKmRldiA9IHRvX2Rldihrb2JqLT5wYXJlbnQpOwotCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2ID0gdG9fbmV0X2RldihkZXYpOwotCXN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYgPSBuZXRkZXZfcHJpdihuZXRfZGV2KTsKLQlpbnQgYm9uZGluZ19lbmFibGVkX3RtcCA9IC0xOwotCi0JaWYgKCgoY291bnQgPT0gMikgJiYgKGJ1ZmZbMF0gPT0gJzEnKSkgfHwKLQkgICAgKHN0cm5jbXAoYnVmZiwgImVuYWJsZSIsIDYpID09IDApKQotCQlib25kaW5nX2VuYWJsZWRfdG1wID0gMTsKLQotCWlmICgoKGNvdW50ID09IDIpICYmIChidWZmWzBdID09ICcwJykpIHx8Ci0JICAgIChzdHJuY21wKGJ1ZmYsICJkaXNhYmxlIiwgNykgPT0gMCkpCi0JCWJvbmRpbmdfZW5hYmxlZF90bXAgPSAwOwotCi0JaWYgKGJvbmRpbmdfZW5hYmxlZF90bXAgPCAwKSB7Ci0JCWlmIChidWZmW2NvdW50IC0gMV0gPT0gJ1xuJykKLQkJCWJ1ZmZbY291bnQgLSAxXSA9ICdcMCc7Ci0KLQkJYmF0X2VycihuZXRfZGV2LAotCQkJIkludmFsaWQgcGFyYW1ldGVyIGZvciAnYm9uZGluZycgc2V0dGluZyByZWNlaXZlZDogIgotCQkJIiVzXG4iLCBidWZmKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaWYgKGF0b21pY19yZWFkKCZiYXRfcHJpdi0+Ym9uZGluZ19lbmFibGVkKSA9PSBib25kaW5nX2VuYWJsZWRfdG1wKQotCQlyZXR1cm4gY291bnQ7Ci0KLQliYXRfaW5mbyhuZXRfZGV2LCAiQ2hhbmdpbmcgYm9uZGluZyBmcm9tOiAlcyB0bzogJXNcbiIsCi0JCSBhdG9taWNfcmVhZCgmYmF0X3ByaXYtPmJvbmRpbmdfZW5hYmxlZCkgPT0gMSA/Ci0JCSAiZW5hYmxlZCIgOiAiZGlzYWJsZWQiLAotCQkgYm9uZGluZ19lbmFibGVkX3RtcCA9PSAxID8gImVuYWJsZWQiIDogImRpc2FibGVkIik7Ci0KLQlhdG9taWNfc2V0KCZiYXRfcHJpdi0+Ym9uZGluZ19lbmFibGVkLCAodW5zaWduZWQpYm9uZGluZ19lbmFibGVkX3RtcCk7Ci0JcmV0dXJuIGNvdW50OwotfQotCi1zdGF0aWMgc3NpemVfdCBzaG93X2ZyYWcoc3RydWN0IGtvYmplY3QgKmtvYmosIHN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIsCi0JCQkgICAgIGNoYXIgKmJ1ZmYpCi17Ci0Jc3RydWN0IGRldmljZSAqZGV2ID0gdG9fZGV2KGtvYmotPnBhcmVudCk7Ci0Jc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiA9IG5ldGRldl9wcml2KHRvX25ldF9kZXYoZGV2KSk7Ci0JaW50IGZyYWdfc3RhdHVzID0gYXRvbWljX3JlYWQoJmJhdF9wcml2LT5mcmFnX2VuYWJsZWQpOwotCi0JcmV0dXJuIHNwcmludGYoYnVmZiwgIiVzXG4iLAotCQkgICAgICAgZnJhZ19zdGF0dXMgPT0gMCA/ICJkaXNhYmxlZCIgOiAiZW5hYmxlZCIpOwotfQotCi1zdGF0aWMgc3NpemVfdCBzdG9yZV9mcmFnKHN0cnVjdCBrb2JqZWN0ICprb2JqLCBzdHJ1Y3QgYXR0cmlidXRlICphdHRyLAotCQkJICBjaGFyICpidWZmLCBzaXplX3QgY291bnQpCi17Ci0Jc3RydWN0IGRldmljZSAqZGV2ID0gdG9fZGV2KGtvYmotPnBhcmVudCk7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYgPSB0b19uZXRfZGV2KGRldik7Ci0Jc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiA9IG5ldGRldl9wcml2KG5ldF9kZXYpOwotCWludCBmcmFnX2VuYWJsZWRfdG1wID0gLTE7Ci0KLQlpZiAoKChjb3VudCA9PSAyKSAmJiAoYnVmZlswXSA9PSAnMScpKSB8fAotCSAgICAoc3RybmNtcChidWZmLCAiZW5hYmxlIiwgNikgPT0gMCkpCi0JCWZyYWdfZW5hYmxlZF90bXAgPSAxOwotCi0JaWYgKCgoY291bnQgPT0gMikgJiYgKGJ1ZmZbMF0gPT0gJzAnKSkgfHwKLQkgICAgKHN0cm5jbXAoYnVmZiwgImRpc2FibGUiLCA3KSA9PSAwKSkKLQkJZnJhZ19lbmFibGVkX3RtcCA9IDA7Ci0KLQlpZiAoZnJhZ19lbmFibGVkX3RtcCA8IDApIHsKLQkJaWYgKGJ1ZmZbY291bnQgLSAxXSA9PSAnXG4nKQotCQkJYnVmZltjb3VudCAtIDFdID0gJ1wwJzsKLQotCQliYXRfZXJyKG5ldF9kZXYsCi0JCQkiSW52YWxpZCBwYXJhbWV0ZXIgZm9yICdmcmFnbWVudGF0aW9uJyBzZXR0aW5nIG9uIG1lc2giCi0JCQkicmVjZWl2ZWQ6ICVzXG4iLCBidWZmKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaWYgKGF0b21pY19yZWFkKCZiYXRfcHJpdi0+ZnJhZ19lbmFibGVkKSA9PSBmcmFnX2VuYWJsZWRfdG1wKQotCQlyZXR1cm4gY291bnQ7Ci0KLQliYXRfaW5mbyhuZXRfZGV2LCAiQ2hhbmdpbmcgZnJhZ21lbnRhdGlvbiBmcm9tOiAlcyB0bzogJXNcbiIsCi0JCSBhdG9taWNfcmVhZCgmYmF0X3ByaXYtPmZyYWdfZW5hYmxlZCkgPT0gMSA/Ci0JCSAiZW5hYmxlZCIgOiAiZGlzYWJsZWQiLAotCQkgZnJhZ19lbmFibGVkX3RtcCA9PSAxID8gImVuYWJsZWQiIDogImRpc2FibGVkIik7Ci0KLQlhdG9taWNfc2V0KCZiYXRfcHJpdi0+ZnJhZ19lbmFibGVkLCAodW5zaWduZWQpZnJhZ19lbmFibGVkX3RtcCk7Ci0JdXBkYXRlX21pbl9tdHUobmV0X2Rldik7Ci0JcmV0dXJuIGNvdW50OwotfQotCi1zdGF0aWMgc3NpemVfdCBzaG93X3Zpc19tb2RlKHN0cnVjdCBrb2JqZWN0ICprb2JqLCBzdHJ1Y3QgYXR0cmlidXRlICphdHRyLAotCQkJICAgICBjaGFyICpidWZmKQotewotCXN0cnVjdCBkZXZpY2UgKmRldiA9IHRvX2Rldihrb2JqLT5wYXJlbnQpOwotCXN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYgPSBuZXRkZXZfcHJpdih0b19uZXRfZGV2KGRldikpOwotCWludCB2aXNfbW9kZSA9IGF0b21pY19yZWFkKCZiYXRfcHJpdi0+dmlzX21vZGUpOwotCi0JcmV0dXJuIHNwcmludGYoYnVmZiwgIiVzXG4iLAotCQkgICAgICAgdmlzX21vZGUgPT0gVklTX1RZUEVfQ0xJRU5UX1VQREFURSA/Ci0JCQkJCQkJImNsaWVudCIgOiAic2VydmVyIik7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IHN0b3JlX3Zpc19tb2RlKHN0cnVjdCBrb2JqZWN0ICprb2JqLCBzdHJ1Y3QgYXR0cmlidXRlICphdHRyLAotCQkJICAgICAgY2hhciAqYnVmZiwgc2l6ZV90IGNvdW50KQotewotCXN0cnVjdCBkZXZpY2UgKmRldiA9IHRvX2Rldihrb2JqLT5wYXJlbnQpOwotCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2ID0gdG9fbmV0X2RldihkZXYpOwotCXN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYgPSBuZXRkZXZfcHJpdihuZXRfZGV2KTsKLQl1bnNpZ25lZCBsb25nIHZhbDsKLQlpbnQgcmV0LCB2aXNfbW9kZV90bXAgPSAtMTsKLQotCXJldCA9IHN0cmljdF9zdHJ0b3VsKGJ1ZmYsIDEwLCAmdmFsKTsKLQotCWlmICgoKGNvdW50ID09IDIpICYmICghcmV0KSAmJiAodmFsID09IFZJU19UWVBFX0NMSUVOVF9VUERBVEUpKSB8fAotCSAgICAoc3RybmNtcChidWZmLCAiY2xpZW50IiwgNikgPT0gMCkgfHwKLQkgICAgKHN0cm5jbXAoYnVmZiwgIm9mZiIsIDMpID09IDApKQotCQl2aXNfbW9kZV90bXAgPSBWSVNfVFlQRV9DTElFTlRfVVBEQVRFOwotCi0JaWYgKCgoY291bnQgPT0gMikgJiYgKCFyZXQpICYmICh2YWwgPT0gVklTX1RZUEVfU0VSVkVSX1NZTkMpKSB8fAotCSAgICAoc3RybmNtcChidWZmLCAic2VydmVyIiwgNikgPT0gMCkpCi0JCXZpc19tb2RlX3RtcCA9IFZJU19UWVBFX1NFUlZFUl9TWU5DOwotCi0JaWYgKHZpc19tb2RlX3RtcCA8IDApIHsKLQkJaWYgKGJ1ZmZbY291bnQgLSAxXSA9PSAnXG4nKQotCQkJYnVmZltjb3VudCAtIDFdID0gJ1wwJzsKLQotCQliYXRfaW5mbyhuZXRfZGV2LAotCQkJICJJbnZhbGlkIHBhcmFtZXRlciBmb3IgJ3ZpcyBtb2RlJyBzZXR0aW5nIHJlY2VpdmVkOiAiCi0JCQkgIiVzXG4iLCBidWZmKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaWYgKGF0b21pY19yZWFkKCZiYXRfcHJpdi0+dmlzX21vZGUpID09IHZpc19tb2RlX3RtcCkKLQkJcmV0dXJuIGNvdW50OwotCi0JYmF0X2luZm8obmV0X2RldiwgIkNoYW5naW5nIHZpcyBtb2RlIGZyb206ICVzIHRvOiAlc1xuIiwKLQkJIGF0b21pY19yZWFkKCZiYXRfcHJpdi0+dmlzX21vZGUpID09IFZJU19UWVBFX0NMSUVOVF9VUERBVEUgPwotCQkgImNsaWVudCIgOiAic2VydmVyIiwgdmlzX21vZGVfdG1wID09IFZJU19UWVBFX0NMSUVOVF9VUERBVEUgPwotCQkgImNsaWVudCIgOiAic2VydmVyIik7Ci0KLQlhdG9taWNfc2V0KCZiYXRfcHJpdi0+dmlzX21vZGUsICh1bnNpZ25lZCl2aXNfbW9kZV90bXApOwotCXJldHVybiBjb3VudDsKLX0KLQotc3RhdGljIHNzaXplX3Qgc2hvd19vcmlnX2ludGVydmFsKHN0cnVjdCBrb2JqZWN0ICprb2JqLCBzdHJ1Y3QgYXR0cmlidXRlICphdHRyLAotCQkJCSBjaGFyICpidWZmKQotewotCXN0cnVjdCBkZXZpY2UgKmRldiA9IHRvX2Rldihrb2JqLT5wYXJlbnQpOwotCXN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYgPSBuZXRkZXZfcHJpdih0b19uZXRfZGV2KGRldikpOwotCi0JcmV0dXJuIHNwcmludGYoYnVmZiwgIiVpXG4iLAotCQkgICAgICAgYXRvbWljX3JlYWQoJmJhdF9wcml2LT5vcmlnX2ludGVydmFsKSk7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IHN0b3JlX29yaWdfaW50ZXJ2YWwoc3RydWN0IGtvYmplY3QgKmtvYmosIHN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIsCi0JCQkJICBjaGFyICpidWZmLCBzaXplX3QgY291bnQpCi17Ci0Jc3RydWN0IGRldmljZSAqZGV2ID0gdG9fZGV2KGtvYmotPnBhcmVudCk7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYgPSB0b19uZXRfZGV2KGRldik7Ci0Jc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiA9IG5ldGRldl9wcml2KG5ldF9kZXYpOwotCXVuc2lnbmVkIGxvbmcgb3JpZ19pbnRlcnZhbF90bXA7Ci0JaW50IHJldDsKLQotCXJldCA9IHN0cmljdF9zdHJ0b3VsKGJ1ZmYsIDEwLCAmb3JpZ19pbnRlcnZhbF90bXApOwotCWlmIChyZXQpIHsKLQkJYmF0X2luZm8obmV0X2RldiwgIkludmFsaWQgcGFyYW1ldGVyIGZvciAnb3JpZ19pbnRlcnZhbCcgIgotCQkJICJzZXR0aW5nIHJlY2VpdmVkOiAlc1xuIiwgYnVmZik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWlmIChvcmlnX2ludGVydmFsX3RtcCA8IEpJVFRFUiAqIDIpIHsKLQkJYmF0X2luZm8obmV0X2RldiwgIk5ldyBvcmlnaW5hdG9yIGludGVydmFsIHRvbyBzbWFsbDogJWxpICIKLQkJCSAiKG1pbjogJWkpXG4iLCBvcmlnX2ludGVydmFsX3RtcCwgSklUVEVSICogMik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWlmIChhdG9taWNfcmVhZCgmYmF0X3ByaXYtPm9yaWdfaW50ZXJ2YWwpID09IG9yaWdfaW50ZXJ2YWxfdG1wKQotCQlyZXR1cm4gY291bnQ7Ci0KLQliYXRfaW5mbyhuZXRfZGV2LCAiQ2hhbmdpbmcgb3JpZ2luYXRvciBpbnRlcnZhbCBmcm9tOiAlaSB0bzogJWxpXG4iLAotCQkgYXRvbWljX3JlYWQoJmJhdF9wcml2LT5vcmlnX2ludGVydmFsKSwKLQkJIG9yaWdfaW50ZXJ2YWxfdG1wKTsKLQotCWF0b21pY19zZXQoJmJhdF9wcml2LT5vcmlnX2ludGVydmFsLCBvcmlnX2ludGVydmFsX3RtcCk7Ci0JcmV0dXJuIGNvdW50OwotfQotCi0jaWZkZWYgQ09ORklHX0JBVE1BTl9BRFZfREVCVUcKLXN0YXRpYyBzc2l6ZV90IHNob3dfbG9nX2xldmVsKHN0cnVjdCBrb2JqZWN0ICprb2JqLCBzdHJ1Y3QgYXR0cmlidXRlICphdHRyLAotCQkJICAgICBjaGFyICpidWZmKQotewotCXN0cnVjdCBkZXZpY2UgKmRldiA9IHRvX2Rldihrb2JqLT5wYXJlbnQpOwotCXN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYgPSBuZXRkZXZfcHJpdih0b19uZXRfZGV2KGRldikpOwotCWludCBsb2dfbGV2ZWwgPSBhdG9taWNfcmVhZCgmYmF0X3ByaXYtPmxvZ19sZXZlbCk7Ci0KLQlyZXR1cm4gc3ByaW50ZihidWZmLCAiJWRcbiIsIGxvZ19sZXZlbCk7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IHN0b3JlX2xvZ19sZXZlbChzdHJ1Y3Qga29iamVjdCAqa29iaiwgc3RydWN0IGF0dHJpYnV0ZSAqYXR0ciwKLQkJCSAgICAgIGNoYXIgKmJ1ZmYsIHNpemVfdCBjb3VudCkKLXsKLQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSB0b19kZXYoa29iai0+cGFyZW50KTsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldiA9IHRvX25ldF9kZXYoZGV2KTsKLQlzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2ID0gbmV0ZGV2X3ByaXYobmV0X2Rldik7Ci0JdW5zaWduZWQgbG9uZyBsb2dfbGV2ZWxfdG1wOwotCWludCByZXQ7Ci0KLQlyZXQgPSBzdHJpY3Rfc3RydG91bChidWZmLCAxMCwgJmxvZ19sZXZlbF90bXApOwotCWlmIChyZXQpIHsKLQkJYmF0X2luZm8obmV0X2RldiwgIkludmFsaWQgcGFyYW1ldGVyIGZvciAnbG9nX2xldmVsJyAiCi0JCQkgInNldHRpbmcgcmVjZWl2ZWQ6ICVzXG4iLCBidWZmKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaWYgKGxvZ19sZXZlbF90bXAgPiAzKSB7Ci0JCWJhdF9pbmZvKG5ldF9kZXYsICJOZXcgbG9nIGxldmVsIHRvbyBiaWc6ICVsaSAiCi0JCQkgIihtYXg6ICVpKVxuIiwgbG9nX2xldmVsX3RtcCwgMyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWlmIChhdG9taWNfcmVhZCgmYmF0X3ByaXYtPmxvZ19sZXZlbCkgPT0gbG9nX2xldmVsX3RtcCkKLQkJcmV0dXJuIGNvdW50OwotCi0JYmF0X2luZm8obmV0X2RldiwgIkNoYW5naW5nIGxvZyBsZXZlbCBmcm9tOiAlaSB0bzogJWxpXG4iLAotCQkgYXRvbWljX3JlYWQoJmJhdF9wcml2LT5sb2dfbGV2ZWwpLAotCQkgbG9nX2xldmVsX3RtcCk7Ci0KLQlhdG9taWNfc2V0KCZiYXRfcHJpdi0+bG9nX2xldmVsLCAodW5zaWduZWQpbG9nX2xldmVsX3RtcCk7Ci0JcmV0dXJuIGNvdW50OwotfQotI2VuZGlmCi0KLXN0YXRpYyBCQVRfQVRUUihhZ2dyZWdhdGVkX29nbXMsIFNfSVJVR08gfCBTX0lXVVNSLAotCQlzaG93X2FnZ3Jfb2dtcywgc3RvcmVfYWdncl9vZ21zKTsKLXN0YXRpYyBCQVRfQVRUUihib25kaW5nLCBTX0lSVUdPIHwgU19JV1VTUiwgc2hvd19ib25kLCBzdG9yZV9ib25kKTsKLXN0YXRpYyBCQVRfQVRUUihmcmFnbWVudGF0aW9uLCBTX0lSVUdPIHwgU19JV1VTUiwgc2hvd19mcmFnLCBzdG9yZV9mcmFnKTsKLXN0YXRpYyBCQVRfQVRUUih2aXNfbW9kZSwgU19JUlVHTyB8IFNfSVdVU1IsIHNob3dfdmlzX21vZGUsIHN0b3JlX3Zpc19tb2RlKTsKLXN0YXRpYyBCQVRfQVRUUihvcmlnX2ludGVydmFsLCBTX0lSVUdPIHwgU19JV1VTUiwKLQkJc2hvd19vcmlnX2ludGVydmFsLCBzdG9yZV9vcmlnX2ludGVydmFsKTsKLSNpZmRlZiBDT05GSUdfQkFUTUFOX0FEVl9ERUJVRwotc3RhdGljIEJBVF9BVFRSKGxvZ19sZXZlbCwgU19JUlVHTyB8IFNfSVdVU1IsIHNob3dfbG9nX2xldmVsLCBzdG9yZV9sb2dfbGV2ZWwpOwotI2VuZGlmCi0KLXN0YXRpYyBzdHJ1Y3QgYmF0X2F0dHJpYnV0ZSAqbWVzaF9hdHRyc1tdID0gewotCSZiYXRfYXR0cl9hZ2dyZWdhdGVkX29nbXMsCi0JJmJhdF9hdHRyX2JvbmRpbmcsCi0JJmJhdF9hdHRyX2ZyYWdtZW50YXRpb24sCi0JJmJhdF9hdHRyX3Zpc19tb2RlLAotCSZiYXRfYXR0cl9vcmlnX2ludGVydmFsLAotI2lmZGVmIENPTkZJR19CQVRNQU5fQURWX0RFQlVHCi0JJmJhdF9hdHRyX2xvZ19sZXZlbCwKLSNlbmRpZgotCU5VTEwsCi19OwotCi1pbnQgc3lzZnNfYWRkX21lc2hpZihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQotewotCXN0cnVjdCBrb2JqZWN0ICpiYXRpZl9rb2JqZWN0ID0gJmRldi0+ZGV2LmtvYmo7Ci0Jc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiA9IG5ldGRldl9wcml2KGRldik7Ci0Jc3RydWN0IGJhdF9hdHRyaWJ1dGUgKipiYXRfYXR0cjsKLQlpbnQgZXJyOwotCi0JYmF0X3ByaXYtPm1lc2hfb2JqID0ga29iamVjdF9jcmVhdGVfYW5kX2FkZChTWVNGU19JRl9NRVNIX1NVQkRJUiwKLQkJCQkJCSAgICBiYXRpZl9rb2JqZWN0KTsKLQlpZiAoIWJhdF9wcml2LT5tZXNoX29iaikgewotCQliYXRfZXJyKGRldiwgIkNhbid0IGFkZCBzeXNmcyBkaXJlY3Rvcnk6ICVzLyVzXG4iLCBkZXYtPm5hbWUsCi0JCQlTWVNGU19JRl9NRVNIX1NVQkRJUik7Ci0JCWdvdG8gb3V0OwotCX0KLQotCWZvciAoYmF0X2F0dHIgPSBtZXNoX2F0dHJzOyAqYmF0X2F0dHI7ICsrYmF0X2F0dHIpIHsKLQkJZXJyID0gc3lzZnNfY3JlYXRlX2ZpbGUoYmF0X3ByaXYtPm1lc2hfb2JqLAotCQkJCQkmKCgqYmF0X2F0dHIpLT5hdHRyKSk7Ci0JCWlmIChlcnIpIHsKLQkJCWJhdF9lcnIoZGV2LCAiQ2FuJ3QgYWRkIHN5c2ZzIGZpbGU6ICVzLyVzLyVzXG4iLAotCQkJCWRldi0+bmFtZSwgU1lTRlNfSUZfTUVTSF9TVUJESVIsCi0JCQkJKCgqYmF0X2F0dHIpLT5hdHRyKS5uYW1lKTsKLQkJCWdvdG8gcmVtX2F0dHI7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gMDsKLQotcmVtX2F0dHI6Ci0JZm9yIChiYXRfYXR0ciA9IG1lc2hfYXR0cnM7ICpiYXRfYXR0cjsgKytiYXRfYXR0cikKLQkJc3lzZnNfcmVtb3ZlX2ZpbGUoYmF0X3ByaXYtPm1lc2hfb2JqLCAmKCgqYmF0X2F0dHIpLT5hdHRyKSk7Ci0KLQlrb2JqZWN0X3B1dChiYXRfcHJpdi0+bWVzaF9vYmopOwotCWJhdF9wcml2LT5tZXNoX29iaiA9IE5VTEw7Ci1vdXQ6Ci0JcmV0dXJuIC1FTk9NRU07Ci19Ci0KLXZvaWQgc3lzZnNfZGVsX21lc2hpZihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQotewotCXN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYgPSBuZXRkZXZfcHJpdihkZXYpOwotCXN0cnVjdCBiYXRfYXR0cmlidXRlICoqYmF0X2F0dHI7Ci0KLQlmb3IgKGJhdF9hdHRyID0gbWVzaF9hdHRyczsgKmJhdF9hdHRyOyArK2JhdF9hdHRyKQotCQlzeXNmc19yZW1vdmVfZmlsZShiYXRfcHJpdi0+bWVzaF9vYmosICYoKCpiYXRfYXR0ciktPmF0dHIpKTsKLQotCWtvYmplY3RfcHV0KGJhdF9wcml2LT5tZXNoX29iaik7Ci0JYmF0X3ByaXYtPm1lc2hfb2JqID0gTlVMTDsKLX0KLQotc3RhdGljIHNzaXplX3Qgc2hvd19tZXNoX2lmYWNlKHN0cnVjdCBrb2JqZWN0ICprb2JqLCBzdHJ1Y3QgYXR0cmlidXRlICphdHRyLAotCQkJICAgICAgIGNoYXIgKmJ1ZmYpCi17Ci0Jc3RydWN0IGRldmljZSAqZGV2ID0gdG9fZGV2KGtvYmotPnBhcmVudCk7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYgPSB0b19uZXRfZGV2KGRldik7Ci0Jc3RydWN0IGJhdG1hbl9pZiAqYmF0bWFuX2lmID0gZ2V0X2JhdG1hbl9pZl9ieV9uZXRkZXYobmV0X2Rldik7Ci0Jc3NpemVfdCBsZW5ndGg7Ci0KLQlpZiAoIWJhdG1hbl9pZikKLQkJcmV0dXJuIDA7Ci0KLQlsZW5ndGggPSBzcHJpbnRmKGJ1ZmYsICIlc1xuIiwgYmF0bWFuX2lmLT5pZl9zdGF0dXMgPT0gSUZfTk9UX0lOX1VTRSA/Ci0JCQkgIm5vbmUiIDogYmF0bWFuX2lmLT5zb2Z0X2lmYWNlLT5uYW1lKTsKLQotCWhhcmRpZl9wdXQoYmF0bWFuX2lmKTsKLQotCXJldHVybiBsZW5ndGg7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IHN0b3JlX21lc2hfaWZhY2Uoc3RydWN0IGtvYmplY3QgKmtvYmosIHN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIsCi0JCQkJY2hhciAqYnVmZiwgc2l6ZV90IGNvdW50KQotewotCXN0cnVjdCBkZXZpY2UgKmRldiA9IHRvX2Rldihrb2JqLT5wYXJlbnQpOwotCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2ID0gdG9fbmV0X2RldihkZXYpOwotCXN0cnVjdCBiYXRtYW5faWYgKmJhdG1hbl9pZiA9IGdldF9iYXRtYW5faWZfYnlfbmV0ZGV2KG5ldF9kZXYpOwotCWludCBzdGF0dXNfdG1wID0gLTE7Ci0JaW50IHJldDsKLQotCWlmICghYmF0bWFuX2lmKQotCQlyZXR1cm4gY291bnQ7Ci0KLQlpZiAoYnVmZltjb3VudCAtIDFdID09ICdcbicpCi0JCWJ1ZmZbY291bnQgLSAxXSA9ICdcMCc7Ci0KLQlpZiAoc3RybGVuKGJ1ZmYpID49IElGTkFNU0laKSB7Ci0JCXByX2VycigiSW52YWxpZCBwYXJhbWV0ZXIgZm9yICdtZXNoX2lmYWNlJyBzZXR0aW5nIHJlY2VpdmVkOiAiCi0JCSAgICAgICAiaW50ZXJmYWNlIG5hbWUgdG9vIGxvbmcgJyVzJ1xuIiwgYnVmZik7Ci0JCWhhcmRpZl9wdXQoYmF0bWFuX2lmKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaWYgKHN0cm5jbXAoYnVmZiwgIm5vbmUiLCA0KSA9PSAwKQotCQlzdGF0dXNfdG1wID0gSUZfTk9UX0lOX1VTRTsKLQllbHNlCi0JCXN0YXR1c190bXAgPSBJRl9JX1dBTlRfWU9VOwotCi0JaWYgKChiYXRtYW5faWYtPmlmX3N0YXR1cyA9PSBzdGF0dXNfdG1wKSB8fCAoKGJhdG1hbl9pZi0+c29mdF9pZmFjZSkgJiYKLQkgICAgKHN0cm5jbXAoYmF0bWFuX2lmLT5zb2Z0X2lmYWNlLT5uYW1lLCBidWZmLCBJRk5BTVNJWikgPT0gMCkpKSB7Ci0JCWhhcmRpZl9wdXQoYmF0bWFuX2lmKTsKLQkJcmV0dXJuIGNvdW50OwotCX0KLQotCWlmIChzdGF0dXNfdG1wID09IElGX05PVF9JTl9VU0UpIHsKLQkJcnRubF9sb2NrKCk7Ci0JCWhhcmRpZl9kaXNhYmxlX2ludGVyZmFjZShiYXRtYW5faWYpOwotCQlydG5sX3VubG9jaygpOwotCQloYXJkaWZfcHV0KGJhdG1hbl9pZik7Ci0JCXJldHVybiBjb3VudDsKLQl9Ci0KLQkvKiBpZiB0aGUgaW50ZXJmYWNlIGFscmVhZHkgaXMgaW4gdXNlICovCi0JaWYgKGJhdG1hbl9pZi0+aWZfc3RhdHVzICE9IElGX05PVF9JTl9VU0UpIHsKLQkJcnRubF9sb2NrKCk7Ci0JCWhhcmRpZl9kaXNhYmxlX2ludGVyZmFjZShiYXRtYW5faWYpOwotCQlydG5sX3VubG9jaygpOwotCX0KLQotCXJldCA9IGhhcmRpZl9lbmFibGVfaW50ZXJmYWNlKGJhdG1hbl9pZiwgYnVmZik7Ci0JaGFyZGlmX3B1dChiYXRtYW5faWYpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHNzaXplX3Qgc2hvd19pZmFjZV9zdGF0dXMoc3RydWN0IGtvYmplY3QgKmtvYmosIHN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIsCi0JCQkJIGNoYXIgKmJ1ZmYpCi17Ci0Jc3RydWN0IGRldmljZSAqZGV2ID0gdG9fZGV2KGtvYmotPnBhcmVudCk7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYgPSB0b19uZXRfZGV2KGRldik7Ci0Jc3RydWN0IGJhdG1hbl9pZiAqYmF0bWFuX2lmID0gZ2V0X2JhdG1hbl9pZl9ieV9uZXRkZXYobmV0X2Rldik7Ci0Jc3NpemVfdCBsZW5ndGg7Ci0KLQlpZiAoIWJhdG1hbl9pZikKLQkJcmV0dXJuIDA7Ci0KLQlzd2l0Y2ggKGJhdG1hbl9pZi0+aWZfc3RhdHVzKSB7Ci0JY2FzZSBJRl9UT19CRV9SRU1PVkVEOgotCQlsZW5ndGggPSBzcHJpbnRmKGJ1ZmYsICJkaXNhYmxpbmdcbiIpOwotCQlicmVhazsKLQljYXNlIElGX0lOQUNUSVZFOgotCQlsZW5ndGggPSBzcHJpbnRmKGJ1ZmYsICJpbmFjdGl2ZVxuIik7Ci0JCWJyZWFrOwotCWNhc2UgSUZfQUNUSVZFOgotCQlsZW5ndGggPSBzcHJpbnRmKGJ1ZmYsICJhY3RpdmVcbiIpOwotCQlicmVhazsKLQljYXNlIElGX1RPX0JFX0FDVElWQVRFRDoKLQkJbGVuZ3RoID0gc3ByaW50ZihidWZmLCAiZW5hYmxpbmdcbiIpOwotCQlicmVhazsKLQljYXNlIElGX05PVF9JTl9VU0U6Ci0JZGVmYXVsdDoKLQkJbGVuZ3RoID0gc3ByaW50ZihidWZmLCAibm90IGluIHVzZVxuIik7Ci0JCWJyZWFrOwotCX0KLQotCWhhcmRpZl9wdXQoYmF0bWFuX2lmKTsKLQotCXJldHVybiBsZW5ndGg7Ci19Ci0KLXN0YXRpYyBCQVRfQVRUUihtZXNoX2lmYWNlLCBTX0lSVUdPIHwgU19JV1VTUiwKLQkJc2hvd19tZXNoX2lmYWNlLCBzdG9yZV9tZXNoX2lmYWNlKTsKLXN0YXRpYyBCQVRfQVRUUihpZmFjZV9zdGF0dXMsIFNfSVJVR08sIHNob3dfaWZhY2Vfc3RhdHVzLCBOVUxMKTsKLQotc3RhdGljIHN0cnVjdCBiYXRfYXR0cmlidXRlICpiYXRtYW5fYXR0cnNbXSA9IHsKLQkmYmF0X2F0dHJfbWVzaF9pZmFjZSwKLQkmYmF0X2F0dHJfaWZhY2Vfc3RhdHVzLAotCU5VTEwsCi19OwotCi1pbnQgc3lzZnNfYWRkX2hhcmRpZihzdHJ1Y3Qga29iamVjdCAqKmhhcmRpZl9vYmosIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IGtvYmplY3QgKmhhcmRpZl9rb2JqZWN0ID0gJmRldi0+ZGV2LmtvYmo7Ci0Jc3RydWN0IGJhdF9hdHRyaWJ1dGUgKipiYXRfYXR0cjsKLQlpbnQgZXJyOwotCi0JKmhhcmRpZl9vYmogPSBrb2JqZWN0X2NyZWF0ZV9hbmRfYWRkKFNZU0ZTX0lGX0JBVF9TVUJESVIsCi0JCQkJCQkgICAgaGFyZGlmX2tvYmplY3QpOwotCi0JaWYgKCEqaGFyZGlmX29iaikgewotCQliYXRfZXJyKGRldiwgIkNhbid0IGFkZCBzeXNmcyBkaXJlY3Rvcnk6ICVzLyVzXG4iLCBkZXYtPm5hbWUsCi0JCQlTWVNGU19JRl9CQVRfU1VCRElSKTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JZm9yIChiYXRfYXR0ciA9IGJhdG1hbl9hdHRyczsgKmJhdF9hdHRyOyArK2JhdF9hdHRyKSB7Ci0JCWVyciA9IHN5c2ZzX2NyZWF0ZV9maWxlKCpoYXJkaWZfb2JqLCAmKCgqYmF0X2F0dHIpLT5hdHRyKSk7Ci0JCWlmIChlcnIpIHsKLQkJCWJhdF9lcnIoZGV2LCAiQ2FuJ3QgYWRkIHN5c2ZzIGZpbGU6ICVzLyVzLyVzXG4iLAotCQkJCWRldi0+bmFtZSwgU1lTRlNfSUZfQkFUX1NVQkRJUiwKLQkJCQkoKCpiYXRfYXR0ciktPmF0dHIpLm5hbWUpOwotCQkJZ290byByZW1fYXR0cjsKLQkJfQotCX0KLQotCXJldHVybiAwOwotCi1yZW1fYXR0cjoKLQlmb3IgKGJhdF9hdHRyID0gYmF0bWFuX2F0dHJzOyAqYmF0X2F0dHI7ICsrYmF0X2F0dHIpCi0JCXN5c2ZzX3JlbW92ZV9maWxlKCpoYXJkaWZfb2JqLCAmKCgqYmF0X2F0dHIpLT5hdHRyKSk7Ci1vdXQ6Ci0JcmV0dXJuIC1FTk9NRU07Ci19Ci0KLXZvaWQgc3lzZnNfZGVsX2hhcmRpZihzdHJ1Y3Qga29iamVjdCAqKmhhcmRpZl9vYmopCi17Ci0Ja29iamVjdF9wdXQoKmhhcmRpZl9vYmopOwotCSpoYXJkaWZfb2JqID0gTlVMTDsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L2JhdF9zeXNmcy5oIGIvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvYmF0X3N5c2ZzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmMTg2YzAuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvYmF0X3N5c2ZzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEwIEIuQS5ULk0uQS5OLiBjb250cmlidXRvcnM6Ci0gKgotICogTWFyZWsgTGluZG5lcgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQotICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQotICogMDIxMTAtMTMwMSwgVVNBCi0gKgotICovCi0KLQotI2lmbmRlZiBfTkVUX0JBVE1BTl9BRFZfU1lTRlNfSF8KLSNkZWZpbmUgX05FVF9CQVRNQU5fQURWX1NZU0ZTX0hfCi0KLSNkZWZpbmUgU1lTRlNfSUZfTUVTSF9TVUJESVIgIm1lc2giCi0jZGVmaW5lIFNZU0ZTX0lGX0JBVF9TVUJESVIgImJhdG1hbl9hZHYiCi0KLXN0cnVjdCBiYXRfYXR0cmlidXRlIHsKLQlzdHJ1Y3QgYXR0cmlidXRlIGF0dHI7Ci0Jc3NpemVfdCAoKnNob3cpKHN0cnVjdCBrb2JqZWN0ICprb2JqLCBzdHJ1Y3QgYXR0cmlidXRlICphdHRyLAotCQkJY2hhciAqYnVmKTsKLQlzc2l6ZV90ICgqc3RvcmUpKHN0cnVjdCBrb2JqZWN0ICprb2JqLCBzdHJ1Y3QgYXR0cmlidXRlICphdHRyLAotCQkJIGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KTsKLX07Ci0KLWludCBzeXNmc19hZGRfbWVzaGlmKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwotdm9pZCBzeXNmc19kZWxfbWVzaGlmKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwotaW50IHN5c2ZzX2FkZF9oYXJkaWYoc3RydWN0IGtvYmplY3QgKipoYXJkaWZfb2JqLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKLXZvaWQgc3lzZnNfZGVsX2hhcmRpZihzdHJ1Y3Qga29iamVjdCAqKmhhcmRpZl9vYmopOwotCi0jZW5kaWYgLyogX05FVF9CQVRNQU5fQURWX1NZU0ZTX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9iaXRhcnJheS5jIGIvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvYml0YXJyYXkuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODE0Mjc0Zi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9iaXRhcnJheS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjAxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDYtMjAxMCBCLkEuVC5NLkEuTi4gY29udHJpYnV0b3JzOgotICoKLSAqIFNpbW9uIFd1bmRlcmxpY2gsIE1hcmVrIExpbmRuZXIKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKLSAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKLSAqIDAyMTEwLTEzMDEsIFVTQQotICoKLSAqLwotCi0jaW5jbHVkZSAibWFpbi5oIgotI2luY2x1ZGUgImJpdGFycmF5LmgiCi0KLSNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KLQotLyogcmV0dXJucyB0cnVlIGlmIHRoZSBjb3JyZXNwb25kaW5nIGJpdCBpbiB0aGUgZ2l2ZW4gc2VxX2JpdHMgaW5kaWNhdGVzIHRydWUKLSAqIGFuZCBjdXJyX3NlcW5vIGlzIHdpdGhpbiByYW5nZSBvZiBsYXN0X3NlcW5vICovCi11aW50OF90IGdldF9iaXRfc3RhdHVzKFRZUEVfT0ZfV09SRCAqc2VxX2JpdHMsIHVpbnQzMl90IGxhc3Rfc2Vxbm8sCi0JCSAgICAgICB1aW50MzJfdCBjdXJyX3NlcW5vKQotewotCWludDMyX3QgZGlmZiwgd29yZF9vZmZzZXQsIHdvcmRfbnVtOwotCi0JZGlmZiA9IGxhc3Rfc2Vxbm8gLSBjdXJyX3NlcW5vOwotCWlmIChkaWZmIDwgMCB8fCBkaWZmID49IFRRX0xPQ0FMX1dJTkRPV19TSVpFKSB7Ci0JCXJldHVybiAwOwotCX0gZWxzZSB7Ci0JCS8qIHdoaWNoIHdvcmQgKi8KLQkJd29yZF9udW0gPSAobGFzdF9zZXFubyAtIGN1cnJfc2Vxbm8pIC8gV09SRF9CSVRfU0laRTsKLQkJLyogd2hpY2ggcG9zaXRpb24gaW4gdGhlIHNlbGVjdGVkIHdvcmQgKi8KLQkJd29yZF9vZmZzZXQgPSAobGFzdF9zZXFubyAtIGN1cnJfc2Vxbm8pICUgV09SRF9CSVRfU0laRTsKLQotCQlpZiAoc2VxX2JpdHNbd29yZF9udW1dICYgMSA8PCB3b3JkX29mZnNldCkKLQkJCXJldHVybiAxOwotCQllbHNlCi0JCQlyZXR1cm4gMDsKLQl9Ci19Ci0KLS8qIHR1cm4gY29ycmVzcG9uZGluZyBiaXQgb24sIHNvIHdlIGNhbiByZW1lbWJlciB0aGF0IHdlIGdvdCB0aGUgcGFja2V0ICovCi12b2lkIGJpdF9tYXJrKFRZUEVfT0ZfV09SRCAqc2VxX2JpdHMsIGludDMyX3QgbikKLXsKLQlpbnQzMl90IHdvcmRfb2Zmc2V0LCB3b3JkX251bTsKLQotCS8qIGlmIHRvbyBvbGQsIGp1c3QgZHJvcCBpdCAqLwotCWlmIChuIDwgMCB8fCBuID49IFRRX0xPQ0FMX1dJTkRPV19TSVpFKQotCQlyZXR1cm47Ci0KLQkvKiB3aGljaCB3b3JkICovCi0Jd29yZF9udW0gPSBuIC8gV09SRF9CSVRfU0laRTsKLQkvKiB3aGljaCBwb3NpdGlvbiBpbiB0aGUgc2VsZWN0ZWQgd29yZCAqLwotCXdvcmRfb2Zmc2V0ID0gbiAlIFdPUkRfQklUX1NJWkU7Ci0KLQlzZXFfYml0c1t3b3JkX251bV0gfD0gMSA8PCB3b3JkX29mZnNldDsJLyogdHVybiB0aGUgcG9zaXRpb24gb24gKi8KLX0KLQotLyogc2hpZnQgdGhlIHBhY2tldCBhcnJheSBieSBuIHBsYWNlcy4gKi8KLXN0YXRpYyB2b2lkIGJpdF9zaGlmdChUWVBFX09GX1dPUkQgKnNlcV9iaXRzLCBpbnQzMl90IG4pCi17Ci0JaW50MzJfdCB3b3JkX29mZnNldCwgd29yZF9udW07Ci0JaW50MzJfdCBpOwotCi0JaWYgKG4gPD0gMCB8fCBuID49IFRRX0xPQ0FMX1dJTkRPV19TSVpFKQotCQlyZXR1cm47Ci0KLQl3b3JkX29mZnNldCA9IG4gJSBXT1JEX0JJVF9TSVpFOy8qIHNoaWZ0IGhvdyBtdWNoIGluc2lkZSBlYWNoIHdvcmQgKi8KLQl3b3JkX251bSA9IG4gLyBXT1JEX0JJVF9TSVpFOwkvKiBzaGlmdCBvdmVyIGhvdyBtdWNoIChmdWxsKSB3b3JkcyAqLwotCi0JZm9yIChpID0gTlVNX1dPUkRTIC0gMTsgaSA+IHdvcmRfbnVtOyBpLS0pIHsKLQkJLyogZ29pbmcgZnJvbSBvbGQgdG8gbmV3LCBzbyB3ZSBkb24ndCBvdmVyd3JpdGUgdGhlIGRhdGEgd2UgY29weQotCQkgKiBmcm9tLgotCQkgKgotCQkgKiBsZWZ0IGlzIGhpZ2gsIHJpZ2h0IGlzIGxvdzogRkVEQyBCQTk4IDc2NTQgMzIxMAotCQkgKgkJCQkJICBeXiBeXgotCQkgKgkJCSAgICAgICB2dnZ2Ci0JCSAqIF5eXl4gPSBmcm9tLCB2dnZ2diA9dG8sIHdlJ2QgaGF2ZSB3b3JkX251bT09MSBhbmQKLQkJICogd29yZF9vZmZzZXQ9PVdPUkRfQklUX1NJWkUvMiA/Pz8/PyBpbiB0aGlzIGV4YW1wbGUuCi0JCSAqICg9MjQgYml0cykKLQkJICoKLQkJICogb3VyIGRlc2lyZWQgb3V0cHV0IHdvdWxkIGJlOiA5ODc2IDU0MzIgMTAwMCAwMDAwCi0JCSAqICovCi0KLQkJc2VxX2JpdHNbaV0gPQotCQkJKHNlcV9iaXRzW2kgLSB3b3JkX251bV0gPDwgd29yZF9vZmZzZXQpICsKLQkJCS8qIHRha2UgdGhlIGxvd2VyIHBvcnQgZnJvbSB0aGUgbGVmdCBoYWxmLCBzaGlmdCBpdCBsZWZ0Ci0JCQkgKiB0byBpdHMgZmluYWwgcG9zaXRpb24gKi8KLQkJCShzZXFfYml0c1tpIC0gd29yZF9udW0gLSAxXSA+PgotCQkJIChXT1JEX0JJVF9TSVpFLXdvcmRfb2Zmc2V0KSk7Ci0JCS8qIGFuZCB0aGUgdXBwZXIgcGFydCBvZiB0aGUgcmlnaHQgaGFsZiBhbmQgc2hpZnQgaXQgbGVmdCB0bwotCQkgKiBpdCdzIHBvc2l0aW9uICovCi0JCS8qIGZvciBvdXIgZXhhbXBsZSB0aGF0IHdvdWxkIGJlOiB3b3JkWzBdID0gOTgwMCArIDAwNzYgPQotCQkgKiA5ODc2ICovCi0JfQotCS8qIG5vdyBmb3Igb3VyIGxhc3Qgd29yZCwgaT09d29yZF9udW0sIHdlIG9ubHkgaGF2ZSB0aGUgaXQncyAibGVmdCIKLQkgKiBoYWxmLiB0aGF0J3MgdGhlIDEwMDAgd29yZCBpbiBvdXIgZXhhbXBsZS4qLwotCi0Jc2VxX2JpdHNbaV0gPSAoc2VxX2JpdHNbaSAtIHdvcmRfbnVtXSA8PCB3b3JkX29mZnNldCk7Ci0KLQkvKiBwYWQgdGhlIHJlc3Qgd2l0aCAwLCBpZiB0aGVyZSBpcyBhbnl0aGluZyAqLwotCWktLTsKLQotCWZvciAoOyBpID49IDA7IGktLSkKLQkJc2VxX2JpdHNbaV0gPSAwOwotfQotCi1zdGF0aWMgdm9pZCBiaXRfcmVzZXRfd2luZG93KFRZUEVfT0ZfV09SRCAqc2VxX2JpdHMpCi17Ci0JaW50IGk7Ci0JZm9yIChpID0gMDsgaSA8IE5VTV9XT1JEUzsgaSsrKQotCQlzZXFfYml0c1tpXSA9IDA7Ci19Ci0KLQotLyogcmVjZWl2ZSBhbmQgcHJvY2VzcyBvbmUgcGFja2V0IHdpdGhpbiB0aGUgc2VxdWVuY2UgbnVtYmVyIHdpbmRvdy4KLSAqCi0gKiByZXR1cm5zOgotICogIDEgaWYgdGhlIHdpbmRvdyB3YXMgbW92ZWQgKGVpdGhlciBuZXcgb3IgdmVyeSBvbGQpCi0gKiAgMCBpZiB0aGUgd2luZG93IHdhcyBub3QgbW92ZWQvc2hpZnRlZC4KLSAqLwotY2hhciBiaXRfZ2V0X3BhY2tldCh2b2lkICpwcml2LCBUWVBFX09GX1dPUkQgKnNlcV9iaXRzLAotCQkgICAgaW50MzJfdCBzZXFfbnVtX2RpZmYsIGludDhfdCBzZXRfbWFyaykKLXsKLQlzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2ID0gKHN0cnVjdCBiYXRfcHJpdiAqKXByaXY7Ci0KLQkvKiBzZXF1ZW5jZSBudW1iZXIgaXMgc2xpZ2h0bHkgb2xkZXIuIFdlIGFscmVhZHkgZ290IGEgc2VxdWVuY2UgbnVtYmVyCi0JICogaGlnaGVyIHRoYW4gdGhpcyBvbmUsIHNvIHdlIGp1c3QgbWFyayBpdC4gKi8KLQotCWlmICgoc2VxX251bV9kaWZmIDw9IDApICYmIChzZXFfbnVtX2RpZmYgPiAtVFFfTE9DQUxfV0lORE9XX1NJWkUpKSB7Ci0JCWlmIChzZXRfbWFyaykKLQkJCWJpdF9tYXJrKHNlcV9iaXRzLCAtc2VxX251bV9kaWZmKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JLyogc2VxdWVuY2UgbnVtYmVyIGlzIHNsaWdodGx5IG5ld2VyLCBzbyB3ZSBzaGlmdCB0aGUgd2luZG93IGFuZAotCSAqIHNldCB0aGUgbWFyayBpZiByZXF1aXJlZCAqLwotCi0JaWYgKChzZXFfbnVtX2RpZmYgPiAwKSAmJiAoc2VxX251bV9kaWZmIDwgVFFfTE9DQUxfV0lORE9XX1NJWkUpKSB7Ci0JCWJpdF9zaGlmdChzZXFfYml0cywgc2VxX251bV9kaWZmKTsKLQotCQlpZiAoc2V0X21hcmspCi0JCQliaXRfbWFyayhzZXFfYml0cywgMCk7Ci0JCXJldHVybiAxOwotCX0KLQotCS8qIHNlcXVlbmNlIG51bWJlciBpcyBtdWNoIG5ld2VyLCBwcm9iYWJseSBtaXNzZWQgYSBsb3Qgb2YgcGFja2V0cyAqLwotCi0JaWYgKChzZXFfbnVtX2RpZmYgPj0gVFFfTE9DQUxfV0lORE9XX1NJWkUpCi0JCXx8IChzZXFfbnVtX2RpZmYgPCBFWFBFQ1RFRF9TRVFOT19SQU5HRSkpIHsKLQkJYmF0X2RiZyhEQkdfQkFUTUFOLCBiYXRfcHJpdiwKLQkJCSJXZSBtaXNzZWQgYSBsb3Qgb2YgcGFja2V0cyAoJWkpICFcbiIsCi0JCQlzZXFfbnVtX2RpZmYgLSAxKTsKLQkJYml0X3Jlc2V0X3dpbmRvdyhzZXFfYml0cyk7Ci0JCWlmIChzZXRfbWFyaykKLQkJCWJpdF9tYXJrKHNlcV9iaXRzLCAwKTsKLQkJcmV0dXJuIDE7Ci0JfQotCi0JLyogcmVjZWl2ZWQgYSBtdWNoIG9sZGVyIHBhY2tldC4gVGhlIG90aGVyIGhvc3QgZWl0aGVyIHJlc3RhcnRlZAotCSAqIG9yIHRoZSBvbGQgcGFja2V0IGdvdCBkZWxheWVkIHNvbWV3aGVyZSBpbiB0aGUgbmV0d29yay4gVGhlCi0JICogcGFja2V0IHNob3VsZCBiZSBkcm9wcGVkIHdpdGhvdXQgY2FsbGluZyB0aGlzIGZ1bmN0aW9uIGlmIHRoZQotCSAqIHNlcW5vIHdpbmRvdyBpcyBwcm90ZWN0ZWQuICovCi0KLQlpZiAoKHNlcV9udW1fZGlmZiA8PSAtVFFfTE9DQUxfV0lORE9XX1NJWkUpCi0JCXx8IChzZXFfbnVtX2RpZmYgPj0gRVhQRUNURURfU0VRTk9fUkFOR0UpKSB7Ci0KLQkJYmF0X2RiZyhEQkdfQkFUTUFOLCBiYXRfcHJpdiwKLQkJCSJPdGhlciBob3N0IHByb2JhYmx5IHJlc3RhcnRlZCFcbiIpOwotCi0JCWJpdF9yZXNldF93aW5kb3coc2VxX2JpdHMpOwotCQlpZiAoc2V0X21hcmspCi0JCQliaXRfbWFyayhzZXFfYml0cywgMCk7Ci0KLQkJcmV0dXJuIDE7Ci0JfQotCi0JLyogbmV2ZXIgcmVhY2hlZCAqLwotCXJldHVybiAwOwotfQotCi0vKiBjb3VudCB0aGUgaGFtbWluZyB3ZWlnaHQsIGhvdyBtYW55IGdvb2QgcGFja2V0cyBkaWQgd2UgcmVjZWl2ZT8ganVzdCBjb3VudAotICogdGhlIDEncy4KLSAqLwotaW50IGJpdF9wYWNrZXRfY291bnQoVFlQRV9PRl9XT1JEICpzZXFfYml0cykKLXsKLQlpbnQgaSwgaGFtbWluZyA9IDA7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgTlVNX1dPUkRTOyBpKyspCi0JCWhhbW1pbmcgKz0gaHdlaWdodF9sb25nKHNlcV9iaXRzW2ldKTsKLQotCXJldHVybiBoYW1taW5nOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvYml0YXJyYXkuaCBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L2JpdGFycmF5LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3YjFlNjEuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvYml0YXJyYXkuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDYtMjAxMCBCLkEuVC5NLkEuTi4gY29udHJpYnV0b3JzOgotICoKLSAqIFNpbW9uIFd1bmRlcmxpY2gsIE1hcmVrIExpbmRuZXIKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKLSAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKLSAqIDAyMTEwLTEzMDEsIFVTQQotICoKLSAqLwotCi0jaWZuZGVmIF9ORVRfQkFUTUFOX0FEVl9CSVRBUlJBWV9IXwotI2RlZmluZSBfTkVUX0JBVE1BTl9BRFZfQklUQVJSQVlfSF8KLQotLyogeW91IHNob3VsZCBjaG9vc2Ugc29tZXRoaW5nIGJpZywgaWYgeW91IGRvbid0IHdhbnQgdG8gd2FzdGUgY3B1Ci0gKiBhbmQga2VlcCB0aGUgdHlwZSBpbiBzeW5jIHdpdGggYml0X3BhY2tldF9jb3VudCAqLwotI2RlZmluZSBUWVBFX09GX1dPUkQgdW5zaWduZWQgbG9uZwotI2RlZmluZSBXT1JEX0JJVF9TSVpFIChzaXplb2YoVFlQRV9PRl9XT1JEKSAqIDgpCi0KLS8qIHJldHVybnMgdHJ1ZSBpZiB0aGUgY29ycmVzcG9uZGluZyBiaXQgaW4gdGhlIGdpdmVuIHNlcV9iaXRzIGluZGljYXRlcyB0cnVlCi0gKiBhbmQgY3Vycl9zZXFubyBpcyB3aXRoaW4gcmFuZ2Ugb2YgbGFzdF9zZXFubyAqLwotdWludDhfdCBnZXRfYml0X3N0YXR1cyhUWVBFX09GX1dPUkQgKnNlcV9iaXRzLCB1aW50MzJfdCBsYXN0X3NlcW5vLAotCQkJCQkgICB1aW50MzJfdCBjdXJyX3NlcW5vKTsKLQotLyogdHVybiBjb3JyZXNwb25kaW5nIGJpdCBvbiwgc28gd2UgY2FuIHJlbWVtYmVyIHRoYXQgd2UgZ290IHRoZSBwYWNrZXQgKi8KLXZvaWQgYml0X21hcmsoVFlQRV9PRl9XT1JEICpzZXFfYml0cywgaW50MzJfdCBuKTsKLQotCi0vKiByZWNlaXZlIGFuZCBwcm9jZXNzIG9uZSBwYWNrZXQsIHJldHVybnMgMSBpZiByZWNlaXZlZCBzZXFfbnVtIGlzIGNvbnNpZGVyZWQKLSAqIG5ldywgMCBpZiBvbGQgICovCi1jaGFyIGJpdF9nZXRfcGFja2V0KHZvaWQgKnByaXYsIFRZUEVfT0ZfV09SRCAqc2VxX2JpdHMsCi0JCSAgICBpbnQzMl90IHNlcV9udW1fZGlmZiwgaW50OF90IHNldF9tYXJrKTsKLQotLyogY291bnQgdGhlIGhhbW1pbmcgd2VpZ2h0LCBob3cgbWFueSBnb29kIHBhY2tldHMgZGlkIHdlIHJlY2VpdmU/ICovCi1pbnQgIGJpdF9wYWNrZXRfY291bnQoVFlQRV9PRl9XT1JEICpzZXFfYml0cyk7Ci0KLSNlbmRpZiAvKiBfTkVUX0JBVE1BTl9BRFZfQklUQVJSQVlfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L2hhcmQtaW50ZXJmYWNlLmMgYi9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9oYXJkLWludGVyZmFjZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODVkZTgyLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L2hhcmQtaW50ZXJmYWNlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2NDcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIEIuQS5ULk0uQS5OLiBjb250cmlidXRvcnM6Ci0gKgotICogTWFyZWsgTGluZG5lciwgU2ltb24gV3VuZGVybGljaAotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQotICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQotICogMDIxMTAtMTMwMSwgVVNBCi0gKgotICovCi0KLSNpbmNsdWRlICJtYWluLmgiCi0jaW5jbHVkZSAiaGFyZC1pbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJzb2Z0LWludGVyZmFjZS5oIgotI2luY2x1ZGUgInNlbmQuaCIKLSNpbmNsdWRlICJ0cmFuc2xhdGlvbi10YWJsZS5oIgotI2luY2x1ZGUgInJvdXRpbmcuaCIKLSNpbmNsdWRlICJiYXRfc3lzZnMuaCIKLSNpbmNsdWRlICJvcmlnaW5hdG9yLmgiCi0jaW5jbHVkZSAiaGFzaC5oIgotCi0jaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+Ci0KLSNkZWZpbmUgTUlOKHgsIHkpICgoeCkgPCAoeSkgPyAoeCkgOiAoeSkpCi0KLS8qIHByb3RlY3QgdXBkYXRlIGNyaXRpY2FsIHNpZGUgb2YgaWZfbGlzdCAtIGJ1dCBub3QgdGhlIGNvbnRlbnQgKi8KLXN0YXRpYyBERUZJTkVfU1BJTkxPQ0soaWZfbGlzdF9sb2NrKTsKLQotc3RydWN0IGJhdG1hbl9pZiAqZ2V0X2JhdG1hbl9pZl9ieV9uZXRkZXYoc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYpCi17Ci0Jc3RydWN0IGJhdG1hbl9pZiAqYmF0bWFuX2lmOwotCi0JcmN1X3JlYWRfbG9jaygpOwotCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGJhdG1hbl9pZiwgJmlmX2xpc3QsIGxpc3QpIHsKLQkJaWYgKGJhdG1hbl9pZi0+bmV0X2RldiA9PSBuZXRfZGV2KQotCQkJZ290byBvdXQ7Ci0JfQotCi0JYmF0bWFuX2lmID0gTlVMTDsKLQotb3V0OgotCWlmIChiYXRtYW5faWYpCi0JCWhhcmRpZl9ob2xkKGJhdG1hbl9pZik7Ci0KLQlyY3VfcmVhZF91bmxvY2soKTsKLQlyZXR1cm4gYmF0bWFuX2lmOwotfQotCi1zdGF0aWMgaW50IGlzX3ZhbGlkX2lmYWNlKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2KQotewotCWlmIChuZXRfZGV2LT5mbGFncyAmIElGRl9MT09QQkFDSykKLQkJcmV0dXJuIDA7Ci0KLQlpZiAobmV0X2Rldi0+dHlwZSAhPSBBUlBIUkRfRVRIRVIpCi0JCXJldHVybiAwOwotCi0JaWYgKG5ldF9kZXYtPmFkZHJfbGVuICE9IEVUSF9BTEVOKQotCQlyZXR1cm4gMDsKLQotCS8qIG5vIGJhdG1hbiBvdmVyIGJhdG1hbiAqLwotI2lmZGVmIEhBVkVfTkVUX0RFVklDRV9PUFMKLQlpZiAobmV0X2Rldi0+bmV0ZGV2X29wcy0+bmRvX3N0YXJ0X3htaXQgPT0gaW50ZXJmYWNlX3R4KQotCQlyZXR1cm4gMDsKLSNlbHNlCi0JaWYgKG5ldF9kZXYtPmhhcmRfc3RhcnRfeG1pdCA9PSBpbnRlcmZhY2VfdHgpCi0JCXJldHVybiAwOwotI2VuZGlmCi0KLQkvKiBEZXZpY2UgaXMgYmVpbmcgYnJpZGdlZCAqLwotCS8qIGlmIChuZXRfZGV2LT5wcml2X2ZsYWdzICYgSUZGX0JSSURHRV9QT1JUKQotCQlyZXR1cm4gMDsgKi8KLQotCXJldHVybiAxOwotfQotCi1zdGF0aWMgc3RydWN0IGJhdG1hbl9pZiAqZ2V0X2FjdGl2ZV9iYXRtYW5faWYoc3RydWN0IG5ldF9kZXZpY2UgKnNvZnRfaWZhY2UpCi17Ci0Jc3RydWN0IGJhdG1hbl9pZiAqYmF0bWFuX2lmOwotCi0JcmN1X3JlYWRfbG9jaygpOwotCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGJhdG1hbl9pZiwgJmlmX2xpc3QsIGxpc3QpIHsKLQkJaWYgKGJhdG1hbl9pZi0+c29mdF9pZmFjZSAhPSBzb2Z0X2lmYWNlKQotCQkJY29udGludWU7Ci0KLQkJaWYgKGJhdG1hbl9pZi0+aWZfc3RhdHVzID09IElGX0FDVElWRSkKLQkJCWdvdG8gb3V0OwotCX0KLQotCWJhdG1hbl9pZiA9IE5VTEw7Ci0KLW91dDoKLQlpZiAoYmF0bWFuX2lmKQotCQloYXJkaWZfaG9sZChiYXRtYW5faWYpOwotCi0JcmN1X3JlYWRfdW5sb2NrKCk7Ci0JcmV0dXJuIGJhdG1hbl9pZjsKLX0KLQotc3RhdGljIHZvaWQgdXBkYXRlX3ByaW1hcnlfYWRkcihzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2KQotewotCXN0cnVjdCB2aXNfcGFja2V0ICp2aXNfcGFja2V0OwotCi0JdmlzX3BhY2tldCA9IChzdHJ1Y3QgdmlzX3BhY2tldCAqKQotCQkJCWJhdF9wcml2LT5teV92aXNfaW5mby0+c2tiX3BhY2tldC0+ZGF0YTsKLQltZW1jcHkodmlzX3BhY2tldC0+dmlzX29yaWcsCi0JICAgICAgIGJhdF9wcml2LT5wcmltYXJ5X2lmLT5uZXRfZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pOwotCW1lbWNweSh2aXNfcGFja2V0LT5zZW5kZXJfb3JpZywKLQkgICAgICAgYmF0X3ByaXYtPnByaW1hcnlfaWYtPm5ldF9kZXYtPmRldl9hZGRyLCBFVEhfQUxFTik7Ci19Ci0KLXN0YXRpYyB2b2lkIHNldF9wcmltYXJ5X2lmKHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYsCi0JCQkgICBzdHJ1Y3QgYmF0bWFuX2lmICpiYXRtYW5faWYpCi17Ci0Jc3RydWN0IGJhdG1hbl9wYWNrZXQgKmJhdG1hbl9wYWNrZXQ7Ci0Jc3RydWN0IGJhdG1hbl9pZiAqb2xkX2lmOwotCi0JaWYgKGJhdG1hbl9pZikKLQkJaGFyZGlmX2hvbGQoYmF0bWFuX2lmKTsKLQotCW9sZF9pZiA9IGJhdF9wcml2LT5wcmltYXJ5X2lmOwotCWJhdF9wcml2LT5wcmltYXJ5X2lmID0gYmF0bWFuX2lmOwotCi0JaWYgKG9sZF9pZikKLQkJaGFyZGlmX3B1dChvbGRfaWYpOwotCi0JaWYgKCFiYXRfcHJpdi0+cHJpbWFyeV9pZikKLQkJcmV0dXJuOwotCi0JYmF0bWFuX3BhY2tldCA9IChzdHJ1Y3QgYmF0bWFuX3BhY2tldCAqKShiYXRtYW5faWYtPnBhY2tldF9idWZmKTsKLQliYXRtYW5fcGFja2V0LT5mbGFncyA9IFBSSU1BUklFU19GSVJTVF9IT1A7Ci0JYmF0bWFuX3BhY2tldC0+dHRsID0gVFRMOwotCi0JdXBkYXRlX3ByaW1hcnlfYWRkcihiYXRfcHJpdik7Ci0KLQkvKioqCi0JICogaGFja3kgdHJpY2sgdG8gbWFrZSBzdXJlIHRoYXQgd2Ugc2VuZCB0aGUgSE5BIGluZm9ybWF0aW9uIHZpYQotCSAqIG91ciBuZXcgcHJpbWFyeSBpbnRlcmZhY2UKLQkgKi8KLQlhdG9taWNfc2V0KCZiYXRfcHJpdi0+aG5hX2xvY2FsX2NoYW5nZWQsIDEpOwotfQotCi1zdGF0aWMgYm9vbCBoYXJkaWZfaXNfaWZhY2VfdXAoc3RydWN0IGJhdG1hbl9pZiAqYmF0bWFuX2lmKQotewotCWlmIChiYXRtYW5faWYtPm5ldF9kZXYtPmZsYWdzICYgSUZGX1VQKQotCQlyZXR1cm4gdHJ1ZTsKLQotCXJldHVybiBmYWxzZTsKLX0KLQotc3RhdGljIHZvaWQgdXBkYXRlX21hY19hZGRyZXNzZXMoc3RydWN0IGJhdG1hbl9pZiAqYmF0bWFuX2lmKQotewotCW1lbWNweSgoKHN0cnVjdCBiYXRtYW5fcGFja2V0ICopKGJhdG1hbl9pZi0+cGFja2V0X2J1ZmYpKS0+b3JpZywKLQkgICAgICAgYmF0bWFuX2lmLT5uZXRfZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pOwotCW1lbWNweSgoKHN0cnVjdCBiYXRtYW5fcGFja2V0ICopKGJhdG1hbl9pZi0+cGFja2V0X2J1ZmYpKS0+cHJldl9zZW5kZXIsCi0JICAgICAgIGJhdG1hbl9pZi0+bmV0X2Rldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKTsKLX0KLQotc3RhdGljIHZvaWQgY2hlY2tfa25vd25fbWFjX2FkZHIoc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYpCi17Ci0Jc3RydWN0IGJhdG1hbl9pZiAqYmF0bWFuX2lmOwotCi0JcmN1X3JlYWRfbG9jaygpOwotCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGJhdG1hbl9pZiwgJmlmX2xpc3QsIGxpc3QpIHsKLQkJaWYgKChiYXRtYW5faWYtPmlmX3N0YXR1cyAhPSBJRl9BQ1RJVkUpICYmCi0JCSAgICAoYmF0bWFuX2lmLT5pZl9zdGF0dXMgIT0gSUZfVE9fQkVfQUNUSVZBVEVEKSkKLQkJCWNvbnRpbnVlOwotCi0JCWlmIChiYXRtYW5faWYtPm5ldF9kZXYgPT0gbmV0X2RldikKLQkJCWNvbnRpbnVlOwotCi0JCWlmICghY29tcGFyZV9vcmlnKGJhdG1hbl9pZi0+bmV0X2Rldi0+ZGV2X2FkZHIsCi0JCQkJICBuZXRfZGV2LT5kZXZfYWRkcikpCi0JCQljb250aW51ZTsKLQotCQlwcl93YXJuaW5nKCJUaGUgbmV3bHkgYWRkZWQgbWFjIGFkZHJlc3MgKCVwTSkgYWxyZWFkeSBleGlzdHMgIgotCQkJICAgIm9uOiAlc1xuIiwgbmV0X2Rldi0+ZGV2X2FkZHIsCi0JCQkgICBiYXRtYW5faWYtPm5ldF9kZXYtPm5hbWUpOwotCQlwcl93YXJuaW5nKCJJdCBpcyBzdHJvbmdseSByZWNvbW1lbmRlZCB0byBrZWVwIG1hYyBhZGRyZXNzZXMgIgotCQkJICAgInVuaXF1ZSB0byBhdm9pZCBwcm9ibGVtcyFcbiIpOwotCX0KLQlyY3VfcmVhZF91bmxvY2soKTsKLX0KLQotaW50IGhhcmRpZl9taW5fbXR1KHN0cnVjdCBuZXRfZGV2aWNlICpzb2Z0X2lmYWNlKQotewotCXN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYgPSBuZXRkZXZfcHJpdihzb2Z0X2lmYWNlKTsKLQlzdHJ1Y3QgYmF0bWFuX2lmICpiYXRtYW5faWY7Ci0JLyogYWxsb3cgYmlnIGZyYW1lcyBpZiBhbGwgZGV2aWNlcyBhcmUgY2FwYWJsZSB0byBkbyBzbwotCSAqIChoYXZlIE1UVSA+IDE1MDAgKyBCQVRfSEVBREVSX0xFTikgKi8KLQlpbnQgbWluX210dSA9IEVUSF9EQVRBX0xFTjsKLQotCWlmIChhdG9taWNfcmVhZCgmYmF0X3ByaXYtPmZyYWdfZW5hYmxlZCkpCi0JCWdvdG8gb3V0OwotCi0JcmN1X3JlYWRfbG9jaygpOwotCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGJhdG1hbl9pZiwgJmlmX2xpc3QsIGxpc3QpIHsKLQkJaWYgKChiYXRtYW5faWYtPmlmX3N0YXR1cyAhPSBJRl9BQ1RJVkUpICYmCi0JCSAgICAoYmF0bWFuX2lmLT5pZl9zdGF0dXMgIT0gSUZfVE9fQkVfQUNUSVZBVEVEKSkKLQkJCWNvbnRpbnVlOwotCi0JCWlmIChiYXRtYW5faWYtPnNvZnRfaWZhY2UgIT0gc29mdF9pZmFjZSkKLQkJCWNvbnRpbnVlOwotCi0JCW1pbl9tdHUgPSBNSU4oYmF0bWFuX2lmLT5uZXRfZGV2LT5tdHUgLSBCQVRfSEVBREVSX0xFTiwKLQkJCSAgICAgIG1pbl9tdHUpOwotCX0KLQlyY3VfcmVhZF91bmxvY2soKTsKLW91dDoKLQlyZXR1cm4gbWluX210dTsKLX0KLQotLyogYWRqdXN0cyB0aGUgTVRVIGlmIGEgbmV3IGludGVyZmFjZSB3aXRoIGEgc21hbGxlciBNVFUgYXBwZWFyZWQuICovCi12b2lkIHVwZGF0ZV9taW5fbXR1KHN0cnVjdCBuZXRfZGV2aWNlICpzb2Z0X2lmYWNlKQotewotCWludCBtaW5fbXR1OwotCi0JbWluX210dSA9IGhhcmRpZl9taW5fbXR1KHNvZnRfaWZhY2UpOwotCWlmIChzb2Z0X2lmYWNlLT5tdHUgIT0gbWluX210dSkKLQkJc29mdF9pZmFjZS0+bXR1ID0gbWluX210dTsKLX0KLQotc3RhdGljIHZvaWQgaGFyZGlmX2FjdGl2YXRlX2ludGVyZmFjZShzdHJ1Y3QgYmF0bWFuX2lmICpiYXRtYW5faWYpCi17Ci0Jc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdjsKLQotCWlmIChiYXRtYW5faWYtPmlmX3N0YXR1cyAhPSBJRl9JTkFDVElWRSkKLQkJcmV0dXJuOwotCi0JYmF0X3ByaXYgPSBuZXRkZXZfcHJpdihiYXRtYW5faWYtPnNvZnRfaWZhY2UpOwotCi0JdXBkYXRlX21hY19hZGRyZXNzZXMoYmF0bWFuX2lmKTsKLQliYXRtYW5faWYtPmlmX3N0YXR1cyA9IElGX1RPX0JFX0FDVElWQVRFRDsKLQotCS8qKgotCSAqIHRoZSBmaXJzdCBhY3RpdmUgaW50ZXJmYWNlIGJlY29tZXMgb3VyIHByaW1hcnkgaW50ZXJmYWNlIG9yCi0JICogdGhlIG5leHQgYWN0aXZlIGludGVyZmFjZSBhZnRlciB0aGUgb2xkIHByaW1heSBpbnRlcmZhY2Ugd2FzIHJlbW92ZWQKLQkgKi8KLQlpZiAoIWJhdF9wcml2LT5wcmltYXJ5X2lmKQotCQlzZXRfcHJpbWFyeV9pZihiYXRfcHJpdiwgYmF0bWFuX2lmKTsKLQotCWJhdF9pbmZvKGJhdG1hbl9pZi0+c29mdF9pZmFjZSwgIkludGVyZmFjZSBhY3RpdmF0ZWQ6ICVzXG4iLAotCQkgYmF0bWFuX2lmLT5uZXRfZGV2LT5uYW1lKTsKLQotCXVwZGF0ZV9taW5fbXR1KGJhdG1hbl9pZi0+c29mdF9pZmFjZSk7Ci0JcmV0dXJuOwotfQotCi1zdGF0aWMgdm9pZCBoYXJkaWZfZGVhY3RpdmF0ZV9pbnRlcmZhY2Uoc3RydWN0IGJhdG1hbl9pZiAqYmF0bWFuX2lmKQotewotCWlmICgoYmF0bWFuX2lmLT5pZl9zdGF0dXMgIT0gSUZfQUNUSVZFKSAmJgotCSAgIChiYXRtYW5faWYtPmlmX3N0YXR1cyAhPSBJRl9UT19CRV9BQ1RJVkFURUQpKQotCQlyZXR1cm47Ci0KLQliYXRtYW5faWYtPmlmX3N0YXR1cyA9IElGX0lOQUNUSVZFOwotCi0JYmF0X2luZm8oYmF0bWFuX2lmLT5zb2Z0X2lmYWNlLCAiSW50ZXJmYWNlIGRlYWN0aXZhdGVkOiAlc1xuIiwKLQkJIGJhdG1hbl9pZi0+bmV0X2Rldi0+bmFtZSk7Ci0KLQl1cGRhdGVfbWluX210dShiYXRtYW5faWYtPnNvZnRfaWZhY2UpOwotfQotCi1pbnQgaGFyZGlmX2VuYWJsZV9pbnRlcmZhY2Uoc3RydWN0IGJhdG1hbl9pZiAqYmF0bWFuX2lmLCBjaGFyICppZmFjZV9uYW1lKQotewotCXN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXY7Ci0Jc3RydWN0IGJhdG1hbl9wYWNrZXQgKmJhdG1hbl9wYWNrZXQ7Ci0KLQlpZiAoYmF0bWFuX2lmLT5pZl9zdGF0dXMgIT0gSUZfTk9UX0lOX1VTRSkKLQkJZ290byBvdXQ7Ci0KLQliYXRtYW5faWYtPnNvZnRfaWZhY2UgPSBkZXZfZ2V0X2J5X25hbWUoJmluaXRfbmV0LCBpZmFjZV9uYW1lKTsKLQotCWlmICghYmF0bWFuX2lmLT5zb2Z0X2lmYWNlKSB7Ci0JCWJhdG1hbl9pZi0+c29mdF9pZmFjZSA9IHNvZnRpZl9jcmVhdGUoaWZhY2VfbmFtZSk7Ci0KLQkJaWYgKCFiYXRtYW5faWYtPnNvZnRfaWZhY2UpCi0JCQlnb3RvIGVycjsKLQotCQkvKiBkZXZfZ2V0X2J5X25hbWUoKSBpbmNyZWFzZXMgdGhlIHJlZmVyZW5jZSBjb3VudGVyIGZvciB1cyAqLwotCQlkZXZfaG9sZChiYXRtYW5faWYtPnNvZnRfaWZhY2UpOwotCX0KLQotCWJhdF9wcml2ID0gbmV0ZGV2X3ByaXYoYmF0bWFuX2lmLT5zb2Z0X2lmYWNlKTsKLQliYXRtYW5faWYtPnBhY2tldF9sZW4gPSBCQVRfUEFDS0VUX0xFTjsKLQliYXRtYW5faWYtPnBhY2tldF9idWZmID0ga21hbGxvYyhiYXRtYW5faWYtPnBhY2tldF9sZW4sIEdGUF9BVE9NSUMpOwotCi0JaWYgKCFiYXRtYW5faWYtPnBhY2tldF9idWZmKSB7Ci0JCWJhdF9lcnIoYmF0bWFuX2lmLT5zb2Z0X2lmYWNlLCAiQ2FuJ3QgYWRkIGludGVyZmFjZSBwYWNrZXQgIgotCQkJIiglcyk6IG91dCBvZiBtZW1vcnlcbiIsIGJhdG1hbl9pZi0+bmV0X2Rldi0+bmFtZSk7Ci0JCWdvdG8gZXJyOwotCX0KLQotCWJhdG1hbl9wYWNrZXQgPSAoc3RydWN0IGJhdG1hbl9wYWNrZXQgKikoYmF0bWFuX2lmLT5wYWNrZXRfYnVmZik7Ci0JYmF0bWFuX3BhY2tldC0+cGFja2V0X3R5cGUgPSBCQVRfUEFDS0VUOwotCWJhdG1hbl9wYWNrZXQtPnZlcnNpb24gPSBDT01QQVRfVkVSU0lPTjsKLQliYXRtYW5fcGFja2V0LT5mbGFncyA9IDA7Ci0JYmF0bWFuX3BhY2tldC0+dHRsID0gMjsKLQliYXRtYW5fcGFja2V0LT50cSA9IFRRX01BWF9WQUxVRTsKLQliYXRtYW5fcGFja2V0LT5udW1faG5hID0gMDsKLQotCWJhdG1hbl9pZi0+aWZfbnVtID0gYmF0X3ByaXYtPm51bV9pZmFjZXM7Ci0JYmF0X3ByaXYtPm51bV9pZmFjZXMrKzsKLQliYXRtYW5faWYtPmlmX3N0YXR1cyA9IElGX0lOQUNUSVZFOwotCW9yaWdfaGFzaF9hZGRfaWYoYmF0bWFuX2lmLCBiYXRfcHJpdi0+bnVtX2lmYWNlcyk7Ci0KLQliYXRtYW5faWYtPmJhdG1hbl9hZHZfcHR5cGUudHlwZSA9IF9fY29uc3RhbnRfaHRvbnMoRVRIX1BfQkFUTUFOKTsKLQliYXRtYW5faWYtPmJhdG1hbl9hZHZfcHR5cGUuZnVuYyA9IGJhdG1hbl9za2JfcmVjdjsKLQliYXRtYW5faWYtPmJhdG1hbl9hZHZfcHR5cGUuZGV2ID0gYmF0bWFuX2lmLT5uZXRfZGV2OwotCWhhcmRpZl9ob2xkKGJhdG1hbl9pZik7Ci0JZGV2X2FkZF9wYWNrKCZiYXRtYW5faWYtPmJhdG1hbl9hZHZfcHR5cGUpOwotCi0JYXRvbWljX3NldCgmYmF0bWFuX2lmLT5zZXFubywgMSk7Ci0JYXRvbWljX3NldCgmYmF0bWFuX2lmLT5mcmFnX3NlcW5vLCAxKTsKLQliYXRfaW5mbyhiYXRtYW5faWYtPnNvZnRfaWZhY2UsICJBZGRpbmcgaW50ZXJmYWNlOiAlc1xuIiwKLQkJIGJhdG1hbl9pZi0+bmV0X2Rldi0+bmFtZSk7Ci0KLQlpZiAoYXRvbWljX3JlYWQoJmJhdF9wcml2LT5mcmFnX2VuYWJsZWQpICYmIGJhdG1hbl9pZi0+bmV0X2Rldi0+bXR1IDwKLQkJRVRIX0RBVEFfTEVOICsgQkFUX0hFQURFUl9MRU4pCi0JCWJhdF9pbmZvKGJhdG1hbl9pZi0+c29mdF9pZmFjZSwKLQkJCSJUaGUgTVRVIG9mIGludGVyZmFjZSAlcyBpcyB0b28gc21hbGwgKCVpKSB0byBoYW5kbGUgIgotCQkJInRoZSB0cmFuc3BvcnQgb2YgYmF0bWFuLWFkdiBwYWNrZXRzLiBQYWNrZXRzIGdvaW5nICIKLQkJCSJvdmVyIHRoaXMgaW50ZXJmYWNlIHdpbGwgYmUgZnJhZ21lbnRlZCBvbiBsYXllcjIgIgotCQkJIndoaWNoIGNvdWxkIGltcGFjdCB0aGUgcGVyZm9ybWFuY2UuIFNldHRpbmcgdGhlIE1UVSAiCi0JCQkidG8gJXppIHdvdWxkIHNvbHZlIHRoZSBwcm9ibGVtLlxuIiwKLQkJCWJhdG1hbl9pZi0+bmV0X2Rldi0+bmFtZSwgYmF0bWFuX2lmLT5uZXRfZGV2LT5tdHUsCi0JCQlFVEhfREFUQV9MRU4gKyBCQVRfSEVBREVSX0xFTik7Ci0KLQlpZiAoIWF0b21pY19yZWFkKCZiYXRfcHJpdi0+ZnJhZ19lbmFibGVkKSAmJiBiYXRtYW5faWYtPm5ldF9kZXYtPm10dSA8Ci0JCUVUSF9EQVRBX0xFTiArIEJBVF9IRUFERVJfTEVOKQotCQliYXRfaW5mbyhiYXRtYW5faWYtPnNvZnRfaWZhY2UsCi0JCQkiVGhlIE1UVSBvZiBpbnRlcmZhY2UgJXMgaXMgdG9vIHNtYWxsICglaSkgdG8gaGFuZGxlICIKLQkJCSJ0aGUgdHJhbnNwb3J0IG9mIGJhdG1hbi1hZHYgcGFja2V0cy4gSWYgeW91IGV4cGVyaWVuY2UiCi0JCQkiIHByb2JsZW1zIGdldHRpbmcgdHJhZmZpYyB0aHJvdWdoIHRyeSBpbmNyZWFzaW5nIHRoZSAiCi0JCQkiTVRVIHRvICV6aS5cbiIsCi0JCQliYXRtYW5faWYtPm5ldF9kZXYtPm5hbWUsIGJhdG1hbl9pZi0+bmV0X2Rldi0+bXR1LAotCQkJRVRIX0RBVEFfTEVOICsgQkFUX0hFQURFUl9MRU4pOwotCi0JaWYgKGhhcmRpZl9pc19pZmFjZV91cChiYXRtYW5faWYpKQotCQloYXJkaWZfYWN0aXZhdGVfaW50ZXJmYWNlKGJhdG1hbl9pZik7Ci0JZWxzZQotCQliYXRfZXJyKGJhdG1hbl9pZi0+c29mdF9pZmFjZSwgIk5vdCB1c2luZyBpbnRlcmZhY2UgJXMgIgotCQkJIihyZXRyeWluZyBsYXRlcik6IGludGVyZmFjZSBub3QgYWN0aXZlXG4iLAotCQkJYmF0bWFuX2lmLT5uZXRfZGV2LT5uYW1lKTsKLQotCS8qIGJlZ2luIHNjaGVkdWxpbmcgb3JpZ2luYXRvciBtZXNzYWdlcyBvbiB0aGF0IGludGVyZmFjZSAqLwotCXNjaGVkdWxlX293bl9wYWNrZXQoYmF0bWFuX2lmKTsKLQotb3V0OgotCXJldHVybiAwOwotCi1lcnI6Ci0JcmV0dXJuIC1FTk9NRU07Ci19Ci0KLXZvaWQgaGFyZGlmX2Rpc2FibGVfaW50ZXJmYWNlKHN0cnVjdCBiYXRtYW5faWYgKmJhdG1hbl9pZikKLXsKLQlzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2ID0gbmV0ZGV2X3ByaXYoYmF0bWFuX2lmLT5zb2Z0X2lmYWNlKTsKLQotCWlmIChiYXRtYW5faWYtPmlmX3N0YXR1cyA9PSBJRl9BQ1RJVkUpCi0JCWhhcmRpZl9kZWFjdGl2YXRlX2ludGVyZmFjZShiYXRtYW5faWYpOwotCi0JaWYgKGJhdG1hbl9pZi0+aWZfc3RhdHVzICE9IElGX0lOQUNUSVZFKQotCQlyZXR1cm47Ci0KLQliYXRfaW5mbyhiYXRtYW5faWYtPnNvZnRfaWZhY2UsICJSZW1vdmluZyBpbnRlcmZhY2U6ICVzXG4iLAotCQkgYmF0bWFuX2lmLT5uZXRfZGV2LT5uYW1lKTsKLQlkZXZfcmVtb3ZlX3BhY2soJmJhdG1hbl9pZi0+YmF0bWFuX2Fkdl9wdHlwZSk7Ci0JaGFyZGlmX3B1dChiYXRtYW5faWYpOwotCi0JYmF0X3ByaXYtPm51bV9pZmFjZXMtLTsKLQlvcmlnX2hhc2hfZGVsX2lmKGJhdG1hbl9pZiwgYmF0X3ByaXYtPm51bV9pZmFjZXMpOwotCi0JaWYgKGJhdG1hbl9pZiA9PSBiYXRfcHJpdi0+cHJpbWFyeV9pZikgewotCQlzdHJ1Y3QgYmF0bWFuX2lmICpuZXdfaWY7Ci0KLQkJbmV3X2lmID0gZ2V0X2FjdGl2ZV9iYXRtYW5faWYoYmF0bWFuX2lmLT5zb2Z0X2lmYWNlKTsKLQkJc2V0X3ByaW1hcnlfaWYoYmF0X3ByaXYsIG5ld19pZik7Ci0KLQkJaWYgKG5ld19pZikKLQkJCWhhcmRpZl9wdXQobmV3X2lmKTsKLQl9Ci0KLQlrZnJlZShiYXRtYW5faWYtPnBhY2tldF9idWZmKTsKLQliYXRtYW5faWYtPnBhY2tldF9idWZmID0gTlVMTDsKLQliYXRtYW5faWYtPmlmX3N0YXR1cyA9IElGX05PVF9JTl9VU0U7Ci0KLQkvKiBkZWxldGUgYWxsIHJlZmVyZW5jZXMgdG8gdGhpcyBiYXRtYW5faWYgKi8KLQlwdXJnZV9vcmlnX3JlZihiYXRfcHJpdik7Ci0JcHVyZ2Vfb3V0c3RhbmRpbmdfcGFja2V0cyhiYXRfcHJpdiwgYmF0bWFuX2lmKTsKLQlkZXZfcHV0KGJhdG1hbl9pZi0+c29mdF9pZmFjZSk7Ci0KLQkvKiBub2JvZHkgdXNlcyB0aGlzIGludGVyZmFjZSBhbnltb3JlICovCi0JaWYgKCFiYXRfcHJpdi0+bnVtX2lmYWNlcykKLQkJc29mdGlmX2Rlc3Ryb3koYmF0bWFuX2lmLT5zb2Z0X2lmYWNlKTsKLQotCWJhdG1hbl9pZi0+c29mdF9pZmFjZSA9IE5VTEw7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgYmF0bWFuX2lmICpoYXJkaWZfYWRkX2ludGVyZmFjZShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldikKLXsKLQlzdHJ1Y3QgYmF0bWFuX2lmICpiYXRtYW5faWY7Ci0JaW50IHJldDsKLQotCXJldCA9IGlzX3ZhbGlkX2lmYWNlKG5ldF9kZXYpOwotCWlmIChyZXQgIT0gMSkKLQkJZ290byBvdXQ7Ci0KLQlkZXZfaG9sZChuZXRfZGV2KTsKLQotCWJhdG1hbl9pZiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBiYXRtYW5faWYpLCBHRlBfQVRPTUlDKTsKLQlpZiAoIWJhdG1hbl9pZikgewotCQlwcl9lcnIoIkNhbid0IGFkZCBpbnRlcmZhY2UgKCVzKTogb3V0IG9mIG1lbW9yeVxuIiwKLQkJICAgICAgIG5ldF9kZXYtPm5hbWUpOwotCQlnb3RvIHJlbGVhc2VfZGV2OwotCX0KLQotCXJldCA9IHN5c2ZzX2FkZF9oYXJkaWYoJmJhdG1hbl9pZi0+aGFyZGlmX29iaiwgbmV0X2Rldik7Ci0JaWYgKHJldCkKLQkJZ290byBmcmVlX2lmOwotCi0JYmF0bWFuX2lmLT5pZl9udW0gPSAtMTsKLQliYXRtYW5faWYtPm5ldF9kZXYgPSBuZXRfZGV2OwotCWJhdG1hbl9pZi0+c29mdF9pZmFjZSA9IE5VTEw7Ci0JYmF0bWFuX2lmLT5pZl9zdGF0dXMgPSBJRl9OT1RfSU5fVVNFOwotCUlOSVRfTElTVF9IRUFEKCZiYXRtYW5faWYtPmxpc3QpOwotCWF0b21pY19zZXQoJmJhdG1hbl9pZi0+cmVmY250LCAwKTsKLQloYXJkaWZfaG9sZChiYXRtYW5faWYpOwotCi0JY2hlY2tfa25vd25fbWFjX2FkZHIoYmF0bWFuX2lmLT5uZXRfZGV2KTsKLQotCXNwaW5fbG9jaygmaWZfbGlzdF9sb2NrKTsKLQlsaXN0X2FkZF90YWlsX3JjdSgmYmF0bWFuX2lmLT5saXN0LCAmaWZfbGlzdCk7Ci0Jc3Bpbl91bmxvY2soJmlmX2xpc3RfbG9jayk7Ci0KLQkvKiBleHRyYSByZWZlcmVuY2UgZm9yIHJldHVybiAqLwotCWhhcmRpZl9ob2xkKGJhdG1hbl9pZik7Ci0JcmV0dXJuIGJhdG1hbl9pZjsKLQotZnJlZV9pZjoKLQlrZnJlZShiYXRtYW5faWYpOwotcmVsZWFzZV9kZXY6Ci0JZGV2X3B1dChuZXRfZGV2KTsKLW91dDoKLQlyZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIHZvaWQgaGFyZGlmX3JlbW92ZV9pbnRlcmZhY2Uoc3RydWN0IGJhdG1hbl9pZiAqYmF0bWFuX2lmKQotewotCS8qIGZpcnN0IGRlYWN0aXZhdGUgaW50ZXJmYWNlICovCi0JaWYgKGJhdG1hbl9pZi0+aWZfc3RhdHVzICE9IElGX05PVF9JTl9VU0UpCi0JCWhhcmRpZl9kaXNhYmxlX2ludGVyZmFjZShiYXRtYW5faWYpOwotCi0JaWYgKGJhdG1hbl9pZi0+aWZfc3RhdHVzICE9IElGX05PVF9JTl9VU0UpCi0JCXJldHVybjsKLQotCWJhdG1hbl9pZi0+aWZfc3RhdHVzID0gSUZfVE9fQkVfUkVNT1ZFRDsKLQlzeW5jaHJvbml6ZV9yY3UoKTsKLQlzeXNmc19kZWxfaGFyZGlmKCZiYXRtYW5faWYtPmhhcmRpZl9vYmopOwotCWhhcmRpZl9wdXQoYmF0bWFuX2lmKTsKLX0KLQotdm9pZCBoYXJkaWZfcmVtb3ZlX2ludGVyZmFjZXModm9pZCkKLXsKLQlzdHJ1Y3QgYmF0bWFuX2lmICpiYXRtYW5faWYsICpiYXRtYW5faWZfdG1wOwotCXN0cnVjdCBsaXN0X2hlYWQgaWZfcXVldWU7Ci0KLQlJTklUX0xJU1RfSEVBRCgmaWZfcXVldWUpOwotCi0Jc3Bpbl9sb2NrKCZpZl9saXN0X2xvY2spOwotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShiYXRtYW5faWYsIGJhdG1hbl9pZl90bXAsICZpZl9saXN0LCBsaXN0KSB7Ci0JCWxpc3RfZGVsX3JjdSgmYmF0bWFuX2lmLT5saXN0KTsKLQkJbGlzdF9hZGRfdGFpbCgmYmF0bWFuX2lmLT5saXN0LCAmaWZfcXVldWUpOwotCX0KLQlzcGluX3VubG9jaygmaWZfbGlzdF9sb2NrKTsKLQotCXJ0bmxfbG9jaygpOwotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShiYXRtYW5faWYsIGJhdG1hbl9pZl90bXAsICZpZl9xdWV1ZSwgbGlzdCkgewotCQloYXJkaWZfcmVtb3ZlX2ludGVyZmFjZShiYXRtYW5faWYpOwotCX0KLQlydG5sX3VubG9jaygpOwotfQotCi1zdGF0aWMgaW50IGhhcmRfaWZfZXZlbnQoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICp0aGlzLAotCQkJIHVuc2lnbmVkIGxvbmcgZXZlbnQsIHZvaWQgKnB0cikKLXsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKXB0cjsKLQlzdHJ1Y3QgYmF0bWFuX2lmICpiYXRtYW5faWYgPSBnZXRfYmF0bWFuX2lmX2J5X25ldGRldihuZXRfZGV2KTsKLQlzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2OwotCi0JaWYgKCFiYXRtYW5faWYgJiYgZXZlbnQgPT0gTkVUREVWX1JFR0lTVEVSKQotCQliYXRtYW5faWYgPSBoYXJkaWZfYWRkX2ludGVyZmFjZShuZXRfZGV2KTsKLQotCWlmICghYmF0bWFuX2lmKQotCQlnb3RvIG91dDsKLQotCXN3aXRjaCAoZXZlbnQpIHsKLQljYXNlIE5FVERFVl9VUDoKLQkJaGFyZGlmX2FjdGl2YXRlX2ludGVyZmFjZShiYXRtYW5faWYpOwotCQlicmVhazsKLQljYXNlIE5FVERFVl9HT0lOR19ET1dOOgotCWNhc2UgTkVUREVWX0RPV046Ci0JCWhhcmRpZl9kZWFjdGl2YXRlX2ludGVyZmFjZShiYXRtYW5faWYpOwotCQlicmVhazsKLQljYXNlIE5FVERFVl9VTlJFR0lTVEVSOgotCQlzcGluX2xvY2soJmlmX2xpc3RfbG9jayk7Ci0JCWxpc3RfZGVsX3JjdSgmYmF0bWFuX2lmLT5saXN0KTsKLQkJc3Bpbl91bmxvY2soJmlmX2xpc3RfbG9jayk7Ci0KLQkJaGFyZGlmX3JlbW92ZV9pbnRlcmZhY2UoYmF0bWFuX2lmKTsKLQkJYnJlYWs7Ci0JY2FzZSBORVRERVZfQ0hBTkdFTVRVOgotCQlpZiAoYmF0bWFuX2lmLT5zb2Z0X2lmYWNlKQotCQkJdXBkYXRlX21pbl9tdHUoYmF0bWFuX2lmLT5zb2Z0X2lmYWNlKTsKLQkJYnJlYWs7Ci0JY2FzZSBORVRERVZfQ0hBTkdFQUREUjoKLQkJaWYgKGJhdG1hbl9pZi0+aWZfc3RhdHVzID09IElGX05PVF9JTl9VU0UpIHsKLQkJCWhhcmRpZl9wdXQoYmF0bWFuX2lmKTsKLQkJCWdvdG8gb3V0OwotCQl9Ci0KLQkJY2hlY2tfa25vd25fbWFjX2FkZHIoYmF0bWFuX2lmLT5uZXRfZGV2KTsKLQkJdXBkYXRlX21hY19hZGRyZXNzZXMoYmF0bWFuX2lmKTsKLQotCQliYXRfcHJpdiA9IG5ldGRldl9wcml2KGJhdG1hbl9pZi0+c29mdF9pZmFjZSk7Ci0JCWlmIChiYXRtYW5faWYgPT0gYmF0X3ByaXYtPnByaW1hcnlfaWYpCi0JCQl1cGRhdGVfcHJpbWFyeV9hZGRyKGJhdF9wcml2KTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfTsKLQloYXJkaWZfcHV0KGJhdG1hbl9pZik7Ci0KLW91dDoKLQlyZXR1cm4gTk9USUZZX0RPTkU7Ci19Ci0KLS8qIHJlY2VpdmUgYSBwYWNrZXQgd2l0aCB0aGUgYmF0bWFuIGV0aGVydHlwZSBjb21pbmcgb24gYSBoYXJkCi0gKiBpbnRlcmZhY2UgKi8KLWludCBiYXRtYW5fc2tiX3JlY3Yoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQlzdHJ1Y3QgcGFja2V0X3R5cGUgKnB0eXBlLCBzdHJ1Y3QgbmV0X2RldmljZSAqb3JpZ19kZXYpCi17Ci0Jc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdjsKLQlzdHJ1Y3QgYmF0bWFuX3BhY2tldCAqYmF0bWFuX3BhY2tldDsKLQlzdHJ1Y3QgYmF0bWFuX2lmICpiYXRtYW5faWY7Ci0JaW50IHJldDsKLQotCWJhdG1hbl9pZiA9IGNvbnRhaW5lcl9vZihwdHlwZSwgc3RydWN0IGJhdG1hbl9pZiwgYmF0bWFuX2Fkdl9wdHlwZSk7Ci0Jc2tiID0gc2tiX3NoYXJlX2NoZWNrKHNrYiwgR0ZQX0FUT01JQyk7Ci0KLQkvKiBza2Igd2FzIHJlbGVhc2VkIGJ5IHNrYl9zaGFyZV9jaGVjaygpICovCi0JaWYgKCFza2IpCi0JCWdvdG8gZXJyX291dDsKLQotCS8qIHBhY2tldCBzaG91bGQgaG9sZCBhdCBsZWFzdCB0eXBlIGFuZCB2ZXJzaW9uICovCi0JaWYgKHVubGlrZWx5KCFwc2tiX21heV9wdWxsKHNrYiwgMikpKQotCQlnb3RvIGVycl9mcmVlOwotCi0JLyogZXhwZWN0IGEgdmFsaWQgZXRoZXJuZXQgaGVhZGVyIGhlcmUuICovCi0JaWYgKHVubGlrZWx5KHNrYi0+bWFjX2xlbiAhPSBzaXplb2Yoc3RydWN0IGV0aGhkcikKLQkJCQl8fCAhc2tiX21hY19oZWFkZXIoc2tiKSkpCi0JCWdvdG8gZXJyX2ZyZWU7Ci0KLQlpZiAoIWJhdG1hbl9pZi0+c29mdF9pZmFjZSkKLQkJZ290byBlcnJfZnJlZTsKLQotCWJhdF9wcml2ID0gbmV0ZGV2X3ByaXYoYmF0bWFuX2lmLT5zb2Z0X2lmYWNlKTsKLQotCWlmIChhdG9taWNfcmVhZCgmYmF0X3ByaXYtPm1lc2hfc3RhdGUpICE9IE1FU0hfQUNUSVZFKQotCQlnb3RvIGVycl9mcmVlOwotCi0JLyogZGlzY2FyZCBmcmFtZXMgb24gbm90IGFjdGl2ZSBpbnRlcmZhY2VzICovCi0JaWYgKGJhdG1hbl9pZi0+aWZfc3RhdHVzICE9IElGX0FDVElWRSkKLQkJZ290byBlcnJfZnJlZTsKLQotCWJhdG1hbl9wYWNrZXQgPSAoc3RydWN0IGJhdG1hbl9wYWNrZXQgKilza2ItPmRhdGE7Ci0KLQlpZiAoYmF0bWFuX3BhY2tldC0+dmVyc2lvbiAhPSBDT01QQVRfVkVSU0lPTikgewotCQliYXRfZGJnKERCR19CQVRNQU4sIGJhdF9wcml2LAotCQkJIkRyb3AgcGFja2V0OiBpbmNvbXBhdGlibGUgYmF0bWFuIHZlcnNpb24gKCVpKVxuIiwKLQkJCWJhdG1hbl9wYWNrZXQtPnZlcnNpb24pOwotCQlnb3RvIGVycl9mcmVlOwotCX0KLQotCS8qIGFsbCByZWNlaXZlIGhhbmRsZXJzIHJldHVybiB3aGV0aGVyIHRoZXkgcmVjZWl2ZWQgb3IgcmV1c2VkCi0JICogdGhlIHN1cHBsaWVkIHNrYi4gaWYgbm90LCB3ZSBoYXZlIHRvIGZyZWUgdGhlIHNrYi4gKi8KLQotCXN3aXRjaCAoYmF0bWFuX3BhY2tldC0+cGFja2V0X3R5cGUpIHsKLQkJLyogYmF0bWFuIG9yaWdpbmF0b3IgcGFja2V0ICovCi0JY2FzZSBCQVRfUEFDS0VUOgotCQlyZXQgPSByZWN2X2JhdF9wYWNrZXQoc2tiLCBiYXRtYW5faWYpOwotCQlicmVhazsKLQotCQkvKiBiYXRtYW4gaWNtcCBwYWNrZXQgKi8KLQljYXNlIEJBVF9JQ01QOgotCQlyZXQgPSByZWN2X2ljbXBfcGFja2V0KHNrYiwgYmF0bWFuX2lmKTsKLQkJYnJlYWs7Ci0KLQkJLyogdW5pY2FzdCBwYWNrZXQgKi8KLQljYXNlIEJBVF9VTklDQVNUOgotCQlyZXQgPSByZWN2X3VuaWNhc3RfcGFja2V0KHNrYiwgYmF0bWFuX2lmKTsKLQkJYnJlYWs7Ci0KLQkJLyogZnJhZ21lbnRlZCB1bmljYXN0IHBhY2tldCAqLwotCWNhc2UgQkFUX1VOSUNBU1RfRlJBRzoKLQkJcmV0ID0gcmVjdl91Y2FzdF9mcmFnX3BhY2tldChza2IsIGJhdG1hbl9pZik7Ci0JCWJyZWFrOwotCi0JCS8qIGJyb2FkY2FzdCBwYWNrZXQgKi8KLQljYXNlIEJBVF9CQ0FTVDoKLQkJcmV0ID0gcmVjdl9iY2FzdF9wYWNrZXQoc2tiLCBiYXRtYW5faWYpOwotCQlicmVhazsKLQotCQkvKiB2aXMgcGFja2V0ICovCi0JY2FzZSBCQVRfVklTOgotCQlyZXQgPSByZWN2X3Zpc19wYWNrZXQoc2tiLCBiYXRtYW5faWYpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlyZXQgPSBORVRfUlhfRFJPUDsKLQl9Ci0KLQlpZiAocmV0ID09IE5FVF9SWF9EUk9QKQotCQlrZnJlZV9za2Ioc2tiKTsKLQotCS8qIHJldHVybiBORVRfUlhfU1VDQ0VTUyBpbiBhbnkgY2FzZSBhcyB3ZQotCSAqIG1vc3QgcHJvYmFibHkgZHJvcHBlZCB0aGUgcGFja2V0IGZvcgotCSAqIHJvdXRpbmctbG9naWNhbCByZWFzb25zLiAqLwotCi0JcmV0dXJuIE5FVF9SWF9TVUNDRVNTOwotCi1lcnJfZnJlZToKLQlrZnJlZV9za2Ioc2tiKTsKLWVycl9vdXQ6Ci0JcmV0dXJuIE5FVF9SWF9EUk9QOwotfQotCi1zdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgaGFyZF9pZl9ub3RpZmllciA9IHsKLQkubm90aWZpZXJfY2FsbCA9IGhhcmRfaWZfZXZlbnQsCi19OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvaGFyZC1pbnRlcmZhY2UuaCBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L2hhcmQtaW50ZXJmYWNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1NTA4ODkuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvaGFyZC1pbnRlcmZhY2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBCLkEuVC5NLkEuTi4gY29udHJpYnV0b3JzOgotICoKLSAqIE1hcmVrIExpbmRuZXIsIFNpbW9uIFd1bmRlcmxpY2gKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKLSAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKLSAqIDAyMTEwLTEzMDEsIFVTQQotICoKLSAqLwotCi0jaWZuZGVmIF9ORVRfQkFUTUFOX0FEVl9IQVJEX0lOVEVSRkFDRV9IXwotI2RlZmluZSBfTkVUX0JBVE1BTl9BRFZfSEFSRF9JTlRFUkZBQ0VfSF8KLQotI2RlZmluZSBJRl9OT1RfSU5fVVNFIDAKLSNkZWZpbmUgSUZfVE9fQkVfUkVNT1ZFRCAxCi0jZGVmaW5lIElGX0lOQUNUSVZFIDIKLSNkZWZpbmUgSUZfQUNUSVZFIDMKLSNkZWZpbmUgSUZfVE9fQkVfQUNUSVZBVEVEIDQKLSNkZWZpbmUgSUZfSV9XQU5UX1lPVSA1Ci0KLWV4dGVybiBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgaGFyZF9pZl9ub3RpZmllcjsKLQotc3RydWN0IGJhdG1hbl9pZiAqZ2V0X2JhdG1hbl9pZl9ieV9uZXRkZXYoc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYpOwotaW50IGhhcmRpZl9lbmFibGVfaW50ZXJmYWNlKHN0cnVjdCBiYXRtYW5faWYgKmJhdG1hbl9pZiwgY2hhciAqaWZhY2VfbmFtZSk7Ci12b2lkIGhhcmRpZl9kaXNhYmxlX2ludGVyZmFjZShzdHJ1Y3QgYmF0bWFuX2lmICpiYXRtYW5faWYpOwotdm9pZCBoYXJkaWZfcmVtb3ZlX2ludGVyZmFjZXModm9pZCk7Ci1pbnQgYmF0bWFuX3NrYl9yZWN2KHN0cnVjdCBza19idWZmICpza2IsCi0JCQkJc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCQlzdHJ1Y3QgcGFja2V0X3R5cGUgKnB0eXBlLAotCQkJCXN0cnVjdCBuZXRfZGV2aWNlICpvcmlnX2Rldik7Ci1pbnQgaGFyZGlmX21pbl9tdHUoc3RydWN0IG5ldF9kZXZpY2UgKnNvZnRfaWZhY2UpOwotdm9pZCB1cGRhdGVfbWluX210dShzdHJ1Y3QgbmV0X2RldmljZSAqc29mdF9pZmFjZSk7Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBoYXJkaWZfaG9sZChzdHJ1Y3QgYmF0bWFuX2lmICpiYXRtYW5faWYpCi17Ci0JYXRvbWljX2luYygmYmF0bWFuX2lmLT5yZWZjbnQpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgaGFyZGlmX3B1dChzdHJ1Y3QgYmF0bWFuX2lmICpiYXRtYW5faWYpCi17Ci0JaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJmJhdG1hbl9pZi0+cmVmY250KSkgewotCQlkZXZfcHV0KGJhdG1hbl9pZi0+bmV0X2Rldik7Ci0JCWtmcmVlKGJhdG1hbl9pZik7Ci0JfQotfQotCi0jZW5kaWYgLyogX05FVF9CQVRNQU5fQURWX0hBUkRfSU5URVJGQUNFX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9oYXNoLmMgYi9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9oYXNoLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlZjI2ZWIuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvaGFzaC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzA2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDYtMjAxMCBCLkEuVC5NLkEuTi4gY29udHJpYnV0b3JzOgotICoKLSAqIFNpbW9uIFd1bmRlcmxpY2gsIE1hcmVrIExpbmRuZXIKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKLSAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKLSAqIDAyMTEwLTEzMDEsIFVTQQotICoKLSAqLwotCi0jaW5jbHVkZSAibWFpbi5oIgotI2luY2x1ZGUgImhhc2guaCIKLQotLyogY2xlYXJzIHRoZSBoYXNoICovCi1zdGF0aWMgdm9pZCBoYXNoX2luaXQoc3RydWN0IGhhc2h0YWJsZV90ICpoYXNoKQotewotCWludCBpOwotCi0JaGFzaC0+ZWxlbWVudHMgPSAwOwotCi0JZm9yIChpID0gMCA7IGkgPCBoYXNoLT5zaXplOyBpKyspCi0JCWhhc2gtPnRhYmxlW2ldID0gTlVMTDsKLX0KLQotLyogcmVtb3ZlIHRoZSBoYXNoIHN0cnVjdHVyZS4gaWYgaGFzaGRhdGFfZnJlZV9jYiAhPSBOVUxMLCB0aGlzIGZ1bmN0aW9uIHdpbGwgYmUKLSAqIGNhbGxlZCB0byByZW1vdmUgdGhlIGVsZW1lbnRzIGluc2lkZSBvZiB0aGUgaGFzaC4gIGlmIHlvdSBkb24ndCByZW1vdmUgdGhlCi0gKiBlbGVtZW50cywgbWVtb3J5IG1pZ2h0IGJlIGxlYWtlZC4gKi8KLXZvaWQgaGFzaF9kZWxldGUoc3RydWN0IGhhc2h0YWJsZV90ICpoYXNoLCBoYXNoZGF0YV9mcmVlX2NiIGZyZWVfY2IsIHZvaWQgKmFyZykKLXsKLQlzdHJ1Y3QgZWxlbWVudF90ICpidWNrZXQsICpsYXN0X2J1Y2tldDsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBoYXNoLT5zaXplOyBpKyspIHsKLQkJYnVja2V0ID0gaGFzaC0+dGFibGVbaV07Ci0KLQkJd2hpbGUgKGJ1Y2tldCAhPSBOVUxMKSB7Ci0JCQlpZiAoZnJlZV9jYiAhPSBOVUxMKQotCQkJCWZyZWVfY2IoYnVja2V0LT5kYXRhLCBhcmcpOwotCi0JCQlsYXN0X2J1Y2tldCA9IGJ1Y2tldDsKLQkJCWJ1Y2tldCA9IGJ1Y2tldC0+bmV4dDsKLQkJCWtmcmVlKGxhc3RfYnVja2V0KTsKLQkJfQotCX0KLQotCWhhc2hfZGVzdHJveShoYXNoKTsKLX0KLQotLyogZnJlZSBvbmx5IHRoZSBoYXNodGFibGUgYW5kIHRoZSBoYXNoIGl0c2VsZi4gKi8KLXZvaWQgaGFzaF9kZXN0cm95KHN0cnVjdCBoYXNodGFibGVfdCAqaGFzaCkKLXsKLQlrZnJlZShoYXNoLT50YWJsZSk7Ci0Ja2ZyZWUoaGFzaCk7Ci19Ci0KLS8qIGl0ZXJhdGUgdGhvdWdoIHRoZSBoYXNoLiBGaXJzdCBlbGVtZW50IGlzIHNlbGVjdGVkIGlmIGFuIGl0ZXJhdG9yCi0gKiBpbml0aWFsaXplZCB3aXRoIEhBU0hJVCgpIGlzIHN1cHBsaWVkIGFzIGl0ZXIuIFVzZSB0aGUgcmV0dXJuZWQKLSAqIChvciBzdXBwbGllZCkgaXRlcmF0b3IgdG8gYWNjZXNzIHRoZSBlbGVtZW50cyB1bnRpbCBoYXNoX2l0ZXJhdGUgcmV0dXJucwotICogTlVMTC4gKi8KLQotc3RydWN0IGhhc2hfaXRfdCAqaGFzaF9pdGVyYXRlKHN0cnVjdCBoYXNodGFibGVfdCAqaGFzaCwKLQkJCSAgICAgICBzdHJ1Y3QgaGFzaF9pdF90ICppdGVyKQotewotCWlmICghaGFzaCkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFpdGVyKQotCQlyZXR1cm4gTlVMTDsKLQotCS8qIHNhbml0eSBjaGVja3MgZmlyc3QgKGlmIG91ciBidWNrZXQgZ290IGRlbGV0ZWQgaW4gdGhlIGxhc3QKLQkgKiBpdGVyYXRpb24pOiAqLwotCWlmIChpdGVyLT5idWNrZXQgIT0gTlVMTCkgewotCQlpZiAoaXRlci0+Zmlyc3RfYnVja2V0ICE9IE5VTEwpIHsKLQkJCS8qIHdlJ3JlIG9uIHRoZSBmaXJzdCBlbGVtZW50IGFuZCBpdCBnb3QgcmVtb3ZlZCBhZnRlcgotCQkJICogdGhlIGxhc3QgaXRlcmF0aW9uLiAqLwotCQkJaWYgKCgqaXRlci0+Zmlyc3RfYnVja2V0KSAhPSBpdGVyLT5idWNrZXQpIHsKLQkJCQkvKiB0aGVyZSBhcmUgc3RpbGwgb3RoZXIgZWxlbWVudHMgaW4gdGhlIGxpc3QgKi8KLQkJCQlpZiAoKCppdGVyLT5maXJzdF9idWNrZXQpICE9IE5VTEwpIHsKLQkJCQkJaXRlci0+cHJldl9idWNrZXQgPSBOVUxMOwotCQkJCQlpdGVyLT5idWNrZXQgPSAoKml0ZXItPmZpcnN0X2J1Y2tldCk7Ci0JCQkJCWl0ZXItPmZpcnN0X2J1Y2tldCA9Ci0JCQkJCQkmaGFzaC0+dGFibGVbaXRlci0+aW5kZXhdOwotCQkJCQlyZXR1cm4gaXRlcjsKLQkJCQl9IGVsc2UgewotCQkJCQlpdGVyLT5idWNrZXQgPSBOVUxMOwotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIGlmIChpdGVyLT5wcmV2X2J1Y2tldCAhPSBOVUxMKSB7Ci0JCQkvKgotCQkJKiB3ZSdyZSBub3Qgb24gdGhlIGZpcnN0IGVsZW1lbnQsIGFuZCB0aGUgYnVja2V0IGdvdAotCQkJKiByZW1vdmVkIGFmdGVyIHRoZSBsYXN0IGl0ZXJhdGlvbi4gIHRoZSBsYXN0IGJ1Y2tldCdzCi0JCQkqIG5leHQgcG9pbnRlciBpcyBub3QgcG9pbnRpbmcgdG8gb3VyIGFjdHVhbCBidWNrZXQKLQkJCSogYW55bW9yZS4gIHNlbGVjdCB0aGUgbmV4dC4KLQkJCSovCi0JCQlpZiAoaXRlci0+cHJldl9idWNrZXQtPm5leHQgIT0gaXRlci0+YnVja2V0KQotCQkJCWl0ZXItPmJ1Y2tldCA9IGl0ZXItPnByZXZfYnVja2V0OwotCQl9Ci0JfQotCi0JLyogbm93IGFzIHdlIGFyZSBzYW5lLCBzZWxlY3QgdGhlIG5leHQgb25lIGlmIHRoZXJlIGlzIHNvbWUgKi8KLQlpZiAoaXRlci0+YnVja2V0ICE9IE5VTEwpIHsKLQkJaWYgKGl0ZXItPmJ1Y2tldC0+bmV4dCAhPSBOVUxMKSB7Ci0JCQlpdGVyLT5wcmV2X2J1Y2tldCA9IGl0ZXItPmJ1Y2tldDsKLQkJCWl0ZXItPmJ1Y2tldCA9IGl0ZXItPmJ1Y2tldC0+bmV4dDsKLQkJCWl0ZXItPmZpcnN0X2J1Y2tldCA9IE5VTEw7Ci0JCQlyZXR1cm4gaXRlcjsKLQkJfQotCX0KLQotCS8qIGlmIG5vdCByZXR1cm5lZCB5ZXQsIHdlJ3ZlIHJlYWNoZWQgdGhlIGxhc3Qgb25lIG9uIHRoZSBpbmRleCBhbmQgaGF2ZQotCSAqIHRvIHNlYXJjaCBmb3J3YXJkICovCi0JaXRlci0+aW5kZXgrKzsKLQkvKiBnbyB0aHJvdWdoIHRoZSBlbnRyaWVzIG9mIHRoZSBoYXNoIHRhYmxlICovCi0Jd2hpbGUgKGl0ZXItPmluZGV4IDwgaGFzaC0+c2l6ZSkgewotCQlpZiAoKGhhc2gtPnRhYmxlW2l0ZXItPmluZGV4XSkgIT0gTlVMTCkgewotCQkJaXRlci0+cHJldl9idWNrZXQgPSBOVUxMOwotCQkJaXRlci0+YnVja2V0ID0gaGFzaC0+dGFibGVbaXRlci0+aW5kZXhdOwotCQkJaXRlci0+Zmlyc3RfYnVja2V0ID0gJmhhc2gtPnRhYmxlW2l0ZXItPmluZGV4XTsKLQkJCXJldHVybiBpdGVyOwotCQl9IGVsc2UgewotCQkJaXRlci0+aW5kZXgrKzsKLQkJfQotCX0KLQotCS8qIG5vdGhpbmcgdG8gaXRlcmF0ZSBvdmVyIGFueW1vcmUgKi8KLQlyZXR1cm4gTlVMTDsKLX0KLQotLyogYWxsb2NhdGVzIGFuZCBjbGVhcnMgdGhlIGhhc2ggKi8KLXN0cnVjdCBoYXNodGFibGVfdCAqaGFzaF9uZXcoaW50IHNpemUsIGhhc2hkYXRhX2NvbXBhcmVfY2IgY29tcGFyZSwKLQkJCSAgICAgaGFzaGRhdGFfY2hvb3NlX2NiIGNob29zZSkKLXsKLQlzdHJ1Y3QgaGFzaHRhYmxlX3QgKmhhc2g7Ci0KLQloYXNoID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGhhc2h0YWJsZV90KSAsIEdGUF9BVE9NSUMpOwotCi0JaWYgKGhhc2ggPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0KLQloYXNoLT5zaXplID0gc2l6ZTsKLQloYXNoLT50YWJsZSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBlbGVtZW50X3QgKikgKiBzaXplLCBHRlBfQVRPTUlDKTsKLQotCWlmIChoYXNoLT50YWJsZSA9PSBOVUxMKSB7Ci0JCWtmcmVlKGhhc2gpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQloYXNoX2luaXQoaGFzaCk7Ci0KLQloYXNoLT5jb21wYXJlID0gY29tcGFyZTsKLQloYXNoLT5jaG9vc2UgPSBjaG9vc2U7Ci0KLQlyZXR1cm4gaGFzaDsKLX0KLQotLyogYWRkcyBkYXRhIHRvIHRoZSBoYXNodGFibGUuIHJldHVybnMgMCBvbiBzdWNjZXNzLCAtMSBvbiBlcnJvciAqLwotaW50IGhhc2hfYWRkKHN0cnVjdCBoYXNodGFibGVfdCAqaGFzaCwgdm9pZCAqZGF0YSkKLXsKLQlpbnQgaW5kZXg7Ci0Jc3RydWN0IGVsZW1lbnRfdCAqYnVja2V0LCAqcHJldl9idWNrZXQgPSBOVUxMOwotCi0JaWYgKCFoYXNoKQotCQlyZXR1cm4gLTE7Ci0KLQlpbmRleCA9IGhhc2gtPmNob29zZShkYXRhLCBoYXNoLT5zaXplKTsKLQlidWNrZXQgPSBoYXNoLT50YWJsZVtpbmRleF07Ci0KLQl3aGlsZSAoYnVja2V0ICE9IE5VTEwpIHsKLQkJaWYgKGhhc2gtPmNvbXBhcmUoYnVja2V0LT5kYXRhLCBkYXRhKSkKLQkJCXJldHVybiAtMTsKLQotCQlwcmV2X2J1Y2tldCA9IGJ1Y2tldDsKLQkJYnVja2V0ID0gYnVja2V0LT5uZXh0OwotCX0KLQotCS8qIGZvdW5kIHRoZSB0YWlsIG9mIHRoZSBsaXN0LCBhZGQgbmV3IGVsZW1lbnQgKi8KLQlidWNrZXQgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgZWxlbWVudF90KSwgR0ZQX0FUT01JQyk7Ci0KLQlpZiAoYnVja2V0ID09IE5VTEwpCi0JCXJldHVybiAtMTsKLQotCWJ1Y2tldC0+ZGF0YSA9IGRhdGE7Ci0JYnVja2V0LT5uZXh0ID0gTlVMTDsKLQotCS8qIGFuZCBsaW5rIGl0ICovCi0JaWYgKHByZXZfYnVja2V0ID09IE5VTEwpCi0JCWhhc2gtPnRhYmxlW2luZGV4XSA9IGJ1Y2tldDsKLQllbHNlCi0JCXByZXZfYnVja2V0LT5uZXh0ID0gYnVja2V0OwotCi0JaGFzaC0+ZWxlbWVudHMrKzsKLQlyZXR1cm4gMDsKLX0KLQotLyogZmluZHMgZGF0YSwgYmFzZWQgb24gdGhlIGtleSBpbiBrZXlkYXRhLiByZXR1cm5zIHRoZSBmb3VuZCBkYXRhIG9uIHN1Y2Nlc3MsCi0gKiBvciBOVUxMIG9uIGVycm9yICovCi12b2lkICpoYXNoX2ZpbmQoc3RydWN0IGhhc2h0YWJsZV90ICpoYXNoLCB2b2lkICprZXlkYXRhKQotewotCWludCBpbmRleDsKLQlzdHJ1Y3QgZWxlbWVudF90ICpidWNrZXQ7Ci0KLQlpZiAoIWhhc2gpCi0JCXJldHVybiBOVUxMOwotCi0JaW5kZXggPSBoYXNoLT5jaG9vc2Uoa2V5ZGF0YSAsIGhhc2gtPnNpemUpOwotCWJ1Y2tldCA9IGhhc2gtPnRhYmxlW2luZGV4XTsKLQotCXdoaWxlIChidWNrZXQgIT0gTlVMTCkgewotCQlpZiAoaGFzaC0+Y29tcGFyZShidWNrZXQtPmRhdGEsIGtleWRhdGEpKQotCQkJcmV0dXJuIGJ1Y2tldC0+ZGF0YTsKLQotCQlidWNrZXQgPSBidWNrZXQtPm5leHQ7Ci0JfQotCi0JcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIHJlbW92ZSBidWNrZXQgKHRoaXMgbWlnaHQgYmUgdXNlZCBpbiBoYXNoX2l0ZXJhdGUoKSBpZiB5b3UgYWxyZWFkeSBmb3VuZCB0aGUKLSAqIGJ1Y2tldCB5b3Ugd2FudCB0byBkZWxldGUgYW5kIGRvbid0IG5lZWQgdGhlIG92ZXJoZWFkIHRvIGZpbmQgaXQgYWdhaW4gd2l0aAotICogaGFzaF9yZW1vdmUoKS4gQnV0IHVzdWFsbHksIHlvdSBkb24ndCB3YW50IHRvIHVzZSB0aGlzIGZ1bmN0aW9uLCBhcyBpdAotICogZmlkZGxlcyB3aXRoIGhhc2gtaW50ZXJuYWxzLiAqLwotdm9pZCAqaGFzaF9yZW1vdmVfYnVja2V0KHN0cnVjdCBoYXNodGFibGVfdCAqaGFzaCwgc3RydWN0IGhhc2hfaXRfdCAqaGFzaF9pdF90KQotewotCXZvaWQgKmRhdGFfc2F2ZTsKLQotCWRhdGFfc2F2ZSA9IGhhc2hfaXRfdC0+YnVja2V0LT5kYXRhOwotCi0JaWYgKGhhc2hfaXRfdC0+cHJldl9idWNrZXQgIT0gTlVMTCkKLQkJaGFzaF9pdF90LT5wcmV2X2J1Y2tldC0+bmV4dCA9IGhhc2hfaXRfdC0+YnVja2V0LT5uZXh0OwotCWVsc2UgaWYgKGhhc2hfaXRfdC0+Zmlyc3RfYnVja2V0ICE9IE5VTEwpCi0JCSgqaGFzaF9pdF90LT5maXJzdF9idWNrZXQpID0gaGFzaF9pdF90LT5idWNrZXQtPm5leHQ7Ci0KLQlrZnJlZShoYXNoX2l0X3QtPmJ1Y2tldCk7Ci0JaGFzaC0+ZWxlbWVudHMtLTsKLQotCXJldHVybiBkYXRhX3NhdmU7Ci19Ci0KLS8qIHJlbW92ZXMgZGF0YSBmcm9tIGhhc2gsIGlmIGZvdW5kLiByZXR1cm5zIHBvaW50ZXIgZG8gZGF0YSBvbiBzdWNjZXNzLCBzbyB5b3UKLSAqIGNhbiByZW1vdmUgdGhlIHVzZWQgc3RydWN0dXJlIHlvdXJzZWxmLCBvciBOVUxMIG9uIGVycm9yIC4gIGRhdGEgY291bGQgYmUgdGhlCi0gKiBzdHJ1Y3R1cmUgeW91IHVzZSB3aXRoIGp1c3QgdGhlIGtleSBmaWxsZWQsIHdlIGp1c3QgbmVlZCB0aGUga2V5IGZvcgotICogY29tcGFyaW5nLiAqLwotdm9pZCAqaGFzaF9yZW1vdmUoc3RydWN0IGhhc2h0YWJsZV90ICpoYXNoLCB2b2lkICpkYXRhKQotewotCXN0cnVjdCBoYXNoX2l0X3QgaGFzaF9pdF90OwotCi0JaGFzaF9pdF90LmluZGV4ID0gaGFzaC0+Y2hvb3NlKGRhdGEsIGhhc2gtPnNpemUpOwotCWhhc2hfaXRfdC5idWNrZXQgPSBoYXNoLT50YWJsZVtoYXNoX2l0X3QuaW5kZXhdOwotCWhhc2hfaXRfdC5wcmV2X2J1Y2tldCA9IE5VTEw7Ci0KLQl3aGlsZSAoaGFzaF9pdF90LmJ1Y2tldCAhPSBOVUxMKSB7Ci0JCWlmIChoYXNoLT5jb21wYXJlKGhhc2hfaXRfdC5idWNrZXQtPmRhdGEsIGRhdGEpKSB7Ci0JCQloYXNoX2l0X3QuZmlyc3RfYnVja2V0ID0KLQkJCQkoaGFzaF9pdF90LmJ1Y2tldCA9PQotCQkJCSBoYXNoLT50YWJsZVtoYXNoX2l0X3QuaW5kZXhdID8KLQkJCQkgJmhhc2gtPnRhYmxlW2hhc2hfaXRfdC5pbmRleF0gOiBOVUxMKTsKLQkJCXJldHVybiBoYXNoX3JlbW92ZV9idWNrZXQoaGFzaCwgJmhhc2hfaXRfdCk7Ci0JCX0KLQotCQloYXNoX2l0X3QucHJldl9idWNrZXQgPSBoYXNoX2l0X3QuYnVja2V0OwotCQloYXNoX2l0X3QuYnVja2V0ID0gaGFzaF9pdF90LmJ1Y2tldC0+bmV4dDsKLQl9Ci0KLQlyZXR1cm4gTlVMTDsKLX0KLQotLyogcmVzaXplIHRoZSBoYXNoLCByZXR1cm5zIHRoZSBwb2ludGVyIHRvIHRoZSBuZXcgaGFzaCBvciBOVUxMIG9uCi0gKiBlcnJvci4gcmVtb3ZlcyB0aGUgb2xkIGhhc2ggb24gc3VjY2Vzcy4gKi8KLXN0cnVjdCBoYXNodGFibGVfdCAqaGFzaF9yZXNpemUoc3RydWN0IGhhc2h0YWJsZV90ICpoYXNoLCBpbnQgc2l6ZSkKLXsKLQlzdHJ1Y3QgaGFzaHRhYmxlX3QgKm5ld19oYXNoOwotCXN0cnVjdCBlbGVtZW50X3QgKmJ1Y2tldDsKLQlpbnQgaTsKLQotCS8qIGluaXRpYWxpemUgYSBuZXcgaGFzaCB3aXRoIHRoZSBuZXcgc2l6ZSAqLwotCW5ld19oYXNoID0gaGFzaF9uZXcoc2l6ZSwgaGFzaC0+Y29tcGFyZSwgaGFzaC0+Y2hvb3NlKTsKLQotCWlmIChuZXdfaGFzaCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQotCS8qIGNvcHkgdGhlIGVsZW1lbnRzICovCi0JZm9yIChpID0gMDsgaSA8IGhhc2gtPnNpemU7IGkrKykgewotCQlidWNrZXQgPSBoYXNoLT50YWJsZVtpXTsKLQotCQl3aGlsZSAoYnVja2V0ICE9IE5VTEwpIHsKLQkJCWhhc2hfYWRkKG5ld19oYXNoLCBidWNrZXQtPmRhdGEpOwotCQkJYnVja2V0ID0gYnVja2V0LT5uZXh0OwotCQl9Ci0JfQotCi0JLyogcmVtb3ZlIGhhc2ggYW5kIGV2ZW50dWFsIG92ZXJmbG93IGJ1Y2tldHMgYnV0IG5vdCB0aGUgY29udGVudAotCSAqIGl0c2VsZi4gKi8KLQloYXNoX2RlbGV0ZShoYXNoLCBOVUxMLCBOVUxMKTsKLQotCXJldHVybiBuZXdfaGFzaDsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L2hhc2guaCBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L2hhc2guaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmM4ZTE3Ni4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9oYXNoLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNi0yMDEwIEIuQS5ULk0uQS5OLiBjb250cmlidXRvcnM6Ci0gKgotICogU2ltb24gV3VuZGVybGljaCwgTWFyZWsgTGluZG5lcgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQotICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQotICogMDIxMTAtMTMwMSwgVVNBCi0gKgotICovCi0KLSNpZm5kZWYgX05FVF9CQVRNQU5fQURWX0hBU0hfSF8KLSNkZWZpbmUgX05FVF9CQVRNQU5fQURWX0hBU0hfSF8KLQotI2RlZmluZSBIQVNISVQobmFtZSkgc3RydWN0IGhhc2hfaXRfdCBuYW1lID0geyBcCi0JCS5pbmRleCA9IC0xLCAuYnVja2V0ID0gTlVMTCwgXAotCQkucHJldl9idWNrZXQgPSBOVUxMLCBcCi0JCS5maXJzdF9idWNrZXQgPSBOVUxMIH0KLQotCi10eXBlZGVmIGludCAoKmhhc2hkYXRhX2NvbXBhcmVfY2IpKHZvaWQgKiwgdm9pZCAqKTsKLXR5cGVkZWYgaW50ICgqaGFzaGRhdGFfY2hvb3NlX2NiKSh2b2lkICosIGludCk7Ci10eXBlZGVmIHZvaWQgKCpoYXNoZGF0YV9mcmVlX2NiKSh2b2lkICosIHZvaWQgKik7Ci0KLXN0cnVjdCBlbGVtZW50X3QgewotCXZvaWQgKmRhdGE7CQkvKiBwb2ludGVyIHRvIHRoZSBkYXRhICovCi0Jc3RydWN0IGVsZW1lbnRfdCAqbmV4dDsJLyogb3ZlcmZsb3cgYnVja2V0IHBvaW50ZXIgKi8KLX07Ci0KLXN0cnVjdCBoYXNoX2l0X3QgewotCWludCBpbmRleDsKLQlzdHJ1Y3QgZWxlbWVudF90ICpidWNrZXQ7Ci0Jc3RydWN0IGVsZW1lbnRfdCAqcHJldl9idWNrZXQ7Ci0Jc3RydWN0IGVsZW1lbnRfdCAqKmZpcnN0X2J1Y2tldDsKLX07Ci0KLXN0cnVjdCBoYXNodGFibGVfdCB7Ci0Jc3RydWN0IGVsZW1lbnRfdCAqKnRhYmxlOyAgIC8qIHRoZSBoYXNodGFibGUgaXRzZWxmLCB3aXRoIHRoZSBidWNrZXRzICovCi0JaW50IGVsZW1lbnRzOwkJICAgIC8qIG51bWJlciBvZiBlbGVtZW50cyByZWdpc3RlcmVkICovCi0JaW50IHNpemU7CQkgICAgLyogc2l6ZSBvZiBoYXNodGFibGUgKi8KLQloYXNoZGF0YV9jb21wYXJlX2NiIGNvbXBhcmU7LyogY2FsbGJhY2sgdG8gYSBjb21wYXJlIGZ1bmN0aW9uLiAgc2hvdWxkCi0JCQkJICAgICAqIGNvbXBhcmUgMiBlbGVtZW50IGRhdGFzIGZvciB0aGVpciBrZXlzLAotCQkJCSAgICAgKiByZXR1cm4gMCBpZiBzYW1lIGFuZCBub3QgMCBpZiBub3QKLQkJCQkgICAgICogc2FtZSAqLwotCWhhc2hkYXRhX2Nob29zZV9jYiBjaG9vc2U7ICAvKiB0aGUgaGFzaGZ1bmN0aW9uLCBzaG91bGQgcmV0dXJuIGFuIGluZGV4Ci0JCQkJICAgICAqIGJhc2VkIG9uIHRoZSBrZXkgaW4gdGhlIGRhdGEgb2YgdGhlIGZpcnN0Ci0JCQkJICAgICAqIGFyZ3VtZW50IGFuZCB0aGUgc2l6ZSB0aGUgc2Vjb25kICovCi19OwotCi0vKiBhbGxvY2F0ZXMgYW5kIGNsZWFycyB0aGUgaGFzaCAqLwotc3RydWN0IGhhc2h0YWJsZV90ICpoYXNoX25ldyhpbnQgc2l6ZSwgaGFzaGRhdGFfY29tcGFyZV9jYiBjb21wYXJlLAotCQkJICAgICBoYXNoZGF0YV9jaG9vc2VfY2IgY2hvb3NlKTsKLQotLyogcmVtb3ZlIGJ1Y2tldCAodGhpcyBtaWdodCBiZSB1c2VkIGluIGhhc2hfaXRlcmF0ZSgpIGlmIHlvdSBhbHJlYWR5IGZvdW5kIHRoZQotICogYnVja2V0IHlvdSB3YW50IHRvIGRlbGV0ZSBhbmQgZG9uJ3QgbmVlZCB0aGUgb3ZlcmhlYWQgdG8gZmluZCBpdCBhZ2FpbiB3aXRoCi0gKiBoYXNoX3JlbW92ZSgpLiAgQnV0IHVzdWFsbHksIHlvdSBkb24ndCB3YW50IHRvIHVzZSB0aGlzIGZ1bmN0aW9uLCBhcyBpdAotICogZmlkZGxlcyB3aXRoIGhhc2gtaW50ZXJuYWxzLiAqLwotdm9pZCAqaGFzaF9yZW1vdmVfYnVja2V0KHN0cnVjdCBoYXNodGFibGVfdCAqaGFzaCwgc3RydWN0IGhhc2hfaXRfdCAqaGFzaF9pdF90KTsKLQotLyogcmVtb3ZlIHRoZSBoYXNoIHN0cnVjdHVyZS4gaWYgaGFzaGRhdGFfZnJlZV9jYiAhPSBOVUxMLCB0aGlzIGZ1bmN0aW9uIHdpbGwgYmUKLSAqIGNhbGxlZCB0byByZW1vdmUgdGhlIGVsZW1lbnRzIGluc2lkZSBvZiB0aGUgaGFzaC4gIGlmIHlvdSBkb24ndCByZW1vdmUgdGhlCi0gKiBlbGVtZW50cywgbWVtb3J5IG1pZ2h0IGJlIGxlYWtlZC4gKi8KLXZvaWQgaGFzaF9kZWxldGUoc3RydWN0IGhhc2h0YWJsZV90ICpoYXNoLCBoYXNoZGF0YV9mcmVlX2NiIGZyZWVfY2IsIHZvaWQgKmFyZyk7Ci0KLS8qIGZyZWUgb25seSB0aGUgaGFzaHRhYmxlIGFuZCB0aGUgaGFzaCBpdHNlbGYuICovCi12b2lkIGhhc2hfZGVzdHJveShzdHJ1Y3QgaGFzaHRhYmxlX3QgKmhhc2gpOwotCi0vKiBhZGRzIGRhdGEgdG8gdGhlIGhhc2h0YWJsZS4gcmV0dXJucyAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGVycm9yICovCi1pbnQgaGFzaF9hZGQoc3RydWN0IGhhc2h0YWJsZV90ICpoYXNoLCB2b2lkICpkYXRhKTsKLQotLyogcmVtb3ZlcyBkYXRhIGZyb20gaGFzaCwgaWYgZm91bmQuIHJldHVybnMgcG9pbnRlciBkbyBkYXRhIG9uIHN1Y2Nlc3MsIHNvIHlvdQotICogY2FuIHJlbW92ZSB0aGUgdXNlZCBzdHJ1Y3R1cmUgeW91cnNlbGYsIG9yIE5VTEwgb24gZXJyb3IgLiAgZGF0YSBjb3VsZCBiZSB0aGUKLSAqIHN0cnVjdHVyZSB5b3UgdXNlIHdpdGgganVzdCB0aGUga2V5IGZpbGxlZCwgd2UganVzdCBuZWVkIHRoZSBrZXkgZm9yCi0gKiBjb21wYXJpbmcuICovCi12b2lkICpoYXNoX3JlbW92ZShzdHJ1Y3QgaGFzaHRhYmxlX3QgKmhhc2gsIHZvaWQgKmRhdGEpOwotCi0vKiBmaW5kcyBkYXRhLCBiYXNlZCBvbiB0aGUga2V5IGluIGtleWRhdGEuIHJldHVybnMgdGhlIGZvdW5kIGRhdGEgb24gc3VjY2VzcywKLSAqIG9yIE5VTEwgb24gZXJyb3IgKi8KLXZvaWQgKmhhc2hfZmluZChzdHJ1Y3QgaGFzaHRhYmxlX3QgKmhhc2gsIHZvaWQgKmtleWRhdGEpOwotCi0vKiByZXNpemUgdGhlIGhhc2gsIHJldHVybnMgdGhlIHBvaW50ZXIgdG8gdGhlIG5ldyBoYXNoIG9yIE5VTEwgb24KLSAqIGVycm9yLiByZW1vdmVzIHRoZSBvbGQgaGFzaCBvbiBzdWNjZXNzICovCi1zdHJ1Y3QgaGFzaHRhYmxlX3QgKmhhc2hfcmVzaXplKHN0cnVjdCBoYXNodGFibGVfdCAqaGFzaCwgaW50IHNpemUpOwotCi0vKiBpdGVyYXRlIHRob3VnaCB0aGUgaGFzaC4gZmlyc3QgZWxlbWVudCBpcyBzZWxlY3RlZCB3aXRoIGl0ZXJfaW4gTlVMTC4gIHVzZQotICogdGhlIHJldHVybmVkIGl0ZXJhdG9yIHRvIGFjY2VzcyB0aGUgZWxlbWVudHMgdW50aWwgaGFzaF9pdF90IHJldHVybnMgTlVMTC4gKi8KLXN0cnVjdCBoYXNoX2l0X3QgKmhhc2hfaXRlcmF0ZShzdHJ1Y3QgaGFzaHRhYmxlX3QgKmhhc2gsCi0JCQkgICAgICAgc3RydWN0IGhhc2hfaXRfdCAqaXRlcl9pbik7Ci0KLSNlbmRpZiAvKiBfTkVUX0JBVE1BTl9BRFZfSEFTSF9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvaWNtcF9zb2NrZXQuYyBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L2ljbXBfc29ja2V0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4ODU2Y2EuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvaWNtcF9zb2NrZXQuYworKysgL2Rldi9udWxsCkBAIC0xLDM1OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgQi5BLlQuTS5BLk4uIGNvbnRyaWJ1dG9yczoKLSAqCi0gKiBNYXJlayBMaW5kbmVyCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCi0gKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCi0gKiAwMjExMC0xMzAxLCBVU0EKLSAqCi0gKi8KLQotI2luY2x1ZGUgIm1haW4uaCIKLSNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgImljbXBfc29ja2V0LmgiCi0jaW5jbHVkZSAic2VuZC5oIgotI2luY2x1ZGUgInR5cGVzLmgiCi0jaW5jbHVkZSAiaGFzaC5oIgotI2luY2x1ZGUgImhhcmQtaW50ZXJmYWNlLmgiCi0KLQotc3RhdGljIHN0cnVjdCBzb2NrZXRfY2xpZW50ICpzb2NrZXRfY2xpZW50X2hhc2hbMjU2XTsKLQotc3RhdGljIHZvaWQgYmF0X3NvY2tldF9hZGRfcGFja2V0KHN0cnVjdCBzb2NrZXRfY2xpZW50ICpzb2NrZXRfY2xpZW50LAotCQkJCSAgc3RydWN0IGljbXBfcGFja2V0X3JyICppY21wX3BhY2tldCwKLQkJCQkgIHNpemVfdCBpY21wX2xlbik7Ci0KLXZvaWQgYmF0X3NvY2tldF9pbml0KHZvaWQpCi17Ci0JbWVtc2V0KHNvY2tldF9jbGllbnRfaGFzaCwgMCwgc2l6ZW9mKHNvY2tldF9jbGllbnRfaGFzaCkpOwotfQotCi1zdGF0aWMgaW50IGJhdF9zb2NrZXRfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQl1bnNpZ25lZCBpbnQgaTsKLQlzdHJ1Y3Qgc29ja2V0X2NsaWVudCAqc29ja2V0X2NsaWVudDsKLQotCW5vbnNlZWthYmxlX29wZW4oaW5vZGUsIGZpbGUpOwotCi0Jc29ja2V0X2NsaWVudCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBzb2NrZXRfY2xpZW50KSwgR0ZQX0tFUk5FTCk7Ci0KLQlpZiAoIXNvY2tldF9jbGllbnQpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoc29ja2V0X2NsaWVudF9oYXNoKTsgaSsrKSB7Ci0JCWlmICghc29ja2V0X2NsaWVudF9oYXNoW2ldKSB7Ci0JCQlzb2NrZXRfY2xpZW50X2hhc2hbaV0gPSBzb2NrZXRfY2xpZW50OwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQlpZiAoaSA9PSBBUlJBWV9TSVpFKHNvY2tldF9jbGllbnRfaGFzaCkpIHsKLQkJcHJfZXJyKCJFcnJvciAtIGNhbid0IGFkZCBhbm90aGVyIHBhY2tldCBjbGllbnQ6ICIKLQkJICAgICAgICJtYXhpbXVtIG51bWJlciBvZiBjbGllbnRzIHJlYWNoZWRcbiIpOwotCQlrZnJlZShzb2NrZXRfY2xpZW50KTsKLQkJcmV0dXJuIC1FWEZVTEw7Ci0JfQotCi0JSU5JVF9MSVNUX0hFQUQoJnNvY2tldF9jbGllbnQtPnF1ZXVlX2xpc3QpOwotCXNvY2tldF9jbGllbnQtPnF1ZXVlX2xlbiA9IDA7Ci0Jc29ja2V0X2NsaWVudC0+aW5kZXggPSBpOwotCXNvY2tldF9jbGllbnQtPmJhdF9wcml2ID0gaW5vZGUtPmlfcHJpdmF0ZTsKLQlzcGluX2xvY2tfaW5pdCgmc29ja2V0X2NsaWVudC0+bG9jayk7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmc29ja2V0X2NsaWVudC0+cXVldWVfd2FpdCk7Ci0KLQlmaWxlLT5wcml2YXRlX2RhdGEgPSBzb2NrZXRfY2xpZW50OwotCi0JaW5jX21vZHVsZV9jb3VudCgpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGJhdF9zb2NrZXRfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlzdHJ1Y3Qgc29ja2V0X2NsaWVudCAqc29ja2V0X2NsaWVudCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3Qgc29ja2V0X3BhY2tldCAqc29ja2V0X3BhY2tldDsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0X3BvcywgKmxpc3RfcG9zX3RtcDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnNvY2tldF9jbGllbnQtPmxvY2ssIGZsYWdzKTsKLQotCS8qIGZvciBhbGwgcGFja2V0cyBpbiB0aGUgcXVldWUgLi4uICovCi0JbGlzdF9mb3JfZWFjaF9zYWZlKGxpc3RfcG9zLCBsaXN0X3Bvc190bXAsICZzb2NrZXRfY2xpZW50LT5xdWV1ZV9saXN0KSB7Ci0JCXNvY2tldF9wYWNrZXQgPSBsaXN0X2VudHJ5KGxpc3RfcG9zLAotCQkJCQkgICBzdHJ1Y3Qgc29ja2V0X3BhY2tldCwgbGlzdCk7Ci0KLQkJbGlzdF9kZWwobGlzdF9wb3MpOwotCQlrZnJlZShzb2NrZXRfcGFja2V0KTsKLQl9Ci0KLQlzb2NrZXRfY2xpZW50X2hhc2hbc29ja2V0X2NsaWVudC0+aW5kZXhdID0gTlVMTDsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzb2NrZXRfY2xpZW50LT5sb2NrLCBmbGFncyk7Ci0KLQlrZnJlZShzb2NrZXRfY2xpZW50KTsKLQlkZWNfbW9kdWxlX2NvdW50KCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHNzaXplX3QgYmF0X3NvY2tldF9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLAotCQkJICAgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQotewotCXN0cnVjdCBzb2NrZXRfY2xpZW50ICpzb2NrZXRfY2xpZW50ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBzb2NrZXRfcGFja2V0ICpzb2NrZXRfcGFja2V0OwotCXNpemVfdCBwYWNrZXRfbGVuOwotCWludCBlcnJvcjsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JaWYgKChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgJiYgKHNvY2tldF9jbGllbnQtPnF1ZXVlX2xlbiA9PSAwKSkKLQkJcmV0dXJuIC1FQUdBSU47Ci0KLQlpZiAoKCFidWYpIHx8IChjb3VudCA8IHNpemVvZihzdHJ1Y3QgaWNtcF9wYWNrZXQpKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIGJ1ZiwgY291bnQpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQotCWVycm9yID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKHNvY2tldF9jbGllbnQtPnF1ZXVlX3dhaXQsCi0JCQkJCSBzb2NrZXRfY2xpZW50LT5xdWV1ZV9sZW4pOwotCi0JaWYgKGVycm9yKQotCQlyZXR1cm4gZXJyb3I7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmc29ja2V0X2NsaWVudC0+bG9jaywgZmxhZ3MpOwotCi0Jc29ja2V0X3BhY2tldCA9IGxpc3RfZmlyc3RfZW50cnkoJnNvY2tldF9jbGllbnQtPnF1ZXVlX2xpc3QsCi0JCQkJCSBzdHJ1Y3Qgc29ja2V0X3BhY2tldCwgbGlzdCk7Ci0JbGlzdF9kZWwoJnNvY2tldF9wYWNrZXQtPmxpc3QpOwotCXNvY2tldF9jbGllbnQtPnF1ZXVlX2xlbi0tOwotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc29ja2V0X2NsaWVudC0+bG9jaywgZmxhZ3MpOwotCi0JZXJyb3IgPSBfX2NvcHlfdG9fdXNlcihidWYsICZzb2NrZXRfcGFja2V0LT5pY21wX3BhY2tldCwKLQkJCSAgICAgICBzb2NrZXRfcGFja2V0LT5pY21wX2xlbik7Ci0KLQlwYWNrZXRfbGVuID0gc29ja2V0X3BhY2tldC0+aWNtcF9sZW47Ci0Ja2ZyZWUoc29ja2V0X3BhY2tldCk7Ci0KLQlpZiAoZXJyb3IpCi0JCXJldHVybiAtRUZBVUxUOwotCi0JcmV0dXJuIHBhY2tldF9sZW47Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGJhdF9zb2NrZXRfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWZmLAotCQkJCXNpemVfdCBsZW4sIGxvZmZfdCAqb2ZmKQotewotCXN0cnVjdCBzb2NrZXRfY2xpZW50ICpzb2NrZXRfY2xpZW50ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYgPSBzb2NrZXRfY2xpZW50LT5iYXRfcHJpdjsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwotCXN0cnVjdCBpY21wX3BhY2tldF9yciAqaWNtcF9wYWNrZXQ7Ci0KLQlzdHJ1Y3Qgb3JpZ19ub2RlICpvcmlnX25vZGU7Ci0Jc3RydWN0IGJhdG1hbl9pZiAqYmF0bWFuX2lmOwotCXNpemVfdCBwYWNrZXRfbGVuID0gc2l6ZW9mKHN0cnVjdCBpY21wX3BhY2tldCk7Ci0JdWludDhfdCBkc3RhZGRyW0VUSF9BTEVOXTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JaWYgKGxlbiA8IHNpemVvZihzdHJ1Y3QgaWNtcF9wYWNrZXQpKSB7Ci0JCWJhdF9kYmcoREJHX0JBVE1BTiwgYmF0X3ByaXYsCi0JCQkiRXJyb3IgLSBjYW4ndCBzZW5kIHBhY2tldCBmcm9tIGNoYXIgZGV2aWNlOiAiCi0JCQkiaW52YWxpZCBwYWNrZXQgc2l6ZVxuIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWlmICghYmF0X3ByaXYtPnByaW1hcnlfaWYpCi0JCXJldHVybiAtRUZBVUxUOwotCi0JaWYgKGxlbiA+PSBzaXplb2Yoc3RydWN0IGljbXBfcGFja2V0X3JyKSkKLQkJcGFja2V0X2xlbiA9IHNpemVvZihzdHJ1Y3QgaWNtcF9wYWNrZXRfcnIpOwotCi0Jc2tiID0gZGV2X2FsbG9jX3NrYihwYWNrZXRfbGVuICsgc2l6ZW9mKHN0cnVjdCBldGhoZHIpKTsKLQlpZiAoIXNrYikKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlza2JfcmVzZXJ2ZShza2IsIHNpemVvZihzdHJ1Y3QgZXRoaGRyKSk7Ci0JaWNtcF9wYWNrZXQgPSAoc3RydWN0IGljbXBfcGFja2V0X3JyICopc2tiX3B1dChza2IsIHBhY2tldF9sZW4pOwotCi0JaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIGJ1ZmYsIHBhY2tldF9sZW4pKSB7Ci0JCWxlbiA9IC1FRkFVTFQ7Ci0JCWdvdG8gZnJlZV9za2I7Ci0JfQotCi0JaWYgKF9fY29weV9mcm9tX3VzZXIoaWNtcF9wYWNrZXQsIGJ1ZmYsIHBhY2tldF9sZW4pKSB7Ci0JCWxlbiA9IC1FRkFVTFQ7Ci0JCWdvdG8gZnJlZV9za2I7Ci0JfQotCi0JaWYgKGljbXBfcGFja2V0LT5wYWNrZXRfdHlwZSAhPSBCQVRfSUNNUCkgewotCQliYXRfZGJnKERCR19CQVRNQU4sIGJhdF9wcml2LAotCQkJIkVycm9yIC0gY2FuJ3Qgc2VuZCBwYWNrZXQgZnJvbSBjaGFyIGRldmljZTogIgotCQkJImdvdCBib2d1cyBwYWNrZXQgdHlwZSAoZXhwZWN0ZWQ6IEJBVF9JQ01QKVxuIik7Ci0JCWxlbiA9IC1FSU5WQUw7Ci0JCWdvdG8gZnJlZV9za2I7Ci0JfQotCi0JaWYgKGljbXBfcGFja2V0LT5tc2dfdHlwZSAhPSBFQ0hPX1JFUVVFU1QpIHsKLQkJYmF0X2RiZyhEQkdfQkFUTUFOLCBiYXRfcHJpdiwKLQkJCSJFcnJvciAtIGNhbid0IHNlbmQgcGFja2V0IGZyb20gY2hhciBkZXZpY2U6ICIKLQkJCSJnb3QgYm9ndXMgbWVzc2FnZSB0eXBlIChleHBlY3RlZDogRUNIT19SRVFVRVNUKVxuIik7Ci0JCWxlbiA9IC1FSU5WQUw7Ci0JCWdvdG8gZnJlZV9za2I7Ci0JfQotCi0JaWNtcF9wYWNrZXQtPnVpZCA9IHNvY2tldF9jbGllbnQtPmluZGV4OwotCi0JaWYgKGljbXBfcGFja2V0LT52ZXJzaW9uICE9IENPTVBBVF9WRVJTSU9OKSB7Ci0JCWljbXBfcGFja2V0LT5tc2dfdHlwZSA9IFBBUkFNRVRFUl9QUk9CTEVNOwotCQlpY21wX3BhY2tldC0+dHRsID0gQ09NUEFUX1ZFUlNJT047Ci0JCWJhdF9zb2NrZXRfYWRkX3BhY2tldChzb2NrZXRfY2xpZW50LCBpY21wX3BhY2tldCwgcGFja2V0X2xlbik7Ci0JCWdvdG8gZnJlZV9za2I7Ci0JfQotCi0JaWYgKGF0b21pY19yZWFkKCZiYXRfcHJpdi0+bWVzaF9zdGF0ZSkgIT0gTUVTSF9BQ1RJVkUpCi0JCWdvdG8gZHN0X3VucmVhY2g7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYmF0X3ByaXYtPm9yaWdfaGFzaF9sb2NrLCBmbGFncyk7Ci0Jb3JpZ19ub2RlID0gKChzdHJ1Y3Qgb3JpZ19ub2RlICopaGFzaF9maW5kKGJhdF9wcml2LT5vcmlnX2hhc2gsCi0JCQkJCQkgICBpY21wX3BhY2tldC0+ZHN0KSk7Ci0KLQlpZiAoIW9yaWdfbm9kZSkKLQkJZ290byB1bmxvY2s7Ci0KLQlpZiAoIW9yaWdfbm9kZS0+cm91dGVyKQotCQlnb3RvIHVubG9jazsKLQotCWJhdG1hbl9pZiA9IG9yaWdfbm9kZS0+cm91dGVyLT5pZl9pbmNvbWluZzsKLQltZW1jcHkoZHN0YWRkciwgb3JpZ19ub2RlLT5yb3V0ZXItPmFkZHIsIEVUSF9BTEVOKTsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJhdF9wcml2LT5vcmlnX2hhc2hfbG9jaywgZmxhZ3MpOwotCi0JaWYgKCFiYXRtYW5faWYpCi0JCWdvdG8gZHN0X3VucmVhY2g7Ci0KLQlpZiAoYmF0bWFuX2lmLT5pZl9zdGF0dXMgIT0gSUZfQUNUSVZFKQotCQlnb3RvIGRzdF91bnJlYWNoOwotCi0JbWVtY3B5KGljbXBfcGFja2V0LT5vcmlnLAotCSAgICAgICBiYXRfcHJpdi0+cHJpbWFyeV9pZi0+bmV0X2Rldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKTsKLQotCWlmIChwYWNrZXRfbGVuID09IHNpemVvZihzdHJ1Y3QgaWNtcF9wYWNrZXRfcnIpKQotCQltZW1jcHkoaWNtcF9wYWNrZXQtPnJyLCBiYXRtYW5faWYtPm5ldF9kZXYtPmRldl9hZGRyLCBFVEhfQUxFTik7Ci0KLQotCXNlbmRfc2tiX3BhY2tldChza2IsIGJhdG1hbl9pZiwgZHN0YWRkcik7Ci0KLQlnb3RvIG91dDsKLQotdW5sb2NrOgotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJhdF9wcml2LT5vcmlnX2hhc2hfbG9jaywgZmxhZ3MpOwotZHN0X3VucmVhY2g6Ci0JaWNtcF9wYWNrZXQtPm1zZ190eXBlID0gREVTVElOQVRJT05fVU5SRUFDSEFCTEU7Ci0JYmF0X3NvY2tldF9hZGRfcGFja2V0KHNvY2tldF9jbGllbnQsIGljbXBfcGFja2V0LCBwYWNrZXRfbGVuKTsKLWZyZWVfc2tiOgotCWtmcmVlX3NrYihza2IpOwotb3V0OgotCXJldHVybiBsZW47Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgYmF0X3NvY2tldF9wb2xsKHN0cnVjdCBmaWxlICpmaWxlLCBwb2xsX3RhYmxlICp3YWl0KQotewotCXN0cnVjdCBzb2NrZXRfY2xpZW50ICpzb2NrZXRfY2xpZW50ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCi0JcG9sbF93YWl0KGZpbGUsICZzb2NrZXRfY2xpZW50LT5xdWV1ZV93YWl0LCB3YWl0KTsKLQotCWlmIChzb2NrZXRfY2xpZW50LT5xdWV1ZV9sZW4gPiAwKQotCQlyZXR1cm4gUE9MTElOIHwgUE9MTFJETk9STTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBmb3BzID0gewotCS5vd25lciA9IFRISVNfTU9EVUxFLAotCS5vcGVuID0gYmF0X3NvY2tldF9vcGVuLAotCS5yZWxlYXNlID0gYmF0X3NvY2tldF9yZWxlYXNlLAotCS5yZWFkID0gYmF0X3NvY2tldF9yZWFkLAotCS53cml0ZSA9IGJhdF9zb2NrZXRfd3JpdGUsCi0JLnBvbGwgPSBiYXRfc29ja2V0X3BvbGwsCi0JLmxsc2VlayA9IG5vX2xsc2VlaywKLX07Ci0KLWludCBiYXRfc29ja2V0X3NldHVwKHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYpCi17Ci0Jc3RydWN0IGRlbnRyeSAqZDsKLQotCWlmICghYmF0X3ByaXYtPmRlYnVnX2RpcikKLQkJZ290byBlcnI7Ci0KLQlkID0gZGVidWdmc19jcmVhdGVfZmlsZShJQ01QX1NPQ0tFVCwgU19JRlJFRyB8IFNfSVdVU1IgfCBTX0lSVVNSLAotCQkJCWJhdF9wcml2LT5kZWJ1Z19kaXIsIGJhdF9wcml2LCAmZm9wcyk7Ci0JaWYgKGQpCi0JCWdvdG8gZXJyOwotCi0JcmV0dXJuIDA7Ci0KLWVycjoKLQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIHZvaWQgYmF0X3NvY2tldF9hZGRfcGFja2V0KHN0cnVjdCBzb2NrZXRfY2xpZW50ICpzb2NrZXRfY2xpZW50LAotCQkJCSAgc3RydWN0IGljbXBfcGFja2V0X3JyICppY21wX3BhY2tldCwKLQkJCQkgIHNpemVfdCBpY21wX2xlbikKLXsKLQlzdHJ1Y3Qgc29ja2V0X3BhY2tldCAqc29ja2V0X3BhY2tldDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc29ja2V0X3BhY2tldCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBzb2NrZXRfcGFja2V0KSwgR0ZQX0FUT01JQyk7Ci0KLQlpZiAoIXNvY2tldF9wYWNrZXQpCi0JCXJldHVybjsKLQotCUlOSVRfTElTVF9IRUFEKCZzb2NrZXRfcGFja2V0LT5saXN0KTsKLQltZW1jcHkoJnNvY2tldF9wYWNrZXQtPmljbXBfcGFja2V0LCBpY21wX3BhY2tldCwgaWNtcF9sZW4pOwotCXNvY2tldF9wYWNrZXQtPmljbXBfbGVuID0gaWNtcF9sZW47Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmc29ja2V0X2NsaWVudC0+bG9jaywgZmxhZ3MpOwotCi0JLyogd2hpbGUgd2FpdGluZyBmb3IgdGhlIGxvY2sgdGhlIHNvY2tldF9jbGllbnQgY291bGQgaGF2ZSBiZWVuCi0JICogZGVsZXRlZCAqLwotCWlmICghc29ja2V0X2NsaWVudF9oYXNoW2ljbXBfcGFja2V0LT51aWRdKSB7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNvY2tldF9jbGllbnQtPmxvY2ssIGZsYWdzKTsKLQkJa2ZyZWUoc29ja2V0X3BhY2tldCk7Ci0JCXJldHVybjsKLQl9Ci0KLQlsaXN0X2FkZF90YWlsKCZzb2NrZXRfcGFja2V0LT5saXN0LCAmc29ja2V0X2NsaWVudC0+cXVldWVfbGlzdCk7Ci0Jc29ja2V0X2NsaWVudC0+cXVldWVfbGVuKys7Ci0KLQlpZiAoc29ja2V0X2NsaWVudC0+cXVldWVfbGVuID4gMTAwKSB7Ci0JCXNvY2tldF9wYWNrZXQgPSBsaXN0X2ZpcnN0X2VudHJ5KCZzb2NrZXRfY2xpZW50LT5xdWV1ZV9saXN0LAotCQkJCQkJIHN0cnVjdCBzb2NrZXRfcGFja2V0LCBsaXN0KTsKLQotCQlsaXN0X2RlbCgmc29ja2V0X3BhY2tldC0+bGlzdCk7Ci0JCWtmcmVlKHNvY2tldF9wYWNrZXQpOwotCQlzb2NrZXRfY2xpZW50LT5xdWV1ZV9sZW4tLTsKLQl9Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzb2NrZXRfY2xpZW50LT5sb2NrLCBmbGFncyk7Ci0KLQl3YWtlX3VwKCZzb2NrZXRfY2xpZW50LT5xdWV1ZV93YWl0KTsKLX0KLQotdm9pZCBiYXRfc29ja2V0X3JlY2VpdmVfcGFja2V0KHN0cnVjdCBpY21wX3BhY2tldF9yciAqaWNtcF9wYWNrZXQsCi0JCQkgICAgICAgc2l6ZV90IGljbXBfbGVuKQotewotCXN0cnVjdCBzb2NrZXRfY2xpZW50ICpoYXNoID0gc29ja2V0X2NsaWVudF9oYXNoW2ljbXBfcGFja2V0LT51aWRdOwotCi0JaWYgKGhhc2gpCi0JCWJhdF9zb2NrZXRfYWRkX3BhY2tldChoYXNoLCBpY21wX3BhY2tldCwgaWNtcF9sZW4pOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvaWNtcF9zb2NrZXQuaCBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L2ljbXBfc29ja2V0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmOWIzNDguLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvaWNtcF9zb2NrZXQuaAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBCLkEuVC5NLkEuTi4gY29udHJpYnV0b3JzOgotICoKLSAqIE1hcmVrIExpbmRuZXIKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKLSAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKLSAqIDAyMTEwLTEzMDEsIFVTQQotICoKLSAqLwotCi0jaWZuZGVmIF9ORVRfQkFUTUFOX0FEVl9JQ01QX1NPQ0tFVF9IXwotI2RlZmluZSBfTkVUX0JBVE1BTl9BRFZfSUNNUF9TT0NLRVRfSF8KLQotI2luY2x1ZGUgInR5cGVzLmgiCi0KLSNkZWZpbmUgSUNNUF9TT0NLRVQgInNvY2tldCIKLQotdm9pZCBiYXRfc29ja2V0X2luaXQodm9pZCk7Ci1pbnQgYmF0X3NvY2tldF9zZXR1cChzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2KTsKLXZvaWQgYmF0X3NvY2tldF9yZWNlaXZlX3BhY2tldChzdHJ1Y3QgaWNtcF9wYWNrZXRfcnIgKmljbXBfcGFja2V0LAotCQkJICAgICAgIHNpemVfdCBpY21wX2xlbik7Ci0KLSNlbmRpZiAvKiBfTkVUX0JBVE1BTl9BRFZfSUNNUF9TT0NLRVRfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L21haW4uYyBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L21haW4uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDU4Nzk0MC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9tYWluLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMTcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIEIuQS5ULk0uQS5OLiBjb250cmlidXRvcnM6Ci0gKgotICogTWFyZWsgTGluZG5lciwgU2ltb24gV3VuZGVybGljaAotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQotICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQotICogMDIxMTAtMTMwMSwgVVNBCi0gKgotICovCi0KLSNpbmNsdWRlICJtYWluLmgiCi0jaW5jbHVkZSAiYmF0X3N5c2ZzLmgiCi0jaW5jbHVkZSAiYmF0X2RlYnVnZnMuaCIKLSNpbmNsdWRlICJyb3V0aW5nLmgiCi0jaW5jbHVkZSAic2VuZC5oIgotI2luY2x1ZGUgIm9yaWdpbmF0b3IuaCIKLSNpbmNsdWRlICJzb2Z0LWludGVyZmFjZS5oIgotI2luY2x1ZGUgImljbXBfc29ja2V0LmgiCi0jaW5jbHVkZSAidHJhbnNsYXRpb24tdGFibGUuaCIKLSNpbmNsdWRlICJoYXJkLWludGVyZmFjZS5oIgotI2luY2x1ZGUgInR5cGVzLmgiCi0jaW5jbHVkZSAidmlzLmgiCi0jaW5jbHVkZSAiaGFzaC5oIgotCi1zdHJ1Y3QgbGlzdF9oZWFkIGlmX2xpc3Q7Ci0KLXVuc2lnbmVkIGNoYXIgYnJvYWRjYXN0X2FkZHJbXSA9IHsweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmfTsKLQotc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKmJhdF9ldmVudF93b3JrcXVldWU7Ci0KLXN0YXRpYyBpbnQgX19pbml0IGJhdG1hbl9pbml0KHZvaWQpCi17Ci0JSU5JVF9MSVNUX0hFQUQoJmlmX2xpc3QpOwotCi0JLyogdGhlIG5hbWUgc2hvdWxkIG5vdCBiZSBsb25nZXIgdGhhbiAxMCBjaGFycyAtIHNlZQotCSAqIGh0dHA6Ly9sd24ubmV0L0FydGljbGVzLzIzNjM0LyAqLwotCWJhdF9ldmVudF93b3JrcXVldWUgPSBjcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZSgiYmF0X2V2ZW50cyIpOwotCi0JaWYgKCFiYXRfZXZlbnRfd29ya3F1ZXVlKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWJhdF9zb2NrZXRfaW5pdCgpOwotCWRlYnVnZnNfaW5pdCgpOwotCi0JcmVnaXN0ZXJfbmV0ZGV2aWNlX25vdGlmaWVyKCZoYXJkX2lmX25vdGlmaWVyKTsKLQotCXByX2luZm8oIkIuQS5ULk0uQS5OLiBhZHZhbmNlZCAlcyVzIChjb21wYXRpYmlsaXR5IHZlcnNpb24gJWkpICIKLQkJImxvYWRlZFxuIiwgU09VUkNFX1ZFUlNJT04sIFJFVklTSU9OX1ZFUlNJT05fU1RSLAotCQlDT01QQVRfVkVSU0lPTik7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IGJhdG1hbl9leGl0KHZvaWQpCi17Ci0JZGVidWdmc19kZXN0cm95KCk7Ci0JdW5yZWdpc3Rlcl9uZXRkZXZpY2Vfbm90aWZpZXIoJmhhcmRfaWZfbm90aWZpZXIpOwotCWhhcmRpZl9yZW1vdmVfaW50ZXJmYWNlcygpOwotCi0JZmx1c2hfd29ya3F1ZXVlKGJhdF9ldmVudF93b3JrcXVldWUpOwotCWRlc3Ryb3lfd29ya3F1ZXVlKGJhdF9ldmVudF93b3JrcXVldWUpOwotCWJhdF9ldmVudF93b3JrcXVldWUgPSBOVUxMOwotCi0JcmN1X2JhcnJpZXIoKTsKLX0KLQotaW50IG1lc2hfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqc29mdF9pZmFjZSkKLXsKLQlzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2ID0gbmV0ZGV2X3ByaXYoc29mdF9pZmFjZSk7Ci0KLQlzcGluX2xvY2tfaW5pdCgmYmF0X3ByaXYtPm9yaWdfaGFzaF9sb2NrKTsKLQlzcGluX2xvY2tfaW5pdCgmYmF0X3ByaXYtPmZvcndfYmF0X2xpc3RfbG9jayk7Ci0Jc3Bpbl9sb2NrX2luaXQoJmJhdF9wcml2LT5mb3J3X2JjYXN0X2xpc3RfbG9jayk7Ci0Jc3Bpbl9sb2NrX2luaXQoJmJhdF9wcml2LT5obmFfbGhhc2hfbG9jayk7Ci0Jc3Bpbl9sb2NrX2luaXQoJmJhdF9wcml2LT5obmFfZ2hhc2hfbG9jayk7Ci0Jc3Bpbl9sb2NrX2luaXQoJmJhdF9wcml2LT52aXNfaGFzaF9sb2NrKTsKLQlzcGluX2xvY2tfaW5pdCgmYmF0X3ByaXYtPnZpc19saXN0X2xvY2spOwotCi0JSU5JVF9ITElTVF9IRUFEKCZiYXRfcHJpdi0+Zm9yd19iYXRfbGlzdCk7Ci0JSU5JVF9ITElTVF9IRUFEKCZiYXRfcHJpdi0+Zm9yd19iY2FzdF9saXN0KTsKLQotCWlmIChvcmlnaW5hdG9yX2luaXQoYmF0X3ByaXYpIDwgMSkKLQkJZ290byBlcnI7Ci0KLQlpZiAoaG5hX2xvY2FsX2luaXQoYmF0X3ByaXYpIDwgMSkKLQkJZ290byBlcnI7Ci0KLQlpZiAoaG5hX2dsb2JhbF9pbml0KGJhdF9wcml2KSA8IDEpCi0JCWdvdG8gZXJyOwotCi0JaG5hX2xvY2FsX2FkZChzb2Z0X2lmYWNlLCBzb2Z0X2lmYWNlLT5kZXZfYWRkcik7Ci0KLQlpZiAodmlzX2luaXQoYmF0X3ByaXYpIDwgMSkKLQkJZ290byBlcnI7Ci0KLQlhdG9taWNfc2V0KCZiYXRfcHJpdi0+bWVzaF9zdGF0ZSwgTUVTSF9BQ1RJVkUpOwotCWdvdG8gZW5kOwotCi1lcnI6Ci0JcHJfZXJyKCJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBtZXNoIGluZm9ybWF0aW9uIHN0cnVjdHVyZXM6ICIKLQkgICAgICAgIm91dCBvZiBtZW0gP1xuIik7Ci0JbWVzaF9mcmVlKHNvZnRfaWZhY2UpOwotCXJldHVybiAtMTsKLQotZW5kOgotCXJldHVybiAwOwotfQotCi12b2lkIG1lc2hfZnJlZShzdHJ1Y3QgbmV0X2RldmljZSAqc29mdF9pZmFjZSkKLXsKLQlzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2ID0gbmV0ZGV2X3ByaXYoc29mdF9pZmFjZSk7Ci0KLQlhdG9taWNfc2V0KCZiYXRfcHJpdi0+bWVzaF9zdGF0ZSwgTUVTSF9ERUFDVElWQVRJTkcpOwotCi0JcHVyZ2Vfb3V0c3RhbmRpbmdfcGFja2V0cyhiYXRfcHJpdiwgTlVMTCk7Ci0KLQl2aXNfcXVpdChiYXRfcHJpdik7Ci0KLQlvcmlnaW5hdG9yX2ZyZWUoYmF0X3ByaXYpOwotCi0JaG5hX2xvY2FsX2ZyZWUoYmF0X3ByaXYpOwotCWhuYV9nbG9iYWxfZnJlZShiYXRfcHJpdik7Ci0KLQlhdG9taWNfc2V0KCZiYXRfcHJpdi0+bWVzaF9zdGF0ZSwgTUVTSF9JTkFDVElWRSk7Ci19Ci0KLXZvaWQgaW5jX21vZHVsZV9jb3VudCh2b2lkKQotewotCXRyeV9tb2R1bGVfZ2V0KFRISVNfTU9EVUxFKTsKLX0KLQotdm9pZCBkZWNfbW9kdWxlX2NvdW50KHZvaWQpCi17Ci0JbW9kdWxlX3B1dChUSElTX01PRFVMRSk7Ci19Ci0KLS8qIHJldHVybnMgMSBpZiB0aGV5IGFyZSB0aGUgc2FtZSBvcmlnaW5hdG9yICovCi0KLWludCBjb21wYXJlX29yaWcodm9pZCAqZGF0YTEsIHZvaWQgKmRhdGEyKQotewotCXJldHVybiAobWVtY21wKGRhdGExLCBkYXRhMiwgRVRIX0FMRU4pID09IDAgPyAxIDogMCk7Ci19Ci0KLS8qIGhhc2hmdW5jdGlvbiB0byBjaG9vc2UgYW4gZW50cnkgaW4gYSBoYXNoIHRhYmxlIG9mIGdpdmVuIHNpemUgKi8KLS8qIGhhc2ggYWxnb3JpdGhtIGZyb20gaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9IYXNoX3RhYmxlICovCi1pbnQgY2hvb3NlX29yaWcodm9pZCAqZGF0YSwgaW50MzJfdCBzaXplKQotewotCXVuc2lnbmVkIGNoYXIgKmtleSA9IGRhdGE7Ci0JdWludDMyX3QgaGFzaCA9IDA7Ci0Jc2l6ZV90IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKSB7Ci0JCWhhc2ggKz0ga2V5W2ldOwotCQloYXNoICs9IChoYXNoIDw8IDEwKTsKLQkJaGFzaCBePSAoaGFzaCA+PiA2KTsKLQl9Ci0KLQloYXNoICs9IChoYXNoIDw8IDMpOwotCWhhc2ggXj0gKGhhc2ggPj4gMTEpOwotCWhhc2ggKz0gKGhhc2ggPDwgMTUpOwotCi0JcmV0dXJuIGhhc2ggJSBzaXplOwotfQotCi1pbnQgaXNfbXlfbWFjKHVpbnQ4X3QgKmFkZHIpCi17Ci0Jc3RydWN0IGJhdG1hbl9pZiAqYmF0bWFuX2lmOwotCi0JcmN1X3JlYWRfbG9jaygpOwotCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGJhdG1hbl9pZiwgJmlmX2xpc3QsIGxpc3QpIHsKLQkJaWYgKGJhdG1hbl9pZi0+aWZfc3RhdHVzICE9IElGX0FDVElWRSkKLQkJCWNvbnRpbnVlOwotCi0JCWlmIChjb21wYXJlX29yaWcoYmF0bWFuX2lmLT5uZXRfZGV2LT5kZXZfYWRkciwgYWRkcikpIHsKLQkJCXJjdV9yZWFkX3VubG9jaygpOwotCQkJcmV0dXJuIDE7Ci0JCX0KLQl9Ci0JcmN1X3JlYWRfdW5sb2NrKCk7Ci0JcmV0dXJuIDA7Ci0KLX0KLQotaW50IGlzX2JjYXN0KHVpbnQ4X3QgKmFkZHIpCi17Ci0JcmV0dXJuIChhZGRyWzBdID09ICh1aW50OF90KTB4ZmYpICYmIChhZGRyWzFdID09ICh1aW50OF90KTB4ZmYpOwotfQotCi1pbnQgaXNfbWNhc3QodWludDhfdCAqYWRkcikKLXsKLQlyZXR1cm4gKmFkZHIgJiAweDAxOwotfQotCi1tb2R1bGVfaW5pdChiYXRtYW5faW5pdCk7Ci1tb2R1bGVfZXhpdChiYXRtYW5fZXhpdCk7Ci0KLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLQotTU9EVUxFX0FVVEhPUihEUklWRVJfQVVUSE9SKTsKLU1PRFVMRV9ERVNDUklQVElPTihEUklWRVJfREVTQyk7Ci1NT0RVTEVfU1VQUE9SVEVEX0RFVklDRShEUklWRVJfREVWSUNFKTsKLSNpZmRlZiBSRVZJU0lPTl9WRVJTSU9OCi1NT0RVTEVfVkVSU0lPTihTT1VSQ0VfVkVSU0lPTiAiLSIgUkVWSVNJT05fVkVSU0lPTik7Ci0jZWxzZQotTU9EVUxFX1ZFUlNJT04oU09VUkNFX1ZFUlNJT04pOwotI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9tYWluLmggYi9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9tYWluLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlM2Y1MTYuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvbWFpbi5oCisrKyAvZGV2L251bGwKQEAgLTEsMTgzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBCLkEuVC5NLkEuTi4gY29udHJpYnV0b3JzOgotICoKLSAqIE1hcmVrIExpbmRuZXIsIFNpbW9uIFd1bmRlcmxpY2gKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKLSAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKLSAqIDAyMTEwLTEzMDEsIFVTQQotICoKLSAqLwotCi0jaWZuZGVmIF9ORVRfQkFUTUFOX0FEVl9NQUlOX0hfCi0jZGVmaW5lIF9ORVRfQkFUTUFOX0FEVl9NQUlOX0hfCi0KLS8qIEtlcm5lbCBQcm9ncmFtbWluZyAqLwotI2RlZmluZSBMSU5VWAotCi0jZGVmaW5lIERSSVZFUl9BVVRIT1IgIk1hcmVrIExpbmRuZXIgPGxpbmRuZXJfbWFyZWtAeWFob28uZGU+LCAiIFwKLQkJICAgICAgIlNpbW9uIFd1bmRlcmxpY2ggPHNpd3VAaHJ6LnR1LWNoZW1uaXR6LmRlPiIKLSNkZWZpbmUgRFJJVkVSX0RFU0MgICAiQi5BLlQuTS5BLk4uIGFkdmFuY2VkIgotI2RlZmluZSBEUklWRVJfREVWSUNFICJiYXRtYW4tYWR2IgotCi0jZGVmaW5lIFNPVVJDRV9WRVJTSU9OICJuZXh0IgotCi0KLS8qIEIuQS5ULk0uQS5OLiBwYXJhbWV0ZXJzICovCi0KLSNkZWZpbmUgVFFfTUFYX1ZBTFVFIDI1NQotI2RlZmluZSBKSVRURVIgMjAKLSNkZWZpbmUgVFRMIDUwCQkJICAvKiBUaW1lIFRvIExpdmUgb2YgYnJvYWRjYXN0IG1lc3NhZ2VzICovCi0KLSNkZWZpbmUgUFVSR0VfVElNRU9VVCAyMDAJLyogcHVyZ2Ugb3JpZ2luYXRvcnMgYWZ0ZXIgdGltZSBpbiBzZWNvbmRzIGlmIG5vCi0JCQkJICAgKiB2YWxpZCBwYWNrZXQgY29tZXMgaW4gLT4gVE9ETzogY2hlY2sKLQkJCQkgICAqIGluZmx1ZW5jZSBvbiBUUV9MT0NBTF9XSU5ET1dfU0laRSAqLwotI2RlZmluZSBMT0NBTF9ITkFfVElNRU9VVCAzNjAwIC8qIGluIHNlY29uZHMgKi8KLQotI2RlZmluZSBUUV9MT0NBTF9XSU5ET1dfU0laRSA2NAkgIC8qIHNsaWRpbmcgcGFja2V0IHJhbmdlIG9mIHJlY2VpdmVkIG9yaWdpbmF0b3IKLQkJCQkgICAqIG1lc3NhZ2VzIGluIHNxdWVuY2UgbnVtYmVycyAoc2hvdWxkIGJlIGEKLQkJCQkgICAqIG11bHRpcGxlIG9mIG91ciB3b3JkIHNpemUpICovCi0jZGVmaW5lIFRRX0dMT0JBTF9XSU5ET1dfU0laRSA1Ci0jZGVmaW5lIFRRX0xPQ0FMX0JJRFJFQ1RfU0VORF9NSU5JTVVNIDEKLSNkZWZpbmUgVFFfTE9DQUxfQklEUkVDVF9SRUNWX01JTklNVU0gMQotI2RlZmluZSBUUV9UT1RBTF9CSURSRUNUX0xJTUlUIDEKLQotI2RlZmluZSBUUV9IT1BfUEVOQUxUWSAxMAotCi0jZGVmaW5lIE5VTV9XT1JEUyAoVFFfTE9DQUxfV0lORE9XX1NJWkUgLyBXT1JEX0JJVF9TSVpFKQotCi0jZGVmaW5lIFBBQ0tCVUZGX1NJWkUgMjAwMAotI2RlZmluZSBMT0dfQlVGX0xFTiA4MTkyCSAgLyogaGFzIHRvIGJlIGEgcG93ZXIgb2YgMiAqLwotCi0jZGVmaW5lIFZJU19JTlRFUlZBTCA1MDAwCS8qIDUgc2Vjb25kcyAqLwotCi0vKiBob3cgbXVjaCB3b3JzZSBzZWNvbmRhcnkgaW50ZXJmYWNlcyBtYXkgYmUgdG8KLSAqIHRvIGJlIGNvbnNpZGVyZWQgYXMgYm9uZGluZyBjYW5kaWRhdGVzICovCi0KLSNkZWZpbmUgQk9ORElOR19UUV9USFJFU0hPTEQJNTAKLQotI2RlZmluZSBNQVhfQUdHUkVHQVRJT05fQllURVMgNTEyIC8qIHNob3VsZCBub3QgYmUgYmlnZ2VyIHRoYW4gNTEyIGJ5dGVzIG9yCi0JCQkJICAgKiBjaGFuZ2UgdGhlIHNpemUgb2YKLQkJCQkgICAqIGZvcndfcGFja2V0LT5kaXJlY3RfbGlua19mbGFncyAqLwotI2RlZmluZSBNQVhfQUdHUkVHQVRJT05fTVMgMTAwCi0KLSNkZWZpbmUgUkVTRVRfUFJPVEVDVElPTl9NUyAzMDAwMAotI2RlZmluZSBFWFBFQ1RFRF9TRVFOT19SQU5HRQk2NTUzNgotLyogZG9uJ3QgcmVzZXQgYWdhaW4gd2l0aGluIDMwIHNlY29uZHMgKi8KLQotI2RlZmluZSBNRVNIX0lOQUNUSVZFIDAKLSNkZWZpbmUgTUVTSF9BQ1RJVkUgMQotI2RlZmluZSBNRVNIX0RFQUNUSVZBVElORyAyCi0KLSNkZWZpbmUgQkNBU1RfUVVFVUVfTEVOCQkyNTYKLSNkZWZpbmUgQkFUTUFOX1FVRVVFX0xFTgkyNTYKLQotLyoKLSAqIERlYnVnIE1lc3NhZ2VzCi0gKi8KLSNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQgLyogQXBwZW5kICdiYXRtYW4tYWR2OiAnIGJlZm9yZQotCQkJCQkgICAgICoga2VybmVsIG1lc3NhZ2VzICovCi0KLSNkZWZpbmUgREJHX0JBVE1BTiAxCS8qIGFsbCBtZXNzYWdlcyByZWxhdGVkIHRvIHJvdXRpbmcgLyBmbG9vZGluZyAvCi0JCQkgKiBicm9hZGNhc3RpbmcgLyBldGMgKi8KLSNkZWZpbmUgREJHX1JPVVRFUyAyCS8qIHJvdXRlIG9yIGhuYSBhZGRlZCAvIGNoYW5nZWQgLyBkZWxldGVkICovCi0jZGVmaW5lIERCR19BTEwgMwotCi0jZGVmaW5lIExPR19CVUZfTEVOIDgxOTIgICAgICAgICAgLyogaGFzIHRvIGJlIGEgcG93ZXIgb2YgMiAqLwotCi0KLS8qCi0gKiAgVmlzCi0gKi8KLQotLyogI2RlZmluZSBWSVNfU1VCQ0xVU1RFUlNfRElTQUJMRUQgKi8KLQotLyoKLSAqIEtlcm5lbCBoZWFkZXJzCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CS8qIG11dGV4ICovCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CS8qIG5lZWRlZCBieSBhbGwgbW9kdWxlcyAqLwotI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgkvKiBuZXRkZXZpY2UgKi8KLSNpbmNsdWRlIDxsaW51eC9pZl9ldGhlci5oPgkvKiBldGhlcm5ldCBoZWFkZXIgKi8KLSNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CQkvKiBwb2xsX3RhYmxlICovCi0jaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgkvKiBrZXJuZWwgdGhyZWFkcyAqLwotI2luY2x1ZGUgPGxpbnV4L3BrdF9zY2hlZC5oPgkvKiBzY2hlZHVsZSB0eXBlcyAqLwotI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgkvKiB3b3JrcXVldWUgKi8KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bmV0L3NvY2suaD4JCS8qIHN0cnVjdCBzb2NrICovCi0jaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgotI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+Ci0jaW5jbHVkZSAidHlwZXMuaCIKLQotI2lmbmRlZiBSRVZJU0lPTl9WRVJTSU9OCi0jZGVmaW5lIFJFVklTSU9OX1ZFUlNJT05fU1RSICIiCi0jZWxzZQotI2RlZmluZSBSRVZJU0lPTl9WRVJTSU9OX1NUUiAiICJSRVZJU0lPTl9WRVJTSU9OCi0jZW5kaWYKLQotZXh0ZXJuIHN0cnVjdCBsaXN0X2hlYWQgaWZfbGlzdDsKLQotZXh0ZXJuIHVuc2lnbmVkIGNoYXIgYnJvYWRjYXN0X2FkZHJbXTsKLWV4dGVybiBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqYmF0X2V2ZW50X3dvcmtxdWV1ZTsKLQotaW50IG1lc2hfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqc29mdF9pZmFjZSk7Ci12b2lkIG1lc2hfZnJlZShzdHJ1Y3QgbmV0X2RldmljZSAqc29mdF9pZmFjZSk7Ci12b2lkIGluY19tb2R1bGVfY291bnQodm9pZCk7Ci12b2lkIGRlY19tb2R1bGVfY291bnQodm9pZCk7Ci1pbnQgY29tcGFyZV9vcmlnKHZvaWQgKmRhdGExLCB2b2lkICpkYXRhMik7Ci1pbnQgY2hvb3NlX29yaWcodm9pZCAqZGF0YSwgaW50MzJfdCBzaXplKTsKLWludCBpc19teV9tYWModWludDhfdCAqYWRkcik7Ci1pbnQgaXNfYmNhc3QodWludDhfdCAqYWRkcik7Ci1pbnQgaXNfbWNhc3QodWludDhfdCAqYWRkcik7Ci0KLSNpZmRlZiBDT05GSUdfQkFUTUFOX0FEVl9ERUJVRwotaW50IGRlYnVnX2xvZyhzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2LCBjaGFyICpmbXQsIC4uLik7Ci0KLSNkZWZpbmUgYmF0X2RiZyh0eXBlLCBiYXRfcHJpdiwgZm10LCBhcmcuLi4pCQkJXAotCWRvIHsJCQkJCQkJXAotCQlpZiAoYXRvbWljX3JlYWQoJmJhdF9wcml2LT5sb2dfbGV2ZWwpICYgdHlwZSkJXAotCQkJZGVidWdfbG9nKGJhdF9wcml2LCBmbXQsICMjIGFyZyk7CVwKLQl9CQkJCQkJCVwKLQl3aGlsZSAoMCkKLSNlbHNlIC8qICFDT05GSUdfQkFUTUFOX0FEVl9ERUJVRyAqLwotc3RhdGljIGlubGluZSB2b2lkIGJhdF9kYmcoY2hhciB0eXBlIF9fYXR0cmlidXRlX18oKHVudXNlZCkpLAotCQkJICAgc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSwKLQkJCSAgIGNoYXIgKmZtdCBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSwgLi4uKQotewotfQotI2VuZGlmCi0KLSNkZWZpbmUgYmF0X3dhcm5pbmcobmV0X2RldiwgZm10LCBhcmcuLi4pCQkJCVwKLQlkbyB7CQkJCQkJCQlcCi0JCXN0cnVjdCBuZXRfZGV2aWNlICpfbmV0ZGV2ID0gKG5ldF9kZXYpOyAgICAgICAgICAgICAgICAgXAotCQlzdHJ1Y3QgYmF0X3ByaXYgKl9iYXRwcml2ID0gbmV0ZGV2X3ByaXYoX25ldGRldik7ICAgICAgIFwKLQkJYmF0X2RiZyhEQkdfQUxMLCBfYmF0cHJpdiwgZm10LCAjIyBhcmcpOwkJXAotCQlwcl93YXJuaW5nKCIlczogIiBmbXQsIF9uZXRkZXYtPm5hbWUsICMjIGFyZyk7CQlcCi0JfSB3aGlsZSAoMCkKLSNkZWZpbmUgYmF0X2luZm8obmV0X2RldiwgZm10LCBhcmcuLi4pCQkJCQlcCi0JZG8gewkJCQkJCQkJXAotCQlzdHJ1Y3QgbmV0X2RldmljZSAqX25ldGRldiA9IChuZXRfZGV2KTsgICAgICAgICAgICAgICAgIFwKLQkJc3RydWN0IGJhdF9wcml2ICpfYmF0cHJpdiA9IG5ldGRldl9wcml2KF9uZXRkZXYpOyAgICAgICBcCi0JCWJhdF9kYmcoREJHX0FMTCwgX2JhdHByaXYsIGZtdCwgIyMgYXJnKTsJCVwKLQkJcHJfaW5mbygiJXM6ICIgZm10LCBfbmV0ZGV2LT5uYW1lLCAjIyBhcmcpOwkJXAotCX0gd2hpbGUgKDApCi0jZGVmaW5lIGJhdF9lcnIobmV0X2RldiwgZm10LCBhcmcuLi4pCQkJCQlcCi0JZG8gewkJCQkJCQkJXAotCQlzdHJ1Y3QgbmV0X2RldmljZSAqX25ldGRldiA9IChuZXRfZGV2KTsgICAgICAgICAgICAgICAgIFwKLQkJc3RydWN0IGJhdF9wcml2ICpfYmF0cHJpdiA9IG5ldGRldl9wcml2KF9uZXRkZXYpOyAgICAgICBcCi0JCWJhdF9kYmcoREJHX0FMTCwgX2JhdHByaXYsIGZtdCwgIyMgYXJnKTsJCVwKLQkJcHJfZXJyKCIlczogIiBmbXQsIF9uZXRkZXYtPm5hbWUsICMjIGFyZyk7CQlcCi0JfSB3aGlsZSAoMCkKLQotI2VuZGlmIC8qIF9ORVRfQkFUTUFOX0FEVl9NQUlOX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9vcmlnaW5hdG9yLmMgYi9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9vcmlnaW5hdG9yLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1MjcwMDguLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvb3JpZ2luYXRvci5jCisrKyAvZGV2L251bGwKQEAgLTEsNTMzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDktMjAxMCBCLkEuVC5NLkEuTi4gY29udHJpYnV0b3JzOgotICoKLSAqIE1hcmVrIExpbmRuZXIsIFNpbW9uIFd1bmRlcmxpY2gKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKLSAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKLSAqIDAyMTEwLTEzMDEsIFVTQQotICoKLSAqLwotCi0vKiBpbmNyZWFzZSB0aGUgcmVmZXJlbmNlIGNvdW50ZXIgZm9yIHRoaXMgb3JpZ2luYXRvciAqLwotCi0jaW5jbHVkZSAibWFpbi5oIgotI2luY2x1ZGUgIm9yaWdpbmF0b3IuaCIKLSNpbmNsdWRlICJoYXNoLmgiCi0jaW5jbHVkZSAidHJhbnNsYXRpb24tdGFibGUuaCIKLSNpbmNsdWRlICJyb3V0aW5nLmgiCi0jaW5jbHVkZSAiaGFyZC1pbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJ1bmljYXN0LmgiCi0KLXN0YXRpYyB2b2lkIHB1cmdlX29yaWcoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKLQotc3RhdGljIHZvaWQgc3RhcnRfcHVyZ2VfdGltZXIoc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdikKLXsKLQlJTklUX0RFTEFZRURfV09SSygmYmF0X3ByaXYtPm9yaWdfd29yaywgcHVyZ2Vfb3JpZyk7Ci0JcXVldWVfZGVsYXllZF93b3JrKGJhdF9ldmVudF93b3JrcXVldWUsICZiYXRfcHJpdi0+b3JpZ193b3JrLCAxICogSFopOwotfQotCi1pbnQgb3JpZ2luYXRvcl9pbml0KHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpZiAoYmF0X3ByaXYtPm9yaWdfaGFzaCkKLQkJcmV0dXJuIDE7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYmF0X3ByaXYtPm9yaWdfaGFzaF9sb2NrLCBmbGFncyk7Ci0JYmF0X3ByaXYtPm9yaWdfaGFzaCA9IGhhc2hfbmV3KDEyOCwgY29tcGFyZV9vcmlnLCBjaG9vc2Vfb3JpZyk7Ci0KLQlpZiAoIWJhdF9wcml2LT5vcmlnX2hhc2gpCi0JCWdvdG8gZXJyOwotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmF0X3ByaXYtPm9yaWdfaGFzaF9sb2NrLCBmbGFncyk7Ci0Jc3RhcnRfcHVyZ2VfdGltZXIoYmF0X3ByaXYpOwotCXJldHVybiAxOwotCi1lcnI6Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmF0X3ByaXYtPm9yaWdfaGFzaF9sb2NrLCBmbGFncyk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0cnVjdCBuZWlnaF9ub2RlICoKLWNyZWF0ZV9uZWlnaGJvcihzdHJ1Y3Qgb3JpZ19ub2RlICpvcmlnX25vZGUsIHN0cnVjdCBvcmlnX25vZGUgKm9yaWdfbmVpZ2hfbm9kZSwKLQkJdWludDhfdCAqbmVpZ2gsIHN0cnVjdCBiYXRtYW5faWYgKmlmX2luY29taW5nKQotewotCXN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYgPSBuZXRkZXZfcHJpdihpZl9pbmNvbWluZy0+c29mdF9pZmFjZSk7Ci0Jc3RydWN0IG5laWdoX25vZGUgKm5laWdoX25vZGU7Ci0KLQliYXRfZGJnKERCR19CQVRNQU4sIGJhdF9wcml2LAotCQkiQ3JlYXRpbmcgbmV3IGxhc3QtaG9wIG5laWdoYm9yIG9mIG9yaWdpbmF0b3JcbiIpOwotCi0JbmVpZ2hfbm9kZSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBuZWlnaF9ub2RlKSwgR0ZQX0FUT01JQyk7Ci0JaWYgKCFuZWlnaF9ub2RlKQotCQlyZXR1cm4gTlVMTDsKLQotCUlOSVRfTElTVF9IRUFEKCZuZWlnaF9ub2RlLT5saXN0KTsKLQotCW1lbWNweShuZWlnaF9ub2RlLT5hZGRyLCBuZWlnaCwgRVRIX0FMRU4pOwotCW5laWdoX25vZGUtPm9yaWdfbm9kZSA9IG9yaWdfbmVpZ2hfbm9kZTsKLQluZWlnaF9ub2RlLT5pZl9pbmNvbWluZyA9IGlmX2luY29taW5nOwotCi0JbGlzdF9hZGRfdGFpbCgmbmVpZ2hfbm9kZS0+bGlzdCwgJm9yaWdfbm9kZS0+bmVpZ2hfbGlzdCk7Ci0JcmV0dXJuIG5laWdoX25vZGU7Ci19Ci0KLXN0YXRpYyB2b2lkIGZyZWVfb3JpZ19ub2RlKHZvaWQgKmRhdGEsIHZvaWQgKmFyZykKLXsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0X3BvcywgKmxpc3RfcG9zX3RtcDsKLQlzdHJ1Y3QgbmVpZ2hfbm9kZSAqbmVpZ2hfbm9kZTsKLQlzdHJ1Y3Qgb3JpZ19ub2RlICpvcmlnX25vZGUgPSAoc3RydWN0IG9yaWdfbm9kZSAqKWRhdGE7Ci0Jc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiA9IChzdHJ1Y3QgYmF0X3ByaXYgKilhcmc7Ci0KLQkvKiBmb3IgYWxsIG5laWdoYm9ycyB0b3dhcmRzIHRoaXMgb3JpZ2luYXRvciAuLi4gKi8KLQlsaXN0X2Zvcl9lYWNoX3NhZmUobGlzdF9wb3MsIGxpc3RfcG9zX3RtcCwgJm9yaWdfbm9kZS0+bmVpZ2hfbGlzdCkgewotCQluZWlnaF9ub2RlID0gbGlzdF9lbnRyeShsaXN0X3Bvcywgc3RydWN0IG5laWdoX25vZGUsIGxpc3QpOwotCi0JCWxpc3RfZGVsKGxpc3RfcG9zKTsKLQkJa2ZyZWUobmVpZ2hfbm9kZSk7Ci0JfQotCi0JZnJhZ19saXN0X2ZyZWUoJm9yaWdfbm9kZS0+ZnJhZ19saXN0KTsKLQlobmFfZ2xvYmFsX2RlbF9vcmlnKGJhdF9wcml2LCBvcmlnX25vZGUsICJvcmlnaW5hdG9yIHRpbWVkIG91dCIpOwotCi0Ja2ZyZWUob3JpZ19ub2RlLT5iY2FzdF9vd24pOwotCWtmcmVlKG9yaWdfbm9kZS0+YmNhc3Rfb3duX3N1bSk7Ci0Ja2ZyZWUob3JpZ19ub2RlKTsKLX0KLQotdm9pZCBvcmlnaW5hdG9yX2ZyZWUoc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdikKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JaWYgKCFiYXRfcHJpdi0+b3JpZ19oYXNoKQotCQlyZXR1cm47Ci0KLQljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJmJhdF9wcml2LT5vcmlnX3dvcmspOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmJhdF9wcml2LT5vcmlnX2hhc2hfbG9jaywgZmxhZ3MpOwotCWhhc2hfZGVsZXRlKGJhdF9wcml2LT5vcmlnX2hhc2gsIGZyZWVfb3JpZ19ub2RlLCBiYXRfcHJpdik7Ci0JYmF0X3ByaXYtPm9yaWdfaGFzaCA9IE5VTEw7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmF0X3ByaXYtPm9yaWdfaGFzaF9sb2NrLCBmbGFncyk7Ci19Ci0KLS8qIHRoaXMgZnVuY3Rpb24gZmluZHMgb3IgY3JlYXRlcyBhbiBvcmlnaW5hdG9yIGVudHJ5IGZvciB0aGUgZ2l2ZW4KLSAqIGFkZHJlc3MgaWYgaXQgZG9lcyBub3QgZXhpdHMgKi8KLXN0cnVjdCBvcmlnX25vZGUgKmdldF9vcmlnX25vZGUoc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiwgdWludDhfdCAqYWRkcikKLXsKLQlzdHJ1Y3Qgb3JpZ19ub2RlICpvcmlnX25vZGU7Ci0Jc3RydWN0IGhhc2h0YWJsZV90ICpzd2FwaGFzaDsKLQlpbnQgc2l6ZTsKLQotCW9yaWdfbm9kZSA9ICgoc3RydWN0IG9yaWdfbm9kZSAqKWhhc2hfZmluZChiYXRfcHJpdi0+b3JpZ19oYXNoLCBhZGRyKSk7Ci0KLQlpZiAob3JpZ19ub2RlKQotCQlyZXR1cm4gb3JpZ19ub2RlOwotCi0JYmF0X2RiZyhEQkdfQkFUTUFOLCBiYXRfcHJpdiwKLQkJIkNyZWF0aW5nIG5ldyBvcmlnaW5hdG9yOiAlcE1cbiIsIGFkZHIpOwotCi0Jb3JpZ19ub2RlID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG9yaWdfbm9kZSksIEdGUF9BVE9NSUMpOwotCWlmICghb3JpZ19ub2RlKQotCQlyZXR1cm4gTlVMTDsKLQotCUlOSVRfTElTVF9IRUFEKCZvcmlnX25vZGUtPm5laWdoX2xpc3QpOwotCi0JbWVtY3B5KG9yaWdfbm9kZS0+b3JpZywgYWRkciwgRVRIX0FMRU4pOwotCW9yaWdfbm9kZS0+cm91dGVyID0gTlVMTDsKLQlvcmlnX25vZGUtPmhuYV9idWZmID0gTlVMTDsKLQlvcmlnX25vZGUtPmJjYXN0X3NlcW5vX3Jlc2V0ID0gamlmZmllcyAtIDEKLQkJCQkJLSBtc2Vjc190b19qaWZmaWVzKFJFU0VUX1BST1RFQ1RJT05fTVMpOwotCW9yaWdfbm9kZS0+YmF0bWFuX3NlcW5vX3Jlc2V0ID0gamlmZmllcyAtIDEKLQkJCQkJLSBtc2Vjc190b19qaWZmaWVzKFJFU0VUX1BST1RFQ1RJT05fTVMpOwotCi0Jc2l6ZSA9IGJhdF9wcml2LT5udW1faWZhY2VzICogc2l6ZW9mKFRZUEVfT0ZfV09SRCkgKiBOVU1fV09SRFM7Ci0KLQlvcmlnX25vZGUtPmJjYXN0X293biA9IGt6YWxsb2Moc2l6ZSwgR0ZQX0FUT01JQyk7Ci0JaWYgKCFvcmlnX25vZGUtPmJjYXN0X293bikKLQkJZ290byBmcmVlX29yaWdfbm9kZTsKLQotCXNpemUgPSBiYXRfcHJpdi0+bnVtX2lmYWNlcyAqIHNpemVvZih1aW50OF90KTsKLQlvcmlnX25vZGUtPmJjYXN0X293bl9zdW0gPSBremFsbG9jKHNpemUsIEdGUF9BVE9NSUMpOwotCi0JSU5JVF9MSVNUX0hFQUQoJm9yaWdfbm9kZS0+ZnJhZ19saXN0KTsKLQlvcmlnX25vZGUtPmxhc3RfZnJhZ19wYWNrZXQgPSAwOwotCi0JaWYgKCFvcmlnX25vZGUtPmJjYXN0X293bl9zdW0pCi0JCWdvdG8gZnJlZV9iY2FzdF9vd247Ci0KLQlpZiAoaGFzaF9hZGQoYmF0X3ByaXYtPm9yaWdfaGFzaCwgb3JpZ19ub2RlKSA8IDApCi0JCWdvdG8gZnJlZV9iY2FzdF9vd25fc3VtOwotCi0JaWYgKGJhdF9wcml2LT5vcmlnX2hhc2gtPmVsZW1lbnRzICogNCA+IGJhdF9wcml2LT5vcmlnX2hhc2gtPnNpemUpIHsKLQkJc3dhcGhhc2ggPSBoYXNoX3Jlc2l6ZShiYXRfcHJpdi0+b3JpZ19oYXNoLAotCQkJCSAgICAgICBiYXRfcHJpdi0+b3JpZ19oYXNoLT5zaXplICogMik7Ci0KLQkJaWYgKCFzd2FwaGFzaCkKLQkJCWJhdF9kYmcoREJHX0JBVE1BTiwgYmF0X3ByaXYsCi0JCQkJIkNvdWxkbid0IHJlc2l6ZSBvcmlnIGhhc2ggdGFibGVcbiIpOwotCQllbHNlCi0JCQliYXRfcHJpdi0+b3JpZ19oYXNoID0gc3dhcGhhc2g7Ci0JfQotCi0JcmV0dXJuIG9yaWdfbm9kZTsKLWZyZWVfYmNhc3Rfb3duX3N1bToKLQlrZnJlZShvcmlnX25vZGUtPmJjYXN0X293bl9zdW0pOwotZnJlZV9iY2FzdF9vd246Ci0Ja2ZyZWUob3JpZ19ub2RlLT5iY2FzdF9vd24pOwotZnJlZV9vcmlnX25vZGU6Ci0Ja2ZyZWUob3JpZ19ub2RlKTsKLQlyZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGJvb2wgcHVyZ2Vfb3JpZ19uZWlnaGJvcnMoc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiwKLQkJCQkgc3RydWN0IG9yaWdfbm9kZSAqb3JpZ19ub2RlLAotCQkJCSBzdHJ1Y3QgbmVpZ2hfbm9kZSAqKmJlc3RfbmVpZ2hfbm9kZSkKLXsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0X3BvcywgKmxpc3RfcG9zX3RtcDsKLQlzdHJ1Y3QgbmVpZ2hfbm9kZSAqbmVpZ2hfbm9kZTsKLQlib29sIG5laWdoX3B1cmdlZCA9IGZhbHNlOwotCi0JKmJlc3RfbmVpZ2hfbm9kZSA9IE5VTEw7Ci0KLQkvKiBmb3IgYWxsIG5laWdoYm9ycyB0b3dhcmRzIHRoaXMgb3JpZ2luYXRvciAuLi4gKi8KLQlsaXN0X2Zvcl9lYWNoX3NhZmUobGlzdF9wb3MsIGxpc3RfcG9zX3RtcCwgJm9yaWdfbm9kZS0+bmVpZ2hfbGlzdCkgewotCQluZWlnaF9ub2RlID0gbGlzdF9lbnRyeShsaXN0X3Bvcywgc3RydWN0IG5laWdoX25vZGUsIGxpc3QpOwotCi0JCWlmICgodGltZV9hZnRlcihqaWZmaWVzLAotCQkJbmVpZ2hfbm9kZS0+bGFzdF92YWxpZCArIFBVUkdFX1RJTUVPVVQgKiBIWikpIHx8Ci0JCSAgICAobmVpZ2hfbm9kZS0+aWZfaW5jb21pbmctPmlmX3N0YXR1cyA9PSBJRl9JTkFDVElWRSkgfHwKLQkJICAgIChuZWlnaF9ub2RlLT5pZl9pbmNvbWluZy0+aWZfc3RhdHVzID09IElGX1RPX0JFX1JFTU9WRUQpKSB7Ci0KLQkJCWlmIChuZWlnaF9ub2RlLT5pZl9pbmNvbWluZy0+aWZfc3RhdHVzID09Ci0JCQkJCQkJSUZfVE9fQkVfUkVNT1ZFRCkKLQkJCQliYXRfZGJnKERCR19CQVRNQU4sIGJhdF9wcml2LAotCQkJCQkibmVpZ2hib3IgcHVyZ2U6IG9yaWdpbmF0b3IgJXBNLCAiCi0JCQkJCSJuZWlnaGJvcjogJXBNLCBpZmFjZTogJXNcbiIsCi0JCQkJCW9yaWdfbm9kZS0+b3JpZywgbmVpZ2hfbm9kZS0+YWRkciwKLQkJCQkJbmVpZ2hfbm9kZS0+aWZfaW5jb21pbmctPm5ldF9kZXYtPm5hbWUpOwotCQkJZWxzZQotCQkJCWJhdF9kYmcoREJHX0JBVE1BTiwgYmF0X3ByaXYsCi0JCQkJCSJuZWlnaGJvciB0aW1lb3V0OiBvcmlnaW5hdG9yICVwTSwgIgotCQkJCQkibmVpZ2hib3I6ICVwTSwgbGFzdF92YWxpZDogJWx1XG4iLAotCQkJCQlvcmlnX25vZGUtPm9yaWcsIG5laWdoX25vZGUtPmFkZHIsCi0JCQkJCShuZWlnaF9ub2RlLT5sYXN0X3ZhbGlkIC8gSFopKTsKLQotCQkJbmVpZ2hfcHVyZ2VkID0gdHJ1ZTsKLQkJCWxpc3RfZGVsKGxpc3RfcG9zKTsKLQkJCWtmcmVlKG5laWdoX25vZGUpOwotCQl9IGVsc2UgewotCQkJaWYgKCgqYmVzdF9uZWlnaF9ub2RlID09IE5VTEwpIHx8Ci0JCQkgICAgKG5laWdoX25vZGUtPnRxX2F2ZyA+ICgqYmVzdF9uZWlnaF9ub2RlKS0+dHFfYXZnKSkKLQkJCQkqYmVzdF9uZWlnaF9ub2RlID0gbmVpZ2hfbm9kZTsKLQkJfQotCX0KLQlyZXR1cm4gbmVpZ2hfcHVyZ2VkOwotfQotCi1zdGF0aWMgYm9vbCBwdXJnZV9vcmlnX25vZGUoc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiwKLQkJCSAgICBzdHJ1Y3Qgb3JpZ19ub2RlICpvcmlnX25vZGUpCi17Ci0Jc3RydWN0IG5laWdoX25vZGUgKmJlc3RfbmVpZ2hfbm9kZTsKLQotCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsCi0JCW9yaWdfbm9kZS0+bGFzdF92YWxpZCArIDIgKiBQVVJHRV9USU1FT1VUICogSFopKSB7Ci0KLQkJYmF0X2RiZyhEQkdfQkFUTUFOLCBiYXRfcHJpdiwKLQkJCSJPcmlnaW5hdG9yIHRpbWVvdXQ6IG9yaWdpbmF0b3IgJXBNLCBsYXN0X3ZhbGlkICVsdVxuIiwKLQkJCW9yaWdfbm9kZS0+b3JpZywgKG9yaWdfbm9kZS0+bGFzdF92YWxpZCAvIEhaKSk7Ci0JCXJldHVybiB0cnVlOwotCX0gZWxzZSB7Ci0JCWlmIChwdXJnZV9vcmlnX25laWdoYm9ycyhiYXRfcHJpdiwgb3JpZ19ub2RlLAotCQkJCQkJCSZiZXN0X25laWdoX25vZGUpKSB7Ci0JCQl1cGRhdGVfcm91dGVzKGJhdF9wcml2LCBvcmlnX25vZGUsCi0JCQkJICAgICAgYmVzdF9uZWlnaF9ub2RlLAotCQkJCSAgICAgIG9yaWdfbm9kZS0+aG5hX2J1ZmYsCi0JCQkJICAgICAgb3JpZ19ub2RlLT5obmFfYnVmZl9sZW4pOwotCQkJLyogdXBkYXRlIGJvbmRpbmcgY2FuZGlkYXRlcywgd2UgY291bGQgaGF2ZSBsb3N0Ci0JCQkgKiBzb21lIGNhbmRpZGF0ZXMuICovCi0JCQl1cGRhdGVfYm9uZGluZ19jYW5kaWRhdGVzKGJhdF9wcml2LCBvcmlnX25vZGUpOwotCQl9Ci0JfQotCi0JcmV0dXJuIGZhbHNlOwotfQotCi1zdGF0aWMgdm9pZCBfcHVyZ2Vfb3JpZyhzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2KQotewotCUhBU0hJVChoYXNoaXQpOwotCXN0cnVjdCBvcmlnX25vZGUgKm9yaWdfbm9kZTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmJhdF9wcml2LT5vcmlnX2hhc2hfbG9jaywgZmxhZ3MpOwotCi0JLyogZm9yIGFsbCBvcmlnaW5zLi4uICovCi0Jd2hpbGUgKGhhc2hfaXRlcmF0ZShiYXRfcHJpdi0+b3JpZ19oYXNoLCAmaGFzaGl0KSkgewotCQlvcmlnX25vZGUgPSBoYXNoaXQuYnVja2V0LT5kYXRhOwotCi0JCWlmIChwdXJnZV9vcmlnX25vZGUoYmF0X3ByaXYsIG9yaWdfbm9kZSkpIHsKLQkJCWhhc2hfcmVtb3ZlX2J1Y2tldChiYXRfcHJpdi0+b3JpZ19oYXNoLCAmaGFzaGl0KTsKLQkJCWZyZWVfb3JpZ19ub2RlKG9yaWdfbm9kZSwgYmF0X3ByaXYpOwotCQl9Ci0KLQkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgKG9yaWdfbm9kZS0+bGFzdF9mcmFnX3BhY2tldCArCi0JCQkJCW1zZWNzX3RvX2ppZmZpZXMoRlJBR19USU1FT1VUKSkpKQotCQkJZnJhZ19saXN0X2ZyZWUoJm9yaWdfbm9kZS0+ZnJhZ19saXN0KTsKLQl9Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiYXRfcHJpdi0+b3JpZ19oYXNoX2xvY2ssIGZsYWdzKTsKLQotfQotCi1zdGF0aWMgdm9pZCBwdXJnZV9vcmlnKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKLXsKLQlzdHJ1Y3QgZGVsYXllZF93b3JrICpkZWxheWVkX3dvcmsgPQotCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IGRlbGF5ZWRfd29yaywgd29yayk7Ci0Jc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiA9Ci0JCWNvbnRhaW5lcl9vZihkZWxheWVkX3dvcmssIHN0cnVjdCBiYXRfcHJpdiwgb3JpZ193b3JrKTsKLQotCV9wdXJnZV9vcmlnKGJhdF9wcml2KTsKLQlzdGFydF9wdXJnZV90aW1lcihiYXRfcHJpdik7Ci19Ci0KLXZvaWQgcHVyZ2Vfb3JpZ19yZWYoc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdikKLXsKLQlfcHVyZ2Vfb3JpZyhiYXRfcHJpdik7Ci19Ci0KLWludCBvcmlnX3NlcV9wcmludF90ZXh0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICpvZmZzZXQpCi17Ci0JSEFTSElUKGhhc2hpdCk7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilzZXEtPnByaXZhdGU7Ci0Jc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiA9IG5ldGRldl9wcml2KG5ldF9kZXYpOwotCXN0cnVjdCBvcmlnX25vZGUgKm9yaWdfbm9kZTsKLQlzdHJ1Y3QgbmVpZ2hfbm9kZSAqbmVpZ2hfbm9kZTsKLQlpbnQgYmF0bWFuX2NvdW50ID0gMDsKLQlpbnQgbGFzdF9zZWVuX3NlY3M7Ci0JaW50IGxhc3Rfc2Vlbl9tc2VjczsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JaWYgKCghYmF0X3ByaXYtPnByaW1hcnlfaWYpIHx8Ci0JICAgIChiYXRfcHJpdi0+cHJpbWFyeV9pZi0+aWZfc3RhdHVzICE9IElGX0FDVElWRSkpIHsKLQkJaWYgKCFiYXRfcHJpdi0+cHJpbWFyeV9pZikKLQkJCXJldHVybiBzZXFfcHJpbnRmKHNlcSwgIkJBVE1BTiBtZXNoICVzIGRpc2FibGVkIC0gIgotCQkJCSAgICAgInBsZWFzZSBzcGVjaWZ5IGludGVyZmFjZXMgdG8gZW5hYmxlIGl0XG4iLAotCQkJCSAgICAgbmV0X2Rldi0+bmFtZSk7Ci0KLQkJcmV0dXJuIHNlcV9wcmludGYoc2VxLCAiQkFUTUFOIG1lc2ggJXMgIgotCQkJCSAgImRpc2FibGVkIC0gcHJpbWFyeSBpbnRlcmZhY2Ugbm90IGFjdGl2ZVxuIiwKLQkJCQkgIG5ldF9kZXYtPm5hbWUpOwotCX0KLQotCXNlcV9wcmludGYoc2VxLCAiW0IuQS5ULk0uQS5OLiBhZHYgJXMlcywgTWFpbklGL01BQzogJXMvJXBNICglcyldXG4iLAotCQkgICBTT1VSQ0VfVkVSU0lPTiwgUkVWSVNJT05fVkVSU0lPTl9TVFIsCi0JCSAgIGJhdF9wcml2LT5wcmltYXJ5X2lmLT5uZXRfZGV2LT5uYW1lLAotCQkgICBiYXRfcHJpdi0+cHJpbWFyeV9pZi0+bmV0X2Rldi0+ZGV2X2FkZHIsIG5ldF9kZXYtPm5hbWUpOwotCXNlcV9wcmludGYoc2VxLCAiICAlLTE1cyAlcyAoJXMvJWkpICUxN3MgWyUxMHNdOiAlMjBzIC4uLlxuIiwKLQkJICAgIk9yaWdpbmF0b3IiLCAibGFzdC1zZWVuIiwgIiMiLCBUUV9NQVhfVkFMVUUsICJOZXh0aG9wIiwKLQkJICAgIm91dGdvaW5nSUYiLCAiUG90ZW50aWFsIG5leHRob3BzIik7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYmF0X3ByaXYtPm9yaWdfaGFzaF9sb2NrLCBmbGFncyk7Ci0KLQl3aGlsZSAoaGFzaF9pdGVyYXRlKGJhdF9wcml2LT5vcmlnX2hhc2gsICZoYXNoaXQpKSB7Ci0KLQkJb3JpZ19ub2RlID0gaGFzaGl0LmJ1Y2tldC0+ZGF0YTsKLQotCQlpZiAoIW9yaWdfbm9kZS0+cm91dGVyKQotCQkJY29udGludWU7Ci0KLQkJaWYgKG9yaWdfbm9kZS0+cm91dGVyLT50cV9hdmcgPT0gMCkKLQkJCWNvbnRpbnVlOwotCi0JCWxhc3Rfc2Vlbl9zZWNzID0gamlmZmllc190b19tc2VjcyhqaWZmaWVzIC0KLQkJCQkJCW9yaWdfbm9kZS0+bGFzdF92YWxpZCkgLyAxMDAwOwotCQlsYXN0X3NlZW5fbXNlY3MgPSBqaWZmaWVzX3RvX21zZWNzKGppZmZpZXMgLQotCQkJCQkJb3JpZ19ub2RlLT5sYXN0X3ZhbGlkKSAlIDEwMDA7Ci0KLQkJc2VxX3ByaW50ZihzZXEsICIlcE0gJTRpLiUwM2lzICAgKCUzaSkgJXBNIFslMTBzXToiLAotCQkJICAgb3JpZ19ub2RlLT5vcmlnLCBsYXN0X3NlZW5fc2VjcywgbGFzdF9zZWVuX21zZWNzLAotCQkJICAgb3JpZ19ub2RlLT5yb3V0ZXItPnRxX2F2Zywgb3JpZ19ub2RlLT5yb3V0ZXItPmFkZHIsCi0JCQkgICBvcmlnX25vZGUtPnJvdXRlci0+aWZfaW5jb21pbmctPm5ldF9kZXYtPm5hbWUpOwotCi0JCWxpc3RfZm9yX2VhY2hfZW50cnkobmVpZ2hfbm9kZSwgJm9yaWdfbm9kZS0+bmVpZ2hfbGlzdCwgbGlzdCkgewotCQkJc2VxX3ByaW50ZihzZXEsICIgJXBNICglM2kpIiwgbmVpZ2hfbm9kZS0+YWRkciwKLQkJCQkJICAgbmVpZ2hfbm9kZS0+dHFfYXZnKTsKLQkJfQotCi0JCXNlcV9wcmludGYoc2VxLCAiXG4iKTsKLQkJYmF0bWFuX2NvdW50Kys7Ci0JfQotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmF0X3ByaXYtPm9yaWdfaGFzaF9sb2NrLCBmbGFncyk7Ci0KLQlpZiAoKGJhdG1hbl9jb3VudCA9PSAwKSkKLQkJc2VxX3ByaW50ZihzZXEsICJObyBiYXRtYW4gbm9kZXMgaW4gcmFuZ2UgLi4uXG4iKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG9yaWdfbm9kZV9hZGRfaWYoc3RydWN0IG9yaWdfbm9kZSAqb3JpZ19ub2RlLCBpbnQgbWF4X2lmX251bSkKLXsKLQl2b2lkICpkYXRhX3B0cjsKLQotCWRhdGFfcHRyID0ga21hbGxvYyhtYXhfaWZfbnVtICogc2l6ZW9mKFRZUEVfT0ZfV09SRCkgKiBOVU1fV09SRFMsCi0JCQkgICBHRlBfQVRPTUlDKTsKLQlpZiAoIWRhdGFfcHRyKSB7Ci0JCXByX2VycigiQ2FuJ3QgcmVzaXplIG9yaWc6IG91dCBvZiBtZW1vcnlcbiIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JbWVtY3B5KGRhdGFfcHRyLCBvcmlnX25vZGUtPmJjYXN0X293biwKLQkgICAgICAgKG1heF9pZl9udW0gLSAxKSAqIHNpemVvZihUWVBFX09GX1dPUkQpICogTlVNX1dPUkRTKTsKLQlrZnJlZShvcmlnX25vZGUtPmJjYXN0X293bik7Ci0Jb3JpZ19ub2RlLT5iY2FzdF9vd24gPSBkYXRhX3B0cjsKLQotCWRhdGFfcHRyID0ga21hbGxvYyhtYXhfaWZfbnVtICogc2l6ZW9mKHVpbnQ4X3QpLCBHRlBfQVRPTUlDKTsKLQlpZiAoIWRhdGFfcHRyKSB7Ci0JCXByX2VycigiQ2FuJ3QgcmVzaXplIG9yaWc6IG91dCBvZiBtZW1vcnlcbiIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JbWVtY3B5KGRhdGFfcHRyLCBvcmlnX25vZGUtPmJjYXN0X293bl9zdW0sCi0JICAgICAgIChtYXhfaWZfbnVtIC0gMSkgKiBzaXplb2YodWludDhfdCkpOwotCWtmcmVlKG9yaWdfbm9kZS0+YmNhc3Rfb3duX3N1bSk7Ci0Jb3JpZ19ub2RlLT5iY2FzdF9vd25fc3VtID0gZGF0YV9wdHI7Ci0KLQlyZXR1cm4gMDsKLX0KLQotaW50IG9yaWdfaGFzaF9hZGRfaWYoc3RydWN0IGJhdG1hbl9pZiAqYmF0bWFuX2lmLCBpbnQgbWF4X2lmX251bSkKLXsKLQlzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2ID0gbmV0ZGV2X3ByaXYoYmF0bWFuX2lmLT5zb2Z0X2lmYWNlKTsKLQlzdHJ1Y3Qgb3JpZ19ub2RlICpvcmlnX25vZGU7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlIQVNISVQoaGFzaGl0KTsKLQotCS8qIHJlc2l6ZSBhbGwgb3JpZyBub2RlcyBiZWNhdXNlIG9yaWdfbm9kZS0+YmNhc3Rfb3duKF9zdW0pIGRlcGVuZCBvbgotCSAqIGlmX251bSAqLwotCXNwaW5fbG9ja19pcnFzYXZlKCZiYXRfcHJpdi0+b3JpZ19oYXNoX2xvY2ssIGZsYWdzKTsKLQotCXdoaWxlIChoYXNoX2l0ZXJhdGUoYmF0X3ByaXYtPm9yaWdfaGFzaCwgJmhhc2hpdCkpIHsKLQkJb3JpZ19ub2RlID0gaGFzaGl0LmJ1Y2tldC0+ZGF0YTsKLQotCQlpZiAob3JpZ19ub2RlX2FkZF9pZihvcmlnX25vZGUsIG1heF9pZl9udW0pID09IC0xKQotCQkJZ290byBlcnI7Ci0JfQotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmF0X3ByaXYtPm9yaWdfaGFzaF9sb2NrLCBmbGFncyk7Ci0JcmV0dXJuIDA7Ci0KLWVycjoKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiYXRfcHJpdi0+b3JpZ19oYXNoX2xvY2ssIGZsYWdzKTsKLQlyZXR1cm4gLUVOT01FTTsKLX0KLQotc3RhdGljIGludCBvcmlnX25vZGVfZGVsX2lmKHN0cnVjdCBvcmlnX25vZGUgKm9yaWdfbm9kZSwKLQkJICAgICBpbnQgbWF4X2lmX251bSwgaW50IGRlbF9pZl9udW0pCi17Ci0Jdm9pZCAqZGF0YV9wdHIgPSBOVUxMOwotCWludCBjaHVua19zaXplOwotCi0JLyogbGFzdCBpbnRlcmZhY2Ugd2FzIHJlbW92ZWQgKi8KLQlpZiAobWF4X2lmX251bSA9PSAwKQotCQlnb3RvIGZyZWVfYmNhc3Rfb3duOwotCi0JY2h1bmtfc2l6ZSA9IHNpemVvZihUWVBFX09GX1dPUkQpICogTlVNX1dPUkRTOwotCWRhdGFfcHRyID0ga21hbGxvYyhtYXhfaWZfbnVtICogY2h1bmtfc2l6ZSwgR0ZQX0FUT01JQyk7Ci0JaWYgKCFkYXRhX3B0cikgewotCQlwcl9lcnIoIkNhbid0IHJlc2l6ZSBvcmlnOiBvdXQgb2YgbWVtb3J5XG4iKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qIGNvcHkgZmlyc3QgcGFydCAqLwotCW1lbWNweShkYXRhX3B0ciwgb3JpZ19ub2RlLT5iY2FzdF9vd24sIGRlbF9pZl9udW0gKiBjaHVua19zaXplKTsKLQotCS8qIGNvcHkgc2Vjb25kIHBhcnQgKi8KLQltZW1jcHkoZGF0YV9wdHIgKyBkZWxfaWZfbnVtICogY2h1bmtfc2l6ZSwKLQkgICAgICAgb3JpZ19ub2RlLT5iY2FzdF9vd24gKyAoKGRlbF9pZl9udW0gKyAxKSAqIGNodW5rX3NpemUpLAotCSAgICAgICAobWF4X2lmX251bSAtIGRlbF9pZl9udW0pICogY2h1bmtfc2l6ZSk7Ci0KLWZyZWVfYmNhc3Rfb3duOgotCWtmcmVlKG9yaWdfbm9kZS0+YmNhc3Rfb3duKTsKLQlvcmlnX25vZGUtPmJjYXN0X293biA9IGRhdGFfcHRyOwotCi0JaWYgKG1heF9pZl9udW0gPT0gMCkKLQkJZ290byBmcmVlX293bl9zdW07Ci0KLQlkYXRhX3B0ciA9IGttYWxsb2MobWF4X2lmX251bSAqIHNpemVvZih1aW50OF90KSwgR0ZQX0FUT01JQyk7Ci0JaWYgKCFkYXRhX3B0cikgewotCQlwcl9lcnIoIkNhbid0IHJlc2l6ZSBvcmlnOiBvdXQgb2YgbWVtb3J5XG4iKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCW1lbWNweShkYXRhX3B0ciwgb3JpZ19ub2RlLT5iY2FzdF9vd25fc3VtLAotCSAgICAgICBkZWxfaWZfbnVtICogc2l6ZW9mKHVpbnQ4X3QpKTsKLQotCW1lbWNweShkYXRhX3B0ciArIGRlbF9pZl9udW0gKiBzaXplb2YodWludDhfdCksCi0JICAgICAgIG9yaWdfbm9kZS0+YmNhc3Rfb3duX3N1bSArICgoZGVsX2lmX251bSArIDEpICogc2l6ZW9mKHVpbnQ4X3QpKSwKLQkgICAgICAgKG1heF9pZl9udW0gLSBkZWxfaWZfbnVtKSAqIHNpemVvZih1aW50OF90KSk7Ci0KLWZyZWVfb3duX3N1bToKLQlrZnJlZShvcmlnX25vZGUtPmJjYXN0X293bl9zdW0pOwotCW9yaWdfbm9kZS0+YmNhc3Rfb3duX3N1bSA9IGRhdGFfcHRyOwotCi0JcmV0dXJuIDA7Ci19Ci0KLWludCBvcmlnX2hhc2hfZGVsX2lmKHN0cnVjdCBiYXRtYW5faWYgKmJhdG1hbl9pZiwgaW50IG1heF9pZl9udW0pCi17Ci0Jc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiA9IG5ldGRldl9wcml2KGJhdG1hbl9pZi0+c29mdF9pZmFjZSk7Ci0Jc3RydWN0IGJhdG1hbl9pZiAqYmF0bWFuX2lmX3RtcDsKLQlzdHJ1Y3Qgb3JpZ19ub2RlICpvcmlnX25vZGU7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlIQVNISVQoaGFzaGl0KTsKLQlpbnQgcmV0OwotCi0JLyogcmVzaXplIGFsbCBvcmlnIG5vZGVzIGJlY2F1c2Ugb3JpZ19ub2RlLT5iY2FzdF9vd24oX3N1bSkgZGVwZW5kIG9uCi0JICogaWZfbnVtICovCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmJhdF9wcml2LT5vcmlnX2hhc2hfbG9jaywgZmxhZ3MpOwotCi0Jd2hpbGUgKGhhc2hfaXRlcmF0ZShiYXRfcHJpdi0+b3JpZ19oYXNoLCAmaGFzaGl0KSkgewotCQlvcmlnX25vZGUgPSBoYXNoaXQuYnVja2V0LT5kYXRhOwotCi0JCXJldCA9IG9yaWdfbm9kZV9kZWxfaWYob3JpZ19ub2RlLCBtYXhfaWZfbnVtLAotCQkJCSAgICAgICBiYXRtYW5faWYtPmlmX251bSk7Ci0KLQkJaWYgKHJldCA9PSAtMSkKLQkJCWdvdG8gZXJyOwotCX0KLQotCS8qIHJlbnVtYmVyIHJlbWFpbmluZyBiYXRtYW4gaW50ZXJmYWNlcyBfaW5zaWRlXyBvZiBvcmlnX2hhc2hfbG9jayAqLwotCXJjdV9yZWFkX2xvY2soKTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShiYXRtYW5faWZfdG1wLCAmaWZfbGlzdCwgbGlzdCkgewotCQlpZiAoYmF0bWFuX2lmX3RtcC0+aWZfc3RhdHVzID09IElGX05PVF9JTl9VU0UpCi0JCQljb250aW51ZTsKLQotCQlpZiAoYmF0bWFuX2lmID09IGJhdG1hbl9pZl90bXApCi0JCQljb250aW51ZTsKLQotCQlpZiAoYmF0bWFuX2lmLT5zb2Z0X2lmYWNlICE9IGJhdG1hbl9pZl90bXAtPnNvZnRfaWZhY2UpCi0JCQljb250aW51ZTsKLQotCQlpZiAoYmF0bWFuX2lmX3RtcC0+aWZfbnVtID4gYmF0bWFuX2lmLT5pZl9udW0pCi0JCQliYXRtYW5faWZfdG1wLT5pZl9udW0tLTsKLQl9Ci0JcmN1X3JlYWRfdW5sb2NrKCk7Ci0KLQliYXRtYW5faWYtPmlmX251bSA9IC0xOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJhdF9wcml2LT5vcmlnX2hhc2hfbG9jaywgZmxhZ3MpOwotCXJldHVybiAwOwotCi1lcnI6Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmF0X3ByaXYtPm9yaWdfaGFzaF9sb2NrLCBmbGFncyk7Ci0JcmV0dXJuIC1FTk9NRU07Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9vcmlnaW5hdG9yLmggYi9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9vcmlnaW5hdG9yLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5N2M0MDA0Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L29yaWdpbmF0b3IuaAorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBCLkEuVC5NLkEuTi4gY29udHJpYnV0b3JzOgotICoKLSAqIE1hcmVrIExpbmRuZXIsIFNpbW9uIFd1bmRlcmxpY2gKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKLSAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKLSAqIDAyMTEwLTEzMDEsIFVTQQotICoKLSAqLwotCi0jaWZuZGVmIF9ORVRfQkFUTUFOX0FEVl9PUklHSU5BVE9SX0hfCi0jZGVmaW5lIF9ORVRfQkFUTUFOX0FEVl9PUklHSU5BVE9SX0hfCi0KLWludCBvcmlnaW5hdG9yX2luaXQoc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdik7Ci12b2lkIG9yaWdpbmF0b3JfZnJlZShzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2KTsKLXZvaWQgcHVyZ2Vfb3JpZ19yZWYoc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdik7Ci1zdHJ1Y3Qgb3JpZ19ub2RlICpnZXRfb3JpZ19ub2RlKHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYsIHVpbnQ4X3QgKmFkZHIpOwotc3RydWN0IG5laWdoX25vZGUgKgotY3JlYXRlX25laWdoYm9yKHN0cnVjdCBvcmlnX25vZGUgKm9yaWdfbm9kZSwgc3RydWN0IG9yaWdfbm9kZSAqb3JpZ19uZWlnaF9ub2RlLAotCQl1aW50OF90ICpuZWlnaCwgc3RydWN0IGJhdG1hbl9pZiAqaWZfaW5jb21pbmcpOwotaW50IG9yaWdfc2VxX3ByaW50X3RleHQoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKm9mZnNldCk7Ci1pbnQgb3JpZ19oYXNoX2FkZF9pZihzdHJ1Y3QgYmF0bWFuX2lmICpiYXRtYW5faWYsIGludCBtYXhfaWZfbnVtKTsKLWludCBvcmlnX2hhc2hfZGVsX2lmKHN0cnVjdCBiYXRtYW5faWYgKmJhdG1hbl9pZiwgaW50IG1heF9pZl9udW0pOwotCi0jZW5kaWYgLyogX05FVF9CQVRNQU5fQURWX09SSUdJTkFUT1JfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L3BhY2tldC5oIGIvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvcGFja2V0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2OTMzODMuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvcGFja2V0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMzQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIEIuQS5ULk0uQS5OLiBjb250cmlidXRvcnM6Ci0gKgotICogTWFyZWsgTGluZG5lciwgU2ltb24gV3VuZGVybGljaAotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQotICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQotICogMDIxMTAtMTMwMSwgVVNBCi0gKgotICovCi0KLSNpZm5kZWYgX05FVF9CQVRNQU5fQURWX1BBQ0tFVF9IXwotI2RlZmluZSBfTkVUX0JBVE1BTl9BRFZfUEFDS0VUX0hfCi0KLSNkZWZpbmUgRVRIX1BfQkFUTUFOICAweDQzMDUJLyogdW5vZmZpY2lhbC9ub3QgcmVnaXN0ZXJlZCBFdGhlcnR5cGUgKi8KLQotI2RlZmluZSBCQVRfUEFDS0VUICAgICAgIDB4MDEKLSNkZWZpbmUgQkFUX0lDTVAgICAgICAgICAweDAyCi0jZGVmaW5lIEJBVF9VTklDQVNUICAgICAgMHgwMwotI2RlZmluZSBCQVRfQkNBU1QgICAgICAgIDB4MDQKLSNkZWZpbmUgQkFUX1ZJUyAgICAgICAgICAweDA1Ci0jZGVmaW5lIEJBVF9VTklDQVNUX0ZSQUcgMHgwNgotCi0vKiB0aGlzIGZpbGUgaXMgaW5jbHVkZWQgYnkgYmF0Y3RsIHdoaWNoIG5lZWRzIHRoZXNlIGRlZmluZXMgKi8KLSNkZWZpbmUgQ09NUEFUX1ZFUlNJT04gMTMKLSNkZWZpbmUgRElSRUNUTElOSyAweDQwCi0jZGVmaW5lIFZJU19TRVJWRVIgMHgyMAotI2RlZmluZSBQUklNQVJJRVNfRklSU1RfSE9QIDB4MTAKLQotLyogSUNNUCBtZXNzYWdlIHR5cGVzICovCi0jZGVmaW5lIEVDSE9fUkVQTFkgMAotI2RlZmluZSBERVNUSU5BVElPTl9VTlJFQUNIQUJMRSAzCi0jZGVmaW5lIEVDSE9fUkVRVUVTVCA4Ci0jZGVmaW5lIFRUTF9FWENFRURFRCAxMQotI2RlZmluZSBQQVJBTUVURVJfUFJPQkxFTSAxMgotCi0vKiB2aXMgZGVmaW5lcyAqLwotI2RlZmluZSBWSVNfVFlQRV9TRVJWRVJfU1lOQwkJMAotI2RlZmluZSBWSVNfVFlQRV9DTElFTlRfVVBEQVRFCQkxCi0KLS8qIGZyYWdtZW50YXRpb24gZGVmaW5lcyAqLwotI2RlZmluZSBVTklfRlJBR19IRUFEIDB4MDEKLQotc3RydWN0IGJhdG1hbl9wYWNrZXQgewotCXVpbnQ4X3QgIHBhY2tldF90eXBlOwotCXVpbnQ4X3QgIHZlcnNpb247ICAvKiBiYXRtYW4gdmVyc2lvbiBmaWVsZCAqLwotCXVpbnQ4X3QgIGZsYWdzOyAgICAvKiAweDQwOiBESVJFQ1RMSU5LIGZsYWcsIDB4MjAgVklTX1NFUlZFUiBmbGFnLi4uICovCi0JdWludDhfdCAgdHE7Ci0JdWludDMyX3Qgc2Vxbm87Ci0JdWludDhfdCAgb3JpZ1s2XTsKLQl1aW50OF90ICBwcmV2X3NlbmRlcls2XTsKLQl1aW50OF90ICB0dGw7Ci0JdWludDhfdCAgbnVtX2huYTsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0KLSNkZWZpbmUgQkFUX1BBQ0tFVF9MRU4gc2l6ZW9mKHN0cnVjdCBiYXRtYW5fcGFja2V0KQotCi1zdHJ1Y3QgaWNtcF9wYWNrZXQgewotCXVpbnQ4X3QgIHBhY2tldF90eXBlOwotCXVpbnQ4X3QgIHZlcnNpb247ICAvKiBiYXRtYW4gdmVyc2lvbiBmaWVsZCAqLwotCXVpbnQ4X3QgIG1zZ190eXBlOyAvKiBzZWUgSUNNUCBtZXNzYWdlIHR5cGVzIGFib3ZlICovCi0JdWludDhfdCAgdHRsOwotCXVpbnQ4X3QgIGRzdFs2XTsKLQl1aW50OF90ICBvcmlnWzZdOwotCXVpbnQxNl90IHNlcW5vOwotCXVpbnQ4X3QgIHVpZDsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0KLSNkZWZpbmUgQkFUX1JSX0xFTiAxNgotCi0vKiBpY21wX3BhY2tldF9yciBtdXN0IHN0YXJ0IHdpdGggYWxsIGZpZWxkcyBmcm9tIGltY3BfcGFja2V0Ci0gKiBhcyB0aGlzIGlzIGFzc3VtZWQgYnkgY29kZSB0aGF0IGhhbmRsZXMgSUNNUCBwYWNrZXRzICovCi1zdHJ1Y3QgaWNtcF9wYWNrZXRfcnIgewotCXVpbnQ4X3QgIHBhY2tldF90eXBlOwotCXVpbnQ4X3QgIHZlcnNpb247ICAvKiBiYXRtYW4gdmVyc2lvbiBmaWVsZCAqLwotCXVpbnQ4X3QgIG1zZ190eXBlOyAvKiBzZWUgSUNNUCBtZXNzYWdlIHR5cGVzIGFib3ZlICovCi0JdWludDhfdCAgdHRsOwotCXVpbnQ4X3QgIGRzdFs2XTsKLQl1aW50OF90ICBvcmlnWzZdOwotCXVpbnQxNl90IHNlcW5vOwotCXVpbnQ4X3QgIHVpZDsKLQl1aW50OF90ICBycl9jdXI7Ci0JdWludDhfdCAgcnJbQkFUX1JSX0xFTl1bRVRIX0FMRU5dOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQotc3RydWN0IHVuaWNhc3RfcGFja2V0IHsKLQl1aW50OF90ICBwYWNrZXRfdHlwZTsKLQl1aW50OF90ICB2ZXJzaW9uOyAgLyogYmF0bWFuIHZlcnNpb24gZmllbGQgKi8KLQl1aW50OF90ICBkZXN0WzZdOwotCXVpbnQ4X3QgIHR0bDsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0KLXN0cnVjdCB1bmljYXN0X2ZyYWdfcGFja2V0IHsKLQl1aW50OF90ICBwYWNrZXRfdHlwZTsKLQl1aW50OF90ICB2ZXJzaW9uOyAgLyogYmF0bWFuIHZlcnNpb24gZmllbGQgKi8KLQl1aW50OF90ICBkZXN0WzZdOwotCXVpbnQ4X3QgIHR0bDsKLQl1aW50OF90ICBmbGFnczsKLQl1aW50OF90ICBvcmlnWzZdOwotCXVpbnQxNl90IHNlcW5vOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQotc3RydWN0IGJjYXN0X3BhY2tldCB7Ci0JdWludDhfdCAgcGFja2V0X3R5cGU7Ci0JdWludDhfdCAgdmVyc2lvbjsgIC8qIGJhdG1hbiB2ZXJzaW9uIGZpZWxkICovCi0JdWludDhfdCAgb3JpZ1s2XTsKLQl1aW50OF90ICB0dGw7Ci0JdWludDMyX3Qgc2Vxbm87Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotCi1zdHJ1Y3QgdmlzX3BhY2tldCB7Ci0JdWludDhfdCAgcGFja2V0X3R5cGU7Ci0JdWludDhfdCAgdmVyc2lvbjsgICAgICAgIC8qIGJhdG1hbiB2ZXJzaW9uIGZpZWxkICovCi0JdWludDhfdCAgdmlzX3R5cGU7CSAvKiB3aGljaCB0eXBlIG9mIHZpcy1wYXJ0aWNpcGFudCBzZW50IHRoaXM/ICovCi0JdWludDhfdCAgZW50cmllczsJIC8qIG51bWJlciBvZiBlbnRyaWVzIGJlaGluZCB0aGlzIHN0cnVjdCAqLwotCXVpbnQzMl90IHNlcW5vOwkJIC8qIHNlcXVlbmNlIG51bWJlciAqLwotCXVpbnQ4X3QgIHR0bDsJCSAvKiBUVEwgKi8KLQl1aW50OF90ICB2aXNfb3JpZ1s2XTsJIC8qIG9yaWdpbmF0b3IgdGhhdCBpbmZvcm1zIGFib3V0IGl0cwotCQkJCSAgKiBuZWlnaGJvcnMgKi8KLQl1aW50OF90ICB0YXJnZXRfb3JpZ1s2XTsgLyogd2hvIHNob3VsZCByZWNlaXZlIHRoaXMgcGFja2V0ICovCi0JdWludDhfdCAgc2VuZGVyX29yaWdbNl07IC8qIHdobyBzZW50IG9yIHJlYnJvYWRjYXN0ZWQgdGhpcyBwYWNrZXQgKi8KLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0KLSNlbmRpZiAvKiBfTkVUX0JBVE1BTl9BRFZfUEFDS0VUX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9yaW5nX2J1ZmZlci5jIGIvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvcmluZ19idWZmZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGVmZDM3Yy4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9yaW5nX2J1ZmZlci5jCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIEIuQS5ULk0uQS5OLiBjb250cmlidXRvcnM6Ci0gKgotICogTWFyZWsgTGluZG5lcgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQotICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQotICogMDIxMTAtMTMwMSwgVVNBCi0gKgotICovCi0KLSNpbmNsdWRlICJtYWluLmgiCi0jaW5jbHVkZSAicmluZ19idWZmZXIuaCIKLQotdm9pZCByaW5nX2J1ZmZlcl9zZXQodWludDhfdCBscV9yZWN2W10sIHVpbnQ4X3QgKmxxX2luZGV4LCB1aW50OF90IHZhbHVlKQotewotCWxxX3JlY3ZbKmxxX2luZGV4XSA9IHZhbHVlOwotCSpscV9pbmRleCA9ICgqbHFfaW5kZXggKyAxKSAlIFRRX0dMT0JBTF9XSU5ET1dfU0laRTsKLX0KLQotdWludDhfdCByaW5nX2J1ZmZlcl9hdmcodWludDhfdCBscV9yZWN2W10pCi17Ci0JdWludDhfdCAqcHRyOwotCXVpbnQxNl90IGNvdW50ID0gMCwgaSA9IDAsIHN1bSA9IDA7Ci0KLQlwdHIgPSBscV9yZWN2OwotCi0Jd2hpbGUgKGkgPCBUUV9HTE9CQUxfV0lORE9XX1NJWkUpIHsKLQkJaWYgKCpwdHIgIT0gMCkgewotCQkJY291bnQrKzsKLQkJCXN1bSArPSAqcHRyOwotCQl9Ci0KLQkJaSsrOwotCQlwdHIrKzsKLQl9Ci0KLQlpZiAoY291bnQgPT0gMCkKLQkJcmV0dXJuIDA7Ci0KLQlyZXR1cm4gKHVpbnQ4X3QpKHN1bSAvIGNvdW50KTsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L3JpbmdfYnVmZmVyLmggYi9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9yaW5nX2J1ZmZlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjBjYjlhYS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9yaW5nX2J1ZmZlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIEIuQS5ULk0uQS5OLiBjb250cmlidXRvcnM6Ci0gKgotICogTWFyZWsgTGluZG5lcgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQotICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQotICogMDIxMTAtMTMwMSwgVVNBCi0gKgotICovCi0KLSNpZm5kZWYgX05FVF9CQVRNQU5fQURWX1JJTkdfQlVGRkVSX0hfCi0jZGVmaW5lIF9ORVRfQkFUTUFOX0FEVl9SSU5HX0JVRkZFUl9IXwotCi12b2lkIHJpbmdfYnVmZmVyX3NldCh1aW50OF90IGxxX3JlY3ZbXSwgdWludDhfdCAqbHFfaW5kZXgsIHVpbnQ4X3QgdmFsdWUpOwotdWludDhfdCByaW5nX2J1ZmZlcl9hdmcodWludDhfdCBscV9yZWN2W10pOwotCi0jZW5kaWYgLyogX05FVF9CQVRNQU5fQURWX1JJTkdfQlVGRkVSX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9yb3V0aW5nLmMgYi9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9yb3V0aW5nLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1N2I2OWUuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvcm91dGluZy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTM4OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgQi5BLlQuTS5BLk4uIGNvbnRyaWJ1dG9yczoKLSAqCi0gKiBNYXJlayBMaW5kbmVyLCBTaW1vbiBXdW5kZXJsaWNoCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCi0gKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCi0gKiAwMjExMC0xMzAxLCBVU0EKLSAqCi0gKi8KLQotI2luY2x1ZGUgIm1haW4uaCIKLSNpbmNsdWRlICJyb3V0aW5nLmgiCi0jaW5jbHVkZSAic2VuZC5oIgotI2luY2x1ZGUgImhhc2guaCIKLSNpbmNsdWRlICJzb2Z0LWludGVyZmFjZS5oIgotI2luY2x1ZGUgImhhcmQtaW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAiaWNtcF9zb2NrZXQuaCIKLSNpbmNsdWRlICJ0cmFuc2xhdGlvbi10YWJsZS5oIgotI2luY2x1ZGUgIm9yaWdpbmF0b3IuaCIKLSNpbmNsdWRlICJ0eXBlcy5oIgotI2luY2x1ZGUgInJpbmdfYnVmZmVyLmgiCi0jaW5jbHVkZSAidmlzLmgiCi0jaW5jbHVkZSAiYWdncmVnYXRpb24uaCIKLSNpbmNsdWRlICJ1bmljYXN0LmgiCi0KLXZvaWQgc2xpZGVfb3duX2JjYXN0X3dpbmRvdyhzdHJ1Y3QgYmF0bWFuX2lmICpiYXRtYW5faWYpCi17Ci0Jc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiA9IG5ldGRldl9wcml2KGJhdG1hbl9pZi0+c29mdF9pZmFjZSk7Ci0JSEFTSElUKGhhc2hpdCk7Ci0Jc3RydWN0IG9yaWdfbm9kZSAqb3JpZ19ub2RlOwotCVRZUEVfT0ZfV09SRCAqd29yZDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmJhdF9wcml2LT5vcmlnX2hhc2hfbG9jaywgZmxhZ3MpOwotCi0Jd2hpbGUgKGhhc2hfaXRlcmF0ZShiYXRfcHJpdi0+b3JpZ19oYXNoLCAmaGFzaGl0KSkgewotCQlvcmlnX25vZGUgPSBoYXNoaXQuYnVja2V0LT5kYXRhOwotCQl3b3JkID0gJihvcmlnX25vZGUtPmJjYXN0X293bltiYXRtYW5faWYtPmlmX251bSAqIE5VTV9XT1JEU10pOwotCi0JCWJpdF9nZXRfcGFja2V0KGJhdF9wcml2LCB3b3JkLCAxLCAwKTsKLQkJb3JpZ19ub2RlLT5iY2FzdF9vd25fc3VtW2JhdG1hbl9pZi0+aWZfbnVtXSA9Ci0JCQliaXRfcGFja2V0X2NvdW50KHdvcmQpOwotCX0KLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJhdF9wcml2LT5vcmlnX2hhc2hfbG9jaywgZmxhZ3MpOwotfQotCi1zdGF0aWMgdm9pZCB1cGRhdGVfSE5BKHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYsIHN0cnVjdCBvcmlnX25vZGUgKm9yaWdfbm9kZSwKLQkJICAgICAgIHVuc2lnbmVkIGNoYXIgKmhuYV9idWZmLCBpbnQgaG5hX2J1ZmZfbGVuKQotewotCWlmICgoaG5hX2J1ZmZfbGVuICE9IG9yaWdfbm9kZS0+aG5hX2J1ZmZfbGVuKSB8fAotCSAgICAoKGhuYV9idWZmX2xlbiA+IDApICYmCi0JICAgICAob3JpZ19ub2RlLT5obmFfYnVmZl9sZW4gPiAwKSAmJgotCSAgICAgKG1lbWNtcChvcmlnX25vZGUtPmhuYV9idWZmLCBobmFfYnVmZiwgaG5hX2J1ZmZfbGVuKSAhPSAwKSkpIHsKLQotCQlpZiAob3JpZ19ub2RlLT5obmFfYnVmZl9sZW4gPiAwKQotCQkJaG5hX2dsb2JhbF9kZWxfb3JpZyhiYXRfcHJpdiwgb3JpZ19ub2RlLAotCQkJCQkgICAgIm9yaWdpbmF0b3IgY2hhbmdlZCBobmEiKTsKLQotCQlpZiAoKGhuYV9idWZmX2xlbiA+IDApICYmIChobmFfYnVmZiAhPSBOVUxMKSkKLQkJCWhuYV9nbG9iYWxfYWRkX29yaWcoYmF0X3ByaXYsIG9yaWdfbm9kZSwKLQkJCQkJICAgIGhuYV9idWZmLCBobmFfYnVmZl9sZW4pOwotCX0KLX0KLQotc3RhdGljIHZvaWQgdXBkYXRlX3JvdXRlKHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYsCi0JCQkgc3RydWN0IG9yaWdfbm9kZSAqb3JpZ19ub2RlLAotCQkJIHN0cnVjdCBuZWlnaF9ub2RlICpuZWlnaF9ub2RlLAotCQkJIHVuc2lnbmVkIGNoYXIgKmhuYV9idWZmLCBpbnQgaG5hX2J1ZmZfbGVuKQotewotCS8qIHJvdXRlIGRlbGV0ZWQgKi8KLQlpZiAoKG9yaWdfbm9kZS0+cm91dGVyICE9IE5VTEwpICYmIChuZWlnaF9ub2RlID09IE5VTEwpKSB7Ci0KLQkJYmF0X2RiZyhEQkdfUk9VVEVTLCBiYXRfcHJpdiwgIkRlbGV0aW5nIHJvdXRlIHRvd2FyZHM6ICVwTVxuIiwKLQkJCW9yaWdfbm9kZS0+b3JpZyk7Ci0JCWhuYV9nbG9iYWxfZGVsX29yaWcoYmF0X3ByaXYsIG9yaWdfbm9kZSwKLQkJCQkgICAgIm9yaWdpbmF0b3IgdGltZWQgb3V0Iik7Ci0KLQkJLyogcm91dGUgYWRkZWQgKi8KLQl9IGVsc2UgaWYgKChvcmlnX25vZGUtPnJvdXRlciA9PSBOVUxMKSAmJiAobmVpZ2hfbm9kZSAhPSBOVUxMKSkgewotCi0JCWJhdF9kYmcoREJHX1JPVVRFUywgYmF0X3ByaXYsCi0JCQkiQWRkaW5nIHJvdXRlIHRvd2FyZHM6ICVwTSAodmlhICVwTSlcbiIsCi0JCQlvcmlnX25vZGUtPm9yaWcsIG5laWdoX25vZGUtPmFkZHIpOwotCQlobmFfZ2xvYmFsX2FkZF9vcmlnKGJhdF9wcml2LCBvcmlnX25vZGUsCi0JCQkJICAgIGhuYV9idWZmLCBobmFfYnVmZl9sZW4pOwotCi0JCS8qIHJvdXRlIGNoYW5nZWQgKi8KLQl9IGVsc2UgewotCQliYXRfZGJnKERCR19ST1VURVMsIGJhdF9wcml2LAotCQkJIkNoYW5naW5nIHJvdXRlIHRvd2FyZHM6ICVwTSAiCi0JCQkiKG5vdyB2aWEgJXBNIC0gd2FzIHZpYSAlcE0pXG4iLAotCQkJb3JpZ19ub2RlLT5vcmlnLCBuZWlnaF9ub2RlLT5hZGRyLAotCQkJb3JpZ19ub2RlLT5yb3V0ZXItPmFkZHIpOwotCX0KLQotCW9yaWdfbm9kZS0+cm91dGVyID0gbmVpZ2hfbm9kZTsKLX0KLQotCi12b2lkIHVwZGF0ZV9yb3V0ZXMoc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiwgc3RydWN0IG9yaWdfbm9kZSAqb3JpZ19ub2RlLAotCQkgICBzdHJ1Y3QgbmVpZ2hfbm9kZSAqbmVpZ2hfbm9kZSwgdW5zaWduZWQgY2hhciAqaG5hX2J1ZmYsCi0JCSAgIGludCBobmFfYnVmZl9sZW4pCi17Ci0KLQlpZiAob3JpZ19ub2RlID09IE5VTEwpCi0JCXJldHVybjsKLQotCWlmIChvcmlnX25vZGUtPnJvdXRlciAhPSBuZWlnaF9ub2RlKQotCQl1cGRhdGVfcm91dGUoYmF0X3ByaXYsIG9yaWdfbm9kZSwgbmVpZ2hfbm9kZSwKLQkJCSAgICAgaG5hX2J1ZmYsIGhuYV9idWZmX2xlbik7Ci0JLyogbWF5IGJlIGp1c3QgSE5BIGNoYW5nZWQgKi8KLQllbHNlCi0JCXVwZGF0ZV9ITkEoYmF0X3ByaXYsIG9yaWdfbm9kZSwgaG5hX2J1ZmYsIGhuYV9idWZmX2xlbik7Ci19Ci0KLXN0YXRpYyBpbnQgaXNfYmlkaXJlY3Rpb25hbF9uZWlnaChzdHJ1Y3Qgb3JpZ19ub2RlICpvcmlnX25vZGUsCi0JCQkJc3RydWN0IG9yaWdfbm9kZSAqb3JpZ19uZWlnaF9ub2RlLAotCQkJCXN0cnVjdCBiYXRtYW5fcGFja2V0ICpiYXRtYW5fcGFja2V0LAotCQkJCXN0cnVjdCBiYXRtYW5faWYgKmlmX2luY29taW5nKQotewotCXN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYgPSBuZXRkZXZfcHJpdihpZl9pbmNvbWluZy0+c29mdF9pZmFjZSk7Ci0Jc3RydWN0IG5laWdoX25vZGUgKm5laWdoX25vZGUgPSBOVUxMLCAqdG1wX25laWdoX25vZGUgPSBOVUxMOwotCXVuc2lnbmVkIGNoYXIgdG90YWxfY291bnQ7Ci0KLQlpZiAob3JpZ19ub2RlID09IG9yaWdfbmVpZ2hfbm9kZSkgewotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHRtcF9uZWlnaF9ub2RlLAotCQkJCSAgICAmb3JpZ19ub2RlLT5uZWlnaF9saXN0LAotCQkJCSAgICBsaXN0KSB7Ci0KLQkJCWlmIChjb21wYXJlX29yaWcodG1wX25laWdoX25vZGUtPmFkZHIsCi0JCQkJCSBvcmlnX25laWdoX25vZGUtPm9yaWcpICYmCi0JCQkgICAgKHRtcF9uZWlnaF9ub2RlLT5pZl9pbmNvbWluZyA9PSBpZl9pbmNvbWluZykpCi0JCQkJbmVpZ2hfbm9kZSA9IHRtcF9uZWlnaF9ub2RlOwotCQl9Ci0KLQkJaWYgKCFuZWlnaF9ub2RlKQotCQkJbmVpZ2hfbm9kZSA9IGNyZWF0ZV9uZWlnaGJvcihvcmlnX25vZGUsCi0JCQkJCQkgICAgIG9yaWdfbmVpZ2hfbm9kZSwKLQkJCQkJCSAgICAgb3JpZ19uZWlnaF9ub2RlLT5vcmlnLAotCQkJCQkJICAgICBpZl9pbmNvbWluZyk7Ci0JCS8qIGNyZWF0ZV9uZWlnaGJvciBmYWlsZWQsIHJldHVybiAwICovCi0JCWlmICghbmVpZ2hfbm9kZSkKLQkJCXJldHVybiAwOwotCi0JCW5laWdoX25vZGUtPmxhc3RfdmFsaWQgPSBqaWZmaWVzOwotCX0gZWxzZSB7Ci0JCS8qIGZpbmQgcGFja2V0IGNvdW50IG9mIGNvcnJlc3BvbmRpbmcgb25lIGhvcCBuZWlnaGJvciAqLwotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHRtcF9uZWlnaF9ub2RlLAotCQkJCSAgICAmb3JpZ19uZWlnaF9ub2RlLT5uZWlnaF9saXN0LCBsaXN0KSB7Ci0KLQkJCWlmIChjb21wYXJlX29yaWcodG1wX25laWdoX25vZGUtPmFkZHIsCi0JCQkJCSBvcmlnX25laWdoX25vZGUtPm9yaWcpICYmCi0JCQkgICAgKHRtcF9uZWlnaF9ub2RlLT5pZl9pbmNvbWluZyA9PSBpZl9pbmNvbWluZykpCi0JCQkJbmVpZ2hfbm9kZSA9IHRtcF9uZWlnaF9ub2RlOwotCQl9Ci0KLQkJaWYgKCFuZWlnaF9ub2RlKQotCQkJbmVpZ2hfbm9kZSA9IGNyZWF0ZV9uZWlnaGJvcihvcmlnX25laWdoX25vZGUsCi0JCQkJCQkgICAgIG9yaWdfbmVpZ2hfbm9kZSwKLQkJCQkJCSAgICAgb3JpZ19uZWlnaF9ub2RlLT5vcmlnLAotCQkJCQkJICAgICBpZl9pbmNvbWluZyk7Ci0JCS8qIGNyZWF0ZV9uZWlnaGJvciBmYWlsZWQsIHJldHVybiAwICovCi0JCWlmICghbmVpZ2hfbm9kZSkKLQkJCXJldHVybiAwOwotCX0KLQotCW9yaWdfbm9kZS0+bGFzdF92YWxpZCA9IGppZmZpZXM7Ci0KLQkvKiBwYXkgYXR0ZW50aW9uIHRvIG5vdCBnZXQgYSB2YWx1ZSBiaWdnZXIgdGhhbiAxMDAgJSAqLwotCXRvdGFsX2NvdW50ID0gKG9yaWdfbmVpZ2hfbm9kZS0+YmNhc3Rfb3duX3N1bVtpZl9pbmNvbWluZy0+aWZfbnVtXSA+Ci0JCSAgICAgICBuZWlnaF9ub2RlLT5yZWFsX3BhY2tldF9jb3VudCA/Ci0JCSAgICAgICBuZWlnaF9ub2RlLT5yZWFsX3BhY2tldF9jb3VudCA6Ci0JCSAgICAgICBvcmlnX25laWdoX25vZGUtPmJjYXN0X293bl9zdW1baWZfaW5jb21pbmctPmlmX251bV0pOwotCi0JLyogaWYgd2UgaGF2ZSB0b28gZmV3IHBhY2tldHMgKHRvbyBsZXNzIGRhdGEpIHdlIHNldCB0cV9vd24gdG8gemVybyAqLwotCS8qIGlmIHdlIHJlY2VpdmUgdG9vIGZldyBwYWNrZXRzIGl0IGlzIG5vdCBjb25zaWRlcmVkIGJpZGlyZWN0aW9uYWwgKi8KLQlpZiAoKHRvdGFsX2NvdW50IDwgVFFfTE9DQUxfQklEUkVDVF9TRU5EX01JTklNVU0pIHx8Ci0JICAgIChuZWlnaF9ub2RlLT5yZWFsX3BhY2tldF9jb3VudCA8IFRRX0xPQ0FMX0JJRFJFQ1RfUkVDVl9NSU5JTVVNKSkKLQkJb3JpZ19uZWlnaF9ub2RlLT50cV9vd24gPSAwOwotCWVsc2UKLQkJLyogbmVpZ2hfbm9kZS0+cmVhbF9wYWNrZXRfY291bnQgaXMgbmV2ZXIgemVybyBhcyB3ZQotCQkgKiBvbmx5IHB1cmdlIG9sZCBpbmZvcm1hdGlvbiB3aGVuIGdldHRpbmcgbmV3Ci0JCSAqIGluZm9ybWF0aW9uICovCi0JCW9yaWdfbmVpZ2hfbm9kZS0+dHFfb3duID0gKFRRX01BWF9WQUxVRSAqIHRvdGFsX2NvdW50KSAvCi0JCQluZWlnaF9ub2RlLT5yZWFsX3BhY2tldF9jb3VudDsKLQotCS8qCi0JICogMSAtICgoMS14KSAqKiAzKSwgbm9ybWFsaXplZCB0byBUUV9NQVhfVkFMVUUgdGhpcyBkb2VzCi0JICogYWZmZWN0IHRoZSBuZWFybHktc3ltbWV0cmljIGxpbmtzIG9ubHkgYSBsaXR0bGUsIGJ1dAotCSAqIHB1bmlzaGVzIGFzeW1tZXRyaWMgbGlua3MgbW9yZS4gIFRoaXMgd2lsbCBnaXZlIGEgdmFsdWUKLQkgKiBiZXR3ZWVuIDAgYW5kIFRRX01BWF9WQUxVRQotCSAqLwotCW9yaWdfbmVpZ2hfbm9kZS0+dHFfYXN5bV9wZW5hbHR5ID0KLQkJVFFfTUFYX1ZBTFVFIC0KLQkJKFRRX01BWF9WQUxVRSAqCi0JCSAoVFFfTE9DQUxfV0lORE9XX1NJWkUgLSBuZWlnaF9ub2RlLT5yZWFsX3BhY2tldF9jb3VudCkgKgotCQkgKFRRX0xPQ0FMX1dJTkRPV19TSVpFIC0gbmVpZ2hfbm9kZS0+cmVhbF9wYWNrZXRfY291bnQpICoKLQkJIChUUV9MT0NBTF9XSU5ET1dfU0laRSAtIG5laWdoX25vZGUtPnJlYWxfcGFja2V0X2NvdW50KSkgLwotCQkoVFFfTE9DQUxfV0lORE9XX1NJWkUgKgotCQkgVFFfTE9DQUxfV0lORE9XX1NJWkUgKgotCQkgVFFfTE9DQUxfV0lORE9XX1NJWkUpOwotCi0JYmF0bWFuX3BhY2tldC0+dHEgPSAoKGJhdG1hbl9wYWNrZXQtPnRxICoKLQkJCSAgICAgIG9yaWdfbmVpZ2hfbm9kZS0+dHFfb3duICoKLQkJCSAgICAgIG9yaWdfbmVpZ2hfbm9kZS0+dHFfYXN5bV9wZW5hbHR5KSAvCi0JCQkgICAgIChUUV9NQVhfVkFMVUUgKiBUUV9NQVhfVkFMVUUpKTsKLQotCWJhdF9kYmcoREJHX0JBVE1BTiwgYmF0X3ByaXYsCi0JCSJiaWRpcmVjdGlvbmFsOiAiCi0JCSJvcmlnID0gJS0xNXBNIG5laWdoID0gJS0xNXBNID0+IG93bl9iY2FzdCA9ICUyaSwgIgotCQkicmVhbCByZWN2ID0gJTJpLCBsb2NhbCB0cTogJTNpLCBhc3ltX3BlbmFsdHk6ICUzaSwgIgotCQkidG90YWwgdHE6ICUzaVxuIiwKLQkJb3JpZ19ub2RlLT5vcmlnLCBvcmlnX25laWdoX25vZGUtPm9yaWcsIHRvdGFsX2NvdW50LAotCQluZWlnaF9ub2RlLT5yZWFsX3BhY2tldF9jb3VudCwgb3JpZ19uZWlnaF9ub2RlLT50cV9vd24sCi0JCW9yaWdfbmVpZ2hfbm9kZS0+dHFfYXN5bV9wZW5hbHR5LCBiYXRtYW5fcGFja2V0LT50cSk7Ci0KLQkvKiBpZiBsaW5rIGhhcyB0aGUgbWluaW11bSByZXF1aXJlZCB0cmFuc21pc3Npb24gcXVhbGl0eQotCSAqIGNvbnNpZGVyIGl0IGJpZGlyZWN0aW9uYWwgKi8KLQlpZiAoYmF0bWFuX3BhY2tldC0+dHEgPj0gVFFfVE9UQUxfQklEUkVDVF9MSU1JVCkKLQkJcmV0dXJuIDE7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgdXBkYXRlX29yaWcoc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiwKLQkJCXN0cnVjdCBvcmlnX25vZGUgKm9yaWdfbm9kZSwKLQkJCXN0cnVjdCBldGhoZHIgKmV0aGhkciwKLQkJCXN0cnVjdCBiYXRtYW5fcGFja2V0ICpiYXRtYW5fcGFja2V0LAotCQkJc3RydWN0IGJhdG1hbl9pZiAqaWZfaW5jb21pbmcsCi0JCQl1bnNpZ25lZCBjaGFyICpobmFfYnVmZiwgaW50IGhuYV9idWZmX2xlbiwKLQkJCWNoYXIgaXNfZHVwbGljYXRlKQotewotCXN0cnVjdCBuZWlnaF9ub2RlICpuZWlnaF9ub2RlID0gTlVMTCwgKnRtcF9uZWlnaF9ub2RlID0gTlVMTDsKLQlpbnQgdG1wX2huYV9idWZmX2xlbjsKLQotCWJhdF9kYmcoREJHX0JBVE1BTiwgYmF0X3ByaXYsICJ1cGRhdGVfb3JpZ2luYXRvcigpOiAiCi0JCSJTZWFyY2hpbmcgYW5kIHVwZGF0aW5nIG9yaWdpbmF0b3IgZW50cnkgb2YgcmVjZWl2ZWQgcGFja2V0XG4iKTsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnkodG1wX25laWdoX25vZGUsICZvcmlnX25vZGUtPm5laWdoX2xpc3QsIGxpc3QpIHsKLQkJaWYgKGNvbXBhcmVfb3JpZyh0bXBfbmVpZ2hfbm9kZS0+YWRkciwgZXRoaGRyLT5oX3NvdXJjZSkgJiYKLQkJICAgICh0bXBfbmVpZ2hfbm9kZS0+aWZfaW5jb21pbmcgPT0gaWZfaW5jb21pbmcpKSB7Ci0JCQluZWlnaF9ub2RlID0gdG1wX25laWdoX25vZGU7Ci0JCQljb250aW51ZTsKLQkJfQotCi0JCWlmIChpc19kdXBsaWNhdGUpCi0JCQljb250aW51ZTsKLQotCQlyaW5nX2J1ZmZlcl9zZXQodG1wX25laWdoX25vZGUtPnRxX3JlY3YsCi0JCQkJJnRtcF9uZWlnaF9ub2RlLT50cV9pbmRleCwgMCk7Ci0JCXRtcF9uZWlnaF9ub2RlLT50cV9hdmcgPQotCQkJcmluZ19idWZmZXJfYXZnKHRtcF9uZWlnaF9ub2RlLT50cV9yZWN2KTsKLQl9Ci0KLQlpZiAoIW5laWdoX25vZGUpIHsKLQkJc3RydWN0IG9yaWdfbm9kZSAqb3JpZ190bXA7Ci0KLQkJb3JpZ190bXAgPSBnZXRfb3JpZ19ub2RlKGJhdF9wcml2LCBldGhoZHItPmhfc291cmNlKTsKLQkJaWYgKCFvcmlnX3RtcCkKLQkJCXJldHVybjsKLQotCQluZWlnaF9ub2RlID0gY3JlYXRlX25laWdoYm9yKG9yaWdfbm9kZSwgb3JpZ190bXAsCi0JCQkJCSAgICAgZXRoaGRyLT5oX3NvdXJjZSwgaWZfaW5jb21pbmcpOwotCQlpZiAoIW5laWdoX25vZGUpCi0JCQlyZXR1cm47Ci0JfSBlbHNlCi0JCWJhdF9kYmcoREJHX0JBVE1BTiwgYmF0X3ByaXYsCi0JCQkiVXBkYXRpbmcgZXhpc3RpbmcgbGFzdC1ob3AgbmVpZ2hib3Igb2Ygb3JpZ2luYXRvclxuIik7Ci0KLQlvcmlnX25vZGUtPmZsYWdzID0gYmF0bWFuX3BhY2tldC0+ZmxhZ3M7Ci0JbmVpZ2hfbm9kZS0+bGFzdF92YWxpZCA9IGppZmZpZXM7Ci0KLQlyaW5nX2J1ZmZlcl9zZXQobmVpZ2hfbm9kZS0+dHFfcmVjdiwKLQkJCSZuZWlnaF9ub2RlLT50cV9pbmRleCwKLQkJCWJhdG1hbl9wYWNrZXQtPnRxKTsKLQluZWlnaF9ub2RlLT50cV9hdmcgPSByaW5nX2J1ZmZlcl9hdmcobmVpZ2hfbm9kZS0+dHFfcmVjdik7Ci0KLQlpZiAoIWlzX2R1cGxpY2F0ZSkgewotCQlvcmlnX25vZGUtPmxhc3RfdHRsID0gYmF0bWFuX3BhY2tldC0+dHRsOwotCQluZWlnaF9ub2RlLT5sYXN0X3R0bCA9IGJhdG1hbl9wYWNrZXQtPnR0bDsKLQl9Ci0KLQl0bXBfaG5hX2J1ZmZfbGVuID0gKGhuYV9idWZmX2xlbiA+IGJhdG1hbl9wYWNrZXQtPm51bV9obmEgKiBFVEhfQUxFTiA/Ci0JCQkgICAgYmF0bWFuX3BhY2tldC0+bnVtX2huYSAqIEVUSF9BTEVOIDogaG5hX2J1ZmZfbGVuKTsKLQotCS8qIGlmIHRoaXMgbmVpZ2hib3IgYWxyZWFkeSBpcyBvdXIgbmV4dCBob3AgdGhlcmUgaXMgbm90aGluZwotCSAqIHRvIGNoYW5nZSAqLwotCWlmIChvcmlnX25vZGUtPnJvdXRlciA9PSBuZWlnaF9ub2RlKQotCQlnb3RvIHVwZGF0ZV9obmE7Ci0KLQkvKiBpZiB0aGlzIG5laWdoYm9yIGRvZXMgbm90IG9mZmVyIGEgYmV0dGVyIFRRIHdlIHdvbid0IGNvbnNpZGVyIGl0ICovCi0JaWYgKChvcmlnX25vZGUtPnJvdXRlcikgJiYKLQkgICAgKG9yaWdfbm9kZS0+cm91dGVyLT50cV9hdmcgPiBuZWlnaF9ub2RlLT50cV9hdmcpKQotCQlnb3RvIHVwZGF0ZV9obmE7Ci0KLQkvKiBpZiB0aGUgVFEgaXMgdGhlIHNhbWUgYW5kIHRoZSBsaW5rIG5vdCBtb3JlIHN5bWV0cmljIHdlCi0JICogd29uJ3QgY29uc2lkZXIgaXQgZWl0aGVyICovCi0JaWYgKChvcmlnX25vZGUtPnJvdXRlcikgJiYKLQkgICAgICgobmVpZ2hfbm9kZS0+dHFfYXZnID09IG9yaWdfbm9kZS0+cm91dGVyLT50cV9hdmcpICYmCi0JICAgICAob3JpZ19ub2RlLT5yb3V0ZXItPm9yaWdfbm9kZS0+YmNhc3Rfb3duX3N1bVtpZl9pbmNvbWluZy0+aWZfbnVtXQotCSAgICAgID49IG5laWdoX25vZGUtPm9yaWdfbm9kZS0+YmNhc3Rfb3duX3N1bVtpZl9pbmNvbWluZy0+aWZfbnVtXSkpKQotCQlnb3RvIHVwZGF0ZV9obmE7Ci0KLQl1cGRhdGVfcm91dGVzKGJhdF9wcml2LCBvcmlnX25vZGUsIG5laWdoX25vZGUsCi0JCSAgICAgIGhuYV9idWZmLCB0bXBfaG5hX2J1ZmZfbGVuKTsKLQlyZXR1cm47Ci0KLXVwZGF0ZV9obmE6Ci0JdXBkYXRlX3JvdXRlcyhiYXRfcHJpdiwgb3JpZ19ub2RlLCBvcmlnX25vZGUtPnJvdXRlciwKLQkJICAgICAgaG5hX2J1ZmYsIHRtcF9obmFfYnVmZl9sZW4pOwotfQotCi0vKiBjaGVja3Mgd2hldGhlciB0aGUgaG9zdCByZXN0YXJ0ZWQgYW5kIGlzIGluIHRoZSBwcm90ZWN0aW9uIHRpbWUuCi0gKiByZXR1cm5zOgotICogIDAgaWYgdGhlIHBhY2tldCBpcyB0byBiZSBhY2NlcHRlZAotICogIDEgaWYgdGhlIHBhY2tldCBpcyB0byBiZSBpZ25vcmVkLgotICovCi1zdGF0aWMgaW50IHdpbmRvd19wcm90ZWN0ZWQoc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiwKLQkJCSAgICBpbnQzMl90IHNlcV9udW1fZGlmZiwKLQkJCSAgICB1bnNpZ25lZCBsb25nICpsYXN0X3Jlc2V0KQotewotCWlmICgoc2VxX251bV9kaWZmIDw9IC1UUV9MT0NBTF9XSU5ET1dfU0laRSkKLQkJfHwgKHNlcV9udW1fZGlmZiA+PSBFWFBFQ1RFRF9TRVFOT19SQU5HRSkpIHsKLQkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgKmxhc3RfcmVzZXQgKwotCQkJbXNlY3NfdG9famlmZmllcyhSRVNFVF9QUk9URUNUSU9OX01TKSkpIHsKLQotCQkJKmxhc3RfcmVzZXQgPSBqaWZmaWVzOwotCQkJYmF0X2RiZyhEQkdfQkFUTUFOLCBiYXRfcHJpdiwKLQkJCQkib2xkIHBhY2tldCByZWNlaXZlZCwgc3RhcnQgcHJvdGVjdGlvblxuIik7Ci0KLQkJCXJldHVybiAwOwotCQl9IGVsc2UKLQkJCXJldHVybiAxOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotLyogcHJvY2Vzc2VzIGEgYmF0bWFuIHBhY2tldCBmb3IgYWxsIGludGVyZmFjZXMsIGFkanVzdHMgdGhlIHNlcXVlbmNlIG51bWJlciBhbmQKLSAqIGZpbmRzIG91dCB3aGV0aGVyIGl0IGlzIGEgZHVwbGljYXRlLgotICogcmV0dXJuczoKLSAqICAgMSB0aGUgcGFja2V0IGlzIGEgZHVwbGljYXRlCi0gKiAgIDAgdGhlIHBhY2tldCBoYXMgbm90IHlldCBiZWVuIHJlY2VpdmVkCi0gKiAgLTEgdGhlIHBhY2tldCBpcyBvbGQgYW5kIGhhcyBiZWVuIHJlY2VpdmVkIHdoaWxlIHRoZSBzZXFubyB3aW5kb3cKLSAqICAgICB3YXMgcHJvdGVjdGVkLiBDYWxsZXIgc2hvdWxkIGRyb3AgaXQuCi0gKi8KLXN0YXRpYyBjaGFyIGNvdW50X3JlYWxfcGFja2V0cyhzdHJ1Y3QgZXRoaGRyICpldGhoZHIsCi0JCQkgICAgICAgc3RydWN0IGJhdG1hbl9wYWNrZXQgKmJhdG1hbl9wYWNrZXQsCi0JCQkgICAgICAgc3RydWN0IGJhdG1hbl9pZiAqaWZfaW5jb21pbmcpCi17Ci0Jc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiA9IG5ldGRldl9wcml2KGlmX2luY29taW5nLT5zb2Z0X2lmYWNlKTsKLQlzdHJ1Y3Qgb3JpZ19ub2RlICpvcmlnX25vZGU7Ci0Jc3RydWN0IG5laWdoX25vZGUgKnRtcF9uZWlnaF9ub2RlOwotCWNoYXIgaXNfZHVwbGljYXRlID0gMDsKLQlpbnQzMl90IHNlcV9kaWZmOwotCWludCBuZWVkX3VwZGF0ZSA9IDA7Ci0JaW50IHNldF9tYXJrOwotCi0Jb3JpZ19ub2RlID0gZ2V0X29yaWdfbm9kZShiYXRfcHJpdiwgYmF0bWFuX3BhY2tldC0+b3JpZyk7Ci0JaWYgKG9yaWdfbm9kZSA9PSBOVUxMKQotCQlyZXR1cm4gMDsKLQotCXNlcV9kaWZmID0gYmF0bWFuX3BhY2tldC0+c2Vxbm8gLSBvcmlnX25vZGUtPmxhc3RfcmVhbF9zZXFubzsKLQotCS8qIHNpZ25hbGl6ZSBjYWxsZXIgdGhhdCB0aGUgcGFja2V0IGlzIHRvIGJlIGRyb3BwZWQuICovCi0JaWYgKHdpbmRvd19wcm90ZWN0ZWQoYmF0X3ByaXYsIHNlcV9kaWZmLAotCQkJICAgICAmb3JpZ19ub2RlLT5iYXRtYW5fc2Vxbm9fcmVzZXQpKQotCQlyZXR1cm4gLTE7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHRtcF9uZWlnaF9ub2RlLCAmb3JpZ19ub2RlLT5uZWlnaF9saXN0LCBsaXN0KSB7Ci0KLQkJaXNfZHVwbGljYXRlIHw9IGdldF9iaXRfc3RhdHVzKHRtcF9uZWlnaF9ub2RlLT5yZWFsX2JpdHMsCi0JCQkJCSAgICAgICBvcmlnX25vZGUtPmxhc3RfcmVhbF9zZXFubywKLQkJCQkJICAgICAgIGJhdG1hbl9wYWNrZXQtPnNlcW5vKTsKLQotCQlpZiAoY29tcGFyZV9vcmlnKHRtcF9uZWlnaF9ub2RlLT5hZGRyLCBldGhoZHItPmhfc291cmNlKSAmJgotCQkgICAgKHRtcF9uZWlnaF9ub2RlLT5pZl9pbmNvbWluZyA9PSBpZl9pbmNvbWluZykpCi0JCQlzZXRfbWFyayA9IDE7Ci0JCWVsc2UKLQkJCXNldF9tYXJrID0gMDsKLQotCQkvKiBpZiB0aGUgd2luZG93IG1vdmVkLCBzZXQgdGhlIHVwZGF0ZSBmbGFnLiAqLwotCQluZWVkX3VwZGF0ZSB8PSBiaXRfZ2V0X3BhY2tldChiYXRfcHJpdiwKLQkJCQkJICAgICAgdG1wX25laWdoX25vZGUtPnJlYWxfYml0cywKLQkJCQkJICAgICAgc2VxX2RpZmYsIHNldF9tYXJrKTsKLQotCQl0bXBfbmVpZ2hfbm9kZS0+cmVhbF9wYWNrZXRfY291bnQgPQotCQkJYml0X3BhY2tldF9jb3VudCh0bXBfbmVpZ2hfbm9kZS0+cmVhbF9iaXRzKTsKLQl9Ci0KLQlpZiAobmVlZF91cGRhdGUpIHsKLQkJYmF0X2RiZyhEQkdfQkFUTUFOLCBiYXRfcHJpdiwKLQkJCSJ1cGRhdGluZyBsYXN0X3NlcW5vOiBvbGQgJWQsIG5ldyAlZFxuIiwKLQkJCW9yaWdfbm9kZS0+bGFzdF9yZWFsX3NlcW5vLCBiYXRtYW5fcGFja2V0LT5zZXFubyk7Ci0JCW9yaWdfbm9kZS0+bGFzdF9yZWFsX3NlcW5vID0gYmF0bWFuX3BhY2tldC0+c2Vxbm87Ci0JfQotCi0JcmV0dXJuIGlzX2R1cGxpY2F0ZTsKLX0KLQotLyogY29weSBwcmltYXJ5IGFkZHJlc3MgZm9yIGJvbmRpbmcgKi8KLXN0YXRpYyB2b2lkIG1hcmtfYm9uZGluZ19hZGRyZXNzKHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYsCi0JCQkJIHN0cnVjdCBvcmlnX25vZGUgKm9yaWdfbm9kZSwKLQkJCQkgc3RydWN0IG9yaWdfbm9kZSAqb3JpZ19uZWlnaF9ub2RlLAotCQkJCSBzdHJ1Y3QgYmF0bWFuX3BhY2tldCAqYmF0bWFuX3BhY2tldCkKLQotewotCWlmIChiYXRtYW5fcGFja2V0LT5mbGFncyAmIFBSSU1BUklFU19GSVJTVF9IT1ApCi0JCW1lbWNweShvcmlnX25laWdoX25vZGUtPnByaW1hcnlfYWRkciwKLQkJICAgICAgIG9yaWdfbm9kZS0+b3JpZywgRVRIX0FMRU4pOwotCi0JcmV0dXJuOwotfQotCi0vKiBtYXJrIHBvc3NpYmxlIGJvbmQuY2FuZGlkYXRlcyBpbiB0aGUgbmVpZ2hib3IgbGlzdCAqLwotdm9pZCB1cGRhdGVfYm9uZGluZ19jYW5kaWRhdGVzKHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYsCi0JCQkgICAgICAgc3RydWN0IG9yaWdfbm9kZSAqb3JpZ19ub2RlKQotewotCWludCBjYW5kaWRhdGVzOwotCWludCBpbnRlcmZlcmVuY2VfY2FuZGlkYXRlOwotCWludCBiZXN0X3RxOwotCXN0cnVjdCBuZWlnaF9ub2RlICp0bXBfbmVpZ2hfbm9kZSwgKnRtcF9uZWlnaF9ub2RlMjsKLQlzdHJ1Y3QgbmVpZ2hfbm9kZSAqZmlyc3RfY2FuZGlkYXRlLCAqbGFzdF9jYW5kaWRhdGU7Ci0KLQkvKiB1cGRhdGUgdGhlIGNhbmRpZGF0ZXMgZm9yIHRoaXMgb3JpZ2luYXRvciAqLwotCWlmICghb3JpZ19ub2RlLT5yb3V0ZXIpIHsKLQkJb3JpZ19ub2RlLT5ib25kLmNhbmRpZGF0ZXMgPSAwOwotCQlyZXR1cm47Ci0JfQotCi0JYmVzdF90cSA9IG9yaWdfbm9kZS0+cm91dGVyLT50cV9hdmc7Ci0KLQkvKiB1cGRhdGUgYm9uZC5jYW5kaWRhdGVzICovCi0KLQljYW5kaWRhdGVzID0gMDsKLQotCS8qIG1hcmsgb3RoZXIgbm9kZXMgd2hpY2ggYWxzbyByZWNlaXZlZCAiUFJJTUFSSUVTIEZJUlNUIEhPUCIgcGFja2V0cwotCSAqIGFzICJib25kaW5nIHBhcnRuZXIiICovCi0KLQkvKiBmaXJzdCwgemVybyB0aGUgbGlzdCAqLwotCWxpc3RfZm9yX2VhY2hfZW50cnkodG1wX25laWdoX25vZGUsICZvcmlnX25vZGUtPm5laWdoX2xpc3QsIGxpc3QpIHsKLQkJdG1wX25laWdoX25vZGUtPm5leHRfYm9uZF9jYW5kaWRhdGUgPSBOVUxMOwotCX0KLQotCWZpcnN0X2NhbmRpZGF0ZSA9IE5VTEw7Ci0JbGFzdF9jYW5kaWRhdGUgPSBOVUxMOwotCWxpc3RfZm9yX2VhY2hfZW50cnkodG1wX25laWdoX25vZGUsICZvcmlnX25vZGUtPm5laWdoX2xpc3QsIGxpc3QpIHsKLQotCQkvKiBvbmx5IGNvbnNpZGVyIGlmIGl0IGhhcyB0aGUgc2FtZSBwcmltYXJ5IGFkZHJlc3MgLi4uICAqLwotCQlpZiAobWVtY21wKG9yaWdfbm9kZS0+b3JpZywKLQkJCQl0bXBfbmVpZ2hfbm9kZS0+b3JpZ19ub2RlLT5wcmltYXJ5X2FkZHIsCi0JCQkJRVRIX0FMRU4pICE9IDApCi0JCQljb250aW51ZTsKLQotCQkvKiAuLi4gYW5kIGlzIGdvb2QgZW5vdWdoIHRvIGJlIGNvbnNpZGVyZWQgKi8KLQkJaWYgKHRtcF9uZWlnaF9ub2RlLT50cV9hdmcgPCBiZXN0X3RxIC0gQk9ORElOR19UUV9USFJFU0hPTEQpCi0JCQljb250aW51ZTsKLQotCQkvKiBjaGVjayBpZiB3ZSBoYXZlIGFub3RoZXIgY2FuZGlkYXRlIHdpdGggdGhlIHNhbWUKLQkJICogbWFjIGFkZHJlc3Mgb3IgaW50ZXJmYWNlLiBJZiB3ZSBkbywgd2Ugd29uJ3QKLQkJICogc2VsZWN0IHRoaXMgY2FuZGlkYXRlIGJlY2F1c2Ugb2YgcG9zc2libGUgaW50ZXJmZXJlbmNlLiAqLwotCi0JCWludGVyZmVyZW5jZV9jYW5kaWRhdGUgPSAwOwotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHRtcF9uZWlnaF9ub2RlMiwKLQkJCQkmb3JpZ19ub2RlLT5uZWlnaF9saXN0LCBsaXN0KSB7Ci0KLQkJCWlmICh0bXBfbmVpZ2hfbm9kZTIgPT0gdG1wX25laWdoX25vZGUpCi0JCQkJY29udGludWU7Ci0KLQkJCS8qIHdlIG9ubHkgY2FyZSBpZiB0aGUgb3RoZXIgY2FuZGlkYXRlIGlzIGV2ZW4KLQkJCSAqIGNvbnNpZGVyZWQgYXMgY2FuZGlkYXRlLiAqLwotCQkJaWYgKHRtcF9uZWlnaF9ub2RlMi0+bmV4dF9ib25kX2NhbmRpZGF0ZSA9PSBOVUxMKQotCQkJCWNvbnRpbnVlOwotCi0KLQkJCWlmICgodG1wX25laWdoX25vZGUtPmlmX2luY29taW5nID09Ci0JCQkJdG1wX25laWdoX25vZGUyLT5pZl9pbmNvbWluZykKLQkJCQl8fCAobWVtY21wKHRtcF9uZWlnaF9ub2RlLT5hZGRyLAotCQkJCXRtcF9uZWlnaF9ub2RlMi0+YWRkciwgRVRIX0FMRU4pID09IDApKSB7Ci0KLQkJCQlpbnRlcmZlcmVuY2VfY2FuZGlkYXRlID0gMTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQkvKiBkb24ndCBjYXJlIGZ1cnRoZXIgaWYgaXQgaXMgYW4gaW50ZXJmZXJlbmNlIGNhbmRpZGF0ZSAqLwotCQlpZiAoaW50ZXJmZXJlbmNlX2NhbmRpZGF0ZSkKLQkJCWNvbnRpbnVlOwotCi0JCWlmIChmaXJzdF9jYW5kaWRhdGUgPT0gTlVMTCkgewotCQkJZmlyc3RfY2FuZGlkYXRlID0gdG1wX25laWdoX25vZGU7Ci0JCQl0bXBfbmVpZ2hfbm9kZS0+bmV4dF9ib25kX2NhbmRpZGF0ZSA9IGZpcnN0X2NhbmRpZGF0ZTsKLQkJfSBlbHNlCi0JCQl0bXBfbmVpZ2hfbm9kZS0+bmV4dF9ib25kX2NhbmRpZGF0ZSA9IGxhc3RfY2FuZGlkYXRlOwotCi0JCWxhc3RfY2FuZGlkYXRlID0gdG1wX25laWdoX25vZGU7Ci0KLQkJY2FuZGlkYXRlcysrOwotCX0KLQotCWlmIChjYW5kaWRhdGVzID4gMCkgewotCQlmaXJzdF9jYW5kaWRhdGUtPm5leHRfYm9uZF9jYW5kaWRhdGUgPSBsYXN0X2NhbmRpZGF0ZTsKLQkJb3JpZ19ub2RlLT5ib25kLnNlbGVjdGVkID0gZmlyc3RfY2FuZGlkYXRlOwotCX0KLQotCW9yaWdfbm9kZS0+Ym9uZC5jYW5kaWRhdGVzID0gY2FuZGlkYXRlczsKLX0KLQotdm9pZCByZWNlaXZlX2JhdF9wYWNrZXQoc3RydWN0IGV0aGhkciAqZXRoaGRyLAotCQkJCXN0cnVjdCBiYXRtYW5fcGFja2V0ICpiYXRtYW5fcGFja2V0LAotCQkJCXVuc2lnbmVkIGNoYXIgKmhuYV9idWZmLCBpbnQgaG5hX2J1ZmZfbGVuLAotCQkJCXN0cnVjdCBiYXRtYW5faWYgKmlmX2luY29taW5nKQotewotCXN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYgPSBuZXRkZXZfcHJpdihpZl9pbmNvbWluZy0+c29mdF9pZmFjZSk7Ci0Jc3RydWN0IGJhdG1hbl9pZiAqYmF0bWFuX2lmOwotCXN0cnVjdCBvcmlnX25vZGUgKm9yaWdfbmVpZ2hfbm9kZSwgKm9yaWdfbm9kZTsKLQljaGFyIGhhc19kaXJlY3RsaW5rX2ZsYWc7Ci0JY2hhciBpc19teV9hZGRyID0gMCwgaXNfbXlfb3JpZyA9IDAsIGlzX215X29sZG9yaWcgPSAwOwotCWNoYXIgaXNfYnJvYWRjYXN0ID0gMCwgaXNfYmlkaXJlY3Rpb25hbCwgaXNfc2luZ2xlX2hvcF9uZWlnaDsKLQljaGFyIGlzX2R1cGxpY2F0ZTsKLQl1aW50MzJfdCBpZl9pbmNvbWluZ19zZXFubzsKLQotCS8qIFNpbGVudGx5IGRyb3Agd2hlbiB0aGUgYmF0bWFuIHBhY2tldCBpcyBhY3R1YWxseSBub3QgYQotCSAqIGNvcnJlY3QgcGFja2V0LgotCSAqCi0JICogVGhpcyBtaWdodCBoYXBwZW4gaWYgYSBwYWNrZXQgaXMgcGFkZGVkIChlLmcuIEV0aGVybmV0IGhhcyBhCi0JICogbWluaW11bSBmcmFtZSBsZW5ndGggb2YgNjQgYnl0ZSkgYW5kIHRoZSBhZ2dyZWdhdGlvbiBpbnRlcnByZXRzCi0JICogaXQgYXMgYW4gYWRkaXRpb25hbCBsZW5ndGguCi0JICoKLQkgKiBUT0RPOiBBIG1vcmUgc2FuZSBzb2x1dGlvbiB3b3VsZCBiZSB0byBoYXZlIGEgYml0IGluIHRoZQotCSAqIGJhdG1hbl9wYWNrZXQgdG8gZGV0ZWN0IHdoZXRoZXIgdGhlIHBhY2tldCBpcyB0aGUgbGFzdAotCSAqIHBhY2tldCBpbiBhbiBhZ2dyZWdhdGlvbi4gIEhlcmUgd2UgZXhwZWN0IHRoYXQgdGhlIHBhZGRpbmcKLQkgKiBpcyBhbHdheXMgemVybyAob3Igbm90IDB4MDEpCi0JICovCi0JaWYgKGJhdG1hbl9wYWNrZXQtPnBhY2tldF90eXBlICE9IEJBVF9QQUNLRVQpCi0JCXJldHVybjsKLQotCS8qIGNvdWxkIGJlIGNoYW5nZWQgYnkgc2NoZWR1bGVfb3duX3BhY2tldCgpICovCi0JaWZfaW5jb21pbmdfc2Vxbm8gPSBhdG9taWNfcmVhZCgmaWZfaW5jb21pbmctPnNlcW5vKTsKLQotCWhhc19kaXJlY3RsaW5rX2ZsYWcgPSAoYmF0bWFuX3BhY2tldC0+ZmxhZ3MgJiBESVJFQ1RMSU5LID8gMSA6IDApOwotCi0JaXNfc2luZ2xlX2hvcF9uZWlnaCA9IChjb21wYXJlX29yaWcoZXRoaGRyLT5oX3NvdXJjZSwKLQkJCQkJICAgIGJhdG1hbl9wYWNrZXQtPm9yaWcpID8gMSA6IDApOwotCi0JYmF0X2RiZyhEQkdfQkFUTUFOLCBiYXRfcHJpdiwKLQkJIlJlY2VpdmVkIEJBVE1BTiBwYWNrZXQgdmlhIE5COiAlcE0sIElGOiAlcyBbJXBNXSAiCi0JCSIoZnJvbSBPRzogJXBNLCB2aWEgcHJldiBPRzogJXBNLCBzZXFubyAlZCwgdHEgJWQsICIKLQkJIlRUTCAlZCwgViAlZCwgSURGICVkKVxuIiwKLQkJZXRoaGRyLT5oX3NvdXJjZSwgaWZfaW5jb21pbmctPm5ldF9kZXYtPm5hbWUsCi0JCWlmX2luY29taW5nLT5uZXRfZGV2LT5kZXZfYWRkciwgYmF0bWFuX3BhY2tldC0+b3JpZywKLQkJYmF0bWFuX3BhY2tldC0+cHJldl9zZW5kZXIsIGJhdG1hbl9wYWNrZXQtPnNlcW5vLAotCQliYXRtYW5fcGFja2V0LT50cSwgYmF0bWFuX3BhY2tldC0+dHRsLCBiYXRtYW5fcGFja2V0LT52ZXJzaW9uLAotCQloYXNfZGlyZWN0bGlua19mbGFnKTsKLQotCXJjdV9yZWFkX2xvY2soKTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShiYXRtYW5faWYsICZpZl9saXN0LCBsaXN0KSB7Ci0JCWlmIChiYXRtYW5faWYtPmlmX3N0YXR1cyAhPSBJRl9BQ1RJVkUpCi0JCQljb250aW51ZTsKLQotCQlpZiAoYmF0bWFuX2lmLT5zb2Z0X2lmYWNlICE9IGlmX2luY29taW5nLT5zb2Z0X2lmYWNlKQotCQkJY29udGludWU7Ci0KLQkJaWYgKGNvbXBhcmVfb3JpZyhldGhoZHItPmhfc291cmNlLAotCQkJCSBiYXRtYW5faWYtPm5ldF9kZXYtPmRldl9hZGRyKSkKLQkJCWlzX215X2FkZHIgPSAxOwotCi0JCWlmIChjb21wYXJlX29yaWcoYmF0bWFuX3BhY2tldC0+b3JpZywKLQkJCQkgYmF0bWFuX2lmLT5uZXRfZGV2LT5kZXZfYWRkcikpCi0JCQlpc19teV9vcmlnID0gMTsKLQotCQlpZiAoY29tcGFyZV9vcmlnKGJhdG1hbl9wYWNrZXQtPnByZXZfc2VuZGVyLAotCQkJCSBiYXRtYW5faWYtPm5ldF9kZXYtPmRldl9hZGRyKSkKLQkJCWlzX215X29sZG9yaWcgPSAxOwotCi0JCWlmIChjb21wYXJlX29yaWcoZXRoaGRyLT5oX3NvdXJjZSwgYnJvYWRjYXN0X2FkZHIpKQotCQkJaXNfYnJvYWRjYXN0ID0gMTsKLQl9Ci0JcmN1X3JlYWRfdW5sb2NrKCk7Ci0KLQlpZiAoYmF0bWFuX3BhY2tldC0+dmVyc2lvbiAhPSBDT01QQVRfVkVSU0lPTikgewotCQliYXRfZGJnKERCR19CQVRNQU4sIGJhdF9wcml2LAotCQkJIkRyb3AgcGFja2V0OiBpbmNvbXBhdGlibGUgYmF0bWFuIHZlcnNpb24gKCVpKVxuIiwKLQkJCWJhdG1hbl9wYWNrZXQtPnZlcnNpb24pOwotCQlyZXR1cm47Ci0JfQotCi0JaWYgKGlzX215X2FkZHIpIHsKLQkJYmF0X2RiZyhEQkdfQkFUTUFOLCBiYXRfcHJpdiwKLQkJCSJEcm9wIHBhY2tldDogcmVjZWl2ZWQgbXkgb3duIGJyb2FkY2FzdCAoc2VuZGVyOiAlcE0iCi0JCQkiKVxuIiwKLQkJCWV0aGhkci0+aF9zb3VyY2UpOwotCQlyZXR1cm47Ci0JfQotCi0JaWYgKGlzX2Jyb2FkY2FzdCkgewotCQliYXRfZGJnKERCR19CQVRNQU4sIGJhdF9wcml2LCAiRHJvcCBwYWNrZXQ6ICIKLQkJImlnbm9yaW5nIGFsbCBwYWNrZXRzIHdpdGggYnJvYWRjYXN0IHNvdXJjZSBhZGRyIChzZW5kZXI6ICVwTSIKLQkJIilcbiIsIGV0aGhkci0+aF9zb3VyY2UpOwotCQlyZXR1cm47Ci0JfQotCi0JaWYgKGlzX215X29yaWcpIHsKLQkJVFlQRV9PRl9XT1JEICp3b3JkOwotCQlpbnQgb2Zmc2V0OwotCi0JCW9yaWdfbmVpZ2hfbm9kZSA9IGdldF9vcmlnX25vZGUoYmF0X3ByaXYsIGV0aGhkci0+aF9zb3VyY2UpOwotCi0JCWlmICghb3JpZ19uZWlnaF9ub2RlKQotCQkJcmV0dXJuOwotCi0JCS8qIG5laWdoYm9yIGhhcyB0byBpbmRpY2F0ZSBkaXJlY3QgbGluayBhbmQgaXQgaGFzIHRvCi0JCSAqIGNvbWUgdmlhIHRoZSBjb3JyZXNwb25kaW5nIGludGVyZmFjZSAqLwotCQkvKiBpZiByZWNlaXZlZCBzZXFubyBlcXVhbHMgbGFzdCBzZW5kIHNlcW5vIHNhdmUgbmV3Ci0JCSAqIHNlcW5vIGZvciBiaWRpcmVjdGlvbmFsIGNoZWNrICovCi0JCWlmIChoYXNfZGlyZWN0bGlua19mbGFnICYmCi0JCSAgICBjb21wYXJlX29yaWcoaWZfaW5jb21pbmctPm5ldF9kZXYtPmRldl9hZGRyLAotCQkJCSBiYXRtYW5fcGFja2V0LT5vcmlnKSAmJgotCQkgICAgKGJhdG1hbl9wYWNrZXQtPnNlcW5vIC0gaWZfaW5jb21pbmdfc2Vxbm8gKyAyID09IDApKSB7Ci0JCQlvZmZzZXQgPSBpZl9pbmNvbWluZy0+aWZfbnVtICogTlVNX1dPUkRTOwotCQkJd29yZCA9ICYob3JpZ19uZWlnaF9ub2RlLT5iY2FzdF9vd25bb2Zmc2V0XSk7Ci0JCQliaXRfbWFyayh3b3JkLCAwKTsKLQkJCW9yaWdfbmVpZ2hfbm9kZS0+YmNhc3Rfb3duX3N1bVtpZl9pbmNvbWluZy0+aWZfbnVtXSA9Ci0JCQkJYml0X3BhY2tldF9jb3VudCh3b3JkKTsKLQkJfQotCi0JCWJhdF9kYmcoREJHX0JBVE1BTiwgYmF0X3ByaXYsICJEcm9wIHBhY2tldDogIgotCQkJIm9yaWdpbmF0b3IgcGFja2V0IGZyb20gbXlzZWxmICh2aWEgbmVpZ2hib3IpXG4iKTsKLQkJcmV0dXJuOwotCX0KLQotCWlmIChpc19teV9vbGRvcmlnKSB7Ci0JCWJhdF9kYmcoREJHX0JBVE1BTiwgYmF0X3ByaXYsCi0JCQkiRHJvcCBwYWNrZXQ6IGlnbm9yaW5nIGFsbCByZWJyb2FkY2FzdCBlY2hvcyAoc2VuZGVyOiAiCi0JCQkiJXBNKVxuIiwgZXRoaGRyLT5oX3NvdXJjZSk7Ci0JCXJldHVybjsKLQl9Ci0KLQlvcmlnX25vZGUgPSBnZXRfb3JpZ19ub2RlKGJhdF9wcml2LCBiYXRtYW5fcGFja2V0LT5vcmlnKTsKLQlpZiAob3JpZ19ub2RlID09IE5VTEwpCi0JCXJldHVybjsKLQotCWlzX2R1cGxpY2F0ZSA9IGNvdW50X3JlYWxfcGFja2V0cyhldGhoZHIsIGJhdG1hbl9wYWNrZXQsIGlmX2luY29taW5nKTsKLQotCWlmIChpc19kdXBsaWNhdGUgPT0gLTEpIHsKLQkJYmF0X2RiZyhEQkdfQkFUTUFOLCBiYXRfcHJpdiwKLQkJCSJEcm9wIHBhY2tldDogcGFja2V0IHdpdGhpbiBzZXFubyBwcm90ZWN0aW9uIHRpbWUgIgotCQkJIihzZW5kZXI6ICVwTSlcbiIsIGV0aGhkci0+aF9zb3VyY2UpOwotCQlyZXR1cm47Ci0JfQotCi0JaWYgKGJhdG1hbl9wYWNrZXQtPnRxID09IDApIHsKLQkJYmF0X2RiZyhEQkdfQkFUTUFOLCBiYXRfcHJpdiwKLQkJCSJEcm9wIHBhY2tldDogb3JpZ2luYXRvciBwYWNrZXQgd2l0aCB0cSBlcXVhbCAwXG4iKTsKLQkJcmV0dXJuOwotCX0KLQotCS8qIGF2b2lkIHRlbXBvcmFyeSByb3V0aW5nIGxvb3BzICovCi0JaWYgKChvcmlnX25vZGUtPnJvdXRlcikgJiYKLQkgICAgKG9yaWdfbm9kZS0+cm91dGVyLT5vcmlnX25vZGUtPnJvdXRlcikgJiYKLQkgICAgKGNvbXBhcmVfb3JpZyhvcmlnX25vZGUtPnJvdXRlci0+YWRkciwKLQkJCSAgYmF0bWFuX3BhY2tldC0+cHJldl9zZW5kZXIpKSAmJgotCSAgICAhKGNvbXBhcmVfb3JpZyhiYXRtYW5fcGFja2V0LT5vcmlnLCBiYXRtYW5fcGFja2V0LT5wcmV2X3NlbmRlcikpICYmCi0JICAgIChjb21wYXJlX29yaWcob3JpZ19ub2RlLT5yb3V0ZXItPmFkZHIsCi0JCQkgIG9yaWdfbm9kZS0+cm91dGVyLT5vcmlnX25vZGUtPnJvdXRlci0+YWRkcikpKSB7Ci0JCWJhdF9kYmcoREJHX0JBVE1BTiwgYmF0X3ByaXYsCi0JCQkiRHJvcCBwYWNrZXQ6IGlnbm9yaW5nIGFsbCByZWJyb2FkY2FzdCBwYWNrZXRzIHRoYXQgIgotCQkJIm1heSBtYWtlIG1lIGxvb3AgKHNlbmRlcjogJXBNKVxuIiwgZXRoaGRyLT5oX3NvdXJjZSk7Ci0JCXJldHVybjsKLQl9Ci0KLQkvKiBpZiBzZW5kZXIgaXMgYSBkaXJlY3QgbmVpZ2hib3IgdGhlIHNlbmRlciBtYWMgZXF1YWxzCi0JICogb3JpZ2luYXRvciBtYWMgKi8KLQlvcmlnX25laWdoX25vZGUgPSAoaXNfc2luZ2xlX2hvcF9uZWlnaCA/Ci0JCQkgICBvcmlnX25vZGUgOgotCQkJICAgZ2V0X29yaWdfbm9kZShiYXRfcHJpdiwgZXRoaGRyLT5oX3NvdXJjZSkpOwotCWlmIChvcmlnX25laWdoX25vZGUgPT0gTlVMTCkKLQkJcmV0dXJuOwotCi0JLyogZHJvcCBwYWNrZXQgaWYgc2VuZGVyIGlzIG5vdCBhIGRpcmVjdCBuZWlnaGJvciBhbmQgaWYgd2UKLQkgKiBkb24ndCByb3V0ZSB0b3dhcmRzIGl0ICovCi0JaWYgKCFpc19zaW5nbGVfaG9wX25laWdoICYmCi0JICAgIChvcmlnX25laWdoX25vZGUtPnJvdXRlciA9PSBOVUxMKSkgewotCQliYXRfZGJnKERCR19CQVRNQU4sIGJhdF9wcml2LAotCQkJIkRyb3AgcGFja2V0OiBPR00gdmlhIHVua25vd24gbmVpZ2hib3IhXG4iKTsKLQkJcmV0dXJuOwotCX0KLQotCWlzX2JpZGlyZWN0aW9uYWwgPSBpc19iaWRpcmVjdGlvbmFsX25laWdoKG9yaWdfbm9kZSwgb3JpZ19uZWlnaF9ub2RlLAotCQkJCQkJYmF0bWFuX3BhY2tldCwgaWZfaW5jb21pbmcpOwotCi0JLyogdXBkYXRlIHJhbmtpbmcgaWYgaXQgaXMgbm90IGEgZHVwbGljYXRlIG9yIGhhcyB0aGUgc2FtZQotCSAqIHNlcW5vIGFuZCBzaW1pbGFyIHR0bCBhcyB0aGUgbm9uLWR1cGxpY2F0ZSAqLwotCWlmIChpc19iaWRpcmVjdGlvbmFsICYmCi0JICAgICghaXNfZHVwbGljYXRlIHx8Ci0JICAgICAoKG9yaWdfbm9kZS0+bGFzdF9yZWFsX3NlcW5vID09IGJhdG1hbl9wYWNrZXQtPnNlcW5vKSAmJgotCSAgICAgIChvcmlnX25vZGUtPmxhc3RfdHRsIC0gMyA8PSBiYXRtYW5fcGFja2V0LT50dGwpKSkpCi0JCXVwZGF0ZV9vcmlnKGJhdF9wcml2LCBvcmlnX25vZGUsIGV0aGhkciwgYmF0bWFuX3BhY2tldCwKLQkJCSAgICBpZl9pbmNvbWluZywgaG5hX2J1ZmYsIGhuYV9idWZmX2xlbiwgaXNfZHVwbGljYXRlKTsKLQotCW1hcmtfYm9uZGluZ19hZGRyZXNzKGJhdF9wcml2LCBvcmlnX25vZGUsCi0JCQkgICAgIG9yaWdfbmVpZ2hfbm9kZSwgYmF0bWFuX3BhY2tldCk7Ci0JdXBkYXRlX2JvbmRpbmdfY2FuZGlkYXRlcyhiYXRfcHJpdiwgb3JpZ19ub2RlKTsKLQotCS8qIGlzIHNpbmdsZSBob3AgKGRpcmVjdCkgbmVpZ2hib3IgKi8KLQlpZiAoaXNfc2luZ2xlX2hvcF9uZWlnaCkgewotCi0JCS8qIG1hcmsgZGlyZWN0IGxpbmsgb24gaW5jb21pbmcgaW50ZXJmYWNlICovCi0JCXNjaGVkdWxlX2ZvcndhcmRfcGFja2V0KG9yaWdfbm9kZSwgZXRoaGRyLCBiYXRtYW5fcGFja2V0LAotCQkJCQkxLCBobmFfYnVmZl9sZW4sIGlmX2luY29taW5nKTsKLQotCQliYXRfZGJnKERCR19CQVRNQU4sIGJhdF9wcml2LCAiRm9yd2FyZGluZyBwYWNrZXQ6ICIKLQkJCSJyZWJyb2FkY2FzdCBuZWlnaGJvciBwYWNrZXQgd2l0aCBkaXJlY3QgbGluayBmbGFnXG4iKTsKLQkJcmV0dXJuOwotCX0KLQotCS8qIG11bHRpaG9wIG9yaWdpbmF0b3IgKi8KLQlpZiAoIWlzX2JpZGlyZWN0aW9uYWwpIHsKLQkJYmF0X2RiZyhEQkdfQkFUTUFOLCBiYXRfcHJpdiwKLQkJCSJEcm9wIHBhY2tldDogbm90IHJlY2VpdmVkIHZpYSBiaWRpcmVjdGlvbmFsIGxpbmtcbiIpOwotCQlyZXR1cm47Ci0JfQotCi0JaWYgKGlzX2R1cGxpY2F0ZSkgewotCQliYXRfZGJnKERCR19CQVRNQU4sIGJhdF9wcml2LAotCQkJIkRyb3AgcGFja2V0OiBkdXBsaWNhdGUgcGFja2V0IHJlY2VpdmVkXG4iKTsKLQkJcmV0dXJuOwotCX0KLQotCWJhdF9kYmcoREJHX0JBVE1BTiwgYmF0X3ByaXYsCi0JCSJGb3J3YXJkaW5nIHBhY2tldDogcmVicm9hZGNhc3Qgb3JpZ2luYXRvciBwYWNrZXRcbiIpOwotCXNjaGVkdWxlX2ZvcndhcmRfcGFja2V0KG9yaWdfbm9kZSwgZXRoaGRyLCBiYXRtYW5fcGFja2V0LAotCQkJCTAsIGhuYV9idWZmX2xlbiwgaWZfaW5jb21pbmcpOwotfQotCi1pbnQgcmVjdl9iYXRfcGFja2V0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBiYXRtYW5faWYgKmJhdG1hbl9pZikKLXsKLQlzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2ID0gbmV0ZGV2X3ByaXYoYmF0bWFuX2lmLT5zb2Z0X2lmYWNlKTsKLQlzdHJ1Y3QgZXRoaGRyICpldGhoZHI7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCS8qIGRyb3AgcGFja2V0IGlmIGl0IGhhcyBub3QgbmVjZXNzYXJ5IG1pbmltdW0gc2l6ZSAqLwotCWlmICh1bmxpa2VseSghcHNrYl9tYXlfcHVsbChza2IsIHNpemVvZihzdHJ1Y3QgYmF0bWFuX3BhY2tldCkpKSkKLQkJcmV0dXJuIE5FVF9SWF9EUk9QOwotCi0JZXRoaGRyID0gKHN0cnVjdCBldGhoZHIgKilza2JfbWFjX2hlYWRlcihza2IpOwotCi0JLyogcGFja2V0IHdpdGggYnJvYWRjYXN0IGluZGljYXRpb24gYnV0IHVuaWNhc3QgcmVjaXBpZW50ICovCi0JaWYgKCFpc19iY2FzdChldGhoZHItPmhfZGVzdCkpCi0JCXJldHVybiBORVRfUlhfRFJPUDsKLQotCS8qIHBhY2tldCB3aXRoIGJyb2FkY2FzdCBzZW5kZXIgYWRkcmVzcyAqLwotCWlmIChpc19iY2FzdChldGhoZHItPmhfc291cmNlKSkKLQkJcmV0dXJuIE5FVF9SWF9EUk9QOwotCi0JLyogY3JlYXRlIGEgY29weSBvZiB0aGUgc2tiLCBpZiBuZWVkZWQsIHRvIG1vZGlmeSBpdC4gKi8KLQlpZiAoc2tiX2Nvdyhza2IsIDApIDwgMCkKLQkJcmV0dXJuIE5FVF9SWF9EUk9QOwotCi0JLyoga2VlcCBza2IgbGluZWFyICovCi0JaWYgKHNrYl9saW5lYXJpemUoc2tiKSA8IDApCi0JCXJldHVybiBORVRfUlhfRFJPUDsKLQotCWV0aGhkciA9IChzdHJ1Y3QgZXRoaGRyICopc2tiX21hY19oZWFkZXIoc2tiKTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZiYXRfcHJpdi0+b3JpZ19oYXNoX2xvY2ssIGZsYWdzKTsKLQlyZWNlaXZlX2FnZ3JfYmF0X3BhY2tldChldGhoZHIsCi0JCQkJc2tiLT5kYXRhLAotCQkJCXNrYl9oZWFkbGVuKHNrYiksCi0JCQkJYmF0bWFuX2lmKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiYXRfcHJpdi0+b3JpZ19oYXNoX2xvY2ssIGZsYWdzKTsKLQotCWtmcmVlX3NrYihza2IpOwotCXJldHVybiBORVRfUlhfU1VDQ0VTUzsKLX0KLQotc3RhdGljIGludCByZWN2X215X2ljbXBfcGFja2V0KHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYsCi0JCQkgICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgc2l6ZV90IGljbXBfbGVuKQotewotCXN0cnVjdCBvcmlnX25vZGUgKm9yaWdfbm9kZTsKLQlzdHJ1Y3QgaWNtcF9wYWNrZXRfcnIgKmljbXBfcGFja2V0OwotCXN0cnVjdCBldGhoZHIgKmV0aGhkcjsKLQlzdHJ1Y3QgYmF0bWFuX2lmICpiYXRtYW5faWY7Ci0JaW50IHJldDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXVpbnQ4X3QgZHN0YWRkcltFVEhfQUxFTl07Ci0KLQlpY21wX3BhY2tldCA9IChzdHJ1Y3QgaWNtcF9wYWNrZXRfcnIgKilza2ItPmRhdGE7Ci0JZXRoaGRyID0gKHN0cnVjdCBldGhoZHIgKilza2JfbWFjX2hlYWRlcihza2IpOwotCi0JLyogYWRkIGRhdGEgdG8gZGV2aWNlIHF1ZXVlICovCi0JaWYgKGljbXBfcGFja2V0LT5tc2dfdHlwZSAhPSBFQ0hPX1JFUVVFU1QpIHsKLQkJYmF0X3NvY2tldF9yZWNlaXZlX3BhY2tldChpY21wX3BhY2tldCwgaWNtcF9sZW4pOwotCQlyZXR1cm4gTkVUX1JYX0RST1A7Ci0JfQotCi0JaWYgKCFiYXRfcHJpdi0+cHJpbWFyeV9pZikKLQkJcmV0dXJuIE5FVF9SWF9EUk9QOwotCi0JLyogYW5zd2VyIGVjaG8gcmVxdWVzdCAocGluZykgKi8KLQkvKiBnZXQgcm91dGluZyBpbmZvcm1hdGlvbiAqLwotCXNwaW5fbG9ja19pcnFzYXZlKCZiYXRfcHJpdi0+b3JpZ19oYXNoX2xvY2ssIGZsYWdzKTsKLQlvcmlnX25vZGUgPSAoKHN0cnVjdCBvcmlnX25vZGUgKiloYXNoX2ZpbmQoYmF0X3ByaXYtPm9yaWdfaGFzaCwKLQkJCQkJCSAgIGljbXBfcGFja2V0LT5vcmlnKSk7Ci0JcmV0ID0gTkVUX1JYX0RST1A7Ci0KLQlpZiAoKG9yaWdfbm9kZSAhPSBOVUxMKSAmJgotCSAgICAob3JpZ19ub2RlLT5yb3V0ZXIgIT0gTlVMTCkpIHsKLQotCQkvKiBkb24ndCBsb2NrIHdoaWxlIHNlbmRpbmcgdGhlIHBhY2tldHMgLi4uIHdlIHRoZXJlZm9yZQotCQkgKiBjb3B5IHRoZSByZXF1aXJlZCBkYXRhIGJlZm9yZSBzZW5kaW5nICovCi0JCWJhdG1hbl9pZiA9IG9yaWdfbm9kZS0+cm91dGVyLT5pZl9pbmNvbWluZzsKLQkJbWVtY3B5KGRzdGFkZHIsIG9yaWdfbm9kZS0+cm91dGVyLT5hZGRyLCBFVEhfQUxFTik7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJhdF9wcml2LT5vcmlnX2hhc2hfbG9jaywgZmxhZ3MpOwotCi0JCS8qIGNyZWF0ZSBhIGNvcHkgb2YgdGhlIHNrYiwgaWYgbmVlZGVkLCB0byBtb2RpZnkgaXQuICovCi0JCWlmIChza2JfY293KHNrYiwgc2l6ZW9mKHN0cnVjdCBldGhoZHIpKSA8IDApCi0JCQlyZXR1cm4gTkVUX1JYX0RST1A7Ci0KLQkJaWNtcF9wYWNrZXQgPSAoc3RydWN0IGljbXBfcGFja2V0X3JyICopc2tiLT5kYXRhOwotCQlldGhoZHIgPSAoc3RydWN0IGV0aGhkciAqKXNrYl9tYWNfaGVhZGVyKHNrYik7Ci0KLQkJbWVtY3B5KGljbXBfcGFja2V0LT5kc3QsIGljbXBfcGFja2V0LT5vcmlnLCBFVEhfQUxFTik7Ci0JCW1lbWNweShpY21wX3BhY2tldC0+b3JpZywKLQkJICAgICAgIGJhdF9wcml2LT5wcmltYXJ5X2lmLT5uZXRfZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pOwotCQlpY21wX3BhY2tldC0+bXNnX3R5cGUgPSBFQ0hPX1JFUExZOwotCQlpY21wX3BhY2tldC0+dHRsID0gVFRMOwotCi0JCXNlbmRfc2tiX3BhY2tldChza2IsIGJhdG1hbl9pZiwgZHN0YWRkcik7Ci0JCXJldCA9IE5FVF9SWF9TVUNDRVNTOwotCi0JfSBlbHNlCi0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJhdF9wcml2LT5vcmlnX2hhc2hfbG9jaywgZmxhZ3MpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCByZWN2X2ljbXBfdHRsX2V4Y2VlZGVkKHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYsCi0JCQkJICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzaXplX3QgaWNtcF9sZW4pCi17Ci0Jc3RydWN0IG9yaWdfbm9kZSAqb3JpZ19ub2RlOwotCXN0cnVjdCBpY21wX3BhY2tldCAqaWNtcF9wYWNrZXQ7Ci0Jc3RydWN0IGV0aGhkciAqZXRoaGRyOwotCXN0cnVjdCBiYXRtYW5faWYgKmJhdG1hbl9pZjsKLQlpbnQgcmV0OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdWludDhfdCBkc3RhZGRyW0VUSF9BTEVOXTsKLQotCWljbXBfcGFja2V0ID0gKHN0cnVjdCBpY21wX3BhY2tldCAqKXNrYi0+ZGF0YTsKLQlldGhoZHIgPSAoc3RydWN0IGV0aGhkciAqKXNrYl9tYWNfaGVhZGVyKHNrYik7Ci0KLQkvKiBzZW5kIFRUTCBleGNlZWRlZCBpZiBwYWNrZXQgaXMgYW4gZWNobyByZXF1ZXN0ICh0cmFjZXJvdXRlKSAqLwotCWlmIChpY21wX3BhY2tldC0+bXNnX3R5cGUgIT0gRUNIT19SRVFVRVNUKSB7Ci0JCXByX2RlYnVnKCJXYXJuaW5nIC0gY2FuJ3QgZm9yd2FyZCBpY21wIHBhY2tldCBmcm9tICVwTSB0byAiCi0JCQkgIiVwTTogdHRsIGV4Y2VlZGVkXG4iLCBpY21wX3BhY2tldC0+b3JpZywKLQkJCSBpY21wX3BhY2tldC0+ZHN0KTsKLQkJcmV0dXJuIE5FVF9SWF9EUk9QOwotCX0KLQotCWlmICghYmF0X3ByaXYtPnByaW1hcnlfaWYpCi0JCXJldHVybiBORVRfUlhfRFJPUDsKLQotCS8qIGdldCByb3V0aW5nIGluZm9ybWF0aW9uICovCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmJhdF9wcml2LT5vcmlnX2hhc2hfbG9jaywgZmxhZ3MpOwotCW9yaWdfbm9kZSA9ICgoc3RydWN0IG9yaWdfbm9kZSAqKQotCQkgICAgIGhhc2hfZmluZChiYXRfcHJpdi0+b3JpZ19oYXNoLCBpY21wX3BhY2tldC0+b3JpZykpOwotCXJldCA9IE5FVF9SWF9EUk9QOwotCi0JaWYgKChvcmlnX25vZGUgIT0gTlVMTCkgJiYKLQkgICAgKG9yaWdfbm9kZS0+cm91dGVyICE9IE5VTEwpKSB7Ci0KLQkJLyogZG9uJ3QgbG9jayB3aGlsZSBzZW5kaW5nIHRoZSBwYWNrZXRzIC4uLiB3ZSB0aGVyZWZvcmUKLQkJICogY29weSB0aGUgcmVxdWlyZWQgZGF0YSBiZWZvcmUgc2VuZGluZyAqLwotCQliYXRtYW5faWYgPSBvcmlnX25vZGUtPnJvdXRlci0+aWZfaW5jb21pbmc7Ci0JCW1lbWNweShkc3RhZGRyLCBvcmlnX25vZGUtPnJvdXRlci0+YWRkciwgRVRIX0FMRU4pOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiYXRfcHJpdi0+b3JpZ19oYXNoX2xvY2ssIGZsYWdzKTsKLQotCQkvKiBjcmVhdGUgYSBjb3B5IG9mIHRoZSBza2IsIGlmIG5lZWRlZCwgdG8gbW9kaWZ5IGl0LiAqLwotCQlpZiAoc2tiX2Nvdyhza2IsIHNpemVvZihzdHJ1Y3QgZXRoaGRyKSkgPCAwKQotCQkJcmV0dXJuIE5FVF9SWF9EUk9QOwotCi0JCWljbXBfcGFja2V0ID0gKHN0cnVjdCBpY21wX3BhY2tldCAqKSBza2ItPmRhdGE7Ci0JCWV0aGhkciA9IChzdHJ1Y3QgZXRoaGRyICopc2tiX21hY19oZWFkZXIoc2tiKTsKLQotCQltZW1jcHkoaWNtcF9wYWNrZXQtPmRzdCwgaWNtcF9wYWNrZXQtPm9yaWcsIEVUSF9BTEVOKTsKLQkJbWVtY3B5KGljbXBfcGFja2V0LT5vcmlnLAotCQkgICAgICAgYmF0X3ByaXYtPnByaW1hcnlfaWYtPm5ldF9kZXYtPmRldl9hZGRyLCBFVEhfQUxFTik7Ci0JCWljbXBfcGFja2V0LT5tc2dfdHlwZSA9IFRUTF9FWENFRURFRDsKLQkJaWNtcF9wYWNrZXQtPnR0bCA9IFRUTDsKLQotCQlzZW5kX3NrYl9wYWNrZXQoc2tiLCBiYXRtYW5faWYsIGRzdGFkZHIpOwotCQlyZXQgPSBORVRfUlhfU1VDQ0VTUzsKLQotCX0gZWxzZQotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiYXRfcHJpdi0+b3JpZ19oYXNoX2xvY2ssIGZsYWdzKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLQotaW50IHJlY3ZfaWNtcF9wYWNrZXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGJhdG1hbl9pZiAqcmVjdl9pZikKLXsKLQlzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2ID0gbmV0ZGV2X3ByaXYocmVjdl9pZi0+c29mdF9pZmFjZSk7Ci0Jc3RydWN0IGljbXBfcGFja2V0X3JyICppY21wX3BhY2tldDsKLQlzdHJ1Y3QgZXRoaGRyICpldGhoZHI7Ci0Jc3RydWN0IG9yaWdfbm9kZSAqb3JpZ19ub2RlOwotCXN0cnVjdCBiYXRtYW5faWYgKmJhdG1hbl9pZjsKLQlpbnQgaGRyX3NpemUgPSBzaXplb2Yoc3RydWN0IGljbXBfcGFja2V0KTsKLQlpbnQgcmV0OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdWludDhfdCBkc3RhZGRyW0VUSF9BTEVOXTsKLQotCS8qKgotCSAqIHdlIHRydW5jYXRlIGFsbCBpbmNvbWluZyBpY21wIHBhY2tldHMgaWYgdGhleSBkb24ndCBtYXRjaCBvdXIgc2l6ZQotCSAqLwotCWlmIChza2ItPmxlbiA+PSBzaXplb2Yoc3RydWN0IGljbXBfcGFja2V0X3JyKSkKLQkJaGRyX3NpemUgPSBzaXplb2Yoc3RydWN0IGljbXBfcGFja2V0X3JyKTsKLQotCS8qIGRyb3AgcGFja2V0IGlmIGl0IGhhcyBub3QgbmVjZXNzYXJ5IG1pbmltdW0gc2l6ZSAqLwotCWlmICh1bmxpa2VseSghcHNrYl9tYXlfcHVsbChza2IsIGhkcl9zaXplKSkpCi0JCXJldHVybiBORVRfUlhfRFJPUDsKLQotCWV0aGhkciA9IChzdHJ1Y3QgZXRoaGRyICopc2tiX21hY19oZWFkZXIoc2tiKTsKLQotCS8qIHBhY2tldCB3aXRoIHVuaWNhc3QgaW5kaWNhdGlvbiBidXQgYnJvYWRjYXN0IHJlY2lwaWVudCAqLwotCWlmIChpc19iY2FzdChldGhoZHItPmhfZGVzdCkpCi0JCXJldHVybiBORVRfUlhfRFJPUDsKLQotCS8qIHBhY2tldCB3aXRoIGJyb2FkY2FzdCBzZW5kZXIgYWRkcmVzcyAqLwotCWlmIChpc19iY2FzdChldGhoZHItPmhfc291cmNlKSkKLQkJcmV0dXJuIE5FVF9SWF9EUk9QOwotCi0JLyogbm90IGZvciBtZSAqLwotCWlmICghaXNfbXlfbWFjKGV0aGhkci0+aF9kZXN0KSkKLQkJcmV0dXJuIE5FVF9SWF9EUk9QOwotCi0JaWNtcF9wYWNrZXQgPSAoc3RydWN0IGljbXBfcGFja2V0X3JyICopc2tiLT5kYXRhOwotCi0JLyogYWRkIHJlY29yZCByb3V0ZSBpbmZvcm1hdGlvbiBpZiBub3QgZnVsbCAqLwotCWlmICgoaGRyX3NpemUgPT0gc2l6ZW9mKHN0cnVjdCBpY21wX3BhY2tldF9ycikpICYmCi0JICAgIChpY21wX3BhY2tldC0+cnJfY3VyIDwgQkFUX1JSX0xFTikpIHsKLQkJbWVtY3B5KCYoaWNtcF9wYWNrZXQtPnJyW2ljbXBfcGFja2V0LT5ycl9jdXJdKSwKLQkJCWV0aGhkci0+aF9kZXN0LCBFVEhfQUxFTik7Ci0JCWljbXBfcGFja2V0LT5ycl9jdXIrKzsKLQl9Ci0KLQkvKiBwYWNrZXQgZm9yIG1lICovCi0JaWYgKGlzX215X21hYyhpY21wX3BhY2tldC0+ZHN0KSkKLQkJcmV0dXJuIHJlY3ZfbXlfaWNtcF9wYWNrZXQoYmF0X3ByaXYsIHNrYiwgaGRyX3NpemUpOwotCi0JLyogVFRMIGV4Y2VlZGVkICovCi0JaWYgKGljbXBfcGFja2V0LT50dGwgPCAyKQotCQlyZXR1cm4gcmVjdl9pY21wX3R0bF9leGNlZWRlZChiYXRfcHJpdiwgc2tiLCBoZHJfc2l6ZSk7Ci0KLQlyZXQgPSBORVRfUlhfRFJPUDsKLQotCS8qIGdldCByb3V0aW5nIGluZm9ybWF0aW9uICovCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmJhdF9wcml2LT5vcmlnX2hhc2hfbG9jaywgZmxhZ3MpOwotCW9yaWdfbm9kZSA9ICgoc3RydWN0IG9yaWdfbm9kZSAqKQotCQkgICAgIGhhc2hfZmluZChiYXRfcHJpdi0+b3JpZ19oYXNoLCBpY21wX3BhY2tldC0+ZHN0KSk7Ci0KLQlpZiAoKG9yaWdfbm9kZSAhPSBOVUxMKSAmJgotCSAgICAob3JpZ19ub2RlLT5yb3V0ZXIgIT0gTlVMTCkpIHsKLQotCQkvKiBkb24ndCBsb2NrIHdoaWxlIHNlbmRpbmcgdGhlIHBhY2tldHMgLi4uIHdlIHRoZXJlZm9yZQotCQkgKiBjb3B5IHRoZSByZXF1aXJlZCBkYXRhIGJlZm9yZSBzZW5kaW5nICovCi0JCWJhdG1hbl9pZiA9IG9yaWdfbm9kZS0+cm91dGVyLT5pZl9pbmNvbWluZzsKLQkJbWVtY3B5KGRzdGFkZHIsIG9yaWdfbm9kZS0+cm91dGVyLT5hZGRyLCBFVEhfQUxFTik7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJhdF9wcml2LT5vcmlnX2hhc2hfbG9jaywgZmxhZ3MpOwotCi0JCS8qIGNyZWF0ZSBhIGNvcHkgb2YgdGhlIHNrYiwgaWYgbmVlZGVkLCB0byBtb2RpZnkgaXQuICovCi0JCWlmIChza2JfY293KHNrYiwgc2l6ZW9mKHN0cnVjdCBldGhoZHIpKSA8IDApCi0JCQlyZXR1cm4gTkVUX1JYX0RST1A7Ci0KLQkJaWNtcF9wYWNrZXQgPSAoc3RydWN0IGljbXBfcGFja2V0X3JyICopc2tiLT5kYXRhOwotCQlldGhoZHIgPSAoc3RydWN0IGV0aGhkciAqKXNrYl9tYWNfaGVhZGVyKHNrYik7Ci0KLQkJLyogZGVjcmVtZW50IHR0bCAqLwotCQlpY21wX3BhY2tldC0+dHRsLS07Ci0KLQkJLyogcm91dGUgaXQgKi8KLQkJc2VuZF9za2JfcGFja2V0KHNrYiwgYmF0bWFuX2lmLCBkc3RhZGRyKTsKLQkJcmV0ID0gTkVUX1JYX1NVQ0NFU1M7Ci0KLQl9IGVsc2UKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmF0X3ByaXYtPm9yaWdfaGFzaF9sb2NrLCBmbGFncyk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi0vKiBmaW5kIGEgc3VpdGFibGUgcm91dGVyIGZvciB0aGlzIG9yaWdpbmF0b3IsIGFuZCB1c2UKLSAqIGJvbmRpbmcgaWYgcG9zc2libGUuICovCi1zdHJ1Y3QgbmVpZ2hfbm9kZSAqZmluZF9yb3V0ZXIoc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiwKLQkJCSAgICAgICBzdHJ1Y3Qgb3JpZ19ub2RlICpvcmlnX25vZGUsCi0JCQkgICAgICAgc3RydWN0IGJhdG1hbl9pZiAqcmVjdl9pZikKLXsKLQlzdHJ1Y3Qgb3JpZ19ub2RlICpwcmltYXJ5X29yaWdfbm9kZTsKLQlzdHJ1Y3Qgb3JpZ19ub2RlICpyb3V0ZXJfb3JpZzsKLQlzdHJ1Y3QgbmVpZ2hfbm9kZSAqcm91dGVyLCAqZmlyc3RfY2FuZGlkYXRlLCAqYmVzdF9yb3V0ZXI7Ci0Jc3RhdGljIHVpbnQ4X3QgemVyb19tYWNbRVRIX0FMRU5dID0gezAsIDAsIDAsIDAsIDAsIDB9OwotCWludCBib25kaW5nX2VuYWJsZWQ7Ci0KLQlpZiAoIW9yaWdfbm9kZSkKLQkJcmV0dXJuIE5VTEw7Ci0KLQlpZiAoIW9yaWdfbm9kZS0+cm91dGVyKQotCQlyZXR1cm4gTlVMTDsKLQotCS8qIHdpdGhvdXQgYm9uZGluZywgdGhlIGZpcnN0IG5vZGUgc2hvdWxkCi0JICogYWx3YXlzIGNob29zZSB0aGUgZGVmYXVsdCByb3V0ZXIuICovCi0KLQlib25kaW5nX2VuYWJsZWQgPSBhdG9taWNfcmVhZCgmYmF0X3ByaXYtPmJvbmRpbmdfZW5hYmxlZCk7Ci0KLQlpZiAoKCFyZWN2X2lmKSAmJiAoIWJvbmRpbmdfZW5hYmxlZCkpCi0JCXJldHVybiBvcmlnX25vZGUtPnJvdXRlcjsKLQotCXJvdXRlcl9vcmlnID0gb3JpZ19ub2RlLT5yb3V0ZXItPm9yaWdfbm9kZTsKLQotCS8qIGlmIHdlIGhhdmUgc29tZXRoaW5nIGluIHRoZSBwcmltYXJ5X2FkZHIsIHdlIGNhbiBzZWFyY2gKLQkgKiBmb3IgYSBwb3RlbnRpYWwgYm9uZGluZyBjYW5kaWRhdGUuICovCi0JaWYgKG1lbWNtcChyb3V0ZXJfb3JpZy0+cHJpbWFyeV9hZGRyLCB6ZXJvX21hYywgRVRIX0FMRU4pID09IDApCi0JCXJldHVybiBvcmlnX25vZGUtPnJvdXRlcjsKLQotCS8qIGZpbmQgdGhlIG9yaWdfbm9kZSB3aGljaCBoYXMgdGhlIHByaW1hcnkgaW50ZXJmYWNlLiBtaWdodAotCSAqIGV2ZW4gYmUgdGhlIHNhbWUgYXMgb3VyIHJvdXRlcl9vcmlnIGluIG1hbnkgY2FzZXMgKi8KLQotCWlmIChtZW1jbXAocm91dGVyX29yaWctPnByaW1hcnlfYWRkciwKLQkJCQlyb3V0ZXJfb3JpZy0+b3JpZywgRVRIX0FMRU4pID09IDApIHsKLQkJcHJpbWFyeV9vcmlnX25vZGUgPSByb3V0ZXJfb3JpZzsKLQl9IGVsc2UgewotCQlwcmltYXJ5X29yaWdfbm9kZSA9IGhhc2hfZmluZChiYXRfcHJpdi0+b3JpZ19oYXNoLAotCQkJCQkJcm91dGVyX29yaWctPnByaW1hcnlfYWRkcik7Ci0KLQkJaWYgKCFwcmltYXJ5X29yaWdfbm9kZSkKLQkJCXJldHVybiBvcmlnX25vZGUtPnJvdXRlcjsKLQl9Ci0KLQkvKiB3aXRoIGxlc3MgdGhhbiAyIGNhbmRpZGF0ZXMsIHdlIGNhbid0IGRvIGFueQotCSAqIGJvbmRpbmcgYW5kIHByZWZlciB0aGUgb3JpZ2luYWwgcm91dGVyLiAqLwotCi0JaWYgKHByaW1hcnlfb3JpZ19ub2RlLT5ib25kLmNhbmRpZGF0ZXMgPCAyKQotCQlyZXR1cm4gb3JpZ19ub2RlLT5yb3V0ZXI7Ci0KLQotCS8qIGFsbCBub2RlcyBiZXR3ZWVuIHNob3VsZCBjaG9vc2UgYSBjYW5kaWRhdGUgd2hpY2gKLQkgKiBpcyBpcyBub3Qgb24gdGhlIGludGVyZmFjZSB3aGVyZSB0aGUgcGFja2V0IGNhbWUKLQkgKiBpbi4gKi8KLQlmaXJzdF9jYW5kaWRhdGUgPSBwcmltYXJ5X29yaWdfbm9kZS0+Ym9uZC5zZWxlY3RlZDsKLQlyb3V0ZXIgPSBmaXJzdF9jYW5kaWRhdGU7Ci0KLQlpZiAoYm9uZGluZ19lbmFibGVkKSB7Ci0JCS8qIGluIHRoZSBib25kaW5nIGNhc2UsIHNlbmQgdGhlIHBhY2tldHMgaW4gYSByb3VuZAotCQkgKiByb2JpbiBmYXNoaW9uIG92ZXIgdGhlIHJlbWFpbmluZyBpbnRlcmZhY2VzLiAqLwotCQlkbyB7Ci0JCQkvKiByZWN2X2lmID09IE5VTEwgb24gdGhlIGZpcnN0IG5vZGUuICovCi0JCQlpZiAocm91dGVyLT5pZl9pbmNvbWluZyAhPSByZWN2X2lmKQotCQkJCWJyZWFrOwotCi0JCQlyb3V0ZXIgPSByb3V0ZXItPm5leHRfYm9uZF9jYW5kaWRhdGU7Ci0JCX0gd2hpbGUgKHJvdXRlciAhPSBmaXJzdF9jYW5kaWRhdGUpOwotCi0JCXByaW1hcnlfb3JpZ19ub2RlLT5ib25kLnNlbGVjdGVkID0gcm91dGVyLT5uZXh0X2JvbmRfY2FuZGlkYXRlOwotCi0JfSBlbHNlIHsKLQkJLyogaWYgYm9uZGluZyBpcyBkaXNhYmxlZCwgdXNlIHRoZSBiZXN0IG9mIHRoZQotCQkgKiByZW1haW5pbmcgY2FuZGlkYXRlcyB3aGljaCBhcmUgbm90IHVzaW5nCi0JCSAqIHRoaXMgaW50ZXJmYWNlLiAqLwotCQliZXN0X3JvdXRlciA9IGZpcnN0X2NhbmRpZGF0ZTsKLQotCQlkbyB7Ci0JCQkvKiByZWN2X2lmID09IE5VTEwgb24gdGhlIGZpcnN0IG5vZGUuICovCi0JCQlpZiAoKHJvdXRlci0+aWZfaW5jb21pbmcgIT0gcmVjdl9pZikgJiYKLQkJCQkocm91dGVyLT50cV9hdmcgPiBiZXN0X3JvdXRlci0+dHFfYXZnKSkKLQkJCQkJYmVzdF9yb3V0ZXIgPSByb3V0ZXI7Ci0KLQkJCXJvdXRlciA9IHJvdXRlci0+bmV4dF9ib25kX2NhbmRpZGF0ZTsKLQkJfSB3aGlsZSAocm91dGVyICE9IGZpcnN0X2NhbmRpZGF0ZSk7Ci0KLQkJcm91dGVyID0gYmVzdF9yb3V0ZXI7Ci0JfQotCi0JcmV0dXJuIHJvdXRlcjsKLX0KLQotc3RhdGljIGludCBjaGVja191bmljYXN0X3BhY2tldChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgaGRyX3NpemUpCi17Ci0Jc3RydWN0IGV0aGhkciAqZXRoaGRyOwotCi0JLyogZHJvcCBwYWNrZXQgaWYgaXQgaGFzIG5vdCBuZWNlc3NhcnkgbWluaW11bSBzaXplICovCi0JaWYgKHVubGlrZWx5KCFwc2tiX21heV9wdWxsKHNrYiwgaGRyX3NpemUpKSkKLQkJcmV0dXJuIC0xOwotCi0JZXRoaGRyID0gKHN0cnVjdCBldGhoZHIgKilza2JfbWFjX2hlYWRlcihza2IpOwotCi0JLyogcGFja2V0IHdpdGggdW5pY2FzdCBpbmRpY2F0aW9uIGJ1dCBicm9hZGNhc3QgcmVjaXBpZW50ICovCi0JaWYgKGlzX2JjYXN0KGV0aGhkci0+aF9kZXN0KSkKLQkJcmV0dXJuIC0xOwotCi0JLyogcGFja2V0IHdpdGggYnJvYWRjYXN0IHNlbmRlciBhZGRyZXNzICovCi0JaWYgKGlzX2JjYXN0KGV0aGhkci0+aF9zb3VyY2UpKQotCQlyZXR1cm4gLTE7Ci0KLQkvKiBub3QgZm9yIG1lICovCi0JaWYgKCFpc19teV9tYWMoZXRoaGRyLT5oX2Rlc3QpKQotCQlyZXR1cm4gLTE7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCByb3V0ZV91bmljYXN0X3BhY2tldChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJCXN0cnVjdCBiYXRtYW5faWYgKnJlY3ZfaWYsIGludCBoZHJfc2l6ZSkKLXsKLQlzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2ID0gbmV0ZGV2X3ByaXYocmVjdl9pZi0+c29mdF9pZmFjZSk7Ci0Jc3RydWN0IG9yaWdfbm9kZSAqb3JpZ19ub2RlOwotCXN0cnVjdCBuZWlnaF9ub2RlICpyb3V0ZXI7Ci0Jc3RydWN0IGJhdG1hbl9pZiAqYmF0bWFuX2lmOwotCXVpbnQ4X3QgZHN0YWRkcltFVEhfQUxFTl07Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzdHJ1Y3QgdW5pY2FzdF9wYWNrZXQgKnVuaWNhc3RfcGFja2V0OwotCXN0cnVjdCBldGhoZHIgKmV0aGhkciA9IChzdHJ1Y3QgZXRoaGRyICopc2tiX21hY19oZWFkZXIoc2tiKTsKLQotCXVuaWNhc3RfcGFja2V0ID0gKHN0cnVjdCB1bmljYXN0X3BhY2tldCAqKXNrYi0+ZGF0YTsKLQotCS8qIHBhY2tldCBmb3IgbWUgKi8KLQlpZiAoaXNfbXlfbWFjKHVuaWNhc3RfcGFja2V0LT5kZXN0KSkgewotCQlpbnRlcmZhY2VfcngocmVjdl9pZi0+c29mdF9pZmFjZSwgc2tiLCBoZHJfc2l6ZSk7Ci0JCXJldHVybiBORVRfUlhfU1VDQ0VTUzsKLQl9Ci0KLQkvKiBUVEwgZXhjZWVkZWQgKi8KLQlpZiAodW5pY2FzdF9wYWNrZXQtPnR0bCA8IDIpIHsKLQkJcHJfZGVidWcoIldhcm5pbmcgLSBjYW4ndCBmb3J3YXJkIHVuaWNhc3QgcGFja2V0IGZyb20gJXBNIHRvICIKLQkJCSAiJXBNOiB0dGwgZXhjZWVkZWRcbiIsIGV0aGhkci0+aF9zb3VyY2UsCi0JCQkgdW5pY2FzdF9wYWNrZXQtPmRlc3QpOwotCQlyZXR1cm4gTkVUX1JYX0RST1A7Ci0JfQotCi0JLyogZ2V0IHJvdXRpbmcgaW5mb3JtYXRpb24gKi8KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYmF0X3ByaXYtPm9yaWdfaGFzaF9sb2NrLCBmbGFncyk7Ci0Jb3JpZ19ub2RlID0gKChzdHJ1Y3Qgb3JpZ19ub2RlICopCi0JCSAgICAgaGFzaF9maW5kKGJhdF9wcml2LT5vcmlnX2hhc2gsIHVuaWNhc3RfcGFja2V0LT5kZXN0KSk7Ci0KLQlyb3V0ZXIgPSBmaW5kX3JvdXRlcihiYXRfcHJpdiwgb3JpZ19ub2RlLCByZWN2X2lmKTsKLQotCWlmICghcm91dGVyKSB7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJhdF9wcml2LT5vcmlnX2hhc2hfbG9jaywgZmxhZ3MpOwotCQlyZXR1cm4gTkVUX1JYX0RST1A7Ci0JfQotCi0JLyogZG9uJ3QgbG9jayB3aGlsZSBzZW5kaW5nIHRoZSBwYWNrZXRzIC4uLiB3ZSB0aGVyZWZvcmUKLQkgKiBjb3B5IHRoZSByZXF1aXJlZCBkYXRhIGJlZm9yZSBzZW5kaW5nICovCi0KLQliYXRtYW5faWYgPSByb3V0ZXItPmlmX2luY29taW5nOwotCW1lbWNweShkc3RhZGRyLCByb3V0ZXItPmFkZHIsIEVUSF9BTEVOKTsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJhdF9wcml2LT5vcmlnX2hhc2hfbG9jaywgZmxhZ3MpOwotCi0JLyogY3JlYXRlIGEgY29weSBvZiB0aGUgc2tiLCBpZiBuZWVkZWQsIHRvIG1vZGlmeSBpdC4gKi8KLQlpZiAoc2tiX2Nvdyhza2IsIHNpemVvZihzdHJ1Y3QgZXRoaGRyKSkgPCAwKQotCQlyZXR1cm4gTkVUX1JYX0RST1A7Ci0KLQl1bmljYXN0X3BhY2tldCA9IChzdHJ1Y3QgdW5pY2FzdF9wYWNrZXQgKilza2ItPmRhdGE7Ci0JZXRoaGRyID0gKHN0cnVjdCBldGhoZHIgKilza2JfbWFjX2hlYWRlcihza2IpOwotCi0JLyogZGVjcmVtZW50IHR0bCAqLwotCXVuaWNhc3RfcGFja2V0LT50dGwtLTsKLQotCS8qIHJvdXRlIGl0ICovCi0Jc2VuZF9za2JfcGFja2V0KHNrYiwgYmF0bWFuX2lmLCBkc3RhZGRyKTsKLQotCXJldHVybiBORVRfUlhfU1VDQ0VTUzsKLX0KLQotaW50IHJlY3ZfdW5pY2FzdF9wYWNrZXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGJhdG1hbl9pZiAqcmVjdl9pZikKLXsKLQlzdHJ1Y3QgdW5pY2FzdF9wYWNrZXQgKnVuaWNhc3RfcGFja2V0OwotCWludCBoZHJfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgdW5pY2FzdF9wYWNrZXQpOwotCi0JaWYgKGNoZWNrX3VuaWNhc3RfcGFja2V0KHNrYiwgaGRyX3NpemUpIDwgMCkKLQkJcmV0dXJuIE5FVF9SWF9EUk9QOwotCi0JdW5pY2FzdF9wYWNrZXQgPSAoc3RydWN0IHVuaWNhc3RfcGFja2V0ICopc2tiLT5kYXRhOwotCi0JLyogcGFja2V0IGZvciBtZSAqLwotCWlmIChpc19teV9tYWModW5pY2FzdF9wYWNrZXQtPmRlc3QpKSB7Ci0JCWludGVyZmFjZV9yeChyZWN2X2lmLT5zb2Z0X2lmYWNlLCBza2IsIGhkcl9zaXplKTsKLQkJcmV0dXJuIE5FVF9SWF9TVUNDRVNTOwotCX0KLQotCXJldHVybiByb3V0ZV91bmljYXN0X3BhY2tldChza2IsIHJlY3ZfaWYsIGhkcl9zaXplKTsKLX0KLQotaW50IHJlY3ZfdWNhc3RfZnJhZ19wYWNrZXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGJhdG1hbl9pZiAqcmVjdl9pZikKLXsKLQlzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2ID0gbmV0ZGV2X3ByaXYocmVjdl9pZi0+c29mdF9pZmFjZSk7Ci0Jc3RydWN0IHVuaWNhc3RfZnJhZ19wYWNrZXQgKnVuaWNhc3RfcGFja2V0OwotCXN0cnVjdCBvcmlnX25vZGUgKm9yaWdfbm9kZTsKLQlzdHJ1Y3QgZnJhZ19wYWNrZXRfbGlzdF9lbnRyeSAqdG1wX2ZyYWdfZW50cnk7Ci0JaW50IGhkcl9zaXplID0gc2l6ZW9mKHN0cnVjdCB1bmljYXN0X2ZyYWdfcGFja2V0KTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JaWYgKGNoZWNrX3VuaWNhc3RfcGFja2V0KHNrYiwgaGRyX3NpemUpIDwgMCkKLQkJcmV0dXJuIE5FVF9SWF9EUk9QOwotCi0JdW5pY2FzdF9wYWNrZXQgPSAoc3RydWN0IHVuaWNhc3RfZnJhZ19wYWNrZXQgKilza2ItPmRhdGE7Ci0KLQkvKiBwYWNrZXQgZm9yIG1lICovCi0JaWYgKGlzX215X21hYyh1bmljYXN0X3BhY2tldC0+ZGVzdCkpIHsKLQotCQlzcGluX2xvY2tfaXJxc2F2ZSgmYmF0X3ByaXYtPm9yaWdfaGFzaF9sb2NrLCBmbGFncyk7Ci0JCW9yaWdfbm9kZSA9ICgoc3RydWN0IG9yaWdfbm9kZSAqKQotCQkJaGFzaF9maW5kKGJhdF9wcml2LT5vcmlnX2hhc2gsIHVuaWNhc3RfcGFja2V0LT5vcmlnKSk7Ci0KLQkJaWYgKCFvcmlnX25vZGUpIHsKLQkJCXByX2RlYnVnKCJjb3VsZG4ndCBmaW5kIG9yaWcgbm9kZSBmb3IgZnJhZ21lbnRhdGlvblxuIik7Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiYXRfcHJpdi0+b3JpZ19oYXNoX2xvY2ssCi0JCQkJCSAgICAgICBmbGFncyk7Ci0JCQlyZXR1cm4gTkVUX1JYX0RST1A7Ci0JCX0KLQotCQlvcmlnX25vZGUtPmxhc3RfZnJhZ19wYWNrZXQgPSBqaWZmaWVzOwotCi0JCWlmIChsaXN0X2VtcHR5KCZvcmlnX25vZGUtPmZyYWdfbGlzdCkgJiYKLQkJCWNyZWF0ZV9mcmFnX2J1ZmZlcigmb3JpZ19ub2RlLT5mcmFnX2xpc3QpKSB7Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiYXRfcHJpdi0+b3JpZ19oYXNoX2xvY2ssCi0JCQkJCSAgICAgICBmbGFncyk7Ci0JCQlyZXR1cm4gTkVUX1JYX0RST1A7Ci0JCX0KLQotCQl0bXBfZnJhZ19lbnRyeSA9Ci0JCQlzZWFyY2hfZnJhZ19wYWNrZXQoJm9yaWdfbm9kZS0+ZnJhZ19saXN0LAotCQkJCQkgICB1bmljYXN0X3BhY2tldCk7Ci0KLQkJaWYgKCF0bXBfZnJhZ19lbnRyeSkgewotCQkJY3JlYXRlX2ZyYWdfZW50cnkoJm9yaWdfbm9kZS0+ZnJhZ19saXN0LCBza2IpOwotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmF0X3ByaXYtPm9yaWdfaGFzaF9sb2NrLAotCQkJCQkgICAgICAgZmxhZ3MpOwotCQkJcmV0dXJuIE5FVF9SWF9TVUNDRVNTOwotCQl9Ci0KLQkJc2tiID0gbWVyZ2VfZnJhZ19wYWNrZXQoJm9yaWdfbm9kZS0+ZnJhZ19saXN0LAotCQkJCQl0bXBfZnJhZ19lbnRyeSwgc2tiKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmF0X3ByaXYtPm9yaWdfaGFzaF9sb2NrLCBmbGFncyk7Ci0JCWlmICghc2tiKQotCQkJcmV0dXJuIE5FVF9SWF9EUk9QOwotCi0JCWludGVyZmFjZV9yeChyZWN2X2lmLT5zb2Z0X2lmYWNlLCBza2IsIGhkcl9zaXplKTsKLQkJcmV0dXJuIE5FVF9SWF9TVUNDRVNTOwotCX0KLQotCXJldHVybiByb3V0ZV91bmljYXN0X3BhY2tldChza2IsIHJlY3ZfaWYsIGhkcl9zaXplKTsKLX0KLQotCi1pbnQgcmVjdl9iY2FzdF9wYWNrZXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGJhdG1hbl9pZiAqcmVjdl9pZikKLXsKLQlzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2ID0gbmV0ZGV2X3ByaXYocmVjdl9pZi0+c29mdF9pZmFjZSk7Ci0Jc3RydWN0IG9yaWdfbm9kZSAqb3JpZ19ub2RlOwotCXN0cnVjdCBiY2FzdF9wYWNrZXQgKmJjYXN0X3BhY2tldDsKLQlzdHJ1Y3QgZXRoaGRyICpldGhoZHI7Ci0JaW50IGhkcl9zaXplID0gc2l6ZW9mKHN0cnVjdCBiY2FzdF9wYWNrZXQpOwotCWludDMyX3Qgc2VxX2RpZmY7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCS8qIGRyb3AgcGFja2V0IGlmIGl0IGhhcyBub3QgbmVjZXNzYXJ5IG1pbmltdW0gc2l6ZSAqLwotCWlmICh1bmxpa2VseSghcHNrYl9tYXlfcHVsbChza2IsIGhkcl9zaXplKSkpCi0JCXJldHVybiBORVRfUlhfRFJPUDsKLQotCWV0aGhkciA9IChzdHJ1Y3QgZXRoaGRyICopc2tiX21hY19oZWFkZXIoc2tiKTsKLQotCS8qIHBhY2tldCB3aXRoIGJyb2FkY2FzdCBpbmRpY2F0aW9uIGJ1dCB1bmljYXN0IHJlY2lwaWVudCAqLwotCWlmICghaXNfYmNhc3QoZXRoaGRyLT5oX2Rlc3QpKQotCQlyZXR1cm4gTkVUX1JYX0RST1A7Ci0KLQkvKiBwYWNrZXQgd2l0aCBicm9hZGNhc3Qgc2VuZGVyIGFkZHJlc3MgKi8KLQlpZiAoaXNfYmNhc3QoZXRoaGRyLT5oX3NvdXJjZSkpCi0JCXJldHVybiBORVRfUlhfRFJPUDsKLQotCS8qIGlnbm9yZSBicm9hZGNhc3RzIHNlbnQgYnkgbXlzZWxmICovCi0JaWYgKGlzX215X21hYyhldGhoZHItPmhfc291cmNlKSkKLQkJcmV0dXJuIE5FVF9SWF9EUk9QOwotCi0JYmNhc3RfcGFja2V0ID0gKHN0cnVjdCBiY2FzdF9wYWNrZXQgKilza2ItPmRhdGE7Ci0KLQkvKiBpZ25vcmUgYnJvYWRjYXN0cyBvcmlnaW5hdGVkIGJ5IG15c2VsZiAqLwotCWlmIChpc19teV9tYWMoYmNhc3RfcGFja2V0LT5vcmlnKSkKLQkJcmV0dXJuIE5FVF9SWF9EUk9QOwotCi0JaWYgKGJjYXN0X3BhY2tldC0+dHRsIDwgMikKLQkJcmV0dXJuIE5FVF9SWF9EUk9QOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmJhdF9wcml2LT5vcmlnX2hhc2hfbG9jaywgZmxhZ3MpOwotCW9yaWdfbm9kZSA9ICgoc3RydWN0IG9yaWdfbm9kZSAqKQotCQkgICAgIGhhc2hfZmluZChiYXRfcHJpdi0+b3JpZ19oYXNoLCBiY2FzdF9wYWNrZXQtPm9yaWcpKTsKLQotCWlmIChvcmlnX25vZGUgPT0gTlVMTCkgewotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiYXRfcHJpdi0+b3JpZ19oYXNoX2xvY2ssIGZsYWdzKTsKLQkJcmV0dXJuIE5FVF9SWF9EUk9QOwotCX0KLQotCS8qIGNoZWNrIHdoZXRoZXIgdGhlIHBhY2tldCBpcyBhIGR1cGxpY2F0ZSAqLwotCWlmIChnZXRfYml0X3N0YXR1cyhvcmlnX25vZGUtPmJjYXN0X2JpdHMsCi0JCQkgICBvcmlnX25vZGUtPmxhc3RfYmNhc3Rfc2Vxbm8sCi0JCQkgICBudG9obChiY2FzdF9wYWNrZXQtPnNlcW5vKSkpIHsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmF0X3ByaXYtPm9yaWdfaGFzaF9sb2NrLCBmbGFncyk7Ci0JCXJldHVybiBORVRfUlhfRFJPUDsKLQl9Ci0KLQlzZXFfZGlmZiA9IG50b2hsKGJjYXN0X3BhY2tldC0+c2Vxbm8pIC0gb3JpZ19ub2RlLT5sYXN0X2JjYXN0X3NlcW5vOwotCi0JLyogY2hlY2sgd2hldGhlciB0aGUgcGFja2V0IGlzIG9sZCBhbmQgdGhlIGhvc3QganVzdCByZXN0YXJ0ZWQuICovCi0JaWYgKHdpbmRvd19wcm90ZWN0ZWQoYmF0X3ByaXYsIHNlcV9kaWZmLAotCQkJICAgICAmb3JpZ19ub2RlLT5iY2FzdF9zZXFub19yZXNldCkpIHsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmF0X3ByaXYtPm9yaWdfaGFzaF9sb2NrLCBmbGFncyk7Ci0JCXJldHVybiBORVRfUlhfRFJPUDsKLQl9Ci0KLQkvKiBtYXJrIGJyb2FkY2FzdCBpbiBmbG9vZCBoaXN0b3J5LCB1cGRhdGUgd2luZG93IHBvc2l0aW9uCi0JICogaWYgcmVxdWlyZWQuICovCi0JaWYgKGJpdF9nZXRfcGFja2V0KGJhdF9wcml2LCBvcmlnX25vZGUtPmJjYXN0X2JpdHMsIHNlcV9kaWZmLCAxKSkKLQkJb3JpZ19ub2RlLT5sYXN0X2JjYXN0X3NlcW5vID0gbnRvaGwoYmNhc3RfcGFja2V0LT5zZXFubyk7Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiYXRfcHJpdi0+b3JpZ19oYXNoX2xvY2ssIGZsYWdzKTsKLQkvKiByZWJyb2FkY2FzdCBwYWNrZXQgKi8KLQlhZGRfYmNhc3RfcGFja2V0X3RvX2xpc3QoYmF0X3ByaXYsIHNrYik7Ci0KLQkvKiBicm9hZGNhc3QgZm9yIG1lICovCi0JaW50ZXJmYWNlX3J4KHJlY3ZfaWYtPnNvZnRfaWZhY2UsIHNrYiwgaGRyX3NpemUpOwotCi0JcmV0dXJuIE5FVF9SWF9TVUNDRVNTOwotfQotCi1pbnQgcmVjdl92aXNfcGFja2V0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBiYXRtYW5faWYgKnJlY3ZfaWYpCi17Ci0Jc3RydWN0IHZpc19wYWNrZXQgKnZpc19wYWNrZXQ7Ci0Jc3RydWN0IGV0aGhkciAqZXRoaGRyOwotCXN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYgPSBuZXRkZXZfcHJpdihyZWN2X2lmLT5zb2Z0X2lmYWNlKTsKLQlpbnQgaGRyX3NpemUgPSBzaXplb2Yoc3RydWN0IHZpc19wYWNrZXQpOwotCi0JLyoga2VlcCBza2IgbGluZWFyICovCi0JaWYgKHNrYl9saW5lYXJpemUoc2tiKSA8IDApCi0JCXJldHVybiBORVRfUlhfRFJPUDsKLQotCWlmICh1bmxpa2VseSghcHNrYl9tYXlfcHVsbChza2IsIGhkcl9zaXplKSkpCi0JCXJldHVybiBORVRfUlhfRFJPUDsKLQotCXZpc19wYWNrZXQgPSAoc3RydWN0IHZpc19wYWNrZXQgKilza2ItPmRhdGE7Ci0JZXRoaGRyID0gKHN0cnVjdCBldGhoZHIgKilza2JfbWFjX2hlYWRlcihza2IpOwotCi0JLyogbm90IGZvciBtZSAqLwotCWlmICghaXNfbXlfbWFjKGV0aGhkci0+aF9kZXN0KSkKLQkJcmV0dXJuIE5FVF9SWF9EUk9QOwotCi0JLyogaWdub3JlIG93biBwYWNrZXRzICovCi0JaWYgKGlzX215X21hYyh2aXNfcGFja2V0LT52aXNfb3JpZykpCi0JCXJldHVybiBORVRfUlhfRFJPUDsKLQotCWlmIChpc19teV9tYWModmlzX3BhY2tldC0+c2VuZGVyX29yaWcpKQotCQlyZXR1cm4gTkVUX1JYX0RST1A7Ci0KLQlzd2l0Y2ggKHZpc19wYWNrZXQtPnZpc190eXBlKSB7Ci0JY2FzZSBWSVNfVFlQRV9TRVJWRVJfU1lOQzoKLQkJcmVjZWl2ZV9zZXJ2ZXJfc3luY19wYWNrZXQoYmF0X3ByaXYsIHZpc19wYWNrZXQsCi0JCQkJCSAgIHNrYl9oZWFkbGVuKHNrYikpOwotCQlicmVhazsKLQotCWNhc2UgVklTX1RZUEVfQ0xJRU5UX1VQREFURToKLQkJcmVjZWl2ZV9jbGllbnRfdXBkYXRlX3BhY2tldChiYXRfcHJpdiwgdmlzX3BhY2tldCwKLQkJCQkJICAgICBza2JfaGVhZGxlbihza2IpKTsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgkvKiBpZ25vcmUgdW5rbm93biBwYWNrZXQgKi8KLQkJYnJlYWs7Ci0JfQotCi0JLyogV2UgdGFrZSBhIGNvcHkgb2YgdGhlIGRhdGEgaW4gdGhlIHBhY2tldCwgc28gd2Ugc2hvdWxkCi0JICAgYWx3YXlzIGZyZWUgdGhlIHNrYnVmLiAqLwotCXJldHVybiBORVRfUlhfRFJPUDsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L3JvdXRpbmcuaCBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L3JvdXRpbmcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTI2NzRjOC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9yb3V0aW5nLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgQi5BLlQuTS5BLk4uIGNvbnRyaWJ1dG9yczoKLSAqCi0gKiBNYXJlayBMaW5kbmVyLCBTaW1vbiBXdW5kZXJsaWNoCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCi0gKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCi0gKiAwMjExMC0xMzAxLCBVU0EKLSAqCi0gKi8KLQotI2lmbmRlZiBfTkVUX0JBVE1BTl9BRFZfUk9VVElOR19IXwotI2RlZmluZSBfTkVUX0JBVE1BTl9BRFZfUk9VVElOR19IXwotCi0jaW5jbHVkZSAidHlwZXMuaCIKLQotdm9pZCBzbGlkZV9vd25fYmNhc3Rfd2luZG93KHN0cnVjdCBiYXRtYW5faWYgKmJhdG1hbl9pZik7Ci12b2lkIHJlY2VpdmVfYmF0X3BhY2tldChzdHJ1Y3QgZXRoaGRyICpldGhoZHIsCi0JCQkJc3RydWN0IGJhdG1hbl9wYWNrZXQgKmJhdG1hbl9wYWNrZXQsCi0JCQkJdW5zaWduZWQgY2hhciAqaG5hX2J1ZmYsIGludCBobmFfYnVmZl9sZW4sCi0JCQkJc3RydWN0IGJhdG1hbl9pZiAqaWZfaW5jb21pbmcpOwotdm9pZCB1cGRhdGVfcm91dGVzKHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYsIHN0cnVjdCBvcmlnX25vZGUgKm9yaWdfbm9kZSwKLQkJICAgc3RydWN0IG5laWdoX25vZGUgKm5laWdoX25vZGUsIHVuc2lnbmVkIGNoYXIgKmhuYV9idWZmLAotCQkgICBpbnQgaG5hX2J1ZmZfbGVuKTsKLWludCByZWN2X2ljbXBfcGFja2V0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBiYXRtYW5faWYgKnJlY3ZfaWYpOwotaW50IHJlY3ZfdW5pY2FzdF9wYWNrZXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGJhdG1hbl9pZiAqcmVjdl9pZik7Ci1pbnQgcmVjdl91Y2FzdF9mcmFnX3BhY2tldChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgYmF0bWFuX2lmICpyZWN2X2lmKTsKLWludCByZWN2X2JjYXN0X3BhY2tldChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgYmF0bWFuX2lmICpyZWN2X2lmKTsKLWludCByZWN2X3Zpc19wYWNrZXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGJhdG1hbl9pZiAqcmVjdl9pZik7Ci1pbnQgcmVjdl9iYXRfcGFja2V0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBiYXRtYW5faWYgKnJlY3ZfaWYpOwotc3RydWN0IG5laWdoX25vZGUgKmZpbmRfcm91dGVyKHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYsCi0JCXN0cnVjdCBvcmlnX25vZGUgKm9yaWdfbm9kZSwgc3RydWN0IGJhdG1hbl9pZiAqcmVjdl9pZik7Ci12b2lkIHVwZGF0ZV9ib25kaW5nX2NhbmRpZGF0ZXMoc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiwKLQkJCSAgICAgICBzdHJ1Y3Qgb3JpZ19ub2RlICpvcmlnX25vZGUpOwotCi0jZW5kaWYgLyogX05FVF9CQVRNQU5fQURWX1JPVVRJTkdfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L3NlbmQuYyBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L3NlbmQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2FkZjc2ZC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9zZW5kLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1ODAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIEIuQS5ULk0uQS5OLiBjb250cmlidXRvcnM6Ci0gKgotICogTWFyZWsgTGluZG5lciwgU2ltb24gV3VuZGVybGljaAotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQotICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQotICogMDIxMTAtMTMwMSwgVVNBCi0gKgotICovCi0KLSNpbmNsdWRlICJtYWluLmgiCi0jaW5jbHVkZSAic2VuZC5oIgotI2luY2x1ZGUgInJvdXRpbmcuaCIKLSNpbmNsdWRlICJ0cmFuc2xhdGlvbi10YWJsZS5oIgotI2luY2x1ZGUgInNvZnQtaW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAiaGFyZC1pbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJ0eXBlcy5oIgotI2luY2x1ZGUgInZpcy5oIgotI2luY2x1ZGUgImFnZ3JlZ2F0aW9uLmgiCi0KLQotc3RhdGljIHZvaWQgc2VuZF9vdXRzdGFuZGluZ19iY2FzdF9wYWNrZXQoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKLQotLyogYXBwbHkgaG9wIHBlbmFsdHkgZm9yIGEgbm9ybWFsIGxpbmsgKi8KLXN0YXRpYyB1aW50OF90IGhvcF9wZW5hbHR5KGNvbnN0IHVpbnQ4X3QgdHEpCi17Ci0JcmV0dXJuICh0cSAqIChUUV9NQVhfVkFMVUUgLSBUUV9IT1BfUEVOQUxUWSkpIC8gKFRRX01BWF9WQUxVRSk7Ci19Ci0KLS8qIHdoZW4gZG8gd2Ugc2NoZWR1bGUgb3VyIG93biBwYWNrZXQgdG8gYmUgc2VudCAqLwotc3RhdGljIHVuc2lnbmVkIGxvbmcgb3duX3NlbmRfdGltZShzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2KQotewotCXJldHVybiBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygKLQkJICAgYXRvbWljX3JlYWQoJmJhdF9wcml2LT5vcmlnX2ludGVydmFsKSAtCi0JCSAgIEpJVFRFUiArIChyYW5kb20zMigpICUgMipKSVRURVIpKTsKLX0KLQotLyogd2hlbiBkbyB3ZSBzY2hlZHVsZSBhIGZvcndhcmRlZCBwYWNrZXQgdG8gYmUgc2VudCAqLwotc3RhdGljIHVuc2lnbmVkIGxvbmcgZm9yd2FyZF9zZW5kX3RpbWUoc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdikKLXsKLQlyZXR1cm4gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMocmFuZG9tMzIoKSAlIChKSVRURVIvMikpOwotfQotCi0vKiBzZW5kIG91dCBhbiBhbHJlYWR5IHByZXBhcmVkIHBhY2tldCB0byB0aGUgZ2l2ZW4gYWRkcmVzcyB2aWEgdGhlCi0gKiBzcGVjaWZpZWQgYmF0bWFuIGludGVyZmFjZSAqLwotaW50IHNlbmRfc2tiX3BhY2tldChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJCXN0cnVjdCBiYXRtYW5faWYgKmJhdG1hbl9pZiwKLQkJCQl1aW50OF90ICpkc3RfYWRkcikKLXsKLQlzdHJ1Y3QgZXRoaGRyICpldGhoZHI7Ci0KLQlpZiAoYmF0bWFuX2lmLT5pZl9zdGF0dXMgIT0gSUZfQUNUSVZFKQotCQlnb3RvIHNlbmRfc2tiX2VycjsKLQotCWlmICh1bmxpa2VseSghYmF0bWFuX2lmLT5uZXRfZGV2KSkKLQkJZ290byBzZW5kX3NrYl9lcnI7Ci0KLQlpZiAoIShiYXRtYW5faWYtPm5ldF9kZXYtPmZsYWdzICYgSUZGX1VQKSkgewotCQlwcl93YXJuaW5nKCJJbnRlcmZhY2UgJXMgaXMgbm90IHVwIC0gY2FuJ3Qgc2VuZCBwYWNrZXQgdmlhICIKLQkJCSAgICJ0aGF0IGludGVyZmFjZSFcbiIsIGJhdG1hbl9pZi0+bmV0X2Rldi0+bmFtZSk7Ci0JCWdvdG8gc2VuZF9za2JfZXJyOwotCX0KLQotCS8qIHB1c2ggdG8gdGhlIGV0aGVybmV0IGhlYWRlci4gKi8KLQlpZiAobXlfc2tiX2hlYWRfcHVzaChza2IsIHNpemVvZihzdHJ1Y3QgZXRoaGRyKSkgPCAwKQotCQlnb3RvIHNlbmRfc2tiX2VycjsKLQotCXNrYl9yZXNldF9tYWNfaGVhZGVyKHNrYik7Ci0KLQlldGhoZHIgPSAoc3RydWN0IGV0aGhkciAqKSBza2JfbWFjX2hlYWRlcihza2IpOwotCW1lbWNweShldGhoZHItPmhfc291cmNlLCBiYXRtYW5faWYtPm5ldF9kZXYtPmRldl9hZGRyLCBFVEhfQUxFTik7Ci0JbWVtY3B5KGV0aGhkci0+aF9kZXN0LCBkc3RfYWRkciwgRVRIX0FMRU4pOwotCWV0aGhkci0+aF9wcm90byA9IF9fY29uc3RhbnRfaHRvbnMoRVRIX1BfQkFUTUFOKTsKLQotCXNrYl9zZXRfbmV0d29ya19oZWFkZXIoc2tiLCBFVEhfSExFTik7Ci0Jc2tiLT5wcmlvcml0eSA9IFRDX1BSSU9fQ09OVFJPTDsKLQlza2ItPnByb3RvY29sID0gX19jb25zdGFudF9odG9ucyhFVEhfUF9CQVRNQU4pOwotCi0Jc2tiLT5kZXYgPSBiYXRtYW5faWYtPm5ldF9kZXY7Ci0KLQkvKiBkZXZfcXVldWVfeG1pdCgpIHJldHVybnMgYSBuZWdhdGl2ZSByZXN1bHQgb24gZXJyb3IuCSBIb3dldmVyIG9uCi0JICogY29uZ2VzdGlvbiBhbmQgdHJhZmZpYyBzaGFwaW5nLCBpdCBkcm9wcyBhbmQgcmV0dXJucyBORVRfWE1JVF9EUk9QCi0JICogKHdoaWNoIGlzID4gMCkuIFRoaXMgd2lsbCBub3QgYmUgdHJlYXRlZCBhcyBhbiBlcnJvci4gKi8KLQotCXJldHVybiBkZXZfcXVldWVfeG1pdChza2IpOwotc2VuZF9za2JfZXJyOgotCWtmcmVlX3NrYihza2IpOwotCXJldHVybiBORVRfWE1JVF9EUk9QOwotfQotCi0vKiBTZW5kIGEgcGFja2V0IHRvIGEgZ2l2ZW4gaW50ZXJmYWNlICovCi1zdGF0aWMgdm9pZCBzZW5kX3BhY2tldF90b19pZihzdHJ1Y3QgZm9yd19wYWNrZXQgKmZvcndfcGFja2V0LAotCQkJICAgICAgc3RydWN0IGJhdG1hbl9pZiAqYmF0bWFuX2lmKQotewotCXN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYgPSBuZXRkZXZfcHJpdihiYXRtYW5faWYtPnNvZnRfaWZhY2UpOwotCWNoYXIgKmZ3ZF9zdHI7Ci0JdWludDhfdCBwYWNrZXRfbnVtOwotCWludDE2X3QgYnVmZl9wb3M7Ci0Jc3RydWN0IGJhdG1hbl9wYWNrZXQgKmJhdG1hbl9wYWNrZXQ7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYjsKLQotCWlmIChiYXRtYW5faWYtPmlmX3N0YXR1cyAhPSBJRl9BQ1RJVkUpCi0JCXJldHVybjsKLQotCXBhY2tldF9udW0gPSAwOwotCWJ1ZmZfcG9zID0gMDsKLQliYXRtYW5fcGFja2V0ID0gKHN0cnVjdCBiYXRtYW5fcGFja2V0ICopZm9yd19wYWNrZXQtPnNrYi0+ZGF0YTsKLQotCS8qIGFkanVzdCBhbGwgZmxhZ3MgYW5kIGxvZyBwYWNrZXRzICovCi0Jd2hpbGUgKGFnZ3JlZ2F0ZWRfcGFja2V0KGJ1ZmZfcG9zLAotCQkJCSBmb3J3X3BhY2tldC0+cGFja2V0X2xlbiwKLQkJCQkgYmF0bWFuX3BhY2tldC0+bnVtX2huYSkpIHsKLQotCQkvKiB3ZSBtaWdodCBoYXZlIGFnZ3JlZ2F0ZWQgZGlyZWN0IGxpbmsgcGFja2V0cyB3aXRoIGFuCi0JCSAqIG9yZGluYXJ5IGJhc2UgcGFja2V0ICovCi0JCWlmICgoZm9yd19wYWNrZXQtPmRpcmVjdF9saW5rX2ZsYWdzICYgKDEgPDwgcGFja2V0X251bSkpICYmCi0JCSAgICAoZm9yd19wYWNrZXQtPmlmX2luY29taW5nID09IGJhdG1hbl9pZikpCi0JCQliYXRtYW5fcGFja2V0LT5mbGFncyB8PSBESVJFQ1RMSU5LOwotCQllbHNlCi0JCQliYXRtYW5fcGFja2V0LT5mbGFncyAmPSB+RElSRUNUTElOSzsKLQotCQlmd2Rfc3RyID0gKHBhY2tldF9udW0gPiAwID8gIkZvcndhcmRpbmciIDogKGZvcndfcGFja2V0LT5vd24gPwotCQkJCQkJCSAgICAiU2VuZGluZyBvd24iIDoKLQkJCQkJCQkgICAgIkZvcndhcmRpbmciKSk7Ci0JCWJhdF9kYmcoREJHX0JBVE1BTiwgYmF0X3ByaXYsCi0JCQkiJXMgJXNwYWNrZXQgKG9yaWdpbmF0b3IgJXBNLCBzZXFubyAlZCwgVFEgJWQsIFRUTCAlZCwiCi0JCQkiIElERiAlcykgb24gaW50ZXJmYWNlICVzIFslcE1dXG4iLAotCQkJZndkX3N0ciwgKHBhY2tldF9udW0gPiAwID8gImFnZ3JlZ2F0ZWQgIiA6ICIiKSwKLQkJCWJhdG1hbl9wYWNrZXQtPm9yaWcsIG50b2hsKGJhdG1hbl9wYWNrZXQtPnNlcW5vKSwKLQkJCWJhdG1hbl9wYWNrZXQtPnRxLCBiYXRtYW5fcGFja2V0LT50dGwsCi0JCQkoYmF0bWFuX3BhY2tldC0+ZmxhZ3MgJiBESVJFQ1RMSU5LID8KLQkJCSAib24iIDogIm9mZiIpLAotCQkJYmF0bWFuX2lmLT5uZXRfZGV2LT5uYW1lLCBiYXRtYW5faWYtPm5ldF9kZXYtPmRldl9hZGRyKTsKLQotCQlidWZmX3BvcyArPSBzaXplb2Yoc3RydWN0IGJhdG1hbl9wYWNrZXQpICsKLQkJCShiYXRtYW5fcGFja2V0LT5udW1faG5hICogRVRIX0FMRU4pOwotCQlwYWNrZXRfbnVtKys7Ci0JCWJhdG1hbl9wYWNrZXQgPSAoc3RydWN0IGJhdG1hbl9wYWNrZXQgKikKLQkJCShmb3J3X3BhY2tldC0+c2tiLT5kYXRhICsgYnVmZl9wb3MpOwotCX0KLQotCS8qIGNyZWF0ZSBjbG9uZSBiZWNhdXNlIGZ1bmN0aW9uIGlzIGNhbGxlZCBtb3JlIHRoYW4gb25jZSAqLwotCXNrYiA9IHNrYl9jbG9uZShmb3J3X3BhY2tldC0+c2tiLCBHRlBfQVRPTUlDKTsKLQlpZiAoc2tiKQotCQlzZW5kX3NrYl9wYWNrZXQoc2tiLCBiYXRtYW5faWYsIGJyb2FkY2FzdF9hZGRyKTsKLX0KLQotLyogc2VuZCBhIGJhdG1hbiBwYWNrZXQgKi8KLXN0YXRpYyB2b2lkIHNlbmRfcGFja2V0KHN0cnVjdCBmb3J3X3BhY2tldCAqZm9yd19wYWNrZXQpCi17Ci0Jc3RydWN0IGJhdG1hbl9pZiAqYmF0bWFuX2lmOwotCXN0cnVjdCBuZXRfZGV2aWNlICpzb2Z0X2lmYWNlOwotCXN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXY7Ci0Jc3RydWN0IGJhdG1hbl9wYWNrZXQgKmJhdG1hbl9wYWNrZXQgPQotCQkoc3RydWN0IGJhdG1hbl9wYWNrZXQgKikoZm9yd19wYWNrZXQtPnNrYi0+ZGF0YSk7Ci0JdW5zaWduZWQgY2hhciBkaXJlY3RsaW5rID0gKGJhdG1hbl9wYWNrZXQtPmZsYWdzICYgRElSRUNUTElOSyA/IDEgOiAwKTsKLQotCWlmICghZm9yd19wYWNrZXQtPmlmX2luY29taW5nKSB7Ci0JCXByX2VycigiRXJyb3IgLSBjYW4ndCBmb3J3YXJkIHBhY2tldDogaW5jb21pbmcgaWZhY2Ugbm90ICIKLQkJICAgICAgICJzcGVjaWZpZWRcbiIpOwotCQlyZXR1cm47Ci0JfQotCi0Jc29mdF9pZmFjZSA9IGZvcndfcGFja2V0LT5pZl9pbmNvbWluZy0+c29mdF9pZmFjZTsKLQliYXRfcHJpdiA9IG5ldGRldl9wcml2KHNvZnRfaWZhY2UpOwotCi0JaWYgKGZvcndfcGFja2V0LT5pZl9pbmNvbWluZy0+aWZfc3RhdHVzICE9IElGX0FDVElWRSkKLQkJcmV0dXJuOwotCi0JLyogbXVsdGlob21lZCBwZWVyIGFzc3VtZWQgKi8KLQkvKiBub24tcHJpbWFyeSBPR01zIGFyZSBvbmx5IGJyb2FkY2FzdGVkIG9uIHRoZWlyIGludGVyZmFjZSAqLwotCWlmICgoZGlyZWN0bGluayAmJiAoYmF0bWFuX3BhY2tldC0+dHRsID09IDEpKSB8fAotCSAgICAoZm9yd19wYWNrZXQtPm93biAmJiAoZm9yd19wYWNrZXQtPmlmX2luY29taW5nLT5pZl9udW0gPiAwKSkpIHsKLQotCQkvKiBGSVhNRTogd2hhdCBhYm91dCBhZ2dyZWdhdGVkIHBhY2tldHMgPyAqLwotCQliYXRfZGJnKERCR19CQVRNQU4sIGJhdF9wcml2LAotCQkJIiVzIHBhY2tldCAob3JpZ2luYXRvciAlcE0sIHNlcW5vICVkLCBUVEwgJWQpICIKLQkJCSJvbiBpbnRlcmZhY2UgJXMgWyVwTV1cbiIsCi0JCQkoZm9yd19wYWNrZXQtPm93biA/ICJTZW5kaW5nIG93biIgOiAiRm9yd2FyZGluZyIpLAotCQkJYmF0bWFuX3BhY2tldC0+b3JpZywgbnRvaGwoYmF0bWFuX3BhY2tldC0+c2Vxbm8pLAotCQkJYmF0bWFuX3BhY2tldC0+dHRsLAotCQkJZm9yd19wYWNrZXQtPmlmX2luY29taW5nLT5uZXRfZGV2LT5uYW1lLAotCQkJZm9yd19wYWNrZXQtPmlmX2luY29taW5nLT5uZXRfZGV2LT5kZXZfYWRkcik7Ci0KLQkJLyogc2tiIGlzIG9ubHkgdXNlZCBvbmNlIGFuZCB0aGFuIGZvcndfcGFja2V0IGlzIGZyZWUnZCAqLwotCQlzZW5kX3NrYl9wYWNrZXQoZm9yd19wYWNrZXQtPnNrYiwgZm9yd19wYWNrZXQtPmlmX2luY29taW5nLAotCQkJCWJyb2FkY2FzdF9hZGRyKTsKLQkJZm9yd19wYWNrZXQtPnNrYiA9IE5VTEw7Ci0KLQkJcmV0dXJuOwotCX0KLQotCS8qIGJyb2FkY2FzdCBvbiBldmVyeSBpbnRlcmZhY2UgKi8KLQlyY3VfcmVhZF9sb2NrKCk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UoYmF0bWFuX2lmLCAmaWZfbGlzdCwgbGlzdCkgewotCQlpZiAoYmF0bWFuX2lmLT5zb2Z0X2lmYWNlICE9IHNvZnRfaWZhY2UpCi0JCQljb250aW51ZTsKLQotCQlzZW5kX3BhY2tldF90b19pZihmb3J3X3BhY2tldCwgYmF0bWFuX2lmKTsKLQl9Ci0JcmN1X3JlYWRfdW5sb2NrKCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHJlYnVpbGRfYmF0bWFuX3BhY2tldChzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2LAotCQkJCSAgc3RydWN0IGJhdG1hbl9pZiAqYmF0bWFuX2lmKQotewotCWludCBuZXdfbGVuOwotCXVuc2lnbmVkIGNoYXIgKm5ld19idWZmOwotCXN0cnVjdCBiYXRtYW5fcGFja2V0ICpiYXRtYW5fcGFja2V0OwotCi0JbmV3X2xlbiA9IHNpemVvZihzdHJ1Y3QgYmF0bWFuX3BhY2tldCkgKwotCQkJKGJhdF9wcml2LT5udW1fbG9jYWxfaG5hICogRVRIX0FMRU4pOwotCW5ld19idWZmID0ga21hbGxvYyhuZXdfbGVuLCBHRlBfQVRPTUlDKTsKLQotCS8qIGtlZXAgb2xkIGJ1ZmZlciBpZiBrbWFsbG9jIHNob3VsZCBmYWlsICovCi0JaWYgKG5ld19idWZmKSB7Ci0JCW1lbWNweShuZXdfYnVmZiwgYmF0bWFuX2lmLT5wYWNrZXRfYnVmZiwKLQkJICAgICAgIHNpemVvZihzdHJ1Y3QgYmF0bWFuX3BhY2tldCkpOwotCQliYXRtYW5fcGFja2V0ID0gKHN0cnVjdCBiYXRtYW5fcGFja2V0ICopbmV3X2J1ZmY7Ci0KLQkJYmF0bWFuX3BhY2tldC0+bnVtX2huYSA9IGhuYV9sb2NhbF9maWxsX2J1ZmZlcihiYXRfcHJpdiwKLQkJCQluZXdfYnVmZiArIHNpemVvZihzdHJ1Y3QgYmF0bWFuX3BhY2tldCksCi0JCQkJbmV3X2xlbiAtIHNpemVvZihzdHJ1Y3QgYmF0bWFuX3BhY2tldCkpOwotCi0JCWtmcmVlKGJhdG1hbl9pZi0+cGFja2V0X2J1ZmYpOwotCQliYXRtYW5faWYtPnBhY2tldF9idWZmID0gbmV3X2J1ZmY7Ci0JCWJhdG1hbl9pZi0+cGFja2V0X2xlbiA9IG5ld19sZW47Ci0JfQotfQotCi12b2lkIHNjaGVkdWxlX293bl9wYWNrZXQoc3RydWN0IGJhdG1hbl9pZiAqYmF0bWFuX2lmKQotewotCXN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYgPSBuZXRkZXZfcHJpdihiYXRtYW5faWYtPnNvZnRfaWZhY2UpOwotCXVuc2lnbmVkIGxvbmcgc2VuZF90aW1lOwotCXN0cnVjdCBiYXRtYW5fcGFja2V0ICpiYXRtYW5fcGFja2V0OwotCWludCB2aXNfc2VydmVyOwotCi0JaWYgKChiYXRtYW5faWYtPmlmX3N0YXR1cyA9PSBJRl9OT1RfSU5fVVNFKSB8fAotCSAgICAoYmF0bWFuX2lmLT5pZl9zdGF0dXMgPT0gSUZfVE9fQkVfUkVNT1ZFRCkpCi0JCXJldHVybjsKLQotCXZpc19zZXJ2ZXIgPSBhdG9taWNfcmVhZCgmYmF0X3ByaXYtPnZpc19tb2RlKTsKLQotCS8qKgotCSAqIHRoZSBpbnRlcmZhY2UgZ2V0cyBhY3RpdmF0ZWQgaGVyZSB0byBhdm9pZCByYWNlIGNvbmRpdGlvbnMgYmV0d2VlbgotCSAqIHRoZSBtb21lbnQgb2YgYWN0aXZhdGluZyB0aGUgaW50ZXJmYWNlIGluCi0JICogaGFyZGlmX2FjdGl2YXRlX2ludGVyZmFjZSgpIHdoZXJlIHRoZSBvcmlnaW5hdG9yIG1hYyBpcyBzZXQgYW5kCi0JICogb3V0ZGF0ZWQgcGFja2V0cyAoZXNwZWNpYWxseSB1bmluaXRpYWxpemVkIG1hYyBhZGRyZXNzZXMpIGluIHRoZQotCSAqIHBhY2tldCBxdWV1ZQotCSAqLwotCWlmIChiYXRtYW5faWYtPmlmX3N0YXR1cyA9PSBJRl9UT19CRV9BQ1RJVkFURUQpCi0JCWJhdG1hbl9pZi0+aWZfc3RhdHVzID0gSUZfQUNUSVZFOwotCi0JLyogaWYgbG9jYWwgaG5hIGhhcyBjaGFuZ2VkIGFuZCBpbnRlcmZhY2UgaXMgYSBwcmltYXJ5IGludGVyZmFjZSAqLwotCWlmICgoYXRvbWljX3JlYWQoJmJhdF9wcml2LT5obmFfbG9jYWxfY2hhbmdlZCkpICYmCi0JICAgIChiYXRtYW5faWYgPT0gYmF0X3ByaXYtPnByaW1hcnlfaWYpKQotCQlyZWJ1aWxkX2JhdG1hbl9wYWNrZXQoYmF0X3ByaXYsIGJhdG1hbl9pZik7Ci0KLQkvKioKLQkgKiBOT1RFOiBwYWNrZXRfYnVmZiBtaWdodCBqdXN0IGhhdmUgYmVlbiByZS1hbGxvY2F0ZWQgaW4KLQkgKiByZWJ1aWxkX2JhdG1hbl9wYWNrZXQoKQotCSAqLwotCWJhdG1hbl9wYWNrZXQgPSAoc3RydWN0IGJhdG1hbl9wYWNrZXQgKiliYXRtYW5faWYtPnBhY2tldF9idWZmOwotCi0JLyogY2hhbmdlIHNlcXVlbmNlIG51bWJlciB0byBuZXR3b3JrIG9yZGVyICovCi0JYmF0bWFuX3BhY2tldC0+c2Vxbm8gPQotCQlodG9ubCgodWludDMyX3QpYXRvbWljX3JlYWQoJmJhdG1hbl9pZi0+c2Vxbm8pKTsKLQotCWlmICh2aXNfc2VydmVyID09IFZJU19UWVBFX1NFUlZFUl9TWU5DKQotCQliYXRtYW5fcGFja2V0LT5mbGFncyB8PSBWSVNfU0VSVkVSOwotCWVsc2UKLQkJYmF0bWFuX3BhY2tldC0+ZmxhZ3MgJj0gflZJU19TRVJWRVI7Ci0KLQlhdG9taWNfaW5jKCZiYXRtYW5faWYtPnNlcW5vKTsKLQotCXNsaWRlX293bl9iY2FzdF93aW5kb3coYmF0bWFuX2lmKTsKLQlzZW5kX3RpbWUgPSBvd25fc2VuZF90aW1lKGJhdF9wcml2KTsKLQlhZGRfYmF0X3BhY2tldF90b19saXN0KGJhdF9wcml2LAotCQkJICAgICAgIGJhdG1hbl9pZi0+cGFja2V0X2J1ZmYsCi0JCQkgICAgICAgYmF0bWFuX2lmLT5wYWNrZXRfbGVuLAotCQkJICAgICAgIGJhdG1hbl9pZiwgMSwgc2VuZF90aW1lKTsKLX0KLQotdm9pZCBzY2hlZHVsZV9mb3J3YXJkX3BhY2tldChzdHJ1Y3Qgb3JpZ19ub2RlICpvcmlnX25vZGUsCi0JCQkgICAgIHN0cnVjdCBldGhoZHIgKmV0aGhkciwKLQkJCSAgICAgc3RydWN0IGJhdG1hbl9wYWNrZXQgKmJhdG1hbl9wYWNrZXQsCi0JCQkgICAgIHVpbnQ4X3QgZGlyZWN0bGluaywgaW50IGhuYV9idWZmX2xlbiwKLQkJCSAgICAgc3RydWN0IGJhdG1hbl9pZiAqaWZfaW5jb21pbmcpCi17Ci0Jc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiA9IG5ldGRldl9wcml2KGlmX2luY29taW5nLT5zb2Z0X2lmYWNlKTsKLQl1bnNpZ25lZCBjaGFyIGluX3RxLCBpbl90dGwsIHRxX2F2ZyA9IDA7Ci0JdW5zaWduZWQgbG9uZyBzZW5kX3RpbWU7Ci0KLQlpZiAoYmF0bWFuX3BhY2tldC0+dHRsIDw9IDEpIHsKLQkJYmF0X2RiZyhEQkdfQkFUTUFOLCBiYXRfcHJpdiwgInR0bCBleGNlZWRlZFxuIik7Ci0JCXJldHVybjsKLQl9Ci0KLQlpbl90cSA9IGJhdG1hbl9wYWNrZXQtPnRxOwotCWluX3R0bCA9IGJhdG1hbl9wYWNrZXQtPnR0bDsKLQotCWJhdG1hbl9wYWNrZXQtPnR0bC0tOwotCW1lbWNweShiYXRtYW5fcGFja2V0LT5wcmV2X3NlbmRlciwgZXRoaGRyLT5oX3NvdXJjZSwgRVRIX0FMRU4pOwotCi0JLyogcmVicm9hZGNhc3QgdHEgb2Ygb3VyIGJlc3QgcmFua2luZyBuZWlnaGJvciB0byBlbnN1cmUgdGhlIHJlYnJvYWRjYXN0Ci0JICogb2Ygb3VyIGJlc3QgdHEgdmFsdWUgKi8KLQlpZiAoKG9yaWdfbm9kZS0+cm91dGVyKSAmJiAob3JpZ19ub2RlLT5yb3V0ZXItPnRxX2F2ZyAhPSAwKSkgewotCi0JCS8qIHJlYnJvYWRjYXN0IG9nbSBvZiBiZXN0IHJhbmtpbmcgbmVpZ2hib3IgYXMgaXMgKi8KLQkJaWYgKCFjb21wYXJlX29yaWcob3JpZ19ub2RlLT5yb3V0ZXItPmFkZHIsIGV0aGhkci0+aF9zb3VyY2UpKSB7Ci0JCQliYXRtYW5fcGFja2V0LT50cSA9IG9yaWdfbm9kZS0+cm91dGVyLT50cV9hdmc7Ci0KLQkJCWlmIChvcmlnX25vZGUtPnJvdXRlci0+bGFzdF90dGwpCi0JCQkJYmF0bWFuX3BhY2tldC0+dHRsID0gb3JpZ19ub2RlLT5yb3V0ZXItPmxhc3RfdHRsCi0JCQkJCQkJLSAxOwotCQl9Ci0KLQkJdHFfYXZnID0gb3JpZ19ub2RlLT5yb3V0ZXItPnRxX2F2ZzsKLQl9Ci0KLQkvKiBhcHBseSBob3AgcGVuYWx0eSAqLwotCWJhdG1hbl9wYWNrZXQtPnRxID0gaG9wX3BlbmFsdHkoYmF0bWFuX3BhY2tldC0+dHEpOwotCi0JYmF0X2RiZyhEQkdfQkFUTUFOLCBiYXRfcHJpdiwKLQkJIkZvcndhcmRpbmcgcGFja2V0OiB0cV9vcmlnOiAlaSwgdHFfYXZnOiAlaSwgIgotCQkidHFfZm9ydzogJWksIHR0bF9vcmlnOiAlaSwgdHRsX2Zvcnc6ICVpXG4iLAotCQlpbl90cSwgdHFfYXZnLCBiYXRtYW5fcGFja2V0LT50cSwgaW5fdHRsIC0gMSwKLQkJYmF0bWFuX3BhY2tldC0+dHRsKTsKLQotCWJhdG1hbl9wYWNrZXQtPnNlcW5vID0gaHRvbmwoYmF0bWFuX3BhY2tldC0+c2Vxbm8pOwotCi0JLyogc3dpdGNoIG9mIHByaW1hcmllcyBmaXJzdCBob3AgZmxhZyB3aGVuIGZvcndhcmRpbmcgKi8KLQliYXRtYW5fcGFja2V0LT5mbGFncyAmPSB+UFJJTUFSSUVTX0ZJUlNUX0hPUDsKLQlpZiAoZGlyZWN0bGluaykKLQkJYmF0bWFuX3BhY2tldC0+ZmxhZ3MgfD0gRElSRUNUTElOSzsKLQllbHNlCi0JCWJhdG1hbl9wYWNrZXQtPmZsYWdzICY9IH5ESVJFQ1RMSU5LOwotCi0Jc2VuZF90aW1lID0gZm9yd2FyZF9zZW5kX3RpbWUoYmF0X3ByaXYpOwotCWFkZF9iYXRfcGFja2V0X3RvX2xpc3QoYmF0X3ByaXYsCi0JCQkgICAgICAgKHVuc2lnbmVkIGNoYXIgKiliYXRtYW5fcGFja2V0LAotCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgYmF0bWFuX3BhY2tldCkgKyBobmFfYnVmZl9sZW4sCi0JCQkgICAgICAgaWZfaW5jb21pbmcsIDAsIHNlbmRfdGltZSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGZvcndfcGFja2V0X2ZyZWUoc3RydWN0IGZvcndfcGFja2V0ICpmb3J3X3BhY2tldCkKLXsKLQlpZiAoZm9yd19wYWNrZXQtPnNrYikKLQkJa2ZyZWVfc2tiKGZvcndfcGFja2V0LT5za2IpOwotCWtmcmVlKGZvcndfcGFja2V0KTsKLX0KLQotc3RhdGljIHZvaWQgX2FkZF9iY2FzdF9wYWNrZXRfdG9fbGlzdChzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2LAotCQkJCSAgICAgIHN0cnVjdCBmb3J3X3BhY2tldCAqZm9yd19wYWNrZXQsCi0JCQkJICAgICAgdW5zaWduZWQgbG9uZyBzZW5kX3RpbWUpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlJTklUX0hMSVNUX05PREUoJmZvcndfcGFja2V0LT5saXN0KTsKLQotCS8qIGFkZCBuZXcgcGFja2V0IHRvIHBhY2tldCBsaXN0ICovCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmJhdF9wcml2LT5mb3J3X2JjYXN0X2xpc3RfbG9jaywgZmxhZ3MpOwotCWhsaXN0X2FkZF9oZWFkKCZmb3J3X3BhY2tldC0+bGlzdCwgJmJhdF9wcml2LT5mb3J3X2JjYXN0X2xpc3QpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJhdF9wcml2LT5mb3J3X2JjYXN0X2xpc3RfbG9jaywgZmxhZ3MpOwotCi0JLyogc3RhcnQgdGltZXIgZm9yIHRoaXMgcGFja2V0ICovCi0JSU5JVF9ERUxBWUVEX1dPUksoJmZvcndfcGFja2V0LT5kZWxheWVkX3dvcmssCi0JCQkgIHNlbmRfb3V0c3RhbmRpbmdfYmNhc3RfcGFja2V0KTsKLQlxdWV1ZV9kZWxheWVkX3dvcmsoYmF0X2V2ZW50X3dvcmtxdWV1ZSwgJmZvcndfcGFja2V0LT5kZWxheWVkX3dvcmssCi0JCQkgICBzZW5kX3RpbWUpOwotfQotCi0jZGVmaW5lIGF0b21pY19kZWNfbm90X3plcm8odikgICAgICAgICAgYXRvbWljX2FkZF91bmxlc3MoKHYpLCAtMSwgMCkKLS8qIGFkZCBhIGJyb2FkY2FzdCBwYWNrZXQgdG8gdGhlIHF1ZXVlIGFuZCBzZXR1cCB0aW1lcnMuIGJyb2FkY2FzdCBwYWNrZXRzCi0gKiBhcmUgc2VudCBtdWx0aXBsZSB0aW1lcyB0byBpbmNyZWFzZSBwcm9iYWJpbGl0eSBmb3IgYmVlaW5nIHJlY2VpdmVkLgotICoKLSAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBORVRERVZfVFhfT0sgb24gc3VjY2VzcyBhbmQgTkVUREVWX1RYX0JVU1kgb24KLSAqIGVycm9ycy4KLSAqCi0gKiBUaGUgc2tiIGlzIG5vdCBjb25zdW1lZCwgc28gdGhlIGNhbGxlciBzaG91bGQgbWFrZSBzdXJlIHRoYXQgdGhlCi0gKiBza2IgaXMgZnJlZWQuICovCi1pbnQgYWRkX2JjYXN0X3BhY2tldF90b19saXN0KHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYsIHN0cnVjdCBza19idWZmICpza2IpCi17Ci0Jc3RydWN0IGZvcndfcGFja2V0ICpmb3J3X3BhY2tldDsKLQlzdHJ1Y3QgYmNhc3RfcGFja2V0ICpiY2FzdF9wYWNrZXQ7Ci0KLQlpZiAoIWF0b21pY19kZWNfbm90X3plcm8oJmJhdF9wcml2LT5iY2FzdF9xdWV1ZV9sZWZ0KSkgewotCQliYXRfZGJnKERCR19CQVRNQU4sIGJhdF9wcml2LCAiYmNhc3QgcGFja2V0IHF1ZXVlIGZ1bGxcbiIpOwotCQlnb3RvIG91dDsKLQl9Ci0KLQlpZiAoIWJhdF9wcml2LT5wcmltYXJ5X2lmKQotCQlnb3RvIG91dDsKLQotCWZvcndfcGFja2V0ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGZvcndfcGFja2V0KSwgR0ZQX0FUT01JQyk7Ci0KLQlpZiAoIWZvcndfcGFja2V0KQotCQlnb3RvIG91dF9hbmRfaW5jOwotCi0Jc2tiID0gc2tiX2NvcHkoc2tiLCBHRlBfQVRPTUlDKTsKLQlpZiAoIXNrYikKLQkJZ290byBwYWNrZXRfZnJlZTsKLQotCS8qIGFzIHdlIGhhdmUgYSBjb3B5IG5vdywgaXQgaXMgc2FmZSB0byBkZWNyZWFzZSB0aGUgVFRMICovCi0JYmNhc3RfcGFja2V0ID0gKHN0cnVjdCBiY2FzdF9wYWNrZXQgKilza2ItPmRhdGE7Ci0JYmNhc3RfcGFja2V0LT50dGwtLTsKLQotCXNrYl9yZXNldF9tYWNfaGVhZGVyKHNrYik7Ci0KLQlmb3J3X3BhY2tldC0+c2tiID0gc2tiOwotCWZvcndfcGFja2V0LT5pZl9pbmNvbWluZyA9IGJhdF9wcml2LT5wcmltYXJ5X2lmOwotCi0JLyogaG93IG9mdGVuIGRpZCB3ZSBzZW5kIHRoZSBiY2FzdCBwYWNrZXQgPyAqLwotCWZvcndfcGFja2V0LT5udW1fcGFja2V0cyA9IDA7Ci0KLQlfYWRkX2JjYXN0X3BhY2tldF90b19saXN0KGJhdF9wcml2LCBmb3J3X3BhY2tldCwgMSk7Ci0JcmV0dXJuIE5FVERFVl9UWF9PSzsKLQotcGFja2V0X2ZyZWU6Ci0Ja2ZyZWUoZm9yd19wYWNrZXQpOwotb3V0X2FuZF9pbmM6Ci0JYXRvbWljX2luYygmYmF0X3ByaXYtPmJjYXN0X3F1ZXVlX2xlZnQpOwotb3V0OgotCXJldHVybiBORVRERVZfVFhfQlVTWTsKLX0KLQotc3RhdGljIHZvaWQgc2VuZF9vdXRzdGFuZGluZ19iY2FzdF9wYWNrZXQoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQotewotCXN0cnVjdCBiYXRtYW5faWYgKmJhdG1hbl9pZjsKLQlzdHJ1Y3QgZGVsYXllZF93b3JrICpkZWxheWVkX3dvcmsgPQotCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IGRlbGF5ZWRfd29yaywgd29yayk7Ci0Jc3RydWN0IGZvcndfcGFja2V0ICpmb3J3X3BhY2tldCA9Ci0JCWNvbnRhaW5lcl9vZihkZWxheWVkX3dvcmssIHN0cnVjdCBmb3J3X3BhY2tldCwgZGVsYXllZF93b3JrKTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXN0cnVjdCBza19idWZmICpza2IxOwotCXN0cnVjdCBuZXRfZGV2aWNlICpzb2Z0X2lmYWNlID0gZm9yd19wYWNrZXQtPmlmX2luY29taW5nLT5zb2Z0X2lmYWNlOwotCXN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYgPSBuZXRkZXZfcHJpdihzb2Z0X2lmYWNlKTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZiYXRfcHJpdi0+Zm9yd19iY2FzdF9saXN0X2xvY2ssIGZsYWdzKTsKLQlobGlzdF9kZWwoJmZvcndfcGFja2V0LT5saXN0KTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiYXRfcHJpdi0+Zm9yd19iY2FzdF9saXN0X2xvY2ssIGZsYWdzKTsKLQotCWlmIChhdG9taWNfcmVhZCgmYmF0X3ByaXYtPm1lc2hfc3RhdGUpID09IE1FU0hfREVBQ1RJVkFUSU5HKQotCQlnb3RvIG91dDsKLQotCS8qIHJlYnJvYWRjYXN0IHBhY2tldCAqLwotCXJjdV9yZWFkX2xvY2soKTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShiYXRtYW5faWYsICZpZl9saXN0LCBsaXN0KSB7Ci0JCWlmIChiYXRtYW5faWYtPnNvZnRfaWZhY2UgIT0gc29mdF9pZmFjZSkKLQkJCWNvbnRpbnVlOwotCi0JCS8qIHNlbmQgYSBjb3B5IG9mIHRoZSBzYXZlZCBza2IgKi8KLQkJc2tiMSA9IHNrYl9jbG9uZShmb3J3X3BhY2tldC0+c2tiLCBHRlBfQVRPTUlDKTsKLQkJaWYgKHNrYjEpCi0JCQlzZW5kX3NrYl9wYWNrZXQoc2tiMSwgYmF0bWFuX2lmLCBicm9hZGNhc3RfYWRkcik7Ci0JfQotCXJjdV9yZWFkX3VubG9jaygpOwotCi0JZm9yd19wYWNrZXQtPm51bV9wYWNrZXRzKys7Ci0KLQkvKiBpZiB3ZSBzdGlsbCBoYXZlIHNvbWUgbW9yZSBiY2FzdHMgdG8gc2VuZCAqLwotCWlmIChmb3J3X3BhY2tldC0+bnVtX3BhY2tldHMgPCAzKSB7Ci0JCV9hZGRfYmNhc3RfcGFja2V0X3RvX2xpc3QoYmF0X3ByaXYsIGZvcndfcGFja2V0LAotCQkJCQkgICgoNSAqIEhaKSAvIDEwMDApKTsKLQkJcmV0dXJuOwotCX0KLQotb3V0OgotCWZvcndfcGFja2V0X2ZyZWUoZm9yd19wYWNrZXQpOwotCWF0b21pY19pbmMoJmJhdF9wcml2LT5iY2FzdF9xdWV1ZV9sZWZ0KTsKLX0KLQotdm9pZCBzZW5kX291dHN0YW5kaW5nX2JhdF9wYWNrZXQoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQotewotCXN0cnVjdCBkZWxheWVkX3dvcmsgKmRlbGF5ZWRfd29yayA9Ci0JCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgZGVsYXllZF93b3JrLCB3b3JrKTsKLQlzdHJ1Y3QgZm9yd19wYWNrZXQgKmZvcndfcGFja2V0ID0KLQkJY29udGFpbmVyX29mKGRlbGF5ZWRfd29yaywgc3RydWN0IGZvcndfcGFja2V0LCBkZWxheWVkX3dvcmspOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdjsKLQotCWJhdF9wcml2ID0gbmV0ZGV2X3ByaXYoZm9yd19wYWNrZXQtPmlmX2luY29taW5nLT5zb2Z0X2lmYWNlKTsKLQlzcGluX2xvY2tfaXJxc2F2ZSgmYmF0X3ByaXYtPmZvcndfYmF0X2xpc3RfbG9jaywgZmxhZ3MpOwotCWhsaXN0X2RlbCgmZm9yd19wYWNrZXQtPmxpc3QpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJhdF9wcml2LT5mb3J3X2JhdF9saXN0X2xvY2ssIGZsYWdzKTsKLQotCWlmIChhdG9taWNfcmVhZCgmYmF0X3ByaXYtPm1lc2hfc3RhdGUpID09IE1FU0hfREVBQ1RJVkFUSU5HKQotCQlnb3RvIG91dDsKLQotCXNlbmRfcGFja2V0KGZvcndfcGFja2V0KTsKLQotCS8qKgotCSAqIHdlIGhhdmUgdG8gaGF2ZSBhdCBsZWFzdCBvbmUgcGFja2V0IGluIHRoZSBxdWV1ZQotCSAqIHRvIGRldGVybWluZSB0aGUgcXVldWVzIHdha2UgdXAgdGltZSB1bmxlc3Mgd2UgYXJlCi0JICogc2h1dHRpbmcgZG93bgotCSAqLwotCWlmIChmb3J3X3BhY2tldC0+b3duKQotCQlzY2hlZHVsZV9vd25fcGFja2V0KGZvcndfcGFja2V0LT5pZl9pbmNvbWluZyk7Ci0KLW91dDoKLQkvKiBkb24ndCBjb3VudCBvd24gcGFja2V0ICovCi0JaWYgKCFmb3J3X3BhY2tldC0+b3duKQotCQlhdG9taWNfaW5jKCZiYXRfcHJpdi0+YmF0bWFuX3F1ZXVlX2xlZnQpOwotCi0JZm9yd19wYWNrZXRfZnJlZShmb3J3X3BhY2tldCk7Ci19Ci0KLXZvaWQgcHVyZ2Vfb3V0c3RhbmRpbmdfcGFja2V0cyhzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2LAotCQkJICAgICAgIHN0cnVjdCBiYXRtYW5faWYgKmJhdG1hbl9pZikKLXsKLQlzdHJ1Y3QgZm9yd19wYWNrZXQgKmZvcndfcGFja2V0OwotCXN0cnVjdCBobGlzdF9ub2RlICp0bXBfbm9kZSwgKnNhZmVfdG1wX25vZGU7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWlmIChiYXRtYW5faWYpCi0JCWJhdF9kYmcoREJHX0JBVE1BTiwgYmF0X3ByaXYsCi0JCQkicHVyZ2Vfb3V0c3RhbmRpbmdfcGFja2V0cygpOiAlc1xuIiwKLQkJCWJhdG1hbl9pZi0+bmV0X2Rldi0+bmFtZSk7Ci0JZWxzZQotCQliYXRfZGJnKERCR19CQVRNQU4sIGJhdF9wcml2LAotCQkJInB1cmdlX291dHN0YW5kaW5nX3BhY2tldHMoKVxuIik7Ci0KLQkvKiBmcmVlIGJjYXN0IGxpc3QgKi8KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYmF0X3ByaXYtPmZvcndfYmNhc3RfbGlzdF9sb2NrLCBmbGFncyk7Ci0JaGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShmb3J3X3BhY2tldCwgdG1wX25vZGUsIHNhZmVfdG1wX25vZGUsCi0JCQkJICAmYmF0X3ByaXYtPmZvcndfYmNhc3RfbGlzdCwgbGlzdCkgewotCi0JCS8qKgotCQkgKiBpZiBwdXJnZV9vdXRzdGFuZGluZ19wYWNrZXRzKCkgd2FzIGNhbGxlZCB3aXRoIGFuIGFyZ211bWVudAotCQkgKiB3ZSBkZWxldGUgb25seSBwYWNrZXRzIGJlbG9uZ2luZyB0byB0aGUgZ2l2ZW4gaW50ZXJmYWNlCi0JCSAqLwotCQlpZiAoKGJhdG1hbl9pZikgJiYKLQkJICAgIChmb3J3X3BhY2tldC0+aWZfaW5jb21pbmcgIT0gYmF0bWFuX2lmKSkKLQkJCWNvbnRpbnVlOwotCi0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJhdF9wcml2LT5mb3J3X2JjYXN0X2xpc3RfbG9jaywgZmxhZ3MpOwotCi0JCS8qKgotCQkgKiBzZW5kX291dHN0YW5kaW5nX2JjYXN0X3BhY2tldCgpIHdpbGwgbG9jayB0aGUgbGlzdCB0bwotCQkgKiBkZWxldGUgdGhlIGl0ZW0gZnJvbSB0aGUgbGlzdAotCQkgKi8KLQkJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZmb3J3X3BhY2tldC0+ZGVsYXllZF93b3JrKTsKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmJhdF9wcml2LT5mb3J3X2JjYXN0X2xpc3RfbG9jaywgZmxhZ3MpOwotCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiYXRfcHJpdi0+Zm9yd19iY2FzdF9saXN0X2xvY2ssIGZsYWdzKTsKLQotCS8qIGZyZWUgYmF0bWFuIHBhY2tldCBsaXN0ICovCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmJhdF9wcml2LT5mb3J3X2JhdF9saXN0X2xvY2ssIGZsYWdzKTsKLQlobGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGZvcndfcGFja2V0LCB0bXBfbm9kZSwgc2FmZV90bXBfbm9kZSwKLQkJCQkgICZiYXRfcHJpdi0+Zm9yd19iYXRfbGlzdCwgbGlzdCkgewotCi0JCS8qKgotCQkgKiBpZiBwdXJnZV9vdXRzdGFuZGluZ19wYWNrZXRzKCkgd2FzIGNhbGxlZCB3aXRoIGFuIGFyZ211bWVudAotCQkgKiB3ZSBkZWxldGUgb25seSBwYWNrZXRzIGJlbG9uZ2luZyB0byB0aGUgZ2l2ZW4gaW50ZXJmYWNlCi0JCSAqLwotCQlpZiAoKGJhdG1hbl9pZikgJiYKLQkJICAgIChmb3J3X3BhY2tldC0+aWZfaW5jb21pbmcgIT0gYmF0bWFuX2lmKSkKLQkJCWNvbnRpbnVlOwotCi0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJhdF9wcml2LT5mb3J3X2JhdF9saXN0X2xvY2ssIGZsYWdzKTsKLQotCQkvKioKLQkJICogc2VuZF9vdXRzdGFuZGluZ19iYXRfcGFja2V0KCkgd2lsbCBsb2NrIHRoZSBsaXN0IHRvCi0JCSAqIGRlbGV0ZSB0aGUgaXRlbSBmcm9tIHRoZSBsaXN0Ci0JCSAqLwotCQljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJmZvcndfcGFja2V0LT5kZWxheWVkX3dvcmspOwotCQlzcGluX2xvY2tfaXJxc2F2ZSgmYmF0X3ByaXYtPmZvcndfYmF0X2xpc3RfbG9jaywgZmxhZ3MpOwotCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiYXRfcHJpdi0+Zm9yd19iYXRfbGlzdF9sb2NrLCBmbGFncyk7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9zZW5kLmggYi9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9zZW5kLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0Y2VmYTguLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvc2VuZC5oCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIEIuQS5ULk0uQS5OLiBjb250cmlidXRvcnM6Ci0gKgotICogTWFyZWsgTGluZG5lciwgU2ltb24gV3VuZGVybGljaAotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQotICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQotICogMDIxMTAtMTMwMSwgVVNBCi0gKgotICovCi0KLSNpZm5kZWYgX05FVF9CQVRNQU5fQURWX1NFTkRfSF8KLSNkZWZpbmUgX05FVF9CQVRNQU5fQURWX1NFTkRfSF8KLQotI2luY2x1ZGUgInR5cGVzLmgiCi0KLWludCBzZW5kX3NrYl9wYWNrZXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCQlzdHJ1Y3QgYmF0bWFuX2lmICpiYXRtYW5faWYsCi0JCQkJdWludDhfdCAqZHN0X2FkZHIpOwotdm9pZCBzY2hlZHVsZV9vd25fcGFja2V0KHN0cnVjdCBiYXRtYW5faWYgKmJhdG1hbl9pZik7Ci12b2lkIHNjaGVkdWxlX2ZvcndhcmRfcGFja2V0KHN0cnVjdCBvcmlnX25vZGUgKm9yaWdfbm9kZSwKLQkJCSAgICAgc3RydWN0IGV0aGhkciAqZXRoaGRyLAotCQkJICAgICBzdHJ1Y3QgYmF0bWFuX3BhY2tldCAqYmF0bWFuX3BhY2tldCwKLQkJCSAgICAgdWludDhfdCBkaXJlY3RsaW5rLCBpbnQgaG5hX2J1ZmZfbGVuLAotCQkJICAgICBzdHJ1Y3QgYmF0bWFuX2lmICppZl9vdXRnb2luZyk7Ci1pbnQgYWRkX2JjYXN0X3BhY2tldF90b19saXN0KHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYsIHN0cnVjdCBza19idWZmICpza2IpOwotdm9pZCBzZW5kX291dHN0YW5kaW5nX2JhdF9wYWNrZXQoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKLXZvaWQgcHVyZ2Vfb3V0c3RhbmRpbmdfcGFja2V0cyhzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2LAotCQkJICAgICAgIHN0cnVjdCBiYXRtYW5faWYgKmJhdG1hbl9pZik7Ci0KLSNlbmRpZiAvKiBfTkVUX0JBVE1BTl9BRFZfU0VORF9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvc29mdC1pbnRlcmZhY2UuYyBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L3NvZnQtaW50ZXJmYWNlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlOTk2MTguLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvc29mdC1pbnRlcmZhY2UuYworKysgL2Rldi9udWxsCkBAIC0xLDM5OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgQi5BLlQuTS5BLk4uIGNvbnRyaWJ1dG9yczoKLSAqCi0gKiBNYXJlayBMaW5kbmVyLCBTaW1vbiBXdW5kZXJsaWNoCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCi0gKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCi0gKiAwMjExMC0xMzAxLCBVU0EKLSAqCi0gKi8KLQotI2luY2x1ZGUgIm1haW4uaCIKLSNpbmNsdWRlICJzb2Z0LWludGVyZmFjZS5oIgotI2luY2x1ZGUgImhhcmQtaW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAicm91dGluZy5oIgotI2luY2x1ZGUgInNlbmQuaCIKLSNpbmNsdWRlICJiYXRfZGVidWdmcy5oIgotI2luY2x1ZGUgInRyYW5zbGF0aW9uLXRhYmxlLmgiCi0jaW5jbHVkZSAidHlwZXMuaCIKLSNpbmNsdWRlICJoYXNoLmgiCi0jaW5jbHVkZSAic2VuZC5oIgotI2luY2x1ZGUgImJhdF9zeXNmcy5oIgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+Ci0jaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KLSNpbmNsdWRlICJ1bmljYXN0LmgiCi0KLQotc3RhdGljIGludCBiYXRfZ2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2NtZCAqY21kKTsKLXN0YXRpYyB2b2lkIGJhdF9nZXRfZHJ2aW5mbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJICAgIHN0cnVjdCBldGh0b29sX2RydmluZm8gKmluZm8pOwotc3RhdGljIHUzMiBiYXRfZ2V0X21zZ2xldmVsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwotc3RhdGljIHZvaWQgYmF0X3NldF9tc2dsZXZlbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgdmFsdWUpOwotc3RhdGljIHUzMiBiYXRfZ2V0X2xpbmsoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Ci1zdGF0aWMgdTMyIGJhdF9nZXRfcnhfY3N1bShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKLXN0YXRpYyBpbnQgYmF0X3NldF9yeF9jc3VtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBkYXRhKTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBldGh0b29sX29wcyBiYXRfZXRodG9vbF9vcHMgPSB7Ci0JLmdldF9zZXR0aW5ncyA9IGJhdF9nZXRfc2V0dGluZ3MsCi0JLmdldF9kcnZpbmZvID0gYmF0X2dldF9kcnZpbmZvLAotCS5nZXRfbXNnbGV2ZWwgPSBiYXRfZ2V0X21zZ2xldmVsLAotCS5zZXRfbXNnbGV2ZWwgPSBiYXRfc2V0X21zZ2xldmVsLAotCS5nZXRfbGluayA9IGJhdF9nZXRfbGluaywKLQkuZ2V0X3J4X2NzdW0gPSBiYXRfZ2V0X3J4X2NzdW0sCi0JLnNldF9yeF9jc3VtID0gYmF0X3NldF9yeF9jc3VtCi19OwotCi1pbnQgbXlfc2tiX2hlYWRfcHVzaChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1bnNpZ25lZCBpbnQgbGVuKQotewotCWludCByZXN1bHQ7Ci0KLQkvKioKLQkgKiBUT0RPOiBXZSBtdXN0IGNoZWNrIGlmIHdlIGNhbiByZWxlYXNlIGFsbCByZWZlcmVuY2VzIHRvIG5vbi1wYXlsb2FkCi0JICogZGF0YSB1c2luZyBza2JfaGVhZGVyX3JlbGVhc2UgaW4gb3VyIHNrYnMgdG8gYWxsb3cgc2tiX2Nvd19oZWFkZXIgdG8KLQkgKiB3b3JrIG9wdGltYWxseS4gVGhpcyBtZWFucyB0aGF0IHRob3NlIHNrYnMgYXJlIG5vdCBhbGxvd2VkIHRvIHJlYWQKLQkgKiBvciB3cml0ZSBhbnkgZGF0YSB3aGljaCBpcyBiZWZvcmUgdGhlIGN1cnJlbnQgcG9zaXRpb24gb2Ygc2tiLT5kYXRhCi0JICogYWZ0ZXIgdGhhdCBjYWxsIGFuZCB0aHVzIGFsbG93IG90aGVyIHNrYnMgd2l0aCB0aGUgc2FtZSBkYXRhIGJ1ZmZlcgotCSAqIHRvIHdyaXRlIGZyZWVseSBpbiB0aGF0IGFyZWEuCi0JICovCi0JcmVzdWx0ID0gc2tiX2Nvd19oZWFkKHNrYiwgbGVuKTsKLQlpZiAocmVzdWx0IDwgMCkKLQkJcmV0dXJuIHJlc3VsdDsKLQotCXNrYl9wdXNoKHNrYiwgbGVuKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBpbnRlcmZhY2Vfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQotewotCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgaW50ZXJmYWNlX3JlbGVhc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKLXsKLQluZXRpZl9zdG9wX3F1ZXVlKGRldik7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqaW50ZXJmYWNlX3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiA9IG5ldGRldl9wcml2KGRldik7Ci0JcmV0dXJuICZiYXRfcHJpdi0+c3RhdHM7Ci19Ci0KLXN0YXRpYyBpbnQgaW50ZXJmYWNlX3NldF9tYWNfYWRkcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB2b2lkICpwKQotewotCXN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYgPSBuZXRkZXZfcHJpdihkZXYpOwotCXN0cnVjdCBzb2NrYWRkciAqYWRkciA9IHA7Ci0KLQlpZiAoIWlzX3ZhbGlkX2V0aGVyX2FkZHIoYWRkci0+c2FfZGF0YSkpCi0JCXJldHVybiAtRUFERFJOT1RBVkFJTDsKLQotCS8qIG9ubHkgbW9kaWZ5IGhuYS10YWJsZSBpZiBpdCBoYXMgYmVlbiBpbml0aWFsaXNlZCBiZWZvcmUgKi8KLQlpZiAoYXRvbWljX3JlYWQoJmJhdF9wcml2LT5tZXNoX3N0YXRlKSA9PSBNRVNIX0FDVElWRSkgewotCQlobmFfbG9jYWxfcmVtb3ZlKGJhdF9wcml2LCBkZXYtPmRldl9hZGRyLAotCQkJCSAibWFjIGFkZHJlc3MgY2hhbmdlZCIpOwotCQlobmFfbG9jYWxfYWRkKGRldiwgYWRkci0+c2FfZGF0YSk7Ci0JfQotCi0JbWVtY3B5KGRldi0+ZGV2X2FkZHIsIGFkZHItPnNhX2RhdGEsIEVUSF9BTEVOKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGludGVyZmFjZV9jaGFuZ2VfbXR1KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBuZXdfbXR1KQotewotCS8qIGNoZWNrIHJhbmdlcyAqLwotCWlmICgobmV3X210dSA8IDY4KSB8fCAobmV3X210dSA+IGhhcmRpZl9taW5fbXR1KGRldikpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWRldi0+bXR1ID0gbmV3X210dTsKLQotCXJldHVybiAwOwotfQotCi1pbnQgaW50ZXJmYWNlX3R4KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpzb2Z0X2lmYWNlKQotewotCXN0cnVjdCBldGhoZHIgKmV0aGhkciA9IChzdHJ1Y3QgZXRoaGRyICopc2tiLT5kYXRhOwotCXN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYgPSBuZXRkZXZfcHJpdihzb2Z0X2lmYWNlKTsKLQlzdHJ1Y3QgYmNhc3RfcGFja2V0ICpiY2FzdF9wYWNrZXQ7Ci0JaW50IGRhdGFfbGVuID0gc2tiLT5sZW4sIHJldDsKLQotCWlmIChhdG9taWNfcmVhZCgmYmF0X3ByaXYtPm1lc2hfc3RhdGUpICE9IE1FU0hfQUNUSVZFKQotCQlnb3RvIGRyb3BwZWQ7Ci0KLQlzb2Z0X2lmYWNlLT50cmFuc19zdGFydCA9IGppZmZpZXM7Ci0KLQkvKiBUT0RPOiBjaGVjayB0aGlzIGZvciBsb2NrcyAqLwotCWhuYV9sb2NhbF9hZGQoc29mdF9pZmFjZSwgZXRoaGRyLT5oX3NvdXJjZSk7Ci0KLQkvKiBldGhlcm5ldCBwYWNrZXQgc2hvdWxkIGJlIGJyb2FkY2FzdGVkICovCi0JaWYgKGlzX2JjYXN0KGV0aGhkci0+aF9kZXN0KSB8fCBpc19tY2FzdChldGhoZHItPmhfZGVzdCkpIHsKLQkJaWYgKCFiYXRfcHJpdi0+cHJpbWFyeV9pZikKLQkJCWdvdG8gZHJvcHBlZDsKLQotCQlpZiAobXlfc2tiX2hlYWRfcHVzaChza2IsIHNpemVvZihzdHJ1Y3QgYmNhc3RfcGFja2V0KSkgPCAwKQotCQkJZ290byBkcm9wcGVkOwotCi0JCWJjYXN0X3BhY2tldCA9IChzdHJ1Y3QgYmNhc3RfcGFja2V0ICopc2tiLT5kYXRhOwotCQliY2FzdF9wYWNrZXQtPnZlcnNpb24gPSBDT01QQVRfVkVSU0lPTjsKLQkJYmNhc3RfcGFja2V0LT50dGwgPSBUVEw7Ci0KLQkJLyogYmF0bWFuIHBhY2tldCB0eXBlOiBicm9hZGNhc3QgKi8KLQkJYmNhc3RfcGFja2V0LT5wYWNrZXRfdHlwZSA9IEJBVF9CQ0FTVDsKLQotCQkvKiBodyBhZGRyZXNzIG9mIGZpcnN0IGludGVyZmFjZSBpcyB0aGUgb3JpZyBtYWMgYmVjYXVzZSBvbmx5Ci0JCSAqIHRoaXMgbWFjIGlzIGtub3duIHRocm91Z2hvdXQgdGhlIG1lc2ggKi8KLQkJbWVtY3B5KGJjYXN0X3BhY2tldC0+b3JpZywKLQkJICAgICAgIGJhdF9wcml2LT5wcmltYXJ5X2lmLT5uZXRfZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pOwotCi0JCS8qIHNldCBicm9hZGNhc3Qgc2VxdWVuY2UgbnVtYmVyICovCi0JCWJjYXN0X3BhY2tldC0+c2Vxbm8gPQotCQkJaHRvbmwoYXRvbWljX2luY19yZXR1cm4oJmJhdF9wcml2LT5iY2FzdF9zZXFubykpOwotCi0JCWFkZF9iY2FzdF9wYWNrZXRfdG9fbGlzdChiYXRfcHJpdiwgc2tiKTsKLQotCQkvKiBhIGNvcHkgaXMgc3RvcmVkIGluIHRoZSBiY2FzdCBsaXN0LCB0aGVyZWZvcmUgcmVtb3ZpbmcKLQkJICogdGhlIG9yaWdpbmFsIHNrYi4gKi8KLQkJa2ZyZWVfc2tiKHNrYik7Ci0KLQkvKiB1bmljYXN0IHBhY2tldCAqLwotCX0gZWxzZSB7Ci0JCXJldCA9IHVuaWNhc3Rfc2VuZF9za2Ioc2tiLCBiYXRfcHJpdik7Ci0JCWlmIChyZXQgIT0gMCkKLQkJCWdvdG8gZHJvcHBlZF9mcmVlZDsKLQl9Ci0KLQliYXRfcHJpdi0+c3RhdHMudHhfcGFja2V0cysrOwotCWJhdF9wcml2LT5zdGF0cy50eF9ieXRlcyArPSBkYXRhX2xlbjsKLQlnb3RvIGVuZDsKLQotZHJvcHBlZDoKLQlrZnJlZV9za2Ioc2tiKTsKLWRyb3BwZWRfZnJlZWQ6Ci0JYmF0X3ByaXYtPnN0YXRzLnR4X2Ryb3BwZWQrKzsKLWVuZDoKLQlyZXR1cm4gTkVUREVWX1RYX09LOwotfQotCi12b2lkIGludGVyZmFjZV9yeChzdHJ1Y3QgbmV0X2RldmljZSAqc29mdF9pZmFjZSwKLQkJICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgaGRyX3NpemUpCi17Ci0Jc3RydWN0IGJhdF9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoc29mdF9pZmFjZSk7Ci0KLQkvKiBjaGVjayBpZiBlbm91Z2ggc3BhY2UgaXMgYXZhaWxhYmxlIGZvciBwdWxsaW5nLCBhbmQgcHVsbCAqLwotCWlmICghcHNrYl9tYXlfcHVsbChza2IsIGhkcl9zaXplKSkKLQkJZ290byBkcm9wcGVkOwotCi0Jc2tiX3B1bGxfcmNzdW0oc2tiLCBoZHJfc2l6ZSk7Ci0vKglza2Jfc2V0X21hY19oZWFkZXIoc2tiLCAtc2l6ZW9mKHN0cnVjdCBldGhoZHIpKTsqLwotCi0JLyogc2tiLT5kZXYgJiBza2ItPnBrdF90eXBlIGFyZSBzZXQgaGVyZSAqLwotCWlmICh1bmxpa2VseSghcHNrYl9tYXlfcHVsbChza2IsIEVUSF9ITEVOKSkpCi0JCWdvdG8gZHJvcHBlZDsKLQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBzb2Z0X2lmYWNlKTsKLQotCS8qIHNob3VsZCBub3QgYmUgbmVjY2VzYXJ5IGFueW1vcmUgYXMgd2UgdXNlIHNrYl9wdWxsX3Jjc3VtKCkKLQkgKiBUT0RPOiBwbGVhc2UgdmVyaWZ5IHRoaXMgYW5kIHJlbW92ZSB0aGlzIFRPRE8KLQkgKiAtLSBEZWMgMjFzdCAyMDA5LCBTaW1vbiBXdW5kZXJsaWNoICovCi0KLS8qCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fVU5ORUNFU1NBUlk7Ki8KLQotCXByaXYtPnN0YXRzLnJ4X3BhY2tldHMrKzsKLQlwcml2LT5zdGF0cy5yeF9ieXRlcyArPSBza2ItPmxlbiArIHNpemVvZihzdHJ1Y3QgZXRoaGRyKTsKLQotCXNvZnRfaWZhY2UtPmxhc3RfcnggPSBqaWZmaWVzOwotCi0JbmV0aWZfcngoc2tiKTsKLQlyZXR1cm47Ci0KLWRyb3BwZWQ6Ci0Ja2ZyZWVfc2tiKHNrYik7Ci0JcmV0dXJuOwotfQotCi0jaWZkZWYgSEFWRV9ORVRfREVWSUNFX09QUwotc3RhdGljIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyBiYXRfbmV0ZGV2X29wcyA9IHsKLQkubmRvX29wZW4gPSBpbnRlcmZhY2Vfb3BlbiwKLQkubmRvX3N0b3AgPSBpbnRlcmZhY2VfcmVsZWFzZSwKLQkubmRvX2dldF9zdGF0cyA9IGludGVyZmFjZV9zdGF0cywKLQkubmRvX3NldF9tYWNfYWRkcmVzcyA9IGludGVyZmFjZV9zZXRfbWFjX2FkZHIsCi0JLm5kb19jaGFuZ2VfbXR1ID0gaW50ZXJmYWNlX2NoYW5nZV9tdHUsCi0JLm5kb19zdGFydF94bWl0ID0gaW50ZXJmYWNlX3R4LAotCS5uZG9fdmFsaWRhdGVfYWRkciA9IGV0aF92YWxpZGF0ZV9hZGRyCi19OwotI2VuZGlmCi0KLXN0YXRpYyB2b2lkIGludGVyZmFjZV9zZXR1cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQotewotCXN0cnVjdCBiYXRfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7Ci0JY2hhciBkZXZfYWRkcltFVEhfQUxFTl07Ci0KLQlldGhlcl9zZXR1cChkZXYpOwotCi0jaWZkZWYgSEFWRV9ORVRfREVWSUNFX09QUwotCWRldi0+bmV0ZGV2X29wcyA9ICZiYXRfbmV0ZGV2X29wczsKLSNlbHNlCi0JZGV2LT5vcGVuID0gaW50ZXJmYWNlX29wZW47Ci0JZGV2LT5zdG9wID0gaW50ZXJmYWNlX3JlbGVhc2U7Ci0JZGV2LT5nZXRfc3RhdHMgPSBpbnRlcmZhY2Vfc3RhdHM7Ci0JZGV2LT5zZXRfbWFjX2FkZHJlc3MgPSBpbnRlcmZhY2Vfc2V0X21hY19hZGRyOwotCWRldi0+Y2hhbmdlX210dSA9IGludGVyZmFjZV9jaGFuZ2VfbXR1OwotCWRldi0+aGFyZF9zdGFydF94bWl0ID0gaW50ZXJmYWNlX3R4OwotI2VuZGlmCi0JZGV2LT5kZXN0cnVjdG9yID0gZnJlZV9uZXRkZXY7Ci0KLQkvKioKLQkgKiBjYW4ndCBjYWxsIG1pbl9tdHUsIGJlY2F1c2UgdGhlIG5lZWRlZCB2YXJpYWJsZXMKLQkgKiBoYXZlIG5vdCBiZWVuIGluaXRpYWxpemVkIHlldAotCSAqLwotCWRldi0+bXR1ID0gRVRIX0RBVEFfTEVOOwotCWRldi0+aGFyZF9oZWFkZXJfbGVuID0gQkFUX0hFQURFUl9MRU47IC8qIHJlc2VydmUgbW9yZSBzcGFjZSBpbiB0aGUKLQkJCQkJCSogc2tidWZmIGZvciBvdXIgaGVhZGVyICovCi0KLQkvKiBnZW5lcmF0ZSByYW5kb20gYWRkcmVzcyAqLwotCXJhbmRvbV9ldGhlcl9hZGRyKGRldl9hZGRyKTsKLQltZW1jcHkoZGV2LT5kZXZfYWRkciwgZGV2X2FkZHIsIEVUSF9BTEVOKTsKLQotCVNFVF9FVEhUT09MX09QUyhkZXYsICZiYXRfZXRodG9vbF9vcHMpOwotCi0JbWVtc2V0KHByaXYsIDAsIHNpemVvZihzdHJ1Y3QgYmF0X3ByaXYpKTsKLX0KLQotc3RydWN0IG5ldF9kZXZpY2UgKnNvZnRpZl9jcmVhdGUoY2hhciAqbmFtZSkKLXsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqc29mdF9pZmFjZTsKLQlzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2OwotCWludCByZXQ7Ci0KLQlzb2Z0X2lmYWNlID0gYWxsb2NfbmV0ZGV2KHNpemVvZihzdHJ1Y3QgYmF0X3ByaXYpICwgbmFtZSwKLQkJCQkgICBpbnRlcmZhY2Vfc2V0dXApOwotCi0JaWYgKCFzb2Z0X2lmYWNlKSB7Ci0JCXByX2VycigiVW5hYmxlIHRvIGFsbG9jYXRlIHRoZSBiYXRtYW4gaW50ZXJmYWNlOiAlc1xuIiwgbmFtZSk7Ci0JCWdvdG8gb3V0OwotCX0KLQotCXJldCA9IHJlZ2lzdGVyX25ldGRldihzb2Z0X2lmYWNlKTsKLQlpZiAocmV0IDwgMCkgewotCQlwcl9lcnIoIlVuYWJsZSB0byByZWdpc3RlciB0aGUgYmF0bWFuIGludGVyZmFjZSAnJXMnOiAlaVxuIiwKLQkJICAgICAgIG5hbWUsIHJldCk7Ci0JCWdvdG8gZnJlZV9zb2Z0X2lmYWNlOwotCX0KLQotCWJhdF9wcml2ID0gbmV0ZGV2X3ByaXYoc29mdF9pZmFjZSk7Ci0KLQlhdG9taWNfc2V0KCZiYXRfcHJpdi0+YWdncmVnYXRpb25fZW5hYmxlZCwgMSk7Ci0JYXRvbWljX3NldCgmYmF0X3ByaXYtPmJvbmRpbmdfZW5hYmxlZCwgMCk7Ci0JYXRvbWljX3NldCgmYmF0X3ByaXYtPnZpc19tb2RlLCBWSVNfVFlQRV9DTElFTlRfVVBEQVRFKTsKLQlhdG9taWNfc2V0KCZiYXRfcHJpdi0+b3JpZ19pbnRlcnZhbCwgMTAwMCk7Ci0JYXRvbWljX3NldCgmYmF0X3ByaXYtPmxvZ19sZXZlbCwgMCk7Ci0JYXRvbWljX3NldCgmYmF0X3ByaXYtPmZyYWdfZW5hYmxlZCwgMSk7Ci0JYXRvbWljX3NldCgmYmF0X3ByaXYtPmJjYXN0X3F1ZXVlX2xlZnQsIEJDQVNUX1FVRVVFX0xFTik7Ci0JYXRvbWljX3NldCgmYmF0X3ByaXYtPmJhdG1hbl9xdWV1ZV9sZWZ0LCBCQVRNQU5fUVVFVUVfTEVOKTsKLQotCWF0b21pY19zZXQoJmJhdF9wcml2LT5tZXNoX3N0YXRlLCBNRVNIX0lOQUNUSVZFKTsKLQlhdG9taWNfc2V0KCZiYXRfcHJpdi0+YmNhc3Rfc2Vxbm8sIDEpOwotCWF0b21pY19zZXQoJmJhdF9wcml2LT5obmFfbG9jYWxfY2hhbmdlZCwgMCk7Ci0KLQliYXRfcHJpdi0+cHJpbWFyeV9pZiA9IE5VTEw7Ci0JYmF0X3ByaXYtPm51bV9pZmFjZXMgPSAwOwotCi0JcmV0ID0gc3lzZnNfYWRkX21lc2hpZihzb2Z0X2lmYWNlKTsKLQlpZiAocmV0IDwgMCkKLQkJZ290byB1bnJlZ19zb2Z0X2lmYWNlOwotCi0JcmV0ID0gZGVidWdmc19hZGRfbWVzaGlmKHNvZnRfaWZhY2UpOwotCWlmIChyZXQgPCAwKQotCQlnb3RvIHVucmVnX3N5c2ZzOwotCi0JcmV0ID0gbWVzaF9pbml0KHNvZnRfaWZhY2UpOwotCWlmIChyZXQgPCAwKQotCQlnb3RvIHVucmVnX2RlYnVnZnM7Ci0KLQlyZXR1cm4gc29mdF9pZmFjZTsKLQotdW5yZWdfZGVidWdmczoKLQlkZWJ1Z2ZzX2RlbF9tZXNoaWYoc29mdF9pZmFjZSk7Ci11bnJlZ19zeXNmczoKLQlzeXNmc19kZWxfbWVzaGlmKHNvZnRfaWZhY2UpOwotdW5yZWdfc29mdF9pZmFjZToKLQl1bnJlZ2lzdGVyX25ldGRldihzb2Z0X2lmYWNlKTsKLQlyZXR1cm4gTlVMTDsKLQotZnJlZV9zb2Z0X2lmYWNlOgotCWZyZWVfbmV0ZGV2KHNvZnRfaWZhY2UpOwotb3V0OgotCXJldHVybiBOVUxMOwotfQotCi12b2lkIHNvZnRpZl9kZXN0cm95KHN0cnVjdCBuZXRfZGV2aWNlICpzb2Z0X2lmYWNlKQotewotCWRlYnVnZnNfZGVsX21lc2hpZihzb2Z0X2lmYWNlKTsKLQlzeXNmc19kZWxfbWVzaGlmKHNvZnRfaWZhY2UpOwotCW1lc2hfZnJlZShzb2Z0X2lmYWNlKTsKLQl1bnJlZ2lzdGVyX25ldGRldmljZShzb2Z0X2lmYWNlKTsKLX0KLQotLyogZXRodG9vbCAqLwotc3RhdGljIGludCBiYXRfZ2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2NtZCAqY21kKQotewotCWNtZC0+c3VwcG9ydGVkID0gMDsKLQljbWQtPmFkdmVydGlzaW5nID0gMDsKLQljbWQtPnNwZWVkID0gU1BFRURfMTA7Ci0JY21kLT5kdXBsZXggPSBEVVBMRVhfRlVMTDsKLQljbWQtPnBvcnQgPSBQT1JUX1RQOwotCWNtZC0+cGh5X2FkZHJlc3MgPSAwOwotCWNtZC0+dHJhbnNjZWl2ZXIgPSBYQ1ZSX0lOVEVSTkFMOwotCWNtZC0+YXV0b25lZyA9IEFVVE9ORUdfRElTQUJMRTsKLQljbWQtPm1heHR4cGt0ID0gMDsKLQljbWQtPm1heHJ4cGt0ID0gMDsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBiYXRfZ2V0X2RydmluZm8oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCSAgICBzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvICppbmZvKQotewotCXN0cmNweShpbmZvLT5kcml2ZXIsICJCLkEuVC5NLkEuTi4gYWR2YW5jZWQiKTsKLQlzdHJjcHkoaW5mby0+dmVyc2lvbiwgU09VUkNFX1ZFUlNJT04pOwotCXN0cmNweShpbmZvLT5md192ZXJzaW9uLCAiTi9BIik7Ci0Jc3RyY3B5KGluZm8tPmJ1c19pbmZvLCAiYmF0bWFuIik7Ci19Ci0KLXN0YXRpYyB1MzIgYmF0X2dldF9tc2dsZXZlbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQotewotCXJldHVybiAtRU9QTk9UU1VQUDsKLX0KLQotc3RhdGljIHZvaWQgYmF0X3NldF9tc2dsZXZlbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgdmFsdWUpCi17Ci19Ci0KLXN0YXRpYyB1MzIgYmF0X2dldF9saW5rKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCi17Ci0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyB1MzIgYmF0X2dldF9yeF9jc3VtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgYmF0X3NldF9yeF9jc3VtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBkYXRhKQotewotCXJldHVybiAtRU9QTk9UU1VQUDsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L3NvZnQtaW50ZXJmYWNlLmggYi9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9zb2Z0LWludGVyZmFjZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDNhN2VjLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L3NvZnQtaW50ZXJmYWNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgQi5BLlQuTS5BLk4uIGNvbnRyaWJ1dG9yczoKLSAqCi0gKiBNYXJlayBMaW5kbmVyCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCi0gKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCi0gKiAwMjExMC0xMzAxLCBVU0EKLSAqCi0gKi8KLQotI2lmbmRlZiBfTkVUX0JBVE1BTl9BRFZfU09GVF9JTlRFUkZBQ0VfSF8KLSNkZWZpbmUgX05FVF9CQVRNQU5fQURWX1NPRlRfSU5URVJGQUNFX0hfCi0KLWludCBteV9za2JfaGVhZF9wdXNoKHN0cnVjdCBza19idWZmICpza2IsIHVuc2lnbmVkIGludCBsZW4pOwotaW50IGludGVyZmFjZV90eChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqc29mdF9pZmFjZSk7Ci12b2lkIGludGVyZmFjZV9yeChzdHJ1Y3QgbmV0X2RldmljZSAqc29mdF9pZmFjZSwKLQkJICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgaGRyX3NpemUpOwotc3RydWN0IG5ldF9kZXZpY2UgKnNvZnRpZl9jcmVhdGUoY2hhciAqbmFtZSk7Ci12b2lkIHNvZnRpZl9kZXN0cm95KHN0cnVjdCBuZXRfZGV2aWNlICpzb2Z0X2lmYWNlKTsKLQotI2VuZGlmIC8qIF9ORVRfQkFUTUFOX0FEVl9TT0ZUX0lOVEVSRkFDRV9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvc3lzZnMtY2xhc3MtbmV0LWJhdG1hbi1hZHYgYi9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9zeXNmcy1jbGFzcy1uZXQtYmF0bWFuLWFkdgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzhkZDc2Mi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9zeXNmcy1jbGFzcy1uZXQtYmF0bWFuLWFkdgorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLQotV2hhdDogICAgICAgICAgIC9zeXMvY2xhc3MvbmV0LzxpZmFjZT4vYmF0bWFuLWFkdi9tZXNoX2lmYWNlCi1EYXRlOiAgICAgICAgICAgTWF5IDIwMTAKLUNvbnRhY3Q6ICAgICAgICBNYXJlayBMaW5kbmVyIDxsaW5kbmVyX21hcmVrQHlhaG9vLmRlPgotRGVzY3JpcHRpb246Ci0gICAgICAgICAgICAgICAgVGhlIC9zeXMvY2xhc3MvbmV0LzxpZmFjZT4vYmF0bWFuLWFkdi9tZXNoX2lmYWNlIGZpbGUKLSAgICAgICAgICAgICAgICBkaXNwbGF5cyB0aGUgYmF0bWFuIG1lc2ggaW50ZXJmYWNlIHRoaXMgPGlmYWNlPgotICAgICAgICAgICAgICAgIGN1cnJlbnRseSBpcyBhc3NvY2lhdGVkIHdpdGguCi0KLVdoYXQ6ICAgICAgICAgICAvc3lzL2NsYXNzL25ldC88aWZhY2U+L2JhdG1hbi1hZHYvaWZhY2Vfc3RhdHVzCi1EYXRlOiAgICAgICAgICAgTWF5IDIwMTAKLUNvbnRhY3Q6ICAgICAgICBNYXJlayBMaW5kbmVyIDxsaW5kbmVyX21hcmVrQHlhaG9vLmRlPgotRGVzY3JpcHRpb246Ci0gICAgICAgICAgICAgICAgSW5kaWNhdGVzIHRoZSBzdGF0dXMgb2YgPGlmYWNlPiBhcyBpdCBpcyBzZWVuIGJ5IGJhdG1hbi4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L3N5c2ZzLWNsYXNzLW5ldC1tZXNoIGIvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvc3lzZnMtY2xhc3MtbmV0LW1lc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0Y2RiNjAuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvc3lzZnMtY2xhc3MtbmV0LW1lc2gKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0KLVdoYXQ6ICAgICAgICAgICAvc3lzL2NsYXNzL25ldC88bWVzaF9pZmFjZT4vbWVzaC9hZ2dyZWdhdGVkX29nbXMKLURhdGU6ICAgICAgICAgICBNYXkgMjAxMAotQ29udGFjdDogICAgICAgIE1hcmVrIExpbmRuZXIgPGxpbmRuZXJfbWFyZWtAeWFob28uZGU+Ci1EZXNjcmlwdGlvbjoKLSAgICAgICAgICAgICAgICBJbmRpY2F0ZXMgd2hldGhlciB0aGUgYmF0bWFuIHByb3RvY29sIG1lc3NhZ2VzIG9mIHRoZQotICAgICAgICAgICAgICAgIG1lc2ggPG1lc2hfaWZhY2U+IHNoYWxsIGJlIGFnZ3JlZ2F0ZWQgb3Igbm90LgotCi1XaGF0OiAgICAgICAgICAgL3N5cy9jbGFzcy9uZXQvPG1lc2hfaWZhY2U+L21lc2gvYm9uZGluZwotRGF0ZTogICAgICAgICAgIEp1bmUgMjAxMAotQ29udGFjdDogICAgICAgIFNpbW9uIFd1bmRlcmxpY2ggPHNpd3VAaHJ6LnR1LWNoZW1uaXR6LmRlPgotRGVzY3JpcHRpb246Ci0gICAgICAgICAgICAgICAgSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGRhdGEgdHJhZmZpYyBnb2luZyB0aHJvdWdoIHRoZQotICAgICAgICAgICAgICAgIG1lc2ggd2lsbCBiZSBzZW50IHVzaW5nIG11bHRpcGxlIGludGVyZmFjZXMgYXQgdGhlCi0gICAgICAgICAgICAgICAgc2FtZSB0aW1lIChpZiBhdmFpbGFibGUpLgotCi1XaGF0OiAgICAgICAgICAgL3N5cy9jbGFzcy9uZXQvPG1lc2hfaWZhY2U+L21lc2gvZnJhZ21lbnRhdGlvbgotRGF0ZTogICAgICAgICAgIE9jdG9iZXIgMjAxMAotQ29udGFjdDogICAgICAgIEFuZHJlYXMgTGFuZ2VyIDxhbi5sYW5nZXJAZ214LmRlPgotRGVzY3JpcHRpb246Ci0gICAgICAgICAgICAgICAgSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGRhdGEgdHJhZmZpYyBnb2luZyB0aHJvdWdoIHRoZQotICAgICAgICAgICAgICAgIG1lc2ggd2lsbCBiZSBmcmFnbWVudGVkIG9yIHNpbGVudGx5IGRpc2NhcmRlZCBpZiB0aGUKLSAgICAgICAgICAgICAgICBwYWNrZXQgc2l6ZSBleGNlZWRzIHRoZSBvdXRnb2luZyBpbnRlcmZhY2UgTVRVLgotCi1XaGF0OiAgICAgICAgICAgL3N5cy9jbGFzcy9uZXQvPG1lc2hfaWZhY2U+L21lc2gvb3JpZ19pbnRlcnZhbAotRGF0ZTogICAgICAgICAgIE1heSAyMDEwCi1Db250YWN0OiAgICAgICAgTWFyZWsgTGluZG5lciA8bGluZG5lcl9tYXJla0B5YWhvby5kZT4KLURlc2NyaXB0aW9uOgotICAgICAgICAgICAgICAgIERlZmluZXMgdGhlIGludGVydmFsIGluIG1pbGxpc2Vjb25kcyBpbiB3aGljaCBiYXRtYW4KLSAgICAgICAgICAgICAgICBzZW5kcyBpdHMgcHJvdG9jb2wgbWVzc2FnZXMuCi0KLVdoYXQ6ICAgICAgICAgICAvc3lzL2NsYXNzL25ldC88bWVzaF9pZmFjZT4vbWVzaC92aXNfbW9kZQotRGF0ZTogICAgICAgICAgIE1heSAyMDEwCi1Db250YWN0OiAgICAgICAgTWFyZWsgTGluZG5lciA8bGluZG5lcl9tYXJla0B5YWhvby5kZT4KLURlc2NyaXB0aW9uOgotICAgICAgICAgICAgICAgIEVhY2ggYmF0bWFuIG5vZGUgb25seSBtYWludGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgaXRzCi0gICAgICAgICAgICAgICAgb3duIGxvY2FsIG5laWdoYm9yaG9vZCwgdGhlcmVmb3JlIGdlbmVyYXRpbmcgZ3JhcGhzCi0gICAgICAgICAgICAgICAgc2hvd2luZyB0aGUgdG9wb2xvZ3kgb2YgdGhlIGVudGlyZSBtZXNoIGlzIG5vdCBlYXNpbHkKLSAgICAgICAgICAgICAgICBmZWFzaWJsZSB3aXRob3V0IGhhdmluZyBhIGNlbnRyYWwgaW5zdGFuY2UgdG8gY29sbGVjdAotICAgICAgICAgICAgICAgIHRoZSBsb2NhbCB0b3BvbG9naWVzIGZyb20gYWxsIG5vZGVzLiBUaGlzIGZpbGUgYWxsb3dzCi0gICAgICAgICAgICAgICAgdG8gYWN0aXZhdGUgdGhlIGNvbGxlY3RpbmcgKHNlcnZlcikgbW9kZS4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L3RyYW5zbGF0aW9uLXRhYmxlLmMgYi9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi90cmFuc2xhdGlvbi10YWJsZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODFjY2JkLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L3RyYW5zbGF0aW9uLXRhYmxlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MTggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIEIuQS5ULk0uQS5OLiBjb250cmlidXRvcnM6Ci0gKgotICogTWFyZWsgTGluZG5lciwgU2ltb24gV3VuZGVybGljaAotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQotICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQotICogMDIxMTAtMTMwMSwgVVNBCi0gKgotICovCi0KLSNpbmNsdWRlICJtYWluLmgiCi0jaW5jbHVkZSAidHJhbnNsYXRpb24tdGFibGUuaCIKLSNpbmNsdWRlICJzb2Z0LWludGVyZmFjZS5oIgotI2luY2x1ZGUgInR5cGVzLmgiCi0jaW5jbHVkZSAiaGFzaC5oIgotCi1zdGF0aWMgdm9pZCBobmFfbG9jYWxfcHVyZ2Uoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKLXN0YXRpYyB2b2lkIF9obmFfZ2xvYmFsX2RlbF9vcmlnKHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYsCi0JCQkJIHN0cnVjdCBobmFfZ2xvYmFsX2VudHJ5ICpobmFfZ2xvYmFsX2VudHJ5LAotCQkJCSBjaGFyICptZXNzYWdlKTsKLQotc3RhdGljIHZvaWQgaG5hX2xvY2FsX3N0YXJ0X3RpbWVyKHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYpCi17Ci0JSU5JVF9ERUxBWUVEX1dPUksoJmJhdF9wcml2LT5obmFfd29yaywgaG5hX2xvY2FsX3B1cmdlKTsKLQlxdWV1ZV9kZWxheWVkX3dvcmsoYmF0X2V2ZW50X3dvcmtxdWV1ZSwgJmJhdF9wcml2LT5obmFfd29yaywgMTAgKiBIWik7Ci19Ci0KLWludCBobmFfbG9jYWxfaW5pdChzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2KQotewotCWlmIChiYXRfcHJpdi0+aG5hX2xvY2FsX2hhc2gpCi0JCXJldHVybiAxOwotCi0JYmF0X3ByaXYtPmhuYV9sb2NhbF9oYXNoID0gaGFzaF9uZXcoMTI4LCBjb21wYXJlX29yaWcsIGNob29zZV9vcmlnKTsKLQotCWlmICghYmF0X3ByaXYtPmhuYV9sb2NhbF9oYXNoKQotCQlyZXR1cm4gMDsKLQotCWF0b21pY19zZXQoJmJhdF9wcml2LT5obmFfbG9jYWxfY2hhbmdlZCwgMCk7Ci0JaG5hX2xvY2FsX3N0YXJ0X3RpbWVyKGJhdF9wcml2KTsKLQotCXJldHVybiAxOwotfQotCi12b2lkIGhuYV9sb2NhbF9hZGQoc3RydWN0IG5ldF9kZXZpY2UgKnNvZnRfaWZhY2UsIHVpbnQ4X3QgKmFkZHIpCi17Ci0Jc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiA9IG5ldGRldl9wcml2KHNvZnRfaWZhY2UpOwotCXN0cnVjdCBobmFfbG9jYWxfZW50cnkgKmhuYV9sb2NhbF9lbnRyeTsKLQlzdHJ1Y3QgaG5hX2dsb2JhbF9lbnRyeSAqaG5hX2dsb2JhbF9lbnRyeTsKLQlzdHJ1Y3QgaGFzaHRhYmxlX3QgKnN3YXBoYXNoOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IHJlcXVpcmVkX2J5dGVzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmJhdF9wcml2LT5obmFfbGhhc2hfbG9jaywgZmxhZ3MpOwotCWhuYV9sb2NhbF9lbnRyeSA9Ci0JCSgoc3RydWN0IGhuYV9sb2NhbF9lbnRyeSAqKWhhc2hfZmluZChiYXRfcHJpdi0+aG5hX2xvY2FsX2hhc2gsCi0JCQkJCQkgICAgIGFkZHIpKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiYXRfcHJpdi0+aG5hX2xoYXNoX2xvY2ssIGZsYWdzKTsKLQotCWlmIChobmFfbG9jYWxfZW50cnkpIHsKLQkJaG5hX2xvY2FsX2VudHJ5LT5sYXN0X3NlZW4gPSBqaWZmaWVzOwotCQlyZXR1cm47Ci0JfQotCi0JLyogb25seSBhbm5vdW5jZSBhcyBtYW55IGhvc3RzIGFzIHBvc3NpYmxlIGluIHRoZSBiYXRtYW4tcGFja2V0IGFuZAotCSAgIHNwYWNlIGluIGJhdG1hbl9wYWNrZXQtPm51bV9obmEgVGhhdCBhbHNvIHNob3VsZCBnaXZlIGEgbGltaXQgdG8KLQkgICBNQUMtZmxvb2RpbmcuICovCi0JcmVxdWlyZWRfYnl0ZXMgPSAoYmF0X3ByaXYtPm51bV9sb2NhbF9obmEgKyAxKSAqIEVUSF9BTEVOOwotCXJlcXVpcmVkX2J5dGVzICs9IEJBVF9QQUNLRVRfTEVOOwotCi0JaWYgKChyZXF1aXJlZF9ieXRlcyA+IEVUSF9EQVRBX0xFTikgfHwKLQkgICAgKGF0b21pY19yZWFkKCZiYXRfcHJpdi0+YWdncmVnYXRpb25fZW5hYmxlZCkgJiYKLQkgICAgIHJlcXVpcmVkX2J5dGVzID4gTUFYX0FHR1JFR0FUSU9OX0JZVEVTKSB8fAotCSAgICAoYmF0X3ByaXYtPm51bV9sb2NhbF9obmEgKyAxID4gMjU1KSkgewotCQliYXRfZGJnKERCR19ST1VURVMsIGJhdF9wcml2LAotCQkJIkNhbid0IGFkZCBuZXcgbG9jYWwgaG5hIGVudHJ5ICglcE0pOiAiCi0JCQkibnVtYmVyIG9mIGxvY2FsIGhuYSBlbnRyaWVzIGV4Y2VlZHMgcGFja2V0IHNpemVcbiIsCi0JCQlhZGRyKTsKLQkJcmV0dXJuOwotCX0KLQotCWJhdF9kYmcoREJHX1JPVVRFUywgYmF0X3ByaXYsCi0JCSJDcmVhdGluZyBuZXcgbG9jYWwgaG5hIGVudHJ5OiAlcE1cbiIsIGFkZHIpOwotCi0JaG5hX2xvY2FsX2VudHJ5ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGhuYV9sb2NhbF9lbnRyeSksIEdGUF9BVE9NSUMpOwotCWlmICghaG5hX2xvY2FsX2VudHJ5KQotCQlyZXR1cm47Ci0KLQltZW1jcHkoaG5hX2xvY2FsX2VudHJ5LT5hZGRyLCBhZGRyLCBFVEhfQUxFTik7Ci0JaG5hX2xvY2FsX2VudHJ5LT5sYXN0X3NlZW4gPSBqaWZmaWVzOwotCi0JLyogdGhlIGJhdG1hbiBpbnRlcmZhY2UgbWFjIGFkZHJlc3Mgc2hvdWxkIG5ldmVyIGJlIHB1cmdlZCAqLwotCWlmIChjb21wYXJlX29yaWcoYWRkciwgc29mdF9pZmFjZS0+ZGV2X2FkZHIpKQotCQlobmFfbG9jYWxfZW50cnktPm5ldmVyX3B1cmdlID0gMTsKLQllbHNlCi0JCWhuYV9sb2NhbF9lbnRyeS0+bmV2ZXJfcHVyZ2UgPSAwOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmJhdF9wcml2LT5obmFfbGhhc2hfbG9jaywgZmxhZ3MpOwotCi0JaGFzaF9hZGQoYmF0X3ByaXYtPmhuYV9sb2NhbF9oYXNoLCBobmFfbG9jYWxfZW50cnkpOwotCWJhdF9wcml2LT5udW1fbG9jYWxfaG5hKys7Ci0JYXRvbWljX3NldCgmYmF0X3ByaXYtPmhuYV9sb2NhbF9jaGFuZ2VkLCAxKTsKLQotCWlmIChiYXRfcHJpdi0+aG5hX2xvY2FsX2hhc2gtPmVsZW1lbnRzICogNCA+Ci0JCQkJCWJhdF9wcml2LT5obmFfbG9jYWxfaGFzaC0+c2l6ZSkgewotCQlzd2FwaGFzaCA9IGhhc2hfcmVzaXplKGJhdF9wcml2LT5obmFfbG9jYWxfaGFzaCwKLQkJCQkgICAgICAgYmF0X3ByaXYtPmhuYV9sb2NhbF9oYXNoLT5zaXplICogMik7Ci0KLQkJaWYgKCFzd2FwaGFzaCkKLQkJCXByX2VycigiQ291bGRuJ3QgcmVzaXplIGxvY2FsIGhuYSBoYXNoIHRhYmxlXG4iKTsKLQkJZWxzZQotCQkJYmF0X3ByaXYtPmhuYV9sb2NhbF9oYXNoID0gc3dhcGhhc2g7Ci0JfQotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmF0X3ByaXYtPmhuYV9saGFzaF9sb2NrLCBmbGFncyk7Ci0KLQkvKiByZW1vdmUgYWRkcmVzcyBmcm9tIGdsb2JhbCBoYXNoIGlmIHByZXNlbnQgKi8KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYmF0X3ByaXYtPmhuYV9naGFzaF9sb2NrLCBmbGFncyk7Ci0KLQlobmFfZ2xvYmFsX2VudHJ5ID0gKChzdHJ1Y3QgaG5hX2dsb2JhbF9lbnRyeSAqKQotCQkJCWhhc2hfZmluZChiYXRfcHJpdi0+aG5hX2dsb2JhbF9oYXNoLCBhZGRyKSk7Ci0KLQlpZiAoaG5hX2dsb2JhbF9lbnRyeSkKLQkJX2huYV9nbG9iYWxfZGVsX29yaWcoYmF0X3ByaXYsIGhuYV9nbG9iYWxfZW50cnksCi0JCQkJICAgICAibG9jYWwgaG5hIHJlY2VpdmVkIik7Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiYXRfcHJpdi0+aG5hX2doYXNoX2xvY2ssIGZsYWdzKTsKLX0KLQotaW50IGhuYV9sb2NhbF9maWxsX2J1ZmZlcihzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2LAotCQkJICB1bnNpZ25lZCBjaGFyICpidWZmLCBpbnQgYnVmZl9sZW4pCi17Ci0Jc3RydWN0IGhuYV9sb2NhbF9lbnRyeSAqaG5hX2xvY2FsX2VudHJ5OwotCUhBU0hJVChoYXNoaXQpOwotCWludCBpID0gMDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmJhdF9wcml2LT5obmFfbGhhc2hfbG9jaywgZmxhZ3MpOwotCi0Jd2hpbGUgKGhhc2hfaXRlcmF0ZShiYXRfcHJpdi0+aG5hX2xvY2FsX2hhc2gsICZoYXNoaXQpKSB7Ci0KLQkJaWYgKGJ1ZmZfbGVuIDwgKGkgKyAxKSAqIEVUSF9BTEVOKQotCQkJYnJlYWs7Ci0KLQkJaG5hX2xvY2FsX2VudHJ5ID0gaGFzaGl0LmJ1Y2tldC0+ZGF0YTsKLQkJbWVtY3B5KGJ1ZmYgKyAoaSAqIEVUSF9BTEVOKSwgaG5hX2xvY2FsX2VudHJ5LT5hZGRyLCBFVEhfQUxFTik7Ci0KLQkJaSsrOwotCX0KLQotCS8qIGlmIHdlIGRpZCBub3QgZ2V0IGFsbCBuZXcgbG9jYWwgaG5hcyBzZWUgeW91IG5leHQgdGltZSAgOy0pICovCi0JaWYgKGkgPT0gYmF0X3ByaXYtPm51bV9sb2NhbF9obmEpCi0JCWF0b21pY19zZXQoJmJhdF9wcml2LT5obmFfbG9jYWxfY2hhbmdlZCwgMCk7Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiYXRfcHJpdi0+aG5hX2xoYXNoX2xvY2ssIGZsYWdzKTsKLQlyZXR1cm4gaTsKLX0KLQotaW50IGhuYV9sb2NhbF9zZXFfcHJpbnRfdGV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqb2Zmc2V0KQotewotCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopc2VxLT5wcml2YXRlOwotCXN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYgPSBuZXRkZXZfcHJpdihuZXRfZGV2KTsKLQlzdHJ1Y3QgaG5hX2xvY2FsX2VudHJ5ICpobmFfbG9jYWxfZW50cnk7Ci0JSEFTSElUKGhhc2hpdCk7Ci0JSEFTSElUKGhhc2hpdF9jb3VudCk7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzaXplX3QgYnVmX3NpemUsIHBvczsKLQljaGFyICpidWZmOwotCi0JaWYgKCFiYXRfcHJpdi0+cHJpbWFyeV9pZikgewotCQlyZXR1cm4gc2VxX3ByaW50ZihzZXEsICJCQVRNQU4gbWVzaCAlcyBkaXNhYmxlZCAtICIKLQkJCSAgICAgICAicGxlYXNlIHNwZWNpZnkgaW50ZXJmYWNlcyB0byBlbmFibGUgaXRcbiIsCi0JCQkgICAgICAgbmV0X2Rldi0+bmFtZSk7Ci0JfQotCi0Jc2VxX3ByaW50ZihzZXEsICJMb2NhbGx5IHJldHJpZXZlZCBhZGRyZXNzZXMgKGZyb20gJXMpICIKLQkJICAgImFubm91bmNlZCB2aWEgSE5BOlxuIiwKLQkJICAgbmV0X2Rldi0+bmFtZSk7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYmF0X3ByaXYtPmhuYV9saGFzaF9sb2NrLCBmbGFncyk7Ci0KLQlidWZfc2l6ZSA9IDE7Ci0JLyogRXN0aW1hdGUgbGVuZ3RoIGZvcjogIiAqIHh4Onh4Onh4Onh4Onh4Onh4XG4iICovCi0Jd2hpbGUgKGhhc2hfaXRlcmF0ZShiYXRfcHJpdi0+aG5hX2xvY2FsX2hhc2gsICZoYXNoaXRfY291bnQpKQotCQlidWZfc2l6ZSArPSAyMTsKLQotCWJ1ZmYgPSBrbWFsbG9jKGJ1Zl9zaXplLCBHRlBfQVRPTUlDKTsKLQlpZiAoIWJ1ZmYpIHsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmF0X3ByaXYtPmhuYV9saGFzaF9sb2NrLCBmbGFncyk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQlidWZmWzBdID0gJ1wwJzsKLQlwb3MgPSAwOwotCi0Jd2hpbGUgKGhhc2hfaXRlcmF0ZShiYXRfcHJpdi0+aG5hX2xvY2FsX2hhc2gsICZoYXNoaXQpKSB7Ci0JCWhuYV9sb2NhbF9lbnRyeSA9IGhhc2hpdC5idWNrZXQtPmRhdGE7Ci0KLQkJcG9zICs9IHNucHJpbnRmKGJ1ZmYgKyBwb3MsIDIyLCAiICogJXBNXG4iLAotCQkJCWhuYV9sb2NhbF9lbnRyeS0+YWRkcik7Ci0JfQotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmF0X3ByaXYtPmhuYV9saGFzaF9sb2NrLCBmbGFncyk7Ci0KLQlzZXFfcHJpbnRmKHNlcSwgIiVzIiwgYnVmZik7Ci0Ja2ZyZWUoYnVmZik7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIF9obmFfbG9jYWxfZGVsKHZvaWQgKmRhdGEsIHZvaWQgKmFyZykKLXsKLQlzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2ID0gKHN0cnVjdCBiYXRfcHJpdiAqKWFyZzsKLQotCWtmcmVlKGRhdGEpOwotCWJhdF9wcml2LT5udW1fbG9jYWxfaG5hLS07Ci0JYXRvbWljX3NldCgmYmF0X3ByaXYtPmhuYV9sb2NhbF9jaGFuZ2VkLCAxKTsKLX0KLQotc3RhdGljIHZvaWQgaG5hX2xvY2FsX2RlbChzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2LAotCQkJICBzdHJ1Y3QgaG5hX2xvY2FsX2VudHJ5ICpobmFfbG9jYWxfZW50cnksCi0JCQkgIGNoYXIgKm1lc3NhZ2UpCi17Ci0JYmF0X2RiZyhEQkdfUk9VVEVTLCBiYXRfcHJpdiwgIkRlbGV0aW5nIGxvY2FsIGhuYSBlbnRyeSAoJXBNKTogJXNcbiIsCi0JCWhuYV9sb2NhbF9lbnRyeS0+YWRkciwgbWVzc2FnZSk7Ci0KLQloYXNoX3JlbW92ZShiYXRfcHJpdi0+aG5hX2xvY2FsX2hhc2gsIGhuYV9sb2NhbF9lbnRyeS0+YWRkcik7Ci0JX2huYV9sb2NhbF9kZWwoaG5hX2xvY2FsX2VudHJ5LCBiYXRfcHJpdik7Ci19Ci0KLXZvaWQgaG5hX2xvY2FsX3JlbW92ZShzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2LAotCQkgICAgICB1aW50OF90ICphZGRyLCBjaGFyICptZXNzYWdlKQotewotCXN0cnVjdCBobmFfbG9jYWxfZW50cnkgKmhuYV9sb2NhbF9lbnRyeTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmJhdF9wcml2LT5obmFfbGhhc2hfbG9jaywgZmxhZ3MpOwotCi0JaG5hX2xvY2FsX2VudHJ5ID0gKHN0cnVjdCBobmFfbG9jYWxfZW50cnkgKikKLQkJaGFzaF9maW5kKGJhdF9wcml2LT5obmFfbG9jYWxfaGFzaCwgYWRkcik7Ci0JaWYgKGhuYV9sb2NhbF9lbnRyeSkKLQkJaG5hX2xvY2FsX2RlbChiYXRfcHJpdiwgaG5hX2xvY2FsX2VudHJ5LCBtZXNzYWdlKTsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJhdF9wcml2LT5obmFfbGhhc2hfbG9jaywgZmxhZ3MpOwotfQotCi1zdGF0aWMgdm9pZCBobmFfbG9jYWxfcHVyZ2Uoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQotewotCXN0cnVjdCBkZWxheWVkX3dvcmsgKmRlbGF5ZWRfd29yayA9Ci0JCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgZGVsYXllZF93b3JrLCB3b3JrKTsKLQlzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2ID0KLQkJY29udGFpbmVyX29mKGRlbGF5ZWRfd29yaywgc3RydWN0IGJhdF9wcml2LCBobmFfd29yayk7Ci0Jc3RydWN0IGhuYV9sb2NhbF9lbnRyeSAqaG5hX2xvY2FsX2VudHJ5OwotCUhBU0hJVChoYXNoaXQpOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdW5zaWduZWQgbG9uZyB0aW1lb3V0OwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmJhdF9wcml2LT5obmFfbGhhc2hfbG9jaywgZmxhZ3MpOwotCi0Jd2hpbGUgKGhhc2hfaXRlcmF0ZShiYXRfcHJpdi0+aG5hX2xvY2FsX2hhc2gsICZoYXNoaXQpKSB7Ci0JCWhuYV9sb2NhbF9lbnRyeSA9IGhhc2hpdC5idWNrZXQtPmRhdGE7Ci0KLQkJdGltZW91dCA9IGhuYV9sb2NhbF9lbnRyeS0+bGFzdF9zZWVuICsgTE9DQUxfSE5BX1RJTUVPVVQgKiBIWjsKLQotCQlpZiAoKCFobmFfbG9jYWxfZW50cnktPm5ldmVyX3B1cmdlKSAmJgotCQkgICAgdGltZV9hZnRlcihqaWZmaWVzLCB0aW1lb3V0KSkKLQkJCWhuYV9sb2NhbF9kZWwoYmF0X3ByaXYsIGhuYV9sb2NhbF9lbnRyeSwKLQkJCQkgICAgICAiYWRkcmVzcyB0aW1lZCBvdXQiKTsKLQl9Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiYXRfcHJpdi0+aG5hX2xoYXNoX2xvY2ssIGZsYWdzKTsKLQlobmFfbG9jYWxfc3RhcnRfdGltZXIoYmF0X3ByaXYpOwotfQotCi12b2lkIGhuYV9sb2NhbF9mcmVlKHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYpCi17Ci0JaWYgKCFiYXRfcHJpdi0+aG5hX2xvY2FsX2hhc2gpCi0JCXJldHVybjsKLQotCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmYmF0X3ByaXYtPmhuYV93b3JrKTsKLQloYXNoX2RlbGV0ZShiYXRfcHJpdi0+aG5hX2xvY2FsX2hhc2gsIF9obmFfbG9jYWxfZGVsLCBiYXRfcHJpdik7Ci0JYmF0X3ByaXYtPmhuYV9sb2NhbF9oYXNoID0gTlVMTDsKLX0KLQotaW50IGhuYV9nbG9iYWxfaW5pdChzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2KQotewotCWlmIChiYXRfcHJpdi0+aG5hX2dsb2JhbF9oYXNoKQotCQlyZXR1cm4gMTsKLQotCWJhdF9wcml2LT5obmFfZ2xvYmFsX2hhc2ggPSBoYXNoX25ldygxMjgsIGNvbXBhcmVfb3JpZywgY2hvb3NlX29yaWcpOwotCi0JaWYgKCFiYXRfcHJpdi0+aG5hX2dsb2JhbF9oYXNoKQotCQlyZXR1cm4gMDsKLQotCXJldHVybiAxOwotfQotCi12b2lkIGhuYV9nbG9iYWxfYWRkX29yaWcoc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiwKLQkJCSBzdHJ1Y3Qgb3JpZ19ub2RlICpvcmlnX25vZGUsCi0JCQkgdW5zaWduZWQgY2hhciAqaG5hX2J1ZmYsIGludCBobmFfYnVmZl9sZW4pCi17Ci0Jc3RydWN0IGhuYV9nbG9iYWxfZW50cnkgKmhuYV9nbG9iYWxfZW50cnk7Ci0Jc3RydWN0IGhuYV9sb2NhbF9lbnRyeSAqaG5hX2xvY2FsX2VudHJ5OwotCXN0cnVjdCBoYXNodGFibGVfdCAqc3dhcGhhc2g7Ci0JaW50IGhuYV9idWZmX2NvdW50ID0gMDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXVuc2lnbmVkIGNoYXIgKmhuYV9wdHI7Ci0KLQl3aGlsZSAoKGhuYV9idWZmX2NvdW50ICsgMSkgKiBFVEhfQUxFTiA8PSBobmFfYnVmZl9sZW4pIHsKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmJhdF9wcml2LT5obmFfZ2hhc2hfbG9jaywgZmxhZ3MpOwotCi0JCWhuYV9wdHIgPSBobmFfYnVmZiArIChobmFfYnVmZl9jb3VudCAqIEVUSF9BTEVOKTsKLQkJaG5hX2dsb2JhbF9lbnRyeSA9IChzdHJ1Y3QgaG5hX2dsb2JhbF9lbnRyeSAqKQotCQkJaGFzaF9maW5kKGJhdF9wcml2LT5obmFfZ2xvYmFsX2hhc2gsIGhuYV9wdHIpOwotCi0JCWlmICghaG5hX2dsb2JhbF9lbnRyeSkgewotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmF0X3ByaXYtPmhuYV9naGFzaF9sb2NrLAotCQkJCQkgICAgICAgZmxhZ3MpOwotCi0JCQlobmFfZ2xvYmFsX2VudHJ5ID0KLQkJCQlrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaG5hX2dsb2JhbF9lbnRyeSksCi0JCQkJCUdGUF9BVE9NSUMpOwotCi0JCQlpZiAoIWhuYV9nbG9iYWxfZW50cnkpCi0JCQkJYnJlYWs7Ci0KLQkJCW1lbWNweShobmFfZ2xvYmFsX2VudHJ5LT5hZGRyLCBobmFfcHRyLCBFVEhfQUxFTik7Ci0KLQkJCWJhdF9kYmcoREJHX1JPVVRFUywgYmF0X3ByaXYsCi0JCQkJIkNyZWF0aW5nIG5ldyBnbG9iYWwgaG5hIGVudHJ5OiAiCi0JCQkJIiVwTSAodmlhICVwTSlcbiIsCi0JCQkJaG5hX2dsb2JhbF9lbnRyeS0+YWRkciwgb3JpZ19ub2RlLT5vcmlnKTsKLQotCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmJhdF9wcml2LT5obmFfZ2hhc2hfbG9jaywgZmxhZ3MpOwotCQkJaGFzaF9hZGQoYmF0X3ByaXYtPmhuYV9nbG9iYWxfaGFzaCwgaG5hX2dsb2JhbF9lbnRyeSk7Ci0KLQkJfQotCi0JCWhuYV9nbG9iYWxfZW50cnktPm9yaWdfbm9kZSA9IG9yaWdfbm9kZTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmF0X3ByaXYtPmhuYV9naGFzaF9sb2NrLCBmbGFncyk7Ci0KLQkJLyogcmVtb3ZlIGFkZHJlc3MgZnJvbSBsb2NhbCBoYXNoIGlmIHByZXNlbnQgKi8KLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmJhdF9wcml2LT5obmFfbGhhc2hfbG9jaywgZmxhZ3MpOwotCi0JCWhuYV9wdHIgPSBobmFfYnVmZiArIChobmFfYnVmZl9jb3VudCAqIEVUSF9BTEVOKTsKLQkJaG5hX2xvY2FsX2VudHJ5ID0gKHN0cnVjdCBobmFfbG9jYWxfZW50cnkgKikKLQkJCWhhc2hfZmluZChiYXRfcHJpdi0+aG5hX2xvY2FsX2hhc2gsIGhuYV9wdHIpOwotCi0JCWlmIChobmFfbG9jYWxfZW50cnkpCi0JCQlobmFfbG9jYWxfZGVsKGJhdF9wcml2LCBobmFfbG9jYWxfZW50cnksCi0JCQkJICAgICAgImdsb2JhbCBobmEgcmVjZWl2ZWQiKTsKLQotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiYXRfcHJpdi0+aG5hX2xoYXNoX2xvY2ssIGZsYWdzKTsKLQotCQlobmFfYnVmZl9jb3VudCsrOwotCX0KLQotCS8qIGluaXRpYWxpemUsIGFuZCBvdmVyd3JpdGUgaWYgbWFsbG9jIHN1Y2NlZWRzICovCi0Jb3JpZ19ub2RlLT5obmFfYnVmZiA9IE5VTEw7Ci0Jb3JpZ19ub2RlLT5obmFfYnVmZl9sZW4gPSAwOwotCi0JaWYgKGhuYV9idWZmX2xlbiA+IDApIHsKLQkJb3JpZ19ub2RlLT5obmFfYnVmZiA9IGttYWxsb2MoaG5hX2J1ZmZfbGVuLCBHRlBfQVRPTUlDKTsKLQkJaWYgKG9yaWdfbm9kZS0+aG5hX2J1ZmYpIHsKLQkJCW1lbWNweShvcmlnX25vZGUtPmhuYV9idWZmLCBobmFfYnVmZiwgaG5hX2J1ZmZfbGVuKTsKLQkJCW9yaWdfbm9kZS0+aG5hX2J1ZmZfbGVuID0gaG5hX2J1ZmZfbGVuOwotCQl9Ci0JfQotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmJhdF9wcml2LT5obmFfZ2hhc2hfbG9jaywgZmxhZ3MpOwotCi0JaWYgKGJhdF9wcml2LT5obmFfZ2xvYmFsX2hhc2gtPmVsZW1lbnRzICogNCA+Ci0JCQkJCWJhdF9wcml2LT5obmFfZ2xvYmFsX2hhc2gtPnNpemUpIHsKLQkJc3dhcGhhc2ggPSBoYXNoX3Jlc2l6ZShiYXRfcHJpdi0+aG5hX2dsb2JhbF9oYXNoLAotCQkJCSAgICAgICBiYXRfcHJpdi0+aG5hX2dsb2JhbF9oYXNoLT5zaXplICogMik7Ci0KLQkJaWYgKCFzd2FwaGFzaCkKLQkJCXByX2VycigiQ291bGRuJ3QgcmVzaXplIGdsb2JhbCBobmEgaGFzaCB0YWJsZVxuIik7Ci0JCWVsc2UKLQkJCWJhdF9wcml2LT5obmFfZ2xvYmFsX2hhc2ggPSBzd2FwaGFzaDsKLQl9Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiYXRfcHJpdi0+aG5hX2doYXNoX2xvY2ssIGZsYWdzKTsKLX0KLQotaW50IGhuYV9nbG9iYWxfc2VxX3ByaW50X3RleHQoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKm9mZnNldCkKLXsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKXNlcS0+cHJpdmF0ZTsKLQlzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2ID0gbmV0ZGV2X3ByaXYobmV0X2Rldik7Ci0Jc3RydWN0IGhuYV9nbG9iYWxfZW50cnkgKmhuYV9nbG9iYWxfZW50cnk7Ci0JSEFTSElUKGhhc2hpdCk7Ci0JSEFTSElUKGhhc2hpdF9jb3VudCk7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzaXplX3QgYnVmX3NpemUsIHBvczsKLQljaGFyICpidWZmOwotCi0JaWYgKCFiYXRfcHJpdi0+cHJpbWFyeV9pZikgewotCQlyZXR1cm4gc2VxX3ByaW50ZihzZXEsICJCQVRNQU4gbWVzaCAlcyBkaXNhYmxlZCAtICIKLQkJCQkgICJwbGVhc2Ugc3BlY2lmeSBpbnRlcmZhY2VzIHRvIGVuYWJsZSBpdFxuIiwKLQkJCQkgIG5ldF9kZXYtPm5hbWUpOwotCX0KLQotCXNlcV9wcmludGYoc2VxLCAiR2xvYmFsbHkgYW5ub3VuY2VkIEhOQXMgcmVjZWl2ZWQgdmlhIHRoZSBtZXNoICVzXG4iLAotCQkgICBuZXRfZGV2LT5uYW1lKTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZiYXRfcHJpdi0+aG5hX2doYXNoX2xvY2ssIGZsYWdzKTsKLQotCWJ1Zl9zaXplID0gMTsKLQkvKiBFc3RpbWF0ZSBsZW5ndGggZm9yOiAiICogeHg6eHg6eHg6eHg6eHg6eHggdmlhIHh4Onh4Onh4Onh4Onh4Onh4XG4iKi8KLQl3aGlsZSAoaGFzaF9pdGVyYXRlKGJhdF9wcml2LT5obmFfZ2xvYmFsX2hhc2gsICZoYXNoaXRfY291bnQpKQotCQlidWZfc2l6ZSArPSA0MzsKLQotCWJ1ZmYgPSBrbWFsbG9jKGJ1Zl9zaXplLCBHRlBfQVRPTUlDKTsKLQlpZiAoIWJ1ZmYpIHsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmF0X3ByaXYtPmhuYV9naGFzaF9sb2NrLCBmbGFncyk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQlidWZmWzBdID0gJ1wwJzsKLQlwb3MgPSAwOwotCi0Jd2hpbGUgKGhhc2hfaXRlcmF0ZShiYXRfcHJpdi0+aG5hX2dsb2JhbF9oYXNoLCAmaGFzaGl0KSkgewotCQlobmFfZ2xvYmFsX2VudHJ5ID0gaGFzaGl0LmJ1Y2tldC0+ZGF0YTsKLQotCQlwb3MgKz0gc25wcmludGYoYnVmZiArIHBvcywgNDQsCi0JCQkJIiAqICVwTSB2aWEgJXBNXG4iLCBobmFfZ2xvYmFsX2VudHJ5LT5hZGRyLAotCQkJCWhuYV9nbG9iYWxfZW50cnktPm9yaWdfbm9kZS0+b3JpZyk7Ci0JfQotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmF0X3ByaXYtPmhuYV9naGFzaF9sb2NrLCBmbGFncyk7Ci0KLQlzZXFfcHJpbnRmKHNlcSwgIiVzIiwgYnVmZik7Ci0Ja2ZyZWUoYnVmZik7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIF9obmFfZ2xvYmFsX2RlbF9vcmlnKHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYsCi0JCQkJIHN0cnVjdCBobmFfZ2xvYmFsX2VudHJ5ICpobmFfZ2xvYmFsX2VudHJ5LAotCQkJCSBjaGFyICptZXNzYWdlKQotewotCWJhdF9kYmcoREJHX1JPVVRFUywgYmF0X3ByaXYsCi0JCSJEZWxldGluZyBnbG9iYWwgaG5hIGVudHJ5ICVwTSAodmlhICVwTSk6ICVzXG4iLAotCQlobmFfZ2xvYmFsX2VudHJ5LT5hZGRyLCBobmFfZ2xvYmFsX2VudHJ5LT5vcmlnX25vZGUtPm9yaWcsCi0JCW1lc3NhZ2UpOwotCi0JaGFzaF9yZW1vdmUoYmF0X3ByaXYtPmhuYV9nbG9iYWxfaGFzaCwgaG5hX2dsb2JhbF9lbnRyeS0+YWRkcik7Ci0Ja2ZyZWUoaG5hX2dsb2JhbF9lbnRyeSk7Ci19Ci0KLXZvaWQgaG5hX2dsb2JhbF9kZWxfb3JpZyhzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2LAotCQkJIHN0cnVjdCBvcmlnX25vZGUgKm9yaWdfbm9kZSwgY2hhciAqbWVzc2FnZSkKLXsKLQlzdHJ1Y3QgaG5hX2dsb2JhbF9lbnRyeSAqaG5hX2dsb2JhbF9lbnRyeTsKLQlpbnQgaG5hX2J1ZmZfY291bnQgPSAwOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdW5zaWduZWQgY2hhciAqaG5hX3B0cjsKLQotCWlmIChvcmlnX25vZGUtPmhuYV9idWZmX2xlbiA9PSAwKQotCQlyZXR1cm47Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYmF0X3ByaXYtPmhuYV9naGFzaF9sb2NrLCBmbGFncyk7Ci0KLQl3aGlsZSAoKGhuYV9idWZmX2NvdW50ICsgMSkgKiBFVEhfQUxFTiA8PSBvcmlnX25vZGUtPmhuYV9idWZmX2xlbikgewotCQlobmFfcHRyID0gb3JpZ19ub2RlLT5obmFfYnVmZiArIChobmFfYnVmZl9jb3VudCAqIEVUSF9BTEVOKTsKLQkJaG5hX2dsb2JhbF9lbnRyeSA9IChzdHJ1Y3QgaG5hX2dsb2JhbF9lbnRyeSAqKQotCQkJaGFzaF9maW5kKGJhdF9wcml2LT5obmFfZ2xvYmFsX2hhc2gsIGhuYV9wdHIpOwotCi0JCWlmICgoaG5hX2dsb2JhbF9lbnRyeSkgJiYKLQkJICAgIChobmFfZ2xvYmFsX2VudHJ5LT5vcmlnX25vZGUgPT0gb3JpZ19ub2RlKSkKLQkJCV9obmFfZ2xvYmFsX2RlbF9vcmlnKGJhdF9wcml2LCBobmFfZ2xvYmFsX2VudHJ5LAotCQkJCQkgICAgIG1lc3NhZ2UpOwotCi0JCWhuYV9idWZmX2NvdW50Kys7Ci0JfQotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmF0X3ByaXYtPmhuYV9naGFzaF9sb2NrLCBmbGFncyk7Ci0KLQlvcmlnX25vZGUtPmhuYV9idWZmX2xlbiA9IDA7Ci0Ja2ZyZWUob3JpZ19ub2RlLT5obmFfYnVmZik7Ci0Jb3JpZ19ub2RlLT5obmFfYnVmZiA9IE5VTEw7Ci19Ci0KLXN0YXRpYyB2b2lkIGhuYV9nbG9iYWxfZGVsKHZvaWQgKmRhdGEsIHZvaWQgKmFyZykKLXsKLQlrZnJlZShkYXRhKTsKLX0KLQotdm9pZCBobmFfZ2xvYmFsX2ZyZWUoc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdikKLXsKLQlpZiAoIWJhdF9wcml2LT5obmFfZ2xvYmFsX2hhc2gpCi0JCXJldHVybjsKLQotCWhhc2hfZGVsZXRlKGJhdF9wcml2LT5obmFfZ2xvYmFsX2hhc2gsIGhuYV9nbG9iYWxfZGVsLCBOVUxMKTsKLQliYXRfcHJpdi0+aG5hX2dsb2JhbF9oYXNoID0gTlVMTDsKLX0KLQotc3RydWN0IG9yaWdfbm9kZSAqdHJhbnN0YWJsZV9zZWFyY2goc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiwgdWludDhfdCAqYWRkcikKLXsKLQlzdHJ1Y3QgaG5hX2dsb2JhbF9lbnRyeSAqaG5hX2dsb2JhbF9lbnRyeTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmJhdF9wcml2LT5obmFfZ2hhc2hfbG9jaywgZmxhZ3MpOwotCWhuYV9nbG9iYWxfZW50cnkgPSAoc3RydWN0IGhuYV9nbG9iYWxfZW50cnkgKikKLQkJCQloYXNoX2ZpbmQoYmF0X3ByaXYtPmhuYV9nbG9iYWxfaGFzaCwgYWRkcik7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmF0X3ByaXYtPmhuYV9naGFzaF9sb2NrLCBmbGFncyk7Ci0KLQlpZiAoIWhuYV9nbG9iYWxfZW50cnkpCi0JCXJldHVybiBOVUxMOwotCi0JcmV0dXJuIGhuYV9nbG9iYWxfZW50cnktPm9yaWdfbm9kZTsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L3RyYW5zbGF0aW9uLXRhYmxlLmggYi9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi90cmFuc2xhdGlvbi10YWJsZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMGM0YzVjLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L3RyYW5zbGF0aW9uLXRhYmxlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgQi5BLlQuTS5BLk4uIGNvbnRyaWJ1dG9yczoKLSAqCi0gKiBNYXJlayBMaW5kbmVyLCBTaW1vbiBXdW5kZXJsaWNoCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCi0gKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCi0gKiAwMjExMC0xMzAxLCBVU0EKLSAqCi0gKi8KLQotI2lmbmRlZiBfTkVUX0JBVE1BTl9BRFZfVFJBTlNMQVRJT05fVEFCTEVfSF8KLSNkZWZpbmUgX05FVF9CQVRNQU5fQURWX1RSQU5TTEFUSU9OX1RBQkxFX0hfCi0KLSNpbmNsdWRlICJ0eXBlcy5oIgotCi1pbnQgaG5hX2xvY2FsX2luaXQoc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdik7Ci12b2lkIGhuYV9sb2NhbF9hZGQoc3RydWN0IG5ldF9kZXZpY2UgKnNvZnRfaWZhY2UsIHVpbnQ4X3QgKmFkZHIpOwotdm9pZCBobmFfbG9jYWxfcmVtb3ZlKHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYsCi0JCSAgICAgIHVpbnQ4X3QgKmFkZHIsIGNoYXIgKm1lc3NhZ2UpOwotaW50IGhuYV9sb2NhbF9maWxsX2J1ZmZlcihzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2LAotCQkJICB1bnNpZ25lZCBjaGFyICpidWZmLCBpbnQgYnVmZl9sZW4pOwotaW50IGhuYV9sb2NhbF9zZXFfcHJpbnRfdGV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqb2Zmc2V0KTsKLXZvaWQgaG5hX2xvY2FsX2ZyZWUoc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdik7Ci1pbnQgaG5hX2dsb2JhbF9pbml0KHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYpOwotdm9pZCBobmFfZ2xvYmFsX2FkZF9vcmlnKHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYsCi0JCQkgc3RydWN0IG9yaWdfbm9kZSAqb3JpZ19ub2RlLAotCQkJIHVuc2lnbmVkIGNoYXIgKmhuYV9idWZmLCBpbnQgaG5hX2J1ZmZfbGVuKTsKLWludCBobmFfZ2xvYmFsX3NlcV9wcmludF90ZXh0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICpvZmZzZXQpOwotdm9pZCBobmFfZ2xvYmFsX2RlbF9vcmlnKHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYsCi0JCQkgc3RydWN0IG9yaWdfbm9kZSAqb3JpZ19ub2RlLCBjaGFyICptZXNzYWdlKTsKLXZvaWQgaG5hX2dsb2JhbF9mcmVlKHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYpOwotc3RydWN0IG9yaWdfbm9kZSAqdHJhbnN0YWJsZV9zZWFyY2goc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiwgdWludDhfdCAqYWRkcik7Ci0KLSNlbmRpZiAvKiBfTkVUX0JBVE1BTl9BRFZfVFJBTlNMQVRJT05fVEFCTEVfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L3R5cGVzLmggYi9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi90eXBlcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmM2Y3MzY2Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L3R5cGVzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNDEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIEIuQS5ULk0uQS5OLiBjb250cmlidXRvcnM6Ci0gKgotICogTWFyZWsgTGluZG5lciwgU2ltb24gV3VuZGVybGljaAotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQotICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQotICogMDIxMTAtMTMwMSwgVVNBCi0gKgotICovCi0KLQotCi0jaWZuZGVmIF9ORVRfQkFUTUFOX0FEVl9UWVBFU19IXwotI2RlZmluZSBfTkVUX0JBVE1BTl9BRFZfVFlQRVNfSF8KLQotI2luY2x1ZGUgInBhY2tldC5oIgotI2luY2x1ZGUgImJpdGFycmF5LmgiCi0KLSNkZWZpbmUgQkFUX0hFQURFUl9MRU4gKHNpemVvZihzdHJ1Y3QgZXRoaGRyKSArIFwKLQkoKHNpemVvZihzdHJ1Y3QgdW5pY2FzdF9wYWNrZXQpID4gc2l6ZW9mKHN0cnVjdCBiY2FzdF9wYWNrZXQpID8gXAotCSBzaXplb2Yoc3RydWN0IHVuaWNhc3RfcGFja2V0KSA6IFwKLQkgc2l6ZW9mKHN0cnVjdCBiY2FzdF9wYWNrZXQpKSkpCi0KLQotc3RydWN0IGJhdG1hbl9pZiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCBsaXN0OwotCWludDE2X3QgaWZfbnVtOwotCWNoYXIgaWZfc3RhdHVzOwotCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2OwotCWF0b21pY190IHNlcW5vOwotCWF0b21pY190IGZyYWdfc2Vxbm87Ci0JdW5zaWduZWQgY2hhciAqcGFja2V0X2J1ZmY7Ci0JaW50IHBhY2tldF9sZW47Ci0Jc3RydWN0IGtvYmplY3QgKmhhcmRpZl9vYmo7Ci0JYXRvbWljX3QgcmVmY250OwotCXN0cnVjdCBwYWNrZXRfdHlwZSBiYXRtYW5fYWR2X3B0eXBlOwotCXN0cnVjdCBuZXRfZGV2aWNlICpzb2Z0X2lmYWNlOwotfTsKLQotLyoqCi0gKglvcmlnX25vZGUgLSBzdHJ1Y3R1cmUgZm9yIG9yaWdfbGlzdCBtYWludGFpbmluZyBub2RlcyBvZiBtZXNoCi0gKglAcHJpbWFyeV9hZGRyOiBob3N0cyBwcmltYXJ5IGludGVyZmFjZSBhZGRyZXNzCi0gKglAbGFzdF92YWxpZDogd2hlbiBsYXN0IHBhY2tldCBmcm9tIHRoaXMgbm9kZSB3YXMgcmVjZWl2ZWQKLSAqCUBiY2FzdF9zZXFub19yZXNldDogdGltZSB3aGVuIHRoZSBicm9hZGNhc3Qgc2Vxbm8gd2luZG93IHdhcyByZXNldAotICoJQGJhdG1hbl9zZXFub19yZXNldDogdGltZSB3aGVuIHRoZSBiYXRtYW4gc2Vxbm8gd2luZG93IHdhcyByZXNldAotICoJQGZsYWdzOiBmb3Igbm93IG9ubHkgVklTX1NFUlZFUiBmbGFnCi0gKglAbGFzdF9yZWFsX3NlcW5vOiBsYXN0IGFuZCBiZXN0IGtub3duIHNxdWVuY2UgbnVtYmVyCi0gKglAbGFzdF90dGw6IHR0bCBvZiBsYXN0IHJlY2VpdmVkIHBhY2tldAotICoJQGxhc3RfYmNhc3Rfc2Vxbm86IGxhc3QgYnJvYWRjYXN0IHNlcXVlbmNlIG51bWJlciByZWNlaXZlZCBieSB0aGlzIGhvc3QKLSAqCi0gKglAY2FuZGlkYXRlczogaG93IG1hbnkgY2FuZGlkYXRlcyBhcmUgYXZhaWxhYmxlCi0gKglAc2VsZWN0ZWQ6IG5leHQgYm9uZGluZyBjYW5kaWRhdGUKLSAqLwotc3RydWN0IG9yaWdfbm9kZSB7Ci0JdWludDhfdCBvcmlnW0VUSF9BTEVOXTsKLQl1aW50OF90IHByaW1hcnlfYWRkcltFVEhfQUxFTl07Ci0Jc3RydWN0IG5laWdoX25vZGUgKnJvdXRlcjsKLQlUWVBFX09GX1dPUkQgKmJjYXN0X293bjsKLQl1aW50OF90ICpiY2FzdF9vd25fc3VtOwotCXVpbnQ4X3QgdHFfb3duOwotCWludCB0cV9hc3ltX3BlbmFsdHk7Ci0JdW5zaWduZWQgbG9uZyBsYXN0X3ZhbGlkOwotCXVuc2lnbmVkIGxvbmcgYmNhc3Rfc2Vxbm9fcmVzZXQ7Ci0JdW5zaWduZWQgbG9uZyBiYXRtYW5fc2Vxbm9fcmVzZXQ7Ci0JdWludDhfdCAgZmxhZ3M7Ci0JdW5zaWduZWQgY2hhciAqaG5hX2J1ZmY7Ci0JaW50MTZfdCBobmFfYnVmZl9sZW47Ci0JdWludDMyX3QgbGFzdF9yZWFsX3NlcW5vOwotCXVpbnQ4X3QgbGFzdF90dGw7Ci0JVFlQRV9PRl9XT1JEIGJjYXN0X2JpdHNbTlVNX1dPUkRTXTsKLQl1aW50MzJfdCBsYXN0X2JjYXN0X3NlcW5vOwotCXN0cnVjdCBsaXN0X2hlYWQgbmVpZ2hfbGlzdDsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGZyYWdfbGlzdDsKLQl1bnNpZ25lZCBsb25nIGxhc3RfZnJhZ19wYWNrZXQ7Ci0Jc3RydWN0IHsKLQkJdWludDhfdCBjYW5kaWRhdGVzOwotCQlzdHJ1Y3QgbmVpZ2hfbm9kZSAqc2VsZWN0ZWQ7Ci0JfSBib25kOwotfTsKLQotLyoqCi0gKgluZWlnaF9ub2RlCi0gKglAbGFzdF92YWxpZDogd2hlbiBsYXN0IHBhY2tldCB2aWEgdGhpcyBuZWlnaGJvciB3YXMgcmVjZWl2ZWQKLSAqLwotc3RydWN0IG5laWdoX25vZGUgewotCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKLQl1aW50OF90IGFkZHJbRVRIX0FMRU5dOwotCXVpbnQ4X3QgcmVhbF9wYWNrZXRfY291bnQ7Ci0JdWludDhfdCB0cV9yZWN2W1RRX0dMT0JBTF9XSU5ET1dfU0laRV07Ci0JdWludDhfdCB0cV9pbmRleDsKLQl1aW50OF90IHRxX2F2ZzsKLQl1aW50OF90IGxhc3RfdHRsOwotCXN0cnVjdCBuZWlnaF9ub2RlICpuZXh0X2JvbmRfY2FuZGlkYXRlOwotCXVuc2lnbmVkIGxvbmcgbGFzdF92YWxpZDsKLQlUWVBFX09GX1dPUkQgcmVhbF9iaXRzW05VTV9XT1JEU107Ci0Jc3RydWN0IG9yaWdfbm9kZSAqb3JpZ19ub2RlOwotCXN0cnVjdCBiYXRtYW5faWYgKmlmX2luY29taW5nOwotfTsKLQotCi1zdHJ1Y3QgYmF0X3ByaXYgewotCWF0b21pY190IG1lc2hfc3RhdGU7Ci0Jc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7Ci0JYXRvbWljX3QgYWdncmVnYXRpb25fZW5hYmxlZDsKLQlhdG9taWNfdCBib25kaW5nX2VuYWJsZWQ7Ci0JYXRvbWljX3QgZnJhZ19lbmFibGVkOwotCWF0b21pY190IHZpc19tb2RlOwotCWF0b21pY190IG9yaWdfaW50ZXJ2YWw7Ci0JYXRvbWljX3QgbG9nX2xldmVsOwotCWF0b21pY190IGJjYXN0X3NlcW5vOwotCWF0b21pY190IGJjYXN0X3F1ZXVlX2xlZnQ7Ci0JYXRvbWljX3QgYmF0bWFuX3F1ZXVlX2xlZnQ7Ci0JY2hhciBudW1faWZhY2VzOwotCXN0cnVjdCBkZWJ1Z19sb2cgKmRlYnVnX2xvZzsKLQlzdHJ1Y3QgYmF0bWFuX2lmICpwcmltYXJ5X2lmOwotCXN0cnVjdCBrb2JqZWN0ICptZXNoX29iajsKLQlzdHJ1Y3QgZGVudHJ5ICpkZWJ1Z19kaXI7Ci0Jc3RydWN0IGhsaXN0X2hlYWQgZm9yd19iYXRfbGlzdDsKLQlzdHJ1Y3QgaGxpc3RfaGVhZCBmb3J3X2JjYXN0X2xpc3Q7Ci0Jc3RydWN0IGxpc3RfaGVhZCB2aXNfc2VuZF9saXN0OwotCXN0cnVjdCBoYXNodGFibGVfdCAqb3JpZ19oYXNoOwotCXN0cnVjdCBoYXNodGFibGVfdCAqaG5hX2xvY2FsX2hhc2g7Ci0Jc3RydWN0IGhhc2h0YWJsZV90ICpobmFfZ2xvYmFsX2hhc2g7Ci0Jc3RydWN0IGhhc2h0YWJsZV90ICp2aXNfaGFzaDsKLQlzcGlubG9ja190IG9yaWdfaGFzaF9sb2NrOyAvKiBwcm90ZWN0cyBvcmlnX2hhc2ggKi8KLQlzcGlubG9ja190IGZvcndfYmF0X2xpc3RfbG9jazsgLyogcHJvdGVjdHMgZm9yd19iYXRfbGlzdCAqLwotCXNwaW5sb2NrX3QgZm9yd19iY2FzdF9saXN0X2xvY2s7IC8qIHByb3RlY3RzICAqLwotCXNwaW5sb2NrX3QgaG5hX2xoYXNoX2xvY2s7IC8qIHByb3RlY3RzIGhuYV9sb2NhbF9oYXNoICovCi0Jc3BpbmxvY2tfdCBobmFfZ2hhc2hfbG9jazsgLyogcHJvdGVjdHMgaG5hX2dsb2JhbF9oYXNoICovCi0Jc3BpbmxvY2tfdCB2aXNfaGFzaF9sb2NrOyAvKiBwcm90ZWN0cyB2aXNfaGFzaCAqLwotCXNwaW5sb2NrX3QgdmlzX2xpc3RfbG9jazsgLyogcHJvdGVjdHMgdmlzX2luZm86OnJlY3ZfbGlzdCAqLwotCWludDE2X3QgbnVtX2xvY2FsX2huYTsKLQlhdG9taWNfdCBobmFfbG9jYWxfY2hhbmdlZDsKLQlzdHJ1Y3QgZGVsYXllZF93b3JrIGhuYV93b3JrOwotCXN0cnVjdCBkZWxheWVkX3dvcmsgb3JpZ193b3JrOwotCXN0cnVjdCBkZWxheWVkX3dvcmsgdmlzX3dvcms7Ci0Jc3RydWN0IHZpc19pbmZvICpteV92aXNfaW5mbzsKLX07Ci0KLXN0cnVjdCBzb2NrZXRfY2xpZW50IHsKLQlzdHJ1Y3QgbGlzdF9oZWFkIHF1ZXVlX2xpc3Q7Ci0JdW5zaWduZWQgaW50IHF1ZXVlX2xlbjsKLQl1bnNpZ25lZCBjaGFyIGluZGV4OwotCXNwaW5sb2NrX3QgbG9jazsgLyogcHJvdGVjdHMgcXVldWVfbGlzdCwgcXVldWVfbGVuLCBpbmRleCAqLwotCXdhaXRfcXVldWVfaGVhZF90IHF1ZXVlX3dhaXQ7Ci0Jc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdjsKLX07Ci0KLXN0cnVjdCBzb2NrZXRfcGFja2V0IHsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Ci0Jc2l6ZV90IGljbXBfbGVuOwotCXN0cnVjdCBpY21wX3BhY2tldF9yciBpY21wX3BhY2tldDsKLX07Ci0KLXN0cnVjdCBobmFfbG9jYWxfZW50cnkgewotCXVpbnQ4X3QgYWRkcltFVEhfQUxFTl07Ci0JdW5zaWduZWQgbG9uZyBsYXN0X3NlZW47Ci0JY2hhciBuZXZlcl9wdXJnZTsKLX07Ci0KLXN0cnVjdCBobmFfZ2xvYmFsX2VudHJ5IHsKLQl1aW50OF90IGFkZHJbRVRIX0FMRU5dOwotCXN0cnVjdCBvcmlnX25vZGUgKm9yaWdfbm9kZTsKLX07Ci0KLS8qKgotICoJZm9yd19wYWNrZXQgLSBzdHJ1Y3R1cmUgZm9yIGZvcndfbGlzdCBtYWludGFpbmluZyBwYWNrZXRzIHRvIGJlCi0gKgkgICAgICAgICAgICAgIHNlbmQvZm9yd2FyZGVkCi0gKi8KLXN0cnVjdCBmb3J3X3BhY2tldCB7Ci0Jc3RydWN0IGhsaXN0X25vZGUgbGlzdDsKLQl1bnNpZ25lZCBsb25nIHNlbmRfdGltZTsKLQl1aW50OF90IG93bjsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwotCXVpbnQxNl90IHBhY2tldF9sZW47Ci0JdWludDMyX3QgZGlyZWN0X2xpbmtfZmxhZ3M7Ci0JdWludDhfdCBudW1fcGFja2V0czsKLQlzdHJ1Y3QgZGVsYXllZF93b3JrIGRlbGF5ZWRfd29yazsKLQlzdHJ1Y3QgYmF0bWFuX2lmICppZl9pbmNvbWluZzsKLX07Ci0KLS8qIFdoaWxlIHNjYW5uaW5nIGZvciB2aXMtZW50cmllcyBvZiBhIHBhcnRpY3VsYXIgdmlzLW9yaWdpbmF0b3IKLSAqIHRoaXMgbGlzdCBjb2xsZWN0cyBpdHMgaW50ZXJmYWNlcyB0byBjcmVhdGUgYSBzdWJncmFwaC9jbHVzdGVyCi0gKiBvdXQgb2YgdGhlbSBsYXRlcgotICovCi1zdHJ1Y3QgaWZfbGlzdF9lbnRyeSB7Ci0JdWludDhfdCBhZGRyW0VUSF9BTEVOXTsKLQlib29sIHByaW1hcnk7Ci0Jc3RydWN0IGhsaXN0X25vZGUgbGlzdDsKLX07Ci0KLXN0cnVjdCBkZWJ1Z19sb2cgewotCWNoYXIgbG9nX2J1ZmZbTE9HX0JVRl9MRU5dOwotCXVuc2lnbmVkIGxvbmcgbG9nX3N0YXJ0OwotCXVuc2lnbmVkIGxvbmcgbG9nX2VuZDsKLQlzcGlubG9ja190IGxvY2s7IC8qIHByb3RlY3RzIGxvZ19idWZmLCBsb2dfc3RhcnQgYW5kIGxvZ19lbmQgKi8KLQl3YWl0X3F1ZXVlX2hlYWRfdCBxdWV1ZV93YWl0OwotfTsKLQotc3RydWN0IGZyYWdfcGFja2V0X2xpc3RfZW50cnkgewotCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKLQl1aW50MTZfdCBzZXFubzsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwotfTsKLQotc3RydWN0IHZpc19pbmZvIHsKLQl1bnNpZ25lZCBsb25nICAgICAgIGZpcnN0X3NlZW47Ci0Jc3RydWN0IGxpc3RfaGVhZCAgICByZWN2X2xpc3Q7Ci0JCQkgICAgLyogbGlzdCBvZiBzZXJ2ZXItbmVpZ2hib3JzIHdlIHJlY2VpdmVkIGEgdmlzLXBhY2tldAotCQkJICAgICAqIGZyb20uICB3ZSBzaG91bGQgbm90IHJlcGx5IHRvIHRoZW0uICovCi0Jc3RydWN0IGxpc3RfaGVhZCBzZW5kX2xpc3Q7Ci0Jc3RydWN0IGtyZWYgcmVmY291bnQ7Ci0Jc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdjsKLQkvKiB0aGlzIHBhY2tldCBtaWdodCBiZSBwYXJ0IG9mIHRoZSB2aXMgc2VuZCBxdWV1ZS4gKi8KLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiX3BhY2tldDsKLQkvKiB2aXNfaW5mbyBtYXkgZm9sbG93IGhlcmUqLwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQotc3RydWN0IHZpc19pbmZvX2VudHJ5IHsKLQl1aW50OF90ICBzcmNbRVRIX0FMRU5dOwotCXVpbnQ4X3QgIGRlc3RbRVRIX0FMRU5dOwotCXVpbnQ4X3QgIHF1YWxpdHk7CS8qIHF1YWxpdHkgPSAwIG1lYW5zIEhOQSAqLwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQotc3RydWN0IHJlY3ZsaXN0X25vZGUgewotCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKLQl1aW50OF90IG1hY1tFVEhfQUxFTl07Ci19OwotCi0jZW5kaWYgLyogX05FVF9CQVRNQU5fQURWX1RZUEVTX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi91bmljYXN0LmMgYi9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi91bmljYXN0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0NTk0MTMuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvdW5pY2FzdC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjY5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgQi5BLlQuTS5BLk4uIGNvbnRyaWJ1dG9yczoKLSAqCi0gKiBBbmRyZWFzIExhbmdlcgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQotICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQotICogMDIxMTAtMTMwMSwgVVNBCi0gKgotICovCi0KLSNpbmNsdWRlICJtYWluLmgiCi0jaW5jbHVkZSAidW5pY2FzdC5oIgotI2luY2x1ZGUgInNlbmQuaCIKLSNpbmNsdWRlICJzb2Z0LWludGVyZmFjZS5oIgotI2luY2x1ZGUgImhhc2guaCIKLSNpbmNsdWRlICJ0cmFuc2xhdGlvbi10YWJsZS5oIgotI2luY2x1ZGUgInJvdXRpbmcuaCIKLSNpbmNsdWRlICJoYXJkLWludGVyZmFjZS5oIgotCi0KLXN0cnVjdCBza19idWZmICptZXJnZV9mcmFnX3BhY2tldChzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkLAotCQkJCSAgc3RydWN0IGZyYWdfcGFja2V0X2xpc3RfZW50cnkgKnRmcCwKLQkJCQkgIHN0cnVjdCBza19idWZmICpza2IpCi17Ci0Jc3RydWN0IHVuaWNhc3RfZnJhZ19wYWNrZXQgKnVwID0KLQkJKHN0cnVjdCB1bmljYXN0X2ZyYWdfcGFja2V0ICopc2tiLT5kYXRhOwotCXN0cnVjdCBza19idWZmICp0bXBfc2tiOwotCi0JLyogc2V0IHNrYiB0byB0aGUgZmlyc3QgcGFydCBhbmQgdG1wX3NrYiB0byB0aGUgc2Vjb25kIHBhcnQgKi8KLQlpZiAodXAtPmZsYWdzICYgVU5JX0ZSQUdfSEVBRCkgewotCQl0bXBfc2tiID0gdGZwLT5za2I7Ci0JfSBlbHNlIHsKLQkJdG1wX3NrYiA9IHNrYjsKLQkJc2tiID0gdGZwLT5za2I7Ci0JfQotCi0Jc2tiX3B1bGwodG1wX3NrYiwgc2l6ZW9mKHN0cnVjdCB1bmljYXN0X2ZyYWdfcGFja2V0KSk7Ci0JaWYgKHBza2JfZXhwYW5kX2hlYWQoc2tiLCAwLCB0bXBfc2tiLT5sZW4sIEdGUF9BVE9NSUMpIDwgMCkgewotCQkvKiBmcmVlIGJ1ZmZlcmVkIHNrYiwgc2tiIHdpbGwgYmUgZnJlZWQgbGF0ZXIgKi8KLQkJa2ZyZWVfc2tiKHRmcC0+c2tiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0JLyogbW92ZSBmcmVlIGVudHJ5IHRvIGVuZCAqLwotCXRmcC0+c2tiID0gTlVMTDsKLQl0ZnAtPnNlcW5vID0gMDsKLQlsaXN0X21vdmVfdGFpbCgmdGZwLT5saXN0LCBoZWFkKTsKLQotCW1lbWNweShza2JfcHV0KHNrYiwgdG1wX3NrYi0+bGVuKSwgdG1wX3NrYi0+ZGF0YSwgdG1wX3NrYi0+bGVuKTsKLQlrZnJlZV9za2IodG1wX3NrYik7Ci0JcmV0dXJuIHNrYjsKLX0KLQotdm9pZCBjcmVhdGVfZnJhZ19lbnRyeShzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQotewotCXN0cnVjdCBmcmFnX3BhY2tldF9saXN0X2VudHJ5ICp0ZnA7Ci0Jc3RydWN0IHVuaWNhc3RfZnJhZ19wYWNrZXQgKnVwID0KLQkJKHN0cnVjdCB1bmljYXN0X2ZyYWdfcGFja2V0ICopc2tiLT5kYXRhOwotCi0JLyogZnJlZSBhbmQgb2xkZXN0IHBhY2tldHMgc3RhbmQgYXQgdGhlIGVuZCAqLwotCXRmcCA9IGxpc3RfZW50cnkoKGhlYWQpLT5wcmV2LCB0eXBlb2YoKnRmcCksIGxpc3QpOwotCWtmcmVlX3NrYih0ZnAtPnNrYik7Ci0KLQl0ZnAtPnNlcW5vID0gbnRvaHModXAtPnNlcW5vKTsKLQl0ZnAtPnNrYiA9IHNrYjsKLQlsaXN0X21vdmUoJnRmcC0+bGlzdCwgaGVhZCk7Ci0JcmV0dXJuOwotfQotCi1pbnQgY3JlYXRlX2ZyYWdfYnVmZmVyKHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQpCi17Ci0JaW50IGk7Ci0Jc3RydWN0IGZyYWdfcGFja2V0X2xpc3RfZW50cnkgKnRmcDsKLQotCWZvciAoaSA9IDA7IGkgPCBGUkFHX0JVRkZFUl9TSVpFOyBpKyspIHsKLQkJdGZwID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGZyYWdfcGFja2V0X2xpc3RfZW50cnkpLAotCQkJR0ZQX0FUT01JQyk7Ci0JCWlmICghdGZwKSB7Ci0JCQlmcmFnX2xpc3RfZnJlZShoZWFkKTsKLQkJCXJldHVybiAtRU5PTUVNOwotCQl9Ci0JCXRmcC0+c2tiID0gTlVMTDsKLQkJdGZwLT5zZXFubyA9IDA7Ci0JCUlOSVRfTElTVF9IRUFEKCZ0ZnAtPmxpc3QpOwotCQlsaXN0X2FkZCgmdGZwLT5saXN0LCBoZWFkKTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RydWN0IGZyYWdfcGFja2V0X2xpc3RfZW50cnkgKnNlYXJjaF9mcmFnX3BhY2tldChzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkLAotCQkJCQkJIHN0cnVjdCB1bmljYXN0X2ZyYWdfcGFja2V0ICp1cCkKLXsKLQlzdHJ1Y3QgZnJhZ19wYWNrZXRfbGlzdF9lbnRyeSAqdGZwOwotCXN0cnVjdCB1bmljYXN0X2ZyYWdfcGFja2V0ICp0bXBfdXAgPSBOVUxMOwotCXVpbnQxNl90IHNlYXJjaF9zZXFubzsKLQotCWlmICh1cC0+ZmxhZ3MgJiBVTklfRlJBR19IRUFEKQotCQlzZWFyY2hfc2Vxbm8gPSBudG9ocyh1cC0+c2Vxbm8pKzE7Ci0JZWxzZQotCQlzZWFyY2hfc2Vxbm8gPSBudG9ocyh1cC0+c2Vxbm8pLTE7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHRmcCwgaGVhZCwgbGlzdCkgewotCi0JCWlmICghdGZwLT5za2IpCi0JCQljb250aW51ZTsKLQotCQlpZiAodGZwLT5zZXFubyA9PSBudG9ocyh1cC0+c2Vxbm8pKQotCQkJZ290byBtb3ZfdGFpbDsKLQotCQl0bXBfdXAgPSAoc3RydWN0IHVuaWNhc3RfZnJhZ19wYWNrZXQgKil0ZnAtPnNrYi0+ZGF0YTsKLQotCQlpZiAodGZwLT5zZXFubyA9PSBzZWFyY2hfc2Vxbm8pIHsKLQotCQkJaWYgKCh0bXBfdXAtPmZsYWdzICYgVU5JX0ZSQUdfSEVBRCkgIT0KLQkJCSAgICAodXAtPmZsYWdzICYgVU5JX0ZSQUdfSEVBRCkpCi0JCQkJcmV0dXJuIHRmcDsKLQkJCWVsc2UKLQkJCQlnb3RvIG1vdl90YWlsOwotCQl9Ci0JfQotCXJldHVybiBOVUxMOwotCi1tb3ZfdGFpbDoKLQlsaXN0X21vdmVfdGFpbCgmdGZwLT5saXN0LCBoZWFkKTsKLQlyZXR1cm4gTlVMTDsKLX0KLQotdm9pZCBmcmFnX2xpc3RfZnJlZShzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkKQotewotCXN0cnVjdCBmcmFnX3BhY2tldF9saXN0X2VudHJ5ICpwZiwgKnRtcF9wZjsKLQotCWlmICghbGlzdF9lbXB0eShoZWFkKSkgewotCi0JCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwZiwgdG1wX3BmLCBoZWFkLCBsaXN0KSB7Ci0JCQlrZnJlZV9za2IocGYtPnNrYik7Ci0JCQlsaXN0X2RlbCgmcGYtPmxpc3QpOwotCQkJa2ZyZWUocGYpOwotCQl9Ci0JfQotCXJldHVybjsKLX0KLQotc3RhdGljIGludCB1bmljYXN0X3NlbmRfZnJhZ19za2Ioc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiwKLQkJCSAgc3RydWN0IGJhdG1hbl9pZiAqYmF0bWFuX2lmLCB1aW50OF90IGRzdGFkZHJbXSwKLQkJCSAgc3RydWN0IG9yaWdfbm9kZSAqb3JpZ19ub2RlKQotewotCXN0cnVjdCB1bmljYXN0X2ZyYWdfcGFja2V0ICp1Y2FzdF9mcmFnMSwgKnVjYXN0X2ZyYWcyOwotCWludCBoZHJfbGVuID0gc2l6ZW9mKHN0cnVjdCB1bmljYXN0X2ZyYWdfcGFja2V0KTsKLQlzdHJ1Y3Qgc2tfYnVmZiAqZnJhZ19za2I7Ci0JaW50IGRhdGFfbGVuID0gc2tiLT5sZW47Ci0KLQlpZiAoIWJhdF9wcml2LT5wcmltYXJ5X2lmKQotCQlnb3RvIGRyb3BwZWQ7Ci0KLQlmcmFnX3NrYiA9IGRldl9hbGxvY19za2IoZGF0YV9sZW4gLSAoZGF0YV9sZW4gLyAyKSArIGhkcl9sZW4pOwotCXNrYl9zcGxpdChza2IsIGZyYWdfc2tiLCBkYXRhX2xlbiAvIDIpOwotCi0JaWYgKG15X3NrYl9oZWFkX3B1c2goZnJhZ19za2IsIGhkcl9sZW4pIDwgMCB8fAotCSAgICBteV9za2JfaGVhZF9wdXNoKHNrYiwgaGRyX2xlbikgPCAwKQotCQlnb3RvIGRyb3BfZnJhZzsKLQotCXVjYXN0X2ZyYWcxID0gKHN0cnVjdCB1bmljYXN0X2ZyYWdfcGFja2V0ICopc2tiLT5kYXRhOwotCXVjYXN0X2ZyYWcyID0gKHN0cnVjdCB1bmljYXN0X2ZyYWdfcGFja2V0ICopZnJhZ19za2ItPmRhdGE7Ci0KLQl1Y2FzdF9mcmFnMS0+dmVyc2lvbiA9IENPTVBBVF9WRVJTSU9OOwotCXVjYXN0X2ZyYWcxLT5wYWNrZXRfdHlwZSA9IEJBVF9VTklDQVNUX0ZSQUc7Ci0JdWNhc3RfZnJhZzEtPnR0bCA9IFRUTDsKLQltZW1jcHkodWNhc3RfZnJhZzEtPm9yaWcsCi0JICAgICAgIGJhdF9wcml2LT5wcmltYXJ5X2lmLT5uZXRfZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pOwotCW1lbWNweSh1Y2FzdF9mcmFnMS0+ZGVzdCwgb3JpZ19ub2RlLT5vcmlnLCBFVEhfQUxFTik7Ci0KLQltZW1jcHkodWNhc3RfZnJhZzIsIHVjYXN0X2ZyYWcxLCBzaXplb2Yoc3RydWN0IHVuaWNhc3RfZnJhZ19wYWNrZXQpKTsKLQotCXVjYXN0X2ZyYWcxLT5mbGFncyB8PSBVTklfRlJBR19IRUFEOwotCXVjYXN0X2ZyYWcyLT5mbGFncyAmPSB+VU5JX0ZSQUdfSEVBRDsKLQotCXVjYXN0X2ZyYWcxLT5zZXFubyA9IGh0b25zKCh1aW50MTZfdClhdG9taWNfaW5jX3JldHVybigKLQkJCQkJCSZiYXRtYW5faWYtPmZyYWdfc2Vxbm8pKTsKLQotCXVjYXN0X2ZyYWcyLT5zZXFubyA9IGh0b25zKCh1aW50MTZfdClhdG9taWNfaW5jX3JldHVybigKLQkJCQkJCSZiYXRtYW5faWYtPmZyYWdfc2Vxbm8pKTsKLQotCXNlbmRfc2tiX3BhY2tldChza2IsIGJhdG1hbl9pZiwgZHN0YWRkcik7Ci0Jc2VuZF9za2JfcGFja2V0KGZyYWdfc2tiLCBiYXRtYW5faWYsIGRzdGFkZHIpOwotCXJldHVybiAwOwotCi1kcm9wX2ZyYWc6Ci0Ja2ZyZWVfc2tiKGZyYWdfc2tiKTsKLWRyb3BwZWQ6Ci0Ja2ZyZWVfc2tiKHNrYik7Ci0JcmV0dXJuIDE7Ci19Ci0KLWludCB1bmljYXN0X3NlbmRfc2tiKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYpCi17Ci0Jc3RydWN0IGV0aGhkciAqZXRoaGRyID0gKHN0cnVjdCBldGhoZHIgKilza2ItPmRhdGE7Ci0Jc3RydWN0IHVuaWNhc3RfcGFja2V0ICp1bmljYXN0X3BhY2tldDsKLQlzdHJ1Y3Qgb3JpZ19ub2RlICpvcmlnX25vZGU7Ci0Jc3RydWN0IGJhdG1hbl9pZiAqYmF0bWFuX2lmOwotCXN0cnVjdCBuZWlnaF9ub2RlICpyb3V0ZXI7Ci0JaW50IGRhdGFfbGVuID0gc2tiLT5sZW47Ci0JdWludDhfdCBkc3RhZGRyWzZdOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYmF0X3ByaXYtPm9yaWdfaGFzaF9sb2NrLCBmbGFncyk7Ci0KLQkvKiBnZXQgcm91dGluZyBpbmZvcm1hdGlvbiAqLwotCW9yaWdfbm9kZSA9ICgoc3RydWN0IG9yaWdfbm9kZSAqKWhhc2hfZmluZChiYXRfcHJpdi0+b3JpZ19oYXNoLAotCQkJCQkJICAgZXRoaGRyLT5oX2Rlc3QpKTsKLQotCS8qIGNoZWNrIGZvciBobmEgaG9zdCAqLwotCWlmICghb3JpZ19ub2RlKQotCQlvcmlnX25vZGUgPSB0cmFuc3RhYmxlX3NlYXJjaChiYXRfcHJpdiwgZXRoaGRyLT5oX2Rlc3QpOwotCi0Jcm91dGVyID0gZmluZF9yb3V0ZXIoYmF0X3ByaXYsIG9yaWdfbm9kZSwgTlVMTCk7Ci0KLQlpZiAoIXJvdXRlcikKLQkJZ290byB1bmxvY2s7Ci0KLQkvKiBkb24ndCBsb2NrIHdoaWxlIHNlbmRpbmcgdGhlIHBhY2tldHMgLi4uIHdlIHRoZXJlZm9yZQotCQkqIGNvcHkgdGhlIHJlcXVpcmVkIGRhdGEgYmVmb3JlIHNlbmRpbmcgKi8KLQotCWJhdG1hbl9pZiA9IHJvdXRlci0+aWZfaW5jb21pbmc7Ci0JbWVtY3B5KGRzdGFkZHIsIHJvdXRlci0+YWRkciwgRVRIX0FMRU4pOwotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmF0X3ByaXYtPm9yaWdfaGFzaF9sb2NrLCBmbGFncyk7Ci0KLQlpZiAoYmF0bWFuX2lmLT5pZl9zdGF0dXMgIT0gSUZfQUNUSVZFKQotCQlnb3RvIGRyb3BwZWQ7Ci0KLQlpZiAoYXRvbWljX3JlYWQoJmJhdF9wcml2LT5mcmFnX2VuYWJsZWQpICYmCi0JICAgIGRhdGFfbGVuICsgc2l6ZW9mKHN0cnVjdCB1bmljYXN0X3BhY2tldCkgPiBiYXRtYW5faWYtPm5ldF9kZXYtPm10dSkKLQkJcmV0dXJuIHVuaWNhc3Rfc2VuZF9mcmFnX3NrYihza2IsIGJhdF9wcml2LCBiYXRtYW5faWYsCi0JCQkJCSAgICAgZHN0YWRkciwgb3JpZ19ub2RlKTsKLQotCWlmIChteV9za2JfaGVhZF9wdXNoKHNrYiwgc2l6ZW9mKHN0cnVjdCB1bmljYXN0X3BhY2tldCkpIDwgMCkKLQkJZ290byBkcm9wcGVkOwotCi0JdW5pY2FzdF9wYWNrZXQgPSAoc3RydWN0IHVuaWNhc3RfcGFja2V0ICopc2tiLT5kYXRhOwotCi0JdW5pY2FzdF9wYWNrZXQtPnZlcnNpb24gPSBDT01QQVRfVkVSU0lPTjsKLQkvKiBiYXRtYW4gcGFja2V0IHR5cGU6IHVuaWNhc3QgKi8KLQl1bmljYXN0X3BhY2tldC0+cGFja2V0X3R5cGUgPSBCQVRfVU5JQ0FTVDsKLQkvKiBzZXQgdW5pY2FzdCB0dGwgKi8KLQl1bmljYXN0X3BhY2tldC0+dHRsID0gVFRMOwotCS8qIGNvcHkgdGhlIGRlc3RpbmF0aW9uIGZvciBmYXN0ZXIgcm91dGluZyAqLwotCW1lbWNweSh1bmljYXN0X3BhY2tldC0+ZGVzdCwgb3JpZ19ub2RlLT5vcmlnLCBFVEhfQUxFTik7Ci0KLQlzZW5kX3NrYl9wYWNrZXQoc2tiLCBiYXRtYW5faWYsIGRzdGFkZHIpOwotCXJldHVybiAwOwotCi11bmxvY2s6Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmF0X3ByaXYtPm9yaWdfaGFzaF9sb2NrLCBmbGFncyk7Ci1kcm9wcGVkOgotCWtmcmVlX3NrYihza2IpOwotCXJldHVybiAxOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvdW5pY2FzdC5oIGIvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvdW5pY2FzdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTczNjk3Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L3VuaWNhc3QuaAorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgQi5BLlQuTS5BLk4uIGNvbnRyaWJ1dG9yczoKLSAqCi0gKiBBbmRyZWFzIExhbmdlcgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQotICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQotICogMDIxMTAtMTMwMSwgVVNBCi0gKgotICovCi0KLSNpZm5kZWYgX05FVF9CQVRNQU5fQURWX1VOSUNBU1RfSF8KLSNkZWZpbmUgX05FVF9CQVRNQU5fQURWX1VOSUNBU1RfSF8KLQotI2RlZmluZSBGUkFHX1RJTUVPVVQgMTAwMDAJLyogcHVyZ2UgZnJhZyBsaXN0IGVudHJ5cyBhZnRlciB0aW1lIGluIG1zICovCi0jZGVmaW5lIEZSQUdfQlVGRkVSX1NJWkUgNgkvKiBudW1iZXIgb2YgbGlzdCBlbGVtZW50cyBpbiBidWZmZXIgKi8KLQotc3RydWN0IHNrX2J1ZmYgKm1lcmdlX2ZyYWdfcGFja2V0KHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQsCi0Jc3RydWN0IGZyYWdfcGFja2V0X2xpc3RfZW50cnkgKnRmcCwKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKLQotdm9pZCBjcmVhdGVfZnJhZ19lbnRyeShzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKLWludCBjcmVhdGVfZnJhZ19idWZmZXIoc3RydWN0IGxpc3RfaGVhZCAqaGVhZCk7Ci1zdHJ1Y3QgZnJhZ19wYWNrZXRfbGlzdF9lbnRyeSAqc2VhcmNoX2ZyYWdfcGFja2V0KHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQsCi0Jc3RydWN0IHVuaWNhc3RfZnJhZ19wYWNrZXQgKnVwKTsKLXZvaWQgZnJhZ19saXN0X2ZyZWUoc3RydWN0IGxpc3RfaGVhZCAqaGVhZCk7Ci1pbnQgdW5pY2FzdF9zZW5kX3NrYihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2KTsKLQotI2VuZGlmIC8qIF9ORVRfQkFUTUFOX0FEVl9VTklDQVNUX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi92aXMuYyBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L3Zpcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDJjMWJjLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L3Zpcy5jCisrKyAvZGV2L251bGwKQEAgLTEsODk1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMCBCLkEuVC5NLkEuTi4gY29udHJpYnV0b3JzOgotICoKLSAqIFNpbW9uIFd1bmRlcmxpY2gKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKLSAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKLSAqIDAyMTEwLTEzMDEsIFVTQQotICoKLSAqLwotCi0jaW5jbHVkZSAibWFpbi5oIgotI2luY2x1ZGUgInNlbmQuaCIKLSNpbmNsdWRlICJ0cmFuc2xhdGlvbi10YWJsZS5oIgotI2luY2x1ZGUgInZpcy5oIgotI2luY2x1ZGUgInNvZnQtaW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAiaGFyZC1pbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJoYXNoLmgiCi0KLSNkZWZpbmUgTUFYX1ZJU19QQUNLRVRfU0laRSAxMDAwCi0KLS8qIFJldHVybnMgdGhlIHNtYWxsZXN0IHNpZ25lZCBpbnRlZ2VyIGluIHR3bydzIGNvbXBsZW1lbnQgd2l0aCB0aGUgc2l6ZW9mIHggKi8KLSNkZWZpbmUgc21hbGxlc3Rfc2lnbmVkX2ludCh4KSAoMXUgPDwgKDd1ICsgOHUgKiAoc2l6ZW9mKHgpIC0gMXUpKSkKLQotLyogQ2hlY2tzIGlmIGEgc2VxdWVuY2UgbnVtYmVyIHggaXMgYSBwcmVkZWNlc3Nvci9zdWNjZXNzb3Igb2YgeS4KLSAqIHRoZXkgaGFuZGxlIG92ZXJmbG93cy91bmRlcmZsb3dzIGFuZCBjYW4gY29ycmVjdGx5IGNoZWNrIGZvciBhCi0gKiBwcmVkZWNlc3Nvci9zdWNjZXNzb3IgdW5sZXNzIHRoZSB2YXJpYWJsZSBzZXF1ZW5jZSBudW1iZXIgaGFzIGdyb3duIGJ5Ci0gKiBtb3JlIHRoZW4gMioqKGJpdHdpZHRoKHgpLTEpLTEuCi0gKiBUaGlzIG1lYW5zIHRoYXQgZm9yIGEgdWludDhfdCB3aXRoIHRoZSBtYXhpbXVtIHZhbHVlIDI1NSwgaXQgd291bGQgdGhpbms6Ci0gKiAgLSB3aGVuIGFkZGluZyBub3RoaW5nIC0gaXQgaXMgbmVpdGhlciBhIHByZWRlY2Vzc29yIG5vciBhIHN1Y2Nlc3NvcgotICogIC0gYmVmb3JlIGFkZGluZyBtb3JlIHRoYW4gMTI3IHRvIHRoZSBzdGFydGluZyB2YWx1ZSAtIGl0IGlzIGEgcHJlZGVjZXNzb3IsCi0gKiAgLSB3aGVuIGFkZGluZyAxMjggLSBpdCBpcyBuZWl0aGVyIGEgcHJlZGVjZXNzb3Igbm9yIGEgc3VjY2Vzc29yLAotICogIC0gYWZ0ZXIgYWRkaW5nIG1vcmUgdGhhbiAxMjcgdG8gdGhlIHN0YXJ0aW5nIHZhbHVlIC0gaXQgaXMgYSBzdWNjZXNzb3IgKi8KLSNkZWZpbmUgc2VxX2JlZm9yZSh4LCB5KSAoe3R5cGVvZih4KSBfZHVtbXkgPSAoeCAtIHkpOyBcCi0JCQlfZHVtbXkgPiBzbWFsbGVzdF9zaWduZWRfaW50KF9kdW1teSk7IH0pCi0jZGVmaW5lIHNlcV9hZnRlcih4LCB5KSBzZXFfYmVmb3JlKHksIHgpCi0KLXN0YXRpYyB2b2lkIHN0YXJ0X3Zpc190aW1lcihzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2KTsKLQotLyogZnJlZSB0aGUgaW5mbyAqLwotc3RhdGljIHZvaWQgZnJlZV9pbmZvKHN0cnVjdCBrcmVmICpyZWYpCi17Ci0Jc3RydWN0IHZpc19pbmZvICppbmZvID0gY29udGFpbmVyX29mKHJlZiwgc3RydWN0IHZpc19pbmZvLCByZWZjb3VudCk7Ci0Jc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiA9IGluZm8tPmJhdF9wcml2OwotCXN0cnVjdCByZWN2bGlzdF9ub2RlICplbnRyeSwgKnRtcDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JbGlzdF9kZWxfaW5pdCgmaW5mby0+c2VuZF9saXN0KTsKLQlzcGluX2xvY2tfaXJxc2F2ZSgmYmF0X3ByaXYtPnZpc19saXN0X2xvY2ssIGZsYWdzKTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZW50cnksIHRtcCwgJmluZm8tPnJlY3ZfbGlzdCwgbGlzdCkgewotCQlsaXN0X2RlbCgmZW50cnktPmxpc3QpOwotCQlrZnJlZShlbnRyeSk7Ci0JfQotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmF0X3ByaXYtPnZpc19saXN0X2xvY2ssIGZsYWdzKTsKLQlrZnJlZV9za2IoaW5mby0+c2tiX3BhY2tldCk7Ci19Ci0KLS8qIENvbXBhcmUgdHdvIHZpcyBwYWNrZXRzLCB1c2VkIGJ5IHRoZSBoYXNoaW5nIGFsZ29yaXRobSAqLwotc3RhdGljIGludCB2aXNfaW5mb19jbXAodm9pZCAqZGF0YTEsIHZvaWQgKmRhdGEyKQotewotCXN0cnVjdCB2aXNfaW5mbyAqZDEsICpkMjsKLQlzdHJ1Y3QgdmlzX3BhY2tldCAqcDEsICpwMjsKLQlkMSA9IGRhdGExOwotCWQyID0gZGF0YTI7Ci0JcDEgPSAoc3RydWN0IHZpc19wYWNrZXQgKilkMS0+c2tiX3BhY2tldC0+ZGF0YTsKLQlwMiA9IChzdHJ1Y3QgdmlzX3BhY2tldCAqKWQyLT5za2JfcGFja2V0LT5kYXRhOwotCXJldHVybiBjb21wYXJlX29yaWcocDEtPnZpc19vcmlnLCBwMi0+dmlzX29yaWcpOwotfQotCi0vKiBoYXNoIGZ1bmN0aW9uIHRvIGNob29zZSBhbiBlbnRyeSBpbiBhIGhhc2ggdGFibGUgb2YgZ2l2ZW4gc2l6ZSAqLwotLyogaGFzaCBhbGdvcml0aG0gZnJvbSBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0hhc2hfdGFibGUgKi8KLXN0YXRpYyBpbnQgdmlzX2luZm9fY2hvb3NlKHZvaWQgKmRhdGEsIGludCBzaXplKQotewotCXN0cnVjdCB2aXNfaW5mbyAqdmlzX2luZm8gPSBkYXRhOwotCXN0cnVjdCB2aXNfcGFja2V0ICpwYWNrZXQ7Ci0JdW5zaWduZWQgY2hhciAqa2V5OwotCXVpbnQzMl90IGhhc2ggPSAwOwotCXNpemVfdCBpOwotCi0JcGFja2V0ID0gKHN0cnVjdCB2aXNfcGFja2V0ICopdmlzX2luZm8tPnNrYl9wYWNrZXQtPmRhdGE7Ci0Ja2V5ID0gcGFja2V0LT52aXNfb3JpZzsKLQlmb3IgKGkgPSAwOyBpIDwgRVRIX0FMRU47IGkrKykgewotCQloYXNoICs9IGtleVtpXTsKLQkJaGFzaCArPSAoaGFzaCA8PCAxMCk7Ci0JCWhhc2ggXj0gKGhhc2ggPj4gNik7Ci0JfQotCi0JaGFzaCArPSAoaGFzaCA8PCAzKTsKLQloYXNoIF49IChoYXNoID4+IDExKTsKLQloYXNoICs9IChoYXNoIDw8IDE1KTsKLQotCXJldHVybiBoYXNoICUgc2l6ZTsKLX0KLQotLyogaW5zZXJ0IGludGVyZmFjZSB0byB0aGUgbGlzdCBvZiBpbnRlcmZhY2VzIG9mIG9uZSBvcmlnaW5hdG9yLCBpZiBpdAotICogZG9lcyBub3QgYWxyZWFkeSBleGlzdCBpbiB0aGUgbGlzdCAqLwotc3RhdGljIHZvaWQgdmlzX2RhdGFfaW5zZXJ0X2ludGVyZmFjZShjb25zdCB1aW50OF90ICppbnRlcmZhY2UsCi0JCQkJICAgICAgc3RydWN0IGhsaXN0X2hlYWQgKmlmX2xpc3QsCi0JCQkJICAgICAgYm9vbCBwcmltYXJ5KQotewotCXN0cnVjdCBpZl9saXN0X2VudHJ5ICplbnRyeTsKLQlzdHJ1Y3QgaGxpc3Rfbm9kZSAqcG9zOwotCi0JaGxpc3RfZm9yX2VhY2hfZW50cnkoZW50cnksIHBvcywgaWZfbGlzdCwgbGlzdCkgewotCQlpZiAoY29tcGFyZV9vcmlnKGVudHJ5LT5hZGRyLCAodm9pZCAqKWludGVyZmFjZSkpCi0JCQlyZXR1cm47Ci0JfQotCi0JLyogaXRzIGEgbmV3IGFkZHJlc3MsIGFkZCBpdCB0byB0aGUgbGlzdCAqLwotCWVudHJ5ID0ga21hbGxvYyhzaXplb2YoKmVudHJ5KSwgR0ZQX0FUT01JQyk7Ci0JaWYgKCFlbnRyeSkKLQkJcmV0dXJuOwotCW1lbWNweShlbnRyeS0+YWRkciwgaW50ZXJmYWNlLCBFVEhfQUxFTik7Ci0JZW50cnktPnByaW1hcnkgPSBwcmltYXJ5OwotCWhsaXN0X2FkZF9oZWFkKCZlbnRyeS0+bGlzdCwgaWZfbGlzdCk7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IHZpc19kYXRhX3JlYWRfcHJpbV9zZWMoY2hhciAqYnVmZiwgc3RydWN0IGhsaXN0X2hlYWQgKmlmX2xpc3QpCi17Ci0Jc3RydWN0IGlmX2xpc3RfZW50cnkgKmVudHJ5OwotCXN0cnVjdCBobGlzdF9ub2RlICpwb3M7Ci0Jc2l6ZV90IGxlbiA9IDA7Ci0KLQlobGlzdF9mb3JfZWFjaF9lbnRyeShlbnRyeSwgcG9zLCBpZl9saXN0LCBsaXN0KSB7Ci0JCWlmIChlbnRyeS0+cHJpbWFyeSkKLQkJCWxlbiArPSBzcHJpbnRmKGJ1ZmYgKyBsZW4sICJQUklNQVJZLCAiKTsKLQkJZWxzZSB7Ci0JCQlsZW4gKz0gc3ByaW50ZihidWZmICsgbGVuLCAgIlNFQyAlcE0sICIsIGVudHJ5LT5hZGRyKTsKLQkJfQotCX0KLQotCXJldHVybiBsZW47Ci19Ci0KLXN0YXRpYyBzaXplX3QgdmlzX2RhdGFfY291bnRfcHJpbV9zZWMoc3RydWN0IGhsaXN0X2hlYWQgKmlmX2xpc3QpCi17Ci0Jc3RydWN0IGlmX2xpc3RfZW50cnkgKmVudHJ5OwotCXN0cnVjdCBobGlzdF9ub2RlICpwb3M7Ci0Jc2l6ZV90IGNvdW50ID0gMDsKLQotCWhsaXN0X2Zvcl9lYWNoX2VudHJ5KGVudHJ5LCBwb3MsIGlmX2xpc3QsIGxpc3QpIHsKLQkJaWYgKGVudHJ5LT5wcmltYXJ5KQotCQkJY291bnQgKz0gOTsKLQkJZWxzZQotCQkJY291bnQgKz0gMjM7Ci0JfQotCi0JcmV0dXJuIGNvdW50OwotfQotCi0vKiByZWFkIGFuIGVudHJ5ICAqLwotc3RhdGljIHNzaXplX3QgdmlzX2RhdGFfcmVhZF9lbnRyeShjaGFyICpidWZmLCBzdHJ1Y3QgdmlzX2luZm9fZW50cnkgKmVudHJ5LAotCQkJCSAgIHVpbnQ4X3QgKnNyYywgYm9vbCBwcmltYXJ5KQotewotCS8qIG1heGltYWwgbGVuZ3RoOiBtYXgoNCsxNysyLCAzKzE3KzErMysyKSA9PSAyNiAqLwotCWlmIChwcmltYXJ5ICYmIGVudHJ5LT5xdWFsaXR5ID09IDApCi0JCXJldHVybiBzcHJpbnRmKGJ1ZmYsICJITkEgJXBNLCAiLCBlbnRyeS0+ZGVzdCk7Ci0JZWxzZSBpZiAoY29tcGFyZV9vcmlnKGVudHJ5LT5zcmMsIHNyYykpCi0JCXJldHVybiBzcHJpbnRmKGJ1ZmYsICJUUSAlcE0gJWQsICIsIGVudHJ5LT5kZXN0LAotCQkJICAgICAgIGVudHJ5LT5xdWFsaXR5KTsKLQotCXJldHVybiAwOwotfQotCi1pbnQgdmlzX3NlcV9wcmludF90ZXh0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICpvZmZzZXQpCi17Ci0JSEFTSElUKGhhc2hpdCk7Ci0JSEFTSElUKGhhc2hpdF9jb3VudCk7Ci0Jc3RydWN0IHZpc19pbmZvICppbmZvOwotCXN0cnVjdCB2aXNfcGFja2V0ICpwYWNrZXQ7Ci0Jc3RydWN0IHZpc19pbmZvX2VudHJ5ICplbnRyaWVzOwotCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopc2VxLT5wcml2YXRlOwotCXN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYgPSBuZXRkZXZfcHJpdihuZXRfZGV2KTsKLQlITElTVF9IRUFEKHZpc19pZl9saXN0KTsKLQlzdHJ1Y3QgaWZfbGlzdF9lbnRyeSAqZW50cnk7Ci0Jc3RydWN0IGhsaXN0X25vZGUgKnBvcywgKm47Ci0JaW50IGk7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgdmlzX3NlcnZlciA9IGF0b21pY19yZWFkKCZiYXRfcHJpdi0+dmlzX21vZGUpOwotCXNpemVfdCBidWZmX3BvcywgYnVmX3NpemU7Ci0JY2hhciAqYnVmZjsKLQotCWlmICgoIWJhdF9wcml2LT5wcmltYXJ5X2lmKSB8fAotCSAgICAodmlzX3NlcnZlciA9PSBWSVNfVFlQRV9DTElFTlRfVVBEQVRFKSkKLQkJcmV0dXJuIDA7Ci0KLQlidWZfc2l6ZSA9IDE7Ci0JLyogRXN0aW1hdGUgbGVuZ3RoICovCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmJhdF9wcml2LT52aXNfaGFzaF9sb2NrLCBmbGFncyk7Ci0Jd2hpbGUgKGhhc2hfaXRlcmF0ZShiYXRfcHJpdi0+dmlzX2hhc2gsICZoYXNoaXRfY291bnQpKSB7Ci0JCWluZm8gPSBoYXNoaXRfY291bnQuYnVja2V0LT5kYXRhOwotCQlwYWNrZXQgPSAoc3RydWN0IHZpc19wYWNrZXQgKilpbmZvLT5za2JfcGFja2V0LT5kYXRhOwotCQllbnRyaWVzID0gKHN0cnVjdCB2aXNfaW5mb19lbnRyeSAqKQotCQkJICAoKGNoYXIgKilwYWNrZXQgKyBzaXplb2Yoc3RydWN0IHZpc19wYWNrZXQpKTsKLQotCQlmb3IgKGkgPSAwOyBpIDwgcGFja2V0LT5lbnRyaWVzOyBpKyspIHsKLQkJCWlmIChlbnRyaWVzW2ldLnF1YWxpdHkgPT0gMCkKLQkJCQljb250aW51ZTsKLQkJCXZpc19kYXRhX2luc2VydF9pbnRlcmZhY2UoZW50cmllc1tpXS5zcmMsICZ2aXNfaWZfbGlzdCwKLQkJCQljb21wYXJlX29yaWcoZW50cmllc1tpXS5zcmMsIHBhY2tldC0+dmlzX29yaWcpKTsKLQkJfQotCi0JCWhsaXN0X2Zvcl9lYWNoX2VudHJ5KGVudHJ5LCBwb3MsICZ2aXNfaWZfbGlzdCwgbGlzdCkgewotCQkJYnVmX3NpemUgKz0gMTggKyAyNiAqIHBhY2tldC0+ZW50cmllczsKLQotCQkJLyogYWRkIHByaW1hcnkvc2Vjb25kYXJ5IHJlY29yZHMgKi8KLQkJCWlmIChjb21wYXJlX29yaWcoZW50cnktPmFkZHIsIHBhY2tldC0+dmlzX29yaWcpKQotCQkJCWJ1Zl9zaXplICs9Ci0JCQkJCXZpc19kYXRhX2NvdW50X3ByaW1fc2VjKCZ2aXNfaWZfbGlzdCk7Ci0KLQkJCWJ1Zl9zaXplICs9IDE7Ci0JCX0KLQotCQlobGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGVudHJ5LCBwb3MsIG4sICZ2aXNfaWZfbGlzdCwgbGlzdCkgewotCQkJaGxpc3RfZGVsKCZlbnRyeS0+bGlzdCk7Ci0JCQlrZnJlZShlbnRyeSk7Ci0JCX0KLQl9Ci0KLQlidWZmID0ga21hbGxvYyhidWZfc2l6ZSwgR0ZQX0FUT01JQyk7Ci0JaWYgKCFidWZmKSB7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJhdF9wcml2LT52aXNfaGFzaF9sb2NrLCBmbGFncyk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQlidWZmWzBdID0gJ1wwJzsKLQlidWZmX3BvcyA9IDA7Ci0KLQl3aGlsZSAoaGFzaF9pdGVyYXRlKGJhdF9wcml2LT52aXNfaGFzaCwgJmhhc2hpdCkpIHsKLQkJaW5mbyA9IGhhc2hpdC5idWNrZXQtPmRhdGE7Ci0JCXBhY2tldCA9IChzdHJ1Y3QgdmlzX3BhY2tldCAqKWluZm8tPnNrYl9wYWNrZXQtPmRhdGE7Ci0JCWVudHJpZXMgPSAoc3RydWN0IHZpc19pbmZvX2VudHJ5ICopCi0JCQkgICgoY2hhciAqKXBhY2tldCArIHNpemVvZihzdHJ1Y3QgdmlzX3BhY2tldCkpOwotCi0JCWZvciAoaSA9IDA7IGkgPCBwYWNrZXQtPmVudHJpZXM7IGkrKykgewotCQkJaWYgKGVudHJpZXNbaV0ucXVhbGl0eSA9PSAwKQotCQkJCWNvbnRpbnVlOwotCQkJdmlzX2RhdGFfaW5zZXJ0X2ludGVyZmFjZShlbnRyaWVzW2ldLnNyYywgJnZpc19pZl9saXN0LAotCQkJCWNvbXBhcmVfb3JpZyhlbnRyaWVzW2ldLnNyYywgcGFja2V0LT52aXNfb3JpZykpOwotCQl9Ci0KLQkJaGxpc3RfZm9yX2VhY2hfZW50cnkoZW50cnksIHBvcywgJnZpc19pZl9saXN0LCBsaXN0KSB7Ci0JCQlidWZmX3BvcyArPSBzcHJpbnRmKGJ1ZmYgKyBidWZmX3BvcywgIiVwTSwiLAotCQkJCQkgICAgZW50cnktPmFkZHIpOwotCi0JCQlmb3IgKGkgPSAwOyBpIDwgcGFja2V0LT5lbnRyaWVzOyBpKyspCi0JCQkJYnVmZl9wb3MgKz0gdmlzX2RhdGFfcmVhZF9lbnRyeShidWZmICsgYnVmZl9wb3MsCi0JCQkJCQkJCSZlbnRyaWVzW2ldLAotCQkJCQkJCQllbnRyeS0+YWRkciwKLQkJCQkJCQkJZW50cnktPnByaW1hcnkpOwotCi0JCQkvKiBhZGQgcHJpbWFyeS9zZWNvbmRhcnkgcmVjb3JkcyAqLwotCQkJaWYgKGNvbXBhcmVfb3JpZyhlbnRyeS0+YWRkciwgcGFja2V0LT52aXNfb3JpZykpCi0JCQkJYnVmZl9wb3MgKz0KLQkJCQkJdmlzX2RhdGFfcmVhZF9wcmltX3NlYyhidWZmICsgYnVmZl9wb3MsCi0JCQkJCQkJICAgICAgICZ2aXNfaWZfbGlzdCk7Ci0KLQkJCWJ1ZmZfcG9zICs9IHNwcmludGYoYnVmZiArIGJ1ZmZfcG9zLCAiXG4iKTsKLQkJfQotCi0JCWhsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZW50cnksIHBvcywgbiwgJnZpc19pZl9saXN0LCBsaXN0KSB7Ci0JCQlobGlzdF9kZWwoJmVudHJ5LT5saXN0KTsKLQkJCWtmcmVlKGVudHJ5KTsKLQkJfQotCX0KLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJhdF9wcml2LT52aXNfaGFzaF9sb2NrLCBmbGFncyk7Ci0KLQlzZXFfcHJpbnRmKHNlcSwgIiVzIiwgYnVmZik7Ci0Ja2ZyZWUoYnVmZik7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyogYWRkIHRoZSBpbmZvIHBhY2tldCB0byB0aGUgc2VuZCBsaXN0LCBpZiBpdCB3YXMgbm90Ci0gKiBhbHJlYWR5IGxpbmtlZCBpbi4gKi8KLXN0YXRpYyB2b2lkIHNlbmRfbGlzdF9hZGQoc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiwgc3RydWN0IHZpc19pbmZvICppbmZvKQotewotCWlmIChsaXN0X2VtcHR5KCZpbmZvLT5zZW5kX2xpc3QpKSB7Ci0JCWtyZWZfZ2V0KCZpbmZvLT5yZWZjb3VudCk7Ci0JCWxpc3RfYWRkX3RhaWwoJmluZm8tPnNlbmRfbGlzdCwgJmJhdF9wcml2LT52aXNfc2VuZF9saXN0KTsKLQl9Ci19Ci0KLS8qIGRlbGV0ZSB0aGUgaW5mbyBwYWNrZXQgZnJvbSB0aGUgc2VuZCBsaXN0LCBpZiBpdCB3YXMKLSAqIGxpbmtlZCBpbi4gKi8KLXN0YXRpYyB2b2lkIHNlbmRfbGlzdF9kZWwoc3RydWN0IHZpc19pbmZvICppbmZvKQotewotCWlmICghbGlzdF9lbXB0eSgmaW5mby0+c2VuZF9saXN0KSkgewotCQlsaXN0X2RlbF9pbml0KCZpbmZvLT5zZW5kX2xpc3QpOwotCQlrcmVmX3B1dCgmaW5mby0+cmVmY291bnQsIGZyZWVfaW5mbyk7Ci0JfQotfQotCi0vKiB0cmllcyB0byBhZGQgb25lIGVudHJ5IHRvIHRoZSByZWNlaXZlIGxpc3QuICovCi1zdGF0aWMgdm9pZCByZWN2X2xpc3RfYWRkKHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYsCi0JCQkgIHN0cnVjdCBsaXN0X2hlYWQgKnJlY3ZfbGlzdCwgY2hhciAqbWFjKQotewotCXN0cnVjdCByZWN2bGlzdF9ub2RlICplbnRyeTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JZW50cnkgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcmVjdmxpc3Rfbm9kZSksIEdGUF9BVE9NSUMpOwotCWlmICghZW50cnkpCi0JCXJldHVybjsKLQotCW1lbWNweShlbnRyeS0+bWFjLCBtYWMsIEVUSF9BTEVOKTsKLQlzcGluX2xvY2tfaXJxc2F2ZSgmYmF0X3ByaXYtPnZpc19saXN0X2xvY2ssIGZsYWdzKTsKLQlsaXN0X2FkZF90YWlsKCZlbnRyeS0+bGlzdCwgcmVjdl9saXN0KTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiYXRfcHJpdi0+dmlzX2xpc3RfbG9jaywgZmxhZ3MpOwotfQotCi0vKiByZXR1cm5zIDEgaWYgdGhpcyBtYWMgaXMgaW4gdGhlIHJlY3ZfbGlzdCAqLwotc3RhdGljIGludCByZWN2X2xpc3RfaXNfaW4oc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiwKLQkJCSAgIHN0cnVjdCBsaXN0X2hlYWQgKnJlY3ZfbGlzdCwgY2hhciAqbWFjKQotewotCXN0cnVjdCByZWN2bGlzdF9ub2RlICplbnRyeTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmJhdF9wcml2LT52aXNfbGlzdF9sb2NrLCBmbGFncyk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeShlbnRyeSwgcmVjdl9saXN0LCBsaXN0KSB7Ci0JCWlmIChtZW1jbXAoZW50cnktPm1hYywgbWFjLCBFVEhfQUxFTikgPT0gMCkgewotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmF0X3ByaXYtPnZpc19saXN0X2xvY2ssCi0JCQkJCSAgICAgICBmbGFncyk7Ci0JCQlyZXR1cm4gMTsKLQkJfQotCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiYXRfcHJpdi0+dmlzX2xpc3RfbG9jaywgZmxhZ3MpOwotCXJldHVybiAwOwotfQotCi0vKiB0cnkgdG8gYWRkIHRoZSBwYWNrZXQgdG8gdGhlIHZpc19oYXNoLiByZXR1cm4gTlVMTCBpZiBpbnZhbGlkIChlLmcuIHRvbyBvbGQsCi0gKiBicm9rZW4uLiApLgl2aXMgaGFzaCBtdXN0IGJlIGxvY2tlZCBvdXRzaWRlLiAgaXNfbmV3IGlzIHNldCB3aGVuIHRoZSBwYWNrZXQKLSAqIGlzIG5ld2VyIHRoYW4gb2xkIGVudHJpZXMgaW4gdGhlIGhhc2guICovCi1zdGF0aWMgc3RydWN0IHZpc19pbmZvICphZGRfcGFja2V0KHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYsCi0JCQkJICAgc3RydWN0IHZpc19wYWNrZXQgKnZpc19wYWNrZXQsCi0JCQkJICAgaW50IHZpc19pbmZvX2xlbiwgaW50ICppc19uZXcsCi0JCQkJICAgaW50IG1ha2VfYnJvYWRjYXN0KQotewotCXN0cnVjdCB2aXNfaW5mbyAqaW5mbywgKm9sZF9pbmZvOwotCXN0cnVjdCB2aXNfcGFja2V0ICpzZWFyY2hfcGFja2V0LCAqb2xkX3BhY2tldDsKLQlzdHJ1Y3QgdmlzX2luZm8gc2VhcmNoX2VsZW07Ci0Jc3RydWN0IHZpc19wYWNrZXQgKnBhY2tldDsKLQotCSppc19uZXcgPSAwOwotCS8qIHNhbml0eSBjaGVjayAqLwotCWlmICghYmF0X3ByaXYtPnZpc19oYXNoKQotCQlyZXR1cm4gTlVMTDsKLQotCS8qIHNlZSBpZiB0aGUgcGFja2V0IGlzIGFscmVhZHkgaW4gdmlzX2hhc2ggKi8KLQlzZWFyY2hfZWxlbS5za2JfcGFja2V0ID0gZGV2X2FsbG9jX3NrYihzaXplb2Yoc3RydWN0IHZpc19wYWNrZXQpKTsKLQlpZiAoIXNlYXJjaF9lbGVtLnNrYl9wYWNrZXQpCi0JCXJldHVybiBOVUxMOwotCXNlYXJjaF9wYWNrZXQgPSAoc3RydWN0IHZpc19wYWNrZXQgKilza2JfcHV0KHNlYXJjaF9lbGVtLnNrYl9wYWNrZXQsCi0JCQkJCQkgICAgIHNpemVvZihzdHJ1Y3QgdmlzX3BhY2tldCkpOwotCi0JbWVtY3B5KHNlYXJjaF9wYWNrZXQtPnZpc19vcmlnLCB2aXNfcGFja2V0LT52aXNfb3JpZywgRVRIX0FMRU4pOwotCW9sZF9pbmZvID0gaGFzaF9maW5kKGJhdF9wcml2LT52aXNfaGFzaCwgJnNlYXJjaF9lbGVtKTsKLQlrZnJlZV9za2Ioc2VhcmNoX2VsZW0uc2tiX3BhY2tldCk7Ci0KLQlpZiAob2xkX2luZm8gIT0gTlVMTCkgewotCQlvbGRfcGFja2V0ID0gKHN0cnVjdCB2aXNfcGFja2V0ICopb2xkX2luZm8tPnNrYl9wYWNrZXQtPmRhdGE7Ci0JCWlmICghc2VxX2FmdGVyKG50b2hsKHZpc19wYWNrZXQtPnNlcW5vKSwKLQkJCSAgICAgICBudG9obChvbGRfcGFja2V0LT5zZXFubykpKSB7Ci0JCQlpZiAob2xkX3BhY2tldC0+c2Vxbm8gPT0gdmlzX3BhY2tldC0+c2Vxbm8pIHsKLQkJCQlyZWN2X2xpc3RfYWRkKGJhdF9wcml2LCAmb2xkX2luZm8tPnJlY3ZfbGlzdCwKLQkJCQkJICAgICAgdmlzX3BhY2tldC0+c2VuZGVyX29yaWcpOwotCQkJCXJldHVybiBvbGRfaW5mbzsKLQkJCX0gZWxzZSB7Ci0JCQkJLyogbmV3ZXIgcGFja2V0IGlzIGFscmVhZHkgaW4gaGFzaC4gKi8KLQkJCQlyZXR1cm4gTlVMTDsKLQkJCX0KLQkJfQotCQkvKiByZW1vdmUgb2xkIGVudHJ5ICovCi0JCWhhc2hfcmVtb3ZlKGJhdF9wcml2LT52aXNfaGFzaCwgb2xkX2luZm8pOwotCQlzZW5kX2xpc3RfZGVsKG9sZF9pbmZvKTsKLQkJa3JlZl9wdXQoJm9sZF9pbmZvLT5yZWZjb3VudCwgZnJlZV9pbmZvKTsKLQl9Ci0KLQlpbmZvID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHZpc19pbmZvKSwgR0ZQX0FUT01JQyk7Ci0JaWYgKCFpbmZvKQotCQlyZXR1cm4gTlVMTDsKLQotCWluZm8tPnNrYl9wYWNrZXQgPSBkZXZfYWxsb2Nfc2tiKHNpemVvZihzdHJ1Y3QgdmlzX3BhY2tldCkgKwotCQkJCQkgdmlzX2luZm9fbGVuICsgc2l6ZW9mKHN0cnVjdCBldGhoZHIpKTsKLQlpZiAoIWluZm8tPnNrYl9wYWNrZXQpIHsKLQkJa2ZyZWUoaW5mbyk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlza2JfcmVzZXJ2ZShpbmZvLT5za2JfcGFja2V0LCBzaXplb2Yoc3RydWN0IGV0aGhkcikpOwotCXBhY2tldCA9IChzdHJ1Y3QgdmlzX3BhY2tldCAqKXNrYl9wdXQoaW5mby0+c2tiX3BhY2tldCwKLQkJCQkJICAgICAgc2l6ZW9mKHN0cnVjdCB2aXNfcGFja2V0KSArCi0JCQkJCSAgICAgIHZpc19pbmZvX2xlbik7Ci0KLQlrcmVmX2luaXQoJmluZm8tPnJlZmNvdW50KTsKLQlJTklUX0xJU1RfSEVBRCgmaW5mby0+c2VuZF9saXN0KTsKLQlJTklUX0xJU1RfSEVBRCgmaW5mby0+cmVjdl9saXN0KTsKLQlpbmZvLT5maXJzdF9zZWVuID0gamlmZmllczsKLQlpbmZvLT5iYXRfcHJpdiA9IGJhdF9wcml2OwotCW1lbWNweShwYWNrZXQsIHZpc19wYWNrZXQsIHNpemVvZihzdHJ1Y3QgdmlzX3BhY2tldCkgKyB2aXNfaW5mb19sZW4pOwotCi0JLyogaW5pdGlhbGl6ZSBhbmQgYWRkIG5ldyBwYWNrZXQuICovCi0JKmlzX25ldyA9IDE7Ci0KLQkvKiBNYWtlIGl0IGEgYnJvYWRjYXN0IHBhY2tldCwgaWYgcmVxdWlyZWQgKi8KLQlpZiAobWFrZV9icm9hZGNhc3QpCi0JCW1lbWNweShwYWNrZXQtPnRhcmdldF9vcmlnLCBicm9hZGNhc3RfYWRkciwgRVRIX0FMRU4pOwotCi0JLyogcmVwYWlyIGlmIGVudHJpZXMgaXMgbG9uZ2VyIHRoYW4gcGFja2V0LiAqLwotCWlmIChwYWNrZXQtPmVudHJpZXMgKiBzaXplb2Yoc3RydWN0IHZpc19pbmZvX2VudHJ5KSA+IHZpc19pbmZvX2xlbikKLQkJcGFja2V0LT5lbnRyaWVzID0gdmlzX2luZm9fbGVuIC8gc2l6ZW9mKHN0cnVjdCB2aXNfaW5mb19lbnRyeSk7Ci0KLQlyZWN2X2xpc3RfYWRkKGJhdF9wcml2LCAmaW5mby0+cmVjdl9saXN0LCBwYWNrZXQtPnNlbmRlcl9vcmlnKTsKLQotCS8qIHRyeSB0byBhZGQgaXQgKi8KLQlpZiAoaGFzaF9hZGQoYmF0X3ByaXYtPnZpc19oYXNoLCBpbmZvKSA8IDApIHsKLQkJLyogZGlkIG5vdCB3b3JrIChmb3Igc29tZSByZWFzb24pICovCi0JCWtyZWZfcHV0KCZvbGRfaW5mby0+cmVmY291bnQsIGZyZWVfaW5mbyk7Ci0JCWluZm8gPSBOVUxMOwotCX0KLQotCXJldHVybiBpbmZvOwotfQotCi0vKiBoYW5kbGUgdGhlIHNlcnZlciBzeW5jIHBhY2tldCwgZm9yd2FyZCBpZiBuZWVkZWQuICovCi12b2lkIHJlY2VpdmVfc2VydmVyX3N5bmNfcGFja2V0KHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYsCi0JCQkJc3RydWN0IHZpc19wYWNrZXQgKnZpc19wYWNrZXQsCi0JCQkJaW50IHZpc19pbmZvX2xlbikKLXsKLQlzdHJ1Y3QgdmlzX2luZm8gKmluZm87Ci0JaW50IGlzX25ldywgbWFrZV9icm9hZGNhc3Q7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgdmlzX3NlcnZlciA9IGF0b21pY19yZWFkKCZiYXRfcHJpdi0+dmlzX21vZGUpOwotCi0JbWFrZV9icm9hZGNhc3QgPSAodmlzX3NlcnZlciA9PSBWSVNfVFlQRV9TRVJWRVJfU1lOQyk7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYmF0X3ByaXYtPnZpc19oYXNoX2xvY2ssIGZsYWdzKTsKLQlpbmZvID0gYWRkX3BhY2tldChiYXRfcHJpdiwgdmlzX3BhY2tldCwgdmlzX2luZm9fbGVuLAotCQkJICAmaXNfbmV3LCBtYWtlX2Jyb2FkY2FzdCk7Ci0JaWYgKCFpbmZvKQotCQlnb3RvIGVuZDsKLQotCS8qIG9ubHkgaWYgd2UgYXJlIHNlcnZlciBvdXJzZWx2ZXMgYW5kIHBhY2tldCBpcyBuZXdlciB0aGFuIHRoZSBvbmUgaW4KLQkgKiBoYXNoLiovCi0JaWYgKHZpc19zZXJ2ZXIgPT0gVklTX1RZUEVfU0VSVkVSX1NZTkMgJiYgaXNfbmV3KQotCQlzZW5kX2xpc3RfYWRkKGJhdF9wcml2LCBpbmZvKTsKLWVuZDoKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiYXRfcHJpdi0+dmlzX2hhc2hfbG9jaywgZmxhZ3MpOwotfQotCi0vKiBoYW5kbGUgYW4gaW5jb21pbmcgY2xpZW50IHVwZGF0ZSBwYWNrZXQgYW5kIHNjaGVkdWxlIGZvcndhcmQgaWYgbmVlZGVkLiAqLwotdm9pZCByZWNlaXZlX2NsaWVudF91cGRhdGVfcGFja2V0KHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYsCi0JCQkJICBzdHJ1Y3QgdmlzX3BhY2tldCAqdmlzX3BhY2tldCwKLQkJCQkgIGludCB2aXNfaW5mb19sZW4pCi17Ci0Jc3RydWN0IHZpc19pbmZvICppbmZvOwotCXN0cnVjdCB2aXNfcGFja2V0ICpwYWNrZXQ7Ci0JaW50IGlzX25ldzsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCB2aXNfc2VydmVyID0gYXRvbWljX3JlYWQoJmJhdF9wcml2LT52aXNfbW9kZSk7Ci0JaW50IGFyZV90YXJnZXQgPSAwOwotCi0JLyogY2xpZW50cyBzaGFsbCBub3QgYnJvYWRjYXN0LiAqLwotCWlmIChpc19iY2FzdCh2aXNfcGFja2V0LT50YXJnZXRfb3JpZykpCi0JCXJldHVybjsKLQotCS8qIEFyZSB3ZSB0aGUgdGFyZ2V0IGZvciB0aGlzIFZJUyBwYWNrZXQ/ICovCi0JaWYgKHZpc19zZXJ2ZXIgPT0gVklTX1RZUEVfU0VSVkVSX1NZTkMJJiYKLQkgICAgaXNfbXlfbWFjKHZpc19wYWNrZXQtPnRhcmdldF9vcmlnKSkKLQkJYXJlX3RhcmdldCA9IDE7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYmF0X3ByaXYtPnZpc19oYXNoX2xvY2ssIGZsYWdzKTsKLQlpbmZvID0gYWRkX3BhY2tldChiYXRfcHJpdiwgdmlzX3BhY2tldCwgdmlzX2luZm9fbGVuLAotCQkJICAmaXNfbmV3LCBhcmVfdGFyZ2V0KTsKLQotCWlmICghaW5mbykKLQkJZ290byBlbmQ7Ci0JLyogbm90ZSB0aGF0IG91dGRhdGVkIHBhY2tldHMgd2lsbCBiZSBkcm9wcGVkIGF0IHRoaXMgcG9pbnQuICovCi0KLQlwYWNrZXQgPSAoc3RydWN0IHZpc19wYWNrZXQgKilpbmZvLT5za2JfcGFja2V0LT5kYXRhOwotCi0JLyogc2VuZCBvbmx5IGlmIHdlJ3JlIHRoZSB0YXJnZXQgc2VydmVyIG9yIC4uLiAqLwotCWlmIChhcmVfdGFyZ2V0ICYmIGlzX25ldykgewotCQlwYWNrZXQtPnZpc190eXBlID0gVklTX1RZUEVfU0VSVkVSX1NZTkM7CS8qIHVwZ3JhZGUhICovCi0JCXNlbmRfbGlzdF9hZGQoYmF0X3ByaXYsIGluZm8pOwotCi0JCS8qIC4uLiB3ZSdyZSBub3QgdGhlIHJlY2lwaWVudCAoYW5kIHRodXMgbmVlZCB0byBmb3J3YXJkKS4gKi8KLQl9IGVsc2UgaWYgKCFpc19teV9tYWMocGFja2V0LT50YXJnZXRfb3JpZykpIHsKLQkJc2VuZF9saXN0X2FkZChiYXRfcHJpdiwgaW5mbyk7Ci0JfQotCi1lbmQ6Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmF0X3ByaXYtPnZpc19oYXNoX2xvY2ssIGZsYWdzKTsKLX0KLQotLyogV2FsayB0aGUgb3JpZ2luYXRvcnMgYW5kIGZpbmQgdGhlIFZJUyBzZXJ2ZXIgd2l0aCB0aGUgYmVzdCB0cS4gU2V0IHRoZSBwYWNrZXQKLSAqIGFkZHJlc3MgdG8gaXRzIGFkZHJlc3MgYW5kIHJldHVybiB0aGUgYmVzdF90cS4KLSAqCi0gKiBNdXN0IGJlIGNhbGxlZCB3aXRoIHRoZSBvcmlnaW5hdG9yIGhhc2ggbG9ja2VkICovCi1zdGF0aWMgaW50IGZpbmRfYmVzdF92aXNfc2VydmVyKHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYsCi0JCQkJc3RydWN0IHZpc19pbmZvICppbmZvKQotewotCUhBU0hJVChoYXNoaXQpOwotCXN0cnVjdCBvcmlnX25vZGUgKm9yaWdfbm9kZTsKLQlzdHJ1Y3QgdmlzX3BhY2tldCAqcGFja2V0OwotCWludCBiZXN0X3RxID0gLTE7Ci0KLQlwYWNrZXQgPSAoc3RydWN0IHZpc19wYWNrZXQgKilpbmZvLT5za2JfcGFja2V0LT5kYXRhOwotCi0Jd2hpbGUgKGhhc2hfaXRlcmF0ZShiYXRfcHJpdi0+b3JpZ19oYXNoLCAmaGFzaGl0KSkgewotCQlvcmlnX25vZGUgPSBoYXNoaXQuYnVja2V0LT5kYXRhOwotCQlpZiAoKG9yaWdfbm9kZSkgJiYgKG9yaWdfbm9kZS0+cm91dGVyKSAmJgotCQkgICAgKG9yaWdfbm9kZS0+ZmxhZ3MgJiBWSVNfU0VSVkVSKSAmJgotCQkgICAgKG9yaWdfbm9kZS0+cm91dGVyLT50cV9hdmcgPiBiZXN0X3RxKSkgewotCQkJYmVzdF90cSA9IG9yaWdfbm9kZS0+cm91dGVyLT50cV9hdmc7Ci0JCQltZW1jcHkocGFja2V0LT50YXJnZXRfb3JpZywgb3JpZ19ub2RlLT5vcmlnLCBFVEhfQUxFTik7Ci0JCX0KLQl9Ci0JcmV0dXJuIGJlc3RfdHE7Ci19Ci0KLS8qIFJldHVybiB0cnVlIGlmIHRoZSB2aXMgcGFja2V0IGlzIGZ1bGwuICovCi1zdGF0aWMgYm9vbCB2aXNfcGFja2V0X2Z1bGwoc3RydWN0IHZpc19pbmZvICppbmZvKQotewotCXN0cnVjdCB2aXNfcGFja2V0ICpwYWNrZXQ7Ci0JcGFja2V0ID0gKHN0cnVjdCB2aXNfcGFja2V0ICopaW5mby0+c2tiX3BhY2tldC0+ZGF0YTsKLQotCWlmIChNQVhfVklTX1BBQ0tFVF9TSVpFIC8gc2l6ZW9mKHN0cnVjdCB2aXNfaW5mb19lbnRyeSkKLQkJPCBwYWNrZXQtPmVudHJpZXMgKyAxKQotCQlyZXR1cm4gdHJ1ZTsKLQlyZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIGdlbmVyYXRlcyBhIHBhY2tldCBvZiBvd24gdmlzIGRhdGEsCi0gKiByZXR1cm5zIDAgb24gc3VjY2VzcywgLTEgaWYgbm8gcGFja2V0IGNvdWxkIGJlIGdlbmVyYXRlZCAqLwotc3RhdGljIGludCBnZW5lcmF0ZV92aXNfcGFja2V0KHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYpCi17Ci0JSEFTSElUKGhhc2hpdF9sb2NhbCk7Ci0JSEFTSElUKGhhc2hpdF9nbG9iYWwpOwotCXN0cnVjdCBvcmlnX25vZGUgKm9yaWdfbm9kZTsKLQlzdHJ1Y3QgdmlzX2luZm8gKmluZm8gPSAoc3RydWN0IHZpc19pbmZvICopYmF0X3ByaXYtPm15X3Zpc19pbmZvOwotCXN0cnVjdCB2aXNfcGFja2V0ICpwYWNrZXQgPSAoc3RydWN0IHZpc19wYWNrZXQgKilpbmZvLT5za2JfcGFja2V0LT5kYXRhOwotCXN0cnVjdCB2aXNfaW5mb19lbnRyeSAqZW50cnk7Ci0Jc3RydWN0IGhuYV9sb2NhbF9lbnRyeSAqaG5hX2xvY2FsX2VudHJ5OwotCWludCBiZXN0X3RxID0gLTE7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWluZm8tPmZpcnN0X3NlZW4gPSBqaWZmaWVzOwotCXBhY2tldC0+dmlzX3R5cGUgPSBhdG9taWNfcmVhZCgmYmF0X3ByaXYtPnZpc19tb2RlKTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZiYXRfcHJpdi0+b3JpZ19oYXNoX2xvY2ssIGZsYWdzKTsKLQltZW1jcHkocGFja2V0LT50YXJnZXRfb3JpZywgYnJvYWRjYXN0X2FkZHIsIEVUSF9BTEVOKTsKLQlwYWNrZXQtPnR0bCA9IFRUTDsKLQlwYWNrZXQtPnNlcW5vID0gaHRvbmwobnRvaGwocGFja2V0LT5zZXFubykgKyAxKTsKLQlwYWNrZXQtPmVudHJpZXMgPSAwOwotCXNrYl90cmltKGluZm8tPnNrYl9wYWNrZXQsIHNpemVvZihzdHJ1Y3QgdmlzX3BhY2tldCkpOwotCi0JaWYgKHBhY2tldC0+dmlzX3R5cGUgPT0gVklTX1RZUEVfQ0xJRU5UX1VQREFURSkgewotCQliZXN0X3RxID0gZmluZF9iZXN0X3Zpc19zZXJ2ZXIoYmF0X3ByaXYsIGluZm8pOwotCi0JCWlmIChiZXN0X3RxIDwgMCkgewotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmF0X3ByaXYtPm9yaWdfaGFzaF9sb2NrLAotCQkJCQkgICAgICAgZmxhZ3MpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JfQotCi0Jd2hpbGUgKGhhc2hfaXRlcmF0ZShiYXRfcHJpdi0+b3JpZ19oYXNoLCAmaGFzaGl0X2dsb2JhbCkpIHsKLQkJb3JpZ19ub2RlID0gaGFzaGl0X2dsb2JhbC5idWNrZXQtPmRhdGE7Ci0KLQkJaWYgKCFvcmlnX25vZGUtPnJvdXRlcikKLQkJCWNvbnRpbnVlOwotCi0JCWlmICghY29tcGFyZV9vcmlnKG9yaWdfbm9kZS0+cm91dGVyLT5hZGRyLCBvcmlnX25vZGUtPm9yaWcpKQotCQkJY29udGludWU7Ci0KLQkJaWYgKG9yaWdfbm9kZS0+cm91dGVyLT5pZl9pbmNvbWluZy0+aWZfc3RhdHVzICE9IElGX0FDVElWRSkKLQkJCWNvbnRpbnVlOwotCi0JCWlmIChvcmlnX25vZGUtPnJvdXRlci0+dHFfYXZnIDwgMSkKLQkJCWNvbnRpbnVlOwotCi0JCS8qIGZpbGwgb25lIGVudHJ5IGludG8gYnVmZmVyLiAqLwotCQllbnRyeSA9IChzdHJ1Y3QgdmlzX2luZm9fZW50cnkgKikKLQkJCQlza2JfcHV0KGluZm8tPnNrYl9wYWNrZXQsIHNpemVvZigqZW50cnkpKTsKLQkJbWVtY3B5KGVudHJ5LT5zcmMsCi0JCSAgICAgICBvcmlnX25vZGUtPnJvdXRlci0+aWZfaW5jb21pbmctPm5ldF9kZXYtPmRldl9hZGRyLAotCQkgICAgICAgRVRIX0FMRU4pOwotCQltZW1jcHkoZW50cnktPmRlc3QsIG9yaWdfbm9kZS0+b3JpZywgRVRIX0FMRU4pOwotCQllbnRyeS0+cXVhbGl0eSA9IG9yaWdfbm9kZS0+cm91dGVyLT50cV9hdmc7Ci0JCXBhY2tldC0+ZW50cmllcysrOwotCi0JCWlmICh2aXNfcGFja2V0X2Z1bGwoaW5mbykpIHsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoCi0JCQkJCSZiYXRfcHJpdi0+b3JpZ19oYXNoX2xvY2ssIGZsYWdzKTsKLQkJCXJldHVybiAwOwotCQl9Ci0JfQotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmF0X3ByaXYtPm9yaWdfaGFzaF9sb2NrLCBmbGFncyk7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYmF0X3ByaXYtPmhuYV9saGFzaF9sb2NrLCBmbGFncyk7Ci0Jd2hpbGUgKGhhc2hfaXRlcmF0ZShiYXRfcHJpdi0+aG5hX2xvY2FsX2hhc2gsICZoYXNoaXRfbG9jYWwpKSB7Ci0JCWhuYV9sb2NhbF9lbnRyeSA9IGhhc2hpdF9sb2NhbC5idWNrZXQtPmRhdGE7Ci0JCWVudHJ5ID0gKHN0cnVjdCB2aXNfaW5mb19lbnRyeSAqKXNrYl9wdXQoaW5mby0+c2tiX3BhY2tldCwKLQkJCQkJCQkgc2l6ZW9mKCplbnRyeSkpOwotCQltZW1zZXQoZW50cnktPnNyYywgMCwgRVRIX0FMRU4pOwotCQltZW1jcHkoZW50cnktPmRlc3QsIGhuYV9sb2NhbF9lbnRyeS0+YWRkciwgRVRIX0FMRU4pOwotCQllbnRyeS0+cXVhbGl0eSA9IDA7IC8qIDAgbWVhbnMgSE5BICovCi0JCXBhY2tldC0+ZW50cmllcysrOwotCi0JCWlmICh2aXNfcGFja2V0X2Z1bGwoaW5mbykpIHsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJhdF9wcml2LT5obmFfbGhhc2hfbG9jaywKLQkJCQkJICAgICAgIGZsYWdzKTsKLQkJCXJldHVybiAwOwotCQl9Ci0JfQotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmF0X3ByaXYtPmhuYV9saGFzaF9sb2NrLCBmbGFncyk7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qIGZyZWUgb2xkIHZpcyBwYWNrZXRzLiBNdXN0IGJlIGNhbGxlZCB3aXRoIHRoaXMgdmlzX2hhc2hfbG9jawotICogaGVsZCAqLwotc3RhdGljIHZvaWQgcHVyZ2VfdmlzX3BhY2tldHMoc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdikKLXsKLQlIQVNISVQoaGFzaGl0KTsKLQlzdHJ1Y3QgdmlzX2luZm8gKmluZm87Ci0KLQl3aGlsZSAoaGFzaF9pdGVyYXRlKGJhdF9wcml2LT52aXNfaGFzaCwgJmhhc2hpdCkpIHsKLQkJaW5mbyA9IGhhc2hpdC5idWNrZXQtPmRhdGE7Ci0KLQkJLyogbmV2ZXIgcHVyZ2Ugb3duIGRhdGEuICovCi0JCWlmIChpbmZvID09IGJhdF9wcml2LT5teV92aXNfaW5mbykKLQkJCWNvbnRpbnVlOwotCi0JCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsCi0JCQkgICAgICAgaW5mby0+Zmlyc3Rfc2VlbiArIFZJU19USU1FT1VUICogSFopKSB7Ci0JCQloYXNoX3JlbW92ZV9idWNrZXQoYmF0X3ByaXYtPnZpc19oYXNoLCAmaGFzaGl0KTsKLQkJCXNlbmRfbGlzdF9kZWwoaW5mbyk7Ci0JCQlrcmVmX3B1dCgmaW5mby0+cmVmY291bnQsIGZyZWVfaW5mbyk7Ci0JCX0KLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIGJyb2FkY2FzdF92aXNfcGFja2V0KHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYsCi0JCQkJIHN0cnVjdCB2aXNfaW5mbyAqaW5mbykKLXsKLQlIQVNISVQoaGFzaGl0KTsKLQlzdHJ1Y3Qgb3JpZ19ub2RlICpvcmlnX25vZGU7Ci0Jc3RydWN0IHZpc19wYWNrZXQgKnBhY2tldDsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3RydWN0IGJhdG1hbl9pZiAqYmF0bWFuX2lmOwotCXVpbnQ4X3QgZHN0YWRkcltFVEhfQUxFTl07Ci0KLQotCXNwaW5fbG9ja19pcnFzYXZlKCZiYXRfcHJpdi0+b3JpZ19oYXNoX2xvY2ssIGZsYWdzKTsKLQlwYWNrZXQgPSAoc3RydWN0IHZpc19wYWNrZXQgKilpbmZvLT5za2JfcGFja2V0LT5kYXRhOwotCi0JLyogc2VuZCB0byBhbGwgcm91dGVycyBpbiByYW5nZS4gKi8KLQl3aGlsZSAoaGFzaF9pdGVyYXRlKGJhdF9wcml2LT5vcmlnX2hhc2gsICZoYXNoaXQpKSB7Ci0JCW9yaWdfbm9kZSA9IGhhc2hpdC5idWNrZXQtPmRhdGE7Ci0KLQkJLyogaWYgaXQncyBhIHZpcyBzZXJ2ZXIgYW5kIHJlYWNoYWJsZSwgc2VuZCBpdC4gKi8KLQkJaWYgKCghb3JpZ19ub2RlKSB8fCAoIW9yaWdfbm9kZS0+cm91dGVyKSkKLQkJCWNvbnRpbnVlOwotCQlpZiAoIShvcmlnX25vZGUtPmZsYWdzICYgVklTX1NFUlZFUikpCi0JCQljb250aW51ZTsKLQkJLyogZG9uJ3Qgc2VuZCBpdCBpZiB3ZSBhbHJlYWR5IHJlY2VpdmVkIHRoZSBwYWNrZXQgZnJvbQotCQkgKiB0aGlzIG5vZGUuICovCi0JCWlmIChyZWN2X2xpc3RfaXNfaW4oYmF0X3ByaXYsICZpbmZvLT5yZWN2X2xpc3QsCi0JCQkJCQkJb3JpZ19ub2RlLT5vcmlnKSkKLQkJCWNvbnRpbnVlOwotCi0JCW1lbWNweShwYWNrZXQtPnRhcmdldF9vcmlnLCBvcmlnX25vZGUtPm9yaWcsIEVUSF9BTEVOKTsKLQkJYmF0bWFuX2lmID0gb3JpZ19ub2RlLT5yb3V0ZXItPmlmX2luY29taW5nOwotCQltZW1jcHkoZHN0YWRkciwgb3JpZ19ub2RlLT5yb3V0ZXItPmFkZHIsIEVUSF9BTEVOKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmF0X3ByaXYtPm9yaWdfaGFzaF9sb2NrLCBmbGFncyk7Ci0KLQkJc2tiID0gc2tiX2Nsb25lKGluZm8tPnNrYl9wYWNrZXQsIEdGUF9BVE9NSUMpOwotCQlpZiAoc2tiKQotCQkJc2VuZF9za2JfcGFja2V0KHNrYiwgYmF0bWFuX2lmLCBkc3RhZGRyKTsKLQotCQlzcGluX2xvY2tfaXJxc2F2ZSgmYmF0X3ByaXYtPm9yaWdfaGFzaF9sb2NrLCBmbGFncyk7Ci0KLQl9Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiYXRfcHJpdi0+b3JpZ19oYXNoX2xvY2ssIGZsYWdzKTsKLX0KLQotc3RhdGljIHZvaWQgdW5pY2FzdF92aXNfcGFja2V0KHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYsCi0JCQkgICAgICAgc3RydWN0IHZpc19pbmZvICppbmZvKQotewotCXN0cnVjdCBvcmlnX25vZGUgKm9yaWdfbm9kZTsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwotCXN0cnVjdCB2aXNfcGFja2V0ICpwYWNrZXQ7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzdHJ1Y3QgYmF0bWFuX2lmICpiYXRtYW5faWY7Ci0JdWludDhfdCBkc3RhZGRyW0VUSF9BTEVOXTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZiYXRfcHJpdi0+b3JpZ19oYXNoX2xvY2ssIGZsYWdzKTsKLQlwYWNrZXQgPSAoc3RydWN0IHZpc19wYWNrZXQgKilpbmZvLT5za2JfcGFja2V0LT5kYXRhOwotCW9yaWdfbm9kZSA9ICgoc3RydWN0IG9yaWdfbm9kZSAqKWhhc2hfZmluZChiYXRfcHJpdi0+b3JpZ19oYXNoLAotCQkJCQkJICAgcGFja2V0LT50YXJnZXRfb3JpZykpOwotCi0JaWYgKCghb3JpZ19ub2RlKSB8fCAoIW9yaWdfbm9kZS0+cm91dGVyKSkKLQkJZ290byBvdXQ7Ci0KLQkvKiBkb24ndCBsb2NrIHdoaWxlIHNlbmRpbmcgdGhlIHBhY2tldHMgLi4uIHdlIHRoZXJlZm9yZQotCSAqIGNvcHkgdGhlIHJlcXVpcmVkIGRhdGEgYmVmb3JlIHNlbmRpbmcgKi8KLQliYXRtYW5faWYgPSBvcmlnX25vZGUtPnJvdXRlci0+aWZfaW5jb21pbmc7Ci0JbWVtY3B5KGRzdGFkZHIsIG9yaWdfbm9kZS0+cm91dGVyLT5hZGRyLCBFVEhfQUxFTik7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmF0X3ByaXYtPm9yaWdfaGFzaF9sb2NrLCBmbGFncyk7Ci0KLQlza2IgPSBza2JfY2xvbmUoaW5mby0+c2tiX3BhY2tldCwgR0ZQX0FUT01JQyk7Ci0JaWYgKHNrYikKLQkJc2VuZF9za2JfcGFja2V0KHNrYiwgYmF0bWFuX2lmLCBkc3RhZGRyKTsKLQotCXJldHVybjsKLQotb3V0OgotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJhdF9wcml2LT5vcmlnX2hhc2hfbG9jaywgZmxhZ3MpOwotfQotCi0vKiBvbmx5IHNlbmQgb25lIHZpcyBwYWNrZXQuIGNhbGxlZCBmcm9tIHNlbmRfdmlzX3BhY2tldHMoKSAqLwotc3RhdGljIHZvaWQgc2VuZF92aXNfcGFja2V0KHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYsIHN0cnVjdCB2aXNfaW5mbyAqaW5mbykKLXsKLQlzdHJ1Y3QgdmlzX3BhY2tldCAqcGFja2V0OwotCi0JcGFja2V0ID0gKHN0cnVjdCB2aXNfcGFja2V0ICopaW5mby0+c2tiX3BhY2tldC0+ZGF0YTsKLQlpZiAocGFja2V0LT50dGwgPCAyKSB7Ci0JCXByX2RlYnVnKCJFcnJvciAtIGNhbid0IHNlbmQgdmlzIHBhY2tldDogdHRsIGV4Y2VlZGVkXG4iKTsKLQkJcmV0dXJuOwotCX0KLQotCW1lbWNweShwYWNrZXQtPnNlbmRlcl9vcmlnLCBiYXRfcHJpdi0+cHJpbWFyeV9pZi0+bmV0X2Rldi0+ZGV2X2FkZHIsCi0JICAgICAgIEVUSF9BTEVOKTsKLQlwYWNrZXQtPnR0bC0tOwotCi0JaWYgKGlzX2JjYXN0KHBhY2tldC0+dGFyZ2V0X29yaWcpKQotCQlicm9hZGNhc3RfdmlzX3BhY2tldChiYXRfcHJpdiwgaW5mbyk7Ci0JZWxzZQotCQl1bmljYXN0X3Zpc19wYWNrZXQoYmF0X3ByaXYsIGluZm8pOwotCXBhY2tldC0+dHRsKys7IC8qIHJlc3RvcmUgVFRMICovCi19Ci0KLS8qIGNhbGxlZCBmcm9tIHRpbWVyOyBzZW5kIChhbmQgbWF5YmUgZ2VuZXJhdGUpIHZpcyBwYWNrZXQuICovCi1zdGF0aWMgdm9pZCBzZW5kX3Zpc19wYWNrZXRzKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKLXsKLQlzdHJ1Y3QgZGVsYXllZF93b3JrICpkZWxheWVkX3dvcmsgPQotCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IGRlbGF5ZWRfd29yaywgd29yayk7Ci0Jc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiA9Ci0JCWNvbnRhaW5lcl9vZihkZWxheWVkX3dvcmssIHN0cnVjdCBiYXRfcHJpdiwgdmlzX3dvcmspOwotCXN0cnVjdCB2aXNfaW5mbyAqaW5mbywgKnRlbXA7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZiYXRfcHJpdi0+dmlzX2hhc2hfbG9jaywgZmxhZ3MpOwotCXB1cmdlX3Zpc19wYWNrZXRzKGJhdF9wcml2KTsKLQotCWlmIChnZW5lcmF0ZV92aXNfcGFja2V0KGJhdF9wcml2KSA9PSAwKSB7Ci0JCS8qIHNjaGVkdWxlIGlmIGdlbmVyYXRpb24gd2FzIHN1Y2Nlc3NmdWwgKi8KLQkJc2VuZF9saXN0X2FkZChiYXRfcHJpdiwgYmF0X3ByaXYtPm15X3Zpc19pbmZvKTsKLQl9Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoaW5mbywgdGVtcCwgJmJhdF9wcml2LT52aXNfc2VuZF9saXN0LAotCQkJCSBzZW5kX2xpc3QpIHsKLQotCQlrcmVmX2dldCgmaW5mby0+cmVmY291bnQpOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiYXRfcHJpdi0+dmlzX2hhc2hfbG9jaywgZmxhZ3MpOwotCi0JCWlmIChiYXRfcHJpdi0+cHJpbWFyeV9pZikKLQkJCXNlbmRfdmlzX3BhY2tldChiYXRfcHJpdiwgaW5mbyk7Ci0KLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmJhdF9wcml2LT52aXNfaGFzaF9sb2NrLCBmbGFncyk7Ci0JCXNlbmRfbGlzdF9kZWwoaW5mbyk7Ci0JCWtyZWZfcHV0KCZpbmZvLT5yZWZjb3VudCwgZnJlZV9pbmZvKTsKLQl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmF0X3ByaXYtPnZpc19oYXNoX2xvY2ssIGZsYWdzKTsKLQlzdGFydF92aXNfdGltZXIoYmF0X3ByaXYpOwotfQotCi0vKiBpbml0IHRoZSB2aXMgc2VydmVyLiB0aGlzIG1heSBvbmx5IGJlIGNhbGxlZCB3aGVuIGlmX2xpc3QgaXMgYWxyZWFkeQotICogaW5pdGlhbGl6ZWQgKGUuZy4gYmF0MCBpcyBpbml0aWFsaXplZCwgaW50ZXJmYWNlcyBoYXZlIGJlZW4gYWRkZWQpICovCi1pbnQgdmlzX2luaXQoc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdikKLXsKLQlzdHJ1Y3QgdmlzX3BhY2tldCAqcGFja2V0OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlpZiAoYmF0X3ByaXYtPnZpc19oYXNoKQotCQlyZXR1cm4gMTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZiYXRfcHJpdi0+dmlzX2hhc2hfbG9jaywgZmxhZ3MpOwotCi0JYmF0X3ByaXYtPnZpc19oYXNoID0gaGFzaF9uZXcoMjU2LCB2aXNfaW5mb19jbXAsIHZpc19pbmZvX2Nob29zZSk7Ci0JaWYgKCFiYXRfcHJpdi0+dmlzX2hhc2gpIHsKLQkJcHJfZXJyKCJDYW4ndCBpbml0aWFsaXplIHZpc19oYXNoXG4iKTsKLQkJZ290byBlcnI7Ci0JfQotCi0JYmF0X3ByaXYtPm15X3Zpc19pbmZvID0ga21hbGxvYyhNQVhfVklTX1BBQ0tFVF9TSVpFLCBHRlBfQVRPTUlDKTsKLQlpZiAoIWJhdF9wcml2LT5teV92aXNfaW5mbykgewotCQlwcl9lcnIoIkNhbid0IGluaXRpYWxpemUgdmlzIHBhY2tldFxuIik7Ci0JCWdvdG8gZXJyOwotCX0KLQotCWJhdF9wcml2LT5teV92aXNfaW5mby0+c2tiX3BhY2tldCA9IGRldl9hbGxvY19za2IoCi0JCQkJCQlzaXplb2Yoc3RydWN0IHZpc19wYWNrZXQpICsKLQkJCQkJCU1BWF9WSVNfUEFDS0VUX1NJWkUgKwotCQkJCQkJc2l6ZW9mKHN0cnVjdCBldGhoZHIpKTsKLQlpZiAoIWJhdF9wcml2LT5teV92aXNfaW5mby0+c2tiX3BhY2tldCkKLQkJZ290byBmcmVlX2luZm87Ci0KLQlza2JfcmVzZXJ2ZShiYXRfcHJpdi0+bXlfdmlzX2luZm8tPnNrYl9wYWNrZXQsIHNpemVvZihzdHJ1Y3QgZXRoaGRyKSk7Ci0JcGFja2V0ID0gKHN0cnVjdCB2aXNfcGFja2V0ICopc2tiX3B1dCgKLQkJCQkJYmF0X3ByaXYtPm15X3Zpc19pbmZvLT5za2JfcGFja2V0LAotCQkJCQlzaXplb2Yoc3RydWN0IHZpc19wYWNrZXQpKTsKLQotCS8qIHByZWZpbGwgdGhlIHZpcyBpbmZvICovCi0JYmF0X3ByaXYtPm15X3Zpc19pbmZvLT5maXJzdF9zZWVuID0gamlmZmllcyAtCi0JCQkJCQltc2Vjc190b19qaWZmaWVzKFZJU19JTlRFUlZBTCk7Ci0JSU5JVF9MSVNUX0hFQUQoJmJhdF9wcml2LT5teV92aXNfaW5mby0+cmVjdl9saXN0KTsKLQlJTklUX0xJU1RfSEVBRCgmYmF0X3ByaXYtPm15X3Zpc19pbmZvLT5zZW5kX2xpc3QpOwotCWtyZWZfaW5pdCgmYmF0X3ByaXYtPm15X3Zpc19pbmZvLT5yZWZjb3VudCk7Ci0JYmF0X3ByaXYtPm15X3Zpc19pbmZvLT5iYXRfcHJpdiA9IGJhdF9wcml2OwotCXBhY2tldC0+dmVyc2lvbiA9IENPTVBBVF9WRVJTSU9OOwotCXBhY2tldC0+cGFja2V0X3R5cGUgPSBCQVRfVklTOwotCXBhY2tldC0+dHRsID0gVFRMOwotCXBhY2tldC0+c2Vxbm8gPSAwOwotCXBhY2tldC0+ZW50cmllcyA9IDA7Ci0KLQlJTklUX0xJU1RfSEVBRCgmYmF0X3ByaXYtPnZpc19zZW5kX2xpc3QpOwotCi0JaWYgKGhhc2hfYWRkKGJhdF9wcml2LT52aXNfaGFzaCwgYmF0X3ByaXYtPm15X3Zpc19pbmZvKSA8IDApIHsKLQkJcHJfZXJyKCJDYW4ndCBhZGQgb3duIHZpcyBwYWNrZXQgaW50byBoYXNoXG4iKTsKLQkJLyogbm90IGluIGhhc2gsIG5lZWQgdG8gcmVtb3ZlIGl0IG1hbnVhbGx5LiAqLwotCQlrcmVmX3B1dCgmYmF0X3ByaXYtPm15X3Zpc19pbmZvLT5yZWZjb3VudCwgZnJlZV9pbmZvKTsKLQkJZ290byBlcnI7Ci0JfQotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmF0X3ByaXYtPnZpc19oYXNoX2xvY2ssIGZsYWdzKTsKLQlzdGFydF92aXNfdGltZXIoYmF0X3ByaXYpOwotCXJldHVybiAxOwotCi1mcmVlX2luZm86Ci0Ja2ZyZWUoYmF0X3ByaXYtPm15X3Zpc19pbmZvKTsKLQliYXRfcHJpdi0+bXlfdmlzX2luZm8gPSBOVUxMOwotZXJyOgotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJhdF9wcml2LT52aXNfaGFzaF9sb2NrLCBmbGFncyk7Ci0JdmlzX3F1aXQoYmF0X3ByaXYpOwotCXJldHVybiAwOwotfQotCi0vKiBEZWNyZWFzZSB0aGUgcmVmZXJlbmNlIGNvdW50IG9uIGEgaGFzaCBpdGVtIGluZm8gKi8KLXN0YXRpYyB2b2lkIGZyZWVfaW5mb19yZWYodm9pZCAqZGF0YSwgdm9pZCAqYXJnKQotewotCXN0cnVjdCB2aXNfaW5mbyAqaW5mbyA9IGRhdGE7Ci0KLQlzZW5kX2xpc3RfZGVsKGluZm8pOwotCWtyZWZfcHV0KCZpbmZvLT5yZWZjb3VudCwgZnJlZV9pbmZvKTsKLX0KLQotLyogc2h1dGRvd24gdmlzLXNlcnZlciAqLwotdm9pZCB2aXNfcXVpdChzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2KQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaWYgKCFiYXRfcHJpdi0+dmlzX2hhc2gpCi0JCXJldHVybjsKLQotCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmYmF0X3ByaXYtPnZpc193b3JrKTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZiYXRfcHJpdi0+dmlzX2hhc2hfbG9jaywgZmxhZ3MpOwotCS8qIHByb3Blcmx5IHJlbW92ZSwga2lsbCB0aW1lcnMgLi4uICovCi0JaGFzaF9kZWxldGUoYmF0X3ByaXYtPnZpc19oYXNoLCBmcmVlX2luZm9fcmVmLCBOVUxMKTsKLQliYXRfcHJpdi0+dmlzX2hhc2ggPSBOVUxMOwotCWJhdF9wcml2LT5teV92aXNfaW5mbyA9IE5VTEw7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmF0X3ByaXYtPnZpc19oYXNoX2xvY2ssIGZsYWdzKTsKLX0KLQotLyogc2NoZWR1bGUgcGFja2V0cyBmb3IgKHJlKXRyYW5zbWlzc2lvbiAqLwotc3RhdGljIHZvaWQgc3RhcnRfdmlzX3RpbWVyKHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYpCi17Ci0JSU5JVF9ERUxBWUVEX1dPUksoJmJhdF9wcml2LT52aXNfd29yaywgc2VuZF92aXNfcGFja2V0cyk7Ci0JcXVldWVfZGVsYXllZF93b3JrKGJhdF9ldmVudF93b3JrcXVldWUsICZiYXRfcHJpdi0+dmlzX3dvcmssCi0JCQkgICBtc2Vjc190b19qaWZmaWVzKFZJU19JTlRFUlZBTCkpOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvdmlzLmggYi9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi92aXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmMzYjMzMC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi92aXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMCBCLkEuVC5NLkEuTi4gY29udHJpYnV0b3JzOgotICoKLSAqIFNpbW9uIFd1bmRlcmxpY2gsIE1hcmVrIExpbmRuZXIKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKLSAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKLSAqIDAyMTEwLTEzMDEsIFVTQQotICoKLSAqLwotCi0jaWZuZGVmIF9ORVRfQkFUTUFOX0FEVl9WSVNfSF8KLSNkZWZpbmUgX05FVF9CQVRNQU5fQURWX1ZJU19IXwotCi0jZGVmaW5lIFZJU19USU1FT1VUCQkyMDAJLyogdGltZW91dCBvZiB2aXMgcGFja2V0cyBpbiBzZWNvbmRzICovCi0KLWludCB2aXNfc2VxX3ByaW50X3RleHQoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKm9mZnNldCk7Ci12b2lkIHJlY2VpdmVfc2VydmVyX3N5bmNfcGFja2V0KHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYsCi0JCQkJc3RydWN0IHZpc19wYWNrZXQgKnZpc19wYWNrZXQsCi0JCQkJaW50IHZpc19pbmZvX2xlbik7Ci12b2lkIHJlY2VpdmVfY2xpZW50X3VwZGF0ZV9wYWNrZXQoc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiwKLQkJCQkgIHN0cnVjdCB2aXNfcGFja2V0ICp2aXNfcGFja2V0LAotCQkJCSAgaW50IHZpc19pbmZvX2xlbik7Ci1pbnQgdmlzX2luaXQoc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdik7Ci12b2lkIHZpc19xdWl0KHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYpOwotCi0jZW5kaWYgLyogX05FVF9CQVRNQU5fQURWX1ZJU19IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JjbS9BZGFwdGVyLmggYi9kcml2ZXJzL3N0YWdpbmcvYmNtL0FkYXB0ZXIuaAppbmRleCA3NDg0NjBlLi4zMjkwOWUyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYmNtL0FkYXB0ZXIuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYmNtL0FkYXB0ZXIuaApAQCAtNyw1MyArNyw2IEBACiAjZGVmaW5lIE1BWF9GUkFHTUVOVEVESVBfQ0xBU1NJRklDQVRJT05fRU5UUklFUyAyNTYKICNpbmNsdWRlICJEZWJ1Zy5oIgogCi10eXBlZGVmIHN0cnVjdCBfTElTVF9FTlRSWXsKLQlzdHJ1Y3QgX0xJU1RfRU5UUlkgCSpuZXh0OwotCXN0cnVjdCBfTElTVF9FTlRSWSAJKnByZXY7Ci19IExJU1RfRU5UUlksICpQTElTVF9FTlRSWTsKLQotdHlwZWRlZiBzdHJ1Y3QgX0JDTV9MSVNUX0VOVFJZIHsKLQotICAgIExJU1RfRU5UUlkgIAkJTGluazsKLQotfSBCQ01fTElTVF9FTlRSWSwgKlBCQ01fTElTVF9FTlRSWTsKLQotdHlwZWRlZiBlbnVtIF9SQ0JfU1RBVFVTCi17Ci0JRFJJVkVSX1BST0NFU1NFRD0xLAotCUFQUExJQ0FUSU9OX1BST0NFU1NFRAotfSBSQ0JfU1RBVFVTLCAqUFJDQl9TVEFUVVM7Ci0KLSNkZWZpbmUgZkZJTExFRCAxCi0jZGVmaW5lIGZFTVBUWSAwCi0KLXN0cnVjdCBfQkNNX0NCCi17Ci0JLy8gVGhlIG5ldHdvcmsgcGFja2V0IHRoYXQgdGhpcyBSQ0IgaXMgcmVjZWl2aW5nCi0JUFZPSUQgICAgICAJCQlwdl9wYWNrZXQ7Ci0JLy8gRGVzY3JpYmVzIHRoZSBsZW5ndGggb2YgdGhlIHBhY2tldCAuCi0JVUlOVCAgICAgICAgICAgICAgICB1aV9wYWNrZXRfbGVuZ3RoOwotCS8vIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGJ1ZmZlciBpbiB0aGUgcGFja2V0IChvbmx5IG9uZSBidWZmZXIgZm9yIFJ4KQotCVBVQ0hBUgkJCQlidWZmZXI7Ci0JYXRvbWljX3QJICAgICAgICBzdGF0dXM7Ci0JVUlOVAkgICAgICAgICAgICBmaWxsZWQ7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotdHlwZWRlZiBzdHJ1Y3QgX0JDTV9DQiBCQ01fQ0IsKlBCQ01fQ0I7Ci0KLXR5cGVkZWYgQkNNX0NCIEJDTV9SQ0IsICpQQkNNX1JDQjsKLXR5cGVkZWYgQkNNX0NCIEJDTV9UQ0IsICpQQkNNX1RDQjsKLQotLyogVGhpcyBpcyB0byBiZSBzdG9yZWQgaW4gdGhlICJwdk9zRGVwRGF0YSIgb2YgQURBUFRFUiAqLwotdHlwZWRlZiBzdHJ1Y3QgTElOVVhfREVQX0RBVEEKLXsKLQlzdHJ1Y3QgbmV0X2RldmljZQkJKnZpcnR1YWxkZXY7CS8qIE91ciBJbnRlcmZhY2UgKHZldGgwKSAqLwotCXN0cnVjdCBuZXRfZGV2aWNlCQkqYWN0dWFsZGV2OwkvKiBUcnVlIEludGVyZmFjZSAoZXRoMCkgKi8KLQlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBuZXRzdGF0czsJLyogTmV0IHN0YXRpc3RpY3MgKi8KLQlzdHJ1Y3QgZmFzeW5jX3N0cnVjdAkqYXN5bmNfcXVldWU7CS8qIEZvciBhc3luY2hyb251cyBub3RpZmljYXRpb24gKi8KLQotfSBMSU5VWF9ERVBfREFUQSwgKlBMSU5VWF9ERVBfREFUQTsKLQotCiBzdHJ1Y3QgX0xFQURFUgogewogCVVTSE9SVCAJVmNpZDsKQEAgLTQyOSwyNiArMzgyLDI4IEBACiBzdHJ1Y3QgX01JTklfQURBUFRFUgogewogCXN0cnVjdCBfTUlOSV9BREFQVEVSICpuZXh0OwotCVBWT0lECQkJICAgIHB2T3NEZXBEYXRhOworCXN0cnVjdCBuZXRfZGV2aWNlCSpkZXY7CisJdTMyCQkJbXNnX2VuYWJsZTsKKwogCUNIQVIgICAgICAgICAgICAgICAgKmNhRHN4UmVxUmVzcDsKLQlhdG9taWNfdAkJCUFwcGxpY2F0aW9uUnVubmluZzsKKwlhdG9taWNfdAkJQXBwbGljYXRpb25SdW5uaW5nOwogCXZvbGF0aWxlIElOVAkJQ3RybFF1ZXVlTGVuOwotCWF0b21pY190ICAgICAgICAgICAgQXBwQ3RybFF1ZXVlTGVuOwotCUJPT0xFQU4gICAgICAgICAgICAgQXBwQ3RybFF1ZXVlT3ZlckZsb3c7Ci0JYXRvbWljX3QJCQlDdXJyZW50QXBwbGljYXRpb25Db3VudDsKLQlhdG9taWNfdCAJCQlSZWdpc3RlcmVkQXBwbGljYXRpb25Db3VudDsKLQlCT09MRUFOCQkJICAgIFRpbWVyQWN0aXZlOwotCVVMT05HCQkJCVN0YXRpc3RpY3NQb2ludGVyOworCWF0b21pY190ICAgICAgICAgICAgCUFwcEN0cmxRdWV1ZUxlbjsKKwlCT09MRUFOICAgICAgICAgICAgIAlBcHBDdHJsUXVldWVPdmVyRmxvdzsKKwlhdG9taWNfdAkJQ3VycmVudEFwcGxpY2F0aW9uQ291bnQ7CisJYXRvbWljX3QgCQlSZWdpc3RlcmVkQXBwbGljYXRpb25Db3VudDsKKwlCT09MRUFOCQkgIAlMaW5rVXBTdGF0dXM7CisJQk9PTEVBTgkJICAgIAlUaW1lckFjdGl2ZTsKKwl1MzIJCQlTdGF0aXN0aWNzUG9pbnRlcjsKIAlzdHJ1Y3Qgc2tfYnVmZgkJKlJ4Q29udHJvbEhlYWQ7CiAJc3RydWN0IHNrX2J1ZmYJCSpSeENvbnRyb2xUYWlsOwotLy8Jc3BpbmxvY2tfdAkJCVJ4Q29udHJvbFF1ZXVlbG9jazsKKwogCXN0cnVjdCBzZW1hcGhvcmUJUnhBcHBDb250cm9sUXVldWVsb2NrOwogCXN0cnVjdCBzZW1hcGhvcmUJZndfZG93bmxvYWRfc2VtYTsKIAogCVBQRVJfVEFSQU5HX0RBVEEgICAgcFRhcmFuZ3M7CiAJc3BpbmxvY2tfdAkJCWNvbnRyb2xfcXVldWVfbG9jazsKIAl3YWl0X3F1ZXVlX2hlYWRfdAlwcm9jZXNzX3JlYWRfd2FpdF9xdWV1ZTsKLQlVTE9ORwkJICAgIAliY21famlmZmllczsJLyogU3RvcmUgSmlmZmllcyB2YWx1ZSAqLwogCiAJLy8gdGhlIHBvaW50ZXIgdG8gdGhlIGZpcnN0IHBhY2tldCB3ZSBoYXZlIHF1ZXVlZCBpbiBzZW5kCiAJLy8gZGVzZXJpYWxpemVkIG1pbmlwb3J0IHN1cHBvcnQgdmFyaWFibGVzCkBAIC00NTgsMjQgKzQxMywxNSBAQAogCS8vIHRoaXMgdG8ga2VlcCB0cmFjayBvZiB0aGUgVHggYW5kIFJ4IE1haWxCb3ggUmVnaXN0ZXJzLgogCWF0b21pY190CQkgICAgQ3Vyck51bUZyZWVUeERlc2M7CiAJLy8gdG8ga2VlcCB0cmFjayB0aGUgbm8gb2YgYnl0ZSByZWNpZXZlZAotCWF0b21pY190CQkJUnhSb2xsT3ZlckNvdW50OwogCVVTSE9SVAkJCQlQcmV2TnVtUmVjdkRlc2NzOwogCVVTSE9SVAkJCQlDdXJyTnVtUmVjdkRlc2NzOwotCWF0b21pY190CQkJR29vZFJ4Qnl0ZUNvdW50OwotCWF0b21pY190CQkJR29vZFJ4UGt0Q291bnQ7Ci0JYXRvbWljX3QJCQlCYWRSeEJ5dGVDb3VudDsKLQlhdG9taWNfdAkJCVJ4UGFja2V0RHJvcHBlZENvdW50OwotCWF0b21pY190CQkJR29vZFR4Qnl0ZUNvdW50OwotCWF0b21pY190CQkJVHhUb3RhbFBhY2tldENvdW50OwotCWF0b21pY190CQkJVHhEcm9wcGVkUGFja2V0Q291bnQ7Ci0JVUxPTkcJCQkgICAJTGlua1VwU3RhdHVzOwotCUJPT0xFQU4JCQkgICAgVHJhbnNmZXJNb2RlOwogCVVJTlQJCQkJdTMyVG90YWxEU0Q7CiAJUGFja2V0SW5mbwkJICAgIFBhY2tJbmZvW05PX09GX1FVRVVFU107CiAJU19DTEFTU0lGSUVSX1JVTEUJYXN0Q2xhc3NpZmllclRhYmxlW01BWF9DTEFTU0lGSUVSU107CisJQk9PTEVBTgkJCSAgICBUcmFuc2Zlck1vZGU7CiAKIAkvKioqKioqKioqKioqKioqIHFvcyAqKioqKioqKioqKioqKioqKiovCi0JVUlOVAkJCQliRVRIQ1NFbmFibGVkOworCUJPT0xFQU4JCQkgICAgYkVUSENTRW5hYmxlZDsKIAogCVVMT05HCQkJICAgIEJFQnVja2V0U2l6ZTsKIAlVTE9ORwkJCSAgICBydFBTQnVja2V0U2l6ZTsKQEAgLTQ4Myw3ICs0MjksNiBAQAogCUJPT0xFQU4JCQkgICAgQXV0b0xpbmtVcDsKIAlCT09MRUFOCQkJICAgIEF1dG9TeW5jdXA7CiAKLQlzdHJ1Y3QgbmV0X2RldmljZQkqZGV2OwogCWludAkJCQltYWpvcjsKIAlpbnQJCQkJbWlub3I7CiAJd2FpdF9xdWV1ZV9oZWFkX3QgCXR4X3BhY2tldF93YWl0X3F1ZXVlOwpAQCAtNDkxLDggKzQzNiw2IEBACiAJYXRvbWljX3QJCQlwcm9jZXNzX3dhaXRpbmc7CiAJQk9PTEVBTiAJCQlmd19kb3dubG9hZF9kb25lOwogCi0JdW5zaWduZWQgaW50CQljdHJscGt0X3ByZXNlbnQ7Ci0JQk9PTEVBTiAJCQlwYWNrZXRzX2dpdmVuX3RvX2FsbDsKIAljaGFyIAkJCQkqdHhjdGxwYWNrZXRbTUFYX0NOVFJMX1BLVFNdOwogCWF0b21pY190CQkJY250cmxwa3RDbnQgOwogCWF0b21pY190CQkJaW5kZXhfYXBwX3JlYWRfY250cmxwa3Q7CkBAIC01MDIsMzQgKzQ0NSwzMCBAQAogCXN0cnVjdCBzZW1hcGhvcmUgCXJkbXdybXN5bmM7CiAKIAlTVFRBUkdFVERTWEJVRkZFUglhc3RUYXJnZXREc3hCdWZmZXJbTUFYX1RBUkdFVF9EU1hfQlVGRkVSU107Ci0JVUxPTkcJCQkJdWxGcmVlVGFyZ2V0QnVmZmVyQ250OworCVVMT05HCQkJdWxGcmVlVGFyZ2V0QnVmZmVyQ250OwogCVVMT05HICAgICAgICAgICAgICAJdWxDdXJyZW50VGFyZ2V0QnVmZmVyOwogCVVMT05HICAgICAgICAgICAgICAJdWxUb3RhbFRhcmdldEJ1ZmZlcnNBdmFpbGFibGU7Ci0JdW5zaWduZWQgaW50CQl0aW1lb3V0OwotCWludCAJCQkJaXJxOworCiAJdW5zaWduZWQgbG9uZyAJCWNoaXBfaWQ7Ci0JdW5zaWduZWQgaW50CQliRmxhc2hCb290OwotCXVuc2lnbmVkIGludCAJCWlmX3VwOwotLy8Jc3BpbmxvY2tfdAkJCXNsZWVwZXJfbG9jazsKLQlhdG9taWNfdAkJCXJkbV93cm1fYWNjZXNzOwotCWF0b21pY190CQkJdHhfcnhfYWNjZXNzOworCiAJd2FpdF9xdWV1ZV9oZWFkX3QgCWxvd3Bvd2VyX21vZGVfd2FpdF9xdWV1ZTsKLQlhdG9taWNfdAkJCWJBYm9ydGVkQnlIb3N0OwotCUJPT0xFQU4JCQkJYkJpbkRvd25sb2FkZWQ7Ci0JQk9PTEVBTgkJCQliQ2ZnRG93bmxvYWRlZDsKLQlVU0hPUlQJCQkJdXNCZXN0RWZmb3J0UXVldWVJbmRleDsKLQlCT09MRUFOCQkJCWJTeW5jVXBSZXF1ZXN0U2VudDsKLS8vCXN0cnVjdCBzZW1hcGhvcmUgCWRhdGFfcGFja2V0X3F1ZXVlX2xvY2s7CisKKwlCT09MRUFOCQkJYkZsYXNoQm9vdDsKKwlCT09MRUFOCQkJYkJpbkRvd25sb2FkZWQ7CisJQk9PTEVBTgkJCWJDZmdEb3dubG9hZGVkOworCUJPT0xFQU4JCQliU3luY1VwUmVxdWVzdFNlbnQ7CisJVVNIT1JUCQkJdXNCZXN0RWZmb3J0UXVldWVJbmRleDsKKwogCXdhaXRfcXVldWVfaGVhZF90IAlpb2N0bF9md19kbmxkX3dhaXRfcXVldWU7CiAJQk9PTEVBTgkJCQl3YWl0aW5nX3RvX2Z3X2Rvd25sb2FkX2RvbmU7CiAJcGlkX3QJCQkJZndfZG93bmxvYWRfcHJvY2Vzc19waWQ7CiAJUFNUQVJHRVRQQVJBTVMJCXBzdGFyZ2V0cGFyYW1zOwogCUJPT0xFQU4JCQkJZGV2aWNlX3JlbW92ZWQ7CiAJQk9PTEVBTgkJCQlEZXZpY2VBY2Nlc3M7Ci0JSU5UCQkJCQlERFJTZXR0aW5nOwotCUJPT0xFQU4JCQkJYkREUkluaXREb25lOwotCVVMT05HCQkJCXVsUG93ZXJTYXZlTW9kZTsKIAlCT09MRUFOCQkJCWJJc0F1dG9Db3JyZWN0RW5hYmxlZDsKKwlCT09MRUFOCQkJCWJERFJJbml0RG9uZTsKKwlJTlQJCQkJRERSU2V0dGluZzsKKwlVTE9ORwkJCQl1bFBvd2VyU2F2ZU1vZGU7CiAJc3BpbmxvY2tfdAkJCXR4dHJhbnNtaXRsb2NrOwogCUJfVUlOVDgJCQkJdHh0cmFuc21pdF9ydW5uaW5nOwogCS8qIFRocmVhZCBmb3IgY29udHJvbCBwYWNrZXQgaGFuZGxpbmcgKi8KQEAgLTU2NywxMyArNTA2LDEzIEBACiAJdW5zaWduZWQgaW50CXVzSWRsZU1vZGVQYXR0ZXJuOwogCS8vQk9PTEVBTgkJCWJUcmllZFRvV2FrZVVwRnJvbVNodXRkb3duOwogCUJPT0xFQU4JCQliTGlua0Rvd25SZXF1ZXN0ZWQ7Ci0JdW5zaWduZWQgaW50CWNoZWNrX2Zvcl9oYW5nOworCiAJaW50IAkJCWRvd25sb2FkRERSOwogCVBIU19ERVZJQ0VfRVhURU5TSU9OIHN0QkNNUGhzQ29udGV4dDsKIAlTX0hEUl9TVVBSRVNTSU9OX0NPTlRFWFRJTkZPCXN0UGhzVHhDb250ZXh0SW5mbzsKIAl1aW50OF90CQkJdWNhUEhTUGt0UmVzdG9yZUJ1ZlsyMDQ4XTsKIAl1aW50OF90CQkJYlBIU0VuYWJsZWQ7Ci0JaW50IAkJCUF1dG9GaXJtRGxkOworCUJPT0xFQU4JCQlBdXRvRmlybURsZDsKIAlCT09MRUFOICAgICAgICAgYk1pcHNDb25maWc7CiAJQk9PTEVBTiAgICAgICAgIGJEUExMQ29uZmlnOwogCVVJTlQzMgkJCWFUeFBrdFNpemVIaXN0W01JQlNfTUFYX0hJU1RfRU5UUklFU107CkBAIC01OTksMTAgKzUzOCw5IEBACiAKIAogCXN0cnVjdCBzZW1hcGhvcmUJTlZNUmRtV3JtTG9jazsKLQlCT09MRUFOCQkJYk5ldHdvcmtJbnRlcmZhY2VSZWdpc3RlcmVkOwotCUJPT0xFQU4JCQliTmV0ZGV2aWNlTm90aWZpZXJSZWdpc3RlcmVkOworCiAJc3RydWN0IGRldmljZSAqcHN0Q3JlYXRlZENsYXNzRGV2aWNlOwotCUJPT0xFQU4JCQliVXNiQ2xhc3NEcml2ZXJSZWdpc3RlcmVkOworCiAvLwlCT09MRUFOCQkJCUludGVyZmFjZVVwU3RhdHVzOwogCVBGTEFTSDJYX0NTX0lORk8gcHNGbGFzaDJ4Q1NJbmZvOwogCVBGTEFTSF9DU19JTkZPIHBzRmxhc2hDU0luZm8gOwpAQCAtNjMwLDE3ICs1NjgsMTMgQEAKIAlzdHJ1Y3Qgc2VtYXBob3JlCUxvd1Bvd2VyTW9kZVN5bmM7CiAJVUxPTkcJbGlEcmFpbkNhbGN1bGF0ZWQ7CiAJVUlOVCBncGlvQml0TWFwOworCiAgICAgU19CQ01fREVCVUdfU1RBVEUgc3REZWJ1Z1N0YXRlOwogCiB9OwogdHlwZWRlZiBzdHJ1Y3QgX01JTklfQURBUFRFUiBNSU5JX0FEQVBURVIsICpQTUlOSV9BREFQVEVSOwogCi0KLXR5cGVkZWYgc3RydWN0IF9ERVZJQ0VfRVhURU5TSU9OCi17Ci0JUE1JTklfQURBUFRFUiBwQWRhcHQ7Ci19REVWSUNFX0VYVEVOU0lPTiwqUERFVklDRV9FWFRFTlNJT047Ci0KKyNkZWZpbmUgR0VUX0JDTV9BREFQVEVSKG5ldF9kZXYpCW5ldGRldl9wcml2KG5ldF9kZXYpCiAKIHN0cnVjdCBfRVRIX0hFQURFUl9TVFJVQyB7CiAgICAgVUNIQVIgICAgICAgYXU4RGVzdGluYXRpb25BZGRyZXNzWzZdOwpAQCAtNjY3LDggKzYwMSw4IEBACiAKIHR5cGVkZWYgc3RydWN0IF9ERFJfU0VUVElORwogewotCVVMT05HIHVsUmVnQWRkcmVzczsKLQlVTE9ORyB1bFJlZ1ZhbHVlOworCVVJTlQgdWxSZWdBZGRyZXNzOworCVVJTlQgdWxSZWdWYWx1ZTsKIH1ERFJfU0VUVElORywgKlBERFJfU0VUVElORzsKIHR5cGVkZWYgRERSX1NFVFRJTkcgRERSX1NFVF9OT0RFLCAqUEREUl9TRVRfTk9ERTsKIElOVApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JjbS9BcnAuYyBiL2RyaXZlcnMvc3RhZ2luZy9iY20vQXJwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2MGQ4NTkuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JjbS9BcnAuYworKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLQotLyoKLSAqIEZpbGUgTmFtZTogQXJwLmMKLSAqIEFic3RyYWN0OiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIHJvdXRpbmVzIGZvciBoYW5kbGluZyBBUlAgUEFDS0VUUwotICovCi0jaW5jbHVkZSAiaGVhZGVycy5oIgotI2RlZmluZQlBUlBfUEtUX1NJWkUJNjAKLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogRnVuY3Rpb24gICAgLSByZXBseV90b19hcnBfcmVxdWVzdCgpCi0gKgotICogRGVzY3JpcHRpb24gLSBXaGVuIHRoaXMgaG9zdCB0cmllcyB0byBicm9hZGNhc3QgQVJQIHJlcXVlc3QgcGFja2V0IHRocm91Z2gKLSAqCQkgCQkgdGhlIHZpcnR1YWwgaW50ZXJmYWNlICh2ZXRoMCksIHJlcGx5IGRpcmVjdGx5IHRvIHVwcGVyIGxheWVyLgotICoJCSAJCSBUaGlzIGZ1bmN0aW9uIGFsbG9jYXRlcyBhIG5ldyBza2IgZm9yIEFSUCByZXBseSBwYWNrZXQsCi0gKgkJIAkJIGZpbGxzIGluIHRoZSBmaWVsZHMgb2YgdGhlIHBhY2tldCBhbmQgdGhlbiBzZW5kcyBpdCB0bwotICoJCSAJCSB1cHBlciBsYXllci4KLSAqCi0gKiBQYXJhbWV0ZXJzICAtIHNrYjoJUG9pbnRlciB0byBza19idWZmIHN0cnVjdHVyZSBvZiB0aGUgQVJQIHJlcXVlc3QgcGt0LgotICoKLSAqIFJldHVybnMgICAgIC0gTm9uZQotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0KLVZPSUQKLXJlcGx5X3RvX2FycF9yZXF1ZXN0KHN0cnVjdCBza19idWZmICpza2IpCi17Ci0JUE1JTklfQURBUFRFUgkJQWRhcHRlcjsKLQlzdHJ1Y3QgQXJwSGVhZGVyIAkqcEFycEhkciA9IE5VTEw7Ci0Jc3RydWN0IGV0aGhkcgkJKnBldGhoZHIgPSBOVUxMOwotCVVDSEFSIAkJCQl1aUlQSGRyWzRdOwotCS8qIENoZWNrIGZvciB2YWxpZCBza2IgKi8KLQlpZihza2IgPT0gTlVMTCkKLQl7Ci0JCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwgIkludmFsaWQgc2tiOiBDYW5ub3QgcmVwbHkgdG8gQVJQIHJlcXVlc3RcbiIpOwotCQlyZXR1cm47Ci0JfQotCi0KLQlBZGFwdGVyID0gR0VUX0JDTV9BREFQVEVSKHNrYi0+ZGV2KTsKLQkvKiBQcmludCB0aGUgQVJQIFJlcXVlc3QgUGFja2V0ICovCi0JQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfVFgsIEFSUF9SRVNQLCBEQkdfTFZMX0FMTCwgIkFSUCBQYWNrZXQgRHVtcCA6Iik7Ci0JQkNNX0RFQlVHX1BSSU5UX0JVRkZFUihBZGFwdGVyLERCR19UWVBFX1RYLCBBUlBfUkVTUCwgREJHX0xWTF9BTEwsIChQVUNIQVIpKHNrYi0+ZGF0YSksIHNrYi0+bGVuKTsKLQotCS8qCi0JICogRXh0cmFjdCB0aGUgRXRoZXJuZXQgSGVhZGVyIGFuZCBBcnAgUGF5bG9hZCBpbmNsdWRpbmcgSGVhZGVyCi0gICAgICovCi0JcGV0aGhkciA9IChzdHJ1Y3QgZXRoaGRyICopc2tiLT5kYXRhOwotCXBBcnBIZHIgID0gKHN0cnVjdCBBcnBIZWFkZXIgKikoc2tiLT5kYXRhK0VUSF9ITEVOKTsKLQotCWlmKEFkYXB0ZXItPmJFVEhDU0VuYWJsZWQpCi0JewotCQlpZihtZW1jbXAocGV0aGhkci0+aF9zb3VyY2UsIEFkYXB0ZXItPmRldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKSkKLQkJewotCQkJYmNtX2tmcmVlX3NrYihza2IpOwotCQkJcmV0dXJuOwotCQl9Ci0JfQotCi0JLy8gU2V0IHRoZSBFdGhlcm5ldCBIZWFkZXIgRmlyc3QuCi0JbWVtY3B5KHBldGhoZHItPmhfZGVzdCwgcGV0aGhkci0+aF9zb3VyY2UsIEVUSF9BTEVOKTsKLQlpZighbWVtY21wKHBldGhoZHItPmhfc291cmNlLCBBZGFwdGVyLT5kZXYtPmRldl9hZGRyLCBFVEhfQUxFTikpCi0JewotCQlwZXRoaGRyLT5oX3NvdXJjZVs1XSsrOwotCX0KLQotCS8qIFNldCB0aGUgcmVwbHkgdG8gQVJQIFJlcGx5ICovCi0JcEFycEhkci0+YXJwLmFyX29wID0gbnRvaHMoQVJQT1BfUkVQTFkpOwotCi0JLyogU2V0IHRoZSBIVyBBZGRyZXNzIHByb3Blcmx5ICovCi0JbWVtY3B5KHBBcnBIZHItPmFyX3NoYSwgcGV0aGhkci0+aF9zb3VyY2UsIEVUSF9BTEVOKTsKLQltZW1jcHkocEFycEhkci0+YXJfdGhhLCBwZXRoaGRyLT5oX2Rlc3QsIEVUSF9BTEVOKTsKLQotCS8vIFN3YXBwaW5nIHRoZSBJUCBBZGRkcmVzcwotCW1lbWNweSh1aUlQSGRyLHBBcnBIZHItPmFyX3NpcCw0KTsKLQltZW1jcHkocEFycEhkci0+YXJfc2lwLHBBcnBIZHItPmFyX3RpcCw0KTsKLQltZW1jcHkocEFycEhkci0+YXJfdGlwLHVpSVBIZHIsNCk7Ci0KLQkvKiBQcmludCB0aGUgQVJQIFJlcGx5IFBhY2tldCAqLwotCi0JQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfVFgsIEFSUF9SRVNQLCBEQkdfTFZMX0FMTCwgIkFSUCBSRVBMWSBQQUNLRVQ6ICIpOwotCi0JLyogU2VuZCB0aGUgUGFja2V0IHRvIHVwcGVyIGxheWVyICovCi0JQkNNX0RFQlVHX1BSSU5UX0JVRkZFUihBZGFwdGVyLERCR19UWVBFX1RYLCBBUlBfUkVTUCwgREJHX0xWTF9BTEwsIChQVUNIQVIpKHNrYi0+ZGF0YSksIHNrYi0+bGVuKTsKLQotCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2Isc2tiLT5kZXYpOwotCXNrYi0+cGt0X3R5cGUgPSBQQUNLRVRfSE9TVDsKLQotLy8Jc2tiLT5tYWMucmF3PXNrYi0+ZGF0YStMRUFERVJfU0laRTsKLQlza2Jfc2V0X21hY19oZWFkZXIgKHNrYiwgTEVBREVSX1NJWkUpOwotCW5ldGlmX3J4KHNrYik7Ci0JQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfVFgsIEFSUF9SRVNQLCBEQkdfTFZMX0FMTCwgIjw9PT09PT09PT09PT09XG4iKTsKLQlyZXR1cm47Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JjbS9CY21jaGFyLmMgYi9kcml2ZXJzL3N0YWdpbmcvYmNtL0JjbWNoYXIuYwppbmRleCBmZWFkOWM1Li4zMTY3NGVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYmNtL0JjbWNoYXIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvYmNtL0JjbWNoYXIuYwpAQCAtMTIsNyArMTIsNyBAQAogKgogKiBSZXR1cm5zCSAgLSBaZXJvKFN1Y2Nlc3MpCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHN0cnVjdCBjbGFzcyAqYmNtX2NsYXNzID0gTlVMTDsKKwogc3RhdGljIGludCBiY21fY2hhcl9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICogZmlscCkKIHsKIAlQTUlOSV9BREFQVEVSIAkJQWRhcHRlciA9IE5VTEw7CkBAIC05Myw3ICs5Myw3IEBACiAgICAgLypTdG9wIFF1ZXVpbmcgdGhlIGNvbnRyb2wgcmVzcG9uc2UgUGFja2V0cyovCiAgICAgYXRvbWljX2RlYygmQWRhcHRlci0+QXBwbGljYXRpb25SdW5uaW5nKTsKIAotICAgIGJjbV9rZnJlZShwVGFyYW5nKTsKKyAgICBrZnJlZShwVGFyYW5nKTsKIAogCS8qIHJlbW92ZSB0aGlzIGZpbHAgZnJvbSB0aGUgYXN5bmNocm9ub3VzbHkgbm90aWZpZWQgZmlscCdzICovCiAgICAgZmlscC0+cHJpdmF0ZV9kYXRhID0gTlVMTDsKQEAgLTEwMiwxMSArMTAyLDExIEBACiAKIHN0YXRpYyBzc2l6ZV90IGJjbV9jaGFyX3JlYWQoc3RydWN0IGZpbGUgKmZpbHAsIGNoYXIgX191c2VyICpidWYsIHNpemVfdCBzaXplLCBsb2ZmX3QgKmZfcG9zKQogewotICAgIFBQRVJfVEFSQU5HX0RBVEEgcFRhcmFuZyA9IChQUEVSX1RBUkFOR19EQVRBKWZpbHAtPnByaXZhdGVfZGF0YTsKKwlQUEVSX1RBUkFOR19EQVRBIHBUYXJhbmcgPSBmaWxwLT5wcml2YXRlX2RhdGE7CiAJUE1JTklfQURBUFRFUglBZGFwdGVyID0gcFRhcmFuZy0+QWRhcHRlcjsKLSAgICBzdHJ1Y3Qgc2tfYnVmZiogUGFja2V0ID0gTlVMTDsKLSAgICBVSU5UICAgICAgICAgICAgUGt0TGVuID0gMDsKLQlpbnQgCQkJd2FpdF9yZXRfdmFsPTA7CisJc3RydWN0IHNrX2J1ZmYqIFBhY2tldCA9IE5VTEw7CisJc3NpemVfdCAgICAgICAgIFBrdExlbiA9IDA7CisJaW50IAkJd2FpdF9yZXRfdmFsPTA7CiAKIAl3YWl0X3JldF92YWwgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoQWRhcHRlci0+cHJvY2Vzc19yZWFkX3dhaXRfcXVldWUsCiAJCShwVGFyYW5nLT5SeEFwcENvbnRyb2xIZWFkIHx8IEFkYXB0ZXItPmRldmljZV9yZW1vdmVkKSk7CkBAIC0xMzksMTQgKzEzOSwxNiBAQAogCWlmKFBhY2tldCkKIAl7CiAJCVBrdExlbiA9IFBhY2tldC0+bGVuOwotCQlpZihjb3B5X3RvX3VzZXIoYnVmLCBQYWNrZXQtPmRhdGEsIFBrdExlbikpCisJCWlmKGNvcHlfdG9fdXNlcihidWYsIFBhY2tldC0+ZGF0YSwgbWluX3Qoc2l6ZV90LCBQa3RMZW4sIHNpemUpKSkKIAkJewotCQkJYmNtX2tmcmVlX3NrYihQYWNrZXQpOworCQkJZGV2X2tmcmVlX3NrYihQYWNrZXQpOwogCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiXG5SZXR1cm5pbmcgZnJvbSBjb3B5IHRvIHVzZXIgZmFpbHVyZSBcbiIpOwogCQkJcmV0dXJuIC1FRkFVTFQ7CiAJCX0KLQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsICJSZWFkICVkIEJ5dGVzIEZyb20gQWRhcHRlciBwYWNrZXQgPSAweCVwIGJ5IHByb2Nlc3MgJWQhXG4iLCBQa3RMZW4sIFBhY2tldCwgY3VycmVudC0+cGlkKTsKLQkJYmNtX2tmcmVlX3NrYihQYWNrZXQpOworCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwKKwkJCQkiUmVhZCAlemQgQnl0ZXMgRnJvbSBBZGFwdGVyIHBhY2tldCA9ICVwIGJ5IHByb2Nlc3MgJWQhXG4iLAorCQkJCVBrdExlbiwgUGFja2V0LCBjdXJyZW50LT5waWQpOworCQlkZXZfa2ZyZWVfc2tiKFBhY2tldCk7CiAJfQogCiAgICAgQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsICI8PT09PVxuIik7CkBAIC0xNTUsMTUgKzE1NywxMiBAQAogCiBzdGF0aWMgbG9uZyBiY21fY2hhcl9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlscCwgVUlOVCBjbWQsIFVMT05HIGFyZykKIHsKLSAgICBQUEVSX1RBUkFOR19EQVRBICBwVGFyYW5nID0gKFBQRVJfVEFSQU5HX0RBVEEpZmlscC0+cHJpdmF0ZV9kYXRhOwotCXZvaWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJncDsKKwlQUEVSX1RBUkFOR19EQVRBICBwVGFyYW5nID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCXZvaWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOwogCVBNSU5JX0FEQVBURVIgCUFkYXB0ZXIgPSBwVGFyYW5nLT5BZGFwdGVyOwogCUlOVCAgCQkJU3RhdHVzID0gU1RBVFVTX0ZBSUxVUkU7Ci0JSU9DVExfQlVGRkVSIAlJb0J1ZmZlcj17fTsKLSNpZm5kZWYgQkNNX1NITV9JTlRFUkZBQ0UKLSAgICBpbnQgdGltZW91dCA9IDA7Ci0jZW5kaWYKLQorCWludCB0aW1lb3V0ID0gMDsKKwlJT0NUTF9CVUZGRVIgCUlvQnVmZmVyOwogCiAJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsICJQYXJhbWV0ZXJzIFBhc3NlZCB0byBjb250cm9sIElPQ1RMIGNtZD0weCVYIGFyZz0weCVsWCIsIGNtZCwgYXJnKTsKIApAQCAtMjA0LDUwICsyMDMsNDEgQEAKIAogCVN0YXR1cyA9IHZlbmRvcmV4dG5Jb2N0bChBZGFwdGVyLCBjbWQsIGFyZyk7CiAJaWYoU3RhdHVzICE9IENPTlRJTlVFX0NPTU1PTl9QQVRIICkKLQl7CiAJCSByZXR1cm4gU3RhdHVzOwotCX0KIAogCXN3aXRjaChjbWQpewogCQkvLyBSZG1zIGZvciBTd2luIElkbGUuLi4KIAkJY2FzZSBJT0NUTF9CQ01fUkVHSVNURVJfUkVBRF9QUklWQVRFOgogCQl7CiAJCQlSRE1fQlVGRkVSICBzUmRtQnVmZmVyID0gezB9OwotCQkJUENIQVIgdGVtcF9idWZmID0gTlVMTDsKLQkJCVVJTlQgQnVmZmxlbiA9IDA7Ci0JCQkvKiBDb3B5IElvY3RsIEJ1ZmZlciBzdHJ1Y3R1cmUgKi8KLQkJCWlmKGNvcHlfZnJvbV91c2VyKChQQ0hBUikmSW9CdWZmZXIsIGFyZ3AsCi0JCQkJc2l6ZW9mKElPQ1RMX0JVRkZFUikpKQotCQkJewotCQkJCVN0YXR1cyA9IC1FRkFVTFQ7Ci0JCQkJYnJlYWs7Ci0JCQl9CisJCQlQQ0hBUiB0ZW1wX2J1ZmY7CisJCQlVSU5UIEJ1ZmZsZW47CiAKKwkJCS8qIENvcHkgSW9jdGwgQnVmZmVyIHN0cnVjdHVyZSAqLworCQkJaWYoY29weV9mcm9tX3VzZXIoJklvQnVmZmVyLCBhcmdwLCBzaXplb2YoSU9DVExfQlVGRkVSKSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJCWlmIChJb0J1ZmZlci5JbnB1dExlbmd0aCA+IHNpemVvZihzUmRtQnVmZmVyKSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKworCQkJaWYoY29weV9mcm9tX3VzZXIoJnNSZG1CdWZmZXIsIElvQnVmZmVyLklucHV0QnVmZmVyLCBJb0J1ZmZlci5JbnB1dExlbmd0aCkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJCS8qIEZJWE1FOiBuZWVkIHRvIHJlc3RyaWN0IEJ1ZmZMZW4gKi8KIAkJCUJ1ZmZsZW4gPSBJb0J1ZmZlci5PdXRwdXRMZW5ndGggKyAoNCAtIElvQnVmZmVyLk91dHB1dExlbmd0aCU0KSU0OwotCQkJdGVtcF9idWZmID0gKFBDSEFSKWttYWxsb2MoQnVmZmxlbiwgR0ZQX0tFUk5FTCk7CisJCQl0ZW1wX2J1ZmYgPSBrbWFsbG9jKEJ1ZmZsZW4sIEdGUF9LRVJORUwpOwogCQkJaWYoIXRlbXBfYnVmZikKLQkJCXsKLQkJCQlyZXR1cm4gU1RBVFVTX0ZBSUxVUkU7Ci0JCQl9Ci0JCQlpZihjb3B5X2Zyb21fdXNlcigmc1JkbUJ1ZmZlciwgSW9CdWZmZXIuSW5wdXRCdWZmZXIsCi0JCQkJSW9CdWZmZXIuSW5wdXRMZW5ndGgpKQotCQkJewotCQkJCVN0YXR1cyA9IC1FRkFVTFQ7Ci0JCQkJYnJlYWs7Ci0JCQl9CisJCQkJcmV0dXJuIC1FTk9NRU07CisKIAkJCVN0YXR1cyA9IHJkbWFsdChBZGFwdGVyLCAoVUlOVClzUmRtQnVmZmVyLlJlZ2lzdGVyLAogCQkJCQkoUFVJTlQpdGVtcF9idWZmLCBCdWZmbGVuKTsKLQkJCWlmKFN0YXR1cyAhPSBTVEFUVVNfU1VDQ0VTUykKKwkJCWlmKFN0YXR1cyA9PSBTVEFUVVNfU1VDQ0VTUykKIAkJCXsKLQkJCQliY21fa2ZyZWUodGVtcF9idWZmKTsKLQkJCQlyZXR1cm4gU3RhdHVzOworCQkJCWlmKGNvcHlfdG9fdXNlcihJb0J1ZmZlci5PdXRwdXRCdWZmZXIsIHRlbXBfYnVmZiwgSW9CdWZmZXIuT3V0cHV0TGVuZ3RoKSkKKwkJCQkJU3RhdHVzID0gLUVGQVVMVDsKIAkJCX0KLQkJCWlmKGNvcHlfdG9fdXNlcihJb0J1ZmZlci5PdXRwdXRCdWZmZXIsCi0JCQkJKFBDSEFSKXRlbXBfYnVmZiwgKFVJTlQpSW9CdWZmZXIuT3V0cHV0TGVuZ3RoKSkKLQkJCXsKLQkJCQlTdGF0dXMgPSAtRUZBVUxUOwotCQkJfQotCQkJYmNtX2tmcmVlKHRlbXBfYnVmZik7CisKKwkJCWtmcmVlKHRlbXBfYnVmZik7CiAJCQlicmVhazsKIAkJfQogCQljYXNlIElPQ1RMX0JDTV9SRUdJU1RFUl9XUklURV9QUklWQVRFOgpAQCAtMjU2LDE5ICsyNDYsMTYgQEAKIAkJCVVJTlQgdWlUZW1wVmFyPTA7CiAJCQkvKiBDb3B5IElvY3RsIEJ1ZmZlciBzdHJ1Y3R1cmUgKi8KIAotCQkJaWYoY29weV9mcm9tX3VzZXIoJklvQnVmZmVyLCBhcmdwLAotCQkJCXNpemVvZihJT0NUTF9CVUZGRVIpKSkKLQkJCXsKLQkJCQlTdGF0dXMgPSAtRUZBVUxUOwotCQkJCWJyZWFrOwotCQkJfQorCQkJaWYoY29weV9mcm9tX3VzZXIoJklvQnVmZmVyLCBhcmdwLCBzaXplb2YoSU9DVExfQlVGRkVSKSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJCWlmIChJb0J1ZmZlci5JbnB1dExlbmd0aCA+IHNpemVvZihzV3JtQnVmZmVyKSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwogCQkJLyogR2V0IFdybUJ1ZmZlciBzdHJ1Y3R1cmUgKi8KLQkJCWlmKGNvcHlfZnJvbV91c2VyKCZzV3JtQnVmZmVyLCBJb0J1ZmZlci5JbnB1dEJ1ZmZlciwKLQkJCQlJb0J1ZmZlci5JbnB1dExlbmd0aCkpCi0JCQl7Ci0JCQkJU3RhdHVzID0gLUVGQVVMVDsKLQkJCQlicmVhazsKLQkJCX0KKwkJCWlmKGNvcHlfZnJvbV91c2VyKCZzV3JtQnVmZmVyLCBJb0J1ZmZlci5JbnB1dEJ1ZmZlciwgSW9CdWZmZXIuSW5wdXRMZW5ndGgpKQorCQkJCXJldHVybiAtRUZBVUxUOworCiAJCQl1aVRlbXBWYXIgPSBzV3JtQnVmZmVyLlJlZ2lzdGVyICYgRUVQUk9NX1JFSkVDVF9NQVNLOwogCQkJaWYoISgoQWRhcHRlci0+cHN0YXJnZXRwYXJhbXMtPm1fdTMyQ3VzdG9taXplKSAmIFZTR19NT0RFKSAmJgogCQkJIAkoKHVpVGVtcFZhciA9PSBFRVBST01fUkVKRUNUX1JFR18xKXx8CkBAIC0yNzcsOCArMjY0LDcgQEAKIAkJCQkodWlUZW1wVmFyID09IEVFUFJPTV9SRUpFQ1RfUkVHXzQpKSkKIAkJCXsKIAkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsICJFRVBST00gQWNjZXNzIERlbmllZCwgbm90IGluIFZTRyBNb2RlXG4iKTsKLQkJCQlTdGF0dXMgPSAtRUZBVUxUOwotCQkJCWJyZWFrOworCQkJCXJldHVybiAtRUZBVUxUOwogCQkJfQogCQkJU3RhdHVzID0gd3JtYWx0KEFkYXB0ZXIsIChVSU5UKXNXcm1CdWZmZXIuUmVnaXN0ZXIsCiAJCQkJCQkoUFVJTlQpc1dybUJ1ZmZlci5EYXRhLCBzaXplb2YoVUxPTkcpKTsKQEAgLTMwNSw1NiArMjkxLDM5IEBACiAJCQkJKEFkYXB0ZXItPmJQcmVwYXJpbmdGb3JMb3dQb3dlck1vZGUgPT1UUlVFKSkKIAkJCXsKIAkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsICJEZXZpY2UgaW4gSWRsZSBNb2RlLCBCbG9ja2luZyBSZG1zXG4iKTsKLQkJCQlTdGF0dXMgPSAtRUFDQ0VTOwotCQkJCWJyZWFrOworCQkJCXJldHVybiAtRUFDQ0VTOwogCQkJfQogCQkJLyogQ29weSBJb2N0bCBCdWZmZXIgc3RydWN0dXJlICovCi0JCQlpZihjb3B5X2Zyb21fdXNlcigmSW9CdWZmZXIsIGFyZ3AsCi0JCQkJc2l6ZW9mKElPQ1RMX0JVRkZFUikpKQotCQkJewotCQkJCVN0YXR1cyA9IC1FRkFVTFQ7Ci0JCQkJYnJlYWs7Ci0JCQl9CisJCQlpZihjb3B5X2Zyb21fdXNlcigmSW9CdWZmZXIsIGFyZ3AsIHNpemVvZihJT0NUTF9CVUZGRVIpKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKIAotCQkJdGVtcF9idWZmID0gKFBDSEFSKWttYWxsb2MoSW9CdWZmZXIuT3V0cHV0TGVuZ3RoLCBHRlBfS0VSTkVMKTsKKwkJCWlmIChJb0J1ZmZlci5JbnB1dExlbmd0aCA+IHNpemVvZihzUmRtQnVmZmVyKSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKworCQkJaWYoY29weV9mcm9tX3VzZXIoJnNSZG1CdWZmZXIsIElvQnVmZmVyLklucHV0QnVmZmVyLCBJb0J1ZmZlci5JbnB1dExlbmd0aCkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJCS8qIEZJWE1FOiBkb24ndCB0cnVzdCB1c2VyIHN1cHBsaWVkIGxlbmd0aCAqLworCQkJdGVtcF9idWZmID0ga21hbGxvYyhJb0J1ZmZlci5PdXRwdXRMZW5ndGgsIEdGUF9LRVJORUwpOwogCQkJaWYoIXRlbXBfYnVmZikKLQkJCXsKIAkJCQlyZXR1cm4gU1RBVFVTX0ZBSUxVUkU7Ci0JCQl9Ci0JCQlpZihjb3B5X2Zyb21fdXNlcigmc1JkbUJ1ZmZlciwgSW9CdWZmZXIuSW5wdXRCdWZmZXIsCi0JCQkJSW9CdWZmZXIuSW5wdXRMZW5ndGgpKQotCQkJewotCQkJCVN0YXR1cyA9IC1FRkFVTFQ7Ci0JCQkJYnJlYWs7Ci0JCQl9CiAKLQkJCWlmKAotI2lmICFkZWZpbmVkKEJDTV9TSE1fSU5URVJGQUNFKQotCQkJCSgoKFVMT05HKXNSZG1CdWZmZXIuUmVnaXN0ZXIgJiAweDBGMDAwMDAwKSAhPSAweDBGMDAwMDAwKSB8fAotI2VuZGlmCi0JCQkJCSgoVUxPTkcpc1JkbUJ1ZmZlci5SZWdpc3RlciAmIDB4MykKLQkJCSAgKQorCQkJaWYoKCgoVUxPTkcpc1JkbUJ1ZmZlci5SZWdpc3RlciAmIDB4MEYwMDAwMDApICE9IDB4MEYwMDAwMDApIHx8CisJCQkgICAoKFVMT05HKXNSZG1CdWZmZXIuUmVnaXN0ZXIgJiAweDMpKQogCQkJewogCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwgIlJETSBEb25lIE9uIGludmFsaWQgQWRkcmVzcyA6ICV4IEFjY2VzcyBEZW5pZWQuXG4iLAogCQkJCQkoaW50KXNSZG1CdWZmZXIuUmVnaXN0ZXIpOwotCQkJCVN0YXR1cyA9IC1FSU5WQUw7Ci0JCQkJYnJlYWs7CisJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCQl9CiAKIAkJCXVpVGVtcFZhciA9IHNSZG1CdWZmZXIuUmVnaXN0ZXIgJiBFRVBST01fUkVKRUNUX01BU0s7CiAJCQlTdGF0dXMgPSByZG1hbHRXaXRoTG9jayhBZGFwdGVyLCAoVUlOVClzUmRtQnVmZmVyLlJlZ2lzdGVyLAogCQkJCQkJKFBVSU5UKXRlbXBfYnVmZiwgSW9CdWZmZXIuT3V0cHV0TGVuZ3RoKTsKLQkJCWlmKFN0YXR1cyAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJCXsKLQkJCQliY21fa2ZyZWUodGVtcF9idWZmKTsKLQkJCQlyZXR1cm4gU3RhdHVzOwotCQkJfQotCQkJaWYoY29weV90b191c2VyKElvQnVmZmVyLk91dHB1dEJ1ZmZlciwKLQkJCQkoUENIQVIpdGVtcF9idWZmLCAoVUlOVClJb0J1ZmZlci5PdXRwdXRMZW5ndGgpKQotCQkJewotCQkJCVN0YXR1cyA9IC1FRkFVTFQ7Ci0JCQl9Ci0JCQliY21fa2ZyZWUodGVtcF9idWZmKTsKKwkJCWlmKFN0YXR1cyA9PSBTVEFUVVNfU1VDQ0VTUykKKwkJCQlpZihjb3B5X3RvX3VzZXIoSW9CdWZmZXIuT3V0cHV0QnVmZmVyLCB0ZW1wX2J1ZmYsIElvQnVmZmVyLk91dHB1dExlbmd0aCkpCisJCQkJCVN0YXR1cyA9IC1FRkFVTFQ7CisKKwkJCWtmcmVlKHRlbXBfYnVmZik7CiAJCQlicmVhazsKIAkJfQogCQljYXNlIElPQ1RMX0JDTV9SRUdJU1RFUl9XUklURToKQEAgLTM2NywzNiArMzM2LDI4IEBACiAJCQkJKEFkYXB0ZXItPmJQcmVwYXJpbmdGb3JMb3dQb3dlck1vZGUgPT1UUlVFKSkKIAkJCXsKIAkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsICJEZXZpY2UgaW4gSWRsZSBNb2RlLCBCbG9ja2luZyBXcm1zXG4iKTsKLQkJCQlTdGF0dXMgPSAtRUFDQ0VTOwotCQkJCWJyZWFrOworCQkJCXJldHVybiAtRUFDQ0VTOwogCQkJfQotCQkJLyogQ29weSBJb2N0bCBCdWZmZXIgc3RydWN0dXJlICovCi0JCQlpZihjb3B5X2Zyb21fdXNlcigoUENIQVIpJklvQnVmZmVyLCBhcmdwLAotCQkJCQlzaXplb2YoSU9DVExfQlVGRkVSKSkpCi0JCQl7Ci0JCQkJU3RhdHVzID0gLUVGQVVMVDsKLQkJCQlicmVhazsKLQkJCX0KLQkJCS8qIEdldCBXcm1CdWZmZXIgc3RydWN0dXJlICovCi0JCQlpZihjb3B5X2Zyb21fdXNlcigmc1dybUJ1ZmZlciwgSW9CdWZmZXIuSW5wdXRCdWZmZXIsCi0JCQkJSW9CdWZmZXIuSW5wdXRMZW5ndGgpKQotCQkJewotCQkJCVN0YXR1cyA9IC1FRkFVTFQ7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZigKLSNpZiAhZGVmaW5lZChCQ01fU0hNX0lOVEVSRkFDRSkKIAotCQkJCSgoKFVMT05HKXNXcm1CdWZmZXIuUmVnaXN0ZXIgJiAweDBGMDAwMDAwKSAhPSAweDBGMDAwMDAwKSB8fAotI2VuZGlmCi0JCQkJCSgoVUxPTkcpc1dybUJ1ZmZlci5SZWdpc3RlciAmIDB4MykKLQkJCSApCisJCQkvKiBDb3B5IElvY3RsIEJ1ZmZlciBzdHJ1Y3R1cmUgKi8KKwkJCWlmKGNvcHlfZnJvbV91c2VyKCZJb0J1ZmZlciwgYXJncCwgc2l6ZW9mKElPQ1RMX0JVRkZFUikpKQorCQkJCXJldHVybiAtRUZBVUxUOworCisJCQlpZiAoSW9CdWZmZXIuSW5wdXRMZW5ndGggPiBzaXplb2Yoc1dybUJ1ZmZlcikpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJCS8qIEdldCBXcm1CdWZmZXIgc3RydWN0dXJlICovCisJCQlpZihjb3B5X2Zyb21fdXNlcigmc1dybUJ1ZmZlciwgSW9CdWZmZXIuSW5wdXRCdWZmZXIsIElvQnVmZmVyLklucHV0TGVuZ3RoKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKworCQkJaWYoICgoKFVMT05HKXNXcm1CdWZmZXIuUmVnaXN0ZXIgJiAweDBGMDAwMDAwKSAhPSAweDBGMDAwMDAwKSB8fAorCQkJCQkoKFVMT05HKXNXcm1CdWZmZXIuUmVnaXN0ZXIgJiAweDMpICkKIAkJCXsKIAkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsICJXUk0gRG9uZSBPbiBpbnZhbGlkIEFkZHJlc3MgOiAleCBBY2Nlc3MgRGVuaWVkLlxuIiwKIAkJCQkJCShpbnQpc1dybUJ1ZmZlci5SZWdpc3Rlcik7Ci0JCQkJU3RhdHVzID0gLUVJTlZBTDsKLQkJCQlicmVhazsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKIAkJCX0KKwogCQkJdWlUZW1wVmFyID0gc1dybUJ1ZmZlci5SZWdpc3RlciAmIEVFUFJPTV9SRUpFQ1RfTUFTSzsKIAkJCWlmKCEoKEFkYXB0ZXItPnBzdGFyZ2V0cGFyYW1zLT5tX3UzMkN1c3RvbWl6ZSkgJiBWU0dfTU9ERSkgJiYKIAkJCQkoKHVpVGVtcFZhciA9PSBFRVBST01fUkVKRUNUX1JFR18xKXx8CkBAIC00MDYsOCArMzY3LDcgQEAKIAkJCQkoY21kID09IElPQ1RMX0JDTV9SRUdJU1RFUl9XUklURSkpCiAJCQl7CiAJCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiRUVQUk9NIEFjY2VzcyBEZW5pZWQsIG5vdCBpbiBWU0cgTW9kZVxuIik7Ci0JCQkJU3RhdHVzID0gLUVGQVVMVDsKLQkJCQlicmVhazsKKwkJCQlyZXR1cm4gLUVGQVVMVDsKIAkJCX0KIAogCQkJU3RhdHVzID0gd3JtYWx0V2l0aExvY2soQWRhcHRlciwgKFVJTlQpc1dybUJ1ZmZlci5SZWdpc3RlciwKQEAgLTQzNiwxOSArMzk2LDE0IEBACiAJCQkJKEFkYXB0ZXItPmJQcmVwYXJpbmdGb3JMb3dQb3dlck1vZGUgPT1UUlVFKSkKIAkJCXsKIAkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwiR1BJTyBDYW4ndCBiZSBzZXQvY2xlYXIgaW4gTG93IHBvd2VyIE1vZGUiKTsKLQkJCQlTdGF0dXMgPSAtRUFDQ0VTOwotCQkJCWJyZWFrOworCQkJCXJldHVybiAtRUFDQ0VTOwogCQkJfQogCQkJaWYoY29weV9mcm9tX3VzZXIoJklvQnVmZmVyLCBhcmdwLCBzaXplb2YoSU9DVExfQlVGRkVSKSkpCi0JCQl7Ci0JCQkJU3RhdHVzID0gLUVGQVVMVDsKLQkJCQlicmVhazsKLQkJICAgIH0KKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCWlmIChJb0J1ZmZlci5JbnB1dExlbmd0aCA+IHNpemVvZihncGlvX2luZm8pKQorCQkJCXJldHVybiAtRUlOVkFMOwogCQkJaWYoY29weV9mcm9tX3VzZXIoJmdwaW9faW5mbywgSW9CdWZmZXIuSW5wdXRCdWZmZXIsIElvQnVmZmVyLklucHV0TGVuZ3RoKSkKLQkJCXsKLQkJCQlTdGF0dXMgPSAtRUZBVUxUOwotCQkJCWJyZWFrOwotCQkJfQorCQkJCXJldHVybiAtRUZBVUxUOwogCQkJdWlCaXQgID0gZ3Bpb19pbmZvLnVpR3Bpb051bWJlcjsKIAkJCXVpT3BlcmF0aW9uID0gZ3Bpb19pbmZvLnVpR3Bpb1ZhbHVlOwogCkBAIC01MTcsOCArNDcyLDcgQEAKIAkJYnJlYWs7CiAJCWNhc2UgQkNNX0xFRF9USFJFQURfU1RBVEVfQ0hBTkdFX1JFUToKIAkJewotCi0JCQlVU0VSX1RIUkVBRF9SRVEgdGhyZWFkUmVxID0gezB9OworCQkJVVNFUl9USFJFQURfUkVRIHRocmVhZFJlcSA9IHsgMCB9OwogCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsIlVzZXIgbWFkZSBMRUQgdGhyZWFkIEluQWN0aXZlIik7CiAKIAkJCWlmKChBZGFwdGVyLT5JZGxlTW9kZSA9PSBUUlVFKSB8fApAQCAtNTI5LDIxICs0ODMsMTYgQEAKIAkJCQlTdGF0dXMgPSAtRUFDQ0VTOwogCQkJCWJyZWFrOwogCQkJfQotCQkJU3RhdHVzID1jb3B5X2Zyb21fdXNlcigmSW9CdWZmZXIsIGFyZ3AsIHNpemVvZihJT0NUTF9CVUZGRVIpKTsKLQkJCWlmKFN0YXR1cykKLQkJCXsKLQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsIkZhaWxlZCB3aGlsZSBjb3B5aW5nIHRoZSBJT0J1ZmVyIGZyb20gdXNlciBzcGFjZSBlcnI6JWQiLFN0YXR1cyk7Ci0JCQkJU3RhdHVzID0gLUVGQVVMVDsKLQkJCQlicmVhazsKLQkJCX0KIAotCQkJU3RhdHVzPSBjb3B5X2Zyb21fdXNlcigmdGhyZWFkUmVxLCBJb0J1ZmZlci5JbnB1dEJ1ZmZlciwgSW9CdWZmZXIuSW5wdXRMZW5ndGgpOwotCQkJaWYoU3RhdHVzKQotCQkJewotCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwiRmFpbGVkIHdoaWxlIGNvcHlpbmcgdGhlIElucHV0QnVmZmVyIGZyb20gdXNlciBzcGFjZSBlcnI6JWQiLFN0YXR1cyk7Ci0JCQkJU3RhdHVzID0gLUVGQVVMVDsKLQkJCQlicmVhazsKLQkJCX0KKwkJCWlmIChjb3B5X2Zyb21fdXNlcigmSW9CdWZmZXIsIGFyZ3AsIHNpemVvZihJT0NUTF9CVUZGRVIpKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKworCQkJaWYgKElvQnVmZmVyLklucHV0TGVuZ3RoID4gc2l6ZW9mKHRocmVhZFJlcSkpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJCWlmIChjb3B5X2Zyb21fdXNlcigmdGhyZWFkUmVxLCBJb0J1ZmZlci5JbnB1dEJ1ZmZlciwgSW9CdWZmZXIuSW5wdXRMZW5ndGgpKQorCQkJCXJldHVybiAtRUZBVUxUOworCiAJCQkvL2lmIExFRCB0aHJlYWQgaXMgcnVubmluZyhBY3RpdmVseSBvciBJbmFjdGl2ZWx5KSBzZXQgaXQgc3RhdGUgdG8gbWFrZSBpbmFjdGl2ZQogCQkJaWYoQWRhcHRlci0+TEVESW5mby5sZWRfdGhyZWFkX3J1bm5pbmcpCiAJCQl7CkBAIC01NzIsMTkgKzUyMSwxMyBAQAogCQkJaWYoKEFkYXB0ZXItPklkbGVNb2RlID09IFRSVUUpIHx8CiAJCQkJKEFkYXB0ZXItPmJTaHV0U3RhdHVzID09VFJVRSkgfHwKIAkJCQkoQWRhcHRlci0+YlByZXBhcmluZ0Zvckxvd1Bvd2VyTW9kZSA9PVRSVUUpKQotCQkJewotCQkJCVN0YXR1cyA9IC1FQUNDRVM7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZihjb3B5X2Zyb21fdXNlcigoUENIQVIpJklvQnVmZmVyLCBhcmdwLCBzaXplb2YoSU9DVExfQlVGRkVSKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIAlTdGF0dXMgPSAtRUZBVUxUOwotICAgICAgICAgICAgICAgICAgICAJCWJyZWFrOwotICAgICAgICAgICAgICAgIAl9Ci0gICAgICAgICAgICAgICAgaWYoY29weV9mcm9tX3VzZXIoJmdwaW9faW5mbywgSW9CdWZmZXIuSW5wdXRCdWZmZXIsIElvQnVmZmVyLklucHV0TGVuZ3RoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KKwkJCQlyZXR1cm4gLUVBQ0NFUzsKKwkJCWlmKGNvcHlfZnJvbV91c2VyKCZJb0J1ZmZlciwgYXJncCwgc2l6ZW9mKElPQ1RMX0JVRkZFUikpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJaWYgKElvQnVmZmVyLklucHV0TGVuZ3RoID4gc2l6ZW9mKGdwaW9faW5mbykpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlpZihjb3B5X2Zyb21fdXNlcigmZ3Bpb19pbmZvLCBJb0J1ZmZlci5JbnB1dEJ1ZmZlciwgSW9CdWZmZXIuSW5wdXRMZW5ndGgpKQorCQkJCXJldHVybiAtRUZBVUxUOwogICAgICAgICAgICAgICAgIHVpQml0ICA9IGdwaW9faW5mby51aUdwaW9OdW1iZXI7CiAJCQkJICAvL1NldCB0aGUgZ3BpbyBvdXRwdXQgcmVnaXN0ZXIKIAkJCQlTdGF0dXMgPSByZG1hbHRXaXRoTG9jayhBZGFwdGVyLCAoVUlOVClHUElPX1BJTl9TVEFURV9SRUdJU1RFUiwKQEAgLTYwOCwyNSArNTUxLDE0IEBACiAJCQkJaWYoKEFkYXB0ZXItPklkbGVNb2RlID09IFRSVUUpIHx8CiAJCQkJKEFkYXB0ZXItPmJTaHV0U3RhdHVzID09VFJVRSkgfHwKIAkJCQkoQWRhcHRlci0+YlByZXBhcmluZ0Zvckxvd1Bvd2VyTW9kZSA9PVRSVUUpKQotCQkJCXsKLQkJCQkJU3RhdHVzID0gLUVJTlZBTDsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCAoUENIQVIpJklvQnVmZmVyLCBhcmdwLCBzaXplb2YoIElPQ1RMX0JVRkZFUikpOwotCQkJCWlmKFN0YXR1cykKLQkJCQl7Ci0JCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwiRmFpbGVkIHdoaWxlIGNvcHlpbmcgdGhlIElPQnVmZXIgZnJvbSB1c2VyIHNwYWNlIGVycjolZCIsU3RhdHVzKTsKLQkJCQkJU3RhdHVzID0gLUVGQVVMVDsKLQkJCQkJYnJlYWs7Ci0JCQkJfQorCQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCQlpZiAoY29weV9mcm9tX3VzZXIoJklvQnVmZmVyLCBhcmdwLCBzaXplb2YoSU9DVExfQlVGRkVSKSkpCisJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCWlmIChJb0J1ZmZlci5JbnB1dExlbmd0aCA+IHNpemVvZihncGlvX211bHRpX2luZm8pKQorCQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCQlpZiAoY29weV9mcm9tX3VzZXIoJmdwaW9fbXVsdGlfaW5mbywgSW9CdWZmZXIuSW5wdXRCdWZmZXIsIElvQnVmZmVyLklucHV0TGVuZ3RoKSkKKwkJCQkJcmV0dXJuIC1FRkFVTFQ7CiAKLQkJCQlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlciggJmdwaW9fbXVsdGlfaW5mbywgSW9CdWZmZXIuSW5wdXRCdWZmZXIsIElvQnVmZmVyLklucHV0TGVuZ3RoKTsKLQkJCQlpZihTdGF0dXMpCi0JCQkJewotCQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsIkZhaWxlZCB3aGlsZSBjb3B5aW5nIHRoZSBJT0J1ZmVyIENvbnRlbnRzIGZyb20gdXNlciBzcGFjZSBlcnI6JWQiLFN0YXR1cyk7Ci0JCQkJCVN0YXR1cyA9IC1FRkFVTFQ7Ci0JCQkJCWJyZWFrOwotCQkJCX0KIAkJCQlpZihJc1JlcUdwaW9Jc0xlZEluTlZNKEFkYXB0ZXIscGdwaW9fbXVsdGlfaW5mb1tXSU1BWF9JRFhdLnVpR1BJT01hc2spPT0gRkFMU0UpCiAJCQkJewogCQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwgIlNvcnJ5LCBSZXF1ZXN0ZWQgR1BJTzwweCVYPiBpcyBub3QgY29ycmVzcG9uZCB0byBOVk0gTEVEIGJpdCBtYXA8MHglWD4hISEiLHBncGlvX211bHRpX2luZm9bV0lNQVhfSURYXS51aUdQSU9NYXNrLEFkYXB0ZXItPmdwaW9CaXRNYXApOwpAQCAtNjg2LDcgKzYxOCw2IEBACiAJCQkJaWYoU3RhdHVzKQogCQkJCXsKIAkJCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCJGYWlsZWQgd2hpbGUgY29weWluZyBDb250ZW50IHRvIElPQnVmZXIgZm9yIHVzZXIgc3BhY2UgZXJyOiVkIixTdGF0dXMpOwotCQkJCQlTdGF0dXMgPSAtRUZBVUxUOwogCQkJCQlicmVhazsKIAkJCQl9CiAJCQl9CkBAIC03MDAsMjUgKzYzMSwxNCBAQAogCQkJaWYoKEFkYXB0ZXItPklkbGVNb2RlID09IFRSVUUpIHx8CiAJCQkJKEFkYXB0ZXItPmJTaHV0U3RhdHVzID09VFJVRSkgfHwKIAkJCQkoQWRhcHRlci0+YlByZXBhcmluZ0Zvckxvd1Bvd2VyTW9kZSA9PVRSVUUpKQotCQkJewotCQkJCQlTdGF0dXMgPSAtRUlOVkFMOwotCQkJCQlicmVhazsKLQkJCX0KLQkJCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZJb0J1ZmZlciwgYXJncCwgc2l6ZW9mKCBJT0NUTF9CVUZGRVIpKTsKLQkJCWlmKFN0YXR1cykKLQkJCXsKLQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsIkZhaWxlZCB3aGlsZSBjb3B5aW5nIHRoZSBJT0J1ZmVyIGZyb20gdXNlciBzcGFjZSBlcnI6JWQiLFN0YXR1cyk7Ci0JCQkJU3RhdHVzID0gLUVGQVVMVDsKLQkJCQlicmVhazsKLQkJCX0KKwkJCQkJcmV0dXJuIC1FSU5WQUw7CiAKLQkJCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCAmZ3Bpb19tdWx0aV9tb2RlLCBJb0J1ZmZlci5JbnB1dEJ1ZmZlciwgSW9CdWZmZXIuSW5wdXRMZW5ndGgpOwotCQkJaWYoU3RhdHVzKQotCQkJewotCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwiRmFpbGVkIHdoaWxlIGNvcHlpbmcgdGhlIElPQnVmZXIgQ29udGVudHMgZnJvbSB1c2VyIHNwYWNlIGVycjolZCIsU3RhdHVzKTsKLQkJCQlTdGF0dXMgPSAtRUZBVUxUOwotCQkJCWJyZWFrOwotCQkJfQorCQkJaWYgKGNvcHlfZnJvbV91c2VyKCZJb0J1ZmZlciwgYXJncCwgc2l6ZW9mKElPQ1RMX0JVRkZFUikpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJaWYgKElvQnVmZmVyLklucHV0TGVuZ3RoID4gc2l6ZW9mKGdwaW9fbXVsdGlfbW9kZSkpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlpZiAoY29weV9mcm9tX3VzZXIoJmdwaW9fbXVsdGlfbW9kZSwgSW9CdWZmZXIuSW5wdXRCdWZmZXIsIElvQnVmZmVyLklucHV0TGVuZ3RoKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKIAogCQkJU3RhdHVzID0gcmRtYWx0V2l0aExvY2soIEFkYXB0ZXIsICggVUlOVCkgR1BJT19NT0RFX1JFR0lTVEVSLCAoIFBVSU5UKSB1Y1Jlc2V0VmFsdWUsIHNpemVvZiggVUlOVCkpOwogCQkJaWYoIFNUQVRVU19TVUNDRVNTICE9IFN0YXR1cykKQEAgLTc2OSw3ICs2ODksNiBAQAogCQkJaWYoU3RhdHVzKQogCQkJewogCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwiRmFpbGVkIHdoaWxlIGNvcHlpbmcgQ29udGVudCB0byBJT0J1ZmVyIGZvciB1c2VyIHNwYWNlIGVycjolZCIsU3RhdHVzKTsKLQkJCQlTdGF0dXMgPSAtRUZBVUxUOwogCQkJCWJyZWFrOwogCQkJfQogCQl9CkBAIC03ODMsMjQgKzcwMiwyMCBAQAogCQljYXNlIElPQ1RMX0lETEVfUkVROgogCQl7CiAJCQlQVk9JRCBwdkJ1ZmZlcj1OVUxMOwotCQkJLyogQ29weSBJb2N0bCBCdWZmZXIgc3RydWN0dXJlICovCi0JCQlpZihjb3B5X2Zyb21fdXNlcigmSW9CdWZmZXIsIGFyZ3AsCi0JCQkJCQkJc2l6ZW9mKElPQ1RMX0JVRkZFUikpKQotCQkJewotCQkJCVN0YXR1cyA9IC1FRkFVTFQ7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlwdkJ1ZmZlcj1rbWFsbG9jKElvQnVmZmVyLklucHV0TGVuZ3RoLCBHRlBfS0VSTkVMKTsKLQkJCWlmKCFwdkJ1ZmZlcikKLQkJCXsKLQkJCQlyZXR1cm4gLUVOT01FTTsKLQkJCX0KIAotCQkJaWYoY29weV9mcm9tX3VzZXIocHZCdWZmZXIsIElvQnVmZmVyLklucHV0QnVmZmVyLAotCQkJCQlJb0J1ZmZlci5JbnB1dExlbmd0aCkpCisJCQkvKiBDb3B5IElvY3RsIEJ1ZmZlciBzdHJ1Y3R1cmUgKi8KKwkJCWlmKGNvcHlfZnJvbV91c2VyKCZJb0J1ZmZlciwgYXJncCwgc2l6ZW9mKElPQ1RMX0JVRkZFUikpKQorCQkJCXJldHVybiAtRUZBVUxUOworCisJCQkvKiBGSVhNRTogZG9uJ3QgYWNjZXB0IGFueSBsZW5ndGggZnJvbSB1c2VyICovCisJCQlwdkJ1ZmZlciA9IGttYWxsb2MoSW9CdWZmZXIuSW5wdXRMZW5ndGgsIEdGUF9LRVJORUwpOworCQkJaWYoIXB2QnVmZmVyKQorCQkJCXJldHVybiAtRU5PTUVNOworCisJCQlpZihjb3B5X2Zyb21fdXNlcihwdkJ1ZmZlciwgSW9CdWZmZXIuSW5wdXRCdWZmZXIsIElvQnVmZmVyLklucHV0TGVuZ3RoKSkKIAkJCXsKIAkJCQlTdGF0dXMgPSAtRUZBVUxUOwotCQkJCWJjbV9rZnJlZShwdkJ1ZmZlcik7CisJCQkJa2ZyZWUocHZCdWZmZXIpOwogCQkJCWJyZWFrOwogCQkJfQogCkBAIC04MjAsMTAgKzczNSw5IEBACiAJCQlTdGF0dXMgPSBDb3B5QnVmZmVyVG9Db250cm9sUGFja2V0KEFkYXB0ZXIsIChQVk9JRClwdkJ1ZmZlcik7CiAJCWNudHJsRW5kOgogCQkJdXAoJkFkYXB0ZXItPkxvd1Bvd2VyTW9kZVN5bmMpOwotCQkJYmNtX2tmcmVlKHB2QnVmZmVyKTsKKwkJCWtmcmVlKHB2QnVmZmVyKTsKIAkJCWJyZWFrOwogCQl9Ci0jaWZuZGVmIEJDTV9TSE1fSU5URVJGQUNFCiAJCWNhc2UgSU9DVExfQkNNX0JVRkZFUl9ET1dOTE9BRF9TVEFSVDoKIAkJewogCQkJSU5UIE5WTUFjY2VzcyA9IGRvd25fdHJ5bG9jaygmQWRhcHRlci0+TlZNUmRtV3JtTG9jaykgOwpAQCAtODQ0LDcgKzc1OCw3IEBACiAJCQkJU3RhdHVzID0gcmVzZXRfY2FyZF9wcm9jKEFkYXB0ZXIpOwogCQkJCWlmKFN0YXR1cykKIAkJCQl7Ci0JCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwgInJlc2V0X2NhcmRfcHJvYyBGYWlsZWQhXG4iKTsKKwkJCQkJcHJfZXJyKFBGWCAiJXM6IHJlc2V0X2NhcmRfcHJvYyBGYWlsZWQhXG4iLCBBZGFwdGVyLT5kZXYtPm5hbWUpOwogCQkJCQl1cCgmQWRhcHRlci0+ZndfZG93bmxvYWRfc2VtYSk7CiAJCQkJCXVwKCZBZGFwdGVyLT5OVk1SZG1Xcm1Mb2NrKTsKIAkJCQkJYnJlYWs7CkBAIC04NjIsNyArNzc2LDcgQEAKIAkJfQogCQljYXNlIElPQ1RMX0JDTV9CVUZGRVJfRE9XTkxPQUQ6CiAJCQl7Ci0JCQkJRklSTVdBUkVfSU5GTyAJKnBzRndJbmZvPU5VTEw7CisJCQkJRklSTVdBUkVfSU5GTyAJKnBzRndJbmZvID0gTlVMTDsKIAkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsICJTdGFydGluZyB0aGUgZmlybXdhcmUgZG93bmxvYWQgUElEID0weCV4ISEhIVxuIiwgY3VycmVudC0+cGlkKTsKIAkJCWRvewogCQkJCWlmKCFkb3duX3RyeWxvY2soJkFkYXB0ZXItPmZ3X2Rvd25sb2FkX3NlbWEpKQpAQCAtODcxLDI5ICs3ODUsMjMgQEAKIAkJCQkJU3RhdHVzPS1FSU5WQUw7CiAJCQkJCWJyZWFrOwogCQkJCX0KKwogCQkJCS8qIENvcHkgSW9jdGwgQnVmZmVyIHN0cnVjdHVyZSAqLwogCQkJCWlmKGNvcHlfZnJvbV91c2VyKCZJb0J1ZmZlciwgYXJncCwgc2l6ZW9mKElPQ1RMX0JVRkZFUikpKQotCQkJCXsKLQkJCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiY29weV9mcm9tX3VzZXIgMSBmYWlsZWRcbiIpOwotCQkJCQlTdGF0dXMgPSAtRUZBVUxUOwotCQkJCQlicmVhazsKLQkJCQl9CisJCQkJCXJldHVybiAtRUZBVUxUOworCiAJCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiTGVuZ3RoIGZvciBGVyBETEQgaXMgOiAlbHhcbiIsCiAJCQkJCQkJCQkJSW9CdWZmZXIuSW5wdXRMZW5ndGgpOwotCQkJCXBzRndJbmZvPWttYWxsb2Moc2l6ZW9mKCpwc0Z3SW5mbyksIEdGUF9LRVJORUwpOworCisJCQkJaWYgKElvQnVmZmVyLklucHV0TGVuZ3RoID4gc2l6ZW9mKEZJUk1XQVJFX0lORk8pKQorCQkJCQlyZXR1cm4gLUVJTlZBTDsKKworCQkJCXBzRndJbmZvID0ga21hbGxvYyhzaXplb2YoKnBzRndJbmZvKSwgR0ZQX0tFUk5FTCk7CiAJCQkJaWYoIXBzRndJbmZvKQotCQkJCXsKLQkJCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiRmFpbGVkIHRvIGFsbG9jYXRlIGJ1ZmZlciEhISFcbiIpOwotCQkJCQlTdGF0dXMgPSAtRU5PTUVNOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJaWYoY29weV9mcm9tX3VzZXIocHNGd0luZm8sIElvQnVmZmVyLklucHV0QnVmZmVyLAotCQkJCQkJCUlvQnVmZmVyLklucHV0TGVuZ3RoKSkKLQkJCQl7Ci0JCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwgIkNvcHlfZnJvbV91c2VyIDIgZmFpbGVkXG4iKTsKLQkJCQkJU3RhdHVzID0gLUVGQVVMVDsKLQkJCQkJYnJlYWs7Ci0JCQkJfQorCQkJCQlyZXR1cm4gLUVOT01FTTsKKworCQkJCWlmKGNvcHlfZnJvbV91c2VyKHBzRndJbmZvLCBJb0J1ZmZlci5JbnB1dEJ1ZmZlciwgSW9CdWZmZXIuSW5wdXRMZW5ndGgpKQorCQkJCQlyZXR1cm4gLUVGQVVMVDsKIAogCQkJCWlmKCFwc0Z3SW5mby0+cHZNYXBwZWRGaXJtd2FyZUFkZHJlc3MgfHwKIAkJCQkJCShwc0Z3SW5mby0+dTMyRmlybXdhcmVMZW5ndGggPT0gMCkpCkBAIC05MjksNyArODM3LDcgQEAKIAkJCSAgaWYoU3RhdHVzICE9IFNUQVRVU19TVUNDRVNTKQogCQkJCQl1cCgmQWRhcHRlci0+ZndfZG93bmxvYWRfc2VtYSk7CiAJCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsICJJT0NUTDogRmlybXdhcmUgRmlsZSBVcGxvYWRlZFxuIik7Ci0JCQkJYmNtX2tmcmVlKHBzRndJbmZvKTsKKwkJCQlrZnJlZShwc0Z3SW5mbyk7CiAJCQkJYnJlYWs7CiAJCQl9CiAJCWNhc2UgSU9DVExfQkNNX0JVRkZFUl9ET1dOTE9BRF9TVE9QOgpAQCAtOTQ2LDcgKzg1NCw3IEBACiAJCQkJQWRhcHRlci0+YkJpbkRvd25sb2FkZWQ9VFJVRTsKIAkJCQlBZGFwdGVyLT5iQ2ZnRG93bmxvYWRlZD1UUlVFOwogCQkJCWF0b21pY19zZXQoJkFkYXB0ZXItPkN1cnJOdW1GcmVlVHhEZXNjLCAwKTsKLQkJCQlhdG9taWNfc2V0KCZBZGFwdGVyLT5SeFJvbGxPdmVyQ291bnQsIDApOworCiAJCQkJQWRhcHRlci0+Q3Vyck51bVJlY3ZEZXNjcz0wOwogCQkJCUFkYXB0ZXItPmRvd25sb2FkRERSID0gMDsKIApAQCAtOTk5LDcgKzkwNyw2IEBACiAJCQl1cCgmQWRhcHRlci0+TlZNUmRtV3JtTG9jayk7CiAJCQlicmVhazsKIAkJfQotI2VuZGlmCiAJCWNhc2UgSU9DVExfQkVfQlVDS0VUX1NJWkU6CiAJCQlTdGF0dXMgPSAwOwogCQkJaWYgKGdldF91c2VyKEFkYXB0ZXItPkJFQnVja2V0U2l6ZSwgKHVuc2lnbmVkIGxvbmcgX191c2VyICopYXJnKSkKQEAgLTEwNTAsMjIgKzk1NywxNiBAQAogCQkJYnJlYWs7CiAKIAkJY2FzZSBJT0NUTF9HRVRfUEFDS19JTkZPOgotCQkJaWYoY29weV90b191c2VyKGFyZ3AsICZBZGFwdGVyLT5QYWNrSW5mbywKLQkJCQlzaXplb2YoUGFja2V0SW5mbykqTk9fT0ZfUVVFVUVTKSkKLQkJCXsKLQkJCQlTdGF0dXMgPSAtRUZBVUxUOwotCQkJCWJyZWFrOwotCQkJfQorCQkJaWYoY29weV90b191c2VyKGFyZ3AsICZBZGFwdGVyLT5QYWNrSW5mbywgc2l6ZW9mKFBhY2tldEluZm8pKk5PX09GX1FVRVVFUykpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CiAJCQlTdGF0dXMgPSBTVEFUVVNfU1VDQ0VTUzsKIAkJCWJyZWFrOwogCQljYXNlIElPQ1RMX0JDTV9TV0lUQ0hfVFJBTlNGRVJfTU9ERToKIAkJewogCQkJVUlOVCB1aURhdGEgPSAwOwogCQkJaWYoY29weV9mcm9tX3VzZXIoJnVpRGF0YSwgYXJncCwgc2l6ZW9mKFVJTlQpKSkKLQkJCXsKLQkJCQlTdGF0dXMgPSAtRUZBVUxUOwotCQkJCWJyZWFrOwotCQkJfQorCQkJCXJldHVybiAtRUZBVUxUOworCiAJCQlpZih1aURhdGEpCS8qIEFsbG93IEFsbCBQYWNrZXRzICovCiAJCQl7CiAJCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsICJJT0NUTF9CQ01fU1dJVENIX1RSQU5TRkVSX01PREU6IEVUSF9QQUNLRVRfVFVOTkVMSU5HX01PREVcbiIpOwpAQCAtMTA4NCwyMiArOTg1LDE2IEBACiAJCXsKIAkJCS8qIENvcHkgSW9jdGwgQnVmZmVyIHN0cnVjdHVyZSAqLwogCQkJaWYoY29weV9mcm9tX3VzZXIoJklvQnVmZmVyLCBhcmdwLCBzaXplb2YoSU9DVExfQlVGRkVSKSkpCi0JCQl7Ci0JCQkJU3RhdHVzID0gLUVGQVVMVDsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWlmKGNvcHlfdG9fdXNlcihJb0J1ZmZlci5PdXRwdXRCdWZmZXIsCi0JCQkJVkVSX0ZJTEVWRVJTSU9OX1NUUiwgKFVJTlQpSW9CdWZmZXIuT3V0cHV0TGVuZ3RoKSkKLQkJCXsKLQkJCQlTdGF0dXMgPSAtRUZBVUxUOwotCQkJCWJyZWFrOwotCQkJfQorCQkJCXJldHVybiAtRUZBVUxUOworCisJCQlpZihjb3B5X3RvX3VzZXIoSW9CdWZmZXIuT3V0cHV0QnVmZmVyLCBWRVJfRklMRVZFUlNJT05fU1RSLCBJb0J1ZmZlci5PdXRwdXRMZW5ndGgpKQorCQkJCXJldHVybiAtRUZBVUxUOwogCQkJU3RhdHVzID0gU1RBVFVTX1NVQ0NFU1M7CiAJCQlicmVhazsKIAkJfQogCQljYXNlIElPQ1RMX0JDTV9HRVRfQ1VSUkVOVF9TVEFUVVM6CiAJCXsKLQkJCUxJTktfU1RBVEUgcGxpbmtfc3RhdGU7CisJCQlMSU5LX1NUQVRFIGxpbmtfc3RhdGU7CiAKIAkJCS8qIENvcHkgSW9jdGwgQnVmZmVyIHN0cnVjdHVyZSAqLwogCQkJaWYoY29weV9mcm9tX3VzZXIoJklvQnVmZmVyLCBhcmdwLCBzaXplb2YoSU9DVExfQlVGRkVSKSkpCkBAIC0xMTA4LDE5ICsxMDAzLDE5IEBACiAJCQkJU3RhdHVzID0gLUVGQVVMVDsKIAkJCQlicmVhazsKIAkJCX0KLQkJCWlmIChJb0J1ZmZlci5PdXRwdXRMZW5ndGggIT0gc2l6ZW9mKHBsaW5rX3N0YXRlKSkgeworCQkJaWYgKElvQnVmZmVyLk91dHB1dExlbmd0aCAhPSBzaXplb2YobGlua19zdGF0ZSkpIHsKIAkJCQlTdGF0dXMgPSAtRUlOVkFMOwogCQkJCWJyZWFrOwogCQkJfQogCi0JCQlpZiAoY29weV9mcm9tX3VzZXIoJnBsaW5rX3N0YXRlLCAodm9pZCBfX3VzZXIgKilhcmcsIHNpemVvZihwbGlua19zdGF0ZSkpKSB7Ci0JCQkJU3RhdHVzID0gLUVGQVVMVDsKLQkJCQlicmVhazsKLQkJCX0KLQkJCXBsaW5rX3N0YXRlLmJJZGxlTW9kZSA9IChVQ0hBUilBZGFwdGVyLT5JZGxlTW9kZTsKLQkJCXBsaW5rX3N0YXRlLmJTaHV0ZG93bk1vZGUgPSBBZGFwdGVyLT5iU2h1dFN0YXR1czsKLQkJCXBsaW5rX3N0YXRlLnVjTGlua1N0YXR1cyA9IChVQ0hBUilBZGFwdGVyLT5MaW5rU3RhdHVzOwotCQkJaWYgKGNvcHlfdG9fdXNlcihJb0J1ZmZlci5PdXRwdXRCdWZmZXIsICZwbGlua19zdGF0ZSwgSW9CdWZmZXIuT3V0cHV0TGVuZ3RoKSkgeworCQkJbWVtc2V0KCZsaW5rX3N0YXRlLCAwLCBzaXplb2YobGlua19zdGF0ZSkpOworCQkJbGlua19zdGF0ZS5iSWRsZU1vZGUgPSBBZGFwdGVyLT5JZGxlTW9kZTsKKwkJCWxpbmtfc3RhdGUuYlNodXRkb3duTW9kZSA9IEFkYXB0ZXItPmJTaHV0U3RhdHVzOworCQkJbGlua19zdGF0ZS51Y0xpbmtTdGF0dXMgPSBBZGFwdGVyLT5MaW5rU3RhdHVzOworCisJCQlpZiAoY29weV90b191c2VyKElvQnVmZmVyLk91dHB1dEJ1ZmZlciwgJmxpbmtfc3RhdGUsCisJCQkJCSBtaW5fdChzaXplX3QsIHNpemVvZihsaW5rX3N0YXRlKSwgSW9CdWZmZXIuT3V0cHV0TGVuZ3RoKSkpCisJCQl7CiAJCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiQ29weV90b191c2VyIEZhaWxlZC4uXG4iKTsKIAkJCQlTdGF0dXMgPSAtRUZBVUxUOwogCQkJCWJyZWFrOwpAQCAtMTEzMSwxNyArMTAyNiwxNCBAQAogICAgICAgICBjYXNlIElPQ1RMX0JDTV9TRVRfTUFDX1RSQUNJTkc6CiAgICAgICAgIHsKICAgICAgICAgICAgIFVJTlQgIHRyYWNpbmdfZmxhZzsKKwogICAgICAgICAgICAgLyogY29weSBpb2N0bCBCdWZmZXIgc3RydWN0dXJlICovCi0JCQlpZihjb3B5X2Zyb21fdXNlcigmSW9CdWZmZXIsIGFyZ3AsIHNpemVvZihJT0NUTF9CVUZGRVIpKSkKLQkJCXsKLQkJCQlTdGF0dXMgPSAtRUZBVUxUOwotCQkJCWJyZWFrOwotCQkJfQotCQkJaWYoY29weV9mcm9tX3VzZXIoJnRyYWNpbmdfZmxhZywgSW9CdWZmZXIuSW5wdXRCdWZmZXIsc2l6ZW9mKFVJTlQpKSkKLSAgICAgICAgICAgIHsKLQkJCQlTdGF0dXMgPSAtRUZBVUxUOwotCQkJCWJyZWFrOwotCQkJfQorCSAgICBpZihjb3B5X2Zyb21fdXNlcigmSW9CdWZmZXIsIGFyZ3AsIHNpemVvZihJT0NUTF9CVUZGRVIpKSkKKwkJICAgIHJldHVybiAtRUZBVUxUOworCisJICAgIGlmKGNvcHlfZnJvbV91c2VyKCZ0cmFjaW5nX2ZsYWcsSW9CdWZmZXIuSW5wdXRCdWZmZXIsc2l6ZW9mKFVJTlQpKSkKKwkJICAgIHJldHVybiAtRUZBVUxUOworCiAgICAgICAgICAgICBpZiAodHJhY2luZ19mbGFnKQogICAgICAgICAgICAgICAgIEFkYXB0ZXItPnBUYXJhbmdzLT5NYWNUcmFjaW5nRW5hYmxlZCA9IFRSVUU7CiAgICAgICAgICAgICBlbHNlCkBAIC0xMTUxLDcyICsxMDQzLDUzIEBACiAJCWNhc2UgSU9DVExfQkNNX0dFVF9EU1hfSU5ESUNBVElPTjoKIAkJewogCQkJVUxPTkcgdWxTRklkPTA7Ci0JCQlpZihjb3B5X2Zyb21fdXNlcigoUENIQVIpJklvQnVmZmVyLCBhcmdwLAotCQkJCQlzaXplb2YoSU9DVExfQlVGRkVSKSkpCi0JCQl7Ci0JCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiSW52YWxpZCBJTyBidWZmZXIhISEiICk7Ci0JCQkJU3RhdHVzID0gLUVGQVVMVDsKLQkJCQlicmVhazsKLQkJCX0KKwkJCWlmKGNvcHlfZnJvbV91c2VyKCZJb0J1ZmZlciwgYXJncCwgc2l6ZW9mKElPQ1RMX0JVRkZFUikpKQorCQkJCXJldHVybiAtRUZBVUxUOworCiAJCQlpZihJb0J1ZmZlci5PdXRwdXRMZW5ndGggPCBzaXplb2Yoc3RMb2NhbFNGQWRkSW5kaWNhdGlvbkFsdCkpCiAJCQl7Ci0JCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiTWlzbWF0Y2ggcmVxOiAlbHggbmVlZGVkIGlzID0weCV6eCEhISIsCi0JCQkJCUlvQnVmZmVyLk91dHB1dExlbmd0aCwgc2l6ZW9mKHN0TG9jYWxTRkFkZEluZGljYXRpb25BbHQpKTsKKwkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsCisJCQkJCQkiTWlzbWF0Y2ggcmVxOiAlbHggbmVlZGVkIGlzID0weCV6eCEhISIsCisJCQkJCQlJb0J1ZmZlci5PdXRwdXRMZW5ndGgsIHNpemVvZihzdExvY2FsU0ZBZGRJbmRpY2F0aW9uQWx0KSk7CiAJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCQl9Ci0JCQlpZihjb3B5X2Zyb21fdXNlcigmdWxTRklkLCBJb0J1ZmZlci5JbnB1dEJ1ZmZlciwKLQkJCQkJc2l6ZW9mKHVsU0ZJZCkpKQotCQkJewotCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwiSW52YWxpZCBTRklEISEhICVsdSIsIHVsU0ZJZCApOwotCQkJCVN0YXR1cyA9IC1FRkFVTFQ7Ci0JCQkJYnJlYWs7Ci0JCQl9CisKKwkJCWlmKGNvcHlfZnJvbV91c2VyKCZ1bFNGSWQsIElvQnVmZmVyLklucHV0QnVmZmVyLCBzaXplb2YodWxTRklkKSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisKIAkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLCAiR2V0IERTWCBEYXRhIFNGIElEIGlzID0lbHhcbiIsIHVsU0ZJZCApOwotCQkJZ2V0X2RzeF9zZl9kYXRhX3RvX2FwcGxpY2F0aW9uKEFkYXB0ZXIsIHVsU0ZJZCwKLQkJCQlJb0J1ZmZlci5PdXRwdXRCdWZmZXIpOworCQkJZ2V0X2RzeF9zZl9kYXRhX3RvX2FwcGxpY2F0aW9uKEFkYXB0ZXIsIHVsU0ZJZCwgSW9CdWZmZXIuT3V0cHV0QnVmZmVyKTsKIAkJCVN0YXR1cz1TVEFUVVNfU1VDQ0VTUzsKIAkJfQogCQlicmVhazsKIAkJY2FzZSBJT0NUTF9CQ01fR0VUX0hPU1RfTUlCUzoKIAkJewotCQkJUENIQVIgdGVtcF9idWZmOworCQkJUFZPSUQgdGVtcF9idWZmOwogCiAJCQlpZihjb3B5X2Zyb21fdXNlcigmSW9CdWZmZXIsIGFyZ3AsIHNpemVvZihJT0NUTF9CVUZGRVIpKSkKLQkJCXsKLQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsICJDb3B5X2Zyb20gdXNlciBmb3IgSW9CdWZmIGZhaWxlZFxuIik7Ci0JCQkJU3RhdHVzID0gLUVGQVVMVDsKLQkJCQlicmVhazsKLQkJCX0KKwkJCQlyZXR1cm4gLUVGQVVMVDsKIAogCQkJaWYoSW9CdWZmZXIuT3V0cHV0TGVuZ3RoICE9IHNpemVvZihTX01JQlNfSE9TVF9TVEFUU19NSUJTKSkKIAkJCXsKLQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsICJMZW5ndGggQ2hlY2sgZmFpbGVkICVsdSAlemRcbiIsIElvQnVmZmVyLk91dHB1dExlbmd0aCwKLQkJCQkJCQkJCQkJc2l6ZW9mKFNfTUlCU19IT1NUX1NUQVRTX01JQlMpKTsKLQkgICAgICAgICAgCXJldHVybiAtRUlOVkFMOworCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwKKwkJCQkJCSJMZW5ndGggQ2hlY2sgZmFpbGVkICVsdSAlemRcbiIsCisJCQkJCQlJb0J1ZmZlci5PdXRwdXRMZW5ndGgsIHNpemVvZihTX01JQlNfSE9TVF9TVEFUU19NSUJTKSk7CisJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCQl9CiAKLQkJCXRlbXBfYnVmZiA9IChQQ0hBUilrbWFsbG9jKElvQnVmZmVyLk91dHB1dExlbmd0aCwgR0ZQX0tFUk5FTCk7Ci0KKwkJCS8qIEZJWE1FOiBIT1NUX1NUQVRTIGFyZSB0b28gYmlnIGZvciBrbWFsbG9jICgxMjIwNDgpISAqLworCQkJdGVtcF9idWZmID0ga3phbGxvYyhzaXplb2YoU19NSUJTX0hPU1RfU1RBVFNfTUlCUyksIEdGUF9LRVJORUwpOwogCQkJaWYoIXRlbXBfYnVmZikKLQkJCXsKIAkJCQlyZXR1cm4gU1RBVFVTX0ZBSUxVUkU7Ci0JCQl9CiAKLQkJCVN0YXR1cyA9IFByb2Nlc3NHZXRIb3N0TWlicyhBZGFwdGVyLAotCQkJCQkoUFVDSEFSKXRlbXBfYnVmZiwgSW9CdWZmZXIuT3V0cHV0TGVuZ3RoKTsKKwkJCVN0YXR1cyA9IFByb2Nlc3NHZXRIb3N0TWlicyhBZGFwdGVyLCB0ZW1wX2J1ZmYpOworCQkJR2V0RHJvcHBlZEFwcENudHJsUGt0TWlicyh0ZW1wX2J1ZmYsIHBUYXJhbmcpOwogCi0JICAgICAgICBTdGF0dXMgPSBHZXREcm9wcGVkQXBwQ250cmxQa3RNaWJzKChQVk9JRCl0ZW1wX2J1ZmYsCi0JCQkJCQkJCQkoUFBFUl9UQVJBTkdfREFUQSlmaWxwLT5wcml2YXRlX2RhdGEpOworCQkJaWYgKFN0YXR1cyAhPSBTVEFUVVNfRkFJTFVSRSkKKwkJCQlpZihjb3B5X3RvX3VzZXIoSW9CdWZmZXIuT3V0cHV0QnVmZmVyLCB0ZW1wX2J1ZmYsIHNpemVvZihTX01JQlNfSE9TVF9TVEFUU19NSUJTKSkpCisJCQkJCVN0YXR1cyA9IC1FRkFVTFQ7CiAKLQkJCWlmKGNvcHlfdG9fdXNlcihJb0J1ZmZlci5PdXRwdXRCdWZmZXIsKFBDSEFSKXRlbXBfYnVmZiwKLQkJCQlzaXplb2YoU19NSUJTX0hPU1RfU1RBVFNfTUlCUykpKQotCQkJewotCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwgIkNvcHkgdG8gdXNlciBmYWlsZWRcbiIpOwotCQkJCWJjbV9rZnJlZSh0ZW1wX2J1ZmYpOwotCQkJCXJldHVybiAtRUZBVUxUOwotCQkJfQotCi0JCQliY21fa2ZyZWUodGVtcF9idWZmKTsKKwkJCWtmcmVlKHRlbXBfYnVmZik7CiAJCQlicmVhazsKIAkJfQogCkBAIC0xMjI2LDEwICsxMDk5LDYgQEAKIAkJCQlBZGFwdGVyLT51c0lkbGVNb2RlUGF0dGVybiA9IEFCT1JUX0lETEVfTU9ERTsKIAkJCQlBZGFwdGVyLT5iV2FrZVVwRGV2aWNlID0gVFJVRTsKIAkJCQl3YWtlX3VwKCZBZGFwdGVyLT5wcm9jZXNzX3J4X2NudHJscGt0KTsKLQkJCQkjaWYgMAotCQkJCUFkYXB0ZXItPmJUcmllZFRvV2FrZVVwRnJvbWxvd1Bvd2VyTW9kZSA9IFRSVUU7Ci0JCQkJSW50ZXJmYWNlQWJvcnRJZGxlbW9kZSAoQWRhcHRlciwgQWRhcHRlci0+dXNJZGxlTW9kZVBhdHRlcm4pOwotCQkJCSNlbmRpZgogCQkJfQogCQkJU3RhdHVzID0gU1RBVFVTX1NVQ0NFU1M7CiAJCQlicmVhazsKQEAgLTEyNDgsMjQgKzExMTcsMjAgQEAKIAkJCQkJU3RhdHVzID0gLUVBQ0NFUzsKIAkJCQkJYnJlYWs7CiAJCQkJfQotCQkJCS8qIENvcHkgSW9jdGwgQnVmZmVyIHN0cnVjdHVyZSAqLwotCQkJCWlmKGNvcHlfZnJvbV91c2VyKChQQ0hBUikmSW9CdWZmZXIsIGFyZ3AsIHNpemVvZihJT0NUTF9CVUZGRVIpKSkKLQkJCQl7Ci0JCQkJCVN0YXR1cyA9IC1FRkFVTFQ7Ci0JCQkJCWJyZWFrOwotCQkJCX0KIAotCQkJCXB2QnVmZmVyPWttYWxsb2MoSW9CdWZmZXIuSW5wdXRMZW5ndGgsIEdGUF9LRVJORUwpOworCQkJCS8qIENvcHkgSW9jdGwgQnVmZmVyIHN0cnVjdHVyZSAqLworCQkJCWlmKGNvcHlfZnJvbV91c2VyKCZJb0J1ZmZlciwgYXJncCwgc2l6ZW9mKElPQ1RMX0JVRkZFUikpKQorCQkJCQlyZXR1cm4gLUVGQVVMVDsKKworCQkJCS8qIEZJWE1FOiByZXN0cmljdCBsZW5ndGggKi8KKwkJCQlwdkJ1ZmZlciA9IGttYWxsb2MoSW9CdWZmZXIuSW5wdXRMZW5ndGgsIEdGUF9LRVJORUwpOwogCQkJCWlmKCFwdkJ1ZmZlcikKLQkJCQl7CiAJCQkJCXJldHVybiAtRU5PTUVNOwotCQkJCQlicmVhazsKLQkJCQl9CiAKIAkJCQkvKiBHZXQgV3JtQnVmZmVyIHN0cnVjdHVyZSAqLwotICAgICAgICAgICAgICAgIGlmKGNvcHlfZnJvbV91c2VyKHB2QnVmZmVyLCBJb0J1ZmZlci5JbnB1dEJ1ZmZlciwgSW9CdWZmZXIuSW5wdXRMZW5ndGgpKQorCQkJCWlmKGNvcHlfZnJvbV91c2VyKHB2QnVmZmVyLCBJb0J1ZmZlci5JbnB1dEJ1ZmZlciwgSW9CdWZmZXIuSW5wdXRMZW5ndGgpKQogCQkJCXsKLQkJCQkJYmNtX2tmcmVlKHB2QnVmZmVyKTsKKwkJCQkJa2ZyZWUocHZCdWZmZXIpOwogCQkJCQlTdGF0dXMgPSAtRUZBVUxUOwogCQkJCQlicmVhazsKIAkJCQl9CkBAIC0xMjc1LDcgKzExNDAsNyBAQAogCQkJCWlmKCgoVUxPTkcpcEJ1bGtCdWZmZXItPlJlZ2lzdGVyICYgMHgwRjAwMDAwMCkgIT0gMHgwRjAwMDAwMCB8fAogCQkJCQkoKFVMT05HKXBCdWxrQnVmZmVyLT5SZWdpc3RlciAmIDB4MykpCiAJCQkJewotCQkJCQliY21fa2ZyZWUocHZCdWZmZXIpOworCQkJCQlrZnJlZShwdkJ1ZmZlcik7CiAgICAgICAgICAgICAgICAgICAgIEJDTV9ERUJVR19QUklOVCAoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLCJXUk0gRG9uZSBPbiBpbnZhbGlkIEFkZHJlc3MgOiAleCBBY2Nlc3MgRGVuaWVkLlxuIiwoaW50KXBCdWxrQnVmZmVyLT5SZWdpc3Rlcik7CiAJCQkJCVN0YXR1cyA9IC1FSU5WQUw7CiAJCQkJCWJyZWFrOwpAQCAtMTI5MCw3ICsxMTU1LDcgQEAKIAkJCQkJKHVpVGVtcFZhciA9PSBFRVBST01fUkVKRUNUX1JFR180KSkgJiYKIAkJCQkJKGNtZCA9PSBJT0NUTF9CQ01fUkVHSVNURVJfV1JJVEUpKQogCQkJCXsKLQkJCQkJYmNtX2tmcmVlKHB2QnVmZmVyKTsKKwkJCQkJa2ZyZWUocHZCdWZmZXIpOwogICAgICAgICAgICAgICAgICAgICBCQ01fREVCVUdfUFJJTlQgKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwiRUVQUk9NIEFjY2VzcyBEZW5pZWQsIG5vdCBpbiBWU0cgTW9kZVxuIik7CiAJCQkJCVN0YXR1cyA9IC1FRkFVTFQ7CiAJCQkJCWJyZWFrOwpAQCAtMTMwNiwzMCArMTE3MSwxOSBAQAogCQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsICJXUk0gRmFpbGVkXG4iKTsKIAkJCQl9CiAKLQkJCQliY21fa2ZyZWUocHZCdWZmZXIpOworCQkJCWtmcmVlKHB2QnVmZmVyKTsKIAkJCQlicmVhazsKIAkJCX0KIAogCQljYXNlIElPQ1RMX0JDTV9HRVRfTlZNX1NJWkU6Ci0JCQl7Ci0KIAkJCWlmKGNvcHlfZnJvbV91c2VyKCZJb0J1ZmZlciwgYXJncCwgc2l6ZW9mKElPQ1RMX0JVRkZFUikpKQotCQkJewotCQkJCS8vSU9Mb2coImZhaWxlZCBOVk0gZmlyc3QiKTsKLQkJCQlTdGF0dXMgPSAtRUZBVUxUOwotCQkJCWJyZWFrOwotCQkJfQotCQkJaWYoQWRhcHRlci0+ZU5WTVR5cGUgPT0gTlZNX0VFUFJPTSB8fCBBZGFwdGVyLT5lTlZNVHlwZSA9PSBOVk1fRkxBU0ggKSB7Ci0JCQkJaWYoY29weV90b191c2VyKElvQnVmZmVyLk91dHB1dEJ1ZmZlciwKLQkJCQkJKHVuc2lnbmVkIGNoYXIgKikmQWRhcHRlci0+dWlOVk1EU0RTaXplLCAoVUlOVClzaXplb2YoVUlOVCkpKQotCQkJCXsKLQkJCQkJCVN0YXR1cyA9IC1FRkFVTFQ7Ci0JCQkJCQlyZXR1cm4gU3RhdHVzOwotCQkJCX0KLQkJCX0KKwkJCQlyZXR1cm4gLUVGQVVMVDsKIAotCQkJU3RhdHVzID0gU1RBVFVTX1NVQ0NFU1MgOworCQkJaWYoQWRhcHRlci0+ZU5WTVR5cGUgPT0gTlZNX0VFUFJPTSB8fCBBZGFwdGVyLT5lTlZNVHlwZSA9PSBOVk1fRkxBU0ggKSB7CisJCQkJaWYoY29weV90b191c2VyKElvQnVmZmVyLk91dHB1dEJ1ZmZlciwgJkFkYXB0ZXItPnVpTlZNRFNEU2l6ZSwgc2l6ZW9mKFVJTlQpKSkKKwkJCQkJcmV0dXJuIC1FRkFVTFQ7CiAJCQl9CisJCQlTdGF0dXMgPSBTVEFUVVNfU1VDQ0VTUyA7CiAJCQlicmVhazsKIAogCQljYXNlIElPQ1RMX0JDTV9DQUxfSU5JVCA6CkBAIC0xMzM4LDQwICsxMTkyLDI2IEBACiAJCQkJVUlOVCB1aVNlY3RvclNpemUgPSAwIDsKIAkJCQlpZihBZGFwdGVyLT5lTlZNVHlwZSA9PSBOVk1fRkxBU0gpCiAJCQkJewotCQkJCQlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmSW9CdWZmZXIsIGFyZ3AsIHNpemVvZihJT0NUTF9CVUZGRVIpKTsKLQkJCQkJaWYoU3RhdHVzKQotCQkJCQl7Ci0JCQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsIkNvcHkgRnJvbSBVc2VyIHNwYWNlIGZhaWxlZC4gc3RhdHVzIDolZCIsIFN0YXR1cyk7CisJCQkJCWlmKGNvcHlfZnJvbV91c2VyKCZJb0J1ZmZlciwgYXJncCwgc2l6ZW9mKElPQ1RMX0JVRkZFUikpKQogCQkJCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCQkJCX0KLQkJCQkJaWYgKGdldF91c2VyKHVpU2VjdG9yU2l6ZSwgKHVuc2lnbmVkIGludCBfX3VzZXIgKilJb0J1ZmZlci5JbnB1dEJ1ZmZlcikpCisKKwkJCQkJaWYgKGNvcHlfZnJvbV91c2VyKCZ1aVNlY3RvclNpemUsIElvQnVmZmVyLklucHV0QnVmZmVyLCBzaXplb2YoVUlOVCkpKQogCQkJCQkJcmV0dXJuIC1FRkFVTFQ7CiAKIAkJCQkJaWYoKHVpU2VjdG9yU2l6ZSA8IE1JTl9TRUNUT1JfU0laRSkgfHwgKHVpU2VjdG9yU2l6ZSA+IE1BWF9TRUNUT1JfU0laRSkpCiAJCQkJCXsKLQotCQkJCQkJU3RhdHVzID0gY29weV90b191c2VyKElvQnVmZmVyLk91dHB1dEJ1ZmZlciwKLQkJCQkJCQkJCSh1bnNpZ25lZCBjaGFyICopJkFkYXB0ZXItPnVpU2VjdG9yU2l6ZSAsCi0JCQkJCQkJCQkoVUlOVClzaXplb2YoVUlOVCkpOwotCQkJCQkJaWYoU3RhdHVzKQotCQkJCQkJewotCQkJCQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsIkNvcGluZyB0aGUgc2VjdG9yIHNpemUgdG8gdXNlIHNwYWNlIGZhaWxlZC4gc3RhdHVzOiVkIixTdGF0dXMpOwotCQkJCQkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJCQkJCX0KKwkJCQkJCWlmIChjb3B5X3RvX3VzZXIoSW9CdWZmZXIuT3V0cHV0QnVmZmVyLCAmQWRhcHRlci0+dWlTZWN0b3JTaXplLAorCQkJCQkJCQkgc2l6ZW9mKFVJTlQpKSkKKwkJCQkJCQlyZXR1cm4gLUVGQVVMVDsKIAkJCQkJfQogCQkJCQllbHNlCiAJCQkJCXsKIAkJCQkJCWlmKElzRmxhc2gyeChBZGFwdGVyKSkKIAkJCQkJCXsKLQkJCQkJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIoSW9CdWZmZXIuT3V0cHV0QnVmZmVyLAotCQkJCQkJCQkJKHVuc2lnbmVkIGNoYXIgKikmQWRhcHRlci0+dWlTZWN0b3JTaXplICwKLQkJCQkJCQkJCShVSU5UKXNpemVvZihVSU5UKSk7Ci0JCQkJCQkJaWYoU3RhdHVzKQotCQkJCQkJCXsKLQkJCQkJCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwiQ29waW5nIHRoZSBzZWN0b3Igc2l6ZSB0byB1c2Ugc3BhY2UgZmFpbGVkLiBzdGF0dXM6JWQiLFN0YXR1cyk7Ci0JCQkJCQkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJCQkJCQl9Ci0KKwkJCQkJCQlpZiAoY29weV90b191c2VyKElvQnVmZmVyLk91dHB1dEJ1ZmZlciwKKwkJCQkJCQkJCSAmQWRhcHRlci0+dWlTZWN0b3JTaXplICwKKwkJCQkJCQkJCSBzaXplb2YoVUlOVCkpKQorCQkJCQkJCSAgICByZXR1cm4gLUVGQVVMVDsKIAkJCQkJCX0KIAkJCQkJCWVsc2UKIAkJCQkJCXsKQEAgLTEzOTUsMjUgKzEyMzUsMTkgQEAKIAkJCX0KIAkJCWJyZWFrOwogICAgICAgICBjYXNlIElPQ1RMX0JDTV9TRVRfREVCVUcgOgorI2lmZGVmIERFQlVHCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgVVNFUl9CQ01fREJHX1NUQVRFIHNVc2VyRGVidWdTdGF0ZTsKIAogLy8JCQkJQkNNX0RFQlVHX1BSSU5UIChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsICJFbnRlcmVkIHRoZSBpb2N0bCAleCBcbiIsIElPQ1RMX0JDTV9TRVRfREVCVUcgKTsKIAogCQkJCUJDTV9ERUJVR19QUklOVCAoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsICJJbiBTRVRfREVCVUcgaW9jdGxcbiIpOwotCQkJCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKChQQ0hBUikmSW9CdWZmZXIsIGFyZ3AsIHNpemVvZihJT0NUTF9CVUZGRVIpKTsKLQkJCQlpZihTdGF0dXMpCi0JCQkJewotCQkJCQlCQ01fREVCVUdfUFJJTlQgKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwgIkNvcHkgZnJvbSB1c2VyIGZhaWxlZFxuIik7Ci0JCQkJCVN0YXR1cyA9IC1FRkFVTFQ7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmc1VzZXJEZWJ1Z1N0YXRlLElvQnVmZmVyLklucHV0QnVmZmVyLCBzaXplb2YoVVNFUl9CQ01fREJHX1NUQVRFKSk7Ci0JCQkJaWYoU3RhdHVzKQotCQkJCXsKLQkJCQkJQkNNX0RFQlVHX1BSSU5UIChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsICAiQ29weSBvZiBJb0J1ZmZlci5JbnB1dEJ1ZmZlciBmYWlsZWQiKTsKKwkJCQlpZiAoY29weV9mcm9tX3VzZXIoJklvQnVmZmVyLCBhcmdwLCBzaXplb2YoSU9DVExfQlVGRkVSKSkpCiAJCQkJCXJldHVybiAtRUZBVUxUOwotCQkJCX0KKworCQkJCWlmIChjb3B5X2Zyb21fdXNlcigmc1VzZXJEZWJ1Z1N0YXRlLCBJb0J1ZmZlci5JbnB1dEJ1ZmZlciwgc2l6ZW9mKFVTRVJfQkNNX0RCR19TVEFURSkpKQorCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwogCiAJCQkJQkNNX0RFQlVHX1BSSU5UIChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsICJJT0NUTF9CQ01fU0VUX0RFQlVHOiBPbk9mZj0lZCBUeXBlID0gMHgleCAiLAogCQkJCXNVc2VyRGVidWdTdGF0ZS5Pbk9mZiwgc1VzZXJEZWJ1Z1N0YXRlLlR5cGUpOwpAQCAtMTQzNiwxNSArMTI3MCwxNCBAQAogICAgICAgICAgICAgICAgIEJDTV9TSE9XX0RFQlVHX0JJVE1BUChBZGFwdGVyKTsKIAogCQkJfQorI2VuZGlmCiAJCQlicmVhazsKIAkJY2FzZSBJT0NUTF9CQ01fTlZNX1JFQUQ6CiAJCWNhc2UgSU9DVExfQkNNX05WTV9XUklURToKIAkJCXsKLQotCQkJCU5WTV9SRUFEV1JJVEUgIHN0TlZNUmVhZFdyaXRlID0ge307CisJCQkJTlZNX1JFQURXUklURSAgc3ROVk1SZWFkV3JpdGU7CiAJCQkJUFVDSEFSIHBSZWFkRGF0YSA9IE5VTEw7Ci0JCQkJdm9pZCBfX3VzZXIgKiBwQnVmZmVydG9iZUNvcGllZCA9IE5VTEw7Ci0JCQkJVUxPTkcgdWxEU0RNYWdpY051bUluVXNyQnVmZiA9IDAgOworCQkJCVVMT05HIHVsRFNETWFnaWNOdW1JblVzckJ1ZmYgPSAwOwogCQkJCXN0cnVjdCB0aW1ldmFsIHR2MCwgdHYxOwogCQkJCW1lbXNldCgmdHYwLDAsc2l6ZW9mKHN0cnVjdCB0aW1ldmFsKSk7CiAJCQkJbWVtc2V0KCZ0djEsMCxzaXplb2Yoc3RydWN0IHRpbWV2YWwpKTsKQEAgLTE0NjksMjEgKzEzMDIsMTIgQEAKIAkJCS8qIENvcHkgSW9jdGwgQnVmZmVyIHN0cnVjdHVyZSAqLwogCiAJCQkJaWYoY29weV9mcm9tX3VzZXIoJklvQnVmZmVyLCBhcmdwLCBzaXplb2YoSU9DVExfQlVGRkVSKSkpCi0JCQkJewotCQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsImNvcHlfZnJvbV91c2VyIGZhaWxlZFxuIik7Ci0JCQkJCVN0YXR1cyA9IC1FRkFVTFQ7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlpZihJT0NUTF9CQ01fTlZNX1JFQUQgPT0gY21kKQotCQkJCQlwQnVmZmVydG9iZUNvcGllZCA9IElvQnVmZmVyLk91dHB1dEJ1ZmZlcjsKLQkJCQllbHNlCi0JCQkJCXBCdWZmZXJ0b2JlQ29waWVkID0gSW9CdWZmZXIuSW5wdXRCdWZmZXI7CisJCQkJCXJldHVybiAtRUZBVUxUOwogCi0JCQkJaWYoY29weV9mcm9tX3VzZXIoJnN0TlZNUmVhZFdyaXRlLCBwQnVmZmVydG9iZUNvcGllZCxzaXplb2YoTlZNX1JFQURXUklURSkpKQotCQkJCXsKLQkJCQkJU3RhdHVzID0gLUVGQVVMVDsKLQkJCQkJYnJlYWs7Ci0JCQkJfQorCQkJCWlmKGNvcHlfZnJvbV91c2VyKCZzdE5WTVJlYWRXcml0ZSwKKwkJCQkJCSAgKElPQ1RMX0JDTV9OVk1fUkVBRCA9PSBjbWQpID8gSW9CdWZmZXIuT3V0cHV0QnVmZmVyIDogSW9CdWZmZXIuSW5wdXRCdWZmZXIsCisJCQkJCQkgIHNpemVvZihOVk1fUkVBRFdSSVRFKSkpCisJCQkJCXJldHVybiAtRUZBVUxUOwogCiAJCQkJLy8KIAkJCQkvLyBEZW55IHRoZSBhY2Nlc3MgaWYgdGhlIG9mZnNldCBjcm9zc2VzIHRoZSBjYWwgYXJlYSBsaW1pdC4KQEAgLTE0OTYsMTggKzEzMjAsMTUgQEAKIAkJCQkJYnJlYWs7CiAJCQkJfQogCi0JCQkJcFJlYWREYXRhID0oUENIQVIpa21hbGxvYyhzdE5WTVJlYWRXcml0ZS51aU51bUJ5dGVzLCBHRlBfS0VSTkVMKTsKLQorCQkJCXBSZWFkRGF0YSA9IGt6YWxsb2Moc3ROVk1SZWFkV3JpdGUudWlOdW1CeXRlcywgR0ZQX0tFUk5FTCk7CiAJCQkJaWYoIXBSZWFkRGF0YSkKIAkJCQkJcmV0dXJuIC1FTk9NRU07CiAKLQkJCQltZW1zZXQocFJlYWREYXRhLDAsc3ROVk1SZWFkV3JpdGUudWlOdW1CeXRlcyk7Ci0KIAkJCQlpZihjb3B5X2Zyb21fdXNlcihwUmVhZERhdGEsIHN0TlZNUmVhZFdyaXRlLnBCdWZmZXIsCiAJCQkJCQkJc3ROVk1SZWFkV3JpdGUudWlOdW1CeXRlcykpCiAJCQkJewogCQkJCQlTdGF0dXMgPSAtRUZBVUxUOwotCQkJCQliY21fa2ZyZWUocFJlYWREYXRhKTsKKwkJCQkJa2ZyZWUocFJlYWREYXRhKTsKIAkJCQkJYnJlYWs7CiAJCQkJfQogCkBAIC0xNTIyLDcgKzEzNDMsNyBAQAogCQkJCQl7CiAJCQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwiRGV2aWNlIGlzIGluIElkbGUvU2h1dGRvd24gTW9kZVxuIik7CiAJCQkJCQl1cCgmQWRhcHRlci0+TlZNUmRtV3JtTG9jayk7Ci0JCQkJCQliY21fa2ZyZWUocFJlYWREYXRhKTsKKwkJCQkJCWtmcmVlKHBSZWFkRGF0YSk7CiAJCQkJCQlyZXR1cm4gLUVBQ0NFUzsKIAkJCQkJfQogCkBAIC0xNTMzLDEzICsxMzU0LDEyIEBACiAKIAkJCQkJaWYoU3RhdHVzICE9IFNUQVRVU19TVUNDRVNTKQogCQkJCQkJewotCQkJCQkJCWJjbV9rZnJlZShwUmVhZERhdGEpOworCQkJCQkJCWtmcmVlKHBSZWFkRGF0YSk7CiAJCQkJCQkJcmV0dXJuIFN0YXR1czsKIAkJCQkJCX0KLQkJCQkJaWYoY29weV90b191c2VyKHN0TlZNUmVhZFdyaXRlLnBCdWZmZXIsCi0JCQkJCQkJcFJlYWREYXRhLCAoVUlOVClzdE5WTVJlYWRXcml0ZS51aU51bUJ5dGVzKSkKKwkJCQkJaWYoY29weV90b191c2VyKHN0TlZNUmVhZFdyaXRlLnBCdWZmZXIscFJlYWREYXRhLCBzdE5WTVJlYWRXcml0ZS51aU51bUJ5dGVzKSkKIAkJCQkJCXsKLQkJCQkJCQliY21fa2ZyZWUocFJlYWREYXRhKTsKKwkJCQkJCQlrZnJlZShwUmVhZERhdGEpOwogCQkJCQkJCVN0YXR1cyA9IC1FRkFVTFQ7CiAJCQkJCQl9CiAJCQkJfQpAQCAtMTU1NCw3ICsxMzc0LDcgQEAKIAkJCQkJewogCQkJCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsIkRldmljZSBpcyBpbiBJZGxlL1NodXRkb3duIE1vZGVcbiIpOwogCQkJCQkJdXAoJkFkYXB0ZXItPk5WTVJkbVdybUxvY2spOwotCQkJCQkJYmNtX2tmcmVlKHBSZWFkRGF0YSk7CisJCQkJCQlrZnJlZShwUmVhZERhdGEpOwogCQkJCQkJcmV0dXJuIC1FQUNDRVM7CiAJCQkJCX0KIApAQCAtMTU4Miw3ICsxNDAyLDcgQEAKIAkJCQkJCQl7CiAJCQkJCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLCJEU0QgU2lnIGlzIHByZXNlbnQgbmVpdGhlciBpbiBGbGFzaCBub3IgVXNlciBwcm92aWRlZCBJbnB1dC4uIik7CiAJCQkJCQkJCXVwKCZBZGFwdGVyLT5OVk1SZG1Xcm1Mb2NrKTsKLQkJCQkJCQkJYmNtX2tmcmVlKHBSZWFkRGF0YSk7CisJCQkJCQkJCWtmcmVlKHBSZWFkRGF0YSk7CiAJCQkJCQkJCXJldHVybiBTdGF0dXM7CiAJCQkJCQkJfQogCkBAIC0xNTkxLDcgKzE0MTEsNyBAQAogCQkJCQkJCXsKIAkJCQkJCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsIkRTRCBTaWcgaXMgcHJlc2VudCBuZWl0aGVyIGluIEZsYXNoIG5vciBVc2VyIHByb3ZpZGVkIElucHV0Li4iKTsKIAkJCQkJCQkJdXAoJkFkYXB0ZXItPk5WTVJkbVdybUxvY2spOwotCQkJCQkJCQliY21fa2ZyZWUocFJlYWREYXRhKTsKKwkJCQkJCQkJa2ZyZWUocFJlYWREYXRhKTsKIAkJCQkJCQkJcmV0dXJuIFN0YXR1czsKIAkJCQkJCQl9CiAJCQkJCQl9CkBAIC0xNjA4LDcgKzE0MjgsNyBAQAogCiAJCQkJCWlmKFN0YXR1cyAhPSBTVEFUVVNfU1VDQ0VTUykKIAkJCQkJewotCQkJCQkJYmNtX2tmcmVlKHBSZWFkRGF0YSk7CisJCQkJCQlrZnJlZShwUmVhZERhdGEpOwogCQkJCQkJcmV0dXJuIFN0YXR1czsKIAkJCQkJfQogCQkJCX0KQEAgLTE2MTYsNyArMTQzNiw3IEBACiAJCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsICIgdGltZXRha2VuIGJ5IFdyaXRlL3JlYWQgOiVsZCBtc2VjXG4iLCh0djEudHZfc2VjIC0gdHYwLnR2X3NlYykqMTAwMCArKHR2MS50dl91c2VjIC0gdHYwLnR2X3VzZWMpLzEwMDApOwogCiAKLQkJCQliY21fa2ZyZWUocFJlYWREYXRhKTsKKwkJCQlrZnJlZShwUmVhZERhdGEpOwogCQkJCVN0YXR1cyA9IFNUQVRVU19TVUNDRVNTOwogCQkJfQogCQkJYnJlYWs7CkBAIC0xNjI5LDcgKzE0NDksNyBAQAogCQkJCVVJTlQgQnVmZlNpemUgPSAwOwogCQkJCVVJTlQgUmVhZEJ5dGVzID0gMDsKIAkJCQlVSU5UIFJlYWRPZmZzZXQgPSAwOwotCQkJCWNoYXIgX191c2VyICpPdXRQdXRCdWZmID0gTlVMTDsKKwkJCQl2b2lkIF9fdXNlciAqT3V0UHV0QnVmZjsKIAogCQkJCWlmKElzRmxhc2gyeChBZGFwdGVyKSAhPSBUUlVFKQogCQkJCXsKQEAgLTE2MzgsMjAgKzE0NTgsMTIgQEAKIAkJCQl9CiAKIAkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwgIklPQ1RMX0JDTV9GTEFTSDJYX1NFQ1RJT05fUkVBRCBDYWxsZWQiKTsKLQkJCQlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmSW9CdWZmZXIsIGFyZ3AsIHNpemVvZihJT0NUTF9CVUZGRVIpKTsKLQkJCQlpZihTdGF0dXMpCi0JCQkJewotCQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsICJDb3B5IG9mIElPQ1RMIEJVRkZFUiBmYWlsZWQiKTsKKwkJCQlpZiAoY29weV9mcm9tX3VzZXIoJklvQnVmZmVyLCBhcmdwLCBzaXplb2YoSU9DVExfQlVGRkVSKSkpCiAJCQkJCXJldHVybiAtRUZBVUxUOwotCQkJCX0KIAogCQkJCS8vUmVhZGluZyBGTEFTSCAyLnggUkVBRCBzdHJ1Y3R1cmUKLQkJCQlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmc0ZsYXNoMnhSZWFkLCBJb0J1ZmZlci5JbnB1dEJ1ZmZlcixzaXplb2YoRkxBU0gyWF9SRUFEV1JJVEUpKTsKLQkJCQlpZihTdGF0dXMpCi0JCQkJewotCQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsICJDb3B5IG9mIElucHV0IEJ1ZmZlciBmYWlsZWQiKTsKKwkJCQlpZiAoY29weV9mcm9tX3VzZXIoJnNGbGFzaDJ4UmVhZCwgSW9CdWZmZXIuSW5wdXRCdWZmZXIsc2l6ZW9mKEZMQVNIMlhfUkVBRFdSSVRFKSkpCiAJCQkJCXJldHVybiAtRUZBVUxUOwotCQkJCX0KIAogCiAJCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsIlxuc0ZsYXNoMnhSZWFkLlNlY3Rpb24gOiV4IiAsc0ZsYXNoMnhSZWFkLlNlY3Rpb24pOwpAQCAtMTY4Nyw3ICsxNDk5LDcgQEAKIAkJCQl7CiAJCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLCJEZXZpY2UgaXMgaW4gSWRsZS9TaHV0ZG93biBNb2RlXG4iKTsKIAkJCQkJdXAoJkFkYXB0ZXItPk5WTVJkbVdybUxvY2spOwotCQkJCQliY21fa2ZyZWUocFJlYWRCdWZmKTsKKwkJCQkJa2ZyZWUocFJlYWRCdWZmKTsKIAkJCQkJcmV0dXJuIC1FQUNDRVM7CiAJCQkJfQogCkBAIC0xNzE1LDcgKzE1MjcsNiBAQAogCQkJCSAJaWYoU3RhdHVzKQogCQkJCSAJewogCQkJCSAJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLCJDb3B5IHRvIHVzZSBmYWlsZWQgd2l0aCBzdGF0dXMgOiVkIiwgU3RhdHVzKTsKLQkJCQkJCVN0YXR1cyA9IC1FRkFVTFQ7CiAJCQkJCQlicmVhazsKIAkJCQkgCX0KIAkJCQkJTk9CID0gTk9CIC0gUmVhZEJ5dGVzOwpAQCAtMTcyNywxNSArMTUzOCwxNSBAQAogCiAJCQkJfQogCQkJCXVwKCZBZGFwdGVyLT5OVk1SZG1Xcm1Mb2NrKTsKLQkJCQliY21fa2ZyZWUocFJlYWRCdWZmKTsKKwkJCQlrZnJlZShwUmVhZEJ1ZmYpOwogCiAJCQkgfQogCQkJIGJyZWFrIDsKIAkJY2FzZSBJT0NUTF9CQ01fRkxBU0gyWF9TRUNUSU9OX1dSSVRFIDoKIAkJCSB7CiAJCQkgCUZMQVNIMlhfUkVBRFdSSVRFIHNGbGFzaDJ4V3JpdGUgPSB7MH07Ci0JCQkJUFVDSEFSIHBXcml0ZUJ1ZmYgPSBOVUxMOwotCQkJCXZvaWQgX191c2VyICpJbnB1dEFkZHIgPSBOVUxMOworCQkJCVBVQ0hBUiBwV3JpdGVCdWZmOworCQkJCXZvaWQgX191c2VyICpJbnB1dEFkZHI7CiAJCQkJVUlOVCBOT0IgPSAwOwogCQkJCVVJTlQgQnVmZlNpemUgPSAwOwogCQkJCVVJTlQgV3JpdGVPZmZzZXQgPSAwOwpAQCAtMTc1MiwzMyArMTU2MywxNyBAQAogCiAKIAkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwgIiBJT0NUTF9CQ01fRkxBU0gyWF9TRUNUSU9OX1dSSVRFIENhbGxlZCIpOwotCQkJCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZJb0J1ZmZlciwgYXJncCwgc2l6ZW9mKElPQ1RMX0JVRkZFUikpOwotCQkJCWlmKFN0YXR1cykKLQkJCQl7Ci0JCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwgIkNvcHkgb2YgSU9DVEwgQlVGRkVSIGZhaWxlZCIpOworCQkJCWlmIChjb3B5X2Zyb21fdXNlcigmSW9CdWZmZXIsIGFyZ3AsIHNpemVvZihJT0NUTF9CVUZGRVIpKSkKIAkJCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCQkJfQogCiAJCQkJLy9SZWFkaW5nIEZMQVNIIDIueCBSRUFEIHN0cnVjdHVyZQotCQkJCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZzRmxhc2gyeFdyaXRlLCBJb0J1ZmZlci5JbnB1dEJ1ZmZlciwgc2l6ZW9mKEZMQVNIMlhfUkVBRFdSSVRFKSk7Ci0JCQkJaWYoU3RhdHVzKQotCQkJCXsKLQkJCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiUmVhZGluZyBvZiBvdXRwdXQgQnVmZmVyIGZyb20gSU9DVEwgYnVmZmVyIGZhaWxzIik7CisJCQkJaWYgKGNvcHlfZnJvbV91c2VyKCZzRmxhc2gyeFdyaXRlLCBJb0J1ZmZlci5JbnB1dEJ1ZmZlciwgc2l6ZW9mKEZMQVNIMlhfUkVBRFdSSVRFKSkpCiAJCQkJCXJldHVybiAtRUZBVUxUOwotCQkJCX0KIAogCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLCJcbnNGbGFzaDJ4UmVhZC5TZWN0aW9uIDoleCIgLHNGbGFzaDJ4V3JpdGUuU2VjdGlvbik7CiAJCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsIlxuc0ZsYXNoMnhSZWFkLm9mZnNldCA6JWQiICxzRmxhc2gyeFdyaXRlLm9mZnNldCk7CiAJCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsIlxuc0ZsYXNoMnhSZWFkLm51bU9mQnl0ZXMgOiV4IiAsc0ZsYXNoMnhXcml0ZS5udW1PZkJ5dGVzKTsKIAkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwiXG5zRmxhc2gyeFJlYWQuYlZlcmlmeSA6JXhcbiIgLHNGbGFzaDJ4V3JpdGUuYlZlcmlmeSk7Ci0JCQkJI2lmIDAKLQkJCQlpZigoc0ZsYXNoMnhXcml0ZS5TZWN0aW9uID09IElTT19JTUFHRTEpIHx8KHNGbGFzaDJ4V3JpdGUuU2VjdGlvbiA9PSBJU09fSU1BR0UyKSB8fAotCQkJCQkoc0ZsYXNoMnhXcml0ZS5TZWN0aW9uID09IERTRDApIHx8IChzRmxhc2gyeFdyaXRlLlNlY3Rpb24gPT0gRFNEMSkgfHwgKHNGbGFzaDJ4V3JpdGUuU2VjdGlvbiA9PSBEU0QyKSkKLQkJCQl7Ci0JCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLCJJU08vRFNEIEltYWdlIHdyaXRlIGlzIG5vdCBhbGxvd2VkLi4uLiAgIik7Ci0JCQkJCXJldHVybiBTVEFUVVNfRkFJTFVSRSA7Ci0JCQkJfQotCQkJCSNlbmRpZgogCQkJCWlmKChzRmxhc2gyeFdyaXRlLlNlY3Rpb24gIT0gVlNBMCkgJiYgKHNGbGFzaDJ4V3JpdGUuU2VjdGlvbiAhPSBWU0ExKSAmJgogCQkJCQkoc0ZsYXNoMnhXcml0ZS5TZWN0aW9uICE9IFZTQTIpICkKIAkJCQl7CkBAIC0xNzk4LDEyICsxNTkzLDEwIEBACiAJCQkJZWxzZQogCQkJCQlCdWZmU2l6ZSA9IE5PQiA7CiAKLQkJCQlwV3JpdGVCdWZmID0gKFBDSEFSKWttYWxsb2MoQnVmZlNpemUsIEdGUF9LRVJORUwpOworCQkJCXBXcml0ZUJ1ZmYgPSBrbWFsbG9jKEJ1ZmZTaXplLCBHRlBfS0VSTkVMKTsKIAkJCQlpZihwV3JpdGVCdWZmID09IE5VTEwpCi0JCQkJewotCQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsIk1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZCBmb3IgRmxhc2ggMi54IFJlYWQgU3RydWN0dXJlIik7CiAJCQkJCXJldHVybiAtRU5PTUVNOwotCQkJCX0KKwogCiAJCQkJLy9leHRyYWN0aW5nIHRoZSByZW1haW5kZXIgb2YgdGhlIGdpdmVuIG9mZnNldC4KIAkJCQlXcml0ZUJ5dGVzID0gQWRhcHRlci0+dWlTZWN0b3JTaXplIDsKQEAgLTE4MjAsNyArMTYxMyw3IEBACiAJCQkJewogCQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwiRGV2aWNlIGlzIGluIElkbGUvU2h1dGRvd24gTW9kZVxuIik7CiAJCQkJCXVwKCZBZGFwdGVyLT5OVk1SZG1Xcm1Mb2NrKTsKLQkJCQkJYmNtX2tmcmVlKHBXcml0ZUJ1ZmYpOworCQkJCQlrZnJlZShwV3JpdGVCdWZmKTsKIAkJCQkJcmV0dXJuIC1FQUNDRVM7CiAJCQkJfQogCkBAIC0xODMxLDcgKzE2MjQsNiBAQAogCQkJCSAJaWYoU3RhdHVzKQogCQkJCSAJewogCQkJCSAJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwiQ29weSB0byB1c2VyIGZhaWxlZCB3aXRoIHN0YXR1cyA6JWQiLCBTdGF0dXMpOwotCQkJCQkJU3RhdHVzID0gLUVGQVVMVDsKIAkJCQkJCWJyZWFrIDsKIAkJCQkgCX0KIAkJCQkJQkNNX0RFQlVHX1BSSU5UX0JVRkZFUihBZGFwdGVyLERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLHBXcml0ZUJ1ZmYsV3JpdGVCeXRlcyk7CkBAIC0xODU5LDI4ICsxNjUxLDIyIEBACiAJCQkJfQl3aGlsZShOT0IgPiAwKTsKIAkJCQlCY21GbGFzaDJ4V3JpdGVTaWcoQWRhcHRlcixzRmxhc2gyeFdyaXRlLlNlY3Rpb24pOwogCQkJCXVwKCZBZGFwdGVyLT5OVk1SZG1Xcm1Mb2NrKTsKLQkJCQliY21fa2ZyZWUocFdyaXRlQnVmZik7CisJCQkJa2ZyZWUocFdyaXRlQnVmZik7CiAJCQkgfQogCQkJIGJyZWFrIDsKIAkJY2FzZSBJT0NUTF9CQ01fR0VUX0ZMQVNIMlhfU0VDVElPTl9CSVRNQVAgOgogCQkJIHsKIAotCQkJIAlQRkxBU0gyWF9CSVRNQVAgcHNGbGFzaDJ4Qml0TWFwID0gTlVMTCA7CisJCQkJIFBGTEFTSDJYX0JJVE1BUCBwc0ZsYXNoMnhCaXRNYXA7CiAJCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsICJJT0NUTF9CQ01fR0VUX0ZMQVNIMlhfU0VDVElPTl9CSVRNQVAgQ2FsbGVkIik7CiAKLQkJCQlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmSW9CdWZmZXIsIGFyZ3AsIHNpemVvZihJT0NUTF9CVUZGRVIpKTsKLQkJCQlpZihTdGF0dXMpCi0JCQkJewotCQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsICJDb3B5IG9mIElPQ1RMIEJVRkZFUiBmYWlsZWQiKTsKKwkJCQlpZiAoY29weV9mcm9tX3VzZXIoJklvQnVmZmVyLCBhcmdwLCBzaXplb2YoSU9DVExfQlVGRkVSKSkpCiAJCQkJCXJldHVybiAtRUZBVUxUOwotCQkJCX0KLQkJCQlpZihJb0J1ZmZlci5PdXRwdXRMZW5ndGggIT0gc2l6ZW9mKEZMQVNIMlhfQklUTUFQKSkKLQkJCQl7Ci0JCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwiU3RydWN0dXJlIHNpemUgbWlzbWF0Y2ggTGliIDoweCVseCBEcml2ZXIgOjB4JXp4ICIsSW9CdWZmZXIuT3V0cHV0TGVuZ3RoLCBzaXplb2YoRkxBU0gyWF9CSVRNQVApKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQogCi0JCQkJcHNGbGFzaDJ4Qml0TWFwID0gKFBGTEFTSDJYX0JJVE1BUClremFsbG9jKHNpemVvZihGTEFTSDJYX0JJVE1BUCksIEdGUF9LRVJORUwpOworCQkJCWlmKElvQnVmZmVyLk91dHB1dExlbmd0aCAhPSBzaXplb2YoRkxBU0gyWF9CSVRNQVApKQorCQkJCQlyZXR1cm4gLUVJTlZBTDsKKworCQkJCXBzRmxhc2gyeEJpdE1hcCA9IGt6YWxsb2Moc2l6ZW9mKEZMQVNIMlhfQklUTUFQKSwgR0ZQX0tFUk5FTCk7CiAJCQkJaWYocHNGbGFzaDJ4Qml0TWFwID09IE5VTEwpCiAJCQkJewogCQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsIk1lbW9yeSBpcyBub3QgYXZhaWxhYmxlIik7CkBAIC0xODk1LDIwICsxNjgxLDE2IEBACiAJCQkJewogCQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwiRGV2aWNlIGlzIGluIElkbGUvU2h1dGRvd24gTW9kZVxuIik7CiAJCQkJCXVwKCZBZGFwdGVyLT5OVk1SZG1Xcm1Mb2NrKTsKLQkJCQkJYmNtX2tmcmVlKHBzRmxhc2gyeEJpdE1hcCk7CisJCQkJCWtmcmVlKHBzRmxhc2gyeEJpdE1hcCk7CiAJCQkJCXJldHVybiAtRUFDQ0VTOwogCQkJCX0KIAogCQkJCUJjbUdldEZsYXNoMnhTZWN0aW9uYWxCaXRNYXAoQWRhcHRlciwgcHNGbGFzaDJ4Qml0TWFwKTsKIAkJCQl1cCgmQWRhcHRlci0+TlZNUmRtV3JtTG9jayk7Ci0JCQkJU3RhdHVzID0gY29weV90b191c2VyKElvQnVmZmVyLk91dHB1dEJ1ZmZlciwgcHNGbGFzaDJ4Qml0TWFwLCBzaXplb2YoRkxBU0gyWF9CSVRNQVApKTsKLQkJCQlpZihTdGF0dXMpCi0JCQkJewotCQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsICJjb3B5aW5nIEZsYXNoMnggYml0TWFwIGZhaWxlZCIpOwotCQkJCQliY21fa2ZyZWUocHNGbGFzaDJ4Qml0TWFwKTsKLQkJCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCQkJfQotCQkJCWJjbV9rZnJlZShwc0ZsYXNoMnhCaXRNYXApOworCQkJCWlmIChjb3B5X3RvX3VzZXIoSW9CdWZmZXIuT3V0cHV0QnVmZmVyLCBwc0ZsYXNoMnhCaXRNYXAsIHNpemVvZihGTEFTSDJYX0JJVE1BUCkpKQorCQkJCQlTdGF0dXMgPSAtRUZBVUxUOworCisJCQkJa2ZyZWUocHNGbGFzaDJ4Qml0TWFwKTsKIAkJCSB9CiAJCQkgYnJlYWsgOwogCQljYXNlIElPQ1RMX0JDTV9TRVRfQUNUSVZFX1NFQ1RJT04gOgpAQCAtMTkyNiwxNCArMTcwOCwxNCBAQAogCQkJCWlmKFN0YXR1cykKIAkJCQl7CiAJCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwgIkNvcHkgb2YgSU9DVEwgQlVGRkVSIGZhaWxlZCIpOwotCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQkJcmV0dXJuIFN0YXR1czsKIAkJCQl9CiAKIAkJCQlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmZUZsYXNoMnhTZWN0aW9uVmFsLElvQnVmZmVyLklucHV0QnVmZmVyLCBzaXplb2YoSU5UKSk7CiAJCQkJaWYoU3RhdHVzKQogCQkJCXsKIAkJCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiQ29weSBvZiBmbGFzaCBzZWN0aW9uIHZhbCBmYWlsZWQiKTsKLQkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJCXJldHVybiBTdGF0dXM7CiAJCQkJfQogCiAJCQkJZG93bigmQWRhcHRlci0+TlZNUmRtV3JtTG9jayk7CkBAIC0xOTYxLDI5ICsxNzQzLDYgQEAKIAkJCQlBZGFwdGVyLT5iQWxsRFNEV3JpdGVBbGxvdyA9IEZBTFNFIDsKIAkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwiSU9DVExfQkNNX0lERU5USUZZX0FDVElWRV9TRUNUSU9OIGNhbGxlZCIpOwogCi0JCQkJI2lmIDAKLQkJCQlTRUNUSU9OX1RZUEUgc2VjdGlvbiA9IDAgOwotCi0KLQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwgIklPQ1RMX0JDTV9JREVOVElGWV9BQ1RJVkVfU0VDVElPTiBDYWxsZWQiKTsKLQkJCQlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigoUENIQVIpJklvQnVmZmVyLCAoUENIQVIpYXJnLCBzaXplb2YoSU9DVExfQlVGRkVSKSk7Ci0JCQkJaWYoU3RhdHVzKQotCQkJCXsKLQkJCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsICJDb3B5IG9mIElPQ1RMIEJVRkZFUiBmYWlsZWQiKTsKLQkJCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCQkJfQotCQkJCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKChQQ0hBUilzZWN0aW9uLChQQ0hBUikmSW9CdWZmZXIsIHNpemVvZihJTlQpKTsKLQkJCQlpZihTdGF0dXMpCi0JCQkJewotCQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwgIkNvcHkgb2Ygc2VjdGlvbiB0eXBlIGZhaWxlZCBmYWlsZWQiKTsKLQkJCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCQkJfQotCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLCJSZWFkIFNlY3Rpb24gOiVkIiwgc2VjdGlvbik7Ci0JCQkgCWlmKHNlY3Rpb24gPT0gRFNEKQotCQkJCQlBZGFwdGVyLT51bEZsYXNoQ2FsU3RhcnQgPSBBZGFwdGVyLT51aUFjdGl2ZURTRE9mZnNldEF0RndEbGQgOwotCQkJCWVsc2UKLQkJCQkJU3RhdHVzID0gU1RBVFVTX0ZBSUxVUkUgOwotCQkJCSNlbmRpZgogCQkJCVN0YXR1cyA9IFNUQVRVU19TVUNDRVNTIDsKIAkJCSB9CiAJCQkgYnJlYWsgOwpAQCAtMjAwNCwxNCArMTc2MywxNCBAQAogCQkJCWlmKFN0YXR1cykKIAkJCQl7CiAJCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwgIkNvcHkgb2YgSU9DVEwgQlVGRkVSIGZhaWxlZCBTdGF0dXMgOiVkIiwgU3RhdHVzKTsKLQkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJCXJldHVybiBTdGF0dXM7CiAJCQkJfQogCi0JCQkJU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJnNDb3B5U2VjdFN0cnV0LElvQnVmZmVyLklucHV0QnVmZmVyLCBzaXplb2YoRkxBU0gyWF9DT1BZX1NFQ1RJT04pKTsKKwkJCQlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmc0NvcHlTZWN0U3RydXQsIElvQnVmZmVyLklucHV0QnVmZmVyLCBzaXplb2YoRkxBU0gyWF9DT1BZX1NFQ1RJT04pKTsKIAkJCQlpZihTdGF0dXMpCiAJCQkJewogCQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsICJDb3B5IG9mIENvcHlfU2VjdGlvbl9TdHJ1Y3QgZmFpbGVkIHdpdGggU3RhdHVzIDolZCIsIFN0YXR1cyk7Ci0JCQkJCXJldHVybiAtRUZBVUxUOworCQkJCQlyZXR1cm4gU3RhdHVzOwogCQkJCX0KIAkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwgIlNvdXJjZSBTRWN0aW9uIDoleCIsIHNDb3B5U2VjdFN0cnV0LlNyY1NlY3Rpb24pOwogCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLCAiRGVzdGluYXRpb24gU0VjdGlvbiA6JXgiLCBzQ29weVNlY3RTdHJ1dC5Ec3RTZWN0aW9uKTsKQEAgLTIwODIsNyArMTg0MSw2IEBACiAJCQkJaWYoU3RhdHVzKQogCQkJCXsKIAkJCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiQ29weSBvZiBJT0NUTCBCVUZGRVIgZmFpbGVkIik7Ci0JCQkJCVN0YXR1cyA9IC1FRkFVTFQ7CiAJCQkJCWJyZWFrOwogCQkJCX0KIAkJCQlpZihBZGFwdGVyLT5lTlZNVHlwZSAhPSBOVk1fRkxBU0gpCkBAIC0yMDk1LDM1ICsxODUzLDE4IEBACiAJCQkJewogCiAJCQkJCWlmKElvQnVmZmVyLk91dHB1dExlbmd0aCA8IHNpemVvZihGTEFTSDJYX0NTX0lORk8pKQotCQkJCQl7Ci0JCQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsIiBQYXNzZWQgYnVmZmVyIHNpemU6MHglbFggaXMgaW5zdWZmaWNpZW50IGZvciB0aGUgQ1Mgc3RydWN0dXJlLi4gXG5SZXF1aXJlZCBzaXplIDoweCV6eCAiLElvQnVmZmVyLk91dHB1dExlbmd0aCwgc2l6ZW9mKEZMQVNIMlhfQ1NfSU5GTykpOwotCQkJCQkJU3RhdHVzID0gLUVJTlZBTDsKLQkJCQkJCWJyZWFrOwotCQkJCQl9CisJCQkJCQlyZXR1cm4gLUVJTlZBTDsKIAotCQkJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIoSW9CdWZmZXIuT3V0cHV0QnVmZmVyLCBBZGFwdGVyLT5wc0ZsYXNoMnhDU0luZm8sIHNpemVvZihGTEFTSDJYX0NTX0lORk8pKTsKLQkJCQkJaWYoU3RhdHVzKQotCQkJCQl7Ci0JCQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsICJjb3B5aW5nIEZsYXNoMnggY3MgaW5mbyBmYWlsZWQiKTsKLQkJCQkJCVN0YXR1cyA9IC1FRkFVTFQ7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQorCQkJCQlpZiAoY29weV90b191c2VyKElvQnVmZmVyLk91dHB1dEJ1ZmZlciwgQWRhcHRlci0+cHNGbGFzaDJ4Q1NJbmZvLCBzaXplb2YoRkxBU0gyWF9DU19JTkZPKSkpCisJCQkJCQlyZXR1cm4gLUVGQVVMVDsKIAkJCQl9CiAJCQkJZWxzZQogCQkJCXsKIAkJCQkJaWYoSW9CdWZmZXIuT3V0cHV0TGVuZ3RoIDwgc2l6ZW9mKEZMQVNIX0NTX0lORk8pKQotCQkJCQl7Ci0JCQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsIiBQYXNzZWQgYnVmZmVyIHNpemU6MHglbFggaXMgaW5zdWZmaWNpZW50IGZvciB0aGUgQ1Mgc3RydWN0dXJlLi4gUmVxdWlyZWQgc2l6ZSA6MHglenggIixJb0J1ZmZlci5PdXRwdXRMZW5ndGgsIHNpemVvZihGTEFTSF9DU19JTkZPKSk7Ci0JCQkJCQlTdGF0dXMgPSAtRUlOVkFMOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQkJU3RhdHVzID0gY29weV90b191c2VyKElvQnVmZmVyLk91dHB1dEJ1ZmZlciwgQWRhcHRlci0+cHNGbGFzaENTSW5mbywgc2l6ZW9mKEZMQVNIX0NTX0lORk8pKTsKLQkJCQkJaWYoU3RhdHVzKQotCQkJCQl7Ci0JCQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsICJjb3B5aW5nIEZsYXNoIENTIGluZm8gZmFpbGVkIik7Ci0JCQkJCQlTdGF0dXMgPSAtRUZBVUxUOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KKwkJCQkJCXJldHVybiAtRUlOVkFMOworCisJCQkJCWlmIChjb3B5X3RvX3VzZXIoSW9CdWZmZXIuT3V0cHV0QnVmZmVyLCBBZGFwdGVyLT5wc0ZsYXNoQ1NJbmZvLCBzaXplb2YoRkxBU0hfQ1NfSU5GTykpKQorCQkJCQkJcmV0dXJuIC1FRkFVTFQ7CiAKIAkJCSAJIH0KIAkJCSAgfQpAQCAtMjE0NSwxMyArMTg4NiwxMyBAQAogCQkJCWlmKFN0YXR1cykKIAkJCQl7CiAJCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwgIkNvcHkgb2YgSU9DVEwgQlVGRkVSIGZhaWxlZCIpOwotCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQkJcmV0dXJuIFN0YXR1czsKIAkJCQl9Ci0JCQkJU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJmVGbGFzaDJ4U2VjdGlvblZhbCxJb0J1ZmZlci5JbnB1dEJ1ZmZlciwgc2l6ZW9mKElOVCkpOworCQkJCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZlRmxhc2gyeFNlY3Rpb25WYWwsIElvQnVmZmVyLklucHV0QnVmZmVyLCBzaXplb2YoSU5UKSk7CiAJCQkJaWYoU3RhdHVzKQogCQkJCXsKIAkJCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiQ29weSBvZiBmbGFzaCBzZWN0aW9uIHZhbCBmYWlsZWQiKTsKLQkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJCXJldHVybiBTdGF0dXM7CiAJCQkJfQogCiAJCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsIlJlYWQgU2VjdGlvbiA6JWQiLCBlRmxhc2gyeFNlY3Rpb25WYWwpOwpAQCAtMjE4MSwxMyArMTkyMiwxMyBAQAogCQljYXNlIElPQ1RMX0JDTV9OVk1fUkFXX1JFQUQgOgogCQkJIHsKIAotCQkJCU5WTV9SRUFEV1JJVEUgIHN0TlZNUmVhZCA9IHt9OworCQkJCSBOVk1fUkVBRFdSSVRFIHN0TlZNUmVhZDsKIAkJCQlJTlQgTk9CIDsKIAkJCQlJTlQgQnVmZlNpemUgOwogCQkJCUlOVCBSZWFkT2Zmc2V0ID0gMDsKIAkJCQlVSU5UIFJlYWRCeXRlcyA9IDAgOwotCQkJCVBVQ0hBUiBwUmVhZEJ1ZmYgPSBOVUxMIDsKLQkJCQljaGFyIF9fdXNlciAqT3V0UHV0QnVmZiA9IE5VTEwgOworCQkJCVBVQ0hBUiBwUmVhZEJ1ZmY7CisJCQkJdm9pZCBfX3VzZXIgKk91dFB1dEJ1ZmY7CiAKIAkJCQlpZihBZGFwdGVyLT5lTlZNVHlwZSAhPSBOVk1fRkxBU0gpCiAJCQkJewpAQCAtMjIwNCwxMCArMTk0NSw3IEBACiAJCQkJfQogCiAJCQkJaWYoY29weV9mcm9tX3VzZXIoJnN0TlZNUmVhZCwgSW9CdWZmZXIuT3V0cHV0QnVmZmVyLHNpemVvZihOVk1fUkVBRFdSSVRFKSkpCi0JCQkJewotCQkJCQlTdGF0dXMgPSAtRUZBVUxUOwotCQkJCQlicmVhazsKLQkJCQl9CisJCQkJCXJldHVybiAtRUZBVUxUOwogCiAJCQkJTk9CID0gc3ROVk1SZWFkLnVpTnVtQnl0ZXM7CiAJCQkJLy9JbiBSYXctUmVhZCBtYXggQnVmZiBzaXplIDogNjRNQgpAQCAtMjIxNywxMSArMTk1NSwxMCBAQAogCQkJCWVsc2UKIAkJCQkJQnVmZlNpemUgPSBOT0IgOwogCi0JCQkJUmVhZE9mZnNldCA9IHN0TlZNUmVhZC51aU9mZnNldCA7CisJCQkJUmVhZE9mZnNldCA9IHN0TlZNUmVhZC51aU9mZnNldDsKIAkJCQlPdXRQdXRCdWZmID0gc3ROVk1SZWFkLnBCdWZmZXI7CiAKLQotCQkJCXBSZWFkQnVmZiA9IChQQ0hBUilremFsbG9jKEJ1ZmZTaXplICwgR0ZQX0tFUk5FTCk7CisJCQkJcFJlYWRCdWZmID0ga3phbGxvYyhCdWZmU2l6ZSAsIEdGUF9LRVJORUwpOwogCQkJCWlmKHBSZWFkQnVmZiA9PSBOVUxMKQogCQkJCXsKIAkJCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCJNZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQgZm9yIEZsYXNoIDIueCBSZWFkIFN0cnVjdHVyZSIpOwpAQCAtMjIzNSw3ICsxOTcyLDcgQEAKIAkJCQkJKEFkYXB0ZXItPmJQcmVwYXJpbmdGb3JMb3dQb3dlck1vZGUgPT1UUlVFKSkKIAkJCQl7CiAJCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLCJEZXZpY2UgaXMgaW4gSWRsZS9TaHV0ZG93biBNb2RlXG4iKTsKLQkJCQkJYmNtX2tmcmVlKHBSZWFkQnVmZik7CisJCQkJCWtmcmVlKHBSZWFkQnVmZik7CiAJCQkJCXVwKCZBZGFwdGVyLT5OVk1SZG1Xcm1Mb2NrKTsKIAkJCQkJcmV0dXJuIC1FQUNDRVM7CiAJCQkJfQpAQCAtMjI1NiwxMyArMTk5MywxMiBAQAogCQkJCQkJYnJlYWs7CiAJCQkJCX0KIAotCQkJCQlCQ01fREVCVUdfUFJJTlRfQlVGRkVSKEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwscFJlYWRCdWZmLCBSZWFkQnl0ZXMpOworCQkJCQlCQ01fREVCVUdfUFJJTlRfQlVGRkVSKEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwscFJlYWRCdWZmLFJlYWRCeXRlcyk7CiAKIAkJCQkJU3RhdHVzID0gY29weV90b191c2VyKE91dFB1dEJ1ZmYsIHBSZWFkQnVmZixSZWFkQnl0ZXMpOwogCQkJCSAJaWYoU3RhdHVzKQogCQkJCSAJewogCQkJCSAJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwiQ29weSB0byB1c2UgZmFpbGVkIHdpdGggc3RhdHVzIDolZCIsIFN0YXR1cyk7Ci0JCQkJCQlTdGF0dXMgPSAtRUZBVUxUOwogCQkJCQkJYnJlYWs7CiAJCQkJIAl9CiAJCQkJCU5PQiA9IE5PQiAtIFJlYWRCeXRlczsKQEAgLTIyNzUsNyArMjAxMSw3IEBACiAJCQkJfQogCQkJCUFkYXB0ZXItPmJGbGFzaFJhd1JlYWQgPSBGQUxTRSA7CiAJCQkJdXAoJkFkYXB0ZXItPk5WTVJkbVdybUxvY2spOwotCQkJCWJjbV9rZnJlZShwUmVhZEJ1ZmYpOworCQkJCWtmcmVlKHBSZWFkQnVmZik7CiAJCQkJYnJlYWsgOwogCQkJIH0KIApAQCAtMjI4OCw3ICsyMDI0LDYgQEAKIAkJCQlpZihTdGF0dXMpCiAJCQkJewogCQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwiY29weSBvZiBJb2N0bCBidWZmZXIgaXMgZmFpbGVkIGZyb20gdXNlciBzcGFjZSIpOwotCQkJCQlTdGF0dXMgPSAtRUZBVUxUOwogCQkJCQlicmVhazsKIAkJCQl9CiAKQEAgLTIyOTYsNyArMjAzMSw2IEBACiAJCQkJaWYoU3RhdHVzKQogCQkJCXsKIAkJCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsImNvcHkgb2YgY29udHJvbCBiaXQgbWFzayBmYWlsZWQgZnJvbSB1c2VyIHNwYWNlIik7Ci0JCQkJCVN0YXR1cyA9IC1FRkFVTFQ7CiAJCQkJCWJyZWFrOwogCQkJCX0KIAkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwiXG4gR290IHVzZXIgZGVmaW5lZCBjbnRybCBtc2cgYml0IG1hc2sgOiVseCIsIFJ4Q250cmxNc2dCaXRNYXNrKTsKQEAgLTIzMTUsNzEgKzIwNDksNDQgQEAKIAkJCQlEZXZJbmZvLnUzMk5WTVR5cGUgPSBBZGFwdGVyLT5lTlZNVHlwZTsKIAkJCQlEZXZJbmZvLnUzMkludGVyZmFjZVR5cGUgPSBCQ01fVVNCOwogCi0JCQkJU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJklvQnVmZmVyLCBhcmdwLCBzaXplb2YoSU9DVExfQlVGRkVSKSk7Ci0JCQkJaWYoU3RhdHVzKQotCQkJCXsKLQkJCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiQ29weSBvZiBJT0NUTCBCVUZGRVIgZmFpbGVkIik7Ci0JCQkJCVN0YXR1cyA9IC1FRkFVTFQ7Ci0JCQkJCWJyZWFrOwotCQkJCX0KKwkJCQlpZiAoY29weV9mcm9tX3VzZXIoJklvQnVmZmVyLCBhcmdwLCBzaXplb2YoSU9DVExfQlVGRkVSKSkpCisJCQkJCXJldHVybiAtRUZBVUxUOworCiAJCQkJaWYoSW9CdWZmZXIuT3V0cHV0TGVuZ3RoIDwgc2l6ZW9mKERldkluZm8pKQotCQkJCXsKLQkJCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCJVc2VyIFBhc3NlZCBidWZmZXIgbGVuZ3RoIGlzIGxlc3MgdGhhbiBhY3R1cmFsIGJ1ZmZlciBzaXplIik7Ci0JCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwidXNlciBwYXNzZWQgYnVmZmVyIHNpemUgOjB4JWxYLCBleHBlY3RlZCBzaXplIDoweCV6eCIsSW9CdWZmZXIuT3V0cHV0TGVuZ3RoLCBzaXplb2YoRGV2SW5mbykpOwotCQkJCQlTdGF0dXMgPSAtRUlOVkFMOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJU3RhdHVzID0gY29weV90b191c2VyKElvQnVmZmVyLk91dHB1dEJ1ZmZlciwgJkRldkluZm8sIHNpemVvZihEZXZJbmZvKSk7Ci0JCQkJaWYoU3RhdHVzKQotCQkJCXsKLQkJCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCJjb3B5aW5nIERldiBpbmZvIHN0cnVjdHVyZSB0byB1c2VyIHNwYWNlIGJ1ZmZlciBmYWlsZWQiKTsKLQkJCQkJU3RhdHVzID0gLUVGQVVMVDsKLQkJCQkJYnJlYWs7Ci0JCQkJfQorCQkJCQlyZXR1cm4gLUVJTlZBTDsKKworCQkJCWlmIChjb3B5X3RvX3VzZXIoSW9CdWZmZXIuT3V0cHV0QnVmZmVyLCAmRGV2SW5mbywgc2l6ZW9mKERldkluZm8pKSkKKwkJCQkJcmV0dXJuIC1FRkFVTFQ7CiAJCQl9CiAJCQlicmVhayA7CiAKIAkJCWNhc2UgSU9DVExfQkNNX1RJTUVfU0lOQ0VfTkVUX0VOVFJZOgogCQkJewogCQkJCVNUX1RJTUVfRUxBUFNFRCBzdFRpbWVFbGFwc2VkU2luY2VOZXRFbnRyeSA9IHswfTsKLQkJCQlzdHJ1Y3QgdGltZXZhbCB0diA9IHswfSA7CiAKIAkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwiSU9DVExfQkNNX1RJTUVfU0lOQ0VfTkVUX0VOVFJZIGNhbGxlZCIpOwogCi0JCQkJU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJklvQnVmZmVyLCBhcmdwLCBzaXplb2YoSU9DVExfQlVGRkVSKSk7Ci0JCQkJaWYoU3RhdHVzKQotCQkJCXsKLQkJCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiQ29weSBvZiBJT0NUTCBCVUZGRVIgZmFpbGVkIik7Ci0JCQkJCVN0YXR1cyA9IC1FRkFVTFQ7Ci0JCQkJCWJyZWFrOwotCQkJCX0KKwkJCQlpZiAoY29weV9mcm9tX3VzZXIoJklvQnVmZmVyLCBhcmdwLCBzaXplb2YoSU9DVExfQlVGRkVSKSkpCisJCQkJCXJldHVybiAtRUZBVUxUOworCiAJCQkJaWYoSW9CdWZmZXIuT3V0cHV0TGVuZ3RoIDwgc2l6ZW9mKFNUX1RJTUVfRUxBUFNFRCkpCi0JCQkJewotCQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsIlVzZXIgUGFzc2VkIGJ1ZmZlciBsZW5ndGg6MHglbHggaXMgbGVzcyB0aGFuIGV4cGVjdGVkIGJ1ZmYgc2l6ZSA6MHglelgiLElvQnVmZmVyLk91dHB1dExlbmd0aCxzaXplb2YoU1RfVElNRV9FTEFQU0VEKSk7Ci0JCQkJCVN0YXR1cyA9IC1FSU5WQUw7Ci0JCQkJCWJyZWFrOwotCQkJCX0KKwkJCQkJcmV0dXJuIC1FSU5WQUw7CiAKLQkJCQkvL3N0VGltZUVsYXBzZWRTaW5jZU5ldEVudHJ5LnVsNjRUaW1lRWxhcHNlZFNpbmNlTmV0RW50cnkgPSBBZGFwdGVyLT5saVRpbWVTaW5jZUxhc3ROZXRFbnRyeTsKLQkJCQlkb19nZXR0aW1lb2ZkYXkoJnR2KTsKLQkJCQlzdFRpbWVFbGFwc2VkU2luY2VOZXRFbnRyeS51bDY0VGltZUVsYXBzZWRTaW5jZU5ldEVudHJ5ID0gdHYudHZfc2VjIC0gQWRhcHRlci0+bGlUaW1lU2luY2VMYXN0TmV0RW50cnk7CisJCQkJc3RUaW1lRWxhcHNlZFNpbmNlTmV0RW50cnkudWw2NFRpbWVFbGFwc2VkU2luY2VOZXRFbnRyeSA9IGdldF9zZWNvbmRzKCkgLSBBZGFwdGVyLT5saVRpbWVTaW5jZUxhc3ROZXRFbnRyeTsKIAotCQkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcihJb0J1ZmZlci5PdXRwdXRCdWZmZXIsICZzdFRpbWVFbGFwc2VkU2luY2VOZXRFbnRyeSwgc2l6ZW9mKFNUX1RJTUVfRUxBUFNFRCkpOwotCQkJCWlmKFN0YXR1cykKLQkJCQl7Ci0JCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwiY29weWluZyBTVF9USU1FX0VMQVBTRUQgc3RydWN0dXJlIHRvIHVzZXIgc3BhY2UgYnVmZmVyIGZhaWxlZCIpOwotCQkJCQlTdGF0dXMgPSAtRUZBVUxUOwotCQkJCQlicmVhazsKLQkJCQl9CisJCQkJaWYgKGNvcHlfdG9fdXNlcihJb0J1ZmZlci5PdXRwdXRCdWZmZXIsICZzdFRpbWVFbGFwc2VkU2luY2VOZXRFbnRyeSwgc2l6ZW9mKFNUX1RJTUVfRUxBUFNFRCkpKQorCQkJCQlyZXR1cm4gLUVGQVVMVDsKIAogCQkJfQogCQkJYnJlYWs7CiAKLQkJZGVmYXVsdDoKLSAgICAgICAgICAgIEJDTV9ERUJVR19QUklOVCAoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAid3JvbmcgaW5wdXQgJXgiLGNtZCk7Ci0JCQlCQ01fREVCVUdfUFJJTlQgKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLCAiSW4gZGVmYXVsdCBpb2N0bCAlZFxuIiwgY21kKTsKLQkJCSBTdGF0dXMgPSBTVEFUVVNfRkFJTFVSRTsKKwkJY2FzZSBJT0NUTF9DTE9TRV9OT1RJRklDQVRJT046CisJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwiSU9DVExfQ0xPU0VfTk9USUZJQ0FUSU9OIik7CisJCQlicmVhazsKIAorCQlkZWZhdWx0OgorCQkJcHJfaW5mbyhEUlZfTkFNRSAiOiB1bmtub3duIGlvY3RsIGNtZD0lI3hcbiIsIGNtZCk7CisJCQlTdGF0dXMgPSBTVEFUVVNfRkFJTFVSRTsKIAkJCWJyZWFrOwogCX0KIAlyZXR1cm4gU3RhdHVzOwpAQCAtMjM5NSw1OSArMjEwMiwzNyBAQAogCS5sbHNlZWsgPSBub19sbHNlZWssCiB9OwogCitleHRlcm4gc3RydWN0IGNsYXNzICpiY21fY2xhc3M7CiAKIGludCByZWdpc3Rlcl9jb250cm9sX2RldmljZV9pbnRlcmZhY2UoUE1JTklfQURBUFRFUiBBZGFwdGVyKQogeworCiAJaWYoQWRhcHRlci0+bWFqb3I+MCkKLSAgICAJcmV0dXJuIEFkYXB0ZXItPm1ham9yOwotICAgIEFkYXB0ZXItPm1ham9yID0gcmVnaXN0ZXJfY2hyZGV2KDAsICJ0YXJhbmciLCAmYmNtX2ZvcHMpOwotICAgIGlmKEFkYXB0ZXItPm1ham9yIDwgMCkKLSAgICB7Ci0gICAgCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX0lOSVRFWElULCBEUlZfRU5UUlksIERCR19MVkxfQUxMLCAicmVnaXN0ZXJfY2hyZGV2OkZhaWxlZCB0byByZWdpc3RlcmluZyBXaU1heCBjb250cm9sIGNoYXIgZGV2aWNlISIpOwotICAgICAgICByZXR1cm4gQWRhcHRlci0+bWFqb3I7Ci0gICAgfQorCQlyZXR1cm4gQWRhcHRlci0+bWFqb3I7CiAKLQliY21fY2xhc3MgPSBOVUxMOwotCWJjbV9jbGFzcyA9IGNsYXNzX2NyZWF0ZSAoVEhJU19NT0RVTEUsICJ0YXJhbmciKTsKLQlpZihJU19FUlIgKGJjbV9jbGFzcykpCi0JewotICAgIAlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9JTklURVhJVCwgRFJWX0VOVFJZLCBEQkdfTFZMX0FMTCwgIlVuYWJsZSB0byBjcmVhdGUgY2xhc3NcbiIpOwotICAgICAgICB1bnJlZ2lzdGVyX2NocmRldihBZGFwdGVyLT5tYWpvciwgInRhcmFuZyIpOwotCQlBZGFwdGVyLT5tYWpvciA9IDA7Ci0JCXJldHVybiAtRU5PREVWOworCUFkYXB0ZXItPm1ham9yID0gcmVnaXN0ZXJfY2hyZGV2KDAsIERFVl9OQU1FLCAmYmNtX2ZvcHMpOworCWlmKEFkYXB0ZXItPm1ham9yIDwgMCkgeworCQlwcl9lcnIoRFJWX05BTUUgIjogY291bGQgbm90IGNyZWF0ZWQgY2hhcmFjdGVyIGRldmljZVxuIik7CisJCXJldHVybiBBZGFwdGVyLT5tYWpvcjsKIAl9CisKIAlBZGFwdGVyLT5wc3RDcmVhdGVkQ2xhc3NEZXZpY2UgPSBkZXZpY2VfY3JlYXRlIChiY21fY2xhc3MsIE5VTEwsCi0JCQkJCQkJCU1LREVWKEFkYXB0ZXItPm1ham9yLCAwKSwKLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLDYsMjYpCi0JCQkJCQkJCU5VTEwJLAotI2VuZGlmCi0JCQkJCQkJCSJ0YXJhbmciKTsKKwkJCQkJCQlNS0RFVihBZGFwdGVyLT5tYWpvciwgMCksIEFkYXB0ZXIsCisJCQkJCQkJREVWX05BTUUpOwogCi0JaWYoSVNfRVJSKEFkYXB0ZXItPnBzdENyZWF0ZWRDbGFzc0RldmljZSkpCi0JewotCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9JTklURVhJVCwgRFJWX0VOVFJZLCBEQkdfTFZMX0FMTCwgImNsYXNzIGRldmljZSBkaWQgbm90IGdldCBjcmVhdGVkIDogJWxkIiwgUFRSX0VSUihBZGFwdGVyLT5wc3RDcmVhdGVkQ2xhc3NEZXZpY2UpICk7CisJaWYoSVNfRVJSKEFkYXB0ZXItPnBzdENyZWF0ZWRDbGFzc0RldmljZSkpIHsKKwkJcHJfZXJyKERSVl9OQU1FICI6IGNsYXNzIGRldmljZSBjcmVhdGUgZmFpbGVkXG4iKTsKKwkJdW5yZWdpc3Rlcl9jaHJkZXYoQWRhcHRlci0+bWFqb3IsIERFVl9OQU1FKTsKKwkJcmV0dXJuIFBUUl9FUlIoQWRhcHRlci0+cHN0Q3JlYXRlZENsYXNzRGV2aWNlKTsKIAl9Ci0JQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfSU5JVEVYSVQsIERSVl9FTlRSWSwgREJHX0xWTF9BTEwsICJHb3QgTWFqb3IgTm86ICVkIiwgQWRhcHRlci0+bWFqb3IpOwotICAgIHJldHVybiAwOworCQkJCisJcmV0dXJuIDA7CiB9CiAKIHZvaWQgdW5yZWdpc3Rlcl9jb250cm9sX2RldmljZV9pbnRlcmZhY2UoUE1JTklfQURBUFRFUiBBZGFwdGVyKQogewotCWlmKEFkYXB0ZXItPm1ham9yID4gMCkKLQl7Ci0gICAgICAgIEJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX0lOSVRFWElULCBEUlZfRU5UUlksIERCR19MVkxfQUxMLCAiZGVzdHJveWluZyBjbGFzcyBkZXZpY2UiKTsKKwlpZihBZGFwdGVyLT5tYWpvciA+IDApIHsKIAkJZGV2aWNlX2Rlc3Ryb3kgKGJjbV9jbGFzcywgTUtERVYoQWRhcHRlci0+bWFqb3IsIDApKTsKKwkJdW5yZWdpc3Rlcl9jaHJkZXYoQWRhcHRlci0+bWFqb3IsIERFVl9OQU1FKTsKIAl9Ci0gICAgaWYoIUlTX0VSUihiY21fY2xhc3MpKQotCXsKLSAgICAgICAgQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfSU5JVEVYSVQsIERSVl9FTlRSWSwgREJHX0xWTF9BTEwsICJkZXN0cm95aW5nIGNyZWF0ZWQgY2xhc3MgIik7Ci0gICAgICAgIGNsYXNzX2Rlc3Ryb3kgKGJjbV9jbGFzcyk7Ci0JCWJjbV9jbGFzcyA9IE5VTEw7Ci0JfQotCWlmKEFkYXB0ZXItPm1ham9yID4gMCkKLQl7Ci0JCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX0lOSVRFWElULCBEUlZfRU5UUlksIERCR19MVkxfQUxMLCJ1bnJlZ2lzdGVyaW5nIGNoYXJhY3RlciBpbnRlcmZhY2UiKTsKLSAgICAgICAgdW5yZWdpc3Rlcl9jaHJkZXYoQWRhcHRlci0+bWFqb3IsICJ0YXJhbmciKTsKLQl9Ci0KIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iY20vQmNtbmV0LmMgYi9kcml2ZXJzL3N0YWdpbmcvYmNtL0JjbW5ldC5jCmluZGV4IGJjMjk2OTguLmE2Y2UyMzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9iY20vQmNtbmV0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JjbS9CY21uZXQuYwpAQCAtMSwyNjQgKzEsMjM4IEBACiAjaW5jbHVkZSAiaGVhZGVycy5oIgogCi1zdGF0aWMgSU5UIGJjbV9ub3RpZnlfZXZlbnQoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYiwgVUxPTkcgZXZlbnQsIFBWT0lEIGRldikKLXsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSopZGV2OwotICAgIFBNSU5JX0FEQVBURVIgQWRhcHRlciA9IEdFVF9CQ01fQURBUFRFUihnYmxwbmV0ZGV2KTsKLQkvL1BNSU5JX0FEQVBURVIgCUFkYXB0ZXIgPSAoUE1JTklfQURBUFRFUiluZGV2LT5wcml2OwotCWlmKHN0cm5jbXAobmRldi0+bmFtZSxnYmxwbmV0ZGV2LT5uYW1lLDUpPT0wKQotCXsKLQkJc3dpdGNoKGV2ZW50KQotCQl7Ci0JCQljYXNlIE5FVERFVl9DSEFOR0VBRERSOgotCQkJY2FzZSBORVRERVZfR09JTkdfRE9XTjoKLQkJCQkvKmlnbm9yZSB0aGlzICovCi0JCQkJCWJyZWFrOwotCQkJY2FzZSBORVRERVZfRE9XTjoKLQkJCQlicmVhazsKLQotCQkJY2FzZSBORVRERVZfVVA6Ci0JCQkJYnJlYWs7Ci0KLQkJCWNhc2UgTkVUREVWX1JFR0lTVEVSOgotCQkJCSAvKiBJbmNyZW1lbnQgdGhlIFJlZmVyZW5jZSBDb3VudCBmb3IgInZldGgwIiAqLwotCQkJCSBCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9JTklURVhJVCwgRFJWX0VOVFJZLCBEQkdfTFZMX0FMTCwgIlJlZ2lzdGVyIFJlZkNvdW50OiAleFxuIiwKLQkJCQkJCQkJCW5ldGRldl9yZWZjbnRfcmVhZChuZGV2KSk7Ci0JCQkJIGRldl9ob2xkKG5kZXYpOwotCQkJCSBicmVhazsKLQotCQkJY2FzZSBORVRERVZfVU5SRUdJU1RFUjoKLQkJCQkgLyogRGVjcmVtZW50IHRoZSBSZWZlcmVuY2UgQ291bnQgZm9yICJ2ZXRoMCIgKi8KLQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9JTklURVhJVCwgRFJWX0VOVFJZLCBEQkdfTFZMX0FMTCwgIlVucmVnaXN0ZXIgUmVmQ250OiAleFxuIiwKLQkJCQkJCQkJCW5ldGRldl9yZWZjbnRfcmVhZChuZGV2KSk7Ci0JCQkJZGV2X3B1dChuZGV2KTsKLQkJCQlicmVhazsKLQkJfTsKLQl9Ci0JcmV0dXJuIE5PVElGWV9ET05FOwotfQotCi0vKiBOb3RpZmllciBibG9jayB0byByZWNlaXZlIG5ldGRldmljZSBldmVudHMgKi8KLXN0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgYmNtX25vdGlmaWVyX2Jsb2NrID0KLXsKLQkubm90aWZpZXJfY2FsbCA9IGJjbV9ub3RpZnlfZXZlbnQsCi19OwotCiBzdHJ1Y3QgbmV0X2RldmljZSAqZ2JscG5ldGRldjsKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBwcm90by10eXBlIG9mIGxvd2VyIGZ1bmN0aW9uICovCi0jaWZkZWYgQkNNX1NITV9JTlRFUkZBQ0UKLWNvbnN0IGNoYXIgKmJjbVZpcnREZXZpY2VOYW1lPSJiY21ldGgiOwotI2VuZGlmCiAKIHN0YXRpYyBJTlQgYmNtX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKLSAgICBQTUlOSV9BREFQVEVSIEFkYXB0ZXIgPSBOVUxMIDsgLy8oUE1JTklfQURBUFRFUilkZXYtPnByaXY7Ci0JQWRhcHRlciA9IEdFVF9CQ01fQURBUFRFUihkZXYpOwotICAgIEJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX0lOSVRFWElULCBEUlZfRU5UUlksIERCR19MVkxfQUxMLCAiPT09PT09PiIpOwotICAgIGlmKEFkYXB0ZXItPmZ3X2Rvd25sb2FkX2RvbmU9PUZBTFNFKQotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLQlBZGFwdGVyLT5pZl91cD0xOwotCWlmKEFkYXB0ZXItPkxpbmtVcFN0YXR1cyA9PSAxKXsKLQkJaWYobmV0aWZfcXVldWVfc3RvcHBlZChBZGFwdGVyLT5kZXYpKXsKLQkJCW5ldGlmX2NhcnJpZXJfb24oQWRhcHRlci0+ZGV2KTsKLQkJCW5ldGlmX3N0YXJ0X3F1ZXVlKEFkYXB0ZXItPmRldik7Ci0JCX0KKwlQTUlOSV9BREFQVEVSIEFkYXB0ZXIgPSBHRVRfQkNNX0FEQVBURVIoZGV2KTsKKworCWlmIChBZGFwdGVyLT5md19kb3dubG9hZF9kb25lID09IEZBTFNFKSB7CisJCXByX25vdGljZShQRlggIiVzOiBsaW5rIHVwIGZhaWxlZCAoZG93bmxvYWQgaW4gcHJvZ3Jlc3MpXG4iLAorIAkJCSAgZGV2LT5uYW1lKTsKKwkJcmV0dXJuIC1FQlVTWTsKIAl9CiAKLQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9JTklURVhJVCwgRFJWX0VOVFJZLCBEQkdfTFZMX0FMTCwgIjw9PT09PT0iKTsKLSAgICByZXR1cm4gMDsKLX0KKwlpZiAobmV0aWZfbXNnX2lmdXAoQWRhcHRlcikpCisJCXByX2luZm8oUEZYICIlczogZW5hYmxpbmcgaW50ZXJmYWNlXG4iLCBkZXYtPm5hbWUpOwogCi1zdGF0aWMgSU5UIGJjbV9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQotewotICAgUE1JTklfQURBUFRFUiBBZGFwdGVyID0gTlVMTCA7Ly9ncGFkYXB0ZXIgOwotICAgQWRhcHRlciA9IEdFVF9CQ01fQURBUFRFUihkZXYpOwotICAgIEJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX0lOSVRFWElULCBEUlZfRU5UUlksIERCR19MVkxfQUxMLCAiPT09PT0+Iik7Ci0JQWRhcHRlci0+aWZfdXA9MDsKLQlpZighbmV0aWZfcXVldWVfc3RvcHBlZChkZXYpKSB7Ci0JCW5ldGlmX2NhcnJpZXJfb2ZmKGRldik7Ci0JICAgIG5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwlpZiAoQWRhcHRlci0+TGlua1VwU3RhdHVzKSB7CisJCWlmIChuZXRpZl9tc2dfbGluayhBZGFwdGVyKSkKKwkJCXByX2luZm8oUEZYICIlczogbGluayB1cFxuIiwgZGV2LT5uYW1lKTsKKworCQluZXRpZl9jYXJyaWVyX29uKEFkYXB0ZXItPmRldik7CisJCW5ldGlmX3N0YXJ0X3F1ZXVlKEFkYXB0ZXItPmRldik7CiAJfQotICAgIEJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX0lOSVRFWElULCBEUlZfRU5UUlksIERCR19MVkxfQUxMLCI8PT09PT0iKTsKLSAgICByZXR1cm4gMDsKLX0KLQotc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpiY21fZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCi17Ci0gICAgUExJTlVYX0RFUF9EQVRBIHBMaW51eERhdGE9TlVMTDsKLQlQTUlOSV9BREFQVEVSIEFkYXB0ZXIgPSBOVUxMIDsvLyBncGFkYXB0ZXIgOwotCUFkYXB0ZXIgPSBHRVRfQkNNX0FEQVBURVIoZGV2KTsKLSAgICBwTGludXhEYXRhID0gKFBMSU5VWF9ERVBfREFUQSkoQWRhcHRlci0+cHZPc0RlcERhdGEpOwotCi0gICAgLy9CQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9JTklURVhJVCwgRFJWX0VOVFJZLCBEQkdfTFZMX0FMTCwgIkRldiA9ICVwLCBwTGludXhEYXRhID0gJXAiLCBkZXYsIHBMaW51eERhdGEpOwotCXBMaW51eERhdGEtPm5ldHN0YXRzLnJ4X3BhY2tldHM9YXRvbWljX3JlYWQoJkFkYXB0ZXItPlJ4Um9sbE92ZXJDb3VudCkqNjQqMTAyNCtBZGFwdGVyLT5QcmV2TnVtUmVjdkRlc2NzOwotCXBMaW51eERhdGEtPm5ldHN0YXRzLnJ4X2J5dGVzPWF0b21pY19yZWFkKCZBZGFwdGVyLT5Hb29kUnhCeXRlQ291bnQpK2F0b21pY19yZWFkKCZBZGFwdGVyLT5CYWRSeEJ5dGVDb3VudCk7Ci0JcExpbnV4RGF0YS0+bmV0c3RhdHMucnhfZHJvcHBlZD1hdG9taWNfcmVhZCgmQWRhcHRlci0+UnhQYWNrZXREcm9wcGVkQ291bnQpOwotCXBMaW51eERhdGEtPm5ldHN0YXRzLnJ4X2Vycm9ycz1hdG9taWNfcmVhZCgmQWRhcHRlci0+UnhQYWNrZXREcm9wcGVkQ291bnQpOwotCXBMaW51eERhdGEtPm5ldHN0YXRzLnJ4X2xlbmd0aF9lcnJvcnM9MDsKLQlwTGludXhEYXRhLT5uZXRzdGF0cy5yeF9mcmFtZV9lcnJvcnM9MDsKLQlwTGludXhEYXRhLT5uZXRzdGF0cy5yeF9jcmNfZXJyb3JzPTA7Ci0JcExpbnV4RGF0YS0+bmV0c3RhdHMudHhfYnl0ZXM9YXRvbWljX3JlYWQoJkFkYXB0ZXItPkdvb2RUeEJ5dGVDb3VudCk7Ci0JcExpbnV4RGF0YS0+bmV0c3RhdHMudHhfcGFja2V0cz1hdG9taWNfcmVhZCgmQWRhcHRlci0+VHhUb3RhbFBhY2tldENvdW50KTsKLQlwTGludXhEYXRhLT5uZXRzdGF0cy50eF9kcm9wcGVkPWF0b21pY19yZWFkKCZBZGFwdGVyLT5UeERyb3BwZWRQYWNrZXRDb3VudCk7Ci0KLSAgICByZXR1cm4gJihwTGludXhEYXRhLT5uZXRzdGF0cyk7Ci19Ci0vKioKLUBpbmdyb3VwIGluaXRfZnVuY3Rpb25zCi1SZWdpc3RlciBvdGhlciBkcml2ZXIgZW50cnkgcG9pbnRzIHdpdGggdGhlIGtlcm5lbAotKi8KLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiwgNiwgMjkpCi1zdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfb3BzIGJjbU5ldERldk9wcyA9IHsKLSAgICAubmRvX29wZW4JCT0gYmNtX29wZW4sCi0gICAgLm5kb19zdG9wIAkJPSBiY21fY2xvc2UsCi0gICAgLm5kb19nZXRfc3RhdHMgCT0gYmNtX2dldF9zdGF0cywKLSAgICAubmRvX3N0YXJ0X3htaXQJPSBiY21fdHJhbnNtaXQsCi0gICAgLm5kb19jaGFuZ2VfbXR1CT0gZXRoX2NoYW5nZV9tdHUsCi0gICAgLm5kb19zZXRfbWFjX2FkZHJlc3MgPSBldGhfbWFjX2FkZHIsCi0gICAgLm5kb192YWxpZGF0ZV9hZGRyCT0gZXRoX3ZhbGlkYXRlX2FkZHIsCi19OwotI2VuZGlmCi0KLWludCByZWdpc3Rlcl9uZXR3b3JrZGV2KFBNSU5JX0FEQVBURVIgQWRhcHRlcikKLXsKLQlpbnQgcmVzdWx0PTA7Ci0jaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwyNykKLQl2b2lkICoqdGVtcCA9IE5VTEw7IC8qIGFjdHVhbGx5IHdlJ3JlICphbGxvY2F0aW5nKiB0aGUgZGV2aWNlIGluIGFsbG9jX2V0aGVyZGV2ICovCi0jZW5kaWYKLQlBZGFwdGVyLT5kZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2YoUE1JTklfQURBUFRFUikpOwotCWlmKCFBZGFwdGVyLT5kZXYpCi0JewotCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9JTklURVhJVCwgRFJWX0VOVFJZLCBEQkdfTFZMX0FMTCwgIkVSUjogTm8gRGV2Iik7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQlnYmxwbmV0ZGV2CQkJCQkJCT0gQWRhcHRlci0+ZGV2OwotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwyNykKLQlBZGFwdGVyLT5kZXYtPnByaXYgICAgICAJCQk9IEFkYXB0ZXI7Ci0jZWxzZQotCXRlbXAgPSBuZXRkZXZfcHJpdihBZGFwdGVyLT5kZXYpOwotCSp0ZW1wID0gKHZvaWQgKilBZGFwdGVyOwotI2VuZGlmCi0JLy9CQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsICJpbml0IGFkYXB0ZXJwdHI6ICV4ICV4XG4iLCAoVUlOVClBZGFwdGVyLCB0ZW1wKTsKLQotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLCA2LCAyOSkKLSAgICAgICAgQWRhcHRlci0+ZGV2LT5uZXRkZXZfb3BzICAgICAgICAgICAgICAgID0gJmJjbU5ldERldk9wczsKLSNlbHNlCi0JQWRhcHRlci0+ZGV2LT5vcGVuICAgICAgCQkJPSBiY21fb3BlbjsKLQlBZGFwdGVyLT5kZXYtPnN0b3AgICAgICAgICAgICAgICAJPSBiY21fY2xvc2U7Ci0JQWRhcHRlci0+ZGV2LT5nZXRfc3RhdHMgICAgICAgICAgCT0gYmNtX2dldF9zdGF0czsKLQlBZGFwdGVyLT5kZXYtPmhhcmRfc3RhcnRfeG1pdCAgICAJPSBiY21fdHJhbnNtaXQ7Ci0JQWRhcHRlci0+ZGV2LT5oYXJkX2hlYWRlcl9sZW4gICAgCT0gRVRIX0hMRU4gKyBMRUFERVJfU0laRTsKLSNlbmRpZgotCi0jaWZuZGVmIEJDTV9TSE1fSU5URVJGQUNFCi0JQWRhcHRlci0+ZGV2LT5tdHUJCQkJCT0gTVRVX1NJWkU7IC8qIDE0MDAgQnl0ZXMgKi8KLQkvKiBSZWFkIHRoZSBNQUMgQWRkcmVzcyBmcm9tIEVFUFJPTSAqLwotCVJlYWRNYWNBZGRyZXNzRnJvbU5WTShBZGFwdGVyKTsKLQotCi0JLyogUmVnaXN0ZXIgdGhlIG5vdGlmaWVyIGJsb2NrIGZvciBnZXR0aW5nIG5ldGRldmljZSBldmVudHMgKi8KLQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9JTklURVhJVCwgRFJWX0VOVFJZLCBEQkdfTFZMX0FMTCwgIlJlZ2lzdGVyaW5nIG5ldGRldmljZSBub3RpZmllclxuIik7Ci0JcmVzdWx0ID0gcmVnaXN0ZXJfbmV0ZGV2aWNlX25vdGlmaWVyKCZiY21fbm90aWZpZXJfYmxvY2spOwotCWlmKHJlc3VsdCkKLQl7Ci0JCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX0lOSVRFWElULCBEUlZfRU5UUlksIERCR19MVkxfQUxMLCAiQkNNIE5vdGlmaWVyIEJsb2NrIGRpZCBub3QgZ2V0IHJlZ2lzdGVyZWQiKTsKLQkJQWRhcHRlci0+Yk5ldGRldmljZU5vdGlmaWVyUmVnaXN0ZXJlZCA9IEZBTFNFOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQllbHNlCi0JewotCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9JTklURVhJVCwgRFJWX0VOVFJZLCBEQkdfTFZMX0FMTCwgIkJDTSBOb3RpZmllciBnb3QgUmVnaXN0ZXJlZCIpOwotCQlBZGFwdGVyLT5iTmV0ZGV2aWNlTm90aWZpZXJSZWdpc3RlcmVkID0gVFJVRTsKLQl9Ci0KLSNlbHNlCi0KLQlBZGFwdGVyLT5kZXYtPm10dQkJCT0gQ1BFX01UVV9TSVpFOwotCi0jaWYgMAotCS8vZm9yIENQRSAtIGhhcmNvZGUgdGhlIHZpcnR1YWwgbWFjIGFkZHJlc3MKLQlBZGFwdGVyLT5kZXYtPmRldl9hZGRyWzBdID0gIE1JSV9XSU1BWF9NQUNBRERSRVNTWzBdOwotCUFkYXB0ZXItPmRldi0+ZGV2X2FkZHJbMV0gPSAgTUlJX1dJTUFYX01BQ0FERFJFU1NbMV07Ci0JQWRhcHRlci0+ZGV2LT5kZXZfYWRkclsyXSA9ICBNSUlfV0lNQVhfTUFDQUREUkVTU1syXTsKLQlBZGFwdGVyLT5kZXYtPmRldl9hZGRyWzNdID0gIE1JSV9XSU1BWF9NQUNBRERSRVNTWzNdOwotCUFkYXB0ZXItPmRldi0+ZGV2X2FkZHJbNF0gPSAgTUlJX1dJTUFYX01BQ0FERFJFU1NbNF07Ci0JQWRhcHRlci0+ZGV2LT5kZXZfYWRkcls1XSA9ICBNSUlfV0lNQVhfTUFDQUREUkVTU1s1XTsKLSNlbHNlCi0JUmVhZE1hY0FkZHJlc3NGcm9tTlZNKEFkYXB0ZXIpOwotI2VuZGlmCi0Jc3RyY3B5KEFkYXB0ZXItPmRldi0+bmFtZSwgYmNtVmlydERldmljZU5hbWUpOyAvL0NvcHkgdGhlIGRldmljZSBuYW1lCi0KLSNlbmRpZgotCi0JcmVzdWx0ID0gcmVnaXN0ZXJfbmV0ZGV2KEFkYXB0ZXItPmRldik7Ci0JaWYgKCFyZXN1bHQpCi0JewotCQlBZGFwdGVyLT5iTmV0d29ya0ludGVyZmFjZVJlZ2lzdGVyZWQgPSBUUlVFIDsKLQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfSU5JVEVYSVQsIERSVl9FTlRSWSwgREJHX0xWTF9BTEwsICJCZWNlZW0gTmV0d29yayBkZXZpY2UgbmFtZSBpcyAlcyEiLCBBZGFwdGVyLT5kZXYtPm5hbWUpOwotCX0KLQllbHNlCi0JewotICAgIAlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9JTklURVhJVCwgRFJWX0VOVFJZLCBEQkdfTFZMX0FMTCwgIk5ldHdvcmsgZGV2aWNlIGNhbiBub3QgYmUgcmVnaXN0ZXJlZCEiKTsKLQkJQWRhcHRlci0+Yk5ldHdvcmtJbnRlcmZhY2VSZWdpc3RlcmVkID0gRkFMU0UgOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotI2lmIDAKLSBBZGFwdGVyLT5zdERlYnVnU3RhdGUuZGVidWdfbGV2ZWwgPSBEQkdfTFZMX0NVUlI7Ci0gQWRhcHRlci0+c3REZWJ1Z1N0YXRlLnR5cGUgPShVSU5UKTB4ZmZmZmZmZmY7Ci0gQWRhcHRlci0+c3REZWJ1Z1N0YXRlLnN1YnR5cGVbREJHX1RZUEVfT1RIRVJTXSA9IDB4ZmZmZmZmZmY7Ci0gQWRhcHRlci0+c3REZWJ1Z1N0YXRlLnN1YnR5cGVbREJHX1RZUEVfUlhdID0gMHhmZmZmZmZmZjsKLSBBZGFwdGVyLT5zdERlYnVnU3RhdGUuc3VidHlwZVtEQkdfVFlQRV9UWF0gPSAweGZmZmZmZmZmOwotIEFkYXB0ZXItPnN0RGVidWdTdGF0ZS5zdWJ0eXBlW0RCR19UWVBFX0lOSVRFWElUXSA9IDB4ZmZmZmZmZmY7Ci0KLSBwcmludGsoIi0tLS0tLS1wc19hZGFwdGVyLT5zdERlYnVnU3RhdGUudHlwZT0leFxuIixBZGFwdGVyLT5zdERlYnVnU3RhdGUudHlwZSk7Ci0gcHJpbnRrKCItLS0tLS0tcHNfYWRhcHRlci0+c3REZWJ1Z1N0YXRlLnN1YnR5cGVbREJHX1RZUEVfT1RIRVJTXT0leFxuIixBZGFwdGVyLT5zdERlYnVnU3RhdGUuc3VidHlwZVtEQkdfVFlQRV9PVEhFUlNdKTsKLSBwcmludGsoIi0tLS0tLS1wc19hZGFwdGVyLT5zdERlYnVnU3RhdGUuc3VidHlwZVtEQkdfVFlQRV9SWF09JXhcbiIsQWRhcHRlci0+c3REZWJ1Z1N0YXRlLnN1YnR5cGVbREJHX1RZUEVfUlhdKTsKLSBwcmludGsoIi0tLS0tLS1wc19hZGFwdGVyLT5zdERlYnVnU3RhdGUuc3VidHlwZVtEQkdfVFlQRV9UWF09JXhcbiIsQWRhcHRlci0+c3REZWJ1Z1N0YXRlLnN1YnR5cGVbREJHX1RZUEVfVFhdKTsKLSNlbmRpZgogCiAJcmV0dXJuIDA7CiB9CiAKLXZvaWQgYmNtX3VucmVnaXN0ZXJfbmV0d29ya2RldihQTUlOSV9BREFQVEVSIEFkYXB0ZXIpCitzdGF0aWMgSU5UIGJjbV9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewotCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX0lOSVRFWElULCBEUlZfRU5UUlksIERCR19MVkxfQUxMLCAiVW5yZWdpc3RlcmluZyB0aGUgTmV0IERldi4uLlxuIik7Ci0JaWYoQWRhcHRlci0+ZGV2ICYmICFJU19FUlIoQWRhcHRlci0+ZGV2KSAmJiBBZGFwdGVyLT5iTmV0d29ya0ludGVyZmFjZVJlZ2lzdGVyZWQpCi0JCXVucmVnaXN0ZXJfbmV0ZGV2KEFkYXB0ZXItPmRldik7Ci0JCS8qIFVucmVnaXN0ZXIgdGhlIG5vdGlmaWVyIGJsb2NrICovCi0JaWYoQWRhcHRlci0+Yk5ldGRldmljZU5vdGlmaWVyUmVnaXN0ZXJlZCA9PSBUUlVFKQotCXsKLQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9JTklURVhJVCwgRFJWX0VOVFJZLCBEQkdfTFZMX0FMTCwgIlVucmVnaXN0ZXJpbmcgbmV0ZGV2aWNlIG5vdGlmaWVyXG4iKTsKLQkJCXVucmVnaXN0ZXJfbmV0ZGV2aWNlX25vdGlmaWVyKCZiY21fbm90aWZpZXJfYmxvY2spOwotICB9CisJUE1JTklfQURBUFRFUiBBZGFwdGVyID0gR0VUX0JDTV9BREFQVEVSKGRldik7CisKKwlpZiAobmV0aWZfbXNnX2lmZG93bihBZGFwdGVyKSkKKwkJcHJfaW5mbyhQRlggIiVzOiBkaXNhYmxpbmcgaW50ZXJmYWNlXG4iLCBkZXYtPm5hbWUpOworCisJbmV0aWZfY2Fycmllcl9vZmYoZGV2KTsKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKwlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBiY21faW5pdCh2b2lkKQorc3RhdGljIHUxNiBiY21fc2VsZWN0X3F1ZXVlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBza19idWZmICpza2IpCiB7CisJcmV0dXJuIENsYXNzaWZ5UGFja2V0KG5ldGRldl9wcml2KGRldiksIHNrYik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIEZ1bmN0aW9uICAgIC0JYmNtX3RyYW5zbWl0KCkKKyoKKyogRGVzY3JpcHRpb24gLSBUaGlzIGlzIHRoZSBtYWluIHRyYW5zbWl0IGZ1bmN0aW9uIGZvciBvdXIgdmlydHVhbAorKgkJaW50ZXJmYWNlKGV0aDApLiBJdCBoYW5kbGVzIHRoZSBBUlAgcGFja2V0cy4gSXQKKyoJCWNsb25lcyB0aGlzIHBhY2tldCBhbmQgdGhlbiBRdWV1ZSBpdCB0byBhIHN1aXRhYmxlCisqIAkJUXVldWUuIFRoZW4gY2FsbHMgdGhlIHRyYW5zbWl0X3BhY2tldCgpLgorKgorKiBQYXJhbWV0ZXIgICAtCSBza2IgLSBQb2ludGVyIHRvIHRoZSBzb2NrZXQgYnVmZmVyIHN0cnVjdHVyZQorKgkJIGRldiAtIFBvaW50ZXIgdG8gdGhlIHZpcnR1YWwgbmV0IGRldmljZSBzdHJ1Y3R1cmUKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIG5ldGRldl90eF90IGJjbV90cmFuc21pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCVBNSU5JX0FEQVBURVIgQWRhcHRlciA9IEdFVF9CQ01fQURBUFRFUihkZXYpOworCXUxNiBxaW5kZXggPSBza2JfZ2V0X3F1ZXVlX21hcHBpbmcoc2tiKTsKKworCisJaWYgKEFkYXB0ZXItPmRldmljZV9yZW1vdmVkIHx8ICFBZGFwdGVyLT5MaW5rVXBTdGF0dXMpCisJCWdvdG8gZHJvcDsKKworCWlmIChBZGFwdGVyLT5UcmFuc2Zlck1vZGUgIT0gSVBfUEFDS0VUX09OTFlfTU9ERSkKKwkJZ290byBkcm9wOworCisJaWYgKElOVkFMSURfUVVFVUVfSU5ERVggPT0gcWluZGV4KQorCQlnb3RvIGRyb3A7CisKKwlpZiAoQWRhcHRlci0+UGFja0luZm9bcWluZGV4XS51aUN1cnJlbnRQYWNrZXRzT25Ib3N0ID49CisJICAgIFNGX01BWF9BTExPV0VEX1BBQ0tFVFNfVE9fQkFDS1VQKQorCQlyZXR1cm4gTkVUREVWX1RYX0JVU1k7CisKKwkvKiBOb3cgRW5xdWV1ZSB0aGUgcGFja2V0ICovCisJaWYgKG5ldGlmX21zZ190eF9xdWV1ZWQoQWRhcHRlcikpCisJCXByX2luZm8oUEZYICIlczogZW5xdWV1ZWluZyBwYWNrZXQgdG8gcXVldWUgJWRcbiIsCisJCQlkZXYtPm5hbWUsIHFpbmRleCk7CisKKwlzcGluX2xvY2soJkFkYXB0ZXItPlBhY2tJbmZvW3FpbmRleF0uU0ZRdWV1ZUxvY2spOworCUFkYXB0ZXItPlBhY2tJbmZvW3FpbmRleF0udWlDdXJyZW50Qnl0ZXNPbkhvc3QgKz0gc2tiLT5sZW47CisJQWRhcHRlci0+UGFja0luZm9bcWluZGV4XS51aUN1cnJlbnRQYWNrZXRzT25Ib3N0Kys7CisKKwkqKChCX1VJTlQzMiAqKSBza2ItPmNiICsgU0tCX0NCX0xBVEVOQ1lfT0ZGU0VUKSA9IGppZmZpZXM7CisJRU5RVUVVRVBBQ0tFVChBZGFwdGVyLT5QYWNrSW5mb1txaW5kZXhdLkZpcnN0VHhRdWV1ZSwKKwkJICAgICAgQWRhcHRlci0+UGFja0luZm9bcWluZGV4XS5MYXN0VHhRdWV1ZSwgc2tiKTsKKwlhdG9taWNfaW5jKCZBZGFwdGVyLT5Ub3RhbFBhY2tldENvdW50KTsKKwlzcGluX3VubG9jaygmQWRhcHRlci0+UGFja0luZm9bcWluZGV4XS5TRlF1ZXVlTG9jayk7CisKKwkvKiBGSVhNRSAtIHRoaXMgaXMgcmFjeSBhbmQgaW5jb3JyZWN0LCByZXBsYWNlIHdpdGggd29yayBxdWV1ZSAqLworCWlmICghYXRvbWljX3JlYWQoJkFkYXB0ZXItPlR4UGt0QXZhaWwpKSB7CisJCWF0b21pY19zZXQoJkFkYXB0ZXItPlR4UGt0QXZhaWwsIDEpOworCQl3YWtlX3VwKCZBZGFwdGVyLT50eF9wYWNrZXRfd2FpdF9xdWV1ZSk7CisJfQorCXJldHVybiBORVRERVZfVFhfT0s7CisKKyBkcm9wOgorCWRldl9rZnJlZV9za2Ioc2tiKTsKKwlyZXR1cm4gTkVUREVWX1RYX09LOworfQorCisKKworLyoqCitAaW5ncm91cCBpbml0X2Z1bmN0aW9ucworUmVnaXN0ZXIgb3RoZXIgZHJpdmVyIGVudHJ5IHBvaW50cyB3aXRoIHRoZSBrZXJuZWwKKyovCitzdGF0aWMgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzIGJjbU5ldERldk9wcyA9IHsKKyAgICAubmRvX29wZW4JCT0gYmNtX29wZW4sCisgICAgLm5kb19zdG9wIAkJPSBiY21fY2xvc2UsCisgICAgLm5kb19zdGFydF94bWl0CT0gYmNtX3RyYW5zbWl0LAorICAgIC5uZG9fY2hhbmdlX210dQk9IGV0aF9jaGFuZ2VfbXR1LAorICAgIC5uZG9fc2V0X21hY19hZGRyZXNzID0gZXRoX21hY19hZGRyLAorICAgIC5uZG9fdmFsaWRhdGVfYWRkcgk9IGV0aF92YWxpZGF0ZV9hZGRyLAorICAgIC5uZG9fc2VsZWN0X3F1ZXVlCT0gYmNtX3NlbGVjdF9xdWV1ZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlX3R5cGUgd2ltYXhfdHlwZSA9IHsKKwkubmFtZQk9ICJ3aW1heCIsCit9OworCitzdGF0aWMgaW50IGJjbV9nZXRfc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfY21kICpjbWQpCit7CisJY21kLT5zdXBwb3J0ZWQJCT0gMDsKKwljbWQtPmFkdmVydGlzaW5nCT0gMDsKKwljbWQtPnNwZWVkCQk9IFNQRUVEXzEwMDAwOworCWNtZC0+ZHVwbGV4CQk9IERVUExFWF9GVUxMOworCWNtZC0+cG9ydAkJPSBQT1JUX1RQOworCWNtZC0+cGh5X2FkZHJlc3MJPSAwOworCWNtZC0+dHJhbnNjZWl2ZXIJPSBYQ1ZSX0lOVEVSTkFMOworCWNtZC0+YXV0b25lZwkJPSBBVVRPTkVHX0RJU0FCTEU7CisJY21kLT5tYXh0eHBrdAkJPSAwOworCWNtZC0+bWF4cnhwa3QJCT0gMDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYmNtX2dldF9kcnZpbmZvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2RydmluZm8gKmluZm8pCit7CisJUE1JTklfQURBUFRFUiBBZGFwdGVyID0gR0VUX0JDTV9BREFQVEVSKGRldik7CisJUFNfSU5URVJGQUNFX0FEQVBURVIgcHNJbnRmQWRhcHRlciA9IEFkYXB0ZXItPnB2SW50ZXJmYWNlQWRhcHRlcjsKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiA9IGludGVyZmFjZV90b191c2JkZXYocHNJbnRmQWRhcHRlci0+aW50ZXJmYWNlKTsKKworCXN0cmNweShpbmZvLT5kcml2ZXIsIERSVl9OQU1FKTsKKwlzdHJjcHkoaW5mby0+dmVyc2lvbiwgRFJWX1ZFUlNJT04pOworCXNucHJpbnRmKGluZm8tPmZ3X3ZlcnNpb24sIHNpemVvZihpbmZvLT5md192ZXJzaW9uKSwgIiV1LiV1IiwKKwkJIEFkYXB0ZXItPnVpRmxhc2hMYXlvdXRNYWpvclZlcnNpb24sCisJCSBBZGFwdGVyLT51aUZsYXNoTGF5b3V0TWlub3JWZXJzaW9uKTsKKworCXVzYl9tYWtlX3BhdGgodWRldiwgaW5mby0+YnVzX2luZm8sIHNpemVvZihpbmZvLT5idXNfaW5mbykpOworfQorCitzdGF0aWMgdTMyIGJjbV9nZXRfbGluayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCVBNSU5JX0FEQVBURVIgQWRhcHRlciA9IEdFVF9CQ01fQURBUFRFUihkZXYpOworCisJcmV0dXJuIEFkYXB0ZXItPkxpbmtVcFN0YXR1czsKK30KKworc3RhdGljIHUzMiBiY21fZ2V0X21zZ2xldmVsIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCVBNSU5JX0FEQVBURVIgQWRhcHRlciA9IEdFVF9CQ01fQURBUFRFUihkZXYpOworCisJcmV0dXJuIEFkYXB0ZXItPm1zZ19lbmFibGU7Cit9CisKK3N0YXRpYyB2b2lkIGJjbV9zZXRfbXNnbGV2ZWwgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBsZXZlbCkKK3sKKwlQTUlOSV9BREFQVEVSIEFkYXB0ZXIgPSBHRVRfQkNNX0FEQVBURVIoZGV2KTsKKworCUFkYXB0ZXItPm1zZ19lbmFibGUgPSBsZXZlbDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBldGh0b29sX29wcyBiY21fZXRodG9vbF9vcHMgPSB7CisJLmdldF9zZXR0aW5ncwk9IGJjbV9nZXRfc2V0dGluZ3MsCisJLmdldF9kcnZpbmZvCT0gYmNtX2dldF9kcnZpbmZvLAorCS5nZXRfbGluayAJPSBiY21fZ2V0X2xpbmssCisJLmdldF9tc2dsZXZlbAk9IGJjbV9nZXRfbXNnbGV2ZWwsCisJLnNldF9tc2dsZXZlbAk9IGJjbV9zZXRfbXNnbGV2ZWwsCit9OworCitpbnQgcmVnaXN0ZXJfbmV0d29ya2RldihQTUlOSV9BREFQVEVSIEFkYXB0ZXIpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldCA9IEFkYXB0ZXItPmRldjsKKwlQU19JTlRFUkZBQ0VfQURBUFRFUiBJbnRmQWRhcHRlciA9IEFkYXB0ZXItPnB2SW50ZXJmYWNlQWRhcHRlcjsKKwlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqdWRldiA9IEludGZBZGFwdGVyLT5pbnRlcmZhY2U7CisJc3RydWN0IHVzYl9kZXZpY2UgKnhkZXYgPSBJbnRmQWRhcHRlci0+dWRldjsKKwogCWludCByZXN1bHQ7Ci0gICAJcmVzdWx0ID0gSW50ZXJmYWNlSW5pdGlhbGl6ZSgpOwotCWlmKHJlc3VsdCkKLQl7Ci0gCQlwcmludGsoIkluaXRpYWxpc2F0aW9uIGZhaWxlZCBmb3IgdXNiYmNtIik7CisKKwluZXQtPm5ldGRldl9vcHMgPSAmYmNtTmV0RGV2T3BzOworCW5ldC0+ZXRodG9vbF9vcHMgPSAmYmNtX2V0aHRvb2xfb3BzOworCW5ldC0+bXR1ID0gTVRVX1NJWkU7CS8qIDE0MDAgQnl0ZXMgKi8KKwluZXQtPnR4X3F1ZXVlX2xlbiA9IFRYX1FMRU47CisJbmV0LT5mbGFncyB8PSBJRkZfTk9BUlA7CisKKwluZXRpZl9jYXJyaWVyX29mZihuZXQpOworCisJU0VUX05FVERFVl9ERVZUWVBFKG5ldCwgJndpbWF4X3R5cGUpOworCisJLyogUmVhZCB0aGUgTUFDIEFkZHJlc3MgZnJvbSBFRVBST00gKi8KKwlyZXN1bHQgPSBSZWFkTWFjQWRkcmVzc0Zyb21OVk0oQWRhcHRlcik7CisJaWYgKHJlc3VsdCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlkZXZfZXJyKCZ1ZGV2LT5kZXYsCisJCQlQRlggIkVycm9yIGluIFJlYWRpbmcgdGhlIG1hYyBBZGRyZXNzOiAlZCIsIHJlc3VsdCk7CisgCQlyZXR1cm4gLUVJTzsKIAl9Ci0JZWxzZQotCXsKLQkJcHJpbnRrKCJJbml0aWFsaXNlZCB1c2JiY20iKTsKLQl9Ci0JcmV0dXJuIHJlc3VsdDsKKworCXJlc3VsdCA9IHJlZ2lzdGVyX25ldGRldihuZXQpOworCWlmIChyZXN1bHQpCisJCXJldHVybiByZXN1bHQ7CisKKwlnYmxwbmV0ZGV2ID0gQWRhcHRlci0+ZGV2OworCisJaWYgKG5ldGlmX21zZ19wcm9iZShBZGFwdGVyKSkKKwkJZGV2X2luZm8oJnVkZXYtPmRldiwgUEZYICIlczogcmVnaXN0ZXIgdXNiLSVzLSVzICVwTVxuIiwKKwkJCSBuZXQtPm5hbWUsIHhkZXYtPmJ1cy0+YnVzX25hbWUsIHhkZXYtPmRldnBhdGgsCisJCQkgbmV0LT5kZXZfYWRkcik7CisKKwlyZXR1cm4gMDsKIH0KIAotCi1zdGF0aWMgdm9pZCBiY21fZXhpdCh2b2lkKQordm9pZCB1bnJlZ2lzdGVyX25ldHdvcmtkZXYoUE1JTklfQURBUFRFUiBBZGFwdGVyKQogewotICAgIHByaW50aygiJXMgJXMgQ2FsbGluZyBJbnRlcmZhY2VFeGl0XG4iLF9fRklMRV9fLCBfX0ZVTkNUSU9OX18pOwotCUludGVyZmFjZUV4aXQoKTsKLSAgICBwcmludGsoIiVzICVzIEludGVyZmFjZUV4aXQgcmV0dXJuZWRcbiIsX19GSUxFX18sIF9fRlVOQ1RJT05fXyk7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldCA9IEFkYXB0ZXItPmRldjsKKwlQU19JTlRFUkZBQ0VfQURBUFRFUiBJbnRmQWRhcHRlciA9IEFkYXB0ZXItPnB2SW50ZXJmYWNlQWRhcHRlcjsKKwlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqdWRldiA9IEludGZBZGFwdGVyLT5pbnRlcmZhY2U7CisJc3RydWN0IHVzYl9kZXZpY2UgKnhkZXYgPSBJbnRmQWRhcHRlci0+dWRldjsKKworCWlmIChuZXRpZl9tc2dfcHJvYmUoQWRhcHRlcikpCisJCWRldl9pbmZvKCZ1ZGV2LT5kZXYsIFBGWCAiJXM6IHVucmVnaXN0ZXIgdXNiLSVzJXNcbiIsCisJCQkgbmV0LT5uYW1lLCB4ZGV2LT5idXMtPmJ1c19uYW1lLCB4ZGV2LT5kZXZwYXRoKTsKKyAKKwl1bnJlZ2lzdGVyX25ldGRldihBZGFwdGVyLT5kZXYpOwogfQotCi1tb2R1bGVfaW5pdChiY21faW5pdCk7Ci1tb2R1bGVfZXhpdChiY21fZXhpdCk7Ci1NT0RVTEVfTElDRU5TRSAoIkdQTCIpOwotCi0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iY20vQ21Ib3N0LmMgYi9kcml2ZXJzL3N0YWdpbmcvYmNtL0NtSG9zdC5jCmluZGV4IDZmMzg4YTMuLjVhYzQ1ODIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9iY20vQ21Ib3N0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JjbS9DbUhvc3QuYwpAQCAtMTUsNiArMTUsNyBAQAogCWVEZWxldGVDbGFzc2lmaWVyCiB9RV9DTEFTU0lGSUVSX0FDVElPTjsKIAorc3RhdGljIFVMT05HIEdldE5leHRUYXJnZXRCdWZmZXJMb2NhdGlvbihQTUlOSV9BREFQVEVSIEFkYXB0ZXIsQl9VSU5UMTYgdGlkKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBGdW5jdGlvbgkgIC0JU2VhcmNoU2ZpZApAQCAtMjgsNyArMjksNyBAQAogKiBSZXR1cm5zCSAgLSBRdWV1ZSBpbmRleCBmb3IgdGhpcyBTRklEKElmIG1hdGNoZWQpCiAJCQkJRWxzZSBJbnZhbGlkIFF1ZXVlIEluZGV4KElmIE5vdCBtYXRjaGVkKQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotX19pbmxpbmUgSU5UIFNlYXJjaFNmaWQoUE1JTklfQURBUFRFUiBBZGFwdGVyLFVJTlQgdWlTZmlkKQorSU5UIFNlYXJjaFNmaWQoUE1JTklfQURBUFRFUiBBZGFwdGVyLFVJTlQgdWlTZmlkKQogewogCUlOVCAJaUluZGV4PTA7CiAJZm9yKGlJbmRleD0oTk9fT0ZfUVVFVUVTLTEpOyBpSW5kZXg+PTA7IGlJbmRleC0tKQpAQCAtNDcsMjYgKzQ4LDE2IEBACiAqIFJldHVybnMJICAtIFF1ZXVlIGluZGV4IGZvciB0aGUgZnJlZSBTRklECiAqCQkJCUVsc2UgcmV0dXJucyBJbnZhbGlkIEluZGV4LgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLV9faW5saW5lIElOVCBTZWFyY2hGcmVlU2ZpZChQTUlOSV9BREFQVEVSIEFkYXB0ZXIpCitzdGF0aWMgSU5UIFNlYXJjaEZyZWVTZmlkKFBNSU5JX0FEQVBURVIgQWRhcHRlcikKIHsKIAlVSU5UIAl1aUluZGV4PTA7CisKIAlmb3IodWlJbmRleD0wOyB1aUluZGV4IDwgKE5PX09GX1FVRVVFUy0xKTsgdWlJbmRleCsrKQogCQlpZihBZGFwdGVyLT5QYWNrSW5mb1t1aUluZGV4XS51bFNGSUQ9PTApCiAJCQlyZXR1cm4gdWlJbmRleDsKIAlyZXR1cm4gTk9fT0ZfUVVFVUVTKzE7CiB9CiAKLV9faW5saW5lIGludCBTZWFyY2hWY2lkKFBNSU5JX0FEQVBURVIgQWRhcHRlcix1bnNpZ25lZCBzaG9ydCB1c1ZjaWQpCi17Ci0JIGludCBpSW5kZXg9MDsKLQlmb3IoaUluZGV4PShOT19PRl9RVUVVRVMtMSk7aUluZGV4Pj0wO2lJbmRleC0tKQotCQlpZihBZGFwdGVyLT5QYWNrSW5mb1tpSW5kZXhdLnVzVkNJRF9WYWx1ZSA9PSB1c1ZjaWQpCi0JCQlyZXR1cm4gaUluZGV4OwotCXJldHVybiBOT19PRl9RVUVVRVMrMTsKLQotfQotCi0KIC8qCiBGdW5jdGlvbjoJCQkJU2VhcmNoQ2xzaWQKIERlc2NyaXB0aW9uOgkJCVRoaXMgcm91dGludWUgd291bGQgc2VhcmNoIENsYXNzaWZpZXIgIGhhdmluZyBzcGVjaWZpZWQgQ2xhc3NpZmllcklEIGFzIGlucHV0IHBhcmFtZXRlcgpAQCAtNzYsNyArNjcsNyBAQAogUmV0dXJuOgkJCQkJaW50IDpDbGFzc2lmaWVyIHRhYmxlIGluZGV4IG9mIG1hdGNoaW5nIGVudHJ5CiAqLwogCi1fX2lubGluZSBpbnQgU2VhcmNoQ2xzaWQoUE1JTklfQURBUFRFUiBBZGFwdGVyLFVMT05HIHVsU0ZJRCxCX1VJTlQxNiAgdWlDbGFzc2lmaWVySUQpCitzdGF0aWMgaW50IFNlYXJjaENsc2lkKFBNSU5JX0FEQVBURVIgQWRhcHRlcixVTE9ORyB1bFNGSUQsQl9VSU5UMTYgIHVpQ2xhc3NpZmllcklEKQogewogCXVuc2lnbmVkIGludCB1aUNsYXNzaWZpZXJJbmRleCA9IDA7CiAJZm9yKHVpQ2xhc3NpZmllckluZGV4PTA7dWlDbGFzc2lmaWVySW5kZXg8TUFYX0NMQVNTSUZJRVJTO3VpQ2xhc3NpZmllckluZGV4KyspCkBAIC05NCw3ICs4NSw3IEBACiBUaGlzIHJvdXRpbnVlIHdvdWxkIHNlYXJjaCBGcmVlIGF2YWlsYWJsZSBDbGFzc2lmaWVyIGVudHJ5IGluIGNsYXNzaWZpZXIgdGFibGUuCiBAcmV0dXJuIGZyZWUgQ2xhc3NpZmllciBFbnRyeSBpbmRleCBpbiBjbGFzc2lmaWVyIHRhYmxlIGZvciBzcGVjaWZpZWQgU0YKICovCi1zdGF0aWMgX19pbmxpbmUgaW50IFNlYXJjaEZyZWVDbHNpZChQTUlOSV9BREFQVEVSIEFkYXB0ZXIgLyoqQWRhcHRlciBDb250ZXh0Ki8KK3N0YXRpYyBpbnQgU2VhcmNoRnJlZUNsc2lkKFBNSU5JX0FEQVBURVIgQWRhcHRlciAvKipBZGFwdGVyIENvbnRleHQqLwogCQkJCQkJKQogewogCXVuc2lnbmVkIGludCB1aUNsYXNzaWZpZXJJbmRleCA9IDA7CkBAIC0xMDYsNyArOTcsNyBAQAogCXJldHVybiBNQVhfQ0xBU1NJRklFUlMrMTsKIH0KIAotVk9JRCBkZWxldGVTRkJ5U2ZpZChQTUlOSV9BREFQVEVSIEFkYXB0ZXIsIFVJTlQgdWlTZWFyY2hSdWxlSW5kZXgpCitzdGF0aWMgVk9JRCBkZWxldGVTRkJ5U2ZpZChQTUlOSV9BREFQVEVSIEFkYXB0ZXIsIFVJTlQgdWlTZWFyY2hSdWxlSW5kZXgpCiB7CiAJLy9kZWxldGluZyBhbGwgdGhlIHBhY2tldCBoZWxkIGluIHRoZSBTRgogCWZsdXNoX3F1ZXVlKEFkYXB0ZXIsdWlTZWFyY2hSdWxlSW5kZXgpOwpAQCAtOTg1LDcgKzk3Niw3IEBACiAKIAlpZihBZGFwdGVyLT5QYWNrSW5mb1t1aVNlYXJjaFJ1bGVJbmRleF0ucHN0U0ZJbmRpY2F0aW9uKQogCXsKLQkJYmNtX2tmcmVlKEFkYXB0ZXItPlBhY2tJbmZvW3VpU2VhcmNoUnVsZUluZGV4XS5wc3RTRkluZGljYXRpb24pOworCQlrZnJlZShBZGFwdGVyLT5QYWNrSW5mb1t1aVNlYXJjaFJ1bGVJbmRleF0ucHN0U0ZJbmRpY2F0aW9uKTsKIAkJQWRhcHRlci0+UGFja0luZm9bdWlTZWFyY2hSdWxlSW5kZXhdLnBzdFNGSW5kaWNhdGlvbiA9IE5VTEw7CiAJfQogCUFkYXB0ZXItPlBhY2tJbmZvW3VpU2VhcmNoUnVsZUluZGV4XS5wc3RTRkluZGljYXRpb24gPSBwc3RBZGRJbmRpY2F0aW9uOwpAQCAtMTA2MSwxMiArMTA1Miw2IEBACiAJCXBzdEFkZEluZGljYXRpb24tPnNmQXV0aG9yaXplZFNldC51MzJNYXhUcmFmZmljQnVyc3QpOwogCUJDTV9ERUJVR19QUklOVCggQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIERVTVBfQ09OVFJPTCwgREJHX0xWTF9BTEwsICJ1MzJNaW5SZXNlcnZlZFRyYWZmaWNSYXRlCTogMHglWCIsCiAJCXBzdEFkZEluZGljYXRpb24tPnNmQXV0aG9yaXplZFNldC51MzJNaW5SZXNlcnZlZFRyYWZmaWNSYXRlKTsKLSNpZiAwCi0JQkNNX0RFQlVHX1BSSU5UKCBBZGFwdGVyLERCR19UWVBFX09USEVSUywgRFVNUF9DT05UUk9MLCBEQkdfTFZMX0FMTCwgICJ1MzJNaW5pbXVtVG9sZXJhYmxlVHJhZmZpY1JhdGUJOiAweCVYIiwKLQkJcHN0QWRkSW5kaWNhdGlvbi0+c2ZBdXRob3JpemVkU2V0LnUzMk1pbmltdW1Ub2xlcmFibGVUcmFmZmljUmF0ZSk7Ci0JQkNNX0RFQlVHX1BSSU5UKCBBZGFwdGVyLERCR19UWVBFX09USEVSUywgRFVNUF9DT05UUk9MLCBEQkdfTFZMX0FMTCwgICJ1MzJSZXF1ZXN0dHJhbnNtaXNzaW9uUG9saWN5CTogMHglWCIsCi0JCXBzdEFkZEluZGljYXRpb24tPnNmQXV0aG9yaXplZFNldC51MzJSZXF1ZXN0dHJhbnNtaXNzaW9uUG9saWN5KTsKLSNlbmRpZgogCUJDTV9ERUJVR19QUklOVCggQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIERVTVBfQ09OVFJPTCwgREJHX0xWTF9BTEwsICJ1OFZlbmRvclNwZWNpZmljUW9TUGFyYW1MZW5ndGgJOiAweCVYIiwKIAkJcHN0QWRkSW5kaWNhdGlvbi0+c2ZBdXRob3JpemVkU2V0LnU4VmVuZG9yU3BlY2lmaWNRb1NQYXJhbUxlbmd0aCk7CiAJQkNNX0RFQlVHX1BSSU5UKCBBZGFwdGVyLERCR19UWVBFX09USEVSUywgRFVNUF9DT05UUk9MLCBEQkdfTFZMX0FMTCwgInU4VmVuZG9yU3BlY2lmaWNRb1NQYXJhbQkJOiAweCVYIiwKQEAgLTExMTQsMTMgKzEwOTksNiBAQAogCQlwc3RBZGRJbmRpY2F0aW9uLT5zZkF1dGhvcml6ZWRTZXQudThQYWdpbmdQcmVmZXJlbmNlKTsKIAlCQ01fREVCVUdfUFJJTlQoIEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBEVU1QX0NPTlRST0wsIERCR19MVkxfQUxMLCAgInUxNlVuc29saWNpdGVkUG9sbGluZ0ludGVydmFsCQk6IDB4JVgiLAogCQlwc3RBZGRJbmRpY2F0aW9uLT5zZkF1dGhvcml6ZWRTZXQudTE2VW5zb2xpY2l0ZWRQb2xsaW5nSW50ZXJ2YWwpOwotI2lmIDAKLQlCQ01fREVCVUdfUFJJTlQoIEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBEVU1QX0NPTlRST0wsIERCR19MVkxfQUxMLCAgIk1CU1pvbmVJZGVudGlmaWVyYXNzaWdubWVudExlbmd0aAk6IDB4JVgiLAotCQlwc3RBZGRJbmRpY2F0aW9uLT5zZkF1dGhvcml6ZWRTZXQuTUJTWm9uZUlkZW50aWZpZXJhc3NpZ25tZW50TGVuZ3RoKTsKLQlmb3IodWlMb29wSW5kZXg9MDsgdWlMb29wSW5kZXggPCBNQVhfU1RSSU5HX0xFTjsgdWlMb29wSW5kZXgrKykKLQkJQkNNX0RFQlVHX1BSSU5UKCBBZGFwdGVyLERCR19UWVBFX09USEVSUywgRFVNUF9DT05UUk9MLCBEQkdfTFZMX0FMTCwgICJNQlNab25lSWRlbnRpZmllcmFzc2lnbm1lbnQgOiAweCVYIiwKLQkJCXBzdEFkZEluZGljYXRpb24tPnNmQXV0aG9yaXplZFNldC5NQlNab25lSWRlbnRpZmllcmFzc2lnbm1lbnRbdWlMb29wSW5kZXhdKTsKLSNlbmRpZgogCiAJQkNNX0RFQlVHX1BSSU5UKCBBZGFwdGVyLERCR19UWVBFX09USEVSUywgRFVNUF9DT05UUk9MLCBEQkdfTFZMX0FMTCwgICJzZkF1dGhvcml6ZWRTZXQudThIQVJRQ2hhbm5lbE1hcHBpbmcgJXggICV4ICV4ICIsCiAJCQkJKih1bnNpZ25lZCBpbnQqKXBzdEFkZEluZGljYXRpb24tPnNmQXV0aG9yaXplZFNldC51OEhBUlFDaGFubmVsTWFwcGluZywKQEAgLTExNTgsMTEgKzExMzYsNiBAQAogCQkJcHNmQ1NUeXBlLT5jQ1BhY2tldENsYXNzaWZpY2F0aW9uUnVsZS51OElQVHlwZU9mU2VydmljZVswXSwKIAkJCXBzZkNTVHlwZS0+Y0NQYWNrZXRDbGFzc2lmaWNhdGlvblJ1bGUudThJUFR5cGVPZlNlcnZpY2VbMV0sCiAJCQlwc2ZDU1R5cGUtPmNDUGFja2V0Q2xhc3NpZmljYXRpb25SdWxlLnU4SVBUeXBlT2ZTZXJ2aWNlWzJdKTsKLSNpZiAwCi0KLQkJQkNNX0RFQlVHX1BSSU5UKCBBZGFwdGVyLERCR19UWVBFX09USEVSUywgQ09OTl9NU0csIERCR19MVkxfQUxMLCAgInU4UHJvdG9jb2xMZW5ndGgJCQkJOjB4JVggIiwKLQkJCXBzZkNTVHlwZS0+Y0NQYWNrZXRDbGFzc2lmaWNhdGlvblJ1bGUudThQcm90b2NvbExlbmd0aCk7Ci0jZW5kaWYKIAogCQlmb3IodWlMb29wSW5kZXg9MDsgdWlMb29wSW5kZXggPCAxOyB1aUxvb3BJbmRleCsrKQogCQkJQkNNX0RFQlVHX1BSSU5UKCBBZGFwdGVyLERCR19UWVBFX09USEVSUywgRFVNUF9DT05UUk9MLCBEQkdfTFZMX0FMTCwgICJ1OFByb3RvY29sIDogMHglMDJYICIsCkBAIC0xMjc4LDE0ICsxMjUxLDYgQEAKIAkJCXBzdEFkZEluZGljYXRpb24tPnNmQWRtaXR0ZWRTZXQudThRb3NQYXJhbVNldCk7CiAJQkNNX0RFQlVHX1BSSU5UKCBBZGFwdGVyLERCR19UWVBFX09USEVSUywgRFVNUF9DT05UUk9MLCBEQkdfTFZMX0FMTCwgICJ1OFRyYWZmaWNQcmlvcml0eQkJCTogMHglMDJYIiwKIAkJCXBzdEFkZEluZGljYXRpb24tPnNmQWRtaXR0ZWRTZXQudThUcmFmZmljUHJpb3JpdHkpOwotI2lmIDAKLQlCQ01fREVCVUdfUFJJTlQoIEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBDT05OX01TRywgREJHX0xWTF9BTEwsICAidTMyTWF4U3VzdGFpbmVkVHJhZmZpY1JhdGUJOiAweCUwMlgiLAotCQkJbnRvaGwocHN0QWRkSW5kaWNhdGlvbi0+c2ZBZG1pdHRlZFNldC51MzJNYXhTdXN0YWluZWRUcmFmZmljUmF0ZSkpOwotCUJDTV9ERUJVR19QUklOVCggQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIENPTk5fTVNHLCBEQkdfTFZMX0FMTCwgICJ1MzJNaW5pbXVtVG9sZXJhYmxlVHJhZmZpY1JhdGUJOiAweCVYIiwKLQkJcHN0QWRkSW5kaWNhdGlvbi0+c2ZBZG1pdHRlZFNldC51MzJNaW5pbXVtVG9sZXJhYmxlVHJhZmZpY1JhdGUpOwotCUJDTV9ERUJVR19QUklOVCggQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIENPTk5fTVNHLCBEQkdfTFZMX0FMTCwgICJ1MzJSZXF1ZXN0dHJhbnNtaXNzaW9uUG9saWN5CTogMHglWCIsCi0JCXBzdEFkZEluZGljYXRpb24tPnNmQWRtaXR0ZWRTZXQudTMyUmVxdWVzdHRyYW5zbWlzc2lvblBvbGljeSk7Ci0jZW5kaWYKIAlCQ01fREVCVUdfUFJJTlQoIEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBEVU1QX0NPTlRST0wsIERCR19MVkxfQUxMLCAgInUzMk1heFRyYWZmaWNCdXJzdAkJCTogMHglWCIsCiAJCQlwc3RBZGRJbmRpY2F0aW9uLT5zZkFkbWl0dGVkU2V0LnUzMk1heFRyYWZmaWNCdXJzdCk7CiAJQkNNX0RFQlVHX1BSSU5UKCBBZGFwdGVyLERCR19UWVBFX09USEVSUywgRFVNUF9DT05UUk9MLCBEQkdfTFZMX0FMTCwgICJ1MzJNaW5SZXNlcnZlZFRyYWZmaWNSYXRlCTogMHglWCIsCkBAIC0xMzM5LDEzICsxMzA0LDYgQEAKIAkJcHN0QWRkSW5kaWNhdGlvbi0+c2ZBZG1pdHRlZFNldC51MTZUaW1lQmFzZSk7CiAJQkNNX0RFQlVHX1BSSU5UKCBBZGFwdGVyLERCR19UWVBFX09USEVSUywgRFVNUF9DT05UUk9MLCBEQkdfTFZMX0FMTCwgICJ1OFBhZ2luZ1ByZWZlcmVuY2UJCTogMHglWCIsCiAJCXBzdEFkZEluZGljYXRpb24tPnNmQWRtaXR0ZWRTZXQudThQYWdpbmdQcmVmZXJlbmNlKTsKLSNpZiAwCi0JQkNNX0RFQlVHX1BSSU5UKCBBZGFwdGVyLERCR19UWVBFX09USEVSUywgRFVNUF9DT05UUk9MLCBEQkdfTFZMX0FMTCwgICJNQlNab25lSWRlbnRpZmllcmFzc2lnbm1lbnRMZW5ndGgJOiAweCVYIiwKLQkJcHN0QWRkSW5kaWNhdGlvbi0+c2ZBZG1pdHRlZFNldC5NQlNab25lSWRlbnRpZmllcmFzc2lnbm1lbnRMZW5ndGgpOwotCWZvcih1aUxvb3BJbmRleD0wOyB1aUxvb3BJbmRleCA8IE1BWF9TVFJJTkdfTEVOOyB1aUxvb3BJbmRleCsrKQotCQlCQ01fREVCVUdfUFJJTlQoIEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBEVU1QX0NPTlRST0wsIERCR19MVkxfQUxMLCAgIk1CU1pvbmVJZGVudGlmaWVyYXNzaWdubWVudCA6IDB4JVgiLAotCXBzdEFkZEluZGljYXRpb24tPnNmQWRtaXR0ZWRTZXQuTUJTWm9uZUlkZW50aWZpZXJhc3NpZ25tZW50W3VpTG9vcEluZGV4XSk7Ci0jZW5kaWYKIAogCiAJQkNNX0RFQlVHX1BSSU5UKCBBZGFwdGVyLERCR19UWVBFX09USEVSUywgRFVNUF9DT05UUk9MLCBEQkdfTFZMX0FMTCwgICJ1OFRyYWZmaWNJbmRpY2F0aW9uUHJlZmVyZW5jZQk6IDB4JTAyWCIsCkBAIC0xMzc4LDExICsxMzM2LDYgQEAKIAkJCXBzZkNTVHlwZS0+Y0NQYWNrZXRDbGFzc2lmaWNhdGlvblJ1bGUudThJUFR5cGVPZlNlcnZpY2VbMF0sCiAJCQlwc2ZDU1R5cGUtPmNDUGFja2V0Q2xhc3NpZmljYXRpb25SdWxlLnU4SVBUeXBlT2ZTZXJ2aWNlWzFdLAogCQkJcHNmQ1NUeXBlLT5jQ1BhY2tldENsYXNzaWZpY2F0aW9uUnVsZS51OElQVHlwZU9mU2VydmljZVsyXSk7Ci0jaWYgMAotCi0JCUJDTV9ERUJVR19QUklOVCggQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIERVTVBfQ09OVFJPTCwgREJHX0xWTF9BTEwsICAidThQcm90b2NvbExlbmd0aAkJCToweCUwMlggIiwKLQkJCXBzZkNTVHlwZS0+Y0NQYWNrZXRDbGFzc2lmaWNhdGlvblJ1bGUudThQcm90b2NvbExlbmd0aCk7Ci0jZW5kaWYKIAkJZm9yKHVpTG9vcEluZGV4PTA7IHVpTG9vcEluZGV4IDwgMTsgdWlMb29wSW5kZXgrKykKIAkJCUJDTV9ERUJVR19QUklOVCggQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIERVTVBfQ09OVFJPTCwgREJHX0xWTF9BTEwsICAidThQcm90b2NvbDogMHglMDJYICIsCiAJCQlwc2ZDU1R5cGUtPmNDUGFja2V0Q2xhc3NpZmljYXRpb25SdWxlLnU4UHJvdG9jb2wpOwpAQCAtMTQ5NywyMCArMTQ1MCwxMCBAQAogCQlwc3RBZGRJbmRpY2F0aW9uLT5zZkFjdGl2ZVNldC51OFFvc1BhcmFtU2V0KTsKIAlCQ01fREVCVUdfUFJJTlQoIEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBEVU1QX0NPTlRST0wsIERCR19MVkxfQUxMLCAgInU4VHJhZmZpY1ByaW9yaXR5CQkJOiAweCUwMlgiLAogCQlwc3RBZGRJbmRpY2F0aW9uLT5zZkFjdGl2ZVNldC51OFRyYWZmaWNQcmlvcml0eSk7Ci0jaWYgMAotCUJDTV9ERUJVR19QUklOVCggQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIENPTk5fTVNHLCBEQkdfTFZMX0FMTCwgICJ1MzJNYXhTdXN0YWluZWRUcmFmZmljUmF0ZQk6IDB4JTAyWCIsCi0JCW50b2hsKHBzdEFkZEluZGljYXRpb24tPnNmQWN0aXZlU2V0LnUzMk1heFN1c3RhaW5lZFRyYWZmaWNSYXRlKSk7Ci0jZW5kaWYKIAlCQ01fREVCVUdfUFJJTlQoIEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBEVU1QX0NPTlRST0wsIERCR19MVkxfQUxMLCAgInUzMk1heFRyYWZmaWNCdXJzdAkJCTogMHglWCIsCiAJCXBzdEFkZEluZGljYXRpb24tPnNmQWN0aXZlU2V0LnUzMk1heFRyYWZmaWNCdXJzdCk7CiAJQkNNX0RFQlVHX1BSSU5UKCBBZGFwdGVyLERCR19UWVBFX09USEVSUywgRFVNUF9DT05UUk9MLCBEQkdfTFZMX0FMTCwgICJ1MzJNaW5SZXNlcnZlZFRyYWZmaWNSYXRlCTogMHglWCIsCiAJCXBzdEFkZEluZGljYXRpb24tPnNmQWN0aXZlU2V0LnUzMk1pblJlc2VydmVkVHJhZmZpY1JhdGUpOwotI2lmIDAKLQlCQ01fREVCVUdfUFJJTlQoIEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBDT05OX01TRywgREJHX0xWTF9BTEwsICAidTMyTWluaW11bVRvbGVyYWJsZVRyYWZmaWNSYXRlCTogMHglWCIsCi0JCXBzdEFkZEluZGljYXRpb24tPnNmQWN0aXZlU2V0LnUzMk1pbmltdW1Ub2xlcmFibGVUcmFmZmljUmF0ZSk7Ci0JQkNNX0RFQlVHX1BSSU5UKCBBZGFwdGVyLERCR19UWVBFX09USEVSUywgQ09OTl9NU0csIERCR19MVkxfQUxMLCAgInUzMlJlcXVlc3R0cmFuc21pc3Npb25Qb2xpY3kJOiAweCVYIiwKLQkJcHN0QWRkSW5kaWNhdGlvbi0+c2ZBY3RpdmVTZXQudTMyUmVxdWVzdHRyYW5zbWlzc2lvblBvbGljeSk7Ci0jZW5kaWYKIAlCQ01fREVCVUdfUFJJTlQoIEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBEVU1QX0NPTlRST0wsIERCR19MVkxfQUxMLCAgInU4VmVuZG9yU3BlY2lmaWNRb1NQYXJhbUxlbmd0aAk6IDB4JTAyWCIsCiAJCXBzdEFkZEluZGljYXRpb24tPnNmQWN0aXZlU2V0LnU4VmVuZG9yU3BlY2lmaWNRb1NQYXJhbUxlbmd0aCk7CiAJQkNNX0RFQlVHX1BSSU5UKCBBZGFwdGVyLERCR19UWVBFX09USEVSUywgRFVNUF9DT05UUk9MLCBEQkdfTFZMX0FMTCwgICJ1OFZlbmRvclNwZWNpZmljUW9TUGFyYW0JCTogMHglMDJYIiwKQEAgLTE1NTgsMTMgKzE1MDEsNiBAQAogCQlwc3RBZGRJbmRpY2F0aW9uLT5zZkFjdGl2ZVNldC51MTZUaW1lQmFzZSk7CiAJQkNNX0RFQlVHX1BSSU5UKCBBZGFwdGVyLERCR19UWVBFX09USEVSUywgRFVNUF9DT05UUk9MLCBEQkdfTFZMX0FMTCwgICIgdThQYWdpbmdQcmVmZXJlbmNlCQk6IDB4JVgiLAogCQlwc3RBZGRJbmRpY2F0aW9uLT5zZkFjdGl2ZVNldC51OFBhZ2luZ1ByZWZlcmVuY2UpOwotI2lmIDAKLQlCQ01fREVCVUdfUFJJTlQoIEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBEVU1QX0NPTlRST0wsIERCR19MVkxfQUxMLCAgIiBNQlNab25lSWRlbnRpZmllcmFzc2lnbm1lbnRMZW5ndGgJOiAweCVYIiwKLQkJcHN0QWRkSW5kaWNhdGlvbi0+c2ZBY3RpdmVTZXQuTUJTWm9uZUlkZW50aWZpZXJhc3NpZ25tZW50TGVuZ3RoKTsKLQlmb3IodWlMb29wSW5kZXg9MDsgdWlMb29wSW5kZXggPCBNQVhfU1RSSU5HX0xFTjsgdWlMb29wSW5kZXgrKykKLQkJQkNNX0RFQlVHX1BSSU5UKCBBZGFwdGVyLERCR19UWVBFX09USEVSUywgRFVNUF9DT05UUk9MLCBEQkdfTFZMX0FMTCwgICIgTUJTWm9uZUlkZW50aWZpZXJhc3NpZ25tZW50IDogMHglWCIsCi0JCXBzdEFkZEluZGljYXRpb24tPnNmQWN0aXZlU2V0Lk1CU1pvbmVJZGVudGlmaWVyYXNzaWdubWVudFt1aUxvb3BJbmRleF0pOwotI2VuZGlmCiAKIAogCUJDTV9ERUJVR19QUklOVCggQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIERVTVBfQ09OVFJPTCwgREJHX0xWTF9BTEwsICAiIHU4VHJhZmZpY0luZGljYXRpb25QcmVmZXJlbmNlCTogMHglWCIsCkBAIC0xNTk3LDExICsxNTMzLDYgQEAKIAkJCXBzZkNTVHlwZS0+Y0NQYWNrZXRDbGFzc2lmaWNhdGlvblJ1bGUudThJUFR5cGVPZlNlcnZpY2VbMF0sCiAJCQlwc2ZDU1R5cGUtPmNDUGFja2V0Q2xhc3NpZmljYXRpb25SdWxlLnU4SVBUeXBlT2ZTZXJ2aWNlWzFdLAogCQkJcHNmQ1NUeXBlLT5jQ1BhY2tldENsYXNzaWZpY2F0aW9uUnVsZS51OElQVHlwZU9mU2VydmljZVsyXSk7Ci0jaWYgMAotCi0JCUJDTV9ERUJVR19QUklOVCggQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIENPTk5fTVNHLCBEQkdfTFZMX0FMTCwgICIgdThQcm90b2NvbExlbmd0aAkJCQk6MHglWCAiLAotCQkJcHNmQ1NUeXBlLT5jQ1BhY2tldENsYXNzaWZpY2F0aW9uUnVsZS51OFByb3RvY29sTGVuZ3RoKTsKLSNlbmRpZgogCQlmb3IodWlMb29wSW5kZXg9MDsgdWlMb29wSW5kZXggPCAxOyB1aUxvb3BJbmRleCsrKQogCQkJQkNNX0RFQlVHX1BSSU5UKCBBZGFwdGVyLERCR19UWVBFX09USEVSUywgRFVNUF9DT05UUk9MLCBEQkdfTFZMX0FMTCwgICIgdThQcm90b2NvbAk6IDB4JVggIiwKIAkJCXBzZkNTVHlwZS0+Y0NQYWNrZXRDbGFzc2lmaWNhdGlvblJ1bGUudThQcm90b2NvbCk7CkBAIC0xNzA2LDEyICsxNjM3LDggQEAKIAkJcmV0dXJuIDA7CiAJfQogCXVsQWRkclNGUGFyYW1TZXQgPSBudG9obCh1bEFkZHJTRlBhcmFtU2V0KTsKLQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIENPTk5fTVNHLCBEQkdfTFZMX0FMTCwgICIgUmVzdG9yZVNGUGFyYW06IFRvdGFsIFdvcmRzIG9mIERTWCBNZXNzYWdlIFRvIFJlYWQ6IDB4JXp4ICBGcm9tIFRhcmdldCBBdCA6IDB4JWx4ICIsCi0JCQkJbkJ5dGVzVG9SZWFkL3NpemVvZihVTE9ORyksdWxBZGRyU0ZQYXJhbVNldCk7Ci0JQkNNX0RFQlVHX1BSSU5UKCBBZGFwdGVyLERCR19UWVBFX09USEVSUywgQ09OTl9NU0csIERCR19MVkxfQUxMLCAgInNpemVvZihzdFNlcnZpY2VGbG93UGFyYW1TSSkgPSAlengiLCBzaXplb2Yoc3RTZXJ2aWNlRmxvd1BhcmFtU0kpKTsKIAogCS8vUmVhZCBvdXQgdGhlIFNGIFBhcmFtIFNldCBBdCB0aGUgaW5kaWNhdGVkIExvY2F0aW9uCi0JQkNNX0RFQlVHX1BSSU5UKCBBZGFwdGVyLERCR19UWVBFX09USEVSUywgQ09OTl9NU0csIERCR19MVkxfQUxMLCAgIm5CeXRlc1RvUmVhZCA9ICV4IiwgbkJ5dGVzVG9SZWFkKTsKIAlpZihyZG0oQWRhcHRlciwgdWxBZGRyU0ZQYXJhbVNldCwgKFBVQ0hBUilwdWNEZXN0QnVmZmVyLCBuQnl0ZXNUb1JlYWQpIDwgMCkKIAkJcmV0dXJuIFNUQVRVU19GQUlMVVJFOwogCkBAIC0xNzE5LDIzICsxNjQ2LDIwIEBACiB9CiAKIAotc3RhdGljIF9faW5saW5lIFVMT05HIFN0b3JlU0ZQYXJhbShQTUlOSV9BREFQVEVSIEFkYXB0ZXIsUFVDSEFSIHB1Y1NyY0J1ZmZlcixVTE9ORyAgdWxBZGRyU0ZQYXJhbVNldCkKK3N0YXRpYyBVTE9ORyBTdG9yZVNGUGFyYW0oUE1JTklfQURBUFRFUiBBZGFwdGVyLFBVQ0hBUiBwdWNTcmNCdWZmZXIsVUxPTkcgIHVsQWRkclNGUGFyYW1TZXQpCiB7CiAgICAgVUlOVAluQnl0ZXNUb1dyaXRlID0gc2l6ZW9mKHN0U2VydmljZUZsb3dQYXJhbVNJKTsKLQlVSU5UIAl1aVJldFZhbCA9MDsKKwlpbnQgcmV0ID0gMDsKIAogCWlmKHVsQWRkclNGUGFyYW1TZXQgPT0gMCB8fCBOVUxMID09IHB1Y1NyY0J1ZmZlcikKIAl7CiAJCXJldHVybiAwOwogCX0KLQlCQ01fREVCVUdfUFJJTlQoIEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBDT05OX01TRywgREJHX0xWTF9BTEwsICAiIFN0b3JlU0ZQYXJhbTogVG90YWwgV29yZHMgb2YgRFNYIE1lc3NhZ2UgVG8gV3JpdGU6IDB4JXpYICBUbyBUYXJnZXQgQXQgOiAweCVsWCAiLChuQnl0ZXNUb1dyaXRlL3NpemVvZihVTE9ORykpLHVsQWRkclNGUGFyYW1TZXQpOwogCi0JQkNNX0RFQlVHX1BSSU5UKCBBZGFwdGVyLERCR19UWVBFX09USEVSUywgQ09OTl9NU0csIERCR19MVkxfQUxMLCAgIldSTSAgd2l0aCAleCBieXRlcyIsbkJ5dGVzVG9Xcml0ZSk7Ci0KLQl1aVJldFZhbCA9IHdybShBZGFwdGVyLHVsQWRkclNGUGFyYW1TZXQsKFBVQ0hBUilwdWNTcmNCdWZmZXIsIG5CeXRlc1RvV3JpdGUpOwotCWlmKHVpUmV0VmFsIDwgMCkgeworCXJldCA9IHdybShBZGFwdGVyLCB1bEFkZHJTRlBhcmFtU2V0LCAodTggKilwdWNTcmNCdWZmZXIsIG5CeXRlc1RvV3JpdGUpOworCWlmIChyZXQgPCAwKSB7CiAJCUJDTV9ERUJVR19QUklOVCggQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIENPTk5fTVNHLCBEQkdfTFZMX0FMTCwgICIlczolZCBXUk0gZmFpbGVkIixfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsKLQkJcmV0dXJuIHVpUmV0VmFsOworCQlyZXR1cm4gcmV0OwogCX0KIAlyZXR1cm4gMTsKIH0KQEAgLTE3NzgsNyArMTcwMiw3IEBACiAJfQogCS8vIEZvciBEU0FfUkVRLCBvbmx5IHVwdG8gInBzZkF1dGhvcml6ZWRTZXQiIHBhcmFtZXRlciBzaG91bGQgYmUgYWNjZXNzZWQgYnkgZHJpdmVyIQogCi0JcHN0QWRkSW5kaWNhdGlvbj0oc3RMb2NhbFNGQWRkSW5kaWNhdGlvbiAqKWttYWxsb2Moc2l6ZW9mKCpwc3RBZGRJbmRpY2F0aW9uKSwgR0ZQX0tFUk5FTCk7CisJcHN0QWRkSW5kaWNhdGlvbj1rbWFsbG9jKHNpemVvZigqcHN0QWRkSW5kaWNhdGlvbiksIEdGUF9LRVJORUwpOwogCWlmKE5VTEw9PXBzdEFkZEluZGljYXRpb24pCiAJCXJldHVybiAwOwogCkBAIC0xODQ0LDcgKzE3NjgsNyBAQAogCiAJKCpwdUJ1ZmZlckxlbmd0aCkgPSBzaXplb2Yoc3RMb2NhbFNGQWRkSW5kaWNhdGlvbik7CiAJKihzdExvY2FsU0ZBZGRJbmRpY2F0aW9uICopcHZCdWZmZXIgPSAqcHN0QWRkSW5kaWNhdGlvbjsKLQliY21fa2ZyZWUocHN0QWRkSW5kaWNhdGlvbik7CisJa2ZyZWUocHN0QWRkSW5kaWNhdGlvbik7CiAJcmV0dXJuIDE7CiB9CiAKQEAgLTE5MzEsNyArMTg1NSw3IEBACiAJQkNNX0RFQlVHX1BSSU5UKCBBZGFwdGVyLERCR19UWVBFX09USEVSUywgQ09OTl9NU0csIERCR19MVkxfQUxMLCAiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Iik7CiAJcmV0dXJuIHBzdEFkZEluZGljYXRpb25EZXN0OwogZmFpbGVkX3Jlc3RvcmVfc2ZfcGFyYW06Ci0JYmNtX2tmcmVlKHBzdEFkZEluZGljYXRpb25EZXN0KTsKKwlrZnJlZShwc3RBZGRJbmRpY2F0aW9uRGVzdCk7CiAJQkNNX0RFQlVHX1BSSU5UKCBBZGFwdGVyLERCR19UWVBFX09USEVSUywgQ09OTl9NU0csIERCR19MVkxfQUxMLCAiPD09PT09IiApOwogCXJldHVybiBOVUxMOwogfQpAQCAtMTk4OCw3ICsxOTEyLDcgQEAKIAlyZXR1cm4gMTsKIH0KIAotVUxPTkcgR2V0TmV4dFRhcmdldEJ1ZmZlckxvY2F0aW9uKFBNSU5JX0FEQVBURVIgQWRhcHRlcixCX1VJTlQxNiB0aWQpCitzdGF0aWMgVUxPTkcgR2V0TmV4dFRhcmdldEJ1ZmZlckxvY2F0aW9uKFBNSU5JX0FEQVBURVIgQWRhcHRlcixCX1VJTlQxNiB0aWQpCiB7CiAJVUxPTkcgIHVsVGFyZ2V0RFNYQnVmZmVyQWRkcmVzczsKIAlVTE9ORyAgdWxUYXJnZXREc3hCdWZmZXJJbmRleFRvVXNlLHVsTWF4VHJ5OwpAQCAtMjA0OSw3ICsxOTczLDcgQEAKIHsKIAlpZihBZGFwdGVyLT5jYURzeFJlcVJlc3ApCiAJewotCQliY21fa2ZyZWUoQWRhcHRlci0+Y2FEc3hSZXFSZXNwKTsKKwkJa2ZyZWUoQWRhcHRlci0+Y2FEc3hSZXFSZXNwKTsKIAl9CiAJcmV0dXJuIDA7CiAKQEAgLTIxMDIsNyArMjAyNiw3IEBACiAKIAkJCUJDTV9ERUJVR19QUklOVCggQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIENPTk5fTVNHLCBEQkdfTFZMX0FMTCwgICIgVkNJRCA9ICV4IiwgbnRvaHMocHN0QWRkSW5kaWNhdGlvbi0+dTE2VkNJRCkpOwogCQkJQ29weUJ1ZmZlclRvQ29udHJvbFBhY2tldChBZGFwdGVyLChQVk9JRClBZGFwdGVyLT5jYURzeFJlcVJlc3ApOwotCQkJYmNtX2tmcmVlKHBzdEFkZEluZGljYXRpb24pOworCQkJa2ZyZWUocHN0QWRkSW5kaWNhdGlvbik7CiAJCX0KIAkJYnJlYWs7CiAJCWNhc2UgRFNBX1JTUDoKQEAgLTIxMTgsNyArMjA0Miw3IEBACiAJCWNhc2UgRFNBX0FDSzoKIAkJewogCQkJVUlOVCB1aVNlYXJjaFJ1bGVJbmRleD0wOwotCQkJc3RydWN0IHRpbWV2YWwgdHYgPSB7MH07CisKIAkJCUJDTV9ERUJVR19QUklOVCggQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIENPTk5fTVNHLCBEQkdfTFZMX0FMTCwgIlZDSUQ6MHglWCIsCiAJCQkJbnRvaHMocHN0QWRkSW5kaWNhdGlvbi0+dTE2VkNJRCkpOwogICAgICAgICAgICAgdWlTZWFyY2hSdWxlSW5kZXg9U2VhcmNoRnJlZVNmaWQoQWRhcHRlcik7CkBAIC0yMTY5LDcgKzIwOTMsNyBAQAogCQkJCQlBZGFwdGVyLT5QYWNrSW5mb1t1aVNlYXJjaFJ1bGVJbmRleF0uYkFjdGl2ZT1GQUxTRTsKICAgICAgICAgICAgICAgICAgICAgQWRhcHRlci0+UGFja0luZm9bdWlTZWFyY2hSdWxlSW5kZXhdLmJWYWxpZD1GQUxTRTsKIAkJCQkJQWRhcHRlci0+UGFja0luZm9bdWlTZWFyY2hSdWxlSW5kZXhdLnVzVkNJRF9WYWx1ZT0wOwotCQkJCQliY21fa2ZyZWUocHN0QWRkSW5kaWNhdGlvbik7CisJCQkJCWtmcmVlKHBzdEFkZEluZGljYXRpb24pOwogCQkJCX0KIAogCQkJCWVsc2UgaWYocHNmTG9jYWxTZXQtPmJWYWxpZCAmJiAocHN0QWRkSW5kaWNhdGlvbi0+dThDQyA9PSAwKSkKQEAgLTIyMDAsMTQgKzIxMjQsMTMgQEAKIAkJCQkJCQlpZighQWRhcHRlci0+TGlua1VwU3RhdHVzKQogCQkJCQkJCXsKIAkJCQkJCQkJbmV0aWZfY2Fycmllcl9vbihBZGFwdGVyLT5kZXYpOwotICAgIAkJCQkJCQluZXRpZl9zdGFydF9xdWV1ZShBZGFwdGVyLT5kZXYpOworCQkJCQkJCQluZXRpZl9zdGFydF9xdWV1ZShBZGFwdGVyLT5kZXYpOwogCQkJCQkJCQlBZGFwdGVyLT5MaW5rVXBTdGF0dXMgPSAxOwotCQkJCQkJCQlkb19nZXR0aW1lb2ZkYXkoJnR2KTsKLQorCQkJCQkJCQlpZiAobmV0aWZfbXNnX2xpbmsoQWRhcHRlcikpCisJCQkJCQkJCQlwcl9pbmZvKFBGWCAiJXM6IGxpbmsgdXBcbiIsIEFkYXB0ZXItPmRldi0+bmFtZSk7CiAJCQkJCQkJCWF0b21pY19zZXQoJkFkYXB0ZXItPlR4UGt0QXZhaWwsIDEpOwogCQkJCQkJCQl3YWtlX3VwKCZBZGFwdGVyLT50eF9wYWNrZXRfd2FpdF9xdWV1ZSk7Ci0JCQkJCQkJCUFkYXB0ZXItPmxpVGltZVNpbmNlTGFzdE5ldEVudHJ5ID0gdHYudHZfc2VjOwotCQkJCQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIENPTk5fTVNHLCBEQkdfTFZMX0FMTCwgIj09PT09PT09PT09PVR4IFNlcnZpY2UgRmxvdyBDcmVhdGVkISIpOworCQkJCQkJCQlBZGFwdGVyLT5saVRpbWVTaW5jZUxhc3ROZXRFbnRyeSA9IGdldF9zZWNvbmRzKCk7CiAJCQkJCQkJfQogCQkJCQkJfQogCQkJCQl9CkBAIC0yMjE4LDEzICsyMTQxLDEzIEBACiAJCQkJCUFkYXB0ZXItPlBhY2tJbmZvW3VpU2VhcmNoUnVsZUluZGV4XS5iQWN0aXZlPUZBTFNFOwogICAgICAgICAgICAgICAgICAgICBBZGFwdGVyLT5QYWNrSW5mb1t1aVNlYXJjaFJ1bGVJbmRleF0uYlZhbGlkPUZBTFNFOwogCQkJCQlBZGFwdGVyLT5QYWNrSW5mb1t1aVNlYXJjaFJ1bGVJbmRleF0udXNWQ0lEX1ZhbHVlPTA7Ci0JCQkJCWJjbV9rZnJlZShwc3RBZGRJbmRpY2F0aW9uKTsKKwkJCQkJa2ZyZWUocHN0QWRkSW5kaWNhdGlvbik7CiAJCQkJfQogCQkJfQogCQkJZWxzZQogCQkJewogCQkJCUJDTV9ERUJVR19QUklOVCggQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsICJEU0EgQUNLIGRpZCBub3QgZ2V0IHZhbGlkIFNGSUQiKTsKLQkJCQliY21fa2ZyZWUocHN0QWRkSW5kaWNhdGlvbik7CisJCQkJa2ZyZWUocHN0QWRkSW5kaWNhdGlvbik7CiAJCQkJcmV0dXJuIEZBTFNFOwogCQkJfQogCQl9CkBAIC0yMjM5LDcgKzIxNjIsNyBAQAogCQkJKChzdExvY2FsU0ZDaGFuZ2VJbmRpY2F0aW9uQWx0KikmKEFkYXB0ZXItPmNhRHN4UmVxUmVzcFtMRUFERVJfU0laRV0pKS0+dThUeXBlID0gRFNDX1JTUDsKIAogCQkJQ29weUJ1ZmZlclRvQ29udHJvbFBhY2tldChBZGFwdGVyLChQVk9JRClBZGFwdGVyLT5jYURzeFJlcVJlc3ApOwotCQkJYmNtX2tmcmVlKHBzdEFkZEluZGljYXRpb24pOworCQkJa2ZyZWUocHN0QWRkSW5kaWNhdGlvbik7CiAJCX0KIAkJYnJlYWs7CiAJCWNhc2UgRFNDX1JTUDoKQEAgLTIzMTIsMTMgKzIyMzUsMTMgQEAKIAkJCQllbHNlIGlmKHBzdENoYW5nZUluZGljYXRpb24tPnU4Q0MgPT0gNikKIAkJCQl7CiAJCQkJCWRlbGV0ZVNGQnlTZmlkKEFkYXB0ZXIsdWlTZWFyY2hSdWxlSW5kZXgpOwotCQkJCQliY21fa2ZyZWUocHN0QWRkSW5kaWNhdGlvbik7CisJCQkJCWtmcmVlKHBzdEFkZEluZGljYXRpb24pOwogCQkJCX0KIAkJCX0KIAkJCWVsc2UKIAkJCXsKIAkJCQlCQ01fREVCVUdfUFJJTlQoIEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiRFNDIEFDSyBkaWQgbm90IGdldCB2YWxpZCBTRklEIik7Ci0JCQkJYmNtX2tmcmVlKHBzdEFkZEluZGljYXRpb24pOworCQkJCWtmcmVlKHBzdEFkZEluZGljYXRpb24pOwogCQkJCXJldHVybiBGQUxTRTsKIAkJCX0KIAkJfQpAQCAtMjM1NSw3ICsyMjc4LDcgQEAKIAkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX09USEVSUywgQ09OTl9NU0csIERCR19MVkxfQUxMLCAiRFNEIEFDSyBSY2QsIGxldCBBcHAgaGFuZGxlIGl0XG4iKTsKIAkJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCWJjbV9rZnJlZShwc3RBZGRJbmRpY2F0aW9uKTsKKwkJa2ZyZWUocHN0QWRkSW5kaWNhdGlvbik7CiAJCXJldHVybiBGQUxTRSA7CiAJfQogCXJldHVybiBUUlVFOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JjbS9DbUhvc3QuaCBiL2RyaXZlcnMvc3RhZ2luZy9iY20vQ21Ib3N0LmgKaW5kZXggODQ3NzgyYy4uOGY2ODk3NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JjbS9DbUhvc3QuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYmNtL0NtSG9zdC5oCkBAIC0xNTAsOCArMTUwLDYgQEAKIAogVUxPTkcgU3RvcmVDbUNvbnRyb2xSZXNwb25zZU1lc3NhZ2UoUE1JTklfQURBUFRFUiBBZGFwdGVyLFBWT0lEIHB2QnVmZmVyLFVJTlQgKnB1QnVmZmVyTGVuZ3RoKTsKIAotVUxPTkcgR2V0TmV4dFRhcmdldEJ1ZmZlckxvY2F0aW9uKFBNSU5JX0FEQVBURVIgQWRhcHRlcixCX1VJTlQxNiB0aWQpOwotCiBJTlQgQWxsb2NBZGFwdGVyRHN4QnVmZmVyKFBNSU5JX0FEQVBURVIgQWRhcHRlcik7CiAKIElOVCBGcmVlQWRhcHRlckRzeEJ1ZmZlcihQTUlOSV9BREFQVEVSIEFkYXB0ZXIpOwpAQCAtMTU5LDcgKzE1Nyw2IEBACiAKIEJPT0xFQU4gQ21Db250cm9sUmVzcG9uc2VNZXNzYWdlKFBNSU5JX0FEQVBURVIgQWRhcHRlcixQVk9JRCBwdkJ1ZmZlcik7CiAKLVZPSUQgZGVsZXRlU0ZCeVNmaWQoUE1JTklfQURBUFRFUiBBZGFwdGVyLCBVSU5UIHVpU2VhcmNoUnVsZUluZGV4KTsKIAogI3ByYWdtYSBwYWNrIChwb3ApCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iY20vRERSSW5pdC5jIGIvZHJpdmVycy9zdGFnaW5nL2JjbS9ERFJJbml0LmMKaW5kZXggODkwN2UyMS4uMWM3ZGI4MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JjbS9ERFJJbml0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JjbS9ERFJJbml0LmMKQEAgLTEsNiArMSw1IEBACiAjaW5jbHVkZSAiaGVhZGVycy5oIgogCi0jaWZuZGVmIEJDTV9TSE1fSU5URVJGQUNFCiAKIAogI2RlZmluZSBERFJfRFVNUF9JTlRFUk5BTF9ERVZJQ0VfTUVNT1JZIDB4QkZDMDJCMDAKQEAgLTE4OCwxNyArMTg3LDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MHgwZjAwMDg0MCwweDBGRkYxQjAwfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MHgwZjAwMDg3MCwweDAwMDAwMDAyfQogCQkJCQkJCQkJICB9OwotI2lmIDAKLXN0YXRpYyBERFJfU0VUX05PREUgYXNEUExMXzgwME1IWltdID0gewotCQkJCQkJCQkJCXsweDBmMDAwODEwLDB4MDAwMDBGOTV9LAotCQkJCQkJCQkJCXsweDBmMDAwODEwLDB4MDAwMDBGOTV9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsweDBmMDAwODEwLDB4MDAwMDBGOTV9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsweDBmMDAwODIwLDB4MDNGMTM2NUJ9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsweDBmMDAwODQwLDB4MEZGRjAwMDB9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsweDBmMDAwODgwLDB4MDAwMDAzRER9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsweDBmMDAwODYwLDB4MDAwMDAwMDB9Ci0JCQkJCQkJCQkgIH07Ci0jZW5kaWYKIAogI2RlZmluZSBUM0JfU0tJUF9DTE9DS19QUk9HUkFNX0RVTVBfMTMzTUhaIDExICAvL2luZGV4IGZvciAweDBGMDA3MDAwCiBzdGF0aWMgRERSX1NFVF9OT0RFIGFzVDNCX0REUlNldHRpbmcxMzNNSHpbXSA9IHsvLyAgICAgICMgRFBMTCBDbG9jayBTZXR0aW5nCkBAIC03ODgsNyArNzc2LDcgQEAKIHsKIAlQRERSX1NFVFRJTkcgcHNERFJTZXR0aW5nPU5VTEw7CiAJVUxPTkcgUmVnQ291bnQ9MDsKLQlVTE9ORyB2YWx1ZSA9IDA7CisJVUlOVCB2YWx1ZSA9IDA7CiAJVUlOVCAgdWlSZXNldFZhbHVlID0gMDsKIAlVSU5UIHVpQ2xvY2tTZXR0aW5nID0gMDsKIAlpbnQgcmV0dmFsID0gU1RBVFVTX1NVQ0NFU1M7CkBAIC05ODIsNyArOTcwLDcgQEAKIAkJewogCQkJdmFsdWUgPSBwc0REUlNldHRpbmctPnVsUmVnVmFsdWU7CiAJCX0KLQkJcmV0dmFsID0gd3JtYWx0KEFkYXB0ZXIsIHBzRERSU2V0dGluZy0+dWxSZWdBZGRyZXNzLCAoUFVJTlQpJnZhbHVlLCBzaXplb2YodmFsdWUpKTsKKwkJcmV0dmFsID0gd3JtYWx0KEFkYXB0ZXIsIHBzRERSU2V0dGluZy0+dWxSZWdBZGRyZXNzLCAmdmFsdWUsIHNpemVvZih2YWx1ZSkpOwogCQlpZihTVEFUVVNfU1VDQ0VTUyAhPSByZXR2YWwpIHsKIAkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwiJXM6JWRcbiIsIF9fRlVOQ1RJT05fXywgX19MSU5FX18pOwogCQkJYnJlYWs7CkBAIC0xMjk4LDUgKzEyODYsNCBAQAogCXJldHVybiByZXR2YWw7CiB9CiAKLSNlbmRpZgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmNtL0RlYnVnLmMgYi9kcml2ZXJzL3N0YWdpbmcvYmNtL0RlYnVnLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3MDNmMzAuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JjbS9EZWJ1Zy5jCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotI2luY2x1ZGUgImhlYWRlcnMuaCIKLQotc3RhdGljIFVJTlQgY3VycmVudF9kZWJ1Z19sZXZlbD1CQ01fU0NSRUFNOwotCi1pbnQgYmNtX3ByaW50X2J1ZmZlciggVUlOVCBkZWJ1Z19sZXZlbCwgY29uc3QgY2hhciAqZnVuY3Rpb25fbmFtZSwKLQkJCQkgIGNoYXIgKmZpbGVfbmFtZSwgaW50IGxpbmVfbnVtYmVyLCB1bnNpZ25lZCBjaGFyICpidWZmZXIsIGludCBidWZmZXJsZW4sIGVudW0gX0JBU0VfVFlQRSBiYXNlKQotewotCXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgYnVmZl9kdW1wX2Jhc2VbXSA9IHsKLQkJIkRFQyIsICJIRVgiLCAiT0NUIiwgIkJJTiIKLQl9OwotCWlmKGRlYnVnX2xldmVsPj1jdXJyZW50X2RlYnVnX2xldmVsKQotCXsKLQkJaW50IGk9MDsKLQkJcHJpbnRrKCJcbiVzOiVzOiVkOkJ1ZmZlciBkdW1wIG9mIHNpemUgMHgleCBpbiB0aGUgJXM6XG4iLCBmaWxlX25hbWUsIGZ1bmN0aW9uX25hbWUsIGxpbmVfbnVtYmVyLCBidWZmZXJsZW4sIGJ1ZmZfZHVtcF9iYXNlWzFdKTsKLQkJZm9yKDtpPGJ1ZmZlcmxlbjtpKyspCi0JCXsKLQkJCWlmKGkgJiYgIShpJTE2KSApCi0JCQkJcHJpbnRrKCJcbiIpOwotCQkJc3dpdGNoKGJhc2UpCi0JCQl7Ci0JCQkJY2FzZSBCQ01fQkFTRV9UWVBFX0RFQzoKLQkJCQkJcHJpbnRrKCIlMDNkICIsIGJ1ZmZlcltpXSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgQkNNX0JBU0VfVFlQRV9PQ1Q6Ci0JCQkJCXByaW50aygiJTB4MDNvICIsIGJ1ZmZlcltpXSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgQkNNX0JBU0VfVFlQRV9CSU46Ci0JCQkJCXByaW50aygiJTAyeCAiLCBidWZmZXJbaV0pOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEJDTV9CQVNFX1RZUEVfSEVYOgotCQkJCWRlZmF1bHQ6Ci0JCQkJCXByaW50aygiJTAyWCAiLCBidWZmZXJbaV0pOwotCQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlwcmludGsoIlxuIik7Ci0JfQotCXJldHVybiAwOwotfQotCi0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iY20vRGVidWcuaCBiL2RyaXZlcnMvc3RhZ2luZy9iY20vRGVidWcuaAppbmRleCAzZDc4OGI1Li4zMTM4NzI5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYmNtL0RlYnVnLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JjbS9EZWJ1Zy5oCkBAIC05LDM0ICs5LDYgQEAKICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNkZWZpbmUgTk9ORSAweEZGRkYKIAotdHlwZWRlZiBlbnVtIF9CQVNFX1RZUEUKLXsKLQlCQ01fQkFTRV9UWVBFX0RFQywKLQlCQ01fQkFTRV9UWVBFX09DVCwKLQlCQ01fQkFTRV9UWVBFX0JJTiwKLQlCQ01fQkFTRV9UWVBFX0hFWCwKLQlCQ01fQkFTRV9UWVBFX05PTkUsCi19IEJBU0VfVFlQRSwgKlBCQVNFX1RZUEU7Ci0KLWludCBiY21fcHJpbnRfYnVmZmVyKCBVSU5UIGRlYnVnX2xldmVsLCBjb25zdCBjaGFyICpmdW5jdGlvbl9uYW1lLAotCQkJCSAgY2hhciAqZmlsZV9uYW1lLCBpbnQgbGluZV9udW1iZXIsIHVuc2lnbmVkIGNoYXIgKmJ1ZmZlciwgaW50IGJ1ZmZlcmxlbiwgQkFTRV9UWVBFIGJhc2UpOwotCi0jaWZkZWYgQkNNX1NITV9JTlRFUkZBQ0UKLSNkZWZpbmUgQ1BFX1ZJUlRVQUxfRVJST1JfQ09ERV9CQVNFX0FERFIJCSgweEJGQzAyRTAwICsgMHg0QykKLS8vIEVSUk9SIGNvZGVzIGZvciBkZWJ1Z2dpbmcKLWV4dGVybiB1bnNpZ25lZCBjaGFyIHUzMkVycm9yQ291bnRlciA7Ci0jZGVmaW5lIEVSUk9SX0RFVklDRV9SRU1PVkVEICAweDEKLSNkZWZpbmUgRVJST1JfTEVBREVSX0xFTkdUSF9aRVJPICAweDIKLSNkZWZpbmUgRVJST1JfTEVBREVSX0xFTkdUSF9DT1JSVVBURUQgIDB4MwotI2RlZmluZSBFUlJPUl9OT19TS0JVRkYgIDB4NAotCi0jZGVmaW5lIEVSUk9SX0RMX01PRFVMRSAweGFhMDAwMDAwCi1leHRlcm4gdm9pZCAgQ1BFX0VSUk9SX0xPRyh1bnNpZ25lZCBpbnQgbW9kdWxlLHVuc2lnbmVkIGludCBjb2RlKTsKLQotI2VuZGlmCi0KLQotCiAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIApAQCAtMjQyLDQzICsyMTQsMzMgQEAKIAogLy8tLS0gT25seSBmb3IgZGlyZWN0IHByaW50aydzOyAiaGlkZGVuIiB0byBBUEkuCiAjZGVmaW5lIERCR19UWVBFX1BSSU5USwkJMwotI2RlZmluZSBQUklOVEtTX09OCQkJMQkvLyAiaGlkZGVuIiBmcm9tIEFQSSwgc2V0IHRvIDAgdG8gdHVybiBvZmYgYWxsIHByaW50aydzCiAKLSNkZWZpbmUgQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIFR5cGUsIFN1YlR5cGUsIGRiZ19sZXZlbCwgc3RyaW5nLCBhcmdzLi4uKSBkbyB7IFwKLQlpZiAoKERCR19UWVBFX1BSSU5USyA9PSBUeXBlKSAmJiAoUFJJTlRLU19PTikpIHsJXAotCQlwcmludGsgKCIlczoiIHN0cmluZywgX19GVU5DVElPTl9fLCAjI2FyZ3MpOwlcCi0JCXByaW50aygiXG4iKTsJXAotCX0gZWxzZSBpZiAoIUFkYXB0ZXIpCQkJXAotCQk7CQkJCQkJCVwKLQllbHNlIHsJCQkJCQkJXAotCQlpZiAoKChkYmdfbGV2ZWwgJiBEQkdfTFZMX0JJVE1BU0spIDw9IEFkYXB0ZXItPnN0RGVidWdTdGF0ZS5kZWJ1Z19sZXZlbCkgJiYJXAotCQkgICAoKFR5cGUgJiBBZGFwdGVyLT5zdERlYnVnU3RhdGUudHlwZSkgJiYgKFN1YlR5cGUgJiBBZGFwdGVyLT5zdERlYnVnU3RhdGUuc3VidHlwZVtUeXBlXSkpKSB7IFwKLQkJICAgCQlpZiAoZGJnX2xldmVsICYgREJHX05PX0ZVTkNfUFJJTlQpCQlcCi0JCQkJCXByaW50ayAoc3RyaW5nLCAjI2FyZ3MpOwkJCQkJCVwKLQkJCQllbHNlCVwKLQkJCQkJewkJCQkJCQkJCQkJCVwKLQkJCQkJcHJpbnRrICgiJXM6IiBzdHJpbmcsIF9fRlVOQ1RJT05fXywgIyNhcmdzKTsJXAotCQkJCQlwcmludGsoIlxuIik7IFwKLQkJCQkJfSBcCi0JCX0JXAotCQl9CVwKLX0gd2hpbGUgKDApCisjZGVmaW5lIEJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBUeXBlLCBTdWJUeXBlLCBkYmdfbGV2ZWwsIHN0cmluZywgYXJncy4uLikgXAorCWRvIHsJCQkJCQkJCVwKKwkJaWYgKERCR19UWVBFX1BSSU5USyA9PSBUeXBlKQkJCQlcCisJCQlwcl9pbmZvKCIlczoiIHN0cmluZywgX19mdW5jX18sICMjYXJncyk7CVwKKwkJZWxzZSBpZiAoQWRhcHRlciAmJgkJCQkJXAorCQkJIChkYmdfbGV2ZWwgJiBEQkdfTFZMX0JJVE1BU0spIDw9IEFkYXB0ZXItPnN0RGVidWdTdGF0ZS5kZWJ1Z19sZXZlbCAmJiBcCisJCQkgKFR5cGUgJiBBZGFwdGVyLT5zdERlYnVnU3RhdGUudHlwZSkgJiYJCVwKKwkJCSAoU3ViVHlwZSAmIEFkYXB0ZXItPnN0RGVidWdTdGF0ZS5zdWJ0eXBlW1R5cGVdKSkgeyBcCisJCQlpZiAoZGJnX2xldmVsICYgREJHX05PX0ZVTkNfUFJJTlQpCQlcCisJCQkJcHJpbnRrKEtFUk5fREVCVUcgc3RyaW5nLCAjI2FyZ3MpOwlcCisJCQllbHNlCQkJCQkJXAorCQkJCXByaW50ayhLRVJOX0RFQlVHICIlczoiIHN0cmluZywgX19mdW5jX18sICMjYXJncyk7CVwKKwkJfQkJCQkJCQlcCisJfSB3aGlsZSAoMCkKIAogI2RlZmluZSBCQ01fREVCVUdfUFJJTlRfQlVGRkVSKEFkYXB0ZXIsIFR5cGUsIFN1YlR5cGUsIGRiZ19sZXZlbCwgIGJ1ZmZlciwgYnVmZmVybGVuKSBkbyB7IFwKLQkJaWYgKChEQkdfVFlQRV9QUklOVEsgPT0gVHlwZSkgJiYgKFBSSU5US1NfT04pKSB7CVwKLQkJCWJjbV9wcmludF9idWZmZXIoIGRiZ19sZXZlbCwgX19GVU5DVElPTl9fLCBfX0ZJTEVfXywgX19MSU5FX18sIGJ1ZmZlciwgYnVmZmVybGVuLCBCQ01fQkFTRV9UWVBFX0hFWCk7CVwKLQkJfSBlbHNlIGlmICghQWRhcHRlcikJCQlcCi0JCQk7CQkJCQkJCVwKLQkJZWxzZSB7CQkJCQkJCVwKLQkJCWlmICgoKGRiZ19sZXZlbCAmIERCR19MVkxfQklUTUFTSykgPD0gQWRhcHRlci0+c3REZWJ1Z1N0YXRlLmRlYnVnX2xldmVsKSAgJiYgXAotCQkJICAgKChUeXBlICYgQWRhcHRlci0+c3REZWJ1Z1N0YXRlLnR5cGUpICYmIChTdWJUeXBlICYgQWRhcHRlci0+c3REZWJ1Z1N0YXRlLnN1YnR5cGVbVHlwZV0pKSkgeyBcCi0JCQkJCWlmIChkYmdfbGV2ZWwgJiBEQkdfTk9fRlVOQ19QUklOVCkJCVwKLQkJCQkJCWJjbV9wcmludF9idWZmZXIoIGRiZ19sZXZlbCwgTlVMTCwgTlVMTCwgX19MSU5FX18sIGJ1ZmZlciwgYnVmZmVybGVuLCBCQ01fQkFTRV9UWVBFX0hFWCk7CQkJCQkJXAotCQkJCQllbHNlCQkJCQkJCQkJCQkJXAotCQkJCQkJYmNtX3ByaW50X2J1ZmZlciggZGJnX2xldmVsLCBfX0ZVTkNUSU9OX18sIF9fRklMRV9fLCBfX0xJTkVfXywgYnVmZmVyLCBidWZmZXJsZW4sIEJDTV9CQVNFX1RZUEVfSEVYKTsJXAotCQkJfQlcCi0JCX0JXAotCX0gd2hpbGUgKDApCisJaWYgKERCR19UWVBFX1BSSU5USyA9PSBUeXBlIHx8CQkJCQlcCisJICAgIChBZGFwdGVyICYmCQkJCQkJCVwKKwkgICAgIChkYmdfbGV2ZWwgJiBEQkdfTFZMX0JJVE1BU0spIDw9IEFkYXB0ZXItPnN0RGVidWdTdGF0ZS5kZWJ1Z19sZXZlbCAgJiYgXAorCSAgICAgKFR5cGUgJiBBZGFwdGVyLT5zdERlYnVnU3RhdGUudHlwZSkgJiYJCQlcCisJICAgICAoU3ViVHlwZSAmIEFkYXB0ZXItPnN0RGVidWdTdGF0ZS5zdWJ0eXBlW1R5cGVdKSkpIHsJXAorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6XG4iLCBfX2Z1bmNfXyk7CQkJXAorCQlwcmludF9oZXhfZHVtcChLRVJOX0RFQlVHLCAiICIsIERVTVBfUFJFRklYX09GRlNFVCwJXAorCQkJICAgICAgIDE2LCAxLCBidWZmZXIsIGJ1ZmZlcmxlbiwgZmFsc2UpOwlcCisJfQkJCQkJCQkJXAorfSB3aGlsZSgwKQogCiAKICNkZWZpbmUgQkNNX1NIT1dfREVCVUdfQklUTUFQKEFkYXB0ZXIpCWRvIHsgXApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JjbS9IYW5kbGVDb250cm9sUGFja2V0LmMgYi9kcml2ZXJzL3N0YWdpbmcvYmNtL0hhbmRsZUNvbnRyb2xQYWNrZXQuYwppbmRleCA3YjJlYzI4Li4yYjFlOWUxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYmNtL0hhbmRsZUNvbnRyb2xQYWNrZXQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvYmNtL0hhbmRsZUNvbnRyb2xQYWNrZXQuYwpAQCAtMTEsOCArMTEsNyBAQAogRW5xdWV1ZSB0aGUgY29udHJvbCBwYWNrZXQgZm9yIEFwcGxpY2F0aW9uLgogQHJldHVybiBOb25lCiAqLwotVk9JRCBoYW5kbGVfcnhfY29udHJvbF9wYWNrZXQoUE1JTklfQURBUFRFUiBBZGFwdGVyLCAJLyoqPFBvaW50ZXIgdG8gdGhlIEFkYXB0ZXIgc3RydWN0dXJlKi8KLQkJCQkJCQkJc3RydWN0IHNrX2J1ZmYgKnNrYikJCQkJLyoqPFBvaW50ZXIgdG8gdGhlIHNvY2tldCBidWZmZXIqLworc3RhdGljIFZPSUQgaGFuZGxlX3J4X2NvbnRyb2xfcGFja2V0KFBNSU5JX0FEQVBURVIgQWRhcHRlciwgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlQUEVSX1RBUkFOR19EQVRBCXBUYXJhbmcgPSBOVUxMOwogCUJPT0xFQU4gSGlnaFByaW9yaXR5TWVzc2FnZSA9IEZBTFNFOwpAQCAtMjAsOCArMTksMTAgQEAKIAlDSEFSIGNudHJsX21zZ19tYXNrX2JpdCA9IDA7CiAJQk9PTEVBTiBkcm9wX3BrdF9mbGFnID0gVFJVRSA7CiAJVVNIT1JUIHVzU3RhdHVzID0gKihQVVNIT1JUKShza2ItPmRhdGEpOwotCUJDTV9ERUJVR19QUklOVCggQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIENQX0NUUkxfUEtULCBEQkdfTFZMX0FMTCwgIj09PT09PiIpOwotCS8qIEdldCB0aGUgTGVhZGVyIGZpZWxkICovCisKKwlpZiAobmV0aWZfbXNnX3BrdGRhdGEoQWRhcHRlcikpCisJCXByaW50X2hleF9kdW1wKEtFUk5fREVCVUcsIFBGWCAicnggY29udHJvbDogIiwgRFVNUF9QUkVGSVhfTk9ORSwKKwkJCSAgICAgICAxNiwgMSwgc2tiLT5kYXRhLCBza2ItPmxlbiwgMCk7CiAKIAlzd2l0Y2godXNTdGF0dXMpCiAJewpAQCAtMTM0LDcgKzEzNSw3IEBACiAgICAgfQogCXVwKCZBZGFwdGVyLT5SeEFwcENvbnRyb2xRdWV1ZWxvY2spOwogICAgIHdha2VfdXAoJkFkYXB0ZXItPnByb2Nlc3NfcmVhZF93YWl0X3F1ZXVlKTsKLSAgICBiY21fa2ZyZWVfc2tiKHNrYik7CisgICAgZGV2X2tmcmVlX3NrYihza2IpOwogCUJDTV9ERUJVR19QUklOVCggQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIENQX0NUUkxfUEtULCBEQkdfTFZMX0FMTCwgIkFmdGVyIHdha2VfdXBfaW50ZXJydXB0aWJsZSIpOwogfQogCkBAIC0xODUsMzMgKzE4Niw3IEBACiAJCQl7CiAJCQkJREVRVUVVRVBBQ0tFVChBZGFwdGVyLT5SeENvbnRyb2xIZWFkLEFkYXB0ZXItPlJ4Q29udHJvbFRhaWwpOwogLy8JCQkJQWRhcHRlci0+UnhDb250cm9sSGVhZD1jdHJsX3BhY2tldC0+bmV4dDsKLQkJCQkoKFBMSU5VWF9ERVBfREFUQSlBZGFwdGVyLT5wdk9zRGVwRGF0YSktPm5ldHN0YXRzLnJ4X3BhY2tldHMrKzsKLQkJCQkoKFBMSU5VWF9ERVBfREFUQSlBZGFwdGVyLT5wdk9zRGVwRGF0YSktPm5ldHN0YXRzLnJ4X2J5dGVzKz0KLQkJCQkoKFBMRUFERVIpY3RybF9wYWNrZXQtPmRhdGEpLT5QTGVuZ3RoOwogCQkJfQotCQkJI2lmIDAgIC8vSWRsZSBtb2RlIGRlYnVnIHByb2ZpbGluZy4uLgotCQkJaWYoKihQVVNIT1JUKWN0cmxfcGFja2V0LT5kYXRhID09IElETEVfTU9ERV9TVEFUVVMpCi0JCQl7Ci0JCQkJcHVpQnVmZmVyID0gKFBVSU5UKShjdHJsX3BhY2tldC0+ZGF0YSArc2l6ZW9mKFVTSE9SVCkpOwotCQkJCWlmKChudG9obCgqcHVpQnVmZmVyKSA9PSBHT19UT19JRExFX01PREVfUEFZTE9BRCkpCi0JCQkJewotCQkJCQltZW1zZXQoJnR2LCAwLCBzaXplb2YodHYpKTsKLQkJCQkJZG9fZ2V0dGltZW9mZGF5KCZ0dik7Ci0JCQkJCWlmKChudG9obCgqKHB1aUJ1ZmZlcisxKSkgPT0gMCkpCi0JCQkJCXsKLQkJCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX09USEVSUywgQ1BfQ1RSTF9QS1QsIERCR19MVkxfQUxMLCAiSWRsZU1vZGUgV2FrZS11cCBNc2cgZnJvbSBmL3cgYXQgdGltZSA6JWxkIG1zIiwgdHYudHZfc2VjICoxMDAwICsgdHYudHZfdXNlYyAvMTAwMCk7Ci0JCQkJCX0KLQkJCQkJZWxzZQotCQkJCQl7Ci0JCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX09USEVSUywgQ1BfQ1RSTF9QS1QsIERCR19MVkxfQUxMLCAiSWRsZU1vZGUgcmVxIE1zZyBmcm9tIGYvdyBhdCB0aW1lIDolbGQgbXMiLCB0di50dl9zZWMgKjEwMDAgKyB0di50dl91c2VjIC8xMDAwKTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIGlmKChudG9obCgqcHVpQnVmZmVyKSA9PSBJRExFX01PREVfU0ZfVVBEQVRFX01TRykpCi0JCQkJewotCQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIENQX0NUUkxfUEtULCBEQkdfTFZMX0FMTCwgIkdPVCBJRExFX01PREVfU0ZfVVBEQVRFIE1TRyBhdCB0aW1lIDolbGQgbXMiLCB0di50dl9zZWMgKjEwMDAgKyB0di50dl91c2VjIC8xMDAwKTsKLQkJCQl9Ci0JCQl9Ci0JCQkjZW5kaWYKIAogCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSAoJkFkYXB0ZXItPmNvbnRyb2xfcXVldWVfbG9jaywgZmxhZ3MpOwogCQkgCWhhbmRsZV9yeF9jb250cm9sX3BhY2tldChBZGFwdGVyLCBjdHJsX3BhY2tldCk7CkBAIC0yMzQsNyArMjA5LDcgQEAKIAkJewogCQkJUGFja2V0VG9Ecm9wPXBUYXJhbmctPlJ4QXBwQ29udHJvbEhlYWQ7CiAJCQlERVFVRVVFUEFDS0VUKHBUYXJhbmctPlJ4QXBwQ29udHJvbEhlYWQscFRhcmFuZy0+UnhBcHBDb250cm9sVGFpbCk7Ci0JCQliY21fa2ZyZWVfc2tiKFBhY2tldFRvRHJvcCk7CisJCQlkZXZfa2ZyZWVfc2tiKFBhY2tldFRvRHJvcCk7CiAJCX0KIAkJcFRhcmFuZy0+QXBwQ3RybFF1ZXVlTGVuID0gMDsKIAkJLy9kcm9wcGVkIGNvbnRybCBwYWNrZXQgc3RhdGlzdGljcyBhbHNvIHNob3VsZCBiZSByZXNldC4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iY20vSG9zdE1pYnMuaCBiL2RyaXZlcnMvc3RhZ2luZy9iY20vSG9zdE1pYnMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjhhNTc4My4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYmNtL0hvc3RNaWJzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLSNpZm5kZWYgX0hPU1RfTUlCU19ICi0jZGVmaW5lIF9IT1NUX01JQlNfSAotCi1JTlQgUHJvY2Vzc0dldEhvc3RNaWJzKFBNSU5JX0FEQVBURVIgQWRhcHRlciwKLQkJCQkJCSAgUFZPSUQgaW9CdWZmZXIsCi0JCQkJCQkgIFVMT05HIGlucHV0QnVmZmVyTGVuZ3RoKTsKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JjbS9JUHY2UHJvdG9jb2wuYyBiL2RyaXZlcnMvc3RhZ2luZy9iY20vSVB2NlByb3RvY29sLmMKaW5kZXggNWVjM2I4OS4uOTFiNmZiZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JjbS9JUHY2UHJvdG9jb2wuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvYmNtL0lQdjZQcm90b2NvbC5jCkBAIC0xLDUgKzEsOSBAQAogI2luY2x1ZGUgImhlYWRlcnMuaCIKIAorc3RhdGljIEJPT0xFQU4gTWF0Y2hTcmNJcHY2QWRkcmVzcyhTX0NMQVNTSUZJRVJfUlVMRSAqcHN0Q2xhc3NpZmllclJ1bGUsSVBWNkhlYWRlciAqcHN0SXB2NkhlYWRlcik7CitzdGF0aWMgQk9PTEVBTiBNYXRjaERlc3RJcHY2QWRkcmVzcyhTX0NMQVNTSUZJRVJfUlVMRSAqcHN0Q2xhc3NpZmllclJ1bGUsSVBWNkhlYWRlciAqcHN0SXB2NkhlYWRlcik7CitzdGF0aWMgVk9JRCBEdW1wSXB2NkhlYWRlcihJUFY2SGVhZGVyICpwc3RJcHY2SGVhZGVyKTsKKwogc3RhdGljIFVDSEFSICogR2V0TmV4dElQVjZDaGFpbmVkSGVhZGVyKFVDSEFSICoqcHB1Y1BheWxvYWQsVUNIQVIgKnB1Y05leHRIZWFkZXIsQk9PTEVBTiAqYlBhcnNlRG9uZSxVU0hPUlQgKnB1c1BheWxvYWRMZW5ndGgpCiB7CiAJVUNIQVIgKnB1Y1JldEhlYWRlclB0ciA9IE5VTEw7CkBAIC0yNTcsNyArMjYxLDcgQEAKIH0KIAogCi1CT09MRUFOIE1hdGNoU3JjSXB2NkFkZHJlc3MoU19DTEFTU0lGSUVSX1JVTEUgKnBzdENsYXNzaWZpZXJSdWxlLElQVjZIZWFkZXIgKnBzdElwdjZIZWFkZXIpCitzdGF0aWMgQk9PTEVBTiBNYXRjaFNyY0lwdjZBZGRyZXNzKFNfQ0xBU1NJRklFUl9SVUxFICpwc3RDbGFzc2lmaWVyUnVsZSxJUFY2SGVhZGVyICpwc3RJcHY2SGVhZGVyKQogewogCVVJTlQgdWlMb29wSW5kZXg9MDsKIAlVSU5UICB1aUlwdjZBZGRJbmRleD0wOwpAQCAtMzEwLDcgKzMxNCw3IEBACiAJcmV0dXJuIEZBTFNFOwogfQogCi1CT09MRUFOIE1hdGNoRGVzdElwdjZBZGRyZXNzKFNfQ0xBU1NJRklFUl9SVUxFICpwc3RDbGFzc2lmaWVyUnVsZSxJUFY2SGVhZGVyICpwc3RJcHY2SGVhZGVyKQorc3RhdGljIEJPT0xFQU4gTWF0Y2hEZXN0SXB2NkFkZHJlc3MoU19DTEFTU0lGSUVSX1JVTEUgKnBzdENsYXNzaWZpZXJSdWxlLElQVjZIZWFkZXIgKnBzdElwdjZIZWFkZXIpCiB7CiAJVUlOVCB1aUxvb3BJbmRleD0wOwogCVVJTlQgIHVpSXB2NkFkZEluZGV4PTA7CkBAIC0zNzYsNyArMzgwLDcgQEAKIAogfQogCi1WT0lEIER1bXBJcHY2SGVhZGVyKElQVjZIZWFkZXIgKnBzdElwdjZIZWFkZXIpCitzdGF0aWMgVk9JRCBEdW1wSXB2NkhlYWRlcihJUFY2SGVhZGVyICpwc3RJcHY2SGVhZGVyKQogewogCVVDSEFSIHVjVmVyc2lvbjsKIAlVQ0hBUiAgdWNQcmlvIDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iY20vSVB2NlByb3RvY29sSGRyLmggYi9kcml2ZXJzL3N0YWdpbmcvYmNtL0lQdjZQcm90b2NvbEhkci5oCmluZGV4IGI5M2Y3OTAuLmEwZGI1YTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9iY20vSVB2NlByb3RvY29sSGRyLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JjbS9JUHY2UHJvdG9jb2xIZHIuaApAQCAtMTAxLDE1ICsxMDEsMTIgQEAKIAogCiAvL0Z1bmN0aW9uIFByb3RvdHlwZXMKLUJPT0xFQU4gTWF0Y2hTcmNJcHY2QWRkcmVzcyhTX0NMQVNTSUZJRVJfUlVMRSAqcHN0Q2xhc3NpZmllclJ1bGUsSVBWNkhlYWRlciAqcHN0SXB2NkhlYWRlcik7Ci1CT09MRUFOIE1hdGNoRGVzdElwdjZBZGRyZXNzKFNfQ0xBU1NJRklFUl9SVUxFICpwc3RDbGFzc2lmaWVyUnVsZSxJUFY2SGVhZGVyICpwc3RJcHY2SGVhZGVyKTsKIAogVVNIT1JUCUlwVmVyc2lvbjYoUE1JTklfQURBUFRFUiBBZGFwdGVyLCAvKio8IFBvaW50ZXIgdG8gdGhlIGRyaXZlciBjb250cm9sIHN0cnVjdHVyZSAqLwogCQkJCQlQVk9JRCBwY0lwSGVhZGVyLCAvKio8UG9pbnRlciB0byB0aGUgSVAgSGRyIG9mIHRoZSBwYWNrZXQqLwogCQkJCQlTX0NMQVNTSUZJRVJfUlVMRSAqcHN0Q2xhc3NpZmllclJ1bGUgKTsKIAogVk9JRCBEdW1wSXB2NkFkZHJlc3MoVUxPTkcgKnB1SXB2NkFkZHJlc3MpOwotVk9JRCBEdW1wSXB2NkhlYWRlcihJUFY2SGVhZGVyICpwc3RJcHY2SGVhZGVyKTsKIAogZXh0ZXJuIEJPT0xFQU4gTWF0Y2hTcmNQb3J0KFNfQ0xBU1NJRklFUl9SVUxFICpwc3RDbGFzc2lmaWVyUnVsZSxVU0hPUlQgdXNoU3JjUG9ydCk7CiBleHRlcm4gQk9PTEVBTiBNYXRjaERlc3RQb3J0KFNfQ0xBU1NJRklFUl9SVUxFICpwc3RDbGFzc2lmaWVyUnVsZSxVU0hPUlQgdXNoU3JjUG9ydCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmNtL0ludGVyZmFjZURsZC5jIGIvZHJpdmVycy9zdGFnaW5nL2JjbS9JbnRlcmZhY2VEbGQuYwppbmRleCA2MGMwZjI5Li5kZjY0YWNiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYmNtL0ludGVyZmFjZURsZC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9iY20vSW50ZXJmYWNlRGxkLmMKQEAgLTEsMjAgKzEsMTggQEAKICNpbmNsdWRlICJoZWFkZXJzLmgiCiAKLSNpZm5kZWYgQkNNX1NITV9JTlRFUkZBQ0UKIAogaW50IEludGVyZmFjZUZpbGVEb3dubG9hZCggUFZPSUQgYXJnLAogICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGZpbGUgKmZscCwKICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBvbl9jaGlwX2xvYykKIHsKLSAgICBjaGFyICAgICAgICAgICAgKmJ1ZmY9TlVMTDsKICAgIC8vIHVuc2lnbmVkIGludCAgICByZWc9MDsKICAgICBtbV9zZWdtZW50X3QgICAgb2xkZnM9ezB9OwogICAgIGludCAgICAgICAgICAgICBlcnJubz0wLCBsZW49MCAvKixpc19jb25maWdfZmlsZSA9IDAqLzsKICAgICBsb2ZmX3QgICAgICAgICAgcG9zPTA7CiAJUFNfSU5URVJGQUNFX0FEQVBURVIgcHNJbnRmQWRhcHRlciA9IChQU19JTlRFUkZBQ0VfQURBUFRFUilhcmc7CiAJLy9QTUlOSV9BREFQVEVSIEFkYXB0ZXIgPSBwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXI7CisgICAgY2hhciAgICAgICAgICAgICpidWZmPWttYWxsb2MoTUFYX1RSQU5TRkVSX0NUUkxfQllURV9VU0IsIEdGUF9LRVJORUwpOwogCi0gICAgYnVmZj0oUENIQVIpa21hbGxvYyhNQVhfVFJBTlNGRVJfQ1RSTF9CWVRFX1VTQiwgR0ZQX0tFUk5FTCk7CiAgICAgaWYoIWJ1ZmYpCiAgICAgewogICAgICAgICByZXR1cm4gLUVOT01FTTsKQEAgLTQ5LDcgKzQ3LDcgQEAKICAgICAgICAgb25fY2hpcF9sb2MrPU1BWF9UUkFOU0ZFUl9DVFJMX0JZVEVfVVNCOwogCX0vKiBFbmQgb2YgZm9yKDs7KSovCiAKLQliY21fa2ZyZWUoYnVmZik7CisJa2ZyZWUoYnVmZik7CiAgICAgcmV0dXJuIGVycm5vOwogfQogCkBAIC01Nyw3ICs1NSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZmlsZSAqZmxwLAogICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IG9uX2NoaXBfbG9jKQogewotICAgIGNoYXIgICAgICAgICAgICAqYnVmZj1OVUxMLCAqYnVmZl9yZWFkYmFjaz1OVUxMOworICAgIGNoYXIgICAgICAgICAgICAqYnVmZiwgKmJ1ZmZfcmVhZGJhY2s7CiAgICAgdW5zaWduZWQgaW50ICAgIHJlZz0wOwogICAgIG1tX3NlZ21lbnRfdCAgICBvbGRmcz17MH07CiAgICAgaW50ICAgICAgICAgICAgIGVycm5vPTAsIGxlbj0wLCBpc19jb25maWdfZmlsZSA9IDA7CkBAIC02NiwxMiArNjQsMTIgQEAKIAlJTlQJCQkJU3RhdHVzID0gU1RBVFVTX1NVQ0NFU1M7CiAJUFNfSU5URVJGQUNFX0FEQVBURVIgcHNJbnRmQWRhcHRlciA9IChQU19JTlRFUkZBQ0VfQURBUFRFUilhcmc7CiAKLSAgICBidWZmPShQQ0hBUilrbWFsbG9jKE1BWF9UUkFOU0ZFUl9DVFJMX0JZVEVfVVNCLCBHRlBfRE1BKTsKLSAgICBidWZmX3JlYWRiYWNrPShQQ0hBUilrbWFsbG9jKE1BWF9UUkFOU0ZFUl9DVFJMX0JZVEVfVVNCICwgR0ZQX0RNQSk7CisgICAgYnVmZj1rbWFsbG9jKE1BWF9UUkFOU0ZFUl9DVFJMX0JZVEVfVVNCLCBHRlBfRE1BKTsKKyAgICBidWZmX3JlYWRiYWNrPWttYWxsb2MoTUFYX1RSQU5TRkVSX0NUUkxfQllURV9VU0IgLCBHRlBfRE1BKTsKICAgICBpZighYnVmZiB8fCAhYnVmZl9yZWFkYmFjaykKICAgICB7Ci0gICAgICAgIGJjbV9rZnJlZShidWZmKTsKLSAgICAgICAgYmNtX2tmcmVlKGJ1ZmZfcmVhZGJhY2spOworICAgICAgICBrZnJlZShidWZmKTsKKyAgICAgICAga2ZyZWUoYnVmZl9yZWFkYmFjayk7CiAKICAgICAgICAgcmV0dXJuIC1FTk9NRU07CiAgICAgfQpAQCAtMTM4LDggKzEzNiw4IEBACiAgICAgICAgIG9uX2NoaXBfbG9jKz1NQVhfVFJBTlNGRVJfQ1RSTF9CWVRFX1VTQjsKICAgICB9LyogRW5kIG9mIHdoaWxlKDEpKi8KIGV4aXQ6Ci0gICAgYmNtX2tmcmVlKGJ1ZmYpOwotICAgIGJjbV9rZnJlZShidWZmX3JlYWRiYWNrKTsKKyAgICBrZnJlZShidWZmKTsKKyAgICBrZnJlZShidWZmX3JlYWRiYWNrKTsKIAlyZXR1cm4gU3RhdHVzOwogfQogCkBAIC0xNjUsNyArMTYzLDcgQEAKIAkJCXBzRndJbmZvLT5wdk1hcHBlZEZpcm13YXJlQWRkcmVzcywgcHNGd0luZm8tPnUzMkZpcm13YXJlTGVuZ3RoKTsKIAlpZihyZXR2YWwpCiAJewotCQliY21fa2ZyZWUgKEFkYXB0ZXItPnBzdGFyZ2V0cGFyYW1zKTsKKwkJa2ZyZWUoQWRhcHRlci0+cHN0YXJnZXRwYXJhbXMpOwogCQlBZGFwdGVyLT5wc3RhcmdldHBhcmFtcyA9IE5VTEw7CiAJCXJldHVybiAtRUZBVUxUOwogCX0KQEAgLTIzMSw0MSArMjI5LDYgQEAKIAogCXJldHVybiByZXR2YWw7CiB9Ci0jaWYgMAotc3RhdGljIGludCBiY21fZG93bmxvYWRfYnVmZmVyKFBNSU5JX0FEQVBURVIgQWRhcHRlciwKLQl1bnNpZ25lZCBjaGFyICptYXBwZWRidWZmZXIsIHVuc2lnbmVkIGludCB1MzJGaXJtd2FyZUxlbmd0aCwKLQl1bnNpZ25lZCBsb25nIHUzMlN0YXJ0aW5nQWRkcmVzcykKLXsKLSAgICBjaGFyICAgICAgICAgICAgKmJ1ZmY9TlVMTDsKLSAgICB1bnNpZ25lZCBpbnQgICAgbGVuID0gMDsKLQlpbnQgCQkJcmV0dmFsID0gU1RBVFVTX1NVQ0NFU1M7Ci0JYnVmZiA9IGt6YWxsb2MoTUFYX1RSQU5TRkVSX0NUUkxfQllURV9VU0IsIEdGUF9LRVJORUwpOwotCi0JbGVuID0gdTMyRmlybXdhcmVMZW5ndGg7Ci0KLQl3aGlsZSh1MzJGaXJtd2FyZUxlbmd0aCkKLQl7Ci0JCWxlbiA9IE1JTl9WQUwgKHUzMkZpcm13YXJlTGVuZ3RoLCBNQVhfVFJBTlNGRVJfQ1RSTF9CWVRFX1VTQik7Ci0JCWlmKFNUQVRVU19TVUNDRVNTICE9IChyZXR2YWwgPSBjb3B5X2Zyb21fdXNlcihidWZmLAotCQkJCSh1bnNpZ25lZCBjaGFyICopbWFwcGVkYnVmZmVyLCBsZW4pKSkKLQkJewotCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfSU5JVEVYSVQsIE1QX0lOSVQsIERCR19MVkxfQUxMLCAiY29weV9mcm9tX3VzZXIgZmFpbGVkXG4iKTsKLQkJCWJyZWFrOwotCQl9Ci0JCXJldHZhbCA9IHdybSAoQWRhcHRlciwgdTMyU3RhcnRpbmdBZGRyZXNzLCBidWZmLCBsZW4pOwotCQlpZihyZXR2YWwpCi0JCXsKLQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX0lOSVRFWElULCBNUF9JTklULCBEQkdfTFZMX0FMTCwgIndybSBmYWlsZWRcbiIpOwotCQkJYnJlYWs7Ci0JCX0KLQkJdTMyU3RhcnRpbmdBZGRyZXNzIAkrPSBsZW47Ci0JCXUzMkZpcm13YXJlTGVuZ3RoICAJLT0gbGVuOwotCQltYXBwZWRidWZmZXIJICAgCSs9bGVuOwotCX0KLQliY21fa2ZyZWUoYnVmZik7Ci0JcmV0dXJuIHJldHZhbDsKLX0KLSNlbmRpZgogc3RhdGljIGludCBiY21fY29tcGFyZV9idWZmX2NvbnRlbnRzKHVuc2lnbmVkIGNoYXIgKnJlYWRiYWNrYnVmZiwKIAl1bnNpZ25lZCBjaGFyICpidWZmLHVuc2lnbmVkIGludCBsZW4pCiB7CkBAIC0yOTcsNTggKzI2MCw2IEBACiAJfQogCXJldHVybiByZXR2YWw7CiB9Ci0jaWYgMAotc3RhdGljIGludCBiY21fYnVmZmVyX3JlYWRiYWNrKFBNSU5JX0FEQVBURVIgQWRhcHRlciwKLQl1bnNpZ25lZCBjaGFyICptYXBwZWRidWZmZXIsIHVuc2lnbmVkIGludCB1MzJGaXJtd2FyZUxlbmd0aCwKLQl1bnNpZ25lZCBsb25nIHUzMlN0YXJ0aW5nQWRkcmVzcykKLXsKLQl1bnNpZ25lZCBjaGFyICpidWZmID0gTlVMTDsKLQl1bnNpZ25lZCBjaGFyICpyZWFkYmFja2J1ZmYgPSBOVUxMOwotCXVuc2lnbmVkIGludCAgbGVuID0gdTMyRmlybXdhcmVMZW5ndGg7Ci0JaW50IHJldHZhbCA9IFNUQVRVU19TVUNDRVNTOwotCi0gICAgYnVmZj0odW5zaWduZWQgY2hhciAqKWt6YWxsb2MoTUFYX1RSQU5TRkVSX0NUUkxfQllURV9VU0IsIEdGUF9LRVJORUwpOwotCWlmKE5VTEwgPT0gYnVmZikKLQkJcmV0dXJuIC1FTk9NRU07Ci0JcmVhZGJhY2tidWZmID0gICh1bnNpZ25lZCBjaGFyICopa3phbGxvYyhNQVhfVFJBTlNGRVJfQ1RSTF9CWVRFX1VTQiwKLQkJCQkJR0ZQX0tFUk5FTCk7Ci0JaWYoTlVMTCA9PSByZWFkYmFja2J1ZmYpCi0JewotCQliY21fa2ZyZWUoYnVmZik7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQl3aGlsZSAodTMyRmlybXdhcmVMZW5ndGggJiYgIXJldHZhbCkKLQl7Ci0JCWxlbiA9IE1JTl9WQUwgKHUzMkZpcm13YXJlTGVuZ3RoLCBNQVhfVFJBTlNGRVJfQ1RSTF9CWVRFX1VTQik7Ci0KLQkJLyogcmVhZCBmcm9tIHRoZSBhcHBsIGJ1ZmYgYW5kIHRoZW4gcmVhZCBmcm9tIHRoZSB0YXJnZXQsIGNvbXBhcmUgKi8KLQkJaWYoU1RBVFVTX1NVQ0NFU1MgIT0gKHJldHZhbCA9IGNvcHlfZnJvbV91c2VyKGJ1ZmYsCi0JCQkJKHVuc2lnbmVkIGNoYXIgKiltYXBwZWRidWZmZXIsIGxlbikpKQotCQl7Ci0JCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9JTklURVhJVCwgTVBfSU5JVCwgREJHX0xWTF9BTEwsICJjb3B5X2Zyb21fdXNlciBmYWlsZWRcbiIpOwotCQkJYnJlYWs7Ci0JCX0KLQkJcmV0dmFsID0gcmRtIChBZGFwdGVyLCB1MzJTdGFydGluZ0FkZHJlc3MsIHJlYWRiYWNrYnVmZiwgbGVuKTsKLQkJaWYocmV0dmFsKQotCQl7Ci0JCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9JTklURVhJVCwgTVBfSU5JVCwgREJHX0xWTF9BTEwsICJyZG0gZmFpbGVkXG4iKTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJaWYgKFNUQVRVU19TVUNDRVNTICE9Ci0JCQkocmV0dmFsID0gYmNtX2NvbXBhcmVfYnVmZl9jb250ZW50cyAocmVhZGJhY2tidWZmLCBidWZmLCBsZW4pKSkKLQkJewotCQkJYnJlYWs7Ci0JCX0KLQkJdTMyU3RhcnRpbmdBZGRyZXNzIAkrPSBsZW47Ci0JCXUzMkZpcm13YXJlTGVuZ3RoICAJLT0gbGVuOwotCQltYXBwZWRidWZmZXIJICAgCSs9bGVuOwotCX0vKiBlbmQgb2Ygd2hpbGUgKHUzMkZpcm13YXJlTGVuZ3RoICYmICFyZXR2YWwpICovCi0JYmNtX2tmcmVlKGJ1ZmYpOwotCWJjbV9rZnJlZShyZWFkYmFja2J1ZmYpOwotCXJldHVybiByZXR2YWw7Ci19Ci0jZW5kaWYKIGludCBiY21faW9jdGxfZndfZG93bmxvYWQoUE1JTklfQURBUFRFUiBBZGFwdGVyLCBGSVJNV0FSRV9JTkZPICpwc0Z3SW5mbykKIHsKIAlpbnQgcmV0dmFsID0gU1RBVFVTX1NVQ0NFU1M7CkBAIC0zNzUsNyArMjg2LDcgQEAKIAllbHNlCiAJewogCi0JCWJ1ZmYgPSAoUFVDSEFSKWt6YWxsb2MocHNGd0luZm8tPnUzMkZpcm13YXJlTGVuZ3RoLEdGUF9LRVJORUwpOworCQlidWZmID0ga3phbGxvYyhwc0Z3SW5mby0+dTMyRmlybXdhcmVMZW5ndGgsR0ZQX0tFUk5FTCk7CiAJCWlmKGJ1ZmY9PU5VTEwpCiAJCXsKIAkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX0lOSVRFWElULCBNUF9JTklULCBEQkdfTFZMX0FMTCwiRmFpbGVkIGluIGFsbG9jYXRpb24gbWVtb3J5Iik7CkBAIC0zODksMjMgKzMwMCw2IEBACiAJCQlnb3RvIGVycm9yIDsKIAkJfQogCi0JCSNpZiAwCi0JCXJldHZhbCA9IGJjbV9kb3dubG9hZF9idWZmZXIoQWRhcHRlciwKLQkJCQkodW5zaWduZWQgY2hhciAqKXBzRndJbmZvLT5wdk1hcHBlZEZpcm13YXJlQWRkcmVzcywKLQkJCQlwc0Z3SW5mby0+dTMyRmlybXdhcmVMZW5ndGgsIHBzRndJbmZvLT51MzJTdGFydGluZ0FkZHJlc3MpOwotCQlpZihyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCXsKLQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX0lOSVRFWElULCBNUF9JTklULCBEQkdfTFZMX0FMTCwgIlVzZXIgc3BhY2UgYnVmZmVyIGRvd25sb2FkIGZhaWxzLi4uLiIpOwotCQl9Ci0JCXJldHZhbCA9IGJjbV9idWZmZXJfcmVhZGJhY2sgKEFkYXB0ZXIsCi0JCQkJKHVuc2lnbmVkIGNoYXIgKilwc0Z3SW5mby0+cHZNYXBwZWRGaXJtd2FyZUFkZHJlc3MsCi0JCQkJcHNGd0luZm8tPnUzMkZpcm13YXJlTGVuZ3RoLCBwc0Z3SW5mby0+dTMyU3RhcnRpbmdBZGRyZXNzKTsKLQotCQlpZihyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCXsKLQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX0lOSVRFWElULCBNUF9JTklULCBEQkdfTFZMX0FMTCwgInJlYWQgYmFjayB2ZXJpZmllciBmYWlsZWQgLi4uLiIpOwotCQl9Ci0JCSNlbmRpZgogCQlyZXR2YWwgPSBidWZmRG5sZFZlcmlmeShBZGFwdGVyLAogCQkJCQlidWZmLAogCQkJCQlwc0Z3SW5mby0+dTMyRmlybXdhcmVMZW5ndGgsCkBAIC00MTcsNyArMzExLDcgQEAKIAkJfQogCX0KIGVycm9yOgotCWJjbV9rZnJlZShidWZmKTsKKwlrZnJlZShidWZmKTsKIAlyZXR1cm4gcmV0dmFsOwogfQogCkBAIC00NTAsMTEgKzM0NCwxMCBAQAogCQkJUFVDSEFSIG1hcHBlZGJ1ZmZlciwgVUlOVCB1MzJGaXJtd2FyZUxlbmd0aCwKIAkJCVVMT05HIHUzMlN0YXJ0aW5nQWRkcmVzcykKIHsKLQlQVUNIQVIgcmVhZGJhY2tidWZmID0gTlVMTDsKIAlVSU5UIGxlbiA9IHUzMkZpcm13YXJlTGVuZ3RoOwogCUlOVCByZXR2YWwgPSBTVEFUVVNfU1VDQ0VTUzsKKwlQVUNIQVIgcmVhZGJhY2tidWZmID0ga3phbGxvYyhNQVhfVFJBTlNGRVJfQ1RSTF9CWVRFX1VTQixHRlBfS0VSTkVMKTsKIAotCXJlYWRiYWNrYnVmZiA9IChQVUNIQVIpa3phbGxvYyhNQVhfVFJBTlNGRVJfQ1RSTF9CWVRFX1VTQixHRlBfS0VSTkVMKTsKIAlpZihOVUxMID09IHJlYWRiYWNrYnVmZikKIAl7CiAJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX0lOSVRFWElULCBNUF9JTklULCBEQkdfTFZMX0FMTCwgIk1FTU9SWSBBTExPQ0FUSU9OIEZBSUxFRCIpOwpAQCAtNDgwLDcgKzM3Myw3IEBACiAJCXUzMkZpcm13YXJlTGVuZ3RoICAJLT0gbGVuOwogCQltYXBwZWRidWZmZXIJICAgCSs9bGVuOwogCX0vKiBlbmQgb2Ygd2hpbGUgKHUzMkZpcm13YXJlTGVuZ3RoICYmICFyZXR2YWwpICovCi0JYmNtX2tmcmVlKHJlYWRiYWNrYnVmZik7CisJa2ZyZWUocmVhZGJhY2tidWZmKTsKIAlyZXR1cm4gcmV0dmFsOwogfQogCkBAIC01MDYsNSArMzk5LDQgQEAKIAlyZXR1cm4gc3RhdHVzOwogfQogCi0jZW5kaWYKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JjbS9JbnRlcmZhY2VJZGxlTW9kZS5jIGIvZHJpdmVycy9zdGFnaW5nL2JjbS9JbnRlcmZhY2VJZGxlTW9kZS5jCmluZGV4IDA3NTAzODIuLmJmNWMwYWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9iY20vSW50ZXJmYWNlSWRsZU1vZGUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvYmNtL0ludGVyZmFjZUlkbGVNb2RlLmMKQEAgLTk4LDE0ICs5OCw2IEBACiAJCQlBZGFwdGVyLT5iVHJpZWRUb1dha2VVcEZyb21sb3dQb3dlck1vZGUgPSBGQUxTRTsKIAogCQkJd2FrZV91cCgmQWRhcHRlci0+bG93cG93ZXJfbW9kZV93YWl0X3F1ZXVlKTsKLQkJI2lmIDAKLQkJCWlmKEFkYXB0ZXItPkxFREluZm8ubGVkX3RocmVhZF9ydW5uaW5nICYgQkNNX0xFRF9USFJFQURfUlVOTklOR19BQ1RJVkVMWSkKLQkJCXsKLQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIElETEVfTU9ERSwgREJHX0xWTF9BTEwsIkxFRCBUaHJlYWQgaXMgUnVubmluZy4gSGVuY2UgU2V0dGluZyB0aGUgTEVEIEV2ZW50IGFzIElETEVNT0RFX0VYSVQiKTsKLQkJCQlBZGFwdGVyLT5Ecml2ZXJTdGF0ZSA9IElETEVNT0RFX0VYSVQ7Ci0JCQkJd2FrZV91cCgmQWRhcHRlci0+TEVESW5mby5ub3RpZnlfbGVkX2V2ZW50KTsKLQkJCX0KLQkJI2VuZGlmCiAKIAkJfQogCQllbHNlCkBAIC0xNTQsMTcgKzE0Niw3IEBACiAJcmV0dXJuIHN0YXR1czsKIH0KIAotCi1WT0lEIEludGVyZmFjZVdyaXRlSWRsZU1vZGVXYWtlUGF0dGVybihQTUlOSV9BREFQVEVSIEFkYXB0ZXIpCi17Ci0vKglCZWNlZW1Xcml0ZU1lbW9yeVVzaG9ydChBZGFwdGVyLCBIb3N0MkNQVV9NYWlsYm94X0xvdywgMHgxZDFlKTsKLQlCZWNlZW1Xcml0ZU1lbW9yeVVzaG9ydChBZGFwdGVyLCBIb3N0MkNQVV9NYWlsYm94X0xvdywgMHgxZDFlKTsKLQlCZWNlZW1Xcml0ZU1lbW9yeVVzaG9ydChBZGFwdGVyLCBIb3N0MkNQVV9NYWlsYm94X1VwcCwgMHhkMGVhKTsKLQlCZWNlZW1Xcml0ZU1lbW9yeVVzaG9ydChBZGFwdGVyLCBIb3N0MkNQVV9NYWlsYm94X1VwcCwgMHhkMGVhKTsqLwotCXJldHVybjsKLX0KLQotaW50IEludGVyZmFjZUFib3J0SWRsZW1vZGUoUE1JTklfQURBUFRFUiBBZGFwdGVyLCB1bnNpZ25lZCBpbnQgUGF0dGVybikKK3N0YXRpYyBpbnQgSW50ZXJmYWNlQWJvcnRJZGxlbW9kZShQTUlOSV9BREFQVEVSIEFkYXB0ZXIsIHVuc2lnbmVkIGludCBQYXR0ZXJuKQogewogCWludCAJc3RhdHVzID0gU1RBVFVTX1NVQ0NFU1M7CiAJdW5zaWduZWQgaW50IHZhbHVlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JjbS9JbnRlcmZhY2VJZGxlTW9kZS5oIGIvZHJpdmVycy9zdGFnaW5nL2JjbS9JbnRlcmZhY2VJZGxlTW9kZS5oCmluZGV4IDFiYzcyM2QuLjg1OWEyZmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9iY20vSW50ZXJmYWNlSWRsZU1vZGUuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYmNtL0ludGVyZmFjZUlkbGVNb2RlLmgKQEAgLTcsOCArNyw2IEBACiAKIFZPSUQgSW50ZXJmYWNlV3JpdGVJZGxlTW9kZVdha2VQYXR0ZXJuKFBNSU5JX0FEQVBURVIgQWRhcHRlcik7CiAKLUlOVCBJbnRlcmZhY2VBYm9ydElkbGVtb2RlKFBNSU5JX0FEQVBURVIgQWRhcHRlciwgdW5zaWduZWQgaW50IFBhdHRlcm4pOwotCiBJTlQgSW50ZXJmYWNlV2FrZVVwKFBNSU5JX0FEQVBURVIgQWRhcHRlcik7CiAKIFZPSUQgSW50ZXJmYWNlSGFuZGxlU2h1dGRvd25Nb2RlV2FrZXVwKFBNSU5JX0FEQVBURVIgQWRhcHRlcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmNtL0ludGVyZmFjZUluaXQuYyBiL2RyaXZlcnMvc3RhZ2luZy9iY20vSW50ZXJmYWNlSW5pdC5jCmluZGV4IGU5N2FkOTkuLmQ3OGQ1ZWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9iY20vSW50ZXJmYWNlSW5pdC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9iY20vSW50ZXJmYWNlSW5pdC5jCkBAIC0xLDU0ICsxLDYzIEBACiAjaW5jbHVkZSAiaGVhZGVycy5oIgogCiBzdGF0aWMgc3RydWN0IHVzYl9kZXZpY2VfaWQgSW50ZXJmYWNlVXNidGFibGVbXSA9IHsKLSAgICB7IFVTQl9ERVZJQ0UoQkNNX1VTQl9WRU5ET1JfSURfVDMsIEJDTV9VU0JfUFJPRFVDVF9JRF9UMykgfSwKKwl7IFVTQl9ERVZJQ0UoQkNNX1VTQl9WRU5ET1JfSURfVDMsIEJDTV9VU0JfUFJPRFVDVF9JRF9UMykgfSwKIAl7IFVTQl9ERVZJQ0UoQkNNX1VTQl9WRU5ET1JfSURfVDMsIEJDTV9VU0JfUFJPRFVDVF9JRF9UM0IpIH0sCiAJeyBVU0JfREVWSUNFKEJDTV9VU0JfVkVORE9SX0lEX1QzLCBCQ01fVVNCX1BST0RVQ1RfSURfVDNMKSB9LAotICAgIAl7IFVTQl9ERVZJQ0UoQkNNX1VTQl9WRU5ET1JfSURfWlRFLCBCQ01fVVNCX1BST0RVQ1RfSURfMjI2KSB9LAorCXsgVVNCX0RFVklDRShCQ01fVVNCX1ZFTkRPUl9JRF9UMywgQkNNX1VTQl9QUk9EVUNUX0lEX1NNMjUwKSB9LAorCXsgVVNCX0RFVklDRShCQ01fVVNCX1ZFTkRPUl9JRF9aVEUsIEJDTV9VU0JfUFJPRFVDVF9JRF8yMjYpIH0sCiAJeyBVU0JfREVWSUNFKEJDTV9VU0JfVkVORE9SX0lEX0ZPWENPTk4sIEJDTV9VU0JfUFJPRFVDVF9JRF8xOTAxKSB9LAotICAgIHt9CisJeyBVU0JfREVWSUNFKEJDTV9VU0JfVkVORE9SX0lEX1pURSwgQkNNX1VTQl9QUk9EVUNUX0lEX1pURV9UVTI1KSB9LAorCXsgfQogfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUodXNiLCBJbnRlcmZhY2VVc2J0YWJsZSk7CiAKLVZPSUQgSW50ZXJmYWNlQWRhcHRlckZyZWUoUFNfSU5URVJGQUNFX0FEQVBURVIgcHNJbnRmQWRhcHRlcikKK3N0YXRpYyBpbnQgZGVidWcgPSAtMTsKK21vZHVsZV9wYXJhbShkZWJ1ZywgdWludCwgMDYwMCk7CitNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAiRGVidWcgbGV2ZWwgKDA9bm9uZSwuLi4sMTY9YWxsKSIpOworCitzdGF0aWMgY29uc3QgdTMyIGRlZmF1bHRfbXNnID0KKwlORVRJRl9NU0dfRFJWIHwgTkVUSUZfTVNHX1BST0JFIHwgTkVUSUZfTVNHX0xJTksKKwl8IE5FVElGX01TR19USU1FUiB8IE5FVElGX01TR19UWF9FUlIgfCBORVRJRl9NU0dfUlhfRVJSCisJfCBORVRJRl9NU0dfSUZVUCB8IE5FVElGX01TR19JRkRPV047CisKK3N0YXRpYyBpbnQgSW50ZXJmYWNlQWRhcHRlckluaXQoUFNfSU5URVJGQUNFX0FEQVBURVIgQWRhcHRlcik7CisKK3N0YXRpYyB2b2lkIEludGVyZmFjZUFkYXB0ZXJGcmVlKFBTX0lOVEVSRkFDRV9BREFQVEVSIHBzSW50ZkFkYXB0ZXIpCiB7Ci0JSU5UIGkgPSAwOwotCS8vIFdha2UgdXAgdGhlIHdhaXRfcXVldWUuLi4KLQlpZihwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXItPkxFREluZm8ubGVkX3RocmVhZF9ydW5uaW5nICYgQkNNX0xFRF9USFJFQURfUlVOTklOR19BQ1RJVkVMWSkKLQl7CisJaW50IGkgPSAwOworCisJLyogV2FrZSB1cCB0aGUgd2FpdF9xdWV1ZS4uLiAqLworCWlmIChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXItPkxFREluZm8ubGVkX3RocmVhZF9ydW5uaW5nICYgQkNNX0xFRF9USFJFQURfUlVOTklOR19BQ1RJVkVMWSkgewogCQlwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXItPkRyaXZlclN0YXRlID0gRFJJVkVSX0hBTFQ7CiAJCXdha2VfdXAoJnBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlci0+TEVESW5mby5ub3RpZnlfbGVkX2V2ZW50KTsKIAl9CiAJcmVzZXRfY2FyZF9wcm9jKHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlcik7CiAKLQkvL3dvcnN0IGNhc2UgdGltZSB0YWtlbiBieSB0aGUgUkRNL1dSTSB3aWxsIGJlIDUgc2VjLiB3aWxsIGNoZWNrIGFmdGVyIGV2ZXJ5IDEwMCBtcwotCS8vdG8gYWNjZXJ0YWluIHRoZSBkZXZpY2UgaXMgbm90IGJlaW5nIGFjY2Vzc2VkLiBBZnRlciB0aGlzIE5vIFJETS9XUk0gc2hvdWxkIGJlIG1hZGUuCi0Jd2hpbGUocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLT5EZXZpY2VBY2Nlc3MpCi0JewotCQlCQ01fREVCVUdfUFJJTlQocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLERCR19UWVBFX0lOSVRFWElULCBEUlZfRU5UUlksIERCR19MVkxfQUxMLCJEZXZpY2UgaXMgYmVpbmcgQWNjZXNzZWQgXG4iKTsKKwkvKgorCSAqIHdvcnN0IGNhc2UgdGltZSB0YWtlbiBieSB0aGUgUkRNL1dSTSB3aWxsIGJlIDUgc2VjLiB3aWxsIGNoZWNrIGFmdGVyIGV2ZXJ5IDEwMCBtcworCSAqIHRvIGFjY2VydGFpbiB0aGUgZGV2aWNlIGlzIG5vdCBiZWluZyBhY2Nlc3NlZC4gQWZ0ZXIgdGhpcyBObyBSRE0vV1JNIHNob3VsZCBiZSBtYWRlLgorCSAqLworCXdoaWxlIChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXItPkRldmljZUFjY2VzcykgeworCQlCQ01fREVCVUdfUFJJTlQocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLCBEQkdfVFlQRV9JTklURVhJVCwgRFJWX0VOVFJZLCBEQkdfTFZMX0FMTCwKKwkJCSJEZXZpY2UgaXMgYmVpbmcgYWNjZXNzZWQuXG4iKTsKIAkJbXNsZWVwKDEwMCk7CiAJfQogCS8qIEZyZWUgaW50ZXJydXB0IFVSQiAqLwotCS8vcHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLT5kZXZpY2VfcmVtb3ZlZCA9IFRSVUU7Ci0JaWYocHNJbnRmQWRhcHRlci0+cHNJbnRlcnJ1cHRVcmIpCi0JewotCQl1c2JfZnJlZV91cmIocHNJbnRmQWRhcHRlci0+cHNJbnRlcnJ1cHRVcmIpOwotCX0KKwkvKiBwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXItPmRldmljZV9yZW1vdmVkID0gVFJVRTsgKi8KKwl1c2JfZnJlZV91cmIocHNJbnRmQWRhcHRlci0+cHNJbnRlcnJ1cHRVcmIpOwogCiAJLyogRnJlZSB0cmFuc21pdCBVUkJzICovCi0JZm9yKGkgPSAwOyBpIDwgTUFYSU1VTV9VU0JfVENCOyBpKyspCi0JewotCQlpZihwc0ludGZBZGFwdGVyLT5hc1VzYlRjYltpXS51cmIgICE9IE5VTEwpCi0JCXsKKwlmb3IgKGkgPSAwOyBpIDwgTUFYSU1VTV9VU0JfVENCOyBpKyspIHsKKwkJaWYgKHBzSW50ZkFkYXB0ZXItPmFzVXNiVGNiW2ldLnVyYiAgIT0gTlVMTCkgewogCQkJdXNiX2ZyZWVfdXJiKHBzSW50ZkFkYXB0ZXItPmFzVXNiVGNiW2ldLnVyYik7CiAJCQlwc0ludGZBZGFwdGVyLT5hc1VzYlRjYltpXS51cmIgPSBOVUxMOwogCQl9CiAJfQogCS8qIEZyZWUgcmVjZWl2ZSBVUkIgYW5kIGJ1ZmZlcnMgKi8KLQlmb3IoaSA9IDA7IGkgPCBNQVhJTVVNX1VTQl9SQ0I7IGkrKykKLQl7Ci0JCWlmIChwc0ludGZBZGFwdGVyLT5hc1VzYlJjYltpXS51cmIgIT0gTlVMTCkKLQkJewotCQkJYmNtX2tmcmVlKHBzSW50ZkFkYXB0ZXItPmFzVXNiUmNiW2ldLnVyYi0+dHJhbnNmZXJfYnVmZmVyKTsKKwlmb3IgKGkgPSAwOyBpIDwgTUFYSU1VTV9VU0JfUkNCOyBpKyspIHsKKwkJaWYgKHBzSW50ZkFkYXB0ZXItPmFzVXNiUmNiW2ldLnVyYiAhPSBOVUxMKSB7CisJCQlrZnJlZShwc0ludGZBZGFwdGVyLT5hc1VzYlJjYltpXS51cmItPnRyYW5zZmVyX2J1ZmZlcik7CiAJCQl1c2JfZnJlZV91cmIocHNJbnRmQWRhcHRlci0+YXNVc2JSY2JbaV0udXJiKTsKIAkJCXBzSW50ZkFkYXB0ZXItPmFzVXNiUmNiW2ldLnVyYiA9IE5VTEw7CiAJCX0KQEAgLTU2LDE1MSArNjUsMTA5IEBACiAJQWRhcHRlckZyZWUocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyKTsKIH0KIAotCi0KLXN0YXRpYyBpbnQgdXNiYmNtX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCitzdGF0aWMgdm9pZCBDb25maWd1cmVFbmRQb2ludFR5cGVzVGhyb3VnaEVFUFJPTShQTUlOSV9BREFQVEVSIEFkYXB0ZXIpCiB7Ci0JcmV0dXJuIDA7Ci19CisJdW5zaWduZWQgbG9uZyB1bFJlZyA9IDA7CisJaW50IHJldDsKIAotc3RhdGljIGludCB1c2JiY21fcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHNzaXplX3QgdXNiYmNtX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWZmZXIsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQotewotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3NpemVfdCB1c2JiY21fd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICp1c2VyX2J1ZmZlciwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLQotVk9JRCBDb25maWd1cmVFbmRQb2ludFR5cGVzVGhyb3VnaEVFUFJPTShQTUlOSV9BREFQVEVSIEFkYXB0ZXIpCi17Ci0JVUxPTkcgdWxSZWcgPSAwOwotCi0vLyBQcm9ncmFtIEVQMiBNQVhfUEtUX1NJWkUKKwkvKiBQcm9ncmFtIEVQMiBNQVhfUEtUX1NJWkUgKi8KIAl1bFJlZyA9IG50b2hsKEVQMl9NUFNfUkVHKTsKLQlCZWNlZW1FRVBST01CdWxrV3JpdGUoQWRhcHRlciwoUFVDSEFSKSZ1bFJlZywweDEyOCw0LFRSVUUpOworCUJlY2VlbUVFUFJPTUJ1bGtXcml0ZShBZGFwdGVyLCAoUFVDSEFSKSZ1bFJlZywgMHgxMjgsIDQsIFRSVUUpOwogCXVsUmVnID0gbnRvaGwoRVAyX01QUyk7Ci0JQmVjZWVtRUVQUk9NQnVsa1dyaXRlKEFkYXB0ZXIsKFBVQ0hBUikmdWxSZWcsMHgxMkMsNCxUUlVFKTsKKwlCZWNlZW1FRVBST01CdWxrV3JpdGUoQWRhcHRlciwgKFBVQ0hBUikmdWxSZWcsIDB4MTJDLCA0LCBUUlVFKTsKIAogCXVsUmVnID0gbnRvaGwoRVAyX0NGR19SRUcpOwotCUJlY2VlbUVFUFJPTUJ1bGtXcml0ZShBZGFwdGVyLChQVUNIQVIpJnVsUmVnLDB4MTMyLDQsVFJVRSk7Ci0JaWYoKChQU19JTlRFUkZBQ0VfQURBUFRFUikoQWRhcHRlci0+cHZJbnRlcmZhY2VBZGFwdGVyKSktPmJIaWdoU3BlZWREZXZpY2UgPT0gVFJVRSkKLQl7CisJQmVjZWVtRUVQUk9NQnVsa1dyaXRlKEFkYXB0ZXIsIChQVUNIQVIpJnVsUmVnLCAweDEzMiwgNCwgVFJVRSk7CisJaWYgKCgoUFNfSU5URVJGQUNFX0FEQVBURVIpKEFkYXB0ZXItPnB2SW50ZXJmYWNlQWRhcHRlcikpLT5iSGlnaFNwZWVkRGV2aWNlID09IFRSVUUpIHsKIAkJdWxSZWcgPSBudG9obChFUDJfQ0ZHX0lOVCk7Ci0JCUJlY2VlbUVFUFJPTUJ1bGtXcml0ZShBZGFwdGVyLChQVUNIQVIpJnVsUmVnLDB4MTM2LDQsVFJVRSk7Ci0JfQotCWVsc2UKLQl7Ci0vLyBVU0UgQlVMSyBFUCBhcyBUWCBpbiBGUyBtb2RlLgorCQlCZWNlZW1FRVBST01CdWxrV3JpdGUoQWRhcHRlciwgKFBVQ0hBUikmdWxSZWcsIDB4MTM2LCA0LCBUUlVFKTsKKwl9IGVsc2UgeworCQkvKiBVU0UgQlVMSyBFUCBhcyBUWCBpbiBGUyBtb2RlLiAqLwogCQl1bFJlZyA9IG50b2hsKEVQMl9DRkdfQlVMSyk7Ci0JCUJlY2VlbUVFUFJPTUJ1bGtXcml0ZShBZGFwdGVyLChQVUNIQVIpJnVsUmVnLDB4MTM2LDQsVFJVRSk7CisJCUJlY2VlbUVFUFJPTUJ1bGtXcml0ZShBZGFwdGVyLCAoUFVDSEFSKSZ1bFJlZywgMHgxMzYsIDQsIFRSVUUpOwogCX0KIAotCi0vLyBQcm9ncmFtIEVQNCBNQVhfUEtUX1NJWkUuCisJLyogUHJvZ3JhbSBFUDQgTUFYX1BLVF9TSVpFLiAqLwogCXVsUmVnID0gbnRvaGwoRVA0X01QU19SRUcpOwotCUJlY2VlbUVFUFJPTUJ1bGtXcml0ZShBZGFwdGVyLChQVUNIQVIpJnVsUmVnLDB4MTNDLDQsVFJVRSk7CisJQmVjZWVtRUVQUk9NQnVsa1dyaXRlKEFkYXB0ZXIsIChQVUNIQVIpJnVsUmVnLCAweDEzQywgNCwgVFJVRSk7CiAJdWxSZWcgPSBudG9obChFUDRfTVBTKTsKLQlCZWNlZW1FRVBST01CdWxrV3JpdGUoQWRhcHRlciwoUFVDSEFSKSZ1bFJlZywweDE0MCw0LFRSVUUpOworCUJlY2VlbUVFUFJPTUJ1bGtXcml0ZShBZGFwdGVyLCAoUFVDSEFSKSZ1bFJlZywgMHgxNDAsIDQsIFRSVUUpOwogCi0vLwlQcm9ncmFtIFRYIEVQIGFzIGludGVycnVwdCAoQWx0ZXJuYXRlIFNldHRpbmcpCi0JaWYoIHJkbWFsdChBZGFwdGVyLDB4MEYwMTEwRjgsIChQVUlOVCkmdWxSZWcsNCkpCi0JewotCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9JTklURVhJVCwgRFJWX0VOVFJZLCBEQkdfTFZMX0FMTCwgInJlYWRpbmcgb2YgVHggRVAgaXMgZmFpbGluZyIpOwotCQlyZXR1cm4gOworCS8qIFByb2dyYW0gVFggRVAgYXMgaW50ZXJydXB0KEFsdGVybmF0ZSBTZXR0aW5nKSAqLworCXJldCA9IHJkbWFsdChBZGFwdGVyLCAweDBGMDExMEY4LCAodTMyICopJnVsUmVnLCBzaXplb2YodTMyKSk7CisJaWYgKHJldCkgeworCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfSU5JVEVYSVQsIERSVl9FTlRSWSwgREJHX0xWTF9BTEwsCisJCQkicmVhZGluZyBvZiBUeCBFUCBmYWlsZWRcbiIpOworCQlyZXR1cm47CiAJfQogCXVsUmVnIHw9IDB4NjsKIAogCXVsUmVnID0gbnRvaGwodWxSZWcpOwotCUJlY2VlbUVFUFJPTUJ1bGtXcml0ZShBZGFwdGVyLChQVUNIQVIpJnVsUmVnLDB4MUNDLDQsVFJVRSk7CisJQmVjZWVtRUVQUk9NQnVsa1dyaXRlKEFkYXB0ZXIsIChQVUNIQVIpJnVsUmVnLCAweDFDQywgNCwgVFJVRSk7CiAKIAl1bFJlZyA9IG50b2hsKEVQNF9DRkdfUkVHKTsKLQlCZWNlZW1FRVBST01CdWxrV3JpdGUoQWRhcHRlciwoUFVDSEFSKSZ1bFJlZywweDFDOCw0LFRSVUUpOwotLy8gUHJvZ3JhbSBJU09DSFJPTk9VUyBFUCBzaXplIHRvIHplcm8uCisJQmVjZWVtRUVQUk9NQnVsa1dyaXRlKEFkYXB0ZXIsIChQVUNIQVIpJnVsUmVnLCAweDFDOCwgNCwgVFJVRSk7CisJLyogUHJvZ3JhbSBJU09DSFJPTk9VUyBFUCBzaXplIHRvIHplcm8uICovCiAJdWxSZWcgPSBudG9obChJU09fTVBTX1JFRyk7Ci0JQmVjZWVtRUVQUk9NQnVsa1dyaXRlKEFkYXB0ZXIsKFBVQ0hBUikmdWxSZWcsMHgxRDIsNCxUUlVFKTsKKwlCZWNlZW1FRVBST01CdWxrV3JpdGUoQWRhcHRlciwgKFBVQ0hBUikmdWxSZWcsIDB4MUQyLCA0LCBUUlVFKTsKIAl1bFJlZyA9IG50b2hsKElTT19NUFMpOwotCUJlY2VlbUVFUFJPTUJ1bGtXcml0ZShBZGFwdGVyLChQVUNIQVIpJnVsUmVnLDB4MUQ2LDQsVFJVRSk7CisJQmVjZWVtRUVQUk9NQnVsa1dyaXRlKEFkYXB0ZXIsIChQVUNIQVIpJnVsUmVnLCAweDFENiwgNCwgVFJVRSk7CiAKLS8vIFVwZGF0ZSBFRVBST00gVmVyc2lvbi4KLS8vIFJlYWQgNCBieXRlcyBmcm9tIDUwOCBhbmQgbW9kaWZ5IDUxMSBhbmQgNTEwLgotLy8KLQlSZWFkQmVjZWVtRUVQUk9NKEFkYXB0ZXIsMHgxRkMsKFBVSU5UKSZ1bFJlZyk7CisJLyoKKwkgKiBVcGRhdGUgRUVQUk9NIFZlcnNpb24uCisJICogUmVhZCA0IGJ5dGVzIGZyb20gNTA4IGFuZCBtb2RpZnkgNTExIGFuZCA1MTAuCisJICovCisJUmVhZEJlY2VlbUVFUFJPTShBZGFwdGVyLCAweDFGQywgKFBVSU5UKSZ1bFJlZyk7CiAJdWxSZWcgJj0gMHgwMTAxRkZGRjsKLQlCZWNlZW1FRVBST01CdWxrV3JpdGUoQWRhcHRlciwoUFVDSEFSKSZ1bFJlZywweDFGQyw0LFRSVUUpOwotLy8KLS8vVXBkYXRlIGxlbmd0aCBmaWVsZCBpZiByZXF1aXJlZC4gQWxzbyBtYWtlIHRoZSBzdHJpbmcgTlVMTCB0ZXJtaW5hdGVkLgotLy8KLQlSZWFkQmVjZWVtRUVQUk9NKEFkYXB0ZXIsMHhBOCwoUFVJTlQpJnVsUmVnKTsKLQlpZigodWxSZWcmMHgwMEZGMDAwMCk+PjE2ID4gMHgzMCkKLQl7Ci0JCXVsUmVnID0gKHVsUmVnJjB4RkYwMEZGRkYpfCgweDMwPDwxNik7Ci0JCUJlY2VlbUVFUFJPTUJ1bGtXcml0ZShBZGFwdGVyLChQVUNIQVIpJnVsUmVnLDB4QTgsNCxUUlVFKTsKLQl9Ci0JUmVhZEJlY2VlbUVFUFJPTShBZGFwdGVyLDB4MTQ4LChQVUlOVCkmdWxSZWcpOwotCWlmKCh1bFJlZyYweDAwRkYwMDAwKT4+MTYgPiAweDMwKQotCXsKLQkJdWxSZWcgPSAodWxSZWcmMHhGRjAwRkZGRil8KDB4MzA8PDE2KTsKLQkJQmVjZWVtRUVQUk9NQnVsa1dyaXRlKEFkYXB0ZXIsKFBVQ0hBUikmdWxSZWcsMHgxNDgsNCxUUlVFKTsKLQl9Ci0JdWxSZWcgPSAwOwotCUJlY2VlbUVFUFJPTUJ1bGtXcml0ZShBZGFwdGVyLChQVUNIQVIpJnVsUmVnLDB4MTIyLDQsVFJVRSk7Ci0JdWxSZWcgPSAwOwotCUJlY2VlbUVFUFJPTUJ1bGtXcml0ZShBZGFwdGVyLChQVUNIQVIpJnVsUmVnLDB4MUMyLDQsVFJVRSk7CisJQmVjZWVtRUVQUk9NQnVsa1dyaXRlKEFkYXB0ZXIsIChQVUNIQVIpJnVsUmVnLCAweDFGQywgNCwgVFJVRSk7CiAKKwkvKiBVcGRhdGUgbGVuZ3RoIGZpZWxkIGlmIHJlcXVpcmVkLiBBbHNvIG1ha2UgdGhlIHN0cmluZyBOVUxMIHRlcm1pbmF0ZWQuICovCisKKwlSZWFkQmVjZWVtRUVQUk9NKEFkYXB0ZXIsIDB4QTgsIChQVUlOVCkmdWxSZWcpOworCWlmICgodWxSZWcmMHgwMEZGMDAwMCk+PjE2ID4gMHgzMCkgeworCQl1bFJlZyA9ICh1bFJlZyYweEZGMDBGRkZGKXwoMHgzMDw8MTYpOworCQlCZWNlZW1FRVBST01CdWxrV3JpdGUoQWRhcHRlciwgKFBVQ0hBUikmdWxSZWcsIDB4QTgsIDQsIFRSVUUpOworCX0KKwlSZWFkQmVjZWVtRUVQUk9NKEFkYXB0ZXIsIDB4MTQ4LCAoUFVJTlQpJnVsUmVnKTsKKwlpZiAoKHVsUmVnJjB4MDBGRjAwMDApPj4xNiA+IDB4MzApIHsKKwkJdWxSZWcgPSAodWxSZWcmMHhGRjAwRkZGRil8KDB4MzA8PDE2KTsKKwkJQmVjZWVtRUVQUk9NQnVsa1dyaXRlKEFkYXB0ZXIsIChQVUNIQVIpJnVsUmVnLCAweDE0OCwgNCwgVFJVRSk7CisJfQorCXVsUmVnID0gMDsKKwlCZWNlZW1FRVBST01CdWxrV3JpdGUoQWRhcHRlciwgKFBVQ0hBUikmdWxSZWcsIDB4MTIyLCA0LCBUUlVFKTsKKwl1bFJlZyA9IDA7CisJQmVjZWVtRUVQUk9NQnVsa1dyaXRlKEFkYXB0ZXIsIChQVUNIQVIpJnVsUmVnLCAweDFDMiwgNCwgVFJVRSk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHVzYmJjbV9mb3BzID0gewotICAgIC5vcGVuICAgID0gIHVzYmJjbV9vcGVuLAotICAgIC5yZWxlYXNlID0gIHVzYmJjbV9yZWxlYXNlLAotICAgIC5yZWFkICAgID0gIHVzYmJjbV9yZWFkLAotICAgIC53cml0ZSAgID0gIHVzYmJjbV93cml0ZSwKLSAgICAub3duZXIgICA9ICBUSElTX01PRFVMRSwKLQkubGxzZWVrID0gbm9fbGxzZWVrLAotfTsKLQotc3RhdGljIHN0cnVjdCB1c2JfY2xhc3NfZHJpdmVyIHVzYmJjbV9jbGFzcyA9IHsKLSAgICAubmFtZSA9ICAgICAJInVzYmJjbSIsCi0gICAgLmZvcHMgPSAgICAgCSZ1c2JiY21fZm9wcywKLSAgICAubWlub3JfYmFzZSA9ICAgQkNNX1VTQl9NSU5PUl9CQVNFLAotfTsKLQogc3RhdGljIGludAogdXNiYmNtX2RldmljZV9wcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwgY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkKQogewotCWludCByZXR2YWwgPTAgOwotICAgCVBNSU5JX0FEQVBURVIgcHNBZGFwdGVyID0gTlVMTDsKLQlQU19JTlRFUkZBQ0VfQURBUFRFUiBwc0ludGZBZGFwdGVyID0gTlVMTDsKLQlzdHJ1Y3QgdXNiX2RldmljZSAgICAgICp1ZGV2ID0gTlVMTDsKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiA9IGludGVyZmFjZV90b191c2JkZXYoaW50Zik7CisJaW50IHJldHZhbDsKKwlQTUlOSV9BREFQVEVSIHBzQWRhcHRlcjsKKwlQU19JTlRFUkZBQ0VfQURBUFRFUiBwc0ludGZBZGFwdGVyOworCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2OwogCi0vLwlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9JTklURVhJVCwgRFJWX0VOVFJZLCBEQkdfTFZMX0FMTCwgIlVzYmJjbSBwcm9iZSEhIik7Ci0JaWYoKGludGYgPT0gTlVMTCkgfHwgKGlkID09IE5VTEwpKQotCXsKLQkvLwlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9JTklURVhJVCwgRFJWX0VOVFJZLCBEQkdfTFZMX0FMTCwgImludGYgb3IgaWQgaXMgTlVMTCIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQkvKiBBbGxvY2F0ZSBBZGFwdGVyIHN0cnVjdHVyZSAqLwotCWlmKChwc0FkYXB0ZXIgPSBremFsbG9jKHNpemVvZihNSU5JX0FEQVBURVIpLCBHRlBfS0VSTkVMKSkgPT0gTlVMTCkKLQl7Ci0JCUJDTV9ERUJVR19QUklOVChwc0FkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiT3V0IG9mIG1lbW9yeSIpOworCS8qIFJlc2VydmUgb25lIGV4dHJhIHF1ZXVlIGZvciB0aGUgYml0LWJ1Y2tldCAqLworCW5kZXYgPSBhbGxvY19ldGhlcmRldl9tcShzaXplb2YoTUlOSV9BREFQVEVSKSwgTk9fT0ZfUVVFVUVTKzEpOworCWlmIChuZGV2ID09IE5VTEwpIHsKKwkJZGV2X2VycigmdWRldi0+ZGV2LCBEUlZfTkFNRSAiOiBubyBtZW1vcnkgZm9yIGRldmljZVxuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAotICAgIC8qIEluaXQgZGVmYXVsdCBkcml2ZXIgZGVidWcgc3RhdGUgKi8KKwlTRVRfTkVUREVWX0RFVihuZGV2LCAmaW50Zi0+ZGV2KTsKIAotICAgIHBzQWRhcHRlci0+c3REZWJ1Z1N0YXRlLmRlYnVnX2xldmVsID0gREJHX0xWTF9DVVJSOworCXBzQWRhcHRlciA9IG5ldGRldl9wcml2KG5kZXYpOworCXBzQWRhcHRlci0+ZGV2ID0gbmRldjsKKwlwc0FkYXB0ZXItPm1zZ19lbmFibGUgPSBuZXRpZl9tc2dfaW5pdChkZWJ1ZywgZGVmYXVsdF9tc2cpOworCisJLyogSW5pdCBkZWZhdWx0IGRyaXZlciBkZWJ1ZyBzdGF0ZSAqLworCisJcHNBZGFwdGVyLT5zdERlYnVnU3RhdGUuZGVidWdfbGV2ZWwgPSBEQkdfTFZMX0NVUlI7CiAJcHNBZGFwdGVyLT5zdERlYnVnU3RhdGUudHlwZSA9IERCR19UWVBFX0lOSVRFWElUOwotCW1lbXNldCAocHNBZGFwdGVyLT5zdERlYnVnU3RhdGUuc3VidHlwZSwgMCwgc2l6ZW9mIChwc0FkYXB0ZXItPnN0RGVidWdTdGF0ZS5zdWJ0eXBlKSk7CiAKLSAgICAvKiBUZWNobmljYWxseSwgb25lIGNhbiBzdGFydCB1c2luZyBCQ01fREVCVUdfUFJJTlQgYWZ0ZXIgdGhpcyBwb2ludC4KKwkvKgorCSAqIFRlY2huaWNhbGx5LCBvbmUgY2FuIHN0YXJ0IHVzaW5nIEJDTV9ERUJVR19QUklOVCBhZnRlciB0aGlzIHBvaW50LgogCSAqIEhvd2V2ZXIsIHJlYWxpemUgdGhhdCBieSBkZWZhdWx0IHRoZSBUeXBlL1N1YnR5cGUgYml0bWFwcyBhcmUgYWxsIHplcm8gbm93OwogCSAqIHNvIG5vIHByaW50cyB3aWxsIGFjdHVhbGx5IGFwcGVhciB1bnRpbCB0aGUgVGVzdEFwcCB0dXJucyBvbiBkZWJ1ZyBwYXRocyB2aWEKIAkgKiB0aGUgaW9jdGwoKTsgc28gcHJhY3RpY2FsbHkgc3BlYWtpbmcsIGluIGVhcmx5IGluaXQsIG5vIGxvZ2dpbmcgaGFwcGVucy4KQEAgLTIxMSwxNjAgKzE3OCwxMjggQEAKIAkgKiBGdXJ0aGVyLCB3ZSB0dXJuIHRoaXMgT0ZGIG9uY2UgaW5pdF9tb2R1bGUoKSBjb21wbGV0ZXMuCiAJICovCiAKLSAgICBwc0FkYXB0ZXItPnN0RGVidWdTdGF0ZS5zdWJ0eXBlW0RCR19UWVBFX0lOSVRFWElUXSA9IDB4ZmY7CisJcHNBZGFwdGVyLT5zdERlYnVnU3RhdGUuc3VidHlwZVtEQkdfVFlQRV9JTklURVhJVF0gPSAweGZmOwogCUJDTV9TSE9XX0RFQlVHX0JJVE1BUChwc0FkYXB0ZXIpOwogCiAJcmV0dmFsID0gSW5pdEFkYXB0ZXIocHNBZGFwdGVyKTsKLQlpZihyZXR2YWwpCi0JewotCQlCQ01fREVCVUdfUFJJTlQgKHBzQWRhcHRlcixEQkdfVFlQRV9JTklURVhJVCwgRFJWX0VOVFJZLCBEQkdfTFZMX0FMTCwgIkluaXRBZGFwdGVyIEZhaWxlZFxuIik7CisJaWYgKHJldHZhbCkgeworCQlkZXZfZXJyKCZ1ZGV2LT5kZXYsIERSVl9OQU1FICI6IEluaXRBZGFwdGVyIEZhaWxlZFxuIik7CiAJCUFkYXB0ZXJGcmVlKHBzQWRhcHRlcik7CiAJCXJldHVybiByZXR2YWw7CiAJfQogCiAJLyogQWxsb2NhdGUgaW50ZXJmYWNlIGFkYXB0ZXIgc3RydWN0dXJlICovCi0JaWYoKHBzQWRhcHRlci0+cHZJbnRlcmZhY2VBZGFwdGVyID0KLQkJa21hbGxvYyhzaXplb2YoU19JTlRFUkZBQ0VfQURBUFRFUiksIEdGUF9LRVJORUwpKSA9PSBOVUxMKQotCXsKLQkJQkNNX0RFQlVHX1BSSU5UKHBzQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsICJPdXQgb2YgbWVtb3J5Iik7Ci0JCUFkYXB0ZXJGcmVlIChwc0FkYXB0ZXIpOworCXBzSW50ZkFkYXB0ZXIgPSBremFsbG9jKHNpemVvZihTX0lOVEVSRkFDRV9BREFQVEVSKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHBzSW50ZkFkYXB0ZXIgPT0gTlVMTCkgeworCQlkZXZfZXJyKCZ1ZGV2LT5kZXYsIERSVl9OQU1FICI6IG5vIG1lbW9yeSBmb3IgSW50ZXJmYWNlIGFkYXB0ZXJcbiIpOworCQlBZGFwdGVyRnJlZShwc0FkYXB0ZXIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9Ci0JbWVtc2V0KHBzQWRhcHRlci0+cHZJbnRlcmZhY2VBZGFwdGVyLCAwLCBzaXplb2YoU19JTlRFUkZBQ0VfQURBUFRFUikpOwogCi0JcHNJbnRmQWRhcHRlciA9IEludGVyZmFjZUFkYXB0ZXJHZXQocHNBZGFwdGVyKTsKKwlwc0FkYXB0ZXItPnB2SW50ZXJmYWNlQWRhcHRlciA9IHBzSW50ZkFkYXB0ZXI7CiAJcHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyID0gcHNBZGFwdGVyOwogCiAJLyogU3RvcmUgdXNiIGludGVyZmFjZSBpbiBJbnRlcmZhY2UgQWRhcHRlciAqLwogCXBzSW50ZkFkYXB0ZXItPmludGVyZmFjZSA9IGludGY7CiAJdXNiX3NldF9pbnRmZGF0YShpbnRmLCBwc0ludGZBZGFwdGVyKTsKIAotCUJDTV9ERUJVR19QUklOVChwc0FkYXB0ZXIsREJHX1RZUEVfSU5JVEVYSVQsIERSVl9FTlRSWSwgREJHX0xWTF9BTEwsICJwc0ludGZBZGFwdGVyIDB4JXAiLHBzSW50ZkFkYXB0ZXIpOworCUJDTV9ERUJVR19QUklOVChwc0FkYXB0ZXIsIERCR19UWVBFX0lOSVRFWElULCBEUlZfRU5UUlksIERCR19MVkxfQUxMLAorCQkicHNJbnRmQWRhcHRlciAweCVwXG4iLCBwc0ludGZBZGFwdGVyKTsKIAlyZXR2YWwgPSBJbnRlcmZhY2VBZGFwdGVySW5pdChwc0ludGZBZGFwdGVyKTsKLQlpZihyZXR2YWwpCi0JeworCWlmIChyZXR2YWwpIHsKIAkJLyogSWYgdGhlIEZpcm13YXJlL0NmZyBGaWxlIGlzIG5vdCBwcmVzZW50Ci0gCQkgKiB0aGVuIHJldHVybiBzdWNjZXNzLCBsZXQgdGhlIGFwcGxpY2F0aW9uCi0gCQkgKiBkb3dubG9hZCB0aGUgZmlsZXMuCi0gCQkgKi8KLQkJaWYoLUVOT0VOVCA9PSByZXR2YWwpewotCQkJQkNNX0RFQlVHX1BSSU5UKHBzQWRhcHRlcixEQkdfVFlQRV9JTklURVhJVCwgRFJWX0VOVFJZLCBEQkdfTFZMX0FMTCwgIkZpbGUgTm90IEZvdW5kLCBVc2UgQXBwIHRvIERvd25sb2FkXG4iKTsKKwkJICogdGhlbiByZXR1cm4gc3VjY2VzcywgbGV0IHRoZSBhcHBsaWNhdGlvbgorCQkgKiBkb3dubG9hZCB0aGUgZmlsZXMuCisJCSAqLworCQlpZiAoLUVOT0VOVCA9PSByZXR2YWwpIHsKKwkJCUJDTV9ERUJVR19QUklOVChwc0FkYXB0ZXIsIERCR19UWVBFX0lOSVRFWElULCBEUlZfRU5UUlksIERCR19MVkxfQUxMLAorCQkJCSJGaWxlIE5vdCBGb3VuZC4gIFVzZSBhcHAgdG8gZG93bmxvYWQuXG4iKTsKIAkJCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKIAkJfQotCQlCQ01fREVCVUdfUFJJTlQocHNBZGFwdGVyLERCR19UWVBFX0lOSVRFWElULCBEUlZfRU5UUlksIERCR19MVkxfQUxMLCAiSW50ZXJmYWNlQWRhcHRlckluaXQgRmFpbGVkIFxuIik7CisJCUJDTV9ERUJVR19QUklOVChwc0FkYXB0ZXIsIERCR19UWVBFX0lOSVRFWElULCBEUlZfRU5UUlksIERCR19MVkxfQUxMLAorCQkJIkludGVyZmFjZUFkYXB0ZXJJbml0IGZhaWxlZC5cbiIpOwogCQl1c2Jfc2V0X2ludGZkYXRhKGludGYsIE5VTEwpOwotCQl1ZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldiAoaW50Zik7CisJCXVkZXYgPSBpbnRlcmZhY2VfdG9fdXNiZGV2KGludGYpOwogCQl1c2JfcHV0X2Rldih1ZGV2KTsKLQkJaWYocHNBZGFwdGVyLT5iVXNiQ2xhc3NEcml2ZXJSZWdpc3RlcmVkID09IFRSVUUpCi0JCQkJdXNiX2RlcmVnaXN0ZXJfZGV2IChpbnRmLCAmdXNiYmNtX2NsYXNzKTsKIAkJSW50ZXJmYWNlQWRhcHRlckZyZWUocHNJbnRmQWRhcHRlcik7Ci0JCXJldHVybiByZXR2YWwgOworCQlyZXR1cm4gcmV0dmFsOwogCX0KLQlpZihwc0FkYXB0ZXItPmNoaXBfaWQgPiBUMykKLQl7Ci0JCXVpbnQzMl90IHVpTmFja1plcm9MZW5ndGhJbnQ9NDsKLQkJaWYod3JtYWx0KHBzQWRhcHRlciwgRElTQUJMRV9VU0JfWkVST19MRU5fSU5ULCAmdWlOYWNrWmVyb0xlbmd0aEludCwgc2l6ZW9mKHVpTmFja1plcm9MZW5ndGhJbnQpKSkKLQkJewotCQkJcmV0dXJuIC1FSU87OwotCQl9CisJaWYgKHBzQWRhcHRlci0+Y2hpcF9pZCA+IFQzKSB7CisJCXVpbnQzMl90IHVpTmFja1plcm9MZW5ndGhJbnQgPSA0OworCisJCXJldHZhbCA9IHdybWFsdChwc0FkYXB0ZXIsIERJU0FCTEVfVVNCX1pFUk9fTEVOX0lOVCwgJnVpTmFja1plcm9MZW5ndGhJbnQsIHNpemVvZih1aU5hY2taZXJvTGVuZ3RoSW50KSk7CisJCWlmIChyZXR2YWwpCisJCQlyZXR1cm4gcmV0dmFsOwogCX0KIAotCXVkZXYgPSBpbnRlcmZhY2VfdG9fdXNiZGV2IChpbnRmKTsKIAkvKiBDaGVjayB3aGV0aGVyIHRoZSBVU0ItRGV2aWNlIFN1cHBvcnRzIHJlbW90ZSBXYWtlLVVwICovCi0JaWYoVVNCX0NPTkZJR19BVFRfV0FLRVVQICYgdWRldi0+YWN0Y29uZmlnLT5kZXNjLmJtQXR0cmlidXRlcykKLQl7CisJaWYgKFVTQl9DT05GSUdfQVRUX1dBS0VVUCAmIHVkZXYtPmFjdGNvbmZpZy0+ZGVzYy5ibUF0dHJpYnV0ZXMpIHsKIAkJLyogSWYgU3VzcGVuZCB0aGVuIG9ubHkgc3VwcG9ydCBkeW5hbWljIHN1c3BlbmQgKi8KLQkJaWYocHNBZGFwdGVyLT5iRG9TdXNwZW5kKQotCQl7CisJCWlmIChwc0FkYXB0ZXItPmJEb1N1c3BlbmQpIHsKICNpZmRlZiBDT05GSUdfUE0KIAkJCXBtX3J1bnRpbWVfc2V0X2F1dG9zdXNwZW5kX2RlbGF5KCZ1ZGV2LT5kZXYsIDApOwogCQkJaW50Zi0+bmVlZHNfcmVtb3RlX3dha2V1cCA9IDE7Ci0jaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiwgNiwgMzUpCi0gCQkJdWRldi0+YXV0b3N1c3BlbmRfZGlzYWJsZWQgPSAwOwotI2Vsc2UKIAkJCXVzYl9lbmFibGVfYXV0b3N1c3BlbmQodWRldik7Ci0jZW5kaWYKLSAJCQlkZXZpY2VfaW5pdF93YWtldXAoJmludGYtPmRldiwxKTsKLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLCA2LCAzMikKLSAJCQl1c2JfYXV0b3BtX2Rpc2FibGUoaW50Zik7Ci0jZW5kaWYKKwkJCWRldmljZV9pbml0X3dha2V1cCgmaW50Zi0+ZGV2LCAxKTsKIAkJCUlOSVRfV09SSygmcHNJbnRmQWRhcHRlci0+dXNiU3VzcGVuZFdvcmssIHB1dFVzYlN1c3BlbmQpOwotCQkJQkNNX0RFQlVHX1BSSU5UKHBzQWRhcHRlcixEQkdfVFlQRV9JTklURVhJVCwgRFJWX0VOVFJZLCBEQkdfTFZMX0FMTCwgIkVuYWJsaW5nIFVTQiBBdXRvLVN1c3BlbmRcbiIpOworCQkJQkNNX0RFQlVHX1BSSU5UKHBzQWRhcHRlciwgREJHX1RZUEVfSU5JVEVYSVQsIERSVl9FTlRSWSwgREJHX0xWTF9BTEwsCisJCQkJIkVuYWJsaW5nIFVTQiBBdXRvLVN1c3BlbmRcbiIpOwogI2VuZGlmCi0JCX0KLQkJZWxzZQotCQl7CisJCX0gZWxzZSB7CiAJCQlpbnRmLT5uZWVkc19yZW1vdGVfd2FrZXVwID0gMDsKLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLCA2LCAzNSkKLSAJCQl1ZGV2LT5hdXRvc3VzcGVuZF9kaXNhYmxlZCA9IDE7Ci0jZWxzZQogCQkJdXNiX2Rpc2FibGVfYXV0b3N1c3BlbmQodWRldik7Ci0jZW5kaWYKIAkJfQogCX0KIAotICAgIHBzQWRhcHRlci0+c3REZWJ1Z1N0YXRlLnN1YnR5cGVbREJHX1RZUEVfSU5JVEVYSVRdID0gMHgwOwotICAgIHJldHVybiByZXR2YWw7CisJcHNBZGFwdGVyLT5zdERlYnVnU3RhdGUuc3VidHlwZVtEQkdfVFlQRV9JTklURVhJVF0gPSAweDA7CisJcmV0dXJuIHJldHZhbDsKIH0KIAotc3RhdGljIHZvaWQgdXNiYmNtX2Rpc2Nvbm5lY3QgKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQorc3RhdGljIHZvaWQgdXNiYmNtX2Rpc2Nvbm5lY3Qoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCiB7Ci0JUFNfSU5URVJGQUNFX0FEQVBURVIgcHNJbnRmQWRhcHRlciA9IE5VTEw7Ci0JUE1JTklfQURBUFRFUiBwc0FkYXB0ZXIgPSBOVUxMOwotCXN0cnVjdCB1c2JfZGV2aWNlICAgICAgICp1ZGV2ID0gTlVMTDsKLSAgICBQTUlOSV9BREFQVEVSIEFkYXB0ZXIgPSBHRVRfQkNNX0FEQVBURVIoZ2JscG5ldGRldik7CisJUFNfSU5URVJGQUNFX0FEQVBURVIgcHNJbnRmQWRhcHRlciA9IHVzYl9nZXRfaW50ZmRhdGEoaW50Zik7CisJUE1JTklfQURBUFRFUiBwc0FkYXB0ZXI7CisJc3RydWN0IHVzYl9kZXZpY2UgICp1ZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldihpbnRmKTsKIAotCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX0lOSVRFWElULCBEUlZfRU5UUlksIERCR19MVkxfQUxMLCAiVXNiIGRpc2Nvbm5lY3RlZCIpOwotCWlmKGludGYgPT0gTlVMTCkKLQl7Ci0JCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX0lOSVRFWElULCBEUlZfRU5UUlksIERCR19MVkxfQUxMLCAiaW50ZiBwb2ludGVyIGlzIE5VTEwiKTsKKwlpZiAocHNJbnRmQWRhcHRlciA9PSBOVUxMKQogCQlyZXR1cm47Ci0JfQotCXBzSW50ZkFkYXB0ZXIgPSB1c2JfZ2V0X2ludGZkYXRhKGludGYpOwotCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX0lOSVRFWElULCBEUlZfRU5UUlksIERCR19MVkxfQUxMLCAicHNJbnRmQWRhcHRlciAweCVwIixwc0ludGZBZGFwdGVyKTsKLQlpZihwc0ludGZBZGFwdGVyID09IE5VTEwpCi0JewotCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9JTklURVhJVCwgRFJWX0VOVFJZLCBEQkdfTFZMX0FMTCwgIkludGVyZmFjZUFkYXB0ZXIgcG9pbnRlciBpcyBOVUxMIik7Ci0JCXJldHVybjsKLQl9CisKIAlwc0FkYXB0ZXIgPSBwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXI7Ci0JaWYocHNBZGFwdGVyLT5iRG9TdXNwZW5kKQorCW5ldGlmX2RldmljZV9kZXRhY2gocHNBZGFwdGVyLT5kZXYpOworCisJaWYgKHBzQWRhcHRlci0+YkRvU3VzcGVuZCkKIAkJaW50Zi0+bmVlZHNfcmVtb3RlX3dha2V1cCA9IDA7CiAKIAlwc0FkYXB0ZXItPmRldmljZV9yZW1vdmVkID0gVFJVRSA7CiAJdXNiX3NldF9pbnRmZGF0YShpbnRmLCBOVUxMKTsKIAlJbnRlcmZhY2VBZGFwdGVyRnJlZShwc0ludGZBZGFwdGVyKTsKLQl1ZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldiAoaW50Zik7CiAJdXNiX3B1dF9kZXYodWRldik7Ci0JdXNiX2RlcmVnaXN0ZXJfZGV2IChpbnRmLCAmdXNiYmNtX2NsYXNzKTsKIH0KIAotCi1zdGF0aWMgX19pbmxpbmUgaW50IEFsbG9jVXNiQ2IoUFNfSU5URVJGQUNFX0FEQVBURVIgcHNJbnRmQWRhcHRlcikKK3N0YXRpYyBpbnQgQWxsb2NVc2JDYihQU19JTlRFUkZBQ0VfQURBUFRFUiBwc0ludGZBZGFwdGVyKQogewogCWludCBpID0gMDsKLQlmb3IoaSA9IDA7IGkgPCBNQVhJTVVNX1VTQl9UQ0I7IGkrKykKLQl7Ci0JCWlmKChwc0ludGZBZGFwdGVyLT5hc1VzYlRjYltpXS51cmIgPQotCQkJCXVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCkpID09IE5VTEwpCi0JCXsKLQkJCUJDTV9ERUJVR19QUklOVChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiQ2FudCBhbGxvY2F0ZSBUeCB1cmIgZm9yIGluZGV4ICVkIiwgaSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTUFYSU1VTV9VU0JfVENCOyBpKyspIHsKKwkJaWYgKChwc0ludGZBZGFwdGVyLT5hc1VzYlRjYltpXS51cmIgPQorCQkJCXVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCkpID09IE5VTEwpIHsKKwkJCUJDTV9ERUJVR19QUklOVChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwKKwkJCQkiQ2FuJ3QgYWxsb2NhdGUgVHggdXJiIGZvciBpbmRleCAlZFxuIiwgaSk7CiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJfQogCX0KIAotCWZvcihpID0gMDsgaSA8IE1BWElNVU1fVVNCX1JDQjsgaSsrKQotCXsKKwlmb3IgKGkgPSAwOyBpIDwgTUFYSU1VTV9VU0JfUkNCOyBpKyspIHsKIAkJaWYgKChwc0ludGZBZGFwdGVyLT5hc1VzYlJjYltpXS51cmIgPQotCQkJCXVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCkpID09IE5VTEwpCi0JCXsKLQkJCUJDTV9ERUJVR19QUklOVChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiQ2FudCBhbGxvY2F0ZSBSeCB1cmIgZm9yIGluZGV4ICVkIiwgaSk7CisJCQkJdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKSkgPT0gTlVMTCkgeworCQkJQkNNX0RFQlVHX1BSSU5UKHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLAorCQkJCSJDYW4ndCBhbGxvY2F0ZSBSeCB1cmIgZm9yIGluZGV4ICVkXG4iLCBpKTsKIAkJCXJldHVybiAtRU5PTUVNOwogCQl9Ci0JCWlmKChwc0ludGZBZGFwdGVyLT5hc1VzYlJjYltpXS51cmItPnRyYW5zZmVyX2J1ZmZlciA9Ci0JCQlrbWFsbG9jKE1BWF9EQVRBX0JVRkZFUl9TSVpFLCBHRlBfS0VSTkVMKSkgPT0gTlVMTCkKLQkJewotCQkJQkNNX0RFQlVHX1BSSU5UKHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsICJDYW50IGFsbG9jYXRlIFJ4IGJ1ZmZlciBmb3IgaW5kZXggJWQiLCBpKTsKKwkJaWYgKChwc0ludGZBZGFwdGVyLT5hc1VzYlJjYltpXS51cmItPnRyYW5zZmVyX2J1ZmZlciA9CisJCQlrbWFsbG9jKE1BWF9EQVRBX0JVRkZFUl9TSVpFLCBHRlBfS0VSTkVMKSkgPT0gTlVMTCkgeworCQkJQkNNX0RFQlVHX1BSSU5UKHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLAorCQkJCSJDYW4ndCBhbGxvY2F0ZSBSeCBidWZmZXIgZm9yIGluZGV4ICVkXG4iLCBpKTsKIAkJCXJldHVybiAtRU5PTUVNOwogCQl9CiAJCXBzSW50ZkFkYXB0ZXItPmFzVXNiUmNiW2ldLnVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCA9IE1BWF9EQVRBX0JVRkZFUl9TSVpFOwpAQCAtMzcyLDc3ICszMDcsNDEgQEAKIAlyZXR1cm4gMDsKIH0KIAotCi0KIHN0YXRpYyBpbnQgZGV2aWNlX3J1bihQU19JTlRFUkZBQ0VfQURBUFRFUiBwc0ludGZBZGFwdGVyKQogewotCUlOVCB2YWx1ZSA9IDA7CisJaW50IHZhbHVlID0gMDsKIAlVSU5UIHN0YXR1cyA9IFNUQVRVU19TVUNDRVNTOwogCiAJc3RhdHVzID0gSW5pdENhcmRBbmREb3dubG9hZEZpcm13YXJlKHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlcik7Ci0JaWYoc3RhdHVzICE9IFNUQVRVU19TVUNDRVNTKQotCXsKLQkJQkNNX0RFQlVHX1BSSU5UKHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsICJJbml0Q2FyZEFuZERvd25sb2FkRmlybXdhcmUgZmFpbGVkLlxuIik7CisJaWYgKHN0YXR1cyAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlwcl9lcnIoRFJWX05BTUUgIkluaXRDYXJkQW5kRG93bmxvYWRGaXJtd2FyZSBmYWlsZWQuXG4iKTsKIAkJcmV0dXJuIHN0YXR1czsKIAl9Ci0JaWYoVFJVRSA9PSBwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXItPmZ3X2Rvd25sb2FkX2RvbmUpCi0JewotCi0JCUJDTV9ERUJVR19QUklOVChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIsREJHX1RZUEVfSU5JVEVYSVQsIERSVl9FTlRSWSwgREJHX0xWTF9BTEwsICJTZW5kaW5nIGZpcnN0IGludGVycnVwdCBVUkIgZG93bi4uLi4uLiIpOwotCQlpZihTdGFydEludGVycnVwdFVyYihwc0ludGZBZGFwdGVyKSkKLQkJewotCQkJQkNNX0RFQlVHX1BSSU5UKHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlcixEQkdfVFlQRV9JTklURVhJVCwgRFJWX0VOVFJZLCBEQkdfTFZMX0FMTCwgIkNhbm5vdCBzZW5kIGludGVycnVwdCBpbiBVUkIiKTsKKwlpZiAoVFJVRSA9PSBwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXItPmZ3X2Rvd25sb2FkX2RvbmUpIHsKKwkJaWYgKFN0YXJ0SW50ZXJydXB0VXJiKHBzSW50ZkFkYXB0ZXIpKSB7CisJCQlCQ01fREVCVUdfUFJJTlQocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLCBEQkdfVFlQRV9JTklURVhJVCwgRFJWX0VOVFJZLCBEQkdfTFZMX0FMTCwKKwkJCSJDYW5ub3Qgc2VuZCBpbnRlcnJ1cHQgaW4gVVJCXG4iKTsKIAkJfQotCQkvL25vdyByZWdpc3RlciB0aGUgY250cmwgaW50ZXJmYWNlLgotCQkvL2FmdGVyIGRvd25sb2FkaW5nIHRoZSBmL3cgd2FpdGluZyBmb3IgNSBzZWMgdG8gZ2V0IHRoZSBtYWlsYm94IGludGVycnVwdC4KIAorCQkvKgorCQkgKiBub3cgcmVnaXN0ZXIgdGhlIGNudHJsIGludGVyZmFjZS4KKwkJICogYWZ0ZXIgZG93bmxvYWRpbmcgdGhlIGYvdyB3YWl0aW5nIGZvciA1IHNlYyB0byBnZXQgdGhlIG1haWxib3ggaW50ZXJydXB0LgorCQkgKi8KIAkJcHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLT53YWl0aW5nX3RvX2Z3X2Rvd25sb2FkX2RvbmUgPSBGQUxTRTsKIAkJdmFsdWUgPSB3YWl0X2V2ZW50X3RpbWVvdXQocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLT5pb2N0bF9md19kbmxkX3dhaXRfcXVldWUsCiAJCQkJCXBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlci0+d2FpdGluZ190b19md19kb3dubG9hZF9kb25lLCA1KkhaKTsKIAotCQlpZih2YWx1ZSA9PSAwKQotCQl7Ci0JCQlCQ01fREVCVUdfUFJJTlQocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLERCR19UWVBFX0lOSVRFWElULCBEUlZfRU5UUlksIERCR19MVkxfQUxMLCJNYWlsYm94IEludGVycnVwdCBoYXMgbm90IHJlYWNoZWQgdG8gRHJpdmVyLi4iKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCUJDTV9ERUJVR19QUklOVChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIsREJHX1RZUEVfSU5JVEVYSVQsIERSVl9FTlRSWSwgREJHX0xWTF9BTEwsIkdvdCB0aGUgbWFpbGJveCBpbnRlcnJ1cHQgLi4uUmVnaXN0ZXJpbmcgY29udHJvbCBpbnRlcmZhY2UuLi5cbiAiKTsKLQkJfQotCQlpZihyZWdpc3Rlcl9jb250cm9sX2RldmljZV9pbnRlcmZhY2UocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyKSA8IDApCi0JCXsKLQkJCUJDTV9ERUJVR19QUklOVChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiUmVnaXN0ZXIgQ29udHJvbCBEZXZpY2UgZmFpbGVkLi4uIik7CisJCWlmICh2YWx1ZSA9PSAwKQorCQkJcHJfZXJyKERSVl9OQU1FICI6IFRpbWVvdXQgd2FpdGluZyBmb3IgbWFpbGJveCBpbnRlcnJ1cHQuXG4iKTsKKworCQlpZiAocmVnaXN0ZXJfY29udHJvbF9kZXZpY2VfaW50ZXJmYWNlKHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlcikgPCAwKSB7CisJCQlwcl9lcnIoRFJWX05BTUUgIjogUmVnaXN0ZXIgQ29udHJvbCBEZXZpY2UgZmFpbGVkLlxuIik7CiAJCQlyZXR1cm4gLUVJTzsKIAkJfQogCX0KIAlyZXR1cm4gMDsKIH0KIAotI2lmIDAKLXN0YXRpYyB2b2lkCXByaW50X3VzYl9pbnRlcmZhY2VfZGVzYyhzdHJ1Y3QgdXNiX2ludGVyZmFjZV9kZXNjcmlwdG9yICp1c2JfaW50Zl9kZXNjKQotewotCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9JTklURVhJVCwgRFJWX0VOVFJZLCBEQkdfTFZMX0FMTCwgIioqKioqKioqKioqKioqKiogSU5URVJGQUNFIERFU0NSSVBUT1IgKioqKioqKioqKioqKioqKioqKioqIik7Ci0JCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX0lOSVRFWElULCBEUlZfRU5UUlksIERCR19MVkxfQUxMLCAiYkxlbmd0aDogJXgiLCB1c2JfaW50Zl9kZXNjLT5iTGVuZ3RoKTsKLQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfSU5JVEVYSVQsIERSVl9FTlRSWSwgREJHX0xWTF9BTEwsICJiRGVzY3JpcHRvclR5cGU6ICV4IiwgdXNiX2ludGZfZGVzYy0+YkRlc2NyaXB0b3JUeXBlKTsKLQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfSU5JVEVYSVQsIERSVl9FTlRSWSwgREJHX0xWTF9BTEwsICJiSW50ZXJmYWNlTnVtYmVyOiAleCIsIHVzYl9pbnRmX2Rlc2MtPmJJbnRlcmZhY2VOdW1iZXIpOwotCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9JTklURVhJVCwgRFJWX0VOVFJZLCBEQkdfTFZMX0FMTCwgImJBbHRlcm5hdGVTZXR0aW5nOiAleCIsIHVzYl9pbnRmX2Rlc2MtPmJBbHRlcm5hdGVTZXR0aW5nKTsKLQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfSU5JVEVYSVQsIERSVl9FTlRSWSwgREJHX0xWTF9BTEwsICJiTnVtRW5kcG9pbnRzOiAleCIsIHVzYl9pbnRmX2Rlc2MtPmJOdW1FbmRwb2ludHMpOwotCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9JTklURVhJVCwgRFJWX0VOVFJZLCBEQkdfTFZMX0FMTCwgImJJbnRlcmZhY2VDbGFzczogJXgiLCB1c2JfaW50Zl9kZXNjLT5iSW50ZXJmYWNlQ2xhc3MpOwotCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9JTklURVhJVCwgRFJWX0VOVFJZLCBEQkdfTFZMX0FMTCwgImJJbnRlcmZhY2VTdWJDbGFzczogJXgiLCB1c2JfaW50Zl9kZXNjLT5iSW50ZXJmYWNlU3ViQ2xhc3MpOwotCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9JTklURVhJVCwgRFJWX0VOVFJZLCBEQkdfTFZMX0FMTCwgImJJbnRlcmZhY2VQcm90b2NvbDogJXgiLCB1c2JfaW50Zl9kZXNjLT5iSW50ZXJmYWNlUHJvdG9jb2wpOwotCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9JTklURVhJVCwgRFJWX0VOVFJZLCBEQkdfTFZMX0FMTCwgImlJbnRlcmZhY2UgOiV4XG4iLHVzYl9pbnRmX2Rlc2MtPmlJbnRlcmZhY2UpOwotfQotc3RhdGljIHZvaWQJcHJpbnRfdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3Ioc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICp1c2JfZXBfZGVzYykKLXsKLQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfSU5JVEVYSVQsIERSVl9FTlRSWSwgREJHX0xWTF9BTEwsICIqKioqKioqKioqKioqKioqIEVORFBPSU5UIERFU0NSSVBUT1IgKioqKioqKioqKioqKioqKioqKioqIik7Ci0JCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX0lOSVRFWElULCBEUlZfRU5UUlksIERCR19MVkxfQUxMLCAiYkxlbmd0aCAgOiV4ICIsIHVzYl9lcF9kZXNjLT5iTGVuZ3RoKTsKLQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfSU5JVEVYSVQsIERSVl9FTlRSWSwgREJHX0xWTF9BTEwsICJiRGVzY3JpcHRvclR5cGUgIDoleCAiLCB1c2JfZXBfZGVzYy0+YkRlc2NyaXB0b3JUeXBlKTsKLQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfSU5JVEVYSVQsIERSVl9FTlRSWSwgREJHX0xWTF9BTEwsICJiRW5kcG9pbnRBZGRyZXNzICA6JXggIiwgdXNiX2VwX2Rlc2MtPmJFbmRwb2ludEFkZHJlc3MpOwotCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9JTklURVhJVCwgRFJWX0VOVFJZLCBEQkdfTFZMX0FMTCwgImJtQXR0cmlidXRlcyAgOiV4ICIsIHVzYl9lcF9kZXNjLT5ibUF0dHJpYnV0ZXMpOwotCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9JTklURVhJVCwgRFJWX0VOVFJZLCBEQkdfTFZMX0FMTCwgIndNYXhQYWNrZXRTaXplICA6JXggIix1c2JfZXBfZGVzYy0+d01heFBhY2tldFNpemUpOwotCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9JTklURVhJVCwgRFJWX0VOVFJZLCBEQkdfTFZMX0FMTCwgImJJbnRlcnZhbCAgOiV4ICIsdXNiX2VwX2Rlc2MtPmJJbnRlcnZhbCk7Ci19Ci0KLSNlbmRpZgogCiBzdGF0aWMgaW5saW5lIGludCBiY21fdXNiX2VuZHBvaW50X251bShjb25zdCBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVwZCkKIHsKQEAgLTUxOCwxMjQgKzQxNywxMTEgQEAKIAlyZXR1cm4gKGJjbV91c2JfZW5kcG9pbnRfeGZlcl9pc29jKGVwZCkgJiYgYmNtX3VzYl9lbmRwb2ludF9kaXJfb3V0KGVwZCkpOwogfQogCi1JTlQgSW50ZXJmYWNlQWRhcHRlckluaXQoUFNfSU5URVJGQUNFX0FEQVBURVIgcHNJbnRmQWRhcHRlcikKK3N0YXRpYyBpbnQgSW50ZXJmYWNlQWRhcHRlckluaXQoUFNfSU5URVJGQUNFX0FEQVBURVIgcHNJbnRmQWRhcHRlcikKIHsKIAlzdHJ1Y3QgdXNiX2hvc3RfaW50ZXJmYWNlICppZmFjZV9kZXNjOwogCXN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZW5kcG9pbnQ7CiAJc2l6ZV90IGJ1ZmZlcl9zaXplOwotCVVMT05HIHZhbHVlOwotCUlOVCByZXR2YWwgPSAwOwotCUlOVCB1c2VkSW50T3V0Rm9yQnVsa1RyYW5zZmVyID0gMCA7CisJdW5zaWduZWQgbG9uZyB2YWx1ZTsKKwlpbnQgcmV0dmFsID0gMDsKKwlpbnQgdXNlZEludE91dEZvckJ1bGtUcmFuc2ZlciA9IDAgOwogCUJPT0xFQU4gYkJjbTE2ID0gRkFMU0U7CiAJVUlOVCB1aURhdGEgPSAwOwogCiAJLyogU3RvcmUgdGhlIHVzYiBkZXYgaW50byBpbnRlcmZhY2UgYWRhcHRlciAqLwotCXBzSW50ZkFkYXB0ZXItPnVkZXYgPSB1c2JfZ2V0X2RldihpbnRlcmZhY2VfdG9fdXNiZGV2KAotCQkJCQkJCQlwc0ludGZBZGFwdGVyLT5pbnRlcmZhY2UpKTsKKwlwc0ludGZBZGFwdGVyLT51ZGV2ID0gdXNiX2dldF9kZXYoaW50ZXJmYWNlX3RvX3VzYmRldihwc0ludGZBZGFwdGVyLT5pbnRlcmZhY2UpKTsKIAotCWlmKChwc0ludGZBZGFwdGVyLT51ZGV2LT5zcGVlZCA9PSBVU0JfU1BFRURfSElHSCkpCi0JewotCQlwc0ludGZBZGFwdGVyLT5iSGlnaFNwZWVkRGV2aWNlID0gVFJVRSA7Ci0JCUJDTV9ERUJVR19QUklOVChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIsREJHX1RZUEVfSU5JVEVYSVQsIERSVl9FTlRSWSwgREJHX0xWTF9BTEwsICJNT0RFTSBJUyBDT05GSUdVUkVEIFRPIEhJR0hfU1BFRUQgIik7Ci0JfQotCWVsc2UKLQl7Ci0JCXBzSW50ZkFkYXB0ZXItPmJIaWdoU3BlZWREZXZpY2UgPSBGQUxTRSA7Ci0JCUJDTV9ERUJVR19QUklOVChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIsREJHX1RZUEVfSU5JVEVYSVQsIERSVl9FTlRSWSwgREJHX0xWTF9BTEwsICJNT0RFTSBJUyBDT05GSUdVUkVEIFRPIEZVTExfU1BFRUQgIik7Ci0JfQotCisJcHNJbnRmQWRhcHRlci0+YkhpZ2hTcGVlZERldmljZSA9IChwc0ludGZBZGFwdGVyLT51ZGV2LT5zcGVlZCA9PSBVU0JfU1BFRURfSElHSCk7CiAJcHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLT5pbnRlcmZhY2VfcmRtID0gQmNtUkRNOwogCXBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlci0+aW50ZXJmYWNlX3dybSA9IEJjbVdSTTsKIAotCWlmKHJkbWFsdChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIsIENISVBfSURfUkVHLCAoUFVJTlQpJihwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXItPmNoaXBfaWQpLCBzaXplb2YoVUlOVCkpIDwgMCkKLQl7Ci0JCUJDTV9ERUJVR19QUklOVChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiQ0hJUCBJRCBSZWFkIEZhaWxlZFxuIik7Ci0JCXJldHVybiBTVEFUVVNfRkFJTFVSRTsKLQl9Ci0gICAgaWYoMHhiZWNlMzIwMD09KHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlci0+Y2hpcF9pZCZ+KDB4RjApKSkKLQl7Ci0JCXBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlci0+Y2hpcF9pZD0ocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLT5jaGlwX2lkJn4oMHhGMCkpOworCXJldHZhbCA9IHJkbWFsdChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIsIENISVBfSURfUkVHLAorCQkJKHUzMiAqKSYocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLT5jaGlwX2lkKSwgc2l6ZW9mKHUzMikpOworCWlmIChyZXR2YWwpIHsKKwkJQkNNX0RFQlVHX1BSSU5UKHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiQ0hJUCBJRCBSZWFkIEZhaWxlZFxuIik7CisJCXJldHVybiByZXR2YWw7CiAJfQogCi0JQkNNX0RFQlVHX1BSSU5UKHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlcixEQkdfVFlQRV9JTklURVhJVCwgRFJWX0VOVFJZLCBEQkdfTFZMX0FMTCwgIkZpcnN0IFJETSBDaGlwIElEIDB4JWx4XG4iLCBwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXItPmNoaXBfaWQpOworCWlmICgweGJlY2UzMjAwID09IChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXItPmNoaXBfaWQgJiB+KDB4RjApKSkKKwkJcHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLT5jaGlwX2lkICY9IH4weEYwOwogCi0gICAgaWZhY2VfZGVzYyA9IHBzSW50ZkFkYXB0ZXItPmludGVyZmFjZS0+Y3VyX2FsdHNldHRpbmc7Ci0JLy9wcmludF91c2JfaW50ZXJmYWNlX2Rlc2MoJihpZmFjZV9kZXNjLT5kZXNjKSk7CisJZGV2X2luZm8oJnBzSW50ZkFkYXB0ZXItPnVkZXYtPmRldiwgIlJETSBDaGlwIElEIDB4JWx4XG4iLAorCQkgcHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLT5jaGlwX2lkKTsKIAotCWlmKHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlci0+Y2hpcF9pZCA9PSBUM0IpCi0JeworCWlmYWNlX2Rlc2MgPSBwc0ludGZBZGFwdGVyLT5pbnRlcmZhY2UtPmN1cl9hbHRzZXR0aW5nOwogCi0JCS8vCi0JCS8vVDNCIGRldmljZSB3aWxsIGhhdmUgRUVQUk9NLGNoZWNrIGlmIEVFUFJPTSBpcyBwcm9wZXIgYW5kIEJDTTE2IGNhbiBiZSBkb25lIG9yIG5vdC4KLQkJLy8KLQkJQmVjZWVtRUVQUk9NQnVsa1JlYWQocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLCZ1aURhdGEsMHgwLDQpOwotCQlpZih1aURhdGEgPT0gQkVDTSkKLQkJeworCWlmIChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXItPmNoaXBfaWQgPT0gVDNCKSB7CisJCS8qIFQzQiBkZXZpY2Ugd2lsbCBoYXZlIEVFUFJPTSwgY2hlY2sgaWYgRUVQUk9NIGlzIHByb3BlciBhbmQgQkNNMTYgY2FuIGJlIGRvbmUgb3Igbm90LiAqLworCQlCZWNlZW1FRVBST01CdWxrUmVhZChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIsICZ1aURhdGEsIDB4MCwgNCk7CisJCWlmICh1aURhdGEgPT0gQkVDTSkKIAkJCWJCY20xNiA9IFRSVUU7Ci0JCX0KLQkJQkNNX0RFQlVHX1BSSU5UKHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlcixEQkdfVFlQRV9JTklURVhJVCwgRFJWX0VOVFJZLCBEQkdfTFZMX0FMTCwgIk51bWJlciBvZiBBbHRzZXR0aW5nIGF2aWFpbGFibGUgZm9yIFRoaXMgTW9kZW0gMHgleFxuIiwgcHNJbnRmQWRhcHRlci0+aW50ZXJmYWNlLT5udW1fYWx0c2V0dGluZyk7Ci0JCWlmKGJCY20xNiA9PSBUUlVFKQotCQl7Ci0JCQkvL3NlbGVjdGluZyBhbHRlcm5hdGUgc2V0dGluZyBvbmUgYXMgYSBkZWZhdWx0IHNldHRpbmcgZm9yIEhpZ2ggU3BlZWQgIG1vZGVtLgotCQkJaWYocHNJbnRmQWRhcHRlci0+YkhpZ2hTcGVlZERldmljZSkKLQkJCQlyZXR2YWw9IHVzYl9zZXRfaW50ZXJmYWNlKHBzSW50ZkFkYXB0ZXItPnVkZXYsREVGQVVMVF9TRVRUSU5HXzAsQUxURVJOQVRFX1NFVFRJTkdfMSk7Ci0JCQlCQ01fREVCVUdfUFJJTlQocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLERCR19UWVBFX0lOSVRFWElULCBEUlZfRU5UUlksIERCR19MVkxfQUxMLCAiQkNNMTYgaXMgQXBwbGljYWJsZSBvbiB0aGlzIGRvbmdsZSIpOwotCQkJaWYocmV0dmFsIHx8IChwc0ludGZBZGFwdGVyLT5iSGlnaFNwZWVkRGV2aWNlID09IEZBTFNFKSkKLQkJCXsKKworCQlkZXZfaW5mbygmcHNJbnRmQWRhcHRlci0+dWRldi0+ZGV2LCAibnVtYmVyIG9mIGFsdGVybmF0ZSBzZXR0aW5nICVkXG4iLAorCQkJIHBzSW50ZkFkYXB0ZXItPmludGVyZmFjZS0+bnVtX2FsdHNldHRpbmcpOworCisJCWlmIChiQmNtMTYgPT0gVFJVRSkgeworCQkJLyogc2VsZWN0aW5nIGFsdGVybmF0ZSBzZXR0aW5nIG9uZSBhcyBhIGRlZmF1bHQgc2V0dGluZyBmb3IgSGlnaCBTcGVlZCAgbW9kZW0uICovCisJCQlpZiAocHNJbnRmQWRhcHRlci0+YkhpZ2hTcGVlZERldmljZSkKKwkJCQlyZXR2YWw9IHVzYl9zZXRfaW50ZXJmYWNlKHBzSW50ZkFkYXB0ZXItPnVkZXYsIERFRkFVTFRfU0VUVElOR18wLCBBTFRFUk5BVEVfU0VUVElOR18xKTsKKwkJCUJDTV9ERUJVR19QUklOVChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIsIERCR19UWVBFX0lOSVRFWElULCBEUlZfRU5UUlksIERCR19MVkxfQUxMLAorCQkJCSJCQ00xNiBpcyBhcHBsaWNhYmxlIG9uIHRoaXMgZG9uZ2xlXG4iKTsKKwkJCWlmIChyZXR2YWwgfHwgKHBzSW50ZkFkYXB0ZXItPmJIaWdoU3BlZWREZXZpY2UgPT0gRkFMU0UpKSB7CiAJCQkJdXNlZEludE91dEZvckJ1bGtUcmFuc2ZlciA9IEVQMiA7CiAJCQkJZW5kcG9pbnQgPSAmaWZhY2VfZGVzYy0+ZW5kcG9pbnRbRVAyXS5kZXNjOwotCQkJCUJDTV9ERUJVR19QUklOVChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIsREJHX1RZUEVfSU5JVEVYSVQsIERSVl9FTlRSWSwgREJHX0xWTF9BTEwsICJJbnRlcmZhY2UgYWx0c2V0dGluZyAgZ290IGZhaWxlZCBvciBNb2VtZCBpcyBjb25maWd1cmVkIHRvIEZTLmhlbmNlIHdpbGwgd29yayBvbiBkZWZhdWx0IHNldHRpbmcgMCBcbiIpOworCQkJCUJDTV9ERUJVR19QUklOVChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIsIERCR19UWVBFX0lOSVRFWElULCBEUlZfRU5UUlksIERCR19MVkxfQUxMLAorCQkJCQkgIkludGVyZmFjZSBhbHRzZXR0aW5nIGZhaWxlZCBvciBtb2RlbSBpcyBjb25maWd1cmVkIHRvIEZ1bGwgU3BlZWQsIGhlbmNlIHdpbGwgd29yayBvbiBkZWZhdWx0IHNldHRpbmcgMFxuIik7CiAJCQkJLyoKLQkJCQlJZiBNb2RlbSBpcyBoaWdoIHNwZWVkIGRldmljZSBFUDIgc2hvdWxkIGJlIElOVCBPVVQgRW5kIHBvaW50Ci0JCQkJSWYgTW9kZSBpcyBGUyB0aGVuIEVQMiBzaG91bGQgYmUgYnVsayBlbmQgcG9pbnQKLQkJCQkqLwotCQkJCWlmKCgocHNJbnRmQWRhcHRlci0+YkhpZ2hTcGVlZERldmljZSA9PVRSVUUgKSAmJiAoYmNtX3VzYl9lbmRwb2ludF9pc19pbnRfb3V0KGVuZHBvaW50KT09IEZBTFNFKSkKLQkJCQkJfHwoKHBzSW50ZkFkYXB0ZXItPmJIaWdoU3BlZWREZXZpY2UgPT0gRkFMU0UpJiYgKGJjbV91c2JfZW5kcG9pbnRfaXNfYnVsa19vdXQoZW5kcG9pbnQpPT0gRkFMU0UpKSkKLQkJCQl7Ci0JCQkJCUJDTV9ERUJVR19QUklOVChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIsREJHX1RZUEVfSU5JVEVYSVQsIERSVl9FTlRSWSwgREJHX0xWTF9BTEwsIkNvbmZpZ3VyaW5nIHRoZSBFRVBST00gIik7Ci0JCQkJCS8vY2hhbmdlIHRoZSBFUDIsIEVQNCB0byBJTlQgT1VUIGVuZCBwb2ludAorCQkJCSAqIElmIE1vZGVtIGlzIGhpZ2ggc3BlZWQgZGV2aWNlIEVQMiBzaG91bGQgYmUgSU5UIE9VVCBFbmQgcG9pbnQKKwkJCQkgKiBJZiBNb2RlIGlzIEZTIHRoZW4gRVAyIHNob3VsZCBiZSBidWxrIGVuZCBwb2ludAorCQkJCSAqLworCQkJCWlmICgoKHBzSW50ZkFkYXB0ZXItPmJIaWdoU3BlZWREZXZpY2UgPT0gVFJVRSkgJiYgKGJjbV91c2JfZW5kcG9pbnRfaXNfaW50X291dChlbmRwb2ludCkgPT0gRkFMU0UpKQorCQkJCQl8fCAoKHBzSW50ZkFkYXB0ZXItPmJIaWdoU3BlZWREZXZpY2UgPT0gRkFMU0UpICYmIChiY21fdXNiX2VuZHBvaW50X2lzX2J1bGtfb3V0KGVuZHBvaW50KSA9PSBGQUxTRSkpKSB7CisJCQkJCUJDTV9ERUJVR19QUklOVChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIsIERCR19UWVBFX0lOSVRFWElULCBEUlZfRU5UUlksIERCR19MVkxfQUxMLAorCQkJCQkJIkNvbmZpZ3VyaW5nIHRoZSBFRVBST01cbiIpOworCQkJCQkvKiBjaGFuZ2UgdGhlIEVQMiwgRVA0IHRvIElOVCBPVVQgZW5kIHBvaW50ICovCiAJCQkJCUNvbmZpZ3VyZUVuZFBvaW50VHlwZXNUaHJvdWdoRUVQUk9NKHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlcik7CiAKIAkJCQkJLyoKLQkJCQkJSXQgcmVzZXRzIHRoZSBkZXZpY2UgYW5kIGlmIGFueSB0aGluZyBnZXRzIGNoYW5nZWQgaW4gVVNCIGRlc2NyaXB0b3IgaXQgd2lsbCBzaG93IGZhaWwgYW5kCi0JCQkJCXJlLWVudW1lcmF0ZSB0aGUgZGV2aWNlCi0JCQkJCSovCisJCQkJCSAqIEl0IHJlc2V0cyB0aGUgZGV2aWNlIGFuZCBpZiBhbnkgdGhpbmcgZ2V0cyBjaGFuZ2VkCisJCQkJCSAqICBpbiBVU0IgZGVzY3JpcHRvciBpdCB3aWxsIHNob3cgZmFpbCBhbmQgcmUtZW51bWVyYXRlCisJCQkJCSAqIHRoZSBkZXZpY2UKKwkJCQkJICovCiAJCQkJCXJldHZhbCA9IHVzYl9yZXNldF9kZXZpY2UocHNJbnRmQWRhcHRlci0+dWRldik7Ci0JCQkJCWlmKHJldHZhbCkKLQkJCQkJewotCQkJCQkJQkNNX0RFQlVHX1BSSU5UKHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlcixEQkdfVFlQRV9JTklURVhJVCwgRFJWX0VOVFJZLCBEQkdfTFZMX0FMTCwgInJlc2V0IGdvdCBmYWlsZWQuIGhlbmNlIFJlLWVudW1lcmF0aW5nIHRoZSBkZXZpY2UgXG4iKTsKKwkJCQkJaWYgKHJldHZhbCkgeworCQkJCQkJQkNNX0RFQlVHX1BSSU5UKHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlciwgREJHX1RZUEVfSU5JVEVYSVQsIERSVl9FTlRSWSwgREJHX0xWTF9BTEwsCisJCQkJCQkJInJlc2V0IGZhaWxlZC4gIFJlLWVudW1lcmF0aW5nIHRoZSBkZXZpY2UuXG4iKTsKIAkJCQkJCXJldHVybiByZXR2YWwgOwogCQkJCQl9CiAKIAkJCQl9Ci0JCQkJaWYoKHBzSW50ZkFkYXB0ZXItPmJIaWdoU3BlZWREZXZpY2UgPT0gRkFMU0UpICYmIGJjbV91c2JfZW5kcG9pbnRfaXNfYnVsa19vdXQoZW5kcG9pbnQpKQotCQkJCXsKLQkJCQkJLy8gT25jZSBCVUxLIGlzIHNlbGVjdGVkIGluIEZTIG1vZGUuIFJldmVydCBpdCBiYWNrIHRvIElOVC4gRWxzZSBVU0JfSUYgd2lsbCBmYWlsLgorCQkJCWlmICgocHNJbnRmQWRhcHRlci0+YkhpZ2hTcGVlZERldmljZSA9PSBGQUxTRSkgJiYgYmNtX3VzYl9lbmRwb2ludF9pc19idWxrX291dChlbmRwb2ludCkpIHsKKwkJCQkJLyogT25jZSBCVUxLIGlzIHNlbGVjdGVkIGluIEZTIG1vZGUuIFJldmVydCBpdCBiYWNrIHRvIElOVC4gRWxzZSBVU0JfSUYgd2lsbCBmYWlsLiAqLwogCQkJCQlVSU5UIF91aURhdGEgPSBudG9obChFUDJfQ0ZHX0lOVCk7Ci0JCQkJCUJDTV9ERUJVR19QUklOVChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIsREJHX1RZUEVfSU5JVEVYSVQsIERSVl9FTlRSWSwgREJHX0xWTF9BTEwsIlJldmVydGluZyBCdWxrIHRvIElOVCBhcyBpdCBpcyBGUyBNT0RFIik7Ci0JCQkJCUJlY2VlbUVFUFJPTUJ1bGtXcml0ZShwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIsKFBVQ0hBUikmX3VpRGF0YSwweDEzNiw0LFRSVUUpOworCQkJCQlCQ01fREVCVUdfUFJJTlQocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLCBEQkdfVFlQRV9JTklURVhJVCwgRFJWX0VOVFJZLCBEQkdfTFZMX0FMTCwgCisJCQkJCQkiUmV2ZXJ0aW5nIEJ1bGsgdG8gSU5UIGFzIGl0IGlzIGluIEZ1bGwgU3BlZWQgbW9kZS5cbiIpOworCQkJCQlCZWNlZW1FRVBST01CdWxrV3JpdGUocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLCAoUFVDSEFSKSZfdWlEYXRhLCAweDEzNiwgNCwgVFJVRSk7CiAJCQkJfQotCQkJfQotCQkJZWxzZQotCQkJeworCQkJfSBlbHNlIHsKIAkJCQl1c2VkSW50T3V0Rm9yQnVsa1RyYW5zZmVyID0gRVA0IDsKIAkJCQllbmRwb2ludCA9ICZpZmFjZV9kZXNjLT5lbmRwb2ludFtFUDRdLmRlc2M7Ci0JCQkJQkNNX0RFQlVHX1BSSU5UKHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlcixEQkdfVFlQRV9JTklURVhJVCwgRFJWX0VOVFJZLCBEQkdfTFZMX0FMTCwgIkNob29zaW5nIEFsdFNldHRpbmcgYXMgYSBkZWZhdWx0IHNldHRpbmciKTsKLQkJCQlpZiggYmNtX3VzYl9lbmRwb2ludF9pc19pbnRfb3V0KGVuZHBvaW50KSA9PSBGQUxTRSkKLQkJCQl7Ci0JCQkJCUJDTV9ERUJVR19QUklOVChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIsREJHX1RZUEVfSU5JVEVYSVQsIERSVl9FTlRSWSwgREJHX0xWTF9BTEwsICIgRG9uZ2xlIGRvZXMgbm90IGhhdmUgQkNNMTYgRml4Iik7Ci0JCQkJCS8vY2hhbmdlIHRoZSBFUDIsIEVQNCB0byBJTlQgT1VUIGVuZCBwb2ludCBhbmQgdXNlIEVQNCBpbiBhbHRzZXR0aW5nCisJCQkJQkNNX0RFQlVHX1BSSU5UKHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlciwgREJHX1RZUEVfSU5JVEVYSVQsIERSVl9FTlRSWSwgREJHX0xWTF9BTEwsCisJCQkJCSJDaG9vc2luZyBBbHRTZXR0aW5nIGFzIGEgZGVmYXVsdCBzZXR0aW5nLlxuIik7CisJCQkJaWYgKGJjbV91c2JfZW5kcG9pbnRfaXNfaW50X291dChlbmRwb2ludCkgPT0gRkFMU0UpIHsKKwkJCQkJQkNNX0RFQlVHX1BSSU5UKHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlciwgREJHX1RZUEVfSU5JVEVYSVQsIERSVl9FTlRSWSwgREJHX0xWTF9BTEwsCisJCQkJCQkiRG9uZ2xlIGRvZXMgbm90IGhhdmUgQkNNMTYgRml4LlxuIik7CisJCQkJCS8qIGNoYW5nZSB0aGUgRVAyLCBFUDQgdG8gSU5UIE9VVCBlbmQgcG9pbnQgYW5kIHVzZSBFUDQgaW4gYWx0c2V0dGluZyAqLwogCQkJCQlDb25maWd1cmVFbmRQb2ludFR5cGVzVGhyb3VnaEVFUFJPTShwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIpOwogCiAJCQkJCS8qCi0JCQkJCUl0IHJlc2V0cyB0aGUgZGV2aWNlIGFuZCBpZiBhbnkgdGhpbmcgZ2V0cyBjaGFuZ2VkIGluIFVTQiBkZXNjcmlwdG9yIGl0IHdpbGwgc2hvdyBmYWlsIGFuZAotCQkJCQlyZS1lbnVtZXJhdGUgdGhlIGRldmljZQotCQkJCQkqLworCQkJCQkgKiBJdCByZXNldHMgdGhlIGRldmljZSBhbmQgaWYgYW55IHRoaW5nIGdldHMgY2hhbmdlZCBpbgorCQkJCQkgKiAgVVNCIGRlc2NyaXB0b3IgaXQgd2lsbCBzaG93IGZhaWwgYW5kIHJlLWVudW1lcmF0ZSB0aGUKKwkJCQkJICogZGV2aWNlCisJCQkJCSAqLwogCQkJCQlyZXR2YWwgPSB1c2JfcmVzZXRfZGV2aWNlKHBzSW50ZkFkYXB0ZXItPnVkZXYpOwotCQkJCQlpZihyZXR2YWwpCi0JCQkJCXsKLQkJCQkJCUJDTV9ERUJVR19QUklOVChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIsREJHX1RZUEVfSU5JVEVYSVQsIERSVl9FTlRSWSwgREJHX0xWTF9BTEwsICJyZXNldCBnb3QgZmFpbGVkLiBoZW5jZSBSZS1lbnVtZXJhdGluZyB0aGUgZGV2aWNlIFxuIik7Ci0JCQkJCQlyZXR1cm4gcmV0dmFsIDsKKwkJCQkJaWYgKHJldHZhbCkgeworCQkJCQkJQkNNX0RFQlVHX1BSSU5UKHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlciwgREJHX1RZUEVfSU5JVEVYSVQsIERSVl9FTlRSWSwgREJHX0xWTF9BTEwsCisJCQkJCQkJInJlc2V0IGZhaWxlZC4gIFJlLWVudW1lcmF0aW5nIHRoZSBkZXZpY2UuXG4iKTsKKwkJCQkJCXJldHVybiByZXR2YWw7CiAJCQkJCX0KIAogCQkJCX0KQEAgLTY0NCw5OCArNTMwLDY2IEBACiAJfQogCiAJaWZhY2VfZGVzYyA9IHBzSW50ZkFkYXB0ZXItPmludGVyZmFjZS0+Y3VyX2FsdHNldHRpbmc7Ci0JLy9wcmludF91c2JfaW50ZXJmYWNlX2Rlc2MoJihpZmFjZV9kZXNjLT5kZXNjKSk7Ci0gICAJQkNNX0RFQlVHX1BSSU5UKHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsICJDdXJyZW50IG51bWJlciBvZiBlbmRwb2ludHMgOiV4IFxuIiwgaWZhY2VfZGVzYy0+ZGVzYy5iTnVtRW5kcG9pbnRzKTsKLSAgICBmb3IgKHZhbHVlID0gMDsgdmFsdWUgPCBpZmFjZV9kZXNjLT5kZXNjLmJOdW1FbmRwb2ludHM7ICsrdmFsdWUpCi0JewotICAgICAgICBlbmRwb2ludCA9ICZpZmFjZV9kZXNjLT5lbmRwb2ludFt2YWx1ZV0uZGVzYzsKLQkJLy9wcmludF91c2JfZW5kcG9pbnRfZGVzY3JpcHRvcihlbmRwb2ludCk7CiAKLSAgICAgICAgaWYgKCFwc0ludGZBZGFwdGVyLT5zQnVsa0luLmJ1bGtfaW5fZW5kcG9pbnRBZGRyICYmIGJjbV91c2JfZW5kcG9pbnRfaXNfYnVsa19pbihlbmRwb2ludCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJ1ZmZlcl9zaXplID0gbGUxNl90b19jcHUoZW5kcG9pbnQtPndNYXhQYWNrZXRTaXplKTsKLSAgICAgICAgICAgIHBzSW50ZkFkYXB0ZXItPnNCdWxrSW4uYnVsa19pbl9zaXplID0gYnVmZmVyX3NpemU7Ci0gICAgICAgICAgICBwc0ludGZBZGFwdGVyLT5zQnVsa0luLmJ1bGtfaW5fZW5kcG9pbnRBZGRyID0KLQkJCQkJCQkJZW5kcG9pbnQtPmJFbmRwb2ludEFkZHJlc3M7Ci0JICAgIAlwc0ludGZBZGFwdGVyLT5zQnVsa0luLmJ1bGtfaW5fcGlwZSA9CisJZm9yICh2YWx1ZSA9IDA7IHZhbHVlIDwgaWZhY2VfZGVzYy0+ZGVzYy5iTnVtRW5kcG9pbnRzOyArK3ZhbHVlKSB7CisJCWVuZHBvaW50ID0gJmlmYWNlX2Rlc2MtPmVuZHBvaW50W3ZhbHVlXS5kZXNjOworCisJCWlmICghcHNJbnRmQWRhcHRlci0+c0J1bGtJbi5idWxrX2luX2VuZHBvaW50QWRkciAmJiBiY21fdXNiX2VuZHBvaW50X2lzX2J1bGtfaW4oZW5kcG9pbnQpKSB7CisJCQlidWZmZXJfc2l6ZSA9IGxlMTZfdG9fY3B1KGVuZHBvaW50LT53TWF4UGFja2V0U2l6ZSk7CisJCQlwc0ludGZBZGFwdGVyLT5zQnVsa0luLmJ1bGtfaW5fc2l6ZSA9IGJ1ZmZlcl9zaXplOworCQkJcHNJbnRmQWRhcHRlci0+c0J1bGtJbi5idWxrX2luX2VuZHBvaW50QWRkciA9IGVuZHBvaW50LT5iRW5kcG9pbnRBZGRyZXNzOworCQkJcHNJbnRmQWRhcHRlci0+c0J1bGtJbi5idWxrX2luX3BpcGUgPQogCQkJCQl1c2JfcmN2YnVsa3BpcGUocHNJbnRmQWRhcHRlci0+dWRldiwKIAkJCQkJCQkJcHNJbnRmQWRhcHRlci0+c0J1bGtJbi5idWxrX2luX2VuZHBvaW50QWRkcik7Ci0gICAgICAgIH0KKwkJfQogCi0gICAgICAgIGlmICghcHNJbnRmQWRhcHRlci0+c0J1bGtPdXQuYnVsa19vdXRfZW5kcG9pbnRBZGRyICYmIGJjbV91c2JfZW5kcG9pbnRfaXNfYnVsa19vdXQoZW5kcG9pbnQpKQotICAgICAgICB7Ci0KLQkJCXBzSW50ZkFkYXB0ZXItPnNCdWxrT3V0LmJ1bGtfb3V0X2VuZHBvaW50QWRkciA9Ci0JCQkJCQkJCQkJZW5kcG9pbnQtPmJFbmRwb2ludEFkZHJlc3M7Ci0JICAgIAlwc0ludGZBZGFwdGVyLT5zQnVsa091dC5idWxrX291dF9waXBlID0KLQkJCXVzYl9zbmRidWxrcGlwZShwc0ludGZBZGFwdGVyLT51ZGV2LAorCQlpZiAoIXBzSW50ZkFkYXB0ZXItPnNCdWxrT3V0LmJ1bGtfb3V0X2VuZHBvaW50QWRkciAmJiBiY21fdXNiX2VuZHBvaW50X2lzX2J1bGtfb3V0KGVuZHBvaW50KSkgeworCQkJcHNJbnRmQWRhcHRlci0+c0J1bGtPdXQuYnVsa19vdXRfZW5kcG9pbnRBZGRyID0gZW5kcG9pbnQtPmJFbmRwb2ludEFkZHJlc3M7CisJCQlwc0ludGZBZGFwdGVyLT5zQnVsa091dC5idWxrX291dF9waXBlID0KKwkJCQl1c2Jfc25kYnVsa3BpcGUocHNJbnRmQWRhcHRlci0+dWRldiwKIAkJCQkJcHNJbnRmQWRhcHRlci0+c0J1bGtPdXQuYnVsa19vdXRfZW5kcG9pbnRBZGRyKTsKLSAgICAgICAgfQorCQl9CiAKLSAgICAgICAgaWYgKCFwc0ludGZBZGFwdGVyLT5zSW50ckluLmludF9pbl9lbmRwb2ludEFkZHIgJiYgYmNtX3VzYl9lbmRwb2ludF9pc19pbnRfaW4oZW5kcG9pbnQpKQotICAgICAgICB7Ci0gICAgICAgICAgICBidWZmZXJfc2l6ZSA9IGxlMTZfdG9fY3B1KGVuZHBvaW50LT53TWF4UGFja2V0U2l6ZSk7Ci0gICAgICAgICAgICBwc0ludGZBZGFwdGVyLT5zSW50ckluLmludF9pbl9zaXplID0gYnVmZmVyX3NpemU7Ci0gICAgICAgICAgICBwc0ludGZBZGFwdGVyLT5zSW50ckluLmludF9pbl9lbmRwb2ludEFkZHIgPQotCQkJCQkJCQllbmRwb2ludC0+YkVuZHBvaW50QWRkcmVzczsKLSAgICAgICAgICAgIHBzSW50ZkFkYXB0ZXItPnNJbnRySW4uaW50X2luX2ludGVydmFsID0gZW5kcG9pbnQtPmJJbnRlcnZhbDsKLSAgICAgICAgICAgIHBzSW50ZkFkYXB0ZXItPnNJbnRySW4uaW50X2luX2J1ZmZlciA9CisJCWlmICghcHNJbnRmQWRhcHRlci0+c0ludHJJbi5pbnRfaW5fZW5kcG9pbnRBZGRyICYmIGJjbV91c2JfZW5kcG9pbnRfaXNfaW50X2luKGVuZHBvaW50KSkgeworCQkJYnVmZmVyX3NpemUgPSBsZTE2X3RvX2NwdShlbmRwb2ludC0+d01heFBhY2tldFNpemUpOworCQkJcHNJbnRmQWRhcHRlci0+c0ludHJJbi5pbnRfaW5fc2l6ZSA9IGJ1ZmZlcl9zaXplOworCQkJcHNJbnRmQWRhcHRlci0+c0ludHJJbi5pbnRfaW5fZW5kcG9pbnRBZGRyID0gZW5kcG9pbnQtPmJFbmRwb2ludEFkZHJlc3M7CisJCQlwc0ludGZBZGFwdGVyLT5zSW50ckluLmludF9pbl9pbnRlcnZhbCA9IGVuZHBvaW50LT5iSW50ZXJ2YWw7CisJCQlwc0ludGZBZGFwdGVyLT5zSW50ckluLmludF9pbl9idWZmZXIgPQogCQkJCQkJa21hbGxvYyhidWZmZXJfc2l6ZSwgR0ZQX0tFUk5FTCk7Ci0gICAgICAgICAgICBpZiAoIXBzSW50ZkFkYXB0ZXItPnNJbnRySW4uaW50X2luX2J1ZmZlcikgewotICAgICAgICAgICAgICAgIEJDTV9ERUJVR19QUklOVChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIsREJHX1RZUEVfSU5JVEVYSVQsIERSVl9FTlRSWSwgREJHX0xWTF9BTEwsICJDb3VsZCBub3QgYWxsb2NhdGUgaW50ZXJydXB0X2luX2J1ZmZlciIpOwotICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgICAgICAgfQotCQkJLy9wc0ludGZBZGFwdGVyLT5zSW50ckluLmludF9pbl9waXBlID0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICghcHNJbnRmQWRhcHRlci0+c0ludHJPdXQuaW50X291dF9lbmRwb2ludEFkZHIgJiYgYmNtX3VzYl9lbmRwb2ludF9pc19pbnRfb3V0KGVuZHBvaW50KSkKLSAgICAgICAgewotCi0JCQlpZiggIXBzSW50ZkFkYXB0ZXItPnNCdWxrT3V0LmJ1bGtfb3V0X2VuZHBvaW50QWRkciAmJgotCQkJCShwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXItPmNoaXBfaWQgPT0gVDNCKSAmJiAodmFsdWUgPT0gdXNlZEludE91dEZvckJ1bGtUcmFuc2ZlcikpCi0JCQl7Ci0JCQkJLy91c2UgZmlyc3QgaW50b3V0IGVuZCBwb2ludCBhcyBhIGJ1bGsgb3V0IGVuZCBwb2ludAotICAgICAgICAgICAgCWJ1ZmZlcl9zaXplID0gbGUxNl90b19jcHUoZW5kcG9pbnQtPndNYXhQYWNrZXRTaXplKTsKLSAgICAgICAgICAgIAlwc0ludGZBZGFwdGVyLT5zQnVsa091dC5idWxrX291dF9zaXplID0gYnVmZmVyX3NpemU7Ci0JCQkJLy9wcmludGsoIlxuSU5UIE9VVCBFbmRwb2luZyBidWZmZXIgc2l6ZSA6JXggZW5kcG9pbnQgOiV4XG4iLCBidWZmZXJfc2l6ZSwgdmFsdWUgKzEpOwotCQkJCXBzSW50ZkFkYXB0ZXItPnNCdWxrT3V0LmJ1bGtfb3V0X2VuZHBvaW50QWRkciA9Ci0JCQkJCQkJCQkJZW5kcG9pbnQtPmJFbmRwb2ludEFkZHJlc3M7Ci0JICAgIAkJcHNJbnRmQWRhcHRlci0+c0J1bGtPdXQuYnVsa19vdXRfcGlwZSA9Ci0JCQkJdXNiX3NuZGludHBpcGUocHNJbnRmQWRhcHRlci0+dWRldiwKLQkJCQkJcHNJbnRmQWRhcHRlci0+c0J1bGtPdXQuYnVsa19vdXRfZW5kcG9pbnRBZGRyKTsKLSAgICAgICAgICAJICAJcHNJbnRmQWRhcHRlci0+c0J1bGtPdXQuaW50X291dF9pbnRlcnZhbCA9IGVuZHBvaW50LT5iSW50ZXJ2YWw7Ci0KKwkJCWlmICghcHNJbnRmQWRhcHRlci0+c0ludHJJbi5pbnRfaW5fYnVmZmVyKSB7CisJCQkJZGV2X2VycigmcHNJbnRmQWRhcHRlci0+dWRldi0+ZGV2LAorCQkJCQkiY291bGQgbm90IGFsbG9jYXRlIGludGVycnVwdF9pbl9idWZmZXJcbiIpOworCQkJCXJldHVybiAtRUlOVkFMOwogCQkJfQotCQkJZWxzZSBpZih2YWx1ZSA9PSBFUDYpCi0JCQl7Ci0JICAgICAgICAgICAgYnVmZmVyX3NpemUgPSBsZTE2X3RvX2NwdShlbmRwb2ludC0+d01heFBhY2tldFNpemUpOwotCSAgICAgICAgICAgIHBzSW50ZkFkYXB0ZXItPnNJbnRyT3V0LmludF9vdXRfc2l6ZSA9IGJ1ZmZlcl9zaXplOwotCSAgICAgICAgICAgIHBzSW50ZkFkYXB0ZXItPnNJbnRyT3V0LmludF9vdXRfZW5kcG9pbnRBZGRyID0KLQkJCQkJCQkJCQllbmRwb2ludC0+YkVuZHBvaW50QWRkcmVzczsKLQkgICAgICAgICAgICBwc0ludGZBZGFwdGVyLT5zSW50ck91dC5pbnRfb3V0X2ludGVydmFsID0gZW5kcG9pbnQtPmJJbnRlcnZhbDsKLQkgICAgICAgICAgICBwc0ludGZBZGFwdGVyLT5zSW50ck91dC5pbnRfb3V0X2J1ZmZlcj0ga21hbGxvYyhidWZmZXJfc2l6ZSwKLQkJCQkJCQkJCQkJCQkJR0ZQX0tFUk5FTCk7Ci0JICAgICAgICAgICAgCWlmICghcHNJbnRmQWRhcHRlci0+c0ludHJPdXQuaW50X291dF9idWZmZXIpCi0JCQkJCXsKLQkgICAgICAgICAgICAgICAgQkNNX0RFQlVHX1BSSU5UKHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlcixEQkdfVFlQRV9JTklURVhJVCwgRFJWX0VOVFJZLCBEQkdfTFZMX0FMTCwgIkNvdWxkIG5vdCBhbGxvY2F0ZSBpbnRlcnJ1cHRfb3V0X2J1ZmZlciIpOwotCSAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KKwkJfQorCisJCWlmICghcHNJbnRmQWRhcHRlci0+c0ludHJPdXQuaW50X291dF9lbmRwb2ludEFkZHIgJiYgYmNtX3VzYl9lbmRwb2ludF9pc19pbnRfb3V0KGVuZHBvaW50KSkgeworCQkJaWYgKCFwc0ludGZBZGFwdGVyLT5zQnVsa091dC5idWxrX291dF9lbmRwb2ludEFkZHIgJiYKKwkJCQkocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLT5jaGlwX2lkID09IFQzQikgJiYgKHZhbHVlID09IHVzZWRJbnRPdXRGb3JCdWxrVHJhbnNmZXIpKSB7CisJCQkJLyogdXNlIGZpcnN0IGludG91dCBlbmQgcG9pbnQgYXMgYSBidWxrIG91dCBlbmQgcG9pbnQgKi8KKwkJCQlidWZmZXJfc2l6ZSA9IGxlMTZfdG9fY3B1KGVuZHBvaW50LT53TWF4UGFja2V0U2l6ZSk7CisJCQkJcHNJbnRmQWRhcHRlci0+c0J1bGtPdXQuYnVsa19vdXRfc2l6ZSA9IGJ1ZmZlcl9zaXplOworCQkJCXBzSW50ZkFkYXB0ZXItPnNCdWxrT3V0LmJ1bGtfb3V0X2VuZHBvaW50QWRkciA9IGVuZHBvaW50LT5iRW5kcG9pbnRBZGRyZXNzOworCQkJCXBzSW50ZkFkYXB0ZXItPnNCdWxrT3V0LmJ1bGtfb3V0X3BpcGUgPSB1c2Jfc25kaW50cGlwZShwc0ludGZBZGFwdGVyLT51ZGV2LAorCQkJCQkJCQkJcHNJbnRmQWRhcHRlci0+c0J1bGtPdXQuYnVsa19vdXRfZW5kcG9pbnRBZGRyKTsKKwkJCQlwc0ludGZBZGFwdGVyLT5zQnVsa091dC5pbnRfb3V0X2ludGVydmFsID0gZW5kcG9pbnQtPmJJbnRlcnZhbDsKKwkJCX0gZWxzZSBpZiAodmFsdWUgPT0gRVA2KSB7CisJCQkJYnVmZmVyX3NpemUgPSBsZTE2X3RvX2NwdShlbmRwb2ludC0+d01heFBhY2tldFNpemUpOworCQkJCXBzSW50ZkFkYXB0ZXItPnNJbnRyT3V0LmludF9vdXRfc2l6ZSA9IGJ1ZmZlcl9zaXplOworCQkJCXBzSW50ZkFkYXB0ZXItPnNJbnRyT3V0LmludF9vdXRfZW5kcG9pbnRBZGRyID0gZW5kcG9pbnQtPmJFbmRwb2ludEFkZHJlc3M7CisJCQkJcHNJbnRmQWRhcHRlci0+c0ludHJPdXQuaW50X291dF9pbnRlcnZhbCA9IGVuZHBvaW50LT5iSW50ZXJ2YWw7CisJCQkJcHNJbnRmQWRhcHRlci0+c0ludHJPdXQuaW50X291dF9idWZmZXI9IGttYWxsb2MoYnVmZmVyX3NpemUsIEdGUF9LRVJORUwpOworCQkJCWlmICghcHNJbnRmQWRhcHRlci0+c0ludHJPdXQuaW50X291dF9idWZmZXIpIHsKKwkJCQkJZGV2X2VycigmcHNJbnRmQWRhcHRlci0+dWRldi0+ZGV2LAorCQkJCQkJImNvdWxkIG5vdCBhbGxvY2F0ZSBpbnRlcnJ1cHRfb3V0X2J1ZmZlclxuIik7CisJCQkJCXJldHVybiAtRUlOVkFMOworCQkJCX0KKwkJCX0KKwkJfQogCX0KLSAgICB1c2Jfc2V0X2ludGZkYXRhKHBzSW50ZkFkYXB0ZXItPmludGVyZmFjZSwgcHNJbnRmQWRhcHRlcik7Ci0gICAgcmV0dmFsID0gdXNiX3JlZ2lzdGVyX2Rldihwc0ludGZBZGFwdGVyLT5pbnRlcmZhY2UsICZ1c2JiY21fY2xhc3MpOwotCWlmKHJldHZhbCkKLQl7Ci0JCUJDTV9ERUJVR19QUklOVChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAidXNiIHJlZ2lzdGVyIGRldiBmYWlsZWQgPSAlZCIsIHJldHZhbCk7Ci0JCXBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlci0+YlVzYkNsYXNzRHJpdmVyUmVnaXN0ZXJlZCA9IEZBTFNFOwotCQlyZXR1cm4gcmV0dmFsOwotCX0KLQllbHNlCi0JewotCQlwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXItPmJVc2JDbGFzc0RyaXZlclJlZ2lzdGVyZWQgPSBUUlVFOwotCQlCQ01fREVCVUdfUFJJTlQocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwgInVzYiBkZXYgcmVnaXN0ZXJlZCIpOwotCX0KKworCXVzYl9zZXRfaW50ZmRhdGEocHNJbnRmQWRhcHRlci0+aW50ZXJmYWNlLCBwc0ludGZBZGFwdGVyKTsKIAogCXBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlci0+YmNtX2ZpbGVfZG93bmxvYWQgPSBJbnRlcmZhY2VGaWxlRG93bmxvYWQ7CiAJcHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLT5iY21fZmlsZV9yZWFkYmFja19mcm9tX2NoaXAgPQpAQCAtNzQ0LDY3ICs1OTgsNTEgQEAKIAogCXJldHZhbCA9IENyZWF0ZUludGVycnVwdFVyYihwc0ludGZBZGFwdGVyKTsKIAotCWlmKHJldHZhbCkKLQl7Ci0JCUJDTV9ERUJVR19QUklOVChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiQ2Fubm90IGNyZWF0ZSBpbnRlcnJ1cHQgdXJiIik7CisJaWYgKHJldHZhbCkgeworCQlCQ01fREVCVUdfUFJJTlQocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsCisJCQkiQ2Fubm90IGNyZWF0ZSBpbnRlcnJ1cHQgdXJiXG4iKTsKIAkJcmV0dXJuIHJldHZhbDsKIAl9CiAKIAlyZXR2YWwgPSBBbGxvY1VzYkNiKHBzSW50ZkFkYXB0ZXIpOwotCWlmKHJldHZhbCkKLQl7CisJaWYgKHJldHZhbCkKIAkJcmV0dXJuIHJldHZhbDsKLQl9CiAKLQotCXJldHZhbCA9IGRldmljZV9ydW4ocHNJbnRmQWRhcHRlcik7Ci0JaWYocmV0dmFsKQotCXsKLQkJcmV0dXJuIHJldHZhbDsKLQl9Ci0KLQotCXJldHVybiAwOworCXJldHVybiBkZXZpY2VfcnVuKHBzSW50ZkFkYXB0ZXIpOwogfQogCi1zdGF0aWMgaW50IEludGVyZmFjZVN1c3BlbmQgKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLCBwbV9tZXNzYWdlX3QgbWVzc2FnZSkKK3N0YXRpYyBpbnQgSW50ZXJmYWNlU3VzcGVuZChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwgcG1fbWVzc2FnZV90IG1lc3NhZ2UpCiB7CiAJUFNfSU5URVJGQUNFX0FEQVBURVIgIHBzSW50ZkFkYXB0ZXIgPSB1c2JfZ2V0X2ludGZkYXRhKGludGYpOwotCUJDTV9ERUJVR19QUklOVChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIsREJHX1RZUEVfSU5JVEVYSVQsIERSVl9FTlRSWSwgREJHX0xWTF9BTEwsICI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIpOwotCS8vQmNtX2tpbGxfYWxsX1VSQnMocHNJbnRmQWRhcHRlcik7CisKIAlwc0ludGZBZGFwdGVyLT5iU3VzcGVuZGVkID0gVFJVRTsKIAotCWlmKFRSVUUgPT0gcHNJbnRmQWRhcHRlci0+YlByZXBhcmluZ0ZvckJ1c1N1c3BlbmQpCi0JeworCWlmIChUUlVFID09IHBzSW50ZkFkYXB0ZXItPmJQcmVwYXJpbmdGb3JCdXNTdXNwZW5kKSB7CiAJCXBzSW50ZkFkYXB0ZXItPmJQcmVwYXJpbmdGb3JCdXNTdXNwZW5kID0gRkFMU0U7CiAKLQkJaWYocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLT5MaW5rU3RhdHVzID09IExJTktVUF9ET05FKQotCQl7CisJCWlmIChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXItPkxpbmtTdGF0dXMgPT0gTElOS1VQX0RPTkUpIHsKIAkJCXBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlci0+SWRsZU1vZGUgPSBUUlVFIDsKLQkJCUJDTV9ERUJVR19QUklOVChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIsREJHX1RZUEVfSU5JVEVYSVQsIERSVl9FTlRSWSwgREJHX0xWTF9BTEwsICJIb3N0IEVudGVyZWQgaW4gUE1VIElkbGUgTW9kZS4uIik7Ci0JCX0KLQkJZWxzZQotCQl7CisJCQlCQ01fREVCVUdfUFJJTlQocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLCBEQkdfVFlQRV9JTklURVhJVCwgRFJWX0VOVFJZLCBEQkdfTFZMX0FMTCwKKwkJCQkiSG9zdCBFbnRlcmVkIGluIFBNVSBJZGxlIE1vZGUuXG4iKTsKKwkJfSBlbHNlIHsKIAkJCXBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlci0+YlNodXRTdGF0dXMgPSBUUlVFOwotCQkJQkNNX0RFQlVHX1BSSU5UKHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlcixEQkdfVFlQRV9JTklURVhJVCwgRFJWX0VOVFJZLCBEQkdfTFZMX0FMTCwgIkhvc3QgRW50ZXJlZCBpbiBQTVUgU2h1dGRvd24gTW9kZS4uIik7CisJCQlCQ01fREVCVUdfUFJJTlQocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLCBEQkdfVFlQRV9JTklURVhJVCwgRFJWX0VOVFJZLCBEQkdfTFZMX0FMTCwKKwkJCQkiSG9zdCBFbnRlcmVkIGluIFBNVSBTaHV0ZG93biBNb2RlLlxuIik7CiAJCX0KIAl9CiAJcHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLT5iUHJlcGFyaW5nRm9yTG93UG93ZXJNb2RlID0gRkFMU0U7CiAKLQkvL1NpZ25hbGluZyB0aGUgY29udHJvbCBwa3QgcGF0aAorCS8qIFNpZ25hbGluZyB0aGUgY29udHJvbCBwa3QgcGF0aCAqLwogCXdha2VfdXAoJnBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlci0+bG93cG93ZXJfbW9kZV93YWl0X3F1ZXVlKTsKIAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IEludGVyZmFjZVJlc3VtZSAoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCitzdGF0aWMgaW50IEludGVyZmFjZVJlc3VtZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKIHsKLSAgICBQU19JTlRFUkZBQ0VfQURBUFRFUiAgcHNJbnRmQWRhcHRlciA9IHVzYl9nZXRfaW50ZmRhdGEoaW50Zik7Ci0JcHJpbnRrKCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIpOworCVBTX0lOVEVSRkFDRV9BREFQVEVSICBwc0ludGZBZGFwdGVyID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsKIAltZGVsYXkoMTAwKTsKLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLCA2LCAzMikKLSAJaW50Zi0+cG1fdXNhZ2VfY250ID0xIDsKLSNlbmRpZgorCiAJcHNJbnRmQWRhcHRlci0+YlN1c3BlbmRlZCA9IEZBTFNFOwogCiAJU3RhcnRJbnRlcnJ1cHRVcmIocHNJbnRmQWRhcHRlcik7CkBAIC04MTIsNTcgKzY1MCw0MSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IEludGVyZmFjZVByZVJlc2V0KHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQotewotICAgIHByaW50aygiPT09PT09PT09PT09PT09PT09PT0+Iik7Ci0JcmV0dXJuIFNUQVRVU19TVUNDRVNTOwotfQotCi1zdGF0aWMgaW50IEludGVyZmFjZVBvc3RSZXNldChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKLXsKLSAgICBwcmludGsoIkRvIFBvc3QgY2hpcCByZXNldCBzZXR0aW5nIGhlcmUgaWYgaXQgaXMgcmVxdWlyZWQiKTsKLSAgIAlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7Ci19CiBzdGF0aWMgc3RydWN0IHVzYl9kcml2ZXIgdXNiYmNtX2RyaXZlciA9IHsKLSAgICAubmFtZSA9ICJ1c2JiY20iLAotICAgIC5wcm9iZSA9IHVzYmJjbV9kZXZpY2VfcHJvYmUsCi0gICAgLmRpc2Nvbm5lY3QgPSB1c2JiY21fZGlzY29ubmVjdCwKLSAgICAuc3VzcGVuZCA9IEludGVyZmFjZVN1c3BlbmQsCi0gICAgLnJlc3VtZSA9IEludGVyZmFjZVJlc3VtZSwKLQkucHJlX3Jlc2V0PUludGVyZmFjZVByZVJlc2V0LAotCS5wb3N0X3Jlc2V0PUludGVyZmFjZVBvc3RSZXNldCwKLSAgICAuaWRfdGFibGUgPSBJbnRlcmZhY2VVc2J0YWJsZSwKLSAgICAuc3VwcG9ydHNfYXV0b3N1c3BlbmQgPSAxLAorCS5uYW1lID0gInVzYmJjbSIsCisJLnByb2JlID0gdXNiYmNtX2RldmljZV9wcm9iZSwKKwkuZGlzY29ubmVjdCA9IHVzYmJjbV9kaXNjb25uZWN0LAorCS5zdXNwZW5kID0gSW50ZXJmYWNlU3VzcGVuZCwKKwkucmVzdW1lID0gSW50ZXJmYWNlUmVzdW1lLAorCS5pZF90YWJsZSA9IEludGVyZmFjZVVzYnRhYmxlLAorCS5zdXBwb3J0c19hdXRvc3VzcGVuZCA9IDEsCiB9OwogCitzdHJ1Y3QgY2xhc3MgKmJjbV9jbGFzczsKIAotLyoKLUZ1bmN0aW9uOgkJCQlJbnRlcmZhY2VJbml0aWFsaXplCi0KLURlc2NyaXB0aW9uOgkJCVRoaXMgaXMgdGhlIGhhcmR3YXJlIHNwZWNpZmljIGluaXRpYWxpemF0aW9uIEZ1bmN0aW9uLgotCQkJCQkJUmVnaXN0ZXJpbmcgdGhlIGRyaXZlciB3aXRoIE5ESVMgLCBvdGhlciBkZXZpY2Ugc3BlY2lmaWMgTkRJUwotCQkJCQkJYW5kIGhhcmR3YXJlIGluaXRpYWxpemF0aW9ucyBhcmUgZG9uZSBoZXJlLgotCi1JbnB1dCBwYXJhbWV0ZXJzOgkJSU4gUE1JTklfQURBUFRFUiBBZGFwdGVyICAgLSBNaW5pcG9ydCBBZGFwdGVyIENvbnRleHQKLQotCi1SZXR1cm46CQkJCQlCQ01fU1RBVFVTX1NVQ0NFU1MgLSBJZiBJbml0aWFsaXphdGlvbiBvZiB0aGUKLQkJCQkJCUhXIEludGVyZmFjZSB3YXMgc3VjY2Vzc2Z1bC4KLQkJCQkJCU90aGVyICAgICAgICAgICAtIElmIGFuIGVycm9yIG9jY3VyZWQuCi0qLwotSU5UIEludGVyZmFjZUluaXRpYWxpemUodm9pZCkKK3N0YXRpYyBfX2luaXQgaW50IGJjbV9pbml0KHZvaWQpCiB7Ci0vLwlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9JTklURVhJVCwgRFJWX0VOVFJZLCBEQkdfTFZMX0FMTCwgIlJlZ2lzdGVyaW5nIFVzYiBkcml2ZXIhISIpOworCXByaW50ayhLRVJOX0lORk8gIiVzOiAlcywgJXNcbiIsIERSVl9OQU1FLCBEUlZfREVTQ1JJUFRJT04sIERSVl9WRVJTSU9OKTsKKwlwcmludGsoS0VSTl9JTkZPICIlc1xuIiwgRFJWX0NPUFlSSUdIVCk7CisKKwliY21fY2xhc3MgPSBjbGFzc19jcmVhdGUoVEhJU19NT0RVTEUsIERSVl9OQU1FKTsKKwlpZiAoSVNfRVJSKGJjbV9jbGFzcykpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIERSVl9OQU1FICI6IGNvdWxkIG5vdCBjcmVhdGUgY2xhc3NcbiIpOworCQlyZXR1cm4gUFRSX0VSUihiY21fY2xhc3MpOworCX0KKwogCXJldHVybiB1c2JfcmVnaXN0ZXIoJnVzYmJjbV9kcml2ZXIpOwogfQogCi1JTlQgSW50ZXJmYWNlRXhpdCh2b2lkKQorc3RhdGljIF9fZXhpdCB2b2lkIGJjbV9leGl0KHZvaWQpCiB7Ci0JLy9QTUlOSV9BREFQVEVSIHBzQWRhcHRlciA9IE5VTEw7Ci0JaW50IHN0YXR1cyA9IDA7Ci0KLQkvL0JDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX0lOSVRFWElULCBEUlZfRU5UUlksIERCR19MVkxfQUxMLCAiRGVyZWdpc3RlcmluZyBVc2IgZHJpdmVyISEiKTsKIAl1c2JfZGVyZWdpc3RlcigmdXNiYmNtX2RyaXZlcik7Ci0JcmV0dXJuIHN0YXR1czsKKwljbGFzc19kZXN0cm95KGJjbV9jbGFzcyk7CiB9Ci1NT0RVTEVfTElDRU5TRSAoIkdQTCIpOworCittb2R1bGVfaW5pdChiY21faW5pdCk7Cittb2R1bGVfZXhpdChiY21fZXhpdCk7CisKK01PRFVMRV9ERVNDUklQVElPTihEUlZfREVTQ1JJUFRJT04pOworTU9EVUxFX1ZFUlNJT04oRFJWX1ZFUlNJT04pOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JjbS9JbnRlcmZhY2VJbml0LmggYi9kcml2ZXJzL3N0YWdpbmcvYmNtL0ludGVyZmFjZUluaXQuaAppbmRleCBlN2E5NmU1Li4wNTgzMTVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYmNtL0ludGVyZmFjZUluaXQuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYmNtL0ludGVyZmFjZUluaXQuaApAQCAtOCw5ICs4LDExIEBACiAjZGVmaW5lIEJDTV9VU0JfUFJPRFVDVF9JRF9UMyAJMHgwMzAwCiAjZGVmaW5lIEJDTV9VU0JfUFJPRFVDVF9JRF9UM0IgCTB4MDIxMAogI2RlZmluZSBCQ01fVVNCX1BST0RVQ1RfSURfVDNMIAkweDAyMjAKKyNkZWZpbmUgQkNNX1VTQl9QUk9EVUNUX0lEX1NNMjUwIAkweGJjY2QKICNkZWZpbmUgQkNNX1VTQl9QUk9EVUNUX0lEX1NZTSAgMHgxNUUKICNkZWZpbmUgQkNNX1VTQl9QUk9EVUNUX0lEXzE5MDEgMHhlMDE3CiAjZGVmaW5lIEJDTV9VU0JfUFJPRFVDVF9JRF8yMjYgIDB4MDEzMgorI2RlZmluZSBCQ01fVVNCX1BST0RVQ1RfSURfWlRFX1RVMjUgMHgwMDA3CiAKICNkZWZpbmUgQkNNX1VTQl9NSU5PUl9CQVNFIAkJMTkyCiAKQEAgLTE5LDMzICsyMSw3IEBACiAKIElOVCBJbnRlcmZhY2VFeGl0KHZvaWQpOwogCi0jaWZuZGVmIEJDTV9TSE1fSU5URVJGQUNFCi1JTlQgSW50ZXJmYWNlQWRhcHRlckluaXQoUFNfSU5URVJGQUNFX0FEQVBURVIgQWRhcHRlcik7Ci0KIElOVCB1c2JiY21fd29ya2VyX3RocmVhZChQU19JTlRFUkZBQ0VfQURBUFRFUiBwc0ludGZBZGFwdGVyKTsKIAotVk9JRCBJbnRlcmZhY2VBZGFwdGVyRnJlZShQU19JTlRFUkZBQ0VfQURBUFRFUiBwc0ludGZBZGFwdGVyKTsKLQotI2Vsc2UKLUlOVCBJbnRlcmZhY2VBZGFwdGVySW5pdChQTUlOSV9BREFQVEVSIEFkYXB0ZXIpOwotI2VuZGlmCi0KLQotI2lmIDAKLQotVUxPTkcgSW50ZXJmYWNlQ2xhaW1BZGFwdGVyKFBNSU5JX0FEQVBURVIgQWRhcHRlcik7Ci0KLVZPSUQgSW50ZXJmYWNlRERSQ29udHJvbGxlckluaXQoUE1JTklfQURBUFRFUiBBZGFwdGVyKTsKLQotVUxPTkcgSW50ZXJmYWNlUmVzZXQoUE1JTklfQURBUFRFUiBBZGFwdGVyKTsKLQotVUxPTkcgSW50ZXJmYWNlUmVnaXN0ZXJSZXNvdXJjZXMoUE1JTklfQURBUFRFUiBBZGFwdGVyKTsKLQotVk9JRCBJbnRlcmZhY2VVblJlZ2lzdGVyUmVzb3VyY2VzKFBNSU5JX0FEQVBURVIgQWRhcHRlcik7Ci0KLVVMT05HIEludGVyZmFjZUZpcm13YXJlRG93bmxvYWQoUE1JTklfQURBUFRFUiBBZGFwdGVyKTsKLQotI2VuZGlmCi0KICNlbmRpZgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmNtL0ludGVyZmFjZUlzci5jIGIvZHJpdmVycy9zdGFnaW5nL2JjbS9JbnRlcmZhY2VJc3IuYwppbmRleCBmOTI4ZmU0Li4yMjBmZjkyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYmNtL0ludGVyZmFjZUlzci5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9iY20vSW50ZXJmYWNlSXNyLmMKQEAgLTEsNiArMSw1IEBACiAjaW5jbHVkZSAiaGVhZGVycy5oIgogCi0jaWZuZGVmIEJDTV9TSE1fSU5URVJGQUNFCiAKIHN0YXRpYyB2b2lkIHJlYWRfaW50X2NhbGxiYWNrKHN0cnVjdCB1cmIgKnVyYi8qLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyovKQogewpAQCAtOCw2ICs3LDEwIEBACiAJUFNfSU5URVJGQUNFX0FEQVBURVIgcHNJbnRmQWRhcHRlciA9IChQU19JTlRFUkZBQ0VfQURBUFRFUil1cmItPmNvbnRleHQ7CiAJUE1JTklfQURBUFRFUiBBZGFwdGVyID0gcHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyIDsKIAorCWlmIChuZXRpZl9tc2dfaW50cihBZGFwdGVyKSkKKwkJcHJfaW5mbyhQRlggIiVzOiBpbnRlcnJ1cHQgc3RhdHVzICVkXG4iLAorCQkJQWRhcHRlci0+ZGV2LT5uYW1lLCBzdGF0dXMpOworCiAJaWYoQWRhcHRlci0+ZGV2aWNlX3JlbW92ZWQgPT0gVFJVRSkKIAl7CiAJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX09USEVSUywgSU5URl9JTklULCBEQkdfTFZMX0FMTCwiRGV2aWNlIGhhcyBHb3QgUmVtb3ZlZC4iKTsKQEAgLTg3LDcgKzkwLDcgQEAKIAkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIElOVEZfSU5JVCwgREJHX0xWTF9BTEwsIkludGVycnVwdCBJTiBlbmRQb2ludCAgaGFzIGdvdCBoYWx0ZWQvc3RhbGxlZC4uLm5lZWQgdG8gY2xlYXIgdGhpcyIpOwogCQkJCUFkYXB0ZXItPmJFbmRQb2ludEhhbHRlZCA9IFRSVUUgOwogCQkJCXdha2VfdXAoJkFkYXB0ZXItPnR4X3BhY2tldF93YWl0X3F1ZXVlKTsKLQkJCQl1cmItPnN0YXR1cyA9IFNUQVRVU19TVUNDRVNTIDs7CisJCQkJdXJiLT5zdGF0dXMgPSBTVEFUVVNfU1VDQ0VTUyA7CiAJCQkJcmV0dXJuOwogCQl9CiAJICAgIC8qIHNvZnR3YXJlLWRyaXZlbiBpbnRlcmZhY2Ugc2h1dGRvd24gKi8KQEAgLTE2NCw0MCArMTY3LDMgQEAKIAlyZXR1cm4gc3RhdHVzOwogfQogCi0vKgotRnVuY3Rpb246CQkJCUludGVyZmFjZUVuYWJsZUludGVycnVwdAotCi1EZXNjcmlwdGlvbjoJCQlUaGlzIGlzIHRoZSBoYXJkd2FyZSBzcGVjaWZpYyBGdW5jdGlvbiBmb3IgY29uZmlndXJpbmcKLQkJCQkJCWFuZCBlbmFibGluZyB0aGUgaW50ZXJydXB0cyBvbiB0aGUgZGV2aWNlLgotCi1JbnB1dCBwYXJhbWV0ZXJzOgkJSU4gUE1JTklfQURBUFRFUiBBZGFwdGVyICAgLSBNaW5pcG9ydCBBZGFwdGVyIENvbnRleHQKLQotCi1SZXR1cm46CQkJCUJDTV9TVEFUVVNfU1VDQ0VTUyAtIElmIGNvbmZpZ3VyaW5nIHRoZSBpbnRlcnJ1cHRzIHdhcyBzdWNjZXNzZnVsLgotCQkJCQkJT3RoZXIgICAgICAgICAgIC0gSWYgYW4gZXJyb3Igb2NjdXJlZC4KLSovCi0KLXZvaWQgSW50ZXJmYWNlRW5hYmxlSW50ZXJydXB0KFBNSU5JX0FEQVBURVIgQWRhcHRlcikKLXsKLQotfQotCi0vKgotRnVuY3Rpb246CQkJCUludGVyZmFjZURpc2FibGVJbnRlcnJ1cHQKLQotRGVzY3JpcHRpb246CQkJVGhpcyBpcyB0aGUgaGFyZHdhcmUgc3BlY2lmaWMgRnVuY3Rpb24gZm9yIGRpc2FibGluZyB0aGUgaW50ZXJydXB0cyBvbiB0aGUgZGV2aWNlLgotCi1JbnB1dCBwYXJhbWV0ZXJzOgkJSU4gUE1JTklfQURBUFRFUiBBZGFwdGVyICAgLSBNaW5pcG9ydCBBZGFwdGVyIENvbnRleHQKLQotCi1SZXR1cm46CQkJCUJDTV9TVEFUVVNfU1VDQ0VTUyAtIElmIGRpc2FibGluZyB0aGUgaW50ZXJydXB0cyB3YXMgc3VjY2Vzc2Z1bC4KLQkJCQkJCU90aGVyICAgICAgICAgICAtIElmIGFuIGVycm9yIG9jY3VyZWQuCi0qLwotCi12b2lkIEludGVyZmFjZURpc2FibGVJbnRlcnJ1cHQoUE1JTklfQURBUFRFUiBBZGFwdGVyKQotewotCi19Ci0KLSNlbmRpZgotCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmNtL0ludGVyZmFjZU1pc2MuYyBiL2RyaXZlcnMvc3RhZ2luZy9iY20vSW50ZXJmYWNlTWlzYy5jCmluZGV4IDhmYzg5M2IuLmE1MTE4NWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9iY20vSW50ZXJmYWNlTWlzYy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9iY20vSW50ZXJmYWNlTWlzYy5jCkBAIC0xLDE3ICsxLDUgQEAKICNpbmNsdWRlICJoZWFkZXJzLmgiCiAKLSNpZm5kZWYgQkNNX1NITV9JTlRFUkZBQ0UKLQotUFNfSU5URVJGQUNFX0FEQVBURVIKLUludGVyZmFjZUFkYXB0ZXJHZXQoUE1JTklfQURBUFRFUiBwc0FkYXB0ZXIpCi17Ci0JaWYocHNBZGFwdGVyID09IE5VTEwpCi0JewotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIChQU19JTlRFUkZBQ0VfQURBUFRFUikocHNBZGFwdGVyLT5wdkludGVyZmFjZUFkYXB0ZXIpOwotfQotCiBJTlQKIEludGVyZmFjZVJETShQU19JTlRFUkZBQ0VfQURBUFRFUiBwc0ludGZBZGFwdGVyLAogICAgICAgICAgICAgVUlOVCBhZGRyLApAQCAtMTAyLDcgKzkwLDcgQEAKIAlpZigocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLT5TdG9wQWxsWGFjdGlvbiA9PSBUUlVFKSAmJiAocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLT5jaGlwX2lkID49IFQzTFBCKSkKIAl7CiAJCUJDTV9ERUJVR19QUklOVChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBXUk0sIERCR19MVkxfQUxMLCJDdXJyZW50bHkgWGFjdGlvbiBpcyBub3QgYWxsb3dlZCBvbiB0aGUgYnVzLi4uIik7Ci0JCXJldHVybiBFQUNDRVM7CisJCXJldHVybiAtRUFDQ0VTOwogCX0KIAogCWlmKHBzSW50ZkFkYXB0ZXItPmJTdXNwZW5kZWQgPT1UUlVFIHx8IHBzSW50ZkFkYXB0ZXItPmJQcmVwYXJpbmdGb3JCdXNTdXNwZW5kID09IFRSVUUpCkBAIC0yMzYsOSArMjI0LDcgQEAKIAl9CiAKIAkvKiBDYW5jZWwgQWxsIHN1Ym1pdHRlZCBUWCBVUkIncyAqLwotCUJDTV9ERUJVR19QUklOVChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiQ2FuY2VsbGluZyBBbGwgU3VibWl0dGVkIFRYIFVyYnMgXG4iKTsKLQotICAgIGZvcihpID0gMDsgaSA8IE1BWElNVU1fVVNCX1RDQjsgaSsrKQorCWZvcihpID0gMDsgaSA8IE1BWElNVU1fVVNCX1RDQjsgaSsrKQogCXsKIAkJdGVtcFVyYiA9IHBzSW50ZkFkYXB0ZXItPmFzVXNiVGNiW2ldLnVyYjsKIAkJaWYodGVtcFVyYikKQEAgLTI0OCw5ICsyMzQsNiBAQAogCQl9CiAJfQogCi0KLSAgICBCQ01fREVCVUdfUFJJTlQocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwgIkNhbmNlbGxpbmcgQWxsIHN1Ym1pdHRlZCBSeCBVcmJzIFxuIik7Ci0KIAlmb3IoaSA9IDA7IGkgPCBNQVhJTVVNX1VTQl9SQ0I7IGkrKykKIAl7CiAJCXRlbXBVcmIgPSBwc0ludGZBZGFwdGVyLT5hc1VzYlJjYltpXS51cmI7CkBAIC0yNjEsMTYgKzI0NCwxMSBAQAogCQl9CiAJfQogCi0KIAlhdG9taWNfc2V0KCZwc0ludGZBZGFwdGVyLT51TnVtVGNiVXNlZCwgMCk7CiAJYXRvbWljX3NldCgmcHNJbnRmQWRhcHRlci0+dUN1cnJUY2IsIDApOwogCiAJYXRvbWljX3NldCgmcHNJbnRmQWRhcHRlci0+dU51bVJjYlVzZWQsIDApOwogCWF0b21pY19zZXQoJnBzSW50ZkFkYXB0ZXItPnVDdXJyUmNiLCAwKTsKLQotCUJDTV9ERUJVR19QUklOVChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiVENCOiB1c2VkLSAlZCBjdXItJWRcbiIsIGF0b21pY19yZWFkKCZwc0ludGZBZGFwdGVyLT51TnVtVGNiVXNlZCksIGF0b21pY19yZWFkKCZwc0ludGZBZGFwdGVyLT51Q3VyclRjYikpOwotCUJDTV9ERUJVR19QUklOVChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiUkNCOiB1c2VkLSAlZCBjdXItJWRcbiIsIGF0b21pY19yZWFkKCZwc0ludGZBZGFwdGVyLT51TnVtUmNiVXNlZCksIGF0b21pY19yZWFkKCZwc0ludGZBZGFwdGVyLT51Q3VyclJjYikpOwotCiB9CiAKIFZPSUQgcHV0VXNiU3VzcGVuZChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCkBAIC0yODIsOSArMjYwLDYgQEAKIAogCWlmKHBzSW50ZkFkYXB0ZXItPmJTdXNwZW5kZWQgPT0gRkFMU0UpCiAJCXVzYl9hdXRvcG1fcHV0X2ludGVyZmFjZShpbnRmKTsKLQllbHNlCi0JCUJDTV9ERUJVR19QUklOVChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIsREJHX1RZUEVfVFgsIE5FWFRfU0VORCwgREJHX0xWTF9BTEwsICJJbnRlcmZhY2UgUmVzdW1lZCBDb21wbGV0ZWx5XG4iKTsKIAogfQogCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iY20vSW50ZXJmYWNlTWlzYy5oIGIvZHJpdmVycy9zdGFnaW5nL2JjbS9JbnRlcmZhY2VNaXNjLmgKaW5kZXggNzRjODFkNC4uNmM5ZTM5YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JjbS9JbnRlcmZhY2VNaXNjLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JjbS9JbnRlcmZhY2VNaXNjLmgKQEAgLTEsOSArMSw2IEBACiAjaWZuZGVmIF9fSU5URVJGQUNFX01JU0NfSAogI2RlZmluZSBfX0lOVEVSRkFDRV9NSVNDX0gKIAotUFNfSU5URVJGQUNFX0FEQVBURVIKLUludGVyZmFjZUFkYXB0ZXJHZXQoUE1JTklfQURBUFRFUiBwc0FkYXB0ZXIpOwotCiBJTlQKIEludGVyZmFjZVJETShQU19JTlRFUkZBQ0VfQURBUFRFUiBwc0ludGZBZGFwdGVyLAogCQkJVUlOVCBhZGRyLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JjbS9JbnRlcmZhY2VSeC5jIGIvZHJpdmVycy9zdGFnaW5nL2JjbS9JbnRlcmZhY2VSeC5jCmluZGV4IDZmZWU5NjguLjUzM2Y4ZWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9iY20vSW50ZXJmYWNlUnguYworKysgYi9kcml2ZXJzL3N0YWdpbmcvYmNtL0ludGVyZmFjZVJ4LmMKQEAgLTEsNSArMSwxNSBAQAogI2luY2x1ZGUgImhlYWRlcnMuaCIKLWV4dGVybiBpbnQgU2VhcmNoVmNpZChQTUlOSV9BREFQVEVSICwgdW5zaWduZWQgc2hvcnQpOworCitzdGF0aWMgaW50IFNlYXJjaFZjaWQoUE1JTklfQURBUFRFUiBBZGFwdGVyLHVuc2lnbmVkIHNob3J0IHVzVmNpZCkKK3sKKwlpbnQgaUluZGV4PTA7CisKKwlmb3IoaUluZGV4PShOT19PRl9RVUVVRVMtMSk7aUluZGV4Pj0wO2lJbmRleC0tKQorCQlpZihBZGFwdGVyLT5QYWNrSW5mb1tpSW5kZXhdLnVzVkNJRF9WYWx1ZSA9PSB1c1ZjaWQpCisJCQlyZXR1cm4gaUluZGV4OworCXJldHVybiBOT19PRl9RVUVVRVMrMTsKKworfQogCiAKIHN0YXRpYyBQVVNCX1JDQgpAQCAtMzgsMTMgKzQ4LDkgQEAKIAlQTUlOSV9BREFQVEVSIEFkYXB0ZXIgPSBwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXI7CiAJUExFQURFUiBwTGVhZGVyID0gdXJiLT50cmFuc2Zlcl9idWZmZXI7CiAKLQotCSNpZiAwCi0JaW50ICpwdWlCdWZmZXIgPSBOVUxMOwotCXN0cnVjdCB0aW1ldmFsIHR2OwotCW1lbXNldCgmdHYsIDAsIHNpemVvZih0dikpOwotCWRvX2dldHRpbWVvZmRheSgmdHYpOwotCSNlbmRpZgorCWlmICh1bmxpa2VseShuZXRpZl9tc2dfcnhfc3RhdHVzKEFkYXB0ZXIpKSkKKwkJcHJfaW5mbyhQRlggIiVzOiByeCB1cmIgc3RhdHVzICVkIGxlbmd0aCAlZFxuIiwKKwkJCUFkYXB0ZXItPmRldi0+bmFtZSwgdXJiLT5zdGF0dXMsIHVyYi0+YWN0dWFsX2xlbmd0aCk7CiAKIAlpZigoQWRhcHRlci0+ZGV2aWNlX3JlbW92ZWQgPT0gVFJVRSkgIHx8CiAJCShUUlVFID09IEFkYXB0ZXItPmJFbmRQb2ludEhhbHRlZCkgfHwKQEAgLTg5LDEwICs5NSwxMCBAQAogCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1JYLCBSWF9EUEMsIERCR19MVkxfQUxMLCAiTGVhZGVyIFN0YXR1czoweCVoWCwgTGVuZ3RoOjB4JWhYLCBWQ0lEOjB4JWhYIiwgcExlYWRlci0+U3RhdHVzLHBMZWFkZXItPlBMZW5ndGgscExlYWRlci0+VmNpZCk7CiAJaWYoTUFYX0NOVExfUEtUX1NJWkUgPCBwTGVhZGVyLT5QTGVuZ3RoKQogCXsKLQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiQ29ycnVwdGVkIGxlYWRlciBsZW5ndGguLi4lZFxuIiwKLQkJCQkJcExlYWRlci0+UExlbmd0aCk7Ci0JCWF0b21pY19pbmMoJkFkYXB0ZXItPlJ4UGFja2V0RHJvcHBlZENvdW50KTsKLQkJYXRvbWljX2FkZChwTGVhZGVyLT5QTGVuZ3RoLCAmQWRhcHRlci0+QmFkUnhCeXRlQ291bnQpOworCQlpZiAobmV0aWZfbXNnX3J4X2VycihBZGFwdGVyKSkKKwkJCXByX2luZm8oUEZYICIlczogY29ycnVwdGVkIGxlYWRlciBsZW5ndGguLi4lZFxuIiwKKwkJCQlBZGFwdGVyLT5kZXYtPm5hbWUsIHBMZWFkZXItPlBMZW5ndGgpOworCQkrK0FkYXB0ZXItPmRldi0+c3RhdHMucnhfZHJvcHBlZDsKIAkJYXRvbWljX2RlYygmcHNJbnRmQWRhcHRlci0+dU51bVJjYlVzZWQpOwogCQlyZXR1cm47CiAJfQpAQCAtMTQ1LDEwICsxNTEsOSBAQAogCQlza2JfcHV0IChza2IsIHBMZWFkZXItPlBMZW5ndGggKyBFVEhfSExFTik7CiAJCUFkYXB0ZXItPlBhY2tJbmZvW1F1ZXVlSW5kZXhdLnVpVG90YWxSeEJ5dGVzKz1wTGVhZGVyLT5QTGVuZ3RoOwogCQlBZGFwdGVyLT5QYWNrSW5mb1tRdWV1ZUluZGV4XS51aVRoaXNQZXJpb2RSeEJ5dGVzKz0gcExlYWRlci0+UExlbmd0aDsKLQkJYXRvbWljX2FkZChwTGVhZGVyLT5QTGVuZ3RoLCAmQWRhcHRlci0+R29vZFJ4Qnl0ZUNvdW50KTsKICAgICAgICAgQkNNX0RFQlVHX1BSSU5UKHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlcixEQkdfVFlQRV9SWCwgUlhfREFUQSwgREJHX0xWTF9BTEwsICJSZWNpdmVkIERhdGEgcGt0IG9mIGxlbiA6MHglWCIsIHBMZWFkZXItPlBMZW5ndGgpOwogCi0JCWlmKEFkYXB0ZXItPmlmX3VwKQorCQlpZihuZXRpZl9ydW5uaW5nKEFkYXB0ZXItPmRldikpCiAJCXsKIAkJCS8qIE1vdmluZyBhaGVhZCBieSBFVEhfSExFTiB0byB0aGUgZGF0YSBwdHIgYXMgcmVjZWl2ZWQgZnJvbSBGVyAqLwogCQkJc2tiX3B1bGwoc2tiLCBFVEhfSExFTik7CkBAIC0xNzMsOSArMTc4LDEyIEBACiAJCWVsc2UKIAkJewogCQkgICAgQkNNX0RFQlVHX1BSSU5UKHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlcixEQkdfVFlQRV9SWCwgUlhfREFUQSwgREJHX0xWTF9BTEwsICJpL2Ygbm90IHVwIGhhbmNlIGZyZWVpbmcgU0tCLi4uIik7Ci0JCQliY21fa2ZyZWVfc2tiKHNrYik7CisJCQlkZXZfa2ZyZWVfc2tiKHNrYik7CiAJCX0KLQkJYXRvbWljX2luYygmQWRhcHRlci0+R29vZFJ4UGt0Q291bnQpOworCisJCSsrQWRhcHRlci0+ZGV2LT5zdGF0cy5yeF9wYWNrZXRzOworCQlBZGFwdGVyLT5kZXYtPnN0YXRzLnJ4X2J5dGVzICs9IHBMZWFkZXItPlBMZW5ndGg7CisKIAkJZm9yKHVpSW5kZXggPSAwIDsgdWlJbmRleCA8IE1JQlNfTUFYX0hJU1RfRU5UUklFUyA7IHVpSW5kZXgrKykKIAkJewogCQkJaWYoKHBMZWFkZXItPlBMZW5ndGggPD0gTUlCU19QS1RTSVpFSElTVF9SQU5HRSoodWlJbmRleCsxKSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iY20vSW50ZXJmYWNlVHguYyBiL2RyaXZlcnMvc3RhZ2luZy9iY20vSW50ZXJmYWNlVHguYwppbmRleCA3NzFmN2IzLi5hODQyZGU5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYmNtL0ludGVyZmFjZVR4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JjbS9JbnRlcmZhY2VUeC5jCkBAIC0xLDUwICsxLDUgQEAKICNpbmNsdWRlICJoZWFkZXJzLmgiCiAKLSNpZm5kZWYgQkNNX1NITV9JTlRFUkZBQ0UKLQotLyoKLUZ1bmN0aW9uOgkJCQlJbnRlcmZhY2VUeERhdGFQYWNrZXQKLQotRGVzY3JpcHRpb246CQkJVGhpcyBpcyB0aGUgaGFyZHdhcmUgc3BlY2lmaWMgRnVuY3Rpb24gZm9yIFRyYW5zbWl0dGluZwotCQkJCQkJZGF0YSBwYWNrZXQgdG8gdGhlIGRldmljZS4KLQotSW5wdXQgcGFyYW1ldGVyczoJCUlOIFBNSU5JX0FEQVBURVIgQWRhcHRlciAgIC0gTWluaXBvcnQgQWRhcHRlciBDb250ZXh0Ci0JCQkJCQlQVk9JRCBQYWNrZXQJCQkJLSAgUGFja2V0IENvbnRhaW5pbmcgdGhlIGRhdGEgdG8gYmUgdHJhbnNtaXR0ZWQKLQkJCQkJCVVTSE9SVCB1c1ZjaWQJCQkgICAtIFZDSUQgb24gd2hpY2ggZGF0YSBwYWNrZXQgaXMgdG8gYmUgc2VudAotCi0KLVJldHVybjoJCQkJQkNNX1NUQVRVU19TVUNDRVNTIC0gSWYgVHggd2FzIHN1Y2Nlc3NmdWwuCi0JCQkJCQlPdGhlciAgICAgICAgICAgLSBJZiBhbiBlcnJvciBvY2N1cmVkLgotKi8KLQotVUxPTkcgSW50ZXJmYWNlVHhEYXRhUGFja2V0KFBNSU5JX0FEQVBURVIgQWRhcHRlcixQVk9JRCBQYWNrZXQsVVNIT1JUIHVzVmNpZCkKLXsKLQlVTE9ORwlTdGF0dXMgPSAwOwotCXJldHVybiBTdGF0dXM7Ci19Ci0KLS8qCi1GdW5jdGlvbjoJCQkJSW50ZXJmYWNlVHhDb250cm9sUGFja2V0Ci0KLURlc2NyaXB0aW9uOgkJCVRoaXMgaXMgdGhlIGhhcmR3YXJlIHNwZWNpZmljIEZ1bmN0aW9uIGZvciBUcmFuc21pdHRpbmcKLQkJCQkJCWNvbnRyb2wgcGFja2V0IHRvIHRoZSBkZXZpY2UuCi0KLUlucHV0IHBhcmFtZXRlcnM6CQlJTiBQTUlOSV9BREFQVEVSIEFkYXB0ZXIgICAtIE1pbmlwb3J0IEFkYXB0ZXIgQ29udGV4dAotCQkJCQkJUFZPSUQgcHZCdWZmZXIJCQkgICAtIEJ1ZmZlciBjb250YWluZyBjb250cm9sIHBhY2tldAotCQkJCQkJVUlOVCB1aUJ1ZmZlckxlbmd0aAkJICAgLSBCdWZmZXIgTGVuZ3RoCi0KLVJldHVybjoJCQkJQkNNX1NUQVRVU19TVUNDRVNTIC0gSWYgY29udHJvbCBwYWNrZXQgdHJhbnNtaXQgd2FzIHN1Y2Nlc3NmdWwuCi0JCQkJCQlPdGhlciAgICAgICAgICAgLSBJZiBhbiBlcnJvciBvY2N1cmVkLgotKi8KLQotVUxPTkcgSW50ZXJmYWNlVHhDb250cm9sUGFja2V0KFBNSU5JX0FEQVBURVIgQWRhcHRlcixQVk9JRCBwdkJ1ZmZlcixVSU5UIHVpQnVmZmVyTGVuZ3RoKQotewotCVVMT05HCVN0YXR1cyA9IDA7Ci0KLQotCi0JcmV0dXJuIFN0YXR1czsKLX0KIC8qdGhpcyBpcyB0cmFuc21pdCBjYWxsLWJhY2soQlVMSyBPVVQpKi8KIHN0YXRpYyB2b2lkIHdyaXRlX2J1bGtfY2FsbGJhY2soc3RydWN0IHVyYiAqdXJiLyosIHN0cnVjdCBwdF9yZWdzICpyZWdzKi8pCiB7CkBAIC01NCwxMCArOSwxMCBAQAogCVBNSU5JX0FEQVBURVIgcHNBZGFwdGVyID0gcHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyIDsKIAlCT09MRUFOIGJwb3dlckRvd25Nc2cgPSBGQUxTRSA7CiAgICAgUE1JTklfQURBUFRFUiBBZGFwdGVyID0gR0VUX0JDTV9BREFQVEVSKGdibHBuZXRkZXYpOwotI2lmIDAKLQlzdHJ1Y3QgdGltZXZhbCB0djsKLQlVSU5UIHRpbWVfbXMgPSAwOwotI2VuZGlmCisKKyAgICBpZiAodW5saWtlbHkobmV0aWZfbXNnX3R4X2RvbmUoQWRhcHRlcikpKQorCSAgICBwcl9pbmZvKFBGWCAiJXM6IHRyYW5zbWl0IHN0YXR1cyAlZFxuIiwgQWRhcHRlci0+ZGV2LT5uYW1lLCB1cmItPnN0YXR1cyk7CisKIAlpZih1cmItPnN0YXR1cyAhPSBTVEFUVVNfU1VDQ0VTUykKIAl7CiAJCWlmKHVyYi0+c3RhdHVzID09IC1FUElQRSkKQEAgLTc4LDExICszMyw2IEBACiAKIAlpZihUUlVFID09IHBzQWRhcHRlci0+YlByZXBhcmluZ0Zvckxvd1Bvd2VyTW9kZSkKIAl7Ci0JCSNpZiAwCi0JCWRvX2dldHRpbWVvZmRheSgmdHYpOwotCQl0aW1lX21zID0gdHYudHZfc2VjICoxMDAwICsgdHYudHZfdXNlYy8xMDAwOwotCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsICIgJXMgSWRsZSBNb2RlIEFDS19TZW50IGdvdCBmcm9tIGRldmljZSBhdCB0aW1lIDoweCV4IiwgX19GVU5DVElPTl9fLCB0aW1lX21zKTsKLQkJI2VuZGlmCiAKIAkJaWYoKChwQ29udHJvbE1zZy0+c3pEYXRhWzBdID09IEdPX1RPX0lETEVfTU9ERV9QQVlMT0FEKSAmJgogCQkJKHBDb250cm9sTXNnLT5zekRhdGFbMV0gPT0gVEFSR0VUX0NBTl9HT19UT19JRExFX01PREUpKSkKQEAgLTE1MiwxNyArMTAyLDEyIEBACiAJfQogCiBlcnJfZXhpdCA6Ci0jaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiwgNiwgMzUpCi0gCXVzYl9idWZmZXJfZnJlZSh1cmItPmRldiwgdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoLAotIAkJCXVyYi0+dHJhbnNmZXJfYnVmZmVyLCB1cmItPnRyYW5zZmVyX2RtYSk7Ci0jZWxzZQogCXVzYl9mcmVlX2NvaGVyZW50KHVyYi0+ZGV2LCB1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGgsCiAgCQkJdXJiLT50cmFuc2Zlcl9idWZmZXIsIHVyYi0+dHJhbnNmZXJfZG1hKTsKLSNlbmRpZgogfQogCiAKLXN0YXRpYyBfX2lubGluZSBQVVNCX1RDQiBHZXRCdWxrT3V0VGNiKFBTX0lOVEVSRkFDRV9BREFQVEVSIHBzSW50ZkFkYXB0ZXIpCitzdGF0aWMgUFVTQl9UQ0IgR2V0QnVsa091dFRjYihQU19JTlRFUkZBQ0VfQURBUFRFUiBwc0ludGZBZGFwdGVyKQogewogCVBVU0JfVENCIHBUY2IgPSBOVUxMOwogCVVJTlQgaW5kZXggPSAwOwpAQCAtMTgzLDIwICsxMjgsMTQgQEAKIAlyZXR1cm4gcFRjYjsKIH0KIAotc3RhdGljIF9faW5saW5lIGludCBUcmFuc21pdFRjYihQU19JTlRFUkZBQ0VfQURBUFRFUiBwc0ludGZBZGFwdGVyLCBQVVNCX1RDQiBwVGNiLCBQVk9JRCBkYXRhLCBpbnQgbGVuKQorc3RhdGljIGludCBUcmFuc21pdFRjYihQU19JTlRFUkZBQ0VfQURBUFRFUiBwc0ludGZBZGFwdGVyLCBQVVNCX1RDQiBwVGNiLCBQVk9JRCBkYXRhLCBpbnQgbGVuKQogewogCiAJc3RydWN0IHVyYiAqdXJiID0gcFRjYi0+dXJiOwogCWludCByZXR2YWwgPSAwOwogCi0jaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiwgNiwgMzUpCi0gCXVyYi0+dHJhbnNmZXJfYnVmZmVyID0gdXNiX2J1ZmZlcl9hbGxvYyhwc0ludGZBZGFwdGVyLT51ZGV2LCBsZW4sCi0gCQkJCQkJR0ZQX0FUT01JQywgJnVyYi0+dHJhbnNmZXJfZG1hKTsKLSNlbHNlCiAJdXJiLT50cmFuc2Zlcl9idWZmZXIgPSB1c2JfYWxsb2NfY29oZXJlbnQocHNJbnRmQWRhcHRlci0+dWRldiwgbGVuLAogIAkJCQkJCUdGUF9BVE9NSUMsICZ1cmItPnRyYW5zZmVyX2RtYSk7Ci0jZW5kaWYKLQogCWlmICghdXJiLT50cmFuc2Zlcl9idWZmZXIpCiAJewogCQlCQ01fREVCVUdfUFJJTlQocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwgIkVycm9yIGFsbG9jYXRpbmcgbWVtb3J5XG4iKTsKQEAgLTI1NSw1ICsxOTQsNCBAQAogCXJldHVybiBUcmFuc21pdFRjYihwc0ludGZBZGFwdGVyLCBwVGNiLCBkYXRhLCBsZW4pOwogfQogCi0jZW5kaWYKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JjbS9JbnRlcmZhY2VUeC5oIGIvZHJpdmVycy9zdGFnaW5nL2JjbS9JbnRlcmZhY2VUeC5oCmluZGV4IDA1M2Y2MzEuLjI3MzE0NzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9iY20vSW50ZXJmYWNlVHguaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYmNtL0ludGVyZmFjZVR4LmgKQEAgLTMsMTEgKzMsNSBAQAogCiBJTlQgSW50ZXJmYWNlVHJhbnNtaXRQYWNrZXQoUFZPSUQgYXJnLCBQVk9JRCBkYXRhLCBVSU5UIGxlbik7CiAKLQotVUxPTkcgSW50ZXJmYWNlVHhEYXRhUGFja2V0KFBNSU5JX0FEQVBURVIgQWRhcHRlcixQVk9JRCBQYWNrZXQsVVNIT1JUIHVzVmNpZCk7Ci0KLVVMT05HIEludGVyZmFjZVR4Q29udHJvbFBhY2tldChQTUlOSV9BREFQVEVSIEFkYXB0ZXIsUFZPSUQgcHZCdWZmZXIsVUlOVCB1aUJ1ZmZlckxlbmd0aCk7Ci0KLQogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iY20vSW50ZXJmYWNlbWFpbi5oIGIvZHJpdmVycy9zdGFnaW5nL2JjbS9JbnRlcmZhY2VtYWluLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwZGI1NjMuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JjbS9JbnRlcmZhY2VtYWluLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi0jaWZuZGVmIF9NQUlOXwotI2RlZmluZSBfTUFJTl8KLSNpZiAwCi10eXBlZGVmIHN0cnVjdCBfTUlOSV9BREFQVEVSCi17Ci0JU19JTlRFUkZBQ0VfQURBUFRFUiBzdEludGVyZmFjZUFkYXB0ZXI7Ci19TUlOSV9BREFQVEVSLCpQTUlOSV9BREFQVEVSOwotCi0jZW5kaWYKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JjbS9MZWFreUJ1Y2tldC5jIGIvZHJpdmVycy9zdGFnaW5nL2JjbS9MZWFreUJ1Y2tldC5jCmluZGV4IGNhZTM4MjMuLmY0Y2Y0MWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9iY20vTGVha3lCdWNrZXQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvYmNtL0xlYWt5QnVja2V0LmMKQEAgLTc1LDE0ICs3NSwxNCBAQAogKiBSZXR1cm5zICAgICAtIFRoZSBudW1iZXIgb2YgYnl0ZXMgYWxsb3dlZCBmb3IgdHJhbnNtaXNzaW9uLgogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgX19pbmxpbmUgVUxPTkcgR2V0U0ZUb2tlbkNvdW50KFBNSU5JX0FEQVBURVIgQWRhcHRlciwgUGFja2V0SW5mbyAqcHNTRikKK3N0YXRpYyBVTE9ORyBHZXRTRlRva2VuQ291bnQoUE1JTklfQURBUFRFUiBBZGFwdGVyLCBQYWNrZXRJbmZvICpwc1NGKQogewogCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1RYLCBUT0tFTl9DT1VOVFMsIERCR19MVkxfQUxMLCAiSXNQYWNrZXRBbGxvd2VkRm9yRmxvdyA9PT0+Iik7CiAJLyogVmFsaWRhdGUgdGhlIHBhcmFtZXRlcnMgKi8KIAlpZihOVUxMID09IEFkYXB0ZXIgfHwgKHBzU0YgPCBBZGFwdGVyLT5QYWNrSW5mbyAmJgogCQkodWludHB0cl90KXBzU0YgPiAodWludHB0cl90KSAmQWRhcHRlci0+UGFja0luZm9bSGlQcmlvcml0eV0pKQogCXsKLQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfVFgsIFRPS0VOX0NPVU5UUywgREJHX0xWTF9BTEwsICJJUEFGRjogR290IHdyb25nIFBhcmFtZXRlcnM6QWRhcHRlcjogJXAsIFFJbmRleDogJWxkXG4iLCBBZGFwdGVyLCAocHNTRi1BZGFwdGVyLT5QYWNrSW5mbykpOworCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9UWCwgVE9LRU5fQ09VTlRTLCBEQkdfTFZMX0FMTCwgIklQQUZGOiBHb3Qgd3JvbmcgUGFyYW1ldGVyczpBZGFwdGVyOiAlcCwgUUluZGV4OiAlemRcbiIsIEFkYXB0ZXIsIChwc1NGLUFkYXB0ZXItPlBhY2tJbmZvKSk7CiAJCXJldHVybiAwOwogCX0KIApAQCAtOTQsNTEgKzk0LDI3IEBACiAJCX0KIAkJZWxzZQogCQl7Ci0JCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9UWCwgVE9LRU5fQ09VTlRTLCBEQkdfTFZMX0FMTCwgIk5vdCBlbm91Z2ggdG9rZW5zIGluIHF1ZXVlICVsZCBBdmFpbGFibGUgJXVcbiIsCisJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9UWCwgVE9LRU5fQ09VTlRTLCBEQkdfTFZMX0FMTCwgIk5vdCBlbm91Z2ggdG9rZW5zIGluIHF1ZXVlICV6ZCBBdmFpbGFibGUgJXVcbiIsCiAJCQkJcHNTRi1BZGFwdGVyLT5QYWNrSW5mbywgcHNTRi0+dWlDdXJyZW50VG9rZW5Db3VudCk7CiAJCQlwc1NGLT51aVBlbmRlZExhc3QgPSAxOwogCQl9CiAJfQogCWVsc2UKIAl7Ci0JCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1RYLCBUT0tFTl9DT1VOVFMsIERCR19MVkxfQUxMLCAiSVBBRkY6IFF1ZXVlICVsZCBub3QgdmFsaWRcbiIsIHBzU0YtQWRhcHRlci0+UGFja0luZm8pOworCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9UWCwgVE9LRU5fQ09VTlRTLCBEQkdfTFZMX0FMTCwgIklQQUZGOiBRdWV1ZSAlemQgbm90IHZhbGlkXG4iLCBwc1NGLUFkYXB0ZXItPlBhY2tJbmZvKTsKIAl9CiAJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfVFgsIFRPS0VOX0NPVU5UUywgREJHX0xWTF9BTEwsICJJc1BhY2tldEFsbG93ZWRGb3JGbG93IDw9PT0iKTsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIF9faW5saW5lIHZvaWQgUmVtb3ZlUGFja2V0RnJvbVF1ZXVlKFBhY2tldEluZm8gKnBQYWNrSW5mbyAsIHN0cnVjdCBza19idWZmICpQYWNrZXQpCi17Ci0Jc3RydWN0IHNrX2J1ZmYgKnBzUXVldWVDdXJyZW50PU5VTEwsICpwc0xhc3RRdWV1ZU5vZGU9TlVMTDsKLQlwc1F1ZXVlQ3VycmVudCA9IHBQYWNrSW5mby0+Rmlyc3RUeFF1ZXVlOwotCXdoaWxlKHBzUXVldWVDdXJyZW50KQotCXsKLQkJaWYoUGFja2V0ID09IHBzUXVldWVDdXJyZW50KQotCQl7Ci0JCQlpZihwc1F1ZXVlQ3VycmVudCA9PSBwUGFja0luZm8tPkZpcnN0VHhRdWV1ZSkKLQkJCXsKLQkJCQlwUGFja0luZm8tPkZpcnN0VHhRdWV1ZT1wc1F1ZXVlQ3VycmVudC0+bmV4dDsKLQkJCQlpZihwc1F1ZXVlQ3VycmVudD09cFBhY2tJbmZvLT5MYXN0VHhRdWV1ZSkKLQkJCQkJcFBhY2tJbmZvLT5MYXN0VHhRdWV1ZT1OVUxMOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCXBzTGFzdFF1ZXVlTm9kZS0+bmV4dD1wc1F1ZXVlQ3VycmVudC0+bmV4dDsKLQkJCX0KLQkJCWJyZWFrOwotCQl9Ci0JCXBzTGFzdFF1ZXVlTm9kZSA9IHBzUXVldWVDdXJyZW50OwotCQlwc1F1ZXVlQ3VycmVudD1wc1F1ZXVlQ3VycmVudC0+bmV4dDsKLQl9Ci19CiAvKioKIEBpbmdyb3VwIHR4X2Z1bmN0aW9ucwogVGhpcyBmdW5jdGlvbiBkZXNwYXRjaGVzIHBhY2tldCBmcm9tIHRoZSBzcGVjaWZpZWQgcXVldWUuCiBAcmV0dXJuIFplcm8oc3VjY2Vzcykgb3IgTmVnYXRpdmUgdmFsdWUoZmFpbHVyZSkKICovCi1zdGF0aWMgX19pbmxpbmUgSU5UIFNlbmRQYWNrZXRGcm9tUXVldWUoUE1JTklfQURBUFRFUiBBZGFwdGVyLC8qKjxMb2dpY2FsIEFkYXB0ZXIqLwotCQkJCQkJCQlQYWNrZXRJbmZvICpwc1NGLAkJLyoqPFF1ZXVlIGlkZW50aWZpZXIqLwotCQkJCQkJCQlzdHJ1Y3Qgc2tfYnVmZiogIFBhY2tldCkJLyoqPFBvaW50ZXIgdG8gdGhlIHBhY2tldCB0byBiZSBzZW50Ki8KK3N0YXRpYyBJTlQgU2VuZFBhY2tldEZyb21RdWV1ZShQTUlOSV9BREFQVEVSIEFkYXB0ZXIsLyoqPExvZ2ljYWwgQWRhcHRlciovCisJCQkgICAgICAgUGFja2V0SW5mbyAqcHNTRiwJCS8qKjxRdWV1ZSBpZGVudGlmaWVyKi8KKwkJCSAgICAgICBzdHJ1Y3Qgc2tfYnVmZiogIFBhY2tldCkJLyoqPFBvaW50ZXIgdG8gdGhlIHBhY2tldCB0byBiZSBzZW50Ki8KIHsKIAlJTlQgIAlTdGF0dXM9U1RBVFVTX0ZBSUxVUkU7CiAJVUlOVCB1aUluZGV4ID0wLFBrdExlbiA9IDA7CkBAIC0xODAsOCArMTU2LDcgQEAKICogUmV0dXJucyAgICAgLSBOb25lLgogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBfX2lubGluZSBWT0lEIENoZWNrQW5kU2VuZFBhY2tldEZyb21JbmRleAotKFBNSU5JX0FEQVBURVIgQWRhcHRlciwgUGFja2V0SW5mbyAqcHNTRikKK3N0YXRpYyBWT0lEIENoZWNrQW5kU2VuZFBhY2tldEZyb21JbmRleChQTUlOSV9BREFQVEVSIEFkYXB0ZXIsIFBhY2tldEluZm8gKnBzU0YpCiB7CiAJc3RydWN0IHNrX2J1ZmYJKlF1ZXVlUGFja2V0PU5VTEw7CiAJY2hhciAJCQkqcENvbnRyb2xQYWNrZXQgPSBOVUxMOwpAQCAtMTg5LDcgKzE2NCw3IEBACiAJaW50CQkJCWlQYWNrZXRMZW49MDsKIAogCi0JQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfVFgsIFRYX1BBQ0tFVFMsIERCR19MVkxfQUxMLCAiJWxkID09PT0+IiwgKHBzU0YtQWRhcHRlci0+UGFja0luZm8pKTsKKwlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9UWCwgVFhfUEFDS0VUUywgREJHX0xWTF9BTEwsICIlemQgPT09PT4iLCAocHNTRi1BZGFwdGVyLT5QYWNrSW5mbykpOwogCWlmKChwc1NGICE9ICZBZGFwdGVyLT5QYWNrSW5mb1tIaVByaW9yaXR5XSkgJiYgQWRhcHRlci0+TGlua1VwU3RhdHVzICYmIGF0b21pY19yZWFkKCZwc1NGLT51aVBlclNGVHhSZXNvdXJjZUNvdW50KSkvL0dldCBkYXRhIHBhY2tldAogICAJewogCQlpZighcHNTRi0+dWNEaXJlY3Rpb24gKQpAQCAtMTk3LDEwICsxNzIsOCBAQAogCiAJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1RYLCBUWF9QQUNLRVRTLCBEQkdfTFZMX0FMTCwgIlVwZGF0ZVRva2VuQ291bnQgIik7CiAJCWlmKEFkYXB0ZXItPklkbGVNb2RlIHx8IEFkYXB0ZXItPmJQcmVwYXJpbmdGb3JMb3dQb3dlck1vZGUpCi0JCXsKLQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwiRGV2aWNlIGlzIGluIElkbGUgTW9kZS4uSGVuY2UgYmxvY2tpbmcgRGF0YSBQYWNrZXRzLi5cbiIpOwotCQkJcmV0dXJuOwotCQl9CisJCQlyZXR1cm47CS8qIGluIGlkbGUgbW9kZSAqLworCiAJCS8vIENoZWNrIGZvciBGcmVlIERlc2NyaXB0b3JzCiAJCWlmKGF0b21pY19yZWFkKCZBZGFwdGVyLT5DdXJyTnVtRnJlZVR4RGVzYykgPD0gTUlOSU1VTV9QRU5ESU5HX0RFU0NSSVBUT1JTKQogCQl7CkBAIC0yMDgsOSArMTgxLDYgQEAKIAkJCXJldHVybiA7CiAJCX0KIAotI2lmIDAKLQkJUHJ1bmVRdWV1ZShBZGFwdGVyLChwc1NGLUFkYXB0ZXItPlBhY2tJbmZvKSk7Ci0jZW5kaWYKIAkJc3Bpbl9sb2NrX2JoKCZwc1NGLT5TRlF1ZXVlTG9jayk7CiAJCVF1ZXVlUGFja2V0PXBzU0YtPkZpcnN0VHhRdWV1ZTsKIApAQCAtMjQwLDcgKzIxMCw3IEBACiAJCQl9CiAJCQllbHNlCiAJCQl7Ci0JCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfVFgsIFRYX1BBQ0tFVFMsIERCR19MVkxfQUxMLCAiRm9yIFF1ZXVlOiAlbGRcbiIsIHBzU0YtQWRhcHRlci0+UGFja0luZm8pOworCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1RYLCBUWF9QQUNLRVRTLCBEQkdfTFZMX0FMTCwgIkZvciBRdWV1ZTogJXpkXG4iLCBwc1NGLUFkYXB0ZXItPlBhY2tJbmZvKTsKIAkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9UWCwgVFhfUEFDS0VUUywgREJHX0xWTF9BTEwsICJcbkF2YWlsYWJsZSBUb2tlbnMgPSAlZCByZXF1aXJlZCA9ICVkXG4iLAogCQkJCQlwc1NGLT51aUN1cnJlbnRUb2tlbkNvdW50LCBpUGFja2V0TGVuKTsKIAkJCQkvL3RoaXMgcGFydCBpbmRpY2F0ZXMgdGhhdCBiZWN1YXNlIG9mIG5vbi1hdmFpbGFiaWxpdHkgb2YgdGhlIHRva2VucwpAQCAtMjkwLDE3ICsyNjAsNiBAQAogCQkJfQogCSAgIAl9CiAJfQotCi0JaWYoU3RhdHVzICE9IFNUQVRVU19TVUNDRVNTKQkvL1R4IG9mIGRhdGEgcGFja2V0IHRvIGRldmljZSBGYWlsZWQKLQl7Ci0JCWlmKEFkYXB0ZXItPmJjbV9qaWZmaWVzID09IDApCi0JCQlBZGFwdGVyLT5iY21famlmZmllcyA9IGppZmZpZXM7Ci0JfQotCWVsc2UKLQl7Ci0JCUFkYXB0ZXItPmJjbV9qaWZmaWVzID0gMDsKLQl9Ci0JQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfVFgsIFRYX1BBQ0tFVFMsIERCR19MVkxfQUxMLCAiPD09PT09Iik7CiB9CiAKIApAQCAtMzg3LDEyICszNDYsNyBAQAogCQlpZihleGl0X2ZsYWcgPT0gVFJVRSApCiAJCSAgICBicmVhayA7CiAJfS8qIGVuZCBvZiBpbm5lciB3aGlsZSBsb29wICovCi0JaWYoQWRhcHRlci0+YmNtX2ppZmZpZXMgPT0gMCAmJgotCQlhdG9taWNfcmVhZCgmQWRhcHRlci0+VG90YWxQYWNrZXRDb3VudCkgIT0gMCAmJgotCSAgIAl1aVByZXZUb3RhbENvdW50ID09IGF0b21pY19yZWFkKCZBZGFwdGVyLT5Ub3RhbFBhY2tldENvdW50KSkKLQl7Ci0JCUFkYXB0ZXItPmJjbV9qaWZmaWVzID0gamlmZmllczsKLQl9CisKIAl1cGRhdGVfcGVyX2NpZF9yeCAgKEFkYXB0ZXIpOwogCUFkYXB0ZXItPnR4dHJhbnNtaXRfcnVubmluZyA9IDA7CiAJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfVFgsIFRYX1BBQ0tFVFMsIERCR19MVkxfQUxMLCAiPD09PT09PSIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JjbS9NYWNyb3MuaCBiL2RyaXZlcnMvc3RhZ2luZy9iY20vTWFjcm9zLmgKaW5kZXggMDI0MTIzNC4uZmViMzUxNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JjbS9NYWNyb3MuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYmNtL01hY3Jvcy5oCkBAIC00LDEwICs0LDYgQEAKICNpZm5kZWYJX19NQUNST1NfSF9fCiAjZGVmaW5lIF9fTUFDUk9TX0hfXwogCi0jaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDApCi0jZGVmaW5lIGt0aHJlYWRfcnVuKHRocmVhZGZuLGRhdGEsZGF0YWZtdCkoc3RydWN0IHRhc2tfc3RydWN0ICopa2VybmVsX3RocmVhZCh0aHJlYWRmbixkYXRhLDApCi0jZW5kaWYKLQogI2RlZmluZSBUWF9USU1FUl9QRVJJT0QgMTAJLy8xMCBtc2VjCiAjZGVmaW5lIE1BWF9DTEFTU0lGSUVSUyAxMDAKIC8vI2RlZmluZSBNQVhfQ0xBU1NJRklFUlNfUEVSX1NGICAyMApAQCAtMTcsMTAgKzEzLDkgQEAKICNkZWZpbmUgTUFYX0RBVEFfUEtUUyAJCTIwMAogI2RlZmluZSBNQVhfRVRIX1NJWkUgCQkxNTM2CiAjZGVmaW5lIE1BWF9DTlRMX1BLVF9TSVpFIDIwNDgKLS8qIFRJTUVSIFJFTEFURUQgKi8KLSNkZWZpbmUgSklGRklFU18yX1FVQURQQVJUKCkJKFVMT05HKShqaWZmaWVzICogMTAwMDApIC8vIGppZmZpZXMoMW1zZWMpIHRvIFF1YWRwYXJ0KDEwMG5zZWMpCiAKICNkZWZpbmUgTVRVX1NJWkUgMTQwMAorI2RlZmluZSBUWF9RTEVOICA1CiAKICNkZWZpbmUgTUFDX0FERFJfUkVHSVNURVIgMHhiZjYwZDAwMAogCkBAIC0yNjYsNyArMjYxLDcgQEAKIAogI2RlZmluZSBGSVJNV0FSRV9CRUdJTl9BRERSIDB4QkZDMDAwMDAKIAotI2RlZmluZSBJTlZBTElEX1FVRVVFX0lOREVYIChVU0hPUlQpLTEKKyNkZWZpbmUgSU5WQUxJRF9RVUVVRV9JTkRFWCBOT19PRl9RVUVVRVMKIAogI2RlZmluZSBJTlZBTElEX1BJRCAocGlkX3QpLTEKICNkZWZpbmUgRERSXzgwX01IWiAgCTAKQEAgLTMwMCwxMiArMjk1LDcgQEAKIAogLyogSWRsZSBNb2RlIFJlbGF0ZWQgUmVnaXN0ZXJzICovCiAjZGVmaW5lIERFQlVHX0lOVEVSUlVQVF9HRU5FUkFUT1JfUkVHSVNUT1IgMHgwRjAwMDA3QwotI2lmZGVmIEJDTV9TSE1fSU5URVJGQUNFCi0jZGVmaW5lIFNXX0FCT1JUX0lETEVNT0RFX0xPQyAJCTB4YmZjMDJmOWMKLSNkZWZpbmUgQ1BFX1ZJUlRVQUxfTUFJTEJPWF9SRUcgICAgIDB4QkZDMDJFNTgKLSNlbHNlCiAjZGVmaW5lIFNXX0FCT1JUX0lETEVNT0RFX0xPQyAJCTB4MEZGMDFGRkMKLSNlbmRpZgogCiAjZGVmaW5lIFNXX0FCT1JUX0lETEVNT0RFX1BBVFRFUk4gCTB4ZDBlYTFkMWUKICNkZWZpbmUgREVWSUNFX0lOVF9PVVRfRVBfUkVHMAkJMHgwRjAxMTg3MApAQCAtMzU1LDEyICszNDUsNyBAQAogCUhZQlJJRF9NT0RFXzYgICA9IDIKIH1QTVVfTU9ERTsKIAotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwzMCkKLSNkZWZpbmUgTUFYX1JETV9XUk1fUkVUSVJFUyAxNgotI2Vsc2UKICNkZWZpbmUgTUFYX1JETV9XUk1fUkVUSVJFUyAxCi0jZW5kaWYKLQogCiBlbnVtIGVBYm9ydFBhdHRlcm4gewogCUFCT1JUX1NIVVRET1dOX01PREUgPSAxLApAQCAtMzY5LDI3ICszNTQsNiBAQAogCUFCT1JUX0lETEVfU1lOQ0RPV04gPSAzCiB9OwogCi0jaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDI3KQotCSNkZWZpbmUgR0VUX0JDTV9BREFQVEVSKG5ldF9kZXYpICAoe1wKLSAgICBQTUlOSV9BREFQVEVSIF9fQWRhcHRlciA9IE5VTEw7CVwKLSAgICBpZiAobmV0X2RldikgICAgeyAgIFwKLSAgICAgICAgIF9fQWRhcHRlciA9IChQTUlOSV9BREFQVEVSKShuZXRfZGV2LT5wcml2KTsgXAotICAgIH0gXAotICAgIGVsc2UgICAgeyAgIFwKLSAgICAgICAgIF9fQWRhcHRlciA9IE5VTEw7ICBcCi0gICAgfV9fQWRhcHRlcjt9ICkKLSNlbHNlCi0JI2RlZmluZSBHRVRfQkNNX0FEQVBURVIobmV0X2RldikgKHtcCi0gICAgUE1JTklfQURBUFRFUiBfX0FkYXB0ZXIgPSBOVUxMOwlcCi0gICAgaWYgKG5ldF9kZXYpICAgIHsgICBcCi0gICAgICAgICBfX0FkYXB0ZXIgPSAoUE1JTklfQURBUFRFUikoKigodW5zaWduZWQgbG9uZyAqKW5ldGRldl9wcml2KG5ldF9kZXYpKSk7ICBcCi0gICAgfSBcCi0gICAgZWxzZSAgICB7ICAgXAotICAgICAgICAgX19BZGFwdGVyID0gTlVMTDsgIFwKLSAgICB9X19BZGFwdGVyO30pCi0KLQotI2VuZGlmCiAKIC8qIE9mZnNldHMgdXNlZCBieSBkcml2ZXIgaW4gc2tiIGNiIHZhcmlhYmxlICovCiAjZGVmaW5lIFNLQl9DQl9DTEFTU0lGSUNBVElPTl9PRkZTRVQgICAgMApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JjbS9NYWtlZmlsZSBiL2RyaXZlcnMvc3RhZ2luZy9iY20vTWFrZWZpbGUKaW5kZXggYzNhZTI1YS4uNjUyYjdmOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JjbS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3N0YWdpbmcvYmNtL01ha2VmaWxlCkBAIC02LDcgKzYsNyBAQAogCiBiY21fd2ltYXgteSA6PSAgSW50ZXJmYWNlRGxkLm8gSW50ZXJmYWNlSWRsZU1vZGUubyBJbnRlcmZhY2VJbml0Lm8gSW50ZXJmYWNlUngubyBcCiAJCUludGVyZmFjZUlzci5vIEludGVyZmFjZU1pc2MubyBJbnRlcmZhY2VUeC5vIFwKLQkJQXJwLm8gQ21Ib3N0Lm8gRGVidWcubyBJUHY2UHJvdG9jb2wubyBRb3MubyBUcmFuc21pdC5vXAorCQlDbUhvc3QubyBJUHY2UHJvdG9jb2wubyBRb3MubyBUcmFuc21pdC5vXAogCQlCY21uZXQubyBERFJJbml0Lm8gSGFuZGxlQ29udHJvbFBhY2tldC5vXAogCQlMZWFreUJ1Y2tldC5vIE1pc2MubyBzb3J0Lm8gQmNtY2hhci5vIGhvc3RtaWJzLm8gUEhTTW9kdWxlLm9cCi0JIAlPc2FsX01pc2MubyBsZWRfY29udHJvbC5vIG52bS5vIHZlbmRvcnNwZWNpZmljZXh0bi5vCisJCWxlZF9jb250cm9sLm8gbnZtLm8gdmVuZG9yc3BlY2lmaWNleHRuLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iY20vTWlzYy5jIGIvZHJpdmVycy9zdGFnaW5nL2JjbS9NaXNjLmMKaW5kZXggMjI1NTBmNy4uZjU4NWFhZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JjbS9NaXNjLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JjbS9NaXNjLmMKQEAgLTEsNSArMSwxMiBAQAogI2luY2x1ZGUgImhlYWRlcnMuaCIKIAorc3RhdGljIGludCBCY21GaWxlRG93bmxvYWQoUE1JTklfQURBUFRFUiBBZGFwdGVyLCBjb25zdCBjaGFyICpwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGxvYyk7CitzdGF0aWMgVk9JRCBkb1Bvd2VyQXV0b0NvcnJlY3Rpb24oUE1JTklfQURBUFRFUiBwc0FkYXB0ZXIpOworc3RhdGljIHZvaWQgSGFuZGxlU2h1dERvd25Nb2RlUmVxdWVzdChQTUlOSV9BREFQVEVSIEFkYXB0ZXIsUFVDSEFSIHB1Y0J1ZmZlcik7CitzdGF0aWMgaW50IGJjbV9wYXJzZV90YXJnZXRfcGFyYW1zKFBNSU5JX0FEQVBURVIgQWRhcHRlcik7CitzdGF0aWMgdm9pZCBiZWNlZW1fcHJvdG9jb2xfcmVzZXQgKFBNSU5JX0FEQVBURVIgQWRhcHRlcik7CisKIHN0YXRpYyBWT0lEIGRlZmF1bHRfd2ltYXhfcHJvdG9jb2xfaW5pdGlhbGl6ZShQTUlOSV9BREFQVEVSIEFkYXB0ZXIpCiB7CiAKQEAgLTYwLDIxICs2NywxMSBAQAogICAgIC8vaW5pdF93YWl0cXVldWVfaGVhZCgmcHNBZGFwdGVyLT5kZXZpY2Vfd2FrZV9xdWV1ZSk7CiAgICAgcHNBZGFwdGVyLT5md19kb3dubG9hZF9kb25lPUZBTFNFOwogCi0gICAgcHNBZGFwdGVyLT5wdk9zRGVwRGF0YSA9IChQTElOVVhfREVQX0RBVEEpIGttYWxsb2Moc2l6ZW9mKExJTlVYX0RFUF9EQVRBKSwKLSAgICAgICAgICAgICAgICAgR0ZQX0tFUk5FTCk7Ci0KLSAgICBpZihwc0FkYXB0ZXItPnB2T3NEZXBEYXRhID09IE5VTEwpCi0JewotICAgICAgICBCQ01fREVCVUdfUFJJTlQocHNBZGFwdGVyLERCR19UWVBFX0lOSVRFWElULCBNUF9JTklULCBEQkdfTFZMX0FMTCwgIkxpbnV4IFNwZWNpZmljIERhdGEgYWxsb2NhdGlvbiBmYWlsZWQiKTsKLSAgICAgICAgcmV0dXJuIC1FTk9NRU07Ci0gICAgfQotICAgIG1lbXNldChwc0FkYXB0ZXItPnB2T3NEZXBEYXRhLCAwLCBzaXplb2YoTElOVVhfREVQX0RBVEEpKTsKIAogCWRlZmF1bHRfd2ltYXhfcHJvdG9jb2xfaW5pdGlhbGl6ZShwc0FkYXB0ZXIpOwogCWZvciAoaT0wO2k8TUFYX0NOVFJMX1BLVFM7aSsrKQogCXsKLQkJcHNBZGFwdGVyLT50eGN0bHBhY2tldFtpXSA9IChjaGFyICopa21hbGxvYyhNQVhfQ05UTF9QS1RfU0laRSwKLQkJCQkJCQkJCQkJCUdGUF9LRVJORUwpOworCQlwc0FkYXB0ZXItPnR4Y3RscGFja2V0W2ldID0ga21hbGxvYyhNQVhfQ05UTF9QS1RfU0laRSwgR0ZQX0tFUk5FTCk7CiAJCWlmKCFwc0FkYXB0ZXItPnR4Y3RscGFja2V0W2ldKQogCQl7CiAJCQlCQ01fREVCVUdfUFJJTlQocHNBZGFwdGVyLERCR19UWVBFX0lOSVRFWElULCBNUF9JTklULCBEQkdfTFZMX0FMTCwgIk5vIE1vcmUgQ250bCBwa3RzIGdvdCwgbWF4IGdvdCBpcyAlZCIsIGkpOwpAQCAtMTE3LDcgKzExNCw3IEBACiAKIFZPSUQgQWRhcHRlckZyZWUoUE1JTklfQURBUFRFUiBBZGFwdGVyKQogewotCUlOVCBjb3VudCA9IDA7CisJaW50IGNvdW50OwogCiAJYmVjZWVtX3Byb3RvY29sX3Jlc2V0KEFkYXB0ZXIpOwogCkBAIC0xMjUsNzIgKzEyMiw2NiBAQAogCiAJaWYoQWRhcHRlci0+Y29udHJvbF9wYWNrZXRfaGFuZGxlciAmJiAhSVNfRVJSKEFkYXB0ZXItPmNvbnRyb2xfcGFja2V0X2hhbmRsZXIpKQogCSAgCWt0aHJlYWRfc3RvcCAoQWRhcHRlci0+Y29udHJvbF9wYWNrZXRfaGFuZGxlcik7CisKIAlpZihBZGFwdGVyLT50cmFuc21pdF9wYWNrZXRfdGhyZWFkICYmICFJU19FUlIoQWRhcHRlci0+dHJhbnNtaXRfcGFja2V0X3RocmVhZCkpCi0gICAgCWt0aHJlYWRfc3RvcCAoQWRhcHRlci0+dHJhbnNtaXRfcGFja2V0X3RocmVhZCk7Ci0gICAgd2FrZV91cCgmQWRhcHRlci0+cHJvY2Vzc19yZWFkX3dhaXRfcXVldWUpOworCQlrdGhyZWFkX3N0b3AgKEFkYXB0ZXItPnRyYW5zbWl0X3BhY2tldF90aHJlYWQpOworCisJd2FrZV91cCgmQWRhcHRlci0+cHJvY2Vzc19yZWFkX3dhaXRfcXVldWUpOworCiAJaWYoQWRhcHRlci0+TEVESW5mby5sZWRfdGhyZWFkX3J1bm5pbmcgJiAoQkNNX0xFRF9USFJFQURfUlVOTklOR19BQ1RJVkVMWSB8IEJDTV9MRURfVEhSRUFEX1JVTk5JTkdfSU5BQ1RJVkVMWSkpCiAJCWt0aHJlYWRfc3RvcCAoQWRhcHRlci0+TEVESW5mby5sZWRfY250cmxfdGhyZWFkaWQpOwotCWJjbV91bnJlZ2lzdGVyX25ldHdvcmtkZXYoQWRhcHRlcik7CisKKwl1bnJlZ2lzdGVyX25ldHdvcmtkZXYoQWRhcHRlcik7CisKKwkvKiBGSVhNRTogdXNlIHByb3BlciB3YWl0X2V2ZW50IGFuZCByZWZjb3VudGluZyAqLwogCXdoaWxlKGF0b21pY19yZWFkKCZBZGFwdGVyLT5BcHBsaWNhdGlvblJ1bm5pbmcpKQogCXsKIAkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfSU5JVEVYSVQsIE1QX0lOSVQsIERCR19MVkxfQUxMLCAiV2FpdGluZyBmb3IgQXBwbGljYXRpb24gdG8gY2xvc2UuLiAlZFxuIixhdG9taWNfcmVhZCgmQWRhcHRlci0+QXBwbGljYXRpb25SdW5uaW5nKSk7CiAJCW1zbGVlcCgxMDApOwogCX0KIAl1bnJlZ2lzdGVyX2NvbnRyb2xfZGV2aWNlX2ludGVyZmFjZShBZGFwdGVyKTsKLQlpZihBZGFwdGVyLT5kZXYgJiYgIUlTX0VSUihBZGFwdGVyLT5kZXYpKQotCQlmcmVlX25ldGRldihBZGFwdGVyLT5kZXYpOwotCWlmKEFkYXB0ZXItPnBzdGFyZ2V0cGFyYW1zICE9IE5VTEwpCi0JewotCQliY21fa2ZyZWUoQWRhcHRlci0+cHN0YXJnZXRwYXJhbXMpOwotCX0KKworCWtmcmVlKEFkYXB0ZXItPnBzdGFyZ2V0cGFyYW1zKTsKKwogCWZvciAoY291bnQgPTA7Y291bnQgPCBNQVhfQ05UUkxfUEtUUztjb3VudCsrKQotCXsKLQkJaWYoQWRhcHRlci0+dHhjdGxwYWNrZXRbY291bnRdKQotCQkJYmNtX2tmcmVlKEFkYXB0ZXItPnR4Y3RscGFja2V0W2NvdW50XSk7Ci0JfQorCQlrZnJlZShBZGFwdGVyLT50eGN0bHBhY2tldFtjb3VudF0pOworCiAJRnJlZUFkYXB0ZXJEc3hCdWZmZXIoQWRhcHRlcik7Ci0JaWYoQWRhcHRlci0+cHZPc0RlcERhdGEpCi0JCWJjbV9rZnJlZSAoQWRhcHRlci0+cHZPc0RlcERhdGEpOwotCWlmKEFkYXB0ZXItPnB2SW50ZXJmYWNlQWRhcHRlcikKLQkJYmNtX2tmcmVlKEFkYXB0ZXItPnB2SW50ZXJmYWNlQWRhcHRlcik7CisKKwlrZnJlZShBZGFwdGVyLT5wdkludGVyZmFjZUFkYXB0ZXIpOwogCiAJLy9GcmVlIHRoZSBQSFMgSW50ZXJmYWNlCiAJUGhzQ2xlYW51cCgmQWRhcHRlci0+c3RCQ01QaHNDb250ZXh0KTsKIAotI2lmbmRlZiBCQ01fU0hNX0lOVEVSRkFDRQogCUJjbURlQWxsb2NGbGFzaENTU3RydWN0dXJlKEFkYXB0ZXIpOwotI2VuZGlmCiAKLQliY21fa2ZyZWUgKEFkYXB0ZXIpOwotCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX0lOSVRFWElULCBNUF9JTklULCBEQkdfTFZMX0FMTCwgIjw9PT09PT09PVxuIik7CisJZnJlZV9uZXRkZXYoQWRhcHRlci0+ZGV2KTsKIH0KIAotCi1pbnQgY3JlYXRlX3dvcmtlcl90aHJlYWRzKFBNSU5JX0FEQVBURVIgcHNBZGFwdGVyKQorc3RhdGljIGludCBjcmVhdGVfd29ya2VyX3RocmVhZHMoUE1JTklfQURBUFRFUiBwc0FkYXB0ZXIpCiB7Ci0JQkNNX0RFQlVHX1BSSU5UKHBzQWRhcHRlcixEQkdfVFlQRV9JTklURVhJVCwgTVBfSU5JVCwgREJHX0xWTF9BTEwsICJJbml0IFRocmVhZHMuLi4iKTsKIAkvLyBSeCBDb250cm9sIFBhY2tldHMgUHJvY2Vzc2luZwogCXBzQWRhcHRlci0+Y29udHJvbF9wYWNrZXRfaGFuZGxlciA9IGt0aHJlYWRfcnVuKChpbnQgKCopKHZvaWQgKikpCi0JCQljb250cm9sX3BhY2tldF9oYW5kbGVyLCBwc0FkYXB0ZXIsICJDdHJsUGt0SGRsciIpOworCQkJCQkJCWNvbnRyb2xfcGFja2V0X2hhbmRsZXIsIHBzQWRhcHRlciwgIiVzLXJ4IiwgRFJWX05BTUUpOwogCWlmKElTX0VSUihwc0FkYXB0ZXItPmNvbnRyb2xfcGFja2V0X2hhbmRsZXIpKQogCXsKLQkJQkNNX0RFQlVHX1BSSU5UKHBzQWRhcHRlcixEQkdfVFlQRV9JTklURVhJVCwgTVBfSU5JVCwgREJHX0xWTF9BTEwsICJObyBLZXJuZWwgVGhyZWFkLCBidXQgc3RpbGwgcmV0dXJuaW5nIHN1Y2Nlc3NcbiIpOworCQlwcl9ub3RpY2UoRFJWX05BTUUgIjogY291bGQgbm90IGNyZWF0ZSBjb250cm9sIHRocmVhZFxuIik7CiAJCXJldHVybiBQVFJfRVJSKHBzQWRhcHRlci0+Y29udHJvbF9wYWNrZXRfaGFuZGxlcik7CiAJfQorCiAJLy8gVHggVGhyZWFkCiAJcHNBZGFwdGVyLT50cmFuc21pdF9wYWNrZXRfdGhyZWFkID0ga3RocmVhZF9ydW4oKGludCAoKikodm9pZCAqKSkKLQkJdHhfcGt0X2hhbmRsZXIsIHBzQWRhcHRlciwgIlR4UGt0VGhyZWFkIik7CisJCQkJCQkJdHhfcGt0X2hhbmRsZXIsIHBzQWRhcHRlciwgIiVzLXR4IiwgRFJWX05BTUUpOwogCWlmKElTX0VSUiAocHNBZGFwdGVyLT50cmFuc21pdF9wYWNrZXRfdGhyZWFkKSkKIAl7Ci0JCUJDTV9ERUJVR19QUklOVChwc0FkYXB0ZXIsREJHX1RZUEVfSU5JVEVYSVQsIE1QX0lOSVQsIERCR19MVkxfQUxMLCAiTm8gS2VybmVsIFRocmVhZCwgYnV0IHN0aWxsIHJldHVybmluZyBzdWNjZXNzIik7CisJCXByX25vdGljZShEUlZfTkFNRSAiOiBjb3VsZCBub3QgY3JlYXQgdHJhbnNtaXQgdGhyZWFkXG4iKTsKIAkJa3RocmVhZF9zdG9wKHBzQWRhcHRlci0+Y29udHJvbF9wYWNrZXRfaGFuZGxlcik7CiAJCXJldHVybiBQVFJfRVJSKHBzQWRhcHRlci0+dHJhbnNtaXRfcGFja2V0X3RocmVhZCk7CiAJfQogCXJldHVybiAwOwogfQogCi0KLXN0YXRpYyBpbmxpbmUgc3RydWN0IGZpbGUgKm9wZW5fZmlybXdhcmVfZmlsZShQTUlOSV9BREFQVEVSIEFkYXB0ZXIsIGNoYXIgKnBhdGgpCitzdGF0aWMgc3RydWN0IGZpbGUgKm9wZW5fZmlybXdhcmVfZmlsZShQTUlOSV9BREFQVEVSIEFkYXB0ZXIsIGNvbnN0IGNoYXIgKnBhdGgpCiB7CiAgICAgc3RydWN0IGZpbGUgICAgICAgICAgICAgKmZscD1OVUxMOwogICAgIG1tX3NlZ21lbnRfdCAgICAgICAgb2xkZnM7CkBAIC0yMDAsMjYgKzE5MSwyMCBAQAogICAgIHNldF9mcyhvbGRmcyk7CiAgICAgaWYoSVNfRVJSKGZscCkpCiAgICAgewotICAgICAgICBCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9JTklURVhJVCwgTVBfSU5JVCwgREJHX0xWTF9BTEwsICJVbmFibGUgVG8gT3BlbiBGaWxlICVzLCBlcnIgICVseCIsCi0JCQkJcGF0aCwgUFRSX0VSUihmbHApKTsKLQkJZmxwID0gTlVMTDsKKwkgICAgcHJfZXJyKERSVl9OQU1FICJVbmFibGUgVG8gT3BlbiBGaWxlICVzLCBlcnIgJWxkIiwKKwkJICAgcGF0aCwgUFRSX0VSUihmbHApKTsKKwkgICAgZmxwID0gTlVMTDsKICAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfSU5JVEVYSVQsIE1QX0lOSVQsIERCR19MVkxfQUxMLCAiR290IGZpbGUgZGVzY3JpcHRvciBwb2ludGVyIG9mICVzISIsCi0JCQlwYXRoKTsKLSAgICB9Ci0JaWYoQWRhcHRlci0+ZGV2aWNlX3JlbW92ZWQpCi0JewotCQlmbHAgPSBOVUxMOwotCX0KKworICAgIGlmKEFkYXB0ZXItPmRldmljZV9yZW1vdmVkKQorCSAgICBmbHAgPSBOVUxMOwogCiAgICAgcmV0dXJuIGZscDsKIH0KIAogCi1pbnQgQmNtRmlsZURvd25sb2FkKFBNSU5JX0FEQVBURVIgQWRhcHRlciwvKio8IExvZ2ljYWwgQWRhcHRlciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqcGF0aCwgICAgIC8qKjwgcGF0aCB0byBpbWFnZSBmaWxlICovCitzdGF0aWMgaW50IEJjbUZpbGVEb3dubG9hZChQTUlOSV9BREFQVEVSIEFkYXB0ZXIsLyoqPCBMb2dpY2FsIEFkYXB0ZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnBhdGgsICAgICAvKio8IHBhdGggdG8gaW1hZ2UgZmlsZSAqLwogICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGxvYyAgICAvKio8IERvd25sb2FkIEFkZHJlc3Mgb24gdGhlIGNoaXAqLwogICAgICAgICAgICAgICAgICAgICAgICAgKQogewpAQCAtMjQ4LDkgKzIzMyw3IEBACiAgICAgICAgIGdvdG8gZXhpdF9kb3dubG9hZDsKICAgICB9CiAgICAgb2xkZnM9Z2V0X2ZzKCk7c2V0X2ZzKGdldF9kcygpKTsKLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDApCiAgICAgdmZzX2xsc2VlayhmbHAsIDAsIDApOwotI2VuZGlmCiAgICAgc2V0X2ZzKG9sZGZzKTsKICAgICBpZihBZGFwdGVyLT5iY21fZmlsZV9yZWFkYmFja19mcm9tX2NoaXAoQWRhcHRlci0+cHZJbnRlcmZhY2VBZGFwdGVyLAogCQkJCQkJCQkJCWZscCwgbG9jKSkKQEAgLTI2NSwzMSArMjQ4LDEwIEBACiAJaWYoZmxwICYmICEoSVNfRVJSKGZscCkpKQogICAgIAlmaWxwX2Nsb3NlKGZscCwgY3VycmVudC0+ZmlsZXMpOwogICAgIHNldF9mcyhvbGRmcyk7Ci0gICAgZG9fZ2V0dGltZW9mZGF5KCZ0dik7Ci0gICAgQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfSU5JVEVYSVQsIE1QX0lOSVQsIERCR19MVkxfQUxMLCAiZmlsZSBkb3dubG9hZCBkb25lIGF0ICVseCIsICgodHYudHZfc2VjICogMTAwMCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0di50dl91c2VjLzEwMDApKSk7CisKICAgICByZXR1cm4gZXJyb3JubzsKIH0KIAotCi12b2lkIGJjbV9rZnJlZV9za2Ioc3RydWN0IHNrX2J1ZmYgKnNrYikKLXsKLQlpZihza2IpCi0gICAgewotICAgIAlrZnJlZV9za2Ioc2tiKTsKLSAgICB9Ci0Jc2tiID0gTlVMTCA7Ci19Ci0KLVZPSUQgYmNtX2tmcmVlKFZPSUQgKnB0cikKLXsKLQlpZihwdHIpCi0JewotCQlrZnJlZShwdHIpOwotCX0KLQlwdHIgPSBOVUxMIDsKLX0KLQogLyoqCiBAaW5ncm91cCBjdHJsX3BrdF9mdW5jdGlvbnMKIFRoaXMgZnVuY3Rpb24gY29waWVzIHRoZSBjb250ZW50cyBvZiBnaXZlbiBidWZmZXIKQEAgLTM5NSwxMyArMzU3LDYgQEAKIAkJCS8qU2V0dGluZyBiSWRsZU1vZGVfdHhfZnJvbV9ob3N0IHRvIFRSVUUgdG8gaW5kaWNhdGUgTEVEIGNvbnRyb2wgdGhyZWFkIHRvIHJlcHJlc2VudAogCQkJICB0aGUgd2FrZSB1cCBmcm9tIGlkbGVtb2RlIGlzIGZyb20gaG9zdCovCiAJCQkvL0FkYXB0ZXItPkxFREluZm8uYklkbGVNb2RlX3R4X2Zyb21faG9zdCA9IFRSVUU7Ci0jaWYgMAotCQkJaWYoU1RBVFVTX1NVQ0NFU1MgIT0gSW50ZXJmYWNlSWRsZU1vZGVXYWtldXAoQWRhcHRlcikpCi0JCQl7Ci0JCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfVFgsIE5FWFRfU0VORCwgREJHX0xWTF9BTEwsICJJZGxlIE1vZGUgV2FrZSB1cCBGYWlsZWRcbiIpOwotCQkJCXJldHVybiBTVEFUVVNfRkFJTFVSRTsKLQkJCX0KLSNlbmRpZgogCQkJQWRhcHRlci0+Yldha2VVcERldmljZSA9IFRSVUU7CiAJCQl3YWtlX3VwKCZBZGFwdGVyLT5wcm9jZXNzX3J4X2NudHJscGt0KTsKIApAQCAtNDg5LDkgKzQ0NCw2IEBACiAJCWF0b21pY19pbmMoJkFkYXB0ZXItPmluZGV4X3dyX3R4Y250cmxwa3QpOwogCQlCQ01fREVCVUdfUFJJTlQoIEFkYXB0ZXIsREJHX1RZUEVfVFgsIFRYX0NPTlRST0wsREJHX0xWTF9BTEwsICJDYWxsaW5nIHRyYW5zbWl0X3BhY2tldHMiKTsKIAkJYXRvbWljX3NldCgmQWRhcHRlci0+VHhQa3RBdmFpbCwgMSk7Ci0jaWZkZWYgQkNNX1NITV9JTlRFUkZBQ0UKLQkJdmlydHVhbF9tYWlsX2JveF9pbnRlcnJ1cHQoKTsKLSNlbmRpZgogCQl3YWtlX3VwKCZBZGFwdGVyLT50eF9wYWNrZXRfd2FpdF9xdWV1ZSk7CiAJfQogCWVsc2UKQEAgLTUzMCwxOCArNDgyLDYgQEAKICNlbmRpZgogCiAKLXZvaWQgU2VuZExpbmtEb3duKFBNSU5JX0FEQVBURVIgQWRhcHRlcikKLXsKLQlMSU5LX1JFUVVFU1QJc3RMaW5rRG93blJlcXVlc3Q7Ci0JbWVtc2V0KCZzdExpbmtEb3duUmVxdWVzdCwgMCwgc2l6ZW9mKExJTktfUkVRVUVTVCkpOwotCXN0TGlua0Rvd25SZXF1ZXN0LkxlYWRlci5TdGF0dXM9TElOS19VUF9DT05UUk9MX1JFUTsKLQlzdExpbmtEb3duUmVxdWVzdC5MZWFkZXIuUExlbmd0aD1zaXplb2YoVUxPTkcpOy8vbWluaW11bSA0IGJ5dGVzCi0Jc3RMaW5rRG93blJlcXVlc3Quc3pEYXRhWzBdPUxJTktfRE9XTl9SRVFfUEFZTE9BRDsKLQlBZGFwdGVyLT5iTGlua0Rvd25SZXF1ZXN0ZWQgPSBUUlVFOwotCi0JQ29weUJ1ZmZlclRvQ29udHJvbFBhY2tldChBZGFwdGVyLCZzdExpbmtEb3duUmVxdWVzdCk7Ci19Ci0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogRnVuY3Rpb24gICAgLSBMaW5rTWVzc2FnZSgpCiAqCkBAIC01NTIsNyArNDkyLDcgQEAKICoKICogUmV0dXJucyAgICAgLSBOb25lLgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLV9faW5saW5lIFZPSUQgTGlua01lc3NhZ2UoUE1JTklfQURBUFRFUiBBZGFwdGVyKQorVk9JRCBMaW5rTWVzc2FnZShQTUlOSV9BREFQVEVSIEFkYXB0ZXIpCiB7CiAJUExJTktfUkVRVUVTVAlwc3RMaW5rUmVxdWVzdD1OVUxMOwogCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX09USEVSUywgTElOS19VUF9NU0csIERCR19MVkxfQUxMLCAiPT09PT0+Iik7CkBAIC01OTQsNyArNTM0LDcgQEAKIAl7CiAJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX09USEVSUywgTElOS19VUF9NU0csIERCR19MVkxfQUxMLCAiQ2FsbGluZyBDb3B5QnVmZmVyVG9Db250cm9sUGFja2V0Iik7CiAJCUNvcHlCdWZmZXJUb0NvbnRyb2xQYWNrZXQoQWRhcHRlciwgcHN0TGlua1JlcXVlc3QpOwotCQliY21fa2ZyZWUocHN0TGlua1JlcXVlc3QpOworCQlrZnJlZShwc3RMaW5rUmVxdWVzdCk7CiAJfQogCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX09USEVSUywgTElOS19VUF9NU0csIERCR19MVkxfQUxMLCAiTGlua01lc3NhZ2UgPD09PT09Iik7CiAJcmV0dXJuOwpAQCAtNjE0LDggKzU1NCw4IEBACiBWT0lEIFN0YXRpc3RpY3NSZXNwb25zZShQTUlOSV9BREFQVEVSIEFkYXB0ZXIsUFZPSUQgcHZCdWZmZXIpCiB7CiAJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBEVU1QX0lORk8sIERCR19MVkxfQUxMLCAiJXM9PT09PiIsX19GVU5DVElPTl9fKTsKLQlBZGFwdGVyLT5TdGF0aXN0aWNzUG9pbnRlciA9IG50b2hsKCooUFVMT05HKXB2QnVmZmVyKTsKLQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIERVTVBfSU5GTywgREJHX0xWTF9BTEwsICJTdGF0cyBhdCAlbHgiLCBBZGFwdGVyLT5TdGF0aXN0aWNzUG9pbnRlcik7CisJQWRhcHRlci0+U3RhdGlzdGljc1BvaW50ZXIgPSBudG9obCgqKF9fYmUzMiAqKXB2QnVmZmVyKTsKKwlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIERVTVBfSU5GTywgREJHX0xWTF9BTEwsICJTdGF0cyBhdCAleCIsIChVSU5UKUFkYXB0ZXItPlN0YXRpc3RpY3NQb2ludGVyKTsKIAlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIERVTVBfSU5GTywgREJHX0xWTF9BTEwsICIlcyA8PT09PSIsX19GVU5DVElPTl9fKTsKIAlyZXR1cm47CiB9CkBAIC03NjQsNyArNzA0LDcgQEAKIAogCQkJLyogV2FrZSB0aGUgTEVEIFRocmVhZCB3aXRoIElETEVNT0RFX0VOVEVSIFN0YXRlICovCiAJCQlBZGFwdGVyLT5Ecml2ZXJTdGF0ZSA9IExPV1BPV0VSX01PREVfRU5URVI7Ci0JCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9SWCwgUlhfRFBDLCBEQkdfTFZMX0FMTCwiTEVEIFRocmVhZCBpcyBSdW5uaW5nLi5IZW5jZSBTZXR0aW5nIExFRCBFdmVudCBhcyBJRExFTU9ERV9FTlRFUiBqaWZmaWVzOiVsZCIsamlmZmllcyk7OworCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUlgsIFJYX0RQQywgREJHX0xWTF9BTEwsIkxFRCBUaHJlYWQgaXMgUnVubmluZy4uSGVuY2UgU2V0dGluZyBMRUQgRXZlbnQgYXMgSURMRU1PREVfRU5URVIgamlmZmllczolbGQiLGppZmZpZXMpOwogCQkJd2FrZV91cCgmQWRhcHRlci0+TEVESW5mby5ub3RpZnlfbGVkX2V2ZW50KTsKIAogCQkJLyogV2FpdCBmb3IgMSBTRUMgZm9yIExFRCB0byBPRkYgKi8KQEAgLTc4NywxMiArNzI3LDEwIEBACiAJCQlkb3duKCZBZGFwdGVyLT5yZG13cm1zeW5jKTsKIAkJCUFkYXB0ZXItPmJQcmVwYXJpbmdGb3JMb3dQb3dlck1vZGUgPSBUUlVFOwogCQkJdXAoJkFkYXB0ZXItPnJkbXdybXN5bmMpOwotI2lmbmRlZiBCQ01fU0hNX0lOVEVSRkFDRQogCQkJLy9LaWxsaW5nIGFsbCBVUkJTLgogCQkJaWYoQWRhcHRlci0+YkRvU3VzcGVuZCA9PSBUUlVFKQogCQkJCUJjbV9raWxsX2FsbF9VUkJzKChQU19JTlRFUkZBQ0VfQURBUFRFUikoQWRhcHRlci0+cHZJbnRlcmZhY2VBZGFwdGVyKSk7CiAKLSNlbmRpZgogCQl9CiAJCWVsc2UKIAkJewpAQCAtODExLDkgKzc0OSw3IEBACiAJewogCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsImZhaWwgdG8gc2VuZCB0aGUgSWRsZSBtb2RlIFJlcXVlc3QgXG4iKTsKIAkJQWRhcHRlci0+YlByZXBhcmluZ0Zvckxvd1Bvd2VyTW9kZSA9IEZBTFNFOwotI2lmbmRlZiBCQ01fU0hNX0lOVEVSRkFDRQogCQlTdGFydEludGVycnVwdFVyYigoUFNfSU5URVJGQUNFX0FEQVBURVIpKEFkYXB0ZXItPnB2SW50ZXJmYWNlQWRhcHRlcikpOwotI2VuZGlmCiAJfQogCWRvX2dldHRpbWVvZmRheSgmdHYpOwogCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1JYLCBSWF9EUEMsIERCR19MVkxfQUxMLCAiSWRsZU1vZGUgTXNnIHN1Ym1pdHRlciB0byBRIDolbGQgbXMiLCB0di50dl9zZWMgKjEwMDAgKyB0di50dl91c2VjIC8xMDAwKTsKQEAgLTk4MCwxMiArOTE2LDEwIEBACiAKIH0KIAotCi1fX2lubGluZSBpbnQgcmVzZXRfY2FyZF9wcm9jKFBNSU5JX0FEQVBURVIgcHNfYWRhcHRlcikKK2ludCByZXNldF9jYXJkX3Byb2MoUE1JTklfQURBUFRFUiBwc19hZGFwdGVyKQogewogCWludCByZXR2YWwgPSBTVEFUVVNfU1VDQ0VTUzsKIAotI2lmbmRlZiBCQ01fU0hNX0lOVEVSRkFDRQogICAgIFBNSU5JX0FEQVBURVIgQWRhcHRlciA9IEdFVF9CQ01fQURBUFRFUihnYmxwbmV0ZGV2KTsKIAlQU19JTlRFUkZBQ0VfQURBUFRFUiBwc0ludGZBZGFwdGVyID0gTlVMTDsKIAl1bnNpZ25lZCBpbnQgdmFsdWUgPSAwLCB1aVJlc2V0VmFsdWUgPSAwOwpAQCAtMTAwNiwxMSArOTQwLDkgQEAKIAkJd3JtYWx0KHBzX2FkYXB0ZXIsIFNZU19DRkcsICZ2YWx1ZSwgc2l6ZW9mKHZhbHVlKSk7CiAJfQogCi0jaWZuZGVmIEJDTV9TSE1fSU5URVJGQUNFCiAJLy9raWxsaW5nIGFsbCBzdWJtaXR0ZWQgVVJCcy4KIAlwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXItPlN0b3BBbGxYYWN0aW9uID0gVFJVRSA7CiAJQmNtX2tpbGxfYWxsX1VSQnMocHNJbnRmQWRhcHRlcik7Ci0jZW5kaWYKIAkvKiBSZXNldCB0aGUgVU1BLUIgRGV2aWNlICovCiAJaWYocHNfYWRhcHRlci0+Y2hpcF9pZCA+PSBUM0xQQikKIAl7CkBAIC0xMTExLDExICsxMDQzLDEwIEBACiAKIGVycl9leGl0IDoKIAlwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXItPlN0b3BBbGxYYWN0aW9uID0gRkFMU0UgOwotI2VuZGlmCiAJcmV0dXJuIHJldHZhbDsKIH0KIAotX19pbmxpbmUgaW50IHJ1bl9jYXJkX3Byb2MoUE1JTklfQURBUFRFUiBwc19hZGFwdGVyICkKK2ludCBydW5fY2FyZF9wcm9jKFBNSU5JX0FEQVBURVIgcHNfYWRhcHRlciApCiB7CiAJdW5zaWduZWQgaW50IHZhbHVlPTA7CiAJewpAQCAtMTE0NiwyMSArMTA3NywxNyBAQAogaW50IEluaXRDYXJkQW5kRG93bmxvYWRGaXJtd2FyZShQTUlOSV9BREFQVEVSIHBzX2FkYXB0ZXIpCiB7CiAKLQlVSU5UIHN0YXR1cyA9IFNUQVRVU19TVUNDRVNTOworCWludCBzdGF0dXM7CiAJVUlOVCB2YWx1ZSA9IDA7Ci0jaWZkZWYgQkNNX1NITV9JTlRFUkZBQ0UKLQl1bnNpZ25lZCBjaGFyICpwQ29uZmlnRmlsZUFkZHIgPSAodW5zaWduZWQgY2hhciAqKUNQRV9NQUNYVklfQ0ZHX0FERFI7Ci0jZW5kaWYKIAkvKgogIAkgKiBDcmVhdGUgdGhlIHRocmVhZHMgZmlyc3QgYW5kIHRoZW4gZG93bmxvYWQgdGhlCiAgCSAqIEZpcm0vRERSIFNldHRpbmdzLi4KICAJICovCiAKLQlpZigoc3RhdHVzID0gY3JlYXRlX3dvcmtlcl90aHJlYWRzKHBzX2FkYXB0ZXIpKTwwKQotCXsKLQkJQkNNX0RFQlVHX1BSSU5UKHBzX2FkYXB0ZXIsREJHX1RZUEVfSU5JVEVYSVQsIE1QX0lOSVQsIERCR19MVkxfQUxMLCAiQ2Fubm90IGNyZWF0ZSB0aHJlYWQiKTsKKwlzdGF0dXMgPSBjcmVhdGVfd29ya2VyX3RocmVhZHMocHNfYWRhcHRlcik7CisJaWYgKHN0YXR1czwwKQogCQlyZXR1cm4gc3RhdHVzOwotCX0KKwogCS8qCiAgCSAqIEZvciBEb3dubG9hZGluZyB0aGUgRmlybSwgcGFyc2UgdGhlIGNmZyBmaWxlIGZpcnN0LgogIAkgKi8KQEAgLTExNjksNyArMTA5Niw2IEBACiAJCXJldHVybiBzdGF0dXM7CiAJfQogCi0jaWZuZGVmIEJDTV9TSE1fSU5URVJGQUNFCiAJaWYocHNfYWRhcHRlci0+Y2hpcF9pZCA+PSBUM0xQQikKIAl7CiAJCXJkbWFsdChwc19hZGFwdGVyLCBTWVNfQ0ZHLCAmdmFsdWUsIHNpemVvZiAodmFsdWUpKTsKQEAgLTExODcsNyArMTExMyw3IEBACiAJc3RhdHVzID0gZGRyX2luaXQocHNfYWRhcHRlcik7CiAJaWYoc3RhdHVzKQogCXsKLQkJQkNNX0RFQlVHX1BSSU5UIChwc19hZGFwdGVyLERCR19UWVBFX0lOSVRFWElULCBNUF9JTklULCBEQkdfTFZMX0FMTCwgImRkcl9pbml0IEZhaWxlZFxuIik7CisJCXByX2VycihEUlZfTkFNRSAiZGRyX2luaXQgRmFpbGVkXG4iKTsKIAkJcmV0dXJuIHN0YXR1czsKIAl9CiAKQEAgLTEyMDEsNyArMTEyNyw2IEBACiAJCUJDTV9ERUJVR19QUklOVChwc19hZGFwdGVyLERCR19UWVBFX0lOSVRFWElULCBNUF9JTklULCBEQkdfTFZMX0FMTCwgIkVycm9yIGRvd25sb2FkaW5nIENGRyBmaWxlIik7CiAJCWdvdG8gT1VUOwogCX0KLQlCQ01fREVCVUdfUFJJTlQocHNfYWRhcHRlcixEQkdfVFlQRV9JTklURVhJVCwgTVBfSU5JVCwgREJHX0xWTF9BTEwsICJDRkcgZmlsZSBkb3dubG9hZGVkIik7CiAKIAlpZihyZWdpc3Rlcl9uZXR3b3JrZGV2KHBzX2FkYXB0ZXIpKQogCXsKQEAgLTEyNjYsMTIgKzExOTEsNiBAQAogCQkJZ290byBPVVQ7CiAJCX0KIAl9Ci0jaWYgMAotCWVsc2UgaWYocHNBZGFwdGVyLT5lTlZNVHlwZSA9PSBOVk1fRUVQUk9NKQotCXsKLQkJUHJvcGFnYXRlQ2FsUGFyYW1zRnJvbUVFUFJPTVRvTWVtb3J5KCk7Ci0JfQotI2VuZGlmCiAKIAkvKiBEb3dubG9hZCBGaXJtYXJlICovCiAJaWYgKChzdGF0dXMgPSBCY21GaWxlRG93bmxvYWQoIHBzX2FkYXB0ZXIsIEJJTl9GSUxFLCBGSVJNV0FSRV9CRUdJTl9BRERSKSkpCkBAIC0xMjgwLDcgKzExOTksNiBAQAogCQlnb3RvIE9VVDsKIAl9CiAKLQlCQ01fREVCVUdfUFJJTlQocHNfYWRhcHRlcixEQkdfVFlQRV9JTklURVhJVCwgTVBfSU5JVCwgREJHX0xWTF9BTEwsICJCSU4gZmlsZSBkb3dubG9hZGVkIik7CiAJc3RhdHVzID0gcnVuX2NhcmRfcHJvYyhwc19hZGFwdGVyKTsKIAlpZihzdGF0dXMpCiAJewpAQCAtMTI5OSw2OCArMTIxNywxOSBAQAogCQl3YWtlX3VwKCZwc19hZGFwdGVyLT5MRURJbmZvLm5vdGlmeV9sZWRfZXZlbnQpOwogCX0KIAotI2Vsc2UKLQotCXBzX2FkYXB0ZXItPmJERFJJbml0RG9uZSA9IFRSVUU7Ci0JLy9Jbml0aWFsaXppbmcgdGhlIE5WTS4KLQlCY21Jbml0TlZNKHBzX2FkYXB0ZXIpOwotCi0JLy9Qcm9wYWdhdGluZyB0aGUgY2FsIHBhcmFtIGZyb20gRmxhc2ggdG8gRERSCi0JdmFsdWUgPSAwOwotCXdybWFsdChwc19hZGFwdGVyLCBFRVBST01fQ0FMX0RBVEFfSU5URVJOQUxfTE9DIC0gNCwgJnZhbHVlLCBzaXplb2YodmFsdWUpKTsKLQl3cm1hbHQocHNfYWRhcHRlciwgRUVQUk9NX0NBTF9EQVRBX0lOVEVSTkFMX0xPQyAtIDgsICZ2YWx1ZSwgc2l6ZW9mKHZhbHVlKSk7Ci0KLQlpZihwc19hZGFwdGVyLT5lTlZNVHlwZSA9PSBOVk1fRkxBU0gpCi0JewotCQlzdGF0dXMgPSBQcm9wYWdhdGVDYWxQYXJhbXNGcm9tRmxhc2hUb01lbW9yeShwc19hZGFwdGVyKTsKLQkJaWYoc3RhdHVzKQotCQl7Ci0JCQlwcmludGsoIlxuUHJvcG9nYXRpb24gb2YgQ2FsIHBhcmFtIGZyb20gZmxhc2ggdG8gRERSIGZhaWxlZCAuLlxuIiApOwotCQl9Ci0JfQotCi0JLy9Db3B5IGNvbmZpZyBmaWxlIHBhcmFtIHRvIEREUi4KLQltZW1jcHkocENvbmZpZ0ZpbGVBZGRyLHBzX2FkYXB0ZXItPnBzdGFyZ2V0cGFyYW1zLCBzaXplb2YoU1RBUkdFVFBBUkFNUykpOwotCi0JaWYocmVnaXN0ZXJfbmV0d29ya2Rldihwc19hZGFwdGVyKSkKLQl7Ci0JCUJDTV9ERUJVR19QUklOVChwc19hZGFwdGVyLERCR19UWVBFX0lOSVRFWElULCBNUF9JTklULCBEQkdfTFZMX0FMTCwgIlJlZ2lzdGVyIE5ldGRldmljZSBmYWlsZWQuIENsZWFudXAgbmVlZHMgdG8gYmUgcGVyZm9ybWVkLiIpOwotCQlyZXR1cm4gLUVJTzsKLQl9Ci0KLQotCXN0YXR1cyA9IEluaXRMZWRTZXR0aW5ncyAocHNfYWRhcHRlcik7Ci0JaWYoc3RhdHVzKQotCXsKLQkJQkNNX0RFQlVHX1BSSU5UKHBzX2FkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCJJTklUIExFRCBGQUlMRURcbiIpOwotCQlyZXR1cm4gc3RhdHVzOwotCX0KLQotCi0JaWYocmVnaXN0ZXJfY29udHJvbF9kZXZpY2VfaW50ZXJmYWNlKHBzX2FkYXB0ZXIpIDwgMCkKLQl7Ci0JCUJDTV9ERUJVR19QUklOVChwc19hZGFwdGVyLERCR19UWVBFX0lOSVRFWElULCBNUF9JTklULCBEQkdfTFZMX0FMTCwgIlJlZ2lzdGVyIENvbnRyb2wgRGV2aWNlIGZhaWxlZC4gQ2xlYW51cCBuZWVkcyB0byBiZSBwZXJmb3JtZWQuIik7Ci0JCXJldHVybiAtRUlPOwotCX0KLQotCXBzX2FkYXB0ZXItPmZ3X2Rvd25sb2FkX2RvbmUgPSBUUlVFOwotI2VuZGlmCiAJcmV0dXJuIHN0YXR1czsKIH0KIAogCi1pbnQgYmNtX3BhcnNlX3RhcmdldF9wYXJhbXMoUE1JTklfQURBUFRFUiBBZGFwdGVyKQorc3RhdGljIGludCBiY21fcGFyc2VfdGFyZ2V0X3BhcmFtcyhQTUlOSV9BREFQVEVSIEFkYXB0ZXIpCiB7Ci0jaWZkZWYgQkNNX1NITV9JTlRFUkZBQ0UKLQlleHRlcm4gdm9pZCByZWFkX2NmZ19maWxlKFBNSU5JX0FEQVBURVIgQWRhcHRlcik7Ci0jZW5kaWYKIAlzdHJ1Y3QgZmlsZSAJCSpmbHA9TlVMTDsKIAltbV9zZWdtZW50X3QgCW9sZGZzPXswfTsKLQljaGFyICpidWZmID0gTlVMTDsKKwljaGFyICpidWZmOwogCWludCBsZW4gPSAwOwogCWxvZmZfdAlwb3MgPSAwOwogCi0JYnVmZj0oUENIQVIpa21hbGxvYyhCVUZGRVJfMUssIEdGUF9LRVJORUwpOworCWJ1ZmY9a21hbGxvYyhCVUZGRVJfMUssIEdGUF9LRVJORUwpOwogCWlmKCFidWZmKQogCXsKIAkJcmV0dXJuIC1FTk9NRU07CkBAIC0xMzY4LDE0ICsxMjM3LDE0IEBACiAJaWYoKEFkYXB0ZXItPnBzdGFyZ2V0cGFyYW1zID0KIAkJa21hbGxvYyhzaXplb2YoU1RBUkdFVFBBUkFNUyksIEdGUF9LRVJORUwpKSA9PSBOVUxMKQogCXsKLQkJYmNtX2tmcmVlKGJ1ZmYpOworCQlrZnJlZShidWZmKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCWZscD1vcGVuX2Zpcm13YXJlX2ZpbGUoQWRhcHRlciwgQ0ZHX0ZJTEUpOwogCWlmKCFmbHApIHsKIAkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfSU5JVEVYSVQsIE1QX0lOSVQsIERCR19MVkxfQUxMLCAiTk9UIEFCTEUgVE8gT1BFTiBUSEUgJXMgRklMRSBcbiIsIENGR19GSUxFKTsKLQkJYmNtX2tmcmVlKGJ1ZmYpOwotCQliY21fa2ZyZWUoQWRhcHRlci0+cHN0YXJnZXRwYXJhbXMpOworCQlrZnJlZShidWZmKTsKKwkJa2ZyZWUoQWRhcHRlci0+cHN0YXJnZXRwYXJhbXMpOwogCQlBZGFwdGVyLT5wc3RhcmdldHBhcmFtcyA9IE5VTEw7CiAJCXJldHVybiAtRU5PRU5UOwogCX0KQEAgLTEzODYsOCArMTI1NSw4IEBACiAJaWYobGVuICE9IHNpemVvZihTVEFSR0VUUEFSQU1TKSkKIAl7CiAJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX0lOSVRFWElULCBNUF9JTklULCBEQkdfTFZMX0FMTCwiTWlzbWF0Y2ggaW4gVGFyZ2V0IFBhcmFtIFN0cnVjdHVyZSFcbiIpOwotCQliY21fa2ZyZWUoYnVmZik7Ci0JCWJjbV9rZnJlZShBZGFwdGVyLT5wc3RhcmdldHBhcmFtcyk7CisJCWtmcmVlKGJ1ZmYpOworCQlrZnJlZShBZGFwdGVyLT5wc3RhcmdldHBhcmFtcyk7CiAJCUFkYXB0ZXItPnBzdGFyZ2V0cGFyYW1zID0gTlVMTDsKIAkJZmlscF9jbG9zZShmbHAsIGN1cnJlbnQtPmZpbGVzKTsKIAkJcmV0dXJuIC1FTk9FTlQ7CkBAIC0xMzk5LDM3ICsxMjY4LDM0IEBACiAJICogVmFsdWVzIGluIEFkYXB0ZXItPnBzdGFyZ2V0cGFyYW1zIGFyZSBpbiBuZXR3b3JrIGJ5dGUgb3JkZXIKIAkgKi8KIAltZW1jcHkoQWRhcHRlci0+cHN0YXJnZXRwYXJhbXMsIGJ1ZmYsIHNpemVvZihTVEFSR0VUUEFSQU1TKSk7Ci0JYmNtX2tmcmVlIChidWZmKTsKKwlrZnJlZSAoYnVmZik7CiAJYmVjZWVtX3BhcnNlX3RhcmdldF9zdHJ1Y3QoQWRhcHRlcik7Ci0jaWZkZWYgQkNNX1NITV9JTlRFUkZBQ0UKLQlyZWFkX2NmZ19maWxlKEFkYXB0ZXIpOwotCi0jZW5kaWYKIAlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7CiB9CiAKIHZvaWQgYmVjZWVtX3BhcnNlX3RhcmdldF9zdHJ1Y3QoUE1JTklfQURBUFRFUiBBZGFwdGVyKQogewotCVVJTlQgdWlIb3N0RHJ2ckNmZzYgPTAsIHVpRUVQUk9NRmxhZyA9IDA7OworCVVJTlQgdWlIb3N0RHJ2ckNmZzYgPTAsIHVpRUVQUk9NRmxhZyA9IDA7CiAKIAlpZihudG9obChBZGFwdGVyLT5wc3RhcmdldHBhcmFtcy0+bV91MzJQaHlQYXJhbWV0ZXIyKSAmIEFVVE9fU1lOQ19ESVNBQkxFKQogCXsKLQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfSU5JVEVYSVQsIE1QX0lOSVQsIERCR19MVkxfQUxMLCAiQXV0b1N5bmN1cCBpcyBEaXNhYmxlZFxuIik7CisJCXByX2luZm8oRFJWX05BTUUgIjogQXV0b1N5bmN1cCBpcyBEaXNhYmxlZFxuIik7CiAJCUFkYXB0ZXItPkF1dG9TeW5jdXAgPSBGQUxTRTsKIAl9CiAJZWxzZQogCXsKLQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfSU5JVEVYSVQsIE1QX0lOSVQsIERCR19MVkxfQUxMLCAiQXV0b1N5bmN1cCBpcyBFbmFibGVkXG4iKTsKKwkJcHJfaW5mbyhEUlZfTkFNRSAiOiBBdXRvU3luY3VwIGlzIEVuYWJsZWRcbiIpOwogCQlBZGFwdGVyLT5BdXRvU3luY3VwCT0gVFJVRTsKIAl9CisKIAlpZihudG9obChBZGFwdGVyLT5wc3RhcmdldHBhcmFtcy0+SG9zdERydnJDb25maWc2KSAmIEFVVE9fTElOS1VQX0VOQUJMRSkKIAl7Ci0JCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX0lOSVRFWElULCBNUF9JTklULCBEQkdfTFZMX0FMTCwgIkVuYWJsaW5nIGF1dG9saW5rIHVwIik7CisJCXByX2luZm8oRFJWX05BTUUgIjogRW5hYmxpbmcgYXV0b2xpbmsgdXAiKTsKIAkJQWRhcHRlci0+QXV0b0xpbmtVcCA9IFRSVUU7CiAJfQogCWVsc2UKIAl7Ci0JCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX0lOSVRFWElULCBNUF9JTklULCBEQkdfTFZMX0FMTCwgIkRpc2FibGluZyBhdXRvbGluayB1cCIpOworCQlwcl9pbmZvKERSVl9OQU1FICI6IERpc2FibGluZyBhdXRvbGluayB1cCIpOwogCQlBZGFwdGVyLT5BdXRvTGlua1VwID0gRkFMU0U7CiAJfQogCS8vIFNldHRpbmcgdGhlIEREUiBTZXR0aW5nLi4KQEAgLTE0MzgsNTkgKzEzMDQsNTQgQEAKIAlBZGFwdGVyLT51bFBvd2VyU2F2ZU1vZGUgPQogCQkJKG50b2hsKEFkYXB0ZXItPnBzdGFyZ2V0cGFyYW1zLT5Ib3N0RHJ2ckNvbmZpZzYpPj4xMikmMHgwRjsKIAotCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX0lOSVRFWElULCBNUF9JTklULCBEQkdfTFZMX0FMTCwgIkREUiBTZXR0aW5nOiAleFxuIiwgQWRhcHRlci0+RERSU2V0dGluZyk7Ci0JQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfSU5JVEVYSVQsIE1QX0lOSVQsREJHX0xWTF9BTEwsICJQb3dlciBTYXZlIE1vZGU6ICVseFxuIiwKLQkJCQkJCQlBZGFwdGVyLT51bFBvd2VyU2F2ZU1vZGUpOworCXByX2luZm8oRFJWX05BTUUgIjogRERSIFNldHRpbmc6ICV4XG4iLCBBZGFwdGVyLT5ERFJTZXR0aW5nKTsKKwlwcl9pbmZvKERSVl9OQU1FICI6IFBvd2VyIFNhdmUgTW9kZTogJWx4XG4iLCBBZGFwdGVyLT51bFBvd2VyU2F2ZU1vZGUpOwogCWlmKG50b2hsKEFkYXB0ZXItPnBzdGFyZ2V0cGFyYW1zLT5Ib3N0RHJ2ckNvbmZpZzYpICYgQVVUT19GSVJNX0RPV05MT0FEKQogICAgIHsKLSAgICAgICAgQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfSU5JVEVYSVQsIE1QX0lOSVQsIERCR19MVkxfQUxMLCAiRW5hYmxpbmcgQXV0byBGaXJtd2FyZSBEb3dubG9hZFxuIik7CisgICAgICAgIHByX2luZm8oRFJWX05BTUUgIjogRW5hYmxpbmcgQXV0byBGaXJtd2FyZSBEb3dubG9hZFxuIik7CiAgICAgICAgIEFkYXB0ZXItPkF1dG9GaXJtRGxkID0gVFJVRTsKICAgICB9CiAgICAgZWxzZQogICAgIHsKLSAgICAgICAgQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfSU5JVEVYSVQsIE1QX0lOSVQsIERCR19MVkxfQUxMLCAiRGlzYWJsaW5nIEF1dG8gRmlybXdhcmUgRG93bmxvYWRcbiIpOworICAgICAgICBwcl9pbmZvKERSVl9OQU1FICI6IERpc2FibGluZyBBdXRvIEZpcm13YXJlIERvd25sb2FkXG4iKTsKICAgICAgICAgQWRhcHRlci0+QXV0b0Zpcm1EbGQgPSBGQUxTRTsKICAgICB9CiAJdWlIb3N0RHJ2ckNmZzYgPSBudG9obChBZGFwdGVyLT5wc3RhcmdldHBhcmFtcy0+SG9zdERydnJDb25maWc2KTsKIAlBZGFwdGVyLT5iTWlwc0NvbmZpZyA9ICh1aUhvc3REcnZyQ2ZnNj4+MjApJjB4MDE7Ci0JQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfSU5JVEVYSVQsIE1QX0lOSVQsIERCR19MVkxfQUxMLCJNSVBTQ29uZmlnICAgOiAweCVYXG4iLEFkYXB0ZXItPmJNaXBzQ29uZmlnKTsKKwlwcl9pbmZvKERSVl9OQU1FICI6IE1JUFNDb25maWcgICA6IDB4JVhcbiIsQWRhcHRlci0+Yk1pcHNDb25maWcpOwogCS8vdXNlZCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4KIAlBZGFwdGVyLT5iRFBMTENvbmZpZyA9ICh1aUhvc3REcnZyQ2ZnNj4+MTkpJjB4MDE7CiAKIAlBZGFwdGVyLT5QbXVNb2RlPSAodWlIb3N0RHJ2ckNmZzYgPj4gMjQgKSAmIDB4MDM7Ci0JQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfSU5JVEVYSVQsIE1QX0lOSVQsIERCR19MVkxfQUxMLCAiUE1VIE1PREU6ICV4IiwgQWRhcHRlci0+UG11TW9kZSk7CisJcHJfaW5mbyhEUlZfTkFNRSAiOiBQTVUgTU9ERTogJXgiLCBBZGFwdGVyLT5QbXVNb2RlKTsKIAogICAgIGlmKCh1aUhvc3REcnZyQ2ZnNiA+PiBIT1NUX0JVU19TVVNQRU5EX0JJVCApICYgKDB4MDEpKQogICAgIHsKICAgICAgICAgQWRhcHRlci0+YkRvU3VzcGVuZCA9IFRSVUU7Ci0gICAgICAgIEJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX0lOSVRFWElULCBNUF9JTklULCBEQkdfTFZMX0FMTCwgIk1ha2luZyBEb1N1c3BlbmQgVFJVRSBhcyBwZXIgY29uZmlnRmlsZSIpOworICAgICAgICBwcl9pbmZvKERSVl9OQU1FICI6IE1ha2luZyBEb1N1c3BlbmQgVFJVRSBhcyBwZXIgY29uZmlnRmlsZSIpOwogICAgIH0KIAogCXVpRUVQUk9NRmxhZyA9IG50b2hsKEFkYXB0ZXItPnBzdGFyZ2V0cGFyYW1zLT5tX3UzMkVFUFJPTUZsYWcpOwotCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX0lOSVRFWElULCBNUF9JTklULCBEQkdfTFZMX0FMTCwgInVpRUVQUk9NRmxhZyAgOiAweCVYXG4iLHVpRUVQUk9NRmxhZyk7CisJcHJfaW5mbyhEUlZfTkFNRSAiOiB1aUVFUFJPTUZsYWcgIDogMHglWFxuIix1aUVFUFJPTUZsYWcpOwogCUFkYXB0ZXItPmVOVk1UeXBlID0gKE5WTV9UWVBFKSgodWlFRVBST01GbGFnPj40KSYweDMpOwogCi0KIAlBZGFwdGVyLT5iU3RhdHVzV3JpdGUgPSAodWlFRVBST01GbGFnPj42KSYweDE7Ci0JLy9wcmludGsoKCJiU3RhdHVzV3JpdGUgICA6IDB4JVhcbiIsIEFkYXB0ZXItPmJTdGF0dXNXcml0ZSkpOwogCiAJQWRhcHRlci0+dWlTZWN0b3JTaXplSW5DRkcgPSAxMDI0KigweEZGRkYgJiBudG9obChBZGFwdGVyLT5wc3RhcmdldHBhcmFtcy0+SG9zdERydnJDb25maWc0KSk7Ci0JLy9wcmludGsoKCJ1aVNlY3RvclNpemUgICA6IDB4JVhcbiIsIEFkYXB0ZXItPnVpU2VjdG9yU2l6ZUluQ0ZHKSk7CiAKIAlBZGFwdGVyLT5iU2VjdG9yU2l6ZU92ZXJyaWRlID0oYm9vbCkgKChudG9obChBZGFwdGVyLT5wc3RhcmdldHBhcmFtcy0+SG9zdERydnJDb25maWc0KSk+PjE2KSYweDE7Ci0JLy9wcmludGsoTVBfSU5JVCwoImJTZWN0b3JTaXplT3ZlcnJpZGUgICA6IDB4JVhcbiIsQWRhcHRlci0+YlNlY3RvclNpemVPdmVycmlkZSkpOwogCiAJaWYobnRvaGwoQWRhcHRlci0+cHN0YXJnZXRwYXJhbXMtPm1fdTMyUG93ZXJTYXZpbmdNb2RlT3B0aW9ucykgJjB4MDEpCiAJCUFkYXB0ZXItPnVsUG93ZXJTYXZlTW9kZSA9IERFVklDRV9QT1dFUlNBVkVfTU9ERV9BU19QUk9UT0NPTF9JRExFX01PREU7Ci0JLy9hdXRvY29ycmVjdGlvbiBwYXJ0CisKIAlpZihBZGFwdGVyLT51bFBvd2VyU2F2ZU1vZGUgIT0gREVWSUNFX1BPV0VSU0FWRV9NT0RFX0FTX1BST1RPQ09MX0lETEVfTU9ERSkKIAkJZG9Qb3dlckF1dG9Db3JyZWN0aW9uKEFkYXB0ZXIpOwogCiB9CiAKLVZPSUQgZG9Qb3dlckF1dG9Db3JyZWN0aW9uKFBNSU5JX0FEQVBURVIgcHNBZGFwdGVyKQorc3RhdGljIFZPSUQgZG9Qb3dlckF1dG9Db3JyZWN0aW9uKFBNSU5JX0FEQVBURVIgcHNBZGFwdGVyKQogewotCVVJTlQgcmVwb3J0aW5nX21vZGUgPSAwOworCVVJTlQgcmVwb3J0aW5nX21vZGU7CiAKIAlyZXBvcnRpbmdfbW9kZSA9IG50b2hsKHBzQWRhcHRlci0+cHN0YXJnZXRwYXJhbXMtPm1fdTMyUG93ZXJTYXZpbmdNb2RlT3B0aW9ucykgJjB4MDIgOwogCXBzQWRhcHRlci0+YklzQXV0b0NvcnJlY3RFbmFibGVkID0gISgoY2hhcikocHNBZGFwdGVyLT51bFBvd2VyU2F2ZU1vZGUgPj4gMykgJiAweDEpOwpAQCAtMTUwNCwyMCArMTM2NSw5IEBACiAJaWYgKHBzQWRhcHRlci0+YklzQXV0b0NvcnJlY3RFbmFibGVkICYmIChwc0FkYXB0ZXItPmNoaXBfaWQgPj0gVDNMUEIpKQogCXsKIAkJLy9JZiByZXBvcnRpbmcgbW9kZSBpcyBlbmFibGUsIHN3aXRjaCBQTVUgdG8gUE1DCi0JCSNpZiAwCi0JCWlmKHJlcG9ydGluZ19tb2RlID09IEZBTFNFKQotCQl7Ci0JCQlwc0FkYXB0ZXItPnVsUG93ZXJTYXZlTW9kZSA9IERFVklDRV9QT1dFUlNBVkVfTU9ERV9BU19QTVVfU0hVVERPV047Ci0JCQlwc0FkYXB0ZXItPmJEb1N1c3BlbmQgPSBUUlVFOwotCQkJQkNNX0RFQlVHX1BSSU5UKHBzQWRhcHRlcixEQkdfVFlQRV9JTklURVhJVCwgTVBfSU5JVCwgREJHX0xWTF9BTEwsIlBNVSBzZWxlY3RlZCAuLi4uIik7Ci0KLQkJfQotCQllbHNlCi0JCSNlbmRpZgogCQl7CiAJCQlwc0FkYXB0ZXItPnVsUG93ZXJTYXZlTW9kZSA9IERFVklDRV9QT1dFUlNBVkVfTU9ERV9BU19QTVVfQ0xPQ0tfR0FUSU5HOwogCQkJcHNBZGFwdGVyLT5iRG9TdXNwZW5kID1GQUxTRTsKLQkJCUJDTV9ERUJVR19QUklOVChwc0FkYXB0ZXIsREJHX1RZUEVfSU5JVEVYSVQsIE1QX0lOSVQsIERCR19MVkxfQUxMLCJQTUMgc2VsZWN0ZWQuLiIpOwogCiAJCX0KIApAQCAtMTU0MCwxMiArMTM5MCwxMCBAQAogI2lmIDAKIHN0YXRpYyB1bnNpZ25lZCBjaGFyICpSZWFkTWFjQWRkckVFUFJPTShQTUlOSV9BREFQVEVSIEFkYXB0ZXIsIHVsb25nIGR3QWRkcmVzcykKIHsKLQl1bnNpZ25lZCBjaGFyICpwdWNtYWNhZGRyID0gTlVMTDsKLQlpbnQgc3RhdHVzID0gMCwgaT0wOwotCXVuc2lnbmVkIGludCB0ZW1wID0wOworCWludCBzdGF0dXMgPSAwLCBpID0gMDsKKwl1bnNpZ25lZCBpbnQgdGVtcCA9IDA7CisJdW5zaWduZWQgY2hhciAqcHVjbWFjYWRkciA9IGttYWxsb2MoTUFDX0FERFJFU1NfU0laRSwgR0ZQX0tFUk5FTCk7CiAKLQotCXB1Y21hY2FkZHIgPSAodW5zaWduZWQgY2hhciAqKWttYWxsb2MoTUFDX0FERFJFU1NfU0laRSwgR0ZQX0tFUk5FTCk7CiAJaWYoIXB1Y21hY2FkZHIpCiAJewogCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsICJObyBCdWZmZXJzIHRvIFJlYWQgdGhlIEVFUFJPTSBBZGRyZXNzXG4iKTsKQEAgLTE1NTgsNyArMTQwNiw3IEBACiAJaWYoc3RhdHVzICE9IFNUQVRVU19TVUNDRVNTKQogCXsKIAkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAid3JtIEZhaWxlZC4uXG4iKTsKLQkJYmNtX2tmcmVlKHB1Y21hY2FkZHIpOworCQlrZnJlZShwdWNtYWNhZGRyKTsKIAkJcHVjbWFjYWRkciA9IE5VTEw7CiAJCWdvdG8gT1VUOwogCX0KQEAgLTE1NjgsNyArMTQxNiw3IEBACiAJCWlmKHN0YXR1cyAhPSBTVEFUVVNfU1VDQ0VTUykKIAkJewogCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAicmRtIEZhaWxlZC4uXG4iKTsKLQkJCWJjbV9rZnJlZShwdWNtYWNhZGRyKTsKKwkJCWtmcmVlKHB1Y21hY2FkZHIpOwogCQkJcHVjbWFjYWRkciA9IE5VTEw7CiAJCQlnb3RvIE9VVDsKIAkJfQpAQCAtMTU4MCw0MyArMTQyOCw2IEBACiB9CiAjZW5kaWYKIAotI2lmIDAKLUlOVCBSZWFkTWFjQWRkcmVzc0Zyb21FRVBST00oUE1JTklfQURBUFRFUiBBZGFwdGVyKQotewotCXVuc2lnbmVkIGNoYXIgKnB1TWFjQWRkciA9IE5VTEw7Ci0JaW50IGkgPTA7Ci0KLQlwdU1hY0FkZHIgPSBSZWFkTWFjQWRkckVFUFJPTShBZGFwdGVyLDB4MjAwKTsKLQlpZighcHVNYWNBZGRyKQotCXsKLQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfVFgsIE5FWFRfU0VORCwgREJHX0xWTF9BTEwsICJDb3VsZG4ndCByZXRyaWV2ZSB0aGUgTWFjIEFkZHJlc3NcbiIpOwotCQlyZXR1cm4gU1RBVFVTX0ZBSUxVUkU7Ci0JfQotCWVsc2UKLQl7Ci0JCWlmKChwdU1hY0FkZHJbMF0gPT0gMHgwICAmJiBwdU1hY0FkZHJbMV0gPT0gMHgwICAmJgotCQkJcHVNYWNBZGRyWzJdID09IDB4MCAgJiYgcHVNYWNBZGRyWzNdID09IDB4MCAgJiYKLQkJCXB1TWFjQWRkcls0XSA9PSAweDAgICYmIHB1TWFjQWRkcls1XSA9PSAweDApIHx8Ci0JCSAgIChwdU1hY0FkZHJbMF0gPT0gMHhGRiAmJiBwdU1hY0FkZHJbMV0gPT0gMHhGRiAmJgotCQkJcHVNYWNBZGRyWzJdID09IDB4RkYgJiYgcHVNYWNBZGRyWzNdID09IDB4RkYgJiYKLQkJCXB1TWFjQWRkcls0XSA9PSAweEZGICYmIHB1TWFjQWRkcls1XSA9PSAweEZGKSkKLQkJewotCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfVFgsIE5FWFRfU0VORCwgREJHX0xWTF9BTEwsICJJbnZhbGlkIE1hYyBBZGRyZXNzXG4iKTsKLQkJCWJjbV9rZnJlZShwdU1hY0FkZHIpOwotCQkJcmV0dXJuIFNUQVRVU19GQUlMVVJFOwotCQl9Ci0JCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1RYLCBORVhUX1NFTkQsIERCR19MVkxfQUxMLCAiVGhlIE1hYyBBZGRyZXNzIHJlY2VpdmVkIGlzOiBcbiIpOwotCQltZW1jcHkoQWRhcHRlci0+ZGV2LT5kZXZfYWRkciwgcHVNYWNBZGRyLCBNQUNfQUREUkVTU19TSVpFKTsKLSAgICAgICAgZm9yKGk9MDtpPE1BQ19BRERSRVNTX1NJWkU7aSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsIiUwMnggIiwgQWRhcHRlci0+ZGV2LT5kZXZfYWRkcltpXSk7Ci0gICAgICAgIH0KLSAgICAgICAgQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCJcbiIpOwotCQliY21fa2ZyZWUocHVNYWNBZGRyKTsKLQl9Ci0JcmV0dXJuIFNUQVRVU19TVUNDRVNTOwotfQotI2VuZGlmCiAKIHN0YXRpYyB2b2lkIGNvbnZlcnRFbmRpYW4oQl9VSU5UOCByd0ZsYWcsIFBVSU5UIHB1aUJ1ZmZlciwgVUlOVCB1aUJ5dGVDb3VudCkKIHsKQEAgLTE2NDAsODEgKzE0NTEsMjEgQEAKIHsKIAlJTlQgdWlSZXRWYWwgPTA7CiAKLSNpZm5kZWYgQkNNX1NITV9JTlRFUkZBQ0UKIAl1aVJldFZhbCA9IEFkYXB0ZXItPmludGVyZmFjZV9yZG0oQWRhcHRlci0+cHZJbnRlcmZhY2VBZGFwdGVyLAogCQkJdWlBZGRyZXNzLCBwdWNCdWZmLCBzU2l6ZSk7CiAKIAlpZih1aVJldFZhbCA8IDApCiAJCXJldHVybiB1aVJldFZhbDsKIAotI2Vsc2UKLQlpbnQgaW5keDsKLQl1aVJldFZhbCA9IFNUQVRVU19TVUNDRVNTOwotCWlmKHVpQWRkcmVzcyAmIDB4MTAwMDAwMDApIHsKLQkJCS8vIEREUiBNZW1vcnkgQWNjZXNzCi0JCXVpQWRkcmVzcyB8PSBDQUNIRV9BRERSRVNTX01BU0s7Ci0JCW1lbWNweShwdWNCdWZmLCh1bnNpZ25lZCBjaGFyICopdWlBZGRyZXNzICxzU2l6ZSk7Ci0JfQotCWVsc2UgewotCQkvLyBSZWdpc3RlciwgU1BSQU0sIEZsYXNoCi0JCXVpQWRkcmVzcyB8PSBVTkNBQ0hFX0FERFJFU1NfTUFTSzsKLSAgICBpZiAoKHVpQWRkcmVzcyAmIEZMQVNIX0FERFJfTUFTSykgPT0gKEZMQVNIX0NPTlRJR0lPVVNfU1RBUlRfQUREUl9CQ1MzNTAgJiBGTEFTSF9BRERSX01BU0spKQotCXsKLQkJI2lmIGRlZmluZWQoRkxBU0hfRElSRUNUX0FDQ0VTUykKLSAgICAgICAgCW1lbWNweShwdWNCdWZmLCh1bnNpZ25lZCBjaGFyICopdWlBZGRyZXNzICxzU2l6ZSk7Ci0JCSNlbHNlCi0JCQlwcmludGsoIlxuSW52YWxpZCBHU1BJIEFDQ0VTUyA6QWRkciA6JSNYIiwgdWlBZGRyZXNzKTsKLQkJCXVpUmV0VmFsID0gU1RBVFVTX0ZBSUxVUkU7Ci0JCSNlbmRpZgotCX0KLSAgICBlbHNlIGlmKCgodW5zaWduZWQgaW50ICl1aUFkZHJlc3MgJiAweDMpIHx8Ci0JCQkoKHVuc2lnbmVkIGludCApcHVjQnVmZiAmIDB4MykgfHwKLQkJCSgodW5zaWduZWQgaW50IClzU2l6ZSAmIDB4MykpIHsKLQkJICAJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCJyZG1hbHQgOnVuYWxsaWduZWQgcmVnaXN0ZXIgYWNjZXNzIHVpQWRkcmVzcyA9ICAleCxwdWNCdWZmID0gJXggIHNpemUgPSAleFxuIiwodW5zaWduZWQgaW50ICl1aUFkZHJlc3MsKHVuc2lnbmVkIGludCApcHVjQnVmZiwodW5zaWduZWQgaW50IClzU2l6ZSk7Ci0JCQkgdWlSZXRWYWwgPSBTVEFUVVNfRkFJTFVSRTsKLQkJfQotCQllbHNlIHsKLQkJIAlmb3IgKGluZHg9MDtpbmR4PHNTaXplO2luZHgrPTQpewotCQkgICAJCSooUFVJTlQpKHB1Y0J1ZmYgKyBpbmR4KSA9ICooUFVJTlQpKHVpQWRkcmVzcyArIGluZHgpOwotCQkgIAl9Ci0JCX0KLQl9Ci0jZW5kaWYKIAlyZXR1cm4gdWlSZXRWYWw7CiB9CiBpbnQgd3JtKFBNSU5JX0FEQVBURVIgQWRhcHRlciwgVUlOVCB1aUFkZHJlc3MsIFBDSEFSIHB1Y0J1ZmYsIHNpemVfdCBzU2l6ZSkKIHsKIAlpbnQgaVJldFZhbDsKIAotI2lmbmRlZiBCQ01fU0hNX0lOVEVSRkFDRQogCWlSZXRWYWwgPSBBZGFwdGVyLT5pbnRlcmZhY2Vfd3JtKEFkYXB0ZXItPnB2SW50ZXJmYWNlQWRhcHRlciwKIAkJCXVpQWRkcmVzcywgcHVjQnVmZiwgc1NpemUpOwogCi0jZWxzZQotCWludCBpbmR4OwotCWlmKHVpQWRkcmVzcyAmIDB4MTAwMDAwMDApIHsKLQkJLy8gRERSIE1lbW9yeSBBY2Nlc3MKLQkJdWlBZGRyZXNzIHw9IENBQ0hFX0FERFJFU1NfTUFTSzsKLQkJbWVtY3B5KCh1bnNpZ25lZCBjaGFyICopKHVpQWRkcmVzcykscHVjQnVmZixzU2l6ZSk7Ci0JfQotCWVsc2UgewotCQkvLyBSZWdpc3RlciwgU1BSQU0sIEZsYXNoCi0JCXVpQWRkcmVzcyB8PSBVTkNBQ0hFX0FERFJFU1NfTUFTSzsKLQotCQlpZigoKHVuc2lnbmVkIGludCApdWlBZGRyZXNzICYgMHgzKSB8fAotCQkJKCh1bnNpZ25lZCBpbnQgKXB1Y0J1ZmYgJiAweDMpIHx8Ci0JCQkoKHVuc2lnbmVkIGludCApc1NpemUgJiAweDMpKSB7Ci0JCSAgCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsIndybWFsdDogdW5hbGxpZ25lZCByZWdpc3RlciBhY2Nlc3MgdWlBZGRyZXNzID0gICV4LHB1Y0J1ZmYgPSAleCAgc2l6ZSA9ICV4XG4iLCh1bnNpZ25lZCBpbnQgKXVpQWRkcmVzcywodW5zaWduZWQgaW50IClwdWNCdWZmLCh1bnNpZ25lZCBpbnQgKXNTaXplKTsKLQkJCSBpUmV0VmFsID0gU1RBVFVTX0ZBSUxVUkU7Ci0JCX0KLQkJZWxzZSB7Ci0JCSAJZm9yIChpbmR4PTA7aW5keDxzU2l6ZTtpbmR4Kz00KSB7Ci0JCSAgCQkqKFBVSU5UKSh1aUFkZHJlc3MgKyBpbmR4KSA9ICooUFVJTlQpKHB1Y0J1ZmYgKyBpbmR4KTsKLQkJCX0KLQkJfQotCX0KLQlpUmV0VmFsID0gU1RBVFVTX1NVQ0NFU1M7Ci0jZW5kaWYKIAogCXJldHVybiBpUmV0VmFsOwogfQpAQCAtMTczNSwyNiArMTQ4Niw3IEBACiAJcmV0dXJuIHVpUmV0VmFsOwogfQogCi1pbnQgcmRtV2l0aExvY2soUE1JTklfQURBUFRFUiBBZGFwdGVyLCBVSU5UIHVpQWRkcmVzcywgUENIQVIgcHVjQnVmZiwgc2l6ZV90IHNTaXplKQotewogCi0JSU5UIHN0YXR1cyA9IFNUQVRVU19TVUNDRVNTIDsKLQlkb3duKCZBZGFwdGVyLT5yZG13cm1zeW5jKTsKLQotCWlmKChBZGFwdGVyLT5JZGxlTW9kZSA9PSBUUlVFKSB8fAotCQkoQWRhcHRlci0+YlNodXRTdGF0dXMgPT1UUlVFKSB8fAotCQkoQWRhcHRlci0+YlByZXBhcmluZ0Zvckxvd1Bvd2VyTW9kZSA9PVRSVUUpKQotCXsKLQkJc3RhdHVzID0gLUVBQ0NFUzsKLQkJZ290byBleGl0OwotCX0KLQotCXN0YXR1cyA9IHJkbShBZGFwdGVyLCB1aUFkZHJlc3MsIHB1Y0J1ZmYsIHNTaXplKTsKLQotZXhpdDoKLQl1cCgmQWRhcHRlci0+cmRtd3Jtc3luYyk7Ci0JcmV0dXJuIHN0YXR1cyA7Ci19CiBpbnQgd3JtV2l0aExvY2soUE1JTklfQURBUFRFUiBBZGFwdGVyLCBVSU5UIHVpQWRkcmVzcywgUENIQVIgcHVjQnVmZiwgc2l6ZV90IHNTaXplKQogewogCUlOVCBzdGF0dXMgPSBTVEFUVVNfU1VDQ0VTUyA7CkBAIC0xOTIxLDEwICsxNjUzLDggQEAKIAkJCUFkYXB0ZXItPmJQcmVwYXJpbmdGb3JMb3dQb3dlck1vZGUgPSBUUlVFOwogCQkJdXAoJkFkYXB0ZXItPnJkbXdybXN5bmMpOwogCQkJLy9LaWxsaW5nIGFsbCBVUkJTLgotI2lmbmRlZiBCQ01fU0hNX0lOVEVSRkFDRQogCQkJaWYoQWRhcHRlci0+YkRvU3VzcGVuZCA9PSBUUlVFKQogCQkJCUJjbV9raWxsX2FsbF9VUkJzKChQU19JTlRFUkZBQ0VfQURBUFRFUikoQWRhcHRlci0+cHZJbnRlcmZhY2VBZGFwdGVyKSk7Ci0jZW5kaWYKIAkJfQogCQllbHNlCiAJCXsKQEAgLTE5NDMsMTQgKzE2NzMsMTIgQEAKIAkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBNUF9TSFVURE9XTiwgREJHX0xWTF9BTEwsImZhaWwgdG8gc2VuZCB0aGUgSWRsZSBtb2RlIFJlcXVlc3QgXG4iKTsKIAkJQWRhcHRlci0+YlByZXBhcmluZ0Zvckxvd1Bvd2VyTW9kZSA9IEZBTFNFOwogCi0jaWZuZGVmIEJDTV9TSE1fSU5URVJGQUNFCiAJCVN0YXJ0SW50ZXJydXB0VXJiKChQU19JTlRFUkZBQ0VfQURBUFRFUikoQWRhcHRlci0+cHZJbnRlcmZhY2VBZGFwdGVyKSk7Ci0jZW5kaWYKIAl9CiB9CiAKIAotdm9pZCBIYW5kbGVTaHV0RG93bk1vZGVSZXF1ZXN0KFBNSU5JX0FEQVBURVIgQWRhcHRlcixQVUNIQVIgcHVjQnVmZmVyKQorc3RhdGljIHZvaWQgSGFuZGxlU2h1dERvd25Nb2RlUmVxdWVzdChQTUlOSV9BREFQVEVSIEFkYXB0ZXIsUFVDSEFSIHB1Y0J1ZmZlcikKIHsKIAlCX1VJTlQzMiB1aVJlc2V0VmFsdWUgPSAwOwogCkBAIC0yMDc3LDExICsxODA1LDcgQEAKIAlpZighYXRvbWljX3JlYWQgKCZBZGFwdGVyLT51aU1CdXBkYXRlKSkKIAkJcmV0dXJuOwogCi0jaWZkZWYgQkNNX1NITV9JTlRFUkZBQ0UKLQlpZihyZG1hbHQoQWRhcHRlciwgVEFSR0VUX1NGSURfVFhERVNDX01BUF9MT0MsIChQVUlOVCl1aWJ1ZmYsIHNpemVvZihVSU5UKSAqIE1BWF9UQVJHRVRfRFNYX0JVRkZFUlMpPDApCi0jZWxzZQogCWlmKHJkbWFsdFdpdGhMb2NrKEFkYXB0ZXIsIFRBUkdFVF9TRklEX1RYREVTQ19NQVBfTE9DLCAoUFVJTlQpdWlidWZmLCBzaXplb2YoVUlOVCkgKiBNQVhfVEFSR0VUX0RTWF9CVUZGRVJTKTwwKQotI2VuZGlmCiAJewogCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsICJyZG0gZmFpbGVkXG4iKTsKIAkJcmV0dXJuOwpAQCAtMjEwNyw5ICsxODMxLDcgQEAKIHZvaWQgZmx1c2hfcXVldWUoUE1JTklfQURBUFRFUiBBZGFwdGVyLCBVSU5UIGlRSW5kZXgpCiB7CiAJc3RydWN0IHNrX2J1ZmYqIAkJCVBhY2tldFRvRHJvcD1OVUxMOwotCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzKgkJbmV0c3RhdHM9TlVMTDsKLQotCW5ldHN0YXRzID0gJigoUExJTlVYX0RFUF9EQVRBKUFkYXB0ZXItPnB2T3NEZXBEYXRhKS0+bmV0c3RhdHM7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMqCQluZXRzdGF0cyA9ICZBZGFwdGVyLT5kZXYtPnN0YXRzOwogCiAJc3Bpbl9sb2NrX2JoKCZBZGFwdGVyLT5QYWNrSW5mb1tpUUluZGV4XS5TRlF1ZXVlTG9jayk7CiAKQEAgLTIxMzAsMjUgKzE4NTIsMjMgQEAKIAkJCUFkYXB0ZXItPlBhY2tJbmZvW2lRSW5kZXhdLnVpRHJvcHBlZENvdW50Qnl0ZXMgKz0gUGFja2V0VG9Ecm9wLT5sZW47CiAJCQlBZGFwdGVyLT5QYWNrSW5mb1tpUUluZGV4XS51aURyb3BwZWRDb3VudFBhY2tldHMrKzsKIAotCQkJYmNtX2tmcmVlX3NrYihQYWNrZXRUb0Ryb3ApOworCQkJZGV2X2tmcmVlX3NrYihQYWNrZXRUb0Ryb3ApOwogCQkJYXRvbWljX2RlYygmQWRhcHRlci0+VG90YWxQYWNrZXRDb3VudCk7Ci0JCQlhdG9taWNfaW5jKCZBZGFwdGVyLT5UeERyb3BwZWRQYWNrZXRDb3VudCk7Ci0KIAkJfQogCX0KIAlzcGluX3VubG9ja19iaCgmQWRhcHRlci0+UGFja0luZm9baVFJbmRleF0uU0ZRdWV1ZUxvY2spOwogCiB9CiAKLXZvaWQgYmVjZWVtX3Byb3RvY29sX3Jlc2V0IChQTUlOSV9BREFQVEVSIEFkYXB0ZXIpCitzdGF0aWMgdm9pZCBiZWNlZW1fcHJvdG9jb2xfcmVzZXQgKFBNSU5JX0FEQVBURVIgQWRhcHRlcikKIHsKLQlpbnQgaSA9MDsKKwlpbnQgaTsKIAotCWlmKE5VTEwgIT0gQWRhcHRlci0+ZGV2KQotCXsKLQkJbmV0aWZfY2Fycmllcl9vZmYoQWRhcHRlci0+ZGV2KTsKLQkJbmV0aWZfc3RvcF9xdWV1ZShBZGFwdGVyLT5kZXYpOwotCX0KKwlpZiAobmV0aWZfbXNnX2xpbmsoQWRhcHRlcikpCisJCXByX25vdGljZShQRlggIiVzOiBwcm90b2NvbCByZXNldFxuIiwgQWRhcHRlci0+ZGV2LT5uYW1lKTsKKworCW5ldGlmX2NhcnJpZXJfb2ZmKEFkYXB0ZXItPmRldik7CisJbmV0aWZfc3RvcF9xdWV1ZShBZGFwdGVyLT5kZXYpOwogCiAJQWRhcHRlci0+SWRsZU1vZGUgPSBGQUxTRTsKIAlBZGFwdGVyLT5MaW5rVXBTdGF0dXMgPSBGQUxTRTsKQEAgLTIxNjYsNzggKzE4ODYsMTggQEAKIAkJQWRhcHRlci0+VGltZXJBY3RpdmUgPSBGQUxTRTsKIAogCW1lbXNldChBZGFwdGVyLT5hc3RGcmFnbWVudGVkUGt0Q2xhc3NpZmllclRhYmxlLCAwLAotCQkJc2l6ZW9mKFNfRlJBR01FTlRFRF9QQUNLRVRfSU5GTykgKgotCQkJTUFYX0ZSQUdNRU5URURJUF9DTEFTU0lGSUNBVElPTl9FTlRSSUVTKTsKKwkgICAgICAgc2l6ZW9mKFNfRlJBR01FTlRFRF9QQUNLRVRfSU5GTykgKiBNQVhfRlJBR01FTlRFRElQX0NMQVNTSUZJQ0FUSU9OX0VOVFJJRVMpOwogCiAJZm9yKGkgPSAwO2k8SGlQcmlvcml0eTtpKyspCiAJewogCQkvL3Jlc2V0dGluZyBvbmx5IHRoZSBmaXJzdCBzaXplIChTX01JQlNfU0VSVklDRUZMT1dfVEFCTEUpIGZvciB0aGUgU0YuCiAJCS8vIEl0IGlzIHNhbWUgYmV0d2VlbiBNSUJzIGFuZCBTRi4KLQkJbWVtc2V0KChQVk9JRCkmQWRhcHRlci0+UGFja0luZm9baV0sMCxzaXplb2YoU19NSUJTX1NFUlZJQ0VGTE9XX1RBQkxFKSk7CisJCW1lbXNldCgmQWRhcHRlci0+UGFja0luZm9baV0uc3RNaWJzRXh0U2VydmljZUZsb3dUYWJsZSwKKwkJICAgICAgIDAsIHNpemVvZihTX01JQlNfRVhUU0VSVklDRUZMT1dfUEFSQU1FVEVSUykpOwogCX0KIH0KIAogCiAKLSNpZmRlZiBCQ01fU0hNX0lOVEVSRkFDRQotCi0KLSNkZWZpbmUgR0VUX0dUQl9ESUZGKHN0YXJ0LCBlbmQpICBcCi0oIChzdGFydCkgPCAoZW5kKSApPyAoIChlbmQpIC0gKHN0YXJ0KSApIDogKCB+MHgwIC0gKCAoc3RhcnQpIC0gKGVuZCkpICsxICkKLQotdm9pZCB1c2RlbGF5ICggdW5zaWduZWQgaW50IGEpIHsKLQl1bnNpZ25lZCBpbnQgc3RhcnQ9ICoodW5zaWduZWQgaW50ICopMHhhZjgwNTFiNDsKLQl1bnNpZ25lZCBpbnQgZW5kICA9IHN0YXJ0KzE7Ci0JdW5zaWduZWQgaW50IGRpZmYgPSAwOwotCi0Jd2hpbGUoMSkgewotCQllbmQgPSAqKHVuc2lnbmVkIGludCAqKTB4YWY4MDUxYjQ7Ci0JCWRpZmYgPSAoR0VUX0dUQl9ESUZGKHN0YXJ0LGVuZCkpLzgwOwotCQlpZiAoZGlmZiA+PSBhKQotCQkJYnJlYWs7Ci0JfQotfQotdm9pZCByZWFkX2NmZ19maWxlKFBNSU5JX0FEQVBURVIgQWRhcHRlcikgewotCi0KLQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsIkNvbmZpZyBGaWxlIFZlcnNpb24gPSAweCV4IFxuIixBZGFwdGVyLT5wc3RhcmdldHBhcmFtcy0+bV91MzJDZmdWZXJzaW9uICk7Ci0JQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCJDZW50ZXIgRnJlcXVlbmN5ID0gIDB4JXggXG4iLEFkYXB0ZXItPnBzdGFyZ2V0cGFyYW1zLT5tX3UzMkNlbnRlckZyZXF1ZW5jeSApOwotCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwiQmFuZCBBIFNjYW4gPSAweCV4IFxuIixBZGFwdGVyLT5wc3RhcmdldHBhcmFtcy0+bV91MzJCYW5kQVNjYW4gKTsKLQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsIkJhbmQgQiBTY2FuID0gMHgleCBcbiIsQWRhcHRlci0+cHN0YXJnZXRwYXJhbXMtPm1fdTMyQmFuZEJTY2FuICk7Ci0JQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCJCYW5kIEMgU2NhbiA9IDB4JXggXG4iLEFkYXB0ZXItPnBzdGFyZ2V0cGFyYW1zLT5tX3UzMkJhbmRDU2NhbiApOwotCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwiRVJUUFMgT3B0aW9ucyA9IDB4JXggXG4iLEFkYXB0ZXItPnBzdGFyZ2V0cGFyYW1zLT5tX3UzMkVydHBzT3B0aW9ucyApOwotCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwiUEhTIEVuYWJsZSA9IDB4JXggXG4iLEFkYXB0ZXItPnBzdGFyZ2V0cGFyYW1zLT5tX3UzMlBIU0VuYWJsZSApOwotCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwiSGFuZG9mZiBFbmFibGUgPSAweCV4IFxuIixBZGFwdGVyLT5wc3RhcmdldHBhcmFtcy0+bV91MzJIb0VuYWJsZSApOwotCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwiSE8gUmVzZXJ2ZWQxID0gMHgleCBcbiIsQWRhcHRlci0+cHN0YXJnZXRwYXJhbXMtPm1fdTMySG9SZXNlcnZlZDEgKTsKLQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsIkhPIFJlc2VydmVkMiA9IDB4JXggXG4iLEFkYXB0ZXItPnBzdGFyZ2V0cGFyYW1zLT5tX3UzMkhvUmVzZXJ2ZWQyICk7Ci0JQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCJNSU1PIEVuYWJsZSA9IDB4JXggXG4iLEFkYXB0ZXItPnBzdGFyZ2V0cGFyYW1zLT5tX3UzMk1pbW9FbmFibGUgKTsKLQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsIlBLTXYyIEVuYWJsZSA9IDB4JXggXG4iLEFkYXB0ZXItPnBzdGFyZ2V0cGFyYW1zLT5tX3UzMlNlY3VyaXR5RW5hYmxlICk7Ci0JQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCJQb3dlcnNhdmluZyBNb2RlcyBFbmFibGUgPSAweCV4IFxuIixBZGFwdGVyLT5wc3RhcmdldHBhcmFtcy0+bV91MzJQb3dlclNhdmluZ01vZGVzRW5hYmxlICk7Ci0JQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCJQb3dlciBTYXZpbmcgTW9kZSBPcHRpb25zID0gMHgleCBcbiIsQWRhcHRlci0+cHN0YXJnZXRwYXJhbXMtPm1fdTMyUG93ZXJTYXZpbmdNb2RlT3B0aW9ucyApOwotCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwiQVJRIEVuYWJsZSA9IDB4JXggXG4iLEFkYXB0ZXItPnBzdGFyZ2V0cGFyYW1zLT5tX3UzMkFycUVuYWJsZSApOwotCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwiSGFycSBFbmFibGUgPSAweCV4IFxuIixBZGFwdGVyLT5wc3RhcmdldHBhcmFtcy0+bV91MzJIYXJxRW5hYmxlICk7Ci0JQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCJFRVBST00gRmxhZyA9IDB4JXggXG4iLEFkYXB0ZXItPnBzdGFyZ2V0cGFyYW1zLT5tX3UzMkVFUFJPTUZsYWcgKTsKLQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsIkN1c3RvbWl6ZSA9IDB4JXggXG4iLEFkYXB0ZXItPnBzdGFyZ2V0cGFyYW1zLT5tX3UzMkN1c3RvbWl6ZSApOwotCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwiQmFuZHdpZHRoID0gMHgleCBcbiIsQWRhcHRlci0+cHN0YXJnZXRwYXJhbXMtPm1fdTMyQ29uZmlnQlcgKTsKLQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsIlNodXREb3duIFRpbWVyIFZhbHVlID0gMHgleCBcbiIsQWRhcHRlci0+cHN0YXJnZXRwYXJhbXMtPm1fdTMyU2h1dERvd25Jbml0VGhyZXNob2xkVGltZXIgKTsKLQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsIlJhZGlvUGFyYW1ldGVyID0gMHgleCBcbiIsQWRhcHRlci0+cHN0YXJnZXRwYXJhbXMtPm1fdTMyUmFkaW9QYXJhbWV0ZXIgKTsKLQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsIlBoeVBhcmFtZXRlcjEgPSAweCV4IFxuIixBZGFwdGVyLT5wc3RhcmdldHBhcmFtcy0+bV91MzJQaHlQYXJhbWV0ZXIxICk7Ci0JQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCJQaHlQYXJhbWV0ZXIyID0gMHgleCBcbiIsQWRhcHRlci0+cHN0YXJnZXRwYXJhbXMtPm1fdTMyUGh5UGFyYW1ldGVyMiApOwotCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwiUGh5UGFyYW1ldGVyMyA9IDB4JXggXG4iLEFkYXB0ZXItPnBzdGFyZ2V0cGFyYW1zLT5tX3UzMlBoeVBhcmFtZXRlcjMgKTsKLQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsIm1fdTMyVGVzdE9wdGlvbnMgPSAweCV4IFxuIixBZGFwdGVyLT5wc3RhcmdldHBhcmFtcy0+bV91MzJUZXN0T3B0aW9ucyApOwotCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwiTWF4TUFDRGF0YXBlckRMRnJhbWUgPSAweCV4IFxuIixBZGFwdGVyLT5wc3RhcmdldHBhcmFtcy0+bV91MzJNYXhNQUNEYXRhcGVyRExGcmFtZSApOwotCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwiTWF4TUFDRGF0YXBlclVMRnJhbWUgPSAweCV4IFxuIixBZGFwdGVyLT5wc3RhcmdldHBhcmFtcy0+bV91MzJNYXhNQUNEYXRhcGVyVUxGcmFtZSApOwotCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwiQ29ycjJNYWNGbGFncyA9IDB4JXggXG4iLEFkYXB0ZXItPnBzdGFyZ2V0cGFyYW1zLT5tX3UzMkNvcnIyTWFjRmxhZ3MgKTsKLQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsIkhvc3REcnZyQ29uZmlnMSA9IDB4JXggXG4iLEFkYXB0ZXItPnBzdGFyZ2V0cGFyYW1zLT5Ib3N0RHJ2ckNvbmZpZzEgKTsKLQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsIkhvc3REcnZyQ29uZmlnMiA9IDB4JXggXG4iLEFkYXB0ZXItPnBzdGFyZ2V0cGFyYW1zLT5Ib3N0RHJ2ckNvbmZpZzIgKTsKLQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsIkhvc3REcnZyQ29uZmlnMyA9IDB4JXggXG4iLEFkYXB0ZXItPnBzdGFyZ2V0cGFyYW1zLT5Ib3N0RHJ2ckNvbmZpZzMgKTsKLQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsIkhvc3REcnZyQ29uZmlnNCA9IDB4JXggXG4iLEFkYXB0ZXItPnBzdGFyZ2V0cGFyYW1zLT5Ib3N0RHJ2ckNvbmZpZzQgKTsKLQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsIkhvc3REcnZyQ29uZmlnNSA9IDB4JXggXG4iLEFkYXB0ZXItPnBzdGFyZ2V0cGFyYW1zLT5Ib3N0RHJ2ckNvbmZpZzUgKTsKLQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsIkhvc3REcnZyQ29uZmlnNiA9IDB4JXggXG4iLEFkYXB0ZXItPnBzdGFyZ2V0cGFyYW1zLT5Ib3N0RHJ2ckNvbmZpZzYgKTsKLQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsIlNlZ21lbnRlZCBQVVNDIEVuYWJsZSA9IDB4JXggXG4iLEFkYXB0ZXItPnBzdGFyZ2V0cGFyYW1zLT5tX3UzMlNlZ21lbnRlZFBVU0NlbmFibGUgKTsKLQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsIkJhbWNFbmFibGUgPSAweCV4IFxuIixBZGFwdGVyLT5wc3RhcmdldHBhcmFtcy0+bV91MzJCYW5kQU1DRW5hYmxlICk7Ci19Ci0KLSNlbmRpZgogCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iY20vT3NhbF9NaXNjLmMgYi9kcml2ZXJzL3N0YWdpbmcvYmNtL09zYWxfTWlzYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZWVmZDIwLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9iY20vT3NhbF9NaXNjLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0JLyorKwotCi0JQ29weXJpZ2h0IChjKSBCZWNlZW0gQ29tbXVuaWNhdGlvbnMgSW5jLgotCi0JTW9kdWxlIE5hbWU6Ci0JCVdJTl9NaXNjLmMKLQotCUFic3RyYWN0OgotCQlJbXBsZW1lbnRzIHRoZSBNaXNjZWxhbm5lb3VzIE9TIENvbnN0cnV0cwotCQkJTGlua2VkIExpc3RzCi0JCQlEaXNwYXRjaGVyIE9iamVjdHMoRXZlbnRzLFNlbWFwaG9yZXMsU3BpbiBMb2NrcyBhbmQgdGhlIGxpa2UpCi0JCQlGaWxlcwotCi0JUmV2aXNpb24gSGlzdG9yeToKLQkJV2hvICAgICAgICAgV2hlbiAgICAgICAgV2hhdAotCQktLS0tLS0tLSAgICAtLS0tLS0tLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JCU5hbWUJCURhdGUJCUNyZWF0ZWQvcmV2aWV3ZWQvbW9kaWZpZWQKLQkJUmFqZWV2CQkyNC8xLzA4CQlDcmVhdGVkCi0JTm90ZXM6Ci0KLQktLSovCi0jaW5jbHVkZSAiaGVhZGVycy5oIgotCi1ib29sIE9zYWxNZW1Db21wYXJlKHZvaWQgKmRlc3QsIHZvaWQgKnNyYywgVUlOVCBsZW4pCi17Ci0JcmV0dXJuIChtZW1jbXAoc3JjLCBkZXN0LCBsZW4pKTsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iY20vUEhTTW9kdWxlLmMgYi9kcml2ZXJzL3N0YWdpbmcvYmNtL1BIU01vZHVsZS5jCmluZGV4IDhhMzhjZjQuLmQxY2ExOTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9iY20vUEhTTW9kdWxlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JjbS9QSFNNb2R1bGUuYwpAQCAtMSwxMCArMSw1NCBAQAogI2luY2x1ZGUgImhlYWRlcnMuaCIKIAorc3RhdGljIFVJTlQgQ3JlYXRlU0ZUb0NsYXNzaWZpZXJSdWxlTWFwcGluZyhCX1VJTlQxNiB1aVZjaWQsQl9VSU5UMTYgIHVpQ2xzSWQsU19TRVJWSUNFRkxPV19UQUJMRSAqcHNTZXJ2aWNlRmxvd1RhYmxlLFNfUEhTX1JVTEUgKnBzUGhzUnVsZSxCX1VJTlQ4IHU4QXNzb2NpYXRlZFBIU0kpOworCitzdGF0aWMgVUlOVCBDcmVhdGVDbGFzc2lmZXJUb1BIU1J1bGVNYXBwaW5nKEJfVUlOVDE2IHVpVmNpZCxCX1VJTlQxNiAgdWlDbHNJZCxTX1NFUlZJQ0VGTE9XX0VOVFJZICpwc3RTZXJ2aWNlRmxvd0VudHJ5LFNfUEhTX1JVTEUgKnBzUGhzUnVsZSxCX1VJTlQ4IHU4QXNzb2NpYXRlZFBIU0kpOworCitzdGF0aWMgVUlOVCBDcmVhdGVDbGFzc2lmaWVyUEhTUnVsZShCX1VJTlQxNiAgdWlDbHNJZCxTX0NMQVNTSUZJRVJfVEFCTEUgKnBzYUNsYXNzaWZpZXJ0YWJsZSAsU19QSFNfUlVMRSAqcHNQaHNSdWxlLEVfQ0xBU1NJRklFUl9FTlRSWV9DT05URVhUIGVDbHNDb250ZXh0LEJfVUlOVDggdThBc3NvY2lhdGVkUEhTSSk7CisKK3N0YXRpYyBVSU5UIFVwZGF0ZUNsYXNzaWZpZXJQSFNSdWxlKEJfVUlOVDE2ICB1aUNsc0lkLFNfQ0xBU1NJRklFUl9FTlRSWSAqcHN0Q2xhc3NpZmllckVudHJ5LFNfQ0xBU1NJRklFUl9UQUJMRSAqcHNhQ2xhc3NpZmllcnRhYmxlICxTX1BIU19SVUxFICpwc1Boc1J1bGUsQl9VSU5UOCB1OEFzc29jaWF0ZWRQSFNJKTsKKworc3RhdGljIEJPT0xFQU4gVmFsaWRhdGVQSFNSdWxlQ29tcGxldGUoU19QSFNfUlVMRSAqcHNQaHNSdWxlKTsKKworc3RhdGljIEJPT0xFQU4gRGVyZWZQaHNSdWxlKEJfVUlOVDE2ICB1aUNsc0lkLFNfQ0xBU1NJRklFUl9UQUJMRSAqcHNhQ2xhc3NpZmllcnRhYmxlLFNfUEhTX1JVTEUgKnBzdFBoc1J1bGUpOworCitzdGF0aWMgVUlOVCBHZXRDbGFzc2lmaWVyRW50cnkoU19DTEFTU0lGSUVSX1RBQkxFICpwc3RDbGFzc2lmaWVyVGFibGUsQl9VSU5UMzIgdWlDbHNpZCxFX0NMQVNTSUZJRVJfRU5UUllfQ09OVEVYVCBlQ2xzQ29udGV4dCwgU19DTEFTU0lGSUVSX0VOVFJZICoqcHBzdENsYXNzaWZpZXJFbnRyeSk7CisKK3N0YXRpYyBVSU5UIEdldFBoc1J1bGVFbnRyeShTX0NMQVNTSUZJRVJfVEFCTEUgKnBzdENsYXNzaWZpZXJUYWJsZSxCX1VJTlQzMiB1aVBIU0ksRV9DTEFTU0lGSUVSX0VOVFJZX0NPTlRFWFQgZUNsc0NvbnRleHQsU19QSFNfUlVMRSAqKnBwc3RQaHNSdWxlKTsKKworc3RhdGljIHZvaWQgZnJlZV9waHNfc2VydmljZWZsb3dfcnVsZXMoU19TRVJWSUNFRkxPV19UQUJMRSAqcHNTZXJ2aWNlRmxvd1J1bGVzVGFibGUpOworCitzdGF0aWMgaW50IHBoc19jb21wcmVzcyhTX1BIU19SVUxFICAgKnBoc19tZW1iZXJzLHVuc2lnbmVkIGNoYXIgKmluX2J1ZiwKKwkJCQkJCXVuc2lnbmVkIGNoYXIgKm91dF9idWYsdW5zaWduZWQgaW50ICpoZWFkZXJfc2l6ZSxVSU5UICpuZXdfaGVhZGVyX3NpemUgKTsKKworCitzdGF0aWMgaW50IHZlcmlmeV9zdXBwcmVzc19waHNmKHVuc2lnbmVkIGNoYXIgKmluX2J1ZmZlcix1bnNpZ25lZCBjaGFyICpvdXRfYnVmZmVyLAorCQkJCQkJCQl1bnNpZ25lZCBjaGFyICpwaHNmLHVuc2lnbmVkIGNoYXIgKnBoc20sdW5zaWduZWQgaW50IHBoc3MsdW5zaWduZWQgaW50IHBoc3YsVUlOVCAqbmV3X2hlYWRlcl9zaXplICk7CisKK3N0YXRpYyBpbnQgcGhzX2RlY29tcHJlc3ModW5zaWduZWQgY2hhciAqaW5fYnVmLHVuc2lnbmVkIGNoYXIgKm91dF9idWYsXAorCQkJCQkJICBTX1BIU19SVUxFICAgKnBoc19ydWxlcyxVSU5UICpoZWFkZXJfc2l6ZSk7CisKKworc3RhdGljIFVMT05HIFBoc0NvbXByZXNzKHZvaWQqIHB2Q29udGV4dCwKKwkJCQkgIEJfVUlOVDE2IHVpVmNpZCwKKwkJCQkgIEJfVUlOVDE2IHVpQ2xzSWQsCisJCQkJICB2b2lkICpwdklucHV0QnVmZmVyLAorCQkJCSAgdm9pZCAqcHZPdXRwdXRCdWZmZXIsCisJCQkJICBVSU5UICpwT2xkSGVhZGVyU2l6ZSwKKwkJCQkgIFVJTlQgKnBOZXdIZWFkZXJTaXplICk7CisKK3N0YXRpYyBVTE9ORyBQaHNEZUNvbXByZXNzKHZvaWQqIHB2Q29udGV4dCwKKwkJCQkgIEJfVUlOVDE2IHVpVmNpZCwKKwkJCQkgIHZvaWQgKnB2SW5wdXRCdWZmZXIsCisJCQkJICB2b2lkICpwdk91dHB1dEJ1ZmZlciwKKwkJCQkgIFVJTlQgKnBJbkhlYWRlclNpemUsCisJCQkJICBVSU5UICpwT3V0SGVhZGVyU2l6ZSk7CisKKworCiAjZGVmaW5lIElOCiAjZGVmaW5lIE9VVAogCi12b2lkIER1bXBEYXRhUGFja2V0SGVhZGVyKFBVQ0hBUiBwUGt0KTsKLQogLyoKIEZ1bmN0aW9uOgkJCQlQSFNUcmFuc21pdAogCkBAIC04MSw4ICsxMjUsNiBAQAogCXsKIAogCi0JCS8vRHVtcERhdGFQYWNrZXRIZWFkZXIocHVjUEhTUGt0SGRySW5CdWYpOwotCiAJCS8vIFN0ZXAgMiBTdXByZXNzIEhlYWRlciB1c2luZyBQSFMgYW5kIGZpbGwgaW50byBpbnRlcm1lZGlhdGUgdWNhUEhTUGt0SGRyT3V0QnVmLgogCS8vIFN1cHByZXNzIG9ubHkgaWYgSVAgSGVhZGVyIGFuZCBQSFMgRW5hYmxlZCBGb3IgdGhlIFNlcnZpY2UgRmxvdwogCQlpZigoKHVzUGFja2V0VHlwZSA9PSBFVEhFUk5FVF9GUkFNRVRZUEVfSVBWNCkgfHwKQEAgLTEyMCwxNSArMTYyLDE1IEBACiAJCQkJCQlpZihuZXdQYWNrZXQgPT0gTlVMTCkKIAkJCQkJCQlyZXR1cm4gU1RBVFVTX0ZBSUxVUkU7CiAKLQkJCQkJCWJjbV9rZnJlZV9za2IoUGFja2V0KTsKKwkJCQkJCWRldl9rZnJlZV9za2IoUGFja2V0KTsKIAkJCQkJCSpwUGFja2V0ID0gUGFja2V0ID0gbmV3UGFja2V0OwogCQkJCQkJcHVjUEhTUGt0SGRySW5CdWYgPSBQYWNrZXQtPmRhdGEgICsgQnl0ZXNUb1JlbW92ZTsKIAkJCQkJfQogCiAJCQkJCW51bUJ5dGVzQ29tcHJlc3NlZCA9IHVuUGhzT2xkSGRyU2l6ZSAtICh1blBIU05ld1BrdEhlYWRlckxlbitQSFNJX0xFTik7CiAKLQkJCQkJT3NhbE1lbU1vdmUocHVjUEhTUGt0SGRySW5CdWYgKyBudW1CeXRlc0NvbXByZXNzZWQsIHB1Y1BIU1BrdEhkck91dEJ1ZiwgdW5QSFNOZXdQa3RIZWFkZXJMZW4gKyBQSFNJX0xFTik7Ci0JCQkJCU9zYWxNZW1Nb3ZlKFBhY2tldC0+ZGF0YSArIG51bUJ5dGVzQ29tcHJlc3NlZCwgUGFja2V0LT5kYXRhLCBCeXRlc1RvUmVtb3ZlKTsKKwkJCQkJbWVtY3B5KHB1Y1BIU1BrdEhkckluQnVmICsgbnVtQnl0ZXNDb21wcmVzc2VkLCBwdWNQSFNQa3RIZHJPdXRCdWYsIHVuUEhTTmV3UGt0SGVhZGVyTGVuICsgUEhTSV9MRU4pOworCQkJCQltZW1jcHkoUGFja2V0LT5kYXRhICsgbnVtQnl0ZXNDb21wcmVzc2VkLCBQYWNrZXQtPmRhdGEsIEJ5dGVzVG9SZW1vdmUpOwogCQkJCQlza2JfcHVsbChQYWNrZXQsIG51bUJ5dGVzQ29tcHJlc3NlZCk7CiAKIAkJCQkJcmV0dXJuIFNUQVRVU19TVUNDRVNTOwpAQCAtMjIzLDIzICsyNjUsMTIgQEAKIAkJCX0KIAkJfQogCi0JCU9zYWxNZW1Nb3ZlKHBhY2tldC0+ZGF0YSwgQWRhcHRlci0+dWNhUEhTUGt0UmVzdG9yZUJ1ZiwgblN0YW5kYXJkUGt0SGRyTGVuKTsKKwkJbWVtY3B5KHBhY2tldC0+ZGF0YSwgQWRhcHRlci0+dWNhUEhTUGt0UmVzdG9yZUJ1ZiwgblN0YW5kYXJkUGt0SGRyTGVuKTsKIAl9CiAKIAlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7CiB9CiAKLXZvaWQgRHVtcERhdGFQYWNrZXRIZWFkZXIoUFVDSEFSIHBQa3QpCi17Ci0Jc3RydWN0IGlwaGRyICppcGhkID0gKHN0cnVjdCBpcGhkciopcFBrdDsKLSAgICBQTUlOSV9BREFQVEVSIEFkYXB0ZXIgPSBHRVRfQkNNX0FEQVBURVIoZ2JscG5ldGRldik7Ci0JQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBQSFNfU0VORCwgREJHX0xWTF9BTEwsIlBocyBTZW5kL1JlY2lldmUgOiBJUCBQYWNrZXQgSGRyIFxuIik7Ci0JQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBQSFNfU0VORCwgREJHX0xWTF9BTEwsIlRPUyA6ICV4IFxuIixpcGhkLT50b3MpOwotCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX09USEVSUywgUEhTX1NFTkQsIERCR19MVkxfQUxMLCJTcmMgIElQIDogJXggXG4iLGlwaGQtPnNhZGRyKTsKLQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIFBIU19TRU5ELCBEQkdfTFZMX0FMTCwiRGVzdCBJUCA6ICV4IFxuIFxuIixpcGhkLT5kYWRkcik7Ci0KLX0KLQogdm9pZCBEdW1wRnVsbFBhY2tldChVQ0hBUiAqcEJ1ZixVSU5UIG5Qa3RMZW4pCiB7CiAJUE1JTklfQURBUFRFUiBBZGFwdGVyID0gR0VUX0JDTV9BREFQVEVSKGdibHBuZXRkZXYpOwpAQCAtMjcwLDE1ICszMDEsOSBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAogCXBQaHNkZXZpY2VFeHRlbnNpb24tPnBzdFNlcnZpY2VGbG93UGhzUnVsZXNUYWJsZSA9Ci0gICAgICAoU19TRVJWSUNFRkxPV19UQUJMRSopT3NhbE1lbUFsbG9jKHNpemVvZihTX1NFUlZJQ0VGTE9XX1RBQkxFKSwKLSAgICAgICAgICAgIFBIU19NRU1fVEFHKTsKKwkJa3phbGxvYyhzaXplb2YoU19TRVJWSUNFRkxPV19UQUJMRSksIEdGUF9LRVJORUwpOwogCi0gICAgaWYocFBoc2RldmljZUV4dGVuc2lvbi0+cHN0U2VydmljZUZsb3dQaHNSdWxlc1RhYmxlKQotCXsKLQkJT3NhbFplcm9NZW1vcnkocFBoc2RldmljZUV4dGVuc2lvbi0+cHN0U2VydmljZUZsb3dQaHNSdWxlc1RhYmxlLAotICAgICAgICAgICAgICBzaXplb2YoU19TRVJWSUNFRkxPV19UQUJMRSkpOwotCX0KLQllbHNlCisgICAgaWYoIXBQaHNkZXZpY2VFeHRlbnNpb24tPnBzdFNlcnZpY2VGbG93UGhzUnVsZXNUYWJsZSkKIAl7CiAJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX09USEVSUywgUEhTX0RJU1BBVENILCBEQkdfTFZMX0FMTCwgIlxuQWxsb2NhdGlvbiBTZXJ2aWNlRmxvd1Boc1J1bGVzVGFibGUgZmFpbGVkIik7CiAJCXJldHVybiAtRU5PTUVNOwpAQCAtMjg4LDE0ICszMTMsOCBAQAogCWZvcihpPTA7aTxNQVhfU0VSVklDRUZMT1dTO2krKykKIAl7CiAJCVNfU0VSVklDRUZMT1dfRU5UUlkgc1NlcnZpY2VGbG93ID0gcHN0U2VydmljZUZsb3dUYWJsZS0+c3RTRkxpc3RbaV07Ci0JCXNTZXJ2aWNlRmxvdy5wc3RDbGFzc2lmaWVyVGFibGUgPSAoU19DTEFTU0lGSUVSX1RBQkxFKilPc2FsTWVtQWxsb2MoCi0gICAgICAgICAgICBzaXplb2YoU19DTEFTU0lGSUVSX1RBQkxFKSwgUEhTX01FTV9UQUcpOwotCQlpZihzU2VydmljZUZsb3cucHN0Q2xhc3NpZmllclRhYmxlKQotCQl7Ci0JCQlPc2FsWmVyb01lbW9yeShzU2VydmljZUZsb3cucHN0Q2xhc3NpZmllclRhYmxlLHNpemVvZihTX0NMQVNTSUZJRVJfVEFCTEUpKTsKLQkJCXBzdFNlcnZpY2VGbG93VGFibGUtPnN0U0ZMaXN0W2ldLnBzdENsYXNzaWZpZXJUYWJsZSA9IHNTZXJ2aWNlRmxvdy5wc3RDbGFzc2lmaWVyVGFibGU7Ci0gICAgCX0KLQkJZWxzZQorCQlzU2VydmljZUZsb3cucHN0Q2xhc3NpZmllclRhYmxlID0ga3phbGxvYyhzaXplb2YoU19DTEFTU0lGSUVSX1RBQkxFKSwgR0ZQX0tFUk5FTCk7CisJCWlmKCFzU2VydmljZUZsb3cucHN0Q2xhc3NpZmllclRhYmxlKQogCQl7CiAJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIFBIU19ESVNQQVRDSCwgREJHX0xWTF9BTEwsICJcbkFsbG9jYXRpb24gZmFpbGVkIik7CiAJCQlmcmVlX3Boc19zZXJ2aWNlZmxvd19ydWxlcyhwUGhzZGV2aWNlRXh0ZW5zaW9uLT4KQEAgLTMwNSw5ICszMjQsNyBAQAogCQl9CiAJfQogCi0KLQlwUGhzZGV2aWNlRXh0ZW5zaW9uLT5Db21wcmVzc2VkVHhCdWZmZXIgPQotICAgICAgICAgIE9zYWxNZW1BbGxvYyhQSFNfQlVGRkVSX1NJWkUsUEhTX01FTV9UQUcpOworCXBQaHNkZXZpY2VFeHRlbnNpb24tPkNvbXByZXNzZWRUeEJ1ZmZlciA9IGttYWxsb2MoUEhTX0JVRkZFUl9TSVpFLCBHRlBfS0VSTkVMKTsKIAogICAgIGlmKHBQaHNkZXZpY2VFeHRlbnNpb24tPkNvbXByZXNzZWRUeEJ1ZmZlciA9PSBOVUxMKQogCXsKQEAgLTMxNywxMiArMzM0LDExIEBACiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAotCXBQaHNkZXZpY2VFeHRlbnNpb24tPlVuQ29tcHJlc3NlZFJ4QnVmZmVyID0KLSAgICAgIE9zYWxNZW1BbGxvYyhQSFNfQlVGRkVSX1NJWkUsUEhTX01FTV9UQUcpOworICAgIHBQaHNkZXZpY2VFeHRlbnNpb24tPlVuQ29tcHJlc3NlZFJ4QnVmZmVyID0ga21hbGxvYyhQSFNfQlVGRkVSX1NJWkUsIEdGUF9LRVJORUwpOwogCWlmKHBQaHNkZXZpY2VFeHRlbnNpb24tPlVuQ29tcHJlc3NlZFJ4QnVmZmVyID09IE5VTEwpCiAJewogCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIFBIU19ESVNQQVRDSCwgREJHX0xWTF9BTEwsICJcbkFsbG9jYXRpb24gZmFpbGVkIik7Ci0JCU9zYWxNZW1GcmVlKHBQaHNkZXZpY2VFeHRlbnNpb24tPkNvbXByZXNzZWRUeEJ1ZmZlcixQSFNfQlVGRkVSX1NJWkUpOworCQlrZnJlZShwUGhzZGV2aWNlRXh0ZW5zaW9uLT5Db21wcmVzc2VkVHhCdWZmZXIpOwogCQlmcmVlX3Boc19zZXJ2aWNlZmxvd19ydWxlcyhwUGhzZGV2aWNlRXh0ZW5zaW9uLT5wc3RTZXJ2aWNlRmxvd1Boc1J1bGVzVGFibGUpOwogCQlwUGhzZGV2aWNlRXh0ZW5zaW9uLT5wc3RTZXJ2aWNlRmxvd1Boc1J1bGVzVGFibGUgPSBOVUxMOwogCQlyZXR1cm4gLUVOT01FTTsKQEAgLTM0MywxNiArMzU5LDExIEBACiAJCXBQSFNEZXZpY2VFeHQtPnBzdFNlcnZpY2VGbG93UGhzUnVsZXNUYWJsZSA9IE5VTEw7CiAJfQogCi0JaWYocFBIU0RldmljZUV4dC0+Q29tcHJlc3NlZFR4QnVmZmVyKQotCXsKLQkJT3NhbE1lbUZyZWUocFBIU0RldmljZUV4dC0+Q29tcHJlc3NlZFR4QnVmZmVyLFBIU19CVUZGRVJfU0laRSk7Ci0JCXBQSFNEZXZpY2VFeHQtPkNvbXByZXNzZWRUeEJ1ZmZlciA9IE5VTEw7Ci0JfQotCWlmKHBQSFNEZXZpY2VFeHQtPlVuQ29tcHJlc3NlZFJ4QnVmZmVyKQotCXsKLQkJT3NhbE1lbUZyZWUocFBIU0RldmljZUV4dC0+VW5Db21wcmVzc2VkUnhCdWZmZXIsUEhTX0JVRkZFUl9TSVpFKTsKLQkJcFBIU0RldmljZUV4dC0+VW5Db21wcmVzc2VkUnhCdWZmZXIgPSBOVUxMOwotCX0KKwlrZnJlZShwUEhTRGV2aWNlRXh0LT5Db21wcmVzc2VkVHhCdWZmZXIpOworCXBQSFNEZXZpY2VFeHQtPkNvbXByZXNzZWRUeEJ1ZmZlciA9IE5VTEw7CisKKwlrZnJlZShwUEhTRGV2aWNlRXh0LT5VbkNvbXByZXNzZWRSeEJ1ZmZlcik7CisJcFBIU0RldmljZUV4dC0+VW5Db21wcmVzc2VkUnhCdWZmZXIgPSBOVUxMOwogCiAJcmV0dXJuIDA7CiB9CkBAIC00NzgsMjAgKzQ4OSwxMiBAQAogCQkJewogCQkJCWlmKHBzdENsYXNzaWZpZXJSdWxlc1RhYmxlLT5zdEFjdGl2ZVBoc1J1bGVzTGlzdFtuQ2xzaWRJbmRleF0uYlVzZWQgJiYgcHN0Q2xhc3NpZmllclJ1bGVzVGFibGUtPnN0QWN0aXZlUGhzUnVsZXNMaXN0W25DbHNpZEluZGV4XS5wc3RQaHNSdWxlKQogCQkJCXsKLQkJCQkJaWYocHN0Q2xhc3NpZmllclJ1bGVzVGFibGUtPnN0QWN0aXZlUGhzUnVsZXNMaXN0W25DbHNpZEluZGV4XQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wc3RQaHNSdWxlLT51OFBIU0kgPT0gdThQSFNJKQotCQkJCQl7Ci0JCQkJCQlpZihwc3RDbGFzc2lmaWVyUnVsZXNUYWJsZS0+c3RBY3RpdmVQaHNSdWxlc0xpc3RbbkNsc2lkSW5kZXhdLnBzdFBoc1J1bGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+dThSZWZDbnQpCi0JCQkJCQkJcHN0Q2xhc3NpZmllclJ1bGVzVGFibGUtPnN0QWN0aXZlUGhzUnVsZXNMaXN0W25DbHNpZEluZGV4XS5wc3RQaHNSdWxlCi0JCQkJCQkgICAgICAgICAgLT51OFJlZkNudC0tOwotCQkJCQkJaWYoMCA9PSBwc3RDbGFzc2lmaWVyUnVsZXNUYWJsZS0+c3RBY3RpdmVQaHNSdWxlc0xpc3RbbkNsc2lkSW5kZXhdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnBzdFBoc1J1bGUtPnU4UmVmQ250KQotCQkJCQkJCU9zYWxNZW1GcmVlKHBzdENsYXNzaWZpZXJSdWxlc1RhYmxlCi0JCQkJCQkgICAgLT5zdEFjdGl2ZVBoc1J1bGVzTGlzdFtuQ2xzaWRJbmRleF0ucHN0UGhzUnVsZSwKLQkJCQkJCSAgICAgIHNpemVvZihTX1BIU19SVUxFKSk7Ci0JCQkJCQlPc2FsWmVyb01lbW9yeSgmcHN0Q2xhc3NpZmllclJ1bGVzVGFibGUKLQkJCQkJCQktPnN0QWN0aXZlUGhzUnVsZXNMaXN0W25DbHNpZEluZGV4XSwKKwkJCQkJaWYocHN0Q2xhc3NpZmllclJ1bGVzVGFibGUtPnN0QWN0aXZlUGhzUnVsZXNMaXN0W25DbHNpZEluZGV4XS5wc3RQaHNSdWxlLT51OFBIU0kgPT0gdThQSFNJKQkJCQkJeworCQkJCQkJaWYocHN0Q2xhc3NpZmllclJ1bGVzVGFibGUtPnN0QWN0aXZlUGhzUnVsZXNMaXN0W25DbHNpZEluZGV4XS5wc3RQaHNSdWxlLT51OFJlZkNudCkKKwkJCQkJCQlwc3RDbGFzc2lmaWVyUnVsZXNUYWJsZS0+c3RBY3RpdmVQaHNSdWxlc0xpc3RbbkNsc2lkSW5kZXhdLnBzdFBoc1J1bGUtPnU4UmVmQ250LS07CisJCQkJCQlpZigwID09IHBzdENsYXNzaWZpZXJSdWxlc1RhYmxlLT5zdEFjdGl2ZVBoc1J1bGVzTGlzdFtuQ2xzaWRJbmRleF0ucHN0UGhzUnVsZS0+dThSZWZDbnQpCisJCQkJCQkJa2ZyZWUocHN0Q2xhc3NpZmllclJ1bGVzVGFibGUtPnN0QWN0aXZlUGhzUnVsZXNMaXN0W25DbHNpZEluZGV4XS5wc3RQaHNSdWxlKTsKKwkJCQkJCW1lbXNldCgmcHN0Q2xhc3NpZmllclJ1bGVzVGFibGUtPnN0QWN0aXZlUGhzUnVsZXNMaXN0W25DbHNpZEluZGV4XSwgMCwKIAkJCQkJCQlzaXplb2YoU19DTEFTU0lGSUVSX0VOVFJZKSk7CiAJCQkJCX0KIAkJCQl9CkBAIC01NDgsMTAgKzU1MSwxMCBAQAogCQkJCWlmKHBzdENsYXNzaWZpZXJFbnRyeS0+cHN0UGhzUnVsZS0+dThSZWZDbnQpCiAJCQkJcHN0Q2xhc3NpZmllckVudHJ5LT5wc3RQaHNSdWxlLT51OFJlZkNudC0tOwogCQkJCWlmKDA9PXBzdENsYXNzaWZpZXJFbnRyeS0+cHN0UGhzUnVsZS0+dThSZWZDbnQpCi0JCQkJT3NhbE1lbUZyZWUocHN0Q2xhc3NpZmllckVudHJ5LT5wc3RQaHNSdWxlLHNpemVvZihTX1BIU19SVUxFKSk7CisJCQkJCWtmcmVlKHBzdENsYXNzaWZpZXJFbnRyeS0+cHN0UGhzUnVsZSk7CiAKIAkJCX0KLQkJCU9zYWxaZXJvTWVtb3J5KHBzdENsYXNzaWZpZXJFbnRyeSxzaXplb2YoU19DTEFTU0lGSUVSX0VOVFJZKSk7CisJCQltZW1zZXQocHN0Q2xhc3NpZmllckVudHJ5LCAwLCBzaXplb2YoU19DTEFTU0lGSUVSX0VOVFJZKSk7CiAJCX0KIAogCQluQ2xzaWRJbmRleCA9IEdldENsYXNzaWZpZXJFbnRyeShwc3RTZXJ2aWNlRmxvd0VudHJ5LT5wc3RDbGFzc2lmaWVyVGFibGUsCkBAIC01NTksMTAgKzU2Miw4IEBACiAKIAkgICBpZigobkNsc2lkSW5kZXggIT0gUEhTX0lOVkFMSURfVEFCTEVfSU5ERVgpICYmICghcHN0Q2xhc3NpZmllckVudHJ5LT5iVW5jbGFzc2lmaWVkUEhTUnVsZSkpCiAJCXsKLQkJCWlmKHBzdENsYXNzaWZpZXJFbnRyeS0+cHN0UGhzUnVsZSkKLQkJCS8vRGVsZXRlIHRoZSBjbGFzc2lmaWVyIGVudHJ5Ci0JCQlPc2FsTWVtRnJlZShwc3RDbGFzc2lmaWVyRW50cnktPnBzdFBoc1J1bGUsc2l6ZW9mKFNfUEhTX1JVTEUpKTsKLQkJCU9zYWxaZXJvTWVtb3J5KHBzdENsYXNzaWZpZXJFbnRyeSxzaXplb2YoU19DTEFTU0lGSUVSX0VOVFJZKSk7CisJCQlrZnJlZShwc3RDbGFzc2lmaWVyRW50cnktPnBzdFBoc1J1bGUpOworCQkJbWVtc2V0KHBzdENsYXNzaWZpZXJFbnRyeSwgMCwgc2l6ZW9mKFNfQ0xBU1NJRklFUl9FTlRSWSkpOwogCQl9CiAJfQogCXJldHVybiBsU3RhdHVzOwpAQCAtNjE5LDE0ICs2MjAsMTEgQEAKIAkJCQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wc3RQaHNSdWxlLT51OFJlZkNudC0tOwogCQkJCQlpZigwPT1wc3RDbGFzc2lmaWVyUnVsZXNUYWJsZS0+c3RBY3RpdmVQaHNSdWxlc0xpc3RbbkNsc2lkSW5kZXhdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnBzdFBoc1J1bGUtPnU4UmVmQ250KQotCQkJCQkJT3NhbE1lbUZyZWUocHN0Q2xhc3NpZmllclJ1bGVzVGFibGUKLQkJCQkJCSAgICAgICAgICAgIC0+c3RBY3RpdmVQaHNSdWxlc0xpc3RbbkNsc2lkSW5kZXhdLnBzdFBoc1J1bGUsCi0JCQkJCQkgICAgICAgICAgICAgc2l6ZW9mKFNfUEhTX1JVTEUpKTsKKwkJCQkJCWtmcmVlKHBzdENsYXNzaWZpZXJSdWxlc1RhYmxlLT5zdEFjdGl2ZVBoc1J1bGVzTGlzdFtuQ2xzaWRJbmRleF0ucHN0UGhzUnVsZSk7CiAJCQkJCSAgICBwc3RDbGFzc2lmaWVyUnVsZXNUYWJsZS0+c3RBY3RpdmVQaHNSdWxlc0xpc3RbbkNsc2lkSW5kZXhdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnBzdFBoc1J1bGUgPSBOVUxMOwogCQkJCX0KLQkJCQlPc2FsWmVyb01lbW9yeSgmcHN0Q2xhc3NpZmllclJ1bGVzVGFibGUKLSAgICAgICAgICAgICAgICAgICAgLT5zdEFjdGl2ZVBoc1J1bGVzTGlzdFtuQ2xzaWRJbmRleF0sc2l6ZW9mKFNfQ0xBU1NJRklFUl9FTlRSWSkpOworCQkJCW1lbXNldCgmcHN0Q2xhc3NpZmllclJ1bGVzVGFibGUtPnN0QWN0aXZlUGhzUnVsZXNMaXN0W25DbHNpZEluZGV4XSwgMCwgc2l6ZW9mKFNfQ0xBU1NJRklFUl9FTlRSWSkpOwogCQkJCWlmKHBzdENsYXNzaWZpZXJSdWxlc1RhYmxlLT5zdE9sZFBoc1J1bGVzTGlzdFtuQ2xzaWRJbmRleF0ucHN0UGhzUnVsZSkKIAkJCQl7CiAJCQkJCWlmKHBzdENsYXNzaWZpZXJSdWxlc1RhYmxlLT5zdE9sZFBoc1J1bGVzTGlzdFtuQ2xzaWRJbmRleF0KQEAgLTYzNSwxNSArNjMzLDEyIEBACiAJCQkJCQkgICAgICAgICAgICAgICAgICAucHN0UGhzUnVsZS0+dThSZWZDbnQtLTsKIAkJCQkJaWYoMCA9PSBwc3RDbGFzc2lmaWVyUnVsZXNUYWJsZS0+c3RPbGRQaHNSdWxlc0xpc3RbbkNsc2lkSW5kZXhdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnBzdFBoc1J1bGUtPnU4UmVmQ250KQotCQkJCQkJT3NhbE1lbUZyZWUocHN0Q2xhc3NpZmllclJ1bGVzVGFibGUKLQkJCQkJCSAgICAgIC0+c3RPbGRQaHNSdWxlc0xpc3RbbkNsc2lkSW5kZXhdLnBzdFBoc1J1bGUsCi0JCQkJCQkgICAgICAgc2l6ZW9mKFNfUEhTX1JVTEUpKTsKKwkJCQkJCWtmcmVlKHBzdENsYXNzaWZpZXJSdWxlc1RhYmxlCisJCQkJCQkgICAgICAtPnN0T2xkUGhzUnVsZXNMaXN0W25DbHNpZEluZGV4XS5wc3RQaHNSdWxlKTsKIAkJCQkJcHN0Q2xhc3NpZmllclJ1bGVzVGFibGUtPnN0T2xkUGhzUnVsZXNMaXN0W25DbHNpZEluZGV4XQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnBzdFBoc1J1bGUgPSBOVUxMOwogCQkJCX0KLQkJCQlPc2FsWmVyb01lbW9yeSgmcHN0Q2xhc3NpZmllclJ1bGVzVGFibGUKLSAgICAgICAgICAgICAgICAgIC0+c3RPbGRQaHNSdWxlc0xpc3RbbkNsc2lkSW5kZXhdLAotICAgICAgICAgICAgICAgICAgIHNpemVvZihTX0NMQVNTSUZJRVJfRU5UUlkpKTsKKwkJCQltZW1zZXQoJnBzdENsYXNzaWZpZXJSdWxlc1RhYmxlLT5zdE9sZFBoc1J1bGVzTGlzdFtuQ2xzaWRJbmRleF0sIDAsIHNpemVvZihTX0NMQVNTSUZJRVJfRU5UUlkpKTsKIAkJCX0KIAkJfQogCQlwc3RTZXJ2aWNlRmxvd0VudHJ5LT5iVXNlZCA9IEZBTFNFOwpAQCAtODQ5LDcgKzg0NCw3IEBACiAvLyBEb2VzIG5vdCByZXR1cm4gYW55IHZhbHVlLgogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi12b2lkIGZyZWVfcGhzX3NlcnZpY2VmbG93X3J1bGVzKFNfU0VSVklDRUZMT1dfVEFCTEUgKnBzU2VydmljZUZsb3dSdWxlc1RhYmxlKQorc3RhdGljIHZvaWQgZnJlZV9waHNfc2VydmljZWZsb3dfcnVsZXMoU19TRVJWSUNFRkxPV19UQUJMRSAqcHNTZXJ2aWNlRmxvd1J1bGVzVGFibGUpCiB7CiAJaW50IGksajsKICAgICBQTUlOSV9BREFQVEVSIEFkYXB0ZXIgPSBHRVRfQkNNX0FEQVBURVIoZ2JscG5ldGRldik7CkBAIC04NzYsOCArODcxLDcgQEAKICAgCQkJCQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+dThSZWZDbnQtLTsKIAkJCQkJCWlmKDA9PXBzdENsYXNzaWZpZXJSdWxlc1RhYmxlLT5zdEFjdGl2ZVBoc1J1bGVzTGlzdFtqXS5wc3RQaHNSdWxlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT51OFJlZkNudCkKLQkJCQkJCQlPc2FsTWVtRnJlZShwc3RDbGFzc2lmaWVyUnVsZXNUYWJsZS0+c3RBY3RpdmVQaHNSdWxlc0xpc3Rbal0uCi0JCQkJCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzdFBoc1J1bGUsIHNpemVvZihTX1BIU19SVUxFKSk7CisJCQkJCQkJa2ZyZWUocHN0Q2xhc3NpZmllclJ1bGVzVGFibGUtPnN0QWN0aXZlUGhzUnVsZXNMaXN0W2pdLnBzdFBoc1J1bGUpOwogCQkJCQkJcHN0Q2xhc3NpZmllclJ1bGVzVGFibGUtPnN0QWN0aXZlUGhzUnVsZXNMaXN0W2pdLnBzdFBoc1J1bGUgPSBOVUxMOwogCQkJCQl9CiAJCQkJCWlmKHBzdENsYXNzaWZpZXJSdWxlc1RhYmxlLT5zdE9sZFBoc1J1bGVzTGlzdFtqXS5wc3RQaHNSdWxlKQpAQCAtODg4LDI0ICs4ODIsMjMgQEAKIAkJCQkJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPnU4UmVmQ250LS07CiAJCQkJCQlpZigwPT1wc3RDbGFzc2lmaWVyUnVsZXNUYWJsZS0+c3RPbGRQaHNSdWxlc0xpc3Rbal0ucHN0UGhzUnVsZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+dThSZWZDbnQpCi0JCQkJCQkJT3NhbE1lbUZyZWUocHN0Q2xhc3NpZmllclJ1bGVzVGFibGUtPnN0T2xkUGhzUnVsZXNMaXN0W2pdCi0JCQkJCQkJICAgICAgICAgICAgICAgICAgICAgICAgLnBzdFBoc1J1bGUsc2l6ZW9mKFNfUEhTX1JVTEUpKTsKKwkJCQkJCQlrZnJlZShwc3RDbGFzc2lmaWVyUnVsZXNUYWJsZS0+c3RPbGRQaHNSdWxlc0xpc3Rbal0ucHN0UGhzUnVsZSk7CiAJCQkJCQlwc3RDbGFzc2lmaWVyUnVsZXNUYWJsZS0+c3RPbGRQaHNSdWxlc0xpc3Rbal0ucHN0UGhzUnVsZSA9IE5VTEw7CiAJCQkJCX0KIAkJCQl9Ci0JCQkgICAgT3NhbE1lbUZyZWUocHN0Q2xhc3NpZmllclJ1bGVzVGFibGUsc2l6ZW9mKFNfQ0xBU1NJRklFUl9UQUJMRSkpOworCQkJCWtmcmVlKHBzdENsYXNzaWZpZXJSdWxlc1RhYmxlKTsKIAkJCSAgICBzdFNlcnZpY2VGbG93RW50cnkucHN0Q2xhc3NpZmllclRhYmxlID0gcHN0Q2xhc3NpZmllclJ1bGVzVGFibGUgPSBOVUxMOwogCQkJfQogCQl9CiAJfQogCi0JT3NhbE1lbUZyZWUocHNTZXJ2aWNlRmxvd1J1bGVzVGFibGUsc2l6ZW9mKFNfU0VSVklDRUZMT1dfVEFCTEUpKTsKLQlwc1NlcnZpY2VGbG93UnVsZXNUYWJsZSA9IE5VTEw7CisgICAga2ZyZWUocHNTZXJ2aWNlRmxvd1J1bGVzVGFibGUpOworICAgIHBzU2VydmljZUZsb3dSdWxlc1RhYmxlID0gTlVMTDsKIH0KIAogCiAKLUJPT0xFQU4gVmFsaWRhdGVQSFNSdWxlQ29tcGxldGUoSU4gU19QSFNfUlVMRSAqcHNQaHNSdWxlKQorc3RhdGljIEJPT0xFQU4gVmFsaWRhdGVQSFNSdWxlQ29tcGxldGUoSU4gU19QSFNfUlVMRSAqcHNQaHNSdWxlKQogewogCWlmKHBzUGhzUnVsZSkKIAl7CkBAIC05ODgsOSArOTgxLDkgQEAKIAlyZXR1cm4gUEhTX0lOVkFMSURfVEFCTEVfSU5ERVg7CiB9CiAKLVVJTlQgR2V0UGhzUnVsZUVudHJ5KElOIFNfQ0xBU1NJRklFUl9UQUJMRSAqcHN0Q2xhc3NpZmllclRhYmxlLAotICAgICAgSU4gQl9VSU5UMzIgdWlQSFNJLEVfQ0xBU1NJRklFUl9FTlRSWV9DT05URVhUIGVDbHNDb250ZXh0LAotICAgICAgT1VUIFNfUEhTX1JVTEUgKipwcHN0UGhzUnVsZSkKK3N0YXRpYyBVSU5UIEdldFBoc1J1bGVFbnRyeShJTiBTX0NMQVNTSUZJRVJfVEFCTEUgKnBzdENsYXNzaWZpZXJUYWJsZSwKKwkJCSAgICBJTiBCX1VJTlQzMiB1aVBIU0ksRV9DTEFTU0lGSUVSX0VOVFJZX0NPTlRFWFQgZUNsc0NvbnRleHQsCisJCQkgICAgT1VUIFNfUEhTX1JVTEUgKipwcHN0UGhzUnVsZSkKIHsKIAlpbnQgIGk7CiAJU19DTEFTU0lGSUVSX0VOVFJZICpwc3RDbGFzc2lmaWVyUnVsZSA9IE5VTEw7CkBAIC0xMTAyLDcgKzEwOTUsNyBAQAogCQlpZihwc1Boc1J1bGUtPnU4UEhTRkxlbmd0aCkKIAkJewogCQkJLy91cGRhdGUgUEhTRgotCQkJT3NhbE1lbU1vdmUocHN0Q2xhc3NpZmllckVudHJ5LT5wc3RQaHNSdWxlLT51OFBIU0YsCisJCQltZW1jcHkocHN0Q2xhc3NpZmllckVudHJ5LT5wc3RQaHNSdWxlLT51OFBIU0YsCiAJCQkgICAgcHNQaHNSdWxlLT51OFBIU0YgLCBNQVhfUEhTX0xFTkdUSFMpOwogCQl9CiAJCWlmKHBzUGhzUnVsZS0+dThQSFNGTGVuZ3RoKQpAQCAtMTExNCw3ICsxMTA3LDcgQEAKIAkJaWYocHNQaHNSdWxlLT51OFBIU01MZW5ndGgpCiAJCXsKIAkJCS8vdXBkYXRlIFBIU00KLQkJCU9zYWxNZW1Nb3ZlKHBzdENsYXNzaWZpZXJFbnRyeS0+cHN0UGhzUnVsZS0+dThQSFNNLAorCQkJbWVtY3B5KHBzdENsYXNzaWZpZXJFbnRyeS0+cHN0UGhzUnVsZS0+dThQSFNNLAogCQkJICAgIHBzUGhzUnVsZS0+dThQSFNNLCBNQVhfUEhTX0xFTkdUSFMpOwogCQl9CiAJCWlmKHBzUGhzUnVsZS0+dThQSFNNTGVuZ3RoKQpAQCAtMTE0Nyw3ICsxMTQwLDcgQEAKIAlyZXR1cm4gdWlTdGF0dXM7CiB9CiAKLVVJTlQgQ3JlYXRlQ2xhc3NpZmllclBIU1J1bGUoSU4gQl9VSU5UMTYgIHVpQ2xzSWQsCitzdGF0aWMgVUlOVCBDcmVhdGVDbGFzc2lmaWVyUEhTUnVsZShJTiBCX1VJTlQxNiAgdWlDbHNJZCwKICAgICBTX0NMQVNTSUZJRVJfVEFCTEUgKnBzYUNsYXNzaWZpZXJ0YWJsZSAsU19QSFNfUlVMRSAqcHNQaHNSdWxlLAogICAgIEVfQ0xBU1NJRklFUl9FTlRSWV9DT05URVhUIGVDbHNDb250ZXh0LEJfVUlOVDggdThBc3NvY2lhdGVkUEhTSSkKIHsKQEAgLTEyMzQsOCArMTIyNyw3IEBACiAJewogCQlpZihwc0NsYXNzaWZpZXJSdWxlcy0+cHN0UGhzUnVsZSA9PSBOVUxMKQogCQl7Ci0JCQlwc0NsYXNzaWZpZXJSdWxlcy0+cHN0UGhzUnVsZSA9IChTX1BIU19SVUxFKilPc2FsTWVtQWxsb2MKLSAgICAgICAgICAgICAgICAoc2l6ZW9mKFNfUEhTX1JVTEUpLFBIU19NRU1fVEFHKTsKKwkJCXBzQ2xhc3NpZmllclJ1bGVzLT5wc3RQaHNSdWxlID0ga21hbGxvYyhzaXplb2YoU19QSFNfUlVMRSksR0ZQX0tFUk5FTCk7CiAKICAgICAgICAgICBpZihOVUxMID09IHBzQ2xhc3NpZmllclJ1bGVzLT5wc3RQaHNSdWxlKQogCQkJCXJldHVybiBFUlJfUEhTUlVMRV9NRU1BTExPQ19GQUlMOwpAQCAtMTI0Nyw3ICsxMjM5LDcgQEAKIAkJcHNDbGFzc2lmaWVyUnVsZXMtPmJVbmNsYXNzaWZpZWRQSFNSdWxlID0gcHNQaHNSdWxlLT5iVW5jbGFzc2lmaWVkUEhTUnVsZTsKIAogICAgICAgICAvKiBVcGRhdGUgVGhlIFBIUyBydWxlICovCi0JCU9zYWxNZW1Nb3ZlKHBzQ2xhc3NpZmllclJ1bGVzLT5wc3RQaHNSdWxlLAorCQltZW1jcHkocHNDbGFzc2lmaWVyUnVsZXMtPnBzdFBoc1J1bGUsCiAJCSAgICBwc1Boc1J1bGUsIHNpemVvZihTX1BIU19SVUxFKSk7CiAJfQogCWVsc2UKQEAgLTEyNTksNyArMTI1MSw3IEBACiB9CiAKIAotVUlOVCBVcGRhdGVDbGFzc2lmaWVyUEhTUnVsZShJTiBCX1VJTlQxNiAgdWlDbHNJZCwKK3N0YXRpYyBVSU5UIFVwZGF0ZUNsYXNzaWZpZXJQSFNSdWxlKElOIEJfVUlOVDE2ICB1aUNsc0lkLAogICAgICAgSU4gU19DTEFTU0lGSUVSX0VOVFJZICpwc3RDbGFzc2lmaWVyRW50cnksCiAgICAgICBTX0NMQVNTSUZJRVJfVEFCTEUgKnBzYUNsYXNzaWZpZXJ0YWJsZSAsU19QSFNfUlVMRSAqcHNQaHNSdWxlLAogICAgICAgQl9VSU5UOCB1OEFzc29jaWF0ZWRQSFNJKQpAQCAtMTI4OSwxMyArMTI4MSwxMyBAQAogCQkvL1N0ZXAgMi5hIFBIUyBSdWxlIERvZXMgTm90IEV4aXN0IC5DcmVhdGUgTmV3IFBIUyBSdWxlIGZvciB1aUNsc0lkCiAJCWlmKEZBTFNFID09IGJQSFNSdWxlT3JwaGFuZWQpCiAJCXsKLQkJCXBzdENsYXNzaWZpZXJFbnRyeS0+cHN0UGhzUnVsZSA9IChTX1BIU19SVUxFKilPc2FsTWVtQWxsb2Moc2l6ZW9mKFNfUEhTX1JVTEUpLFBIU19NRU1fVEFHKTsKKwkJCXBzdENsYXNzaWZpZXJFbnRyeS0+cHN0UGhzUnVsZSA9IGttYWxsb2Moc2l6ZW9mKFNfUEhTX1JVTEUpLCBHRlBfS0VSTkVMKTsKIAkJCWlmKE5VTEwgPT0gcHN0Q2xhc3NpZmllckVudHJ5LT5wc3RQaHNSdWxlKQogCQkJewogCQkJCXJldHVybiBFUlJfUEhTUlVMRV9NRU1BTExPQ19GQUlMOwogCQkJfQogCQl9Ci0JCU9zYWxNZW1Nb3ZlKHBzdENsYXNzaWZpZXJFbnRyeS0+cHN0UGhzUnVsZSwgcHNQaHNSdWxlLCBzaXplb2YoU19QSFNfUlVMRSkpOworCQltZW1jcHkocHN0Q2xhc3NpZmllckVudHJ5LT5wc3RQaHNSdWxlLCBwc1Boc1J1bGUsIHNpemVvZihTX1BIU19SVUxFKSk7CiAKIAl9CiAJZWxzZQpAQCAtMTMwNCwxNCArMTI5Niw4IEBACiAJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX09USEVSUywgUEhTX0RJU1BBVENILCBEQkdfTFZMX0FMTCwgIlxuVHlpbmcgQ2xhc3NpZmllciB0byBFeGlzdGluZyBQSFMgUnVsZSIpOwogCQlpZihiUEhTUnVsZU9ycGhhbmVkKQogCQl7Ci0JCSAgICBpZihwc3RDbGFzc2lmaWVyRW50cnktPnBzdFBoc1J1bGUpCi0JCSAgICB7Ci0JCSAgICAJLy9KdXN0IEZyZWUgdGhlIFBIUyBSdWxlIGFzIFJlZiBDb3VudCBpcyBaZXJvCi0JCSAgICAJT3NhbE1lbUZyZWUocHN0Q2xhc3NpZmllckVudHJ5LT5wc3RQaHNSdWxlLHNpemVvZihTX1BIU19SVUxFKSk7CisJCQlrZnJlZShwc3RDbGFzc2lmaWVyRW50cnktPnBzdFBoc1J1bGUpOwogCQkJcHN0Q2xhc3NpZmllckVudHJ5LT5wc3RQaHNSdWxlID0gTlVMTDsKLQotCQkgICAgfQotCiAJCX0KIAkJcHN0Q2xhc3NpZmllckVudHJ5LT5wc3RQaHNSdWxlID0gcHN0QWRkUGhzUnVsZTsKIApAQCAtMTMyNiw3ICsxMzEyLDcgQEAKIAogfQogCi1CT09MRUFOIERlcmVmUGhzUnVsZShJTiBCX1VJTlQxNiAgdWlDbHNJZCxTX0NMQVNTSUZJRVJfVEFCTEUgKnBzYUNsYXNzaWZpZXJ0YWJsZSxTX1BIU19SVUxFICpwc3RQaHNSdWxlKQorc3RhdGljIEJPT0xFQU4gRGVyZWZQaHNSdWxlKElOIEJfVUlOVDE2ICB1aUNsc0lkLFNfQ0xBU1NJRklFUl9UQUJMRSAqcHNhQ2xhc3NpZmllcnRhYmxlLFNfUEhTX1JVTEUgKnBzdFBoc1J1bGUpCiB7CiAJaWYocHN0UGhzUnVsZT09TlVMTCkKIAkJcmV0dXJuIEZBTFNFOwpAQCAtMTM0NSwyMiArMTMzMSw2IEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCBEdW1wQnVmZmVyKFBWT0lEIEJ1ZmZWQWRkcmVzcywgaW50IHhmZXJTaXplKQotewotCWludCBpOwotCWludCBpUHJpbnRMZW5ndGg7Ci0JUFVDSEFSIHRlbXA9KFBVQ0hBUilCdWZmVkFkZHJlc3M7Ci0gICAgUE1JTklfQURBUFRFUiBBZGFwdGVyID0gR0VUX0JDTV9BREFQVEVSKGdibHBuZXRkZXYpOwotCWlQcmludExlbmd0aD0oeGZlclNpemU8MzI/eGZlclNpemU6MzIpOwotCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX09USEVSUywgUEhTX0RJU1BBVENILCBEQkdfTFZMX0FMTCwgIlxuIik7Ci0KLQlmb3IgKGk9MDtpIDwgaVByaW50TGVuZ3RoO2krKykgewotCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBQSFNfRElTUEFUQ0gsIERCR19MVkxfQUxMLCAiJXh8Iix0ZW1wW2ldKTsKLQl9Ci0JQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBQSFNfRElTUEFUQ0gsIERCR19MVkxfQUxMLCAiXG4iKTsKLX0KLQotCiB2b2lkIER1bXBQaHNSdWxlcyhQUEhTX0RFVklDRV9FWFRFTlNJT04gcERldmljZUV4dGVuc2lvbikKIHsKIAlpbnQgaSxqLGssbDsKQEAgLTE1MjAsOCArMTQ5MCw4IEBACiAvLwlzaXplLVRoZSBudW1iZXIgb2YgYnl0ZXMgY29waWVkIGludG8gdGhlIG91dHB1dCBidWZmZXIgaS5lIGR5bmFtaWMgZmllbGRzCiAvLwkwCS1JZiBQSFMgcnVsZSBpcyBOVUxMLklmIFBIU1YgZmllbGQgaXMgbm90IHNldC5JZiB0aGUgdmVyaWZpY2F0aW9uIGZhaWxzLgogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotaW50IHBoc19jb21wcmVzcyhTX1BIU19SVUxFICAqcGhzX3J1bGUsdW5zaWduZWQgY2hhciAqaW5fYnVmCi0JCQkJCQksdW5zaWduZWQgY2hhciAqb3V0X2J1ZixVSU5UICpoZWFkZXJfc2l6ZSxVSU5UICpuZXdfaGVhZGVyX3NpemUpCitzdGF0aWMgaW50IHBoc19jb21wcmVzcyhTX1BIU19SVUxFICAqcGhzX3J1bGUsdW5zaWduZWQgY2hhciAqaW5fYnVmCisJCQksdW5zaWduZWQgY2hhciAqb3V0X2J1ZixVSU5UICpoZWFkZXJfc2l6ZSxVSU5UICpuZXdfaGVhZGVyX3NpemUpCiB7CiAJdW5zaWduZWQgY2hhciAqb2xkX2FkZHIgPSBvdXRfYnVmOwogCWludCBzdXByZXNzID0gMDsKQEAgLTE1ODEsOSArMTU1MSw5IEBACiAvLwkwCS1QYWNrZXQgaGFzIGZhaWxlZCB0aGUgdmVyaWZpY2F0aW9uLgogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi0gaW50IHZlcmlmeV9zdXBwcmVzc19waHNmKHVuc2lnbmVkIGNoYXIgKmluX2J1ZmZlcix1bnNpZ25lZCBjaGFyICpvdXRfYnVmZmVyLAotCQkJCQkJCQl1bnNpZ25lZCBjaGFyICpwaHNmLHVuc2lnbmVkIGNoYXIgKnBoc20sdW5zaWduZWQgaW50IHBoc3MsCi0JCQkJCQkJCXVuc2lnbmVkIGludCBwaHN2LFVJTlQqIG5ld19oZWFkZXJfc2l6ZSkKK3N0YXRpYyBpbnQgdmVyaWZ5X3N1cHByZXNzX3Boc2YodW5zaWduZWQgY2hhciAqaW5fYnVmZmVyLHVuc2lnbmVkIGNoYXIgKm91dF9idWZmZXIsCisJCQkJdW5zaWduZWQgY2hhciAqcGhzZix1bnNpZ25lZCBjaGFyICpwaHNtLHVuc2lnbmVkIGludCBwaHNzLAorCQkJCXVuc2lnbmVkIGludCBwaHN2LFVJTlQqIG5ld19oZWFkZXJfc2l6ZSkKIHsKIAl1bnNpZ25lZCBpbnQgc2l6ZT0wOwogCWludCBiaXQsaT0wOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JjbS9QSFNNb2R1bGUuaCBiL2RyaXZlcnMvc3RhZ2luZy9iY20vUEhTTW9kdWxlLmgKaW5kZXggYmYyYjU3Ni4uMGRkMDVhNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JjbS9QSFNNb2R1bGUuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYmNtL1BIU01vZHVsZS5oCkBAIC0yNywxOSArMjcsNiBAQAogCiBpbnQgcGhzX2luaXQoUFBIU19ERVZJQ0VfRVhURU5TSU9OIHBQaHNkZXZpY2VFeHRlbnNpb24sUE1JTklfQURBUFRFUiBBZGFwdGVyKTsKIAotdm9pZCBmcmVlX3Boc19zZXJ2aWNlZmxvd19ydWxlcyhTX1NFUlZJQ0VGTE9XX1RBQkxFICpwc1NlcnZpY2VGbG93UnVsZXNUYWJsZSk7Ci0KLWludCBwaHNfY29tcHJlc3MoU19QSFNfUlVMRSAgICpwaHNfbWVtYmVycyx1bnNpZ25lZCBjaGFyICppbl9idWYsCi0JCQkJCQl1bnNpZ25lZCBjaGFyICpvdXRfYnVmLHVuc2lnbmVkIGludCAqaGVhZGVyX3NpemUsVUlOVCAqbmV3X2hlYWRlcl9zaXplICk7Ci0KLQotaW50IHZlcmlmeV9zdXBwcmVzc19waHNmKHVuc2lnbmVkIGNoYXIgKmluX2J1ZmZlcix1bnNpZ25lZCBjaGFyICpvdXRfYnVmZmVyLAotCQkJCQkJCQl1bnNpZ25lZCBjaGFyICpwaHNmLHVuc2lnbmVkIGNoYXIgKnBoc20sdW5zaWduZWQgaW50IHBoc3MsdW5zaWduZWQgaW50IHBoc3YsVUlOVCAqbmV3X2hlYWRlcl9zaXplICk7Ci0KLWludCBwaHNfZGVjb21wcmVzcyh1bnNpZ25lZCBjaGFyICppbl9idWYsdW5zaWduZWQgY2hhciAqb3V0X2J1ZixcCi0JCQkJCQkgIFNfUEhTX1JVTEUgICAqcGhzX3J1bGVzLFVJTlQgKmhlYWRlcl9zaXplKTsKLQotCiBpbnQgUGhzQ2xlYW51cChQUEhTX0RFVklDRV9FWFRFTlNJT04gcFBIU0RldmljZUV4dCk7CiAKIC8vVXRpbGl0eSBGdW5jdGlvbnMKQEAgLTUyLDQyICszOSwxMCBAQAogVUxPTkcgUGhzRGVsZXRlU0ZSdWxlcyh2b2lkKiBwdkNvbnRleHQsQl9VSU5UMTYgdWlWY2lkKSA7CiAKIAotVUxPTkcgUGhzQ29tcHJlc3Modm9pZCogcHZDb250ZXh0LAotCQkJCSAgQl9VSU5UMTYgdWlWY2lkLAotCQkJCSAgQl9VSU5UMTYgdWlDbHNJZCwKLQkJCQkgIHZvaWQgKnB2SW5wdXRCdWZmZXIsCi0JCQkJICB2b2lkICpwdk91dHB1dEJ1ZmZlciwKLQkJCQkgIFVJTlQgKnBPbGRIZWFkZXJTaXplLAotCQkJCSAgVUlOVCAqcE5ld0hlYWRlclNpemUgKTsKLQotVUxPTkcgUGhzRGVDb21wcmVzcyh2b2lkKiBwdkNvbnRleHQsCi0JCQkJICBCX1VJTlQxNiB1aVZjaWQsCi0JCQkJICB2b2lkICpwdklucHV0QnVmZmVyLAotCQkJCSAgdm9pZCAqcHZPdXRwdXRCdWZmZXIsCi0JCQkJICBVSU5UICpwSW5IZWFkZXJTaXplLAotCQkJCSAgVUlOVCAqcE91dEhlYWRlclNpemUpOwotCi0KIEJPT0xFQU4gVmFsaWRhdGVQSFNSdWxlKFNfUEhTX1JVTEUgKnBzUGhzUnVsZSk7CiAKLUJPT0xFQU4gVmFsaWRhdGVQSFNSdWxlQ29tcGxldGUoU19QSFNfUlVMRSAqcHNQaHNSdWxlKTsKLQogVUlOVCBHZXRTZXJ2aWNlRmxvd0VudHJ5KFNfU0VSVklDRUZMT1dfVEFCTEUgKnBzU2VydmljZUZsb3dUYWJsZSxCX1VJTlQxNiB1aVZjaWQsU19TRVJWSUNFRkxPV19FTlRSWSAqKnBwc3RTZXJ2aWNlRmxvd0VudHJ5KTsKIAotVUlOVCBHZXRDbGFzc2lmaWVyRW50cnkoU19DTEFTU0lGSUVSX1RBQkxFICpwc3RDbGFzc2lmaWVyVGFibGUsQl9VSU5UMzIgdWlDbHNpZCxFX0NMQVNTSUZJRVJfRU5UUllfQ09OVEVYVCBlQ2xzQ29udGV4dCwgU19DTEFTU0lGSUVSX0VOVFJZICoqcHBzdENsYXNzaWZpZXJFbnRyeSk7Ci0KLVVJTlQgR2V0UGhzUnVsZUVudHJ5KFNfQ0xBU1NJRklFUl9UQUJMRSAqcHN0Q2xhc3NpZmllclRhYmxlLEJfVUlOVDMyIHVpUEhTSSxFX0NMQVNTSUZJRVJfRU5UUllfQ09OVEVYVCBlQ2xzQ29udGV4dCxTX1BIU19SVUxFICoqcHBzdFBoc1J1bGUpOwotCi0KLVVJTlQgQ3JlYXRlU0ZUb0NsYXNzaWZpZXJSdWxlTWFwcGluZyhCX1VJTlQxNiB1aVZjaWQsQl9VSU5UMTYgIHVpQ2xzSWQsU19TRVJWSUNFRkxPV19UQUJMRSAqcHNTZXJ2aWNlRmxvd1RhYmxlLFNfUEhTX1JVTEUgKnBzUGhzUnVsZSxCX1VJTlQ4IHU4QXNzb2NpYXRlZFBIU0kpOwotCi1VSU5UIENyZWF0ZUNsYXNzaWZlclRvUEhTUnVsZU1hcHBpbmcoQl9VSU5UMTYgdWlWY2lkLEJfVUlOVDE2ICB1aUNsc0lkLFNfU0VSVklDRUZMT1dfRU5UUlkgKnBzdFNlcnZpY2VGbG93RW50cnksU19QSFNfUlVMRSAqcHNQaHNSdWxlLEJfVUlOVDggdThBc3NvY2lhdGVkUEhTSSk7Ci0KLVVJTlQgQ3JlYXRlQ2xhc3NpZmllclBIU1J1bGUoQl9VSU5UMTYgIHVpQ2xzSWQsU19DTEFTU0lGSUVSX1RBQkxFICpwc2FDbGFzc2lmaWVydGFibGUgLFNfUEhTX1JVTEUgKnBzUGhzUnVsZSxFX0NMQVNTSUZJRVJfRU5UUllfQ09OVEVYVCBlQ2xzQ29udGV4dCxCX1VJTlQ4IHU4QXNzb2NpYXRlZFBIU0kpOwotCi1VSU5UIFVwZGF0ZUNsYXNzaWZpZXJQSFNSdWxlKEJfVUlOVDE2ICB1aUNsc0lkLFNfQ0xBU1NJRklFUl9FTlRSWSAqcHN0Q2xhc3NpZmllckVudHJ5LFNfQ0xBU1NJRklFUl9UQUJMRSAqcHNhQ2xhc3NpZmllcnRhYmxlICxTX1BIU19SVUxFICpwc1Boc1J1bGUsQl9VSU5UOCB1OEFzc29jaWF0ZWRQSFNJKTsKLQotQk9PTEVBTiBEZXJlZlBoc1J1bGUoQl9VSU5UMTYgIHVpQ2xzSWQsU19DTEFTU0lGSUVSX1RBQkxFICpwc2FDbGFzc2lmaWVydGFibGUsU19QSFNfUlVMRSAqcHN0UGhzUnVsZSk7CiAKIHZvaWQgRHVtcFBoc1J1bGVzKFBQSFNfREVWSUNFX0VYVEVOU0lPTiBwRGV2aWNlRXh0ZW5zaW9uKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JjbS9Qcm90b2NvbC5oIGIvZHJpdmVycy9zdGFnaW5nL2JjbS9Qcm90b2NvbC5oCmluZGV4IDAwZjFjYzEuLmI4YTQwMDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9iY20vUHJvdG9jb2wuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYmNtL1Byb3RvY29sLmgKQEAgLTg1LDEwICs4NSwxMCBAQAogCUVUSF9IRUFERVJfU1RSVUMgRVRoSGRyOwogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSBFVEhfQ1NfRVRIMl9GUkFNRTsKIAorI2RlZmluZSBFVEhFUk5FVF9GUkFNRVRZUEVfSVBWNAkJbnRvaHMoMHgwODAwKQorI2RlZmluZSBFVEhFUk5FVF9GUkFNRVRZUEVfSVBWNiAJbnRvaHMoMHg4NmRkKQorI2RlZmluZSBFVEhFUk5FVF9GUkFNRVRZUEVfODAyUVZMQU4gCW50b2hzKDB4ODEwMCkKIAotI2RlZmluZSBFVEhFUk5FVF9GUkFNRVRZUEVfSVBWNCBudG9ocygweDA4MDApCi0jZGVmaW5lIEVUSEVSTkVUX0ZSQU1FVFlQRV9JUFY2IG50b2hzKDB4ODZkZCkKLSNkZWZpbmUgRVRIRVJORVRfRlJBTUVUWVBFXzgwMlFWTEFOIDB4ODEwMAogLy9QZXIgU0YgQ1MgU3BlY2lmaWNhdGlvbiBFbmNvZGluZ3MKIHR5cGVkZWYgZW51bSBfRV9TRVJWSUNFRkxPV19DU19TUEVDXwogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JjbS9Qcm90b3R5cGVzLmggYi9kcml2ZXJzL3N0YWdpbmcvYmNtL1Byb3RvdHlwZXMuaAppbmRleCA3MGVjOGJjLi5iODBiODA2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYmNtL1Byb3RvdHlwZXMuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYmNtL1Byb3RvdHlwZXMuaApAQCAtMSwyMyArMSwxMiBAQAogI2lmbmRlZiBfUFJPVE9UWVBFU19IXwogI2RlZmluZSBfUFJPVE9UWVBFU19IXwogCi1pbnQgQmNtRmlsZURvd25sb2FkKFBNSU5JX0FEQVBURVIgQWRhcHRlciwvKio8IExvZ2ljYWwgQWRhcHRlciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqcGF0aCwgICAgIC8qKjwgcGF0aCB0byBpbWFnZSBmaWxlICovCi0gICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbG9jICAgIC8qKjwgRG93bmxvYWQgQWRkcmVzcyBvbiB0aGUgY2hpcCovCi0gICAgICAgICAgICAgICAgICAgICAgICApOwogVk9JRCBMaW5rQ29udHJvbFJlc3BvbnNlTWVzc2FnZShQTUlOSV9BREFQVEVSIEFkYXB0ZXIsIFBVQ0hBUiBwdWNCdWZmZXIpOwogCiBWT0lEIFN0YXRpc3RpY3NSZXNwb25zZShQTUlOSV9BREFQVEVSIEFkYXB0ZXIsUFZPSUQgcHZCdWZmZXIpOwogCiBWT0lEIElkbGVNb2RlUmVzcG9uc2UoUE1JTklfQURBUFRFUiBBZGFwdGVyLFBVSU5UIHB1aUJ1ZmZlcik7CiAKLXZvaWQgYmNtX2tmcmVlX3NrYihzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKLVZPSUQgYmNtX2tmcmVlKFZPSUQgKnB0cik7Ci0KLQotVk9JRCBoYW5kbGVfcnhfY29udHJvbF9wYWNrZXQoUE1JTklfQURBUFRFUiBBZGFwdGVyLCAJLyoqPFBvaW50ZXIgdG8gdGhlIEFkYXB0ZXIgc3RydWN0dXJlKi8KLQkJCQkJCQkJc3RydWN0IHNrX2J1ZmYgKnNrYik7CQkJCS8qKjxQb2ludGVyIHRvIHRoZSBzb2NrZXQgYnVmZmVyKi8KLQogaW50IGNvbnRyb2xfcGFja2V0X2hhbmRsZXIJKFBNSU5JX0FEQVBURVIgQWRhcHRlcik7CiAKIFZPSUQgRGVsZXRlQWxsQ2xhc3NpZmllcnNGb3JTRihQTUlOSV9BREFQVEVSIEFkYXB0ZXIsVUlOVCB1aVNlYXJjaFJ1bGVJbmRleCk7CkBAIC0zOCwyNSArMjcsMTYgQEAKIAogVk9JRCBmbHVzaF9hbGxfcXVldWVzKFBNSU5JX0FEQVBURVIgQWRhcHRlcik7CiAKLVVTSE9SVAlJcFZlcnNpb240KFBNSU5JX0FEQVBURVIgQWRhcHRlciwgLyoqPCBQb2ludGVyIHRvIHRoZSBkcml2ZXIgY29udHJvbCBzdHJ1Y3R1cmUgKi8KLQkJCQkJc3RydWN0IGlwaGRyICppcGhkLCAvKio8UG9pbnRlciB0byB0aGUgSVAgSGRyIG9mIHRoZSBwYWNrZXQqLwotCQkJCQlTX0NMQVNTSUZJRVJfUlVMRSAqcHN0Q2xhc3NpZmllclJ1bGUgKTsKLQotVk9JRCBQcnVuZVF1ZXVlKFBNSU5JX0FEQVBURVIgQWRhcHRlciwvKio8UG9pbnRlciB0byB0aGUgZHJpdmVyIGNvbnRyb2wgc3RydWN0dXJlKi8KLQkJCQkJSU5UIGlJbmRleC8qKjxRdWV1ZSBJbmRleCovCi0JCQkJCSk7Ci0KIFZPSUQgUHJ1bmVRdWV1ZUFsbFNGKFBNSU5JX0FEQVBURVIgQWRhcHRlcik7CiAKIElOVCBTZWFyY2hTZmlkKFBNSU5JX0FEQVBURVIgQWRhcHRlcixVSU5UIHVpU2ZpZCk7CiAKLVVTSE9SVCBHZXRQYWNrZXRRdWV1ZUluZGV4KFBNSU5JX0FEQVBURVIgQWRhcHRlciwgLyoqPFBvaW50ZXIgdG8gdGhlIGRyaXZlciBjb250cm9sIHN0cnVjdHVyZSAqLwotCQkJCQkJCQlzdHJ1Y3Qgc2tfYnVmZiogUGFja2V0IC8qKjwgUG9pbnRlciB0byB0aGUgUGFja2V0IHRvIGJlIHNlbnQqLwotCQkJCQkJCQkpOworVVNIT1JUIENsYXNzaWZ5UGFja2V0KFBNSU5JX0FEQVBURVIgQWRhcHRlcixzdHJ1Y3Qgc2tfYnVmZiogc2tiKTsKIAotVk9JRAotcmVwbHlfdG9fYXJwX3JlcXVlc3Qoc3RydWN0IHNrX2J1ZmYgKnNrYiAgLyoqPHNrX2J1ZmYgb2YgQVJQIHJlcXVlc3QqLwotCQkJCQkJKTsKK0JPT0xFQU4gTWF0Y2hTcmNQb3J0KFNfQ0xBU1NJRklFUl9SVUxFICpwc3RDbGFzc2lmaWVyUnVsZSxVU0hPUlQgdXNoU3JjUG9ydCk7CitCT09MRUFOIE1hdGNoRGVzdFBvcnQoU19DTEFTU0lGSUVSX1JVTEUgKnBzdENsYXNzaWZpZXJSdWxlLFVTSE9SVCB1c2hTcmNQb3J0KTsKK0JPT0xFQU4gTWF0Y2hQcm90b2NvbChTX0NMQVNTSUZJRVJfUlVMRSAqcHN0Q2xhc3NpZmllclJ1bGUsVUNIQVIgdWNQcm90b2NvbCk7CisKIAogSU5UIFNldHVwTmV4dFNlbmQoUE1JTklfQURBUFRFUiBBZGFwdGVyLCAvKio8TG9naWNhbCBBZGFwdGVyKi8KIAkJCQkJc3RydWN0IHNrX2J1ZmYgKlBhY2tldCwgLyoqPGRhdGEgYnVmZmVyKi8KQEAgLTcwLDExICs1MCw5IEBACiAJCQkJCQkJY2hhciAqcENvbnRyb2xQYWNrZXQvKio8Q29udHJvbCBQYWNrZXQqLwogCQkJCQkJCSk7CiAKLUlOVCBiY21fdHJhbnNtaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgCQkvKio8IHNrYiAqLwotCQkJCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2IAkvKio8IG5ldCBkZXZpY2UgcG9pbnRlciAqLwotCQkJCQkpOwogCiBpbnQgcmVnaXN0ZXJfbmV0d29ya2RldihQTUlOSV9BREFQVEVSIEFkYXB0ZXIpOwordm9pZCB1bnJlZ2lzdGVyX25ldHdvcmtkZXYoUE1JTklfQURBUFRFUiBBZGFwdGVyKTsKIAogSU5UIEFsbG9jQWRhcHRlckRzeEJ1ZmZlcihQTUlOSV9BREFQVEVSIEFkYXB0ZXIpOwogCkBAIC04Miw4ICs2MCw2IEBACiAKIElOVCBGcmVlQWRhcHRlckRzeEJ1ZmZlcihQTUlOSV9BREFQVEVSIEFkYXB0ZXIpOwogCi1pbnQgY3JlYXRlX3dvcmtlcl90aHJlYWRzKFBNSU5JX0FEQVBURVIgcHNBZGFwdGVyKTsKLQogaW50IHR4X3BrdF9oYW5kbGVyKFBNSU5JX0FEQVBURVIgQWRhcHRlcik7CiAKIGludCAgcmVzZXRfY2FyZF9wcm9jKFBNSU5JX0FEQVBURVIgQWRhcHRlciApOwpAQCAtOTIsNyArNjgsNiBAQAogCiBpbnQgSW5pdENhcmRBbmREb3dubG9hZEZpcm13YXJlKFBNSU5JX0FEQVBURVIgcHNfYWRhcHRlcik7CiAKLWludCBiY21fcGFyc2VfdGFyZ2V0X3BhcmFtcyhQTUlOSV9BREFQVEVSIEFkYXB0ZXIpOwogCiBJTlQgUmVhZE1hY0FkZHJlc3NGcm9tTlZNKFBNSU5JX0FEQVBURVIgQWRhcHRlcik7CiAKQEAgLTExMCwyNiArODUsMTUgQEAKIAogaW50IGdldF9kc3hfc2ZfZGF0YV90b19hcHBsaWNhdGlvbihQTUlOSV9BREFQVEVSIEFkYXB0ZXIsIFVJTlQgdWlTRklkLCB2b2lkIF9fdXNlciAqIHVzZXJfYnVmZmVyKTsKIAotdm9pZCBTZW5kTGlua0Rvd24oUE1JTklfQURBUFRFUiBBZGFwdGVyKTsKLQogdm9pZCBTZW5kSWRsZU1vZGVSZXNwb25zZShQTUlOSV9BREFQVEVSIEFkYXB0ZXIpOwogCi12b2lkIEhhbmRsZVNodXREb3duTW9kZVJlcXVlc3QoUE1JTklfQURBUFRFUiBBZGFwdGVyLFBVQ0hBUiBwdWNCdWZmZXIpOwogCi1pbnQgIFByb2Nlc3NHZXRIb3N0TWlicyhQTUlOSV9BREFQVEVSIEFkYXB0ZXIsIFBWT0lEIGlvQnVmZmVyLAotCVVMT05HIGlucHV0QnVmZmVyTGVuZ3RoKTsKLQotaW50IEdldERyb3BwZWRBcHBDbnRybFBrdE1pYnMoUFZPSUQgaW9CdWZmZXIsIFBQRVJfVEFSQU5HX0RBVEEgcFRhcmFuZyk7CitpbnQgIFByb2Nlc3NHZXRIb3N0TWlicyhQTUlOSV9BREFQVEVSIEFkYXB0ZXIsIFNfTUlCU19IT1NUX1NUQVRTX01JQlMgKmJ1Zik7Cit2b2lkIEdldERyb3BwZWRBcHBDbnRybFBrdE1pYnMoU19NSUJTX0hPU1RfU1RBVFNfTUlCUyAqaW9CdWZmZXIsIFBQRVJfVEFSQU5HX0RBVEEgcFRhcmFuZyk7CiB2b2lkIGJlY2VlbV9wYXJzZV90YXJnZXRfc3RydWN0KFBNSU5JX0FEQVBURVIgQWRhcHRlcik7CiAKLXZvaWQgZG9Qb3dlckF1dG9Db3JyZWN0aW9uKFBNSU5JX0FEQVBURVIgcHNBZGFwdGVyKTsKLQogaW50IGJjbV9pb2N0bF9md19kb3dubG9hZChQTUlOSV9BREFQVEVSIEFkYXB0ZXIsIEZJUk1XQVJFX0lORk8gKnBzRndJbmZvKTsKIAotdm9pZCBiY21fdW5yZWdpc3Rlcl9uZXR3b3JrZGV2KFBNSU5JX0FEQVBURVIgQWRhcHRlcik7Ci0KLWludCBTZWFyY2hWY2lkKFBNSU5JX0FEQVBURVIgQWRhcHRlcix1bnNpZ25lZCBzaG9ydCB1c1ZjaWQpOwotCiB2b2lkIENvcHlNSUJTRXh0ZW5kZWRTRlBhcmFtZXRlcnMoUE1JTklfQURBUFRFUiBBZGFwdGVyLAogCQlDU2VydmljZUZsb3dQYXJhbVNJICpwc2ZMb2NhbFNldCwgVUlOVCB1aVNlYXJjaFJ1bGVJbmRleCk7CiAKQEAgLTE0OSw3ICsxMTMsNiBAQAogCiB2b2lkIENsZWFyVGFyZ2V0RFNYQnVmZmVyKFBNSU5JX0FEQVBURVIgQWRhcHRlcixCX1VJTlQxNiBUSUQsQk9PTEVBTiBiRnJlZUFsbCk7CiAKLXZvaWQgYmVjZWVtX3Byb3RvY29sX3Jlc2V0IChQTUlOSV9BREFQVEVSIEFkYXB0ZXIpOwogCiB2b2lkIGZsdXNoX3F1ZXVlKFBNSU5JX0FEQVBURVIgQWRhcHRlciwgVUlOVCBpUUluZGV4KTsKIApAQCAtMTY0LDMxICsxMjcsMTEgQEAKIAlVSU5UIHVpTnVtQnl0ZXMpOwogCiAKLUlOVCBCZWNlZW1GbGFzaEJ1bGtSZWFkKAotCVBNSU5JX0FEQVBURVIgQWRhcHRlciwKLQlQVUlOVCBwQnVmZmVyLAotCVVJTlQgdWlPZmZzZXQsCi0JVUlOVCB1aU51bUJ5dGVzKTsKLQotVUlOVCBCY21HZXRFRVBST01TaXplKFBNSU5JX0FEQVBURVIgQWRhcHRlcik7CiAKIElOVCBXcml0ZUJlY2VlbUVFUFJPTShQTUlOSV9BREFQVEVSIEFkYXB0ZXIsVUlOVCB1aUVFUFJPTU9mZnNldCwgVUlOVCB1aURhdGEpOwogCi1VSU5UIEJjbUdldEZsYXNoU2l6ZShQTUlOSV9BREFQVEVSIEFkYXB0ZXIpOwotCi1VSU5UIEJjbUdldEZsYXNoU2VjdG9yU2l6ZShQTUlOSV9BREFQVEVSIEFkYXB0ZXIsIFVJTlQgRmxhc2hTZWN0b3JTaXplU2lnLCBVSU5UIEZsYXNoU2VjdG9yU2l6ZSk7Ci0KLUlOVCBCZWNlZW1GbGFzaEJ1bGtXcml0ZSgKLQlQTUlOSV9BREFQVEVSIEFkYXB0ZXIsCi0JUFVJTlQgcEJ1ZmZlciwKLQlVSU5UIHVpT2Zmc2V0LAotCVVJTlQgdWlOdW1CeXRlcywKLQlCT09MRUFOIGJWZXJpZnkpOwotCiBJTlQgUHJvcGFnYXRlQ2FsUGFyYW1zRnJvbUZsYXNoVG9NZW1vcnkoUE1JTklfQURBUFRFUiBBZGFwdGVyKTsKIAotSU5UIFByb3BhZ2F0ZUNhbFBhcmFtc0Zyb21FRVBST01Ub01lbW9yeShQTUlOSV9BREFQVEVSIEFkYXB0ZXIpOwotCiAKIElOVCBCZWNlZW1FRVBST01CdWxrV3JpdGUoCiAJUE1JTklfQURBUFRFUiBBZGFwdGVyLApAQCAtMTk4LDExICsxNDEsOCBAQAogCUJPT0xFQU4gYlZlcmlmeSk7CiAKIAotSU5UIFJlYWRCZWNlZW1FRVBST01CdWxrKFBNSU5JX0FEQVBURVIgQWRhcHRlcixVSU5UIGR3QWRkcmVzcywgVUlOVCAqcGR3RGF0YSwgVUlOVCBkd051bURhdGEpOwotCiBJTlQgUmVhZEJlY2VlbUVFUFJPTShQTUlOSV9BREFQVEVSIEFkYXB0ZXIsVUlOVCBkd0FkZHJlc3MsIFVJTlQgKnBkd0RhdGEpOwogCi1OVk1fVFlQRSBCY21HZXROdm1UeXBlKFBNSU5JX0FEQVBURVIgQWRhcHRlcik7CiAKIElOVCBCZWNlZW1OVk1SZWFkKAogCVBNSU5JX0FEQVBURVIgQWRhcHRlciwKQEAgLTIxNywyNCArMTU3LDEyIEBACiAJVUlOVCB1aU51bUJ5dGVzLAogCUJPT0xFQU4gYlZlcmlmeSk7CiAKLUlOVCBCY21VcGRhdGVTZWN0b3JTaXplKFBNSU5JX0FEQVBURVIgQWRhcHRlcixVSU5UIHVpU2VjdG9yU2l6ZSk7CiAKIElOVCBCY21Jbml0TlZNKFBNSU5JX0FEQVBURVIgQWRhcHRlcik7CiAKLUlOVCBCY21HZXROdm1TaXplKFBNSU5JX0FEQVBURVIgQWRhcHRlcik7CitJTlQgQmNtVXBkYXRlU2VjdG9yU2l6ZShQTUlOSV9BREFQVEVSIEFkYXB0ZXIsVUlOVCB1aVNlY3RvclNpemUpOworQk9PTEVBTiBJc1NlY3Rpb25FeGlzdEluRmxhc2goUE1JTklfQURBUFRFUiBBZGFwdGVyLCBGTEFTSDJYX1NFQ1RJT05fVkFMIHNlY3Rpb24pOwogCi1JTlQgSXNTZWN0aW9uRXhpc3RJblZlbmRvckluZm8oUE1JTklfQURBUFRFUiBBZGFwdGVyLCBGTEFTSDJYX1NFQ1RJT05fVkFMIHNlY3Rpb24pOwotCi1WT0lEIEJjbVZhbGlkYXRlTnZtVHlwZShQTUlOSV9BREFQVEVSIEFkYXB0ZXIpOwotCi1WT0lEIENvbmZpZ3VyZUVuZFBvaW50VHlwZXNUaHJvdWdoRUVQUk9NKFBNSU5JX0FEQVBURVIgQWRhcHRlcik7Ci0KLUlOVCBCY21HZXRGbGFzaENTSW5mbyhQTUlOSV9BREFQVEVSIEFkYXB0ZXIpOwotSU5UIFJlYWREU0RIZWFkZXIoUE1JTklfQURBUFRFUiBBZGFwdGVyLCBQRFNEX0hFQURFUiBwc0RTREhlYWRlciwgRkxBU0gyWF9TRUNUSU9OX1ZBTCBkc2QpOwotSU5UIEJjbUdldEFjdGl2ZURTRChQTUlOSV9BREFQVEVSIEFkYXB0ZXIpOwotSU5UIFJlYWRJU09IZWFkZXIoUE1JTklfQURBUFRFUiBBZGFwdGVyLCBQSVNPX0hFQURFUiBwc0lTT0hlYWRlciwgRkxBU0gyWF9TRUNUSU9OX1ZBTCBJc29JbWFnZSk7Ci1JTlQgQmNtR2V0QWN0aXZlSVNPKFBNSU5JX0FEQVBURVIgQWRhcHRlcik7Ci1CX1VJTlQ4IElzT2Zmc2V0V3JpdGFibGUoUE1JTklfQURBUFRFUiBBZGFwdGVyLCBVSU5UIHVpT2Zmc2V0KTsKIElOVCBCY21HZXRGbGFzaDJ4U2VjdGlvbmFsQml0TWFwKFBNSU5JX0FEQVBURVIgQWRhcHRlciwgUEZMQVNIMlhfQklUTUFQIHBzRmxhc2gyeEJpdE1hcCk7CiAKIElOVCBCY21GbGFzaDJ4QnVsa1dyaXRlKApAQCAtMjUxLDcgKzE3OSw2IEBACiAJRkxBU0gyWF9TRUNUSU9OX1ZBTCBlRmxhc2hTZWN0aW9uVmFsLAogCVVJTlQgdWlPZmZzZXRXaXRoaW5TZWN0aW9uVmFsLAogCVVJTlQgdWlOdW1CeXRlcyk7Ci1JTlQgQmNtR2V0U2VjdGlvblZhbEVuZE9mZnNldChQTUlOSV9BREFQVEVSIEFkYXB0ZXIsIEZMQVNIMlhfU0VDVElPTl9WQUwgZUZsYXNoU2VjdGlvblZhbCk7CiAKIElOVCBCY21HZXRTZWN0aW9uVmFsU3RhcnRPZmZzZXQoUE1JTklfQURBUFRFUiBBZGFwdGVyLCBGTEFTSDJYX1NFQ1RJT05fVkFMIGVGbGFzaFNlY3Rpb25WYWwpOwogCkBAIC0yNjQsMzQgKzE5MSwxMyBAQAogSU5UIEJjbUZsYXNoMnhXcml0ZVNpZyhQTUlOSV9BREFQVEVSIEFkYXB0ZXIsIEZMQVNIMlhfU0VDVElPTl9WQUwgZUZsYXNoU2VjdGlvblZhbCk7CiBJTlQJdmFsaWRhdGVGbGFzaDJ4UmVhZFdyaXRlKFBNSU5JX0FEQVBURVIgQWRhcHRlciwgUEZMQVNIMlhfUkVBRFdSSVRFIHBzRmxhc2gyeFJlYWRXcml0ZSk7CiBJTlQgSXNGbGFzaDJ4KFBNSU5JX0FEQVBURVIgQWRhcHRlcik7Ci1JTlQgR2V0Rmxhc2hCYXNlQWRkcihQTUlOSV9BREFQVEVSIEFkYXB0ZXIpOwotSU5UIFNhdmVIZWFkZXJJZlByZXNlbnQoUE1JTklfQURBUFRFUiBBZGFwdGVyLCBQVUNIQVIgcEJ1ZmYsIFVJTlQgdWlTZWN0QWxpZ25BZGRyKTsKIElOVAlCY21Db3B5U2VjdGlvbihQTUlOSV9BREFQVEVSIEFkYXB0ZXIsCiAJCQkJCQlGTEFTSDJYX1NFQ1RJT05fVkFMIFNyY1NlY3Rpb24sCiAJCQkJCQlGTEFTSDJYX1NFQ1RJT05fVkFMIERzdFNlY3Rpb24sCiAJCQkJCQlVSU5UIG9mZnNldCwKIAkJCQkJCVVJTlQgbnVtT2ZCeXRlcyk7CiAKLUlOVCBCY21Eb0NoaXBTZWxlY3QoUE1JTklfQURBUFRFUiBBZGFwdGVyLCBVSU5UIG9mZnNldCk7Ci1JTlQgQmNtTWFrZUZsYXNoQ1NBY3RpdmUoUE1JTklfQURBUFRFUiBBZGFwdGVyLCBVSU5UIG9mZnNldCk7Ci1JTlQgUmVhZERTRFNpZ25hdHVyZShQTUlOSV9BREFQVEVSIEFkYXB0ZXIsIEZMQVNIMlhfU0VDVElPTl9WQUwgZHNkKTsKLUlOVCBSZWFkRFNEUHJpb3JpdHkoUE1JTklfQURBUFRFUiBBZGFwdGVyLCBGTEFTSDJYX1NFQ1RJT05fVkFMIGRzZCk7Ci1GTEFTSDJYX1NFQ1RJT05fVkFMIGdldEhpZ2hlc3RQcmlEU0QoUE1JTklfQURBUFRFUiBBZGFwdGVyKTsKLUlOVCBSZWFkSVNPU2lnbmF0dXJlKFBNSU5JX0FEQVBURVIgQWRhcHRlciwgRkxBU0gyWF9TRUNUSU9OX1ZBTCBpc28pOwotSU5UIFJlYWRJU09Qcmlvcml0eShQTUlOSV9BREFQVEVSIEFkYXB0ZXIsIEZMQVNIMlhfU0VDVElPTl9WQUwgaXNvKTsKLUZMQVNIMlhfU0VDVElPTl9WQUwgZ2V0SGlnaGVzdFByaUlTTyhQTUlOSV9BREFQVEVSIEFkYXB0ZXIpOwotSU5UIFdyaXRlVG9GbGFzaFdpdGhvdXRTZWN0b3JFcmFzZShQTUlOSV9BREFQVEVSIEFkYXB0ZXIsCi0JCQkJCQkJCQkJUFVJTlQgcEJ1ZmYsCi0JCQkJCQkJCQkJRkxBU0gyWF9TRUNUSU9OX1ZBTCBlRmxhc2gyeFNlY3Rpb25WYWwsCi0JCQkJCQkJCQkJVUlOVCB1aU9mZnNldCwKLQkJCQkJCQkJCQlVSU5UIHVpTnVtQnl0ZXMKLQkJCQkJCQkJCQkpOwogCi0vL1VJTlQgZ2V0TnVtT2ZTdWJTZWN0aW9uV2l0aFdSUGVybWlzc29uKFBNSU5JX0FEQVBURVIgQWRhcHRlciwgU0VDVElPTl9UWVBFIHNlY1R5cGUpOwotQk9PTEVBTiBJc1NlY3Rpb25FeGlzdEluRmxhc2goUE1JTklfQURBUFRFUiBBZGFwdGVyLCBGTEFTSDJYX1NFQ1RJT05fVkFMIHNlY3Rpb24pOwotSU5UIElzU2VjdGlvbldyaXRhYmxlKFBNSU5JX0FEQVBURVIgQWRhcHRlciwgRkxBU0gyWF9TRUNUSU9OX1ZBTCBTZWN0aW9uKTsKLUlOVCBDb3JydXB0RFNEU2lnKFBNSU5JX0FEQVBURVIgQWRhcHRlciwgRkxBU0gyWF9TRUNUSU9OX1ZBTCBlRmxhc2gyeFNlY3Rpb25WYWwpOwotSU5UIENvcnJ1cHRJU09TaWcoUE1JTklfQURBUFRFUiBBZGFwdGVyLCBGTEFTSDJYX1NFQ1RJT05fVkFMIGVGbGFzaDJ4U2VjdGlvblZhbCk7CiBCT09MRUFOIElzTm9uQ0RMZXNzRGV2aWNlKFBNSU5JX0FEQVBURVIgQWRhcHRlcik7CiAKIApAQCAtMzAwLDcgKzIwNiw2IEBACiBpbnQgd3JtYWx0V2l0aExvY2sgKFBNSU5JX0FEQVBURVIgQWRhcHRlciwgVUlOVCB1aUFkZHJlc3MsIFBVSU5UIHB1Y0J1ZmYsIHNpemVfdCBzU2l6ZSk7CiBpbnQgcmRtYWx0V2l0aExvY2sgKFBNSU5JX0FEQVBURVIgQWRhcHRlciwgVUlOVCB1aUFkZHJlc3MsIFBVSU5UIHB1Y0J1ZmYsIHNpemVfdCBzU2l6ZSk7CiAKLWludCByZG1XaXRoTG9jayhQTUlOSV9BREFQVEVSIEFkYXB0ZXIsIFVJTlQgdWlBZGRyZXNzLCBQQ0hBUiBwdWNCdWZmLCBzaXplX3Qgc2l6ZSk7CiBpbnQgd3JtV2l0aExvY2soUE1JTklfQURBUFRFUiBBZGFwdGVyLCBVSU5UIHVpQWRkcmVzcywgUENIQVIgcHVjQnVmZiwgc2l6ZV90IHNpemUpOwogSU5UIGJ1ZmZEbmxkVmVyaWZ5KFBNSU5JX0FEQVBURVIgQWRhcHRlciwgdW5zaWduZWQgY2hhciAqbWFwcGVkYnVmZmVyLCB1bnNpZ25lZCBpbnQgdTMyRmlybXdhcmVMZW5ndGgsCiAJCXVuc2lnbmVkIGxvbmcgdTMyU3RhcnRpbmdBZGRyZXNzKTsKQEAgLTMwOSwxMSArMjE0LDYgQEAKIFZPSUQgcHV0VXNiU3VzcGVuZChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOwogQk9PTEVBTiBJc1JlcUdwaW9Jc0xlZEluTlZNKFBNSU5JX0FEQVBURVIgQWRhcHRlciwgVUlOVCBncGlvcyk7CiAKLSNpZmRlZiBCQ01fU0hNX0lOVEVSRkFDRQotSU5UIGJlY2VlbV92aXJ0dWFsX2RldmljZV9pbml0KHZvaWQpOwotVk9JRCB2aXJ0dWFsX21haWxfYm94X2ludGVycnVwdCh2b2lkKTsKLUlOVCBiZWNlZW1fdmlydHVhbF9kZXZpY2VfZXhpdCh2b2lkKTsKLSNlbmRpZgogCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JjbS9Rb3MuYyBiL2RyaXZlcnMvc3RhZ2luZy9iY20vUW9zLmMKaW5kZXggNzViMmI4Ny4uOGNlNDUzNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JjbS9Rb3MuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvYmNtL1Fvcy5jCkBAIC00LDE1ICs0LDE0IEBACiAqLwogI2luY2x1ZGUgImhlYWRlcnMuaCIKIAotQk9PTEVBTiBNYXRjaFNyY0lwQWRkcmVzcyhTX0NMQVNTSUZJRVJfUlVMRSAqcHN0Q2xhc3NpZmllclJ1bGUsVUxPTkcgdWxTcmNJUCk7Ci1CT09MRUFOIE1hdGNoVG9zKFNfQ0xBU1NJRklFUl9SVUxFICpwc3RDbGFzc2lmaWVyUnVsZSxVQ0hBUiB1Y1R5cGVPZlNlcnZpY2UpOwotQk9PTEVBTiBNYXRjaFNyY1BvcnQoU19DTEFTU0lGSUVSX1JVTEUgKnBzdENsYXNzaWZpZXJSdWxlLFVTSE9SVCB1c2hTcmNQb3J0KTsKLUJPT0xFQU4gTWF0Y2hEZXN0UG9ydChTX0NMQVNTSUZJRVJfUlVMRSAqcHN0Q2xhc3NpZmllclJ1bGUsVVNIT1JUIHVzaERlc3RQb3J0KTsKLUJPT0xFQU4gTWF0Y2hQcm90b2NvbChTX0NMQVNTSUZJRVJfUlVMRSAqcHN0Q2xhc3NpZmllclJ1bGUsVUNIQVIgdWNQcm90b2NvbCk7Ci1CT09MRUFOIE1hdGNoRGVzdElwQWRkcmVzcyhTX0NMQVNTSUZJRVJfUlVMRSAqcHN0Q2xhc3NpZmllclJ1bGUsVUxPTkcgdWxEZXN0SVApOwotVVNIT1JUIENsYXNzaWZ5UGFja2V0KFBNSU5JX0FEQVBURVIgQWRhcHRlcixzdHJ1Y3Qgc2tfYnVmZiogc2tiKTsKLXZvaWQgRVRoQ1NHZXRQa3RJbmZvKFBNSU5JX0FEQVBURVIgQWRhcHRlcixQVk9JRCBwdkV0aFBheWxvYWQsUFNfRVRIQ1NfUEtUX0lORk8gcHN0RXRoQ3NQa3RJbmZvKTsKLUJPT0xFQU4gRVRoQ1NDbGFzc2lmeVBrdChQTUlOSV9BREFQVEVSIEFkYXB0ZXIsc3RydWN0IHNrX2J1ZmYqIHNrYixQU19FVEhDU19QS1RfSU5GTyBwc3RFdGhDc1BrdEluZm8sU19DTEFTU0lGSUVSX1JVTEUgKnBzdENsYXNzaWZpZXJSdWxlLCBCX1VJTlQ4IEV0aENTQ3VwcG9ydCk7CitzdGF0aWMgdm9pZCBFVGhDU0dldFBrdEluZm8oUE1JTklfQURBUFRFUiBBZGFwdGVyLFBWT0lEIHB2RXRoUGF5bG9hZCxQU19FVEhDU19QS1RfSU5GTyBwc3RFdGhDc1BrdEluZm8pOworc3RhdGljIEJPT0xFQU4gRVRoQ1NDbGFzc2lmeVBrdChQTUlOSV9BREFQVEVSIEFkYXB0ZXIsc3RydWN0IHNrX2J1ZmYqIHNrYixQU19FVEhDU19QS1RfSU5GTyBwc3RFdGhDc1BrdEluZm8sU19DTEFTU0lGSUVSX1JVTEUgKnBzdENsYXNzaWZpZXJSdWxlLCBCX1VJTlQ4IEV0aENTQ3VwcG9ydCk7CisKK3N0YXRpYyBVU0hPUlQJSXBWZXJzaW9uNChQTUlOSV9BREFQVEVSIEFkYXB0ZXIsIHN0cnVjdCBpcGhkciAqaXBoZCwKKwkJCSAgIFNfQ0xBU1NJRklFUl9SVUxFICpwc3RDbGFzc2lmaWVyUnVsZSApOworCitzdGF0aWMgVk9JRCBQcnVuZVF1ZXVlKFBNSU5JX0FEQVBURVIgQWRhcHRlciwgSU5UIGlJbmRleCk7CisKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogRnVuY3Rpb24gICAgLSBNYXRjaFNyY0lwQWRkcmVzcygpCkBAIC0yMDUsMTEgKzIwNCwxMCBAQAogQ29tcGFyZXMgSVBWNCBJcCBhZGRyZXNzIGFuZCBwb3J0IG51bWJlcgogQHJldHVybiBRdWV1ZSBJbmRleC4KICovCi1VU0hPUlQJSXBWZXJzaW9uNChQTUlOSV9BREFQVEVSIEFkYXB0ZXIsIC8qKjwgUG9pbnRlciB0byB0aGUgZHJpdmVyIGNvbnRyb2wgc3RydWN0dXJlICovCi0JCQkJCXN0cnVjdCBpcGhkciAqaXBoZCwgLyoqPFBvaW50ZXIgdG8gdGhlIElQIEhkciBvZiB0aGUgcGFja2V0Ki8KLQkJCQkJU19DTEFTU0lGSUVSX1JVTEUgKnBzdENsYXNzaWZpZXJSdWxlICkKK3N0YXRpYyBVU0hPUlQJSXBWZXJzaW9uNChQTUlOSV9BREFQVEVSIEFkYXB0ZXIsCisJCQkgICBzdHJ1Y3QgaXBoZHIgKmlwaGQsCisJCQkgICBTX0NMQVNTSUZJRVJfUlVMRSAqcHN0Q2xhc3NpZmllclJ1bGUgKQogewotCS8vSVBIZWFkZXJGb3JtYXQgCQkqcElwSGVhZGVyPU5VTEw7CiAJeHBvcnRoZHIgICAgIAkJKnhwcnRfaGRyPU5VTEw7CiAJQk9PTEVBTgliQ2xhc3NpZmljYXRpb25TdWNjZWVkPUZBTFNFOwogCkBAIC0yNjEsMTUgKzI1OSw2IEBACiAJCS8vaWYgcHJvdG9jb2wgaXMgbm90IFRDUCBvciBVRFAgdGhlbiBubyBuZWVkIG9mIGNvbXBhcmluZyBzb3VyY2UgcG9ydCBhbmQgZGVzdGluYXRpb24gcG9ydAogCQlpZihpcGhkLT5wcm90b2NvbCE9VENQICYmIGlwaGQtPnByb3RvY29sIT1VRFApCiAJCQlicmVhazsKLSNpZiAwCi0JCS8vY2hlY2sgaWYgbWVtb3J5IGlzIGF2YWlsYWJsZSBvZiBzcmMgYW5kIERlc3QgcG9ydAotCQlpZihFVEhfQU5EX0lQX0hFQURFUl9MRU4gKyBMNF9TUkNfUE9SVF9MRU4gKyBMNF9ERVNUX1BPUlRfTEVOID4gUGFja2V0LT5sZW4pCi0JCXsKLQkJCS8vVGhpcyBpcyBub3QgYW4gZXJyb25lb3VzIGNvbmRpdGlvbiBhbmQgcGt0IHdpbGwgYmUgY2hlY2tlZCBmb3IgbmV4dCBjbGFzc2lmaWNhdGlvbi4KLQkJCWJDbGFzc2lmaWNhdGlvblN1Y2NlZWQgPSBGQUxTRTsKLQkJCWJyZWFrOwotCQl9Ci0jZW5kaWYKIAkJLy8qKioqKioqKioqKioqKioqKipDaGVja2luZyBUcmFuc3BvcnQgTGF5ZXIgSGVhZGVyIGZpZWxkIGlmIHByZXNlbnQgKioqKioqKioqKioqKioqKiovLwogCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9UWCwgSVBWNF9EQkcsIERCR19MVkxfQUxMLCAiU291cmNlIFBvcnQgJTA0eCIsCiAJCQkoaXBoZC0+cHJvdG9jb2w9PVVEUCk/eHBydF9oZHItPnVoZHIuc291cmNlOnhwcnRfaGRyLT50aGRyLnNvdXJjZSk7CkBAIC0zMTIsMjkgKzMwMSw2IEBACiAKIAlyZXR1cm4gYkNsYXNzaWZpY2F0aW9uU3VjY2VlZDsKIH0KLS8qKgotQGluZ3JvdXAgdHhfZnVuY3Rpb25zCi1AcmV0dXJuICBRdWV1ZSBJbmRleCBiYXNlZCBvbiBwcmlvcml0eS4KLSovCi1VU0hPUlQgR2V0UGFja2V0UXVldWVJbmRleChQTUlOSV9BREFQVEVSIEFkYXB0ZXIsIC8qKjxQb2ludGVyIHRvIHRoZSBkcml2ZXIgY29udHJvbCBzdHJ1Y3R1cmUgKi8KLQkJCQkJCQkJc3RydWN0IHNrX2J1ZmYqIFBhY2tldCAvKio8IFBvaW50ZXIgdG8gdGhlIFBhY2tldCB0byBiZSBzZW50Ki8KLQkJCQkJCQkJKQotewotCVVTSE9SVAkJCXVzSW5kZXg9LTE7Ci0JQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfVFgsIFFVRVVFX0lOREVYLCBEQkdfTFZMX0FMTCwgIj09PT09PiIpOwotCi0JaWYoTlVMTD09QWRhcHRlciB8fCBOVUxMPT1QYWNrZXQpCi0JewotCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9UWCwgUVVFVUVfSU5ERVgsIERCR19MVkxfQUxMLCAiR290IE5VTEwgVmFsdWVzPD09PT09PSIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JdXNJbmRleCA9IENsYXNzaWZ5UGFja2V0KEFkYXB0ZXIsUGFja2V0KTsKLQotCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1RYLCBRVUVVRV9JTkRFWCwgREJHX0xWTF9BTEwsICJHb3QgUXVldWUgSW5kZXggJXgiLHVzSW5kZXgpOwotCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1RYLCBRVUVVRV9JTkRFWCwgREJHX0xWTF9BTEwsICJHZXRQYWNrZXRRdWV1ZUluZGV4IDw9PT09PT09PT09PT09PSIpOwotCXJldHVybiB1c0luZGV4OwotfQogCiBWT0lEIFBydW5lUXVldWVBbGxTRihQTUlOSV9BREFQVEVSIEFkYXB0ZXIpCiB7CkBAIC0zNTcsMjMgKzMyMywyMSBAQAogZHJvcHMgcGFja2V0cyBmcm9tIHRoZSBIZWFkIHRpbGwgdGhlIG51bWJlciBvZiBieXRlcyBpcwogbGVzcyB0aGFuIG9yIGVxdWFsIHRvIG1heCBxdWV1ZSBzaXplIGZvciB0aGUgcXVldWUuCiAqLwotVk9JRCBQcnVuZVF1ZXVlKFBNSU5JX0FEQVBURVIgQWRhcHRlciwvKio8UG9pbnRlciB0byB0aGUgZHJpdmVyIGNvbnRyb2wgc3RydWN0dXJlKi8KLQkJCQkJSU5UIGlJbmRleC8qKjxRdWV1ZSBJbmRleCovCi0JCQkJCSkKK3N0YXRpYyBWT0lEIFBydW5lUXVldWUoUE1JTklfQURBUFRFUiBBZGFwdGVyLCBJTlQgaUluZGV4KQogewogCXN0cnVjdCBza19idWZmKiBQYWNrZXRUb0Ryb3A9TlVMTDsKLQlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyogIG5ldHN0YXRzPU5VTEw7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKm5ldHN0YXRzOwogCiAJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfVFgsIFBSVU5FX1FVRVVFLCBEQkdfTFZMX0FMTCwgIj09PT09PiBJbmRleCAlZCIsaUluZGV4KTsKIAogICAgCWlmKGlJbmRleCA9PSBIaVByaW9yaXR5KQotICAgICAgIAlyZXR1cm47CisJCXJldHVybjsKIAogCWlmKCFBZGFwdGVyIHx8IChpSW5kZXggPCAwKSB8fCAoaUluZGV4ID4gSGlQcmlvcml0eSkpCiAJCXJldHVybjsKIAogCS8qIFRvIFN0b3JlIHRoZSBuZXRkZXZpY2Ugc3RhdGlzdGljICovCi0JbmV0c3RhdHMgPSAmKChQTElOVVhfREVQX0RBVEEpQWRhcHRlci0+cHZPc0RlcERhdGEpLT5uZXRzdGF0czsKKwluZXRzdGF0cyA9ICZBZGFwdGVyLT5kZXYtPnN0YXRzOwogCiAJc3Bpbl9sb2NrX2JoKCZBZGFwdGVyLT5QYWNrSW5mb1tpSW5kZXhdLlNGUXVldWVMb2NrKTsKIApAQCAtMzk1LDkgKzM1OSwxMyBAQAogCiAJCWlmKFBhY2tldFRvRHJvcCkKIAkJewotCQkJaWYobmV0c3RhdHMpCi0JCQkJbmV0c3RhdHMtPnR4X2Ryb3BwZWQrKzsKLQkJCWF0b21pY19pbmMoJkFkYXB0ZXItPlR4RHJvcHBlZFBhY2tldENvdW50KTsKKwkJCXN0cnVjdCBuZXRkZXZfcXVldWUgKnR4cSA9IG5ldGRldl9nZXRfdHhfcXVldWUoQWRhcHRlci0+ZGV2LCBpSW5kZXgpOworCQkJaWYgKG5ldGlmX21zZ190eF9lcnIoQWRhcHRlcikpCisJCQkJcHJfaW5mbyhQRlggIiVzOiB0eCBxdWV1ZSAlZCBvdmVybGltaXRcbiIsIAorCQkJCQlBZGFwdGVyLT5kZXYtPm5hbWUsIGlJbmRleCk7CisKKwkJCXR4cS0+dHhfZHJvcHBlZCsrOworCiAJCQlERVFVRVVFUEFDS0VUKEFkYXB0ZXItPlBhY2tJbmZvW2lJbmRleF0uRmlyc3RUeFF1ZXVlLAogCQkJCQkJQWRhcHRlci0+UGFja0luZm9baUluZGV4XS5MYXN0VHhRdWV1ZSk7CiAJCQkvLy8gdXBkYXRlIGN1cnJlbnQgYnl0ZXMgYW5kIHBhY2tldHMgY291bnQKQEAgLTQwNyw3ICszNzUsNyBAQAogCQkJLy8vIHVwZGF0ZSBkcm9wcGVkIGJ5dGVzIGFuZCBwYWNrZXRzIGNvdW50cwogCQkJQWRhcHRlci0+UGFja0luZm9baUluZGV4XS51aURyb3BwZWRDb3VudEJ5dGVzICs9IFBhY2tldFRvRHJvcC0+bGVuOwogCQkJQWRhcHRlci0+UGFja0luZm9baUluZGV4XS51aURyb3BwZWRDb3VudFBhY2tldHMrKzsKLQkJCWJjbV9rZnJlZV9za2IoUGFja2V0VG9Ecm9wKTsKKwkJCWRldl9rZnJlZV9za2IoUGFja2V0VG9Ecm9wKTsKIAogCQl9CiAKQEAgLTQxNiw3ICszODQsNiBAQAogCQkJQWRhcHRlci0+UGFja0luZm9baUluZGV4XS51aURyb3BwZWRDb3VudFBhY2tldHMpOwogCiAJCWF0b21pY19kZWMoJkFkYXB0ZXItPlRvdGFsUGFja2V0Q291bnQpOwotCQlBZGFwdGVyLT5iY21famlmZmllcyA9IGppZmZpZXM7CiAJfQogCiAJc3Bpbl91bmxvY2tfYmgoJkFkYXB0ZXItPlBhY2tJbmZvW2lJbmRleF0uU0ZRdWV1ZUxvY2spOwpAQCAtNDMwLDE2ICszOTcsMTUgQEAKIHsKIAlJTlQJCWlRSW5kZXg7CiAJVUlOVAl1aVRvdGFsUGFja2V0TGVuZ3RoOwotCXN0cnVjdCBza19idWZmKgkJCQlQYWNrZXRUb0Ryb3A9TlVMTDsKLQlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyogIAluZXRzdGF0cz1OVUxMOworCXN0cnVjdCBza19idWZmKgkJCVBhY2tldFRvRHJvcD1OVUxMOwogCiAJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBEVU1QX0lORk8sIERCR19MVkxfQUxMLCAiPT09PT0+Iik7Ci0JLyogVG8gU3RvcmUgdGhlIG5ldGRldmljZSBzdGF0aXN0aWMgKi8KLQluZXRzdGF0cyA9ICYoKFBMSU5VWF9ERVBfREFUQSlBZGFwdGVyLT5wdk9zRGVwRGF0YSktPm5ldHN0YXRzOwogCiAvLwlkb3duKCZBZGFwdGVyLT5kYXRhX3BhY2tldF9xdWV1ZV9sb2NrKTsKIAlmb3IoaVFJbmRleD1Mb3dQcmlvcml0eTsgaVFJbmRleDxIaVByaW9yaXR5OyBpUUluZGV4KyspCiAJeworCQlzdHJ1Y3QgbmV0ZGV2X3F1ZXVlICp0eHEgPSBuZXRkZXZfZ2V0X3R4X3F1ZXVlKEFkYXB0ZXItPmRldiwgaVFJbmRleCk7CisKIAkJc3Bpbl9sb2NrX2JoKCZBZGFwdGVyLT5QYWNrSW5mb1tpUUluZGV4XS5TRlF1ZXVlTG9jayk7CiAJCXdoaWxlKEFkYXB0ZXItPlBhY2tJbmZvW2lRSW5kZXhdLkZpcnN0VHhRdWV1ZSkKIAkJewpAQCAtNDQ3LDggKzQxMyw3IEBACiAJCQlpZihQYWNrZXRUb0Ryb3ApCiAJCQl7CiAJCQkJdWlUb3RhbFBhY2tldExlbmd0aCA9IFBhY2tldFRvRHJvcC0+bGVuOwotCQkJCW5ldHN0YXRzLT50eF9kcm9wcGVkKys7Ci0JCQkJYXRvbWljX2luYygmQWRhcHRlci0+VHhEcm9wcGVkUGFja2V0Q291bnQpOworCQkJCXR4cS0+dHhfZHJvcHBlZCsrOwogCQkJfQogCQkJZWxzZQogCQkJCXVpVG90YWxQYWNrZXRMZW5ndGggPSAwOwpAQCAtNDU3LDcgKzQyMiw3IEBACiAJCQkJCQlBZGFwdGVyLT5QYWNrSW5mb1tpUUluZGV4XS5MYXN0VHhRdWV1ZSk7CiAKIAkJCS8qIEZyZWUgdGhlIHNrYiAqLwotCQkJYmNtX2tmcmVlX3NrYihQYWNrZXRUb0Ryb3ApOworCQkJZGV2X2tmcmVlX3NrYihQYWNrZXRUb0Ryb3ApOwogCiAJCQkvLy8gdXBkYXRlIGN1cnJlbnQgYnl0ZXMgYW5kIHBhY2tldHMgY291bnQKIAkJCUFkYXB0ZXItPlBhY2tJbmZvW2lRSW5kZXhdLnVpQ3VycmVudEJ5dGVzT25Ib3N0IC09IHVpVG90YWxQYWNrZXRMZW5ndGg7CkBAIC01NTksMTIgKzUyNCw2IEBACiAKIAlmb3IodWlMb29wSW5kZXggPSBNQVhfQ0xBU1NJRklFUlMgLSAxOyB1aUxvb3BJbmRleCA+PSAwOyB1aUxvb3BJbmRleC0tKQogCXsKLQkJaWYgKEFkYXB0ZXItPmRldmljZV9yZW1vdmVkKQotCQl7Ci0JCQliQ2xhc3NpZmljYXRpb25TdWNjZWVkID0gRkFMU0U7Ci0JCQlicmVhazsKLQkJfQotCiAJCWlmKGJDbGFzc2lmaWNhdGlvblN1Y2NlZWQpCiAJCQlicmVhazsKIAkJLy9JdGVyYXRlIHRocm91Z2ggYWxsIGNsYXNzaWZpZXJzIHdoaWNoIGFyZSBhbHJlYWR5IGluIG9yZGVyIG9mIHByaW9yaXR5CkBAIC04MTAsNyArNzY5LDEwIEBACiB9CiAKIAotQk9PTEVBTiBFVGhDU0NsYXNzaWZ5UGt0KFBNSU5JX0FEQVBURVIgQWRhcHRlcixzdHJ1Y3Qgc2tfYnVmZiogc2tiLFBTX0VUSENTX1BLVF9JTkZPIHBzdEV0aENzUGt0SW5mbyxTX0NMQVNTSUZJRVJfUlVMRSAqcHN0Q2xhc3NpZmllclJ1bGUsIEJfVUlOVDggRXRoQ1NDdXBwb3J0KQorc3RhdGljIEJPT0xFQU4gRVRoQ1NDbGFzc2lmeVBrdChQTUlOSV9BREFQVEVSIEFkYXB0ZXIsc3RydWN0IHNrX2J1ZmYqIHNrYiwKKwkJCQlQU19FVEhDU19QS1RfSU5GTyBwc3RFdGhDc1BrdEluZm8sCisJCQkJU19DTEFTU0lGSUVSX1JVTEUgKnBzdENsYXNzaWZpZXJSdWxlLAorCQkJCUJfVUlOVDggRXRoQ1NDdXBwb3J0KQogewogCUJPT0xFQU4gYkNsYXNzaWZpY2F0aW9uU3VjY2VlZCA9IEZBTFNFOwogCWJDbGFzc2lmaWNhdGlvblN1Y2NlZWQgPSBFdGhDU01hdGNoU3JjTUFDQWRkcmVzcyhwc3RDbGFzc2lmaWVyUnVsZSwoKEVUSF9IRUFERVJfU1RSVUMgKikoc2tiLT5kYXRhKSktPmF1OFNvdXJjZUFkZHJlc3MpOwpAQCAtODQwLDkgKzgwMiwxMSBAQAogCXJldHVybiBiQ2xhc3NpZmljYXRpb25TdWNjZWVkOwogfQogCi12b2lkIEVUaENTR2V0UGt0SW5mbyhQTUlOSV9BREFQVEVSIEFkYXB0ZXIsUFZPSUQgcHZFdGhQYXlsb2FkLFBTX0VUSENTX1BLVF9JTkZPIHBzdEV0aENzUGt0SW5mbykKK3N0YXRpYyB2b2lkIEVUaENTR2V0UGt0SW5mbyhQTUlOSV9BREFQVEVSIEFkYXB0ZXIsUFZPSUQgcHZFdGhQYXlsb2FkLAorCQkJICAgIFBTX0VUSENTX1BLVF9JTkZPIHBzdEV0aENzUGt0SW5mbykKIHsKIAlVU0hPUlQgdTE2RXR5cGUgPSBudG9ocygoKEVUSF9IRUFERVJfU1RSVUMqKXB2RXRoUGF5bG9hZCktPnUxNkV0eXBlKTsKKwogCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9UWCwgSVBWNF9EQkcsIERCR19MVkxfQUxMLCAgIkV0aENTR2V0UGt0SW5mbyA6IEV0aCBIZHIgVHlwZSA6ICVYXG4iLHUxNkV0eXBlKTsKIAlpZih1MTZFdHlwZSA+IDB4NWRjKQogCXsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iY20vVE9ETyBiL2RyaXZlcnMvc3RhZ2luZy9iY20vVE9ETwppbmRleCAzNjY2MzRiLi5jZDNlOWYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYmNtL1RPRE8KKysrIGIvZHJpdmVycy9zdGFnaW5nL2JjbS9UT0RPCkBAIC0xLDE1ICsxLDIyIEBACitUaGlzIGRyaXZlciBpcyBiYXJlbHkgZnVuY3Rpb25hbCBpbiBpdHMgY3VycmVudCBzdGF0ZS4KKworQklHOgorCS0gZXhpc3RpbmcgQVBJIGlzICgvZGV2L3RhcmFuZykgc2hvdWxkIGJlIHJlcGxhY2VkCisJICBJcyBpdCBwb3NzaWJsZSB0byB1c2Ugc2FtZSBBUEkgYXMgSW50ZWwgV2ltYXggc3RhY2sgYW5kCisJICBoYXZlIHNhbWUgdXNlciBsZXZlbCBjb21wb25lbnRzLgorCS0gUW9zIGFuZCBxdWV1ZSBtb2RlbCBpcyBub24tc3RhbmRhcmQgYW5kIGluZmxleGlibGUuCisJICBVc2UgZXhpc3RpbmcgVEMgUW9zPworCiBUT0RPOgorCS0gc3VwcG9ydCBtb3JlIHRoYW4gb25lIGJvYXJkIC0gZWxpbWluYXRlIGdsb2JhbCB2YXJpYWJsZXMKKwktIHJlbW92ZSBkZXZlbG9wZXIgZGVidWcgQkNNX0RFQlVHKCkgbWFjcm9zCisJICBhZGQgYSBsaW1pdGVkIG51bWJlciBvZiBtZXNzYWdlcyB0aHJvdWdoIG5ldGlmX21zZygpCiAJLSBmaXggbm9uLXN0YW5kYXJkIGtlcm5lbCBzdHlsZQotCS0gc3BhcnNlIHdhcm5pbmdzCiAJLSBjaGVja3BhdGNoIHdhcm5pbmdzCi0gICAJLSByZW1vdmUgY29tcGF0aWFibGl0eSBjb2RlIGZvciBvbGRlciBrZXJuZWxzCi0JLSByZW1vdmUgI2lmZGVmJ3MKLQktIGZpeCBib2d1cyBkZXZpY2UgbmFtZWluZyBhbmQgcmVmZXJlbmNlIGNvdW50aW5nIChzZWUgYmNtX25vdGlmeV9ldmVudCkKLQktIGZpeCB1c2Ugb2YgZmlsZSBJL08gdG8gbG9hZCBjb25maWcKLQktIHJlcXVlc3QgZmlybXdhcmUKLQktIHVwZGF0ZSB0byBjdXJyZW50IG5ldHdvcmsgZGV2aWNlIEFQSQotCS0gbWVyZ2Ugc29tZSBmaWxlcyB0b2dldGhlcgorCS0gdXNlIHJlcXVlc3QgZmlybXdhcmUKKwktIGZpeCB1c2Ugb2YgZmlsZSBJL08gdG8gbG9hZCBjb25maWcgd2l0aCBiZXR0ZXIgQVBJCisJLSBtZXJnZSBzb21lIGZpbGVzIHRvZ2V0aGVyPwogCS0gY2xlYW51cC9lbGltaW5hdGUgZGVidWcgbWVzc2FnZXMKIAotCS0gaW50ZWdyYXRlIHdpdGggZXhpc3RpbmcgV2ltYXggc3RhY2s/CisKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JjbS9UcmFuc21pdC5jIGIvZHJpdmVycy9zdGFnaW5nL2JjbS9UcmFuc21pdC5jCmluZGV4IDEyZjllMTMuLjBmNzAwMDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9iY20vVHJhbnNtaXQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvYmNtL1RyYW5zbWl0LmMKQEAgLTYsNyArNiw3IEBACiBkaWdyYXBoIHRyYW5zbWl0MSB7CiBub2RlW3NoYXBlPWJveF0KIGVkZ2Vbd2VpZ2h0PTU7Y29sb3I9cmVkXQotYmNtX3RyYW5zbWl0LT5yZXBseV90b19hcnBfcmVxdWVzdFtsYWJlbD0iQVJQIl0KKwogYmNtX3RyYW5zbWl0LT5HZXRQYWNrZXRRdWV1ZUluZGV4W2xhYmVsPSJJUCBQYWNrZXQiXQogR2V0UGFja2V0UXVldWVJbmRleC0+SXBWZXJzaW9uNFtsYWJlbD0iSVBWNCJdCiBHZXRQYWNrZXRRdWV1ZUluZGV4LT5JcFZlcnNpb242W2xhYmVsPSJJUFY2Il0KQEAgLTM1LDE2OSArMzUsMTYgQEAKIAogI2luY2x1ZGUgImhlYWRlcnMuaCIKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogRnVuY3Rpb24gICAgLQliY21fdHJhbnNtaXQoKQotKgotKiBEZXNjcmlwdGlvbiAtIFRoaXMgaXMgdGhlIG1haW4gdHJhbnNtaXQgZnVuY3Rpb24gZm9yIG91ciB2aXJ0dWFsCi0qCQkJCWludGVyZmFjZSh2ZXRoMCkuIEl0IGhhbmRsZXMgdGhlIEFSUCBwYWNrZXRzLiBJdAotKgkJCQljbG9uZXMgdGhpcyBwYWNrZXQgYW5kIHRoZW4gUXVldWUgaXQgdG8gYSBzdWl0YWJsZQotKiAJCSAJCVF1ZXVlLiBUaGVuIGNhbGxzIHRoZSB0cmFuc21pdF9wYWNrZXQoKS4KLSoKLSogUGFyYW1ldGVyICAgLQkgc2tiIC0gUG9pbnRlciB0byB0aGUgc29ja2V0IGJ1ZmZlciBzdHJ1Y3R1cmUKLSoJCQkJIGRldiAtIFBvaW50ZXIgdG8gdGhlIHZpcnR1YWwgbmV0IGRldmljZSBzdHJ1Y3R1cmUKLSoKLSogUmV0dXJucyAgICAgLQkgemVybyAoc3VjY2Vzcykgb3IgLXZlIHZhbHVlIChmYWlsdXJlKQotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1JTlQgYmNtX3RyYW5zbWl0KHN0cnVjdCBza19idWZmICpza2IsIAkJLyoqPCBza2IgKi8KLQkJCQkJc3RydWN0IG5ldF9kZXZpY2UgKmRldiAJLyoqPCBuZXQgZGV2aWNlIHBvaW50ZXIgKi8KLQkJCQkJKQotewotCVBNSU5JX0FEQVBURVIgICAgICAJQWRhcHRlciA9IE5VTEw7Ci0JVVNIT1JUCQkJCXFpbmRleD0wOwotCXN0cnVjdCB0aW1ldmFsIHR2OwotCVVJTlQJCXBrdF90eXBlID0gMDsKLQlVSU5UIAkJY2FsbHRyYW5zbWl0ID0gMDsKLQotCUJDTV9ERUJVR19QUklOVCAoQWRhcHRlciwgREJHX1RZUEVfVFgsIFRYX09TQUxfREJHLCBEQkdfTFZMX0FMTCwgIlxuJXM9PT09PlxuIixfX0ZVTkNUSU9OX18pOwotCi0JbWVtc2V0KCZ0diwgMCwgc2l6ZW9mKHR2KSk7Ci0JLyogQ2hlY2sgZm9yIHZhbGlkIHBhcmFtZXRlcnMgKi8KLQlpZihza2IgPT0gTlVMTCB8fCBkZXY9PU5VTEwpCi0JewotCSAgICBCQ01fREVCVUdfUFJJTlQgKEFkYXB0ZXIsIERCR19UWVBFX1RYLFRYX09TQUxfREJHLCBEQkdfTFZMX0FMTCwgIkdvdCBOVUxMIHNrYiBvciBkZXZcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlBZGFwdGVyID0gR0VUX0JDTV9BREFQVEVSKGRldik7Ci0JaWYoIUFkYXB0ZXIpCi0JewotCQlCQ01fREVCVUdfUFJJTlQgKEFkYXB0ZXIsIERCR19UWVBFX1RYLCBUWF9PU0FMX0RCRywgREJHX0xWTF9BTEwsICJHb3QgSW52YWxpZCBBZGFwdGVyXG4iKTsKLSAgCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JaWYoQWRhcHRlci0+ZGV2aWNlX3JlbW92ZWQgPT0gVFJVRSB8fCAhQWRhcHRlci0+TGlua1VwU3RhdHVzKQotCXsKLQkJaWYoIW5ldGlmX3F1ZXVlX3N0b3BwZWQoZGV2KSkgewotCQkJCW5ldGlmX2NhcnJpZXJfb2ZmKGRldik7Ci0JCQkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOwotCQl9Ci0JCXJldHVybiBTVEFUVVNfRkFJTFVSRTsKLQl9Ci0JQkNNX0RFQlVHX1BSSU5UIChBZGFwdGVyLCBEQkdfVFlQRV9UWCwgVFhfT1NBTF9EQkcsIERCR19MVkxfQUxMLCAiUGFja2V0IHNpemUgOiAlZFxuIiwgc2tiLT5sZW4pOwotCi0JLypBZGQgRXRoZXJuZXQgQ1MgY2hlY2sgaGVyZSovCi0JaWYoQWRhcHRlci0+VHJhbnNmZXJNb2RlID09IElQX1BBQ0tFVF9PTkxZX01PREUgKQotCXsKLSAgICAgICAgcGt0X3R5cGUgPSBudG9ocygqKFBVU0hPUlQpKHNrYi0+ZGF0YSArIDEyKSk7Ci0JCS8qIEdldCB0aGUgcXVldWUgaW5kZXggd2hlcmUgdGhlIHBhY2tldCBpcyB0byBiZSBxdWV1ZWQgKi8KLQkJQkNNX0RFQlVHX1BSSU5UIChBZGFwdGVyLCBEQkdfVFlQRV9UWCwgVFhfT1NBTF9EQkcsIERCR19MVkxfQUxMLCAiR2V0dGluZyB0aGUgUXVldWUgSW5kZXguLi4uLiIpOwotCi0JCXFpbmRleCA9IEdldFBhY2tldFF1ZXVlSW5kZXgoQWRhcHRlcixza2IpOwotCi0JCWlmKChTSE9SVClJTlZBTElEX1FVRVVFX0lOREVYPT0oU0hPUlQpcWluZGV4KQotCQl7Ci0JCQlpZihwa3RfdHlwZSA9PSBFVEhfQVJQX0ZSQU1FKQotCQkJewotCQkJCS8qCi0JCQkJUmVwbHkgZGlyZWN0bHkgdG8gQVJQIHJlcXVlc3QgcGFja2V0Ci0JCQkJQVJQIFNwb29maW5nIG9ubHkgaWYgTk8gRVRIIENTIHJ1bGUgbWF0Y2hlcyBmb3IgaXQKLQkJCQkqLwotCQkJCUJDTV9ERUJVR19QUklOVCAoQWRhcHRlcixEQkdfVFlQRV9UWCwgVFhfT1NBTF9EQkcsIERCR19MVkxfQUxMLCJBUlAgT1BDT0RFID0gJTAyeCIsCi0KLSAgICAgICAgICAgICAgICAoKihQVUNIQVIpKHNrYi0+ZGF0YSArIDIxKSkpOwotCi0gICAgICAgICAgICAgICAgcmVwbHlfdG9fYXJwX3JlcXVlc3Qoc2tiKTsKLQotICAgICAgICAgICAgICAgIEJDTV9ERUJVR19QUklOVCAoQWRhcHRlciwgREJHX1RZUEVfVFgsVFhfT1NBTF9EQkcsIERCR19MVkxfQUxMLCJBZnRlciByZXBseV90b19hcnBfcmVxdWVzdCBcbiIpOwotCi0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0gICAgICAgICAgICAgICAgQkNNX0RFQlVHX1BSSU5UIChBZGFwdGVyLCBEQkdfVFlQRV9UWCwgVFhfT1NBTF9EQkcsIERCR19MVkxfQUxMLAotICAgIAkJCSJJbnZhbGlkIHF1ZXVlIGluZGV4LCBkcm9wcGluZyBwa3RcbiIpOwotCi0JCQkJYmNtX2tmcmVlX3NrYihza2IpOwotCQkJfQotCQkJcmV0dXJuIFNUQVRVU19TVUNDRVNTOwotICAgICAgICB9Ci0KLQkJaWYoQWRhcHRlci0+UGFja0luZm9bcWluZGV4XS51aUN1cnJlbnRQYWNrZXRzT25Ib3N0ID49IFNGX01BWF9BTExPV0VEX1BBQ0tFVFNfVE9fQkFDS1VQKQotCQl7Ci0JCQlhdG9taWNfaW5jKCZBZGFwdGVyLT5UeERyb3BwZWRQYWNrZXRDb3VudCk7Ci0JCQliY21fa2ZyZWVfc2tiKHNrYik7Ci0JCQlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7Ci0JCX0KLQotCQkvKiBOb3cgRW5xdWV1ZSB0aGUgcGFja2V0ICovCi0JCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1RYLCBORVhUX1NFTkQsIERCR19MVkxfQUxMLCAiYmNtX3RyYW5zbWl0IEVucXVldWVpbmcgdGhlIFBhY2tldCBUbyBRdWV1ZSAlZCIscWluZGV4KTsKLQkJc3Bpbl9sb2NrKCZBZGFwdGVyLT5QYWNrSW5mb1txaW5kZXhdLlNGUXVldWVMb2NrKTsKLQkJQWRhcHRlci0+UGFja0luZm9bcWluZGV4XS51aUN1cnJlbnRCeXRlc09uSG9zdCArPSBza2ItPmxlbjsKLQkJQWRhcHRlci0+UGFja0luZm9bcWluZGV4XS51aUN1cnJlbnRQYWNrZXRzT25Ib3N0Kys7Ci0KLQkJKigoQl9VSU5UMzIgKilza2ItPmNiICsgU0tCX0NCX0xBVEVOQ1lfT0ZGU0VUICkgPSBqaWZmaWVzOwotCQlFTlFVRVVFUEFDS0VUKEFkYXB0ZXItPlBhY2tJbmZvW3FpbmRleF0uRmlyc3RUeFF1ZXVlLAotICAJICAgICAgICAgICAgICAgICAgQWRhcHRlci0+UGFja0luZm9bcWluZGV4XS5MYXN0VHhRdWV1ZSwgc2tiKTsKLQkJYXRvbWljX2luYygmQWRhcHRlci0+VG90YWxQYWNrZXRDb3VudCk7Ci0JCXNwaW5fdW5sb2NrKCZBZGFwdGVyLT5QYWNrSW5mb1txaW5kZXhdLlNGUXVldWVMb2NrKTsKLQkJZG9fZ2V0dGltZW9mZGF5KCZ0dik7Ci0KLQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfVFgsIFRYX09TQUxfREJHLCBEQkdfTFZMX0FMTCwiRU5ROiBcbiIpOwotCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9UWCwgVFhfT1NBTF9EQkcsIERCR19MVkxfQUxMLCAiUGt0IExlbiA9ICVkLCBzZWM6ICVsZCwgdXNlYzogJWxkXG4iLAotCQkoc2tiLT5sZW4tRVRIX0hMRU4pLCB0di50dl9zZWMsIHR2LnR2X3VzZWMpOwotCi0jaWZkZWYgQkNNX1NITV9JTlRFUkZBQ0UKLQkJc3Bpbl9sb2NrKCZBZGFwdGVyLT50eHRyYW5zbWl0bG9jayk7Ci0JCWlmKEFkYXB0ZXItPnR4dHJhbnNtaXRfcnVubmluZyA9PSAwKQotCQl7Ci0JCQlBZGFwdGVyLT50eHRyYW5zbWl0X3J1bm5pbmcgPSAxOwotCQkJY2FsbHRyYW5zbWl0ID0gMTsKLQkJfQotCQllbHNlCi0JCQljYWxsdHJhbnNtaXQgPSAwOwotCi0JCXNwaW5fdW5sb2NrKCZBZGFwdGVyLT50eHRyYW5zbWl0bG9jayk7Ci0jZW5kaWYKLQkJaWYoY2FsbHRyYW5zbWl0ID09IDEpCi0JCQl0cmFuc21pdF9wYWNrZXRzKEFkYXB0ZXIpOwotCQllbHNlCi0JCXsKLQkJCWlmKCFhdG9taWNfcmVhZCgmQWRhcHRlci0+VHhQa3RBdmFpbCkpCi0JCQl7Ci0JCQkJYXRvbWljX3NldCgmQWRhcHRlci0+VHhQa3RBdmFpbCwgMSk7Ci0jaWZkZWYgQkNNX1NITV9JTlRFUkZBQ0UKLQkJCQl2aXJ0dWFsX21haWxfYm94X2ludGVycnVwdCgpOwotI2VuZGlmCi0JCQkJd2FrZV91cCgmQWRhcHRlci0+dHhfcGFja2V0X3dhaXRfcXVldWUpOwotCQkJfQotCQl9Ci0JCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1RYLCBUWF9PU0FMX0RCRywgREJHX0xWTF9BTEwsICI8PT09PSIpOwotCX0KLQllbHNlCi0JCWJjbV9rZnJlZV9za2Ioc2tiKTsKLQotICByZXR1cm4gU1RBVFVTX1NVQ0NFU1M7Ci19Ci0KIAogLyoqCiBAaW5ncm91cCBjdHJsX3BrdF9mdW5jdGlvbnMKIFRoaXMgZnVuY3Rpb24gZGlzcGF0Y2hlcyBjb250cm9sIHBhY2tldCB0byB0aGUgaC93IGludGVyZmFjZQogQHJldHVybiB6ZXJvKHN1Y2Nlc3MpIG9yIC12ZSB2YWx1ZShmYWlsdXJlKQogKi8KLUlOVCBTZW5kQ29udHJvbFBhY2tldChQTUlOSV9BREFQVEVSIEFkYXB0ZXIsIC8qKjxMb2dpY2FsIEFkYXB0ZXIqLwotCQkJCQkJCWNoYXIgKnBDb250cm9sUGFja2V0LyoqPENvbnRyb2wgUGFja2V0Ki8KLQkJCQkJCQkpCitJTlQgU2VuZENvbnRyb2xQYWNrZXQoUE1JTklfQURBUFRFUiBBZGFwdGVyLCBjaGFyICpwQ29udHJvbFBhY2tldCkKIHsKLQlQTEVBREVSIFBMZWFkZXIgPSBOVUxMOwotCXN0cnVjdCB0aW1ldmFsIHR2OwotCW1lbXNldCgmdHYsIDAsIHNpemVvZih0dikpOworCVBMRUFERVIgUExlYWRlciA9IChQTEVBREVSKXBDb250cm9sUGFja2V0OwogCi0KLQotCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1RYLCBUWF9DT05UUk9MLCBEQkdfTFZMX0FMTCwgIj09PT09PT09PiIpOwotCi0JUExlYWRlcj0oUExFQURFUilwQ29udHJvbFBhY2tldDsKIAlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9UWCwgVFhfQ09OVFJPTCwgREJHX0xWTF9BTEwsICJUeCIpOwogCWlmKCFwQ29udHJvbFBhY2tldCB8fCAhQWRhcHRlcikKIAl7CkBAIC0yMDgsMTIgKzU1LDYgQEAKIAkJKChQTGVhZGVyLT5QTGVuZ3RoLTEpL01BWF9ERVZJQ0VfREVTQ19TSVpFKSsxKSkKICAgICB7CiAgICAgCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1RYLCBUWF9DT05UUk9MLCBEQkdfTFZMX0FMTCwgIk5PIEZSRUUgREVTQ1JJUFRPUlMgVE8gU0VORCBDT05UUk9MIFBBQ0tFVCIpOwotICAgICAgIAlpZihBZGFwdGVyLT5iY21famlmZmllcyA9PSAwKQotICAgICAgICB7Ci0gICAgICAgIAlBZGFwdGVyLT5iY21famlmZmllcyA9IGppZmZpZXM7Ci0gICAgICAgICAgICBCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9UWCwgVFhfQ09OVFJPTCwgREJHX0xWTF9BTEwsICJVUERBVEVEIFRJTUUoaGV4KTogJWx1IiwKLQkJCQlBZGFwdGVyLT5iY21famlmZmllcyk7Ci0gICAgICAgIH0KICAgICAgICAgcmV0dXJuIFNUQVRVU19GQUlMVVJFOwogICAgIH0KIApAQCAtMjI0LDc2ICs2NSwzMyBAQAogCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1RYLCBUWF9DT05UUk9MLCBEQkdfTFZMX0FMTCwgIkxlYWRlciBMZW5ndGg6ICV4IixQTGVhZGVyLT5QTGVuZ3RoKTsKIAlpZihBZGFwdGVyLT5kZXZpY2VfcmVtb3ZlZCkKIAkJcmV0dXJuIDA7Ci0jaWZuZGVmIEJDTV9TSE1fSU5URVJGQUNFCisKKwlpZiAobmV0aWZfbXNnX3BrdGRhdGEoQWRhcHRlcikpCisJCXByaW50X2hleF9kdW1wKEtFUk5fREVCVUcsIFBGWCAidHggY29udHJvbDogIiwgRFVNUF9QUkVGSVhfTk9ORSwKKwkJCSAgICAgICAxNiwgMSwgcENvbnRyb2xQYWNrZXQsIFBMZWFkZXItPlBMZW5ndGggKyBMRUFERVJfU0laRSwgMCk7CisKIAlBZGFwdGVyLT5pbnRlcmZhY2VfdHJhbnNtaXQoQWRhcHRlci0+cHZJbnRlcmZhY2VBZGFwdGVyLAogCQkJCQlwQ29udHJvbFBhY2tldCwgKFBMZWFkZXItPlBMZW5ndGggKyBMRUFERVJfU0laRSkpOwotI2Vsc2UKLQl0eF9wa3RzX3RvX2Zpcm13YXJlKHBDb250cm9sUGFja2V0LChQTGVhZGVyLT5QTGVuZ3RoICsgTEVBREVSX1NJWkUpLDEpOwogCi0JaWYoUExlYWRlci0+U3RhdHVzPT1JRExFX01FU1NBR0UpCi0JewotCQlpZigoKENPTlRST0xfTUVTU0FHRSopUExlYWRlciktPnN6RGF0YVswXSA9PSBHT19UT19JRExFX01PREVfUEFZTE9BRCAmJgotCQkoKENPTlRST0xfTUVTU0FHRSopUExlYWRlciktPnN6RGF0YVsxXSA9PSBUQVJHRVRfQ0FOX0dPX1RPX0lETEVfTU9ERSkKLQkJewotCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfVFgsIFRYX0NPTlRST0wsIERCR19MVkxfQUxMLCAiSWRsZSBNb2RlIEFjayBTZW50IHRvIHRoZSBEZXZpY2VcbiIpOwotICAgICAgICAJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfVFgsIFRYX0NPTlRST0wsIERCR19MVkxfQUxMLCAiSG9zdCBFbnRlcmluZyBpbnRvIElkbGUgTW9kZVxuIik7Ci0JCQlkb19nZXR0aW1lb2ZkYXkoJnR2KTsKLQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1RYLCBUWF9DT05UUk9MLCBEQkdfTFZMX0FMTCwgIklkbGVNb2RlIE1zZyBzZW50IHRvIGYvdyBhdCB0aW1lIDolbGQgbXMiLCB0di50dl9zZWMgKjEwMDAgKyB0di50dl91c2VjIC8xMDAwKTsKLQkJCWlmKEFkYXB0ZXItPmJEb1N1c3BlbmQgIT0gVFJVRSkKLQkJCXsKLQkJCQlBZGFwdGVyLT5JZGxlTW9kZSA9IFRSVUU7Ci0JCQkJQWRhcHRlci0+YlByZXBhcmluZ0Zvckxvd1Bvd2VyTW9kZSA9IEZBTFNFIDsKLQkJCX0KLQkJfQotCX0KLQlpZigoUExlYWRlci0+U3RhdHVzID09IExJTktfVVBfQ09OVFJPTF9SRVEpICYmCi0JCSgoUFVDSEFSKXBDb250cm9sUGFja2V0KVtzaXplb2YoTEVBREVSKV0gPT0gTElOS19VUF9BQ0sgJiYKLQkJKChQVUNIQVIpcENvbnRyb2xQYWNrZXQpW3NpemVvZihMRUFERVIpKzFdID09Ci0JCQkJCQkJCUxJTktfU0hVVERPV05fUkVRX0ZST01fRklSTVdBUkUgICYmCi0JCSgoUFVDSEFSKXBDb250cm9sUGFja2V0KVtzaXplb2YoTEVBREVSKSsyXSA9PSBTSFVURE9XTl9BQ0tfRlJPTV9EUklWRVIpCi0JewotCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9UWCwgVFhfQ09OVFJPTCwgREJHX0xWTF9BTEwsICJTaHV0IERvd24gQUNLIFNlbnQgYW5kIEhvc3QgZW50ZXJpbmcgU2h1dCBTdGF0ZSBcbiIpOwotCQlpZihBZGFwdGVyLT5iRG9TdXNwZW5kICE9IFRSVUUpCi0JCXsKLQkJCUFkYXB0ZXItPmJTaHV0U3RhdHVzID0gVFJVRTsKLQkJCUFkYXB0ZXItPmJQcmVwYXJpbmdGb3JMb3dQb3dlck1vZGUgPSBGQUxTRTsKLQkJCUFkYXB0ZXItPmJUcmllZFRvV2FrZVVwRnJvbWxvd1Bvd2VyTW9kZSA9IEZBTFNFOwotCQl9Ci0KLQl9Ci0jZW5kaWYKLQotCSgoUExJTlVYX0RFUF9EQVRBKUFkYXB0ZXItPnB2T3NEZXBEYXRhKS0+bmV0c3RhdHMudHhfcGFja2V0cysrOwotCSgoUExJTlVYX0RFUF9EQVRBKUFkYXB0ZXItPnB2T3NEZXBEYXRhKS0+bmV0c3RhdHMudHhfYnl0ZXMrPQotCQkJUExlYWRlci0+UExlbmd0aDsKIAlhdG9taWNfZGVjKCZBZGFwdGVyLT5DdXJyTnVtRnJlZVR4RGVzYyk7CiAJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfVFgsIFRYX0NPTlRST0wsIERCR19MVkxfQUxMLCAiPD09PT09PT09PSIpOwogCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKIH0KLXN0YXRpYwlMRUFERVIgTGVhZGVyPXswfTsKKwogLyoqCiBAaW5ncm91cCB0eF9mdW5jdGlvbnMKIFRoaXMgZnVuY3Rpb24gZGVzcGF0Y2hlcyB0aGUgSVAgcGFja2V0cyB3aXRoIHRoZSBnaXZlbiB2Y2lkCiB0byB0aGUgdGFyZ2V0IHZpYSB0aGUgaG9zdCBoL3cgaW50ZXJmYWNlLgogQHJldHVybiAgemVybyhzdWNjZXNzKSBvciAtdmUgdmFsdWUoZmFpbHVyZSkKICovCi1JTlQgU2V0dXBOZXh0U2VuZChQTUlOSV9BREFQVEVSIEFkYXB0ZXIsIC8qKjxMb2dpY2FsIEFkYXB0ZXIqLwotCQkJCQlzdHJ1Y3Qgc2tfYnVmZiAqUGFja2V0LCAvKio8ZGF0YSBidWZmZXIqLwotCQkJCQlVU0hPUlQgVmNpZCkJCQkvKio8VkNJRCBmb3IgdGhpcyBwYWNrZXQqLworSU5UIFNldHVwTmV4dFNlbmQoUE1JTklfQURBUFRFUiBBZGFwdGVyLCAgc3RydWN0IHNrX2J1ZmYgKlBhY2tldCwgVVNIT1JUIFZjaWQpCiB7CiAJaW50CQlzdGF0dXM9MDsKLSNpZmRlZiBHRE1BX0lOVEVSRkFDRQotCWludCBkb250ZnJlZSA9IDA7Ci0jZW5kaWYKIAlCT09MRUFOIGJIZWFkZXJTdXByZXNzaW9uRW5hYmxlZCA9IEZBTFNFOwogCUJfVUlOVDE2ICAgICAgICAgICAgdWlDbGFzc2lmaWVyUnVsZUlEOwotCWludCBRdWV1ZUluZGV4ID0gTk9fT0ZfUVVFVUVTICsgMTsKKwl1MTYJUXVldWVJbmRleCA9IHNrYl9nZXRfcXVldWVfbWFwcGluZyhQYWNrZXQpOworCUxFQURFUiBMZWFkZXI9ezB9OwogCi0JaWYoIUFkYXB0ZXIgfHwgIVBhY2tldCkKLQl7Ci0JCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1RYLCBORVhUX1NFTkQsIERCR19MVkxfQUxMLCAiR290IE5VTEwgQWRhcHRlciBvciBQYWNrZXQiKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQogCWlmKFBhY2tldC0+bGVuID4gTUFYX0RFVklDRV9ERVNDX1NJWkUpCiAJewogCQlzdGF0dXMgPSBTVEFUVVNfRkFJTFVSRTsKQEAgLTMwMiwxNCArMTAwLDEwIEBACiAKIAkvKiBHZXQgdGhlIENsYXNzaWZpZXIgUnVsZSBJRCAqLwogCXVpQ2xhc3NpZmllclJ1bGVJRCA9ICooKFVJTlQzMiopIChQYWNrZXQtPmNiKStTS0JfQ0JfQ0xBU1NJRklDQVRJT05fT0ZGU0VUKTsKLQlRdWV1ZUluZGV4ID0gU2VhcmNoVmNpZCggQWRhcHRlcixWY2lkKTsKLQlpZihRdWV1ZUluZGV4IDwgTk9fT0ZfUVVFVUVTKQotCXsKLQkJYkhlYWRlclN1cHJlc3Npb25FbmFibGVkID0KLQkJCUFkYXB0ZXItPlBhY2tJbmZvW1F1ZXVlSW5kZXhdLmJIZWFkZXJTdXBwcmVzc2lvbkVuYWJsZWQ7Ci0JCWJIZWFkZXJTdXByZXNzaW9uRW5hYmxlZCA9Ci0JCQliSGVhZGVyU3VwcmVzc2lvbkVuYWJsZWQgJiBBZGFwdGVyLT5iUEhTRW5hYmxlZDsKLQl9CisKKwliSGVhZGVyU3VwcmVzc2lvbkVuYWJsZWQgPSBBZGFwdGVyLT5QYWNrSW5mb1tRdWV1ZUluZGV4XS5iSGVhZGVyU3VwcHJlc3Npb25FbmFibGVkCisJCSYgQWRhcHRlci0+YlBIU0VuYWJsZWQ7CisKIAlpZihBZGFwdGVyLT5kZXZpY2VfcmVtb3ZlZCkKIAkJewogCQlzdGF0dXMgPSBTVEFUVVNfRkFJTFVSRTsKQEAgLTMyNywxNSArMTIxLDEwIEBACiAKIAlMZWFkZXIuVmNpZAk9IFZjaWQ7CiAKLSAgICBpZihUQ1BfQUNLID09ICooKFVJTlQzMiopIChQYWNrZXQtPmNiKSArIFNLQl9DQl9UQ1BBQ0tfT0ZGU0VUICkpCi0JewotICAgICAgICBCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9UWCwgTkVYVF9TRU5ELCBEQkdfTFZMX0FMTCwgIlNlbmRpbmcgVENQIEFDS1xuIik7CisJaWYoVENQX0FDSyA9PSAqKChVSU5UMzIqKSAoUGFja2V0LT5jYikgKyBTS0JfQ0JfVENQQUNLX09GRlNFVCApKQogCQlMZWFkZXIuU3RhdHVzID0gTEVBREVSX1NUQVRVU19UQ1BfQUNLOwotCX0KIAllbHNlCi0JewogCQlMZWFkZXIuU3RhdHVzID0gTEVBREVSX1NUQVRVUzsKLQl9CiAKIAlpZihBZGFwdGVyLT5QYWNrSW5mb1tRdWV1ZUluZGV4XS5iRXRoQ1NTdXBwb3J0KQogCXsKQEAgLTM1MSw2OCArMTQwLDUzIEBACiAJCXNrYl9wdXNoKFBhY2tldCwgTEVBREVSX1NJWkUpOwogCQltZW1jcHkoUGFja2V0LT5kYXRhLCAmTGVhZGVyLCBMRUFERVJfU0laRSk7CiAJfQotCiAJZWxzZQogCXsKIAkJTGVhZGVyLlBMZW5ndGggPSBQYWNrZXQtPmxlbiAtIEVUSF9ITEVOOwogCQltZW1jcHkoKExFQURFUiopc2tiX3B1bGwoUGFja2V0LCAoRVRIX0hMRU4gLSBMRUFERVJfU0laRSkpLCAmTGVhZGVyLCBMRUFERVJfU0laRSk7CiAJfQogCi0JQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfVFgsIE5FWFRfU0VORCwgREJHX0xWTF9BTEwsICJQYWNrZXQtPmxlbiA9ICVkIiwgUGFja2V0LT5sZW4pOwotCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1RYLCBORVhUX1NFTkQsIERCR19MVkxfQUxMLCAiVmNpZCA9ICVkIiwgVmNpZCk7Ci0KLSNpZm5kZWYgQkNNX1NITV9JTlRFUkZBQ0UKIAlzdGF0dXMgPSBBZGFwdGVyLT5pbnRlcmZhY2VfdHJhbnNtaXQoQWRhcHRlci0+cHZJbnRlcmZhY2VBZGFwdGVyLAogCQkJUGFja2V0LT5kYXRhLCAoTGVhZGVyLlBMZW5ndGggKyBMRUFERVJfU0laRSkpOwotI2Vsc2UKLQlzdGF0dXMgPSB0eF9wa3RzX3RvX2Zpcm13YXJlKFBhY2tldCxQYWNrZXQtPmxlbiwwKTsKLSNlbmRpZgogCWlmKHN0YXR1cykKIAl7Ci0JCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1RYLCBORVhUX1NFTkQsIERCR19MVkxfQUxMLCAiVHggRmFpbGVkLi5cbiIpOworCQkrK0FkYXB0ZXItPmRldi0+c3RhdHMudHhfZXJyb3JzOworCQlpZiAobmV0aWZfbXNnX3R4X2VycihBZGFwdGVyKSkKKwkJCXByX2luZm8oUEZYICIlczogdHJhbnNtaXQgZXJyb3IgJWRcbiIsIEFkYXB0ZXItPmRldi0+bmFtZSwKKwkJCQlzdGF0dXMpOwogCX0KIAllbHNlCiAJeworCQlzdHJ1Y3QgbmV0ZGV2X3F1ZXVlICp0eHEgPSBuZXRkZXZfZ2V0X3R4X3F1ZXVlKEFkYXB0ZXItPmRldiwgUXVldWVJbmRleCk7CiAJCUFkYXB0ZXItPlBhY2tJbmZvW1F1ZXVlSW5kZXhdLnVpVG90YWxUeEJ5dGVzICs9IExlYWRlci5QTGVuZ3RoOwotCQlhdG9taWNfYWRkKExlYWRlci5QTGVuZ3RoLCAmQWRhcHRlci0+R29vZFR4Qnl0ZUNvdW50KTsKLQkJYXRvbWljX2luYygmQWRhcHRlci0+VHhUb3RhbFBhY2tldENvdW50KTsKLSNpZmRlZiBHRE1BX0lOVEVSRkFDRQotICAgIGRvbnRmcmVlID0gMTsKLSNlbmRpZgotCX0KIAotCWF0b21pY19kZWMoJkFkYXB0ZXItPkN1cnJOdW1GcmVlVHhEZXNjKTsKKwkJdHhxLT50eF9ieXRlcyArPSBMZWFkZXIuUExlbmd0aDsKKwkJKyt0eHEtPnR4X3BhY2tldHM7CiAKLWVyckV4aXQ6Ci0KLQlpZihTVEFUVVNfU1VDQ0VTUyA9PSBzdGF0dXMpCi0JewogCQlBZGFwdGVyLT5QYWNrSW5mb1tRdWV1ZUluZGV4XS51aUN1cnJlbnRUb2tlbkNvdW50IC09IExlYWRlci5QTGVuZ3RoIDw8IDM7CiAJCUFkYXB0ZXItPlBhY2tJbmZvW1F1ZXVlSW5kZXhdLnVpU2VudEJ5dGVzICs9IChQYWNrZXQtPmxlbik7CiAJCUFkYXB0ZXItPlBhY2tJbmZvW1F1ZXVlSW5kZXhdLnVpU2VudFBhY2tldHMrKzsKIAkJQWRhcHRlci0+UGFja0luZm9bUXVldWVJbmRleF0uTnVtT2ZQYWNrZXRzU2VudCsrOwogCiAJCWF0b21pY19kZWMoJkFkYXB0ZXItPlBhY2tJbmZvW1F1ZXVlSW5kZXhdLnVpUGVyU0ZUeFJlc291cmNlQ291bnQpOwotI2lmZGVmIEJDTV9TSE1fSU5URVJGQUNFCi0JCWlmKGF0b21pY19yZWFkKCZBZGFwdGVyLT5QYWNrSW5mb1tRdWV1ZUluZGV4XS51aVBlclNGVHhSZXNvdXJjZUNvdW50KSA8IDApCi0JCXsKLQkJCWF0b21pY19zZXQoJkFkYXB0ZXItPlBhY2tJbmZvW1F1ZXVlSW5kZXhdLnVpUGVyU0ZUeFJlc291cmNlQ291bnQsIDApOwotCQl9Ci0jZW5kaWYKIAkJQWRhcHRlci0+UGFja0luZm9bUXVldWVJbmRleF0udWlUaGlzUGVyaW9kU2VudEJ5dGVzICs9IExlYWRlci5QTGVuZ3RoOwogCX0KIAorCWF0b21pY19kZWMoJkFkYXB0ZXItPkN1cnJOdW1GcmVlVHhEZXNjKTsKIAotI2lmZGVmIEdETUFfSU5URVJGQUNFCi0gIGlmKCFkb250ZnJlZSl7Ci0gIAliY21fa2ZyZWVfc2tiKFBhY2tldCk7Ci0gIH0KLSNlbHNlCi0gIAliY21fa2ZyZWVfc2tiKFBhY2tldCk7Ci0jZW5kaWYKK2VyckV4aXQ6CisKKwlkZXZfa2ZyZWVfc2tiKFBhY2tldCk7CiAJcmV0dXJuIHN0YXR1czsKIH0KIAorc3RhdGljIGludCB0eF9wZW5kaW5nKFBNSU5JX0FEQVBURVIgQWRhcHRlcikKK3sKKwlyZXR1cm4gKGF0b21pY19yZWFkKCZBZGFwdGVyLT5UeFBrdEF2YWlsKQorCQkmJiBNSU5JTVVNX1BFTkRJTkdfREVTQ1JJUFRPUlMgPCBhdG9taWNfcmVhZCgmQWRhcHRlci0+Q3Vyck51bUZyZWVUeERlc2MpKQorCQl8fCBBZGFwdGVyLT5kZXZpY2VfcmVtb3ZlZCB8fCAoMSA9PSBBZGFwdGVyLT5kb3dubG9hZEREUik7Cit9CisKIC8qKgogQGluZ3JvdXAgdHhfZnVuY3Rpb25zCiBUcmFuc21pdCB0aHJlYWQKQEAgLTQyMCw1NyArMTk0LDI2IEBACiBpbnQgdHhfcGt0X2hhbmRsZXIoUE1JTklfQURBUFRFUiBBZGFwdGVyICAvKio8IHBvaW50ZXIgdG8gYWRhcHRlciBvYmplY3QqLwogCQkJCSkKIHsKLSNpZm5kZWYgQkNNX1NITV9JTlRFUkZBQ0UKIAlpbnQgc3RhdHVzID0gMDsKLSNlbmRpZgogCi0JVUlOVCBjYWxsdHJhbnNtaXQgPSAxOwotCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1RYLCBUWF9QQUNLRVRTLCBEQkdfTFZMX0FMTCwgIkVudHJpbmcgdG8gd2FpdCBmb3Igc2lnbmFsIGZyb20gdGhlIGludGVycnVwdCBzZXJ2aWNlIHRocmVhZCFBZGFwdGVyID0gJXAiLEFkYXB0ZXIpOwotCi0KLQl3aGlsZSgxKQotCXsKLQkJaWYoQWRhcHRlci0+TGlua1VwU3RhdHVzKXsKKwl3aGlsZSghIGt0aHJlYWRfc2hvdWxkX3N0b3AoKSkgeworCQkvKiBGSVhNRSAtIHRoZSB0aW1lb3V0IGxvb2tzIGxpa2Ugd29ya2Fyb3VuZCBmb3IgcmFjZXkgdXNhZ2Ugb2YgVHhQa3RBdmFpbCAqLworCQlpZihBZGFwdGVyLT5MaW5rVXBTdGF0dXMpCiAJCQl3YWl0X2V2ZW50X3RpbWVvdXQoQWRhcHRlci0+dHhfcGFja2V0X3dhaXRfcXVldWUsCi0JCQkJKChhdG9taWNfcmVhZCgmQWRhcHRlci0+VHhQa3RBdmFpbCkgJiYKLQkJCQkoTUlOSU1VTV9QRU5ESU5HX0RFU0NSSVBUT1JTIDwKLQkJCQlhdG9taWNfcmVhZCgmQWRhcHRlci0+Q3Vyck51bUZyZWVUeERlc2MpKSAmJgotCQkJCShBZGFwdGVyLT5kZXZpY2VfcmVtb3ZlZCA9PSBGQUxTRSkpKSB8fAotCQkJCSgxID09IEFkYXB0ZXItPmRvd25sb2FkRERSKSB8fCBrdGhyZWFkX3Nob3VsZF9zdG9wKCkKLSNpZm5kZWYgQkNNX1NITV9JTlRFUkZBQ0UKLQkJCQl8fCAoVFJVRSA9PSBBZGFwdGVyLT5iRW5kUG9pbnRIYWx0ZWQpCi0jZW5kaWYKLQkJCQksIG1zZWNzX3RvX2ppZmZpZXMoMTApKTsKLQkJfQotCQllbHNlewotCQkJd2FpdF9ldmVudChBZGFwdGVyLT50eF9wYWNrZXRfd2FpdF9xdWV1ZSwKLQkJCQkoKGF0b21pY19yZWFkKCZBZGFwdGVyLT5UeFBrdEF2YWlsKSAmJgotCQkJCShNSU5JTVVNX1BFTkRJTkdfREVTQ1JJUFRPUlMgPAotCQkJCWF0b21pY19yZWFkKCZBZGFwdGVyLT5DdXJyTnVtRnJlZVR4RGVzYykpICYmCi0JCQkJKEFkYXB0ZXItPmRldmljZV9yZW1vdmVkID09IEZBTFNFKSkpIHx8Ci0JCQkJKDEgPT0gQWRhcHRlci0+ZG93bmxvYWRERFIpIHx8IGt0aHJlYWRfc2hvdWxkX3N0b3AoKQotI2lmbmRlZiBCQ01fU0hNX0lOVEVSRkFDRQotCQkJCXx8IChUUlVFID09IEFkYXB0ZXItPmJFbmRQb2ludEhhbHRlZCkKLSNlbmRpZgotCQkJCSk7Ci0JCX0KKwkJCQkJICAgdHhfcGVuZGluZyhBZGFwdGVyKSwgbXNlY3NfdG9famlmZmllcygxMCkpOworCQllbHNlCisJCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoQWRhcHRlci0+dHhfcGFja2V0X3dhaXRfcXVldWUsCisJCQkJCQkgdHhfcGVuZGluZyhBZGFwdGVyKSk7CiAKLQkJaWYoa3RocmVhZF9zaG91bGRfc3RvcCgpIHx8IEFkYXB0ZXItPmRldmljZV9yZW1vdmVkKQotCQl7Ci0JCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9UWCwgVFhfUEFDS0VUUywgREJHX0xWTF9BTEwsICJFeGl0aW5nIHRoZSB0eCB0aHJlYWQuLlxuIik7Ci0JCQlBZGFwdGVyLT50cmFuc21pdF9wYWNrZXRfdGhyZWFkID0gTlVMTDsKLQkJCXJldHVybiAwOwotCQl9Ci0KLSNpZm5kZWYgQkNNX1NITV9JTlRFUkZBQ0UKKwkJaWYgKEFkYXB0ZXItPmRldmljZV9yZW1vdmVkKQorCQkJYnJlYWs7CiAKIAkJaWYoQWRhcHRlci0+ZG93bmxvYWRERFIgPT0gMSkKIAkJewotCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfVFgsIFRYX1BBQ0tFVFMsIERCR19MVkxfQUxMLCAiRG93bmxvYWRpbmcgRERSIFNldHRpbmdzXG4iKTsKIAkJCUFkYXB0ZXItPmRvd25sb2FkRERSICs9MTsKIAkJCXN0YXR1cyA9IGRvd25sb2FkX2Rkcl9zZXR0aW5ncyhBZGFwdGVyKTsKIAkJCWlmKHN0YXR1cykKLQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9UWCwgVFhfUEFDS0VUUywgREJHX0xWTF9BTEwsICJERFIgRE9XTkxPQUQgRkFJTEVEIVxuIik7CisJCQkJcHJfZXJyKFBGWCAiRERSIERPV05MT0FEIEZBSUxFRCEgJWRcbiIsIHN0YXR1cyk7CiAJCQljb250aW51ZTsKIAkJfQogCkBAIC00ODksNyArMjMyLDYgQEAKIAkJCQl1cGRhdGVfcGVyX3NmX2Rlc2NfY250cyhBZGFwdGVyKTsKIAkJCX0KIAkJfQotI2VuZGlmCiAKIAkJaWYoIGF0b21pY19yZWFkKCZBZGFwdGVyLT5DdXJyTnVtRnJlZVR4RGVzYykgJiYKIAkJCUFkYXB0ZXItPkxpbmtTdGF0dXMgPT0gU1lOQ19VUF9SRVFVRVNUICYmCkBAIC01MDcsNDkgKzI0OSwxMiBAQAogCQkJCXdha2VfdXAoJkFkYXB0ZXItPnByb2Nlc3NfcnhfY250cmxwa3QpOwogCQl9CiAKLSNpZmRlZiBCQ01fU0hNX0lOVEVSRkFDRQotCQlzcGluX2xvY2tfYmgoJkFkYXB0ZXItPnR4dHJhbnNtaXRsb2NrKTsKLQkJaWYoQWRhcHRlci0+dHh0cmFuc21pdF9ydW5uaW5nID09IDApCi0JCXsKLQkJCUFkYXB0ZXItPnR4dHJhbnNtaXRfcnVubmluZyA9IDE7Ci0JCQljYWxsdHJhbnNtaXQgPSAxOwotCQl9Ci0JCWVsc2UKLQkJCWNhbGx0cmFuc21pdCA9IDA7Ci0JCXNwaW5fdW5sb2NrX2JoKCZBZGFwdGVyLT50eHRyYW5zbWl0bG9jayk7Ci0jZW5kaWYKLQotCQlpZihjYWxsdHJhbnNtaXQpCi0JCQl0cmFuc21pdF9wYWNrZXRzKEFkYXB0ZXIpOworCQl0cmFuc21pdF9wYWNrZXRzKEFkYXB0ZXIpOwogCiAJCWF0b21pY19zZXQoJkFkYXB0ZXItPlR4UGt0QXZhaWwsIDApOwogCX0KKworCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1RYLCBUWF9QQUNLRVRTLCBEQkdfTFZMX0FMTCwgIkV4aXRpbmcgdGhlIHR4IHRocmVhZC4uXG4iKTsKKwlBZGFwdGVyLT50cmFuc21pdF9wYWNrZXRfdGhyZWFkID0gTlVMTDsKIAlyZXR1cm4gMDsKIH0KLQotI2lmZGVmIEJDTV9TSE1fSU5URVJGQUNFCi1leHRlcm4gUE1JTklfQURBUFRFUiBwc0FkYXB0ZXJ0ZXN0Owotdm9pZCAgdmlydHVhbF9tYWlsX2JveF9pbnRlcnJ1cHQodm9pZCkKLXsKLQotI2lmbmRlZiBHRE1BX0lOVEVSRkFDRQotCVBVSU5UIHB0ciA9ICAoUFVJTlQpQ1BFX1ZJUlRVQUxfTUFJTEJPWF9SRUc7Ci0JVUlOVCBpbnR2YWwgPSAoVUlOVCkoKCpwdHIgJiAweEZGMDApID4+IDgpOwotCWlmIChpbnR2YWwgIT0gMCkKLQl7Ci0JCWF0b21pY19zZXQoJnBzQWRhcHRlcnRlc3QtPkN1cnJOdW1GcmVlVHhEZXNjLAlpbnR2YWwpOwotCQlhdG9taWNfc2V0ICgmcHNBZGFwdGVydGVzdC0+dWlNQnVwZGF0ZSwgVFJVRSk7Ci0KLQkJLy9tYWtlIGl0IHRvIDAKLQkJKnB0ciA9ICpwdHIgJiAweGZmZmYwMGZmOwotCX0KLSNlbmRpZgotfQotdW5zaWduZWQgaW50IHRvdGFsX3R4X3BrdHNfcGVuZGluZyh2b2lkKQotewotCXJldHVybiBhdG9taWNfcmVhZCgmcHNBZGFwdGVydGVzdC0+VG90YWxQYWNrZXRDb3VudCk7Ci19Ci0KLSNlbmRpZgotCi0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iY20vY250cmxfU2lnbmFsaW5nSW50ZXJmYWNlLmggYi9kcml2ZXJzL3N0YWdpbmcvYmNtL2NudHJsX1NpZ25hbGluZ0ludGVyZmFjZS5oCmluZGV4IDRjYmUzMDAuLjg5MDc3ODQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9iY20vY250cmxfU2lnbmFsaW5nSW50ZXJmYWNlLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JjbS9jbnRybF9TaWduYWxpbmdJbnRlcmZhY2UuaApAQCAtMiwxOSArMiw2IEBACiAjZGVmaW5lIENOVFJMX1NJR05BTElOR19JTlRFUkZBQ0VfCiAKIAotI2lmZGVmIEJFQ0VFTV9UQVJHRVQKLQotI2luY2x1ZGUgPG1hY19jb21tb24uaD4KLSNpbmNsdWRlIDxtc2dfRHNhLmg+Ci0jaW5jbHVkZSA8bXNnX0RzYy5oPgotI2luY2x1ZGUgPG1zZ19Ec2QuaD4KLSNpbmNsdWRlIDxzY2hfZGVmaW5pdGlvbnMuaD4KLXVzaW5nIG5hbWVzcGFjZSBCZWNlZW07Ci0jaWZkZWYgRU5BQkxFX0NPUlJJR0VORFVNMl9VUERBVEUKLWV4dGVybiBCX1VJTlQzMiBnX3UzMkNvcnIyTWFjRmxhZ3M7Ci0jZW5kaWYKLQotI2Vsc2UKIAogCiAjZGVmaW5lIERTQV9SRVEgMTEKQEAgLTI4LDcgKzE1LDYgQEAKICNkZWZpbmUgRFNEX0FDSyAxOQogI2RlZmluZSBNQVhfQ0xBU1NJRklFUlNfSU5fU0YgIDQKIAotI2VuZGlmCiAKICNkZWZpbmUgTUFYX1NUUklOR19MRU4gMjAKICNkZWZpbmUgTUFYX1BIU19MRU5HVEhTIDI1NQpAQCAtNTcsMzcgKzQzLDcgQEAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL3N0cnVjdHVyZSBEZWZpbml0aW9ucy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogLy8vIFxicmllZiBjbGFzcyBjQ1BhY2tldENsYXNzaWZpY2F0aW9uUnVsZQotI2lmZGVmIEJFQ0VFTV9UQVJHRVQKLWNsYXNzIENDUGFja2V0Q2xhc3NpZmljYXRpb25SdWxlU0l7Ci0JcHVibGljOgotCQkvLy8gXGJyaWVmIENvbnN0cnVjdG9yIGZvciB0aGUgY2xhc3MKLQlDQ1BhY2tldENsYXNzaWZpY2F0aW9uUnVsZVNJKCk6Ci0JCXU4Q2xhc3NpZmllclJ1bGVQcmlvcml0eShtQ2xhc3NpZmllclJ1bGVQcmlvcml0eSksCi0JCXU4SVBUeXBlT2ZTZXJ2aWNlTGVuZ3RoKG1JUFR5cGVPZlNlcnZpY2UpLAotCQl1OFByb3RvY29sKG1Qcm90b2NvbCksCi0JCXU4SVBNYXNrZWRTb3VyY2VBZGRyZXNzTGVuZ3RoKDApLAotCQl1OElQRGVzdGluYXRpb25BZGRyZXNzTGVuZ3RoKDApLAotCQl1OFByb3RvY29sU291cmNlUG9ydFJhbmdlTGVuZ3RoKDApLAotCQl1OFByb3RvY29sRGVzdFBvcnRSYW5nZUxlbmd0aCgwKSwKLQkJdThFdGhlcm5ldERlc3RNYWNBZGRyZXNzTGVuZ3RoKDApLAotCQl1OEV0aGVybmV0U291cmNlTUFDQWRkcmVzc0xlbmd0aCgwKSwKLQkJdThFdGhlcnR5cGVMZW5ndGgoMCksCi0JCXUxNlVzZXJQcmlvcml0eShtVXNlclByaW9yaXR5KSwKLQkJdTE2VkxBTklEKG1WTEFOSUQpLAotCQl1OEFzc29jaWF0ZWRQSFNJKG1Bc3NvY2lhdGVkUEhTSSksCi0JCXUxNlBhY2tldENsYXNzaWZpY2F0aW9uUnVsZUluZGV4KG1QYWNrZXRDbGFzc2lmaWVyUnVsZUluZGV4KSwKLQkJdThWZW5kb3JTcGVjaWZpY0NsYXNzaWZpZXJQYXJhbUxlbmd0aChtVmVuZG9yU3BlY2lmaWNDbGFzc2lmaWVyUGFyYW1MZW5ndGgpLAotCQl1OElQdjZGbG93TGFibGVMZW5ndGgobUlQdjZGbG93TGFibGVMZW5ndGgpLAotCQl1OENsYXNzaWZpZXJBY3Rpb25SdWxlKG1DbGFzc2lmaWVyQWN0aW9uUnVsZSkKLQotCQl7fQotICAgICAgICAgICAgICB2b2lkIFJlc2V0KCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBDQ1BhY2tldENsYXNzaWZpY2F0aW9uUnVsZVNJKCk7Ci0gICAgICAgICAgICAgIH0KLSNlbHNlCiBzdHJ1Y3QgX3N0Q1BhY2tldENsYXNzaWZpY2F0aW9uUnVsZVNJewotI2VuZGlmCiAKIAkvKiogIDE2Yml0IFVzZXJQcmlvcml0eSBPZiBUaGUgU2VydmljZSBGbG93Ki8KICAgICBCX1VJTlQxNiAgICAgICAgICAgICAgICAgICAgICAgIHUxNlVzZXJQcmlvcml0eTsKQEAgLTE0NSwyOSArMTAxLDEwIEBACiAgICAgQl9VSU5UOAkJCQkJCQl1OENsYXNzaWZpZXJBY3Rpb25SdWxlOwogICAgIEJfVUlOVDE2CQkJCQkJCXUxNlZhbGlkaXR5Qml0TWFwOwogfTsKLSNpZm5kZWYgQkVDRUVNX1RBUkdFVAogdHlwZWRlZiBzdHJ1Y3QgX3N0Q1BhY2tldENsYXNzaWZpY2F0aW9uUnVsZVNJIENDUGFja2V0Q2xhc3NpZmljYXRpb25SdWxlU0ksc3RDUGFja2V0Q2xhc3NpZmljYXRpb25SdWxlU0ksICpwc3RDUGFja2V0Q2xhc3NpZmljYXRpb25SdWxlU0k7Ci0jZW5kaWYKIAogLy8vIFxicmllZiBjbGFzcyBDUGhzUnVsZVNJCi0jaWZkZWYgQkVDRUVNX1RBUkdFVAotY2xhc3MgQ1Boc1J1bGVTSXsKLQlwdWJsaWM6Ci0JCS8vLyBcYnJpZWYgQ29uc3RydWN0b3IgZm9yIHRoZSBjbGFzcwotCQlDUGhzUnVsZVNJKCk6Ci0JCQl1OFBIU0kobVBIU0kpLAotCQkJdThQSFNGTGVuZ3RoKDApLAotCQkJdThQSFNNTGVuZ3RoKDApLAotCQkJdThQSFNTKG1QSFNTKSwKLQkJCXU4UEhTVihtUEhTViksCi0JCQl1OFZlbmRvclNwZWNpZmljUEhTUGFyYW1zTGVuZ3RoKG1WZW5kb3JTcGVjaWZpY1BIU1BhcmFtTGVuZ3RoKXt9Ci0gICAgICAgICAgICAgICAgdm9pZCBSZXNldCgpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAJCUNQaHNSdWxlU0koKTsKLSAgICAgICAgICAgICAgICB9Ci0jZWxzZQogdHlwZWRlZiBzdHJ1Y3QgX3N0UGhzUnVsZVNJIHsKLSNlbmRpZgogCS8qKiAgOGJpdCBQSFMgSW5kZXggT2YgVGhlIFNlcnZpY2UgRmxvdyovCiAgICAgQl9VSU5UOCAgICAgICAgICAgICAgICAgICAgICAgICB1OFBIU0k7CiAJLyoqICBQSFNGIExlbmd0aCBPZiBUaGUgU2VydmljZSBGbG93Ki8KQEAgLTE4OCwzMSArMTI1LDExIEBACiAgICAgQl9VSU5UOCAgICAgICAgICAgICAgICAgICAgICAgICB1OFZlbmRvclNwZWNpZmljUEhTUGFyYW1zW1ZFTkRPUl9QSFNfUEFSQU1fTEVOR1RIXTsKIAogCUJfVUlOVDggICAgICAgICAgICAgICAgICAgICAgICAgdThQYWRkaW5nWzJdOwotI2lmZGVmIEJFQ0VFTV9UQVJHRVQKLX07Ci0jZWxzZQogfXN0UGhzUnVsZVNJLCpwc3RQaHNSdWxlU0k7CiB0eXBlZGVmIHN0UGhzUnVsZVNJIENQaHNSdWxlU0k7Ci0jZW5kaWYKIAogLy8vIFxicmllZiBzdHJ1Y3R1cmUgY0NvbnZlcmdlbmNlU0xUeXBlcwotI2lmZGVmIEJFQ0VFTV9UQVJHRVQKLWNsYXNzIENDb252ZXJnZW5jZVNMVHlwZXN7Ci0JcHVibGljOgotCQkvLy8gXGJyaWVmIENvbnN0cnVjdG9yIGZvciB0aGUgY2xhc3MKLQkJQ0NvbnZlcmdlbmNlU0xUeXBlcygpOgotCQl1OENsYXNzZmllckRTQ0FjdGlvbihtQ2xhc3NpZmllckRTQ0FjdGlvbiksCi0JCXU4UGhzRFNDQWN0aW9uCShtUGhzRFNDQWN0aW9uKQotCQl7fQotICAgICAgICAgICAgICB2b2lkIFJlc2V0KCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBDQ29udmVyZ2VuY2VTTFR5cGVzKCk7Ci0gICAgICAgICAgICAgICAgICAgIGNDUGFja2V0Q2xhc3NpZmljYXRpb25SdWxlLlJlc2V0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGNQaHNSdWxlLlJlc2V0KCk7Ci0gICAgICAgICAgICAgIH0KLSNlbHNlCiBzdHJ1Y3QgX3N0Q29udmVyZ2VuY2VTTFR5cGVzewotI2VuZGlmCiAJLyoqICA4Yml0IFBocyBDbGFzc2ZpZXIgQWN0aW9uIE9mIFRoZSBTZXJ2aWNlIEZsb3cqLwogICAgIEJfVUlOVDggICAgICAgICAgICAgICAgICAgICAgICAgdThDbGFzc2ZpZXJEU0NBY3Rpb247CiAJLyoqICA4Yml0IFBocyBEU0MgQWN0aW9uIE9mIFRoZSBTZXJ2aWNlIEZsb3cqLwpAQCAtMjIwLDExMSArMTM3LDE1IEBACiAJLyoqICAgMTZiaXQgUGFkZGluZyAqLwogICAgIEJfVUlOVDggICAgICAgICAgICAgICAgICAgICAgICAgdThQYWRkaW5nWzJdOwogICAgIC8vLyBcYnJpZWYgY2xhc3MgY0NQYWNrZXRDbGFzc2lmaWNhdGlvblJ1bGUKLSNpZmRlZiBCRUNFRU1fVEFSR0VUCi0gICAgQ0NQYWNrZXRDbGFzc2lmaWNhdGlvblJ1bGVTSSAgICAgIGNDUGFja2V0Q2xhc3NpZmljYXRpb25SdWxlOwotI2Vsc2UKICAgICBzdENQYWNrZXRDbGFzc2lmaWNhdGlvblJ1bGVTSSAgICAgY0NQYWNrZXRDbGFzc2lmaWNhdGlvblJ1bGU7Ci0jZW5kaWYKICAgICAvLy8gXGJyaWVmIGNsYXNzIENQaHNSdWxlU0kKLSNpZmRlZiBCRUNFRU1fVEFSR0VUCi0gICAgQ1Boc1J1bGVTSQkJCQljUGhzUnVsZTsKLSNlbHNlCiAgICAgIHN0cnVjdCBfc3RQaHNSdWxlU0kJCWNQaHNSdWxlOwotI2VuZGlmCiB9OwotI2lmbmRlZiBCRUNFRU1fVEFSR0VUCiB0eXBlZGVmIHN0cnVjdCBfc3RDb252ZXJnZW5jZVNMVHlwZXMgc3RDb252ZXJnZW5jZVNMVHlwZXMsQ0NvbnZlcmdlbmNlU0xUeXBlcywgKnBzdENvbnZlcmdlbmNlU0xUeXBlczsKLSNlbmRpZgogCiAKIC8vLyBcYnJpZWYgc3RydWN0dXJlIENTZXJ2aWNlRmxvd1BhcmFtU0kKLSNpZmRlZiBCRUNFRU1fVEFSR0VUCi1jbGFzcyBDU2VydmljZUZsb3dQYXJhbVNJewotCXB1YmxpYzoKLQkJLy8vIFxicmllZiBDb25zdHJ1Y3RvciBmb3IgdGhlIGNsYXNzCi0JCUNTZXJ2aWNlRmxvd1BhcmFtU0koKToKLQkJCXUzMlNGSUQobVNGaWQpLAotCQkJdTE2Q0lEKG1DaWQpLAotCQkJdThTZXJ2aWNlQ2xhc3NOYW1lTGVuZ3RoKG1TZXJ2aWNlQ2xhc3NOYW1lTGVuZ3RoKSwKLQkJCXU4TUJTU2VydmljZShtTUJTU2VydmljZSksCi0JCQl1OFFvc1BhcmFtU2V0KG1Rb3NQYXJhbVNldFR5cGUpLAotCQkJdThUcmFmZmljUHJpb3JpdHkobVRyYWZmaWNQcmlvcml0eSksCi0JCQl1MzJNYXhTdXN0YWluZWRUcmFmZmljUmF0ZShtTWF4aW11bVN1c3RhaW5lZFRyYWZmaWNSYXRlKSwKLQkJCXUzMk1heFRyYWZmaWNCdXJzdChtTWF4aW11bVRyYWZmaWNCdXJzdCksCi0JCQl1MzJNaW5SZXNlcnZlZFRyYWZmaWNSYXRlKG1NaW5pbXVtUmVzZXJ2ZWRUcmFmZmljUmF0ZSksCi0JCQl1OFNlcnZpY2VGbG93U2NoZWR1bGluZ1R5cGUobVNlcnZpY2VGbG93U2NoZWR1bGluZ1R5cGUpLAotCQkJdThSZXF1ZXN0dHJhbnNtaXNzaW9uUG9saWN5KG1SZXF1ZXN0VHJhbnNtaXNzaW9uUG9saWN5KSwKLQkJCXUzMlRvbGVyYXRlZEppdHRlcihtVG9sZXJhdGVkSml0dGVyKSwKLQkJCXUzMk1heGltdW1MYXRlbmN5KG1NYXhpbXVtTGF0ZW5jeSksCi0JCQl1OEZpeGVkTGVuZ3RoVlNWYXJpYWJsZUxlbmd0aFNEVUluZGljYXRvcgotCQkJKG1GaXhlZExlbmd0aFZTVmFyaWFibGVMZW5ndGgpLAotCQkJdThTRFVTaXplKG1TRFVTaXplKSwKLQkJCXUxNlRhcmdldFNBSUQobVRhcmdldFNBSUQpLAotCQkJdThBUlFFbmFibGUobUFSUUVuYWJsZSksCi0JCQl1MTZBUlFXaW5kb3dTaXplKG1BUlFXaW5kb3dTaXplKSwKLQkJCXUxNkFSUUJsb2NrTGlmZVRpbWUobUFSUUJsb2NrTGlmZVRpbWUpLAotCQkJdTE2QVJRU3luY0xvc3NUaW1lT3V0KG1BUlFTeW5jTG9zc1RpbWVPdXQpLAotCQkJdThBUlFEZWxpdmVySW5PcmRlcihtQVJRRGVsaXZlckluT3JkZXIpLAotCQkJdTE2QVJRUnhQdXJnZVRpbWVPdXQobUFSUVJYUHVyZ2VUaW1lT3V0KSwKLQkJCS8vQWRkIEFSUSBCTE9DSyBTSVpFLCBBUlEgVFggYW5kIFJYIGRlbGF5IGluaXRpYWxpemF0aW9ucyBoZXJlCi0JCQkvL2FmdGVyIHdlIG1vdmUgdG8gb25seSBDT1JSMgotCQkJdThSeEFSUUFja1Byb2Nlc3NpbmdUaW1lKG1SeEFSUUFja1Byb2Nlc3NpbmdUaW1lKSwKLQkJCXU4Q1NTcGVjaWZpY2F0aW9uKG1DU1NwZWNpZmljYXRpb24pLAotCQkJdThUeXBlT2ZEYXRhRGVsaXZlcnlTZXJ2aWNlKG1UeXBlT2ZEYXRhRGVsaXZlcnlTZXJ2aWNlKSwKLQkJCXUxNlNEVUludGVyQXJyaXZhbFRpbWUobVNEVUludGVyQXJyaXZhbFRpbWUpLAotCQkJdTE2VGltZUJhc2UobVRpbWVCYXNlKSwKLQkJCXU4UGFnaW5nUHJlZmVyZW5jZShtUGFnaW5nUHJlZmVyZW5jZSksCi0JCQl1OE1CU1pvbmVJZGVudGlmaWVyYXNzaWdubWVudChtTUJTWm9uZUlkZW50aWZpZXJhc3NpZ25tZW50TGVuZ3RoKSwKLQkJCXU4VHJhZmZpY0luZGljYXRpb25QcmVmZXJlbmNlKG1UcmFmZmljSW5kaWNhdGlvblByZWZlcmVuY2UpLAotCQkJdThHbG9iYWxTZXJ2aWNlc0NsYXNzTmFtZUxlbmd0aChtR2xvYmFsU2VydmljZXNDbGFzc05hbWVMZW5ndGgpLAotCQkJdThTTkZlZWRiYWNrRW5hYmxlZChtU05GZWVkYmFja0VuYWJsZWQpLAotCQkJdThGU05TaXplKG1GU05TaXplKSwKLQkJCXU4Q0lEQWxsb2NhdGlvbjRhY3RpdmVCU3NMZW5ndGgobUNJREFsbG9jYXRpb240YWN0aXZlQlNzTGVuZ3RoKSwKLQkJCXUxNlVuc29saWNpdGVkR3JhbnRJbnRlcnZhbChtVW5zb2xpY2l0ZWRHcmFudEludGVydmFsKSwKLQkJCXUxNlVuc29saWNpdGVkUG9sbGluZ0ludGVydmFsKG1VbnNvbGljaXRlZFBvbGxpbmdJbnRlcnZhbCksCi0JCQl1OFBEVVNORXh0ZW5kZWRTdWJoZWFkZXI0SGFycVJlb3JkZXJpbmcobVBEVVNORXh0ZW5kZWRTdWJoZWFkZXI0SGFycVJlb3JkZXJpbmcpLAotCQkJdThNQlNDb250ZW50c0lETGVuZ3RoKG1NQlNDb250ZW50c0lETGVuZ3RoKSwKLQkJCXU4SEFSUVNlcnZpY2VGbG93cyhtSEFSUVNlcnZpY2VGbG93cyksCi0JCQl1OEF1dGhUb2tlbkxlbmd0aChtQXV0aFRva2VuTGVuZ3RoKSwKLQkJCXU4SGFycUNoYW5uZWxNYXBwaW5nTGVuZ3RoKG1IYXJxQ2hhbm5lbE1hcHBpbmdMZW5ndGgpLAotCQkJdThWZW5kb3JTcGVjaWZpY1FvU1BhcmFtTGVuZ3RoKG1WZW5kb3JTcGVjaWZpY1FvU1BhcmFtTGVuZ3RoKSwKLSAgICAgICAgICAgIGJWYWxpZChGQUxTRSksCi0JICAgICB1OFRvdGFsQ2xhc3NpZmllcnMoKQotewotLy9SZW1vdmUgdGhlIGJvbGNrIGFmdGVyIHdlIG1vdmUgdG8gQ29ycjIgb25seSBjb2RlCi0jaWZkZWYgRU5BQkxFX0NPUlJJR0VORFVNMl9VUERBVEUKLQlpZigoZ191MzJDb3JyMk1hY0ZsYWdzICYgQ09SUl8yX0RTWCkgIHx8ICAoZ191MzJDb3JyMk1hY0ZsYWdzICYgQ09SUl8yX0FSUSkpCi0JewotCS8qIElFRUUgQ29tbWVudCAjNjI3IC8gTVRHIENvbW1lbnQgIzQyNiAqLwotICAgICAgIAl1MTZBUlFCbG9ja1NpemUgPSBtQVJRQmxvY2tTaXplOwotCQlpZihnX3UzMkNvcnIyTWFjRmxhZ3MgJiBDT1JSXzJfQVJRKSB7Ci0JCQl1MTZBUlFSZXRyeVR4VGltZU91dCA9IG1BUlFSZXRyeVRpbWVPdXRUeERlbGF5OwotCQkJaWYoZ191MzJWRU5ET1JfVFlQRSA9PSBWRU5ET1JfQUxDQVRFTCkgewotCQkJCXUxNkFSUVJldHJ5UnhUaW1lT3V0ID0gbUFSUVJldHJ5VGltZU91dFJ4RGVsYXlfQUxVOwotCQkJfSBlbHNlIHsKLQkJCQl1MTZBUlFSZXRyeVJ4VGltZU91dCA9IG1BUlFSZXRyeVRpbWVPdXRSeERlbGF5OwotCQkJfQotCQl9Ci0JCWVsc2UKLQkJewotCQkJdTE2QVJRUmV0cnlUeFRpbWVPdXQgPSBtQVJRUmV0cnlUaW1lT3V0VHhEZWxheUNvcnIxOwotCQkJdTE2QVJRUmV0cnlSeFRpbWVPdXQgPSBtQVJRUmV0cnlUaW1lT3V0UnhEZWxheUNvcnIxOwotCQl9Ci0JfQotCWVsc2UKLSNlbmRpZgotCXsKLQkJdTE2QVJRQmxvY2tTaXplID0gbUFSUUJsb2NrU2l6ZUNvcnIxOwotCQl1MTZBUlFSZXRyeVR4VGltZU91dCA9IG1BUlFSZXRyeVRpbWVPdXRUeERlbGF5Q29ycjE7Ci0JCXUxNkFSUVJldHJ5UnhUaW1lT3V0ID0gbUFSUVJldHJ5VGltZU91dFJ4RGVsYXlDb3JyMTsKLQl9Ci19Ci0KLQl2b2lkIENvbXB1dGVNYWNPdmVyaGVhZChCX1VJTlQ4CXU4U2VjT3ZyaGVhZCk7Ci0JQl9VSU5UMTYJR2V0TWFjT3ZlcmhlYWQoKSB7IHJldHVybiAJdTE2TWFjT3ZlcmhlYWQ7IH0KLSNlbHNlCiB0eXBlZGVmIHN0cnVjdCBfc3RTZXJ2aWNlRmxvd1BhcmFtU0l7Ci0jZW5kaWYgLy9lbmQgb2YgaWZkZWYgQkVDRUVNX1RBUkdFVAogCiAgICAgIC8qKiAgMzJiaXRTRklEIE9mIFRoZSBTZXJ2aWNlIEZsb3cqLwogICAgIEJfVUlOVDMyICAgICAgICAgICAgICAgICAgICAgICAgdTMyU0ZJRDsKQEAgLTM2NywxMSArMTg4LDYgQEAKIAogCSAvKiogIDE2Yml0IEFSUSBQdXJnZSB0aW1lb3V0ICovCiAgICAgQl9VSU5UMTYgICAgICAgICAgICAgICAgICAgICAgICB1MTZBUlFSeFB1cmdlVGltZU91dDsKLSNpZiAwIC8vZGVmIEVOQUJMRV9DT1JSSUdFTkRVTTJfVVBEQVRFCi0vKiBJRUVFIENvbW1lbnQgIzYyNyAvIE1URyBDb21tZW50ICM0MjYgKi8KLSAgICAvLy8gXGJyaWVmIFNpemUgb2YgYW4gQVJRIGJsb2NrLCBjaGFuZ2VkIGZyb20gMiBieXRlcyB0byAxCi0gICAgQl9VSU5UOCAgICAgICAgICAgICAgICAgICAgICAgIHU4QVJRQmxvY2tTaXplOwotI2VuZGlmCiAvL1RPRE86OlJlbW92ZSB0aGlzIG9uY2Ugd2UgbW92ZSB0byBhIG5ldyBDT1JSMiBkcml2ZXIKICAgICAvLy8gXGJyaWVmIFNpemUgb2YgYW4gQVJRIGJsb2NrCiAgICAgQl9VSU5UMTYgICAgICAgICAgICAgICAgICAgICAgICB1MTZBUlFCbG9ja1NpemU7CkBAIC00OTYsMzUgKzMxMiwxOCBAQAogCUJfVUlOVDgJCQkJCQkJYlZhbGlkOwkvKio8ICBWYWxpZGl0eSBmbGFnICovCiAJQl9VSU5UOAkJCQl1OFBhZGRpbmc7CSAvKio8ICBQYWRkaW5nIGJ5dGUqLwogCi0jaWZkZWYgQkVDRUVNX1RBUkdFVAotLyoqCi1TdHJ1Y3R1cmUgZm9yIENvbnZlcmdlbmNlIFN1YkxheWVyIFR5cGVzIHdpdGggYSBtYXhpbXVtIG9mIDQgY2xhc3NpZmllcnMKLSovCi0JQ0NvbnZlcmdlbmNlU0xUeXBlcwkJY0NvbnZlcmdlbmNlU0xUeXBlc1tNQVhfQ0xBU1NJRklFUlNfSU5fU0ZdOwotI2Vsc2UKIC8qKgogU3RydWN0dXJlIGZvciBDb252ZXJnZW5jZSBTdWJMYXllciBUeXBlcyB3aXRoIGEgbWF4aW11bSBvZiA0IGNsYXNzaWZpZXJzCiAqLwogCXN0Q29udmVyZ2VuY2VTTFR5cGVzCQljQ29udmVyZ2VuY2VTTFR5cGVzW01BWF9DTEFTU0lGSUVSU19JTl9TRl07Ci0jZW5kaWYKIAotI2lmZGVmIEJFQ0VFTV9UQVJHRVQKLX07Ci0jZWxzZQogfSBzdFNlcnZpY2VGbG93UGFyYW1TSSwgKnBzdFNlcnZpY2VGbG93UGFyYW1TSTsKIHR5cGVkZWYgc3RTZXJ2aWNlRmxvd1BhcmFtU0kgQ1NlcnZpY2VGbG93UGFyYW1TSTsKLSNlbmRpZgogCiAvKioKIHN0cnVjdHVyZSBzdExvY2FsU0ZBZGRSZXF1ZXN0CiAqLwogdHlwZWRlZiBzdHJ1Y3QgX3N0TG9jYWxTRkFkZFJlcXVlc3R7Ci0jaWZkZWYgQkVDRUVNX1RBUkdFVAotCSAgIF9zdExvY2FsU0ZBZGRSZXF1ZXN0KCApIDoKLQkgICAJdThUeXBlKDB4MDApLCAgZUNvbm5lY3Rpb25EaXIoMHgwMCksCi0JCXUxNlRJRCgweDAwMDApLCB1MTZDSUQoMHgwMDAwKSwgIHUxNlZDSUQoMHgwMDAwKQotCSAgIAkJe30KLSNlbmRpZgogCiAJQl9VSU5UOCAgICAgICAgICAgICAgICAgICAgICAgICB1OFR5cGU7CS8qKjwgIFR5cGUqLwogCUJfVUlOVDggICAgICBlQ29ubmVjdGlvbkRpcjsJCS8qKjwgIENvbm5lY3Rpb24gZGlyZWN0aW9uKi8KQEAgLTUzNSwxOSArMzM0LDkgQEAKIAkvLy8gXGJyaWVmIDE2Yml0VkNJRAogCUJfVUlOVDE2ICAgICAgICAgICAgICAgICAgICAgICAgdTE2VkNJRDsJLyoqPCAgMTZiaXQgVkNJRCovCiAgICAgLy8vIFxicmllZiBzdHJ1Y3R1cmUgUGFyYW1ldGVyU2V0Ci0jaWZkZWYgQkVDRUVNX1NJR05BTExJTkdfSU5URVJGQUNFX0FQSQotCUNTZXJ2aWNlRmxvd1BhcmFtU0kgc2ZQYXJhbWV0ZXJTZXQ7Ci0jZW5kaWYKIAotI2lmZGVmIEJFQ0VFTV9UQVJHRVQKLSAgICBDU2VydmljZUZsb3dQYXJhbVNJICAgICAgICAgICAgICAqcHNmUGFyYW1ldGVyU2V0OwotI2Vsc2UKIAlzdFNlcnZpY2VGbG93UGFyYW1TSQkqcHNmUGFyYW1ldGVyU2V0OwkvKio8ICBzdHJ1Y3R1cmUgUGFyYW1ldGVyU2V0Ki8KLSNlbmRpZgogCi0jaWZkZWYgVVNJTkdfVlhXT1JLUwotICAgIFVTRV9EQVRBX01FTU9SWV9NQU5BR0VSKCk7Ci0jZW5kaWYKIH1zdExvY2FsU0ZBZGRSZXF1ZXN0LCAqcHN0TG9jYWxTRkFkZFJlcXVlc3Q7CiAKIApAQCAtNTU1LDEyICszNDQsNiBAQAogc3RydWN0dXJlIHN0TG9jYWxTRkFkZEluZGljYXRpb24KICovCiB0eXBlZGVmIHN0cnVjdCBfc3RMb2NhbFNGQWRkSW5kaWNhdGlvbnsKLSNpZmRlZiBCRUNFRU1fVEFSR0VUCi0JICAgX3N0TG9jYWxTRkFkZEluZGljYXRpb24oICkgOgotCSAgIAl1OFR5cGUoMHgwMCksICBlQ29ubmVjdGlvbkRpcigweDAwKSwKLQkJdTE2VElEKDB4MDAwMCksIHUxNkNJRCgweDAwMDApLCAgdTE2VkNJRCgweDAwMDApCi0JICAgCQl7fQotI2VuZGlmCiAKIAlCX1VJTlQ4ICAgICAgICAgICAgICAgICAgICAgICAgIHU4VHlwZTsJLyoqPCAgVHlwZSovCiAJQl9VSU5UOCAgICAgIGVDb25uZWN0aW9uRGlyOwkvKio8ICBDb25uZWN0aW9uIERpcmVjdGlvbiovCkBAIC01NzEsMzcgKzM1NCwxOSBAQAogICAgIC8vLyBcYnJpZWYgMTZiaXRWQ0lECiAgICAgQl9VSU5UMTYgICAgICAgICAgICAgICAgICAgICAgICB1MTZWQ0lEOwkgLyoqPCAgMTZiaXRWQ0lEKi8KIAotI2lmZGVmIAlCRUNFRU1fU0lHTkFMTElOR19JTlRFUkZBQ0VfQVBJCi0JQ1NlcnZpY2VGbG93UGFyYW1TSSAgICAgICAgICAgICAgc2ZBdXRob3JpemVkU2V0OwotICAgIC8vLyBcYnJpZWYgc3RydWN0dXJlIEFkbWl0dGVkU2V0Ci0gICAgQ1NlcnZpY2VGbG93UGFyYW1TSSAgICAgICAgICAgICAgc2ZBZG1pdHRlZFNldDsKLSAgICAvLy8gXGJyaWVmIHN0cnVjdHVyZSBBY3RpdmVTZXQKLSAgICBDU2VydmljZUZsb3dQYXJhbVNJICAgICAgICAgICAgICBzZkFjdGl2ZVNldDsKLSNlbmRpZgogCiAgICAgLy8vIFxicmllZiBzdHJ1Y3R1cmUgQXV0aG9yaXplZFNldAotI2lmZGVmIEJFQ0VFTV9UQVJHRVQKLSAgICBDU2VydmljZUZsb3dQYXJhbVNJICAgICAgICAgICAgICAqcHNmQXV0aG9yaXplZFNldDsKLSAgICAvLy8gXGJyaWVmIHN0cnVjdHVyZSBBZG1pdHRlZFNldAotICAgIENTZXJ2aWNlRmxvd1BhcmFtU0kgICAgICAgICAgICAgICpwc2ZBZG1pdHRlZFNldDsKLSAgICAvLy8gXGJyaWVmIHN0cnVjdHVyZSBBY3RpdmVTZXQKLSAgICBDU2VydmljZUZsb3dQYXJhbVNJICAgICAgICAgICAgICAqcHNmQWN0aXZlU2V0OwotI2Vsc2UKICAgICAvLy8gXGJyaWVmIHN0cnVjdHVyZSBBdXRob3JpemVkU2V0CiAgICAgc3RTZXJ2aWNlRmxvd1BhcmFtU0kgICAgICAgICAgICAgICpwc2ZBdXRob3JpemVkU2V0OwkvKio8ICBBdXRob3JpemVkU2V0IG9mIHR5cGUgc3RTZXJ2aWNlRmxvd1BhcmFtU0kqLwogICAgIC8vLyBcYnJpZWYgc3RydWN0dXJlIEFkbWl0dGVkU2V0CiAgICAgc3RTZXJ2aWNlRmxvd1BhcmFtU0kgICAgICAgICAgICAgICpwc2ZBZG1pdHRlZFNldDsJLyoqPCAgQWRtaXR0ZWRTZXQgb2YgdHlwZSBzdFNlcnZpY2VGbG93UGFyYW1TSSovCiAgICAgLy8vIFxicmllZiBzdHJ1Y3R1cmUgQWN0aXZlU2V0CiAgICAgc3RTZXJ2aWNlRmxvd1BhcmFtU0kgICAgICAgICAgICAgICpwc2ZBY3RpdmVTZXQ7CS8qKjwgIHNmQWN0aXZlU2V0IG9mIHR5cGUgc3RTZXJ2aWNlRmxvd1BhcmFtU0kqLwotI2VuZGlmCiAJQl9VSU5UOAkJCQkgICB1OENDOwkvKio8ICBDb25maXJtYXRpb24gQ29kZSovCiAJQl9VSU5UOAkJCQkgICB1OFBhZGQ7CQkvKio8ICA4LWJpdCBQYWRkaW5nICovCiAKICAgICBCX1VJTlQxNiAgICAgICAgICAgICAgIHUxNlBhZGQ7CS8qKjwgMTYgYml0IFBhZGRpbmcgKi8KIAotI2lmZGVmIFVTSU5HX1ZYV09SS1MKLSAgICBVU0VfREFUQV9NRU1PUllfTUFOQUdFUigpOwotI2VuZGlmCiB9c3RMb2NhbFNGQWRkSW5kaWNhdGlvbjsKIAogCkBAIC02MTksMzMgKzM4NCwxNyBAQAogc3RydWN0dXJlIHN0TG9jYWxTRkRlbGV0ZVJlcXVlc3QKICovCiB0eXBlZGVmIHN0cnVjdCBfc3RMb2NhbFNGRGVsZXRlUmVxdWVzdHsKLSNpZmRlZiBCRUNFRU1fVEFSR0VUCi0JICAgX3N0TG9jYWxTRkRlbGV0ZVJlcXVlc3QoICkgOgotCSAgIAl1OFR5cGUoMHgwMCksICB1OFBhZGRpbmcoMHgwMCksCi0JCXUxNlRJRCgweDAwMDApLCB1MzJTRklEICgweDAwMDAwMDAwKQotCSAgIAkJe30KLSNlbmRpZgogCUJfVUlOVDggICAgICAgICAgICAgICAgICAgICAgICAgdThUeXBlOwkgLyoqPCBUeXBlKi8KIAlCX1VJTlQ4ICAgICAgICAgICAgICAgICAgICAgICAgIHU4UGFkZGluZzsJIC8qKjwgIFBhZGRpbmcgYnl0ZSovCiAJQl9VSU5UMTYJCQl1MTZUSUQ7CQkgLyoqPCAgVElEKi8KICAgICAvLy8gXGJyaWVmIDMyYml0U0ZJRAogICAgIEJfVUlOVDMyICAgICAgICAgICAgICAgICAgICAgICAgdTMyU0ZJRDsJIC8qKjwgIFNGSUQqLwotI2lmZGVmIFVTSU5HX1ZYV09SS1MKLSAgICBVU0VfREFUQV9NRU1PUllfTUFOQUdFUigpOwotI2VuZGlmCiB9c3RMb2NhbFNGRGVsZXRlUmVxdWVzdCwgKnBzdExvY2FsU0ZEZWxldGVSZXF1ZXN0OwogCiAvKioKIHN0cnVjdHVyZSBzdExvY2FsU0ZEZWxldGVJbmRpY2F0aW9uCiAqLwogdHlwZWRlZiBzdHJ1Y3Qgc3RMb2NhbFNGRGVsZXRlSW5kaWNhdGlvbnsKLSNpZmRlZiBCRUNFRU1fVEFSR0VUCi0JICAgc3RMb2NhbFNGRGVsZXRlSW5kaWNhdGlvbiggKSA6Ci0JICAgCXU4VHlwZSgweDAwKSwgIHU4UGFkZGluZygweDAwKSwKLQkJdTE2VElEKDB4MDAwMCksIHUxNkNJRCgweDAwMDApLAotCQl1MTZWQ0lEKDB4MDAwMCksdTMyU0ZJRCAoMHgwMDAwMDAwMCkKLQkgICAJCXt9Ci0jZW5kaWYKIAlCX1VJTlQ4ICAgICAgICAgICAgICAgICAgICAgICAgIHU4VHlwZTsJLyoqPCBUeXBlICovCiAJQl9VSU5UOCAgICAgICAgICAgICAgICAgICAgICAgICB1OFBhZGRpbmc7CS8qKjwgUGFkZGluZyAgKi8KIAlCX1VJTlQxNgkJCXUxNlRJRDsJCQkvKio8IFRJRCAqLwpAQCAtNjU4LDkgKzQwNyw2IEBACiAJLy8vIFxicmllZiA4Yml0IENvbmZpcm1hdGlvbiBjb2RlCiAJQl9VSU5UOCAgICAgICAgICAgICAgICAgICAgICAgICB1OENvbmZpcm1hdGlvbkNvZGU7CS8qKjwgQ29uZmlybWF0aW9uIGNvZGUgKi8KIAlCX1VJTlQ4ICAgICAgICAgICAgICAgICAgICAgICAgIHU4UGFkZGluZzFbM107CQkvKio8IDMgYnl0ZSBQYWRkaW5nICAqLwotI2lmZGVmIFVTSU5HX1ZYV09SS1MKLSAgICBVU0VfREFUQV9NRU1PUllfTUFOQUdFUigpOwotI2VuZGlmCiB9c3RMb2NhbFNGRGVsZXRlSW5kaWNhdGlvbjsKIAogdHlwZWRlZiBzdHJ1Y3QgX3N0SU1fU0ZIb3N0Tm90aWZ5CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmNtL2hlYWRlcnMuaCBiL2RyaXZlcnMvc3RhZ2luZy9iY20vaGVhZGVycy5oCmluZGV4IDlkNGUzYWMuLjExNDhlNWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9iY20vaGVhZGVycy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9iY20vaGVhZGVycy5oCkBAIC0yMiw3ICsyMiw2IEBACiAjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KICNpbmNsdWRlIDxuZXQvaXAuaD4KICNpbmNsdWRlIDxsaW51eC93YWl0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KICNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAKQEAgLTM2LDI2ICszNSwxMCBAQAogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+Ci0jaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwwKQogI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KLSNlbmRpZgogI2luY2x1ZGUgPGxpbnV4L3RjcC5oPgogI2luY2x1ZGUgPGxpbnV4L3VkcC5oPgotI2lmbmRlZiBCQ01fU0hNX0lOVEVSRkFDRQogI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgotI2VuZGlmCi0jaWZkZWYgQkVDRUVNX1RBUkdFVAotCi0jaW5jbHVkZSA8bWFjX2NvbW1vbi5oPgotI2luY2x1ZGUgPG1zZ19Ec2EuaD4KLSNpbmNsdWRlIDxtc2dfRHNjLmg+Ci0jaW5jbHVkZSA8bXNnX0RzZC5oPgotI2luY2x1ZGUgPHNjaF9kZWZpbml0aW9ucy5oPgotdXNpbmcgbmFtZXNwYWNlIEJlY2VlbTsKLSNpZmRlZiBFTkFCTEVfQ09SUklHRU5EVU0yX1VQREFURQotZXh0ZXJuIEJfVUlOVDMyIGdfdTMyQ29ycjJNYWNGbGFnczsKLSNlbmRpZgotI2VuZGlmCiAKICNpbmNsdWRlICJUeXBlZGVmcy5oIgogI2luY2x1ZGUgIlZlcnNpb24uaCIKQEAgLTcxLDM5ICs1NCwyOCBAQAogI2luY2x1ZGUgIkNtSG9zdC5oIgogI2luY2x1ZGUgIkREUkluaXQuaCIKICNpbmNsdWRlICJEZWJ1Zy5oIgotI2luY2x1ZGUgIkhvc3RNaWJzLmgiCiAjaW5jbHVkZSAiSVB2NlByb3RvY29sSGRyLmgiCi0jaW5jbHVkZSAib3NhbF9taXNjLmgiCiAjaW5jbHVkZSAiUEhTTW9kdWxlLmgiCiAjaW5jbHVkZSAiUHJvdG9jb2wuaCIKICNpbmNsdWRlICJQcm90b3R5cGVzLmgiCiAjaW5jbHVkZSAiUXVldWUuaCIKICNpbmNsdWRlICJ2ZW5kb3JzcGVjaWZpY2V4dG4uaCIKIAotI2lmbmRlZiBCQ01fU0hNX0lOVEVSRkFDRQogCiAjaW5jbHVkZSAiSW50ZXJmYWNlTWFjcm9zLmgiCiAjaW5jbHVkZSAiSW50ZXJmYWNlQWRhcHRlci5oIgogI2luY2x1ZGUgIkludGVyZmFjZUlzci5oIgotI2luY2x1ZGUgIkludGVyZmFjZW1haW4uaCIKICNpbmNsdWRlICJJbnRlcmZhY2VNaXNjLmgiCiAjaW5jbHVkZSAiSW50ZXJmYWNlUnguaCIKICNpbmNsdWRlICJJbnRlcmZhY2VUeC5oIgotI2VuZGlmCiAjaW5jbHVkZSAiSW50ZXJmYWNlSWRsZU1vZGUuaCIKICNpbmNsdWRlICJJbnRlcmZhY2VJbml0LmgiCiAKLSNpZmRlZiBCQ01fU0hNX0lOVEVSRkFDRQotI2luY2x1ZGUgPGxpbnV4L2NwZV9jb25maWcuaD4KLQotI2lmZGVmIEdETUFfSU5URVJGQUNFCi0jaW5jbHVkZSAiR2RtYUludGVyZmFjZS5oIgotI2luY2x1ZGUgInN5bXBob255LmgiCi0jZWxzZQotI2luY2x1ZGUgInZpcnR1YWxfaW50ZXJmYWNlLmgiCi0KLSNlbmRpZgotCi0jZW5kaWYKKyNkZWZpbmUgRFJWX05BTUUJImJlY2VlbSIKKyNkZWZpbmUgREVWX05BTUUJInRhcmFuZyIKKyNkZWZpbmUgRFJWX0RFU0NSSVBUSU9OICJCZWNlZW0gQ29tbXVuaWNhdGlvbnMgSW5jLiBXaU1BWCBkcml2ZXIiCisjZGVmaW5lIERSVl9DT1BZUklHSFQJIkNvcHlyaWdodCAyMDEwLiBCZWNlZW0gQ29tbXVuaWNhdGlvbnMgSW5jIgorI2RlZmluZSBEUlZfVkVSU0lPTglWRVJfRklMRVZFUlNJT05fU1RSCisjZGVmaW5lIFBGWAkJRFJWX05BTUUgIiAiCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JjbS9ob3N0bWlicy5jIGIvZHJpdmVycy9zdGFnaW5nL2JjbS9ob3N0bWlicy5jCmluZGV4IGU5ZGE1MTMuLmMxM2VhNWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9iY20vaG9zdG1pYnMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvYmNtL2hvc3RtaWJzLmMKQEAgLTEwLDEyICsxMCw4IEBACiAgKi8KICNpbmNsdWRlICJoZWFkZXJzLmgiCiAKLUlOVCAgUHJvY2Vzc0dldEhvc3RNaWJzKFBNSU5JX0FEQVBURVIgQWRhcHRlciwKLQkJCQkJCSAgUFZPSUQgaW9CdWZmZXIsCi0JCQkJCQkgIFVMT05HIGlucHV0QnVmZmVyTGVuZ3RoKQorSU5UICBQcm9jZXNzR2V0SG9zdE1pYnMoUE1JTklfQURBUFRFUiBBZGFwdGVyLCBTX01JQlNfSE9TVF9TVEFUU19NSUJTICpwc3RIb3N0TWlicykKIHsKLQotCVNfTUlCU19IT1NUX1NUQVRTX01JQlMgKnBzdEhvc3RNaWJzICAgICAgICAgPSBOVUxMOwogCVNfU0VSVklDRUZMT1dfRU5UUlkgICAgKnBzdFNlcnZpY2VGbG93RW50cnkgPSBOVUxMOwogCVNfUEhTX1JVTEUgICAgICAgICAgICAgKnBzdFBoc1J1bGUgICAgICAgICAgPSBOVUxMOwogCVNfQ0xBU1NJRklFUl9UQUJMRSAgICAgKnBzdENsYXNzaWZpZXJUYWJsZSAgPSBOVUxMOwpAQCAtMzAsMTUgKzI2LDYgQEAKIAkJcmV0dXJuIFNUQVRVU19GQUlMVVJFOwogCX0KIAotCWlmKGlvQnVmZmVyID09IE5VTEwpCi0JewotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JbWVtc2V0KGlvQnVmZmVyLDAsc2l6ZW9mKFNfTUlCU19IT1NUX1NUQVRTX01JQlMpKTsKLQotCXBzdEhvc3RNaWJzID0gKFNfTUlCU19IT1NUX1NUQVRTX01JQlMgKilpb0J1ZmZlcjsKLQotCiAJLy9Db3B5IHRoZSBjbGFzc2lmaWVyIFRhYmxlCiAJZm9yKG5DbGFzc2lmaWVySW5kZXg9MDsgbkNsYXNzaWZpZXJJbmRleCA8IE1BWF9DTEFTU0lGSUVSUzsKIAkJCW5DbGFzc2lmaWVySW5kZXgrKykKQEAgLTU0LDcgKzQxLDcgQEAKIAl7CiAJaWYoQWRhcHRlci0+UGFja0luZm9bblNmSW5kZXhdLmJWYWxpZCkKIAl7Ci0JCQlPc2FsTWVtTW92ZSgoUFZPSUQpJnBzdEhvc3RNaWJzLT5hc3RTRnRhYmxlW25TZkluZGV4XSwoUFZPSUQpJkFkYXB0ZXItPlBhY2tJbmZvW25TZkluZGV4XSxzaXplb2YoU19NSUJTX1NFUlZJQ0VGTE9XX1RBQkxFKSk7CisJCQltZW1jcHkoKFBWT0lEKSZwc3RIb3N0TWlicy0+YXN0U0Z0YWJsZVtuU2ZJbmRleF0sKFBWT0lEKSZBZGFwdGVyLT5QYWNrSW5mb1tuU2ZJbmRleF0sc2l6ZW9mKFNfTUlCU19TRVJWSUNFRkxPV19UQUJMRSkpOwogCX0KIAllbHNlCiAJewpAQCAtODMsNyArNzAsNyBAQAogCiAJCQlwc3RIb3N0TWlicy0+YXN0UGhzUnVsZXNUYWJsZVtuUGhzVGFibGVJbmRleF0udWxTRklEID0gQWRhcHRlci0+UGFja0luZm9bblNmSW5kZXhdLnVsU0ZJRDsKIAotCQkJT3NhbE1lbU1vdmUoJnBzdEhvc3RNaWJzLT5hc3RQaHNSdWxlc1RhYmxlW25QaHNUYWJsZUluZGV4XS51OFBIU0ksCisJCQltZW1jcHkoJnBzdEhvc3RNaWJzLT5hc3RQaHNSdWxlc1RhYmxlW25QaHNUYWJsZUluZGV4XS51OFBIU0ksCiAJCQkJCQkmcHN0UGhzUnVsZS0+dThQSFNJLAogCQkJCQkJc2l6ZW9mKFNfUEhTX1JVTEUpKTsKIAkJCQluUGhzVGFibGVJbmRleCsrOwpAQCAtOTUsMTIgKzgyLDkgQEAKIAl9CiAKIAotCiAJLy9jb3B5IG90aGVyIEhvc3QgU3RhdGlzdGljcyBwYXJhbWV0ZXJzCi0JcHN0SG9zdE1pYnMtPnN0SG9zdEluZm8uR29vZFRyYW5zbWl0cyA9Ci0JCQkJYXRvbWljX3JlYWQoJkFkYXB0ZXItPlR4VG90YWxQYWNrZXRDb3VudCk7Ci0JcHN0SG9zdE1pYnMtPnN0SG9zdEluZm8uR29vZFJlY2VpdmVzID0KLQkJCQlhdG9taWNfcmVhZCgmQWRhcHRlci0+R29vZFJ4UGt0Q291bnQpOworCXBzdEhvc3RNaWJzLT5zdEhvc3RJbmZvLkdvb2RUcmFuc21pdHMgPSBBZGFwdGVyLT5kZXYtPnN0YXRzLnR4X3BhY2tldHM7CisJcHN0SG9zdE1pYnMtPnN0SG9zdEluZm8uR29vZFJlY2VpdmVzID0gQWRhcHRlci0+ZGV2LT5zdGF0cy5yeF9wYWNrZXRzOwogCXBzdEhvc3RNaWJzLT5zdEhvc3RJbmZvLkN1cnJOdW1GcmVlRGVzYyA9CiAJCQlhdG9taWNfcmVhZCgmQWRhcHRlci0+Q3Vyck51bUZyZWVUeERlc2MpOwogCXBzdEhvc3RNaWJzLT5zdEhvc3RJbmZvLkJFQnVja2V0U2l6ZSA9IEFkYXB0ZXItPkJFQnVja2V0U2l6ZTsKQEAgLTExNSwxMyArOTksMTAgQEAKIH0KIAogCi1JTlQgR2V0RHJvcHBlZEFwcENudHJsUGt0TWlicyhQVk9JRCBpb0J1ZmZlciwgUFBFUl9UQVJBTkdfREFUQSBwVGFyYW5nKQorVk9JRCBHZXREcm9wcGVkQXBwQ250cmxQa3RNaWJzKFNfTUlCU19IT1NUX1NUQVRTX01JQlMgKnBzdEhvc3RNaWJzLCBjb25zdCBQUEVSX1RBUkFOR19EQVRBIHBUYXJhbmcpCiB7Ci0JU19NSUJTX0hPU1RfU1RBVFNfTUlCUyAqcHN0SG9zdE1pYnMgPSAoU19NSUJTX0hPU1RfU1RBVFNfTUlCUyAqKWlvQnVmZmVyOwotCi0JbWVtY3B5KChQVk9JRCkmKHBzdEhvc3RNaWJzLT5zdERyb3BwZWRBcHBDbnRybE1zZ3MpLChQVk9JRCkmKHBUYXJhbmctPnN0RHJvcHBlZEFwcENudHJsTXNncyksc2l6ZW9mKFNfTUlCU19EUk9QUEVEX0FQUF9DTlRSTF9NRVNTQUdFUykpOwotCi0JcmV0dXJuIFNUQVRVU19TVUNDRVNTIDsKKwltZW1jcHkoJihwc3RIb3N0TWlicy0+c3REcm9wcGVkQXBwQ250cmxNc2dzKSwKKwkgICAgICAgJihwVGFyYW5nLT5zdERyb3BwZWRBcHBDbnRybE1zZ3MpLHNpemVvZihTX01JQlNfRFJPUFBFRF9BUFBfQ05UUkxfTUVTU0FHRVMpKTsKIH0KIAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmNtL2xlZF9jb250cm9sLmMgYi9kcml2ZXJzL3N0YWdpbmcvYmNtL2xlZF9jb250cm9sLmMKaW5kZXggOTdhZGFhZS4uMTZlOTM5ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JjbS9sZWRfY29udHJvbC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9iY20vbGVkX2NvbnRyb2wuYwpAQCAtMTA4LDUyICsxMDgsMTYgQEAKIAl1bG9uZyB0aW1lb3V0ID0gMDsKIAogCS8qUmVhZCBpbml0aWFsIHZhbHVlIG9mIHBhY2tldHMgc2VudC9yZWNlaXZlZCAqLwotCUluaXRpYWxfbnVtX29mX3BhY2t0c190eCA9IGF0b21pY19yZWFkKCZBZGFwdGVyLT5UeFRvdGFsUGFja2V0Q291bnQpOwotCUluaXRpYWxfbnVtX29mX3BhY2t0c19yeCA9IGF0b21pY19yZWFkKCZBZGFwdGVyLT5Hb29kUnhQa3RDb3VudCk7CisJSW5pdGlhbF9udW1fb2ZfcGFja3RzX3R4ID0gQWRhcHRlci0+ZGV2LT5zdGF0cy50eF9wYWNrZXRzOworCUluaXRpYWxfbnVtX29mX3BhY2t0c19yeCA9IEFkYXB0ZXItPmRldi0+c3RhdHMucnhfcGFja2V0czsKKwogCS8qU2NhbGUgdGhlIHJhdGUgb2YgdHJhbnNmZXIgdG8gbm8gb2YgYmxpbmtzLiovCiAJbnVtX29mX3RpbWVfdHg9IFNjYWxlUmF0ZW9mVHJhbnNmZXIoKFVMT05HKXJhdGVfb2ZfdHJhbnNmZXJfdHgpOwogCW51bV9vZl90aW1lX3J4PSBTY2FsZVJhdGVvZlRyYW5zZmVyKChVTE9ORylyYXRlX29mX3RyYW5zZmVyX3J4KTsKIAogCXdoaWxlKChBZGFwdGVyLT5kZXZpY2VfcmVtb3ZlZCA9PSBGQUxTRSkpCiAJewotCQkjaWYgMAotCQlpZigwID09IG51bV9vZl90aW1lX3R4ICYmIDAgPT0gbnVtX29mX3RpbWVfcngpCi0JCXsKLQkJCXRpbWVvdXQgPSAxMDAwOwotCQkJU3RhdHVzID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoQWRhcHRlci0+TEVESW5mby5ub3RpZnlfbGVkX2V2ZW50LAotCQkJCWN1cnJkcml2ZXJzdGF0ZSE9IEFkYXB0ZXItPkRyaXZlclN0YXRlIHx8IGt0aHJlYWRfc2hvdWxkX3N0b3AoKSwKLQkJCQltc2Vjc190b19qaWZmaWVzICh0aW1lb3V0KSk7Ci0JCQlpZihrdGhyZWFkX3Nob3VsZF9zdG9wKCkpCi0JCQl7Ci0JCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBMRURfRFVNUF9JTkZPLCBEQkdfTFZMX0FMTCwgIkxlZCB0aHJlYWQgZ290IHNpZ25hbCB0byBleGl0Li5oZW5jZSBleGl0aW5nIik7Ci0JCQkJQWRhcHRlci0+TEVESW5mby5sZWRfdGhyZWFkX3J1bm5pbmc9IEJDTV9MRURfVEhSRUFEX0RJU0FCTEVEOwotCQkJCXJldHVybiBFVkVOVF9TSUdOQUxFRDsKLQkJCX0KLQkJCWlmKFN0YXR1cykKLQkJCQlyZXR1cm4gRVZFTlRfU0lHTkFMRUQ7Ci0KLQkJfQotCQkjZW5kaWYKLQogCQl0aW1lb3V0ID0gNTA7Ci0JCSNpZiAwCi0JCS8qVHVybiBvbiBMRUQgaWYgVHggaXMgaGlnaCBiYW5kd2lkdGgqLwotCQlpZihudW1fb2ZfdGltZV90eCA+IE1BWF9OVU1fT0ZfQkxJTktTKQotCQl7Ci0JCQlUVVJOX09OX0xFRCgxPDxHUElPX051bV90eCwgdWlUeExlZEluZGV4KTsKLQkJCW51bV9vZl90aW1lX3R4ID0gMDsKLQkJCWJCbGlua0JvdGhMRUQgPSBGQUxTRTsKLQkJCW51bV9vZl90aW1lID0gbnVtX29mX3RpbWVfcng7Ci0JCX0KLQkJCS8qVHVybiBvbiBMRUQgaWYgUnggaXMgaGlnaCBiYW5kd2lkdGgqLwotCQlpZihudW1fb2ZfdGltZV9yeCA+IE1BWF9OVU1fT0ZfQkxJTktTKQotCQl7Ci0JCQlUVVJOX09OX0xFRCgxPDxHUElPX051bV9yeCwgdWlSeExlZEluZGV4KTsKLQkJCW51bV9vZl90aW1lX3J4ID0gMDsKLQkJCWJCbGlua0JvdGhMRUQgPSBGQUxTRTsKLQkJCW51bV9vZl90aW1lID0gbnVtX29mX3RpbWVfdHg7Ci0JCX0KLQkJI2VuZGlmCiAJCS8qQmxpbmsgVHggYW5kIFJ4IExFRCB3aGVuIGJvdGggVHggYW5kIFJ4IGlzIGluIG5vcm1hbCBiYW5kd2lkdGgqLwogCQlpZihiQmxpbmtCb3RoTEVEKQogCQl7CkBAIC0yNDksOSArMjEzLDEwIEBACiAgCQkgKiBSZWFkIHRoZSBUeCAmIFJ4IHBhY2tldHMgdHJhbnNtaXNzaW9uIGFmdGVyIDEgc2Vjb25kIGFuZAogIAkJICogY2FsY3VsYXRlIHJhdGUgb2YgdHJhbnNmZXIKICAJCSAqLwotCQlGaW5hbF9udW1fb2ZfcGFja3RzX3R4ID0gYXRvbWljX3JlYWQoJkFkYXB0ZXItPlR4VG90YWxQYWNrZXRDb3VudCk7CisJCUZpbmFsX251bV9vZl9wYWNrdHNfdHggPSBBZGFwdGVyLT5kZXYtPnN0YXRzLnR4X3BhY2tldHM7CisJCUZpbmFsX251bV9vZl9wYWNrdHNfcnggPSBBZGFwdGVyLT5kZXYtPnN0YXRzLnJ4X3BhY2tldHM7CisKIAkJcmF0ZV9vZl90cmFuc2Zlcl90eCA9IEZpbmFsX251bV9vZl9wYWNrdHNfdHggLSBJbml0aWFsX251bV9vZl9wYWNrdHNfdHg7Ci0JCUZpbmFsX251bV9vZl9wYWNrdHNfcnggPSBhdG9taWNfcmVhZCgmQWRhcHRlci0+R29vZFJ4UGt0Q291bnQpOwogCQlyYXRlX29mX3RyYW5zZmVyX3J4ID0gRmluYWxfbnVtX29mX3BhY2t0c19yeCAtIEluaXRpYWxfbnVtX29mX3BhY2t0c19yeDsKIAogCQkvKlJlYWQgaW5pdGlhbCB2YWx1ZSBvZiBwYWNrZXRzIHNlbnQvcmVjZWl2ZWQgKi8KQEAgLTI5Myw3ICsyNTgsNyBAQAogCiAJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBMRURfRFVNUF9JTkZPLCBEQkdfTFZMX0FMTCwiTEVEIFRocmVhZDpWYWxpZGF0ZURTRFBhcmFtc0NoZWNrc3VtOiAweCVseCAweCVYIix1bFBhcmFtT2Zmc2V0LCB1c1BhcmFtTGVuKTsKIAotCXB1QnVmZmVyID0gT3NhbE1lbUFsbG9jKHVzUGFyYW1MZW4sIiFNRU0iKTsKKwlwdUJ1ZmZlciA9IGttYWxsb2ModXNQYXJhbUxlbiwgR0ZQX0tFUk5FTCk7CiAJaWYoIXB1QnVmZmVyKQogCXsKIAkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBMRURfRFVNUF9JTkZPLCBEQkdfTFZMX0FMTCwiTEVEIFRocmVhZDogVmFsaWRhdGVEU0RQYXJhbXNDaGVja3N1bSBBbGxvY2F0aW9uIGZhaWxlZCIpOwpAQCAtMzQxLDEwICszMDYsNyBAQAogCX0KIAogZXhpdDoKLQlpZihwdUJ1ZmZlcikKLQl7Ci0JCU9zYWxNZW1GcmVlKHB1QnVmZmVyLCB1c1BhcmFtTGVuKTsKLQl9CisJa2ZyZWUocHVCdWZmZXIpOwogCXJldHVybiBTdGF0dXM7CiB9CiAKQEAgLTQ5NywxMiArNDU5LDEwIEBACiB7CiAJaW50IFN0YXR1cyA9IFNUQVRVU19TVUNDRVNTOwogCVVDSEFSIEdQSU9fQXJyYXlbTlVNX09GX0xFRFMrMV07IC8qQXJyYXkgdG8gc3RvcmUgR1BJTyBudW1iZXJzIGZyb20gRUVQUk9NKi8KLSNpZm5kZWYgQkNNX1NITV9JTlRFUkZBQ0UKIAlVSU5UIHVpSW5kZXggPSAwOwogCVVJTlQgdWlOdW1fb2ZfTEVEX1R5cGUgPSAwOwogCVBVQ0hBUiBwdUNGR0RhdGEJPSBOVUxMOwogCVVDSEFSIGJEYXRhID0gMDsKLSNlbmRpZgogCW1lbXNldChHUElPX0FycmF5LCBESVNBQkxFX0dQSU9fTlVNLCBOVU1fT0ZfTEVEUysxKTsKIAogCWlmKCFBZGFwdGVyLT5wc3RhcmdldHBhcmFtcyB8fCBJU19FUlIoQWRhcHRlci0+cHN0YXJnZXRwYXJhbXMpKQpAQCAtNTI0LDEwICs0ODQsNiBAQAogCQkqYkVuYWJsZVRocmVhZCA9IEZBTFNFOwogCQlyZXR1cm4gU3RhdHVzOwogCX0KLSNpZmRlZiBCQ01fU0hNX0lOVEVSRkFDRQotCSpiRW5hYmxlVGhyZWFkID0gRkFMU0U7Ci0JcmV0dXJuIFN0YXR1cyA7Ci0jZWxzZQogICAvKgogICAgICAqIENPTkZJRyBmaWxlIHJlYWQgc3VjY2Vzc2Z1bGx5LiBEZWFsbG9jYXRlIHRoZSBtZW1vcnkgb2YKICAgICAgKiB1aUZpbGVOYW1lQnVmZmVyU2l6ZQpAQCAtNTc4LDIzICs1MzQsNyBAQAogCX0KIAlpZih1aU51bV9vZl9MRURfVHlwZSA+PSBOVU1fT0ZfTEVEUykKIAkJKmJFbmFibGVUaHJlYWQgPSBGQUxTRTsKLSNlbmRpZgogCi0jaWYgMAotCWZvcih1aUluZGV4PTA7IHVpSW5kZXg8TlVNX09GX0xFRFM7IHVpSW5kZXgrKykKLQl7Ci0JCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX09USEVSUywgTEVEX0RVTVBfSU5GTywgREJHX0xWTF9BTEwsIkxFRFN0YXRlWyVkXS5MRURfVHlwZSA9ICV4XG4iLCB1aUluZGV4LAotCQkJQWRhcHRlci0+TEVESW5mby5MRURTdGF0ZVt1aUluZGV4XS5MRURfVHlwZSk7Ci0JCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX09USEVSUywgTEVEX0RVTVBfSU5GTywgREJHX0xWTF9BTEwsIkxFRFN0YXRlWyVkXS5MRURfT25fU3RhdGUgPSAleFxuIiwgdWlJbmRleCwKLQkJCUFkYXB0ZXItPkxFREluZm8uTEVEU3RhdGVbdWlJbmRleF0uTEVEX09uX1N0YXRlKTsKLQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBMRURfRFVNUF9JTkZPLCBEQkdfTFZMX0FMTCwiTEVEU3RhdGVbJWRdLkxFRF9CbGlua19TdGF0ZSA9ICV4XG4iLCB1aUluZGV4LAotCQkJQWRhcHRlci0+TEVESW5mby5MRURTdGF0ZVt1aUluZGV4XS5MRURfQmxpbmtfU3RhdGUpOwotCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIExFRF9EVU1QX0lORk8sIERCR19MVkxfQUxMLCJMRURTdGF0ZVslZF0uR1BJT19OdW0gPSAleFxuIiwgdWlJbmRleCwKLQkJCUFkYXB0ZXItPkxFREluZm8uTEVEU3RhdGVbdWlJbmRleF0uR1BJT19OdW0pOwotCX0KLQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIExFRF9EVU1QX0lORk8sIERCR19MVkxfQUxMLCJMRUQgVGhyZWFkOiBQb2xhcml0eSA9ICVkXG4iLAotCQkJQWRhcHRlci0+TEVESW5mby5CaXRQb2xhcnR5KTsKLSNlbmRpZgogCXJldHVybiBTdGF0dXM7CiB9CiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC03MjEsMjAgKzY2MSw2IEBACiAJCQlUVVJOX09GRl9MRUQoMTw8R1BJT19udW0sIHVpTGVkSW5kZXgpOwogCQkJcmV0dXJuIDsvL1NUQVRVU19GQUlMVVJFOwogCQl9Ci0JI2lmIDAKLQkJaWYoQWRhcHRlci0+ZGV2aWNlX3JlbW92ZWQpCi0JCXsKLQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX09USEVSUywgTEVEX0RVTVBfSU5GTywgREJHX0xWTF9BTEwsIkRldmljZSByZW1vdmVkIGhlbmNlIGV4aXRpbmcgZnJvbSBMZWQgVGhyZWFkLi4iKTsKLQkJCXJldHVybiA7IC8vLUVOT0RFVjsKLQkJfQotCSNlbmRpZgotCQkjaWYgMAotCQlpZigoR1BJT19udW0gIT0gRElTQUJMRV9HUElPX05VTSkgJiYKLQkJCSgoY3VycmRyaXZlcnN0YXRlICE9IEZXX0RPV05MT0FEKSAmJgotCQkJKGN1cnJkcml2ZXJzdGF0ZSAhPSBOT1JNQUxfT1BFUkFUSU9OKSAmJgotCQkJKGN1cnJkcml2ZXJzdGF0ZSAhPSBJRExFTU9ERV9FWElUKSkpCi0JCQlUVVJOX09GRl9MRUQoMTw8R1BJT19udW0sIHVpTGVkSW5kZXgpOwotCQkjZW5kaWYKIAogCQlpZihHUElPX251bSAhPSBESVNBQkxFX0dQSU9fTlVNKQogCQl7CkBAIC03NTIsMTAgKzY3OCw2IEBACiAJCQljYXNlIERSSVZFUl9JTklUOgogCQkJewogCQkJCWN1cnJkcml2ZXJzdGF0ZSA9IERSSVZFUl9JTklUOy8vQWRhcHRlci0+RHJpdmVyU3RhdGU7Ci0JI2lmIDAKLQkJCQlMZWRHcGlvSW5pdChBZGFwdGVyKTsKLQkJCQlBZGFwdGVyLT5MRURJbmZvLmJMZWRJbml0RG9uZSA9IFRSVUU7Ci0JI2VuZGlmCiAJCQkJQmNtR2V0R1BJT1BpbkluZm8oQWRhcHRlciwgJkdQSU9fbnVtLCAmZHVtbXlHUElPTnVtLCAmdWlMZWRJbmRleCwgJmR1bW15SW5kZXgsIGN1cnJkcml2ZXJzdGF0ZSk7CiAKIAkJCQlpZihHUElPX251bSAgIT0gRElTQUJMRV9HUElPX05VTSkKQEAgLTc2OCwxMyArNjkwLDYgQEAKIAkJCXsKIAkJCQkvL0JDTV9ERUJVR19QUklOVCAoQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIExFRF9EVU1QX0lORk8sIERCR19MVkxfQUxMLCJMRUQgVGhyZWFkOiBGV19ETl9ET05FIGNhbGxlZFxuIik7CiAJCQkJY3VycmRyaXZlcnN0YXRlID0gRldfRE9XTkxPQUQ7Ci0JCQkjaWYgMAotCQkJCWlmKEFkYXB0ZXItPkxFREluZm8uYkxlZEluaXREb25lID09IEZBTFNFKQotCQkJCXsKLQkJCQkJTGVkR3Bpb0luaXQoQWRhcHRlcik7Ci0JCQkJCUFkYXB0ZXItPkxFREluZm8uYkxlZEluaXREb25lID0gVFJVRTsKLQkJCQl9Ci0JCQkjZW5kaWYKIAkJCQlCY21HZXRHUElPUGluSW5mbyhBZGFwdGVyLCAmR1BJT19udW0sICZkdW1teUdQSU9OdW0sICAmdWlMZWRJbmRleCwgJmR1bW15SW5kZXgsIGN1cnJkcml2ZXJzdGF0ZSk7CiAKIAkJCQlpZihHUElPX251bSAhPSBESVNBQkxFX0dQSU9fTlVNKQpAQCAtNzk2LDEyICs3MTEsNiBAQAogCQkJYnJlYWs7CiAKIAkJCWNhc2UgU0hVVERPV05fRVhJVDoKLQkJCSNpZiAwCi0JCQlpZihBZGFwdGVyLT51bFBvd2VyU2F2ZU1vZGUgPT0gREVWSUNFX1BPV0VSU0FWRV9NT0RFX0FTX1BNVV9TSFVURE9XTikKLQkJCXsKLQkJCQlMZWRHcGlvSW5pdChBZGFwdGVyKTsKLQkJCX0KLQkJCSNlbmRpZgogCQkJLy9ubyBicmVhaywgY29udGludWUgdG8gTk9fTkVUV09SS19FTlRSWSBzdGF0ZSBhcyB3ZWxsLgogCiAJCQljYXNlIE5PX05FVFdPUktfRU5UUlk6CkBAIC04NzUsMzQgKzc4NCw2IEBACiAJCQlicmVhazsKIAkJCWNhc2UgSURMRU1PREVfRVhJVDoKIAkJCXsKLSNpZiAwCi0JCQkJVUNIQVIgR1BJT19udW1fdHggPSBESVNBQkxFX0dQSU9fTlVNOwotCQkJCVVDSEFSIEdQSU9fbnVtX3J4ID0gRElTQUJMRV9HUElPX05VTTsKLQkJCQlVQ0hBUiB1aVR4TGVkSW5kZXggPSAwOwotCQkJCVVDSEFSIHVpUnhMZWRJbmRleCA9IDA7Ci0KLQkJCQljdXJyZHJpdmVyc3RhdGUgID0gSURMRU1PREVfRVhJVDsKLQkJCQlpZihERVZJQ0VfUE9XRVJTQVZFX01PREVfQVNfUE1VX1NIVVRET1dOID09IEFkYXB0ZXItPnVsUG93ZXJTYXZlTW9kZSkKLQkJCQl7Ci0JCQkJCUxlZEdwaW9Jbml0KEFkYXB0ZXIpOwotCQkJCX0KLQkJCQlCY21HZXRHUElPUGluSW5mbyhBZGFwdGVyLCAmR1BJT19udW1fdHgsICZHUElPX251bV9yeCwgJnVpVHhMZWRJbmRleCwmdWlSeExlZEluZGV4LGN1cnJkcml2ZXJzdGF0ZSk7Ci0KLQkJCQlBZGFwdGVyLT5MRURJbmZvLmJJZGxlX2xlZF9vZmYgPSAgRkFMU0U7Ci0KLQkJCQlpZigoR1BJT19udW1fdHggPT0gRElTQUJMRV9HUElPX05VTSkgJiYgKEdQSU9fbnVtX3J4ID09IERJU0FCTEVfR1BJT19OVU0pKQotCQkJCXsKLQkJCQkJR1BJT19udW0gPSBESVNBQkxFX0dQSU9fTlVNIDsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJdGltZW91dCA9IDUwOwotCQkJCQlpZihBZGFwdGVyLT5MRURJbmZvLmJJZGxlTW9kZV90eF9mcm9tX2hvc3QpCi0JCQkJCQlMRURfQmxpbmsoQWRhcHRlciwgMTw8R1BJT19udW1fdHgsIHVpVHhMZWRJbmRleCwgdGltZW91dCwgLTEsY3VycmRyaXZlcnN0YXRlKTsKLQkJCQkJZWxzZQotCQkJCQkJTEVEX0JsaW5rKEFkYXB0ZXIsIDE8PEdQSU9fbnVtX3J4LCB1aVJ4TGVkSW5kZXgsIHRpbWVvdXQsIC0xLGN1cnJkcml2ZXJzdGF0ZSk7Ci0JCQkJfQotI2VuZGlmCiAJCQl9CiAJCQlicmVhazsKIAkJCWNhc2UgRFJJVkVSX0hBTFQ6CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmNtL252bS5jIGIvZHJpdmVycy9zdGFnaW5nL2JjbS9udm0uYwppbmRleCA0MWM5YWI4Li5jNzI5MjM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYmNtL252bS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9iY20vbnZtLmMKQEAgLTEsNiArMSw1NiBAQAogI2luY2x1ZGUgImhlYWRlcnMuaCIKIAogI2RlZmluZSBEV09SRCB1bnNpZ25lZCBpbnQKKworc3RhdGljIElOVCBCY21Eb0NoaXBTZWxlY3QoUE1JTklfQURBUFRFUiBBZGFwdGVyLCBVSU5UIG9mZnNldCk7CitzdGF0aWMgSU5UIEJjbUdldEFjdGl2ZURTRChQTUlOSV9BREFQVEVSIEFkYXB0ZXIpOworc3RhdGljIElOVCBCY21HZXRBY3RpdmVJU08oUE1JTklfQURBUFRFUiBBZGFwdGVyKTsKK3N0YXRpYyBVSU5UIEJjbUdldEVFUFJPTVNpemUoUE1JTklfQURBUFRFUiBBZGFwdGVyKTsKK3N0YXRpYyBJTlQgQmNtR2V0Rmxhc2hDU0luZm8oUE1JTklfQURBUFRFUiBBZGFwdGVyKTsKK3N0YXRpYyBVSU5UIEJjbUdldEZsYXNoU2VjdG9yU2l6ZShQTUlOSV9BREFQVEVSIEFkYXB0ZXIsIFVJTlQgRmxhc2hTZWN0b3JTaXplU2lnLCBVSU5UIEZsYXNoU2VjdG9yU2l6ZSk7CisKK3N0YXRpYyBWT0lEIEJjbVZhbGlkYXRlTnZtVHlwZShQTUlOSV9BREFQVEVSIEFkYXB0ZXIpOworc3RhdGljIElOVCBCY21HZXROdm1TaXplKFBNSU5JX0FEQVBURVIgQWRhcHRlcik7CitzdGF0aWMgVUlOVCBCY21HZXRGbGFzaFNpemUoUE1JTklfQURBUFRFUiBBZGFwdGVyKTsKK3N0YXRpYyBOVk1fVFlQRSBCY21HZXROdm1UeXBlKFBNSU5JX0FEQVBURVIgQWRhcHRlcik7CisKK3N0YXRpYyBJTlQgQmNtR2V0U2VjdGlvblZhbEVuZE9mZnNldChQTUlOSV9BREFQVEVSIEFkYXB0ZXIsIEZMQVNIMlhfU0VDVElPTl9WQUwgZUZsYXNoMnhTZWN0aW9uVmFsKTsKKworc3RhdGljIEJfVUlOVDggSXNPZmZzZXRXcml0YWJsZShQTUlOSV9BREFQVEVSIEFkYXB0ZXIsIFVJTlQgdWlPZmZzZXQpOworc3RhdGljIElOVCBJc1NlY3Rpb25Xcml0YWJsZShQTUlOSV9BREFQVEVSIEFkYXB0ZXIsIEZMQVNIMlhfU0VDVElPTl9WQUwgU2VjdGlvbik7CitzdGF0aWMgSU5UIElzU2VjdGlvbkV4aXN0SW5WZW5kb3JJbmZvKFBNSU5JX0FEQVBURVIgQWRhcHRlciwgRkxBU0gyWF9TRUNUSU9OX1ZBTCBzZWN0aW9uKTsKKworc3RhdGljIElOVCBSZWFkRFNEUHJpb3JpdHkoUE1JTklfQURBUFRFUiBBZGFwdGVyLCBGTEFTSDJYX1NFQ1RJT05fVkFMIGRzZCk7CitzdGF0aWMgSU5UIFJlYWREU0RTaWduYXR1cmUoUE1JTklfQURBUFRFUiBBZGFwdGVyLCBGTEFTSDJYX1NFQ1RJT05fVkFMIGRzZCk7CitzdGF0aWMgSU5UIFJlYWRJU09Qcmlvcml0eShQTUlOSV9BREFQVEVSIEFkYXB0ZXIsIEZMQVNIMlhfU0VDVElPTl9WQUwgaXNvKTsKK3N0YXRpYyBJTlQgUmVhZElTT1NpZ25hdHVyZShQTUlOSV9BREFQVEVSIEFkYXB0ZXIsIEZMQVNIMlhfU0VDVElPTl9WQUwgaXNvKTsKKworc3RhdGljIElOVCBDb3JydXB0RFNEU2lnKFBNSU5JX0FEQVBURVIgQWRhcHRlciwgRkxBU0gyWF9TRUNUSU9OX1ZBTCBlRmxhc2gyeFNlY3Rpb25WYWwpOworc3RhdGljIElOVCBDb3JydXB0SVNPU2lnKFBNSU5JX0FEQVBURVIgQWRhcHRlciwgRkxBU0gyWF9TRUNUSU9OX1ZBTCBlRmxhc2gyeFNlY3Rpb25WYWwpOworc3RhdGljIElOVCBTYXZlSGVhZGVySWZQcmVzZW50KFBNSU5JX0FEQVBURVIgQWRhcHRlciwgUFVDSEFSIHBCdWZmLCBVSU5UIHVpU2VjdEFsaWduQWRkcik7CitzdGF0aWMgSU5UIFdyaXRlVG9GbGFzaFdpdGhvdXRTZWN0b3JFcmFzZShQTUlOSV9BREFQVEVSIEFkYXB0ZXIsIFBVSU5UIHBCdWZmLAorCQkJCQkgIEZMQVNIMlhfU0VDVElPTl9WQUwgZUZsYXNoMnhTZWN0aW9uVmFsLAorCQkJCQkgIFVJTlQgdWlPZmZzZXQsIFVJTlQgdWlOdW1CeXRlcyk7CitzdGF0aWMgRkxBU0gyWF9TRUNUSU9OX1ZBTCBnZXRIaWdoZXN0UHJpRFNEKFBNSU5JX0FEQVBURVIgQWRhcHRlcik7CitzdGF0aWMgRkxBU0gyWF9TRUNUSU9OX1ZBTCBnZXRIaWdoZXN0UHJpSVNPKFBNSU5JX0FEQVBURVIgQWRhcHRlcik7CisKK3N0YXRpYyBJTlQgQmVjZWVtRmxhc2hCdWxrUmVhZCgKKwlQTUlOSV9BREFQVEVSIEFkYXB0ZXIsCisJUFVJTlQgcEJ1ZmZlciwKKwlVSU5UIHVpT2Zmc2V0LAorCVVJTlQgdWlOdW1CeXRlcyk7CisKK3N0YXRpYyBJTlQgQmVjZWVtRmxhc2hCdWxrV3JpdGUoCisJUE1JTklfQURBUFRFUiBBZGFwdGVyLAorCVBVSU5UIHBCdWZmZXIsCisJVUlOVCB1aU9mZnNldCwKKwlVSU5UIHVpTnVtQnl0ZXMsCisJQk9PTEVBTiBiVmVyaWZ5KTsKKworc3RhdGljIElOVCBHZXRGbGFzaEJhc2VBZGRyKFBNSU5JX0FEQVBURVIgQWRhcHRlcik7CisKK3N0YXRpYyBJTlQgUmVhZEJlY2VlbUVFUFJPTUJ1bGsoUE1JTklfQURBUFRFUiBBZGFwdGVyLFVJTlQgZHdBZGRyZXNzLCBVSU5UICpwZHdEYXRhLCBVSU5UIGR3TnVtRGF0YSk7CisKIC8vIFByb2NlZHVyZToJUmVhZEVFUFJPTVN0YXR1c1JlZ2lzdGVyCiAvLwogLy8gRGVzY3JpcHRpb246IFJlYWRzIHRoZSBzdGFuZGFyZCBFRVBST00gU3RhdHVzIFJlZ2lzdGVyLgpAQCAtMjI4LDIxMyArMjc4LDI3IEBACiAJCVJlYWRCZWNlZW1FRVBST01CdWxrKEFkYXB0ZXIsIHVpVGVtcE9mZnNldCArIE1BWF9SV19TSVpFLCAoUFVJTlQpJnVpRGF0YVs0XSwgNCk7CiAJfQogCi0JT3NhbE1lbU1vdmUoIChQVUNIQVIpIHBCdWZmZXIsICggKChQVUNIQVIpJnVpRGF0YVswXSkgKyB1aUJ5dGVPZmZzZXQgKSwgNCk7CisJbWVtY3B5KCAoUFVDSEFSKSBwQnVmZmVyLCAoICgoUFVDSEFSKSZ1aURhdGFbMF0pICsgdWlCeXRlT2Zmc2V0ICksIDQpOwogCiAJcmV0dXJuIFNUQVRVU19TVUNDRVNTOwogfSAvKiBSZWFkQmVjZWVtRUVQUk9NKCkgKi8KIAogCi0jaWYgMAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gUHJvY2VkdXJlOglJc0VFUFJPTVdyaXRlRG9uZQotLy8KLS8vIERlc2NyaXB0aW9uOiBSZWFkcyB0aGUgU1BJIHN0YXR1cyB0byBzZWUgdGhlIHN0YXR1cyBvZiBwcmV2aW91cyB3cml0ZS4KLS8vCi0vLyBBcmd1bWVudHM6Ci0vLwkJQWRhcHRlciAgICAtIHB0ciB0byBBZGFwdGVyIG9iamVjdCBpbnN0YW5jZQotLy8KLS8vIFJldHVybnM6Ci0vLwkJQk9PTEVBTiAtIFRSVUUgIC0gd3JpdGUgd2VudCB0aHJvdWdoCi0vLyAgICAgICAgICAgICAgLSBGQUxTRSAtIFdyaXRlIEZhaWxlZC4KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotQk9PTEVBTiBJc0VFUFJPTVdyaXRlRG9uZShQTUlOSV9BREFQVEVSIEFkYXB0ZXIpCi17Ci0JVUlOVCB1aVJldHJpZXMgPSAxNjsKLQkvL1VJTlQgdWlTdGF0dXMgID0gMDsKLQlVSU5UIHZhbHVlOwotCi0JLy9zbGVlcCBmb3IgMS4ybXMgLi53b3JzdCBjYXNlIEVFUFJPTSB3cml0ZSBjYW4gdGFrZSB1cCB0byAxLjJtcy4KLQltZGVsYXkoMik7Ci0KLQl2YWx1ZSA9IDA7Ci0JcmRtYWx0KEFkYXB0ZXIsIEVFUFJPTV9TUElfUV9TVEFUVVMxX1JFRywgJnZhbHVlLCBzaXplb2YodmFsdWUpKTsKLQotCXdoaWxlKCgodmFsdWUgPj4gMTQpICYgMSkgPT0gMSkKLQl7Ci0JCS8vIEVFUFJPTV9TUElfUV9TVEFUVVMxX1JFRyB3aWxsIGJlIGNsZWFyZWQgb25seSBpZiB3cml0ZSBiYWNrIHRvIHRoYXQuCi0JCXZhbHVlID0gKDB4MSA8PCAxNCk7Ci0JCXdybWFsdChBZGFwdGVyLCBFRVBST01fU1BJX1FfU1RBVFVTMV9SRUcsJnZhbHVlLCBzaXplb2YodmFsdWUpKTsKLQkJdWRlbGF5KDEwMDApOwotCQl1aVJldHJpZXMtLTsKLQkJaWYodWlSZXRyaWVzID09IDApCi0JCXsKLQkJCXJldHVybiBGQUxTRTsKLQkJfQotCQl2YWx1ZSA9IDA7Ci0JCXJkbWFsdChBZGFwdGVyLCBFRVBST01fU1BJX1FfU1RBVFVTMV9SRUcsICZ2YWx1ZSwgc2l6ZW9mKHZhbHVlKSk7Ci0JfQotCXJldHVybiBUUlVFOwotCi0KLX0KLQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBQcm9jZWR1cmU6CVJlYWRCZWNlZW1FRVBST01CdWxrCi0vLwotLy8gRGVzY3JpcHRpb246IFRoaXMgcm91dGluZSByZWFkcyAxNkJ5dGUgZGF0YSBmcm9tIEVFUFJPTQotLy8KLS8vIEFyZ3VtZW50czoKLS8vCQlBZGFwdGVyICAgICAtIHB0ciB0byBBZGFwdGVyIG9iamVjdCBpbnN0YW5jZQotLy8gICAgICAgICAgZHdBZGRyZXNzIC0gRUVQUk9NIE9mZnNldCB0byByZWFkIHRoZSBkYXRhIGZyb20uCi0vLyAgICAgICAgICBwZHdEYXRhICAgIC0gUG9pbnRlciB0byBkb3VibGUgd29yZCB3aGVyZSBkYXRhIG5lZWRzIHRvIGJlIHN0b3JlZCBpbi4KLS8vCi0vLyBSZXR1cm5zOgotLy8JCU9TQUxfU1RBVFVTX0NPREU6Ci0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUlOVCBSZWFkQmVjZWVtRUVQUk9NQnVsayhQTUlOSV9BREFQVEVSIEFkYXB0ZXIsRFdPUkQgZHdBZGRyZXNzLCBEV09SRCAqcGR3RGF0YSkKLXsKLQlEV09SRCBkd1JldHJpZXMgPSAxNjsKLQlEV09SRCBkd0luZGV4ID0gMDsKLQlVSU5UIHZhbHVlLCB0bXBWYWw7Ci0KLQotCXZhbHVlID0gMDsKLQlyZG1hbHQgKEFkYXB0ZXIsIDB4MGYwMDMwMDgsICZ2YWx1ZSwgc2l6ZW9mKHZhbHVlKSk7Ci0KLQkvL3JlYWQgMHgwZjAwMzAyMCB1bnRpbGwgIGJpdCAxIG9mIDB4MGYwMDMwMDggaXMgc2V0LgotCXdoaWxlKCgodmFsdWUgPj4gMSkgJiAxKSA9PSAwKQotCXsKLQotCQlyZG1hbHQgKEFkYXB0ZXIsIDB4MGYwMDMwMjAsICZ0bXBWYWwsIHNpemVvZih0bXBWYWwpKTsKLQkJZHdSZXRyaWVzLS07Ci0JCWlmKGR3UmV0cmllcyA9PSAwKQotCQl7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJdmFsdWUgPSAwOwotCQlyZG1hbHQgKEFkYXB0ZXIsIDB4MGYwMDMwMDgsICZ2YWx1ZSwgc2l6ZW9mKHZhbHVlKSk7Ci0JfQotCi0JdmFsdWUgPSBkd0FkZHJlc3MgfCAweGZiMDAwMDAwOwotCXdybWFsdCAoQWRhcHRlciwgMHgwZjAwMzAxOCwgJnZhbHVlLCBzaXplb2YodmFsdWUpKTsKLQotCXVkZWxheSgxMDAwKTsKLQl2YWx1ZSA9IDA7Ci0JZm9yKGR3SW5kZXggPSAwO2R3SW5kZXggPCA0IDsgZHdJbmRleCsrKQotCXsKLQkJdmFsdWUgPSAwOwotCQlyZG1hbHQgKEFkYXB0ZXIsIDB4MGYwMDMwMjAsICZ2YWx1ZSwgc2l6ZW9mKHZhbHVlKSk7Ci0JCXBkd0RhdGFbZHdJbmRleF0gPSB2YWx1ZTsKLQotCQl2YWx1ZSA9IDA7Ci0JCXJkbWFsdCAoQWRhcHRlciwgMHgwZjAwMzAyMCwgJnZhbHVlLCBzaXplb2YodmFsdWUpKTsKLQkJcGR3RGF0YVtkd0luZGV4XSB8PSAodmFsdWUgPDwgOCk7Ci0KLQkJdmFsdWUgPSAwOwotCQlyZG1hbHQgKEFkYXB0ZXIsIDB4MGYwMDMwMjAsICZ2YWx1ZSwgc2l6ZW9mKHZhbHVlKSk7Ci0JCXBkd0RhdGFbZHdJbmRleF0gfD0gKHZhbHVlIDw8IDE2KTsKLQotCQl2YWx1ZSA9IDA7Ci0JCXJkbWFsdCAoQWRhcHRlciwgMHgwZjAwMzAyMCwgJnZhbHVlLCBzaXplb2YodmFsdWUpKTsKLQkJcGR3RGF0YVtkd0luZGV4XSB8PSAodmFsdWUgPDwgMjQpOwotCi0JfQotCXJldHVybiAwOwotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBQcm9jZWR1cmU6CVJlYWRCZWNlZW1FRVBST00KLS8vCi0vLyBEZXNjcmlwdGlvbjogVGhpcyByb3V0aW5lIHJlYWRzIDRCeXRlIGRhdGEgZnJvbSBFRVBST00KLS8vCi0vLyBBcmd1bWVudHM6Ci0vLwkJQWRhcHRlciAgICAgLSBwdHIgdG8gQWRhcHRlciBvYmplY3QgaW5zdGFuY2UKLS8vICAgICAgICAgIGR3QWRkcmVzcyAtIEVFUFJPTSBPZmZzZXQgdG8gcmVhZCB0aGUgZGF0YSBmcm9tLgotLy8gICAgICAgICAgcGR3RGF0YSAgICAtIFBvaW50ZXIgdG8gZG91YmxlIHdvcmQgd2hlcmUgZGF0YSBuZWVkcyB0byBiZSBzdG9yZWQgaW4uCi0vLwotLy8gUmV0dXJuczoKLS8vCQlPU0FMX1NUQVRVU19DT0RFOgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1JTlQgUmVhZEJlY2VlbUVFUFJPTShQTUlOSV9BREFQVEVSIEFkYXB0ZXIsRFdPUkQgZHdBZGRyZXNzLCBEV09SRCAqcGR3RGF0YSkKLXsKLQotCURXT1JEIGR3UmVhZFZhbHVlID0gMDsKLQlEV09SRCBkd1JldHJpZXMgPSAxNiwgZHdDb21wbGV0ZVdvcmQgPSAwOwotCVVJTlQJdmFsdWUsIHRtcFZhbDsKLQotCXJkbWFsdChBZGFwdGVyLCAweDBmMDAzMDA4LCAmdmFsdWUsIHNpemVvZih2YWx1ZSkpOwotCXdoaWxlICgoKHZhbHVlID4+IDEpICYgMSkgPT0gMCkgewotCQlyZG1hbHQoQWRhcHRlciwgMHgwZjAwMzAyMCwgJnRtcFZhbCwgc2l6ZW9mKHRtcFZhbCkpOwotCi0JCWlmIChkd1JldHJpZXMgPT0gMCkgewotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCXJkbWFsdChBZGFwdGVyLCAweDBmMDAzMDA4LCAmdmFsdWUsIHNpemVvZih2YWx1ZSkpOwotCX0KLQotCi0JLy93cm0gKDB4MGYwMDMwMTgsIDB4TmJYWFhYWFgpICAgICAgLy8gTiBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHUgd2FudCB0byByZWFkICAoMCBtZWFucyAxLCBmIG1lYW5zIDE2LCAgIGIgaXMgdGhlIG9wY29kZSBmb3IgcGFnZSByZWFkKQotCS8vICAgICBGb2xsb3cgaXQgdXAgYnkgTiBleGVjdXRpb25zIG9mICByZG0oMHgwZjAwMzAyMCkgdG8gcmVhZCB0aGUgcnhlZCBieXRlcyBmcm9tIHJ4IHF1ZXVlLgotCWR3QWRkcmVzcyB8PSAweDNiMDAwMDAwOwotCXdybWFsdChBZGFwdGVyLCAweDBmMDAzMDE4LCZkd0FkZHJlc3MsNCk7Ci0JbWRlbGF5KDEwKTsKLQlyZG1hbHQoQWRhcHRlciwgMHgwZjAwMzAyMCwmZHdSZWFkVmFsdWUsNCk7Ci0JZHdDb21wbGV0ZVdvcmQ9ZHdSZWFkVmFsdWU7Ci0JcmRtYWx0KEFkYXB0ZXIsIDB4MGYwMDMwMjAsJmR3UmVhZFZhbHVlLDQpOwotCWR3Q29tcGxldGVXb3JkfD0oZHdSZWFkVmFsdWU8PDgpOwotCXJkbWFsdChBZGFwdGVyLCAweDBmMDAzMDIwLCZkd1JlYWRWYWx1ZSw0KTsKLQlkd0NvbXBsZXRlV29yZHw9KGR3UmVhZFZhbHVlPDwxNik7Ci0JcmRtYWx0KEFkYXB0ZXIsIDB4MGYwMDMwMjAsJmR3UmVhZFZhbHVlLDQpOwotCWR3Q29tcGxldGVXb3JkfD0oZHdSZWFkVmFsdWU8PDI0KTsKLQotCSpwZHdEYXRhID0gZHdDb21wbGV0ZVdvcmQ7Ci0KLQlyZXR1cm4gMDsKLX0KLSNlbmRpZgogCiBJTlQgUmVhZE1hY0FkZHJlc3NGcm9tTlZNKFBNSU5JX0FEQVBURVIgQWRhcHRlcikKIHsKLQlJTlQgU3RhdHVzPTAsIGk7Ci0JdW5zaWduZWQgY2hhciBwdU1hY0FkZHJbNl0gPSB7MH07Ci0JSU5UIEFsbFplcm9NYWMgPSAwOwotCUlOVCBBbGxGRk1hYyA9IDA7CisJSU5UIFN0YXR1czsKKwl1bnNpZ25lZCBjaGFyIHB1TWFjQWRkcls2XTsKIAogCVN0YXR1cyA9IEJlY2VlbU5WTVJlYWQoQWRhcHRlciwKIAkJCShQVUlOVCkmcHVNYWNBZGRyWzBdLAogCQkJSU5JVF9QQVJBTVNfMV9NQUNBRERSRVNTX0FERFJFU1MsCiAJCQlNQUNfQUREUkVTU19TSVpFKTsKIAotCWlmKFN0YXR1cyAhPSBTVEFUVVNfU1VDQ0VTUykKLQl7Ci0JCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwiRXJyb3IgaW4gUmVhZGluZyB0aGUgbWFjIEFkZHJlcyB3aXRoIHN0YXR1cyA6JWQiLCBTdGF0dXMpOwotCQlyZXR1cm4gU3RhdHVzOwotCX0KLQotCW1lbWNweShBZGFwdGVyLT5kZXYtPmRldl9hZGRyLCBwdU1hY0FkZHIsIE1BQ19BRERSRVNTX1NJWkUpOwotCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX09USEVSUywgTlZNX1JXLCBEQkdfTFZMX0FMTCwiTW9kZW0gTUFDIEFkZHIgOiIpOwotICAgIEJDTV9ERUJVR19QUklOVF9CVUZGRVIoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIERCR19MVkxfQUxMLCZBZGFwdGVyLT5kZXYtPmRldl9hZGRyWzBdLE1BQ19BRERSRVNTX1NJWkUpOwotCWZvcihpPTA7aTxNQUNfQUREUkVTU19TSVpFO2krKykKLQl7Ci0KLQkJaWYoQWRhcHRlci0+ZGV2LT5kZXZfYWRkcltpXSA9PSAweDAwKQotCQkJQWxsWmVyb01hYysrOwotCQlpZihBZGFwdGVyLT5kZXYtPmRldl9hZGRyW2ldID09IDB4RkYpCi0JCQlBbGxGRk1hYysrOwotCi0JfQotCS8vQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiXG4iKTsKLQlpZihBbGxaZXJvTWFjID09IE1BQ19BRERSRVNTX1NJWkUpCi0JCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX09USEVSUywgTlZNX1JXLCBEQkdfTFZMX0FMTCwiV2FybmluZyA6OiBNQUMgQWRkcmVzcyBoYXMgYWxsIDAwJ3MiKTsKLQlpZihBbGxGRk1hYyA9PSBNQUNfQUREUkVTU19TSVpFKQotCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIE5WTV9SVywgREJHX0xWTF9BTEwsIldhcm5pbmcgOjogTUFDIEFkZHJlc3MgaGFzIGFsbCBGRidzIik7CisJaWYoU3RhdHVzID09IFNUQVRVU19TVUNDRVNTKQorCQltZW1jcHkoQWRhcHRlci0+ZGV2LT5kZXZfYWRkciwgcHVNYWNBZGRyLCBNQUNfQUREUkVTU19TSVpFKTsKIAogCXJldHVybiBTdGF0dXM7Ci0KIH0KIAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtNDc2LDcgKzM0MCw3IEBACiAJCVJlYWRCZWNlZW1FRVBST01CdWxrKEFkYXB0ZXIsdWlUZW1wT2Zmc2V0LChQVUlOVCkmdWlEYXRhWzBdLDQpOwogCQlpZih1aUJ5dGVzUmVtYWluaW5nID49IChNQVhfUldfU0laRSAtIHVpRXh0cmFCeXRlcykpCiAJCXsKLQkJCU9zYWxNZW1Nb3ZlKHBCdWZmZXIsKCgoUFVDSEFSKSZ1aURhdGFbMF0pK3VpRXh0cmFCeXRlcyksTUFYX1JXX1NJWkUgLSB1aUV4dHJhQnl0ZXMpOworCQkJbWVtY3B5KHBCdWZmZXIsKCgoUFVDSEFSKSZ1aURhdGFbMF0pK3VpRXh0cmFCeXRlcyksTUFYX1JXX1NJWkUgLSB1aUV4dHJhQnl0ZXMpOwogCiAJCQl1aUJ5dGVzUmVtYWluaW5nIC09IChNQVhfUldfU0laRSAtIHVpRXh0cmFCeXRlcyk7CiAJCQl1aUluZGV4ICs9IChNQVhfUldfU0laRSAtIHVpRXh0cmFCeXRlcyk7CkBAIC00ODQsNyArMzQ4LDcgQEAKIAkJfQogCQllbHNlCiAJCXsKLQkJCU9zYWxNZW1Nb3ZlKHBCdWZmZXIsKCgoUFVDSEFSKSZ1aURhdGFbMF0pK3VpRXh0cmFCeXRlcyksdWlCeXRlc1JlbWFpbmluZyk7CisJCQltZW1jcHkocEJ1ZmZlciwoKChQVUNIQVIpJnVpRGF0YVswXSkrdWlFeHRyYUJ5dGVzKSx1aUJ5dGVzUmVtYWluaW5nKTsKIAkJCXVpSW5kZXggKz0gdWlCeXRlc1JlbWFpbmluZzsKIAkJCXVpT2Zmc2V0ICs9IHVpQnl0ZXNSZW1haW5pbmc7CiAJCQl1aUJ5dGVzUmVtYWluaW5nID0gMDsKQEAgLTUwOCw3ICszNzIsNyBAQAogCQkJICogV2UgcmVhZCA0IER3b3JkcyBvZiBkYXRhICovCiAJCQlpZigwID09IFJlYWRCZWNlZW1FRVBST01CdWxrKEFkYXB0ZXIsdWlPZmZzZXQsJnVpRGF0YVswXSw0KSkKIAkJCXsKLQkJCQlPc2FsTWVtTW92ZShwY0J1ZmYrdWlJbmRleCwmdWlEYXRhWzBdLE1BWF9SV19TSVpFKTsKKwkJCQltZW1jcHkocGNCdWZmK3VpSW5kZXgsJnVpRGF0YVswXSxNQVhfUldfU0laRSk7CiAJCQkJdWlPZmZzZXQgKz0gTUFYX1JXX1NJWkU7CiAJCQkJdWlCeXRlc1JlbWFpbmluZyAtPSBNQVhfUldfU0laRTsKIAkJCQl1aUluZGV4ICs9IE1BWF9SV19TSVpFOwpAQCAtNTIzLDcgKzM4Nyw3IEBACiAJCXsKIAkJCWlmKDAgPT0gUmVhZEJlY2VlbUVFUFJPTShBZGFwdGVyLHVpT2Zmc2V0LCZ1aURhdGFbMF0pKQogCQkJewotCQkJCU9zYWxNZW1Nb3ZlKHBjQnVmZit1aUluZGV4LCZ1aURhdGFbMF0sNCk7CisJCQkJbWVtY3B5KHBjQnVmZit1aUluZGV4LCZ1aURhdGFbMF0sNCk7CiAJCQkJdWlPZmZzZXQgKz0gNDsKIAkJCQl1aUJ5dGVzUmVtYWluaW5nIC09IDQ7CiAJCQkJdWlJbmRleCArPTQ7CkBAIC01NDAsNyArNDA0LDcgQEAKIAkJCXBDaGFyQnVmZiArPSB1aUluZGV4OwogCQkJaWYoMCA9PSBSZWFkQmVjZWVtRUVQUk9NKEFkYXB0ZXIsdWlPZmZzZXQsJnVpRGF0YVswXSkpCiAJCQl7Ci0JCQkJT3NhbE1lbU1vdmUocENoYXJCdWZmLCZ1aURhdGFbMF0sdWlCeXRlc1JlbWFpbmluZyk7Ly9jb3B5IG9ubHkgYnl0ZXMgcmVxdWVzdGVkLgorCQkJCW1lbWNweShwQ2hhckJ1ZmYsJnVpRGF0YVswXSx1aUJ5dGVzUmVtYWluaW5nKTsvL2NvcHkgb25seSBieXRlcyByZXF1ZXN0ZWQuCiAJCQkJdWlCeXRlc1JlbWFpbmluZyA9IDA7CiAJCQl9CiAJCQllbHNlCkBAIC01NzEsNyArNDM1LDcgQEAKIC8vCQk8RkFJTFVSRT4JCQktIGlmIGZhaWxlZC4KIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotSU5UIEJlY2VlbUZsYXNoQnVsa1JlYWQoCitzdGF0aWMgSU5UIEJlY2VlbUZsYXNoQnVsa1JlYWQoCiAJUE1JTklfQURBUFRFUiBBZGFwdGVyLAogCVBVSU5UIHBCdWZmZXIsCiAJVUlOVCB1aU9mZnNldCwKQEAgLTY1MywxNiArNTE3LDggQEAKIC8vCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLVVJTlQgQmNtR2V0Rmxhc2hTaXplKFBNSU5JX0FEQVBURVIgQWRhcHRlcikKK3N0YXRpYyBVSU5UIEJjbUdldEZsYXNoU2l6ZShQTUlOSV9BREFQVEVSIEFkYXB0ZXIpCiB7Ci0jaWYgMAotCWlmKEFkYXB0ZXItPmJERFJJbml0RG9uZSkKLQl7Ci0JCXJldHVybiByZG0oQWRhcHRlcixGTEFTSF9DT05USUdJT1VTX1NUQVJUX0FERFJfQUZURVJfSU5JVHxGTEFTSF9TSVpFX0FERFIpOwotCX0KLQotCXJldHVybiByZG0oQWRhcHRlcixGTEFTSF9DT05USUdJT1VTX1NUQVJUX0FERFJfQkVGT1JFX0lOSVR8RkxBU0hfU0laRV9BRERSKTsKLSNlbmRpZgogCWlmKElzRmxhc2gyeChBZGFwdGVyKSkKIAkJcmV0dXJuIAkoQWRhcHRlci0+cHNGbGFzaDJ4Q1NJbmZvLT5PZmZzZXRGcm9tRFNEU3RhcnRGb3JEU0RIZWFkZXIgKyBzaXplb2YoRFNEX0hFQURFUikpOwogCWVsc2UKQEAgLTY4NCw3ICs1NDAsNyBAQAogLy8KIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotVUlOVCBCY21HZXRFRVBST01TaXplKFBNSU5JX0FEQVBURVIgQWRhcHRlcikKK3N0YXRpYyBVSU5UIEJjbUdldEVFUFJPTVNpemUoUE1JTklfQURBUFRFUiBBZGFwdGVyKQogewogCVVJTlQgdWlEYXRhID0gMDsKIAlVSU5UIHVpSW5kZXggPSAwOwpAQCAtNzMzLDYwICs1ODksNiBAQAogCXJldHVybiAwOwogfQogCi0jaWYgMAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLy8KLS8vICBXcml0ZUJlY2VlbUVFUFJPTTogV3JpdGVzIDQgYnl0ZSBkYXRhIHRvIEVFUFJPTSBvZmZzZXQuCi0vLwotLy8gICAgICAgICAgICAgICAgICAgICB1aUVFUFJPTU9mZnNldCAtIE9mZnNldCB0byBiZSB3cml0dGVuIHRvLgotLy8gICAgICAgICAgICAgICAgICAgICB1aURhdGEgICAgICAgICAtIERhdGEgdG8gYmUgd3JpdHRlbi4KLS8vCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLUlOVCBXcml0ZUJlY2VlbUVFUFJPTShQTUlOSV9BREFQVEVSIEFkYXB0ZXIsVUlOVCB1aUVFUFJPTU9mZnNldCwgVUlOVCB1aURhdGEpCi17Ci0JSU5UIFN0YXR1cyA9IDA7Ci0JVUxPTkcgdWxSZEJrID0gMDsKLQlVTE9ORyB1bFJldHJ5Q291bnQgPSAzOwotCVVJTlQgdmFsdWU7Ci0KLQlpZih1aUVFUFJPTU9mZnNldCA+IEVFUFJPTV9FTkQpCi0JewotCi0JCXJldHVybiAtMTsKLQl9Ci0KLQl1aURhdGEgPSBodG9ubCh1aURhdGEpOwotCXdoaWxlKHVsUmV0cnlDb3VudC0tKQotCXsKLQkJdmFsdWUgPSAweDA2MDAwMDAwOwotCQl3cm1hbHQoQWRhcHRlciwgMHgwRjAwMzAxOCwmdmFsdWUsIHNpemVvZih2YWx1ZSkpOy8vZmx1c2ggdGhlIEVFUFJPTSBGSUZPLgotCQl3cm1hbHQoQWRhcHRlciwgMHgwRjAwMzAxQywmdWlEYXRhLCBzaXplb2YodWlEYXRhKSk7Ci0JCXZhbHVlID0gMHgzQTAwMDAwMCB8IHVpRUVQUk9NT2Zmc2V0OwotCQl3cm1hbHQoQWRhcHRlciwgMHgwRjAwMzAxOCwmdmFsdWUsIHNpemVvZih2YWx1ZSkpOwotCQlfX3VkZWxheSgxMDAwMDApOwotCQkvL3JlYWQgYmFjayBhbmQgdmVyaWZ5LgotCQlTdGF0dXMgPSBSZWFkQmVjZWVtRUVQUk9NKEFkYXB0ZXIsdWlFRVBST01PZmZzZXQsKFVJTlQgKikmdWxSZEJrKTsKLQkJaWYoU3RhdHVzID09IDApCi0JCXsKLQkJCWlmKHVsUmRCayA9PSB1aURhdGEpCi0JCQl7Ci0JCQkJcmV0dXJuIFN0YXR1czsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsICJXcml0ZUJlY2VlbUVFUFJPTTogUmVhZGJhY2sgZG9lcyBub3QgbWF0Y2hcbiIpOwotCQkJfQotCQl9Ci0JCWVsc2UKLQkJewotCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiV3JpdGVCZWNlZW1FRVBST006IFJlYWRiYWNrIGZhaWxlZFxuIik7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLSNlbmRpZgogCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLyBQcm9jZWR1cmU6CUZsYXNoU2VjdG9yRXJhc2UKQEAgLTk3Myw3ICs3NzUsNyBAQAogLy8gbmVlZCBub3Qgd3JpdGUgMHhGRkZGRkZGRiBiZWNhdXNlIHdyaXRlIHJlcXVpcmVzIGFuIGVyYXNlIGFuZCBlcmFzZSB3aWxsCiAvLyBtYWtlIHdob2xlIHNlY3RvciAweEZGRkZGRkZGLgogLy8KLQlpZiAoIU9zYWxNZW1Db21wYXJlKHBEYXRhLCB1aUVyYXNlUGF0dGVybiwgTUFYX1JXX1NJWkUpKQorCWlmICghbWVtY21wKHBEYXRhLCB1aUVyYXNlUGF0dGVybiwgTUFYX1JXX1NJWkUpKQogCXsKIAkJcmV0dXJuIDA7CiAJfQpAQCAtMTEzOCw3ICs5NDAsNyBAQAogLy8gbmVlZCBub3Qgd3JpdGUgMHhGRkZGRkZGRiBiZWNhdXNlIHdyaXRlIHJlcXVpcmVzIGFuIGVyYXNlIGFuZCBlcmFzZSB3aWxsCiAvLyBtYWtlIHdob2xlIHNlY3RvciAweEZGRkZGRkZGLgogLy8KLQlpZiAoIU9zYWxNZW1Db21wYXJlKHBEYXRhLHVpRXJhc2VQYXR0ZXJuLE1BWF9SV19TSVpFKSkKKwlpZiAoIW1lbWNtcChwRGF0YSx1aUVyYXNlUGF0dGVybixNQVhfUldfU0laRSkpCiAJewogCQlyZXR1cm4gMDsKIAl9CkBAIC0xMzMyLDcgKzExMzQsNyBAQAogLy8KIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotSU5UIEJlY2VlbUZsYXNoQnVsa1dyaXRlKAorc3RhdGljIElOVCBCZWNlZW1GbGFzaEJ1bGtXcml0ZSgKIAlQTUlOSV9BREFQVEVSIEFkYXB0ZXIsCiAJUFVJTlQgcEJ1ZmZlciwKIAlVSU5UIHVpT2Zmc2V0LApAQCAtMTM1MywxNSArMTE1NSw2IEBACiAJVUlOVCB1aVRlbXAgCQkJCT0gMDsKIAlVSU5UIGluZGV4IAkJCQkJPSAwOwogCVVJTlQgdWlQYXJ0T2Zmc2V0IAkJCT0gMDsKLQkjaWYgMAotCXN0cnVjdCB0aW1ldmFsIHR2MSA9IHswfTsKLQlzdHJ1Y3QgdGltZXZhbCB0djIgPSB7MH07Ci0KLQlzdHJ1Y3QgdGltZXZhbCB0ciA9IHswfTsKLQlzdHJ1Y3QgdGltZXZhbCB0ZSA9IHswfTsKLQlzdHJ1Y3QgdGltZXZhbCB0dyA9IHswfTsKLQlzdHJ1Y3QgdGltZXZhbCB0d3YgPSB7MH07Ci0JI2VuZGlmCiAKICNpZiBkZWZpbmVkKEJDTV9TSE1fSU5URVJGQUNFKSAmJiAhZGVmaW5lZChGTEFTSF9ESVJFQ1RfQUNDRVNTKQogICBTdGF0dXMgPSBiY21mbGFzaF9yYXdfd3JpdGUoKHVpT2Zmc2V0L0ZMQVNIX1BBUlRfU0laRSksKHVpT2Zmc2V0ICUgRkxBU0hfUEFSVF9TSVpFKSwoIHVuc2lnbmVkIGNoYXIgKilwQnVmZmVyLHVpTnVtQnl0ZXMpOwpAQCAtMTM3NywxMiArMTE3MCw5IEBACiAJdWlDdXJyU2VjdE9mZnNldEFkZHIJPSB1aU9mZnNldCAmIChBZGFwdGVyLT51aVNlY3RvclNpemUgLSAxKTsKIAl1aVNlY3RCb3VuZGFyeQkgIAkJPSB1aVNlY3RBbGlnbkFkZHIgKyBBZGFwdGVyLT51aVNlY3RvclNpemU7CiAKLQkvL3BUZW1wQnVmZiA9IE9zYWxNZW1BbGxvYyhNQVhfU0VDVE9SX1NJWkUsJyFNVk4nKTsKLQlwVGVtcEJ1ZmYgPSBPc2FsTWVtQWxsb2MoQWRhcHRlci0+dWlTZWN0b3JTaXplICwiIU1WTiIpOworCXBUZW1wQnVmZiA9IGttYWxsb2MoQWRhcHRlci0+dWlTZWN0b3JTaXplLCBHRlBfS0VSTkVMKTsKIAlpZihOVUxMID09IHBUZW1wQnVmZikKLQl7CiAJCWdvdG8gQmVjZWVtRmxhc2hCdWxrV3JpdGVfRVhJVDsKLQl9CiAvLwogLy8gY2hlY2sgaWYgdGhlIGRhdGEgdG8gYmUgd3JpdHRlbiBpcyBvdmVybGFwcGVkIGFjY3Jvc3Mgc2VjdG9ycwogLy8KQEAgLTEzOTksNyArMTE4OSw2IEBACiAJCQl1aU51bVNlY3RUb2JlUmVhZCsrOwogCQl9CiAJfQotCSNpZiAxCiAJLy9DaGVjayB3aGV0aGVyIFJlcXVlc3RlZCBzZWN0b3IgaXMgd3JpdGFibGUgb3Igbm90IGluIGNhc2Ugb2YgZmxhc2gyeCB3cml0ZS4gQnV0IGlmICB3cml0ZSBjYWxsIGlzCiAJLy8gZm9yIERTRCBjYWxpYnJhdGlvbiwgYWxsb3cgaXQgd2l0aG91dCBjaGVja2luZyBvZiBzZWN0b3IgcGVybWlzc2lvbgogCkBAIC0xNDIwLDcgKzEyMDksNiBAQAogCQkJIGluZGV4ID0gaW5kZXggKyAxIDsKIAkJfQogCX0KLQkjZW5kaWYKIAlBZGFwdGVyLT5TZWxlY3RlZENoaXAgPSBSRVNFVF9DSElQX1NFTEVDVDsKIAl3aGlsZSh1aU51bVNlY3RUb2JlUmVhZCkKIAl7CkBAIC0xNDQ4LDEzICsxMjM2LDEzIEBACiAJCWlmKHVpTnVtU2VjdFRvYmVSZWFkID4gMSkKIAkJewogCi0JCQlPc2FsTWVtTW92ZSgmcFRlbXBCdWZmW3VpQ3VyclNlY3RPZmZzZXRBZGRyXSxwY0J1ZmZlcix1aVNlY3RCb3VuZGFyeS0odWlTZWN0QWxpZ25BZGRyK3VpQ3VyclNlY3RPZmZzZXRBZGRyKSk7CisJCQltZW1jcHkoJnBUZW1wQnVmZlt1aUN1cnJTZWN0T2Zmc2V0QWRkcl0scGNCdWZmZXIsdWlTZWN0Qm91bmRhcnktKHVpU2VjdEFsaWduQWRkcit1aUN1cnJTZWN0T2Zmc2V0QWRkcikpOwogCQkJcGNCdWZmZXIgKz0gKCh1aVNlY3RCb3VuZGFyeS0odWlTZWN0QWxpZ25BZGRyK3VpQ3VyclNlY3RPZmZzZXRBZGRyKSkpOwogCQkJdWlOdW1CeXRlcyAtPSAodWlTZWN0Qm91bmRhcnktKHVpU2VjdEFsaWduQWRkcit1aUN1cnJTZWN0T2Zmc2V0QWRkcikpOwogCQl9CiAJCWVsc2UKIAkJewotCQkJCU9zYWxNZW1Nb3ZlKCZwVGVtcEJ1ZmZbdWlDdXJyU2VjdE9mZnNldEFkZHJdLHBjQnVmZmVyLHVpTnVtQnl0ZXMpOworCQkJCW1lbWNweSgmcFRlbXBCdWZmW3VpQ3VyclNlY3RPZmZzZXRBZGRyXSxwY0J1ZmZlcix1aU51bUJ5dGVzKTsKIAkJfQogCiAJCWlmKElzRmxhc2gyeChBZGFwdGVyKSkKQEAgLTE1MDMsNyArMTI5MSw3IEBACiAJCQkJfQogCQkJCWVsc2UKIAkJCQl7Ci0JCQkJCWlmKE9zYWxNZW1Db21wYXJlKHVjUmVhZEJrLCZwVGVtcEJ1ZmZbdWlJbmRleF0sTUFYX1JXX1NJWkUpKQorCQkJCQlpZihtZW1jbXAodWNSZWFkQmssJnBUZW1wQnVmZlt1aUluZGV4XSxNQVhfUldfU0laRSkpCiAJCQkJCXsKIAkJCQkJCWlmKFNUQVRVU19TVUNDRVNTICE9ICgqQWRhcHRlci0+ZnBGbGFzaFdyaXRlV2l0aFN0YXR1c0NoZWNrKShBZGFwdGVyLHVpUGFydE9mZnNldCt1aUluZGV4LCZwVGVtcEJ1ZmZbdWlJbmRleF0pKQogCQkJCQkJewpAQCAtMTU0MSwxMCArMTMyOSw4IEBACiAJewogCQlCY21SZXN0b3JlQmxvY2tQcm90ZWN0U3RhdHVzKEFkYXB0ZXIsdWxTdGF0dXMpOwogCX0KLQlpZihwVGVtcEJ1ZmYpCi0JewotCQlPc2FsTWVtRnJlZShwVGVtcEJ1ZmYsQWRhcHRlci0+dWlTZWN0b3JTaXplKTsKLQl9CisJCisJa2ZyZWUocFRlbXBCdWZmKTsKIAogCUFkYXB0ZXItPlNlbGVjdGVkQ2hpcCA9IFJFU0VUX0NISVBfU0VMRUNUOwogCXJldHVybiBTdGF0dXM7CkBAIC0xNTk5LDE0ICsxMzg1LDEwIEBACiAJdWlDdXJyU2VjdE9mZnNldEFkZHIJPSB1aU9mZnNldCAmIChBZGFwdGVyLT51aVNlY3RvclNpemUgLSAxKTsKIAl1aVNlY3RCb3VuZGFyeQkJCT0gdWlTZWN0QWxpZ25BZGRyICsgQWRhcHRlci0+dWlTZWN0b3JTaXplOwogCi0KLQotLy8JcFRlbXBCdWZmID0gT3NhbE1lbUFsbG9jKE1BWF9TRUNUT1JfU0laRSwnIU1WTicpOwotCXBUZW1wQnVmZiA9IE9zYWxNZW1BbGxvYyhBZGFwdGVyLT51aVNlY3RvclNpemUsIiFNVk4iKTsKKwlwVGVtcEJ1ZmYgPSBrbWFsbG9jKEFkYXB0ZXItPnVpU2VjdG9yU2l6ZSwgR0ZQX0tFUk5FTCk7CiAJaWYoTlVMTCA9PSBwVGVtcEJ1ZmYpCi0JewogCQlnb3RvIEJlY2VlbUZsYXNoQnVsa1dyaXRlU3RhdHVzX0VYSVQ7Ci0JfQorCiAvLwogLy8gY2hlY2sgaWYgdGhlIGRhdGEgdG8gYmUgd3JpdHRlbiBpcyBvdmVybGFwcGVkIGFjY3Jvc3Mgc2VjdG9ycwogLy8KQEAgLTE2NjIsMTMgKzE0NDQsMTMgQEAKIAkJaWYodWlOdW1TZWN0VG9iZVJlYWQgPiAxKQogCQl7CiAKLQkJCU9zYWxNZW1Nb3ZlKCZwVGVtcEJ1ZmZbdWlDdXJyU2VjdE9mZnNldEFkZHJdLHBjQnVmZmVyLHVpU2VjdEJvdW5kYXJ5LSh1aVNlY3RBbGlnbkFkZHIrdWlDdXJyU2VjdE9mZnNldEFkZHIpKTsKKwkJCW1lbWNweSgmcFRlbXBCdWZmW3VpQ3VyclNlY3RPZmZzZXRBZGRyXSxwY0J1ZmZlcix1aVNlY3RCb3VuZGFyeS0odWlTZWN0QWxpZ25BZGRyK3VpQ3VyclNlY3RPZmZzZXRBZGRyKSk7CiAJCQlwY0J1ZmZlciArPSAoKHVpU2VjdEJvdW5kYXJ5LSh1aVNlY3RBbGlnbkFkZHIrdWlDdXJyU2VjdE9mZnNldEFkZHIpKSk7CiAJCQl1aU51bUJ5dGVzIC09ICh1aVNlY3RCb3VuZGFyeS0odWlTZWN0QWxpZ25BZGRyK3VpQ3VyclNlY3RPZmZzZXRBZGRyKSk7CiAJCX0KIAkJZWxzZQogCQl7Ci0JCQlPc2FsTWVtTW92ZSgmcFRlbXBCdWZmW3VpQ3VyclNlY3RPZmZzZXRBZGRyXSxwY0J1ZmZlcix1aU51bUJ5dGVzKTsKKwkJCW1lbWNweSgmcFRlbXBCdWZmW3VpQ3VyclNlY3RPZmZzZXRBZGRyXSxwY0J1ZmZlcix1aU51bUJ5dGVzKTsKIAkJfQogCiAJCWlmKElzRmxhc2gyeChBZGFwdGVyKSkKQEAgLTE2OTgsMjUgKzE0ODAsMTAgQEAKIAkJewogCQkJZm9yKHVpSW5kZXggPSAwO3VpSW5kZXggPCBBZGFwdGVyLT51aVNlY3RvclNpemU7dWlJbmRleCArPSBNQVhfUldfU0laRSkKIAkJCXsKLSNpZiAwCi0JCQkJaWYoMCA9PSBCZWNlZW1GbGFzaEJ1bGtSZWFkKEFkYXB0ZXIsdWlSZWFkQmssdWlPZmZzZXRGcm9tU2VjdFN0YXJ0K3VpSW5kZXggKyBBZGFwdGVyLT51bEZsYXNoQ2FsU3RhcnQgLE1BWF9SV19TSVpFKSkKLQkJCQl7Ci0JCQkJCWZvcih1aVJlYWRJbmRleCA9IDA7dWlSZWFkSW5kZXggPCA0OyB1aVJlYWRJbmRleCsrKQotCQkJCQl7Ci0JCQkJCQlpZigqKChQVUlOVCkmcFRlbXBCdWZmW3VpSW5kZXgrdWlSZWFkSW5kZXgqNF0pICE9IHVpUmVhZEJrW3VpUmVhZEluZGV4XSkKLQkJCQkJCXsKLQkJCQkJCQlTdGF0dXMgPSAtMTsKLQkJCQkJCQlnb3RvIEJlY2VlbUZsYXNoQnVsa1dyaXRlU3RhdHVzX0VYSVQ7Ci0KLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJfQotI2VuZGlmCiAKIAkJCQlpZihTVEFUVVNfU1VDQ0VTUyA9PSBCZWNlZW1GbGFzaEJ1bGtSZWFkKEFkYXB0ZXIsKFBVSU5UKXVjUmVhZEJrLHVpT2Zmc2V0RnJvbVNlY3RTdGFydCt1aUluZGV4LE1BWF9SV19TSVpFKSkKIAkJCQl7Ci0JCQkJCWlmKE9zYWxNZW1Db21wYXJlKHVjUmVhZEJrLCZwVGVtcEJ1ZmZbdWlJbmRleF0sTUFYX1JXX1NJWkUpKQorCQkJCQlpZihtZW1jbXAodWNSZWFkQmssJnBUZW1wQnVmZlt1aUluZGV4XSxNQVhfUldfU0laRSkpCiAJCQkJCXsKIAkJCQkJCVN0YXR1cyA9IFNUQVRVU19GQUlMVVJFOwogCQkJCQkJZ290byBCZWNlZW1GbGFzaEJ1bGtXcml0ZVN0YXR1c19FWElUOwpAQCAtMTc0NywxMCArMTUxNCw4IEBACiAJewogCQlCY21SZXN0b3JlQmxvY2tQcm90ZWN0U3RhdHVzKEFkYXB0ZXIsdWxTdGF0dXMpOwogCX0KLQlpZihwVGVtcEJ1ZmYpCi0JewotCQlPc2FsTWVtRnJlZShwVGVtcEJ1ZmYsQWRhcHRlci0+dWlTZWN0b3JTaXplKTsKLQl9CisKKwlrZnJlZShwVGVtcEJ1ZmYpOwogCUFkYXB0ZXItPlNlbGVjdGVkQ2hpcCA9IFJFU0VUX0NISVBfU0VMRUNUOwogCXJldHVybiBTdGF0dXM7CiAKQEAgLTE3NzEsNyArMTUzNiw3IEBACiAKIElOVCBQcm9wYWdhdGVDYWxQYXJhbXNGcm9tRUVQUk9NVG9NZW1vcnkoUE1JTklfQURBUFRFUiBBZGFwdGVyKQogewotCVBDSEFSIHBCdWZmID0gT3NhbE1lbUFsbG9jKEJVRkZFUl80SywiM01WTiIpOworCVBDSEFSIHBCdWZmID0ga21hbGxvYyhCVUZGRVJfNEssIEdGUF9LRVJORUwpOwogCVVJTlQgdWlFZXByb21TaXplID0gMDsKIAlVSU5UIHVpSW5kZXggPSAwOwogCVVJTlQgdWlCeXRlc1RvQ29weSA9IDA7CkBAIC0xNzg3LDE0ICsxNTUyLDE0IEBACiAJaWYoMCAhPSBCZWNlZW1FRVBST01CdWxrUmVhZChBZGFwdGVyLCZ1aUVlcHJvbVNpemUsRUVQUk9NX1NJWkVfT0ZGU0VULDQpKQogCXsKIAotCQlPc2FsTWVtRnJlZShwQnVmZixCVUZGRVJfNEspOworCQlrZnJlZShwQnVmZik7CiAJCXJldHVybiAtMTsKIAl9CiAKIAl1aUVlcHJvbVNpemUgPj49IDE2OwogCWlmKHVpRWVwcm9tU2l6ZSA+IDEwMjQqMTAyNCkKIAl7Ci0JCU9zYWxNZW1GcmVlKHBCdWZmLEJVRkZFUl80Syk7CisJCWtmcmVlKHBCdWZmKTsKIAkJcmV0dXJuIC0xOwogCX0KIApAQCAtMTgyMCw3ICsxNTg1LDcgQEAKIAl3cm1hbHQoQWRhcHRlciwgRUVQUk9NX0NBTF9EQVRBX0lOVEVSTkFMX0xPQy00LCZ2YWx1ZSwgc2l6ZW9mKHZhbHVlKSk7CiAJdmFsdWUgPSAweGJlYWRiZWFkOwogCXdybWFsdChBZGFwdGVyLCBFRVBST01fQ0FMX0RBVEFfSU5URVJOQUxfTE9DLTgsJnZhbHVlLCBzaXplb2YodmFsdWUpKTsKLQlPc2FsTWVtRnJlZShwQnVmZixNQVhfUldfU0laRSk7CisJa2ZyZWUocEJ1ZmYpOwogCiAJcmV0dXJuIFN0YXR1czsKIApAQCAtMTg3MywxNiArMTYzOCwxMyBAQAogCQlyZXR1cm4gLTE7CiAJfQogCi0JcEJ1ZmYgPSBPc2FsTWVtQWxsb2ModWlFZXByb21TaXplLCAwKTsKLQorCXBCdWZmID0ga21hbGxvYyh1aUVlcHJvbVNpemUsIEdGUF9LRVJORUwpOwogCWlmICggcEJ1ZmYgPT0gTlVMTCApCi0JewogCQlyZXR1cm4gLTE7Ci0JfQogCiAJaWYoMCAhPSBCZWNlZW1OVk1SZWFkKEFkYXB0ZXIsKFBVSU5UKXBCdWZmLHVpQ2FsU3RhcnRBZGRyLCB1aUVlcHJvbVNpemUpKQogCXsKLQkJT3NhbE1lbUZyZWUocEJ1ZmYsIDApOworCQlrZnJlZShwQnVmZik7CiAJCXJldHVybiAtMTsKIAl9CiAKQEAgLTE5MDUsNyArMTY2Nyw3IEBACiAJCXVpQnl0ZXNUb0NvcHkgPSBNSU4oQlVGRkVSXzRLLHVpRWVwcm9tU2l6ZSk7CiAJfQogCi0JT3NhbE1lbUZyZWUocEJ1ZmYsIDApOworCWtmcmVlKHBCdWZmKTsKIAlyZXR1cm4gU3RhdHVzOwogCiB9CkBAIC0xOTQ3LDE0ICsxNzA5LDE0IEBACiAJCXsvLyBmb3IgdGhlIHJlcXVlc3RzIG1vcmUgdGhhbiBvciBlcXVhbCB0byBNQVhfUldfU0laRSBieXRlcywgdXNlIGJ1bGsgcmVhZCBmdW5jdGlvbiB0byBtYWtlIHRoZSBhY2Nlc3MgZmFzdGVyLgogCQkJQmVjZWVtRUVQUk9NQnVsa1JlYWQoQWRhcHRlciwmYXVpRGF0YVswXSx1aU9mZnNldCxNQVhfUldfU0laRSk7CiAKLQkJCWlmKE9zYWxNZW1Db21wYXJlKCZwQnVmZmVyW3VpSW5kZXhdLCZhdWlEYXRhWzBdLE1BWF9SV19TSVpFKSkKKwkJCWlmKG1lbWNtcCgmcEJ1ZmZlclt1aUluZGV4XSwmYXVpRGF0YVswXSxNQVhfUldfU0laRSkpCiAJCQl7CiAJCQkJLy8gcmUtd3JpdGUKIAkJCQlCZWNlZW1FRVBST01CdWxrV3JpdGUoQWRhcHRlciwoUFVDSEFSKShwQnVmZmVyK3VpSW5kZXgpLHVpT2Zmc2V0LE1BWF9SV19TSVpFLEZBTFNFKTsKIAkJCQltZGVsYXkoMyk7CiAJCQkJQmVjZWVtRUVQUk9NQnVsa1JlYWQoQWRhcHRlciwmYXVpRGF0YVswXSx1aU9mZnNldCxNQVhfUldfU0laRSk7CiAKLQkJCQlpZihPc2FsTWVtQ29tcGFyZSgmcEJ1ZmZlclt1aUluZGV4XSwmYXVpRGF0YVswXSxNQVhfUldfU0laRSkpCisJCQkJaWYobWVtY21wKCZwQnVmZmVyW3VpSW5kZXhdLCZhdWlEYXRhWzBdLE1BWF9SV19TSVpFKSkKIAkJCQl7CiAJCQkJCXJldHVybiAtMTsKIAkJCQl9CkBAIC0xOTg2LDcgKzE3NDgsNyBAQAogCQllbHNlCiAJCXsgLy8gSGFuZGxlIHRoZSByZWFkcyBsZXNzIHRoYW4gNCBieXRlcy4uLgogCQkJdWlEYXRhID0gMDsKLQkJCU9zYWxNZW1Nb3ZlKCZ1aURhdGEsKChQVUNIQVIpcEJ1ZmZlcikrKHVpSW5kZXgqc2l6ZW9mKFVJTlQpKSx1aU51bUJ5dGVzKTsKKwkJCW1lbWNweSgmdWlEYXRhLCgoUFVDSEFSKXBCdWZmZXIpKyh1aUluZGV4KnNpemVvZihVSU5UKSksdWlOdW1CeXRlcyk7CiAJCQlCZWNlZW1FRVBST01CdWxrUmVhZChBZGFwdGVyLCZ1aVJkYmssdWlPZmZzZXQsNCk7CiAKIAkJCWlmKG1lbWNtcCgmdWlEYXRhLCAmdWlSZGJrLCB1aU51bUJ5dGVzKSkKQEAgLTIxODYsNyArMTk0OCw3IEBACiAKIAkJaWYodWlCeXRlc1RvQ29weSA+PSAoMTYgLXVpRXh0cmFCeXRlcykpCiAJCXsKLQkJCU9zYWxNZW1Nb3ZlKCgoKFBVQ0hBUikmdWlEYXRhWzBdKSt1aUV4dHJhQnl0ZXMpLHBCdWZmZXIsTUFYX1JXX1NJWkUtIHVpRXh0cmFCeXRlcyk7CisJCQltZW1jcHkoKCgoUFVDSEFSKSZ1aURhdGFbMF0pK3VpRXh0cmFCeXRlcykscEJ1ZmZlcixNQVhfUldfU0laRS0gdWlFeHRyYUJ5dGVzKTsKIAogCQkJaWYgKCBTVEFUVVNfRkFJTFVSRSA9PSBCZWNlZW1FRVBST01Xcml0ZVBhZ2UoIEFkYXB0ZXIsIHVpRGF0YSwgdWlUZW1wT2Zmc2V0ICkgKQogCQkJCQlyZXR1cm4gU1RBVFVTX0ZBSUxVUkU7CkBAIC0yMTk3LDcgKzE5NTksNyBAQAogCQl9CiAJCWVsc2UKIAkJewotCQkJT3NhbE1lbU1vdmUoKCgoUFVDSEFSKSZ1aURhdGFbMF0pK3VpRXh0cmFCeXRlcykscEJ1ZmZlcix1aUJ5dGVzVG9Db3B5KTsKKwkJCW1lbWNweSgoKChQVUNIQVIpJnVpRGF0YVswXSkrdWlFeHRyYUJ5dGVzKSxwQnVmZmVyLHVpQnl0ZXNUb0NvcHkpOwogCiAJCQlpZiAoIFNUQVRVU19GQUlMVVJFID09IEJlY2VlbUVFUFJPTVdyaXRlUGFnZSggQWRhcHRlciwgdWlEYXRhLCB1aVRlbXBPZmZzZXQgKSApCiAJCQkJCXJldHVybiBTVEFUVVNfRkFJTFVSRTsKQEAgLTIyMzMsNyArMTk5NSw3IEBACiAJLy8gVG8gcHJvZ3JhbSBub24gMTZieXRlIGFsaWduZWQgZGF0YSwgcmVhZCAxNmJ5dGUgYW5kIHRoZW4gdXBkYXRlLgogCS8vCiAJCQlCZWNlZW1FRVBST01CdWxrUmVhZChBZGFwdGVyLCZ1aURhdGFbMF0sdWlPZmZzZXQsMTYpOwotCQkJT3NhbE1lbU1vdmUoJnVpRGF0YVswXSxwQnVmZmVyK3VpSW5kZXgsdWlCeXRlc1RvQ29weSk7CisJCQltZW1jcHkoJnVpRGF0YVswXSxwQnVmZmVyK3VpSW5kZXgsdWlCeXRlc1RvQ29weSk7CiAKIAogCQkJaWYgKCBTVEFUVVNfRkFJTFVSRSA9PSBCZWNlZW1FRVBST01Xcml0ZVBhZ2UoIEFkYXB0ZXIsIHVpRGF0YSwgdWlPZmZzZXQgKSApCkBAIC0yNTM1LDcgKzIyOTcsNyBAQAogLy8KIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotVUlOVCBCY21HZXRGbGFzaFNlY3RvclNpemUoUE1JTklfQURBUFRFUiBBZGFwdGVyLCBVSU5UIEZsYXNoU2VjdG9yU2l6ZVNpZywgVUlOVCBGbGFzaFNlY3RvclNpemUpCitzdGF0aWMgVUlOVCBCY21HZXRGbGFzaFNlY3RvclNpemUoUE1JTklfQURBUFRFUiBBZGFwdGVyLCBVSU5UIEZsYXNoU2VjdG9yU2l6ZVNpZywgVUlOVCBGbGFzaFNlY3RvclNpemUpCiB7CiAJVUlOVCB1aVNlY3RvclNpemUgPSAwOwogCVVJTlQgdWlTZWN0b3JTaWcgPSAwOwpAQCAtMjY0MiwyMCArMjQwNCw4IEBACiAKIElOVCBCY21Jbml0TlZNKFBNSU5JX0FEQVBURVIgcHNfYWRhcHRlcikKIHsKLSNpZmRlZiBCQ01fU0hNX0lOVEVSRkFDRQotI2lmZGVmIEZMQVNIX0RJUkVDVF9BQ0NFU1MKLQl1bnNpZ25lZCBpbnQgZGF0YSxkYXRhMSxkYXRhMiA9IDE7Ci0Jd3JtKHBzX2FkYXB0ZXIsIFBBRF9TRUxFQ1RfUkVHSVNURVIsICZkYXRhMiwgNCk7Ci0JZGF0YTEgPSByZG0ocHNfYWRhcHRlcixTWVNfQ0ZHLCZkYXRhLDQpOwotCWRhdGExID0gcmRtKHBzX2FkYXB0ZXIsU1lTX0NGRywmZGF0YSw0KTsKLQlkYXRhMiA9IChkYXRhIHwgMHg4MCB8IDB4ODAwMCk7Ci0Jd3JtKHBzX2FkYXB0ZXIsU1lTX0NGRywgJmRhdGEyLDQpOyAvLyBvdmVyLXdyaXRlIGFzIEZsYXNoIGJvb3QgbW9kZQotI2VuZGlmCi0JcHNfYWRhcHRlci0+ZU5WTVR5cGUgPSBOVk1fRkxBU0g7Ci0jZWxzZQogCUJjbVZhbGlkYXRlTnZtVHlwZShwc19hZGFwdGVyKTsKIAlCY21Jbml0RUVQUk9NUXVldWVzKHBzX2FkYXB0ZXIpOwotI2VuZGlmCiAKIAlpZihwc19hZGFwdGVyLT5lTlZNVHlwZSA9PSBOVk1fQVVUT0RFVEVDVCkKIAl7CkBAIC0yNjg0LDcgKzI0MzQsNyBAQAogKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLUlOVCBCY21HZXROdm1TaXplKFBNSU5JX0FEQVBURVIgQWRhcHRlcikKK3N0YXRpYyBJTlQgQmNtR2V0TnZtU2l6ZShQTUlOSV9BREFQVEVSIEFkYXB0ZXIpCiB7CiAJaWYoQWRhcHRlci0+ZU5WTVR5cGUgPT0gTlZNX0VFUFJPTSkKIAl7CkBAIC0yNzA4LDcgKzI0NTgsNyBAQAogLy8gUmV0dXJuczoKIC8vCQk8Vk9JRD4KIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLVZPSUQgQmNtVmFsaWRhdGVOdm1UeXBlKFBNSU5JX0FEQVBURVIgQWRhcHRlcikKK3N0YXRpYyBWT0lEIEJjbVZhbGlkYXRlTnZtVHlwZShQTUlOSV9BREFQVEVSIEFkYXB0ZXIpCiB7CiAKIAkvLwpAQCAtMjc3NSw3ICsyNTI1LDcgQEAKIAlpZihwc0FkYXB0ZXItPnBzRmxhc2gyeENTSW5mbyA9PSBOVUxMKQogCXsKIAkJQkNNX0RFQlVHX1BSSU5UKHBzQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsIkNhbid0IEFsbG9jYXRlIG1lbW9yeSBmb3IgRmxhc2ggMi54Iik7Ci0JCWJjbV9rZnJlZShwc0FkYXB0ZXItPnBzRmxhc2hDU0luZm8pOworCQlrZnJlZShwc0FkYXB0ZXItPnBzRmxhc2hDU0luZm8pOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKQEAgLTI3ODMsOCArMjUzMyw4IEBACiAJaWYocHNBZGFwdGVyLT5wc0ZsYXNoMnhWZW5kb3JJbmZvID09IE5VTEwpCiAJewogCQlCQ01fREVCVUdfUFJJTlQocHNBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwiQ2FuJ3QgQWxsb2NhdGUgVmVuZG9yIEluZm8gTWVtb3J5IGZvciBGbGFzaCAyLngiKTsKLQkJYmNtX2tmcmVlKHBzQWRhcHRlci0+cHNGbGFzaENTSW5mbyk7Ci0JCWJjbV9rZnJlZShwc0FkYXB0ZXItPnBzRmxhc2gyeENTSW5mbyk7CisJCWtmcmVlKHBzQWRhcHRlci0+cHNGbGFzaENTSW5mbyk7CisJCWtmcmVlKHBzQWRhcHRlci0+cHNGbGFzaDJ4Q1NJbmZvKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCkBAIC0yNzk4LDkgKzI1NDgsOSBAQAogCQlCQ01fREVCVUdfUFJJTlQocHNBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwiIEFkYXB0ZXIgc3RydWN0dXJlIHBvaW50IGlzIE5VTEwiKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQotCWJjbV9rZnJlZShwc0FkYXB0ZXItPnBzRmxhc2hDU0luZm8pOwotCWJjbV9rZnJlZShwc0FkYXB0ZXItPnBzRmxhc2gyeENTSW5mbyk7Ci0JYmNtX2tmcmVlKHBzQWRhcHRlci0+cHNGbGFzaDJ4VmVuZG9ySW5mbyk7CisJa2ZyZWUocHNBZGFwdGVyLT5wc0ZsYXNoQ1NJbmZvKTsKKwlrZnJlZShwc0FkYXB0ZXItPnBzRmxhc2gyeENTSW5mbyk7CisJa2ZyZWUocHNBZGFwdGVyLT5wc0ZsYXNoMnhWZW5kb3JJbmZvKTsKIAlyZXR1cm4gU1RBVFVTX1NVQ0NFU1MgOwogfQogCkBAIC0yOTU0LDcgKzI3MDQsNyBAQAogCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKIH0KIAotSU5UIElzU2VjdGlvbkV4aXN0SW5WZW5kb3JJbmZvKFBNSU5JX0FEQVBURVIgQWRhcHRlciwgRkxBU0gyWF9TRUNUSU9OX1ZBTCBzZWN0aW9uKQorc3RhdGljIElOVCBJc1NlY3Rpb25FeGlzdEluVmVuZG9ySW5mbyhQTUlOSV9BREFQVEVSIEFkYXB0ZXIsIEZMQVNIMlhfU0VDVElPTl9WQUwgc2VjdGlvbikKIHsKICAJcmV0dXJuICggQWRhcHRlci0+dWlWZW5kb3JFeHRuRmxhZyAmJgogIAkJKEFkYXB0ZXItPnBzRmxhc2gyeFZlbmRvckluZm8tPlZlbmRvclNlY3Rpb25bc2VjdGlvbl0uQWNjZXNzRmxhZ3MgJiBGTEFTSDJYX1NFQ1RJT05fUFJFU0VOVCkgJiYKQEAgLTMwNTIsNyArMjgwMiw3IEBACiAvLwkJPFZPSUQ+CiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLUlOVCBCY21HZXRGbGFzaENTSW5mbyhQTUlOSV9BREFQVEVSIEFkYXB0ZXIpCitzdGF0aWMgSU5UIEJjbUdldEZsYXNoQ1NJbmZvKFBNSU5JX0FEQVBURVIgQWRhcHRlcikKIHsKIAkvL0ZMQVNIX0NTX0lORk8gc0ZsYXNoQ3NJbmZvID0gezB9OwogCkBAIC0zMDcwLDcgKzI4MjAsNiBAQAogCW1lbXNldChBZGFwdGVyLT5wc0ZsYXNoQ1NJbmZvLCAwICxzaXplb2YoRkxBU0hfQ1NfSU5GTykpOwogCW1lbXNldChBZGFwdGVyLT5wc0ZsYXNoMnhDU0luZm8sIDAgLHNpemVvZihGTEFTSDJYX0NTX0lORk8pKTsKIAotI2lmbmRlZiBCQ01fU0hNX0lOVEVSRkFDRQogCWlmKCFBZGFwdGVyLT5iRERSSW5pdERvbmUpCiAJewogCQl7CkBAIC0zMDc5LDcgKzI4MjgsNiBAQAogCQl9CiAJfQogCi0jZW5kaWYKIAogCS8vIFJlYWRpbmcgZmlyc3QgOCBCeXRlcyB0byBnZXQgdGhlIEZsYXNoIExheW91dAogCS8vIE1hZ2ljTnVtYmVyKDQgYnl0ZXMpICtGbGFzaExheW91dE1pbm9yVmVyc2lvbigyIEJ5dGVzKSArRmxhc2hMYXlvdXRNYWpvclZlcnNpb24oMiBCeXRlcykKQEAgLTMxNDcsOSArMjg5NSw3IEBACiAJCQlyZXR1cm4gU1RBVFVTX0ZBSUxVUkU7CiAJCX0KIAkJQ29udmVydEVuZGlhbk9mMlhDU1N0cnVjdHVyZShBZGFwdGVyLT5wc0ZsYXNoMnhDU0luZm8pOwotI2lmbmRlZiBCQ01fU0hNX0lOVEVSRkFDRQogCQlCY21EdW1wRmxhc2gyWENTU3RydWN0dXJlKEFkYXB0ZXItPnBzRmxhc2gyeENTSW5mbyxBZGFwdGVyKTsKLSNlbmRpZgogCQlpZigoRkxBU0hfQ09OVFJPTF9TVFJVQ1RfU0lHTkFUVVJFID09IEFkYXB0ZXItPnBzRmxhc2gyeENTSW5mby0+TWFnaWNOdW1iZXIpICYmCiAJCSAgIChTQ1NJX0ZJUk1XQVJFX01JTk9SX1ZFUlNJT04gPD0gTUlOT1JfVkVSU0lPTihBZGFwdGVyLT5wc0ZsYXNoMnhDU0luZm8tPlNDU0lGaXJtd2FyZVZlcnNpb24pKSAmJgogCQkgICAoRkxBU0hfU0VDVE9SX1NJWkVfU0lHID09IEFkYXB0ZXItPnBzRmxhc2gyeENTSW5mby0+Rmxhc2hTZWN0b3JTaXplU2lnKSAmJgpAQCAtMzE4MSwyMSArMjkyNywxMCBAQAogCUNvbmNlcm5zOiB3aGF0IGlmIENTIHNlY3RvciBzaXplIGRvZXMgbm90IG1hdGNoIHdpdGggdGhpcyBzZWN0b3Igc2l6ZSA/Pz8KIAl3aGF0IGlzIHRoZSBpbmRpY2F0aW9uIG9mIEFjY2Vzc0JpdE1hcCAgaW4gQ1MgaW4gZmxhc2ggMi54ID8/Pz8KIAkqLwotI2lmbmRlZiBCQ01fU0hNX0lOVEVSRkFDRQogCUFkYXB0ZXItPnVsRmxhc2hJRCA9IEJjbVJlYWRGbGFzaFJESUQoQWRhcHRlcik7Ci0jZW5kaWYKIAogCUFkYXB0ZXItPnVpRmxhc2hMYXlvdXRNYWpvclZlcnNpb24gPSB1aUZsYXNoTGF5b3V0TWFqb3JWZXJzaW9uOwogCi0JI2lmIDAKLQlpZihGTEFTSF9QQVJUX1NTVDI1VkYwODBCID09IEFkYXB0ZXItPnVsRmxhc2hJRCkKLQl7Ci0JLy8KLQkvLyAxTUIgZmxhc2ggaGFzIGJlZW4gc2VsZWN0ZWQuIHdlIGhhdmUgdG8gdXNlIDY0SyBhcyBzZWN0b3Igc2l6ZSBubyBtYXR0ZXIgd2hhdCBpcyBrZXB0IGluIEZMQVNIX0NTLgotCS8vCi0JCUFkYXB0ZXItPnVpU2VjdG9yU2l6ZSA9IDB4MTAwMDA7Ci0JfQotCSNlbmRpZgogCiAJcmV0dXJuIFNUQVRVU19TVUNDRVNTIDsKIH0KQEAgLTMyMTQsNyArMjk0OSw3IEBACiAvLwogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1OVk1fVFlQRSBCY21HZXROdm1UeXBlKFBNSU5JX0FEQVBURVIgQWRhcHRlcikKK3N0YXRpYyBOVk1fVFlQRSBCY21HZXROdm1UeXBlKFBNSU5JX0FEQVBURVIgQWRhcHRlcikKIHsKIAlVSU5UIHVpRGF0YSA9IDA7CiAKQEAgLTM1NjksMzkgKzMzMDQsNiBAQAogfQogCiAvKioKLSoJUmVhZERTREhlYWRlciA6IFJlYWQgdGhlIERTRCBtYXAgZm9yIHRoZSBEU0QgU2VjdGlvbiB2YWwgcHJvdmlkZWQgaW4gQXJndW1lbnQuCi0qCUBBZGFwdGVyIDogQmVjZWVtIFByaXZhdGUgRGF0YSBTdHJ1Y3R1cmUKLSoJQHBzRFNESGVhZGVyIDpQb2ludGVyIG9mIHRoZSBidWZmZXIgd2hlcmUgaGVhZGVyIGhhcyB0byBiZSByZWFkCi0qCUBkc2QgOnZhbHVlIG9mIHRoZSBEeWFubWljIERTRCBsaWtlIERTRDAgb2YgRFNEMSBvciBEU0QyCi0qCi0qCVJldHVybiBWYWx1ZTotCi0qCQlpZiBzdWNlZWRzIHJldHVybiBTVEFUVVNfU1VDQ0VTUyBvciBuZWdhdGl2ZSBlcnJvciBjb2RlLgotKiovCi1JTlQgUmVhZERTREhlYWRlcihQTUlOSV9BREFQVEVSIEFkYXB0ZXIsIFBEU0RfSEVBREVSIHBzRFNESGVhZGVyLCBGTEFTSDJYX1NFQ1RJT05fVkFMIGRzZCkKLXsKLQlJTlQgU3RhdHVzID0gU1RBVFVTX1NVQ0NFU1M7Ci0KLQlTdGF0dXMgPUJjbUZsYXNoMnhCdWxrUmVhZChBZGFwdGVyLAotCQkJCQkJICAgIChQVUlOVClwc0RTREhlYWRlciwKLQkJCQkJCQlkc2QsCi0JCQkJCQkJQWRhcHRlci0+cHNGbGFzaDJ4Q1NJbmZvLT5PZmZzZXRGcm9tRFNEU3RhcnRGb3JEU0RIZWFkZXIsCi0JCQkJCQkJc2l6ZW9mKERTRF9IRUFERVIpKTsKLQlpZihTdGF0dXMgPT0gU1RBVFVTX1NVQ0NFU1MpCi0JewotCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIE5WTV9SVywgREJHX0xWTF9BTEwsICJEU0RJbWFnZU1hZ2ljTnVtYmVyIDowWCV4IiwgbnRvaGwocHNEU0RIZWFkZXItPkRTREltYWdlTWFnaWNOdW1iZXIpKTsKLQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBOVk1fUlcsIERCR19MVkxfQUxMLCAiRFNESW1hZ2VTaXplIDowWCV4ICIsbnRvaGwocHNEU0RIZWFkZXItPkRTREltYWdlU2l6ZSkpOwotCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIE5WTV9SVywgREJHX0xWTF9BTEwsICJEU0RJbWFnZUNSQyA6MFgleCIsbnRvaGwocHNEU0RIZWFkZXItPkRTREltYWdlQ1JDKSk7Ci0JCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX09USEVSUywgTlZNX1JXLCBEQkdfTFZMX0FMTCwgIkRTREltYWdlUHJpb3JpdHkgOjBYJXgiLG50b2hsKHBzRFNESGVhZGVyLT5EU0RJbWFnZVByaW9yaXR5KSk7Ci0JfQotCWVsc2UKLQl7Ci0JCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwiRFNEIEhlYWRlciByZWFkIGlzIGZhaWxlZCB3aXRoIHN0YXR1cyA6JWQiLCBTdGF0dXMpOwotCX0KLQotCXJldHVybiBTdGF0dXM7Ci19Ci0KLS8qKgogKglCY21HZXRBY3RpdmVEU0QgOiBTZXQgdGhlIEFjdGl2ZSBEU0QgaW4gQWRhcHRlciBTdHJ1Y3R1cmUgd2hpY2ggaGFzIHRvIGJlIGR1bXBlZCBpbiBERFIKICoJQEFkYXB0ZXIgOi1Ecml2ZXJzIHByaXZhdGUgRGF0YSBTdHJ1Y3R1cmUKICoKQEAgLTM2MDksNyArMzMxMSw3IEBACiAqCQlSZXR1cm4gU1RBVFVTX1NVQ0VTUyBpZiBnZXQgc3VjZXNzIGluIHNldHRpbmcgdGhlIHJpZ2h0IERTRCBlbHNlIG5lZ2FpdmUgZXJyb3IgY29kZQogKgogKiovCi1JTlQgQmNtR2V0QWN0aXZlRFNEKFBNSU5JX0FEQVBURVIgQWRhcHRlcikKK3N0YXRpYyBJTlQgQmNtR2V0QWN0aXZlRFNEKFBNSU5JX0FEQVBURVIgQWRhcHRlcikKIHsKIAlGTEFTSDJYX1NFQ1RJT05fVkFMIHVpSGlnaGVzdFByaURTRCA9IDAgOwogCkBAIC0zNjQ3LDM5ICszMzQ5LDYgQEAKIAlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7CiB9CiAKLS8qKgotKglSZWFkSVNPVW5SZXNlcnZlZEJ5dGVzIDogUmVhZCB0aGUgSVNPIG1hcCBmb3IgdGhlIElTTyBTZWN0aW9uIHZhbCBwcm92aWRlZCBpbiBBcmd1bWVudC4KLSoJQEFkYXB0ZXIgOiBEcml2ZXIgUHJpdmF0ZSBEYXRhIFN0cnVjdHVyZQotKglAcHNJU09IZWFkZXIgOlBvaW50ZXIgb2YgdGhlIGxvY2F0aW9uIHdoZXJlIGhlYWRlciBoYXMgdG8gYmUgcmVhZAotKglASXNvSW1hZ2UgOnZhbHVlIG9mIHRoZSBEeWFubWljIElTTyBsaWtlIElTT19JTUFHRTEgb2YgSVNPX0lNQUdFMgotKgotKglSZXR1cm4gVmFsdWU6LQotKgkJaWYgc3VjZWVkcyByZXR1cm4gU1RBVFVTX1NVQ0NFU1Mgb3IgbmVnYXRpdmUgZXJyb3IgY29kZS4KLSoqLwotCi1JTlQgUmVhZElTT0hlYWRlcihQTUlOSV9BREFQVEVSIEFkYXB0ZXIsIFBJU09fSEVBREVSIHBzSVNPSGVhZGVyLCBGTEFTSDJYX1NFQ1RJT05fVkFMIElzb0ltYWdlKQotewotCUlOVCBTdGF0dXMgPSBTVEFUVVNfU1VDQ0VTUzsKLQotCVN0YXR1cyA9IEJjbUZsYXNoMnhCdWxrUmVhZChBZGFwdGVyLAotCQkJCQkgICAgKFBVSU5UKXBzSVNPSGVhZGVyLAotCQkJCQkJSXNvSW1hZ2UsCi0JCQkJCQkwLAotCQkJCQkJc2l6ZW9mKElTT19IRUFERVIpKTsKLQotCWlmKFN0YXR1cyA9PSBTVEFUVVNfU1VDQ0VTUykKLQl7Ci0JCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX09USEVSUywgTlZNX1JXLCBEQkdfTFZMX0FMTCwgIklTT0ltYWdlTWFnaWNOdW1iZXIgOjBYJXgiLCBudG9obChwc0lTT0hlYWRlci0+SVNPSW1hZ2VNYWdpY051bWJlcikpOwotCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIE5WTV9SVywgREJHX0xWTF9BTEwsICJJU09JbWFnZVNpemUgOjBYJXggIixudG9obChwc0lTT0hlYWRlci0+SVNPSW1hZ2VTaXplKSk7Ci0JCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX09USEVSUywgTlZNX1JXLCBEQkdfTFZMX0FMTCwgIklTT0ltYWdlQ1JDIDowWCV4IixudG9obChwc0lTT0hlYWRlci0+SVNPSW1hZ2VDUkMpKTsKLQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBOVk1fUlcsIERCR19MVkxfQUxMLCAiSVNPSW1hZ2VQcmlvcml0eSA6MFgleCIsbnRvaGwocHNJU09IZWFkZXItPklTT0ltYWdlUHJpb3JpdHkpKTsKLQl9Ci0JZWxzZQotCXsKLQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiSVNPIEhlYWRlciBSZWFkIGZhaWxlZCIpOwotCX0KLQlyZXR1cm4gU3RhdHVzOwotfQogCiAvKioKICoJQmNtR2V0QWN0aXZlSVNPIDotIFNldCB0aGUgQWN0aXZlIElTTyBpbiBBZGFwdGVyIERhdGEgU3RydWN0dWUKQEAgLTM2OTEsNyArMzM2MCw3IEBACiAqCiAqKi8KIAotSU5UIEJjbUdldEFjdGl2ZUlTTyhQTUlOSV9BREFQVEVSIEFkYXB0ZXIpCitzdGF0aWMgSU5UIEJjbUdldEFjdGl2ZUlTTyhQTUlOSV9BREFQVEVSIEFkYXB0ZXIpCiB7CiAKIAlJTlQgSGlnaGVzdFByaUlTTyA9IDAgOwpAQCAtNDU4OCw3ICs0MjU3LDcgQEAKIAogCX0KIAotCWJjbV9rZnJlZShCdWZmKTsKKwlrZnJlZShCdWZmKTsKIAogCXJldHVybiBTdGF0dXM7CiB9CkBAIC00Nzg5LDcgKzQ0NTgsNyBAQAogCVN1Y2Nlc3MgOi0gQmFzZSBBZGRyZXNzIG9mIHRoZSBGbGFzaAogKiovCiAKLUlOVCBHZXRGbGFzaEJhc2VBZGRyKFBNSU5JX0FEQVBURVIgQWRhcHRlcikKK3N0YXRpYyBJTlQgR2V0Rmxhc2hCYXNlQWRkcihQTUlOSV9BREFQVEVSIEFkYXB0ZXIpCiB7CiAKIAlVSU5UIHVpQmFzZUFkZHIgPSAwOwpAQCAtNDg2NiwyMCArNDUzNSw2IEBACiAJCXJldHVybiAgLUVJTlZBTDsKIAl9CiAKLQkjaWYgMAotCWVsc2UKLQl7Ci0JCWlmKChTcmNTZWN0aW9uID09IFZTQTApIHx8IChTcmNTZWN0aW9uID09IFZTQTEpIHx8IChTcmNTZWN0aW9uID09IFZTQTIpKQotCQl7Ci0JCQlpZigoRHN0U2VjdGlvbiAhPSBWU0EwKSAmJiAoRHN0U2VjdGlvbiAhPSBWU0ExKSAmJiAoRHN0U2VjdGlvbiAhPSBWU0EyKSkKLQkJCXsKLQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIE5WTV9SVywgREJHX0xWTF9BTEwsIlNvdXJjZSBhbmQgRGVzdGlvbiBzZWN0b24gaXMgbm90IG9mIHNhbWUgdHlwZSIpOwotCQkJCXJldHVybiAtRUlOVkFMOwotCQkJfQotCQl9Ci0KLQl9Ci0JI2VuZGlmCiAJLy9pZiBvZmZzZXQgemVybyBtZWFucyBoYXZlIHRvIGNvcHkgY29tcGxldGUgc2VjdG9uCiAKIAlpZihudW1PZkJ5dGVzID09IDApCkBAIC00OTU0LDcgKzQ2MDksNyBAQAogCQkJCUJ5dGVzVG9CZUNvcGllZCA9IG51bU9mQnl0ZXM7CiAJCX0KIAl9d2hpbGUobnVtT2ZCeXRlcyA+IDApIDsKLQliY21fa2ZyZWUocEJ1ZmYpOworCWtmcmVlKHBCdWZmKTsKIAlBZGFwdGVyLT5iSGVhZGVyQ2hhbmdlQWxsb3dlZCA9IEZBTFNFIDsKIAlyZXR1cm4gU3RhdHVzOwogfQpAQCAtNDk3OSwxNCArNDYzNCw2IEBACiAJVUlOVCB1aVNlY3RBbGlnbkFkZHIgPSAwOwogCVVJTlQgc2lnID0gMDsKIAotCSNpZiAwCi0JLy9pZiBDaGVuZ2VzIGluIEhlYWRlciBpcyBhbGxvd2VkLCBSZXR1cm4gYmFjawotCWlmKEFkYXB0ZXItPmJIZWFkZXJDaGFuZ2VBbGxvd2VkID09IFRSVUUpCi0JewotCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIE5WTV9SVywgREJHX0xWTF9BTEwsICJIZWFkZXIgQ2hhbmdlIGlzIGFsbG93ZWQiKTsKLQkJcmV0dXJuIFNUQVRVU19TVUNDRVNTIDsKLQl9Ci0JI2VuZGlmCiAJLy9tYWtpbmcgdGhlIG9mZnNldCBzZWN0b3IgYWxsaWduZWQKIAl1aVNlY3RBbGlnbkFkZHIgPSB1aU9mZnNldCAmIH4oQWRhcHRlci0+dWlTZWN0b3JTaXplIC0gMSk7CiAKQEAgLTUwMjQsNyArNDY3MSw3IEBACiAJCS8vUmVwbGFjZSBCdWZmZXIgY29udGVudCB3aXRoIEhlYWRlcgogCQltZW1jcHkocEJ1ZmYgK29mZnNldFRvUHJvdGVjdCxwVGVtcEJ1ZmYsSGVhZGVyU2l6ZVRvUHJvdGVjdCk7CiAKLQkJYmNtX2tmcmVlKHBUZW1wQnVmZik7CisJCWtmcmVlKHBUZW1wQnVmZik7CiAJfQogCWlmKGJIYXNIZWFkZXIgJiYgQWRhcHRlci0+YlNpZ0NvcnJ1cHRlZCkKIAl7CkBAIC01MDQ0LDI5ICs0NjkxLDcgQEAKIAogCXJldHVybiBTVEFUVVNfU1VDQ0VTUyA7CiB9Ci1JTlQgQmNtTWFrZUZsYXNoQ1NBY3RpdmUoUE1JTklfQURBUFRFUiBBZGFwdGVyLCBVSU5UIG9mZnNldCkKLXsKLQlVSU5UIEdQSU9Db25maWcgPSAwIDsKIAotCi0JaWYoQWRhcHRlci0+YkZsYXNoUmF3UmVhZCA9PSBGQUxTRSkKLQl7Ci0JCS8vQXBwbGljYWJsZSBmb3IgRmxhc2gyLngKLQkJaWYoSXNGbGFzaDJ4KEFkYXB0ZXIpID09IEZBTFNFKQotCQkJcmV0dXJuIFNUQVRVU19TVUNDRVNTOwotCX0KLQotCWlmKG9mZnNldC9GTEFTSF9QQVJUX1NJWkUpCi0JewotCQkvL2JpdFsxNC4uMTJdIC0+IHdpbGwgc2VsZWN0IG1ha2UgQWN0aXZlIENTMSwgQ1MyIG9yIENTMwotCQkvLyBTZWxlY3QgQ1MxLCBDUzIgYW5kIENTMyAoQ1MwIGlzIGRlZGljYXRlZCBwaW4pCi0JCXJkbWFsdChBZGFwdGVyLEZMQVNIX0dQSU9fQ09ORklHX1JFRywgJkdQSU9Db25maWcsIDQpOwotCQlHUElPQ29uZmlnIHw9ICg3IDw8IDEyKTsKLQkJd3JtYWx0KEFkYXB0ZXIsRkxBU0hfR1BJT19DT05GSUdfUkVHLCAmR1BJT0NvbmZpZywgNCk7Ci0JfQotCi0JcmV0dXJuIFNUQVRVU19TVUNDRVNTIDsKLX0KIC8qKgogQmNtRG9DaGlwU2VsZWN0IDogVGhpcyB3aWxsIHNlbGNldCB0aGUgYXBwcm9wcmlhdGUgY2hpcCBmb3Igd3JpdGluZy4KIEBBZGFwYXRlciA6LSBCY20gRHJpdmVyIFByaXZhdGUgRGF0YSBTdHJ1Y3R1cmUKQEAgLTUwNzQsNyArNDY5OSw3IEBACiBPdXRQdXQ6LQogCVNlbGVjdCB0aGUgQXBwcm9wcmlhdGUgY2hpcCBhbmQgcmV0cm4gc3RhdHVzIFN1Y2VzcwogKiovCi1JTlQgQmNtRG9DaGlwU2VsZWN0KFBNSU5JX0FEQVBURVIgQWRhcHRlciwgVUlOVCBvZmZzZXQpCitzdGF0aWMgSU5UIEJjbURvQ2hpcFNlbGVjdChQTUlOSV9BREFQVEVSIEFkYXB0ZXIsIFVJTlQgb2Zmc2V0KQogewogCVVJTlQgRmxhc2hDb25maWcgPSAwOwogCUlOVCBDaGlwTnVtID0gMDsKQEAgLTUzNjUsMzkgKzQ5OTAsNiBAQAogCXJldHVybiBTdGF0dXM7CiB9CiAKLSNpZiAwCi1VSU5UIGdldE51bU9mU3ViU2VjdGlvbldpdGhXUlBlcm1pc3NvbihQTUlOSV9BREFQVEVSIEFkYXB0ZXIsIFNFQ1RJT05fVFlQRSBzZWNUeXBlKQotewotCi0JVUlOVCBudW1PZldSU3ViU2VjID0gMDsKLQlzd2l0Y2goc2VjVHlwZSkKLQl7Ci0JCWNhc2UgSVNPIDoKLQkJCWlmKElzU2VjdGlvbldyaXRhYmxlKEFkYXB0ZXIsSVNPX0lNQUdFMSkpCi0JCQkJbnVtT2ZXUlN1YlNlYyA9IG51bU9mV1JTdWJTZWMgKyAxOwotCQkJaWYoSXNTZWN0aW9uV3JpdGFibGUoQWRhcHRlcixJU09fSU1BR0UyKSkKLQkJCQludW1PZldSU3ViU2VjID0gbnVtT2ZXUlN1YlNlYyArIDE7Ci0JCQlicmVhazsKLQotCQljYXNlIERTRCA6Ci0JCQlpZihJc1NlY3Rpb25Xcml0YWJsZShBZGFwdGVyLERTRDIpKQotCQkJCW51bU9mV1JTdWJTZWMgPSBudW1PZldSU3ViU2VjICsgMTsKLQkJCWlmKElzU2VjdGlvbldyaXRhYmxlKEFkYXB0ZXIsRFNEMSkpCi0JCQkJbnVtT2ZXUlN1YlNlYyA9IG51bU9mV1JTdWJTZWMgKyAxOwotCQkJaWYoSXNTZWN0aW9uV3JpdGFibGUoQWRhcHRlcixEU0QwKSkKLQkJCQludW1PZldSU3ViU2VjID0gbnVtT2ZXUlN1YlNlYyArIDE7Ci0JCQlicmVhayA7Ci0KLQkJY2FzZSBWU0EgOgotCQkJCS8vZm9yIFZTQSBBZGQgY29kZSBIZXJlCi0JCSBkZWZhdWx0IDoKLQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX09USEVSUywgTlZNX1JXLCBEQkdfTFZMX0FMTCwiSW52YWxpZCBzZWN0b248JWQ+IGlzIHBhc3NlZCIsIHNlY1R5cGUpO1wKLQkJCW51bU9mV1JTdWJTZWMgPSAwOwotCi0JfQotCXJldHVybiBudW1PZldSU3ViU2VjOwotfQotI2VuZGlmCiBCT09MRUFOIElzU2VjdGlvbkV4aXN0SW5GbGFzaChQTUlOSV9BREFQVEVSIEFkYXB0ZXIsIEZMQVNIMlhfU0VDVElPTl9WQUwgc2VjdGlvbikKIHsKIApAQCAtNTQ3OSw3ICs1MDcxLDcgQEAKIAkJcmV0dXJuIFN0YXR1cyA7CiB9CiAKLUlOVCBDb3JydXB0RFNEU2lnKFBNSU5JX0FEQVBURVIgQWRhcHRlciwgRkxBU0gyWF9TRUNUSU9OX1ZBTCBlRmxhc2gyeFNlY3Rpb25WYWwpCitzdGF0aWMgSU5UIENvcnJ1cHREU0RTaWcoUE1JTklfQURBUFRFUiBBZGFwdGVyLCBGTEFTSDJYX1NFQ1RJT05fVkFMIGVGbGFzaDJ4U2VjdGlvblZhbCkKIHsKIAogCVBVQ0hBUiBwQnVmZiA9IE5VTEw7CkBAIC01NTQzLDE2ICs1MTM1LDE2IEBACiAJZWxzZQogCXsKIAkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCJCQ00gU2lnbmF0dXJlIGlzIG5vdCBwcmVzZW50IGluIGhlYWRlciIpOwotCQliY21fa2ZyZWUocEJ1ZmYpOworCQlrZnJlZShwQnVmZik7CiAJCXJldHVybiBTVEFUVVNfRkFJTFVSRTsKIAl9CiAKLQliY21fa2ZyZWUocEJ1ZmYpOworCWtmcmVlKHBCdWZmKTsKIAlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIE5WTV9SVywgREJHX0xWTF9BTEwsIkNvcnJ1cHRlZCB0aGUgc2lnbmF0dXJlIik7CiAJcmV0dXJuIFNUQVRVU19TVUNDRVNTIDsKIH0KIAotSU5UIENvcnJ1cHRJU09TaWcoUE1JTklfQURBUFRFUiBBZGFwdGVyLCBGTEFTSDJYX1NFQ1RJT05fVkFMIGVGbGFzaDJ4U2VjdGlvblZhbCkKK3N0YXRpYyBJTlQgQ29ycnVwdElTT1NpZyhQTUlOSV9BREFQVEVSIEFkYXB0ZXIsIEZMQVNIMlhfU0VDVElPTl9WQUwgZUZsYXNoMnhTZWN0aW9uVmFsKQogewogCiAJUFVDSEFSIHBCdWZmID0gTlVMTDsKQEAgLTU1OTMsMTQgKzUxODUsMTQgQEAKIAllbHNlCiAJewogCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsIkJDTSBTaWduYXR1cmUgaXMgbm90IHByZXNlbnQgaW4gaGVhZGVyIik7Ci0JCWJjbV9rZnJlZShwQnVmZik7CisJCWtmcmVlKHBCdWZmKTsKIAkJcmV0dXJuIFNUQVRVU19GQUlMVVJFOwogCX0KIAogCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX09USEVSUywgTlZNX1JXLCBEQkdfTFZMX0FMTCwiQ29ycnVwdGVkIHRoZSBzaWduYXR1cmUiKTsKIAlCQ01fREVCVUdfUFJJTlRfQlVGRkVSKEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBOVk1fUlcsIERCR19MVkxfQUxMLHBCdWZmLE1BWF9SV19TSVpFKTsKIAotCWJjbV9rZnJlZShwQnVmZik7CisJa2ZyZWUocEJ1ZmYpOwogCXJldHVybiBTVEFUVVNfU1VDQ0VTUyA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iY20vbnZtLmggYi9kcml2ZXJzL3N0YWdpbmcvYmNtL252bS5oCmluZGV4IDZlYzZjYTguLjY1MWI1YTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9iY20vbnZtLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JjbS9udm0uaApAQCAtMzIzLDE1ICszMjMsNiBAQAogCiAKIAotI2lmZGVmIEJDTV9TSE1fSU5URVJGQUNFCi0KLSNkZWZpbmUgRkxBU0hfQUREUl9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAweDFGMDAwMDAwCi1leHRlcm4gaW50IGJjbWZsYXNoX3Jhd19yZWFkKHVuc2lnbmVkIGludCBmbGFzaF9pZCwgdW5zaWduZWQgaW50IG9mZnNldCwgdW5zaWduZWQgY2hhciAqaW5idWYsIHVuc2lnbmVkIGludCBsZW4pOwotZXh0ZXJuIGludCBiY21mbGFzaF9yYXdfd3JpdGUodW5zaWduZWQgaW50IGZsYXNoX2lkLCB1bnNpZ25lZCBpbnQgb2Zmc2V0LCB1bnNpZ25lZCBjaGFyICpvdXRidWYsIHVuc2lnbmVkIGludCBsZW4pOwotZXh0ZXJuIGludCBiY21mbGFzaF9yYXdfd3JpdGVub2VyYXNlKHVuc2lnbmVkIGludCBmbGFzaF9pZCwgdW5zaWduZWQgaW50IG9mZnNldCwgdW5zaWduZWQgY2hhciAqb3V0YnVmLCB1bnNpZ25lZCBpbnQgbGVuKTsKLQotCi0jZW5kaWYKIAogI2RlZmluZSBGTEFTSF9DT05USUdJT1VTX1NUQVJUX0FERFJfQUZURVJfSU5JVCAgIDB4MUMwMDAwMDAKICNkZWZpbmUgRkxBU0hfQ09OVElHSU9VU19TVEFSVF9BRERSX0JFRk9SRV9JTklUICAweDFGMDAwMDAwCkBAIC00MTQsNzYgKzQwNSw1IEBACiAKICNkZWZpbmUgRklFTERfT0ZGU0VUX0lOX0hFQURFUihIZWFkZXJQb2ludGVyLEZpZWxkKSAoKFBVQ0hBUikmKChIZWFkZXJQb2ludGVyKShOVUxMKSktPkZpZWxkIC0gKFBVQ0hBUikoTlVMTCkpCiAKLSNpZiAwCi1JTlQgQmVjZWVtRUVQUk9NQnVsa1JlYWQoCi0JUE1JTklfQURBUFRFUiBBZGFwdGVyLAotCVBVSU5UIHBCdWZmZXIsCi0JVUlOVCB1aU9mZnNldCwKLQlVSU5UIHVpTnVtQnl0ZXMpOwotCi0KLUlOVCBCZWNlZW1GbGFzaEJ1bGtSZWFkKAotCVBNSU5JX0FEQVBURVIgQWRhcHRlciwKLQlQVUlOVCBwQnVmZmVyLAotCVVJTlQgdWlPZmZzZXQsCi0JVUlOVCB1aU51bUJ5dGVzKTsKLQotVUlOVCBCY21HZXRFRVBST01TaXplKFBNSU5JX0FEQVBURVIgQWRhcHRlcik7Ci0KLVVJTlQgQmNtR2V0Rmxhc2hTaXplKFBNSU5JX0FEQVBURVIgQWRhcHRlcik7Ci0KLVVJTlQgQmNtR2V0Rmxhc2hTZWN0b3JTaXplKFBNSU5JX0FEQVBURVIgQWRhcHRlcik7Ci0KLQotCi1JTlQgQmVjZWVtRmxhc2hCdWxrV3JpdGUoCi0JUE1JTklfQURBUFRFUiBBZGFwdGVyLAotCVBVSU5UIHBCdWZmZXIsCi0JVUlOVCB1aU9mZnNldCwKLQlVSU5UIHVpTnVtQnl0ZXMsCi0JQk9PTEVBTiBiVmVyaWZ5KTsKLQotSU5UIFByb3BhZ2F0ZUNhbFBhcmFtc0Zyb21GbGFzaFRvTWVtb3J5KFBNSU5JX0FEQVBURVIgQWRhcHRlcik7Ci0KLUlOVCBQcm9wYWdhdGVDYWxQYXJhbXNGcm9tRUVQUk9NVG9NZW1vcnkoUE1JTklfQURBUFRFUiBBZGFwdGVyKTsKLQotCi1JTlQgQmVjZWVtRUVQUk9NQnVsa1dyaXRlKAotCVBNSU5JX0FEQVBURVIgQWRhcHRlciwKLQlQVUNIQVIgcEJ1ZmZlciwKLQlVSU5UIHVpT2Zmc2V0LAotCVVJTlQgdWlOdW1CeXRlcywKLQlCT09MRUFOIGJWZXJpZnkpOwotCi0KLUlOVCBSZWFkQmVjZWVtRUVQUk9NKFBNSU5JX0FEQVBURVIgQWRhcHRlcixVSU5UIGR3QWRkcmVzcywgVUlOVCAqcGR3RGF0YSk7Ci0KLU5WTV9UWVBFIEJjbUdldE52bVR5cGUoUE1JTklfQURBUFRFUiBBZGFwdGVyKTsKLQotSU5UIEJlY2VlbU5WTVJlYWQoCi0JUE1JTklfQURBUFRFUiBBZGFwdGVyLAotCVBVSU5UIHBCdWZmZXIsCi0JVUlOVCB1aU9mZnNldCwKLQlVSU5UIHVpTnVtQnl0ZXMpOwotCi1JTlQgQmVjZWVtTlZNV3JpdGUoCi0JUE1JTklfQURBUFRFUiBBZGFwdGVyLAotCVBVSU5UIHBCdWZmZXIsCi0JVUlOVCB1aU9mZnNldCwKLQlVSU5UIHVpTnVtQnl0ZXMsCi0JQk9PTEVBTiBiVmVyaWZ5KTsKLQotSU5UIFJlYWRNYWNBZGRyZXNzRnJvbUVFUFJPTShQTUlOSV9BREFQVEVSIEFkYXB0ZXIpOwotCi1JTlQgQmNtVXBkYXRlU2VjdG9yU2l6ZShQTUlOSV9BREFQVEVSIEFkYXB0ZXIsVUlOVCB1aVNlY3RvclNpemUpOwotCi1JTlQgQmNtSW5pdE5WTShQTUlOSV9BREFQVEVSIEFkYXB0ZXIpOwotCi1WT0lEIEJjbVZhbGlkYXRlTnZtVHlwZShQTUlOSV9BREFQVEVSIEFkYXB0ZXIpOwotCi1WT0lEIEJjbUdldEZsYXNoQ1NJbmZvKFBNSU5JX0FEQVBURVIgQWRhcHRlcik7Ci0KLSNlbmRpZgotCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JjbS9vc2FsX21pc2MuaCBiL2RyaXZlcnMvc3RhZ2luZy9iY20vb3NhbF9taXNjLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmNGFkZGUuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JjbS9vc2FsX21pc2MuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLQkvKisrCi0KLQlDb3B5cmlnaHQgKGMpIEJlY2VlbSBDb21tdW5pY2F0aW9ucyBJbmMuCi0KLQlNb2R1bGUgTmFtZToKLQkJT1NBTF9NaXNjLmgKLQotCUFic3RyYWN0OgotCQlQcm92aWRlcyB0aGUgT1MgQWJzdHJhY3RlZCBtYWNyb3MgdG8gYWNjZXNzOgotCQkJTGlua2VkIExpc3RzCi0JCQlEaXNwYXRjaGVyIE9iamVjdHMoRXZlbnRzLFNlbWFwaG9yZXMsU3BpbiBMb2NrcyBhbmQgdGhlIGxpa2UpCi0JCQlGaWxlcwotCi0KLQlSZXZpc2lvbiBIaXN0b3J5OgotCQlXaG8gICAgICAgICBXaGVuICAgICAgICBXaGF0Ci0JCS0tLS0tLS0tICAgIC0tLS0tLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkJTmFtZQkJRGF0ZQkJQ3JlYXRlZC9yZXZpZXdlZC9tb2RpZmllZAotCQlSYWplZXYJCTI0LzEvMDgJCUNyZWF0ZWQKLQlOb3RlczoKLQotCS0tKi8KLSNpZm5kZWYgX09TQUxfTUlTQ19IXwotI2RlZmluZSBfT1NBTF9NSVNDX0hfCi0vL09TQUwgTWFjcm9zCi0vL09TQUwgUHJpbWl0aXZlcwotdHlwZWRlZiBQVUNIQVIgIFBPU0FMX05XX1BBQ0tFVCAgOwkJLy9OdyBwYWNrZXRzCi0KLQotI2RlZmluZSBPc2FsTWVtQWxsb2Mobix0KSBrbWFsbG9jKG4sR0ZQX0tFUk5FTCkKLQotI2RlZmluZSBPc2FsTWVtRnJlZSh4LG4pIGJjbV9rZnJlZSh4KQotCi0jZGVmaW5lIE9zYWxNZW1Nb3ZlKGRlc3QsIHNyYywgbGVuKQkJXAotewkJCQkJCQkJCQlcCi0JCQltZW1jcHkoZGVzdCxzcmMsIGxlbik7CQlcCi19Ci0KLSNkZWZpbmUgT3NhbFplcm9NZW1vcnkocERlc3QsIExlbikJCVwKLXsJCQkJCQkJCQkJXAotCQkJbWVtc2V0KHBEZXN0LDAsTGVuKTsJCVwKLX0KLQotLy8jZGVmaW5lIE9zYWxNZW1TZXQocFNyYyxDaGFyLExlbikgbWVtc2V0KHBTcmMsQ2hhcixMZW4pCi0KLWJvb2wgT3NhbE1lbUNvbXBhcmUodm9pZCAqZGVzdCwgdm9pZCAqc3JjLCBVSU5UIGxlbik7Ci0KLSNlbmRpZgotCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL1JFQURNRSBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvUkVBRE1FCmluZGV4IGEyN2JiMGIuLjk5ZTY3NjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvUkVBRE1FCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvUkVBRE1FCkBAIC00MywxNCArNDMsOCBAQAogCWh0dHA6Ly9naXQua2VybmVsLm9yZy8/cD1saW51eC9rZXJuZWwvZ2l0L2R3bXcyL2xpbnV4LWZpcm13YXJlLmdpdAogCWh0dHBzOi8vZ2l0Lmtlcm5lbC5vcmcvP3A9bGludXgva2VybmVsL2dpdC9kd213Mi9saW51eC1maXJtd2FyZS5naXQKIAotRm9yIGFsbCBjaGlwcywgY29weSBicmNtL2JjbTQzeHgtMC02MTAtODA5LTAuZncgYW5kCi1icmNtL2JjbTQzeHhfaGRyLTAtNjEwLTgwOS0wLmZ3IHRvIC9saWIvZmlybXdhcmUvYnJjbSAob3Igd2hlcmV2ZXIgZmlybXdhcmUgaXMKLW5vcm1hbGx5IGluc3RhbGxlZCBvbiB0aGUgc3lzdGVtKS4gIEluIHRoZSAvbGliL2Zpcm13YXJlL2JyY20gZGlyZWN0b3J5LCB0aGVuCi1jcmVhdGUgdGhlIGZvbGxvd2luZyBzeW1saW5rczoKLQotCWxuIC1zIGJjbTQzeHgtMC02MTAtODA5LTAuZncgYmNtNDN4eC0wLmZ3Ci0JbG4gLXMgYmNtNDN4eF9oZHItMC02MTAtODA5LTAuZncgYmNtNDN4eF9oZHItMC5mdwotCitGb3IgYWxsIGNoaXBzLCBjb3B5IGJyY20vYmNtNDN4eC0wLmZ3IGFuZCBicmNtL2JjbTQzeHhfaGRyLTAuZncgdG8KKy9saWIvZmlybXdhcmUvYnJjbSAob3Igd2hlcmV2ZXIgZmlybXdhcmUgaXMgbm9ybWFsbHkgaW5zdGFsbGVkIG9uIHlvdXIgc3lzdGVtKS4KIAogQ3VycmVudGx5IHN1cHBvcnRlZCBjaGlwcwogPT09PT09PT09PT09PT0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbWZtYWMvUkVBRE1FIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtZm1hYy9SRUFETUUKaW5kZXggNDM2MDFmYS4uYmUyOWU0MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtZm1hYy9SRUFETUUKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtZm1hYy9SRUFETUUKQEAgLTI1LDggKzI1LDkgQEAKIAlodHRwOi8vZ2l0Lmtlcm5lbC5vcmcvP3A9bGludXgva2VybmVsL2dpdC9kd213Mi9saW51eC1maXJtd2FyZS5naXQKIAlodHRwczovL2dpdC5rZXJuZWwub3JnLz9wPWxpbnV4L2tlcm5lbC9naXQvZHdtdzIvbGludXgtZmlybXdhcmUuZ2l0CiAKLUZvciA0MzI5IGNoaXAsIGNvcHkgYnJjbS9iY200MzI5LWZ1bGxtYWMtNC0yMTgtMjQ4LTUuYmluIGFuZAotYmNtNDMyOS1mdWxsbWFjLTQtMjE4LTI0OC01LnR4dCB0byAvbGliL2Zpcm13YXJlL2JyY20KK0ZvciA0MzI5IGNoaXAsIGNvcHkgYnJjbS9iY200MzI5LWZ1bGxtYWMtNC5iaW4gYW5kIGJyY20vYmNtNDMyOS1mdWxsbWFjLTQudHh0Cit0byAvbGliL2Zpcm13YXJlL2JyY20gKG9yIHdoZXJldmVyIGZpcm13YXJlIGlzIG5vcm1hbGx5IGluc3RhbGxlZCBvbiB5b3VyCitzeXN0ZW0pLgogCiBDb250YWN0IEluZm86CiA9PT09PT09PT09PT09CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2JyY21mbWFjL2JjbXNkaC5jIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtZm1hYy9iY21zZGguYwppbmRleCA0YzYxM2RhLi5hY2Y0M2EzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2JyY21mbWFjL2JjbXNkaC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbWZtYWMvYmNtc2RoLmMKQEAgLTE2LDEzICsxNiwxNCBAQAogLyogKioqKioqKioqKioqKioqKioqIEJDTVNESCBJbnRlcmZhY2UgRnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KICNpbmNsdWRlIDxiY21kZWZzLmg+CiAjaW5jbHVkZSA8YmNtZGV2cy5oPgogI2luY2x1ZGUgPGJjbWVuZGlhbi5oPgorI2luY2x1ZGUgPG9zbC5oPgogI2luY2x1ZGUgPGJjbXV0aWxzLmg+CiAjaW5jbHVkZSA8aG5kc29jLmg+CiAjaW5jbHVkZSA8c2l1dGlscy5oPgotI2luY2x1ZGUgPG9zbC5oPgogCiAjaW5jbHVkZSA8YmNtc2RoLmg+CQkvKiBCUkNNIEFQSSBmb3IgU0RJTwogCQkJIGNsaWVudHMgKHN1Y2ggYXMgd2wsIGRoZCkgKi8KQEAgLTM4LDcgKzM5LDcgQEAKIAlib29sIGluaXRfc3VjY2VzczsJLyogdW5kZXJseWluZyBkcml2ZXIgc3VjY2Vzc2Z1bGx5IGF0dGFjaGVkICovCiAJdm9pZCAqc2Rpb2g7CQkvKiBoYW5kbGVyIGZvciBzZGlvaCAqLwogCXUzMiB2ZW5kZXZpZDsJLyogVGFyZ2V0IFZlbmRvciBhbmQgRGV2aWNlIElEIG9uIFNEIGJ1cyAqLwotCW9zbF90ICpvc2g7CisJc3RydWN0IG9zbF9pbmZvICpvc2g7CiAJYm9vbCByZWdmYWlsOwkJLyogU2F2ZSBzdGF0dXMgb2YgbGFzdAogCQkJCSByZWdfcmVhZC9yZWdfd3JpdGUgY2FsbCAqLwogCXUzMiBzYndhZDsJCS8qIFNhdmUgYmFja3BsYW5lIHdpbmRvdyBhZGRyZXNzICovCkBAIC01NSw3ICs1Niw4IEBACiB9CiAjZW5kaWYKIAotYmNtc2RoX2luZm9fdCAqYmNtc2RoX2F0dGFjaChvc2xfdCAqb3NoLCB2b2lkICpjZmdoZGwsIHZvaWQgKipyZWdzdmEsIHVpbnQgaXJxKQorYmNtc2RoX2luZm9fdCAqYmNtc2RoX2F0dGFjaChzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgdm9pZCAqY2ZnaGRsLAorCQkJCXZvaWQgKipyZWdzdmEsIHVpbnQgaXJxKQogewogCWJjbXNkaF9pbmZvX3QgKmJjbXNkaDsKIApAQCAtODQsNyArODYsNyBAQAogCXJldHVybiBiY21zZGg7CiB9CiAKLWludCBiY21zZGhfZGV0YWNoKG9zbF90ICpvc2gsIHZvaWQgKnNkaCkKK2ludCBiY21zZGhfZGV0YWNoKHN0cnVjdCBvc2xfaW5mbyAqb3NoLCB2b2lkICpzZGgpCiB7CiAJYmNtc2RoX2luZm9fdCAqYmNtc2RoID0gKGJjbXNkaF9pbmZvX3QgKikgc2RoOwogCkBAIC00NTEsNyArNDUzLDcgQEAKIAogaW50CiBiY21zZGhfcmVjdl9idWYodm9pZCAqc2RoLCB1MzIgYWRkciwgdWludCBmbiwgdWludCBmbGFncywKLQkJdTggKmJ1ZiwgdWludCBuYnl0ZXMsIHZvaWQgKnBrdCwKKwkJdTggKmJ1ZiwgdWludCBuYnl0ZXMsIHN0cnVjdCBza19idWZmICpwa3QsCiAJCWJjbXNkaF9jbXBsdF9mbl90IGNvbXBsZXRlLCB2b2lkICpoYW5kbGUpCiB7CiAJYmNtc2RoX2luZm9fdCAqYmNtc2RoID0gKGJjbXNkaF9pbmZvX3QgKikgc2RoOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtZm1hYy9iY21zZGhfbGludXguYyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbWZtYWMvYmNtc2RoX2xpbnV4LmMKaW5kZXggOTAyOGNkMC4uZDI0YjVlNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtZm1hYy9iY21zZGhfbGludXguYworKysgYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2JyY21mbWFjL2JjbXNkaF9saW51eC5jCkBAIC0yMCw4ICsyMCw3IEBACiAKICNkZWZpbmUgX19VTkRFRl9OT19WRVJTSU9OX18KIAotI2luY2x1ZGUgPGxpbnV4dmVyLmg+Ci0KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+CiAKQEAgLTU3LDcgKzU2LDcgQEAKICNlbHNlCiAJc3RydWN0IHBjaV9kZXYgKmRldjsJLyogcGNpIGRldmljZSBoYW5kbGUgKi8KICNlbmRpZgkJCQkvKiBCQ01QTEFURk9STV9CVVMgKi8KLQlvc2xfdCAqb3NoOworCXN0cnVjdCBvc2xfaW5mbyAqb3NoOwogCXZvaWQgKnJlZ3M7CQkvKiBTRElPIEhvc3QgQ29udHJvbGxlciBhZGRyZXNzICovCiAJYmNtc2RoX2luZm9fdCAqc2RoOwkvKiBTRElPIEhvc3QgQ29udHJvbGxlciBoYW5kbGUgKi8KIAl2b2lkICpjaDsKQEAgLTEzOSwyMiArMTM4LDExIEBACiAjZW5kaWYJCQkJLyogQkNNTFhTRE1NQyAqLwogCiAjaWZuZGVmIEJDTUxYU0RNTUMKLXN0YXRpYyBzdHJ1Y3QgZGV2aWNlX2RyaXZlciBiY21zZGhfZHJpdmVyID0gewotCS5uYW1lID0gInB4YTJ4eC1tY2kiLAotCS5idXMgPSAmcGxhdGZvcm1fYnVzX3R5cGUsCi0JLnByb2JlID0gYmNtc2RoX3Byb2JlLAotCS5yZW1vdmUgPSBiY21zZGhfcmVtb3ZlLAotCS5zdXNwZW5kID0gTlVMTCwKLQkucmVzdW1lID0gTlVMTCwKLX07Ci0jZW5kaWYJCQkJLyogQkNNTFhTRE1NQyAqLwotCi0jaWZuZGVmIEJDTUxYU0RNTUMKIHN0YXRpYwogI2VuZGlmCQkJCS8qIEJDTUxYU0RNTUMgKi8KIGludCBiY21zZGhfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2KQogewotCW9zbF90ICpvc2ggPSBOVUxMOworCXN0cnVjdCBvc2xfaW5mbyAqb3NoID0gTlVMTDsKIAliY21zZGhfaGNfdCAqc2RoYyA9IE5VTEw7CiAJdW5zaWduZWQgbG9uZyByZWdzID0gMDsKIAliY21zZGhfaW5mb190ICpzZGggPSBOVUxMOwpAQCAtMTg5LDcgKzE3Nyw3IEBACiAJfQogI2VuZGlmCQkJCS8qIGRlZmluZWQoT09CX0lOVFJfT05MWSkgKi8KIAkvKiBhbGxvY2F0ZSBTRElPIEhvc3QgQ29udHJvbGxlciBzdGF0ZSBpbmZvICovCi0Jb3NoID0gb3NsX2F0dGFjaChkZXYsIFBDSV9CVVMsIGZhbHNlKTsKKwlvc2ggPSBvc2xfYXR0YWNoKGRldiwgUENJX0JVUyk7CiAJaWYgKCFvc2gpIHsKIAkJU0RMWF9NU0coKCIlczogb3NsX2F0dGFjaCBmYWlsZWRcbiIsIF9fZnVuY19fKSk7CiAJCWdvdG8gZXJyOwpAQCAtMjU4LDcgKzI0Niw3IEBACiBpbnQgYmNtc2RoX3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJYmNtc2RoX2hjX3QgKnNkaGMsICpwcmV2OwotCW9zbF90ICpvc2g7CisJc3RydWN0IG9zbF9pbmZvICpvc2g7CiAKIAlzZGhjID0gc2RoY2luZm87CiAJZHJ2aW5mby5kZXRhY2goc2RoYy0+Y2gpOwpAQCAtMjkxLDI2OSArMjc5LDIzIEBACiAKIAlyZXR1cm4gMDsKIH0KLQotI2Vsc2UJCQkJLyogQkNNUExBVEZPUk1fQlVTICovCi0KLSNpZiAhZGVmaW5lZChCQ01MWFNETU1DKQotLyogZm9yd2FyZCBkZWNsYXJhdGlvbnMgZm9yIFBDSSBwcm9iZSBhbmQgcmVtb3ZlIGZ1bmN0aW9ucy4gKi8KLXN0YXRpYyBpbnQgX19kZXZpbml0IGJjbXNkaF9wY2lfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsCi0JCQkJICAgICAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCk7Ci1zdGF0aWMgdm9pZCBfX2RldmV4aXQgYmNtc2RoX3BjaV9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpOwotCi0vKioKLSAqIHBjaSBpZCB0YWJsZQotICovCi1zdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgYmNtc2RoX3BjaV9kZXZpZFtdIF9fZGV2aW5pdGRhdGEgPSB7Ci17Ci0JLnZlbmRvciA9IFBDSV9BTllfSUQsCi0JLmRldmljZSA9IFBDSV9BTllfSUQsCi0JLnN1YnZlbmRvciA9IFBDSV9BTllfSUQsCi0JLnN1YmRldmljZSA9IFBDSV9BTllfSUQsCi0JLmNsYXNzID0gMCwKLQkuY2xhc3NfbWFzayA9IDAsCi0JLmRyaXZlcl9kYXRhID0gMCwKLX0sCi17MCx9Ci19OwotCi1NT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgYmNtc2RoX3BjaV9kZXZpZCk7Ci0KLS8qKgotICogU0RJTyBIb3N0IENvbnRyb2xsZXIgcGNpIGRyaXZlciBpbmZvCi0gKi8KLXN0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBiY21zZGhfcGNpX2RyaXZlciA9IHsKLQkubm9kZSA9IHt9LAotCS5uYW1lID0gImJjbXNkaCIsCi0JLmlkX3RhYmxlID0gYmNtc2RoX3BjaV9kZXZpZCwKLQkucHJvYmUgPSBiY21zZGhfcGNpX3Byb2JlLAotCS5yZW1vdmUgPSBiY21zZGhfcGNpX3JlbW92ZSwKLQkuc3VzcGVuZCA9IE5VTEwsCi0JLnJlc3VtZSA9IE5VTEwsCi19OwotCi1leHRlcm4gdWludCBzZF9wY2lfc2xvdDsJLyogRm9yY2UgZGV0ZWN0aW9uIHRvIGEgcGFydGljdWxhciBQQ0kgKi8KLQkJCQkvKiBzbG90IG9ubHkgLiBBbGxvd3MgZm9yIGhhdmluZyBtdWx0aXBsZSAqLwotCQkJCS8qIFdMIGRldmljZXMgYXQgb25jZSBpbiBhIFBDICovCi0JCQkJLyogT25seSBvbmUgaW5zdGFuY2Ugb2YgZGhkIHdpbGwgYmUgKi8KLQkJCQkvKiB1c2FibGUgYXQgYSB0aW1lICovCi0JCQkJLyogVXBwZXIgd29yZCBpcyBidXMgbnVtYmVyLCAqLwotCQkJCS8qIGxvd2VyIHdvcmQgaXMgc2xvdCBudW1iZXIgKi8KLQkJCQkvKiBEZWZhdWx0IHZhbHVlIG9mIDB4RkZGRmZmZmYgdHVybnMgdGhpcyAqLwotCQkJCS8qIG9mZiAqLwotbW9kdWxlX3BhcmFtKHNkX3BjaV9zbG90LCB1aW50LCAwKTsKLQotLyoqCi0gKiBEZXRlY3Qgc3VwcG9ydGVkIFNESU8gSG9zdCBDb250cm9sbGVyIGFuZCBhdHRhY2ggaWYgZm91bmQuCi0gKgotICogRGV0ZXJtaW5lIGlmIHRoZSBkZXZpY2UgZGVzY3JpYmVkIGJ5IHBkZXYgaXMgYSBzdXBwb3J0ZWQgU0RJTyBIb3N0Ci0gKiBDb250cm9sbGVyLiAgSWYgc28sIGF0dGFjaCB0byBpdCBhbmQgYXR0YWNoIHRvIHRoZSB0YXJnZXQgZGV2aWNlLgotICovCi1zdGF0aWMgaW50IF9fZGV2aW5pdAotYmNtc2RoX3BjaV9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKLXsKLQlvc2xfdCAqb3NoID0gTlVMTDsKLQliY21zZGhfaGNfdCAqc2RoYyA9IE5VTEw7Ci0JdW5zaWduZWQgbG9uZyByZWdzOwotCWJjbXNkaF9pbmZvX3QgKnNkaCA9IE5VTEw7Ci0JaW50IHJjOwotCi0JaWYgKHNkX3BjaV9zbG90ICE9IDB4RkZGRmZmZmYpIHsKLQkJaWYgKHBkZXYtPmJ1cy0+bnVtYmVyICE9IChzZF9wY2lfc2xvdCA+PiAxNikgfHwKLQkJICAgIFBDSV9TTE9UKHBkZXYtPmRldmZuKSAhPSAoc2RfcGNpX3Nsb3QgJiAweGZmZmYpKSB7Ci0JCQlTRExYX01TRygoIiVzOiAlczogYnVzICVYLCBzbG90ICVYLCB2ZW5kICVYLCBkZXYgJVhcbiIsCi0JCQkJICBfX2Z1bmNfXywKLQkJCQkgIGJjbXNkaF9jaGlwbWF0Y2gocGRldi0+dmVuZG9yLCBwZGV2LT5kZXZpY2UpID8KLQkJCQkgICJGb3VuZCBjb21wYXRpYmxlIFNESU9IQyIgOgotCQkJCSAgIlByb2JpbmcgdW5rbm93biBkZXZpY2UiLAotCQkJCSAgcGRldi0+YnVzLT5udW1iZXIsIFBDSV9TTE9UKHBkZXYtPmRldmZuKSwKLQkJCQkgIHBkZXYtPnZlbmRvciwgcGRldi0+ZGV2aWNlKSk7Ci0JCQlyZXR1cm4gLUVOT0RFVjsKLQkJfQotCQlTRExYX01TRygoIiVzOiAlczogYnVzICVYLCBzbG90ICVYLCB2ZW5kb3IgJVgsIGRldmljZSAlWCAiCi0JCQkiKGdvb2QgUENJIGxvY2F0aW9uKVxuIiwgX19mdW5jX18sCi0JCQliY21zZGhfY2hpcG1hdGNoKHBkZXYtPnZlbmRvciwgcGRldi0+ZGV2aWNlKSA/Ci0JCQkiVXNpbmcgY29tcGF0aWJsZSBTRElPSEMiIDogIldBUk5JTkcsIGZvcmNlZCB1c2UgIgotCQkJIm9mIHVua293biBkZXZpY2UiLAotCQlwZGV2LT5idXMtPm51bWJlciwgUENJX1NMT1QocGRldi0+ZGV2Zm4pLCBwZGV2LT52ZW5kb3IsCi0JCXBkZXYtPmRldmljZSkpOwotCX0KLQotCWlmICgocGRldi0+dmVuZG9yID09IFZFTkRPUl9USSkKLQkgICAgJiYgKChwZGV2LT5kZXZpY2UgPT0gUENJWFgyMV9GTEFTSE1FRElBX0lEKQotCQl8fCAocGRldi0+ZGV2aWNlID09IFBDSVhYMjFfRkxBU0hNRURJQTBfSUQpKSkgewotCQl1MzIgY29uZmlnX3JlZzsKLQotCQlTRExYX01TRygoIiVzOiBEaXNhYmxpbmcgVEkgRmxhc2hNZWRpYSBDb250cm9sbGVyLlxuIiwKLQkJCSAgX19mdW5jX18pKTsKLQkJb3NoID0gb3NsX2F0dGFjaChwZGV2LCBQQ0lfQlVTLCBmYWxzZSk7Ci0JCWlmICghb3NoKSB7Ci0JCQlTRExYX01TRygoIiVzOiBvc2xfYXR0YWNoIGZhaWxlZFxuIiwgX19mdW5jX18pKTsKLQkJCWdvdG8gZXJyOwotCQl9Ci0KLQkJY29uZmlnX3JlZyA9IE9TTF9QQ0lfUkVBRF9DT05GSUcob3NoLCAweDRjLCA0KTsKLQotCQkvKgotCQkgKiBTZXQgTU1DX1NEX0RJUyBiaXQgaW4gRmxhc2hNZWRpYSBDb250cm9sbGVyLgotCQkgKiBEaXNibGluZyB0aGUgU0QvTU1DIENvbnRyb2xsZXIgaW4gdGhlIEZsYXNoTWVkaWEgQ29udHJvbGxlcgotCQkgKiBhbGxvd3MgdGhlIFN0YW5kYXJkIFNEIEhvc3QgQ29udHJvbGxlciB0byB0YWtlIG92ZXIgY29udHJvbAotCQkgKiBvZiB0aGUgU0QgU2xvdC4KLQkJICovCi0JCWNvbmZpZ19yZWcgfD0gMHgwMjsKLQkJT1NMX1BDSV9XUklURV9DT05GSUcob3NoLCAweDRjLCA0LCBjb25maWdfcmVnKTsKLQkJb3NsX2RldGFjaChvc2gpOwotCX0KLQkvKiBtYXRjaCB0aGlzIHBjaSBkZXZpY2Ugd2l0aCB3aGF0IHdlIHN1cHBvcnQgKi8KLQkvKiB3ZSBjYW4ndCBzb2xlbHkgcmVseSBvbiB0aGlzIHRvIGJlbGlldmUgaXQgaXMKLQkJb3VyIFNESU8gSG9zdCBDb250cm9sbGVyISAqLwotCWlmICghYmNtc2RoX2NoaXBtYXRjaChwZGV2LT52ZW5kb3IsIHBkZXYtPmRldmljZSkpCi0JCXJldHVybiAtRU5PREVWOwotCi0JLyogdGhpcyBpcyBhIHBjaSBkZXZpY2Ugd2UgbWlnaHQgc3VwcG9ydCAqLwotCVNETFhfTVNHKCgiJXM6IEZvdW5kIHBvc3NpYmxlIFNESU8gSG9zdCBDb250cm9sbGVyOiAiCi0JCSJidXMgJWQgc2xvdCAlZCBmdW5jICVkIGlycSAlZFxuIiwgX19mdW5jX18sCi0JCXBkZXYtPmJ1cy0+bnVtYmVyLCBQQ0lfU0xPVChwZGV2LT5kZXZmbiksCi0JCVBDSV9GVU5DKHBkZXYtPmRldmZuKSwgcGRldi0+aXJxKSk7Ci0KLQkvKiB1c2UgYmNtc2RoX3F1ZXJ5X2RldmljZSgpIHRvIGdldCB0aGUgdmVuZG9yIElEIG9mIHRoZSB0YXJnZXQgZGV2aWNlCi0JICogc28gaXQgd2lsbCBldmVudHVhbGx5IGFwcGVhciBpbiB0aGUgQnJvYWRjb20gc3RyaW5nIG9uIHRoZSBjb25zb2xlCi0JICovCi0KLQkvKiBhbGxvY2F0ZSBTRElPIEhvc3QgQ29udHJvbGxlciBzdGF0ZSBpbmZvICovCi0Jb3NoID0gb3NsX2F0dGFjaChwZGV2LCBQQ0lfQlVTLCBmYWxzZSk7Ci0JaWYgKCFvc2gpIHsKLQkJU0RMWF9NU0coKCIlczogb3NsX2F0dGFjaCBmYWlsZWRcbiIsIF9fZnVuY19fKSk7Ci0JCWdvdG8gZXJyOwotCX0KLQlzZGhjID0ga3phbGxvYyhzaXplb2YoYmNtc2RoX2hjX3QpLCBHRlBfQVRPTUlDKTsKLQlpZiAoIXNkaGMpIHsKLQkJU0RMWF9NU0coKCIlczogb3V0IG9mIG1lbW9yeVxuIiwgX19mdW5jX18pKTsKLQkJZ290byBlcnI7Ci0JfQotCXNkaGMtPm9zaCA9IG9zaDsKLQotCXNkaGMtPmRldiA9IHBkZXY7Ci0KLQkvKiBtYXAgdG8gYWRkcmVzcyB3aGVyZSBob3N0IGNhbiBhY2Nlc3MgKi8KLQlwY2lfc2V0X21hc3RlcihwZGV2KTsKLQlyYyA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOwotCWlmIChyYykgewotCQlTRExYX01TRygoIiVzOiBDYW5ub3QgZW5hYmxlIFBDSSBkZXZpY2VcbiIsIF9fZnVuY19fKSk7Ci0JCWdvdG8gZXJyOwotCX0KLQlzZGggPSBiY21zZGhfYXR0YWNoKG9zaCwgKHZvaWQgKikodW5zaWduZWQgbG9uZylwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMCksCi0JCQkodm9pZCAqKikmcmVncywgcGRldi0+aXJxKTsKLQlpZiAoIXNkaCkgewotCQlTRExYX01TRygoIiVzOiBiY21zZGhfYXR0YWNoIGZhaWxlZFxuIiwgX19mdW5jX18pKTsKLQkJZ290byBlcnI7Ci0JfQotCi0Jc2RoYy0+c2RoID0gc2RoOwotCi0JLyogdHJ5IHRvIGF0dGFjaCB0byB0aGUgdGFyZ2V0IGRldmljZSAqLwotCXNkaGMtPmNoID0gZHJ2aW5mby5hdHRhY2goVkVORE9SX0JST0FEQ09NLCAvKiBwZGV2LT52ZW5kb3IsICovCi0JCQkJYmNtc2RoX3F1ZXJ5X2RldmljZShzZGgpICYgMHhGRkZGLCAwLCAwLCAwLCAwLAotCQkJCSh2b2lkICopcmVncywgTlVMTCwgc2RoKTsKLQlpZiAoIXNkaGMtPmNoKSB7Ci0JCVNETFhfTVNHKCgiJXM6IGRldmljZSBhdHRhY2ggZmFpbGVkXG4iLCBfX2Z1bmNfXykpOwotCQlnb3RvIGVycjsKLQl9Ci0KLQkvKiBjaGFpbiBTRElPIEhvc3QgQ29udHJvbGxlciBpbmZvIHRvZ2V0aGVyICovCi0Jc2RoYy0+bmV4dCA9IHNkaGNpbmZvOwotCXNkaGNpbmZvID0gc2RoYzsKLQotCXJldHVybiAwOwotCi0JLyogZXJyb3IgaGFuZGxpbmcgKi8KLWVycjoKLQlpZiAoc2RoYy0+c2RoKQotCQliY21zZGhfZGV0YWNoKHNkaGMtPm9zaCwgc2RoYy0+c2RoKTsKLQlpZiAoc2RoYykKLQkJa2ZyZWUoc2RoYyk7Ci0JaWYgKG9zaCkKLQkJb3NsX2RldGFjaChvc2gpOwotCXJldHVybiAtRU5PREVWOwotfQotCi0vKioKLSAqIERldGFjaCBmcm9tIHRhcmdldCBkZXZpY2VzIGFuZCBTRElPIEhvc3QgQ29udHJvbGxlcgotICovCi1zdGF0aWMgdm9pZCBfX2RldmV4aXQgYmNtc2RoX3BjaV9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCi17Ci0JYmNtc2RoX2hjX3QgKnNkaGMsICpwcmV2OwotCW9zbF90ICpvc2g7Ci0KLQkvKiBmaW5kIHRoZSBTRElPIEhvc3QgQ29udHJvbGxlciBzdGF0ZSBmb3IgdGhpcwotCQkgcGRldiBhbmQgdGFrZSBpdCBvdXQgZnJvbSB0aGUgbGlzdCAqLwotCWZvciAoc2RoYyA9IHNkaGNpbmZvLCBwcmV2ID0gTlVMTDsgc2RoYzsgc2RoYyA9IHNkaGMtPm5leHQpIHsKLQkJaWYgKHNkaGMtPmRldiA9PSBwZGV2KSB7Ci0JCQlpZiAocHJldikKLQkJCQlwcmV2LT5uZXh0ID0gc2RoYy0+bmV4dDsKLQkJCWVsc2UKLQkJCQlzZGhjaW5mbyA9IE5VTEw7Ci0JCQlicmVhazsKLQkJfQotCQlwcmV2ID0gc2RoYzsKLQl9Ci0JaWYgKCFzZGhjKQotCQlyZXR1cm47Ci0KLQlkcnZpbmZvLmRldGFjaChzZGhjLT5jaCk7Ci0KLQliY21zZGhfZGV0YWNoKHNkaGMtPm9zaCwgc2RoYy0+c2RoKTsKLQotCS8qIHJlbGVhc2UgU0RJTyBIb3N0IENvbnRyb2xsZXIgaW5mbyAqLwotCW9zaCA9IHNkaGMtPm9zaDsKLQlrZnJlZShzZGhjKTsKLQlvc2xfZGV0YWNoKG9zaCk7Ci19Ci0jZW5kaWYJCQkJLyogQkNNTFhTRE1NQyAqLwogI2VuZGlmCQkJCS8qIEJDTVBMQVRGT1JNX0JVUyAqLwogCiBleHRlcm4gaW50IHNkaW9fZnVuY3Rpb25faW5pdCh2b2lkKTsKIAogaW50IGJjbXNkaF9yZWdpc3RlcihiY21zZGhfZHJpdmVyX3QgKmRyaXZlcikKIHsKLQlpbnQgZXJyb3IgPSAwOwotCiAJZHJ2aW5mbyA9ICpkcml2ZXI7CiAKLSNpZiBkZWZpbmVkKEJDTVBMQVRGT1JNX0JVUykKLSNpZiBkZWZpbmVkKEJDTUxYU0RNTUMpCiAJU0RMWF9NU0coKCJMaW51eCBLZXJuZWwgU0RJTy9NTUMgRHJpdmVyXG4iKSk7Ci0JZXJyb3IgPSBzZGlvX2Z1bmN0aW9uX2luaXQoKTsKLSNlbHNlCi0JU0RMWF9NU0coKCJJbnRlbCBQWEEyNzAgU0RJTyBEcml2ZXJcbiIpKTsKLQllcnJvciA9IGRyaXZlcl9yZWdpc3RlcigmYmNtc2RoX2RyaXZlcik7Ci0jZW5kaWYJCQkJLyogZGVmaW5lZChCQ01MWFNETU1DKSAqLwotCXJldHVybiBlcnJvcjsKLSNlbmRpZgkJCQkvKiBkZWZpbmVkKEJDTVBMQVRGT1JNX0JVUykgKi8KLQotI2lmICFkZWZpbmVkKEJDTVBMQVRGT1JNX0JVUykgJiYgIWRlZmluZWQoQkNNTFhTRE1NQykKLQllcnJvciA9IHBjaV9yZWdpc3Rlcl9kcml2ZXIoJmJjbXNkaF9wY2lfZHJpdmVyKTsKLQlpZiAoIWVycm9yKQotCQlyZXR1cm4gMDsKLQotCVNETFhfTVNHKCgiJXM6IHBjaV9yZWdpc3Rlcl9kcml2ZXIgZmFpbGVkIDB4JXhcbiIsIF9fZnVuY19fLCBlcnJvcikpOwotI2VuZGlmCQkJCS8qIEJDTVBMQVRGT1JNX0JVUyAqLwotCi0JcmV0dXJuIGVycm9yOworCXJldHVybiBzZGlvX2Z1bmN0aW9uX2luaXQoKTsKIH0KIAogZXh0ZXJuIHZvaWQgc2Rpb19mdW5jdGlvbl9jbGVhbnVwKHZvaWQpOwogCiB2b2lkIGJjbXNkaF91bnJlZ2lzdGVyKHZvaWQpCiB7Ci0jaWYgZGVmaW5lZChCQ01QTEFURk9STV9CVVMpICYmICFkZWZpbmVkKEJDTUxYU0RNTUMpCi0JCWRyaXZlcl91bnJlZ2lzdGVyKCZiY21zZGhfZHJpdmVyKTsKLSNlbmRpZgotI2lmIGRlZmluZWQoQkNNTFhTRE1NQykKIAlzZGlvX2Z1bmN0aW9uX2NsZWFudXAoKTsKLSNlbmRpZgkJCQkvKiBCQ01MWFNETU1DICovCi0jaWYgIWRlZmluZWQoQkNNUExBVEZPUk1fQlVTKSAmJiAhZGVmaW5lZChCQ01MWFNETU1DKQotCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmYmNtc2RoX3BjaV9kcml2ZXIpOwotI2VuZGlmCQkJCS8qIEJDTVBMQVRGT1JNX0JVUyAqLwogfQogCiAjaWYgZGVmaW5lZChPT0JfSU5UUl9PTkxZKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtZm1hYy9iY21zZGhfc2RtbWMuYyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbWZtYWMvYmNtc2RoX3NkbW1jLmMKaW5kZXggZjZjOWM0NS4uZDM5OWI1YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtZm1hYy9iY21zZGhfc2RtbWMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2JyY21mbWFjL2JjbXNkaF9zZG1tYy5jCkBAIC0xNCwxMSArMTQsMTIgQEAKICAqIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCiAgKi8KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgogI2luY2x1ZGUgPGJjbWRlZnMuaD4KICNpbmNsdWRlIDxiY21kZXZzLmg+CiAjaW5jbHVkZSA8YmNtZW5kaWFuLmg+Ci0jaW5jbHVkZSA8YmNtdXRpbHMuaD4KICNpbmNsdWRlIDxvc2wuaD4KKyNpbmNsdWRlIDxiY211dGlscy5oPgogI2luY2x1ZGUgPHNkaW8uaD4JCS8qIFNESU8gRGV2aWNlIGFuZCBQcm90b2NvbCBTcGVjcyAqLwogI2luY2x1ZGUgPHNkaW9oLmg+CQkvKiBTRElPIEhvc3QgQ29udHJvbGxlciBTcGVjaWZpY2F0aW9uICovCiAjaW5jbHVkZSA8YmNtc2RidXMuaD4JCS8qIGJjbXNkaCB0by9mcm9tIHNwZWNpZmljIGNvbnRyb2xsZXIgQVBJcyAqLwpAQCAtMTExLDcgKzExMiw3IEBACiAvKgogICoJUHVibGljIGVudHJ5IHBvaW50cyAmIGV4dGVybidzCiAgKi8KLWV4dGVybiBzZGlvaF9pbmZvX3QgKnNkaW9oX2F0dGFjaChvc2xfdCAqb3NoLCB2b2lkICpiYXIwLCB1aW50IGlycSkKK2V4dGVybiBzZGlvaF9pbmZvX3QgKnNkaW9oX2F0dGFjaChzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgdm9pZCAqYmFyMCwgdWludCBpcnEpCiB7CiAJc2Rpb2hfaW5mb190ICpzZDsKIAlpbnQgZXJyX3JldDsKQEAgLTE3NCw3ICsxNzUsNyBAQAogCXJldHVybiBzZDsKIH0KIAotZXh0ZXJuIFNESU9IX0FQSV9SQyBzZGlvaF9kZXRhY2gob3NsX3QgKm9zaCwgc2Rpb2hfaW5mb190ICpzZCkKK2V4dGVybiBTRElPSF9BUElfUkMgc2Rpb2hfZGV0YWNoKHN0cnVjdCBvc2xfaW5mbyAqb3NoLCBzZGlvaF9pbmZvX3QgKnNkKQogewogCXNkX3RyYWNlKCgiJXNcbiIsIF9fZnVuY19fKSk7CiAKQEAgLTc1MCw3ICs3NTEsNyBAQAogCXNkX3RyYWNlKCgiJXM6IEZ1bmMgPSAlZFxuIiwgX19mdW5jX18sIGZ1bmMpKTsKIAogCWlmICghc2QtPmZ1bmNfY2lzX3B0cltmdW5jXSkgewotCQliemVybyhjaXMsIGxlbmd0aCk7CisJCW1lbXNldChjaXMsIDAsIGxlbmd0aCk7CiAJCXNkX2VycigoIiVzOiBubyBmdW5jX2Npc19wdHJbJWRdXG4iLCBfX2Z1bmNfXywgZnVuYykpOwogCQlyZXR1cm4gU0RJT0hfQVBJX1JDX0ZBSUw7CiAJfQpAQCAtOTI3LDEzICs5MjgsMTMgQEAKIAogc3RhdGljIFNESU9IX0FQSV9SQwogc2Rpb2hfcmVxdWVzdF9wYWNrZXQoc2Rpb2hfaW5mb190ICpzZCwgdWludCBmaXhfaW5jLCB1aW50IHdyaXRlLCB1aW50IGZ1bmMsCi0JCSAgICAgdWludCBhZGRyLCB2b2lkICpwa3QpCisJCSAgICAgdWludCBhZGRyLCBzdHJ1Y3Qgc2tfYnVmZiAqcGt0KQogewogCWJvb2wgZmlmbyA9IChmaXhfaW5jID09IFNESU9IX0RBVEFfRklYKTsKIAl1MzIgU0dDb3VudCA9IDA7CiAJaW50IGVycl9yZXQgPSAwOwogCi0Jdm9pZCAqcG5leHQ7CisJc3RydWN0IHNrX2J1ZmYgKnBuZXh0OwogCiAJc2RfdHJhY2UoKCIlczogRW50ZXJcbiIsIF9fZnVuY19fKSk7CiAKQEAgLTk0Myw4ICs5NDQsOCBAQAogCiAJLyogQ2xhaW0gaG9zdCBjb250cm9sbGVyICovCiAJc2Rpb19jbGFpbV9ob3N0KGdJbnN0YW5jZS0+ZnVuY1tmdW5jXSk7Ci0JZm9yIChwbmV4dCA9IHBrdDsgcG5leHQ7IHBuZXh0ID0gUEtUTkVYVChwbmV4dCkpIHsKLQkJdWludCBwa3RfbGVuID0gUEtUTEVOKHBuZXh0KTsKKwlmb3IgKHBuZXh0ID0gcGt0OyBwbmV4dDsgcG5leHQgPSBwbmV4dC0+bmV4dCkgeworCQl1aW50IHBrdF9sZW4gPSBwbmV4dC0+bGVuOwogCQlwa3RfbGVuICs9IDM7CiAJCXBrdF9sZW4gJj0gMHhGRkZGRkZGQzsKIApAQCAtOTYxLDIzICs5NjIsMjMgQEAKIAkJICogaXMgc3VwcG9zZWQgdG8gZ2l2ZQogCQkgKiB1cyBzb21ldGhpbmcgd2UgY2FuIHdvcmsgd2l0aC4KIAkJICovCi0JCUFTU0VSVCgoKHUzMikgKFBLVERBVEEocGt0KSkgJiBETUFfQUxJR05fTUFTSykgPT0gMCk7CisJCUFTU0VSVCgoKHUzMikgKHBrdC0+ZGF0YSkgJiBETUFfQUxJR05fTUFTSykgPT0gMCk7CiAKIAkJaWYgKCh3cml0ZSkgJiYgKCFmaWZvKSkgewogCQkJZXJyX3JldCA9IHNkaW9fbWVtY3B5X3RvaW8oZ0luc3RhbmNlLT5mdW5jW2Z1bmNdLCBhZGRyLAotCQkJCQkJICAgKCh1OCAqKSBQS1REQVRBKHBuZXh0KSksCisJCQkJCQkgICAoKHU4ICopIChwbmV4dC0+ZGF0YSkpLAogCQkJCQkJICAgcGt0X2xlbik7CiAJCX0gZWxzZSBpZiAod3JpdGUpIHsKIAkJCWVycl9yZXQgPSBzZGlvX21lbWNweV90b2lvKGdJbnN0YW5jZS0+ZnVuY1tmdW5jXSwgYWRkciwKLQkJCQkJCSAgICgodTggKikgUEtUREFUQShwbmV4dCkpLAorCQkJCQkJICAgKCh1OCAqKSAocG5leHQtPmRhdGEpKSwKIAkJCQkJCSAgIHBrdF9sZW4pOwogCQl9IGVsc2UgaWYgKGZpZm8pIHsKIAkJCWVycl9yZXQgPSBzZGlvX3JlYWRzYihnSW5zdGFuY2UtPmZ1bmNbZnVuY10sCi0JCQkJCSAgICAgICgodTggKikgUEtUREFUQShwbmV4dCkpLAorCQkJCQkgICAgICAoKHU4ICopIChwbmV4dC0+ZGF0YSkpLAogCQkJCQkgICAgICBhZGRyLCBwa3RfbGVuKTsKIAkJfSBlbHNlIHsKIAkJCWVycl9yZXQgPSBzZGlvX21lbWNweV9mcm9taW8oZ0luc3RhbmNlLT5mdW5jW2Z1bmNdLAotCQkJCQkJICAgICAoKHU4ICopIFBLVERBVEEocG5leHQpKSwKKwkJCQkJCSAgICAgKCh1OCAqKSAocG5leHQtPmRhdGEpKSwKIAkJCQkJCSAgICAgYWRkciwgcGt0X2xlbik7CiAJCX0KIApAQCAtMTAyNSwxMCArMTAyNiwxMCBAQAogZXh0ZXJuIFNESU9IX0FQSV9SQwogc2Rpb2hfcmVxdWVzdF9idWZmZXIoc2Rpb2hfaW5mb190ICpzZCwgdWludCBwaW9fZG1hLCB1aW50IGZpeF9pbmMsIHVpbnQgd3JpdGUsCiAJCSAgICAgdWludCBmdW5jLCB1aW50IGFkZHIsIHVpbnQgcmVnX3dpZHRoLCB1aW50IGJ1Zmxlbl91LAotCQkgICAgIHU4ICpidWZmZXIsIHZvaWQgKnBrdCkKKwkJICAgICB1OCAqYnVmZmVyLCBzdHJ1Y3Qgc2tfYnVmZiAqcGt0KQogewogCVNESU9IX0FQSV9SQyBTdGF0dXM7Ci0Jdm9pZCAqbXlwa3QgPSBOVUxMOworCXN0cnVjdCBza19idWZmICpteXBrdCA9IE5VTEw7CiAKIAlzZF90cmFjZSgoIiVzOiBFbnRlclxuIiwgX19mdW5jX18pKTsKIApAQCAtMTAzOCw1MiArMTAzOSw1MiBAQAogCWlmIChwa3QgPT0gTlVMTCkgewogCQlzZF9kYXRhKCgiJXM6IENyZWF0aW5nIG5ldyAlcyBQYWNrZXQsIGxlbj0lZFxuIiwKIAkJCSBfX2Z1bmNfXywgd3JpdGUgPyAiVFgiIDogIlJYIiwgYnVmbGVuX3UpKTsKLQkJbXlwa3QgPSBQS1RHRVQoc2QtPm9zaCwgYnVmbGVuX3UsIHdyaXRlID8gdHJ1ZSA6IGZhbHNlKTsKKwkJbXlwa3QgPSBwa3RfYnVmX2dldF9za2Ioc2QtPm9zaCwgYnVmbGVuX3UpOwogCQlpZiAoIW15cGt0KSB7Ci0JCQlzZF9lcnIoKCIlczogUEtUR0VUIGZhaWxlZDogbGVuICVkXG4iLAorCQkJc2RfZXJyKCgiJXM6IHBrdF9idWZfZ2V0X3NrYiBmYWlsZWQ6IGxlbiAlZFxuIiwKIAkJCQlfX2Z1bmNfXywgYnVmbGVuX3UpKTsKIAkJCXJldHVybiBTRElPSF9BUElfUkNfRkFJTDsKIAkJfQogCiAJCS8qIEZvciBhIHdyaXRlLCBjb3B5IHRoZSBidWZmZXIgZGF0YSBpbnRvIHRoZSBwYWNrZXQuICovCiAJCWlmICh3cml0ZSkKLQkJCWJjb3B5KGJ1ZmZlciwgUEtUREFUQShteXBrdCksIGJ1Zmxlbl91KTsKKwkJCWJjb3B5KGJ1ZmZlciwgbXlwa3QtPmRhdGEsIGJ1Zmxlbl91KTsKIAogCQlTdGF0dXMgPQogCQkgICAgc2Rpb2hfcmVxdWVzdF9wYWNrZXQoc2QsIGZpeF9pbmMsIHdyaXRlLCBmdW5jLCBhZGRyLCBteXBrdCk7CiAKIAkJLyogRm9yIGEgcmVhZCwgY29weSB0aGUgcGFja2V0IGRhdGEgYmFjayB0byB0aGUgYnVmZmVyLiAqLwogCQlpZiAoIXdyaXRlKQotCQkJYmNvcHkoUEtUREFUQShteXBrdCksIGJ1ZmZlciwgYnVmbGVuX3UpOworCQkJYmNvcHkobXlwa3QtPmRhdGEsIGJ1ZmZlciwgYnVmbGVuX3UpOwogCi0JCVBLVEZSRUUoc2QtPm9zaCwgbXlwa3QsIHdyaXRlID8gdHJ1ZSA6IGZhbHNlKTsKLQl9IGVsc2UgaWYgKCgodTMyKSAoUEtUREFUQShwa3QpKSAmIERNQV9BTElHTl9NQVNLKSAhPSAwKSB7CisJCXBrdF9idWZfZnJlZV9za2Ioc2QtPm9zaCwgbXlwa3QsIHdyaXRlID8gdHJ1ZSA6IGZhbHNlKTsKKwl9IGVsc2UgaWYgKCgodTMyKSAocGt0LT5kYXRhKSAmIERNQV9BTElHTl9NQVNLKSAhPSAwKSB7CiAJCS8qIENhc2UgMjogV2UgaGF2ZSBhIHBhY2tldCwgYnV0IGl0IGlzIHVuYWxpZ25lZC4gKi8KIAogCQkvKiBJbiB0aGlzIGNhc2UsIHdlIGNhbm5vdCBoYXZlIGEgY2hhaW4uICovCi0JCUFTU0VSVChQS1RORVhUKHBrdCkgPT0gTlVMTCk7CisJCUFTU0VSVChwa3QtPm5leHQgPT0gTlVMTCk7CiAKIAkJc2RfZGF0YSgoIiVzOiBDcmVhdGluZyBhbGlnbmVkICVzIFBhY2tldCwgbGVuPSVkXG4iLAotCQkJIF9fZnVuY19fLCB3cml0ZSA/ICJUWCIgOiAiUlgiLCBQS1RMRU4ocGt0KSkpOwotCQlteXBrdCA9IFBLVEdFVChzZC0+b3NoLCBQS1RMRU4ocGt0KSwgd3JpdGUgPyB0cnVlIDogZmFsc2UpOworCQkJIF9fZnVuY19fLCB3cml0ZSA/ICJUWCIgOiAiUlgiLCBwa3QtPmxlbikpOworCQlteXBrdCA9IHBrdF9idWZfZ2V0X3NrYihzZC0+b3NoLCBwa3QtPmxlbik7CiAJCWlmICghbXlwa3QpIHsKLQkJCXNkX2VycigoIiVzOiBQS1RHRVQgZmFpbGVkOiBsZW4gJWRcbiIsCi0JCQkJX19mdW5jX18sIFBLVExFTihwa3QpKSk7CisJCQlzZF9lcnIoKCIlczogcGt0X2J1Zl9nZXRfc2tiIGZhaWxlZDogbGVuICVkXG4iLAorCQkJCV9fZnVuY19fLCBwa3QtPmxlbikpOwogCQkJcmV0dXJuIFNESU9IX0FQSV9SQ19GQUlMOwogCQl9CiAKIAkJLyogRm9yIGEgd3JpdGUsIGNvcHkgdGhlIGJ1ZmZlciBkYXRhIGludG8gdGhlIHBhY2tldC4gKi8KIAkJaWYgKHdyaXRlKQotCQkJYmNvcHkoUEtUREFUQShwa3QpLCBQS1REQVRBKG15cGt0KSwgUEtUTEVOKHBrdCkpOworCQkJYmNvcHkocGt0LT5kYXRhLCBteXBrdC0+ZGF0YSwgcGt0LT5sZW4pOwogCiAJCVN0YXR1cyA9CiAJCSAgICBzZGlvaF9yZXF1ZXN0X3BhY2tldChzZCwgZml4X2luYywgd3JpdGUsIGZ1bmMsIGFkZHIsIG15cGt0KTsKIAogCQkvKiBGb3IgYSByZWFkLCBjb3B5IHRoZSBwYWNrZXQgZGF0YSBiYWNrIHRvIHRoZSBidWZmZXIuICovCiAJCWlmICghd3JpdGUpCi0JCQliY29weShQS1REQVRBKG15cGt0KSwgUEtUREFUQShwa3QpLCBQS1RMRU4obXlwa3QpKTsKKwkJCWJjb3B5KG15cGt0LT5kYXRhLCBwa3QtPmRhdGEsIG15cGt0LT5sZW4pOwogCi0JCVBLVEZSRUUoc2QtPm9zaCwgbXlwa3QsIHdyaXRlID8gdHJ1ZSA6IGZhbHNlKTsKKwkJcGt0X2J1Zl9mcmVlX3NrYihzZC0+b3NoLCBteXBrdCwgd3JpdGUgPyB0cnVlIDogZmFsc2UpOwogCX0gZWxzZSB7CQkvKiBjYXNlIDM6IFdlIGhhdmUgYSBwYWNrZXQgYW5kCiAJCQkJIGl0IGlzIGFsaWduZWQuICovCiAJCXNkX2RhdGEoKCIlczogQWxpZ25lZCAlcyBQYWNrZXQsIGRpcmVjdCBETUFcbiIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2JyY21mbWFjL2JjbXNkaF9zZG1tY19saW51eC5jIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtZm1hYy9iY21zZGhfc2RtbWNfbGludXguYwppbmRleCBhZTdiNTY2Li5jZWFhNDc0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2JyY21mbWFjL2JjbXNkaF9zZG1tY19saW51eC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbWZtYWMvYmNtc2RoX3NkbW1jX2xpbnV4LmMKQEAgLTE1LDcgKzE1LDkgQEAKICAqLwogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4JLyogcmVxdWVzdF9pcnEoKSAqLworI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgogI2luY2x1ZGUgPGJjbWRlZnMuaD4KKyNpbmNsdWRlIDxvc2wuaD4KICNpbmNsdWRlIDxiY211dGlscy5oPgogI2luY2x1ZGUgPHNkaW8uaD4JCS8qIFNESU8gU3BlY3MgKi8KICNpbmNsdWRlIDxiY21zZGJ1cy5oPgkJLyogYmNtc2RoIHRvL2Zyb20gc3BlY2lmaWMgY29udHJvbGxlciBBUElzICovCkBAIC0yMTEsNyArMjEzLDcgQEAKIAlpZiAoIWdJbnN0YW5jZSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQliemVybygmc2RtbWNfZGV2LCBzaXplb2Yoc2RtbWNfZGV2KSk7CisJbWVtc2V0KCZzZG1tY19kZXYsIDAsIHNpemVvZihzZG1tY19kZXYpKTsKIAllcnJvciA9IHNkaW9fcmVnaXN0ZXJfZHJpdmVyKCZiY21zZGhfc2RtbWNfZHJpdmVyKTsKIAogCXJldHVybiBlcnJvcjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbWZtYWMvZGhkLmggYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2JyY21mbWFjL2RoZC5oCmluZGV4IDU3ZDA2YjIuLjY5YzZhMDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbWZtYWMvZGhkLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtZm1hYy9kaGQuaApAQCAtNzcsNyArNzcsNyBAQAogLyogQ29tbW9uIHN0cnVjdHVyZSBmb3IgbW9kdWxlIGFuZCBpbnN0YW5jZSBsaW5rYWdlICovCiB0eXBlZGVmIHN0cnVjdCBkaGRfcHViIHsKIAkvKiBMaW5rYWdlIHBvbnRlcnMgKi8KLQlvc2xfdCAqb3NoOwkJLyogT1NMIGhhbmRsZSAqLworCXN0cnVjdCBvc2xfaW5mbyAqb3NoOwkJLyogT1NMIGhhbmRsZSAqLwogCXN0cnVjdCBkaGRfYnVzICpidXM7CS8qIEJ1cyBtb2R1bGUgaGFuZGxlICovCiAJc3RydWN0IGRoZF9wcm90ICpwcm90OwkvKiBQcm90b2NvbCBtb2R1bGUgaGFuZGxlICovCiAJc3RydWN0IGRoZF9pbmZvICppbmZvOwkvKiBJbmZvIG1vZHVsZSBoYW5kbGUgKi8KQEAgLTI3NywxNSArMjc3LDE2IEBACiAgKi8KIAogLyogVG8gYWxsb3cgb3NsX2F0dGFjaC9kZXRhY2ggY2FsbHMgZnJvbSBvcy1pbmRlcGVuZGVudCBtb2R1bGVzICovCi1vc2xfdCAqZGhkX29zbF9hdHRhY2godm9pZCAqcGRldiwgdWludCBidXN0eXBlKTsKLXZvaWQgZGhkX29zbF9kZXRhY2gob3NsX3QgKm9zaCk7CitzdHJ1Y3Qgb3NsX2luZm8gKmRoZF9vc2xfYXR0YWNoKHZvaWQgKnBkZXYsIHVpbnQgYnVzdHlwZSk7Cit2b2lkIGRoZF9vc2xfZGV0YWNoKHN0cnVjdCBvc2xfaW5mbyAqb3NoKTsKIAogLyogSW5kaWNhdGlvbiBmcm9tIGJ1cyBtb2R1bGUgcmVnYXJkaW5nIHByZXNlbmNlL2luc2VydGlvbiBvZiBkb25nbGUuCiAgKiBSZXR1cm4gZGhkX3B1Yl90IHBvaW50ZXIsIHVzZWQgYXMgaGFuZGxlIHRvIE9TIG1vZHVsZSBpbiBsYXRlciBjYWxscy4KICAqIFJldHVybmVkIHN0cnVjdHVyZSBzaG91bGQgaGF2ZSBidXMgYW5kIHByb3QgcG9pbnRlcnMgZmlsbGVkIGluLgogICogYnVzX2hkcmxlbiBzcGVjaWZpZXMgcmVxdWlyZWQgaGVhZHJvb20gZm9yIGJ1cyBtb2R1bGUgaGVhZGVyLgogICovCi1leHRlcm4gZGhkX3B1Yl90ICpkaGRfYXR0YWNoKG9zbF90ICpvc2gsIHN0cnVjdCBkaGRfYnVzICpidXMsIHVpbnQgYnVzX2hkcmxlbik7CitleHRlcm4gZGhkX3B1Yl90ICpkaGRfYXR0YWNoKHN0cnVjdCBvc2xfaW5mbyAqb3NoLCBzdHJ1Y3QgZGhkX2J1cyAqYnVzLAorCQkJCXVpbnQgYnVzX2hkcmxlbik7CiBleHRlcm4gaW50IGRoZF9uZXRfYXR0YWNoKGRoZF9wdWJfdCAqZGhkcCwgaW50IGlkeCk7CiAKIC8qIEluZGljYXRpb24gZnJvbSBidXMgbW9kdWxlIHJlZ2FyZGluZyByZW1vdmFsL2Fic2VuY2Ugb2YgZG9uZ2xlICovCkBAIC0yOTQsMTAgKzI5NSwxMiBAQAogLyogSW5kaWNhdGlvbiBmcm9tIGJ1cyBtb2R1bGUgdG8gY2hhbmdlIGZsb3ctY29udHJvbCBzdGF0ZSAqLwogZXh0ZXJuIHZvaWQgZGhkX3R4Zmxvd2NvbnRyb2woZGhkX3B1Yl90ICpkaGRwLCBpbnQgaWZpZHgsIGJvb2wgb24pOwogCi1leHRlcm4gYm9vbCBkaGRfcHJlY19lbnEoZGhkX3B1Yl90ICpkaGRwLCBzdHJ1Y3QgcGt0cSAqcSwgdm9pZCAqcGt0LCBpbnQgcHJlYyk7CitleHRlcm4gYm9vbCBkaGRfcHJlY19lbnEoZGhkX3B1Yl90ICpkaGRwLCBzdHJ1Y3QgcGt0cSAqcSwKKwkJCSBzdHJ1Y3Qgc2tfYnVmZiAqcGt0LCBpbnQgcHJlYyk7CiAKIC8qIFJlY2VpdmUgZnJhbWUgZm9yIGRlbGl2ZXJ5IHRvIE9TLiAgQ2FsbGVlIGRpc3Bvc2VzIG9mIHJ4cC4gKi8KLWV4dGVybiB2b2lkIGRoZF9yeF9mcmFtZShkaGRfcHViX3QgKmRoZHAsIGludCBpZmlkeCwgdm9pZCAqcnhwLCBpbnQgbnVtcGt0KTsKK2V4dGVybiB2b2lkIGRoZF9yeF9mcmFtZShkaGRfcHViX3QgKmRoZHAsIGludCBpZmlkeCwKKwkJCSBzdHJ1Y3Qgc2tfYnVmZiAqcnhwLCBpbnQgbnVtcGt0KTsKIAogLyogUmV0dXJuIHBvaW50ZXIgdG8gaW50ZXJmYWNlIG5hbWUgKi8KIGV4dGVybiBjaGFyICpkaGRfaWZuYW1lKGRoZF9wdWJfdCAqZGhkcCwgaW50IGlkeCk7CkBAIC0zMDYsNyArMzA5LDcgQEAKIGV4dGVybiB2b2lkIGRoZF9zY2hlZF9kcGMoZGhkX3B1Yl90ICpkaGRwKTsKIAogLyogTm90aWZ5IHR4IGNvbXBsZXRpb24gKi8KLWV4dGVybiB2b2lkIGRoZF90eGNvbXBsZXRlKGRoZF9wdWJfdCAqZGhkcCwgdm9pZCAqdHhwLCBib29sIHN1Y2Nlc3MpOworZXh0ZXJuIHZvaWQgZGhkX3R4Y29tcGxldGUoZGhkX3B1Yl90ICpkaGRwLCBzdHJ1Y3Qgc2tfYnVmZiAqdHhwLCBib29sIHN1Y2Nlc3MpOwogCiAvKiBRdWVyeSBpb2N0bCAqLwogZXh0ZXJuIGludCBkaGRjZGNfcXVlcnlfaW9jdGwoZGhkX3B1Yl90ICpkaGQsIGludCBpZmlkeCwgdWludCBjbWQsIHZvaWQgKmJ1ZiwKQEAgLTM3Nyw3ICszODAsNyBAQAogCQkJICAgaW50IGxlbik7CiAKIC8qIFNlbmQgcGFja2V0IHRvIGRvbmdsZSB2aWEgZGF0YSBjaGFubmVsICovCi1leHRlcm4gaW50IGRoZF9zZW5kcGt0KGRoZF9wdWJfdCAqZGhkcCwgaW50IGlmaWR4LCB2b2lkICpwa3QpOworZXh0ZXJuIGludCBkaGRfc2VuZHBrdChkaGRfcHViX3QgKmRoZHAsIGludCBpZmlkeCwgc3RydWN0IHNrX2J1ZmYgKnBrdCk7CiAKIC8qIFNlbmQgZXZlbnQgdG8gaG9zdCAqLwogZXh0ZXJuIHZvaWQgZGhkX3NlbmR1cF9ldmVudChkaGRfcHViX3QgKmRoZHAsIHdsX2V2ZW50X21zZ190ICpldmVudCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbWZtYWMvZGhkX2J1cy5oIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtZm1hYy9kaGRfYnVzLmgKaW5kZXggM2IzOWM5OS4uY2QwZDU0MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtZm1hYy9kaGRfYnVzLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtZm1hYy9kaGRfYnVzLmgKQEAgLTI2LDggKzI2LDggQEAKIGV4dGVybiB2b2lkIGRoZF9idXNfdW5yZWdpc3Rlcih2b2lkKTsKIAogLyogRG93bmxvYWQgZmlybXdhcmUgaW1hZ2UgYW5kIG52cmFtIGltYWdlICovCi1leHRlcm4gYm9vbCBkaGRfYnVzX2Rvd25sb2FkX2Zpcm13YXJlKHN0cnVjdCBkaGRfYnVzICpidXMsIG9zbF90ICogb3NoLAotCQkJCSAgICAgIGNoYXIgKmZ3X3BhdGgsIGNoYXIgKm52X3BhdGgpOworZXh0ZXJuIGJvb2wgZGhkX2J1c19kb3dubG9hZF9maXJtd2FyZShzdHJ1Y3QgZGhkX2J1cyAqYnVzLAorCSAgICAgIHN0cnVjdCBvc2xfaW5mbyAqb3NoLCBjaGFyICpmd19wYXRoLCBjaGFyICpudl9wYXRoKTsKIAogLyogU3RvcCBidXMgbW9kdWxlOiBjbGVhciBwZW5kaW5nIGZyYW1lcywgZGlzYWJsZSBkYXRhIGZsb3cgKi8KIGV4dGVybiB2b2lkIGRoZF9idXNfc3RvcChzdHJ1Y3QgZGhkX2J1cyAqYnVzLCBib29sIGVuZm9yY2VfbXV0ZXgpOwpAQCAtMzYsNyArMzYsNyBAQAogZXh0ZXJuIGludCBkaGRfYnVzX2luaXQoZGhkX3B1Yl90ICpkaGRwLCBib29sIGVuZm9yY2VfbXV0ZXgpOwogCiAvKiBTZW5kIGEgZGF0YSBmcmFtZSB0byB0aGUgZG9uZ2xlLiAgQ2FsbGVlIGRpc3Bvc2VzIG9mIHR4cC4gKi8KLWV4dGVybiBpbnQgZGhkX2J1c190eGRhdGEoc3RydWN0IGRoZF9idXMgKmJ1cywgdm9pZCAqdHhwKTsKK2V4dGVybiBpbnQgZGhkX2J1c190eGRhdGEoc3RydWN0IGRoZF9idXMgKmJ1cywgc3RydWN0IHNrX2J1ZmYgKnR4cCk7CiAKIC8qIFNlbmQvcmVjZWl2ZSBhIGNvbnRyb2wgbWVzc2FnZSB0by9mcm9tIHRoZSBkb25nbGUuCiAgKiBFeHBlY3RzIGNhbGxlciB0byBlbmZvcmNlIGEgc2luZ2xlIG91dHN0YW5kaW5nIHRyYW5zYWN0aW9uLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtZm1hYy9kaGRfY2RjLmMgYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2JyY21mbWFjL2RoZF9jZGMuYwppbmRleCBiY2JhYWM5Li5iN2I1MjdmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2JyY21mbWFjL2RoZF9jZGMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2JyY21mbWFjL2RoZF9jZGMuYwpAQCAtMTUsNiArMTUsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgogI2luY2x1ZGUgPGJjbWRlZnMuaD4KICNpbmNsdWRlIDxvc2wuaD4KIApAQCAtMjk3LDYgKzI5OCwxNSBAQAogCXJldHVybiByZXQ7CiB9CiAKKyNkZWZpbmUgUEtUU1VNTkVFREVEKHNrYikgXAorCQkoKChzdHJ1Y3Qgc2tfYnVmZiAqKShza2IpKS0+aXBfc3VtbWVkID09IENIRUNLU1VNX1BBUlRJQUwpCisjZGVmaW5lIFBLVFNFVFNVTUdPT0Qoc2tiLCB4KSBcCisJCSgoKHN0cnVjdCBza19idWZmICopKHNrYikpLT5pcF9zdW1tZWQgPSBcCisJCSgoeCkgPyBDSEVDS1NVTV9VTk5FQ0VTU0FSWSA6IENIRUNLU1VNX05PTkUpKQorCisvKiBQS1RTRVRTVU1ORUVERUQgYW5kIFBLVFNVTUdPT0QgYXJlIG5vdCBwb3NzaWJsZSBiZWNhdXNlCisJc2tiLT5pcF9zdW1tZWQgaXMgb3ZlcmxvYWRlZCAqLworCiBpbnQKIGRoZF9wcm90X2lvdmFyX29wKGRoZF9wdWJfdCAqZGhkcCwgY29uc3QgY2hhciAqbmFtZSwKIAkJICB2b2lkICpwYXJhbXMsIGludCBwbGVuLCB2b2lkICphcmcsIGludCBsZW4sIGJvb2wgc2V0KQpAQCAtMzA5LDcgKzMxOSw3IEBACiAJYmNtX2JwcmludGYoc3RyYnVmLCAiUHJvdG9jb2wgQ0RDOiByZXFpZCAlZFxuIiwgZGhkcC0+cHJvdC0+cmVxaWQpOwogfQogCi12b2lkIGRoZF9wcm90X2hkcnB1c2goZGhkX3B1Yl90ICpkaGQsIGludCBpZmlkeCwgdm9pZCAqcGt0YnVmKQordm9pZCBkaGRfcHJvdF9oZHJwdXNoKGRoZF9wdWJfdCAqZGhkLCBpbnQgaWZpZHgsIHN0cnVjdCBza19idWZmICpwa3RidWYpCiB7CiAjaWZkZWYgQkRDCiAJc3RydWN0IGJkY19oZWFkZXIgKmg7CkBAIC0zMjAsMzMgKzMzMCwzMyBAQAogI2lmZGVmIEJEQwogCS8qIFB1c2ggQkRDIGhlYWRlciB1c2VkIHRvIGNvbnZleSBwcmlvcml0eSBmb3IgYnVzZXMgdGhhdCBkb24ndCAqLwogCi0JUEtUUFVTSChwa3RidWYsIEJEQ19IRUFERVJfTEVOKTsKKwlza2JfcHVzaChwa3RidWYsIEJEQ19IRUFERVJfTEVOKTsKIAotCWggPSAoc3RydWN0IGJkY19oZWFkZXIgKilQS1REQVRBKHBrdGJ1Zik7CisJaCA9IChzdHJ1Y3QgYmRjX2hlYWRlciAqKShwa3RidWYtPmRhdGEpOwogCiAJaC0+ZmxhZ3MgPSAoQkRDX1BST1RPX1ZFUiA8PCBCRENfRkxBR19WRVJfU0hJRlQpOwogCWlmIChQS1RTVU1ORUVERUQocGt0YnVmKSkKIAkJaC0+ZmxhZ3MgfD0gQkRDX0ZMQUdfU1VNX05FRURFRDsKIAotCWgtPnByaW9yaXR5ID0gKFBLVFBSSU8ocGt0YnVmKSAmIEJEQ19QUklPUklUWV9NQVNLKTsKKwloLT5wcmlvcml0eSA9IChwa3RidWYtPnByaW9yaXR5ICYgQkRDX1BSSU9SSVRZX01BU0spOwogCWgtPmZsYWdzMiA9IDA7CiAJaC0+cnNzaSA9IDA7CiAjZW5kaWYJCQkJLyogQkRDICovCiAJQkRDX1NFVF9JRl9JRFgoaCwgaWZpZHgpOwogfQogCi1ib29sIGRoZF9wcm90b19mY2luZm8oZGhkX3B1Yl90ICpkaGQsIHZvaWQgKnBrdGJ1ZiwgdTggKiBmY2JpdHMpCitib29sIGRoZF9wcm90b19mY2luZm8oZGhkX3B1Yl90ICpkaGQsIHN0cnVjdCBza19idWZmICpwa3RidWYsIHU4ICogZmNiaXRzKQogewogI2lmZGVmIEJEQwogCXN0cnVjdCBiZGNfaGVhZGVyICpoOwogCi0JaWYgKFBLVExFTihwa3RidWYpIDwgQkRDX0hFQURFUl9MRU4pIHsKKwlpZiAocGt0YnVmLT5sZW4gPCBCRENfSEVBREVSX0xFTikgewogCQlESERfRVJST1IoKCIlczogcnggZGF0YSB0b28gc2hvcnQgKCVkIDwgJWQpXG4iLAotCQkJICAgX19mdW5jX18sIFBLVExFTihwa3RidWYpLCBCRENfSEVBREVSX0xFTikpOworCQkJICAgX19mdW5jX18sIHBrdGJ1Zi0+bGVuLCBCRENfSEVBREVSX0xFTikpOwogCQlyZXR1cm4gQkNNRV9FUlJPUjsKIAl9CiAKLQloID0gKHN0cnVjdCBiZGNfaGVhZGVyICopUEtUREFUQShwa3RidWYpOworCWggPSAoc3RydWN0IGJkY19oZWFkZXIgKikocGt0YnVmLT5kYXRhKTsKIAogCSpmY2JpdHMgPSBoLT5wcmlvcml0eSA+PiBCRENfUFJJT1JJVFlfRkNfU0hJRlQ7CiAJaWYgKChoLT5mbGFnczIgJiBCRENfRkxBRzJfRkNfRkxBRykgPT0gQkRDX0ZMQUcyX0ZDX0ZMQUcpCkBAIC0zNTUsNyArMzY1LDcgQEAKIAlyZXR1cm4gZmFsc2U7CiB9CiAKLWludCBkaGRfcHJvdF9oZHJwdWxsKGRoZF9wdWJfdCAqZGhkLCBpbnQgKmlmaWR4LCB2b2lkICpwa3RidWYpCitpbnQgZGhkX3Byb3RfaGRycHVsbChkaGRfcHViX3QgKmRoZCwgaW50ICppZmlkeCwgc3RydWN0IHNrX2J1ZmYgKnBrdGJ1ZikKIHsKICNpZmRlZiBCREMKIAlzdHJ1Y3QgYmRjX2hlYWRlciAqaDsKQEAgLTM2NiwxMyArMzc2LDEzIEBACiAjaWZkZWYgQkRDCiAJLyogUG9wIEJEQyBoZWFkZXIgdXNlZCB0byBjb252ZXkgcHJpb3JpdHkgZm9yIGJ1c2VzIHRoYXQgZG9uJ3QgKi8KIAotCWlmIChQS1RMRU4ocGt0YnVmKSA8IEJEQ19IRUFERVJfTEVOKSB7CisJaWYgKHBrdGJ1Zi0+bGVuIDwgQkRDX0hFQURFUl9MRU4pIHsKIAkJREhEX0VSUk9SKCgiJXM6IHJ4IGRhdGEgdG9vIHNob3J0ICglZCA8ICVkKVxuIiwgX19mdW5jX18sCi0JCQkgICBQS1RMRU4ocGt0YnVmKSwgQkRDX0hFQURFUl9MRU4pKTsKKwkJCSAgIHBrdGJ1Zi0+bGVuLCBCRENfSEVBREVSX0xFTikpOwogCQlyZXR1cm4gQkNNRV9FUlJPUjsKIAl9CiAKLQloID0gKHN0cnVjdCBiZGNfaGVhZGVyICopUEtUREFUQShwa3RidWYpOworCWggPSAoc3RydWN0IGJkY19oZWFkZXIgKikocGt0YnVmLT5kYXRhKTsKIAogCSppZmlkeCA9IEJEQ19HRVRfSUZfSURYKGgpOwogCWlmICgqaWZpZHggPj0gREhEX01BWF9JRlMpIHsKQEAgLTM5NSw5ICs0MDUsOSBAQAogCQlQS1RTRVRTVU1HT09EKHBrdGJ1ZiwgdHJ1ZSk7CiAJfQogCi0JUEtUU0VUUFJJTyhwa3RidWYsIChoLT5wcmlvcml0eSAmIEJEQ19QUklPUklUWV9NQVNLKSk7CisJcGt0YnVmLT5wcmlvcml0eSA9IGgtPnByaW9yaXR5ICYgQkRDX1BSSU9SSVRZX01BU0s7CiAKLQlQS1RQVUxMKHBrdGJ1ZiwgQkRDX0hFQURFUl9MRU4pOworCXNrYl9wdWxsKHBrdGJ1ZiwgQkRDX0hFQURFUl9MRU4pOwogI2VuZGlmCQkJCS8qIEJEQyAqLwogCiAJcmV0dXJuIDA7CkBAIC00NjcsNyArNDc3LDcgQEAKIAkJZGhkX29zX3Byb3RvX3VuYmxvY2soZGhkKTsKIAkJcmV0dXJuIHJldDsKIAl9Ci0JbWVtY3B5KGRoZC0+bWFjLm9jdGV0LCBidWYsIEVUSEVSX0FERFJfTEVOKTsKKwltZW1jcHkoZGhkLT5tYWMub2N0ZXQsIGJ1ZiwgRVRIX0FMRU4pOwogCiAJZGhkX29zX3Byb3RvX3VuYmxvY2soZGhkKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtZm1hYy9kaGRfY29tbW9uLmMgYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2JyY21mbWFjL2RoZF9jb21tb24uYwppbmRleCA3MDMxODhmLi4zZGJmNzJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2JyY21mbWFjL2RoZF9jb21tb24uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2JyY21mbWFjL2RoZF9jb21tb24uYwpAQCAtMTYsNiArMTYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGJjbWRlZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KICNpbmNsdWRlIDxvc2wuaD4KICNpbmNsdWRlIDxiY211dGlscy5oPgogI2luY2x1ZGUgPGJjbWVuZGlhbi5oPgpAQCAtMzI2LDkgKzMyNywxMCBAQAogCX0KIH0KIAotYm9vbCBkaGRfcHJlY19lbnEoZGhkX3B1Yl90ICpkaGRwLCBzdHJ1Y3QgcGt0cSAqcSwgdm9pZCAqcGt0LCBpbnQgcHJlYykKK2Jvb2wgZGhkX3ByZWNfZW5xKGRoZF9wdWJfdCAqZGhkcCwgc3RydWN0IHBrdHEgKnEsIHN0cnVjdCBza19idWZmICpwa3QsCisJCSAgaW50IHByZWMpCiB7Ci0Jdm9pZCAqcDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqcDsKIAlpbnQgZXByZWMgPSAtMTsJCS8qIHByZWNlZGVuY2UgdG8gZXZpY3QgZnJvbSAqLwogCWJvb2wgZGlzY2FyZF9vbGRlc3Q7CiAKQEAgLTM2Niw3ICszNjgsNyBAQAogCQkJQVNTRVJUKHApOwogCQl9CiAKLQkJUEtURlJFRShkaGRwLT5vc2gsIHAsIHRydWUpOworCQlwa3RfYnVmX2ZyZWVfc2tiKGRoZHAtPm9zaCwgcCwgdHJ1ZSk7CiAJfQogCiAJLyogRW5xdWV1ZSAqLwpAQCAtODMyLDcgKzgzNCw3IEBACiAJdTE2IGZsYWdzOwogCWludCBldmxlbjsKIAotCWlmIChiY21wKEJSQ01fT1VJLCAmcHZ0X2RhdGEtPmJjbV9oZHIub3VpWzBdLCBET1QxMV9PVUlfTEVOKSkgeworCWlmIChtZW1jbXAoQlJDTV9PVUksICZwdnRfZGF0YS0+YmNtX2hkci5vdWlbMF0sIERPVDExX09VSV9MRU4pKSB7CiAJCURIRF9FUlJPUigoIiVzOiBtaXNtYXRjaGVkIE9VSSwgYmFpbGluZ1xuIiwgX19mdW5jX18pKTsKIAkJcmV0dXJuIEJDTUVfRVJST1I7CiAJfQpAQCAtMTI1NCw3ICsxMjU2LDcgQEAKIAkgKi8KIAlyZXQgPSBkaGRfY3VzdG9tX2dldF9tYWNfYWRkcmVzcyhlYV9hZGRyLm9jdGV0KTsKIAlpZiAoIXJldCkgewotCQliY21fbWtpb3ZhcigiY3VyX2V0aGVyYWRkciIsICh2b2lkICopJmVhX2FkZHIsIEVUSEVSX0FERFJfTEVOLAorCQliY21fbWtpb3ZhcigiY3VyX2V0aGVyYWRkciIsICh2b2lkICopJmVhX2FkZHIsIEVUSF9BTEVOLAogCQkJICAgIGJ1Ziwgc2l6ZW9mKGJ1ZikpOwogCQlyZXQgPSBkaGRjZGNfc2V0X2lvY3RsKGRoZCwgMCwgV0xDX1NFVF9WQVIsIGJ1Ziwgc2l6ZW9mKGJ1ZikpOwogCQlpZiAocmV0IDwgMCkgewpAQCAtMTI2Miw3ICsxMjY0LDcgQEAKIAkJCQkgICBfX2Z1bmNfXywgcmV0KSk7CiAJCX0gZWxzZQogCQkJbWVtY3B5KGRoZC0+bWFjLm9jdGV0LCAodm9pZCAqKSZlYV9hZGRyLAotCQkJICAgICAgIEVUSEVSX0FERFJfTEVOKTsKKwkJCSAgICAgICBFVEhfQUxFTik7CiAJfQogI2VuZGlmCQkJCS8qIEdFVF9DVVNUT01fTUFDX0VOQUJMRSAqLwogCkBAIC0xNTMyLDcgKzE1MzQsNyBAQAogCQkJCQlicmVhazsKIAogCQkJCWlmICghbWVtY21wCi0JCQkJICAgIChiaS0+QlNTSUQub2N0ZXQsIGFkZHIsIEVUSEVSX0FERFJfTEVOKSkgeworCQkJCSAgICAoYmktPkJTU0lELm9jdGV0LCBhZGRyLCBFVEhfQUxFTikpIHsKIAkJCQkJREhEX0lTQ0FOKCgiJXM6IERlbCBCU1NbJTIuMmQ6JTIuMmRdICIKIAkJCQkJIiVYOiVYOiVYOiVYOiVYOiVYXG4iLAogCQkJCQlfX2Z1bmNfXywgbCwgaSwgYmktPkJTU0lELm9jdGV0WzBdLApAQCAtMTY3MCw3ICsxNjcyLDcgQEAKIAljaGFyIGJ1ZltXTENfSU9DVExfU01MRU5dOwogCiAJbWVtc2V0KCZwYXJhbXMsIDAsIHNpemVvZih3bF9pc2Nhbl9wYXJhbXNfdCkpOwotCW1lbWNweSgmcGFyYW1zLnBhcmFtcy5ic3NpZCwgJmV0aGVyX2JjYXN0LCBFVEhFUl9BRERSX0xFTik7CisJbWVtY3B5KCZwYXJhbXMucGFyYW1zLmJzc2lkLCAmZXRoZXJfYmNhc3QsIEVUSF9BTEVOKTsKIAogCXBhcmFtcy5wYXJhbXMuYnNzX3R5cGUgPSBET1QxMV9CU1NUWVBFX0FOWTsKIAlwYXJhbXMucGFyYW1zLnNjYW5fdHlwZSA9IERPVDExX1NDQU5UWVBFX0FDVElWRTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbWZtYWMvZGhkX2N1c3RvbV9ncGlvLmMgYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2JyY21mbWFjL2RoZF9jdXN0b21fZ3Bpby5jCmluZGV4IGY2NDcwMzQuLmMzZjE4YmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbWZtYWMvZGhkX2N1c3RvbV9ncGlvLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtZm1hYy9kaGRfY3VzdG9tX2dwaW8uYwpAQCAtMTQsNyArMTQsNyBAQAogICogQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KICAqLwogCi0jaW5jbHVkZSA8bGludXh2ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KICNpbmNsdWRlIDxvc2wuaD4KICNpbmNsdWRlIDxiY211dGlscy5oPgogCkBAIC0yNCw4ICsyNCw4IEBACiAjaW5jbHVkZSA8d2xpb2N0bC5oPgogI2luY2x1ZGUgPHdsX2l3Lmg+CiAKLSNkZWZpbmUgV0xfRVJST1IoeCkgcHJpbnRmIHgKLSNkZWZpbmUgV0xfVFJBQ0UoeCkKKyNkZWZpbmUgV0xfRVJST1IoZm10LCBhcmdzLi4uKSBwcmludGsoZm10LCAjI2FyZ3MpCisjZGVmaW5lIFdMX1RSQUNFKGZtdCwgYXJncy4uLikgbm9fcHJpbnRrKGZtdCwgIyNhcmdzKQogCiAjaWZkZWYgQ1VTVE9NRVJfSFcKIGV4dGVybiB2b2lkIGJjbV93bGFuX3Bvd2VyX29mZihpbnQpOwpAQCAtNjcsMTMgKzY3LDEzIEBACiAjZW5kaWYKIAogCWlmIChkaGRfb29iX2dwaW9fbnVtIDwgMCkgewotCQlXTF9FUlJPUigoIiVzOiBFUlJPUiBjdXN0b21lciBzcGVjaWZpYyBIb3N0IEdQSU8gaXMgTk9UIGRlZmluZWRcbiIsCi0JCQlfX2Z1bmNfXykpOworCQlXTF9FUlJPUigiJXM6IEVSUk9SIGN1c3RvbWVyIHNwZWNpZmljIEhvc3QgR1BJTyBpcyBOT1QgZGVmaW5lZFxuIiwKKwkJCSBfX2Z1bmNfXyk7CiAJCXJldHVybiBkaGRfb29iX2dwaW9fbnVtOwogCX0KIAotCVdMX0VSUk9SKCgiJXM6IGN1c3RvbWVyIHNwZWNpZmljIEhvc3QgR1BJTyBudW1iZXIgaXMgKCVkKVxuIiwKLQkJICBfX2Z1bmNfXywgZGhkX29vYl9ncGlvX251bSkpOworCVdMX0VSUk9SKCIlczogY3VzdG9tZXIgc3BlY2lmaWMgSG9zdCBHUElPIG51bWJlciBpcyAoJWQpXG4iLAorCQkgX19mdW5jX18sIGRoZF9vb2JfZ3Bpb19udW0pOwogCiAjaWYgZGVmaW5lZCBDVVNUT01FUl9IVwogCWhvc3Rfb29iX2lycSA9IE1TTV9HUElPX1RPX0lOVChkaGRfb29iX2dwaW9fbnVtKTsKQEAgLTkzLDQwICs5Myw0MCBAQAogewogCXN3aXRjaCAob25vZmYpIHsKIAljYXNlIFdMQU5fUkVTRVRfT0ZGOgotCQlXTF9UUkFDRSgoIiVzOiBjYWxsIGN1c3RvbWVyIHNwZWNpZmljIEdQSU8gdG8gaW5zZXJ0IFdMQU4gUkVTRVRcbiIsCi0JCQlfX2Z1bmNfXykpOworCQlXTF9UUkFDRSgiJXM6IGNhbGwgY3VzdG9tZXIgc3BlY2lmaWMgR1BJTyB0byBpbnNlcnQgV0xBTiBSRVNFVFxuIiwKKwkJCSBfX2Z1bmNfXyk7CiAjaWZkZWYgQ1VTVE9NRVJfSFcKIAkJYmNtX3dsYW5fcG93ZXJfb2ZmKDIpOwogI2VuZGlmCQkJCS8qIENVU1RPTUVSX0hXICovCiAjaWZkZWYgQ1VTVE9NRVJfSFcyCiAJCXdpZmlfc2V0X3Bvd2VyKDAsIDApOwogI2VuZGlmCi0JCVdMX0VSUk9SKCgiPT09PT09PT09PT0gV0xBTiBwbGFjZWQgaW4gUkVTRVQgPT09PT09PT1cbiIpKTsKKwkJV0xfRVJST1IoIj09PT09PT09PT09IFdMQU4gcGxhY2VkIGluIFJFU0VUID09PT09PT09XG4iKTsKIAkJYnJlYWs7CiAKIAljYXNlIFdMQU5fUkVTRVRfT046Ci0JCVdMX1RSQUNFKCgiJXM6IGNhbGxjIGN1c3RvbWVyIHNwZWNpZmljIEdQSU8gdG8gcmVtb3ZlIFdMQU4gUkVTRVRcbiIsCi0JCQlfX2Z1bmNfXykpOworCQlXTF9UUkFDRSgiJXM6IGNhbGxjIGN1c3RvbWVyIHNwZWNpZmljIEdQSU8gdG8gcmVtb3ZlIFdMQU4gUkVTRVRcbiIsCisJCQkgX19mdW5jX18pOwogI2lmZGVmIENVU1RPTUVSX0hXCiAJCWJjbV93bGFuX3Bvd2VyX29uKDIpOwogI2VuZGlmCQkJCS8qIENVU1RPTUVSX0hXICovCiAjaWZkZWYgQ1VTVE9NRVJfSFcyCiAJCXdpZmlfc2V0X3Bvd2VyKDEsIDApOwogI2VuZGlmCi0JCVdMX0VSUk9SKCgiPT09PT09PT09PT0gV0xBTiBnb2luZyBiYWNrIHRvIGxpdmUgID09PT09PT09XG4iKSk7CisJCVdMX0VSUk9SKCI9PT09PT09PT09PSBXTEFOIGdvaW5nIGJhY2sgdG8gbGl2ZSAgPT09PT09PT1cbiIpOwogCQlicmVhazsKIAogCWNhc2UgV0xBTl9QT1dFUl9PRkY6Ci0JCVdMX1RSQUNFKCgiJXM6IGNhbGwgY3VzdG9tZXIgc3BlY2lmaWMgR1BJTyB0byB0dXJuIG9mZiBXTF9SRUdfT05cbiIsCi0JCQlfX2Z1bmNfXykpOworCQlXTF9UUkFDRSgiJXM6IGNhbGwgY3VzdG9tZXIgc3BlY2lmaWMgR1BJTyB0byB0dXJuIG9mZiBXTF9SRUdfT05cbiIsCisJCQkgX19mdW5jX18pOwogI2lmZGVmIENVU1RPTUVSX0hXCiAJCWJjbV93bGFuX3Bvd2VyX29mZigxKTsKICNlbmRpZgkJCQkvKiBDVVNUT01FUl9IVyAqLwogCQlicmVhazsKIAogCWNhc2UgV0xBTl9QT1dFUl9PTjoKLQkJV0xfVFJBQ0UoKCIlczogY2FsbCBjdXN0b21lciBzcGVjaWZpYyBHUElPIHRvIHR1cm4gb24gV0xfUkVHX09OXG4iLAotCQkJX19mdW5jX18pKTsKKwkJV0xfVFJBQ0UoIiVzOiBjYWxsIGN1c3RvbWVyIHNwZWNpZmljIEdQSU8gdG8gdHVybiBvbiBXTF9SRUdfT05cbiIsCisJCQkgX19mdW5jX18pOwogI2lmZGVmIENVU1RPTUVSX0hXCiAJCWJjbV93bGFuX3Bvd2VyX29uKDEpOwogI2VuZGlmCQkJCS8qIENVU1RPTUVSX0hXICovCkBAIC0xNDAsNyArMTQwLDcgQEAKIC8qIEZ1bmN0aW9uIHRvIGdldCBjdXN0b20gTUFDIGFkZHJlc3MgKi8KIGludCBkaGRfY3VzdG9tX2dldF9tYWNfYWRkcmVzcyh1bnNpZ25lZCBjaGFyICpidWYpCiB7Ci0JV0xfVFJBQ0UoKCIlcyBFbnRlclxuIiwgX19mdW5jX18pKTsKKwlXTF9UUkFDRSgiJXMgRW50ZXJcbiIsIF9fZnVuY19fKTsKIAlpZiAoIWJ1ZikKIAkJcmV0dXJuIC1FSU5WQUw7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbWZtYWMvZGhkX2xpbnV4LmMgYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2JyY21mbWFjL2RoZF9saW51eC5jCmluZGV4IDkzMzVmMDIuLmRiNDUwODMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbWZtYWMvZGhkX2xpbnV4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtZm1hYy9kaGRfbGludXguYwpAQCAtMzIsNyArMzIsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGJjbWRlZnMuaD4KLSNpbmNsdWRlIDxsaW51eHZlci5oPgogI2luY2x1ZGUgPG9zbC5oPgogI2luY2x1ZGUgPGJjbXV0aWxzLmg+CiAjaW5jbHVkZSA8YmNtZW5kaWFuLmg+CkBAIC0yMTEsNyArMjEwLDcgQEAKIAlpbnQgaWR4OwkJLyogaWZhY2UgaWR4IGluIGRvbmdsZSAqLwogCWludCBzdGF0ZTsJCS8qIGludGVyZmFjZSBzdGF0ZSAqLwogCXVpbnQgc3VidW5pdDsJCS8qIHN1YnVuaXQgKi8KLQl1OCBtYWNfYWRkcltFVEhFUl9BRERSX0xFTl07CS8qIGFzc2lnbmVkIE1BQyBhZGRyZXNzICovCisJdTggbWFjX2FkZHJbRVRIX0FMRU5dOwkvKiBhc3NpZ25lZCBNQUMgYWRkcmVzcyAqLwogCWJvb2wgYXR0YWNoZWQ7CQkvKiBEZWxheWVkIGF0dGFjaG1lbnQgd2hlbiB1bnNldCAqLwogCWJvb2wgdHhmbG93Y29udHJvbDsJLyogUGVyIGludGVyZmFjZSBmbG93IGNvbnRyb2wgaW5kaWNhdG9yICovCiAJY2hhciBuYW1lW0lGTkFNU0laXTsJLyogbGludXggaW50ZXJmYWNlIG5hbWUgKi8KQEAgLTcwOSw3ICs3MDgsNyBAQAogCiAJLyogU2VuZCBkb3duIHRoZSBtdWx0aWNhc3QgbGlzdCBmaXJzdC4gKi8KIAotCWJ1ZmxlbiA9IHNpemVvZigibWNhc3RfbGlzdCIpICsgc2l6ZW9mKGNudCkgKyAoY250ICogRVRIRVJfQUREUl9MRU4pOworCWJ1ZmxlbiA9IHNpemVvZigibWNhc3RfbGlzdCIpICsgc2l6ZW9mKGNudCkgKyAoY250ICogRVRIX0FMRU4pOwogCWJ1ZnAgPSBidWYgPSBrbWFsbG9jKGJ1ZmxlbiwgR0ZQX0FUT01JQyk7CiAJaWYgKCFidWZwKSB7CiAJCURIRF9FUlJPUigoIiVzOiBvdXQgb2YgbWVtb3J5IGZvciBtY2FzdF9saXN0LCBjbnQgJWRcbiIsCkBAIC03MjcsOCArNzI2LDggQEAKIAluZXRkZXZfZm9yX2VhY2hfbWNfYWRkcihoYSwgZGV2KSB7CiAJCWlmICghY250KQogCQkJYnJlYWs7Ci0JCW1lbWNweShidWZwLCBoYS0+YWRkciwgRVRIRVJfQUREUl9MRU4pOwotCQlidWZwICs9IEVUSEVSX0FERFJfTEVOOworCQltZW1jcHkoYnVmcCwgaGEtPmFkZHIsIEVUSF9BTEVOKTsKKwkJYnVmcCArPSBFVEhfQUxFTjsKIAkJY250LS07CiAJfQogCkBAIC04MTIsNyArODExLDcgQEAKIAogCURIRF9UUkFDRSgoIiVzIGVudGVyXG4iLCBfX2Z1bmNfXykpOwogCWlmICghYmNtX21raW92YXIKLQkgICAgKCJjdXJfZXRoZXJhZGRyIiwgKGNoYXIgKilhZGRyLCBFVEhFUl9BRERSX0xFTiwgYnVmLCAzMikpIHsKKwkgICAgKCJjdXJfZXRoZXJhZGRyIiwgKGNoYXIgKilhZGRyLCBFVEhfQUxFTiwgYnVmLCAzMikpIHsKIAkJREhEX0VSUk9SKCgiJXM6IG1raW92YXIgZmFpbGVkIGZvciBjdXJfZXRoZXJhZGRyXG4iLAogCQkJICAgZGhkX2lmbmFtZSgmZGhkLT5wdWIsIGlmaWR4KSkpOwogCQlyZXR1cm4gLTE7CkBAIC04MjgsNyArODI3LDcgQEAKIAkJREhEX0VSUk9SKCgiJXM6IHNldCBjdXJfZXRoZXJhZGRyIGZhaWxlZFxuIiwKIAkJCSAgIGRoZF9pZm5hbWUoJmRoZC0+cHViLCBpZmlkeCkpKTsKIAl9IGVsc2UgewotCQltZW1jcHkoZGhkLT5pZmxpc3RbaWZpZHhdLT5uZXQtPmRldl9hZGRyLCBhZGRyLCBFVEhFUl9BRERSX0xFTik7CisJCW1lbWNweShkaGQtPmlmbGlzdFtpZmlkeF0tPm5ldC0+ZGV2X2FkZHIsIGFkZHIsIEVUSF9BTEVOKTsKIAl9CiAKIAlyZXR1cm4gcmV0OwpAQCAtOTk4LDcgKzk5Nyw3IEBACiAJCXJldHVybiAtMTsKIAogCUFTU0VSVChkaGQtPnN5c2lvY190c2spOwotCW1lbWNweSgmZGhkLT5tYWN2YWx1ZSwgc2EtPnNhX2RhdGEsIEVUSEVSX0FERFJfTEVOKTsKKwltZW1jcHkoJmRoZC0+bWFjdmFsdWUsIHNhLT5zYV9kYXRhLCBFVEhfQUxFTik7CiAJZGhkLT5zZXRfbWFjYWRkcmVzcyA9IHRydWU7CiAJdXAoJmRoZC0+c3lzaW9jX3NlbSk7CiAKQEAgLTEwMTksNyArMTAxOCw3IEBACiAJdXAoJmRoZC0+c3lzaW9jX3NlbSk7CiB9CiAKLWludCBkaGRfc2VuZHBrdChkaGRfcHViX3QgKmRoZHAsIGludCBpZmlkeCwgdm9pZCAqcGt0YnVmKQoraW50IGRoZF9zZW5kcGt0KGRoZF9wdWJfdCAqZGhkcCwgaW50IGlmaWR4LCBzdHJ1Y3Qgc2tfYnVmZiAqcGt0YnVmKQogewogCWludCByZXQ7CiAJZGhkX2luZm9fdCAqZGhkID0gKGRoZF9pbmZvX3QgKikgKGRoZHAtPmluZm8pOwpAQCAtMTAyOSwxMyArMTAyOCwxMyBAQAogCQlyZXR1cm4gLUVOT0RFVjsKIAogCS8qIFVwZGF0ZSBtdWx0aWNhc3Qgc3RhdGlzdGljICovCi0JaWYgKFBLVExFTihwa3RidWYpID49IEVUSEVSX0FERFJfTEVOKSB7Ci0JCXU4ICpwa3RkYXRhID0gKHU4ICopIFBLVERBVEEocGt0YnVmKTsKKwlpZiAocGt0YnVmLT5sZW4gPj0gRVRIX0FMRU4pIHsKKwkJdTggKnBrdGRhdGEgPSAodTggKikgKHBrdGJ1Zi0+ZGF0YSk7CiAJCXN0cnVjdCBldGhlcl9oZWFkZXIgKmVoID0gKHN0cnVjdCBldGhlcl9oZWFkZXIgKilwa3RkYXRhOwogCi0JCWlmIChFVEhFUl9JU01VTFRJKGVoLT5ldGhlcl9kaG9zdCkpCisJCWlmIChpc19tdWx0aWNhc3RfZXRoZXJfYWRkcihlaC0+ZXRoZXJfZGhvc3QpKQogCQkJZGhkcC0+dHhfbXVsdGljYXN0Kys7Ci0JCWlmIChudG9oMTYoZWgtPmV0aGVyX3R5cGUpID09IEVUSEVSX1RZUEVfODAyXzFYKQorCQlpZiAobnRvaDE2KGVoLT5ldGhlcl90eXBlKSA9PSBFVEhfUF9QQUUpCiAJCQlhdG9taWNfaW5jKCZkaGQtPnBlbmRfODAyMXhfY250KTsKIAl9CiAKQEAgLTEwNTMsNiArMTA1MiwzMiBAQAogCXJldHVybiByZXQ7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCAqCitvc2xfcGt0X2ZybW5hdGl2ZShzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqbnNrYjsKKworCWZvciAobnNrYiA9IHNrYjsgbnNrYjsgbnNrYiA9IG5za2ItPm5leHQpCisJCW9zaC0+cGt0YWxsb2NlZCsrOworCisJcmV0dXJuICh2b2lkICopc2tiOworfQorI2RlZmluZSBQS1RGUk1OQVRJVkUob3NoLCBza2IpCVwKKwlvc2xfcGt0X2ZybW5hdGl2ZSgob3NoKSwgKHN0cnVjdCBza19idWZmICopKHNrYikpCisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHNrX2J1ZmYgKgorb3NsX3BrdF90b25hdGl2ZShzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgdm9pZCAqcGt0KQoreworCXN0cnVjdCBza19idWZmICpuc2tiOworCisJZm9yIChuc2tiID0gKHN0cnVjdCBza19idWZmICopcGt0OyBuc2tiOyBuc2tiID0gbnNrYi0+bmV4dCkKKwkJb3NoLT5wa3RhbGxvY2VkLS07CisKKwlyZXR1cm4gKHN0cnVjdCBza19idWZmICopcGt0OworfQorI2RlZmluZSBQS1RUT05BVElWRShvc2gsIHBrdCkJXAorCW9zbF9wa3RfdG9uYXRpdmUoKG9zaCksIChwa3QpKQorCiBzdGF0aWMgaW50IGRoZF9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpuZXQpCiB7CiAJaW50IHJldDsKQEAgLTExMzMsMTMgKzExNTgsMTUgQEAKIAkJbmV0aWZfd2FrZV9xdWV1ZShuZXQpOwogfQogCi12b2lkIGRoZF9yeF9mcmFtZShkaGRfcHViX3QgKmRoZHAsIGludCBpZmlkeCwgdm9pZCAqcGt0YnVmLCBpbnQgbnVtcGt0KQordm9pZCBkaGRfcnhfZnJhbWUoZGhkX3B1Yl90ICpkaGRwLCBpbnQgaWZpZHgsIHN0cnVjdCBza19idWZmICpwa3RidWYsCisJCSAgaW50IG51bXBrdCkKIHsKIAlkaGRfaW5mb190ICpkaGQgPSAoZGhkX2luZm9fdCAqKSBkaGRwLT5pbmZvOwogCXN0cnVjdCBza19idWZmICpza2I7CiAJdW5zaWduZWQgY2hhciAqZXRoOwogCXVpbnQgbGVuOwotCXZvaWQgKmRhdGEsICpwbmV4dCwgKnNhdmVfcGt0YnVmOworCXZvaWQgKmRhdGE7CisJc3RydWN0IHNrX2J1ZmYgKnBuZXh0LCAqc2F2ZV9wa3RidWY7CiAJaW50IGk7CiAJZGhkX2lmX3QgKmlmcDsKIAl3bF9ldmVudF9tc2dfdCBldmVudDsKQEAgLTExNTAsOCArMTE3Nyw4IEBACiAKIAlmb3IgKGkgPSAwOyBwa3RidWYgJiYgaSA8IG51bXBrdDsgaSsrLCBwa3RidWYgPSBwbmV4dCkgewogCi0JCXBuZXh0ID0gUEtUTkVYVChwa3RidWYpOwotCQlQS1RTRVRORVhUKHBrdGJ1ZiwgTlVMTCk7CisJCXBuZXh0ID0gcGt0YnVmLT5uZXh0OworCQlwa3RidWYtPm5leHQgPSBOVUxMOwogCiAJCXNrYiA9IFBLVFRPTkFUSVZFKGRoZHAtPm9zaCwgcGt0YnVmKTsKIApAQCAtMTE5MCw3ICsxMjE3LDcgQEAKIAkJLyogUHJvY2VzcyBzcGVjaWFsIGV2ZW50IHBhY2tldHMgYW5kIHRoZW4gZGlzY2FyZCB0aGVtICovCiAJCWlmIChudG9oMTYoc2tiLT5wcm90b2NvbCkgPT0gRVRIRVJfVFlQRV9CUkNNKQogCQkJZGhkX3dsX2hvc3RfZXZlbnQoZGhkLCAmaWZpZHgsCi0JCQkJCSAgc2tiLT5tYWNfaGVhZGVyLAorCQkJCQkgIHNrYl9tYWNfaGVhZGVyKHNrYiksCiAJCQkJCSAgJmV2ZW50LCAmZGF0YSk7CiAKIAkJQVNTRVJUKGlmaWR4IDwgREhEX01BWF9JRlMgJiYgZGhkLT5pZmxpc3RbaWZpZHhdKTsKQEAgLTEyMjMsNyArMTI1MCw3IEBACiAJcmV0dXJuOwogfQogCi12b2lkIGRoZF90eGNvbXBsZXRlKGRoZF9wdWJfdCAqZGhkcCwgdm9pZCAqdHhwLCBib29sIHN1Y2Nlc3MpCit2b2lkIGRoZF90eGNvbXBsZXRlKGRoZF9wdWJfdCAqZGhkcCwgc3RydWN0IHNrX2J1ZmYgKnR4cCwgYm9vbCBzdWNjZXNzKQogewogCXVpbnQgaWZpZHg7CiAJZGhkX2luZm9fdCAqZGhkID0gKGRoZF9pbmZvX3QgKikgKGRoZHAtPmluZm8pOwpAQCAtMTIzMiwxMCArMTI1OSwxMCBAQAogCiAJZGhkX3Byb3RfaGRycHVsbChkaGRwLCAmaWZpZHgsIHR4cCk7CiAKLQllaCA9IChzdHJ1Y3QgZXRoZXJfaGVhZGVyICopUEtUREFUQSh0eHApOworCWVoID0gKHN0cnVjdCBldGhlcl9oZWFkZXIgKikodHhwLT5kYXRhKTsKIAl0eXBlID0gbnRvaDE2KGVoLT5ldGhlcl90eXBlKTsKIAotCWlmICh0eXBlID09IEVUSEVSX1RZUEVfODAyXzFYKQorCWlmICh0eXBlID09IEVUSF9QX1BBRSkKIAkJYXRvbWljX2RlYygmZGhkLT5wZW5kXzgwMjF4X2NudCk7CiAKIH0KQEAgLTE2MjEsNiArMTY0OCw1MSBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgczE2IGxpbnV4YmNtZXJyb3JtYXBbXSA9IHsgMCwJLyogMCAqLworCS1FSU5WQUwsCQkvKiBCQ01FX0VSUk9SICovCisJLUVJTlZBTCwJCS8qIEJDTUVfQkFEQVJHICovCisJLUVJTlZBTCwJCS8qIEJDTUVfQkFET1BUSU9OICovCisJLUVJTlZBTCwJCS8qIEJDTUVfTk9UVVAgKi8KKwktRUlOVkFMLAkJLyogQkNNRV9OT1RET1dOICovCisJLUVJTlZBTCwJCS8qIEJDTUVfTk9UQVAgKi8KKwktRUlOVkFMLAkJLyogQkNNRV9OT1RTVEEgKi8KKwktRUlOVkFMLAkJLyogQkNNRV9CQURLRVlJRFggKi8KKwktRUlOVkFMLAkJLyogQkNNRV9SQURJT09GRiAqLworCS1FSU5WQUwsCQkvKiBCQ01FX05PVEJBTkRMT0NLRUQgKi8KKwktRUlOVkFMLAkJLyogQkNNRV9OT0NMSyAqLworCS1FSU5WQUwsCQkvKiBCQ01FX0JBRFJBVEVTRVQgKi8KKwktRUlOVkFMLAkJLyogQkNNRV9CQURCQU5EICovCisJLUUyQklHLAkJCS8qIEJDTUVfQlVGVE9PU0hPUlQgKi8KKwktRTJCSUcsCQkJLyogQkNNRV9CVUZUT09MT05HICovCisJLUVCVVNZLAkJCS8qIEJDTUVfQlVTWSAqLworCS1FSU5WQUwsCQkvKiBCQ01FX05PVEFTU09DSUFURUQgKi8KKwktRUlOVkFMLAkJLyogQkNNRV9CQURTU0lETEVOICovCisJLUVJTlZBTCwJCS8qIEJDTUVfT1VUT0ZSQU5HRUNIQU4gKi8KKwktRUlOVkFMLAkJLyogQkNNRV9CQURDSEFOICovCisJLUVGQVVMVCwJCS8qIEJDTUVfQkFEQUREUiAqLworCS1FTk9NRU0sCQkvKiBCQ01FX05PUkVTT1VSQ0UgKi8KKwktRU9QTk9UU1VQUCwJCS8qIEJDTUVfVU5TVVBQT1JURUQgKi8KKwktRU1TR1NJWkUsCQkvKiBCQ01FX0JBRExFTkdUSCAqLworCS1FSU5WQUwsCQkvKiBCQ01FX05PVFJFQURZICovCisJLUVQRVJNLAkJCS8qIEJDTUVfTk9UUEVSTUlUVEVEICovCisJLUVOT01FTSwJCS8qIEJDTUVfTk9NRU0gKi8KKwktRUlOVkFMLAkJLyogQkNNRV9BU1NPQ0lBVEVEICovCisJLUVSQU5HRSwJCS8qIEJDTUVfUkFOR0UgKi8KKwktRUlOVkFMLAkJLyogQkNNRV9OT1RGT1VORCAqLworCS1FSU5WQUwsCQkvKiBCQ01FX1dNRV9OT1RfRU5BQkxFRCAqLworCS1FSU5WQUwsCQkvKiBCQ01FX1RTUEVDX05PVEZPVU5EICovCisJLUVJTlZBTCwJCS8qIEJDTUVfQUNNX05PVFNVUFBPUlRFRCAqLworCS1FSU5WQUwsCQkvKiBCQ01FX05PVF9XTUVfQVNTT0NJQVRJT04gKi8KKwktRUlPLAkJCS8qIEJDTUVfU0RJT19FUlJPUiAqLworCS1FTk9ERVYsCQkvKiBCQ01FX0RPTkdMRV9ET1dOICovCisJLUVJTlZBTCwJCS8qIEJDTUVfVkVSU0lPTiAqLworCS1FSU8sCQkJLyogQkNNRV9UWEZBSUwgKi8KKwktRUlPLAkJCS8qIEJDTUVfUlhGQUlMICovCisJLUVJTlZBTCwJCS8qIEJDTUVfTk9ERVZJQ0UgKi8KKwktRUlOVkFMLAkJLyogQkNNRV9OTU9ERV9ESVNBQkxFRCAqLworCS1FTk9EQVRBLAkJLyogQkNNRV9OT05SRVNJREVOVCAqLworfTsKKwogc3RhdGljIGludCBkaGRfaW9jdGxfZW50cnkoc3RydWN0IG5ldF9kZXZpY2UgKm5ldCwgc3RydWN0IGlmcmVxICppZnIsIGludCBjbWQpCiB7CiAJZGhkX2luZm9fdCAqZGhkID0gKihkaGRfaW5mb190ICoqKSBuZXRkZXZfcHJpdihuZXQpOwpAQCAtMTc0Miw3ICsxODE0LDEyIEBACiAJaWYgKGJ1ZikKIAkJa2ZyZWUoYnVmKTsKIAotCXJldHVybiBPU0xfRVJST1IoYmNtZXJyb3IpOworCWlmIChiY21lcnJvciA+IDApCisJCWJjbWVycm9yID0gMDsKKwllbHNlIGlmIChiY21lcnJvciA8IEJDTUVfTEFTVCkKKwkJYmNtZXJyb3IgPSBCQ01FX0VSUk9SOworCisJcmV0dXJuIGxpbnV4YmNtZXJyb3JtYXBbLWJjbWVycm9yXTsKIH0KIAogc3RhdGljIGludCBkaGRfc3RvcChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0KQpAQCAtMTc4OSw3ICsxODY2LDcgQEAKIAkJfQogCQlhdG9taWNfc2V0KCZkaGQtPnBlbmRfODAyMXhfY250LCAwKTsKIAotCQltZW1jcHkobmV0LT5kZXZfYWRkciwgZGhkLT5wdWIubWFjLm9jdGV0LCBFVEhFUl9BRERSX0xFTik7CisJCW1lbWNweShuZXQtPmRldl9hZGRyLCBkaGQtPnB1Yi5tYWMub2N0ZXQsIEVUSF9BTEVOKTsKIAogI2lmZGVmIFRPRQogCQkvKiBHZXQgY3VycmVudCBUT0UgbW9kZSBmcm9tIGRvbmdsZSAqLwpAQCAtMTgxNCwxMiArMTg5MSwxMiBAQAogCXJldHVybiByZXQ7CiB9CiAKLW9zbF90ICpkaGRfb3NsX2F0dGFjaCh2b2lkICpwZGV2LCB1aW50IGJ1c3R5cGUpCitzdHJ1Y3Qgb3NsX2luZm8gKmRoZF9vc2xfYXR0YWNoKHZvaWQgKnBkZXYsIHVpbnQgYnVzdHlwZSkKIHsKLQlyZXR1cm4gb3NsX2F0dGFjaChwZGV2LCBidXN0eXBlLCB0cnVlKTsKKwlyZXR1cm4gb3NsX2F0dGFjaChwZGV2LCBidXN0eXBlKTsKIH0KIAotdm9pZCBkaGRfb3NsX2RldGFjaChvc2xfdCAqb3NoKQordm9pZCBkaGRfb3NsX2RldGFjaChzdHJ1Y3Qgb3NsX2luZm8gKm9zaCkKIHsKIAlvc2xfZGV0YWNoKG9zaCk7CiB9CkBAIC0xODQ1LDcgKzE5MjIsNyBAQAogCWRoZC0+aWZsaXN0W2lmaWR4XSA9IGlmcDsKIAlzdHJsY3B5KGlmcC0+bmFtZSwgbmFtZSwgSUZOQU1TSVopOwogCWlmIChtYWNfYWRkciAhPSBOVUxMKQotCQltZW1jcHkoJmlmcC0+bWFjX2FkZHIsIG1hY19hZGRyLCBFVEhFUl9BRERSX0xFTik7CisJCW1lbWNweSgmaWZwLT5tYWNfYWRkciwgbWFjX2FkZHIsIEVUSF9BTEVOKTsKIAogCWlmIChoYW5kbGUgPT0gTlVMTCkgewogCQlpZnAtPnN0YXRlID0gV0xDX0VfSUZfQUREOwpAQCAtMTg3Nyw3ICsxOTU0LDggQEAKIAl1cCgmZGhkLT5zeXNpb2Nfc2VtKTsKIH0KIAotZGhkX3B1Yl90ICpkaGRfYXR0YWNoKG9zbF90ICpvc2gsIHN0cnVjdCBkaGRfYnVzICpidXMsIHVpbnQgYnVzX2hkcmxlbikKK2RoZF9wdWJfdCAqZGhkX2F0dGFjaChzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgc3RydWN0IGRoZF9idXMgKmJ1cywKKwkJCXVpbnQgYnVzX2hkcmxlbikKIHsKIAlkaGRfaW5mb190ICpkaGQgPSBOVUxMOwogCXN0cnVjdCBuZXRfZGV2aWNlICpuZXQ7CkBAIC0yMTk5LDE5ICsyMjc3LDExIEBACiAJLm5kb19zZXRfbXVsdGljYXN0X2xpc3QgPSBkaGRfc2V0X211bHRpY2FzdF9saXN0CiB9OwogCi1zdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfb3BzIGRoZF9vcHNfdmlydCA9IHsKLQkubmRvX2dldF9zdGF0cyA9IGRoZF9nZXRfc3RhdHMsCi0JLm5kb19kb19pb2N0bCA9IGRoZF9pb2N0bF9lbnRyeSwKLQkubmRvX3N0YXJ0X3htaXQgPSBkaGRfc3RhcnRfeG1pdCwKLQkubmRvX3NldF9tYWNfYWRkcmVzcyA9IGRoZF9zZXRfbWFjX2FkZHJlc3MsCi0JLm5kb19zZXRfbXVsdGljYXN0X2xpc3QgPSBkaGRfc2V0X211bHRpY2FzdF9saXN0Ci19OwotCiBpbnQgZGhkX25ldF9hdHRhY2goZGhkX3B1Yl90ICpkaGRwLCBpbnQgaWZpZHgpCiB7CiAJZGhkX2luZm9fdCAqZGhkID0gKGRoZF9pbmZvX3QgKikgZGhkcC0+aW5mbzsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0OwotCXU4IHRlbXBfYWRkcltFVEhFUl9BRERSX0xFTl0gPSB7CisJdTggdGVtcF9hZGRyW0VUSF9BTEVOXSA9IHsKIAkJMHgwMCwgMHg5MCwgMHg0YywgMHgxMSwgMHgyMiwgMHgzM307CiAKIAlESERfVFJBQ0UoKCIlczogaWZpZHggJWRcbiIsIF9fZnVuY19fLCBpZmlkeCkpOwpAQCAtMjIyOSw3ICsyMjk5LDcgQEAKIAkgKi8KIAlpZiAoaWZpZHggIT0gMCkgewogCQkvKiBmb3IgdmlydHVhbCBpbnRlcmZhY2VzIHVzZSB0aGUgcHJpbWFyeSBNQUMgICovCi0JCW1lbWNweSh0ZW1wX2FkZHIsIGRoZC0+cHViLm1hYy5vY3RldCwgRVRIRVJfQUREUl9MRU4pOworCQltZW1jcHkodGVtcF9hZGRyLCBkaGQtPnB1Yi5tYWMub2N0ZXQsIEVUSF9BTEVOKTsKIAogCX0KIApAQCAtMjI1Nyw3ICsyMzI3LDcgQEAKIAogCWRoZC0+cHViLnJ4c3ogPSBuZXQtPm10dSArIG5ldC0+aGFyZF9oZWFkZXJfbGVuICsgZGhkLT5wdWIuaGRybGVuOwogCi0JbWVtY3B5KG5ldC0+ZGV2X2FkZHIsIHRlbXBfYWRkciwgRVRIRVJfQUREUl9MRU4pOworCW1lbWNweShuZXQtPmRldl9hZGRyLCB0ZW1wX2FkZHIsIEVUSF9BTEVOKTsKIAogCWlmIChyZWdpc3Rlcl9uZXRkZXYobmV0KSAhPSAwKSB7CiAJCURIRF9FUlJPUigoIiVzOiBjb3VsZG4ndCByZWdpc3RlciB0aGUgbmV0IGRldmljZVxuIiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbWZtYWMvZGhkX2xpbnV4X3NjaGVkLmMgYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2JyY21mbWFjL2RoZF9saW51eF9zY2hlZC5jCmluZGV4IGJmOGRmOTguLmM2NmYxYzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbWZtYWMvZGhkX2xpbnV4X3NjaGVkLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtZm1hYy9kaGRfbGludXhfc2NoZWQuYwpAQCAtMTYsNyArMTYsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXh2ZXIuaD4KIAogaW50IHNldFNjaGVkdWxlcihzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsIGludCBwb2xpY3ksIHN0cnVjdCBzY2hlZF9wYXJhbSAqcGFyYW0pCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2JyY21mbWFjL2RoZF9wcm90by5oIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtZm1hYy9kaGRfcHJvdG8uaAppbmRleCBjYzQyZmE0Li5hNTMwOWUyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2JyY21mbWFjL2RoZF9wcm90by5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbWZtYWMvZGhkX3Byb3RvLmgKQEAgLTQ2LDE1ICs0NiwxNiBAQAogLyogU3RvcCBwcm90b2NvbDogc3luYyB3L2RvbmdsZSBzdGF0ZS4gKi8KIGV4dGVybiB2b2lkIGRoZF9wcm90X3N0b3AoZGhkX3B1Yl90ICpkaGRwKTsKIAotZXh0ZXJuIGJvb2wgZGhkX3Byb3RvX2ZjaW5mbyhkaGRfcHViX3QgKmRoZCwgdm9pZCAqcGt0YnVmLCB1OCAqZmNiaXRzKTsKK2V4dGVybiBib29sIGRoZF9wcm90b19mY2luZm8oZGhkX3B1Yl90ICpkaGQsIHN0cnVjdCBza19idWZmICpwa3RidWYsCisJCQkgICAgIHU4ICpmY2JpdHMpOwogCiAvKiBBZGQgYW55IHByb3RvY29sLXNwZWNpZmljIGRhdGEgaGVhZGVyLgogICogQ2FsbGVyIG11c3QgcmVzZXJ2ZSBwcm90X2hkcmxlbiBwcmVwZW5kIHNwYWNlLgogICovCi1leHRlcm4gdm9pZCBkaGRfcHJvdF9oZHJwdXNoKGRoZF9wdWJfdCAqLCBpbnQgaWZpZHgsIHZvaWQgKnR4cCk7CitleHRlcm4gdm9pZCBkaGRfcHJvdF9oZHJwdXNoKGRoZF9wdWJfdCAqLCBpbnQgaWZpZHgsIHN0cnVjdCBza19idWZmICp0eHApOwogCiAvKiBSZW1vdmUgYW55IHByb3RvY29sLXNwZWNpZmljIGRhdGEgaGVhZGVyLiAqLwotZXh0ZXJuIGludCBkaGRfcHJvdF9oZHJwdWxsKGRoZF9wdWJfdCAqLCBpbnQgKmlmaWR4LCB2b2lkICpyeHApOworZXh0ZXJuIGludCBkaGRfcHJvdF9oZHJwdWxsKGRoZF9wdWJfdCAqLCBpbnQgKmlmaWR4LCBzdHJ1Y3Qgc2tfYnVmZiAqcnhwKTsKIAogLyogVXNlIHByb3RvY29sIHRvIGlzc3VlIGlvY3RsIHRvIGRvbmdsZSAqLwogZXh0ZXJuIGludCBkaGRfcHJvdF9pb2N0bChkaGRfcHViX3QgKmRoZCwgaW50IGlmaWR4LCB3bF9pb2N0bF90ICppb2MsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2JyY21mbWFjL2RoZF9zZGlvLmMgYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2JyY21mbWFjL2RoZF9zZGlvLmMKaW5kZXggYjIyODFkOS4uM2VkY2U0NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtZm1hYy9kaGRfc2Rpby5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbWZtYWMvZGhkX3NkaW8uYwpAQCAtMTYsNiArMTYsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxiY21kZWZzLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CiAjaW5jbHVkZSA8b3NsLmg+CiAjaW5jbHVkZSA8YmNtc2RoLmg+CiAKQEAgLTE0Myw3ICsxNDQsNyBAQAogICogYnVmcG9vbCB3YXMgcHJlc2VudCBmb3IgZ3NwaSBidXMuCiAgKi8KICNkZWZpbmUgUEtURlJFRTIoKQkJaWYgKChidXMtPmJ1cyAhPSBTUElfQlVTKSB8fCBidXMtPnVzZWJ1ZnBvb2wpIFwKLQkJCQkJUEtURlJFRShidXMtPmRoZC0+b3NoLCBwa3QsIGZhbHNlKTsKKwkJCQkJCQlwa3RfYnVmX2ZyZWVfc2tiKGJ1cy0+ZGhkLT5vc2gsIHBrdCwgZmFsc2UpOwogREhEX1NQSU5XQUlUX1NMRUVQX0lOSVQoc2Rpb2hfc3BpbndhaXRfc2xlZXApOwogZXh0ZXJuIGludCBkaGRjZGNfc2V0X2lvY3RsKGRoZF9wdWJfdCAqZGhkLCBpbnQgaWZpZHgsIHVpbnQgY21kLCB2b2lkICpidWYsCiAJCQkgICAgdWludCBsZW4pOwpAQCAtMjAyLDggKzIwMyw4IEBACiAJdTggcnhfc2VxOwkJLyogUmVjZWl2ZSBzZXF1ZW5jZSBudW1iZXIgKGV4cGVjdGVkKSAqLwogCWJvb2wgcnhza2lwOwkJLyogU2tpcCByZWNlaXZlIChhd2FpdGluZyBOQUsgQUNLKSAqLwogCi0Jdm9pZCAqZ2xvbWQ7CQkvKiBQYWNrZXQgY29udGFpbmluZyBnbG9tbWluZyBkZXNjcmlwdG9yICovCi0Jdm9pZCAqZ2xvbTsJCS8qIFBhY2tldCBjaGFpbiBmb3IgZ2xvbW1lZCBzdXBlcmZyYW1lICovCisJc3RydWN0IHNrX2J1ZmYgKmdsb21kOwkvKiBQYWNrZXQgY29udGFpbmluZyBnbG9tbWluZyBkZXNjcmlwdG9yICovCisJc3RydWN0IHNrX2J1ZmYgKmdsb207CS8qIFBhY2tldCBjaGFpbiBmb3IgZ2xvbW1lZCBzdXBlcmZyYW1lICovCiAJdWludCBnbG9tZXJyOwkJLyogR2xvbSBwYWNrZXQgcmVhZCBlcnJvcnMgKi8KIAogCXU4ICpyeGJ1ZjsJCS8qIEJ1ZmZlciBmb3IgcmVjZWl2aW5nIGNvbnRyb2wgcGFja2V0cyAqLwpAQCAtMzU2LDE2ICszNTcsMTYgQEAKICNpZiBkZWZpbmVkKE9PQl9JTlRSX09OTFkpICYmIGRlZmluZWQoU0RJT19JU1JfVEhSRUFEKQogI2Vycm9yIE9PQl9JTlRSX09OTFkgaXMgTk9UIHdvcmtpbmcgd2l0aCBTRElPX0lTUl9USFJFQUQKICNlbmRpZgkvKiBkZWZpbmVkKE9PQl9JTlRSX09OTFkpICYmIGRlZmluZWQoU0RJT19JU1JfVEhSRUFEKSAqLwotI2RlZmluZSBQS1RBTElHTihvc2gsIHAsIGxlbiwgYWxpZ24pCQkJCQlcCisjZGVmaW5lIFBLVEFMSUdOKF9vc2gsIF9wLCBfbGVuLCBfYWxpZ24pCQkJCVwKIAlkbyB7CQkJCQkJCQlcCiAJCXVpbnQgZGF0YWxpZ247CQkJCQkJXAotCQlkYXRhbGlnbiA9ICh1bnNpZ25lZCBsb25nKVBLVERBVEEoKHApKTsJCQlcCi0JCWRhdGFsaWduID0gcm91bmR1cChkYXRhbGlnbiwgKGFsaWduKSkgLSBkYXRhbGlnbjsJXAotCQlBU1NFUlQoZGF0YWxpZ24gPCAoYWxpZ24pKTsJCQkJXAotCQlBU1NFUlQoUEtUTEVOKChwKSkgPj0gKChsZW4pICsgZGF0YWxpZ24pKTsJXAorCQlkYXRhbGlnbiA9ICh1bnNpZ25lZCBsb25nKSgoX3ApLT5kYXRhKTsJCQlcCisJCWRhdGFsaWduID0gcm91bmR1cChkYXRhbGlnbiwgKF9hbGlnbikpIC0gZGF0YWxpZ247CVwKKwkJQVNTRVJUKGRhdGFsaWduIDwgKF9hbGlnbikpOwkJCQlcCisJCUFTU0VSVCgoX3ApLT5sZW4gPj0gKChfbGVuKSArIGRhdGFsaWduKSk7CQlcCiAJCWlmIChkYXRhbGlnbikJCQkJCQlcCi0JCQlQS1RQVUxMKChwKSwgZGF0YWxpZ24pOwkJCVwKLQkJUEtUU0VUTEVOKChwKSwgKGxlbikpOwkJCQlcCisJCQlza2JfcHVsbCgoX3ApLCBkYXRhbGlnbik7CQkJXAorCQlfX3NrYl90cmltKChfcCksIChfbGVuKSk7CQkJCVwKIAl9IHdoaWxlICgwKQogCiAvKiBMaW1pdCBvbiByb3VuZGluZyB1cCBmcmFtZXMgKi8KQEAgLTQzMCwyNyArNDMxLDMwIEBACiAjZW5kaWYJCQkJLyogREhEX0RFQlVHICAqLwogc3RhdGljIGludCBkaGRzZGlvX2Rvd25sb2FkX3N0YXRlKGRoZF9idXNfdCAqYnVzLCBib29sIGVudGVyKTsKIAotc3RhdGljIHZvaWQgZGhkc2Rpb19yZWxlYXNlKGRoZF9idXNfdCAqYnVzLCBvc2xfdCAqb3NoKTsKLXN0YXRpYyB2b2lkIGRoZHNkaW9fcmVsZWFzZV9tYWxsb2MoZGhkX2J1c190ICpidXMsIG9zbF90ICpvc2gpOworc3RhdGljIHZvaWQgZGhkc2Rpb19yZWxlYXNlKGRoZF9idXNfdCAqYnVzLCBzdHJ1Y3Qgb3NsX2luZm8gKm9zaCk7CitzdGF0aWMgdm9pZCBkaGRzZGlvX3JlbGVhc2VfbWFsbG9jKGRoZF9idXNfdCAqYnVzLCBzdHJ1Y3Qgb3NsX2luZm8gKm9zaCk7CiBzdGF0aWMgdm9pZCBkaGRzZGlvX2Rpc2Nvbm5lY3Qodm9pZCAqcHRyKTsKIHN0YXRpYyBib29sIGRoZHNkaW9fY2hpcG1hdGNoKHUxNiBjaGlwaWQpOwotc3RhdGljIGJvb2wgZGhkc2Rpb19wcm9iZV9hdHRhY2goZGhkX2J1c190ICpidXMsIG9zbF90ICpvc2gsIHZvaWQgKnNkaCwKLQkJCQkgdm9pZCAqcmVnc3ZhLCB1MTYgZGV2aWQpOwotc3RhdGljIGJvb2wgZGhkc2Rpb19wcm9iZV9tYWxsb2MoZGhkX2J1c190ICpidXMsIG9zbF90ICpvc2gsIHZvaWQgKnNkaCk7Ci1zdGF0aWMgYm9vbCBkaGRzZGlvX3Byb2JlX2luaXQoZGhkX2J1c190ICpidXMsIG9zbF90ICpvc2gsIHZvaWQgKnNkaCk7Ci1zdGF0aWMgdm9pZCBkaGRzZGlvX3JlbGVhc2VfZG9uZ2xlKGRoZF9idXNfdCAqYnVzLCBvc2xfdCAqIG9zaCk7CitzdGF0aWMgYm9vbCBkaGRzZGlvX3Byb2JlX2F0dGFjaChkaGRfYnVzX3QgKmJ1cywgc3RydWN0IG9zbF9pbmZvICpvc2gsCisJCQkJIHZvaWQgKnNkaCwgdm9pZCAqcmVnc3ZhLCB1MTYgZGV2aWQpOworc3RhdGljIGJvb2wgZGhkc2Rpb19wcm9iZV9tYWxsb2MoZGhkX2J1c190ICpidXMsIHN0cnVjdCBvc2xfaW5mbyAqb3NoLAorCQkJCSB2b2lkICpzZGgpOworc3RhdGljIGJvb2wgZGhkc2Rpb19wcm9iZV9pbml0KGRoZF9idXNfdCAqYnVzLCBzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgdm9pZCAqc2RoKTsKK3N0YXRpYyB2b2lkIGRoZHNkaW9fcmVsZWFzZV9kb25nbGUoZGhkX2J1c190ICpidXMsIHN0cnVjdCBvc2xfaW5mbyAqIG9zaCk7CiAKIHN0YXRpYyB1aW50IHByb2Nlc3NfbnZyYW1fdmFycyhjaGFyICp2YXJidWYsIHVpbnQgbGVuKTsKIAogc3RhdGljIHZvaWQgZGhkX2RvbmdsZV9zZXRtZW1zaXplKHN0cnVjdCBkaGRfYnVzICpidXMsIGludCBtZW1fc2l6ZSk7CiBzdGF0aWMgaW50IGRoZF9iY21zZGhfcmVjdl9idWYoZGhkX2J1c190ICpidXMsIHUzMiBhZGRyLCB1aW50IGZuLAotCQkJICAgICAgIHVpbnQgZmxhZ3MsIHU4ICpidWYsIHVpbnQgbmJ5dGVzLCB2b2lkICpwa3QsCi0JCQkgICAgICAgYmNtc2RoX2NtcGx0X2ZuX3QgY29tcGxldGUsIHZvaWQgKmhhbmRsZSk7CisJCQkgICAgICAgdWludCBmbGFncywgdTggKmJ1ZiwgdWludCBuYnl0ZXMsCisJCQkgICAgICAgc3RydWN0IHNrX2J1ZmYgKnBrdCwgYmNtc2RoX2NtcGx0X2ZuX3QgY29tcGxldGUsCisJCQkgICAgICAgdm9pZCAqaGFuZGxlKTsKIHN0YXRpYyBpbnQgZGhkX2JjbXNkaF9zZW5kX2J1ZihkaGRfYnVzX3QgKmJ1cywgdTMyIGFkZHIsIHVpbnQgZm4sCi0JCQkgICAgICAgdWludCBmbGFncywgdTggKmJ1ZiwgdWludCBuYnl0ZXMsIHZvaWQgKnBrdCwKLQkJCSAgICAgICBiY21zZGhfY21wbHRfZm5fdCBjb21wbGV0ZSwgdm9pZCAqaGFuZGxlKTsKKwkJCSAgICAgICB1aW50IGZsYWdzLCB1OCAqYnVmLCB1aW50IG5ieXRlcywKKwkJCSAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqcGt0LCBiY21zZGhfY21wbHRfZm5fdCBjb21wbGV0ZSwKKwkJCSAgICAgICB2b2lkICpoYW5kbGUpOwogCi1zdGF0aWMgYm9vbCBkaGRzZGlvX2Rvd25sb2FkX2Zpcm13YXJlKHN0cnVjdCBkaGRfYnVzICpidXMsIG9zbF90ICpvc2gsCitzdGF0aWMgYm9vbCBkaGRzZGlvX2Rvd25sb2FkX2Zpcm13YXJlKHN0cnVjdCBkaGRfYnVzICpidXMsIHN0cnVjdCBvc2xfaW5mbyAqb3NoLAogCQkJCSAgICAgIHZvaWQgKnNkaCk7CiBzdGF0aWMgaW50IF9kaGRzZGlvX2Rvd25sb2FkX2Zpcm13YXJlKHN0cnVjdCBkaGRfYnVzICpidXMpOwogCkBAIC05MDAsMTYgKzkwNCwxNyBAQAogCiAvKiBXcml0ZXMgYSBIVy9TVyBoZWFkZXIgaW50byB0aGUgcGFja2V0IGFuZCBzZW5kcyBpdC4gKi8KIC8qIEFzc3VtZXM6IChhKSBoZWFkZXIgc3BhY2UgYWxyZWFkeSB0aGVyZSwgKGIpIGNhbGxlciBob2xkcyBsb2NrICovCi1zdGF0aWMgaW50IGRoZHNkaW9fdHhwa3QoZGhkX2J1c190ICpidXMsIHZvaWQgKnBrdCwgdWludCBjaGFuLCBib29sIGZyZWVfcGt0KQorc3RhdGljIGludCBkaGRzZGlvX3R4cGt0KGRoZF9idXNfdCAqYnVzLCBzdHJ1Y3Qgc2tfYnVmZiAqcGt0LCB1aW50IGNoYW4sCisJCQkgYm9vbCBmcmVlX3BrdCkKIHsKIAlpbnQgcmV0OwotCW9zbF90ICpvc2g7CisJc3RydWN0IG9zbF9pbmZvICpvc2g7CiAJdTggKmZyYW1lOwogCXUxNiBsZW4sIHBhZCA9IDA7CiAJdTMyIHN3aGVhZGVyOwogCXVpbnQgcmV0cmllcyA9IDA7CiAJYmNtc2RoX2luZm9fdCAqc2RoOwotCXZvaWQgKm5ldzsKKwlzdHJ1Y3Qgc2tfYnVmZiAqbmV3OwogCWludCBpOwogCiAJREhEX1RSQUNFKCgiJXM6IEVudGVyXG4iLCBfX2Z1bmNfXykpOwpAQCAtOTIyLDQ2ICs5MjcsNDYgQEAKIAkJZ290byBkb25lOwogCX0KIAotCWZyYW1lID0gKHU4ICopIFBLVERBVEEocGt0KTsKKwlmcmFtZSA9ICh1OCAqKSAocGt0LT5kYXRhKTsKIAogCS8qIEFkZCBhbGlnbm1lbnQgcGFkZGluZywgYWxsb2NhdGUgbmV3IHBhY2tldCBpZiBuZWVkZWQgKi8KIAlwYWQgPSAoKHVuc2lnbmVkIGxvbmcpZnJhbWUgJSBESERfU0RBTElHTik7CiAJaWYgKHBhZCkgewotCQlpZiAoUEtUSEVBRFJPT00ocGt0KSA8IHBhZCkgeworCQlpZiAoc2tiX2hlYWRyb29tKHBrdCkgPCBwYWQpIHsKIAkJCURIRF9JTkZPKCgiJXM6IGluc3VmZmljaWVudCBoZWFkcm9vbSAlZCBmb3IgJWQgcGFkXG4iLAotCQkJCSAgX19mdW5jX18sIChpbnQpUEtUSEVBRFJPT00ocGt0KSwgcGFkKSk7CisJCQkJICBfX2Z1bmNfXywgc2tiX2hlYWRyb29tKHBrdCksIHBhZCkpOwogCQkJYnVzLT5kaGQtPnR4X3JlYWxsb2MrKzsKLQkJCW5ldyA9IFBLVEdFVChvc2gsIChQS1RMRU4ocGt0KSArIERIRF9TREFMSUdOKSwgdHJ1ZSk7CisJCQluZXcgPSBwa3RfYnVmX2dldF9za2Iob3NoLCAocGt0LT5sZW4gKyBESERfU0RBTElHTikpOwogCQkJaWYgKCFuZXcpIHsKIAkJCQlESERfRVJST1IoKCIlczogY291bGRuJ3QgYWxsb2NhdGUgbmV3ICVkLWJ5dGUgIgogCQkJCQkicGFja2V0XG4iLAotCQkJCQlfX2Z1bmNfXywgUEtUTEVOKHBrdCkgKyBESERfU0RBTElHTikpOworCQkJCQlfX2Z1bmNfXywgcGt0LT5sZW4gKyBESERfU0RBTElHTikpOwogCQkJCXJldCA9IEJDTUVfTk9NRU07CiAJCQkJZ290byBkb25lOwogCQkJfQogCi0JCQlQS1RBTElHTihvc2gsIG5ldywgUEtUTEVOKHBrdCksIERIRF9TREFMSUdOKTsKLQkJCWJjb3B5KFBLVERBVEEocGt0KSwgUEtUREFUQShuZXcpLCBQS1RMRU4ocGt0KSk7CisJCQlQS1RBTElHTihvc2gsIG5ldywgcGt0LT5sZW4sIERIRF9TREFMSUdOKTsKKwkJCWJjb3B5KHBrdC0+ZGF0YSwgbmV3LT5kYXRhLCBwa3QtPmxlbik7CiAJCQlpZiAoZnJlZV9wa3QpCi0JCQkJUEtURlJFRShvc2gsIHBrdCwgdHJ1ZSk7CisJCQkJcGt0X2J1Zl9mcmVlX3NrYihvc2gsIHBrdCwgdHJ1ZSk7CiAJCQkvKiBmcmVlIHRoZSBwa3QgaWYgY2FubmVkIG9uZSBpcyBub3QgdXNlZCAqLwogCQkJZnJlZV9wa3QgPSB0cnVlOwogCQkJcGt0ID0gbmV3OwotCQkJZnJhbWUgPSAodTggKikgUEtUREFUQShwa3QpOworCQkJZnJhbWUgPSAodTggKikgKHBrdC0+ZGF0YSk7CiAJCQlBU1NFUlQoKCh1bnNpZ25lZCBsb25nKWZyYW1lICUgREhEX1NEQUxJR04pID09IDApOwogCQkJcGFkID0gMDsKIAkJfSBlbHNlIHsKLQkJCVBLVFBVU0gocGt0LCBwYWQpOwotCQkJZnJhbWUgPSAodTggKikgUEtUREFUQShwa3QpOworCQkJc2tiX3B1c2gocGt0LCBwYWQpOworCQkJZnJhbWUgPSAodTggKikgKHBrdC0+ZGF0YSk7CiAKLQkJCUFTU0VSVCgocGFkICsgU0RQQ01fSERSTEVOKSA8PSAoaW50KVBLVExFTihwa3QpKTsKLQkJCWJ6ZXJvKGZyYW1lLCBwYWQgKyBTRFBDTV9IRFJMRU4pOworCQkJQVNTRVJUKChwYWQgKyBTRFBDTV9IRFJMRU4pIDw9IChpbnQpKHBrdC0+bGVuKSk7CisJCQltZW1zZXQoZnJhbWUsIDAsIHBhZCArIFNEUENNX0hEUkxFTik7CiAJCX0KIAl9CiAJQVNTRVJUKHBhZCA8IERIRF9TREFMSUdOKTsKIAogCS8qIEhhcmR3YXJlIHRhZzogMiBieXRlIGxlbiBmb2xsb3dlZCBieSAyIGJ5dGUgfmxlbiBjaGVjayAoYWxsIExFKSAqLwotCWxlbiA9ICh1MTYpIFBLVExFTihwa3QpOworCWxlbiA9ICh1MTYpIChwa3QtPmxlbik7CiAJKih1MTYgKikgZnJhbWUgPSBodG9sMTYobGVuKTsKIAkqKCgodTE2ICopIGZyYW1lKSArIDEpID0gaHRvbDE2KH5sZW4pOwogCkBAIC05NzQsNyArOTc5LDcgQEAKIAlodG9sMzJfdWFfc3RvcmUoMCwgZnJhbWUgKyBTRFBDTV9GUkFNRVRBR19MRU4gKyBzaXplb2Yoc3doZWFkZXIpKTsKIAogI2lmZGVmIERIRF9ERUJVRwotCXR4X3BhY2tldHNbUEtUUFJJTyhwa3QpXSsrOworCXR4X3BhY2tldHNbcGt0LT5wcmlvcml0eV0rKzsKIAlpZiAoREhEX0JZVEVTX09OKCkgJiYKIAkgICAgKCgoREhEX0NUTF9PTigpICYmIChjaGFuID09IFNEUENNX0NPTlRST0xfQ0hBTk5FTCkpIHx8CiAJICAgICAgKERIRF9EQVRBX09OKCkgJiYgKGNoYW4gIT0gU0RQQ01fQ09OVFJPTF9DSEFOTkVMKSkpKSkgewpAQCAtOTg5LDcgKzk5NCw3IEBACiAJCXUxNiBwYWQgPSBidXMtPmJsb2Nrc2l6ZSAtIChsZW4gJSBidXMtPmJsb2Nrc2l6ZSk7CiAJCWlmICgocGFkIDw9IGJ1cy0+cm91bmR1cCkgJiYgKHBhZCA8IGJ1cy0+YmxvY2tzaXplKSkKICNpZmRlZiBOT1RVU0VECi0JCQlpZiAocGFkIDw9IFBLVFRBSUxST09NKHBrdCkpCisJCQlpZiAocGFkIDw9IHNrYl90YWlscm9vbShwa3QpKQogI2VuZGlmCQkJCS8qIE5PVFVTRUQgKi8KIAkJCQlsZW4gKz0gcGFkOwogCX0gZWxzZSBpZiAobGVuICUgREhEX1NEQUxJR04pIHsKQEAgLTk5OSw3ICsxMDA0LDcgQEAKIAkvKiBTb21lIGNvbnRyb2xsZXJzIGhhdmUgdHJvdWJsZSB3aXRoIG9kZCBieXRlcyAtLSByb3VuZCB0byBldmVuICovCiAJaWYgKGZvcmNlYWxpZ24gJiYgKGxlbiAmIChBTElHTk1FTlQgLSAxKSkpIHsKICNpZmRlZiBOT1RVU0VECi0JCWlmIChQS1RUQUlMUk9PTShwa3QpKQorCQlpZiAoc2tiX3RhaWxyb29tKHBrdCkpCiAjZW5kaWYKIAkJCWxlbiA9IHJvdW5kdXAobGVuLCBBTElHTk1FTlQpOwogI2lmZGVmIE5PVFVTRUQKQEAgLTEwNTAsMzQgKzEwNTUsMzQgQEAKIAogZG9uZToKIAkvKiByZXN0b3JlIHBrdCBidWZmZXIgcG9pbnRlciBiZWZvcmUgY2FsbGluZyB0eCBjb21wbGV0ZSByb3V0aW5lICovCi0JUEtUUFVMTChwa3QsIFNEUENNX0hEUkxFTiArIHBhZCk7CisJc2tiX3B1bGwocGt0LCBTRFBDTV9IRFJMRU4gKyBwYWQpOwogCWRoZF9vc19zZHVubG9jayhidXMtPmRoZCk7CiAJZGhkX3R4Y29tcGxldGUoYnVzLT5kaGQsIHBrdCwgcmV0ICE9IDApOwogCWRoZF9vc19zZGxvY2soYnVzLT5kaGQpOwogCiAJaWYgKGZyZWVfcGt0KQotCQlQS1RGUkVFKG9zaCwgcGt0LCB0cnVlKTsKKwkJcGt0X2J1Zl9mcmVlX3NrYihvc2gsIHBrdCwgdHJ1ZSk7CiAKIAlyZXR1cm4gcmV0OwogfQogCi1pbnQgZGhkX2J1c190eGRhdGEoc3RydWN0IGRoZF9idXMgKmJ1cywgdm9pZCAqcGt0KQoraW50IGRoZF9idXNfdHhkYXRhKHN0cnVjdCBkaGRfYnVzICpidXMsIHN0cnVjdCBza19idWZmICpwa3QpCiB7CiAJaW50IHJldCA9IEJDTUVfRVJST1I7Ci0Jb3NsX3QgKm9zaDsKKwlzdHJ1Y3Qgb3NsX2luZm8gKm9zaDsKIAl1aW50IGRhdGFsZW4sIHByZWM7CiAKIAlESERfVFJBQ0UoKCIlczogRW50ZXJcbiIsIF9fZnVuY19fKSk7CiAKIAlvc2ggPSBidXMtPmRoZC0+b3NoOwotCWRhdGFsZW4gPSBQS1RMRU4ocGt0KTsKKwlkYXRhbGVuID0gcGt0LT5sZW47CiAKICNpZmRlZiBTRFRFU1QKIAkvKiBQdXNoIHRoZSB0ZXN0IGhlYWRlciBpZiBkb2luZyBsb29wYmFjayAqLwogCWlmIChidXMtPmV4dF9sb29wKSB7CiAJCXU4ICpkYXRhOwotCQlQS1RQVVNIKHBrdCwgU0RQQ01fVEVTVF9IRFJMRU4pOwotCQlkYXRhID0gUEtUREFUQShwa3QpOworCQlza2JfcHVzaChwa3QsIFNEUENNX1RFU1RfSERSTEVOKTsKKwkJZGF0YSA9IHBrdC0+ZGF0YTsKIAkJKmRhdGErKyA9IFNEUENNX1RFU1RfRUNIT1JFUTsKIAkJKmRhdGErKyA9ICh1OCkgYnVzLT5sb29waWQrKzsKIAkJKmRhdGErKyA9IChkYXRhbGVuID4+IDApOwpAQCAtMTA4NywxMCArMTA5MiwxMCBAQAogI2VuZGlmCQkJCS8qIFNEVEVTVCAqLwogCiAJLyogQWRkIHNwYWNlIGZvciB0aGUgaGVhZGVyICovCi0JUEtUUFVTSChwa3QsIFNEUENNX0hEUkxFTik7Ci0JQVNTRVJUKElTX0FMSUdORUQoKHVuc2lnbmVkIGxvbmcpUEtUREFUQShwa3QpLCAyKSk7CisJc2tiX3B1c2gocGt0LCBTRFBDTV9IRFJMRU4pOworCUFTU0VSVChJU19BTElHTkVEKCh1bnNpZ25lZCBsb25nKShwa3QtPmRhdGEpLCAyKSk7CiAKLQlwcmVjID0gUFJJTzJQUkVDKChQS1RQUklPKHBrdCkgJiBQUklPTUFTSykpOworCXByZWMgPSBQUklPMlBSRUMoKHBrdC0+cHJpb3JpdHkgJiBQUklPTUFTSykpOwogCiAJLyogQ2hlY2sgZm9yIGV4aXN0aW5nIHF1ZXVlLCBjdXJyZW50IGZsb3ctY29udHJvbCwKIAkJCSBwZW5kaW5nIGV2ZW50LCBvciBwZW5kaW5nIGNsb2NrICovCkBAIC0xMTA1LDkgKzExMTAsOSBAQAogCQkvKiBQcmlvcml0eSBiYXNlZCBlbnEgKi8KIAkJZGhkX29zX3NkbG9ja190eHEoYnVzLT5kaGQpOwogCQlpZiAoZGhkX3ByZWNfZW5xKGJ1cy0+ZGhkLCAmYnVzLT50eHEsIHBrdCwgcHJlYykgPT0gZmFsc2UpIHsKLQkJCVBLVFBVTEwocGt0LCBTRFBDTV9IRFJMRU4pOworCQkJc2tiX3B1bGwocGt0LCBTRFBDTV9IRFJMRU4pOwogCQkJZGhkX3R4Y29tcGxldGUoYnVzLT5kaGQsIHBrdCwgZmFsc2UpOwotCQkJUEtURlJFRShvc2gsIHBrdCwgdHJ1ZSk7CisJCQlwa3RfYnVmX2ZyZWVfc2tiKG9zaCwgcGt0LCB0cnVlKTsKIAkJCURIRF9FUlJPUigoIiVzOiBvdXQgb2YgYnVzLT50eHEgISEhXG4iLCBfX2Z1bmNfXykpOwogCQkJcmV0ID0gQkNNRV9OT1JFU09VUkNFOwogCQl9IGVsc2UgewpAQCAtMTE2Miw3ICsxMTY3LDcgQEAKIAogc3RhdGljIHVpbnQgZGhkc2Rpb19zZW5kZnJvbXEoZGhkX2J1c190ICpidXMsIHVpbnQgbWF4ZnJhbWVzKQogewotCXZvaWQgKnBrdDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqcGt0OwogCXUzMiBpbnRzdGF0dXMgPSAwOwogCXVpbnQgcmV0cmllcyA9IDA7CiAJaW50IHJldCA9IDAsIHByZWNfb3V0OwpAQCAtMTE4Niw3ICsxMTkxLDcgQEAKIAkJCWJyZWFrOwogCQl9CiAJCWRoZF9vc19zZHVubG9ja190eHEoYnVzLT5kaGQpOwotCQlkYXRhbGVuID0gUEtUTEVOKHBrdCkgLSBTRFBDTV9IRFJMRU47CisJCWRhdGFsZW4gPSBwa3QtPmxlbiAtIFNEUENNX0hEUkxFTjsKIAogI2lmbmRlZiBTRFRFU1QKIAkJcmV0ID0gZGhkc2Rpb190eHBrdChidXMsIHBrdCwgU0RQQ01fREFUQV9DSEFOTkVMLCB0cnVlKTsKQEAgLTEyNDcsNyArMTI1Miw3IEBACiAJCQlmcmFtZSAtPSBkb2ZmOwogCQkJbGVuICs9IGRvZmY7CiAJCQltc2dsZW4gKz0gZG9mZjsKLQkJCWJ6ZXJvKGZyYW1lLCBkb2ZmICsgU0RQQ01fSERSTEVOKTsKKwkJCW1lbXNldChmcmFtZSwgMCwgZG9mZiArIFNEUENNX0hEUkxFTik7CiAJCX0KIAkJQVNTRVJUKGRvZmYgPCBESERfU0RBTElHTik7CiAJfQpAQCAtMjUzMSw3ICsyNTM2LDcgQEAKIAkJaWYgKCF2YnVmZmVyKQogCQkJcmV0dXJuIEJDTUVfTk9NRU07CiAKLQkJYnplcm8odmJ1ZmZlciwgdmFyc2l6ZSk7CisJCW1lbXNldCh2YnVmZmVyLCAwLCB2YXJzaXplKTsKIAkJYmNvcHkoYnVzLT52YXJzLCB2YnVmZmVyLCBidXMtPnZhcnN6KTsKIAogCQkvKiBXcml0ZSB0aGUgdmFycyBsaXN0ICovCkBAIC0yODIzLDcgKzI4MjgsNyBAQAogCiB2b2lkIGRoZF9idXNfc3RvcChzdHJ1Y3QgZGhkX2J1cyAqYnVzLCBib29sIGVuZm9yY2VfbXV0ZXgpCiB7Ci0Jb3NsX3QgKm9zaCA9IGJ1cy0+ZGhkLT5vc2g7CisJc3RydWN0IG9zbF9pbmZvICpvc2ggPSBidXMtPmRoZC0+b3NoOwogCXUzMiBsb2NhbF9ob3N0aW50bWFzazsKIAl1OCBzYXZlY2xrOwogCXVpbnQgcmV0cmllczsKQEAgLTI4NzcsMTAgKzI4ODIsMTAgQEAKIAogCS8qIENsZWFyIGFueSBoZWxkIGdsb21taW5nIHN0dWZmICovCiAJaWYgKGJ1cy0+Z2xvbWQpCi0JCVBLVEZSRUUob3NoLCBidXMtPmdsb21kLCBmYWxzZSk7CisJCXBrdF9idWZfZnJlZV9za2Iob3NoLCBidXMtPmdsb21kLCBmYWxzZSk7CiAKIAlpZiAoYnVzLT5nbG9tKQotCQlQS1RGUkVFKG9zaCwgYnVzLT5nbG9tLCBmYWxzZSk7CisJCXBrdF9idWZfZnJlZV9za2Iob3NoLCBidXMtPmdsb20sIGZhbHNlKTsKIAogCWJ1cy0+Z2xvbSA9IGJ1cy0+Z2xvbWQgPSBOVUxMOwogCkBAIC0zMTc4LDggKzMxODMsOCBAQAogCXU4ICpkcHRyLCBudW0gPSAwOwogCiAJdTE2IHN1YmxlbiwgY2hlY2s7Ci0Jdm9pZCAqcGZpcnN0LCAqcGxhc3QsICpwbmV4dCwgKnNhdmVfcGZpcnN0OwotCW9zbF90ICpvc2ggPSBidXMtPmRoZC0+b3NoOworCXN0cnVjdCBza19idWZmICpwZmlyc3QsICpwbGFzdCwgKnBuZXh0LCAqc2F2ZV9wZmlyc3Q7CisJc3RydWN0IG9zbF9pbmZvICpvc2ggPSBidXMtPmRoZC0+b3NoOwogCiAJaW50IGVycmNvZGU7CiAJdTggY2hhbiwgc2VxLCBkb2ZmLCBzZmRvZmY7CkBAIC0zMTk5LDggKzMyMDQsOCBAQAogCQlkaGRfb3Nfc2Rsb2NrX3J4cShidXMtPmRoZCk7CiAKIAkJcGZpcnN0ID0gcGxhc3QgPSBwbmV4dCA9IE5VTEw7Ci0JCWRsZW4gPSAodTE2KSBQS1RMRU4oYnVzLT5nbG9tZCk7Ci0JCWRwdHIgPSBQS1REQVRBKGJ1cy0+Z2xvbWQpOworCQlkbGVuID0gKHUxNikgKGJ1cy0+Z2xvbWQtPmxlbik7CisJCWRwdHIgPSBidXMtPmdsb21kLT5kYXRhOwogCQlpZiAoIWRsZW4gfHwgKGRsZW4gJiAxKSkgewogCQkJREhEX0VSUk9SKCgiJXM6IGJhZCBnbG9tZCBsZW4oJWQpLCBpZ25vcmUgZGVzY3JpcHRvclxuIiwKIAkJCV9fZnVuY19fLCBkbGVuKSk7CkBAIC0zMjM1LDE5ICszMjQwLDE5IEBACiAJCQl9CiAKIAkJCS8qIEFsbG9jYXRlL2NoYWluIHBhY2tldCBmb3IgbmV4dCBzdWJmcmFtZSAqLwotCQkJcG5leHQgPSBQS1RHRVQob3NoLCBzdWJsZW4gKyBESERfU0RBTElHTiwgZmFsc2UpOworCQkJcG5leHQgPSBwa3RfYnVmX2dldF9za2Iob3NoLCBzdWJsZW4gKyBESERfU0RBTElHTik7CiAJCQlpZiAocG5leHQgPT0gTlVMTCkgewotCQkJCURIRF9FUlJPUigoIiVzOiBQS1RHRVQgZmFpbGVkLCBudW0gJWQgbGVuICVkXG4iLAorCQkJCURIRF9FUlJPUigoIiVzOiBwa3RfYnVmX2dldF9za2IgZmFpbGVkLCBudW0gJWQgbGVuICVkXG4iLAogCQkJCQkgICBfX2Z1bmNfXywgbnVtLCBzdWJsZW4pKTsKIAkJCQlicmVhazsKIAkJCX0KLQkJCUFTU0VSVCghUEtUTElOSyhwbmV4dCkpOworCQkJQVNTRVJUKCEocG5leHQtPnByZXYpKTsKIAkJCWlmICghcGZpcnN0KSB7CiAJCQkJQVNTRVJUKCFwbGFzdCk7CiAJCQkJcGZpcnN0ID0gcGxhc3QgPSBwbmV4dDsKIAkJCX0gZWxzZSB7CiAJCQkJQVNTRVJUKHBsYXN0KTsKLQkJCQlQS1RTRVRORVhUKHBsYXN0LCBwbmV4dCk7CisJCQkJcGxhc3QtPm5leHQgPSBwbmV4dDsKIAkJCQlwbGFzdCA9IHBuZXh0OwogCQkJfQogCkBAIC0zMjcxLDEzICszMjc2LDEzIEBACiAJCQlwZmlyc3QgPSBwbmV4dCA9IE5VTEw7CiAJCX0gZWxzZSB7CiAJCQlpZiAocGZpcnN0KQotCQkJCVBLVEZSRUUob3NoLCBwZmlyc3QsIGZhbHNlKTsKKwkJCQlwa3RfYnVmX2ZyZWVfc2tiKG9zaCwgcGZpcnN0LCBmYWxzZSk7CiAJCQlidXMtPmdsb20gPSBOVUxMOwogCQkJbnVtID0gMDsKIAkJfQogCiAJCS8qIERvbmUgd2l0aCBkZXNjcmlwdG9yIHBhY2tldCAqLwotCQlQS1RGUkVFKG9zaCwgYnVzLT5nbG9tZCwgZmFsc2UpOworCQlwa3RfYnVmX2ZyZWVfc2tiKG9zaCwgYnVzLT5nbG9tZCwgZmFsc2UpOwogCQlidXMtPmdsb21kID0gTlVMTDsKIAkJYnVzLT5uZXh0bGVuID0gMDsKIApAQCAtMzI5MCwxMCArMzI5NSwxMCBAQAogCQlpZiAoREhEX0dMT01fT04oKSkgewogCQkJREhEX0dMT00oKCIlczogdHJ5IHN1cGVyZnJhbWUgcmVhZCwgcGFja2V0IGNoYWluOlxuIiwKIAkJCQlfX2Z1bmNfXykpOwotCQkJZm9yIChwbmV4dCA9IGJ1cy0+Z2xvbTsgcG5leHQ7IHBuZXh0ID0gUEtUTkVYVChwbmV4dCkpIHsKKwkJCWZvciAocG5leHQgPSBidXMtPmdsb207IHBuZXh0OyBwbmV4dCA9IHBuZXh0LT5uZXh0KSB7CiAJCQkJREhEX0dMT00oKCIgICAgJXA6ICVwIGxlbiAweCUwNHggKCVkKVxuIiwKLQkJCQkJICBwbmV4dCwgKHU4ICopIFBLVERBVEEocG5leHQpLAotCQkJCQkgIFBLVExFTihwbmV4dCksIFBLVExFTihwbmV4dCkpKTsKKwkJCQkJICBwbmV4dCwgKHU4ICopIChwbmV4dC0+ZGF0YSksCisJCQkJCSAgcG5leHQtPmxlbiwgcG5leHQtPmxlbikpOwogCQkJfQogCQl9CiAKQEAgLTMzMDksNyArMzMxNCw3IEBACiAJCQkJCQkgICAgICBiY21zZGhfY3VyX3Nid2FkCiAJCQkJCQkgICAgICAoYnVzLT5zZGgpLCBTRElPX0ZVTkNfMiwKIAkJCQkJCSAgICAgIEYyU1lOQywKLQkJCQkJCSAgICAgICh1OCAqKSBQS1REQVRBKHBmaXJzdCksCisJCQkJCQkgICAgICAodTggKikgcGZpcnN0LT5kYXRhLAogCQkJCQkJICAgICAgZGxlbiwgcGZpcnN0LCBOVUxMLCBOVUxMKTsKIAkJfSBlbHNlIGlmIChidXMtPmRhdGFwdHIpIHsKIAkJCWVycmNvZGUgPSBkaGRfYmNtc2RoX3JlY3ZfYnVmKGJ1cywKQEAgLTMzNDYsNyArMzM1MSw3IEBACiAJCQkJYnVzLT5nbG9tZXJyID0gMDsKIAkJCQlkaGRzZGlvX3J4ZmFpbChidXMsIHRydWUsIGZhbHNlKTsKIAkJCQlkaGRfb3Nfc2Rsb2NrX3J4cShidXMtPmRoZCk7Ci0JCQkJUEtURlJFRShvc2gsIGJ1cy0+Z2xvbSwgZmFsc2UpOworCQkJCXBrdF9idWZfZnJlZV9za2Iob3NoLCBidXMtPmdsb20sIGZhbHNlKTsKIAkJCQlkaGRfb3Nfc2R1bmxvY2tfcnhxKGJ1cy0+ZGhkKTsKIAkJCQlidXMtPnJ4Z2xvbWZhaWwrKzsKIAkJCQlidXMtPmdsb20gPSBOVUxMOwpAQCAtMzM1NSwxMyArMzM2MCwxMyBAQAogCQl9CiAjaWZkZWYgREhEX0RFQlVHCiAJCWlmIChESERfR0xPTV9PTigpKSB7Ci0JCQlwcmhleCgiU1VQRVJGUkFNRSIsIFBLVERBVEEocGZpcnN0KSwKLQkJCSAgICAgIG1pbl90KGludCwgUEtUTEVOKHBmaXJzdCksIDQ4KSk7CisJCQlwcmhleCgiU1VQRVJGUkFNRSIsIHBmaXJzdC0+ZGF0YSwKKwkJCSAgICAgIG1pbl90KGludCwgcGZpcnN0LT5sZW4sIDQ4KSk7CiAJCX0KICNlbmRpZgogCiAJCS8qIFZhbGlkYXRlIHRoZSBzdXBlcmZyYW1lIGhlYWRlciAqLwotCQlkcHRyID0gKHU4ICopIFBLVERBVEEocGZpcnN0KTsKKwkJZHB0ciA9ICh1OCAqKSAocGZpcnN0LT5kYXRhKTsKIAkJc3VibGVuID0gbHRvaDE2X3VhKGRwdHIpOwogCQljaGVjayA9IGx0b2gxNl91YShkcHRyICsgc2l6ZW9mKHUxNikpOwogCkBAIC0zMzk5LDExICszNDA0LDExIEBACiAJCQkJICAgX19mdW5jX18pKTsKIAkJCWVycmNvZGUgPSAtMTsKIAkJfSBlbHNlIGlmICgoZG9mZiA8IFNEUENNX0hEUkxFTikgfHwKLQkJCSAgIChkb2ZmID4gKFBLVExFTihwZmlyc3QpIC0gU0RQQ01fSERSTEVOKSkpIHsKKwkJCSAgIChkb2ZmID4gKHBmaXJzdC0+bGVuIC0gU0RQQ01fSERSTEVOKSkpIHsKIAkJCURIRF9FUlJPUigoIiVzIChzdXBlcmZyYW1lKTogQmFkIGRhdGEgb2Zmc2V0ICVkOiBIVyAlZCAiCiAJCQkJInBrdCAlZCBtaW4gJWRcbiIsCiAJCQkJX19mdW5jX18sIGRvZmYsIHN1YmxlbiwKLQkJCQlQS1RMRU4ocGZpcnN0KSwgU0RQQ01fSERSTEVOKSk7CisJCQkJcGZpcnN0LT5sZW4sIFNEUENNX0hEUkxFTikpOwogCQkJZXJyY29kZSA9IC0xOwogCQl9CiAKQEAgLTM0MjQsMTQgKzM0MjksMTQgQEAKIAkJYnVzLT50eF9tYXggPSB0eG1heDsKIAogCQkvKiBSZW1vdmUgc3VwZXJmcmFtZSBoZWFkZXIsIHJlbWVtYmVyIG9mZnNldCAqLwotCQlQS1RQVUxMKHBmaXJzdCwgZG9mZik7CisJCXNrYl9wdWxsKHBmaXJzdCwgZG9mZik7CiAJCXNmZG9mZiA9IGRvZmY7CiAKIAkJLyogVmFsaWRhdGUgYWxsIHRoZSBzdWJmcmFtZSBoZWFkZXJzICovCiAJCWZvciAobnVtID0gMCwgcG5leHQgPSBwZmlyc3Q7IHBuZXh0ICYmICFlcnJjb2RlOwotCQkgICAgIG51bSsrLCBwbmV4dCA9IFBLVE5FWFQocG5leHQpKSB7Ci0JCQlkcHRyID0gKHU4ICopIFBLVERBVEEocG5leHQpOwotCQkJZGxlbiA9ICh1MTYpIFBLVExFTihwbmV4dCk7CisJCSAgICAgbnVtKyssIHBuZXh0ID0gcG5leHQtPm5leHQpIHsKKwkJCWRwdHIgPSAodTggKikgKHBuZXh0LT5kYXRhKTsKKwkJCWRsZW4gPSAodTE2KSAocG5leHQtPmxlbik7CiAJCQlzdWJsZW4gPSBsdG9oMTZfdWEoZHB0cik7CiAJCQljaGVjayA9IGx0b2gxNl91YShkcHRyICsgc2l6ZW9mKHUxNikpOwogCQkJY2hhbiA9IFNEUENNX1BBQ0tFVF9DSEFOTkVMKCZkcHRyW1NEUENNX0ZSQU1FVEFHX0xFTl0pOwpAQCAtMzQ2OSwxMyArMzQ3NCwxMyBAQAogCQkJCSBhIGNvdXBsZSByZXRyaWVzICovCiAJCQlpZiAoYnVzLT5nbG9tZXJyKysgPCAzKSB7CiAJCQkJLyogUmVzdG9yZSBzdXBlcmZyYW1lIGhlYWRlciBzcGFjZSAqLwotCQkJCVBLVFBVU0gocGZpcnN0LCBzZmRvZmYpOworCQkJCXNrYl9wdXNoKHBmaXJzdCwgc2Zkb2ZmKTsKIAkJCQlkaGRzZGlvX3J4ZmFpbChidXMsIHRydWUsIHRydWUpOwogCQkJfSBlbHNlIHsKIAkJCQlidXMtPmdsb21lcnIgPSAwOwogCQkJCWRoZHNkaW9fcnhmYWlsKGJ1cywgdHJ1ZSwgZmFsc2UpOwogCQkJCWRoZF9vc19zZGxvY2tfcnhxKGJ1cy0+ZGhkKTsKLQkJCQlQS1RGUkVFKG9zaCwgYnVzLT5nbG9tLCBmYWxzZSk7CisJCQkJcGt0X2J1Zl9mcmVlX3NrYihvc2gsIGJ1cy0+Z2xvbSwgZmFsc2UpOwogCQkJCWRoZF9vc19zZHVubG9ja19yeHEoYnVzLT5kaGQpOwogCQkJCWJ1cy0+cnhnbG9tZmFpbCsrOwogCQkJCWJ1cy0+Z2xvbSA9IE5VTEw7CkBAIC0zNDkxLDEwICszNDk2LDEwIEBACiAKIAkJZGhkX29zX3NkbG9ja19yeHEoYnVzLT5kaGQpOwogCQlmb3IgKG51bSA9IDA7IHBmaXJzdDsgcnhzZXErKywgcGZpcnN0ID0gcG5leHQpIHsKLQkJCXBuZXh0ID0gUEtUTkVYVChwZmlyc3QpOwotCQkJUEtUU0VUTkVYVChwZmlyc3QsIE5VTEwpOworCQkJcG5leHQgPSBwZmlyc3QtPm5leHQ7CisJCQlwZmlyc3QtPm5leHQgPSBOVUxMOwogCi0JCQlkcHRyID0gKHU4ICopIFBLVERBVEEocGZpcnN0KTsKKwkJCWRwdHIgPSAodTggKikgKHBmaXJzdC0+ZGF0YSk7CiAJCQlzdWJsZW4gPSBsdG9oMTZfdWEoZHB0cik7CiAJCQljaGFuID0gU0RQQ01fUEFDS0VUX0NIQU5ORUwoJmRwdHJbU0RQQ01fRlJBTUVUQUdfTEVOXSk7CiAJCQlzZXEgPSBTRFBDTV9QQUNLRVRfU0VRVUVOQ0UoJmRwdHJbU0RQQ01fRlJBTUVUQUdfTEVOXSk7CkBAIC0zNTAyLDggKzM1MDcsOCBAQAogCiAJCQlESERfR0xPTSgoIiVzOiBHZXQgc3ViZnJhbWUgJWQsICVwKCVwLyVkKSwgc3VibGVuICVkICIKIAkJCQkiY2hhbiAlZCBzZXEgJWRcbiIsCi0JCQkJX19mdW5jX18sIG51bSwgcGZpcnN0LCBQS1REQVRBKHBmaXJzdCksCi0JCQkJUEtUTEVOKHBmaXJzdCksIHN1YmxlbiwgY2hhbiwgc2VxKSk7CisJCQkJX19mdW5jX18sIG51bSwgcGZpcnN0LCBwZmlyc3QtPmRhdGEsCisJCQkJcGZpcnN0LT5sZW4sIHN1YmxlbiwgY2hhbiwgc2VxKSk7CiAKIAkJCUFTU0VSVCgoY2hhbiA9PSBTRFBDTV9EQVRBX0NIQU5ORUwpCiAJCQkgICAgICAgfHwgKGNoYW4gPT0gU0RQQ01fRVZFTlRfQ0hBTk5FTCkpOwpAQCAtMzUxOSwxMyArMzUyNCwxMyBAQAogCQkJCXByaGV4KCJSeCBTdWJmcmFtZSBEYXRhIiwgZHB0ciwgZGxlbik7CiAjZW5kaWYKIAotCQkJUEtUU0VUTEVOKHBmaXJzdCwgc3VibGVuKTsKLQkJCVBLVFBVTEwocGZpcnN0LCBkb2ZmKTsKKwkJCV9fc2tiX3RyaW0ocGZpcnN0LCBzdWJsZW4pOworCQkJc2tiX3B1bGwocGZpcnN0LCBkb2ZmKTsKIAotCQkJaWYgKFBLVExFTihwZmlyc3QpID09IDApIHsKLQkJCQlQS1RGUkVFKGJ1cy0+ZGhkLT5vc2gsIHBmaXJzdCwgZmFsc2UpOworCQkJaWYgKHBmaXJzdC0+bGVuID09IDApIHsKKwkJCQlwa3RfYnVmX2ZyZWVfc2tiKGJ1cy0+ZGhkLT5vc2gsIHBmaXJzdCwgZmFsc2UpOwogCQkJCWlmIChwbGFzdCkgewotCQkJCQlQS1RTRVRORVhUKHBsYXN0LCBwbmV4dCk7CisJCQkJCXBsYXN0LT5uZXh0ID0gcG5leHQ7CiAJCQkJfSBlbHNlIHsKIAkJCQkJQVNTRVJUKHNhdmVfcGZpcnN0ID09IHBmaXJzdCk7CiAJCQkJCXNhdmVfcGZpcnN0ID0gcG5leHQ7CkBAIC0zNTM2LDkgKzM1NDEsOSBAQAogCQkJCURIRF9FUlJPUigoIiVzOiByeCBwcm90b2NvbCBlcnJvclxuIiwKIAkJCQkJICAgX19mdW5jX18pKTsKIAkJCQlidXMtPmRoZC0+cnhfZXJyb3JzKys7Ci0JCQkJUEtURlJFRShvc2gsIHBmaXJzdCwgZmFsc2UpOworCQkJCXBrdF9idWZfZnJlZV9za2Iob3NoLCBwZmlyc3QsIGZhbHNlKTsKIAkJCQlpZiAocGxhc3QpIHsKLQkJCQkJUEtUU0VUTkVYVChwbGFzdCwgcG5leHQpOworCQkJCQlwbGFzdC0+bmV4dCA9IHBuZXh0OwogCQkJCX0gZWxzZSB7CiAJCQkJCUFTU0VSVChzYXZlX3BmaXJzdCA9PSBwZmlyc3QpOwogCQkJCQlzYXZlX3BmaXJzdCA9IHBuZXh0OwpAQCAtMzU0OCw3ICszNTUzLDcgQEAKIAogCQkJLyogdGhpcyBwYWNrZXQgd2lsbCBnbyB1cCwgbGluayBiYWNrIGludG8KIAkJCQkgY2hhaW4gYW5kIGNvdW50IGl0ICovCi0JCQlQS1RTRVRORVhUKHBmaXJzdCwgcG5leHQpOworCQkJcGZpcnN0LT5uZXh0ID0gcG5leHQ7CiAJCQlwbGFzdCA9IHBmaXJzdDsKIAkJCW51bSsrOwogCkBAIC0zNTU2LDExICszNTYxLDExIEBACiAJCQlpZiAoREhEX0dMT01fT04oKSkgewogCQkJCURIRF9HTE9NKCgiJXMgc3ViZnJhbWUgJWQgdG8gc3RhY2ssICVwKCVwLyVkKSAiCiAJCQkJIm54dC9sbmsgJXAvJXBcbiIsCi0JCQkJX19mdW5jX18sIG51bSwgcGZpcnN0LCBQS1REQVRBKHBmaXJzdCksCi0JCQkJUEtUTEVOKHBmaXJzdCksIFBLVE5FWFQocGZpcnN0KSwKLQkJCQlQS1RMSU5LKHBmaXJzdCkpKTsKLQkJCQlwcmhleCgiIiwgKHU4ICopIFBLVERBVEEocGZpcnN0KSwKLQkJCQkgICAgICBtaW5fdChpbnQsIFBLVExFTihwZmlyc3QpLCAzMikpOworCQkJCV9fZnVuY19fLCBudW0sIHBmaXJzdCwgcGZpcnN0LT5kYXRhLAorCQkJCXBmaXJzdC0+bGVuLCBwZmlyc3QtPm5leHQsCisJCQkJcGZpcnN0LT5wcmV2KSk7CisJCQkJcHJoZXgoIiIsICh1OCAqKSBwZmlyc3QtPmRhdGEsCisJCQkJICAgICAgbWluX3QoaW50LCBwZmlyc3QtPmxlbiwgMzIpKTsKIAkJCX0KICNlbmRpZgkJCQkvKiBESERfREVCVUcgKi8KIAkJfQpAQCAtMzU4MCw3ICszNTg1LDcgQEAKIC8qIFJldHVybiB0cnVlIGlmIHRoZXJlIG1heSBiZSBtb3JlIGZyYW1lcyB0byByZWFkICovCiBzdGF0aWMgdWludCBkaGRzZGlvX3JlYWRmcmFtZXMoZGhkX2J1c190ICpidXMsIHVpbnQgbWF4ZnJhbWVzLCBib29sICpmaW5pc2hlZCkKIHsKLQlvc2xfdCAqb3NoID0gYnVzLT5kaGQtPm9zaDsKKwlzdHJ1Y3Qgb3NsX2luZm8gKm9zaCA9IGJ1cy0+ZGhkLT5vc2g7CiAJYmNtc2RoX2luZm9fdCAqc2RoID0gYnVzLT5zZGg7CiAKIAl1MTYgbGVuLCBjaGVjazsJLyogRXh0cmFjdGVkIGhhcmR3YXJlIGhlYWRlciBmaWVsZHMgKi8KQEAgLTM1ODgsNyArMzU5Myw3IEBACiAJdTggZmNiaXRzOwkJLyogRXh0cmFjdGVkIGZjYml0cyBmcm9tIHNvZnR3YXJlIGhlYWRlciAqLwogCXU4IGRlbHRhOwogCi0Jdm9pZCAqcGt0OwkJLyogUGFja2V0IGZvciBldmVudCBvciBkYXRhIGZyYW1lcyAqLworCXN0cnVjdCBza19idWZmICpwa3Q7CQkvKiBQYWNrZXQgZm9yIGV2ZW50IG9yIGRhdGEgZnJhbWVzICovCiAJdTE2IHBhZDsJCS8qIE51bWJlciBvZiBwYWQgYnl0ZXMgdG8gcmVhZCAqLwogCXUxNiByZGxlbjsJCS8qIFRvdGFsIG51bWJlciBvZiBieXRlcyB0byByZWFkICovCiAJdTggcnhzZXE7CQkvKiBOZXh0IHNlcXVlbmNlIG51bWJlciB0byBleHBlY3QgKi8KQEAgLTM2NzUsNyArMzY4MCw3IEBACiAJCQkgKi8KIAkJCS8qIEFsbG9jYXRlIGEgcGFja2V0IGJ1ZmZlciAqLwogCQkJZGhkX29zX3NkbG9ja19yeHEoYnVzLT5kaGQpOwotCQkJcGt0ID0gUEtUR0VUKG9zaCwgcmRsZW4gKyBESERfU0RBTElHTiwgZmFsc2UpOworCQkJcGt0ID0gcGt0X2J1Zl9nZXRfc2tiKG9zaCwgcmRsZW4gKyBESERfU0RBTElHTik7CiAJCQlpZiAoIXBrdCkgewogCQkJCWlmIChidXMtPmJ1cyA9PSBTUElfQlVTKSB7CiAJCQkJCWJ1cy0+dXNlYnVmcG9vbCA9IGZhbHNlOwpAQCAtMzcyMSw3ICszNzI2LDcgQEAKIAkJCQl9IGVsc2UgewogCQkJCQkvKiBHaXZlIHVwIG9uIGRhdGEsCiAJCQkJCXJlcXVlc3QgcnR4IG9mIGV2ZW50cyAqLwotCQkJCQlESERfRVJST1IoKCIlcyAobmV4dGxlbik6IFBLVEdFVCBmYWlsZWQ6IGxlbiAlZCByZGxlbiAlZCAiICJleHBlY3RlZCByeHNlcSAlZFxuIiwKKwkJCQkJREhEX0VSUk9SKCgiJXMgKG5leHRsZW4pOiBwa3RfYnVmX2dldF9za2IgZmFpbGVkOiBsZW4gJWQgcmRsZW4gJWQgIiAiZXhwZWN0ZWQgcnhzZXEgJWRcbiIsCiAJCQkJCQlfX2Z1bmNfXywgbGVuLCByZGxlbiwgcnhzZXEpKTsKIAkJCQkJLyogSnVzdCBnbyB0cnkgYWdhaW4gdy9ub3JtYWwKIAkJCQkJaGVhZGVyIHJlYWQgKi8KQEAgLTM3MzIsOSArMzczNyw5IEBACiAJCQkJaWYgKGJ1cy0+YnVzID09IFNQSV9CVVMpCiAJCQkJCWJ1cy0+dXNlYnVmcG9vbCA9IHRydWU7CiAKLQkJCQlBU1NFUlQoIVBLVExJTksocGt0KSk7CisJCQkJQVNTRVJUKCEocGt0LT5wcmV2KSk7CiAJCQkJUEtUQUxJR04ob3NoLCBwa3QsIHJkbGVuLCBESERfU0RBTElHTik7Ci0JCQkJcnhidWYgPSAodTggKikgUEtUREFUQShwa3QpOworCQkJCXJ4YnVmID0gKHU4ICopIChwa3QtPmRhdGEpOwogCQkJCS8qIFJlYWQgdGhlIGVudGlyZSBmcmFtZSAqLwogCQkJCXNkcmV0ID0KIAkJCQkgICAgZGhkX2JjbXNkaF9yZWN2X2J1ZihidXMsCkBAIC0zNzQ4LDcgKzM3NTMsNyBAQAogCQkJCWlmIChzZHJldCA8IDApIHsKIAkJCQkJREhEX0VSUk9SKCgiJXMgKG5leHRsZW4pOiByZWFkICVkIGJ5dGVzIGZhaWxlZDogJWRcbiIsCiAJCQkJCQlfX2Z1bmNfXywgcmRsZW4sIHNkcmV0KSk7Ci0JCQkJCVBLVEZSRUUoYnVzLT5kaGQtPm9zaCwgcGt0LCBmYWxzZSk7CisJCQkJCXBrdF9idWZfZnJlZV9za2IoYnVzLT5kaGQtPm9zaCwgcGt0LCBmYWxzZSk7CiAJCQkJCWJ1cy0+ZGhkLT5yeF9lcnJvcnMrKzsKIAkJCQkJZGhkX29zX3NkdW5sb2NrX3J4cShidXMtPmRoZCk7CiAJCQkJCS8qIEZvcmNlIHJldHJ5IHcvbm9ybWFsIGhlYWRlciByZWFkLgpAQCAtMzg5Niw3ICszOTAxLDcgQEAKIAkJCQkJCQkgICAgIGRvZmYpOwogCQkJCQlpZiAoYnVzLT51c2VidWZwb29sKSB7CiAJCQkJCQlkaGRfb3Nfc2Rsb2NrX3J4cShidXMtPmRoZCk7Ci0JCQkJCQlQS1RGUkVFKGJ1cy0+ZGhkLT5vc2gsIHBrdCwKKwkJCQkJCXBrdF9idWZfZnJlZV9za2IoYnVzLT5kaGQtPm9zaCwgcGt0LAogCQkJCQkJCWZhbHNlKTsKIAkJCQkJCWRoZF9vc19zZHVubG9ja19yeHEoYnVzLT5kaGQpOwogCQkJCQl9CkBAIC00MDg2LDEwICs0MDkxLDEwIEBACiAJCX0KIAogCQlkaGRfb3Nfc2Rsb2NrX3J4cShidXMtPmRoZCk7Ci0JCXBrdCA9IFBLVEdFVChvc2gsIChyZGxlbiArIGZpcnN0cmVhZCArIERIRF9TREFMSUdOKSwgZmFsc2UpOworCQlwa3QgPSBwa3RfYnVmX2dldF9za2Iob3NoLCAocmRsZW4gKyBmaXJzdHJlYWQgKyBESERfU0RBTElHTikpOwogCQlpZiAoIXBrdCkgewogCQkJLyogR2l2ZSB1cCBvbiBkYXRhLCByZXF1ZXN0IHJ0eCBvZiBldmVudHMgKi8KLQkJCURIRF9FUlJPUigoIiVzOiBQS1RHRVQgZmFpbGVkOiByZGxlbiAlZCBjaGFuICVkXG4iLAorCQkJREhEX0VSUk9SKCgiJXM6IHBrdF9idWZfZ2V0X3NrYiBmYWlsZWQ6IHJkbGVuICVkIGNoYW4gJWRcbiIsCiAJCQkJICAgX19mdW5jX18sIHJkbGVuLCBjaGFuKSk7CiAJCQlidXMtPmRoZC0+cnhfZHJvcHBlZCsrOwogCQkJZGhkX29zX3NkdW5sb2NrX3J4cShidXMtPmRoZCk7CkBAIC00MDk4LDE3ICs0MTAzLDE3IEBACiAJCX0KIAkJZGhkX29zX3NkdW5sb2NrX3J4cShidXMtPmRoZCk7CiAKLQkJQVNTRVJUKCFQS1RMSU5LKHBrdCkpOworCQlBU1NFUlQoIShwa3QtPnByZXYpKTsKIAogCQkvKiBMZWF2ZSByb29tIGZvciB3aGF0IHdlIGFscmVhZHkgcmVhZCwgYW5kIGFsaWduIHJlbWFpbmRlciAqLwotCQlBU1NFUlQoZmlyc3RyZWFkIDwgKFBLVExFTihwa3QpKSk7Ci0JCVBLVFBVTEwocGt0LCBmaXJzdHJlYWQpOworCQlBU1NFUlQoZmlyc3RyZWFkIDwgcGt0LT5sZW4pOworCQlza2JfcHVsbChwa3QsIGZpcnN0cmVhZCk7CiAJCVBLVEFMSUdOKG9zaCwgcGt0LCByZGxlbiwgREhEX1NEQUxJR04pOwogCiAJCS8qIFJlYWQgdGhlIHJlbWFpbmluZyBmcmFtZSBkYXRhICovCiAJCXNkcmV0ID0KIAkJICAgIGRoZF9iY21zZGhfcmVjdl9idWYoYnVzLCBiY21zZGhfY3VyX3Nid2FkKHNkaCksIFNESU9fRlVOQ18yLAotCQkJCQlGMlNZTkMsICgodTggKikgUEtUREFUQShwa3QpKSwgcmRsZW4sCisJCQkJCUYyU1lOQywgKCh1OCAqKSAocGt0LT5kYXRhKSksIHJkbGVuLAogCQkJCQlwa3QsIE5VTEwsIE5VTEwpOwogCQlidXMtPmYycnhkYXRhKys7CiAJCUFTU0VSVChzZHJldCAhPSBCQ01FX1BFTkRJTkcpOwpAQCAtNDEyMiw3ICs0MTI3LDcgQEAKIAkJCQkgICAgICAgPyAiZGF0YSIgOiAidGVzdCIpKSwKIAkJCQkgICBzZHJldCkpOwogCQkJZGhkX29zX3NkbG9ja19yeHEoYnVzLT5kaGQpOwotCQkJUEtURlJFRShidXMtPmRoZC0+b3NoLCBwa3QsIGZhbHNlKTsKKwkJCXBrdF9idWZfZnJlZV9za2IoYnVzLT5kaGQtPm9zaCwgcGt0LCBmYWxzZSk7CiAJCQlkaGRfb3Nfc2R1bmxvY2tfcnhxKGJ1cy0+ZGhkKTsKIAkJCWJ1cy0+ZGhkLT5yeF9lcnJvcnMrKzsKIAkJCWRoZHNkaW9fcnhmYWlsKGJ1cywgdHJ1ZSwgUkVUUllDSEFOKGNoYW4pKTsKQEAgLTQxMzAsMTIgKzQxMzUsMTIgQEAKIAkJfQogCiAJCS8qIENvcHkgdGhlIGFscmVhZHktcmVhZCBwb3J0aW9uICovCi0JCVBLVFBVU0gocGt0LCBmaXJzdHJlYWQpOwotCQliY29weShidXMtPnJ4aGRyLCBQS1REQVRBKHBrdCksIGZpcnN0cmVhZCk7CisJCXNrYl9wdXNoKHBrdCwgZmlyc3RyZWFkKTsKKwkJYmNvcHkoYnVzLT5yeGhkciwgcGt0LT5kYXRhLCBmaXJzdHJlYWQpOwogCiAjaWZkZWYgREhEX0RFQlVHCiAJCWlmIChESERfQllURVNfT04oKSAmJiBESERfREFUQV9PTigpKQotCQkJcHJoZXgoIlJ4IERhdGEiLCBQS1REQVRBKHBrdCksIGxlbik7CisJCQlwcmhleCgiUnggRGF0YSIsIHBrdC0+ZGF0YSwgbGVuKTsKICNlbmRpZgogCiBkZWxpdmVyOgpAQCAtNDE0NiwxMiArNDE1MSwxMiBAQAogCQkJCQlfX2Z1bmNfXywgbGVuKSk7CiAjaWZkZWYgREhEX0RFQlVHCiAJCQkJaWYgKERIRF9HTE9NX09OKCkpIHsKLQkJCQkJcHJoZXgoIkdsb20gRGF0YSIsIFBLVERBVEEocGt0KSwgbGVuKTsKKwkJCQkJcHJoZXgoIkdsb20gRGF0YSIsIHBrdC0+ZGF0YSwgbGVuKTsKIAkJCQl9CiAjZW5kaWYKLQkJCQlQS1RTRVRMRU4ocGt0LCBsZW4pOworCQkJCV9fc2tiX3RyaW0ocGt0LCBsZW4pOwogCQkJCUFTU0VSVChkb2ZmID09IFNEUENNX0hEUkxFTik7Ci0JCQkJUEtUUFVMTChwa3QsIFNEUENNX0hEUkxFTik7CisJCQkJc2tiX3B1bGwocGt0LCBTRFBDTV9IRFJMRU4pOwogCQkJCWJ1cy0+Z2xvbWQgPSBwa3Q7CiAJCQl9IGVsc2UgewogCQkJCURIRF9FUlJPUigoIiVzOiBnbG9tIHN1cGVyZnJhbWUgdy9vICIKQEAgLTQxNjIsOCArNDE2Nyw4IEBACiAJCX0KIAogCQkvKiBGaWxsIGluIHBhY2tldCBsZW4gYW5kIHByaW8sIGRlbGl2ZXIgdXB3YXJkICovCi0JCVBLVFNFVExFTihwa3QsIGxlbik7Ci0JCVBLVFBVTEwocGt0LCBkb2ZmKTsKKwkJX19za2JfdHJpbShwa3QsIGxlbik7CisJCXNrYl9wdWxsKHBrdCwgZG9mZik7CiAKICNpZmRlZiBTRFRFU1QKIAkJLyogVGVzdCBjaGFubmVsIHBhY2tldHMgYXJlIHByb2Nlc3NlZCBzZXBhcmF0ZWx5ICovCkBAIC00MTczLDE1ICs0MTc4LDE1IEBACiAJCX0KICNlbmRpZgkJCQkvKiBTRFRFU1QgKi8KIAotCQlpZiAoUEtUTEVOKHBrdCkgPT0gMCkgeworCQlpZiAocGt0LT5sZW4gPT0gMCkgewogCQkJZGhkX29zX3NkbG9ja19yeHEoYnVzLT5kaGQpOwotCQkJUEtURlJFRShidXMtPmRoZC0+b3NoLCBwa3QsIGZhbHNlKTsKKwkJCXBrdF9idWZfZnJlZV9za2IoYnVzLT5kaGQtPm9zaCwgcGt0LCBmYWxzZSk7CiAJCQlkaGRfb3Nfc2R1bmxvY2tfcnhxKGJ1cy0+ZGhkKTsKIAkJCWNvbnRpbnVlOwogCQl9IGVsc2UgaWYgKGRoZF9wcm90X2hkcnB1bGwoYnVzLT5kaGQsICZpZmlkeCwgcGt0KSAhPSAwKSB7CiAJCQlESERfRVJST1IoKCIlczogcnggcHJvdG9jb2wgZXJyb3JcbiIsIF9fZnVuY19fKSk7CiAJCQlkaGRfb3Nfc2Rsb2NrX3J4cShidXMtPmRoZCk7Ci0JCQlQS1RGUkVFKGJ1cy0+ZGhkLT5vc2gsIHBrdCwgZmFsc2UpOworCQkJcGt0X2J1Zl9mcmVlX3NrYihidXMtPmRoZC0+b3NoLCBwa3QsIGZhbHNlKTsKIAkJCWRoZF9vc19zZHVubG9ja19yeHEoYnVzLT5kaGQpOwogCQkJYnVzLT5kaGQtPnJ4X2Vycm9ycysrOwogCQkJY29udGludWU7CkBAIC00NjI2LDExICs0NjMxLDExIEBACiAKIHN0YXRpYyB2b2lkIGRoZHNkaW9fcGt0Z2VuKGRoZF9idXNfdCAqYnVzKQogewotCXZvaWQgKnBrdDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqcGt0OwogCXU4ICpkYXRhOwogCXVpbnQgcGt0Y291bnQ7CiAJdWludCBmaWxsYnl0ZTsKLQlvc2xfdCAqb3NoID0gYnVzLT5kaGQtPm9zaDsKKwlzdHJ1Y3Qgb3NsX2luZm8gKm9zaCA9IGJ1cy0+ZGhkLT5vc2g7CiAJdTE2IGxlbjsKIAogCS8qIERpc3BsYXkgY3VycmVudCBjb3VudCBpZiBhcHByb3ByaWF0ZSAqLwpAQCAtNDY1OCwxNiArNDY2MywxNiBAQAogCiAJCS8qIEFsbG9jYXRlIGFuIGFwcHJvcHJpYXRlLXNpemVkIHBhY2tldCAqLwogCQlsZW4gPSBidXMtPnBrdGdlbl9sZW47Ci0JCXBrdCA9IFBLVEdFVChvc2gsCisJCXBrdCA9IHBrdF9idWZfZ2V0X3NrYihvc2gsCiAJCQkobGVuICsgU0RQQ01fSERSTEVOICsgU0RQQ01fVEVTVF9IRFJMRU4gKyBESERfU0RBTElHTiksCiAJCQl0cnVlKTsKIAkJaWYgKCFwa3QpIHsKLQkJCURIRF9FUlJPUigoIiVzOiBQS1RHRVQgZmFpbGVkIVxuIiwgX19mdW5jX18pKTsKKwkJCURIRF9FUlJPUigoIiVzOiBwa3RfYnVmX2dldF9za2IgZmFpbGVkIVxuIiwgX19mdW5jX18pKTsKIAkJCWJyZWFrOwogCQl9CiAJCVBLVEFMSUdOKG9zaCwgcGt0LCAobGVuICsgU0RQQ01fSERSTEVOICsgU0RQQ01fVEVTVF9IRFJMRU4pLAogCQkJIERIRF9TREFMSUdOKTsKLQkJZGF0YSA9ICh1OCAqKSBQS1REQVRBKHBrdCkgKyBTRFBDTV9IRFJMRU47CisJCWRhdGEgPSAodTggKikgKHBrdC0+ZGF0YSkgKyBTRFBDTV9IRFJMRU47CiAKIAkJLyogV3JpdGUgdGVzdCBoZWFkZXIgY21kIGFuZCBleHRyYSBiYXNlZCBvbiBtb2RlICovCiAJCXN3aXRjaCAoYnVzLT5wa3RnZW5fbW9kZSkgewpAQCAtNDY4OSw3ICs0Njk0LDcgQEAKIAkJZGVmYXVsdDoKIAkJCURIRF9FUlJPUigoIlVucmVjb2duaXplZCBwa3RnZW4gbW9kZSAlZFxuIiwKIAkJCQkgICBidXMtPnBrdGdlbl9tb2RlKSk7Ci0JCQlQS1RGUkVFKG9zaCwgcGt0LCB0cnVlKTsKKwkJCXBrdF9idWZfZnJlZV9za2Iob3NoLCBwa3QsIHRydWUpOwogCQkJYnVzLT5wa3RnZW5fY291bnQgPSAwOwogCQkJcmV0dXJuOwogCQl9CkBAIC00NzA2LDkgKzQ3MTEsOSBAQAogCiAjaWZkZWYgREhEX0RFQlVHCiAJCWlmIChESERfQllURVNfT04oKSAmJiBESERfREFUQV9PTigpKSB7Ci0JCQlkYXRhID0gKHU4ICopIFBLVERBVEEocGt0KSArIFNEUENNX0hEUkxFTjsKKwkJCWRhdGEgPSAodTggKikgKHBrdC0+ZGF0YSkgKyBTRFBDTV9IRFJMRU47CiAJCQlwcmhleCgiZGhkc2Rpb19wa3RnZW46IFR4IERhdGEiLCBkYXRhLAotCQkJICAgICAgUEtUTEVOKHBrdCkgLSBTRFBDTV9IRFJMRU4pOworCQkJICAgICAgcGt0LT5sZW4gLSBTRFBDTV9IRFJMRU4pOwogCQl9CiAjZW5kaWYKIApAQCAtNDczMywxOSArNDczOCwxOSBAQAogCiBzdGF0aWMgdm9pZCBkaGRzZGlvX3NkdGVzdF9zZXQoZGhkX2J1c190ICpidXMsIGJvb2wgc3RhcnQpCiB7Ci0Jdm9pZCAqcGt0OworCXN0cnVjdCBza19idWZmICpwa3Q7CiAJdTggKmRhdGE7Ci0Jb3NsX3QgKm9zaCA9IGJ1cy0+ZGhkLT5vc2g7CisJc3RydWN0IG9zbF9pbmZvICpvc2ggPSBidXMtPmRoZC0+b3NoOwogCiAJLyogQWxsb2NhdGUgdGhlIHBhY2tldCAqLwotCXBrdCA9IFBLVEdFVChvc2gsIFNEUENNX0hEUkxFTiArIFNEUENNX1RFU1RfSERSTEVOICsgREhEX1NEQUxJR04sCisJcGt0ID0gcGt0X2J1Zl9nZXRfc2tiKG9zaCwgU0RQQ01fSERSTEVOICsgU0RQQ01fVEVTVF9IRFJMRU4gKyBESERfU0RBTElHTiwKIAkJCXRydWUpOwogCWlmICghcGt0KSB7Ci0JCURIRF9FUlJPUigoIiVzOiBQS1RHRVQgZmFpbGVkIVxuIiwgX19mdW5jX18pKTsKKwkJREhEX0VSUk9SKCgiJXM6IHBrdF9idWZfZ2V0X3NrYiBmYWlsZWQhXG4iLCBfX2Z1bmNfXykpOwogCQlyZXR1cm47CiAJfQogCVBLVEFMSUdOKG9zaCwgcGt0LCAoU0RQQ01fSERSTEVOICsgU0RQQ01fVEVTVF9IRFJMRU4pLCBESERfU0RBTElHTik7Ci0JZGF0YSA9ICh1OCAqKSBQS1REQVRBKHBrdCkgKyBTRFBDTV9IRFJMRU47CisJZGF0YSA9ICh1OCAqKSAocGt0LT5kYXRhKSArIFNEUENNX0hEUkxFTjsKIAogCS8qIEZpbGwgaW4gdGhlIHRlc3QgaGVhZGVyICovCiAJKmRhdGErKyA9IFNEUENNX1RFU1RfU0VORDsKQEAgLTQ3NTgsOSArNDc2Myw5IEBACiAJCWJ1cy0+cGt0Z2VuX2ZhaWwrKzsKIH0KIAotc3RhdGljIHZvaWQgZGhkc2Rpb190ZXN0cmN2KGRoZF9idXNfdCAqYnVzLCB2b2lkICpwa3QsIHVpbnQgc2VxKQorc3RhdGljIHZvaWQgZGhkc2Rpb190ZXN0cmN2KGRoZF9idXNfdCAqYnVzLCBzdHJ1Y3Qgc2tfYnVmZiAqcGt0LCB1aW50IHNlcSkKIHsKLQlvc2xfdCAqb3NoID0gYnVzLT5kaGQtPm9zaDsKKwlzdHJ1Y3Qgb3NsX2luZm8gKm9zaCA9IGJ1cy0+ZGhkLT5vc2g7CiAJdTggKmRhdGE7CiAJdWludCBwa3RsZW47CiAKQEAgLTQ3NzAsMTYgKzQ3NzUsMTYgQEAKIAl1MTYgb2Zmc2V0OwogCiAJLyogQ2hlY2sgZm9yIG1pbiBsZW5ndGggKi8KLQlwa3RsZW4gPSBQS1RMRU4ocGt0KTsKKwlwa3RsZW4gPSBwa3QtPmxlbjsKIAlpZiAocGt0bGVuIDwgU0RQQ01fVEVTVF9IRFJMRU4pIHsKIAkJREhEX0VSUk9SKCgiZGhkc2Rpb19yZXN0cmN2OiB0b3NzIHJ1bnQgZnJhbWUsIHBrdGxlbiAlZFxuIiwKIAkJCSAgIHBrdGxlbikpOwotCQlQS1RGUkVFKG9zaCwgcGt0LCBmYWxzZSk7CisJCXBrdF9idWZfZnJlZV9za2Iob3NoLCBwa3QsIGZhbHNlKTsKIAkJcmV0dXJuOwogCX0KIAogCS8qIEV4dHJhY3QgaGVhZGVyIGZpZWxkcyAqLwotCWRhdGEgPSBQS1REQVRBKHBrdCk7CisJZGF0YSA9IHBrdC0+ZGF0YTsKIAljbWQgPSAqZGF0YSsrOwogCWV4dHJhID0gKmRhdGErKzsKIAlsZW4gPSAqZGF0YSsrOwpAQCAtNDc5Miw3ICs0Nzk3LDcgQEAKIAkJCURIRF9FUlJPUigoImRoZHNkaW9fdGVzdHJjdjogZnJhbWUgbGVuZ3RoIG1pc21hdGNoLCAiCiAJCQkJInBrdGxlbiAlZCBzZXEgJWQiICIgY21kICVkIGV4dHJhICVkIGxlbiAlZFxuIiwKIAkJCQlwa3RsZW4sIHNlcSwgY21kLCBleHRyYSwgbGVuKSk7Ci0JCQlQS1RGUkVFKG9zaCwgcGt0LCBmYWxzZSk7CisJCQlwa3RfYnVmX2ZyZWVfc2tiKG9zaCwgcGt0LCBmYWxzZSk7CiAJCQlyZXR1cm47CiAJCX0KIAl9CkBAIC00ODAyLDE5ICs0ODA3LDE5IEBACiAJY2FzZSBTRFBDTV9URVNUX0VDSE9SRVE6CiAJCS8qIFJ4LT5UeCB0dXJuYXJvdW5kIG9rIChldmVuIG9uIE5ESVMgdy9jdXJyZW50CiAJCQkgaW1wbGVtZW50YXRpb24pICovCi0JCSoodTggKikgKFBLVERBVEEocGt0KSkgPSBTRFBDTV9URVNUX0VDSE9SU1A7CisJCSoodTggKikgKHBrdC0+ZGF0YSkgPSBTRFBDTV9URVNUX0VDSE9SU1A7CiAJCWlmIChkaGRzZGlvX3R4cGt0KGJ1cywgcGt0LCBTRFBDTV9URVNUX0NIQU5ORUwsIHRydWUpID09IDApIHsKIAkJCWJ1cy0+cGt0Z2VuX3NlbnQrKzsKIAkJfSBlbHNlIHsKIAkJCWJ1cy0+cGt0Z2VuX2ZhaWwrKzsKLQkJCVBLVEZSRUUob3NoLCBwa3QsIGZhbHNlKTsKKwkJCXBrdF9idWZfZnJlZV9za2Iob3NoLCBwa3QsIGZhbHNlKTsKIAkJfQogCQlidXMtPnBrdGdlbl9yY3ZkKys7CiAJCWJyZWFrOwogCiAJY2FzZSBTRFBDTV9URVNUX0VDSE9SU1A6CiAJCWlmIChidXMtPmV4dF9sb29wKSB7Ci0JCQlQS1RGUkVFKG9zaCwgcGt0LCBmYWxzZSk7CisJCQlwa3RfYnVmX2ZyZWVfc2tiKG9zaCwgcGt0LCBmYWxzZSk7CiAJCQlidXMtPnBrdGdlbl9yY3ZkKys7CiAJCQlicmVhazsKIAkJfQpAQCAtNDgyNywxMiArNDgzMiwxMiBAQAogCQkJCWJyZWFrOwogCQkJfQogCQl9Ci0JCVBLVEZSRUUob3NoLCBwa3QsIGZhbHNlKTsKKwkJcGt0X2J1Zl9mcmVlX3NrYihvc2gsIHBrdCwgZmFsc2UpOwogCQlidXMtPnBrdGdlbl9yY3ZkKys7CiAJCWJyZWFrOwogCiAJY2FzZSBTRFBDTV9URVNUX0RJU0NBUkQ6Ci0JCVBLVEZSRUUob3NoLCBwa3QsIGZhbHNlKTsKKwkJcGt0X2J1Zl9mcmVlX3NrYihvc2gsIHBrdCwgZmFsc2UpOwogCQlidXMtPnBrdGdlbl9yY3ZkKys7CiAJCWJyZWFrOwogCkBAIC00ODQyLDcgKzQ4NDcsNyBAQAogCQlESERfSU5GTygoImRoZHNkaW9fdGVzdHJjdjogdW5zdXBwb3J0ZWQgb3IgdW5rbm93biBjb21tYW5kLCAiCiAJCQkicGt0bGVuICVkIHNlcSAlZCIgIiBjbWQgJWQgZXh0cmEgJWQgbGVuICVkXG4iLAogCQkJcGt0bGVuLCBzZXEsIGNtZCwgZXh0cmEsIGxlbikpOwotCQlQS1RGUkVFKG9zaCwgcGt0LCBmYWxzZSk7CisJCXBrdF9idWZfZnJlZV9za2Iob3NoLCBwa3QsIGZhbHNlKTsKIAkJYnJlYWs7CiAJfQogCkBAIC00OTYwLDcgKzQ5NjUsNyBAQAogCWRoZF9idXNfdCAqYnVzID0gZGhkcC0+YnVzOwogCXUzMiBhZGRyLCB2YWw7CiAJaW50IHJ2OwotCXZvaWQgKnBrdDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqcGt0OwogCiAJLyogQWRkcmVzcyBjb3VsZCBiZSB6ZXJvIGlmIENPTlNPTEUgOj0gMCBpbiBkb25nbGUgTWFrZWZpbGUgKi8KIAlpZiAoYnVzLT5jb25zb2xlX2FkZHIgPT0gMCkKQEAgLTUwMDMsNyArNTAwOCw3IEBACiAJLyogQnVtcCBkb25nbGUgYnkgc2VuZGluZyBhbiBlbXB0eSBldmVudCBwa3QuCiAJICogc2RwY21fc2VuZHVwIChSWCkgY2hlY2tzIGZvciB2aXJ0dWFsIGNvbnNvbGUgaW5wdXQuCiAJICovCi0JcGt0ID0gUEtUR0VUKGJ1cy0+ZGhkLT5vc2gsIDQgKyBTRFBDTV9SRVNFUlZFLCB0cnVlKTsKKwlwa3QgPSBwa3RfYnVmX2dldF9za2IoYnVzLT5kaGQtPm9zaCwgNCArIFNEUENNX1JFU0VSVkUpOwogCWlmICgocGt0ICE9IE5VTEwpICYmIGJ1cy0+Y2xrc3RhdGUgPT0gQ0xLX0FWQUlMKQogCQlkaGRzZGlvX3R4cGt0KGJ1cywgcGt0LCBTRFBDTV9FVkVOVF9DSEFOTkVMLCB0cnVlKTsKIApAQCAtNTA2MSw3ICs1MDY2LDcgQEAKIAogc3RhdGljIHZvaWQgKmRoZHNkaW9fcHJvYmUodTE2IHZlbmlkLCB1MTYgZGV2aWQsIHUxNiBidXNfbm8sCiAJCQkgICB1MTYgc2xvdCwgdTE2IGZ1bmMsIHVpbnQgYnVzdHlwZSwgdm9pZCAqcmVnc3ZhLAotCQkJICAgb3NsX3QgKm9zaCwgdm9pZCAqc2RoKQorCQkJICAgc3RydWN0IG9zbF9pbmZvICpvc2gsIHZvaWQgKnNkaCkKIHsKIAlpbnQgcmV0OwogCWRoZF9idXNfdCAqYnVzOwpAQCAtNTIyMCw4ICs1MjI1LDggQEAKIH0KIAogc3RhdGljIGJvb2wKLWRoZHNkaW9fcHJvYmVfYXR0YWNoKHN0cnVjdCBkaGRfYnVzICpidXMsIG9zbF90ICpvc2gsIHZvaWQgKnNkaCwgdm9pZCAqcmVnc3ZhLAotCQkgICAgIHUxNiBkZXZpZCkKK2RoZHNkaW9fcHJvYmVfYXR0YWNoKHN0cnVjdCBkaGRfYnVzICpidXMsIHN0cnVjdCBvc2xfaW5mbyAqb3NoLCB2b2lkICpzZGgsCisJCQl2b2lkICpyZWdzdmEsIHUxNiBkZXZpZCkKIHsKIAl1OCBjbGtjdGwgPSAwOwogCWludCBlcnIgPSAwOwpAQCAtNTI4MCw3ICs1Mjg1LDcgQEAKIAkJCQkJImZhaWxlZFxuIiwgZm4pKTsKIAkJCQlicmVhazsKIAkJCX0KLQkJCWJ6ZXJvKGNpc1tmbl0sIFNCU0RJT19DSVNfU0laRV9MSU1JVCk7CisJCQltZW1zZXQoY2lzW2ZuXSwgMCwgU0JTRElPX0NJU19TSVpFX0xJTUlUKTsKIAogCQkJZXJyID0gYmNtc2RoX2Npc19yZWFkKHNkaCwgZm4sIGNpc1tmbl0sCiAJCQkJCQlTQlNESU9fQ0lTX1NJWkVfTElNSVQpOwpAQCAtNTM3OCw3ICs1MzgzLDggQEAKIAlyZXR1cm4gZmFsc2U7CiB9CiAKLXN0YXRpYyBib29sIGRoZHNkaW9fcHJvYmVfbWFsbG9jKGRoZF9idXNfdCAqYnVzLCBvc2xfdCAqb3NoLCB2b2lkICpzZGgpCitzdGF0aWMgYm9vbCBkaGRzZGlvX3Byb2JlX21hbGxvYyhkaGRfYnVzX3QgKmJ1cywgc3RydWN0IG9zbF9pbmZvICpvc2gsCisJCQkJIHZvaWQgKnNkaCkKIHsKIAlESERfVFJBQ0UoKCIlczogRW50ZXJcbiIsIF9fZnVuY19fKSk7CiAKQEAgLTU0MTksNyArNTQyNSw3IEBACiAJcmV0dXJuIGZhbHNlOwogfQogCi1zdGF0aWMgYm9vbCBkaGRzZGlvX3Byb2JlX2luaXQoZGhkX2J1c190ICpidXMsIG9zbF90ICpvc2gsIHZvaWQgKnNkaCkKK3N0YXRpYyBib29sIGRoZHNkaW9fcHJvYmVfaW5pdChkaGRfYnVzX3QgKmJ1cywgc3RydWN0IG9zbF9pbmZvICpvc2gsIHZvaWQgKnNkaCkKIHsKIAlzMzIgZm51bTsKIApAQCAtNTQ5Niw3ICs1NTAyLDcgQEAKIH0KIAogYm9vbAotZGhkX2J1c19kb3dubG9hZF9maXJtd2FyZShzdHJ1Y3QgZGhkX2J1cyAqYnVzLCBvc2xfdCAqb3NoLAorZGhkX2J1c19kb3dubG9hZF9maXJtd2FyZShzdHJ1Y3QgZGhkX2J1cyAqYnVzLCBzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwKIAkJCSAgY2hhciAqZndfcGF0aCwgY2hhciAqbnZfcGF0aCkKIHsKIAlib29sIHJldDsKQEAgLTU1MDksNyArNTUxNSw3IEBACiB9CiAKIHN0YXRpYyBib29sCi1kaGRzZGlvX2Rvd25sb2FkX2Zpcm13YXJlKHN0cnVjdCBkaGRfYnVzICpidXMsIG9zbF90ICpvc2gsIHZvaWQgKnNkaCkKK2RoZHNkaW9fZG93bmxvYWRfZmlybXdhcmUoc3RydWN0IGRoZF9idXMgKmJ1cywgc3RydWN0IG9zbF9pbmZvICpvc2gsIHZvaWQgKnNkaCkKIHsKIAlib29sIHJldDsKIApAQCAtNTUyNCw3ICs1NTMwLDcgQEAKIH0KIAogLyogRGV0YWNoIGFuZCBmcmVlIGV2ZXJ5dGhpbmcgKi8KLXN0YXRpYyB2b2lkIGRoZHNkaW9fcmVsZWFzZShkaGRfYnVzX3QgKmJ1cywgb3NsX3QgKm9zaCkKK3N0YXRpYyB2b2lkIGRoZHNkaW9fcmVsZWFzZShkaGRfYnVzX3QgKmJ1cywgc3RydWN0IG9zbF9pbmZvICpvc2gpCiB7CiAJREhEX1RSQUNFKCgiJXM6IEVudGVyXG4iLCBfX2Z1bmNfXykpOwogCkBAIC01NTU0LDcgKzU1NjAsNyBAQAogCURIRF9UUkFDRSgoIiVzOiBEaXNjb25uZWN0ZWRcbiIsIF9fZnVuY19fKSk7CiB9CiAKLXN0YXRpYyB2b2lkIGRoZHNkaW9fcmVsZWFzZV9tYWxsb2MoZGhkX2J1c190ICpidXMsIG9zbF90ICpvc2gpCitzdGF0aWMgdm9pZCBkaGRzZGlvX3JlbGVhc2VfbWFsbG9jKGRoZF9idXNfdCAqYnVzLCBzdHJ1Y3Qgb3NsX2luZm8gKm9zaCkKIHsKIAlESERfVFJBQ0UoKCIlczogRW50ZXJcbiIsIF9fZnVuY19fKSk7CiAKQEAgLTU1NzMsNyArNTU3OSw3IEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCBkaGRzZGlvX3JlbGVhc2VfZG9uZ2xlKGRoZF9idXNfdCAqYnVzLCBvc2xfdCAqb3NoKQorc3RhdGljIHZvaWQgZGhkc2Rpb19yZWxlYXNlX2RvbmdsZShkaGRfYnVzX3QgKmJ1cywgc3RydWN0IG9zbF9pbmZvICpvc2gpCiB7CiAJREhEX1RSQUNFKCgiJXM6IEVudGVyXG4iLCBfX2Z1bmNfXykpOwogCkBAIC01OTg2LDcgKzU5OTIsNyBAQAogCiBzdGF0aWMgaW50CiBkaGRfYmNtc2RoX3JlY3ZfYnVmKGRoZF9idXNfdCAqYnVzLCB1MzIgYWRkciwgdWludCBmbiwgdWludCBmbGFncywKLQkJICAgIHU4ICpidWYsIHVpbnQgbmJ5dGVzLCB2b2lkICpwa3QsCisJCSAgICB1OCAqYnVmLCB1aW50IG5ieXRlcywgc3RydWN0IHNrX2J1ZmYgKnBrdCwKIAkJICAgIGJjbXNkaF9jbXBsdF9mbl90IGNvbXBsZXRlLCB2b2lkICpoYW5kbGUpCiB7CiAJaW50IHN0YXR1czsKQEAgLTYwMDAsNyArNjAwNiw3IEBACiAKIHN0YXRpYyBpbnQKIGRoZF9iY21zZGhfc2VuZF9idWYoZGhkX2J1c190ICpidXMsIHUzMiBhZGRyLCB1aW50IGZuLCB1aW50IGZsYWdzLAotCQkgICAgdTggKmJ1ZiwgdWludCBuYnl0ZXMsIHZvaWQgKnBrdCwKKwkJICAgIHU4ICpidWYsIHVpbnQgbmJ5dGVzLCBzdHJ1Y3Qgc2tfYnVmZiAqcGt0LAogCQkgICAgYmNtc2RoX2NtcGx0X2ZuX3QgY29tcGxldGUsIHZvaWQgKmhhbmRsZSkKIHsKIAlyZXR1cm4gYmNtc2RoX3NlbmRfYnVmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2JyY21mbWFjL3dsX2NmZzgwMjExLmMgYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2JyY21mbWFjL3dsX2NmZzgwMjExLmMKaW5kZXggZWEwODI1Mi4uOTkxNDYzZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtZm1hYy93bF9jZmc4MDIxMS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbWZtYWMvd2xfY2ZnODAyMTEuYwpAQCAtMTYsNyArMTYsNiBAQAogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+Ci0jaW5jbHVkZSA8bGludXh2ZXIuaD4KICNpbmNsdWRlIDxvc2wuaD4KIAogI2luY2x1ZGUgPGJjbXV0aWxzLmg+CkBAIC0zMCwxMCArMjksNiBAQAogI2luY2x1ZGUgPGRoZGlvY3RsLmg+CiAjaW5jbHVkZSA8d2xpb2N0bC5oPgogCi0jaW5jbHVkZSA8cHJvdG8vZXRoZXJuZXQuaD4KLSNpbmNsdWRlIDxkbmdsX3N0YXRzLmg+Ci0jaW5jbHVkZSA8ZGhkLmg+Ci0KICNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KQEAgLTM0Miw3ICszMzcsNyBAQAogCXN0cnVjdCB3bF9pZmFjZSAqY2k7CQkJCQkJXAogCWlmICh1bmxpa2VseSghKHdsX2NmZzgwMjExX2RldiAmJiAJCQkJXAogCQkoY2kgPSB3bF9nZXRfZHJ2ZGF0YSh3bF9jZmc4MDIxMV9kZXYpKSkpKSB7CQlcCi0JCVdMX0VSUigoIndsX2NmZzgwMjExX2RldiBpcyB1bmF2YWlsYWJsZVxuIikpOwkJXAorCQlXTF9FUlIoIndsX2NmZzgwMjExX2RldiBpcyB1bmF2YWlsYWJsZVxuIik7CQlcCiAJCUJVRygpOwkJCQkJCQlcCiAJfSAJCQkJCQkJCVwKIAljaV90b193bChjaSk7CQkJCQkJCVwKQEAgLTM1Miw4ICszNDcsOCBAQAogZG8gewkJCQkJCQkJCVwKIAlzdHJ1Y3Qgd2xfcHJpdiAqd2wgPSB3aXBoeV90b193bCh3aXBoeSk7CQkJXAogCWlmICh1bmxpa2VseSghdGVzdF9iaXQoV0xfU1RBVFVTX1JFQURZLCAmd2wtPnN0YXR1cykpKSB7CVwKLQkJV0xfSU5GTygoImRldmljZSBpcyBub3QgcmVhZHkgOiBzdGF0dXMgKCVkKVxuIiwJCVwKLQkJCShpbnQpd2wtPnN0YXR1cykpOwkJCQlcCisJCVdMX0lORk8oImRldmljZSBpcyBub3QgcmVhZHkgOiBzdGF0dXMgKCVkKVxuIiwJCVwKKwkJCShpbnQpd2wtPnN0YXR1cyk7CQkJCVwKIAkJcmV0dXJuIC1FSU87CQkJCQkJXAogCX0JCQkJCQkJCVwKIH0gd2hpbGUgKDApCkBAIC02MTgsOCArNjEzLDggQEAKIAlzd2l0Y2ggKHR5cGUpIHsKIAljYXNlIE5MODAyMTFfSUZUWVBFX01PTklUT1I6CiAJY2FzZSBOTDgwMjExX0lGVFlQRV9XRFM6Ci0JCVdMX0VSUigoInR5cGUgKCVkKSA6IGN1cnJlbnRseSB3ZSBkbyBub3Qgc3VwcG9ydCB0aGlzIHR5cGVcbiIsCi0JCQl0eXBlKSk7CisJCVdMX0VSUigidHlwZSAoJWQpIDogY3VycmVudGx5IHdlIGRvIG5vdCBzdXBwb3J0IHRoaXMgdHlwZVxuIiwKKwkJICAgICAgIHR5cGUpOwogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAJY2FzZSBOTDgwMjExX0lGVFlQRV9BREhPQzoKIAkJd2wtPmNvbmYtPm1vZGUgPSBXTF9NT0RFX0lCU1M7CkBAIC02MzUsMTUgKzYzMCwxNSBAQAogCWFwID0gaHRvZDMyKGFwKTsKIAl3ZGV2ID0gbmRldi0+aWVlZTgwMjExX3B0cjsKIAl3ZGV2LT5pZnR5cGUgPSB0eXBlOwotCVdMX0RCRygoIiVzIDogYXAgKCVkKSwgaW5mcmEgKCVkKVxuIiwgbmRldi0+bmFtZSwgYXAsIGluZnJhKSk7CisJV0xfREJHKCIlcyA6IGFwICglZCksIGluZnJhICglZClcbiIsIG5kZXYtPm5hbWUsIGFwLCBpbmZyYSk7CiAJZXJyID0gd2xfZGV2X2lvY3RsKG5kZXYsIFdMQ19TRVRfSU5GUkEsICZpbmZyYSwgc2l6ZW9mKGluZnJhKSk7CiAJaWYgKHVubGlrZWx5KGVycikpIHsKLQkJV0xfRVJSKCgiV0xDX1NFVF9JTkZSQSBlcnJvciAoJWQpXG4iLCBlcnIpKTsKKwkJV0xfRVJSKCJXTENfU0VUX0lORlJBIGVycm9yICglZClcbiIsIGVycik7CiAJCXJldHVybiBlcnI7CiAJfQogCWVyciA9IHdsX2Rldl9pb2N0bChuZGV2LCBXTENfU0VUX0FQLCAmYXAsIHNpemVvZihhcCkpOwogCWlmICh1bmxpa2VseShlcnIpKSB7Ci0JCVdMX0VSUigoIldMQ19TRVRfQVAgZXJyb3IgKCVkKVxuIiwgZXJyKSk7CisJCVdMX0VSUigiV0xDX1NFVF9BUCBlcnJvciAoJWQpXG4iLCBlcnIpOwogCQlyZXR1cm4gZXJyOwogCX0KIApAQCAtNjUzLDcgKzY0OCw3IEBACiAKIHN0YXRpYyB2b2lkIHdsX2lzY2FuX3ByZXAoc3RydWN0IHdsX3NjYW5fcGFyYW1zICpwYXJhbXMsIHN0cnVjdCB3bGNfc3NpZCAqc3NpZCkKIHsKLQltZW1jcHkoJnBhcmFtcy0+YnNzaWQsICZldGhlcl9iY2FzdCwgRVRIRVJfQUREUl9MRU4pOworCW1lbWNweSgmcGFyYW1zLT5ic3NpZCwgJmV0aGVyX2JjYXN0LCBFVEhfQUxFTik7CiAJcGFyYW1zLT5ic3NfdHlwZSA9IERPVDExX0JTU1RZUEVfQU5ZOwogCXBhcmFtcy0+c2Nhbl90eXBlID0gMDsKIAlwYXJhbXMtPm5wcm9iZXMgPSAtMTsKQEAgLTcwNSw3ICs3MDAsNyBAQAogCiAJaWYgKHNzaWQgJiYgc3NpZC0+U1NJRF9sZW4pCiAJCXBhcmFtc19zaXplICs9IHNpemVvZihzdHJ1Y3Qgd2xjX3NzaWQpOwotCXBhcmFtcyA9IChzdHJ1Y3Qgd2xfaXNjYW5fcGFyYW1zICopa3phbGxvYyhwYXJhbXNfc2l6ZSwgR0ZQX0tFUk5FTCk7CisJcGFyYW1zID0ga3phbGxvYyhwYXJhbXNfc2l6ZSwgR0ZQX0tFUk5FTCk7CiAJaWYgKHVubGlrZWx5KCFwYXJhbXMpKQogCQlyZXR1cm4gLUVOT01FTTsKIAltZW1zZXQocGFyYW1zLCAwLCBwYXJhbXNfc2l6ZSk7CkBAIC03MjIsOSArNzE3LDkgQEAKIAkJCQlpc2Nhbi0+aW9jdGxfYnVmLCBXTENfSU9DVExfU01MRU4pOwogCWlmICh1bmxpa2VseShlcnIpKSB7CiAJCWlmIChlcnIgPT0gLUVCVVNZKSB7Ci0JCQlXTF9JTkZPKCgic3lzdGVtIGJ1c3kgOiBpc2NhbiBjYW5jZWxlZFxuIikpOworCQkJV0xfSU5GTygic3lzdGVtIGJ1c3kgOiBpc2NhbiBjYW5jZWxlZFxuIik7CiAJCX0gZWxzZSB7Ci0JCQlXTF9FUlIoKCJlcnJvciAoJWQpXG4iLCBlcnIpKTsKKwkJCVdMX0VSUigiZXJyb3IgKCVkKVxuIiwgZXJyKTsKIAkJfQogCX0KIAlrZnJlZShwYXJhbXMpOwpAQCAtNzQ4LDcgKzc0Myw3IEBACiAJZXJyID0gd2xfZGV2X2lvY3RsKHdsX3RvX25kZXYod2wpLCBXTENfU0VUX1BBU1NJVkVfU0NBTiwKIAkJCSZwYXNzaXZlX3NjYW4sIHNpemVvZihwYXNzaXZlX3NjYW4pKTsKIAlpZiAodW5saWtlbHkoZXJyKSkgewotCQlXTF9EQkcoKCJlcnJvciAoJWQpXG4iLCBlcnIpKTsKKwkJV0xfREJHKCJlcnJvciAoJWQpXG4iLCBlcnIpOwogCQlyZXR1cm4gZXJyOwogCX0KIAl3bF9zZXRfbXBjKG5kZXYsIDApOwpAQCAtNzc0LDEyICs3NjksMTIgQEAKIAlzMzIgZXJyID0gMDsKIAogCWlmICh1bmxpa2VseSh0ZXN0X2JpdChXTF9TVEFUVVNfU0NBTk5JTkcsICZ3bC0+c3RhdHVzKSkpIHsKLQkJV0xfRVJSKCgiU2Nhbm5pbmcgYWxyZWFkeSA6IHN0YXR1cyAoJWQpXG4iLCAoaW50KXdsLT5zdGF0dXMpKTsKKwkJV0xfRVJSKCJTY2FubmluZyBhbHJlYWR5IDogc3RhdHVzICglZClcbiIsIChpbnQpd2wtPnN0YXR1cyk7CiAJCXJldHVybiAtRUFHQUlOOwogCX0KIAlpZiAodW5saWtlbHkodGVzdF9iaXQoV0xfU1RBVFVTX1NDQU5fQUJPUlRJTkcsICZ3bC0+c3RhdHVzKSkpIHsKLQkJV0xfRVJSKCgiU2Nhbm5pbmcgYmVpbmcgYWJvcnRlZCA6IHN0YXR1cyAoJWQpXG4iLAotCQkJKGludCl3bC0+c3RhdHVzKSk7CisJCVdMX0VSUigiU2Nhbm5pbmcgYmVpbmcgYWJvcnRlZCA6IHN0YXR1cyAoJWQpXG4iLAorCQkgICAgICAgKGludCl3bC0+c3RhdHVzKTsKIAkJcmV0dXJuIC1FQUdBSU47CiAJfQogCkBAIC04MTEsMjYgKzgwNiwyNiBAQAogCQllbHNlCiAJCQlnb3RvIHNjYW5fb3V0OwogCX0gZWxzZSB7Ci0JCVdMX0RCRygoInNzaWQgXCIlc1wiLCBzc2lkX2xlbiAoJWQpXG4iLAotCQkJc3NpZHMtPnNzaWQsIHNzaWRzLT5zc2lkX2xlbikpOworCQlXTF9EQkcoInNzaWQgXCIlc1wiLCBzc2lkX2xlbiAoJWQpXG4iLAorCQkgICAgICAgc3NpZHMtPnNzaWQsIHNzaWRzLT5zc2lkX2xlbik7CiAJCW1lbXNldCgmc3ItPnNzaWQsIDAsIHNpemVvZihzci0+c3NpZCkpOwogCQlzci0+c3NpZC5TU0lEX2xlbiA9CiAJCQkgICAgbWluX3QodTgsIHNpemVvZihzci0+c3NpZC5TU0lEKSwgc3NpZHMtPnNzaWRfbGVuKTsKIAkJaWYgKHNyLT5zc2lkLlNTSURfbGVuKSB7CiAJCQltZW1jcHkoc3ItPnNzaWQuU1NJRCwgc3NpZHMtPnNzaWQsIHNyLT5zc2lkLlNTSURfbGVuKTsKIAkJCXNyLT5zc2lkLlNTSURfbGVuID0gaHRvZDMyKHNyLT5zc2lkLlNTSURfbGVuKTsKLQkJCVdMX0RCRygoIlNwZWNpZmljIHNjYW4gc3NpZD1cIiVzXCIgbGVuPSVkXG4iLAotCQkJCQlzci0+c3NpZC5TU0lELCBzci0+c3NpZC5TU0lEX2xlbikpOworCQkJV0xfREJHKCJTcGVjaWZpYyBzY2FuIHNzaWQ9XCIlc1wiIGxlbj0lZFxuIiwKKwkJCSAgICAgICBzci0+c3NpZC5TU0lELCBzci0+c3NpZC5TU0lEX2xlbik7CiAJCQlzcGVjX3NjYW4gPSB0cnVlOwogCQl9IGVsc2UgewotCQkJV0xfREJHKCgiQnJvYWRjYXN0IHNjYW5cbiIpKTsKKwkJCVdMX0RCRygiQnJvYWRjYXN0IHNjYW5cbiIpOwogCQl9Ci0JCVdMX0RCRygoInNyLT5zc2lkLlNTSURfbGVuICglZClcbiIsIHNyLT5zc2lkLlNTSURfbGVuKSk7CisJCVdMX0RCRygic3ItPnNzaWQuU1NJRF9sZW4gKCVkKVxuIiwgc3ItPnNzaWQuU1NJRF9sZW4pOwogCQlwYXNzaXZlX3NjYW4gPSB3bC0+YWN0aXZlX3NjYW4gPyAwIDogMTsKIAkJZXJyID0gd2xfZGV2X2lvY3RsKG5kZXYsIFdMQ19TRVRfUEFTU0lWRV9TQ0FOLAogCQkJCSZwYXNzaXZlX3NjYW4sIHNpemVvZihwYXNzaXZlX3NjYW4pKTsKIAkJaWYgKHVubGlrZWx5KGVycikpIHsKLQkJCVdMX0VSUigoIldMQ19TRVRfUEFTU0lWRV9TQ0FOIGVycm9yICglZClcbiIsIGVycikpOworCQkJV0xfRVJSKCJXTENfU0VUX1BBU1NJVkVfU0NBTiBlcnJvciAoJWQpXG4iLCBlcnIpOwogCQkJZ290byBzY2FuX291dDsKIAkJfQogCQl3bF9zZXRfbXBjKG5kZXYsIDApOwpAQCAtODM4LDEwICs4MzMsMTAgQEAKIAkJCQlzaXplb2Yoc3ItPnNzaWQpKTsKIAkJaWYgKGVycikgewogCQkJaWYgKGVyciA9PSAtRUJVU1kpIHsKLQkJCQlXTF9JTkZPKCgic3lzdGVtIGJ1c3kgOiBzY2FuIGZvciBcIiVzXCIgIgotCQkJCQkiY2FuY2VsZWRcbiIsIHNyLT5zc2lkLlNTSUQpKTsKKwkJCQlXTF9JTkZPKCJzeXN0ZW0gYnVzeSA6IHNjYW4gZm9yIFwiJXNcIiBjYW5jZWxlZFxuIiwKKwkJCQkJc3ItPnNzaWQuU1NJRCk7CiAJCQl9IGVsc2UgewotCQkJCVdMX0VSUigoIldMQ19TQ0FOIGVycm9yICglZClcbiIsIGVycikpOworCQkJCVdMX0VSUigiV0xDX1NDQU4gZXJyb3IgKCVkKVxuIiwgZXJyKTsKIAkJCX0KIAkJCXdsX3NldF9tcGMobmRldiwgMSk7CiAJCQlnb3RvIHNjYW5fb3V0OwpAQCAtODY1LDcgKzg2MCw3IEBACiAJQ0hFQ0tfU1lTX1VQKCk7CiAJZXJyID0gX193bF9jZmc4MDIxMV9zY2FuKHdpcGh5LCBuZGV2LCByZXF1ZXN0LCBOVUxMKTsKIAlpZiAodW5saWtlbHkoZXJyKSkgewotCQlXTF9EQkcoKCJzY2FuIGVycm9yICglZClcbiIsIGVycikpOworCQlXTF9EQkcoInNjYW4gZXJyb3IgKCVkKVxuIiwgZXJyKTsKIAkJcmV0dXJuIGVycjsKIAl9CiAKQEAgLTg4NCw3ICs4NzksNyBAQAogCiAJZXJyID0gd2xfZGV2X2lvY3RsKGRldiwgV0xDX1NFVF9WQVIsIGJ1ZiwgbGVuKTsKIAlpZiAodW5saWtlbHkoZXJyKSkgewotCQlXTF9FUlIoKCJlcnJvciAoJWQpXG4iLCBlcnIpKTsKKwkJV0xfRVJSKCJlcnJvciAoJWQpXG4iLCBlcnIpOwogCX0KIAogCXJldHVybiBlcnI7CkBAIC05MDcsNyArOTAyLDcgQEAKIAlCVUdfT04odW5saWtlbHkoIWxlbikpOwogCWVyciA9IHdsX2Rldl9pb2N0bChkZXYsIFdMQ19HRVRfVkFSLCAmdmFyLCBsZW4pOwogCWlmICh1bmxpa2VseShlcnIpKSB7Ci0JCVdMX0VSUigoImVycm9yICglZClcbiIsIGVycikpOworCQlXTF9FUlIoImVycm9yICglZClcbiIsIGVycik7CiAJfQogCSpyZXR2YWwgPSBkdG9oMzIodmFyLnZhbCk7CiAKQEAgLTkyMCw3ICs5MTUsNyBAQAogCiAJZXJyID0gd2xfZGV2X2ludHZhcl9zZXQoZGV2LCAicnRzdGhyZXNoIiwgcnRzX3RocmVzaG9sZCk7CiAJaWYgKHVubGlrZWx5KGVycikpIHsKLQkJV0xfRVJSKCgiRXJyb3IgKCVkKVxuIiwgZXJyKSk7CisJCVdMX0VSUigiRXJyb3IgKCVkKVxuIiwgZXJyKTsKIAkJcmV0dXJuIGVycjsKIAl9CiAJcmV0dXJuIGVycjsKQEAgLTkzMiw3ICs5MjcsNyBAQAogCiAJZXJyID0gd2xfZGV2X2ludHZhcl9zZXQoZGV2LCAiZnJhZ3RocmVzaCIsIGZyYWdfdGhyZXNob2xkKTsKIAlpZiAodW5saWtlbHkoZXJyKSkgewotCQlXTF9FUlIoKCJFcnJvciAoJWQpXG4iLCBlcnIpKTsKKwkJV0xfRVJSKCJFcnJvciAoJWQpXG4iLCBlcnIpOwogCQlyZXR1cm4gZXJyOwogCX0KIAlyZXR1cm4gZXJyOwpAQCAtOTQ2LDcgKzk0MSw3IEBACiAJcmV0cnkgPSBodG9kMzIocmV0cnkpOwogCWVyciA9IHdsX2Rldl9pb2N0bChkZXYsIGNtZCwgJnJldHJ5LCBzaXplb2YocmV0cnkpKTsKIAlpZiAodW5saWtlbHkoZXJyKSkgewotCQlXTF9FUlIoKCJjbWQgKCVkKSAsIGVycm9yICglZClcbiIsIGNtZCwgZXJyKSk7CisJCVdMX0VSUigiY21kICglZCkgLCBlcnJvciAoJWQpXG4iLCBjbWQsIGVycik7CiAJCXJldHVybiBlcnI7CiAJfQogCXJldHVybiBlcnI7CkBAIC0xMDA2LDcgKzEwMDEsNyBAQAogCiAJQ0hFQ0tfU1lTX1VQKCk7CiAJaWYgKHBhcmFtcy0+YnNzaWQpIHsKLQkJV0xfRVJSKCgiSW52YWxpZCBic3NpZFxuIikpOworCQlXTF9FUlIoIkludmFsaWQgYnNzaWRcbiIpOwogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAJfQogCWJzcyA9IGNmZzgwMjExX2dldF9pYnNzKHdpcGh5LCBOVUxMLCBwYXJhbXMtPnNzaWQsIHBhcmFtcy0+c3NpZF9sZW4pOwpAQCAtMTAzMiw3ICsxMDI3LDcgQEAKIAl9CiAJaWYgKGJzcykgewogCQl3bC0+aWJzc19zdGFydGVyID0gZmFsc2U7Ci0JCVdMX0RCRygoIkZvdW5kIElCU1NcbiIpKTsKKwkJV0xfREJHKCJGb3VuZCBJQlNTXG4iKTsKIAl9IGVsc2UgewogCQl3bC0+aWJzc19zdGFydGVyID0gdHJ1ZTsKIAl9CkBAIC0xMDQ5LDE0ICsxMDQ0LDE0IEBACiAJam9pbl9wYXJhbXMuc3NpZC5TU0lEX2xlbiA9IGh0b2QzMihwYXJhbXMtPnNzaWRfbGVuKTsKIAlpZiAocGFyYW1zLT5ic3NpZCkKIAkJbWVtY3B5KCZqb2luX3BhcmFtcy5wYXJhbXMuYnNzaWQsIHBhcmFtcy0+YnNzaWQsCi0JCSAgICAgICBFVEhFUl9BRERSX0xFTik7CisJCSAgICAgICBFVEhfQUxFTik7CiAJZWxzZQotCQltZW1zZXQoJmpvaW5fcGFyYW1zLnBhcmFtcy5ic3NpZCwgMCwgRVRIRVJfQUREUl9MRU4pOworCQltZW1zZXQoJmpvaW5fcGFyYW1zLnBhcmFtcy5ic3NpZCwgMCwgRVRIX0FMRU4pOwogCiAJZXJyID0gd2xfZGV2X2lvY3RsKGRldiwgV0xDX1NFVF9TU0lELCAmam9pbl9wYXJhbXMsCiAJCQlzaXplb2Yoam9pbl9wYXJhbXMpKTsKIAlpZiAodW5saWtlbHkoZXJyKSkgewotCQlXTF9FUlIoKCJFcnJvciAoJWQpXG4iLCBlcnIpKTsKKwkJV0xfRVJSKCJFcnJvciAoJWQpXG4iLCBlcnIpOwogCQlyZXR1cm4gZXJyOwogCX0KIAlyZXR1cm4gZXJyOwpAQCAtMTA4NywxMCArMTA4MiwxMCBAQAogCQl2YWwgPSBXUEEyX0FVVEhfUFNLIHwgV1BBMl9BVVRIX1VOU1BFQ0lGSUVEOwogCWVsc2UKIAkJdmFsID0gV1BBX0FVVEhfRElTQUJMRUQ7Ci0JV0xfREJHKCgic2V0dGluZyB3cGFfYXV0aCB0byAweCUweFxuIiwgdmFsKSk7CisJV0xfREJHKCJzZXR0aW5nIHdwYV9hdXRoIHRvIDB4JTB4XG4iLCB2YWwpOwogCWVyciA9IHdsX2Rldl9pbnR2YXJfc2V0KGRldiwgIndwYV9hdXRoIiwgdmFsKTsKIAlpZiAodW5saWtlbHkoZXJyKSkgewotCQlXTF9FUlIoKCJzZXQgd3BhX2F1dGggZmFpbGVkICglZClcbiIsIGVycikpOworCQlXTF9FUlIoInNldCB3cGFfYXV0aCBmYWlsZWQgKCVkKVxuIiwgZXJyKTsKIAkJcmV0dXJuIGVycjsKIAl9CiAJc2VjID0gd2xfcmVhZF9wcm9mKHdsLCBXTF9QUk9GX1NFQyk7CkBAIC0xMTA5LDI3ICsxMTA0LDI3IEBACiAJc3dpdGNoIChzbWUtPmF1dGhfdHlwZSkgewogCWNhc2UgTkw4MDIxMV9BVVRIVFlQRV9PUEVOX1NZU1RFTToKIAkJdmFsID0gMDsKLQkJV0xfREJHKCgib3BlbiBzeXN0ZW1cbiIpKTsKKwkJV0xfREJHKCJvcGVuIHN5c3RlbVxuIik7CiAJCWJyZWFrOwogCWNhc2UgTkw4MDIxMV9BVVRIVFlQRV9TSEFSRURfS0VZOgogCQl2YWwgPSAxOwotCQlXTF9EQkcoKCJzaGFyZWQga2V5XG4iKSk7CisJCVdMX0RCRygic2hhcmVkIGtleVxuIik7CiAJCWJyZWFrOwogCWNhc2UgTkw4MDIxMV9BVVRIVFlQRV9BVVRPTUFUSUM6CiAJCXZhbCA9IDI7Ci0JCVdMX0RCRygoImF1dG9tYXRpY1xuIikpOworCQlXTF9EQkcoImF1dG9tYXRpY1xuIik7CiAJCWJyZWFrOwogCWNhc2UgTkw4MDIxMV9BVVRIVFlQRV9ORVRXT1JLX0VBUDoKLQkJV0xfREJHKCgibmV0d29yayBlYXBcbiIpKTsKKwkJV0xfREJHKCJuZXR3b3JrIGVhcFxuIik7CiAJZGVmYXVsdDoKIAkJdmFsID0gMjsKLQkJV0xfRVJSKCgiaW52YWxpZCBhdXRoIHR5cGUgKCVkKVxuIiwgc21lLT5hdXRoX3R5cGUpKTsKKwkJV0xfRVJSKCJpbnZhbGlkIGF1dGggdHlwZSAoJWQpXG4iLCBzbWUtPmF1dGhfdHlwZSk7CiAJCWJyZWFrOwogCX0KIAogCWVyciA9IHdsX2Rldl9pbnR2YXJfc2V0KGRldiwgImF1dGgiLCB2YWwpOwogCWlmICh1bmxpa2VseShlcnIpKSB7Ci0JCVdMX0VSUigoInNldCBhdXRoIGZhaWxlZCAoJWQpXG4iLCBlcnIpKTsKKwkJV0xfRVJSKCJzZXQgYXV0aCBmYWlsZWQgKCVkKVxuIiwgZXJyKTsKIAkJcmV0dXJuIGVycjsKIAl9CiAJc2VjID0gd2xfcmVhZF9wcm9mKHdsLCBXTF9QUk9GX1NFQyk7CkBAIC0xMTYyLDggKzExNTcsOCBAQAogCQkJcHZhbCA9IEFFU19FTkFCTEVEOwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6Ci0JCQlXTF9FUlIoKCJpbnZhbGlkIGNpcGhlciBwYWlyd2lzZSAoJWQpXG4iLAotCQkJCXNtZS0+Y3J5cHRvLmNpcGhlcnNfcGFpcndpc2VbMF0pKTsKKwkJCVdMX0VSUigiaW52YWxpZCBjaXBoZXIgcGFpcndpc2UgKCVkKVxuIiwKKwkJCSAgICAgICBzbWUtPmNyeXB0by5jaXBoZXJzX3BhaXJ3aXNlWzBdKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAJfQpAQCAtMTE4MywxNiArMTE3OCwxNiBAQAogCQkJZ3ZhbCA9IEFFU19FTkFCTEVEOwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6Ci0JCQlXTF9FUlIoKCJpbnZhbGlkIGNpcGhlciBncm91cCAoJWQpXG4iLAotCQkJCXNtZS0+Y3J5cHRvLmNpcGhlcl9ncm91cCkpOworCQkJV0xfRVJSKCJpbnZhbGlkIGNpcGhlciBncm91cCAoJWQpXG4iLAorCQkJICAgICAgIHNtZS0+Y3J5cHRvLmNpcGhlcl9ncm91cCk7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCX0KIAotCVdMX0RCRygoInB2YWwgKCVkKSBndmFsICglZClcbiIsIHB2YWwsIGd2YWwpKTsKKwlXTF9EQkcoInB2YWwgKCVkKSBndmFsICglZClcbiIsIHB2YWwsIGd2YWwpOwogCWVyciA9IHdsX2Rldl9pbnR2YXJfc2V0KGRldiwgIndzZWMiLCBwdmFsIHwgZ3ZhbCk7CiAJaWYgKHVubGlrZWx5KGVycikpIHsKLQkJV0xfRVJSKCgiZXJyb3IgKCVkKVxuIiwgZXJyKSk7CisJCVdMX0VSUigiZXJyb3IgKCVkKVxuIiwgZXJyKTsKIAkJcmV0dXJuIGVycjsKIAl9CiAKQEAgLTEyMTQsNyArMTIwOSw3IEBACiAJaWYgKHNtZS0+Y3J5cHRvLm5fYWttX3N1aXRlcykgewogCQllcnIgPSB3bF9kZXZfaW50dmFyX2dldChkZXYsICJ3cGFfYXV0aCIsICZ2YWwpOwogCQlpZiAodW5saWtlbHkoZXJyKSkgewotCQkJV0xfRVJSKCgiY291bGQgbm90IGdldCB3cGFfYXV0aCAoJWQpXG4iLCBlcnIpKTsKKwkJCVdMX0VSUigiY291bGQgbm90IGdldCB3cGFfYXV0aCAoJWQpXG4iLCBlcnIpOwogCQkJcmV0dXJuIGVycjsKIAkJfQogCQlpZiAodmFsICYgKFdQQV9BVVRIX1BTSyB8IFdQQV9BVVRIX1VOU1BFQ0lGSUVEKSkgewpAQCAtMTIyNiw4ICsxMjIxLDggQEAKIAkJCQl2YWwgPSBXUEFfQVVUSF9QU0s7CiAJCQkJYnJlYWs7CiAJCQlkZWZhdWx0OgotCQkJCVdMX0VSUigoImludmFsaWQgY2lwaGVyIGdyb3VwICglZClcbiIsCi0JCQkJCXNtZS0+Y3J5cHRvLmNpcGhlcl9ncm91cCkpOworCQkJCVdMX0VSUigiaW52YWxpZCBjaXBoZXIgZ3JvdXAgKCVkKVxuIiwKKwkJCQkgICAgICAgc21lLT5jcnlwdG8uY2lwaGVyX2dyb3VwKTsKIAkJCQlyZXR1cm4gLUVJTlZBTDsKIAkJCX0KIAkJfSBlbHNlIGlmICh2YWwgJiAoV1BBMl9BVVRIX1BTSyB8IFdQQTJfQVVUSF9VTlNQRUNJRklFRCkpIHsKQEAgLTEyMzksMTYgKzEyMzQsMTYgQEAKIAkJCQl2YWwgPSBXUEEyX0FVVEhfUFNLOwogCQkJCWJyZWFrOwogCQkJZGVmYXVsdDoKLQkJCQlXTF9FUlIoKCJpbnZhbGlkIGNpcGhlciBncm91cCAoJWQpXG4iLAotCQkJCQlzbWUtPmNyeXB0by5jaXBoZXJfZ3JvdXApKTsKKwkJCQlXTF9FUlIoImludmFsaWQgY2lwaGVyIGdyb3VwICglZClcbiIsCisJCQkJICAgICAgIHNtZS0+Y3J5cHRvLmNpcGhlcl9ncm91cCk7CiAJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCQl9CiAJCX0KIAotCQlXTF9EQkcoKCJzZXR0aW5nIHdwYV9hdXRoIHRvICVkXG4iLCB2YWwpKTsKKwkJV0xfREJHKCJzZXR0aW5nIHdwYV9hdXRoIHRvICVkXG4iLCB2YWwpOwogCQllcnIgPSB3bF9kZXZfaW50dmFyX3NldChkZXYsICJ3cGFfYXV0aCIsIHZhbCk7CiAJCWlmICh1bmxpa2VseShlcnIpKSB7Ci0JCQlXTF9FUlIoKCJjb3VsZCBub3Qgc2V0IHdwYV9hdXRoICglZClcbiIsIGVycikpOworCQkJV0xfRVJSKCJjb3VsZCBub3Qgc2V0IHdwYV9hdXRoICglZClcbiIsIGVycik7CiAJCQlyZXR1cm4gZXJyOwogCQl9CiAJfQpAQCAtMTI2OCwxMSArMTI2MywxMSBAQAogCXMzMiB2YWw7CiAJczMyIGVyciA9IDA7CiAKLQlXTF9EQkcoKCJrZXkgbGVuICglZClcbiIsIHNtZS0+a2V5X2xlbikpOworCVdMX0RCRygia2V5IGxlbiAoJWQpXG4iLCBzbWUtPmtleV9sZW4pOwogCWlmIChzbWUtPmtleV9sZW4pIHsKIAkJc2VjID0gd2xfcmVhZF9wcm9mKHdsLCBXTF9QUk9GX1NFQyk7Ci0JCVdMX0RCRygoIndwYV92ZXJzaW9ucyAweCV4IGNpcGhlcl9wYWlyd2lzZSAweCV4XG4iLAotCQkJc2VjLT53cGFfdmVyc2lvbnMsIHNlYy0+Y2lwaGVyX3BhaXJ3aXNlKSk7CisJCVdMX0RCRygid3BhX3ZlcnNpb25zIDB4JXggY2lwaGVyX3BhaXJ3aXNlIDB4JXhcbiIsCisJCSAgICAgICBzZWMtPndwYV92ZXJzaW9ucywgc2VjLT5jaXBoZXJfcGFpcndpc2UpOwogCQlpZiAoIQogCQkgICAgKHNlYy0+d3BhX3ZlcnNpb25zICYgKE5MODAyMTFfV1BBX1ZFUlNJT05fMSB8CiAJCQkJCSAgTkw4MDIxMV9XUEFfVkVSU0lPTl8yKSkKQEAgLTEyODIsNyArMTI3Nyw3IEBACiAJCQlrZXkubGVuID0gKHUzMikgc21lLT5rZXlfbGVuOwogCQkJa2V5LmluZGV4ID0gKHUzMikgc21lLT5rZXlfaWR4OwogCQkJaWYgKHVubGlrZWx5KGtleS5sZW4gPiBzaXplb2Yoa2V5LmRhdGEpKSkgewotCQkJCVdMX0VSUigoIlRvbyBsb25nIGtleSBsZW5ndGggKCV1KVxuIiwga2V5LmxlbikpOworCQkJCVdMX0VSUigiVG9vIGxvbmcga2V5IGxlbmd0aCAoJXUpXG4iLCBrZXkubGVuKTsKIAkJCQlyZXR1cm4gLUVJTlZBTDsKIAkJCX0KIAkJCW1lbWNweShrZXkuZGF0YSwgc21lLT5rZXksIGtleS5sZW4pOwpAQCAtMTI5NSwyNyArMTI5MCwyNyBAQAogCQkJCWtleS5hbGdvID0gQ1JZUFRPX0FMR09fV0VQMTI4OwogCQkJCWJyZWFrOwogCQkJZGVmYXVsdDoKLQkJCQlXTF9FUlIoKCJJbnZhbGlkIGFsZ29yaXRobSAoJWQpXG4iLAotCQkJCQlzbWUtPmNyeXB0by5jaXBoZXJzX3BhaXJ3aXNlWzBdKSk7CisJCQkJV0xfRVJSKCJJbnZhbGlkIGFsZ29yaXRobSAoJWQpXG4iLAorCQkJCSAgICAgICBzbWUtPmNyeXB0by5jaXBoZXJzX3BhaXJ3aXNlWzBdKTsKIAkJCQlyZXR1cm4gLUVJTlZBTDsKIAkJCX0KIAkJCS8qIFNldCB0aGUgbmV3IGtleS9pbmRleCAqLwotCQkJV0xfREJHKCgia2V5IGxlbmd0aCAoJWQpIGtleSBpbmRleCAoJWQpIGFsZ28gKCVkKVxuIiwKLQkJCQlrZXkubGVuLCBrZXkuaW5kZXgsIGtleS5hbGdvKSk7Ci0JCQlXTF9EQkcoKCJrZXkgXCIlc1wiXG4iLCBrZXkuZGF0YSkpOworCQkJV0xfREJHKCJrZXkgbGVuZ3RoICglZCkga2V5IGluZGV4ICglZCkgYWxnbyAoJWQpXG4iLAorCQkJICAgICAgIGtleS5sZW4sIGtleS5pbmRleCwga2V5LmFsZ28pOworCQkJV0xfREJHKCJrZXkgXCIlc1wiXG4iLCBrZXkuZGF0YSk7CiAJCQlzd2FwX2tleV9mcm9tX0JFKCZrZXkpOwogCQkJZXJyID0gd2xfZGV2X2lvY3RsKGRldiwgV0xDX1NFVF9LRVksICZrZXksCiAJCQkJCXNpemVvZihrZXkpKTsKIAkJCWlmICh1bmxpa2VseShlcnIpKSB7Ci0JCQkJV0xfRVJSKCgiV0xDX1NFVF9LRVkgZXJyb3IgKCVkKVxuIiwgZXJyKSk7CisJCQkJV0xfRVJSKCJXTENfU0VUX0tFWSBlcnJvciAoJWQpXG4iLCBlcnIpOwogCQkJCXJldHVybiBlcnI7CiAJCQl9CiAJCQlpZiAoc2VjLT5hdXRoX3R5cGUgPT0gTkw4MDIxMV9BVVRIVFlQRV9PUEVOX1NZU1RFTSkgewotCQkJCVdMX0RCRygoInNldCBhdXRoX3R5cGUgdG8gc2hhcmVkIGtleVxuIikpOworCQkJCVdMX0RCRygic2V0IGF1dGhfdHlwZSB0byBzaGFyZWQga2V5XG4iKTsKIAkJCQl2YWwgPSAxOwkvKiBzaGFyZWQga2V5ICovCiAJCQkJZXJyID0gd2xfZGV2X2ludHZhcl9zZXQoZGV2LCAiYXV0aCIsIHZhbCk7CiAJCQkJaWYgKHVubGlrZWx5KGVycikpIHsKLQkJCQkJV0xfRVJSKCgic2V0IGF1dGggZmFpbGVkICglZClcbiIsIGVycikpOworCQkJCQlXTF9FUlIoInNldCBhdXRoIGZhaWxlZCAoJWQpXG4iLCBlcnIpOwogCQkJCQlyZXR1cm4gZXJyOwogCQkJCX0KIAkJCX0KQEAgLTEzMzcsMTUgKzEzMzIsMTUgQEAKIAogCUNIRUNLX1NZU19VUCgpOwogCWlmICh1bmxpa2VseSghc21lLT5zc2lkKSkgewotCQlXTF9FUlIoKCJJbnZhbGlkIHNzaWRcbiIpKTsKKwkJV0xfRVJSKCJJbnZhbGlkIHNzaWRcbiIpOwogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAJfQogCWlmIChjaGFuKSB7CiAJCXdsLT5jaGFubmVsID0gaWVlZTgwMjExX2ZyZXF1ZW5jeV90b19jaGFubmVsKGNoYW4tPmNlbnRlcl9mcmVxKTsKLQkJV0xfREJHKCgiY2hhbm5lbCAoJWQpLCBjZW50ZXJfcmVxICglZClcbiIsIHdsLT5jaGFubmVsLAotCQkJY2hhbi0+Y2VudGVyX2ZyZXEpKTsKKwkJV0xfREJHKCJjaGFubmVsICglZCksIGNlbnRlcl9yZXEgKCVkKVxuIiwKKwkJICAgICAgIHdsLT5jaGFubmVsLCBjaGFuLT5jZW50ZXJfZnJlcSk7CiAJfQotCVdMX0RCRygoImllICglcCksIGllX2xlbiAoJXpkKVxuIiwgc21lLT5pZSwgc21lLT5pZV9sZW4pKTsKKwlXTF9EQkcoImllICglcCksIGllX2xlbiAoJXpkKVxuIiwgc21lLT5pZSwgc21lLT5pZV9sZW4pOwogCWVyciA9IHdsX3NldF93cGFfdmVyc2lvbihkZXYsIHNtZSk7CiAJaWYgKHVubGlrZWx5KGVycikpCiAJCXJldHVybiBlcnI7CkBAIC0xMzc4LDE4ICsxMzczLDE4IEBACiAJbWVtY3B5KCZqb2luX3BhcmFtcy5zc2lkLlNTSUQsIHNtZS0+c3NpZCwgam9pbl9wYXJhbXMuc3NpZC5TU0lEX2xlbik7CiAJam9pbl9wYXJhbXMuc3NpZC5TU0lEX2xlbiA9IGh0b2QzMihqb2luX3BhcmFtcy5zc2lkLlNTSURfbGVuKTsKIAl3bF91cGRhdGVfcHJvZih3bCwgTlVMTCwgJmpvaW5fcGFyYW1zLnNzaWQsIFdMX1BST0ZfU1NJRCk7Ci0JbWVtY3B5KCZqb2luX3BhcmFtcy5wYXJhbXMuYnNzaWQsICZldGhlcl9iY2FzdCwgRVRIRVJfQUREUl9MRU4pOworCW1lbWNweSgmam9pbl9wYXJhbXMucGFyYW1zLmJzc2lkLCAmZXRoZXJfYmNhc3QsIEVUSF9BTEVOKTsKIAogCXdsX2NoX3RvX2NoYW5zcGVjKHdsLT5jaGFubmVsLCAmam9pbl9wYXJhbXMsICZqb2luX3BhcmFtc19zaXplKTsKLQlXTF9EQkcoKCJqb2luX3BhcmFtX3NpemUgJWRcbiIsIGpvaW5fcGFyYW1zX3NpemUpKTsKKwlXTF9EQkcoImpvaW5fcGFyYW1fc2l6ZSAlZFxuIiwgam9pbl9wYXJhbXNfc2l6ZSk7CiAKIAlpZiAoam9pbl9wYXJhbXMuc3NpZC5TU0lEX2xlbiA8IElFRUU4MDIxMV9NQVhfU1NJRF9MRU4pIHsKLQkJV0xfREJHKCgic3NpZCBcIiVzXCIsIGxlbiAoJWQpXG4iLCBqb2luX3BhcmFtcy5zc2lkLlNTSUQsCi0JCQlqb2luX3BhcmFtcy5zc2lkLlNTSURfbGVuKSk7CisJCVdMX0RCRygic3NpZCBcIiVzXCIsIGxlbiAoJWQpXG4iLAorCQkgICAgICAgam9pbl9wYXJhbXMuc3NpZC5TU0lELCBqb2luX3BhcmFtcy5zc2lkLlNTSURfbGVuKTsKIAl9CiAJZXJyID0gd2xfZGV2X2lvY3RsKGRldiwgV0xDX1NFVF9TU0lELCAmam9pbl9wYXJhbXMsIGpvaW5fcGFyYW1zX3NpemUpOwogCWlmICh1bmxpa2VseShlcnIpKSB7Ci0JCVdMX0VSUigoImVycm9yICglZClcbiIsIGVycikpOworCQlXTF9FUlIoImVycm9yICglZClcbiIsIGVycik7CiAJCXJldHVybiBlcnI7CiAJfQogCXNldF9iaXQoV0xfU1RBVFVTX0NPTk5FQ1RJTkcsICZ3bC0+c3RhdHVzKTsKQEAgLTE0MDYsMTcgKzE0MDEsMTcgQEAKIAlib29sIGFjdCA9IGZhbHNlOwogCXMzMiBlcnIgPSAwOwogCi0JV0xfREJHKCgiUmVhc29uICVkXG4iLCByZWFzb25fY29kZSkpOworCVdMX0RCRygiUmVhc29uICVkXG4iLCByZWFzb25fY29kZSk7CiAJQ0hFQ0tfU1lTX1VQKCk7CiAJYWN0ID0gKihib29sICopIHdsX3JlYWRfcHJvZih3bCwgV0xfUFJPRl9BQ1QpOwogCWlmIChsaWtlbHkoYWN0KSkgewogCQlzY2J2YWwudmFsID0gcmVhc29uX2NvZGU7Ci0JCW1lbWNweSgmc2NidmFsLmVhLCAmd2wtPmJzc2lkLCBFVEhFUl9BRERSX0xFTik7CisJCW1lbWNweSgmc2NidmFsLmVhLCAmd2wtPmJzc2lkLCBFVEhfQUxFTik7CiAJCXNjYnZhbC52YWwgPSBodG9kMzIoc2NidmFsLnZhbCk7CiAJCWVyciA9IHdsX2Rldl9pb2N0bChkZXYsIFdMQ19ESVNBU1NPQywgJnNjYnZhbCwKIAkJCQlzaXplb2Yoc2NiX3ZhbF90KSk7CiAJCWlmICh1bmxpa2VseShlcnIpKSB7Ci0JCQlXTF9FUlIoKCJlcnJvciAoJWQpXG4iLCBlcnIpKTsKKwkJCVdMX0VSUigiZXJyb3IgKCVkKVxuIiwgZXJyKTsKIAkJCXJldHVybiBlcnI7CiAJCX0KIAl9CkBAIC0xNDQxLDEzICsxNDM2LDEzIEBACiAJCWJyZWFrOwogCWNhc2UgTkw4MDIxMV9UWF9QT1dFUl9MSU1JVEVEOgogCQlpZiAoZGJtIDwgMCkgewotCQkJV0xfRVJSKCgiVFhfUE9XRVJfTElNSVRURUQgLSBkYm0gaXMgbmVnYXRpdmVcbiIpKTsKKwkJCVdMX0VSUigiVFhfUE9XRVJfTElNSVRFRCAtIGRibSBpcyBuZWdhdGl2ZVxuIik7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCQlicmVhazsKIAljYXNlIE5MODAyMTFfVFhfUE9XRVJfRklYRUQ6CiAJCWlmIChkYm0gPCAwKSB7Ci0JCQlXTF9FUlIoKCJUWF9QT1dFUl9GSVhFRCAtIGRibSBpcyBuZWdhdGl2ZS4uXG4iKSk7CisJCQlXTF9FUlIoIlRYX1BPV0VSX0ZJWEVEIC0gZGJtIGlzIG5lZ2F0aXZlXG4iKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAJCWJyZWFrOwpAQCAtMTQ1Nyw3ICsxNDUyLDcgQEAKIAlkaXNhYmxlID0gaHRvZDMyKGRpc2FibGUpOwogCWVyciA9IHdsX2Rldl9pb2N0bChuZGV2LCBXTENfU0VUX1JBRElPLCAmZGlzYWJsZSwgc2l6ZW9mKGRpc2FibGUpKTsKIAlpZiAodW5saWtlbHkoZXJyKSkgewotCQlXTF9FUlIoKCJXTENfU0VUX1JBRElPIGVycm9yICglZClcbiIsIGVycikpOworCQlXTF9FUlIoIldMQ19TRVRfUkFESU8gZXJyb3IgKCVkKVxuIiwgZXJyKTsKIAkJcmV0dXJuIGVycjsKIAl9CiAKQEAgLTE0NjgsNyArMTQ2Myw3IEBACiAJZXJyID0gd2xfZGV2X2ludHZhcl9zZXQobmRldiwgInF0eHBvd2VyIiwKIAkJCShzMzIpIChiY21fbXdfdG9fcWRibSh0eHB3cm13KSkpOwogCWlmICh1bmxpa2VseShlcnIpKSB7Ci0JCVdMX0VSUigoInF0eHBvd2VyIGVycm9yICglZClcbiIsIGVycikpOworCQlXTF9FUlIoInF0eHBvd2VyIGVycm9yICglZClcbiIsIGVycik7CiAJCXJldHVybiBlcnI7CiAJfQogCXdsLT5jb25mLT50eF9wb3dlciA9IGRibTsKQEAgLTE0ODcsNyArMTQ4Miw3IEBACiAJQ0hFQ0tfU1lTX1VQKCk7CiAJZXJyID0gd2xfZGV2X2ludHZhcl9nZXQobmRldiwgInF0eHBvd2VyIiwgJnR4cHdyZGJtKTsKIAlpZiAodW5saWtlbHkoZXJyKSkgewotCQlXTF9FUlIoKCJlcnJvciAoJWQpXG4iLCBlcnIpKTsKKwkJV0xfRVJSKCJlcnJvciAoJWQpXG4iLCBlcnIpOwogCQlyZXR1cm4gZXJyOwogCX0KIAlyZXN1bHQgPSAodTgpICh0eHB3cmRibSAmIH5XTF9UWFBXUl9PVkVSUklERSk7CkBAIC0xNTA0LDEyICsxNDk5LDEyIEBACiAJczMyIHdzZWM7CiAJczMyIGVyciA9IDA7CiAKLQlXTF9EQkcoKCJrZXkgaW5kZXggKCVkKVxuIiwga2V5X2lkeCkpOworCVdMX0RCRygia2V5IGluZGV4ICglZClcbiIsIGtleV9pZHgpOwogCUNIRUNLX1NZU19VUCgpOwogCiAJZXJyID0gd2xfZGV2X2lvY3RsKGRldiwgV0xDX0dFVF9XU0VDLCAmd3NlYywgc2l6ZW9mKHdzZWMpKTsKIAlpZiAodW5saWtlbHkoZXJyKSkgewotCQlXTF9FUlIoKCJXTENfR0VUX1dTRUMgZXJyb3IgKCVkKVxuIiwgZXJyKSk7CisJCVdMX0VSUigiV0xDX0dFVF9XU0VDIGVycm9yICglZClcbiIsIGVycik7CiAJCXJldHVybiBlcnI7CiAJfQogCXdzZWMgPSBkdG9oMzIod3NlYyk7CkBAIC0xNTIwLDcgKzE1MTUsNyBAQAogCQllcnIgPSB3bF9kZXZfaW9jdGwoZGV2LCBXTENfU0VUX0tFWV9QUklNQVJZLCAmaW5kZXgsCiAJCQkJc2l6ZW9mKGluZGV4KSk7CiAJCWlmICh1bmxpa2VseShlcnIpKSB7Ci0JCQlXTF9FUlIoKCJlcnJvciAoJWQpXG4iLCBlcnIpKTsKKwkJCVdMX0VSUigiZXJyb3IgKCVkKVxuIiwgZXJyKTsKIAkJfQogCX0KIAlyZXR1cm4gZXJyOwpAQCAtMTUzNyw4ICsxNTMyLDggQEAKIAlrZXkuaW5kZXggPSAodTMyKSBrZXlfaWR4OwogCS8qIEluc3RlYWQgb2YgYmNhc3QgZm9yIGVhIGFkZHJlc3MgZm9yIGRlZmF1bHQgd2VwIGtleXMsCiAJCSBkcml2ZXIgbmVlZHMgaXQgdG8gYmUgTnVsbCAqLwotCWlmICghRVRIRVJfSVNNVUxUSShtYWNfYWRkcikpCi0JCW1lbWNweSgoY2hhciAqKSZrZXkuZWEsICh2b2lkICopbWFjX2FkZHIsIEVUSEVSX0FERFJfTEVOKTsKKwlpZiAoIWlzX211bHRpY2FzdF9ldGhlcl9hZGRyKG1hY19hZGRyKSkKKwkJbWVtY3B5KChjaGFyICopJmtleS5lYSwgKHZvaWQgKiltYWNfYWRkciwgRVRIX0FMRU4pOwogCWtleS5sZW4gPSAodTMyKSBwYXJhbXMtPmtleV9sZW47CiAJLyogY2hlY2sgZm9yIGtleSBpbmRleCBjaGFuZ2UgKi8KIAlpZiAoa2V5LmxlbiA9PSAwKSB7CkBAIC0xNTQ2LDE2ICsxNTQxLDE2IEBACiAJCXN3YXBfa2V5X2Zyb21fQkUoJmtleSk7CiAJCWVyciA9IHdsX2Rldl9pb2N0bChkZXYsIFdMQ19TRVRfS0VZLCAma2V5LCBzaXplb2Yoa2V5KSk7CiAJCWlmICh1bmxpa2VseShlcnIpKSB7Ci0JCQlXTF9FUlIoKCJrZXkgZGVsZXRlIGVycm9yICglZClcbiIsIGVycikpOworCQkJV0xfRVJSKCJrZXkgZGVsZXRlIGVycm9yICglZClcbiIsIGVycik7CiAJCQlyZXR1cm4gZXJyOwogCQl9CiAJfSBlbHNlIHsKIAkJaWYgKGtleS5sZW4gPiBzaXplb2Yoa2V5LmRhdGEpKSB7Ci0JCQlXTF9FUlIoKCJJbnZhbGlkIGtleSBsZW5ndGggKCVkKVxuIiwga2V5LmxlbikpOworCQkJV0xfRVJSKCJJbnZhbGlkIGtleSBsZW5ndGggKCVkKVxuIiwga2V5Lmxlbik7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCi0JCVdMX0RCRygoIlNldHRpbmcgdGhlIGtleSBpbmRleCAlZFxuIiwga2V5LmluZGV4KSk7CisJCVdMX0RCRygiU2V0dGluZyB0aGUga2V5IGluZGV4ICVkXG4iLCBrZXkuaW5kZXgpOwogCQltZW1jcHkoa2V5LmRhdGEsIHBhcmFtcy0+a2V5LCBrZXkubGVuKTsKIAogCQlpZiAocGFyYW1zLT5jaXBoZXIgPT0gV0xBTl9DSVBIRVJfU1VJVEVfVEtJUCkgewpAQCAtMTU3OSwyNiArMTU3NCwyNiBAQAogCQlzd2l0Y2ggKHBhcmFtcy0+Y2lwaGVyKSB7CiAJCWNhc2UgV0xBTl9DSVBIRVJfU1VJVEVfV0VQNDA6CiAJCQlrZXkuYWxnbyA9IENSWVBUT19BTEdPX1dFUDE7Ci0JCQlXTF9EQkcoKCJXTEFOX0NJUEhFUl9TVUlURV9XRVA0MFxuIikpOworCQkJV0xfREJHKCJXTEFOX0NJUEhFUl9TVUlURV9XRVA0MFxuIik7CiAJCQlicmVhazsKIAkJY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9XRVAxMDQ6CiAJCQlrZXkuYWxnbyA9IENSWVBUT19BTEdPX1dFUDEyODsKLQkJCVdMX0RCRygoIldMQU5fQ0lQSEVSX1NVSVRFX1dFUDEwNFxuIikpOworCQkJV0xfREJHKCJXTEFOX0NJUEhFUl9TVUlURV9XRVAxMDRcbiIpOwogCQkJYnJlYWs7CiAJCWNhc2UgV0xBTl9DSVBIRVJfU1VJVEVfVEtJUDoKIAkJCWtleS5hbGdvID0gQ1JZUFRPX0FMR09fVEtJUDsKLQkJCVdMX0RCRygoIldMQU5fQ0lQSEVSX1NVSVRFX1RLSVBcbiIpKTsKKwkJCVdMX0RCRygiV0xBTl9DSVBIRVJfU1VJVEVfVEtJUFxuIik7CiAJCQlicmVhazsKIAkJY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9BRVNfQ01BQzoKIAkJCWtleS5hbGdvID0gQ1JZUFRPX0FMR09fQUVTX0NDTTsKLQkJCVdMX0RCRygoIldMQU5fQ0lQSEVSX1NVSVRFX0FFU19DTUFDXG4iKSk7CisJCQlXTF9EQkcoIldMQU5fQ0lQSEVSX1NVSVRFX0FFU19DTUFDXG4iKTsKIAkJCWJyZWFrOwogCQljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX0NDTVA6CiAJCQlrZXkuYWxnbyA9IENSWVBUT19BTEdPX0FFU19DQ007Ci0JCQlXTF9EQkcoKCJXTEFOX0NJUEhFUl9TVUlURV9DQ01QXG4iKSk7CisJCQlXTF9EQkcoIldMQU5fQ0lQSEVSX1NVSVRFX0NDTVBcbiIpOwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6Ci0JCQlXTF9FUlIoKCJJbnZhbGlkIGNpcGhlciAoMHgleClcbiIsIHBhcmFtcy0+Y2lwaGVyKSk7CisJCQlXTF9FUlIoIkludmFsaWQgY2lwaGVyICgweCV4KVxuIiwgcGFyYW1zLT5jaXBoZXIpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIAkJc3dhcF9rZXlfZnJvbV9CRSgma2V5KTsKQEAgLTE2MDYsNyArMTYwMSw3IEBACiAJCWRoZF93YWl0X3BlbmQ4MDIxeChkZXYpOwogCQllcnIgPSB3bF9kZXZfaW9jdGwoZGV2LCBXTENfU0VUX0tFWSwgJmtleSwgc2l6ZW9mKGtleSkpOwogCQlpZiAodW5saWtlbHkoZXJyKSkgewotCQkJV0xfRVJSKCgiV0xDX1NFVF9LRVkgZXJyb3IgKCVkKVxuIiwgZXJyKSk7CisJCQlXTF9FUlIoIldMQ19TRVRfS0VZIGVycm9yICglZClcbiIsIGVycik7CiAJCQlyZXR1cm4gZXJyOwogCQl9CiAJfQpAQCAtMTYyMyw3ICsxNjE4LDcgQEAKIAlzMzIgd3NlYzsKIAlzMzIgZXJyID0gMDsKIAotCVdMX0RCRygoImtleSBpbmRleCAoJWQpXG4iLCBrZXlfaWR4KSk7CisJV0xfREJHKCJrZXkgaW5kZXggKCVkKVxuIiwga2V5X2lkeCk7CiAJQ0hFQ0tfU1lTX1VQKCk7CiAKIAlpZiAobWFjX2FkZHIpCkBAIC0xNjM0LDcgKzE2MjksNyBAQAogCWtleS5pbmRleCA9ICh1MzIpIGtleV9pZHg7CiAKIAlpZiAodW5saWtlbHkoa2V5LmxlbiA+IHNpemVvZihrZXkuZGF0YSkpKSB7Ci0JCVdMX0VSUigoIlRvbyBsb25nIGtleSBsZW5ndGggKCV1KVxuIiwga2V5LmxlbikpOworCQlXTF9FUlIoIlRvbyBsb25nIGtleSBsZW5ndGggKCV1KVxuIiwga2V5Lmxlbik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAltZW1jcHkoa2V5LmRhdGEsIHBhcmFtcy0+a2V5LCBrZXkubGVuKTsKQEAgLTE2NDMsMjYgKzE2MzgsMjYgQEAKIAlzd2l0Y2ggKHBhcmFtcy0+Y2lwaGVyKSB7CiAJY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9XRVA0MDoKIAkJa2V5LmFsZ28gPSBDUllQVE9fQUxHT19XRVAxOwotCQlXTF9EQkcoKCJXTEFOX0NJUEhFUl9TVUlURV9XRVA0MFxuIikpOworCQlXTF9EQkcoIldMQU5fQ0lQSEVSX1NVSVRFX1dFUDQwXG4iKTsKIAkJYnJlYWs7CiAJY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9XRVAxMDQ6CiAJCWtleS5hbGdvID0gQ1JZUFRPX0FMR09fV0VQMTI4OwotCQlXTF9EQkcoKCJXTEFOX0NJUEhFUl9TVUlURV9XRVAxMDRcbiIpKTsKKwkJV0xfREJHKCJXTEFOX0NJUEhFUl9TVUlURV9XRVAxMDRcbiIpOwogCQlicmVhazsKIAljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX1RLSVA6CiAJCWtleS5hbGdvID0gQ1JZUFRPX0FMR09fVEtJUDsKLQkJV0xfREJHKCgiV0xBTl9DSVBIRVJfU1VJVEVfVEtJUFxuIikpOworCQlXTF9EQkcoIldMQU5fQ0lQSEVSX1NVSVRFX1RLSVBcbiIpOwogCQlicmVhazsKIAljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX0FFU19DTUFDOgogCQlrZXkuYWxnbyA9IENSWVBUT19BTEdPX0FFU19DQ007Ci0JCVdMX0RCRygoIldMQU5fQ0lQSEVSX1NVSVRFX0FFU19DTUFDXG4iKSk7CisJCVdMX0RCRygiV0xBTl9DSVBIRVJfU1VJVEVfQUVTX0NNQUNcbiIpOwogCQlicmVhazsKIAljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX0NDTVA6CiAJCWtleS5hbGdvID0gQ1JZUFRPX0FMR09fQUVTX0NDTTsKLQkJV0xfREJHKCgiV0xBTl9DSVBIRVJfU1VJVEVfQ0NNUFxuIikpOworCQlXTF9EQkcoIldMQU5fQ0lQSEVSX1NVSVRFX0NDTVBcbiIpOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlXTF9FUlIoKCJJbnZhbGlkIGNpcGhlciAoMHgleClcbiIsIHBhcmFtcy0+Y2lwaGVyKSk7CisJCVdMX0VSUigiSW52YWxpZCBjaXBoZXIgKDB4JXgpXG4iLCBwYXJhbXMtPmNpcGhlcik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtMTY3MCwyMSArMTY2NSwyMSBAQAogCXN3YXBfa2V5X2Zyb21fQkUoJmtleSk7CiAJZXJyID0gd2xfZGV2X2lvY3RsKGRldiwgV0xDX1NFVF9LRVksICZrZXksIHNpemVvZihrZXkpKTsKIAlpZiAodW5saWtlbHkoZXJyKSkgewotCQlXTF9FUlIoKCJXTENfU0VUX0tFWSBlcnJvciAoJWQpXG4iLCBlcnIpKTsKKwkJV0xfRVJSKCJXTENfU0VUX0tFWSBlcnJvciAoJWQpXG4iLCBlcnIpOwogCQlyZXR1cm4gZXJyOwogCX0KIAogCXZhbCA9IFdFUF9FTkFCTEVEOwogCWVyciA9IHdsX2Rldl9pbnR2YXJfZ2V0KGRldiwgIndzZWMiLCAmd3NlYyk7CiAJaWYgKHVubGlrZWx5KGVycikpIHsKLQkJV0xfRVJSKCgiZ2V0IHdzZWMgZXJyb3IgKCVkKVxuIiwgZXJyKSk7CisJCVdMX0VSUigiZ2V0IHdzZWMgZXJyb3IgKCVkKVxuIiwgZXJyKTsKIAkJcmV0dXJuIGVycjsKIAl9CiAJd3NlYyAmPSB+KFdFUF9FTkFCTEVEKTsKIAl3c2VjIHw9IHZhbDsKIAllcnIgPSB3bF9kZXZfaW50dmFyX3NldChkZXYsICJ3c2VjIiwgd3NlYyk7CiAJaWYgKHVubGlrZWx5KGVycikpIHsKLQkJV0xfRVJSKCgic2V0IHdzZWMgZXJyb3IgKCVkKVxuIiwgZXJyKSk7CisJCVdMX0VSUigic2V0IHdzZWMgZXJyb3IgKCVkKVxuIiwgZXJyKTsKIAkJcmV0dXJuIGVycjsKIAl9CiAKQEAgLTE2OTIsNyArMTY4Nyw3IEBACiAJdmFsID0gaHRvZDMyKHZhbCk7CiAJZXJyID0gd2xfZGV2X2lvY3RsKGRldiwgV0xDX1NFVF9BVVRILCAmdmFsLCBzaXplb2YodmFsKSk7CiAJaWYgKHVubGlrZWx5KGVycikpIHsKLQkJV0xfRVJSKCgiV0xDX1NFVF9BVVRIIGVycm9yICglZClcbiIsIGVycikpOworCQlXTF9FUlIoIldMQ19TRVRfQVVUSCBlcnJvciAoJWQpXG4iLCBlcnIpOwogCQlyZXR1cm4gZXJyOwogCX0KIAlyZXR1cm4gZXJyOwpAQCAtMTcxNCw3ICsxNzA5LDcgQEAKIAlrZXkuZmxhZ3MgPSBXTF9QUklNQVJZX0tFWTsKIAlrZXkuYWxnbyA9IENSWVBUT19BTEdPX09GRjsKIAotCVdMX0RCRygoImtleSBpbmRleCAoJWQpXG4iLCBrZXlfaWR4KSk7CisJV0xfREJHKCJrZXkgaW5kZXggKCVkKVxuIiwga2V5X2lkeCk7CiAJLyogU2V0IHRoZSBuZXcga2V5L2luZGV4ICovCiAJc3dhcF9rZXlfZnJvbV9CRSgma2V5KTsKIAllcnIgPSB3bF9kZXZfaW9jdGwoZGV2LCBXTENfU0VUX0tFWSwgJmtleSwgc2l6ZW9mKGtleSkpOwpAQCAtMTcyMiwxMCArMTcxNywxMCBAQAogCQlpZiAoZXJyID09IC1FSU5WQUwpIHsKIAkJCWlmIChrZXkuaW5kZXggPj0gRE9UMTFfTUFYX0RFRkFVTFRfS0VZUykgewogCQkJCS8qIHdlIGlnbm9yZSB0aGlzIGtleSBpbmRleCBpbiB0aGlzIGNhc2UgKi8KLQkJCQlXTF9EQkcoKCJpbnZhbGlkIGtleSBpbmRleCAoJWQpXG4iLCBrZXlfaWR4KSk7CisJCQkJV0xfREJHKCJpbnZhbGlkIGtleSBpbmRleCAoJWQpXG4iLCBrZXlfaWR4KTsKIAkJCX0KIAkJfSBlbHNlIHsKLQkJCVdMX0VSUigoIldMQ19TRVRfS0VZIGVycm9yICglZClcbiIsIGVycikpOworCQkJV0xfRVJSKCJXTENfU0VUX0tFWSBlcnJvciAoJWQpXG4iLCBlcnIpOwogCQl9CiAJCXJldHVybiBlcnI7CiAJfQpAQCAtMTczMywxNCArMTcyOCwxNCBAQAogCXZhbCA9IDA7CiAJZXJyID0gd2xfZGV2X2ludHZhcl9nZXQoZGV2LCAid3NlYyIsICZ3c2VjKTsKIAlpZiAodW5saWtlbHkoZXJyKSkgewotCQlXTF9FUlIoKCJnZXQgd3NlYyBlcnJvciAoJWQpXG4iLCBlcnIpKTsKKwkJV0xfRVJSKCJnZXQgd3NlYyBlcnJvciAoJWQpXG4iLCBlcnIpOwogCQlyZXR1cm4gZXJyOwogCX0KIAl3c2VjICY9IH4oV0VQX0VOQUJMRUQpOwogCXdzZWMgfD0gdmFsOwogCWVyciA9IHdsX2Rldl9pbnR2YXJfc2V0KGRldiwgIndzZWMiLCB3c2VjKTsKIAlpZiAodW5saWtlbHkoZXJyKSkgewotCQlXTF9FUlIoKCJzZXQgd3NlYyBlcnJvciAoJWQpXG4iLCBlcnIpKTsKKwkJV0xfRVJSKCJzZXQgd3NlYyBlcnJvciAoJWQpXG4iLCBlcnIpOwogCQlyZXR1cm4gZXJyOwogCX0KIApAQCAtMTc0OCw3ICsxNzQzLDcgQEAKIAl2YWwgPSBodG9kMzIodmFsKTsKIAllcnIgPSB3bF9kZXZfaW9jdGwoZGV2LCBXTENfU0VUX0FVVEgsICZ2YWwsIHNpemVvZih2YWwpKTsKIAlpZiAodW5saWtlbHkoZXJyKSkgewotCQlXTF9FUlIoKCJXTENfU0VUX0FVVEggZXJyb3IgKCVkKVxuIiwgZXJyKSk7CisJCVdMX0VSUigiV0xDX1NFVF9BVVRIIGVycm9yICglZClcbiIsIGVycik7CiAJCXJldHVybiBlcnI7CiAJfQogCXJldHVybiBlcnI7CkBAIC0xNzY2LDcgKzE3NjEsNyBAQAogCXMzMiB3c2VjOwogCXMzMiBlcnIgPSAwOwogCi0JV0xfREJHKCgia2V5IGluZGV4ICglZClcbiIsIGtleV9pZHgpKTsKKwlXTF9EQkcoImtleSBpbmRleCAoJWQpXG4iLCBrZXlfaWR4KTsKIAlDSEVDS19TWVNfVVAoKTsKIAogCW1lbXNldCgma2V5LCAwLCBzaXplb2Yoa2V5KSk7CkBAIC0xNzc4LDcgKzE3NzMsNyBAQAogCiAJZXJyID0gd2xfZGV2X2lvY3RsKGRldiwgV0xDX0dFVF9XU0VDLCAmd3NlYywgc2l6ZW9mKHdzZWMpKTsKIAlpZiAodW5saWtlbHkoZXJyKSkgewotCQlXTF9FUlIoKCJXTENfR0VUX1dTRUMgZXJyb3IgKCVkKVxuIiwgZXJyKSk7CisJCVdMX0VSUigiV0xDX0dFVF9XU0VDIGVycm9yICglZClcbiIsIGVycik7CiAJCXJldHVybiBlcnI7CiAJfQogCXdzZWMgPSBkdG9oMzIod3NlYyk7CkBAIC0xNzg3LDIyICsxNzgyLDIyIEBACiAJCXNlYyA9IHdsX3JlYWRfcHJvZih3bCwgV0xfUFJPRl9TRUMpOwogCQlpZiAoc2VjLT5jaXBoZXJfcGFpcndpc2UgJiBXTEFOX0NJUEhFUl9TVUlURV9XRVA0MCkgewogCQkJcGFyYW1zLmNpcGhlciA9IFdMQU5fQ0lQSEVSX1NVSVRFX1dFUDQwOwotCQkJV0xfREJHKCgiV0xBTl9DSVBIRVJfU1VJVEVfV0VQNDBcbiIpKTsKKwkJCVdMX0RCRygiV0xBTl9DSVBIRVJfU1VJVEVfV0VQNDBcbiIpOwogCQl9IGVsc2UgaWYgKHNlYy0+Y2lwaGVyX3BhaXJ3aXNlICYgV0xBTl9DSVBIRVJfU1VJVEVfV0VQMTA0KSB7CiAJCQlwYXJhbXMuY2lwaGVyID0gV0xBTl9DSVBIRVJfU1VJVEVfV0VQMTA0OwotCQkJV0xfREJHKCgiV0xBTl9DSVBIRVJfU1VJVEVfV0VQMTA0XG4iKSk7CisJCQlXTF9EQkcoIldMQU5fQ0lQSEVSX1NVSVRFX1dFUDEwNFxuIik7CiAJCX0KIAkJYnJlYWs7CiAJY2FzZSBUS0lQX0VOQUJMRUQ6CiAJCXBhcmFtcy5jaXBoZXIgPSBXTEFOX0NJUEhFUl9TVUlURV9US0lQOwotCQlXTF9EQkcoKCJXTEFOX0NJUEhFUl9TVUlURV9US0lQXG4iKSk7CisJCVdMX0RCRygiV0xBTl9DSVBIRVJfU1VJVEVfVEtJUFxuIik7CiAJCWJyZWFrOwogCWNhc2UgQUVTX0VOQUJMRUQ6CiAJCXBhcmFtcy5jaXBoZXIgPSBXTEFOX0NJUEhFUl9TVUlURV9BRVNfQ01BQzsKLQkJV0xfREJHKCgiV0xBTl9DSVBIRVJfU1VJVEVfQUVTX0NNQUNcbiIpKTsKKwkJV0xfREJHKCJXTEFOX0NJUEhFUl9TVUlURV9BRVNfQ01BQ1xuIik7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCVdMX0VSUigoIkludmFsaWQgYWxnbyAoMHgleClcbiIsIHdzZWMpKTsKKwkJV0xfRVJSKCJJbnZhbGlkIGFsZ28gKDB4JXgpXG4iLCB3c2VjKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC0xODE0LDcgKzE4MDksNyBAQAogd2xfY2ZnODAyMTFfY29uZmlnX2RlZmF1bHRfbWdtdF9rZXkoc3RydWN0IHdpcGh5ICp3aXBoeSwKIAkJCQkgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTgga2V5X2lkeCkKIHsKLQlXTF9JTkZPKCgiTm90IHN1cHBvcnRlZFxuIikpOworCVdMX0lORk8oIk5vdCBzdXBwb3J0ZWRcbiIpOwogCUNIRUNLX1NZU19VUCgpOwogCXJldHVybiAtRU9QTk9UU1VQUDsKIH0KQEAgLTE4MzEsMjAgKzE4MjYsMjAgQEAKIAogCUNIRUNLX1NZU19VUCgpOwogCWlmICh1bmxpa2VseQotCSAgICAobWVtY21wKG1hYywgd2xfcmVhZF9wcm9mKHdsLCBXTF9QUk9GX0JTU0lEKSwgRVRIRVJfQUREUl9MRU4pKSkgewotCQlXTF9FUlIoKCJXcm9uZyBNYWMgYWRkcmVzc1xuIikpOworCSAgICAobWVtY21wKG1hYywgd2xfcmVhZF9wcm9mKHdsLCBXTF9QUk9GX0JTU0lEKSwgRVRIX0FMRU4pKSkgeworCQlXTF9FUlIoIldyb25nIE1hYyBhZGRyZXNzXG4iKTsKIAkJcmV0dXJuIC1FTk9FTlQ7CiAJfQogCiAJLyogUmVwb3J0IHRoZSBjdXJyZW50IHR4IHJhdGUgKi8KIAllcnIgPSB3bF9kZXZfaW9jdGwoZGV2LCBXTENfR0VUX1JBVEUsICZyYXRlLCBzaXplb2YocmF0ZSkpOwogCWlmIChlcnIpIHsKLQkJV0xfRVJSKCgiQ291bGQgbm90IGdldCByYXRlICglZClcbiIsIGVycikpOworCQlXTF9FUlIoIkNvdWxkIG5vdCBnZXQgcmF0ZSAoJWQpXG4iLCBlcnIpOwogCX0gZWxzZSB7CiAJCXJhdGUgPSBkdG9oMzIocmF0ZSk7CiAJCXNpbmZvLT5maWxsZWQgfD0gU1RBVElPTl9JTkZPX1RYX0JJVFJBVEU7CiAJCXNpbmZvLT50eHJhdGUubGVnYWN5ID0gcmF0ZSAqIDU7Ci0JCVdMX0RCRygoIlJhdGUgJWQgTWJwc1xuIiwgKHJhdGUgLyAyKSkpOworCQlXTF9EQkcoIlJhdGUgJWQgTWJwc1xuIiwgcmF0ZSAvIDIpOwogCX0KIAogCWlmICh0ZXN0X2JpdChXTF9TVEFUVVNfQ09OTkVDVEVELCAmd2wtPnN0YXR1cykpIHsKQEAgLTE4NTIsMTMgKzE4NDcsMTMgQEAKIAkJZXJyID0gd2xfZGV2X2lvY3RsKGRldiwgV0xDX0dFVF9SU1NJLCAmc2NiX3ZhbCwKIAkJCQlzaXplb2Yoc2NiX3ZhbF90KSk7CiAJCWlmICh1bmxpa2VseShlcnIpKSB7Ci0JCQlXTF9FUlIoKCJDb3VsZCBub3QgZ2V0IHJzc2kgKCVkKVxuIiwgZXJyKSk7CisJCQlXTF9FUlIoIkNvdWxkIG5vdCBnZXQgcnNzaSAoJWQpXG4iLCBlcnIpOwogCQkJcmV0dXJuIGVycjsKIAkJfQogCQlyc3NpID0gZHRvaDMyKHNjYl92YWwudmFsKTsKIAkJc2luZm8tPmZpbGxlZCB8PSBTVEFUSU9OX0lORk9fU0lHTkFMOwogCQlzaW5mby0+c2lnbmFsID0gcnNzaTsKLQkJV0xfREJHKCgiUlNTSSAlZCBkQm1cbiIsIHJzc2kpKTsKKwkJV0xfREJHKCJSU1NJICVkIGRCbVxuIiwgcnNzaSk7CiAJfQogCiAJcmV0dXJuIGVycjsKQEAgLTE4NzQsMTMgKzE4NjksMTMgQEAKIAlDSEVDS19TWVNfVVAoKTsKIAlwbSA9IGVuYWJsZWQgPyBQTV9GQVNUIDogUE1fT0ZGOwogCXBtID0gaHRvZDMyKHBtKTsKLQlXTF9EQkcoKCJwb3dlciBzYXZlICVzXG4iLCAocG0gPyAiZW5hYmxlZCIgOiAiZGlzYWJsZWQiKSkpOworCVdMX0RCRygicG93ZXIgc2F2ZSAlc1xuIiwgKHBtID8gImVuYWJsZWQiIDogImRpc2FibGVkIikpOwogCWVyciA9IHdsX2Rldl9pb2N0bChkZXYsIFdMQ19TRVRfUE0sICZwbSwgc2l6ZW9mKHBtKSk7CiAJaWYgKHVubGlrZWx5KGVycikpIHsKIAkJaWYgKGVyciA9PSAtRU5PREVWKQotCQkJV0xfREJHKCgibmV0X2RldmljZSBpcyBub3QgcmVhZHkgeWV0XG4iKSk7CisJCQlXTF9EQkcoIm5ldF9kZXZpY2UgaXMgbm90IHJlYWR5IHlldFxuIik7CiAJCWVsc2UKLQkJCVdMX0VSUigoImVycm9yICglZClcbiIsIGVycikpOworCQkJV0xfRVJSKCJlcnJvciAoJWQpXG4iLCBlcnIpOwogCQlyZXR1cm4gZXJyOwogCX0KIAlyZXR1cm4gZXJyOwpAQCAtMTkzMiw3ICsxOTI3LDcgQEAKIAllcnIgPSB3bF9kZXZfaW9jdGwoZGV2LCBXTENfR0VUX0NVUlJfUkFURVNFVCwgJnJhdGVzZXQsCiAJCQlzaXplb2YocmF0ZXNldCkpOwogCWlmICh1bmxpa2VseShlcnIpKSB7Ci0JCVdMX0VSUigoImNvdWxkIG5vdCBnZXQgY3VycmVudCByYXRlc2V0ICglZClcbiIsIGVycikpOworCQlXTF9FUlIoImNvdWxkIG5vdCBnZXQgY3VycmVudCByYXRlc2V0ICglZClcbiIsIGVycik7CiAJCXJldHVybiBlcnI7CiAJfQogCkBAIC0xOTUyLDcgKzE5NDcsNyBAQAogCQlyYXRlID0gdmFsIC8gNTAwMDAwOwogCX0KIAotCVdMX0RCRygoInJhdGUgJWQgbWJwc1xuIiwgKHJhdGUgLyAyKSkpOworCVdMX0RCRygicmF0ZSAlZCBtYnBzXG4iLCByYXRlIC8gMik7CiAKIAkvKgogCSAqCkBAIC0xOTYyLDcgKzE5NTcsNyBAQAogCWVycl9iZyA9IHdsX2Rldl9pbnR2YXJfc2V0KGRldiwgImJnX3JhdGUiLCByYXRlKTsKIAllcnJfYSA9IHdsX2Rldl9pbnR2YXJfc2V0KGRldiwgImFfcmF0ZSIsIHJhdGUpOwogCWlmICh1bmxpa2VseShlcnJfYmcgJiYgZXJyX2EpKSB7Ci0JCVdMX0VSUigoImNvdWxkIG5vdCBzZXQgZml4ZWQgcmF0ZSAoJWQpICglZClcbiIsIGVycl9iZywgZXJyX2EpKTsKKwkJV0xfRVJSKCJjb3VsZCBub3Qgc2V0IGZpeGVkIHJhdGUgKCVkKSAoJWQpXG4iLCBlcnJfYmcsIGVycl9hKTsKIAkJcmV0dXJuIGVycl9iZyB8IGVycl9hOwogCX0KIApAQCAtMjAwNywxMiArMjAwMiwxMiBAQAogewogCWludCBpLCBqOwogCi0JV0xfREJHKCgiTm8gb2YgZWxlbWVudHMgJWRcbiIsIHBta19saXN0LT5wbWtpZHMubnBta2lkKSk7CisJV0xfREJHKCJObyBvZiBlbGVtZW50cyAlZFxuIiwgcG1rX2xpc3QtPnBta2lkcy5ucG1raWQpOwogCWZvciAoaSA9IDA7IGkgPCBwbWtfbGlzdC0+cG1raWRzLm5wbWtpZDsgaSsrKSB7Ci0JCVdMX0RCRygoIlBNS0lEWyVkXTogJXBNID1cbiIsIGksCi0JCQkmcG1rX2xpc3QtPnBta2lkcy5wbWtpZFtpXS5CU1NJRCkpOworCQlXTF9EQkcoIlBNS0lEWyVkXTogJXBNID1cbiIsIGksCisJCSAgICAgICAmcG1rX2xpc3QtPnBta2lkcy5wbWtpZFtpXS5CU1NJRCk7CiAJCWZvciAoaiA9IDA7IGogPCBXUEEyX1BNS0lEX0xFTjsgaisrKSB7Ci0JCQlXTF9EQkcoKCIlMDJ4XG4iLCBwbWtfbGlzdC0+cG1raWRzLnBta2lkW2ldLlBNS0lEW2pdKSk7CisJCQlXTF9EQkcoIiUwMnhcbiIsIHBta19saXN0LT5wbWtpZHMucG1raWRbaV0uUE1LSURbal0pOwogCQl9CiAJfQogCWlmIChsaWtlbHkoIWVycikpIHsKQEAgLTIwMzQsMTEgKzIwMjksMTEgQEAKIAlDSEVDS19TWVNfVVAoKTsKIAlmb3IgKGkgPSAwOyBpIDwgd2wtPnBta19saXN0LT5wbWtpZHMubnBta2lkOyBpKyspCiAJCWlmICghbWVtY21wKHBta3NhLT5ic3NpZCwgJndsLT5wbWtfbGlzdC0+cG1raWRzLnBta2lkW2ldLkJTU0lELAotCQkJICAgIEVUSEVSX0FERFJfTEVOKSkKKwkJCSAgICBFVEhfQUxFTikpCiAJCQlicmVhazsKIAlpZiAoaSA8IFdMX05VTV9QTUtJRFNfTUFYKSB7CiAJCW1lbWNweSgmd2wtPnBta19saXN0LT5wbWtpZHMucG1raWRbaV0uQlNTSUQsIHBta3NhLT5ic3NpZCwKLQkJICAgICAgIEVUSEVSX0FERFJfTEVOKTsKKwkJICAgICAgIEVUSF9BTEVOKTsKIAkJbWVtY3B5KCZ3bC0+cG1rX2xpc3QtPnBta2lkcy5wbWtpZFtpXS5QTUtJRCwgcG1rc2EtPnBta2lkLAogCQkgICAgICAgV1BBMl9QTUtJRF9MRU4pOwogCQlpZiAoaSA9PSB3bC0+cG1rX2xpc3QtPnBta2lkcy5ucG1raWQpCkBAIC0yMDQ2LDEyICsyMDQxLDEyIEBACiAJfSBlbHNlIHsKIAkJZXJyID0gLUVJTlZBTDsKIAl9Ci0JV0xfREJHKCgic2V0X3Bta3NhLElXX1BNS1NBX0FERCAtIFBNS0lEOiAlcE0gPVxuIiwKLQkJJndsLT5wbWtfbGlzdC0+cG1raWRzLnBta2lkW3dsLT5wbWtfbGlzdC0+cG1raWRzLm5wbWtpZF0uQlNTSUQpKTsKKwlXTF9EQkcoInNldF9wbWtzYSxJV19QTUtTQV9BREQgLSBQTUtJRDogJXBNID1cbiIsCisJICAgICAgICZ3bC0+cG1rX2xpc3QtPnBta2lkcy5wbWtpZFt3bC0+cG1rX2xpc3QtPnBta2lkcy5ucG1raWRdLkJTU0lEKTsKIAlmb3IgKGkgPSAwOyBpIDwgV1BBMl9QTUtJRF9MRU47IGkrKykgewotCQlXTF9EQkcoKCIlMDJ4XG4iLAotCQkJd2wtPnBta19saXN0LT5wbWtpZHMucG1raWRbd2wtPnBta19saXN0LT5wbWtpZHMubnBta2lkXS4KLQkJCVBNS0lEW2ldKSk7CisJCVdMX0RCRygiJTAyeFxuIiwKKwkJICAgICAgIHdsLT5wbWtfbGlzdC0+cG1raWRzLnBta2lkW3dsLT5wbWtfbGlzdC0+cG1raWRzLm5wbWtpZF0uCisJCSAgICAgICBQTUtJRFtpXSk7CiAJfQogCiAJZXJyID0gd2xfdXBkYXRlX3Bta2xpc3QoZGV2LCB3bC0+cG1rX2xpc3QsIGVycik7CkBAIC0yMDY5LDE5ICsyMDY0LDE5IEBACiAJaW50IGk7CiAKIAlDSEVDS19TWVNfVVAoKTsKLQltZW1jcHkoJnBta2lkLnBta2lkWzBdLkJTU0lELCBwbWtzYS0+YnNzaWQsIEVUSEVSX0FERFJfTEVOKTsKKwltZW1jcHkoJnBta2lkLnBta2lkWzBdLkJTU0lELCBwbWtzYS0+YnNzaWQsIEVUSF9BTEVOKTsKIAltZW1jcHkoJnBta2lkLnBta2lkWzBdLlBNS0lELCBwbWtzYS0+cG1raWQsIFdQQTJfUE1LSURfTEVOKTsKIAotCVdMX0RCRygoImRlbF9wbWtzYSxJV19QTUtTQV9SRU1PVkUgLSBQTUtJRDogJXBNID1cbiIsCi0JCSZwbWtpZC5wbWtpZFswXS5CU1NJRCkpOworCVdMX0RCRygiZGVsX3Bta3NhLElXX1BNS1NBX1JFTU9WRSAtIFBNS0lEOiAlcE0gPVxuIiwKKwkgICAgICAgJnBta2lkLnBta2lkWzBdLkJTU0lEKTsKIAlmb3IgKGkgPSAwOyBpIDwgV1BBMl9QTUtJRF9MRU47IGkrKykgewotCQlXTF9EQkcoKCIlMDJ4XG4iLCBwbWtpZC5wbWtpZFswXS5QTUtJRFtpXSkpOworCQlXTF9EQkcoIiUwMnhcbiIsIHBta2lkLnBta2lkWzBdLlBNS0lEW2ldKTsKIAl9CiAKIAlmb3IgKGkgPSAwOyBpIDwgd2wtPnBta19saXN0LT5wbWtpZHMubnBta2lkOyBpKyspCiAJCWlmICghbWVtY21wCiAJCSAgICAocG1rc2EtPmJzc2lkLCAmd2wtPnBta19saXN0LT5wbWtpZHMucG1raWRbaV0uQlNTSUQsCi0JCSAgICAgRVRIRVJfQUREUl9MRU4pKQorCQkgICAgIEVUSF9BTEVOKSkKIAkJCWJyZWFrOwogCiAJaWYgKCh3bC0+cG1rX2xpc3QtPnBta2lkcy5ucG1raWQgPiAwKQpAQCAtMjA5MCw3ICsyMDg1LDcgQEAKIAkJZm9yICg7IGkgPCAod2wtPnBta19saXN0LT5wbWtpZHMubnBta2lkIC0gMSk7IGkrKykgewogCQkJbWVtY3B5KCZ3bC0+cG1rX2xpc3QtPnBta2lkcy5wbWtpZFtpXS5CU1NJRCwKIAkJCSAgICAgICAmd2wtPnBta19saXN0LT5wbWtpZHMucG1raWRbaSArIDFdLkJTU0lELAotCQkJICAgICAgIEVUSEVSX0FERFJfTEVOKTsKKwkJCSAgICAgICBFVEhfQUxFTik7CiAJCQltZW1jcHkoJndsLT5wbWtfbGlzdC0+cG1raWRzLnBta2lkW2ldLlBNS0lELAogCQkJICAgICAgICZ3bC0+cG1rX2xpc3QtPnBta2lkcy5wbWtpZFtpICsgMV0uUE1LSUQsCiAJCQkgICAgICAgV1BBMl9QTUtJRF9MRU4pOwpAQCAtMjE2OCwxMyArMjE2MywxMyBAQAogCiAJd2RldiA9IGt6YWxsb2Moc2l6ZW9mKCp3ZGV2KSwgR0ZQX0tFUk5FTCk7CiAJaWYgKHVubGlrZWx5KCF3ZGV2KSkgewotCQlXTF9FUlIoKCJDb3VsZCBub3QgYWxsb2NhdGUgd2lyZWxlc3MgZGV2aWNlXG4iKSk7CisJCVdMX0VSUigiQ291bGQgbm90IGFsbG9jYXRlIHdpcmVsZXNzIGRldmljZVxuIik7CiAJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwogCX0KIAl3ZGV2LT53aXBoeSA9CiAJICAgIHdpcGh5X25ldygmd2xfY2ZnODAyMTFfb3BzLCBzaXplb2Yoc3RydWN0IHdsX3ByaXYpICsgc2l6ZW9mX2lmYWNlKTsKIAlpZiAodW5saWtlbHkoIXdkZXYtPndpcGh5KSkgewotCQlXTF9FUlIoKCJDb3VsZG4gbm90IGFsbG9jYXRlIHdpcGh5IGRldmljZVxuIikpOworCQlXTF9FUlIoIkNvdWxkbiBub3QgYWxsb2NhdGUgd2lwaHkgZGV2aWNlXG4iKTsKIAkJZXJyID0gLUVOT01FTTsKIAkJZ290byB3aXBoeV9uZXdfb3V0OwogCX0KQEAgLTIyMDQsNyArMjE5OSw3IEBACiAjZW5kaWYJCQkJLyogIVdMX1BPV0VSU0FWRV9ESVNBQkxFRCAqLwogCWVyciA9IHdpcGh5X3JlZ2lzdGVyKHdkZXYtPndpcGh5KTsKIAlpZiAodW5saWtlbHkoZXJyIDwgMCkpIHsKLQkJV0xfRVJSKCgiQ291bGRuIG5vdCByZWdpc3RlciB3aXBoeSBkZXZpY2UgKCVkKVxuIiwgZXJyKSk7CisJCVdMX0VSUigiQ291bGRuIG5vdCByZWdpc3RlciB3aXBoeSBkZXZpY2UgKCVkKVxuIiwgZXJyKTsKIAkJZ290byB3aXBoeV9yZWdpc3Rlcl9vdXQ7CiAJfQogCXJldHVybiB3ZGV2OwpAQCAtMjIyMyw3ICsyMjE4LDcgQEAKIAlzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2ID0gd2xfdG9fd2Rldih3bCk7CiAKIAlpZiAodW5saWtlbHkoIXdkZXYpKSB7Ci0JCVdMX0VSUigoIndkZXYgaXMgaW52YWxpZFxuIikpOworCQlXTF9FUlIoIndkZXYgaXMgaW52YWxpZFxuIik7CiAJCXJldHVybjsKIAl9CiAJd2lwaHlfdW5yZWdpc3Rlcih3ZGV2LT53aXBoeSk7CkBAIC0yMjQxLDExICsyMjM2LDExIEBACiAKIAlic3NfbGlzdCA9IHdsLT5ic3NfbGlzdDsKIAlpZiAodW5saWtlbHkoYnNzX2xpc3QtPnZlcnNpb24gIT0gV0xfQlNTX0lORk9fVkVSU0lPTikpIHsKLQkJV0xfRVJSKCgiVmVyc2lvbiAlZCAhPSBXTF9CU1NfSU5GT19WRVJTSU9OXG4iLAotCQkJYnNzX2xpc3QtPnZlcnNpb24pKTsKKwkJV0xfRVJSKCJWZXJzaW9uICVkICE9IFdMX0JTU19JTkZPX1ZFUlNJT05cbiIsCisJCSAgICAgICBic3NfbGlzdC0+dmVyc2lvbik7CiAJCXJldHVybiAtRU9QTk9UU1VQUDsKIAl9Ci0JV0xfREJHKCgic2Nhbm5lZCBBUCBjb3VudCAoJWQpXG4iLCBic3NfbGlzdC0+Y291bnQpKTsKKwlXTF9EQkcoInNjYW5uZWQgQVAgY291bnQgKCVkKVxuIiwgYnNzX2xpc3QtPmNvdW50KTsKIAliaSA9IG5leHRfYnNzKGJzc19saXN0LCBiaSk7CiAJZm9yX2VhY2hfYnNzKGJzc19saXN0LCBiaSwgaSkgewogCQllcnIgPSB3bF9pbmZvcm1fc2luZ2xlX2Jzcyh3bCwgYmkpOwpAQCAtMjI3MCwxNCArMjI2NSwxNCBAQAogCXMzMiBlcnIgPSAwOwogCiAJaWYgKHVubGlrZWx5KGR0b2gzMihiaS0+bGVuZ3RoKSA+IFdMX0JTU19JTkZPX01BWCkpIHsKLQkJV0xfREJHKCgiQmVhY29uIGlzIGxhcmdlciB0aGFuIGJ1ZmZlci4gRGlzY2FyZGluZ1xuIikpOworCQlXTF9EQkcoIkJlYWNvbiBpcyBsYXJnZXIgdGhhbiBidWZmZXIuIERpc2NhcmRpbmdcbiIpOwogCQlyZXR1cm4gZXJyOwogCX0KIAlub3RpZl9ic3NfaW5mbyA9CiAJICAgIGt6YWxsb2Moc2l6ZW9mKCpub3RpZl9ic3NfaW5mbykgKyBzaXplb2YoKm1nbXQpIC0gc2l6ZW9mKHU4KSArCiAJCSAgICBXTF9CU1NfSU5GT19NQVgsIEdGUF9LRVJORUwpOwogCWlmICh1bmxpa2VseSghbm90aWZfYnNzX2luZm8pKSB7Ci0JCVdMX0VSUigoIm5vdGlmX2Jzc19pbmZvIGFsbG9jIGZhaWxlZFxuIikpOworCQlXTF9FUlIoIm5vdGlmX2Jzc19pbmZvIGFsbG9jIGZhaWxlZFxuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAltZ210ID0gKHN0cnVjdCBpZWVlODAyMTFfbWdtdCAqKW5vdGlmX2Jzc19pbmZvLT5mcmFtZV9idWY7CkBAIC0yMjg5LDcgKzIyODQsNyBAQAogCWVsc2UKIAkJYmFuZCA9IHdpcGh5LT5iYW5kc1tJRUVFODAyMTFfQkFORF81R0haXTsKIAlub3RpZl9ic3NfaW5mby0+cnNzaSA9IGJpLT5SU1NJOwotCW1lbWNweShtZ210LT5ic3NpZCwgJmJpLT5CU1NJRCwgRVRIRVJfQUREUl9MRU4pOworCW1lbWNweShtZ210LT5ic3NpZCwgJmJpLT5CU1NJRCwgRVRIX0FMRU4pOwogCW1nbXRfdHlwZSA9IHdsLT5hY3RpdmVfc2NhbiA/CiAJCUlFRUU4MDIxMV9TVFlQRV9QUk9CRV9SRVNQIDogSUVFRTgwMjExX1NUWVBFX0JFQUNPTjsKIAlpZiAoIW1lbWNtcChiaS0+U1NJRCwgc3ItPnNzaWQuU1NJRCwgYmktPlNTSURfbGVuKSkgewpAQCAtMjMyMSwxNyArMjMxNiwxNyBAQAogCWZyZXEgPSBpZWVlODAyMTFfY2hhbm5lbF90b19mcmVxdWVuY3kobm90aWZfYnNzX2luZm8tPmNoYW5uZWwpOwogCWNoYW5uZWwgPSBpZWVlODAyMTFfZ2V0X2NoYW5uZWwod2lwaHksIGZyZXEpOwogCi0JV0xfREJHKCgiU1NJRCA6IFwiJXNcIiwgcnNzaSAlZCwgY2hhbm5lbCAlZCwgY2FwYWJpbGl0eSA6IDB4MDQleCwgYnNzaWQgJXBNXG4iLAotCQliaS0+U1NJRCwKLQkJbm90aWZfYnNzX2luZm8tPnJzc2ksIG5vdGlmX2Jzc19pbmZvLT5jaGFubmVsLAotCQltZ210LT51LmJlYWNvbi5jYXBhYl9pbmZvLCAmYmktPkJTU0lEKSk7CisJV0xfREJHKCJTU0lEIDogXCIlc1wiLCByc3NpICVkLCBjaGFubmVsICVkLCBjYXBhYmlsaXR5IDogMHgwNCV4LCBic3NpZCAlcE1cbiIsCisJICAgICAgIGJpLT5TU0lELAorCSAgICAgICBub3RpZl9ic3NfaW5mby0+cnNzaSwgbm90aWZfYnNzX2luZm8tPmNoYW5uZWwsCisJICAgICAgIG1nbXQtPnUuYmVhY29uLmNhcGFiX2luZm8sICZiaS0+QlNTSUQpOwogCiAJc2lnbmFsID0gbm90aWZfYnNzX2luZm8tPnJzc2kgKiAxMDA7CiAJaWYgKHVubGlrZWx5KCFjZmc4MDIxMV9pbmZvcm1fYnNzX2ZyYW1lKHdpcGh5LCBjaGFubmVsLCBtZ210LAogCQkJCQkJbGUxNl90b19jcHUKIAkJCQkJCShub3RpZl9ic3NfaW5mby0+ZnJhbWVfbGVuKSwKIAkJCQkJCXNpZ25hbCwgR0ZQX0tFUk5FTCkpKSB7Ci0JCVdMX0VSUigoImNmZzgwMjExX2luZm9ybV9ic3NfZnJhbWUgZXJyb3JcbiIpKTsKKwkJV0xfRVJSKCJjZmc4MDIxMV9pbmZvcm1fYnNzX2ZyYW1lIGVycm9yXG4iKTsKIAkJa2ZyZWUobm90aWZfYnNzX2luZm8pOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CkBAIC0yMzk5LDEyICsyMzk0LDEyIEBACiAJCWlmICh3bF9pc19pYnNzbW9kZSh3bCkpIHsKIAkJCWNmZzgwMjExX2lic3Nfam9pbmVkKG5kZXYsIChzOCAqKSZlLT5hZGRyLAogCQkJCQkgICAgIEdGUF9LRVJORUwpOwotCQkJV0xfREJHKCgiam9pbmVkIGluIElCU1MgbmV0d29ya1xuIikpOworCQkJV0xfREJHKCJqb2luZWQgaW4gSUJTUyBuZXR3b3JrXG4iKTsKIAkJfSBlbHNlIHsKIAkJCXdsX2Jzc19jb25uZWN0X2RvbmUod2wsIG5kZXYsIGUsIGRhdGEsIHRydWUpOwotCQkJV0xfREJHKCgiam9pbmVkIGluIEJTUyBuZXR3b3JrIFwiJXNcIlxuIiwKLQkJCQkoKHN0cnVjdCB3bGNfc3NpZCAqKQotCQkJCSB3bF9yZWFkX3Byb2Yod2wsIFdMX1BST0ZfU1NJRCkpLT5TU0lEKSk7CisJCQlXTF9EQkcoImpvaW5lZCBpbiBCU1MgbmV0d29yayBcIiVzXCJcbiIsCisJCQkgICAgICAgKChzdHJ1Y3Qgd2xjX3NzaWQgKikKKwkJCQl3bF9yZWFkX3Byb2Yod2wsIFdMX1BST0ZfU1NJRCkpLT5TU0lEKTsKIAkJfQogCQlhY3QgPSB0cnVlOwogCQl3bF91cGRhdGVfcHJvZih3bCwgZSwgJmFjdCwgV0xfUFJPRl9BQ1QpOwpAQCAtMjQ1OSw3ICsyNDU0LDcgQEAKIAllcnIgPSB3bF9kZXZfaW9jdGwoZGV2LCBXTENfR0VUX1ZBUiwgKHZvaWQgKil3bC0+aW9jdGxfYnVmLAogCQkJV0xfSU9DVExfTEVOX01BWCk7CiAJaWYgKHVubGlrZWx5KGVycikpIHsKLQkJV0xfRVJSKCgiZXJyb3IgKCVkKVxuIiwgZXJyKSk7CisJCVdMX0VSUigiZXJyb3IgKCVkKVxuIiwgZXJyKTsKIAkJcmV0dXJuIGVycjsKIAl9CiAJbWVtY3B5KGJ1Ziwgd2wtPmlvY3RsX2J1ZiwgYnVmX2xlbik7CkBAIC0yNDc5LDcgKzI0NzQsNyBAQAogCWVyciA9IHdsX2Rldl9idWZ2YXJfZ2V0KG5kZXYsICJhc3NvY19pbmZvIiwgd2wtPmV4dHJhX2J1ZiwKIAkJCQlXTF9BU1NPQ19JTkZPX01BWCk7CiAJaWYgKHVubGlrZWx5KGVycikpIHsKLQkJV0xfRVJSKCgiY291bGQgbm90IGdldCBhc3NvYyBpbmZvICglZClcbiIsIGVycikpOworCQlXTF9FUlIoImNvdWxkIG5vdCBnZXQgYXNzb2MgaW5mbyAoJWQpXG4iLCBlcnIpOwogCQlyZXR1cm4gZXJyOwogCX0KIAlhc3NvY19pbmZvID0gKHN0cnVjdCB3bF9hc3NvY19pZWxlbiAqKXdsLT5leHRyYV9idWY7CkBAIC0yNDg5LDcgKzI0ODQsNyBAQAogCQllcnIgPSB3bF9kZXZfYnVmdmFyX2dldChuZGV2LCAiYXNzb2NfcmVxX2llcyIsIHdsLT5leHRyYV9idWYsCiAJCQkJCVdMX0FTU09DX0lORk9fTUFYKTsKIAkJaWYgKHVubGlrZWx5KGVycikpIHsKLQkJCVdMX0VSUigoImNvdWxkIG5vdCBnZXQgYXNzb2MgcmVxICglZClcbiIsIGVycikpOworCQkJV0xfRVJSKCJjb3VsZCBub3QgZ2V0IGFzc29jIHJlcSAoJWQpXG4iLCBlcnIpOwogCQkJcmV0dXJuIGVycjsKIAkJfQogCQljb25uX2luZm8tPnJlcV9pZV9sZW4gPSByZXFfbGVuOwpAQCAtMjUwMyw3ICsyNDk4LDcgQEAKIAkJZXJyID0gd2xfZGV2X2J1ZnZhcl9nZXQobmRldiwgImFzc29jX3Jlc3BfaWVzIiwgd2wtPmV4dHJhX2J1ZiwKIAkJCQkJV0xfQVNTT0NfSU5GT19NQVgpOwogCQlpZiAodW5saWtlbHkoZXJyKSkgewotCQkJV0xfRVJSKCgiY291bGQgbm90IGdldCBhc3NvYyByZXNwICglZClcbiIsIGVycikpOworCQkJV0xfRVJSKCJjb3VsZCBub3QgZ2V0IGFzc29jIHJlc3AgKCVkKVxuIiwgZXJyKTsKIAkJCXJldHVybiBlcnI7CiAJCX0KIAkJY29ubl9pbmZvLT5yZXNwX2llX2xlbiA9IHJlc3BfbGVuOwpAQCAtMjUxMyw4ICsyNTA4LDggQEAKIAkJY29ubl9pbmZvLT5yZXNwX2llX2xlbiA9IDA7CiAJCWNvbm5faW5mby0+cmVzcF9pZSA9IE5VTEw7CiAJfQotCVdMX0RCRygoInJlcSBsZW4gKCVkKSByZXNwIGxlbiAoJWQpXG4iLCBjb25uX2luZm8tPnJlcV9pZV9sZW4sCi0JCWNvbm5faW5mby0+cmVzcF9pZV9sZW4pKTsKKwlXTF9EQkcoInJlcSBsZW4gKCVkKSByZXNwIGxlbiAoJWQpXG4iLAorCSAgICAgICBjb25uX2luZm8tPnJlcV9pZV9sZW4sIGNvbm5faW5mby0+cmVzcF9pZV9sZW4pOwogCiAJcmV0dXJuIGVycjsKIH0KQEAgLTI1NDcsOCArMjU0Miw4IEBACiAJCWpvaW5fcGFyYW1zLT5wYXJhbXMuY2hhbnNwZWNfbnVtID0KIAkJCWh0b2QzMihqb2luX3BhcmFtcy0+cGFyYW1zLmNoYW5zcGVjX251bSk7CiAKLQkJV0xfREJHKCgiam9pbl9wYXJhbXMtPnBhcmFtcy5jaGFuc3BlY19saXN0WzBdPSAlI1gsIGNoYW5uZWwgJWQsIGNoYW5zcGVjICUjWFxuIiwKLQkJCWpvaW5fcGFyYW1zLT5wYXJhbXMuY2hhbnNwZWNfbGlzdFswXSwgY2gsIGNoYW5zcGVjKSk7CisJCVdMX0RCRygiam9pbl9wYXJhbXMtPnBhcmFtcy5jaGFuc3BlY19saXN0WzBdPSAlI1gsIGNoYW5uZWwgJWQsIGNoYW5zcGVjICUjWFxuIiwKKwkJICAgICAgIGpvaW5fcGFyYW1zLT5wYXJhbXMuY2hhbnNwZWNfbGlzdFswXSwgY2gsIGNoYW5zcGVjKTsKIAl9CiB9CiAKQEAgLTI1NzUsMTYgKzI1NzAsMTYgQEAKIAogCXJ0bmxfbG9jaygpOwogCWlmICh1bmxpa2VseSghYnNzKSkgewotCQlXTF9EQkcoKCJDb3VsZCBub3QgZmluZCB0aGUgQVBcbiIpKTsKKwkJV0xfREJHKCJDb3VsZCBub3QgZmluZCB0aGUgQVBcbiIpOwogCQkqKHUzMiAqKSB3bC0+ZXh0cmFfYnVmID0gaHRvZDMyKFdMX0VYVFJBX0JVRl9NQVgpOwogCQllcnIgPSB3bF9kZXZfaW9jdGwod2xfdG9fbmRldih3bCksIFdMQ19HRVRfQlNTX0lORk8sCiAJCQkJd2wtPmV4dHJhX2J1ZiwgV0xfRVhUUkFfQlVGX01BWCk7CiAJCWlmICh1bmxpa2VseShlcnIpKSB7Ci0JCQlXTF9FUlIoKCJDb3VsZCBub3QgZ2V0IGJzcyBpbmZvICVkXG4iLCBlcnIpKTsKKwkJCVdMX0VSUigiQ291bGQgbm90IGdldCBic3MgaW5mbyAlZFxuIiwgZXJyKTsKIAkJCWdvdG8gdXBkYXRlX2Jzc19pbmZvX291dDsKIAkJfQogCQliaSA9IChzdHJ1Y3Qgd2xfYnNzX2luZm8gKikod2wtPmV4dHJhX2J1ZiArIDQpOwotCQlpZiAodW5saWtlbHkobWVtY21wKCZiaS0+QlNTSUQsICZ3bC0+YnNzaWQsIEVUSEVSX0FERFJfTEVOKSkpIHsKKwkJaWYgKHVubGlrZWx5KG1lbWNtcCgmYmktPkJTU0lELCAmd2wtPmJzc2lkLCBFVEhfQUxFTikpKSB7CiAJCQllcnIgPSAtRUlPOwogCQkJZ290byB1cGRhdGVfYnNzX2luZm9fb3V0OwogCQl9CkBAIC0yNTk2LDcgKzI1OTEsNyBAQAogCQlpZV9sZW4gPSBiaS0+aWVfbGVuZ3RoOwogCQliZWFjb25faW50ZXJ2YWwgPSBjcHVfdG9fbGUxNihiaS0+YmVhY29uX3BlcmlvZCk7CiAJfSBlbHNlIHsKLQkJV0xfREJHKCgiRm91bmQgdGhlIEFQIGluIHRoZSBsaXN0IC0gQlNTSUQgJXBNXG4iLCBic3MtPmJzc2lkKSk7CisJCVdMX0RCRygiRm91bmQgdGhlIEFQIGluIHRoZSBsaXN0IC0gQlNTSUQgJXBNXG4iLCBic3MtPmJzc2lkKTsKIAkJaWUgPSBic3MtPmluZm9ybWF0aW9uX2VsZW1lbnRzOwogCQlpZV9sZW4gPSBic3MtPmxlbl9pbmZvcm1hdGlvbl9lbGVtZW50czsKIAkJYmVhY29uX2ludGVydmFsID0gYnNzLT5iZWFjb25faW50ZXJ2YWw7CkBAIC0yNjE1LDcgKzI2MTAsNyBAQAogCQllcnIgPSB3bF9kZXZfaW9jdGwod2xfdG9fbmRldih3bCksIFdMQ19HRVRfRFRJTVBSRCwKIAkJCSZkdGltX3BlcmlvZCwgc2l6ZW9mKGR0aW1fcGVyaW9kKSk7CiAJCWlmICh1bmxpa2VseShlcnIpKSB7Ci0JCQlXTF9FUlIoKCJXTENfR0VUX0RUSU1QUkQgZXJyb3IgKCVkKVxuIiwgZXJyKSk7CisJCQlXTF9FUlIoIldMQ19HRVRfRFRJTVBSRCBlcnJvciAoJWQpXG4iLCBlcnIpOwogCQkJZ290byB1cGRhdGVfYnNzX2luZm9fb3V0OwogCQl9CiAJfQpAQCAtMjYzNiwxMyArMjYzMSwxMyBAQAogCXMzMiBlcnIgPSAwOwogCiAJd2xfZ2V0X2Fzc29jX2llcyh3bCk7Ci0JbWVtY3B5KCZ3bC0+YnNzaWQsICZlLT5hZGRyLCBFVEhFUl9BRERSX0xFTik7CisJbWVtY3B5KCZ3bC0+YnNzaWQsICZlLT5hZGRyLCBFVEhfQUxFTik7CiAJd2xfdXBkYXRlX2Jzc19pbmZvKHdsKTsKIAljZmc4MDIxMV9yb2FtZWQobmRldiwKIAkJCSh1OCAqKSZ3bC0+YnNzaWQsCiAJCQljb25uX2luZm8tPnJlcV9pZSwgY29ubl9pbmZvLT5yZXFfaWVfbGVuLAogCQkJY29ubl9pbmZvLT5yZXNwX2llLCBjb25uX2luZm8tPnJlc3BfaWVfbGVuLCBHRlBfS0VSTkVMKTsKLQlXTF9EQkcoKCJSZXBvcnQgcm9hbWluZyByZXN1bHRcbiIpKTsKKwlXTF9EQkcoIlJlcG9ydCByb2FtaW5nIHJlc3VsdFxuIik7CiAKIAlzZXRfYml0KFdMX1NUQVRVU19DT05ORUNURUQsICZ3bC0+c3RhdHVzKTsKIApAQCAtMjY1Nyw3ICsyNjUyLDcgQEAKIAlzMzIgZXJyID0gMDsKIAogCXdsX2dldF9hc3NvY19pZXMod2wpOwotCW1lbWNweSgmd2wtPmJzc2lkLCAmZS0+YWRkciwgRVRIRVJfQUREUl9MRU4pOworCW1lbWNweSgmd2wtPmJzc2lkLCAmZS0+YWRkciwgRVRIX0FMRU4pOwogCXdsX3VwZGF0ZV9ic3NfaW5mbyh3bCk7CiAJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChXTF9TVEFUVVNfQ09OTkVDVElORywgJndsLT5zdGF0dXMpKSB7CiAJCWNmZzgwMjExX2Nvbm5lY3RfcmVzdWx0KG5kZXYsCkBAIC0yNjY4LDE1ICsyNjYzLDE1IEBACiAJCQkJCWNvbm5faW5mby0+cmVzcF9pZV9sZW4sCiAJCQkJCWNvbXBsZXRlZCA/IFdMQU5fU1RBVFVTX1NVQ0NFU1MgOiBXTEFOX1NUQVRVU19BVVRIX1RJTUVPVVQsCiAJCQkJCUdGUF9LRVJORUwpOwotCQlXTF9EQkcoKCJSZXBvcnQgY29ubmVjdCByZXN1bHQgLSBjb25uZWN0aW9uICVzXG4iLAotCQkJY29tcGxldGVkID8gInN1Y2NlZWRlZCIgOiAiZmFpbGVkIikpOworCQlXTF9EQkcoIlJlcG9ydCBjb25uZWN0IHJlc3VsdCAtIGNvbm5lY3Rpb24gJXNcbiIsCisJCSAgICAgICBjb21wbGV0ZWQgPyAic3VjY2VlZGVkIiA6ICJmYWlsZWQiKTsKIAl9IGVsc2UgewogCQljZmc4MDIxMV9yb2FtZWQobmRldiwKIAkJCQkodTggKikmd2wtPmJzc2lkLAogCQkJCWNvbm5faW5mby0+cmVxX2llLCBjb25uX2luZm8tPnJlcV9pZV9sZW4sCiAJCQkJY29ubl9pbmZvLT5yZXNwX2llLCBjb25uX2luZm8tPnJlc3BfaWVfbGVuLAogCQkJCUdGUF9LRVJORUwpOwotCQlXTF9EQkcoKCJSZXBvcnQgcm9hbWluZyByZXN1bHRcbiIpKTsKKwkJV0xfREJHKCJSZXBvcnQgcm9hbWluZyByZXN1bHRcbiIpOwogCX0KIAlzZXRfYml0KFdMX1NUQVRVU19DT05ORUNURUQsICZ3bC0+c3RhdHVzKTsKIApAQCAtMjcxNiw3ICsyNzExLDcgQEAKIAkJcmV0dXJuIHdsX3dha2V1cF9pc2Nhbih3bF90b19pc2Nhbih3bCkpOwogCiAJaWYgKHVubGlrZWx5KCF0ZXN0X2FuZF9jbGVhcl9iaXQoV0xfU1RBVFVTX1NDQU5OSU5HLCAmd2wtPnN0YXR1cykpKSB7Ci0JCVdMX0VSUigoIlNjYW4gY29tcGxldGUgd2hpbGUgZGV2aWNlIG5vdCBzY2FubmluZ1xuIikpOworCQlXTF9FUlIoIlNjYW4gY29tcGxldGUgd2hpbGUgZGV2aWNlIG5vdCBzY2FubmluZ1xuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAlpZiAodW5saWtlbHkoIXdsLT5zY2FuX3JlcXVlc3QpKSB7CkBAIC0yNzI1LDE0ICsyNzIwLDE0IEBACiAJZXJyID0gd2xfZGV2X2lvY3RsKG5kZXYsIFdMQ19HRVRfQ0hBTk5FTCwgJmNoYW5uZWxfaW5mb3JtLAogCQkJc2l6ZW9mKGNoYW5uZWxfaW5mb3JtKSk7CiAJaWYgKHVubGlrZWx5KGVycikpIHsKLQkJV0xfRVJSKCgic2NhbiBidXN5ICglZClcbiIsIGVycikpOworCQlXTF9FUlIoInNjYW4gYnVzeSAoJWQpXG4iLCBlcnIpOwogCQlnb3RvIHNjYW5fZG9uZV9vdXQ7CiAJfQogCWNoYW5uZWxfaW5mb3JtLnNjYW5fY2hhbm5lbCA9IGR0b2gzMihjaGFubmVsX2luZm9ybS5zY2FuX2NoYW5uZWwpOwogCWlmICh1bmxpa2VseShjaGFubmVsX2luZm9ybS5zY2FuX2NoYW5uZWwpKSB7CiAKLQkJV0xfREJHKCgiY2hhbm5lbF9pbmZvcm0uc2Nhbl9jaGFubmVsICglZClcbiIsCi0JCQljaGFubmVsX2luZm9ybS5zY2FuX2NoYW5uZWwpKTsKKwkJV0xfREJHKCJjaGFubmVsX2luZm9ybS5zY2FuX2NoYW5uZWwgKCVkKVxuIiwKKwkJICAgICAgIGNoYW5uZWxfaW5mb3JtLnNjYW5fY2hhbm5lbCk7CiAJfQogCXdsLT5ic3NfbGlzdCA9IHdsLT5zY2FuX3Jlc3VsdHM7CiAJYnNzX2xpc3QgPSB3bC0+YnNzX2xpc3Q7CkBAIC0yNzQwLDcgKzI3MzUsNyBAQAogCWJzc19saXN0LT5idWZsZW4gPSBodG9kMzIobGVuKTsKIAllcnIgPSB3bF9kZXZfaW9jdGwobmRldiwgV0xDX1NDQU5fUkVTVUxUUywgYnNzX2xpc3QsIGxlbik7CiAJaWYgKHVubGlrZWx5KGVycikpIHsKLQkJV0xfRVJSKCgiJXMgU2Nhbl9yZXN1bHRzIGVycm9yICglZClcbiIsIG5kZXYtPm5hbWUsIGVycikpOworCQlXTF9FUlIoIiVzIFNjYW5fcmVzdWx0cyBlcnJvciAoJWQpXG4iLCBuZGV2LT5uYW1lLCBlcnIpOwogCQllcnIgPSAtRUlOVkFMOwogCQlnb3RvIHNjYW5fZG9uZV9vdXQ7CiAJfQpAQCAtMjc5NCw1NSArMjc4OSw1NCBAQAogCiBzdGF0aWMgczMyIHdsX2luaXRfcHJpdl9tZW0oc3RydWN0IHdsX3ByaXYgKndsKQogewotCXdsLT5zY2FuX3Jlc3VsdHMgPSAodm9pZCAqKWt6YWxsb2MoV0xfU0NBTl9CVUZfTUFYLCBHRlBfS0VSTkVMKTsKKwl3bC0+c2Nhbl9yZXN1bHRzID0ga3phbGxvYyhXTF9TQ0FOX0JVRl9NQVgsIEdGUF9LRVJORUwpOwogCWlmICh1bmxpa2VseSghd2wtPnNjYW5fcmVzdWx0cykpIHsKLQkJV0xfRVJSKCgiU2NhbiByZXN1bHRzIGFsbG9jIGZhaWxlZFxuIikpOworCQlXTF9FUlIoIlNjYW4gcmVzdWx0cyBhbGxvYyBmYWlsZWRcbiIpOwogCQlnb3RvIGluaXRfcHJpdl9tZW1fb3V0OwogCX0KLQl3bC0+Y29uZiA9ICh2b2lkICopa3phbGxvYyhzaXplb2YoKndsLT5jb25mKSwgR0ZQX0tFUk5FTCk7CisJd2wtPmNvbmYgPSBremFsbG9jKHNpemVvZigqd2wtPmNvbmYpLCBHRlBfS0VSTkVMKTsKIAlpZiAodW5saWtlbHkoIXdsLT5jb25mKSkgewotCQlXTF9FUlIoKCJ3bF9jb25mIGFsbG9jIGZhaWxlZFxuIikpOworCQlXTF9FUlIoIndsX2NvbmYgYWxsb2MgZmFpbGVkXG4iKTsKIAkJZ290byBpbml0X3ByaXZfbWVtX291dDsKIAl9Ci0Jd2wtPnByb2ZpbGUgPSAodm9pZCAqKWt6YWxsb2Moc2l6ZW9mKCp3bC0+cHJvZmlsZSksIEdGUF9LRVJORUwpOworCXdsLT5wcm9maWxlID0ga3phbGxvYyhzaXplb2YoKndsLT5wcm9maWxlKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKHVubGlrZWx5KCF3bC0+cHJvZmlsZSkpIHsKLQkJV0xfRVJSKCgid2xfcHJvZmlsZSBhbGxvYyBmYWlsZWRcbiIpKTsKKwkJV0xfRVJSKCJ3bF9wcm9maWxlIGFsbG9jIGZhaWxlZFxuIik7CiAJCWdvdG8gaW5pdF9wcml2X21lbV9vdXQ7CiAJfQotCXdsLT5ic3NfaW5mbyA9ICh2b2lkICopa3phbGxvYyhXTF9CU1NfSU5GT19NQVgsIEdGUF9LRVJORUwpOworCXdsLT5ic3NfaW5mbyA9IGt6YWxsb2MoV0xfQlNTX0lORk9fTUFYLCBHRlBfS0VSTkVMKTsKIAlpZiAodW5saWtlbHkoIXdsLT5ic3NfaW5mbykpIHsKLQkJV0xfRVJSKCgiQnNzIGluZm9ybWF0aW9uIGFsbG9jIGZhaWxlZFxuIikpOworCQlXTF9FUlIoIkJzcyBpbmZvcm1hdGlvbiBhbGxvYyBmYWlsZWRcbiIpOwogCQlnb3RvIGluaXRfcHJpdl9tZW1fb3V0OwogCX0KLQl3bC0+c2Nhbl9yZXFfaW50ID0KLQkgICAgKHZvaWQgKilremFsbG9jKHNpemVvZigqd2wtPnNjYW5fcmVxX2ludCksIEdGUF9LRVJORUwpOworCXdsLT5zY2FuX3JlcV9pbnQgPSBremFsbG9jKHNpemVvZigqd2wtPnNjYW5fcmVxX2ludCksIEdGUF9LRVJORUwpOwogCWlmICh1bmxpa2VseSghd2wtPnNjYW5fcmVxX2ludCkpIHsKLQkJV0xfRVJSKCgiU2NhbiByZXEgYWxsb2MgZmFpbGVkXG4iKSk7CisJCVdMX0VSUigiU2NhbiByZXEgYWxsb2MgZmFpbGVkXG4iKTsKIAkJZ290byBpbml0X3ByaXZfbWVtX291dDsKIAl9Ci0Jd2wtPmlvY3RsX2J1ZiA9ICh2b2lkICopa3phbGxvYyhXTF9JT0NUTF9MRU5fTUFYLCBHRlBfS0VSTkVMKTsKKwl3bC0+aW9jdGxfYnVmID0ga3phbGxvYyhXTF9JT0NUTF9MRU5fTUFYLCBHRlBfS0VSTkVMKTsKIAlpZiAodW5saWtlbHkoIXdsLT5pb2N0bF9idWYpKSB7Ci0JCVdMX0VSUigoIklvY3RsIGJ1ZiBhbGxvYyBmYWlsZWRcbiIpKTsKKwkJV0xfRVJSKCJJb2N0bCBidWYgYWxsb2MgZmFpbGVkXG4iKTsKIAkJZ290byBpbml0X3ByaXZfbWVtX291dDsKIAl9Ci0Jd2wtPmV4dHJhX2J1ZiA9ICh2b2lkICopa3phbGxvYyhXTF9FWFRSQV9CVUZfTUFYLCBHRlBfS0VSTkVMKTsKKwl3bC0+ZXh0cmFfYnVmID0ga3phbGxvYyhXTF9FWFRSQV9CVUZfTUFYLCBHRlBfS0VSTkVMKTsKIAlpZiAodW5saWtlbHkoIXdsLT5leHRyYV9idWYpKSB7Ci0JCVdMX0VSUigoIkV4dHJhIGJ1ZiBhbGxvYyBmYWlsZWRcbiIpKTsKKwkJV0xfRVJSKCJFeHRyYSBidWYgYWxsb2MgZmFpbGVkXG4iKTsKIAkJZ290byBpbml0X3ByaXZfbWVtX291dDsKIAl9Ci0Jd2wtPmlzY2FuID0gKHZvaWQgKilremFsbG9jKHNpemVvZigqd2wtPmlzY2FuKSwgR0ZQX0tFUk5FTCk7CisJd2wtPmlzY2FuID0ga3phbGxvYyhzaXplb2YoKndsLT5pc2NhbiksIEdGUF9LRVJORUwpOwogCWlmICh1bmxpa2VseSghd2wtPmlzY2FuKSkgewotCQlXTF9FUlIoKCJJc2NhbiBidWYgYWxsb2MgZmFpbGVkXG4iKSk7CisJCVdMX0VSUigiSXNjYW4gYnVmIGFsbG9jIGZhaWxlZFxuIik7CiAJCWdvdG8gaW5pdF9wcml2X21lbV9vdXQ7CiAJfQotCXdsLT5mdyA9ICh2b2lkICopa3phbGxvYyhzaXplb2YoKndsLT5mdyksIEdGUF9LRVJORUwpOworCXdsLT5mdyA9IGt6YWxsb2Moc2l6ZW9mKCp3bC0+ZncpLCBHRlBfS0VSTkVMKTsKIAlpZiAodW5saWtlbHkoIXdsLT5mdykpIHsKLQkJV0xfRVJSKCgiZncgb2JqZWN0IGFsbG9jIGZhaWxlZFxuIikpOworCQlXTF9FUlIoImZ3IG9iamVjdCBhbGxvYyBmYWlsZWRcbiIpOwogCQlnb3RvIGluaXRfcHJpdl9tZW1fb3V0OwogCX0KLQl3bC0+cG1rX2xpc3QgPSAodm9pZCAqKWt6YWxsb2Moc2l6ZW9mKCp3bC0+cG1rX2xpc3QpLCBHRlBfS0VSTkVMKTsKKwl3bC0+cG1rX2xpc3QgPSBremFsbG9jKHNpemVvZigqd2wtPnBta19saXN0KSwgR0ZQX0tFUk5FTCk7CiAJaWYgKHVubGlrZWx5KCF3bC0+cG1rX2xpc3QpKSB7Ci0JCVdMX0VSUigoInBtayBsaXN0IGFsbG9jIGZhaWxlZFxuIikpOworCQlXTF9FUlIoInBtayBsaXN0IGFsbG9jIGZhaWxlZFxuIik7CiAJCWdvdG8gaW5pdF9wcml2X21lbV9vdXQ7CiAJfQogCkBAIC0yODg0LDcgKzI4NzgsNyBAQAogCXdsLT5ldmVudF90c2sgPSBrdGhyZWFkX3J1bih3bF9ldmVudF9oYW5kbGVyLCB3bCwgIndsX2V2ZW50X2hhbmRsZXIiKTsKIAlpZiAoSVNfRVJSKHdsLT5ldmVudF90c2spKSB7CiAJCXdsLT5ldmVudF90c2sgPSBOVUxMOwotCQlXTF9FUlIoKCJmYWlsZWQgdG8gY3JlYXRlIGV2ZW50IHRocmVhZFxuIikpOworCQlXTF9FUlIoImZhaWxlZCB0byBjcmVhdGUgZXZlbnQgdGhyZWFkXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCXJldHVybiAwOwpAQCAtMjkxNyw3ICsyOTExLDcgQEAKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiA9IHdsX3RvX25kZXYod2wpOwogCiAJaWYgKHVubGlrZWx5KCF0ZXN0X2FuZF9jbGVhcl9iaXQoV0xfU1RBVFVTX1NDQU5OSU5HLCAmd2wtPnN0YXR1cykpKSB7Ci0JCVdMX0VSUigoIlNjYW4gY29tcGxldGUgd2hpbGUgZGV2aWNlIG5vdCBzY2FubmluZ1xuIikpOworCQlXTF9FUlIoIlNjYW4gY29tcGxldGUgd2hpbGUgZGV2aWNlIG5vdCBzY2FubmluZ1xuIik7CiAJCXJldHVybjsKIAl9CiAJaWYgKGxpa2VseSh3bC0+c2Nhbl9yZXF1ZXN0KSkgewpAQCAtMjkzMSw3ICsyOTI1LDcgQEAKIHN0YXRpYyBzMzIgd2xfd2FrZXVwX2lzY2FuKHN0cnVjdCB3bF9pc2Nhbl9jdHJsICppc2NhbikKIHsKIAlpZiAobGlrZWx5KGlzY2FuLT5zdGF0ZSAhPSBXTF9JU0NBTl9TVEFURV9JRExFKSkgewotCQlXTF9EQkcoKCJ3YWtlIHVwIGlzY2FuXG4iKSk7CisJCVdMX0RCRygid2FrZSB1cCBpc2NhblxuIik7CiAJCXVwKCZpc2Nhbi0+c3luYyk7CiAJCXJldHVybiAwOwogCX0KQEAgLTI5NjEsMTQgKzI5NTUsMTQgQEAKIAkJCQlXTF9JU0NBTl9SRVNVTFRTX0ZJWEVEX1NJWkUsIGlzY2FuLT5zY2FuX2J1ZiwKIAkJCQlXTF9JU0NBTl9CVUZfTUFYKTsKIAlpZiAodW5saWtlbHkoZXJyKSkgewotCQlXTF9FUlIoKCJlcnJvciAoJWQpXG4iLCBlcnIpKTsKKwkJV0xfRVJSKCJlcnJvciAoJWQpXG4iLCBlcnIpOwogCQlyZXR1cm4gZXJyOwogCX0KIAlyZXN1bHRzLT5idWZsZW4gPSBkdG9oMzIocmVzdWx0cy0+YnVmbGVuKTsKIAlyZXN1bHRzLT52ZXJzaW9uID0gZHRvaDMyKHJlc3VsdHMtPnZlcnNpb24pOwogCXJlc3VsdHMtPmNvdW50ID0gZHRvaDMyKHJlc3VsdHMtPmNvdW50KTsKLQlXTF9EQkcoKCJyZXN1bHRzLT5jb3VudCA9ICVkXG4iLCByZXN1bHRzLT5jb3VudCkpOwotCVdMX0RCRygoInJlc3VsdHMtPmJ1ZmxlbiA9ICVkXG4iLCByZXN1bHRzLT5idWZsZW4pKTsKKwlXTF9EQkcoInJlc3VsdHMtPmNvdW50ID0gJWRcbiIsIHJlc3VsdHMtPmNvdW50KTsKKwlXTF9EQkcoInJlc3VsdHMtPmJ1ZmxlbiA9ICVkXG4iLCByZXN1bHRzLT5idWZsZW4pOwogCSpzdGF0dXMgPSBkdG9oMzIobGlzdF9idWYtPnN0YXR1cyk7CiAJKmJzc19saXN0ID0gcmVzdWx0czsKIApAQCAtMzA1Myw3ICszMDQ3LDcgQEAKIAkJZXJyID0gd2xfZ2V0X2lzY2FuX3Jlc3VsdHMoaXNjYW4sICZzdGF0dXMsICZ3bC0+YnNzX2xpc3QpOwogCQlpZiAodW5saWtlbHkoZXJyKSkgewogCQkJc3RhdHVzID0gV0xfU0NBTl9SRVNVTFRTX0FCT1JURUQ7Ci0JCQlXTF9FUlIoKCJBYm9ydCBpc2NhblxuIikpOworCQkJV0xfRVJSKCJBYm9ydCBpc2NhblxuIik7CiAJCX0KIAkJcnRubF91bmxvY2soKTsKIAkJZWwtPmhhbmRsZXJbc3RhdHVzXSAod2wpOwpAQCAtMzA2Miw3ICszMDU2LDcgQEAKIAkJZGVsX3RpbWVyX3N5bmMoJmlzY2FuLT50aW1lcik7CiAJCWlzY2FuLT50aW1lcl9vbiA9IDA7CiAJfQotCVdMX0RCRygoIiVzIHdhcyB0ZXJtaW5hdGVkXG4iLCBfX2Z1bmNfXykpOworCVdMX0RCRygiJXMgd2FzIHRlcm1pbmF0ZWRcbiIsIF9fZnVuY19fKTsKIAogCXJldHVybiAwOwogfQpAQCAtMzA3Myw3ICszMDY3LDcgQEAKIAogCWlmIChpc2NhbikgewogCQlpc2Nhbi0+dGltZXJfb24gPSAwOwotCQlXTF9EQkcoKCJ0aW1lciBleHBpcmVkXG4iKSk7CisJCVdMX0RCRygidGltZXIgZXhwaXJlZFxuIik7CiAJCXdsX3dha2V1cF9pc2Nhbihpc2Nhbik7CiAJfQogfQpAQCAtMzA4OCw3ICszMDgyLDcgQEAKIAkJc2VtYV9pbml0KCZpc2Nhbi0+c3luYywgMCk7CiAJCWlzY2FuLT50c2sgPSBrdGhyZWFkX3J1bih3bF9pc2Nhbl90aHJlYWQsIGlzY2FuLCAid2xfaXNjYW4iKTsKIAkJaWYgKElTX0VSUihpc2Nhbi0+dHNrKSkgewotCQkJV0xfRVJSKCgiQ291bGQgbm90IGNyZWF0ZSBpc2NhbiB0aHJlYWRcbiIpKTsKKwkJCVdMX0VSUigiQ291bGQgbm90IGNyZWF0ZSBpc2NhbiB0aHJlYWRcbiIpOwogCQkJaXNjYW4tPnRzayA9IE5VTEw7CiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJfQpAQCAtMzEyMyw3ICszMTE3LDcgQEAKIAkJc2VtYV9pbml0KCZpc2Nhbi0+c3luYywgMCk7CiAJCWlzY2FuLT50c2sgPSBrdGhyZWFkX3J1bih3bF9pc2Nhbl90aHJlYWQsIGlzY2FuLCAid2xfaXNjYW4iKTsKIAkJaWYgKElTX0VSUihpc2Nhbi0+dHNrKSkgewotCQkJV0xfRVJSKCgiQ291bGQgbm90IGNyZWF0ZSBpc2NhbiB0aHJlYWRcbiIpKTsKKwkJCVdMX0VSUigiQ291bGQgbm90IGNyZWF0ZSBpc2NhbiB0aHJlYWRcbiIpOwogCQkJaXNjYW4tPnRzayA9IE5VTEw7CiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJfQpAQCAtMzE5MiwxNyArMzE4NiwxNyBAQAogCXMzMiBlcnIgPSAwOwogCiAJaWYgKHVubGlrZWx5KCFuZGV2KSkgewotCQlXTF9FUlIoKCJuZGV2IGlzIGludmFpbGRcbiIpKTsKKwkJV0xfRVJSKCJuZGV2IGlzIGludmFsaWRcbiIpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAJd2xfY2ZnODAyMTFfZGV2ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHdsX2RldiksIEdGUF9LRVJORUwpOwogCWlmICh1bmxpa2VseSghd2xfY2ZnODAyMTFfZGV2KSkgewotCQlXTF9FUlIoKCJ3bF9jZmc4MDIxMV9kZXYgaXMgaW52YWxpZFxuIikpOworCQlXTF9FUlIoIndsX2NmZzgwMjExX2RldiBpcyBpbnZhbGlkXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQotCVdMX0RCRygoImZ1bmMgJXBcbiIsIHdsX2NmZzgwMjExX2dldF9zZGlvX2Z1bmMoKSkpOworCVdMX0RCRygiZnVuYyAlcFxuIiwgd2xfY2ZnODAyMTFfZ2V0X3NkaW9fZnVuYygpKTsKIAl3ZGV2ID0gd2xfYWxsb2Nfd2RldihzaXplb2Yoc3RydWN0IHdsX2lmYWNlKSwgJndsX2NmZzgwMjExX2dldF9zZGlvX2Z1bmMoKS0+ZGV2KTsKLQlpZiAodW5saWtlbHkoSVNfRVJSKHdkZXYpKSkKKwlpZiAoSVNfRVJSKHdkZXYpKQogCQlyZXR1cm4gLUVOT01FTTsKIAogCXdkZXYtPmlmdHlwZSA9IHdsX21vZGVfdG9fbmw4MDIxMV9pZnR5cGUoV0xfTU9ERV9CU1MpOwpAQCAtMzIxNiw3ICszMjEwLDcgQEAKIAl3ZGV2LT5uZXRkZXYgPSBuZGV2OwogCWVyciA9IHdsX2luaXRfcHJpdih3bCk7CiAJaWYgKHVubGlrZWx5KGVycikpIHsKLQkJV0xfRVJSKCgiRmFpbGVkIHRvIGluaXQgaXdtX3ByaXYgKCVkKVxuIiwgZXJyKSk7CisJCVdMX0VSUigiRmFpbGVkIHRvIGluaXQgaXdtX3ByaXYgKCVkKVxuIiwgZXJyKTsKIAkJZ290byBjZmc4MDIxMV9hdHRhY2hfb3V0OwogCX0KIAl3bF9zZXRfZHJ2ZGF0YSh3bF9jZmc4MDIxMV9kZXYsIGNpKTsKQEAgLTMyNjEsMTkgKzMyNTUsMTkgQEAKIAkJCWJyZWFrOwogCQllID0gd2xfZGVxX2V2ZW50KHdsKTsKIAkJaWYgKHVubGlrZWx5KCFlKSkgewotCQkJV0xfRVJSKCgiZXFldWUgZW1wdHkuLlxuIikpOworCQkJV0xfRVJSKCJldmVudCBxdWV1ZSBlbXB0eS4uLlxuIik7CiAJCQlCVUcoKTsKIAkJfQotCQlXTF9EQkcoKCJldmVudCB0eXBlICglZClcbiIsIGUtPmV0eXBlKSk7CisJCVdMX0RCRygiZXZlbnQgdHlwZSAoJWQpXG4iLCBlLT5ldHlwZSk7CiAJCWlmICh3bC0+ZWwuaGFuZGxlcltlLT5ldHlwZV0pIHsKIAkJCXdsLT5lbC5oYW5kbGVyW2UtPmV0eXBlXSAod2wsIHdsX3RvX25kZXYod2wpLCAmZS0+ZW1zZywKIAkJCQkJCSAgZS0+ZWRhdGEpOwogCQl9IGVsc2UgewotCQkJV0xfREJHKCgiVW5rbm93biBFdmVudCAoJWQpOiBpZ25vcmluZ1xuIiwgZS0+ZXR5cGUpKTsKKwkJCVdMX0RCRygiVW5rbm93biBFdmVudCAoJWQpOiBpZ25vcmluZ1xuIiwgZS0+ZXR5cGUpOwogCQl9CiAJCXdsX3B1dF9ldmVudChlKTsKIAl9Ci0JV0xfREJHKCgiJXMgd2FzIHRlcm1pbmF0ZWRcbiIsIF9fZnVuY19fKSk7CisJV0xfREJHKCIlcyB3YXMgdGVybWluYXRlZFxuIiwgX19mdW5jX18pOwogCXJldHVybiAwOwogfQogCkBAIC0zMjg2LDcgKzMyODAsNyBAQAogCXM4ICplc3RyID0gKGV2ZW50X3R5cGUgPD0gc2l6ZW9mKHdsX2RiZ19lc3RyKSAvIFdMX0RCR19FU1RSX01BWCAtIDEpID8KIAkgICAgd2xfZGJnX2VzdHJbZXZlbnRfdHlwZV0gOiAoczggKikgIlVua25vd24iOwogI2VuZGlmCQkJCS8qIChXTF9EQkdfTEVWRUwgPiAwKSAqLwotCVdMX0RCRygoImV2ZW50X3R5cGUgKCVkKToiICJXTENfRV8iICIlc1xuIiwgZXZlbnRfdHlwZSwgZXN0cikpOworCVdMX0RCRygiZXZlbnRfdHlwZSAoJWQpOiIgIldMQ19FXyIgIiVzXG4iLCBldmVudF90eXBlLCBlc3RyKTsKIAlpZiAobGlrZWx5KCF3bF9lbnFfZXZlbnQod2wsIGV2ZW50X3R5cGUsIGUsIGRhdGEpKSkKIAkJd2xfd2FrZXVwX2V2ZW50KHdsKTsKIH0KQEAgLTMzNDEsNyArMzMzNSw3IEBACiAKIAllID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHdsX2V2ZW50X3EpLCBHRlBfS0VSTkVMKTsKIAlpZiAodW5saWtlbHkoIWUpKSB7Ci0JCVdMX0VSUigoImV2ZW50IGFsbG9jIGZhaWxlZFxuIikpOworCQlXTF9FUlIoImV2ZW50IGFsbG9jIGZhaWxlZFxuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIApAQCAtMzM4NSw4ICszMzc5LDggQEAKIAlzd2l0Y2ggKGlmdHlwZSkgewogCWNhc2UgTkw4MDIxMV9JRlRZUEVfTU9OSVRPUjoKIAljYXNlIE5MODAyMTFfSUZUWVBFX1dEUzoKLQkJV0xfRVJSKCgidHlwZSAoJWQpIDogY3VycmVudGx5IHdlIGRvIG5vdCBzdXBwb3J0IHRoaXMgbW9kZVxuIiwKLQkJCWlmdHlwZSkpOworCQlXTF9FUlIoInR5cGUgKCVkKSA6IGN1cnJlbnRseSB3ZSBkbyBub3Qgc3VwcG9ydCB0aGlzIG1vZGVcbiIsCisJCSAgICAgICBpZnR5cGUpOwogCQllcnIgPSAtRUlOVkFMOwogCQlyZXR1cm4gZXJyOwogCWNhc2UgTkw4MDIxMV9JRlRZUEVfQURIT0M6CkBAIC0zMzk2LDIwICszMzkwLDIwIEBACiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCWVyciA9IC1FSU5WQUw7Ci0JCVdMX0VSUigoImludmFsaWQgdHlwZSAoJWQpXG4iLCBpZnR5cGUpKTsKKwkJV0xfRVJSKCJpbnZhbGlkIHR5cGUgKCVkKVxuIiwgaWZ0eXBlKTsKIAkJcmV0dXJuIGVycjsKIAl9CiAJaW5mcmEgPSBodG9kMzIoaW5mcmEpOwogCWFwID0gaHRvZDMyKGFwKTsKLQlXTF9EQkcoKCIlcyBhcCAoJWQpLCBpbmZyYSAoJWQpXG4iLCBuZGV2LT5uYW1lLCBhcCwgaW5mcmEpKTsKKwlXTF9EQkcoIiVzIGFwICglZCksIGluZnJhICglZClcbiIsIG5kZXYtPm5hbWUsIGFwLCBpbmZyYSk7CiAJZXJyID0gd2xfZGV2X2lvY3RsKG5kZXYsIFdMQ19TRVRfSU5GUkEsICZpbmZyYSwgc2l6ZW9mKGluZnJhKSk7CiAJaWYgKHVubGlrZWx5KGVycikpIHsKLQkJV0xfRVJSKCgiV0xDX1NFVF9JTkZSQSBlcnJvciAoJWQpXG4iLCBlcnIpKTsKKwkJV0xfRVJSKCJXTENfU0VUX0lORlJBIGVycm9yICglZClcbiIsIGVycik7CiAJCXJldHVybiBlcnI7CiAJfQogCWVyciA9IHdsX2Rldl9pb2N0bChuZGV2LCBXTENfU0VUX0FQLCAmYXAsIHNpemVvZihhcCkpOwogCWlmICh1bmxpa2VseShlcnIpKSB7Ci0JCVdMX0VSUigoIldMQ19TRVRfQVAgZXJyb3IgKCVkKVxuIiwgZXJyKSk7CisJCVdMX0VSUigiV0xDX1NFVF9BUCBlcnJvciAoJWQpXG4iLCBlcnIpOwogCQlyZXR1cm4gZXJyOwogCX0KIApAQCAtMzQzMSw3ICszNDI1LDcgQEAKIAogCWVyciA9IHdsX2Rldl9pb2N0bChuZGV2LCBXTENfVVAsICZ1cCwgc2l6ZW9mKHVwKSk7CiAJaWYgKHVubGlrZWx5KGVycikpIHsKLQkJV0xfRVJSKCgiV0xDX1VQIGVycm9yICglZClcbiIsIGVycikpOworCQlXTF9FUlIoIldMQ19VUCBlcnJvciAoJWQpXG4iLCBlcnIpOwogCX0KIAlyZXR1cm4gZXJyOwogfQpAQCAtMzQ0Miw3ICszNDM2LDcgQEAKIAogCWVyciA9IHdsX2Rldl9pb2N0bChuZGV2LCBXTENfU0VUX1BNLCAmcG93ZXJfbW9kZSwgc2l6ZW9mKHBvd2VyX21vZGUpKTsKIAlpZiAodW5saWtlbHkoZXJyKSkgewotCQlXTF9FUlIoKCJXTENfU0VUX1BNIGVycm9yICglZClcbiIsIGVycikpOworCQlXTF9FUlIoIldMQ19TRVRfUE0gZXJyb3IgKCVkKVxuIiwgZXJyKTsKIAl9CiAJcmV0dXJuIGVycjsKIH0KQEAgLTM0NTksMTQgKzM0NTMsMTQgQEAKIAkJICAgIHNpemVvZihpb3ZidWYpKTsKIAllcnIgPSB3bF9kZXZfaW9jdGwobmRldiwgV0xDX1NFVF9WQVIsIGlvdmJ1Ziwgc2l6ZW9mKGlvdmJ1ZikpOwogCWlmICh1bmxpa2VseShlcnIpKSB7Ci0JCVdMX0VSUigoInR4Z2xvbWFsaWduIGVycm9yICglZClcbiIsIGVycikpOworCQlXTF9FUlIoInR4Z2xvbWFsaWduIGVycm9yICglZClcbiIsIGVycik7CiAJCWdvdG8gZG9uZ2xlX2dsb21fb3V0OwogCX0KIAkvKiBkaXNhYmxlIGdsb20gb3B0aW9uIHBlciBkZWZhdWx0ICovCiAJYmNtX21raW92YXIoImJ1czp0eGdsb20iLCAoY2hhciAqKSZnbG9tLCA0LCBpb3ZidWYsIHNpemVvZihpb3ZidWYpKTsKIAllcnIgPSB3bF9kZXZfaW9jdGwobmRldiwgV0xDX1NFVF9WQVIsIGlvdmJ1Ziwgc2l6ZW9mKGlvdmJ1ZikpOwogCWlmICh1bmxpa2VseShlcnIpKSB7Ci0JCVdMX0VSUigoInR4Z2xvbSBlcnJvciAoJWQpXG4iLCBlcnIpKTsKKwkJV0xfRVJSKCJ0eGdsb20gZXJyb3IgKCVkKVxuIiwgZXJyKTsKIAkJZ290byBkb25nbGVfZ2xvbV9vdXQ7CiAJfQogZG9uZ2xlX2dsb21fb3V0OgpAQCAtMzQ4Nyw3ICszNDgxLDcgQEAKIAkJCSAgICBzaXplb2YoaW92YnVmKSk7CiAJCWVyciA9IHdsX2Rldl9pb2N0bChuZGV2LCBXTENfU0VUX1ZBUiwgaW92YnVmLCBzaXplb2YoaW92YnVmKSk7CiAJCWlmICh1bmxpa2VseShlcnIpKSB7Ci0JCQlXTF9FUlIoKCJiY25fdGltZW91dCBlcnJvciAoJWQpXG4iLCBlcnIpKTsKKwkJCVdMX0VSUigiYmNuX3RpbWVvdXQgZXJyb3IgKCVkKVxuIiwgZXJyKTsKIAkJCWdvdG8gZG9uZ2xlX3JvbV9vdXQ7CiAJCX0KIAl9CkBAIC0zNDk2LDcgKzM0OTAsNyBAQAogCWJjbV9ta2lvdmFyKCJyb2FtX29mZiIsIChjaGFyICopJnJvYW12YXIsIDQsIGlvdmJ1Ziwgc2l6ZW9mKGlvdmJ1ZikpOwogCWVyciA9IHdsX2Rldl9pb2N0bChuZGV2LCBXTENfU0VUX1ZBUiwgaW92YnVmLCBzaXplb2YoaW92YnVmKSk7CiAJaWYgKHVubGlrZWx5KGVycikpIHsKLQkJV0xfRVJSKCgicm9hbV9vZmYgZXJyb3IgKCVkKVxuIiwgZXJyKSk7CisJCVdMX0VSUigicm9hbV9vZmYgZXJyb3IgKCVkKVxuIiwgZXJyKTsKIAkJZ290byBkb25nbGVfcm9tX291dDsKIAl9CiBkb25nbGVfcm9tX291dDoKQEAgLTM1MTYsNyArMzUxMCw3IEBACiAJCSAgICBzaXplb2YoaW92YnVmKSk7CiAJZXJyID0gd2xfZGV2X2lvY3RsKG5kZXYsIFdMQ19HRVRfVkFSLCBpb3ZidWYsIHNpemVvZihpb3ZidWYpKTsKIAlpZiAodW5saWtlbHkoZXJyKSkgewotCQlXTF9FUlIoKCJHZXQgZXZlbnRfbXNncyBlcnJvciAoJWQpXG4iLCBlcnIpKTsKKwkJV0xfRVJSKCJHZXQgZXZlbnRfbXNncyBlcnJvciAoJWQpXG4iLCBlcnIpOwogCQlnb3RvIGRvbmdsZV9ldmVudG1zZ19vdXQ7CiAJfQogCW1lbWNweShldmVudG1hc2ssIGlvdmJ1ZiwgV0xfRVZFTlRJTkdfTUFTS19MRU4pOwpAQCAtMzU0NCw3ICszNTM4LDcgQEAKIAkJICAgIHNpemVvZihpb3ZidWYpKTsKIAllcnIgPSB3bF9kZXZfaW9jdGwobmRldiwgV0xDX1NFVF9WQVIsIGlvdmJ1Ziwgc2l6ZW9mKGlvdmJ1ZikpOwogCWlmICh1bmxpa2VseShlcnIpKSB7Ci0JCVdMX0VSUigoIlNldCBldmVudF9tc2dzIGVycm9yICglZClcbiIsIGVycikpOworCQlXTF9FUlIoIlNldCBldmVudF9tc2dzIGVycm9yICglZClcbiIsIGVycik7CiAJCWdvdG8gZG9uZ2xlX2V2ZW50bXNnX291dDsKIAl9CiAKQEAgLTM1NjIsOSArMzU1Niw5IEBACiAJCQlzaXplb2Yoc2Nhbl9hc3NvY190aW1lKSk7CiAJaWYgKGVycikgewogCQlpZiAoZXJyID09IC1FT1BOT1RTVVBQKSB7Ci0JCQlXTF9JTkZPKCgiU2NhbiBhc3NvYyB0aW1lIGlzIG5vdCBzdXBwb3J0ZWRcbiIpKTsKKwkJCVdMX0lORk8oIlNjYW4gYXNzb2MgdGltZSBpcyBub3Qgc3VwcG9ydGVkXG4iKTsKIAkJfSBlbHNlIHsKLQkJCVdMX0VSUigoIlNjYW4gYXNzb2MgdGltZSBlcnJvciAoJWQpXG4iLCBlcnIpKTsKKwkJCVdMX0VSUigiU2NhbiBhc3NvYyB0aW1lIGVycm9yICglZClcbiIsIGVycik7CiAJCX0KIAkJZ290byBkb25nbGVfc2NhbnRpbWVfb3V0OwogCX0KQEAgLTM1NzIsOSArMzU2Niw5IEBACiAJCQlzaXplb2Yoc2Nhbl91bmFzc29jX3RpbWUpKTsKIAlpZiAoZXJyKSB7CiAJCWlmIChlcnIgPT0gLUVPUE5PVFNVUFApIHsKLQkJCVdMX0lORk8oKCJTY2FuIHVuYXNzb2MgdGltZSBpcyBub3Qgc3VwcG9ydGVkXG4iKSk7CisJCQlXTF9JTkZPKCJTY2FuIHVuYXNzb2MgdGltZSBpcyBub3Qgc3VwcG9ydGVkXG4iKTsKIAkJfSBlbHNlIHsKLQkJCVdMX0VSUigoIlNjYW4gdW5hc3NvYyB0aW1lIGVycm9yICglZClcbiIsIGVycikpOworCQkJV0xfRVJSKCJTY2FuIHVuYXNzb2MgdGltZSBlcnJvciAoJWQpXG4iLCBlcnIpOwogCQl9CiAJCWdvdG8gZG9uZ2xlX3NjYW50aW1lX291dDsKIAl9CkBAIC0zNTk1LDkgKzM1ODksOSBAQAogCWVyciA9IHdsX2Rldl9pb2N0bChuZGV2LCBXTENfU0VUX1ZBUiwgaW92YnVmLCBzaXplb2YoaW92YnVmKSk7CiAJaWYgKGVycikgewogCQlpZiAoZXJyID09IC1FT1BOT1RTVVBQKQotCQkJV0xfSU5GTygoImFycG9lIGlzIG5vdCBzdXBwb3J0ZWRcbiIpKTsKKwkJCVdMX0lORk8oImFycG9lIGlzIG5vdCBzdXBwb3J0ZWRcbiIpOwogCQllbHNlCi0JCQlXTF9FUlIoKCJhcnBvZSBlcnJvciAoJWQpXG4iLCBlcnIpKTsKKwkJCVdMX0VSUigiYXJwb2UgZXJyb3IgKCVkKVxuIiwgZXJyKTsKIAogCQlnb3RvIGRvbmdsZV9vZmZsb2FkX291dDsKIAl9CkBAIC0zNjA1LDkgKzM1OTksOSBAQAogCWVyciA9IHdsX2Rldl9pb2N0bChuZGV2LCBXTENfU0VUX1ZBUiwgaW92YnVmLCBzaXplb2YoaW92YnVmKSk7CiAJaWYgKGVycikgewogCQlpZiAoZXJyID09IC1FT1BOT1RTVVBQKQotCQkJV0xfSU5GTygoImFycF9vbCBpcyBub3Qgc3VwcG9ydGVkXG4iKSk7CisJCQlXTF9JTkZPKCJhcnBfb2wgaXMgbm90IHN1cHBvcnRlZFxuIik7CiAJCWVsc2UKLQkJCVdMX0VSUigoImFycF9vbCBlcnJvciAoJWQpXG4iLCBlcnIpKTsKKwkJCVdMX0VSUigiYXJwX29sIGVycm9yICglZClcbiIsIGVycik7CiAKIAkJZ290byBkb25nbGVfb2ZmbG9hZF9vdXQ7CiAJfQpAQCAtMzYyMCwxMiArMzYxNCwxMiBAQAogewogCWludCBpOwogCWlmIChzdHJuY21wKHNyYywgIjB4IiwgMikgIT0gMCAmJiBzdHJuY21wKHNyYywgIjBYIiwgMikgIT0gMCkgewotCQlXTF9FUlIoKCJNYXNrIGludmFsaWQgZm9ybWF0LiBOZWVkcyB0byBzdGFydCB3aXRoIDB4XG4iKSk7CisJCVdMX0VSUigiTWFzayBpbnZhbGlkIGZvcm1hdC4gTmVlZHMgdG8gc3RhcnQgd2l0aCAweFxuIik7CiAJCXJldHVybiAtMTsKIAl9CiAJc3JjID0gc3JjICsgMjsJCS8qIFNraXAgcGFzdCAweCAqLwogCWlmIChzdHJsZW4oc3JjKSAlIDIgIT0gMCkgewotCQlXTF9FUlIoKCJNYXNrIGludmFsaWQgZm9ybWF0LiBOZWVkcyB0byBiZSBvZiBldmVuIGxlbmd0aFxuIikpOworCQlXTF9FUlIoIk1hc2sgaW52YWxpZCBmb3JtYXQuIE5lZWRzIHRvIGJlIG9mIGV2ZW4gbGVuZ3RoXG4iKTsKIAkJcmV0dXJuIC0xOwogCX0KIAlmb3IgKGkgPSAwOyAqc3JjICE9ICdcMCc7IGkrKykgewpAQCAtMzY4NCw3ICszNjc4LDcgQEAKIAkJCQkJICAgICAgbWFza19hbmRfcGF0dGVyblttYXNrX3NpemVdKSk7CiAKIAlpZiAobWFza19zaXplICE9IHBhdHRlcm5fc2l6ZSkgewotCQlXTF9FUlIoKCJNYXNrIGFuZCBwYXR0ZXJuIG5vdCB0aGUgc2FtZSBzaXplXG4iKSk7CisJCVdMX0VSUigiTWFzayBhbmQgcGF0dGVybiBub3QgdGhlIHNhbWUgc2l6ZVxuIik7CiAJCWVyciA9IC1FSU5WQUw7CiAJCWdvdG8gZG9uZ2xlX2ZpbHRlcl9vdXQ7CiAJfQpAQCAtMzcwNCw5ICszNjk4LDkgQEAKIAllcnIgPSB3bF9kZXZfaW9jdGwobmRldiwgV0xDX1NFVF9WQVIsIGJ1ZiwgYnVmX2xlbik7CiAJaWYgKGVycikgewogCQlpZiAoZXJyID09IC1FT1BOT1RTVVBQKSB7Ci0JCQlXTF9JTkZPKCgiZmlsdGVyIG5vdCBzdXBwb3J0ZWRcbiIpKTsKKwkJCVdMX0lORk8oImZpbHRlciBub3Qgc3VwcG9ydGVkXG4iKTsKIAkJfSBlbHNlIHsKLQkJCVdMX0VSUigoImZpbHRlciAoJWQpXG4iLCBlcnIpKTsKKwkJCVdMX0VSUigiZmlsdGVyICglZClcbiIsIGVycik7CiAJCX0KIAkJZ290byBkb25nbGVfZmlsdGVyX291dDsKIAl9CkBAIC0zNzE3LDkgKzM3MTEsOSBAQAogCWVyciA9IHdsX2Rldl9pb2N0bChuZGV2LCBXTENfU0VUX1ZBUiwgaW92YnVmLCBzaXplb2YoaW92YnVmKSk7CiAJaWYgKGVycikgewogCQlpZiAoZXJyID09IC1FT1BOT1RTVVBQKSB7Ci0JCQlXTF9JTkZPKCgiZmlsdGVyX21vZGUgbm90IHN1cHBvcnRlZFxuIikpOworCQkJV0xfSU5GTygiZmlsdGVyX21vZGUgbm90IHN1cHBvcnRlZFxuIik7CiAJCX0gZWxzZSB7Ci0JCQlXTF9FUlIoKCJmaWx0ZXJfbW9kZSAoJWQpXG4iLCBlcnIpKTsKKwkJCVdMX0VSUigiZmlsdGVyX21vZGUgKCVkKVxuIiwgZXJyKTsKIAkJfQogCQlnb3RvIGRvbmdsZV9maWx0ZXJfb3V0OwogCX0KQEAgLTM4MDAsMTIgKzM3OTQsMTIgQEAKIAllcnIgPSB3bF9kZXZfaW9jdGwod2xfdG9fbmRldih3bCksIFdMQ19HRVRfUEhZTElTVCwgJnBoeV9saXN0LAogCQkJc2l6ZW9mKHBoeV9saXN0KSk7CiAJaWYgKHVubGlrZWx5KGVycikpIHsKLQkJV0xfRVJSKCgiZXJyb3IgKCVkKVxuIiwgZXJyKSk7CisJCVdMX0VSUigiZXJyb3IgKCVkKVxuIiwgZXJyKTsKIAkJcmV0dXJuIGVycjsKIAl9CiAKIAlwaHkgPSAoKGNoYXIgKikmcGh5X2xpc3QpWzFdOwotCVdMX0RCRygoIiVjIHBoeVxuIiwgcGh5KSk7CisJV0xfREJHKCIlYyBwaHlcbiIsIHBoeSk7CiAJaWYgKHBoeSA9PSAnbicgfHwgcGh5ID09ICdhJykgewogCQl3aXBoeSA9IHdsX3RvX3dpcGh5KHdsKTsKIAkJd2lwaHktPmJhbmRzW0lFRUU4MDIxMV9CQU5EXzVHSFpdID0gJl9fd2xfYmFuZF81Z2h6X247CkBAIC0zOTExLDcgKzM5MDUsNyBAQAogCWNhc2UgV0xfUFJPRl9TU0lEOgogCQlyZXR1cm4gJndsLT5wcm9maWxlLT5zc2lkOwogCX0KLQlXTF9FUlIoKCJpbnZhbGlkIGl0ZW0gKCVkKVxuIiwgaXRlbSkpOworCVdMX0VSUigiaW52YWxpZCBpdGVtICglZClcbiIsIGl0ZW0pOwogCXJldHVybiBOVUxMOwogfQogCkBAIC0zOTMyLDkgKzM5MjYsOSBAQAogCQlicmVhazsKIAljYXNlIFdMX1BST0ZfQlNTSUQ6CiAJCWlmIChkYXRhKQotCQkJbWVtY3B5KHdsLT5wcm9maWxlLT5ic3NpZCwgZGF0YSwgRVRIRVJfQUREUl9MRU4pOworCQkJbWVtY3B5KHdsLT5wcm9maWxlLT5ic3NpZCwgZGF0YSwgRVRIX0FMRU4pOwogCQllbHNlCi0JCQltZW1zZXQod2wtPnByb2ZpbGUtPmJzc2lkLCAwLCBFVEhFUl9BRERSX0xFTik7CisJCQltZW1zZXQod2wtPnByb2ZpbGUtPmJzc2lkLCAwLCBFVEhfQUxFTik7CiAJCWJyZWFrOwogCWNhc2UgV0xfUFJPRl9TRUM6CiAJCW1lbWNweSgmd2wtPnByb2ZpbGUtPnNlYywgZGF0YSwgc2l6ZW9mKHdsLT5wcm9maWxlLT5zZWMpKTsKQEAgLTM5NDksNyArMzk0Myw3IEBACiAJCXdsLT5wcm9maWxlLT5kdGltX3BlcmlvZCA9ICoodTggKilkYXRhOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlXTF9FUlIoKCJ1bnN1cHBvcnRlZCBpdGVtICglZClcbiIsIGl0ZW0pKTsKKwkJV0xfRVJSKCJ1bnN1cHBvcnRlZCBpdGVtICglZClcbiIsIGl0ZW0pOwogCQllcnIgPSAtRU9QTk9UU1VQUDsKIAkJYnJlYWs7CiAJfQpAQCAtMzk5MSw3ICszOTg1LDcgQEAKIAlzMzIgZXJyID0gMDsKIAogCWlmICh1bmxpa2VseShpZS0+b2Zmc2V0ICsgbCArIDIgPiBXTF9UTFZfSU5GT19NQVgpKSB7Ci0JCVdMX0VSUigoImVpIGNyb3NzZXMgYnVmZmVyIGJvdW5kYXJ5XG4iKSk7CisJCVdMX0VSUigiZWkgY3Jvc3NlcyBidWZmZXIgYm91bmRhcnlcbiIpOwogCQlyZXR1cm4gLUVOT1NQQzsKIAl9CiAJaWUtPmJ1ZltpZS0+b2Zmc2V0XSA9IHQ7CkBAIC00MDA4LDcgKzQwMDIsNyBAQAogCXMzMiBlcnIgPSAwOwogCiAJaWYgKHVubGlrZWx5KGllLT5vZmZzZXQgKyBpZV9zaXplID4gV0xfVExWX0lORk9fTUFYKSkgewotCQlXTF9FUlIoKCJlaV9zdHJlYW0gY3Jvc3NlcyBidWZmZXIgYm91bmRhcnlcbiIpKTsKKwkJV0xfRVJSKCJlaV9zdHJlYW0gY3Jvc3NlcyBidWZmZXIgYm91bmRhcnlcbiIpOwogCQlyZXR1cm4gLUVOT1NQQzsKIAl9CiAJbWVtY3B5KCZpZS0+YnVmW2llLT5vZmZzZXRdLCBpZV9zdHJlYW0sIGllX3NpemUpOwpAQCAtNDAyMyw3ICs0MDE3LDcgQEAKIAlzMzIgZXJyID0gMDsKIAogCWlmICh1bmxpa2VseShpZS0+b2Zmc2V0ID4gZHN0X3NpemUpKSB7Ci0JCVdMX0VSUigoImRzdF9zaXplIGlzIG5vdCBlbm91Z2hcbiIpKTsKKwkJV0xfRVJSKCJkc3Rfc2l6ZSBpcyBub3QgZW5vdWdoXG4iKTsKIAkJcmV0dXJuIC1FTk9TUEM7CiAJfQogCW1lbWNweShkc3QsICZpZS0+YnVmWzBdLCBpZS0+b2Zmc2V0KTsKQEAgLTQxMjMsMzcgKzQxMTcsMzcgQEAKIAljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3X2VudHJ5ID0gTlVMTDsKIAlzMzIgZXJyID0gMDsKIAotCVdMX0RCRygoImZpbGUgbmFtZSA6IFwiJXNcIlxuIiwgZmlsZV9uYW1lKSk7CisJV0xfREJHKCJmaWxlIG5hbWUgOiBcIiVzXCJcbiIsIGZpbGVfbmFtZSk7CiAJd2wgPSBXTF9QUklWX0dFVCgpOwogCiAJaWYgKCF0ZXN0X2JpdChXTF9GV19MT0FESU5HX0RPTkUsICZ3bC0+ZnctPnN0YXR1cykpIHsKIAkJZXJyID0gcmVxdWVzdF9maXJtd2FyZSgmd2wtPmZ3LT5md19lbnRyeSwgZmlsZV9uYW1lLAogCQkJCSZ3bF9jZmc4MDIxMV9nZXRfc2Rpb19mdW5jKCktPmRldik7CiAJCWlmICh1bmxpa2VseShlcnIpKSB7Ci0JCQlXTF9FUlIoKCJDb3VsZCBub3QgZG93bmxvYWQgZncgKCVkKVxuIiwgZXJyKSk7CisJCQlXTF9FUlIoIkNvdWxkIG5vdCBkb3dubG9hZCBmdyAoJWQpXG4iLCBlcnIpOwogCQkJZ290byByZXFfZndfb3V0OwogCQl9CiAJCXNldF9iaXQoV0xfRldfTE9BRElOR19ET05FLCAmd2wtPmZ3LT5zdGF0dXMpOwogCQlmd19lbnRyeSA9IHdsLT5mdy0+ZndfZW50cnk7CiAJCWlmIChmd19lbnRyeSkgewotCQkJV0xfREJHKCgiZncgc2l6ZSAoJXpkKSwgZGF0YSAoJXApXG4iLCBmd19lbnRyeS0+c2l6ZSwKLQkJCQlmd19lbnRyeS0+ZGF0YSkpOworCQkJV0xfREJHKCJmdyBzaXplICglemQpLCBkYXRhICglcClcbiIsCisJCQkgICAgICAgZndfZW50cnktPnNpemUsIGZ3X2VudHJ5LT5kYXRhKTsKIAkJfQogCX0gZWxzZSBpZiAoIXRlc3RfYml0KFdMX05WUkFNX0xPQURJTkdfRE9ORSwgJndsLT5mdy0+c3RhdHVzKSkgewogCQllcnIgPSByZXF1ZXN0X2Zpcm13YXJlKCZ3bC0+ZnctPmZ3X2VudHJ5LCBmaWxlX25hbWUsCiAJCQkJJndsX2NmZzgwMjExX2dldF9zZGlvX2Z1bmMoKS0+ZGV2KTsKIAkJaWYgKHVubGlrZWx5KGVycikpIHsKLQkJCVdMX0VSUigoIkNvdWxkIG5vdCBkb3dubG9hZCBudnJhbSAoJWQpXG4iLCBlcnIpKTsKKwkJCVdMX0VSUigiQ291bGQgbm90IGRvd25sb2FkIG52cmFtICglZClcbiIsIGVycik7CiAJCQlnb3RvIHJlcV9md19vdXQ7CiAJCX0KIAkJc2V0X2JpdChXTF9OVlJBTV9MT0FESU5HX0RPTkUsICZ3bC0+ZnctPnN0YXR1cyk7CiAJCWZ3X2VudHJ5ID0gd2wtPmZ3LT5md19lbnRyeTsKIAkJaWYgKGZ3X2VudHJ5KSB7Ci0JCQlXTF9EQkcoKCJudnJhbSBzaXplICglemQpLCBkYXRhICglcClcbiIsIGZ3X2VudHJ5LT5zaXplLAotCQkJCWZ3X2VudHJ5LT5kYXRhKSk7CisJCQlXTF9EQkcoIm52cmFtIHNpemUgKCV6ZCksIGRhdGEgKCVwKVxuIiwKKwkJCSAgICAgICBmd19lbnRyeS0+c2l6ZSwgZndfZW50cnktPmRhdGEpOwogCQl9CiAJfSBlbHNlIHsKLQkJV0xfREJHKCgiRG93bmxvYWRpbmcgYWxyZWFkeSBkb25lLiBOb3RoaW5nIHRvIGRvIG1vcmVcbiIpKTsKKwkJV0xfREJHKCJEb3dubG9hZGluZyBhbHJlYWR5IGRvbmUuIE5vdGhpbmcgdG8gZG8gbW9yZVxuIik7CiAJCWVyciA9IC1FUEVSTTsKIAl9CiAKQEAgLTQxODksMTAgKzQxODMsMTAgQEAKIAogCWVyciA9IHdsX2Rldl9pbnR2YXJfc2V0KG5kZXYsICJtcGMiLCBtcGMpOwogCWlmICh1bmxpa2VseShlcnIpKSB7Ci0JCVdMX0VSUigoImZhaWwgdG8gc2V0IG1wY1xuIikpOworCQlXTF9FUlIoImZhaWwgdG8gc2V0IG1wY1xuIik7CiAJCXJldHVybjsKIAl9Ci0JV0xfREJHKCgiTVBDIDogJWRcbiIsIG1wYykpOworCVdMX0RCRygiTVBDIDogJWRcbiIsIG1wYyk7CiB9CiAKIHN0YXRpYyBpbnQgd2xfZGVidWdmc19hZGRfbmV0ZGV2X3BhcmFtcyhzdHJ1Y3Qgd2xfcHJpdiAqd2wpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2JyY21mbWFjL3dsX2NmZzgwMjExLmggYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2JyY21mbWFjL3dsX2NmZzgwMjExLmgKaW5kZXggNzcwZTYzZi4uNDgyNjkxYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtZm1hYy93bF9jZmc4MDIxMS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbWZtYWMvd2xfY2ZnODAyMTEuaApAQCAtNTQsMzQgKzU0LDM2IEBACiAKICNkZWZpbmUgV0xfREJHX0xFVkVMIDEJCS8qIDAgaW52YWxpZGF0ZXMgYWxsIGRlYnVnIG1lc3NhZ2VzLgogCQkJCSBkZWZhdWx0IGlzIDEgKi8KLSNkZWZpbmUJV0xfRVJSKGFyZ3MpCQkJCQkJCQkJXAotZG8gewkJCQkJCQkJCQlcCi0JaWYgKHdsX2RiZ19sZXZlbCAmIFdMX0RCR19FUlIpIHsJCQkJXAotCQlpZiAobmV0X3JhdGVsaW1pdCgpKSB7CQkJCQkJXAotCQkJcHJpbnRrKEtFUk5fRVJSICJFUlJPUiBAJXMgOiAiLCBfX2Z1bmNfXyk7CVwKLQkJCXByaW50ayBhcmdzOwkJCQkJCVwKLQkJfSAJCQkJCQkJCVwKLQl9CQkJCQkJCQkJXAorI2RlZmluZQlXTF9FUlIoZm10LCBhcmdzLi4uKQkJCQkJXAorZG8gewkJCQkJCQkJXAorCWlmICh3bF9kYmdfbGV2ZWwgJiBXTF9EQkdfRVJSKSB7CQkJXAorCQlpZiAobmV0X3JhdGVsaW1pdCgpKSB7CQkJCVwKKwkJCXByaW50ayhLRVJOX0VSUiAiRVJST1IgQCVzIDogIiBmbXQsCVwKKwkJCSAgICAgICBfX2Z1bmNfXywgIyNhcmdzKTsJCVwKKwkJfQkJCQkJCVwKKwl9CQkJCQkJCVwKIH0gd2hpbGUgKDApCi0jZGVmaW5lCVdMX0lORk8oYXJncykJCQkJCQkJCQlcCi1kbyB7CQkJCQkJCQkJCVwKLQlpZiAod2xfZGJnX2xldmVsICYgV0xfREJHX0lORk8pIHsJCQkJXAotCQlpZiAobmV0X3JhdGVsaW1pdCgpKSB7CQkJCQkJXAotCQkJcHJpbnRrKEtFUk5fRVJSICJJTkZPIEAlcyA6ICIsIF9fZnVuY19fKTsJXAotCQkJcHJpbnRrIGFyZ3M7CQkJCQkJXAotCQl9CQkJCQkJCQlcCi0JfQkJCQkJCQkJCVwKKworI2RlZmluZQlXTF9JTkZPKGZtdCwgYXJncy4uLikJCQkJCVwKK2RvIHsJCQkJCQkJCVwKKwlpZiAod2xfZGJnX2xldmVsICYgV0xfREJHX0lORk8pIHsJCQlcCisJCWlmIChuZXRfcmF0ZWxpbWl0KCkpIHsJCQkJXAorCQkJcHJpbnRrKEtFUk5fRVJSICJJTkZPIEAlcyA6ICIgZm10LAlcCisJCQkgICAgICAgX19mdW5jX18sICMjYXJncyk7CQlcCisJCX0JCQkJCQlcCisJfQkJCQkJCQlcCiB9IHdoaWxlICgwKQorCiAjaWYgKFdMX0RCR19MRVZFTCA+IDApCi0jZGVmaW5lCVdMX0RCRyhhcmdzKQkJCQkJCQkJXAotZG8gewkJCQkJCQkJCVwKKyNkZWZpbmUJV0xfREJHKGZtdCwgYXJncy4uLikJCQkJCVwKK2RvIHsJCQkJCQkJCVwKIAlpZiAod2xfZGJnX2xldmVsICYgV0xfREJHX0RCRykgewkJCVwKLQkJcHJpbnRrKEtFUk5fRVJSICJERUJVRyBAJXMgOiIsIF9fZnVuY19fKTsJXAotCQlwcmludGsgYXJnczsJCQkJCQkJXAotCX0JCQkJCQkJCQlcCisJCXByaW50ayhLRVJOX0VSUiAiREVCVUcgQCVzIDoiIGZtdCwJCVwKKwkJICAgICAgIF9fZnVuY19fLCAjI2FyZ3MpOwkJCVwKKwl9CQkJCQkJCVwKIH0gd2hpbGUgKDApCiAjZWxzZQkJCQkvKiAhKFdMX0RCR19MRVZFTCA+IDApICovCi0jZGVmaW5lCVdMX0RCRyhhcmdzKQorI2RlZmluZQlXTF9EQkcoZm10LCBhcmdzLi4uKSBub3ByaW50ayhmbXQsICMjYXJncykKICNlbmRpZgkJCQkvKiAoV0xfREJHX0xFVkVMID4gMCkgKi8KIAogI2RlZmluZSBXTF9TQ0FOX1JFVFJZX01BWAkzCS8qIHVzZWQgZm9yIGlic3Mgc2NhbiAqLwpAQCAtMjM3LDcgKzIzOSw3IEBACiBzdHJ1Y3Qgd2xfcHJvZmlsZSB7CiAJdTMyIG1vZGU7CiAJc3RydWN0IHdsY19zc2lkIHNzaWQ7Ci0JdTggYnNzaWRbRVRIRVJfQUREUl9MRU5dOworCXU4IGJzc2lkW0VUSF9BTEVOXTsKIAl1MTYgYmVhY29uX2ludGVydmFsOwogCXU4IGR0aW1fcGVyaW9kOwogCXN0cnVjdCB3bF9zZWN1cml0eSBzZWM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2JyY21mbWFjL3dsX2l3LmMgYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2JyY21mbWFjL3dsX2l3LmMKaW5kZXggOTc5YTQ5NC4uZGI2ZTY4ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtZm1hYy93bF9pdy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbWZtYWMvd2xfaXcuYwpAQCAtMTUsOCArMTUsOSBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CisjaW5jbHVkZSA8bGludXgvc2VtYXBob3JlLmg+CiAjaW5jbHVkZSA8YmNtZGVmcy5oPgotI2luY2x1ZGUgPGxpbnV4dmVyLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CiAjaW5jbHVkZSA8b3NsLmg+CiAjaW5jbHVkZSA8d2xpb2N0bC5oPgogCkBAIC0zMSwyMCArMzIsMTggQEAKICNpbmNsdWRlIDxkaGQuaD4KICNpbmNsdWRlIDxkaGRpb2N0bC5oPgogCi10eXBlZGVmIHZvaWQgd2xjX2luZm9fdDsKLXR5cGVkZWYgdm9pZCB3bF9pbmZvX3Q7CiB0eXBlZGVmIGNvbnN0IHN0cnVjdCBzaV9wdWIgc2lfdDsKICNpbmNsdWRlIDx3bGlvY3RsLmg+CiAKICNpbmNsdWRlIDxwcm90by9ldGhlcm5ldC5oPgogI2luY2x1ZGUgPGRuZ2xfc3RhdHMuaD4KICNpbmNsdWRlIDxkaGQuaD4KLSNkZWZpbmUgV0xfRVJST1IoeCkgcHJpbnRmIHgKLSNkZWZpbmUgV0xfVFJBQ0UoeCkKLSNkZWZpbmUgV0xfQVNTT0MoeCkKLSNkZWZpbmUgV0xfSU5GT1JNKHgpCi0jZGVmaW5lIFdMX1dTRUMoeCkKLSNkZWZpbmUgV0xfU0NBTih4KQorCisjZGVmaW5lIFdMX0VSUk9SKGZtdCwgYXJncy4uLikJcHJpbnRrKGZtdCwgIyNhcmdzKQorI2RlZmluZSBXTF9UUkFDRShmbXQsIGFyZ3MuLi4pCW5vX3ByaW50ayhmbXQsICMjYXJncykKKyNkZWZpbmUgV0xfSU5GT1JNKGZtdCwgYXJncy4uLikJbm9fcHJpbnRrKGZtdCwgIyNhcmdzKQorI2RlZmluZSBXTF9XU0VDKGZtdCwgYXJncy4uLikJbm9fcHJpbnRrKGZtdCwgIyNhcmdzKQorI2RlZmluZSBXTF9TQ0FOKGZtdCwgYXJncy4uLikJbm9fcHJpbnRrKGZtdCwgIyNhcmdzKQogCiAjaW5jbHVkZSA8d2xfaXcuaD4KIApAQCAtMTg3LDEyICsxODYsMTIgQEAKIAlpbnQgcmV0ID0gLUVJTlZBTDsKIAogCWlmICghZGV2KSB7Ci0JCVdMX0VSUk9SKCgiJXM6IGRldiBpcyBudWxsXG4iLCBfX2Z1bmNfXykpOworCQlXTF9FUlJPUigiJXM6IGRldiBpcyBudWxsXG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybiByZXQ7CiAJfQogCi0JV0xfSU5GT1JNKCgiXG4lcywgUElEOiV4OiBzZW5kIExvY2FsIElPQ1RMIC0+IGRoZDogY21kOjB4JXgsIGJ1ZjolcCwgIgotCQkibGVuOiVkICxcbiIsIF9fZnVuY19fLCBjdXJyZW50LT5waWQsIGNtZCwgYXJnLCBsZW4pKTsKKwlXTF9JTkZPUk0oIlxuJXMsIFBJRDoleDogc2VuZCBMb2NhbCBJT0NUTCAtPiBkaGQ6IGNtZDoweCV4LCBidWY6JXAsIGxlbjolZFxuIiwKKwkJICBfX2Z1bmNfXywgY3VycmVudC0+cGlkLCBjbWQsIGFyZywgbGVuKTsKIAogCWlmIChnX29ub2ZmID09IEdfV0xBTl9TRVRfT04pIHsKIAkJbWVtc2V0KCZpb2MsIDAsIHNpemVvZihpb2MpKTsKQEAgLTIwNSw3ICsyMDQsNyBAQAogCiAJCXJldCA9IGRldl9vcGVuKGRldik7CiAJCWlmIChyZXQpIHsKLQkJCVdMX0VSUk9SKCgiJXM6IEVycm9yIGRldl9vcGVuOiAlZFxuIiwgX19mdW5jX18sIHJldCkpOworCQkJV0xfRVJST1IoIiVzOiBFcnJvciBkZXZfb3BlbjogJWRcbiIsIF9fZnVuY19fLCByZXQpOwogCQkJcmV0dXJuIHJldDsKIAkJfQogCkBAIC0yMTQsNyArMjEzLDcgQEAKIAkJcmV0ID0gZGV2LT5uZXRkZXZfb3BzLT5uZG9fZG9faW9jdGwoZGV2LCAmaWZyLCBTSU9DREVWUFJJVkFURSk7CiAJCXNldF9mcyhmcyk7CiAJfSBlbHNlIHsKLQkJV0xfVFJBQ0UoKCIlczogY2FsbCBhZnRlciBkcml2ZXIgc3RvcCA6IGlnbm9yZWRcbiIsIF9fZnVuY19fKSk7CisJCVdMX1RSQUNFKCIlczogY2FsbCBhZnRlciBkcml2ZXIgc3RvcCA6IGlnbm9yZWRcbiIsIF9fZnVuY19fKTsKIAl9CiAJcmV0dXJuIHJldDsKIH0KQEAgLTMzNSw3ICszMzQsNyBAQAogCWludCBlcnJvcjsKIAlzdHJ1Y3Qgc29ja2FkZHIgYnNzaWQ7CiAKLQlXTF9UUkFDRSgoIiVzOiBTSU9DU0lXQ09NTUlUXG4iLCBkZXYtPm5hbWUpKTsKKwlXTF9UUkFDRSgiJXM6IFNJT0NTSVdDT01NSVRcbiIsIGRldi0+bmFtZSk7CiAKIAllcnJvciA9IGRldl93bGNfaW9jdGwoZGV2LCBXTENfR0VUX1NTSUQsICZzc2lkLCBzaXplb2Yoc3NpZCkpOwogCWlmIChlcnJvcikKQEAgLTM0NiwxMSArMzQ1LDExIEBACiAJaWYgKCFzc2lkLlNTSURfbGVuKQogCQlyZXR1cm4gMDsKIAotCWJ6ZXJvKCZic3NpZCwgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcikpOwotCWVycm9yID0gZGV2X3dsY19pb2N0bChkZXYsIFdMQ19SRUFTU09DLCAmYnNzaWQsIEVUSEVSX0FERFJfTEVOKTsKKwltZW1zZXQoJmJzc2lkLCAwLCBzaXplb2Yoc3RydWN0IHNvY2thZGRyKSk7CisJZXJyb3IgPSBkZXZfd2xjX2lvY3RsKGRldiwgV0xDX1JFQVNTT0MsICZic3NpZCwgRVRIX0FMRU4pOwogCWlmIChlcnJvcikgewotCQlXTF9FUlJPUigoIiVzOiBXTENfUkVBU1NPQyB0byAlcyBmYWlsZWQgXG4iLCBfX2Z1bmNfXywKLQkJCSAgc3NpZC5TU0lEKSk7CisJCVdMX0VSUk9SKCIlczogV0xDX1JFQVNTT0MgdG8gJXMgZmFpbGVkXG4iLAorCQkJIF9fZnVuY19fLCBzc2lkLlNTSUQpOwogCQlyZXR1cm4gZXJyb3I7CiAJfQogCkBAIC0zNjEsNyArMzYwLDcgQEAKIHdsX2l3X2dldF9uYW1lKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCiAJICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sIGNoYXIgKmN3cnEsIGNoYXIgKmV4dHJhKQogewotCVdMX1RSQUNFKCgiJXM6IFNJT0NHSVdOQU1FXG4iLCBkZXYtPm5hbWUpKTsKKwlXTF9UUkFDRSgiJXM6IFNJT0NHSVdOQU1FXG4iLCBkZXYtPm5hbWUpOwogCiAJc3RyY3B5KGN3cnEsICJJRUVFIDgwMi4xMS1EUyIpOwogCkBAIC0zNzUsNyArMzc0LDcgQEAKIAlpbnQgZXJyb3IsIGNoYW47CiAJdWludCBzZiA9IDA7CiAKLQlXTF9UUkFDRSgoIlxuICVzICVzOiBTSU9DU0lXRlJFUVxuIiwgX19mdW5jX18sIGRldi0+bmFtZSkpOworCVdMX1RSQUNFKCJcbiAlcyAlczogU0lPQ1NJV0ZSRVFcbiIsIF9fZnVuY19fLCBkZXYtPm5hbWUpOwogCiAJaWYgKGZ3cnEtPmUgPT0gMCAmJiBmd3JxLT5tIDwgTUFYQ0hBTk5FTCkgewogCQljaGFuID0gZndycS0+bTsKQEAgLTQxMCw3ICs0MDksNyBAQAogCWNoYW5uZWxfaW5mb190IGNpOwogCWludCBlcnJvcjsKIAotCVdMX1RSQUNFKCgiJXM6IFNJT0NHSVdGUkVRXG4iLCBkZXYtPm5hbWUpKTsKKwlXTF9UUkFDRSgiJXM6IFNJT0NHSVdGUkVRXG4iLCBkZXYtPm5hbWUpOwogCiAJZXJyb3IgPSBkZXZfd2xjX2lvY3RsKGRldiwgV0xDX0dFVF9DSEFOTkVMLCAmY2ksIHNpemVvZihjaSkpOwogCWlmIChlcnJvcikKQEAgLTQyNyw3ICs0MjYsNyBAQAogewogCWludCBpbmZyYSA9IDAsIGFwID0gMCwgZXJyb3IgPSAwOwogCi0JV0xfVFJBQ0UoKCIlczogU0lPQ1NJV01PREVcbiIsIGRldi0+bmFtZSkpOworCVdMX1RSQUNFKCIlczogU0lPQ1NJV01PREVcbiIsIGRldi0+bmFtZSk7CiAKIAlzd2l0Y2ggKCp1d3JxKSB7CiAJY2FzZSBJV19NT0RFX01BU1RFUjoKQEAgLTQ2Miw3ICs0NjEsNyBAQAogewogCWludCBlcnJvciwgaW5mcmEgPSAwLCBhcCA9IDA7CiAKLQlXTF9UUkFDRSgoIiVzOiBTSU9DR0lXTU9ERVxuIiwgZGV2LT5uYW1lKSk7CisJV0xfVFJBQ0UoIiVzOiBTSU9DR0lXTU9ERVxuIiwgZGV2LT5uYW1lKTsKIAogCWVycm9yID0gZGV2X3dsY19pb2N0bChkZXYsIFdMQ19HRVRfSU5GUkEsICZpbmZyYSwgc2l6ZW9mKGluZnJhKSk7CiAJaWYgKGVycm9yKQpAQCAtNTAxLDE0ICs1MDAsMTQgQEAKIAl7MzAsIDYwLCA5MCwgMTIwLCAxODAsIDI0MCwgMjcwLCAzMDB9CiAJfTsKIAotCVdMX1RSQUNFKCgiJXM6IFNJT0NHSVdSQU5HRVxuIiwgZGV2LT5uYW1lKSk7CisJV0xfVFJBQ0UoIiVzOiBTSU9DR0lXUkFOR0VcbiIsIGRldi0+bmFtZSk7CiAKIAlpZiAoIWV4dHJhKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWNoYW5uZWxzID0ga21hbGxvYygoTUFYQ0hBTk5FTCArIDEpICogNCwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFjaGFubmVscykgewotCQlXTF9FUlJPUigoIkNvdWxkIG5vdCBhbGxvYyBjaGFubmVsc1xuIikpOworCQlXTF9FUlJPUigiQ291bGQgbm90IGFsbG9jIGNoYW5uZWxzXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCWxpc3QgPSAod2xfdTMyX2xpc3RfdCAqKSBjaGFubmVsczsKQEAgLTY4NCwxNCArNjgzLDE0IEBACiAJc3RydWN0IHNvY2thZGRyICphZGRyID0gKHN0cnVjdCBzb2NrYWRkciAqKWV4dHJhOwogCWludCBpOwogCi0JV0xfVFJBQ0UoKCIlczogU0lPQ1NJV1NQWVxuIiwgZGV2LT5uYW1lKSk7CisJV0xfVFJBQ0UoIiVzOiBTSU9DU0lXU1BZXG4iLCBkZXYtPm5hbWUpOwogCiAJaWYgKCFleHRyYSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlpdy0+c3B5X251bSA9IG1pbl90KGludCwgQVJSQVlfU0laRShpdy0+c3B5X2FkZHIpLCBkd3JxLT5sZW5ndGgpOwogCWZvciAoaSA9IDA7IGkgPCBpdy0+c3B5X251bTsgaSsrKQotCQltZW1jcHkoJml3LT5zcHlfYWRkcltpXSwgYWRkcltpXS5zYV9kYXRhLCBFVEhFUl9BRERSX0xFTik7CisJCW1lbWNweSgmaXctPnNweV9hZGRyW2ldLCBhZGRyW2ldLnNhX2RhdGEsIEVUSF9BTEVOKTsKIAltZW1zZXQoaXctPnNweV9xdWFsLCAwLCBzaXplb2YoaXctPnNweV9xdWFsKSk7CiAKIAlyZXR1cm4gMDsKQEAgLTcwNiwxNCArNzA1LDE0IEBACiAJc3RydWN0IGl3X3F1YWxpdHkgKnF1YWwgPSAoc3RydWN0IGl3X3F1YWxpdHkgKikmYWRkcltpdy0+c3B5X251bV07CiAJaW50IGk7CiAKLQlXTF9UUkFDRSgoIiVzOiBTSU9DR0lXU1BZXG4iLCBkZXYtPm5hbWUpKTsKKwlXTF9UUkFDRSgiJXM6IFNJT0NHSVdTUFlcbiIsIGRldi0+bmFtZSk7CiAKIAlpZiAoIWV4dHJhKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWR3cnEtPmxlbmd0aCA9IGl3LT5zcHlfbnVtOwogCWZvciAoaSA9IDA7IGkgPCBpdy0+c3B5X251bTsgaSsrKSB7Ci0JCW1lbWNweShhZGRyW2ldLnNhX2RhdGEsICZpdy0+c3B5X2FkZHJbaV0sIEVUSEVSX0FERFJfTEVOKTsKKwkJbWVtY3B5KGFkZHJbaV0uc2FfZGF0YSwgJml3LT5zcHlfYWRkcltpXSwgRVRIX0FMRU4pOwogCQlhZGRyW2ldLnNhX2ZhbWlseSA9IEFGX1VOSVg7CiAJCW1lbWNweSgmcXVhbFtpXSwgJml3LT5zcHlfcXVhbFtpXSwgc2l6ZW9mKHN0cnVjdCBpd19xdWFsaXR5KSk7CiAJCWl3LT5zcHlfcXVhbFtpXS51cGRhdGVkID0gMDsKQEAgLTc1MSw4ICs3NTAsOCBAQAogCQlqb2luX3BhcmFtcy0+cGFyYW1zLmNoYW5zcGVjX251bSA9CiAJCSAgICBodG9kMzIoam9pbl9wYXJhbXMtPnBhcmFtcy5jaGFuc3BlY19udW0pOwogCi0JCVdMX1RSQUNFKCgiJXMgIGpvaW5fcGFyYW1zLT5wYXJhbXMuY2hhbnNwZWNfbGlzdFswXT0gJVhcbiIsCi0JCQkgIF9fZnVuY19fLCBqb2luX3BhcmFtcy0+cGFyYW1zLmNoYW5zcGVjX2xpc3RbMF0pKTsKKwkJV0xfVFJBQ0UoIiVzICBqb2luX3BhcmFtcy0+cGFyYW1zLmNoYW5zcGVjX2xpc3RbMF09ICVYXG4iLAorCQkJIF9fZnVuY19fLCBqb2luX3BhcmFtcy0+cGFyYW1zLmNoYW5zcGVjX2xpc3RbMF0pOwogCX0KIAlyZXR1cm4gMTsKIH0KQEAgLTc2NSwxNiArNzY0LDE3IEBACiAJd2xfam9pbl9wYXJhbXNfdCBqb2luX3BhcmFtczsKIAlpbnQgam9pbl9wYXJhbXNfc2l6ZTsKIAotCVdMX1RSQUNFKCgiJXM6IFNJT0NTSVdBUFxuIiwgZGV2LT5uYW1lKSk7CisJV0xfVFJBQ0UoIiVzOiBTSU9DU0lXQVBcbiIsIGRldi0+bmFtZSk7CiAKIAlpZiAoYXdycS0+c2FfZmFtaWx5ICE9IEFSUEhSRF9FVEhFUikgewotCQlXTF9FUlJPUigoIkludmFsaWQgSGVhZGVyLi4uc2FfZmFtaWx5XG4iKSk7CisJCVdMX0VSUk9SKCJJbnZhbGlkIEhlYWRlci4uLnNhX2ZhbWlseVxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCWlmIChFVEhFUl9JU0JDQVNUKGF3cnEtPnNhX2RhdGEpIHx8IEVUSEVSX0lTTlVMTEFERFIoYXdycS0+c2FfZGF0YSkpIHsKKwlpZiAoaXNfYnJvYWRjYXN0X2V0aGVyX2FkZHIoYXdycS0+c2FfZGF0YSkgfHwKKwkgICAgaXNfemVyb19ldGhlcl9hZGRyKGF3cnEtPnNhX2RhdGEpKSB7CiAJCXNjYl92YWxfdCBzY2J2YWw7Ci0JCWJ6ZXJvKCZzY2J2YWwsIHNpemVvZihzY2JfdmFsX3QpKTsKKwkJbWVtc2V0KCZzY2J2YWwsIDAsIHNpemVvZihzY2JfdmFsX3QpKTsKIAkJKHZvaWQpZGV2X3dsY19pb2N0bChkZXYsIFdMQ19ESVNBU1NPQywgJnNjYnZhbCwKIAkJCQkgICAgc2l6ZW9mKHNjYl92YWxfdCkpOwogCQlyZXR1cm4gMDsKQEAgLTc4NSwyMyArNzg1LDIzIEBACiAKIAltZW1jcHkoam9pbl9wYXJhbXMuc3NpZC5TU0lELCBnX3NzaWQuU1NJRCwgZ19zc2lkLlNTSURfbGVuKTsKIAlqb2luX3BhcmFtcy5zc2lkLlNTSURfbGVuID0gaHRvZDMyKGdfc3NpZC5TU0lEX2xlbik7Ci0JbWVtY3B5KCZqb2luX3BhcmFtcy5wYXJhbXMuYnNzaWQsIGF3cnEtPnNhX2RhdGEsIEVUSEVSX0FERFJfTEVOKTsKKwltZW1jcHkoJmpvaW5fcGFyYW1zLnBhcmFtcy5ic3NpZCwgYXdycS0+c2FfZGF0YSwgRVRIX0FMRU4pOwogCi0JV0xfVFJBQ0UoKCIlcyAgdGFyZ2V0X2NoYW5uZWw9JWRcbiIsIF9fZnVuY19fLAotCQkgIGdfd2xfaXdfcGFyYW1zLnRhcmdldF9jaGFubmVsKSk7CisJV0xfVFJBQ0UoIiVzICB0YXJnZXRfY2hhbm5lbD0lZFxuIiwKKwkJIF9fZnVuY19fLCBnX3dsX2l3X3BhcmFtcy50YXJnZXRfY2hhbm5lbCk7CiAJd2xfaXdfY2hfdG9fY2hhbnNwZWMoZ193bF9pd19wYXJhbXMudGFyZ2V0X2NoYW5uZWwsICZqb2luX3BhcmFtcywKIAkJCSAgICAgJmpvaW5fcGFyYW1zX3NpemUpOwogCiAJZXJyb3IgPSBkZXZfd2xjX2lvY3RsKGRldiwgV0xDX1NFVF9TU0lELCAmam9pbl9wYXJhbXMsCiAJCQkJam9pbl9wYXJhbXNfc2l6ZSk7CiAJaWYgKGVycm9yKSB7Ci0JCVdMX0VSUk9SKCgiJXMgSW52YWxpZCBpb2N0bCBkYXRhPSVkXG4iLCBfX2Z1bmNfXywgZXJyb3IpKTsKKwkJV0xfRVJST1IoIiVzIEludmFsaWQgaW9jdGwgZGF0YT0lZFxuIiwgX19mdW5jX18sIGVycm9yKTsKIAl9CiAKIAlpZiAoZ19zc2lkLlNTSURfbGVuKSB7Ci0JCVdMX1RSQUNFKCgiJXM6IGpvaW4gU1NJRD0lcyBCU1NJRD0lcE0gY2g9JWRcbiIsCi0JCQkgIF9fZnVuY19fLCBnX3NzaWQuU1NJRCwgYXdycS0+c2FfZGF0YSwKLQkJCSAgZ193bF9pd19wYXJhbXMudGFyZ2V0X2NoYW5uZWwpKTsKKwkJV0xfVFJBQ0UoIiVzOiBqb2luIFNTSUQ9JXMgQlNTSUQ9JXBNIGNoPSVkXG4iLAorCQkJIF9fZnVuY19fLCBnX3NzaWQuU1NJRCwgYXdycS0+c2FfZGF0YSwKKwkJCSBnX3dsX2l3X3BhcmFtcy50YXJnZXRfY2hhbm5lbCk7CiAJfQogCiAJbWVtc2V0KCZnX3NzaWQsIDAsIHNpemVvZihnX3NzaWQpKTsKQEAgLTgxMiwxMiArODEyLDEyIEBACiB3bF9pd19nZXRfd2FwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCiAJICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywgc3RydWN0IHNvY2thZGRyICphd3JxLCBjaGFyICpleHRyYSkKIHsKLQlXTF9UUkFDRSgoIiVzOiBTSU9DR0lXQVBcbiIsIGRldi0+bmFtZSkpOworCVdMX1RSQUNFKCIlczogU0lPQ0dJV0FQXG4iLCBkZXYtPm5hbWUpOwogCiAJYXdycS0+c2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOwotCW1lbXNldChhd3JxLT5zYV9kYXRhLCAwLCBFVEhFUl9BRERSX0xFTik7CisJbWVtc2V0KGF3cnEtPnNhX2RhdGEsIDAsIEVUSF9BTEVOKTsKIAotCSh2b2lkKWRldl93bGNfaW9jdGwoZGV2LCBXTENfR0VUX0JTU0lELCBhd3JxLT5zYV9kYXRhLCBFVEhFUl9BRERSX0xFTik7CisJKHZvaWQpZGV2X3dsY19pb2N0bChkZXYsIFdMQ19HRVRfQlNTSUQsIGF3cnEtPnNhX2RhdGEsIEVUSF9BTEVOKTsKIAogCXJldHVybiAwOwogfQpAQCAtODMxLDE2ICs4MzEsMTYgQEAKIAlzY2JfdmFsX3Qgc2NidmFsOwogCWludCBlcnJvciA9IC1FSU5WQUw7CiAKLQlXTF9UUkFDRSgoIiVzOiBTSU9DU0lXTUxNRSBESVNBU1NPQy9ERUFVVEhcbiIsIGRldi0+bmFtZSkpOworCVdMX1RSQUNFKCIlczogU0lPQ1NJV01MTUUgRElTQVNTT0MvREVBVVRIXG4iLCBkZXYtPm5hbWUpOwogCiAJbWxtZSA9IChzdHJ1Y3QgaXdfbWxtZSAqKWV4dHJhOwogCWlmIChtbG1lID09IE5VTEwpIHsKLQkJV0xfRVJST1IoKCJJbnZhbGlkIGlvY3RsIGRhdGEuXG4iKSk7CisJCVdMX0VSUk9SKCJJbnZhbGlkIGlvY3RsIGRhdGFcbiIpOwogCQlyZXR1cm4gZXJyb3I7CiAJfQogCiAJc2NidmFsLnZhbCA9IG1sbWUtPnJlYXNvbl9jb2RlOwotCWJjb3B5KCZtbG1lLT5hZGRyLnNhX2RhdGEsICZzY2J2YWwuZWEsIEVUSEVSX0FERFJfTEVOKTsKKwliY29weSgmbWxtZS0+YWRkci5zYV9kYXRhLCAmc2NidmFsLmVhLCBFVEhfQUxFTik7CiAKIAlpZiAobWxtZS0+Y21kID09IElXX01MTUVfRElTQVNTT0MpIHsKIAkJc2NidmFsLnZhbCA9IGh0b2QzMihzY2J2YWwudmFsKTsKQEAgLTg1Myw3ICs4NTMsNyBAQAogCQkgICAgZGV2X3dsY19pb2N0bChkZXYsIFdMQ19TQ0JfREVBVVRIRU5USUNBVEVfRk9SX1JFQVNPTiwKIAkJCQkgICZzY2J2YWwsIHNpemVvZihzY2JfdmFsX3QpKTsKIAl9IGVsc2UgewotCQlXTF9FUlJPUigoIkludmFsaWQgaW9jdGwgZGF0YS5cbiIpKTsKKwkJV0xfRVJST1IoIkludmFsaWQgaW9jdGwgZGF0YVxuIik7CiAJCXJldHVybiBlcnJvcjsKIAl9CiAKQEAgLTg3NCw3ICs4NzQsNyBAQAogCWludCBlcnJvciwgaTsKIAl1aW50IGJ1ZmxlbiA9IGR3cnEtPmxlbmd0aDsKIAotCVdMX1RSQUNFKCgiJXM6IFNJT0NHSVdBUExJU1RcbiIsIGRldi0+bmFtZSkpOworCVdMX1RSQUNFKCIlczogU0lPQ0dJV0FQTElTVFxuIiwgZGV2LT5uYW1lKTsKIAogCWlmICghZXh0cmEpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtODg2LDcgKzg4Niw3IEBACiAJbGlzdC0+YnVmbGVuID0gaHRvZDMyKGJ1Zmxlbik7CiAJZXJyb3IgPSBkZXZfd2xjX2lvY3RsKGRldiwgV0xDX1NDQU5fUkVTVUxUUywgbGlzdCwgYnVmbGVuKTsKIAlpZiAoZXJyb3IpIHsKLQkJV0xfRVJST1IoKCIlZDogU2NhbiByZXN1bHRzIGVycm9yICVkXG4iLCBfX0xJTkVfXywgZXJyb3IpKTsKKwkJV0xfRVJST1IoIiVkOiBTY2FuIHJlc3VsdHMgZXJyb3IgJWRcbiIsIF9fTElORV9fLCBlcnJvcik7CiAJCWtmcmVlKGxpc3QpOwogCQlyZXR1cm4gZXJyb3I7CiAJfQpAQCAtODk0LDggKzg5NCw4IEBACiAJbGlzdC0+dmVyc2lvbiA9IGR0b2gzMihsaXN0LT52ZXJzaW9uKTsKIAlsaXN0LT5jb3VudCA9IGR0b2gzMihsaXN0LT5jb3VudCk7CiAJaWYgKGxpc3QtPnZlcnNpb24gIT0gV0xfQlNTX0lORk9fVkVSU0lPTikgewotCQlXTF9FUlJPUigoIiVzIDogbGlzdC0+dmVyc2lvbiAlZCAhPSBXTF9CU1NfSU5GT19WRVJTSU9OXG4iLAotCQkJICBfX2Z1bmNfXywgbGlzdC0+dmVyc2lvbikpOworCQlXTF9FUlJPUigiJXMgOiBsaXN0LT52ZXJzaW9uICVkICE9IFdMX0JTU19JTkZPX1ZFUlNJT05cbiIsCisJCQkgX19mdW5jX18sIGxpc3QtPnZlcnNpb24pOwogCQlrZnJlZShsaXN0KTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpAQCAtOTExLDcgKzkxMSw3IEBACiAJCWlmICghKGR0b2gxNihiaS0+Y2FwYWJpbGl0eSkgJiBET1QxMV9DQVBfRVNTKSkKIAkJCWNvbnRpbnVlOwogCi0JCW1lbWNweShhZGRyW2R3cnEtPmxlbmd0aF0uc2FfZGF0YSwgJmJpLT5CU1NJRCwgRVRIRVJfQUREUl9MRU4pOworCQltZW1jcHkoYWRkcltkd3JxLT5sZW5ndGhdLnNhX2RhdGEsICZiaS0+QlNTSUQsIEVUSF9BTEVOKTsKIAkJYWRkcltkd3JxLT5sZW5ndGhdLnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKIAkJcXVhbFtkd3JxLT5sZW5ndGhdLnF1YWwgPSByc3NpX3RvX3F1YWwoZHRvaDE2KGJpLT5SU1NJKSk7CiAJCXF1YWxbZHdycS0+bGVuZ3RoXS5sZXZlbCA9IDB4MTAwICsgZHRvaDE2KGJpLT5SU1NJKTsKQEAgLTk1MiwxMyArOTUyLDEzIEBACiAJd2xfYnNzX2luZm9fdCAqYmkgPSBOVUxMOwogCWludCBpOwogCi0JV0xfVFJBQ0UoKCIlczogU0lPQ0dJV0FQTElTVFxuIiwgZGV2LT5uYW1lKSk7CisJV0xfVFJBQ0UoIiVzOiBTSU9DR0lXQVBMSVNUXG4iLCBkZXYtPm5hbWUpOwogCiAJaWYgKCFleHRyYSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlpZiAoKCFpc2NhbikgfHwgKCFpc2Nhbi0+c3lzaW9jX3RzaykpIHsKLQkJV0xfRVJST1IoKCIlcyBlcnJvclxuIiwgX19mdW5jX18pKTsKKwkJV0xfRVJST1IoIiVzIGVycm9yXG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybiAwOwogCX0KIApAQCAtOTY2LDkgKzk2Niw4IEBACiAJd2hpbGUgKGJ1ZikgewogCQlsaXN0ID0gJigod2xfaXNjYW5fcmVzdWx0c190ICopIGJ1Zi0+aXNjYW5fYnVmKS0+cmVzdWx0czsKIAkJaWYgKGxpc3QtPnZlcnNpb24gIT0gV0xfQlNTX0lORk9fVkVSU0lPTikgewotCQkJV0xfRVJST1IoKCIlcyA6IGxpc3QtPnZlcnNpb24gJWQgIT0gIgotCQkJCSJXTF9CU1NfSU5GT19WRVJTSU9OXG4iLAotCQkJCV9fZnVuY19fLCBsaXN0LT52ZXJzaW9uKSk7CisJCQlXTF9FUlJPUigiJXMgOiBsaXN0LT52ZXJzaW9uICVkICE9IFdMX0JTU19JTkZPX1ZFUlNJT05cbiIsCisJCQkJIF9fZnVuY19fLCBsaXN0LT52ZXJzaW9uKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAKQEAgLTk4NSw3ICs5ODQsNyBAQAogCQkJCWNvbnRpbnVlOwogCiAJCQltZW1jcHkoYWRkcltkd3JxLT5sZW5ndGhdLnNhX2RhdGEsICZiaS0+QlNTSUQsCi0JCQkgICAgICAgRVRIRVJfQUREUl9MRU4pOworCQkJICAgICAgIEVUSF9BTEVOKTsKIAkJCWFkZHJbZHdycS0+bGVuZ3RoXS5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7CiAJCQlxdWFsW2R3cnEtPmxlbmd0aF0ucXVhbCA9CiAJCQkgICAgcnNzaV90b19xdWFsKGR0b2gxNihiaS0+UlNTSSkpOwpAQCAtMTAxNiw3ICsxMDE1LDcgQEAKIHsKIAlpbnQgZXJyID0gMDsKIAotCW1lbWNweSgmcGFyYW1zLT5ic3NpZCwgJmV0aGVyX2JjYXN0LCBFVEhFUl9BRERSX0xFTik7CisJbWVtY3B5KCZwYXJhbXMtPmJzc2lkLCAmZXRoZXJfYmNhc3QsIEVUSF9BTEVOKTsKIAlwYXJhbXMtPmJzc190eXBlID0gRE9UMTFfQlNTVFlQRV9BTlk7CiAJcGFyYW1zLT5zY2FuX3R5cGUgPSAwOwogCXBhcmFtcy0+bnByb2JlcyA9IC0xOwpAQCAtMTA0MywxNSArMTA0MiwxNSBAQAogCWlzY2FuLT5pc2Nhbl9leF9wYXJhbXNfcC0+YWN0aW9uID0gaHRvZDE2KGFjdGlvbik7CiAJaXNjYW4tPmlzY2FuX2V4X3BhcmFtc19wLT5zY2FuX2R1cmF0aW9uID0gaHRvZDE2KDApOwogCi0JV0xfU0NBTigoIiVzIDogbnByb2Jlcz0lZFxuIiwgX19mdW5jX18sCi0JCSBpc2Nhbi0+aXNjYW5fZXhfcGFyYW1zX3AtPnBhcmFtcy5ucHJvYmVzKSk7Ci0JV0xfU0NBTigoImFjdGl2ZV90aW1lPSVkXG4iLAotCQkgaXNjYW4tPmlzY2FuX2V4X3BhcmFtc19wLT5wYXJhbXMuYWN0aXZlX3RpbWUpKTsKLQlXTF9TQ0FOKCgicGFzc2l2ZV90aW1lPSVkXG4iLAotCQkgaXNjYW4tPmlzY2FuX2V4X3BhcmFtc19wLT5wYXJhbXMucGFzc2l2ZV90aW1lKSk7Ci0JV0xfU0NBTigoImhvbWVfdGltZT0lZFxuIiwgaXNjYW4tPmlzY2FuX2V4X3BhcmFtc19wLT5wYXJhbXMuaG9tZV90aW1lKSk7Ci0JV0xfU0NBTigoInNjYW5fdHlwZT0lZFxuIiwgaXNjYW4tPmlzY2FuX2V4X3BhcmFtc19wLT5wYXJhbXMuc2Nhbl90eXBlKSk7Ci0JV0xfU0NBTigoImJzc190eXBlPSVkXG4iLCBpc2Nhbi0+aXNjYW5fZXhfcGFyYW1zX3AtPnBhcmFtcy5ic3NfdHlwZSkpOworCVdMX1NDQU4oIiVzIDogbnByb2Jlcz0lZFxuIiwKKwkJX19mdW5jX18sIGlzY2FuLT5pc2Nhbl9leF9wYXJhbXNfcC0+cGFyYW1zLm5wcm9iZXMpOworCVdMX1NDQU4oImFjdGl2ZV90aW1lPSVkXG4iLAorCQkgaXNjYW4tPmlzY2FuX2V4X3BhcmFtc19wLT5wYXJhbXMuYWN0aXZlX3RpbWUpOworCVdMX1NDQU4oInBhc3NpdmVfdGltZT0lZFxuIiwKKwkJIGlzY2FuLT5pc2Nhbl9leF9wYXJhbXNfcC0+cGFyYW1zLnBhc3NpdmVfdGltZSk7CisJV0xfU0NBTigiaG9tZV90aW1lPSVkXG4iLCBpc2Nhbi0+aXNjYW5fZXhfcGFyYW1zX3AtPnBhcmFtcy5ob21lX3RpbWUpOworCVdMX1NDQU4oInNjYW5fdHlwZT0lZFxuIiwgaXNjYW4tPmlzY2FuX2V4X3BhcmFtc19wLT5wYXJhbXMuc2Nhbl90eXBlKTsKKwlXTF9TQ0FOKCJic3NfdHlwZT0lZFxuIiwgaXNjYW4tPmlzY2FuX2V4X3BhcmFtc19wLT5wYXJhbXMuYnNzX3R5cGUpOwogCiAJKHZvaWQpZGV2X2l3X2lvdmFyX3NldGJ1Zihpc2Nhbi0+ZGV2LCAiaXNjYW4iLCBpc2Nhbi0+aXNjYW5fZXhfcGFyYW1zX3AsCiAJCQkJICBpc2Nhbi0+aXNjYW5fZXhfcGFyYW1fc2l6ZSwgaXNjYW4tPmlvY3RsYnVmLApAQCAtMTA2Niw3ICsxMDY1LDcgQEAKIAlpZiAoaXNjYW4pIHsKIAkJaXNjYW4tPnRpbWVyX29uID0gMDsKIAkJaWYgKGlzY2FuLT5pc2Nhbl9zdGF0ZSAhPSBJU0NBTl9TVEFURV9JRExFKSB7Ci0JCQlXTF9UUkFDRSgoInRpbWVyIHRyaWdnZXJcbiIpKTsKKwkJCVdMX1RSQUNFKCJ0aW1lciB0cmlnZ2VyXG4iKTsKIAkJCXVwKCZpc2Nhbi0+c3lzaW9jX3NlbSk7CiAJCX0KIAl9CkBAIC0xMTAxLDggKzExMDAsOCBAQAogCX0gZWxzZSB7CiAJCWJ1ZiA9IGttYWxsb2Moc2l6ZW9mKGlzY2FuX2J1Zl90KSwgR0ZQX0tFUk5FTCk7CiAJCWlmICghYnVmKSB7Ci0JCQlXTF9FUlJPUigoIiVzIGNhbid0IGFsbG9jIGlzY2FuX2J1Zl90IDogZ29pbmcgdG8gYWJvcnQgIgotCQkJCSJjdXJyZWN0IGlzY2FuXG4iLCBfX2Z1bmNfXykpOworCQkJV0xfRVJST1IoIiVzIGNhbid0IGFsbG9jIGlzY2FuX2J1Zl90IDogZ29pbmcgdG8gYWJvcnQgY3VycmVudCBpc2NhblxuIiwKKwkJCQkgX19mdW5jX18pOwogCQkJTVVURVhfVU5MT0NLX1dMX1NDQU5fU0VUKCk7CiAJCQlyZXR1cm4gV0xfU0NBTl9SRVNVTFRTX05PX01FTTsKIAkJfQpAQCAtMTEzNSwxMSArMTEzNCwxMSBAQAogCQlyZXN1bHRzLT5idWZsZW4gPSBkdG9oMzIocmVzdWx0cy0+YnVmbGVuKTsKIAkJcmVzdWx0cy0+dmVyc2lvbiA9IGR0b2gzMihyZXN1bHRzLT52ZXJzaW9uKTsKIAkJcmVzdWx0cy0+Y291bnQgPSBkdG9oMzIocmVzdWx0cy0+Y291bnQpOwotCQlXTF9UUkFDRSgoInJlc3VsdHMtPmNvdW50ID0gJWRcbiIsIHJlc3VsdHMtPmNvdW50KSk7Ci0JCVdMX1RSQUNFKCgicmVzdWx0cy0+YnVmbGVuID0gJWRcbiIsIHJlc3VsdHMtPmJ1ZmxlbikpOworCQlXTF9UUkFDRSgicmVzdWx0cy0+Y291bnQgPSAlZFxuIiwgcmVzdWx0cy0+Y291bnQpOworCQlXTF9UUkFDRSgicmVzdWx0cy0+YnVmbGVuID0gJWRcbiIsIHJlc3VsdHMtPmJ1Zmxlbik7CiAJCXN0YXR1cyA9IGR0b2gzMihsaXN0X2J1Zi0+c3RhdHVzKTsKIAl9IGVsc2UgewotCQlXTF9FUlJPUigoIiVzIHJldHVybnMgZXJyb3IgJWRcbiIsIF9fZnVuY19fLCByZXMpKTsKKwkJV0xfRVJST1IoIiVzIHJldHVybnMgZXJyb3IgJWRcbiIsIF9fZnVuY19fLCByZXMpOwogCQlzdGF0dXMgPSBXTF9TQ0FOX1JFU1VMVFNfTk9fTUVNOwogCX0KIAlNVVRFWF9VTkxPQ0tfV0xfU0NBTl9TRVQoKTsKQEAgLTExNDgsOCArMTE0Nyw4IEBACiAKIHN0YXRpYyB2b2lkIHdsX2l3X2ZvcmNlX3NwZWNpZmljX3NjYW4oaXNjYW5faW5mb190ICppc2NhbikKIHsKLQlXTF9UUkFDRSgoIiVzIGZvcmNlIFNwZWNpZmljIFNDQU4gZm9yICVzXG4iLCBfX2Z1bmNfXywKLQkJICBnX3NwZWNpZmljX3NzaWQuU1NJRCkpOworCVdMX1RSQUNFKCIlcyBmb3JjZSBTcGVjaWZpYyBTQ0FOIGZvciAlc1xuIiwKKwkJIF9fZnVuY19fLCBnX3NwZWNpZmljX3NzaWQuU1NJRCk7CiAJcnRubF9sb2NrKCk7CiAKIAkodm9pZClkZXZfd2xjX2lvY3RsKGlzY2FuLT5kZXYsIFdMQ19TQ0FOLCAmZ19zcGVjaWZpY19zc2lkLApAQCAtMTE2Niw3ICsxMTY1LDcgQEAKIAltZW1zZXQoJndycXUsIDAsIHNpemVvZih3cnF1KSk7CiAKIAl3aXJlbGVzc19zZW5kX2V2ZW50KGlzY2FuLT5kZXYsIFNJT0NHSVdTQ0FOLCAmd3JxdSwgTlVMTCk7Ci0JV0xfVFJBQ0UoKCJTZW5kIEV2ZW50IElTQ0FOIGNvbXBsZXRlXG4iKSk7CisJV0xfVFJBQ0UoIlNlbmQgRXZlbnQgSVNDQU4gY29tcGxldGVcbiIpOwogI2VuZGlmCiB9CiAKQEAgLTExOTAsOCArMTE4OSw4IEBACiAJCXN0YXR1cyA9IHdsX2l3X2lzY2FuX2dldChpc2Nhbik7CiAJCXJ0bmxfdW5sb2NrKCk7CiAJCWlmIChnX3NjYW5fc3BlY2lmaWVkX3NzaWQgJiYgKGlzY2FuX3Bhc3NfYWJvcnQgPT0gdHJ1ZSkpIHsKLQkJCVdMX1RSQUNFKCgiJXMgR2V0IHJlc3VsdHMgZnJvbSBzcGVjaWZpYyBzY2FuICIKLQkJCQkic3RhdHVzID0gJWRcbiIsIF9fZnVuY19fLCBzdGF0dXMpKTsKKwkJCVdMX1RSQUNFKCIlcyBHZXQgcmVzdWx0cyBmcm9tIHNwZWNpZmljIHNjYW4gc3RhdHVzID0gJWRcbiIsCisJCQkJIF9fZnVuY19fLCBzdGF0dXMpOwogCQkJd2xfaXdfc2VuZF9zY2FuX2NvbXBsZXRlKGlzY2FuKTsKIAkJCWlzY2FuX3Bhc3NfYWJvcnQgPSBmYWxzZTsKIAkJCXN0YXR1cyA9IC0xOwpAQCAtMTE5OSw3ICsxMTk4LDcgQEAKIAogCQlzd2l0Y2ggKHN0YXR1cykgewogCQljYXNlIFdMX1NDQU5fUkVTVUxUU19QQVJUSUFMOgotCQkJV0xfVFJBQ0UoKCJpc2NhbnJlc3VsdHMgaW5jb21wbGV0ZVxuIikpOworCQkJV0xfVFJBQ0UoImlzY2FucmVzdWx0cyBpbmNvbXBsZXRlXG4iKTsKIAkJCXJ0bmxfbG9jaygpOwogCQkJd2xfaXdfaXNjYW4oaXNjYW4sIE5VTEwsIFdMX1NDQU5fQUNUSU9OX0NPTlRJTlVFKTsKIAkJCXJ0bmxfdW5sb2NrKCk7CkBAIC0xMjA4LDE4ICsxMjA3LDE4IEBACiAJCQlpc2Nhbi0+dGltZXJfb24gPSAxOwogCQkJYnJlYWs7CiAJCWNhc2UgV0xfU0NBTl9SRVNVTFRTX1NVQ0NFU1M6Ci0JCQlXTF9UUkFDRSgoImlzY2FucmVzdWx0cyBjb21wbGV0ZVxuIikpOworCQkJV0xfVFJBQ0UoImlzY2FucmVzdWx0cyBjb21wbGV0ZVxuIik7CiAJCQlpc2Nhbi0+aXNjYW5fc3RhdGUgPSBJU0NBTl9TVEFURV9JRExFOwogCQkJd2xfaXdfc2VuZF9zY2FuX2NvbXBsZXRlKGlzY2FuKTsKIAkJCWJyZWFrOwogCQljYXNlIFdMX1NDQU5fUkVTVUxUU19QRU5ESU5HOgotCQkJV0xfVFJBQ0UoKCJpc2NhbnJlc3VsdHMgcGVuZGluZ1xuIikpOworCQkJV0xfVFJBQ0UoImlzY2FucmVzdWx0cyBwZW5kaW5nXG4iKTsKIAkJCW1vZF90aW1lcigmaXNjYW4tPnRpbWVyLAogCQkJCSAgamlmZmllcyArIGlzY2FuLT50aW1lcl9tcyAqIEhaIC8gMTAwMCk7CiAJCQlpc2Nhbi0+dGltZXJfb24gPSAxOwogCQkJYnJlYWs7CiAJCWNhc2UgV0xfU0NBTl9SRVNVTFRTX0FCT1JURUQ6Ci0JCQlXTF9UUkFDRSgoImlzY2FucmVzdWx0cyBhYm9ydGVkXG4iKSk7CisJCQlXTF9UUkFDRSgiaXNjYW5yZXN1bHRzIGFib3J0ZWRcbiIpOwogCQkJaXNjYW4tPmlzY2FuX3N0YXRlID0gSVNDQU5fU1RBVEVfSURMRTsKIAkJCWlmIChnX3NjYW5fc3BlY2lmaWVkX3NzaWQgPT0gMCkKIAkJCQl3bF9pd19zZW5kX3NjYW5fY29tcGxldGUoaXNjYW4pOwpAQCAtMTIyOSwxMiArMTIyOCwxMiBAQAogCQkJfQogCQkJYnJlYWs7CiAJCWNhc2UgV0xfU0NBTl9SRVNVTFRTX05PX01FTToKLQkJCVdMX1RSQUNFKCgiaXNjYW5yZXN1bHRzIGNhbid0IGFsbG9jIG1lbW9yeTogc2tpcFxuIikpOworCQkJV0xfVFJBQ0UoImlzY2FucmVzdWx0cyBjYW4ndCBhbGxvYyBtZW1vcnk6IHNraXBcbiIpOwogCQkJaXNjYW4tPmlzY2FuX3N0YXRlID0gSVNDQU5fU1RBVEVfSURMRTsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgotCQkJV0xfVFJBQ0UoKCJpc2NhbnJlc3VsdHMgcmV0dXJuZWQgdW5rbm93biBzdGF0dXMgJWRcbiIsCi0JCQkJICBzdGF0dXMpKTsKKwkJCVdMX1RSQUNFKCJpc2NhbnJlc3VsdHMgcmV0dXJuZWQgdW5rbm93biBzdGF0dXMgJWRcbiIsCisJCQkJIHN0YXR1cyk7CiAJCQlicmVhazsKIAkJfQogCX0KQEAgLTEyNTMsMTEgKzEyNTIsMTEgQEAKIAkgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCiB7CiAJaW50IGVycm9yOwotCVdMX1RSQUNFKCgiXG46JXMgZGV2OiVzOiBTSU9DU0lXU0NBTiA6IFNDQU5cbiIsIF9fZnVuY19fLCBkZXYtPm5hbWUpKTsKKwlXTF9UUkFDRSgiXG46JXMgZGV2OiVzOiBTSU9DU0lXU0NBTiA6IFNDQU5cbiIsIF9fZnVuY19fLCBkZXYtPm5hbWUpOwogCiAJZ19zZXRfZXNzaWRfYmVmb3JlX3NjYW4gPSBmYWxzZTsKICNpZiBkZWZpbmVkKENTQ0FOKQotCVdMX0VSUk9SKCgiJXM6IFNjYW4gZnJvbSBTSU9DR0lXU0NBTiBub3Qgc3VwcG9ydGVkXG4iLCBfX2Z1bmNfXykpOworCVdMX0VSUk9SKCIlczogU2NhbiBmcm9tIFNJT0NHSVdTQ0FOIG5vdCBzdXBwb3J0ZWRcbiIsIF9fZnVuY19fKTsKIAlyZXR1cm4gLUVJTlZBTDsKICNlbmRpZgogCkBAIC0xMjc0LDkgKzEyNzMsOCBAQAogCQlpZiAod3JxdS0+ZGF0YS5mbGFncyAmIElXX1NDQU5fVEhJU19FU1NJRCkgewogCQkJc3RydWN0IGl3X3NjYW5fcmVxICpyZXEgPSAoc3RydWN0IGl3X3NjYW5fcmVxICopZXh0cmE7CiAJCQlpZiAoZ19zY2FuX3NwZWNpZmllZF9zc2lkKSB7Ci0JCQkJV0xfVFJBQ0UoKCIlcyBTcGVjaWZpYyBTQ0FOIGlzIG5vdCBkb25lIGlnbm9yZSAiCi0JCQkJCSJzY2FuIGZvciA9ICVzXG4iLAotCQkJCQlfX2Z1bmNfXywgcmVxLT5lc3NpZCkpOworCQkJCVdMX1RSQUNFKCIlcyBTcGVjaWZpYyBTQ0FOIGlzIG5vdCBkb25lIGlnbm9yZSBzY2FuIGZvciA9ICVzXG4iLAorCQkJCQkgX19mdW5jX18sIHJlcS0+ZXNzaWQpOwogCQkJCXJldHVybiAtRUJVU1k7CiAJCQl9IGVsc2UgewogCQkJCWdfc3BlY2lmaWNfc3NpZC5TU0lEX2xlbiA9IG1pbl90KHNpemVfdCwKQEAgLTEyODcsOSArMTI4NSw5IEBACiAJCQkJZ19zcGVjaWZpY19zc2lkLlNTSURfbGVuID0KIAkJCQkgICAgaHRvZDMyKGdfc3BlY2lmaWNfc3NpZC5TU0lEX2xlbik7CiAJCQkJZ19zY2FuX3NwZWNpZmllZF9zc2lkID0gMTsKLQkJCQlXTF9UUkFDRSgoIiMjIyBTcGVjaWZpYyBzY2FuIHNzaWQ9JXMgbGVuPSVkXG4iLAotCQkJCQkgIGdfc3BlY2lmaWNfc3NpZC5TU0lELAotCQkJCQkgIGdfc3BlY2lmaWNfc3NpZC5TU0lEX2xlbikpOworCQkJCVdMX1RSQUNFKCIjIyMgU3BlY2lmaWMgc2NhbiBzc2lkPSVzIGxlbj0lZFxuIiwKKwkJCQkJIGdfc3BlY2lmaWNfc3NpZC5TU0lELAorCQkJCQkgZ19zcGVjaWZpY19zc2lkLlNTSURfbGVuKTsKIAkJCX0KIAkJfQogCX0KQEAgLTEyOTcsOCArMTI5NSw4IEBACiAJZXJyb3IgPSBkZXZfd2xjX2lvY3RsKGRldiwgV0xDX1NDQU4sICZnX3NwZWNpZmljX3NzaWQsCiAJCQkJc2l6ZW9mKGdfc3BlY2lmaWNfc3NpZCkpOwogCWlmIChlcnJvcikgewotCQlXTF9UUkFDRSgoIiMjIyMgU2V0IFNDQU4gZm9yICVzIGZhaWxlZCB3aXRoICVkXG4iLAotCQkJICBnX3NwZWNpZmljX3NzaWQuU1NJRCwgZXJyb3IpKTsKKwkJV0xfVFJBQ0UoIiMjIyMgU2V0IFNDQU4gZm9yICVzIGZhaWxlZCB3aXRoICVkXG4iLAorCQkJIGdfc3BlY2lmaWNfc3NpZC5TU0lELCBlcnJvcik7CiAJCWdfc2Nhbl9zcGVjaWZpZWRfc3NpZCA9IDA7CiAJCXJldHVybiAtRUJVU1k7CiAJfQpAQCAtMTMxNyw3ICsxMzE1LDcgQEAKIAogCXdsX2l3X3NldF9ldmVudF9tYXNrKGRldik7CiAKLQlXTF9UUkFDRSgoIisrKzogU2V0IEJyb2FkY2FzdCBJU0NBTlxuIikpOworCVdMX1RSQUNFKCIrKys6IFNldCBCcm9hZGNhc3QgSVNDQU5cbiIpOwogCW1lbXNldCgmc3NpZCwgMCwgc2l6ZW9mKHNzaWQpKTsKIAogCWlzY2FuLT5saXN0X2N1ciA9IGlzY2FuLT5saXN0X2hkcjsKQEAgLTEzNDYsMjAgKzEzNDQsMjAgQEAKIAl3bGNfc3NpZF90IHNzaWQ7CiAJaXNjYW5faW5mb190ICppc2NhbiA9IGdfaXNjYW47CiAKLQlXTF9UUkFDRSgoIiVzOiBTSU9DU0lXU0NBTiA6IElTQ0FOXG4iLCBkZXYtPm5hbWUpKTsKKwlXTF9UUkFDRSgiJXM6IFNJT0NTSVdTQ0FOIDogSVNDQU5cbiIsIGRldi0+bmFtZSk7CiAKICNpZiBkZWZpbmVkKENTQ0FOKQotCVdMX0VSUk9SKCgiJXM6IFNjYW4gZnJvbSBTSU9DR0lXU0NBTiBub3Qgc3VwcG9ydGVkXG4iLCBfX2Z1bmNfXykpOworCVdMX0VSUk9SKCIlczogU2NhbiBmcm9tIFNJT0NHSVdTQ0FOIG5vdCBzdXBwb3J0ZWRcbiIsIF9fZnVuY19fKTsKIAlyZXR1cm4gLUVJTlZBTDsKICNlbmRpZgogCiAJaWYgKGdfb25vZmYgPT0gR19XTEFOX1NFVF9PRkYpIHsKLQkJV0xfVFJBQ0UoKCIlczogZHJpdmVyIGlzIG5vdCB1cCB5ZXQgYWZ0ZXIgU1RBUlRcbiIsIF9fZnVuY19fKSk7CisJCVdMX1RSQUNFKCIlczogZHJpdmVyIGlzIG5vdCB1cCB5ZXQgYWZ0ZXIgU1RBUlRcbiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIDA7CiAJfQogI2lmZGVmIFBOT19TVVBQT1JUCiAJaWYgKGRoZF9kZXZfZ2V0X3Bub19zdGF0dXMoZGV2KSkgewotCQlXTF9FUlJPUigoIiVzOiBTY2FuIGNhbGxlZCB3aGVuIFBOTyBpcyBhY3RpdmVcbiIsIF9fZnVuY19fKSk7CisJCVdMX0VSUk9SKCIlczogU2NhbiBjYWxsZWQgd2hlbiBQTk8gaXMgYWN0aXZlXG4iLCBfX2Z1bmNfXyk7CiAJfQogI2VuZGlmCiAKQEAgLTEzNjcsOCArMTM2NSw4IEBACiAJCXJldHVybiB3bF9pd19zZXRfc2NhbihkZXYsIGluZm8sIHdycXUsIGV4dHJhKTsKIAogCWlmIChnX3NjYW5fc3BlY2lmaWVkX3NzaWQpIHsKLQkJV0xfVFJBQ0UoKCIlcyBTcGVjaWZpYyBTQ0FOIGFscmVhZHkgcnVubmluZyBpZ25vcmluZyBCQyBzY2FuXG4iLAotCQkJICBfX2Z1bmNfXykpOworCQlXTF9UUkFDRSgiJXMgU3BlY2lmaWMgU0NBTiBhbHJlYWR5IHJ1bm5pbmcgaWdub3JpbmcgQkMgc2NhblxuIiwKKwkJCSBfX2Z1bmNfXyk7CiAJCXJldHVybiBFQlVTWTsKIAl9CiAKQEAgLTEzODYsOCArMTM4NCw4IEBACiAJCQlnX3NjYW5fc3BlY2lmaWVkX3NzaWQgPSAwOwogCiAJCQlpZiAoaXNjYW4tPmlzY2FuX3N0YXRlID09IElTQ0FOX1NUQVRFX1NDQU5JTkcpIHsKLQkJCQlXTF9UUkFDRSgoIiVzIElTQ0FOIGFscmVhZHkgaW4gcHJvZ3Jlc3MgXG4iLAotCQkJCQkgIF9fZnVuY19fKSk7CisJCQkJV0xfVFJBQ0UoIiVzIElTQ0FOIGFscmVhZHkgaW4gcHJvZ3Jlc3NcbiIsCisJCQkJCSBfX2Z1bmNfXyk7CiAJCQkJcmV0dXJuIDA7CiAJCQl9CiAJCX0KQEAgLTE0MDYsNyArMTQwNCw3IEBACiAJdTggKmllID0gKndwYWllOwogCiAJaWYgKChpZVsxXSA+PSA2KSAmJgotCSAgICAhYmNtcCgoY29uc3Qgdm9pZCAqKSZpZVsyXSwgKGNvbnN0IHZvaWQgKikoV1BBX09VSSAiXHgwMSIpLCA0KSkgeworCSAgICAhbWVtY21wKChjb25zdCB2b2lkICopJmllWzJdLCAoY29uc3Qgdm9pZCAqKShXUEFfT1VJICJceDAxIiksIDQpKSB7CiAJCXJldHVybiB0cnVlOwogCX0KIApAQCAtMTQyMiw3ICsxNDIwLDcgQEAKIAl1OCAqaWUgPSAqd3BzaWU7CiAKIAlpZiAoKGllWzFdID49IDQpICYmCi0JICAgICFiY21wKChjb25zdCB2b2lkICopJmllWzJdLCAoY29uc3Qgdm9pZCAqKShXUEFfT1VJICJceDA0IiksIDQpKSB7CisJICAgICFtZW1jbXAoKGNvbnN0IHZvaWQgKikmaWVbMl0sIChjb25zdCB2b2lkICopKFdQQV9PVUkgIlx4MDQiKSwgNCkpIHsKIAkJcmV0dXJuIHRydWU7CiAJfQogCkBAIC0xNTAxLDkgKzE0OTksOCBAQAogCiAJZm9yIChpID0gMDsgaSA8IGxpc3QtPmNvdW50ICYmIGkgPCBJV19NQVhfQVA7IGkrKykgewogCQlpZiAobGlzdC0+dmVyc2lvbiAhPSBXTF9CU1NfSU5GT19WRVJTSU9OKSB7Ci0JCQlXTF9FUlJPUigoIiVzIDogbGlzdC0+dmVyc2lvbiAlZCAhPSAiCi0JCQkJIldMX0JTU19JTkZPX1ZFUlNJT05cbiIsCi0JCQkJX19mdW5jX18sIGxpc3QtPnZlcnNpb24pKTsKKwkJCVdMX0VSUk9SKCIlcyA6IGxpc3QtPnZlcnNpb24gJWQgIT0gV0xfQlNTX0lORk9fVkVSU0lPTlxuIiwKKwkJCQkgX19mdW5jX18sIGxpc3QtPnZlcnNpb24pOwogCQkJcmV0dXJuIHJldDsKIAkJfQogCkBAIC0xNTExLDExICsxNTA4LDExIEBACiAJCQkJCSAgICAgZHRvaDMyKGJpLT5sZW5ndGgpKSA6IGxpc3QtPgogCQkgICAgYnNzX2luZm87CiAKLQkJV0xfVFJBQ0UoKCIlcyA6ICVzXG4iLCBfX2Z1bmNfXywgYmktPlNTSUQpKTsKKwkJV0xfVFJBQ0UoIiVzIDogJXNcbiIsIF9fZnVuY19fLCBiaS0+U1NJRCk7CiAKIAkJaXdlLmNtZCA9IFNJT0NHSVdBUDsKIAkJaXdlLnUuYXBfYWRkci5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7Ci0JCW1lbWNweShpd2UudS5hcF9hZGRyLnNhX2RhdGEsICZiaS0+QlNTSUQsIEVUSEVSX0FERFJfTEVOKTsKKwkJbWVtY3B5KGl3ZS51LmFwX2FkZHIuc2FfZGF0YSwgJmJpLT5CU1NJRCwgRVRIX0FMRU4pOwogCQlldmVudCA9CiAJCSAgICBJV0VfU1RSRUFNX0FERF9FVkVOVChpbmZvLCBldmVudCwgZW5kLCAmaXdlLAogCQkJCQkgSVdfRVZfQUREUl9MRU4pOwpAQCAtMTU5MCwxMSArMTU4NywxMSBAQAogCiAJcmV0ID0gZXZlbnQgLSBleHRyYTsKIAlpZiAocmV0IDwgMCkgewotCQlXTF9FUlJPUigoIj09PiBXcm9uZyBzaXplXG4iKSk7CisJCVdMX0VSUk9SKCI9PT4gV3Jvbmcgc2l6ZVxuIik7CiAJCXJldCA9IDA7CiAJfQotCVdMX1RSQUNFKCgiJXM6IHNpemU9JWQgYnl0ZXMgcHJlcGFyZWRcbiIsIF9fZnVuY19fLAotCQkgICh1bnNpZ25lZCBpbnQpKGV2ZW50IC0gZXh0cmEpKSk7CisJV0xfVFJBQ0UoIiVzOiBzaXplPSVkIGJ5dGVzIHByZXBhcmVkXG4iLAorCQkgX19mdW5jX18sICh1bnNpZ25lZCBpbnQpKGV2ZW50IC0gZXh0cmEpKTsKIAlyZXR1cm4gKHVpbnQpcmV0OwogfQogCkBAIC0xNjE0LDEwICsxNjExLDEwIEBACiAJaXNjYW5fYnVmX3QgKnBfYnVmOwogI2VuZGlmCiAKLQlXTF9UUkFDRSgoIiVzOiBidWZsZW5fZnJvbV91c2VyICVkOiBcbiIsIGRldi0+bmFtZSwgYnVmbGVuX2Zyb21fdXNlcikpOworCVdMX1RSQUNFKCIlczogYnVmbGVuX2Zyb21fdXNlciAlZDpcbiIsIGRldi0+bmFtZSwgYnVmbGVuX2Zyb21fdXNlcik7CiAKIAlpZiAoIWV4dHJhKSB7Ci0JCVdMX1RSQUNFKCgiJXM6IHdsX2l3X2dldF9zY2FuIHJldHVybiAtRUlOVkFMXG4iLCBkZXYtPm5hbWUpKTsKKwkJV0xfVFJBQ0UoIiVzOiB3bF9pd19nZXRfc2NhbiByZXR1cm4gLUVJTlZBTFxuIiwgZGV2LT5uYW1lKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC0xNjMxLDggKzE2MjgsOCBAQAogCWlmIChnX3NjYW5fc3BlY2lmaWVkX3NzaWQpIHsKIAkJbGlzdCA9IGttYWxsb2MobGVuLCBHRlBfS0VSTkVMKTsKIAkJaWYgKCFsaXN0KSB7Ci0JCQlXTF9UUkFDRSgoIiVzOiB3bF9pd19nZXRfc2NhbiByZXR1cm4gLUVOT01FTVxuIiwKLQkJCQkgIGRldi0+bmFtZSkpOworCQkJV0xfVFJBQ0UoIiVzOiB3bF9pd19nZXRfc2NhbiByZXR1cm4gLUVOT01FTVxuIiwKKwkJCQkgZGV2LT5uYW1lKTsKIAkJCWdfc2Nhbl9zcGVjaWZpZWRfc3NpZCA9IDA7CiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJfQpAQCAtMTY0Miw4ICsxNjM5LDggQEAKIAlsaXN0LT5idWZsZW4gPSBodG9kMzIobGVuKTsKIAllcnJvciA9IGRldl93bGNfaW9jdGwoZGV2LCBXTENfU0NBTl9SRVNVTFRTLCBsaXN0LCBsZW4pOwogCWlmIChlcnJvcikgewotCQlXTF9FUlJPUigoIiVzOiAlcyA6IFNjYW5fcmVzdWx0cyBFUlJPUiAlZFxuIiwgZGV2LT5uYW1lLAotCQkJICBfX2Z1bmNfXywgZXJyb3IpKTsKKwkJV0xfRVJST1IoIiVzOiAlcyA6IFNjYW5fcmVzdWx0cyBFUlJPUiAlZFxuIiwKKwkJCSBkZXYtPm5hbWUsIF9fZnVuY19fLCBlcnJvcik7CiAJCWR3cnEtPmxlbmd0aCA9IGxlbjsKIAkJaWYgKGdfc2Nhbl9zcGVjaWZpZWRfc3NpZCkgewogCQkJZ19zY2FuX3NwZWNpZmllZF9zc2lkID0gMDsKQEAgLTE2NTYsOCArMTY1Myw4IEBACiAJbGlzdC0+Y291bnQgPSBkdG9oMzIobGlzdC0+Y291bnQpOwogCiAJaWYgKGxpc3QtPnZlcnNpb24gIT0gV0xfQlNTX0lORk9fVkVSU0lPTikgewotCQlXTF9FUlJPUigoIiVzIDogbGlzdC0+dmVyc2lvbiAlZCAhPSBXTF9CU1NfSU5GT19WRVJTSU9OXG4iLAotCQkJICBfX2Z1bmNfXywgbGlzdC0+dmVyc2lvbikpOworCQlXTF9FUlJPUigiJXMgOiBsaXN0LT52ZXJzaW9uICVkICE9IFdMX0JTU19JTkZPX1ZFUlNJT05cbiIsCisJCQkgX19mdW5jX18sIGxpc3QtPnZlcnNpb24pOwogCQlpZiAoZ19zY2FuX3NwZWNpZmllZF9zc2lkKSB7CiAJCQlnX3NjYW5fc3BlY2lmaWVkX3NzaWQgPSAwOwogCQkJa2ZyZWUobGlzdCk7CkBAIC0xNjY2LDggKzE2NjMsOCBAQAogCX0KIAogCWlmIChnX3NjYW5fc3BlY2lmaWVkX3NzaWQpIHsKLQkJV0xfVFJBQ0UoKCIlczogU3BlY2lmaWVkIHNjYW4gQVBzIGluIHRoZSBsaXN0ID0lZFxuIiwKLQkJCSAgX19mdW5jX18sIGxpc3QtPmNvdW50KSk7CisJCVdMX1RSQUNFKCIlczogU3BlY2lmaWVkIHNjYW4gQVBzIGluIHRoZSBsaXN0ID0lZFxuIiwKKwkJCSBfX2Z1bmNfXywgbGlzdC0+Y291bnQpOwogCQlsZW5fcmV0ID0KIAkJICAgIChfX3UxNikgd2xfaXdfZ2V0X3NjYW5fcHJlcChsaXN0LCBpbmZvLCBleHRyYSwKIAkJCQkJCWJ1Zmxlbl9mcm9tX3VzZXIpOwpAQCAtMTY3OCw4ICsxNjc1LDggQEAKIAkJd2hpbGUgKHBfYnVmICE9IGlzY2FuLT5saXN0X2N1cikgewogCQkJbGlzdF9tZXJnZSA9CiAJCQkgICAgJigod2xfaXNjYW5fcmVzdWx0c190ICopIHBfYnVmLT5pc2Nhbl9idWYpLT5yZXN1bHRzOwotCQkJV0xfVFJBQ0UoKCIlczogQmNhc3QgQVBzIGxpc3Q9JWRcbiIsIF9fZnVuY19fLAotCQkJCSAgbGlzdF9tZXJnZS0+Y291bnQpKTsKKwkJCVdMX1RSQUNFKCIlczogQmNhc3QgQVBzIGxpc3Q9JWRcbiIsCisJCQkJIF9fZnVuY19fLCBsaXN0X21lcmdlLT5jb3VudCk7CiAJCQlpZiAobGlzdF9tZXJnZS0+Y291bnQgPiAwKQogCQkJCWxlbl9yZXQgKz0KIAkJCQkgICAgKF9fdTE2KSB3bF9pd19nZXRfc2Nhbl9wcmVwKGxpc3RfbWVyZ2UsCkBAIC0xNjg5LDggKzE2ODYsOCBAQAogCQl9CiAjZWxzZQogCQlsaXN0X21lcmdlID0gKHdsX3NjYW5fcmVzdWx0c190ICopIGdfc2NhbjsKLQkJV0xfVFJBQ0UoKCIlczogQmNhc3QgQVBzIGxpc3Q9JWRcbiIsIF9fZnVuY19fLAotCQkJICBsaXN0X21lcmdlLT5jb3VudCkpOworCQlXTF9UUkFDRSgiJXM6IEJjYXN0IEFQcyBsaXN0PSVkXG4iLAorCQkJIF9fZnVuY19fLCBsaXN0X21lcmdlLT5jb3VudCk7CiAJCWlmIChsaXN0X21lcmdlLT5jb3VudCA+IDApCiAJCQlsZW5fcmV0ICs9CiAJCQkgICAgKF9fdTE2KSB3bF9pd19nZXRfc2Nhbl9wcmVwKGxpc3RfbWVyZ2UsIGluZm8sCkBAIC0xNzE0LDggKzE3MTEsOCBAQAogCWR3cnEtPmxlbmd0aCA9IGxlbjsKIAlkd3JxLT5mbGFncyA9IDA7CiAKLQlXTF9UUkFDRSgoIiVzIHJldHVybiB0byBXRSAlZCBieXRlcyBBUHM9JWRcbiIsIF9fZnVuY19fLAotCQkgIGR3cnEtPmxlbmd0aCwgbGlzdC0+Y291bnQpKTsKKwlXTF9UUkFDRSgiJXMgcmV0dXJuIHRvIFdFICVkIGJ5dGVzIEFQcz0lZFxuIiwKKwkJIF9fZnVuY19fLCBkd3JxLT5sZW5ndGgsIGxpc3QtPmNvdW50KTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTczNiwyNiArMTczMywyNiBAQAogCXUzMiBjb3VudGVyID0gMDsKIAl1OCBjaGFubmVsOwogCi0JV0xfVFJBQ0UoKCIlcyAlcyBidWZsZW5fZnJvbV91c2VyICVkOlxuIiwgZGV2LT5uYW1lLCBfX2Z1bmNfXywKLQkJICBkd3JxLT5sZW5ndGgpKTsKKwlXTF9UUkFDRSgiJXMgJXMgYnVmbGVuX2Zyb21fdXNlciAlZDpcbiIsCisJCSBkZXYtPm5hbWUsIF9fZnVuY19fLCBkd3JxLT5sZW5ndGgpOwogCiAJaWYgKCFleHRyYSkgewotCQlXTF9UUkFDRSgoIiVzOiBJTlZBTElEIFNJT0NHSVdTQ0FOIEdFVCBiYWQgcGFyYW1ldGVyXG4iLAotCQkJICBkZXYtPm5hbWUpKTsKKwkJV0xfVFJBQ0UoIiVzOiBJTlZBTElEIFNJT0NHSVdTQ0FOIEdFVCBiYWQgcGFyYW1ldGVyXG4iLAorCQkJIGRldi0+bmFtZSk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAogCWlmICgoIWlzY2FuKSB8fCAoIWlzY2FuLT5zeXNpb2NfdHNrKSkgewotCQlXTF9FUlJPUigoIiVzc3lzaW9jX3Rza1xuIiwgX19mdW5jX18pKTsKKwkJV0xfRVJST1IoIiVzc3lzaW9jX3Rza1xuIiwgX19mdW5jX18pOwogCQlyZXR1cm4gd2xfaXdfZ2V0X3NjYW4oZGV2LCBpbmZvLCBkd3JxLCBleHRyYSk7CiAJfQogCiAJaWYgKGlzY2FuLT5pc2Nhbl9zdGF0ZSA9PSBJU0NBTl9TVEFURV9TQ0FOSU5HKSB7Ci0JCVdMX1RSQUNFKCgiJXM6IFNJT0NHSVdTQ0FOIEdFVCBzdGlsbCBzY2FubmluZ1xuIiwgZGV2LT5uYW1lKSk7CisJCVdMX1RSQUNFKCIlczogU0lPQ0dJV1NDQU4gR0VUIHN0aWxsIHNjYW5uaW5nXG4iLCBkZXYtPm5hbWUpOwogCQlyZXR1cm4gLUVBR0FJTjsKIAl9CiAKLQlXTF9UUkFDRSgoIiVzOiBTSU9DR0lXU0NBTiBHRVQgYnJvYWRjYXN0IHJlc3VsdHNcbiIsIGRldi0+bmFtZSkpOworCVdMX1RSQUNFKCIlczogU0lPQ0dJV1NDQU4gR0VUIGJyb2FkY2FzdCByZXN1bHRzXG4iLCBkZXYtPm5hbWUpOwogCWFwY250ID0gMDsKIAlwX2J1ZiA9IGlzY2FuLT5saXN0X2hkcjsKIAl3aGlsZSAocF9idWYgIT0gaXNjYW4tPmxpc3RfY3VyKSB7CkBAIC0xNzY0LDkgKzE3NjEsOCBAQAogCQljb3VudGVyICs9IGxpc3QtPmNvdW50OwogCiAJCWlmIChsaXN0LT52ZXJzaW9uICE9IFdMX0JTU19JTkZPX1ZFUlNJT04pIHsKLQkJCVdMX0VSUk9SKCgiJXMgOiBsaXN0LT52ZXJzaW9uICVkICE9ICIKLQkJCQkiV0xfQlNTX0lORk9fVkVSU0lPTlxuIiwKLQkJCQlfX2Z1bmNfXywgbGlzdC0+dmVyc2lvbikpOworCQkJV0xfRVJST1IoIiVzIDogbGlzdC0+dmVyc2lvbiAlZCAhPSBXTF9CU1NfSU5GT19WRVJTSU9OXG4iLAorCQkJCSBfX2Z1bmNfXywgbGlzdC0+dmVyc2lvbik7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCkBAIC0xNzc5LDE0ICsxNzc1LDE0IEBACiAJCQlBU1NFUlQoKCh1bnNpZ25lZCBsb25nKWJpICsgZHRvaDMyKGJpLT5sZW5ndGgpKSA8PQogCQkJICAgICAgICgodW5zaWduZWQgbG9uZylsaXN0ICsgV0xDX0lXX0lTQ0FOX01BWExFTikpOwogCi0JCQlpZiAoZXZlbnQgKyBFVEhFUl9BRERSX0xFTiArIGJpLT5TU0lEX2xlbiArCisJCQlpZiAoZXZlbnQgKyBFVEhfQUxFTiArIGJpLT5TU0lEX2xlbiArCiAJCQkgICAgSVdfRVZfVUlOVF9MRU4gKyBJV19FVl9GUkVRX0xFTiArIElXX0VWX1FVQUxfTEVOID49CiAJCQkgICAgZW5kKQogCQkJCXJldHVybiAtRTJCSUc7CiAJCQlpd2UuY21kID0gU0lPQ0dJV0FQOwogCQkJaXdlLnUuYXBfYWRkci5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7CiAJCQltZW1jcHkoaXdlLnUuYXBfYWRkci5zYV9kYXRhLCAmYmktPkJTU0lELAotCQkJICAgICAgIEVUSEVSX0FERFJfTEVOKTsKKwkJCSAgICAgICBFVEhfQUxFTik7CiAJCQlldmVudCA9CiAJCQkgICAgSVdFX1NUUkVBTV9BRERfRVZFTlQoaW5mbywgZXZlbnQsIGVuZCwgJml3ZSwKIAkJCQkJCSBJV19FVl9BRERSX0xFTik7CkBAIC0xODc2LDggKzE4NzIsOCBAQAogCWR3cnEtPmxlbmd0aCA9IGV2ZW50IC0gZXh0cmE7CiAJZHdycS0+ZmxhZ3MgPSAwOwogCi0JV0xfVFJBQ0UoKCIlcyByZXR1cm4gdG8gV0UgJWQgYnl0ZXMgQVBzPSVkXG4iLCBfX2Z1bmNfXywKLQkJICBkd3JxLT5sZW5ndGgsIGNvdW50ZXIpKTsKKwlXTF9UUkFDRSgiJXMgcmV0dXJuIHRvIFdFICVkIGJ5dGVzIEFQcz0lZFxuIiwKKwkJIF9fZnVuY19fLCBkd3JxLT5sZW5ndGgsIGNvdW50ZXIpOwogCiAJaWYgKCFkd3JxLT5sZW5ndGgpCiAJCXJldHVybiAtRUFHQUlOOwpAQCAtMTg5NSw3ICsxODkxLDcgQEAKIAl3bF9qb2luX3BhcmFtc190IGpvaW5fcGFyYW1zOwogCWludCBqb2luX3BhcmFtc19zaXplOwogCi0JV0xfVFJBQ0UoKCIlczogU0lPQ1NJV0VTU0lEXG4iLCBkZXYtPm5hbWUpKTsKKwlXTF9UUkFDRSgiJXM6IFNJT0NTSVdFU1NJRFxuIiwgZGV2LT5uYW1lKTsKIAogCWlmIChnX3NldF9lc3NpZF9iZWZvcmVfc2NhbikKIAkJcmV0dXJuIC1FQUdBSU47CkBAIC0xOTIzLDcgKzE5MTksNyBAQAogCiAJbWVtY3B5KCZqb2luX3BhcmFtcy5zc2lkLlNTSUQsIGdfc3NpZC5TU0lELCBnX3NzaWQuU1NJRF9sZW4pOwogCWpvaW5fcGFyYW1zLnNzaWQuU1NJRF9sZW4gPSBodG9kMzIoZ19zc2lkLlNTSURfbGVuKTsKLQltZW1jcHkoJmpvaW5fcGFyYW1zLnBhcmFtcy5ic3NpZCwgJmV0aGVyX2JjYXN0LCBFVEhFUl9BRERSX0xFTik7CisJbWVtY3B5KCZqb2luX3BhcmFtcy5wYXJhbXMuYnNzaWQsICZldGhlcl9iY2FzdCwgRVRIX0FMRU4pOwogCiAJd2xfaXdfY2hfdG9fY2hhbnNwZWMoZ193bF9pd19wYXJhbXMudGFyZ2V0X2NoYW5uZWwsICZqb2luX3BhcmFtcywKIAkJCSAgICAgJmpvaW5fcGFyYW1zX3NpemUpOwpAQCAtMTkzMSwxMSArMTkyNywxMSBAQAogCWVycm9yID0gZGV2X3dsY19pb2N0bChkZXYsIFdMQ19TRVRfU1NJRCwgJmpvaW5fcGFyYW1zLAogCQkJCWpvaW5fcGFyYW1zX3NpemUpOwogCWlmIChlcnJvcikKLQkJV0xfRVJST1IoKCJJbnZhbGlkIGlvY3RsIGRhdGE9JWRcbiIsIGVycm9yKSk7CisJCVdMX0VSUk9SKCJJbnZhbGlkIGlvY3RsIGRhdGE9JWRcbiIsIGVycm9yKTsKIAogCWlmIChnX3NzaWQuU1NJRF9sZW4pIHsKLQkJV0xfVFJBQ0UoKCIlczogam9pbiBTU0lEPSVzIGNoPSVkXG4iLCBfX2Z1bmNfXywKLQkJCSAgZ19zc2lkLlNTSUQsIGdfd2xfaXdfcGFyYW1zLnRhcmdldF9jaGFubmVsKSk7CisJCVdMX1RSQUNFKCIlczogam9pbiBTU0lEPSVzIGNoPSVkXG4iLAorCQkJIF9fZnVuY19fLCBnX3NzaWQuU1NJRCwgZ193bF9pd19wYXJhbXMudGFyZ2V0X2NoYW5uZWwpOwogCX0KIAlyZXR1cm4gMDsKIH0KQEAgLTE5NDgsMTQgKzE5NDQsMTQgQEAKIAl3bGNfc3NpZF90IHNzaWQ7CiAJaW50IGVycm9yOwogCi0JV0xfVFJBQ0UoKCIlczogU0lPQ0dJV0VTU0lEXG4iLCBkZXYtPm5hbWUpKTsKKwlXTF9UUkFDRSgiJXM6IFNJT0NHSVdFU1NJRFxuIiwgZGV2LT5uYW1lKTsKIAogCWlmICghZXh0cmEpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJZXJyb3IgPSBkZXZfd2xjX2lvY3RsKGRldiwgV0xDX0dFVF9TU0lELCAmc3NpZCwgc2l6ZW9mKHNzaWQpKTsKIAlpZiAoZXJyb3IpIHsKLQkJV0xfRVJST1IoKCJFcnJvciBnZXR0aW5nIHRoZSBTU0lEXG4iKSk7CisJCVdMX0VSUk9SKCJFcnJvciBnZXR0aW5nIHRoZSBTU0lEXG4iKTsKIAkJcmV0dXJuIGVycm9yOwogCX0KIApAQCAtMTk3Niw3ICsxOTcyLDcgQEAKIHsKIAl3bF9pd190ICppdyA9ICood2xfaXdfdCAqKikgbmV0ZGV2X3ByaXYoZGV2KTsKIAotCVdMX1RSQUNFKCgiJXM6IFNJT0NTSVdOSUNLTlxuIiwgZGV2LT5uYW1lKSk7CisJV0xfVFJBQ0UoIiVzOiBTSU9DU0lXTklDS05cbiIsIGRldi0+bmFtZSk7CiAKIAlpZiAoIWV4dHJhKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTE5OTYsNyArMTk5Miw3IEBACiB7CiAJd2xfaXdfdCAqaXcgPSAqKHdsX2l3X3QgKiopIG5ldGRldl9wcml2KGRldik7CiAKLQlXTF9UUkFDRSgoIiVzOiBTSU9DR0lXTklDS05cbiIsIGRldi0+bmFtZSkpOworCVdMX1RSQUNFKCIlczogU0lPQ0dJV05JQ0tOXG4iLCBkZXYtPm5hbWUpOwogCiAJaWYgKCFleHRyYSkKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0yMDE0LDcgKzIwMTAsNyBAQAogCXdsX3JhdGVzZXRfdCByYXRlc2V0OwogCWludCBlcnJvciwgcmF0ZSwgaSwgZXJyb3JfYmcsIGVycm9yX2E7CiAKLQlXTF9UUkFDRSgoIiVzOiBTSU9DU0lXUkFURVxuIiwgZGV2LT5uYW1lKSk7CisJV0xfVFJBQ0UoIiVzOiBTSU9DU0lXUkFURVxuIiwgZGV2LT5uYW1lKTsKIAogCWVycm9yID0gZGV2X3dsY19pb2N0bChkZXYsIFdMQ19HRVRfQ1VSUl9SQVRFU0VULCAmcmF0ZXNldCwKIAkJCQlzaXplb2YocmF0ZXNldCkpOwpAQCAtMjA2Myw3ICsyMDU5LDcgQEAKIHsKIAlpbnQgZXJyb3IsIHJhdGU7CiAKLQlXTF9UUkFDRSgoIiVzOiBTSU9DR0lXUkFURVxuIiwgZGV2LT5uYW1lKSk7CisJV0xfVFJBQ0UoIiVzOiBTSU9DR0lXUkFURVxuIiwgZGV2LT5uYW1lKTsKIAogCWVycm9yID0gZGV2X3dsY19pb2N0bChkZXYsIFdMQ19HRVRfUkFURSwgJnJhdGUsIHNpemVvZihyYXRlKSk7CiAJaWYgKGVycm9yKQpAQCAtMjA4MCw3ICsyMDc2LDcgQEAKIHsKIAlpbnQgZXJyb3IsIHJ0czsKIAotCVdMX1RSQUNFKCgiJXM6IFNJT0NTSVdSVFNcbiIsIGRldi0+bmFtZSkpOworCVdMX1RSQUNFKCIlczogU0lPQ1NJV1JUU1xuIiwgZGV2LT5uYW1lKTsKIAogCWlmICh2d3JxLT5kaXNhYmxlZCkKIAkJcnRzID0gRE9UMTFfREVGQVVMVF9SVFNfTEVOOwpAQCAtMjEwMiw3ICsyMDk4LDcgQEAKIHsKIAlpbnQgZXJyb3IsIHJ0czsKIAotCVdMX1RSQUNFKCgiJXM6IFNJT0NHSVdSVFNcbiIsIGRldi0+bmFtZSkpOworCVdMX1RSQUNFKCIlczogU0lPQ0dJV1JUU1xuIiwgZGV2LT5uYW1lKTsKIAogCWVycm9yID0gZGV2X3dsY19pbnR2YXJfZ2V0KGRldiwgInJ0c3RocmVzaCIsICZydHMpOwogCWlmIChlcnJvcikKQEAgLTIxMjEsNyArMjExNyw3IEBACiB7CiAJaW50IGVycm9yLCBmcmFnOwogCi0JV0xfVFJBQ0UoKCIlczogU0lPQ1NJV0ZSQUdcbiIsIGRldi0+bmFtZSkpOworCVdMX1RSQUNFKCIlczogU0lPQ1NJV0ZSQUdcbiIsIGRldi0+bmFtZSk7CiAKIAlpZiAodndycS0+ZGlzYWJsZWQpCiAJCWZyYWcgPSBET1QxMV9ERUZBVUxUX0ZSQUdfTEVOOwpAQCAtMjE0Myw3ICsyMTM5LDcgQEAKIHsKIAlpbnQgZXJyb3IsIGZyYWd0aHJlc2hvbGQ7CiAKLQlXTF9UUkFDRSgoIiVzOiBTSU9DR0lXRlJBR1xuIiwgZGV2LT5uYW1lKSk7CisJV0xfVFJBQ0UoIiVzOiBTSU9DR0lXRlJBR1xuIiwgZGV2LT5uYW1lKTsKIAogCWVycm9yID0gZGV2X3dsY19pbnR2YXJfZ2V0KGRldiwgImZyYWd0aHJlc2giLCAmZnJhZ3RocmVzaG9sZCk7CiAJaWYgKGVycm9yKQpAQCAtMjE2Myw3ICsyMTU5LDcgQEAKIHsKIAlpbnQgZXJyb3IsIGRpc2FibGU7CiAJdTE2IHR4cHdybXc7Ci0JV0xfVFJBQ0UoKCIlczogU0lPQ1NJV1RYUE9XXG4iLCBkZXYtPm5hbWUpKTsKKwlXTF9UUkFDRSgiJXM6IFNJT0NTSVdUWFBPV1xuIiwgZGV2LT5uYW1lKTsKIAogCWRpc2FibGUgPSB2d3JxLT5kaXNhYmxlZCA/IFdMX1JBRElPX1NXX0RJU0FCTEUgOiAwOwogCWRpc2FibGUgKz0gV0xfUkFESU9fU1dfRElTQUJMRSA8PCAxNjsKQEAgLTIyMDAsNyArMjE5Niw3IEBACiAJaW50IGVycm9yLCBkaXNhYmxlLCB0eHB3cmRibTsKIAl1OCByZXN1bHQ7CiAKLQlXTF9UUkFDRSgoIiVzOiBTSU9DR0lXVFhQT1dcbiIsIGRldi0+bmFtZSkpOworCVdMX1RSQUNFKCIlczogU0lPQ0dJV1RYUE9XXG4iLCBkZXYtPm5hbWUpOwogCiAJZXJyb3IgPSBkZXZfd2xjX2lvY3RsKGRldiwgV0xDX0dFVF9SQURJTywgJmRpc2FibGUsIHNpemVvZihkaXNhYmxlKSk7CiAJaWYgKGVycm9yKQpAQCAtMjIyOSw3ICsyMjI1LDcgQEAKIHsKIAlpbnQgZXJyb3IsIGxybCwgc3JsOwogCi0JV0xfVFJBQ0UoKCIlczogU0lPQ1NJV1JFVFJZXG4iLCBkZXYtPm5hbWUpKTsKKwlXTF9UUkFDRSgiJXM6IFNJT0NTSVdSRVRSWVxuIiwgZGV2LT5uYW1lKTsKIAogCWlmICh2d3JxLT5kaXNhYmxlZCB8fCAodndycS0+ZmxhZ3MgJiBJV19SRVRSWV9MSUZFVElNRSkpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMjI3Nyw3ICsyMjczLDcgQEAKIHsKIAlpbnQgZXJyb3IsIGxybCwgc3JsOwogCi0JV0xfVFJBQ0UoKCIlczogU0lPQ0dJV1JFVFJZXG4iLCBkZXYtPm5hbWUpKTsKKwlXTF9UUkFDRSgiJXM6IFNJT0NHSVdSRVRSWVxuIiwgZGV2LT5uYW1lKTsKIAogCXZ3cnEtPmRpc2FibGVkID0gMDsKIApAQCAtMjMxNyw3ICsyMzEzLDcgQEAKIAl3bF93c2VjX2tleV90IGtleTsKIAlpbnQgZXJyb3IsIHZhbCwgd3NlYzsKIAotCVdMX1RSQUNFKCgiJXM6IFNJT0NTSVdFTkNPREVcbiIsIGRldi0+bmFtZSkpOworCVdMX1RSQUNFKCIlczogU0lPQ1NJV0VOQ09ERVxuIiwgZGV2LT5uYW1lKTsKIAogCW1lbXNldCgma2V5LCAwLCBzaXplb2Yoa2V5KSk7CiAKQEAgLTI0MDksOSArMjQwNSw5IEBACiAJd2xfd3NlY19rZXlfdCBrZXk7CiAJaW50IGVycm9yLCB2YWwsIHdzZWMsIGF1dGg7CiAKLQlXTF9UUkFDRSgoIiVzOiBTSU9DR0lXRU5DT0RFXG4iLCBkZXYtPm5hbWUpKTsKKwlXTF9UUkFDRSgiJXM6IFNJT0NHSVdFTkNPREVcbiIsIGRldi0+bmFtZSk7CiAKLQliemVybygma2V5LCBzaXplb2Yod2xfd3NlY19rZXlfdCkpOworCW1lbXNldCgma2V5LCAwLCBzaXplb2Yod2xfd3NlY19rZXlfdCkpOwogCiAJaWYgKChkd3JxLT5mbGFncyAmIElXX0VOQ09ERV9JTkRFWCkgPT0gMCkgewogCQlmb3IgKGtleS5pbmRleCA9IDA7IGtleS5pbmRleCA8IERPVDExX01BWF9ERUZBVUxUX0tFWVM7CkBAIC0yNDY1LDcgKzI0NjEsNyBAQAogewogCWludCBlcnJvciwgcG07CiAKLQlXTF9UUkFDRSgoIiVzOiBTSU9DU0lXUE9XRVJcbiIsIGRldi0+bmFtZSkpOworCVdMX1RSQUNFKCIlczogU0lPQ1NJV1BPV0VSXG4iLCBkZXYtPm5hbWUpOwogCiAJcG0gPSB2d3JxLT5kaXNhYmxlZCA/IFBNX09GRiA6IFBNX01BWDsKIApAQCAtMjQ4NCw3ICsyNDgwLDcgQEAKIHsKIAlpbnQgZXJyb3IsIHBtOwogCi0JV0xfVFJBQ0UoKCIlczogU0lPQ0dJV1BPV0VSXG4iLCBkZXYtPm5hbWUpKTsKKwlXTF9UUkFDRSgiJXM6IFNJT0NHSVdQT1dFUlxuIiwgZGV2LT5uYW1lKTsKIAogCWVycm9yID0gZGV2X3dsY19pb2N0bChkZXYsIFdMQ19HRVRfUE0sICZwbSwgc2l6ZW9mKHBtKSk7CiAJaWYgKGVycm9yKQpAQCAtMjUwMyw3ICsyNDk5LDcgQEAKIAkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywgc3RydWN0IGl3X3BvaW50ICppd3AsIGNoYXIgKmV4dHJhKQogewogCi0JV0xfVFJBQ0UoKCIlczogU0lPQ1NJV0dFTklFXG4iLCBkZXYtPm5hbWUpKTsKKwlXTF9UUkFDRSgiJXM6IFNJT0NTSVdHRU5JRVxuIiwgZGV2LT5uYW1lKTsKIAogCUNIRUNLX0VYVFJBX0ZPUl9OVUxMKGV4dHJhKTsKIApAQCAtMjUxNiw3ICsyNTEyLDcgQEAKIHdsX2l3X2dldF93cGFpZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAogCQlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLCBzdHJ1Y3QgaXdfcG9pbnQgKml3cCwgY2hhciAqZXh0cmEpCiB7Ci0JV0xfVFJBQ0UoKCIlczogU0lPQ0dJV0dFTklFXG4iLCBkZXYtPm5hbWUpKTsKKwlXTF9UUkFDRSgiJXM6IFNJT0NHSVdHRU5JRVxuIiwgZGV2LT5uYW1lKTsKIAlpd3AtPmxlbmd0aCA9IDY0OwogCWRldl93bGNfYnVmdmFyX2dldChkZXYsICJ3cGFpZSIsIGV4dHJhLCBpd3AtPmxlbmd0aCk7CiAJcmV0dXJuIDA7CkBAIC0yNTMxLDcgKzI1MjcsNyBAQAogCWludCBlcnJvcjsKIAlzdHJ1Y3QgaXdfZW5jb2RlX2V4dCAqaXdlOwogCi0JV0xfVFJBQ0UoKCIlczogU0lPQ1NJV0VOQ09ERUVYVFxuIiwgZGV2LT5uYW1lKSk7CisJV0xfVFJBQ0UoIiVzOiBTSU9DU0lXRU5DT0RFRVhUXG4iLCBkZXYtPm5hbWUpOwogCiAJQ0hFQ0tfRVhUUkFfRk9SX05VTEwoZXh0cmEpOwogCkBAIC0yNTQ4LDE0ICsyNTQ0LDE0IEBACiAKIAlrZXkubGVuID0gaXdlLT5rZXlfbGVuOwogCi0JaWYgKCFFVEhFUl9JU01VTFRJKGl3ZS0+YWRkci5zYV9kYXRhKSkKKwlpZiAoIWlzX211bHRpY2FzdF9ldGhlcl9hZGRyKGl3ZS0+YWRkci5zYV9kYXRhKSkKIAkJYmNvcHkoKHZvaWQgKikmaXdlLT5hZGRyLnNhX2RhdGEsIChjaGFyICopJmtleS5lYSwKLQkJICAgICAgRVRIRVJfQUREUl9MRU4pOworCQkgICAgICBFVEhfQUxFTik7CiAKIAlpZiAoa2V5LmxlbiA9PSAwKSB7CiAJCWlmIChpd2UtPmV4dF9mbGFncyAmIElXX0VOQ09ERV9FWFRfU0VUX1RYX0tFWSkgewotCQkJV0xfV1NFQygoIkNoYW5naW5nIHRoZSB0aGUgcHJpbWFyeSBLZXkgdG8gJWRcbiIsCi0JCQkJIGtleS5pbmRleCkpOworCQkJV0xfV1NFQygiQ2hhbmdpbmcgdGhlIHRoZSBwcmltYXJ5IEtleSB0byAlZFxuIiwKKwkJCQlrZXkuaW5kZXgpOwogCQkJa2V5LmluZGV4ID0gaHRvZDMyKGtleS5pbmRleCk7CiAJCQllcnJvciA9IGRldl93bGNfaW9jdGwoZGV2LCBXTENfU0VUX0tFWV9QUklNQVJZLAogCQkJCQkgICAgICAma2V5LmluZGV4LCBzaXplb2Yoa2V5LmluZGV4KSk7CkBAIC0yNTY5LDkgKzI1NjUsOSBAQAogCQlpZiAoaXdlLT5rZXlfbGVuID4gc2l6ZW9mKGtleS5kYXRhKSkKIAkJCXJldHVybiAtRUlOVkFMOwogCi0JCVdMX1dTRUMoKCJTZXR0aW5nIHRoZSBrZXkgaW5kZXggJWRcbiIsIGtleS5pbmRleCkpOworCQlXTF9XU0VDKCJTZXR0aW5nIHRoZSBrZXkgaW5kZXggJWRcbiIsIGtleS5pbmRleCk7CiAJCWlmIChpd2UtPmV4dF9mbGFncyAmIElXX0VOQ09ERV9FWFRfU0VUX1RYX0tFWSkgewotCQkJV0xfV1NFQygoImtleSBpcyBhIFByaW1hcnkgS2V5XG4iKSk7CisJCQlXTF9XU0VDKCJrZXkgaXMgYSBQcmltYXJ5IEtleVxuIik7CiAJCQlrZXkuZmxhZ3MgPSBXTF9QUklNQVJZX0tFWTsKIAkJfQogCkBAIC0yNjM4LDE1ICsyNjM0LDE1IEBACiAJdWludCBpOwogCWludCByZXQgPSAwOwogCi0JV0xfV1NFQygoIiVzOiBTSU9DU0lXUE1LU0FcbiIsIGRldi0+bmFtZSkpOworCVdMX1dTRUMoIiVzOiBTSU9DU0lXUE1LU0FcbiIsIGRldi0+bmFtZSk7CiAKIAlDSEVDS19FWFRSQV9GT1JfTlVMTChleHRyYSk7CiAKIAlpd3Bta3NhID0gKHN0cnVjdCBpd19wbWtzYSAqKWV4dHJhOwogCiAJaWYgKGl3cG1rc2EtPmNtZCA9PSBJV19QTUtTQV9GTFVTSCkgewotCQlXTF9XU0VDKCgid2xfaXdfc2V0X3Bta3NhIC0gSVdfUE1LU0FfRkxVU0hcbiIpKTsKLQkJYnplcm8oKGNoYXIgKikmcG1raWRfbGlzdCwgc2l6ZW9mKHBta2lkX2xpc3QpKTsKKwkJV0xfV1NFQygid2xfaXdfc2V0X3Bta3NhIC0gSVdfUE1LU0FfRkxVU0hcbiIpOworCQltZW1zZXQoKGNoYXIgKikmcG1raWRfbGlzdCwgMCwgc2l6ZW9mKHBta2lkX2xpc3QpKTsKIAl9CiAKIAllbHNlIGlmIChpd3Bta3NhLT5jbWQgPT0gSVdfUE1LU0FfUkVNT1ZFKSB7CkBAIC0yNjU2LDMwICsyNjUyLDMwIEBACiAJCQlwbWtpZHB0ciA9ICZwbWtpZDsKIAogCQkJYmNvcHkoJml3cG1rc2EtPmJzc2lkLnNhX2RhdGFbMF0sCi0JCQkgICAgICAmcG1raWRwdHItPnBta2lkWzBdLkJTU0lELCBFVEhFUl9BRERSX0xFTik7CisJCQkgICAgICAmcG1raWRwdHItPnBta2lkWzBdLkJTU0lELCBFVEhfQUxFTik7CiAJCQliY29weSgmaXdwbWtzYS0+cG1raWRbMF0sICZwbWtpZHB0ci0+cG1raWRbMF0uUE1LSUQsCiAJCQkgICAgICBXUEEyX1BNS0lEX0xFTik7CiAKLQkJCVdMX1dTRUMoKCJ3bF9pd19zZXRfcG1rc2E6SVdfUE1LU0FfUkVNT1ZFOlBNS0lEOiAiCi0JCQkJIiVwTSA9ICIsICZwbWtpZHB0ci0+cG1raWRbMF0uQlNTSUQpKTsKKwkJCVdMX1dTRUMoIndsX2l3X3NldF9wbWtzYTpJV19QTUtTQV9SRU1PVkU6UE1LSUQ6ICVwTSA9ICIsCisJCQkJJnBta2lkcHRyLT5wbWtpZFswXS5CU1NJRCk7CiAJCQlmb3IgKGogPSAwOyBqIDwgV1BBMl9QTUtJRF9MRU47IGorKykKLQkJCQlXTF9XU0VDKCgiJTAyeCAiLCBwbWtpZHB0ci0+cG1raWRbMF0uUE1LSURbal0pKTsKLQkJCVdMX1dTRUMoKCJcbiIpKTsKKwkJCQlXTF9XU0VDKCIlMDJ4ICIsIHBta2lkcHRyLT5wbWtpZFswXS5QTUtJRFtqXSk7CisJCQlXTF9XU0VDKCJcbiIpOwogCQl9CiAKIAkJZm9yIChpID0gMDsgaSA8IHBta2lkX2xpc3QucG1raWRzLm5wbWtpZDsgaSsrKQotCQkJaWYgKCFiY21wCisJCQlpZiAoIW1lbWNtcAogCQkJICAgICgmaXdwbWtzYS0+YnNzaWQuc2FfZGF0YVswXSwKLQkJCSAgICAgJnBta2lkX2xpc3QucG1raWRzLnBta2lkW2ldLkJTU0lELCBFVEhFUl9BRERSX0xFTikpCisJCQkgICAgICZwbWtpZF9saXN0LnBta2lkcy5wbWtpZFtpXS5CU1NJRCwgRVRIX0FMRU4pKQogCQkJCWJyZWFrOwogCiAJCWlmICgocG1raWRfbGlzdC5wbWtpZHMubnBta2lkID4gMCkKIAkJICAgICYmIChpIDwgcG1raWRfbGlzdC5wbWtpZHMubnBta2lkKSkgewotCQkJYnplcm8oJnBta2lkX2xpc3QucG1raWRzLnBta2lkW2ldLCBzaXplb2YocG1raWRfdCkpOworCQkJbWVtc2V0KCZwbWtpZF9saXN0LnBta2lkcy5wbWtpZFtpXSwgMCwgc2l6ZW9mKHBta2lkX3QpKTsKIAkJCWZvciAoOyBpIDwgKHBta2lkX2xpc3QucG1raWRzLm5wbWtpZCAtIDEpOyBpKyspIHsKIAkJCQliY29weSgmcG1raWRfbGlzdC5wbWtpZHMucG1raWRbaSArIDFdLkJTU0lELAogCQkJCSAgICAgICZwbWtpZF9saXN0LnBta2lkcy5wbWtpZFtpXS5CU1NJRCwKLQkJCQkgICAgICBFVEhFUl9BRERSX0xFTik7CisJCQkJICAgICAgRVRIX0FMRU4pOwogCQkJCWJjb3B5KCZwbWtpZF9saXN0LnBta2lkcy5wbWtpZFtpICsgMV0uUE1LSUQsCiAJCQkJICAgICAgJnBta2lkX2xpc3QucG1raWRzLnBta2lkW2ldLlBNS0lELAogCQkJCSAgICAgIFdQQTJfUE1LSURfTEVOKTsKQEAgLTI2OTEsMTQgKzI2ODcsMTQgQEAKIAogCWVsc2UgaWYgKGl3cG1rc2EtPmNtZCA9PSBJV19QTUtTQV9BREQpIHsKIAkJZm9yIChpID0gMDsgaSA8IHBta2lkX2xpc3QucG1raWRzLm5wbWtpZDsgaSsrKQotCQkJaWYgKCFiY21wCisJCQlpZiAoIW1lbWNtcAogCQkJICAgICgmaXdwbWtzYS0+YnNzaWQuc2FfZGF0YVswXSwKLQkJCSAgICAgJnBta2lkX2xpc3QucG1raWRzLnBta2lkW2ldLkJTU0lELCBFVEhFUl9BRERSX0xFTikpCisJCQkgICAgICZwbWtpZF9saXN0LnBta2lkcy5wbWtpZFtpXS5CU1NJRCwgRVRIX0FMRU4pKQogCQkJCWJyZWFrOwogCQlpZiAoaSA8IE1BWFBNS0lEKSB7CiAJCQliY29weSgmaXdwbWtzYS0+YnNzaWQuc2FfZGF0YVswXSwKIAkJCSAgICAgICZwbWtpZF9saXN0LnBta2lkcy5wbWtpZFtpXS5CU1NJRCwKLQkJCSAgICAgIEVUSEVSX0FERFJfTEVOKTsKKwkJCSAgICAgIEVUSF9BTEVOKTsKIAkJCWJjb3B5KCZpd3Bta3NhLT5wbWtpZFswXSwKIAkJCSAgICAgICZwbWtpZF9saXN0LnBta2lkcy5wbWtpZFtpXS5QTUtJRCwKIAkJCSAgICAgIFdQQTJfUE1LSURfTEVOKTsKQEAgLTI3MTAsMjUgKzI3MDYsMjUgQEAKIAkJCXVpbnQgajsKIAkJCXVpbnQgazsKIAkJCWsgPSBwbWtpZF9saXN0LnBta2lkcy5ucG1raWQ7Ci0JCQlXTF9XU0VDKCgid2xfaXdfc2V0X3Bta3NhLElXX1BNS1NBX0FERCAtIFBNS0lEOiAlcE0gPSAiLAotCQkJCSZwbWtpZF9saXN0LnBta2lkcy5wbWtpZFtrXS5CU1NJRCkpOworCQkJV0xfV1NFQygid2xfaXdfc2V0X3Bta3NhLElXX1BNS1NBX0FERCAtIFBNS0lEOiAlcE0gPSAiLAorCQkJCSZwbWtpZF9saXN0LnBta2lkcy5wbWtpZFtrXS5CU1NJRCk7CiAJCQlmb3IgKGogPSAwOyBqIDwgV1BBMl9QTUtJRF9MRU47IGorKykKLQkJCQlXTF9XU0VDKCgiJTAyeCAiLAotCQkJCQkgcG1raWRfbGlzdC5wbWtpZHMucG1raWRba10uUE1LSURbal0pKTsKLQkJCVdMX1dTRUMoKCJcbiIpKTsKKwkJCQlXTF9XU0VDKCIlMDJ4ICIsCisJCQkJCXBta2lkX2xpc3QucG1raWRzLnBta2lkW2tdLlBNS0lEW2pdKTsKKwkJCVdMX1dTRUMoIlxuIik7CiAJCX0KIAl9Ci0JV0xfV1NFQygoIlBSSU5USU5HIHBta2lkIExJU1QgLSBObyBvZiBlbGVtZW50cyAlZFxuIiwKLQkJIHBta2lkX2xpc3QucG1raWRzLm5wbWtpZCkpOworCVdMX1dTRUMoIlBSSU5USU5HIHBta2lkIExJU1QgLSBObyBvZiBlbGVtZW50cyAlZFxuIiwKKwkJcG1raWRfbGlzdC5wbWtpZHMubnBta2lkKTsKIAlmb3IgKGkgPSAwOyBpIDwgcG1raWRfbGlzdC5wbWtpZHMubnBta2lkOyBpKyspIHsKIAkJdWludCBqOwotCQlXTF9XU0VDKCgiUE1LSURbJWRdOiAlcE0gPSAiLCBpLAotCQkJJnBta2lkX2xpc3QucG1raWRzLnBta2lkW2ldLkJTU0lEKSk7CisJCVdMX1dTRUMoIlBNS0lEWyVkXTogJXBNID0gIiwKKwkJCWksICZwbWtpZF9saXN0LnBta2lkcy5wbWtpZFtpXS5CU1NJRCk7CiAJCWZvciAoaiA9IDA7IGogPCBXUEEyX1BNS0lEX0xFTjsgaisrKQotCQkJV0xfV1NFQygoIiUwMnggIiwgcG1raWRfbGlzdC5wbWtpZHMucG1raWRbaV0uUE1LSURbal0pKTsKLQkJV0xfV1NFQygoIlxuIikpOworCQkJV0xfV1NFQygiJTAyeCAiLCBwbWtpZF9saXN0LnBta2lkcy5wbWtpZFtpXS5QTUtJRFtqXSk7CisJCVdMX1dTRUMoIlxuIik7CiAJfQotCVdMX1dTRUMoKCJcbiIpKTsKKwlXTF9XU0VDKCJcbiIpOwogCiAJaWYgKCFyZXQpCiAJCXJldCA9IGRldl93bGNfYnVmdmFyX3NldChkZXYsICJwbWtpZF9pbmZvIiwgKGNoYXIgKikmcG1raWRfbGlzdCwKQEAgLTI3NDIsNyArMjczOCw3IEBACiAJCSAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAogCQkgICAgc3RydWN0IGl3X3BhcmFtICp2d3JxLCBjaGFyICpleHRyYSkKIHsKLQlXTF9UUkFDRSgoIiVzOiBTSU9DR0lXRU5DT0RFRVhUXG4iLCBkZXYtPm5hbWUpKTsKKwlXTF9UUkFDRSgiJXM6IFNJT0NHSVdFTkNPREVFWFRcbiIsIGRldi0+bmFtZSk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTI3NTcsMTMgKzI3NTMsMTMgQEAKIAlpbnQgdmFsID0gMDsKIAl3bF9pd190ICppdyA9ICood2xfaXdfdCAqKikgbmV0ZGV2X3ByaXYoZGV2KTsKIAotCVdMX1RSQUNFKCgiJXM6IFNJT0NTSVdBVVRIXG4iLCBkZXYtPm5hbWUpKTsKKwlXTF9UUkFDRSgiJXM6IFNJT0NTSVdBVVRIXG4iLCBkZXYtPm5hbWUpOwogCiAJcGFyYW1pZCA9IHZ3cnEtPmZsYWdzICYgSVdfQVVUSF9JTkRFWDsKIAlwYXJhbXZhbCA9IHZ3cnEtPnZhbHVlOwogCi0JV0xfVFJBQ0UoKCIlczogU0lPQ1NJV0FVVEgsIHBhcmFtaWQgPSAweCUweCwgcGFyYW12YWwgPSAweCUweFxuIiwKLQkJICBkZXYtPm5hbWUsIHBhcmFtaWQsIHBhcmFtdmFsKSk7CisJV0xfVFJBQ0UoIiVzOiBTSU9DU0lXQVVUSCwgcGFyYW1pZCA9IDB4JTB4LCBwYXJhbXZhbCA9IDB4JTB4XG4iLAorCQkgZGV2LT5uYW1lLCBwYXJhbWlkLCBwYXJhbXZhbCk7CiAKIAlzd2l0Y2ggKHBhcmFtaWQpIHsKIAljYXNlIElXX0FVVEhfV1BBX1ZFUlNJT046CkBAIC0yNzczLDggKzI3NjksOCBAQAogCQkJdmFsID0gV1BBX0FVVEhfUFNLIHwgV1BBX0FVVEhfVU5TUEVDSUZJRUQ7CiAJCWVsc2UgaWYgKHBhcmFtdmFsICYgSVdfQVVUSF9XUEFfVkVSU0lPTl9XUEEyKQogCQkJdmFsID0gV1BBMl9BVVRIX1BTSyB8IFdQQTJfQVVUSF9VTlNQRUNJRklFRDsKLQkJV0xfSU5GT1JNKCgiJXM6ICVkOiBzZXR0aW5nIHdwYV9hdXRoIHRvIDB4JTB4XG4iLCBfX2Z1bmNfXywKLQkJCSAgIF9fTElORV9fLCB2YWwpKTsKKwkJV0xfSU5GT1JNKCIlczogJWQ6IHNldHRpbmcgd3BhX2F1dGggdG8gMHglMHhcbiIsCisJCQkgIF9fZnVuY19fLCBfX0xJTkVfXywgdmFsKTsKIAkJZXJyb3IgPSBkZXZfd2xjX2ludHZhcl9zZXQoZGV2LCAid3BhX2F1dGgiLCB2YWwpOwogCQlpZiAoZXJyb3IpCiAJCQlyZXR1cm4gZXJyb3I7CkBAIC0yNzk3LDIwICsyNzkzLDE5IEBACiAJCX0KIAogCQlpZiAoaXctPnByaXZhY3lfaW52b2tlZCAmJiAhdmFsKSB7Ci0JCQlXTF9XU0VDKCgiJXM6ICVzOiAnUHJpdmFjeSBpbnZva2VkJyB0cnVlIGJ1dCBjbGVhcmluZyAiCi0JCQkJIndzZWMsIGFzc3VtaW5nICIgIndlJ3JlIGEgV1BTIGVucm9sbGVlXG4iLAotCQkJCWRldi0+bmFtZSwgX19mdW5jX18pKTsKKwkJCVdMX1dTRUMoIiVzOiAlczogJ1ByaXZhY3kgaW52b2tlZCcgdHJ1ZSBidXQgY2xlYXJpbmcgd3NlYywgYXNzdW1pbmcgd2UncmUgYSBXUFMgZW5yb2xsZWVcbiIsCisJCQkJZGV2LT5uYW1lLCBfX2Z1bmNfXyk7CiAJCQllcnJvciA9IGRldl93bGNfaW50dmFyX3NldChkZXYsICJpc19XUFNfZW5yb2xsZWUiLAogCQkJCQkJCXRydWUpOwogCQkJaWYgKGVycm9yKSB7Ci0JCQkJV0xfV1NFQygoIkZhaWxlZCB0byBzZXQgaXNfV1BTX2Vucm9sbGVlXG4iKSk7CisJCQkJV0xfV1NFQygiRmFpbGVkIHRvIHNldCBpc19XUFNfZW5yb2xsZWVcbiIpOwogCQkJCXJldHVybiBlcnJvcjsKIAkJCX0KIAkJfSBlbHNlIGlmICh2YWwpIHsKIAkJCWVycm9yID0gZGV2X3dsY19pbnR2YXJfc2V0KGRldiwgImlzX1dQU19lbnJvbGxlZSIsCiAJCQkJCQkJZmFsc2UpOwogCQkJaWYgKGVycm9yKSB7Ci0JCQkJV0xfV1NFQygoIkZhaWxlZCB0byBjbGVhciBpc19XUFNfZW5yb2xsZWVcbiIpKTsKKwkJCQlXTF9XU0VDKCJGYWlsZWQgdG8gY2xlYXIgaXNfV1BTX2Vucm9sbGVlXG4iKTsKIAkJCQlyZXR1cm4gZXJyb3I7CiAJCQl9CiAJCX0KQEAgLTI4MzcsOCArMjgzMiw4IEBACiAJCQllbHNlCiAJCQkJdmFsID0gV1BBMl9BVVRIX1VOU1BFQ0lGSUVEOwogCQl9Ci0JCVdMX0lORk9STSgoIiVzOiAlZDogc2V0dGluZyB3cGFfYXV0aCB0byAlZFxuIiwgX19mdW5jX18sCi0JCQkgICBfX0xJTkVfXywgdmFsKSk7CisJCVdMX0lORk9STSgiJXM6ICVkOiBzZXR0aW5nIHdwYV9hdXRoIHRvICVkXG4iLAorCQkJICBfX2Z1bmNfXywgX19MSU5FX18sIHZhbCk7CiAJCWVycm9yID0gZGV2X3dsY19pbnR2YXJfc2V0KGRldiwgIndwYV9hdXRoIiwgdmFsKTsKIAkJaWYgKGVycm9yKQogCQkJcmV0dXJuIGVycm9yOwpAQCAtMjg1MCw3ICsyODQ1LDcgQEAKIAkJYnJlYWs7CiAKIAljYXNlIElXX0FVVEhfODAyMTFfQVVUSF9BTEc6Ci0JCVdMX0lORk9STSgoIlNldHRpbmcgdGhlIEQxMWF1dGggJWRcbiIsIHBhcmFtdmFsKSk7CisJCVdMX0lORk9STSgiU2V0dGluZyB0aGUgRDExYXV0aCAlZFxuIiwgcGFyYW12YWwpOwogCQlpZiAocGFyYW12YWwgPT0gSVdfQVVUSF9BTEdfT1BFTl9TWVNURU0pCiAJCQl2YWwgPSAwOwogCQllbHNlIGlmIChwYXJhbXZhbCA9PSBJV19BVVRIX0FMR19TSEFSRURfS0VZKQpAQCAtMjg3OSw4ICsyODc0LDggQEAKIAkJCQlkZXZfd2xjX2ludHZhcl9zZXQoZGV2LCAid3NlYyIsIHZhbCk7CiAJCQl9CiAJCQl2YWwgPSAwOwotCQkJV0xfSU5GT1JNKCgiJXM6ICVkOiBzZXR0aW5nIHdwYV9hdXRoIHRvICVkXG4iLAotCQkJCSAgIF9fZnVuY19fLCBfX0xJTkVfXywgdmFsKSk7CisJCQlXTF9JTkZPUk0oIiVzOiAlZDogc2V0dGluZyB3cGFfYXV0aCB0byAlZFxuIiwKKwkJCQkgIF9fZnVuY19fLCBfX0xJTkVfXywgdmFsKTsKIAkJCWRldl93bGNfaW50dmFyX3NldChkZXYsICJ3cGFfYXV0aCIsIDApOwogCQkJcmV0dXJuIGVycm9yOwogCQl9CkBAIC0yODk3LDcgKzI4OTIsNyBAQAogCiAjaWYgV0lSRUxFU1NfRVhUID4gMTcKIAljYXNlIElXX0FVVEhfUk9BTUlOR19DT05UUk9MOgotCQlXTF9JTkZPUk0oKCIlczogSVdfQVVUSF9ST0FNSU5HX0NPTlRST0xcbiIsIF9fZnVuY19fKSk7CisJCVdMX0lORk9STSgiJXM6IElXX0FVVEhfUk9BTUlOR19DT05UUk9MXG4iLCBfX2Z1bmNfXyk7CiAJCWJyZWFrOwogCWNhc2UgSVdfQVVUSF9QUklWQUNZX0lOVk9LRUQ6CiAJCXsKQEAgLTI5MDgsOCArMjkwMyw3IEBACiAJCQkJZXJyb3IgPSBkZXZfd2xjX2ludHZhcl9zZXQoZGV2LAogCQkJCQkJImlzX1dQU19lbnJvbGxlZSIsIGZhbHNlKTsKIAkJCQlpZiAoZXJyb3IpIHsKLQkJCQkJV0xfV1NFQygoIkZhaWxlZCB0byBjbGVhciBpb3ZhciAiCi0JCQkJCQkiaXNfV1BTX2Vucm9sbGVlXG4iKSk7CisJCQkJCVdMX1dTRUMoIkZhaWxlZCB0byBjbGVhciBpb3ZhciBpc19XUFNfZW5yb2xsZWVcbiIpOwogCQkJCQlyZXR1cm4gZXJyb3I7CiAJCQkJfQogCQkJfSBlbHNlIHsKQEAgLTI5MjMsOCArMjkxNyw3IEBACiAJCQkJCQkJImlzX1dQU19lbnJvbGxlZSIsCiAJCQkJCQkJdHJ1ZSk7CiAJCQkJCWlmIChlcnJvcikgewotCQkJCQkJV0xfV1NFQygoIkZhaWxlZCB0byBzZXQgaW92YXIgIgotCQkJCQkJImlzX1dQU19lbnJvbGxlZVxuIikpOworCQkJCQkJV0xfV1NFQygiRmFpbGVkIHRvIHNldCBpb3ZhciBpc19XUFNfZW5yb2xsZWVcbiIpOwogCQkJCQkJcmV0dXJuIGVycm9yOwogCQkJCQl9CiAJCQkJfSBlbHNlIHsKQEAgLTI5MzIsOCArMjkyNSw3IEBACiAJCQkJCQkJImlzX1dQU19lbnJvbGxlZSIsCiAJCQkJCQkJZmFsc2UpOwogCQkJCQlpZiAoZXJyb3IpIHsKLQkJCQkJCVdMX1dTRUMoKCJGYWlsZWQgdG8gY2xlYXIgIgotCQkJCQkJCSJpc19XUFNfZW5yb2xsZWVcbiIpKTsKKwkJCQkJCVdMX1dTRUMoIkZhaWxlZCB0byBjbGVhciBpc19XUFNfZW5yb2xsZWVcbiIpOwogCQkJCQkJcmV0dXJuIGVycm9yOwogCQkJCQl9CiAJCQkJfQpAQCAtMjk2MCw3ICsyOTUyLDcgQEAKIAlpbnQgdmFsOwogCXdsX2l3X3QgKml3ID0gKih3bF9pd190ICoqKSBuZXRkZXZfcHJpdihkZXYpOwogCi0JV0xfVFJBQ0UoKCIlczogU0lPQ0dJV0FVVEhcbiIsIGRldi0+bmFtZSkpOworCVdMX1RSQUNFKCIlczogU0lPQ0dJV0FVVEhcbiIsIGRldi0+bmFtZSk7CiAKIAlwYXJhbWlkID0gdndycS0+ZmxhZ3MgJiBJV19BVVRIX0lOREVYOwogCkBAIC0zMDQwLDcgKzMwMzIsNyBAQAogCQlicmVhazsKICNpZiBXSVJFTEVTU19FWFQgPiAxNwogCWNhc2UgSVdfQVVUSF9ST0FNSU5HX0NPTlRST0w6Ci0JCVdMX0VSUk9SKCgiJXM6IElXX0FVVEhfUk9BTUlOR19DT05UUk9MXG4iLCBfX2Z1bmNfXykpOworCQlXTF9FUlJPUigiJXM6IElXX0FVVEhfUk9BTUlOR19DT05UUk9MXG4iLCBfX2Z1bmNfXyk7CiAJCWJyZWFrOwogCWNhc2UgSVdfQVVUSF9QUklWQUNZX0lOVk9LRUQ6CiAJCXBhcmFtdmFsID0gaXctPnByaXZhY3lfaW52b2tlZDsKQEAgLTMxNTcsMTkgKzMxNDksMTkgQEAKIAljaGFyICpleHRyYSA9IE5VTEw7CiAJaW50IHRva2VuX3NpemUgPSAxLCBtYXhfdG9rZW5zID0gMCwgcmV0ID0gMDsKIAotCVdMX1RSQUNFKCgiXG4lcywgY21kOiV4IGFsbGVkIHZpYSBkaGQtPmRvX2lvY3RsKCllbnRyeSBwb2ludFxuIiwKLQkJICBfX2Z1bmNfXywgY21kKSk7CisJV0xfVFJBQ0UoIlxuJXMsIGNtZDoleCBhbGxlZCB2aWEgZGhkLT5kb19pb2N0bCgpZW50cnkgcG9pbnRcbiIsCisJCSBfX2Z1bmNfXywgY21kKTsKIAlpZiAoY21kIDwgU0lPQ0lXRklSU1QgfHwKIAkJSVdfSU9DVExfSURYKGNtZCkgPj0gQVJSQVlfU0laRSh3bF9pd19oYW5kbGVyKSkgewotCQlXTF9FUlJPUigoIiVzOiBlcnJvciBpbiBjbWQ9JXggOiBvdXQgb2YgcmFuZ2VcbiIsIF9fZnVuY19fLAotCQkJY21kKSk7CisJCVdMX0VSUk9SKCIlczogZXJyb3IgaW4gY21kPSV4IDogb3V0IG9mIHJhbmdlXG4iLAorCQkJIF9fZnVuY19fLCBjbWQpOwogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAJfQogCiAJaGFuZGxlciA9IHdsX2l3X2hhbmRsZXJbSVdfSU9DVExfSURYKGNtZCldOwogCWlmICghaGFuZGxlcikgewotCQlXTF9FUlJPUigoIiVzOiBlcnJvciBpbiBjbWQ9JXggOiBub3Qgc3VwcG9ydGVkXG4iLAotCQkJX19mdW5jX18sIGNtZCkpOworCQlXTF9FUlJPUigiJXM6IGVycm9yIGluIGNtZD0leCA6IG5vdCBzdXBwb3J0ZWRcbiIsCisJCQkgX19mdW5jX18sIGNtZCk7CiAJCXJldHVybiAtRU9QTk9UU1VQUDsKIAl9CiAKQEAgLTMyMzQsOSArMzIyNiw4IEBACiAKIAlpZiAobWF4X3Rva2VucyAmJiB3cnEtPnUuZGF0YS5wb2ludGVyKSB7CiAJCWlmICh3cnEtPnUuZGF0YS5sZW5ndGggPiBtYXhfdG9rZW5zKSB7Ci0JCQlXTF9FUlJPUigoIiVzOiBlcnJvciBpbiBjbWQ9JXggd3JxLT51LmRhdGEubGVuZ3RoPSVkICIKLQkJCSI+IG1heF90b2tlbnM9JWRcbiIsCi0JCQlfX2Z1bmNfXywgY21kLCB3cnEtPnUuZGF0YS5sZW5ndGgsIG1heF90b2tlbnMpKTsKKwkJCVdMX0VSUk9SKCIlczogZXJyb3IgaW4gY21kPSV4IHdycS0+dS5kYXRhLmxlbmd0aD0lZCA+IG1heF90b2tlbnM9JWRcbiIsCisJCQkJIF9fZnVuY19fLCBjbWQsIHdycS0+dS5kYXRhLmxlbmd0aCwgbWF4X3Rva2Vucyk7CiAJCQlyZXR1cm4gLUUyQklHOwogCQl9CiAJCWV4dHJhID0ga21hbGxvYyhtYXhfdG9rZW5zICogdG9rZW5fc2l6ZSwgR0ZQX0tFUk5FTCk7CkBAIC0zMzM5LDcgKzMzMzAsNyBAQAogCQltZW1zZXQoc3RyaW5nQnVmLCAwLCBidWZsZW4pOwogCQlzbnByaW50ZihzdHJpbmdCdWYsIGJ1ZmxlbiwgIiVzICVzICUwMmQgJTAyZCIsCiAJCQkgbmFtZSwgY2F1c2UsIHN0YXR1cywgcmVhc29uKTsKLQkJV0xfSU5GT1JNKCgiQ29ubmVjdGlvbiBzdGF0dXM6ICVzXG4iLCBzdHJpbmdCdWYpKTsKKwkJV0xfSU5GT1JNKCJDb25uZWN0aW9uIHN0YXR1czogJXNcbiIsIHN0cmluZ0J1Zik7CiAJCXJldHVybiB0cnVlOwogCX0gZWxzZSB7CiAJCXJldHVybiBmYWxzZTsKQEAgLTMzODMsNDYgKzMzNzQsNDYgQEAKIAlpdyA9IDA7CiAKIAlpZiAoIWRldikgewotCQlXTF9FUlJPUigoIiVzOiBkZXYgaXMgbnVsbFxuIiwgX19mdW5jX18pKTsKKwkJV0xfRVJST1IoIiVzOiBkZXYgaXMgbnVsbFxuIiwgX19mdW5jX18pOwogCQlyZXR1cm47CiAJfQogCiAJaXcgPSAqKHdsX2l3X3QgKiopIG5ldGRldl9wcml2KGRldik7CiAKLQlXTF9UUkFDRSgoIiVzOiBkZXY9JXMgZXZlbnQ9JWRcbiIsIF9fZnVuY19fLCBkZXYtPm5hbWUsIGV2ZW50X3R5cGUpKTsKKwlXTF9UUkFDRSgiJXM6IGRldj0lcyBldmVudD0lZFxuIiwgX19mdW5jX18sIGRldi0+bmFtZSwgZXZlbnRfdHlwZSk7CiAKIAlzd2l0Y2ggKGV2ZW50X3R5cGUpIHsKIAljYXNlIFdMQ19FX1RYRkFJTDoKIAkJY21kID0gSVdFVlRYRFJPUDsKLQkJbWVtY3B5KHdycXUuYWRkci5zYV9kYXRhLCAmZS0+YWRkciwgRVRIRVJfQUREUl9MRU4pOworCQltZW1jcHkod3JxdS5hZGRyLnNhX2RhdGEsICZlLT5hZGRyLCBFVEhfQUxFTik7CiAJCXdycXUuYWRkci5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7CiAJCWJyZWFrOwogI2lmIFdJUkVMRVNTX0VYVCA+IDE0CiAJY2FzZSBXTENfRV9KT0lOOgogCWNhc2UgV0xDX0VfQVNTT0NfSU5EOgogCWNhc2UgV0xDX0VfUkVBU1NPQ19JTkQ6Ci0JCW1lbWNweSh3cnF1LmFkZHIuc2FfZGF0YSwgJmUtPmFkZHIsIEVUSEVSX0FERFJfTEVOKTsKKwkJbWVtY3B5KHdycXUuYWRkci5zYV9kYXRhLCAmZS0+YWRkciwgRVRIX0FMRU4pOwogCQl3cnF1LmFkZHIuc2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOwogCQljbWQgPSBJV0VWUkVHSVNURVJFRDsKIAkJYnJlYWs7CiAJY2FzZSBXTENfRV9ERUFVVEhfSU5EOgogCWNhc2UgV0xDX0VfRElTQVNTT0NfSU5EOgogCQljbWQgPSBTSU9DR0lXQVA7Ci0JCWJ6ZXJvKHdycXUuYWRkci5zYV9kYXRhLCBFVEhFUl9BRERSX0xFTik7CisJCW1lbXNldCh3cnF1LmFkZHIuc2FfZGF0YSwgMCwgRVRIX0FMRU4pOwogCQl3cnF1LmFkZHIuc2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOwotCQliemVybygmZXh0cmEsIEVUSEVSX0FERFJfTEVOKTsKKwkJbWVtc2V0KCZleHRyYSwgMCwgRVRIX0FMRU4pOwogCQlicmVhazsKIAljYXNlIFdMQ19FX0xJTks6CiAJY2FzZSBXTENfRV9ORElTX0xJTks6CiAJCWNtZCA9IFNJT0NHSVdBUDsKIAkJaWYgKCEoZmxhZ3MgJiBXTENfRVZFTlRfTVNHX0xJTkspKSB7Ci0JCQliemVybyh3cnF1LmFkZHIuc2FfZGF0YSwgRVRIRVJfQUREUl9MRU4pOwotCQkJYnplcm8oJmV4dHJhLCBFVEhFUl9BRERSX0xFTik7CisJCQltZW1zZXQod3JxdS5hZGRyLnNhX2RhdGEsIDAsIEVUSF9BTEVOKTsKKwkJCW1lbXNldCgmZXh0cmEsIDAsIEVUSF9BTEVOKTsKIAkJCVdBS0VfTE9DS19USU1FT1VUKGl3LT5wdWIsIFdBS0VfTE9DS19MSU5LX0RPV05fVE1PVVQsCiAJCQkJCSAgMjAgKiBIWik7CiAJCX0gZWxzZSB7Ci0JCQltZW1jcHkod3JxdS5hZGRyLnNhX2RhdGEsICZlLT5hZGRyLCBFVEhFUl9BRERSX0xFTik7Ci0JCQlXTF9UUkFDRSgoIkxpbmsgVVBcbiIpKTsKKwkJCW1lbWNweSh3cnF1LmFkZHIuc2FfZGF0YSwgJmUtPmFkZHIsIEVUSF9BTEVOKTsKKwkJCVdMX1RSQUNFKCJMaW5rIFVQXG4iKTsKIAogCQl9CiAJCXdycXUuYWRkci5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7CkBAIC0zNDMzLDggKzM0MjQsOCBAQAogCQkJd3JxdS5kYXRhLmxlbmd0aCA9IGRhdGFsZW4gKyAxOwogCQkJZXh0cmFbMF0gPSBXTENfRV9BQ1RJT05fRlJBTUU7CiAJCQltZW1jcHkoJmV4dHJhWzFdLCBkYXRhLCBkYXRhbGVuKTsKLQkJCVdMX1RSQUNFKCgiV0xDX0VfQUNUSU9OX0ZSQU1FIGxlbiAlZCBcbiIsCi0JCQkJICB3cnF1LmRhdGEubGVuZ3RoKSk7CisJCQlXTF9UUkFDRSgiV0xDX0VfQUNUSU9OX0ZSQU1FIGxlbiAlZFxuIiwKKwkJCQkgd3JxdS5kYXRhLmxlbmd0aCk7CiAJCX0KIAkJYnJlYWs7CiAKQEAgLTM0NjQsNyArMzQ1NSw3IEBACiAJCQllbHNlCiAJCQkJbWljZXJyZXZ0LT5mbGFncyB8PSBJV19NSUNGQUlMVVJFX1BBSVJXSVNFOwogCQkJbWVtY3B5KG1pY2VycmV2dC0+c3JjX2FkZHIuc2FfZGF0YSwgJmUtPmFkZHIsCi0JCQkgICAgICAgRVRIRVJfQUREUl9MRU4pOworCQkJICAgICAgIEVUSF9BTEVOKTsKIAkJCW1pY2VycmV2dC0+c3JjX2FkZHIuc2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOwogCiAJCQlicmVhazsKQEAgLTM0ODcsMTQgKzM0NzgsMTQgQEAKIAkJCQl3cnF1LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHN0cnVjdCBpd19wbWtpZF9jYW5kKTsKIAkJCQlwbWtpZGNhbmQgPSBwbWtjYW5kbGlzdC0+cG1raWRfY2FuZDsKIAkJCQl3aGlsZSAoY291bnQpIHsKLQkJCQkJYnplcm8oaXdwbWtpZGNhbmQsCisJCQkJCW1lbXNldChpd3Bta2lkY2FuZCwgMCwKIAkJCQkJICAgICAgc2l6ZW9mKHN0cnVjdCBpd19wbWtpZF9jYW5kKSk7CiAJCQkJCWlmIChwbWtpZGNhbmQtPnByZWF1dGgpCiAJCQkJCQlpd3Bta2lkY2FuZC0+ZmxhZ3MgfD0KIAkJCQkJCSAgICBJV19QTUtJRF9DQU5EX1BSRUFVVEg7CiAJCQkJCWJjb3B5KCZwbWtpZGNhbmQtPkJTU0lELAogCQkJCQkgICAgICAmaXdwbWtpZGNhbmQtPmJzc2lkLnNhX2RhdGEsCi0JCQkJCSAgICAgIEVUSEVSX0FERFJfTEVOKTsKKwkJCQkJICAgICAgRVRIX0FMRU4pOwogI2lmbmRlZiBTQU5ER0FURTJHCiAJCQkJCXdpcmVsZXNzX3NlbmRfZXZlbnQoZGV2LCBjbWQsICZ3cnF1LAogCQkJCQkJCSAgICBleHRyYSk7CkBAIC0zNTE1LDEzICszNTA2LDEzIEBACiAJCX0gZWxzZSB7CiAJCQljbWQgPSBTSU9DR0lXU0NBTjsKIAkJCXdycXUuZGF0YS5sZW5ndGggPSBzdHJsZW4oZXh0cmEpOwotCQkJV0xfVFJBQ0UoKCJFdmVudCBXTENfRV9TQ0FOX0NPTVBMRVRFIGZyb20gc3BlY2lmaWMgIgotCQkJCSJzY2FuICVkXG4iLCBnX2lzY2FuLT5pc2Nhbl9zdGF0ZSkpOworCQkJV0xfVFJBQ0UoIkV2ZW50IFdMQ19FX1NDQU5fQ09NUExFVEUgZnJvbSBzcGVjaWZpYyBzY2FuICVkXG4iLAorCQkJCSBnX2lzY2FuLT5pc2Nhbl9zdGF0ZSk7CiAJCX0KICNlbHNlCiAJCWNtZCA9IFNJT0NHSVdTQ0FOOwogCQl3cnF1LmRhdGEubGVuZ3RoID0gc3RybGVuKGV4dHJhKTsKLQkJV0xfVFJBQ0UoKCJFdmVudCBXTENfRV9TQ0FOX0NPTVBMRVRFXG4iKSk7CisJCVdMX1RSQUNFKCJFdmVudCBXTENfRV9TQ0FOX0NPTVBMRVRFXG4iKTsKICNlbmRpZgogCQlicmVhazsKIApAQCAtMzUyOSw5ICszNTIwLDkgQEAKIAkJewogCQkJd2xjX3NzaWRfdCAqc3NpZDsKIAkJCXNzaWQgPSAod2xjX3NzaWRfdCAqKSBkYXRhOwotCQkJV0xfRVJST1IoKCIlcyBFdmVudCBXTENfRV9QRk5fTkVUX0ZPVU5ELCBzZW5kICVzIHVwIDogIgotCQkJCSJmaW5kICVzIGxlbj0lZFxuIiwgX19mdW5jX18sIFBOT19FVkVOVF9VUCwKLQkJCQlzc2lkLT5TU0lELCBzc2lkLT5TU0lEX2xlbikpOworCQkJV0xfRVJST1IoIiVzIEV2ZW50IFdMQ19FX1BGTl9ORVRfRk9VTkQsIHNlbmQgJXMgdXAgOiBmaW5kICVzIGxlbj0lZFxuIiwKKwkJCQkgX19mdW5jX18sIFBOT19FVkVOVF9VUCwKKwkJCQkgc3NpZC0+U1NJRCwgc3NpZC0+U1NJRF9sZW4pOwogCQkJV0FLRV9MT0NLX1RJTUVPVVQoaXctPnB1YiwgV0FLRV9MT0NLX1BOT19GSU5EX1RNT1VULAogCQkJCQkgIDIwICogSFopOwogCQkJY21kID0gSVdFVkNVU1RPTTsKQEAgLTM1NDIsNyArMzUzMyw3IEBACiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKLQkJV0xfVFJBQ0UoKCJVbmtub3duIEV2ZW50ICVkOiBpZ25vcmluZ1xuIiwgZXZlbnRfdHlwZSkpOworCQlXTF9UUkFDRSgiVW5rbm93biBFdmVudCAlZDogaWdub3JpbmdcbiIsIGV2ZW50X3R5cGUpOwogCQlicmVhazsKIAl9CiAjaWZuZGVmIFNBTkRHQVRFMkcKQEAgLTM1ODMsMTUgKzM1NzQsMTUgQEAKIAkJZ290byBkb25lOwogCiAJcGh5X25vaXNlID0gZHRvaDMyKHBoeV9ub2lzZSk7Ci0JV0xfVFJBQ0UoKCJ3bF9pd19nZXRfd2lyZWxlc3Nfc3RhdHMgcGh5IG5vaXNlPSVkXG4iLCBwaHlfbm9pc2UpKTsKKwlXTF9UUkFDRSgid2xfaXdfZ2V0X3dpcmVsZXNzX3N0YXRzIHBoeSBub2lzZT0lZFxuIiwgcGh5X25vaXNlKTsKIAotCWJ6ZXJvKCZzY2JfdmFsLCBzaXplb2Yoc2NiX3ZhbF90KSk7CisJbWVtc2V0KCZzY2JfdmFsLCAwLCBzaXplb2Yoc2NiX3ZhbF90KSk7CiAJcmVzID0gZGV2X3dsY19pb2N0bChkZXYsIFdMQ19HRVRfUlNTSSwgJnNjYl92YWwsIHNpemVvZihzY2JfdmFsX3QpKTsKIAlpZiAocmVzKQogCQlnb3RvIGRvbmU7CiAKIAlyc3NpID0gZHRvaDMyKHNjYl92YWwudmFsKTsKLQlXTF9UUkFDRSgoIndsX2l3X2dldF93aXJlbGVzc19zdGF0cyByc3NpPSVkXG4iLCByc3NpKSk7CisJV0xfVFJBQ0UoIndsX2l3X2dldF93aXJlbGVzc19zdGF0cyByc3NpPSVkXG4iLCByc3NpKTsKIAlpZiAocnNzaSA8PSBXTF9JV19SU1NJX05PX1NJR05BTCkKIAkJd3N0YXRzLT5xdWFsLnF1YWwgPSAwOwogCWVsc2UgaWYgKHJzc2kgPD0gV0xfSVdfUlNTSV9WRVJZX0xPVykKQEAgLTM2MTQsMjMgKzM2MDUsMjEgQEAKICNlbmRpZgogCiAjaWYgV0lSRUxFU1NfRVhUID4gMTEKLQlXTF9UUkFDRSgoIndsX2l3X2dldF93aXJlbGVzc19zdGF0cyBjb3VudGVycz0lZFxuIiwKLQkJICAoaW50KXNpemVvZih3bF9jbnRfdCkpKTsKKwlXTF9UUkFDRSgid2xfaXdfZ2V0X3dpcmVsZXNzX3N0YXRzIGNvdW50ZXJzPSV6dVxuIiwgc2l6ZW9mKHdsX2NudF90KSk7CiAKIAltZW1zZXQoJmNudCwgMCwgc2l6ZW9mKHdsX2NudF90KSk7CiAJcmVzID0KIAkgICAgZGV2X3dsY19idWZ2YXJfZ2V0KGRldiwgImNvdW50ZXJzIiwgKGNoYXIgKikmY250LCBzaXplb2Yod2xfY250X3QpKTsKIAlpZiAocmVzKSB7Ci0JCVdMX0VSUk9SKCgid2xfaXdfZ2V0X3dpcmVsZXNzX3N0YXRzIGNvdW50ZXJzIGZhaWxlZCBlcnJvcj0lZFxuIiwKLQkJCSAgcmVzKSk7CisJCVdMX0VSUk9SKCJ3bF9pd19nZXRfd2lyZWxlc3Nfc3RhdHMgY291bnRlcnMgZmFpbGVkIGVycm9yPSVkXG4iLAorCQkJIHJlcyk7CiAJCWdvdG8gZG9uZTsKIAl9CiAKIAljbnQudmVyc2lvbiA9IGR0b2gxNihjbnQudmVyc2lvbik7CiAJaWYgKGNudC52ZXJzaW9uICE9IFdMX0NOVF9UX1ZFUlNJT04pIHsKLQkJV0xfVFJBQ0UoKCJcdEluY29ycmVjdCB2ZXJzaW9uIG9mIGNvdW50ZXJzIHN0cnVjdDogZXhwZWN0ZWQgIgotCQkJIiVkOyBnb3QgJWRcbiIsCi0JCQlXTF9DTlRfVF9WRVJTSU9OLCBjbnQudmVyc2lvbikpOworCQlXTF9UUkFDRSgiXHRJbmNvcnJlY3QgdmVyc2lvbiBvZiBjb3VudGVycyBzdHJ1Y3Q6IGV4cGVjdGVkICVkOyBnb3QgJWRcbiIsCisJCQkgV0xfQ05UX1RfVkVSU0lPTiwgY250LnZlcnNpb24pOwogCQlnb3RvIGRvbmU7CiAJfQogCkBAIC0zNjQxLDIyICszNjMwLDIyIEBACiAJd3N0YXRzLT5kaXNjYXJkLm1pc2MgPSBkdG9oMzIoY250LnJ4cnVudCkgKyBkdG9oMzIoY250LnJ4Z2lhbnQpOwogCXdzdGF0cy0+bWlzcy5iZWFjb24gPSAwOwogCi0JV0xfVFJBQ0UoKCJ3bF9pd19nZXRfd2lyZWxlc3Nfc3RhdHMgY291bnRlcnMgdHhmcmFtZT0lZCB0eGJ5dGU9JWRcbiIsCi0JCSAgZHRvaDMyKGNudC50eGZyYW1lKSwgZHRvaDMyKGNudC50eGJ5dGUpKSk7Ci0JV0xfVFJBQ0UoKCJ3bF9pd19nZXRfd2lyZWxlc3Nfc3RhdHMgY291bnRlcnMgcnhmcm10b29sb25nPSVkXG4iLAotCQkgIGR0b2gzMihjbnQucnhmcm10b29sb25nKSkpOwotCVdMX1RSQUNFKCgid2xfaXdfZ2V0X3dpcmVsZXNzX3N0YXRzIGNvdW50ZXJzIHJ4YmFkcGxjcD0lZFxuIiwKLQkJICBkdG9oMzIoY250LnJ4YmFkcGxjcCkpKTsKLQlXTF9UUkFDRSgoIndsX2l3X2dldF93aXJlbGVzc19zdGF0cyBjb3VudGVycyByeHVuZGVjPSVkXG4iLAotCQkgIGR0b2gzMihjbnQucnh1bmRlYykpKTsKLQlXTF9UUkFDRSgoIndsX2l3X2dldF93aXJlbGVzc19zdGF0cyBjb3VudGVycyByeGZyYWdlcnI9JWRcbiIsCi0JCSAgZHRvaDMyKGNudC5yeGZyYWdlcnIpKSk7Ci0JV0xfVFJBQ0UoKCJ3bF9pd19nZXRfd2lyZWxlc3Nfc3RhdHMgY291bnRlcnMgdHhmYWlsPSVkXG4iLAotCQkgIGR0b2gzMihjbnQudHhmYWlsKSkpOwotCVdMX1RSQUNFKCgid2xfaXdfZ2V0X3dpcmVsZXNzX3N0YXRzIGNvdW50ZXJzIHJ4cnVudD0lZFxuIiwKLQkJICBkdG9oMzIoY250LnJ4cnVudCkpKTsKLQlXTF9UUkFDRSgoIndsX2l3X2dldF93aXJlbGVzc19zdGF0cyBjb3VudGVycyByeGdpYW50PSVkXG4iLAotCQkgIGR0b2gzMihjbnQucnhnaWFudCkpKTsKKwlXTF9UUkFDRSgid2xfaXdfZ2V0X3dpcmVsZXNzX3N0YXRzIGNvdW50ZXJzIHR4ZnJhbWU9JWQgdHhieXRlPSVkXG4iLAorCQkgZHRvaDMyKGNudC50eGZyYW1lKSwgZHRvaDMyKGNudC50eGJ5dGUpKTsKKwlXTF9UUkFDRSgid2xfaXdfZ2V0X3dpcmVsZXNzX3N0YXRzIGNvdW50ZXJzIHJ4ZnJtdG9vbG9uZz0lZFxuIiwKKwkJICBkdG9oMzIoY250LnJ4ZnJtdG9vbG9uZykpOworCVdMX1RSQUNFKCJ3bF9pd19nZXRfd2lyZWxlc3Nfc3RhdHMgY291bnRlcnMgcnhiYWRwbGNwPSVkXG4iLAorCQkgIGR0b2gzMihjbnQucnhiYWRwbGNwKSk7CisJV0xfVFJBQ0UoIndsX2l3X2dldF93aXJlbGVzc19zdGF0cyBjb3VudGVycyByeHVuZGVjPSVkXG4iLAorCQkgIGR0b2gzMihjbnQucnh1bmRlYykpOworCVdMX1RSQUNFKCJ3bF9pd19nZXRfd2lyZWxlc3Nfc3RhdHMgY291bnRlcnMgcnhmcmFnZXJyPSVkXG4iLAorCQkgIGR0b2gzMihjbnQucnhmcmFnZXJyKSk7CisJV0xfVFJBQ0UoIndsX2l3X2dldF93aXJlbGVzc19zdGF0cyBjb3VudGVycyB0eGZhaWw9JWRcbiIsCisJCSAgZHRvaDMyKGNudC50eGZhaWwpKTsKKwlXTF9UUkFDRSgid2xfaXdfZ2V0X3dpcmVsZXNzX3N0YXRzIGNvdW50ZXJzIHJ4cnVudD0lZFxuIiwKKwkJICBkdG9oMzIoY250LnJ4cnVudCkpOworCVdMX1RSQUNFKCJ3bF9pd19nZXRfd2lyZWxlc3Nfc3RhdHMgY291bnRlcnMgcnhnaWFudD0lZFxuIiwKKwkJICBkdG9oMzIoY250LnJ4Z2lhbnQpKTsKICNlbmRpZgkJCQkvKiBXSVJFTEVTU19FWFQgPiAxMSAqLwogCiBkb25lOgpAQCAtMzY5MCw4ICszNjc5LDcgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAJbWVtc2V0KGlzY2FuLCAwLCBzaXplb2YoaXNjYW5faW5mb190KSk7CiAKLQlpc2Nhbi0+aXNjYW5fZXhfcGFyYW1zX3AgPQotCSAgICAod2xfaXNjYW5fcGFyYW1zX3QgKikga21hbGxvYyhwYXJhbXNfc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaXNjYW4tPmlzY2FuX2V4X3BhcmFtc19wID0ga21hbGxvYyhwYXJhbXNfc2l6ZSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFpc2Nhbi0+aXNjYW5fZXhfcGFyYW1zX3ApCiAJCXJldHVybiAtRU5PTUVNOwogCWlzY2FuLT5pc2Nhbl9leF9wYXJhbV9zaXplID0gcGFyYW1zX3NpemU7CkBAIC0zNzIzLDkgKzM3MTEsNyBAQAogCXByaXZfZGV2ID0gZGV2OwogCU1VVEVYX0xPQ0tfU09GVEFQX1NFVF9JTklUKGl3LT5wdWIpOwogI2VuZGlmCi0JZ19zY2FuID0gTlVMTDsKLQotCWdfc2NhbiA9ICh2b2lkICopa21hbGxvYyhHX1NDQU5fUkVTVUxUUywgR0ZQX0tFUk5FTCk7CisJZ19zY2FuID0ga21hbGxvYyhHX1NDQU5fUkVTVUxUUywgR0ZQX0tFUk5FTCk7CiAJaWYgKCFnX3NjYW4pCiAJCXJldHVybiAtRU5PTUVNOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2JyY21mbWFjL3dsX2l3LmggYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2JyY21mbWFjL3dsX2l3LmgKaW5kZXggZWRiZjYxZi4uYzg2MzdjNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtZm1hYy93bF9pdy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbWZtYWMvd2xfaXcuaApAQCAtNzgsNyArNzgsNyBAQAogCiAjZGVmaW5lIENIRUNLX0VYVFJBX0ZPUl9OVUxMKGV4dHJhKSBcCiBpZiAoIWV4dHJhKSB7IFwKLQlXTF9FUlJPUigoIiVzOiBlcnJvciA6IGV4dHJhIGlzIG51bGwgcG9pbnRlclxuIiwgX19mdW5jX18pKTsgXAorCVdMX0VSUk9SKCIlczogZXJyb3IgOiBleHRyYSBpcyBudWxsIHBvaW50ZXJcbiIsIF9fZnVuY19fKTsJXAogCXJldHVybiAtRUlOVkFMOyBcCiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvaW5jbHVkZS9iY21fcnBjLmggYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2luY2x1ZGUvYmNtX3JwYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3N2U1ZDhmLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvaW5jbHVkZS9iY21fcnBjLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDEwIEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKgotICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55Ci0gKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgotICoKLSAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUwotICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZCi0gKiBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKLSAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04KLSAqIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4KLSAqIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0gKi8KLQotI2lmbmRlZiBfQkNNX1JQQ19IXwotI2RlZmluZSBfQkNNX1JQQ19IXwotCi0jaW5jbHVkZSA8cnBjX29zbC5oPgotCi10eXBlZGVmIHN0cnVjdCBycGNfaW5mbyBycGNfaW5mb190OwotdHlwZWRlZiBzdHJ1Y3QgcnBjX2J1ZiBycGNfYnVmX3Q7Ci1zdHJ1Y3QgcnBjX3RyYW5zcG9ydF9pbmZvOwotdHlwZWRlZiB2b2lkICgqcnBjX2Rpc3BhdGNoX2NiX3QpICh2b2lkICpjdHgsIHN0cnVjdCBycGNfYnVmICpidWYpOwotdHlwZWRlZiB2b2lkICgqcnBjX3Jlc3luY19jYl90KSAodm9pZCAqY3R4KTsKLXR5cGVkZWYgdm9pZCAoKnJwY19kb3duX2NiX3QpICh2b2lkICpjdHgpOwotdHlwZWRlZiB2b2lkICgqcnBjX3R4ZG9uZV9jYl90KSAodm9pZCAqY3R4LCBzdHJ1Y3QgcnBjX2J1ZiAqYnVmKTsKLWV4dGVybiBzdHJ1Y3QgcnBjX2luZm8gKmJjbV9ycGNfYXR0YWNoKHZvaWQgKnBkZXYsIG9zbF90ICpvc2gsCi0JCQkJICAgICAgIHN0cnVjdCBycGNfdHJhbnNwb3J0X2luZm8gKnJwY190aCk7Ci0KLWV4dGVybiB2b2lkIGJjbV9ycGNfZGV0YWNoKHN0cnVjdCBycGNfaW5mbyAqcnBjKTsKLWV4dGVybiB2b2lkIGJjbV9ycGNfZG93bihzdHJ1Y3QgcnBjX2luZm8gKnJwYyk7Ci1leHRlcm4gdm9pZCBiY21fcnBjX3dhdGNoZG9nKHN0cnVjdCBycGNfaW5mbyAqcnBjKTsKLQotZXh0ZXJuIHN0cnVjdCBycGNfYnVmICpiY21fcnBjX2J1Zl9hbGxvYyhzdHJ1Y3QgcnBjX2luZm8gKnJwYywgaW50IGxlbik7Ci1leHRlcm4gdm9pZCBiY21fcnBjX2J1Zl9mcmVlKHN0cnVjdCBycGNfaW5mbyAqcnBjLCBzdHJ1Y3QgcnBjX2J1ZiAqYik7Ci0vKiBnZXQgcnBjIHRyYW5zcG9ydCBoYW5kbGUgKi8KLWV4dGVybiBzdHJ1Y3QgcnBjX3RyYW5zcG9ydF9pbmZvICpiY21fcnBjX3RwX2dldChzdHJ1Y3QgcnBjX2luZm8gKnJwYyk7Ci0KLS8qIGNhbGxiYWNrIGZvcjogZGF0YV9yeCwgZG93biwgcmVzeW5jICovCi1leHRlcm4gdm9pZCBiY21fcnBjX3J4Y2JfaW5pdChzdHJ1Y3QgcnBjX2luZm8gKnJwYywgdm9pZCAqY3R4LAotCQkJICAgICAgcnBjX2Rpc3BhdGNoX2NiX3QgY2IsIHZvaWQgKmRuY3R4LAotCQkJICAgICAgcnBjX2Rvd25fY2JfdCBkbmNiLCBycGNfcmVzeW5jX2NiX3QgcmVzeW5jX2NiLAotCQkJICAgICAgcnBjX3R4ZG9uZV9jYl90KTsKLWV4dGVybiB2b2lkIGJjbV9ycGNfcnhjYl9kZWluaXQoc3RydWN0IHJwY19pbmZvICpycGNpKTsKLQotLyogSE9TVCBvciBDTElFTlQgcnBjIGNhbGwsIHJlcXVpcmluZyBubyByZXR1cm4gdmFsdWUgKi8KLWV4dGVybiBpbnQgYmNtX3JwY19jYWxsKHN0cnVjdCBycGNfaW5mbyAqcnBjLCBzdHJ1Y3QgcnBjX2J1ZiAqYik7Ci0KLS8qIEhPU1QgcnBjIGNhbGwsIGRlbWFuZGluZyByZXR1cm4uCi0gKiAgIFRoZSB0aHJlYWQgbWF5IGJlIHN1c3BlbmRlZCBhbmQgY29udHJvbCByZXR1cm5zIGJhY2sgdG8gT1MKLSAqICAgVGhlIHRocmVhZCB3aWxsIHJlc3VtZSh3YWtlZCB1cCkgb24gZWl0aGVyIHRoZSByZXR1cm4gc2lnbmFsIHJlY2VpdmVkIG9yIHRpbWVvdXQKLSAqICAgICBUaGUgaW1wbGVtZW50YXRpb24gZGV0YWlscyBkZXBlbmQgb24gT1MKLSAqLwotZXh0ZXJuIHN0cnVjdCBycGNfYnVmICpiY21fcnBjX2NhbGxfd2l0aF9yZXR1cm4oc3RydWN0IHJwY19pbmZvICpycGMsCi0JCQkJCQlzdHJ1Y3QgcnBjX2J1ZiAqYik7Ci0KLS8qIENMSUVOVCBycGMgY2FsbCB0byByZXNwb25kIHRvIGJjbV9ycGNfY2FsbF93aXRoX3JldHVybiwgcmVxdWlyaW5nIG5vIHJldHVybiB2YWx1ZSAqLwotZXh0ZXJuIGludCBiY21fcnBjX2NhbGxfcmV0dXJuKHN0cnVjdCBycGNfaW5mbyAqcnBjLCBzdHJ1Y3QgcnBjX2J1ZiAqcmV0Yik7Ci0KLWV4dGVybiB1aW50IGJjbV9ycGNfYnVmX2hlYWRlcl9sZW4oc3RydWN0IHJwY19pbmZvICpycGNpKTsKLQotI2RlZmluZSBSUENfUEtUTE9HX1NJWkUJCTUwCS8qIERlcHRoIG9mIHRoZSBoaXN0b3J5ICovCi0jZGVmaW5lIFJQQ19QS1RMT0dfUkRfTEVOCTMKLSNkZWZpbmUgUlBDX1BLVExPR19EVU1QX1NJWkUJMTUwCS8qIGR1bXAgc2l6ZSBzaG91bGQgYmUgbW9yZSB0aGFuIHRoZSBwcm9kdWN0IG9mIGFib3ZlIHR3byAqLwotZXh0ZXJuIGludCBiY21fcnBjX3BrdGxvZ19nZXQoc3RydWN0IHJwY19pbmZvICpycGNpLCB1MzIgKmJ1ZiwKLQkJCSAgICAgIHVpbnQgYnVmX3NpemUsIGJvb2wgc2VuZCk7Ci1leHRlcm4gaW50IGJjbV9ycGNfZHVtcChycGNfaW5mb190ICpycGNpLCBzdHJ1Y3QgYmNtc3RyYnVmICpiKTsKLQotLyogSElHSC9CTUFDOiBiaXQgMTUtODogUlBDIG1vZHVsZSwgYml0IDctMDogVFAgbW9kdWxlICovCi0jZGVmaW5lIFJQQ19FUlJPUl9WQUwJMHgwMDAxCi0jZGVmaW5lIFJQQ19UUkFDRV9WQUwJMHgwMDAyCi0jZGVmaW5lIFJQQ19QS1RUUkFDRV9WQUwgMHgwMDA0Ci0jZGVmaW5lIFJQQ19QS1RMT0dfVkFMCTB4MDAwOAotZXh0ZXJuIHZvaWQgYmNtX3JwY19tc2dsZXZlbF9zZXQoc3RydWN0IHJwY19pbmZvICpycGNpLCB1MTYgbXNnbGV2ZWwsCi0JCQkJIGJvb2wgaGlnaF9sb3cpOwotCi0jZW5kaWYJCQkJLyogX0JDTV9SUENfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvaW5jbHVkZS9iY21fcnBjX3RwLmggYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2luY2x1ZGUvYmNtX3JwY190cC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjhkYzZkLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvaW5jbHVkZS9iY21fcnBjX3RwLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMzcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxMCBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQotICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KLSAqCi0gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKLSAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWQotICogU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCi0gKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OCi0gKiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOCi0gKiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotICovCi0KLSNpZm5kZWYgX2JjbV9ycGNfdHBfaF8KLSNkZWZpbmUgX2JjbV9ycGNfdHBfaF8KLSNpbmNsdWRlIDxiY21fcnBjLmg+Ci0KLSNkZWZpbmUgREJVU19SWF9CVUZGRVJfU0laRV9SUEMJKDIxMDApCS8qIHJ4YnVmc2l6ZSBmb3IgZGJ1c19hdHRhY2gsIGxpbnV4IG9ubHkgZm9yIG5vdyAqLwotCi0jZGVmaW5lIEJDTV9SUENfVFBfRU5DQVBfTEVOCTQJLyogVFAgaGVhZGVyIGlzIDQgYnl0ZXMgKi8KLQotI2RlZmluZSBCQ01fUlBDX1RQX0hPU1RfQUdHX01BU0sJMHhmZmZmMDAwMAotI2RlZmluZSBCQ01fUlBDX1RQX0hPU1RfQUdHX1NISUZUCTE2Ci0jZGVmaW5lIEJDTV9SUENfVFBfSE9TVF9BR0dfQU1QRFUJMHgwMDAxMDAwMAkvKiBIT1NULT5ETkdMIGFtcGR1IGFnZ3JlZ2F0aW9uICovCi0jZGVmaW5lIEJDTV9SUENfVFBfSE9TVF9BR0dfVEVTVAkweDAwMTAwMDAwCS8qIEhPU1QtPkROR0wgdGVzdCBhZ2dyZWdhdGlvbiAqLwotI2RlZmluZSBCQ01fUlBDX1RQX0ROR0xfQUdHX01BU0sJMHgwMDAwZmZmZgotI2RlZmluZSBCQ01fUlBDX1RQX0ROR0xfQUdHX0RQQwkJMHgwMDAwMDAwMQkvKiBETkdMLT5IT1NUIGRhdGEgYWdncmVnYXRpb24gKi8KLSNkZWZpbmUgQkNNX1JQQ19UUF9ETkdMX0FHR19GTE9XQ1RMCTB4MDAwMDAwMDIJLyogRE5HTC0+SE9TVCB0eCBmbG93Y29udHJvbCBhZ2cgKi8KLSNkZWZpbmUgQkNNX1JQQ19UUF9ETkdMX0FHR19URVNUCTB4MDAwMDAwMTAJLyogRE5HTC0+SE9TVCB0ZXN0IGFnZyAqLwotCi0jZGVmaW5lIEJDTV9SUENfVFBfRE5HTF9BR0dfTUFYX1NGUkFNRQkzCS8qIG1heCBhZ2cgc3ViZnJhbWVzLCBtdXN0IGJlIDw9IFVTQl9OVFhEICovCi0jZGVmaW5lIEJDTV9SUENfVFBfRE5HTF9BR0dfTUFYX0JZVEUJNDAwMAkvKiBtYXggYWdnIGJ5dGVzICovCi0KLSNkZWZpbmUgQkNNX1JQQ19UUF9IT1NUX0FHR19NQVhfU0ZSQU1FICAzCS8qIG1heCBhZ2cgc3ViZnJhbWVzLCBBTVBEVSBvbmx5LCAzIGlzIGVub3VnaCAqLwotI2RlZmluZSBCQ01fUlBDX1RQX0hPU1RfQUdHX01BWF9CWVRFICAgIDM0MDAJLyogbWF4IGFnZyBieXRlczsgdG8gZml0IDIrIHRjcC91ZHAgcGt0cy4gRWFjaCBvbmU6Ci0JCQkJCQkgKiA4MDIuM3BrdCArIDgwMi4xMSBoZHIgKyBycGMgaGRyICsgdHAgaGRyIDwgMTcwMEIKLQkJCQkJCSAqIE5lZWQgdG8gYmUgaW4gc3luYyB3aXRoIGRvbmdsZSB1c2IgcnggZG1hCi0JCQkJCQkgKiAgcnhidWZzaXplKFVTQkJVTEtfUlhCVUZfR0lBTlQgaW4gdXNiZGV2X3NiLmMpCi0JCQkJCQkgKi8KLS8qIFRQLURCVVMgcGt0cyBmbG93Y29udHJvbCAqLwotI2RlZmluZSBCQ01fUlBDX1RQX0RCVVNfTlRYUQk1MAkvKiBxdWV1ZSBzaXplIGZvciBUWCBvbiBidWxrIE9VVCwgYWdncmVnYXRpb24gcG9zc2libGUgKi8KLSNkZWZpbmUgQkNNX1JQQ19UUF9EQlVTX05SWFEJNTAJLyogcXVldWUgc2l6ZSBmb3IgUlggb24gYnVsayBJTiwgYWdncmVnYXRpb24gcG9zc2libGUgKi8KLSNkZWZpbmUgQkNNX1JQQ19UUF9EQlVTX05SWFFfQ1RSTAkxCS8qIHF1ZXVlIHNpemUgZm9yIFJYIG9uIGN0bCBFUDAgKi8KLQotI2RlZmluZSBCQ01fUlBDX1RQX0RCVVNfTlJYUV9QS1QJKEJDTV9SUENfVFBfREJVU19OUlhRICogQkNNX1JQQ19UUF9ETkdMX0FHR19NQVhfU0ZSQU1FKQotI2RlZmluZSBCQ01fUlBDX1RQX0RCVVNfTlRYUV9QS1QJKEJDTV9SUENfVFBfREJVU19OVFhRICogQkNNX1JQQ19UUF9IT1NUX0FHR19NQVhfU0ZSQU1FKQotCi10eXBlZGVmIHN0cnVjdCBycGNfdHJhbnNwb3J0X2luZm8gcnBjX3RwX2luZm9fdDsKLQotdHlwZWRlZiB2b2lkICgqcnBjX3R4X2NvbXBsZXRlX2ZuX3QpICh2b2lkICosIHJwY19idWZfdCAqLCBpbnQgc3RhdHVzKTsKLXR5cGVkZWYgdm9pZCAoKnJwY19yeF9mbl90KSAodm9pZCAqLCBycGNfYnVmX3QgKik7Ci0KLSNpZmRlZiBXTENfTE9XCi10eXBlZGVmIHZvaWQgKCpycGNfdHhmbG93Y3RsX2NiX3QpICh2b2lkICpjdHgsIGJvb2wgb24pOwotI2VuZGlmCi0KLWV4dGVybiBycGNfdHBfaW5mb190ICpiY21fcnBjX3RwX2F0dGFjaChvc2xfdCAqb3NoLCB2b2lkICpidXMpOwotZXh0ZXJuIHZvaWQgYmNtX3JwY190cF9kZXRhY2gocnBjX3RwX2luZm9fdCAqcnBjYik7Ci1leHRlcm4gdm9pZCBiY21fcnBjX3RwX2Rvd24ocnBjX3RwX2luZm9fdCAqcnBjYik7Ci1leHRlcm4gdm9pZCBiY21fcnBjX3RwX3dhdGNoZG9nKHJwY190cF9pbmZvX3QgKnJwY2IpOwotCi1leHRlcm4gaW50IGJjbV9ycGNfdHBfYnVmX3NlbmQocnBjX3RwX2luZm9fdCAqcnBjYiwgcnBjX2J1Zl90ICpidWYpOwotCi0vKiBjYWxsYmFjayBmb3IgdHhfY29tcGxldGUsIHJ4X3BrdCAqLwotZXh0ZXJuIHZvaWQgYmNtX3JwY190cF9yZWdpc3Rlcl9jYihycGNfdHBfaW5mb190ICpycGNiLAotCQkJCSAgIHJwY190eF9jb21wbGV0ZV9mbl90IHR4Y21wbHQsCi0JCQkJICAgdm9pZCAqdHhfY29udGV4dCwgcnBjX3J4X2ZuX3Qgcnhwa3QsCi0JCQkJICAgdm9pZCAqcnhfY29udGV4dCwgcnBjX29zbF90ICpycGNfb3NoKTsKLWV4dGVybiB2b2lkIGJjbV9ycGNfdHBfZGVyZWdpc3Rlcl9jYihycGNfdHBfaW5mb190ICpycGNiKTsKLQotLyogQnVmZmVyIG1hbmlwdWxhdGlvbiAqLwotZXh0ZXJuIHVpbnQgYmNtX3JwY19idWZfdHBfaGVhZGVyX2xlbihycGNfdHBfaW5mb190ICpycGNiKTsKLWV4dGVybiBycGNfYnVmX3QgKmJjbV9ycGNfdHBfYnVmX2FsbG9jKHJwY190cF9pbmZvX3QgKnJwY2IsIGludCBsZW4pOwotZXh0ZXJuIHZvaWQgYmNtX3JwY190cF9idWZfZnJlZShycGNfdHBfaW5mb190ICpycGNiLCBycGNfYnVmX3QgKmJ1Zik7Ci1leHRlcm4gaW50IGJjbV9ycGNfYnVmX2xlbl9nZXQocnBjX3RwX2luZm9fdCAqcnBjYiwgcnBjX2J1Zl90ICpiKTsKLWV4dGVybiBpbnQgYmNtX3JwY19idWZfbGVuX3NldChycGNfdHBfaW5mb190ICpycGNiLCBycGNfYnVmX3QgKmIsIHVpbnQgbGVuKTsKLWV4dGVybiBycGNfYnVmX3QgKmJjbV9ycGNfYnVmX25leHRfZ2V0KHJwY190cF9pbmZvX3QgKnJwY2IsIHJwY19idWZfdCAqYik7Ci1leHRlcm4gdm9pZCBiY21fcnBjX2J1Zl9uZXh0X3NldChycGNfdHBfaW5mb190ICpycGNiLCBycGNfYnVmX3QgKmIsCi0JCQkJIHJwY19idWZfdCAqbmV4dGIpOwotZXh0ZXJuIHVuc2lnbmVkIGNoYXIgKmJjbV9ycGNfYnVmX2RhdGEocnBjX3RwX2luZm9fdCAqcnBjYiwgcnBjX2J1Zl90ICpiKTsKLWV4dGVybiB1bnNpZ25lZCBjaGFyICpiY21fcnBjX2J1Zl9wdXNoKHJwY190cF9pbmZvX3QgKnJwY2IsIHJwY19idWZfdCAqYiwKLQkJCQkgICAgICAgdWludCBkZWx0YSk7Ci1leHRlcm4gdW5zaWduZWQgY2hhciAqYmNtX3JwY19idWZfcHVsbChycGNfdHBfaW5mb190ICpycGNiLCBycGNfYnVmX3QgKmIsCi0JCQkJICAgICAgIHVpbnQgZGVsdGEpOwotZXh0ZXJuIHZvaWQgYmNtX3JwY190cF9idWZfcmVsZWFzZShycGNfdHBfaW5mb190ICpycGNiLCBycGNfYnVmX3QgKmJ1Zik7Ci1leHRlcm4gdm9pZCBiY21fcnBjX3RwX2J1Zl9jbnRfYWRqdXN0KHJwY190cF9pbmZvX3QgKnJwY2IsIGludCBhZGp1c3QpOwotLyogUlBDIGNhbGxfd2l0aF9yZXR1cm4gKi8KLWV4dGVybiBpbnQgYmNtX3JwY190cF9yZWN2X3J0bihycGNfdHBfaW5mb190ICpycGNiKTsKLWV4dGVybiBpbnQgYmNtX3JwY190cF9nZXRfZGV2aWNlX3NwZWVkKHJwY190cF9pbmZvX3QgKnJwY190aCk7Ci0jaWZkZWYgQkNNREJHCi1leHRlcm4gaW50IGJjbV9ycGNfdHBfZHVtcChycGNfdHBfaW5mb190ICpycGNiLCBzdHJ1Y3QgYmNtc3RyYnVmICpiKTsKLSNlbmRpZgotCi0jaWZkZWYgV0xDX0xPVwotLyogaW50ZXJjZXB0IFVTQiBwa3QgdG8gcGFyc2UgUlBDIGhlYWRlcjogVVNCIGRyaXZlciByeC0+IHdsX3NlbmQgLT4gdGhpcyAtPiB3bCBkcml2ZXIgKi8KLWV4dGVybiB2b2lkIGJjbV9ycGNfdHBfcnhfZnJvbV9kbmdsYnVzKHJwY190cF9pbmZvX3QgKnJwY190aCwgc3RydWN0IGxidWYgKmxiKTsKLQotLyogUlBDIGNhbGxyZXR1cm4gcGt0LCBnbyB0byBVU0IgZHJpdmVyIHR4ICovCi1leHRlcm4gaW50IGJjbV9ycGNfdHBfc2VuZF9jYWxscmV0dXJuKHJwY190cF9pbmZvX3QgKnJwY190aCwgcnBjX2J1Zl90ICpiKTsKLQotZXh0ZXJuIHZvaWQgYmNtX3JwY190cF9kdW1wKHJwY190cF9pbmZvX3QgKnJwY2IpOwotZXh0ZXJuIHZvaWQgYmNtX3JwY190cF90eGZsb3djdGwocnBjX3RwX2luZm9fdCAqcnBjYiwgYm9vbCBzdGF0ZSwgaW50IHByaW8pOwotZXh0ZXJuIHZvaWQgYmNtX3JwY190cF90eGZsb3djdGxjYl9pbml0KHJwY190cF9pbmZvX3QgKnJwY190aCwgdm9pZCAqY3R4LAotCQkJCQlycGNfdHhmbG93Y3RsX2NiX3QgY2IpOwotZXh0ZXJuIHZvaWQgYmNtX3JwY190cF90eGZsb3djdGxjYl9kZWluaXQocnBjX3RwX2luZm9fdCAqcnBjX3RoKTsKLWV4dGVybiB2b2lkIGJjbV9ycGNfdHBfdHhxX3dtX3NldChycGNfdHBfaW5mb190ICpycGNfdGgsIHU4IGhpd20sCi0JCQkJICB1OCBsb3dtKTsKLWV4dGVybiB2b2lkIGJjbV9ycGNfdHBfdHhxX3dtX2dldChycGNfdHBfaW5mb190ICpycGNfdGgsIHU4ICpoaXdtLAotCQkJCSAgdTggKmxvd20pOwotI2VuZGlmCQkJCS8qIFdMQ19MT1cgKi8KLQotZXh0ZXJuIHZvaWQgYmNtX3JwY190cF9hZ2dfc2V0KHJwY190cF9pbmZvX3QgKnJwY2IsIHUzMiByZWFzb24sIGJvb2wgc2V0KTsKLWV4dGVybiB2b2lkIGJjbV9ycGNfdHBfYWdnX2xpbWl0X3NldChycGNfdHBfaW5mb190ICpycGNfdGgsIHU4IHNmLAotCQkJCSAgICAgdTE2IGJ5dGVzKTsKLWV4dGVybiB2b2lkIGJjbV9ycGNfdHBfYWdnX2xpbWl0X2dldChycGNfdHBfaW5mb190ICpycGNfdGgsIHU4ICpzZiwKLQkJCQkgICAgIHUxNiAqYnl0ZXMpOwotCi0jZGVmaW5lIEJDTV9SUENfVFBfTVNHX0xFVkVMX01BU0sJMHgwMGZmCi0vKiBkb25nbGUgbXNnIGxldmVsICovCi0jZGVmaW5lIFJQQ19UUF9NU0dfRE5HTF9FUlJfVkFMCQkweDAwMDEJLyogRE5HTCBUUCBlcnJvciBtc2cgKi8KLSNkZWZpbmUgUlBDX1RQX01TR19ETkdMX0RCR19WQUwJCTB4MDAwMgkvKiBETkdMIFRQIGRiZyBtc2cgKi8KLSNkZWZpbmUgUlBDX1RQX01TR19ETkdMX0FHR19WQUwJCTB4MDAwNAkvKiBETkdMIFRQIGFnZyBtc2cgKi8KLSNkZWZpbmUgUlBDX1RQX01TR19ETkdMX0RFQV9WQUwJCTB4MDAwOAkvKiBETkdMIFRQIGRlYWcgbXNnICovCi0KLS8qIGhvc3QgbXNnIGxldmVsICovCi0jZGVmaW5lIFJQQ19UUF9NU0dfSE9TVF9FUlJfVkFMCQkweDAwMDEJLyogRE5HTCBUUCBlcnJvciBtc2cgKi8KLSNkZWZpbmUgUlBDX1RQX01TR19IT1NUX0RCR19WQUwJCTB4MDAwMgkvKiBETkdMIFRQIGRiZyBtc2cgKi8KLSNkZWZpbmUgUlBDX1RQX01TR19IT1NUX0FHR19WQUwJCTB4MDAwNAkvKiBETkdMIFRQIGFnZyBtc2cgKi8KLSNkZWZpbmUgUlBDX1RQX01TR19IT1NUX0RFQV9WQUwJCTB4MDAwOAkvKiBETkdMIFRQIGRlYWcgbXNnICovCi0KLWV4dGVybiB2b2lkIGJjbV9ycGNfdHBfbXNnbGV2ZWxfc2V0KHJwY190cF9pbmZvX3QgKnJwY190aCwgdTggbXNnbGV2ZWwsCi0JCQkJICAgIGJvb2wgaGlnaF9sb3cpOwotCi0jZW5kaWYJCQkJLyogX2JjbV9ycGNfdHBfaF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvaW5jbHVkZS9iY21feGRyLmggYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2luY2x1ZGUvYmNtX3hkci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGZiZDc4Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvaW5jbHVkZS9iY21feGRyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDEwIEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKgotICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55Ci0gKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgotICoKLSAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUwotICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZCi0gKiBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKLSAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04KLSAqIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4KLSAqIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0gKi8KLQotI2lmbmRlZiBfQkNNX1hEUl9ICi0jZGVmaW5lIF9CQ01fWERSX0gKLQotLyoKLSAqIGJjbV94ZHJfYnVmX3QKLSAqIFN0cnVjdHVyZSB1c2VkIGZvciBib29ra2VlcGluZyBvZiBhIGJ1ZmZlciBiZWluZyBwYWNrZWQgb3IgdW5wYWNrZWQuCi0gKiBLZWVwcyBhIGN1cnJlbnQgcmVhZC93cml0ZSBwb2ludGVyIGFuZCBzaXplIGFzIHdlbGwgYXMKLSAqIHRoZSBvcmlnaW5hbCBidWZmZXIgcG9pbnRlciBhbmQgc2l6ZS4KLSAqCi0gKi8KLXR5cGVkZWYgc3RydWN0IHsKLQl1OCAqYnVmOwkJLyogcG9pbnRlciB0byBjdXJyZW50IHBvc2l0aW9uIGluIG9yaWdidWYgKi8KLQl1aW50IHNpemU7CQkvKiBjdXJyZW50IChyZXNpZHVhbCkgc2l6ZSBpbiBieXRlcyAqLwotCXU4ICpvcmlnYnVmOwkJLyogdW5tb2RpZmllZCBwb2ludGVyIHRvIG9yaWduYWwgYnVmZmVyICovCi0JdWludCBvcmlnc2l6ZTsJCS8qIHVubW9kaWZpZWQgb3JpZ25hbCBidWZmZXIgc2l6ZSBpbiBieXRlcyAqLwotfSBiY21feGRyX2J1Zl90OwotCi12b2lkIGJjbV94ZHJfYnVmX2luaXQoYmNtX3hkcl9idWZfdCAqYiwgdm9pZCAqYnVmLCBzaXplX3QgbGVuKTsKLQotaW50IGJjbV94ZHJfcGFja191MzIoYmNtX3hkcl9idWZfdCAqYiwgdTMyIHZhbCk7Ci1pbnQgYmNtX3hkcl91bnBhY2tfdTMyKGJjbV94ZHJfYnVmX3QgKmIsIHUzMiAqcHZhbCk7Ci1pbnQgYmNtX3hkcl9wYWNrX3MzMihiY21feGRyX2J1Zl90ICpiLCBzMzIgdmFsKTsKLWludCBiY21feGRyX3VucGFja19zMzIoYmNtX3hkcl9idWZfdCAqYiwgczMyICpwdmFsKTsKLWludCBiY21feGRyX3BhY2tfczgoYmNtX3hkcl9idWZfdCAqYiwgczggdmFsKTsKLWludCBiY21feGRyX3VucGFja19zOChiY21feGRyX2J1Zl90ICpiLCBzOCAqcHZhbCk7Ci1pbnQgYmNtX3hkcl9wYWNrX29wYXF1ZShiY21feGRyX2J1Zl90ICpiLCB1aW50IGxlbiwgdm9pZCAqZGF0YSk7Ci1pbnQgYmNtX3hkcl91bnBhY2tfb3BhcXVlKGJjbV94ZHJfYnVmX3QgKmIsIHVpbnQgbGVuLCB2b2lkICoqcGRhdGEpOwotaW50IGJjbV94ZHJfdW5wYWNrX29wYXF1ZV9jcHkoYmNtX3hkcl9idWZfdCAqYiwgdWludCBsZW4sIHZvaWQgKmRhdGEpOwotaW50IGJjbV94ZHJfcGFja19vcGFxdWVfdmFybGVuKGJjbV94ZHJfYnVmX3QgKmIsIHVpbnQgbGVuLCB2b2lkICpkYXRhKTsKLWludCBiY21feGRyX3VucGFja19vcGFxdWVfdmFybGVuKGJjbV94ZHJfYnVmX3QgKmIsIHVpbnQgKnBsZW4sIHZvaWQgKipwZGF0YSk7Ci1pbnQgYmNtX3hkcl9wYWNrX3N0cmluZyhiY21feGRyX2J1Zl90ICpiLCBjaGFyICpzdHIpOwotaW50IGJjbV94ZHJfdW5wYWNrX3N0cmluZyhiY21feGRyX2J1Zl90ICpiLCB1aW50ICpwbGVuLCBjaGFyICoqcHN0cik7Ci0KLWludCBiY21feGRyX3BhY2tfdThfdmVjKGJjbV94ZHJfYnVmX3QgKiwgdTggKnZlYywgdTMyIGVsZW1zKTsKLWludCBiY21feGRyX3VucGFja191OF92ZWMoYmNtX3hkcl9idWZfdCAqLCB1OCAqdmVjLCB1MzIgZWxlbXMpOwotaW50IGJjbV94ZHJfcGFja191MTZfdmVjKGJjbV94ZHJfYnVmX3QgKmIsIHVpbnQgbGVuLCB2b2lkICp2ZWMpOwotaW50IGJjbV94ZHJfdW5wYWNrX3UxNl92ZWMoYmNtX3hkcl9idWZfdCAqYiwgdWludCBsZW4sIHZvaWQgKnZlYyk7Ci1pbnQgYmNtX3hkcl9wYWNrX3UzMl92ZWMoYmNtX3hkcl9idWZfdCAqYiwgdWludCBsZW4sIHZvaWQgKnZlYyk7Ci1pbnQgYmNtX3hkcl91bnBhY2tfdTMyX3ZlYyhiY21feGRyX2J1Zl90ICpiLCB1aW50IGxlbiwgdm9pZCAqdmVjKTsKLQotaW50IGJjbV94ZHJfcGFja19vcGFxdWVfcmF3KGJjbV94ZHJfYnVmX3QgKmIsIHVpbnQgbGVuLCB2b2lkICpkYXRhKTsKLWludCBiY21feGRyX3BhY2tfb3BhcXVlX3BhZChiY21feGRyX2J1Zl90ICpiKTsKLQotI2VuZGlmCQkJCS8qIF9CQ01fWERSX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvaW5jbHVkZS9iY21kZWZzLmggYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2luY2x1ZGUvYmNtZGVmcy5oCmluZGV4IGRjNTJlOWQuLjc0NjAxZmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvaW5jbHVkZS9iY21kZWZzLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9pbmNsdWRlL2JjbWRlZnMuaApAQCAtNDIsOSArNDIsNiBAQAogI2RlZmluZSBCQ01GQVNUUEFUSAogI2VuZGlmCiAKLS8qIFB1dCBzb21lIGxpYnJhcnkgZGF0YS9jb2RlIGludG8gUk9NIHRvIHJlZHVjZSBSQU0gcmVxdWlyZW1lbnRzICovCi0jZGVmaW5lIEJDTVJPTUZOKF9mbikJCV9mbgotCiAvKiBCdXMgdHlwZXMgKi8KICNkZWZpbmUJU0lfQlVTCQkJMAkvKiBTT0MgSW50ZXJjb25uZWN0ICovCiAjZGVmaW5lCVBDSV9CVVMJCQkxCS8qIFBDSSB0YXJnZXQgKi8KQEAgLTU0LDM1ICs1MSw2IEBACiAjZGVmaW5lIFNQSV9CVVMJCQk2CS8qIGdTUEkgdGFyZ2V0ICovCiAjZGVmaW5lIFJQQ19CVVMJCQk3CS8qIFJQQyB0YXJnZXQgKi8KIAotLyogQWxsb3dzIHNpemUgb3B0aW1pemF0aW9uIGZvciBzaW5nbGUtYnVzIGltYWdlICovCi0jaWZkZWYgQkNNQlVTVFlQRQotI2RlZmluZSBCVVNUWVBFKGJ1cykgCShCQ01CVVNUWVBFKQotI2Vsc2UKLSNkZWZpbmUgQlVTVFlQRShidXMpIAkoYnVzKQotI2VuZGlmCi0KLS8qIEFsbG93cyBzaXplIG9wdGltaXphdGlvbiBmb3Igc2luZ2xlLWJhY2twbGFuZSBpbWFnZSAqLwotI2lmZGVmIEJDTUNISVBUWVBFCi0jZGVmaW5lIENISVBUWVBFKGJ1cykgCShCQ01DSElQVFlQRSkKLSNlbHNlCi0jZGVmaW5lIENISVBUWVBFKGJ1cykgCShidXMpCi0jZW5kaWYKLQotLyogQWxsb3dzIHNpemUgb3B0aW1pemF0aW9uIGZvciBTUFJPTSBzdXBwb3J0ICovCi0jZGVmaW5lIFNQUk9NQlVTCShQQ0lfQlVTKQotCi0vKiBBbGxvd3Mgc2l6ZSBvcHRpbWl6YXRpb24gZm9yIHNpbmdsZS1jaGlwIGltYWdlICovCi0jaWZkZWYgQkNNQ0hJUElECi0jZGVmaW5lIENISVBJRChjaGlwKQkoQkNNQ0hJUElEKQotI2Vsc2UKLSNkZWZpbmUgQ0hJUElEKGNoaXApCShjaGlwKQotI2VuZGlmCi0KLSNpZmRlZiBCQ01DSElQUkVWCi0jZGVmaW5lIENISVBSRVYocmV2KQkoQkNNQ0hJUFJFVikKLSNlbHNlCi0jZGVmaW5lIENISVBSRVYocmV2KQkocmV2KQotI2VuZGlmCiAKIC8qIERlZmluZXMgZm9yIERNQSBBZGRyZXNzIFdpZHRoIC0gU2hhcmVkIGJldHdlZW4gT1NMIGFuZCBITkRETUEgKi8KICNkZWZpbmUgRE1BRERSX01BU0tfMzIgMHgwCS8qIEFkZHJlc3MgbWFzayBmb3IgMzItYml0cyAqLwpAQCAtMTQ2LDMxICsxMTQsMTEgQEAKIAogI2RlZmluZSBCQ01FWFRSQUhEUk9PTSAxNzIKIAotLyogSGVhZHJvb20gcmVxdWlyZWQgZm9yIGRvbmdsZS10by1ob3N0IGNvbW11bmljYXRpb24uICBQYWNrZXRzIGFsbG9jYXRlZAotICogbG9jYWxseSBpbiB0aGUgZG9uZ2xlIChlLmcuIGZvciBDREMgaW9jdGxzIG9yIFJORElTIG1lc3NhZ2VzKSBzaG91bGQKLSAqIGxlYXZlIHRoaXMgbXVjaCByb29tIGluIGZyb250IGZvciBsb3ctbGV2ZWwgbWVzc2FnZSBoZWFkZXJzIHdoaWNoIG1heQotICogYmUgbmVlZGVkIHRvIGdldCBhY3Jvc3MgdGhlIGRvbmdsZSBidXMgdG8gdGhlIGhvc3QuICAoVGhlc2UgbWVzc2FnZXMKLSAqIGRvbid0IGdvIG92ZXIgdGhlIG5ldHdvcmssIHNvIHJvb20gZm9yIHRoZSBmdWxsIFdMIGhlYWRlciBhYm92ZSB3b3VsZAotICogYmUgYSB3YXN0ZS4pLgotKi8KLSNkZWZpbmUgQkNNRE9OR0xFSERSU1ogMTIKLSNkZWZpbmUgQkNNRE9OR0xFUEFEU1ogMTYKLQotI2RlZmluZSBCQ01ET05HTEVPVkVSSEVBRAkoQkNNRE9OR0xFSERSU1ogKyBCQ01ET05HTEVQQURTWikKLQogI2lmZGVmIEJDTURCRwotCi0jZGVmaW5lIEJDTURCR19FUlIKLQogI2lmbmRlZiBCQ01EQkdfQVNTRVJUCiAjZGVmaW5lIEJDTURCR19BU1NFUlQKLSNlbmRpZgkJCQkvKiBCQ01EQkdfQVNTRVJUICovCi0KLSNlbmRpZgkJCQkvKiBCQ01EQkcgKi8KLQotI2lmIGRlZmluZWQoQkNNREJHX0FTU0VSVCkKLSNkZWZpbmUgQkNNQVNTRVJUX1NVUFBPUlQKLSNlbmRpZgorI2VuZGlmCS8qIEJDTURCR19BU1NFUlQgKi8KKyNlbmRpZgkvKiBCQ01EQkcgKi8KIAogLyogTWFjcm9zIGZvciBkb2luZyBkZWZpbml0aW9uIGFuZCBnZXQvc2V0IG9mIGJpdGZpZWxkcwogICogVXNhZ2UgZXhhbXBsZSwgZS5nLiBhIHRocmVlLWJpdCBmaWVsZCAoYml0cyA0LTYpOgpAQCAtMTkwLDExICsxMzgsMTAgQEAKIAkJKCgodmFsKSAmICh+KGZpZWxkICMjIF9NIDw8IGZpZWxkICMjIF9TKSkpIHwgXAogCQkgKCh1bnNpZ25lZCkoYml0cykgPDwgZmllbGQgIyMgX1MpKQogCi0vKiBkZWZpbmUgQkNNU01BTEwgdG8gcmVtb3ZlIG1pc2MgZmVhdHVyZXMgZm9yIG1lbW9yeS1jb25zdHJhaW5lZCBlbnZpcm9ubWVudHMgKi8KLSNkZWZpbmUJQkNNU1BBQ0UKLSNkZWZpbmUgYmNtc3BhY2UJdHJ1ZQkvKiBpZiAoYmNtc3BhY2UpIGNvZGUgaXMgcmV0YWluZWQgKi8KLQogLyogTWF4LiBudnJhbSB2YXJpYWJsZSB0YWJsZSBzaXplICovCiAjZGVmaW5lCU1BWFNaX05WUkFNX1ZBUlMJNDA5NgogCisvKiBoYW5kbGUgZm9yd2FyZCBkZWNsYXJhdGlvbiAqLworc3RydWN0IHdsX2luZm87CisKICNlbmRpZgkJCQkvKiBfYmNtZGVmc19oXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9pbmNsdWRlL2JjbXNkYnVzLmggYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2luY2x1ZGUvYmNtc2RidXMuaAppbmRleCBjYTk5NDk1Li44OTA1OWRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2luY2x1ZGUvYmNtc2RidXMuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2luY2x1ZGUvYmNtc2RidXMuaApAQCAtNDYsOCArNDYsOCBAQAogICogIFRoZSBoYW5kbGVyIHNoYWxsIGJlIHByb3ZpZGVkIGJ5IGFsbCBzdWJzZXF1ZW50IGNhbGxzLiBObyBsb2NhbCBjYWNoZQogICogIGNmZ2hkbCBwb2ludHMgdG8gdGhlIHN0YXJ0aW5nIGFkZHJlc3Mgb2YgcGNpIGRldmljZSBtYXBwZWQgbWVtb3J5CiAgKi8KLWV4dGVybiBzZGlvaF9pbmZvX3QgKnNkaW9oX2F0dGFjaChvc2xfdCAqb3NoLCB2b2lkICpjZmdoZGwsIHVpbnQgaXJxKTsKLWV4dGVybiBTRElPSF9BUElfUkMgc2Rpb2hfZGV0YWNoKG9zbF90ICpvc2gsIHNkaW9oX2luZm9fdCAqc2kpOworZXh0ZXJuIHNkaW9oX2luZm9fdCAqc2Rpb2hfYXR0YWNoKHN0cnVjdCBvc2xfaW5mbyAqb3NoLCB2b2lkICpjZmdoZGwsIHVpbnQgaXJxKTsKK2V4dGVybiBTRElPSF9BUElfUkMgc2Rpb2hfZGV0YWNoKHN0cnVjdCBvc2xfaW5mbyAqb3NoLCBzZGlvaF9pbmZvX3QgKnNpKTsKIGV4dGVybiBTRElPSF9BUElfUkMgc2Rpb2hfaW50ZXJydXB0X3JlZ2lzdGVyKHNkaW9oX2luZm9fdCAqc2ksCiAJCQkJCSAgICAgc2Rpb2hfY2JfZm5fdCBmbiwgdm9pZCAqYXJnaCk7CiBleHRlcm4gU0RJT0hfQVBJX1JDIHNkaW9oX2ludGVycnVwdF9kZXJlZ2lzdGVyKHNkaW9oX2luZm9fdCAqc2kpOwpAQCAtNzksNyArNzksNyBAQAogCQkJCQkgdWludCBmaXhfaW5jLCB1aW50IHJ3LCB1aW50IGZuY19udW0sCiAJCQkJCSB1MzIgYWRkciwgdWludCByZWd3aWR0aCwKIAkJCQkJIHUzMiBidWZsZW4sIHU4ICpidWZmZXIsCi0JCQkJCSB2b2lkICpwa3QpOworCQkJCQkgc3RydWN0IHNrX2J1ZmYgKnBrdCk7CiAKIC8qIGdldCBjaXMgZGF0YSAqLwogZXh0ZXJuIFNESU9IX0FQSV9SQyBzZGlvaF9jaXNfcmVhZChzZGlvaF9pbmZvX3QgKnNpLCB1aW50IGZ1YywgdTggKmNpcywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvaW5jbHVkZS9iY21zZGguaCBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvaW5jbHVkZS9iY21zZGguaAppbmRleCA2YjgwOTgzLi4wZTFmNzk5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2luY2x1ZGUvYmNtc2RoLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9pbmNsdWRlL2JjbXNkaC5oCkBAIC00MCwxMSArNDAsMTEgQEAKICAqICAgIGltcGxlbWVudGF0aW9uIG1heSBtYWludGFpbiBhIHNpbmdsZSAiZGVmYXVsdCIgaGFuZGxlIChlLmcuIHRoZSBmaXJzdCBvcgogICogICAgbW9zdCByZWNlbnQgb25lKSB0byBlbmFibGUgc2luZ2xlLWluc3RhbmNlIGltcGxlbWVudGF0aW9ucyB0byBwYXNzIE5VTEwuCiAgKi8KLWV4dGVybiBiY21zZGhfaW5mb190ICpiY21zZGhfYXR0YWNoKG9zbF90ICpvc2gsIHZvaWQgKmNmZ2hkbCwgdm9pZCAqKnJlZ3N2YSwKLQkJCQkgICAgdWludCBpcnEpOworZXh0ZXJuIGJjbXNkaF9pbmZvX3QgKmJjbXNkaF9hdHRhY2goc3RydWN0IG9zbF9pbmZvICpvc2gsIHZvaWQgKmNmZ2hkbCwKKwkJCQkgICAgdm9pZCAqKnJlZ3N2YSwgdWludCBpcnEpOwogCiAvKiBEZXRhY2ggLSBmcmVldXAgcmVzb3VyY2VzIGFsbG9jYXRlZCBpbiBhdHRhY2ggKi8KLWV4dGVybiBpbnQgYmNtc2RoX2RldGFjaChvc2xfdCAqb3NoLCB2b2lkICpzZGgpOworZXh0ZXJuIGludCBiY21zZGhfZGV0YWNoKHN0cnVjdCBvc2xfaW5mbyAqb3NoLCB2b2lkICpzZGgpOwogCiAvKiBRdWVyeSBpZiBTRCBkZXZpY2UgaW50ZXJydXB0cyBhcmUgZW5hYmxlZCAqLwogZXh0ZXJuIGJvb2wgYmNtc2RoX2ludHJfcXVlcnkodm9pZCAqc2RoKTsKQEAgLTEyMiw3ICsxMjIsNyBAQAogCQkJICAgdTggKmJ1ZiwgdWludCBuYnl0ZXMsIHZvaWQgKnBrdCwKIAkJCSAgIGJjbXNkaF9jbXBsdF9mbl90IGNvbXBsZXRlLCB2b2lkICpoYW5kbGUpOwogZXh0ZXJuIGludCBiY21zZGhfcmVjdl9idWYodm9pZCAqc2RoLCB1MzIgYWRkciwgdWludCBmbiwgdWludCBmbGFncywKLQkJCSAgIHU4ICpidWYsIHVpbnQgbmJ5dGVzLCB2b2lkICpwa3QsCisJCQkgICB1OCAqYnVmLCB1aW50IG5ieXRlcywgc3RydWN0IHNrX2J1ZmYgKnBrdCwKIAkJCSAgIGJjbXNkaF9jbXBsdF9mbl90IGNvbXBsZXRlLCB2b2lkICpoYW5kbGUpOwogCiAvKiBGbGFncyBiaXRzICovCkBAIC0xNzQsOCArMTc0LDggQEAKIHR5cGVkZWYgc3RydWN0IHsKIAkvKiBhdHRhY2ggdG8gZGV2aWNlICovCiAJdm9pZCAqKCphdHRhY2gpICh1MTYgdmVuZF9pZCwgdTE2IGRldl9pZCwgdTE2IGJ1cywgdTE2IHNsb3QsCi0JCQkgdTE2IGZ1bmMsIHVpbnQgYnVzdHlwZSwgdm9pZCAqcmVnc3ZhLCBvc2xfdCAqb3NoLAotCQkJIHZvaWQgKnBhcmFtKTsKKwkJCSB1MTYgZnVuYywgdWludCBidXN0eXBlLCB2b2lkICpyZWdzdmEsCisJCQkgc3RydWN0IG9zbF9pbmZvICpvc2gsIHZvaWQgKnBhcmFtKTsKIAkvKiBkZXRhY2ggZnJvbSBkZXZpY2UgKi8KIAl2b2lkICgqZGV0YWNoKSAodm9pZCAqY2gpOwogfSBiY21zZGhfZHJpdmVyX3Q7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2luY2x1ZGUvYmNtc2RoX3NkbW1jLmggYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2luY2x1ZGUvYmNtc2RoX3NkbW1jLmgKaW5kZXggN2Q1YWE3MS4uNGQ2NzFkZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9pbmNsdWRlL2JjbXNkaF9zZG1tYy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvaW5jbHVkZS9iY21zZGhfc2RtbWMuaApAQCAtNTEsNyArNTEsNyBAQAogI2RlZmluZSBDTElFTlRfSU5UUiAJCTB4MTAwCS8qIEdldCByaWQgb2YgdGhpcyEgKi8KIAogc3RydWN0IHNkaW9oX2luZm8gewotCW9zbF90ICpvc2g7CQkvKiBvc2ggaGFuZGxlciAqLworCXN0cnVjdCBvc2xfaW5mbyAqb3NoOwkJLyogb3NoIGhhbmRsZXIgKi8KIAlib29sIGNsaWVudF9pbnRyX2VuYWJsZWQ7CS8qIGludGVycnVwdCBjb25ubmVjdGVkIGZsYWcgKi8KIAlib29sIGludHJfaGFuZGxlcl92YWxpZDsJLyogY2xpZW50IGRyaXZlciBpbnRlcnJ1cHQgaGFuZGxlciB2YWxpZCAqLwogCXNkaW9oX2NiX2ZuX3QgaW50cl9oYW5kbGVyOwkvKiByZWdpc3RlcmVkIGludGVycnVwdCBoYW5kbGVyICovCkBAIC05NCw4ICs5NCw4IEBACiAgKi8KIAogLyogUmVnaXN0ZXIgbWFwcGluZyByb3V0aW5lcyAqLwotZXh0ZXJuIHUzMiAqc2Rpb2hfc2RtbWNfcmVnX21hcChvc2xfdCAqb3NoLCBzMzIgYWRkciwgaW50IHNpemUpOwotZXh0ZXJuIHZvaWQgc2Rpb2hfc2RtbWNfcmVnX3VubWFwKG9zbF90ICpvc2gsIHMzMiBhZGRyLCBpbnQgc2l6ZSk7CitleHRlcm4gdTMyICpzZGlvaF9zZG1tY19yZWdfbWFwKHN0cnVjdCBvc2xfaW5mbyAqb3NoLCBzMzIgYWRkciwgaW50IHNpemUpOworZXh0ZXJuIHZvaWQgc2Rpb2hfc2RtbWNfcmVnX3VubWFwKHN0cnVjdCBvc2xfaW5mbyAqb3NoLCBzMzIgYWRkciwgaW50IHNpemUpOwogCiAvKiBJbnRlcnJ1cHQgKGRlKXJlZ2lzdHJhdGlvbiByb3V0aW5lcyAqLwogZXh0ZXJuIGludCBzZGlvaF9zZG1tY19yZWdpc3Rlcl9pcnEoc2Rpb2hfaW5mb190ICpzZCwgdWludCBpcnEpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9pbmNsdWRlL2JjbXNyb20uaCBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvaW5jbHVkZS9iY21zcm9tLmgKaW5kZXggOWQ1MzY1Ny4uY2RjZWY3NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9pbmNsdWRlL2JjbXNyb20uaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2luY2x1ZGUvYmNtc3JvbS5oCkBAIC0yMCwxNSArMjAsMTUgQEAKICNpbmNsdWRlIDxiY21zcm9tX2ZtdC5oPgogCiAvKiBQcm90b3R5cGVzICovCi1leHRlcm4gaW50IHNyb21fdmFyX2luaXQoc2lfdCAqc2loLCB1aW50IGJ1cywgdm9pZCAqY3VybWFwLCBvc2xfdCAqb3NoLAotCQkJIGNoYXIgKip2YXJzLCB1aW50ICpjb3VudCk7CitleHRlcm4gaW50IHNyb21fdmFyX2luaXQoc2lfdCAqc2loLCB1aW50IGJ1cywgdm9pZCAqY3VybWFwLAorCQkJIHN0cnVjdCBvc2xfaW5mbyAqb3NoLCBjaGFyICoqdmFycywgdWludCAqY291bnQpOwogCi1leHRlcm4gaW50IHNyb21fcmVhZChzaV90ICpzaWgsIHVpbnQgYnVzLCB2b2lkICpjdXJtYXAsIG9zbF90ICpvc2gsCitleHRlcm4gaW50IHNyb21fcmVhZChzaV90ICpzaWgsIHVpbnQgYnVzLCB2b2lkICpjdXJtYXAsIHN0cnVjdCBvc2xfaW5mbyAqb3NoLAogCQkgICAgIHVpbnQgYnl0ZW9mZiwgdWludCBuYnl0ZXMsIHUxNiAqYnVmLCBib29sIGNoZWNrX2NyYyk7CiAKIC8qIHBhcnNlIHN0YW5kYXJkIFBDTUNJQSBjaXMsIG5vcm1hbGx5IHVzZWQgYnkgU0IvUENNQ0lBL1NESU8vU1BJL09UUAogICogICBhbmQgZXh0cmFjdCBmcm9tIGl0IGludG8gbmFtZT12YWx1ZSBwYWlycwogICovCi1leHRlcm4gaW50IHNyb21fcGFyc2VjaXMob3NsX3QgKm9zaCwgdTggKipwY2lzLCB1aW50IGNpc2NudCwKK2V4dGVybiBpbnQgc3JvbV9wYXJzZWNpcyhzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgdTggKipwY2lzLCB1aW50IGNpc2NudCwKIAkJCSBjaGFyICoqdmFycywgdWludCAqY291bnQpOwogI2VuZGlmCQkJCS8qIF9iY21zcm9tX2hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2luY2x1ZGUvYmNtdXRpbHMuaCBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvaW5jbHVkZS9iY211dGlscy5oCmluZGV4IGI1MzMxNTkuLmE4Zjc2ZDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvaW5jbHVkZS9iY211dGlscy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvaW5jbHVkZS9iY211dGlscy5oCkBAIC0zMCw3ICszMCw2IEBACiAJfTsKIAogLyogKiogZHJpdmVyLW9ubHkgc2VjdGlvbiAqKiAqLwotI2luY2x1ZGUgPG9zbC5oPgogCiAjZGVmaW5lIEdQSU9fUElOX05PVERFRklORUQgCTB4MjAJLyogUGluIG5vdCBkZWZpbmVkICovCiAKQEAgLTU2LDEwICs1NSwxMCBAQAogI2VuZGlmCiAKIAl0eXBlZGVmIHN0cnVjdCBwa3RxX3ByZWMgewotCQl2b2lkICpoZWFkOwkvKiBmaXJzdCBwYWNrZXQgdG8gZGVxdWV1ZSAqLwotCQl2b2lkICp0YWlsOwkvKiBsYXN0IHBhY2tldCB0byBkZXF1ZXVlICovCi0JCXUxNiBsZW47CS8qIG51bWJlciBvZiBxdWV1ZWQgcGFja2V0cyAqLwotCQl1MTYgbWF4OwkvKiBtYXhpbXVtIG51bWJlciBvZiBxdWV1ZWQgcGFja2V0cyAqLworCQlzdHJ1Y3Qgc2tfYnVmZiAqaGVhZDsJLyogZmlyc3QgcGFja2V0IHRvIGRlcXVldWUgKi8KKwkJc3RydWN0IHNrX2J1ZmYgKnRhaWw7CS8qIGxhc3QgcGFja2V0IHRvIGRlcXVldWUgKi8KKwkJdTE2IGxlbjsJCS8qIG51bWJlciBvZiBxdWV1ZWQgcGFja2V0cyAqLworCQl1MTYgbWF4OwkJLyogbWF4aW11bSBudW1iZXIgb2YgcXVldWVkIHBhY2tldHMgKi8KIAl9IHBrdHFfcHJlY190OwogCiAvKiBtdWx0aS1wcmlvcml0eSBwa3QgcXVldWUgKi8KQEAgLTEwNSwyMyArMTA0LDI2IEBACiAjZGVmaW5lIHBrdHFfcHBlZWsocHEsIHByZWMpICAgICAgICAgICAgKChwcSktPnFbcHJlY10uaGVhZCkKICNkZWZpbmUgcGt0cV9wcGVla190YWlsKHBxLCBwcmVjKSAgICAgICAoKHBxKS0+cVtwcmVjXS50YWlsKQogCi0JZXh0ZXJuIHZvaWQgKnBrdHFfcGVucShzdHJ1Y3QgcGt0cSAqcHEsIGludCBwcmVjLCB2b2lkICpwKTsKLQlleHRlcm4gdm9pZCAqcGt0cV9wZW5xX2hlYWQoc3RydWN0IHBrdHEgKnBxLCBpbnQgcHJlYywgdm9pZCAqcCk7Ci0JZXh0ZXJuIHZvaWQgKnBrdHFfcGRlcShzdHJ1Y3QgcGt0cSAqcHEsIGludCBwcmVjKTsKLQlleHRlcm4gdm9pZCAqcGt0cV9wZGVxX3RhaWwoc3RydWN0IHBrdHEgKnBxLCBpbnQgcHJlYyk7CitleHRlcm4gc3RydWN0IHNrX2J1ZmYgKnBrdHFfcGVucShzdHJ1Y3QgcGt0cSAqcHEsIGludCBwcmVjLAorCQkJCSBzdHJ1Y3Qgc2tfYnVmZiAqcCk7CitleHRlcm4gc3RydWN0IHNrX2J1ZmYgKnBrdHFfcGVucV9oZWFkKHN0cnVjdCBwa3RxICpwcSwgaW50IHByZWMsCisJCQkJICAgICAgc3RydWN0IHNrX2J1ZmYgKnApOworZXh0ZXJuIHN0cnVjdCBza19idWZmICpwa3RxX3BkZXEoc3RydWN0IHBrdHEgKnBxLCBpbnQgcHJlYyk7CitleHRlcm4gc3RydWN0IHNrX2J1ZmYgKnBrdHFfcGRlcV90YWlsKHN0cnVjdCBwa3RxICpwcSwgaW50IHByZWMpOworCiAvKiBFbXB0eSB0aGUgcXVldWUgYXQgcGFydGljdWxhciBwcmVjZWRlbmNlIGxldmVsICovCiAjaWZkZWYgQlJDTV9GVUxMTUFDCi0JZXh0ZXJuIHZvaWQgcGt0cV9wZmx1c2gob3NsX3QgKm9zaCwgc3RydWN0IHBrdHEgKnBxLCBpbnQgcHJlYywKKwlleHRlcm4gdm9pZCBwa3RxX3BmbHVzaChzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgc3RydWN0IHBrdHEgKnBxLCBpbnQgcHJlYywKIAkJYm9vbCBkaXIpOwogI2Vsc2UKLQlleHRlcm4gdm9pZCBwa3RxX3BmbHVzaChvc2xfdCAqb3NoLCBzdHJ1Y3QgcGt0cSAqcHEsIGludCBwcmVjLAorCWV4dGVybiB2b2lkIHBrdHFfcGZsdXNoKHN0cnVjdCBvc2xfaW5mbyAqb3NoLCBzdHJ1Y3QgcGt0cSAqcHEsIGludCBwcmVjLAogCQlib29sIGRpciwgaWZwa3RfY2JfdCBmbiwgaW50IGFyZyk7CiAjZW5kaWYgLyogQlJDTV9GVUxMTUFDICovCiAKIC8qIG9wZXJhdGlvbnMgb24gYSBzZXQgb2YgcHJlY2VkZW5jZXMgaW4gcGFja2V0IHF1ZXVlICovCiAKLQlleHRlcm4gaW50IHBrdHFfbWxlbihzdHJ1Y3QgcGt0cSAqcHEsIHVpbnQgcHJlY19ibXApOwotCWV4dGVybiB2b2lkICpwa3RxX21kZXEoc3RydWN0IHBrdHEgKnBxLCB1aW50IHByZWNfYm1wLCBpbnQgKnByZWNfb3V0KTsKK2V4dGVybiBpbnQgcGt0cV9tbGVuKHN0cnVjdCBwa3RxICpwcSwgdWludCBwcmVjX2JtcCk7CitleHRlcm4gc3RydWN0IHNrX2J1ZmYgKnBrdHFfbWRlcShzdHJ1Y3QgcGt0cSAqcHEsIHVpbnQgcHJlY19ibXAsIGludCAqcHJlY19vdXQpOwogCiAvKiBvcGVyYXRpb25zIG9uIHBhY2tldCBxdWV1ZSBhcyBhIHdob2xlICovCiAKQEAgLTE0MCwyMCArMTQyLDE5IEBACiAKIAlleHRlcm4gdm9pZCBwa3RxX2luaXQoc3RydWN0IHBrdHEgKnBxLCBpbnQgbnVtX3ByZWMsIGludCBtYXhfbGVuKTsKIC8qIHByZWNfb3V0IG1heSBiZSBOVUxMIGlmIGNhbGxlciBpcyBub3QgaW50ZXJlc3RlZCBpbiByZXR1cm4gdmFsdWUgKi8KLQlleHRlcm4gdm9pZCAqcGt0cV9wZWVrX3RhaWwoc3RydWN0IHBrdHEgKnBxLCBpbnQgKnByZWNfb3V0KTsKKwlleHRlcm4gc3RydWN0IHNrX2J1ZmYgKnBrdHFfcGVla190YWlsKHN0cnVjdCBwa3RxICpwcSwgaW50ICpwcmVjX291dCk7CiAjaWZkZWYgQlJDTV9GVUxMTUFDCi0JZXh0ZXJuIHZvaWQgcGt0cV9mbHVzaChvc2xfdCAqb3NoLCBzdHJ1Y3QgcGt0cSAqcHEsIGJvb2wgZGlyKTsKKwlleHRlcm4gdm9pZCBwa3RxX2ZsdXNoKHN0cnVjdCBvc2xfaW5mbyAqb3NoLCBzdHJ1Y3QgcGt0cSAqcHEsIGJvb2wgZGlyKTsKICNlbHNlCi0JZXh0ZXJuIHZvaWQgcGt0cV9mbHVzaChvc2xfdCAqb3NoLCBzdHJ1Y3QgcGt0cSAqcHEsIGJvb2wgZGlyLAorCWV4dGVybiB2b2lkIHBrdHFfZmx1c2goc3RydWN0IG9zbF9pbmZvICpvc2gsIHN0cnVjdCBwa3RxICpwcSwgYm9vbCBkaXIsCiAJCWlmcGt0X2NiX3QgZm4sIGludCBhcmcpOwogI2VuZGlmCiAKIC8qIGV4dGVybnMgKi8KIC8qIHBhY2tldCAqLwotCWV4dGVybiB1aW50IHBrdGZyb21idWYob3NsX3QgKm9zaCwgdm9pZCAqcCwgdWludCBvZmZzZXQsIGludCBsZW4sCi0JCQkgICAgICAgdW5zaWduZWQgY2hhciAqYnVmKTsKLQlleHRlcm4gdWludCBwa3RzZWdjbnQob3NsX3QgKm9zaCwgdm9pZCAqcCk7Ci0JZXh0ZXJuIHVpbnQgcGt0dG90bGVuKG9zbF90ICpvc2gsIHZvaWQgKnApOworCWV4dGVybiB1aW50IHBrdGZyb21idWYoc3RydWN0IG9zbF9pbmZvICpvc2gsIHN0cnVjdCBza19idWZmICpwLAorCQkJICAgICAgIHVpbnQgb2Zmc2V0LCBpbnQgbGVuLCB1bnNpZ25lZCBjaGFyICpidWYpOworCWV4dGVybiB1aW50IHBrdHRvdGxlbihzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgc3RydWN0IHNrX2J1ZmYgKnApOwogCiAvKiBldGhlcm5ldCBhZGRyZXNzICovCiAJZXh0ZXJuIGludCBiY21fZXRoZXJfYXRvZShjaGFyICpwLCBzdHJ1Y3QgZXRoZXJfYWRkciAqZWEpOwpAQCAtMTY2LDcgKzE2Nyw4IEBACiAJZXh0ZXJuIGNoYXIgKmdldHZhcihjaGFyICp2YXJzLCBjb25zdCBjaGFyICpuYW1lKTsKIAlleHRlcm4gaW50IGdldGludHZhcihjaGFyICp2YXJzLCBjb25zdCBjaGFyICpuYW1lKTsKICNpZmRlZiBCQ01EQkcKLQlleHRlcm4gdm9pZCBwcnBrdChjb25zdCBjaGFyICptc2csIG9zbF90ICpvc2gsIHZvaWQgKnAwKTsKKwlleHRlcm4gdm9pZCBwcnBrdChjb25zdCBjaGFyICptc2csIHN0cnVjdCBvc2xfaW5mbyAqb3NoLAorCQkJICBzdHJ1Y3Qgc2tfYnVmZiAqcDApOwogI2VuZGlmCQkJCS8qIEJDTURCRyAqLwogI2RlZmluZSBiY21fcGVyZl9lbmFibGUoKQogI2RlZmluZSBiY21zdGF0cyhmbXQpCkBAIC0zNTksNyArMzYxLDIxIEBACiAjZGVmaW5lIENFSUwoeCwgeSkJCSgoKHgpICsgKCh5KS0xKSkgLyAoeSkpCiAjZGVmaW5lCUlTUE9XRVJPRjIoeCkJCSgoKCh4KS0xKSYoeCkpID09IDApCiAKLS8qIGJpdCBtYXAgcmVsYXRlZCBtYWNyb3MgKi8KKy8qIG1hcCBwaHlzaWNhbCB0byB2aXJ0dWFsIEkvTyAqLworI2lmICFkZWZpbmVkKENPTkZJR19NTUNfTVNNN1gwMEEpCisjZGVmaW5lIFJFR19NQVAocGEsIHNpemUpICAgICAgIGlvcmVtYXBfbm9jYWNoZSgodW5zaWduZWQgbG9uZykocGEpLCBcCisJCQkJCSh1bnNpZ25lZCBsb25nKShzaXplKSkKKyNlbHNlCisjZGVmaW5lIFJFR19NQVAocGEsIHNpemUpICAgICAgICh2b2lkICopKDApCisjZW5kaWYKKworLyogUmVnaXN0ZXIgb3BlcmF0aW9ucyAqLworI2RlZmluZSBBTkRfUkVHKG9zaCwgciwgdikJV19SRUcob3NoLCAociksIFJfUkVHKG9zaCwgcikgJiAodikpCisjZGVmaW5lIE9SX1JFRyhvc2gsIHIsIHYpCVdfUkVHKG9zaCwgKHIpLCBSX1JFRyhvc2gsIHIpIHwgKHYpKQorCisjZGVmaW5lIFNFVF9SRUcob3NoLCByLCBtYXNrLCB2YWwpIFwKKwkJV19SRUcoKG9zaCksIChyKSwgKChSX1JFRygob3NoKSwgcikgJiB+KG1hc2spKSB8ICh2YWwpKSkKKwogI2lmbmRlZiBzZXRiaXQKICNpZm5kZWYgTkJCWQkJCS8qIHRoZSBCU0QgZmFtaWx5IGRlZmluZXMgTkJCWSAqLwogI2RlZmluZQlOQkJZCTgJCS8qIDggYml0cyBwZXIgYnl0ZSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9pbmNsdWRlL2QxMS5oIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9pbmNsdWRlL2QxMS5oCmluZGV4IGMwNzU0OGMuLmJlMmQ0OTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvaW5jbHVkZS9kMTEuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2luY2x1ZGUvZDExLmgKQEAgLTE3LDEzICsxNyw2IEBACiAjaWZuZGVmCV9EMTFfSAogI2RlZmluZQlfRDExX0gKIAotI2luY2x1ZGUgPGJjbWRlZnMuaD4KLSNpbmNsdWRlIDxiY21kZXZzLmg+Ci0jaW5jbHVkZSA8aG5kc29jLmg+Ci0jaW5jbHVkZSA8c2JobmRwaW8uaD4KLSNpbmNsdWRlIDxzYmhuZGRtYS5oPgotI2luY2x1ZGUgPHByb3RvLzgwMi4xMS5oPgotCiAvKiBUaGlzIG1hcmtzIHRoZSBzdGFydCBvZiBhIHBhY2tlZCBzdHJ1Y3R1cmUgc2VjdGlvbi4gKi8KICNpbmNsdWRlIDxwYWNrZWRfc2VjdGlvbl9zdGFydC5oPgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2luY2x1ZGUvZGJ1cy5oIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9pbmNsdWRlL2RidXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODFmZmVhNy4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2luY2x1ZGUvZGJ1cy5oCisrKyAvZGV2L251bGwKQEAgLTEsMzUzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKLSAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCi0gKgotICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCi0gKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkKLSAqIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUwotICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTgotICogT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTgotICogQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KLSAqLwotCi0jaWZuZGVmIF9fREJVU19IX18KLSNkZWZpbmUgX19EQlVTX0hfXwotCi0jaWZkZWYgQkNNREJHCi0jZGVmaW5lIERCVVNFUlIoYXJncykgICAgICAgIGRvIHsgaWYgKG5ldF9yYXRlbGltaXQoKSkgcHJpbnRmIGFyZ3M7IH0gd2hpbGUgKDApCi0jZGVmaW5lIERCVVNUUkFDRShhcmdzKQotI2RlZmluZSBEQlVTREJHTE9DSyhhcmdzKQotCi0jZWxzZQotI2RlZmluZSBEQlVTVFJBQ0UoYXJncykKLSNkZWZpbmUgREJVU0VSUihhcmdzKQotI2RlZmluZSBEQlVTREJHTE9DSyhhcmdzKQotI2VuZGlmCi0KLWVudW0gewotCURCVVNfT0sgPSAwLAotCURCVVNfRVJSID0gLTIwMCwKLQlEQlVTX0VSUl9USU1FT1VULAotCURCVVNfRVJSX0RJU0NPTk5FQ1QsCi0JREJVU19FUlJfTk9ERVZJQ0UsCi0JREJVU19FUlJfVU5TVVBQT1JURUQsCi0JREJVU19FUlJfUEVORElORywKLQlEQlVTX0VSUl9OT01FTSwKLQlEQlVTX0VSUl9UWEZBSUwsCi0JREJVU19FUlJfVFhUSU1FT1VULAotCURCVVNfRVJSX1RYRFJPUCwKLQlEQlVTX0VSUl9SWEZBSUwsCi0JREJVU19FUlJfUlhEUk9QLAotCURCVVNfRVJSX1RYQ1RMRkFJTCwKLQlEQlVTX0VSUl9SWENUTEZBSUwsCi0JREJVU19FUlJfUkVHX1BBUkFNLAotCURCVVNfU1RBVFVTX0NBTkNFTExFRAotfTsKLQotI2RlZmluZSBFUlJfQ0JNQVNLX1RYRkFJTAkJMHgwMDAwMDAwMQotI2RlZmluZSBFUlJfQ0JNQVNLX1JYRkFJTAkJMHgwMDAwMDAwMgotI2RlZmluZSBFUlJfQ0JNQVNLX0FMTAkJCTB4RkZGRkZGRkYKLQotI2RlZmluZSBEQlVTX0NCQ1RMX1dSSVRFCQkwCi0jZGVmaW5lIERCVVNfQ0JDVExfUkVBRAkJCTEKLQotI2RlZmluZSBEQlVTX1RYX1JFVFJZX0xJTUlUCQkzCS8qIHJldHJpZXMgZm9yIGZhaWxlZCB0eGlyYiAqLwotI2RlZmluZSBEQlVTX1RYX1RJTUVPVVRfSU5URVJWQUwJMjUwCS8qIHRpbWVvdXQgZm9yIHR4aXJiIGNvbXBsZXRlLCBpbiBtcyAqLwotCi0jZGVmaW5lIERCVVNfQlVGRkVSX1NJWkVfVFgJNTAwMAotI2RlZmluZSBEQlVTX0JVRkZFUl9TSVpFX1JYCTUwMDAKLQotI2RlZmluZSBEQlVTX0JVRkZFUl9TSVpFX1RYX05PQUdHCTIwNDgKLSNkZWZpbmUgREJVU19CVUZGRVJfU0laRV9SWF9OT0FHRwkyMDQ4Ci0KLS8qIERCVVMgdHlwZXMgKi8KLWVudW0gewotCURCVVNfVVNCLAotCURCVVNfU0RJTywKLQlEQlVTX1NQSSwKLQlEQlVTX1VOS05PV04KLX07Ci0KLWVudW0gZGJ1c19zdGF0ZSB7Ci0JREJVU19TVEFURV9ETF9QRU5ESU5HLAotCURCVVNfU1RBVEVfRExfRE9ORSwKLQlEQlVTX1NUQVRFX1VQLAotCURCVVNfU1RBVEVfRE9XTiwKLQlEQlVTX1NUQVRFX1BOUF9GV0RMLAotCURCVVNfU1RBVEVfRElTQ09OTkVDVAotfTsKLQotZW51bSBkYnVzX3BucF9zdGF0ZSB7Ci0JREJVU19QTlBfRElTQ09OTkVDVCwKLQlEQlVTX1BOUF9TTEVFUCwKLQlEQlVTX1BOUF9SRVNVTUUKLX07Ci0KLXR5cGVkZWYgZW51bSBfREVWSUNFX1NQRUVEIHsKLQlJTlZBTElEX1NQRUVEID0gLTEsCi0JTE9XX1NQRUVEID0gMSwJCS8qIFVTQiAxLjE6IDEuNSBNYnBzICovCi0JRlVMTF9TUEVFRCwJCS8qIFVTQiAxLjE6IDEyICBNYnBzICovCi0JSElHSF9TUEVFRCwJCS8qIFVTQiAyLjA6IDQ4MCBNYnBzICovCi0JU1VQRVJfU1BFRUQsCQkvKiBVU0IgMy4wOiA0LjggR2JwcyAqLwotfSBERVZJQ0VfU1BFRUQ7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLQlpbnQgYnVzdHlwZTsKLQlpbnQgdmlkOwotCWludCBwaWQ7Ci0JaW50IGRldmlkOwotCWludCBjaGlwcmV2OwkJLyogY2hpcCByZXZzaW9uIG51bWJlciAqLwotCWludCBtdHU7Ci0JaW50IG5jaGFuOwkJLyogRGF0YSBDaGFubmVscyAqLwotfSBkYnVzX2F0dHJpYl90OwotCi0vKiBGSVg6IEFjY291bnQgZm9yIGVycm9ycyByZWxhdGVkIHRvIERCVVM7Ci0gKiBMZXQgdXBwZXIgbGF5ZXIgYWNjb3VudCBmb3IgcGFja2V0cy9ieXRlcwotICovCi10eXBlZGVmIHN0cnVjdCB7Ci0JdTMyIHJ4X2Vycm9yczsKLQl1MzIgdHhfZXJyb3JzOwotCXUzMiByeF9kcm9wcGVkOwotCXUzMiB0eF9kcm9wcGVkOwotfSBkYnVzX3N0YXRzX3Q7Ci0KLS8qCi0gKiBDb25maWd1cmFibGUgQlVTIHBhcmFtZXRlcnMKLSAqLwotdHlwZWRlZiBzdHJ1Y3QgewotCWJvb2wgcnhjdGxfZGVmZXJyZXNwb2s7Ci19IGRidXNfY29uZmlnX3Q7Ci0KLXN0cnVjdCBkYnVzX2NhbGxiYWNrczsKLXN0cnVjdCBleGVjX3Bhcm1zOwotCi10eXBlZGVmIHZvaWQgKigqcHJvYmVfY2JfdCkgKHZvaWQgKmFyZywgY29uc3QgY2hhciAqZGVzYywgdTMyIGJ1c3R5cGUsCi0JCQkgICAgIHUzMiBoZHJsZW4pOwotdHlwZWRlZiB2b2lkICgqZGlzY29ubmVjdF9jYl90KSAodm9pZCAqYXJnKTsKLXR5cGVkZWYgdm9pZCAqKCpleGVjX2NiX3QpIChzdHJ1Y3QgZXhlY19wYXJtcyAqYXJncyk7Ci0KLS8qIENsaWVudCBjYWxsYmFja3MgcmVnaXN0ZXJlZCBkdXJpbmcgZGJ1c19hdHRhY2goKSAqLwotdHlwZWRlZiBzdHJ1Y3QgZGJ1c19jYWxsYmFja3MgewotCXZvaWQgKCpzZW5kX2NvbXBsZXRlKSAodm9pZCAqY2JhcmcsIHZvaWQgKmluZm8sIGludCBzdGF0dXMpOwotCXZvaWQgKCpyZWN2X2J1ZikgKHZvaWQgKmNiYXJnLCB1OCAqYnVmLCBpbnQgbGVuKTsKLQl2b2lkICgqcmVjdl9wa3QpICh2b2lkICpjYmFyZywgdm9pZCAqcGt0KTsKLQl2b2lkICgqdHhmbG93Y29udHJvbCkgKHZvaWQgKmNiYXJnLCBib29sIG9ub2ZmKTsKLQl2b2lkICgqZXJyaGFuZGxlcikgKHZvaWQgKmNiYXJnLCBpbnQgZXJyKTsKLQl2b2lkICgqY3RsX2NvbXBsZXRlKSAodm9pZCAqY2JhcmcsIGludCB0eXBlLCBpbnQgc3RhdHVzKTsKLQl2b2lkICgqc3RhdGVfY2hhbmdlKSAodm9pZCAqY2JhcmcsIGludCBzdGF0ZSk7Ci0Jdm9pZCAqKCpwa3RnZXQpICh2b2lkICpjYmFyZywgdWludCBsZW4sIGJvb2wgc2VuZCk7Ci0Jdm9pZCAoKnBrdGZyZWUpICh2b2lkICpjYmFyZywgdm9pZCAqcCwgYm9vbCBzZW5kKTsKLX0gZGJ1c19jYWxsYmFja3NfdDsKLQotc3RydWN0IGRidXNfcHViOwotc3RydWN0IGJjbXN0cmJ1ZjsKLXN0cnVjdCBkYnVzX2lyYjsKLXN0cnVjdCBkYnVzX2lyYl9yeDsKLXN0cnVjdCBkYnVzX2lyYl90eDsKLXN0cnVjdCBkYnVzX2ludGZfY2FsbGJhY2tzOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0Jdm9pZCAqKCphdHRhY2gpIChzdHJ1Y3QgZGJ1c19wdWIgKnB1Yiwgdm9pZCAqY2JhcmcsCi0JCQkgc3RydWN0IGRidXNfaW50Zl9jYWxsYmFja3MgKmNicyk7Ci0Jdm9pZCAoKmRldGFjaCkgKHN0cnVjdCBkYnVzX3B1YiAqcHViLCB2b2lkICpidXMpOwotCi0JaW50ICgqdXApICh2b2lkICpidXMpOwotCWludCAoKmRvd24pICh2b2lkICpidXMpOwotCWludCAoKnNlbmRfaXJiKSAodm9pZCAqYnVzLCBzdHJ1Y3QgZGJ1c19pcmJfdHggKnR4aXJiKTsKLQlpbnQgKCpyZWN2X2lyYikgKHZvaWQgKmJ1cywgc3RydWN0IGRidXNfaXJiX3J4ICpyeGlyYik7Ci0JaW50ICgqY2FuY2VsX2lyYikgKHZvaWQgKmJ1cywgc3RydWN0IGRidXNfaXJiX3R4ICp0eGlyYik7Ci0JaW50ICgqc2VuZF9jdGwpICh2b2lkICpidXMsIHU4ICpidWYsIGludCBsZW4pOwotCWludCAoKnJlY3ZfY3RsKSAodm9pZCAqYnVzLCB1OCAqYnVmLCBpbnQgbGVuKTsKLQlpbnQgKCpnZXRfc3RhdHMpICh2b2lkICpidXMsIGRidXNfc3RhdHNfdCAqc3RhdHMpOwotCWludCAoKmdldF9hdHRyaWIpICh2b2lkICpidXMsIGRidXNfYXR0cmliX3QgKmF0dHJpYik7Ci0KLQlpbnQgKCpwbnApICh2b2lkICpidXMsIGludCBldmVudCk7Ci0JaW50ICgqcmVtb3ZlKSAodm9pZCAqYnVzKTsKLQlpbnQgKCpyZXN1bWUpICh2b2lkICpidXMpOwotCWludCAoKnN1c3BlbmQpICh2b2lkICpidXMpOwotCWludCAoKnN0b3ApICh2b2lkICpidXMpOwotCWludCAoKnJlc2V0KSAodm9pZCAqYnVzKTsKLQotCS8qIEFjY2VzcyB0byBidXMgYnVmZmVycyBkaXJlY3RseSAqLwotCXZvaWQgKigqcGt0Z2V0KSAodm9pZCAqYnVzLCBpbnQgbGVuKTsKLQl2b2lkICgqcGt0ZnJlZSkgKHZvaWQgKmJ1cywgdm9pZCAqcGt0KTsKLQotCWludCAoKmlvdmFyX29wKSAodm9pZCAqYnVzLCBjb25zdCBjaGFyICpuYW1lLCB2b2lkICpwYXJhbXMsIGludCBwbGVuLAotCQkJIHZvaWQgKmFyZywgaW50IGxlbiwgYm9vbCBzZXQpOwotCXZvaWQgKCpkdW1wKSAodm9pZCAqYnVzLCBzdHJ1Y3QgYmNtc3RyYnVmICpzdHJidWYpOwotCWludCAoKnNldF9jb25maWcpICh2b2lkICpidXMsIGRidXNfY29uZmlnX3QgKmNvbmZpZyk7Ci0JaW50ICgqZ2V0X2NvbmZpZykgKHZvaWQgKmJ1cywgZGJ1c19jb25maWdfdCAqY29uZmlnKTsKLQotCSBib29sKCpkZXZpY2VfZXhpc3RzKSAodm9pZCAqYnVzKTsKLQkgYm9vbCgqZGxuZWVkZWQpICh2b2lkICpidXMpOwotCWludCAoKmRsc3RhcnQpICh2b2lkICpidXMsIHU4ICpmdywgaW50IGxlbik7Ci0JaW50ICgqZGxydW4pICh2b2lkICpidXMpOwotCSBib29sKCpyZWN2X25lZWRlZCkgKHZvaWQgKmJ1cyk7Ci0KLQl2b2lkICooKmV4ZWNfcnhsb2NrKSAodm9pZCAqYnVzLCBleGVjX2NiX3QgZnVuYywKLQkJCSAgICAgIHN0cnVjdCBleGVjX3Bhcm1zICphcmdzKTsKLQl2b2lkICooKmV4ZWNfdHhsb2NrKSAodm9pZCAqYnVzLCBleGVjX2NiX3QgZnVuYywKLQkJCSAgICAgIHN0cnVjdCBleGVjX3Bhcm1zICphcmdzKTsKLQotCWludCAoKnR4X3RpbWVyX2luaXQpICh2b2lkICpidXMpOwotCWludCAoKnR4X3RpbWVyX3N0YXJ0KSAodm9pZCAqYnVzLCB1aW50IHRpbWVvdXQpOwotCWludCAoKnR4X3RpbWVyX3N0b3ApICh2b2lkICpidXMpOwotCi0JaW50ICgqc2NoZWRfZHBjKSAodm9pZCAqYnVzKTsKLQlpbnQgKCpsb2NrKSAodm9pZCAqYnVzKTsKLQlpbnQgKCp1bmxvY2spICh2b2lkICpidXMpOwotCWludCAoKnNjaGVkX3Byb2JlX2NiKSAodm9pZCAqYnVzKTsKLQotCWludCAoKnNodXRkb3duKSAodm9pZCAqYnVzKTsKLQotCWludCAoKnJlY3Zfc3RvcCkgKHZvaWQgKmJ1cyk7Ci0JaW50ICgqcmVjdl9yZXN1bWUpICh2b2lkICpidXMpOwotCi0JLyogQWRkIGZyb20gdGhlIGJvdHRvbSAqLwotfSBkYnVzX2ludGZfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgZGJ1c19wdWIgewotCXN0cnVjdCBvc2xfaW5mbyAqb3NoOwotCWRidXNfc3RhdHNfdCBzdGF0czsKLQlkYnVzX2F0dHJpYl90IGF0dHJpYjsKLQllbnVtIGRidXNfc3RhdGUgYnVzc3RhdGU7Ci0JREVWSUNFX1NQRUVEIGRldmljZV9zcGVlZDsKLQlpbnQgbnR4cSwgbnJ4cSwgcnhzaXplOwotCXZvaWQgKmJ1czsKLQlzdHJ1Y3Qgc2hhcmVkX2luZm8gKnNoOwotfSBkYnVzX3B1Yl90OwotCi0jZGVmaW5lIEJVU19JTkZPKGJ1cywgdHlwZSkgKCgodHlwZSAqKSBidXMpLT5wdWItPmJ1cykKLQotLyoKLSAqIFB1YmxpYyBCdXMgRnVuY3Rpb24gSW50ZXJmYWNlCi0gKi8KLWV4dGVybiBpbnQgZGJ1c19yZWdpc3RlcihpbnQgdmlkLCBpbnQgcGlkLCBwcm9iZV9jYl90IHByY2IsCi0JCQkgZGlzY29ubmVjdF9jYl90IGRpc2NiLCB2b2lkICpwcmFyZywgdm9pZCAqcGFyYW0xLAotCQkJIHZvaWQgKnBhcmFtMik7Ci1leHRlcm4gaW50IGRidXNfZGVyZWdpc3Rlcih2b2lkKTsKLQotZXh0ZXJuIGNvbnN0IGRidXNfcHViX3QgKmRidXNfYXR0YWNoKHN0cnVjdCBvc2xfaW5mbyAqb3NoLCBpbnQgcnhzaXplLCBpbnQgbnJ4cSwKLQkJCQkgICAgIGludCBudHhxLCB2b2lkICpjYmFyZywKLQkJCQkgICAgIGRidXNfY2FsbGJhY2tzX3QgKmNicywKLQkJCQkgICAgIHN0cnVjdCBzaGFyZWRfaW5mbyAqc2gpOwotZXh0ZXJuIHZvaWQgZGJ1c19kZXRhY2goY29uc3QgZGJ1c19wdWJfdCAqcHViKTsKLQotZXh0ZXJuIGludCBkYnVzX3VwKGNvbnN0IGRidXNfcHViX3QgKnB1Yik7Ci1leHRlcm4gaW50IGRidXNfZG93bihjb25zdCBkYnVzX3B1Yl90ICpwdWIpOwotZXh0ZXJuIGludCBkYnVzX3N0b3AoY29uc3QgZGJ1c19wdWJfdCAqcHViKTsKLWV4dGVybiBpbnQgZGJ1c19zaHV0ZG93bihjb25zdCBkYnVzX3B1Yl90ICpwdWIpOwotZXh0ZXJuIHZvaWQgZGJ1c19mbG93Y3RybF9yeChjb25zdCBkYnVzX3B1Yl90ICpwdWIsIGJvb2wgb24pOwotCi1leHRlcm4gaW50IGRidXNfc2VuZF9idWYoY29uc3QgZGJ1c19wdWJfdCAqcHViLCB1OCAqYnVmLCBpbnQgbGVuLAotCQkJIHZvaWQgKmluZm8pOwotZXh0ZXJuIGludCBkYnVzX3NlbmRfcGt0KGNvbnN0IGRidXNfcHViX3QgKnB1Yiwgdm9pZCAqcGt0LCB2b2lkICppbmZvKTsKLWV4dGVybiBpbnQgZGJ1c19zZW5kX2N0bChjb25zdCBkYnVzX3B1Yl90ICpwdWIsIHU4ICpidWYsIGludCBsZW4pOwotZXh0ZXJuIGludCBkYnVzX3JlY3ZfY3RsKGNvbnN0IGRidXNfcHViX3QgKnB1YiwgdTggKmJ1ZiwgaW50IGxlbik7Ci0KLWV4dGVybiBpbnQgZGJ1c19nZXRfc3RhdHMoY29uc3QgZGJ1c19wdWJfdCAqcHViLCBkYnVzX3N0YXRzX3QgKnN0YXRzKTsKLWV4dGVybiBpbnQgZGJ1c19nZXRfYXR0cmliKGNvbnN0IGRidXNfcHViX3QgKnB1YiwgZGJ1c19hdHRyaWJfdCAqYXR0cmliKTsKLWV4dGVybiBpbnQgZGJ1c19nZXRfZGV2aWNlX3NwZWVkKGNvbnN0IGRidXNfcHViX3QgKnB1Yik7Ci1leHRlcm4gaW50IGRidXNfc2V0X2NvbmZpZyhjb25zdCBkYnVzX3B1Yl90ICpwdWIsIGRidXNfY29uZmlnX3QgKmNvbmZpZyk7Ci1leHRlcm4gaW50IGRidXNfZ2V0X2NvbmZpZyhjb25zdCBkYnVzX3B1Yl90ICpwdWIsIGRidXNfY29uZmlnX3QgKmNvbmZpZyk7Ci0KLWV4dGVybiB2b2lkICpkYnVzX3BrdGdldChjb25zdCBkYnVzX3B1Yl90ICpwdWIsIGludCBsZW4pOwotZXh0ZXJuIHZvaWQgZGJ1c19wa3RmcmVlKGNvbnN0IGRidXNfcHViX3QgKnB1Yiwgdm9pZCAqcGt0KTsKLQotZXh0ZXJuIGludCBkYnVzX3NldF9lcnJtYXNrKGNvbnN0IGRidXNfcHViX3QgKnB1YiwgdTMyIG1hc2spOwotZXh0ZXJuIGludCBkYnVzX3BucF9zbGVlcChjb25zdCBkYnVzX3B1Yl90ICpwdWIpOwotZXh0ZXJuIGludCBkYnVzX3BucF9yZXN1bWUoY29uc3QgZGJ1c19wdWJfdCAqcHViLCBpbnQgKmZ3X3JlbG9hZCk7Ci1leHRlcm4gaW50IGRidXNfcG5wX2Rpc2Nvbm5lY3QoY29uc3QgZGJ1c19wdWJfdCAqcHViKTsKLQotZXh0ZXJuIGludCBkYnVzX2lvdmFyX29wKGNvbnN0IGRidXNfcHViX3QgKnB1YiwgY29uc3QgY2hhciAqbmFtZSwKLQkJCSB2b2lkICpwYXJhbXMsIGludCBwbGVuLCB2b2lkICphcmcsIGludCBsZW4sIGJvb2wgc2V0KTsKLSNpZmRlZiBCQ01EQkcKLWV4dGVybiB2b2lkIGRidXNfaGlzdF9kdW1wKGNvbnN0IGRidXNfcHViX3QgKnB1Yiwgc3RydWN0IGJjbXN0cmJ1ZiAqYik7Ci0jZW5kaWYJCQkJLyogQkNNREJHICovCi0vKgotICogUHJpdmF0ZSBDb21tb24gQnVzIEludGVyZmFjZQotICovCi0KLS8qIElPIFJlcXVlc3QgQmxvY2sgKElSQikgKi8KLXR5cGVkZWYgc3RydWN0IGRidXNfaXJiIHsKLQlzdHJ1Y3QgZGJ1c19pcmIgKm5leHQ7CS8qIGl0J3MgY2FzdGVkIGZyb20gZGJ1c19pcmJfdHggb3IgZGJ1c19pcmJfcnggc3RydWN0ICovCi19IGRidXNfaXJiX3Q7Ci0KLXR5cGVkZWYgc3RydWN0IGRidXNfaXJiX3J4IHsKLQlzdHJ1Y3QgZGJ1c19pcmIgaXJiOwkvKiBNdXN0IGJlIGZpcnN0ICovCi0JdTggKmJ1ZjsKLQlpbnQgYnVmX2xlbjsKLQlpbnQgYWN0dWFsX2xlbjsKLQl2b2lkICpwa3Q7Ci0Jdm9pZCAqaW5mbzsKLQl2b2lkICphcmc7Ci19IGRidXNfaXJiX3J4X3Q7Ci0KLXR5cGVkZWYgc3RydWN0IGRidXNfaXJiX3R4IHsKLQlzdHJ1Y3QgZGJ1c19pcmIgaXJiOwkvKiBNdXN0IGJlIGZpcnN0ICovCi0JdTggKmJ1ZjsKLQlpbnQgbGVuOwotCXZvaWQgKnBrdDsKLQlpbnQgcmV0cnlfY291bnQ7Ci0Jdm9pZCAqaW5mbzsKLQl2b2lkICphcmc7Ci19IGRidXNfaXJiX3R4X3Q7Ci0KLS8qIERCVVMgaW50ZXJmYWNlIGNhbGxiYWNrcyBhcmUgZGlmZmVyZW50IGZyb20gdXNlciBjYWxsYmFja3MKLSAqIHNvLCBpbnRlcm5hbGx5LCBkaWZmZXJlbnQgaW5mbyBjYW4gYmUgcGFzc2VkIHRvIHVwcGVyIGxheWVyCi0gKi8KLXR5cGVkZWYgc3RydWN0IGRidXNfaW50Zl9jYWxsYmFja3MgewotCXZvaWQgKCpzZW5kX2lyYl90aW1lb3V0KSAodm9pZCAqY2JhcmcsIGRidXNfaXJiX3R4X3QgKnR4aXJiKTsKLQl2b2lkICgqc2VuZF9pcmJfY29tcGxldGUpICh2b2lkICpjYmFyZywgZGJ1c19pcmJfdHhfdCAqdHhpcmIsCi0JCQkJICAgaW50IHN0YXR1cyk7Ci0Jdm9pZCAoKnJlY3ZfaXJiX2NvbXBsZXRlKSAodm9pZCAqY2JhcmcsIGRidXNfaXJiX3J4X3QgKnJ4aXJiLAotCQkJCSAgIGludCBzdGF0dXMpOwotCXZvaWQgKCplcnJoYW5kbGVyKSAodm9pZCAqY2JhcmcsIGludCBlcnIpOwotCXZvaWQgKCpjdGxfY29tcGxldGUpICh2b2lkICpjYmFyZywgaW50IHR5cGUsIGludCBzdGF0dXMpOwotCXZvaWQgKCpzdGF0ZV9jaGFuZ2UpICh2b2lkICpjYmFyZywgaW50IHN0YXRlKTsKLQkgYm9vbCgqaXNyKSAodm9pZCAqY2JhcmcsIGJvb2wgKndhbnRkcGMpOwotCSBib29sKCpkcGMpICh2b2lkICpjYmFyZywgYm9vbCBib3VuZGVkKTsKLQl2b2lkICgqd2F0Y2hkb2cpICh2b2lkICpjYmFyZyk7Ci0Jdm9pZCAqKCpwa3RnZXQpICh2b2lkICpjYmFyZywgdWludCBsZW4sIGJvb2wgc2VuZCk7Ci0Jdm9pZCAoKnBrdGZyZWUpICh2b2lkICpjYmFyZywgdm9pZCAqcCwgYm9vbCBzZW5kKTsKLQlzdHJ1Y3QgZGJ1c19pcmIgKigqZ2V0aXJiKSAodm9pZCAqY2JhcmcsIGJvb2wgc2VuZCk7Ci0Jdm9pZCAoKnJ4ZXJyX2luZGljYXRlKSAodm9pZCAqY2JhcmcsIGJvb2wgb24pOwotfSBkYnVzX2ludGZfY2FsbGJhY2tzX3Q7Ci0KLS8qCi0gKiBQb3J0aW5nOiBUbyBzdXBwb3J0IG5ldyBidXMsIHBvcnQgdGhlc2UgZnVuY3Rpb25zIGJlbG93Ci0gKi8KLQotLyoKLSAqIEJ1cyBzcGVjaWZpYyBJbnRlcmZhY2UKLSAqIEltcGxlbWVudGVkIGJ5IGRidXNfdXNiLmMvZGJ1c19zZGlvLmMKLSAqLwotZXh0ZXJuIGludCBkYnVzX2J1c19yZWdpc3RlcihpbnQgdmlkLCBpbnQgcGlkLCBwcm9iZV9jYl90IHByY2IsCi0JCQkgICAgIGRpc2Nvbm5lY3RfY2JfdCBkaXNjYiwgdm9pZCAqcHJhcmcsCi0JCQkgICAgIGRidXNfaW50Zl90ICoqaW50Ziwgdm9pZCAqcGFyYW0xLCB2b2lkICpwYXJhbTIpOwotZXh0ZXJuIGludCBkYnVzX2J1c19kZXJlZ2lzdGVyKHZvaWQpOwotCi0vKgotICogQnVzLXNwZWNpZmljIGFuZCBPUy1zcGVjaWZpYyBJbnRlcmZhY2UKLSAqIEltcGxlbWVudGVkIGJ5IGRidXNfdXNiX1tsaW51eC9uZGlzXS5jL2RidXNfc2Rpb19bbGludXgvbmRpc10uYwotICovCi1leHRlcm4gaW50IGRidXNfYnVzX29zbF9yZWdpc3RlcihpbnQgdmlkLCBpbnQgcGlkLCBwcm9iZV9jYl90IHByY2IsCi0JCQkJIGRpc2Nvbm5lY3RfY2JfdCBkaXNjYiwgdm9pZCAqcHJhcmcsCi0JCQkJIGRidXNfaW50Zl90ICoqaW50Ziwgdm9pZCAqcGFyYW0xLAotCQkJCSB2b2lkICpwYXJhbTIpOwotZXh0ZXJuIGludCBkYnVzX2J1c19vc2xfZGVyZWdpc3Rlcih2b2lkKTsKLQotLyoKLSAqIEJ1cy1zcGVjaWZpYywgT1Mtc3BlY2lmaWMsIEhXLXNwZWNpZmljIEludGVyZmFjZQotICogTWFpbmx5IGZvciBTRElPIEhvc3QgSFcgY29udHJvbGxlcgotICovCi1leHRlcm4gaW50IGRidXNfYnVzX29zbF9od19yZWdpc3RlcihpbnQgdmlkLCBpbnQgcGlkLCBwcm9iZV9jYl90IHByY2IsCi0JCQkJICAgIGRpc2Nvbm5lY3RfY2JfdCBkaXNjYiwgdm9pZCAqcHJhcmcsCi0JCQkJICAgIGRidXNfaW50Zl90ICoqaW50Zik7Ci1leHRlcm4gaW50IGRidXNfYnVzX29zbF9od19kZXJlZ2lzdGVyKHZvaWQpOwotCi0jZW5kaWYJCQkJLyogX19EQlVTX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9pbmNsdWRlL2VwaXZlcnMuaCBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvaW5jbHVkZS9lcGl2ZXJzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlNmI1MTkuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9pbmNsdWRlL2VwaXZlcnMuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKLSAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCi0gKgotICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCi0gKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkKLSAqIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUwotICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTgotICogT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTgotICogQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KLSAqLwotCi0jaWZuZGVmIF9lcGl2ZXJzX2hfCi0jZGVmaW5lIF9lcGl2ZXJzX2hfCi0KLSNkZWZpbmUJRVBJX01BSk9SX1ZFUlNJT04JNQotCi0jZGVmaW5lCUVQSV9NSU5PUl9WRVJTSU9OCTc1Ci0KLSNkZWZpbmUJRVBJX1JDX05VTUJFUgkJMTEKLQotI2RlZmluZQlFUElfSU5DUkVNRU5UQUxfTlVNQkVSCTAKLQotI2RlZmluZSBFUElfQlVJTERfTlVNQkVSCTEKLQotI2RlZmluZQlFUElfVkVSU0lPTgkJeyA1LCA3NSwgMTEsIDAgfQotCi0jaWZkZWYgQkNNU0RJTwotLyogRVBJX1ZFUlNJT05fTlVNIG11c3QgbWF0Y2ggRlcgdmVyc2lvbiAqLwotI2RlZmluZQlFUElfVkVSU0lPTl9OVU0JCTB4MDU0YjBjMDAKLSNlbHNlCi0jZGVmaW5lCUVQSV9WRVJTSU9OX05VTQkJMHgwNTRiMGIwMAotI2VuZGlmCi0KLSNkZWZpbmUgRVBJX1ZFUlNJT05fREVWCQk1Ljc1LjExCi0KLS8qIERyaXZlciBWZXJzaW9uIFN0cmluZywgQVNDSUksIDMyIGNoYXJzIG1heCAqLwotI2RlZmluZQlFUElfVkVSU0lPTl9TVFIJCSI1Ljc1LjExIgotCi0jZW5kaWYJCQkJLyogX2VwaXZlcnNfaF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvaW5jbHVkZS9obmRkbWEuaCBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvaW5jbHVkZS9obmRkbWEuaAppbmRleCBiZWU0Yzg5Li40YzU0NjJiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2luY2x1ZGUvaG5kZG1hLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9pbmNsdWRlL2huZGRtYS5oCkBAIC0xOSw3ICsxOSw3IEBACiAKICNpZm5kZWYgX2huZGRtYV9wdWJfCiAjZGVmaW5lIF9obmRkbWFfcHViXwotdHlwZWRlZiBjb25zdCBzdHJ1Y3QgaG5kZG1hX3B1YiBobmRkbWFfdDsKK3N0cnVjdCBobmRkbWFfcHViOwogI2VuZGlmCQkJCS8qIF9obmRkbWFfcHViXyAqLwogCiAvKiByYW5nZSBwYXJhbSBmb3IgZG1hX2dldG5leHR0eHAoKSBhbmQgZG1hX3R4cmVjbGFpbSAqLwpAQCAtMzAsNTIgKzMwLDU0IEBACiB9IHR4ZF9yYW5nZV90OwogCiAvKiBkbWEgZnVuY3Rpb24gdHlwZSAqLwotdHlwZWRlZiB2b2lkICgqZGlfZGV0YWNoX3QpIChobmRkbWFfdCAqZG1haCk7Ci10eXBlZGVmIGJvb2woKmRpX3R4cmVzZXRfdCkgKGhuZGRtYV90ICpkbWFoKTsKLXR5cGVkZWYgYm9vbCgqZGlfcnhyZXNldF90KSAoaG5kZG1hX3QgKmRtYWgpOwotdHlwZWRlZiBib29sKCpkaV9yeGlkbGVfdCkgKGhuZGRtYV90ICpkbWFoKTsKLXR5cGVkZWYgdm9pZCAoKmRpX3R4aW5pdF90KSAoaG5kZG1hX3QgKmRtYWgpOwotdHlwZWRlZiBib29sKCpkaV90eGVuYWJsZWRfdCkgKGhuZGRtYV90ICpkbWFoKTsKLXR5cGVkZWYgdm9pZCAoKmRpX3J4aW5pdF90KSAoaG5kZG1hX3QgKmRtYWgpOwotdHlwZWRlZiB2b2lkICgqZGlfdHhzdXNwZW5kX3QpIChobmRkbWFfdCAqZG1haCk7Ci10eXBlZGVmIHZvaWQgKCpkaV90eHJlc3VtZV90KSAoaG5kZG1hX3QgKmRtYWgpOwotdHlwZWRlZiBib29sKCpkaV90eHN1c3BlbmRlZF90KSAoaG5kZG1hX3QgKmRtYWgpOwotdHlwZWRlZiBib29sKCpkaV90eHN1c3BlbmRlZGlkbGVfdCkgKGhuZGRtYV90ICpkbWFoKTsKLXR5cGVkZWYgaW50ICgqZGlfdHhmYXN0X3QpIChobmRkbWFfdCAqZG1haCwgdm9pZCAqcCwgYm9vbCBjb21taXQpOwotdHlwZWRlZiBpbnQgKCpkaV90eHVuZnJhbWVkX3QpIChobmRkbWFfdCAqZG1haCwgdm9pZCAqcCwgdWludCBsZW4sCit0eXBlZGVmIHZvaWQgKCpkaV9kZXRhY2hfdCkgKHN0cnVjdCBobmRkbWFfcHViICpkbWFoKTsKK3R5cGVkZWYgYm9vbCgqZGlfdHhyZXNldF90KSAoc3RydWN0IGhuZGRtYV9wdWIgKmRtYWgpOwordHlwZWRlZiBib29sKCpkaV9yeHJlc2V0X3QpIChzdHJ1Y3QgaG5kZG1hX3B1YiAqZG1haCk7Cit0eXBlZGVmIGJvb2woKmRpX3J4aWRsZV90KSAoc3RydWN0IGhuZGRtYV9wdWIgKmRtYWgpOwordHlwZWRlZiB2b2lkICgqZGlfdHhpbml0X3QpIChzdHJ1Y3QgaG5kZG1hX3B1YiAqZG1haCk7Cit0eXBlZGVmIGJvb2woKmRpX3R4ZW5hYmxlZF90KSAoc3RydWN0IGhuZGRtYV9wdWIgKmRtYWgpOwordHlwZWRlZiB2b2lkICgqZGlfcnhpbml0X3QpIChzdHJ1Y3QgaG5kZG1hX3B1YiAqZG1haCk7Cit0eXBlZGVmIHZvaWQgKCpkaV90eHN1c3BlbmRfdCkgKHN0cnVjdCBobmRkbWFfcHViICpkbWFoKTsKK3R5cGVkZWYgdm9pZCAoKmRpX3R4cmVzdW1lX3QpIChzdHJ1Y3QgaG5kZG1hX3B1YiAqZG1haCk7Cit0eXBlZGVmIGJvb2woKmRpX3R4c3VzcGVuZGVkX3QpIChzdHJ1Y3QgaG5kZG1hX3B1YiAqZG1haCk7Cit0eXBlZGVmIGJvb2woKmRpX3R4c3VzcGVuZGVkaWRsZV90KSAoc3RydWN0IGhuZGRtYV9wdWIgKmRtYWgpOwordHlwZWRlZiBpbnQgKCpkaV90eGZhc3RfdCkgKHN0cnVjdCBobmRkbWFfcHViICpkbWFoLCBzdHJ1Y3Qgc2tfYnVmZiAqcCwKKwkJCSAgICBib29sIGNvbW1pdCk7Cit0eXBlZGVmIGludCAoKmRpX3R4dW5mcmFtZWRfdCkgKHN0cnVjdCBobmRkbWFfcHViICpkbWFoLCB2b2lkICpwLCB1aW50IGxlbiwKIAkJCQlib29sIGNvbW1pdCk7Ci10eXBlZGVmIHZvaWQgKigqZGlfZ2V0cG9zX3QpIChobmRkbWFfdCAqZGksIGJvb2wgZGlyZWN0aW9uKTsKLXR5cGVkZWYgdm9pZCAoKmRpX2ZpZm9sb29wYmFja2VuYWJsZV90KSAoaG5kZG1hX3QgKmRtYWgpOwotdHlwZWRlZiBib29sKCpkaV90eHN0b3BwZWRfdCkgKGhuZGRtYV90ICpkbWFoKTsKLXR5cGVkZWYgYm9vbCgqZGlfcnhzdG9wcGVkX3QpIChobmRkbWFfdCAqZG1haCk7Ci10eXBlZGVmIGJvb2woKmRpX3J4ZW5hYmxlX3QpIChobmRkbWFfdCAqZG1haCk7Ci10eXBlZGVmIGJvb2woKmRpX3J4ZW5hYmxlZF90KSAoaG5kZG1hX3QgKmRtYWgpOwotdHlwZWRlZiB2b2lkICooKmRpX3J4X3QpIChobmRkbWFfdCAqZG1haCk7Ci10eXBlZGVmIGJvb2woKmRpX3J4ZmlsbF90KSAoaG5kZG1hX3QgKmRtYWgpOwotdHlwZWRlZiB2b2lkICgqZGlfdHhyZWNsYWltX3QpIChobmRkbWFfdCAqZG1haCwgdHhkX3JhbmdlX3QgcmFuZ2UpOwotdHlwZWRlZiB2b2lkICgqZGlfcnhyZWNsYWltX3QpIChobmRkbWFfdCAqZG1haCk7Ci10eXBlZGVmIHVuc2lnbmVkIGxvbmcgKCpkaV9nZXR2YXJfdCkgKGhuZGRtYV90ICpkbWFoLCBjb25zdCBjaGFyICpuYW1lKTsKLXR5cGVkZWYgdm9pZCAqKCpkaV9nZXRuZXh0dHhwX3QpIChobmRkbWFfdCAqZG1haCwgdHhkX3JhbmdlX3QgcmFuZ2UpOwotdHlwZWRlZiB2b2lkICooKmRpX2dldG5leHRyeHBfdCkgKGhuZGRtYV90ICpkbWFoLCBib29sIGZvcmNlYWxsKTsKLXR5cGVkZWYgdm9pZCAqKCpkaV9wZWVrbmV4dHR4cF90KSAoaG5kZG1hX3QgKmRtYWgpOwotdHlwZWRlZiB2b2lkICooKmRpX3BlZWtuZXh0cnhwX3QpIChobmRkbWFfdCAqZG1haCk7Ci10eXBlZGVmIHZvaWQgKCpkaV9yeHBhcmFtX2dldF90KSAoaG5kZG1hX3QgKmRtYWgsIHUxNiAqcnhvZmZzZXQsCit0eXBlZGVmIHZvaWQgKigqZGlfZ2V0cG9zX3QpIChzdHJ1Y3QgaG5kZG1hX3B1YiAqZGksIGJvb2wgZGlyZWN0aW9uKTsKK3R5cGVkZWYgdm9pZCAoKmRpX2ZpZm9sb29wYmFja2VuYWJsZV90KSAoc3RydWN0IGhuZGRtYV9wdWIgKmRtYWgpOwordHlwZWRlZiBib29sKCpkaV90eHN0b3BwZWRfdCkgKHN0cnVjdCBobmRkbWFfcHViICpkbWFoKTsKK3R5cGVkZWYgYm9vbCgqZGlfcnhzdG9wcGVkX3QpIChzdHJ1Y3QgaG5kZG1hX3B1YiAqZG1haCk7Cit0eXBlZGVmIGJvb2woKmRpX3J4ZW5hYmxlX3QpIChzdHJ1Y3QgaG5kZG1hX3B1YiAqZG1haCk7Cit0eXBlZGVmIGJvb2woKmRpX3J4ZW5hYmxlZF90KSAoc3RydWN0IGhuZGRtYV9wdWIgKmRtYWgpOwordHlwZWRlZiB2b2lkICooKmRpX3J4X3QpIChzdHJ1Y3QgaG5kZG1hX3B1YiAqZG1haCk7Cit0eXBlZGVmIGJvb2woKmRpX3J4ZmlsbF90KSAoc3RydWN0IGhuZGRtYV9wdWIgKmRtYWgpOwordHlwZWRlZiB2b2lkICgqZGlfdHhyZWNsYWltX3QpIChzdHJ1Y3QgaG5kZG1hX3B1YiAqZG1haCwgdHhkX3JhbmdlX3QgcmFuZ2UpOwordHlwZWRlZiB2b2lkICgqZGlfcnhyZWNsYWltX3QpIChzdHJ1Y3QgaG5kZG1hX3B1YiAqZG1haCk7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgKCpkaV9nZXR2YXJfdCkgKHN0cnVjdCBobmRkbWFfcHViICpkbWFoLAorCQkJCSAgICAgIGNvbnN0IGNoYXIgKm5hbWUpOwordHlwZWRlZiB2b2lkICooKmRpX2dldG5leHR0eHBfdCkgKHN0cnVjdCBobmRkbWFfcHViICpkbWFoLCB0eGRfcmFuZ2VfdCByYW5nZSk7Cit0eXBlZGVmIHZvaWQgKigqZGlfZ2V0bmV4dHJ4cF90KSAoc3RydWN0IGhuZGRtYV9wdWIgKmRtYWgsIGJvb2wgZm9yY2VhbGwpOwordHlwZWRlZiB2b2lkICooKmRpX3BlZWtuZXh0dHhwX3QpIChzdHJ1Y3QgaG5kZG1hX3B1YiAqZG1haCk7Cit0eXBlZGVmIHZvaWQgKigqZGlfcGVla25leHRyeHBfdCkgKHN0cnVjdCBobmRkbWFfcHViICpkbWFoKTsKK3R5cGVkZWYgdm9pZCAoKmRpX3J4cGFyYW1fZ2V0X3QpIChzdHJ1Y3QgaG5kZG1hX3B1YiAqZG1haCwgdTE2ICpyeG9mZnNldCwKIAkJCQkgIHUxNiAqcnhidWZzaXplKTsKLXR5cGVkZWYgdm9pZCAoKmRpX3R4YmxvY2tfdCkgKGhuZGRtYV90ICpkbWFoKTsKLXR5cGVkZWYgdm9pZCAoKmRpX3R4dW5ibG9ja190KSAoaG5kZG1hX3QgKmRtYWgpOwotdHlwZWRlZiB1aW50KCpkaV90eGFjdGl2ZV90KSAoaG5kZG1hX3QgKmRtYWgpOwotdHlwZWRlZiB2b2lkICgqZGlfdHhyb3RhdGVfdCkgKGhuZGRtYV90ICpkbWFoKTsKLXR5cGVkZWYgdm9pZCAoKmRpX2NvdW50ZXJyZXNldF90KSAoaG5kZG1hX3QgKmRtYWgpOwotdHlwZWRlZiB1aW50KCpkaV9jdHJsZmxhZ3NfdCkgKGhuZGRtYV90ICpkbWFoLCB1aW50IG1hc2ssIHVpbnQgZmxhZ3MpOwotdHlwZWRlZiBjaGFyICooKmRpX2R1bXBfdCkgKGhuZGRtYV90ICpkbWFoLCBzdHJ1Y3QgYmNtc3RyYnVmICpiLAordHlwZWRlZiB2b2lkICgqZGlfdHhibG9ja190KSAoc3RydWN0IGhuZGRtYV9wdWIgKmRtYWgpOwordHlwZWRlZiB2b2lkICgqZGlfdHh1bmJsb2NrX3QpIChzdHJ1Y3QgaG5kZG1hX3B1YiAqZG1haCk7Cit0eXBlZGVmIHVpbnQoKmRpX3R4YWN0aXZlX3QpIChzdHJ1Y3QgaG5kZG1hX3B1YiAqZG1haCk7Cit0eXBlZGVmIHZvaWQgKCpkaV90eHJvdGF0ZV90KSAoc3RydWN0IGhuZGRtYV9wdWIgKmRtYWgpOwordHlwZWRlZiB2b2lkICgqZGlfY291bnRlcnJlc2V0X3QpIChzdHJ1Y3QgaG5kZG1hX3B1YiAqZG1haCk7Cit0eXBlZGVmIHVpbnQoKmRpX2N0cmxmbGFnc190KSAoc3RydWN0IGhuZGRtYV9wdWIgKmRtYWgsIHVpbnQgbWFzaywgdWludCBmbGFncyk7Cit0eXBlZGVmIGNoYXIgKigqZGlfZHVtcF90KSAoc3RydWN0IGhuZGRtYV9wdWIgKmRtYWgsIHN0cnVjdCBiY21zdHJidWYgKmIsCiAJCQkgICAgYm9vbCBkdW1wcmluZyk7Ci10eXBlZGVmIGNoYXIgKigqZGlfZHVtcHR4X3QpIChobmRkbWFfdCAqZG1haCwgc3RydWN0IGJjbXN0cmJ1ZiAqYiwKK3R5cGVkZWYgY2hhciAqKCpkaV9kdW1wdHhfdCkgKHN0cnVjdCBobmRkbWFfcHViICpkbWFoLCBzdHJ1Y3QgYmNtc3RyYnVmICpiLAogCQkJICAgICAgYm9vbCBkdW1wcmluZyk7Ci10eXBlZGVmIGNoYXIgKigqZGlfZHVtcHJ4X3QpIChobmRkbWFfdCAqZG1haCwgc3RydWN0IGJjbXN0cmJ1ZiAqYiwKK3R5cGVkZWYgY2hhciAqKCpkaV9kdW1wcnhfdCkgKHN0cnVjdCBobmRkbWFfcHViICpkbWFoLCBzdHJ1Y3QgYmNtc3RyYnVmICpiLAogCQkJICAgICAgYm9vbCBkdW1wcmluZyk7Ci10eXBlZGVmIHVpbnQoKmRpX3J4YWN0aXZlX3QpIChobmRkbWFfdCAqZG1haCk7Ci10eXBlZGVmIHVpbnQoKmRpX3R4cGVuZGluZ190KSAoaG5kZG1hX3QgKmRtYWgpOwotdHlwZWRlZiB1aW50KCpkaV90eGNvbW1pdHRlZF90KSAoaG5kZG1hX3QgKmRtYWgpOwordHlwZWRlZiB1aW50KCpkaV9yeGFjdGl2ZV90KSAoc3RydWN0IGhuZGRtYV9wdWIgKmRtYWgpOwordHlwZWRlZiB1aW50KCpkaV90eHBlbmRpbmdfdCkgKHN0cnVjdCBobmRkbWFfcHViICpkbWFoKTsKK3R5cGVkZWYgdWludCgqZGlfdHhjb21taXR0ZWRfdCkgKHN0cnVjdCBobmRkbWFfcHViICpkbWFoKTsKIAogLyogZG1hIG9wc3ZlYyAqLwogdHlwZWRlZiBzdHJ1Y3QgZGlfZmNuX3MgewpAQCAtMTQxLDcgKzE0Myw4IEBACiAJdWludCB0eG5vYnVmOwkJLyogdHggb3V0IG9mIGRtYSBkZXNjcmlwdG9ycyAqLwogfTsKIAotZXh0ZXJuIGhuZGRtYV90ICpkbWFfYXR0YWNoKG9zbF90ICpvc2gsIGNoYXIgKm5hbWUsIHNpX3QgKnNpaCwKK2V4dGVybiBzdHJ1Y3QgaG5kZG1hX3B1YiAqZG1hX2F0dGFjaChzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgY2hhciAqbmFtZSwKKwkJCSAgICBzaV90ICpzaWgsCiAJCQkgICAgdm9pZCAqZG1hcmVnc3R4LCB2b2lkICpkbWFyZWdzcngsIHVpbnQgbnR4ZCwKIAkJCSAgICB1aW50IG5yeGQsIHVpbnQgcnhidWZzaXplLCBpbnQgcnhleHRoZWFkcm9vbSwKIAkJCSAgICB1aW50IG5yeHBvc3QsIHVpbnQgcnhvZmZzZXQsIHVpbnQgKm1zZ19sZXZlbCk7CkBAIC0yMzgsNiArMjQxLDYgQEAKIGV4dGVybiB1aW50IGRtYV9hZGRyd2lkdGgoc2lfdCAqc2loLCB2b2lkICpkbWFyZWdzKTsKIAogLyogcGlvIGhlbHBlcnMgKi8KLWV4dGVybiB2b2lkIGRtYV90eHBpb2xvb3BiYWNrKG9zbF90ICpvc2gsIGRtYTMycmVnc190ICopOworZXh0ZXJuIHZvaWQgZG1hX3R4cGlvbG9vcGJhY2soc3RydWN0IG9zbF9pbmZvICpvc2gsIGRtYTMycmVnc190ICopOwogCiAjZW5kaWYJCQkJLyogX2huZGRtYV9oXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9pbmNsdWRlL2huZHBtdS5oIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9pbmNsdWRlL2huZHBtdS5oCmluZGV4IGJiY2YwZWUuLmEwMTEwZTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvaW5jbHVkZS9obmRwbXUuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2luY2x1ZGUvaG5kcG11LmgKQEAgLTI4LDQ0ICsyOCw0NCBAQAogI2RlZmluZSBTRVRfTERPX1ZPTFRBR0VfTE5MRE8xCTkKICNkZWZpbmUgU0VUX0xET19WT0xUQUdFX0xOTERPMl9TRUwJMTAKIAotZXh0ZXJuIHZvaWQgc2lfcG11X2luaXQoc2lfdCAqc2loLCBvc2xfdCAqb3NoKTsKLWV4dGVybiB2b2lkIHNpX3BtdV9jaGlwX2luaXQoc2lfdCAqc2loLCBvc2xfdCAqb3NoKTsKLWV4dGVybiB2b2lkIHNpX3BtdV9wbGxfaW5pdChzaV90ICpzaWgsIG9zbF90ICpvc2gsIHUzMiB4dGFsZnJlcSk7Ci1leHRlcm4gdm9pZCBzaV9wbXVfcmVzX2luaXQoc2lfdCAqc2loLCBvc2xfdCAqb3NoKTsKLWV4dGVybiB2b2lkIHNpX3BtdV9zd3JlZ19pbml0KHNpX3QgKnNpaCwgb3NsX3QgKm9zaCk7CitleHRlcm4gdm9pZCBzaV9wbXVfaW5pdChzaV90ICpzaWgsIHN0cnVjdCBvc2xfaW5mbyAqb3NoKTsKK2V4dGVybiB2b2lkIHNpX3BtdV9jaGlwX2luaXQoc2lfdCAqc2loLCBzdHJ1Y3Qgb3NsX2luZm8gKm9zaCk7CitleHRlcm4gdm9pZCBzaV9wbXVfcGxsX2luaXQoc2lfdCAqc2loLCBzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgdTMyIHh0YWxmcmVxKTsKK2V4dGVybiB2b2lkIHNpX3BtdV9yZXNfaW5pdChzaV90ICpzaWgsIHN0cnVjdCBvc2xfaW5mbyAqb3NoKTsKK2V4dGVybiB2b2lkIHNpX3BtdV9zd3JlZ19pbml0KHNpX3QgKnNpaCwgc3RydWN0IG9zbF9pbmZvICpvc2gpOwogCi1leHRlcm4gdTMyIHNpX3BtdV9mb3JjZV9pbHAoc2lfdCAqc2loLCBvc2xfdCAqb3NoLCBib29sIGZvcmNlKTsKK2V4dGVybiB1MzIgc2lfcG11X2ZvcmNlX2lscChzaV90ICpzaWgsIHN0cnVjdCBvc2xfaW5mbyAqb3NoLCBib29sIGZvcmNlKTsKIAotZXh0ZXJuIHUzMiBzaV9wbXVfc2lfY2xvY2soc2lfdCAqc2loLCBvc2xfdCAqb3NoKTsKLWV4dGVybiB1MzIgc2lfcG11X2NwdV9jbG9jayhzaV90ICpzaWgsIG9zbF90ICpvc2gpOwotZXh0ZXJuIHUzMiBzaV9wbXVfbWVtX2Nsb2NrKHNpX3QgKnNpaCwgb3NsX3QgKm9zaCk7Ci1leHRlcm4gdTMyIHNpX3BtdV9hbHBfY2xvY2soc2lfdCAqc2loLCBvc2xfdCAqb3NoKTsKLWV4dGVybiB1MzIgc2lfcG11X2lscF9jbG9jayhzaV90ICpzaWgsIG9zbF90ICpvc2gpOworZXh0ZXJuIHUzMiBzaV9wbXVfc2lfY2xvY2soc2lfdCAqc2loLCBzdHJ1Y3Qgb3NsX2luZm8gKm9zaCk7CitleHRlcm4gdTMyIHNpX3BtdV9jcHVfY2xvY2soc2lfdCAqc2loLCBzdHJ1Y3Qgb3NsX2luZm8gKm9zaCk7CitleHRlcm4gdTMyIHNpX3BtdV9tZW1fY2xvY2soc2lfdCAqc2loLCBzdHJ1Y3Qgb3NsX2luZm8gKm9zaCk7CitleHRlcm4gdTMyIHNpX3BtdV9hbHBfY2xvY2soc2lfdCAqc2loLCBzdHJ1Y3Qgb3NsX2luZm8gKm9zaCk7CitleHRlcm4gdTMyIHNpX3BtdV9pbHBfY2xvY2soc2lfdCAqc2loLCBzdHJ1Y3Qgb3NsX2luZm8gKm9zaCk7CiAKLWV4dGVybiB2b2lkIHNpX3BtdV9zZXRfc3dpdGNoZXJfdm9sdGFnZShzaV90ICpzaWgsIG9zbF90ICpvc2gsCitleHRlcm4gdm9pZCBzaV9wbXVfc2V0X3N3aXRjaGVyX3ZvbHRhZ2Uoc2lfdCAqc2loLCBzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwKIAkJCQkJdTggYmJfdm9sdGFnZSwgdTggcmZfdm9sdGFnZSk7Ci1leHRlcm4gdm9pZCBzaV9wbXVfc2V0X2xkb192b2x0YWdlKHNpX3QgKnNpaCwgb3NsX3QgKm9zaCwgdTggbGRvLAorZXh0ZXJuIHZvaWQgc2lfcG11X3NldF9sZG9fdm9sdGFnZShzaV90ICpzaWgsIHN0cnVjdCBvc2xfaW5mbyAqb3NoLCB1OCBsZG8sCiAJCQkJICAgdTggdm9sdGFnZSk7Ci1leHRlcm4gdTE2IHNpX3BtdV9mYXN0X3B3cnVwX2RlbGF5KHNpX3QgKnNpaCwgb3NsX3QgKm9zaCk7Ci1leHRlcm4gdm9pZCBzaV9wbXVfcmNhbChzaV90ICpzaWgsIG9zbF90ICpvc2gpOworZXh0ZXJuIHUxNiBzaV9wbXVfZmFzdF9wd3J1cF9kZWxheShzaV90ICpzaWgsIHN0cnVjdCBvc2xfaW5mbyAqb3NoKTsKK2V4dGVybiB2b2lkIHNpX3BtdV9yY2FsKHNpX3QgKnNpaCwgc3RydWN0IG9zbF9pbmZvICpvc2gpOwogZXh0ZXJuIHZvaWQgc2lfcG11X3BsbHVwZChzaV90ICpzaWgpOwotZXh0ZXJuIHZvaWQgc2lfcG11X3NwdXJhdm9pZChzaV90ICpzaWgsIG9zbF90ICpvc2gsIHU4IHNwdXJhdm9pZCk7CitleHRlcm4gdm9pZCBzaV9wbXVfc3B1cmF2b2lkKHNpX3QgKnNpaCwgc3RydWN0IG9zbF9pbmZvICpvc2gsIHU4IHNwdXJhdm9pZCk7CiAKLWV4dGVybiBib29sIHNpX3BtdV9pc19vdHBfcG93ZXJlZChzaV90ICpzaWgsIG9zbF90ICpvc2gpOwotZXh0ZXJuIHUzMiBzaV9wbXVfbWVhc3VyZV9hbHBjbGsoc2lfdCAqc2loLCBvc2xfdCAqb3NoKTsKK2V4dGVybiBib29sIHNpX3BtdV9pc19vdHBfcG93ZXJlZChzaV90ICpzaWgsIHN0cnVjdCBvc2xfaW5mbyAqb3NoKTsKK2V4dGVybiB1MzIgc2lfcG11X21lYXN1cmVfYWxwY2xrKHNpX3QgKnNpaCwgc3RydWN0IG9zbF9pbmZvICpvc2gpOwogCiBleHRlcm4gdTMyIHNpX3BtdV9jaGlwY29udHJvbChzaV90ICpzaWgsIHVpbnQgcmVnLCB1MzIgbWFzaywgdTMyIHZhbCk7CiBleHRlcm4gdTMyIHNpX3BtdV9yZWdjb250cm9sKHNpX3QgKnNpaCwgdWludCByZWcsIHUzMiBtYXNrLCB1MzIgdmFsKTsKIGV4dGVybiB1MzIgc2lfcG11X3BsbGNvbnRyb2woc2lfdCAqc2loLCB1aW50IHJlZywgdTMyIG1hc2ssIHUzMiB2YWwpOwogZXh0ZXJuIHZvaWQgc2lfcG11X3BsbHVwZChzaV90ICpzaWgpOwotZXh0ZXJuIHZvaWQgc2lfcG11X3Nwcm9tX2VuYWJsZShzaV90ICpzaWgsIG9zbF90ICpvc2gsIGJvb2wgZW5hYmxlKTsKK2V4dGVybiB2b2lkIHNpX3BtdV9zcHJvbV9lbmFibGUoc2lfdCAqc2loLCBzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgYm9vbCBlbmFibGUpOwogCiBleHRlcm4gdm9pZCBzaV9wbXVfcmFkaW9fZW5hYmxlKHNpX3QgKnNpaCwgYm9vbCBlbmFibGUpOwotZXh0ZXJuIHUzMiBzaV9wbXVfd2FpdGZvcmNsa19vbl9iYWNrcGxhbmUoc2lfdCAqc2loLCBvc2xfdCAqb3NoLAorZXh0ZXJuIHUzMiBzaV9wbXVfd2FpdGZvcmNsa19vbl9iYWNrcGxhbmUoc2lfdCAqc2loLCBzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwKIAkJCQkJICAgICB1MzIgY2xrLCB1MzIgZGVsYXkpOwogCi1leHRlcm4gdm9pZCBzaV9wbXVfb3RwX3Bvd2VyKHNpX3QgKnNpaCwgb3NsX3QgKm9zaCwgYm9vbCBvbik7Ci1leHRlcm4gdm9pZCBzaV9zZGlvZF9kcml2ZV9zdHJlbmd0aF9pbml0KHNpX3QgKnNpaCwgb3NsX3QgKm9zaCwKK2V4dGVybiB2b2lkIHNpX3BtdV9vdHBfcG93ZXIoc2lfdCAqc2loLCBzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgYm9vbCBvbik7CitleHRlcm4gdm9pZCBzaV9zZGlvZF9kcml2ZV9zdHJlbmd0aF9pbml0KHNpX3QgKnNpaCwgc3RydWN0IG9zbF9pbmZvICpvc2gsCiAJCQkJCSB1MzIgZHJpdmVzdHJlbmd0aCk7CiAKICNlbmRpZgkJCQkvKiBfaG5kcG11X2hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2luY2x1ZGUvbGludXhfb3NsLmggYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2luY2x1ZGUvbGludXhfb3NsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5Yzg2MGIuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9pbmNsdWRlL2xpbnV4X29zbC5oCisrKyAvZGV2L251bGwKQEAgLTEsNDA3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKLSAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCi0gKgotICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCi0gKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkKLSAqIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUwotICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTgotICogT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTgotICogQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KLSAqLwotCi0jaWZuZGVmIF9saW51eF9vc2xfaF8KLSNkZWZpbmUgX2xpbnV4X29zbF9oXwotCi0KLS8qIExpbnV4IEtlcm5lbDogRmlsZSBPcGVyYXRpb25zOiBzdGFydCAqLwotZXh0ZXJuIHZvaWQgKm9zbF9vc19vcGVuX2ltYWdlKGNoYXIgKmZpbGVuYW1lKTsKLWV4dGVybiBpbnQgb3NsX29zX2dldF9pbWFnZV9ibG9jayhjaGFyICpidWYsIGludCBsZW4sIHZvaWQgKmltYWdlKTsKLWV4dGVybiB2b2lkIG9zbF9vc19jbG9zZV9pbWFnZSh2b2lkICppbWFnZSk7Ci0vKiBMaW51eCBLZXJuZWw6IEZpbGUgT3BlcmF0aW9uczogZW5kICovCi0KLWV4dGVybiBvc2xfdCAqb3NsX2F0dGFjaCh2b2lkICpwZGV2LCB1aW50IGJ1c3R5cGUsIGJvb2wgcGt0dGFnKTsKLWV4dGVybiB2b2lkIG9zbF9kZXRhY2gob3NsX3QgKm9zaCk7Ci0KLWV4dGVybiB1MzIgZ19hc3NlcnRfdHlwZTsKLQotI2lmIGRlZmluZWQoQkNNREJHX0FTU0VSVCkKLSNkZWZpbmUgQVNTRVJUKGV4cCkgXAotCSAgZG8geyBpZiAoIShleHApKSBvc2xfYXNzZXJ0KCNleHAsIF9fRklMRV9fLCBfX0xJTkVfXyk7IH0gd2hpbGUgKDApCi1leHRlcm4gdm9pZCBvc2xfYXNzZXJ0KGNoYXIgKmV4cCwgY2hhciAqZmlsZSwgaW50IGxpbmUpOwotI2Vsc2UKLSNpZmRlZiBfX0dOVUNfXwotI2RlZmluZSBHQ0NfVkVSU0lPTiBcCi0JCQkoX19HTlVDX18gKiAxMDAwMCArIF9fR05VQ19NSU5PUl9fICogMTAwICsgX19HTlVDX1BBVENITEVWRUxfXykKLSNpZiBHQ0NfVkVSU0lPTiA+IDMwMTAwCi0jZGVmaW5lIEFTU0VSVChleHApCWRvIHt9IHdoaWxlICgwKQotI2Vsc2UKLQkJCS8qIEFTU0VSVCBjb3VsZCBjYXVzZSBzZWdtZW50YXRpb24gZmF1bHQgb24gR0NDMy4xLCB1c2UgZW1wdHkgaW5zdGVhZCAqLwotI2RlZmluZSBBU1NFUlQoZXhwKQotI2VuZGlmCQkJCS8qIEdDQ19WRVJTSU9OID4gMzAxMDAgKi8KLSNlbmRpZgkJCQkvKiBfX0dOVUNfXyAqLwotI2VuZGlmCQkJCS8qIGRlZmluZWQoQkNNREJHX0FTU0VSVCkgKi8KLQotLyogUENJIGNvbmZpZ3VyYXRpb24gc3BhY2UgYWNjZXNzIG1hY3JvcyAqLwotI2RlZmluZQlPU0xfUENJX1JFQURfQ09ORklHKG9zaCwgb2Zmc2V0LCBzaXplKSBcCi0Jb3NsX3BjaV9yZWFkX2NvbmZpZygob3NoKSwgKG9mZnNldCksIChzaXplKSkKLSNkZWZpbmUJT1NMX1BDSV9XUklURV9DT05GSUcob3NoLCBvZmZzZXQsIHNpemUsIHZhbCkgXAotCW9zbF9wY2lfd3JpdGVfY29uZmlnKChvc2gpLCAob2Zmc2V0KSwgKHNpemUpLCAodmFsKSkKLWV4dGVybiB1MzIgb3NsX3BjaV9yZWFkX2NvbmZpZyhvc2xfdCAqb3NoLCB1aW50IG9mZnNldCwgdWludCBzaXplKTsKLWV4dGVybiB2b2lkIG9zbF9wY2lfd3JpdGVfY29uZmlnKG9zbF90ICpvc2gsIHVpbnQgb2Zmc2V0LCB1aW50IHNpemUsIHVpbnQgdmFsKTsKLQotLyogUENJIGRldmljZSBidXMgIyBhbmQgc2xvdCAjICovCi0jZGVmaW5lIE9TTF9QQ0lfQlVTKG9zaCkJb3NsX3BjaV9idXMob3NoKQotI2RlZmluZSBPU0xfUENJX1NMT1Qob3NoKQlvc2xfcGNpX3Nsb3Qob3NoKQotZXh0ZXJuIHVpbnQgb3NsX3BjaV9idXMob3NsX3QgKm9zaCk7Ci1leHRlcm4gdWludCBvc2xfcGNpX3Nsb3Qob3NsX3QgKm9zaCk7Ci0KLS8qIFBrdHRhZyBmbGFnIHNob3VsZCBiZSBwYXJ0IG9mIHB1YmxpYyBpbmZvcm1hdGlvbiAqLwotdHlwZWRlZiBzdHJ1Y3QgewotCWJvb2wgcGt0dGFnOwotCXVpbnQgcGt0YWxsb2NlZDsJLyogTnVtYmVyIG9mIGFsbG9jYXRlZCBwYWNrZXQgYnVmZmVycyAqLwotCWJvb2wgbW1idXM7CQkvKiBCdXMgc3VwcG9ydHMgbWVtb3J5LW1hcHBlZCByZWdpc3RlciBhY2Nlc3NlcyAqLwotCXBrdGZyZWVfY2JfZm5fdCB0eF9mbjsJLyogQ2FsbGJhY2sgZnVuY3Rpb24gZm9yIFBLVEZSRUUgKi8KLQl2b2lkICp0eF9jdHg7CQkvKiBDb250ZXh0IHRvIHRoZSBjYWxsYmFjayBmdW5jdGlvbiAqLwotI2lmIGRlZmluZWQoQkNNU0RJTykgJiYgIWRlZmluZWQoQlJDTV9GVUxMTUFDKQotCW9zbF9ycmVnX2ZuX3QgcnJlZ19mbjsJLyogUmVhZCBSZWdpc3RlciBmdW5jdGlvbiAqLwotCW9zbF93cmVnX2ZuX3Qgd3JlZ19mbjsJLyogV3JpdGUgUmVnaXN0ZXIgZnVuY3Rpb24gKi8KLQl2b2lkICpyZWdfY3R4OwkJLyogQ29udGV4dCB0byB0aGUgcmVnIGNhbGxiYWNrIGZ1bmN0aW9ucyAqLwotI2VuZGlmCi19IG9zbF9wdWJpbmZvX3Q7Ci0KLSNkZWZpbmUgUEtURlJFRVNFVENCKG9zaCwgX3R4X2ZuLCBfdHhfY3R4KQkJCVwKLQlkbyB7CQkJCQkJCVwKLQkJKChvc2xfcHViaW5mb190ICopb3NoKS0+dHhfZm4gPSBfdHhfZm47CQlcCi0JCSgob3NsX3B1YmluZm9fdCAqKW9zaCktPnR4X2N0eCA9IF90eF9jdHg7CVwKLQl9IHdoaWxlICgwKQotCi0jaWYgZGVmaW5lZChCQ01TRElPKSAmJiAhZGVmaW5lZChCUkNNX0ZVTExNQUMpCi0jZGVmaW5lIFJFR09QU1NFVChvc2gsIHJyZWcsIHdyZWcsIGN0eCkJCQlcCi0JZG8gewkJCQkJCVwKLQkJKChvc2xfcHViaW5mb190ICopb3NoKS0+cnJlZ19mbiA9IHJyZWc7CVwKLQkJKChvc2xfcHViaW5mb190ICopb3NoKS0+d3JlZ19mbiA9IHdyZWc7CVwKLQkJKChvc2xfcHViaW5mb190ICopb3NoKS0+cmVnX2N0eCA9IGN0eDsJXAotCX0gd2hpbGUgKDApCi0jZW5kaWYKLQotI2RlZmluZSBCVVNfU1dBUDMyKHYpCQkodikKLQotI2RlZmluZQlETUFfQ09OU0lTVEVOVF9BTElHTglvc2xfZG1hX2NvbnNpc3RlbnRfYWxpZ24oKQotZXh0ZXJuIHVpbnQgb3NsX2RtYV9jb25zaXN0ZW50X2FsaWduKHZvaWQpOwotZXh0ZXJuIHZvaWQgKm9zbF9kbWFfYWxsb2NfY29uc2lzdGVudChvc2xfdCAqb3NoLCB1aW50IHNpemUsIHUxNiBhbGlnbiwKLQkJCQkgICAgICB1aW50ICp0b3QsIHVuc2lnbmVkIGxvbmcgKnBhcCk7Ci0KLSNpZmRlZiBCUkNNX0ZVTExNQUMKLSNkZWZpbmUJRE1BX0FMTE9DX0NPTlNJU1RFTlQob3NoLCBzaXplLCBwYXAsIGRtYWgsIGFsaWduYml0cykgXAotCW9zbF9kbWFfYWxsb2NfY29uc2lzdGVudCgob3NoKSwgKHNpemUpLCAoMCksICh0b3QpLCAocGFwKSkKLSNlbHNlCi0jZGVmaW5lCURNQV9BTExPQ19DT05TSVNURU5UKG9zaCwgc2l6ZSwgYWxpZ24sIHRvdCwgcGFwLCBkbWFoKSBcCi0Jb3NsX2RtYV9hbGxvY19jb25zaXN0ZW50KChvc2gpLCAoc2l6ZSksIChhbGlnbiksICh0b3QpLCAocGFwKSkKLSNlbmRpZiAvKiBCUkNNX0ZVTExNQUMgKi8KLQotI2RlZmluZQlETUFfRlJFRV9DT05TSVNURU5UKG9zaCwgdmEsIHNpemUsIHBhLCBkbWFoKSBcCi0Jb3NsX2RtYV9mcmVlX2NvbnNpc3RlbnQoKG9zaCksICh2b2lkICopKHZhKSwgKHNpemUpLCAocGEpKQotZXh0ZXJuIHZvaWQgb3NsX2RtYV9mcmVlX2NvbnNpc3RlbnQob3NsX3QgKm9zaCwgdm9pZCAqdmEsIHVpbnQgc2l6ZSwgdW5zaWduZWQgbG9uZyBwYSk7Ci0KLS8qIG1hcC91bm1hcCBkaXJlY3Rpb24gKi8KLSNkZWZpbmUJRE1BX1RYCTEJCS8qIFRYIGRpcmVjdGlvbiBmb3IgRE1BICovCi0jZGVmaW5lCURNQV9SWAkyCQkvKiBSWCBkaXJlY3Rpb24gZm9yIERNQSAqLwotCi0vKiBtYXAvdW5tYXAgc2hhcmVkIChkbWEtYWJsZSkgbWVtb3J5ICovCi0jZGVmaW5lCURNQV9NQVAob3NoLCB2YSwgc2l6ZSwgZGlyZWN0aW9uLCBwLCBkbWFoKSBcCi0Jb3NsX2RtYV9tYXAoKG9zaCksICh2YSksIChzaXplKSwgKGRpcmVjdGlvbikpCi0jZGVmaW5lCURNQV9VTk1BUChvc2gsIHBhLCBzaXplLCBkaXJlY3Rpb24sIHAsIGRtYWgpIFwKLQlvc2xfZG1hX3VubWFwKChvc2gpLCAocGEpLCAoc2l6ZSksIChkaXJlY3Rpb24pKQotZXh0ZXJuIHVpbnQgb3NsX2RtYV9tYXAob3NsX3QgKm9zaCwgdm9pZCAqdmEsIHVpbnQgc2l6ZSwgaW50IGRpcmVjdGlvbik7Ci1leHRlcm4gdm9pZCBvc2xfZG1hX3VubWFwKG9zbF90ICpvc2gsIHVpbnQgcGEsIHVpbnQgc2l6ZSwgaW50IGRpcmVjdGlvbik7Ci0KLS8qIEFQSSBmb3IgRE1BIGFkZHJlc3NpbmcgY2FwYWJpbGl0eSAqLwotI2RlZmluZSBPU0xfRE1BRERSV0lEVEgob3NoLCBhZGRyd2lkdGgpIGRvIHt9IHdoaWxlICgwKQotCi0vKiByZWdpc3RlciBhY2Nlc3MgbWFjcm9zICovCi0jaWYgZGVmaW5lZChCQ01TRElPKQotI2lmZGVmIEJSQ01fRlVMTE1BQwotI2luY2x1ZGUgPGJjbXNkaC5oPgotI2VuZGlmCi0jZGVmaW5lIE9TTF9XUklURV9SRUcob3NoLCByLCB2KSAoYmNtc2RoX3JlZ193cml0ZShOVUxMLCAodW5zaWduZWQgbG9uZykociksIHNpemVvZigqKHIpKSwgKHYpKSkKLSNkZWZpbmUgT1NMX1JFQURfUkVHKG9zaCwgcikgKGJjbXNkaF9yZWdfcmVhZChOVUxMLCAodW5zaWduZWQgbG9uZykociksIHNpemVvZigqKHIpKSkpCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoQkNNU0RJTykKLSNkZWZpbmUgU0VMRUNUX0JVU19XUklURShvc2gsIG1tYXBfb3AsIGJ1c19vcCkgaWYgKCgob3NsX3B1YmluZm9fdCAqKShvc2gpKS0+bW1idXMpIFwKLQkJbW1hcF9vcCBlbHNlIGJ1c19vcAotI2RlZmluZSBTRUxFQ1RfQlVTX1JFQUQob3NoLCBtbWFwX29wLCBidXNfb3ApICgoKG9zbF9wdWJpbmZvX3QgKikob3NoKSktPm1tYnVzKSA/IFwKLQkJbW1hcF9vcCA6IGJ1c19vcAotI2Vsc2UKLSNkZWZpbmUgU0VMRUNUX0JVU19XUklURShvc2gsIG1tYXBfb3AsIGJ1c19vcCkgbW1hcF9vcAotI2RlZmluZSBTRUxFQ1RfQlVTX1JFQUQob3NoLCBtbWFwX29wLCBidXNfb3ApIG1tYXBfb3AKLSNlbmRpZgotCi0jZGVmaW5lIE9TTF9FUlJPUihiY21lcnJvcikJb3NsX2Vycm9yKGJjbWVycm9yKQotZXh0ZXJuIGludCBvc2xfZXJyb3IoaW50IGJjbWVycm9yKTsKLQotLyogdGhlIGxhcmdlc3QgcmVhc29uYWJsZSBwYWNrZXQgYnVmZmVyIGRyaXZlciB1c2VzIGZvciBldGhlcm5ldCBNVFUgaW4gYnl0ZXMgKi8KLSNkZWZpbmUJUEtUQlVGU1oJMjA0OAkvKiBsYXJnZXN0IHJlYXNvbmFibGUgcGFja2V0IGJ1ZmZlciwgZHJpdmVyIHVzZXMgZm9yIGV0aGVybmV0IE1UVSAqLwotCi0jZGVmaW5lIE9TTF9TWVNVUFRJTUUoKQkJKCh1MzIpamlmZmllcyAqICgxMDAwIC8gSFopKQotI2RlZmluZQlwcmludGYoZm10LCBhcmdzLi4uKQlwcmludGsoZm10ICwgIyMgYXJncykKLSNpZmRlZiBCUkNNX0ZVTExNQUMKLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4JLyogZm9yIHZzbi9wcmludGYncyAqLwotI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgkvKiBmb3IgbWVtKiwgc3RyKiAqLwotI2VuZGlmCi0vKiBiY29weSdzOiBMaW51eCBrZXJuZWwgZG9lc24ndCBwcm92aWRlIHRoZXNlIChhbnltb3JlKSAqLwotI2RlZmluZQliY29weShzcmMsIGRzdCwgbGVuKQltZW1jcHkoKGRzdCksIChzcmMpLCAobGVuKSkKLSNkZWZpbmUJYmNtcChiMSwgYjIsIGxlbikJbWVtY21wKChiMSksIChiMiksIChsZW4pKQotI2RlZmluZQliemVybyhiLCBsZW4pCQltZW1zZXQoKGIpLCAnXDAnLCAobGVuKSkKLQotLyogcmVnaXN0ZXIgYWNjZXNzIG1hY3JvcyAqLwotI2lmIGRlZmluZWQoT1NMUkVHT1BTKQotI2Vsc2UKLSNpZm5kZWYgSUxfQklHRU5ESUFOCi0jaWZuZGVmIF9fbWlwc19fCi0jZGVmaW5lIFJfUkVHKG9zaCwgcikgKFwKLQlTRUxFQ1RfQlVTX1JFQUQob3NoLCBzaXplb2YoKihyKSkgPT0gc2l6ZW9mKHU4KSA/IHJlYWRiKCh2b2xhdGlsZSB1OCopKHIpKSA6IFwKLQlzaXplb2YoKihyKSkgPT0gc2l6ZW9mKHUxNikgPyByZWFkdygodm9sYXRpbGUgdTE2KikocikpIDogXAotCXJlYWRsKCh2b2xhdGlsZSB1MzIqKShyKSksIE9TTF9SRUFEX1JFRyhvc2gsIHIpKSBcCi0pCi0jZWxzZQkJCQkvKiBfX21pcHNfXyAqLwotI2RlZmluZSBSX1JFRyhvc2gsIHIpIChcCi0JU0VMRUNUX0JVU19SRUFEKG9zaCwgXAotCQkoeyBcCi0JCQlfX3R5cGVvZigqKHIpKSBfX29zbF92OyBcCi0JCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygic3luYyIpOyBcCi0JCQlzd2l0Y2ggKHNpemVvZigqKHIpKSkgeyBcCi0JCQljYXNlIHNpemVvZih1OCk6IFwKLQkJCQlfX29zbF92ID0gcmVhZGIoKHZvbGF0aWxlIHU4KikocikpOyBcCi0JCQkJYnJlYWs7IFwKLQkJCWNhc2Ugc2l6ZW9mKHUxNik6IFwKLQkJCQlfX29zbF92ID0gcmVhZHcoKHZvbGF0aWxlIHUxNiopKHIpKTsgXAotCQkJCWJyZWFrOyBcCi0JCQljYXNlIHNpemVvZih1MzIpOiBcCi0JCQkJX19vc2xfdiA9IFwKLQkJCQlyZWFkbCgodm9sYXRpbGUgdTMyKikocikpOyBcCi0JCQkJYnJlYWs7IFwKLQkJCX0gXAotCQkJX19hc21fXyBfX3ZvbGF0aWxlX18oInN5bmMiKTsgXAotCQkJX19vc2xfdjsgXAotCQl9KSwgXAotCQkoeyBcCi0JCQlfX3R5cGVvZigqKHIpKSBfX29zbF92OyBcCi0JCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygic3luYyIpOyBcCi0JCQlfX29zbF92ID0gT1NMX1JFQURfUkVHKG9zaCwgcik7IFwKLQkJCV9fYXNtX18gX192b2xhdGlsZV9fKCJzeW5jIik7IFwKLQkJCV9fb3NsX3Y7IFwKLQkJfSkpIFwKLSkKLSNlbmRpZgkJCQkvKiBfX21pcHNfXyAqLwotCi0jZGVmaW5lIFdfUkVHKG9zaCwgciwgdikgZG8geyBcCi0JU0VMRUNUX0JVU19XUklURShvc2gsICBcCi0JCXN3aXRjaCAoc2l6ZW9mKCoocikpKSB7IFwKLQkJY2FzZSBzaXplb2YodTgpOiBcCi0JCQl3cml0ZWIoKHU4KSh2KSwgKHZvbGF0aWxlIHU4KikocikpOyBicmVhazsgXAotCQljYXNlIHNpemVvZih1MTYpOiBcCi0JCQl3cml0ZXcoKHUxNikodiksICh2b2xhdGlsZSB1MTYqKShyKSk7IGJyZWFrOyBcCi0JCWNhc2Ugc2l6ZW9mKHUzMik6IFwKLQkJCXdyaXRlbCgodTMyKSh2KSwgKHZvbGF0aWxlIHUzMiopKHIpKTsgYnJlYWs7IFwKLQkJfSwgXAotCQkoT1NMX1dSSVRFX1JFRyhvc2gsIHIsIHYpKSk7IFwKLQl9IHdoaWxlICgwKQotI2Vsc2UJCQkJLyogSUxfQklHRU5ESUFOICovCi0jZGVmaW5lIFJfUkVHKG9zaCwgcikgKFwKLQlTRUxFQ1RfQlVTX1JFQUQob3NoLCBcCi0JCSh7IFwKLQkJCV9fdHlwZW9mKCoocikpIF9fb3NsX3Y7IFwKLQkJCXN3aXRjaCAoc2l6ZW9mKCoocikpKSB7IFwKLQkJCWNhc2Ugc2l6ZW9mKHU4KTogXAotCQkJCV9fb3NsX3YgPSBcCi0JCQkJcmVhZGIoKHZvbGF0aWxlIHU4KikoKHIpXjMpKTsgXAotCQkJCWJyZWFrOyBcCi0JCQljYXNlIHNpemVvZih1MTYpOiBcCi0JCQkJX19vc2xfdiA9IFwKLQkJCQlyZWFkdygodm9sYXRpbGUgdTE2KikoKHIpXjIpKTsgXAotCQkJCWJyZWFrOyBcCi0JCQljYXNlIHNpemVvZih1MzIpOiBcCi0JCQkJX19vc2xfdiA9IHJlYWRsKCh2b2xhdGlsZSB1MzIqKShyKSk7IFwKLQkJCQlicmVhazsgXAotCQkJfSBcCi0JCQlfX29zbF92OyBcCi0JCX0pLCBcCi0JCU9TTF9SRUFEX1JFRyhvc2gsIHIpKSBcCi0pCi0jZGVmaW5lIFdfUkVHKG9zaCwgciwgdikgZG8geyBcCi0JU0VMRUNUX0JVU19XUklURShvc2gsICBcCi0JCXN3aXRjaCAoc2l6ZW9mKCoocikpKSB7IFwKLQkJY2FzZSBzaXplb2YodTgpOglcCi0JCQl3cml0ZWIoKHU4KSh2KSwgXAotCQkJKHZvbGF0aWxlIHU4KikoKHIpXjMpKTsgYnJlYWs7IFwKLQkJY2FzZSBzaXplb2YodTE2KToJXAotCQkJd3JpdGV3KCh1MTYpKHYpLCBcCi0JCQkodm9sYXRpbGUgdTE2KikoKHIpXjIpKTsgYnJlYWs7IFwKLQkJY2FzZSBzaXplb2YodTMyKToJXAotCQkJd3JpdGVsKCh1MzIpKHYpLCBcCi0JCQkodm9sYXRpbGUgdTMyKikocikpOyBicmVhazsgXAotCQl9LCBcCi0JCShPU0xfV1JJVEVfUkVHKG9zaCwgciwgdikpKTsgXAotCX0gd2hpbGUgKDApCi0jZW5kaWYJCQkJLyogSUxfQklHRU5ESUFOICovCi0KLSNlbmRpZgkJCQkvKiBPU0xSRUdPUFMgKi8KLQotI2RlZmluZQlBTkRfUkVHKG9zaCwgciwgdikJCVdfUkVHKG9zaCwgKHIpLCBSX1JFRyhvc2gsIHIpICYgKHYpKQotI2RlZmluZQlPUl9SRUcob3NoLCByLCB2KQkJV19SRUcob3NoLCAociksIFJfUkVHKG9zaCwgcikgfCAodikpCi0KLS8qIGJjb3B5LCBiY21wLCBhbmQgYnplcm8gZnVuY3Rpb25zICovCi0jZGVmaW5lCWJjb3B5KHNyYywgZHN0LCBsZW4pCW1lbWNweSgoZHN0KSwgKHNyYyksIChsZW4pKQotI2RlZmluZQliY21wKGIxLCBiMiwgbGVuKQltZW1jbXAoKGIxKSwgKGIyKSwgKGxlbikpCi0jZGVmaW5lCWJ6ZXJvKGIsIGxlbikJCW1lbXNldCgoYiksICdcMCcsIChsZW4pKQotCi0vKiB1bmNhY2hlZC9jYWNoZWQgdmlydHVhbCBhZGRyZXNzICovCi0jaWZkZWYgX19taXBzX18KLSNpbmNsdWRlIDxhc20vYWRkcnNwYWNlLmg+Ci0jZGVmaW5lIE9TTF9VTkNBQ0hFRCh2YSkJKCh2b2lkICopS1NFRzFBRERSKCh2YSkpKQotI2RlZmluZSBPU0xfQ0FDSEVEKHZhKQkJKCh2b2lkICopS1NFRzBBRERSKCh2YSkpKQotI2Vsc2UKLSNkZWZpbmUgT1NMX1VOQ0FDSEVEKHZhKQkoKHZvaWQgKil2YSkKLSNkZWZpbmUgT1NMX0NBQ0hFRCh2YSkJCSgodm9pZCAqKXZhKQotI2VuZGlmCQkJCS8qIG1pcHMgKi8KLQotI2lmIGRlZmluZWQobWlwcykKLSNkZWZpbmUJT1NMX0dFVENZQ0xFUyh4KQkoKHgpID0gcmVhZF9jMF9jb3VudCgpICogMikKLSNlbGlmIGRlZmluZWQoX19pMzg2X18pCi0jZGVmaW5lCU9TTF9HRVRDWUNMRVMoeCkJcmR0c2NsKCh4KSkKLSNlbHNlCi0jZGVmaW5lIE9TTF9HRVRDWUNMRVMoeCkJKCh4KSA9IDApCi0jZW5kaWYJCQkJLyogZGVmaW5lZChtaXBzKSAqLwotCi0vKiBkZXJlZmVyZW5jZSBhbiBhZGRyZXNzIHRoYXQgbWF5IGNhdXNlIGEgYnVzIGV4Y2VwdGlvbiAqLwotI2lmZGVmIG1pcHMKLSNkZWZpbmUJQlVTUFJPQkUodmFsLCBhZGRyKQlnZXRfZGJlKCh2YWwpLCAoYWRkcikpCi0jaW5jbHVkZSA8YXNtL3BhY2Nlc3MuaD4KLSNlbHNlCi0jZGVmaW5lCUJVU1BST0JFKHZhbCwgYWRkcikJKHsgKHZhbCkgPSBSX1JFRyhOVUxMLCAoYWRkcikpOyAwOyB9KQotI2VuZGlmCQkJCS8qIG1pcHMgKi8KLQotLyogbWFwL3VubWFwIHBoeXNpY2FsIHRvIHZpcnR1YWwgSS9PICovCi0jaWYgIWRlZmluZWQoQ09ORklHX01NQ19NU003WDAwQSkKLSNkZWZpbmUJUkVHX01BUChwYSwgc2l6ZSkJaW9yZW1hcF9ub2NhY2hlKCh1bnNpZ25lZCBsb25nKShwYSksICh1bnNpZ25lZCBsb25nKShzaXplKSkKLSNlbHNlCi0jZGVmaW5lIFJFR19NQVAocGEsIHNpemUpICAgICAgICh2b2lkICopKDApCi0jZW5kaWYJCQkJLyogIWRlZmluZWQoQ09ORklHX01NQ19NU003WDAwQSAqLwotI2RlZmluZQlSRUdfVU5NQVAodmEpCQlpb3VubWFwKCh2YSkpCi0KLSNkZWZpbmUJUl9TTShyKQkJCSgqKHIpKQotI2RlZmluZQlXX1NNKHIsIHYpCQkoKihyKSA9ICh2KSkKLSNkZWZpbmUJQlpFUk9fU00ociwgbGVuKQltZW1zZXQoKHIpLCAnXDAnLCAobGVuKSkKLQotI2lmZGVmIEJSQ01fRlVMTE1BQwotI2luY2x1ZGUgPGxpbnV4dmVyLmg+CQkvKiB1c2UgY3VycmVudCAyLjQueCBjYWxsaW5nIGNvbnZlbnRpb25zICovCi0jZW5kaWYKLQotLyogcGFja2V0IHByaW1pdGl2ZXMgKi8KLSNkZWZpbmUJUEtUR0VUKG9zaCwgbGVuLCBzZW5kKQkJb3NsX3BrdGdldCgob3NoKSwgKGxlbikpCi0jZGVmaW5lCVBLVEZSRUUob3NoLCBza2IsIHNlbmQpCQlvc2xfcGt0ZnJlZSgob3NoKSwgKHNrYiksIChzZW5kKSkKLSNkZWZpbmUJUEtUREFUQShza2IpCQkoKChzdHJ1Y3Qgc2tfYnVmZiAqKShza2IpKS0+ZGF0YSkKLSNkZWZpbmUJUEtUTEVOKHNrYikJCSgoKHN0cnVjdCBza19idWZmICopKHNrYikpLT5sZW4pCi0jZGVmaW5lIFBLVEhFQURST09NKHNrYikJCShQS1REQVRBKHNrYiktKCgoc3RydWN0IHNrX2J1ZmYgKikoc2tiKSktPmhlYWQpKQotI2RlZmluZSBQS1RUQUlMUk9PTShza2IpICgoKChzdHJ1Y3Qgc2tfYnVmZiAqKShza2IpKS0+ZW5kKS0oKChzdHJ1Y3Qgc2tfYnVmZiAqKShza2IpKS0+dGFpbCkpCi0jZGVmaW5lCVBLVE5FWFQoc2tiKQkJKCgoc3RydWN0IHNrX2J1ZmYgKikoc2tiKSktPm5leHQpCi0jZGVmaW5lCVBLVFNFVE5FWFQoc2tiLCB4KQlcCi0JKCgoc3RydWN0IHNrX2J1ZmYgKikoc2tiKSktPm5leHQgPSAoc3RydWN0IHNrX2J1ZmYgKikoeCkpCi0jZGVmaW5lCVBLVFNFVExFTihza2IsIGxlbikJX19za2JfdHJpbSgoc3RydWN0IHNrX2J1ZmYgKikoc2tiKSwgKGxlbikpCi0jZGVmaW5lCVBLVFBVU0goc2tiLCBieXRlcykJc2tiX3B1c2goKHN0cnVjdCBza19idWZmICopKHNrYiksIChieXRlcykpCi0jZGVmaW5lCVBLVFBVTEwoc2tiLCBieXRlcykJc2tiX3B1bGwoKHN0cnVjdCBza19idWZmICopKHNrYiksIChieXRlcykpCi0jZGVmaW5lCVBLVFRBRyhza2IpCQkoKHZvaWQgKikoKChzdHJ1Y3Qgc2tfYnVmZiAqKShza2IpKS0+Y2IpKQotI2RlZmluZSBQS1RBTExPQ0VEKG9zaCkJCSgoKG9zbF9wdWJpbmZvX3QgKikob3NoKSktPnBrdGFsbG9jZWQpCi0jZGVmaW5lIFBLVFNFVFBPT0wob3NoLCBza2IsIHgsIHkpCWRvIHt9IHdoaWxlICgwKQotI2RlZmluZSBQS1RQT09MKG9zaCwgc2tiKQkJZmFsc2UKLWV4dGVybiB2b2lkICpvc2xfcGt0Z2V0KG9zbF90ICpvc2gsIHVpbnQgbGVuKTsKLWV4dGVybiB2b2lkIG9zbF9wa3RmcmVlKG9zbF90ICpvc2gsIHZvaWQgKnNrYiwgYm9vbCBzZW5kKTsKLQotI2lmZGVmIEJSQ01fRlVMTE1BQwotZXh0ZXJuIHZvaWQgKm9zbF9wa3RnZXRfc3RhdGljKG9zbF90ICpvc2gsIHVpbnQgbGVuKTsKLWV4dGVybiB2b2lkIG9zbF9wa3RmcmVlX3N0YXRpYyhvc2xfdCAqb3NoLCB2b2lkICpza2IsIGJvb2wgc2VuZCk7Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCAqCi1vc2xfcGt0X2ZybW5hdGl2ZShvc2xfcHViaW5mb190ICpvc2gsIHN0cnVjdCBza19idWZmICpza2IpCi17Ci0Jc3RydWN0IHNrX2J1ZmYgKm5za2I7Ci0KLQlpZiAob3NoLT5wa3R0YWcpCi0JCWJ6ZXJvKCh2b2lkICopc2tiLT5jYiwgT1NMX1BLVFRBR19TWik7Ci0KLQlmb3IgKG5za2IgPSBza2I7IG5za2I7IG5za2IgPSBuc2tiLT5uZXh0KQotCQlvc2gtPnBrdGFsbG9jZWQrKzsKLQotCXJldHVybiAodm9pZCAqKXNrYjsKLX0KLSNkZWZpbmUgUEtURlJNTkFUSVZFKG9zaCwgc2tiKQlcCi0Jb3NsX3BrdF9mcm1uYXRpdmUoKChvc2xfcHViaW5mb190ICopb3NoKSwgKHN0cnVjdCBza19idWZmKikoc2tiKSkKLQotc3RhdGljIGlubGluZSBzdHJ1Y3Qgc2tfYnVmZiAqCi1vc2xfcGt0X3RvbmF0aXZlKG9zbF9wdWJpbmZvX3QgKm9zaCwgdm9pZCAqcGt0KQotewotCXN0cnVjdCBza19idWZmICpuc2tiOwotCi0JaWYgKG9zaC0+cGt0dGFnKQotCQliemVybygoKHN0cnVjdCBza19idWZmICopcGt0KS0+Y2IsIE9TTF9QS1RUQUdfU1opOwotCi0JZm9yIChuc2tiID0gKHN0cnVjdCBza19idWZmICopcGt0OyBuc2tiOyBuc2tiID0gbnNrYi0+bmV4dCkKLQkJb3NoLT5wa3RhbGxvY2VkLS07Ci0KLQlyZXR1cm4gKHN0cnVjdCBza19idWZmICopcGt0OwotfQotI2RlZmluZSBQS1RUT05BVElWRShvc2gsIHBrdCkJXAotCW9zbF9wa3RfdG9uYXRpdmUoKG9zbF9wdWJpbmZvX3QgKikob3NoKSwgKHBrdCkpCi0jZWxzZSAvKiAhQlJDTV9GVUxMTUFDICovCi0jZGVmaW5lIFBLVFVOQUxMT0Mob3NoKQkJCSgoKG9zbF9wdWJpbmZvX3QgKikob3NoKSktPnBrdGFsbG9jZWQtLSkKLQotI2RlZmluZQlQS1RTRVRTS0lQQ1Qob3NoLCBza2IpCi0jZGVmaW5lCVBLVENMUlNLSVBDVChvc2gsIHNrYikKLSNkZWZpbmUJUEtUU0tJUENUKG9zaCwgc2tiKQotI2VuZGlmCS8qIEJSQ01fRlVMTE1BQyAqLwotCi0jZGVmaW5lCVBLVExJTksoc2tiKQkJCSgoKHN0cnVjdCBza19idWZmICopKHNrYikpLT5wcmV2KQotI2RlZmluZQlQS1RTRVRMSU5LKHNrYiwgeCkJCSgoKHN0cnVjdCBza19idWZmICopKHNrYikpLT5wcmV2ID0gKHN0cnVjdCBza19idWZmKikoeCkpCi0jZGVmaW5lCVBLVFBSSU8oc2tiKQkJCSgoKHN0cnVjdCBza19idWZmICopKHNrYikpLT5wcmlvcml0eSkKLSNkZWZpbmUJUEtUU0VUUFJJTyhza2IsIHgpCQkoKChzdHJ1Y3Qgc2tfYnVmZiAqKShza2IpKS0+cHJpb3JpdHkgPSAoeCkpCi0jZGVmaW5lIFBLVFNVTU5FRURFRChza2IpCQkoKChzdHJ1Y3Qgc2tfYnVmZiAqKShza2IpKS0+aXBfc3VtbWVkID09IENIRUNLU1VNX1BBUlRJQUwpCi0jZGVmaW5lIFBLVFNFVFNVTUdPT0Qoc2tiLCB4KQkJKCgoc3RydWN0IHNrX2J1ZmYgKikoc2tiKSktPmlwX3N1bW1lZCA9IFwKLQkJCQkJCSgoeCkgPyBDSEVDS1NVTV9VTk5FQ0VTU0FSWSA6IENIRUNLU1VNX05PTkUpKQotLyogUEtUU0VUU1VNTkVFREVEIGFuZCBQS1RTVU1HT09EIGFyZSBub3QgcG9zc2libGUgYmVjYXVzZSBza2ItPmlwX3N1bW1lZCBpcyBvdmVybG9hZGVkICovCi0jZGVmaW5lIFBLVFNIQVJFRChza2IpICAgICAgICAgICAgICAgICAgKCgoc3RydWN0IHNrX2J1ZmYgKikoc2tiKSktPmNsb25lZCkKLQotI2lmIGRlZmluZWQoQkNNU0RJTykgJiYgIWRlZmluZWQoQlJDTV9GVUxMTUFDKQotI2RlZmluZSBSUENfUkVBRF9SRUcob3NoLCByKSAoXAotCXNpemVvZigqKHIpKSA9PSBzaXplb2YodTgpID8gb3NsX3JlYWRiKChvc2gpLCAodm9sYXRpbGUgdTgqKShyKSkgOiBcCi0Jc2l6ZW9mKCoocikpID09IHNpemVvZih1MTYpID8gb3NsX3JlYWR3KChvc2gpLCAodm9sYXRpbGUgdTE2KikocikpIDogXAotCW9zbF9yZWFkbCgob3NoKSwgKHZvbGF0aWxlIHUzMiopKHIpKSBcCi0pCi0jZGVmaW5lIFJQQ19XUklURV9SRUcob3NoLCByLCB2KSBkbyB7IFwKLQlzd2l0Y2ggKHNpemVvZigqKHIpKSkgeyBcCi0JY2FzZSBzaXplb2YodTgpOiBcCi0JCW9zbF93cml0ZWIoKG9zaCksICh2b2xhdGlsZSB1OCopKHIpLCAodTgpKHYpKTsgXAotCQlicmVhazsgXAotCWNhc2Ugc2l6ZW9mKHUxNik6IFwKLQkJb3NsX3dyaXRldygob3NoKSwgKHZvbGF0aWxlIHUxNiopKHIpLCAodTE2KSh2KSk7IFwKLQkJYnJlYWs7IFwKLQljYXNlIHNpemVvZih1MzIpOiBcCi0JCW9zbF93cml0ZWwoKG9zaCksICh2b2xhdGlsZSB1MzIqKShyKSwgKHUzMikodikpOyBcCi0JCWJyZWFrOyBcCi0JfSBcCi19IHdoaWxlICgwKQotCi1leHRlcm4gdTggb3NsX3JlYWRiKG9zbF90ICpvc2gsIHZvbGF0aWxlIHU4ICpyKTsKLWV4dGVybiB1MTYgb3NsX3JlYWR3KG9zbF90ICpvc2gsIHZvbGF0aWxlIHUxNiAqcik7Ci1leHRlcm4gdTMyIG9zbF9yZWFkbChvc2xfdCAqb3NoLCB2b2xhdGlsZSB1MzIgKnIpOwotZXh0ZXJuIHZvaWQgb3NsX3dyaXRlYihvc2xfdCAqb3NoLCB2b2xhdGlsZSB1OCAqciwgdTggdik7Ci1leHRlcm4gdm9pZCBvc2xfd3JpdGV3KG9zbF90ICpvc2gsIHZvbGF0aWxlIHUxNiAqciwgdTE2IHYpOwotZXh0ZXJuIHZvaWQgb3NsX3dyaXRlbChvc2xfdCAqb3NoLCB2b2xhdGlsZSB1MzIgKnIsIHUzMiB2KTsKLSNlbmRpZgkJCQkvKiBCQ01TRElPICovCi0KLSNlbmRpZgkJCQkvKiBfbGludXhfb3NsX2hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2luY2x1ZGUvbGludXh2ZXIuaCBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvaW5jbHVkZS9saW51eHZlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzcyMTQxLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvaW5jbHVkZS9saW51eHZlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxMCBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQotICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KLSAqCi0gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKLSAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWQotICogU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCi0gKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OCi0gKiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOCi0gKiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotICovCi0KLSNpZm5kZWYgX2xpbnV4dmVyX2hfCi0jZGVmaW5lIF9saW51eHZlcl9oXwotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L21tLmg+Ci0jaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC9pZWVlODAyMTEuaD4KLSNpbmNsdWRlIDxsaW51eC90aW1lLmg+Ci0jaW5jbHVkZSA8bGludXgvd2FpdC5oPgotCi0jdW5kZWYgSVBfVE9TCi0jaW5jbHVkZSA8YXNtL2lvLmg+Ci0KLSNlbmRpZgkJCQkvKiBfbGludXh2ZXJfaF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvaW5jbHVkZS9uaWNwY2kuaCBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvaW5jbHVkZS9uaWNwY2kuaAppbmRleCBjZTE0NmU4Li45Mjg4MThkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2luY2x1ZGUvbmljcGNpLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9pbmNsdWRlL25pY3BjaS5oCkBAIC00NSwxNyArNDUsMTcgQEAKICNlbHNlCiBzdHJ1Y3Qgc2JwY2llcmVnczsKIAotZXh0ZXJuIHU4IHBjaWNvcmVfZmluZF9wY2lfY2FwYWJpbGl0eShvc2xfdCAqb3NoLCB1OCByZXFfY2FwX2lkLAorZXh0ZXJuIHU4IHBjaWNvcmVfZmluZF9wY2lfY2FwYWJpbGl0eShzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgdTggcmVxX2NhcF9pZCwKIAkJCQkJIHVuc2lnbmVkIGNoYXIgKmJ1ZiwgdTMyICpidWZsZW4pOwotZXh0ZXJuIHVpbnQgcGNpZV9yZWFkcmVnKG9zbF90ICpvc2gsIHN0cnVjdCBzYnBjaWVyZWdzICpwY2llcmVncywKK2V4dGVybiB1aW50IHBjaWVfcmVhZHJlZyhzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgc3RydWN0IHNicGNpZXJlZ3MgKnBjaWVyZWdzLAogCQkJIHVpbnQgYWRkcnR5cGUsIHVpbnQgb2Zmc2V0KTsKLWV4dGVybiB1aW50IHBjaWVfd3JpdGVyZWcob3NsX3QgKm9zaCwgc3RydWN0IHNicGNpZXJlZ3MgKnBjaWVyZWdzLAorZXh0ZXJuIHVpbnQgcGNpZV93cml0ZXJlZyhzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgc3RydWN0IHNicGNpZXJlZ3MgKnBjaWVyZWdzLAogCQkJICB1aW50IGFkZHJ0eXBlLCB1aW50IG9mZnNldCwgdWludCB2YWwpOwogCiBleHRlcm4gdTggcGNpZV9jbGtyZXEodm9pZCAqcGNoLCB1MzIgbWFzaywgdTMyIHZhbCk7CiBleHRlcm4gdTMyIHBjaWVfbGNyZWcodm9pZCAqcGNoLCB1MzIgbWFzaywgdTMyIHZhbCk7CiAKLWV4dGVybiB2b2lkICpwY2ljb3JlX2luaXQoc2lfdCAqc2loLCBvc2xfdCAqb3NoLCB2b2lkICpyZWdzKTsKK2V4dGVybiB2b2lkICpwY2ljb3JlX2luaXQoc2lfdCAqc2loLCBzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgdm9pZCAqcmVncyk7CiBleHRlcm4gdm9pZCBwY2ljb3JlX2RlaW5pdCh2b2lkICpwY2gpOwogZXh0ZXJuIHZvaWQgcGNpY29yZV9hdHRhY2godm9pZCAqcGNoLCBjaGFyICpwdmFycywgaW50IHN0YXRlKTsKIGV4dGVybiB2b2lkIHBjaWNvcmVfaHd1cCh2b2lkICpwY2gpOwpAQCAtNzAsMTAgKzcwLDEwIEBACiBleHRlcm4gdTMyIHBjaWNvcmVfcGNpZXJlZyh2b2lkICpwY2gsIHUzMiBvZmZzZXQsIHUzMiBtYXNrLAogCQkJICAgICAgdTMyIHZhbCwgdWludCB0eXBlKTsKIAotZXh0ZXJuIGJvb2wgcGNpY29yZV9wbWVjYXBfZmFzdChvc2xfdCAqb3NoKTsKK2V4dGVybiBib29sIHBjaWNvcmVfcG1lY2FwX2Zhc3Qoc3RydWN0IG9zbF9pbmZvICpvc2gpOwogZXh0ZXJuIHZvaWQgcGNpY29yZV9wbWVlbih2b2lkICpwY2gpOwogZXh0ZXJuIHZvaWQgcGNpY29yZV9wbWVjbHIodm9pZCAqcGNoKTsKIGV4dGVybiBib29sIHBjaWNvcmVfcG1lc3RhdCh2b2lkICpwY2gpOwotI2VuZGlmCQkJCS8qIGRlZmluZWQoQkNNU0RJTykgfHwgKGRlZmluZWQoQkNNQlVTVFlQRSkgJiYgKEJDTUJVU1RZUEUgPT0gU0lfQlVTKSkgKi8KKyNlbmRpZiAvKiBkZWZpbmVkKEJDTVNESU8pfHwoZGVmaW5lZChCQ01CVVNUWVBFKSAmJiAoQkNNQlVTVFlQRT09U0lfQlVTKSkgKi8KIAogI2VuZGlmCQkJCS8qIF9OSUNQQ0lfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9pbmNsdWRlL29zbC5oIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9pbmNsdWRlL29zbC5oCmluZGV4IGMwZWJiM2QuLmIyODIzNTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvaW5jbHVkZS9vc2wuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2luY2x1ZGUvb3NsLmgKQEAgLTE4LDQyICsxOCwxOTcgQEAKICNkZWZpbmUgX29zbF9oXwogCiAvKiBvc2wgaGFuZGxlIHR5cGUgZm9yd2FyZCBkZWNsYXJhdGlvbiAqLwotdHlwZWRlZiBzdHJ1Y3Qgb3NsX2luZm8gb3NsX3Q7CitzdHJ1Y3Qgb3NsX2luZm8geworCXVpbnQgcGt0YWxsb2NlZDsJLyogTnVtYmVyIG9mIGFsbG9jYXRlZCBwYWNrZXQgYnVmZmVycyAqLworCWJvb2wgbW1idXM7CQkvKiBCdXMgc3VwcG9ydHMgbWVtb3J5LW1hcHBlZCByZWdpc3RlcnMgKi8KKwl1aW50IG1hZ2ljOworCXZvaWQgKnBkZXY7CisJdWludCBidXN0eXBlOworfTsKKwogdHlwZWRlZiBzdHJ1Y3Qgb3NsX2RtYWluZm8gb3NsZG1hX3Q7CiAKLSNkZWZpbmUgT1NMX1BLVFRBR19TWgkzMgkvKiBTaXplIG9mIFBrdFRhZyAqLwogCi0vKiBEcml2ZXJzIHVzZSBQS1RGUkVFU0VUQ0IgdG8gcmVnaXN0ZXIgYSBjYWxsYmFjayBmdW5jdGlvbiB3aGVuIGEgcGFja2V0IGlzIGZyZWVkIGJ5IE9TTCAqLwotdHlwZWRlZiB2b2lkICgqcGt0ZnJlZV9jYl9mbl90KSAodm9pZCAqY3R4LCB2b2lkICpwa3QsIHVuc2lnbmVkIGludCBzdGF0dXMpOworZXh0ZXJuIHN0cnVjdCBvc2xfaW5mbyAqb3NsX2F0dGFjaCh2b2lkICpwZGV2LCB1aW50IGJ1c3R5cGUpOworZXh0ZXJuIHZvaWQgb3NsX2RldGFjaChzdHJ1Y3Qgb3NsX2luZm8gKm9zaCk7CiAKLSNpZmRlZiBCQ01TRElPCi0vKiBEcml2ZXJzIHVzZSBSRUdPUFNTRVQoKSB0byByZWdpc3RlciByZWdpc3RlciByZWFkL3dyaXRlIGZ1bmNpdG9ucyAqLwotdHlwZWRlZiB1bnNpZ25lZCBpbnQgKCpvc2xfcnJlZ19mbl90KSAodm9pZCAqY3R4LCB2b2lkICpyZWcsIHVuc2lnbmVkIGludCBzaXplKTsKLXR5cGVkZWYgdm9pZCAoKm9zbF93cmVnX2ZuX3QpICh2b2lkICpjdHgsIHZvaWQgKnJlZywgdW5zaWduZWQgaW50IHZhbCwKLQkJCSAgICAgICB1bnNpZ25lZCBpbnQgc2l6ZSk7CitleHRlcm4gdTMyIGdfYXNzZXJ0X3R5cGU7CisKKyNpZiBkZWZpbmVkKEJDTURCR19BU1NFUlQpCisjZGVmaW5lIEFTU0VSVChleHApIFwKKwkgIGRvIHsgaWYgKCEoZXhwKSkgb3NsX2Fzc2VydCgjZXhwLCBfX0ZJTEVfXywgX19MSU5FX18pOyB9IHdoaWxlICgwKQorZXh0ZXJuIHZvaWQgb3NsX2Fzc2VydChjaGFyICpleHAsIGNoYXIgKmZpbGUsIGludCBsaW5lKTsKKyNlbHNlCisjZGVmaW5lIEFTU0VSVChleHApCWRvIHt9IHdoaWxlICgwKQorI2VuZGlmICAvKiBkZWZpbmVkKEJDTURCR19BU1NFUlQpICovCisKKy8qIFBDSSBkZXZpY2UgYnVzICMgYW5kIHNsb3QgIyAqLworI2RlZmluZSBPU0xfUENJX0JVUyhvc2gpCW9zbF9wY2lfYnVzKG9zaCkKKyNkZWZpbmUgT1NMX1BDSV9TTE9UKG9zaCkJb3NsX3BjaV9zbG90KG9zaCkKK2V4dGVybiB1aW50IG9zbF9wY2lfYnVzKHN0cnVjdCBvc2xfaW5mbyAqb3NoKTsKK2V4dGVybiB1aW50IG9zbF9wY2lfc2xvdChzdHJ1Y3Qgb3NsX2luZm8gKm9zaCk7CisKKyNkZWZpbmUgQlVTX1NXQVAzMih2KQkJKHYpCisKK2V4dGVybiB2b2lkICpvc2xfZG1hX2FsbG9jX2NvbnNpc3RlbnQoc3RydWN0IG9zbF9pbmZvICpvc2gsIHVpbnQgc2l6ZSwKKwkJCQkgICAgICB1MTYgYWxpZ24sIHVpbnQgKnRvdCwgdW5zaWduZWQgbG9uZyAqcGFwKTsKKworI2lmZGVmIEJSQ01fRlVMTE1BQworI2RlZmluZQlETUFfQUxMT0NfQ09OU0lTVEVOVChvc2gsIHNpemUsIHBhcCwgZG1haCwgYWxpZ25iaXRzKSBcCisJb3NsX2RtYV9hbGxvY19jb25zaXN0ZW50KChvc2gpLCAoc2l6ZSksICgwKSwgKHRvdCksIChwYXApKQorI2Vsc2UKKyNkZWZpbmUJRE1BX0FMTE9DX0NPTlNJU1RFTlQob3NoLCBzaXplLCBhbGlnbiwgdG90LCBwYXAsIGRtYWgpIFwKKwlvc2xfZG1hX2FsbG9jX2NvbnNpc3RlbnQoKG9zaCksIChzaXplKSwgKGFsaWduKSwgKHRvdCksIChwYXApKQorI2VuZGlmIC8qIEJSQ01fRlVMTE1BQyAqLworCisjZGVmaW5lCURNQV9GUkVFX0NPTlNJU1RFTlQob3NoLCB2YSwgc2l6ZSwgcGEsIGRtYWgpIFwKKwlvc2xfZG1hX2ZyZWVfY29uc2lzdGVudCgob3NoKSwgKHZvaWQgKikodmEpLCAoc2l6ZSksIChwYSkpCitleHRlcm4gdm9pZCBvc2xfZG1hX2ZyZWVfY29uc2lzdGVudChzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgdm9pZCAqdmEsCisJCQkJICAgIHVpbnQgc2l6ZSwgdW5zaWduZWQgbG9uZyBwYSk7CisKKy8qIG1hcC91bm1hcCBkaXJlY3Rpb24gKi8KKyNkZWZpbmUJRE1BX1RYCTEJCS8qIFRYIGRpcmVjdGlvbiBmb3IgRE1BICovCisjZGVmaW5lCURNQV9SWAkyCQkvKiBSWCBkaXJlY3Rpb24gZm9yIERNQSAqLworCisvKiBtYXAvdW5tYXAgc2hhcmVkIChkbWEtYWJsZSkgbWVtb3J5ICovCisjZGVmaW5lCURNQV9NQVAob3NoLCB2YSwgc2l6ZSwgZGlyZWN0aW9uLCBwLCBkbWFoKSBcCisJb3NsX2RtYV9tYXAoKG9zaCksICh2YSksIChzaXplKSwgKGRpcmVjdGlvbikpCisjZGVmaW5lCURNQV9VTk1BUChvc2gsIHBhLCBzaXplLCBkaXJlY3Rpb24sIHAsIGRtYWgpIFwKKwlvc2xfZG1hX3VubWFwKChvc2gpLCAocGEpLCAoc2l6ZSksIChkaXJlY3Rpb24pKQorZXh0ZXJuIHVpbnQgb3NsX2RtYV9tYXAoc3RydWN0IG9zbF9pbmZvICpvc2gsIHZvaWQgKnZhLCB1aW50IHNpemUsCisJCQlpbnQgZGlyZWN0aW9uKTsKK2V4dGVybiB2b2lkIG9zbF9kbWFfdW5tYXAoc3RydWN0IG9zbF9pbmZvICpvc2gsIHVpbnQgcGEsIHVpbnQgc2l6ZSwKKwkJCSAgaW50IGRpcmVjdGlvbik7CisKKy8qIHJlZ2lzdGVyIGFjY2VzcyBtYWNyb3MgKi8KKyNpZiBkZWZpbmVkKEJDTVNESU8pCisjaWZkZWYgQlJDTV9GVUxMTUFDCisjaW5jbHVkZSA8YmNtc2RoLmg+CisjZW5kaWYKKyNkZWZpbmUgT1NMX1dSSVRFX1JFRyhvc2gsIHIsIHYpIFwKKwkJKGJjbXNkaF9yZWdfd3JpdGUoTlVMTCwgKHVuc2lnbmVkIGxvbmcpKHIpLCBzaXplb2YoKihyKSksICh2KSkpCisjZGVmaW5lIE9TTF9SRUFEX1JFRyhvc2gsIHIpIFwKKwkJKGJjbXNkaF9yZWdfcmVhZChOVUxMLCAodW5zaWduZWQgbG9uZykociksIHNpemVvZigqKHIpKSkpCiAjZW5kaWYKIAotI2luY2x1ZGUgPGxpbnV4X29zbC5oPgotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiogUmVnaXN0ZXIgbWFuaXB1bGF0aW9uIG1hY3Jvcy4KLSovCi0KLSNkZWZpbmUJU0VUX1JFRyhvc2gsIHIsIG1hc2ssIHZhbCkJV19SRUcoKG9zaCksIChyKSwgKChSX1JFRygob3NoKSwgcikgJiB+KG1hc2spKSB8ICh2YWwpKSkKLQotI2lmbmRlZiBBTkRfUkVHCi0jZGVmaW5lIEFORF9SRUcob3NoLCByLCB2KQkJV19SRUcob3NoLCAociksIFJfUkVHKG9zaCwgcikgJiAodikpCi0jZW5kaWYJCQkJLyogIUFORF9SRUcgKi8KLQotI2lmbmRlZiBPUl9SRUcKLSNkZWZpbmUgT1JfUkVHKG9zaCwgciwgdikJCVdfUkVHKG9zaCwgKHIpLCBSX1JFRyhvc2gsIHIpIHwgKHYpKQotI2VuZGlmCQkJCS8qICFPUl9SRUcgKi8KLQotI2lmICFkZWZpbmVkKE9TTF9TWVNVUFRJTUUpCi0jZGVmaW5lIE9TTF9TWVNVUFRJTUUoKSAoMCkKLSNkZWZpbmUgT1NMX1NZU1VQVElNRV9TVVBQT1JUIGZhbHNlCisjaWYgZGVmaW5lZChCQ01TRElPKQorI2RlZmluZSBTRUxFQ1RfQlVTX1dSSVRFKG9zaCwgbW1hcF9vcCwgYnVzX29wKSBcCisJaWYgKChvc2gpLT5tbWJ1cykgXAorCQltbWFwX29wIGVsc2UgYnVzX29wCisjZGVmaW5lIFNFTEVDVF9CVVNfUkVBRChvc2gsIG1tYXBfb3AsIGJ1c19vcCkgXAorCSgob3NoKS0+bW1idXMpID8gIG1tYXBfb3AgOiBidXNfb3AKICNlbHNlCi0jZGVmaW5lIE9TTF9TWVNVUFRJTUVfU1VQUE9SVCB0cnVlCi0jZW5kaWYJCQkJLyogT1NMX1NZU1VQVElNRSAqLworI2RlZmluZSBTRUxFQ1RfQlVTX1dSSVRFKG9zaCwgbW1hcF9vcCwgYnVzX29wKSBtbWFwX29wCisjZGVmaW5lIFNFTEVDVF9CVVNfUkVBRChvc2gsIG1tYXBfb3AsIGJ1c19vcCkgbW1hcF9vcAorI2VuZGlmCiAKLSNlbmRpZgkJCQkvKiBfb3NsX2hfICovCisvKiB0aGUgbGFyZ2VzdCByZWFzb25hYmxlIHBhY2tldCBidWZmZXIgZHJpdmVyIHVzZXMgZm9yIGV0aGVybmV0IE1UVSBpbiBieXRlcyAqLworI2RlZmluZQlQS1RCVUZTWgkyMDQ4CisKKyNkZWZpbmUgT1NMX1NZU1VQVElNRSgpCQkoKHUzMilqaWZmaWVzICogKDEwMDAgLyBIWikpCisjZGVmaW5lCXByaW50ZihmbXQsIGFyZ3MuLi4pCXByaW50ayhmbXQgLCAjIyBhcmdzKQorI2lmZGVmIEJSQ01fRlVMTE1BQworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgkvKiBmb3IgdnNuL3ByaW50ZidzICovCisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CS8qIGZvciBtZW0qLCBzdHIqICovCisjZW5kaWYKKy8qIGJjb3B5J3M6IExpbnV4IGtlcm5lbCBkb2Vzbid0IHByb3ZpZGUgdGhlc2UgKGFueW1vcmUpICovCisjZGVmaW5lCWJjb3B5KHNyYywgZHN0LCBsZW4pCW1lbWNweSgoZHN0KSwgKHNyYyksIChsZW4pKQorCisvKiByZWdpc3RlciBhY2Nlc3MgbWFjcm9zICovCisjaWZuZGVmIElMX0JJR0VORElBTgorI2lmbmRlZiBfX21pcHNfXworI2RlZmluZSBSX1JFRyhvc2gsIHIpIChcCisJU0VMRUNUX0JVU19SRUFEKG9zaCwgc2l6ZW9mKCoocikpID09IHNpemVvZih1OCkgPyBcCisJcmVhZGIoKHZvbGF0aWxlIHU4KikocikpIDogXAorCXNpemVvZigqKHIpKSA9PSBzaXplb2YodTE2KSA/IHJlYWR3KCh2b2xhdGlsZSB1MTYqKShyKSkgOiBcCisJcmVhZGwoKHZvbGF0aWxlIHUzMiopKHIpKSwgT1NMX1JFQURfUkVHKG9zaCwgcikpIFwKKykKKyNlbHNlCQkJCS8qIF9fbWlwc19fICovCisjZGVmaW5lIFJfUkVHKG9zaCwgcikgKFwKKwlTRUxFQ1RfQlVTX1JFQUQob3NoLCBcCisJCSh7IFwKKwkJCV9fdHlwZW9mKCoocikpIF9fb3NsX3Y7IFwKKwkJCV9fYXNtX18gX192b2xhdGlsZV9fKCJzeW5jIik7IFwKKwkJCXN3aXRjaCAoc2l6ZW9mKCoocikpKSB7IFwKKwkJCWNhc2Ugc2l6ZW9mKHU4KTogXAorCQkJCV9fb3NsX3YgPSByZWFkYigodm9sYXRpbGUgdTgqKShyKSk7IFwKKwkJCQlicmVhazsgXAorCQkJY2FzZSBzaXplb2YodTE2KTogXAorCQkJCV9fb3NsX3YgPSByZWFkdygodm9sYXRpbGUgdTE2KikocikpOyBcCisJCQkJYnJlYWs7IFwKKwkJCWNhc2Ugc2l6ZW9mKHUzMik6IFwKKwkJCQlfX29zbF92ID0gXAorCQkJCXJlYWRsKCh2b2xhdGlsZSB1MzIqKShyKSk7IFwKKwkJCQlicmVhazsgXAorCQkJfSBcCisJCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygic3luYyIpOyBcCisJCQlfX29zbF92OyBcCisJCX0pLCBcCisJCSh7IFwKKwkJCV9fdHlwZW9mKCoocikpIF9fb3NsX3Y7IFwKKwkJCV9fYXNtX18gX192b2xhdGlsZV9fKCJzeW5jIik7IFwKKwkJCV9fb3NsX3YgPSBPU0xfUkVBRF9SRUcob3NoLCByKTsgXAorCQkJX19hc21fXyBfX3ZvbGF0aWxlX18oInN5bmMiKTsgXAorCQkJX19vc2xfdjsgXAorCQl9KSkgXAorKQorI2VuZGlmCQkJCS8qIF9fbWlwc19fICovCisKKyNkZWZpbmUgV19SRUcob3NoLCByLCB2KSBkbyB7IFwKKwlTRUxFQ1RfQlVTX1dSSVRFKG9zaCwgIFwKKwkJc3dpdGNoIChzaXplb2YoKihyKSkpIHsgXAorCQljYXNlIHNpemVvZih1OCk6IFwKKwkJCXdyaXRlYigodTgpKHYpLCAodm9sYXRpbGUgdTgqKShyKSk7IGJyZWFrOyBcCisJCWNhc2Ugc2l6ZW9mKHUxNik6IFwKKwkJCXdyaXRldygodTE2KSh2KSwgKHZvbGF0aWxlIHUxNiopKHIpKTsgYnJlYWs7IFwKKwkJY2FzZSBzaXplb2YodTMyKTogXAorCQkJd3JpdGVsKCh1MzIpKHYpLCAodm9sYXRpbGUgdTMyKikocikpOyBicmVhazsgXAorCQl9LCBcCisJCShPU0xfV1JJVEVfUkVHKG9zaCwgciwgdikpKTsgXAorCX0gd2hpbGUgKDApCisjZWxzZQkJCQkvKiBJTF9CSUdFTkRJQU4gKi8KKyNkZWZpbmUgUl9SRUcob3NoLCByKSAoXAorCVNFTEVDVF9CVVNfUkVBRChvc2gsIFwKKwkJKHsgXAorCQkJX190eXBlb2YoKihyKSkgX19vc2xfdjsgXAorCQkJc3dpdGNoIChzaXplb2YoKihyKSkpIHsgXAorCQkJY2FzZSBzaXplb2YodTgpOiBcCisJCQkJX19vc2xfdiA9IFwKKwkJCQlyZWFkYigodm9sYXRpbGUgdTgqKSgocileMykpOyBcCisJCQkJYnJlYWs7IFwKKwkJCWNhc2Ugc2l6ZW9mKHUxNik6IFwKKwkJCQlfX29zbF92ID0gXAorCQkJCXJlYWR3KCh2b2xhdGlsZSB1MTYqKSgocileMikpOyBcCisJCQkJYnJlYWs7IFwKKwkJCWNhc2Ugc2l6ZW9mKHUzMik6IFwKKwkJCQlfX29zbF92ID0gcmVhZGwoKHZvbGF0aWxlIHUzMiopKHIpKTsgXAorCQkJCWJyZWFrOyBcCisJCQl9IFwKKwkJCV9fb3NsX3Y7IFwKKwkJfSksIFwKKwkJT1NMX1JFQURfUkVHKG9zaCwgcikpIFwKKykKKyNkZWZpbmUgV19SRUcob3NoLCByLCB2KSBkbyB7IFwKKwlTRUxFQ1RfQlVTX1dSSVRFKG9zaCwgIFwKKwkJc3dpdGNoIChzaXplb2YoKihyKSkpIHsgXAorCQljYXNlIHNpemVvZih1OCk6CVwKKwkJCXdyaXRlYigodTgpKHYpLCBcCisJCQkodm9sYXRpbGUgdTgqKSgocileMykpOyBicmVhazsgXAorCQljYXNlIHNpemVvZih1MTYpOglcCisJCQl3cml0ZXcoKHUxNikodiksIFwKKwkJCSh2b2xhdGlsZSB1MTYqKSgocileMikpOyBicmVhazsgXAorCQljYXNlIHNpemVvZih1MzIpOglcCisJCQl3cml0ZWwoKHUzMikodiksIFwKKwkJCSh2b2xhdGlsZSB1MzIqKShyKSk7IGJyZWFrOyBcCisJCX0sIFwKKwkJKE9TTF9XUklURV9SRUcob3NoLCByLCB2KSkpOyBcCisJfSB3aGlsZSAoMCkKKyNlbmRpZgkJCQkvKiBJTF9CSUdFTkRJQU4gKi8KKworI2RlZmluZQliY29weShzcmMsIGRzdCwgbGVuKQltZW1jcHkoKGRzdCksIChzcmMpLCAobGVuKSkKKworLyogcGFja2V0IHByaW1pdGl2ZXMgKi8KK2V4dGVybiBzdHJ1Y3Qgc2tfYnVmZiAqcGt0X2J1Zl9nZXRfc2tiKHN0cnVjdCBvc2xfaW5mbyAqb3NoLCB1aW50IGxlbik7CitleHRlcm4gdm9pZCBwa3RfYnVmX2ZyZWVfc2tiKHN0cnVjdCBvc2xfaW5mbyAqb3NoLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBib29sIHNlbmQpOworCisjZW5kaWYgLyogX29zbF9oXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9pbmNsdWRlL3Byb3RvL2V0aGVybmV0LmggYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2luY2x1ZGUvcHJvdG8vZXRoZXJuZXQuaAppbmRleCBjYzE3YjQyLi41Njc0MDdkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2luY2x1ZGUvcHJvdG8vZXRoZXJuZXQuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2luY2x1ZGUvcHJvdG8vZXRoZXJuZXQuaApAQCAtMTcsMjggKzE3LDIyIEBACiAjaWZuZGVmIF9ORVRfRVRIRVJORVRfSF8KICNkZWZpbmUgX05FVF9FVEhFUk5FVF9IXwogCisjaW5jbHVkZSA8bGludXgvaWZfZXRoZXIuaD4KKwogI2luY2x1ZGUgPHBhY2tlZF9zZWN0aW9uX3N0YXJ0Lmg+CiAKLSNkZWZpbmUJRVRIRVJfQUREUl9MRU4JCTYKICNkZWZpbmUJRVRIRVJfVFlQRV9MRU4JCTIKICNkZWZpbmUJRVRIRVJfQ1JDX0xFTgkJNAotI2RlZmluZQlFVEhFUl9IRFJfTEVOCQkoRVRIRVJfQUREUl9MRU4gKiAyICsgRVRIRVJfVFlQRV9MRU4pCiAjZGVmaW5lCUVUSEVSX01JTl9MRU4JCTY0CiAjZGVmaW5lCUVUSEVSX01JTl9EQVRBCQk0NgogI2RlZmluZQlFVEhFUl9NQVhfTEVOCQkxNTE4CiAjZGVmaW5lCUVUSEVSX01BWF9EQVRBCQkxNTAwCiAKLSNkZWZpbmUgRVRIRVJfVFlQRV9NSU4JCTB4MDYwMAotI2RlZmluZQlFVEhFUl9UWVBFX0lQCQkweDA4MDAKLSNkZWZpbmUgRVRIRVJfVFlQRV9BUlAJCTB4MDgwNgotI2RlZmluZSBFVEhFUl9UWVBFXzgwMjFRCTB4ODEwMAogI2RlZmluZQlFVEhFUl9UWVBFX0JSQ00JCTB4ODg2YwotI2RlZmluZQlFVEhFUl9UWVBFXzgwMl8xWAkweDg4OGUKLSNkZWZpbmUJRVRIRVJfVFlQRV84MDJfMVhfUFJFQVVUSCAweDg4YzcKIAotI2RlZmluZSBFVEhFUl9ERVNUX09GRlNFVAkoMCAqIEVUSEVSX0FERFJfTEVOKQotI2RlZmluZSBFVEhFUl9TUkNfT0ZGU0VUCSgxICogRVRIRVJfQUREUl9MRU4pCi0jZGVmaW5lIEVUSEVSX1RZUEVfT0ZGU0VUCSgyICogRVRIRVJfQUREUl9MRU4pCisjZGVmaW5lIEVUSEVSX0RFU1RfT0ZGU0VUCSgwICogRVRIX0FMRU4pCisjZGVmaW5lIEVUSEVSX1NSQ19PRkZTRVQJKDEgKiBFVEhfQUxFTikKKyNkZWZpbmUgRVRIRVJfVFlQRV9PRkZTRVQJKDIgKiBFVEhfQUxFTikKIAogI2RlZmluZQlFVEhFUl9JU19WQUxJRF9MRU4oZm9vKQlcCiAJKChmb28pID49IEVUSEVSX01JTl9MRU4gJiYgKGZvbykgPD0gRVRIRVJfTUFYX0xFTikKQEAgLTUzLDUwICs0NywxOCBAQAogfQogCiBCV0xfUFJFX1BBQ0tFRF9TVFJVQ1Qgc3RydWN0IGV0aGVyX2hlYWRlciB7Ci0JdTggZXRoZXJfZGhvc3RbRVRIRVJfQUREUl9MRU5dOwotCXU4IGV0aGVyX3Nob3N0W0VUSEVSX0FERFJfTEVOXTsKKwl1OCBldGhlcl9kaG9zdFtFVEhfQUxFTl07CisJdTggZXRoZXJfc2hvc3RbRVRIX0FMRU5dOwogCXUxNiBldGhlcl90eXBlOwogfSBCV0xfUE9TVF9QQUNLRURfU1RSVUNUOwogCiBCV0xfUFJFX1BBQ0tFRF9TVFJVQ1Qgc3RydWN0IGV0aGVyX2FkZHIgewotCXU4IG9jdGV0W0VUSEVSX0FERFJfTEVOXTsKKwl1OCBvY3RldFtFVEhfQUxFTl07CiB9IEJXTF9QT1NUX1BBQ0tFRF9TVFJVQ1Q7CiAKLSNkZWZpbmUgRVRIRVJfU0VUX0xPQ0FMQUREUihlYSkJKCgodTggKikoZWEpKVswXSA9ICgoKHU4ICopKGVhKSlbMF0gfCAyKSkKLSNkZWZpbmUgRVRIRVJfSVNfTE9DQUxBRERSKGVhKSAJKCgodTggKikoZWEpKVswXSAmIDIpCi0jZGVmaW5lIEVUSEVSX0NMUl9MT0NBTEFERFIoZWEpCSgoKHU4ICopKGVhKSlbMF0gPSBcCi0JKCgodTggKikoZWEpKVswXSAmIDB4ZCkpCi0jZGVmaW5lIEVUSEVSX1RPR0dMRV9MT0NBTEFERFIoZWEpCSgoKHU4ICopKGVhKSlbMF0gPSBcCi0JKCgodTggKikoZWEpKVswXSBeIDIpKQotCiAjZGVmaW5lIEVUSEVSX1NFVF9VTklDQVNUKGVhKQkoKCh1OCAqKShlYSkpWzBdID0gKCgodTggKikoZWEpKVswXSAmIH4xKSkKIAotI2RlZmluZSBFVEhFUl9JU01VTFRJKGVhKSAoKChjb25zdCB1OCAqKShlYSkpWzBdICYgMSkKLQotI2RlZmluZQlldGhlcl9jbXAoYSwgYikJKCEoKChzaG9ydCAqKWEpWzBdID09ICgoc2hvcnQgKiliKVswXSkgfCBcCi0JCQkgISgoKHNob3J0ICopYSlbMV0gPT0gKChzaG9ydCAqKWIpWzFdKSB8IFwKLQkJCSAhKCgoc2hvcnQgKilhKVsyXSA9PSAoKHNob3J0ICopYilbMl0pKQotCi0jZGVmaW5lCWV0aGVyX2NvcHkocywgZCkgeyBcCi0JCSgoc2hvcnQgKilkKVswXSA9ICgoc2hvcnQgKilzKVswXTsgXAotCQkoKHNob3J0ICopZClbMV0gPSAoKHNob3J0ICopcylbMV07IFwKLQkJKChzaG9ydCAqKWQpWzJdID0gKChzaG9ydCAqKXMpWzJdOyB9Ci0KIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZXRoZXJfYWRkciBldGhlcl9iY2FzdCA9IHsgezI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTV9IH07Ci1zdGF0aWMgY29uc3Qgc3RydWN0IGV0aGVyX2FkZHIgZXRoZXJfbnVsbCA9IHsgezAsIDAsIDAsIDAsIDAsIDB9IH07Ci0KLSNkZWZpbmUgRVRIRVJfSVNCQ0FTVChlYSkJKCgoKHU4ICopKGVhKSlbMF0gJgkJXAotCSgodTggKikoZWEpKVsxXSAmCQlcCi0JKCh1OCAqKShlYSkpWzJdICYJCVwKLQkoKHU4ICopKGVhKSlbM10gJgkJXAotCSgodTggKikoZWEpKVs0XSAmCQlcCi0JKCh1OCAqKShlYSkpWzVdKSA9PSAweGZmKQotI2RlZmluZSBFVEhFUl9JU05VTExBRERSKGVhKQkoKCgodTggKikoZWEpKVswXSB8CQlcCi0JKCh1OCAqKShlYSkpWzFdIHwJCVwKLQkoKHU4ICopKGVhKSlbMl0gfAkJXAotCSgodTggKikoZWEpKVszXSB8CQlcCi0JKCh1OCAqKShlYSkpWzRdIHwJCVwKLQkoKHU4ICopKGVhKSlbNV0pID09IDApCiAKICNkZWZpbmUgRVRIRVJfTU9WRV9IRFIoZCwgcykgXAogZG8geyBcCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2luY2x1ZGUvcHJvdG8vd3BhLmggYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2luY2x1ZGUvcHJvdG8vd3BhLmgKaW5kZXggZWM4NGM5Zi4uMTBjMmZiNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9pbmNsdWRlL3Byb3RvL3dwYS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvaW5jbHVkZS9wcm90by93cGEuaApAQCAtMTksOTUgKzE5LDcgQEAKIAogI2luY2x1ZGUgPHByb3RvL2V0aGVybmV0Lmg+CiAKLSNpbmNsdWRlIDxwYWNrZWRfc2VjdGlvbl9zdGFydC5oPgotCi0jZGVmaW5lIERPVDExX1JDX0lOVkFMSURfV1BBX0lFCQkxMwotI2RlZmluZSBET1QxMV9SQ19NSUNfRkFJTFVSRQkJMTQKLSNkZWZpbmUgRE9UMTFfUkNfNFdIX1RJTUVPVVQJCTE1Ci0jZGVmaW5lIERPVDExX1JDX0dUS19VUERBVEVfVElNRU9VVAkxNgotI2RlZmluZSBET1QxMV9SQ19XUEFfSUVfTUlTTUFUQ0gJMTcKLSNkZWZpbmUgRE9UMTFfUkNfSU5WQUxJRF9NQ19DSVBIRVIJMTgKLSNkZWZpbmUgRE9UMTFfUkNfSU5WQUxJRF9VQ19DSVBIRVIJMTkKLSNkZWZpbmUgRE9UMTFfUkNfSU5WQUxJRF9BS01QCQkyMAotI2RlZmluZSBET1QxMV9SQ19CQURfV1BBX1ZFUlNJT04JMjEKLSNkZWZpbmUgRE9UMTFfUkNfSU5WQUxJRF9XUEFfQ0FQCTIyCi0jZGVmaW5lIERPVDExX1JDXzgwMjFYX0FVVEhfRkFJTAkyMwotCiAjZGVmaW5lIFdQQTJfUE1LSURfTEVOCTE2Ci0KLXR5cGVkZWYgQldMX1BSRV9QQUNLRURfU1RSVUNUIHN0cnVjdCB7Ci0JdTggdGFnOwotCXU4IGxlbmd0aDsKLQl1OCBvdWlbM107Ci0JdTggb3VpX3R5cGU7Ci0JQldMX1BSRV9QQUNLRURfU1RSVUNUIHN0cnVjdCB7Ci0JCXU4IGxvdzsKLQkJdTggaGlnaDsKLQl9IEJXTF9QT1NUX1BBQ0tFRF9TVFJVQ1QgdmVyc2lvbjsKLX0gQldMX1BPU1RfUEFDS0VEX1NUUlVDVCB3cGFfaWVfZml4ZWRfdDsKLSNkZWZpbmUgV1BBX0lFX09VSVRZUEVfTEVOCTQKLSNkZWZpbmUgV1BBX0lFX0ZJWEVEX0xFTgk4Ci0jZGVmaW5lIFdQQV9JRV9UQUdfRklYRURfTEVOCTYKLQotdHlwZWRlZiBCV0xfUFJFX1BBQ0tFRF9TVFJVQ1Qgc3RydWN0IHsKLQl1OCB0YWc7Ci0JdTggbGVuZ3RoOwotCUJXTF9QUkVfUEFDS0VEX1NUUlVDVCBzdHJ1Y3QgewotCQl1OCBsb3c7Ci0JCXU4IGhpZ2g7Ci0JfSBCV0xfUE9TVF9QQUNLRURfU1RSVUNUIHZlcnNpb247Ci19IEJXTF9QT1NUX1BBQ0tFRF9TVFJVQ1Qgd3BhX3Jzbl9pZV9maXhlZF90OwotI2RlZmluZSBXUEFfUlNOX0lFX0ZJWEVEX0xFTgk0Ci0jZGVmaW5lIFdQQV9SU05fSUVfVEFHX0ZJWEVEX0xFTgkyCi10eXBlZGVmIHU4IHdwYV9wbWtpZF90W1dQQTJfUE1LSURfTEVOXTsKLQotdHlwZWRlZiBCV0xfUFJFX1BBQ0tFRF9TVFJVQ1Qgc3RydWN0IHsKLQl1OCBvdWlbM107Ci0JdTggdHlwZTsKLX0gQldMX1BPU1RfUEFDS0VEX1NUUlVDVCB3cGFfc3VpdGVfdCwgd3BhX3N1aXRlX21jYXN0X3Q7Ci0jZGVmaW5lIFdQQV9TVUlURV9MRU4JNAotCi10eXBlZGVmIEJXTF9QUkVfUEFDS0VEX1NUUlVDVCBzdHJ1Y3QgewotCUJXTF9QUkVfUEFDS0VEX1NUUlVDVCBzdHJ1Y3QgewotCQl1OCBsb3c7Ci0JCXU4IGhpZ2g7Ci0JfSBCV0xfUE9TVF9QQUNLRURfU1RSVUNUIGNvdW50OwotCXdwYV9zdWl0ZV90IGxpc3RbMV07Ci19IEJXTF9QT1NUX1BBQ0tFRF9TVFJVQ1Qgd3BhX3N1aXRlX3VjYXN0X3QsIHdwYV9zdWl0ZV9hdXRoX2tleV9tZ210X3Q7Ci0jZGVmaW5lIFdQQV9JRV9TVUlURV9DT1VOVF9MRU4JMgotdHlwZWRlZiBCV0xfUFJFX1BBQ0tFRF9TVFJVQ1Qgc3RydWN0IHsKLQlCV0xfUFJFX1BBQ0tFRF9TVFJVQ1Qgc3RydWN0IHsKLQkJdTggbG93OwotCQl1OCBoaWdoOwotCX0gQldMX1BPU1RfUEFDS0VEX1NUUlVDVCBjb3VudDsKLQl3cGFfcG1raWRfdCBsaXN0WzFdOwotfSBCV0xfUE9TVF9QQUNLRURfU1RSVUNUIHdwYV9wbWtpZF9saXN0X3Q7Ci0KLSNkZWZpbmUgV1BBX0NJUEhFUl9OT05FCQkwCi0jZGVmaW5lIFdQQV9DSVBIRVJfV0VQXzQwCTEKLSNkZWZpbmUgV1BBX0NJUEhFUl9US0lQCQkyCi0jZGVmaW5lIFdQQV9DSVBIRVJfQUVTX09DQgkzCi0jZGVmaW5lIFdQQV9DSVBIRVJfQUVTX0NDTQk0Ci0jZGVmaW5lIFdQQV9DSVBIRVJfV0VQXzEwNAk1Ci0KLSNkZWZpbmUgSVNfV1BBX0NJUEhFUihjaXBoZXIpCSgoY2lwaGVyKSA9PSBXUEFfQ0lQSEVSX05PTkUgfHwgXAotCQkJCSAoY2lwaGVyKSA9PSBXUEFfQ0lQSEVSX1dFUF80MCB8fCBcCi0JCQkJIChjaXBoZXIpID09IFdQQV9DSVBIRVJfV0VQXzEwNCB8fCBcCi0JCQkJIChjaXBoZXIpID09IFdQQV9DSVBIRVJfVEtJUCB8fCBcCi0JCQkJIChjaXBoZXIpID09IFdQQV9DSVBIRVJfQUVTX09DQiB8fCBcCi0JCQkJIChjaXBoZXIpID09IFdQQV9DSVBIRVJfQUVTX0NDTSkKLQotI2RlZmluZSBXUEFfVEtJUF9DTV9ERVRFQ1QJNjAKLSNkZWZpbmUgV1BBX1RLSVBfQ01fQkxPQ0sJNjAKLQotI2RlZmluZSBSU05fQ0FQX0xFTgkJMgotCi0jZGVmaW5lIFJTTl9DQVBfUFJFQVVUSAkJCTB4MDAwMQotI2RlZmluZSBSU05fQ0FQX05PUEFJUldJU0UJCTB4MDAwMgotI2RlZmluZSBSU05fQ0FQX1BUS19SRVBMQVlfQ05UUl9NQVNLCTB4MDAwQwotI2RlZmluZSBSU05fQ0FQX1BUS19SRVBMQVlfQ05UUl9TSElGVAkyCi0jZGVmaW5lIFJTTl9DQVBfR1RLX1JFUExBWV9DTlRSX01BU0sJMHgwMDMwCi0jZGVmaW5lIFJTTl9DQVBfR1RLX1JFUExBWV9DTlRSX1NISUZUCTQKICNkZWZpbmUgUlNOX0NBUF8xX1JFUExBWV9DTlRSCQkwCiAjZGVmaW5lIFJTTl9DQVBfMl9SRVBMQVlfQ05UUlMJCTEKICNkZWZpbmUgUlNOX0NBUF80X1JFUExBWV9DTlRSUwkJMgpAQCAtMTE4LDEwICszMCw0IEBACiAjZGVmaW5lIFdQQV9DQVBfUkVQTEFZX0NOVFJfU0hJRlQJUlNOX0NBUF9QVEtfUkVQTEFZX0NOVFJfU0hJRlQKICNkZWZpbmUgV1BBX0NBUF9SRVBMQVlfQ05UUl9NQVNLCVJTTl9DQVBfUFRLX1JFUExBWV9DTlRSX01BU0sKIAotI2RlZmluZSBXUEFfQ0FQX0xFTglSU05fQ0FQX0xFTgotCi0jZGVmaW5lCVdQQV9DQVBfV1BBMl9QUkVBVVRICQlSU05fQ0FQX1BSRUFVVEgKLQotI2luY2x1ZGUgPHBhY2tlZF9zZWN0aW9uX2VuZC5oPgotCiAjZW5kaWYJCQkJLyogX3Byb3RvX3dwYV9oXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9pbmNsdWRlL3JwY19vc2wuaCBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvaW5jbHVkZS9ycGNfb3NsLmgKaW5kZXggNGEyNjQ4MC4uYzU5ZDllZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9pbmNsdWRlL3JwY19vc2wuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2luY2x1ZGUvcnBjX29zbC5oCkBAIC0xOCw3ICsxOCw3IEBACiAjZGVmaW5lIF9ycGNvc2xfaF8KIAogdHlwZWRlZiBzdHJ1Y3QgcnBjX29zbCBycGNfb3NsX3Q7Ci1leHRlcm4gcnBjX29zbF90ICpycGNfb3NsX2F0dGFjaChvc2xfdCAqb3NoKTsKK2V4dGVybiBycGNfb3NsX3QgKnJwY19vc2xfYXR0YWNoKHN0cnVjdCBvc2xfaW5mbyAqb3NoKTsKIGV4dGVybiB2b2lkIHJwY19vc2xfZGV0YWNoKHJwY19vc2xfdCAqcnBjX29zaCk7CiAKICNkZWZpbmUgUlBDX09TTF9MT0NLKHJwY19vc2gpIHJwY19vc2xfbG9jaygocnBjX29zaCkpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2luY2x1ZGUvc2l1dGlscy5oIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9pbmNsdWRlL3NpdXRpbHMuaAppbmRleCA1N2MzNjUwLi5hOTM1MDkyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2luY2x1ZGUvc2l1dGlscy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvaW5jbHVkZS9zaXV0aWxzLmgKQEAgLTE5LDkgKzE5LDYgQEAKIAogI2luY2x1ZGUgPGhuZHNvYy5oPgogCi0jaWYgIWRlZmluZWQoV0xDX0xPVykKLSNpbmNsdWRlICJiY21fcnBjLmgiCi0jZW5kaWYKIC8qCiAgKiBEYXRhIHN0cnVjdHVyZSB0byBleHBvcnQgYWxsIGNoaXAgc3BlY2lmaWMgY29tbW9uIHZhcmlhYmxlcwogICogICBwdWJsaWMgKHJlYWQtb25seSkgcG9ydGlvbiBvZiBzaXV0aWxzIGhhbmRsZSByZXR1cm5lZCBieSBzaV9hdHRhY2goKQpAQCAtNTAsMTkgKzQ3LDEyIEBACiAJdWludCBzb2NpcmV2OwkJLyogU09DIGludGVyY29ubmVjdCByZXYgKi8KIAlib29sIHBjaV9wcjMyNDE0OwogCi0jaWYgIWRlZmluZWQoV0xDX0xPVykKLQlycGNfaW5mb190ICpycGM7Ci0jZW5kaWYKIH07CiAKIC8qIGZvciBISUdIX09OTFkgZHJpdmVyLCB0aGUgc2lfdCBtdXN0IGJlIHdyaXRhYmxlIHRvIGFsbG93IHN0YXRlcyBzeW5jIGZyb20gQk1BQyB0byBISUdIIGRyaXZlcgogICogZm9yIG1vbm9saXRoaWMgZHJpdmVyLCBpdCBpcyByZWFkb25seSB0byBwcmV2ZW50IGFjY2lkZW50IGNoYW5nZQogICovCi0jaWYgIWRlZmluZWQoV0xDX0xPVykKLXR5cGVkZWYgc3RydWN0IHNpX3B1YiBzaV90OwotI2Vsc2UKIHR5cGVkZWYgY29uc3Qgc3RydWN0IHNpX3B1YiBzaV90OwotI2VuZGlmCiAKIC8qCiAgKiBNYW55IG9mIHRoZSByb3V0aW5lcyBiZWxvdyB0YWtlIGFuICdzaWgnIGhhbmRsZSBhcyB0aGVpciBmaXJzdCBhcmcuCkBAIC0xMjgsOCArMTE4LDggQEAKICNkZWZpbmUgR1BJT19DVFJMX0VQQV9FTl9NQVNLIDB4NDAKIAogLyogPT09IGV4cG9ydGVkIGZ1bmN0aW9ucyA9PT0gKi8KLWV4dGVybiBzaV90ICpzaV9hdHRhY2godWludCBwY2lkZXYsIG9zbF90ICpvc2gsIHZvaWQgKnJlZ3MsIHVpbnQgYnVzdHlwZSwKLQkJICAgICAgIHZvaWQgKnNkaCwgY2hhciAqKnZhcnMsIHVpbnQgKnZhcnN6KTsKK2V4dGVybiBzaV90ICpzaV9hdHRhY2godWludCBwY2lkZXYsIHN0cnVjdCBvc2xfaW5mbyAqb3NoLCB2b2lkICpyZWdzLAorCQkgICAgICAgdWludCBidXN0eXBlLCB2b2lkICpzZGgsIGNoYXIgKip2YXJzLCB1aW50ICp2YXJzeik7CiAKIGV4dGVybiB2b2lkIHNpX2RldGFjaChzaV90ICpzaWgpOwogZXh0ZXJuIGJvb2wgc2lfcGNpX3dhcjE2MTY1KHNpX3QgKnNpaCk7CkBAIC0xMzgsNyArMTI4LDcgQEAKIGV4dGVybiB1aW50IHNpX2ZsYWcoc2lfdCAqc2loKTsKIGV4dGVybiB1aW50IHNpX2NvcmVpZHgoc2lfdCAqc2loKTsKIGV4dGVybiB1aW50IHNpX2NvcmVyZXYoc2lfdCAqc2loKTsKLWV4dGVybiB2b2lkICpzaV9vc2goc2lfdCAqc2loKTsKK3N0cnVjdCBvc2xfaW5mbyAqc2lfb3NoKHNpX3QgKnNpaCk7CiBleHRlcm4gdWludCBzaV9jb3JlcmVnKHNpX3QgKnNpaCwgdWludCBjb3JlaWR4LCB1aW50IHJlZ29mZiwgdWludCBtYXNrLAogCQl1aW50IHZhbCk7CiBleHRlcm4gdm9pZCBzaV93cml0ZV93cmFwcGVycmVnKHNpX3QgKnNpaCwgdTMyIG9mZnNldCwgdTMyIHZhbCk7CkBAIC0yMjcsNyArMjE3LDcgQEAKIC8qIG1pc2Mgc2kgaW5mbyBuZWVkZWQgYnkgc29tZSBvZiB0aGUgcm91dGluZXMgKi8KIHR5cGVkZWYgc3RydWN0IHNpX2luZm8gewogCXN0cnVjdCBzaV9wdWIgcHViOwkvKiBiYWNrIHBsYW5lIHB1YmxpYyBzdGF0ZSAobXVzdCBiZSBmaXJzdCBmaWVsZCkgKi8KLQl2b2lkICpvc2g7CQkvKiBvc2wgb3MgaGFuZGxlICovCisJc3RydWN0IG9zbF9pbmZvICpvc2g7CQkvKiBvc2wgb3MgaGFuZGxlICovCiAJdm9pZCAqc2RoOwkJLyogYmNtc2RoIGhhbmRsZSAqLwogCXVpbnQgZGV2X2NvcmVpZDsJLyogdGhlIGNvcmUgcHJvdmlkZXMgZHJpdmVyIGZ1bmN0aW9ucyAqLwogCXZvaWQgKmludHJfYXJnOwkJLyogaW50ZXJydXB0IGNhbGxiYWNrIGZ1bmN0aW9uIGFyZyAqLwpAQCAtMzA1LDkgKzI5NSw5IEBACiAjZGVmaW5lCUlMUF9ESVZfNU1IWgkJMAkvKiBJTFAgPSA1IE1IeiAqLwogI2RlZmluZQlJTFBfRElWXzFNSFoJCTQJLyogSUxQID0gMSBNSHogKi8KIAotI2RlZmluZSBQQ0koc2kpCQkoKEJVU1RZUEUoKHNpKS0+cHViLmJ1c3R5cGUpID09IFBDSV9CVVMpICYmCVwKKyNkZWZpbmUgUENJKHNpKQkJKCgoc2kpLT5wdWIuYnVzdHlwZSA9PSBQQ0lfQlVTKSAmJglcCiAJCQkgKChzaSktPnB1Yi5idXNjb3JldHlwZSA9PSBQQ0lfQ09SRV9JRCkpCi0jZGVmaW5lIFBDSUUoc2kpCSgoQlVTVFlQRSgoc2kpLT5wdWIuYnVzdHlwZSkgPT0gUENJX0JVUykgJiYJXAorI2RlZmluZSBQQ0lFKHNpKQkoKChzaSktPnB1Yi5idXN0eXBlID09IFBDSV9CVVMpICYmCVwKIAkJCSAoKHNpKS0+cHViLmJ1c2NvcmV0eXBlID09IFBDSUVfQ09SRV9JRCkpCiAjZGVmaW5lIFBDSV9GT1JDRUhUKHNpKQlcCiAJKFBDSUUoc2kpICYmIChzaS0+cHViLmNoaXAgPT0gQkNNNDcxNl9DSElQX0lEKSkKQEAgLTM0NCw5ICszMzQsOSBAQAogY2hhciAqc2lfZ2V0bnZyYW1mbHZhcihzaV90ICpzaWgsIGNvbnN0IGNoYXIgKm5hbWUpOwogCiAvKiBBTUJBIEludGVyY29ubmVjdCBleHBvcnRlZCBleHRlcm5zICovCi1leHRlcm4gc2lfdCAqYWlfYXR0YWNoKHVpbnQgcGNpZGV2LCBvc2xfdCAqb3NoLCB2b2lkICpyZWdzLCB1aW50IGJ1c3R5cGUsCi0JCSAgICAgICB2b2lkICpzZGgsIGNoYXIgKip2YXJzLCB1aW50ICp2YXJzeik7Ci1leHRlcm4gc2lfdCAqYWlfa2F0dGFjaChvc2xfdCAqb3NoKTsKK2V4dGVybiBzaV90ICphaV9hdHRhY2godWludCBwY2lkZXYsIHN0cnVjdCBvc2xfaW5mbyAqb3NoLCB2b2lkICpyZWdzLAorCQkgICAgICAgdWludCBidXN0eXBlLCB2b2lkICpzZGgsIGNoYXIgKip2YXJzLCB1aW50ICp2YXJzeik7CitleHRlcm4gc2lfdCAqYWlfa2F0dGFjaChzdHJ1Y3Qgb3NsX2luZm8gKm9zaCk7CiBleHRlcm4gdm9pZCBhaV9zY2FuKHNpX3QgKnNpaCwgdm9pZCAqcmVncywgdWludCBkZXZpZCk7CiAKIGV4dGVybiB1aW50IGFpX2ZsYWcoc2lfdCAqc2loKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvaW5jbHVkZS93bGlvY3RsLmggYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2luY2x1ZGUvd2xpb2N0bC5oCmluZGV4IDk2ODY2ZmIuLjliZTc5M2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvaW5jbHVkZS93bGlvY3RsLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9pbmNsdWRlL3dsaW9jdGwuaApAQCAtMzMsODIgKzMzLDkgQEAKICNkZWZpbmUgQldMX0RFRkFVTFRfUEFDS0lORwogI2luY2x1ZGUgPHBhY2tlZF9zZWN0aW9uX3N0YXJ0Lmg+CiAKLS8qIExlZ2FjeSBzdHJ1Y3R1cmUgdG8gaGVscCBrZWVwIGJhY2t3YXJkIGNvbXBhdGlibGUgd2wgdG9vbCBhbmQgdHJheSBhcHAgKi8KLQotI2RlZmluZQlMRUdBQ1lfV0xfQlNTX0lORk9fVkVSU0lPTgkxMDcJLyogb2xkZXIgdmVyc2lvbiBvZiB3bF9ic3NfaW5mbyBzdHJ1Y3QgKi8KLQotdHlwZWRlZiBzdHJ1Y3Qgd2xfYnNzX2luZm9fMTA3IHsKLQl1MzIgdmVyc2lvbjsJCS8qIHZlcnNpb24gZmllbGQgKi8KLQl1MzIgbGVuZ3RoOwkJLyogYnl0ZSBsZW5ndGggb2YgZGF0YSBpbiB0aGlzIHJlY29yZCwKLQkJCQkgKiBzdGFydGluZyBhdCB2ZXJzaW9uIGFuZCBpbmNsdWRpbmcgSUVzCi0JCQkJICovCi0Jc3RydWN0IGV0aGVyX2FkZHIgQlNTSUQ7Ci0JdTE2IGJlYWNvbl9wZXJpb2Q7CS8qIHVuaXRzIGFyZSBLdXNlYyAqLwotCXUxNiBjYXBhYmlsaXR5OwkvKiBDYXBhYmlsaXR5IGluZm9ybWF0aW9uICovCi0JdTggU1NJRF9sZW47Ci0JdTggU1NJRFszMl07Ci0Jc3RydWN0IHsKLQkJdWludCBjb3VudDsJLyogIyByYXRlcyBpbiB0aGlzIHNldCAqLwotCQl1OCByYXRlc1sxNl07CS8qIHJhdGVzIGluIDUwMGticHMgdW5pdHMgdy9oaSBiaXQgc2V0IGlmIGJhc2ljICovCi0JfSByYXRlc2V0OwkJLyogc3VwcG9ydGVkIHJhdGVzICovCi0JdTggY2hhbm5lbDsJCS8qIENoYW5uZWwgbm8uICovCi0JdTE2IGF0aW1fd2luZG93OwkvKiB1bml0cyBhcmUgS3VzZWMgKi8KLQl1OCBkdGltX3BlcmlvZDsJLyogRFRJTSBwZXJpb2QgKi8KLQlzMTYgUlNTSTsJCS8qIHJlY2VpdmUgc2lnbmFsIHN0cmVuZ3RoIChpbiBkQm0pICovCi0JczggcGh5X25vaXNlOwkJLyogbm9pc2UgKGluIGRCbSkgKi8KLQl1MzIgaWVfbGVuZ3RoOwkvKiBieXRlIGxlbmd0aCBvZiBJbmZvcm1hdGlvbiBFbGVtZW50cyAqLwotCS8qIHZhcmlhYmxlIGxlbmd0aCBJbmZvcm1hdGlvbiBFbGVtZW50cyAqLwotfSB3bF9ic3NfaW5mb18xMDdfdDsKLQotLyoKLSAqIFBlci1CU1MgaW5mb3JtYXRpb24gc3RydWN0dXJlLgotICovCi0KLSNkZWZpbmUJTEVHQUNZMl9XTF9CU1NfSU5GT19WRVJTSU9OCTEwOAkvKiBvbGQgdmVyc2lvbiBvZiB3bF9ic3NfaW5mbyBzdHJ1Y3QgKi8KLQotLyogQlNTIGluZm8gc3RydWN0dXJlCi0gKiBBcHBsaWNhdGlvbnMgTVVTVCBDSEVDSyBpZV9vZmZzZXQgZmllbGQgYW5kIGxlbmd0aCBmaWVsZCB0byBhY2Nlc3MgSUVzIGFuZAotICogbmV4dCBic3NfaW5mbyBzdHJ1Y3R1cmUgaW4gYSB2ZWN0b3IgKGluIHdsX3NjYW5fcmVzdWx0c190KQotICovCi10eXBlZGVmIHN0cnVjdCB3bF9ic3NfaW5mb18xMDggewotCXUzMiB2ZXJzaW9uOwkJLyogdmVyc2lvbiBmaWVsZCAqLwotCXUzMiBsZW5ndGg7CQkvKiBieXRlIGxlbmd0aCBvZiBkYXRhIGluIHRoaXMgcmVjb3JkLAotCQkJCSAqIHN0YXJ0aW5nIGF0IHZlcnNpb24gYW5kIGluY2x1ZGluZyBJRXMKLQkJCQkgKi8KLQlzdHJ1Y3QgZXRoZXJfYWRkciBCU1NJRDsKLQl1MTYgYmVhY29uX3BlcmlvZDsJLyogdW5pdHMgYXJlIEt1c2VjICovCi0JdTE2IGNhcGFiaWxpdHk7CS8qIENhcGFiaWxpdHkgaW5mb3JtYXRpb24gKi8KLQl1OCBTU0lEX2xlbjsKLQl1OCBTU0lEWzMyXTsKLQlzdHJ1Y3QgewotCQl1aW50IGNvdW50OwkvKiAjIHJhdGVzIGluIHRoaXMgc2V0ICovCi0JCXU4IHJhdGVzWzE2XTsJLyogcmF0ZXMgaW4gNTAwa2JwcyB1bml0cyB3L2hpIGJpdCBzZXQgaWYgYmFzaWMgKi8KLQl9IHJhdGVzZXQ7CQkvKiBzdXBwb3J0ZWQgcmF0ZXMgKi8KLQljaGFuc3BlY190IGNoYW5zcGVjOwkvKiBjaGFuc3BlYyBmb3IgYnNzICovCi0JdTE2IGF0aW1fd2luZG93OwkvKiB1bml0cyBhcmUgS3VzZWMgKi8KLQl1OCBkdGltX3BlcmlvZDsJLyogRFRJTSBwZXJpb2QgKi8KLQlzMTYgUlNTSTsJCS8qIHJlY2VpdmUgc2lnbmFsIHN0cmVuZ3RoIChpbiBkQm0pICovCi0JczggcGh5X25vaXNlOwkJLyogbm9pc2UgKGluIGRCbSkgKi8KLQotCXU4IG5fY2FwOwkJLyogQlNTIGlzIDgwMi4xMU4gQ2FwYWJsZSAqLwotCXUzMiBuYnNzX2NhcDsJLyogODAyLjExTiBCU1MgQ2FwYWJpbGl0aWVzIChiYXNlZCBvbiBIVF9DQVBfKikgKi8KLQl1OCBjdGxfY2g7CQkvKiA4MDIuMTFOIEJTUyBjb250cm9sIGNoYW5uZWwgbnVtYmVyICovCi0JdTMyIHJlc2VydmVkMzJbMV07CS8qIFJlc2VydmVkIGZvciBleHBhbnNpb24gb2YgQlNTIHByb3BlcnRpZXMgKi8KLQl1OCBmbGFnczsJCS8qIGZsYWdzICovCi0JdTggcmVzZXJ2ZWRbM107CS8qIFJlc2VydmVkIGZvciBleHBhbnNpb24gb2YgQlNTIHByb3BlcnRpZXMgKi8KLQl1OCBiYXNpY19tY3NbTUNTU0VUX0xFTl07CS8qIDgwMi4xMU4gQlNTIHJlcXVpcmVkIE1DUyBzZXQgKi8KLQotCXUxNiBpZV9vZmZzZXQ7CS8qIG9mZnNldCBhdCB3aGljaCBJRXMgc3RhcnQsIGZyb20gYmVnaW5uaW5nICovCi0JdTMyIGllX2xlbmd0aDsJLyogYnl0ZSBsZW5ndGggb2YgSW5mb3JtYXRpb24gRWxlbWVudHMgKi8KLQkvKiBBZGQgbmV3IGZpZWxkcyBoZXJlICovCi0JLyogdmFyaWFibGUgbGVuZ3RoIEluZm9ybWF0aW9uIEVsZW1lbnRzICovCi19IHdsX2Jzc19pbmZvXzEwOF90OwotCiAjaWZkZWYgQlJDTV9GVUxMTUFDCisKICNkZWZpbmUJV0xfQlNTX0lORk9fVkVSU0lPTgkxMDgJLyogY3VycmVudCB2ZXIgb2Ygd2xfYnNzX2luZm8gc3RydWN0ICovCi0jZWxzZQotI2RlZmluZQlXTF9CU1NfSU5GT19WRVJTSU9OCTEwOQkvKiBjdXJyZW50IHZlciBvZiB3bF9ic3NfaW5mbyBzdHJ1Y3QgKi8KLSNlbmRpZgogCiAvKiBCU1MgaW5mbyBzdHJ1Y3R1cmUKICAqIEFwcGxpY2F0aW9ucyBNVVNUIENIRUNLIGllX29mZnNldCBmaWVsZCBhbmQgbGVuZ3RoIGZpZWxkIHRvIGFjY2VzcyBJRXMgYW5kCkBAIC0xNDgsMTIgKzc1LDE0IEBACiAJLyogQWRkIG5ldyBmaWVsZHMgaGVyZSAqLwogCS8qIHZhcmlhYmxlIGxlbmd0aCBJbmZvcm1hdGlvbiBFbGVtZW50cyAqLwogfSB3bF9ic3NfaW5mb190OworI2VuZGlmIC8qIEJSQ01fRlVMTE1BQyAqLwogCiB0eXBlZGVmIHN0cnVjdCB3bGNfc3NpZCB7CiAJdTMyIFNTSURfbGVuOwogCXVuc2lnbmVkIGNoYXIgU1NJRFszMl07CiB9IHdsY19zc2lkX3Q7CiAKKyNpZmRlZiBCUkNNX0ZVTExNQUMKIHR5cGVkZWYgc3RydWN0IGNoYW5fc2NhbmRhdGEgewogCXU4IHR4cG93ZXI7CiAJdTggcGFkOwpAQCAtMzA4LDYgKzIzNyw3IEBACiAJc3RydWN0IGV0aGVyX2FkZHIgYnNzaWQ7CiAJc3RydWN0IGV0aGVyX2FkZHIgbWFjOwogfSB3bF9wcm9iZV9wYXJhbXNfdDsKKyNlbmRpZiAvKiBCUkNNX0ZVTExNQUMgKi8KIAogI2RlZmluZSBXTF9OVU1SQVRFUwkJMTYJLyogbWF4ICMgb2YgcmF0ZXMgaW4gYSByYXRlc2V0ICovCiB0eXBlZGVmIHN0cnVjdCB3bF9yYXRlc2V0IHsKQEAgLTMxNSw2ICsyNDUsNyBAQAogCXU4IHJhdGVzW1dMX05VTVJBVEVTXTsJLyogcmF0ZXMgaW4gNTAwa2JwcyB1bml0cyB3L2hpIGJpdCBzZXQgaWYgYmFzaWMgKi8KIH0gd2xfcmF0ZXNldF90OwogCisjaWZkZWYgQlJDTV9GVUxMTUFDCiB0eXBlZGVmIHN0cnVjdCB3bF9yYXRlc2V0X2FyZ3MgewogCXUzMiBjb3VudDsJCS8qICMgcmF0ZXMgaW4gdGhpcyBzZXQgKi8KIAl1OCByYXRlc1tXTF9OVU1SQVRFU107CS8qIHJhdGVzIGluIDUwMGticHMgdW5pdHMgdy9oaSBiaXQgc2V0IGlmIGJhc2ljICovCkBAIC0zNTIsNiArMjgzLDggQEAKIH0gd2xfam9pbl9wYXJhbXNfdDsKICNkZWZpbmUgV0xfSk9JTl9QQVJBTVNfRklYRURfU0laRSAJKHNpemVvZih3bF9qb2luX3BhcmFtc190KSAtIHNpemVvZihjaGFuc3BlY190KSkKIAorI2VuZGlmIC8qIEJSQ01fRlVMTE1BQyAqLworCiAvKiBkZWZpbmVzIHVzZWQgYnkgdGhlIG5yYXRlIGlvdmFyICovCiAjZGVmaW5lIE5SQVRFX01DU19JTlVTRQkweDAwMDAwMDgwCS8qIE1TQyBpbiB1c2UsaW5kaWNhdGVzIGIwLTYgaG9sZHMgYW4gbWNzICovCiAjZGVmaW5lIE5SQVRFX1JBVEVfTUFTSyAweDAwMDAwMDdmCS8qIHJhdGUvbWNzIHZhbHVlICovCkBAIC0zOTEsNiArMzI0LDcgQEAKIAogI2RlZmluZSBISUdIRVNUX1NJTkdMRV9TVFJFQU1fTUNTCTcJLyogTUNTIHZhbHVlcyBncmVhdGVyIHRoYW4gdGhpcyBlbmFibGUgbXVsdGlwbGUgc3RyZWFtcyAqLwogCisjaWZkZWYgQlJDTV9GVUxMTUFDCiAjZGVmaW5lIE1BWF9DQ0FfQ0hBTk5FTFMgMzgJLyogTWF4IG51bWJlciBvZiAyMCBNaHogd2lkZSBjaGFubmVscyAqLwogI2RlZmluZSBNQVhfQ0NBX1NFQ1MgICAgIDYwCS8qIENDQSBrZWVwcyB0aGlzIG1hbnkgc2Vjb25kcyBoaXN0b3J5ICovCiAKQEAgLTQyOCw4ICszNjIsMTEgQEAKIAljY2FfY29uZ2VzdF90IHNlY3NbMV07CS8qIERhdGEgKi8KIH0gY2NhX2Nvbmdlc3RfY2hhbm5lbF9yZXFfdDsKIAorI2VuZGlmIC8qIEJSQ01fRlVMTE1BQyAqLworCiAjZGVmaW5lIFdMQ19DTlRSWV9CVUZfU1oJNAkvKiBDb3VudHJ5IHN0cmluZyBpcyAzIGJ5dGVzICsgTlVMICovCiAKKyNpZmRlZiBCUkNNX0ZVTExNQUMKIHR5cGVkZWYgc3RydWN0IHdsX2NvdW50cnkgewogCWNoYXIgY291bnRyeV9hYmJyZXZbV0xDX0NOVFJZX0JVRl9TWl07CS8qIG51bC10ZXJtaW5hdGVkIGNvdW50cnkgY29kZSB1c2VkIGluCiAJCQkJCQkgKiB0aGUgQ291bnRyeSBJRQpAQCAtNTE2LDYgKzQ1Myw3IEBACiAJd2xfcm1fcmVwX2VsdF90IHJlcFsxXTsJLyogdmFyaWFibGUgbGVuZ3RoIGJsb2NrIG9mIHJlcG9ydHMgKi8KIH0gd2xfcm1fcmVwX3Q7CiAjZGVmaW5lIFdMX1JNX1JFUF9GSVhFRF9MRU4JOAorI2VuZGlmIC8qIEJSQ01fRlVMTE1BQyAqLwogCiAvKiBFbnVtZXJhdGUgY3J5cHRvIGFsZ29yaXRobXMgKi8KICNkZWZpbmUJQ1JZUFRPX0FMR09fT0ZGCQkJMApAQCAtNjIxLDI4ICs1NTksNiBAQAogCXU4IGFjdGl2ZWhpOwogfSB3bF9sZWRfaW5mb190OwogCi0vKiBmbGFncyAqLwotI2RlZmluZSBXTENfQVNTT0NfUkVRX0lTX1JFQVNTT0MgMHgwMQkvKiBhc3NvYyByZXEgd2FzIGFjdHVhbGx5IGEgcmVhc3NvYyAqLwotCi0vKiBzcm9tIHJlYWQvd3JpdGUgc3RydWN0IHBhc3NlZCB0aHJvdWdoIGlvY3RsICovCi10eXBlZGVmIHN0cnVjdCB7Ci0JdWludCBieXRlb2ZmOwkJLyogYnl0ZSBvZmZzZXQgKi8KLQl1aW50IG5ieXRlczsJCS8qIG51bWJlciBvZiBieXRlcyAqLwotCXUxNiBidWZbMV07Ci19IHNyb21fcndfdDsKLQotLyogc2ltaWxhciBjaXMgKHNyb20gb3Igb3RwKSBzdHJ1Y3QgW2lvdmFyOiBtYXkgbm90IGJlIGFsaWduZWRdICovCi10eXBlZGVmIHN0cnVjdCB7Ci0JdTMyIHNvdXJjZTsJCS8qIGNpcyBzb3VyY2UgKi8KLQl1MzIgYnl0ZW9mZjsJCS8qIGJ5dGUgb2Zmc2V0ICovCi0JdTMyIG5ieXRlczsJCS8qIG51bWJlciBvZiBieXRlcyAqLwotCS8qIGRhdGEgZm9sbG93cyBoZXJlICovCi19IGNpc19yd190OwotCi0jZGVmaW5lIFdMQ19DSVNfREVGQVVMVAkwCS8qIGJ1aWx0LWluIGRlZmF1bHQgKi8KLSNkZWZpbmUgV0xDX0NJU19TUk9NCTEJLyogc291cmNlIGlzIHNwcm9tICovCi0jZGVmaW5lIFdMQ19DSVNfT1RQCTIJLyogc291cmNlIGlzIG90cCAqLwotCiAvKiBSX1JFRyBhbmQgV19SRUcgc3RydWN0IHBhc3NlZCB0aHJvdWdoIGlvY3RsICovCiB0eXBlZGVmIHN0cnVjdCB7CiAJdTMyIGJ5dGVvZmY7CQkvKiBieXRlIG9mZnNldCBvZiB0aGUgZmllbGQgaW4gZDExcmVnc190ICovCkBAIC02NTEsMTAyICs1NjcsMTQgQEAKIAl1aW50IGJhbmQ7CQkvKiBiYW5kIChvcHRpb25hbCkgKi8KIH0gcndfcmVnX3Q7CiAKLS8qIFN0cnVjdHVyZSB1c2VkIGJ5IEdFVC9TRVRfQVRURU4gaW9jdGxzIC0gaXQgY29udHJvbHMgcG93ZXIgaW4gYi9nLWJhbmQgKi8KLS8qIFBDTCAtIFBvd2VyIENvbnRyb2wgTG9vcCAqLwotLyogY3VycmVudCBnYWluIHNldHRpbmcgaXMgcmVwbGFjZWQgYnkgdXNlciBpbnB1dCAqLwotI2RlZmluZSBXTF9BVFRFTl9BUFBfSU5QVVRfUENMX09GRgkwCS8qIHR1cm4gb2ZmIFBDTCwgYXBwbHkgc3VwcGxpZWQgaW5wdXQgKi8KLSNkZWZpbmUgV0xfQVRURU5fUENMX09OCQkJMQkvKiB0dXJuIG9uIFBDTCAqLwotLyogY3VycmVudCBnYWluIHNldHRpbmcgaXMgbWFpbnRhaW5lZCAqLwotI2RlZmluZSBXTF9BVFRFTl9QQ0xfT0ZGCQkyCS8qIHR1cm4gb2ZmIFBDTC4gKi8KIAotdHlwZWRlZiBzdHJ1Y3QgewotCXUxNiBhdXRvX2N0cmw7CS8qIFdMX0FUVEVOX1hYICovCi0JdTE2IGJiOwkJLyogQmFzZWJhbmQgYXR0ZW51YXRpb24gKi8KLQl1MTYgcmFkaW87CQkvKiBSYWRpbyBhdHRlbnVhdGlvbiAqLwotCXUxNiB0eGN0bDE7CQkvKiBSYWRpbyBUWF9DVEwxIHZhbHVlICovCi19IGF0dGVuX3Q7Ci0KLS8qIFBlci1BQyByZXRyeSBwYXJhbWV0ZXJzICovCi1zdHJ1Y3Qgd21lX3R4X3BhcmFtc19zIHsKLQl1OCBzaG9ydF9yZXRyeTsKLQl1OCBzaG9ydF9mYWxsYmFjazsKLQl1OCBsb25nX3JldHJ5OwotCXU4IGxvbmdfZmFsbGJhY2s7Ci0JdTE2IG1heF9yYXRlOwkvKiBJbiB1bml0cyBvZiA1MTIgS2JwcyAqLwotfTsKLQotdHlwZWRlZiBzdHJ1Y3Qgd21lX3R4X3BhcmFtc19zIHdtZV90eF9wYXJhbXNfdDsKLQotI2RlZmluZSBXTF9XTUVfVFhfUEFSQU1TX0lPX0JZVEVTIChzaXplb2Yod21lX3R4X3BhcmFtc190KSAqIEFDX0NPVU5UKQotCi0vKiBkZWZpbmVzIHVzZWQgYnkgcG93ZXJpZHggaW92YXIgLSBpdCBjb250cm9scyBwb3dlciBpbiBhLWJhbmQgKi8KLS8qIGN1cnJlbnQgZ2FpbiBzZXR0aW5nIGlzIG1haW50YWluZWQgKi8KLSNkZWZpbmUgV0xfUFdSSURYX1BDTF9PRkYJLTIJLyogdHVybiBvZmYgUENMLiAgKi8KLSNkZWZpbmUgV0xfUFdSSURYX1BDTF9PTgktMQkvKiB0dXJuIG9uIFBDTCAqLwotI2RlZmluZSBXTF9QV1JJRFhfTE9XRVJfTElNSVQJLTIJLyogbG93ZXIgbGltaXQgKi8KLSNkZWZpbmUgV0xfUFdSSURYX1VQUEVSX0xJTUlUCTYzCS8qIHVwcGVyIGxpbWl0ICovCi0vKiB2YWx1ZSA+PSAwIGNhdXNlcwotICoJLSBpbnB1dCB0byBiZSBzZXQgdG8gdGhhdCB2YWx1ZQotICoJLSBQQ0wgdG8gYmUgb2ZmCi0gKi8KLQotLyogVXNlZCB0byBnZXQgc3BlY2lmaWMgbGluay9hYyBwYXJhbWV0ZXJzICovCi10eXBlZGVmIHN0cnVjdCB7Ci0JaW50IGFjOwotCXU4IHZhbDsKLQlzdHJ1Y3QgZXRoZXJfYWRkciBlYTsKLX0gbGlua192YWxfdDsKLQotI2RlZmluZSBCQ01fTUFDX1NUQVRVU19JTkRJQ0FUSU9OCSgweDQwMDEwMjAwTCkKLQotdHlwZWRlZiBzdHJ1Y3QgewotCXUxNiB2ZXI7CQkvKiB2ZXJzaW9uIG9mIHRoaXMgc3RydWN0ICovCi0JdTE2IGxlbjsJCS8qIGxlbmd0aCBpbiBieXRlcyBvZiB0aGlzIHN0cnVjdHVyZSAqLwotCXUxNiBjYXA7CQkvKiBzdGEncyBhZHZlcnRpc2VkIGNhcGFiaWxpdGllcyAqLwotCXUzMiBmbGFnczsJCS8qIGZsYWdzIGRlZmluZWQgYmVsb3cgKi8KLQl1MzIgaWRsZTsJCS8qIHRpbWUgc2luY2UgZGF0YSBwa3QgcngnZCBmcm9tIHN0YSAqLwotCXN0cnVjdCBldGhlcl9hZGRyIGVhOwkvKiBTdGF0aW9uIGFkZHJlc3MgKi8KLQl3bF9yYXRlc2V0X3QgcmF0ZXNldDsJLyogcmF0ZXNldCBpbiB1c2UgKi8KLQl1MzIgaW47CQkvKiBzZWNvbmRzIGVsYXBzZWQgc2luY2UgYXNzb2NpYXRlZCAqLwotCXUzMiBsaXN0ZW5faW50ZXJ2YWxfaW5tczsJLyogTWluIExpc3RlbiBpbnRlcnZhbCBpbiBtcyBmb3IgdGhpcyBTVEEgKi8KLQl1MzIgdHhfcGt0czsJCS8qICMgb2YgcGFja2V0cyB0cmFuc21pdHRlZCAqLwotCXUzMiB0eF9mYWlsdXJlczsJLyogIyBvZiBwYWNrZXRzIGZhaWxlZCAqLwotCXUzMiByeF91Y2FzdF9wa3RzOwkvKiAjIG9mIHVuaWNhc3QgcGFja2V0cyByZWNlaXZlZCAqLwotCXUzMiByeF9tY2FzdF9wa3RzOwkvKiAjIG9mIG11bHRpY2FzdCBwYWNrZXRzIHJlY2VpdmVkICovCi0JdTMyIHR4X3JhdGU7CQkvKiBSYXRlIG9mIGxhc3Qgc3VjY2Vzc2Z1bCB0eCBmcmFtZSAqLwotCXUzMiByeF9yYXRlOwkJLyogUmF0ZSBvZiBsYXN0IHN1Y2Nlc3NmdWwgcnggZnJhbWUgKi8KLQl1MzIgcnhfZGVjcnlwdF9zdWNjZWVkczsJLyogIyBvZiBwYWNrZXQgZGVjcnlwdGVkIHN1Y2Nlc3NmdWxseSAqLwotCXUzMiByeF9kZWNyeXB0X2ZhaWx1cmVzOwkvKiAjIG9mIHBhY2tldCBkZWNyeXB0ZWQgdW5zdWNjZXNzZnVsbHkgKi8KLX0gc3RhX2luZm9fdDsKLQotI2RlZmluZSBXTF9PTERfU1RBSU5GT19TSVpFCW9mZnNldG9mKHN0YV9pbmZvX3QsIHR4X3BrdHMpCi0KLSNkZWZpbmUgV0xfU1RBX1ZFUgkJMwotCi0vKiBGbGFncyBmb3Igc3RhX2luZm9fdCBpbmRpY2F0aW5nIHByb3BlcnRpZXMgb2YgU1RBICovCi0jZGVmaW5lIFdMX1NUQV9CUkNNCQkweDEJLyogUnVubmluZyBhIEJyb2FkY29tIGRyaXZlciAqLwotI2RlZmluZSBXTF9TVEFfV01FCQkweDIJLyogV01NIGFzc29jaWF0aW9uICovCi0jZGVmaW5lIFdMX1NUQV9BQkNBUAkJMHg0Ci0jZGVmaW5lIFdMX1NUQV9BVVRIRQkJMHg4CS8qIEF1dGhlbnRpY2F0ZWQgKi8KLSNkZWZpbmUgV0xfU1RBX0FTU09DCQkweDEwCS8qIEFzc29jaWF0ZWQgKi8KLSNkZWZpbmUgV0xfU1RBX0FVVEhPCQkweDIwCS8qIEF1dGhvcml6ZWQgKi8KLSNkZWZpbmUgV0xfU1RBX1dEUwkJMHg0MAkvKiBXaXJlbGVzcyBEaXN0cmlidXRpb24gU3lzdGVtICovCi0jZGVmaW5lIFdMX1NUQV9XRFNfTElOS1VQCTB4ODAJLyogV0RTIHRyYWZmaWMvcHJvYmVzIGZsb3dpbmcgcHJvcGVybHkgKi8KLSNkZWZpbmUgV0xfU1RBX1BTCQkweDEwMAkvKiBTVEEgaXMgaW4gcG93ZXIgc2F2ZSBtb2RlIGZyb20gQVAncyB2aWV3cG9pbnQgKi8KLSNkZWZpbmUgV0xfU1RBX0FQU0RfQkUJCTB4MjAwCS8qIEFQU0QgZGVsdi90cmlnZ2VyIGZvciBBQ19CRSBpcyBkZWZhdWx0IGVuYWJsZWQgKi8KLSNkZWZpbmUgV0xfU1RBX0FQU0RfQksJCTB4NDAwCS8qIEFQU0QgZGVsdi90cmlnZ2VyIGZvciBBQ19CSyBpcyBkZWZhdWx0IGVuYWJsZWQgKi8KLSNkZWZpbmUgV0xfU1RBX0FQU0RfVkkJCTB4ODAwCS8qIEFQU0QgZGVsdi90cmlnZ2VyIGZvciBBQ19WSSBpcyBkZWZhdWx0IGVuYWJsZWQgKi8KLSNkZWZpbmUgV0xfU1RBX0FQU0RfVk8JCTB4MTAwMAkvKiBBUFNEIGRlbHYvdHJpZ2dlciBmb3IgQUNfVk8gaXMgZGVmYXVsdCBlbmFibGVkICovCi0jZGVmaW5lIFdMX1NUQV9OX0NBUAkJMHgyMDAwCS8qIFNUQSA4MDIuMTFuIGNhcGFibGUgKi8KLSNkZWZpbmUgV0xfU1RBX1NDQlNUQVRTCQkweDQwMDAJLyogUGVyIFNUQSBkZWJ1ZyBzdGF0cyAqLwotCi0jZGVmaW5lIFdMX1dEU19MSU5LVVAJCVdMX1NUQV9XRFNfTElOS1VQCS8qIGRlcHJlY2F0ZWQgKi8KLQorI2lmZGVmIEJSQ01fRlVMTE1BQwogLyogVXNlZCB0byBnZXQgc3BlY2lmaWMgU1RBIHBhcmFtZXRlcnMgKi8KIHR5cGVkZWYgc3RydWN0IHsKIAl1MzIgdmFsOwogCXN0cnVjdCBldGhlcl9hZGRyIGVhOwogfSBzY2JfdmFsX3Q7CisjZW5kaWYgLyogQlJDTV9GVUxMTUFDICovCiAKIC8qIGNoYW5uZWwgZW5jb2RpbmcgKi8KIHR5cGVkZWYgc3RydWN0IGNoYW5uZWxfaW5mbyB7CkBAIC03NzAsNiArNTk4LDcgQEAKIAl1aW50IHJ4X29jYXN0X2dvb2RfcGt0OwkvKiB1bmljYXN0IHBhY2tldHMgZGVzdGluZWQgZm9yIG90aGVycyAqLwogfSBnZXRfcGt0Y250X3Q7CiAKKyNpZmRlZiBCUkNNX0ZVTExNQUMKIC8qIExpbnV4IG5ldHdvcmsgZHJpdmVyIGlvY3RsIGVuY29kaW5nICovCiB0eXBlZGVmIHN0cnVjdCB3bF9pb2N0bCB7CiAJdWludCBjbWQ7CQkvKiBjb21tb24gaW9jdGwgZGVmaW5pdGlvbiAqLwpAQCAtNzc5LDExICs2MDgsOCBAQAogCXVpbnQgdXNlZDsJCS8qIGJ5dGVzIHJlYWQgb3Igd3JpdHRlbiAob3B0aW9uYWwpICovCiAJdWludCBuZWVkZWQ7CQkvKiBieXRlcyBuZWVkZWQgKG9wdGlvbmFsKSAqLwogfSB3bF9pb2N0bF90OworI2VuZGlmIC8qIEJSQ01fRlVMTE1BQyAqLwogCi0vKiByZWZlcmVuY2UgdG8gd2xfaW9jdGxfdCBzdHJ1Y3QgdXNlZCBieSB1c2VybW9kZSBkcml2ZXIgKi8KLSNkZWZpbmUgaW9jdGxfc3VidHlwZQlzZXQJLyogc3VidHlwZSBwYXJhbSAqLwotI2RlZmluZSBpb2N0bF9waWQJdXNlZAkvKiBwaWQgcGFyYW0gKi8KLSNkZWZpbmUgaW9jdGxfc3RhdHVzCW5lZWRlZAkvKiBzdGF0dXMgcGFyYW0gKi8KIAogLyoKICAqIFN0cnVjdHVyZSBmb3IgcGFzc2luZyBoYXJkd2FyZSBhbmQgc29mdHdhcmUKQEAgLTgxMCw0NSArNjM2LDExIEBACiAKICNkZWZpbmUgV0xfUkVWX0lORk9fTEVHQUNZX0xFTkdUSAk0OAogCi0jZGVmaW5lIFdMX0JSQU5EX01BWCAxMAotdHlwZWRlZiBzdHJ1Y3Qgd2xfaW5zdGFuY2VfaW5mbyB7Ci0JdWludCBpbnN0YW5jZTsKLQljaGFyIGJyYW5kW1dMX0JSQU5EX01BWF07Ci19IHdsX2luc3RhbmNlX2luZm9fdDsKLQotLyogc3RydWN0dXJlIHRvIGNoYW5nZSBzaXplIG9mIHR4IGZpZm8gKi8KLXR5cGVkZWYgc3RydWN0IHdsX3R4Zmlmb19zeiB7Ci0JdTE2IG1hZ2ljOwotCXUxNiBmaWZvOwotCXUxNiBzaXplOwotfSB3bF90eGZpZm9fc3pfdDsKLS8qIG1hZ2ljIHBhdHRlcm4gdXNlZCBmb3IgbWlzbWF0Y2ggZHJpdmVyIGFuZCB3bCAqLwotI2RlZmluZSBXTF9UWEZJRk9fU1pfTUFHSUMJMHhhNWE1Ci0KLS8qIFRyYW5zZmVyIGluZm8gYWJvdXQgYW4gSU9WYXIgZnJvbSB0aGUgZHJpdmVyICovCi0vKiBNYXggc3VwcG9ydGVkIElPViBuYW1lIHNpemUgaW4gYnl0ZXMsICsgMSBmb3IgbnVsIHRlcm1pbmF0aW9uICovCi0jZGVmaW5lIFdMQ19JT1ZfTkFNRV9MRU4gMzAKLXR5cGVkZWYgc3RydWN0IHdsY19pb3ZfdHJ4X3MgewotCXU4IG1vZHVsZTsKLQl1OCB0eXBlOwotCWNoYXIgbmFtZVtXTENfSU9WX05BTUVfTEVOXTsKLX0gd2xjX2lvdl90cnhfdDsKLQotLyogY2hlY2sgdGhpcyBtYWdpYyBudW1iZXIgKi8KLSNkZWZpbmUgV0xDX0lPQ1RMX01BR0lDCQkweDE0ZTQ2Yzc3Ci0KLSNkZWZpbmUgUFJPQ19FTlRSWV9OQU1FICJicmNtX2RlYnVnIgotLyogYnVtcCB0aGlzIG51bWJlciBpZiB5b3UgY2hhbmdlIHRoZSBpb2N0bCBpbnRlcmZhY2UgKi8KLSNkZWZpbmUgV0xDX0lPQ1RMX1ZFUlNJT04JMQotCiAjaWZkZWYgQlJDTV9GVUxMTUFDCi0jZGVmaW5lCVdMQ19JT0NUTF9NQVhMRU4JODE5MgotI2Vsc2UKLSNkZWZpbmUJV0xDX0lPQ1RMX01BWExFTgkJMzA3MgkvKiBtYXggbGVuZ3RoIGlvY3RsIGJ1ZmZlciByZXF1aXJlZCAqLwotI2VuZGlmCiAjZGVmaW5lCVdMQ19JT0NUTF9TTUxFTgkJCTI1NgkvKiAic21hbGwiIGxlbmd0aCBpb2N0bCBidWZmZXIgcmVxdWlyZWQgKi8KICNkZWZpbmUgV0xDX0lPQ1RMX01FRExFTgkJMTUzNgkvKiAibWVkIiBsZW5ndGggaW9jdGwgYnVmZmVyIHJlcXVpcmVkICovCi0jZGVmaW5lIFdMQ19TQU1QTEVDT0xMRUNUX01BWExFTgkxMDI0MAkvKiBNYXggU2FtcGxlIENvbGxlY3QgYnVmZmVyIGZvciB0d28gY29yZXMgKi8KKyNkZWZpbmUJV0xDX0lPQ1RMX01BWExFTgk4MTkyCisjZW5kaWYKIAogLyogY29tbW9uIGlvY3RsIGRlZmluaXRpb25zICovCiAjZGVmaW5lIFdMQ19HRVRfTUFHSUMJCQkJMApAQCAtMTM5OSwyMyArMTE5MSw2IEBACiAjZGVmaW5lIFdMX1RYX1BPV0VSX01DUzQwX0ZJUlNUCSAgICAgICAgMjgKICNkZWZpbmUgV0xfVFhfUE9XRVJfTUNTNDBfTlVNCSAgICAgICAgMTcKIAotdHlwZWRlZiBzdHJ1Y3QgewotCXUzMiBmbGFnczsKLQljaGFuc3BlY190IGNoYW5zcGVjOwkvKiB0eHB3ciByZXBvcnQgZm9yIHRoaXMgY2hhbm5lbCAqLwotCWNoYW5zcGVjX3QgbG9jYWxfY2hhbnNwZWM7CS8qIGNoYW5uZWwgb24gd2hpY2ggd2UgYXJlIGFzc29jaWF0ZWQgKi8KLQl1OCBsb2NhbF9tYXg7CS8qIGxvY2FsIG1heCBhY2NvcmRpbmcgdG8gdGhlIEFQICovCi0JdTggbG9jYWxfY29uc3RyYWludDsJLyogbG9jYWwgY29uc3RyYWludCBhY2NvcmRpbmcgdG8gdGhlIEFQICovCi0JczggYW50Z2FpblsyXTsJLyogQW50IGdhaW4gZm9yIGVhY2ggYmFuZCAtIGZyb20gU1JPTSAqLwotCXU4IHJmX2NvcmVzOwkJLyogY291bnQgb2YgUkYgQ29yZXMgYmVpbmcgcmVwb3J0ZWQgKi8KLQl1OCBlc3RfUG91dFs0XTsJLyogTGF0ZXN0IHR4IHBvd2VyIG91dCBlc3RpbWF0ZSBwZXIgUkYKLQkJCQkgKiBjaGFpbiB3aXRob3V0IGFkanVzdG1lbnQKLQkJCQkgKi8KLQl1OCBlc3RfUG91dF9jY2s7CS8qIExhdGVzdCBDQ0sgdHggcG93ZXIgb3V0IGVzdGltYXRlICovCi0JdTggdXNlcl9saW1pdFtXTF9UWF9QT1dFUl9SQVRFU19MRUdBQ1ldOwkvKiBVc2VyIGxpbWl0ICovCi0JdTggcmVnX2xpbWl0W1dMX1RYX1BPV0VSX1JBVEVTX0xFR0FDWV07CS8qIFJlZ3VsYXRvcnkgcG93ZXIgbGltaXQgKi8KLQl1OCBib2FyZF9saW1pdFtXTF9UWF9QT1dFUl9SQVRFU19MRUdBQ1ldOwkvKiBNYXggcG93ZXIgYm9hcmQgY2FuIHN1cHBvcnQgKFNST00pICovCi0JdTggdGFyZ2V0W1dMX1RYX1BPV0VSX1JBVEVTX0xFR0FDWV07CS8qIExhdGVzdCB0YXJnZXQgcG93ZXIgKi8KLX0gdHhfcG93ZXJfbGVnYWN5Ml90OwogCiAjZGVmaW5lIFdMX1RYX1BPV0VSX1JBVEVTCSAgICAgICAxMDEKICNkZWZpbmUgV0xfVFhfUE9XRVJfQ0NLX0ZJUlNUCSAgICAgICAwCkBAIC0xODQ4LDYzICsxNjIzLDYgQEAKIAl1OCByZXRyeTsJCS8qIHJldHJ5IHZhbHVlICovCiB9OwogCi0vKiBzdHJ1Y3R1cmUgZm9yIGFkZHRzIGFyZ3VtZW50cyAqLwotLyogRm9yIGlvY3RscyB0aGF0IHRha2UgYSBsaXN0IG9mIFRTUEVDICovCi1zdHJ1Y3QgdHNsaXN0IHsKLQlpbnQgY291bnQ7CQkvKiBudW1iZXIgb2YgdHNwZWNzICovCi0Jc3RydWN0IHRzaW5mb19hcmcgdHNpbmZvWzFdOwkvKiB2YXJpYWJsZSBsZW5ndGggYXJyYXkgb2YgdHNpbmZvICovCi19OwotCi0vKiBzdHJ1Y3R1cmUgZm9yIGFkZHRzL2RlbHRzIGFyZ3VtZW50cyAqLwotdHlwZWRlZiBzdHJ1Y3QgdHNwZWNfYXJnIHsKLQl1MTYgdmVyc2lvbjsJCS8qIHNlZSBkZWZpbml0aW9uIG9mIFRTUEVDX0FSR19WRVJTSU9OICovCi0JdTE2IGxlbmd0aDsJCS8qIGxlbmd0aCBvZiBlbnRpcmUgc3RydWN0dXJlICovCi0JdWludCBmbGFnOwkJLyogYml0IGZpZWxkICovCi0JLyogVFNQRUMgQXJndW1lbnRzICovCi0Jc3RydWN0IHRzaW5mb19hcmcgdHNpbmZvOwkvKiBUUyBJbmZvIGJpdCBmaWVsZCAqLwotCXUxNiBub21fbXNkdV9zaXplOwkvKiAoTm9taW5hbCBvciBmaXhlZCkgTVNEVSBTaXplIChieXRlcykgKi8KLQl1MTYgbWF4X21zZHVfc2l6ZTsJLyogTWF4aW11bSBNU0RVIFNpemUgKGJ5dGVzKSAqLwotCXVpbnQgbWluX3Nydl9pbnRlcnZhbDsJLyogTWluaW11bSBTZXJ2aWNlIEludGVydmFsICh1cykgKi8KLQl1aW50IG1heF9zcnZfaW50ZXJ2YWw7CS8qIE1heGltdW0gU2VydmljZSBJbnRlcnZhbCAodXMpICovCi0JdWludCBpbmFjdGl2aXR5X2ludGVydmFsOwkvKiBJbmFjdGl2aXR5IEludGVydmFsICh1cykgKi8KLQl1aW50IHN1c3BlbnNpb25faW50ZXJ2YWw7CS8qIFN1c3BlbnNpb24gSW50ZXJ2YWwgKHVzKSAqLwotCXVpbnQgc3J2X3N0YXJ0X3RpbWU7CS8qIFNlcnZpY2UgU3RhcnQgVGltZSAodXMpICovCi0JdWludCBtaW5fZGF0YV9yYXRlOwkvKiBNaW5pbXVtIERhdGEgUmF0ZSAoYnBzKSAqLwotCXVpbnQgbWVhbl9kYXRhX3JhdGU7CS8qIE1lYW4gRGF0YSBSYXRlIChicHMpICovCi0JdWludCBwZWFrX2RhdGFfcmF0ZTsJLyogUGVhayBEYXRhIFJhdGUgKGJwcykgKi8KLQl1aW50IG1heF9idXJzdF9zaXplOwkvKiBNYXhpbXVtIEJ1cnN0IFNpemUgKGJ5dGVzKSAqLwotCXVpbnQgZGVsYXlfYm91bmQ7CS8qIERlbGF5IEJvdW5kICh1cykgKi8KLQl1aW50IG1pbl9waHlfcmF0ZTsJLyogTWluaW11bSBQSFkgUmF0ZSAoYnBzKSAqLwotCXUxNiBzdXJwbHVzX2J3OwkvKiBTdXJwbHVzIEJhbmR3aWR0aCBBbGxvd2FuY2UgKHJhbmdlIDEuMCB0byA4LjApICovCi0JdTE2IG1lZGl1bV90aW1lOwkvKiBNZWRpdW0gVGltZSAoMzIgdXMvcyBwZXJpb2RzKSAqLwotCXU4IGRpYWxvZ190b2tlbjsJLyogZGlhbG9nIHRva2VuICovCi19IHRzcGVjX2FyZ190OwotCi0vKiB0c3BlYyBhcmcgZm9yIGRlc2lyZWQgc3RhdGlvbiAqLwotdHlwZWRlZiBzdHJ1Y3QgdHNwZWNfcGVyX3N0YV9hcmcgewotCXN0cnVjdCBldGhlcl9hZGRyIGVhOwotCXN0cnVjdCB0c3BlY19hcmcgdHM7Ci19IHRzcGVjX3Blcl9zdGFfYXJnX3Q7Ci0KLS8qIHN0cnVjdHVyZSBmb3IgbWF4IGJhbmR3aWR0aCBmb3IgZWFjaCBhY2Nlc3MgY2F0ZWdvcnkgKi8KLXR5cGVkZWYgc3RydWN0IHdtZV9tYXhfYmFuZHdpZHRoIHsKLQl1MzIgYWNbQUNfQ09VTlRdOwkvKiBtYXggYmFuZHdpZHRoIGZvciBlYWNoIGFjY2VzcyBjYXRlZ29yeSAqLwotfSB3bWVfbWF4X2JhbmR3aWR0aF90OwotCi0jZGVmaW5lIFdMX1dNRV9NQldfUEFSQU1TX0lPX0JZVEVTIChzaXplb2Yod21lX21heF9iYW5kd2lkdGhfdCkpCi0KLS8qIGN1cnJlbnQgdmVyc2lvbiBvZiB3bF90c3BlY19hcmdfdCBzdHJ1Y3QgKi8KLSNkZWZpbmUJVFNQRUNfQVJHX1ZFUlNJT04JCTIJLyogY3VycmVudCB2ZXJzaW9uIG9mIHdsX3RzcGVjX2FyZ190IHN0cnVjdCAqLwotI2RlZmluZSBUU1BFQ19BUkdfTEVOR1RICQk1NQkvKiBhcmd1bWVudCBsZW5ndGggZnJvbSB0c2luZm8gdG8gbWVkaXVtX3RpbWUgKi8KLSNkZWZpbmUgVFNQRUNfREVGQVVMVF9ESUFMT0dfVE9LRU4JNDIJLyogZGVmYXVsdCBkaWFsb2cgdG9rZW4gKi8KLSNkZWZpbmUgVFNQRUNfREVGQVVMVF9TQldfRkFDVE9SCTB4MzAwMAkvKiBkZWZhdWx0IHN1cnBsdXMgYncgKi8KLQotLyogZGVmaW5lIGZvciBmbGFnICovCi0jZGVmaW5lIFRTUEVDX1BFTkRJTkcJCTAJLyogVFNQRUMgcGVuZGluZyAqLwotI2RlZmluZSBUU1BFQ19BQ0NFUFRFRAkJMQkvKiBUU1BFQyBhY2NlcHRlZCAqLwotI2RlZmluZSBUU1BFQ19SRUpFQ1RFRAkJMgkvKiBUU1BFQyByZWplY3RlZCAqLwotI2RlZmluZSBUU1BFQ19VTktOT1dOCQkzCS8qIFRTUEVDIHVua25vd24gKi8KLSNkZWZpbmUgVFNQRUNfU1RBVFVTX01BU0sJNwkvKiBUU1BFQyBzdGF0dXMgbWFzayAqLwogCiAvKiBTb2Z0d2FyZSBmZWF0dXJlIGZsYWcgZGVmaW5lcyB1c2VkIGJ5IHdsZmVhdHVyZWZsYWcgKi8KICNkZWZpbmUgV0xfU1dGTF9OT0hXUkFESU8JMHgwMDA0CkBAIC0xOTEzLDE2ICsxNjMxLDYgQEAKIAogI2RlZmluZSBXTF9MSUZFVElNRV9NQVggMHhGRkZGCS8qIE1heCB2YWx1ZSBpbiBtcyAqLwogCi0vKgotICogRG9uZ2xlIHBhdHRlcm4gbWF0Y2hpbmcgZmlsdGVyLgotICovCi0KLS8qIFBhY2tldCBmaWx0ZXIgdHlwZXMuIEN1cnJlbnRseSwgb25seSBwYXR0ZXJuIG1hdGNoaW5nIGlzIHN1cHBvcnRlZC4gKi8KLXR5cGVkZWYgZW51bSB3bF9wa3RfZmlsdGVyX3R5cGUgewotCVdMX1BLVF9GSUxURVJfVFlQRV9QQVRURVJOX01BVENICS8qIFBhdHRlcm4gbWF0Y2hpbmcgZmlsdGVyICovCi19IHdsX3BrdF9maWx0ZXJfdHlwZV90OwotCi0jZGVmaW5lIFdMX1BLVF9GSUxURVJfVFlQRSB3bF9wa3RfZmlsdGVyX3R5cGVfdAogCiAvKiBQYXR0ZXJuIG1hdGNoaW5nIGZpbHRlci4gU3BlY2lmaWVzIGFuIG9mZnNldCB3aXRoaW4gcmVjZWl2ZWQgcGFja2V0cyB0bwogICogc3RhcnQgbWF0Y2hpbmcsIHRoZSBwYXR0ZXJuIHRvIG1hdGNoLCB0aGUgc2l6ZSBvZiB0aGUgcGF0dGVybiwgYW5kIGEgYml0bWFzawpAQCAtMTk1NywyMCArMTY2NSw2IEBACiAJdTMyIGVuYWJsZTsJCS8qIEVuYWJsZS9kaXNhYmxlIGJvb2wgKi8KIH0gd2xfcGt0X2ZpbHRlcl9lbmFibGVfdDsKIAotLyogSU9WQVIgInBrdF9maWx0ZXJfbGlzdCIgcGFyYW1ldGVyLiBVc2VkIHRvIHJldHJpZXZlIGEgbGlzdCBvZiBpbnN0YWxsZWQgZmlsdGVycy4gKi8KLXR5cGVkZWYgc3RydWN0IHdsX3BrdF9maWx0ZXJfbGlzdCB7Ci0JdTMyIG51bTsJCS8qIE51bWJlciBvZiBpbnN0YWxsZWQgcGFja2V0IGZpbHRlcnMgKi8KLQl3bF9wa3RfZmlsdGVyX3QgZmlsdGVyWzFdOwkvKiBWYXJpYWJsZSBhcnJheSBvZiBwYWNrZXQgZmlsdGVycy4gKi8KLX0gd2xfcGt0X2ZpbHRlcl9saXN0X3Q7Ci0KLSNkZWZpbmUgV0xfUEtUX0ZJTFRFUl9MSVNUX0ZJWEVEX0xFTgkgIG9mZnNldG9mKHdsX3BrdF9maWx0ZXJfbGlzdF90LCBmaWx0ZXIpCi0KLS8qIElPVkFSICJwa3RfZmlsdGVyX3N0YXRzIiBwYXJhbWV0ZXIuIFVzZWQgdG8gcmV0cmlldmUgZGVidWcgc3RhdGlzdGljcy4gKi8KLXR5cGVkZWYgc3RydWN0IHdsX3BrdF9maWx0ZXJfc3RhdHMgewotCXUzMiBudW1fcGt0c19tYXRjaGVkOwkvKiAjIGZpbHRlciBtYXRjaGVzIGZvciBzcGVjaWZpZWQgZmlsdGVyIGlkICovCi0JdTMyIG51bV9wa3RzX2ZvcndhcmRlZDsJLyogIyBwYWNrZXRzIGZ3ZGVkIGZyb20gZG9uZ2xlIHRvIGhvc3QgZm9yIGFsbCBmaWx0ZXJzICovCi0JdTMyIG51bV9wa3RzX2Rpc2NhcmRlZDsJLyogIyBwYWNrZXRzIGRpc2NhcmRlZCBieSBkb25nbGUgZm9yIGFsbCBmaWx0ZXJzICovCi19IHdsX3BrdF9maWx0ZXJfc3RhdHNfdDsKIAogI2RlZmluZQlXTENfUlNTSV9JTlZBTElECSAwCS8qIGludmFsaWQgUlNTSSB2YWx1ZSAqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3BoeS93bGNfcGh5X2Ntbi5jIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9waHkvd2xjX3BoeV9jbW4uYwppbmRleCA4Mjg3MjYxLi4zYmVkMzdjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3BoeS93bGNfcGh5X2Ntbi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvcGh5L3dsY19waHlfY21uLmMKQEAgLTIwLDEwICsyMCwxNSBAQAogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGJjbWRlZnMuaD4KICNpbmNsdWRlIDxvc2wuaD4KLSNpbmNsdWRlIDxsaW51eHZlci5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8YmNtZW5kaWFuLmg+CiAjaW5jbHVkZSA8YmNtbnZyYW0uaD4KICNpbmNsdWRlIDxzYmNoaXBjLmg+CisjaW5jbHVkZSA8YmNtZGV2cy5oPgorI2luY2x1ZGUgPHNiaG5kcGlvLmg+CisjaW5jbHVkZSA8c2JobmRkbWEuaD4KIAogI2luY2x1ZGUgPHdsY19waHlfaW50Lmg+CiAjaW5jbHVkZSA8d2xjX3BoeXJlZ19uLmg+CkBAIC0xNjMsNyArMTY4LDcgQEAKIAkJcmV0dXJuIE5VTEw7CiAKIAlmb3IgKHMgPSB2YXJzOyBzICYmICpzOykgewotCQlpZiAoKGJjbXAocywgbmFtZSwgbGVuKSA9PSAwKSAmJiAoc1tsZW5dID09ICc9JykpCisJCWlmICgobWVtY21wKHMsIG5hbWUsIGxlbikgPT0gMCkgJiYgKHNbbGVuXSA9PSAnPScpKQogCQkJcmV0dXJuICZzW2xlbiArIDFdOwogCiAJCXdoaWxlICgqcysrKQpAQCAtMjcyLDcgKzI3Nyw3IEBACiAKIHZvaWQgd3JpdGVfcmFkaW9fcmVnKHBoeV9pbmZvX3QgKnBpLCB1MTYgYWRkciwgdTE2IHZhbCkKIHsKLQlvc2xfdCAqb3NoOworCXN0cnVjdCBvc2xfaW5mbyAqb3NoOwogCiAJaWYgKE5PUkFESU9fRU5BQihwaS0+cHVicGkpKQogCQlyZXR1cm47CkBAIC0yOTYsNyArMzAxLDcgQEAKIAkJV19SRUcob3NoLCAmcGktPnJlZ3MtPnBoeTR3ZGF0YWxvLCB2YWwpOwogCX0KIAotCWlmIChCVVNUWVBFKHBpLT5zaC0+YnVzdHlwZSkgPT0gUENJX0JVUykgeworCWlmIChwaS0+c2gtPmJ1c3R5cGUgPT0gUENJX0JVUykgewogCQlpZiAoKytwaS0+cGh5X3dyZWcgPj0gcGktPnBoeV93cmVnX2xpbWl0KSB7CiAJCQkodm9pZClSX1JFRyhvc2gsICZwaS0+cmVncy0+bWFjY29udHJvbCk7CiAJCQlwaS0+cGh5X3dyZWcgPSAwOwpAQCAtNDA1LDcgKzQxMCw3IEBACiAKIHUxNiByZWFkX3BoeV9yZWcocGh5X2luZm9fdCAqcGksIHUxNiBhZGRyKQogewotCW9zbF90ICpvc2g7CisJc3RydWN0IG9zbF9pbmZvICpvc2g7CiAJZDExcmVnc190ICpyZWdzOwogCiAJb3NoID0gcGktPnNoLT5vc2g7CkBAIC00MjYsNyArNDMxLDcgQEAKIAogdm9pZCB3cml0ZV9waHlfcmVnKHBoeV9pbmZvX3QgKnBpLCB1MTYgYWRkciwgdTE2IHZhbCkKIHsKLQlvc2xfdCAqb3NoOworCXN0cnVjdCBvc2xfaW5mbyAqb3NoOwogCWQxMXJlZ3NfdCAqcmVnczsKIAogCW9zaCA9IHBpLT5zaC0+b3NoOwpAQCAtNDQxLDcgKzQ0Niw3IEBACiAjZWxzZQogCVdfUkVHKG9zaCwgKHZvbGF0aWxlIHUzMiAqKSgmcmVncy0+cGh5cmVnYWRkciksCiAJICAgICAgYWRkciB8ICh2YWwgPDwgMTYpKTsKLQlpZiAoQlVTVFlQRShwaS0+c2gtPmJ1c3R5cGUpID09IFBDSV9CVVMpIHsKKwlpZiAocGktPnNoLT5idXN0eXBlID09IFBDSV9CVVMpIHsKIAkJaWYgKCsrcGktPnBoeV93cmVnID49IHBpLT5waHlfd3JlZ19saW1pdCkgewogCQkJcGktPnBoeV93cmVnID0gMDsKIAkJCSh2b2lkKVJfUkVHKG9zaCwgJnJlZ3MtPnBoeXZlcnNpb24pOwpAQCAtNDUyLDcgKzQ1Nyw3IEBACiAKIHZvaWQgYW5kX3BoeV9yZWcocGh5X2luZm9fdCAqcGksIHUxNiBhZGRyLCB1MTYgdmFsKQogewotCW9zbF90ICpvc2g7CisJc3RydWN0IG9zbF9pbmZvICpvc2g7CiAJZDExcmVnc190ICpyZWdzOwogCiAJb3NoID0gcGktPnNoLT5vc2g7CkBAIC00NzMsNyArNDc4LDcgQEAKIAogdm9pZCBvcl9waHlfcmVnKHBoeV9pbmZvX3QgKnBpLCB1MTYgYWRkciwgdTE2IHZhbCkKIHsKLQlvc2xfdCAqb3NoOworCXN0cnVjdCBvc2xfaW5mbyAqb3NoOwogCWQxMXJlZ3NfdCAqcmVnczsKIAogCW9zaCA9IHBpLT5zaC0+b3NoOwpAQCAtNDk0LDcgKzQ5OSw3IEBACiAKIHZvaWQgbW9kX3BoeV9yZWcocGh5X2luZm9fdCAqcGksIHUxNiBhZGRyLCB1MTYgbWFzaywgdTE2IHZhbCkKIHsKLQlvc2xfdCAqb3NoOworCXN0cnVjdCBvc2xfaW5mbyAqb3NoOwogCWQxMXJlZ3NfdCAqcmVnczsKIAogCW9zaCA9IHBpLT5zaC0+b3NoOwpAQCAtNTkxLDcgKzU5Niw3IEBACiAKIHZvaWQgd2xjX3BoeV9zaGFyZWRfZGV0YWNoKHNoYXJlZF9waHlfdCAqcGh5X3NoKQogewotCW9zbF90ICpvc2g7CisJc3RydWN0IG9zbF9pbmZvICpvc2g7CiAKIAlpZiAocGh5X3NoKSB7CiAJCW9zaCA9IHBoeV9zaC0+b3NoOwpAQCAtNjA5LDcgKzYxNCw3IEBACiAJdTMyIHNmbGFncyA9IDA7CiAJdWludCBwaHl2ZXJzaW9uOwogCWludCBpOwotCW9zbF90ICpvc2g7CisJc3RydWN0IG9zbF9pbmZvICpvc2g7CiAKIAlvc2ggPSBzaC0+b3NoOwogCkBAIC0xMDgwLDggKzEwODUsOCBAQAogCXBpLT50YmxfZGF0YV9oaSA9IHRibERhdGFIaTsKIAlwaS0+dGJsX2RhdGFfbG8gPSB0YmxEYXRhTG87CiAKLQlpZiAoKENISVBJRChwaS0+c2gtPmNoaXApID09IEJDTTQzMjI0X0NISVBfSUQgfHwKLQkgICAgIENISVBJRChwaS0+c2gtPmNoaXApID09IEJDTTQzNDIxX0NISVBfSUQpICYmCisJaWYgKChwaS0+c2gtPmNoaXAgPT0gQkNNNDMyMjRfQ0hJUF9JRCB8fAorCSAgICAgcGktPnNoLT5jaGlwID09IEJDTTQzNDIxX0NISVBfSUQpICYmCiAJICAgIChwaS0+c2gtPmNoaXByZXYgPT0gMSkpIHsKIAkJcGktPnRibF9hZGRyID0gdGJsQWRkcjsKIAkJcGktPnRibF9zYXZlX2lkID0gdGJsX2lkOwpAQCAtMTA5Myw4ICsxMDk4LDggQEAKIHsKIAlBU1NFUlQoKHdpZHRoID09IDgpIHx8ICh3aWR0aCA9PSAxNikgfHwgKHdpZHRoID09IDMyKSk7CiAKLQlpZiAoKENISVBJRChwaS0+c2gtPmNoaXApID09IEJDTTQzMjI0X0NISVBfSUQgfHwKLQkgICAgIENISVBJRChwaS0+c2gtPmNoaXApID09IEJDTTQzNDIxX0NISVBfSUQpICYmCisJaWYgKChwaS0+c2gtPmNoaXAgPT0gQkNNNDMyMjRfQ0hJUF9JRCB8fAorCSAgICAgcGktPnNoLT5jaGlwID09IEJDTTQzNDIxX0NISVBfSUQpICYmCiAJICAgIChwaS0+c2gtPmNoaXByZXYgPT0gMSkgJiYKIAkgICAgKHBpLT50Ymxfc2F2ZV9pZCA9PSBOUEhZX1RCTF9JRF9BTlRTV0NUUkxMVVQpKSB7CiAJCXJlYWRfcGh5X3JlZyhwaSwgcGktPnRibF9kYXRhX2xvKTsKQEAgLTExMzIsOCArMTEzNyw4IEBACiAKIAlmb3IgKGlkeCA9IDA7IGlkeCA8IHB0YmxfaW5mby0+dGJsX2xlbjsgaWR4KyspIHsKIAotCQlpZiAoKENISVBJRChwaS0+c2gtPmNoaXApID09IEJDTTQzMjI0X0NISVBfSUQgfHwKLQkJICAgICBDSElQSUQocGktPnNoLT5jaGlwKSA9PSBCQ000MzQyMV9DSElQX0lEKSAmJgorCQlpZiAoKHBpLT5zaC0+Y2hpcCA9PSBCQ000MzIyNF9DSElQX0lEIHx8CisJCSAgICAgcGktPnNoLT5jaGlwID09IEJDTTQzNDIxX0NISVBfSUQpICYmCiAJCSAgICAocGktPnNoLT5jaGlwcmV2ID09IDEpICYmCiAJCSAgICAodGJsX2lkID09IE5QSFlfVEJMX0lEX0FOVFNXQ1RSTExVVCkpIHsKIAkJCXJlYWRfcGh5X3JlZyhwaSwgdGJsRGF0YUxvKTsKQEAgLTExNzUsOCArMTE4MCw4IEBACiAKIAlmb3IgKGlkeCA9IDA7IGlkeCA8IHB0YmxfaW5mby0+dGJsX2xlbjsgaWR4KyspIHsKIAotCQlpZiAoKENISVBJRChwaS0+c2gtPmNoaXApID09IEJDTTQzMjI0X0NISVBfSUQgfHwKLQkJICAgICBDSElQSUQocGktPnNoLT5jaGlwKSA9PSBCQ000MzQyMV9DSElQX0lEKSAmJgorCQlpZiAoKHBpLT5zaC0+Y2hpcCA9PSBCQ000MzIyNF9DSElQX0lEIHx8CisJCSAgICAgcGktPnNoLT5jaGlwID09IEJDTTQzNDIxX0NISVBfSUQpICYmCiAJCSAgICAocGktPnNoLT5jaGlwcmV2ID09IDEpKSB7CiAJCQkodm9pZClyZWFkX3BoeV9yZWcocGksIHRibERhdGFMbyk7CiAKQEAgLTE1MzQsNyArMTUzOSw3IEBACiAKIAlBU1NFUlQoKGJhbmQgPT0gV0xDX0JBTkRfMkcpIHx8IChiYW5kID09IFdMQ19CQU5EXzVHKSk7CiAKLQliemVybyhjaGFubmVscywgc2l6ZW9mKGNoYW52ZWNfdCkpOworCW1lbXNldChjaGFubmVscywgMCwgc2l6ZW9mKGNoYW52ZWNfdCkpOwogCiAJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoY2hhbl9pbmZvX2FsbCk7IGkrKykgewogCQljaGFubmVsID0gY2hhbl9pbmZvX2FsbFtpXS5jaGFuOwpAQCAtMTg5Niw3ICsxOTAxLDcgQEAKIAkJdHhfcHdyX21pbiA9IG1pbih0eF9wd3JfbWluLCB0eF9wd3JfdGFyZ2V0W3JhdGVdKTsKIAl9CiAKLQliemVybyhwaS0+dHhfcG93ZXJfb2Zmc2V0LCBzaXplb2YocGktPnR4X3Bvd2VyX29mZnNldCkpOworCW1lbXNldChwaS0+dHhfcG93ZXJfb2Zmc2V0LCAwLCBzaXplb2YocGktPnR4X3Bvd2VyX29mZnNldCkpOwogCXBpLT50eF9wb3dlcl9tYXggPSB0eF9wd3JfbWF4OwogCXBpLT50eF9wb3dlcl9taW4gPSB0eF9wd3JfbWluOwogCXBpLT50eF9wb3dlcl9tYXhfcmF0ZV9pbmQgPSB0eF9wd3JfbWF4X3JhdGVfaW5kOwpAQCAtMjUwNyw3ICsyNTEyLDcgQEAKIAlzOCBjbXBseF9wd3JfZGJtW1BIWV9DT1JFX01BWF07CiAJdTggaTsKIAotCWJ6ZXJvKCh1OCAqKSBjbXBseF9wd3JfZGJtLCBzaXplb2YoY21wbHhfcHdyX2RibSkpOworCW1lbXNldCgodTggKikgY21wbHhfcHdyX2RibSwgMCwgc2l6ZW9mKGNtcGx4X3B3cl9kYm0pKTsKIAlBU1NFUlQocGktPnB1YnBpLnBoeV9jb3JlbnVtIDw9IFBIWV9DT1JFX01BWCk7CiAJd2xjX3BoeV9jb21wdXRlX2RCKGNtcGx4X3B3ciwgY21wbHhfcHdyX2RibSwgcGktPnB1YnBpLnBoeV9jb3JlbnVtKTsKIApAQCAtMjYyMSw5ICsyNjI2LDkgQEAKIAkJCXU4IHdhaXRfY3JzID0gMDsKIAkJCXU4IGk7CiAKLQkJCWJ6ZXJvKCh1OCAqKSBlc3QsIHNpemVvZihlc3QpKTsKLQkJCWJ6ZXJvKCh1OCAqKSBjbXBseF9wd3IsIHNpemVvZihjbXBseF9wd3IpKTsKLQkJCWJ6ZXJvKCh1OCAqKSBub2lzZV9kYm1fYW50LCBzaXplb2Yobm9pc2VfZGJtX2FudCkpOworCQkJbWVtc2V0KCh1OCAqKSBlc3QsIDAsIHNpemVvZihlc3QpKTsKKwkJCW1lbXNldCgodTggKikgY21wbHhfcHdyLCAwLCBzaXplb2YoY21wbHhfcHdyKSk7CisJCQltZW1zZXQoKHU4ICopIG5vaXNlX2RibV9hbnQsIDAsIHNpemVvZihub2lzZV9kYm1fYW50KSk7CiAKIAkJCWxvZ19udW1fc2FtcHMgPSBQSFlfTk9JU0VfU0FNUExFX0xPR19OVU1fTlBIWTsKIAkJCW51bV9zYW1wcyA9IDEgPDwgbG9nX251bV9zYW1wczsKQEAgLTI3MDQsOCArMjcwOSw4IEBACiAJdTggaWR4LCBjb3JlOwogCiAJQVNTRVJUKHBpLT5wdWJwaS5waHlfY29yZW51bSA8PSBQSFlfQ09SRV9NQVgpOwotCWJ6ZXJvKCh1OCAqKSBjbXBseF9wd3IsIHNpemVvZihjbXBseF9wd3IpKTsKLQliemVybygodTggKikgbm9pc2VfZGJtX2FudCwgc2l6ZW9mKG5vaXNlX2RibV9hbnQpKTsKKwltZW1zZXQoKHU4ICopIGNtcGx4X3B3ciwgMCwgc2l6ZW9mKGNtcGx4X3B3cikpOworCW1lbXNldCgodTggKikgbm9pc2VfZGJtX2FudCwgMCwgc2l6ZW9mKG5vaXNlX2RibV9hbnQpKTsKIAogCWZvciAoaWR4ID0gMCwgY29yZSA9IDA7IGNvcmUgPCBwaS0+cHVicGkucGh5X2NvcmVudW07IGlkeCArPSAyLCBjb3JlKyspIHsKIAkJbG8gPSB3bGFwaV9ibWFjX3JlYWRfc2htKHBpLT5zaC0+cGh5c2hpbSwgTV9QV1JJTkRfTUFQKGlkeCkpOwpAQCAtMzMyNSw3ICszMzMwLDcgQEAKIAogdm9pZCB3bGNfbGNucGh5X2VwYV9zd2l0Y2gocGh5X2luZm9fdCAqcGksIGJvb2wgbW9kZSkKIHsKLQlpZiAoKENISVBJRChwaS0+c2gtPmNoaXApID09IEJDTTQzMTNfQ0hJUF9JRCkgJiYKKwlpZiAoKHBpLT5zaC0+Y2hpcCA9PSBCQ000MzEzX0NISVBfSUQpICYmCiAJICAgIChwaS0+c2gtPmJvYXJkZmxhZ3MgJiBCRkxfRkVNKSkgewogCQlpZiAobW9kZSkgewogCQkJdTE2IHR4YW50ID0gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvcGh5L3dsY19waHlfaGFsLmggYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3BoeS93bGNfcGh5X2hhbC5oCmluZGV4IDUyMjYwYjIuLjUxNGUxNWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvcGh5L3dsY19waHlfaGFsLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9waHkvd2xjX3BoeV9oYWwuaApAQCAtMTIyLDExICsxMjIsNyBAQAogCiBzdHJ1Y3QgcGh5X3B1YjsKIAotI2lmZGVmIFdMQ19ISUdIX09OTFkKLXR5cGVkZWYgc3RydWN0IHdsY19ycGNfcGh5IHdsY19waHlfdDsKLSNlbHNlCiB0eXBlZGVmIHN0cnVjdCBwaHlfcHViIHdsY19waHlfdDsKLSNlbmRpZgogCiB0eXBlZGVmIHN0cnVjdCBzaGFyZWRfcGh5X3BhcmFtcyB7CiAJdm9pZCAqb3NoOwpAQCAtMTUwLDcgKzE0Niw2IEBACiAJdTMyIGJvYXJkZmxhZ3MyOwogfSBzaGFyZWRfcGh5X3BhcmFtc190OwogCi0jaWZkZWYgV0xDX0xPVwogCiBleHRlcm4gc2hhcmVkX3BoeV90ICp3bGNfcGh5X3NoYXJlZF9hdHRhY2goc2hhcmVkX3BoeV9wYXJhbXNfdCAqc2hwKTsKIGV4dGVybiB2b2lkIHdsY19waHlfc2hhcmVkX2RldGFjaChzaGFyZWRfcGh5X3QgKnBoeV9zaCk7CkBAIC0xODksNyArMTg0LDYgQEAKIGV4dGVybiB2b2lkIHdsY19waHlfc3dpdGNoX3JhZGlvKHdsY19waHlfdCAqcHBpLCBib29sIG9uKTsKIGV4dGVybiB2b2lkIHdsY19waHlfYW5hY29yZSh3bGNfcGh5X3QgKnBwaSwgYm9vbCBvbik7CiAKLSNlbmRpZgkJCQkvKiBXTENfTE9XICovCiAKIGV4dGVybiB2b2lkIHdsY19waHlfQlNTaW5pdCh3bGNfcGh5X3QgKnBwaSwgYm9vbCBib25seWFwLCBpbnQgcnNzaSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvcGh5L3dsY19waHlfaW50LmggYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3BoeS93bGNfcGh5X2ludC5oCmluZGV4IDk1MTNiODcuLjcyZWVlOTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvcGh5L3dsY19waHlfaW50LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9waHkvd2xjX3BoeV9pbnQuaApAQCAtNTI3LDcgKzUyNyw3IEBACiBzdHJ1Y3Qgc2hhcmVkX3BoeSB7CiAJc3RydWN0IHBoeV9pbmZvICpwaHlfaGVhZDsKIAl1aW50IHVuaXQ7Ci0Jb3NsX3QgKm9zaDsKKwlzdHJ1Y3Qgb3NsX2luZm8gKm9zaDsKIAlzaV90ICpzaWg7CiAJdm9pZCAqcGh5c2hpbTsKIAl1aW50IGNvcmVyZXY7CkBAIC0xMTU4LDcgKzExNTgsNyBAQAogCSAocGktPmlwYTVnX29uICYmIENIU1BFQ19JUzVHKHBpLT5yYWRpb19jaGFuc3BlYykpKQogCiAjZGVmaW5lIFdMQ19QSFlfV0FSX1BSNTE1NzEocGkpIFwKLQlpZiAoKEJVU1RZUEUoKHBpKS0+c2gtPmJ1c3R5cGUpID09IFBDSV9CVVMpICYmIE5SRVZfTFQoKHBpKS0+cHVicGkucGh5X3JldiwgMykpIFwKKwlpZiAoKChwaSktPnNoLT5idXN0eXBlID09IFBDSV9CVVMpICYmIE5SRVZfTFQoKHBpKS0+cHVicGkucGh5X3JldiwgMykpIFwKIAkJKHZvaWQpUl9SRUcoKHBpKS0+c2gtPm9zaCwgJihwaSktPnJlZ3MtPm1hY2NvbnRyb2wpCiAKIGV4dGVybiB2b2lkIHdsY19waHlfY2FsX3BlcmljYWxfbnBoeV9ydW4ocGh5X2luZm9fdCAqcGksIHU4IGNhbHR5cGUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9waHkvd2xjX3BoeV9sY24uYyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvcGh5L3dsY19waHlfbGNuLmMKaW5kZXggM2QzMTEyZS4uM2FjMmI0OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9waHkvd2xjX3BoeV9sY24uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3BoeS93bGNfcGh5X2xjbi5jCkBAIC0xNywxMyArMTcsMTggQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPHdsY19jZmcuaD4KICNpbmNsdWRlIDxxbWF0aC5oPgogI2luY2x1ZGUgPG9zbC5oPgotI2luY2x1ZGUgPGxpbnV4dmVyLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8c2l1dGlscy5oPgogI2luY2x1ZGUgPGhuZHBtdS5oPgogCisjaW5jbHVkZSA8YmNtZGV2cy5oPgorI2luY2x1ZGUgPHNiaG5kcGlvLmg+CisjaW5jbHVkZSA8c2JobmRkbWEuaD4KKwogI2luY2x1ZGUgPHdsY19waHlfcmFkaW8uaD4KICNpbmNsdWRlIDx3bGNfcGh5X2ludC5oPgogI2luY2x1ZGUgPHdsY19waHlfbGNuLmg+CkBAIC0xMzI3LDcgKzEzMzIsNyBAQAogCXUzMiBkYXRhX2J1Zls2NF07CiAJcGh5dGJsX2luZm9fdCB0YWI7CiAKLQliemVybyhkYXRhX2J1Ziwgc2l6ZW9mKGRhdGFfYnVmKSk7CisJbWVtc2V0KGRhdGFfYnVmLCAwLCBzaXplb2YoZGF0YV9idWYpKTsKIAogCXRhYi50YmxfaWQgPSBMQ05QSFlfVEJMX0lEX1RYUFdSQ1RMOwogCXRhYi50Ymxfd2lkdGggPSAzMjsKQEAgLTE5NTEsNyArMTk1Niw3IEBACiAJYmFuZF9pZHggPSAoQ0hTUEVDX0lTNUcocGktPnJhZGlvX2NoYW5zcGVjKSA/IDEgOiAwKTsKIAogCWNhbF9nYWlucyA9ICp0YXJnZXRfZ2FpbnM7Ci0JYnplcm8obmNvcnJfb3ZlcnJpZGUsIHNpemVvZihuY29ycl9vdmVycmlkZSkpOworCW1lbXNldChuY29ycl9vdmVycmlkZSwgMCwgc2l6ZW9mKG5jb3JyX292ZXJyaWRlKSk7CiAJZm9yIChqID0gMDsgaiA8IGlxY2FsX2dhaW5wYXJhbXNfbnVtZ2FpbnNfbGNucGh5W2JhbmRfaWR4XTsgaisrKSB7CiAJCWlmIChoYXNoID09IHRibF9pcWNhbF9nYWlucGFyYW1zX2xjbnBoeVtiYW5kX2lkeF1bal1bMF0pIHsKIAkJCWNhbF9nYWlucy5nbV9nYWluID0KQEAgLTI1MjksNyArMjUzNCw3IEBACiAJdGFiLnRibF93aWR0aCA9IDMyOwogCXRhYi50Ymxfb2Zmc2V0ID0gMDsKIAotCWJ6ZXJvKHRlbXBfb2Zmc2V0LCBzaXplb2YodGVtcF9vZmZzZXQpKTsKKwltZW1zZXQodGVtcF9vZmZzZXQsIDAsIHNpemVvZih0ZW1wX29mZnNldCkpOwogCWZvciAoaiA9IDE7IGogPCAxMjg7IGogKz0gMikKIAkJdGVtcF9vZmZzZXRbal0gPSAweDgwMDAwOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3BoeS93bGNfcGh5X24uYyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvcGh5L3dsY19waHlfbi5jCmluZGV4IDk1MDAwOGYuLmM2Y2NlOGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvcGh5L3dsY19waHlfbi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvcGh5L3dsY19waHlfbi5jCkBAIC0xOCwxMyArMTgsMTggQEAKICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxiY21kZWZzLmg+CiAjaW5jbHVkZSA8d2xjX2NmZy5oPgotI2luY2x1ZGUgPGxpbnV4dmVyLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxvc2wuaD4KICNpbmNsdWRlIDxzaXV0aWxzLmg+CiAjaW5jbHVkZSA8c2JjaGlwYy5oPgogI2luY2x1ZGUgPGhuZHBtdS5oPgogI2luY2x1ZGUgPGJjbWVuZGlhbi5oPgogCisjaW5jbHVkZSA8YmNtZGV2cy5oPgorI2luY2x1ZGUgPHNiaG5kcGlvLmg+CisjaW5jbHVkZSA8c2JobmRkbWEuaD4KKwogI2luY2x1ZGUgPHdsY19waHlfcmFkaW8uaD4KICNpbmNsdWRlIDx3bGNfcGh5X2ludC5oPgogI2luY2x1ZGUgPHdsY19waHlyZWdfbi5oPgpAQCAtMTQ1NTQsNyArMTQ1NTksNyBAQAogCQl9CiAJfQogCi0JaWYgKCghUEhZX0lQQShwaSkpICYmIChDSElQSUQocGktPnNoLT5jaGlwKSA9PSBCQ001MzU3X0NISVBfSUQpKSB7CisJaWYgKCghUEhZX0lQQShwaSkpICYmIChwaS0+c2gtPmNoaXAgPT0gQkNNNTM1N19DSElQX0lEKSkgewogCQlzaV9wbXVfY2hpcGNvbnRyb2wocGktPnNoLT5zaWgsIDEsIENDVFJMNTM1N19FWFRQQSwKIAkJCQkgICBDQ1RSTDUzNTdfRVhUUEEpOwogCX0KQEAgLTE3NTk5LDcgKzE3NjA0LDcgQEAKIAogCW1vZF9yYWRpb19yZWcocGksIFJBRElPXzIwNTdfWFRBTFBVT1ZSX1BJTkNUUkwsIDB4MSwgMHgxKTsKIAotCWlmIChDSElQSUQocGktPnNoLT5jaGlwKSA9PSAhQkNNNjM2Ml9DSElQX0lEKSB7CisJaWYgKHBpLT5zaC0+Y2hpcCA9PSAhQkNNNjM2Ml9DSElQX0lEKSB7CiAKIAkJbW9kX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA1N19YVEFMUFVPVlJfUElOQ1RSTCwgMHgyLCAweDIpOwogCX0KQEAgLTE4MDA3LDggKzE4MDEyLDggQEAKIAkJCXdyaXRlX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA1Nl9TWU5fUExMX0xPT1BGSUxURVIyIHwKIAkJCQkJUkFESU9fMjA1Nl9TWU4sIDB4MWYpOwogCi0JCQlpZiAoKENISVBJRChwaS0+c2gtPmNoaXApID09IEJDTTQ3MTZfQ0hJUF9JRCkgfHwKLQkJCSAgICAoQ0hJUElEKHBpLT5zaC0+Y2hpcCkgPT0gQkNNNDcxNjJfQ0hJUF9JRCkpIHsKKwkJCWlmICgocGktPnNoLT5jaGlwID09IEJDTTQ3MTZfQ0hJUF9JRCkgfHwKKwkJCSAgICAocGktPnNoLT5jaGlwID09IEJDTTQ3MTYyX0NISVBfSUQpKSB7CiAKIAkJCQl3cml0ZV9yYWRpb19yZWcocGksCiAJCQkJCQlSQURJT18yMDU2X1NZTl9QTExfTE9PUEZJTFRFUjQgfApAQCAtMTgwNzAsOCArMTgwNzUsOCBAQAogCQkJCVdSSVRFX1JBRElPX1JFRzIocGksIFJBRElPXzIwNTYsIFRYLCBjb3JlLAogCQkJCQkJIFBBREdfSURBQywgMHhjYyk7CiAKLQkJCQlpZiAoKENISVBJRChwaS0+c2gtPmNoaXApID09IEJDTTQ3MTZfQ0hJUF9JRCkgfHwKLQkJCQkgICAgKENISVBJRChwaS0+c2gtPmNoaXApID09CisJCQkJaWYgKChwaS0+c2gtPmNoaXAgPT0gQkNNNDcxNl9DSElQX0lEKSB8fAorCQkJCSAgICAocGktPnNoLT5jaGlwID09CiAJCQkJICAgICBCQ000NzE2Ml9DSElQX0lEKSkgewogCQkJCQliaWFzID0gMHg0MDsKIAkJCQkJY2FzY2JpYXMgPSAweDQ1OwpAQCAtMTgwODMsMTEgKzE4MDg4LDExIEBACiAJCQkJCWJpYXMgPSAweDI1OwogCQkJCQljYXNjYmlhcyA9IDB4MjA7CiAKLQkJCQkJaWYgKChDSElQSUQocGktPnNoLT5jaGlwKSA9PQorCQkJCQlpZiAoKHBpLT5zaC0+Y2hpcCA9PQogCQkJCQkgICAgIEJDTTQzMjI0X0NISVBfSUQpCi0JCQkJCSAgICB8fCAoQ0hJUElEKHBpLT5zaC0+Y2hpcCkgPT0KKwkJCQkJICAgIHx8IChwaS0+c2gtPmNoaXAgPT0KIAkJCQkJCUJDTTQzMjI1X0NISVBfSUQpCi0JCQkJCSAgICB8fCAoQ0hJUElEKHBpLT5zaC0+Y2hpcCkgPT0KKwkJCQkJICAgIHx8IChwaS0+c2gtPmNoaXAgPT0KIAkJCQkJCUJDTTQzNDIxX0NISVBfSUQpKSB7CiAJCQkJCQlpZiAocGktPnNoLT5jaGlwcGtnID09CiAJCQkJCQkgICAgQkNNNDMyMjRfRkFCX1NNSUMpIHsKQEAgLTE4MTk4LDkgKzE4MjAzLDkgQEAKIAogCQkJY2FzY2JpYXMgPSAweDMwOwogCi0JCQlpZiAoKENISVBJRChwaS0+c2gtPmNoaXApID09IEJDTTQzMjI0X0NISVBfSUQpIHx8Ci0JCQkgICAgKENISVBJRChwaS0+c2gtPmNoaXApID09IEJDTTQzMjI1X0NISVBfSUQpIHx8Ci0JCQkgICAgKENISVBJRChwaS0+c2gtPmNoaXApID09IEJDTTQzNDIxX0NISVBfSUQpKSB7CisJCQlpZiAoKHBpLT5zaC0+Y2hpcCA9PSBCQ000MzIyNF9DSElQX0lEKSB8fAorCQkJICAgIChwaS0+c2gtPmNoaXAgPT0gQkNNNDMyMjVfQ0hJUF9JRCkgfHwKKwkJCSAgICAocGktPnNoLT5jaGlwID09IEJDTTQzNDIxX0NISVBfSUQpKSB7CiAJCQkJaWYgKHBpLT5zaC0+Y2hpcHBrZyA9PSBCQ000MzIyNF9GQUJfU01JQykgewogCQkJCQljYXNjYmlhcyA9IDB4MzU7CiAJCQkJfQpAQCAtMTg5MjcsNyArMTg5MzIsNyBAQAogCQkJY2FzZSAzODoKIAkJCWNhc2UgMTAyOgogCQkJY2FzZSAxMTg6Ci0JCQkJaWYgKChDSElQSUQocGktPnNoLT5jaGlwKSA9PSBCQ000NzE2X0NISVBfSUQpICYmCisJCQkJaWYgKChwaS0+c2gtPmNoaXAgPT0gQkNNNDcxNl9DSElQX0lEKSAmJgogCQkJCSAgICAocGktPnNoLT5jaGlwcGtnID09IEJDTTQ3MTdfUEtHX0lEKSkgewogCQkJCQlucGh5X2Fkal90b25lX2lkX2J1ZlswXSA9IDMyOwogCQkJCQlucGh5X2Fkal9ub2lzZV92YXJfYnVmWzBdID0gMHgyMWY7CkBAIC0xOTA2Miw3ICsxOTA2Nyw3IEBACiAJCQkJaWYgKHBpLT5ucGh5X2FiYW5kX3NwdXJ3YXJfZW4gJiYKIAkJCQkgICAgKCh2YWwgPT0gMzgpIHx8ICh2YWwgPT0gMTAyKQogCQkJCSAgICAgfHwgKHZhbCA9PSAxMTgpKSkgewotCQkJCQlpZiAoKENISVBJRChwaS0+c2gtPmNoaXApID09CisJCQkJCWlmICgocGktPnNoLT5jaGlwID09CiAJCQkJCSAgICAgQkNNNDcxNl9DSElQX0lEKQogCQkJCQkgICAgJiYgKHBpLT5zaC0+Y2hpcHBrZyA9PQogCQkJCQkJQkNNNDcxN19QS0dfSUQpKSB7CkBAIC0xOTA3Nyw4ICsxOTA4Miw4IEBACiAJCWlmIChwaS0+cGh5X3NwdXJhdm9pZCA9PSBTUFVSQVZPSURfRk9SQ0VPTikKIAkJCXNwdXJhdm9pZCA9IDE7CiAKLQkJaWYgKChDSElQSUQocGktPnNoLT5jaGlwKSA9PSBCQ000NzE2X0NISVBfSUQpIHx8Ci0JCSAgICAoQ0hJUElEKHBpLT5zaC0+Y2hpcCkgPT0gQkNNNDcxNjJfQ0hJUF9JRCkpIHsKKwkJaWYgKChwaS0+c2gtPmNoaXAgPT0gQkNNNDcxNl9DSElQX0lEKSB8fAorCQkgICAgKHBpLT5zaC0+Y2hpcCA9PSBCQ000NzE2Ml9DSElQX0lEKSkgewogCQkJc2lfcG11X3NwdXJhdm9pZChwaS0+c2gtPnNpaCwgcGktPnNoLT5vc2gsIHNwdXJhdm9pZCk7CiAJCX0gZWxzZSB7CiAJCQl3bGFwaV9ibWFjX2NvcmVfcGh5cGxsX2N0bChwaS0+c2gtPnBoeXNoaW0sIGZhbHNlKTsKQEAgLTE5MDg2LDkgKzE5MDkxLDkgQEAKIAkJCXdsYXBpX2JtYWNfY29yZV9waHlwbGxfY3RsKHBpLT5zaC0+cGh5c2hpbSwgdHJ1ZSk7CiAJCX0KIAotCQlpZiAoKENISVBJRChwaS0+c2gtPmNoaXApID09IEJDTTQzMjI0X0NISVBfSUQpIHx8Ci0JCSAgICAoQ0hJUElEKHBpLT5zaC0+Y2hpcCkgPT0gQkNNNDMyMjVfQ0hJUF9JRCkgfHwKLQkJICAgIChDSElQSUQocGktPnNoLT5jaGlwKSA9PSBCQ000MzQyMV9DSElQX0lEKSkgeworCQlpZiAoKHBpLT5zaC0+Y2hpcCA9PSBCQ000MzIyNF9DSElQX0lEKSB8fAorCQkgICAgKHBpLT5zaC0+Y2hpcCA9PSBCQ000MzIyNV9DSElQX0lEKSB8fAorCQkgICAgKHBpLT5zaC0+Y2hpcCA9PSBCQ000MzQyMV9DSElQX0lEKSkgewogCiAJCQlpZiAoc3B1cmF2b2lkID09IDEpIHsKIApAQCAtMTkxMDUsOCArMTkxMTAsOCBAQAogCQkJfQogCQl9CiAKLQkJaWYgKCEoKENISVBJRChwaS0+c2gtPmNoaXApID09IEJDTTQ3MTZfQ0hJUF9JRCkgfHwKLQkJICAgICAgKENISVBJRChwaS0+c2gtPmNoaXApID09IEJDTTQ3MTYyX0NISVBfSUQpKSkgeworCQlpZiAoISgocGktPnNoLT5jaGlwID09IEJDTTQ3MTZfQ0hJUF9JRCkgfHwKKwkJICAgICAgKHBpLT5zaC0+Y2hpcCA9PSBCQ000NzE2Ml9DSElQX0lEKSkpIHsKIAkJCXdsYXBpX2JtYWNfY29yZV9waHlwbGxfcmVzZXQocGktPnNoLT5waHlzaGltKTsKIAkJfQogCkBAIC0yMTA2MiwxMSArMjEwNjcsMTEgQEAKIAkJd2xjX3BoeV90YWJsZV93cml0ZV9ucGh5KHBpLCBOUEhZX1RCTF9JRF9BRkVDVFJMLCAxLCAweDAzLCAxNiwKIAkJCQkJICZhdXhBRENfcnNzaV9jdHJsSF9zYXZlKTsKIAotCQlpZiAoQ0hJUElEKHBpLT5zaC0+Y2hpcCkgPT0gQkNNNTM1N19DSElQX0lEKSB7CisJCWlmIChwaS0+c2gtPmNoaXAgPT0gQkNNNTM1N19DSElQX0lEKSB7CiAJCQlyYWRpb190ZW1wWzBdID0gKDE5MyAqIChyYWRpb190ZW1wWzFdICsgcmFkaW9fdGVtcDJbMV0pCiAJCQkJCSArIDg4ICogKGF1eEFEQ19WbCkgLSAyNzExMSArCiAJCQkJCSAxMjgpIC8gMjU2OwotCQl9IGVsc2UgaWYgKENISVBJRChwaS0+c2gtPmNoaXApID09IEJDTTQzMjM2X0NISVBfSUQpIHsKKwkJfSBlbHNlIGlmIChwaS0+c2gtPmNoaXAgPT0gQkNNNDMyMzZfQ0hJUF9JRCkgewogCQkJcmFkaW9fdGVtcFswXSA9ICgxOTggKiAocmFkaW9fdGVtcFsxXSArIHJhZGlvX3RlbXAyWzFdKQogCQkJCQkgKyA5MSAqIChhdXhBRENfVmwpIC0gMjcyNDMgKwogCQkJCQkgMTI4KSAvIDI1NjsKQEAgLTI2Mjc3LDcgKzI2MjgyLDcgQEAKIAkJfSBlbHNlIGlmIChOUkVWX0lTKHBpLT5wdWJwaS5waHlfcmV2LCA2KSkgewogCiAJCQl0eF9wd3JjdHJsX3RibCA9IG5waHlfdHBjX3R4Z2Fpbl9pcGFfcmV2NjsKLQkJCWlmIChDSElQSUQocGktPnNoLT5jaGlwKSA9PSBCQ000NzE2Ml9DSElQX0lEKSB7CisJCQlpZiAocGktPnNoLT5jaGlwID09IEJDTTQ3MTYyX0NISVBfSUQpIHsKIAogCQkJCXR4X3B3cmN0cmxfdGJsID0gbnBoeV90cGNfdHhnYWluX2lwYV9yZXY1OwogCQkJfQpAQCAtMjY4MzMsNyArMjY4MzgsNyBAQAogCQlwaHlfYTIgPSA2MzsKIAogCQlpZiAoQ0hTUEVDX0lTMkcocGktPnJhZGlvX2NoYW5zcGVjKSkgewotCQkJaWYgKENISVBJRChwaS0+c2gtPmNoaXApID09IEJDTTYzNjJfQ0hJUF9JRCkgeworCQkJaWYgKHBpLT5zaC0+Y2hpcCA9PSBCQ002MzYyX0NISVBfSUQpIHsKIAkJCQlwaHlfYTEgPSAzNTsKIAkJCQlwaHlfYTMgPSAzNTsKIAkJCX0gZWxzZSBpZiAoKHBpLT5wdWJwaS5yYWRpb3JldiA9PSA0KQpAQCAtMjY5NDYsNyArMjY5NTEsNyBAQAogCQkJCQlpZiAoTlJFVl9HRShwaS0+cHVicGkucGh5X3JldiwgNikpIHsKIAkJCQkJCXBoeV9hNSA9IDB4MDBmNyB8IChwaHlfYTQgPDwgOCk7CiAKLQkJCQkJCWlmIChDSElQSUQocGktPnNoLT5jaGlwKSA9PQorCQkJCQkJaWYgKHBpLT5zaC0+Y2hpcCA9PQogCQkJCQkJICAgIEJDTTQ3MTYyX0NISVBfSUQpIHsKIAkJCQkJCQlwaHlfYTUgPQogCQkJCQkJCSAgICAweDEwZjcgfCAocGh5X2E0IDw8CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3BoeS93bGNfcGh5dGJsX2xjbi5jIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9waHkvd2xjX3BoeXRibF9sY24uYwppbmRleCA2Y2U5ZTVkLi4zMzBiODgxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3BoeS93bGNfcGh5dGJsX2xjbi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvcGh5L3dsY19waHl0YmxfbGNuLmMKQEAgLTE1LDYgKzE1LDkgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxzYmhuZHBpby5oPgorI2luY2x1ZGUgPHNiaG5kZG1hLmg+CisjaW5jbHVkZSA8b3NsLmg+CiAjaW5jbHVkZSA8d2xjX3BoeV9pbnQuaD4KICNpbmNsdWRlIDx3bGNfcGh5dGJsX2xjbi5oPgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3BoeS93bGNfcGh5dGJsX24uYyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvcGh5L3dsY19waHl0Ymxfbi5jCmluZGV4IDdjYzJjNTYuLmE5ZmMxOTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvcGh5L3dsY19waHl0Ymxfbi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvcGh5L3dsY19waHl0Ymxfbi5jCkBAIC0xNiw2ICsxNiw5IEBACiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KIAorI2luY2x1ZGUgPHNiaG5kcGlvLmg+CisjaW5jbHVkZSA8c2JobmRkbWEuaD4KKyNpbmNsdWRlIDxvc2wuaD4KICNpbmNsdWRlIDx3bGNfcGh5X2ludC5oPgogI2luY2x1ZGUgPHdsY19waHl0Ymxfbi5oPgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3N5cy93bF9kYmcuaCBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvc3lzL3dsX2RiZy5oCmluZGV4IGU2M2IyN2UuLjU0YWYyNTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvc3lzL3dsX2RiZy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvc3lzL3dsX2RiZy5oCkBAIC0yMCwxNSArMjAsMjAgQEAKIC8qIHdsX21zZ19sZXZlbCBpcyBhIGJpdCB2ZWN0b3Igd2l0aCBkZWZzIGluIHdsaW9jdGwuaCAqLwogZXh0ZXJuIHUzMiB3bF9tc2dfbGV2ZWw7CiAKLSNkZWZpbmUgV0xfUFJJTlQoYXJncykJCXByaW50ZiBhcmdzCi0jZGVmaW5lIFdMX05PTkUoYXJncykKKyNkZWZpbmUgV0xfTk9ORShmbXQsIGFyZ3MuLi4pIG5vX3ByaW50ayhmbXQsICMjYXJncykKKworI2RlZmluZSBXTF9QUklOVChsZXZlbCwgZm10LCBhcmdzLi4uKQkJXAorZG8gewkJCQkJCVwKKwlpZiAod2xfbXNnX2xldmVsICYgbGV2ZWwpCQlcCisJCXByaW50ayhmbXQsICMjYXJncyk7CQlcCit9IHdoaWxlICgwKQogCiAjaWZkZWYgQkNNREJHCiAKLSNkZWZpbmUJV0xfRVJST1IoYXJncykJCWRvIHtpZiAoKHdsX21zZ19sZXZlbCAmIFdMX0VSUk9SX1ZBTCkpIFdMX1BSSU5UKGFyZ3MpOyB9IHdoaWxlICgwKQotI2RlZmluZQlXTF9UUkFDRShhcmdzKQkJZG8ge2lmICh3bF9tc2dfbGV2ZWwgJiBXTF9UUkFDRV9WQUwpIFdMX1BSSU5UKGFyZ3MpOyB9IHdoaWxlICgwKQotI2RlZmluZSBXTF9BTVBEVShhcmdzKQkJZG8ge2lmICh3bF9tc2dfbGV2ZWwgJiBXTF9BTVBEVV9WQUwpIFdMX1BSSU5UKGFyZ3MpOyB9IHdoaWxlICgwKQotI2RlZmluZSBXTF9GRlBMRChhcmdzKQkJZG8ge2lmICh3bF9tc2dfbGV2ZWwgJiBXTF9GRlBMRF9WQUwpIFdMX1BSSU5UKGFyZ3MpOyB9IHdoaWxlICgwKQorI2RlZmluZQlXTF9FUlJPUihmbXQsIGFyZ3MuLi4pCVdMX1BSSU5UKFdMX0VSUk9SX1ZBTCwgZm10LCAjI2FyZ3MpCisjZGVmaW5lCVdMX1RSQUNFKGZtdCwgYXJncy4uLikJV0xfUFJJTlQoV0xfVFJBQ0VfVkFMLCBmbXQsICMjYXJncykKKyNkZWZpbmUgV0xfQU1QRFUoZm10LCBhcmdzLi4uKQlXTF9QUklOVChXTF9BTVBEVV9WQUwsIGZtdCwgIyNhcmdzKQorI2RlZmluZSBXTF9GRlBMRChmbXQsIGFyZ3MuLi4pCVdMX1BSSU5UKFdMX0ZGUExEX1ZBTCwgZm10LCAjI2FyZ3MpCiAKICNkZWZpbmUgV0xfRVJST1JfT04oKQkJKHdsX21zZ19sZXZlbCAmIFdMX0VSUk9SX1ZBTCkKIApAQCAtNDQsMzUgKzQ5LDUwIEBACiAKIGV4dGVybiB1MzIgd2xfYW1wZHVfZGJnOwogCi0jZGVmaW5lIFdMX0FNUERVX1VQRE4oYXJncykgZG8ge2lmICh3bF9hbXBkdV9kYmcgJiBXTF9BTVBEVV9VUEROX1ZBTCkge1dMX0FNUERVKGFyZ3MpOyB9IH0gd2hpbGUgKDApCi0jZGVmaW5lIFdMX0FNUERVX1JYKGFyZ3MpIGRvIHtpZiAod2xfYW1wZHVfZGJnICYgV0xfQU1QRFVfUlhfVkFMKSB7V0xfQU1QRFUoYXJncyk7IH0gfSB3aGlsZSAoMCkKLSNkZWZpbmUgV0xfQU1QRFVfRVJSKGFyZ3MpIGRvIHtpZiAod2xfYW1wZHVfZGJnICYgV0xfQU1QRFVfRVJSX1ZBTCkge1dMX0FNUERVKGFyZ3MpOyB9IH0gd2hpbGUgKDApCi0jZGVmaW5lIFdMX0FNUERVX1RYKGFyZ3MpIGRvIHtpZiAod2xfYW1wZHVfZGJnICYgV0xfQU1QRFVfVFhfVkFMKSB7V0xfQU1QRFUoYXJncyk7IH0gfSB3aGlsZSAoMCkKLSNkZWZpbmUgV0xfQU1QRFVfQ1RMKGFyZ3MpIGRvIHtpZiAod2xfYW1wZHVfZGJnICYgV0xfQU1QRFVfQ1RMX1ZBTCkge1dMX0FNUERVKGFyZ3MpOyB9IH0gd2hpbGUgKDApCi0jZGVmaW5lIFdMX0FNUERVX0hXKGFyZ3MpIGRvIHtpZiAod2xfYW1wZHVfZGJnICYgV0xfQU1QRFVfSFdfVkFMKSB7V0xfQU1QRFUoYXJncyk7IH0gfSB3aGlsZSAoMCkKLSNkZWZpbmUgV0xfQU1QRFVfSFdUWFMoYXJncykgZG8ge2lmICh3bF9hbXBkdV9kYmcgJiBXTF9BTVBEVV9IV1RYU19WQUwpIHtXTF9BTVBEVShhcmdzKTsgfSB9IHdoaWxlICgwKQotI2RlZmluZSBXTF9BTVBEVV9IV0RCRyhhcmdzKSBkbyB7aWYgKHdsX2FtcGR1X2RiZyAmIFdMX0FNUERVX0hXREJHX1ZBTCkge1dMX0FNUERVKGFyZ3MpOyB9IH0gd2hpbGUgKDApCisjZGVmaW5lIFdMX0FNUERVX1BSSU5UKGxldmVsLCBmbXQsIGFyZ3MuLi4pCVwKK2RvIHsJCQkJCQlcCisJaWYgKHdsX2FtcGR1X2RiZyAmIGxldmVsKSB7CQlcCisJCVdMX0FNUERVKGZtdCwgIyNhcmdzKTsJCVwKKwl9CQkJCQlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIFdMX0FNUERVX1VQRE4oZm10LCBhcmdzLi4uKQkJCVwKKwlXTF9BTVBEVV9QUklOVChXTF9BTVBEVV9VUEROX1ZBTCwgZm10LCAjI2FyZ3MpCisjZGVmaW5lIFdMX0FNUERVX1JYKGZtdCwgYXJncy4uLikJCQlcCisJV0xfQU1QRFVfUFJJTlQoV0xfQU1QRFVfUlhfVkFMLCBmbXQsICMjYXJncykKKyNkZWZpbmUgV0xfQU1QRFVfRVJSKGZtdCwgYXJncy4uLikJCQlcCisJV0xfQU1QRFVfUFJJTlQoV0xfQU1QRFVfRVJSX1ZBTCwgZm10LCAjI2FyZ3MpCisjZGVmaW5lIFdMX0FNUERVX1RYKGZtdCwgYXJncy4uLikJCQlcCisJV0xfQU1QRFVfUFJJTlQoV0xfQU1QRFVfVFhfVkFMLCBmbXQsICMjYXJncykKKyNkZWZpbmUgV0xfQU1QRFVfQ1RMKGZtdCwgYXJncy4uLikJCQlcCisJV0xfQU1QRFVfUFJJTlQoV0xfQU1QRFVfQ1RMX1ZBTCwgZm10LCAjI2FyZ3MpCisjZGVmaW5lIFdMX0FNUERVX0hXKGZtdCwgYXJncy4uLikJCQlcCisJV0xfQU1QRFVfUFJJTlQoV0xfQU1QRFVfSFdfVkFMLCBmbXQsICMjYXJncykKKyNkZWZpbmUgV0xfQU1QRFVfSFdUWFMoZm10LCBhcmdzLi4uKQkJCVwKKwlXTF9BTVBEVV9QUklOVChXTF9BTVBEVV9IV1RYU19WQUwsIGZtdCwgIyNhcmdzKQorI2RlZmluZSBXTF9BTVBEVV9IV0RCRyhmbXQsIGFyZ3MuLi4pCQkJXAorCVdMX0FNUERVX1BSSU5UKFdMX0FNUERVX0hXREJHX1ZBTCwgZm10LCAjI2FyZ3MpCiAjZGVmaW5lIFdMX0FNUERVX0VSUl9PTigpICh3bF9hbXBkdV9kYmcgJiBXTF9BTVBEVV9FUlJfVkFMKQogI2RlZmluZSBXTF9BTVBEVV9IV19PTigpICh3bF9hbXBkdV9kYmcgJiBXTF9BTVBEVV9IV19WQUwpCiAjZGVmaW5lIFdMX0FNUERVX0hXVFhTX09OKCkgKHdsX2FtcGR1X2RiZyAmIFdMX0FNUERVX0hXVFhTX1ZBTCkKIAogI2Vsc2UJCQkJLyogQkNNREJHICovCiAKLSNkZWZpbmUJV0xfRVJST1IoYXJncykKLSNkZWZpbmUJV0xfVFJBQ0UoYXJncykKLSNkZWZpbmUgV0xfQU1QRFUoYXJncykKLSNkZWZpbmUgV0xfRkZQTEQoYXJncykKKyNkZWZpbmUJV0xfRVJST1IoZm10LCBhcmdzLi4uKQkJbm9fcHJpbnRrKGZtdCwgIyNhcmdzKQorI2RlZmluZQlXTF9UUkFDRShmbXQsIGFyZ3MuLi4pCQlub19wcmludGsoZm10LCAjI2FyZ3MpCisjZGVmaW5lIFdMX0FNUERVKGZtdCwgYXJncy4uLikJCW5vX3ByaW50ayhmbXQsICMjYXJncykKKyNkZWZpbmUgV0xfRkZQTEQoZm10LCBhcmdzLi4uKQkJbm9fcHJpbnRrKGZtdCwgIyNhcmdzKQogCiAjZGVmaW5lIFdMX0VSUk9SX09OKCkJCTAKIAotI2RlZmluZSBXTF9BTVBEVV9VUEROKGFyZ3MpCi0jZGVmaW5lIFdMX0FNUERVX1JYKGFyZ3MpCi0jZGVmaW5lIFdMX0FNUERVX0VSUihhcmdzKQotI2RlZmluZSBXTF9BTVBEVV9UWChhcmdzKQotI2RlZmluZSBXTF9BTVBEVV9DVEwoYXJncykKLSNkZWZpbmUgV0xfQU1QRFVfSFcoYXJncykKLSNkZWZpbmUgV0xfQU1QRFVfSFdUWFMoYXJncykKLSNkZWZpbmUgV0xfQU1QRFVfSFdEQkcoYXJncykKKyNkZWZpbmUgV0xfQU1QRFVfVVBETihmbXQsIGFyZ3MuLi4pCW5vX3ByaW50ayhmbXQsICMjYXJncykKKyNkZWZpbmUgV0xfQU1QRFVfUlgoZm10LCBhcmdzLi4uKQlub19wcmludGsoZm10LCAjI2FyZ3MpCisjZGVmaW5lIFdMX0FNUERVX0VSUihmbXQsIGFyZ3MuLi4pCW5vX3ByaW50ayhmbXQsICMjYXJncykKKyNkZWZpbmUgV0xfQU1QRFVfVFgoZm10LCBhcmdzLi4uKQlub19wcmludGsoZm10LCAjI2FyZ3MpCisjZGVmaW5lIFdMX0FNUERVX0NUTChmbXQsIGFyZ3MuLi4pCW5vX3ByaW50ayhmbXQsICMjYXJncykKKyNkZWZpbmUgV0xfQU1QRFVfSFcoZm10LCBhcmdzLi4uKQlub19wcmludGsoZm10LCAjI2FyZ3MpCisjZGVmaW5lIFdMX0FNUERVX0hXVFhTKGZtdCwgYXJncy4uLikJbm9fcHJpbnRrKGZtdCwgIyNhcmdzKQorI2RlZmluZSBXTF9BTVBEVV9IV0RCRyhmbXQsIGFyZ3MuLi4pCW5vX3ByaW50ayhmbXQsICMjYXJncykKICNkZWZpbmUgV0xfQU1QRFVfRVJSX09OKCkgICAgICAgMAogI2RlZmluZSBXTF9BTVBEVV9IV19PTigpICAgICAgICAwCiAjZGVmaW5lIFdMX0FNUERVX0hXVFhTX09OKCkgICAgIDAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvc3lzL3dsX2V4cG9ydC5oIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9zeXMvd2xfZXhwb3J0LmgKaW5kZXggMDg0NDJmOC4uYWE4YjVhMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9zeXMvd2xfZXhwb3J0LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9zeXMvd2xfZXhwb3J0LmgKQEAgLTQ1LDEwICs0NSwxMCBAQAogCQkJIGludCBwZXJpb2RpYyk7CiBleHRlcm4gYm9vbCB3bF9kZWxfdGltZXIoc3RydWN0IHdsX2luZm8gKndsLCBzdHJ1Y3Qgd2xfdGltZXIgKnRpbWVyKTsKIAotZXh0ZXJuIHVpbnQgd2xfYnVmX3RvX3BrdGNvcHkob3NsX3QgKm9zaCwgdm9pZCAqcCwgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgbGVuLAotCQkJICAgICAgdWludCBvZmZzZXQpOwotZXh0ZXJuIHZvaWQgKndsX2dldF9wa3RidWZmZXIob3NsX3QgKm9zaCwgaW50IGxlbik7Ci1leHRlcm4gaW50IHdsX3NldF9wa3RsZW4ob3NsX3QgKm9zaCwgdm9pZCAqcCwgaW50IGxlbik7CitleHRlcm4gdWludCB3bF9idWZfdG9fcGt0Y29weShzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgdm9pZCAqcCwgdW5zaWduZWQgY2hhciAqYnVmLAorCQkJICAgICAgaW50IGxlbiwgdWludCBvZmZzZXQpOworZXh0ZXJuIHZvaWQgKndsX2dldF9wa3RidWZmZXIoc3RydWN0IG9zbF9pbmZvICpvc2gsIGludCBsZW4pOworZXh0ZXJuIGludCB3bF9zZXRfcGt0bGVuKHN0cnVjdCBvc2xfaW5mbyAqb3NoLCB2b2lkICpwLCBpbnQgbGVuKTsKIAogI2RlZmluZSB3bF9zb3J0X2Jzc2xpc3QoYSwgYikgZmFsc2UKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9zeXMvd2xfbWFjODAyMTEuYyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvc3lzL3dsX21hYzgwMjExLmMKaW5kZXggZDA2MDM3Ny4uYmRkNjI5ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9zeXMvd2xfbWFjODAyMTEuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3N5cy93bF9tYWM4MDIxMS5jCkBAIC0yMSw3MiArMjEsMzYgQEAKICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9wY2lfaWRzLmg+CiAjaW5jbHVkZSA8YmNtZGVmcy5oPgotI2luY2x1ZGUgPGxpbnV4dmVyLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxvc2wuaD4KICNkZWZpbmUgV0xDX01BWEJTU0NGRwkJMQkvKiBzaW5nbGUgQlNTIGNvbmZpZ3MgKi8KIAogI2luY2x1ZGUgPHdsY19jZmcuaD4KICNpbmNsdWRlIDxuZXQvbWFjODAyMTEuaD4KLSNpbmNsdWRlIDxlcGl2ZXJzLmg+Ci0jaWZuZGVmIFdMQ19ISUdIX09OTFkKICNpbmNsdWRlIDxwaHlfdmVyc2lvbi5oPgotI2VuZGlmCiAjaW5jbHVkZSA8YmNtdXRpbHMuaD4KICNpbmNsdWRlIDxwY2ljZmcuaD4KICNpbmNsdWRlIDx3bGlvY3RsLmg+CiAjaW5jbHVkZSA8d2xjX2tleS5oPgorI2luY2x1ZGUgPHNiaG5kcGlvLmg+CisjaW5jbHVkZSA8c2JobmRkbWEuaD4KICNpbmNsdWRlIDx3bGNfY2hhbm5lbC5oPgogI2luY2x1ZGUgPHdsY19wdWIuaD4KICNpbmNsdWRlIDx3bGNfc2NiLmg+CiAjaW5jbHVkZSA8d2xfZGJnLmg+Ci0jaWZkZWYgQkNNU0RJTwotI2luY2x1ZGUgPGJjbXNkaC5oPgotI2VuZGlmCiAjaW5jbHVkZSA8d2xfZXhwb3J0Lmg+Ci0jaWZkZWYgV0xDX0hJR0hfT05MWQotI2luY2x1ZGUgImRidXMuaCIKLSNpbmNsdWRlICJiY21fcnBjX3RwLmgiCi0jaW5jbHVkZSAiYmNtX3JwYy5oIgotI2luY2x1ZGUgImJjbV94ZHIuaCIKLSNpbmNsdWRlICJ3bGNfcnBjLmgiCi0jZW5kaWYKIAogI2luY2x1ZGUgPHdsX21hYzgwMjExLmg+CiAjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KLSNpZm5kZWYgV0xDX0hJR0hfT05MWQogI2luY2x1ZGUgPHdsX3Vjb2RlLmg+CiAjaW5jbHVkZSA8ZDExdWNvZGVfZXh0Lmg+Ci0jZW5kaWYKIAotI2lmZGVmIEJDTVNESU8KLWV4dGVybiBzdHJ1Y3QgZGV2aWNlICpzZGlvbW1jX2RldjsKLSNlbmRpZgotCi1leHRlcm4gdm9pZCB3bGNfd21lX3NldHBhcmFtcyh3bGNfaW5mb190ICp3bGMsIHUxNiBhY2ksIHZvaWQgKmFyZywKLQkJCSAgICAgIGJvb2wgc3VzcGVuZCk7Ci1ib29sIHdsY19zZW5kcGt0X21hYzgwMjExKHdsY19pbmZvX3QgKndsYywgdm9pZCAqc2R1LCBzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyk7Ci12b2lkIHdsY19tYWNfYmNuX3Byb21pc2NfY2hhbmdlKHdsY19pbmZvX3QgKndsYywgYm9vbCBwcm9taXNjKTsKLXZvaWQgd2xjX3NldF9hZGRybWF0Y2god2xjX2luZm9fdCAqd2xjLCBpbnQgbWF0Y2hfcmVnX29mZnNldCwKLQkJICAgICAgIGNvbnN0IHN0cnVjdCBldGhlcl9hZGRyICphZGRyKTsKIAogc3RhdGljIHZvaWQgd2xfdGltZXIodW5zaWduZWQgbG9uZyBkYXRhKTsKIHN0YXRpYyB2b2lkIF93bF90aW1lcih3bF90aW1lcl90ICp0KTsKIAotI2lmZGVmIFdMQ19ISUdIX09OTFkKLSNkZWZpbmUgUlBDUV9MT0NLKF93bCwgX2ZsYWdzKSBzcGluX2xvY2tfaXJxc2F2ZSgmKF93bCktPnJwY3FfbG9jaywgKF9mbGFncykpCi0jZGVmaW5lIFJQQ1FfVU5MT0NLKF93bCwgX2ZsYWdzKSAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmKF93bCktPnJwY3FfbG9jaywgKF9mbGFncykpCi0jZGVmaW5lIFRYUV9MT0NLKF93bCwgX2ZsYWdzKSBzcGluX2xvY2tfaXJxc2F2ZSgmKF93bCktPnR4cV9sb2NrLCAoX2ZsYWdzKSkKLSNkZWZpbmUgVFhRX1VOTE9DSyhfd2wsIF9mbGFncykgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJihfd2wpLT50eHFfbG9jaywgKF9mbGFncykpCi1zdGF0aWMgdm9pZCB3bF9ycGNfZG93bih2b2lkICp3bGgpOwotc3RhdGljIHZvaWQgd2xfcnBjcV9mcmVlKHdsX2luZm9fdCAqd2wpOwotc3RhdGljIHZvaWQgd2xfcnBjcV9kaXNwYXRjaChzdHJ1Y3Qgd2xfdGFzayAqdGFzayk7Ci1zdGF0aWMgdm9pZCB3bF9ycGNfZGlzcGF0Y2hfc2NoZWR1bGUodm9pZCAqY3R4LCBzdHJ1Y3QgcnBjX2J1ZiAqYnVmKTsKLXN0YXRpYyB2b2lkIHdsX3N0YXJ0X3R4cXdvcmsoc3RydWN0IHdsX3Rhc2sgKnRhc2spOwotc3RhdGljIHZvaWQgd2xfdHhxX2ZyZWUod2xfaW5mb190ICp3bCk7Ci1zdGF0aWMgdm9pZCB3bF90aW1lcl90YXNrKHdsX3Rhc2tfdCAqdGFzayk7Ci1zdGF0aWMgaW50IHdsX3NjaGVkdWxlX3Rhc2sod2xfaW5mb190ICp3bCwgdm9pZCAoKmZuKSAoc3RydWN0IHdsX3Rhc2sgKiksCi0JCQkgICAgdm9pZCAqY29udGV4dCk7Ci0jZW5kaWYJCQkJLyogV0xDX0hJR0hfT05MWSAqLwogCiBzdGF0aWMgaW50IGllZWVfaHdfaW5pdChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyk7CiBzdGF0aWMgaW50IGllZWVfaHdfcmF0ZV9pbml0KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KTsKQEAgLTEzNCwxNiArOTgsMTQgQEAKIAl1OCByeF9oZHJbMTZdLCB0eF9oZHJbMTZdOwogfTsKIAotI2lmbmRlZiBXTENfSElHSF9PTkxZCi0jZGVmaW5lIFdMX0RFVl9JRihkZXYpCQkoKHdsX2lmX3QgKiluZXRkZXZfcHJpdihkZXYpKQotI2RlZmluZQlXTF9JTkZPKGRldikJCSgod2xfaW5mb190ICopKFdMX0RFVl9JRihkZXYpLT53bCkpCS8qIHBvaW50cyB0byB3bCAqLwotc3RhdGljIGludCB3bF9yZXF1ZXN0X2Z3KHdsX2luZm9fdCAqd2wsIHN0cnVjdCBwY2lfZGV2ICpwZGV2KTsKLXN0YXRpYyB2b2lkIHdsX3JlbGVhc2VfZncod2xfaW5mb190ICp3bCk7Ci0jZW5kaWYKKyNkZWZpbmUgV0xfREVWX0lGKGRldikJCSgoc3RydWN0IHdsX2lmICopbmV0ZGV2X3ByaXYoZGV2KSkKKyNkZWZpbmUJV0xfSU5GTyhkZXYpCQkoKHN0cnVjdCB3bF9pbmZvICopKFdMX0RFVl9JRihkZXYpLT53bCkpCitzdGF0aWMgaW50IHdsX3JlcXVlc3RfZncoc3RydWN0IHdsX2luZm8gKndsLCBzdHJ1Y3QgcGNpX2RldiAqcGRldik7CitzdGF0aWMgdm9pZCB3bF9yZWxlYXNlX2Z3KHN0cnVjdCB3bF9pbmZvICp3bCk7CiAKIC8qIGxvY2FsIHByb3RvdHlwZXMgKi8KLXN0YXRpYyBpbnQgd2xfc3RhcnQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgd2xfaW5mb190ICp3bCk7Ci1zdGF0aWMgaW50IHdsX3N0YXJ0X2ludCh3bF9pbmZvX3QgKndsLCBzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKK3N0YXRpYyBpbnQgd2xfc3RhcnQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHdsX2luZm8gKndsKTsKK3N0YXRpYyBpbnQgd2xfc3RhcnRfaW50KHN0cnVjdCB3bF9pbmZvICp3bCwgc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCiAJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKIHN0YXRpYyB2b2lkIHdsX2RwYyh1bnNpZ25lZCBsb25nIGRhdGEpOwogCkBAIC0xNTIsNyArMTE0LDYgQEAKIE1PRFVMRV9TVVBQT1JURURfREVWSUNFKCJCcm9hZGNvbSA4MDIuMTFuIFdMQU4gY2FyZHMiKTsKIE1PRFVMRV9MSUNFTlNFKCJEdWFsIEJTRC9HUEwiKTsKIAotI2lmbmRlZiBCQ01TRElPCiAvKiByZWNvZ25pemVkIFBDSSBJRHMgKi8KIHN0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCB3bF9pZF90YWJsZVtdID0gewogCXtQQ0lfVkVORE9SX0lEX0JST0FEQ09NLCAweDQzNTcsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LAkvKiA0MzIyNSAyRyAqLwpAQCAtMTYzLDU1ICsxMjQsMTggQEAKIAogTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHdsX2lkX3RhYmxlKTsKIHN0YXRpYyB2b2lkIHdsX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGRldik7Ci0jZW5kaWYJCQkJLyogIUJDTVNESU8gKi8KIAotI2lmZGVmIEJDTVNESU8KLXN0YXRpYyB1aW50IHNkX2RyaXZlc3RyZW5ndGggPSA2OwotbW9kdWxlX3BhcmFtKHNkX2RyaXZlc3RyZW5ndGgsIHVpbnQsIDApOwotI2VuZGlmCiAKICNpZmRlZiBCQ01EQkcKIHN0YXRpYyBpbnQgbXNnbGV2ZWwgPSAweGRlYWRiZWVmOwogbW9kdWxlX3BhcmFtKG1zZ2xldmVsLCBpbnQsIDApOwotI2lmbmRlZiBXTENfSElHSF9PTkxZCiBzdGF0aWMgaW50IHBoeW1zZ2xldmVsID0gMHhkZWFkYmVlZjsKIG1vZHVsZV9wYXJhbShwaHltc2dsZXZlbCwgaW50LCAwKTsKLSNlbmRpZgkJCQkvKiBXTENfSElHSF9PTkxZICovCiAjZW5kaWYJCQkJLyogQkNNREJHICovCiAKLXN0YXRpYyBpbnQgb25lb25seTsKLW1vZHVsZV9wYXJhbShvbmVvbmx5LCBpbnQsIDApOwotCi1zdGF0aWMgaW50IHBpb21vZGU7Ci1tb2R1bGVfcGFyYW0ocGlvbW9kZSwgaW50LCAwKTsKLQotc3RhdGljIGludCBpbnN0YW5jZV9iYXNlOwkvKiBTdGFydGluZyBpbnN0YW5jZSBudW1iZXIgKi8KLW1vZHVsZV9wYXJhbShpbnN0YW5jZV9iYXNlLCBpbnQsIDApOwotCi0jaWYgZGVmaW5lZChCQ01EQkcpCi1zdGF0aWMgY2hhciAqbWFjYWRkcjsKLW1vZHVsZV9wYXJhbShtYWNhZGRyLCBjaGFycCwgU19JUlVHTyk7Ci0jZW5kaWYKLQotc3RhdGljIGludCBub21wYyA9IDE7Ci1tb2R1bGVfcGFyYW0obm9tcGMsIGludCwgMCk7Ci0KLXN0YXRpYyBjaGFyIG5hbWVbSUZOQU1TSVpdID0gImV0aCVkIjsKLW1vZHVsZV9wYXJhbV9zdHJpbmcobmFtZSwgbmFtZSwgSUZOQU1TSVosIDApOwotCi0jaWZuZGVmCVNSQ0JBU0UKLSNkZWZpbmUJU1JDQkFTRSAiLiIKLSNlbmRpZgotCi0jZGVmaW5lIFdMX01BR0lDIAkweGRlYWRiZWVmCi0KICNkZWZpbmUgSFdfVE9fV0woaHcpCSAoaHctPnByaXYpCiAjZGVmaW5lIFdMX1RPX0hXKHdsKQkgICh3bC0+cHViLT5pZWVlX2h3KQotI2lmZGVmIFdMQ19ISUdIX09OTFkKLXN0YXRpYyBpbnQgd2xfb3BzX3R4X25sKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKLSNlbHNlCiBzdGF0aWMgaW50IHdsX29wc190eChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgc3RydWN0IHNrX2J1ZmYgKnNrYik7Ci0jZW5kaWYKIHN0YXRpYyBpbnQgd2xfb3BzX3N0YXJ0KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KTsKIHN0YXRpYyB2b2lkIHdsX29wc19zdG9wKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KTsKIHN0YXRpYyBpbnQgd2xfb3BzX2FkZF9pbnRlcmZhY2Uoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCkBAIC0yNDksMjggKzE3MywxMyBAQAogCQkJICAgZW51bSBpZWVlODAyMTFfYW1wZHVfbWxtZV9hY3Rpb24gYWN0aW9uLAogCQkJICAgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwgdTE2IHRpZCwgdTE2ICpzc24pOwogCi0jaWZkZWYgV0xDX0hJR0hfT05MWQotc3RhdGljIGludCB3bF9vcHNfdHhfbmwoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHN0cnVjdCBza19idWZmICpza2IpCi17Ci0JaW50IHN0YXR1czsKLQl3bF9pbmZvX3QgKndsID0gaHctPnByaXY7Ci0JaWYgKCF3bC0+cHViLT51cCkgewotCQlXTF9FUlJPUigoIm9wcy0+dHggY2FsbGVkIHdoaWxlIGRvd25cbiIpKTsKLQkJc3RhdHVzID0gLUVORVRET1dOOwotCQlnb3RvIGRvbmU7Ci0JfQotCXN0YXR1cyA9IHdsX3N0YXJ0KHNrYiwgd2wpOwotIGRvbmU6Ci0JcmV0dXJuIHN0YXR1czsKLX0KLSNlbHNlCiBzdGF0aWMgaW50IHdsX29wc190eChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlpbnQgc3RhdHVzOwotCXdsX2luZm9fdCAqd2wgPSBody0+cHJpdjsKKwlzdHJ1Y3Qgd2xfaW5mbyAqd2wgPSBody0+cHJpdjsKIAlXTF9MT0NLKHdsKTsKIAlpZiAoIXdsLT5wdWItPnVwKSB7Ci0JCVdMX0VSUk9SKCgib3BzLT50eCBjYWxsZWQgd2hpbGUgZG93blxuIikpOworCQlXTF9FUlJPUigib3BzLT50eCBjYWxsZWQgd2hpbGUgZG93blxuIik7CiAJCXN0YXR1cyA9IC1FTkVURE9XTjsKIAkJZ290byBkb25lOwogCX0KQEAgLTI3OSwxMyArMTg4LDE0IEBACiAJV0xfVU5MT0NLKHdsKTsKIAlyZXR1cm4gc3RhdHVzOwogfQotI2VuZGlmCQkJCS8qIFdMQ19ISUdIX09OTFkgKi8KIAogc3RhdGljIGludCB3bF9vcHNfc3RhcnQoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCiB7Ci0Jd2xfaW5mb190ICp3bCA9IGh3LT5wcml2OwotCS8qIHN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqY3VyY2hhbiA9IGh3LT5jb25mLmNoYW5uZWw7ICovCi0JV0xfTk9ORSgoIiVzIDogSW5pdGlhbCBjaGFubmVsOiAlZFxuIiwgX19mdW5jX18sIGN1cmNoYW4tPmh3X3ZhbHVlKSk7CisJc3RydWN0IHdsX2luZm8gKndsID0gaHctPnByaXY7CisJLyoKKwkgIHN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqY3VyY2hhbiA9IGh3LT5jb25mLmNoYW5uZWw7CisJICBXTF9OT05FKCIlcyA6IEluaXRpYWwgY2hhbm5lbDogJWRcbiIsIF9fZnVuY19fLCBjdXJjaGFuLT5od192YWx1ZSk7CisJKi8KIAogCVdMX0xPQ0sod2wpOwogCWllZWU4MDIxMV93YWtlX3F1ZXVlcyhodyk7CkBAIC0yOTYsNyArMjA2LDcgQEAKIAogc3RhdGljIHZvaWQgd2xfb3BzX3N0b3Aoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCiB7Ci0Jd2xfaW5mb190ICp3bCA9IGh3LT5wcml2OworCXN0cnVjdCB3bF9pbmZvICp3bCA9IGh3LT5wcml2OwogCUFTU0VSVCh3bCk7CiAJV0xfTE9DSyh3bCk7CiAJd2xfZG93bih3bCk7CkBAIC0zMDksNyArMjE5LDcgQEAKIHN0YXRpYyBpbnQKIHdsX29wc19hZGRfaW50ZXJmYWNlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmKQogewotCXdsX2luZm9fdCAqd2w7CisJc3RydWN0IHdsX2luZm8gKndsOwogCWludCBlcnI7CiAKIAkvKiBKdXN0IFNUQSBmb3Igbm93ICovCkBAIC0zMTgsOCArMjI4LDggQEAKIAkgICAgdmlmLT50eXBlICE9IE5MODAyMTFfSUZUWVBFX1NUQVRJT04gJiYKIAkgICAgdmlmLT50eXBlICE9IE5MODAyMTFfSUZUWVBFX1dEUyAmJgogCSAgICB2aWYtPnR5cGUgIT0gTkw4MDIxMV9JRlRZUEVfQURIT0MpIHsKLQkJV0xfRVJST1IoKCIlczogQXR0ZW1wdCB0byBhZGQgdHlwZSAlZCwgb25seSBTVEEgZm9yIG5vd1xuIiwKLQkJCSAgX19mdW5jX18sIHZpZi0+dHlwZSkpOworCQlXTF9FUlJPUigiJXM6IEF0dGVtcHQgdG8gYWRkIHR5cGUgJWQsIG9ubHkgU1RBIGZvciBub3dcbiIsCisJCQkgX19mdW5jX18sIHZpZi0+dHlwZSk7CiAJCXJldHVybiAtRU9QTk9UU1VQUDsKIAl9CiAKQEAgLTMyOSw3ICsyMzksNyBAQAogCVdMX1VOTE9DSyh3bCk7CiAKIAlpZiAoZXJyICE9IDApCi0JCVdMX0VSUk9SKCgiJXM6IHdsX3VwKCkgcmV0dXJuZWQgJWRcbiIsIF9fZnVuY19fLCBlcnIpKTsKKwkJV0xfRVJST1IoIiVzOiB3bF91cCgpIHJldHVybmVkICVkXG4iLCBfX2Z1bmNfXywgZXJyKTsKIAlyZXR1cm4gZXJyOwogfQogCkBAIC0zNDMsNyArMjUzLDcgQEAKIGllZWVfc2V0X2NoYW5uZWwoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqY2hhbiwKIAkJIGVudW0gbmw4MDIxMV9jaGFubmVsX3R5cGUgdHlwZSkKIHsKLQl3bF9pbmZvX3QgKndsID0gSFdfVE9fV0woaHcpOworCXN0cnVjdCB3bF9pbmZvICp3bCA9IEhXX1RPX1dMKGh3KTsKIAlpbnQgZXJyID0gMDsKIAogCXN3aXRjaCAodHlwZSkgewpAQCAtMzU1LDggKzI2NSw3IEBACiAJCWJyZWFrOwogCWNhc2UgTkw4MDIxMV9DSEFOX0hUNDBNSU5VUzoKIAljYXNlIE5MODAyMTFfQ0hBTl9IVDQwUExVUzoKLQkJV0xfRVJST1IoKCIlczogTmVlZCB0byBpbXBsZW1lbnQgNDAgTWh6IENoYW5uZWxzIVxuIiwKLQkJCSAgX19mdW5jX18pKTsKKwkJV0xfRVJST1IoIiVzOiBOZWVkIHRvIGltcGxlbWVudCA0MCBNaHogQ2hhbm5lbHMhXG4iLCBfX2Z1bmNfXyk7CiAJCWJyZWFrOwogCX0KIApAQCAtMzY4LDE3ICsyNzcsMTcgQEAKIHN0YXRpYyBpbnQgd2xfb3BzX2NvbmZpZyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgdTMyIGNoYW5nZWQpCiB7CiAJc3RydWN0IGllZWU4MDIxMV9jb25mICpjb25mID0gJmh3LT5jb25mOwotCXdsX2luZm9fdCAqd2wgPSBIV19UT19XTChodyk7CisJc3RydWN0IHdsX2luZm8gKndsID0gSFdfVE9fV0woaHcpOwogCWludCBlcnIgPSAwOwogCWludCBuZXdfaW50OwogCiAJaWYgKGNoYW5nZWQgJiBJRUVFODAyMTFfQ09ORl9DSEFOR0VfTElTVEVOX0lOVEVSVkFMKSB7Ci0JCVdMX05PTkUoKCIlczogU2V0dGluZyBsaXN0ZW4gaW50ZXJ2YWwgdG8gJWRcbiIsCi0JCQkgX19mdW5jX18sIGNvbmYtPmxpc3Rlbl9pbnRlcnZhbCkpOworCQlXTF9OT05FKCIlczogU2V0dGluZyBsaXN0ZW4gaW50ZXJ2YWwgdG8gJWRcbiIsCisJCQlfX2Z1bmNfXywgY29uZi0+bGlzdGVuX2ludGVydmFsKTsKIAkJaWYgKHdsY19pb3Zhcl9zZXRpbnQKIAkJICAgICh3bC0+d2xjLCAiYmNuX2xpX2JjbiIsIGNvbmYtPmxpc3Rlbl9pbnRlcnZhbCkpIHsKLQkJCVdMX0VSUk9SKCgiJXM6IEVycm9yIHNldHRpbmcgbGlzdGVuX2ludGVydmFsXG4iLAotCQkJCSAgX19mdW5jX18pKTsKKwkJCVdMX0VSUk9SKCIlczogRXJyb3Igc2V0dGluZyBsaXN0ZW5faW50ZXJ2YWxcbiIsCisJCQkJIF9fZnVuY19fKTsKIAkJCWVyciA9IC1FSU87CiAJCQlnb3RvIGNvbmZpZ19vdXQ7CiAJCX0KQEAgLTM4Niw0MSArMjk1LDQyIEBACiAJCUFTU0VSVChuZXdfaW50ID09IGNvbmYtPmxpc3Rlbl9pbnRlcnZhbCk7CiAJfQogCWlmIChjaGFuZ2VkICYgSUVFRTgwMjExX0NPTkZfQ0hBTkdFX01PTklUT1IpCi0JCVdMX05PTkUoKCJOZWVkIHRvIHNldCBtb25pdG9yIG1vZGVcbiIpKTsKKwkJV0xfTk9ORSgiTmVlZCB0byBzZXQgbW9uaXRvciBtb2RlXG4iKTsKIAlpZiAoY2hhbmdlZCAmIElFRUU4MDIxMV9DT05GX0NIQU5HRV9QUykKLQkJV0xfTk9ORSgoIk5lZWQgdG8gc2V0IFBvd2VyLXNhdmUgbW9kZVxuIikpOworCQlXTF9OT05FKCJOZWVkIHRvIHNldCBQb3dlci1zYXZlIG1vZGVcbiIpOwogCiAJaWYgKGNoYW5nZWQgJiBJRUVFODAyMTFfQ09ORl9DSEFOR0VfUE9XRVIpIHsKLQkJV0xfTk9ORSgoIiVzOiBTZXR0aW5nIHR4IHBvd2VyIHRvICVkIGRibVxuIiwgX19mdW5jX18sCi0JCQkgY29uZi0+cG93ZXJfbGV2ZWwpKTsKKwkJV0xfTk9ORSgiJXM6IFNldHRpbmcgdHggcG93ZXIgdG8gJWQgZGJtXG4iLAorCQkJX19mdW5jX18sIGNvbmYtPnBvd2VyX2xldmVsKTsKIAkJaWYgKHdsY19pb3Zhcl9zZXRpbnQKIAkJICAgICh3bC0+d2xjLCAicXR4cG93ZXIiLCBjb25mLT5wb3dlcl9sZXZlbCAqIDQpKSB7Ci0JCQlXTF9FUlJPUigoIiVzOiBFcnJvciBzZXR0aW5nIHBvd2VyX2xldmVsXG4iLCBfX2Z1bmNfXykpOworCQkJV0xfRVJST1IoIiVzOiBFcnJvciBzZXR0aW5nIHBvd2VyX2xldmVsXG4iLCBfX2Z1bmNfXyk7CiAJCQllcnIgPSAtRUlPOwogCQkJZ290byBjb25maWdfb3V0OwogCQl9CiAJCXdsY19pb3Zhcl9nZXRpbnQod2wtPndsYywgInF0eHBvd2VyIiwgJm5ld19pbnQpOwogCQlpZiAobmV3X2ludCAhPSAoY29uZi0+cG93ZXJfbGV2ZWwgKiA0KSkKLQkJCVdMX0VSUk9SKCgiJXM6IFBvd2VyIGxldmVsIHJlcSAhPSBhY3R1YWwsICVkICVkXG4iLAotCQkJCSAgX19mdW5jX18sIGNvbmYtPnBvd2VyX2xldmVsICogNCwgbmV3X2ludCkpOworCQkJV0xfRVJST1IoIiVzOiBQb3dlciBsZXZlbCByZXEgIT0gYWN0dWFsLCAlZCAlZFxuIiwKKwkJCQkgX19mdW5jX18sIGNvbmYtPnBvd2VyX2xldmVsICogNCwgbmV3X2ludCk7CiAJfQogCWlmIChjaGFuZ2VkICYgSUVFRTgwMjExX0NPTkZfQ0hBTkdFX0NIQU5ORUwpIHsKIAkJZXJyID0gaWVlZV9zZXRfY2hhbm5lbChodywgY29uZi0+Y2hhbm5lbCwgY29uZi0+Y2hhbm5lbF90eXBlKTsKIAl9CiAJaWYgKGNoYW5nZWQgJiBJRUVFODAyMTFfQ09ORl9DSEFOR0VfUkVUUllfTElNSVRTKSB7Ci0JCVdMX05PTkUoKCIlczogc3JsICVkLCBscmwgJWRcbiIsIF9fZnVuY19fLAotCQkJIGNvbmYtPnNob3J0X2ZyYW1lX21heF90eF9jb3VudCwKLQkJCSBjb25mLT5sb25nX2ZyYW1lX21heF90eF9jb3VudCkpOworCQlXTF9OT05FKCIlczogc3JsICVkLCBscmwgJWRcbiIsCisJCQlfX2Z1bmNfXywKKwkJCWNvbmYtPnNob3J0X2ZyYW1lX21heF90eF9jb3VudCwKKwkJCWNvbmYtPmxvbmdfZnJhbWVfbWF4X3R4X2NvdW50KTsKIAkJaWYgKHdsY19zZXQKIAkJICAgICh3bC0+d2xjLCBXTENfU0VUX1NSTCwKIAkJICAgICBjb25mLT5zaG9ydF9mcmFtZV9tYXhfdHhfY291bnQpIDwgMCkgewotCQkJV0xfRVJST1IoKCIlczogRXJyb3Igc2V0dGluZyBzcmxcbiIsIF9fZnVuY19fKSk7CisJCQlXTF9FUlJPUigiJXM6IEVycm9yIHNldHRpbmcgc3JsXG4iLCBfX2Z1bmNfXyk7CiAJCQllcnIgPSAtRUlPOwogCQkJZ290byBjb25maWdfb3V0OwogCQl9CiAJCWlmICh3bGNfc2V0KHdsLT53bGMsIFdMQ19TRVRfTFJMLCBjb25mLT5sb25nX2ZyYW1lX21heF90eF9jb3VudCkKIAkJICAgIDwgMCkgewotCQkJV0xfRVJST1IoKCIlczogRXJyb3Igc2V0dGluZyBscmxcbiIsIF9fZnVuY19fKSk7CisJCQlXTF9FUlJPUigiJXM6IEVycm9yIHNldHRpbmcgbHJsXG4iLCBfX2Z1bmNfXyk7CiAJCQllcnIgPSAtRUlPOwogCQkJZ290byBjb25maWdfb3V0OwogCQl9CkBAIC00MzUsMzIgKzM0NSwyOSBAQAogCQkJc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKIAkJCXN0cnVjdCBpZWVlODAyMTFfYnNzX2NvbmYgKmluZm8sIHUzMiBjaGFuZ2VkKQogewotCXdsX2luZm9fdCAqd2wgPSBIV19UT19XTChodyk7CisJc3RydWN0IHdsX2luZm8gKndsID0gSFdfVE9fV0woaHcpOwogCWludCB2YWw7CiAKLSNpZmRlZiBXTENfSElHSF9PTkxZCi0JV0xfTE9DSyh3bCk7Ci0jZW5kaWYKIAogCWlmIChjaGFuZ2VkICYgQlNTX0NIQU5HRURfQVNTT0MpIHsKLQkJV0xfRVJST1IoKCJBc3NvY2lhdGVkOlx0JXNcbiIsIGluZm8tPmFzc29jID8gIlRydWUiIDogIkZhbHNlIikpOworCQlXTF9FUlJPUigiQXNzb2NpYXRlZDpcdCVzXG4iLCBpbmZvLT5hc3NvYyA/ICJUcnVlIiA6ICJGYWxzZSIpOwogCQkvKiBhc3NvY2lhdGlvbiBzdGF0dXMgY2hhbmdlZCAoYXNzb2NpYXRlZC9kaXNhc3NvY2lhdGVkKQogCQkgKiBhbHNvIGltcGxpZXMgYSBjaGFuZ2UgaW4gdGhlIEFJRC4KIAkJICovCiAJfQogCWlmIChjaGFuZ2VkICYgQlNTX0NIQU5HRURfRVJQX0NUU19QUk9UKSB7Ci0JCVdMX05PTkUoKCJVc2VfY3RzX3Byb3Q6XHQlcyBJbXBsZW1lbnQgbWVcbiIsCi0JCQkgaW5mby0+dXNlX2N0c19wcm90ID8gIlRydWUiIDogIkZhbHNlIikpOworCQlXTF9OT05FKCJVc2VfY3RzX3Byb3Q6XHQlcyBJbXBsZW1lbnQgbWVcbiIsCisJCQlpbmZvLT51c2VfY3RzX3Byb3QgPyAiVHJ1ZSIgOiAiRmFsc2UiKTsKIAkJLyogQ1RTIHByb3RlY3Rpb24gY2hhbmdlZCAqLwogCX0KIAlpZiAoY2hhbmdlZCAmIEJTU19DSEFOR0VEX0VSUF9QUkVBTUJMRSkgewotCQlXTF9OT05FKCgiU2hvcnQgcHJlYW1ibGU6XHQlcyBJbXBsZW1lbnQgbWVcbiIsCi0JCQkgaW5mby0+dXNlX3Nob3J0X3ByZWFtYmxlID8gIlRydWUiIDogIkZhbHNlIikpOworCQlXTF9OT05FKCJTaG9ydCBwcmVhbWJsZTpcdCVzIEltcGxlbWVudCBtZVxuIiwKKwkJCWluZm8tPnVzZV9zaG9ydF9wcmVhbWJsZSA/ICJUcnVlIiA6ICJGYWxzZSIpOwogCQkvKiBwcmVhbWJsZSBjaGFuZ2VkICovCiAJfQogCWlmIChjaGFuZ2VkICYgQlNTX0NIQU5HRURfRVJQX1NMT1QpIHsKLQkJV0xfTk9ORSgoIkNoYW5naW5nIHNob3J0IHNsb3Q6XHQlc1xuIiwKLQkJCSBpbmZvLT51c2Vfc2hvcnRfc2xvdCA/ICJUcnVlIiA6ICJGYWxzZSIpKTsKKwkJV0xfTk9ORSgiQ2hhbmdpbmcgc2hvcnQgc2xvdDpcdCVzXG4iLAorCQkJaW5mby0+dXNlX3Nob3J0X3Nsb3QgPyAiVHJ1ZSIgOiAiRmFsc2UiKTsKIAkJaWYgKGluZm8tPnVzZV9zaG9ydF9zbG90KQogCQkJdmFsID0gMTsKIAkJZWxzZQpAQCAtNDcwLDM5ICszNzcsMzYgQEAKIAl9CiAKIAlpZiAoY2hhbmdlZCAmIEJTU19DSEFOR0VEX0hUKSB7Ci0JCVdMX05PTkUoKCIlczogSFQgbW9kZSAtIEltcGxlbWVudCBtZVxuIiwgX19mdW5jX18pKTsKKwkJV0xfTk9ORSgiJXM6IEhUIG1vZGUgLSBJbXBsZW1lbnQgbWVcbiIsIF9fZnVuY19fKTsKIAkJLyogODAyLjExbiBwYXJhbWV0ZXJzIGNoYW5nZWQgKi8KIAl9CiAJaWYgKGNoYW5nZWQgJiBCU1NfQ0hBTkdFRF9CQVNJQ19SQVRFUykgewotCQlXTF9OT05FKCgiTmVlZCB0byBjaGFuZ2UgQmFzaWMgUmF0ZXM6XHQweCV4ISBJbXBsZW1lbnQgbWVcbiIsCi0JCQkgKHUzMikgaW5mby0+YmFzaWNfcmF0ZXMpKTsKKwkJV0xfTk9ORSgiTmVlZCB0byBjaGFuZ2UgQmFzaWMgUmF0ZXM6XHQweCV4ISBJbXBsZW1lbnQgbWVcbiIsCisJCQkodTMyKSBpbmZvLT5iYXNpY19yYXRlcyk7CiAJCS8qIEJhc2ljIHJhdGVzZXQgY2hhbmdlZCAqLwogCX0KIAlpZiAoY2hhbmdlZCAmIEJTU19DSEFOR0VEX0JFQUNPTl9JTlQpIHsKLQkJV0xfTk9ORSgoIkJlYWNvbiBJbnRlcnZhbDpcdCVkIEltcGxlbWVudCBtZVxuIiwKLQkJCSBpbmZvLT5iZWFjb25faW50KSk7CisJCVdMX05PTkUoIkJlYWNvbiBJbnRlcnZhbDpcdCVkIEltcGxlbWVudCBtZVxuIiwKKwkJCWluZm8tPmJlYWNvbl9pbnQpOwogCQkvKiBCZWFjb24gaW50ZXJ2YWwgY2hhbmdlZCAqLwogCX0KIAlpZiAoY2hhbmdlZCAmIEJTU19DSEFOR0VEX0JTU0lEKSB7Ci0JCVdMX05PTkUoKCJuZXcgQlNTSUQ6XHRhaWQgJWQgIGJzczolcE1cbiIsIGluZm8tPmFpZCwKLQkJCWluZm8tPmJzc2lkKSk7CisJCVdMX05PTkUoIm5ldyBCU1NJRDpcdGFpZCAlZCAgYnNzOiVwTVxuIiwKKwkJCWluZm8tPmFpZCwgaW5mby0+YnNzaWQpOwogCQkvKiBCU1NJRCBjaGFuZ2VkLCBmb3Igd2hhdGV2ZXIgcmVhc29uIChJQlNTIGFuZCBtYW5hZ2VkIG1vZGUpICovCiAJCS8qIEZJWE1FOiBuZWVkIHRvIHN0b3JlIGJzc2lkIGluIGJzc2NmZyAqLwogCQl3bGNfc2V0X2FkZHJtYXRjaCh3bC0+d2xjLCBSQ01fQlNTSURfT0ZGU0VULAogCQkJCSAgKHN0cnVjdCBldGhlcl9hZGRyICopaW5mby0+YnNzaWQpOwogCX0KIAlpZiAoY2hhbmdlZCAmIEJTU19DSEFOR0VEX0JFQUNPTikgewotCQlXTF9FUlJPUigoIkJTU19DSEFOR0VEX0JFQUNPTlxuIikpOworCQlXTF9FUlJPUigiQlNTX0NIQU5HRURfQkVBQ09OXG4iKTsKIAkJLyogQmVhY29uIGRhdGEgY2hhbmdlZCwgcmV0cmlldmUgbmV3IGJlYWNvbiAoYmVhY29uaW5nIG1vZGVzKSAqLwogCX0KIAlpZiAoY2hhbmdlZCAmIEJTU19DSEFOR0VEX0JFQUNPTl9FTkFCTEVEKSB7Ci0JCVdMX0VSUk9SKCgiQmVhY29uIGVuYWJsZWQ6XHQlc1xuIiwKLQkJCSAgaW5mby0+ZW5hYmxlX2JlYWNvbiA/ICJUcnVlIiA6ICJGYWxzZSIpKTsKKwkJV0xfRVJST1IoIkJlYWNvbiBlbmFibGVkOlx0JXNcbiIsCisJCQkgaW5mby0+ZW5hYmxlX2JlYWNvbiA/ICJUcnVlIiA6ICJGYWxzZSIpOwogCQkvKiBCZWFjb25pbmcgc2hvdWxkIGJlIGVuYWJsZWQvZGlzYWJsZWQgKGJlYWNvbmluZyBtb2RlcykgKi8KIAl9Ci0jaWZkZWYgV0xDX0hJR0hfT05MWQotCVdMX1VOTE9DSyh3bCk7Ci0jZW5kaWYKIAlyZXR1cm47CiB9CiAKQEAgLTUxMSwyNyArNDE1LDI0IEBACiAJCQl1bnNpZ25lZCBpbnQgY2hhbmdlZF9mbGFncywKIAkJCXVuc2lnbmVkIGludCAqdG90YWxfZmxhZ3MsIHU2NCBtdWx0aWNhc3QpCiB7Ci0jaWZuZGVmIFdMQ19ISUdIX09OTFkKLQl3bF9pbmZvX3QgKndsID0gaHctPnByaXY7Ci0jZW5kaWYKKwlzdHJ1Y3Qgd2xfaW5mbyAqd2wgPSBody0+cHJpdjsKIAogCWNoYW5nZWRfZmxhZ3MgJj0gTUFDX0ZJTFRFUlM7CiAJKnRvdGFsX2ZsYWdzICY9IE1BQ19GSUxURVJTOwogCWlmIChjaGFuZ2VkX2ZsYWdzICYgRklGX1BST01JU0NfSU5fQlNTKQotCQlXTF9FUlJPUigoIkZJRl9QUk9NSVNDX0lOX0JTU1xuIikpOworCQlXTF9FUlJPUigiRklGX1BST01JU0NfSU5fQlNTXG4iKTsKIAlpZiAoY2hhbmdlZF9mbGFncyAmIEZJRl9BTExNVUxUSSkKLQkJV0xfRVJST1IoKCJGSUZfQUxMTVVMVElcbiIpKTsKKwkJV0xfRVJST1IoIkZJRl9BTExNVUxUSVxuIik7CiAJaWYgKGNoYW5nZWRfZmxhZ3MgJiBGSUZfRkNTRkFJTCkKLQkJV0xfRVJST1IoKCJGSUZfRkNTRkFJTFxuIikpOworCQlXTF9FUlJPUigiRklGX0ZDU0ZBSUxcbiIpOwogCWlmIChjaGFuZ2VkX2ZsYWdzICYgRklGX1BMQ1BGQUlMKQotCQlXTF9FUlJPUigoIkZJRl9QTENQRkFJTFxuIikpOworCQlXTF9FUlJPUigiRklGX1BMQ1BGQUlMXG4iKTsKIAlpZiAoY2hhbmdlZF9mbGFncyAmIEZJRl9DT05UUk9MKQotCQlXTF9FUlJPUigoIkZJRl9DT05UUk9MXG4iKSk7CisJCVdMX0VSUk9SKCJGSUZfQ09OVFJPTFxuIik7CiAJaWYgKGNoYW5nZWRfZmxhZ3MgJiBGSUZfT1RIRVJfQlNTKQotCQlXTF9FUlJPUigoIkZJRl9PVEhFUl9CU1NcbiIpKTsKKwkJV0xfRVJST1IoIkZJRl9PVEhFUl9CU1NcbiIpOwogCWlmIChjaGFuZ2VkX2ZsYWdzICYgRklGX0JDTl9QUkJSRVNQX1BST01JU0MpIHsKLQkJV0xfTk9ORSgoIkZJRl9CQ05fUFJCUkVTUF9QUk9NSVNDXG4iKSk7Ci0jaWZuZGVmIFdMQ19ISUdIX09OTFkKKwkJV0xfTk9ORSgiRklGX0JDTl9QUkJSRVNQX1BST01JU0NcbiIpOwogCQlXTF9MT0NLKHdsKTsKIAkJaWYgKCp0b3RhbF9mbGFncyAmIEZJRl9CQ05fUFJCUkVTUF9QUk9NSVNDKSB7CiAJCQl3bC0+cHViLT5tYWM4MDIxMV9zdGF0ZSB8PSBNQUM4MDIxMV9QUk9NSVNDX0JDTlM7CkBAIC01NDEsNyArNDQyLDYgQEAKIAkJCXdsLT5wdWItPm1hYzgwMjExX3N0YXRlICY9IH5NQUM4MDIxMV9QUk9NSVNDX0JDTlM7CiAJCX0KIAkJV0xfVU5MT0NLKHdsKTsKLSNlbmRpZgogCX0KIAlyZXR1cm47CiB9CkBAIC01NDksMjUgKzQ0OSwyNSBAQAogc3RhdGljIGludAogd2xfb3BzX3NldF90aW0oc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsIGJvb2wgc2V0KQogewotCVdMX0VSUk9SKCgiJXM6IEVudGVyXG4iLCBfX2Z1bmNfXykpOworCVdMX0VSUk9SKCIlczogRW50ZXJcbiIsIF9fZnVuY19fKTsKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgd2xfb3BzX3N3X3NjYW5fc3RhcnQoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCiB7Ci0JV0xfTk9ORSgoIlNjYW4gU3RhcnRcbiIpKTsKKwlXTF9OT05FKCJTY2FuIFN0YXJ0XG4iKTsKIAlyZXR1cm47CiB9CiAKIHN0YXRpYyB2b2lkIHdsX29wc19zd19zY2FuX2NvbXBsZXRlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQogewotCVdMX05PTkUoKCJTY2FuIENvbXBsZXRlXG4iKSk7CisJV0xfTk9ORSgiU2NhbiBDb21wbGV0ZVxuIik7CiAJcmV0dXJuOwogfQogCiBzdGF0aWMgdm9pZCB3bF9vcHNfc2V0X3RzZihzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgdTY0IHRzZikKIHsKLQlXTF9FUlJPUigoIiVzOiBFbnRlclxuIiwgX19mdW5jX18pKTsKKwlXTF9FUlJPUigiJXM6IEVudGVyXG4iLCBfX2Z1bmNfXyk7CiAJcmV0dXJuOwogfQogCkBAIC01NzUsMTMgKzQ3NSwxMyBAQAogd2xfb3BzX2dldF9zdGF0cyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKIAkJIHN0cnVjdCBpZWVlODAyMTFfbG93X2xldmVsX3N0YXRzICpzdGF0cykKIHsKLQlXTF9FUlJPUigoIiVzOiBFbnRlclxuIiwgX19mdW5jX18pKTsKKwlXTF9FUlJPUigiJXM6IEVudGVyXG4iLCBfX2Z1bmNfXyk7CiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgd2xfb3BzX3NldF9ydHNfdGhyZXNob2xkKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCB1MzIgdmFsdWUpCiB7Ci0JV0xfRVJST1IoKCIlczogRW50ZXJcbiIsIF9fZnVuY19fKSk7CisJV0xfRVJST1IoIiVzOiBFbnRlclxuIiwgX19mdW5jX18pOwogCXJldHVybiAwOwogfQogCkBAIC01ODksMTAgKzQ4OSwxMCBAQAogd2xfb3BzX3N0YV9ub3RpZnkoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCiAJCSAgZW51bSBzdGFfbm90aWZ5X2NtZCBjbWQsIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEpCiB7Ci0JV0xfTk9ORSgoIiVzOiBFbnRlclxuIiwgX19mdW5jX18pKTsKKwlXTF9OT05FKCIlczogRW50ZXJcbiIsIF9fZnVuY19fKTsKIAlzd2l0Y2ggKGNtZCkgewogCWRlZmF1bHQ6Ci0JCVdMX0VSUk9SKCgiJXM6IFVrbm93biBjbWQgPSAlZFxuIiwgX19mdW5jX18sIGNtZCkpOworCQlXTF9FUlJPUigiJXM6IFVua25vd24gY21kID0gJWRcbiIsIF9fZnVuY19fLCBjbWQpOwogCQlicmVhazsKIAl9CiAJcmV0dXJuOwpAQCAtNjAyLDExICs1MDIsMTEgQEAKIHdsX29wc19jb25mX3R4KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCB1MTYgcXVldWUsCiAJICAgICAgIGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfdHhfcXVldWVfcGFyYW1zICpwYXJhbXMpCiB7Ci0Jd2xfaW5mb190ICp3bCA9IGh3LT5wcml2OworCXN0cnVjdCB3bF9pbmZvICp3bCA9IGh3LT5wcml2OwogCi0JV0xfTk9ORSgoIiVzOiBFbnRlciAoV01FIGNvbmZpZylcbiIsIF9fZnVuY19fKSk7Ci0JV0xfTk9ORSgoInF1ZXVlICVkLCB0eG9wICVkLCBjd21pbiAlZCwgY3dtYXggJWQsIGFpZnMgJWRcbiIsIHF1ZXVlLAotCQkgcGFyYW1zLT50eG9wLCBwYXJhbXMtPmN3X21pbiwgcGFyYW1zLT5jd19tYXgsIHBhcmFtcy0+YWlmcykpOworCVdMX05PTkUoIiVzOiBFbnRlciAoV01FIGNvbmZpZylcbiIsIF9fZnVuY19fKTsKKwlXTF9OT05FKCJxdWV1ZSAlZCwgdHhvcCAlZCwgY3dtaW4gJWQsIGN3bWF4ICVkLCBhaWZzICVkXG4iLCBxdWV1ZSwKKwkJIHBhcmFtcy0+dHhvcCwgcGFyYW1zLT5jd19taW4sIHBhcmFtcy0+Y3dfbWF4LCBwYXJhbXMtPmFpZnMpOwogCiAJV0xfTE9DSyh3bCk7CiAJd2xjX3dtZV9zZXRwYXJhbXMod2wtPndsYywgcXVldWUsICh2b2lkICopcGFyYW1zLCB0cnVlKTsKQEAgLTYxNyw3ICs1MTcsNyBAQAogCiBzdGF0aWMgdTY0IHdsX29wc19nZXRfdHNmKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQogewotCVdMX0VSUk9SKCgiJXM6IEVudGVyXG4iLCBfX2Z1bmNfXykpOworCVdMX0VSUk9SKCIlczogRW50ZXJcbiIsIF9fZnVuY19fKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNjI4LDExICs1MjgsMTEgQEAKIAlzdHJ1Y3Qgc2NiICpzY2I7CiAKIAlpbnQgaTsKLQl3bF9pbmZvX3QgKndsID0gaHctPnByaXY7CisJc3RydWN0IHdsX2luZm8gKndsID0gaHctPnByaXY7CiAKIAkvKiBJbml0IHRoZSBzY2IgKi8KIAlzY2IgPSAoc3RydWN0IHNjYiAqKXN0YS0+ZHJ2X3ByaXY7Ci0JYnplcm8oc2NiLCBzaXplb2Yoc3RydWN0IHNjYikpOworCW1lbXNldChzY2IsIDAsIHNpemVvZihzdHJ1Y3Qgc2NiKSk7CiAJZm9yIChpID0gMDsgaSA8IE5VTVBSSU87IGkrKykKIAkJc2NiLT5zZXFjdGxbaV0gPSAweEZGRkY7CiAJc2NiLT5zZXFjdGxfbm9ucW9zID0gMHhGRkZGOwpAQCAtNjQxLDIwICs1NDEsMTIgQEAKIAl3bC0+cHViLT5nbG9iYWxfc2NiID0gc2NiOwogCXdsLT5wdWItPmdsb2JhbF9hbXBkdSA9ICYoc2NiLT5zY2JfYW1wZHUpOwogCXdsLT5wdWItPmdsb2JhbF9hbXBkdS0+c2NiID0gc2NiOwotI2lmZGVmIFdMQ19ISUdIX09OTFkKLQl3bC0+cHViLT5nbG9iYWxfYW1wZHUtPm1heF9wZHUgPSBBTVBEVV9OVU1fTVBEVTsKLSNlbHNlCiAJd2wtPnB1Yi0+Z2xvYmFsX2FtcGR1LT5tYXhfcGR1ID0gMTY7Ci0jZW5kaWYKIAlwa3RxX2luaXQoJnNjYi0+c2NiX2FtcGR1LnR4cSwgQU1QRFVfTUFYX1NDQl9USUQsCiAJCSAgQU1QRFVfTUFYX1NDQl9USUQgKiBQS1RRX0xFTl9ERUZBVUxUKTsKIAogCXN0YS0+aHRfY2FwLmh0X3N1cHBvcnRlZCA9IHRydWU7Ci0jaWZkZWYgV0xDX0hJR0hfT05MWQotCXN0YS0+aHRfY2FwLmFtcGR1X2ZhY3RvciA9IEFNUERVX1JYX0ZBQ1RPUl8xNks7Ci0jZWxzZQogCXN0YS0+aHRfY2FwLmFtcGR1X2ZhY3RvciA9IEFNUERVX1JYX0ZBQ1RPUl82NEs7Ci0jZW5kaWYKIAlzdGEtPmh0X2NhcC5hbXBkdV9kZW5zaXR5ID0gQU1QRFVfREVGX01QRFVfREVOU0lUWTsKIAlzdGEtPmh0X2NhcC5jYXAgPSBJRUVFODAyMTFfSFRfQ0FQX0dSTl9GTEQgfAogCSAgICBJRUVFODAyMTFfSFRfQ0FQX1NHSV8yMCB8CkBAIC02NjgsNyArNTYwLDcgQEAKIHdsX3N0YV9yZW1vdmUoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCiAJICAgICAgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSkKIHsKLQlXTF9OT05FKCgiJXM6IEVudGVyXG4iLCBfX2Z1bmNfXykpOworCVdMX05PTkUoIiVzOiBFbnRlclxuIiwgX19mdW5jX18pOwogCXJldHVybiAwOwogfQogCkBAIC02ODEsMTkgKzU3MywxOSBAQAogI2lmIGRlZmluZWQoQkNNREJHKQogCXN0cnVjdCBzY2IgKnNjYiA9IChzdHJ1Y3Qgc2NiICopc3RhLT5kcnZfcHJpdjsKICNlbmRpZgotCXdsX2luZm9fdCAqd2wgPSBody0+cHJpdjsKKwlzdHJ1Y3Qgd2xfaW5mbyAqd2wgPSBody0+cHJpdjsKIAogCUFTU0VSVChzY2ItPm1hZ2ljID09IFNDQl9NQUdJQyk7CiAJc3dpdGNoIChhY3Rpb24pIHsKIAljYXNlIElFRUU4MDIxMV9BTVBEVV9SWF9TVEFSVDoKLQkJV0xfTk9ORSgoIiVzOiBhY3Rpb24gPSBJRUVFODAyMTFfQU1QRFVfUlhfU1RBUlRcbiIsIF9fZnVuY19fKSk7CisJCVdMX05PTkUoIiVzOiBhY3Rpb24gPSBJRUVFODAyMTFfQU1QRFVfUlhfU1RBUlRcbiIsIF9fZnVuY19fKTsKIAkJYnJlYWs7CiAJY2FzZSBJRUVFODAyMTFfQU1QRFVfUlhfU1RPUDoKLQkJV0xfTk9ORSgoIiVzOiBhY3Rpb24gPSBJRUVFODAyMTFfQU1QRFVfUlhfU1RPUFxuIiwgX19mdW5jX18pKTsKKwkJV0xfTk9ORSgiJXM6IGFjdGlvbiA9IElFRUU4MDIxMV9BTVBEVV9SWF9TVE9QXG4iLCBfX2Z1bmNfXyk7CiAJCWJyZWFrOwogCWNhc2UgSUVFRTgwMjExX0FNUERVX1RYX1NUQVJUOgogCQlpZiAoIXdsY19hZ2dyZWdhdGFibGUod2wtPndsYywgdGlkKSkgewotCQkJLyogV0xfRVJST1IoKCJTVEFSVDogdGlkICVkIGlzIG5vdCBhZ2cnIGFibGUsIHJldHVybiBGQUlMVVJFIHRvIHN0YWNrXG4iLCB0aWQpKTsgKi8KKwkJCS8qIFdMX0VSUk9SKCJTVEFSVDogdGlkICVkIGlzIG5vdCBhZ2cnIGFibGUsIHJldHVybiBGQUlMVVJFIHRvIHN0YWNrXG4iLCB0aWQpOyAqLwogCQkJcmV0dXJuIC0xOwogCQl9CiAJCS8qIFhYWDogVXNlIHRoZSBzdGFydGluZyBzZXF1ZW5jZSBudW1iZXIgcHJvdmlkZWQgLi4uICovCkBAIC03MDcsMjIgKzU5OSwxOCBAQAogCWNhc2UgSUVFRTgwMjExX0FNUERVX1RYX09QRVJBVElPTkFMOgogCQkvKiBOb3Qgc3VyZSB3aGF0IHRvIGRvIGhlcmUgKi8KIAkJLyogUG93ZXIgc2F2ZSB3YWtldXAgKi8KLQkJV0xfTk9ORSgoIiVzOiBhY3Rpb24gPSBJRUVFODAyMTFfQU1QRFVfVFhfT1BFUkFUSU9OQUxcbiIsCi0JCQkgX19mdW5jX18pKTsKKwkJV0xfTk9ORSgiJXM6IGFjdGlvbiA9IElFRUU4MDIxMV9BTVBEVV9UWF9PUEVSQVRJT05BTFxuIiwKKwkJCV9fZnVuY19fKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJV0xfRVJST1IoKCIlczogSW52YWxpZCBjb21tYW5kLCBpZ25vcmluZ1xuIiwgX19mdW5jX18pKTsKKwkJV0xfRVJST1IoIiVzOiBJbnZhbGlkIGNvbW1hbmQsIGlnbm9yaW5nXG4iLCBfX2Z1bmNfXyk7CiAJfQogCiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX29wcyB3bF9vcHMgPSB7Ci0jaWZkZWYgV0xDX0hJR0hfT05MWQotCS50eCA9IHdsX29wc190eF9ubCwKLSNlbHNlCiAJLnR4ID0gd2xfb3BzX3R4LAotI2VuZGlmCiAJLnN0YXJ0ID0gd2xfb3BzX3N0YXJ0LAogCS5zdG9wID0gd2xfb3BzX3N0b3AsCiAJLmFkZF9pbnRlcmZhY2UgPSB3bF9vcHNfYWRkX2ludGVyZmFjZSwKQEAgLTc0NCwxMCArNjMyLDEwIEBACiAJLmFtcGR1X2FjdGlvbiA9IHdsX2FtcGR1X2FjdGlvbiwKIH07CiAKLXN0YXRpYyBpbnQgd2xfc2V0X2hpbnQod2xfaW5mb190ICp3bCwgY2hhciAqYWJicmV2KQorc3RhdGljIGludCB3bF9zZXRfaGludChzdHJ1Y3Qgd2xfaW5mbyAqd2wsIGNoYXIgKmFiYnJldikKIHsKLQlXTF9FUlJPUigoIiVzOiBTZW5kaW5nIGNvdW50cnkgY29kZSAlYyVjIHRvIE1BQzgwMjExXG4iLCBfX2Z1bmNfXywKLQkJICBhYmJyZXZbMF0sIGFiYnJldlsxXSkpOworCVdMX0VSUk9SKCIlczogU2VuZGluZyBjb3VudHJ5IGNvZGUgJWMlYyB0byBNQUM4MDIxMVxuIiwKKwkJIF9fZnVuY19fLCBhYmJyZXZbMF0sIGFiYnJldlsxXSk7CiAJcmV0dXJuIHJlZ3VsYXRvcnlfaGludCh3bC0+cHViLT5pZWVlX2h3LT53aXBoeSwgYWJicmV2KTsKIH0KIApAQCAtNzYyLDExNyArNjUwLDYxIEBACiAgKiBhIHdhcm5pbmcgdGhhdCB0aGlzIGZ1bmN0aW9uIGlzIGRlZmluZWQgYnV0IG5vdCB1c2VkIGlmIHdlIGRlY2xhcmUKICAqIGl0IGFzIHN0YXRpYy4KICAqLwotc3RhdGljIHdsX2luZm9fdCAqd2xfYXR0YWNoKHUxNiB2ZW5kb3IsIHUxNiBkZXZpY2UsIHVuc2lnbmVkIGxvbmcgcmVncywKK3N0YXRpYyBzdHJ1Y3Qgd2xfaW5mbyAqd2xfYXR0YWNoKHUxNiB2ZW5kb3IsIHUxNiBkZXZpY2UsIHVuc2lnbmVkIGxvbmcgcmVncywKIAkJCSAgICB1aW50IGJ1c3R5cGUsIHZvaWQgKmJ0cGFyYW0sIHVpbnQgaXJxKQogewotCXdsX2luZm9fdCAqd2w7Ci0Jb3NsX3QgKm9zaDsKKwlzdHJ1Y3Qgd2xfaW5mbyAqd2w7CisJc3RydWN0IG9zbF9pbmZvICpvc2g7CiAJaW50IHVuaXQsIGVycjsKIAogCXVuc2lnbmVkIGxvbmcgYmFzZV9hZGRyOwogCXN0cnVjdCBpZWVlODAyMTFfaHcgKmh3OwogCXU4IHBlcm1bRVRIX0FMRU5dOwogCi0JdW5pdCA9IHdsX2ZvdW5kICsgaW5zdGFuY2VfYmFzZTsKKwl1bml0ID0gd2xfZm91bmQ7CiAJZXJyID0gMDsKIAogCWlmICh1bml0IDwgMCkgewotCQlXTF9FUlJPUigoIndsJWQ6IHVuaXQgbnVtYmVyIG92ZXJmbG93LCBleGl0aW5nXG4iLCB1bml0KSk7CisJCVdMX0VSUk9SKCJ3bCVkOiB1bml0IG51bWJlciBvdmVyZmxvdywgZXhpdGluZ1xuIiwgdW5pdCk7CiAJCXJldHVybiBOVUxMOwogCX0KIAotCWlmIChvbmVvbmx5ICYmICh1bml0ICE9IGluc3RhbmNlX2Jhc2UpKSB7Ci0JCVdMX0VSUk9SKCgid2wlZDogd2xfYXR0YWNoOiBvbmVvbmx5IGlzIHNldCwgZXhpdGluZ1xuIiwgdW5pdCkpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQkvKiBSZXF1aXJlcyBwa3R0YWcgZmVhdHVyZSAqLwotCW9zaCA9IG9zbF9hdHRhY2goYnRwYXJhbSwgYnVzdHlwZSwgdHJ1ZSk7CisJb3NoID0gb3NsX2F0dGFjaChidHBhcmFtLCBidXN0eXBlKTsKIAlBU1NFUlQob3NoKTsKIAotI2lmZGVmIFdMQ19ISUdIX09OTFkKLQlodyA9IGllZWU4MDIxMV9hbGxvY19odyhzaXplb2Yod2xfaW5mb190KSwgJndsX29wcyk7Ci0JaWYgKCFodykgewotCQlXTF9FUlJPUigoIiVzOiBpZWVlODAyMTFfYWxsb2NfaHcgZmFpbGVkXG4iLCBfX2Z1bmNfXykpOwotCQlBU1NFUlQoMCk7Ci0JfQotCi0JYnplcm8oaHctPnByaXYsIHNpemVvZigqd2wpKTsKLQl3bCA9IGh3LT5wcml2OwotI2Vsc2UKIAkvKiBhbGxvY2F0ZSBwcml2YXRlIGluZm8gKi8KIAlodyA9IHBjaV9nZXRfZHJ2ZGF0YShidHBhcmFtKTsJLyogYnRwYXJhbSA9PSBwZGV2ICovCiAJd2wgPSBody0+cHJpdjsKLSNlbmRpZgogCUFTU0VSVCh3bCk7CiAKLQl3bC0+bWFnaWMgPSBXTF9NQUdJQzsKIAl3bC0+b3NoID0gb3NoOwogCWF0b21pY19zZXQoJndsLT5jYWxsYmFja3MsIDApOwogCiAJLyogc2V0dXAgdGhlIGJvdHRvbSBoYWxmIGhhbmRsZXIgKi8KIAl0YXNrbGV0X2luaXQoJndsLT50YXNrbGV0LCB3bF9kcGMsICh1bnNpZ25lZCBsb25nKSB3bCk7CiAKLSNpZmRlZiBXTENfSElHSF9PTkxZCi0Jd2wtPnJwY190aCA9IGJjbV9ycGNfdHBfYXR0YWNoKG9zaCwgTlVMTCk7Ci0JaWYgKHdsLT5ycGNfdGggPT0gTlVMTCkgewotCQlXTF9FUlJPUigoIndsJWQ6ICVzOiBiY21fcnBjX3RwX2F0dGFjaCBmYWlsZWQhXG4iLCB1bml0LAotCQkJICBfX2Z1bmNfXykpOwotCQlnb3RvIGZhaWw7Ci0JfQogCi0Jd2wtPnJwYyA9IGJjbV9ycGNfYXR0YWNoKE5VTEwsIG9zaCwgd2wtPnJwY190aCk7Ci0JaWYgKHdsLT5ycGMgPT0gTlVMTCkgewotCQlXTF9FUlJPUigoIndsJWQ6ICVzOiBiY21fcnBjX2F0dGFjaCBmYWlsZWQhXG4iLCB1bml0LAotCQkJICBfX2Z1bmNfXykpOwotCQlnb3RvIGZhaWw7Ci0JfQotCi0JLyogaW5pdCB0eCB3b3JrIHF1ZXVlIGZvciB3bF9zdGFydC9zZW5kIHBrdDsgbm8gbmVlZCB0byBkZXN0cm95IHdvcmtpdGVtICAqLwotCUlOSVRfV09SSygmd2wtPnR4cV90YXNrLndvcmssICh3b3JrX2Z1bmNfdCkgd2xfc3RhcnRfdHhxd29yayk7Ci0Jd2wtPnR4cV90YXNrLmNvbnRleHQgPSB3bDsKLSNlbmRpZgkJCQkvKiBXTENfSElHSF9PTkxZICovCi0KLSNpZmRlZiBCQ01TRElPCi0JU0VUX0lFRUU4MDIxMV9ERVYoaHcsIHNkaW9tbWNfZGV2KTsKLSNlbmRpZgogCiAJYmFzZV9hZGRyID0gcmVnczsKIAogCWlmIChidXN0eXBlID09IFBDSV9CVVMpIHsKLQkJLyogcGlvbW9kZSBjYW4gYmUgb3ZlcndyaXR0ZW4gYnkgY29tbWFuZCBhcmd1bWVudCAqLwotCQl3bC0+cGlvbW9kZSA9IHBpb21vZGU7Ci0JCVdMX1RSQUNFKCgiUENJLyVzXG4iLCB3bC0+cGlvbW9kZSA/ICJQSU8iIDogIkRNQSIpKTsKKwkJd2wtPnBpb21vZGUgPSBmYWxzZTsKIAl9IGVsc2UgaWYgKGJ1c3R5cGUgPT0gUlBDX0JVUykgewogCQkvKiBEbyBub3RoaW5nICovCiAJfSBlbHNlIHsKIAkJYnVzdHlwZSA9IFBDSV9CVVM7Ci0JCVdMX1RSQUNFKCgiZm9yY2UgdG8gUENJXG4iKSk7CisJCVdMX1RSQUNFKCJmb3JjZSB0byBQQ0lcbiIpOwogCX0KIAl3bC0+YmNtX2J1c3R5cGUgPSBidXN0eXBlOwogCi0jaWZkZWYgV0xDX0hJR0hfT05MWQotCWlmICh3bC0+YmNtX2J1c3R5cGUgPT0gUlBDX0JVUykgewotCQl3bC0+cmVnc3ZhID0gKHZvaWQgKikwOwotCQlidHBhcmFtID0gd2wtPnJwYzsKLQl9IGVsc2UKLSNlbmRpZgogCXdsLT5yZWdzdmEgPSBpb3JlbWFwX25vY2FjaGUoYmFzZV9hZGRyLCBQQ0lfQkFSMF9XSU5TWik7CiAJaWYgKHdsLT5yZWdzdmEgPT0gTlVMTCkgewotCQlXTF9FUlJPUigoIndsJWQ6IGlvcmVtYXAoKSBmYWlsZWRcbiIsIHVuaXQpKTsKKwkJV0xfRVJST1IoIndsJWQ6IGlvcmVtYXAoKSBmYWlsZWRcbiIsIHVuaXQpOwogCQlnb3RvIGZhaWw7CiAJfQotI2lmZGVmIFdMQ19ISUdIX09OTFkKLQlzcGluX2xvY2tfaW5pdCgmd2wtPnJwY3FfbG9jayk7Ci0Jc3Bpbl9sb2NrX2luaXQoJndsLT50eHFfbG9jayk7Ci0KLQlzZW1hX2luaXQoJndsLT5zZW0sIDEpOwotI2Vsc2UKIAlzcGluX2xvY2tfaW5pdCgmd2wtPmxvY2spOwogCXNwaW5fbG9ja19pbml0KCZ3bC0+aXNyX2xvY2spOwotI2VuZGlmCiAKLSNpZm5kZWYgV0xDX0hJR0hfT05MWQogCS8qIHByZXBhcmUgdWNvZGUgKi8KIAlpZiAod2xfcmVxdWVzdF9mdyh3bCwgKHN0cnVjdCBwY2lfZGV2ICopYnRwYXJhbSkpIHsKIAkJcHJpbnRmKCIlczogRmFpbGVkIHRvIGZpbmQgZmlybXdhcmUgdXN1YWxseSBpbiAlc1xuIiwKQEAgLTg4MSwxNyArNzEzLDE0IEBACiAJCXdsX3JlbW92ZSgoc3RydWN0IHBjaV9kZXYgKilidHBhcmFtKTsKIAkJZ290byBmYWlsMTsKIAl9Ci0jZW5kaWYKIAogCS8qIGNvbW1vbiBsb2FkLXRpbWUgaW5pdGlhbGl6YXRpb24gKi8KIAl3bC0+d2xjID0gd2xjX2F0dGFjaCgodm9pZCAqKXdsLCB2ZW5kb3IsIGRldmljZSwgdW5pdCwgd2wtPnBpb21vZGUsIG9zaCwKIAkJCSAgICAgd2wtPnJlZ3N2YSwgd2wtPmJjbV9idXN0eXBlLCBidHBhcmFtLCAmZXJyKTsKLSNpZm5kZWYgV0xDX0hJR0hfT05MWQogCXdsX3JlbGVhc2VfZncod2wpOwotI2VuZGlmCiAJaWYgKCF3bC0+d2xjKSB7Ci0JCXByaW50ZigiJXM6ICVzIHdsY19hdHRhY2goKSBmYWlsZWQgd2l0aCBjb2RlICVkXG4iLAotCQkJS0JVSUxEX01PRE5BTUUsIEVQSV9WRVJTSU9OX1NUUiwgZXJyKTsKKwkJcHJpbnRmKCIlczogd2xjX2F0dGFjaCgpIGZhaWxlZCB3aXRoIGNvZGUgJWRcbiIsCisJCQlLQlVJTERfTU9ETkFNRSwgZXJyKTsKIAkJZ290byBmYWlsOwogCX0KIAl3bC0+cHViID0gd2xjX3B1Yih3bC0+d2xjKTsKQEAgLTkwMCw1MiArNzI5LDM1IEBACiAJQVNTRVJUKHdsLT5wdWItPmllZWVfaHcpOwogCUFTU0VSVCh3bC0+cHViLT5pZWVlX2h3LT5wcml2ID09IHdsKTsKIAotI2lmZGVmIFdMQ19ISUdIX09OTFkKLQlSRUdPUFNTRVQob3NoLCAob3NsX3JyZWdfZm5fdCkgd2xjX3JlZ19yZWFkLAotCQkgIChvc2xfd3JlZ19mbl90KSB3bGNfcmVnX3dyaXRlLCB3bC0+d2xjKTsKLQl3bC0+cnBjX2Rpc3BhdGNoX2N0eC5ycGMgPSB3bC0+cnBjOwotCXdsLT5ycGNfZGlzcGF0Y2hfY3R4LndsYyA9IHdsLT53bGM7Ci0JYmNtX3JwY19yeGNiX2luaXQod2wtPnJwYywgd2wsIHdsX3JwY19kaXNwYXRjaF9zY2hlZHVsZSwgd2wsCi0JCQkgIHdsX3JwY19kb3duLCBOVUxMLCBOVUxMKTsKLSNlbmRpZgkJCQkvKiBXTENfSElHSF9PTkxZICovCiAKLQlpZiAobm9tcGMpIHsKLQkJaWYgKHdsY19pb3Zhcl9zZXRpbnQod2wtPndsYywgIm1wYyIsIDApKSB7Ci0JCQlXTF9FUlJPUigoIndsJWQ6IEVycm9yIHNldHRpbmcgTVBDIHZhcmlhYmxlIHRvIDBcbiIsCi0JCQkJICB1bml0KSk7Ci0JCX0KKwlpZiAod2xjX2lvdmFyX3NldGludCh3bC0+d2xjLCAibXBjIiwgMCkpIHsKKwkJV0xfRVJST1IoIndsJWQ6IEVycm9yIHNldHRpbmcgTVBDIHZhcmlhYmxlIHRvIDBcbiIsIHVuaXQpOwogCX0KLSNpZmRlZiBCQ01TRElPCi0JLyogU2V0IFNESU8gZHJpdmUgc3RyZW5ndGggKi8KLQl3bGNfaW92YXJfc2V0aW50KHdsLT53bGMsICJzZF9kcml2ZXN0cmVuZ3RoIiwgc2RfZHJpdmVzdHJlbmd0aCk7Ci0jZW5kaWYKIAotI2lmZGVmIFdMQ19MT1cKIAkvKiByZWdpc3RlciBvdXIgaW50ZXJydXB0IGhhbmRsZXIgKi8KIAlpZiAocmVxdWVzdF9pcnEoaXJxLCB3bF9pc3IsIElSUUZfU0hBUkVELCBLQlVJTERfTU9ETkFNRSwgd2wpKSB7Ci0JCVdMX0VSUk9SKCgid2wlZDogcmVxdWVzdF9pcnEoKSBmYWlsZWRcbiIsIHVuaXQpKTsKKwkJV0xfRVJST1IoIndsJWQ6IHJlcXVlc3RfaXJxKCkgZmFpbGVkXG4iLCB1bml0KTsKIAkJZ290byBmYWlsOwogCX0KIAl3bC0+aXJxID0gaXJxOwotI2VuZGlmCQkJCS8qIFdMQ19MT1cgKi8KIAogCS8qIHJlZ2lzdGVyIG1vZHVsZSAqLwogCXdsY19tb2R1bGVfcmVnaXN0ZXIod2wtPnB1YiwgTlVMTCwgImxpbnV4Iiwgd2wsIE5VTEwsIHdsX2xpbnV4X3dhdGNoZG9nLAogCQkJICAgIE5VTEwpOwogCiAJaWYgKGllZWVfaHdfaW5pdChodykpIHsKLQkJV0xfRVJST1IoKCJ3bCVkOiAlczogaWVlZV9od19pbml0IGZhaWxlZCFcbiIsIHVuaXQsIF9fZnVuY19fKSk7CisJCVdMX0VSUk9SKCJ3bCVkOiAlczogaWVlZV9od19pbml0IGZhaWxlZCFcbiIsIHVuaXQsIF9fZnVuY19fKTsKIAkJZ290byBmYWlsOwogCX0KIAotCWJjb3B5KCZ3bC0+cHViLT5jdXJfZXRoZXJhZGRyLCBwZXJtLCBFVEhFUl9BRERSX0xFTik7CisJYmNvcHkoJndsLT5wdWItPmN1cl9ldGhlcmFkZHIsIHBlcm0sIEVUSF9BTEVOKTsKIAlBU1NFUlQoaXNfdmFsaWRfZXRoZXJfYWRkcihwZXJtKSk7CiAJU0VUX0lFRUU4MDIxMV9QRVJNX0FERFIoaHcsIHBlcm0pOwogCiAJZXJyID0gaWVlZTgwMjExX3JlZ2lzdGVyX2h3KGh3KTsKIAlpZiAoZXJyKSB7Ci0JCVdMX0VSUk9SKCgiJXM6IGllZWU4MDIxMV9yZWdpc3Rlcl9odyBmYWlsZWQsIHN0YXR1cyAlZFxuIiwKLQkJCSAgX19mdW5jX18sIGVycikpOworCQlXTF9FUlJPUigiJXM6IGllZWU4MDIxMV9yZWdpc3Rlcl9odyBmYWlsZWQsIHN0YXR1cyAlZFxuIiwKKwkJCSBfX2Z1bmNfXywgZXJyKTsKIAl9CiAKIAlpZiAod2wtPnB1Yi0+c3JvbV9jY29kZVswXSkKQEAgLTk1MywxOSArNzY1LDE0IEBACiAJZWxzZQogCQllcnIgPSB3bF9zZXRfaGludCh3bCwgIlVTIik7CiAJaWYgKGVycikgewotCQlXTF9FUlJPUigoIiVzOiByZWd1bGF0b3J5X2hpbnQgZmFpbGVkLCBzdGF0dXMgJWRcbiIsIF9fZnVuY19fLAotCQkJICBlcnIpKTsKKwkJV0xfRVJST1IoIiVzOiByZWd1bGF0b3J5X2hpbnQgZmFpbGVkLCBzdGF0dXMgJWRcbiIsCisJCQkgX19mdW5jX18sIGVycik7CiAJfQotI2lmbmRlZiBXTENfSElHSF9PTkxZCi0JV0xfRVJST1IoKCJ3bCVkOiBCcm9hZGNvbSBCQ000M3h4IDgwMi4xMSBNQUM4MDIxMSBEcml2ZXIgIgotCQkgIEVQSV9WRVJTSU9OX1NUUiAiICgiIFBIWV9WRVJTSU9OX1NUUiAiKSIsIHVuaXQpKTsKLSNlbHNlCi0JV0xfRVJST1IoKCJ3bCVkOiBCcm9hZGNvbSBCQ000M3h4IDgwMi4xMSBNQUM4MDIxMSBEcml2ZXIgIgotCQkgIEVQSV9WRVJTSU9OX1NUUiwgdW5pdCkpOwotI2VuZGlmCisJV0xfRVJST1IoIndsJWQ6IEJyb2FkY29tIEJDTTQzeHggODAyLjExIE1BQzgwMjExIERyaXZlciAoIiBQSFlfVkVSU0lPTl9TVFIgIikiLAorCQkgdW5pdCk7CiAKICNpZmRlZiBCQ01EQkcKLQlwcmludGYoIiAoQ29tcGlsZWQgaW4gIiBTUkNCQVNFICIgYXQgIiBfX1RJTUVfXyAiIG9uICIgX19EQVRFX18gIikiKTsKKwlwcmludGYoIiAoQ29tcGlsZWQgYXQgIiBfX1RJTUVfXyAiIG9uICIgX19EQVRFX18gIikiKTsKICNlbmRpZgkJCQkvKiBCQ01EQkcgKi8KIAlwcmludGYoIlxuIik7CiAKQEAgLTk3OCw1NCArNzg1LDYgQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAotI2lmZGVmIFdMQ19ISUdIX09OTFkKLXN0YXRpYyB2b2lkICp3bF9kYnVzX3Byb2JlX2NiKHZvaWQgKmFyZywgY29uc3QgY2hhciAqZGVzYywgdTMyIGJ1c3R5cGUsCi0JCQkgICAgICB1MzIgaGRybGVuKQotewotCXdsX2luZm9fdCAqd2w7Ci0JV0xfRVJST1IoKCIlczpcbiIsIF9fZnVuY19fKSk7Ci0KLQl3bCA9IHdsX2F0dGFjaChCQ01fRE5HTF9WSUQsIEJDTV9ETkdMX0JEQ19QSUQsICh1bnNpZ25lZCBsb25nKSBOVUxMLCBSUENfQlVTLAotCQlOVUxMLCAwKTsKLQlpZiAoIXdsKSB7Ci0JCVdMX0VSUk9SKCgiJXM6IHdsX2F0dGFjaCBmYWlsZWRcbiIsIF9fZnVuY19fKSk7Ci0JfQotCi0JLyogVGhpcyBpcyBsYXRlciBwYXNzZWQgdG8gd2xfZGJ1c19kaXNjb25uZWN0X2NiICovCi0JcmV0dXJuIHdsOwotfQotCi1zdGF0aWMgdm9pZCB3bF9kYnVzX2Rpc2Nvbm5lY3RfY2Iodm9pZCAqYXJnKQotewotCXdsX2luZm9fdCAqd2wgPSBhcmc7Ci0KLQlXTF9FUlJPUigoIiVzOlxuIiwgX19mdW5jX18pKTsKLQotCWlmICh3bCkgewotI2lmZGVmIFdMQ19ISUdIX09OTFkKLQkJaWYgKHdsLT5wdWItPmllZWVfaHcpIHsKLQkJCWllZWU4MDIxMV91bnJlZ2lzdGVyX2h3KHdsLT5wdWItPmllZWVfaHcpOwotCQkJV0xfRVJST1IoKCIlczogQmFjayBmcm9tIGRvd25cbiIsIF9fZnVuY19fKSk7Ci0JCX0KLQkJd2xjX2RldmljZV9yZW1vdmVkKHdsLT53bGMpOwotCQl3bGNfYm1hY19kbmdsX3JlYm9vdCh3bC0+cnBjKTsKLQkJYmNtX3JwY19kb3duKHdsLT5ycGMpOwotI2VuZGlmCi0JCVdMX0xPQ0sod2wpOwotCQl3bF9kb3duKHdsKTsKLQkJV0xfVU5MT0NLKHdsKTsKLSNpZmRlZiBXTENfSElHSF9PTkxZCi0JCWlmICh3bC0+cHViLT5pZWVlX2h3KSB7Ci0JCQlpZWVlODAyMTFfZnJlZV9odyh3bC0+cHViLT5pZWVlX2h3KTsKLQkJCVdMX0VSUk9SKCgiJXM6IEJhY2sgZnJvbSBpZWVlODAyMTFfZnJlZV9od1xuIiwKLQkJCQkgIF9fZnVuY19fKSk7Ci0JCQl3bC0+cHViLT5pZWVlX2h3ID0gTlVMTDsKLQkJfQotI2VuZGlmCi0JCXdsX2ZyZWUod2wpOwotCX0KLX0KLSNlbmRpZgkJCQkvKiBXTENfSElHSF9PTkxZICovCiAKIAogI2RlZmluZSBDSEFOMkdIWihjaGFubmVsLCBmcmVxZW5jeSwgY2hmbGFncykgIHsgXApAQCAtMTE2MywyOSArOTIyLDEzIEBACiAJCSAgIC5jYXAgPSBJRUVFODAyMTFfSFRfQ0FQX0dSTl9GTEQgfAogCQkgICBJRUVFODAyMTFfSFRfQ0FQX1NHSV8yMCB8CiAJCSAgIElFRUU4MDIxMV9IVF9DQVBfU0dJXzQwIHwgSUVFRTgwMjExX0hUX0NBUF80ME1IWl9JTlRPTEVSQU5ULAotI2lmZGVmIFdMQ19ISUdIX09OTFkKLQkJICAgLmh0X3N1cHBvcnRlZCA9IHRydWUsCi0JCSAgIC5hbXBkdV9mYWN0b3IgPSBBTVBEVV9SWF9GQUNUT1JfMTZLLAotI2Vsc2UKIAkJICAgLmh0X3N1cHBvcnRlZCA9IHRydWUsCiAJCSAgIC5hbXBkdV9mYWN0b3IgPSBBTVBEVV9SWF9GQUNUT1JfNjRLLAotI2VuZGlmCiAJCSAgIC5hbXBkdV9kZW5zaXR5ID0gQU1QRFVfREVGX01QRFVfREVOU0lUWSwKIAkJICAgLm1jcyA9IHsKIAkJCSAgIC8qIHBsYWNlaG9sZGVycyBmb3Igbm93ICovCi0jaWZkZWYgV0xDX0hJR0hfT05MWQotCQkJICAgLyoKLQkJCSAgICAqIHJ4X21hc2tbMF0gPSAweGZmIGJ5IGRlZmF1bHQKLQkJCSAgICAqIHJ4X21hc2tbMV0gPSAweGZmIGlmIG51bWJlciBvZiByeCBjaGFpbiA+PTIKLQkJCSAgICAqIHJ4X21hc2tbMl0gPSAweGZmIGlmIG51bWJlciBvZiByeCBjaGFpbiA+PTMKLQkJCSAgICAqIHJ4X21hc2tbNF0gPSAxIGlmIDQwTWh6IGlzIHN1cHBvcnRlZAotCQkJICAgICovCi0JCQkgICAucnhfbWFzayA9IHsweGZmLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwfSwKLQkJCSAgIC5yeF9oaWdoZXN0ID0gNzIsCS8qIG1heCByYXRlIG9mIHNpbmdsZSBzdHJlYW0gKi8KLSNlbHNlCiAJCQkgICAucnhfbWFzayA9IHsweGZmLCAweGZmLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwfSwKIAkJCSAgIC5yeF9oaWdoZXN0ID0gNTAwLAotI2VuZGlmCiAJCQkgICAudHhfcGFyYW1zID0gSUVFRTgwMjExX0hUX01DU19UWF9ERUZJTkVEfQogCQkgICB9CiB9OwpAQCAtMTIxMiw3ICs5NTUsNyBAQAogCiBzdGF0aWMgaW50IGllZWVfaHdfcmF0ZV9pbml0KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQogewotCXdsX2luZm9fdCAqd2wgPSBIV19UT19XTChodyk7CisJc3RydWN0IHdsX2luZm8gKndsID0gSFdfVE9fV0woaHcpOwogCWludCBoYXNfNWc7CiAJY2hhciBwaHlfbGlzdFs0XTsKIApAQCAtMTIyMiwyMCArOTY1LDE2IEBACiAJaHctPndpcGh5LT5iYW5kc1tJRUVFODAyMTFfQkFORF81R0haXSA9IE5VTEw7CiAKIAlpZiAod2xjX2dldCh3bC0+d2xjLCBXTENfR0VUX1BIWUxJU1QsIChpbnQgKikmcGh5X2xpc3QpIDwgMCkgewotCQlXTF9FUlJPUigoIlBoeSBsaXN0IGZhaWxlZFxuIikpOworCQlXTF9FUlJPUigiUGh5IGxpc3QgZmFpbGVkXG4iKTsKIAl9Ci0JV0xfTk9ORSgoIiVzOiBwaHlsaXN0ID0gJWNcbiIsIF9fZnVuY19fLCBwaHlfbGlzdFswXSkpOworCVdMX05PTkUoIiVzOiBwaHlsaXN0ID0gJWNcbiIsIF9fZnVuY19fLCBwaHlfbGlzdFswXSk7CiAKLSNpZm5kZWYgV0xDX0hJR0hfT05MWQogCWlmIChwaHlfbGlzdFswXSA9PSAnbicgfHwgcGh5X2xpc3RbMF0gPT0gJ2MnKSB7CiAJCWlmIChwaHlfbGlzdFswXSA9PSAnYycpIHsKIAkJCS8qIFNpbmdsZSBzdHJlYW0gKi8KIAkJCXdsX2JhbmRfMkdIel9ucGh5Lmh0X2NhcC5tY3MucnhfbWFza1sxXSA9IDA7CiAJCQl3bF9iYW5kXzJHSHpfbnBoeS5odF9jYXAubWNzLnJ4X2hpZ2hlc3QgPSA3MjsKIAkJfQotI2Vsc2UKLQlpZiAocGh5X2xpc3RbMF0gPT0gJ3MnKSB7Ci0jZW5kaWYKIAkJaHctPndpcGh5LT5iYW5kc1tJRUVFODAyMTFfQkFORF8yR0haXSA9ICZ3bF9iYW5kXzJHSHpfbnBoeTsKIAl9IGVsc2UgewogCQlCVUcoKTsKQEAgLTEyNDUsMTEgKzk4NCw3IEBACiAJLyogQXNzdW1lIGFsbCBiYW5kcyB1c2UgdGhlIHNhbWUgcGh5LiAgVHJ1ZSBmb3IgMTFuIGRldmljZXMuICovCiAJaWYgKE5CQU5EU19QVUIod2wtPnB1YikgPiAxKSB7CiAJCWhhc181ZysrOwotI2lmbmRlZiBXTENfSElHSF9PTkxZCiAJCWlmIChwaHlfbGlzdFswXSA9PSAnbicgfHwgcGh5X2xpc3RbMF0gPT0gJ2MnKSB7Ci0jZWxzZQotCQlpZiAocGh5X2xpc3RbMF0gPT0gJ3MnKSB7Ci0jZW5kaWYKIAkJCWh3LT53aXBoeS0+YmFuZHNbSUVFRTgwMjExX0JBTkRfNUdIWl0gPQogCQkJICAgICZ3bF9iYW5kXzVHSHpfbnBoeTsKIAkJfSBlbHNlIHsKQEAgLTEyNTcsNyArOTkyLDcgQEAKIAkJfQogCX0KIAotCVdMX05PTkUoKCIlczogMmdoeiA9ICVkLCA1Z2h6ID0gJWRcbiIsIF9fZnVuY19fLCAxLCBoYXNfNWcpKTsKKwlXTF9OT05FKCIlczogMmdoeiA9ICVkLCA1Z2h6ID0gJWRcbiIsIF9fZnVuY19fLCAxLCBoYXNfNWcpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xMjg4LDcgKzEwMjMsNiBAQAogCXJldHVybiBpZWVlX2h3X3JhdGVfaW5pdChodyk7CiB9CiAKLSNpZm5kZWYgQkNNU0RJTwogLyoqCiAgKiBkZXRlcm1pbmVzIGlmIGEgZGV2aWNlIGlzIGEgV0wgZGV2aWNlLCBhbmQgaWYgc28sIGF0dGFjaGVzIGl0LgogICoKQEAgLTEzMDAsMTUgKzEwMzQsMTUgQEAKIHdsX3BjaV9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKIHsKIAlpbnQgcmM7Ci0Jd2xfaW5mb190ICp3bDsKKwlzdHJ1Y3Qgd2xfaW5mbyAqd2w7CiAJc3RydWN0IGllZWU4MDIxMV9odyAqaHc7CiAJdTMyIHZhbDsKIAogCUFTU0VSVChwZGV2KTsKIAotCVdMX1RSQUNFKCgiJXM6IGJ1cyAlZCBzbG90ICVkIGZ1bmMgJWQgaXJxICVkXG4iLCBfX2Z1bmNfXywKLQkJICBwZGV2LT5idXMtPm51bWJlciwgUENJX1NMT1QocGRldi0+ZGV2Zm4pLAotCQkgIFBDSV9GVU5DKHBkZXYtPmRldmZuKSwgcGRldi0+aXJxKSk7CisJV0xfVFJBQ0UoIiVzOiBidXMgJWQgc2xvdCAlZCBmdW5jICVkIGlycSAlZFxuIiwKKwkJIF9fZnVuY19fLCBwZGV2LT5idXMtPm51bWJlciwgUENJX1NMT1QocGRldi0+ZGV2Zm4pLAorCQkgUENJX0ZVTkMocGRldi0+ZGV2Zm4pLCBwZGV2LT5pcnEpOwogCiAJaWYgKChwZGV2LT52ZW5kb3IgIT0gUENJX1ZFTkRPUl9JRF9CUk9BRENPTSkgfHwKIAkgICAgKCgocGRldi0+ZGV2aWNlICYgMHhmZjAwKSAhPSAweDQzMDApICYmCkBAIC0xMzE4LDkgKzEwNTIsOSBAQAogCiAJcmMgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKIAlpZiAocmMpIHsKLQkJV0xfRVJST1IoKCIlczogQ2Fubm90IGVuYWJsZSBkZXZpY2UgJWQtJWRfJWRcbiIsIF9fZnVuY19fLAotCQkJICBwZGV2LT5idXMtPm51bWJlciwgUENJX1NMT1QocGRldi0+ZGV2Zm4pLAotCQkJICBQQ0lfRlVOQyhwZGV2LT5kZXZmbikpKTsKKwkJV0xfRVJST1IoIiVzOiBDYW5ub3QgZW5hYmxlIGRldmljZSAlZC0lZF8lZFxuIiwKKwkJCSBfX2Z1bmNfXywgcGRldi0+YnVzLT5udW1iZXIsIFBDSV9TTE9UKHBkZXYtPmRldmZuKSwKKwkJCSBQQ0lfRlVOQyhwZGV2LT5kZXZmbikpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAJcGNpX3NldF9tYXN0ZXIocGRldik7CkBAIC0xMzI5LDkgKzEwNjMsOSBAQAogCWlmICgodmFsICYgMHgwMDAwZmYwMCkgIT0gMCkKIAkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwZGV2LCAweDQwLCB2YWwgJiAweGZmZmYwMGZmKTsKIAotCWh3ID0gaWVlZTgwMjExX2FsbG9jX2h3KHNpemVvZih3bF9pbmZvX3QpLCAmd2xfb3BzKTsKKwlodyA9IGllZWU4MDIxMV9hbGxvY19odyhzaXplb2Yoc3RydWN0IHdsX2luZm8pLCAmd2xfb3BzKTsKIAlpZiAoIWh3KSB7Ci0JCVdMX0VSUk9SKCgiJXM6IGllZWU4MDIxMV9hbGxvY19odyBmYWlsZWRcbiIsIF9fZnVuY19fKSk7CisJCVdMX0VSUk9SKCIlczogaWVlZTgwMjExX2FsbG9jX2h3IGZhaWxlZFxuIiwgX19mdW5jX18pOwogCQlyYyA9IC1FTk9NRU07CiAJCWdvdG8gZXJyXzE7CiAJfQpAQCAtMTM0MCwzNCArMTA3NCwzNCBAQAogCiAJcGNpX3NldF9kcnZkYXRhKHBkZXYsIGh3KTsKIAotCWJ6ZXJvKGh3LT5wcml2LCBzaXplb2YoKndsKSk7CisJbWVtc2V0KGh3LT5wcml2LCAwLCBzaXplb2YoKndsKSk7CiAKIAl3bCA9IHdsX2F0dGFjaChwZGV2LT52ZW5kb3IsIHBkZXYtPmRldmljZSwgcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDApLAogCQkgICAgICAgUENJX0JVUywgcGRldiwgcGRldi0+aXJxKTsKIAogCWlmICghd2wpIHsKLQkJV0xfRVJST1IoKCIlczogJXM6IHdsX2F0dGFjaCBmYWlsZWQhXG4iLAotCQkJS0JVSUxEX01PRE5BTUUsIF9fZnVuY19fKSk7CisJCVdMX0VSUk9SKCIlczogJXM6IHdsX2F0dGFjaCBmYWlsZWQhXG4iLAorCQkJIEtCVUlMRF9NT0ROQU1FLCBfX2Z1bmNfXyk7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIAlyZXR1cm4gMDsKICBlcnJfMToKLQlXTF9FUlJPUigoIiVzOiBlcnJfMTogTWFqb3IgaG9hcmthZ2VcbiIsIF9fZnVuY19fKSk7CisJV0xfRVJST1IoIiVzOiBlcnJfMTogTWFqb3IgaG9hcmthZ2VcbiIsIF9fZnVuY19fKTsKIAlyZXR1cm4gMDsKIH0KIAogI2lmZGVmIExJTlVYU1RBX1BTCiBzdGF0aWMgaW50IHdsX3N1c3BlbmQoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKIHsKLQl3bF9pbmZvX3QgKndsOworCXN0cnVjdCB3bF9pbmZvICp3bDsKIAlzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodzsKIAotCVdMX1RSQUNFKCgid2w6IHdsX3N1c3BlbmRcbiIpKTsKKwlXTF9UUkFDRSgid2w6IHdsX3N1c3BlbmRcbiIpOwogCiAJaHcgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CiAJd2wgPSBIV19UT19XTChodyk7CiAJaWYgKCF3bCkgewotCQlXTF9FUlJPUigoIndsOiB3bF9zdXNwZW5kOiBwY2lfZ2V0X2RydmRhdGEgZmFpbGVkXG4iKSk7CisJCVdMX0VSUk9SKCJ3bDogd2xfc3VzcGVuZDogcGNpX2dldF9kcnZkYXRhIGZhaWxlZFxuIik7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIApAQCAtMTM4MiwxNiArMTExNiwxNiBAQAogCiBzdGF0aWMgaW50IHdsX3Jlc3VtZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKIHsKLQl3bF9pbmZvX3QgKndsOworCXN0cnVjdCB3bF9pbmZvICp3bDsKIAlzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodzsKIAlpbnQgZXJyID0gMDsKIAl1MzIgdmFsOwogCi0JV0xfVFJBQ0UoKCJ3bDogd2xfcmVzdW1lXG4iKSk7CisJV0xfVFJBQ0UoIndsOiB3bF9yZXN1bWVcbiIpOwogCWh3ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOwogCXdsID0gSFdfVE9fV0woaHcpOwogCWlmICghd2wpIHsKLQkJV0xfRVJST1IoKCJ3bDogd2xfcmVzdW1lOiBwY2lfZ2V0X2RydmRhdGEgZmFpbGVkXG4iKSk7CisJCVdMX0VSUk9SKCJ3bDogd2xfcmVzdW1lOiBwY2lfZ2V0X2RydmRhdGEgZmFpbGVkXG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCkBAIC0xNDIxLDE3ICsxMTU1LDE3IEBACiAKIHN0YXRpYyB2b2lkIHdsX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKIHsKLQl3bF9pbmZvX3QgKndsOworCXN0cnVjdCB3bF9pbmZvICp3bDsKIAlzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodzsKIAogCWh3ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOwogCXdsID0gSFdfVE9fV0woaHcpOwogCWlmICghd2wpIHsKLQkJV0xfRVJST1IoKCJ3bDogd2xfcmVtb3ZlOiBwY2lfZ2V0X2RydmRhdGEgZmFpbGVkXG4iKSk7CisJCVdMX0VSUk9SKCJ3bDogd2xfcmVtb3ZlOiBwY2lfZ2V0X2RydmRhdGEgZmFpbGVkXG4iKTsKIAkJcmV0dXJuOwogCX0KIAlpZiAoIXdsY19jaGlwbWF0Y2gocGRldi0+dmVuZG9yLCBwZGV2LT5kZXZpY2UpKSB7Ci0JCVdMX0VSUk9SKCgid2w6IHdsX3JlbW92ZTogd2xjX2NoaXBtYXRjaCBmYWlsZWRcbiIpKTsKKwkJV0xfRVJST1IoIndsOiB3bF9yZW1vdmU6IHdsY19jaGlwbWF0Y2ggZmFpbGVkXG4iKTsKIAkJcmV0dXJuOwogCX0KIAlpZiAod2wtPndsYykgewpAQCAtMTQzOSw3ICsxMTczLDcgQEAKIAkJV0xfTE9DSyh3bCk7CiAJCXdsX2Rvd24od2wpOwogCQlXTF9VTkxPQ0sod2wpOwotCQlXTF9OT05FKCgiJXM6IERvd25cbiIsIF9fZnVuY19fKSk7CisJCVdMX05PTkUoIiVzOiBEb3duXG4iLCBfX2Z1bmNfXyk7CiAJfQogCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKIApAQCAtMTQ1OSw3ICsxMTkzLDYgQEAKICAucmVtb3ZlICAgPSBfX2RldmV4aXRfcCh3bF9yZW1vdmUpLAogIC5pZF90YWJsZSA9IHdsX2lkX3RhYmxlLAogfTsKLSNlbmRpZgkJCQkvKiAhQkNNU0RJTyAqLwogCiAvKioKICAqIFRoaXMgaXMgdGhlIG1haW4gZW50cnkgcG9pbnQgZm9yIHRoZSBXTCBkcml2ZXIuCkBAIC0xNDgwLDcgKzEyMTMsNiBAQAogCQlpZiAodmFyKQogCQkJd2xfbXNnX2xldmVsID0gc2ltcGxlX3N0cnRvdWwodmFyLCBOVUxMLCAwKTsKIAl9Ci0jaWZuZGVmIFdMQ19ISUdIX09OTFkKIAl7CiAJCWV4dGVybiB1MzIgcGh5aGFsX21zZ19sZXZlbDsKIApAQCAtMTQ5MiwyNSArMTIyNCwxMyBAQAogCQkJCXBoeWhhbF9tc2dfbGV2ZWwgPSBzaW1wbGVfc3RydG91bCh2YXIsIE5VTEwsIDApOwogCQl9CiAJfQotI2VuZGlmCQkJCS8qIFdMQ19ISUdIX09OTFkgKi8KICNlbmRpZgkJCQkvKiBCQ01EQkcgKi8KIAotI2lmbmRlZiBCQ01TRElPCiAJZXJyb3IgPSBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZ3bF9wY2lfZHJpdmVyKTsKIAlpZiAoIWVycm9yKQogCQlyZXR1cm4gMDsKIAotI2VuZGlmCQkJCS8qICFCQ01TRElPICovCiAKLSNpZmRlZiBXTENfSElHSF9PTkxZCi0JLyogQk1BQ19OT1RFOiBkZWZpbmUgaGFyZGNvZGUgbnVtYmVyLCB3aHkgTk9ERVZJQ0UgaXMgb2sgPyAqLwotCWVycm9yID0KLQkgICAgZGJ1c19yZWdpc3RlcihCQ01fRE5HTF9WSUQsIDAsIHdsX2RidXNfcHJvYmVfY2IsCi0JCQkgIHdsX2RidXNfZGlzY29ubmVjdF9jYiwgTlVMTCwgTlVMTCwgTlVMTCk7Ci0JaWYgKGVycm9yID09IERCVVNfRVJSX05PREVWSUNFKSB7Ci0JCWVycm9yID0gREJVU19PSzsKLQl9Ci0jZW5kaWYJCQkJLyogV0xDX0hJR0hfT05MWSAqLwogCiAJcmV0dXJuIGVycm9yOwogfQpAQCAtMTUyNCwxMyArMTI0NCw4IEBACiAgKi8KIHN0YXRpYyB2b2lkIF9fZXhpdCB3bF9tb2R1bGVfZXhpdCh2b2lkKQogewotI2lmbmRlZiBCQ01TRElPCiAJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZ3bF9wY2lfZHJpdmVyKTsKLSNlbmRpZgkJCQkvKiAhQkNNU0RJTyAqLwogCi0jaWZkZWYgV0xDX0hJR0hfT05MWQotCWRidXNfZGVyZWdpc3RlcigpOwotI2VuZGlmCQkJCS8qIFdMQ19ISUdIX09OTFkgKi8KIH0KIAogbW9kdWxlX2luaXQod2xfbW9kdWxlX2luaXQpOwpAQCAtMTU0MywxOSArMTI1OCwxNyBAQAogICogYnkgdGhlIHdsIHBhcmFtZXRlci4KICAqCiAgKi8KLXZvaWQgd2xfZnJlZSh3bF9pbmZvX3QgKndsKQordm9pZCB3bF9mcmVlKHN0cnVjdCB3bF9pbmZvICp3bCkKIHsKIAl3bF90aW1lcl90ICp0LCAqbmV4dDsKLQlvc2xfdCAqb3NoOworCXN0cnVjdCBvc2xfaW5mbyAqb3NoOwogCiAJQVNTRVJUKHdsKTsKLSNpZm5kZWYgV0xDX0hJR0hfT05MWQogCS8qIGZyZWUgdWNvZGUgZGF0YSAqLwogCWlmICh3bC0+ZncuZndfY250KQogCQl3bF91Y29kZV9kYXRhX2ZyZWUoKTsKIAlpZiAod2wtPmlycSkKIAkJZnJlZV9pcnEod2wtPmlycSwgd2wpOwotI2VuZGlmCiAKIAkvKiBraWxsIGRwYyAqLwogCXRhc2tsZXRfa2lsbCgmd2wtPnRhc2tsZXQpOwpAQCAtMTU5MywxMDMgKzEzMDYsNTAgQEAKIAkgKiB1bnJlZ2lzdGVyX25ldGRldigpIGNhbGxzIGdldF9zdGF0cygpIHdoaWNoIG1heSByZWFkIGNoaXAgcmVnaXN0ZXJzCiAJICogc28gd2UgY2Fubm90IHVubWFwIHRoZSBjaGlwIHJlZ2lzdGVycyB1bnRpbCBhZnRlciBjYWxsaW5nIHVucmVnaXN0ZXJfbmV0ZGV2KCkgLgogCSAqLwotCWlmICh3bC0+cmVnc3ZhICYmIEJVU1RZUEUod2wtPmJjbV9idXN0eXBlKSAhPSBTRElPX0JVUyAmJgotCSAgICBCVVNUWVBFKHdsLT5iY21fYnVzdHlwZSkgIT0gSlRBR19CVVMpIHsKKwlpZiAod2wtPnJlZ3N2YSAmJiB3bC0+YmNtX2J1c3R5cGUgIT0gU0RJT19CVVMgJiYKKwkgICAgd2wtPmJjbV9idXN0eXBlICE9IEpUQUdfQlVTKSB7CiAJCWlvdW5tYXAoKHZvaWQgKil3bC0+cmVnc3ZhKTsKIAl9CiAJd2wtPnJlZ3N2YSA9IE5VTEw7CiAKLSNpZmRlZiBXTENfSElHSF9PTkxZCi0Jd2xfcnBjcV9mcmVlKHdsKTsKLQotCXdsX3R4cV9mcmVlKHdsKTsKLQotCWlmICh3bC0+cnBjKSB7Ci0JCWJjbV9ycGNfZGV0YWNoKHdsLT5ycGMpOwotCQl3bC0+cnBjID0gTlVMTDsKLQl9Ci0KLQlpZiAod2wtPnJwY190aCkgewotCQliY21fcnBjX3RwX2RldGFjaCh3bC0+cnBjX3RoKTsKLQkJd2wtPnJwY190aCA9IE5VTEw7Ci0JfQotI2VuZGlmCQkJCS8qIFdMQ19ISUdIX09OTFkgKi8KIAogCW9zbF9kZXRhY2gob3NoKTsKIH0KIAotI2lmZGVmIFdMQ19MT1cKIC8qIHRyYW5zbWl0IGEgcGFja2V0ICovCi1zdGF0aWMgaW50IEJDTUZBU1RQQVRIIHdsX3N0YXJ0KHN0cnVjdCBza19idWZmICpza2IsIHdsX2luZm9fdCAqd2wpCitzdGF0aWMgaW50IEJDTUZBU1RQQVRIIHdsX3N0YXJ0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCB3bF9pbmZvICp3bCkKIHsKIAlpZiAoIXdsKQogCQlyZXR1cm4gLUVORVRET1dOOwogCiAJcmV0dXJuIHdsX3N0YXJ0X2ludCh3bCwgV0xfVE9fSFcod2wpLCBza2IpOwogfQotI2VuZGlmCQkJCS8qIFdMQ19MT1cgKi8KIAogc3RhdGljIGludCBCQ01GQVNUUEFUSAotd2xfc3RhcnRfaW50KHdsX2luZm9fdCAqd2wsIHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQord2xfc3RhcnRfaW50KHN0cnVjdCB3bF9pbmZvICp3bCwgc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHN0cnVjdCBza19idWZmICpza2IpCiB7Ci0jaWZkZWYgV0xDX0hJR0hfT05MWQotCVdMX0xPQ0sod2wpOwotI2VuZGlmCiAJd2xjX3NlbmRwa3RfbWFjODAyMTEod2wtPndsYywgc2tiLCBodyk7Ci0jaWZkZWYgV0xDX0hJR0hfT05MWQotCVdMX1VOTE9DSyh3bCk7Ci0jZW5kaWYKIAlyZXR1cm4gTkVUREVWX1RYX09LOwogfQogCi12b2lkIHdsX3R4Zmxvd2NvbnRyb2wod2xfaW5mb190ICp3bCwgc3RydWN0IHdsX2lmICp3bGlmLCBib29sIHN0YXRlLCBpbnQgcHJpbykKK3ZvaWQgd2xfdHhmbG93Y29udHJvbChzdHJ1Y3Qgd2xfaW5mbyAqd2wsIHN0cnVjdCB3bF9pZiAqd2xpZiwgYm9vbCBzdGF0ZSwKKwkJICAgICAgaW50IHByaW8pCiB7Ci0JV0xfRVJST1IoKCJTaG91bGRuJ3QgYmUgaGVyZSAlc1xuIiwgX19mdW5jX18pKTsKKwlXTF9FUlJPUigiU2hvdWxkbid0IGJlIGhlcmUgJXNcbiIsIF9fZnVuY19fKTsKIH0KIAotI2lmIGRlZmluZWQoV0xDX0hJR0hfT05MWSkKLS8qIFNjaGVkdWxlIGEgY29tcGxldGlvbiBoYW5kbGVyIHRvIHJ1biBhdCBzYWZlIHRpbWUgKi8KLXN0YXRpYyBpbnQKLXdsX3NjaGVkdWxlX3Rhc2sod2xfaW5mb190ICp3bCwgdm9pZCAoKmZuKSAoc3RydWN0IHdsX3Rhc2sgKnRhc2spLAotCQkgdm9pZCAqY29udGV4dCkKK3ZvaWQgd2xfaW5pdChzdHJ1Y3Qgd2xfaW5mbyAqd2wpCiB7Ci0Jd2xfdGFza190ICp0YXNrOwotCi0JV0xfVFJBQ0UoKCJ3bCVkOiB3bF9zY2hlZHVsZV90YXNrXG4iLCB3bC0+cHViLT51bml0KSk7Ci0KLQl0YXNrID0ga21hbGxvYyhzaXplb2Yod2xfdGFza190KSwgR0ZQX0FUT01JQyk7Ci0JaWYgKCF0YXNrKSB7Ci0JCVdMX0VSUk9SKCgid2wlZDogd2xfc2NoZWR1bGVfdGFzazogb3V0IG9mIG1lbW9yeVxuIiwgd2wtPnB1Yi0+dW5pdCkpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQlJTklUX1dPUksoJnRhc2stPndvcmssICh3b3JrX2Z1bmNfdCkgZm4pOwotCXRhc2stPmNvbnRleHQgPSBjb250ZXh0OwotCi0JaWYgKCFzY2hlZHVsZV93b3JrKCZ0YXNrLT53b3JrKSkgewotCQlXTF9FUlJPUigoIndsJWQ6IHNjaGVkdWxlX3dvcmsoKSBmYWlsZWRcbiIsIHdsLT5wdWItPnVuaXQpKTsKLQkJa2ZyZWUodGFzayk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCWF0b21pY19pbmMoJndsLT5jYWxsYmFja3MpOwotCi0JcmV0dXJuIDA7Ci19Ci0jZW5kaWYJCQkJLyogZGVmaW5lZChXTENfSElHSF9PTkxZKSAqLwotCi12b2lkIHdsX2luaXQod2xfaW5mb190ICp3bCkKLXsKLQlXTF9UUkFDRSgoIndsJWQ6IHdsX2luaXRcbiIsIHdsLT5wdWItPnVuaXQpKTsKKwlXTF9UUkFDRSgid2wlZDogd2xfaW5pdFxuIiwgd2wtPnB1Yi0+dW5pdCk7CiAKIAl3bF9yZXNldCh3bCk7CiAKIAl3bGNfaW5pdCh3bC0+d2xjKTsKIH0KIAotdWludCB3bF9yZXNldCh3bF9pbmZvX3QgKndsKQordWludCB3bF9yZXNldChzdHJ1Y3Qgd2xfaW5mbyAqd2wpCiB7Ci0JV0xfVFJBQ0UoKCJ3bCVkOiB3bF9yZXNldFxuIiwgd2wtPnB1Yi0+dW5pdCkpOworCVdMX1RSQUNFKCJ3bCVkOiB3bF9yZXNldFxuIiwgd2wtPnB1Yi0+dW5pdCk7CiAKIAl3bGNfcmVzZXQod2wtPndsYyk7CiAKQEAgLTE3MDMsMjUgKzEzNjMsMjIgQEAKICAqIFRoZXNlIGFyZSBpbnRlcnJ1cHQgb24vb2ZmIGVudHJ5IHBvaW50cy4gRGlzYWJsZSBpbnRlcnJ1cHRzCiAgKiBkdXJpbmcgaW50ZXJydXB0IHN0YXRlIHRyYW5zaXRpb24uCiAgKi8KLXZvaWQgQkNNRkFTVFBBVEggd2xfaW50cnNvbih3bF9pbmZvX3QgKndsKQordm9pZCBCQ01GQVNUUEFUSCB3bF9pbnRyc29uKHN0cnVjdCB3bF9pbmZvICp3bCkKIHsKLSNpZiBkZWZpbmVkKFdMQ19MT1cpCiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCUlOVF9MT0NLKHdsLCBmbGFncyk7CiAJd2xjX2ludHJzb24od2wtPndsYyk7CiAJSU5UX1VOTE9DSyh3bCwgZmxhZ3MpOwotI2VuZGlmCQkJCS8qIFdMQ19MT1cgKi8KIH0KIAotYm9vbCB3bF9hbGxvY19kbWFfcmVzb3VyY2VzKHdsX2luZm9fdCAqd2wsIHVpbnQgYWRkcndpZHRoKQorYm9vbCB3bF9hbGxvY19kbWFfcmVzb3VyY2VzKHN0cnVjdCB3bF9pbmZvICp3bCwgdWludCBhZGRyd2lkdGgpCiB7CiAJcmV0dXJuIHRydWU7CiB9CiAKLXUzMiBCQ01GQVNUUEFUSCB3bF9pbnRyc29mZih3bF9pbmZvX3QgKndsKQordTMyIEJDTUZBU1RQQVRIIHdsX2ludHJzb2ZmKHN0cnVjdCB3bF9pbmZvICp3bCkKIHsKLSNpZiBkZWZpbmVkKFdMQ19MT1cpCiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAl1MzIgc3RhdHVzOwogCkBAIC0xNzI5LDIzICsxMzg2LDE4IEBACiAJc3RhdHVzID0gd2xjX2ludHJzb2ZmKHdsLT53bGMpOwogCUlOVF9VTkxPQ0sod2wsIGZsYWdzKTsKIAlyZXR1cm4gc3RhdHVzOwotI2Vsc2UKLQlyZXR1cm4gMDsKLSNlbmRpZgkJCQkvKiBXTENfTE9XICovCiB9CiAKLXZvaWQgd2xfaW50cnNyZXN0b3JlKHdsX2luZm9fdCAqd2wsIHUzMiBtYWNpbnRtYXNrKQordm9pZCB3bF9pbnRyc3Jlc3RvcmUoc3RydWN0IHdsX2luZm8gKndsLCB1MzIgbWFjaW50bWFzaykKIHsKLSNpZiBkZWZpbmVkKFdMQ19MT1cpCiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCUlOVF9MT0NLKHdsLCBmbGFncyk7CiAJd2xjX2ludHJzcmVzdG9yZSh3bC0+d2xjLCBtYWNpbnRtYXNrKTsKIAlJTlRfVU5MT0NLKHdsLCBmbGFncyk7Ci0jZW5kaWYJCQkJLyogV0xDX0xPVyAqLwogfQogCi1pbnQgd2xfdXAod2xfaW5mb190ICp3bCkKK2ludCB3bF91cChzdHJ1Y3Qgd2xfaW5mbyAqd2wpCiB7CiAJaW50IGVycm9yID0gMDsKIApAQCAtMTc1Nyw3ICsxNDA5LDcgQEAKIAlyZXR1cm4gZXJyb3I7CiB9CiAKLXZvaWQgd2xfZG93bih3bF9pbmZvX3QgKndsKQordm9pZCB3bF9kb3duKHN0cnVjdCB3bF9pbmZvICp3bCkKIHsKIAl1aW50IGNhbGxiYWNrcywgcmV0X3ZhbCA9IDA7CiAKQEAgLTE3NjgsMjQgKzE0MjAsMjEgQEAKIAkvKiB3YWl0IGZvciBkb3duIGNhbGxiYWNrcyB0byBjb21wbGV0ZSAqLwogCVdMX1VOTE9DSyh3bCk7CiAKLSNpZm5kZWYgV0xDX0hJR0hfT05MWQogCS8qIEZvciBISUdIX29ubHkgZHJpdmVyLCBpdCdzIGltcG9ydGFudCB0byBhY3R1YWxseSBzY2hlZHVsZSBvdGhlciB3b3JrLAogCSAqIG5vdCBqdXN0IHNwaW4gd2FpdCBzaW5jZSBldmVyeXRoaW5nIHJ1bnMgYXQgc2NoZWR1bGUgbGV2ZWwKIAkgKi8KIAlTUElOV0FJVCgoYXRvbWljX3JlYWQoJndsLT5jYWxsYmFja3MpID4gY2FsbGJhY2tzKSwgMTAwICogMTAwMCk7Ci0jZW5kaWYJCQkJLyogV0xDX0hJR0hfT05MWSAqLwogCiAJV0xfTE9DSyh3bCk7CiB9CiAKIGlycXJldHVybl90IEJDTUZBU1RQQVRIIHdsX2lzcihpbnQgaXJxLCB2b2lkICpkZXZfaWQpCiB7Ci0jaWYgZGVmaW5lZChXTENfTE9XKQotCXdsX2luZm9fdCAqd2w7CisJc3RydWN0IHdsX2luZm8gKndsOwogCWJvb2wgb3Vycywgd2FudGRwYzsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0Jd2wgPSAod2xfaW5mb190ICopIGRldl9pZDsKKwl3bCA9IChzdHJ1Y3Qgd2xfaW5mbyAqKSBkZXZfaWQ7CiAKIAlXTF9JU1JMT0NLKHdsLCBmbGFncyk7CiAKQEAgLTE4MDUsMTcgKzE0NTQsMTMgQEAKIAlXTF9JU1JVTkxPQ0sod2wsIGZsYWdzKTsKIAogCXJldHVybiBJUlFfUkVUVkFMKG91cnMpOwotI2Vsc2UKLQlyZXR1cm4gSVJRX1JFVFZBTCgwKTsKLSNlbmRpZgkJCQkvKiBXTENfTE9XICovCiB9CiAKIHN0YXRpYyB2b2lkIEJDTUZBU1RQQVRIIHdsX2RwYyh1bnNpZ25lZCBsb25nIGRhdGEpCiB7Ci0jaWZkZWYgV0xDX0xPVwotCXdsX2luZm9fdCAqd2w7CisJc3RydWN0IHdsX2luZm8gKndsOwogCi0Jd2wgPSAod2xfaW5mb190ICopIGRhdGE7CisJd2wgPSAoc3RydWN0IHdsX2luZm8gKikgZGF0YTsKIAogCVdMX0xPQ0sod2wpOwogCkBAIC0xODQ2LDIwICsxNDkxLDE5IEBACiAKICBkb25lOgogCVdMX1VOTE9DSyh3bCk7Ci0jZW5kaWYJCQkJLyogV0xDX0xPVyAqLwogfQogCi1zdGF0aWMgdm9pZCB3bF9saW5rX3VwKHdsX2luZm9fdCAqd2wsIGNoYXIgKmlmbmFtZSkKK3N0YXRpYyB2b2lkIHdsX2xpbmtfdXAoc3RydWN0IHdsX2luZm8gKndsLCBjaGFyICppZm5hbWUpCiB7Ci0JV0xfRVJST1IoKCJ3bCVkOiBsaW5rIHVwICglcylcbiIsIHdsLT5wdWItPnVuaXQsIGlmbmFtZSkpOworCVdMX0VSUk9SKCJ3bCVkOiBsaW5rIHVwICglcylcbiIsIHdsLT5wdWItPnVuaXQsIGlmbmFtZSk7CiB9CiAKLXN0YXRpYyB2b2lkIHdsX2xpbmtfZG93bih3bF9pbmZvX3QgKndsLCBjaGFyICppZm5hbWUpCitzdGF0aWMgdm9pZCB3bF9saW5rX2Rvd24oc3RydWN0IHdsX2luZm8gKndsLCBjaGFyICppZm5hbWUpCiB7Ci0JV0xfRVJST1IoKCJ3bCVkOiBsaW5rIGRvd24gKCVzKVxuIiwgd2wtPnB1Yi0+dW5pdCwgaWZuYW1lKSk7CisJV0xfRVJST1IoIndsJWQ6IGxpbmsgZG93biAoJXMpXG4iLCB3bC0+cHViLT51bml0LCBpZm5hbWUpOwogfQogCi12b2lkIHdsX2V2ZW50KHdsX2luZm9fdCAqd2wsIGNoYXIgKmlmbmFtZSwgd2xjX2V2ZW50X3QgKmUpCit2b2lkIHdsX2V2ZW50KHN0cnVjdCB3bF9pbmZvICp3bCwgY2hhciAqaWZuYW1lLCB3bGNfZXZlbnRfdCAqZSkKIHsKIAogCXN3aXRjaCAoZS0+ZXZlbnQuZXZlbnRfdHlwZSkgewpAQCAtMTg3NywxMiArMTUyMSw3IEBACiAKIHN0YXRpYyB2b2lkIHdsX3RpbWVyKHVuc2lnbmVkIGxvbmcgZGF0YSkKIHsKLSNpZm5kZWYgV0xDX0hJR0hfT05MWQogCV93bF90aW1lcigod2xfdGltZXJfdCAqKSBkYXRhKTsKLSNlbHNlCi0Jd2xfdGltZXJfdCAqdCA9ICh3bF90aW1lcl90ICopIGRhdGE7Ci0Jd2xfc2NoZWR1bGVfdGFzayh0LT53bCwgd2xfdGltZXJfdGFzaywgdCk7Ci0jZW5kaWYJCQkJLyogV0xDX0hJR0hfT05MWSAqLwogfQogCiBzdGF0aWMgdm9pZCBfd2xfdGltZXIod2xfdGltZXJfdCAqdCkKQEAgLTE5MDYsMTggKzE1NDUsMTggQEAKIAlXTF9VTkxPQ0sodC0+d2wpOwogfQogCi13bF90aW1lcl90ICp3bF9pbml0X3RpbWVyKHdsX2luZm9fdCAqd2wsIHZvaWQgKCpmbikgKHZvaWQgKmFyZyksIHZvaWQgKmFyZywKK3dsX3RpbWVyX3QgKndsX2luaXRfdGltZXIoc3RydWN0IHdsX2luZm8gKndsLCB2b2lkICgqZm4pICh2b2lkICphcmcpLCB2b2lkICphcmcsCiAJCQkgIGNvbnN0IGNoYXIgKm5hbWUpCiB7CiAJd2xfdGltZXJfdCAqdDsKIAogCXQgPSBrbWFsbG9jKHNpemVvZih3bF90aW1lcl90KSwgR0ZQX0FUT01JQyk7CiAJaWYgKCF0KSB7Ci0JCVdMX0VSUk9SKCgid2wlZDogd2xfaW5pdF90aW1lcjogb3V0IG9mIG1lbW9yeVxuIiwgd2wtPnB1Yi0+dW5pdCkpOworCQlXTF9FUlJPUigid2wlZDogd2xfaW5pdF90aW1lcjogb3V0IG9mIG1lbW9yeVxuIiwgd2wtPnB1Yi0+dW5pdCk7CiAJCXJldHVybiAwOwogCX0KIAotCWJ6ZXJvKHQsIHNpemVvZih3bF90aW1lcl90KSk7CisJbWVtc2V0KHQsIDAsIHNpemVvZih3bF90aW1lcl90KSk7CiAKIAlpbml0X3RpbWVyKCZ0LT50aW1lcik7CiAJdC0+dGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSB0OwpAQCAtMTk0MCwxMiArMTU3OSwxMiBAQAogLyogQk1BQ19OT1RFOiBBZGQgdGltZXIgYWRkcyBvbmx5IHRoZSBrZXJuZWwgdGltZXIgc2luY2UgaXQncyBnb2luZyB0byBiZSBtb3JlIGFjY3VyYXRlCiAgKiBhcyB3ZWxsIGFzIGl0J3MgZWFzaWVyIHRvIG1ha2UgaXQgcGVyaW9kaWMKICAqLwotdm9pZCB3bF9hZGRfdGltZXIod2xfaW5mb190ICp3bCwgd2xfdGltZXJfdCAqdCwgdWludCBtcywgaW50IHBlcmlvZGljKQordm9pZCB3bF9hZGRfdGltZXIoc3RydWN0IHdsX2luZm8gKndsLCB3bF90aW1lcl90ICp0LCB1aW50IG1zLCBpbnQgcGVyaW9kaWMpCiB7CiAjaWZkZWYgQkNNREJHCiAJaWYgKHQtPnNldCkgewotCQlXTF9FUlJPUigoIiVzOiBBbHJlYWR5IHNldC4gTmFtZTogJXMsIHBlciAlZFxuIiwKLQkJCSAgX19mdW5jX18sIHQtPm5hbWUsIHBlcmlvZGljKSk7CisJCVdMX0VSUk9SKCIlczogQWxyZWFkeSBzZXQuIE5hbWU6ICVzLCBwZXIgJWRcbiIsCisJCQkgX19mdW5jX18sIHQtPm5hbWUsIHBlcmlvZGljKTsKIAl9CiAjZW5kaWYKIAlBU1NFUlQoIXQtPnNldCk7CkBAIC0xOTYwLDcgKzE1OTksNyBAQAogfQogCiAvKiByZXR1cm4gdHJ1ZSBpZiB0aW1lciBzdWNjZXNzZnVsbHkgZGVsZXRlZCwgZmFsc2UgaWYgc3RpbGwgcGVuZGluZyAqLwotYm9vbCB3bF9kZWxfdGltZXIod2xfaW5mb190ICp3bCwgd2xfdGltZXJfdCAqdCkKK2Jvb2wgd2xfZGVsX3RpbWVyKHN0cnVjdCB3bF9pbmZvICp3bCwgd2xfdGltZXJfdCAqdCkKIHsKIAlpZiAodC0+c2V0KSB7CiAJCXQtPnNldCA9IGZhbHNlOwpAQCAtMTk3Myw3ICsxNjEyLDcgQEAKIAlyZXR1cm4gdHJ1ZTsKIH0KIAotdm9pZCB3bF9mcmVlX3RpbWVyKHdsX2luZm9fdCAqd2wsIHdsX3RpbWVyX3QgKnQpCit2b2lkIHdsX2ZyZWVfdGltZXIoc3RydWN0IHdsX2luZm8gKndsLCB3bF90aW1lcl90ICp0KQogewogCXdsX3RpbWVyX3QgKnRtcDsKIApAQCAtMjAwOSw3ICsxNjQ4LDcgQEAKIAogc3RhdGljIGludCB3bF9saW51eF93YXRjaGRvZyh2b2lkICpjdHgpCiB7Ci0Jd2xfaW5mb190ICp3bCA9ICh3bF9pbmZvX3QgKikgY3R4OworCXN0cnVjdCB3bF9pbmZvICp3bCA9IChzdHJ1Y3Qgd2xfaW5mbyAqKSBjdHg7CiAJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzID0gTlVMTDsKIAl1aW50IGlkOwogCS8qIHJlZnJlc2ggc3RhdHMgKi8KQEAgLTIwNDksMjMzICsxNjg4LDEyIEBACiAJdTMyIGlkeDsKIH07CiAKLSNpZmRlZiBXTENfSElHSF9PTkxZCi1zdGF0aWMgdm9pZCB3bF9ycGNfZG93bih2b2lkICp3bGgpCi17Ci0Jd2xfaW5mb190ICp3bCA9ICh3bF9pbmZvX3QgKikgKHdsaCk7Ci0KLQl3bGNfZGV2aWNlX3JlbW92ZWQod2wtPndsYyk7Ci0KLQl3bF9ycGNxX2ZyZWUod2wpOwotfQotCi1zdGF0aWMgaW50IEJDTUZBU1RQQVRIIHdsX3N0YXJ0KHN0cnVjdCBza19idWZmICpza2IsIHdsX2luZm9fdCAqd2wpCi17Ci0KLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc2tiLT5wcmV2ID0gTlVMTDsKLQotCS8qIExvY2sgdGhlIHF1ZXVlIGFzIHRhc2tsZXQgY291bGQgYmUgcnVubmluZyBhdCB0aGlzIHRpbWUgKi8KLQlUWFFfTE9DSyh3bCwgZmxhZ3MpOwotCWlmICh3bC0+dHhxX2hlYWQgPT0gTlVMTCkKLQkJd2wtPnR4cV9oZWFkID0gc2tiOwotCWVsc2UgewotCQl3bC0+dHhxX3RhaWwtPnByZXYgPSBza2I7Ci0JfQotCXdsLT50eHFfdGFpbCA9IHNrYjsKLQotCWlmICh3bC0+dHhxX2Rpc3BhdGNoZWQgPT0gZmFsc2UpIHsKLQkJd2wtPnR4cV9kaXNwYXRjaGVkID0gdHJ1ZTsKLQotCQlpZiAoc2NoZWR1bGVfd29yaygmd2wtPnR4cV90YXNrLndvcmspKSB7Ci0JCQlhdG9taWNfaW5jKCZ3bC0+Y2FsbGJhY2tzKTsKLQkJfSBlbHNlIHsKLQkJCVdMX0VSUk9SKCgid2wlZDogd2xfc3RhcnQvc2NoZWR1bGVfd29yayBmYWlsZWRcbiIsCi0JCQkJICB3bC0+cHViLT51bml0KSk7Ci0JCX0KLQl9Ci0KLQlUWFFfVU5MT0NLKHdsLCBmbGFncyk7Ci0KLQlyZXR1cm4gMDsKLQotfQotCi1zdGF0aWMgdm9pZCB3bF9zdGFydF90eHF3b3JrKHN0cnVjdCB3bF90YXNrICp0YXNrKQotewotCXdsX2luZm9fdCAqd2wgPSAod2xfaW5mb190ICopIHRhc2stPmNvbnRleHQ7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYjsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXVpbnQgY291bnQgPSAwOwotCi0JV0xfVFJBQ0UoKCJ3bCVkOiB3bF9zdGFydF90eHF3b3JrXG4iLCB3bC0+cHViLT51bml0KSk7Ci0KLQkvKiBGaXJzdCByZW1vdmUgYW4gZW50cnkgdGhlbiBnbyBmb3IgZXhlY3V0aW9uICovCi0JVFhRX0xPQ0sod2wsIGZsYWdzKTsKLQl3aGlsZSAod2wtPnR4cV9oZWFkKSB7Ci0JCXNrYiA9IHdsLT50eHFfaGVhZDsKLQkJd2wtPnR4cV9oZWFkID0gc2tiLT5wcmV2OwotCQlza2ItPnByZXYgPSBOVUxMOwotCQlpZiAod2wtPnR4cV9oZWFkID09IE5VTEwpCi0JCQl3bC0+dHhxX3RhaWwgPSBOVUxMOwotCQlUWFFfVU5MT0NLKHdsLCBmbGFncyk7Ci0KLQkJLyogaXQgaGFzIFdMX0xPQ0svV0xfVU5MT0NLIGluc2lkZSAqLwotCQl3bF9zdGFydF9pbnQod2wsIFdMX1RPX0hXKHdsKSwgc2tiKTsKLQotCQkvKiBib3VuZGVkIG91ciBleGVjdXRpb24sIHJlc2hlZHVsZSBvdXJzZWxmIG5leHQgKi8KLQkJaWYgKCsrY291bnQgPj0gMTApCi0JCQlicmVhazsKLQotCQlUWFFfTE9DSyh3bCwgZmxhZ3MpOwotCX0KLQotCWlmIChjb3VudCA+PSAxMCkgewotCQlpZiAoIXNjaGVkdWxlX3dvcmsoJndsLT50eHFfdGFzay53b3JrKSkgewotCQkJV0xfRVJST1IoKCJ3bCVkOiB3bF9zdGFydC9zY2hlZHVsZV93b3JrIGZhaWxlZFxuIiwKLQkJCQkgIHdsLT5wdWItPnVuaXQpKTsKLQkJCWF0b21pY19kZWMoJndsLT5jYWxsYmFja3MpOwotCQl9Ci0JfSBlbHNlIHsKLQkJd2wtPnR4cV9kaXNwYXRjaGVkID0gZmFsc2U7Ci0JCVRYUV9VTkxPQ0sod2wsIGZsYWdzKTsKLQkJYXRvbWljX2RlYygmd2wtPmNhbGxiYWNrcyk7Ci0JfQotCi0JcmV0dXJuOwotfQotCi1zdGF0aWMgdm9pZCB3bF90eHFfZnJlZSh3bF9pbmZvX3QgKndsKQotewotCXN0cnVjdCBza19idWZmICpza2I7Ci0KLQlpZiAod2wtPnR4cV9oZWFkID09IE5VTEwpIHsKLQkJQVNTRVJUKHdsLT50eHFfdGFpbCA9PSBOVUxMKTsKLQkJcmV0dXJuOwotCX0KLQotCXdoaWxlICh3bC0+dHhxX2hlYWQpIHsKLQkJc2tiID0gd2wtPnR4cV9oZWFkOwotCQl3bC0+dHhxX2hlYWQgPSBza2ItPnByZXY7Ci0JCVBLVEZSRUUod2wtPm9zaCwgc2tiLCB0cnVlKTsKLQl9Ci0KLQl3bC0+dHhxX3RhaWwgPSBOVUxMOwotfQotCi1zdGF0aWMgdm9pZCB3bF9ycGNxX2ZyZWUod2xfaW5mb190ICp3bCkKLXsKLQlycGNfYnVmX3QgKmJ1ZjsKLQotCWlmICh3bC0+cnBjcV9oZWFkID09IE5VTEwpIHsKLQkJQVNTRVJUKHdsLT5ycGNxX3RhaWwgPT0gTlVMTCk7Ci0JCXJldHVybjsKLQl9Ci0KLQl3aGlsZSAod2wtPnJwY3FfaGVhZCkgewotCQlidWYgPSB3bC0+cnBjcV9oZWFkOwotCQl3bC0+cnBjcV9oZWFkID0gYmNtX3JwY19idWZfbmV4dF9nZXQod2wtPnJwY190aCwgYnVmKTsKLQkJYmNtX3JwY19idWZfZnJlZSh3bC0+cnBjX2Rpc3BhdGNoX2N0eC5ycGMsIGJ1Zik7Ci0JfQotCi0Jd2wtPnJwY3FfdGFpbCA9IE5VTEw7Ci19Ci0KLXN0YXRpYyB2b2lkIHdsX3JwY3FfZGlzcGF0Y2goc3RydWN0IHdsX3Rhc2sgKnRhc2spCi17Ci0Jd2xfaW5mb190ICp3bCA9ICh3bF9pbmZvX3QgKikgdGFzay0+Y29udGV4dDsKLQlycGNfYnVmX3QgKmJ1ZjsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JLyogRmlyc3QgcmVtb3ZlIGFuIGVudHJ5IHRoZW4gZ28gZm9yIGV4ZWN1dGlvbiAqLwotCVJQQ1FfTE9DSyh3bCwgZmxhZ3MpOwotCXdoaWxlICh3bC0+cnBjcV9oZWFkKSB7Ci0JCWJ1ZiA9IHdsLT5ycGNxX2hlYWQ7Ci0JCXdsLT5ycGNxX2hlYWQgPSBiY21fcnBjX2J1Zl9uZXh0X2dldCh3bC0+cnBjX3RoLCBidWYpOwotCi0JCWlmICh3bC0+cnBjcV9oZWFkID09IE5VTEwpCi0JCQl3bC0+cnBjcV90YWlsID0gTlVMTDsKLQkJUlBDUV9VTkxPQ0sod2wsIGZsYWdzKTsKLQotCQlXTF9MT0NLKHdsKTsKLQkJd2xjX3JwY19oaWdoX2Rpc3BhdGNoKCZ3bC0+cnBjX2Rpc3BhdGNoX2N0eCwgYnVmKTsKLQkJV0xfVU5MT0NLKHdsKTsKLQotCQlSUENRX0xPQ0sod2wsIGZsYWdzKTsKLQl9Ci0KLQl3bC0+cnBjcV9kaXNwYXRjaGVkID0gZmFsc2U7Ci0KLQlSUENRX1VOTE9DSyh3bCwgZmxhZ3MpOwotCi0Ja2ZyZWUodGFzayk7Ci0JYXRvbWljX2RlYygmd2wtPmNhbGxiYWNrcyk7Ci19Ci0KLXN0YXRpYyB2b2lkIHdsX3JwY3FfYWRkKHdsX2luZm9fdCAqd2wsIHJwY19idWZfdCAqYnVmKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQliY21fcnBjX2J1Zl9uZXh0X3NldCh3bC0+cnBjX3RoLCBidWYsIE5VTEwpOwotCi0JLyogTG9jayB0aGUgcXVldWUgYXMgdGFza2xldCBjb3VsZCBiZSBydW5uaW5nIGF0IHRoaXMgdGltZSAqLwotCVJQQ1FfTE9DSyh3bCwgZmxhZ3MpOwotCWlmICh3bC0+cnBjcV9oZWFkID09IE5VTEwpCi0JCXdsLT5ycGNxX2hlYWQgPSBidWY7Ci0JZWxzZQotCQliY21fcnBjX2J1Zl9uZXh0X3NldCh3bC0+cnBjX3RoLCB3bC0+cnBjcV90YWlsLCBidWYpOwotCi0Jd2wtPnJwY3FfdGFpbCA9IGJ1ZjsKLQotCWlmICh3bC0+cnBjcV9kaXNwYXRjaGVkID09IGZhbHNlKSB7Ci0JCXdsLT5ycGNxX2Rpc3BhdGNoZWQgPSB0cnVlOwotCQl3bF9zY2hlZHVsZV90YXNrKHdsLCB3bF9ycGNxX2Rpc3BhdGNoLCB3bCk7Ci0JfQotCi0JUlBDUV9VTkxPQ0sod2wsIGZsYWdzKTsKLX0KLQotI2lmIGRlZmluZWQoQkNNREJHKQotc3RhdGljIGNvbnN0IHN0cnVjdCBuYW1lX2VudHJ5IHJwY19uYW1lX3RibFtdID0gUlBDX0lEX1RBQkxFOwotI2VuZGlmCQkJCS8qIEJDTURCRyAqLwotCi0vKiBkb25nbGUtc2lkZSBycGMgZGlzcGF0Y2ggcm91dGluZSAqLwotc3RhdGljIHZvaWQgd2xfcnBjX2Rpc3BhdGNoX3NjaGVkdWxlKHZvaWQgKmN0eCwgc3RydWN0IHJwY19idWYgKmJ1ZikKLXsKLQliY21feGRyX2J1Zl90IGI7Ci0Jd2xfaW5mb190ICp3bCA9ICh3bF9pbmZvX3QgKikgY3R4OwotCXdsY19ycGNfaWRfdCBycGNfaWQ7Ci0JaW50IGVycjsKLQotCWJjbV94ZHJfYnVmX2luaXQoJmIsIGJjbV9ycGNfYnVmX2RhdGEod2wtPnJwY190aCwgYnVmKSwKLQkJCSBiY21fcnBjX2J1Zl9sZW5fZ2V0KHdsLT5ycGNfdGgsIGJ1ZikpOwotCi0JZXJyID0gYmNtX3hkcl91bnBhY2tfdTMyKCZiLCAmcnBjX2lkKTsKLQlBU1NFUlQoIWVycik7Ci0JV0xfVFJBQ0UoKCIlczogRGlzcGF0Y2ggaWQgJXNcbiIsIF9fZnVuY19fLAotCQkgIFdMQ19SUENfSURfTE9PS1VQKHJwY19uYW1lX3RibCwgcnBjX2lkKSkpOwotCi0JLyogSGFuZGxlIGZldyBlbWVyZ2VuY3kgb25lcyAqLwotCXN3aXRjaCAocnBjX2lkKSB7Ci0JZGVmYXVsdDoKLQkJd2xfcnBjcV9hZGQod2wsIGJ1Zik7Ci0JCWJyZWFrOwotCX0KLX0KLQotc3RhdGljIHZvaWQgd2xfdGltZXJfdGFzayh3bF90YXNrX3QgKnRhc2spCi17Ci0Jd2xfdGltZXJfdCAqdCA9ICh3bF90aW1lcl90ICopIHRhc2stPmNvbnRleHQ7Ci0KLQlfd2xfdGltZXIodCk7Ci0Ja2ZyZWUodGFzayk7Ci0KLQkvKiBUaGlzIGRlYyBpcyBmb3IgdGhlIHRhc2tfc2NoZWR1bGUuIFRoZSB0aW1lciByZWxhdGVkCi0JICogY2FsbGJhY2sgaXMgZGVjcmVtZW50ZWQgaW4gX3dsX3RpbWVyCi0JICovCi0JYXRvbWljX2RlYygmdC0+d2wtPmNhbGxiYWNrcyk7Ci19Ci0jZW5kaWYJCQkJLyogV0xDX0hJR0hfT05MWSAqLwotCi0jaWZuZGVmIFdMQ19ISUdIX09OTFkKIGNoYXIgKndsX2Zpcm13YXJlc1tXTF9NQVhfRlddID0gewogCSJicmNtL2JjbTQzeHgiLAogCU5VTEwKIH07CiAKLSNpZmRlZiBXTENfTE9XCi1pbnQgd2xfdWNvZGVfaW5pdF9idWYod2xfaW5mb190ICp3bCwgdm9pZCAqKnBidWYsIHUzMiBpZHgpCitpbnQgd2xfdWNvZGVfaW5pdF9idWYoc3RydWN0IHdsX2luZm8gKndsLCB2b2lkICoqcGJ1ZiwgdTMyIGlkeCkKIHsKIAlpbnQgaSwgZW50cnk7CiAJY29uc3QgdTggKnBkYXRhOwpAQCAtMjMwMSw3ICsxNzE5LDcgQEAKIAlyZXR1cm4gLTE7CiB9CiAKLWludCB3bF91Y29kZV9pbml0X3VpbnQod2xfaW5mb190ICp3bCwgdTMyICpkYXRhLCB1MzIgaWR4KQoraW50IHdsX3Vjb2RlX2luaXRfdWludChzdHJ1Y3Qgd2xfaW5mbyAqd2wsIHUzMiAqZGF0YSwgdTMyIGlkeCkKIHsKIAlpbnQgaSwgZW50cnk7CiAJY29uc3QgdTggKnBkYXRhOwpAQCAtMjMyMSwyMiArMTczOSwyMSBAQAogCXByaW50ZigiRVJST1I6IHVjb2RlIHRhZzolZCBjYW4gbm90IGJlIGZvdW5kIVxuIiwgaWR4KTsKIAlyZXR1cm4gLTE7CiB9Ci0jZW5kaWYJCQkJLyogV0xDX0xPVyAqLwogCi1zdGF0aWMgaW50IHdsX3JlcXVlc3RfZncod2xfaW5mb190ICp3bCwgc3RydWN0IHBjaV9kZXYgKnBkZXYpCitzdGF0aWMgaW50IHdsX3JlcXVlc3RfZncoc3RydWN0IHdsX2luZm8gKndsLCBzdHJ1Y3QgcGNpX2RldiAqcGRldikKIHsKIAlpbnQgc3RhdHVzOwogCXN0cnVjdCBkZXZpY2UgKmRldmljZSA9ICZwZGV2LT5kZXY7CiAJY2hhciBmd19uYW1lWzEwMF07CiAJaW50IGk7CiAKLQliemVybygodm9pZCAqKSZ3bC0+ZncsIHNpemVvZihzdHJ1Y3Qgd2xfZmlybXdhcmUpKTsKKwltZW1zZXQoKHZvaWQgKikmd2wtPmZ3LCAwLCBzaXplb2Yoc3RydWN0IHdsX2Zpcm13YXJlKSk7CiAJZm9yIChpID0gMDsgaSA8IFdMX01BWF9GVzsgaSsrKSB7CiAJCWlmICh3bF9maXJtd2FyZXNbaV0gPT0gTlVMTCkKIAkJCWJyZWFrOwogCQlzcHJpbnRmKGZ3X25hbWUsICIlcy0lZC5mdyIsIHdsX2Zpcm13YXJlc1tpXSwKIAkJCVVDT0RFX0xPQURFUl9BUElfVkVSKTsKLQkJV0xfTk9ORSgoInJlcXVlc3QgZncgJXNcbiIsIGZ3X25hbWUpKTsKKwkJV0xfTk9ORSgicmVxdWVzdCBmdyAlc1xuIiwgZndfbmFtZSk7CiAJCXN0YXR1cyA9IHJlcXVlc3RfZmlybXdhcmUoJndsLT5mdy5md19iaW5baV0sIGZ3X25hbWUsIGRldmljZSk7CiAJCWlmIChzdGF0dXMpIHsKIAkJCXByaW50ZigiJXM6IGZhaWwgdG8gbG9hZCBmaXJtd2FyZSAlc1xuIiwKQEAgLTIzNDQsNyArMTc2MSw3IEBACiAJCQl3bF9yZWxlYXNlX2Z3KHdsKTsKIAkJCXJldHVybiBzdGF0dXM7CiAJCX0KLQkJV0xfTk9ORSgoInJlcXVlc3QgZncgJXNcbiIsIGZ3X25hbWUpKTsKKwkJV0xfTk9ORSgicmVxdWVzdCBmdyAlc1xuIiwgZndfbmFtZSk7CiAJCXNwcmludGYoZndfbmFtZSwgIiVzX2hkci0lZC5mdyIsIHdsX2Zpcm13YXJlc1tpXSwKIAkJCVVDT0RFX0xPQURFUl9BUElfVkVSKTsKIAkJc3RhdHVzID0gcmVxdWVzdF9maXJtd2FyZSgmd2wtPmZ3LmZ3X2hkcltpXSwgZndfbmFtZSwgZGV2aWNlKTsKQEAgLTIzNTYsMjIgKzE3NzMsMTkgQEAKIAkJfQogCQl3bC0+ZncuaGRyX251bV9lbnRyaWVzW2ldID0KIAkJICAgIHdsLT5mdy5md19oZHJbaV0tPnNpemUgLyAoc2l6ZW9mKHN0cnVjdCB3bF9md19oZHIpKTsKLQkJV0xfTk9ORSgoInJlcXVlc3QgZncgJXMgZmluZDogJWQgZW50cmllc1xuIiwgZndfbmFtZSwKLQkJCSB3bC0+ZncuaGRyX251bV9lbnRyaWVzW2ldKSk7CisJCVdMX05PTkUoInJlcXVlc3QgZncgJXMgZmluZDogJWQgZW50cmllc1xuIiwKKwkJCWZ3X25hbWUsIHdsLT5mdy5oZHJfbnVtX2VudHJpZXNbaV0pOwogCX0KIAl3bC0+ZncuZndfY250ID0gaTsKLQl3bF91Y29kZV9kYXRhX2luaXQod2wpOwotCXJldHVybiAwOworCXJldHVybiB3bF91Y29kZV9kYXRhX2luaXQod2wpOwogfQogCi0jaWZkZWYgV0xDX0xPVwogdm9pZCB3bF91Y29kZV9mcmVlX2J1Zih2b2lkICpwKQogewogCWtmcmVlKHApOwogfQotI2VuZGlmCQkJCS8qIFdMQ19MT1cgKi8KIAotc3RhdGljIHZvaWQgd2xfcmVsZWFzZV9mdyh3bF9pbmZvX3QgKndsKQorc3RhdGljIHZvaWQgd2xfcmVsZWFzZV9mdyhzdHJ1Y3Qgd2xfaW5mbyAqd2wpCiB7CiAJaW50IGk7CiAJZm9yIChpID0gMDsgaSA8IFdMX01BWF9GVzsgaSsrKSB7CkBAIC0yMzc5LDQgKzE3OTMsNTQgQEAKIAkJcmVsZWFzZV9maXJtd2FyZSh3bC0+ZncuZndfaGRyW2ldKTsKIAl9CiB9Ci0jZW5kaWYJCQkJLyogV0xDX0hJR0hfT05MWSAqLworCisKKy8qCisgKiBjaGVja3MgdmFsaWRpdHkgb2YgYWxsIGZpcm13YXJlIGltYWdlcyBsb2FkZWQgZnJvbSB1c2VyIHNwYWNlCisgKi8KK2ludCB3bF9jaGVja19maXJtd2FyZXMoc3RydWN0IHdsX2luZm8gKndsKQoreworCWludCBpOworCWludCBlbnRyeTsKKwlpbnQgcmMgPSAwOworCWNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZnc7CisJY29uc3Qgc3RydWN0IGZpcm13YXJlICpmd19oZHI7CisJc3RydWN0IHdsX2Z3X2hkciAqdWNvZGVfaGRyOworCWZvciAoaSA9IDA7IGkgPCBXTF9NQVhfRlcgJiYgcmMgPT0gMDsgaSsrKSB7CisJCWZ3ID0gIHdsLT5mdy5md19iaW5baV07CisJCWZ3X2hkciA9IHdsLT5mdy5md19oZHJbaV07CisJCWlmIChmdyA9PSBOVUxMICYmIGZ3X2hkciA9PSBOVUxMKSB7CisJCQlicmVhazsKKwkJfSBlbHNlIGlmIChmdyA9PSBOVUxMIHx8IGZ3X2hkciA9PSBOVUxMKSB7CisJCQlXTF9FUlJPUigiJXM6IGludmFsaWQgYmluL2hkciBmd1xuIiwgX19mdW5jX18pOworCQkJcmMgPSAtRUJBREY7CisJCX0gZWxzZSBpZiAoZndfaGRyLT5zaXplICUgc2l6ZW9mKHN0cnVjdCB3bF9md19oZHIpKSB7CisJCQlXTF9FUlJPUigiJXM6IG5vbiBpbnRlZ3JhbCBmdyBoZHIgZmlsZSBzaXplICVkLyV6dVxuIiwKKwkJCQkgX19mdW5jX18sIGZ3X2hkci0+c2l6ZSwKKwkJCQkgc2l6ZW9mKHN0cnVjdCB3bF9md19oZHIpKTsKKwkJCXJjID0gLUVCQURGOworCQl9IGVsc2UgaWYgKGZ3LT5zaXplIDwgTUlOX0ZXX1NJWkUgfHwgZnctPnNpemUgPiBNQVhfRldfU0laRSkgeworCQkJV0xfRVJST1IoIiVzOiBvdXQgb2YgYm91bmRzIGZ3IGZpbGUgc2l6ZSAlZFxuIiwKKwkJCQkgX19mdW5jX18sIGZ3LT5zaXplKTsKKwkJCXJjID0gLUVCQURGOworCQl9IGVsc2UgeworCQkJLyogY2hlY2sgaWYgdWNvZGUgc2VjdGlvbiBvdmVycnVucyBmaXJtd2FyZSBpbWFnZSAqLworCQkJdWNvZGVfaGRyID0gKHN0cnVjdCB3bF9md19oZHIgKilmd19oZHItPmRhdGE7CisJCQlmb3IgKGVudHJ5ID0gMDsgZW50cnkgPCB3bC0+ZncuaGRyX251bV9lbnRyaWVzW2ldICYmIHJjOworCQkJICAgICBlbnRyeSsrLCB1Y29kZV9oZHIrKykgeworCQkJCWlmICh1Y29kZV9oZHItPm9mZnNldCArIHVjb2RlX2hkci0+bGVuID4KKwkJCQkgICAgZnctPnNpemUpIHsKKwkJCQkJV0xfRVJST1IoIiVzOiBjb25mbGljdGluZyBiaW4vaGRyXG4iLAorCQkJCQkJIF9fZnVuY19fKTsKKwkJCQkJcmMgPSAtRUJBREY7CisJCQkJfQorCQkJfQorCQl9CisJfQorCWlmIChyYyA9PSAwICYmIHdsLT5mdy5md19jbnQgIT0gaSkgeworCQlXTF9FUlJPUigiJXM6IGludmFsaWQgZndfY250PSVkXG4iLCBfX2Z1bmNfXywgd2wtPmZ3LmZ3X2NudCk7CisJCXJjID0gLUVCQURGOworCX0KKwlyZXR1cm4gcmM7Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvc3lzL3dsX21hYzgwMjExLmggYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3N5cy93bF9tYWM4MDIxMS5oCmluZGV4IDc4Y2VlNDQuLmJiMzliNzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvc3lzL3dsX21hYzgwMjExLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9zeXMvd2xfbWFjODAyMTEuaApAQCAtNjAsNTggKzYwLDMyIEBACiB9OwogCiBzdHJ1Y3Qgd2xfaW5mbyB7Ci0Jd2xjX3B1Yl90ICpwdWI7CQkvKiBwb2ludGVyIHRvIHB1YmxpYyB3bGMgc3RhdGUgKi8KKwlzdHJ1Y3Qgd2xjX3B1YiAqcHViOwkJLyogcG9pbnRlciB0byBwdWJsaWMgd2xjIHN0YXRlICovCiAJdm9pZCAqd2xjOwkJLyogcG9pbnRlciB0byBwcml2YXRlIGNvbW1vbiBvcy1pbmRlcGVuZGVudCBkYXRhICovCi0Jb3NsX3QgKm9zaDsJCS8qIHBvaW50ZXIgdG8gb3MgaGFuZGxlciAqLworCXN0cnVjdCBvc2xfaW5mbyAqb3NoOwkJLyogcG9pbnRlciB0byBvcyBoYW5kbGVyICovCiAJdTMyIG1hZ2ljOwogCiAJaW50IGlycTsKIAotI2lmZGVmIFdMQ19ISUdIX09OTFkKLQlzdHJ1Y3Qgc2VtYXBob3JlIHNlbTsJLyogdXNlIHNlbWFwaG9yZSB0byBhbGxvdyBzbGVlcCAqLwotI2Vsc2UKIAlzcGlubG9ja190IGxvY2s7CS8qIHBlci1kZXZpY2UgcGVyaW1ldGVyIGxvY2sgKi8KIAlzcGlubG9ja190IGlzcl9sb2NrOwkvKiBwZXItZGV2aWNlIElTUiBzeW5jaHJvbml6YXRpb24gbG9jayAqLwotI2VuZGlmCiAJdWludCBiY21fYnVzdHlwZTsJLyogYnVzIHR5cGUgKi8KIAlib29sIHBpb21vZGU7CQkvKiBzZXQgZnJvbSBpbnNtb2QgYXJndW1lbnQgKi8KIAl2b2lkICpyZWdzdmE7CQkvKiBvcGFxdWUgY2hpcCByZWdpc3RlcnMgdmlydHVhbCBhZGRyZXNzICovCiAJYXRvbWljX3QgY2FsbGJhY2tzOwkvKiAjIG91dHN0YW5kaW5nIGNhbGxiYWNrIGZ1bmN0aW9ucyAqLwogCXN0cnVjdCB3bF90aW1lciAqdGltZXJzOwkvKiB0aW1lciBjbGVhbnVwIHF1ZXVlICovCiAJc3RydWN0IHRhc2tsZXRfc3RydWN0IHRhc2tsZXQ7CS8qIGRwYyB0YXNrbGV0ICovCi0jaWZkZWYgQkNNU0RJTwotCWJjbXNkaF9pbmZvX3QgKnNkaDsJLyogcG9pbnRlciB0byBzZGlvIGJ1cyBoYW5kbGVyICovCi0JdW5zaWduZWQgbG9uZyBmbGFnczsJCS8qIGN1cnJlbnQgaXJxIGZsYWdzICovCi0jZW5kaWYJCQkJLyogQkNNU0RJTyAqLwogCWJvb2wgcmVzY2hlZDsJCS8qIGRwYyBuZWVkcyB0byBiZSBhbmQgaXMgcmVzY2hlZHVsZWQgKi8KICNpZmRlZiBMSU5VWFNUQV9QUwogCXUzMiBwY2lfcHNzdGF0ZVsxNl07CS8qIHBjaSBwcy1zdGF0ZSBzYXZlL3Jlc3RvcmUgKi8KICNlbmRpZgogCS8qIFJQQywgaGFuZGxlLCBsb2NrLCB0eHEsIHdvcmtpdGVtICovCi0jaWZkZWYgV0xDX0hJR0hfT05MWQotCXJwY19pbmZvX3QgKnJwYzsJLyogUlBDIGhhbmRsZSAqLwotCXJwY190cF9pbmZvX3QgKnJwY190aDsJLyogUlBDIHRyYW5zcG9ydCBoYW5kbGUgKi8KLQl3bGNfcnBjX2N0eF90IHJwY19kaXNwYXRjaF9jdHg7Ci0KLQlib29sIHJwY3FfZGlzcGF0Y2hlZDsJLyogQXZvaWQgc2NoZWR1bGluZyBtdWx0aXBsZSB0YXNrcyAqLwotCXNwaW5sb2NrX3QgcnBjcV9sb2NrOwkvKiBMb2NrIGZvciB0aGUgcXVldWUgKi8KLQlycGNfYnVmX3QgKnJwY3FfaGVhZDsJLyogUlBDIFEgKi8KLQlycGNfYnVmX3QgKnJwY3FfdGFpbDsJLyogUG9pbnRzIHRvIHRoZSBsYXN0IGJ1ZiAqLwotCi0JYm9vbCB0eHFfZGlzcGF0Y2hlZDsJLyogQXZvaWQgc2NoZWR1bGluZyBtdWx0aXBsZSB0YXNrcyAqLwotCXNwaW5sb2NrX3QgdHhxX2xvY2s7CS8qIExvY2sgZm9yIHRoZSBxdWV1ZSAqLwotCXN0cnVjdCBza19idWZmICp0eHFfaGVhZDsJLyogVFggUSAqLwotCXN0cnVjdCBza19idWZmICp0eHFfdGFpbDsJLyogUG9pbnRzIHRvIHRoZSBsYXN0IGJ1ZiAqLwotCi0Jd2xfdGFza190IHR4cV90YXNrOwkvKiB3b3JrIHF1ZXVlIGZvciB3bF9zdGFydCgpICovCi0jZW5kaWYJCQkJLyogV0xDX0hJR0hfT05MWSAqLwogCXVpbnQgc3RhdHNfaWQ7CQkvKiB0aGUgY3VycmVudCBzZXQgb2Ygc3RhdHMgKi8KIAkvKiBwaW5nLXBvbmcgc3RhdHMgY291bnRlcnMgdXBkYXRlZCBieSBMaW51eCB3YXRjaGRvZyAqLwogCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzX3dhdGNoZG9nWzJdOwogCXN0cnVjdCB3bF9maXJtd2FyZSBmdzsKIH07CiAKLSNpZm5kZWYgV0xDX0hJR0hfT05MWQogI2RlZmluZSBXTF9MT0NLKHdsKQlzcGluX2xvY2tfYmgoJih3bCktPmxvY2spCiAjZGVmaW5lIFdMX1VOTE9DSyh3bCkJc3Bpbl91bmxvY2tfYmgoJih3bCktPmxvY2spCiAKQEAgLTEyMiwxNyArOTYsNiBAQAogLyogbG9ja2luZyB1bmRlciBXTF9MT0NLKCkgdG8gc3luY2hyb25pemUgd2l0aCB3bF9pc3IgKi8KICNkZWZpbmUgSU5UX0xPQ0sod2wsIGZsYWdzKQlzcGluX2xvY2tfaXJxc2F2ZSgmKHdsKS0+aXNyX2xvY2ssIGZsYWdzKQogI2RlZmluZSBJTlRfVU5MT0NLKHdsLCBmbGFncykJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmKHdsKS0+aXNyX2xvY2ssIGZsYWdzKQotI2Vsc2UJCQkJLyogQkNNU0RJTyAqLwotCi0jZGVmaW5lIFdMX0xPQ0sod2wpCWRvd24oJih3bCktPnNlbSkKLSNkZWZpbmUgV0xfVU5MT0NLKHdsKQl1cCgmKHdsKS0+c2VtKQotCi0jZGVmaW5lIFdMX0lTUkxPQ0sod2wpCi0jZGVmaW5lIFdMX0lTUlVOTE9DSyh3bCkKLSNlbmRpZgkJCQkvKiBXTENfSElHSF9PTkxZICovCi0KLS8qIGhhbmRsZSBmb3J3YXJkIGRlY2xhcmF0aW9uICovCi10eXBlZGVmIHN0cnVjdCB3bF9pbmZvIHdsX2luZm9fdDsKIAogI2lmbmRlZiBQQ0lfRDAKICNkZWZpbmUgUENJX0QwCQkwCkBAIC0xNDgsMTQgKzExMSw3IEBACiAKIGV4dGVybiBpbnQgX19kZXZpbml0IHdsX3BjaV9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwKIAkJCQkgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpOwotZXh0ZXJuIHZvaWQgd2xfZnJlZSh3bF9pbmZvX3QgKndsKTsKK2V4dGVybiB2b2lkIHdsX2ZyZWUoc3RydWN0IHdsX2luZm8gKndsKTsKIGV4dGVybiBpbnQgd2xfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICppZnIsIGludCBjbWQpOwotZXh0ZXJuIGludCB3bF91Y29kZV9kYXRhX2luaXQod2xfaW5mb190ICp3bCk7Ci1leHRlcm4gdm9pZCB3bF91Y29kZV9kYXRhX2ZyZWUodm9pZCk7Ci0jaWZkZWYgV0xDX0xPVwotZXh0ZXJuIHZvaWQgd2xfdWNvZGVfZnJlZV9idWYodm9pZCAqKTsKLWV4dGVybiBpbnQgd2xfdWNvZGVfaW5pdF9idWYod2xfaW5mb190ICp3bCwgdm9pZCAqKnBidWYsIHUzMiBpZHgpOwotZXh0ZXJuIGludCB3bF91Y29kZV9pbml0X3VpbnQod2xfaW5mb190ICp3bCwgdTMyICpkYXRhLCB1MzIgaWR4KTsKLSNlbmRpZgkJCQkvKiBXTENfTE9XICovCiAKICNlbmRpZgkJCQkvKiBfd2xfbWFjODAyMTFfaF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvc3lzL3dsX3Vjb2RlLmggYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3N5cy93bF91Y29kZS5oCmluZGV4IGExYmEzNzIuLjJhMGY0MDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvc3lzL3dsX3Vjb2RlLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9zeXMvd2xfdWNvZGUuaApAQCAtMTQsNiArMTQsOSBAQAogICogQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KICAqLwogCisjZGVmaW5lIE1JTl9GV19TSVpFIDQwMDAwCS8qIG1pbmltdW0gZmlybXdhcmUgZmlsZSBzaXplIGluIGJ5dGVzICovCisjZGVmaW5lIE1BWF9GV19TSVpFIDE1MDAwMAorCiB0eXBlZGVmIHN0cnVjdCBkMTFpbml0IHsKIAl1MTYgYWRkcjsKIAl1MTYgc2l6ZTsKQEAgLTM1LDMgKzM4LDEyIEBACiBleHRlcm4gdTMyIGJjbTQzeHhfMjRfbGNuc3o7CiBleHRlcm4gdTMyICpiY200M3h4X2JvbW1ham9yOwogZXh0ZXJuIHUzMiAqYmNtNDN4eF9ib21taW5vcjsKKworZXh0ZXJuIGludCB3bF91Y29kZV9kYXRhX2luaXQoc3RydWN0IHdsX2luZm8gKndsKTsKK2V4dGVybiB2b2lkIHdsX3Vjb2RlX2RhdGFfZnJlZSh2b2lkKTsKKworZXh0ZXJuIGludCB3bF91Y29kZV9pbml0X2J1ZihzdHJ1Y3Qgd2xfaW5mbyAqd2wsIHZvaWQgKipwYnVmLCB1bnNpZ25lZCBpbnQgaWR4KTsKK2V4dGVybiBpbnQgd2xfdWNvZGVfaW5pdF91aW50KHN0cnVjdCB3bF9pbmZvICp3bCwgdW5zaWduZWQgKmRhdGEsCisJCQkgICAgICB1bnNpZ25lZCBpbnQgaWR4KTsKK2V4dGVybiB2b2lkIHdsX3Vjb2RlX2ZyZWVfYnVmKHZvaWQgKik7CitleHRlcm4gaW50ICB3bF9jaGVja19maXJtd2FyZXMoc3RydWN0IHdsX2luZm8gKndsKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvc3lzL3dsX3Vjb2RlX2xvYWRlci5jIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9zeXMvd2xfdWNvZGVfbG9hZGVyLmMKaW5kZXggMGI0MWE5Yy4uMjNlMTBmMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9zeXMvd2xfdWNvZGVfbG9hZGVyLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9zeXMvd2xfdWNvZGVfbG9hZGVyLmMKQEAgLTE0LDE3ICsxNCwxMiBAQAogICogQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KICAqLwogCi10eXBlZGVmIHN0cnVjdCB3bF9pbmZvIHdsX2luZm9fdDsKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGJjbWRlZnMuaD4KICNpbmNsdWRlIDxkMTF1Y29kZV9leHQuaD4KICNpbmNsdWRlIDx3bF91Y29kZS5oPgogCi1leHRlcm4gaW50IHdsX3Vjb2RlX2luaXRfYnVmKHdsX2luZm9fdCAqd2wsIHZvaWQgKipwYnVmLCB1bnNpZ25lZCBpbnQgaWR4KTsKLWV4dGVybiBpbnQgd2xfdWNvZGVfaW5pdF91aW50KHdsX2luZm9fdCAqd2wsIHVuc2lnbmVkICpkYXRhLCB1bnNpZ25lZCBpbnQgaWR4KTsKLWV4dGVybiBpbnQgd2xfdWNvZGVfZGF0YV9pbml0KHdsX2luZm9fdCAqd2wpOwotZXh0ZXJuIHZvaWQgd2xfdWNvZGVfZGF0YV9mcmVlKHZvaWQpOwotZXh0ZXJuIHZvaWQgd2xfdWNvZGVfZnJlZV9idWYodm9pZCAqKTsKKwogCiBkMTFpbml0X3QgKmQxMWxjbjBic2luaXR2YWxzMjQ7CiBkMTFpbml0X3QgKmQxMWxjbjBpbml0dmFsczI0OwpAQCAtNDIsOCArMzcsMTIgQEAKIHUzMiAqYmNtNDN4eF9ib21tYWpvcjsKIHUzMiAqYmNtNDN4eF9ib21taW5vcjsKIAotaW50IHdsX3Vjb2RlX2RhdGFfaW5pdCh3bF9pbmZvX3QgKndsKQoraW50IHdsX3Vjb2RlX2RhdGFfaW5pdChzdHJ1Y3Qgd2xfaW5mbyAqd2wpCiB7CisJaW50IHJjOworCXJjID0gd2xfY2hlY2tfZmlybXdhcmVzKHdsKTsKKwlpZiAocmMgPCAwKQorCQlyZXR1cm4gcmM7CiAJd2xfdWNvZGVfaW5pdF9idWYod2wsICh2b2lkICoqKSZkMTFsY24wYnNpbml0dmFsczI0LAogCQkJICBEMTFMQ04wQlNJTklUVkFMUzI0KTsKIAl3bF91Y29kZV9pbml0X2J1Zih3bCwgKHZvaWQgKiopJmQxMWxjbjBpbml0dmFsczI0LCBEMTFMQ04wSU5JVFZBTFMyNCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3N5cy93bGNfYWxsb2MuYyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvc3lzL3dsY19hbGxvYy5jCmluZGV4IDJkYzg5ZjkuLjc0NjQzOWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvc3lzL3dsY19hbGxvYy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvc3lzL3dsY19hbGxvYy5jCkBAIC0xNywyOCArMTcsMzMgQEAKICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxiY21kZWZzLmg+CiAjaW5jbHVkZSA8d2xjX2NmZy5oPgotI2luY2x1ZGUgPGxpbnV4dmVyLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8b3NsLmg+CiAjaW5jbHVkZSA8YmNtdXRpbHMuaD4KICNpbmNsdWRlIDxzaXV0aWxzLmg+CiAjaW5jbHVkZSA8d2xpb2N0bC5oPgogI2luY2x1ZGUgPHdsY19wdWIuaD4KICNpbmNsdWRlIDx3bGNfa2V5Lmg+CisjaW5jbHVkZSA8c2JobmRwaW8uaD4KKyNpbmNsdWRlIDxzYmhuZGRtYS5oPgorI2luY2x1ZGUgPHdsY19ldmVudC5oPgogI2luY2x1ZGUgPHdsY19tYWM4MDIxMS5oPgogI2luY2x1ZGUgPHdsY19hbGxvYy5oPgorI2luY2x1ZGUgPHdsX2RiZy5oPgogCi1zdGF0aWMgd2xjX3B1Yl90ICp3bGNfcHViX21hbGxvYyhvc2xfdCAqb3NoLCB1aW50IHVuaXQsIHVpbnQgKmVyciwKLQkJCQkgdWludCBkZXZpZCk7Ci1zdGF0aWMgdm9pZCB3bGNfcHViX21mcmVlKG9zbF90ICpvc2gsIHdsY19wdWJfdCAqcHViKTsKK3N0YXRpYyBzdHJ1Y3Qgd2xjX3B1YiAqd2xjX3B1Yl9tYWxsb2Moc3RydWN0IG9zbF9pbmZvICpvc2gsIHVpbnQgdW5pdCwKKwkJCQkgICAgICB1aW50ICplcnIsIHVpbnQgZGV2aWQpOworc3RhdGljIHZvaWQgd2xjX3B1Yl9tZnJlZShzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgc3RydWN0IHdsY19wdWIgKnB1Yik7CiBzdGF0aWMgdm9pZCB3bGNfdHVuYWJsZXNfaW5pdCh3bGNfdHVuYWJsZXNfdCAqdHVuYWJsZXMsIHVpbnQgZGV2aWQpOwogCi12b2lkICp3bGNfY2FsbG9jKG9zbF90ICpvc2gsIHVpbnQgdW5pdCwgdWludCBzaXplKQordm9pZCAqd2xjX2NhbGxvYyhzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgdWludCB1bml0LCB1aW50IHNpemUpCiB7CiAJdm9pZCAqaXRlbTsKIAogCWl0ZW0gPSBremFsbG9jKHNpemUsIEdGUF9BVE9NSUMpOwogCWlmIChpdGVtID09IE5VTEwpCi0JCVdMX0VSUk9SKCgid2wlZDogJXM6IG91dCBvZiBtZW1vcnlcbiIsIHVuaXQsIF9fZnVuY19fKSk7CisJCVdMX0VSUk9SKCJ3bCVkOiAlczogb3V0IG9mIG1lbW9yeVxuIiwgdW5pdCwgX19mdW5jX18pOwogCXJldHVybiBpdGVtOwogfQogCkBAIC01OCwxOCArNjMsMTQgQEAKIAl0dW5hYmxlcy0+YW1wZHVkYXRhaGl3YXQgPSBXTENfQU1QRFVEQVRBSElXQVQ7CiAJdHVuYWJsZXMtPnJ4Ym5kID0gUlhCTkQ7CiAJdHVuYWJsZXMtPnR4c2JuZCA9IFRYU0JORDsKLSNpZiBkZWZpbmVkKFdMQ19ISUdIX09OTFkpICYmIGRlZmluZWQoTlRYRF9VU0JfNDMxOSkKLQlpZiAoZGV2aWQgPT0gQkNNNDMxOV9DSElQX0lEKSB7Ci0JCXR1bmFibGVzLT5udHhkID0gTlRYRF9VU0JfNDMxOTsKLQl9Ci0jZW5kaWYJCQkJLyogV0xDX0hJR0hfT05MWSAqLwogfQogCi1zdGF0aWMgd2xjX3B1Yl90ICp3bGNfcHViX21hbGxvYyhvc2xfdCAqb3NoLCB1aW50IHVuaXQsIHVpbnQgKmVyciwgdWludCBkZXZpZCkKK3N0YXRpYyBzdHJ1Y3Qgd2xjX3B1YiAqd2xjX3B1Yl9tYWxsb2Moc3RydWN0IG9zbF9pbmZvICpvc2gsIHVpbnQgdW5pdCwKKwkJCQkgICAgICB1aW50ICplcnIsIHVpbnQgZGV2aWQpCiB7Ci0Jd2xjX3B1Yl90ICpwdWI7CisJc3RydWN0IHdsY19wdWIgKnB1YjsKIAotCXB1YiA9ICh3bGNfcHViX3QgKikgd2xjX2NhbGxvYyhvc2gsIHVuaXQsIHNpemVvZih3bGNfcHViX3QpKTsKKwlwdWIgPSAoc3RydWN0IHdsY19wdWIgKikgd2xjX2NhbGxvYyhvc2gsIHVuaXQsIHNpemVvZihzdHJ1Y3Qgd2xjX3B1YikpOwogCWlmIChwdWIgPT0gTlVMTCkgewogCQkqZXJyID0gMTAwMTsKIAkJZ290byBmYWlsOwpAQCAtOTksNyArMTAwLDcgQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAotc3RhdGljIHZvaWQgd2xjX3B1Yl9tZnJlZShvc2xfdCAqb3NoLCB3bGNfcHViX3QgKnB1YikKK3N0YXRpYyB2b2lkIHdsY19wdWJfbWZyZWUoc3RydWN0IG9zbF9pbmZvICpvc2gsIHN0cnVjdCB3bGNfcHViICpwdWIpCiB7CiAJaWYgKHB1YiA9PSBOVUxMKQogCQlyZXR1cm47CkBAIC0xMTQsNyArMTE1LDcgQEAKIAlrZnJlZShwdWIpOwogfQogCi13bGNfYnNzY2ZnX3QgKndsY19ic3NjZmdfbWFsbG9jKG9zbF90ICpvc2gsIHVpbnQgdW5pdCkKK3dsY19ic3NjZmdfdCAqd2xjX2Jzc2NmZ19tYWxsb2Moc3RydWN0IG9zbF9pbmZvICpvc2gsIHVpbnQgdW5pdCkKIHsKIAl3bGNfYnNzY2ZnX3QgKmNmZzsKIApAQCAtMTM0LDcgKzEzNSw3IEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKLXZvaWQgd2xjX2Jzc2NmZ19tZnJlZShvc2xfdCAqb3NoLCB3bGNfYnNzY2ZnX3QgKmNmZykKK3ZvaWQgd2xjX2Jzc2NmZ19tZnJlZShzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgd2xjX2Jzc2NmZ190ICpjZmcpCiB7CiAJaWYgKGNmZyA9PSBOVUxMKQogCQlyZXR1cm47CkBAIC0xNTUsNyArMTU2LDcgQEAKIAlrZnJlZShjZmcpOwogfQogCi12b2lkIHdsY19ic3NjZmdfSURfYXNzaWduKHdsY19pbmZvX3QgKndsYywgd2xjX2Jzc2NmZ190ICpic3NjZmcpCit2b2lkIHdsY19ic3NjZmdfSURfYXNzaWduKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCB3bGNfYnNzY2ZnX3QgKmJzc2NmZykKIHsKIAlic3NjZmctPklEID0gd2xjLT5uZXh0X2Jzc2NmZ19JRDsKIAl3bGMtPm5leHRfYnNzY2ZnX0lEKys7CkBAIC0xNjQsMTEgKzE2NSwxMyBAQAogLyoKICAqIFRoZSBjb21tb24gZHJpdmVyIGVudHJ5IHJvdXRpbmUuIEVycm9yIGNvZGVzIHNob3VsZCBiZSB1bmlxdWUKICAqLwotd2xjX2luZm9fdCAqd2xjX2F0dGFjaF9tYWxsb2Mob3NsX3QgKm9zaCwgdWludCB1bml0LCB1aW50ICplcnIsIHVpbnQgZGV2aWQpCitzdHJ1Y3Qgd2xjX2luZm8gKndsY19hdHRhY2hfbWFsbG9jKHN0cnVjdCBvc2xfaW5mbyAqb3NoLCB1aW50IHVuaXQsIHVpbnQgKmVyciwKKwkJCSAgICAgIHVpbnQgZGV2aWQpCiB7Ci0Jd2xjX2luZm9fdCAqd2xjOworCXN0cnVjdCB3bGNfaW5mbyAqd2xjOwogCi0Jd2xjID0gKHdsY19pbmZvX3QgKikgd2xjX2NhbGxvYyhvc2gsIHVuaXQsIHNpemVvZih3bGNfaW5mb190KSk7CisJd2xjID0gKHN0cnVjdCB3bGNfaW5mbyAqKSB3bGNfY2FsbG9jKG9zaCwgdW5pdCwKKwkJCQkJICAgICBzaXplb2Yoc3RydWN0IHdsY19pbmZvKSk7CiAJaWYgKHdsYyA9PSBOVUxMKSB7CiAJCSplcnIgPSAxMDAyOwogCQlnb3RvIGZhaWw7CkBAIC0xNzYsNyArMTc5LDcgQEAKIAogCXdsYy0+aHdyeG9mZiA9IFdMX0hXUlhPRkY7CiAKLQkvKiBhbGxvY2F0ZSB3bGNfcHViX3Qgc3RhdGUgc3RydWN0dXJlICovCisJLyogYWxsb2NhdGUgc3RydWN0IHdsY19wdWIgc3RhdGUgc3RydWN0dXJlICovCiAJd2xjLT5wdWIgPSB3bGNfcHViX21hbGxvYyhvc2gsIHVuaXQsIGVyciwgZGV2aWQpOwogCWlmICh3bGMtPnB1YiA9PSBOVUxMKSB7CiAJCSplcnIgPSAxMDAzOwpAQCAtMTg0LDE3ICsxODcsMTYgQEAKIAl9CiAJd2xjLT5wdWItPndsYyA9IHdsYzsKIAotCS8qIGFsbG9jYXRlIHdsY19od19pbmZvX3Qgc3RhdGUgc3RydWN0dXJlICovCisJLyogYWxsb2NhdGUgc3RydWN0IHdsY19od19pbmZvIHN0YXRlIHN0cnVjdHVyZSAqLwogCi0Jd2xjLT5odyA9ICh3bGNfaHdfaW5mb190ICopd2xjX2NhbGxvYyhvc2gsIHVuaXQsCi0JCXNpemVvZih3bGNfaHdfaW5mb190KSk7CisJd2xjLT5odyA9IChzdHJ1Y3Qgd2xjX2h3X2luZm8gKil3bGNfY2FsbG9jKG9zaCwgdW5pdCwKKwkJc2l6ZW9mKHN0cnVjdCB3bGNfaHdfaW5mbykpOwogCWlmICh3bGMtPmh3ID09IE5VTEwpIHsKIAkJKmVyciA9IDEwMDU7CiAJCWdvdG8gZmFpbDsKIAl9CiAJd2xjLT5ody0+d2xjID0gd2xjOwogCi0jaWZkZWYgV0xDX0xPVwogCXdsYy0+aHctPmJhbmRzdGF0ZVswXSA9ICh3bGNfaHdiYW5kX3QgKil3bGNfY2FsbG9jKG9zaCwgdW5pdCwKIAkJKHNpemVvZih3bGNfaHdiYW5kX3QpICogTUFYQkFORFMpKTsKIAlpZiAod2xjLT5ody0+YmFuZHN0YXRlWzBdID09IE5VTEwpIHsKQEAgLTIwOSw3ICsyMTEsNiBAQAogCQkJICAgICAoc2l6ZW9mKHdsY19od2JhbmRfdCkgKiBpKSk7CiAJCX0KIAl9Ci0jZW5kaWYJCQkJLyogV0xDX0xPVyAqLwogCiAJd2xjLT5tb2R1bGVjYiA9IChtb2R1bGVjYl90ICopd2xjX2NhbGxvYyhvc2gsIHVuaXQsCiAJCXNpemVvZihtb2R1bGVjYl90KSAqIFdMQ19NQVhNT0RVTEVTKTsKQEAgLTI2Niw4ICsyNjcsOCBAQAogCQlnb3RvIGZhaWw7CiAJfQogCi0Jd2xjLT5iYW5kc3RhdGVbMF0gPSAod2xjYmFuZF90ICopd2xjX2NhbGxvYyhvc2gsIHVuaXQsCi0JCQkJKHNpemVvZih3bGNiYW5kX3QpICogTUFYQkFORFMpKTsKKwl3bGMtPmJhbmRzdGF0ZVswXSA9IChzdHJ1Y3Qgd2xjYmFuZCAqKXdsY19jYWxsb2Mob3NoLCB1bml0LAorCQkJCShzaXplb2Yoc3RydWN0IHdsY2JhbmQpKk1BWEJBTkRTKSk7CiAJaWYgKHdsYy0+YmFuZHN0YXRlWzBdID09IE5VTEwpIHsKIAkJKmVyciA9IDEwMjU7CiAJCWdvdG8gZmFpbDsKQEAgLTI3NiwxMiArMjc3LDEzIEBACiAKIAkJZm9yIChpID0gMTsgaSA8IE1BWEJBTkRTOyBpKyspIHsKIAkJCXdsYy0+YmFuZHN0YXRlW2ldID0KLQkJCSAgICAod2xjYmFuZF90ICopICgodW5zaWduZWQgbG9uZyl3bGMtPmJhbmRzdGF0ZVswXSArCi0JCQkJCSAgIChzaXplb2Yod2xjYmFuZF90KSAqIGkpKTsKKwkJCSAgICAoc3RydWN0IHdsY2JhbmQgKikgKCh1bnNpZ25lZCBsb25nKXdsYy0+YmFuZHN0YXRlWzBdCisJCQkgICAgKyAoc2l6ZW9mKHN0cnVjdCB3bGNiYW5kKSppKSk7CiAJCX0KIAl9CiAKLQl3bGMtPmNvcmVzdGF0ZSA9ICh3bGNjb3JlX3QgKil3bGNfY2FsbG9jKG9zaCwgdW5pdCwgc2l6ZW9mKHdsY2NvcmVfdCkpOworCXdsYy0+Y29yZXN0YXRlID0gKHN0cnVjdCB3bGNjb3JlICopd2xjX2NhbGxvYyhvc2gsIHVuaXQsCisJCQkJCQkgICAgICBzaXplb2Yoc3RydWN0IHdsY2NvcmUpKTsKIAlpZiAod2xjLT5jb3Jlc3RhdGUgPT0gTlVMTCkgewogCQkqZXJyID0gMTAyNjsKIAkJZ290byBmYWlsOwpAQCAtMzAxLDcgKzMwMyw3IEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKLXZvaWQgd2xjX2RldGFjaF9tZnJlZSh3bGNfaW5mb190ICp3bGMsIG9zbF90ICpvc2gpCit2b2lkIHdsY19kZXRhY2hfbWZyZWUoc3RydWN0IHdsY19pbmZvICp3bGMsIHN0cnVjdCBvc2xfaW5mbyAqb3NoKQogewogCWlmICh3bGMgPT0gTlVMTCkKIAkJcmV0dXJuOwpAQCAtMzU1LDEyICszNTcsMTAgQEAKIAl9CiAKIAlpZiAod2xjLT5odykgewotI2lmZGVmIFdMQ19MT1cKIAkJaWYgKHdsYy0+aHctPmJhbmRzdGF0ZVswXSkgewogCQkJa2ZyZWUod2xjLT5ody0+YmFuZHN0YXRlWzBdKTsKIAkJCXdsYy0+aHctPmJhbmRzdGF0ZVswXSA9IE5VTEw7CiAJCX0KLSNlbmRpZgogCiAJCS8qIGZyZWUgaHcgc3RydWN0ICovCiAJCWtmcmVlKHdsYy0+aHcpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9zeXMvd2xjX2FsbG9jLmggYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3N5cy93bGNfYWxsb2MuaAppbmRleCA2NzhhMmI5Li5hYzM0Zjc4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3N5cy93bGNfYWxsb2MuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3N5cy93bGNfYWxsb2MuaApAQCAtMTQsMTIgKzE0LDEyIEBACiAgKiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgogICovCiAKLWV4dGVybiB2b2lkICp3bGNfY2FsbG9jKG9zbF90ICpvc2gsIHVpbnQgdW5pdCwgdWludCBzaXplKTsKK2V4dGVybiB2b2lkICp3bGNfY2FsbG9jKHN0cnVjdCBvc2xfaW5mbyAqb3NoLCB1aW50IHVuaXQsIHVpbnQgc2l6ZSk7CiAKLWV4dGVybiB3bGNfaW5mb190ICp3bGNfYXR0YWNoX21hbGxvYyhvc2xfdCAqb3NoLCB1aW50IHVuaXQsIHVpbnQgKmVyciwKLQkJCQkgICAgIHVpbnQgZGV2aWQpOwotZXh0ZXJuIHZvaWQgd2xjX2RldGFjaF9tZnJlZSh3bGNfaW5mb190ICp3bGMsIG9zbF90ICpvc2gpOworZXh0ZXJuIHN0cnVjdCB3bGNfaW5mbyAqd2xjX2F0dGFjaF9tYWxsb2Moc3RydWN0IG9zbF9pbmZvICpvc2gsIHVpbnQgdW5pdCwKKwkJCQkJICB1aW50ICplcnIsIHVpbnQgZGV2aWQpOworZXh0ZXJuIHZvaWQgd2xjX2RldGFjaF9tZnJlZShzdHJ1Y3Qgd2xjX2luZm8gKndsYywgc3RydWN0IG9zbF9pbmZvICpvc2gpOwogCiBzdHJ1Y3Qgd2xjX2Jzc2NmZzsKLWV4dGVybiBzdHJ1Y3Qgd2xjX2Jzc2NmZyAqd2xjX2Jzc2NmZ19tYWxsb2Mob3NsX3QgKm9zaCwgdWludCB1bml0KTsKLWV4dGVybiB2b2lkIHdsY19ic3NjZmdfbWZyZWUob3NsX3QgKm9zaCwgc3RydWN0IHdsY19ic3NjZmcgKmNmZyk7CitleHRlcm4gc3RydWN0IHdsY19ic3NjZmcgKndsY19ic3NjZmdfbWFsbG9jKHN0cnVjdCBvc2xfaW5mbyAqb3NoLCB1aW50IHVuaXQpOworZXh0ZXJuIHZvaWQgd2xjX2Jzc2NmZ19tZnJlZShzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgc3RydWN0IHdsY19ic3NjZmcgKmNmZyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3N5cy93bGNfYW1wZHUuYyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvc3lzL3dsY19hbXBkdS5jCmluZGV4IGE0ZTQ5ZjMuLmQ3NDk5MTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvc3lzL3dsY19hbXBkdS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvc3lzL3dsY19hbXBkdS5jCkBAIC0xNiwxOSArMTYsMTkgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDx3bGNfY2ZnLmg+CiAjaW5jbHVkZSA8YmNtZGVmcy5oPgotI2luY2x1ZGUgPGxpbnV4dmVyLmg+Ci0jaW5jbHVkZSA8YmNtZGVmcy5oPgogI2luY2x1ZGUgPG9zbC5oPgogI2luY2x1ZGUgPGJjbXV0aWxzLmg+CiAjaW5jbHVkZSA8c2l1dGlscy5oPgogI2luY2x1ZGUgPGJjbWVuZGlhbi5oPgogI2luY2x1ZGUgPHdsaW9jdGwuaD4KKyNpbmNsdWRlIDxzYmhuZHBpby5oPgogI2luY2x1ZGUgPHNiaG5kZG1hLmg+CiAjaW5jbHVkZSA8aG5kZG1hLmg+CiAjaW5jbHVkZSA8ZDExLmg+CiAjaW5jbHVkZSA8d2xjX3JhdGUuaD4KICNpbmNsdWRlIDx3bGNfcHViLmg+CiAjaW5jbHVkZSA8d2xjX2tleS5oPgorI2luY2x1ZGUgPHdsY19ldmVudC5oPgogI2luY2x1ZGUgPHdsY19tYWM4MDIxMS5oPgogI2luY2x1ZGUgPHdsY19waHlfaGFsLmg+CiAjaW5jbHVkZSA8d2xjX2FudHNlbC5oPgpAQCAtMzYsMTEgKzM2LDggQEAKICNpbmNsdWRlIDxuZXQvbWFjODAyMTEuaD4KICNpbmNsdWRlIDx3bGNfYW1wZHUuaD4KICNpbmNsdWRlIDx3bF9leHBvcnQuaD4KKyNpbmNsdWRlIDx3bF9kYmcuaD4KIAotI2lmZGVmIFdMQ19ISUdIX09OTFkKLSNpbmNsdWRlIDxiY21fcnBjX3RwLmg+Ci0jaW5jbHVkZSA8d2xjX3JwY3R4Lmg+Ci0jZW5kaWYKIAogI2RlZmluZSBBTVBEVV9NQVhfTVBEVQkJMzIJLyogbWF4IG51bWJlciBvZiBtcGR1cyBpbiBhbiBhbXBkdSAqLwogI2RlZmluZSBBTVBEVV9OVU1fTVBEVV9MRUdBQ1kJMTYJLyogbWF4IG51bWJlciBvZiBtcGR1cyBpbiBhbiBhbXBkdSB0byBhIGxlZ2FjeSAqLwpAQCAtMTAxLDcgKzk4LDcgQEAKIAogLyogQU1QRFUgbW9kdWxlIHNwZWNpZmljIHN0YXRlICovCiBzdHJ1Y3QgYW1wZHVfaW5mbyB7Ci0Jd2xjX2luZm9fdCAqd2xjOwkvKiBwb2ludGVyIHRvIG1haW4gd2xjIHN0cnVjdHVyZSAqLworCXN0cnVjdCB3bGNfaW5mbyAqd2xjOwkvKiBwb2ludGVyIHRvIG1haW4gd2xjIHN0cnVjdHVyZSAqLwogCWludCBzY2JfaGFuZGxlOwkJLyogc2NiIGN1YmJ5IGhhbmRsZSB0byByZXRyaWV2ZSBkYXRhIGZyb20gc2NiICovCiAJdTggaW5pX2VuYWJsZVtBTVBEVV9NQVhfU0NCX1RJRF07CS8qIHBlci10aWQgaW5pdGlhdG9yIGVuYWJsZS9kaXNhYmxlIG9mIGFtcGR1ICovCiAJdTggYmFfdHhfd3NpemU7CS8qIFR4IGJhIHdpbmRvdyBzaXplIChpbiBwZHUpICovCkBAIC0xMjUsMTEgKzEyMiw2IEBACiAJCQkJICovCiAJd2xjX2ZpZm9faW5mb190IGZpZm9fdGJbTlVNX0ZGUExEX0ZJRk9dOwkvKiB0YWJsZSBvZiBmaWZvIGluZm9zICAqLwogCi0jaWZkZWYgV0xDX0hJR0hfT05MWQotCXZvaWQgKnA7Ci0JdHhfc3RhdHVzX3QgdHhzOwotCWJvb2wgd2FpdGluZ19zdGF0dXM7CS8qIFRvIGhlbHAgc2FuaXR5IGNoZWNrcyAqLwotI2VuZGlmCiB9OwogCiAjZGVmaW5lIEFNUERVX0NMRUFOVVBGTEFHX1JYICAgKDB4MSkKQEAgLTEzOCwzOCArMTMwLDM5IEBACiAjZGVmaW5lIFNDQl9BTVBEVV9DVUJCWShhbXBkdSwgc2NiKSAoJihzY2ItPnNjYl9hbXBkdSkpCiAjZGVmaW5lIFNDQl9BTVBEVV9JTkkoc2NiX2FtcGR1LCB0aWQpICgmKHNjYl9hbXBkdS0+aW5pW3RpZF0pKQogCi1zdGF0aWMgdm9pZCB3bGNfZmZwbGRfaW5pdChhbXBkdV9pbmZvX3QgKmFtcGR1KTsKLXN0YXRpYyBpbnQgd2xjX2ZmcGxkX2NoZWNrX3R4ZnVuZmwod2xjX2luZm9fdCAqd2xjLCBpbnQgZik7Ci1zdGF0aWMgdm9pZCB3bGNfZmZwbGRfY2FsY19tY3MyYW1wZHVfdGFibGUoYW1wZHVfaW5mb190ICphbXBkdSwgaW50IGYpOworc3RhdGljIHZvaWQgd2xjX2ZmcGxkX2luaXQoc3RydWN0IGFtcGR1X2luZm8gKmFtcGR1KTsKK3N0YXRpYyBpbnQgd2xjX2ZmcGxkX2NoZWNrX3R4ZnVuZmwoc3RydWN0IHdsY19pbmZvICp3bGMsIGludCBmKTsKK3N0YXRpYyB2b2lkIHdsY19mZnBsZF9jYWxjX21jczJhbXBkdV90YWJsZShzdHJ1Y3QgYW1wZHVfaW5mbyAqYW1wZHUsIGludCBmKTsKIAotc3RhdGljIHNjYl9hbXBkdV90aWRfaW5pX3QgKndsY19hbXBkdV9pbml0X3RpZF9pbmkoYW1wZHVfaW5mb190ICphbXBkdSwKK3N0YXRpYyBzY2JfYW1wZHVfdGlkX2luaV90ICp3bGNfYW1wZHVfaW5pdF90aWRfaW5pKHN0cnVjdCBhbXBkdV9pbmZvICphbXBkdSwKIAkJCQkJCSAgIHNjYl9hbXBkdV90ICpzY2JfYW1wZHUsCiAJCQkJCQkgICB1OCB0aWQsIGJvb2wgb3ZlcnJpZGUpOwotc3RhdGljIHZvaWQgYW1wZHVfY2xlYW51cF90aWRfaW5pKGFtcGR1X2luZm9fdCAqYW1wZHUsIHNjYl9hbXBkdV90ICpzY2JfYW1wZHUsCitzdGF0aWMgdm9pZCBhbXBkdV9jbGVhbnVwX3RpZF9pbmkoc3RydWN0IGFtcGR1X2luZm8gKmFtcGR1LAorCQkJCSAgc2NiX2FtcGR1X3QgKnNjYl9hbXBkdSwKIAkJCQkgIHU4IHRpZCwgYm9vbCBmb3JjZSk7Ci1zdGF0aWMgdm9pZCBhbXBkdV91cGRhdGVfbWF4X3R4bGVuKGFtcGR1X2luZm9fdCAqYW1wZHUsIHU4IGR1cik7Ci1zdGF0aWMgdm9pZCBzY2JfYW1wZHVfdXBkYXRlX2NvbmZpZyhhbXBkdV9pbmZvX3QgKmFtcGR1LCBzdHJ1Y3Qgc2NiICpzY2IpOwotc3RhdGljIHZvaWQgc2NiX2FtcGR1X3VwZGF0ZV9jb25maWdfYWxsKGFtcGR1X2luZm9fdCAqYW1wZHUpOworc3RhdGljIHZvaWQgYW1wZHVfdXBkYXRlX21heF90eGxlbihzdHJ1Y3QgYW1wZHVfaW5mbyAqYW1wZHUsIHU4IGR1cik7CitzdGF0aWMgdm9pZCBzY2JfYW1wZHVfdXBkYXRlX2NvbmZpZyhzdHJ1Y3QgYW1wZHVfaW5mbyAqYW1wZHUsIHN0cnVjdCBzY2IgKnNjYik7CitzdGF0aWMgdm9pZCBzY2JfYW1wZHVfdXBkYXRlX2NvbmZpZ19hbGwoc3RydWN0IGFtcGR1X2luZm8gKmFtcGR1KTsKIAogI2RlZmluZSB3bGNfYW1wZHVfdHhmbG93Y29udHJvbChhLCBiLCBjKQlkbyB7fSB3aGlsZSAoMCkKIAotc3RhdGljIHZvaWQgd2xjX2FtcGR1X2RvdHhzdGF0dXNfY29tcGxldGUoYW1wZHVfaW5mb190ICphbXBkdSwgc3RydWN0IHNjYiAqc2NiLAotCQkJCQkgIHZvaWQgKnAsIHR4X3N0YXR1c190ICp0eHMsCi0JCQkJCSAgdTMyIGZybXR4c3RhdHVzLAotCQkJCQkgIHUzMiBmcm10eHN0YXR1czIpOworc3RhdGljIHZvaWQgd2xjX2FtcGR1X2RvdHhzdGF0dXNfY29tcGxldGUoc3RydWN0IGFtcGR1X2luZm8gKmFtcGR1LAorCQkJCQkgIHN0cnVjdCBzY2IgKnNjYiwKKwkJCQkJICBzdHJ1Y3Qgc2tfYnVmZiAqcCwgdHhfc3RhdHVzX3QgKnR4cywKKwkJCQkJICB1MzIgZnJtdHhzdGF0dXMsIHUzMiBmcm10eHN0YXR1czIpOwogCi1zdGF0aWMgaW5saW5lIHUxNiBwa3RfdHhoX3NlcW51bSh3bGNfaW5mb190ICp3bGMsIHZvaWQgKnApCitzdGF0aWMgaW5saW5lIHUxNiBwa3RfdHhoX3NlcW51bShzdHJ1Y3Qgd2xjX2luZm8gKndsYywgc3RydWN0IHNrX2J1ZmYgKnApCiB7CiAJZDExdHhoX3QgKnR4aDsKIAlzdHJ1Y3QgZG90MTFfaGVhZGVyICpoOwotCXR4aCA9IChkMTF0eGhfdCAqKSBQS1REQVRBKHApOworCXR4aCA9IChkMTF0eGhfdCAqKSBwLT5kYXRhOwogCWggPSAoc3RydWN0IGRvdDExX2hlYWRlciAqKSgodTggKikgKHR4aCArIDEpICsgRDExX1BIWV9IRFJfTEVOKTsKIAlyZXR1cm4gbHRvaDE2KGgtPnNlcSkgPj4gU0VRTlVNX1NISUZUOwogfQogCi1hbXBkdV9pbmZvX3QgKndsY19hbXBkdV9hdHRhY2god2xjX2luZm9fdCAqd2xjKQorc3RydWN0IGFtcGR1X2luZm8gKndsY19hbXBkdV9hdHRhY2goc3RydWN0IHdsY19pbmZvICp3bGMpCiB7Ci0JYW1wZHVfaW5mb190ICphbXBkdTsKKwlzdHJ1Y3QgYW1wZHVfaW5mbyAqYW1wZHU7CiAJaW50IGk7CiAKIAkvKiBzb21lIGNvZGUgZGVwZW5kcyBvbiBwYWNrZWQgc3RydWN0dXJlcyAqLwpAQCAtMTc5LDkgKzE3MiwxMCBAQAogCUFTU0VSVCh3bGMtPnB1Yi0+dHVuYWJsZXMtPmFtcGR1bnVtbXBkdSA8PSBBTVBEVV9NQVhfTVBEVSk7CiAJQVNTRVJUKHdsYy0+cHViLT50dW5hYmxlcy0+YW1wZHVudW1tcGR1ID4gMCk7CiAKLQlhbXBkdSA9IGt6YWxsb2Moc2l6ZW9mKGFtcGR1X2luZm9fdCksIEdGUF9BVE9NSUMpOworCWFtcGR1ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGFtcGR1X2luZm8pLCBHRlBfQVRPTUlDKTsKIAlpZiAoIWFtcGR1KSB7Ci0JCVdMX0VSUk9SKCgid2wlZDogd2xjX2FtcGR1X2F0dGFjaDogb3V0IG9mIG1lbVxuIiwgd2xjLT5wdWItPnVuaXQpKTsKKwkJV0xfRVJST1IoIndsJWQ6IHdsY19hbXBkdV9hdHRhY2g6IG91dCBvZiBtZW1cbiIsCisJCQkgd2xjLT5wdWItPnVuaXQpOwogCQlyZXR1cm4gTlVMTDsKIAl9CiAJYW1wZHUtPndsYyA9IHdsYzsKQEAgLTIwOSwxMCArMjAzLDYgQEAKIAkJYW1wZHUtPnJ4X2ZhY3RvciA9IEFNUERVX1JYX0ZBQ1RPUl8zMks7CiAJZWxzZQogCQlhbXBkdS0+cnhfZmFjdG9yID0gQU1QRFVfUlhfRkFDVE9SXzY0SzsKLSNpZmRlZiBXTENfSElHSF9PTkxZCi0JLyogUmVzdHJpY3QgdG8gc21hbGxlciByY3Ygc2l6ZSBmb3IgQk1BQyBkb25nbGUgKi8KLQlhbXBkdS0+cnhfZmFjdG9yID0gQU1QRFVfUlhfRkFDVE9SXzMySzsKLSNlbmRpZgogCWFtcGR1LT5yZXRyeV9saW1pdCA9IEFNUERVX0RFRl9SRVRSWV9MSU1JVDsKIAlhbXBkdS0+cnJfcmV0cnlfbGltaXQgPSBBTVBEVV9ERUZfUlJfUkVUUllfTElNSVQ7CiAKQEAgLTIzMiw3ICsyMjIsNyBAQAogCXJldHVybiBhbXBkdTsKIH0KIAotdm9pZCB3bGNfYW1wZHVfZGV0YWNoKGFtcGR1X2luZm9fdCAqYW1wZHUpCit2b2lkIHdsY19hbXBkdV9kZXRhY2goc3RydWN0IGFtcGR1X2luZm8gKmFtcGR1KQogewogCWludCBpOwogCkBAIC0yNTAsMTIgKzI0MCwxMiBAQAogCWtmcmVlKGFtcGR1KTsKIH0KIAotdm9pZCBzY2JfYW1wZHVfY2xlYW51cChhbXBkdV9pbmZvX3QgKmFtcGR1LCBzdHJ1Y3Qgc2NiICpzY2IpCit2b2lkIHNjYl9hbXBkdV9jbGVhbnVwKHN0cnVjdCBhbXBkdV9pbmZvICphbXBkdSwgc3RydWN0IHNjYiAqc2NiKQogewogCXNjYl9hbXBkdV90ICpzY2JfYW1wZHUgPSBTQ0JfQU1QRFVfQ1VCQlkoYW1wZHUsIHNjYik7CiAJdTggdGlkOwogCi0JV0xfQU1QRFVfVVBETigoInNjYl9hbXBkdV9jbGVhbnVwOiBlbnRlclxuIikpOworCVdMX0FNUERVX1VQRE4oInNjYl9hbXBkdV9jbGVhbnVwOiBlbnRlclxuIik7CiAJQVNTRVJUKHNjYl9hbXBkdSk7CiAKIAlmb3IgKHRpZCA9IDA7IHRpZCA8IEFNUERVX01BWF9TQ0JfVElEOyB0aWQrKykgewpAQCAtMjY2LDEyICsyNTYsMTIgQEAKIC8qIHJlc2V0IHRoZSBhbXBkdSBzdGF0ZSBtYWNoaW5lIHNvIHRoYXQgaXQgY2FuIGdyYWNlZnVsbHkgaGFuZGxlIHBhY2tldHMgdGhhdCB3ZXJlCiAgKiBmcmVlZCBmcm9tIHRoZSBkbWEgYW5kIHR4IHF1ZXVlcyBkdXJpbmcgcmVpbml0CiAgKi8KLXZvaWQgd2xjX2FtcGR1X3Jlc2V0KGFtcGR1X2luZm9fdCAqYW1wZHUpCit2b2lkIHdsY19hbXBkdV9yZXNldChzdHJ1Y3QgYW1wZHVfaW5mbyAqYW1wZHUpCiB7Ci0JV0xfTk9ORSgoIiVzOiBFbnRlcmluZ1xuIiwgX19mdW5jX18pKTsKKwlXTF9OT05FKCIlczogRW50ZXJpbmdcbiIsIF9fZnVuY19fKTsKIH0KIAotc3RhdGljIHZvaWQgc2NiX2FtcGR1X3VwZGF0ZV9jb25maWcoYW1wZHVfaW5mb190ICphbXBkdSwgc3RydWN0IHNjYiAqc2NiKQorc3RhdGljIHZvaWQgc2NiX2FtcGR1X3VwZGF0ZV9jb25maWcoc3RydWN0IGFtcGR1X2luZm8gKmFtcGR1LCBzdHJ1Y3Qgc2NiICpzY2IpCiB7CiAJc2NiX2FtcGR1X3QgKnNjYl9hbXBkdSA9IFNDQl9BTVBEVV9DVUJCWShhbXBkdSwgc2NiKTsKIAlpbnQgaTsKQEAgLTMwMSwxMiArMjkxLDEyIEBACiAJQVNTRVJUKHNjYl9hbXBkdS0+cmVsZWFzZSk7CiB9CiAKLXZvaWQgc2NiX2FtcGR1X3VwZGF0ZV9jb25maWdfYWxsKGFtcGR1X2luZm9fdCAqYW1wZHUpCit2b2lkIHNjYl9hbXBkdV91cGRhdGVfY29uZmlnX2FsbChzdHJ1Y3QgYW1wZHVfaW5mbyAqYW1wZHUpCiB7CiAJc2NiX2FtcGR1X3VwZGF0ZV9jb25maWcoYW1wZHUsIGFtcGR1LT53bGMtPnB1Yi0+Z2xvYmFsX3NjYik7CiB9CiAKLXN0YXRpYyB2b2lkIHdsY19mZnBsZF9pbml0KGFtcGR1X2luZm9fdCAqYW1wZHUpCitzdGF0aWMgdm9pZCB3bGNfZmZwbGRfaW5pdChzdHJ1Y3QgYW1wZHVfaW5mbyAqYW1wZHUpCiB7CiAJaW50IGksIGo7CiAJd2xjX2ZpZm9faW5mb190ICpmaWZvOwpAQCAtMzMwLDkgKzMyMCw5IEBACiAgKiBSZXR1cm4gMSBpZiBwcmUtbG9hZGluZyBub3QgYWN0aXZlLCAtMSBpZiBub3QgYW4gdW5kZXJmbG93IGV2ZW50LAogICogMCBpZiBwcmUtbG9hZGluZyBtb2R1bGUgdG9vayBjYXJlIG9mIHRoZSBldmVudC4KICAqLwotc3RhdGljIGludCB3bGNfZmZwbGRfY2hlY2tfdHhmdW5mbCh3bGNfaW5mb190ICp3bGMsIGludCBmaWQpCitzdGF0aWMgaW50IHdsY19mZnBsZF9jaGVja190eGZ1bmZsKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCBpbnQgZmlkKQogewotCWFtcGR1X2luZm9fdCAqYW1wZHUgPSB3bGMtPmFtcGR1OworCXN0cnVjdCBhbXBkdV9pbmZvICphbXBkdSA9IHdsYy0+YW1wZHU7CiAJdTMyIHBoeV9yYXRlID0gTUNTX1JBVEUoRkZQTERfTUFYX01DUywgdHJ1ZSwgZmFsc2UpOwogCXUzMiB0eHVuZmxfcmF0aW87CiAJdTggbWF4X21wZHU7CkBAIC0zNDksNyArMzM5LDcgQEAKIAkJCSBNX1VDT0RFX01BQ1NUQVQgKyBvZmZzZXRvZihtYWNzdGF0X3QsIHR4ZnVuZmxbZmlkXSkpOwogCW5ld190eHVuZmwgPSAodTE2KSAoY3VyX3R4dW5mbCAtIGZpZm8tPnByZXZfdHhmdW5mbCk7CiAJaWYgKG5ld190eHVuZmwgPT0gMCkgewotCQlXTF9GRlBMRCgoImNoZWNrX3R4dW5mbCA6IFRYIHN0YXR1cyBGUkFHIHNldCBidXQgbm8gdHggdW5kZXJmbG93c1xuIikpOworCQlXTF9GRlBMRCgiY2hlY2tfdHh1bmZsIDogVFggc3RhdHVzIEZSQUcgc2V0IGJ1dCBubyB0eCB1bmRlcmZsb3dzXG4iKTsKIAkJcmV0dXJuIC0xOwogCX0KIAlmaWZvLT5wcmV2X3R4ZnVuZmwgPSBjdXJfdHh1bmZsOwpAQCAtMzU5LDcgKzM0OSw3IEBACiAKIAkvKiBjaGVjayBpZiBmaWZvIGlzIGJpZyBlbm91Z2ggKi8KIAlpZiAod2xjX3htdGZpZm9fc3pfZ2V0KHdsYywgZmlkLCAmeG10Zmlmb19zeikpIHsKLQkJV0xfRkZQTEQoKCJjaGVja190eHVuZmwgOiBnZXQgeG10Zmlmb19zeiBmYWlsZWQuXG4iKSk7CisJCVdMX0ZGUExEKCJjaGVja190eHVuZmwgOiBnZXQgeG10Zmlmb19zeiBmYWlsZWRcbiIpOwogCQlyZXR1cm4gLTE7CiAJfQogCkBAIC0zNzMsOCArMzYzLDggQEAKIAlpZiAoZmlmby0+YWNjdW1fdHhmdW5mbCA8IDEwKQogCQlyZXR1cm4gMDsKIAotCVdMX0ZGUExEKCgiYW1wZHVfY291bnQgJWQgIHR4X3VuZGVyZmxvd3MgJWRcbiIsCi0JCSAgY3VycmVudF9hbXBkdV9jbnQsIGZpZm8tPmFjY3VtX3R4ZnVuZmwpKTsKKwlXTF9GRlBMRCgiYW1wZHVfY291bnQgJWQgIHR4X3VuZGVyZmxvd3MgJWRcbiIsCisJCSBjdXJyZW50X2FtcGR1X2NudCwgZmlmby0+YWNjdW1fdHhmdW5mbCk7CiAKIAkvKgogCSAgIGNvbXB1dGUgdGhlIGN1cnJlbnQgcmF0aW8gb2YgdHggdW5mbCBwZXIgYW1wZHUuCkBAIC00MjcsOCArNDE3LDggQEAKIAkJICAgICAgKG1heF9tcGR1ICogRkZQTERfTVBEVV9TSVpFIC0gZmlmby0+YW1wZHVfcGxkX3NpemUpKQogCQkgICAgIC8gKG1heF9tcGR1ICogRkZQTERfTVBEVV9TSVpFKSkgKiAxMDA7CiAKLQkJV0xfRkZQTEQoKCJETUEgZXN0aW1hdGVkIHRyYW5zZmVyIHJhdGUgJWQ7IHByZS1sb2FkIHNpemUgJWRcbiIsCi0JCQkgIGZpZm8tPmRtYXhmZXJyYXRlLCBmaWZvLT5hbXBkdV9wbGRfc2l6ZSkpOworCQlXTF9GRlBMRCgiRE1BIGVzdGltYXRlZCB0cmFuc2ZlciByYXRlICVkOyBwcmUtbG9hZCBzaXplICVkXG4iLAorCQkJIGZpZm8tPmRtYXhmZXJyYXRlLCBmaWZvLT5hbXBkdV9wbGRfc2l6ZSk7CiAJfSBlbHNlIHsKIAogCQkvKiBkZWNyZWFzZSBhbXBkdSBzaXplICovCkBAIC00NTAsNyArNDQwLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgd2xjX2ZmcGxkX2NhbGNfbWNzMmFtcGR1X3RhYmxlKGFtcGR1X2luZm9fdCAqYW1wZHUsIGludCBmKQorc3RhdGljIHZvaWQgd2xjX2ZmcGxkX2NhbGNfbWNzMmFtcGR1X3RhYmxlKHN0cnVjdCBhbXBkdV9pbmZvICphbXBkdSwgaW50IGYpCiB7CiAJaW50IGk7CiAJdTMyIHBoeV9yYXRlLCBkbWFfcmF0ZSwgdG1wOwpAQCAtNDgzLDExICs0NzMsMTIgQEAKIH0KIAogc3RhdGljIHZvaWQgQkNNRkFTVFBBVEgKLXdsY19hbXBkdV9hZ2coYW1wZHVfaW5mb190ICphbXBkdSwgc3RydWN0IHNjYiAqc2NiLCB2b2lkICpwLCB1aW50IHByZWMpCit3bGNfYW1wZHVfYWdnKHN0cnVjdCBhbXBkdV9pbmZvICphbXBkdSwgc3RydWN0IHNjYiAqc2NiLCBzdHJ1Y3Qgc2tfYnVmZiAqcCwKKwkgICAgICB1aW50IHByZWMpCiB7CiAJc2NiX2FtcGR1X3QgKnNjYl9hbXBkdTsKIAlzY2JfYW1wZHVfdGlkX2luaV90ICppbmk7Ci0JdTggdGlkID0gKHU4KSBQS1RQUklPKHApOworCXU4IHRpZCA9ICh1OCkgKHAtPnByaW9yaXR5KTsKIAogCXNjYl9hbXBkdSA9IFNDQl9BTVBEVV9DVUJCWShhbXBkdSwgc2NiKTsKIApAQCAtNTAwLDExICs0OTEsMTIgQEAKIH0KIAogaW50IEJDTUZBU1RQQVRICi13bGNfc2VuZGFtcGR1KGFtcGR1X2luZm9fdCAqYW1wZHUsIHdsY190eHFfaW5mb190ICpxaSwgdm9pZCAqKnBkdSwgaW50IHByZWMpCit3bGNfc2VuZGFtcGR1KHN0cnVjdCBhbXBkdV9pbmZvICphbXBkdSwgd2xjX3R4cV9pbmZvX3QgKnFpLAorCSAgICAgIHN0cnVjdCBza19idWZmICoqcGR1LCBpbnQgcHJlYykKIHsKLQl3bGNfaW5mb190ICp3bGM7Ci0Jb3NsX3QgKm9zaDsKLQl2b2lkICpwLCAqcGt0W0FNUERVX01BWF9NUERVXTsKKwlzdHJ1Y3Qgd2xjX2luZm8gKndsYzsKKwlzdHJ1Y3Qgb3NsX2luZm8gKm9zaDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqcCwgKnBrdFtBTVBEVV9NQVhfTVBEVV07CiAJdTggdGlkLCBuZGVsaW07CiAJaW50IGVyciA9IDA7CiAJdTggcHJlYW1ibGVfdHlwZSA9IFdMQ19HRl9QUkVBTUJMRTsKQEAgLTU0MCw3ICs1MzIsNyBAQAogCiAJQVNTRVJUKHApOwogCi0JdGlkID0gKHU4KSBQS1RQUklPKHApOworCXRpZCA9ICh1OCkgKHAtPnByaW9yaXR5KTsKIAlBU1NFUlQodGlkIDwgQU1QRFVfTUFYX1NDQl9USUQpOwogCiAJZiA9IGFtcGR1LT5maWZvX3RiICsgcHJpbzJmaWZvW3RpZF07CkBAIC01NjEsNyArNTUzLDcgQEAKIAl3bGNfYW1wZHVfYWdnKGFtcGR1LCBzY2IsIHAsIHRpZCk7CiAKIAlpZiAod2xjLT5ibG9ja19kYXRhZmlmbykgewotCQlXTF9FUlJPUigoIiVzOiBGaWZvIGJsb2NrZWRcbiIsIF9fZnVuY19fKSk7CisJCVdMX0VSUk9SKCIlczogRmlmbyBibG9ja2VkXG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybiBCQ01FX0JVU1k7CiAJfQogCXJyX3JldHJ5X2xpbWl0ID0gYW1wZHUtPnJyX3JldHJ5X2xpbWl0X3RpZFt0aWRdOwpAQCAtNTc2LDcgKzU2OCw3IEBACiAJCWlmICh0eF9pbmZvLT5mbGFncyAmIElFRUU4MDIxMV9UWF9DVExfQU1QRFUpIHsKIAkJCWVyciA9IHdsY19wcmVwX3BkdSh3bGMsIHAsICZmaWZvKTsKIAkJfSBlbHNlIHsKLQkJCVdMX0VSUk9SKCgiJXM6IEFNUERVIGZsYWcgaXMgb2ZmIVxuIiwgX19mdW5jX18pKTsKKwkJCVdMX0VSUk9SKCIlczogQU1QRFUgZmxhZyBpcyBvZmYhXG4iLCBfX2Z1bmNfXyk7CiAJCQkqcGR1ID0gTlVMTDsKIAkJCWVyciA9IDA7CiAJCQlicmVhazsKQEAgLTU4NCwxNCArNTc2LDE2IEBACiAKIAkJaWYgKGVycikgewogCQkJaWYgKGVyciA9PSBCQ01FX0JVU1kpIHsKLQkJCQlXTF9FUlJPUigoIndsJWQ6IHdsY19zZW5kYW1wZHU6IHByZXBfeGR1IHJldHJ5OyBzZXEgMHgleFxuIiwgd2xjLT5wdWItPnVuaXQsIHNlcSkpOworCQkJCVdMX0VSUk9SKCJ3bCVkOiB3bGNfc2VuZGFtcGR1OiBwcmVwX3hkdSByZXRyeTsgc2VxIDB4JXhcbiIsCisJCQkJCSB3bGMtPnB1Yi0+dW5pdCwgc2VxKTsKIAkJCQlXTENOVElOQ1IoYW1wZHUtPmNudC0+c2R1cmV0cnkpOwogCQkJCSpwZHUgPSBwOwogCQkJCWJyZWFrOwogCQkJfQogCiAJCQkvKiBlcnJvciBpbiB0aGUgcGFja2V0OyByZWplY3QgaXQgKi8KLQkJCVdMX0FNUERVX0VSUigoIndsJWQ6IHdsY19zZW5kYW1wZHU6IHByZXBfeGR1IHJlamVjdGVkOyBzZXEgMHgleFxuIiwgd2xjLT5wdWItPnVuaXQsIHNlcSkpOworCQkJV0xfQU1QRFVfRVJSKCJ3bCVkOiB3bGNfc2VuZGFtcGR1OiBwcmVwX3hkdSByZWplY3RlZDsgc2VxIDB4JXhcbiIsCisJCQkJICAgICB3bGMtPnB1Yi0+dW5pdCwgc2VxKTsKIAkJCVdMQ05USU5DUihhbXBkdS0+Y250LT5zZHVyZWplY3RlZCk7CiAKIAkJCSpwZHUgPSBOVUxMOwpAQCAtNjAwLDcgKzU5NCw3IEBACiAKIAkJLyogcGt0IGlzIGdvb2QgdG8gYmUgYWdncmVnYXRlZCAqLwogCQlBU1NFUlQodHhfaW5mby0+ZmxhZ3MgJiBJRUVFODAyMTFfVFhfQ1RMX0FNUERVKTsKLQkJdHhoID0gKGQxMXR4aF90ICopIFBLVERBVEEocCk7CisJCXR4aCA9IChkMTF0eGhfdCAqKSBwLT5kYXRhOwogCQlwbGNwID0gKHU4ICopICh0eGggKyAxKTsKIAkJaCA9IChzdHJ1Y3QgZG90MTFfaGVhZGVyICopKHBsY3AgKyBEMTFfUEhZX0hEUl9MRU4pOwogCQlzZXEgPSBsdG9oMTYoaC0+c2VxKSA+PiBTRVFOVU1fU0hJRlQ7CkBAIC02MzMsOCArNjI3LDggQEAKIAkJbmRlbGltID0gdHhoLT5SVFNQTENQRmFsbGJhY2tbQU1QRFVfRkJSX05VTExfREVMSU1dOwogCQlzZWdfY250ICs9IDE7CiAKLQkJV0xfQU1QRFVfVFgoKCJ3bCVkOiB3bGNfc2VuZGFtcGR1OiBtcGR1ICVkIHBsY3BfbGVuICVkXG4iLAotCQkJICAgICB3bGMtPnB1Yi0+dW5pdCwgY291bnQsIGxlbikpOworCQlXTF9BTVBEVV9UWCgid2wlZDogd2xjX3NlbmRhbXBkdTogbXBkdSAlZCBwbGNwX2xlbiAlZFxuIiwKKwkJCSAgICB3bGMtPnB1Yi0+dW5pdCwgY291bnQsIGxlbik7CiAKIAkJLyoKIAkJICogYWdncmVnYXRlYWJsZSBtcGR1LiBGb3IgdWNvZGUvaHcgYWdnLApAQCAtNjY1LDcgKzY1OSw4IEBACiAKIAkJZG1hX2xlbiArPSAodTE2KSBwa3R0b3RsZW4ob3NoLCBwKTsKIAotCQlXTF9BTVBEVV9UWCgoIndsJWQ6IHdsY19zZW5kYW1wZHU6IGFtcGR1X2xlbiAlZCBzZWdfY250ICVkIG51bGwgZGVsaW0gJWRcbiIsIHdsYy0+cHViLT51bml0LCBhbXBkdV9sZW4sIHNlZ19jbnQsIG5kZWxpbSkpOworCQlXTF9BTVBEVV9UWCgid2wlZDogd2xjX3NlbmRhbXBkdTogYW1wZHVfbGVuICVkIHNlZ19jbnQgJWQgbnVsbCBkZWxpbSAlZFxuIiwKKwkJCSAgICB3bGMtPnB1Yi0+dW5pdCwgYW1wZHVfbGVuLCBzZWdfY250LCBuZGVsaW0pOwogCiAJCXR4aC0+TWFjVHhDb250cm9sTG93ID0gaHRvbDE2KG1jbCk7CiAKQEAgLTY5NSw4ICs2OTAsOCBAQAogCQkJICAgIG1pbihzY2JfYW1wZHUtPm1heF9yeGxlbiwKIAkJCQlhbXBkdS0+bWF4X3R4bGVuW21jc11baXM0MF1bc2dpXSk7CiAKLQkJCVdMX05PTkUoKCJzZW5kYW1wZHU6IHNnaSAlZCwgaXM0MCAlZCwgbWNzICVkXG4iLCBzZ2ksCi0JCQkJIGlzNDAsIG1jcykpOworCQkJV0xfTk9ORSgic2VuZGFtcGR1OiBzZ2kgJWQsIGlzNDAgJWQsIG1jcyAlZFxuIiwKKwkJCQlzZ2ksIGlzNDAsIG1jcyk7CiAKIAkJCW1heGxlbiA9IDY0ICogMTAyNDsJLyogWFhYIEZpeCBtZSB0byBob25vciByZWFsIG1heF9yeGxlbiAqLwogCkBAIC03MzksMTMgKzczNCwxNCBAQAogCQkvKiB0ZXN0IHdoZXRoZXIgdG8gYWRkIG1vcmUgKi8KIAkJaWYgKChNQ1NfUkFURShtY3MsIHRydWUsIGZhbHNlKSA+PSBmLT5kbWF4ZmVycmF0ZSkgJiYKIAkJICAgIChjb3VudCA9PSBmLT5tY3MyYW1wZHVfdGFibGVbbWNzXSkpIHsKLQkJCVdMX0FNUERVX0VSUigoIndsJWQ6IFBSIDM3NjQ0OiBzdG9wcGluZyBhbXBkdSBhdCAlZCBmb3IgbWNzICVkIiwgd2xjLT5wdWItPnVuaXQsIGNvdW50LCBtY3MpKTsKKwkJCVdMX0FNUERVX0VSUigid2wlZDogUFIgMzc2NDQ6IHN0b3BwaW5nIGFtcGR1IGF0ICVkIGZvciBtY3MgJWRcbiIsCisJCQkJICAgICB3bGMtPnB1Yi0+dW5pdCwgY291bnQsIG1jcyk7CiAJCQlicmVhazsKIAkJfQogCiAJCWlmIChjb3VudCA9PSBzY2JfYW1wZHUtPm1heF9wZHUpIHsKLQkJCVdMX05PTkUoKCJTdG9wIHRha2luZyBmcm9tIHEsIHJlYWNoZWQgJWQgZGVlcFxuIiwKLQkJCQkgc2NiX2FtcGR1LT5tYXhfcGR1KSk7CisJCQlXTF9OT05FKCJTdG9wIHRha2luZyBmcm9tIHEsIHJlYWNoZWQgJWQgZGVlcFxuIiwKKwkJCQlzY2JfYW1wZHUtPm1heF9wZHUpOwogCQkJYnJlYWs7CiAJCX0KIApAQCAtNzU1LDcgKzc1MSw3IEBACiAKIAkJaWYgKHApIHsKIAkJCWlmICgodHhfaW5mby0+ZmxhZ3MgJiBJRUVFODAyMTFfVFhfQ1RMX0FNUERVKSAmJgotCQkJICAgICgodTgpIFBLVFBSSU8ocCkgPT0gdGlkKSkgeworCQkJICAgICgodTgpIChwLT5wcmlvcml0eSkgPT0gdGlkKSkgewogCiAJCQkJcGxlbiA9CiAJCQkJICAgIHBrdHRvdGxlbihvc2gsIHApICsgQU1QRFVfTUFYX01QRFVfT1ZFUkhFQUQ7CkBAIC03NjMsMTUgKzc1OSwxNiBAQAogCiAJCQkJaWYgKChwbGVuICsgYW1wZHVfbGVuKSA+IG1heGxlbikgewogCQkJCQlwID0gTlVMTDsKLQkJCQkJV0xfRVJST1IoKCIlczogQm9ndXMgcGxlbiAjMVxuIiwKLQkJCQkJCSAgX19mdW5jX18pKTsKKwkJCQkJV0xfRVJST1IoIiVzOiBCb2d1cyBwbGVuICMxXG4iLAorCQkJCQkJIF9fZnVuY19fKTsKIAkJCQkJQVNTRVJUKDMgPT0gNCk7CiAJCQkJCWNvbnRpbnVlOwogCQkJCX0KIAogCQkJCS8qIGNoZWNrIGlmIHRoZXJlIGFyZSBlbm91Z2ggZGVzY3JpcHRvcnMgYXZhaWxhYmxlICovCiAJCQkJaWYgKFRYQVZBSUwod2xjLCBmaWZvKSA8PSAoc2VnX2NudCArIDEpKSB7Ci0JCQkJCVdMX0VSUk9SKCgiJXM6IE5vIGZpZm8gc3BhY2UgICAhISEhISFcbiIsIF9fZnVuY19fKSk7CisJCQkJCVdMX0VSUk9SKCIlczogTm8gZmlmbyBzcGFjZSAgICEhISEhIVxuIiwKKwkJCQkJCSBfX2Z1bmNfXyk7CiAJCQkJCXAgPSBOVUxMOwogCQkJCQljb250aW51ZTsKIAkJCQl9CkBAIC03ODksNyArNzg2LDcgQEAKIAkJV0xDTlRBREQoYW1wZHUtPmNudC0+dHhtcGR1LCBjb3VudCk7CiAKIAkJLyogcGF0Y2ggdXAgdGhlIGxhc3QgdHhoICovCi0JCXR4aCA9IChkMTF0eGhfdCAqKSBQS1REQVRBKHBrdFtjb3VudCAtIDFdKTsKKwkJdHhoID0gKGQxMXR4aF90ICopIHBrdFtjb3VudCAtIDFdLT5kYXRhOwogCQltY2wgPSBsdG9oMTYodHhoLT5NYWNUeENvbnRyb2xMb3cpOwogCQltY2wgJj0gflRYQ19BTVBEVV9NQVNLOwogCQltY2wgfD0gKFRYQ19BTVBEVV9MQVNUIDw8IFRYQ19BTVBEVV9TSElGVCk7CkBAIC04MDcsNyArODA0LDcgQEAKIAkJYW1wZHVfbGVuIC09IHJvdW5kdXAobGVuLCA0KSAtIGxlbjsKIAogCQkvKiBwYXRjaCB1cCB0aGUgZmlyc3QgdHhoICYgcGxjcCAqLwotCQl0eGggPSAoZDExdHhoX3QgKikgUEtUREFUQShwa3RbMF0pOworCQl0eGggPSAoZDExdHhoX3QgKikgcGt0WzBdLT5kYXRhOwogCQlwbGNwID0gKHU4ICopICh0eGggKyAxKTsKIAogCQlXTENfU0VUX01JTU9fUExDUF9MRU4ocGxjcCwgYW1wZHVfbGVuKTsKQEAgLTg3OCwyNyArODc1LDE4IEBACiAJCQlXTENfU0VUX01JTU9fUExDUF9BTVBEVSh0eGgtPkZyYWdQTENQRmFsbGJhY2spOwogCQl9CiAKLQkJV0xfQU1QRFVfVFgoKCJ3bCVkOiB3bGNfc2VuZGFtcGR1OiBjb3VudCAlZCBhbXBkdV9sZW4gJWRcbiIsCi0JCQkgICAgIHdsYy0+cHViLT51bml0LCBjb3VudCwgYW1wZHVfbGVuKSk7CisJCVdMX0FNUERVX1RYKCJ3bCVkOiB3bGNfc2VuZGFtcGR1OiBjb3VudCAlZCBhbXBkdV9sZW4gJWRcbiIsCisJCQkgICAgd2xjLT5wdWItPnVuaXQsIGNvdW50LCBhbXBkdV9sZW4pOwogCiAJCS8qIGluZm9ybSByYXRlX3NlbCBpZiBpdCB0aGlzIGlzIGEgcmF0ZSBwcm9iZSBwa3QgKi8KIAkJZnJhbWVpZCA9IGx0b2gxNih0eGgtPlR4RnJhbWVJRCk7CiAJCWlmIChmcmFtZWlkICYgVFhGSURfUkFURV9QUk9CRV9NQVNLKSB7Ci0JCQlXTF9FUlJPUigoIiVzOiBYWFggd2hhdCB0byBkbyB3aXRoIFRYRklEX1JBVEVfUFJPQkVfTUFTSyE/XG4iLCBfX2Z1bmNfXykpOworCQkJV0xfRVJST1IoIiVzOiBYWFggd2hhdCB0byBkbyB3aXRoIFRYRklEX1JBVEVfUFJPQkVfTUFTSyE/XG4iLAorCQkJCSBfX2Z1bmNfXyk7CiAJCX0KLSNpZmRlZiBXTENfSElHSF9PTkxZCi0JCWlmICh3bGMtPnJwY19hZ2cgJiBCQ01fUlBDX1RQX0hPU1RfQUdHX0FNUERVKQotCQkJYmNtX3JwY190cF9hZ2dfc2V0KGJjbV9ycGNfdHBfZ2V0KHdsYy0+cnBjKSwKLQkJCQkJICAgQkNNX1JQQ19UUF9IT1NUX0FHR19BTVBEVSwgdHJ1ZSk7Ci0jZW5kaWYKIAkJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspCiAJCQl3bGNfdHhmaWZvKHdsYywgZmlmbywgcGt0W2ldLCBpID09IChjb3VudCAtIDEpLAogCQkJCSAgIGFtcGR1LT50eHBrdF93ZWlnaHQpOwotI2lmZGVmIFdMQ19ISUdIX09OTFkKLQkJaWYgKHdsYy0+cnBjX2FnZyAmIEJDTV9SUENfVFBfSE9TVF9BR0dfQU1QRFUpCi0JCQliY21fcnBjX3RwX2FnZ19zZXQoYmNtX3JwY190cF9nZXQod2xjLT5ycGMpLAotCQkJCQkgICBCQ01fUlBDX1RQX0hPU1RfQUdHX0FNUERVLCBmYWxzZSk7Ci0jZW5kaWYKIAogCX0KIAkvKiBlbmRpZiAoY291bnQpICovCkBAIC05MDYsMTEgKzg5NCwxMSBAQAogfQogCiB2b2lkIEJDTUZBU1RQQVRICi13bGNfYW1wZHVfZG90eHN0YXR1cyhhbXBkdV9pbmZvX3QgKmFtcGR1LCBzdHJ1Y3Qgc2NiICpzY2IsIHZvaWQgKnAsCi0JCSAgICAgdHhfc3RhdHVzX3QgKnR4cykKK3dsY19hbXBkdV9kb3R4c3RhdHVzKHN0cnVjdCBhbXBkdV9pbmZvICphbXBkdSwgc3RydWN0IHNjYiAqc2NiLAorCQkgICAgIHN0cnVjdCBza19idWZmICpwLCB0eF9zdGF0dXNfdCAqdHhzKQogewogCXNjYl9hbXBkdV90ICpzY2JfYW1wZHU7Ci0Jd2xjX2luZm9fdCAqd2xjID0gYW1wZHUtPndsYzsKKwlzdHJ1Y3Qgd2xjX2luZm8gKndsYyA9IGFtcGR1LT53bGM7CiAJc2NiX2FtcGR1X3RpZF9pbmlfdCAqaW5pOwogCXUzMiBzMSA9IDAsIHMyID0gMDsKIAlzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKnR4X2luZm87CkBAIC05MjIsNyArOTEwLDcgQEAKIAlBU1NFUlQodHhzLT5zdGF0dXMgJiBUWF9TVEFUVVNfQU1QRFUpOwogCXNjYl9hbXBkdSA9IFNDQl9BTVBEVV9DVUJCWShhbXBkdSwgc2NiKTsKIAlBU1NFUlQoc2NiX2FtcGR1KTsKLQlpbmkgPSBTQ0JfQU1QRFVfSU5JKHNjYl9hbXBkdSwgUEtUUFJJTyhwKSk7CisJaW5pID0gU0NCX0FNUERVX0lOSShzY2JfYW1wZHUsIHAtPnByaW9yaXR5KTsKIAlBU1NFUlQoaW5pLT5zY2IgPT0gc2NiKTsKIAogCS8qIEJNQUNfTk9URTogRm9yIHRoZSBzcGxpdCBkcml2ZXIsIHNlY29uZCBsZXZlbCB0eHN0YXR1cyBjb21lcyBsYXRlcgpAQCAtOTMwLDcgKzkxOCw2IEBACiAJICogY2FsbCB0aGUgZmlyc3Qgb25lCiAJICovCiAJaWYgKHR4cy0+c3RhdHVzICYgVFhfU1RBVFVTX0FDS19SQ1YpIHsKLSNpZmRlZiBXTENfTE9XCiAJCXU4IHN0YXR1c19kZWxheSA9IDA7CiAKIAkJLyogd2FpdCB0aWxsIHRoZSBuZXh0IDggYnl0ZXMgb2YgdHhzdGF0dXMgaXMgYXZhaWxhYmxlICovCkBAIC05NDgsNTQgKzkzNSwxNCBAQAogCQlBU1NFUlQoIShzMSAmIFRYX1NUQVRVU19JTlRFUk1FRElBVEUpKTsKIAkJQVNTRVJUKHMxICYgVFhfU1RBVFVTX0FNUERVKTsKIAkJczIgPSBSX1JFRyh3bGMtPm9zaCwgJndsYy0+cmVncy0+ZnJtdHhzdGF0dXMyKTsKLSNlbHNlCQkJCS8qIFdMQ19MT1cgKi8KLQotCQkvKiBTdG9yZSB0aGUgcmVsZXZhbnQgaW5mb3JtYXRpb24gaW4gYW1wZHUgc3RydWN0dXJlICovCi0JCVdMX0FNUERVX1RYKCgid2wlZDogd2xjX2FtcGR1X2RvdHhzdGF0dXM6IEhpZ2ggUmVjdmRcbiIsCi0JCQkgICAgIHdsYy0+cHViLT51bml0KSk7Ci0KLQkJQVNTRVJUKCFhbXBkdS0+cCk7Ci0JCWFtcGR1LT5wID0gcDsKLQkJYmNvcHkodHhzLCAmYW1wZHUtPnR4cywgc2l6ZW9mKHR4X3N0YXR1c190KSk7Ci0JCWFtcGR1LT53YWl0aW5nX3N0YXR1cyA9IHRydWU7Ci0JCXJldHVybjsKLSNlbmRpZgkJCQkvKiBXTENfTE9XICovCiAJfQogCiAJd2xjX2FtcGR1X2RvdHhzdGF0dXNfY29tcGxldGUoYW1wZHUsIHNjYiwgcCwgdHhzLCBzMSwgczIpOwogCXdsY19hbXBkdV90eGZsb3djb250cm9sKHdsYywgc2NiX2FtcGR1LCBpbmkpOwogfQogCi0jaWZkZWYgV0xDX0hJR0hfT05MWQotdm9pZCB3bGNfYW1wZHVfdHhzdGF0dXNfY29tcGxldGUoYW1wZHVfaW5mb190ICphbXBkdSwgdTMyIHMxLCB1MzIgczIpCi17Ci0JV0xfQU1QRFVfVFgoKCJ3bCVkOiB3bGNfYW1wZHVfdHhzdGF0dXNfY29tcGxldGU6IEhpZ2ggUmVjdmQgMHgleCAweCV4IHA6JXBcbiIsIGFtcGR1LT53bGMtPnB1Yi0+dW5pdCwgczEsIHMyLCBhbXBkdS0+cCkpOwotCi0JQVNTRVJUKGFtcGR1LT53YWl0aW5nX3N0YXR1cyk7Ci0KLQkvKiBUaGUgcGFja2V0IG1heSBoYXZlIGJlZW4gZnJlZWQgaWYgdGhlIFNDQiB3ZW50IGF3YXksIGlmIHNvLCB0aGVuIHN0aWxsIGZyZWUgdGhlCi0JICogRE1BIGNoYWluCi0JICovCi0JaWYgKGFtcGR1LT5wKSB7Ci0JCXN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAqdHhfaW5mbzsKLQkJc3RydWN0IHNjYiAqc2NiOwotCi0JCXR4X2luZm8gPSBJRUVFODAyMTFfU0tCX0NCKGFtcGR1LT5wKTsKLQkJc2NiID0gKHN0cnVjdCBzY2IgKil0eF9pbmZvLT5jb250cm9sLnN0YS0+ZHJ2X3ByaXY7Ci0KLQkJd2xjX2FtcGR1X2RvdHhzdGF0dXNfY29tcGxldGUoYW1wZHUsIHNjYiwgYW1wZHUtPnAsICZhbXBkdS0+dHhzLAotCQkJCQkgICAgICBzMSwgczIpOwotCQlhbXBkdS0+cCA9IE5VTEw7Ci0JfQotCi0JYW1wZHUtPndhaXRpbmdfc3RhdHVzID0gZmFsc2U7Ci19Ci0jZW5kaWYJCQkJLyogV0xDX0hJR0hfT05MWSAqLwotdm9pZCByYXRlX3N0YXR1cyh3bGNfaW5mb190ICp3bGMsIHN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAqdHhfaW5mbywKLQkJIHR4X3N0YXR1c190ICp0eHMsIHU4IG1jcyk7Ci0KIHZvaWQKLXJhdGVfc3RhdHVzKHdsY19pbmZvX3QgKndsYywgc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICp0eF9pbmZvLAorcmF0ZV9zdGF0dXMoc3RydWN0IHdsY19pbmZvICp3bGMsIHN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAqdHhfaW5mbywKIAkgICAgdHhfc3RhdHVzX3QgKnR4cywgdTggbWNzKQogewogCXN0cnVjdCBpZWVlODAyMTFfdHhfcmF0ZSAqdHhyYXRlID0gdHhfaW5mby0+c3RhdHVzLnJhdGVzOwpAQCAtMTAwOCwxNyArOTU1LDE1IEBACiAJfQogfQogCi1leHRlcm4gdm9pZCB3bGNfdHhxX2VucSh3bGNfaW5mb190ICp3bGMsIHN0cnVjdCBzY2IgKnNjYiwgdm9pZCAqc2R1LAotCQkJdWludCBwcmVjKTsKLQogI2RlZmluZSBTSE9SVE5BTUUgIkFNUERVIHN0YXR1cyIKIAogc3RhdGljIHZvaWQgQkNNRkFTVFBBVEgKLXdsY19hbXBkdV9kb3R4c3RhdHVzX2NvbXBsZXRlKGFtcGR1X2luZm9fdCAqYW1wZHUsIHN0cnVjdCBzY2IgKnNjYiwgdm9pZCAqcCwKLQkJCSAgICAgIHR4X3N0YXR1c190ICp0eHMsIHUzMiBzMSwgdTMyIHMyKQord2xjX2FtcGR1X2RvdHhzdGF0dXNfY29tcGxldGUoc3RydWN0IGFtcGR1X2luZm8gKmFtcGR1LCBzdHJ1Y3Qgc2NiICpzY2IsCisJCQkgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqcCwgdHhfc3RhdHVzX3QgKnR4cywKKwkJCSAgICAgIHUzMiBzMSwgdTMyIHMyKQogewogCXNjYl9hbXBkdV90ICpzY2JfYW1wZHU7Ci0Jd2xjX2luZm9fdCAqd2xjID0gYW1wZHUtPndsYzsKKwlzdHJ1Y3Qgd2xjX2luZm8gKndsYyA9IGFtcGR1LT53bGM7CiAJc2NiX2FtcGR1X3RpZF9pbmlfdCAqaW5pOwogCXU4IGJpdG1hcFs4XSwgcXVldWUsIHRpZDsKIAlkMTF0eGhfdCAqdHhoOwpAQCAtMTAzNyw3ICs5ODIsNyBAQAogCiAjaWZkZWYgQkNNREJHCiAJdTggaG9sZVtBTVBEVV9NQVhfTVBEVV07Ci0JYnplcm8oaG9sZSwgc2l6ZW9mKGhvbGUpKTsKKwltZW1zZXQoaG9sZSwgMCwgc2l6ZW9mKGhvbGUpKTsKICNlbmRpZgogCiAJQVNTRVJUKHR4X2luZm8tPmZsYWdzICYgSUVFRTgwMjExX1RYX0NUTF9BTVBEVSk7CkBAIC0xMDQ2LDcgKzk5MSw3IEBACiAJc2NiX2FtcGR1ID0gU0NCX0FNUERVX0NVQkJZKGFtcGR1LCBzY2IpOwogCUFTU0VSVChzY2JfYW1wZHUpOwogCi0JdGlkID0gKHU4KSBQS1RQUklPKHApOworCXRpZCA9ICh1OCkgKHAtPnByaW9yaXR5KTsKIAogCWluaSA9IFNDQl9BTVBEVV9JTkkoc2NiX2FtcGR1LCB0aWQpOwogCXJldHJ5X2xpbWl0ID0gYW1wZHUtPnJldHJ5X2xpbWl0X3RpZFt0aWRdOwpAQCAtMTA1NCw3ICs5OTksNyBAQAogCiAJQVNTRVJUKGluaS0+c2NiID09IHNjYik7CiAKLQliemVybyhiaXRtYXAsIHNpemVvZihiaXRtYXApKTsKKwltZW1zZXQoYml0bWFwLCAwLCBzaXplb2YoYml0bWFwKSk7CiAJcXVldWUgPSB0eHMtPmZyYW1laWQgJiBUWEZJRF9RVUVVRV9NQVNLOwogCUFTU0VSVChxdWV1ZSA8IEFDX0NPVU5UKTsKIApAQCAtMTA5MSwxMyArMTAzNiwxNiBAQAogCQlpZiAoc3Vwcl9zdGF0dXMpIHsKIAkJCXVwZGF0ZV9yYXRlID0gZmFsc2U7CiAJCQlpZiAoc3Vwcl9zdGF0dXMgPT0gVFhfU1RBVFVTX1NVUFJfQkFEQ0gpIHsKLQkJCQlXTF9FUlJPUigoIiVzOiBQa3QgdHggc3VwcHJlc3NlZCwgaWxsZWdhbCBjaGFubmVsIHBvc3NpYmx5ICVkXG4iLCBfX2Z1bmNfXywgQ0hTUEVDX0NIQU5ORUwod2xjLT5kZWZhdWx0X2Jzcy0+Y2hhbnNwZWMpKSk7CisJCQkJV0xfRVJST1IoIiVzOiBQa3QgdHggc3VwcHJlc3NlZCwgaWxsZWdhbCBjaGFubmVsIHBvc3NpYmx5ICVkXG4iLAorCQkJCQkgX19mdW5jX18sCisJCQkJCSBDSFNQRUNfQ0hBTk5FTCh3bGMtPmRlZmF1bHRfYnNzLT5jaGFuc3BlYykpOwogCQkJfSBlbHNlIHsKIAkJCQlpZiAoc3Vwcl9zdGF0dXMgPT0gVFhfU1RBVFVTX1NVUFJfRlJBRykKLQkJCQkJV0xfTk9ORSgoIiVzOiBBTVBEVSBmcmFnIGVyclxuIiwKLQkJCQkJCSBfX2Z1bmNfXykpOworCQkJCQlXTF9OT05FKCIlczogQU1QRFUgZnJhZyBlcnJcbiIsCisJCQkJCQlfX2Z1bmNfXyk7CiAJCQkJZWxzZQotCQkJCQlXTF9FUlJPUigoIiVzOiB3bGNfYW1wZHVfZG90eHN0YXR1czogc3Vwcl9zdGF0dXMgMHgleFxuIiwgX19mdW5jX18sIHN1cHJfc3RhdHVzKSk7CisJCQkJCVdMX0VSUk9SKCIlczogd2xjX2FtcGR1X2RvdHhzdGF0dXM6IHN1cHJfc3RhdHVzIDB4JXhcbiIsCisJCQkJCQkgX19mdW5jX18sIHN1cHJfc3RhdHVzKTsKIAkJCX0KIAkJCS8qIG5vIG5lZWQgdG8gcmV0cnkgZm9yIGJhZGNoOyB3aWxsIGZhaWwgYWdhaW4gKi8KIAkJCWlmIChzdXByX3N0YXR1cyA9PSBUWF9TVEFUVVNfU1VQUl9CQURDSCB8fApAQCAtMTExNiwyMiArMTA2NCwxOCBAQAogCQkJCWlmICh3bGNfZmZwbGRfY2hlY2tfdHhmdW5mbCh3bGMsIHByaW8yZmlmb1t0aWRdKQogCQkJCSAgICA+IDApIHsKIAkJCQkJdHhfZXJyb3IgPSB0cnVlOwotI2lmZGVmIFdMQ19ISUdIX09OTFkKLQkJCQkJLyogV2l0aCBCTUFDLCBUWCBVbmRlcmZsb3dzIHNob3VsZCBub3QgaGFwcGVuICovCi0JCQkJCVdMX0VSUk9SKCgid2wlZDogQk1BQyBUWCBVbmRlcmZsb3c/IiwKLQkJCQkJCSAgd2xjLT5wdWItPnVuaXQpKTsKLSNlbmRpZgogCQkJCX0KIAkJCX0KIAkJfSBlbHNlIGlmICh0eHMtPnBoeWVycikgewogCQkJdXBkYXRlX3JhdGUgPSBmYWxzZTsKIAkJCVdMQ05USU5DUih3bGMtPnB1Yi0+X2NudC0+dHhwaHllcnIpOwotCQkJV0xfRVJST1IoKCJ3bCVkOiB3bGNfYW1wZHVfZG90eHN0YXR1czogdHggcGh5IGVycm9yICgweCV4KVxuIiwgd2xjLT5wdWItPnVuaXQsIHR4cy0+cGh5ZXJyKSk7CisJCQlXTF9FUlJPUigid2wlZDogd2xjX2FtcGR1X2RvdHhzdGF0dXM6IHR4IHBoeSBlcnJvciAoMHgleClcbiIsCisJCQkJIHdsYy0+cHViLT51bml0LCB0eHMtPnBoeWVycik7CiAKICNpZmRlZiBCQ01EQkcKIAkJCWlmIChXTF9FUlJPUl9PTigpKSB7CiAJCQkJcHJwa3QoInR4cGt0IChBTVBEVSkiLCB3bGMtPm9zaCwgcCk7Ci0JCQkJd2xjX3ByaW50X3R4ZGVzYygoZDExdHhoX3QgKikgUEtUREFUQShwKSk7CisJCQkJd2xjX3ByaW50X3R4ZGVzYygoZDExdHhoX3QgKikgcC0+ZGF0YSk7CiAJCQkJd2xjX3ByaW50X3R4c3RhdHVzKHR4cyk7CiAJCQl9CiAjZW5kaWYJCQkJLyogQkNNREJHICovCkBAIC0xMTQyLDcgKzEwODYsNyBAQAogCXdoaWxlIChwKSB7CiAJCXR4X2luZm8gPSBJRUVFODAyMTFfU0tCX0NCKHApOwogCQlBU1NFUlQodHhfaW5mby0+ZmxhZ3MgJiBJRUVFODAyMTFfVFhfQ1RMX0FNUERVKTsKLQkJdHhoID0gKGQxMXR4aF90ICopIFBLVERBVEEocCk7CisJCXR4aCA9IChkMTF0eGhfdCAqKSBwLT5kYXRhOwogCQltY2wgPSBsdG9oMTYodHhoLT5NYWNUeENvbnRyb2xMb3cpOwogCQlwbGNwID0gKHU4ICopICh0eGggKyAxKTsKIAkJaCA9IChzdHJ1Y3QgZG90MTFfaGVhZGVyICopKHBsY3AgKyBEMTFfUEhZX0hEUl9MRU4pOwpAQCAtMTE1OCwxMCArMTEwMiw5IEBACiAJCWlmIChiYV9yZWNkKSB7CiAJCQliaW5kZXggPSBNT0RTVUJfUE9XMihzZXEsIHN0YXJ0X3NlcSwgU0VRTlVNX01BWCk7CiAKLQkJCVdMX0FNUERVX1RYKCgiJXM6IHRpZCAlZCBzZXEgaXMgJWQsIHN0YXJ0X3NlcSBpcyAlZCwgIgotCQkJCSAgICAgImJpbmRleCBpcyAlZCBzZXQgJWQsIGluZGV4ICVkXG4iLAotCQkJCSAgICAgX19mdW5jX18sIHRpZCwgc2VxLCBzdGFydF9zZXEsIGJpbmRleCwKLQkJCQkgICAgIGlzc2V0KGJpdG1hcCwgYmluZGV4KSwgaW5kZXgpKTsKKwkJCVdMX0FNUERVX1RYKCIlczogdGlkICVkIHNlcSBpcyAlZCwgc3RhcnRfc2VxIGlzICVkLCBiaW5kZXggaXMgJWQgc2V0ICVkLCBpbmRleCAlZFxuIiwKKwkJCQkgICAgX19mdW5jX18sIHRpZCwgc2VxLCBzdGFydF9zZXEsIGJpbmRleCwKKwkJCQkgICAgaXNzZXQoYml0bWFwLCBiaW5kZXgpLCBpbmRleCk7CiAKIAkJCS8qIGlmIGFja2VkIHRoZW4gY2xlYXIgYml0IGFuZCBmcmVlIHBhY2tldCAqLwogCQkJaWYgKChiaW5kZXggPCBBTVBEVV9UWF9CQV9NQVhfV1NJWkUpCkBAIC0xMTg2LDggKzExMjksOCBAQAogCQkJCSAgICAgc3RhdHVzICYgVFhfU1RBVFVTX0ZSTV9SVFhfTUFTSykgPj4KIAkJCQkgICAgVFhfU1RBVFVTX0ZSTV9SVFhfU0hJRlQ7CiAKLQkJCQlQS1RQVUxMKHAsIEQxMV9QSFlfSERSX0xFTik7Ci0JCQkJUEtUUFVMTChwLCBEMTFfVFhIX0xFTik7CisJCQkJc2tiX3B1bGwocCwgRDExX1BIWV9IRFJfTEVOKTsKKwkJCQlza2JfcHVsbChwLCBEMTFfVFhIX0xFTik7CiAKIAkJCQlpZWVlODAyMTFfdHhfc3RhdHVzX2lycXNhZmUod2xjLT5wdWItPmllZWVfaHcsCiAJCQkJCQkJICAgIHApOwpAQCAtMTIxMiw5ICsxMTU1LDEwIEBACiAJCQkJaWVlZTgwMjExX3R4X2luZm9fY2xlYXJfc3RhdHVzKHR4X2luZm8pOwogCQkJCXR4X2luZm8tPmZsYWdzIHw9CiAJCQkJICAgIElFRUU4MDIxMV9UWF9TVEFUX0FNUERVX05PX0JBQ0s7Ci0JCQkJUEtUUFVMTChwLCBEMTFfUEhZX0hEUl9MRU4pOwotCQkJCVBLVFBVTEwocCwgRDExX1RYSF9MRU4pOwotCQkJCVdMX0VSUk9SKCgiJXM6IEJBIFRpbWVvdXQsIHNlcSAlZCwgaW5fdHJhbnNpdCAlZFxuIiwgU0hPUlROQU1FLCBzZXEsIGluaS0+dHhfaW5fdHJhbnNpdCkpOworCQkJCXNrYl9wdWxsKHAsIEQxMV9QSFlfSERSX0xFTik7CisJCQkJc2tiX3B1bGwocCwgRDExX1RYSF9MRU4pOworCQkJCVdMX0VSUk9SKCIlczogQkEgVGltZW91dCwgc2VxICVkLCBpbl90cmFuc2l0ICVkXG4iLAorCQkJCQkgU0hPUlROQU1FLCBzZXEsIGluaS0+dHhfaW5fdHJhbnNpdCk7CiAJCQkJaWVlZTgwMjExX3R4X3N0YXR1c19pcnFzYWZlKHdsYy0+cHViLT5pZWVlX2h3LAogCQkJCQkJCSAgICBwKTsKIAkJCX0KQEAgLTEyNDIsNyArMTE4Niw3IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1hbXBkdV9jbGVhbnVwX3RpZF9pbmkoYW1wZHVfaW5mb190ICphbXBkdSwgc2NiX2FtcGR1X3QgKnNjYl9hbXBkdSwgdTggdGlkLAorYW1wZHVfY2xlYW51cF90aWRfaW5pKHN0cnVjdCBhbXBkdV9pbmZvICphbXBkdSwgc2NiX2FtcGR1X3QgKnNjYl9hbXBkdSwgdTggdGlkLAogCQkgICAgICBib29sIGZvcmNlKQogewogCXNjYl9hbXBkdV90aWRfaW5pX3QgKmluaTsKQEAgLTEyNTAsOCArMTE5NCw4IEBACiAJaWYgKCFpbmkpCiAJCXJldHVybjsKIAotCVdMX0FNUERVX0NUTCgoIndsJWQ6IGFtcGR1X2NsZWFudXBfdGlkX2luaTogdGlkICVkXG4iLAotCQkgICAgICBhbXBkdS0+d2xjLT5wdWItPnVuaXQsIHRpZCkpOworCVdMX0FNUERVX0NUTCgid2wlZDogYW1wZHVfY2xlYW51cF90aWRfaW5pOiB0aWQgJWRcbiIsCisJCSAgICAgYW1wZHUtPndsYy0+cHViLT51bml0LCB0aWQpOwogCiAJaWYgKGluaS0+dHhfaW5fdHJhbnNpdCAmJiAhZm9yY2UpCiAJCXJldHVybjsKQEAgLTEyNjQsNyArMTIwOCw3IEBACiB9CiAKIC8qIGluaXRpYWxpemUgdGhlIGluaXRpYXRvciBjb2RlIGZvciB0aWQgKi8KLXN0YXRpYyBzY2JfYW1wZHVfdGlkX2luaV90ICp3bGNfYW1wZHVfaW5pdF90aWRfaW5pKGFtcGR1X2luZm9fdCAqYW1wZHUsCitzdGF0aWMgc2NiX2FtcGR1X3RpZF9pbmlfdCAqd2xjX2FtcGR1X2luaXRfdGlkX2luaShzdHJ1Y3QgYW1wZHVfaW5mbyAqYW1wZHUsCiAJCQkJCQkgICBzY2JfYW1wZHVfdCAqc2NiX2FtcGR1LAogCQkJCQkJICAgdTggdGlkLCBib29sIG92ZXJyaWRlKQogewpAQCAtMTI3Nyw3ICsxMjIxLDcgQEAKIAogCS8qIGNoZWNrIGZvciBwZXItdGlkIGNvbnRyb2wgb2YgYW1wZHUgKi8KIAlpZiAoIWFtcGR1LT5pbmlfZW5hYmxlW3RpZF0pIHsKLQkJV0xfRVJST1IoKCIlczogUmVqZWN0aW5nIHRpZCAlZFxuIiwgX19mdW5jX18sIHRpZCkpOworCQlXTF9FUlJPUigiJXM6IFJlamVjdGluZyB0aWQgJWRcbiIsIF9fZnVuY19fLCB0aWQpOwogCQlyZXR1cm4gTlVMTDsKIAl9CiAKQEAgLTEyOTAsMjEgKzEyMzQsMjEgQEAKIAlyZXR1cm4gaW5pOwogfQogCi1pbnQgd2xjX2FtcGR1X3NldChhbXBkdV9pbmZvX3QgKmFtcGR1LCBib29sIG9uKQoraW50IHdsY19hbXBkdV9zZXQoc3RydWN0IGFtcGR1X2luZm8gKmFtcGR1LCBib29sIG9uKQogewotCXdsY19pbmZvX3QgKndsYyA9IGFtcGR1LT53bGM7CisJc3RydWN0IHdsY19pbmZvICp3bGMgPSBhbXBkdS0+d2xjOwogCiAJd2xjLT5wdWItPl9hbXBkdSA9IGZhbHNlOwogCiAJaWYgKG9uKSB7CiAJCWlmICghTl9FTkFCKHdsYy0+cHViKSkgewotCQkJV0xfQU1QRFVfRVJSKCgid2wlZDogZHJpdmVyIG5vdCBubW9kZSBlbmFibGVkXG4iLAotCQkJCSAgICAgIHdsYy0+cHViLT51bml0KSk7CisJCQlXTF9BTVBEVV9FUlIoIndsJWQ6IGRyaXZlciBub3Qgbm1vZGUgZW5hYmxlZFxuIiwKKwkJCQkgICAgIHdsYy0+cHViLT51bml0KTsKIAkJCXJldHVybiBCQ01FX1VOU1VQUE9SVEVEOwogCQl9CiAJCWlmICghd2xjX2FtcGR1X2NhcChhbXBkdSkpIHsKLQkJCVdMX0FNUERVX0VSUigoIndsJWQ6IGRldmljZSBub3QgYW1wZHUgY2FwYWJsZVxuIiwKLQkJCQkgICAgICB3bGMtPnB1Yi0+dW5pdCkpOworCQkJV0xfQU1QRFVfRVJSKCJ3bCVkOiBkZXZpY2Ugbm90IGFtcGR1IGNhcGFibGVcbiIsCisJCQkJICAgICB3bGMtPnB1Yi0+dW5pdCk7CiAJCQlyZXR1cm4gQkNNRV9VTlNVUFBPUlRFRDsKIAkJfQogCQl3bGMtPnB1Yi0+X2FtcGR1ID0gb247CkBAIC0xMzEzLDcgKzEyNTcsNyBAQAogCXJldHVybiAwOwogfQogCi1ib29sIHdsY19hbXBkdV9jYXAoYW1wZHVfaW5mb190ICphbXBkdSkKK2Jvb2wgd2xjX2FtcGR1X2NhcChzdHJ1Y3QgYW1wZHVfaW5mbyAqYW1wZHUpCiB7CiAJaWYgKFdMQ19QSFlfMTFOX0NBUChhbXBkdS0+d2xjLT5iYW5kKSkKIAkJcmV0dXJuIHRydWU7CkBAIC0xMzIxLDcgKzEyNjUsNyBAQAogCQlyZXR1cm4gZmFsc2U7CiB9CiAKLXN0YXRpYyB2b2lkIGFtcGR1X3VwZGF0ZV9tYXhfdHhsZW4oYW1wZHVfaW5mb190ICphbXBkdSwgdTggZHVyKQorc3RhdGljIHZvaWQgYW1wZHVfdXBkYXRlX21heF90eGxlbihzdHJ1Y3QgYW1wZHVfaW5mbyAqYW1wZHUsIHU4IGR1cikKIHsKIAl1MzIgcmF0ZSwgbWNzOwogCkBAIC0xMzQzLDcgKzEyODcsNyBAQAogfQogCiB1OCBCQ01GQVNUUEFUSAotd2xjX2FtcGR1X251bGxfZGVsaW1fY250KGFtcGR1X2luZm9fdCAqYW1wZHUsIHN0cnVjdCBzY2IgKnNjYiwKK3dsY19hbXBkdV9udWxsX2RlbGltX2NudChzdHJ1Y3QgYW1wZHVfaW5mbyAqYW1wZHUsIHN0cnVjdCBzY2IgKnNjYiwKIAkJCSByYXRlc3BlY190IHJzcGVjLCBpbnQgcGh5bGVuKQogewogCXNjYl9hbXBkdV90ICpzY2JfYW1wZHU7CkBAIC0xMzc5LDI1ICsxMzIzLDI1IEBACiAJCXJldHVybiAwOwogfQogCi12b2lkIHdsY19hbXBkdV9tYWNhZGRyX3VwZCh3bGNfaW5mb190ICp3bGMpCit2b2lkIHdsY19hbXBkdV9tYWNhZGRyX3VwZChzdHJ1Y3Qgd2xjX2luZm8gKndsYykKIHsKIAljaGFyIHRlbXBsYXRlW1RfUkFNX0FDQ0VTU19TWiAqIDJdOwogCiAJLyogZHJpdmVyIG5lZWRzIHRvIHdyaXRlIHRoZSB0YSBpbiB0aGUgdGVtcGxhdGU7IHRhIGlzIGF0IG9mZnNldCAxNiAqLwotCWJ6ZXJvKHRlbXBsYXRlLCBzaXplb2YodGVtcGxhdGUpKTsKLQliY29weSgoY2hhciAqKXdsYy0+cHViLT5jdXJfZXRoZXJhZGRyLm9jdGV0LCB0ZW1wbGF0ZSwgRVRIRVJfQUREUl9MRU4pOworCW1lbXNldCh0ZW1wbGF0ZSwgMCwgc2l6ZW9mKHRlbXBsYXRlKSk7CisJYmNvcHkoKGNoYXIgKil3bGMtPnB1Yi0+Y3VyX2V0aGVyYWRkci5vY3RldCwgdGVtcGxhdGUsIEVUSF9BTEVOKTsKIAl3bGNfd3JpdGVfdGVtcGxhdGVfcmFtKHdsYywgKFRfQkFfVFBMX0JBU0UgKyAxNiksIChUX1JBTV9BQ0NFU1NfU1ogKiAyKSwKIAkJCSAgICAgICB0ZW1wbGF0ZSk7CiB9CiAKLWJvb2wgd2xjX2FnZ3JlZ2F0YWJsZSh3bGNfaW5mb190ICp3bGMsIHU4IHRpZCkKK2Jvb2wgd2xjX2FnZ3JlZ2F0YWJsZShzdHJ1Y3Qgd2xjX2luZm8gKndsYywgdTggdGlkKQogewogCXJldHVybiB3bGMtPmFtcGR1LT5pbmlfZW5hYmxlW3RpZF07CiB9CiAKLXZvaWQgd2xjX2FtcGR1X3NobV91cGQoYW1wZHVfaW5mb190ICphbXBkdSkKK3ZvaWQgd2xjX2FtcGR1X3NobV91cGQoc3RydWN0IGFtcGR1X2luZm8gKmFtcGR1KQogewotCXdsY19pbmZvX3QgKndsYyA9IGFtcGR1LT53bGM7CisJc3RydWN0IHdsY19pbmZvICp3bGMgPSBhbXBkdS0+d2xjOwogCiAJLyogRXh0ZW5kIHVjb2RlIGludGVybmFsIHdhdGNoZG9nIHRpbWVyIHRvIG1hdGNoIGxhcmdlciByZWNlaXZlZCBmcmFtZXMgKi8KIAlpZiAoKGFtcGR1LT5yeF9mYWN0b3IgJiBIVF9QQVJBTVNfUlhfRkFDVE9SX01BU0spID09CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3N5cy93bGNfYW1wZHUuaCBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvc3lzL3dsY19hbXBkdS5oCmluZGV4IGM3MjFiMTYuLjAzNDU3ZjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvc3lzL3dsY19hbXBkdS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvc3lzL3dsY19hbXBkdS5oCkBAIC0xNywyNCArMTcsMjAgQEAKICNpZm5kZWYgX3dsY19hbXBkdV9oXwogI2RlZmluZSBfd2xjX2FtcGR1X2hfCiAKLWV4dGVybiBhbXBkdV9pbmZvX3QgKndsY19hbXBkdV9hdHRhY2god2xjX2luZm9fdCAqd2xjKTsKLWV4dGVybiB2b2lkIHdsY19hbXBkdV9kZXRhY2goYW1wZHVfaW5mb190ICphbXBkdSk7Ci1leHRlcm4gYm9vbCB3bGNfYW1wZHVfY2FwKGFtcGR1X2luZm9fdCAqYW1wZHUpOwotZXh0ZXJuIGludCB3bGNfYW1wZHVfc2V0KGFtcGR1X2luZm9fdCAqYW1wZHUsIGJvb2wgb24pOwotZXh0ZXJuIGludCB3bGNfc2VuZGFtcGR1KGFtcGR1X2luZm9fdCAqYW1wZHUsIHdsY190eHFfaW5mb190ICpxaSwgdm9pZCAqKmFnZ3AsCi0JCQkgaW50IHByZWMpOwotZXh0ZXJuIHZvaWQgd2xjX2FtcGR1X2RvdHhzdGF0dXMoYW1wZHVfaW5mb190ICphbXBkdSwgc3RydWN0IHNjYiAqc2NiLCB2b2lkICpwLAotCQkJCSB0eF9zdGF0dXNfdCAqdHhzKTsKLWV4dGVybiB2b2lkIHdsY19hbXBkdV9yZXNldChhbXBkdV9pbmZvX3QgKmFtcGR1KTsKLWV4dGVybiB2b2lkIHdsY19hbXBkdV9tYWNhZGRyX3VwZCh3bGNfaW5mb190ICp3bGMpOwotZXh0ZXJuIHZvaWQgd2xjX2FtcGR1X3NobV91cGQoYW1wZHVfaW5mb190ICphbXBkdSk7CitleHRlcm4gc3RydWN0IGFtcGR1X2luZm8gKndsY19hbXBkdV9hdHRhY2goc3RydWN0IHdsY19pbmZvICp3bGMpOworZXh0ZXJuIHZvaWQgd2xjX2FtcGR1X2RldGFjaChzdHJ1Y3QgYW1wZHVfaW5mbyAqYW1wZHUpOworZXh0ZXJuIGJvb2wgd2xjX2FtcGR1X2NhcChzdHJ1Y3QgYW1wZHVfaW5mbyAqYW1wZHUpOworZXh0ZXJuIGludCB3bGNfYW1wZHVfc2V0KHN0cnVjdCBhbXBkdV9pbmZvICphbXBkdSwgYm9vbCBvbik7CitleHRlcm4gaW50IHdsY19zZW5kYW1wZHUoc3RydWN0IGFtcGR1X2luZm8gKmFtcGR1LCB3bGNfdHhxX2luZm9fdCAqcWksCisJCQkgc3RydWN0IHNrX2J1ZmYgKiphZ2dwLCBpbnQgcHJlYyk7CitleHRlcm4gdm9pZCB3bGNfYW1wZHVfZG90eHN0YXR1cyhzdHJ1Y3QgYW1wZHVfaW5mbyAqYW1wZHUsIHN0cnVjdCBzY2IgKnNjYiwKKwkJCQkgc3RydWN0IHNrX2J1ZmYgKnAsIHR4X3N0YXR1c190ICp0eHMpOworZXh0ZXJuIHZvaWQgd2xjX2FtcGR1X3Jlc2V0KHN0cnVjdCBhbXBkdV9pbmZvICphbXBkdSk7CitleHRlcm4gdm9pZCB3bGNfYW1wZHVfbWFjYWRkcl91cGQoc3RydWN0IHdsY19pbmZvICp3bGMpOworZXh0ZXJuIHZvaWQgd2xjX2FtcGR1X3NobV91cGQoc3RydWN0IGFtcGR1X2luZm8gKmFtcGR1KTsKIAotZXh0ZXJuIHU4IHdsY19hbXBkdV9udWxsX2RlbGltX2NudChhbXBkdV9pbmZvX3QgKmFtcGR1LCBzdHJ1Y3Qgc2NiICpzY2IsCitleHRlcm4gdTggd2xjX2FtcGR1X251bGxfZGVsaW1fY250KHN0cnVjdCBhbXBkdV9pbmZvICphbXBkdSwgc3RydWN0IHNjYiAqc2NiLAogCQkJCSAgICAgIHJhdGVzcGVjX3QgcnNwZWMsIGludCBwaHlsZW4pOwotZXh0ZXJuIHZvaWQgc2NiX2FtcGR1X2NsZWFudXAoYW1wZHVfaW5mb190ICphbXBkdSwgc3RydWN0IHNjYiAqc2NiKTsKLSNpZmRlZiBXTENfSElHSF9PTkxZCi1leHRlcm4gdm9pZCB3bGNfYW1wZHVfdHhzdGF0dXNfY29tcGxldGUoYW1wZHVfaW5mb190ICphbXBkdSwgdTMyIHMxLAotCQkJCQl1MzIgczIpOwotI2VuZGlmCitleHRlcm4gdm9pZCBzY2JfYW1wZHVfY2xlYW51cChzdHJ1Y3QgYW1wZHVfaW5mbyAqYW1wZHUsIHN0cnVjdCBzY2IgKnNjYik7CiAKICNlbmRpZgkJCQkvKiBfd2xjX2FtcGR1X2hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3N5cy93bGNfYW50c2VsLmMgYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3N5cy93bGNfYW50c2VsLmMKaW5kZXggNWZmODgzMS4uNDAyZGRmOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9zeXMvd2xjX2FudHNlbC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvc3lzL3dsY19hbnRzZWwuYwpAQCAtMTksMTggKzE5LDIzIEBACiAjaWZkZWYgV0xBTlRTRUwKIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4dmVyLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8YmNtZGVmcy5oPgogI2luY2x1ZGUgPG9zbC5oPgogI2luY2x1ZGUgPGJjbXV0aWxzLmg+CiAjaW5jbHVkZSA8c2l1dGlscy5oPgogI2luY2x1ZGUgPHdsaW9jdGwuaD4KIAorI2luY2x1ZGUgPGJjbWRldnMuaD4KKyNpbmNsdWRlIDxzYmhuZHBpby5oPgorI2luY2x1ZGUgPHNiaG5kZG1hLmg+CiAjaW5jbHVkZSA8ZDExLmg+CiAjaW5jbHVkZSA8d2xjX3JhdGUuaD4KICNpbmNsdWRlIDx3bGNfa2V5Lmg+CiAjaW5jbHVkZSA8d2xjX3B1Yi5oPgogI2luY2x1ZGUgPHdsX2RiZy5oPgorI2luY2x1ZGUgPHdsY19ldmVudC5oPgogI2luY2x1ZGUgPHdsY19tYWM4MDIxMS5oPgogI2luY2x1ZGUgPHdsY19ibWFjLmg+CiAjaW5jbHVkZSA8d2xjX3BoeV9oYWwuaD4KQEAgLTU4LDEwICs2MywxMSBAQAogI2RlZmluZSBBTlRfU0VMQ0ZHX0RFRl8yeDQJMHgwMgkvKiBkZWZhdWx0IGFudGVubmEgY29uZmlndXJhdGlvbiAqLwogCiAvKiBzdGF0aWMgZnVuY3Rpb25zICovCi1zdGF0aWMgaW50IHdsY19hbnRzZWxfY2ZndXBkKGFudHNlbF9pbmZvX3QgKmFzaSwgd2xjX2FudHNlbGNmZ190ICphbnRzZWwpOwotc3RhdGljIHU4IHdsY19hbnRzZWxfaWQyYW50Y2ZnKGFudHNlbF9pbmZvX3QgKmFzaSwgdTggaWQpOwotc3RhdGljIHUxNiB3bGNfYW50c2VsX2FudGNmZzJhbnRzZWwoYW50c2VsX2luZm9fdCAqYXNpLCB1OCBhbnRfY2ZnKTsKLXN0YXRpYyB2b2lkIHdsY19hbnRzZWxfaW5pdF9jZmcoYW50c2VsX2luZm9fdCAqYXNpLCB3bGNfYW50c2VsY2ZnX3QgKmFudHNlbCwKK3N0YXRpYyBpbnQgd2xjX2FudHNlbF9jZmd1cGQoc3RydWN0IGFudHNlbF9pbmZvICphc2ksIHdsY19hbnRzZWxjZmdfdCAqYW50c2VsKTsKK3N0YXRpYyB1OCB3bGNfYW50c2VsX2lkMmFudGNmZyhzdHJ1Y3QgYW50c2VsX2luZm8gKmFzaSwgdTggaWQpOworc3RhdGljIHUxNiB3bGNfYW50c2VsX2FudGNmZzJhbnRzZWwoc3RydWN0IGFudHNlbF9pbmZvICphc2ksIHU4IGFudF9jZmcpOworc3RhdGljIHZvaWQgd2xjX2FudHNlbF9pbml0X2NmZyhzdHJ1Y3QgYW50c2VsX2luZm8gKmFzaSwKKwkJCQl3bGNfYW50c2VsY2ZnX3QgKmFudHNlbCwKIAkJCQlib29sIGF1dG9fc2VsKTsKIAogY29uc3QgdTE2IG1pbW9fMng0X2Rpdl9hbnRzZWxwYXRfdGJsW10gPSB7CkBAIC04OCwxNCArOTQsMTUgQEAKIAkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwCS8qIHBhdCB0byBhbnRzZWxpZCAqLwogfTsKIAotYW50c2VsX2luZm9fdCAqd2xjX2FudHNlbF9hdHRhY2god2xjX2luZm9fdCAqd2xjLCBvc2xfdCAqb3NoLAotCQkJCQkJICB3bGNfcHViX3QgKnB1YiwKLQkJCQkJCSAgd2xjX2h3X2luZm9fdCAqd2xjX2h3KSB7Ci0JYW50c2VsX2luZm9fdCAqYXNpOworc3RydWN0IGFudHNlbF9pbmZvICp3bGNfYW50c2VsX2F0dGFjaChzdHJ1Y3Qgd2xjX2luZm8gKndsYywKKwkJCQkgICAgICBzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwKKwkJCQkgICAgICBzdHJ1Y3Qgd2xjX3B1YiAqcHViLAorCQkJCSAgICAgIHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3KSB7CisJc3RydWN0IGFudHNlbF9pbmZvICphc2k7CiAKLQlhc2kgPSBremFsbG9jKHNpemVvZihhbnRzZWxfaW5mb190KSwgR0ZQX0FUT01JQyk7CisJYXNpID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGFudHNlbF9pbmZvKSwgR0ZQX0FUT01JQyk7CiAJaWYgKCFhc2kpIHsKLQkJV0xfRVJST1IoKCJ3bCVkOiB3bGNfYW50c2VsX2F0dGFjaDogb3V0IG9mIG1lbVxuIiwgcHViLT51bml0KSk7CisJCVdMX0VSUk9SKCJ3bCVkOiB3bGNfYW50c2VsX2F0dGFjaDogb3V0IG9mIG1lbVxuIiwgcHViLT51bml0KTsKIAkJcmV0dXJuIE5VTEw7CiAJfQogCkBAIC0xMjQsNyArMTMxLDcgQEAKIAkJCQlhc2ktPmFudHNlbF9hdmFpbCA9IGZhbHNlOwogCQkJfSBlbHNlIHsKIAkJCQlhc2ktPmFudHNlbF9hdmFpbCA9IGZhbHNlOwotCQkJCVdMX0VSUk9SKCgid2xjX2FudHNlbF9hdHRhY2g6IDJvMyBib2FyZCBjZmcgaW52YWxpZFxuIikpOworCQkJCVdMX0VSUk9SKCJ3bGNfYW50c2VsX2F0dGFjaDogMm8zIGJvYXJkIGNmZyBpbnZhbGlkXG4iKTsKIAkJCQlBU1NFUlQoMCk7CiAJCQl9CiAJCQlicmVhazsKQEAgLTE1Miw3ICsxNTksNyBAQAogCXJldHVybiBhc2k7CiB9CiAKLXZvaWQgd2xjX2FudHNlbF9kZXRhY2goYW50c2VsX2luZm9fdCAqYXNpKQordm9pZCB3bGNfYW50c2VsX2RldGFjaChzdHJ1Y3QgYW50c2VsX2luZm8gKmFzaSkKIHsKIAlpZiAoIWFzaSkKIAkJcmV0dXJuOwpAQCAtMTYwLDcgKzE2Nyw3IEBACiAJa2ZyZWUoYXNpKTsKIH0KIAotdm9pZCB3bGNfYW50c2VsX2luaXQoYW50c2VsX2luZm9fdCAqYXNpKQordm9pZCB3bGNfYW50c2VsX2luaXQoc3RydWN0IGFudHNlbF9pbmZvICphc2kpCiB7CiAJaWYgKChhc2ktPmFudHNlbF90eXBlID09IEFOVFNFTF8yeDMpIHx8CiAJICAgIChhc2ktPmFudHNlbF90eXBlID09IEFOVFNFTF8yeDQpKQpAQCAtMTY5LDcgKzE3Niw3IEBACiAKIC8qIGJvYXJkbGV2ZWwgYW50ZW5uYSBzZWxlY3Rpb246IGluaXQgYW50ZW5uYSBzZWxlY3Rpb24gc3RydWN0dXJlICovCiBzdGF0aWMgdm9pZAotd2xjX2FudHNlbF9pbml0X2NmZyhhbnRzZWxfaW5mb190ICphc2ksIHdsY19hbnRzZWxjZmdfdCAqYW50c2VsLAord2xjX2FudHNlbF9pbml0X2NmZyhzdHJ1Y3QgYW50c2VsX2luZm8gKmFzaSwgd2xjX2FudHNlbGNmZ190ICphbnRzZWwsCiAJCSAgICBib29sIGF1dG9fc2VsKQogewogCWlmIChhc2ktPmFudHNlbF90eXBlID09IEFOVFNFTF8yeDMpIHsKQEAgLTIwMCw3ICsyMDcsNyBAQAogfQogCiB2b2lkIEJDTUZBU1RQQVRICi13bGNfYW50c2VsX2FudGNmZ19nZXQoYW50c2VsX2luZm9fdCAqYXNpLCBib29sIHVzZWRlZiwgYm9vbCBzZWwsCit3bGNfYW50c2VsX2FudGNmZ19nZXQoc3RydWN0IGFudHNlbF9pbmZvICphc2ksIGJvb2wgdXNlZGVmLCBib29sIHNlbCwKIAkJICAgICAgdTggYW50c2VsaWQsIHU4IGZiYW50c2VsaWQsIHU4ICphbnRjZmcsCiAJCSAgICAgIHU4ICpmYmFudGNmZykKIHsKQEAgLTIzMiw3ICsyMzksNyBAQAogfQogCiAvKiBib2FyZGxldmVsIGFudGVubmEgc2VsZWN0aW9uOiBjb252ZXJ0IG1pbW9fYW50c2VsICh1Y29kZSBpbnRlcmZhY2UpIHRvIGlkICovCi11OCB3bGNfYW50c2VsX2FudHNlbDJpZChhbnRzZWxfaW5mb190ICphc2ksIHUxNiBhbnRzZWwpCit1OCB3bGNfYW50c2VsX2FudHNlbDJpZChzdHJ1Y3QgYW50c2VsX2luZm8gKmFzaSwgdTE2IGFudHNlbCkKIHsKIAl1OCBhbnRzZWxpZCA9IDA7CiAKQEAgLTI1MSw3ICsyNTgsNyBAQAogfQogCiAvKiBib2FyZGxldmVsIGFudGVubmEgc2VsZWN0aW9uOiBjb252ZXJ0IGlkIHRvIGFudF9jZmcgKi8KLXN0YXRpYyB1OCB3bGNfYW50c2VsX2lkMmFudGNmZyhhbnRzZWxfaW5mb190ICphc2ksIHU4IGlkKQorc3RhdGljIHU4IHdsY19hbnRzZWxfaWQyYW50Y2ZnKHN0cnVjdCBhbnRzZWxfaW5mbyAqYXNpLCB1OCBpZCkKIHsKIAl1OCBhbnRjZmcgPSBBTlRfU0VMQ0ZHX0RFRl8yeDI7CiAKQEAgLTI3MCw3ICsyNzcsNyBAQAogfQogCiAvKiBib2FyZGxldmVsIGFudGVubmEgc2VsZWN0aW9uOiBjb252ZXJ0IGFudF9jZmcgdG8gbWltb19hbnRzZWwgKHVjb2RlIGludGVyZmFjZSkgKi8KLXN0YXRpYyB1MTYgd2xjX2FudHNlbF9hbnRjZmcyYW50c2VsKGFudHNlbF9pbmZvX3QgKmFzaSwgdTggYW50X2NmZykKK3N0YXRpYyB1MTYgd2xjX2FudHNlbF9hbnRjZmcyYW50c2VsKHN0cnVjdCBhbnRzZWxfaW5mbyAqYXNpLCB1OCBhbnRfY2ZnKQogewogCXU4IGlkeCA9IFdMQ19BTlRJRFhfMTFOKFdMQ19BTlRTRUxfMTFOKGFudF9jZmcpKTsKIAl1MTYgbWltb19hbnRzZWwgPSAwOwpAQCAtMjkwLDkgKzI5Nyw5IEBACiB9CiAKIC8qIGJvYXJkbGV2ZWwgYW50ZW5uYSBzZWxlY3Rpb246IHVjb2RlIGludGVyZmFjZSBjb250cm9sICovCi1zdGF0aWMgaW50IHdsY19hbnRzZWxfY2ZndXBkKGFudHNlbF9pbmZvX3QgKmFzaSwgd2xjX2FudHNlbGNmZ190ICphbnRzZWwpCitzdGF0aWMgaW50IHdsY19hbnRzZWxfY2ZndXBkKHN0cnVjdCBhbnRzZWxfaW5mbyAqYXNpLCB3bGNfYW50c2VsY2ZnX3QgKmFudHNlbCkKIHsKLQl3bGNfaW5mb190ICp3bGMgPSBhc2ktPndsYzsKKwlzdHJ1Y3Qgd2xjX2luZm8gKndsYyA9IGFzaS0+d2xjOwogCXU4IGFudF9jZmc7CiAJdTE2IG1pbW9fYW50c2VsOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3N5cy93bGNfYW50c2VsLmggYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3N5cy93bGNfYW50c2VsLmgKaW5kZXggMWQwNDhiYi4uODg3NWI1OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9zeXMvd2xjX2FudHNlbC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvc3lzL3dsY19hbnRzZWwuaApAQCAtMTYsMTMgKzE2LDE1IEBACiAKICNpZm5kZWYgX3dsY19hbnRzZWxfaF8KICNkZWZpbmUgX3dsY19hbnRzZWxfaF8KLWV4dGVybiBhbnRzZWxfaW5mb190ICp3bGNfYW50c2VsX2F0dGFjaCh3bGNfaW5mb190ICp3bGMsIG9zbF90ICpvc2gsCi0JCQkJCXdsY19wdWJfdCAqcHViLAotCQkJCQl3bGNfaHdfaW5mb190ICp3bGNfaHcpOwotZXh0ZXJuIHZvaWQgd2xjX2FudHNlbF9kZXRhY2goYW50c2VsX2luZm9fdCAqYXNpKTsKLWV4dGVybiB2b2lkIHdsY19hbnRzZWxfaW5pdChhbnRzZWxfaW5mb190ICphc2kpOwotZXh0ZXJuIHZvaWQgd2xjX2FudHNlbF9hbnRjZmdfZ2V0KGFudHNlbF9pbmZvX3QgKmFzaSwgYm9vbCB1c2VkZWYsIGJvb2wgc2VsLAorZXh0ZXJuIHN0cnVjdCBhbnRzZWxfaW5mbyAqd2xjX2FudHNlbF9hdHRhY2goc3RydWN0IHdsY19pbmZvICp3bGMsCisJCQkJCXN0cnVjdCBvc2xfaW5mbyAqb3NoLAorCQkJCQlzdHJ1Y3Qgd2xjX3B1YiAqcHViLAorCQkJCQlzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odyk7CitleHRlcm4gdm9pZCB3bGNfYW50c2VsX2RldGFjaChzdHJ1Y3QgYW50c2VsX2luZm8gKmFzaSk7CitleHRlcm4gdm9pZCB3bGNfYW50c2VsX2luaXQoc3RydWN0IGFudHNlbF9pbmZvICphc2kpOworZXh0ZXJuIHZvaWQgd2xjX2FudHNlbF9hbnRjZmdfZ2V0KHN0cnVjdCBhbnRzZWxfaW5mbyAqYXNpLCBib29sIHVzZWRlZiwKKwkJCQkgIGJvb2wgc2VsLAogCQkJCSAgdTggaWQsIHU4IGZiaWQsIHU4ICphbnRjZmcsCiAJCQkJICB1OCAqZmJhbnRjZmcpOwotZXh0ZXJuIHU4IHdsY19hbnRzZWxfYW50c2VsMmlkKGFudHNlbF9pbmZvX3QgKmFzaSwgdTE2IGFudHNlbCk7CitleHRlcm4gdTggd2xjX2FudHNlbF9hbnRzZWwyaWQoc3RydWN0IGFudHNlbF9pbmZvICphc2ksIHUxNiBhbnRzZWwpOwogI2VuZGlmCQkJCS8qIF93bGNfYW50c2VsX2hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3N5cy93bGNfYm1hYy5jIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9zeXMvd2xjX2JtYWMuYwppbmRleCBiNzBmOWQwLi42OWY2MDBhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3N5cy93bGNfYm1hYy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvc3lzL3dsY19ibWFjLmMKQEAgLTE0LDEzICsxNCwxMyBAQAogICogQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KICAqLwogCi0jaWZuZGVmIFdMQ19MT1cKLSNlcnJvciAiVGhpcyBmaWxlIG5lZWRzIFdMQ19MT1ciCi0jZW5kaWYKIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPHdsY19jZmcuaD4KLSNpbmNsdWRlIDxsaW51eHZlci5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CiAjaW5jbHVkZSA8YmNtZGVmcy5oPgogI2luY2x1ZGUgPG9zbC5oPgogI2luY2x1ZGUgPHByb3RvLzgwMi4xMS5oPgpAQCAtNDIsMTIgKzQyLDE0IEBACiAjaW5jbHVkZSA8d2xjX2NoYW5uZWwuaD4KICNpbmNsdWRlIDxiY21zcm9tLmg+CiAjaW5jbHVkZSA8d2xjX2tleS5oPgorI2luY2x1ZGUgPGJjbWRldnMuaD4KIC8qIEJNQUNfTk9URTogYSBXTENfSElHSCBjb21waWxlIGluY2x1ZGUgb2Ygd2xjLmggYWRkcyBpbiBtb3JlIHN0cnVjdHVyZXMgYW5kIHR5cGUKICAqIGRlcGVuZGVuY2llcy4gTmVlZCB0byBpbmNsdWRlIHRoZXNlIHRvIGZpbGVzIHRvIGFsbG93IGEgY2xlYW4gaW5jbHVkZSBvZiB3bGMuaAogICogd2l0aCBXTENfSElHSCBkZWZpbmVkLgogICogQXQgc29tZSBwb2ludCB3ZSBtYXkgYmUgYWJsZSB0byBza2lwIHRoZSBpbmNsdWRlIG9mIHdsYy5oIGFuZCBpbnN0ZWFkIGp1c3QKICAqIGRlZmluZSBhIHN0dWIgd2xjX2luZm8gYW5kIGJhbmQgc3RydWN0IHRvIGFsbG93IHJwYyBjYWxscyB0byBnZXQgdGhlIHJwYyBoYW5kbGUuCiAgKi8KKyNpbmNsdWRlIDx3bGNfZXZlbnQuaD4KICNpbmNsdWRlIDx3bGNfbWFjODAyMTEuaD4KICNpbmNsdWRlIDx3bGNfYm1hYy5oPgogI2luY2x1ZGUgPHdsY19waHlfc2hpbS5oPgpAQCAtNTUsOSArNTcsNiBAQAogI2luY2x1ZGUgPHdsX2V4cG9ydC5oPgogI2luY2x1ZGUgIndsX3Vjb2RlLmgiCiAjaW5jbHVkZSAiZDExdWNvZGVfZXh0LmgiCi0jaWZkZWYgQkNNU0RJTwotI2luY2x1ZGUgPGJjbXNkaC5oPgotI2VuZGlmCiAjaW5jbHVkZSA8YmNtb3RwLmg+CiAKIC8qIEJNQUNfTk9URTogV2l0aCBXTENfSElHSCBkZWZpbmVkLCBzb21lIGZucyBpbiB0aGlzIGZpbGUgbWFrZSBjYWxscyB0byBoaWdoIGxldmVsCkBAIC02OSw2ICs2OCw3IEBACiAjaW5jbHVkZSA8cGNpZV9jb3JlLmg+CiAKICNpbmNsdWRlIDx3bGNfYWxsb2MuaD4KKyNpbmNsdWRlIDx3bF9kYmcuaD4KIAogI2RlZmluZQlUSU1FUl9JTlRFUlZBTF9XQVRDSERPR19CTUFDCTEwMDAJLyogd2F0Y2hkb2cgdGltZXIsIGluIHVuaXQgb2YgbXMgKi8KIApAQCAtMTEzLDY0ICsxMTMsNjUgQEAKIAl7OSwgNTgsIDIyLCAxNCwgMTQsIDV9LAkvKiBjb3JlcmV2IDI0OiAyMzA0LCAxNDg0OCwgNTYzMiwgMzU4NCwgMzU4NCwgMTI4MCAqLwogfTsKIAotc3RhdGljIHZvaWQgd2xjX2Nsa2N0bF9jbGsod2xjX2h3X2luZm9fdCAqd2xjLCB1aW50IG1vZGUpOwotc3RhdGljIHZvaWQgd2xjX2NvcmVpbml0KHdsY19pbmZvX3QgKndsYyk7CitzdGF0aWMgdm9pZCB3bGNfY2xrY3RsX2NsayhzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsYywgdWludCBtb2RlKTsKK3N0YXRpYyB2b2lkIHdsY19jb3JlaW5pdChzdHJ1Y3Qgd2xjX2luZm8gKndsYyk7CiAKIC8qIHVzZWQgYnkgd2xjX3dha2V1Y29kZV9pbml0KCkgKi8KLXN0YXRpYyB2b2lkIHdsY193cml0ZV9pbml0cyh3bGNfaHdfaW5mb190ICp3bGNfaHcsIGNvbnN0IGQxMWluaXRfdCAqaW5pdHMpOwotc3RhdGljIHZvaWQgd2xjX3Vjb2RlX3dyaXRlKHdsY19od19pbmZvX3QgKndsY19odywgY29uc3QgdTMyIHVjb2RlW10sCitzdGF0aWMgdm9pZCB3bGNfd3JpdGVfaW5pdHMoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcsIGNvbnN0IGQxMWluaXRfdCAqaW5pdHMpOworc3RhdGljIHZvaWQgd2xjX3Vjb2RlX3dyaXRlKHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LCBjb25zdCB1MzIgdWNvZGVbXSwKIAkJCSAgICBjb25zdCB1aW50IG5ieXRlcyk7Ci1zdGF0aWMgdm9pZCB3bGNfdWNvZGVfZG93bmxvYWQod2xjX2h3X2luZm9fdCAqd2xjKTsKLXN0YXRpYyB2b2lkIHdsY191Y29kZV90eGFudF9zZXQod2xjX2h3X2luZm9fdCAqd2xjX2h3KTsKK3N0YXRpYyB2b2lkIHdsY191Y29kZV9kb3dubG9hZChzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsYyk7CitzdGF0aWMgdm9pZCB3bGNfdWNvZGVfdHhhbnRfc2V0KHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3KTsKIAogLyogdXNlZCBieSB3bGNfZHBjKCkgKi8KLXN0YXRpYyBib29sIHdsY19ibWFjX2RvdHhzdGF0dXMod2xjX2h3X2luZm9fdCAqd2xjLCB0eF9zdGF0dXNfdCAqdHhzLAorc3RhdGljIGJvb2wgd2xjX2JtYWNfZG90eHN0YXR1cyhzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsYywgdHhfc3RhdHVzX3QgKnR4cywKIAkJCQl1MzIgczIpOwotc3RhdGljIGJvb2wgd2xjX2JtYWNfdHhzdGF0dXNfY29yZXJldjQod2xjX2h3X2luZm9fdCAqd2xjKTsKLXN0YXRpYyBib29sIHdsY19ibWFjX3R4c3RhdHVzKHdsY19od19pbmZvX3QgKndsYywgYm9vbCBib3VuZCwgYm9vbCAqZmF0YWwpOwotc3RhdGljIGJvb2wgd2xjX2JtYWNfcmVjdih3bGNfaHdfaW5mb190ICp3bGNfaHcsIHVpbnQgZmlmbywgYm9vbCBib3VuZCk7CitzdGF0aWMgYm9vbCB3bGNfYm1hY190eHN0YXR1c19jb3JlcmV2NChzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsYyk7CitzdGF0aWMgYm9vbCB3bGNfYm1hY190eHN0YXR1cyhzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsYywgYm9vbCBib3VuZCwgYm9vbCAqZmF0YWwpOworc3RhdGljIGJvb2wgd2xjX2JtYWNfcmVjdihzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odywgdWludCBmaWZvLCBib29sIGJvdW5kKTsKIAogLyogdXNlZCBieSB3bGNfZG93bigpICovCi1zdGF0aWMgdm9pZCB3bGNfZmx1c2hxdWV1ZXMod2xjX2luZm9fdCAqd2xjKTsKK3N0YXRpYyB2b2lkIHdsY19mbHVzaHF1ZXVlcyhzdHJ1Y3Qgd2xjX2luZm8gKndsYyk7CiAKLXN0YXRpYyB2b2lkIHdsY193cml0ZV9taGYod2xjX2h3X2luZm9fdCAqd2xjX2h3LCB1MTYgKm1oZnMpOwotc3RhdGljIHZvaWQgd2xjX21jdHJsX3Jlc2V0KHdsY19od19pbmZvX3QgKndsY19odyk7Ci1zdGF0aWMgdm9pZCB3bGNfY29yZXJldl9maWZvZml4dXAod2xjX2h3X2luZm9fdCAqd2xjX2h3KTsKK3N0YXRpYyB2b2lkIHdsY193cml0ZV9taGYoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcsIHUxNiAqbWhmcyk7CitzdGF0aWMgdm9pZCB3bGNfbWN0cmxfcmVzZXQoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcpOworc3RhdGljIHZvaWQgd2xjX2NvcmVyZXZfZmlmb2ZpeHVwKHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3KTsKIAogLyogTG93IExldmVsIFByb3RvdHlwZXMgKi8KLXN0YXRpYyB1MTYgd2xjX2JtYWNfcmVhZF9vYmptZW0od2xjX2h3X2luZm9fdCAqd2xjX2h3LCB1aW50IG9mZnNldCwKK3N0YXRpYyB1MTYgd2xjX2JtYWNfcmVhZF9vYmptZW0oc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcsIHVpbnQgb2Zmc2V0LAogCQkJCSAgIHUzMiBzZWwpOwotc3RhdGljIHZvaWQgd2xjX2JtYWNfd3JpdGVfb2JqbWVtKHdsY19od19pbmZvX3QgKndsY19odywgdWludCBvZmZzZXQsIHUxNiB2LAotCQkJCSAgdTMyIHNlbCk7Ci1zdGF0aWMgYm9vbCB3bGNfYm1hY19hdHRhY2hfZG1hcGlvKHdsY19pbmZvX3QgKndsYywgdWludCBqLCBib29sIHdtZSk7Ci1zdGF0aWMgdm9pZCB3bGNfYm1hY19kZXRhY2hfZG1hcGlvKHdsY19od19pbmZvX3QgKndsY19odyk7Ci1zdGF0aWMgdm9pZCB3bGNfdWNvZGVfYnNpbml0KHdsY19od19pbmZvX3QgKndsY19odyk7Ci1zdGF0aWMgYm9vbCB3bGNfdmFsaWRib2FyZHR5cGUod2xjX2h3X2luZm9fdCAqd2xjKTsKLXN0YXRpYyBib29sIHdsY19pc2dvb2RjaGlwKHdsY19od19pbmZvX3QgKndsY19odyk7Ci1zdGF0aWMgY2hhciAqd2xjX2dldF9tYWNhZGRyKHdsY19od19pbmZvX3QgKndsY19odyk7Ci1zdGF0aWMgdm9pZCB3bGNfbWhmZGVmKHdsY19pbmZvX3QgKndsYywgdTE2ICptaGZzLCB1MTYgbWhmMl9pbml0KTsKLXN0YXRpYyB2b2lkIHdsY19tY3RybF93cml0ZSh3bGNfaHdfaW5mb190ICp3bGNfaHcpOwotc3RhdGljIHZvaWQgd2xjX3Vjb2RlX211dGVfb3ZlcnJpZGVfc2V0KHdsY19od19pbmZvX3QgKndsY19odyk7Ci1zdGF0aWMgdm9pZCB3bGNfdWNvZGVfbXV0ZV9vdmVycmlkZV9jbGVhcih3bGNfaHdfaW5mb190ICp3bGNfaHcpOwotc3RhdGljIHUzMiB3bGNfd2xpbnRyc29mZih3bGNfaW5mb190ICp3bGMpOwotc3RhdGljIHZvaWQgd2xjX3dsaW50cnNyZXN0b3JlKHdsY19pbmZvX3QgKndsYywgdTMyIG1hY2ludG1hc2spOwotc3RhdGljIHZvaWQgd2xjX2dwaW9faW5pdCh3bGNfaW5mb190ICp3bGMpOwotc3RhdGljIHZvaWQgd2xjX3dyaXRlX2h3X2JjbnRlbXBsYXRlMCh3bGNfaHdfaW5mb190ICp3bGNfaHcsIHZvaWQgKmJjbiwKK3N0YXRpYyB2b2lkIHdsY19ibWFjX3dyaXRlX29iam1lbShzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odywgdWludCBvZmZzZXQsCisJCQkJICB1MTYgdiwgdTMyIHNlbCk7CitzdGF0aWMgYm9vbCB3bGNfYm1hY19hdHRhY2hfZG1hcGlvKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCB1aW50IGosIGJvb2wgd21lKTsKK3N0YXRpYyB2b2lkIHdsY19ibWFjX2RldGFjaF9kbWFwaW8oc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcpOworc3RhdGljIHZvaWQgd2xjX3Vjb2RlX2JzaW5pdChzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odyk7CitzdGF0aWMgYm9vbCB3bGNfdmFsaWRib2FyZHR5cGUoc3RydWN0IHdsY19od19pbmZvICp3bGMpOworc3RhdGljIGJvb2wgd2xjX2lzZ29vZGNoaXAoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcpOworc3RhdGljIGNoYXIgKndsY19nZXRfbWFjYWRkcihzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odyk7CitzdGF0aWMgdm9pZCB3bGNfbWhmZGVmKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCB1MTYgKm1oZnMsIHUxNiBtaGYyX2luaXQpOworc3RhdGljIHZvaWQgd2xjX21jdHJsX3dyaXRlKHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3KTsKK3N0YXRpYyB2b2lkIHdsY191Y29kZV9tdXRlX292ZXJyaWRlX3NldChzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odyk7CitzdGF0aWMgdm9pZCB3bGNfdWNvZGVfbXV0ZV9vdmVycmlkZV9jbGVhcihzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odyk7CitzdGF0aWMgdTMyIHdsY193bGludHJzb2ZmKHN0cnVjdCB3bGNfaW5mbyAqd2xjKTsKK3N0YXRpYyB2b2lkIHdsY193bGludHJzcmVzdG9yZShzdHJ1Y3Qgd2xjX2luZm8gKndsYywgdTMyIG1hY2ludG1hc2spOworc3RhdGljIHZvaWQgd2xjX2dwaW9faW5pdChzdHJ1Y3Qgd2xjX2luZm8gKndsYyk7CitzdGF0aWMgdm9pZCB3bGNfd3JpdGVfaHdfYmNudGVtcGxhdGUwKHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LCB2b2lkICpiY24sCiAJCQkJICAgICAgaW50IGxlbik7Ci1zdGF0aWMgdm9pZCB3bGNfd3JpdGVfaHdfYmNudGVtcGxhdGUxKHdsY19od19pbmZvX3QgKndsY19odywgdm9pZCAqYmNuLAorc3RhdGljIHZvaWQgd2xjX3dyaXRlX2h3X2JjbnRlbXBsYXRlMShzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odywgdm9pZCAqYmNuLAogCQkJCSAgICAgIGludCBsZW4pOwotc3RhdGljIHZvaWQgd2xjX2JtYWNfYnNpbml0KHdsY19pbmZvX3QgKndsYywgY2hhbnNwZWNfdCBjaGFuc3BlYyk7Ci1zdGF0aWMgdTMyIHdsY19zZXRiYW5kX2luYWN0KHdsY19pbmZvX3QgKndsYywgdWludCBiYW5kdW5pdCk7Ci1zdGF0aWMgdm9pZCB3bGNfYm1hY19zZXRiYW5kKHdsY19od19pbmZvX3QgKndsY19odywgdWludCBiYW5kdW5pdCwKK3N0YXRpYyB2b2lkIHdsY19ibWFjX2JzaW5pdChzdHJ1Y3Qgd2xjX2luZm8gKndsYywgY2hhbnNwZWNfdCBjaGFuc3BlYyk7CitzdGF0aWMgdTMyIHdsY19zZXRiYW5kX2luYWN0KHN0cnVjdCB3bGNfaW5mbyAqd2xjLCB1aW50IGJhbmR1bml0KTsKK3N0YXRpYyB2b2lkIHdsY19ibWFjX3NldGJhbmQoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcsIHVpbnQgYmFuZHVuaXQsCiAJCQkgICAgIGNoYW5zcGVjX3QgY2hhbnNwZWMpOwotc3RhdGljIHZvaWQgd2xjX2JtYWNfdXBkYXRlX3Nsb3RfdGltaW5nKHdsY19od19pbmZvX3QgKndsY19odywgYm9vbCBzaG9ydHNsb3QpOwotc3RhdGljIHZvaWQgd2xjX3VwZF9vZmRtX3BjdGwxX3RhYmxlKHdsY19od19pbmZvX3QgKndsY19odyk7Ci1zdGF0aWMgdTE2IHdsY19ibWFjX29mZG1fcmF0ZXRhYmxlX29mZnNldCh3bGNfaHdfaW5mb190ICp3bGNfaHcsCitzdGF0aWMgdm9pZCB3bGNfYm1hY191cGRhdGVfc2xvdF90aW1pbmcoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcsCisJCQkJCWJvb2wgc2hvcnRzbG90KTsKK3N0YXRpYyB2b2lkIHdsY191cGRfb2ZkbV9wY3RsMV90YWJsZShzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odyk7CitzdGF0aWMgdTE2IHdsY19ibWFjX29mZG1fcmF0ZXRhYmxlX29mZnNldChzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odywKIAkJCQkJICAgICB1OCByYXRlKTsKIAogLyogPT09IExvdyBMZXZlbCBmdW5jdGlvbnMgPT09ICovCiAKLXZvaWQgd2xjX2JtYWNfc2V0X3Nob3J0c2xvdCh3bGNfaHdfaW5mb190ICp3bGNfaHcsIGJvb2wgc2hvcnRzbG90KQordm9pZCB3bGNfYm1hY19zZXRfc2hvcnRzbG90KHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LCBib29sIHNob3J0c2xvdCkKIHsKIAl3bGNfaHctPnNob3J0c2xvdCA9IHNob3J0c2xvdDsKIApAQCAtMTg2LDkgKzE4NywxMCBAQAogICogb3Igc2hvcnRzbG90IDExZyAoOXVzIHNsb3RzKQogICogVGhlIFBTTSBuZWVkcyB0byBiZSBzdXNwZW5kZWQgZm9yIHRoaXMgY2FsbC4KICAqLwotc3RhdGljIHZvaWQgd2xjX2JtYWNfdXBkYXRlX3Nsb3RfdGltaW5nKHdsY19od19pbmZvX3QgKndsY19odywgYm9vbCBzaG9ydHNsb3QpCitzdGF0aWMgdm9pZCB3bGNfYm1hY191cGRhdGVfc2xvdF90aW1pbmcoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcsCisJCQkJCWJvb2wgc2hvcnRzbG90KQogewotCW9zbF90ICpvc2g7CisJc3RydWN0IG9zbF9pbmZvICpvc2g7CiAJZDExcmVnc190ICpyZWdzOwogCiAJb3NoID0gd2xjX2h3LT5vc2g7CkBAIC0yMDUsNyArMjA3LDcgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIFdMQkFORElOSVRGTih3bGNfdWNvZGVfYnNpbml0KSAod2xjX2h3X2luZm9fdCAqd2xjX2h3KQorc3RhdGljIHZvaWQgV0xCQU5ESU5JVEZOKHdsY191Y29kZV9ic2luaXQpIChzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odykKIHsKIAkvKiBpbml0IG1pY3JvY29kZSBob3N0IGZsYWdzICovCiAJd2xjX3dyaXRlX21oZih3bGNfaHcsIHdsY19ody0+YmFuZC0+bWhmcyk7CkBAIC0yMTUsMzAgKzIxNywzMiBAQAogCQlpZiAoV0xDSVNOUEhZKHdsY19ody0+YmFuZCkpIHsKIAkJCXdsY193cml0ZV9pbml0cyh3bGNfaHcsIGQxMW4wYnNpbml0dmFsczE2KTsKIAkJfSBlbHNlIHsKLQkJCVdMX0VSUk9SKCgiJXM6IHdsJWQ6IHVuc3VwcG9ydGVkIHBoeSBpbiBjb3JlcmV2ICVkXG4iLAotCQkJCSAgX19mdW5jX18sIHdsY19ody0+dW5pdCwgd2xjX2h3LT5jb3JlcmV2KSk7CisJCQlXTF9FUlJPUigiJXM6IHdsJWQ6IHVuc3VwcG9ydGVkIHBoeSBpbiBjb3JlcmV2ICVkXG4iLAorCQkJCSBfX2Z1bmNfXywgd2xjX2h3LT51bml0LCB3bGNfaHctPmNvcmVyZXYpOwogCQl9CiAJfSBlbHNlIHsKIAkJaWYgKEQxMVJFVl9JUyh3bGNfaHctPmNvcmVyZXYsIDI0KSkgewogCQkJaWYgKFdMQ0lTTENOUEhZKHdsY19ody0+YmFuZCkpIHsKIAkJCQl3bGNfd3JpdGVfaW5pdHMod2xjX2h3LCBkMTFsY24wYnNpbml0dmFsczI0KTsKIAkJCX0gZWxzZQotCQkJCVdMX0VSUk9SKCgiJXM6IHdsJWQ6IHVuc3VwcG9ydGVkIHBoeSBpbiBjb3JlcmV2ICVkXG4iLCBfX2Z1bmNfXywgd2xjX2h3LT51bml0LCB3bGNfaHctPmNvcmVyZXYpKTsKKwkJCQlXTF9FUlJPUigiJXM6IHdsJWQ6IHVuc3VwcG9ydGVkIHBoeSBpbiBjb3JlcmV2ICVkXG4iLAorCQkJCQkgX19mdW5jX18sIHdsY19ody0+dW5pdCwKKwkJCQkJIHdsY19ody0+Y29yZXJldik7CiAJCX0gZWxzZSB7Ci0JCQlXTF9FUlJPUigoIiVzOiB3bCVkOiB1bnN1cHBvcnRlZCBjb3JlcmV2ICVkXG4iLAotCQkJCSAgX19mdW5jX18sIHdsY19ody0+dW5pdCwgd2xjX2h3LT5jb3JlcmV2KSk7CisJCQlXTF9FUlJPUigiJXM6IHdsJWQ6IHVuc3VwcG9ydGVkIGNvcmVyZXYgJWRcbiIsCisJCQkJIF9fZnVuY19fLCB3bGNfaHctPnVuaXQsIHdsY19ody0+Y29yZXJldik7CiAJCX0KIAl9CiB9CiAKIC8qIHN3aXRjaCB0byBuZXcgYmFuZCBidXQgbGVhdmUgaXQgaW5hY3RpdmUgKi8KLXN0YXRpYyB1MzIgV0xCQU5ESU5JVEZOKHdsY19zZXRiYW5kX2luYWN0KSAod2xjX2luZm9fdCAqd2xjLCB1aW50IGJhbmR1bml0KQorc3RhdGljIHUzMiBXTEJBTkRJTklURk4od2xjX3NldGJhbmRfaW5hY3QpIChzdHJ1Y3Qgd2xjX2luZm8gKndsYywgdWludCBiYW5kdW5pdCkKIHsKLQl3bGNfaHdfaW5mb190ICp3bGNfaHcgPSB3bGMtPmh3OworCXN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3ID0gd2xjLT5odzsKIAl1MzIgbWFjaW50bWFzazsKIAl1MzIgdG1wOwogCi0JV0xfVFJBQ0UoKCJ3bCVkOiB3bGNfc2V0YmFuZF9pbmFjdFxuIiwgd2xjX2h3LT51bml0KSk7CisJV0xfVFJBQ0UoIndsJWQ6IHdsY19zZXRiYW5kX2luYWN0XG4iLCB3bGNfaHctPnVuaXQpOwogCiAJQVNTRVJUKGJhbmR1bml0ICE9IHdsY19ody0+YmFuZC0+YmFuZHVuaXQpOwogCUFTU0VSVChzaV9pc2NvcmV1cCh3bGNfaHctPnNpaCkpOwpAQCAtMjY5LDI0ICsyNzMsMjQgQEAKICAqIFBhcmFtICdib3VuZCcgaW5kaWNhdGVzIG1heC4gIyBmcmFtZXMgdG8gcHJvY2VzcyBiZWZvcmUgYnJlYWsgb3V0LgogICovCiBzdGF0aWMgYm9vbCBCQ01GQVNUUEFUSAotd2xjX2JtYWNfcmVjdih3bGNfaHdfaW5mb190ICp3bGNfaHcsIHVpbnQgZmlmbywgYm9vbCBib3VuZCkKK3dsY19ibWFjX3JlY3Yoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcsIHVpbnQgZmlmbywgYm9vbCBib3VuZCkKIHsKLQl2b2lkICpwOwotCXZvaWQgKmhlYWQgPSBOVUxMOwotCXZvaWQgKnRhaWwgPSBOVUxMOworCXN0cnVjdCBza19idWZmICpwOworCXN0cnVjdCBza19idWZmICpoZWFkID0gTlVMTDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqdGFpbCA9IE5VTEw7CiAJdWludCBuID0gMDsKIAl1aW50IGJvdW5kX2xpbWl0ID0gYm91bmQgPyB3bGNfaHctPndsYy0+cHViLT50dW5hYmxlcy0+cnhibmQgOiAtMTsKIAl1MzIgdHNmX2gsIHRzZl9sOwogCXdsY19kMTFyeGhkcl90ICp3bGNfcnhoZHIgPSBOVUxMOwogCi0JV0xfVFJBQ0UoKCJ3bCVkOiAlc1xuIiwgd2xjX2h3LT51bml0LCBfX2Z1bmNfXykpOworCVdMX1RSQUNFKCJ3bCVkOiAlc1xuIiwgd2xjX2h3LT51bml0LCBfX2Z1bmNfXyk7CiAJLyogZ2F0aGVyIHJlY2VpdmVkIGZyYW1lcyAqLwogCXdoaWxlICgocCA9IGRtYV9yeCh3bGNfaHctPmRpW2ZpZm9dKSkpIHsKIAogCQlpZiAoIXRhaWwpCiAJCQloZWFkID0gdGFpbCA9IHA7CiAJCWVsc2UgewotCQkJUEtUU0VUTElOSyh0YWlsLCBwKTsKKwkJCXRhaWwtPnByZXYgPSBwOwogCQkJdGFpbCA9IHA7CiAJCX0KIApAQCAtMzAzLDExICszMDcsMTEgQEAKIAogCS8qIHByb2Nlc3MgZWFjaCBmcmFtZSAqLwogCXdoaWxlICgocCA9IGhlYWQpICE9IE5VTEwpIHsKLQkJaGVhZCA9IFBLVExJTksoaGVhZCk7Ci0JCVBLVFNFVExJTksocCwgTlVMTCk7CisJCWhlYWQgPSBoZWFkLT5wcmV2OworCQlwLT5wcmV2ID0gTlVMTDsKIAogCQkvKiByZWNvcmQgdGhlIHRzZl9sIGluIHdsY19yeGQxMWhkciAqLwotCQl3bGNfcnhoZHIgPSAod2xjX2QxMXJ4aGRyX3QgKikgUEtUREFUQShwKTsKKwkJd2xjX3J4aGRyID0gKHdsY19kMTFyeGhkcl90ICopIHAtPmRhdGE7CiAJCXdsY19yeGhkci0+dHNmX2wgPSBodG9sMzIodHNmX2wpOwogCiAJCS8qIGNvbXB1dGUgdGhlIFJTU0kgZnJvbSBkMTFyeGhkciBhbmQgcmVjb3JkIGl0IGluIHdsY19yeGQxMWhyICovCkBAIC0zMjMsMTUgKzMyNywxNSBAQAogICogICBSZXR1cm4gdHJ1ZSBpZiBhbm90aGVyIGRwYyBuZWVkcyB0byBiZSByZS1zY2hlZHVsZWQuIGZhbHNlIG90aGVyd2lzZS4KICAqICAgUGFyYW0gJ2JvdW5kZWQnIGluZGljYXRlcyBpZiBhcHBsaWNhYmxlIGxvb3BzIHNob3VsZCBiZSBib3VuZGVkLgogICovCi1ib29sIEJDTUZBU1RQQVRIIHdsY19kcGMod2xjX2luZm9fdCAqd2xjLCBib29sIGJvdW5kZWQpCitib29sIEJDTUZBU1RQQVRIIHdsY19kcGMoc3RydWN0IHdsY19pbmZvICp3bGMsIGJvb2wgYm91bmRlZCkKIHsKIAl1MzIgbWFjaW50c3RhdHVzOwotCXdsY19od19pbmZvX3QgKndsY19odyA9IHdsYy0+aHc7CisJc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcgPSB3bGMtPmh3OwogCWQxMXJlZ3NfdCAqcmVncyA9IHdsY19ody0+cmVnczsKIAlib29sIGZhdGFsID0gZmFsc2U7CiAKIAlpZiAoREVWSUNFUkVNT1ZFRCh3bGMpKSB7Ci0JCVdMX0VSUk9SKCgid2wlZDogJXM6IGRlYWQgY2hpcFxuIiwgd2xjX2h3LT51bml0LCBfX2Z1bmNfXykpOworCQlXTF9FUlJPUigid2wlZDogJXM6IGRlYWQgY2hpcFxuIiwgd2xjX2h3LT51bml0LCBfX2Z1bmNfXyk7CiAJCXdsX2Rvd24od2xjLT53bCk7CiAJCXJldHVybiBmYWxzZTsKIAl9CkBAIC0zNDAsOCArMzQ0LDggQEAKIAltYWNpbnRzdGF0dXMgPSB3bGMtPm1hY2ludHN0YXR1czsKIAl3bGMtPm1hY2ludHN0YXR1cyA9IDA7CiAKLQlXTF9UUkFDRSgoIndsJWQ6IHdsY19kcGM6IG1hY2ludHN0YXR1cyAweCV4XG4iLCB3bGNfaHctPnVuaXQsCi0JCSAgbWFjaW50c3RhdHVzKSk7CisJV0xfVFJBQ0UoIndsJWQ6IHdsY19kcGM6IG1hY2ludHN0YXR1cyAweCV4XG4iLAorCQkgd2xjX2h3LT51bml0LCBtYWNpbnRzdGF0dXMpOwogCiAJaWYgKG1hY2ludHN0YXR1cyAmIE1JX1BSUSkgewogCQkvKiBQcm9jZXNzIHByb2JlIHJlcXVlc3QgRklGTyAqLwpAQCAtMzY0LDcgKzM2OCw3IEBACiAJCWlmICh3bGNfYm1hY190eHN0YXR1cyh3bGMtPmh3LCBib3VuZGVkLCAmZmF0YWwpKQogCQkJd2xjLT5tYWNpbnRzdGF0dXMgfD0gTUlfVEZTOwogCQlpZiAoZmF0YWwpIHsKLQkJCVdMX0VSUk9SKCgiTUlfVEZTOiBmYXRhbFxuIikpOworCQkJV0xfRVJST1IoIk1JX1RGUzogZmF0YWxcbiIpOwogCQkJZ290byBmYXRhbDsKIAkJfQogCX0KQEAgLTM3NCw3ICszNzgsNyBAQAogCiAJLyogQVRJTSB3aW5kb3cgZW5kICovCiAJaWYgKG1hY2ludHN0YXR1cyAmIE1JX0FUSU1XSU5FTkQpIHsKLQkJV0xfVFJBQ0UoKCJ3bGNfaXNyOiBlbmQgb2YgQVRJTSB3aW5kb3dcbiIpKTsKKwkJV0xfVFJBQ0UoIndsY19pc3I6IGVuZCBvZiBBVElNIHdpbmRvd1xuIik7CiAKIAkJT1JfUkVHKHdsY19ody0+b3NoLCAmcmVncy0+bWFjY29tbWFuZCwgd2xjLT5xdmFsaWQpOwogCQl3bGMtPnF2YWxpZCA9IDA7CkBAIC0zOTUsNyArMzk5LDcgQEAKIAkvKiBUWCBGSUZPIHN1c3BlbmQvZmx1c2ggY29tcGxldGlvbiAqLwogCWlmIChtYWNpbnRzdGF0dXMgJiBNSV9UWFNUT1ApIHsKIAkJaWYgKHdsY19ibWFjX3R4X2ZpZm9fc3VzcGVuZGVkKHdsY19odywgVFhfREFUQV9GSUZPKSkgewotCQkJLyogICAgICBXTF9FUlJPUigoImRwYzogZmlmb19zdXNwZW5kX2NvbWxldGVcbiIpKTsgKi8KKwkJCS8qICAgICAgV0xfRVJST1IoImRwYzogZmlmb19zdXNwZW5kX2NvbWxldGVcbiIpOyAqLwogCQl9CiAJfQogCkBAIC00MDUsMTEgKzQwOSwxMiBAQAogCX0KIAogCWlmIChtYWNpbnRzdGF0dXMgJiBNSV9HUDApIHsKLQkJV0xfRVJST1IoKCJ3bCVkOiBQU00gbWljcm9jb2RlIHdhdGNoZG9nIGZpcmVkIGF0ICVkIChzZWNvbmRzKS4gUmVzZXR0aW5nLlxuIiwgd2xjX2h3LT51bml0LCB3bGNfaHctPm5vdykpOworCQlXTF9FUlJPUigid2wlZDogUFNNIG1pY3JvY29kZSB3YXRjaGRvZyBmaXJlZCBhdCAlZCAoc2Vjb25kcykuIFJlc2V0dGluZy5cbiIsCisJCQkgd2xjX2h3LT51bml0LCB3bGNfaHctPm5vdyk7CiAKIAkJcHJpbnRrX29uY2UoIiVzIDogUFNNIFdhdGNoZG9nLCBjaGlwaWQgMHgleCwgY2hpcHJldiAweCV4XG4iLAotCQkJICAgIF9fZnVuY19fLCBDSElQSUQod2xjX2h3LT5zaWgtPmNoaXApLAotCQkJICAgIENISVBSRVYod2xjX2h3LT5zaWgtPmNoaXByZXYpKTsKKwkJCQkJX19mdW5jX18sIHdsY19ody0+c2loLT5jaGlwLAorCQkJCQl3bGNfaHctPnNpaC0+Y2hpcHJldik7CiAKIAkJV0xDTlRJTkNSKHdsYy0+cHViLT5fY250LT5wc213ZHMpOwogCkBAIC00MjcsNyArNDMyLDggQEAKIAkJdTMyIHJmZCA9IFJfUkVHKHdsY19ody0+b3NoLCAmcmVncy0+cGh5ZGVidWcpICYgUERCR19SRkQ7CiAjZW5kaWYKIAotCQlXTF9FUlJPUigoIndsJWQ6IE1BQyBEZXRlY3RlZCBhIGNoYW5nZSBvbiB0aGUgUkYgRGlzYWJsZSBJbnB1dCAweCV4XG4iLCB3bGNfaHctPnVuaXQsIHJmZCkpOworCQlXTF9FUlJPUigid2wlZDogTUFDIERldGVjdGVkIGEgY2hhbmdlIG9uIHRoZSBSRiBEaXNhYmxlIElucHV0IDB4JXhcbiIsCisJCQkgd2xjX2h3LT51bml0LCByZmQpOwogCiAJCVdMQ05USU5DUih3bGMtPnB1Yi0+X2NudC0+cmZkaXNhYmxlKTsKIAl9CkBAIC00NTIsMTAgKzQ1OCwxMCBAQAogLyogY29tbW9uIGxvdy1sZXZlbCB3YXRjaGRvZyBjb2RlICovCiB2b2lkIHdsY19ibWFjX3dhdGNoZG9nKHZvaWQgKmFyZykKIHsKLQl3bGNfaW5mb190ICp3bGMgPSAod2xjX2luZm9fdCAqKSBhcmc7Ci0Jd2xjX2h3X2luZm9fdCAqd2xjX2h3ID0gd2xjLT5odzsKKwlzdHJ1Y3Qgd2xjX2luZm8gKndsYyA9IChzdHJ1Y3Qgd2xjX2luZm8gKikgYXJnOworCXN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3ID0gd2xjLT5odzsKIAotCVdMX1RSQUNFKCgid2wlZDogd2xjX2JtYWNfd2F0Y2hkb2dcbiIsIHdsY19ody0+dW5pdCkpOworCVdMX1RSQUNFKCJ3bCVkOiB3bGNfYm1hY193YXRjaGRvZ1xuIiwgd2xjX2h3LT51bml0KTsKIAogCWlmICghd2xjX2h3LT51cCkKIAkJcmV0dXJuOwpAQCAtNDc2LDEzICs0ODIsMTMgQEAKIH0KIAogdm9pZAotd2xjX2JtYWNfc2V0X2NoYW5zcGVjKHdsY19od19pbmZvX3QgKndsY19odywgY2hhbnNwZWNfdCBjaGFuc3BlYywgYm9vbCBtdXRlLAotCQkgICAgICBzdHJ1Y3QgdHhwd3JfbGltaXRzICp0eHB3cikKK3dsY19ibWFjX3NldF9jaGFuc3BlYyhzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odywgY2hhbnNwZWNfdCBjaGFuc3BlYywKKwkJICAgICAgYm9vbCBtdXRlLCBzdHJ1Y3QgdHhwd3JfbGltaXRzICp0eHB3cikKIHsKIAl1aW50IGJhbmR1bml0OwogCi0JV0xfVFJBQ0UoKCJ3bCVkOiB3bGNfYm1hY19zZXRfY2hhbnNwZWMgMHgleFxuIiwgd2xjX2h3LT51bml0LAotCQkgIGNoYW5zcGVjKSk7CisJV0xfVFJBQ0UoIndsJWQ6IHdsY19ibWFjX3NldF9jaGFuc3BlYyAweCV4XG4iLAorCQkgd2xjX2h3LT51bml0LCBjaGFuc3BlYyk7CiAKIAl3bGNfaHctPmNoYW5zcGVjID0gY2hhbnNwZWM7CiAKQEAgLTUyMCw3ICs1MjYsOCBAQAogCX0KIH0KIAotaW50IHdsY19ibWFjX3JldmluZm9fZ2V0KHdsY19od19pbmZvX3QgKndsY19odywgd2xjX2JtYWNfcmV2aW5mb190ICpyZXZpbmZvKQoraW50IHdsY19ibWFjX3JldmluZm9fZ2V0KHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LAorCQkJIHdsY19ibWFjX3JldmluZm9fdCAqcmV2aW5mbykKIHsKIAlzaV90ICpzaWggPSB3bGNfaHctPnNpaDsKIAl1aW50IGlkeDsKQEAgLTU1OCwyMCArNTY1LDIwIEBACiAJcmV0dXJuIDA7CiB9CiAKLWludCB3bGNfYm1hY19zdGF0ZV9nZXQod2xjX2h3X2luZm9fdCAqd2xjX2h3LCB3bGNfYm1hY19zdGF0ZV90ICpzdGF0ZSkKK2ludCB3bGNfYm1hY19zdGF0ZV9nZXQoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcsIHdsY19ibWFjX3N0YXRlX3QgKnN0YXRlKQogewogCXN0YXRlLT5tYWNod2NhcCA9IHdsY19ody0+bWFjaHdjYXA7CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGJvb2wgd2xjX2JtYWNfYXR0YWNoX2RtYXBpbyh3bGNfaW5mb190ICp3bGMsIHVpbnQgaiwgYm9vbCB3bWUpCitzdGF0aWMgYm9vbCB3bGNfYm1hY19hdHRhY2hfZG1hcGlvKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCB1aW50IGosIGJvb2wgd21lKQogewogCXVpbnQgaTsKIAljaGFyIG5hbWVbOF07CiAJLyogdWNvZGUgaG9zdCBmbGFnIDIgbmVlZGVkIGZvciBwaW8gbW9kZSwgaW5kZXBlbmRlbnQgb2YgYmFuZCBhbmQgZmlmbyAqLwogCXUxNiBwaW9fbWhmMiA9IDA7Ci0Jd2xjX2h3X2luZm9fdCAqd2xjX2h3ID0gd2xjLT5odzsKKwlzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odyA9IHdsYy0+aHc7CiAJdWludCB1bml0ID0gd2xjX2h3LT51bml0OwogCXdsY190dW5hYmxlc190ICp0dW5lID0gd2xjLT5wdWItPnR1bmFibGVzOwogCkBAIC01ODEsNyArNTg4LDcgQEAKIAlpZiAod2xjX2h3LT5kaVswXSA9PSAwKSB7CS8qIEluaXQgRklGT3MgKi8KIAkJdWludCBhZGRyd2lkdGg7CiAJCWludCBkbWFfYXR0YWNoX2VyciA9IDA7Ci0JCW9zbF90ICpvc2ggPSB3bGNfaHctPm9zaDsKKwkJc3RydWN0IG9zbF9pbmZvICpvc2ggPSB3bGNfaHctPm9zaDsKIAogCQkvKiBGaW5kIG91dCB0aGUgRE1BIGFkZHJlc3NpbmcgY2FwYWJpbGl0eSBhbmQgbGV0IE9TIGtub3cKIAkJICogQWxsIHRoZSBjaGFubmVscyB3aXRoaW4gb25lIERNQSBjb3JlIGhhdmUgJ2NvbW1vbi1taW5pbXVtJyBzYW1lCkBAIC01ODksMTAgKzU5NiwxMCBAQAogCQkgKi8KIAkJYWRkcndpZHRoID0KIAkJICAgIGRtYV9hZGRyd2lkdGgod2xjX2h3LT5zaWgsIERNQVJFRyh3bGNfaHcsIERNQV9UWCwgMCkpOwotCQlPU0xfRE1BRERSV0lEVEgob3NoLCBhZGRyd2lkdGgpOwogCiAJCWlmICghd2xfYWxsb2NfZG1hX3Jlc291cmNlcyh3bGNfaHctPndsYy0+d2wsIGFkZHJ3aWR0aCkpIHsKLQkJCVdMX0VSUk9SKCgid2wlZDogd2xjX2F0dGFjaDogYWxsb2NfZG1hX3Jlc291cmNlcyBmYWlsZWRcbiIsIHVuaXQpKTsKKwkJCVdMX0VSUk9SKCJ3bCVkOiB3bGNfYXR0YWNoOiBhbGxvY19kbWFfcmVzb3VyY2VzIGZhaWxlZFxuIiwKKwkJCQkgdW5pdCk7CiAJCQlyZXR1cm4gZmFsc2U7CiAJCX0KIApAQCAtNjY1LDggKzY3Miw3IEBACiAvKiBDbGVhbmVyIHRvIGxlYXZlIHRoaXMgYXMgaWYgd2l0aCBBUCBkZWZpbmVkICovCiAKIAkJaWYgKGRtYV9hdHRhY2hfZXJyKSB7Ci0JCQlXTF9FUlJPUigoIndsJWQ6IHdsY19hdHRhY2g6IGRtYV9hdHRhY2ggZmFpbGVkXG4iLAotCQkJCSAgdW5pdCkpOworCQkJV0xfRVJST1IoIndsJWQ6IHdsY19hdHRhY2g6IGRtYV9hdHRhY2ggZmFpbGVkXG4iLCB1bml0KTsKIAkJCXJldHVybiBmYWxzZTsKIAkJfQogCkBAIC02ODQsNyArNjkwLDcgQEAKIAlyZXR1cm4gdHJ1ZTsKIH0KIAotc3RhdGljIHZvaWQgd2xjX2JtYWNfZGV0YWNoX2RtYXBpbyh3bGNfaHdfaW5mb190ICp3bGNfaHcpCitzdGF0aWMgdm9pZCB3bGNfYm1hY19kZXRhY2hfZG1hcGlvKHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3KQogewogCXVpbnQgajsKIApAQCAtNzAyLDExICs3MDgsMTEgQEAKICAqICAgIGluaXRpYWxpemUgc29mdHdhcmUgc3RhdGUgZm9yIGVhY2ggY29yZSBhbmQgYmFuZAogICogICAgcHV0IHRoZSB3aG9sZSBjaGlwIGluIHJlc2V0KGRyaXZlciBkb3duIHN0YXRlKSwgbm8gY2xvY2sKICAqLwotaW50IHdsY19ibWFjX2F0dGFjaCh3bGNfaW5mb190ICp3bGMsIHUxNiB2ZW5kb3IsIHUxNiBkZXZpY2UsIHVpbnQgdW5pdCwKLQkJICAgIGJvb2wgcGlvbW9kZSwgb3NsX3QgKm9zaCwgdm9pZCAqcmVnc3ZhLCB1aW50IGJ1c3R5cGUsCi0JCSAgICB2b2lkICpidHBhcmFtKQoraW50IHdsY19ibWFjX2F0dGFjaChzdHJ1Y3Qgd2xjX2luZm8gKndsYywgdTE2IHZlbmRvciwgdTE2IGRldmljZSwgdWludCB1bml0LAorCQkgICAgYm9vbCBwaW9tb2RlLCBzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgdm9pZCAqcmVnc3ZhLAorCQkgICAgdWludCBidXN0eXBlLCB2b2lkICpidHBhcmFtKQogewotCXdsY19od19pbmZvX3QgKndsY19odzsKKwlzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odzsKIAlkMTFyZWdzX3QgKnJlZ3M7CiAJY2hhciAqbWFjYWRkciA9IE5VTEw7CiAJY2hhciAqdmFyczsKQEAgLTcxNSw4ICs3MjEsOCBAQAogCWJvb2wgd21lID0gZmFsc2U7CiAJc2hhcmVkX3BoeV9wYXJhbXNfdCBzaGFfcGFyYW1zOwogCi0JV0xfVFJBQ0UoKCJ3bCVkOiB3bGNfYm1hY19hdHRhY2g6IHZlbmRvciAweCV4IGRldmljZSAweCV4XG4iLCB1bml0LAotCQkgIHZlbmRvciwgZGV2aWNlKSk7CisJV0xfVFJBQ0UoIndsJWQ6IHdsY19ibWFjX2F0dGFjaDogdmVuZG9yIDB4JXggZGV2aWNlIDB4JXhcbiIsCisJCSB1bml0LCB2ZW5kb3IsIGRldmljZSk7CiAKIAlBU1NFUlQoc2l6ZW9mKHdsY19kMTFyeGhkcl90KSA8PSBXTF9IV1JYT0ZGKTsKIApAQCAtNzI5LDcgKzczNSw3IEBACiAJd2xjX2h3LT5iYW5kID0gd2xjX2h3LT5iYW5kc3RhdGVbMF07CiAJd2xjX2h3LT5fcGlvbW9kZSA9IHBpb21vZGU7CiAKLQkvKiBwb3B1bGF0ZSB3bGNfaHdfaW5mb190IHdpdGggZGVmYXVsdCB2YWx1ZXMgICovCisJLyogcG9wdWxhdGUgc3RydWN0IHdsY19od19pbmZvIHdpdGggZGVmYXVsdCB2YWx1ZXMgICovCiAJd2xjX2JtYWNfaW5mb19pbml0KHdsY19odyk7CiAKIAkvKgpAQCAtNzQwLDcgKzc0Niw3IEBACiAJd2xjX2h3LT5zaWggPSBzaV9hdHRhY2goKHVpbnQpIGRldmljZSwgb3NoLCByZWdzdmEsIGJ1c3R5cGUsIGJ0cGFyYW0sCiAJCQkJJndsY19ody0+dmFycywgJndsY19ody0+dmFyc19zaXplKTsKIAlpZiAod2xjX2h3LT5zaWggPT0gTlVMTCkgewotCQlXTF9FUlJPUigoIndsJWQ6IHdsY19ibWFjX2F0dGFjaDogc2lfYXR0YWNoIGZhaWxlZFxuIiwgdW5pdCkpOworCQlXTF9FUlJPUigid2wlZDogd2xjX2JtYWNfYXR0YWNoOiBzaV9hdHRhY2ggZmFpbGVkXG4iLCB1bml0KTsKIAkJZXJyID0gMTE7CiAJCWdvdG8gZmFpbDsKIAl9CkBAIC03NjAsMjEgKzc2NiwyMiBAQAogCQl2YXIgPSBnZXR2YXIodmFycywgInZlbmRpZCIpOwogCQlpZiAodmFyKSB7CiAJCQl2ZW5kb3IgPSAodTE2KSBzaW1wbGVfc3RydG91bCh2YXIsIE5VTEwsIDApOwotCQkJV0xfRVJST1IoKCJPdmVycmlkaW5nIHZlbmRvciBpZCA9IDB4JXhcbiIsIHZlbmRvcikpOworCQkJV0xfRVJST1IoIk92ZXJyaWRpbmcgdmVuZG9yIGlkID0gMHgleFxuIiwgdmVuZG9yKTsKIAkJfQogCQl2YXIgPSBnZXR2YXIodmFycywgImRldmlkIik7CiAJCWlmICh2YXIpIHsKIAkJCXUxNiBkZXZpZCA9ICh1MTYpIHNpbXBsZV9zdHJ0b3VsKHZhciwgTlVMTCwgMCk7CiAJCQlpZiAoZGV2aWQgIT0gMHhmZmZmKSB7CiAJCQkJZGV2aWNlID0gZGV2aWQ7Ci0JCQkJV0xfRVJST1IoKCJPdmVycmlkaW5nIGRldmljZSBpZCA9IDB4JXhcbiIsCi0JCQkJCSAgZGV2aWNlKSk7CisJCQkJV0xfRVJST1IoIk92ZXJyaWRpbmcgZGV2aWNlIGlkID0gMHgleFxuIiwKKwkJCQkJIGRldmljZSk7CiAJCQl9CiAJCX0KIAogCQkvKiB2ZXJpZnkgYWdhaW4gdGhlIGRldmljZSBpcyBzdXBwb3J0ZWQgKi8KIAkJaWYgKCF3bGNfY2hpcG1hdGNoKHZlbmRvciwgZGV2aWNlKSkgewotCQkJV0xfRVJST1IoKCJ3bCVkOiB3bGNfYm1hY19hdHRhY2g6IFVuc3VwcG9ydGVkIHZlbmRvci9kZXZpY2UgKDB4JXgvMHgleClcbiIsIHVuaXQsIHZlbmRvciwgZGV2aWNlKSk7CisJCQlXTF9FUlJPUigid2wlZDogd2xjX2JtYWNfYXR0YWNoOiBVbnN1cHBvcnRlZCB2ZW5kb3IvZGV2aWNlICgweCV4LzB4JXgpXG4iLAorCQkJCSB1bml0LCB2ZW5kb3IsIGRldmljZSk7CiAJCQllcnIgPSAxMjsKIAkJCWdvdG8gZmFpbDsKIAkJfQpAQCAtODA5LDcgKzgxNiw4IEBACiAJd2xjX2JtYWNfY29yZXJlc2V0KHdsY19odywgV0xDX1VTRV9DT1JFRkxBR1MpOwogCiAJaWYgKCF3bGNfYm1hY192YWxpZGF0ZV9jaGlwX2FjY2Vzcyh3bGNfaHcpKSB7Ci0JCVdMX0VSUk9SKCgid2wlZDogd2xjX2JtYWNfYXR0YWNoOiB2YWxpZGF0ZV9jaGlwX2FjY2VzcyBmYWlsZWRcbiIsIHVuaXQpKTsKKwkJV0xfRVJST1IoIndsJWQ6IHdsY19ibWFjX2F0dGFjaDogdmFsaWRhdGVfY2hpcF9hY2Nlc3MgZmFpbGVkXG4iLAorCQkJIHVuaXQpOwogCQllcnIgPSAxNDsKIAkJZ290byBmYWlsOwogCX0KQEAgLTgyMSw3ICs4MjksOCBAQAogCQlqID0gQk9BUkRSRVZfUFJPTU9URUQ7CiAJd2xjX2h3LT5ib2FyZHJldiA9ICh1MTYpIGo7CiAJaWYgKCF3bGNfdmFsaWRib2FyZHR5cGUod2xjX2h3KSkgewotCQlXTF9FUlJPUigoIndsJWQ6IHdsY19ibWFjX2F0dGFjaDogVW5zdXBwb3J0ZWQgQnJvYWRjb20gYm9hcmQgdHlwZSAoMHgleCkiICIgb3IgcmV2aXNpb24gbGV2ZWwgKDB4JXgpXG4iLCB1bml0LCB3bGNfaHctPnNpaC0+Ym9hcmR0eXBlLCB3bGNfaHctPmJvYXJkcmV2KSk7CisJCVdMX0VSUk9SKCJ3bCVkOiB3bGNfYm1hY19hdHRhY2g6IFVuc3VwcG9ydGVkIEJyb2FkY29tIGJvYXJkIHR5cGUgKDB4JXgpIiAiIG9yIHJldmlzaW9uIGxldmVsICgweCV4KVxuIiwKKwkJCSB1bml0LCB3bGNfaHctPnNpaC0+Ym9hcmR0eXBlLCB3bGNfaHctPmJvYXJkcmV2KTsKIAkJZXJyID0gMTU7CiAJCWdvdG8gZmFpbDsKIAl9CkBAIC04MzMsNyArODQyLDcgQEAKIAkgICAgfHwgKHdsY19ody0+Ym9hcmRmbGFncyAmIEJGTF9OT1BMTERPV04pKQogCQl3bGNfYm1hY19wbGxyZXEod2xjX2h3LCB0cnVlLCBXTENfUExMUkVRX1NIQVJFRCk7CiAKLQlpZiAoKEJVU1RZUEUod2xjX2h3LT5zaWgtPmJ1c3R5cGUpID09IFBDSV9CVVMpCisJaWYgKCh3bGNfaHctPnNpaC0+YnVzdHlwZSA9PSBQQ0lfQlVTKQogCSAgICAmJiAoc2lfcGNpX3dhcjE2MTY1KHdsY19ody0+c2loKSkpCiAJCXdsYy0+d2FyMTYxNjUgPSB0cnVlOwogCkBAIC04NDQsNyArODUzLDcgQEAKIAl9IGVsc2UKIAkJd2xjX2h3LT5fbmJhbmRzID0gMTsKIAotCWlmICgoQ0hJUElEKHdsY19ody0+c2loLT5jaGlwKSA9PSBCQ000MzIyNV9DSElQX0lEKSkKKwlpZiAoKHdsY19ody0+c2loLT5jaGlwID09IEJDTTQzMjI1X0NISVBfSUQpKQogCQl3bGNfaHctPl9uYmFuZHMgPSAxOwogCiAJLyogQk1BQ19OT1RFOiByZW1vdmUgaW5pdCBvZiBwdWIgdmFsdWVzIHdoZW4gd2xjX2F0dGFjaCgpIHVuY29uZGl0aW9uYWxseSBkb2VzIHRoZQpAQCAtODYzLDggKzg3Miw4IEBACiAJd2xjX2h3LT5waHlzaGltID0gd2xjX3BoeV9zaGltX2F0dGFjaCh3bGNfaHcsIHdsYy0+d2wsIHdsYyk7CiAKIAlpZiAod2xjX2h3LT5waHlzaGltID09IE5VTEwpIHsKLQkJV0xfRVJST1IoKCJ3bCVkOiB3bGNfYm1hY19hdHRhY2g6IHdsY19waHlfc2hpbV9hdHRhY2ggZmFpbGVkXG4iLAotCQkJICB1bml0KSk7CisJCVdMX0VSUk9SKCJ3bCVkOiB3bGNfYm1hY19hdHRhY2g6IHdsY19waHlfc2hpbV9hdHRhY2ggZmFpbGVkXG4iLAorCQkJIHVuaXQpOwogCQllcnIgPSAyNTsKIAkJZ290byBmYWlsOwogCX0KQEAgLTkzMSw3ICs5NDAsOCBAQAogCQl3bGNfaHctPmJhbmQtPnBpID0gd2xjX3BoeV9hdHRhY2god2xjX2h3LT5waHlfc2gsCiAJCQkodm9pZCAqKXJlZ3MsIHdsY19ody0+YmFuZC0+YmFuZHR5cGUsIHZhcnMpOwogCQlpZiAod2xjX2h3LT5iYW5kLT5waSA9PSBOVUxMKSB7Ci0JCQlXTF9FUlJPUigoIndsJWQ6IHdsY19ibWFjX2F0dGFjaDogd2xjX3BoeV9hdHRhY2ggZmFpbGVkXG4iLCB1bml0KSk7CisJCQlXTF9FUlJPUigid2wlZDogd2xjX2JtYWNfYXR0YWNoOiB3bGNfcGh5X2F0dGFjaCBmYWlsZWRcbiIsCisJCQkJIHVuaXQpOwogCQkJZXJyID0gMTc7CiAJCQlnb3RvIGZhaWw7CiAJCX0KQEAgLTk2MSw3ICs5NzEsOSBAQAogCQkJCWdvdG8gYmFkX3BoeTsKIAkJfSBlbHNlIHsKICBiYWRfcGh5OgotCQkJV0xfRVJST1IoKCJ3bCVkOiB3bGNfYm1hY19hdHRhY2g6IHVuc3VwcG9ydGVkIHBoeSB0eXBlL3JldiAoJWQvJWQpXG4iLCB1bml0LCB3bGNfaHctPmJhbmQtPnBoeXR5cGUsIHdsY19ody0+YmFuZC0+cGh5cmV2KSk7CisJCQlXTF9FUlJPUigid2wlZDogd2xjX2JtYWNfYXR0YWNoOiB1bnN1cHBvcnRlZCBwaHkgdHlwZS9yZXYgKCVkLyVkKVxuIiwKKwkJCQkgdW5pdCwKKwkJCQkgd2xjX2h3LT5iYW5kLT5waHl0eXBlLCB3bGNfaHctPmJhbmQtPnBoeXJldik7CiAJCQllcnIgPSAxODsKIAkJCWdvdG8gZmFpbDsKIAkJfQpAQCAtOTkzLDcgKzEwMDUsNyBAQAogCXdsY19jb3JlZGlzYWJsZSh3bGNfaHcpOwogCiAJLyogTWF0Y2ggZHJpdmVyICJkb3duIiBzdGF0ZSAqLwotCWlmIChCVVNUWVBFKHdsY19ody0+c2loLT5idXN0eXBlKSA9PSBQQ0lfQlVTKQorCWlmICh3bGNfaHctPnNpaC0+YnVzdHlwZSA9PSBQQ0lfQlVTKQogCQlzaV9wY2lfZG93bih3bGNfaHctPnNpaCk7CiAKIAkvKiByZWdpc3RlciBzYiBpbnRlcnJ1cHQgY2FsbGJhY2sgZnVuY3Rpb25zICovCkBAIC0xMDE2LDI3ICsxMDI4LDI3IEBACiAJLyogaW5pdCBldGhlcmFkZHIgc3RhdGUgdmFyaWFibGVzICovCiAJbWFjYWRkciA9IHdsY19nZXRfbWFjYWRkcih3bGNfaHcpOwogCWlmIChtYWNhZGRyID09IE5VTEwpIHsKLQkJV0xfRVJST1IoKCJ3bCVkOiB3bGNfYm1hY19hdHRhY2g6IG1hY2FkZHIgbm90IGZvdW5kXG4iLCB1bml0KSk7CisJCVdMX0VSUk9SKCJ3bCVkOiB3bGNfYm1hY19hdHRhY2g6IG1hY2FkZHIgbm90IGZvdW5kXG4iLCB1bml0KTsKIAkJZXJyID0gMjE7CiAJCWdvdG8gZmFpbDsKIAl9CiAJYmNtX2V0aGVyX2F0b2UobWFjYWRkciwgJndsY19ody0+ZXRoZXJhZGRyKTsKLQlpZiAoRVRIRVJfSVNCQ0FTVCgoY2hhciAqKSZ3bGNfaHctPmV0aGVyYWRkcikgfHwKLQkgICAgRVRIRVJfSVNOVUxMQUREUigoY2hhciAqKSZ3bGNfaHctPmV0aGVyYWRkcikpIHsKLQkJV0xfRVJST1IoKCJ3bCVkOiB3bGNfYm1hY19hdHRhY2g6IGJhZCBtYWNhZGRyICVzXG4iLCB1bml0LAotCQkJICBtYWNhZGRyKSk7CisJaWYgKGlzX2Jyb2FkY2FzdF9ldGhlcl9hZGRyKHdsY19ody0+ZXRoZXJhZGRyLm9jdGV0KSB8fAorCSAgICBpc196ZXJvX2V0aGVyX2FkZHIod2xjX2h3LT5ldGhlcmFkZHIub2N0ZXQpKSB7CisJCVdMX0VSUk9SKCJ3bCVkOiB3bGNfYm1hY19hdHRhY2g6IGJhZCBtYWNhZGRyICVzXG4iLAorCQkJIHVuaXQsIG1hY2FkZHIpOwogCQllcnIgPSAyMjsKIAkJZ290byBmYWlsOwogCX0KIAotCVdMX0VSUk9SKCgiJXM6OiBkZXZpY2VpZCAweCV4IG5iYW5kcyAlZCBib2FyZCAweCV4IG1hY2FkZHI6ICVzXG4iLAotCQkgIF9fZnVuY19fLCB3bGNfaHctPmRldmljZWlkLCB3bGNfaHctPl9uYmFuZHMsCi0JCSAgd2xjX2h3LT5zaWgtPmJvYXJkdHlwZSwgbWFjYWRkcikpOworCVdMX0VSUk9SKCIlczo6IGRldmljZWlkIDB4JXggbmJhbmRzICVkIGJvYXJkIDB4JXggbWFjYWRkcjogJXNcbiIsCisJCSBfX2Z1bmNfXywgd2xjX2h3LT5kZXZpY2VpZCwgd2xjX2h3LT5fbmJhbmRzLAorCQkgd2xjX2h3LT5zaWgtPmJvYXJkdHlwZSwgbWFjYWRkcik7CiAKIAlyZXR1cm4gZXJyOwogCiAgZmFpbDoKLQlXTF9FUlJPUigoIndsJWQ6IHdsY19ibWFjX2F0dGFjaDogZmFpbGVkIHdpdGggZXJyICVkXG4iLCB1bml0LCBlcnIpKTsKKwlXTF9FUlJPUigid2wlZDogd2xjX2JtYWNfYXR0YWNoOiBmYWlsZWQgd2l0aCBlcnIgJWRcbiIsIHVuaXQsIGVycik7CiAJcmV0dXJuIGVycjsKIH0KIApAQCAtMTA0NSw5ICsxMDU3LDkgQEAKICAqIG1heSBnZXQgb3ZlcnJpZGVzIGxhdGVyIGluIHRoaXMgZnVuY3Rpb24KICAqICBCTUFDX05PVEVTLCBtb3ZlIGxvdyBvdXQgYW5kIHJlc29sdmUgdGhlIGRhbmdsaW5nIG9uZXMKICAqLwotdm9pZCB3bGNfYm1hY19pbmZvX2luaXQod2xjX2h3X2luZm9fdCAqd2xjX2h3KQordm9pZCB3bGNfYm1hY19pbmZvX2luaXQoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcpCiB7Ci0Jd2xjX2luZm9fdCAqd2xjID0gd2xjX2h3LT53bGM7CisJc3RydWN0IHdsY19pbmZvICp3bGMgPSB3bGNfaHctPndsYzsKIAogCS8qIHNldCBkZWZhdWx0IHN3IG1hY2ludG1hc2sgdmFsdWUgKi8KIAl3bGMtPmRlZm1hY2ludG1hc2sgPSBERUZfTUFDSU5UTUFTSzsKQEAgLTEwNjcsMTEgKzEwNzksMTEgQEAKIC8qCiAgKiBsb3cgbGV2ZWwgZGV0YWNoCiAgKi8KLWludCB3bGNfYm1hY19kZXRhY2god2xjX2luZm9fdCAqd2xjKQoraW50IHdsY19ibWFjX2RldGFjaChzdHJ1Y3Qgd2xjX2luZm8gKndsYykKIHsKIAl1aW50IGk7CiAJd2xjX2h3YmFuZF90ICpiYW5kOwotCXdsY19od19pbmZvX3QgKndsY19odyA9IHdsYy0+aHc7CisJc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcgPSB3bGMtPmh3OwogCWludCBjYWxsYmFja3M7CiAKIAljYWxsYmFja3MgPSAwOwpAQCAtMTA4Miw3ICsxMDk0LDcgQEAKIAkJICovCiAJCXNpX2RlcmVnaXN0ZXJfaW50cl9jYWxsYmFjayh3bGNfaHctPnNpaCk7CiAKLQkJaWYgKEJVU1RZUEUod2xjX2h3LT5zaWgtPmJ1c3R5cGUpID09IFBDSV9CVVMpCisJCWlmICh3bGNfaHctPnNpaC0+YnVzdHlwZSA9PSBQQ0lfQlVTKQogCQkJc2lfcGNpX3NsZWVwKHdsY19ody0+c2loKTsKIAl9CiAKQEAgLTExMTgsOSArMTEzMCw5IEBACiAKIH0KIAotdm9pZCB3bGNfYm1hY19yZXNldCh3bGNfaHdfaW5mb190ICp3bGNfaHcpCit2b2lkIHdsY19ibWFjX3Jlc2V0KHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3KQogewotCVdMX1RSQUNFKCgid2wlZDogd2xjX2JtYWNfcmVzZXRcbiIsIHdsY19ody0+dW5pdCkpOworCVdMX1RSQUNFKCJ3bCVkOiB3bGNfYm1hY19yZXNldFxuIiwgd2xjX2h3LT51bml0KTsKIAogCVdMQ05USU5DUih3bGNfaHctPndsYy0+cHViLT5fY250LT5yZXNldCk7CiAKQEAgLTExMzUsMTMgKzExNDcsMTMgQEAKIH0KIAogdm9pZAotd2xjX2JtYWNfaW5pdCh3bGNfaHdfaW5mb190ICp3bGNfaHcsIGNoYW5zcGVjX3QgY2hhbnNwZWMsCit3bGNfYm1hY19pbml0KHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LCBjaGFuc3BlY190IGNoYW5zcGVjLAogCQkJICBib29sIG11dGUpIHsKIAl1MzIgbWFjaW50bWFzazsKIAlib29sIGZhc3RjbGs7Ci0Jd2xjX2luZm9fdCAqd2xjID0gd2xjX2h3LT53bGM7CisJc3RydWN0IHdsY19pbmZvICp3bGMgPSB3bGNfaHctPndsYzsKIAotCVdMX1RSQUNFKCgid2wlZDogd2xjX2JtYWNfaW5pdFxuIiwgd2xjX2h3LT51bml0KSk7CisJV0xfVFJBQ0UoIndsJWQ6IHdsY19ibWFjX2luaXRcbiIsIHdsY19ody0+dW5pdCk7CiAKIAkvKiByZXF1ZXN0IEZBU1QgY2xvY2sgaWYgbm90IG9uICovCiAJZmFzdGNsayA9IHdsY19ody0+Zm9yY2VmYXN0Y2xrOwpAQCAtMTE4NiwxMSArMTE5OCwxMSBAQAogCQl3bGNfY2xrY3RsX2Nsayh3bGNfaHcsIENMS19EWU5BTUlDKTsKIH0KIAotaW50IHdsY19ibWFjX3VwX3ByZXAod2xjX2h3X2luZm9fdCAqd2xjX2h3KQoraW50IHdsY19ibWFjX3VwX3ByZXAoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcpCiB7CiAJdWludCBjb3JlbWFzazsKIAotCVdMX1RSQUNFKCgid2wlZDogJXM6XG4iLCB3bGNfaHctPnVuaXQsIF9fZnVuY19fKSk7CisJV0xfVFJBQ0UoIndsJWQ6ICVzOlxuIiwgd2xjX2h3LT51bml0LCBfX2Z1bmNfXyk7CiAKIAlBU1NFUlQod2xjX2h3LT53bGMtPnB1Yi0+aHdfdXAgJiYgd2xjX2h3LT53bGMtPm1hY2ludG1hc2sgPT0gMCk7CiAKQEAgLTEyMDgsNyArMTIyMCw3IEBACiAJICovCiAJY29yZW1hc2sgPSAoMSA8PCB3bGNfaHctPndsYy0+Y29yZS0+Y29yZWlkeCk7CiAKLQlpZiAoQlVTVFlQRSh3bGNfaHctPnNpaC0+YnVzdHlwZSkgPT0gUENJX0JVUykKKwlpZiAod2xjX2h3LT5zaWgtPmJ1c3R5cGUgPT0gUENJX0JVUykKIAkJc2lfcGNpX3NldHVwKHdsY19ody0+c2loLCBjb3JlbWFzayk7CiAKIAlBU1NFUlQoc2lfY29yZWlkKHdsY19ody0+c2loKSA9PSBEMTFfQ09SRV9JRCk7CkBAIC0xMjE5LDEzICsxMjMxLDEzIEBACiAJICovCiAJaWYgKHdsY19ibWFjX3JhZGlvX3JlYWRfaHdkaXNhYmxlZCh3bGNfaHcpKSB7CiAJCS8qIHB1dCBTQiBQQ0kgaW4gZG93biBzdGF0ZSBhZ2FpbiAqLwotCQlpZiAoQlVTVFlQRSh3bGNfaHctPnNpaC0+YnVzdHlwZSkgPT0gUENJX0JVUykKKwkJaWYgKHdsY19ody0+c2loLT5idXN0eXBlID09IFBDSV9CVVMpCiAJCQlzaV9wY2lfZG93bih3bGNfaHctPnNpaCk7CiAJCXdsY19ibWFjX3h0YWwod2xjX2h3LCBPRkYpOwogCQlyZXR1cm4gQkNNRV9SQURJT09GRjsKIAl9CiAKLQlpZiAoQlVTVFlQRSh3bGNfaHctPnNpaC0+YnVzdHlwZSkgPT0gUENJX0JVUykKKwlpZiAod2xjX2h3LT5zaWgtPmJ1c3R5cGUgPT0gUENJX0JVUykKIAkJc2lfcGNpX3VwKHdsY19ody0+c2loKTsKIAogCS8qIHJlc2V0IHRoZSBkMTEgY29yZSAqLwpAQCAtMTIzNCw5ICsxMjQ2LDkgQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IHdsY19ibWFjX3VwX2ZpbmlzaCh3bGNfaHdfaW5mb190ICp3bGNfaHcpCitpbnQgd2xjX2JtYWNfdXBfZmluaXNoKHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3KQogewotCVdMX1RSQUNFKCgid2wlZDogJXM6XG4iLCB3bGNfaHctPnVuaXQsIF9fZnVuY19fKSk7CisJV0xfVFJBQ0UoIndsJWQ6ICVzOlxuIiwgd2xjX2h3LT51bml0LCBfX2Z1bmNfXyk7CiAKIAl3bGNfaHctPnVwID0gdHJ1ZTsKIAl3bGNfcGh5X2h3X3N0YXRlX3VwZCh3bGNfaHctPmJhbmQtPnBpLCB0cnVlKTsKQEAgLTEyNDgsMTIgKzEyNjAsMTIgQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IHdsY19ibWFjX2Rvd25fcHJlcCh3bGNfaHdfaW5mb190ICp3bGNfaHcpCitpbnQgd2xjX2JtYWNfZG93bl9wcmVwKHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3KQogewogCWJvb2wgZGV2X2dvbmU7CiAJdWludCBjYWxsYmFja3MgPSAwOwogCi0JV0xfVFJBQ0UoKCJ3bCVkOiAlczpcbiIsIHdsY19ody0+dW5pdCwgX19mdW5jX18pKTsKKwlXTF9UUkFDRSgid2wlZDogJXM6XG4iLCB3bGNfaHctPnVuaXQsIF9fZnVuY19fKTsKIAogCWlmICghd2xjX2h3LT51cCkKIAkJcmV0dXJuIGNhbGxiYWNrczsKQEAgLTEyNzYsMTIgKzEyODgsMTIgQEAKIAlyZXR1cm4gY2FsbGJhY2tzOwogfQogCi1pbnQgd2xjX2JtYWNfZG93bl9maW5pc2god2xjX2h3X2luZm9fdCAqd2xjX2h3KQoraW50IHdsY19ibWFjX2Rvd25fZmluaXNoKHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3KQogewogCXVpbnQgY2FsbGJhY2tzID0gMDsKIAlib29sIGRldl9nb25lOwogCi0JV0xfVFJBQ0UoKCJ3bCVkOiAlczpcbiIsIHdsY19ody0+dW5pdCwgX19mdW5jX18pKTsKKwlXTF9UUkFDRSgid2wlZDogJXM6XG4iLCB3bGNfaHctPnVuaXQsIF9fZnVuY19fKTsKIAogCWlmICghd2xjX2h3LT51cCkKIAkJcmV0dXJuIGNhbGxiYWNrczsKQEAgLTEzMTEsNyArMTMyMyw3IEBACiAKIAkJLyogdHVybiBvZmYgcHJpbWFyeSB4dGFsIGFuZCBwbGwgKi8KIAkJaWYgKCF3bGNfaHctPm5vcmVzZXQpIHsKLQkJCWlmIChCVVNUWVBFKHdsY19ody0+c2loLT5idXN0eXBlKSA9PSBQQ0lfQlVTKQorCQkJaWYgKHdsY19ody0+c2loLT5idXN0eXBlID09IFBDSV9CVVMpCiAJCQkJc2lfcGNpX2Rvd24od2xjX2h3LT5zaWgpOwogCQkJd2xjX2JtYWNfeHRhbCh3bGNfaHcsIE9GRik7CiAJCX0KQEAgLTEzMjAsNyArMTMzMiw3IEBACiAJcmV0dXJuIGNhbGxiYWNrczsKIH0KIAotdm9pZCB3bGNfYm1hY193YWl0X2Zvcl93YWtlKHdsY19od19pbmZvX3QgKndsY19odykKK3ZvaWQgd2xjX2JtYWNfd2FpdF9mb3Jfd2FrZShzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odykKIHsKIAlpZiAoRDExUkVWX0lTKHdsY19ody0+Y29yZXJldiwgNCkpCS8qIG5vIHNsb3djbG9jayAqLwogCQl1ZGVsYXkoNSk7CkBAIC0xMzM2LDI5ICsxMzQ4LDMwIEBACiAJQVNTRVJUKHdsY19ibWFjX3JlYWRfc2htKHdsY19odywgTV9VQ09ERV9EQkdTVCkgIT0gREJHU1RfQVNMRUVQKTsKIH0KIAotdm9pZCB3bGNfYm1hY19od19ldGhlcmFkZHIod2xjX2h3X2luZm9fdCAqd2xjX2h3LCBzdHJ1Y3QgZXRoZXJfYWRkciAqZWEpCit2b2lkIHdsY19ibWFjX2h3X2V0aGVyYWRkcihzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odywgc3RydWN0IGV0aGVyX2FkZHIgKmVhKQogewotCWJjb3B5KCZ3bGNfaHctPmV0aGVyYWRkciwgZWEsIEVUSEVSX0FERFJfTEVOKTsKKwliY29weSgmd2xjX2h3LT5ldGhlcmFkZHIsIGVhLCBFVEhfQUxFTik7CiB9CiAKLXZvaWQgd2xjX2JtYWNfc2V0X2h3X2V0aGVyYWRkcih3bGNfaHdfaW5mb190ICp3bGNfaHcsIHN0cnVjdCBldGhlcl9hZGRyICplYSkKK3ZvaWQgd2xjX2JtYWNfc2V0X2h3X2V0aGVyYWRkcihzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odywKKwkJCSAgICAgICBzdHJ1Y3QgZXRoZXJfYWRkciAqZWEpCiB7Ci0JYmNvcHkoZWEsICZ3bGNfaHctPmV0aGVyYWRkciwgRVRIRVJfQUREUl9MRU4pOworCWJjb3B5KGVhLCAmd2xjX2h3LT5ldGhlcmFkZHIsIEVUSF9BTEVOKTsKIH0KIAotaW50IHdsY19ibWFjX2JhbmR0eXBlKHdsY19od19pbmZvX3QgKndsY19odykKK2ludCB3bGNfYm1hY19iYW5kdHlwZShzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odykKIHsKIAlyZXR1cm4gd2xjX2h3LT5iYW5kLT5iYW5kdHlwZTsKIH0KIAotdm9pZCAqd2xjX2N1cl9waHkod2xjX2luZm9fdCAqd2xjKQordm9pZCAqd2xjX2N1cl9waHkoc3RydWN0IHdsY19pbmZvICp3bGMpCiB7Ci0Jd2xjX2h3X2luZm9fdCAqd2xjX2h3ID0gd2xjLT5odzsKKwlzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odyA9IHdsYy0+aHc7CiAJcmV0dXJuICh2b2lkICopd2xjX2h3LT5iYW5kLT5waTsKIH0KIAogLyogY29udHJvbCBjaGlwIGNsb2NrIHRvIHNhdmUgcG93ZXIsIGVuYWJsZSBkeW5hbWljIGNsb2NrIG9yIGZvcmNlIGZhc3QgY2xvY2sgKi8KLXN0YXRpYyB2b2lkIHdsY19jbGtjdGxfY2xrKHdsY19od19pbmZvX3QgKndsY19odywgdWludCBtb2RlKQorc3RhdGljIHZvaWQgd2xjX2Nsa2N0bF9jbGsoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcsIHVpbnQgbW9kZSkKIHsKIAlpZiAoUE1VQ1RMX0VOQUIod2xjX2h3LT5zaWgpKSB7CiAJCS8qIG5ldyBjaGlwcyB3aXRoIFBNVSwgQ0NTX0ZPUkNFSFQgd2lsbCBkaXN0cmlidXRlIHRoZSBIVCBjbG9jayBvbiBiYWNrcGxhbmUsCkBAIC0xNDU1LDExICsxNDY4LDExIEBACiAKIC8qIHNldCBpbml0aWFsIGhvc3QgZmxhZ3MgdmFsdWUgKi8KIHN0YXRpYyB2b2lkCi13bGNfbWhmZGVmKHdsY19pbmZvX3QgKndsYywgdTE2ICptaGZzLCB1MTYgbWhmMl9pbml0KQord2xjX21oZmRlZihzdHJ1Y3Qgd2xjX2luZm8gKndsYywgdTE2ICptaGZzLCB1MTYgbWhmMl9pbml0KQogewotCXdsY19od19pbmZvX3QgKndsY19odyA9IHdsYy0+aHc7CisJc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcgPSB3bGMtPmh3OwogCi0JYnplcm8obWhmcywgc2l6ZW9mKHUxNikgKiBNSEZNQVgpOworCW1lbXNldChtaGZzLCAwLCBNSEZNQVggKiBzaXplb2YodTE2KSk7CiAKIAltaGZzW01IRjJdIHw9IG1oZjJfaW5pdDsKIApAQCAtMTQ4NSw3ICsxNDk4LDcgQEAKICAqICAgICAgICAgICAgICAgICAgIFdMQ19CQU5EX0FMTCAgPC0tLSBBbGwgYmFuZHMKICAqLwogdm9pZAotd2xjX2JtYWNfbWhmKHdsY19od19pbmZvX3QgKndsY19odywgdTggaWR4LCB1MTYgbWFzaywgdTE2IHZhbCwKK3dsY19ibWFjX21oZihzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odywgdTggaWR4LCB1MTYgbWFzaywgdTE2IHZhbCwKIAkgICAgIGludCBiYW5kcykKIHsKIAl1MTYgc2F2ZTsKQEAgLTE1MzksNyArMTU1Miw3IEBACiAJfQogfQogCi11MTYgd2xjX2JtYWNfbWhmX2dldCh3bGNfaHdfaW5mb190ICp3bGNfaHcsIHU4IGlkeCwgaW50IGJhbmRzKQordTE2IHdsY19ibWFjX21oZl9nZXQoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcsIHU4IGlkeCwgaW50IGJhbmRzKQogewogCXdsY19od2JhbmRfdCAqYmFuZDsKIAlBU1NFUlQoaWR4IDwgTUhGTUFYKTsKQEAgLTE1NjUsNyArMTU3OCw3IEBACiAJcmV0dXJuIGJhbmQtPm1oZnNbaWR4XTsKIH0KIAotc3RhdGljIHZvaWQgd2xjX3dyaXRlX21oZih3bGNfaHdfaW5mb190ICp3bGNfaHcsIHUxNiAqbWhmcykKK3N0YXRpYyB2b2lkIHdsY193cml0ZV9taGYoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcsIHUxNiAqbWhmcykKIHsKIAl1OCBpZHg7CiAJdTE2IGFkZHJbXSA9IHsKQEAgLTE1ODMsNyArMTU5Niw3IEBACiAvKiBzZXQgdGhlIG1hY2NvbnRyb2wgcmVnaXN0ZXIgdG8gZGVzaXJlZCByZXNldCBzdGF0ZSBhbmQKICAqIGluaXRpYWxpemUgdGhlIHN3IGNhY2hlIG9mIHRoZSByZWdpc3RlcgogICovCi1zdGF0aWMgdm9pZCB3bGNfbWN0cmxfcmVzZXQod2xjX2h3X2luZm9fdCAqd2xjX2h3KQorc3RhdGljIHZvaWQgd2xjX21jdHJsX3Jlc2V0KHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3KQogewogCS8qIElIUiBhY2Nlc3NlcyBhcmUgYWx3YXlzIGVuYWJsZWQsIFBTTSBkaXNhYmxlZCwgSFBTIG9mZiBhbmQgV0FLRSBvbiAqLwogCXdsY19ody0+bWFjY29udHJvbCA9IDA7CkBAIC0xNTk0LDcgKzE2MDcsNyBAQAogfQogCiAvKiBzZXQgb3IgY2xlYXIgbWFjY29udHJvbCBiaXRzICovCi12b2lkIHdsY19ibWFjX21jdHJsKHdsY19od19pbmZvX3QgKndsY19odywgdTMyIG1hc2ssIHUzMiB2YWwpCit2b2lkIHdsY19ibWFjX21jdHJsKHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LCB1MzIgbWFzaywgdTMyIHZhbCkKIHsKIAl1MzIgbWFjY29udHJvbDsKIAl1MzIgbmV3X21hY2NvbnRyb2w7CkBAIC0xNjE2LDcgKzE2MjksNyBAQAogfQogCiAvKiB3cml0ZSB0aGUgc29mdHdhcmUgc3RhdGUgb2YgbWFjY29udHJvbCBhbmQgb3ZlcnJpZGVzIHRvIHRoZSBtYWNjb250cm9sIHJlZ2lzdGVyICovCi1zdGF0aWMgdm9pZCB3bGNfbWN0cmxfd3JpdGUod2xjX2h3X2luZm9fdCAqd2xjX2h3KQorc3RhdGljIHZvaWQgd2xjX21jdHJsX3dyaXRlKHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3KQogewogCXUzMiBtYWNjb250cm9sID0gd2xjX2h3LT5tYWNjb250cm9sOwogCkBAIC0xNjMzLDcgKzE2NDYsNyBAQAogCVdfUkVHKHdsY19ody0+b3NoLCAmd2xjX2h3LT5yZWdzLT5tYWNjb250cm9sLCBtYWNjb250cm9sKTsKIH0KIAotdm9pZCB3bGNfdWNvZGVfd2FrZV9vdmVycmlkZV9zZXQod2xjX2h3X2luZm9fdCAqd2xjX2h3LCB1MzIgb3ZlcnJpZGVfYml0KQordm9pZCB3bGNfdWNvZGVfd2FrZV9vdmVycmlkZV9zZXQoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcsIHUzMiBvdmVycmlkZV9iaXQpCiB7CiAJQVNTRVJUKCh3bGNfaHctPndha2Vfb3ZlcnJpZGUgJiBvdmVycmlkZV9iaXQpID09IDApOwogCkBAIC0xNjUwLDcgKzE2NjMsNyBAQAogCXJldHVybjsKIH0KIAotdm9pZCB3bGNfdWNvZGVfd2FrZV9vdmVycmlkZV9jbGVhcih3bGNfaHdfaW5mb190ICp3bGNfaHcsIHUzMiBvdmVycmlkZV9iaXQpCit2b2lkIHdsY191Y29kZV93YWtlX292ZXJyaWRlX2NsZWFyKHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LCB1MzIgb3ZlcnJpZGVfYml0KQogewogCUFTU0VSVCh3bGNfaHctPndha2Vfb3ZlcnJpZGUgJiBvdmVycmlkZV9iaXQpOwogCkBAIC0xNjcxLDcgKzE2ODQsNyBAQAogICogU1RBICAgICAgICAgICAgICAgMCAgICAgICAgICAgICAgMSA8LS0tIFRoaXMgd2lsbCBlbnN1cmUgbm8gYmVhY29ucwogICogSUJTUyAgICAgICAgICAgICAgMCAgICAgICAgICAgICAgMAogICovCi1zdGF0aWMgdm9pZCB3bGNfdWNvZGVfbXV0ZV9vdmVycmlkZV9zZXQod2xjX2h3X2luZm9fdCAqd2xjX2h3KQorc3RhdGljIHZvaWQgd2xjX3Vjb2RlX211dGVfb3ZlcnJpZGVfc2V0KHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3KQogewogCXdsY19ody0+bXV0ZV9vdmVycmlkZSA9IDE7CiAKQEAgLTE2ODcsNyArMTcwMCw3IEBACiB9CiAKIC8qIENsZWFyIHRoZSBvdmVycmlkZSBvbiBBUCBhbmQgSU5GUkEgYml0cyAqLwotc3RhdGljIHZvaWQgd2xjX3Vjb2RlX211dGVfb3ZlcnJpZGVfY2xlYXIod2xjX2h3X2luZm9fdCAqd2xjX2h3KQorc3RhdGljIHZvaWQgd2xjX3Vjb2RlX211dGVfb3ZlcnJpZGVfY2xlYXIoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcpCiB7CiAJaWYgKHdsY19ody0+bXV0ZV9vdmVycmlkZSA9PSAwKQogCQlyZXR1cm47CkBAIC0xNzA3LDE2ICsxNzIwLDE2IEBACiAgKiBXcml0ZSBhIE1BQyBhZGRyZXNzIHRvIHRoZSByY210YSBzdHJ1Y3R1cmUKICAqLwogdm9pZAotd2xjX2JtYWNfc2V0X3JjbXRhKHdsY19od19pbmZvX3QgKndsY19odywgaW50IGlkeCwKK3dsY19ibWFjX3NldF9yY210YShzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odywgaW50IGlkeCwKIAkJICAgY29uc3Qgc3RydWN0IGV0aGVyX2FkZHIgKmFkZHIpCiB7CiAJZDExcmVnc190ICpyZWdzID0gd2xjX2h3LT5yZWdzOwogCXZvbGF0aWxlIHUxNiAqb2JqZGF0YTE2ID0gKHZvbGF0aWxlIHUxNiAqKSZyZWdzLT5vYmpkYXRhOwogCXUzMiBtYWNfaG07CiAJdTE2IG1hY19sOwotCW9zbF90ICpvc2g7CisJc3RydWN0IG9zbF9pbmZvICpvc2g7CiAKLQlXTF9UUkFDRSgoIndsJWQ6ICVzXG4iLCB3bGNfaHctPnVuaXQsIF9fZnVuY19fKSk7CisJV0xfVFJBQ0UoIndsJWQ6ICVzXG4iLCB3bGNfaHctPnVuaXQsIF9fZnVuY19fKTsKIAogCUFTU0VSVCh3bGNfaHctPmNvcmVyZXYgPiA0KTsKIApAQCAtMTc0MCwxNiArMTc1MywxNiBAQAogICogV3JpdGUgYSBNQUMgYWRkcmVzcyB0byB0aGUgZ2l2ZW4gbWF0Y2ggcmVnIG9mZnNldCBpbiB0aGUgUlhFIG1hdGNoIGVuZ2luZS4KICAqLwogdm9pZAotd2xjX2JtYWNfc2V0X2FkZHJtYXRjaCh3bGNfaHdfaW5mb190ICp3bGNfaHcsIGludCBtYXRjaF9yZWdfb2Zmc2V0LAord2xjX2JtYWNfc2V0X2FkZHJtYXRjaChzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odywgaW50IG1hdGNoX3JlZ19vZmZzZXQsCiAJCSAgICAgICBjb25zdCBzdHJ1Y3QgZXRoZXJfYWRkciAqYWRkcikKIHsKIAlkMTFyZWdzX3QgKnJlZ3M7CiAJdTE2IG1hY19sOwogCXUxNiBtYWNfbTsKIAl1MTYgbWFjX2g7Ci0Jb3NsX3QgKm9zaDsKKwlzdHJ1Y3Qgb3NsX2luZm8gKm9zaDsKIAotCVdMX1RSQUNFKCgid2wlZDogd2xjX2JtYWNfc2V0X2FkZHJtYXRjaFxuIiwgd2xjX2h3LT51bml0KSk7CisJV0xfVFJBQ0UoIndsJWQ6IHdsY19ibWFjX3NldF9hZGRybWF0Y2hcbiIsIHdsY19ody0+dW5pdCk7CiAKIAlBU1NFUlQoKG1hdGNoX3JlZ19vZmZzZXQgPCBSQ01fU0laRSkgfHwgKHdsY19ody0+Y29yZXJldiA9PSA0KSk7CiAKQEAgLTE3NjksNyArMTc4Miw3IEBACiB9CiAKIHZvaWQKLXdsY19ibWFjX3dyaXRlX3RlbXBsYXRlX3JhbSh3bGNfaHdfaW5mb190ICp3bGNfaHcsIGludCBvZmZzZXQsIGludCBsZW4sCit3bGNfYm1hY193cml0ZV90ZW1wbGF0ZV9yYW0oc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcsIGludCBvZmZzZXQsIGludCBsZW4sCiAJCQkgICAgdm9pZCAqYnVmKQogewogCWQxMXJlZ3NfdCAqcmVnczsKQEAgLTE3NzgsOSArMTc5MSw5IEBACiAjaWZkZWYgSUxfQklHRU5ESUFOCiAJdm9sYXRpbGUgdTE2ICpkcHRyID0gTlVMTDsKICNlbmRpZgkJCQkvKiBJTF9CSUdFTkRJQU4gKi8KLQlvc2xfdCAqb3NoOworCXN0cnVjdCBvc2xfaW5mbyAqb3NoOwogCi0JV0xfVFJBQ0UoKCJ3bCVkOiB3bGNfYm1hY193cml0ZV90ZW1wbGF0ZV9yYW1cbiIsIHdsY19ody0+dW5pdCkpOworCVdMX1RSQUNFKCJ3bCVkOiB3bGNfYm1hY193cml0ZV90ZW1wbGF0ZV9yYW1cbiIsIHdsY19ody0+dW5pdCk7CiAKIAlyZWdzID0gd2xjX2h3LT5yZWdzOwogCW9zaCA9IHdsY19ody0+b3NoOwpAQCAtMTgxMiw5ICsxODI1LDkgQEAKIAl9CiB9CiAKLXZvaWQgd2xjX2JtYWNfc2V0X2N3bWluKHdsY19od19pbmZvX3QgKndsY19odywgdTE2IG5ld21pbikKK3ZvaWQgd2xjX2JtYWNfc2V0X2N3bWluKHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LCB1MTYgbmV3bWluKQogewotCW9zbF90ICpvc2g7CisJc3RydWN0IG9zbF9pbmZvICpvc2g7CiAKIAlvc2ggPSB3bGNfaHctPm9zaDsKIAl3bGNfaHctPmJhbmQtPkNXbWluID0gbmV3bWluOwpAQCAtMTgyNCw5ICsxODM3LDkgQEAKIAlXX1JFRyhvc2gsICZ3bGNfaHctPnJlZ3MtPm9iamRhdGEsIG5ld21pbik7CiB9CiAKLXZvaWQgd2xjX2JtYWNfc2V0X2N3bWF4KHdsY19od19pbmZvX3QgKndsY19odywgdTE2IG5ld21heCkKK3ZvaWQgd2xjX2JtYWNfc2V0X2N3bWF4KHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LCB1MTYgbmV3bWF4KQogewotCW9zbF90ICpvc2g7CisJc3RydWN0IG9zbF9pbmZvICpvc2g7CiAKIAlvc2ggPSB3bGNfaHctPm9zaDsKIAl3bGNfaHctPmJhbmQtPkNXbWF4ID0gbmV3bWF4OwpAQCAtMTgzNiw3ICsxODQ5LDcgQEAKIAlXX1JFRyhvc2gsICZ3bGNfaHctPnJlZ3MtPm9iamRhdGEsIG5ld21heCk7CiB9CiAKLXZvaWQgd2xjX2JtYWNfYndfc2V0KHdsY19od19pbmZvX3QgKndsY19odywgdTE2IGJ3KQordm9pZCB3bGNfYm1hY19id19zZXQoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcsIHUxNiBidykKIHsKIAlib29sIGZhc3RjbGs7CiAJdTMyIHRtcDsKQEAgLTE4NjEsNyArMTg3NCw3IEBACiB9CiAKIHN0YXRpYyB2b2lkCi13bGNfd3JpdGVfaHdfYmNudGVtcGxhdGUwKHdsY19od19pbmZvX3QgKndsY19odywgdm9pZCAqYmNuLCBpbnQgbGVuKQord2xjX3dyaXRlX2h3X2JjbnRlbXBsYXRlMChzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odywgdm9pZCAqYmNuLCBpbnQgbGVuKQogewogCWQxMXJlZ3NfdCAqcmVncyA9IHdsY19ody0+cmVnczsKIApAQCAtMTg3NSw3ICsxODg4LDcgQEAKIH0KIAogc3RhdGljIHZvaWQKLXdsY193cml0ZV9od19iY250ZW1wbGF0ZTEod2xjX2h3X2luZm9fdCAqd2xjX2h3LCB2b2lkICpiY24sIGludCBsZW4pCit3bGNfd3JpdGVfaHdfYmNudGVtcGxhdGUxKHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LCB2b2lkICpiY24sIGludCBsZW4pCiB7CiAJZDExcmVnc190ICpyZWdzID0gd2xjX2h3LT5yZWdzOwogCkBAIC0xODkwLDcgKzE5MDMsNyBAQAogCiAvKiBtYWMgaXMgYXNzdW1lZCB0byBiZSBzdXNwZW5kZWQgYXQgdGhpcyBwb2ludCAqLwogdm9pZAotd2xjX2JtYWNfd3JpdGVfaHdfYmNudGVtcGxhdGVzKHdsY19od19pbmZvX3QgKndsY19odywgdm9pZCAqYmNuLCBpbnQgbGVuLAord2xjX2JtYWNfd3JpdGVfaHdfYmNudGVtcGxhdGVzKHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LCB2b2lkICpiY24sIGludCBsZW4sCiAJCQkgICAgICAgYm9vbCBib3RoKQogewogCWQxMXJlZ3NfdCAqcmVncyA9IHdsY19ody0+cmVnczsKQEAgLTE5MTEsMTAgKzE5MjQsMTAgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIFdMQkFORElOSVRGTih3bGNfYm1hY191cGRfc3ludGhwdSkgKHdsY19od19pbmZvX3QgKndsY19odykKK3N0YXRpYyB2b2lkIFdMQkFORElOSVRGTih3bGNfYm1hY191cGRfc3ludGhwdSkgKHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3KQogewogCXUxNiB2OwotCXdsY19pbmZvX3QgKndsYyA9IHdsY19ody0+d2xjOworCXN0cnVjdCB3bGNfaW5mbyAqd2xjID0gd2xjX2h3LT53bGM7CiAJLyogdXBkYXRlIFNZTlRIUFVfRExZICovCiAKIAlpZiAoV0xDSVNMQ05QSFkod2xjLT5iYW5kKSkgewpAQCAtMTkzMCwxMiArMTk0MywxMiBAQAogCiAvKiBiYW5kLXNwZWNpZmljIGluaXQgKi8KIHN0YXRpYyB2b2lkCi1XTEJBTkRJTklURk4od2xjX2JtYWNfYnNpbml0KSAod2xjX2luZm9fdCAqd2xjLCBjaGFuc3BlY190IGNoYW5zcGVjKQorV0xCQU5ESU5JVEZOKHdsY19ibWFjX2JzaW5pdCkgKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCBjaGFuc3BlY190IGNoYW5zcGVjKQogewotCXdsY19od19pbmZvX3QgKndsY19odyA9IHdsYy0+aHc7CisJc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcgPSB3bGMtPmh3OwogCi0JV0xfVFJBQ0UoKCJ3bCVkOiB3bGNfYm1hY19ic2luaXQ6IGJhbmR1bml0ICVkXG4iLCB3bGNfaHctPnVuaXQsCi0JCSAgd2xjX2h3LT5iYW5kLT5iYW5kdW5pdCkpOworCVdMX1RSQUNFKCJ3bCVkOiB3bGNfYm1hY19ic2luaXQ6IGJhbmR1bml0ICVkXG4iLAorCQkgd2xjX2h3LT51bml0LCB3bGNfaHctPmJhbmQtPmJhbmR1bml0KTsKIAogCS8qIHNhbml0eSBjaGVjayAqLwogCWlmIChQSFlfVFlQRShSX1JFRyh3bGNfaHctPm9zaCwgJndsY19ody0+cmVncy0+cGh5dmVyc2lvbikpICE9CkBAIC0xOTY5LDkgKzE5ODIsOSBAQAogCXdsY19ibWFjX3VwZF9zeW50aHB1KHdsY19odyk7CiB9CiAKLXZvaWQgd2xjX2JtYWNfY29yZV9waHlfY2xrKHdsY19od19pbmZvX3QgKndsY19odywgYm9vbCBjbGspCit2b2lkIHdsY19ibWFjX2NvcmVfcGh5X2NsayhzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odywgYm9vbCBjbGspCiB7Ci0JV0xfVFJBQ0UoKCJ3bCVkOiB3bGNfYm1hY19jb3JlX3BoeV9jbGs6IGNsayAlZFxuIiwgd2xjX2h3LT51bml0LCBjbGspKTsKKwlXTF9UUkFDRSgid2wlZDogd2xjX2JtYWNfY29yZV9waHlfY2xrOiBjbGsgJWRcbiIsIHdsY19ody0+dW5pdCwgY2xrKTsKIAogCXdsY19ody0+cGh5Y2xrID0gY2xrOwogCkBAIC0xOTk0LDkgKzIwMDcsOSBAQAogfQogCiAvKiBQZXJmb3JtIGEgc29mdCByZXNldCBvZiB0aGUgUEhZIFBMTCAqLwotdm9pZCB3bGNfYm1hY19jb3JlX3BoeXBsbF9yZXNldCh3bGNfaHdfaW5mb190ICp3bGNfaHcpCit2b2lkIHdsY19ibWFjX2NvcmVfcGh5cGxsX3Jlc2V0KHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3KQogewotCVdMX1RSQUNFKCgid2wlZDogd2xjX2JtYWNfY29yZV9waHlwbGxfcmVzZXRcbiIsIHdsY19ody0+dW5pdCkpOworCVdMX1RSQUNFKCJ3bCVkOiB3bGNfYm1hY19jb3JlX3BoeXBsbF9yZXNldFxuIiwgd2xjX2h3LT51bml0KTsKIAogCXNpX2NvcmVyZWcod2xjX2h3LT5zaWgsIFNJX0NDX0lEWCwKIAkJICAgb2Zmc2V0b2YoY2hpcGNyZWdzX3QsIGNoaXBjb250cm9sX2FkZHIpLCB+MCwgMCk7CkBAIC0yMDE1LDcgKzIwMjgsNyBAQAogLyogbGlnaHQgd2F5IHRvIHR1cm4gb24gcGh5IGNsb2NrIHdpdGhvdXQgcmVzZXQgZm9yIE5QSFkgb25seQogICogIHJlZmVyIHRvIHdsY19ibWFjX2NvcmVfcGh5X2NsayBmb3IgZnVsbCB2ZXJzaW9uCiAgKi8KLXZvaWQgd2xjX2JtYWNfcGh5Y2xrX2ZnYyh3bGNfaHdfaW5mb190ICp3bGNfaHcsIGJvb2wgY2xrKQordm9pZCB3bGNfYm1hY19waHljbGtfZmdjKHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LCBib29sIGNsaykKIHsKIAkvKiBzdXBwb3J0KG5lY2Vzc2FyeSBmb3IgTlBIWSBhbmQgSFlQSFkpIG9ubHkgKi8KIAlpZiAoIVdMQ0lTTlBIWSh3bGNfaHctPmJhbmQpKQpAQCAtMjAyOCw3ICsyMDQxLDcgQEAKIAogfQogCi12b2lkIHdsY19ibWFjX21hY3BoeWNsa19zZXQod2xjX2h3X2luZm9fdCAqd2xjX2h3LCBib29sIGNsaykKK3ZvaWQgd2xjX2JtYWNfbWFjcGh5Y2xrX3NldChzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odywgYm9vbCBjbGspCiB7CiAJaWYgKE9OID09IGNsaykKIAkJc2lfY29yZV9jZmxhZ3Mod2xjX2h3LT5zaWgsIFNJQ0ZfTVBDTEtFLCBTSUNGX01QQ0xLRSk7CkBAIC0yMDM2LDEzICsyMDQ5LDEzIEBACiAJCXNpX2NvcmVfY2ZsYWdzKHdsY19ody0+c2loLCBTSUNGX01QQ0xLRSwgMCk7CiB9CiAKLXZvaWQgd2xjX2JtYWNfcGh5X3Jlc2V0KHdsY19od19pbmZvX3QgKndsY19odykKK3ZvaWQgd2xjX2JtYWNfcGh5X3Jlc2V0KHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3KQogewogCXdsY19waHlfdCAqcGloID0gd2xjX2h3LT5iYW5kLT5waTsKIAl1MzIgcGh5X2J3X2Nsa2JpdHM7CiAJYm9vbCBwaHlfaW5fcmVzZXQgPSBmYWxzZTsKIAotCVdMX1RSQUNFKCgid2wlZDogd2xjX2JtYWNfcGh5X3Jlc2V0XG4iLCB3bGNfaHctPnVuaXQpKTsKKwlXTF9UUkFDRSgid2wlZDogd2xjX2JtYWNfcGh5X3Jlc2V0XG4iLCB3bGNfaHctPnVuaXQpOwogCiAJaWYgKHBpaCA9PSBOVUxMKQogCQlyZXR1cm47CkBAIC0yMDgwLDkgKzIwOTMsOSBAQAogCiAvKiBzd2l0Y2ggdG8gYW5kIGluaXRpYWxpemUgbmV3IGJhbmQgKi8KIHN0YXRpYyB2b2lkCi1XTEJBTkRJTklURk4od2xjX2JtYWNfc2V0YmFuZCkgKHdsY19od19pbmZvX3QgKndsY19odywgdWludCBiYW5kdW5pdCwKK1dMQkFORElOSVRGTih3bGNfYm1hY19zZXRiYW5kKSAoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcsIHVpbnQgYmFuZHVuaXQsCiAJCQkJY2hhbnNwZWNfdCBjaGFuc3BlYykgewotCXdsY19pbmZvX3QgKndsYyA9IHdsY19ody0+d2xjOworCXN0cnVjdCB3bGNfaW5mbyAqd2xjID0gd2xjX2h3LT53bGM7CiAJdTMyIG1hY2ludG1hc2s7CiAKIAlBU1NFUlQoTkJBTkRTX0hXKHdsY19odykgPiAxKTsKQEAgLTIxMjIsOSArMjEzNSw5IEBACiB9CiAKIC8qIGxvdy1sZXZlbCBiYW5kIHN3aXRjaCB1dGlsaXR5IHJvdXRpbmUgKi8KLXZvaWQgV0xCQU5ESU5JVEZOKHdsY19zZXR4YmFuZCkgKHdsY19od19pbmZvX3QgKndsY19odywgdWludCBiYW5kdW5pdCkKK3ZvaWQgV0xCQU5ESU5JVEZOKHdsY19zZXR4YmFuZCkgKHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LCB1aW50IGJhbmR1bml0KQogewotCVdMX1RSQUNFKCgid2wlZDogd2xjX3NldHhiYW5kOiBiYW5kdW5pdCAlZFxuIiwgd2xjX2h3LT51bml0LCBiYW5kdW5pdCkpOworCVdMX1RSQUNFKCJ3bCVkOiB3bGNfc2V0eGJhbmQ6IGJhbmR1bml0ICVkXG4iLCB3bGNfaHctPnVuaXQsIGJhbmR1bml0KTsKIAogCXdsY19ody0+YmFuZCA9IHdsY19ody0+YmFuZHN0YXRlW2JhbmR1bml0XTsKIApAQCAtMjEzOCwxOSArMjE1MSwxOSBAQAogCX0KIH0KIAotc3RhdGljIGJvb2wgd2xjX2lzZ29vZGNoaXAod2xjX2h3X2luZm9fdCAqd2xjX2h3KQorc3RhdGljIGJvb2wgd2xjX2lzZ29vZGNoaXAoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcpCiB7CiAKIAkvKiByZWplY3QgdW5zdXBwb3J0ZWQgY29yZXJldiAqLwogCWlmICghVkFMSURfQ09SRVJFVih3bGNfaHctPmNvcmVyZXYpKSB7Ci0JCVdMX0VSUk9SKCgidW5zdXBwb3J0ZWQgY29yZSByZXYgJWRcbiIsIHdsY19ody0+Y29yZXJldikpOworCQlXTF9FUlJPUigidW5zdXBwb3J0ZWQgY29yZSByZXYgJWRcbiIsIHdsY19ody0+Y29yZXJldik7CiAJCXJldHVybiBmYWxzZTsKIAl9CiAKIAlyZXR1cm4gdHJ1ZTsKIH0KIAotc3RhdGljIGJvb2wgd2xjX3ZhbGlkYm9hcmR0eXBlKHdsY19od19pbmZvX3QgKndsY19odykKK3N0YXRpYyBib29sIHdsY192YWxpZGJvYXJkdHlwZShzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odykKIHsKIAlib29sIGdvb2Rib2FyZCA9IHRydWU7CiAJdWludCBib2FyZHJldiA9IHdsY19ody0+Ym9hcmRyZXY7CkBAIC0yMTc0LDcgKzIxODcsNyBAQAogCXJldHVybiBnb29kYm9hcmQ7CiB9CiAKLXN0YXRpYyBjaGFyICp3bGNfZ2V0X21hY2FkZHIod2xjX2h3X2luZm9fdCAqd2xjX2h3KQorc3RhdGljIGNoYXIgKndsY19nZXRfbWFjYWRkcihzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odykKIHsKIAljb25zdCBjaGFyICp2YXJuYW1lID0gIm1hY2FkZHIiOwogCWNoYXIgKm1hY2FkZHI7CkBAIC0yMTkxLDcgKzIyMDQsOCBAQAogCiAJbWFjYWRkciA9IGdldHZhcih3bGNfaHctPnZhcnMsIHZhcm5hbWUpOwogCWlmIChtYWNhZGRyID09IE5VTEwpIHsKLQkJV0xfRVJST1IoKCJ3bCVkOiB3bGNfZ2V0X21hY2FkZHI6IG1hY2FkZHIgZ2V0dmFyKCVzKSBub3QgZm91bmRcbiIsIHdsY19ody0+dW5pdCwgdmFybmFtZSkpOworCQlXTF9FUlJPUigid2wlZDogd2xjX2dldF9tYWNhZGRyOiBtYWNhZGRyIGdldHZhciglcykgbm90IGZvdW5kXG4iLAorCQkJIHdsY19ody0+dW5pdCwgdmFybmFtZSk7CiAJfQogCiAJcmV0dXJuIG1hY2FkZHI7CkBAIC0yMjAzLDcgKzIyMTcsNyBAQAogICogdGhpcyBmdW5jdGlvbiBjb3VsZCBiZSBjYWxsZWQgd2hlbiBkcml2ZXIgaXMgZG93biBhbmQgdy9vIGNsb2NrCiAgKiBpdCBvcGVyYXRlcyBvbiBkaWZmZXJlbnQgcmVnaXN0ZXJzIGRlcGVuZGluZyBvbiBjb3JlcmV2IGFuZCBib2FyZGZsYWcuCiAgKi8KLWJvb2wgd2xjX2JtYWNfcmFkaW9fcmVhZF9od2Rpc2FibGVkKHdsY19od19pbmZvX3QgKndsY19odykKK2Jvb2wgd2xjX2JtYWNfcmFkaW9fcmVhZF9od2Rpc2FibGVkKHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3KQogewogCWJvb2wgdiwgY2xrLCB4dGFsOwogCXUzMiByZXNldGJpdHMgPSAwLCBmbGFncyA9IDA7CkBAIC0yMjI2LDkgKzIyNDAsOSBAQAogCQkJZmxhZ3MgfD0gU0lDRl9QQ0xLRTsKIAogCQkvKiBBSSBjaGlwIGRvZXNuJ3QgcmVzdG9yZSBiYXIwd2luMiBvbiBoaWJlcm5hdGlvbi9yZXN1bWUsIG5lZWQgc3cgZml4dXAgKi8KLQkJaWYgKChDSElQSUQod2xjX2h3LT5zaWgtPmNoaXApID09IEJDTTQzMjI0X0NISVBfSUQpIHx8Ci0JCSAgICAoQ0hJUElEKHdsY19ody0+c2loLT5jaGlwKSA9PSBCQ000MzIyNV9DSElQX0lEKSB8fAotCQkgICAgKENISVBJRCh3bGNfaHctPnNpaC0+Y2hpcCkgPT0gQkNNNDM0MjFfQ0hJUF9JRCkpCisJCWlmICgod2xjX2h3LT5zaWgtPmNoaXAgPT0gQkNNNDMyMjRfQ0hJUF9JRCkgfHwKKwkJICAgICh3bGNfaHctPnNpaC0+Y2hpcCA9PSBCQ000MzIyNV9DSElQX0lEKSB8fAorCQkgICAgKHdsY19ody0+c2loLT5jaGlwID09IEJDTTQzNDIxX0NISVBfSUQpKQogCQkJd2xjX2h3LT5yZWdzID0KIAkJCSAgICAoZDExcmVnc190ICopIHNpX3NldGNvcmUod2xjX2h3LT5zaWgsIEQxMV9DT1JFX0lELAogCQkJCQkJICAgICAwKTsKQEAgLTIyNDksMTIgKzIyNjMsMTIgQEAKIH0KIAogLyogSW5pdGlhbGl6ZSBqdXN0IHRoZSBoYXJkd2FyZSB3aGVuIGNvbWluZyBvdXQgb2YgUE9SIG9yIFMzL1M1IHN5c3RlbSBzdGF0ZXMgKi8KLXZvaWQgd2xjX2JtYWNfaHdfdXAod2xjX2h3X2luZm9fdCAqd2xjX2h3KQordm9pZCB3bGNfYm1hY19od191cChzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odykKIHsKIAlpZiAod2xjX2h3LT53bGMtPnB1Yi0+aHdfdXApCiAJCXJldHVybjsKIAotCVdMX1RSQUNFKCgid2wlZDogJXM6XG4iLCB3bGNfaHctPnVuaXQsIF9fZnVuY19fKSk7CisJV0xfVFJBQ0UoIndsJWQ6ICVzOlxuIiwgd2xjX2h3LT51bml0LCBfX2Z1bmNfXyk7CiAKIAkvKgogCSAqIEVuYWJsZSBwbGwgYW5kIHh0YWwsIGluaXRpYWxpemUgdGhlIHBvd2VyIGNvbnRyb2wgcmVnaXN0ZXJzLApAQCAtMjI2NCwxMyArMjI3OCwxMyBAQAogCXNpX2Nsa2N0bF9pbml0KHdsY19ody0+c2loKTsKIAl3bGNfY2xrY3RsX2Nsayh3bGNfaHcsIENMS19GQVNUKTsKIAotCWlmIChCVVNUWVBFKHdsY19ody0+c2loLT5idXN0eXBlKSA9PSBQQ0lfQlVTKSB7CisJaWYgKHdsY19ody0+c2loLT5idXN0eXBlID09IFBDSV9CVVMpIHsKIAkJc2lfcGNpX2ZpeGNmZyh3bGNfaHctPnNpaCk7CiAKIAkJLyogQUkgY2hpcCBkb2Vzbid0IHJlc3RvcmUgYmFyMHdpbjIgb24gaGliZXJuYXRpb24vcmVzdW1lLCBuZWVkIHN3IGZpeHVwICovCi0JCWlmICgoQ0hJUElEKHdsY19ody0+c2loLT5jaGlwKSA9PSBCQ000MzIyNF9DSElQX0lEKSB8fAotCQkgICAgKENISVBJRCh3bGNfaHctPnNpaC0+Y2hpcCkgPT0gQkNNNDMyMjVfQ0hJUF9JRCkgfHwKLQkJICAgIChDSElQSUQod2xjX2h3LT5zaWgtPmNoaXApID09IEJDTTQzNDIxX0NISVBfSUQpKQorCQlpZiAoKHdsY19ody0+c2loLT5jaGlwID09IEJDTTQzMjI0X0NISVBfSUQpIHx8CisJCSAgICAod2xjX2h3LT5zaWgtPmNoaXAgPT0gQkNNNDMyMjVfQ0hJUF9JRCkgfHwKKwkJICAgICh3bGNfaHctPnNpaC0+Y2hpcCA9PSBCQ000MzQyMV9DSElQX0lEKSkKIAkJCXdsY19ody0+cmVncyA9CiAJCQkgICAgKGQxMXJlZ3NfdCAqKSBzaV9zZXRjb3JlKHdsY19ody0+c2loLCBEMTFfQ09SRV9JRCwKIAkJCQkJCSAgICAgMCk7CkBAIC0yMjgzLDcgKzIyOTcsNyBAQAogCXdsY19ody0+d2xjLT5wdWItPmh3X3VwID0gdHJ1ZTsKIAogCWlmICgod2xjX2h3LT5ib2FyZGZsYWdzICYgQkZMX0ZFTSkKLQkgICAgJiYgKENISVBJRCh3bGNfaHctPnNpaC0+Y2hpcCkgPT0gQkNNNDMxM19DSElQX0lEKSkgeworCSAgICAmJiAod2xjX2h3LT5zaWgtPmNoaXAgPT0gQkNNNDMxM19DSElQX0lEKSkgewogCQlpZiAoIQogCQkgICAgKHdsY19ody0+Ym9hcmRyZXYgPj0gMHgxMjUwCiAJCSAgICAgJiYgKHdsY19ody0+Ym9hcmRmbGFncyAmIEJGTF9GRU1fQlQpKSkKQEAgLTIyOTEsMTAgKzIzMDUsMTAgQEAKIAl9CiB9CiAKLXN0YXRpYyBib29sIHdsY19kbWFfcnhyZXNldCh3bGNfaHdfaW5mb190ICp3bGNfaHcsIHVpbnQgZmlmbykKK3N0YXRpYyBib29sIHdsY19kbWFfcnhyZXNldChzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odywgdWludCBmaWZvKQogewotCWhuZGRtYV90ICpkaSA9IHdsY19ody0+ZGlbZmlmb107Ci0Jb3NsX3QgKm9zaDsKKwlzdHJ1Y3QgaG5kZG1hX3B1YiAqZGkgPSB3bGNfaHctPmRpW2ZpZm9dOworCXN0cnVjdCBvc2xfaW5mbyAqb3NoOwogCiAJaWYgKEQxMVJFVl9MVCh3bGNfaHctPmNvcmVyZXYsIDEyKSkgewogCQlib29sIHJ4aWRsZSA9IHRydWU7CkBAIC0yMzA5LDcgKzIzMjMsOCBAQAogCQkJIDUwMDAwKTsKIAogCQlpZiAoIXJ4aWRsZSAmJiAocmN2X2ZybV9jbnQgIT0gMCkpCi0JCQlXTF9FUlJPUigoIndsJWQ6ICVzOiByeGRtYVslZF0gbm90IGlkbGUgJiYgcmN2X2ZybV9jbnQoJWQpIG5vdCB6ZXJvXG4iLCB3bGNfaHctPnVuaXQsIF9fZnVuY19fLCBmaWZvLCByY3ZfZnJtX2NudCkpOworCQkJV0xfRVJST1IoIndsJWQ6ICVzOiByeGRtYVslZF0gbm90IGlkbGUgJiYgcmN2X2ZybV9jbnQoJWQpIG5vdCB6ZXJvXG4iLAorCQkJCSB3bGNfaHctPnVuaXQsIF9fZnVuY19fLCBmaWZvLCByY3ZfZnJtX2NudCk7CiAJCW1kZWxheSgyKTsKIAl9CiAKQEAgLTIzMjQsNyArMjMzOSw3IEBACiAgKiAgIGNsZWFyIHNvZnR3YXJlIG1hY2ludHN0YXR1cyBmb3IgZnJlc2ggbmV3IHN0YXJ0CiAgKiBvbmUgdGVzdGluZyBoYWNrIHdsY19ody0+bm9yZXNldCB3aWxsIGJ5cGFzcyB0aGUgZDExL3BoeSByZXNldAogICovCi12b2lkIHdsY19ibWFjX2NvcmVyZXNldCh3bGNfaHdfaW5mb190ICp3bGNfaHcsIHUzMiBmbGFncykKK3ZvaWQgd2xjX2JtYWNfY29yZXJlc2V0KHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LCB1MzIgZmxhZ3MpCiB7CiAJZDExcmVnc190ICpyZWdzOwogCXVpbnQgaTsKQEAgLTIzMzQsNyArMjM0OSw3IEBACiAJaWYgKGZsYWdzID09IFdMQ19VU0VfQ09SRUZMQUdTKQogCQlmbGFncyA9ICh3bGNfaHctPmJhbmQtPnBpID8gd2xjX2h3LT5iYW5kLT5jb3JlX2ZsYWdzIDogMCk7CiAKLQlXTF9UUkFDRSgoIndsJWQ6ICVzXG4iLCB3bGNfaHctPnVuaXQsIF9fZnVuY19fKSk7CisJV0xfVFJBQ0UoIndsJWQ6ICVzXG4iLCB3bGNfaHctPnVuaXQsIF9fZnVuY19fKTsKIAogCXJlZ3MgPSB3bGNfaHctPnJlZ3M7CiAKQEAgLTIzNDcsMTcgKzIzNjIsMjAgQEAKIAlpZiAoc2lfaXNjb3JldXAod2xjX2h3LT5zaWgpKSB7CiAJCWZvciAoaSA9IDA7IGkgPCBORklGTzsgaSsrKQogCQkJaWYgKCh3bGNfaHctPmRpW2ldKSAmJiAoIWRtYV90eHJlc2V0KHdsY19ody0+ZGlbaV0pKSkgewotCQkJCVdMX0VSUk9SKCgid2wlZDogJXM6IGRtYV90eHJlc2V0WyVkXTogY2Fubm90IHN0b3AgZG1hXG4iLCB3bGNfaHctPnVuaXQsIF9fZnVuY19fLCBpKSk7CisJCQkJV0xfRVJST1IoIndsJWQ6ICVzOiBkbWFfdHhyZXNldFslZF06IGNhbm5vdCBzdG9wIGRtYVxuIiwKKwkJCQkJIHdsY19ody0+dW5pdCwgX19mdW5jX18sIGkpOwogCQkJfQogCiAJCWlmICgod2xjX2h3LT5kaVtSWF9GSUZPXSkKIAkJICAgICYmICghd2xjX2RtYV9yeHJlc2V0KHdsY19odywgUlhfRklGTykpKSB7Ci0JCQlXTF9FUlJPUigoIndsJWQ6ICVzOiBkbWFfcnhyZXNldFslZF06IGNhbm5vdCBzdG9wIGRtYVxuIiwgd2xjX2h3LT51bml0LCBfX2Z1bmNfXywgUlhfRklGTykpOworCQkJV0xfRVJST1IoIndsJWQ6ICVzOiBkbWFfcnhyZXNldFslZF06IGNhbm5vdCBzdG9wIGRtYVxuIiwKKwkJCQkgd2xjX2h3LT51bml0LCBfX2Z1bmNfXywgUlhfRklGTyk7CiAJCX0KIAkJaWYgKEQxMVJFVl9JUyh3bGNfaHctPmNvcmVyZXYsIDQpCiAJCSAgICAmJiB3bGNfaHctPmRpW1JYX1RYU1RBVFVTX0ZJRk9dCiAJCSAgICAmJiAoIXdsY19kbWFfcnhyZXNldCh3bGNfaHcsIFJYX1RYU1RBVFVTX0ZJRk8pKSkgewotCQkJV0xfRVJST1IoKCJ3bCVkOiAlczogZG1hX3J4cmVzZXRbJWRdOiBjYW5ub3Qgc3RvcCBkbWFcbiIsIHdsY19ody0+dW5pdCwgX19mdW5jX18sIFJYX1RYU1RBVFVTX0ZJRk8pKTsKKwkJCVdMX0VSUk9SKCJ3bCVkOiAlczogZG1hX3J4cmVzZXRbJWRdOiBjYW5ub3Qgc3RvcCBkbWFcbiIsCisJCQkJIHdsY19ody0+dW5pdCwgX19mdW5jX18sIFJYX1RYU1RBVFVTX0ZJRk8pOwogCQl9CiAJfQogCS8qIGlmIG5vcmVzZXQsIGp1c3Qgc3RvcCB0aGUgcHNtIGFuZCByZXR1cm4gKi8KQEAgLTI0MTMsMTQgKzI0MzEsMTQgQEAKICAqIHR4ZmlmbyBzaXplcyBuZWVkcyB0byBiZSBtb2RpZmllZChpbmNyZWFzZWQpIHNpbmNlIHRoZSBuZXdlciBjb3JlcwogICogaGF2ZSBtb3JlIG1lbW9yeS4KICAqLwotc3RhdGljIHZvaWQgd2xjX2NvcmVyZXZfZmlmb2ZpeHVwKHdsY19od19pbmZvX3QgKndsY19odykKK3N0YXRpYyB2b2lkIHdsY19jb3JlcmV2X2ZpZm9maXh1cChzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odykKIHsKIAlkMTFyZWdzX3QgKnJlZ3MgPSB3bGNfaHctPnJlZ3M7CiAJdTE2IGZpZm9fbnU7CiAJdTE2IHR4Zmlmb19zdGFydGJsayA9IFRYRklGT19TVEFSVF9CTEssIHR4Zmlmb19lbmRibGs7CiAJdTE2IHR4Zmlmb19kZWYsIHR4Zmlmb19kZWYxOwogCXUxNiB0eGZpZm9fY21kOwotCW9zbF90ICpvc2g7CisJc3RydWN0IG9zbF9pbmZvICpvc2g7CiAKIAlpZiAoRDExUkVWX0xUKHdsY19ody0+Y29yZXJldiwgOSkpCiAJCWdvdG8gZXhpdDsKQEAgLTI0NzMsMjIgKzI0OTEsMjIgQEAKICAqICAgY29uZmlnIG90aGVyIGNvcmUgcmVnaXN0ZXJzCiAgKiAgIGluaXQgZG1hCiAgKi8KLXN0YXRpYyB2b2lkIHdsY19jb3JlaW5pdCh3bGNfaW5mb190ICp3bGMpCitzdGF0aWMgdm9pZCB3bGNfY29yZWluaXQoc3RydWN0IHdsY19pbmZvICp3bGMpCiB7Ci0Jd2xjX2h3X2luZm9fdCAqd2xjX2h3ID0gd2xjLT5odzsKKwlzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odyA9IHdsYy0+aHc7CiAJZDExcmVnc190ICpyZWdzOwogCXUzMiBzZmxhZ3M7CiAJdWludCBiY25pbnRfdXM7CiAJdWludCBpID0gMDsKIAlib29sIGZpZm9zel9maXh1cCA9IGZhbHNlOwotCW9zbF90ICpvc2g7CisJc3RydWN0IG9zbF9pbmZvICpvc2g7CiAJaW50IGVyciA9IDA7CiAJdTE2IGJ1ZltORklGT107CiAKIAlyZWdzID0gd2xjX2h3LT5yZWdzOwogCW9zaCA9IHdsY19ody0+b3NoOwogCi0JV0xfVFJBQ0UoKCJ3bCVkOiB3bGNfY29yZWluaXRcbiIsIHdsY19ody0+dW5pdCkpOworCVdMX1RSQUNFKCJ3bCVkOiB3bGNfY29yZWluaXRcbiIsIHdsY19ody0+dW5pdCk7CiAKIAkvKiByZXNldCBQU00gKi8KIAl3bGNfYm1hY19tY3RybCh3bGNfaHcsIH4wLCAoTUNUTF9JSFJfRU4gfCBNQ1RMX1BTTV9KTVBfMCB8IE1DVExfV0FLRSkpOwpAQCAtMjUxMSw4ICsyNTI5LDggQEAKIAlTUElOV0FJVCgoKFJfUkVHKG9zaCwgJnJlZ3MtPm1hY2ludHN0YXR1cykgJiBNSV9NQUNTU1BOREQpID09IDApLAogCQkgMTAwMCAqIDEwMDApOwogCWlmICgoUl9SRUcob3NoLCAmcmVncy0+bWFjaW50c3RhdHVzKSAmIE1JX01BQ1NTUE5ERCkgPT0gMCkKLQkJV0xfRVJST1IoKCJ3bCVkOiB3bGNfY29yZWluaXQ6IHVjb2RlIGRpZCBub3Qgc2VsZi1zdXNwZW5kIVxuIiwKLQkJCSAgd2xjX2h3LT51bml0KSk7CisJCVdMX0VSUk9SKCJ3bCVkOiB3bGNfY29yZWluaXQ6IHVjb2RlIGRpZCBub3Qgc2VsZi1zdXNwZW5kIVxuIiwKKwkJCSB3bGNfaHctPnVuaXQpOwogCiAJd2xjX2dwaW9faW5pdCh3bGMpOwogCkBAIC0yNTIyLDE4ICsyNTQwLDE4IEBACiAJCWlmIChXTENJU05QSFkod2xjX2h3LT5iYW5kKSkKIAkJCXdsY193cml0ZV9pbml0cyh3bGNfaHcsIGQxMW4waW5pdHZhbHMxNik7CiAJCWVsc2UKLQkJCVdMX0VSUk9SKCgiJXM6IHdsJWQ6IHVuc3VwcG9ydGVkIHBoeSBpbiBjb3JlcmV2ICVkXG4iLAotCQkJCSAgX19mdW5jX18sIHdsY19ody0+dW5pdCwgd2xjX2h3LT5jb3JlcmV2KSk7CisJCQlXTF9FUlJPUigiJXM6IHdsJWQ6IHVuc3VwcG9ydGVkIHBoeSBpbiBjb3JlcmV2ICVkXG4iLAorCQkJCSBfX2Z1bmNfXywgd2xjX2h3LT51bml0LCB3bGNfaHctPmNvcmVyZXYpOwogCX0gZWxzZSBpZiAoRDExUkVWX0lTKHdsY19ody0+Y29yZXJldiwgMjQpKSB7CiAJCWlmIChXTENJU0xDTlBIWSh3bGNfaHctPmJhbmQpKSB7CiAJCQl3bGNfd3JpdGVfaW5pdHMod2xjX2h3LCBkMTFsY24waW5pdHZhbHMyNCk7CiAJCX0gZWxzZSB7Ci0JCQlXTF9FUlJPUigoIiVzOiB3bCVkOiB1bnN1cHBvcnRlZCBwaHkgaW4gY29yZXJldiAlZFxuIiwKLQkJCQkgIF9fZnVuY19fLCB3bGNfaHctPnVuaXQsIHdsY19ody0+Y29yZXJldikpOworCQkJV0xfRVJST1IoIiVzOiB3bCVkOiB1bnN1cHBvcnRlZCBwaHkgaW4gY29yZXJldiAlZFxuIiwKKwkJCQkgX19mdW5jX18sIHdsY19ody0+dW5pdCwgd2xjX2h3LT5jb3JlcmV2KTsKIAkJfQogCX0gZWxzZSB7Ci0JCVdMX0VSUk9SKCgiJXM6IHdsJWQ6IHVuc3VwcG9ydGVkIGNvcmVyZXYgJWRcbiIsCi0JCQkgIF9fZnVuY19fLCB3bGNfaHctPnVuaXQsIHdsY19ody0+Y29yZXJldikpOworCQlXTF9FUlJPUigiJXM6IHdsJWQ6IHVuc3VwcG9ydGVkIGNvcmVyZXYgJWRcbiIsCisJCQkgX19mdW5jX18sIHdsY19ody0+dW5pdCwgd2xjX2h3LT5jb3JlcmV2KTsKIAl9CiAKIAkvKiBGb3Igb2xkIHVjb2RlLCB0eGZpZm8gc2l6ZXMgbmVlZHMgdG8gYmUgbW9kaWZpZWQoaW5jcmVhc2VkKSBmb3IgQ29yZXJldiA+PSA5ICovCkBAIC0yNTc1LDcgKzI1OTMsOCBAQAogCQllcnIgPSAtMTsKIAl9CiAJaWYgKGVyciAhPSAwKSB7Ci0JCVdMX0VSUk9SKCgid2xjX2NvcmVpbml0OiB0eGZpZm8gbWlzbWF0Y2g6IHVjb2RlIHNpemUgJWQgZHJpdmVyIHNpemUgJWQgaW5kZXggJWRcbiIsIGJ1ZltpXSwgd2xjX2h3LT54bXRmaWZvX3N6W2ldLCBpKSk7CisJCVdMX0VSUk9SKCJ3bGNfY29yZWluaXQ6IHR4ZmlmbyBtaXNtYXRjaDogdWNvZGUgc2l6ZSAlZCBkcml2ZXIgc2l6ZSAlZCBpbmRleCAlZFxuIiwKKwkJCSBidWZbaV0sIHdsY19ody0+eG10Zmlmb19zeltpXSwgaSk7CiAJCS8qIERPIE5PVCBBU1NFUlQgY29yZXJldiA8IDQgZXZlbiB0aGVyZSBpcyBhIG1pc21hdGNoCiAJCSAqIHNobWVtLCBzaW5jZSBkcml2ZXIgZG9uJ3Qgb3ZlcndyaXRlIHRob3NlIGNoaXAgYW5kCiAJCSAqIHVjb2RlIGluaXRpYWxpemUgZGF0YSB3aWxsIGJlIHVzZWQuCkBAIC0yNjg0LDE1ICsyNzAzLDE1IEBACiAgKiAgLSA1NTkyNDEgPSAweDg4ODg5ID0+IHRzZl9jbGtfZnJhY19oID0gMHg4LCB0c2ZfY2xrX2ZyYWNfbCA9IDB4ODg4OQogICovCiAKLXZvaWQgd2xjX2JtYWNfc3dpdGNoX21hY2ZyZXEod2xjX2h3X2luZm9fdCAqd2xjX2h3LCB1OCBzcHVybW9kZSkKK3ZvaWQgd2xjX2JtYWNfc3dpdGNoX21hY2ZyZXEoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcsIHU4IHNwdXJtb2RlKQogewogCWQxMXJlZ3NfdCAqcmVnczsKLQlvc2xfdCAqb3NoOworCXN0cnVjdCBvc2xfaW5mbyAqb3NoOwogCXJlZ3MgPSB3bGNfaHctPnJlZ3M7CiAJb3NoID0gd2xjX2h3LT5vc2g7CiAKLQlpZiAoKENISVBJRCh3bGNfaHctPnNpaC0+Y2hpcCkgPT0gQkNNNDMyMjRfQ0hJUF9JRCkgfHwKLQkgICAgKENISVBJRCh3bGNfaHctPnNpaC0+Y2hpcCkgPT0gQkNNNDMyMjVfQ0hJUF9JRCkpIHsKKwlpZiAoKHdsY19ody0+c2loLT5jaGlwID09IEJDTTQzMjI0X0NISVBfSUQpIHx8CisJICAgICh3bGNfaHctPnNpaC0+Y2hpcCA9PSBCQ000MzIyNV9DSElQX0lEKSkgewogCQlpZiAoc3B1cm1vZGUgPT0gV0xfU1BVUkFWT0lEX09OMikgewkvKiAxMjZNaHogKi8KIAkJCVdfUkVHKG9zaCwgJnJlZ3MtPnRzZl9jbGtfZnJhY19sLCAweDIwODIpOwogCQkJV19SRUcob3NoLCAmcmVncy0+dHNmX2Nsa19mcmFjX2gsIDB4OCk7CkBAIC0yNzE1LDEyICsyNzM0LDEyIEBACiB9CiAKIC8qIEluaXRpYWxpemUgR1BJT3MgdGhhdCBhcmUgY29udHJvbGxlZCBieSBEMTEgY29yZSAqLwotc3RhdGljIHZvaWQgd2xjX2dwaW9faW5pdCh3bGNfaW5mb190ICp3bGMpCitzdGF0aWMgdm9pZCB3bGNfZ3Bpb19pbml0KHN0cnVjdCB3bGNfaW5mbyAqd2xjKQogewotCXdsY19od19pbmZvX3QgKndsY19odyA9IHdsYy0+aHc7CisJc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcgPSB3bGMtPmh3OwogCWQxMXJlZ3NfdCAqcmVnczsKIAl1MzIgZ2MsIGdtOwotCW9zbF90ICpvc2g7CisJc3RydWN0IG9zbF9pbmZvICpvc2g7CiAKIAlyZWdzID0gd2xjX2h3LT5yZWdzOwogCW9zaCA9IHdsY19ody0+b3NoOwpAQCAtMjc4MCw5ICsyNzk5LDkgQEAKIAlzaV9ncGlvY29udHJvbCh3bGNfaHctPnNpaCwgZ20sIGdjLCBHUElPX0RSVl9QUklPUklUWSk7CiB9CiAKLXN0YXRpYyB2b2lkIHdsY191Y29kZV9kb3dubG9hZCh3bGNfaHdfaW5mb190ICp3bGNfaHcpCitzdGF0aWMgdm9pZCB3bGNfdWNvZGVfZG93bmxvYWQoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcpCiB7Ci0Jd2xjX2luZm9fdCAqd2xjOworCXN0cnVjdCB3bGNfaW5mbyAqd2xjOwogCXdsYyA9IHdsY19ody0+d2xjOwogCiAJaWYgKHdsY19ody0+dWNvZGVfbG9hZGVkKQpAQCAtMjc5NCwzMCArMjgxMywzMCBAQAogCQkJCQliY200M3h4XzE2X21pbW9zeik7CiAJCQl3bGNfaHctPnVjb2RlX2xvYWRlZCA9IHRydWU7CiAJCX0gZWxzZQotCQkJV0xfRVJST1IoKCIlczogd2wlZDogdW5zdXBwb3J0ZWQgcGh5IGluIGNvcmVyZXYgJWRcbiIsCi0JCQkJICBfX2Z1bmNfXywgd2xjX2h3LT51bml0LCB3bGNfaHctPmNvcmVyZXYpKTsKKwkJCVdMX0VSUk9SKCIlczogd2wlZDogdW5zdXBwb3J0ZWQgcGh5IGluIGNvcmVyZXYgJWRcbiIsCisJCQkJIF9fZnVuY19fLCB3bGNfaHctPnVuaXQsIHdsY19ody0+Y29yZXJldik7CiAJfSBlbHNlIGlmIChEMTFSRVZfSVMod2xjX2h3LT5jb3JlcmV2LCAyNCkpIHsKIAkJaWYgKFdMQ0lTTENOUEhZKHdsY19ody0+YmFuZCkpIHsKIAkJCXdsY191Y29kZV93cml0ZSh3bGNfaHcsIGJjbTQzeHhfMjRfbGNuLAogCQkJCQliY200M3h4XzI0X2xjbnN6KTsKIAkJCXdsY19ody0+dWNvZGVfbG9hZGVkID0gdHJ1ZTsKIAkJfSBlbHNlIHsKLQkJCVdMX0VSUk9SKCgiJXM6IHdsJWQ6IHVuc3VwcG9ydGVkIHBoeSBpbiBjb3JlcmV2ICVkXG4iLAotCQkJCSAgX19mdW5jX18sIHdsY19ody0+dW5pdCwgd2xjX2h3LT5jb3JlcmV2KSk7CisJCQlXTF9FUlJPUigiJXM6IHdsJWQ6IHVuc3VwcG9ydGVkIHBoeSBpbiBjb3JlcmV2ICVkXG4iLAorCQkJCSBfX2Z1bmNfXywgd2xjX2h3LT51bml0LCB3bGNfaHctPmNvcmVyZXYpOwogCQl9CiAJfQogfQogCi1zdGF0aWMgdm9pZCB3bGNfdWNvZGVfd3JpdGUod2xjX2h3X2luZm9fdCAqd2xjX2h3LCBjb25zdCB1MzIgdWNvZGVbXSwKK3N0YXRpYyB2b2lkIHdsY191Y29kZV93cml0ZShzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odywgY29uc3QgdTMyIHVjb2RlW10sCiAJCQkgICAgICBjb25zdCB1aW50IG5ieXRlcykgewotCW9zbF90ICpvc2g7CisJc3RydWN0IG9zbF9pbmZvICpvc2g7CiAJZDExcmVnc190ICpyZWdzID0gd2xjX2h3LT5yZWdzOwogCXVpbnQgaTsKIAl1aW50IGNvdW50OwogCiAJb3NoID0gd2xjX2h3LT5vc2g7CiAKLQlXTF9UUkFDRSgoIndsJWQ6IHdsY191Y29kZV93cml0ZVxuIiwgd2xjX2h3LT51bml0KSk7CisJV0xfVFJBQ0UoIndsJWQ6IHdsY191Y29kZV93cml0ZVxuIiwgd2xjX2h3LT51bml0KTsKIAogCUFTU0VSVChJU19BTElHTkVEKG5ieXRlcywgc2l6ZW9mKHUzMikpKTsKIApAQCAtMjgyOSwxMyArMjg0OCwxMyBAQAogCQlXX1JFRyhvc2gsICZyZWdzLT5vYmpkYXRhLCB1Y29kZVtpXSk7CiB9CiAKLXN0YXRpYyB2b2lkIHdsY193cml0ZV9pbml0cyh3bGNfaHdfaW5mb190ICp3bGNfaHcsIGNvbnN0IGQxMWluaXRfdCAqaW5pdHMpCitzdGF0aWMgdm9pZCB3bGNfd3JpdGVfaW5pdHMoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcsIGNvbnN0IGQxMWluaXRfdCAqaW5pdHMpCiB7CiAJaW50IGk7Ci0Jb3NsX3QgKm9zaDsKKwlzdHJ1Y3Qgb3NsX2luZm8gKm9zaDsKIAl2b2xhdGlsZSB1OCAqYmFzZTsKIAotCVdMX1RSQUNFKCgid2wlZDogd2xjX3dyaXRlX2luaXRzXG4iLCB3bGNfaHctPnVuaXQpKTsKKwlXTF9UUkFDRSgid2wlZDogd2xjX3dyaXRlX2luaXRzXG4iLCB3bGNfaHctPnVuaXQpOwogCiAJb3NoID0gd2xjX2h3LT5vc2g7CiAJYmFzZSA9ICh2b2xhdGlsZSB1OCAqKXdsY19ody0+cmVnczsKQEAgLTI4NTIsNyArMjg3MSw3IEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCB3bGNfdWNvZGVfdHhhbnRfc2V0KHdsY19od19pbmZvX3QgKndsY19odykKK3N0YXRpYyB2b2lkIHdsY191Y29kZV90eGFudF9zZXQoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcpCiB7CiAJdTE2IHBoeWN0bDsKIAl1MTYgcGh5dHhhbnQgPSB3bGNfaHctPmJtYWNfcGh5dHhhbnQ7CkBAIC0yODY5LDcgKzI4ODgsNyBAQAogCXdsY19ibWFjX3dyaXRlX3NobSh3bGNfaHcsIE1fUlNQX1BDVExXRCwgcGh5Y3RsKTsKIH0KIAotdm9pZCB3bGNfYm1hY190eGFudF9zZXQod2xjX2h3X2luZm9fdCAqd2xjX2h3LCB1MTYgcGh5dHhhbnQpCit2b2lkIHdsY19ibWFjX3R4YW50X3NldChzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odywgdTE2IHBoeXR4YW50KQogewogCS8qIHVwZGF0ZSBzdyBzdGF0ZSAqLwogCXdsY19ody0+Ym1hY19waHl0eGFudCA9IHBoeXR4YW50OwpAQCAtMjg4MSwxMiArMjkwMCwxMiBAQAogCiB9CiAKLXUxNiB3bGNfYm1hY19nZXRfdHhhbnQod2xjX2h3X2luZm9fdCAqd2xjX2h3KQordTE2IHdsY19ibWFjX2dldF90eGFudChzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odykKIHsKIAlyZXR1cm4gKHUxNikgd2xjX2h3LT53bGMtPnN0Zi0+dHhhbnQ7CiB9CiAKLXZvaWQgd2xjX2JtYWNfYW50c2VsX3R5cGVfc2V0KHdsY19od19pbmZvX3QgKndsY19odywgdTggYW50c2VsX3R5cGUpCit2b2lkIHdsY19ibWFjX2FudHNlbF90eXBlX3NldChzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odywgdTggYW50c2VsX3R5cGUpCiB7CiAJd2xjX2h3LT5hbnRzZWxfdHlwZSA9IGFudHNlbF90eXBlOwogCkBAIC0yODk0LDcgKzI5MTMsNyBAQAogCXdsY19waHlfYW50c2VsX3R5cGVfc2V0KHdsY19ody0+YmFuZC0+cGksIGFudHNlbF90eXBlKTsKIH0KIAotdm9pZCB3bGNfYm1hY19maWZvZXJyb3JzKHdsY19od19pbmZvX3QgKndsY19odykKK3ZvaWQgd2xjX2JtYWNfZmlmb2Vycm9ycyhzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odykKIHsKIAlib29sIGZhdGFsID0gZmFsc2U7CiAJdWludCB1bml0OwpAQCAtMjkxMSw0NCArMjkzMCw0NSBAQAogCQlpZiAoIWludHN0YXR1cykKIAkJCWNvbnRpbnVlOwogCi0JCVdMX1RSQUNFKCgid2wlZDogd2xjX2JtYWNfZmlmb2Vycm9yczogaW50c3RhdHVzJWQgMHgleFxuIiwgdW5pdCwKLQkJCSAgaWR4LCBpbnRzdGF0dXMpKTsKKwkJV0xfVFJBQ0UoIndsJWQ6IHdsY19ibWFjX2ZpZm9lcnJvcnM6IGludHN0YXR1cyVkIDB4JXhcbiIsCisJCQkgdW5pdCwgaWR4LCBpbnRzdGF0dXMpOwogCiAJCWlmIChpbnRzdGF0dXMgJiBJX1JPKSB7Ci0JCQlXTF9FUlJPUigoIndsJWQ6IGZpZm8gJWQ6IHJlY2VpdmUgZmlmbyBvdmVyZmxvd1xuIiwKLQkJCQkgIHVuaXQsIGlkeCkpOworCQkJV0xfRVJST1IoIndsJWQ6IGZpZm8gJWQ6IHJlY2VpdmUgZmlmbyBvdmVyZmxvd1xuIiwKKwkJCQkgdW5pdCwgaWR4KTsKIAkJCVdMQ05USU5DUih3bGNfaHctPndsYy0+cHViLT5fY250LT5yeG9mbG8pOwogCQkJZmF0YWwgPSB0cnVlOwogCQl9CiAKIAkJaWYgKGludHN0YXR1cyAmIElfUEMpIHsKLQkJCVdMX0VSUk9SKCgid2wlZDogZmlmbyAlZDogZGVzY3JpcHRvciBlcnJvclxuIiwgdW5pdCwKLQkJCQkgIGlkeCkpOworCQkJV0xfRVJST1IoIndsJWQ6IGZpZm8gJWQ6IGRlc2NyaXB0b3IgZXJyb3JcbiIsCisJCQkJIHVuaXQsIGlkeCk7CiAJCQlXTENOVElOQ1Iod2xjX2h3LT53bGMtPnB1Yi0+X2NudC0+ZG1hZGUpOwogCQkJZmF0YWwgPSB0cnVlOwogCQl9CiAKIAkJaWYgKGludHN0YXR1cyAmIElfUEQpIHsKLQkJCVdMX0VSUk9SKCgid2wlZDogZmlmbyAlZDogZGF0YSBlcnJvclxuIiwgdW5pdCwgaWR4KSk7CisJCQlXTF9FUlJPUigid2wlZDogZmlmbyAlZDogZGF0YSBlcnJvclxuIiwgdW5pdCwgaWR4KTsKIAkJCVdMQ05USU5DUih3bGNfaHctPndsYy0+cHViLT5fY250LT5kbWFkYSk7CiAJCQlmYXRhbCA9IHRydWU7CiAJCX0KIAogCQlpZiAoaW50c3RhdHVzICYgSV9ERSkgewotCQkJV0xfRVJST1IoKCJ3bCVkOiBmaWZvICVkOiBkZXNjcmlwdG9yIHByb3RvY29sIGVycm9yXG4iLAotCQkJCSAgdW5pdCwgaWR4KSk7CisJCQlXTF9FUlJPUigid2wlZDogZmlmbyAlZDogZGVzY3JpcHRvciBwcm90b2NvbCBlcnJvclxuIiwKKwkJCQkgdW5pdCwgaWR4KTsKIAkJCVdMQ05USU5DUih3bGNfaHctPndsYy0+cHViLT5fY250LT5kbWFwZSk7CiAJCQlmYXRhbCA9IHRydWU7CiAJCX0KIAogCQlpZiAoaW50c3RhdHVzICYgSV9SVSkgewotCQkJV0xfRVJST1IoKCJ3bCVkOiBmaWZvICVkOiByZWNlaXZlIGRlc2NyaXB0b3IgdW5kZXJmbG93XG4iLCB1bml0LCBpZHgpKTsKKwkJCVdMX0VSUk9SKCJ3bCVkOiBmaWZvICVkOiByZWNlaXZlIGRlc2NyaXB0b3IgdW5kZXJmbG93XG4iLAorCQkJCSBpZHgsIHVuaXQpOwogCQkJV0xDTlRJTkNSKHdsY19ody0+d2xjLT5wdWItPl9jbnQtPnJ4dWZsb1tpZHhdKTsKIAkJfQogCiAJCWlmIChpbnRzdGF0dXMgJiBJX1hVKSB7Ci0JCQlXTF9FUlJPUigoIndsJWQ6IGZpZm8gJWQ6IHRyYW5zbWl0IGZpZm8gdW5kZXJmbG93XG4iLAotCQkJCSAgaWR4LCB1bml0KSk7CisJCQlXTF9FUlJPUigid2wlZDogZmlmbyAlZDogdHJhbnNtaXQgZmlmbyB1bmRlcmZsb3dcbiIsCisJCQkJIGlkeCwgdW5pdCk7CiAJCQlXTENOVElOQ1Iod2xjX2h3LT53bGMtPnB1Yi0+X2NudC0+dHh1ZmxvKTsKIAkJCWZhdGFsID0gdHJ1ZTsKIAkJfQpAQCAtMjk2Miw5ICsyOTgyLDkgQEAKIAl9CiB9CiAKLXZvaWQgd2xjX2ludHJzb24od2xjX2luZm9fdCAqd2xjKQordm9pZCB3bGNfaW50cnNvbihzdHJ1Y3Qgd2xjX2luZm8gKndsYykKIHsKLQl3bGNfaHdfaW5mb190ICp3bGNfaHcgPSB3bGMtPmh3OworCXN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3ID0gd2xjLT5odzsKIAlBU1NFUlQod2xjLT5kZWZtYWNpbnRtYXNrKTsKIAl3bGMtPm1hY2ludG1hc2sgPSB3bGMtPmRlZm1hY2ludG1hc2s7CiAJV19SRUcod2xjX2h3LT5vc2gsICZ3bGNfaHctPnJlZ3MtPm1hY2ludG1hc2ssIHdsYy0+bWFjaW50bWFzayk7CkBAIC0yOTc1LDcgKzI5OTUsNyBAQAogICogIGJ1dCBhbHNvIGJlY2F1c2UgcGVyLXBvcnQgY29kZSBtYXkgcmVxdWlyZSBzeW5jIHdpdGggdmFsaWQgaW50ZXJydXB0LgogICovCiAKLXN0YXRpYyB1MzIgd2xjX3dsaW50cnNvZmYod2xjX2luZm9fdCAqd2xjKQorc3RhdGljIHUzMiB3bGNfd2xpbnRyc29mZihzdHJ1Y3Qgd2xjX2luZm8gKndsYykKIHsKIAlpZiAoIXdsYy0+aHctPnVwKQogCQlyZXR1cm4gMDsKQEAgLTI5ODMsNyArMzAwMyw3IEBACiAJcmV0dXJuIHdsX2ludHJzb2ZmKHdsYy0+d2wpOwogfQogCi1zdGF0aWMgdm9pZCB3bGNfd2xpbnRyc3Jlc3RvcmUod2xjX2luZm9fdCAqd2xjLCB1MzIgbWFjaW50bWFzaykKK3N0YXRpYyB2b2lkIHdsY193bGludHJzcmVzdG9yZShzdHJ1Y3Qgd2xjX2luZm8gKndsYywgdTMyIG1hY2ludG1hc2spCiB7CiAJaWYgKCF3bGMtPmh3LT51cCkKIAkJcmV0dXJuOwpAQCAtMjk5MSw5ICszMDExLDkgQEAKIAl3bF9pbnRyc3Jlc3RvcmUod2xjLT53bCwgbWFjaW50bWFzayk7CiB9CiAKLXUzMiB3bGNfaW50cnNvZmYod2xjX2luZm9fdCAqd2xjKQordTMyIHdsY19pbnRyc29mZihzdHJ1Y3Qgd2xjX2luZm8gKndsYykKIHsKLQl3bGNfaHdfaW5mb190ICp3bGNfaHcgPSB3bGMtPmh3OworCXN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3ID0gd2xjLT5odzsKIAl1MzIgbWFjaW50bWFzazsKIAogCWlmICghd2xjX2h3LT5jbGspCkBAIC0zMDEwLDkgKzMwMzAsOSBAQAogCXJldHVybiB3bGMtPm1hY2ludHN0YXR1cyA/IDAgOiBtYWNpbnRtYXNrOwogfQogCi12b2lkIHdsY19pbnRyc3Jlc3RvcmUod2xjX2luZm9fdCAqd2xjLCB1MzIgbWFjaW50bWFzaykKK3ZvaWQgd2xjX2ludHJzcmVzdG9yZShzdHJ1Y3Qgd2xjX2luZm8gKndsYywgdTMyIG1hY2ludG1hc2spCiB7Ci0Jd2xjX2h3X2luZm9fdCAqd2xjX2h3ID0gd2xjLT5odzsKKwlzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odyA9IHdsYy0+aHc7CiAJaWYgKCF3bGNfaHctPmNsaykKIAkJcmV0dXJuOwogCkBAIC0zMDIwLDcgKzMwNDAsNyBAQAogCVdfUkVHKHdsY19ody0+b3NoLCAmd2xjX2h3LT5yZWdzLT5tYWNpbnRtYXNrLCB3bGMtPm1hY2ludG1hc2spOwogfQogCi12b2lkIHdsY19ibWFjX211dGUod2xjX2h3X2luZm9fdCAqd2xjX2h3LCBib29sIG9uLCBtYm9vbCBmbGFncykKK3ZvaWQgd2xjX2JtYWNfbXV0ZShzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odywgYm9vbCBvbiwgbWJvb2wgZmxhZ3MpCiB7CiAJc3RydWN0IGV0aGVyX2FkZHIgbnVsbF9ldGhlcl9hZGRyID0geyB7MCwgMCwgMCwgMCwgMCwgMH0gfTsKIApAQCAtMzA1NiwxMiArMzA3NiwxMiBAQAogCQl3bGNfdWNvZGVfbXV0ZV9vdmVycmlkZV9jbGVhcih3bGNfaHcpOwogfQogCi12b2lkIHdsY19ibWFjX3NldF9kZWFmKHdsY19od19pbmZvX3QgKndsY19odywgYm9vbCB1c2VyX2ZsYWcpCit2b2lkIHdsY19ibWFjX3NldF9kZWFmKHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LCBib29sIHVzZXJfZmxhZykKIHsKIAl3bGNfcGh5X3NldF9kZWFmKHdsY19ody0+YmFuZC0+cGksIHVzZXJfZmxhZyk7CiB9CiAKLWludCB3bGNfYm1hY194bXRmaWZvX3N6X2dldCh3bGNfaHdfaW5mb190ICp3bGNfaHcsIHVpbnQgZmlmbywgdWludCAqYmxvY2tzKQoraW50IHdsY19ibWFjX3htdGZpZm9fc3pfZ2V0KHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LCB1aW50IGZpZm8sIHVpbnQgKmJsb2NrcykKIHsKIAlpZiAoZmlmbyA+PSBORklGTykKIAkJcmV0dXJuIEJDTUVfUkFOR0U7CkBAIC0zMDcxLDcgKzMwOTEsNyBAQAogCXJldHVybiAwOwogfQogCi1pbnQgd2xjX2JtYWNfeG10Zmlmb19zel9zZXQod2xjX2h3X2luZm9fdCAqd2xjX2h3LCB1aW50IGZpZm8sIHVpbnQgYmxvY2tzKQoraW50IHdsY19ibWFjX3htdGZpZm9fc3pfc2V0KHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LCB1aW50IGZpZm8sIHVpbnQgYmxvY2tzKQogewogCWlmIChmaWZvID49IE5GSUZPIHx8IGJsb2NrcyA+IDI5OSkKIAkJcmV0dXJuIEJDTUVfUkFOR0U7CkBAIC0zMDkxLDcgKzMxMTEsNyBAQAogICogYmUgcHVsbGluZyBkYXRhIGludG8gYSB0eCBmaWZvLCBieSB0aGUgdGltZSB0aGUgTUFDIGFja3MgdGhlIHN1c3BlbmQKICAqIHJlcXVlc3QuCiAgKi8KLWJvb2wgd2xjX2JtYWNfdHhfZmlmb19zdXNwZW5kZWQod2xjX2h3X2luZm9fdCAqd2xjX2h3LCB1aW50IHR4X2ZpZm8pCitib29sIHdsY19ibWFjX3R4X2ZpZm9fc3VzcGVuZGVkKHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LCB1aW50IHR4X2ZpZm8pCiB7CiAJLyogY2hlY2sgdGhhdCBhIHN1c3BlbmQgaGFzIGJlZW4gcmVxdWVzdGVkIGFuZCBpcyBubyBsb25nZXIgcGVuZGluZyAqLwogCkBAIC0zMTEwLDcgKzMxMzAsNyBAQAogCXJldHVybiBmYWxzZTsKIH0KIAotdm9pZCB3bGNfYm1hY190eF9maWZvX3N1c3BlbmQod2xjX2h3X2luZm9fdCAqd2xjX2h3LCB1aW50IHR4X2ZpZm8pCit2b2lkIHdsY19ibWFjX3R4X2ZpZm9fc3VzcGVuZChzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odywgdWludCB0eF9maWZvKQogewogCXU4IGZpZm8gPSAxIDw8IHR4X2ZpZm87CiAKQEAgLTMxNDEsNyArMzE2MSw3IEBACiAJfQogfQogCi12b2lkIHdsY19ibWFjX3R4X2ZpZm9fcmVzdW1lKHdsY19od19pbmZvX3QgKndsY19odywgdWludCB0eF9maWZvKQordm9pZCB3bGNfYm1hY190eF9maWZvX3Jlc3VtZShzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odywgdWludCB0eF9maWZvKQogewogCS8qIEJNQUNfTk9URTogV0xDX1RYX0ZJRk9fRU5BQiBpcyBkb25lIGluIHdsY19kcGMoKSBmb3IgRE1BIGNhc2UgYnV0IG5lZWQgdG8gYmUgZG9uZQogCSAqIGhlcmUgZm9yIFBJTyBvdGhlcndpc2UgdGhlIHdhdGNoZG9nIHdpbGwgY2F0Y2ggdGhlIGluY29uc2lzdGVuY3kgYW5kIGZpcmUKQEAgLTMxNjksMjAgKzMxODksMjAgQEAKICAqICAgMCBpZiB0aGUgaW50ZXJydXB0IGlzIG5vdCBmb3IgdXMsIG9yIHdlIGFyZSBpbiBzb21lIHNwZWNpYWwgY2FzZXM7CiAgKiAgIGRldmljZSBpbnRlcnJ1cHQgc3RhdHVzIGJpdHMgb3RoZXJ3aXNlLgogICovCi1zdGF0aWMgaW5saW5lIHUzMiB3bGNfaW50c3RhdHVzKHdsY19pbmZvX3QgKndsYywgYm9vbCBpbl9pc3IpCitzdGF0aWMgaW5saW5lIHUzMiB3bGNfaW50c3RhdHVzKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCBib29sIGluX2lzcikKIHsKLQl3bGNfaHdfaW5mb190ICp3bGNfaHcgPSB3bGMtPmh3OworCXN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3ID0gd2xjLT5odzsKIAlkMTFyZWdzX3QgKnJlZ3MgPSB3bGNfaHctPnJlZ3M7CiAJdTMyIG1hY2ludHN0YXR1czsKIAl1MzIgaW50c3RhdHVzX3J4ZmlmbywgaW50c3RhdHVzX3R4c2ZpZm87Ci0Jb3NsX3QgKm9zaDsKKwlzdHJ1Y3Qgb3NsX2luZm8gKm9zaDsKIAogCW9zaCA9IHdsY19ody0+b3NoOwogCiAJLyogbWFjaW50c3RhdHVzIGluY2x1ZGVzIGEgRE1BIGludGVycnVwdCBzdW1tYXJ5IGJpdCAqLwogCW1hY2ludHN0YXR1cyA9IFJfUkVHKG9zaCwgJnJlZ3MtPm1hY2ludHN0YXR1cyk7CiAKLQlXTF9UUkFDRSgoIndsJWQ6IG1hY2ludHN0YXR1czogMHgleFxuIiwgd2xjX2h3LT51bml0LCBtYWNpbnRzdGF0dXMpKTsKKwlXTF9UUkFDRSgid2wlZDogbWFjaW50c3RhdHVzOiAweCV4XG4iLCB3bGNfaHctPnVuaXQsIG1hY2ludHN0YXR1cyk7CiAKIAkvKiBkZXRlY3QgY2FyZGJ1cyByZW1vdmVkLCBpbiBwb3dlciBkb3duKHN1c3BlbmQpIGFuZCBpbiByZXNldCAqLwogCWlmIChERVZJQ0VSRU1PVkVEKHdsYykpCkBAIC0zMjA3LDkgKzMyMjcsNyBAQAogCSAqLwogCS8qIHR1cm4gb2ZmIHRoZSBpbnRlcnJ1cHRzICovCiAJV19SRUcob3NoLCAmcmVncy0+bWFjaW50bWFzaywgMCk7Ci0jaWZuZGVmIEJDTVNESU8KIAkodm9pZClSX1JFRyhvc2gsICZyZWdzLT5tYWNpbnRtYXNrKTsJLyogc3luYyByZWFkYmFjayAqLwotI2VuZGlmCiAJd2xjLT5tYWNpbnRtYXNrID0gMDsKIAogCS8qIGNsZWFyIGRldmljZSBpbnRlcnJ1cHRzICovCkBAIC0zMjI0LDcgKzMyNDIsOSBAQAogCQkJICAgIFJfUkVHKG9zaCwKIAkJCQkgICZyZWdzLT5pbnRjdHJscmVnc1tSWF9UWFNUQVRVU19GSUZPXS4KIAkJCQkgIGludHN0YXR1cyk7Ci0JCQlXTF9UUkFDRSgoIndsJWQ6IGludHN0YXR1c19yeGZpZm8gMHgleCwgaW50c3RhdHVzX3R4c2ZpZm8gMHgleFxuIiwgd2xjX2h3LT51bml0LCBpbnRzdGF0dXNfcnhmaWZvLCBpbnRzdGF0dXNfdHhzZmlmbykpOworCQkJV0xfVFJBQ0UoIndsJWQ6IGludHN0YXR1c19yeGZpZm8gMHgleCwgaW50c3RhdHVzX3R4c2ZpZm8gMHgleFxuIiwKKwkJCQkgd2xjX2h3LT51bml0LAorCQkJCSBpbnRzdGF0dXNfcnhmaWZvLCBpbnRzdGF0dXNfdHhzZmlmbyk7CiAKIAkJCS8qIGRlZmVyIHVuc29saWNpdGVkIGludGVycnVwdCBoaW50cyAqLwogCQkJaW50c3RhdHVzX3J4ZmlmbyAmPSBERUZfUlhJTlRNQVNLOwpAQCAtMzI2MSw3ICszMjgxLDcgQEAKIAogLyogVXBkYXRlIHdsYy0+bWFjaW50c3RhdHVzIGFuZCB3bGMtPmludHN0YXR1c1tdLiAqLwogLyogUmV0dXJuIHRydWUgaWYgdGhleSBhcmUgdXBkYXRlZCBzdWNjZXNzZnVsbHkuIGZhbHNlIG90aGVyd2lzZSAqLwotYm9vbCB3bGNfaW50cnN1cGQod2xjX2luZm9fdCAqd2xjKQorYm9vbCB3bGNfaW50cnN1cGQoc3RydWN0IHdsY19pbmZvICp3bGMpCiB7CiAJdTMyIG1hY2ludHN0YXR1czsKIApAQCAtMzI4Niw5ICszMzA2LDkgQEAKICAqICp3YW50ZHBjIHdpbGwgYmUgc2V0IHRvIHRydWUgaWYgZnVydGhlciB3bGNfZHBjKCkgcHJvY2Vzc2luZyBpcyByZXF1aXJlZCwKICAqIGZhbHNlIG90aGVyd2lzZS4KICAqLwotYm9vbCBCQ01GQVNUUEFUSCB3bGNfaXNyKHdsY19pbmZvX3QgKndsYywgYm9vbCAqd2FudGRwYykKK2Jvb2wgQkNNRkFTVFBBVEggd2xjX2lzcihzdHJ1Y3Qgd2xjX2luZm8gKndsYywgYm9vbCAqd2FudGRwYykKIHsKLQl3bGNfaHdfaW5mb190ICp3bGNfaHcgPSB3bGMtPmh3OworCXN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3ID0gd2xjLT5odzsKIAl1MzIgbWFjaW50c3RhdHVzOwogCiAJKndhbnRkcGMgPSBmYWxzZTsKQEAgLTMzMDAsNyArMzMyMCw3IEBACiAJbWFjaW50c3RhdHVzID0gd2xjX2ludHN0YXR1cyh3bGMsIHRydWUpOwogCiAJaWYgKG1hY2ludHN0YXR1cyA9PSAweGZmZmZmZmZmKQotCQlXTF9FUlJPUigoIkRFVklDRVJFTU9WRUQgZGV0ZWN0ZWQgaW4gdGhlIElTUiBjb2RlIHBhdGguXG4iKSk7CisJCVdMX0VSUk9SKCJERVZJQ0VSRU1PVkVEIGRldGVjdGVkIGluIHRoZSBJU1IgY29kZSBwYXRoXG4iKTsKIAogCS8qIGl0IGlzIG5vdCBmb3IgdXMgKi8KIAlpZiAobWFjaW50c3RhdHVzID09IDApCkBAIC0zMzE3LDIwICszMzM3LDIwIEBACiB9CiAKIC8qIHByb2Nlc3MgdHggY29tcGxldGlvbiBldmVudHMgZm9yIGNvcmVyZXYgPCA1ICovCi1zdGF0aWMgYm9vbCB3bGNfYm1hY190eHN0YXR1c19jb3JlcmV2NCh3bGNfaHdfaW5mb190ICp3bGNfaHcpCitzdGF0aWMgYm9vbCB3bGNfYm1hY190eHN0YXR1c19jb3JlcmV2NChzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odykKIHsKLQl2b2lkICpzdGF0dXNfcDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc3RhdHVzX3A7CiAJdHhfc3RhdHVzX3QgKnR4czsKLQlvc2xfdCAqb3NoOworCXN0cnVjdCBvc2xfaW5mbyAqb3NoOwogCWJvb2wgZmF0YWwgPSBmYWxzZTsKIAotCVdMX1RSQUNFKCgid2wlZDogd2xjX3R4c3RhdHVzcmVjdlxuIiwgd2xjX2h3LT51bml0KSk7CisJV0xfVFJBQ0UoIndsJWQ6IHdsY190eHN0YXR1c3JlY3ZcbiIsIHdsY19ody0+dW5pdCk7CiAKIAlvc2ggPSB3bGNfaHctPm9zaDsKIAogCXdoaWxlICghZmF0YWwgJiYgKHN0YXR1c19wID0gZG1hX3J4KHdsY19ody0+ZGlbUlhfVFhTVEFUVVNfRklGT10pKSkgewogCi0JCXR4cyA9ICh0eF9zdGF0dXNfdCAqKSBQS1REQVRBKHN0YXR1c19wKTsKKwkJdHhzID0gKHR4X3N0YXR1c190ICopIHN0YXR1c19wLT5kYXRhOwogCQkvKiBNQUMgdXNlcyBsaXR0bGUgZW5kaWFuIG9ubHkgKi8KIAkJbHRvaDE2X2J1Zigodm9pZCAqKXR4cywgc2l6ZW9mKHR4X3N0YXR1c190KSk7CiAKQEAgLTMzNDAsNyArMzM2MCw3IEBACiAKIAkJZmF0YWwgPSB3bGNfYm1hY19kb3R4c3RhdHVzKHdsY19odywgdHhzLCAwKTsKIAotCQlQS1RGUkVFKG9zaCwgc3RhdHVzX3AsIGZhbHNlKTsKKwkJcGt0X2J1Zl9mcmVlX3NrYihvc2gsIHN0YXR1c19wLCBmYWxzZSk7CiAJfQogCiAJaWYgKGZhdGFsKQpAQCAtMzM1Myw3ICszMzczLDcgQEAKIH0KIAogc3RhdGljIGJvb2wgQkNNRkFTVFBBVEgKLXdsY19ibWFjX2RvdHhzdGF0dXMod2xjX2h3X2luZm9fdCAqd2xjX2h3LCB0eF9zdGF0dXNfdCAqdHhzLCB1MzIgczIpCit3bGNfYm1hY19kb3R4c3RhdHVzKHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LCB0eF9zdGF0dXNfdCAqdHhzLCB1MzIgczIpCiB7CiAJLyogZGlzY2FyZCBpbnRlcm1lZGlhdGUgaW5kaWNhdGlvbnMgZm9yIHVjb2RlIHdpdGggb25lIGxlZ2l0aW1hdGUgY2FzZToKIAkgKiAgIGUuZy4gaWYgInVzZVJUUyIgaXMgc2V0LiB1Y29kZSBkaWQgYSBzdWNjZXNzZnVsIHJ0cy9jdHMgZXhjaGFuZ2UsIGJ1dCB0aGUgc3Vic2VxdWVudApAQCAtMzM3MiwxMiArMzM5MiwxMiBAQAogICogUmV0dXJuIHRydWUgaWYgbW9yZSB0eCBzdGF0dXMgbmVlZCB0byBiZSBwcm9jZXNzZWQuIGZhbHNlIG90aGVyd2lzZS4KICAqLwogc3RhdGljIGJvb2wgQkNNRkFTVFBBVEgKLXdsY19ibWFjX3R4c3RhdHVzKHdsY19od19pbmZvX3QgKndsY19odywgYm9vbCBib3VuZCwgYm9vbCAqZmF0YWwpCit3bGNfYm1hY190eHN0YXR1cyhzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odywgYm9vbCBib3VuZCwgYm9vbCAqZmF0YWwpCiB7CiAJYm9vbCBtb3JlcGVuZGluZyA9IGZhbHNlOwotCXdsY19pbmZvX3QgKndsYyA9IHdsY19ody0+d2xjOworCXN0cnVjdCB3bGNfaW5mbyAqd2xjID0gd2xjX2h3LT53bGM7CiAKLQlXTF9UUkFDRSgoIndsJWQ6IHdsY19ibWFjX3R4c3RhdHVzXG4iLCB3bGNfaHctPnVuaXQpKTsKKwlXTF9UUkFDRSgid2wlZDogd2xjX2JtYWNfdHhzdGF0dXNcbiIsIHdsY19ody0+dW5pdCk7CiAKIAlpZiAoRDExUkVWX0lTKHdsY19ody0+Y29yZXJldiwgNCkpIHsKIAkJLyogdG8gcmV0aXJlIHNvb24gKi8KQEAgLTMzODgsNyArMzQwOCw3IEBACiAJfSBlbHNlIHsKIAkJLyogY29yZXJldiA+PSA1ICovCiAJCWQxMXJlZ3NfdCAqcmVnczsKLQkJb3NsX3QgKm9zaDsKKwkJc3RydWN0IG9zbF9pbmZvICpvc2g7CiAJCXR4X3N0YXR1c190IHR4c3RhdHVzLCAqdHhzOwogCQl1MzIgczEsIHMyOwogCQl1aW50IG4gPSAwOwpAQCAtMzQwMiw4ICszNDIyLDggQEAKIAkJICAgICAgICYmIChzMSA9IFJfUkVHKG9zaCwgJnJlZ3MtPmZybXR4c3RhdHVzKSkgJiBUWFNfVikgewogCiAJCQlpZiAoczEgPT0gMHhmZmZmZmZmZikgewotCQkJCVdMX0VSUk9SKCgid2wlZDogJXM6IGRlYWQgY2hpcFxuIiwKLQkJCQkJICB3bGNfaHctPnVuaXQsIF9fZnVuY19fKSk7CisJCQkJV0xfRVJST1IoIndsJWQ6ICVzOiBkZWFkIGNoaXBcbiIsCisJCQkJCSB3bGNfaHctPnVuaXQsIF9fZnVuY19fKTsKIAkJCQlBU1NFUlQoczEgIT0gMHhmZmZmZmZmZik7CiAJCQkJcmV0dXJuIG1vcmVwZW5kaW5nOwogCQkJfQpAQCAtMzQzNiwxNSArMzQ1NiwxNSBAQAogCXJldHVybiBtb3JlcGVuZGluZzsKIH0KIAotdm9pZCB3bGNfc3VzcGVuZF9tYWNfYW5kX3dhaXQod2xjX2luZm9fdCAqd2xjKQordm9pZCB3bGNfc3VzcGVuZF9tYWNfYW5kX3dhaXQoc3RydWN0IHdsY19pbmZvICp3bGMpCiB7Ci0Jd2xjX2h3X2luZm9fdCAqd2xjX2h3ID0gd2xjLT5odzsKKwlzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odyA9IHdsYy0+aHc7CiAJZDExcmVnc190ICpyZWdzID0gd2xjX2h3LT5yZWdzOwogCXUzMiBtYywgbWk7Ci0Jb3NsX3QgKm9zaDsKKwlzdHJ1Y3Qgb3NsX2luZm8gKm9zaDsKIAotCVdMX1RSQUNFKCgid2wlZDogd2xjX3N1c3BlbmRfbWFjX2FuZF93YWl0OiBiYW5kdW5pdCAlZFxuIiwgd2xjX2h3LT51bml0LAotCQkgIHdsY19ody0+YmFuZC0+YmFuZHVuaXQpKTsKKwlXTF9UUkFDRSgid2wlZDogd2xjX3N1c3BlbmRfbWFjX2FuZF93YWl0OiBiYW5kdW5pdCAlZFxuIiwKKwkJIHdsY19ody0+dW5pdCwgd2xjX2h3LT5iYW5kLT5iYW5kdW5pdCk7CiAKIAkvKgogCSAqIFRyYWNrIG92ZXJsYXBwaW5nIHN1c3BlbmQgcmVxdWVzdHMKQEAgLTM0NjEsNyArMzQ4MSw3IEBACiAJbWMgPSBSX1JFRyhvc2gsICZyZWdzLT5tYWNjb250cm9sKTsKIAogCWlmIChtYyA9PSAweGZmZmZmZmZmKSB7Ci0JCVdMX0VSUk9SKCgid2wlZDogJXM6IGRlYWQgY2hpcFxuIiwgd2xjX2h3LT51bml0LCBfX2Z1bmNfXykpOworCQlXTF9FUlJPUigid2wlZDogJXM6IGRlYWQgY2hpcFxuIiwgd2xjX2h3LT51bml0LCBfX2Z1bmNfXyk7CiAJCXdsX2Rvd24od2xjLT53bCk7CiAJCXJldHVybjsKIAl9CkBAIC0zNDcxLDcgKzM0OTEsNyBAQAogCiAJbWkgPSBSX1JFRyhvc2gsICZyZWdzLT5tYWNpbnRzdGF0dXMpOwogCWlmIChtaSA9PSAweGZmZmZmZmZmKSB7Ci0JCVdMX0VSUk9SKCgid2wlZDogJXM6IGRlYWQgY2hpcFxuIiwgd2xjX2h3LT51bml0LCBfX2Z1bmNfXykpOworCQlXTF9FUlJPUigid2wlZDogJXM6IGRlYWQgY2hpcFxuIiwgd2xjX2h3LT51bml0LCBfX2Z1bmNfXyk7CiAJCXdsX2Rvd24od2xjLT53bCk7CiAJCXJldHVybjsKIAl9CkBAIC0zNDgzLDE1ICszNTAzLDE4IEBACiAJCSBXTENfTUFYX01BQ19TVVNQRU5EKTsKIAogCWlmICghKFJfUkVHKG9zaCwgJnJlZ3MtPm1hY2ludHN0YXR1cykgJiBNSV9NQUNTU1BOREQpKSB7Ci0JCVdMX0VSUk9SKCgid2wlZDogd2xjX3N1c3BlbmRfbWFjX2FuZF93YWl0OiB3YWl0ZWQgJWQgdVMgYW5kICIKLQkJCSAgIk1JX01BQ1NTUE5ERCBpcyBzdGlsbCBub3Qgb24uXG4iLAotCQkJICB3bGNfaHctPnVuaXQsIFdMQ19NQVhfTUFDX1NVU1BFTkQpKTsKLQkJV0xfRVJST1IoKCJ3bCVkOiBwc21kZWJ1ZyAweCUwOHgsIHBoeWRlYnVnIDB4JTA4eCwgcHNtX2JyYyAweCUwNHhcbiIsIHdsY19ody0+dW5pdCwgUl9SRUcob3NoLCAmcmVncy0+cHNtZGVidWcpLCBSX1JFRyhvc2gsICZyZWdzLT5waHlkZWJ1ZyksIFJfUkVHKG9zaCwgJnJlZ3MtPnBzbV9icmMpKSk7CisJCVdMX0VSUk9SKCJ3bCVkOiB3bGNfc3VzcGVuZF9tYWNfYW5kX3dhaXQ6IHdhaXRlZCAlZCB1UyBhbmQgTUlfTUFDU1NQTkREIGlzIHN0aWxsIG5vdCBvbi5cbiIsCisJCQkgd2xjX2h3LT51bml0LCBXTENfTUFYX01BQ19TVVNQRU5EKTsKKwkJV0xfRVJST1IoIndsJWQ6IHBzbWRlYnVnIDB4JTA4eCwgcGh5ZGVidWcgMHglMDh4LCBwc21fYnJjIDB4JTA0eFxuIiwKKwkJCSB3bGNfaHctPnVuaXQsCisJCQkgUl9SRUcob3NoLCAmcmVncy0+cHNtZGVidWcpLAorCQkJIFJfUkVHKG9zaCwgJnJlZ3MtPnBoeWRlYnVnKSwKKwkJCSBSX1JFRyhvc2gsICZyZWdzLT5wc21fYnJjKSk7CiAJfQogCiAJbWMgPSBSX1JFRyhvc2gsICZyZWdzLT5tYWNjb250cm9sKTsKIAlpZiAobWMgPT0gMHhmZmZmZmZmZikgewotCQlXTF9FUlJPUigoIndsJWQ6ICVzOiBkZWFkIGNoaXBcbiIsIHdsY19ody0+dW5pdCwgX19mdW5jX18pKTsKKwkJV0xfRVJST1IoIndsJWQ6ICVzOiBkZWFkIGNoaXBcbiIsIHdsY19ody0+dW5pdCwgX19mdW5jX18pOwogCQl3bF9kb3duKHdsYy0+d2wpOwogCQlyZXR1cm47CiAJfQpAQCAtMzUwMCwxNSArMzUyMywxNSBAQAogCUFTU0VSVCghKG1jICYgTUNUTF9FTl9NQUMpKTsKIH0KIAotdm9pZCB3bGNfZW5hYmxlX21hYyh3bGNfaW5mb190ICp3bGMpCit2b2lkIHdsY19lbmFibGVfbWFjKHN0cnVjdCB3bGNfaW5mbyAqd2xjKQogewotCXdsY19od19pbmZvX3QgKndsY19odyA9IHdsYy0+aHc7CisJc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcgPSB3bGMtPmh3OwogCWQxMXJlZ3NfdCAqcmVncyA9IHdsY19ody0+cmVnczsKIAl1MzIgbWMsIG1pOwotCW9zbF90ICpvc2g7CisJc3RydWN0IG9zbF9pbmZvICpvc2g7CiAKLQlXTF9UUkFDRSgoIndsJWQ6IHdsY19lbmFibGVfbWFjOiBiYW5kdW5pdCAlZFxuIiwgd2xjX2h3LT51bml0LAotCQkgIHdsYy0+YmFuZC0+YmFuZHVuaXQpKTsKKwlXTF9UUkFDRSgid2wlZDogd2xjX2VuYWJsZV9tYWM6IGJhbmR1bml0ICVkXG4iLAorCQkgd2xjX2h3LT51bml0LCB3bGMtPmJhbmQtPmJhbmR1bml0KTsKIAogCS8qCiAJICogVHJhY2sgb3ZlcmxhcHBpbmcgc3VzcGVuZCByZXF1ZXN0cwpAQCAtMzUzOSw3ICszNTYyLDcgQEAKIAl3bGNfdWNvZGVfd2FrZV9vdmVycmlkZV9jbGVhcih3bGNfaHcsIFdMQ19XQUtFX09WRVJSSURFX01BQ1NVU1BFTkQpOwogfQogCi12b2lkIHdsY19ibWFjX2lmc2N0bF9lZGNyc19zZXQod2xjX2h3X2luZm9fdCAqd2xjX2h3LCBib29sIGFiaWUsIGJvb2wgaXNodCkKK3ZvaWQgd2xjX2JtYWNfaWZzY3RsX2VkY3JzX3NldChzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odywgYm9vbCBhYmllLCBib29sIGlzaHQpCiB7CiAJaWYgKCEoV0xDSVNOUEhZKHdsY19ody0+YmFuZCkgJiYgKEQxMVJFVl9HRSh3bGNfaHctPmNvcmVyZXYsIDE2KSkpKQogCQlyZXR1cm47CkBAIC0zNTc1LDcgKzM1OTgsNyBAQAogCX0KIH0KIAotc3RhdGljIHZvaWQgd2xjX3VwZF9vZmRtX3BjdGwxX3RhYmxlKHdsY19od19pbmZvX3QgKndsY19odykKK3N0YXRpYyB2b2lkIHdsY191cGRfb2ZkbV9wY3RsMV90YWJsZShzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odykKIHsKIAl1OCByYXRlOwogCXU4IHJhdGVzWzhdID0gewpAQCAtMzYwOSw3ICszNjMyLDcgQEAKIAl9CiB9CiAKLXN0YXRpYyB1MTYgd2xjX2JtYWNfb2ZkbV9yYXRldGFibGVfb2Zmc2V0KHdsY19od19pbmZvX3QgKndsY19odywgdTggcmF0ZSkKK3N0YXRpYyB1MTYgd2xjX2JtYWNfb2ZkbV9yYXRldGFibGVfb2Zmc2V0KHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LCB1OCByYXRlKQogewogCXVpbnQgaTsKIAl1OCBwbGNwX3JhdGUgPSAwOwpAQCAtMzY0Miw3ICszNjY1LDcgQEAKIAlyZXR1cm4gMiAqIHdsY19ibWFjX3JlYWRfc2htKHdsY19odywgTV9SVF9ESVJNQVBfQSArIChwbGNwX3JhdGUgKiAyKSk7CiB9CiAKLXZvaWQgd2xjX2JtYWNfYmFuZF9zdGZfc3Nfc2V0KHdsY19od19pbmZvX3QgKndsY19odywgdTggc3RmX21vZGUpCit2b2lkIHdsY19ibWFjX2JhbmRfc3RmX3NzX3NldChzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odywgdTggc3RmX21vZGUpCiB7CiAJd2xjX2h3LT5od19zdGZfc3Nfb3Btb2RlID0gc3RmX21vZGU7CiAKQEAgLTM2NTEsNyArMzY3NCw3IEBACiB9CiAKIHZvaWQgQkNNRkFTVFBBVEgKLXdsY19ibWFjX3JlYWRfdHNmKHdsY19od19pbmZvX3QgKndsY19odywgdTMyICp0c2ZfbF9wdHIsCit3bGNfYm1hY19yZWFkX3RzZihzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odywgdTMyICp0c2ZfbF9wdHIsCiAJCSAgdTMyICp0c2ZfaF9wdHIpCiB7CiAJZDExcmVnc190ICpyZWdzID0gd2xjX2h3LT5yZWdzOwpAQCAtMzY2MywxNCArMzY4NiwxNCBAQAogCXJldHVybjsKIH0KIAotYm9vbCB3bGNfYm1hY192YWxpZGF0ZV9jaGlwX2FjY2Vzcyh3bGNfaHdfaW5mb190ICp3bGNfaHcpCitib29sIHdsY19ibWFjX3ZhbGlkYXRlX2NoaXBfYWNjZXNzKHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3KQogewogCWQxMXJlZ3NfdCAqcmVnczsKIAl1MzIgdywgdmFsOwogCXZvbGF0aWxlIHUxNiAqcmVnMTY7Ci0Jb3NsX3QgKm9zaDsKKwlzdHJ1Y3Qgb3NsX2luZm8gKm9zaDsKIAotCVdMX1RSQUNFKCgid2wlZDogdmFsaWRhdGVfY2hpcF9hY2Nlc3NcbiIsIHdsY19ody0+dW5pdCkpOworCVdMX1RSQUNFKCJ3bCVkOiB2YWxpZGF0ZV9jaGlwX2FjY2Vzc1xuIiwgd2xjX2h3LT51bml0KTsKIAogCXJlZ3MgPSB3bGNfaHctPnJlZ3M7CiAJb3NoID0gd2xjX2h3LT5vc2g7CkBAIC0zNjkwLDcgKzM3MTMsOCBAQAogCSh2b2lkKVJfUkVHKG9zaCwgJnJlZ3MtPm9iamFkZHIpOwogCXZhbCA9IFJfUkVHKG9zaCwgJnJlZ3MtPm9iamRhdGEpOwogCWlmICh2YWwgIT0gKHUzMikgMHhhYTU1NTVhYSkgewotCQlXTF9FUlJPUigoIndsJWQ6IHZhbGlkYXRlX2NoaXBfYWNjZXNzOiBTSE0gPSAweCV4LCBleHBlY3RlZCAweGFhNTU1NWFhXG4iLCB3bGNfaHctPnVuaXQsIHZhbCkpOworCQlXTF9FUlJPUigid2wlZDogdmFsaWRhdGVfY2hpcF9hY2Nlc3M6IFNITSA9IDB4JXgsIGV4cGVjdGVkIDB4YWE1NTU1YWFcbiIsCisJCQkgd2xjX2h3LT51bml0LCB2YWwpOwogCQlyZXR1cm4gZmFsc2U7CiAJfQogCkBAIC0zNzAyLDcgKzM3MjYsOCBAQAogCSh2b2lkKVJfUkVHKG9zaCwgJnJlZ3MtPm9iamFkZHIpOwogCXZhbCA9IFJfUkVHKG9zaCwgJnJlZ3MtPm9iamRhdGEpOwogCWlmICh2YWwgIT0gKHUzMikgMHg1NWFhYWE1NSkgewotCQlXTF9FUlJPUigoIndsJWQ6IHZhbGlkYXRlX2NoaXBfYWNjZXNzOiBTSE0gPSAweCV4LCBleHBlY3RlZCAweDU1YWFhYTU1XG4iLCB3bGNfaHctPnVuaXQsIHZhbCkpOworCQlXTF9FUlJPUigid2wlZDogdmFsaWRhdGVfY2hpcF9hY2Nlc3M6IFNITSA9IDB4JXgsIGV4cGVjdGVkIDB4NTVhYWFhNTVcbiIsCisJCQkgd2xjX2h3LT51bml0LCB2YWwpOwogCQlyZXR1cm4gZmFsc2U7CiAJfQogCkBAIC0zNzMyLDEyICszNzU3LDE0IEBACiAJCS8qIHZlcmlmeSB3aXRoIHRoZSAxNiBiaXQgcmVnaXN0ZXJzIHRoYXQgaGF2ZSBubyBzaWRlIGVmZmVjdHMgKi8KIAkJdmFsID0gUl9SRUcob3NoLCAmcmVncy0+dHNmX2NmcHN0cnRfbCk7CiAJCWlmICh2YWwgIT0gKHVpbnQpIDB4QkJCQikgewotCQkJV0xfRVJST1IoKCJ3bCVkOiB2YWxpZGF0ZV9jaGlwX2FjY2VzczogdHNmX2NmcHN0cnRfbCA9IDB4JXgsIGV4cGVjdGVkIiAiIDB4JXhcbiIsIHdsY19ody0+dW5pdCwgdmFsLCAweEJCQkIpKTsKKwkJCVdMX0VSUk9SKCJ3bCVkOiB2YWxpZGF0ZV9jaGlwX2FjY2VzczogdHNmX2NmcHN0cnRfbCA9IDB4JXgsIGV4cGVjdGVkIDB4JXhcbiIsCisJCQkJIHdsY19ody0+dW5pdCwgdmFsLCAweEJCQkIpOwogCQkJcmV0dXJuIGZhbHNlOwogCQl9CiAJCXZhbCA9IFJfUkVHKG9zaCwgJnJlZ3MtPnRzZl9jZnBzdHJ0X2gpOwogCQlpZiAodmFsICE9ICh1aW50KSAweENDQ0MpIHsKLQkJCVdMX0VSUk9SKCgid2wlZDogdmFsaWRhdGVfY2hpcF9hY2Nlc3M6IHRzZl9jZnBzdHJ0X2ggPSAweCV4LCBleHBlY3RlZCIgIiAweCV4XG4iLCB3bGNfaHctPnVuaXQsIHZhbCwgMHhDQ0NDKSk7CisJCQlXTF9FUlJPUigid2wlZDogdmFsaWRhdGVfY2hpcF9hY2Nlc3M6IHRzZl9jZnBzdHJ0X2ggPSAweCV4LCBleHBlY3RlZCAweCV4XG4iLAorCQkJCSB3bGNfaHctPnVuaXQsIHZhbCwgMHhDQ0NDKTsKIAkJCXJldHVybiBmYWxzZTsKIAkJfQogCkBAIC0zNzQ5LDcgKzM3NzYsMTAgQEAKIAl3ID0gUl9SRUcob3NoLCAmcmVncy0+bWFjY29udHJvbCk7CiAJaWYgKCh3ICE9IChNQ1RMX0lIUl9FTiB8IE1DVExfV0FLRSkpICYmCiAJICAgICh3ICE9IChNQ1RMX0lIUl9FTiB8IE1DVExfR01PREUgfCBNQ1RMX1dBS0UpKSkgewotCQlXTF9FUlJPUigoIndsJWQ6IHZhbGlkYXRlX2NoaXBfYWNjZXNzOiBtYWNjb250cm9sID0gMHgleCwgZXhwZWN0ZWQgMHgleCBvciAweCV4XG4iLCB3bGNfaHctPnVuaXQsIHcsIChNQ1RMX0lIUl9FTiB8IE1DVExfV0FLRSksIChNQ1RMX0lIUl9FTiB8IE1DVExfR01PREUgfCBNQ1RMX1dBS0UpKSk7CisJCVdMX0VSUk9SKCJ3bCVkOiB2YWxpZGF0ZV9jaGlwX2FjY2VzczogbWFjY29udHJvbCA9IDB4JXgsIGV4cGVjdGVkIDB4JXggb3IgMHgleFxuIiwKKwkJCSB3bGNfaHctPnVuaXQsIHcsCisJCQkgKE1DVExfSUhSX0VOIHwgTUNUTF9XQUtFKSwKKwkJCSAoTUNUTF9JSFJfRU4gfCBNQ1RMX0dNT0RFIHwgTUNUTF9XQUtFKSk7CiAJCXJldHVybiBmYWxzZTsKIAl9CiAKQEAgLTM3NTgsMTMgKzM3ODgsMTMgQEAKIAogI2RlZmluZSBQSFlQTExfV0FJVF9VUwkxMDAwMDAKIAotdm9pZCB3bGNfYm1hY19jb3JlX3BoeXBsbF9jdGwod2xjX2h3X2luZm9fdCAqd2xjX2h3LCBib29sIG9uKQordm9pZCB3bGNfYm1hY19jb3JlX3BoeXBsbF9jdGwoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcsIGJvb2wgb24pCiB7CiAJZDExcmVnc190ICpyZWdzOwotCW9zbF90ICpvc2g7CisJc3RydWN0IG9zbF9pbmZvICpvc2g7CiAJdTMyIHRtcDsKIAotCVdMX1RSQUNFKCgid2wlZDogd2xjX2JtYWNfY29yZV9waHlwbGxfY3RsXG4iLCB3bGNfaHctPnVuaXQpKTsKKwlXTF9UUkFDRSgid2wlZDogd2xjX2JtYWNfY29yZV9waHlwbGxfY3RsXG4iLCB3bGNfaHctPnVuaXQpOwogCiAJdG1wID0gMDsKIAlyZWdzID0gd2xjX2h3LT5yZWdzOwpAQCAtMzc4NSw4ICszODE1LDggQEAKIAkJCXRtcCA9IFJfUkVHKG9zaCwgJnJlZ3MtPmNsa19jdGxfc3QpOwogCQkJaWYgKCh0bXAgJiAoQ0NTX0VSU1JDX0FWQUlMX0hUKSkgIT0KIAkJCSAgICAoQ0NTX0VSU1JDX0FWQUlMX0hUKSkgewotCQkJCVdMX0VSUk9SKCgiJXM6IHR1cm4gb24gUEhZIFBMTCBmYWlsZWRcbiIsCi0JCQkJCSAgX19mdW5jX18pKTsKKwkJCQlXTF9FUlJPUigiJXM6IHR1cm4gb24gUEhZIFBMTCBmYWlsZWRcbiIsCisJCQkJCSBfX2Z1bmNfXyk7CiAJCQkJQVNTRVJUKDApOwogCQkJfQogCQl9IGVsc2UgewpAQCAtMzgwMyw4ICszODMzLDggQEAKIAkJCSAgICAgKENDU19FUlNSQ19BVkFJTF9EMTFQTEwgfCBDQ1NfRVJTUkNfQVZBSUxfUEhZUExMKSkKIAkJCSAgICAhPQogCQkJICAgIChDQ1NfRVJTUkNfQVZBSUxfRDExUExMIHwgQ0NTX0VSU1JDX0FWQUlMX1BIWVBMTCkpIHsKLQkJCQlXTF9FUlJPUigoIiVzOiB0dXJuIG9uIFBIWSBQTEwgZmFpbGVkXG4iLAotCQkJCQkgIF9fZnVuY19fKSk7CisJCQkJV0xfRVJST1IoIiVzOiB0dXJuIG9uIFBIWSBQTEwgZmFpbGVkXG4iLAorCQkJCQkgX19mdW5jX18pOwogCQkJCUFTU0VSVCgwKTsKIAkJCX0KIAkJfQpAQCAtMzgxNywxMSArMzg0NywxMSBAQAogCX0KIH0KIAotdm9pZCB3bGNfY29yZWRpc2FibGUod2xjX2h3X2luZm9fdCAqd2xjX2h3KQordm9pZCB3bGNfY29yZWRpc2FibGUoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcpCiB7CiAJYm9vbCBkZXZfZ29uZTsKIAotCVdMX1RSQUNFKCgid2wlZDogJXNcbiIsIHdsY19ody0+dW5pdCwgX19mdW5jX18pKTsKKwlXTF9UUkFDRSgid2wlZDogJXNcbiIsIHdsY19ody0+dW5pdCwgX19mdW5jX18pOwogCiAJQVNTRVJUKCF3bGNfaHctPnVwKTsKIApAQCAtMzg1Nyw5ICszODg3LDkgQEAKIH0KIAogLyogcG93ZXIgYm90aCB0aGUgcGxsIGFuZCBleHRlcm5hbCBvc2NpbGxhdG9yIG9uL29mZiAqLwotdm9pZCB3bGNfYm1hY194dGFsKHdsY19od19pbmZvX3QgKndsY19odywgYm9vbCB3YW50KQordm9pZCB3bGNfYm1hY194dGFsKHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LCBib29sIHdhbnQpCiB7Ci0JV0xfVFJBQ0UoKCJ3bCVkOiB3bGNfYm1hY194dGFsOiB3YW50ICVkXG4iLCB3bGNfaHctPnVuaXQsIHdhbnQpKTsKKwlXTF9UUkFDRSgid2wlZDogd2xjX2JtYWNfeHRhbDogd2FudCAlZFxuIiwgd2xjX2h3LT51bml0LCB3YW50KTsKIAogCS8qIGRvbnQgcG93ZXIgZG93biBpZiBwbGxkb3duIGlzIGZhbHNlIG9yIHdlIG11c3QgcG9sbCBodyByYWRpbyBkaXNhYmxlICovCiAJaWYgKCF3YW50ICYmIHdsY19ody0+cGxscmVxKQpAQCAtMzg3Niw5ICszOTA2LDkgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIHdsY19mbHVzaHF1ZXVlcyh3bGNfaW5mb190ICp3bGMpCitzdGF0aWMgdm9pZCB3bGNfZmx1c2hxdWV1ZXMoc3RydWN0IHdsY19pbmZvICp3bGMpCiB7Ci0Jd2xjX2h3X2luZm9fdCAqd2xjX2h3ID0gd2xjLT5odzsKKwlzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odyA9IHdsYy0+aHc7CiAJdWludCBpOwogCiAJd2xjLT50eHBlbmQxNjE2NXdhciA9IDA7CkBAIC0zODg4LDggKzM5MTgsOCBAQAogCQlpZiAod2xjX2h3LT5kaVtpXSkgewogCQkJZG1hX3R4cmVjbGFpbSh3bGNfaHctPmRpW2ldLCBITkRETUFfUkFOR0VfQUxMKTsKIAkJCVRYUEtUUEVORENMUih3bGMsIGkpOwotCQkJV0xfVFJBQ0UoKCJ3bGNfZmx1c2hxdWV1ZXM6IHBrdHBlbmQgZmlmbyAlZCBjbGVhcmVkXG4iLAotCQkJCSAgaSkpOworCQkJV0xfVFJBQ0UoIndsY19mbHVzaHF1ZXVlczogcGt0cGVuZCBmaWZvICVkIGNsZWFyZWRcbiIsCisJCQkJIGkpOwogCQl9CiAKIAkvKiBmcmVlIGFueSBwb3N0ZWQgcnggcGFja2V0cyAqLwpAQCAtMzg5OCwxMiArMzkyOCwxMiBAQAogCQlkbWFfcnhyZWNsYWltKHdsY19ody0+ZGlbUlhfVFhTVEFUVVNfRklGT10pOwogfQogCi11MTYgd2xjX2JtYWNfcmVhZF9zaG0od2xjX2h3X2luZm9fdCAqd2xjX2h3LCB1aW50IG9mZnNldCkKK3UxNiB3bGNfYm1hY19yZWFkX3NobShzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odywgdWludCBvZmZzZXQpCiB7CiAJcmV0dXJuIHdsY19ibWFjX3JlYWRfb2JqbWVtKHdsY19odywgb2Zmc2V0LCBPQkpBRERSX1NITV9TRUwpOwogfQogCi12b2lkIHdsY19ibWFjX3dyaXRlX3NobSh3bGNfaHdfaW5mb190ICp3bGNfaHcsIHVpbnQgb2Zmc2V0LCB1MTYgdikKK3ZvaWQgd2xjX2JtYWNfd3JpdGVfc2htKHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LCB1aW50IG9mZnNldCwgdTE2IHYpCiB7CiAJd2xjX2JtYWNfd3JpdGVfb2JqbWVtKHdsY19odywgb2Zmc2V0LCB2LCBPQkpBRERSX1NITV9TRUwpOwogfQpAQCAtMzkxMiw3ICszOTQyLDcgQEAKICAqIFNITSAnb2Zmc2V0JyBuZWVkcyB0byBiZSBhbiBldmVuIGFkZHJlc3MgYW5kCiAgKiBCdWZmZXIgbGVuZ3RoICdsZW4nIG11c3QgYmUgYW4gZXZlbiBudW1iZXIgb2YgYnl0ZXMKICAqLwotdm9pZCB3bGNfYm1hY19zZXRfc2htKHdsY19od19pbmZvX3QgKndsY19odywgdWludCBvZmZzZXQsIHUxNiB2LCBpbnQgbGVuKQordm9pZCB3bGNfYm1hY19zZXRfc2htKHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LCB1aW50IG9mZnNldCwgdTE2IHYsIGludCBsZW4pCiB7CiAJaW50IGk7CiAKQEAgLTM5MjksNyArMzk1OSw3IEBACiB9CiAKIHN0YXRpYyB1MTYKLXdsY19ibWFjX3JlYWRfb2JqbWVtKHdsY19od19pbmZvX3QgKndsY19odywgdWludCBvZmZzZXQsIHUzMiBzZWwpCit3bGNfYm1hY19yZWFkX29iam1lbShzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odywgdWludCBvZmZzZXQsIHUzMiBzZWwpCiB7CiAJZDExcmVnc190ICpyZWdzID0gd2xjX2h3LT5yZWdzOwogCXZvbGF0aWxlIHUxNiAqb2JqZGF0YV9sbyA9ICh2b2xhdGlsZSB1MTYgKikmcmVncy0+b2JqZGF0YTsKQEAgLTM5NTAsNyArMzk4MCw3IEBACiB9CiAKIHN0YXRpYyB2b2lkCi13bGNfYm1hY193cml0ZV9vYmptZW0od2xjX2h3X2luZm9fdCAqd2xjX2h3LCB1aW50IG9mZnNldCwgdTE2IHYsIHUzMiBzZWwpCit3bGNfYm1hY193cml0ZV9vYmptZW0oc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcsIHVpbnQgb2Zmc2V0LCB1MTYgdiwgdTMyIHNlbCkKIHsKIAlkMTFyZWdzX3QgKnJlZ3MgPSB3bGNfaHctPnJlZ3M7CiAJdm9sYXRpbGUgdTE2ICpvYmpkYXRhX2xvID0gKHZvbGF0aWxlIHUxNiAqKSZyZWdzLT5vYmpkYXRhOwpAQCAtMzk3Myw3ICs0MDAzLDcgQEAKICAqICdzZWwnIHNlbGVjdHMgdGhlIHR5cGUgb2YgbWVtb3J5CiAgKi8KIHZvaWQKLXdsY19ibWFjX2NvcHl0b19vYmptZW0od2xjX2h3X2luZm9fdCAqd2xjX2h3LCB1aW50IG9mZnNldCwgY29uc3Qgdm9pZCAqYnVmLAord2xjX2JtYWNfY29weXRvX29iam1lbShzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odywgdWludCBvZmZzZXQsIGNvbnN0IHZvaWQgKmJ1ZiwKIAkJICAgICAgIGludCBsZW4sIHUzMiBzZWwpCiB7CiAJdTE2IHY7CkBAIC0zOTk5LDcgKzQwMjksNyBAQAogICogJ3NlbCcgc2VsZWN0cyB0aGUgdHlwZSBvZiBtZW1vcnkKICAqLwogdm9pZAotd2xjX2JtYWNfY29weWZyb21fb2JqbWVtKHdsY19od19pbmZvX3QgKndsY19odywgdWludCBvZmZzZXQsIHZvaWQgKmJ1ZiwKK3dsY19ibWFjX2NvcHlmcm9tX29iam1lbShzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odywgdWludCBvZmZzZXQsIHZvaWQgKmJ1ZiwKIAkJCSBpbnQgbGVuLCB1MzIgc2VsKQogewogCXUxNiB2OwpAQCAtNDAyMCwxNiArNDA1MCwxNiBAQAogCX0KIH0KIAotdm9pZCB3bGNfYm1hY19jb3B5ZnJvbV92YXJzKHdsY19od19pbmZvX3QgKndsY19odywgY2hhciAqKmJ1ZiwgdWludCAqbGVuKQordm9pZCB3bGNfYm1hY19jb3B5ZnJvbV92YXJzKHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LCBjaGFyICoqYnVmLCB1aW50ICpsZW4pCiB7Ci0JV0xfVFJBQ0UoKCJ3bGNfYm1hY19jb3B5ZnJvbV92YXJzLCBudnJhbSB2YXJzIHRvdGxlbj0lZFxuIiwKLQkJICB3bGNfaHctPnZhcnNfc2l6ZSkpOworCVdMX1RSQUNFKCJ3bGNfYm1hY19jb3B5ZnJvbV92YXJzLCBudnJhbSB2YXJzIHRvdGxlbj0lZFxuIiwKKwkJIHdsY19ody0+dmFyc19zaXplKTsKIAogCSpidWYgPSB3bGNfaHctPnZhcnM7CiAJKmxlbiA9IHdsY19ody0+dmFyc19zaXplOwogfQogCi12b2lkIHdsY19ibWFjX3JldHJ5bGltaXRfdXBkKHdsY19od19pbmZvX3QgKndsY19odywgdTE2IFNSTCwgdTE2IExSTCkKK3ZvaWQgd2xjX2JtYWNfcmV0cnlsaW1pdF91cGQoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcsIHUxNiBTUkwsIHUxNiBMUkwpCiB7CiAJd2xjX2h3LT5TUkwgPSBTUkw7CiAJd2xjX2h3LT5MUkwgPSBMUkw7CkBAIC00MDQ3LDE3ICs0MDc3LDE3IEBACiAJfQogfQogCi12b2lkIHdsY19ibWFjX3NldF9ub3Jlc2V0KHdsY19od19pbmZvX3QgKndsY19odywgYm9vbCBub3Jlc2V0X2ZsYWcpCit2b2lkIHdsY19ibWFjX3NldF9ub3Jlc2V0KHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LCBib29sIG5vcmVzZXRfZmxhZykKIHsKIAl3bGNfaHctPm5vcmVzZXQgPSBub3Jlc2V0X2ZsYWc7CiB9CiAKLXZvaWQgd2xjX2JtYWNfc2V0X3Vjb2RlX2xvYWRlZCh3bGNfaHdfaW5mb190ICp3bGNfaHcsIGJvb2wgdWNvZGVfbG9hZGVkKQordm9pZCB3bGNfYm1hY19zZXRfdWNvZGVfbG9hZGVkKHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LCBib29sIHVjb2RlX2xvYWRlZCkKIHsKIAl3bGNfaHctPnVjb2RlX2xvYWRlZCA9IHVjb2RlX2xvYWRlZDsKIH0KIAotdm9pZCB3bGNfYm1hY19wbGxyZXEod2xjX2h3X2luZm9fdCAqd2xjX2h3LCBib29sIHNldCwgbWJvb2wgcmVxX2JpdCkKK3ZvaWQgd2xjX2JtYWNfcGxscmVxKHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LCBib29sIHNldCwgbWJvb2wgcmVxX2JpdCkKIHsKIAlBU1NFUlQocmVxX2JpdCk7CiAKQEAgLTQwODgsNyArNDExOCw3IEBACiAJcmV0dXJuOwogfQogCi12b2lkIHdsY19ibWFjX3NldF9jbGsod2xjX2h3X2luZm9fdCAqd2xjX2h3LCBib29sIG9uKQordm9pZCB3bGNfYm1hY19zZXRfY2xrKHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LCBib29sIG9uKQogewogCWlmIChvbikgewogCQkvKiBwb3dlciB1cCBwbGwgYW5kIG9zY2lsbGF0b3IgKi8KQEAgLTQxMTAsNyArNDE0MCw3IEBACiB9CiAKIC8qIHRoaXMgd2lsbCBiZSB0cnVlIGZvciBhbGwgYWkgY2hpcHMgKi8KLWJvb2wgd2xjX2JtYWNfdGFjbGVhcih3bGNfaHdfaW5mb190ICp3bGNfaHcsIGJvb2wgdGFfb2spCitib29sIHdsY19ibWFjX3RhY2xlYXIoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcsIGJvb2wgdGFfb2spCiB7CiAJcmV0dXJuIHRydWU7CiB9CkBAIC00MTE4LDcgKzQxNDgsNyBAQAogLyogTG93ZXIgZG93biByZWxldmFudCBHUElPcyBsaWtlIExFRCB3aGVuIGdvaW5nIGRvd24gdy9vCiAgKiBkb2luZyBQQ0kgY29uZmlnIGN5Y2xlcyBvciB0b3VjaGluZyBpbnRlcnJ1cHRzCiAgKi8KLXZvaWQgd2xjX2dwaW9fZmFzdF9kZWluaXQod2xjX2h3X2luZm9fdCAqd2xjX2h3KQordm9pZCB3bGNfZ3Bpb19mYXN0X2RlaW5pdChzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odykKIHsKIAlpZiAoKHdsY19odyA9PSBOVUxMKSB8fCAod2xjX2h3LT5zaWggPT0gTlVMTCkpCiAJCXJldHVybjsKQEAgLTQxMjYsMTcgKzQxNTYsMTcgQEAKIAkvKiBPbmx5IGNoaXBzIHdpdGggaW50ZXJuYWwgYnVzIG9yIFBDSUUgY29yZXMgb3IgY2VydGFpbiBQQ0kgY29yZXMKIAkgKiBhcmUgYWJsZSB0byBzd2l0Y2ggY29yZXMgdy9vIGRpc2FibGluZyBpbnRlcnJ1cHRzCiAJICovCi0JaWYgKCEoKEJVU1RZUEUod2xjX2h3LT5zaWgtPmJ1c3R5cGUpID09IFNJX0JVUykgfHwKLQkgICAgICAoKEJVU1RZUEUod2xjX2h3LT5zaWgtPmJ1c3R5cGUpID09IFBDSV9CVVMpICYmCisJaWYgKCEoKHdsY19ody0+c2loLT5idXN0eXBlID09IFNJX0JVUykgfHwKKwkgICAgICAoKHdsY19ody0+c2loLT5idXN0eXBlID09IFBDSV9CVVMpICYmCiAJICAgICAgICgod2xjX2h3LT5zaWgtPmJ1c2NvcmV0eXBlID09IFBDSUVfQ09SRV9JRCkgfHwKIAkJKHdsY19ody0+c2loLT5idXNjb3JlcmV2ID49IDEzKSkpKSkKIAkJcmV0dXJuOwogCi0JV0xfVFJBQ0UoKCJ3bCVkOiAlc1xuIiwgd2xjX2h3LT51bml0LCBfX2Z1bmNfXykpOworCVdMX1RSQUNFKCJ3bCVkOiAlc1xuIiwgd2xjX2h3LT51bml0LCBfX2Z1bmNfXyk7CiAJcmV0dXJuOwogfQogCi1ib29sIHdsY19ibWFjX3JhZGlvX2h3KHdsY19od19pbmZvX3QgKndsY19odywgYm9vbCBlbmFibGUpCitib29sIHdsY19ibWFjX3JhZGlvX2h3KHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LCBib29sIGVuYWJsZSkKIHsKIAkvKiBEbyBub3QgYWNjZXNzIFBoeSByZWdpc3RlcnMgaWYgY29yZSBpcyBub3QgdXAgKi8KIAlpZiAoc2lfaXNjb3JldXAod2xjX2h3LT5zaWgpID09IGZhbHNlKQpAQCAtNDE3MSw3ICs0MjAxLDcgQEAKIAlyZXR1cm4gdHJ1ZTsKIH0KIAotdTE2IHdsY19ibWFjX3JhdGVfc2htX29mZnNldCh3bGNfaHdfaW5mb190ICp3bGNfaHcsIHU4IHJhdGUpCit1MTYgd2xjX2JtYWNfcmF0ZV9zaG1fb2Zmc2V0KHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LCB1OCByYXRlKQogewogCXUxNiB0YWJsZV9wdHI7CiAJdTggcGh5X3JhdGUsIGluZGV4OwpAQCAtNDE5NSwxMiArNDIyNSwxMiBAQAogCXJldHVybiAyICogd2xjX2JtYWNfcmVhZF9zaG0od2xjX2h3LCB0YWJsZV9wdHIgKyAoaW5kZXggKiAyKSk7CiB9CiAKLXZvaWQgd2xjX2JtYWNfc2V0X3R4cHdyX3BlcmNlbnQod2xjX2h3X2luZm9fdCAqd2xjX2h3LCB1OCB2YWwpCit2b2lkIHdsY19ibWFjX3NldF90eHB3cl9wZXJjZW50KHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LCB1OCB2YWwpCiB7CiAJd2xjX3BoeV90eHB3cl9wZXJjZW50X3NldCh3bGNfaHctPmJhbmQtPnBpLCB2YWwpOwogfQogCi12b2lkIHdsY19ibWFjX2FudHNlbF9zZXQod2xjX2h3X2luZm9fdCAqd2xjX2h3LCB1MzIgYW50c2VsX2F2YWlsKQordm9pZCB3bGNfYm1hY19hbnRzZWxfc2V0KHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LCB1MzIgYW50c2VsX2F2YWlsKQogewogCXdsY19ody0+YW50c2VsX2F2YWlsID0gYW50c2VsX2F2YWlsOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9zeXMvd2xjX2JtYWMuaCBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvc3lzL3dsY19ibWFjLmgKaW5kZXggODcyYmM4ZC4uOTgxNTBhYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9zeXMvd2xjX2JtYWMuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3N5cy93bGNfYm1hYy5oCkBAIC01Nyw3ICs1Nyw4IEBACiAJfSBiYW5kW01BWEJBTkRTXTsKIH0gd2xjX2JtYWNfcmV2aW5mb190OwogCi0vKiBkdXAgc3RhdGUgYmV0d2VlbiBCTUFDKHdsY19od19pbmZvX3QpIGFuZCBISUdIKHdsY19pbmZvX3QpIGRyaXZlciAqLworLyogZHVwIHN0YXRlIGJldHdlZW4gQk1BQyhzdHJ1Y3Qgd2xjX2h3X2luZm8pIGFuZCBISUdIKHN0cnVjdCB3bGNfaW5mbykKKyAgIGRyaXZlciAqLwogdHlwZWRlZiBzdHJ1Y3Qgd2xjX2JtYWNfc3RhdGUgewogCXUzMiBtYWNod2NhcDsJLyogbWFjIGh3IGNhcGliaWxpdHkgKi8KIAl1MzIgcHJlYW1ibGVfb3ZyOwkvKiBwcmVhbWJsZSBvdmVycmlkZSAqLwpAQCAtMTMwLDE0OCArMTMxLDE0MyBAQAogCVdMQ0hXX1NUQVRFX0xBU1QKIH0gd2xjX2JtYWNfc3RhdGVfaWRfdDsKIAotZXh0ZXJuIGludCB3bGNfYm1hY19hdHRhY2god2xjX2luZm9fdCAqd2xjLCB1MTYgdmVuZG9yLCB1MTYgZGV2aWNlLAotCQkJICAgdWludCB1bml0LCBib29sIHBpb21vZGUsIG9zbF90ICpvc2gsIHZvaWQgKnJlZ3N2YSwKLQkJCSAgIHVpbnQgYnVzdHlwZSwgdm9pZCAqYnRwYXJhbSk7Ci1leHRlcm4gaW50IHdsY19ibWFjX2RldGFjaCh3bGNfaW5mb190ICp3bGMpOworZXh0ZXJuIGludCB3bGNfYm1hY19hdHRhY2goc3RydWN0IHdsY19pbmZvICp3bGMsIHUxNiB2ZW5kb3IsIHUxNiBkZXZpY2UsCisJCQkgICB1aW50IHVuaXQsIGJvb2wgcGlvbW9kZSwgc3RydWN0IG9zbF9pbmZvICpvc2gsCisJCQkgICB2b2lkICpyZWdzdmEsIHVpbnQgYnVzdHlwZSwgdm9pZCAqYnRwYXJhbSk7CitleHRlcm4gaW50IHdsY19ibWFjX2RldGFjaChzdHJ1Y3Qgd2xjX2luZm8gKndsYyk7CiBleHRlcm4gdm9pZCB3bGNfYm1hY193YXRjaGRvZyh2b2lkICphcmcpOwotZXh0ZXJuIHZvaWQgd2xjX2JtYWNfaW5mb19pbml0KHdsY19od19pbmZvX3QgKndsY19odyk7CitleHRlcm4gdm9pZCB3bGNfYm1hY19pbmZvX2luaXQoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcpOwogCiAvKiB1cC9kb3duLCByZXNldCwgY2xrICovCi0jaWZkZWYgV0xDX0xPVwotZXh0ZXJuIHZvaWQgd2xjX2JtYWNfeHRhbCh3bGNfaHdfaW5mb190ICp3bGNfaHcsIGJvb2wgd2FudCk7Ci0jZW5kaWYKK2V4dGVybiB2b2lkIHdsY19ibWFjX3h0YWwoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcsIGJvb2wgd2FudCk7CiAKLWV4dGVybiB2b2lkIHdsY19ibWFjX2NvcHl0b19vYmptZW0od2xjX2h3X2luZm9fdCAqd2xjX2h3LAorZXh0ZXJuIHZvaWQgd2xjX2JtYWNfY29weXRvX29iam1lbShzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odywKIAkJCQkgICB1aW50IG9mZnNldCwgY29uc3Qgdm9pZCAqYnVmLCBpbnQgbGVuLAogCQkJCSAgIHUzMiBzZWwpOwotZXh0ZXJuIHZvaWQgd2xjX2JtYWNfY29weWZyb21fb2JqbWVtKHdsY19od19pbmZvX3QgKndsY19odywgdWludCBvZmZzZXQsCitleHRlcm4gdm9pZCB3bGNfYm1hY19jb3B5ZnJvbV9vYmptZW0oc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcsIHVpbnQgb2Zmc2V0LAogCQkJCSAgICAgdm9pZCAqYnVmLCBpbnQgbGVuLCB1MzIgc2VsKTsKICNkZWZpbmUgd2xjX2JtYWNfY29weWZyb21fc2htKHdsY19odywgb2Zmc2V0LCBidWYsIGxlbikgICAgICAgICAgICAgICAgIFwKIAl3bGNfYm1hY19jb3B5ZnJvbV9vYmptZW0od2xjX2h3LCBvZmZzZXQsIGJ1ZiwgbGVuLCBPQkpBRERSX1NITV9TRUwpCiAjZGVmaW5lIHdsY19ibWFjX2NvcHl0b19zaG0od2xjX2h3LCBvZmZzZXQsIGJ1ZiwgbGVuKSAgICAgICAgICAgICAgICAgICBcCiAJd2xjX2JtYWNfY29weXRvX29iam1lbSh3bGNfaHcsIG9mZnNldCwgYnVmLCBsZW4sIE9CSkFERFJfU0hNX1NFTCkKIAotZXh0ZXJuIHZvaWQgd2xjX2JtYWNfY29yZV9waHlfY2xrKHdsY19od19pbmZvX3QgKndsY19odywgYm9vbCBjbGspOwotZXh0ZXJuIHZvaWQgd2xjX2JtYWNfY29yZV9waHlwbGxfcmVzZXQod2xjX2h3X2luZm9fdCAqd2xjX2h3KTsKLWV4dGVybiB2b2lkIHdsY19ibWFjX2NvcmVfcGh5cGxsX2N0bCh3bGNfaHdfaW5mb190ICp3bGNfaHcsIGJvb2wgb24pOwotZXh0ZXJuIHZvaWQgd2xjX2JtYWNfcGh5Y2xrX2ZnYyh3bGNfaHdfaW5mb190ICp3bGNfaHcsIGJvb2wgY2xrKTsKLWV4dGVybiB2b2lkIHdsY19ibWFjX21hY3BoeWNsa19zZXQod2xjX2h3X2luZm9fdCAqd2xjX2h3LCBib29sIGNsayk7Ci1leHRlcm4gdm9pZCB3bGNfYm1hY19waHlfcmVzZXQod2xjX2h3X2luZm9fdCAqd2xjX2h3KTsKLWV4dGVybiB2b2lkIHdsY19ibWFjX2NvcmVyZXNldCh3bGNfaHdfaW5mb190ICp3bGNfaHcsIHUzMiBmbGFncyk7Ci1leHRlcm4gdm9pZCB3bGNfYm1hY19yZXNldCh3bGNfaHdfaW5mb190ICp3bGNfaHcpOwotZXh0ZXJuIHZvaWQgd2xjX2JtYWNfaW5pdCh3bGNfaHdfaW5mb190ICp3bGNfaHcsIGNoYW5zcGVjX3QgY2hhbnNwZWMsCitleHRlcm4gdm9pZCB3bGNfYm1hY19jb3JlX3BoeV9jbGsoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcsIGJvb2wgY2xrKTsKK2V4dGVybiB2b2lkIHdsY19ibWFjX2NvcmVfcGh5cGxsX3Jlc2V0KHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3KTsKK2V4dGVybiB2b2lkIHdsY19ibWFjX2NvcmVfcGh5cGxsX2N0bChzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odywgYm9vbCBvbik7CitleHRlcm4gdm9pZCB3bGNfYm1hY19waHljbGtfZmdjKHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LCBib29sIGNsayk7CitleHRlcm4gdm9pZCB3bGNfYm1hY19tYWNwaHljbGtfc2V0KHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LCBib29sIGNsayk7CitleHRlcm4gdm9pZCB3bGNfYm1hY19waHlfcmVzZXQoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcpOworZXh0ZXJuIHZvaWQgd2xjX2JtYWNfY29yZXJlc2V0KHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LCB1MzIgZmxhZ3MpOworZXh0ZXJuIHZvaWQgd2xjX2JtYWNfcmVzZXQoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcpOworZXh0ZXJuIHZvaWQgd2xjX2JtYWNfaW5pdChzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odywgY2hhbnNwZWNfdCBjaGFuc3BlYywKIAkJCSAgYm9vbCBtdXRlKTsKLWV4dGVybiBpbnQgd2xjX2JtYWNfdXBfcHJlcCh3bGNfaHdfaW5mb190ICp3bGNfaHcpOwotZXh0ZXJuIGludCB3bGNfYm1hY191cF9maW5pc2god2xjX2h3X2luZm9fdCAqd2xjX2h3KTsKLWV4dGVybiBpbnQgd2xjX2JtYWNfZG93bl9wcmVwKHdsY19od19pbmZvX3QgKndsY19odyk7Ci1leHRlcm4gaW50IHdsY19ibWFjX2Rvd25fZmluaXNoKHdsY19od19pbmZvX3QgKndsY19odyk7Ci1leHRlcm4gdm9pZCB3bGNfYm1hY19jb3JlcmVzZXQod2xjX2h3X2luZm9fdCAqd2xjX2h3LCB1MzIgZmxhZ3MpOwotZXh0ZXJuIHZvaWQgd2xjX2JtYWNfc3dpdGNoX21hY2ZyZXEod2xjX2h3X2luZm9fdCAqd2xjX2h3LCB1OCBzcHVybW9kZSk7CitleHRlcm4gaW50IHdsY19ibWFjX3VwX3ByZXAoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcpOworZXh0ZXJuIGludCB3bGNfYm1hY191cF9maW5pc2goc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcpOworZXh0ZXJuIGludCB3bGNfYm1hY19kb3duX3ByZXAoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcpOworZXh0ZXJuIGludCB3bGNfYm1hY19kb3duX2ZpbmlzaChzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odyk7CitleHRlcm4gdm9pZCB3bGNfYm1hY19jb3JlcmVzZXQoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcsIHUzMiBmbGFncyk7CitleHRlcm4gdm9pZCB3bGNfYm1hY19zd2l0Y2hfbWFjZnJlcShzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odywgdTggc3B1cm1vZGUpOwogCiAvKiBjaGFuc3BlYywgdWNvZGUgaW50ZXJmYWNlICovCi1leHRlcm4gaW50IHdsY19ibWFjX2JhbmR0eXBlKHdsY19od19pbmZvX3QgKndsY19odyk7Ci1leHRlcm4gdm9pZCB3bGNfYm1hY19zZXRfY2hhbnNwZWMod2xjX2h3X2luZm9fdCAqd2xjX2h3LCBjaGFuc3BlY190IGNoYW5zcGVjLAorZXh0ZXJuIGludCB3bGNfYm1hY19iYW5kdHlwZShzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odyk7CitleHRlcm4gdm9pZCB3bGNfYm1hY19zZXRfY2hhbnNwZWMoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcsCisJCQkJICBjaGFuc3BlY190IGNoYW5zcGVjLAogCQkJCSAgYm9vbCBtdXRlLCBzdHJ1Y3QgdHhwd3JfbGltaXRzICp0eHB3cik7CiAKLWV4dGVybiB2b2lkIHdsY19ibWFjX3R4Zmlmbyh3bGNfaHdfaW5mb190ICp3bGNfaHcsIHVpbnQgZmlmbywgdm9pZCAqcCwKK2V4dGVybiB2b2lkIHdsY19ibWFjX3R4ZmlmbyhzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odywgdWludCBmaWZvLCB2b2lkICpwLAogCQkJICAgIGJvb2wgY29tbWl0LCB1MTYgZnJhbWVpZCwgdTggdHhwa3RwZW5kKTsKLWV4dGVybiBpbnQgd2xjX2JtYWNfeG10Zmlmb19zel9nZXQod2xjX2h3X2luZm9fdCAqd2xjX2h3LCB1aW50IGZpZm8sCitleHRlcm4gaW50IHdsY19ibWFjX3htdGZpZm9fc3pfZ2V0KHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LCB1aW50IGZpZm8sCiAJCQkJICAgdWludCAqYmxvY2tzKTsKLWV4dGVybiB2b2lkIHdsY19ibWFjX21oZih3bGNfaHdfaW5mb190ICp3bGNfaHcsIHU4IGlkeCwgdTE2IG1hc2ssCitleHRlcm4gdm9pZCB3bGNfYm1hY19taGYoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcsIHU4IGlkeCwgdTE2IG1hc2ssCiAJCQkgdTE2IHZhbCwgaW50IGJhbmRzKTsKLWV4dGVybiB2b2lkIHdsY19ibWFjX21jdHJsKHdsY19od19pbmZvX3QgKndsY19odywgdTMyIG1hc2ssIHUzMiB2YWwpOwotZXh0ZXJuIHUxNiB3bGNfYm1hY19taGZfZ2V0KHdsY19od19pbmZvX3QgKndsY19odywgdTggaWR4LCBpbnQgYmFuZHMpOwotZXh0ZXJuIGludCB3bGNfYm1hY194bXRmaWZvX3N6X3NldCh3bGNfaHdfaW5mb190ICp3bGNfaHcsIHVpbnQgZmlmbywKK2V4dGVybiB2b2lkIHdsY19ibWFjX21jdHJsKHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LCB1MzIgbWFzaywgdTMyIHZhbCk7CitleHRlcm4gdTE2IHdsY19ibWFjX21oZl9nZXQoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcsIHU4IGlkeCwgaW50IGJhbmRzKTsKK2V4dGVybiBpbnQgd2xjX2JtYWNfeG10Zmlmb19zel9zZXQoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcsIHVpbnQgZmlmbywKIAkJCQkgICB1aW50IGJsb2Nrcyk7Ci1leHRlcm4gdm9pZCB3bGNfYm1hY190eGFudF9zZXQod2xjX2h3X2luZm9fdCAqd2xjX2h3LCB1MTYgcGh5dHhhbnQpOwotZXh0ZXJuIHUxNiB3bGNfYm1hY19nZXRfdHhhbnQod2xjX2h3X2luZm9fdCAqd2xjX2h3KTsKLWV4dGVybiB2b2lkIHdsY19ibWFjX2FudHNlbF90eXBlX3NldCh3bGNfaHdfaW5mb190ICp3bGNfaHcsIHU4IGFudHNlbF90eXBlKTsKLWV4dGVybiBpbnQgd2xjX2JtYWNfcmV2aW5mb19nZXQod2xjX2h3X2luZm9fdCAqd2xjX2h3LAorZXh0ZXJuIHZvaWQgd2xjX2JtYWNfdHhhbnRfc2V0KHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LCB1MTYgcGh5dHhhbnQpOworZXh0ZXJuIHUxNiB3bGNfYm1hY19nZXRfdHhhbnQoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcpOworZXh0ZXJuIHZvaWQgd2xjX2JtYWNfYW50c2VsX3R5cGVfc2V0KHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LAorCQkJCSAgICAgdTggYW50c2VsX3R5cGUpOworZXh0ZXJuIGludCB3bGNfYm1hY19yZXZpbmZvX2dldChzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odywKIAkJCQl3bGNfYm1hY19yZXZpbmZvX3QgKnJldmluZm8pOwotZXh0ZXJuIGludCB3bGNfYm1hY19zdGF0ZV9nZXQod2xjX2h3X2luZm9fdCAqd2xjX2h3LCB3bGNfYm1hY19zdGF0ZV90ICpzdGF0ZSk7Ci1leHRlcm4gdm9pZCB3bGNfYm1hY193cml0ZV9zaG0od2xjX2h3X2luZm9fdCAqd2xjX2h3LCB1aW50IG9mZnNldCwgdTE2IHYpOwotZXh0ZXJuIHUxNiB3bGNfYm1hY19yZWFkX3NobSh3bGNfaHdfaW5mb190ICp3bGNfaHcsIHVpbnQgb2Zmc2V0KTsKLWV4dGVybiB2b2lkIHdsY19ibWFjX3NldF9zaG0od2xjX2h3X2luZm9fdCAqd2xjX2h3LCB1aW50IG9mZnNldCwgdTE2IHYsCitleHRlcm4gaW50IHdsY19ibWFjX3N0YXRlX2dldChzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odywKKwkJCSAgICAgIHdsY19ibWFjX3N0YXRlX3QgKnN0YXRlKTsKK2V4dGVybiB2b2lkIHdsY19ibWFjX3dyaXRlX3NobShzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odywgdWludCBvZmZzZXQsIHUxNiB2KTsKK2V4dGVybiB1MTYgd2xjX2JtYWNfcmVhZF9zaG0oc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcsIHVpbnQgb2Zmc2V0KTsKK2V4dGVybiB2b2lkIHdsY19ibWFjX3NldF9zaG0oc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcsIHVpbnQgb2Zmc2V0LCB1MTYgdiwKIAkJCSAgICAgaW50IGxlbik7Ci1leHRlcm4gdm9pZCB3bGNfYm1hY193cml0ZV90ZW1wbGF0ZV9yYW0od2xjX2h3X2luZm9fdCAqd2xjX2h3LCBpbnQgb2Zmc2V0LAorZXh0ZXJuIHZvaWQgd2xjX2JtYWNfd3JpdGVfdGVtcGxhdGVfcmFtKHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LCBpbnQgb2Zmc2V0LAogCQkJCQlpbnQgbGVuLCB2b2lkICpidWYpOwotZXh0ZXJuIHZvaWQgd2xjX2JtYWNfY29weWZyb21fdmFycyh3bGNfaHdfaW5mb190ICp3bGNfaHcsIGNoYXIgKipidWYsCitleHRlcm4gdm9pZCB3bGNfYm1hY19jb3B5ZnJvbV92YXJzKHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LCBjaGFyICoqYnVmLAogCQkJCSAgIHVpbnQgKmxlbik7CiAKLWV4dGVybiB2b2lkIHdsY19ibWFjX3Byb2Nlc3NfcHNfc3dpdGNoKHdsY19od19pbmZvX3QgKndsYywKK2V4dGVybiB2b2lkIHdsY19ibWFjX3Byb2Nlc3NfcHNfc3dpdGNoKHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjLAogCQkJCSAgICAgICBzdHJ1Y3QgZXRoZXJfYWRkciAqZWEsIHM4IHBzX29uKTsKLWV4dGVybiB2b2lkIHdsY19ibWFjX2h3X2V0aGVyYWRkcih3bGNfaHdfaW5mb190ICp3bGNfaHcsCitleHRlcm4gdm9pZCB3bGNfYm1hY19od19ldGhlcmFkZHIoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcsCiAJCQkJICBzdHJ1Y3QgZXRoZXJfYWRkciAqZWEpOwotZXh0ZXJuIHZvaWQgd2xjX2JtYWNfc2V0X2h3X2V0aGVyYWRkcih3bGNfaHdfaW5mb190ICp3bGNfaHcsCitleHRlcm4gdm9pZCB3bGNfYm1hY19zZXRfaHdfZXRoZXJhZGRyKHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LAogCQkJCSAgICAgIHN0cnVjdCBldGhlcl9hZGRyICplYSk7Ci1leHRlcm4gYm9vbCB3bGNfYm1hY192YWxpZGF0ZV9jaGlwX2FjY2Vzcyh3bGNfaHdfaW5mb190ICp3bGNfaHcpOworZXh0ZXJuIGJvb2wgd2xjX2JtYWNfdmFsaWRhdGVfY2hpcF9hY2Nlc3Moc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcpOwogCi1leHRlcm4gYm9vbCB3bGNfYm1hY19yYWRpb19yZWFkX2h3ZGlzYWJsZWQod2xjX2h3X2luZm9fdCAqd2xjX2h3KTsKLWV4dGVybiB2b2lkIHdsY19ibWFjX3NldF9zaG9ydHNsb3Qod2xjX2h3X2luZm9fdCAqd2xjX2h3LCBib29sIHNob3J0c2xvdCk7Ci1leHRlcm4gdm9pZCB3bGNfYm1hY19tdXRlKHdsY19od19pbmZvX3QgKndsY19odywgYm9vbCB3YW50LCBtYm9vbCBmbGFncyk7Ci1leHRlcm4gdm9pZCB3bGNfYm1hY19zZXRfZGVhZih3bGNfaHdfaW5mb190ICp3bGNfaHcsIGJvb2wgdXNlcl9mbGFnKTsKLWV4dGVybiB2b2lkIHdsY19ibWFjX2JhbmRfc3RmX3NzX3NldCh3bGNfaHdfaW5mb190ICp3bGNfaHcsIHU4IHN0Zl9tb2RlKTsKK2V4dGVybiBib29sIHdsY19ibWFjX3JhZGlvX3JlYWRfaHdkaXNhYmxlZChzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odyk7CitleHRlcm4gdm9pZCB3bGNfYm1hY19zZXRfc2hvcnRzbG90KHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LCBib29sIHNob3J0c2xvdCk7CitleHRlcm4gdm9pZCB3bGNfYm1hY19tdXRlKHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LCBib29sIHdhbnQsIG1ib29sIGZsYWdzKTsKK2V4dGVybiB2b2lkIHdsY19ibWFjX3NldF9kZWFmKHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LCBib29sIHVzZXJfZmxhZyk7CitleHRlcm4gdm9pZCB3bGNfYm1hY19iYW5kX3N0Zl9zc19zZXQoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcsIHU4IHN0Zl9tb2RlKTsKIAotZXh0ZXJuIHZvaWQgd2xjX2JtYWNfd2FpdF9mb3Jfd2FrZSh3bGNfaHdfaW5mb190ICp3bGNfaHcpOwotZXh0ZXJuIGJvb2wgd2xjX2JtYWNfdHhfZmlmb19zdXNwZW5kZWQod2xjX2h3X2luZm9fdCAqd2xjX2h3LCB1aW50IHR4X2ZpZm8pOwotZXh0ZXJuIHZvaWQgd2xjX2JtYWNfdHhfZmlmb19zdXNwZW5kKHdsY19od19pbmZvX3QgKndsY19odywgdWludCB0eF9maWZvKTsKLWV4dGVybiB2b2lkIHdsY19ibWFjX3R4X2ZpZm9fcmVzdW1lKHdsY19od19pbmZvX3QgKndsY19odywgdWludCB0eF9maWZvKTsKK2V4dGVybiB2b2lkIHdsY19ibWFjX3dhaXRfZm9yX3dha2Uoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcpOworZXh0ZXJuIGJvb2wgd2xjX2JtYWNfdHhfZmlmb19zdXNwZW5kZWQoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcsCisJCQkJICAgICAgIHVpbnQgdHhfZmlmbyk7CitleHRlcm4gdm9pZCB3bGNfYm1hY190eF9maWZvX3N1c3BlbmQoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcsIHVpbnQgdHhfZmlmbyk7CitleHRlcm4gdm9pZCB3bGNfYm1hY190eF9maWZvX3Jlc3VtZShzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odywgdWludCB0eF9maWZvKTsKIAotZXh0ZXJuIHZvaWQgd2xjX3Vjb2RlX3dha2Vfb3ZlcnJpZGVfc2V0KHdsY19od19pbmZvX3QgKndsY19odywKK2V4dGVybiB2b2lkIHdsY191Y29kZV93YWtlX292ZXJyaWRlX3NldChzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odywKIAkJCQkJdTMyIG92ZXJyaWRlX2JpdCk7Ci1leHRlcm4gdm9pZCB3bGNfdWNvZGVfd2FrZV9vdmVycmlkZV9jbGVhcih3bGNfaHdfaW5mb190ICp3bGNfaHcsCitleHRlcm4gdm9pZCB3bGNfdWNvZGVfd2FrZV9vdmVycmlkZV9jbGVhcihzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odywKIAkJCQkJICB1MzIgb3ZlcnJpZGVfYml0KTsKIAotZXh0ZXJuIHZvaWQgd2xjX2JtYWNfc2V0X3JjbXRhKHdsY19od19pbmZvX3QgKndsY19odywgaW50IGlkeCwKK2V4dGVybiB2b2lkIHdsY19ibWFjX3NldF9yY210YShzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odywgaW50IGlkeCwKIAkJCSAgICAgICBjb25zdCBzdHJ1Y3QgZXRoZXJfYWRkciAqYWRkcik7Ci1leHRlcm4gdm9pZCB3bGNfYm1hY19zZXRfYWRkcm1hdGNoKHdsY19od19pbmZvX3QgKndsY19odywgaW50IG1hdGNoX3JlZ19vZmZzZXQsCitleHRlcm4gdm9pZCB3bGNfYm1hY19zZXRfYWRkcm1hdGNoKHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LAorCQkJCSAgIGludCBtYXRjaF9yZWdfb2Zmc2V0LAogCQkJCSAgIGNvbnN0IHN0cnVjdCBldGhlcl9hZGRyICphZGRyKTsKLWV4dGVybiB2b2lkIHdsY19ibWFjX3dyaXRlX2h3X2JjbnRlbXBsYXRlcyh3bGNfaHdfaW5mb190ICp3bGNfaHcsIHZvaWQgKmJjbiwKLQkJCQkJICAgaW50IGxlbiwgYm9vbCBib3RoKTsKK2V4dGVybiB2b2lkIHdsY19ibWFjX3dyaXRlX2h3X2JjbnRlbXBsYXRlcyhzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odywKKwkJCQkJICAgdm9pZCAqYmNuLCBpbnQgbGVuLCBib29sIGJvdGgpOwogCi1leHRlcm4gdm9pZCB3bGNfYm1hY19yZWFkX3RzZih3bGNfaHdfaW5mb190ICp3bGNfaHcsIHUzMiAqdHNmX2xfcHRyLAorZXh0ZXJuIHZvaWQgd2xjX2JtYWNfcmVhZF90c2Yoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcsIHUzMiAqdHNmX2xfcHRyLAogCQkJICAgICAgdTMyICp0c2ZfaF9wdHIpOwotZXh0ZXJuIHZvaWQgd2xjX2JtYWNfc2V0X2N3bWluKHdsY19od19pbmZvX3QgKndsY19odywgdTE2IG5ld21pbik7Ci1leHRlcm4gdm9pZCB3bGNfYm1hY19zZXRfY3dtYXgod2xjX2h3X2luZm9fdCAqd2xjX2h3LCB1MTYgbmV3bWF4KTsKLWV4dGVybiB2b2lkIHdsY19ibWFjX3NldF9ub3Jlc2V0KHdsY19od19pbmZvX3QgKndsYywgYm9vbCBub3Jlc2V0X2ZsYWcpOwotZXh0ZXJuIHZvaWQgd2xjX2JtYWNfc2V0X3Vjb2RlX2xvYWRlZCh3bGNfaHdfaW5mb190ICp3bGMsIGJvb2wgdWNvZGVfbG9hZGVkKTsKK2V4dGVybiB2b2lkIHdsY19ibWFjX3NldF9jd21pbihzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odywgdTE2IG5ld21pbik7CitleHRlcm4gdm9pZCB3bGNfYm1hY19zZXRfY3dtYXgoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcsIHUxNiBuZXdtYXgpOworZXh0ZXJuIHZvaWQgd2xjX2JtYWNfc2V0X25vcmVzZXQoc3RydWN0IHdsY19od19pbmZvICp3bGMsIGJvb2wgbm9yZXNldF9mbGFnKTsKK2V4dGVybiB2b2lkIHdsY19ibWFjX3NldF91Y29kZV9sb2FkZWQoc3RydWN0IHdsY19od19pbmZvICp3bGMsCisJCQkJICAgICAgYm9vbCB1Y29kZV9sb2FkZWQpOwogCi1leHRlcm4gdm9pZCB3bGNfYm1hY19yZXRyeWxpbWl0X3VwZCh3bGNfaHdfaW5mb190ICp3bGNfaHcsIHUxNiBTUkwsCitleHRlcm4gdm9pZCB3bGNfYm1hY19yZXRyeWxpbWl0X3VwZChzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odywgdTE2IFNSTCwKIAkJCQkgICAgdTE2IExSTCk7CiAKLWV4dGVybiB2b2lkIHdsY19ibWFjX2ZpZm9lcnJvcnMod2xjX2h3X2luZm9fdCAqd2xjX2h3KTsKK2V4dGVybiB2b2lkIHdsY19ibWFjX2ZpZm9lcnJvcnMoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcpOwogCi0jaWZkZWYgV0xDX0hJR0hfT05MWQotZXh0ZXJuIHZvaWQgd2xjX2JtYWNfZG5nbF9yZWJvb3QocnBjX2luZm9fdCAqKTsKLWV4dGVybiB2b2lkIHdsY19ibWFjX2RuZ2xfcnBjX2FnZyhycGNfaW5mb190ICosIHUxNiBhZ2cpOwotZXh0ZXJuIHZvaWQgd2xjX2JtYWNfZG5nbF9ycGNfbXNnbGV2ZWwocnBjX2luZm9fdCAqLCB1MTYgbGV2ZWwpOwotZXh0ZXJuIHZvaWQgd2xjX2JtYWNfZG5nbF9ycGNfdHhxX3dtX3NldChycGNfaW5mb190ICpycGMsIHUzMiB3bSk7Ci1leHRlcm4gdm9pZCB3bGNfYm1hY19kbmdsX3JwY190eHFfd21fZ2V0KHJwY19pbmZvX3QgKnJwYywgdTMyICp3bSk7Ci1leHRlcm4gdm9pZCB3bGNfYm1hY19kbmdsX3JwY19hZ2dfbGltaXRfc2V0KHJwY19pbmZvX3QgKnJwYywgdTMyIHZhbCk7Ci1leHRlcm4gdm9pZCB3bGNfYm1hY19kbmdsX3JwY19hZ2dfbGltaXRfZ2V0KHJwY19pbmZvX3QgKnJwYywgdTMyICpwdmFsKTsKLWV4dGVybiBpbnQgd2xjX2JtYWNfZGVidWdfdGVtcGxhdGUod2xjX2h3X2luZm9fdCAqd2xjX2h3KTsKLSNlbmRpZgogCiAvKiBBUEkgZm9yIEJNQUMgZHJpdmVyIChlLmcuIHdsY19waHkuYyBldGMpICovCiAKLWV4dGVybiB2b2lkIHdsY19ibWFjX2J3X3NldCh3bGNfaHdfaW5mb190ICp3bGNfaHcsIHUxNiBidyk7Ci1leHRlcm4gdm9pZCB3bGNfYm1hY19wbGxyZXEod2xjX2h3X2luZm9fdCAqd2xjX2h3LCBib29sIHNldCwgbWJvb2wgcmVxX2JpdCk7Ci1leHRlcm4gdm9pZCB3bGNfYm1hY19zZXRfY2xrKHdsY19od19pbmZvX3QgKndsY19odywgYm9vbCBvbik7Ci1leHRlcm4gYm9vbCB3bGNfYm1hY190YWNsZWFyKHdsY19od19pbmZvX3QgKndsY19odywgYm9vbCB0YV9vayk7CitleHRlcm4gdm9pZCB3bGNfYm1hY19id19zZXQoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcsIHUxNiBidyk7CitleHRlcm4gdm9pZCB3bGNfYm1hY19wbGxyZXEoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcsIGJvb2wgc2V0LAorCQkJICAgIG1ib29sIHJlcV9iaXQpOworZXh0ZXJuIHZvaWQgd2xjX2JtYWNfc2V0X2NsayhzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odywgYm9vbCBvbik7CitleHRlcm4gYm9vbCB3bGNfYm1hY190YWNsZWFyKHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LCBib29sIHRhX29rKTsKIGV4dGVybiB2b2lkIHdsY19ibWFjX2h3X3VwKHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3KTsKIAotZXh0ZXJuIHZvaWQgd2xjX2JtYWNfZHVtcCh3bGNfaHdfaW5mb190ICp3bGNfaHcsIHN0cnVjdCBiY21zdHJidWYgKmIsCitleHRlcm4gdm9pZCB3bGNfYm1hY19kdW1wKHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LCBzdHJ1Y3QgYmNtc3RyYnVmICpiLAogCQkJICB3bGNfYm1hY19kdW1wX2lkX3QgZHVtcF9pZCk7Ci1leHRlcm4gdm9pZCB3bGNfZ3Bpb19mYXN0X2RlaW5pdCh3bGNfaHdfaW5mb190ICp3bGNfaHcpOworZXh0ZXJuIHZvaWQgd2xjX2dwaW9fZmFzdF9kZWluaXQoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcpOwogCi1leHRlcm4gYm9vbCB3bGNfYm1hY19yYWRpb19odyh3bGNfaHdfaW5mb190ICp3bGNfaHcsIGJvb2wgZW5hYmxlKTsKLWV4dGVybiB1MTYgd2xjX2JtYWNfcmF0ZV9zaG1fb2Zmc2V0KHdsY19od19pbmZvX3QgKndsY19odywgdTggcmF0ZSk7CitleHRlcm4gYm9vbCB3bGNfYm1hY19yYWRpb19odyhzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odywgYm9vbCBlbmFibGUpOworZXh0ZXJuIHUxNiB3bGNfYm1hY19yYXRlX3NobV9vZmZzZXQoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcsIHU4IHJhdGUpOwogCi1leHRlcm4gdm9pZCB3bGNfYm1hY19hc3NlcnRfdHlwZV9zZXQod2xjX2h3X2luZm9fdCAqd2xjX2h3LCB1MzIgdHlwZSk7Ci1leHRlcm4gdm9pZCB3bGNfYm1hY19zZXRfdHhwd3JfcGVyY2VudCh3bGNfaHdfaW5mb190ICp3bGNfaHcsIHU4IHZhbCk7Ci1leHRlcm4gdm9pZCB3bGNfYm1hY19ibGlua19zeW5jKHdsY19od19pbmZvX3QgKndsY19odywgdTMyIGxlZF9waW5zKTsKLWV4dGVybiB2b2lkIHdsY19ibWFjX2lmc2N0bF9lZGNyc19zZXQod2xjX2h3X2luZm9fdCAqd2xjX2h3LCBib29sIGFiaWUsCitleHRlcm4gdm9pZCB3bGNfYm1hY19hc3NlcnRfdHlwZV9zZXQoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcsIHUzMiB0eXBlKTsKK2V4dGVybiB2b2lkIHdsY19ibWFjX3NldF90eHB3cl9wZXJjZW50KHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LCB1OCB2YWwpOworZXh0ZXJuIHZvaWQgd2xjX2JtYWNfYmxpbmtfc3luYyhzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odywgdTMyIGxlZF9waW5zKTsKK2V4dGVybiB2b2lkIHdsY19ibWFjX2lmc2N0bF9lZGNyc19zZXQoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcsIGJvb2wgYWJpZSwKIAkJCQkgICAgICBib29sIGlzaHQpOwogCi1leHRlcm4gdm9pZCB3bGNfYm1hY19hbnRzZWxfc2V0KHdsY19od19pbmZvX3QgKndsY19odywgdTMyIGFudHNlbF9hdmFpbCk7CitleHRlcm4gdm9pZCB3bGNfYm1hY19hbnRzZWxfc2V0KHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LCB1MzIgYW50c2VsX2F2YWlsKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvc3lzL3dsY19ic3NjZmcuaCBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvc3lzL3dsY19ic3NjZmcuaAppbmRleCBhZTU1NDJhLi5kNmExOTcxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3N5cy93bGNfYnNzY2ZnLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9zeXMvd2xjX2Jzc2NmZy5oCkBAIC0zNCw3ICszNCw4IEBACiAjZGVmaW5lIE1BWE1BQ0xJU1QJCTY0CS8qIG1heCAjIHNvdXJjZSBNQUMgbWF0Y2hlcyAqLwogI2RlZmluZSBCQ05fVEVNUExBVEVfQ09VTlQgCTIKIAotLyogSXRlcmF0b3IgZm9yICJhc3NvY2lhdGVkIiBTVEEgYnNzIGNvbmZpZ3M6ICAod2xjX2luZm9fdCAqd2xjLCBpbnQgaWR4LCB3bGNfYnNzY2ZnX3QgKmNmZykgKi8KKy8qIEl0ZXJhdG9yIGZvciAiYXNzb2NpYXRlZCIgU1RBIGJzcyBjb25maWdzOgorICAgKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCBpbnQgaWR4LCB3bGNfYnNzY2ZnX3QgKmNmZykgKi8KICNkZWZpbmUgRk9SRUFDSF9BU19TVEEod2xjLCBpZHgsIGNmZykgXAogCWZvciAoaWR4ID0gMDsgKGludCkgaWR4IDwgV0xDX01BWEJTU0NGRzsgaWR4KyspIFwKIAkJaWYgKChjZmcgPSAod2xjKS0+YnNzY2ZnW2lkeF0pICYmIEJTU0NGR19TVEEoY2ZnKSAmJiBjZmctPmFzc29jaWF0ZWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3N5cy93bGNfY2ZnLmggYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3N5cy93bGNfY2ZnLmgKaW5kZXggYTQxNWUxZi4uM2RlY2I3ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9zeXMvd2xjX2NmZy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvc3lzL3dsY19jZmcuaApAQCAtMjMsMTQgKzIzLDYgQEAKIAogI2RlZmluZSBJU19TSU5HTEVCQU5EXzVHKGRldmljZSkJMAogCi0vKiBLZWVwIFdMQ19ISUdIX09OTFksIFdMQ19TUExJVCBmb3IgVVNCIGV4dGVuc2lvbiBsYXRlciBvbiAqLwotI2lmICFkZWZpbmVkKFdMQ19MT1cpCi0jZGVmaW5lIFdMQ19ISUdIX09OTFkKLSNlbmRpZgotI2lmICFkZWZpbmVkKFdMQ19MT1cpCi0jZGVmaW5lIFdMQ19TUExJVAotI2VuZGlmCi0KIC8qICoqKiogQ29yZSB0eXBlL3JldiBkZWZhdWx0cyAqKioqICovCiAjZGVmaW5lIEQxMV9ERUZBVUxUCTB4MGZmZmZmYjAJLyogU3VwcG9ydGVkICBEMTEgcmV2czogNCwgNSwgNy0yNwogCQkJCQkgKiBhbHNvIG5lZWQgdG8gdXBkYXRlIHdsYy5oIE1BWENPUkVSRVYKQEAgLTYxLDIyICs1Myw2IEBACiAJCQkJCSAqICAgICAgMyAgICAgICA1MzU2YTAKIAkJCQkJICovCiAKLSNpZmRlZiBCQ01TRElPCi0jZGVmaW5lIEQxMUNPTkYgMHgxMDAwMDAKLSNkZWZpbmUgU1NMUE5DT05GIDIKLSNkZWZpbmUgR0NDT05GCTAKLSNkZWZpbmUgQUNDT05GCTAKLSNkZWZpbmUgTkNPTkYJMAotI2RlZmluZSBMUENPTkYJMAotI2RlZmluZSBMQ05DT05GCTAKLSNkZWZpbmUgTlRYRCAzMgotI2RlZmluZSBOUlhEIDE2Ci0jZGVmaW5lIE5SWEJVRlBPU1QgOAotI2RlZmluZSBXTENfREFUQUhJV0FUIDMyCi0jZGVmaW5lIFJYQk5EIDgKLSNkZWZpbmUgTUFYUEtUQ0IgNjQKLSNkZWZpbmUgQU1QRFVfTlVNX01QRFUgOAotI2VuZGlmCiAKIC8qIEZvciB1bmRlZmluZWQgdmFsdWVzLCB1c2UgZGVmYXVsdHMgKi8KICNpZm5kZWYgRDExQ09ORgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9zeXMvd2xjX2NoYW5uZWwuYyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvc3lzL3dsY19jaGFubmVsLmMKaW5kZXggNTA5MjgwMy4uYTM1YzE1MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9zeXMvd2xjX2NoYW5uZWwuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3N5cy93bGNfY2hhbm5lbC5jCkBAIC0xOSwxNiArMTksMjEgQEAKICNpbmNsdWRlIDxiY21kZWZzLmg+CiAjaW5jbHVkZSA8d2xjX2NmZy5oPgogI2luY2x1ZGUgPG9zbC5oPgotI2luY2x1ZGUgPGxpbnV4dmVyLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8YmNtdXRpbHMuaD4KICNpbmNsdWRlIDxzaXV0aWxzLmg+CisjaW5jbHVkZSA8c2JobmRwaW8uaD4KKyNpbmNsdWRlIDxzYmhuZGRtYS5oPgogI2luY2x1ZGUgPHdsaW9jdGwuaD4KICNpbmNsdWRlIDx3bGNfcHViLmg+CiAjaW5jbHVkZSA8d2xjX2tleS5oPgorI2luY2x1ZGUgPHdsY19ldmVudC5oPgogI2luY2x1ZGUgPHdsY19tYWM4MDIxMS5oPgogI2luY2x1ZGUgPHdsY19ibWFjLmg+CiAjaW5jbHVkZSA8d2xjX3N0Zi5oPgogI2luY2x1ZGUgPHdsY19jaGFubmVsLmg+CisjaW5jbHVkZSA8d2xfZGJnLmg+CiAKIHR5cGVkZWYgc3RydWN0IHdsY19jbV9iYW5kIHsKIAl1OCBsb2NhbGVfZmxhZ3M7CS8qIGxvY2FsZV9pbmZvX3QgZmxhZ3MgKi8KQEAgLTM5LDggKzQ0LDggQEAKIH0gd2xjX2NtX2JhbmRfdDsKIAogc3RydWN0IHdsY19jbV9pbmZvIHsKLQl3bGNfcHViX3QgKnB1YjsKLQl3bGNfaW5mb190ICp3bGM7CisJc3RydWN0IHdsY19wdWIgKnB1YjsKKwlzdHJ1Y3Qgd2xjX2luZm8gKndsYzsKIAljaGFyIHNyb21fY2NvZGVbV0xDX0NOVFJZX0JVRl9TWl07CS8qIENvdW50cnkgQ29kZSBpbiBTUk9NICovCiAJdWludCBzcm9tX3JlZ3JldjsJLyogUmVndWxhdG9yeSBSZXYgZm9yIHRoZSBTUk9NIGNjb2RlICovCiAJY29uc3QgY291bnRyeV9pbmZvX3QgKmNvdW50cnk7CS8qIGN1cnJlbnQgY291bnRyeSBkZWYgKi8KQEAgLTM3Nyw3ICszODIsNyBAQAogewogCXU4IGk7CiAKLQliemVybyhjaGFubmVscywgc2l6ZW9mKGNoYW52ZWNfdCkpOworCW1lbXNldChjaGFubmVscywgMCwgc2l6ZW9mKGNoYW52ZWNfdCkpOwogCiAJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZ190YWJsZV9sb2NhbGVfYmFzZSk7IGkrKykgewogCQlpZiAobG9jYWxlLT52YWxpZF9jaGFubmVscyAmICgxIDw8IGkpKSB7CkBAIC01NjIsOCArNTY3LDggQEAKIGNvbnN0IGxvY2FsZV9pbmZvX3QgKndsY19nZXRfbG9jYWxlXzJnKHU4IGxvY2FsZV9pZHgpCiB7CiAJaWYgKGxvY2FsZV9pZHggPj0gQVJSQVlfU0laRShnX2xvY2FsZV8yZ190YWJsZSkpIHsKLQkJV0xfRVJST1IoKCIlczogbG9jYWxlIDJnIGluZGV4IHNpemUgb3V0IG9mIHJhbmdlICVkXG4iLAotCQkJICBfX2Z1bmNfXywgbG9jYWxlX2lkeCkpOworCQlXTF9FUlJPUigiJXM6IGxvY2FsZSAyZyBpbmRleCBzaXplIG91dCBvZiByYW5nZSAlZFxuIiwKKwkJCSBfX2Z1bmNfXywgbG9jYWxlX2lkeCk7CiAJCUFTU0VSVChsb2NhbGVfaWR4IDwgQVJSQVlfU0laRShnX2xvY2FsZV8yZ190YWJsZSkpOwogCQlyZXR1cm4gTlVMTDsKIAl9CkBAIC01NzMsOCArNTc4LDggQEAKIGNvbnN0IGxvY2FsZV9pbmZvX3QgKndsY19nZXRfbG9jYWxlXzVnKHU4IGxvY2FsZV9pZHgpCiB7CiAJaWYgKGxvY2FsZV9pZHggPj0gQVJSQVlfU0laRShnX2xvY2FsZV81Z190YWJsZSkpIHsKLQkJV0xfRVJST1IoKCIlczogbG9jYWxlIDVnIGluZGV4IHNpemUgb3V0IG9mIHJhbmdlICVkXG4iLAotCQkJICBfX2Z1bmNfXywgbG9jYWxlX2lkeCkpOworCQlXTF9FUlJPUigiJXM6IGxvY2FsZSA1ZyBpbmRleCBzaXplIG91dCBvZiByYW5nZSAlZFxuIiwKKwkJCSBfX2Z1bmNfXywgbG9jYWxlX2lkeCk7CiAJCUFTU0VSVChsb2NhbGVfaWR4IDwgQVJSQVlfU0laRShnX2xvY2FsZV81Z190YWJsZSkpOwogCQlyZXR1cm4gTlVMTDsKIAl9CkBAIC01ODQsOCArNTg5LDggQEAKIGNvbnN0IGxvY2FsZV9taW1vX2luZm9fdCAqd2xjX2dldF9taW1vXzJnKHU4IGxvY2FsZV9pZHgpCiB7CiAJaWYgKGxvY2FsZV9pZHggPj0gQVJSQVlfU0laRShnX21pbW9fMmdfdGFibGUpKSB7Ci0JCVdMX0VSUk9SKCgiJXM6IG1pbW8gMmcgaW5kZXggc2l6ZSBvdXQgb2YgcmFuZ2UgJWRcbiIsIF9fZnVuY19fLAotCQkJICBsb2NhbGVfaWR4KSk7CisJCVdMX0VSUk9SKCIlczogbWltbyAyZyBpbmRleCBzaXplIG91dCBvZiByYW5nZSAlZFxuIiwKKwkJCSBfX2Z1bmNfXywgbG9jYWxlX2lkeCk7CiAJCXJldHVybiBOVUxMOwogCX0KIAlyZXR1cm4gZ19taW1vXzJnX3RhYmxlW2xvY2FsZV9pZHhdOwpAQCAtNTk0LDI2ICs1OTksMjYgQEAKIGNvbnN0IGxvY2FsZV9taW1vX2luZm9fdCAqd2xjX2dldF9taW1vXzVnKHU4IGxvY2FsZV9pZHgpCiB7CiAJaWYgKGxvY2FsZV9pZHggPj0gQVJSQVlfU0laRShnX21pbW9fNWdfdGFibGUpKSB7Ci0JCVdMX0VSUk9SKCgiJXM6IG1pbW8gNWcgaW5kZXggc2l6ZSBvdXQgb2YgcmFuZ2UgJWRcbiIsIF9fZnVuY19fLAotCQkJICBsb2NhbGVfaWR4KSk7CisJCVdMX0VSUk9SKCIlczogbWltbyA1ZyBpbmRleCBzaXplIG91dCBvZiByYW5nZSAlZFxuIiwKKwkJCSBfX2Z1bmNfXywgbG9jYWxlX2lkeCk7CiAJCXJldHVybiBOVUxMOwogCX0KIAlyZXR1cm4gZ19taW1vXzVnX3RhYmxlW2xvY2FsZV9pZHhdOwogfQogCi13bGNfY21faW5mb190ICp3bGNfY2hhbm5lbF9tZ3JfYXR0YWNoKHdsY19pbmZvX3QgKndsYykKK3dsY19jbV9pbmZvX3QgKndsY19jaGFubmVsX21ncl9hdHRhY2goc3RydWN0IHdsY19pbmZvICp3bGMpCiB7CiAJd2xjX2NtX2luZm9fdCAqd2xjX2NtOwogCWNoYXIgY291bnRyeV9hYmJyZXZbV0xDX0NOVFJZX0JVRl9TWl07CiAJY29uc3QgY291bnRyeV9pbmZvX3QgKmNvdW50cnk7Ci0Jd2xjX3B1Yl90ICpwdWIgPSB3bGMtPnB1YjsKKwlzdHJ1Y3Qgd2xjX3B1YiAqcHViID0gd2xjLT5wdWI7CiAJY2hhciAqY2NvZGU7CiAKLQlXTF9UUkFDRSgoIndsJWQ6IHdsY19jaGFubmVsX21ncl9hdHRhY2hcbiIsIHdsYy0+cHViLT51bml0KSk7CisJV0xfVFJBQ0UoIndsJWQ6IHdsY19jaGFubmVsX21ncl9hdHRhY2hcbiIsIHdsYy0+cHViLT51bml0KTsKIAogCXdsY19jbSA9IGt6YWxsb2Moc2l6ZW9mKHdsY19jbV9pbmZvX3QpLCBHRlBfQVRPTUlDKTsKIAlpZiAod2xjX2NtID09IE5VTEwpIHsKLQkJV0xfRVJST1IoKCJ3bCVkOiAlczogb3V0IG9mIG1lbW9yeSIsIHB1Yi0+dW5pdCwgX19mdW5jX18pKTsKKwkJV0xfRVJST1IoIndsJWQ6ICVzOiBvdXQgb2YgbWVtb3J5IiwgcHViLT51bml0LCBfX2Z1bmNfXyk7CiAJCXJldHVybiBOVUxMOwogCX0KIAl3bGNfY20tPnB1YiA9IHB1YjsKQEAgLTYyNCwxMiArNjI5LDEzIEBACiAJY2NvZGUgPSBnZXR2YXIod2xjLT5wdWItPnZhcnMsICJjY29kZSIpOwogCWlmIChjY29kZSkgewogCQlzdHJuY3B5KHdsYy0+cHViLT5zcm9tX2Njb2RlLCBjY29kZSwgV0xDX0NOVFJZX0JVRl9TWiAtIDEpOwotCQlXTF9OT05FKCgiJXM6IFNST00gY291bnRyeSBjb2RlIGlzICVjJWNcbiIsIF9fZnVuY19fLAotCQkJIHdsYy0+cHViLT5zcm9tX2Njb2RlWzBdLCB3bGMtPnB1Yi0+c3JvbV9jY29kZVsxXSkpOworCQlXTF9OT05FKCIlczogU1JPTSBjb3VudHJ5IGNvZGUgaXMgJWMlY1xuIiwKKwkJCV9fZnVuY19fLAorCQkJd2xjLT5wdWItPnNyb21fY2NvZGVbMF0sIHdsYy0+cHViLT5zcm9tX2Njb2RlWzFdKTsKIAl9CiAKIAkvKiBpbnRlcm5hbCBjb3VudHJ5IGluZm9ybWF0aW9uIHdoaWNoIG11c3QgbWF0Y2ggcmVndWxhdG9yeSBjb25zdHJhaW50cyBpbiBmaXJtd2FyZSAqLwotCWJ6ZXJvKGNvdW50cnlfYWJicmV2LCBXTENfQ05UUllfQlVGX1NaKTsKKwltZW1zZXQoY291bnRyeV9hYmJyZXYsIDAsIFdMQ19DTlRSWV9CVUZfU1opOwogCXN0cm5jcHkoY291bnRyeV9hYmJyZXYsICJYMiIsIHNpemVvZihjb3VudHJ5X2FiYnJldikgLSAxKTsKIAljb3VudHJ5ID0gd2xjX2NvdW50cnlfbG9va3VwKHdsYywgY291bnRyeV9hYmJyZXYpOwogCkBAIC02NTksNyArNjY1LDcgQEAKIAogdTggd2xjX2NoYW5uZWxfbG9jYWxlX2ZsYWdzKHdsY19jbV9pbmZvX3QgKndsY19jbSkKIHsKLQl3bGNfaW5mb190ICp3bGMgPSB3bGNfY20tPndsYzsKKwlzdHJ1Y3Qgd2xjX2luZm8gKndsYyA9IHdsY19jbS0+d2xjOwogCiAJcmV0dXJuIHdsY19jbS0+YmFuZHN0YXRlW3dsYy0+YmFuZC0+YmFuZHVuaXRdLmxvY2FsZV9mbGFnczsKIH0KQEAgLTcxMSw3ICs3MTcsOSBAQAogCWNoYXIgbWFwcGVkX2Njb2RlW1dMQ19DTlRSWV9CVUZfU1pdOwogCXVpbnQgbWFwcGVkX3JlZ3JldjsKIAotCVdMX05PTkUoKCIlczogKGNvdW50cnlfYWJicmV2IFwiJXNcIiwgY2NvZGUgXCIlc1wiLCByZWdyZXYgJWQpIFNQUk9NIFwiJXNcIi8ldVxuIiwgX19mdW5jX18sIGNvdW50cnlfYWJicmV2LCBjY29kZSwgcmVncmV2LCB3bGNfY20tPnNyb21fY2NvZGUsIHdsY19jbS0+c3JvbV9yZWdyZXYpKTsKKwlXTF9OT05FKCIlczogKGNvdW50cnlfYWJicmV2IFwiJXNcIiwgY2NvZGUgXCIlc1wiLCByZWdyZXYgJWQpIFNQUk9NIFwiJXNcIi8ldVxuIiwKKwkJX19mdW5jX18sIGNvdW50cnlfYWJicmV2LCBjY29kZSwgcmVncmV2LAorCQl3bGNfY20tPnNyb21fY2NvZGUsIHdsY19jbS0+c3JvbV9yZWdyZXYpOwogCiAJLyogaWYgcmVncmV2IGlzIC0xLCBsb29rdXAgdGhlIG1hcHBlZCBjb3VudHJ5IGNvZGUsCiAJICogb3RoZXJ3aXNlIHVzZSB0aGUgY2NvZGUgYW5kIHJlZ3JldiBkaXJlY3RseQpAQCAtNzUwLDcgKzc1OCw3IEBACiB7CiAJY29uc3QgbG9jYWxlX21pbW9faW5mb190ICpsaV9taW1vOwogCWNvbnN0IGxvY2FsZV9pbmZvX3QgKmxvY2FsZTsKLQl3bGNfaW5mb190ICp3bGMgPSB3bGNfY20tPndsYzsKKwlzdHJ1Y3Qgd2xjX2luZm8gKndsYyA9IHdsY19jbS0+d2xjOwogCWNoYXIgcHJldl9jb3VudHJ5X2FiYnJldltXTENfQ05UUllfQlVGX1NaXTsKIAogCUFTU0VSVChjb3VudHJ5ICE9IE5VTEwpOwpAQCAtNzU4LDcgKzc2Niw3IEBACiAJLyogc2F2ZSBjdXJyZW50IGNvdW50cnkgc3RhdGUgKi8KIAl3bGNfY20tPmNvdW50cnkgPSBjb3VudHJ5OwogCi0JYnplcm8oJnByZXZfY291bnRyeV9hYmJyZXYsIFdMQ19DTlRSWV9CVUZfU1opOworCW1lbXNldCgmcHJldl9jb3VudHJ5X2FiYnJldiwgMCwgV0xDX0NOVFJZX0JVRl9TWik7CiAJc3RybmNweShwcmV2X2NvdW50cnlfYWJicmV2LCB3bGNfY20tPmNvdW50cnlfYWJicmV2LAogCQlXTENfQ05UUllfQlVGX1NaIC0gMSk7CiAKQEAgLTgxNCw3ICs4MjIsNyBAQAogCQkJCQkJIGNoYXIgKm1hcHBlZF9jY29kZSwKIAkJCQkJCSB1aW50ICptYXBwZWRfcmVncmV2KQogewotCXdsY19pbmZvX3QgKndsYyA9IHdsY19jbS0+d2xjOworCXN0cnVjdCB3bGNfaW5mbyAqd2xjID0gd2xjX2NtLT53bGM7CiAJY29uc3QgY291bnRyeV9pbmZvX3QgKmNvdW50cnk7CiAJdWludCBzcm9tX3JlZ3JldiA9IHdsY19jbS0+c3JvbV9yZWdyZXY7CiAJY29uc3QgY2hhciAqc3JvbV9jY29kZSA9IHdsY19jbS0+c3JvbV9jY29kZTsKQEAgLTgyMiw4ICs4MzAsOCBAQAogCiAJLyogY2hlY2sgZm9yIGN1cnJlbnRseSBzdXBwb3J0ZWQgY2NvZGUgc2l6ZSAqLwogCWlmIChzdHJsZW4oY2NvZGUpID4gKFdMQ19DTlRSWV9CVUZfU1ogLSAxKSkgewotCQlXTF9FUlJPUigoIndsJWQ6ICVzOiBjY29kZSBcIiVzXCIgdG9vIGxvbmcgZm9yIG1hdGNoXG4iLAotCQkJICB3bGMtPnB1Yi0+dW5pdCwgX19mdW5jX18sIGNjb2RlKSk7CisJCVdMX0VSUk9SKCJ3bCVkOiAlczogY2NvZGUgXCIlc1wiIHRvbyBsb25nIGZvciBtYXRjaFxuIiwKKwkJCSB3bGMtPnB1Yi0+dW5pdCwgX19mdW5jX18sIGNjb2RlKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQogCkBAIC04MzgsNyArODQ2LDcgQEAKIAlpZiAoIXN0cmNtcChzcm9tX2Njb2RlLCBjY29kZSkpIHsKIAkJKm1hcHBlZF9yZWdyZXYgPSBzcm9tX3JlZ3JldjsKIAkJbWFwcGVkID0gMDsKLQkJV0xfRVJST1IoKCJzcm9tX2NvZGUgPT0gY2NvZGUgJXNcbiIsIF9fZnVuY19fKSk7CisJCVdMX0VSUk9SKCJzcm9tX2NvZGUgPT0gY2NvZGUgJXNcbiIsIF9fZnVuY19fKTsKIAkJQVNTRVJUKDApOwogCX0gZWxzZSB7CiAJCW1hcHBlZCA9CkBAIC04OTAsNyArODk4LDcgQEAKIAkJfQogCX0KIAotCVdMX0VSUk9SKCgiJXM6IFJldHVybmluZyBOVUxMXG4iLCBfX2Z1bmNfXykpOworCVdMX0VSUk9SKCIlczogUmV0dXJuaW5nIE5VTExcbiIsIF9fZnVuY19fKTsKIAlBU1NFUlQoMCk7CiAJcmV0dXJuIE5VTEw7CiB9CkBAIC04OTgsOSArOTA2LDkgQEAKIHN0YXRpYyBpbnQKIHdsY19jaGFubmVsc19pbml0KHdsY19jbV9pbmZvX3QgKndsY19jbSwgY29uc3QgY291bnRyeV9pbmZvX3QgKmNvdW50cnkpCiB7Ci0Jd2xjX2luZm9fdCAqd2xjID0gd2xjX2NtLT53bGM7CisJc3RydWN0IHdsY19pbmZvICp3bGMgPSB3bGNfY20tPndsYzsKIAl1aW50IGksIGo7Ci0Jd2xjYmFuZF90ICpiYW5kOworCXN0cnVjdCB3bGNiYW5kICpiYW5kOwogCWNvbnN0IGxvY2FsZV9pbmZvX3QgKmxpOwogCWNoYW52ZWNfdCBzdXBfY2hhbjsKIAljb25zdCBsb2NhbGVfbWltb19pbmZvX3QgKmxpX21pbW87CkBAIC05NTIsNyArOTYwLDcgQEAKICAqLwogc3RhdGljIHZvaWQgd2xjX2NoYW5uZWxzX2NvbW1pdCh3bGNfY21faW5mb190ICp3bGNfY20pCiB7Ci0Jd2xjX2luZm9fdCAqd2xjID0gd2xjX2NtLT53bGM7CisJc3RydWN0IHdsY19pbmZvICp3bGMgPSB3bGNfY20tPndsYzsKIAl1aW50IGNoYW47CiAJc3RydWN0IHR4cHdyX2xpbWl0cyB0eHB3cjsKIApAQCAtOTY5LDcgKzk3Nyw5IEBACiAJaWYgKGNoYW4gPT0gSU5WQ0hBTk5FTCkgewogCQkvKiBjb3VudHJ5L2xvY2FsZSB3aXRoIG5vIHZhbGlkIGNoYW5uZWxzLCBzZXQgdGhlIHJhZGlvIGRpc2FibGUgYml0ICovCiAJCW1ib29sc2V0KHdsYy0+cHViLT5yYWRpb19kaXNhYmxlZCwgV0xfUkFESU9fQ09VTlRSWV9ESVNBQkxFKTsKLQkJV0xfRVJST1IoKCJ3bCVkOiAlczogbm8gdmFsaWQgY2hhbm5lbCBmb3IgXCIlc1wiIG5iYW5kcyAlZCBiYW5kbG9ja2VkICVkXG4iLCB3bGMtPnB1Yi0+dW5pdCwgX19mdW5jX18sIHdsY19jbS0+Y291bnRyeV9hYmJyZXYsIE5CQU5EUyh3bGMpLCB3bGMtPmJhbmRsb2NrZWQpKTsKKwkJV0xfRVJST1IoIndsJWQ6ICVzOiBubyB2YWxpZCBjaGFubmVsIGZvciBcIiVzXCIgbmJhbmRzICVkIGJhbmRsb2NrZWQgJWRcbiIsCisJCQkgd2xjLT5wdWItPnVuaXQsIF9fZnVuY19fLAorCQkJIHdsY19jbS0+Y291bnRyeV9hYmJyZXYsIE5CQU5EUyh3bGMpLCB3bGMtPmJhbmRsb2NrZWQpOwogCX0gZWxzZQogCSAgICBpZiAobWJvb2xpc3NldCh3bGMtPnB1Yi0+cmFkaW9fZGlzYWJsZWQsCiAJCVdMX1JBRElPX0NPVU5UUllfRElTQUJMRSkpIHsKQEAgLTk5OCwxMiArMTAwOCwxMiBAQAogLyogcmVzZXQgdGhlIHF1aWV0IGNoYW5uZWxzIHZlY3RvciB0byB0aGUgdW5pb24gb2YgdGhlIHJlc3RyaWN0ZWQgYW5kIHJhZGFyIGNoYW5uZWwgc2V0cyAqLwogdm9pZCB3bGNfcXVpZXRfY2hhbm5lbHNfcmVzZXQod2xjX2NtX2luZm9fdCAqd2xjX2NtKQogewotCXdsY19pbmZvX3QgKndsYyA9IHdsY19jbS0+d2xjOworCXN0cnVjdCB3bGNfaW5mbyAqd2xjID0gd2xjX2NtLT53bGM7CiAJdWludCBpLCBqOwotCXdsY2JhbmRfdCAqYmFuZDsKKwlzdHJ1Y3Qgd2xjYmFuZCAqYmFuZDsKIAljb25zdCBjaGFudmVjX3QgKmNoYW52ZWM7CiAKLQliemVybygmd2xjX2NtLT5xdWlldF9jaGFubmVscywgc2l6ZW9mKGNoYW52ZWNfdCkpOworCW1lbXNldCgmd2xjX2NtLT5xdWlldF9jaGFubmVscywgMCwgc2l6ZW9mKGNoYW52ZWNfdCkpOwogCiAJYmFuZCA9IHdsYy0+YmFuZDsKIAlmb3IgKGkgPSAwOyBpIDwgTkJBTkRTKHdsYyk7CkBAIC0xMDM2LDcgKzEwNDYsNyBAQAogICovCiBib29sIHdsY192YWxpZF9jaGFubmVsMjBfZGIod2xjX2NtX2luZm9fdCAqd2xjX2NtLCB1aW50IHZhbCkKIHsKLQl3bGNfaW5mb190ICp3bGMgPSB3bGNfY20tPndsYzsKKwlzdHJ1Y3Qgd2xjX2luZm8gKndsYyA9IHdsY19jbS0+d2xjOwogCiAJcmV0dXJuIFZBTElEX0NIQU5ORUwyMCh3bGMsIHZhbCkgfHwKIAkJKCF3bGMtPmJhbmRsb2NrZWQKQEAgLTEwNTQsNyArMTA2NCw3IEBACiAvKiBJcyB0aGUgY2hhbm5lbCB2YWxpZCBmb3IgdGhlIGN1cnJlbnQgbG9jYWxlIGFuZCBjdXJyZW50IGJhbmQ/ICovCiBib29sIHdsY192YWxpZF9jaGFubmVsMjAod2xjX2NtX2luZm9fdCAqd2xjX2NtLCB1aW50IHZhbCkKIHsKLQl3bGNfaW5mb190ICp3bGMgPSB3bGNfY20tPndsYzsKKwlzdHJ1Y3Qgd2xjX2luZm8gKndsYyA9IHdsY19jbS0+d2xjOwogCiAJcmV0dXJuICgodmFsIDwgTUFYQ0hBTk5FTCkgJiYKIAkJaXNzZXQod2xjX2NtLT5iYW5kc3RhdGVbd2xjLT5iYW5kLT5iYW5kdW5pdF0udmFsaWRfY2hhbm5lbHMudmVjLApAQCAtMTA2NCw3ICsxMDc0LDcgQEAKIC8qIElzIHRoZSA0MCBNSHogYWxsb3dlZCBmb3IgdGhlIGN1cnJlbnQgbG9jYWxlIGFuZCBzcGVjaWZpZWQgYmFuZD8gKi8KIGJvb2wgd2xjX3ZhbGlkXzQwY2hhbnNwZWNfaW5fYmFuZCh3bGNfY21faW5mb190ICp3bGNfY20sIHVpbnQgYmFuZHVuaXQpCiB7Ci0Jd2xjX2luZm9fdCAqd2xjID0gd2xjX2NtLT53bGM7CisJc3RydWN0IHdsY19pbmZvICp3bGMgPSB3bGNfY20tPndsYzsKIAogCXJldHVybiAoKCh3bGNfY20tPmJhbmRzdGF0ZVtiYW5kdW5pdF0uCiAJCSAgbG9jYWxlX2ZsYWdzICYgKFdMQ19OT19NSU1PIHwgV0xDX05PXzQwTUhaKSkgPT0gMCkKQEAgLTExNjIsNyArMTE3Miw3IEBACiB3bGNfY2hhbm5lbF9zZXRfY2hhbnNwZWMod2xjX2NtX2luZm9fdCAqd2xjX2NtLCBjaGFuc3BlY190IGNoYW5zcGVjLAogCQkJIHU4IGxvY2FsX2NvbnN0cmFpbnRfcWRibSkKIHsKLQl3bGNfaW5mb190ICp3bGMgPSB3bGNfY20tPndsYzsKKwlzdHJ1Y3Qgd2xjX2luZm8gKndsYyA9IHdsY19jbS0+d2xjOwogCXN0cnVjdCB0eHB3cl9saW1pdHMgdHhwd3I7CiAKIAl3bGNfY2hhbm5lbF9yZWdfbGltaXRzKHdsY19jbSwgY2hhbnNwZWMsICZ0eHB3cik7CkBAIC0xMTc5LDcgKzExODksNyBAQAogd2xjX2NoYW5uZWxfc2V0X3R4cG93ZXJfbGltaXQod2xjX2NtX2luZm9fdCAqd2xjX2NtLAogCQkJICAgICAgdTggbG9jYWxfY29uc3RyYWludF9xZGJtKQogewotCXdsY19pbmZvX3QgKndsYyA9IHdsY19jbS0+d2xjOworCXN0cnVjdCB3bGNfaW5mbyAqd2xjID0gd2xjX2NtLT53bGM7CiAJc3RydWN0IHR4cHdyX2xpbWl0cyB0eHB3cjsKIAogCXdsY19jaGFubmVsX3JlZ19saW1pdHMod2xjX2NtLCB3bGMtPmNoYW5zcGVjLCAmdHhwd3IpOwpAQCAtMTI5OSwxMyArMTMwOSwxMyBAQAogd2xjX2NoYW5uZWxfcmVnX2xpbWl0cyh3bGNfY21faW5mb190ICp3bGNfY20sIGNoYW5zcGVjX3QgY2hhbnNwZWMsCiAJCSAgICAgICB0eHB3cl9saW1pdHNfdCAqdHhwd3IpCiB7Ci0Jd2xjX2luZm9fdCAqd2xjID0gd2xjX2NtLT53bGM7CisJc3RydWN0IHdsY19pbmZvICp3bGMgPSB3bGNfY20tPndsYzsKIAl1aW50IGk7CiAJdWludCBjaGFuOwogCWludCBtYXhwd3I7CiAJaW50IGRlbHRhOwogCWNvbnN0IGNvdW50cnlfaW5mb190ICpjb3VudHJ5OwotCXdsY2JhbmRfdCAqYmFuZDsKKwlzdHJ1Y3Qgd2xjYmFuZCAqYmFuZDsKIAljb25zdCBsb2NhbGVfaW5mb190ICpsaTsKIAlpbnQgY29uZHVjdGVkX21heDsKIAlpbnQgY29uZHVjdGVkX29mZG1fbWF4OwpAQCAtMTMxNCw3ICsxMzI0LDcgQEAKIAlpbnQgbWF4cHdyX2lkeDsKIAl1aW50IGo7CiAKLQliemVybyh0eHB3ciwgc2l6ZW9mKHR4cHdyX2xpbWl0c190KSk7CisJbWVtc2V0KHR4cHdyLCAwLCBzaXplb2YodHhwd3JfbGltaXRzX3QpKTsKIAogCWlmICghd2xjX3ZhbGlkX2NoYW5zcGVjX2RiKHdsY19jbSwgY2hhbnNwZWMpKSB7CiAJCWNvdW50cnkgPSB3bGNfY291bnRyeV9sb29rdXAod2xjLCB3bGMtPmF1dG9jb3VudHJ5X2RlZmF1bHQpOwpAQCAtMTUyOCwxMyArMTUzOCwxMyBAQAogc3RhdGljIGJvb2wKIHdsY192YWxpZF9jaGFuc3BlY19leHQod2xjX2NtX2luZm9fdCAqd2xjX2NtLCBjaGFuc3BlY190IGNoc3BlYywgYm9vbCBkdWFsYmFuZCkKIHsKLQl3bGNfaW5mb190ICp3bGMgPSB3bGNfY20tPndsYzsKKwlzdHJ1Y3Qgd2xjX2luZm8gKndsYyA9IHdsY19jbS0+d2xjOwogCXU4IGNoYW5uZWwgPSBDSFNQRUNfQ0hBTk5FTChjaHNwZWMpOwogCiAJLyogY2hlY2sgdGhlIGNoYW5zcGVjICovCiAJaWYgKHdmX2Noc3BlY19tYWxmb3JtZWQoY2hzcGVjKSkgewotCQlXTF9FUlJPUigoIndsJWQ6IG1hbGZvcm1lZCBjaGFuc3BlYyAweCV4XG4iLCB3bGMtPnB1Yi0+dW5pdCwKLQkJCSAgY2hzcGVjKSk7CisJCVdMX0VSUk9SKCJ3bCVkOiBtYWxmb3JtZWQgY2hhbnNwZWMgMHgleFxuIiwKKwkJCSB3bGMtPnB1Yi0+dW5pdCwgY2hzcGVjKTsKIAkJQVNTRVJUKDApOwogCQlyZXR1cm4gZmFsc2U7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9zeXMvd2xjX2V2ZW50LmMgYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3N5cy93bGNfZXZlbnQuYwppbmRleCA3ZTFiZjBlLi5kYWJkNzA5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3N5cy93bGNfZXZlbnQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3N5cy93bGNfZXZlbnQuYwpAQCAtMTYsOSArMTYsMTMgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGJjbWRlZnMuaD4KLSNpbmNsdWRlIDxsaW51eHZlci5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPG9zbC5oPgogI2luY2x1ZGUgPGJjbXV0aWxzLmg+CiAjaW5jbHVkZSA8c2l1dGlscy5oPgorI2luY2x1ZGUgPHNiaG5kcGlvLmg+CisjaW5jbHVkZSA8c2JobmRkbWEuaD4KICNpbmNsdWRlIDx3bGlvY3RsLmg+CiAjaW5jbHVkZSA8d2xjX2NmZy5oPgogI2luY2x1ZGUgPHdsY19wdWIuaD4KQEAgLTMyLDYgKzM2LDcgQEAKICNpZmRlZiBNU0dUUkFDRQogI2luY2x1ZGUgPG1zZ3RyYWNlLmg+CiAjZW5kaWYKKyNpbmNsdWRlIDx3bF9kYmcuaD4KIAogLyogTG9jYWwgcHJvdG90eXBlcyAqLwogc3RhdGljIHZvaWQgd2xjX3RpbWVyX2NiKHZvaWQgKmFyZyk7CkBAIC00Miw3ICs0Nyw3IEBACiAJd2xjX2V2ZW50X3QgKnRhaWw7CiAJc3RydWN0IHdsY19pbmZvICp3bGM7CiAJdm9pZCAqd2w7Ci0Jd2xjX3B1Yl90ICpwdWI7CisJc3RydWN0IHdsY19wdWIgKnB1YjsKIAlib29sIHRwZW5kaW5nOwogCWJvb2wgd29ya3BlbmRpbmc7CiAJc3RydWN0IHdsX3RpbWVyICp0aW1lcjsKQEAgLTUzLDcgKzU4LDggQEAKIC8qCiAgKiBFeHBvcnQgZnVuY3Rpb25zCiAgKi8KLXdsY19ldmVudHFfdCAqd2xjX2V2ZW50cV9hdHRhY2god2xjX3B1Yl90ICpwdWIsIHN0cnVjdCB3bGNfaW5mbyAqd2xjLCB2b2lkICp3bCwKK3dsY19ldmVudHFfdCAqd2xjX2V2ZW50cV9hdHRhY2goc3RydWN0IHdsY19wdWIgKnB1Yiwgc3RydWN0IHdsY19pbmZvICp3bGMsCisJCQkJdm9pZCAqd2wsCiAJCQkJd2xjX2V2ZW50cV9jYl90IGNiKQogewogCXdsY19ldmVudHFfdCAqZXE7CkBAIC02OSw4ICs3NSw4IEBACiAKIAllcS0+dGltZXIgPSB3bF9pbml0X3RpbWVyKGVxLT53bCwgd2xjX3RpbWVyX2NiLCBlcSwgImV2ZW50cSIpOwogCWlmICghZXEtPnRpbWVyKSB7Ci0JCVdMX0VSUk9SKCgid2wlZDogd2xjX2V2ZW50cV9hdHRhY2g6IHRpbWVyIGZhaWxlZFxuIiwKLQkJCSAgcHViLT51bml0KSk7CisJCVdMX0VSUk9SKCJ3bCVkOiB3bGNfZXZlbnRxX2F0dGFjaDogdGltZXIgZmFpbGVkXG4iLAorCQkJIHB1Yi0+dW5pdCk7CiAJCWtmcmVlKGVxKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9zeXMvd2xjX2V2ZW50LmggYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3N5cy93bGNfZXZlbnQuaAppbmRleCBlNDQzZGFlLi5lNzU1ODJkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3N5cy93bGNfZXZlbnQuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3N5cy93bGNfZXZlbnQuaApAQCAtMjEsNyArMjEsOCBAQAogCiB0eXBlZGVmIHZvaWQgKCp3bGNfZXZlbnRxX2NiX3QpICh2b2lkICphcmcpOwogCi1leHRlcm4gd2xjX2V2ZW50cV90ICp3bGNfZXZlbnRxX2F0dGFjaCh3bGNfcHViX3QgKnB1Yiwgc3RydWN0IHdsY19pbmZvICp3bGMsCitleHRlcm4gd2xjX2V2ZW50cV90ICp3bGNfZXZlbnRxX2F0dGFjaChzdHJ1Y3Qgd2xjX3B1YiAqcHViLAorCQkJCSAgICAgICBzdHJ1Y3Qgd2xjX2luZm8gKndsYywKIAkJCQkgICAgICAgdm9pZCAqd2wsIHdsY19ldmVudHFfY2JfdCBjYik7CiBleHRlcm4gaW50IHdsY19ldmVudHFfZGV0YWNoKHdsY19ldmVudHFfdCAqZXEpOwogZXh0ZXJuIGludCB3bGNfZXZlbnRxX2Rvd24od2xjX2V2ZW50cV90ICplcSk7CkBAIC0zOCw3ICszOSw3IEBACiBleHRlcm4gaW50IHdsY19ldmVudHFfdGVzdF9pbmQod2xjX2V2ZW50cV90ICplcSwgaW50IGV0KTsKIGV4dGVybiBpbnQgd2xjX2V2ZW50cV9zZXRfaW5kKHdsY19ldmVudHFfdCAqZXEsIHVpbnQgZXQsIGJvb2wgb24pOwogZXh0ZXJuIHZvaWQgd2xjX2V2ZW50cV9mbHVzaCh3bGNfZXZlbnRxX3QgKmVxKTsKLWV4dGVybiB2b2lkIHdsY19hc3NpZ25fZXZlbnRfbXNnKHdsY19pbmZvX3QgKndsYywgd2xfZXZlbnRfbXNnX3QgKm1zZywKK2V4dGVybiB2b2lkIHdsY19hc3NpZ25fZXZlbnRfbXNnKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCB3bF9ldmVudF9tc2dfdCAqbXNnLAogCQkJCSBjb25zdCB3bGNfZXZlbnRfdCAqZSwgdTggKmRhdGEsCiAJCQkJIHUzMiBsZW4pOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3N5cy93bGNfbWFjODAyMTEuYyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvc3lzL3dsY19tYWM4MDIxMS5jCmluZGV4IGZlYWZmY2MuLjFkNWQwMWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvc3lzL3dsY19tYWM4MDIxMS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvc3lzL3dsY19tYWM4MDIxMS5jCkBAIC0xNSw5ICsxNSwxMCBAQAogICovCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgogI2luY2x1ZGUgPGJjbWRlZnMuaD4KKyNpbmNsdWRlIDxiY21kZXZzLmg+CiAjaW5jbHVkZSA8d2xjX2NmZy5oPgotI2luY2x1ZGUgPGxpbnV4dmVyLmg+CiAjaW5jbHVkZSA8b3NsLmg+CiAjaW5jbHVkZSA8YmNtdXRpbHMuaD4KICNpbmNsdWRlIDxiY213aWZpLmg+CkBAIC0yNyw3ICsyOCw3IEBACiAjaW5jbHVkZSA8cGNpY2ZnLmg+CiAjaW5jbHVkZSA8YmNtc3JvbS5oPgogI2luY2x1ZGUgPHdsaW9jdGwuaD4KLSNpbmNsdWRlIDxlcGl2ZXJzLmg+CisjaW5jbHVkZSA8c2JobmRwaW8uaD4KICNpbmNsdWRlIDxzYmhuZGRtYS5oPgogI2luY2x1ZGUgPGhuZGRtYS5oPgogI2luY2x1ZGUgPGhuZHBtdS5oPgpAQCAtMzcsNiArMzgsNyBAQAogI2luY2x1ZGUgPHdsY19rZXkuaD4KICNpbmNsdWRlIDx3bGNfYnNzY2ZnLmg+CiAjaW5jbHVkZSA8d2xjX2NoYW5uZWwuaD4KKyNpbmNsdWRlIDx3bGNfZXZlbnQuaD4KICNpbmNsdWRlIDx3bGNfbWFjODAyMTEuaD4KICNpbmNsdWRlIDx3bGNfYm1hYy5oPgogI2luY2x1ZGUgPHdsY19zY2IuaD4KQEAgLTQ3LDI3ICs0OSwxMSBAQAogI2luY2x1ZGUgPHdsY19hbXBkdS5oPgogI2luY2x1ZGUgPHdsY19ldmVudC5oPgogI2luY2x1ZGUgPHdsX2V4cG9ydC5oPgotI2lmZGVmIEJDTVNESU8KLSNpbmNsdWRlIDxiY21zZGguaD4KLSNlbHNlCiAjaW5jbHVkZSAiZDExdWNvZGVfZXh0LmgiCi0jZW5kaWYKLSNpZmRlZiBXTENfSElHSF9PTkxZCi0jaW5jbHVkZSA8YmNtX3JwY190cC5oPgotI2luY2x1ZGUgPGJjbV9ycGMuaD4KLSNpbmNsdWRlIDxiY21feGRyLmg+Ci0jaW5jbHVkZSA8d2xjX3JwYy5oPgotI2luY2x1ZGUgPHdsY19ycGN0eC5oPgotI2VuZGlmCQkJCS8qIFdMQ19ISUdIX09OTFkgKi8KICNpbmNsdWRlIDx3bGNfYWxsb2MuaD4KICNpbmNsdWRlIDxuZXQvbWFjODAyMTEuaD4KKyNpbmNsdWRlIDx3bF9kYmcuaD4KIAotI2lmZGVmIFdMQ19ISUdIX09OTFkKLSN1bmRlZiBSX1JFRwotI3VuZGVmIFdfUkVHCi0jZGVmaW5lIFJfUkVHKG9zaCwgcikgUlBDX1JFQURfUkVHKG9zaCwgcikKLSNkZWZpbmUgV19SRUcob3NoLCByLCB2KSBSUENfV1JJVEVfUkVHKG9zaCwgciwgdikKLSNlbmRpZgogCiAvKgogICogYnVmZmVyIGxlbmd0aCBuZWVkZWQgZm9yIHdsY19mb3JtYXRfc3NpZApAQCAtMTA3LDEyICs5Myw4IEBACiAvKiBUbyBpbmZvcm0gdGhlIHVjb2RlIG9mIHRoZSBsYXN0IG1jYXN0IGZyYW1lIHBvc3RlZCBzbyB0aGF0IGl0IGNhbiBjbGVhciBtb3JlZGF0YSBiaXQgKi8KICNkZWZpbmUgQkNNQ0ZJRCh3bGMsIGZpZCkgd2xjX2JtYWNfd3JpdGVfc2htKCh3bGMpLT5odywgTV9CQ01DX0ZJRCwgKGZpZCkpCiAKLSNpZm5kZWYgV0xDX0hJR0hfT05MWQotI2RlZmluZSBXTENfV0FSMTYxNjUod2xjKSAoQlVTVFlQRSh3bGMtPnB1Yi0+c2loLT5idXN0eXBlKSA9PSBQQ0lfQlVTICYmIFwKKyNkZWZpbmUgV0xDX1dBUjE2MTY1KHdsYykgKHdsYy0+cHViLT5zaWgtPmJ1c3R5cGUgPT0gUENJX0JVUyAmJiBcCiAJCQkJKCFBUF9FTkFCKHdsYy0+cHViKSkgJiYgKHdsYy0+d2FyMTYxNjUpKQotI2Vsc2UKLSNkZWZpbmUgV0xDX1dBUjE2MTY1KHdsYykgKGZhbHNlKQotI2VuZGlmCQkJCS8qIFdMQ19ISUdIX09OTFkgKi8KIAogLyogZGVidWcvdHJhY2UgKi8KIHVpbnQgd2xfbXNnX2xldmVsID0KQEAgLTEzNSw5ICsxMTcsMTEgQEAKIAogI2RlZmluZSBTQ0FOX0lOX1BST0dSRVNTKHgpCTAKIAorI2RlZmluZSBFUElfVkVSU0lPTl9OVU0JCTB4MDU0YjBiMDAKKwogI2lmZGVmIEJDTURCRwogLyogcG9pbnRlciB0byBtb3N0IHJlY2VudGx5IGFsbG9jYXRlZCB3bC93bGMgKi8KLXN0YXRpYyB3bGNfaW5mb190ICp3bGNfaW5mb19kYmcgPSAod2xjX2luZm9fdCAqKSAoTlVMTCk7CitzdGF0aWMgc3RydWN0IHdsY19pbmZvICp3bGNfaW5mb19kYmcgPSAoc3RydWN0IHdsY19pbmZvICopIChOVUxMKTsKICNlbmRpZgogCiAvKiBJT1ZhciB0YWJsZSAqLwpAQCAtMjM4LDkxICsyMjIsOTEgQEAKICNkZWZpbmUgV0xDX1JFUExBWV9DTlRSU19WQUxVRQlXUEFfQ0FQXzE2X1JFUExBWV9DTlRSUwogCiAvKiBsb2NhbCBwcm90b3R5cGVzICovCi1leHRlcm4gdm9pZCB3bGNfdHhxX2VucSh2b2lkICpjdHgsIHN0cnVjdCBzY2IgKnNjYiwgdm9pZCAqc2R1LCB1aW50IHByZWMpOwotc3RhdGljIHUxNiBCQ01GQVNUUEFUSCB3bGNfZDExaGRyc19tYWM4MDIxMSh3bGNfaW5mb190ICp3bGMsCi0JCQkJCSAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgdm9pZCAqcCwKK3N0YXRpYyB1MTYgQkNNRkFTVFBBVEggd2xjX2QxMWhkcnNfbWFjODAyMTEoc3RydWN0IHdsY19pbmZvICp3bGMsCisJCQkJCSAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCQkJICAgICAgIHN0cnVjdCBza19idWZmICpwLAogCQkJCQkgICAgICAgc3RydWN0IHNjYiAqc2NiLCB1aW50IGZyYWcsCiAJCQkJCSAgICAgICB1aW50IG5mcmFncywgdWludCBxdWV1ZSwKIAkJCQkJICAgICAgIHVpbnQgbmV4dF9mcmFnX2xlbiwKIAkJCQkJICAgICAgIHdzZWNfa2V5X3QgKmtleSwKIAkJCQkJICAgICAgIHJhdGVzcGVjX3QgcnNwZWNfb3ZlcnJpZGUpOwotYm9vbCB3bGNfc2VuZHBrdF9tYWM4MDIxMSh3bGNfaW5mb190ICp3bGMsIHZvaWQgKnNkdSwgc3RydWN0IGllZWU4MDIxMV9odyAqaHcpOwotdm9pZCB3bGNfd21lX3NldHBhcmFtcyh3bGNfaW5mb190ICp3bGMsIHUxNiBhY2ksIHZvaWQgKmFyZywgYm9vbCBzdXNwZW5kKTsKLXN0YXRpYyB2b2lkIHdsY19ic3NfZGVmYXVsdF9pbml0KHdsY19pbmZvX3QgKndsYyk7Ci1zdGF0aWMgdm9pZCB3bGNfdWNvZGVfbWFjX3VwZCh3bGNfaW5mb190ICp3bGMpOwotc3RhdGljIHJhdGVzcGVjX3QgbWFjODAyMTFfd2xjX3NldF9ucmF0ZSh3bGNfaW5mb190ICp3bGMsIHdsY2JhbmRfdCAqY3VyX2JhbmQsCi0JCQkJCSB1MzIgaW50X3ZhbCk7Ci1zdGF0aWMgdm9pZCB3bGNfdHhfcHJlY19tYXBfaW5pdCh3bGNfaW5mb190ICp3bGMpOworCitzdGF0aWMgdm9pZCB3bGNfYnNzX2RlZmF1bHRfaW5pdChzdHJ1Y3Qgd2xjX2luZm8gKndsYyk7CitzdGF0aWMgdm9pZCB3bGNfdWNvZGVfbWFjX3VwZChzdHJ1Y3Qgd2xjX2luZm8gKndsYyk7CitzdGF0aWMgcmF0ZXNwZWNfdCBtYWM4MDIxMV93bGNfc2V0X25yYXRlKHN0cnVjdCB3bGNfaW5mbyAqd2xjLAorCQkJCQkgc3RydWN0IHdsY2JhbmQgKmN1cl9iYW5kLCB1MzIgaW50X3ZhbCk7CitzdGF0aWMgdm9pZCB3bGNfdHhfcHJlY19tYXBfaW5pdChzdHJ1Y3Qgd2xjX2luZm8gKndsYyk7CiBzdGF0aWMgdm9pZCB3bGNfd2F0Y2hkb2codm9pZCAqYXJnKTsKIHN0YXRpYyB2b2lkIHdsY193YXRjaGRvZ19ieV90aW1lcih2b2lkICphcmcpOwotc3RhdGljIGludCB3bGNfc2V0X3JhdGVzZXQod2xjX2luZm9fdCAqd2xjLCB3bGNfcmF0ZXNldF90ICpyc19hcmcpOwotc3RhdGljIGludCB3bGNfaW92YXJfcmFuZ2VjaGVjayh3bGNfaW5mb190ICp3bGMsIHUzMiB2YWwsCitzdGF0aWMgaW50IHdsY19zZXRfcmF0ZXNldChzdHJ1Y3Qgd2xjX2luZm8gKndsYywgd2xjX3JhdGVzZXRfdCAqcnNfYXJnKTsKK3N0YXRpYyBpbnQgd2xjX2lvdmFyX3JhbmdlY2hlY2soc3RydWN0IHdsY19pbmZvICp3bGMsIHUzMiB2YWwsCiAJCQkJY29uc3QgYmNtX2lvdmFyX3QgKnZpKTsKLXN0YXRpYyB1OCB3bGNfbG9jYWxfY29uc3RyYWludF9xZGJtKHdsY19pbmZvX3QgKndsYyk7CitzdGF0aWMgdTggd2xjX2xvY2FsX2NvbnN0cmFpbnRfcWRibShzdHJ1Y3Qgd2xjX2luZm8gKndsYyk7CiAKIC8qIHNlbmQgYW5kIHJlY2VpdmUgKi8KLXN0YXRpYyB3bGNfdHhxX2luZm9fdCAqd2xjX3R4cV9hbGxvYyh3bGNfaW5mb190ICp3bGMsIG9zbF90ICpvc2gpOwotc3RhdGljIHZvaWQgd2xjX3R4cV9mcmVlKHdsY19pbmZvX3QgKndsYywgb3NsX3QgKm9zaCwgd2xjX3R4cV9pbmZvX3QgKnFpKTsKLXN0YXRpYyB2b2lkIHdsY190eGZsb3djb250cm9sX3NpZ25hbCh3bGNfaW5mb190ICp3bGMsIHdsY190eHFfaW5mb190ICpxaSwKK3N0YXRpYyB3bGNfdHhxX2luZm9fdCAqd2xjX3R4cV9hbGxvYyhzdHJ1Y3Qgd2xjX2luZm8gKndsYywKKwkJCQkgICAgIHN0cnVjdCBvc2xfaW5mbyAqb3NoKTsKK3N0YXRpYyB2b2lkIHdsY190eHFfZnJlZShzdHJ1Y3Qgd2xjX2luZm8gKndsYywgc3RydWN0IG9zbF9pbmZvICpvc2gsCisJCQkgd2xjX3R4cV9pbmZvX3QgKnFpKTsKK3N0YXRpYyB2b2lkIHdsY190eGZsb3djb250cm9sX3NpZ25hbChzdHJ1Y3Qgd2xjX2luZm8gKndsYywgd2xjX3R4cV9pbmZvX3QgKnFpLAogCQkJCSAgICAgYm9vbCBvbiwgaW50IHByaW8pOwotc3RhdGljIHZvaWQgd2xjX3R4Zmxvd2NvbnRyb2xfcmVzZXQod2xjX2luZm9fdCAqd2xjKTsKLXN0YXRpYyB1MTYgd2xjX2NvbXB1dGVfYWlydGltZSh3bGNfaW5mb190ICp3bGMsIHJhdGVzcGVjX3QgcnNwZWMsCitzdGF0aWMgdm9pZCB3bGNfdHhmbG93Y29udHJvbF9yZXNldChzdHJ1Y3Qgd2xjX2luZm8gKndsYyk7CitzdGF0aWMgdTE2IHdsY19jb21wdXRlX2FpcnRpbWUoc3RydWN0IHdsY19pbmZvICp3bGMsIHJhdGVzcGVjX3QgcnNwZWMsCiAJCQkJICB1aW50IGxlbmd0aCk7CiBzdGF0aWMgdm9pZCB3bGNfY29tcHV0ZV9jY2tfcGxjcChyYXRlc3BlY190IHJhdGUsIHVpbnQgbGVuZ3RoLCB1OCAqcGxjcCk7CiBzdGF0aWMgdm9pZCB3bGNfY29tcHV0ZV9vZmRtX3BsY3AocmF0ZXNwZWNfdCByYXRlLCB1aW50IGxlbmd0aCwgdTggKnBsY3ApOwogc3RhdGljIHZvaWQgd2xjX2NvbXB1dGVfbWltb19wbGNwKHJhdGVzcGVjX3QgcmF0ZSwgdWludCBsZW5ndGgsIHU4ICpwbGNwKTsKLXN0YXRpYyB1MTYgd2xjX2NvbXB1dGVfZnJhbWVfZHVyKHdsY19pbmZvX3QgKndsYywgcmF0ZXNwZWNfdCByYXRlLAorc3RhdGljIHUxNiB3bGNfY29tcHV0ZV9mcmFtZV9kdXIoc3RydWN0IHdsY19pbmZvICp3bGMsIHJhdGVzcGVjX3QgcmF0ZSwKIAkJCQkgICAgdTggcHJlYW1ibGVfdHlwZSwgdWludCBuZXh0X2ZyYWdfbGVuKTsKLXN0YXRpYyB2b2lkIHdsY19yZWN2Y3RsKHdsY19pbmZvX3QgKndsYywgb3NsX3QgKm9zaCwgZDExcnhoZHJfdCAqcnhoLAotCQkJdm9pZCAqcCk7Ci1zdGF0aWMgdWludCB3bGNfY2FsY19mcmFtZV9sZW4od2xjX2luZm9fdCAqd2xjLCByYXRlc3BlY190IHJhdGUsCitzdGF0aWMgdm9pZCB3bGNfcmVjdmN0bChzdHJ1Y3Qgd2xjX2luZm8gKndsYywgc3RydWN0IG9zbF9pbmZvICpvc2gsCisJCQlkMTFyeGhkcl90ICpyeGgsIHN0cnVjdCBza19idWZmICpwKTsKK3N0YXRpYyB1aW50IHdsY19jYWxjX2ZyYW1lX2xlbihzdHJ1Y3Qgd2xjX2luZm8gKndsYywgcmF0ZXNwZWNfdCByYXRlLAogCQkJICAgICAgIHU4IHByZWFtYmxlX3R5cGUsIHVpbnQgZHVyKTsKLXN0YXRpYyB1aW50IHdsY19jYWxjX2Fja190aW1lKHdsY19pbmZvX3QgKndsYywgcmF0ZXNwZWNfdCByYXRlLAorc3RhdGljIHVpbnQgd2xjX2NhbGNfYWNrX3RpbWUoc3RydWN0IHdsY19pbmZvICp3bGMsIHJhdGVzcGVjX3QgcmF0ZSwKIAkJCSAgICAgIHU4IHByZWFtYmxlX3R5cGUpOwotc3RhdGljIHVpbnQgd2xjX2NhbGNfY3RzX3RpbWUod2xjX2luZm9fdCAqd2xjLCByYXRlc3BlY190IHJhdGUsCitzdGF0aWMgdWludCB3bGNfY2FsY19jdHNfdGltZShzdHJ1Y3Qgd2xjX2luZm8gKndsYywgcmF0ZXNwZWNfdCByYXRlLAogCQkJICAgICAgdTggcHJlYW1ibGVfdHlwZSk7CiAvKiBpbnRlcnJ1cHQsIHVwL2Rvd24sIGJhbmQgKi8KLXN0YXRpYyB2b2lkIHdsY19zZXRiYW5kKHdsY19pbmZvX3QgKndsYywgdWludCBiYW5kdW5pdCk7Ci1zdGF0aWMgY2hhbnNwZWNfdCB3bGNfaW5pdF9jaGFuc3BlYyh3bGNfaW5mb190ICp3bGMpOwotc3RhdGljIHZvaWQgd2xjX2JhbmRpbml0X29yZGVyZWQod2xjX2luZm9fdCAqd2xjLCBjaGFuc3BlY190IGNoYW5zcGVjKTsKLXN0YXRpYyB2b2lkIHdsY19ic2luaXQod2xjX2luZm9fdCAqd2xjKTsKLXN0YXRpYyBpbnQgd2xjX2R1dHlfY3ljbGVfc2V0KHdsY19pbmZvX3QgKndsYywgaW50IGR1dHlfY3ljbGUsIGJvb2wgaXNPRkRNLAorc3RhdGljIHZvaWQgd2xjX3NldGJhbmQoc3RydWN0IHdsY19pbmZvICp3bGMsIHVpbnQgYmFuZHVuaXQpOworc3RhdGljIGNoYW5zcGVjX3Qgd2xjX2luaXRfY2hhbnNwZWMoc3RydWN0IHdsY19pbmZvICp3bGMpOworc3RhdGljIHZvaWQgd2xjX2JhbmRpbml0X29yZGVyZWQoc3RydWN0IHdsY19pbmZvICp3bGMsIGNoYW5zcGVjX3QgY2hhbnNwZWMpOworc3RhdGljIHZvaWQgd2xjX2JzaW5pdChzdHJ1Y3Qgd2xjX2luZm8gKndsYyk7CitzdGF0aWMgaW50IHdsY19kdXR5X2N5Y2xlX3NldChzdHJ1Y3Qgd2xjX2luZm8gKndsYywgaW50IGR1dHlfY3ljbGUsIGJvb2wgaXNPRkRNLAogCQkJICAgICAgYm9vbCB3cml0ZVRvU2htKTsKLXN0YXRpYyB2b2lkIHdsY19yYWRpb19od2Rpc2FibGVfdXBkKHdsY19pbmZvX3QgKndsYyk7Ci1zdGF0aWMgYm9vbCB3bGNfcmFkaW9fbW9uaXRvcl9zdGFydCh3bGNfaW5mb190ICp3bGMpOworc3RhdGljIHZvaWQgd2xjX3JhZGlvX2h3ZGlzYWJsZV91cGQoc3RydWN0IHdsY19pbmZvICp3bGMpOworc3RhdGljIGJvb2wgd2xjX3JhZGlvX21vbml0b3Jfc3RhcnQoc3RydWN0IHdsY19pbmZvICp3bGMpOwogc3RhdGljIHZvaWQgd2xjX3JhZGlvX3RpbWVyKHZvaWQgKmFyZyk7Ci1zdGF0aWMgdm9pZCB3bGNfcmFkaW9fZW5hYmxlKHdsY19pbmZvX3QgKndsYyk7Ci1zdGF0aWMgdm9pZCB3bGNfcmFkaW9fdXBkKHdsY19pbmZvX3QgKndsYyk7CitzdGF0aWMgdm9pZCB3bGNfcmFkaW9fZW5hYmxlKHN0cnVjdCB3bGNfaW5mbyAqd2xjKTsKK3N0YXRpYyB2b2lkIHdsY19yYWRpb191cGQoc3RydWN0IHdsY19pbmZvICp3bGMpOwogCiAvKiBzY2FuLCBhc3NvY2lhdGlvbiwgQlNTICovCi1zdGF0aWMgdWludCB3bGNfY2FsY19iYV90aW1lKHdsY19pbmZvX3QgKndsYywgcmF0ZXNwZWNfdCByYXRlLAorc3RhdGljIHVpbnQgd2xjX2NhbGNfYmFfdGltZShzdHJ1Y3Qgd2xjX2luZm8gKndsYywgcmF0ZXNwZWNfdCByYXRlLAogCQkJICAgICB1OCBwcmVhbWJsZV90eXBlKTsKLXN0YXRpYyB2b2lkIHdsY191cGRhdGVfbWltb19iYW5kX2J3Y2FwKHdsY19pbmZvX3QgKndsYywgdTggYndjYXApOwotc3RhdGljIHZvaWQgd2xjX2h0X3VwZGF0ZV9zZ2lfcngod2xjX2luZm9fdCAqd2xjLCBpbnQgdmFsKTsKLXZvaWQgd2xjX2h0X21pbW9wc19jYXBfdXBkYXRlKHdsY19pbmZvX3QgKndsYywgdTggbWltb3BzX21vZGUpOwotc3RhdGljIHZvaWQgd2xjX2h0X3VwZGF0ZV9sZHBjKHdsY19pbmZvX3QgKndsYywgczggdmFsKTsKLXN0YXRpYyB2b2lkIHdsY193YXIxNjE2NSh3bGNfaW5mb190ICp3bGMsIGJvb2wgdHgpOworc3RhdGljIHZvaWQgd2xjX3VwZGF0ZV9taW1vX2JhbmRfYndjYXAoc3RydWN0IHdsY19pbmZvICp3bGMsIHU4IGJ3Y2FwKTsKK3N0YXRpYyB2b2lkIHdsY19odF91cGRhdGVfc2dpX3J4KHN0cnVjdCB3bGNfaW5mbyAqd2xjLCBpbnQgdmFsKTsKK3N0YXRpYyB2b2lkIHdsY19odF91cGRhdGVfbGRwYyhzdHJ1Y3Qgd2xjX2luZm8gKndsYywgczggdmFsKTsKK3N0YXRpYyB2b2lkIHdsY193YXIxNjE2NShzdHJ1Y3Qgd2xjX2luZm8gKndsYywgYm9vbCB0eCk7CiAKIHN0YXRpYyB2b2lkIHdsY19wcm9jZXNzX2V2ZW50cSh2b2lkICphcmcpOwotc3RhdGljIHZvaWQgd2xjX3dtZV9yZXRyaWVzX3dyaXRlKHdsY19pbmZvX3QgKndsYyk7Ci1zdGF0aWMgYm9vbCB3bGNfYXR0YWNoX3N0Zl9hbnRfaW5pdCh3bGNfaW5mb190ICp3bGMpOwotc3RhdGljIHVpbnQgd2xjX2F0dGFjaF9tb2R1bGUod2xjX2luZm9fdCAqd2xjKTsKLXN0YXRpYyB2b2lkIHdsY19kZXRhY2hfbW9kdWxlKHdsY19pbmZvX3QgKndsYyk7Ci1zdGF0aWMgdm9pZCB3bGNfdGltZXJzX2RlaW5pdCh3bGNfaW5mb190ICp3bGMpOwotc3RhdGljIHZvaWQgd2xjX2Rvd25fbGVkX3VwZCh3bGNfaW5mb190ICp3bGMpOwotc3RhdGljIHVpbnQgd2xjX2Rvd25fZGVsX3RpbWVyKHdsY19pbmZvX3QgKndsYyk7Ci1zdGF0aWMgdm9pZCB3bGNfb2ZkbV9yYXRlc2V0X3dhcih3bGNfaW5mb190ICp3bGMpOwotc3RhdGljIGludCBfd2xjX2lvY3RsKHdsY19pbmZvX3QgKndsYywgaW50IGNtZCwgdm9pZCAqYXJnLCBpbnQgbGVuLAorc3RhdGljIHZvaWQgd2xjX3dtZV9yZXRyaWVzX3dyaXRlKHN0cnVjdCB3bGNfaW5mbyAqd2xjKTsKK3N0YXRpYyBib29sIHdsY19hdHRhY2hfc3RmX2FudF9pbml0KHN0cnVjdCB3bGNfaW5mbyAqd2xjKTsKK3N0YXRpYyB1aW50IHdsY19hdHRhY2hfbW9kdWxlKHN0cnVjdCB3bGNfaW5mbyAqd2xjKTsKK3N0YXRpYyB2b2lkIHdsY19kZXRhY2hfbW9kdWxlKHN0cnVjdCB3bGNfaW5mbyAqd2xjKTsKK3N0YXRpYyB2b2lkIHdsY190aW1lcnNfZGVpbml0KHN0cnVjdCB3bGNfaW5mbyAqd2xjKTsKK3N0YXRpYyB2b2lkIHdsY19kb3duX2xlZF91cGQoc3RydWN0IHdsY19pbmZvICp3bGMpOworc3RhdGljIHVpbnQgd2xjX2Rvd25fZGVsX3RpbWVyKHN0cnVjdCB3bGNfaW5mbyAqd2xjKTsKK3N0YXRpYyB2b2lkIHdsY19vZmRtX3JhdGVzZXRfd2FyKHN0cnVjdCB3bGNfaW5mbyAqd2xjKTsKK3N0YXRpYyBpbnQgX3dsY19pb2N0bChzdHJ1Y3Qgd2xjX2luZm8gKndsYywgaW50IGNtZCwgdm9pZCAqYXJnLCBpbnQgbGVuLAogCQkgICAgICBzdHJ1Y3Qgd2xjX2lmICp3bGNpZik7CiAKICNpZiBkZWZpbmVkKEJDTURCRykKLXZvaWQgd2xjX2dldF9yY210YSh3bGNfaW5mb190ICp3bGMsIGludCBpZHgsIHN0cnVjdCBldGhlcl9hZGRyICphZGRyKQordm9pZCB3bGNfZ2V0X3JjbXRhKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCBpbnQgaWR4LCBzdHJ1Y3QgZXRoZXJfYWRkciAqYWRkcikKIHsKIAlkMTFyZWdzX3QgKnJlZ3MgPSB3bGMtPnJlZ3M7CiAJdTMyIHYzMjsKLQlvc2xfdCAqb3NoOworCXN0cnVjdCBvc2xfaW5mbyAqb3NoOwogCi0JV0xfVFJBQ0UoKCJ3bCVkOiAlc1xuIiwgV0xDV0xVTklUKHdsYyksIF9fZnVuY19fKSk7CisJV0xfVFJBQ0UoIndsJWQ6ICVzXG4iLCBXTENXTFVOSVQod2xjKSwgX19mdW5jX18pOwogCiAJQVNTRVJUKHdsYy0+cHViLT5jb3JlcmV2ID4gNCk7CiAKQEAgLTM0NCwxNCArMzI4LDE0IEBACiAjZW5kaWYJCQkJLyogZGVmaW5lZChCQ01EQkcpICovCiAKIC8qIGtlZXAgdGhlIGNoaXAgYXdha2UgaWYgbmVlZGVkICovCi1ib29sIHdsY19zdGF5X2F3YWtlKHdsY19pbmZvX3QgKndsYykKK2Jvb2wgd2xjX3N0YXlfYXdha2Uoc3RydWN0IHdsY19pbmZvICp3bGMpCiB7CiAJcmV0dXJuIHRydWU7CiB9CiAKIC8qIGNvbmRpdGlvbnMgdW5kZXIgd2hpY2ggdGhlIFBNIGJpdCBzaG91bGQgYmUgc2V0IGluIG91dGdvaW5nIGZyYW1lcyBhbmQgU1RBWV9BV0FLRSBpcyBtZWFuaW5nZnVsCiAgKi8KLWJvb2wgd2xjX3BzX2FsbG93ZWQod2xjX2luZm9fdCAqd2xjKQorYm9vbCB3bGNfcHNfYWxsb3dlZChzdHJ1Y3Qgd2xjX2luZm8gKndsYykKIHsKIAlpbnQgaWR4OwogCXdsY19ic3NjZmdfdCAqY2ZnOwpAQCAtMzc4LDkgKzM2Miw5IEBACiAJcmV0dXJuIHRydWU7CiB9CiAKLXZvaWQgd2xjX3Jlc2V0KHdsY19pbmZvX3QgKndsYykKK3ZvaWQgd2xjX3Jlc2V0KHN0cnVjdCB3bGNfaW5mbyAqd2xjKQogewotCVdMX1RSQUNFKCgid2wlZDogd2xjX3Jlc2V0XG4iLCB3bGMtPnB1Yi0+dW5pdCkpOworCVdMX1RSQUNFKCJ3bCVkOiB3bGNfcmVzZXRcbiIsIHdsYy0+cHViLT51bml0KTsKIAogCXdsYy0+Y2hlY2tfZm9yX3VuYWxpZ25lZF90YnR0ID0gZmFsc2U7CiAKQEAgLTM4OSwzNCArMzczLDE5IEBACiAJCXdsY19zdGF0c3VwZCh3bGMpOwogCiAJCS8qIHJlc2V0IG91ciBzbmFwc2hvdCBvZiBtYWNzdGF0IGNvdW50ZXJzICovCi0JCWJ6ZXJvKChjaGFyICopd2xjLT5jb3JlLT5tYWNzdGF0X3NuYXBzaG90LCBzaXplb2YobWFjc3RhdF90KSk7CisJCW1lbXNldCgoY2hhciAqKXdsYy0+Y29yZS0+bWFjc3RhdF9zbmFwc2hvdCwgMCwKKwkJCXNpemVvZihtYWNzdGF0X3QpKTsKIAl9CiAKIAl3bGNfYm1hY19yZXNldCh3bGMtPmh3KTsKIAl3bGNfYW1wZHVfcmVzZXQod2xjLT5hbXBkdSk7CiAJd2xjLT50eHJldHJpZWQgPSAwOwogCi0jaWZkZWYgV0xDX0hJR0hfT05MWQotCS8qIE5lZWQgdG8gc2V0IGEgZmxhZyh0byBiZSBjbGVhcmVkIGFzeW5jaHJvbm91c2x5IGJ5IEJNQUMgZHJpdmVyIHdpdGggaGlnaCBjYWxsKQotCSAqICBpbiBvcmRlciB0byBwcmV2ZW50IHdsY19ycGN0eF90eHJlY2xhaW0oKSBmcm9tIHNjcmV3aW5nIHdsY19ycGN0eF9nZXRuZXh0dHhwKCksCi0JICogIHdoaWNoIGNvdWxkIGJlIGludm9rZWQgYnkgYWxyZWFkeSBRVUVVRUQgaGlnaCBjYWxsKHMpIGZyb20gQk1BQyBkcml2ZXIgYmVmb3JlCi0JICogIHdsY19ibWFjX3Jlc2V0KCkgZmluaXNoZXMuCi0JICogSXQncyBub3QgbmVlZGVkIGJlZm9yZSBpbiBtb25vbGl0aGljIGRyaXZlciBtb2RlbCBiZWNhdXNlIGQxMWNvcmUgaW50ZXJydXB0cyB3b3VsZAotCSAqICBoYXZlIGJlZW4gY2xlYXJlZCBpbnN0YW50bHkgaW4gd2xjX2JtYWNfcmVzZXQoKSBhbmQgbm8gdHhzdGF0dXMgaW50ZXJydXB0Ci0JICogIHdpbGwgY29tZSB0byBkcml2ZXIgdG8gZmV0Y2ggdGhvc2UgZmx1c2hlZCBkbWEgcGt0IHBvaW50ZXJzLgotCSAqLwotCXdsYy0+cmVzZXRfYm1hY19wZW5kaW5nID0gdHJ1ZTsKLQotCXdsY19ycGN0eF90eHJlY2xhaW0od2xjLT5ycGN0eCk7Ci0KLQl3bGNfc3RmX3BoeV90eGFudF91cGQod2xjKTsKLQl3bGNfcGh5X2FudF9yeGRpdl9zZXQod2xjLT5iYW5kLT5waSwgd2xjLT5zdGYtPmFudF9yeF9vdnIpOwotI2VuZGlmCiB9CiAKLXZvaWQgd2xjX2ZhdGFsX2Vycm9yKHdsY19pbmZvX3QgKndsYykKK3ZvaWQgd2xjX2ZhdGFsX2Vycm9yKHN0cnVjdCB3bGNfaW5mbyAqd2xjKQogewotCVdMX0VSUk9SKCgid2wlZDogZmF0YWwgZXJyb3IsIHJlaW5pdGlhbGl6aW5nXG4iLCB3bGMtPnB1Yi0+dW5pdCkpOworCVdMX0VSUk9SKCJ3bCVkOiBmYXRhbCBlcnJvciwgcmVpbml0aWFsaXppbmdcbiIsIHdsYy0+cHViLT51bml0KTsKIAl3bF9pbml0KHdsYy0+d2wpOwogfQogCkBAIC00MjUsNyArMzk0LDcgQEAKICAqIGlmIG90aGVyIGNvbmZpZ3VyYXRpb25zIGFyZSBpbiBjb25mbGljdCAoYmFuZGxvY2tlZCwgMTFuIG1vZGUgZGlzYWJsZWQsCiAgKiBpbnZhbGlkIGNoYW5uZWwgZm9yIGN1cnJlbnQgY291bnRyeSwgZXRjLikKICAqLwotc3RhdGljIGNoYW5zcGVjX3Qgd2xjX2luaXRfY2hhbnNwZWMod2xjX2luZm9fdCAqd2xjKQorc3RhdGljIGNoYW5zcGVjX3Qgd2xjX2luaXRfY2hhbnNwZWMoc3RydWN0IHdsY19pbmZvICp3bGMpCiB7CiAJY2hhbnNwZWNfdCBjaGFuc3BlYyA9CiAJICAgIDEgfCBXTF9DSEFOU1BFQ19CV18yMCB8IFdMX0NIQU5TUEVDX0NUTF9TQl9OT05FIHwKQEAgLTQ0MSw3ICs0MTAsNyBAQAogCiBzdHJ1Y3Qgc2NiIGdsb2JhbF9zY2I7CiAKLXN0YXRpYyB2b2lkIHdsY19pbml0X3NjYih3bGNfaW5mb190ICp3bGMsIHN0cnVjdCBzY2IgKnNjYikKK3N0YXRpYyB2b2lkIHdsY19pbml0X3NjYihzdHJ1Y3Qgd2xjX2luZm8gKndsYywgc3RydWN0IHNjYiAqc2NiKQogewogCWludCBpOwogCXNjYi0+ZmxhZ3MgPSBTQ0JfV01FQ0FQIHwgU0NCX0hUQ0FQOwpAQCAtNDQ5LDcgKzQxOCw3IEBACiAJCXNjYi0+c2VxbnVtW2ldID0gMDsKIH0KIAotdm9pZCB3bGNfaW5pdCh3bGNfaW5mb190ICp3bGMpCit2b2lkIHdsY19pbml0KHN0cnVjdCB3bGNfaW5mbyAqd2xjKQogewogCWQxMXJlZ3NfdCAqcmVnczsKIAljaGFuc3BlY190IGNoYW5zcGVjOwpAQCAtNDU3LDcgKzQyNiw3IEBACiAJd2xjX2Jzc2NmZ190ICpic3NjZmc7CiAJYm9vbCBtdXRlID0gZmFsc2U7CiAKLQlXTF9UUkFDRSgoIndsJWQ6IHdsY19pbml0XG4iLCB3bGMtPnB1Yi0+dW5pdCkpOworCVdMX1RSQUNFKCJ3bCVkOiB3bGNfaW5pdFxuIiwgd2xjLT5wdWItPnVuaXQpOwogCiAJcmVncyA9IHdsYy0+cmVnczsKIApAQCAtNTgzLDEzICs1NTIsMTMgQEAKIAl9CiB9CiAKLXZvaWQgd2xjX21hY19iY25fcHJvbWlzY19jaGFuZ2Uod2xjX2luZm9fdCAqd2xjLCBib29sIHByb21pc2MpCit2b2lkIHdsY19tYWNfYmNuX3Byb21pc2NfY2hhbmdlKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCBib29sIHByb21pc2MpCiB7CiAJd2xjLT5iY25taXNjX21vbml0b3IgPSBwcm9taXNjOwogCXdsY19tYWNfYmNuX3Byb21pc2Mod2xjKTsKIH0KIAotdm9pZCB3bGNfbWFjX2Jjbl9wcm9taXNjKHdsY19pbmZvX3QgKndsYykKK3ZvaWQgd2xjX21hY19iY25fcHJvbWlzYyhzdHJ1Y3Qgd2xjX2luZm8gKndsYykKIHsKIAlpZiAoKEFQX0VOQUIod2xjLT5wdWIpICYmIChOX0VOQUIod2xjLT5wdWIpIHx8IHdsYy0+YmFuZC0+Z21vZGUpKSB8fAogCSAgICB3bGMtPmJjbm1pc2NfaWJzcyB8fCB3bGMtPmJjbm1pc2Nfc2NhbiB8fCB3bGMtPmJjbm1pc2NfbW9uaXRvcikKQEAgLTU5OSw3ICs1NjgsNyBAQAogfQogCiAvKiBzZXQgb3IgY2xlYXIgbWFjY29udHJvbCBiaXRzIE1DVExfUFJPTUlTQyBhbmQgTUNUTF9LRUVQQ09OVFJPTCAqLwotdm9pZCB3bGNfbWFjX3Byb21pc2Mod2xjX2luZm9fdCAqd2xjKQordm9pZCB3bGNfbWFjX3Byb21pc2Moc3RydWN0IHdsY19pbmZvICp3bGMpCiB7CiAJdTMyIHByb21pc2NfYml0cyA9IDA7CiAKQEAgLTYyMSw3ICs1OTAsNyBAQAogfQogCiAvKiBjaGVjayBpZiBocHMgYW5kIHdha2Ugc3RhdGVzIG9mIHN3IGFuZCBodyBhcmUgaW4gc3luYyAqLwotYm9vbCB3bGNfcHNfY2hlY2sod2xjX2luZm9fdCAqd2xjKQorYm9vbCB3bGNfcHNfY2hlY2soc3RydWN0IHdsY19pbmZvICp3bGMpCiB7CiAJYm9vbCByZXMgPSB0cnVlOwogCWJvb2wgaHBzLCB3YWtlOwpAQCAtNjM2LDggKzYwNSw4IEBACiAJCSAqIHRvIGF2b2lkIGFzc2VydAogCQkgKi8KIAkJaWYgKHRtcCA9PSAweGZmZmZmZmZmKSB7Ci0JCQlXTF9FUlJPUigoIndsJWQ6ICVzOiBkZWFkIGNoaXBcbiIsIHdsYy0+cHViLT51bml0LAotCQkJCSAgX19mdW5jX18pKTsKKwkJCVdMX0VSUk9SKCJ3bCVkOiAlczogZGVhZCBjaGlwXG4iLAorCQkJCSB3bGMtPnB1Yi0+dW5pdCwgX19mdW5jX18pOwogCQkJcmV0dXJuIERFVklDRVJFTU9WRUQod2xjKTsKIAkJfQogCkBAIC02NDYsNyArNjE1LDggQEAKIAkJaWYgKGhwcyAhPSAoKHRtcCAmIE1DVExfSFBTKSAhPSAwKSkgewogCQkJaW50IGlkeDsKIAkJCXdsY19ic3NjZmdfdCAqY2ZnOwotCQkJV0xfRVJST1IoKCJ3bCVkOiBocHMgbm90IHN5bmMsIHN3ICVkLCBtYWNjb250cm9sIDB4JXhcbiIsIHdsYy0+cHViLT51bml0LCBocHMsIHRtcCkpOworCQkJV0xfRVJST1IoIndsJWQ6IGhwcyBub3Qgc3luYywgc3cgJWQsIG1hY2NvbnRyb2wgMHgleFxuIiwKKwkJCQkgd2xjLT5wdWItPnVuaXQsIGhwcywgdG1wKTsKIAkJCUZPUkVBQ0hfQlNTKHdsYywgaWR4LCBjZmcpIHsKIAkJCQlpZiAoIUJTU0NGR19TVEEoY2ZnKSkKIAkJCQkJY29udGludWU7CkBAIC02NTQsMjMgKzYyNCwxNCBAQAogCiAJCQlyZXMgPSBmYWxzZTsKIAkJfQotI2lmZGVmIFdMQ19MT1cKIAkJLyogRm9yIGEgbW9ub2xpdGhpYyBidWlsZCB0aGUgd2FrZSBjaGVjayBjYW4gYmUgZXhhY3Qgc2luY2UgaXQgbG9va3MgYXQgd2FrZQogCQkgKiBvdmVycmlkZSBiaXRzLiBUaGUgTUNUTF9XQUtFIGJpdCBzaG91bGQgbWF0Y2ggdGhlICd3YWtlJyB2YWx1ZS4KIAkJICovCiAJCXdha2UgPSBTVEFZX0FXQUtFKHdsYykgfHwgd2xjLT5ody0+d2FrZV9vdmVycmlkZTsKIAkJd2FrZV9vayA9ICh3YWtlID09ICgodG1wICYgTUNUTF9XQUtFKSAhPSAwKSk7Ci0jZWxzZQotCQkvKiBGb3IgYSBzcGxpdCBidWlsZCB3ZSB3aWxsIG5vdCBoYXZlIGFjY2VzcyB0byBhbnkgd2FrZSBvdmVycmlkZXMgZnJvbSB0aGUgbG93Ci0JCSAqIGxldmVsLiBUaGUgY2hlY2sgY2FuIG9ubHkgbWFrZSBzdXJlIHRoZSBNQ1RMX1dBS0UgYml0IGlzIG9uIGlmIHRoZSBoaWdoCi0JCSAqIGxldmVsICd3YWtlJyB2YWx1ZSBpcyB0cnVlLiBJZiB0aGUgaGlnaCBsZXZlbCAnd2FrZScgaXMgZmFsc2UsIHRoZSBNQ1RMX1dBS0UKLQkJICogbWF5IGJlIGVpdGhlciB0cnVlIG9yIGZhbHNlIGR1ZSB0byB0aGUgbG93IGxldmVsIG92ZXJyaWRlLgotCQkgKi8KLQkJd2FrZSA9IFNUQVlfQVdBS0Uod2xjKTsKLQkJd2FrZV9vayA9ICh3YWtlICYmICgodG1wICYgTUNUTF9XQUtFKSAhPSAwKSkgfHwgIXdha2U7Ci0jZW5kaWYKIAkJaWYgKGhwcyAmJiAhd2FrZV9vaykgewotCQkJV0xfRVJST1IoKCJ3bCVkOiB3YWtlIG5vdCBzeW5jLCBzdyAlZCBtYWNjb250cm9sIDB4JXhcbiIsIHdsYy0+cHViLT51bml0LCB3YWtlLCB0bXApKTsKKwkJCVdMX0VSUk9SKCJ3bCVkOiB3YWtlIG5vdCBzeW5jLCBzdyAlZCBtYWNjb250cm9sIDB4JXhcbiIsCisJCQkJIHdsYy0+cHViLT51bml0LCB3YWtlLCB0bXApOwogCQkJcmVzID0gZmFsc2U7CiAJCX0KIAl9CkBAIC02NzksNyArNjQwLDcgQEAKIH0KIAogLyogcHVzaCBzdyBocHMgYW5kIHdha2Ugc3RhdGUgdGhyb3VnaCBoYXJkd2FyZSAqLwotdm9pZCB3bGNfc2V0X3BzX2N0cmwod2xjX2luZm9fdCAqd2xjKQordm9pZCB3bGNfc2V0X3BzX2N0cmwoc3RydWN0IHdsY19pbmZvICp3bGMpCiB7CiAJdTMyIHYxLCB2MjsKIAlib29sIGhwcywgd2FrZTsKQEAgLTY4OCw4ICs2NDksOCBAQAogCWhwcyA9IFBTX0FMTE9XRUQod2xjKTsKIAl3YWtlID0gaHBzID8gKFNUQVlfQVdBS0Uod2xjKSkgOiB0cnVlOwogCi0JV0xfVFJBQ0UoKCJ3bCVkOiB3bGNfc2V0X3BzX2N0cmw6IGhwcyAlZCB3YWtlICVkXG4iLCB3bGMtPnB1Yi0+dW5pdCwKLQkJICBocHMsIHdha2UpKTsKKwlXTF9UUkFDRSgid2wlZDogd2xjX3NldF9wc19jdHJsOiBocHMgJWQgd2FrZSAlZFxuIiwKKwkJIHdsYy0+cHViLT51bml0LCBocHMsIHdha2UpOwogCiAJdjEgPSBSX1JFRyh3bGMtPm9zaCwgJndsYy0+cmVncy0+bWFjY29udHJvbCk7CiAJdjIgPSAwOwpAQCAtNzE0LDcgKzY3NSw3IEBACiBpbnQgd2xjX3NldF9tYWMod2xjX2Jzc2NmZ190ICpjZmcpCiB7CiAJaW50IGVyciA9IDA7Ci0Jd2xjX2luZm9fdCAqd2xjID0gY2ZnLT53bGM7CisJc3RydWN0IHdsY19pbmZvICp3bGMgPSBjZmctPndsYzsKIAogCWlmIChjZmcgPT0gd2xjLT5jZmcpIHsKIAkJLyogZW50ZXIgdGhlIE1BQyBhZGRyIGludG8gdGhlIFJYRSBtYXRjaCByZWdpc3RlcnMgKi8KQEAgLTczMSw3ICs2OTIsNyBAQAogICovCiB2b2lkIHdsY19zZXRfYnNzaWQod2xjX2Jzc2NmZ190ICpjZmcpCiB7Ci0Jd2xjX2luZm9fdCAqd2xjID0gY2ZnLT53bGM7CisJc3RydWN0IHdsY19pbmZvICp3bGMgPSBjZmctPndsYzsKIAogCS8qIGlmIHByaW1hcnkgY29uZmlnLCB3ZSBuZWVkIHRvIHVwZGF0ZSBCU1NJRCBpbiBSWEUgbWF0Y2ggcmVnaXN0ZXJzICovCiAJaWYgKGNmZyA9PSB3bGMtPmNmZykgewpAQCAtNzQ4LDcgKzcwOSw3IEBACiAgKiBTdXNwZW5kIHRoZSB0aGUgTUFDIGFuZCB1cGRhdGUgdGhlIHNsb3QgdGltaW5nCiAgKiBmb3Igc3RhbmRhcmQgMTFiL2cgKDIwdXMgc2xvdHMpIG9yIHNob3J0c2xvdCAxMWcgKDl1cyBzbG90cykuCiAgKi8KLXZvaWQgd2xjX3N3aXRjaF9zaG9ydHNsb3Qod2xjX2luZm9fdCAqd2xjLCBib29sIHNob3J0c2xvdCkKK3ZvaWQgd2xjX3N3aXRjaF9zaG9ydHNsb3Qoc3RydWN0IHdsY19pbmZvICp3bGMsIGJvb2wgc2hvcnRzbG90KQogewogCWludCBpZHg7CiAJd2xjX2Jzc2NmZ190ICpjZmc7CkBAIC03NzYsNyArNzM3LDcgQEAKIAl3bGNfYm1hY19zZXRfc2hvcnRzbG90KHdsYy0+aHcsIHNob3J0c2xvdCk7CiB9CiAKLXN0YXRpYyB1OCB3bGNfbG9jYWxfY29uc3RyYWludF9xZGJtKHdsY19pbmZvX3QgKndsYykKK3N0YXRpYyB1OCB3bGNfbG9jYWxfY29uc3RyYWludF9xZGJtKHN0cnVjdCB3bGNfaW5mbyAqd2xjKQogewogCXU4IGxvY2FsOwogCXMxNiBsb2NhbF9tYXg7CkBAIC04MDMsNyArNzY0LDcgQEAKIH0KIAogLyogcHJvcGFnYXRlIGhvbWUgY2hhbnNwZWMgdG8gYWxsIGJzc2NmZ3MgaW4gY2FzZSBic3NjZmctPmN1cnJlbnRfYnNzLT5jaGFuc3BlYyBpcyByZWZlcmVuY2VkICovCi12b2lkIHdsY19zZXRfaG9tZV9jaGFuc3BlYyh3bGNfaW5mb190ICp3bGMsIGNoYW5zcGVjX3QgY2hhbnNwZWMpCit2b2lkIHdsY19zZXRfaG9tZV9jaGFuc3BlYyhzdHJ1Y3Qgd2xjX2luZm8gKndsYywgY2hhbnNwZWNfdCBjaGFuc3BlYykKIHsKIAlpZiAod2xjLT5ob21lX2NoYW5zcGVjICE9IGNoYW5zcGVjKSB7CiAJCWludCBpZHg7CkBAIC04MjEsNyArNzgyLDcgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIHdsY19zZXRfcGh5X2NoYW5zcGVjKHdsY19pbmZvX3QgKndsYywgY2hhbnNwZWNfdCBjaGFuc3BlYykKK3N0YXRpYyB2b2lkIHdsY19zZXRfcGh5X2NoYW5zcGVjKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCBjaGFuc3BlY190IGNoYW5zcGVjKQogewogCS8qIFNhdmUgb3VyIGNvcHkgb2YgdGhlIGNoYW5zcGVjICovCiAJd2xjLT5jaGFuc3BlYyA9IGNoYW5zcGVjOwpAQCAtODQwLDE1ICs4MDEsMTUgQEAKIAogfQogCi12b2lkIHdsY19zZXRfY2hhbnNwZWMod2xjX2luZm9fdCAqd2xjLCBjaGFuc3BlY190IGNoYW5zcGVjKQordm9pZCB3bGNfc2V0X2NoYW5zcGVjKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCBjaGFuc3BlY190IGNoYW5zcGVjKQogewogCXVpbnQgYmFuZHVuaXQ7CiAJYm9vbCBzd2l0Y2hiYW5kID0gZmFsc2U7CiAJY2hhbnNwZWNfdCBvbGRfY2hhbnNwZWMgPSB3bGMtPmNoYW5zcGVjOwogCiAJaWYgKCF3bGNfdmFsaWRfY2hhbnNwZWNfZGIod2xjLT5jbWksIGNoYW5zcGVjKSkgewotCQlXTF9FUlJPUigoIndsJWQ6ICVzOiBCYWQgY2hhbm5lbCAlZFxuIiwKLQkJCSAgd2xjLT5wdWItPnVuaXQsIF9fZnVuY19fLCBDSFNQRUNfQ0hBTk5FTChjaGFuc3BlYykpKTsKKwkJV0xfRVJST1IoIndsJWQ6ICVzOiBCYWQgY2hhbm5lbCAlZFxuIiwKKwkJCSB3bGMtPnB1Yi0+dW5pdCwgX19mdW5jX18sIENIU1BFQ19DSEFOTkVMKGNoYW5zcGVjKSk7CiAJCUFTU0VSVCh3bGNfdmFsaWRfY2hhbnNwZWNfZGIod2xjLT5jbWksIGNoYW5zcGVjKSk7CiAJCXJldHVybjsKIAl9CkBAIC04NTksNyArODIwLDkgQEAKIAkJaWYgKHdsYy0+YmFuZC0+YmFuZHVuaXQgIT0gYmFuZHVuaXQgfHwgd2xjLT5iYW5kaW5pdF9wZW5kaW5nKSB7CiAJCQlzd2l0Y2hiYW5kID0gdHJ1ZTsKIAkJCWlmICh3bGMtPmJhbmRsb2NrZWQpIHsKLQkJCQlXTF9FUlJPUigoIndsJWQ6ICVzOiBjaHNwZWMgJWQgYmFuZCBpcyBsb2NrZWQhXG4iLCB3bGMtPnB1Yi0+dW5pdCwgX19mdW5jX18sIENIU1BFQ19DSEFOTkVMKGNoYW5zcGVjKSkpOworCQkJCVdMX0VSUk9SKCJ3bCVkOiAlczogY2hzcGVjICVkIGJhbmQgaXMgbG9ja2VkIVxuIiwKKwkJCQkJIHdsYy0+cHViLT51bml0LCBfX2Z1bmNfXywKKwkJCQkJIENIU1BFQ19DSEFOTkVMKGNoYW5zcGVjKSk7CiAJCQkJcmV0dXJuOwogCQkJfQogCQkJLyogQk1BQ19OT1RFOiBzaG91bGQgdGhlIHNldGJhbmQgY2FsbCBjb21lIGFmdGVyIHRoZSB3bGNfYm1hY19jaGFuc3BlYygpID8KQEAgLTg5NSw3ICs4NTgsNyBAQAogfQogCiAjaWYgZGVmaW5lZChCQ01EQkcpCi1zdGF0aWMgaW50IHdsY19nZXRfY3VycmVudF90eHB3cih3bGNfaW5mb190ICp3bGMsIHZvaWQgKnB3ciwgdWludCBsZW4pCitzdGF0aWMgaW50IHdsY19nZXRfY3VycmVudF90eHB3cihzdHJ1Y3Qgd2xjX2luZm8gKndsYywgdm9pZCAqcHdyLCB1aW50IGxlbikKIHsKIAl0eHB3cl9saW1pdHNfdCB0eHB3cjsKIAl0eF9wb3dlcl90IHBvd2VyOwpAQCAtOTA5LDcgKzg3Miw3IEBACiAJZWxzZSBpZiAobGVuIDwgc2l6ZW9mKHR4X3Bvd2VyX3QpKQogCQlyZXR1cm4gQkNNRV9CVUZUT09TSE9SVDsKIAotCWJ6ZXJvKCZwb3dlciwgc2l6ZW9mKHR4X3Bvd2VyX3QpKTsKKwltZW1zZXQoJnBvd2VyLCAwLCBzaXplb2YodHhfcG93ZXJfdCkpOwogCiAJcG93ZXIuY2hhbnNwZWMgPSBXTENfQkFORF9QSV9SQURJT19DSEFOU1BFQzsKIAlpZiAod2xjLT5wdWItPmFzc29jaWF0ZWQpCkBAIC0xMDMxLDcgKzk5NCw3IEBACiAJfSBlbHNlIHsKIAkJaW50IGJhbmRfaWR4ID0gQ0hTUEVDX0lTMkcocG93ZXIuY2hhbnNwZWMpID8gMCA6IDE7CiAKLQkJYnplcm8ob2xkX3Bvd2VyLCBzaXplb2YodHhfcG93ZXJfbGVnYWN5X3QpKTsKKwkJbWVtc2V0KG9sZF9wb3dlciwgMCwgc2l6ZW9mKHR4X3Bvd2VyX2xlZ2FjeV90KSk7CiAKIAkJb2xkX3Bvd2VyLT50eHB3cl9sb2NhbF9tYXggPSBwb3dlci5sb2NhbF9tYXg7CiAJCW9sZF9wb3dlci0+dHhwd3JfbG9jYWxfY29uc3RyYWludCA9IHBvd2VyLmxvY2FsX2NvbnN0cmFpbnQ7CkBAIC0xMDY0LDcgKzEwMjcsNyBAQAogfQogI2VuZGlmCQkJCS8qIGRlZmluZWQoQkNNREJHKSAqLwogCi1zdGF0aWMgdTMyIHdsY193YXRjaGRvZ19iYWNrdXBfYmkod2xjX2luZm9fdCAqd2xjKQorc3RhdGljIHUzMiB3bGNfd2F0Y2hkb2dfYmFja3VwX2JpKHN0cnVjdCB3bGNfaW5mbyAqd2xjKQogewogCXUzMiBiaTsKIAliaSA9IDIgKiB3bGMtPmNmZy0+Y3VycmVudF9ic3MtPmR0aW1fcGVyaW9kICoKQEAgLTEwODMsNyArMTA0Niw3IEBACiAvKiBDaGFuZ2UgdG8gcnVuIHRoZSB3YXRjaGRvZyBlaXRoZXIgZnJvbSBhIHBlcmlvZGljIHRpbWVyIG9yIGZyb20gdGJ0dCBoYW5kbGVyLgogICogQ2FsbCB3YXRjaGRvZyBmcm9tIHRidHQgaGFuZGxlciBpZiB0YnR0IGlzIHRydWUsIHdhdGNoZG9nIHRpbWVyIG90aGVyd2lzZS4KICAqLwotdm9pZCB3bGNfd2F0Y2hkb2dfdXBkKHdsY19pbmZvX3QgKndsYywgYm9vbCB0YnR0KQordm9pZCB3bGNfd2F0Y2hkb2dfdXBkKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCBib29sIHRidHQpCiB7CiAJLyogbWFrZSBzdXJlIGNoYW5naW5nIHdhdGNoZG9nIGRyaXZlciBpcyBhbGxvd2VkICovCiAJaWYgKCF3bGMtPnB1Yi0+dXAgfHwgIXdsYy0+cHViLT5hbGlnbl93ZF90YnR0KQpAQCAtMTExMiw3ICsxMDc1LDcgQEAKIAl9CiB9CiAKLXJhdGVzcGVjX3Qgd2xjX2xvd2VzdF9iYXNpY19yc3BlYyh3bGNfaW5mb190ICp3bGMsIHdsY19yYXRlc2V0X3QgKnJzKQorcmF0ZXNwZWNfdCB3bGNfbG93ZXN0X2Jhc2ljX3JzcGVjKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCB3bGNfcmF0ZXNldF90ICpycykKIHsKIAlyYXRlc3BlY190IGxvd2VzdF9iYXNpY19yc3BlYzsKIAl1aW50IGk7CkBAIC0xMTQwLDcgKzExMDMsNyBAQAogICogIHJhdGVzcGVjICAgICBDQ0sJCWFudCA9IHdsYy0+c3RmLT50eGFudAogICogIAkJT0ZETQkJYW50ID0gMwogICovCi12b2lkIHdsY19iZWFjb25fcGh5dHhjdGxfdHhhbnRfdXBkKHdsY19pbmZvX3QgKndsYywgcmF0ZXNwZWNfdCBiY25fcnNwZWMpCit2b2lkIHdsY19iZWFjb25fcGh5dHhjdGxfdHhhbnRfdXBkKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCByYXRlc3BlY190IGJjbl9yc3BlYykKIHsKIAl1MTYgcGh5Y3RsOwogCXUxNiBwaHl0eGFudCA9IHdsYy0+c3RmLT5waHl0eGFudDsKQEAgLTExNTksOSArMTEyMiw5IEBACiAvKiBjZW50cmFsaXplZCBwcm90ZWN0aW9uIGNvbmZpZyBjaGFuZ2UgZnVuY3Rpb24gdG8gc2ltcGxpZnkgZGVidWdnaW5nLCBubyBjb25zaXN0ZW5jeSBjaGVja2luZwogICogdGhpcyBzaG91bGQgYmUgY2FsbGVkIG9ubHkgb24gY2hhbmdlcyB0byBhdm9pZCBvdmVyaGVhZCBpbiBwZXJpb2RpYyBmdW5jdGlvbgogKi8KLXZvaWQgd2xjX3Byb3RlY3Rpb25fdXBkKHdsY19pbmZvX3QgKndsYywgdWludCBpZHgsIGludCB2YWwpCit2b2lkIHdsY19wcm90ZWN0aW9uX3VwZChzdHJ1Y3Qgd2xjX2luZm8gKndsYywgdWludCBpZHgsIGludCB2YWwpCiB7Ci0JV0xfVFJBQ0UoKCJ3bGNfcHJvdGVjdGlvbl91cGQ6IGlkeCAlZCwgdmFsICVkXG4iLCBpZHgsIHZhbCkpOworCVdMX1RSQUNFKCJ3bGNfcHJvdGVjdGlvbl91cGQ6IGlkeCAlZCwgdmFsICVkXG4iLCBpZHgsIHZhbCk7CiAKIAlzd2l0Y2ggKGlkeCkgewogCWNhc2UgV0xDX1BST1RfR19TUEVDOgpAQCAtMTIwNSw3ICsxMTY4LDcgQEAKIAogfQogCi1zdGF0aWMgdm9pZCB3bGNfaHRfdXBkYXRlX3NnaV9yeCh3bGNfaW5mb190ICp3bGMsIGludCB2YWwpCitzdGF0aWMgdm9pZCB3bGNfaHRfdXBkYXRlX3NnaV9yeChzdHJ1Y3Qgd2xjX2luZm8gKndsYywgaW50IHZhbCkKIHsKIAl3bGMtPmh0X2NhcC5jYXAgJj0gfihIVF9DQVBfU0hPUlRfR0lfMjAgfCBIVF9DQVBfU0hPUlRfR0lfNDApOwogCXdsYy0+aHRfY2FwLmNhcCB8PSAodmFsICYgV0xDX05fU0dJXzIwKSA/IEhUX0NBUF9TSE9SVF9HSV8yMCA6IDA7CkBAIC0xMjE3LDcgKzExODAsNyBAQAogCX0KIH0KIAotc3RhdGljIHZvaWQgd2xjX2h0X3VwZGF0ZV9sZHBjKHdsY19pbmZvX3QgKndsYywgczggdmFsKQorc3RhdGljIHZvaWQgd2xjX2h0X3VwZGF0ZV9sZHBjKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCBzOCB2YWwpCiB7CiAJd2xjLT5zdGYtPmxkcGMgPSB2YWw7CiAKQEAgLTEyMzYsNyArMTE5OSw3IEBACiAgKiB1Y29kZSwgaHdtYWMgdXBkYXRlCiAgKiAgICBDaGFubmVsIGRlcGVuZGVudCB1cGRhdGVzIGZvciB1Y29kZSBhbmQgaHcKICAqLwotc3RhdGljIHZvaWQgd2xjX3Vjb2RlX21hY191cGQod2xjX2luZm9fdCAqd2xjKQorc3RhdGljIHZvaWQgd2xjX3Vjb2RlX21hY191cGQoc3RydWN0IHdsY19pbmZvICp3bGMpCiB7CiAJLyogZW5hYmxlIG9yIGRpc2FibGUgYW55IGFjdGl2ZSBJQlNTcyBkZXBlbmRpbmcgb24gd2hldGhlciBvciBub3QKIAkgKiB3ZSBhcmUgb24gdGhlIGhvbWUgY2hhbm5lbApAQCAtMTI2MywxMyArMTIyNiwxMyBAQAogCXdsY19tYWNfcHJvbWlzYyh3bGMpOwogfQogCi1zdGF0aWMgdm9pZCB3bGNfYmFuZGluaXRfb3JkZXJlZCh3bGNfaW5mb190ICp3bGMsIGNoYW5zcGVjX3QgY2hhbnNwZWMpCitzdGF0aWMgdm9pZCB3bGNfYmFuZGluaXRfb3JkZXJlZChzdHJ1Y3Qgd2xjX2luZm8gKndsYywgY2hhbnNwZWNfdCBjaGFuc3BlYykKIHsKIAl3bGNfcmF0ZXNldF90IGRlZmF1bHRfcmF0ZXNldDsKIAl1aW50IHBhcmtiYW5kOwogCXVpbnQgaSwgYmFuZF9vcmRlclsyXTsKIAotCVdMX1RSQUNFKCgid2wlZDogd2xjX2JhbmRpbml0X29yZGVyZWRcbiIsIHdsYy0+cHViLT51bml0KSk7CisJV0xfVFJBQ0UoIndsJWQ6IHdsY19iYW5kaW5pdF9vcmRlcmVkXG4iLCB3bGMtPnB1Yi0+dW5pdCk7CiAJLyoKIAkgKiBXZSBtaWdodCBoYXZlIGJlZW4gYmFuZGxvY2tlZCBkdXJpbmcgZG93biBhbmQgdGhlIGNoaXAgcG93ZXItY3ljbGVkIChoaWJlcm5hdGUpLgogCSAqIGZpZ3VyZSBvdXQgdGhlIHJpZ2h0IGJhbmQgdG8gcGFyayBvbgpAQCAtMTMxMCwxMCArMTI3MywxMCBAQAogfQogCiAvKiBiYW5kLXNwZWNpZmljIGluaXQgKi8KLXN0YXRpYyB2b2lkIFdMQkFORElOSVRGTih3bGNfYnNpbml0KSAod2xjX2luZm9fdCAqd2xjKQorc3RhdGljIHZvaWQgV0xCQU5ESU5JVEZOKHdsY19ic2luaXQpIChzdHJ1Y3Qgd2xjX2luZm8gKndsYykKIHsKLQlXTF9UUkFDRSgoIndsJWQ6IHdsY19ic2luaXQ6IGJhbmR1bml0ICVkXG4iLCB3bGMtPnB1Yi0+dW5pdCwKLQkJICB3bGMtPmJhbmQtPmJhbmR1bml0KSk7CisJV0xfVFJBQ0UoIndsJWQ6IHdsY19ic2luaXQ6IGJhbmR1bml0ICVkXG4iLAorCQkgd2xjLT5wdWItPnVuaXQsIHdsYy0+YmFuZC0+YmFuZHVuaXQpOwogCiAJLyogd3JpdGUgdWNvZGUgQUNLL0NUUyByYXRlIHRhYmxlICovCiAJd2xjX3NldF9yYXRldGFibGUod2xjKTsKQEAgLTEzMjgsNyArMTI5MSw3IEBACiB9CiAKIC8qIHN3aXRjaCB0byBhbmQgaW5pdGlhbGl6ZSBuZXcgYmFuZCAqLwotc3RhdGljIHZvaWQgV0xCQU5ESU5JVEZOKHdsY19zZXRiYW5kKSAod2xjX2luZm9fdCAqd2xjLCB1aW50IGJhbmR1bml0KQorc3RhdGljIHZvaWQgV0xCQU5ESU5JVEZOKHdsY19zZXRiYW5kKSAoc3RydWN0IHdsY19pbmZvICp3bGMsIHVpbnQgYmFuZHVuaXQpCiB7CiAJaW50IGlkeDsKIAl3bGNfYnNzY2ZnX3QgKmNmZzsKQEAgLTEzNTMsNyArMTMxNiw3IEBACiB9CiAKIC8qIEluaXRpYWxpemUgYSBXTUUgUGFyYW1ldGVyIEluZm8gRWxlbWVudCB3aXRoIGRlZmF1bHQgU1RBIHBhcmFtZXRlcnMgZnJvbSBXTU0gU3BlYywgVGFibGUgMTIgKi8KLXZvaWQgd2xjX3dtZV9pbml0cGFyYW1zX3N0YSh3bGNfaW5mb190ICp3bGMsIHdtZV9wYXJhbV9pZV90ICpwZSkKK3ZvaWQgd2xjX3dtZV9pbml0cGFyYW1zX3N0YShzdHJ1Y3Qgd2xjX2luZm8gKndsYywgd21lX3BhcmFtX2llX3QgKnBlKQogewogCXN0YXRpYyBjb25zdCB3bWVfcGFyYW1faWVfdCBzdGFkZWYgPSB7CiAJCVdNRV9PVUksCkBAIC0xMzc4LDcgKzEzNDEsNyBAQAogCW1lbWNweShwZSwgJnN0YWRlZiwgc2l6ZW9mKCpwZSkpOwogfQogCi12b2lkIHdsY193bWVfc2V0cGFyYW1zKHdsY19pbmZvX3QgKndsYywgdTE2IGFjaSwgdm9pZCAqYXJnLCBib29sIHN1c3BlbmQpCit2b2lkIHdsY193bWVfc2V0cGFyYW1zKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCB1MTYgYWNpLCB2b2lkICphcmcsIGJvb2wgc3VzcGVuZCkKIHsKIAlpbnQgaTsKIAlzaG1fYWNwYXJhbXNfdCBhY3Bfc2htOwpAQCAtMTM4OSw3ICsxMzUyLDcgQEAKIAogCS8qIE9ubHkgYXBwbHkgcGFyYW1zIGlmIHRoZSBjb3JlIGlzIG91dCBvZiByZXNldCBhbmQgaGFzIGNsb2NrcyAqLwogCWlmICghd2xjLT5jbGspIHsKLQkJV0xfRVJST1IoKCJ3bCVkOiAlcyA6IG5vLWNsb2NrXG4iLCB3bGMtPnB1Yi0+dW5pdCwgX19mdW5jX18pKTsKKwkJV0xfRVJST1IoIndsJWQ6ICVzIDogbm8tY2xvY2tcbiIsIHdsYy0+cHViLT51bml0LCBfX2Z1bmNfXyk7CiAJCXJldHVybjsKIAl9CiAKQEAgLTE0MDIsNyArMTM2NSw3IEBACiAJd2xjLT53bWVfYWRtY3RsID0gMDsKIAogCWRvIHsKLQkJYnplcm8oKGNoYXIgKikmYWNwX3NobSwgc2l6ZW9mKHNobV9hY3BhcmFtc190KSk7CisJCW1lbXNldCgoY2hhciAqKSZhY3Bfc2htLCAwLCBzaXplb2Yoc2htX2FjcGFyYW1zX3QpKTsKIAkJLyogZmluZCBvdXQgd2hpY2ggYWMgdGhpcyBzZXQgb2YgcGFyYW1zIGFwcGxpZXMgdG8gKi8KIAkJQVNTRVJUKGFjaSA8IEFDX0NPVU5UKTsKIAkJLyogc2V0IHRoZSBhZG1pc3Npb24gY29udHJvbCBwb2xpY3kgZm9yIHRoaXMgQUMgKi8KQEAgLTE0MjEsOCArMTM4NCw4IEBACiAKIAkJaWYgKGFjcF9zaG0uYWlmcyA8IEVEQ0ZfQUlGU05fTUlOCiAJCSAgICB8fCBhY3Bfc2htLmFpZnMgPiBFRENGX0FJRlNOX01BWCkgewotCQkJV0xfRVJST1IoKCJ3bCVkOiB3bGNfZWRjZl9zZXRwYXJhbXM6IGJhZCBhaWZzICVkXG4iLAotCQkJCSAgd2xjLT5wdWItPnVuaXQsIGFjcF9zaG0uYWlmcykpOworCQkJV0xfRVJST1IoIndsJWQ6IHdsY19lZGNmX3NldHBhcmFtczogYmFkIGFpZnMgJWRcbiIsCisJCQkJIHdsYy0+cHViLT51bml0LCBhY3Bfc2htLmFpZnMpOwogCQkJY29udGludWU7CiAJCX0KIApAQCAtMTQ1OSw3ICsxNDIyLDcgQEAKIAogdm9pZCB3bGNfZWRjZl9zZXRwYXJhbXMod2xjX2Jzc2NmZ190ICpjZmcsIGJvb2wgc3VzcGVuZCkKIHsKLQl3bGNfaW5mb190ICp3bGMgPSBjZmctPndsYzsKKwlzdHJ1Y3Qgd2xjX2luZm8gKndsYyA9IGNmZy0+d2xjOwogCXVpbnQgYWNpLCBpLCBqOwogCWVkY2ZfYWNwYXJhbV90ICplZGNmX2FjcDsKIAlzaG1fYWNwYXJhbXNfdCBhY3Bfc2htOwpAQCAtMTQ4Myw3ICsxNDQ2LDcgQEAKIAl3bGMtPndtZV9hZG1jdGwgPSAwOwogCiAJZm9yIChpID0gMDsgaSA8IEFDX0NPVU5UOyBpKyssIGVkY2ZfYWNwKyspIHsKLQkJYnplcm8oKGNoYXIgKikmYWNwX3NobSwgc2l6ZW9mKHNobV9hY3BhcmFtc190KSk7CisJCW1lbXNldCgoY2hhciAqKSZhY3Bfc2htLCAwLCBzaXplb2Yoc2htX2FjcGFyYW1zX3QpKTsKIAkJLyogZmluZCBvdXQgd2hpY2ggYWMgdGhpcyBzZXQgb2YgcGFyYW1zIGFwcGxpZXMgdG8gKi8KIAkJYWNpID0gKGVkY2ZfYWNwLT5BQ0kgJiBFRENGX0FDSV9NQVNLKSA+PiBFRENGX0FDSV9TSElGVDsKIAkJQVNTRVJUKGFjaSA8IEFDX0NPVU5UKTsKQEAgLTE1MDUsOCArMTQ2OCw4IEBACiAKIAkJaWYgKGFjcF9zaG0uYWlmcyA8IEVEQ0ZfQUlGU05fTUlOCiAJCSAgICB8fCBhY3Bfc2htLmFpZnMgPiBFRENGX0FJRlNOX01BWCkgewotCQkJV0xfRVJST1IoKCJ3bCVkOiB3bGNfZWRjZl9zZXRwYXJhbXM6IGJhZCBhaWZzICVkXG4iLAotCQkJCSAgd2xjLT5wdWItPnVuaXQsIGFjcF9zaG0uYWlmcykpOworCQkJV0xfRVJST1IoIndsJWQ6IHdsY19lZGNmX3NldHBhcmFtczogYmFkIGFpZnMgJWRcbiIsCisJCQkJIHdsYy0+cHViLT51bml0LCBhY3Bfc2htLmFpZnMpOwogCQkJY29udGludWU7CiAJCX0KIApAQCAtMTU0OCwyMCArMTUxMSwxOSBAQAogCiB9CiAKLWJvb2wgd2xjX3RpbWVyc19pbml0KHdsY19pbmZvX3QgKndsYywgaW50IHVuaXQpCitib29sIHdsY190aW1lcnNfaW5pdChzdHJ1Y3Qgd2xjX2luZm8gKndsYywgaW50IHVuaXQpCiB7CiAJd2xjLT53ZHRpbWVyID0gd2xfaW5pdF90aW1lcih3bGMtPndsLCB3bGNfd2F0Y2hkb2dfYnlfdGltZXIsCiAJCXdsYywgIndhdGNoZG9nIik7CiAJaWYgKCF3bGMtPndkdGltZXIpIHsKLQkJV0xfRVJST1IoKCJ3bCVkOiAgd2xfaW5pdF90aW1lciBmb3Igd2R0aW1lciBmYWlsZWRcbiIsIHVuaXQpKTsKKwkJV0xfRVJST1IoIndsJWQ6ICB3bF9pbml0X3RpbWVyIGZvciB3ZHRpbWVyIGZhaWxlZFxuIiwgdW5pdCk7CiAJCWdvdG8gZmFpbDsKIAl9CiAKIAl3bGMtPnJhZGlvX3RpbWVyID0gd2xfaW5pdF90aW1lcih3bGMtPndsLCB3bGNfcmFkaW9fdGltZXIsCiAJCXdsYywgInJhZGlvIik7CiAJaWYgKCF3bGMtPnJhZGlvX3RpbWVyKSB7Ci0JCVdMX0VSUk9SKCgid2wlZDogIHdsX2luaXRfdGltZXIgZm9yIHJhZGlvX3RpbWVyIGZhaWxlZFxuIiwKLQkJCSAgdW5pdCkpOworCQlXTF9FUlJPUigid2wlZDogIHdsX2luaXRfdGltZXIgZm9yIHJhZGlvX3RpbWVyIGZhaWxlZFxuIiwgdW5pdCk7CiAJCWdvdG8gZmFpbDsKIAl9CiAKQEAgLTE1NzUsNyArMTUzNyw3IEBACiAgKiBJbml0aWFsaXplIHdsY19pbmZvIGRlZmF1bHQgdmFsdWVzIC4uLgogICogbWF5IGdldCBvdmVycmlkZXMgbGF0ZXIgaW4gdGhpcyBmdW5jdGlvbgogICovCi12b2lkIHdsY19pbmZvX2luaXQod2xjX2luZm9fdCAqd2xjLCBpbnQgdW5pdCkKK3ZvaWQgd2xjX2luZm9faW5pdChzdHJ1Y3Qgd2xjX2luZm8gKndsYywgaW50IHVuaXQpCiB7CiAJaW50IGk7CiAJLyogQXNzdW1lIHRoZSBkZXZpY2UgaXMgdGhlcmUgdW50aWwgcHJvdmVuIG90aGVyd2lzZSAqLwpAQCAtMTY4Niw3ICsxNjQ4LDcgQEAKIAl3bGMtPnByODA4Mzhfd2FyID0gdHJ1ZTsKIH0KIAotc3RhdGljIGJvb2wgd2xjX3N0YXRlX2JtYWNfc3luYyh3bGNfaW5mb190ICp3bGMpCitzdGF0aWMgYm9vbCB3bGNfc3RhdGVfYm1hY19zeW5jKHN0cnVjdCB3bGNfaW5mbyAqd2xjKQogewogCXdsY19ibWFjX3N0YXRlX3Qgc3RhdGVfYm1hYzsKIApAQCAtMTcwMCw3ICsxNjYyLDcgQEAKIAlyZXR1cm4gdHJ1ZTsKIH0KIAotc3RhdGljIHVpbnQgd2xjX2F0dGFjaF9tb2R1bGUod2xjX2luZm9fdCAqd2xjKQorc3RhdGljIHVpbnQgd2xjX2F0dGFjaF9tb2R1bGUoc3RydWN0IHdsY19pbmZvICp3bGMpCiB7CiAJdWludCBlcnIgPSAwOwogCXVpbnQgdW5pdDsKQEAgLTE3MDgsMTUgKzE2NzAsMTQgQEAKIAogCXdsYy0+YXNpID0gd2xjX2FudHNlbF9hdHRhY2god2xjLCB3bGMtPm9zaCwgd2xjLT5wdWIsIHdsYy0+aHcpOwogCWlmICh3bGMtPmFzaSA9PSBOVUxMKSB7Ci0JCVdMX0VSUk9SKCgid2wlZDogd2xjX2F0dGFjaDogd2xjX2FudHNlbF9hdHRhY2ggZmFpbGVkXG4iLAotCQkJICB1bml0KSk7CisJCVdMX0VSUk9SKCJ3bCVkOiB3bGNfYXR0YWNoOiB3bGNfYW50c2VsX2F0dGFjaCBmYWlsZWRcbiIsIHVuaXQpOwogCQllcnIgPSA0NDsKIAkJZ290byBmYWlsOwogCX0KIAogCXdsYy0+YW1wZHUgPSB3bGNfYW1wZHVfYXR0YWNoKHdsYyk7CiAJaWYgKHdsYy0+YW1wZHUgPT0gTlVMTCkgewotCQlXTF9FUlJPUigoIndsJWQ6IHdsY19hdHRhY2g6IHdsY19hbXBkdV9hdHRhY2ggZmFpbGVkXG4iLCB1bml0KSk7CisJCVdMX0VSUk9SKCJ3bCVkOiB3bGNfYXR0YWNoOiB3bGNfYW1wZHVfYXR0YWNoIGZhaWxlZFxuIiwgdW5pdCk7CiAJCWVyciA9IDUwOwogCQlnb3RvIGZhaWw7CiAJfQpAQCAtMTcyNSwxMyArMTY4NiwxMyBAQAogCXdsYy0+ZXZlbnRxID0KIAkgICAgd2xjX2V2ZW50cV9hdHRhY2god2xjLT5wdWIsIHdsYywgd2xjLT53bCwgd2xjX3Byb2Nlc3NfZXZlbnRxKTsKIAlpZiAod2xjLT5ldmVudHEgPT0gTlVMTCkgewotCQlXTF9FUlJPUigoIndsJWQ6IHdsY19hdHRhY2g6IHdsY19ldmVudHFfYXR0YWNoZmFpbGVkXG4iLCB1bml0KSk7CisJCVdMX0VSUk9SKCJ3bCVkOiB3bGNfYXR0YWNoOiB3bGNfZXZlbnRxX2F0dGFjaGZhaWxlZFxuIiwgdW5pdCk7CiAJCWVyciA9IDU3OwogCQlnb3RvIGZhaWw7CiAJfQogCiAJaWYgKCh3bGNfc3RmX2F0dGFjaCh3bGMpICE9IDApKSB7Ci0JCVdMX0VSUk9SKCgid2wlZDogd2xjX2F0dGFjaDogd2xjX3N0Zl9hdHRhY2ggZmFpbGVkXG4iLCB1bml0KSk7CisJCVdMX0VSUk9SKCJ3bCVkOiB3bGNfYXR0YWNoOiB3bGNfc3RmX2F0dGFjaCBmYWlsZWRcbiIsIHVuaXQpOwogCQllcnIgPSA2ODsKIAkJZ290byBmYWlsOwogCX0KQEAgLTE3MzksOSArMTcwMCw5IEBACiAJcmV0dXJuIGVycjsKIH0KIAotd2xjX3B1Yl90ICp3bGNfcHViKHZvaWQgKndsYykKK3N0cnVjdCB3bGNfcHViICp3bGNfcHViKHZvaWQgKndsYykKIHsKLQlyZXR1cm4gKCh3bGNfaW5mb190ICopIHdsYyktPnB1YjsKKwlyZXR1cm4gKChzdHJ1Y3Qgd2xjX2luZm8gKikgd2xjKS0+cHViOwogfQogCiAjZGVmaW5lIENISVBfU1VQUE9SVFNfMTFOKHdsYykgCTEKQEAgLTE3NTAsMjUgKzE3MTEsMjUgQEAKICAqIFRoZSBjb21tb24gZHJpdmVyIGVudHJ5IHJvdXRpbmUuIEVycm9yIGNvZGVzIHNob3VsZCBiZSB1bmlxdWUKICAqLwogdm9pZCAqd2xjX2F0dGFjaCh2b2lkICp3bCwgdTE2IHZlbmRvciwgdTE2IGRldmljZSwgdWludCB1bml0LCBib29sIHBpb21vZGUsCi0JCSBvc2xfdCAqb3NoLCB2b2lkICpyZWdzdmEsIHVpbnQgYnVzdHlwZSwgdm9pZCAqYnRwYXJhbSwKLQkJIHVpbnQgKnBlcnIpCisJCSBzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgdm9pZCAqcmVnc3ZhLCB1aW50IGJ1c3R5cGUsCisJCSB2b2lkICpidHBhcmFtLCB1aW50ICpwZXJyKQogewotCXdsY19pbmZvX3QgKndsYzsKKwlzdHJ1Y3Qgd2xjX2luZm8gKndsYzsKIAl1aW50IGVyciA9IDA7CiAJdWludCBqOwotCXdsY19wdWJfdCAqcHViOworCXN0cnVjdCB3bGNfcHViICpwdWI7CiAJd2xjX3R4cV9pbmZvX3QgKnFpOwogCXVpbnQgbl9kaXNhYmxlZDsKIAotCVdMX05PTkUoKCJ3bCVkOiAlczogdmVuZG9yIDB4JXggZGV2aWNlIDB4JXhcbiIsIHVuaXQsIF9fZnVuY19fLCB2ZW5kb3IsCi0JCSBkZXZpY2UpKTsKKwlXTF9OT05FKCJ3bCVkOiAlczogdmVuZG9yIDB4JXggZGV2aWNlIDB4JXhcbiIsCisJCXVuaXQsIF9fZnVuY19fLCB2ZW5kb3IsIGRldmljZSk7CiAKIAlBU1NFUlQoV1NFQ19NQVhfUkNNVEFfS0VZUyA8PSBXU0VDX01BWF9LRVlTKTsKIAlBU1NFUlQoV1NFQ19NQVhfREVGQVVMVF9LRVlTID09IFdMQ19ERUZBVUxUX0tFWVMpOwogCiAJLyogc29tZSBjb2RlIGRlcGVuZHMgb24gcGFja2VkIHN0cnVjdHVyZXMgKi8KLQlBU1NFUlQoc2l6ZW9mKHN0cnVjdCBldGhlcl9hZGRyKSA9PSBFVEhFUl9BRERSX0xFTik7Ci0JQVNTRVJUKHNpemVvZihzdHJ1Y3QgZXRoZXJfaGVhZGVyKSA9PSBFVEhFUl9IRFJfTEVOKTsKKwlBU1NFUlQoc2l6ZW9mKHN0cnVjdCBldGhlcl9hZGRyKSA9PSBFVEhfQUxFTik7CisJQVNTRVJUKHNpemVvZihzdHJ1Y3QgZXRoZXJfaGVhZGVyKSA9PSBFVEhfSExFTik7CiAJQVNTRVJUKHNpemVvZihkMTFyZWdzX3QpID09IFNJX0NPUkVfU0laRSk7CiAJQVNTRVJUKHNpemVvZihvZmRtX3BoeV9oZHJfdCkgPT0gRDExX1BIWV9IRFJfTEVOKTsKIAlBU1NFUlQoc2l6ZW9mKGNja19waHlfaGRyX3QpID09IEQxMV9QSFlfSERSX0xFTik7CkBAIC0xNzgwLDggKzE3NDEsMTAgQEAKIAlBU1NFUlQoc2l6ZW9mKHN0cnVjdCBkb3QxMV9iY25fcHJiKSA9PSBET1QxMV9CQ05fUFJCX0xFTik7CiAJQVNTRVJUKHNpemVvZih0eF9zdGF0dXNfdCkgPT0gVFhTVEFUVVNfTEVOKTsKIAlBU1NFUlQoc2l6ZW9mKGh0X2NhcF9pZV90KSA9PSBIVF9DQVBfSUVfTEVOKTsKKyNpZmRlZiBCUkNNX0ZVTExNQUMKIAlBU1NFUlQob2Zmc2V0b2Yod2xfc2Nhbl9wYXJhbXNfdCwgY2hhbm5lbF9saXN0KSA9PQogCSAgICAgICBXTF9TQ0FOX1BBUkFNU19GSVhFRF9TSVpFKTsKKyNlbmRpZgogCUFTU0VSVChJU19BTElHTkVEKG9mZnNldG9mKHdzZWNfa2V5X3QsIGRhdGEpLCBzaXplb2YodTMyKSkpOwogCUFTU0VSVChJU1BPV0VST0YyKE1BX1dJTkRPV19TWikpOwogCkBAIC0xNzk3LDggKzE3NjAsOCBAQAogCSAgICAgICB8fCAoV1BBX0NBUF80X1JFUExBWV9DTlRSUyA9PSBXTENfUkVQTEFZX0NOVFJTX1ZBTFVFCiAJCSAgICYmIDQgPT0gV0xDX05VTVJYSVZTKSk7CiAKLQkvKiBhbGxvY2F0ZSB3bGNfaW5mb190IHN0YXRlIGFuZCBpdHMgc3Vic3RydWN0dXJlcyAqLwotCXdsYyA9ICh3bGNfaW5mb190ICopIHdsY19hdHRhY2hfbWFsbG9jKG9zaCwgdW5pdCwgJmVyciwgZGV2aWNlKTsKKwkvKiBhbGxvY2F0ZSBzdHJ1Y3Qgd2xjX2luZm8gc3RhdGUgYW5kIGl0cyBzdWJzdHJ1Y3R1cmVzICovCisJd2xjID0gKHN0cnVjdCB3bGNfaW5mbyAqKSB3bGNfYXR0YWNoX21hbGxvYyhvc2gsIHVuaXQsICZlcnIsIGRldmljZSk7CiAJaWYgKHdsYyA9PSBOVUxMKQogCQlnb3RvIGZhaWw7CiAJd2xjLT5vc2ggPSBvc2g7CkBAIC0xODE5LDcgKzE3ODIsNyBAQAogCS8qIEJ5IGRlZmF1bHQgcmVzdHJpY3QgVEtJUCBhc3NvY2lhdGlvbnMgZnJvbSAxMW4gU1RBJ3MgKi8KIAl3bGMtPmh0X3dzZWNfcmVzdHJpY3Rpb24gPSBXTENfSFRfVEtJUF9SRVNUUklDVDsKIAotCS8qIHBvcHVsYXRlIHdsY19pbmZvX3Qgd2l0aCBkZWZhdWx0IHZhbHVlcyAgKi8KKwkvKiBwb3B1bGF0ZSBzdHJ1Y3Qgd2xjX2luZm8gd2l0aCBkZWZhdWx0IHZhbHVlcyAgKi8KIAl3bGNfaW5mb19pbml0KHdsYywgdW5pdCk7CiAKIAkvKiB1cGRhdGUgc3RhL2FwIHJlbGF0ZWQgcGFyYW1ldGVycyAqLwpAQCAtMTg1MSwxMCArMTgxNCw2IEBACiAJLyogcHJvcGFnYXRlICp2YXJzKiBmcm9tIEJNQUMgZHJpdmVyIHRvIGhpZ2ggZHJpdmVyICovCiAJd2xjX2JtYWNfY29weWZyb21fdmFycyh3bGMtPmh3LCAmcHViLT52YXJzLCAmd2xjLT52YXJzX3NpemUpOwogCi0jaWZkZWYgV0xDX0hJR0hfT05MWQotCVdMX1RSQUNFKCgibnZyYW0gOiB2YXJzICVwICwgdmFyc19zaXplICVkXG4iLCBwdWItPnZhcnMsCi0JCSAgd2xjLT52YXJzX3NpemUpKTsKLSNlbmRpZgogCiAJLyogc2V0IG1heGltdW0gYWxsb3dlZCBkdXR5IGN5Y2xlICovCiAJd2xjLT50eF9kdXR5X2N5Y2xlX29mZG0gPQpAQCAtMTg3MiwxOSArMTgzMSwxNyBAQAogCXdsY19waHlfc3RmX2NoYWluX2luaXQod2xjLT5iYW5kLT5waSwgd2xjLT5zdGYtPmh3X3R4Y2hhaW4sCiAJCQkgICAgICAgd2xjLT5zdGYtPmh3X3J4Y2hhaW4pOwogCi0jaWZkZWYgV0xDX0xPVwogCS8qIHB1bGwgdXAgc29tZSBpbmZvIHJlc3VsdGluZyBmcm9tIHRoZSBsb3cgYXR0YWNoICovCiAJewogCQlpbnQgaTsKIAkJZm9yIChpID0gMDsgaSA8IE5GSUZPOyBpKyspCiAJCQl3bGMtPmNvcmUtPnR4YXZhaWxbaV0gPSB3bGMtPmh3LT50eGF2YWlsW2ldOwogCX0KLSNlbmRpZgkJCQkvKiBXTENfTE9XICovCiAKIAl3bGNfYm1hY19od19ldGhlcmFkZHIod2xjLT5odywgJndsYy0+cGVybV9ldGhlcmFkZHIpOwogCiAJYmNvcHkoKGNoYXIgKikmd2xjLT5wZXJtX2V0aGVyYWRkciwgKGNoYXIgKikmcHViLT5jdXJfZXRoZXJhZGRyLAotCSAgICAgIEVUSEVSX0FERFJfTEVOKTsKKwkgICAgICBFVEhfQUxFTik7CiAKIAlmb3IgKGogPSAwOyBqIDwgTkJBTkRTKHdsYyk7IGorKykgewogCQkvKiBVc2UgYmFuZCAxIGZvciBzaW5nbGUgYmFuZCAxMWEgKi8KQEAgLTE5NDIsNyArMTg5OSw3IEBACiAJCWdvdG8gZmFpbDsKIAogCWlmICghd2xjX3RpbWVyc19pbml0KHdsYywgdW5pdCkpIHsKLQkJV0xfRVJST1IoKCJ3bCVkOiAlczogd2xjX2luaXRfdGltZXIgZmFpbGVkXG4iLCB1bml0LCBfX2Z1bmNfXykpOworCQlXTF9FUlJPUigid2wlZDogJXM6IHdsY19pbml0X3RpbWVyIGZhaWxlZFxuIiwgdW5pdCwgX19mdW5jX18pOwogCQllcnIgPSAzMjsKIAkJZ290byBmYWlsOwogCX0KQEAgLTE5NTAsOCArMTkwNyw4IEBACiAJLyogZGVwZW5kIG9uIHJhdGVzZXQsIGdtb2RlICovCiAJd2xjLT5jbWkgPSB3bGNfY2hhbm5lbF9tZ3JfYXR0YWNoKHdsYyk7CiAJaWYgKCF3bGMtPmNtaSkgewotCQlXTF9FUlJPUigoIndsJWQ6ICVzOiB3bGNfY2hhbm5lbF9tZ3JfYXR0YWNoIGZhaWxlZFxuIiwgdW5pdCwKLQkJCSAgX19mdW5jX18pKTsKKwkJV0xfRVJST1IoIndsJWQ6ICVzOiB3bGNfY2hhbm5lbF9tZ3JfYXR0YWNoIGZhaWxlZFxuIiwKKwkJCSB1bml0LCBfX2Z1bmNfXyk7CiAJCWVyciA9IDMzOwogCQlnb3RvIGZhaWw7CiAJfQpAQCAtMTk2Niw4ICsxOTIzLDggQEAKIAkvKiBhbGxvY2F0ZSBvdXIgaW5pdGlhbCBxdWV1ZSAqLwogCXFpID0gd2xjX3R4cV9hbGxvYyh3bGMsIG9zaCk7CiAJaWYgKHFpID09IE5VTEwpIHsKLQkJV0xfRVJST1IoKCJ3bCVkOiAlczogZmFpbGVkIHRvIG1hbGxvYyB0eCBxdWV1ZVxuIiwgdW5pdCwKLQkJCSAgX19mdW5jX18pKTsKKwkJV0xfRVJST1IoIndsJWQ6ICVzOiBmYWlsZWQgdG8gbWFsbG9jIHR4IHF1ZXVlXG4iLAorCQkJIHVuaXQsIF9fZnVuY19fKTsKIAkJZXJyID0gMTAwOwogCQlnb3RvIGZhaWw7CiAJfQpAQCAtMjAzNyw3ICsxOTk0LDcgQEAKIAl3bGNfcmFkaW9fbXBjX3VwZCh3bGMpOwogCiAJaWYgKFdMQU5UU0VMX0VOQUIod2xjKSkgewotCQlpZiAoKENISVBJRCh3bGMtPnB1Yi0+c2loLT5jaGlwKSkgPT0gQkNNNDMyMzVfQ0hJUF9JRCkgeworCQlpZiAoKHdsYy0+cHViLT5zaWgtPmNoaXApID09IEJDTTQzMjM1X0NISVBfSUQpIHsKIAkJCWlmICgoZ2V0aW50dmFyKHdsYy0+cHViLT52YXJzLCAiYWEyZyIpID09IDcpIHx8CiAJCQkgICAgKGdldGludHZhcih3bGMtPnB1Yi0+dmFycywgImFhNWciKSA9PSA3KSkgewogCQkJCXdsY19ibWFjX2FudHNlbF9zZXQod2xjLT5odywgMSk7CkBAIC0yMDUzLDcgKzIwMTAsNyBAQAogCXJldHVybiAodm9pZCAqKXdsYzsKIAogIGZhaWw6Ci0JV0xfRVJST1IoKCJ3bCVkOiAlczogZmFpbGVkIHdpdGggZXJyICVkXG4iLCB1bml0LCBfX2Z1bmNfXywgZXJyKSk7CisJV0xfRVJST1IoIndsJWQ6ICVzOiBmYWlsZWQgd2l0aCBlcnIgJWRcbiIsIHVuaXQsIF9fZnVuY19fLCBlcnIpOwogCWlmICh3bGMpCiAJCXdsY19kZXRhY2god2xjKTsKIApAQCAtMjA2Miw3ICsyMDE5LDcgQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAotc3RhdGljIHZvaWQgd2xjX2F0dGFjaF9hbnRnYWluX2luaXQod2xjX2luZm9fdCAqd2xjKQorc3RhdGljIHZvaWQgd2xjX2F0dGFjaF9hbnRnYWluX2luaXQoc3RydWN0IHdsY19pbmZvICp3bGMpCiB7CiAJdWludCB1bml0OwogCXVuaXQgPSB3bGMtPnB1Yi0+dW5pdDsKQEAgLTIwNzEsNyArMjAyOCw4IEBACiAJCS8qIGRlZmF1bHQgYW50ZW5uYSBnYWluIGZvciBzcm9tIHJldiAxIGlzIDIgZEJtICg4IHFkYm0pICovCiAJCXdsYy0+YmFuZC0+YW50Z2FpbiA9IDg7CiAJfSBlbHNlIGlmICh3bGMtPmJhbmQtPmFudGdhaW4gPT0gLTEpIHsKLQkJV0xfRVJST1IoKCJ3bCVkOiAlczogSW52YWxpZCBhbnRlbm5hcyBhdmFpbGFibGUgaW4gc3JvbSwgdXNpbmcgMmRCXG4iLCB1bml0LCBfX2Z1bmNfXykpOworCQlXTF9FUlJPUigid2wlZDogJXM6IEludmFsaWQgYW50ZW5uYXMgYXZhaWxhYmxlIGluIHNyb20sIHVzaW5nIDJkQlxuIiwKKwkJCSB1bml0LCBfX2Z1bmNfXyk7CiAJCXdsYy0+YmFuZC0+YW50Z2FpbiA9IDg7CiAJfSBlbHNlIHsKIAkJczggZ2FpbiwgZnJhY3Q7CkBAIC0yMDkzLDcgKzIwNTEsNyBAQAogCX0KIH0KIAotc3RhdGljIGJvb2wgd2xjX2F0dGFjaF9zdGZfYW50X2luaXQod2xjX2luZm9fdCAqd2xjKQorc3RhdGljIGJvb2wgd2xjX2F0dGFjaF9zdGZfYW50X2luaXQoc3RydWN0IHdsY19pbmZvICp3bGMpCiB7CiAJaW50IGFhOwogCXVpbnQgdW5pdDsKQEAgLTIxMTAsNyArMjA2OCw4IEBACiAJCWFhID0gKHM4KSBnZXRpbnR2YXIodmFycywKIAkJCQkgICAgICAoQkFORF81RyhiYW5kdHlwZSkgPyAiYWExIiA6ICJhYTAiKSk7CiAJaWYgKChhYSA8IDEpIHx8IChhYSA+IDE1KSkgewotCQlXTF9FUlJPUigoIndsJWQ6ICVzOiBJbnZhbGlkIGFudGVubmFzIGF2YWlsYWJsZSBpbiBzcm9tICgweCV4KSwgdXNpbmcgMy5cbiIsIHVuaXQsIF9fZnVuY19fLCBhYSkpOworCQlXTF9FUlJPUigid2wlZDogJXM6IEludmFsaWQgYW50ZW5uYXMgYXZhaWxhYmxlIGluIHNyb20gKDB4JXgpLCB1c2luZyAzXG4iLAorCQkJIHVuaXQsIF9fZnVuY19fLCBhYSk7CiAJCWFhID0gMzsKIAl9CiAKQEAgLTIxMzIsMTM2ICsyMDkxLDggQEAKIAlyZXR1cm4gdHJ1ZTsKIH0KIAotI2lmZGVmIFdMQ19ISUdIX09OTFkKLS8qIEhJR0hfT05MWSBibWFjX2F0dGFjaCwgd2hpY2ggc3luYyBvdmVyIExPV19PTkxZIGJtYWNfYXR0YWNoIHN0YXRlcyAqLwotaW50IHdsY19ibWFjX2F0dGFjaCh3bGNfaW5mb190ICp3bGMsIHUxNiB2ZW5kb3IsIHUxNiBkZXZpY2UsIHVpbnQgdW5pdCwKLQkJICAgIGJvb2wgcGlvbW9kZSwgb3NsX3QgKm9zaCwgdm9pZCAqcmVnc3ZhLCB1aW50IGJ1c3R5cGUsCi0JCSAgICB2b2lkICpidHBhcmFtKQotewotCXdsY19ibWFjX3JldmluZm9fdCByZXZpbmZvOwotCXVpbnQgaWR4ID0gMDsKLQlycGNfaW5mb190ICpycGMgPSAocnBjX2luZm9fdCAqKSBidHBhcmFtOwogCi0JQVNTRVJUKGJ1c3R5cGUgPT0gUlBDX0JVUyk7Ci0KLQkvKiBpbnN0YWxsIHRoZSBycGMgaGFuZGxlIGluIHRoZSB2YXJpb3VzIHN0YXRlIHN0cnVjdHVyZXMgdXNlZCBieSBzdHViIFJQQyBmdW5jdGlvbnMgKi8KLQl3bGMtPnJwYyA9IHJwYzsKLQl3bGMtPmh3LT5ycGMgPSBycGM7Ci0Jd2xjLT5ody0+b3NoID0gb3NoOwotCi0Jd2xjLT5yZWdzID0gMDsKLQotCXdsYy0+cnBjdHggPSB3bGNfcnBjdHhfYXR0YWNoKHdsYy0+cHViLCB3bGMpOwotCWlmICh3bGMtPnJwY3R4ID09IE5VTEwpCi0JCXJldHVybiAtMTsKLQotCS8qCi0JICogRklGTyAwCi0JICogVFg6IFRYX0FDX0JLX0ZJRk8gKFRYIEFDIEJhY2tncm91bmQgZGF0YSBwYWNrZXRzKQotCSAqLwotCS8qIEFsd2F5cyBpbml0aWFsaXplZCAqLwotCUFTU0VSVChOUlBDVFhCVUZQT1NUIDw9IE5UWEQpOwotCXdsY19ycGN0eF9maWZvaW5pdCh3bGMtPnJwY3R4LCBUWF9EQVRBX0ZJRk8sIE5SUENUWEJVRlBPU1QpOwotCXdsY19ycGN0eF9maWZvaW5pdCh3bGMtPnJwY3R4LCBUWF9DVExfRklGTywgTlJQQ1RYQlVGUE9TVCk7Ci0Jd2xjX3JwY3R4X2ZpZm9pbml0KHdsYy0+cnBjdHgsIFRYX0JDTUNfRklGTywgTlJQQ1RYQlVGUE9TVCk7Ci0KLQkvKiBWSSBhbmQgQksgaW5pdGVkIG9ubHkgaWYgV01FICovCi0JaWYgKFdNRV9FTkFCKHdsYy0+cHViKSkgewotCQl3bGNfcnBjdHhfZmlmb2luaXQod2xjLT5ycGN0eCwgVFhfQUNfQktfRklGTywgTlJQQ1RYQlVGUE9TVCk7Ci0JCXdsY19ycGN0eF9maWZvaW5pdCh3bGMtPnJwY3R4LCBUWF9BQ19WSV9GSUZPLCBOUlBDVFhCVUZQT1NUKTsKLQl9Ci0KLQkvKiBBbGxvY2F0ZSBTQiBoYW5kbGUgKi8KLQl3bGMtPnB1Yi0+c2loID0gb3NsX21hbGxvYyh3bGMtPm9zaCwgc2l6ZW9mKHNpX3QpKTsKLQlpZiAoIXdsYy0+cHViLT5zaWgpCi0JCXJldHVybiAtMTsKLQliemVybyh3bGMtPnB1Yi0+c2loLCBzaXplb2Yoc2lfdCkpOwotCi0JLyogc3luYyB1cCByZXZpbmZvIHdpdGggQk1BQyAqLwotCWJ6ZXJvKCZyZXZpbmZvLCBzaXplb2Yod2xjX2JtYWNfcmV2aW5mb190KSk7Ci0JaWYgKHdsY19ibWFjX3JldmluZm9fZ2V0KHdsYy0+aHcsICZyZXZpbmZvKSAhPSAwKQotCQlyZXR1cm4gLTE7Ci0Jd2xjLT52ZW5kb3JpZCA9ICh1MTYpIHJldmluZm8udmVuZG9yaWQ7Ci0Jd2xjLT5kZXZpY2VpZCA9ICh1MTYpIHJldmluZm8uZGV2aWNlaWQ7Ci0KLQl3bGMtPnB1Yi0+Ym9hcmRyZXYgPSAodTE2KSByZXZpbmZvLmJvYXJkcmV2OwotCXdsYy0+cHViLT5jb3JlcmV2ID0gcmV2aW5mby5jb3JlcmV2OwotCXdsYy0+cHViLT5zcm9tcmV2ID0gKHU4KSByZXZpbmZvLnNyb21yZXY7Ci0Jd2xjLT5wdWItPnNpaC0+Y2hpcHJldiA9IHJldmluZm8uY2hpcHJldjsKLQl3bGMtPnB1Yi0+c2loLT5jaGlwID0gcmV2aW5mby5jaGlwOwotCXdsYy0+cHViLT5zaWgtPmNoaXBwa2cgPSByZXZpbmZvLmNoaXBwa2c7Ci0Jd2xjLT5wdWItPnNpaC0+Ym9hcmR0eXBlID0gcmV2aW5mby5ib2FyZHR5cGU7Ci0Jd2xjLT5wdWItPnNpaC0+Ym9hcmR2ZW5kb3IgPSByZXZpbmZvLmJvYXJkdmVuZG9yOwotCXdsYy0+cHViLT5zaWgtPmJ1c3R5cGUgPSByZXZpbmZvLmJ1c3R5cGU7Ci0Jd2xjLT5wdWItPnNpaC0+YnVzY29yZXR5cGUgPSByZXZpbmZvLmJ1c2NvcmV0eXBlOwotCXdsYy0+cHViLT5zaWgtPmJ1c2NvcmVyZXYgPSByZXZpbmZvLmJ1c2NvcmVyZXY7Ci0Jd2xjLT5wdWItPnNpaC0+aXNzaW0gPSAoYm9vbCkgcmV2aW5mby5pc3NpbTsKLQl3bGMtPnB1Yi0+c2loLT5ycGMgPSBycGM7Ci0KLQlpZiAocmV2aW5mby5uYmFuZHMgPT0gMCB8fCByZXZpbmZvLm5iYW5kcyA+IDIpCi0JCXJldHVybiAtMTsKLQl3bGMtPnB1Yi0+X25iYW5kcyA9IHJldmluZm8ubmJhbmRzOwotCi0JZm9yIChpZHggPSAwOyBpZHggPCB3bGMtPnB1Yi0+X25iYW5kczsgaWR4KyspIHsKLQkJdWludCBiYW5kdW5pdCwgYmFuZHR5cGU7CS8qIFRvIGFjY2VzcyBiYW5kc3RhdGUgKi8KLQkJd2xjX3BoeV90ICpwaSA9IG9zbF9tYWxsb2Mod2xjLT5vc2gsIHNpemVvZih3bGNfcGh5X3QpKTsKLQotCQlpZiAoIXBpKQotCQkJcmV0dXJuIC0xOwotCQliemVybyhwaSwgc2l6ZW9mKHdsY19waHlfdCkpOwotCQlwaS0+cnBjID0gcnBjOwotCi0JCWJhbmR1bml0ID0gcmV2aW5mby5iYW5kW2lkeF0uYmFuZHVuaXQ7Ci0JCWJhbmR0eXBlID0gcmV2aW5mby5iYW5kW2lkeF0uYmFuZHR5cGU7Ci0JCXdsYy0+YmFuZHN0YXRlW2JhbmR1bml0XS0+cmFkaW9yZXYgPQotCQkgICAgKHU4KSByZXZpbmZvLmJhbmRbaWR4XS5yYWRpb3JldjsKLQkJd2xjLT5iYW5kc3RhdGVbYmFuZHVuaXRdLT5waHl0eXBlID0KLQkJICAgICh1MTYpIHJldmluZm8uYmFuZFtpZHhdLnBoeXR5cGU7Ci0JCXdsYy0+YmFuZHN0YXRlW2JhbmR1bml0XS0+cGh5cmV2ID0KLQkJICAgICh1MTYpIHJldmluZm8uYmFuZFtpZHhdLnBoeXJldjsKLQkJd2xjLT5iYW5kc3RhdGVbYmFuZHVuaXRdLT5yYWRpb2lkID0KLQkJICAgICh1MTYpIHJldmluZm8uYmFuZFtpZHhdLnJhZGlvaWQ7Ci0JCXdsYy0+YmFuZHN0YXRlW2JhbmR1bml0XS0+YWJncGh5X2VuY29yZSA9Ci0JCSAgICByZXZpbmZvLmJhbmRbaWR4XS5hYmdwaHlfZW5jb3JlOwotCi0JCXdsYy0+YmFuZHN0YXRlW2JhbmR1bml0XS0+cGkgPSBwaTsKLQkJd2xjLT5iYW5kc3RhdGVbYmFuZHVuaXRdLT5iYW5kdW5pdCA9IGJhbmR1bml0OwotCQl3bGMtPmJhbmRzdGF0ZVtiYW5kdW5pdF0tPmJhbmR0eXBlID0gYmFuZHR5cGU7Ci0JfQotCi0JLyogbWlzYyBzdHVmZiAqLwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qIEZyZWUgdGhlIGNvbnZlbmllbmNlIGhhbmRsZXMgKi8KLWludCB3bGNfYm1hY19kZXRhY2god2xjX2luZm9fdCAqd2xjKQotewotCXVpbnQgaWR4OwotCi0JaWYgKHdsYy0+cHViLT5zaWgpIHsKLQkJb3NsX21mcmVlKHdsYy0+b3NoLCAodm9pZCAqKXdsYy0+cHViLT5zaWgsIHNpemVvZihzaV90KSk7Ci0JCXdsYy0+cHViLT5zaWggPSBOVUxMOwotCX0KLQotCWZvciAoaWR4ID0gMDsgaWR4IDwgTUFYQkFORFM7IGlkeCsrKQotCQlpZiAod2xjLT5iYW5kc3RhdGVbaWR4XS0+cGkpIHsKLQkJCWtmcmVlKHdsYy0+YmFuZHN0YXRlW2lkeF0tPnBpKTsKLQkJCXdsYy0+YmFuZHN0YXRlW2lkeF0tPnBpID0gTlVMTDsKLQkJfQotCi0JaWYgKHdsYy0+cnBjdHgpIHsKLQkJd2xjX3JwY3R4X2RldGFjaCh3bGMtPnJwY3R4KTsKLQkJd2xjLT5ycGN0eCA9IE5VTEw7Ci0JfQotCi0JcmV0dXJuIDA7Ci0KLX0KLQotI2VuZGlmCQkJCS8qIFdMQ19ISUdIX09OTFkgKi8KLQotc3RhdGljIHZvaWQgd2xjX3RpbWVyc19kZWluaXQod2xjX2luZm9fdCAqd2xjKQorc3RhdGljIHZvaWQgd2xjX3RpbWVyc19kZWluaXQoc3RydWN0IHdsY19pbmZvICp3bGMpCiB7CiAJLyogZnJlZSB0aW1lciBzdGF0ZSAqLwogCWlmICh3bGMtPndkdGltZXIpIHsKQEAgLTIyNzQsNyArMjEwNSw3IEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCB3bGNfZGV0YWNoX21vZHVsZSh3bGNfaW5mb190ICp3bGMpCitzdGF0aWMgdm9pZCB3bGNfZGV0YWNoX21vZHVsZShzdHJ1Y3Qgd2xjX2luZm8gKndsYykKIHsKIAlpZiAod2xjLT5hc2kpIHsKIAkJd2xjX2FudHNlbF9kZXRhY2god2xjLT5hc2kpOwpAQCAtMjI5Nyw3ICsyMTI4LDcgQEAKICAqICAgIE9uZSBleGNlcHRpb24gaXMgc2IgcmVnaXN0ZXIgYWNjZXNzLCB3aGljaCBpcyBwb3NzaWJsZSBpZiBjcnlzdGFsIGlzIHR1cm5lZCBvbgogICogQWZ0ZXIgImRvd24iIHN0YXRlLCBkcml2ZXIgc2hvdWxkIGF2b2lkIHNvZnR3YXJlIHRpbWVyIHdpdGggdGhlIGV4Y2VwdGlvbiBvZiByYWRpb19tb25pdG9yLgogICovCi11aW50IHdsY19kZXRhY2god2xjX2luZm9fdCAqd2xjKQordWludCB3bGNfZGV0YWNoKHN0cnVjdCB3bGNfaW5mbyAqd2xjKQogewogCXVpbnQgaTsKIAl1aW50IGNhbGxiYWNrcyA9IDA7CkBAIC0yMzA1LDcgKzIxMzYsNyBAQAogCWlmICh3bGMgPT0gTlVMTCkKIAkJcmV0dXJuIDA7CiAKLQlXTF9UUkFDRSgoIndsJWQ6ICVzXG4iLCB3bGMtPnB1Yi0+dW5pdCwgX19mdW5jX18pKTsKKwlXTF9UUkFDRSgid2wlZDogJXNcbiIsIHdsYy0+cHViLT51bml0LCBfX2Z1bmNfXyk7CiAKIAlBU1NFUlQoIXdsYy0+cHViLT51cCk7CiAKQEAgLTIzMjgsMTUgKzIxNTksNiBAQAogCiAJLyogZnJlZSBvdGhlciBzdGF0ZSAqLwogCi0jaWZkZWYgV0xDX0hJR0hfT05MWQotCS8qIEhpZ2gtT25seSBkcml2ZXIgaGFzIGFuIGFsbG9jYXRlZCBjb3B5IG9mIHZhcnMsIG1vbm9saXRoaWMganVzdAotCSAqIHJlZmVyZW5jZXMgdGhlIHdsYy0+aHctPnZhcnMgd2hpY2ggaXMgZnJlZWQgaW4gd2xjX2JtYWNfZGV0YWNoKCkKLQkgKi8KLQlpZiAod2xjLT5wdWItPnZhcnMpIHsKLQkJa2ZyZWUod2xjLT5wdWItPnZhcnMpOwotCQl3bGMtPnB1Yi0+dmFycyA9IE5VTEw7Ci0JfQotI2VuZGlmCiAKICNpZmRlZiBCQ01EQkcKIAlpZiAod2xjLT5jb3VudHJ5X2llX292ZXJyaWRlKSB7CkBAIC0yMzYwLDEzICsyMTgyLDYgQEAKIAkvKiBEZXRhY2ggZnJvbSBpb3ZhciBtYW5hZ2VyICovCiAJd2xjX21vZHVsZV91bnJlZ2lzdGVyKHdsYy0+cHViLCAid2xjX2lvdmFycyIsIHdsYyk7CiAKLQkvKgotCSAgIGlmICh3bGMtPmFwKSB7Ci0JICAgd2xjX2FwX2RldGFjaCh3bGMtPmFwKTsKLQkgICB3bGMtPmFwID0gTlVMTDsKLQkgICB9Ci0JICovCi0KIAl3aGlsZSAod2xjLT50eF9xdWV1ZXMgIT0gTlVMTCkgewogCQl3bGNfdHhxX2ZyZWUod2xjLCB3bGMtPm9zaCwgd2xjLT50eF9xdWV1ZXMpOwogCX0KQEAgLTIzODMsNyArMjE5OCw3IEBACiB9CiAKIC8qIHVwZGF0ZSBzdGF0ZSB0aGF0IGRlcGVuZHMgb24gdGhlIGN1cnJlbnQgdmFsdWUgb2YgImFwIiAqLwotdm9pZCB3bGNfYXBfdXBkKHdsY19pbmZvX3QgKndsYykKK3ZvaWQgd2xjX2FwX3VwZChzdHJ1Y3Qgd2xjX2luZm8gKndsYykKIHsKIAlpZiAoQVBfRU5BQih3bGMtPnB1YikpCiAJCXdsYy0+UExDUEhkcl9vdmVycmlkZSA9IFdMQ19QTENQX0FVVE87CS8qIEFQOiBzaG9ydCBub3QgYWxsb3dlZCwgYnV0IG5vdCBlbmZvcmNlZCAqLwpAQCAtMjM5OCw3ICsyMjEzLDcgQEAKIH0KIAogLyogcmVhZCBod2Rpc2FibGUgc3RhdGUgYW5kIHByb3BhZ2F0ZSB0byB3bGMgZmxhZyAqLwotc3RhdGljIHZvaWQgd2xjX3JhZGlvX2h3ZGlzYWJsZV91cGQod2xjX2luZm9fdCAqd2xjKQorc3RhdGljIHZvaWQgd2xjX3JhZGlvX2h3ZGlzYWJsZV91cGQoc3RydWN0IHdsY19pbmZvICp3bGMpCiB7CiAJaWYgKHdsYy0+cHViLT53bGZlYXR1cmVmbGFnICYgV0xfU1dGTF9OT0hXUkFESU8gfHwgd2xjLT5wdWItPmh3X29mZikKIAkJcmV0dXJuOwpAQCAtMjQxMSwxNyArMjIyNiwxNyBAQAogfQogCiAvKiByZXR1cm4gdHJ1ZSBpZiBNaW5pbXVtIFBvd2VyIENvbnN1bXB0aW9uIHNob3VsZCBiZSBlbnRlcmVkLCBmYWxzZSBvdGhlcndpc2UgKi8KLWJvb2wgd2xjX2lzX25vbl9kZWxheV9tcGMod2xjX2luZm9fdCAqd2xjKQorYm9vbCB3bGNfaXNfbm9uX2RlbGF5X21wYyhzdHJ1Y3Qgd2xjX2luZm8gKndsYykKIHsKIAlyZXR1cm4gZmFsc2U7CiB9CiAKLWJvb2wgd2xjX2lzbXBjKHdsY19pbmZvX3QgKndsYykKK2Jvb2wgd2xjX2lzbXBjKHN0cnVjdCB3bGNfaW5mbyAqd2xjKQogewogCXJldHVybiAod2xjLT5tcGNfZGVsYXlfb2ZmID09IDApICYmICh3bGNfaXNfbm9uX2RlbGF5X21wYyh3bGMpKTsKIH0KIAotdm9pZCB3bGNfcmFkaW9fbXBjX3VwZCh3bGNfaW5mb190ICp3bGMpCit2b2lkIHdsY19yYWRpb19tcGNfdXBkKHN0cnVjdCB3bGNfaW5mbyAqd2xjKQogewogCWJvb2wgbXBjX3JhZGlvLCByYWRpb19zdGF0ZTsKIApAQCAtMjQ3Nyw3ICsyMjkyLDcgQEAKICAqIGNlbnRyYWxpemVkIHJhZGlvIGRpc2FibGUvZW5hYmxlIGZ1bmN0aW9uLAogICogaW52b2tlIHJhZGlvIGVuYWJsZS9kaXNhYmxlIGFmdGVyIHVwZGF0aW5nIGh3cmFkaW8gc3RhdHVzCiAgKi8KLXN0YXRpYyB2b2lkIHdsY19yYWRpb191cGQod2xjX2luZm9fdCAqd2xjKQorc3RhdGljIHZvaWQgd2xjX3JhZGlvX3VwZChzdHJ1Y3Qgd2xjX2luZm8gKndsYykKIHsKIAlpZiAod2xjLT5wdWItPnJhZGlvX2Rpc2FibGVkKQogCQl3bGNfcmFkaW9fZGlzYWJsZSh3bGMpOwpAQCAtMjQ4Niw3ICsyMzAxLDcgQEAKIH0KIAogLyogbWFpbnRhaW4gTEVEIGJlaGF2aW9yIGluIGRvd24gc3RhdGUgKi8KLXN0YXRpYyB2b2lkIHdsY19kb3duX2xlZF91cGQod2xjX2luZm9fdCAqd2xjKQorc3RhdGljIHZvaWQgd2xjX2Rvd25fbGVkX3VwZChzdHJ1Y3Qgd2xjX2luZm8gKndsYykKIHsKIAlBU1NFUlQoIXdsYy0+cHViLT51cCk7CiAKQEAgLTI0OTksNyArMjMxNCw3IEBACiAJfQogfQogCi12b2lkIHdsY19yYWRpb19kaXNhYmxlKHdsY19pbmZvX3QgKndsYykKK3ZvaWQgd2xjX3JhZGlvX2Rpc2FibGUoc3RydWN0IHdsY19pbmZvICp3bGMpCiB7CiAJaWYgKCF3bGMtPnB1Yi0+dXApIHsKIAkJd2xjX2Rvd25fbGVkX3VwZCh3bGMpOwpAQCAtMjUxMCw3ICsyMzI1LDcgQEAKIAl3bF9kb3duKHdsYy0+d2wpOwogfQogCi1zdGF0aWMgdm9pZCB3bGNfcmFkaW9fZW5hYmxlKHdsY19pbmZvX3QgKndsYykKK3N0YXRpYyB2b2lkIHdsY19yYWRpb19lbmFibGUoc3RydWN0IHdsY19pbmZvICp3bGMpCiB7CiAJaWYgKHdsYy0+cHViLT51cCkKIAkJcmV0dXJuOwpAQCAtMjUyNiwxMCArMjM0MSwxMCBAQAogLyogcGVyaW9kaWNhbCBxdWVyeSBodyByYWRpbyBidXR0b24gd2hpbGUgZHJpdmVyIGlzICJkb3duIiAqLwogc3RhdGljIHZvaWQgd2xjX3JhZGlvX3RpbWVyKHZvaWQgKmFyZykKIHsKLQl3bGNfaW5mb190ICp3bGMgPSAod2xjX2luZm9fdCAqKSBhcmc7CisJc3RydWN0IHdsY19pbmZvICp3bGMgPSAoc3RydWN0IHdsY19pbmZvICopIGFyZzsKIAogCWlmIChERVZJQ0VSRU1PVkVEKHdsYykpIHsKLQkJV0xfRVJST1IoKCJ3bCVkOiAlczogZGVhZCBjaGlwXG4iLCB3bGMtPnB1Yi0+dW5pdCwgX19mdW5jX18pKTsKKwkJV0xfRVJST1IoIndsJWQ6ICVzOiBkZWFkIGNoaXBcbiIsIHdsYy0+cHViLT51bml0LCBfX2Z1bmNfXyk7CiAJCXdsX2Rvd24od2xjLT53bCk7CiAJCXJldHVybjsKIAl9CkBAIC0yNTQ0LDcgKzIzNTksNyBAQAogCXdsY19yYWRpb191cGQod2xjKTsKIH0KIAotc3RhdGljIGJvb2wgd2xjX3JhZGlvX21vbml0b3Jfc3RhcnQod2xjX2luZm9fdCAqd2xjKQorc3RhdGljIGJvb2wgd2xjX3JhZGlvX21vbml0b3Jfc3RhcnQoc3RydWN0IHdsY19pbmZvICp3bGMpCiB7CiAJLyogRG9uJ3Qgc3RhcnQgdGhlIHRpbWVyIGlmIEhXUkFESU8gZmVhdHVyZSBpcyBkaXNhYmxlZCAqLwogCWlmICh3bGMtPnJhZGlvX21vbml0b3IgfHwgKHdsYy0+cHViLT53bGZlYXR1cmVmbGFnICYgV0xfU1dGTF9OT0hXUkFESU8pKQpAQCAtMjU1Niw3ICsyMzcxLDcgQEAKIAlyZXR1cm4gdHJ1ZTsKIH0KIAotYm9vbCB3bGNfcmFkaW9fbW9uaXRvcl9zdG9wKHdsY19pbmZvX3QgKndsYykKK2Jvb2wgd2xjX3JhZGlvX21vbml0b3Jfc3RvcChzdHJ1Y3Qgd2xjX2luZm8gKndsYykKIHsKIAlpZiAoIXdsYy0+cmFkaW9fbW9uaXRvcikKIAkJcmV0dXJuIHRydWU7CkBAIC0yNTcwLDcgKzIzODUsNyBAQAogfQogCiAvKiBicmluZyB0aGUgZHJpdmVyIGRvd24sIGJ1dCBkb24ndCByZXNldCBoYXJkd2FyZSAqLwotdm9pZCB3bGNfb3V0KHdsY19pbmZvX3QgKndsYykKK3ZvaWQgd2xjX291dChzdHJ1Y3Qgd2xjX2luZm8gKndsYykKIHsKIAl3bGNfYm1hY19zZXRfbm9yZXNldCh3bGMtPmh3LCB0cnVlKTsKIAl3bGNfcmFkaW9fdXBkKHdsYyk7CkBAIC0yNTkxLDcgKzI0MDYsNyBAQAogICogaWYgdGhlcmUgaXMgbm8gcGFja2V0IHBlbmRpbmcgZm9yIHRoZSBGSUZPLCB0aGVuIHRoZSBjb3JyZXNwb25kaW5nIHByZWMgYml0cyBzaG91bGQgYmUgc2V0CiAgKiBpbiBwcmVjX21hcC4gT2YgY291cnNlLCBpZ25vcmUgdGhpcyBydWxlIHdoZW4gYmxvY2tfZGF0YWZpZm8gaXMgc2V0CiAgKi8KLXN0YXRpYyBib29sIHdsY190eF9wcmVjX21hcF92ZXJpZnkod2xjX2luZm9fdCAqd2xjKQorc3RhdGljIGJvb2wgd2xjX3R4X3ByZWNfbWFwX3ZlcmlmeShzdHJ1Y3Qgd2xjX2luZm8gKndsYykKIHsKIAkvKiBGb3Igbm9uLVdNRSwgYm90aCBmaWZvcyBoYXZlIG92ZXJsYXBwaW5nIHByZWNfbWFwLiBTbyBpdCdzIGFuIGVycm9yIG9ubHkgaWYgYm90aAogCSAqIGZhaWwgdGhlIGNoZWNrLgpAQCAtMjYxMyw3ICsyNDI4LDcgQEAKIAogc3RhdGljIHZvaWQgd2xjX3dhdGNoZG9nX2J5X3RpbWVyKHZvaWQgKmFyZykKIHsKLQl3bGNfaW5mb190ICp3bGMgPSAod2xjX2luZm9fdCAqKSBhcmc7CisJc3RydWN0IHdsY19pbmZvICp3bGMgPSAoc3RydWN0IHdsY19pbmZvICopIGFyZzsKIAl3bGNfd2F0Y2hkb2coYXJnKTsKIAlpZiAoV0xDX1dBVENIRE9HX1RCVFQod2xjKSkgewogCQkvKiBzZXQgdG8gbm9ybWFsIG9zbCB3YXRjaGRvZyBwZXJpb2QgKi8KQEAgLTI2MjYsMTcgKzI0NDEsMTcgQEAKIC8qIGNvbW1vbiB3YXRjaGRvZyBjb2RlICovCiBzdGF0aWMgdm9pZCB3bGNfd2F0Y2hkb2codm9pZCAqYXJnKQogewotCXdsY19pbmZvX3QgKndsYyA9ICh3bGNfaW5mb190ICopIGFyZzsKKwlzdHJ1Y3Qgd2xjX2luZm8gKndsYyA9IChzdHJ1Y3Qgd2xjX2luZm8gKikgYXJnOwogCWludCBpOwogCXdsY19ic3NjZmdfdCAqY2ZnOwogCi0JV0xfVFJBQ0UoKCJ3bCVkOiB3bGNfd2F0Y2hkb2dcbiIsIHdsYy0+cHViLT51bml0KSk7CisJV0xfVFJBQ0UoIndsJWQ6IHdsY193YXRjaGRvZ1xuIiwgd2xjLT5wdWItPnVuaXQpOwogCiAJaWYgKCF3bGMtPnB1Yi0+dXApCiAJCXJldHVybjsKIAogCWlmIChERVZJQ0VSRU1PVkVEKHdsYykpIHsKLQkJV0xfRVJST1IoKCJ3bCVkOiAlczogZGVhZCBjaGlwXG4iLCB3bGMtPnB1Yi0+dW5pdCwgX19mdW5jX18pKTsKKwkJV0xfRVJST1IoIndsJWQ6ICVzOiBkZWFkIGNoaXBcbiIsIHdsYy0+cHViLT51bml0LCBfX2Z1bmNfXyk7CiAJCXdsX2Rvd24od2xjLT53bCk7CiAJCXJldHVybjsKIAl9CkBAIC0yNjY3LDEzICsyNDgyLDcgQEAKIAlpZiAod2xjLT5wdWItPnJhZGlvX2Rpc2FibGVkKQogCQlyZXR1cm47CiAKLSNpZmRlZiBXTENfTE9XCiAJd2xjX2JtYWNfd2F0Y2hkb2cod2xjKTsKLSNlbmRpZgotI2lmZGVmIFdMQ19ISUdIX09OTFkKLQkvKiBtYWludGVuYW5jZSAqLwotCXdsY19ibWFjX3JwY193YXRjaGRvZyh3bGMpOwotI2VuZGlmCiAKIAkvKiBvY2Nhc2lvbmFsbHkgc2FtcGxlIG1hYyBzdGF0IGNvdW50ZXJzIHRvIGRldGVjdCAxNi1iaXQgY291bnRlciB3cmFwICovCiAJaWYgKChXTENfVVBEQVRFX1NUQVRTKHdsYykpCkBAIC0yNzAyLDEwICsyNTExLDggQEAKIAkJd2xjLT50ZW1wc2Vuc2VfbGFzdHRpbWUgPSB3bGMtPnB1Yi0+bm93OwogCQl3bGNfdGVtcHNlbnNlX3VwZCh3bGMpOwogCX0KLSNpZmRlZiBXTENfTE9XCiAJLyogQk1BQ19OT1RFOiBmb3IgSElHSF9PTkxZIGRyaXZlciwgdGhpcyBzZWVtcyBiZWluZyBjYWxsZWQgYWZ0ZXIgUlBDIGJ1cyBmYWlsZWQgKi8KIAlBU1NFUlQod2xjX2JtYWNfdGFjbGVhcih3bGMtPmh3LCB0cnVlKSk7Ci0jZW5kaWYKIAogCS8qIFZlcmlmeSB0aGF0IHR4X3ByZWNfbWFwIGFuZCBmaWZvcyBhcmUgaW4gc3luYyB0byBhdm9pZCBsb2NrIHVwcyAqLwogCUFTU0VSVCh3bGNfdHhfcHJlY19tYXBfdmVyaWZ5KHdsYykpOwpAQCAtMjcxNCw5ICsyNTIxLDkgQEAKIH0KIAogLyogbWFrZSBpbnRlcmZhY2Ugb3BlcmF0aW9uYWwgKi8KLWludCB3bGNfdXAod2xjX2luZm9fdCAqd2xjKQoraW50IHdsY191cChzdHJ1Y3Qgd2xjX2luZm8gKndsYykKIHsKLQlXTF9UUkFDRSgoIndsJWQ6ICVzOlxuIiwgd2xjLT5wdWItPnVuaXQsIF9fZnVuY19fKSk7CisJV0xfVFJBQ0UoIndsJWQ6ICVzOlxuIiwgd2xjLT5wdWItPnVuaXQsIF9fZnVuY19fKTsKIAogCS8qIEhXIGlzIHR1cm5lZCBvZmYgc28gZG9uJ3QgdHJ5IHRvIGFjY2VzcyBpdCAqLwogCWlmICh3bGMtPnB1Yi0+aHdfb2ZmIHx8IERFVklDRVJFTU9WRUQod2xjKSkKQEAgLTI3MjgsNyArMjUzNSw3IEBACiAJfQogCiAJaWYgKCh3bGMtPnB1Yi0+Ym9hcmRmbGFncyAmIEJGTF9GRU0pCi0JICAgICYmIChDSElQSUQod2xjLT5wdWItPnNpaC0+Y2hpcCkgPT0gQkNNNDMxM19DSElQX0lEKSkgeworCSAgICAmJiAod2xjLT5wdWItPnNpaC0+Y2hpcCA9PSBCQ000MzEzX0NISVBfSUQpKSB7CiAJCWlmICh3bGMtPnB1Yi0+Ym9hcmRyZXYgPj0gMHgxMjUwCiAJCSAgICAmJiAod2xjLT5wdWItPmJvYXJkZmxhZ3MgJiBCRkxfRkVNX0JUKSkgewogCQkJd2xjX21oZih3bGMsIE1IRjUsIE1IRjVfNDMxM19HUElPQ1RSTCwKQEAgLTI3NjEsNyArMjU2OCw4IEBACiAJCQkJCWlmICghQlNTQ0ZHX1NUQShic3NjZmcpCiAJCQkJCSAgICB8fCAhYnNzY2ZnLT5lbmFibGUgfHwgIWJzc2NmZy0+QlNTKQogCQkJCQkJY29udGludWU7Ci0JCQkJCVdMX0VSUk9SKCgid2wlZC4lZDogd2xjX3VwOiByZmRpc2FibGUgLT4gIiAid2xjX2Jzc2NmZ19kaXNhYmxlKClcbiIsIHdsYy0+cHViLT51bml0LCBpZHgpKTsKKwkJCQkJV0xfRVJST1IoIndsJWQuJWQ6IHdsY191cDogcmZkaXNhYmxlIC0+ICIgIndsY19ic3NjZmdfZGlzYWJsZSgpXG4iLAorCQkJCQkJIHdsYy0+cHViLT51bml0LCBpZHgpOwogCQkJCX0KIAkJCX0KIAkJfSBlbHNlCkBAIC0yODIyLDEwICsyNjMwLDEwIEBACiB9CiAKIC8qIEluaXRpYWxpemUgdGhlIGJhc2UgcHJlY2VkZW5jZSBtYXAgZm9yIGRlcXVldWVpbmcgZnJvbSB0eHEgYmFzZWQgb24gV01FIHNldHRpbmdzICovCi1zdGF0aWMgdm9pZCB3bGNfdHhfcHJlY19tYXBfaW5pdCh3bGNfaW5mb190ICp3bGMpCitzdGF0aWMgdm9pZCB3bGNfdHhfcHJlY19tYXBfaW5pdChzdHJ1Y3Qgd2xjX2luZm8gKndsYykKIHsKIAl3bGMtPnR4X3ByZWNfbWFwID0gV0xDX1BSRUNfQk1QX0FMTDsKLQliemVybyh3bGMtPmZpZm8ycHJlY19tYXAsIHNpemVvZih1MTYpICogTkZJRk8pOworCW1lbXNldCh3bGMtPmZpZm8ycHJlY19tYXAsIDAsIE5GSUZPICogc2l6ZW9mKHUxNikpOwogCiAJLyogRm9yIG5vbi1XTUUsIGJvdGggZmlmb3MgaGF2ZSBvdmVybGFwcGluZyBNQVhQUklPLiBTbyBqdXN0IGRpc2FibGUgYWxsIHByZWNlZGVuY2VzCiAJICogaWYgZWl0aGVyIGlzIGZ1bGwuCkBAIC0yODQxLDcgKzI2NDksNyBAQAogCX0KIH0KIAotc3RhdGljIHVpbnQgd2xjX2Rvd25fZGVsX3RpbWVyKHdsY19pbmZvX3QgKndsYykKK3N0YXRpYyB1aW50IHdsY19kb3duX2RlbF90aW1lcihzdHJ1Y3Qgd2xjX2luZm8gKndsYykKIHsKIAl1aW50IGNhbGxiYWNrcyA9IDA7CiAKQEAgLTI4NTMsNyArMjY2MSw3IEBACiAgKiBkaXNhYmxlIHRoZSBoYXJkd2FyZSwgZnJlZSBhbnkgdHJhbnNpZW50IGJ1ZmZlciBzdGF0ZS4KICAqIFJldHVybiBhIGNvdW50IG9mIHRoZSBudW1iZXIgb2YgZHJpdmVyIGNhbGxiYWNrcyBzdGlsbCBwZW5kaW5nLgogICovCi11aW50IHdsY19kb3duKHdsY19pbmZvX3QgKndsYykKK3VpbnQgd2xjX2Rvd24oc3RydWN0IHdsY19pbmZvICp3bGMpCiB7CiAKIAl1aW50IGNhbGxiYWNrcyA9IDA7CkBAIC0yODYxLDEyICsyNjY5LDEyIEBACiAJYm9vbCBkZXZfZ29uZSA9IGZhbHNlOwogCXdsY190eHFfaW5mb190ICpxaTsKIAotCVdMX1RSQUNFKCgid2wlZDogJXM6XG4iLCB3bGMtPnB1Yi0+dW5pdCwgX19mdW5jX18pKTsKKwlXTF9UUkFDRSgid2wlZDogJXM6XG4iLCB3bGMtPnB1Yi0+dW5pdCwgX19mdW5jX18pOwogCiAJLyogY2hlY2sgaWYgd2UgYXJlIGFscmVhZHkgaW4gdGhlIGdvaW5nIGRvd24gcGF0aCAqLwogCWlmICh3bGMtPmdvaW5nX2Rvd24pIHsKLQkJV0xfRVJST1IoKCJ3bCVkOiAlczogRHJpdmVyIGdvaW5nIGRvd24gc28gcmV0dXJuXG4iLAotCQkJICB3bGMtPnB1Yi0+dW5pdCwgX19mdW5jX18pKTsKKwkJV0xfRVJST1IoIndsJWQ6ICVzOiBEcml2ZXIgZ29pbmcgZG93biBzbyByZXR1cm5cbiIsCisJCQkgd2xjLT5wdWItPnVuaXQsIF9fZnVuY19fKTsKIAkJcmV0dXJuIDA7CiAJfQogCWlmICghd2xjLT5wdWItPnVwKQpAQCAtMjkyMiwxNCArMjczMCwxMSBAQAogCS8qIHdsY19ibWFjX2Rvd25fZmluaXNoIGhhcyBkb25lIHdsY19jb3JlZGlzYWJsZSgpLiBzbyBjbGsgaXMgb2ZmICovCiAJd2xjLT5jbGsgPSBmYWxzZTsKIAotI2lmZGVmIFdMQ19ISUdIX09OTFkKLQl3bGNfcnBjdHhfdHhyZWNsYWltKHdsYy0+cnBjdHgpOwotI2VuZGlmCiAKIAkvKiBWZXJpZnkgYWxsIHBhY2tldHMgYXJlIGZsdXNoZWQgZnJvbSB0aGUgZHJpdmVyICovCi0JaWYgKFBLVEFMTE9DRUQod2xjLT5vc2gpICE9IDApIHsKLQkJV0xfRVJST1IoKCIlZCBwYWNrZXRzIG5vdCBmcmVlZCBhdCB3bGNfZG93biEhISEhIVxuIiwKLQkJCSAgUEtUQUxMT0NFRCh3bGMtPm9zaCkpKTsKKwlpZiAod2xjLT5vc2gtPnBrdGFsbG9jZWQgIT0gMCkgeworCQlXTF9FUlJPUigiJWQgcGFja2V0cyBub3QgZnJlZWQgYXQgd2xjX2Rvd24hISEhISFcbiIsCisJCQkgd2xjLT5vc2gtPnBrdGFsbG9jZWQpOwogCX0KICNpZmRlZiBCQ01EQkcKIAkvKiBTaW5jZSBhbGwgdGhlIHBhY2tldHMgc2hvdWxkIGhhdmUgYmVlbiBmcmVlZCwKQEAgLTI5NDMsNyArMjc0OCw3IEBACiB9CiAKIC8qIFNldCB0aGUgY3VycmVudCBnbW9kZSBjb25maWd1cmF0aW9uICovCi1pbnQgd2xjX3NldF9nbW9kZSh3bGNfaW5mb190ICp3bGMsIHU4IGdtb2RlLCBib29sIGNvbmZpZykKK2ludCB3bGNfc2V0X2dtb2RlKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCB1OCBnbW9kZSwgYm9vbCBjb25maWcpCiB7CiAJaW50IHJldCA9IDA7CiAJdWludCBpOwpAQCAtMjk1OCw3ICsyNzYzLDcgQEAKIAlib29sIHByZWFtYmxlX3Jlc3RyaWN0ID0gZmFsc2U7CS8qIFJlc3RyaWN0IGFzc29jaWF0aW9uIHRvIHN0YXRpb25zIHRoYXQgc3VwcG9ydCBzaG9ydAogCQkJCQkgKiBwcmVhbWJsZXMKIAkJCQkJICovCi0Jd2xjYmFuZF90ICpiYW5kOworCXN0cnVjdCB3bGNiYW5kICpiYW5kOwogCiAJLyogaWYgTi1zdXBwb3J0IGlzIGVuYWJsZWQsIGFsbG93IEdtb2RlIHNldCBhcyBsb25nIGFzIHJlcXVlc3RlZAogCSAqIEdtb2RlIGlzIG5vdCBHTU9ERV9MRUdBQ1lfQgpAQCAtMjk4NSwxMCArMjc5MCwxMCBAQAogCQl3bGNfcHJvdGVjdGlvbl91cGQod2xjLCBXTENfUFJPVF9HX1VTRVIsIGdtb2RlKTsKIAogCS8qIENsZWFyIHN1cHBvcnRlZCByYXRlcyBmaWx0ZXIgKi8KLQliemVybygmd2xjLT5zdXBfcmF0ZXNfb3ZlcnJpZGUsIHNpemVvZih3bGNfcmF0ZXNldF90KSk7CisJbWVtc2V0KCZ3bGMtPnN1cF9yYXRlc19vdmVycmlkZSwgMCwgc2l6ZW9mKHdsY19yYXRlc2V0X3QpKTsKIAogCS8qIENsZWFyIHJhdGVzZXQgb3ZlcnJpZGUgKi8KLQliemVybygmcnMsIHNpemVvZih3bGNfcmF0ZXNldF90KSk7CisJbWVtc2V0KCZycywgMCwgc2l6ZW9mKHdsY19yYXRlc2V0X3QpKTsKIAogCXN3aXRjaCAoZ21vZGUpIHsKIAljYXNlIEdNT0RFX0xFR0FDWV9COgpAQCAtMzAyNiw4ICsyODMxLDggQEAKIAogCWRlZmF1bHQ6CiAJCS8qIEVycm9yICovCi0JCVdMX0VSUk9SKCgid2wlZDogJXM6IGludmFsaWQgZ21vZGUgJWRcbiIsIHdsYy0+cHViLT51bml0LAotCQkJICBfX2Z1bmNfXywgZ21vZGUpKTsKKwkJV0xfRVJST1IoIndsJWQ6ICVzOiBpbnZhbGlkIGdtb2RlICVkXG4iLAorCQkJIHdsYy0+cHViLT51bml0LCBfX2Z1bmNfXywgZ21vZGUpOwogCQlyZXR1cm4gQkNNRV9VTlNVUFBPUlRFRDsKIAl9CiAKQEAgLTMwOTMsNyArMjg5OCw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCB3bGNfbm1vZGVfdmFsaWRhdGUod2xjX2luZm9fdCAqd2xjLCBzMzIgbm1vZGUpCitzdGF0aWMgaW50IHdsY19ubW9kZV92YWxpZGF0ZShzdHJ1Y3Qgd2xjX2luZm8gKndsYywgczMyIG5tb2RlKQogewogCWludCBlcnIgPSAwOwogCkBAIC0zMTE3LDcgKzI5MjIsNyBAQAogCXJldHVybiBlcnI7CiB9CiAKLWludCB3bGNfc2V0X25tb2RlKHdsY19pbmZvX3QgKndsYywgczMyIG5tb2RlKQoraW50IHdsY19zZXRfbm1vZGUoc3RydWN0IHdsY19pbmZvICp3bGMsIHMzMiBubW9kZSkKIHsKIAl1aW50IGk7CiAJaW50IGVycjsKQEAgLTMxNzYsNyArMjk4MSw3IEBACiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIGludCB3bGNfc2V0X3JhdGVzZXQod2xjX2luZm9fdCAqd2xjLCB3bGNfcmF0ZXNldF90ICpyc19hcmcpCitzdGF0aWMgaW50IHdsY19zZXRfcmF0ZXNldChzdHJ1Y3Qgd2xjX2luZm8gKndsYywgd2xjX3JhdGVzZXRfdCAqcnNfYXJnKQogewogCXdsY19yYXRlc2V0X3QgcnMsIG5ldzsKIAl1aW50IGJhbmR1bml0OwpAQCAtMzIxOSwxOCArMzAyNCwxOCBAQAogfQogCiAvKiBzaW1wbGlmaWVkIGludGVnZXIgc2V0IGludGVyZmFjZSBmb3IgY29tbW9uIGlvY3RsIGhhbmRsZXIgKi8KLWludCB3bGNfc2V0KHdsY19pbmZvX3QgKndsYywgaW50IGNtZCwgaW50IGFyZykKK2ludCB3bGNfc2V0KHN0cnVjdCB3bGNfaW5mbyAqd2xjLCBpbnQgY21kLCBpbnQgYXJnKQogewogCXJldHVybiB3bGNfaW9jdGwod2xjLCBjbWQsICh2b2lkICopJmFyZywgc2l6ZW9mKGFyZyksIE5VTEwpOwogfQogCiAvKiBzaW1wbGlmaWVkIGludGVnZXIgZ2V0IGludGVyZmFjZSBmb3IgY29tbW9uIGlvY3RsIGhhbmRsZXIgKi8KLWludCB3bGNfZ2V0KHdsY19pbmZvX3QgKndsYywgaW50IGNtZCwgaW50ICphcmcpCitpbnQgd2xjX2dldChzdHJ1Y3Qgd2xjX2luZm8gKndsYywgaW50IGNtZCwgaW50ICphcmcpCiB7CiAJcmV0dXJuIHdsY19pb2N0bCh3bGMsIGNtZCwgYXJnLCBzaXplb2YoaW50KSwgTlVMTCk7CiB9CiAKLXN0YXRpYyB2b2lkIHdsY19vZmRtX3JhdGVzZXRfd2FyKHdsY19pbmZvX3QgKndsYykKK3N0YXRpYyB2b2lkIHdsY19vZmRtX3JhdGVzZXRfd2FyKHN0cnVjdCB3bGNfaW5mbyAqd2xjKQogewogCXU4IHI7CiAJYm9vbCB3YXIgPSBmYWxzZTsKQEAgLTMyNDYsMTQgKzMwNTEsMTYgQEAKIH0KIAogaW50Ci13bGNfaW9jdGwod2xjX2luZm9fdCAqd2xjLCBpbnQgY21kLCB2b2lkICphcmcsIGludCBsZW4sIHN0cnVjdCB3bGNfaWYgKndsY2lmKQord2xjX2lvY3RsKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCBpbnQgY21kLCB2b2lkICphcmcsIGludCBsZW4sCisJICBzdHJ1Y3Qgd2xjX2lmICp3bGNpZikKIHsKIAlyZXR1cm4gX3dsY19pb2N0bCh3bGMsIGNtZCwgYXJnLCBsZW4sIHdsY2lmKTsKIH0KIAogLyogY29tbW9uIGlvY3RsIGhhbmRsZXIuIHJldHVybjogMD1vaywgLTE9ZXJyb3IsIHBvc2l0aXZlPXBhcnRpY3VsYXIgZXJyb3IgKi8KIHN0YXRpYyBpbnQKLV93bGNfaW9jdGwod2xjX2luZm9fdCAqd2xjLCBpbnQgY21kLCB2b2lkICphcmcsIGludCBsZW4sIHN0cnVjdCB3bGNfaWYgKndsY2lmKQorX3dsY19pb2N0bChzdHJ1Y3Qgd2xjX2luZm8gKndsYywgaW50IGNtZCwgdm9pZCAqYXJnLCBpbnQgbGVuLAorCSAgIHN0cnVjdCB3bGNfaWYgKndsY2lmKQogewogCWludCB2YWwsICpwdmFsOwogCWJvb2wgYm9vbF92YWw7CkBAIC0zMjY1LDcgKzMwNzIsNyBAQAogCXVpbnQgYmFuZDsKIAlyd19yZWdfdCAqcjsKIAl3bGNfYnNzY2ZnX3QgKmJzc2NmZzsKLQlvc2xfdCAqb3NoOworCXN0cnVjdCBvc2xfaW5mbyAqb3NoOwogCXdsY19ic3NfaW5mb190ICpjdXJyZW50X2JzczsKIAogCS8qIHVwZGF0ZSBic3NjZmcgcG9pbnRlciAqLwpAQCAtMzI4MCw3ICszMDg3LDcgQEAKIAogCS8qIElmIHRoZSBkZXZpY2UgaXMgdHVybmVkIG9mZiwgdGhlbiBpdCdzIG5vdCAicmVtb3ZlZCIgKi8KIAlpZiAoIXdsYy0+cHViLT5od19vZmYgJiYgREVWSUNFUkVNT1ZFRCh3bGMpKSB7Ci0JCVdMX0VSUk9SKCgid2wlZDogJXM6IGRlYWQgY2hpcFxuIiwgd2xjLT5wdWItPnVuaXQsIF9fZnVuY19fKSk7CisJCVdMX0VSUk9SKCJ3bCVkOiAlczogZGVhZCBjaGlwXG4iLCB3bGMtPnB1Yi0+dW5pdCwgX19mdW5jX18pOwogCQl3bF9kb3duKHdsYy0+d2wpOwogCQlyZXR1cm4gQkNNRV9FUlJPUjsKIAl9CkBAIC0zMzAwLDggKzMxMDcsOCBAQAogCWJvb2xfdmFsID0gdmFsICE9IDA7CiAKIAlpZiAoY21kICE9IFdMQ19TRVRfQ0hBTk5FTCkKLQkJV0xfTk9ORSgoIldMQ19JT0NUTDogY21kICVkIHZhbCAweCV4ICglZCkgbGVuICVkXG4iLCBjbWQsCi0JCQkgKHVpbnQpIHZhbCwgdmFsLCBsZW4pKTsKKwkJV0xfTk9ORSgiV0xDX0lPQ1RMOiBjbWQgJWQgdmFsIDB4JXggKCVkKSBsZW4gJWRcbiIsCisJCQljbWQsICh1aW50KXZhbCwgdmFsLCBsZW4pOwogCiAJYmNtZXJyb3IgPSAwOwogCXJlZ3MgPSB3bGMtPnJlZ3M7CkBAIC0zMzIxLDggKzMxMjgsOCBAQAogCiAJZGVmYXVsdDoKIAkJaWYgKChhcmcgPT0gTlVMTCkgfHwgKGxlbiA8PSAwKSkgewotCQkJV0xfRVJST1IoKCJ3bCVkOiAlczogQ29tbWFuZCAlZCBuZWVkcyBhcmd1bWVudHNcbiIsCi0JCQkJICB3bGMtPnB1Yi0+dW5pdCwgX19mdW5jX18sIGNtZCkpOworCQkJV0xfRVJST1IoIndsJWQ6ICVzOiBDb21tYW5kICVkIG5lZWRzIGFyZ3VtZW50c1xuIiwKKwkJCQkgd2xjLT5wdWItPnVuaXQsIF9fZnVuY19fLCBjbWQpOwogCQkJYmNtZXJyb3IgPSBCQ01FX0JBREFSRzsKIAkJCWdvdG8gZG9uZTsKIAkJfQpAQCAtMzM4OCwxMCArMzE5NSw2IEBACiAJCQkJd2xjX3NldF9jaGFuc3BlYyh3bGMsIGNoc3BlYyk7CiAJCQkJd2xjX2VuYWJsZV9tYWMod2xjKTsKIAkJCX0KLSNpZmRlZiBXTENfSElHSF9PTkxZCi0JCQkvKiBkZWxheSBmb3IgY2hhbm5lbCBjaGFuZ2UgKi8KLQkJCW1zbGVlcCg1MCk7Ci0jZW5kaWYKIAkJCWJyZWFrOwogCQl9CiAKQEAgLTM2NTksOCArMzQ2Miw4IEBACiAJCQkvKiA0MzIyIHN1cHBvcnRzIGFudGRpdiBpbiBwaHksIG5vIG5lZWQgdG8gc2V0IGl0IHRvIHVjb2RlICovCiAJCQlpZiAoV0xDSVNOUEhZKHdsYy0+YmFuZCkKIAkJCSAgICAmJiBEMTFSRVZfSVMod2xjLT5wdWItPmNvcmVyZXYsIDE2KSkgewotCQkJCVdMX0VSUk9SKCgid2wlZDogY2FuJ3Qgc2V0IHVjYW50ZGl2IGZvciA0MzIyXG4iLAotCQkJCQkgIHdsYy0+cHViLT51bml0KSk7CisJCQkJV0xfRVJST1IoIndsJWQ6IGNhbid0IHNldCB1Y2FudGRpdiBmb3IgNDMyMlxuIiwKKwkJCQkJIHdsYy0+cHViLT51bml0KTsKIAkJCQliY21lcnJvciA9IEJDTUVfVU5TVVBQT1JURUQ7CiAJCQl9IGVsc2UKIAkJCQl3bGNfbWhmKHdsYywgTUhGMSwgTUhGMV9BTlRESVYsCkBAIC0zNzU3LDggKzM1NjAsOCBAQAogCQkJaWYgKChyYWRpb21hc2sgPT0gMCkgfHwgKHJhZGlvbWFzayAmIH52YWxpZGJpdHMpCiAJCQkgICAgfHwgKHJhZGlvdmFsICYgfnZhbGlkYml0cykKIAkJCSAgICB8fCAoKHJhZGlvdmFsICYgfnJhZGlvbWFzaykgIT0gMCkpIHsKLQkJCQlXTF9FUlJPUigoIlNFVF9SQURJTyB3aXRoIHdyb25nIGJpdHMgMHgleFxuIiwKLQkJCQkJICB2YWwpKTsKKwkJCQlXTF9FUlJPUigiU0VUX1JBRElPIHdpdGggd3JvbmcgYml0cyAweCV4XG4iLAorCQkJCQkgdmFsKTsKIAkJCQliY21lcnJvciA9IEJDTUVfUkFOR0U7CiAJCQkJYnJlYWs7CiAJCQl9CkBAIC0zNzg4LDcgKzM1OTEsNyBAQAogCQkJCWJyZWFrOwogCQkJfQogCi0JCQliemVybygoY2hhciAqKSZrZXksIHNpemVvZihrZXkpKTsKKwkJCW1lbXNldCgoY2hhciAqKSZrZXksIDAsIHNpemVvZihrZXkpKTsKIAkJCWlmIChzcmNfa2V5KSB7CiAJCQkJa2V5LmluZGV4ID0gc3JjX2tleS0+aWQ7CiAJCQkJa2V5LmxlbiA9IHNyY19rZXktPmxlbjsKQEAgLTM4MDAsNyArMzYwMyw3IEBACiAJCQkJCWtleS5mbGFncyB8PSBXTF9QUklNQVJZX0tFWTsKIAogCQkJCWJjb3B5KHNyY19rZXktPmVhLm9jdGV0LCBrZXkuZWEub2N0ZXQsCi0JCQkJICAgICAgRVRIRVJfQUREUl9MRU4pOworCQkJCSAgICAgIEVUSF9BTEVOKTsKIAkJCX0KIAogCQkJYmNvcHkoKGNoYXIgKikma2V5LCBhcmcsIHNpemVvZihrZXkpKTsKQEAgLTM4MzUsOCArMzYzOCw4IEBACiAJCQkJdTE2IGxvOwogCQkJCXUzMiBoaTsKIAkJCQkvKiBncm91cCBrZXlzIGluIFdQQS1OT05FIChJQlNTIG9ubHksIEFFUyBhbmQgVEtJUCkgdXNlIGEgZ2xvYmFsIFRYSVYgKi8KLQkJCQlpZiAoKGJzc2NmZy0+V1BBX2F1dGggJiBXUEFfQVVUSF9OT05FKQotCQkJCSAgICAmJiBFVEhFUl9JU05VTExBRERSKCZrZXktPmVhKSkgeworCQkJCWlmICgoYnNzY2ZnLT5XUEFfYXV0aCAmIFdQQV9BVVRIX05PTkUpICYmCisJCQkJICAgIGlzX3plcm9fZXRoZXJfYWRkcihrZXktPmVhLm9jdGV0KSkgewogCQkJCQlsbyA9IGJzc2NmZy0+d3BhX25vbmVfdHhpdi5sbzsKIAkJCQkJaGkgPSBic3NjZmctPndwYV9ub25lX3R4aXYuaGk7CiAJCQkJfSBlbHNlIHsKQEAgLTM4ODUsNyArMzY4OCw3IEBACiAJCQl3bGNfcmF0ZXNldF90IHJzOwogCQkJd2xfcmF0ZXNldF90ICpyZXRfcnMgPSAod2xfcmF0ZXNldF90ICopIGFyZzsKIAotCQkJYnplcm8oJnJzLCBzaXplb2Yod2xjX3JhdGVzZXRfdCkpOworCQkJbWVtc2V0KCZycywgMCwgc2l6ZW9mKHdsY19yYXRlc2V0X3QpKTsKIAkJCXdsY19kZWZhdWx0X3JhdGVzZXQod2xjLCAod2xjX3JhdGVzZXRfdCAqKSAmcnMpOwogCiAJCQlpZiAobGVuIDwgKGludCkocnMuY291bnQgKyBzaXplb2YocnMuY291bnQpKSkgewpAQCAtMzkxMyw3ICszNzE2LDcgQEAKIAkJCQlicmVhazsKIAkJCX0KIAotCQkJYnplcm8oJnJzLCBzaXplb2Yod2xjX3JhdGVzZXRfdCkpOworCQkJbWVtc2V0KCZycywgMCwgc2l6ZW9mKHdsY19yYXRlc2V0X3QpKTsKIAogCQkJLyogQ29weSBvbmx5IGxlZ2FjeSByYXRlc2V0IHNlY3Rpb24gKi8KIAkJCXJzLmNvdW50ID0gaW5fcnMtPmNvdW50OwpAQCAtNDI0Nyw3ICs0MDUwLDcgQEAKIAogCQkJLyogY2hlY2sgZm9yIGFuIGVtcHR5IHJhdGVzZXQgdG8gY2xlYXIgdGhlIG92ZXJyaWRlICovCiAJCQlpZiAocnMuY291bnQgPT0gMCkgewotCQkJCWJ6ZXJvKCZ3bGMtPnN1cF9yYXRlc19vdmVycmlkZSwKKwkJCQltZW1zZXQoJndsYy0+c3VwX3JhdGVzX292ZXJyaWRlLCAwLAogCQkJCSAgICAgIHNpemVvZih3bGNfcmF0ZXNldF90KSk7CiAJCQkJYnJlYWs7CiAJCQl9CkBAIC00Mzk0LDcgKzQxOTcsNyBAQAogI2VuZGlmCiAKIAljYXNlIFdMQ19MQVNUOgotCQlXTF9FUlJPUigoIiVzOiBXTENfTEFTVFxuIiwgX19mdW5jX18pKTsKKwkJV0xfRVJST1IoIiVzOiBXTENfTEFTVFxuIiwgX19mdW5jX18pOwogCX0KICBkb25lOgogCkBAIC00NDA2LDIxICs0MjA5LDE5IEBACiAJCX0KIAogCX0KLSNpZmRlZiBXTENfTE9XCiAJLyogQk1BQ19OT1RFOiBmb3IgSElHSF9PTkxZIGRyaXZlciwgdGhpcyBzZWVtcyBiZWluZyBjYWxsZWQgYWZ0ZXIgUlBDIGJ1cyBmYWlsZWQgKi8KIAkvKiBJbiBod19vZmYgY29uZGl0aW9uLCBJT0NUTHMgdGhhdCByZWFjaCBoZXJlIGFyZSBkZWVtZWQgc2FmZSBidXQgdGFjbGVhciB3b3VsZAogCSAqIGNlcnRhaW5seSByZXN1bHQgaW4gZ2V0dGluZyAtMSBmb3IgcmVnaXN0ZXIgcmVhZHMuIFNvIHNraXAgdGFfY2xlYXIgYWx0b2dldGhlcgogCSAqLwogCWlmICghKHdsYy0+cHViLT5od19vZmYpKQogCQlBU1NFUlQod2xjX2JtYWNfdGFjbGVhcih3bGMtPmh3LCB0YV9vaykgfHwgIXRhX29rKTsKLSNlbmRpZgogCiAJcmV0dXJuIGJjbWVycm9yOwogfQogCiAjaWYgZGVmaW5lZChCQ01EQkcpCiAvKiBjb25zb2xpZGF0ZWQgcmVnaXN0ZXIgYWNjZXNzIGlvY3RsIGVycm9yIGNoZWNraW5nICovCi1pbnQgd2xjX2lvY3JlZ2Noayh3bGNfaW5mb190ICp3bGMsIHVpbnQgYmFuZCkKK2ludCB3bGNfaW9jcmVnY2hrKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCB1aW50IGJhbmQpCiB7CiAJLyogaWYgYmFuZCBpcyBzcGVjaWZpZWQsIGl0IG11c3QgYmUgdGhlIGN1cnJlbnQgYmFuZCAqLwogCWlmICgoYmFuZCAhPSBXTENfQkFORF9BVVRPKSAmJiAoYmFuZCAhPSAodWludCkgd2xjLT5iYW5kLT5iYW5kdHlwZSkpCkBAIC00NDQwLDcgKzQyNDEsNyBAQAogCiAjaWYgZGVmaW5lZChCQ01EQkcpCiAvKiBGb3Igc29tZSBpb2N0bHMsIG1ha2Ugc3VyZSB0aGF0IHRoZSBwaSBwb2ludGVyIG1hdGNoZXMgdGhlIGN1cnJlbnQgcGh5ICovCi1pbnQgd2xjX2lvY3BpY2hrKHdsY19pbmZvX3QgKndsYywgdWludCBwaHl0eXBlKQoraW50IHdsY19pb2NwaWNoayhzdHJ1Y3Qgd2xjX2luZm8gKndsYywgdWludCBwaHl0eXBlKQogewogCWlmICh3bGMtPmJhbmQtPnBoeXR5cGUgIT0gcGh5dHlwZSkKIAkJcmV0dXJuIEJDTUVfQkFEQkFORDsKQEAgLTQ0NzQsMjEgKzQyNzUsMjEgQEAKIH0KIAogLyogc2ltcGxpZmllZCBpbnRlZ2VyIGdldCBpbnRlcmZhY2UgZm9yIGNvbW1vbiBXTENfR0VUX1ZBUiBpb2N0bCBoYW5kbGVyICovCi1pbnQgd2xjX2lvdmFyX2dldGludCh3bGNfaW5mb190ICp3bGMsIGNvbnN0IGNoYXIgKm5hbWUsIGludCAqYXJnKQoraW50IHdsY19pb3Zhcl9nZXRpbnQoc3RydWN0IHdsY19pbmZvICp3bGMsIGNvbnN0IGNoYXIgKm5hbWUsIGludCAqYXJnKQogewogCXJldHVybiB3bGNfaW92YXJfb3Aod2xjLCBuYW1lLCBOVUxMLCAwLCBhcmcsIHNpemVvZihzMzIpLCBJT1ZfR0VULAogCQkJICAgIE5VTEwpOwogfQogCiAvKiBzaW1wbGlmaWVkIGludGVnZXIgc2V0IGludGVyZmFjZSBmb3IgY29tbW9uIFdMQ19TRVRfVkFSIGlvY3RsIGhhbmRsZXIgKi8KLWludCB3bGNfaW92YXJfc2V0aW50KHdsY19pbmZvX3QgKndsYywgY29uc3QgY2hhciAqbmFtZSwgaW50IGFyZykKK2ludCB3bGNfaW92YXJfc2V0aW50KHN0cnVjdCB3bGNfaW5mbyAqd2xjLCBjb25zdCBjaGFyICpuYW1lLCBpbnQgYXJnKQogewogCXJldHVybiB3bGNfaW92YXJfb3Aod2xjLCBuYW1lLCBOVUxMLCAwLCAodm9pZCAqKSZhcmcsIHNpemVvZihhcmcpLAogCQkJICAgIElPVl9TRVQsIE5VTEwpOwogfQogCiAvKiBzaW1wbGlmaWVkIHM4IGdldCBpbnRlcmZhY2UgZm9yIGNvbW1vbiBXTENfR0VUX1ZBUiBpb2N0bCBoYW5kbGVyICovCi1pbnQgd2xjX2lvdmFyX2dldHM4KHdsY19pbmZvX3QgKndsYywgY29uc3QgY2hhciAqbmFtZSwgczggKmFyZykKK2ludCB3bGNfaW92YXJfZ2V0czgoc3RydWN0IHdsY19pbmZvICp3bGMsIGNvbnN0IGNoYXIgKm5hbWUsIHM4ICphcmcpCiB7CiAJaW50IGlvdmFyX2ludDsKIAlpbnQgZXJyOwpAQCAtNDUwNywxMSArNDMwOCwxMSBAQAogICogY2FsbGluZyBmdW5jdGlvbiBtdXN0IGtlZXAgJ2lvdmFycycgdW50aWwgd2xjX21vZHVsZV91bnJlZ2lzdGVyIGlzIGNhbGxlZC4KICAqICdpb3ZhcicgbXVzdCBoYXZlIHRoZSBsYXN0IGVudHJ5J3MgbmFtZSBmaWVsZCBiZWluZyBOVUxMIGFzIHRlcm1pbmF0b3IuCiAgKi8KLWludCB3bGNfbW9kdWxlX3JlZ2lzdGVyKHdsY19wdWJfdCAqcHViLCBjb25zdCBiY21faW92YXJfdCAqaW92YXJzLAoraW50IHdsY19tb2R1bGVfcmVnaXN0ZXIoc3RydWN0IHdsY19wdWIgKnB1YiwgY29uc3QgYmNtX2lvdmFyX3QgKmlvdmFycywKIAkJCWNvbnN0IGNoYXIgKm5hbWUsIHZvaWQgKmhkbCwgaW92YXJfZm5fdCBpX2ZuLAogCQkJd2F0Y2hkb2dfZm5fdCB3X2ZuLCBkb3duX2ZuX3QgZF9mbikKIHsKLQl3bGNfaW5mb190ICp3bGMgPSAod2xjX2luZm9fdCAqKSBwdWItPndsYzsKKwlzdHJ1Y3Qgd2xjX2luZm8gKndsYyA9IChzdHJ1Y3Qgd2xjX2luZm8gKikgcHViLT53bGM7CiAJaW50IGk7CiAKIAlBU1NFUlQobmFtZSAhPSBOVUxMKTsKQEAgLTQ1MzcsOSArNDMzOCw5IEBACiB9CiAKIC8qIHVucmVnaXN0ZXIgbW9kdWxlIGNhbGxiYWNrcyAqLwotaW50IHdsY19tb2R1bGVfdW5yZWdpc3Rlcih3bGNfcHViX3QgKnB1YiwgY29uc3QgY2hhciAqbmFtZSwgdm9pZCAqaGRsKQoraW50IHdsY19tb2R1bGVfdW5yZWdpc3RlcihzdHJ1Y3Qgd2xjX3B1YiAqcHViLCBjb25zdCBjaGFyICpuYW1lLCB2b2lkICpoZGwpCiB7Ci0Jd2xjX2luZm9fdCAqd2xjID0gKHdsY19pbmZvX3QgKikgcHViLT53bGM7CisJc3RydWN0IHdsY19pbmZvICp3bGMgPSAoc3RydWN0IHdsY19pbmZvICopIHB1Yi0+d2xjOwogCWludCBpOwogCiAJaWYgKHdsYyA9PSBOVUxMKQpAQCAtNDU1MCw3ICs0MzUxLDcgQEAKIAlmb3IgKGkgPSAwOyBpIDwgV0xDX01BWE1PRFVMRVM7IGkrKykgewogCQlpZiAoIXN0cmNtcCh3bGMtPm1vZHVsZWNiW2ldLm5hbWUsIG5hbWUpICYmCiAJCSAgICAod2xjLT5tb2R1bGVjYltpXS5oZGwgPT0gaGRsKSkgewotCQkJYnplcm8oJndsYy0+bW9kdWxlY2JbaV0sIHNpemVvZihtb2R1bGVjYl90KSk7CisJCQltZW1zZXQoJndsYy0+bW9kdWxlY2JbaV0sIDAsIHNpemVvZihtb2R1bGVjYl90KSk7CiAJCQlyZXR1cm4gMDsKIAkJfQogCX0KQEAgLTQ1NjAsNyArNDM2MSw3IEBACiB9CiAKIC8qIFdyaXRlIFdNRSB0dW5hYmxlIHBhcmFtZXRlcnMgZm9yIHJldHJhbnNtaXQvbWF4IHJhdGUgZnJvbSB3bGMgc3RydWN0IHRvIHVjb2RlICovCi1zdGF0aWMgdm9pZCB3bGNfd21lX3JldHJpZXNfd3JpdGUod2xjX2luZm9fdCAqd2xjKQorc3RhdGljIHZvaWQgd2xjX3dtZV9yZXRyaWVzX3dyaXRlKHN0cnVjdCB3bGNfaW5mbyAqd2xjKQogewogCWludCBhYzsKIApAQCAtNDU4Miw3ICs0MzgzLDcgQEAKICAqIEFsbCBwb2ludGVycyBtYXkgcG9pbnQgaW50byB0aGUgc2FtZSBidWZmZXIuCiAgKi8KIGludAotd2xjX2lvdmFyX29wKHdsY19pbmZvX3QgKndsYywgY29uc3QgY2hhciAqbmFtZSwKK3dsY19pb3Zhcl9vcChzdHJ1Y3Qgd2xjX2luZm8gKndsYywgY29uc3QgY2hhciAqbmFtZSwKIAkgICAgIHZvaWQgKnBhcmFtcywgaW50IHBfbGVuLCB2b2lkICphcmcsIGludCBsZW4sCiAJICAgICBib29sIHNldCwgc3RydWN0IHdsY19pZiAqd2xjaWYpCiB7CkBAIC00NjA2LDggKzQ0MDcsOCBAQAogCiAJaWYgKCFzZXQgJiYgKGxlbiA9PSBzaXplb2YoaW50KSkgJiYKIAkgICAgIShJU19BTElHTkVEKCh1bnNpZ25lZCBsb25nKShhcmcpLCAodWludCkgc2l6ZW9mKGludCkpKSkgewotCQlXTF9FUlJPUigoIndsJWQ6ICVzIHVuYWxpZ25lZCBnZXQgcHRyIGZvciAlc1xuIiwKLQkJCSAgd2xjLT5wdWItPnVuaXQsIF9fZnVuY19fLCBuYW1lKSk7CisJCVdMX0VSUk9SKCJ3bCVkOiAlcyB1bmFsaWduZWQgZ2V0IHB0ciBmb3IgJXNcbiIsCisJCQkgd2xjLT5wdWItPnVuaXQsIF9fZnVuY19fLCBuYW1lKTsKIAkJQVNTRVJUKDApOwogCX0KIApAQCAtNDYyMiwxMSArNDQyMyw2IEBACiAJLyogaW92YXIgbmFtZSBub3QgZm91bmQgKi8KIAlpZiAoaSA+PSBXTENfTUFYTU9EVUxFUykgewogCQllcnIgPSBCQ01FX1VOU1VQUE9SVEVEOwotI2lmZGVmIFdMQ19ISUdIX09OTFkKLQkJZXJyID0KLQkJICAgIGJjbXNkaF9pb3Zhcl9vcCh3bGMtPmJ0cGFyYW0sIG5hbWUsIHBhcmFtcywgcF9sZW4sIGFyZywgbGVuLAotCQkJCSAgICBzZXQpOwotI2VuZGlmCiAJCWdvdG8gZXhpdDsKIAl9CiAKQEAgLTQ2NTgsMTAgKzQ0NTQsMTAgQEAKIH0KIAogaW50Ci13bGNfaW92YXJfY2hlY2sod2xjX3B1Yl90ICpwdWIsIGNvbnN0IGJjbV9pb3Zhcl90ICp2aSwgdm9pZCAqYXJnLCBpbnQgbGVuLAord2xjX2lvdmFyX2NoZWNrKHN0cnVjdCB3bGNfcHViICpwdWIsIGNvbnN0IGJjbV9pb3Zhcl90ICp2aSwgdm9pZCAqYXJnLCBpbnQgbGVuLAogCQlib29sIHNldCkKIHsKLQl3bGNfaW5mb190ICp3bGMgPSAod2xjX2luZm9fdCAqKSBwdWItPndsYzsKKwlzdHJ1Y3Qgd2xjX2luZm8gKndsYyA9IChzdHJ1Y3Qgd2xjX2luZm8gKikgcHViLT53bGM7CiAJaW50IGVyciA9IDA7CiAJczMyIGludF92YWwgPSAwOwogCkBAIC00NzI5LDcgKzQ1MjUsNyBAQAogCSAgICBjb25zdCBjaGFyICpuYW1lLCB2b2lkICpwYXJhbXMsIHVpbnQgcF9sZW4sIHZvaWQgKmFyZywgaW50IGxlbiwKIAkgICAgaW50IHZhbF9zaXplLCBzdHJ1Y3Qgd2xjX2lmICp3bGNpZikKIHsKLQl3bGNfaW5mb190ICp3bGMgPSBoZGw7CisJc3RydWN0IHdsY19pbmZvICp3bGMgPSBoZGw7CiAJd2xjX2Jzc2NmZ190ICpic3NjZmc7CiAJaW50IGVyciA9IDA7CiAJczMyIGludF92YWwgPSAwOwpAQCAtNDczOSw3ICs0NTM1LDcgQEAKIAlib29sIGJvb2xfdmFsMjsKIAl3bGNfYnNzX2luZm9fdCAqY3VycmVudF9ic3M7CiAKLQlXTF9UUkFDRSgoIndsJWQ6ICVzXG4iLCB3bGMtPnB1Yi0+dW5pdCwgX19mdW5jX18pKTsKKwlXTF9UUkFDRSgid2wlZDogJXNcbiIsIHdsYy0+cHViLT51bml0LCBfX2Z1bmNfXyk7CiAKIAlic3NjZmcgPSBOVUxMOwogCWN1cnJlbnRfYnNzID0gTlVMTDsKQEAgLTQ3NjIsOCArNDU1OCw4IEBACiAJYm9vbF92YWwgPSAoaW50X3ZhbCAhPSAwKSA/IHRydWUgOiBmYWxzZTsKIAlib29sX3ZhbDIgPSAoaW50X3ZhbDIgIT0gMCkgPyB0cnVlIDogZmFsc2U7CiAKLQlXTF9UUkFDRSgoIndsJWQ6ICVzOiBpZCAlZFxuIiwgd2xjLT5wdWItPnVuaXQsIF9fZnVuY19fLAotCQkgIElPVl9JRChhY3Rpb25pZCkpKTsKKwlXTF9UUkFDRSgid2wlZDogJXM6IGlkICVkXG4iLAorCQkgd2xjLT5wdWItPnVuaXQsIF9fZnVuY19fLCBJT1ZfSUQoYWN0aW9uaWQpKTsKIAkvKiBEbyB0aGUgYWN0dWFsIHBhcmFtZXRlciBpbXBsZW1lbnRhdGlvbiAqLwogCXN3aXRjaCAoYWN0aW9uaWQpIHsKIApAQCAtNDgyMSw3ICs0NjE3LDcgQEAKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgotCQlXTF9FUlJPUigoIndsJWQ6ICVzOiB1bnN1cHBvcnRlZFxuIiwgd2xjLT5wdWItPnVuaXQsIF9fZnVuY19fKSk7CisJCVdMX0VSUk9SKCJ3bCVkOiAlczogdW5zdXBwb3J0ZWRcbiIsIHdsYy0+cHViLT51bml0LCBfX2Z1bmNfXyk7CiAJCWVyciA9IEJDTUVfVU5TVVBQT1JURUQ7CiAJCWJyZWFrOwogCX0KQEAgLTQ4MzMsNyArNDYyOSw3IEBACiB9CiAKIHN0YXRpYyBpbnQKLXdsY19pb3Zhcl9yYW5nZWNoZWNrKHdsY19pbmZvX3QgKndsYywgdTMyIHZhbCwgY29uc3QgYmNtX2lvdmFyX3QgKnZpKQord2xjX2lvdmFyX3JhbmdlY2hlY2soc3RydWN0IHdsY19pbmZvICp3bGMsIHUzMiB2YWwsIGNvbnN0IGJjbV9pb3Zhcl90ICp2aSkKIHsKIAlpbnQgZXJyID0gMDsKIAl1MzIgbWluX3ZhbCA9IDA7CkBAIC00OTMwLDcgKzQ3MjYsNyBAQAogI2RlZmluZSBNQUNTVEFUVVBEKG5hbWUpIFwKIAl3bGNfY3RydXBkX2NhY2hlKG1hY3N0YXRzLm5hbWUsICZ3bGMtPmNvcmUtPm1hY3N0YXRfc25hcHNob3QtPm5hbWUsICZ3bGMtPnB1Yi0+X2NudC0+bmFtZSkKIAotdm9pZCB3bGNfc3RhdHN1cGQod2xjX2luZm9fdCAqd2xjKQordm9pZCB3bGNfc3RhdHN1cGQoc3RydWN0IHdsY19pbmZvICp3bGMpCiB7CiAJaW50IGk7CiAjaWZkZWYgQkNNREJHCkBAIC00OTU2LDggKzQ3NTIsOCBAQAogCS8qIGNoZWNrIGZvciByeCBmaWZvIDAgb3ZlcmZsb3cgKi8KIAlkZWx0YSA9ICh1MTYpICh3bGMtPmNvcmUtPm1hY3N0YXRfc25hcHNob3QtPnJ4ZjBvdmZsIC0gcnhmMG92ZmwpOwogCWlmIChkZWx0YSkKLQkJV0xfRVJST1IoKCJ3bCVkOiAldSByeCBmaWZvIDAgb3ZlcmZsb3dzIVxuIiwgd2xjLT5wdWItPnVuaXQsCi0JCQkgIGRlbHRhKSk7CisJCVdMX0VSUk9SKCJ3bCVkOiAldSByeCBmaWZvIDAgb3ZlcmZsb3dzIVxuIiwKKwkJCSB3bGMtPnB1Yi0+dW5pdCwgZGVsdGEpOwogCiAJLyogY2hlY2sgZm9yIHR4IGZpZm8gdW5kZXJmbG93cyAqLwogCWZvciAoaSA9IDA7IGkgPCBORklGTzsgaSsrKSB7CkBAIC00OTY1LDggKzQ3NjEsOCBAQAogCQkgICAgKHUxNikgKHdsYy0+Y29yZS0+bWFjc3RhdF9zbmFwc2hvdC0+dHhmdW5mbFtpXSAtCiAJCQkgICAgICB0eGZ1bmZsW2ldKTsKIAkJaWYgKGRlbHRhKQotCQkJV0xfRVJST1IoKCJ3bCVkOiAldSB0eCBmaWZvICVkIHVuZGVyZmxvd3MhXG4iLAotCQkJCSAgd2xjLT5wdWItPnVuaXQsIGRlbHRhLCBpKSk7CisJCQlXTF9FUlJPUigid2wlZDogJXUgdHggZmlmbyAlZCB1bmRlcmZsb3dzIVxuIiwKKwkJCQkgd2xjLT5wdWItPnVuaXQsIGRlbHRhLCBpKTsKIAl9CiAjZW5kaWYJCQkJLyogQkNNREJHICovCiAKQEAgLTUwMTUsNyArNDgxMSw3IEBACiBib29sIHdsY19jaGlwbWF0Y2godTE2IHZlbmRvciwgdTE2IGRldmljZSkKIHsKIAlpZiAodmVuZG9yICE9IFZFTkRPUl9CUk9BRENPTSkgewotCQlXTF9FUlJPUigoIndsY19jaGlwbWF0Y2g6IHVua25vd24gdmVuZG9yIGlkICUwNHhcbiIsIHZlbmRvcikpOworCQlXTF9FUlJPUigid2xjX2NoaXBtYXRjaDogdW5rbm93biB2ZW5kb3IgaWQgJTA0eFxuIiwgdmVuZG9yKTsKIAkJcmV0dXJuIGZhbHNlOwogCX0KIApAQCAtNTAyNyw3ICs0ODIzLDcgQEAKIAlpZiAoKGRldmljZSA9PSBCQ000MzIzNl9EMTFOX0lEKSB8fCAoZGV2aWNlID09IEJDTTQzMjM2X0QxMU4yR19JRCkpCiAJCXJldHVybiB0cnVlOwogCi0JV0xfRVJST1IoKCJ3bGNfY2hpcG1hdGNoOiB1bmtub3duIGRldmljZSBpZCAlMDR4XG4iLCBkZXZpY2UpKTsKKwlXTF9FUlJPUigid2xjX2NoaXBtYXRjaDogdW5rbm93biBkZXZpY2UgaWQgJTA0eFxuIiwgZGV2aWNlKTsKIAlyZXR1cm4gZmFsc2U7CiB9CiAKQEAgLTUxODIsMjAgKzQ5NzgsMTIgQEAKIH0KICNlbmRpZgkJCQkvKiBkZWZpbmVkKEJDTURCRykgKi8KIAotdTE2IHdsY19yYXRlX3NobV9vZmZzZXQod2xjX2luZm9fdCAqd2xjLCB1OCByYXRlKQordTE2IHdsY19yYXRlX3NobV9vZmZzZXQoc3RydWN0IHdsY19pbmZvICp3bGMsIHU4IHJhdGUpCiB7CiAJcmV0dXJuIHdsY19ibWFjX3JhdGVfc2htX29mZnNldCh3bGMtPmh3LCByYXRlKTsKIH0KIAogLyogQ2FsbGJhY2sgZm9yIGRldmljZSByZW1vdmVkICovCi0jaWYgZGVmaW5lZChXTENfSElHSF9PTkxZKQotdm9pZCB3bGNfZGV2aWNlX3JlbW92ZWQodm9pZCAqYXJnKQotewotCXdsY19pbmZvX3QgKndsYyA9ICh3bGNfaW5mb190ICopIGFyZzsKLQotCXdsYy0+ZGV2aWNlX3ByZXNlbnQgPSBmYWxzZTsKLX0KLSNlbmRpZgkJCQkvKiBXTENfSElHSF9PTkxZICovCiAKIC8qCiAgKiBBdHRlbXB0cyB0byBxdWV1ZSBhIHBhY2tldCBvbnRvIGEgbXVsdGlwbGUtcHJlY2VkZW5jZSBxdWV1ZSwKQEAgLTUyMDcsMTYgKzQ5OTUsMTYgQEAKICAqIFJldHVybnMgdHJ1ZSBpZiBwYWNrZXQgY29uc3VtZWQgKHF1ZXVlZCksIGZhbHNlIGlmIG5vdC4KICAqLwogYm9vbCBCQ01GQVNUUEFUSAotd2xjX3ByZWNfZW5xKHdsY19pbmZvX3QgKndsYywgc3RydWN0IHBrdHEgKnEsIHZvaWQgKnBrdCwgaW50IHByZWMpCit3bGNfcHJlY19lbnEoc3RydWN0IHdsY19pbmZvICp3bGMsIHN0cnVjdCBwa3RxICpxLCB2b2lkICpwa3QsIGludCBwcmVjKQogewogCXJldHVybiB3bGNfcHJlY19lbnFfaGVhZCh3bGMsIHEsIHBrdCwgcHJlYywgZmFsc2UpOwogfQogCiBib29sIEJDTUZBU1RQQVRICi13bGNfcHJlY19lbnFfaGVhZCh3bGNfaW5mb190ICp3bGMsIHN0cnVjdCBwa3RxICpxLCB2b2lkICpwa3QsIGludCBwcmVjLAotCQkgIGJvb2wgaGVhZCkKK3dsY19wcmVjX2VucV9oZWFkKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCBzdHJ1Y3QgcGt0cSAqcSwgc3RydWN0IHNrX2J1ZmYgKnBrdCwKKwkJICBpbnQgcHJlYywgYm9vbCBoZWFkKQogewotCXZvaWQgKnA7CisJc3RydWN0IHNrX2J1ZmYgKnA7CiAJaW50IGVwcmVjID0gLTE7CQkvKiBwcmVjZWRlbmNlIHRvIGV2aWN0IGZyb20gKi8KIAogCS8qIERldGVybWluZSBwcmVjZWRlbmNlIGZyb20gd2hpY2ggdG8gZXZpY3QgcGFja2V0LCBpZiBhbnkgKi8KQEAgLTUyMjYsOCArNTAxNCw4IEBACiAJCXAgPSBwa3RxX3BlZWtfdGFpbChxLCAmZXByZWMpOwogCQlBU1NFUlQocCAhPSBOVUxMKTsKIAkJaWYgKGVwcmVjID4gcHJlYykgewotCQkJV0xfRVJST1IoKCIlczogRmFpbGluZzogZXByZWMgJWQgPiBwcmVjICVkXG4iLCBfX2Z1bmNfXywKLQkJCQkgIGVwcmVjLCBwcmVjKSk7CisJCQlXTF9FUlJPUigiJXM6IEZhaWxpbmc6IGVwcmVjICVkID4gcHJlYyAlZFxuIiwKKwkJCQkgX19mdW5jX18sIGVwcmVjLCBwcmVjKTsKIAkJCXJldHVybiBmYWxzZTsKIAkJfQogCX0KQEAgLTUyNDMsOCArNTAzMSw4IEBACiAKIAkJLyogUmVmdXNlIG5ld2VyIHBhY2tldCB1bmxlc3MgY29uZmlndXJlZCB0byBkaXNjYXJkIG9sZGVzdCAqLwogCQlpZiAoZXByZWMgPT0gcHJlYyAmJiAhZGlzY2FyZF9vbGRlc3QpIHsKLQkJCVdMX0VSUk9SKCgiJXM6IE5vIHdoZXJlIHRvIGdvLCBwcmVjID09ICVkXG4iLCBfX2Z1bmNfXywKLQkJCQkgIHByZWMpKTsKKwkJCVdMX0VSUk9SKCIlczogTm8gd2hlcmUgdG8gZ28sIHByZWMgPT0gJWRcbiIsCisJCQkJIF9fZnVuY19fLCBwcmVjKTsKIAkJCXJldHVybiBmYWxzZTsKIAkJfQogCkBAIC01MjU2LDE0ICs1MDQ0LDE0IEBACiAJCS8qIEluY3JlbWVudCB3bWUgc3RhdHMgKi8KIAkJaWYgKFdNRV9FTkFCKHdsYy0+cHViKSkgewogCQkJV0xDTlRJTkNSKHdsYy0+cHViLT5fd21lX2NudC0+Ci0JCQkJICB0eF9mYWlsZWRbV01FX1BSSU8yQUMoUEtUUFJJTyhwKSldLnBhY2tldHMpOworCQkJCSAgdHhfZmFpbGVkW1dNRV9QUklPMkFDKHAtPnByaW9yaXR5KV0ucGFja2V0cyk7CiAJCQlXTENOVEFERCh3bGMtPnB1Yi0+X3dtZV9jbnQtPgotCQkJCSB0eF9mYWlsZWRbV01FX1BSSU8yQUMoUEtUUFJJTyhwKSldLmJ5dGVzLAorCQkJCSB0eF9mYWlsZWRbV01FX1BSSU8yQUMocC0+cHJpb3JpdHkpXS5ieXRlcywKIAkJCQkgcGt0dG90bGVuKHdsYy0+b3NoLCBwKSk7CiAJCX0KIAogCQlBU1NFUlQoMCk7Ci0JCVBLVEZSRUUod2xjLT5vc2gsIHAsIHRydWUpOworCQlwa3RfYnVmX2ZyZWVfc2tiKHdsYy0+b3NoLCBwLCB0cnVlKTsKIAkJV0xDTlRJTkNSKHdsYy0+cHViLT5fY250LT50eG5vYnVmKTsKIAl9CiAKQEAgLTUyNzcsMjUgKzUwNjUsMjYgQEAKIAlyZXR1cm4gdHJ1ZTsKIH0KIAotdm9pZCBCQ01GQVNUUEFUSCB3bGNfdHhxX2VucSh2b2lkICpjdHgsIHN0cnVjdCBzY2IgKnNjYiwgdm9pZCAqc2R1LCB1aW50IHByZWMpCit2b2lkIEJDTUZBU1RQQVRIIHdsY190eHFfZW5xKHZvaWQgKmN0eCwgc3RydWN0IHNjYiAqc2NiLCBzdHJ1Y3Qgc2tfYnVmZiAqc2R1LAorCQkJICAgICB1aW50IHByZWMpCiB7Ci0Jd2xjX2luZm9fdCAqd2xjID0gKHdsY19pbmZvX3QgKikgY3R4OworCXN0cnVjdCB3bGNfaW5mbyAqd2xjID0gKHN0cnVjdCB3bGNfaW5mbyAqKSBjdHg7CiAJd2xjX3R4cV9pbmZvX3QgKnFpID0gd2xjLT5hY3RpdmVfcXVldWU7CS8qIENoZWNrIG1lICovCiAJc3RydWN0IHBrdHEgKnEgPSAmcWktPnE7CiAJaW50IHByaW87CiAKLQlwcmlvID0gUEtUUFJJTyhzZHUpOworCXByaW8gPSBzZHUtPnByaW9yaXR5OwogCiAJQVNTRVJUKHBrdHFfbWF4KHEpID49IHdsYy0+cHViLT50dW5hYmxlcy0+ZGF0YWhpd2F0KTsKIAogCWlmICghd2xjX3ByZWNfZW5xKHdsYywgcSwgc2R1LCBwcmVjKSkgewogCQlpZiAoIUVEQ0ZfRU5BQih3bGMtPnB1YikKIAkJICAgIHx8ICh3bGMtPnB1Yi0+d2xmZWF0dXJlZmxhZyAmIFdMX1NXRkxfRkxPV0NPTlRST0wpKQotCQkJV0xfRVJST1IoKCJ3bCVkOiB3bGNfdHhxX2VucTogdHhxIG92ZXJmbG93XG4iLAotCQkJCSAgd2xjLT5wdWItPnVuaXQpKTsKKwkJCVdMX0VSUk9SKCJ3bCVkOiB3bGNfdHhxX2VucTogdHhxIG92ZXJmbG93XG4iLAorCQkJCSB3bGMtPnB1Yi0+dW5pdCk7CiAKIAkJLyogQVNTRVJUKDkgPT0gOCk7ICovLyogWFhYIHdlIG1pZ2h0IGhpdCB0aGlzIGNvbmR0aW9uIGluIGNhc2UgcGFja2V0IGZsb29kaW5nIGZyb20gbWFjODAyMTEgc3RhY2sgKi8KLQkJUEtURlJFRSh3bGMtPm9zaCwgc2R1LCB0cnVlKTsKKwkJcGt0X2J1Zl9mcmVlX3NrYih3bGMtPm9zaCwgc2R1LCB0cnVlKTsKIAkJV0xDTlRJTkNSKHdsYy0+cHViLT5fY250LT50eG5vYnVmKTsKIAl9CiAKQEAgLTUzMTcsMTMgKzUxMDYsMTQgQEAKIH0KIAogYm9vbCBCQ01GQVNUUEFUSAotd2xjX3NlbmRwa3RfbWFjODAyMTEod2xjX2luZm9fdCAqd2xjLCB2b2lkICpzZHUsIHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQord2xjX3NlbmRwa3RfbWFjODAyMTEoc3RydWN0IHdsY19pbmZvICp3bGMsIHN0cnVjdCBza19idWZmICpzZHUsCisJCSAgICAgc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCiB7CiAJdTggcHJpbzsKIAl1aW50IGZpZm87CiAJdm9pZCAqcGt0OwogCXN0cnVjdCBzY2IgKnNjYiA9ICZnbG9iYWxfc2NiOwotCXN0cnVjdCBkb3QxMV9oZWFkZXIgKmQxMV9oZWFkZXIgPSAoc3RydWN0IGRvdDExX2hlYWRlciAqKVBLVERBVEEoc2R1KTsKKwlzdHJ1Y3QgZG90MTFfaGVhZGVyICpkMTFfaGVhZGVyID0gKHN0cnVjdCBkb3QxMV9oZWFkZXIgKikoc2R1LT5kYXRhKTsKIAl1MTYgdHlwZSwgZmM7CiAKIAlBU1NFUlQoc2R1KTsKQEAgLTUzMzIsMTMgKzUxMjIsMTMgQEAKIAl0eXBlID0gRkNfVFlQRShmYyk7CiAKIAkvKiA4MDIuMTEgc3RhbmRhcmQgcmVxdWlyZXMgbWFuYWdlbWVudCB0cmFmZmljIHRvIGdvIGF0IGhpZ2hlc3QgcHJpb3JpdHkgKi8KLQlwcmlvID0gKHR5cGUgPT0gRkNfVFlQRV9EQVRBID8gUEtUUFJJTyhzZHUpIDogTUFYUFJJTyk7CisJcHJpbyA9ICh0eXBlID09IEZDX1RZUEVfREFUQSA/IHNkdS0+cHJpb3JpdHkgOiBNQVhQUklPKTsKIAlmaWZvID0gcHJpbzJmaWZvW3ByaW9dOwogCi0JQVNTRVJUKCh1aW50KSBQS1RIRUFEUk9PTShzZHUpID49IFRYT0ZGKTsKLQlBU1NFUlQoIVBLVFNIQVJFRChzZHUpKTsKLQlBU1NFUlQoIVBLVE5FWFQoc2R1KSk7Ci0JQVNTRVJUKCFQS1RMSU5LKHNkdSkpOworCUFTU0VSVCgodWludCkgc2tiX2hlYWRyb29tKHNkdSkgPj0gVFhPRkYpOworCUFTU0VSVCghKHNkdS0+Y2xvbmVkKSk7CisJQVNTRVJUKCEoc2R1LT5uZXh0KSk7CisJQVNTRVJUKCEoc2R1LT5wcmV2KSk7CiAJQVNTRVJUKGZpZm8gPCBORklGTyk7CiAKIAlwa3QgPSBzZHU7CkBAIC01MzUyLDkgKzUxNDIsOSBAQAogCXJldHVybiAwOwogfQogCi12b2lkIEJDTUZBU1RQQVRIIHdsY19zZW5kX3Eod2xjX2luZm9fdCAqd2xjLCB3bGNfdHhxX2luZm9fdCAqcWkpCit2b2lkIEJDTUZBU1RQQVRIIHdsY19zZW5kX3Eoc3RydWN0IHdsY19pbmZvICp3bGMsIHdsY190eHFfaW5mb190ICpxaSkKIHsKLQl2b2lkICpwa3RbRE9UMTFfTUFYTlVNRlJBR1NdOworCXN0cnVjdCBza19idWZmICpwa3RbRE9UMTFfTUFYTlVNRlJBR1NdOwogCWludCBwcmVjOwogCXUxNiBwcmVjX21hcDsKIAlpbnQgZXJyID0gMCwgaSwgY291bnQ7CkBAIC01NDI3LDcgKzUyMTcsNyBAQAogICogZm9yIE1DIGZyYW1lcyBzbyBpcyB1c2VkIGFzIHBhcnQgb2YgdGhlIHNlcXVlbmNlIG51bWJlci4KICAqLwogc3RhdGljIGlubGluZSB1MTYKLWJjbWNfZmlkX2dlbmVyYXRlKHdsY19pbmZvX3QgKndsYywgd2xjX2Jzc2NmZ190ICpic3NjZmcsIGQxMXR4aF90ICp0eGgpCitiY21jX2ZpZF9nZW5lcmF0ZShzdHJ1Y3Qgd2xjX2luZm8gKndsYywgd2xjX2Jzc2NmZ190ICpic3NjZmcsIGQxMXR4aF90ICp0eGgpCiB7CiAJdTE2IGZyYW1laWQ7CiAKQEAgLTU0NDEsMTMgKzUyMzEsMTQgQEAKIH0KIAogdm9pZCBCQ01GQVNUUEFUSAotd2xjX3R4Zmlmbyh3bGNfaW5mb190ICp3bGMsIHVpbnQgZmlmbywgdm9pZCAqcCwgYm9vbCBjb21taXQsIHM4IHR4cGt0cGVuZCkKK3dsY190eGZpZm8oc3RydWN0IHdsY19pbmZvICp3bGMsIHVpbnQgZmlmbywgc3RydWN0IHNrX2J1ZmYgKnAsIGJvb2wgY29tbWl0LAorCSAgIHM4IHR4cGt0cGVuZCkKIHsKIAl1MTYgZnJhbWVpZCA9IElOVkFMSURGSUQ7CiAJZDExdHhoX3QgKnR4aDsKIAogCUFTU0VSVChmaWZvIDwgTkZJRk8pOwotCXR4aCA9IChkMTF0eGhfdCAqKSBQS1REQVRBKHApOworCXR4aCA9IChkMTF0eGhfdCAqKSAocC0+ZGF0YSk7CiAKIAkvKiBXaGVuIGEgQkMvTUMgZnJhbWUgaXMgYmVpbmcgY29tbWl0dGVkIHRvIHRoZSBCQ01DIGZpZm8gdmlhIERNQSAoTk9UIFBJTyksIHVwZGF0ZQogCSAqIHVjb2RlIG9yIEJTUyBpbmZvIGFzIGFwcHJvcHJpYXRlLgpAQCAtNTQ2MCwyMSArNTI1MSwxNCBAQAogCWlmIChXTENfV0FSMTYxNjUod2xjKSkKIAkJd2xjX3dhcjE2MTY1KHdsYywgdHJ1ZSk7CiAKLSNpZmRlZiBXTENfSElHSF9PTkxZCi0JaWYgKFJQQ1RYX0VOQUIod2xjLT5wdWIpKSB7Ci0JCSh2b2lkKXdsY19ycGN0eF90eCh3bGMtPnJwY3R4LCBmaWZvLCBwLCBjb21taXQsIGZyYW1laWQsCi0JCQkJICAgdHhwa3RwZW5kKTsKLQkJcmV0dXJuOwotCX0KLSNlbHNlCiAKIAkvKiBCdW1wIHVwIHBlbmRpbmcgY291bnQgZm9yIGlmIG5vdCB1c2luZyBycGMuIElmIHJwYyBpcyB1c2VkLCB0aGlzIHdpbGwgYmUgaGFuZGxlZAogCSAqIGluIHdsY19ibWFjX3R4ZmlmbygpCiAJICovCiAJaWYgKGNvbW1pdCkgewogCQlUWFBLVFBFTkRJTkMod2xjLCBmaWZvLCB0eHBrdHBlbmQpOwotCQlXTF9UUkFDRSgoIndsY190eGZpZm8sIHBrdHBlbmQgaW5jICVkIHRvICVkXG4iLCB0eHBrdHBlbmQsCi0JCQkgIFRYUEtUUEVOREdFVCh3bGMsIGZpZm8pKSk7CisJCVdMX1RSQUNFKCJ3bGNfdHhmaWZvLCBwa3RwZW5kIGluYyAlZCB0byAlZFxuIiwKKwkJCSB0eHBrdHBlbmQsIFRYUEtUUEVOREdFVCh3bGMsIGZpZm8pKTsKIAl9CiAKIAkvKiBDb21taXQgQkNNQyBzZXF1ZW5jZSBudW1iZXIgaW4gdGhlIFNITSBmcmFtZSBJRCBsb2NhdGlvbiAqLwpAQCAtNTQ4MiwxMyArNTI2NiwxMiBAQAogCQlCQ01DRklEKHdsYywgZnJhbWVpZCk7CiAKIAlpZiAoZG1hX3R4ZmFzdCh3bGMtPmh3LT5kaVtmaWZvXSwgcCwgY29tbWl0KSA8IDApIHsKLQkJV0xfRVJST1IoKCJ3bGNfdHhmaWZvOiBmYXRhbCwgdG9zcyBmcmFtZXMgISEhXG4iKSk7CisJCVdMX0VSUk9SKCJ3bGNfdHhmaWZvOiBmYXRhbCwgdG9zcyBmcmFtZXMgISEhXG4iKTsKIAl9Ci0jZW5kaWYJCQkJLyogV0xDX0hJR0hfT05MWSAqLwogfQogCiBzdGF0aWMgdTE2Ci13bGNfY29tcHV0ZV9haXJ0aW1lKHdsY19pbmZvX3QgKndsYywgcmF0ZXNwZWNfdCByc3BlYywgdWludCBsZW5ndGgpCit3bGNfY29tcHV0ZV9haXJ0aW1lKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCByYXRlc3BlY190IHJzcGVjLCB1aW50IGxlbmd0aCkKIHsKIAl1MTYgdXNlYyA9IDA7CiAJdWludCBtYWNfcmF0ZSA9IFJTUEVDMlJBVEUocnNwZWMpOwpAQCAtNTUyMyw3ICs1MzA2LDggQEAKIAkJCXVzZWMgPSAobGVuZ3RoIDw8IDMpIC8gMTE7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKLQkJCVdMX0VSUk9SKCgid2wlZDogd2xjX2NvbXB1dGVfYWlydGltZTogdW5zdXBwb3J0ZWQgcnNwZWMgMHgleFxuIiwgd2xjLT5wdWItPnVuaXQsIHJzcGVjKSk7CisJCQlXTF9FUlJPUigid2wlZDogd2xjX2NvbXB1dGVfYWlydGltZTogdW5zdXBwb3J0ZWQgcnNwZWMgMHgleFxuIiwKKwkJCQkgd2xjLT5wdWItPnVuaXQsIHJzcGVjKTsKIAkJCUFTU0VSVCgoY29uc3QgY2hhciAqKSJCYWQgcGh5X3JhdGUiID09IE5VTEwpOwogCQkJYnJlYWs7CiAJCX0KQEAgLTU1MzMsNyArNTMxNyw3IEBACiB9CiAKIHZvaWQgQkNNRkFTVFBBVEgKLXdsY19jb21wdXRlX3BsY3Aod2xjX2luZm9fdCAqd2xjLCByYXRlc3BlY190IHJzcGVjLCB1aW50IGxlbmd0aCwgdTggKnBsY3ApCit3bGNfY29tcHV0ZV9wbGNwKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCByYXRlc3BlY190IHJzcGVjLCB1aW50IGxlbmd0aCwgdTggKnBsY3ApCiB7CiAJaWYgKElTX01DUyhyc3BlYykpIHsKIAkJd2xjX2NvbXB1dGVfbWltb19wbGNwKHJzcGVjLCBsZW5ndGgsIHBsY3ApOwpAQCAtNTU3NCw3ICs1MzU4LDcgQEAKIAlyYXRlX3NpZ25hbCA9IHJhdGVfaW5mb1tyYXRlXSAmIFJBVEVfTUFTSzsKIAlBU1NFUlQocmF0ZV9zaWduYWwgIT0gMCk7CiAKLQliemVybyhwbGNwLCBEMTFfUEhZX0hEUl9MRU4pOworCW1lbXNldChwbGNwLCAwLCBEMTFfUEhZX0hEUl9MRU4pOwogCUQxMUFfUEhZX0hEUl9TUkFURSgob2ZkbV9waHlfaGRyX3QgKikgcGxjcCwgcmF0ZV9zaWduYWwpOwogCiAJdG1wID0gKGxlbmd0aCAmIDB4ZmZmKSA8PCA1OwpAQCAtNTYxOSw3ICs1NDAzLDcgQEAKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgotCQlXTF9FUlJPUigoIndsY19jY2tfcGxjcF9zZXQ6IHVuc3VwcG9ydGVkIHJhdGUgJWRcbiIsIHJhdGVfNTAwKSk7CisJCVdMX0VSUk9SKCJ3bGNfY2NrX3BsY3Bfc2V0OiB1bnN1cHBvcnRlZCByYXRlICVkXG4iLCByYXRlXzUwMCk7CiAJCXJhdGVfNTAwID0gV0xDX1JBVEVfMU07CiAJCXVzZWMgPSBsZW5ndGggPDwgMzsKIAkJYnJlYWs7CkBAIC01NjU3LDcgKzU0NDEsNyBAQAogICogcHJlYW1ibGVfdHlwZQl1c2Ugc2hvcnQvR0Ygb3IgbG9uZy9NTSBQTENQIGhlYWRlcgogICovCiBzdGF0aWMgdTE2IEJDTUZBU1RQQVRICi13bGNfY29tcHV0ZV9mcmFtZV9kdXIod2xjX2luZm9fdCAqd2xjLCByYXRlc3BlY190IHJhdGUsIHU4IHByZWFtYmxlX3R5cGUsCit3bGNfY29tcHV0ZV9mcmFtZV9kdXIoc3RydWN0IHdsY19pbmZvICp3bGMsIHJhdGVzcGVjX3QgcmF0ZSwgdTggcHJlYW1ibGVfdHlwZSwKIAkJICAgICAgdWludCBuZXh0X2ZyYWdfbGVuKQogewogCXUxNiBkdXIsIHNpZnM7CkBAIC01NjkxLDcgKzU0NzUsNyBAQAogICogZnJhbWVfbGVuCQluZXh0IE1QRFUgZnJhbWUgbGVuZ3RoIGluIGJ5dGVzCiAgKi8KIHUxNiBCQ01GQVNUUEFUSAotd2xjX2NvbXB1dGVfcnRzY3RzX2R1cih3bGNfaW5mb190ICp3bGMsIGJvb2wgY3RzX29ubHksIHJhdGVzcGVjX3QgcnRzX3JhdGUsCit3bGNfY29tcHV0ZV9ydHNjdHNfZHVyKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCBib29sIGN0c19vbmx5LCByYXRlc3BlY190IHJ0c19yYXRlLAogCQkgICAgICAgcmF0ZXNwZWNfdCBmcmFtZV9yYXRlLCB1OCBydHNfcHJlYW1ibGVfdHlwZSwKIAkJICAgICAgIHU4IGZyYW1lX3ByZWFtYmxlX3R5cGUsIHVpbnQgZnJhbWVfbGVuLCBib29sIGJhKQogewpAQCAtNTcyMiw3ICs1NTA2LDcgQEAKIAlyZXR1cm4gZHVyOwogfQogCi1zdGF0aWMgYm9vbCB3bGNfcGh5X3JzcGVjX2NoZWNrKHdsY19pbmZvX3QgKndsYywgdTE2IGJ3LCByYXRlc3BlY190IHJzcGVjKQorc3RhdGljIGJvb2wgd2xjX3BoeV9yc3BlY19jaGVjayhzdHJ1Y3Qgd2xjX2luZm8gKndsYywgdTE2IGJ3LCByYXRlc3BlY190IHJzcGVjKQogewogCWlmIChJU19NQ1MocnNwZWMpKSB7CiAJCXVpbnQgbWNzID0gcnNwZWMgJiBSU1BFQ19SQVRFX01BU0s7CkBAIC01NzQ4LDcgKzU1MzIsNyBAQAogCXJldHVybiB0cnVlOwogfQogCi11MTYgQkNNRkFTVFBBVEggd2xjX3BoeXR4Y3RsMV9jYWxjKHdsY19pbmZvX3QgKndsYywgcmF0ZXNwZWNfdCByc3BlYykKK3UxNiBCQ01GQVNUUEFUSCB3bGNfcGh5dHhjdGwxX2NhbGMoc3RydWN0IHdsY19pbmZvICp3bGMsIHJhdGVzcGVjX3QgcnNwZWMpCiB7CiAJdTE2IHBoeWN0bDEgPSAwOwogCXUxNiBidzsKQEAgLTU3NTksNyArNTU0Myw4IEBACiAJCWJ3ID0gUlNQRUNfR0VUX0JXKHJzcGVjKTsKIAkJLyogMTBNaHogaXMgbm90IHN1cHBvcnRlZCB5ZXQgKi8KIAkJaWYgKGJ3IDwgUEhZX1RYQzFfQldfMjBNSFopIHsKLQkJCVdMX0VSUk9SKCgid2xjX3BoeXR4Y3RsMV9jYWxjOiBidyAlZCBpcyBub3Qgc3VwcG9ydGVkIHlldCwgc2V0IHRvIDIwTFxuIiwgYncpKTsKKwkJCVdMX0VSUk9SKCJ3bGNfcGh5dHhjdGwxX2NhbGM6IGJ3ICVkIGlzIG5vdCBzdXBwb3J0ZWQgeWV0LCBzZXQgdG8gMjBMXG4iLAorCQkJCSBidyk7CiAJCQlidyA9IFBIWV9UWEMxX0JXXzIwTUhaOwogCQl9CiAKQEAgLTU3ODQsNyArNTU2OSw3IEBACiAJCS8qIGdldCB0aGUgcGh5Y3RsIGJ5dGUgZnJvbSByYXRlIHBoeWNmZyB0YWJsZSAqLwogCQlwaHljZmcgPSB3bGNfcmF0ZV9sZWdhY3lfcGh5Y3RsKFJTUEVDMlJBVEUocnNwZWMpKTsKIAkJaWYgKHBoeWNmZyA9PSAtMSkgewotCQkJV0xfRVJST1IoKCJ3bGNfcGh5dHhjdGwxX2NhbGM6IHdyb25nIGxlZ2FjeSBPRkRNL0NDSyByYXRlXG4iKSk7CisJCQlXTF9FUlJPUigid2xjX3BoeXR4Y3RsMV9jYWxjOiB3cm9uZyBsZWdhY3kgT0ZETS9DQ0sgcmF0ZVxuIik7CiAJCQlBU1NFUlQoMCk7CiAJCQlwaHljZmcgPSAwOwogCQl9CkBAIC01Nzk4LDE2ICs1NTgzLDE0IEBACiAJLyogcGh5IGNsb2NrIG11c3Qgc3VwcG9ydCA0ME1oeiBpZiB0eCBkZXNjcmlwdG9yIHVzZXMgaXQgKi8KIAlpZiAoKHBoeWN0bDEgJiBQSFlfVFhDMV9CV19NQVNLKSA+PSBQSFlfVFhDMV9CV180ME1IWikgewogCQlBU1NFUlQoQ0hTUEVDX1dMQ19CVyh3bGMtPmNoYW5zcGVjKSA9PSBXTENfNDBfTUhaKTsKLSNpZm5kZWYgV0xDX0hJR0hfT05MWQogCQlBU1NFUlQod2xjLT5jaGFuc3BlYyA9PSB3bGNfcGh5X2NoYW5zcGVjX2dldCh3bGMtPmJhbmQtPnBpKSk7Ci0jZW5kaWYKIAl9CiAjZW5kaWYJCQkJLyogQkNNREJHICovCiAJcmV0dXJuIHBoeWN0bDE7CiB9CiAKIHJhdGVzcGVjX3QgQkNNRkFTVFBBVEgKLXdsY19yc3BlY190b19ydHNfcnNwZWMod2xjX2luZm9fdCAqd2xjLCByYXRlc3BlY190IHJzcGVjLCBib29sIHVzZV9yc3BlYywKK3dsY19yc3BlY190b19ydHNfcnNwZWMoc3RydWN0IHdsY19pbmZvICp3bGMsIHJhdGVzcGVjX3QgcnNwZWMsIGJvb2wgdXNlX3JzcGVjLAogCQkgICAgICAgdTE2IG1pbW9fY3RsY2hidykKIHsKIAlyYXRlc3BlY190IHJ0c19yc3BlYyA9IDA7CkBAIC01ODYzLDE1ICs1NjQ2LDE1IEBACiAgKgogICovCiBzdGF0aWMgdTE2IEJDTUZBU1RQQVRICi13bGNfZDExaGRyc19tYWM4MDIxMSh3bGNfaW5mb190ICp3bGMsIHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAotCQkgICAgIHZvaWQgKnAsIHN0cnVjdCBzY2IgKnNjYiwgdWludCBmcmFnLAord2xjX2QxMWhkcnNfbWFjODAyMTEoc3RydWN0IHdsY19pbmZvICp3bGMsIHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkgICAgIHN0cnVjdCBza19idWZmICpwLCBzdHJ1Y3Qgc2NiICpzY2IsIHVpbnQgZnJhZywKIAkJICAgICB1aW50IG5mcmFncywgdWludCBxdWV1ZSwgdWludCBuZXh0X2ZyYWdfbGVuLAogCQkgICAgIHdzZWNfa2V5X3QgKmtleSwgcmF0ZXNwZWNfdCByc3BlY19vdmVycmlkZSkKIHsKIAlzdHJ1Y3QgZG90MTFfaGVhZGVyICpoOwogCWQxMXR4aF90ICp0eGg7CiAJdTggKnBsY3AsIHBsY3BfZmFsbGJhY2tbRDExX1BIWV9IRFJfTEVOXTsKLQlvc2xfdCAqb3NoOworCXN0cnVjdCBvc2xfaW5mbyAqb3NoOwogCWludCBsZW4sIHBoeWxlbiwgcnRzX3BoeWxlbjsKIAl1MTYgZmMsIHR5cGUsIGZyYW1laWQsIG1jaCwgcGh5Y3RsLCB4ZnRzLCBtYWlucmF0ZXM7CiAJdTE2IHNlcSA9IDAsIG1jbCA9IDAsIHN0YXR1cyA9IDA7CkBAIC01OTExLDcgKzU2OTQsNyBAQAogCW9zaCA9IHdsYy0+b3NoOwogCiAJLyogbG9jYXRlIDgwMi4xMSBNQUMgaGVhZGVyICovCi0JaCA9IChzdHJ1Y3QgZG90MTFfaGVhZGVyICopUEtUREFUQShwKTsKKwloID0gKHN0cnVjdCBkb3QxMV9oZWFkZXIgKikocC0+ZGF0YSk7CiAJZmMgPSBsdG9oMTYoaC0+ZmMpOwogCXR5cGUgPSBGQ19UWVBFKGZjKTsKIApAQCAtNTkzNSwyOSArNTcxOCwyOSBAQAogCUFTU0VSVCh0eF9pbmZvKTsKIAogCS8qIGFkZCBQTENQICovCi0JcGxjcCA9IFBLVFBVU0gocCwgRDExX1BIWV9IRFJfTEVOKTsKKwlwbGNwID0gc2tiX3B1c2gocCwgRDExX1BIWV9IRFJfTEVOKTsKIAogCS8qIGFkZCBCcm9hZGNvbSB0eCBkZXNjcmlwdG9yIGhlYWRlciAqLwotCXR4aCA9IChkMTF0eGhfdCAqKSBQS1RQVVNIKHAsIEQxMV9UWEhfTEVOKTsKLQliemVybygoY2hhciAqKXR4aCwgRDExX1RYSF9MRU4pOworCXR4aCA9IChkMTF0eGhfdCAqKSBza2JfcHVzaChwLCBEMTFfVFhIX0xFTik7CisJbWVtc2V0KChjaGFyICopdHhoLCAwLCBEMTFfVFhIX0xFTik7CiAKIAkvKiBzZXR1cCBmcmFtZWlkICovCiAJaWYgKHR4X2luZm8tPmZsYWdzICYgSUVFRTgwMjExX1RYX0NUTF9BU1NJR05fU0VRKSB7CiAJCS8qIG5vbi1BUCBTVEEgc2hvdWxkIG5ldmVyIHVzZSBCQ01DIHF1ZXVlICovCiAJCUFTU0VSVChxdWV1ZSAhPSBUWF9CQ01DX0ZJRk8pOwogCQlpZiAocXVldWUgPT0gVFhfQkNNQ19GSUZPKSB7Ci0JCQlXTF9FUlJPUigoIndsJWQ6ICVzOiBBU1NFUlQgcXVldWUgPT0gVFhfQkNNQyFcbiIsCi0JCQkJICBXTENXTFVOSVQod2xjKSwgX19mdW5jX18pKTsKKwkJCVdMX0VSUk9SKCJ3bCVkOiAlczogQVNTRVJUIHF1ZXVlID09IFRYX0JDTUMhXG4iLAorCQkJCSBXTENXTFVOSVQod2xjKSwgX19mdW5jX18pOwogCQkJZnJhbWVpZCA9IGJjbWNfZmlkX2dlbmVyYXRlKHdsYywgTlVMTCwgdHhoKTsKIAkJfSBlbHNlIHsKIAkJCS8qIEluY3JlbWVudCB0aGUgY291bnRlciBmb3IgZmlyc3QgZnJhZ21lbnQgKi8KIAkJCWlmICh0eF9pbmZvLT5mbGFncyAmIElFRUU4MDIxMV9UWF9DVExfRklSU1RfRlJBR01FTlQpIHsKLQkJCQlTQ0JfU0VRTlVNKHNjYiwgUEtUUFJJTyhwKSkrKzsKKwkJCQlTQ0JfU0VRTlVNKHNjYiwgcC0+cHJpb3JpdHkpKys7CiAJCQl9CiAKIAkJCS8qIGV4dHJhY3QgZnJhZ21lbnQgbnVtYmVyIGZyb20gZnJhbWUgZmlyc3QgKi8KIAkJCXNlcSA9IGx0b2gxNihzZXEpICYgRlJBR05VTV9NQVNLOwotCQkJc2VxIHw9IChTQ0JfU0VRTlVNKHNjYiwgUEtUUFJJTyhwKSkgPDwgU0VRTlVNX1NISUZUKTsKKwkJCXNlcSB8PSAoU0NCX1NFUU5VTShzY2IsIHAtPnByaW9yaXR5KSA8PCBTRVFOVU1fU0hJRlQpOwogCQkJaC0+c2VxID0gaHRvbDE2KHNlcSk7CiAKIAkJCWZyYW1laWQgPSAoKHNlcSA8PCBUWEZJRF9TRVFfU0hJRlQpICYgVFhGSURfU0VRX01BU0spIHwKQEAgLTU5ODEsMTMgKzU3NjQsNiBAQAogCWlmICh0eHJhdGVbMV0tPmlkeCA8IDApIHsKIAkJdHhyYXRlWzFdID0gdHhyYXRlWzBdOwogCX0KLSNpZmRlZiBXTENfSElHSF9PTkxZCi0JLyogRG91YmxlIHByb3RlY3Rpb24gLCBqdXN0IGluIGNhc2UgKi8KLQlpZiAodHhyYXRlWzBdLT5pZHggPiBISUdIRVNUX1NJTkdMRV9TVFJFQU1fTUNTKQotCQl0eHJhdGVbMF0tPmlkeCA9IEhJR0hFU1RfU0lOR0xFX1NUUkVBTV9NQ1M7Ci0JaWYgKHR4cmF0ZVsxXS0+aWR4ID4gSElHSEVTVF9TSU5HTEVfU1RSRUFNX01DUykKLQkJdHhyYXRlWzFdLT5pZHggPSBISUdIRVNUX1NJTkdMRV9TVFJFQU1fTUNTOwotI2VuZGlmCiAKIAlmb3IgKGsgPSAwOyBrIDwgaHctPm1heF9yYXRlczsgaysrKSB7CiAJCWlzX21jc1trXSA9CkBAIC02MDM0LDcgKzU4MTAsOCBAQAogCQkJQVNTRVJUKFJTUEVDX0FDVElWRShyc3BlY1trXSkpOwogCQkJcnNwZWNba10gPSBXTENfUkFURV8xTTsKIAkJfSBlbHNlIHsKLQkJCWlmIChXTEFOVFNFTF9FTkFCKHdsYykgJiYgIUVUSEVSX0lTTVVMVEkoJmgtPmExKSkgeworCQkJaWYgKFdMQU5UU0VMX0VOQUIod2xjKSAmJgorCQkJICAgICFpc19tdWx0aWNhc3RfZXRoZXJfYWRkcihoLT5hMS5vY3RldCkpIHsKIAkJCQkvKiBzZXQgdHggYW50ZW5uYSBjb25maWcgKi8KIAkJCQl3bGNfYW50c2VsX2FudGNmZ19nZXQod2xjLT5hc2ksIGZhbHNlLCBmYWxzZSwgMCwKIAkJCQkJCSAgICAgIDAsICZhbnRjZmcsICZmYmFudGNmZyk7CkBAIC02MTMxLDcgKzU5MDgsOCBAQAogCiAJCQlpZiAoKHR4cmF0ZVtrXS0+ZmxhZ3MgJiBJRUVFODAyMTFfVFhfUkNfTUNTKQogCQkJICAgICYmICghSVNfTUNTKHJzcGVjW2tdKSkpIHsKLQkJCQlXTF9FUlJPUigoIndsJWQ6ICVzOiBJRUVFODAyMTFfVFhfUkNfTUNTICE9IElTX01DUyhyc3BlYylcbiIsIFdMQ1dMVU5JVCh3bGMpLCBfX2Z1bmNfXykpOworCQkJCVdMX0VSUk9SKCJ3bCVkOiAlczogSUVFRTgwMjExX1RYX1JDX01DUyAhPSBJU19NQ1MocnNwZWMpXG4iLAorCQkJCQkgV0xDV0xVTklUKHdsYyksIF9fZnVuY19fKTsKIAkJCQlBU1NFUlQoMCAmJiAiUmF0ZSBtaXNtYXRjaCIpOwogCQkJfQogCkBAIC02MTk1LDcgKzU5NzMsOCBAQAogCSAgICBwbGNwWzBdOwogCiAJLyogRFVSIGZpZWxkIGZvciBtYWluIHJhdGUgKi8KLQlpZiAoKGZjICE9IEZDX1BTX1BPTEwpICYmICFFVEhFUl9JU01VTFRJKCZoLT5hMSkgJiYgIXVzZV9yaWZzKSB7CisJaWYgKChmYyAhPSBGQ19QU19QT0xMKSAmJgorCSAgICAhaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIoaC0+YTEub2N0ZXQpICYmICF1c2VfcmlmcykgewogCQlkdXJpZCA9CiAJCSAgICB3bGNfY29tcHV0ZV9mcmFtZV9kdXIod2xjLCByc3BlY1swXSwgcHJlYW1ibGVfdHlwZVswXSwKIAkJCQkJICBuZXh0X2ZyYWdfbGVuKTsKQEAgLTYyMTMsNyArNTk5Miw3IEBACiAJLyogRFVSIGZpZWxkIGZvciBmYWxsYmFjayByYXRlICovCiAJaWYgKGZjID09IEZDX1BTX1BPTEwpCiAJCXR4aC0+RnJhZ0R1ckZhbGxiYWNrID0gaC0+ZHVyaWQ7Ci0JZWxzZSBpZiAoRVRIRVJfSVNNVUxUSSgmaC0+YTEpIHx8IHVzZV9yaWZzKQorCWVsc2UgaWYgKGlzX211bHRpY2FzdF9ldGhlcl9hZGRyKGgtPmExLm9jdGV0KSB8fCB1c2VfcmlmcykKIAkJdHhoLT5GcmFnRHVyRmFsbGJhY2sgPSAwOwogCWVsc2UgewogCQlkdXJpZCA9IHdsY19jb21wdXRlX2ZyYW1lX2R1cih3bGMsIHJzcGVjWzFdLApAQCAtNjIyNSw3ICs2MDA0LDcgQEAKIAlpZiAoZnJhZyA9PSAwKQogCQltY2wgfD0gVFhDX1NUQVJUTVNEVTsKIAotCWlmICghRVRIRVJfSVNNVUxUSSgmaC0+YTEpKQorCWlmICghaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIoaC0+YTEub2N0ZXQpKQogCQltY2wgfD0gVFhDX0lNTUVEQUNLOwogCiAJaWYgKEJBTkRfNUcod2xjLT5iYW5kLT5iYW5kdHlwZSkpCkBAIC02MjYwLDcgKzYwMzksNyBAQAogCXR4aC0+VHhGZXNUaW1lRmFsbGJhY2sgPSBodG9sMTYoMCk7CiAKIAkvKiBUeEZyYW1lUkEgKi8KLQliY29weSgoY2hhciAqKSZoLT5hMSwgKGNoYXIgKikmdHhoLT5UeEZyYW1lUkEsIEVUSEVSX0FERFJfTEVOKTsKKwliY29weSgoY2hhciAqKSZoLT5hMSwgKGNoYXIgKikmdHhoLT5UeEZyYW1lUkEsIEVUSF9BTEVOKTsKIAogCS8qIFR4RnJhbWVJRCAqLwogCXR4aC0+VHhGcmFtZUlEID0gaHRvbDE2KGZyYW1laWQpOwpAQCAtNjM0NywxMSArNjEyNiwxMSBAQAogCiAJCWlmICh1c2VfY3RzKSB7CiAJCQlydHMtPmZjID0gaHRvbDE2KEZDX0NUUyk7Ci0JCQliY29weSgoY2hhciAqKSZoLT5hMiwgKGNoYXIgKikmcnRzLT5yYSwgRVRIRVJfQUREUl9MRU4pOworCQkJYmNvcHkoKGNoYXIgKikmaC0+YTIsIChjaGFyICopJnJ0cy0+cmEsIEVUSF9BTEVOKTsKIAkJfSBlbHNlIHsKIAkJCXJ0cy0+ZmMgPSBodG9sMTYoKHUxNikgRkNfUlRTKTsKIAkJCWJjb3B5KChjaGFyICopJmgtPmExLCAoY2hhciAqKSZydHMtPnJhLAotCQkJICAgICAgMiAqIEVUSEVSX0FERFJfTEVOKTsKKwkJCSAgICAgIDIgKiBFVEhfQUxFTik7CiAJCX0KIAogCQkvKiBtYWlucmF0ZQpAQCAtNjM2Miw5ICs2MTQxLDEwIEBACiAJCQkgICAgICBEMTFBX1BIWV9IRFJfR1JBVEUoKG9mZG1fcGh5X2hkcl90ICopIHJ0c19wbGNwKSA6CiAJCQkgICAgICBydHNfcGxjcFswXSkgPDwgODsKIAl9IGVsc2UgewotCQliemVybygoY2hhciAqKXR4aC0+UlRTUGh5SGVhZGVyLCBEMTFfUEhZX0hEUl9MRU4pOwotCQliemVybygoY2hhciAqKSZ0eGgtPnJ0c19mcmFtZSwgc2l6ZW9mKHN0cnVjdCBkb3QxMV9ydHNfZnJhbWUpKTsKLQkJYnplcm8oKGNoYXIgKil0eGgtPlJUU1BMQ1BGYWxsYmFjaywKKwkJbWVtc2V0KChjaGFyICopdHhoLT5SVFNQaHlIZWFkZXIsIDAsIEQxMV9QSFlfSERSX0xFTik7CisJCW1lbXNldCgoY2hhciAqKSZ0eGgtPnJ0c19mcmFtZSwgMCwKKwkJCXNpemVvZihzdHJ1Y3QgZG90MTFfcnRzX2ZyYW1lKSk7CisJCW1lbXNldCgoY2hhciAqKXR4aC0+UlRTUExDUEZhbGxiYWNrLCAwLAogCQkgICAgICBzaXplb2YodHhoLT5SVFNQTENQRmFsbGJhY2spKTsKIAkJdHhoLT5SVFNEdXJGYWxsYmFjayA9IDA7CiAJfQpAQCAtNjQ1Myw3ICs2MjMzLDcgQEAKIAlpZiAoU0NCX1dNRShzY2IpICYmIHFvcyAmJiB3bGMtPmVkY2ZfdHhvcFthY10pIHsKIAkJdWludCBmcmFnX2R1ciwgZHVyLCBkdXJfZmFsbGJhY2s7CiAKLQkJQVNTRVJUKCFFVEhFUl9JU01VTFRJKCZoLT5hMSkpOworCQlBU1NFUlQoIWlzX211bHRpY2FzdF9ldGhlcl9hZGRyKGgtPmExLm9jdGV0KSk7CiAKIAkJLyogV01FOiBVcGRhdGUgVFhPUCB0aHJlc2hvbGQgKi8KIAkJaWYgKCghKHR4X2luZm8tPmZsYWdzICYgSUVFRTgwMjExX1RYX0NUTF9BTVBEVSkpICYmIChmcmFnID09IDApKSB7CkBAIC02NTIzLDE5ICs2MzAzLDIzIEBACiAJCQkJCX0KIAkJCQl9CiAJCQl9IGVsc2UKLQkJCQlXTF9FUlJPUigoIndsJWQ6ICVzIHR4b3AgaW52YWxpZCBmb3IgcmF0ZSAlZFxuIiwKLQkJCQkJICB3bGMtPnB1Yi0+dW5pdCwgZmlmb19uYW1lc1txdWV1ZV0sCi0JCQkJCSAgUlNQRUMyUkFURShyc3BlY1swXSkpKTsKKwkJCQlXTF9FUlJPUigid2wlZDogJXMgdHhvcCBpbnZhbGlkIGZvciByYXRlICVkXG4iLAorCQkJCQkgd2xjLT5wdWItPnVuaXQsIGZpZm9fbmFtZXNbcXVldWVdLAorCQkJCQkgUlNQRUMyUkFURShyc3BlY1swXSkpOwogCiAJCQlpZiAoZHVyID4gd2xjLT5lZGNmX3R4b3BbYWNdKQotCQkJCVdMX0VSUk9SKCgid2wlZDogJXM6ICVzIHR4b3AgZXhjZWVkZWQgcGh5bGVuICVkLyVkIGR1ciAlZC8lZFxuIiwgd2xjLT5wdWItPnVuaXQsIF9fZnVuY19fLCBmaWZvX25hbWVzW3F1ZXVlXSwgcGh5bGVuLCB3bGMtPmZyYWd0aHJlc2hbcXVldWVdLCBkdXIsIHdsYy0+ZWRjZl90eG9wW2FjXSkpOworCQkJCVdMX0VSUk9SKCJ3bCVkOiAlczogJXMgdHhvcCBleGNlZWRlZCBwaHlsZW4gJWQvJWQgZHVyICVkLyVkXG4iLAorCQkJCQkgd2xjLT5wdWItPnVuaXQsIF9fZnVuY19fLAorCQkJCQkgZmlmb19uYW1lc1txdWV1ZV0sCisJCQkJCSBwaHlsZW4sIHdsYy0+ZnJhZ3RocmVzaFtxdWV1ZV0sCisJCQkJCSBkdXIsIHdsYy0+ZWRjZl90eG9wW2FjXSk7CiAJCX0KIAl9CiAKIAlyZXR1cm4gMDsKIH0KIAotdm9pZCB3bGNfdGJ0dCh3bGNfaW5mb190ICp3bGMsIGQxMXJlZ3NfdCAqcmVncykKK3ZvaWQgd2xjX3RidHQoc3RydWN0IHdsY19pbmZvICp3bGMsIGQxMXJlZ3NfdCAqcmVncykKIHsKIAl3bGNfYnNzY2ZnX3QgKmNmZyA9IHdsYy0+Y2ZnOwogCkBAIC02NTcxLDE5ICs2MzU1LDE5IEBACiB9CiAKIC8qIEdQIHRpbWVyIGlzIGEgZnJlZXJ1bm5pbmcgMzIgYml0IGNvdW50ZXIsIGRlY3JlbWVudHMgYXQgMSB1cyByYXRlICovCi12b2lkIHdsY19od3RpbWVyX2dwdGltZXJfc2V0KHdsY19pbmZvX3QgKndsYywgdWludCB1cykKK3ZvaWQgd2xjX2h3dGltZXJfZ3B0aW1lcl9zZXQoc3RydWN0IHdsY19pbmZvICp3bGMsIHVpbnQgdXMpCiB7CiAJQVNTRVJUKHdsYy0+cHViLT5jb3JlcmV2ID49IDMpOwkvKiBubyBncHRpbWVyIGluIGVhcmxpZXIgcmV2cyAqLwogCVdfUkVHKHdsYy0+b3NoLCAmd2xjLT5yZWdzLT5ncHRpbWVyLCB1cyk7CiB9CiAKLXZvaWQgd2xjX2h3dGltZXJfZ3B0aW1lcl9hYm9ydCh3bGNfaW5mb190ICp3bGMpCit2b2lkIHdsY19od3RpbWVyX2dwdGltZXJfYWJvcnQoc3RydWN0IHdsY19pbmZvICp3bGMpCiB7CiAJQVNTRVJUKHdsYy0+cHViLT5jb3JlcmV2ID49IDMpOwogCVdfUkVHKHdsYy0+b3NoLCAmd2xjLT5yZWdzLT5ncHRpbWVyLCAwKTsKIH0KIAotc3RhdGljIHZvaWQgd2xjX2h3dGltZXJfZ3B0aW1lcl9jYih3bGNfaW5mb190ICp3bGMpCitzdGF0aWMgdm9pZCB3bGNfaHd0aW1lcl9ncHRpbWVyX2NiKHN0cnVjdCB3bGNfaW5mbyAqd2xjKQogewogCS8qIHdoZW4gaW50ZXJydXB0IGlzIGdlbmVyYXRlZCwgdGhlIGNvdW50ZXIgaXMgbG9hZGVkIHdpdGggbGFzdCB2YWx1ZQogCSAqIHdyaXR0ZW4gYW5kIGNvbnRpbnVlIHRvIGRlY3JlbWVudC4gU28gaXQgaGFzIHRvIGJlIGNsZWFuZWQgZmlyc3QKQEAgLTY1OTYsNyArNjM4MCw3IEBACiAgKiBQT0xJQ1k6IG5vIG1hY2luc3RhdHVzIGNoYW5nZSwgbm8gYm91bmRpbmcgbG9vcC4KICAqICAgICAgICAgQWxsIGRwYyBib3VuZGluZyBzaG91bGQgYmUgaGFuZGxlZCBpbiBCTUFDIGRwYywgbGlrZSB0eHN0YXR1cyBhbmQgcnhpbnQKICAqLwotdm9pZCB3bGNfaGlnaF9kcGMod2xjX2luZm9fdCAqd2xjLCB1MzIgbWFjaW50c3RhdHVzKQordm9pZCB3bGNfaGlnaF9kcGMoc3RydWN0IHdsY19pbmZvICp3bGMsIHUzMiBtYWNpbnRzdGF0dXMpCiB7CiAJZDExcmVnc190ICpyZWdzID0gd2xjLT5yZWdzOwogI2lmZGVmIEJDTURCRwpAQCAtNjYzNCw4ICs2NDE4LDggQEAKIAlpZiAobWFjaW50c3RhdHVzICYgfihNSV9UQlRUIHwgTUlfVFhTVE9QKSkgewogCQliY21fZm9ybWF0X2ZsYWdzKGludF9mbGFncywgbWFjaW50c3RhdHVzLCBmbGFnc3RyLAogCQkJCSBzaXplb2YoZmxhZ3N0cikpOwotCQlXTF9UUkFDRSgoIndsJWQ6IG1hY2ludHN0YXR1cyAweCV4ICVzXG4iLCB3bGMtPnB1Yi0+dW5pdCwKLQkJCSAgbWFjaW50c3RhdHVzLCBmbGFnc3RyKSk7CisJCVdMX1RSQUNFKCJ3bCVkOiBtYWNpbnRzdGF0dXMgMHgleCAlc1xuIiwKKwkJCSB3bGMtPnB1Yi0+dW5pdCwgbWFjaW50c3RhdHVzLCBmbGFnc3RyKTsKIAl9CiAjZW5kaWYJCQkJLyogQkNNREJHICovCiAKQEAgLTY2NTAsMTEgKzY0MzQsMTIgQEAKIAkJd2xjX3RidHQod2xjLCByZWdzKTsKIAogCWlmIChtYWNpbnRzdGF0dXMgJiBNSV9HUDApIHsKLQkJV0xfRVJST1IoKCJ3bCVkOiBQU00gbWljcm9jb2RlIHdhdGNoZG9nIGZpcmVkIGF0ICVkIChzZWNvbmRzKS4gUmVzZXR0aW5nLlxuIiwgd2xjLT5wdWItPnVuaXQsIHdsYy0+cHViLT5ub3cpKTsKKwkJV0xfRVJST1IoIndsJWQ6IFBTTSBtaWNyb2NvZGUgd2F0Y2hkb2cgZmlyZWQgYXQgJWQgKHNlY29uZHMpLiBSZXNldHRpbmcuXG4iLAorCQkJIHdsYy0+cHViLT51bml0LCB3bGMtPnB1Yi0+bm93KTsKIAogCQlwcmludGtfb25jZSgiJXMgOiBQU00gV2F0Y2hkb2csIGNoaXBpZCAweCV4LCBjaGlwcmV2IDB4JXhcbiIsCi0JCQkgICAgX19mdW5jX18sIENISVBJRCh3bGMtPnB1Yi0+c2loLT5jaGlwKSwKLQkJCSAgICBDSElQUkVWKHdsYy0+cHViLT5zaWgtPmNoaXByZXYpKTsKKwkJCQkJX19mdW5jX18sIHdsYy0+cHViLT5zaWgtPmNoaXAsCisJCQkJCXdsYy0+cHViLT5zaWgtPmNoaXByZXYpOwogCiAJCVdMQ05USU5DUih3bGMtPnB1Yi0+X2NudC0+cHNtd2RzKTsKIApAQCAtNjY2OCw3ICs2NDUzLDkgQEAKIAl9CiAKIAlpZiAobWFjaW50c3RhdHVzICYgTUlfUkZESVNBQkxFKSB7Ci0JCVdMX0VSUk9SKCgid2wlZDogTUFDIERldGVjdGVkIGEgY2hhbmdlIG9uIHRoZSBSRiBEaXNhYmxlIElucHV0IDB4JXhcbiIsIHdsYy0+cHViLT51bml0LCBSX1JFRyh3bGMtPm9zaCwgJnJlZ3MtPnBoeWRlYnVnKSAmIFBEQkdfUkZEKSk7CisJCVdMX0VSUk9SKCJ3bCVkOiBNQUMgRGV0ZWN0ZWQgYSBjaGFuZ2Ugb24gdGhlIFJGIERpc2FibGUgSW5wdXQgMHgleFxuIiwKKwkJCSB3bGMtPnB1Yi0+dW5pdCwKKwkJCSBSX1JFRyh3bGMtPm9zaCwgJnJlZ3MtPnBoeWRlYnVnKSAmIFBEQkdfUkZEKTsKIAkJLyogZGVsYXkgdGhlIGNsZWFudXAgdG8gd2xfZG93biBpbiBJQlNTIGNhc2UgKi8KIAkJaWYgKChSX1JFRyh3bGMtPm9zaCwgJnJlZ3MtPnBoeWRlYnVnKSAmIFBEQkdfUkZEKSkgewogCQkJaW50IGlkeDsKQEAgLTY2NzcsNyArNjQ2NCw4IEBACiAJCQkJaWYgKCFCU1NDRkdfU1RBKGJzc2NmZykgfHwgIWJzc2NmZy0+ZW5hYmxlCiAJCQkJICAgIHx8ICFic3NjZmctPkJTUykKIAkJCQkJY29udGludWU7Ci0JCQkJV0xfRVJST1IoKCJ3bCVkOiB3bGNfZHBjOiByZmRpc2FibGUgLT4gd2xjX2Jzc2NmZ19kaXNhYmxlKClcbiIsIHdsYy0+cHViLT51bml0KSk7CisJCQkJV0xfRVJST1IoIndsJWQ6IHdsY19kcGM6IHJmZGlzYWJsZSAtPiB3bGNfYnNzY2ZnX2Rpc2FibGUoKVxuIiwKKwkJCQkJIHdsYy0+cHViLT51bml0KTsKIAkJCX0KIAkJfQogCX0KQEAgLTY2ODYsMTQgKzY0NzQsMTIgQEAKIAlpZiAoIXBrdHFfZW1wdHkoJndsYy0+YWN0aXZlX3F1ZXVlLT5xKSkKIAkJd2xjX3NlbmRfcSh3bGMsIHdsYy0+YWN0aXZlX3F1ZXVlKTsKIAotI2lmbmRlZiBXTENfSElHSF9PTkxZCiAJQVNTRVJUKHdsY19wc19jaGVjayh3bGMpKTsKLSNlbmRpZgogfQogCi1zdGF0aWMgdm9pZCAqd2xjXzE1NDIwd2FyKHdsY19pbmZvX3QgKndsYywgdWludCBxdWV1ZSkKK3N0YXRpYyB2b2lkICp3bGNfMTU0MjB3YXIoc3RydWN0IHdsY19pbmZvICp3bGMsIHVpbnQgcXVldWUpCiB7Ci0JaG5kZG1hX3QgKmRpOworCXN0cnVjdCBobmRkbWFfcHViICpkaTsKIAl2b2lkICpwOwogCiAJQVNTRVJUKHF1ZXVlIDwgTkZJRk8pOwpAQCAtNjcxNSwxMyArNjUwMSwxNCBAQAogCWlmIChkbWFfdHhhY3RpdmUod2xjLT5ody0+ZGlbcXVldWVdKSA9PSAwKSB7CiAJCVdMQ05USU5DUih3bGMtPnB1Yi0+X2NudC0+dHhkbWF3YXIpOwogCQlpZiAoIWRtYV90eHJlc2V0KGRpKSkKLQkJCVdMX0VSUk9SKCgid2wlZDogJXM6IGRtYV90eHJlc2V0WyVkXTogY2Fubm90IHN0b3AgZG1hXG4iLCB3bGMtPnB1Yi0+dW5pdCwgX19mdW5jX18sIHF1ZXVlKSk7CisJCQlXTF9FUlJPUigid2wlZDogJXM6IGRtYV90eHJlc2V0WyVkXTogY2Fubm90IHN0b3AgZG1hXG4iLAorCQkJCSB3bGMtPnB1Yi0+dW5pdCwgX19mdW5jX18sIHF1ZXVlKTsKIAkJZG1hX3R4aW5pdChkaSk7CiAJfQogCXJldHVybiBwOwogfQogCi1zdGF0aWMgdm9pZCB3bGNfd2FyMTYxNjUod2xjX2luZm9fdCAqd2xjLCBib29sIHR4KQorc3RhdGljIHZvaWQgd2xjX3dhcjE2MTY1KHN0cnVjdCB3bGNfaW5mbyAqd2xjLCBib29sIHR4KQogewogCWlmICh0eCkgewogCQkvKiB0aGUgcG9zdC1pbmNyZW1lbnQgaXMgdXNlZCBpbiBTVEFZX0FXQUtFIG1hY3JvICovCkBAIC02NzM3LDE0ICs2NTI0LDE0IEBACiAvKiBwcm9jZXNzIGFuIGluZGl2aWR1YWwgdHhfc3RhdHVzX3QgKi8KIC8qIFdMQ19ISUdIX0FQSSAqLwogYm9vbCBCQ01GQVNUUEFUSAotd2xjX2RvdHhzdGF0dXMod2xjX2luZm9fdCAqd2xjLCB0eF9zdGF0dXNfdCAqdHhzLCB1MzIgZnJtX3R4MikKK3dsY19kb3R4c3RhdHVzKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCB0eF9zdGF0dXNfdCAqdHhzLCB1MzIgZnJtX3R4MikKIHsKLQl2b2lkICpwOworCXN0cnVjdCBza19idWZmICpwOwogCXVpbnQgcXVldWU7CiAJZDExdHhoX3QgKnR4aDsKIAlzdHJ1Y3Qgc2NiICpzY2IgPSBOVUxMOwogCWJvb2wgZnJlZV9wZHU7Ci0Jb3NsX3QgKm9zaDsKKwlzdHJ1Y3Qgb3NsX2luZm8gKm9zaDsKIAlpbnQgdHhfcnRzLCB0eF9mcmFtZV9jb3VudCwgdHhfcnRzX2NvdW50OwogCXVpbnQgdG90bGVuLCBzdXByX3N0YXR1czsKIAlib29sIGxhc3RmcmFtZTsKQEAgLTY3NjgsNyArNjU1NSw3IEBACiAJCQkgKCh0eHMtPgogCQkJICAgc3RhdHVzICYgVFhfU1RBVFVTX0ZSTV9SVFhfTUFTSykgPj4KIAkJCSAgVFhfU1RBVFVTX0ZSTV9SVFhfU0hJRlQpKTsKLQkJV0xfRVJST1IoKCIlczogSU5URVJNRURJQVRFIGJ1dCBub3QgQU1QRFVcbiIsIF9fZnVuY19fKSk7CisJCVdMX0VSUk9SKCIlczogSU5URVJNRURJQVRFIGJ1dCBub3QgQU1QRFVcbiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIGZhbHNlOwogCX0KIApAQCAtNjc4OSwxMiArNjU3NiwxMiBAQAogCWlmIChwID09IE5VTEwpCiAJCWdvdG8gZmF0YWw7CiAKLQl0eGggPSAoZDExdHhoX3QgKikgUEtUREFUQShwKTsKKwl0eGggPSAoZDExdHhoX3QgKikgKHAtPmRhdGEpOwogCW1jbCA9IGx0b2gxNih0eGgtPk1hY1R4Q29udHJvbExvdyk7CiAKIAlpZiAodHhzLT5waHllcnIpIHsKLQkJV0xfRVJST1IoKCJwaHllcnIgMHgleCwgcmF0ZSAweCV4XG4iLCB0eHMtPnBoeWVyciwKLQkJCSAgdHhoLT5NYWluUmF0ZXMpKTsKKwkJV0xfRVJST1IoInBoeWVyciAweCV4LCByYXRlIDB4JXhcbiIsCisJCQkgdHhzLT5waHllcnIsIHR4aC0+TWFpblJhdGVzKTsKIAkJd2xjX3ByaW50X3R4ZGVzYyh0eGgpOwogCQl3bGNfcHJpbnRfdHhzdGF0dXModHhzKTsKIAl9CkBAIC02ODI1LDggKzY2MTIsOCBAQAogCiAJc3Vwcl9zdGF0dXMgPSB0eHMtPnN0YXR1cyAmIFRYX1NUQVRVU19TVVBSX01BU0s7CiAJaWYgKHN1cHJfc3RhdHVzID09IFRYX1NUQVRVU19TVVBSX0JBRENIKQotCQlXTF9OT05FKCgiJXM6IFBrdCB0eCBzdXBwcmVzc2VkLCBwb3NzaWJseSBjaGFubmVsICVkXG4iLAotCQkJIF9fZnVuY19fLCBDSFNQRUNfQ0hBTk5FTCh3bGMtPmRlZmF1bHRfYnNzLT5jaGFuc3BlYykpKTsKKwkJV0xfTk9ORSgiJXM6IFBrdCB0eCBzdXBwcmVzc2VkLCBwb3NzaWJseSBjaGFubmVsICVkXG4iLAorCQkJX19mdW5jX18sIENIU1BFQ19DSEFOTkVMKHdsYy0+ZGVmYXVsdF9ic3MtPmNoYW5zcGVjKSk7CiAKIAl0eF9ydHMgPSBodG9sMTYodHhoLT5NYWNUeENvbnRyb2xMb3cpICYgVFhDX1NFTkRSVFM7CiAJdHhfZnJhbWVfY291bnQgPQpAQCAtNjgzNyw3ICs2NjI0LDcgQEAKIAlsYXN0ZnJhbWUgPSAoZmMgJiBGQ19NT1JFRlJBRykgPT0gMDsKIAogCWlmICghbGFzdGZyYW1lKSB7Ci0JCVdMX0VSUk9SKCgiTm90IGxhc3QgZnJhbWUhXG4iKSk7CisJCVdMX0VSUk9SKCJOb3QgbGFzdCBmcmFtZSFcbiIpOwogCX0gZWxzZSB7CiAJCXUxNiBzZmJsLCBsZmJsOwogCQlpZWVlODAyMTFfdHhfaW5mb19jbGVhcl9zdGF0dXModHhfaW5mbyk7CkBAIC02ODc5LDE3ICs2NjY2LDE3IEBACiAJd2xjX3R4Zmlmb19jb21wbGV0ZSh3bGMsIHF1ZXVlLCAxKTsKIAogCWlmIChsYXN0ZnJhbWUpIHsKLQkJUEtUU0VUTkVYVChwLCBOVUxMKTsKLQkJUEtUU0VUTElOSyhwLCBOVUxMKTsKKwkJcC0+bmV4dCA9IE5VTEw7CisJCXAtPnByZXYgPSBOVUxMOwogCQl3bGMtPnR4cmV0cmllZCA9IDA7CiAJCS8qIHJlbW92ZSBQTENQICYgQnJvYWRjb20gdHggZGVzY3JpcHRvciBoZWFkZXIgKi8KLQkJUEtUUFVMTChwLCBEMTFfUEhZX0hEUl9MRU4pOwotCQlQS1RQVUxMKHAsIEQxMV9UWEhfTEVOKTsKKwkJc2tiX3B1bGwocCwgRDExX1BIWV9IRFJfTEVOKTsKKwkJc2tiX3B1bGwocCwgRDExX1RYSF9MRU4pOwogCQlpZWVlODAyMTFfdHhfc3RhdHVzX2lycXNhZmUod2xjLT5wdWItPmllZWVfaHcsIHApOwogCQlXTENOVElOQ1Iod2xjLT5wdWItPl9jbnQtPmllZWVfdHhfc3RhdHVzKTsKIAl9IGVsc2UgewotCQlXTF9FUlJPUigoIiVzOiBOb3QgbGFzdCBmcmFtZSA9PiBub3QgY2FsbGluZyB0eF9zdGF0dXNcbiIsCi0JCQkgIF9fZnVuY19fKSk7CisJCVdMX0VSUk9SKCIlczogTm90IGxhc3QgZnJhbWUgPT4gbm90IGNhbGxpbmcgdHhfc3RhdHVzXG4iLAorCQkJIF9fZnVuY19fKTsKIAl9CiAKIAlyZXR1cm4gZmFsc2U7CkBAIC02ODk3LDI0ICs2Njg0LDE4IEBACiAgZmF0YWw6CiAJQVNTRVJUKDApOwogCWlmIChwKQotCQlQS1RGUkVFKG9zaCwgcCwgdHJ1ZSk7CisJCXBrdF9idWZfZnJlZV9za2Iob3NoLCBwLCB0cnVlKTsKIAotI2lmZGVmIFdMQ19ISUdIX09OTFkKLQkvKiBJZiB0aGlzIGlzIGEgc3BsaXQgZHJpdmVyLCBkbyB0aGUgYmlnLWhhbW1lciBoZXJlLgotCSAqIElmIHRoaXMgaXMgYSBtb25vbGl0aGljIGRyaXZlciwgd2xjX2JtYWMuYzp3bGNfZHBjKCkgd2lsbCBkbyB0aGUgYmlnLWhhbW1lci4KLQkgKi8KLQl3bF9pbml0KHdsYy0+d2wpOwotI2VuZGlmCiAJcmV0dXJuIHRydWU7CiAKIH0KIAogdm9pZCBCQ01GQVNUUEFUSAotd2xjX3R4Zmlmb19jb21wbGV0ZSh3bGNfaW5mb190ICp3bGMsIHVpbnQgZmlmbywgczggdHhwa3RwZW5kKQord2xjX3R4Zmlmb19jb21wbGV0ZShzdHJ1Y3Qgd2xjX2luZm8gKndsYywgdWludCBmaWZvLCBzOCB0eHBrdHBlbmQpCiB7CiAJVFhQS1RQRU5EREVDKHdsYywgZmlmbywgdHhwa3RwZW5kKTsKLQlXTF9UUkFDRSgoIndsY190eGZpZm9fY29tcGxldGUsIHBrdHBlbmQgZGVjICVkIHRvICVkXG4iLCB0eHBrdHBlbmQsCi0JCSAgVFhQS1RQRU5ER0VUKHdsYywgZmlmbykpKTsKKwlXTF9UUkFDRSgid2xjX3R4Zmlmb19jb21wbGV0ZSwgcGt0cGVuZCBkZWMgJWQgdG8gJWRcbiIsCisJCSB0eHBrdHBlbmQsIFRYUEtUUEVOREdFVCh3bGMsIGZpZm8pKTsKIAogCS8qIFRoZXJlIGlzIG1vcmUgcm9vbTsgbWFyayBwcmVjZWRlbmNlcyByZWxhdGVkIHRvIHRoaXMgRklGTyBzZW5kYWJsZSAqLwogCVdMQ19UWF9GSUZPX0VOQUIod2xjLCBmaWZvKTsKQEAgLTcwMTQsNyArNjc5NSw3IEBACiB9CiAKIC8qIFVwZGF0ZSBiZWFjb24gbGlzdGVuIGludGVydmFsIGluIHNoYXJlZCBtZW1vcnkgKi8KLXZvaWQgd2xjX2Jjbl9saV91cGQod2xjX2luZm9fdCAqd2xjKQordm9pZCB3bGNfYmNuX2xpX3VwZChzdHJ1Y3Qgd2xjX2luZm8gKndsYykKIHsKIAlpZiAoQVBfRU5BQih3bGMtPnB1YikpCiAJCXJldHVybjsKQEAgLTcwMjgsNyArNjgwOSw3IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1wcmVwX21hYzgwMjExX3N0YXR1cyh3bGNfaW5mb190ICp3bGMsIGQxMXJ4aGRyX3QgKnJ4aCwgdm9pZCAqcCwKK3ByZXBfbWFjODAyMTFfc3RhdHVzKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCBkMTFyeGhkcl90ICpyeGgsIHN0cnVjdCBza19idWZmICpwLAogCQkgICAgIHN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHVzICpyeF9zdGF0dXMpCiB7CiAJdTMyIHRzZl9sLCB0c2ZfaDsKQEAgLTcwNjEsNyArNjg0Miw3IEBACiAJLyogcXVhbCAqLwogCXJ4X3N0YXR1cy0+YW50ZW5uYSA9IChyeGgtPlBoeVJ4U3RhdHVzXzAgJiBQUlhTMF9SWEFOVF9VUFNVQkJBTkQpID8gMSA6IDA7CS8qIGFudCAqLwogCi0JcGxjcCA9IFBLVERBVEEocCk7CisJcGxjcCA9IHAtPmRhdGE7CiAKIAlyc3BlYyA9IHdsY19jb21wdXRlX3JzcGVjKHJ4aCwgcGxjcCk7CiAJaWYgKElTX01DUyhyc3BlYykpIHsKQEAgLTcxMDgsMTkgKzY4ODksMTkgQEAKIAkJCXJ4X3N0YXR1cy0+cmF0ZV9pZHggPSAxMTsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgotCQkJV0xfRVJST1IoKCIlczogVW5rbm93biByYXRlXG4iLCBfX2Z1bmNfXykpOworCQkJV0xfRVJST1IoIiVzOiBVbmtub3duIHJhdGVcbiIsIF9fZnVuY19fKTsKIAkJfQogCiAJCS8qIERldGVybWluZSBzaG9ydCBwcmVhbWJsZSBhbmQgcmF0ZV9pZHggKi8KIAkJcHJlYW1ibGUgPSAwOwogCQlpZiAoSVNfQ0NLKHJzcGVjKSkgewogCQkJaWYgKHJ4aC0+UGh5UnhTdGF0dXNfMCAmIFBSWFMwX1NIT1JUSCkKLQkJCQlXTF9FUlJPUigoIlNob3J0IENDS1xuIikpOworCQkJCVdMX0VSUk9SKCJTaG9ydCBDQ0tcbiIpOwogCQkJcnhfc3RhdHVzLT5mbGFnIHw9IFJYX0ZMQUdfU0hPUlRQUkU7CiAJCX0gZWxzZSBpZiAoSVNfT0ZETShyc3BlYykpIHsKIAkJCXJ4X3N0YXR1cy0+ZmxhZyB8PSBSWF9GTEFHX1NIT1JUUFJFOwogCQl9IGVsc2UgewotCQkJV0xfRVJST1IoKCIlczogVW5rbm93biBtb2R1bGF0aW9uXG4iLCBfX2Z1bmNfXykpOworCQkJV0xfRVJST1IoIiVzOiBVbmtub3duIG1vZHVsYXRpb25cbiIsIF9fZnVuY19fKTsKIAkJfQogCX0KIApAQCAtNzEyOSwxNiArNjkxMCwxNyBAQAogCiAJaWYgKHJ4aC0+UnhTdGF0dXMxICYgUlhTX0RFQ0VSUikgewogCQlyeF9zdGF0dXMtPmZsYWcgfD0gUlhfRkxBR19GQUlMRURfUExDUF9DUkM7Ci0JCVdMX0VSUk9SKCgiJXM6ICBSWF9GTEFHX0ZBSUxFRF9QTENQX0NSQ1xuIiwgX19mdW5jX18pKTsKKwkJV0xfRVJST1IoIiVzOiAgUlhfRkxBR19GQUlMRURfUExDUF9DUkNcbiIsIF9fZnVuY19fKTsKIAl9CiAJaWYgKHJ4aC0+UnhTdGF0dXMxICYgUlhTX0ZDU0VSUikgewogCQlyeF9zdGF0dXMtPmZsYWcgfD0gUlhfRkxBR19GQUlMRURfRkNTX0NSQzsKLQkJV0xfRVJST1IoKCIlczogIFJYX0ZMQUdfRkFJTEVEX0ZDU19DUkNcbiIsIF9fZnVuY19fKSk7CisJCVdMX0VSUk9SKCIlczogIFJYX0ZMQUdfRkFJTEVEX0ZDU19DUkNcbiIsIF9fZnVuY19fKTsKIAl9CiB9CiAKIHN0YXRpYyB2b2lkCi13bGNfcmVjdmN0bCh3bGNfaW5mb190ICp3bGMsIG9zbF90ICpvc2gsIGQxMXJ4aGRyX3QgKnJ4aCwgdm9pZCAqcCkKK3dsY19yZWN2Y3RsKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCBzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgZDExcnhoZHJfdCAqcnhoLAorCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqcCkKIHsKIAlpbnQgbGVuX21wZHU7CiAJc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0dXMgcnhfc3RhdHVzOwpAQCAtNzE1NSwxMiArNjkzNywxMiBAQAogCXByZXBfbWFjODAyMTFfc3RhdHVzKHdsYywgcnhoLCBwLCAmcnhfc3RhdHVzKTsKIAogCS8qIG1hYyBoZWFkZXIrYm9keSBsZW5ndGgsIGV4Y2x1ZGUgQ1JDIGFuZCBwbGNwIGhlYWRlciAqLwotCWxlbl9tcGR1ID0gUEtUTEVOKHApIC0gRDExX1BIWV9IRFJfTEVOIC0gRE9UMTFfRkNTX0xFTjsKLQlQS1RQVUxMKHAsIEQxMV9QSFlfSERSX0xFTik7Ci0JUEtUU0VUTEVOKHAsIGxlbl9tcGR1KTsKKwlsZW5fbXBkdSA9IHAtPmxlbiAtIEQxMV9QSFlfSERSX0xFTiAtIERPVDExX0ZDU19MRU47CisJc2tiX3B1bGwocCwgRDExX1BIWV9IRFJfTEVOKTsKKwlfX3NrYl90cmltKHAsIGxlbl9tcGR1KTsKIAotCUFTU0VSVCghUEtUTkVYVChwKSk7Ci0JQVNTRVJUKCFQS1RMSU5LKHApKTsKKwlBU1NFUlQoIShwLT5uZXh0KSk7CisJQVNTRVJUKCEocC0+cHJldikpOwogCiAJQVNTRVJUKElTX0FMSUdORUQoKHVuc2lnbmVkIGxvbmcpc2tiLT5kYXRhLCAyKSk7CiAKQEAgLTcxNjgsMTcgKzY5NTAsMTcgQEAKIAlpZWVlODAyMTFfcnhfaXJxc2FmZSh3bGMtPnB1Yi0+aWVlZV9odywgcCk7CiAKIAlXTENOVElOQ1Iod2xjLT5wdWItPl9jbnQtPmllZWVfcngpOwotCVBLVFVOQUxMT0Mob3NoKTsKKwlvc2gtPnBrdGFsbG9jZWQtLTsKIAlyZXR1cm47CiB9CiAKLXZvaWQgd2xjX2Jzc19saXN0X2ZyZWUod2xjX2luZm9fdCAqd2xjLCB3bGNfYnNzX2xpc3RfdCAqYnNzX2xpc3QpCit2b2lkIHdsY19ic3NfbGlzdF9mcmVlKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCB3bGNfYnNzX2xpc3RfdCAqYnNzX2xpc3QpCiB7CiAJdWludCBpbmRleDsKIAl3bGNfYnNzX2luZm9fdCAqYmk7CiAKIAlpZiAoIWJzc19saXN0KSB7Ci0JCVdMX0VSUk9SKCgiJXM6IEF0dGVtcHRpbmcgdG8gZnJlZSBOVUxMIGxpc3RcbiIsIF9fZnVuY19fKSk7CisJCVdMX0VSUk9SKCIlczogQXR0ZW1wdGluZyB0byBmcmVlIE5VTEwgbGlzdFxuIiwgX19mdW5jX18pOwogCQlyZXR1cm47CiAJfQogCS8qIGluc3BlY3QgYWxsIEJTUyBkZXNjcmlwdG9yICovCkBAIC03MjAxLDQ4ICs2OTgzLDQ4IEBACiAgKiBQYXJhbSAnYm91bmQnIGluZGljYXRlcyBtYXguICMgZnJhbWVzIHRvIHByb2Nlc3MgYmVmb3JlIGJyZWFrIG91dC4KICAqLwogLyogV0xDX0hJR0hfQVBJICovCi12b2lkIEJDTUZBU1RQQVRIIHdsY19yZWN2KHdsY19pbmZvX3QgKndsYywgdm9pZCAqcCkKK3ZvaWQgQkNNRkFTVFBBVEggd2xjX3JlY3Yoc3RydWN0IHdsY19pbmZvICp3bGMsIHN0cnVjdCBza19idWZmICpwKQogewogCWQxMXJ4aGRyX3QgKnJ4aDsKIAlzdHJ1Y3QgZG90MTFfaGVhZGVyICpoOwotCW9zbF90ICpvc2g7CisJc3RydWN0IG9zbF9pbmZvICpvc2g7CiAJdTE2IGZjOwogCXVpbnQgbGVuOwogCWJvb2wgaXNfYW1zZHU7CiAKLQlXTF9UUkFDRSgoIndsJWQ6IHdsY19yZWN2XG4iLCB3bGMtPnB1Yi0+dW5pdCkpOworCVdMX1RSQUNFKCJ3bCVkOiB3bGNfcmVjdlxuIiwgd2xjLT5wdWItPnVuaXQpOwogCiAJb3NoID0gd2xjLT5vc2g7CiAKIAkvKiBmcmFtZSBzdGFydHMgd2l0aCByeGhkciAqLwotCXJ4aCA9IChkMTFyeGhkcl90ICopIFBLVERBVEEocCk7CisJcnhoID0gKGQxMXJ4aGRyX3QgKikgKHAtPmRhdGEpOwogCiAJLyogc3RyaXAgb2ZmIHJ4aGRyICovCi0JUEtUUFVMTChwLCB3bGMtPmh3cnhvZmYpOworCXNrYl9wdWxsKHAsIHdsYy0+aHdyeG9mZik7CiAKIAkvKiBmaXh1cCByeCBoZWFkZXIgZW5kaWFubmVzcyAqLwogCWx0b2gxNl9idWYoKHZvaWQgKilyeGgsIHNpemVvZihkMTFyeGhkcl90KSk7CiAKIAkvKiBNQUMgaW5zZXJ0cyAyIHBhZCBieXRlcyBmb3IgYTQgaGVhZGVycyBvciBRb1Mgb3IgQS1NU0RVIHN1YmZyYW1lcyAqLwogCWlmIChyeGgtPlJ4U3RhdHVzMSAmIFJYU19QQlBSRVMpIHsKLQkJaWYgKFBLVExFTihwKSA8IDIpIHsKKwkJaWYgKHAtPmxlbiA8IDIpIHsKIAkJCVdMQ05USU5DUih3bGMtPnB1Yi0+X2NudC0+cnhydW50KTsKLQkJCVdMX0VSUk9SKCgid2wlZDogd2xjX3JlY3Y6IHJjdmQgcnVudCBvZiBsZW4gJWRcbiIsCi0JCQkJICB3bGMtPnB1Yi0+dW5pdCwgUEtUTEVOKHApKSk7CisJCQlXTF9FUlJPUigid2wlZDogd2xjX3JlY3Y6IHJjdmQgcnVudCBvZiBsZW4gJWRcbiIsCisJCQkJIHdsYy0+cHViLT51bml0LCBwLT5sZW4pOwogCQkJZ290byB0b3NzOwogCQl9Ci0JCVBLVFBVTEwocCwgMik7CisJCXNrYl9wdWxsKHAsIDIpOwogCX0KIAotCWggPSAoc3RydWN0IGRvdDExX2hlYWRlciAqKShQS1REQVRBKHApICsgRDExX1BIWV9IRFJfTEVOKTsKLQlsZW4gPSBQS1RMRU4ocCk7CisJaCA9IChzdHJ1Y3QgZG90MTFfaGVhZGVyICopKHAtPmRhdGEgKyBEMTFfUEhZX0hEUl9MRU4pOworCWxlbiA9IHAtPmxlbjsKIAogCWlmIChyeGgtPlJ4U3RhdHVzMSAmIFJYU19GQ1NFUlIpIHsKIAkJaWYgKHdsYy0+cHViLT5tYWM4MDIxMV9zdGF0ZSAmIE1BQzgwMjExX1BST01JU0NfQkNOUykgewotCQkJV0xfRVJST1IoKCJGQ1NFUlIgd2hpbGUgc2Nhbm5pbmcqKioqKioqIC0gdG9zc2luZ1xuIikpOworCQkJV0xfRVJST1IoIkZDU0VSUiB3aGlsZSBzY2FubmluZyoqKioqKiogLSB0b3NzaW5nXG4iKTsKIAkJCWdvdG8gdG9zczsKIAkJfSBlbHNlIHsKLQkJCVdMX0VSUk9SKCgiUkNTRVJSISEhXG4iKSk7CisJCQlXTF9FUlJPUigiUkNTRVJSISEhXG4iKTsKIAkJCWdvdG8gdG9zczsKIAkJfQogCX0KQEAgLTcyNjEsMTAgKzcwNDMsMTAgQEAKIAlpZiAoIWlzX2Ftc2R1KSB7CiAJCS8qIENUUyBhbmQgQUNLIENUTCBmcmFtZXMgYXJlIHcvbyBhMiAqLwogCQlpZiAoRkNfVFlQRShmYykgPT0gRkNfVFlQRV9EQVRBIHx8IEZDX1RZUEUoZmMpID09IEZDX1RZUEVfTU5HKSB7Ci0JCQlpZiAoKEVUSEVSX0lTTlVMTEFERFIoJmgtPmEyKSB8fCBFVEhFUl9JU01VTFRJKCZoLT5hMikpKSB7Ci0JCQkJV0xfRVJST1IoKCJ3bCVkOiAlczogZHJvcHBpbmcgYSBmcmFtZSB3aXRoICIKLQkJCQkJImludmFsaWQgc3JjIG1hYyBhZGRyZXNzLCBhMjogJXBNXG4iLAotCQkJCQl3bGMtPnB1Yi0+dW5pdCwgX19mdW5jX18sICZoLT5hMikpOworCQkJaWYgKChpc196ZXJvX2V0aGVyX2FkZHIoaC0+YTIub2N0ZXQpIHx8CisJCQkgICAgIGlzX211bHRpY2FzdF9ldGhlcl9hZGRyKGgtPmEyLm9jdGV0KSkpIHsKKwkJCQlXTF9FUlJPUigid2wlZDogJXM6IGRyb3BwaW5nIGEgZnJhbWUgd2l0aCBpbnZhbGlkIHNyYyBtYWMgYWRkcmVzcywgYTI6ICVwTVxuIiwKKwkJCQkJIHdsYy0+cHViLT51bml0LCBfX2Z1bmNfXywgJmgtPmEyKTsKIAkJCQlXTENOVElOQ1Iod2xjLT5wdWItPl9jbnQtPnJ4YmFkc3JjbWFjKTsKIAkJCQlnb3RvIHRvc3M7CiAJCQl9CkBAIC03Mjc5LDcgKzcwNjEsNyBAQAogCX0KIAogCWlmIChpc19hbXNkdSkgewotCQlXTF9FUlJPUigoIiVzOiBpc19hbXNkdSBjYXVzaW5nIHRvc3NcbiIsIF9fZnVuY19fKSk7CisJCVdMX0VSUk9SKCIlczogaXNfYW1zZHUgY2F1c2luZyB0b3NzXG4iLCBfX2Z1bmNfXyk7CiAJCWdvdG8gdG9zczsKIAl9CiAKQEAgLTcyODcsNyArNzA2OSw3IEBACiAJcmV0dXJuOwogCiAgdG9zczoKLQlQS1RGUkVFKG9zaCwgcCwgZmFsc2UpOworCXBrdF9idWZfZnJlZV9za2Iob3NoLCBwLCBmYWxzZSk7CiB9CiAKIC8qIGNhbGN1bGF0ZSBmcmFtZSBkdXJhdGlvbiBmb3IgTWl4ZWQtbW9kZSBMLVNJRyBzcG9vZmluZywgcmV0dXJuCkBAIC03Mjk3LDEyICs3MDc5LDEyIEBACiAgKiAgIGxlbiA9IDMobnN5bXMgKyBuc3RyZWFtICsgMykgLSAzCiAgKi8KIHUxNiBCQ01GQVNUUEFUSAotd2xjX2NhbGNfbHNpZ19sZW4od2xjX2luZm9fdCAqd2xjLCByYXRlc3BlY190IHJhdGVzcGVjLCB1aW50IG1hY19sZW4pCit3bGNfY2FsY19sc2lnX2xlbihzdHJ1Y3Qgd2xjX2luZm8gKndsYywgcmF0ZXNwZWNfdCByYXRlc3BlYywgdWludCBtYWNfbGVuKQogewogCXVpbnQgbnN5bXMsIGxlbiA9IDAsIGtOZHBzOwogCi0JV0xfVFJBQ0UoKCJ3bCVkOiB3bGNfY2FsY19sc2lnX2xlbjogcmF0ZSAlZCwgbGVuJWRcbiIsIHdsYy0+cHViLT51bml0LAotCQkgIFJTUEVDMlJBVEUocmF0ZXNwZWMpLCBtYWNfbGVuKSk7CisJV0xfVFJBQ0UoIndsJWQ6IHdsY19jYWxjX2xzaWdfbGVuOiByYXRlICVkLCBsZW4lZFxuIiwKKwkJIHdsYy0+cHViLT51bml0LCBSU1BFQzJSQVRFKHJhdGVzcGVjKSwgbWFjX2xlbik7CiAKIAlpZiAoSVNfTUNTKHJhdGVzcGVjKSkgewogCQl1aW50IG1jcyA9IHJhdGVzcGVjICYgUlNQRUNfUkFURV9NQVNLOwpAQCAtNzMzOCw3ICs3MTIwLDcgQEAKIAogLyogY2FsY3VsYXRlIGZyYW1lIGR1cmF0aW9uIG9mIGEgZ2l2ZW4gcmF0ZSBhbmQgbGVuZ3RoLCByZXR1cm4gdGltZSBpbiB1c2VjIHVuaXQgKi8KIHVpbnQgQkNNRkFTVFBBVEgKLXdsY19jYWxjX2ZyYW1lX3RpbWUod2xjX2luZm9fdCAqd2xjLCByYXRlc3BlY190IHJhdGVzcGVjLCB1OCBwcmVhbWJsZV90eXBlLAord2xjX2NhbGNfZnJhbWVfdGltZShzdHJ1Y3Qgd2xjX2luZm8gKndsYywgcmF0ZXNwZWNfdCByYXRlc3BlYywgdTggcHJlYW1ibGVfdHlwZSwKIAkJICAgIHVpbnQgbWFjX2xlbikKIHsKIAl1aW50IG5zeW1zLCBkdXIgPSAwLCBOZHBzLCBrTmRwczsKQEAgLTczNDYsMTEgKzcxMjgsMTIgQEAKIAogCWlmIChyYXRlID09IDApIHsKIAkJQVNTRVJUKDApOwotCQlXTF9FUlJPUigoIndsJWQ6IFdBUjogdXNpbmcgcmF0ZSBvZiAxIG1icHNcbiIsIHdsYy0+cHViLT51bml0KSk7CisJCVdMX0VSUk9SKCJ3bCVkOiBXQVI6IHVzaW5nIHJhdGUgb2YgMSBtYnBzXG4iLCB3bGMtPnB1Yi0+dW5pdCk7CiAJCXJhdGUgPSBXTENfUkFURV8xTTsKIAl9CiAKLQlXTF9UUkFDRSgoIndsJWQ6IHdsY19jYWxjX2ZyYW1lX3RpbWU6IHJzcGVjIDB4JXgsIHByZWFtYmxlX3R5cGUgJWQsIGxlbiVkXG4iLCB3bGMtPnB1Yi0+dW5pdCwgcmF0ZXNwZWMsIHByZWFtYmxlX3R5cGUsIG1hY19sZW4pKTsKKwlXTF9UUkFDRSgid2wlZDogd2xjX2NhbGNfZnJhbWVfdGltZTogcnNwZWMgMHgleCwgcHJlYW1ibGVfdHlwZSAlZCwgbGVuJWRcbiIsCisJCSB3bGMtPnB1Yi0+dW5pdCwgcmF0ZXNwZWMsIHByZWFtYmxlX3R5cGUsIG1hY19sZW4pOwogCiAJaWYgKElTX01DUyhyYXRlc3BlYykpIHsKIAkJdWludCBtY3MgPSByYXRlc3BlYyAmIFJTUEVDX1JBVEVfTUFTSzsKQEAgLTc0MDgsMTMgKzcxOTEsMTQgQEAKIAogLyogVGhlIG9wcG9zaXRlIG9mIHdsY19jYWxjX2ZyYW1lX3RpbWUgKi8KIHN0YXRpYyB1aW50Ci13bGNfY2FsY19mcmFtZV9sZW4od2xjX2luZm9fdCAqd2xjLCByYXRlc3BlY190IHJhdGVzcGVjLCB1OCBwcmVhbWJsZV90eXBlLAord2xjX2NhbGNfZnJhbWVfbGVuKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCByYXRlc3BlY190IHJhdGVzcGVjLCB1OCBwcmVhbWJsZV90eXBlLAogCQkgICB1aW50IGR1cikKIHsKIAl1aW50IG5zeW1zLCBtYWNfbGVuLCBOZHBzLCBrTmRwczsKIAl1aW50IHJhdGUgPSBSU1BFQzJSQVRFKHJhdGVzcGVjKTsKIAotCVdMX1RSQUNFKCgid2wlZDogd2xjX2NhbGNfZnJhbWVfbGVuOiByc3BlYyAweCV4LCBwcmVhbWJsZV90eXBlICVkLCBkdXIgJWRcbiIsIHdsYy0+cHViLT51bml0LCByYXRlc3BlYywgcHJlYW1ibGVfdHlwZSwgZHVyKSk7CisJV0xfVFJBQ0UoIndsJWQ6IHdsY19jYWxjX2ZyYW1lX2xlbjogcnNwZWMgMHgleCwgcHJlYW1ibGVfdHlwZSAlZCwgZHVyICVkXG4iLAorCQkgd2xjLT5wdWItPnVuaXQsIHJhdGVzcGVjLCBwcmVhbWJsZV90eXBlLCBkdXIpOwogCiAJaWYgKElTX01DUyhyYXRlc3BlYykpIHsKIAkJdWludCBtY3MgPSByYXRlc3BlYyAmIFJTUEVDX1JBVEVfTUFTSzsKQEAgLTc0NTQsMTAgKzcyMzgsMTAgQEAKIH0KIAogc3RhdGljIHVpbnQKLXdsY19jYWxjX2JhX3RpbWUod2xjX2luZm9fdCAqd2xjLCByYXRlc3BlY190IHJzcGVjLCB1OCBwcmVhbWJsZV90eXBlKQord2xjX2NhbGNfYmFfdGltZShzdHJ1Y3Qgd2xjX2luZm8gKndsYywgcmF0ZXNwZWNfdCByc3BlYywgdTggcHJlYW1ibGVfdHlwZSkKIHsKLQlXTF9UUkFDRSgoIndsJWQ6IHdsY19jYWxjX2JhX3RpbWU6IHJzcGVjIDB4JXgsIHByZWFtYmxlX3R5cGUgJWRcbiIsCi0JCSAgd2xjLT5wdWItPnVuaXQsIHJzcGVjLCBwcmVhbWJsZV90eXBlKSk7CisJV0xfVFJBQ0UoIndsJWQ6IHdsY19jYWxjX2JhX3RpbWU6IHJzcGVjIDB4JXgsIHByZWFtYmxlX3R5cGUgJWRcbiIsCisJCSB3bGMtPnB1Yi0+dW5pdCwgcnNwZWMsIHByZWFtYmxlX3R5cGUpOwogCS8qIFNwZWMgOS42OiBhY2sgcmF0ZSBpcyB0aGUgaGlnaGVzdCByYXRlIGluIEJTU0Jhc2ljUmF0ZVNldCB0aGF0IGlzIGxlc3MgdGhhbgogCSAqIG9yIGVxdWFsIHRvIHRoZSByYXRlIG9mIHRoZSBpbW1lZGlhdGVseSBwcmV2aW91cyBmcmFtZSBpbiB0aGUgRkVTCiAJICovCkBAIC03NDcxLDEyICs3MjU1LDEyIEBACiB9CiAKIHN0YXRpYyB1aW50IEJDTUZBU1RQQVRICi13bGNfY2FsY19hY2tfdGltZSh3bGNfaW5mb190ICp3bGMsIHJhdGVzcGVjX3QgcnNwZWMsIHU4IHByZWFtYmxlX3R5cGUpCit3bGNfY2FsY19hY2tfdGltZShzdHJ1Y3Qgd2xjX2luZm8gKndsYywgcmF0ZXNwZWNfdCByc3BlYywgdTggcHJlYW1ibGVfdHlwZSkKIHsKIAl1aW50IGR1ciA9IDA7CiAKLQlXTF9UUkFDRSgoIndsJWQ6IHdsY19jYWxjX2Fja190aW1lOiByc3BlYyAweCV4LCBwcmVhbWJsZV90eXBlICVkXG4iLAotCQkgIHdsYy0+cHViLT51bml0LCByc3BlYywgcHJlYW1ibGVfdHlwZSkpOworCVdMX1RSQUNFKCJ3bCVkOiB3bGNfY2FsY19hY2tfdGltZTogcnNwZWMgMHgleCwgcHJlYW1ibGVfdHlwZSAlZFxuIiwKKwkJIHdsYy0+cHViLT51bml0LCByc3BlYywgcHJlYW1ibGVfdHlwZSk7CiAJLyogU3BlYyA5LjY6IGFjayByYXRlIGlzIHRoZSBoaWdoZXN0IHJhdGUgaW4gQlNTQmFzaWNSYXRlU2V0IHRoYXQgaXMgbGVzcyB0aGFuCiAJICogb3IgZXF1YWwgdG8gdGhlIHJhdGUgb2YgdGhlIGltbWVkaWF0ZWx5IHByZXZpb3VzIGZyYW1lIGluIHRoZSBGRVMKIAkgKi8KQEAgLTc0OTEsMTUgKzcyNzUsMTUgQEAKIH0KIAogc3RhdGljIHVpbnQKLXdsY19jYWxjX2N0c190aW1lKHdsY19pbmZvX3QgKndsYywgcmF0ZXNwZWNfdCByc3BlYywgdTggcHJlYW1ibGVfdHlwZSkKK3dsY19jYWxjX2N0c190aW1lKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCByYXRlc3BlY190IHJzcGVjLCB1OCBwcmVhbWJsZV90eXBlKQogewotCVdMX1RSQUNFKCgid2wlZDogd2xjX2NhbGNfY3RzX3RpbWU6IHJhdGVzcGVjIDB4JXgsIHByZWFtYmxlX3R5cGUgJWRcbiIsCi0JCSAgd2xjLT5wdWItPnVuaXQsIHJzcGVjLCBwcmVhbWJsZV90eXBlKSk7CisJV0xfVFJBQ0UoIndsJWQ6IHdsY19jYWxjX2N0c190aW1lOiByYXRlc3BlYyAweCV4LCBwcmVhbWJsZV90eXBlICVkXG4iLAorCQkgd2xjLT5wdWItPnVuaXQsIHJzcGVjLCBwcmVhbWJsZV90eXBlKTsKIAlyZXR1cm4gd2xjX2NhbGNfYWNrX3RpbWUod2xjLCByc3BlYywgcHJlYW1ibGVfdHlwZSk7CiB9CiAKIC8qIGRlcml2ZSB3bGMtPmJhbmQtPmJhc2ljX3JhdGVbXSB0YWJsZSBmcm9tICdyYXRlc2V0JyAqLwotdm9pZCB3bGNfcmF0ZV9sb29rdXBfaW5pdCh3bGNfaW5mb190ICp3bGMsIHdsY19yYXRlc2V0X3QgKnJhdGVzZXQpCit2b2lkIHdsY19yYXRlX2xvb2t1cF9pbml0KHN0cnVjdCB3bGNfaW5mbyAqd2xjLCB3bGNfcmF0ZXNldF90ICpyYXRlc2V0KQogewogCXU4IHJhdGU7CiAJdTggbWFuZGF0b3J5OwpAQCAtNzUwOSw3ICs3MjkzLDcgQEAKIAl1aW50IGk7CiAKIAkvKiBpbmNvbWluZyByYXRlcyBhcmUgaW4gNTAwa2JwcyB1bml0cyBhcyBpbiA4MDIuMTEgU3VwcG9ydGVkIFJhdGVzICovCi0JYnplcm8oYnIsIFdMQ19NQVhSQVRFICsgMSk7CisJbWVtc2V0KGJyLCAwLCBXTENfTUFYUkFURSArIDEpOwogCiAJLyogRm9yIGVhY2ggYmFzaWMgcmF0ZSBpbiB0aGUgcmF0ZXMgbGlzdCwgbWFrZSBhbiBlbnRyeSBpbiB0aGUKIAkgKiBiZXN0IGJhc2ljIGxvb2t1cC4KQEAgLTc1MjMsNyArNzMwNyw4IEBACiAJCXJhdGUgPSAocmF0ZXNldC0+cmF0ZXNbaV0gJiBSQVRFX01BU0spOwogCiAJCWlmIChyYXRlID4gV0xDX01BWFJBVEUpIHsKLQkJCVdMX0VSUk9SKCgid2xjX3JhdGVfbG9va3VwX2luaXQ6IGludmFsaWQgcmF0ZSAweCVYIGluIHJhdGUgc2V0XG4iLCByYXRlc2V0LT5yYXRlc1tpXSkpOworCQkJV0xfRVJST1IoIndsY19yYXRlX2xvb2t1cF9pbml0OiBpbnZhbGlkIHJhdGUgMHglWCBpbiByYXRlIHNldFxuIiwKKwkJCQkgcmF0ZXNldC0+cmF0ZXNbaV0pOwogCQkJY29udGludWU7CiAJCX0KIApAQCAtNzU4OCw3ICs3MzczLDcgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIHdsY193cml0ZV9yYXRlX3NobSh3bGNfaW5mb190ICp3bGMsIHU4IHJhdGUsIHU4IGJhc2ljX3JhdGUpCitzdGF0aWMgdm9pZCB3bGNfd3JpdGVfcmF0ZV9zaG0oc3RydWN0IHdsY19pbmZvICp3bGMsIHU4IHJhdGUsIHU4IGJhc2ljX3JhdGUpCiB7CiAJdTggcGh5X3JhdGUsIGluZGV4OwogCXU4IGJhc2ljX3BoeV9yYXRlLCBiYXNpY19pbmRleDsKQEAgLTc2MjEsNyArNzQwNiw3IEBACiAJd2xjX3dyaXRlX3NobSh3bGMsIChiYXNpY190YWJsZSArIGluZGV4ICogMiksIGJhc2ljX3B0cik7CiB9CiAKLXN0YXRpYyBjb25zdCB3bGNfcmF0ZXNldF90ICp3bGNfcmF0ZXNldF9nZXRfaHdycyh3bGNfaW5mb190ICp3bGMpCitzdGF0aWMgY29uc3Qgd2xjX3JhdGVzZXRfdCAqd2xjX3JhdGVzZXRfZ2V0X2h3cnMoc3RydWN0IHdsY19pbmZvICp3bGMpCiB7CiAJY29uc3Qgd2xjX3JhdGVzZXRfdCAqcnNfZGZsdDsKIApAQCAtNzYzOCw3ICs3NDIzLDcgQEAKIAlyZXR1cm4gcnNfZGZsdDsKIH0KIAotdm9pZCB3bGNfc2V0X3JhdGV0YWJsZSh3bGNfaW5mb190ICp3bGMpCit2b2lkIHdsY19zZXRfcmF0ZXRhYmxlKHN0cnVjdCB3bGNfaW5mbyAqd2xjKQogewogCWNvbnN0IHdsY19yYXRlc2V0X3QgKnJzX2RmbHQ7CiAJd2xjX3JhdGVzZXRfdCByczsKQEAgLTc2NzQsNyArNzQ1OSw4IEBACiAgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIHJhdGUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBzcGVjaWZpZWQgYmFuZC4KICAqIFdMQ19CQU5EX0FVVE8gaW5kaWNhdGVzIHRoZSBjdXJyZW50IGJhbmQuCiAgKi8KLWJvb2wgd2xjX3ZhbGlkX3JhdGUod2xjX2luZm9fdCAqd2xjLCByYXRlc3BlY190IHJzcGVjLCBpbnQgYmFuZCwgYm9vbCB2ZXJib3NlKQorYm9vbCB3bGNfdmFsaWRfcmF0ZShzdHJ1Y3Qgd2xjX2luZm8gKndsYywgcmF0ZXNwZWNfdCByc3BlYywgaW50IGJhbmQsCisJCSAgICBib29sIHZlcmJvc2UpCiB7CiAJd2xjX3JhdGVzZXRfdCAqaHdfcmF0ZXNldDsKIAl1aW50IGk7CkBAIC03NzAxLDE2ICs3NDg3LDE3IEBACiAJCQlyZXR1cm4gdHJ1ZTsKICBlcnJvcjoKIAlpZiAodmVyYm9zZSkgewotCQlXTF9FUlJPUigoIndsJWQ6IHdsY192YWxpZF9yYXRlOiByYXRlIHNwZWMgMHgleCBub3QgaW4gaHdfcmF0ZXNldFxuIiwgd2xjLT5wdWItPnVuaXQsIHJzcGVjKSk7CisJCVdMX0VSUk9SKCJ3bCVkOiB3bGNfdmFsaWRfcmF0ZTogcmF0ZSBzcGVjIDB4JXggbm90IGluIGh3X3JhdGVzZXRcbiIsCisJCQkgd2xjLT5wdWItPnVuaXQsIHJzcGVjKTsKIAl9CiAKIAlyZXR1cm4gZmFsc2U7CiB9CiAKLXN0YXRpYyB2b2lkIHdsY191cGRhdGVfbWltb19iYW5kX2J3Y2FwKHdsY19pbmZvX3QgKndsYywgdTggYndjYXApCitzdGF0aWMgdm9pZCB3bGNfdXBkYXRlX21pbW9fYmFuZF9id2NhcChzdHJ1Y3Qgd2xjX2luZm8gKndsYywgdTggYndjYXApCiB7CiAJdWludCBpOwotCXdsY2JhbmRfdCAqYmFuZDsKKwlzdHJ1Y3Qgd2xjYmFuZCAqYmFuZDsKIAogCWZvciAoaSA9IDA7IGkgPCBOQkFORFMod2xjKTsgaSsrKSB7CiAJCWlmIChJU19TSU5HTEVCQU5EXzVHKHdsYy0+ZGV2aWNlaWQpKQpAQCAtNzczNCw3ICs3NTIxLDcgQEAKIAl3bGMtPm1pbW9fYmFuZF9id2NhcCA9IGJ3Y2FwOwogfQogCi12b2lkIHdsY19tb2RfcHJiX3JzcF9yYXRlX3RhYmxlKHdsY19pbmZvX3QgKndsYywgdWludCBmcmFtZV9sZW4pCit2b2lkIHdsY19tb2RfcHJiX3JzcF9yYXRlX3RhYmxlKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCB1aW50IGZyYW1lX2xlbikKIHsKIAljb25zdCB3bGNfcmF0ZXNldF90ICpyc19kZmx0OwogCXdsY19yYXRlc2V0X3QgcnM7CkBAIC03Nzc3LDE0ICs3NTY0LDE0IEBACiB9CiAKIHUxNgotd2xjX2NvbXB1dGVfYmNudHNmb2ZmKHdsY19pbmZvX3QgKndsYywgcmF0ZXNwZWNfdCByc3BlYywgYm9vbCBzaG9ydF9wcmVhbWJsZSwKLQkJICAgICAgYm9vbCBwaHlkZWxheSkKK3dsY19jb21wdXRlX2JjbnRzZm9mZihzdHJ1Y3Qgd2xjX2luZm8gKndsYywgcmF0ZXNwZWNfdCByc3BlYywKKwkJICAgICAgYm9vbCBzaG9ydF9wcmVhbWJsZSwgYm9vbCBwaHlkZWxheSkKIHsKIAl1aW50IGJjbnRzZm9mZiA9IDA7CiAKIAlpZiAoSVNfTUNTKHJzcGVjKSkgewotCQlXTF9FUlJPUigoIndsJWQ6IHJlY2QgYmVhY29uIHdpdGggbWNzIHJhdGU7IHJzcGVjIDB4JXhcbiIsCi0JCQkgIHdsYy0+cHViLT51bml0LCByc3BlYykpOworCQlXTF9FUlJPUigid2wlZDogcmVjZCBiZWFjb24gd2l0aCBtY3MgcmF0ZTsgcnNwZWMgMHgleFxuIiwKKwkJCSB3bGMtPnB1Yi0+dW5pdCwgcnNwZWMpOwogCX0gZWxzZSBpZiAoSVNfT0ZETShyc3BlYykpIHsKIAkJLyogdHggZGVsYXkgZnJvbSBNQUMgdGhyb3VnaCBwaHkgdG8gYWlyICgyLjEgdXNlYykgKwogCQkgKiBwaHkgaGVhZGVyIHRpbWUgKHByZWFtYmxlICsgUExDUCBTSUdOQUwgPT0gMjAgdXNlYykgKwpAQCAtNzgyNCw3ICs3NjExLDcgQEAKICAqCWFuZCBpbmNsdWRlZCB1cCB0bywgYnV0IG5vdCBpbmNsdWRpbmcsIHRoZSA0IGJ5dGUgRkNTLgogICovCiBzdGF0aWMgdm9pZAotd2xjX2Jjbl9wcmJfdGVtcGxhdGUod2xjX2luZm9fdCAqd2xjLCB1aW50IHR5cGUsIHJhdGVzcGVjX3QgYmNuX3JzcGVjLAord2xjX2Jjbl9wcmJfdGVtcGxhdGUoc3RydWN0IHdsY19pbmZvICp3bGMsIHVpbnQgdHlwZSwgcmF0ZXNwZWNfdCBiY25fcnNwZWMsCiAJCSAgICAgd2xjX2Jzc2NmZ190ICpjZmcsIHUxNiAqYnVmLCBpbnQgKmxlbikKIHsKIAljY2tfcGh5X2hkcl90ICpwbGNwOwpAQCAtNzg0Myw3ICs3NjMwLDcgQEAKIAkqbGVuID0gaGRyX2xlbiArIGJvZHlfbGVuOwkvKiByZXR1cm4gYWN0dWFsIHNpemUgKi8KIAogCS8qIGZvcm1hdCBQSFkgYW5kIE1BQyBoZWFkZXJzICovCi0JYnplcm8oKGNoYXIgKilidWYsIGhkcl9sZW4pOworCW1lbXNldCgoY2hhciAqKWJ1ZiwgMCwgaGRyX2xlbik7CiAKIAlwbGNwID0gKGNja19waHlfaGRyX3QgKikgYnVmOwogCkBAIC03ODcyLDkgKzc2NTksOSBAQAogCS8qIEExIGZpbGxlZCBpbiBieSBNQUMgZm9yIHByYiByZXNwLCBicm9hZGNhc3QgZm9yIGJjbiAqLwogCWlmICh0eXBlID09IEZDX0JFQUNPTikKIAkJYmNvcHkoKGNvbnN0IGNoYXIgKikmZXRoZXJfYmNhc3QsIChjaGFyICopJmgtPmRhLAotCQkgICAgICBFVEhFUl9BRERSX0xFTik7Ci0JYmNvcHkoKGNoYXIgKikmY2ZnLT5jdXJfZXRoZXJhZGRyLCAoY2hhciAqKSZoLT5zYSwgRVRIRVJfQUREUl9MRU4pOwotCWJjb3B5KChjaGFyICopJmNmZy0+QlNTSUQsIChjaGFyICopJmgtPmJzc2lkLCBFVEhFUl9BRERSX0xFTik7CisJCSAgICAgIEVUSF9BTEVOKTsKKwliY29weSgoY2hhciAqKSZjZmctPmN1cl9ldGhlcmFkZHIsIChjaGFyICopJmgtPnNhLCBFVEhfQUxFTik7CisJYmNvcHkoKGNoYXIgKikmY2ZnLT5CU1NJRCwgKGNoYXIgKikmaC0+YnNzaWQsIEVUSF9BTEVOKTsKIAogCS8qIFNFUSBmaWxsZWQgaW4gYnkgTUFDICovCiAKQEAgLTc4OTEsNyArNzY3OCw3IEBACiAgKiB0ZW1wbGF0ZSB1cGRhdGVkLgogICogT3RoZXJ3aXNlLCBpdCB1cGRhdGVzIHRoZSBoYXJkd2FyZSB0ZW1wbGF0ZS4KICAqLwotdm9pZCB3bGNfYnNzX3VwZGF0ZV9iZWFjb24od2xjX2luZm9fdCAqd2xjLCB3bGNfYnNzY2ZnX3QgKmNmZykKK3ZvaWQgd2xjX2Jzc191cGRhdGVfYmVhY29uKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCB3bGNfYnNzY2ZnX3QgKmNmZykKIHsKIAlpbnQgbGVuID0gQkNOX1RNUExfTEVOOwogCkBAIC03OTA3LDcgKzc2OTQsNyBAQAogCQl1MTYgYmNuW0JDTl9UTVBMX0xFTiAvIDJdOwogCQl1MzIgYm90aF92YWxpZCA9IE1DTURfQkNOMFZMRCB8IE1DTURfQkNOMVZMRDsKIAkJZDExcmVnc190ICpyZWdzID0gd2xjLT5yZWdzOwotCQlvc2xfdCAqb3NoID0gTlVMTDsKKwkJc3RydWN0IG9zbF9pbmZvICpvc2ggPSBOVUxMOwogCiAJCW9zaCA9IHdsYy0+b3NoOwogCkBAIC03OTQ0LDcgKzc3MzEsNyBAQAogLyoKICAqIFVwZGF0ZSBhbGwgYmVhY29ucyBmb3IgdGhlIHN5c3RlbS4KICAqLwotdm9pZCB3bGNfdXBkYXRlX2JlYWNvbih3bGNfaW5mb190ICp3bGMpCit2b2lkIHdsY191cGRhdGVfYmVhY29uKHN0cnVjdCB3bGNfaW5mbyAqd2xjKQogewogCWludCBpZHg7CiAJd2xjX2Jzc2NmZ190ICpic3NjZmc7CkBAIC03OTU3LDE0ICs3NzQ0LDE0IEBACiB9CiAKIC8qIFdyaXRlIHNzaWQgaW50byBzaGFyZWQgbWVtb3J5ICovCi12b2lkIHdsY19zaG1fc3NpZF91cGQod2xjX2luZm9fdCAqd2xjLCB3bGNfYnNzY2ZnX3QgKmNmZykKK3ZvaWQgd2xjX3NobV9zc2lkX3VwZChzdHJ1Y3Qgd2xjX2luZm8gKndsYywgd2xjX2Jzc2NmZ190ICpjZmcpCiB7CiAJdTggKnNzaWRwdHIgPSBjZmctPlNTSUQ7CiAJdTE2IGJhc2UgPSBNX1NTSUQ7CiAJdTggc3NpZGJ1ZltET1QxMV9NQVhfU1NJRF9MRU5dOwogCiAJLyogcGFkZGluZyB0aGUgc3NpZCB3aXRoIHplcm8gYW5kIGNvcHkgaXQgaW50byBzaG0gKi8KLQliemVybyhzc2lkYnVmLCBET1QxMV9NQVhfU1NJRF9MRU4pOworCW1lbXNldChzc2lkYnVmLCAwLCBET1QxMV9NQVhfU1NJRF9MRU4pOwogCWJjb3B5KHNzaWRwdHIsIHNzaWRidWYsIGNmZy0+U1NJRF9sZW4pOwogCiAJd2xjX2NvcHl0b19zaG0od2xjLCBiYXNlLCBzc2lkYnVmLCBET1QxMV9NQVhfU1NJRF9MRU4pOwpAQCAtNzk3Myw3ICs3NzYwLDcgQEAKIAkJd2xjX3dyaXRlX3NobSh3bGMsIE1fU1NJRExFTiwgKHUxNikgY2ZnLT5TU0lEX2xlbik7CiB9CiAKLXZvaWQgd2xjX3VwZGF0ZV9wcm9iZV9yZXNwKHdsY19pbmZvX3QgKndsYywgYm9vbCBzdXNwZW5kKQordm9pZCB3bGNfdXBkYXRlX3Byb2JlX3Jlc3Aoc3RydWN0IHdsY19pbmZvICp3bGMsIGJvb2wgc3VzcGVuZCkKIHsKIAlpbnQgaWR4OwogCXdsY19ic3NjZmdfdCAqYnNzY2ZnOwpAQCAtNzk4Niw3ICs3NzczLDcgQEAKIH0KIAogdm9pZAotd2xjX2Jzc191cGRhdGVfcHJvYmVfcmVzcCh3bGNfaW5mb190ICp3bGMsIHdsY19ic3NjZmdfdCAqY2ZnLCBib29sIHN1c3BlbmQpCit3bGNfYnNzX3VwZGF0ZV9wcm9iZV9yZXNwKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCB3bGNfYnNzY2ZnX3QgKmNmZywgYm9vbCBzdXNwZW5kKQogewogCXUxNiBwcmJfcmVzcFtCQ05fVE1QTF9MRU4gLyAyXTsKIAlpbnQgbGVuID0gQkNOX1RNUExfTEVOOwpAQCAtODAyNyw5ICs3ODE0LDkgQEAKIH0KIAogLyogcHJlcGFyZXMgcGR1IGZvciB0cmFuc21pc3Npb24uIHJldHVybnMgQkNNIGVycm9yIGNvZGVzICovCi1pbnQgd2xjX3ByZXBfcGR1KHdsY19pbmZvX3QgKndsYywgdm9pZCAqcGR1LCB1aW50ICpmaWZvcCkKK2ludCB3bGNfcHJlcF9wZHUoc3RydWN0IHdsY19pbmZvICp3bGMsIHN0cnVjdCBza19idWZmICpwZHUsIHVpbnQgKmZpZm9wKQogewotCW9zbF90ICpvc2g7CisJc3RydWN0IG9zbF9pbmZvICpvc2g7CiAJdWludCBmaWZvOwogCWQxMXR4aF90ICp0eGg7CiAJc3RydWN0IGRvdDExX2hlYWRlciAqaDsKQEAgLTgwMzksNyArNzgyNiw3IEBACiAJb3NoID0gd2xjLT5vc2g7CiAKIAlBU1NFUlQocGR1KTsKLQl0eGggPSAoZDExdHhoX3QgKikgUEtUREFUQShwZHUpOworCXR4aCA9IChkMTF0eGhfdCAqKSAocGR1LT5kYXRhKTsKIAlBU1NFUlQodHhoKTsKIAloID0gKHN0cnVjdCBkb3QxMV9oZWFkZXIgKikoKHU4ICopICh0eGggKyAxKSArIEQxMV9QSFlfSERSX0xFTik7CiAJQVNTRVJUKGgpOwpAQCAtODA2Niw3ICs3ODUzLDcgQEAKIH0KIAogLyogaW5pdCB0eCByZXBvcnRlZCByYXRlIG1lY2hhbmlzbSAqLwotdm9pZCB3bGNfcmVwcmF0ZV9pbml0KHdsY19pbmZvX3QgKndsYykKK3ZvaWQgd2xjX3JlcHJhdGVfaW5pdChzdHJ1Y3Qgd2xjX2luZm8gKndsYykKIHsKIAlpbnQgaTsKIAl3bGNfYnNzY2ZnX3QgKmJzc2NmZzsKQEAgLTgwODAsMTMgKzc4NjcsMTMgQEAKIHZvaWQgd2xjX2Jzc2NmZ19yZXByYXRlX2luaXQod2xjX2Jzc2NmZ190ICpic3NjZmcpCiB7CiAJYnNzY2ZnLT50eHJzcGVjaWR4ID0gMDsKLQliemVybygoY2hhciAqKWJzc2NmZy0+dHhyc3BlYywgc2l6ZW9mKGJzc2NmZy0+dHhyc3BlYykpOworCW1lbXNldCgoY2hhciAqKWJzc2NmZy0+dHhyc3BlYywgMCwgc2l6ZW9mKGJzc2NmZy0+dHhyc3BlYykpOwogfQogCiAvKiBSZXRyaWV2ZSBhIGNvbnNvbGlkYXRlZCBzZXQgb2YgcmV2aXNpb24gaW5mb3JtYXRpb24sCiAgKiB0eXBpY2FsbHkgZm9yIHRoZSBXTENfR0VUX1JFVklORk8gaW9jdGwKICAqLwotaW50IHdsY19nZXRfcmV2aXNpb25faW5mbyh3bGNfaW5mb190ICp3bGMsIHZvaWQgKmJ1ZiwgdWludCBsZW4pCitpbnQgd2xjX2dldF9yZXZpc2lvbl9pbmZvKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCB2b2lkICpidWYsIHVpbnQgbGVuKQogewogCXdsY19yZXZfaW5mb190ICpyaW5mbyA9ICh3bGNfcmV2X2luZm9fdCAqKSBidWY7CiAKQEAgLTgxMjAsNyArNzkwNyw3IEBACiAJcmV0dXJuIEJDTUVfT0s7CiB9CiAKLXZvaWQgd2xjX2RlZmF1bHRfcmF0ZXNldCh3bGNfaW5mb190ICp3bGMsIHdsY19yYXRlc2V0X3QgKnJzKQordm9pZCB3bGNfZGVmYXVsdF9yYXRlc2V0KHN0cnVjdCB3bGNfaW5mbyAqd2xjLCB3bGNfcmF0ZXNldF90ICpycykKIHsKIAl3bGNfcmF0ZXNldF9kZWZhdWx0KHJzLCBOVUxMLCB3bGMtPmJhbmQtPnBoeXR5cGUsIHdsYy0+YmFuZC0+YmFuZHR5cGUsCiAJCQkgICAgZmFsc2UsIFJBVEVfTUFTS19GVUxMLCAoYm9vbCkgTl9FTkFCKHdsYy0+cHViKSwKQEAgLTgxMjgsMTQgKzc5MTUsMTQgQEAKIAkJCSAgICB3bGMtPnN0Zi0+dHhzdHJlYW1zKTsKIH0KIAotc3RhdGljIHZvaWQgd2xjX2Jzc19kZWZhdWx0X2luaXQod2xjX2luZm9fdCAqd2xjKQorc3RhdGljIHZvaWQgd2xjX2Jzc19kZWZhdWx0X2luaXQoc3RydWN0IHdsY19pbmZvICp3bGMpCiB7CiAJY2hhbnNwZWNfdCBjaGFuc3BlYzsKLQl3bGNiYW5kX3QgKmJhbmQ7CisJc3RydWN0IHdsY2JhbmQgKmJhbmQ7CiAJd2xjX2Jzc19pbmZvX3QgKmJpID0gd2xjLT5kZWZhdWx0X2JzczsKIAogCS8qIGluaXQgZGVmYXVsdCBhbmQgdGFyZ2V0IEJTUyB3aXRoIHNvbWUgc2FuZSBpbml0aWFsIHZhbHVlcyAqLwotCWJ6ZXJvKChjaGFyICopKGJpKSwgc2l6ZW9mKHdsY19ic3NfaW5mb190KSk7CisJbWVtc2V0KChjaGFyICopKGJpKSwgMCwgc2l6ZW9mKHdsY19ic3NfaW5mb190KSk7CiAJYmktPmJlYWNvbl9wZXJpb2QgPSBJU1NJTV9FTkFCKHdsYy0+cHViLT5zaWgpID8gQkVBQ09OX0lOVEVSVkFMX0RFRl9RVCA6CiAJICAgIEJFQUNPTl9JTlRFUlZBTF9ERUZBVUxUOwogCWJpLT5kdGltX3BlcmlvZCA9IElTU0lNX0VOQUIod2xjLT5wdWItPnNpaCkgPyBEVElNX0lOVEVSVkFMX0RFRl9RVCA6CkBAIC04MTY2LDcgKzc5NTMsNyBAQAogLyogRGVmZXJyZWQgZXZlbnQgcHJvY2Vzc2luZyAqLwogc3RhdGljIHZvaWQgd2xjX3Byb2Nlc3NfZXZlbnRxKHZvaWQgKmFyZykKIHsKLQl3bGNfaW5mb190ICp3bGMgPSAod2xjX2luZm9fdCAqKSBhcmc7CisJc3RydWN0IHdsY19pbmZvICp3bGMgPSAoc3RydWN0IHdsY19pbmZvICopIGFyZzsKIAl3bGNfZXZlbnRfdCAqZXRtcDsKIAogCXdoaWxlICgoZXRtcCA9IHdsY19ldmVudHFfZGVxKHdsYy0+ZXZlbnRxKSkpIHsKQEAgLTgxOTIsNyArNzk3OSw4IEBACiB9CiAKIHN0YXRpYyByYXRlc3BlY190Ci1tYWM4MDIxMV93bGNfc2V0X25yYXRlKHdsY19pbmZvX3QgKndsYywgd2xjYmFuZF90ICpjdXJfYmFuZCwgdTMyIGludF92YWwpCittYWM4MDIxMV93bGNfc2V0X25yYXRlKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCBzdHJ1Y3Qgd2xjYmFuZCAqY3VyX2JhbmQsCisJCSAgICAgICB1MzIgaW50X3ZhbCkKIHsKIAl1OCBzdGYgPSAoaW50X3ZhbCAmIE5SQVRFX1NURl9NQVNLKSA+PiBOUkFURV9TVEZfU0hJRlQ7CiAJdTggcmF0ZSA9IGludF92YWwgJiBOUkFURV9SQVRFX01BU0s7CkBAIC04MjExLDggKzc5OTksOCBAQAogCWlmIChOX0VOQUIod2xjLT5wdWIpICYmIGlzbWNzKSB7CiAJCS8qIG1jcyBvbmx5IGFsbG93ZWQgd2hlbiBubW9kZSAqLwogCQlpZiAoc3RmID4gUEhZX1RYQzFfTU9ERV9TRE0pIHsKLQkJCVdMX0VSUk9SKCgid2wlZDogJXM6IEludmFsaWQgc3RmXG4iLCBXTENXTFVOSVQod2xjKSwKLQkJCQkgIF9fZnVuY19fKSk7CisJCQlXTF9FUlJPUigid2wlZDogJXM6IEludmFsaWQgc3RmXG4iLAorCQkJCSBXTENXTFVOSVQod2xjKSwgX19mdW5jX18pOwogCQkJYmNtZXJyb3IgPSBCQ01FX1JBTkdFOwogCQkJZ290byBkb25lOwogCQl9CkBAIC04MjIyLDggKzgwMTAsOCBAQAogCQkJaWYgKCFDSFNQRUNfSVM0MCh3bGMtPmhvbWVfY2hhbnNwZWMpIHx8CiAJCQkgICAgKChzdGYgIT0gUEhZX1RYQzFfTU9ERV9TSVNPKQogCQkJICAgICAmJiAoc3RmICE9IFBIWV9UWEMxX01PREVfQ0REKSkpIHsKLQkJCQlXTF9FUlJPUigoIndsJWQ6ICVzOiBJbnZhbGlkIG1jcyAzMlxuIiwKLQkJCQkJICBXTENXTFVOSVQod2xjKSwgX19mdW5jX18pKTsKKwkJCQlXTF9FUlJPUigid2wlZDogJXM6IEludmFsaWQgbWNzIDMyXG4iLAorCQkJCQkgV0xDV0xVTklUKHdsYyksIF9fZnVuY19fKTsKIAkJCQliY21lcnJvciA9IEJDTUVfUkFOR0U7CiAJCQkJZ290byBkb25lOwogCQkJfQpAQCAtODIzMSw3ICs4MDE5LDggQEAKIAkJfSBlbHNlIGlmIChyYXRlID4gSElHSEVTVF9TSU5HTEVfU1RSRUFNX01DUykgewogCQkJLyogbWNzID4gNyBtdXN0IHVzZSBzdGYgU0RNICovCiAJCQlpZiAoc3RmICE9IFBIWV9UWEMxX01PREVfU0RNKSB7Ci0JCQkJV0xfVFJBQ0UoKCJ3bCVkOiAlczogZW5hYmxpbmcgU0RNIG1vZGUgZm9yIG1jcyAlZFxuIiwgV0xDV0xVTklUKHdsYyksIF9fZnVuY19fLCByYXRlKSk7CisJCQkJV0xfVFJBQ0UoIndsJWQ6ICVzOiBlbmFibGluZyBTRE0gbW9kZSBmb3IgbWNzICVkXG4iLAorCQkJCQkgV0xDV0xVTklUKHdsYyksIF9fZnVuY19fLCByYXRlKTsKIAkJCQlzdGYgPSBQSFlfVFhDMV9NT0RFX1NETTsKIAkJCX0KIAkJfSBlbHNlIHsKQEAgLTgyMzksMzcgKzgwMjgsMzcgQEAKIAkJCWlmICgoc3RmID4gUEhZX1RYQzFfTU9ERV9TVEJDKSB8fAogCQkJICAgICghV0xDX1NUQkNfQ0FQX1BIWSh3bGMpCiAJCQkgICAgICYmIChzdGYgPT0gUEhZX1RYQzFfTU9ERV9TVEJDKSkpIHsKLQkJCQlXTF9FUlJPUigoIndsJWQ6ICVzOiBJbnZhbGlkIFNUQkNcbiIsCi0JCQkJCSAgV0xDV0xVTklUKHdsYyksIF9fZnVuY19fKSk7CisJCQkJV0xfRVJST1IoIndsJWQ6ICVzOiBJbnZhbGlkIFNUQkNcbiIsCisJCQkJCSBXTENXTFVOSVQod2xjKSwgX19mdW5jX18pOwogCQkJCWJjbWVycm9yID0gQkNNRV9SQU5HRTsKIAkJCQlnb3RvIGRvbmU7CiAJCQl9CiAJCX0KIAl9IGVsc2UgaWYgKElTX09GRE0ocmF0ZSkpIHsKIAkJaWYgKChzdGYgIT0gUEhZX1RYQzFfTU9ERV9DREQpICYmIChzdGYgIT0gUEhZX1RYQzFfTU9ERV9TSVNPKSkgewotCQkJV0xfRVJST1IoKCJ3bCVkOiAlczogSW52YWxpZCBPRkRNXG4iLCBXTENXTFVOSVQod2xjKSwKLQkJCQkgIF9fZnVuY19fKSk7CisJCQlXTF9FUlJPUigid2wlZDogJXM6IEludmFsaWQgT0ZETVxuIiwKKwkJCQkgV0xDV0xVTklUKHdsYyksIF9fZnVuY19fKTsKIAkJCWJjbWVycm9yID0gQkNNRV9SQU5HRTsKIAkJCWdvdG8gZG9uZTsKIAkJfQogCX0gZWxzZSBpZiAoSVNfQ0NLKHJhdGUpKSB7CiAJCWlmICgoY3VyX2JhbmQtPmJhbmR0eXBlICE9IFdMQ19CQU5EXzJHKQogCQkgICAgfHwgKHN0ZiAhPSBQSFlfVFhDMV9NT0RFX1NJU08pKSB7Ci0JCQlXTF9FUlJPUigoIndsJWQ6ICVzOiBJbnZhbGlkIENDS1xuIiwgV0xDV0xVTklUKHdsYyksCi0JCQkJICBfX2Z1bmNfXykpOworCQkJV0xfRVJST1IoIndsJWQ6ICVzOiBJbnZhbGlkIENDS1xuIiwKKwkJCQkgV0xDV0xVTklUKHdsYyksIF9fZnVuY19fKTsKIAkJCWJjbWVycm9yID0gQkNNRV9SQU5HRTsKIAkJCWdvdG8gZG9uZTsKIAkJfQogCX0gZWxzZSB7Ci0JCVdMX0VSUk9SKCgid2wlZDogJXM6IFVua25vd24gcmF0ZSB0eXBlXG4iLCBXTENXTFVOSVQod2xjKSwKLQkJCSAgX19mdW5jX18pKTsKKwkJV0xfRVJST1IoIndsJWQ6ICVzOiBVbmtub3duIHJhdGUgdHlwZVxuIiwKKwkJCSBXTENXTFVOSVQod2xjKSwgX19mdW5jX18pOwogCQliY21lcnJvciA9IEJDTUVfUkFOR0U7CiAJCWdvdG8gZG9uZTsKIAl9CiAJLyogbWFrZSBzdXJlIG11bHRpcGxlIGFudGVubmFlIGFyZSBhdmFpbGFibGUgZm9yIG5vbi1zaXNvIHJhdGVzICovCiAJaWYgKChzdGYgIT0gUEhZX1RYQzFfTU9ERV9TSVNPKSAmJiAod2xjLT5zdGYtPnR4c3RyZWFtcyA9PSAxKSkgewotCQlXTF9FUlJPUigoIndsJWQ6ICVzOiBTSVNPIGFudGVubmEgYnV0ICFTSVNPIHJlcXVlc3RcbiIsCi0JCQkgIFdMQ1dMVU5JVCh3bGMpLCBfX2Z1bmNfXykpOworCQlXTF9FUlJPUigid2wlZDogJXM6IFNJU08gYW50ZW5uYSBidXQgIVNJU08gcmVxdWVzdFxuIiwKKwkJCSBXTENXTFVOSVQod2xjKSwgX19mdW5jX18pOwogCQliY21lcnJvciA9IEJDTUVfUkFOR0U7CiAJCWdvdG8gZG9uZTsKIAl9CkBAIC04MzAwLDEzICs4MDg5LDEzIEBACiAKIAlyZXR1cm4gcnNwZWM7CiAgZG9uZToKLQlXTF9FUlJPUigoIkhvYXJrXG4iKSk7CisJV0xfRVJST1IoIkhvYXJrXG4iKTsKIAlyZXR1cm4gcmF0ZTsKIH0KIAogLyogZm9ybXVsYTogIElETEVfQlVTWV9SQVRJT19YXzE2ID0gKDEwMC1kdXR5X2N5Y2xlKS9kdXR5X2N5Y2xlKjE2ICovCiBzdGF0aWMgaW50Ci13bGNfZHV0eV9jeWNsZV9zZXQod2xjX2luZm9fdCAqd2xjLCBpbnQgZHV0eV9jeWNsZSwgYm9vbCBpc09GRE0sCit3bGNfZHV0eV9jeWNsZV9zZXQoc3RydWN0IHdsY19pbmZvICp3bGMsIGludCBkdXR5X2N5Y2xlLCBib29sIGlzT0ZETSwKIAkJICAgYm9vbCB3cml0ZVRvU2htKQogewogCWludCBpZGxlX2J1c3lfcmF0aW9feF8xNiA9IDA7CkBAIC04MzE0LDggKzgxMDMsNyBAQAogCSAgICBpc09GRE0gPyBNX1RYX0lETEVfQlVTWV9SQVRJT19YXzE2X09GRE0gOgogCSAgICBNX1RYX0lETEVfQlVTWV9SQVRJT19YXzE2X0NDSzsKIAlpZiAoZHV0eV9jeWNsZSA+IDEwMCB8fCBkdXR5X2N5Y2xlIDwgMCkgewotCQlXTF9FUlJPUigoIndsJWQ6ICBkdXR5IGN5Y2xlIHZhbHVlIG9mZiBsaW1pdFxuIiwKLQkJCSAgd2xjLT5wdWItPnVuaXQpKTsKKwkJV0xfRVJST1IoIndsJWQ6ICBkdXR5IGN5Y2xlIHZhbHVlIG9mZiBsaW1pdFxuIiwgd2xjLT5wdWItPnVuaXQpOwogCQlyZXR1cm4gQkNNRV9SQU5HRTsKIAl9CiAJaWYgKGR1dHlfY3ljbGUpCkBAIC04MzM1LDcgKzgxMjMsNyBAQAogLyogUmVhZCBhIHNpbmdsZSB1MTYgZnJvbSBzaGFyZWQgbWVtb3J5LgogICogU0hNICdvZmZzZXQnIG5lZWRzIHRvIGJlIGFuIGV2ZW4gYWRkcmVzcwogICovCi11MTYgd2xjX3JlYWRfc2htKHdsY19pbmZvX3QgKndsYywgdWludCBvZmZzZXQpCit1MTYgd2xjX3JlYWRfc2htKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCB1aW50IG9mZnNldCkKIHsKIAlyZXR1cm4gd2xjX2JtYWNfcmVhZF9zaG0od2xjLT5odywgb2Zmc2V0KTsKIH0KQEAgLTgzNDMsNyArODEzMSw3IEBACiAvKiBXcml0ZSBhIHNpbmdsZSB1MTYgdG8gc2hhcmVkIG1lbW9yeS4KICAqIFNITSAnb2Zmc2V0JyBuZWVkcyB0byBiZSBhbiBldmVuIGFkZHJlc3MKICAqLwotdm9pZCB3bGNfd3JpdGVfc2htKHdsY19pbmZvX3QgKndsYywgdWludCBvZmZzZXQsIHUxNiB2KQordm9pZCB3bGNfd3JpdGVfc2htKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCB1aW50IG9mZnNldCwgdTE2IHYpCiB7CiAJd2xjX2JtYWNfd3JpdGVfc2htKHdsYy0+aHcsIG9mZnNldCwgdik7CiB9CkBAIC04MzUyLDcgKzgxNDAsNyBAQAogICogU0hNICdvZmZzZXQnIG5lZWRzIHRvIGJlIGFuIGV2ZW4gYWRkcmVzcyBhbmQKICAqIFJhbmdlIGxlbmd0aCAnbGVuJyBtdXN0IGJlIGFuIGV2ZW4gbnVtYmVyIG9mIGJ5dGVzCiAgKi8KLXZvaWQgd2xjX3NldF9zaG0od2xjX2luZm9fdCAqd2xjLCB1aW50IG9mZnNldCwgdTE2IHYsIGludCBsZW4pCit2b2lkIHdsY19zZXRfc2htKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCB1aW50IG9mZnNldCwgdTE2IHYsIGludCBsZW4pCiB7CiAJLyogb2Zmc2V0IGFuZCBsZW4gbmVlZCB0byBiZSBldmVuICovCiAJQVNTRVJUKChvZmZzZXQgJiAxKSA9PSAwKTsKQEAgLTgzNjgsNyArODE1Niw3IEBACiAgKiBTSE0gJ29mZnNldCcgbmVlZHMgdG8gYmUgYW4gZXZlbiBhZGRyZXNzIGFuZAogICogQnVmZmVyIGxlbmd0aCAnbGVuJyBtdXN0IGJlIGFuIGV2ZW4gbnVtYmVyIG9mIGJ5dGVzCiAgKi8KLXZvaWQgd2xjX2NvcHl0b19zaG0od2xjX2luZm9fdCAqd2xjLCB1aW50IG9mZnNldCwgY29uc3Qgdm9pZCAqYnVmLCBpbnQgbGVuKQordm9pZCB3bGNfY29weXRvX3NobShzdHJ1Y3Qgd2xjX2luZm8gKndsYywgdWludCBvZmZzZXQsIGNvbnN0IHZvaWQgKmJ1ZiwgaW50IGxlbikKIHsKIAkvKiBvZmZzZXQgYW5kIGxlbiBuZWVkIHRvIGJlIGV2ZW4gKi8KIAlBU1NFUlQoKG9mZnNldCAmIDEpID09IDApOwpAQCAtODM4NCw3ICs4MTcyLDcgQEAKICAqIFNITSAnb2Zmc2V0JyBuZWVkcyB0byBiZSBhbiBldmVuIGFkZHJlc3MgYW5kCiAgKiBCdWZmZXIgbGVuZ3RoICdsZW4nIG11c3QgYmUgYW4gZXZlbiBudW1iZXIgb2YgYnl0ZXMKICAqLwotdm9pZCB3bGNfY29weWZyb21fc2htKHdsY19pbmZvX3QgKndsYywgdWludCBvZmZzZXQsIHZvaWQgKmJ1ZiwgaW50IGxlbikKK3ZvaWQgd2xjX2NvcHlmcm9tX3NobShzdHJ1Y3Qgd2xjX2luZm8gKndsYywgdWludCBvZmZzZXQsIHZvaWQgKmJ1ZiwgaW50IGxlbikKIHsKIAkvKiBvZmZzZXQgYW5kIGxlbiBuZWVkIHRvIGJlIGV2ZW4gKi8KIAlBU1NFUlQoKG9mZnNldCAmIDEpID09IDApOwpAQCAtODM5Nyw3MSArODE4NSw3MyBAQAogfQogCiAvKiB3cmFwcGVyIEJNQUMgZnVuY3Rpb25zIHRvIGZvciBISUdIIGRyaXZlciBhY2Nlc3MgKi8KLXZvaWQgd2xjX21jdHJsKHdsY19pbmZvX3QgKndsYywgdTMyIG1hc2ssIHUzMiB2YWwpCit2b2lkIHdsY19tY3RybChzdHJ1Y3Qgd2xjX2luZm8gKndsYywgdTMyIG1hc2ssIHUzMiB2YWwpCiB7CiAJd2xjX2JtYWNfbWN0cmwod2xjLT5odywgbWFzaywgdmFsKTsKIH0KIAotdm9pZCB3bGNfY29yZXJlc2V0KHdsY19pbmZvX3QgKndsYywgdTMyIGZsYWdzKQordm9pZCB3bGNfY29yZXJlc2V0KHN0cnVjdCB3bGNfaW5mbyAqd2xjLCB1MzIgZmxhZ3MpCiB7CiAJd2xjX2JtYWNfY29yZXJlc2V0KHdsYy0+aHcsIGZsYWdzKTsKIH0KIAotdm9pZCB3bGNfbWhmKHdsY19pbmZvX3QgKndsYywgdTggaWR4LCB1MTYgbWFzaywgdTE2IHZhbCwgaW50IGJhbmRzKQordm9pZCB3bGNfbWhmKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCB1OCBpZHgsIHUxNiBtYXNrLCB1MTYgdmFsLCBpbnQgYmFuZHMpCiB7CiAJd2xjX2JtYWNfbWhmKHdsYy0+aHcsIGlkeCwgbWFzaywgdmFsLCBiYW5kcyk7CiB9CiAKLXUxNiB3bGNfbWhmX2dldCh3bGNfaW5mb190ICp3bGMsIHU4IGlkeCwgaW50IGJhbmRzKQordTE2IHdsY19taGZfZ2V0KHN0cnVjdCB3bGNfaW5mbyAqd2xjLCB1OCBpZHgsIGludCBiYW5kcykKIHsKIAlyZXR1cm4gd2xjX2JtYWNfbWhmX2dldCh3bGMtPmh3LCBpZHgsIGJhbmRzKTsKIH0KIAotaW50IHdsY194bXRmaWZvX3N6X2dldCh3bGNfaW5mb190ICp3bGMsIHVpbnQgZmlmbywgdWludCAqYmxvY2tzKQoraW50IHdsY194bXRmaWZvX3N6X2dldChzdHJ1Y3Qgd2xjX2luZm8gKndsYywgdWludCBmaWZvLCB1aW50ICpibG9ja3MpCiB7CiAJcmV0dXJuIHdsY19ibWFjX3htdGZpZm9fc3pfZ2V0KHdsYy0+aHcsIGZpZm8sIGJsb2Nrcyk7CiB9CiAKLXZvaWQgd2xjX3dyaXRlX3RlbXBsYXRlX3JhbSh3bGNfaW5mb190ICp3bGMsIGludCBvZmZzZXQsIGludCBsZW4sIHZvaWQgKmJ1ZikKK3ZvaWQgd2xjX3dyaXRlX3RlbXBsYXRlX3JhbShzdHJ1Y3Qgd2xjX2luZm8gKndsYywgaW50IG9mZnNldCwgaW50IGxlbiwKKwkJCSAgICB2b2lkICpidWYpCiB7CiAJd2xjX2JtYWNfd3JpdGVfdGVtcGxhdGVfcmFtKHdsYy0+aHcsIG9mZnNldCwgbGVuLCBidWYpOwogfQogCi12b2lkIHdsY193cml0ZV9od19iY250ZW1wbGF0ZXMod2xjX2luZm9fdCAqd2xjLCB2b2lkICpiY24sIGludCBsZW4sIGJvb2wgYm90aCkKK3ZvaWQgd2xjX3dyaXRlX2h3X2JjbnRlbXBsYXRlcyhzdHJ1Y3Qgd2xjX2luZm8gKndsYywgdm9pZCAqYmNuLCBpbnQgbGVuLAorCQkJICAgICAgIGJvb2wgYm90aCkKIHsKIAl3bGNfYm1hY193cml0ZV9od19iY250ZW1wbGF0ZXMod2xjLT5odywgYmNuLCBsZW4sIGJvdGgpOwogfQogCiB2b2lkCi13bGNfc2V0X2FkZHJtYXRjaCh3bGNfaW5mb190ICp3bGMsIGludCBtYXRjaF9yZWdfb2Zmc2V0LAord2xjX3NldF9hZGRybWF0Y2goc3RydWN0IHdsY19pbmZvICp3bGMsIGludCBtYXRjaF9yZWdfb2Zmc2V0LAogCQkgIGNvbnN0IHN0cnVjdCBldGhlcl9hZGRyICphZGRyKQogewogCXdsY19ibWFjX3NldF9hZGRybWF0Y2god2xjLT5odywgbWF0Y2hfcmVnX29mZnNldCwgYWRkcik7CiB9CiAKLXZvaWQgd2xjX3NldF9yY210YSh3bGNfaW5mb190ICp3bGMsIGludCBpZHgsIGNvbnN0IHN0cnVjdCBldGhlcl9hZGRyICphZGRyKQordm9pZCB3bGNfc2V0X3JjbXRhKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCBpbnQgaWR4LCBjb25zdCBzdHJ1Y3QgZXRoZXJfYWRkciAqYWRkcikKIHsKIAl3bGNfYm1hY19zZXRfcmNtdGEod2xjLT5odywgaWR4LCBhZGRyKTsKIH0KIAotdm9pZCB3bGNfcmVhZF90c2Yod2xjX2luZm9fdCAqd2xjLCB1MzIgKnRzZl9sX3B0ciwgdTMyICp0c2ZfaF9wdHIpCit2b2lkIHdsY19yZWFkX3RzZihzdHJ1Y3Qgd2xjX2luZm8gKndsYywgdTMyICp0c2ZfbF9wdHIsIHUzMiAqdHNmX2hfcHRyKQogewogCXdsY19ibWFjX3JlYWRfdHNmKHdsYy0+aHcsIHRzZl9sX3B0ciwgdHNmX2hfcHRyKTsKIH0KIAotdm9pZCB3bGNfc2V0X2N3bWluKHdsY19pbmZvX3QgKndsYywgdTE2IG5ld21pbikKK3ZvaWQgd2xjX3NldF9jd21pbihzdHJ1Y3Qgd2xjX2luZm8gKndsYywgdTE2IG5ld21pbikKIHsKIAl3bGMtPmJhbmQtPkNXbWluID0gbmV3bWluOwogCXdsY19ibWFjX3NldF9jd21pbih3bGMtPmh3LCBuZXdtaW4pOwogfQogCi12b2lkIHdsY19zZXRfY3dtYXgod2xjX2luZm9fdCAqd2xjLCB1MTYgbmV3bWF4KQordm9pZCB3bGNfc2V0X2N3bWF4KHN0cnVjdCB3bGNfaW5mbyAqd2xjLCB1MTYgbmV3bWF4KQogewogCXdsYy0+YmFuZC0+Q1dtYXggPSBuZXdtYXg7CiAJd2xjX2JtYWNfc2V0X2N3bWF4KHdsYy0+aHcsIG5ld21heCk7CiB9CiAKLXZvaWQgd2xjX2ZpZm9lcnJvcnMod2xjX2luZm9fdCAqd2xjKQordm9pZCB3bGNfZmlmb2Vycm9ycyhzdHJ1Y3Qgd2xjX2luZm8gKndsYykKIHsKIAogCXdsY19ibWFjX2ZpZm9lcnJvcnMod2xjLT5odyk7CkBAIC04NDY5LDE5ICs4MjU5LDE2IEBACiAKIC8qIFNlYXJjaCBtZW0gcncgdXRpbGl0aWVzICovCiAKLXZvaWQgd2xjX3BsbHJlcSh3bGNfaW5mb190ICp3bGMsIGJvb2wgc2V0LCBtYm9vbCByZXFfYml0KQordm9pZCB3bGNfcGxscmVxKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCBib29sIHNldCwgbWJvb2wgcmVxX2JpdCkKIHsKIAl3bGNfYm1hY19wbGxyZXEod2xjLT5odywgc2V0LCByZXFfYml0KTsKIH0KIAotdm9pZCB3bGNfcmVzZXRfYm1hY19kb25lKHdsY19pbmZvX3QgKndsYykKK3ZvaWQgd2xjX3Jlc2V0X2JtYWNfZG9uZShzdHJ1Y3Qgd2xjX2luZm8gKndsYykKIHsKLSNpZmRlZiBXTENfSElHSF9PTkxZCi0Jd2xjLT5yZXNldF9ibWFjX3BlbmRpbmcgPSBmYWxzZTsKLSNlbmRpZgogfQogCi12b2lkIHdsY19odF9taW1vcHNfY2FwX3VwZGF0ZSh3bGNfaW5mb190ICp3bGMsIHU4IG1pbW9wc19tb2RlKQordm9pZCB3bGNfaHRfbWltb3BzX2NhcF91cGRhdGUoc3RydWN0IHdsY19pbmZvICp3bGMsIHU4IG1pbW9wc19tb2RlKQogewogCXdsYy0+aHRfY2FwLmNhcCAmPSB+SFRfQ0FQX01JTU9fUFNfTUFTSzsKIAl3bGMtPmh0X2NhcC5jYXAgfD0gKG1pbW9wc19tb2RlIDw8IEhUX0NBUF9NSU1PX1BTX1NISUZUKTsKQEAgLTg0OTQsNyArODI4MSw3IEBACiAKIC8qIGNoZWNrIGZvciB0aGUgcGFydGljdWxhciBwcmlvcml0eSBmbG93IGNvbnRyb2wgYml0IGJlaW5nIHNldCAqLwogYm9vbAotd2xjX3R4Zmxvd2NvbnRyb2xfcHJpb19pc3NldCh3bGNfaW5mb190ICp3bGMsIHdsY190eHFfaW5mb190ICpxLCBpbnQgcHJpbykKK3dsY190eGZsb3djb250cm9sX3ByaW9faXNzZXQoc3RydWN0IHdsY19pbmZvICp3bGMsIHdsY190eHFfaW5mb190ICpxLCBpbnQgcHJpbykKIHsKIAl1aW50IHByaW9fbWFzazsKIApAQCAtODUwOSwxMiArODI5NiwxMyBAQAogfQogCiAvKiBwcm9wb2dhdGUgdGhlIGZsb3cgY29udHJvbCB0byBhbGwgaW50ZXJmYWNlcyB1c2luZyB0aGUgZ2l2ZW4gdHggcXVldWUgKi8KLXZvaWQgd2xjX3R4Zmxvd2NvbnRyb2wod2xjX2luZm9fdCAqd2xjLCB3bGNfdHhxX2luZm9fdCAqcWksIGJvb2wgb24sIGludCBwcmlvKQordm9pZCB3bGNfdHhmbG93Y29udHJvbChzdHJ1Y3Qgd2xjX2luZm8gKndsYywgd2xjX3R4cV9pbmZvX3QgKnFpLAorCQkgICAgICAgYm9vbCBvbiwgaW50IHByaW8pCiB7CiAJdWludCBwcmlvX2JpdHM7CiAJdWludCBjdXJfYml0czsKIAotCVdMX0VSUk9SKCgiJXM6IGZsb3cgY29udHJvIGtpY2tzIGluXG4iLCBfX2Z1bmNfXykpOworCVdMX0VSUk9SKCIlczogZmxvdyBjb250cm9sIGtpY2tzIGluXG4iLCBfX2Z1bmNfXyk7CiAKIAlpZiAocHJpbyA9PSBBTExQUklPKSB7CiAJCXByaW9fYml0cyA9IFRYUV9TVE9QX0ZPUl9QUklPRkNfTUFTSzsKQEAgLTg1NTEsNyArODMzOSw3IEBACiB9CiAKIHZvaWQKLXdsY190eGZsb3djb250cm9sX292ZXJyaWRlKHdsY19pbmZvX3QgKndsYywgd2xjX3R4cV9pbmZvX3QgKnFpLCBib29sIG9uLAord2xjX3R4Zmxvd2NvbnRyb2xfb3ZlcnJpZGUoc3RydWN0IHdsY19pbmZvICp3bGMsIHdsY190eHFfaW5mb190ICpxaSwgYm9vbCBvbiwKIAkJCSAgIHVpbnQgb3ZlcnJpZGUpCiB7CiAJdWludCBwcmV2X292ZXJyaWRlOwpAQCAtODU5OCw3ICs4Mzg2LDcgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIHdsY190eGZsb3djb250cm9sX3Jlc2V0KHdsY19pbmZvX3QgKndsYykKK3N0YXRpYyB2b2lkIHdsY190eGZsb3djb250cm9sX3Jlc2V0KHN0cnVjdCB3bGNfaW5mbyAqd2xjKQogewogCXdsY190eHFfaW5mb190ICpxaTsKIApAQCAtODYxMSwxMCArODM5OSwxMCBAQAogfQogCiBzdGF0aWMgdm9pZAotd2xjX3R4Zmxvd2NvbnRyb2xfc2lnbmFsKHdsY19pbmZvX3QgKndsYywgd2xjX3R4cV9pbmZvX3QgKnFpLCBib29sIG9uLAord2xjX3R4Zmxvd2NvbnRyb2xfc2lnbmFsKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCB3bGNfdHhxX2luZm9fdCAqcWksIGJvb2wgb24sCiAJCQkgaW50IHByaW8pCiB7Ci0Jd2xjX2lmX3QgKndsY2lmOworCXN0cnVjdCB3bGNfaWYgKndsY2lmOwogCiAJZm9yICh3bGNpZiA9IHdsYy0+d2xjaWZfbGlzdDsgd2xjaWYgIT0gTlVMTDsgd2xjaWYgPSB3bGNpZi0+bmV4dCkgewogCQlpZiAod2xjaWYtPnFpID09IHFpICYmIHdsY2lmLT5mbGFncyAmIFdMQ19JRl9MSU5LRUQpCkBAIC04NjIyLDcgKzg0MTAsNyBAQAogCX0KIH0KIAotc3RhdGljIHdsY190eHFfaW5mb190ICp3bGNfdHhxX2FsbG9jKHdsY19pbmZvX3QgKndsYywgb3NsX3QgKm9zaCkKK3N0YXRpYyB3bGNfdHhxX2luZm9fdCAqd2xjX3R4cV9hbGxvYyhzdHJ1Y3Qgd2xjX2luZm8gKndsYywgc3RydWN0IG9zbF9pbmZvICpvc2gpCiB7CiAJd2xjX3R4cV9pbmZvX3QgKnFpLCAqcDsKIApAQCAtODY1Miw3ICs4NDQwLDggQEAKIAlyZXR1cm4gcWk7CiB9CiAKLXN0YXRpYyB2b2lkIHdsY190eHFfZnJlZSh3bGNfaW5mb190ICp3bGMsIG9zbF90ICpvc2gsIHdsY190eHFfaW5mb190ICpxaSkKK3N0YXRpYyB2b2lkIHdsY190eHFfZnJlZShzdHJ1Y3Qgd2xjX2luZm8gKndsYywgc3RydWN0IG9zbF9pbmZvICpvc2gsCisJCQkgd2xjX3R4cV9pbmZvX3QgKnFpKQogewogCXdsY190eHFfaW5mb190ICpwOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3N5cy93bGNfbWFjODAyMTEuaCBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvc3lzL3dsY19tYWM4MDIxMS5oCmluZGV4IDZhNzc1OTEuLjVkZjk5NmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvc3lzL3dsY19tYWM4MDIxMS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvc3lzL3dsY19tYWM4MDIxMS5oCkBAIC0xNywxOSArMTcsMTAgQEAKICNpZm5kZWYgX3dsY19oXwogI2RlZmluZSBfd2xjX2hfCiAKLSNpbmNsdWRlIDx3bGNfdHlwZXMuaD4KLQotI2luY2x1ZGUgPHdsX2RiZy5oPgogI2luY2x1ZGUgPHdsaW9jdGwuaD4KLSNpbmNsdWRlIDx3bGNfZXZlbnQuaD4KICNpbmNsdWRlIDx3bGNfcGh5X2hhbC5oPgogI2luY2x1ZGUgPHdsY19jaGFubmVsLmg+Ci0jaWZkZWYgV0xDX1NQTElUCi0jaW5jbHVkZSA8YmNtX3JwYy5oPgotI2VuZGlmCi0KICNpbmNsdWRlIDx3bGNfYnNzY2ZnLmg+Ci0KICNpbmNsdWRlIDx3bGNfc2NiLmg+CiAKICNkZWZpbmUgTUFfV0lORE9XX1NaCQk4CS8qIG1vdmluZyBhdmVyYWdlIHdpbmRvdyBzaXplICovCkBAIC0yMjAsMTUgKzIxMSwxMSBAQAogICogKHNvbWUgcGxhdGZvcm1zIHJldHVybiBhbGwgMCkuCiAgKiBJZiBjbG9ja3MgYXJlIHByZXNlbnQsIGNhbGwgdGhlIHNiIHJvdXRpbmUgd2hpY2ggd2lsbCBmaWd1cmUgb3V0IGlmIHRoZSBkZXZpY2UgaXMgcmVtb3ZlZC4KICAqLwotI2lmZGVmIFdMQ19ISUdIX09OTFkKLSNkZWZpbmUgREVWSUNFUkVNT1ZFRCh3bGMpCSghd2xjLT5kZXZpY2VfcHJlc2VudCkKLSNlbHNlCiAjZGVmaW5lIERFVklDRVJFTU9WRUQod2xjKSAgICAgIFwKIAkoKHdsYy0+aHctPmNsaykgPyAgIFwKIAkoKFJfUkVHKHdsYy0+aHctPm9zaCwgJndsYy0+aHctPnJlZ3MtPm1hY2NvbnRyb2wpICYgXAogCShNQ1RMX1BTTV9KTVBfMCB8IE1DVExfSUhSX0VOKSkgIT0gTUNUTF9JSFJfRU4pIDogXAogCShzaV9kZXZpY2VyZW1vdmVkKHdsYy0+aHctPnNpaCkpKQotI2VuZGlmCQkJCS8qIFdMQ19ISUdIX09OTFkgKi8KIAogI2RlZmluZSBXTENXTFVOSVQod2xjKQkJKCh3bGMpLT5wdWItPnVuaXQpCiAKQEAgLTMxNSwyMiArMzAyLDIwIEBACiAvKgogICogY29yZSBzdGF0ZSAobWFjKQogICovCi10eXBlZGVmIHN0cnVjdCB3bGNjb3JlIHsKLSNpZmRlZiBXTENfTE9XCitzdHJ1Y3Qgd2xjY29yZSB7CiAJdWludCBjb3JlaWR4OwkJLyogIyBzYiBlbnVtZXJhdGVkIGNvcmUgKi8KIAogCS8qIGZpZm8gKi8KIAl1aW50ICp0eGF2YWlsW05GSUZPXTsJLyogIyB0eCBkZXNjcmlwdG9ycyBhdmFpbGFibGUgKi8KIAlzMTYgdHhwa3RwZW5kW05GSUZPXTsJLyogdHggYWRtaXNzaW9uIGNvbnRyb2wgKi8KLSNlbmRpZgkJCQkvKiBXTENfTE9XICovCiAKIAltYWNzdGF0X3QgKm1hY3N0YXRfc25hcHNob3Q7CS8qIG1hYyBodyBwcmV2IHJlYWQgdmFsdWVzICovCi19IHdsY2NvcmVfdDsKK307CiAKIC8qCiAgKiBiYW5kIHN0YXRlIChwaHkrYW5hK3JhZGlvKQogICovCi10eXBlZGVmIHN0cnVjdCB3bGNiYW5kIHsKK3N0cnVjdCB3bGNiYW5kIHsKIAlpbnQgYmFuZHR5cGU7CQkvKiBXTENfQkFORF8yRywgV0xDX0JBTkRfNUcgKi8KIAl1aW50IGJhbmR1bml0OwkJLyogYmFuZHN0YXRlW10gaW5kZXggKi8KIApAQCAtMzU5LDEzICszNDQsMTMgQEAKIAl1MTYgQ1dtaW47CQkvKiBUaGUgbWluaW11bSBzaXplIG9mIGNvbnRlbnRpb24gd2luZG93LCBpbiB1bml0IG9mIGFTbG90VGltZSAqLwogCXUxNiBDV21heDsJCS8qIFRoZSBtYXhpbXVtIHNpemUgb2YgY29udGVudGlvbiB3aW5kb3csIGluIHVuaXQgb2YgYVNsb3RUaW1lICovCiAJdTE2IGJjbnRzZm9mZjsJLyogYmVhY29uIHRzZiBvZmZzZXQgKi8KLX0gd2xjYmFuZF90OworfTsKIAogLyogZ2VuZXJpYyBmdW5jdGlvbiBjYWxsYmFjayB0YWtlcyBqdXN0IG9uZSBhcmcgKi8KIHR5cGVkZWYgdm9pZCAoKmNiX2ZuX3QpICh2b2lkICopOwogCiAvKiB0eCBjb21wbGV0aW9uIGNhbGxiYWNrIHRha2VzIDMgYXJncyAqLwotdHlwZWRlZiB2b2lkICgqcGtjYl9mbl90KSAod2xjX2luZm9fdCAqd2xjLCB1aW50IHR4c3RhdHVzLCB2b2lkICphcmcpOwordHlwZWRlZiB2b2lkICgqcGtjYl9mbl90KSAoc3RydWN0IHdsY19pbmZvICp3bGMsIHVpbnQgdHhzdGF0dXMsIHZvaWQgKmFyZyk7CiAKIHR5cGVkZWYgc3RydWN0IHBrdF9jYiB7CiAJcGtjYl9mbl90IGZuOwkJLyogZnVuY3Rpb24gdG8gY2FsbCB3aGVuIHR4IGZyYW1lIGNvbXBsZXRlcyAqLwpAQCAtMzk4LDE0ICszODMsMTQgQEAKIAogLyogdmlydHVhbCBpbnRlcmZhY2UgKi8KIHN0cnVjdCB3bGNfaWYgewotCXdsY19pZl90ICpuZXh0OworCXN0cnVjdCB3bGNfaWYgKm5leHQ7CiAJdTggdHlwZTsJCS8qIFdMQ19JRlRZUEVfQlNTIG9yIFdMQ19JRlRZUEVfV0RTICovCiAJdTggaW5kZXg7CQkvKiBhc3NpZ25lZCBpbiB3bF9hZGRfaWYoKSwgaW5kZXggb2YgdGhlIHdsaWYgaWYgYW55LAogCQkJCSAqIG5vdCBuZWNlc3NhcmlseSBjb3JyZXNwb25kaW5nIHRvIGJzc2NmZy5faWR4IG9yCiAJCQkJICogQUlEMlBWQk1BUChzY2IpLgogCQkJCSAqLwogCXU4IGZsYWdzOwkJLyogZmxhZ3MgZm9yIHRoZSBpbnRlcmZhY2UgKi8KLQl3bF9pZl90ICp3bGlmOwkJLyogcG9pbnRlciB0byB3bGlmICovCisJc3RydWN0IHdsX2lmICp3bGlmOwkJLyogcG9pbnRlciB0byB3bGlmICovCiAJc3RydWN0IHdsY190eHFfaW5mbyAqcWk7CS8qIHBvaW50ZXIgdG8gYXNzb2NpYXRlZCB0eCBxdWV1ZSAqLwogCXVuaW9uIHsKIAkJc3RydWN0IHNjYiAqc2NiOwkvKiBwb2ludGVyIHRvIHNjYiBpZiBXTENfSUZUWVBFX1dEUyAqLwpAQCAtNDE2LDcgKzQwMSw2IEBACiAvKiBmbGFncyBmb3IgdGhlIGludGVyZmFjZSAqLwogI2RlZmluZSBXTENfSUZfTElOS0VECQkweDAyCS8qIHRoaXMgaW50ZXJmYWNlIGlzIGxpbmtlZCB0byBhIHdsX2lmICovCiAKLSNpZmRlZiBXTENfTE9XCiB0eXBlZGVmIHN0cnVjdCB3bGNfaHdiYW5kIHsKIAlpbnQgYmFuZHR5cGU7CQkvKiBXTENfQkFORF8yRywgV0xDX0JBTkRfNUcgKi8KIAl1aW50IGJhbmR1bml0OwkJLyogYmFuZHN0YXRlW10gaW5kZXggKi8KQEAgLTQzMywyMCArNDE3LDE1IEBACiAJd2xjX3BoeV90ICpwaTsJCS8qIHBvaW50ZXIgdG8gcGh5IHNwZWNpZmljIGluZm9ybWF0aW9uICovCiAJYm9vbCBhYmdwaHlfZW5jb3JlOwogfSB3bGNfaHdiYW5kX3Q7Ci0jZW5kaWYJCQkJLyogV0xDX0xPVyAqLwogCiBzdHJ1Y3Qgd2xjX2h3X2luZm8gewotI2lmZGVmIFdMQ19TUExJVAotCXJwY19pbmZvX3QgKnJwYzsJLyogSGFuZGxlIHRvIFJQQyBtb2R1bGUgKi8KLSNlbmRpZgotCW9zbF90ICpvc2g7CQkvKiBwb2ludGVyIHRvIG9zIGhhbmRsZSAqLworCXN0cnVjdCBvc2xfaW5mbyAqb3NoOwkJLyogcG9pbnRlciB0byBvcyBoYW5kbGUgKi8KIAlib29sIF9waW9tb2RlOwkJLyogdHJ1ZSBpZiBwaW8gbW9kZSAqLwotCXdsY19pbmZvX3QgKndsYzsKKwlzdHJ1Y3Qgd2xjX2luZm8gKndsYzsKIAogCS8qIGZpZm8gKi8KLQlobmRkbWFfdCAqZGlbTkZJRk9dOwkvKiBobmRkbWEgaGFuZGxlcywgcGVyIGZpZm8gKi8KKwlzdHJ1Y3QgaG5kZG1hX3B1YiAqZGlbTkZJRk9dOwkvKiBobmRkbWEgaGFuZGxlcywgcGVyIGZpZm8gKi8KIAotI2lmZGVmIFdMQ19MT1cKIAl1aW50IHVuaXQ7CQkvKiBkZXZpY2UgaW5zdGFuY2UgbnVtYmVyICovCiAKIAkvKiB2ZXJzaW9uIGluZm8gKi8KQEAgLTQ5NywzMSArNDc2LDIxIEBACiAJYm9vbCBmb3JjZWZhc3RjbGs7CS8qIHRydWUgaWYgdGhlIGgvdyBpcyBmb3JjaW5nIHRoZSB1c2Ugb2YgZmFzdCBjbGsgKi8KIAlib29sIGNsazsJCS8qIGNvcmUgaXMgb3V0IG9mIHJlc2V0IGFuZCBoYXMgY2xvY2sgKi8KIAlib29sIHNiY2xrOwkJLyogc2IgaGFzIGNsb2NrICovCi0JYm1hY19wbXFfdCAqYm1hY19wbXE7CS8qICBibWFjIFBNIHN0YXRlcyBkZXJpdmVkIGZyb20gdWNvZGUgUE1RICovCisJc3RydWN0IGJtYWNfcG1xICpibWFjX3BtcTsgLyogIGJtYWMgUE0gc3RhdGVzIGRlcml2ZWQgZnJvbSB1Y29kZSBQTVEgKi8KIAlib29sIHBoeWNsazsJCS8qIHBoeSBpcyBvdXQgb2YgcmVzZXQgYW5kIGhhcyBjbG9jayAqLwogCWJvb2wgZG1hX2xwYms7CQkvKiBjb3JlIGlzIGluIERNQSBsb29wYmFjayAqLwogCi0jaWZkZWYgQkNNU0RJTwotCXZvaWQgKnNkaDsKLSNlbmRpZgogCWJvb2wgdWNvZGVfbG9hZGVkOwkvKiB0cnVlIGFmdGVyIHVjb2RlIGRvd25sb2FkZWQgKi8KIAotI2lmZGVmIFdMQ19MT1dfT05MWQotCXN0cnVjdCB3bF90aW1lciAqd2R0aW1lcjsJLyogdGltZXIgZm9yIHdhdGNoZG9nIHJvdXRpbmUgKi8KLQlzdHJ1Y3QgZXRoZXJfYWRkciBvcmlnX2V0aGVyYWRkcjsJLyogb3JpZ2luYWwgaHcgZXRoZXJuZXQgYWRkcmVzcyAqLwotCXUxNiBycGNfZG5nbF9hZ2c7CS8qIHJwYyBhZ2cgY29udHJvbCBmb3IgZG9uZ2xlICovCi0JdTMyIG1lbV9yZXF1aXJlZF9kZWY7CS8qIG1lbW9yeSByZXF1aXJlZCB0byByZXBsZW5pc2ggUlggRE1BIHJpbmcgKi8KLQl1MzIgbWVtX3JlcXVpcmVkX2xvd2VyOwkvKiBtZW1vcnkgcmVxdWlyZWQgd2l0aCBsb3dlciBSWCBib3VuZCAqLwotCXUzMiBtZW1fcmVxdWlyZWRfbGVhc3Q7CS8qIG1pbmltdW0gbWVtb3J5IHJlcXVpcmVtZW50IHRvIGhhbmRsZSBSWCAqLwotCi0jZW5kaWYJCQkJLyogV0xDX0xPV19PTkxZICovCiAKIAl1OCBod19zdGZfc3Nfb3Btb2RlOwkvKiBTVEYgc2luZ2xlIHN0cmVhbSBvcGVyYXRpb24gbW9kZSAqLwogCXU4IGFudHNlbF90eXBlOwkvKiBUeXBlIG9mIGJvYXJkbGV2ZWwgbWltbyBhbnRlbm5hIHN3aXRjaC1sb2dpYwogCQkJCSAqIDAgPSBOL0EsIDEgPSAyeDQgYm9hcmQsIDIgPSAyeDMgQ0IyIGJvYXJkCiAJCQkJICovCi0JdTMyIGFudHNlbF9hdmFpbDsJLyogcHV0IGFudHNlbF9pbmZvX3QgaGVyZSBpZiBtb3JlIGluZm8gaXMgbmVlZGVkICovCi0jZW5kaWYJCQkJLyogV0xDX0xPVyAqLworCXUzMiBhbnRzZWxfYXZhaWw7CS8qCisJCQkJICogcHV0IHN0cnVjdCBhbnRzZWxfaW5mbyBoZXJlIGlmIG1vcmUgaW5mbyBpcworCQkJCSAqIG5lZWRlZAorCQkJCSAqLwogfTsKIAogLyogVFggUXVldWUgaW5mb3JtYXRpb24KQEAgLTU0MSwxNSArNTEwLDEyIEBACiAgKiBQcmluY2lwYWwgY29tbW9uIChvcy1pbmRlcGVuZGVudCkgc29mdHdhcmUgZGF0YSBzdHJ1Y3R1cmUuCiAgKi8KIHN0cnVjdCB3bGNfaW5mbyB7Ci0Jd2xjX3B1Yl90ICpwdWI7CQkvKiBwb2ludGVyIHRvIHdsYyBwdWJsaWMgc3RhdGUgKi8KLQlvc2xfdCAqb3NoOwkJLyogcG9pbnRlciB0byBvcyBoYW5kbGUgKi8KKwlzdHJ1Y3Qgd2xjX3B1YiAqcHViOwkJLyogcG9pbnRlciB0byB3bGMgcHVibGljIHN0YXRlICovCisJc3RydWN0IG9zbF9pbmZvICpvc2g7CQkvKiBwb2ludGVyIHRvIG9zIGhhbmRsZSAqLwogCXN0cnVjdCB3bF9pbmZvICp3bDsJLyogcG9pbnRlciB0byBvcy1zcGVjaWZpYyBwcml2YXRlIHN0YXRlICovCiAJZDExcmVnc190ICpyZWdzOwkvKiBwb2ludGVyIHRvIGRldmljZSByZWdpc3RlcnMgKi8KIAotCXdsY19od19pbmZvX3QgKmh3OwkvKiBIVyByZWxhdGVkIHN0YXRlIHVzZWQgcHJpbWFyaWx5IGJ5IEJNQUMgKi8KLSNpZmRlZiBXTENfU1BMSVQKLQlycGNfaW5mb190ICpycGM7CS8qIEhhbmRsZSB0byBSUEMgbW9kdWxlICovCi0jZW5kaWYKKwlzdHJ1Y3Qgd2xjX2h3X2luZm8gKmh3OwkvKiBIVyByZWxhdGVkIHN0YXRlIHVzZWQgcHJpbWFyaWx5IGJ5IEJNQUMgKi8KIAogCS8qIGNsb2NrICovCiAJaW50IGNsa3JlcV9vdmVycmlkZTsJLyogc2V0dGluZyBmb3IgY2xrcmVxIGZvciBQQ0lFIDogQXV0bywgMCwgMSAqLwpAQCAtNTY2LDEwICs1MzIsMTEgQEAKIAlib29sIGNsazsJCS8qIGNvcmUgaXMgb3V0IG9mIHJlc2V0IGFuZCBoYXMgY2xvY2sgKi8KIAogCS8qIG11bHRpYmFuZCAqLwotCXdsY2NvcmVfdCAqY29yZTsJLyogcG9pbnRlciB0byBhY3RpdmUgaW8gY29yZSAqLwotCXdsY2JhbmRfdCAqYmFuZDsJLyogcG9pbnRlciB0byBhY3RpdmUgcGVyLWJhbmQgc3RhdGUgKi8KLQl3bGNjb3JlX3QgKmNvcmVzdGF0ZTsJLyogcGVyLWNvcmUgc3RhdGUgKG9uZSBwZXIgaHcgY29yZSkgKi8KLQl3bGNiYW5kX3QgKmJhbmRzdGF0ZVtNQVhCQU5EU107CS8qIHBlci1iYW5kIHN0YXRlIChvbmUgcGVyIHBoeS9yYWRpbykgKi8KKwlzdHJ1Y3Qgd2xjY29yZSAqY29yZTsJLyogcG9pbnRlciB0byBhY3RpdmUgaW8gY29yZSAqLworCXN0cnVjdCB3bGNiYW5kICpiYW5kOwkvKiBwb2ludGVyIHRvIGFjdGl2ZSBwZXItYmFuZCBzdGF0ZSAqLworCXN0cnVjdCB3bGNjb3JlICpjb3Jlc3RhdGU7CS8qIHBlci1jb3JlIHN0YXRlIChvbmUgcGVyIGh3IGNvcmUpICovCisJLyogcGVyLWJhbmQgc3RhdGUgKG9uZSBwZXIgcGh5L3JhZGlvKTogKi8KKwlzdHJ1Y3Qgd2xjYmFuZCAqYmFuZHN0YXRlW01BWEJBTkRTXTsKIAogCWJvb2wgd2FyMTYxNjU7CQkvKiBQQ0kgc2xvdyBjbG9jayAxNjE2NSB3YXIgZmxhZyAqLwogCkBAIC01ODQsMTUgKzU1MSw5IEBACiAJczggdHhwd3JfbG9jYWxfbWF4OwkvKiByZWd1bGF0b3J5IGxvY2FsIHR4cHdyIG1heCAqLwogCXU4IHR4cHdyX2xvY2FsX2NvbnN0cmFpbnQ7CS8qIGxvY2FsIHBvd2VyIGNvbnRyYWludCBpbiBkQiAqLwogCi0jaWZkZWYgV0xDX0hJR0hfT05MWQotCXJwY3R4X2luZm9fdCAqcnBjdHg7CS8qIFJQQyBUWCBtb2R1bGUgKi8KLQlib29sIHJlc2V0X2JtYWNfcGVuZGluZzsJLyogYm1hYyByZXNldCBpcyBpbiBwcm9ncmVzc2luZyAqLwotCXUzMiBycGNfYWdnOwkJLyogaG9zdCBhZ2c6IGJpdCAxNi0zMSwgYm1hYyBhZ2c6IGJpdCAwLTE1ICovCi0JdTMyIHJwY19tc2dsZXZlbDsJLyogaG9zdCBycGM6IGJpdCAxNi0zMSwgYm1hYyBycGM6IGJpdCAwLTE1ICovCi0jZW5kaWYKIAotCWFtcGR1X2luZm9fdCAqYW1wZHU7CS8qIGFtcGR1IG1vZHVsZSBoYW5kbGVyICovCi0JYW50c2VsX2luZm9fdCAqYXNpOwkvKiBhbnRzZWwgbW9kdWxlIGhhbmRsZXIgKi8KKwlzdHJ1Y3QgYW1wZHVfaW5mbyAqYW1wZHU7CS8qIGFtcGR1IG1vZHVsZSBoYW5kbGVyICovCisJc3RydWN0IGFudHNlbF9pbmZvICphc2k7CS8qIGFudHNlbCBtb2R1bGUgaGFuZGxlciAqLwogCXdsY19jbV9pbmZvX3QgKmNtaTsJLyogY2hhbm5lbCBtYW5hZ2VyIG1vZHVsZSBoYW5kbGVyICovCiAKIAl2b2lkICpidHBhcmFtOwkJLyogYnVzIHR5cGUgc3BlY2lmaWMgY29va2llICovCkBAIC03OTIsOCArNzUzLDYgQEAKIAlhY19iaXRtYXBfdCBhcHNkX3RyaWdnZXJfYWM7CS8qIFBlcm1pc3NpYmxlIEFjZXNzIENhdGVnb3J5IGluIHdoaWNoIEFQU0QgTnVsbAogCQkJCQkgKiBUcmlnZ2VyIGZyYW1lcyBjYW4gYmUgc2VuZAogCQkJCQkgKi8KLQl3bGNfYXBfaW5mb190ICphcDsKLQogCXU4IGh0cGh5X21lbWJlcnNoaXA7CS8qIEhUIFBIWSBtZW1iZXJzaGlwICovCiAKIAlib29sIF9yZWd1bGF0b3J5X2RvbWFpbjsJLyogODAyLjExZCBlbmFibGVkPyAqLwpAQCAtODExLDcgKzc3MCw3IEBACiAKIAl1MTYgbmV4dF9ic3NjZmdfSUQ7CiAKLQl3bGNfaWZfdCAqd2xjaWZfbGlzdDsJLyogbGlua2VkIGxpc3Qgb2Ygd2xjX2lmIHN0cnVjdHMgKi8KKwlzdHJ1Y3Qgd2xjX2lmICp3bGNpZl9saXN0OwkvKiBsaW5rZWQgbGlzdCBvZiB3bGNfaWYgc3RydWN0cyAqLwogCXdsY190eHFfaW5mb190ICphY3RpdmVfcXVldWU7CS8qIHR4cSBmb3IgdGhlIGN1cnJlbnRseSBhY3RpdmUgdHJhbnNtaXQgY29udGV4dCAqLwogCXUzMiBtcGNfZHVyOwkJLyogdG90YWwgdGltZSAobXMpIGluIG1wYyBtb2RlIGV4Y2VwdCBmb3IgdGhlCiAJCQkJICogcG9ydGlvbiBzaW5jZSByYWRpbyBpcyB0dXJuZWQgb2ZmIGxhc3QgdGltZQpAQCAtODI1LDggKzc4NCw4IEBACiAKIC8qIGFudHNlbCBtb2R1bGUgc3BlY2lmaWMgc3RhdGUgKi8KIHN0cnVjdCBhbnRzZWxfaW5mbyB7Ci0Jd2xjX2luZm9fdCAqd2xjOwkvKiBwb2ludGVyIHRvIG1haW4gd2xjIHN0cnVjdHVyZSAqLwotCXdsY19wdWJfdCAqcHViOwkJLyogcG9pbnRlciB0byBwdWJsaWMgZm4gKi8KKwlzdHJ1Y3Qgd2xjX2luZm8gKndsYzsJLyogcG9pbnRlciB0byBtYWluIHdsYyBzdHJ1Y3R1cmUgKi8KKwlzdHJ1Y3Qgd2xjX3B1YiAqcHViOwkJLyogcG9pbnRlciB0byBwdWJsaWMgZm4gKi8KIAl1OCBhbnRzZWxfdHlwZTsJLyogVHlwZSBvZiBib2FyZGxldmVsIG1pbW8gYW50ZW5uYSBzd2l0Y2gtbG9naWMKIAkJCQkgKiAwID0gTi9BLCAxID0gMng0IGJvYXJkLCAyID0gMngzIENCMiBib2FyZAogCQkJCSAqLwpAQCAtODQyLDIzICs4MDEsOSBAQAogI2RlZmluZSBJU19NQkFORF9VTkxPQ0tFRCh3bGMpIFwKIAkoKE5CQU5EUyh3bGMpID4gMSkgJiYgISh3bGMpLT5iYW5kbG9ja2VkKQogCi0jaWZkZWYgV0xDX0xPVwogI2RlZmluZSBXTENfQkFORF9QSV9SQURJT19DSEFOU1BFQyB3bGNfcGh5X2NoYW5zcGVjX2dldCh3bGMtPmJhbmQtPnBpKQotI2Vsc2UKLSNkZWZpbmUgV0xDX0JBTkRfUElfUkFESU9fQ0hBTlNQRUMgKHdsYy0+Y2hhbnNwZWMpCi0jZW5kaWYKIAogLyogc3VtIHRoZSBpbmRpdmlkdWFsIGZpZm8gdHggcGVuZGluZyBwYWNrZXQgY291bnRzICovCi0jaWYgZGVmaW5lZChXTENfSElHSF9PTkxZKQotI2RlZmluZSBUWFBLVFBFTkRUT1Qod2xjKQkJKHdsY19ycGN0eF90eHBrdHBlbmQoKHdsYyktPnJwY3R4LCAwLCB0cnVlKSkKLSNkZWZpbmUgVFhQS1RQRU5ER0VUKHdsYywgZmlmbykJCSh3bGNfcnBjdHhfdHhwa3RwZW5kKCh3bGMpLT5ycGN0eCwgKGZpZm8pLCBmYWxzZSkpCi0jZGVmaW5lIFRYUEtUUEVORElOQyh3bGMsIGZpZm8sIHZhbCkJKHdsY19ycGN0eF90eHBrdHBlbmRpbmMoKHdsYyktPnJwY3R4LCAoZmlmbyksICh2YWwpKSkKLSNkZWZpbmUgVFhQS1RQRU5EREVDKHdsYywgZmlmbywgdmFsKQkod2xjX3JwY3R4X3R4cGt0cGVuZGRlYygod2xjKS0+cnBjdHgsIChmaWZvKSwgKHZhbCkpKQotI2RlZmluZSBUWFBLVFBFTkRDTFIod2xjLCBmaWZvKQkJKHdsY19ycGN0eF90eHBrdHBlbmRjbHIoKHdsYyktPnJwY3R4LCAoZmlmbykpKQotI2RlZmluZSBUWEFWQUlMKHdsYywgZmlmbykJCSh3bGNfcnBjdHhfdHhhdmFpbCgod2xjKS0+cnBjdHgsIChmaWZvKSkpCi0jZGVmaW5lIEdFVE5FWFRUWFAod2xjLCBfcXVldWUpCQkod2xjX3JwY3R4X2dldG5leHR0eHAoKHdsYyktPnJwY3R4LCAoX3F1ZXVlKSkpCi0KLSNlbHNlCiAjZGVmaW5lCVRYUEtUUEVORFRPVCh3bGMpICgod2xjKS0+Y29yZS0+dHhwa3RwZW5kWzBdICsgKHdsYyktPmNvcmUtPnR4cGt0cGVuZFsxXSArIFwKIAkod2xjKS0+Y29yZS0+dHhwa3RwZW5kWzJdICsgKHdsYyktPmNvcmUtPnR4cGt0cGVuZFszXSkKICNkZWZpbmUgVFhQS1RQRU5ER0VUKHdsYywgZmlmbykJCSgod2xjKS0+Y29yZS0+dHhwa3RwZW5kWyhmaWZvKV0pCkBAIC04NjgsNDggKzgxMyw0OSBAQAogI2RlZmluZSBUWEFWQUlMKHdsYywgZmlmbykJCSgqKHdsYyktPmNvcmUtPnR4YXZhaWxbKGZpZm8pXSkKICNkZWZpbmUgR0VUTkVYVFRYUCh3bGMsIF9xdWV1ZSkJCQkJCQkJCVwKIAkJZG1hX2dldG5leHR0eHAoKHdsYyktPmh3LT5kaVsoX3F1ZXVlKV0sIEhORERNQV9SQU5HRV9UUkFOU01JVFRFRCkKLSNlbmRpZgkJCQkvKiBXTENfSElHSF9PTkxZICovCiAKICNkZWZpbmUgV0xDX0lTX01BVENIX1NTSUQod2xjLCBzc2lkMSwgc3NpZDIsIGxlbjEsIGxlbjIpIFwKLQkoKGxlbjEgPT0gbGVuMikgJiYgIWJjbXAoc3NpZDEsIHNzaWQyLCBsZW4xKSkKKwkoKGxlbjEgPT0gbGVuMikgJiYgIW1lbWNtcChzc2lkMSwgc3NpZDIsIGxlbjEpKQogCi0vKiBBUEkgc2hhcmVkIGJ5IGJvdGggV0xDX0hJR0ggYW5kIFdMQ19MT1cgZHJpdmVyICovCi1leHRlcm4gdm9pZCB3bGNfaGlnaF9kcGMod2xjX2luZm9fdCAqd2xjLCB1MzIgbWFjaW50c3RhdHVzKTsKLWV4dGVybiB2b2lkIHdsY19mYXRhbF9lcnJvcih3bGNfaW5mb190ICp3bGMpOwotZXh0ZXJuIHZvaWQgd2xjX2JtYWNfcnBjX3dhdGNoZG9nKHdsY19pbmZvX3QgKndsYyk7Ci1leHRlcm4gdm9pZCB3bGNfcmVjdih3bGNfaW5mb190ICp3bGMsIHZvaWQgKnApOwotZXh0ZXJuIGJvb2wgd2xjX2RvdHhzdGF0dXMod2xjX2luZm9fdCAqd2xjLCB0eF9zdGF0dXNfdCAqdHhzLCB1MzIgZnJtX3R4Mik7Ci1leHRlcm4gdm9pZCB3bGNfdHhmaWZvKHdsY19pbmZvX3QgKndsYywgdWludCBmaWZvLCB2b2lkICpwLCBib29sIGNvbW1pdCwKLQkJICAgICAgIHM4IHR4cGt0cGVuZCk7Ci1leHRlcm4gdm9pZCB3bGNfdHhmaWZvX2NvbXBsZXRlKHdsY19pbmZvX3QgKndsYywgdWludCBmaWZvLCBzOCB0eHBrdHBlbmQpOwotZXh0ZXJuIHZvaWQgd2xjX2luZm9faW5pdCh3bGNfaW5mb190ICp3bGMsIGludCB1bml0KTsKK2V4dGVybiB2b2lkIHdsY19oaWdoX2RwYyhzdHJ1Y3Qgd2xjX2luZm8gKndsYywgdTMyIG1hY2ludHN0YXR1cyk7CitleHRlcm4gdm9pZCB3bGNfZmF0YWxfZXJyb3Ioc3RydWN0IHdsY19pbmZvICp3bGMpOworZXh0ZXJuIHZvaWQgd2xjX2JtYWNfcnBjX3dhdGNoZG9nKHN0cnVjdCB3bGNfaW5mbyAqd2xjKTsKK2V4dGVybiB2b2lkIHdsY19yZWN2KHN0cnVjdCB3bGNfaW5mbyAqd2xjLCBzdHJ1Y3Qgc2tfYnVmZiAqcCk7CitleHRlcm4gYm9vbCB3bGNfZG90eHN0YXR1cyhzdHJ1Y3Qgd2xjX2luZm8gKndsYywgdHhfc3RhdHVzX3QgKnR4cywgdTMyIGZybV90eDIpOworZXh0ZXJuIHZvaWQgd2xjX3R4ZmlmbyhzdHJ1Y3Qgd2xjX2luZm8gKndsYywgdWludCBmaWZvLCBzdHJ1Y3Qgc2tfYnVmZiAqcCwKKwkJICAgICAgIGJvb2wgY29tbWl0LCBzOCB0eHBrdHBlbmQpOworZXh0ZXJuIHZvaWQgd2xjX3R4Zmlmb19jb21wbGV0ZShzdHJ1Y3Qgd2xjX2luZm8gKndsYywgdWludCBmaWZvLCBzOCB0eHBrdHBlbmQpOworZXh0ZXJuIHZvaWQgd2xjX3R4cV9lbnEodm9pZCAqY3R4LCBzdHJ1Y3Qgc2NiICpzY2IsIHN0cnVjdCBza19idWZmICpzZHUsCisJCQl1aW50IHByZWMpOworZXh0ZXJuIHZvaWQgd2xjX2luZm9faW5pdChzdHJ1Y3Qgd2xjX2luZm8gKndsYywgaW50IHVuaXQpOwogZXh0ZXJuIHZvaWQgd2xjX3ByaW50X3R4c3RhdHVzKHR4X3N0YXR1c190ICp0eHMpOwotZXh0ZXJuIGludCB3bGNfeG10Zmlmb19zel9nZXQod2xjX2luZm9fdCAqd2xjLCB1aW50IGZpZm8sIHVpbnQgKmJsb2Nrcyk7Ci1leHRlcm4gdm9pZCB3bGNfd3JpdGVfdGVtcGxhdGVfcmFtKHdsY19pbmZvX3QgKndsYywgaW50IG9mZnNldCwgaW50IGxlbiwKK2V4dGVybiBpbnQgd2xjX3htdGZpZm9fc3pfZ2V0KHN0cnVjdCB3bGNfaW5mbyAqd2xjLCB1aW50IGZpZm8sIHVpbnQgKmJsb2Nrcyk7CitleHRlcm4gdm9pZCB3bGNfd3JpdGVfdGVtcGxhdGVfcmFtKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCBpbnQgb2Zmc2V0LCBpbnQgbGVuLAogCQkJCSAgIHZvaWQgKmJ1Zik7Ci1leHRlcm4gdm9pZCB3bGNfd3JpdGVfaHdfYmNudGVtcGxhdGVzKHdsY19pbmZvX3QgKndsYywgdm9pZCAqYmNuLCBpbnQgbGVuLAorZXh0ZXJuIHZvaWQgd2xjX3dyaXRlX2h3X2JjbnRlbXBsYXRlcyhzdHJ1Y3Qgd2xjX2luZm8gKndsYywgdm9pZCAqYmNuLCBpbnQgbGVuLAogCQkJCSAgICAgIGJvb2wgYm90aCk7CiAjaWYgZGVmaW5lZChCQ01EQkcpCi1leHRlcm4gdm9pZCB3bGNfZ2V0X3JjbXRhKHdsY19pbmZvX3QgKndsYywgaW50IGlkeCwgc3RydWN0IGV0aGVyX2FkZHIgKmFkZHIpOworZXh0ZXJuIHZvaWQgd2xjX2dldF9yY210YShzdHJ1Y3Qgd2xjX2luZm8gKndsYywgaW50IGlkeCwKKwkJCSAgc3RydWN0IGV0aGVyX2FkZHIgKmFkZHIpOwogI2VuZGlmCi1leHRlcm4gdm9pZCB3bGNfc2V0X3JjbXRhKHdsY19pbmZvX3QgKndsYywgaW50IGlkeCwKK2V4dGVybiB2b2lkIHdsY19zZXRfcmNtdGEoc3RydWN0IHdsY19pbmZvICp3bGMsIGludCBpZHgsCiAJCQkgIGNvbnN0IHN0cnVjdCBldGhlcl9hZGRyICphZGRyKTsKLWV4dGVybiB2b2lkIHdsY19zZXRfYWRkcm1hdGNoKHdsY19pbmZvX3QgKndsYywgaW50IG1hdGNoX3JlZ19vZmZzZXQsCitleHRlcm4gdm9pZCB3bGNfc2V0X2FkZHJtYXRjaChzdHJ1Y3Qgd2xjX2luZm8gKndsYywgaW50IG1hdGNoX3JlZ19vZmZzZXQsCiAJCQkgICAgICBjb25zdCBzdHJ1Y3QgZXRoZXJfYWRkciAqYWRkcik7Ci1leHRlcm4gdm9pZCB3bGNfcmVhZF90c2Yod2xjX2luZm9fdCAqd2xjLCB1MzIgKnRzZl9sX3B0ciwKK2V4dGVybiB2b2lkIHdsY19yZWFkX3RzZihzdHJ1Y3Qgd2xjX2luZm8gKndsYywgdTMyICp0c2ZfbF9wdHIsCiAJCQkgdTMyICp0c2ZfaF9wdHIpOwotZXh0ZXJuIHZvaWQgd2xjX3NldF9jd21pbih3bGNfaW5mb190ICp3bGMsIHUxNiBuZXdtaW4pOwotZXh0ZXJuIHZvaWQgd2xjX3NldF9jd21heCh3bGNfaW5mb190ICp3bGMsIHUxNiBuZXdtYXgpOwotZXh0ZXJuIHZvaWQgd2xjX2ZpZm9lcnJvcnMod2xjX2luZm9fdCAqd2xjKTsKLWV4dGVybiB2b2lkIHdsY19wbGxyZXEod2xjX2luZm9fdCAqd2xjLCBib29sIHNldCwgbWJvb2wgcmVxX2JpdCk7Ci1leHRlcm4gdm9pZCB3bGNfcmVzZXRfYm1hY19kb25lKHdsY19pbmZvX3QgKndsYyk7Ci1leHRlcm4gdm9pZCB3bGNfcHJvdGVjdGlvbl91cGQod2xjX2luZm9fdCAqd2xjLCB1aW50IGlkeCwgaW50IHZhbCk7Ci1leHRlcm4gdm9pZCB3bGNfaHd0aW1lcl9ncHRpbWVyX3NldCh3bGNfaW5mb190ICp3bGMsIHVpbnQgdXMpOwotZXh0ZXJuIHZvaWQgd2xjX2h3dGltZXJfZ3B0aW1lcl9hYm9ydCh3bGNfaW5mb190ICp3bGMpOworZXh0ZXJuIHZvaWQgd2xjX3NldF9jd21pbihzdHJ1Y3Qgd2xjX2luZm8gKndsYywgdTE2IG5ld21pbik7CitleHRlcm4gdm9pZCB3bGNfc2V0X2N3bWF4KHN0cnVjdCB3bGNfaW5mbyAqd2xjLCB1MTYgbmV3bWF4KTsKK2V4dGVybiB2b2lkIHdsY19maWZvZXJyb3JzKHN0cnVjdCB3bGNfaW5mbyAqd2xjKTsKK2V4dGVybiB2b2lkIHdsY19wbGxyZXEoc3RydWN0IHdsY19pbmZvICp3bGMsIGJvb2wgc2V0LCBtYm9vbCByZXFfYml0KTsKK2V4dGVybiB2b2lkIHdsY19yZXNldF9ibWFjX2RvbmUoc3RydWN0IHdsY19pbmZvICp3bGMpOworZXh0ZXJuIHZvaWQgd2xjX3Byb3RlY3Rpb25fdXBkKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCB1aW50IGlkeCwgaW50IHZhbCk7CitleHRlcm4gdm9pZCB3bGNfaHd0aW1lcl9ncHRpbWVyX3NldChzdHJ1Y3Qgd2xjX2luZm8gKndsYywgdWludCB1cyk7CitleHRlcm4gdm9pZCB3bGNfaHd0aW1lcl9ncHRpbWVyX2Fib3J0KHN0cnVjdCB3bGNfaW5mbyAqd2xjKTsKIAogI2lmIGRlZmluZWQoQkNNREJHKQogZXh0ZXJuIHZvaWQgd2xjX3ByaW50X3J4aChkMTFyeGhkcl90ICpyeGgpOwotZXh0ZXJuIHZvaWQgd2xjX3ByaW50X2hkcnMod2xjX2luZm9fdCAqd2xjLCBjb25zdCBjaGFyICpwcmVmaXgsIHU4ICpmcmFtZSwKK2V4dGVybiB2b2lkIHdsY19wcmludF9oZHJzKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCBjb25zdCBjaGFyICpwcmVmaXgsIHU4ICpmcmFtZSwKIAkJCSAgIGQxMXR4aF90ICp0eGgsIGQxMXJ4aGRyX3QgKnJ4aCwgdWludCBsZW4pOwogZXh0ZXJuIHZvaWQgd2xjX3ByaW50X3R4ZGVzYyhkMTF0eGhfdCAqdHhoKTsKICNlbmRpZgpAQCAtOTE3LDEyNCArODYzLDEyNiBAQAogZXh0ZXJuIHZvaWQgd2xjX3ByaW50X2RvdDExX21hY19oZHIodTggKmJ1ZiwgaW50IGxlbik7CiAjZW5kaWYKIAotI2lmZGVmIFdMQ19MT1cKLWV4dGVybiB2b2lkIHdsY19zZXR4YmFuZCh3bGNfaHdfaW5mb190ICp3bGNfaHcsIHVpbnQgYmFuZHVuaXQpOwotZXh0ZXJuIHZvaWQgd2xjX2NvcmVkaXNhYmxlKHdsY19od19pbmZvX3QgKndsY19odyk7Ci0jZW5kaWYKK2V4dGVybiB2b2lkIHdsY19zZXR4YmFuZChzdHJ1Y3Qgd2xjX2h3X2luZm8gKndsY19odywgdWludCBiYW5kdW5pdCk7CitleHRlcm4gdm9pZCB3bGNfY29yZWRpc2FibGUoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcpOwogCi1leHRlcm4gYm9vbCB3bGNfdmFsaWRfcmF0ZSh3bGNfaW5mb190ICp3bGMsIHJhdGVzcGVjX3QgcmF0ZSwgaW50IGJhbmQsCitleHRlcm4gYm9vbCB3bGNfdmFsaWRfcmF0ZShzdHJ1Y3Qgd2xjX2luZm8gKndsYywgcmF0ZXNwZWNfdCByYXRlLCBpbnQgYmFuZCwKIAkJCSAgIGJvb2wgdmVyYm9zZSk7Ci1leHRlcm4gdm9pZCB3bGNfYXBfdXBkKHdsY19pbmZvX3QgKndsYyk7CitleHRlcm4gdm9pZCB3bGNfYXBfdXBkKHN0cnVjdCB3bGNfaW5mbyAqd2xjKTsKIAogLyogaGVscGVyIGZ1bmN0aW9ucyAqLwotZXh0ZXJuIHZvaWQgd2xjX3NobV9zc2lkX3VwZCh3bGNfaW5mb190ICp3bGMsIHdsY19ic3NjZmdfdCAqY2ZnKTsKLWV4dGVybiBpbnQgd2xjX3NldF9nbW9kZSh3bGNfaW5mb190ICp3bGMsIHU4IGdtb2RlLCBib29sIGNvbmZpZyk7CitleHRlcm4gdm9pZCB3bGNfc2htX3NzaWRfdXBkKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCB3bGNfYnNzY2ZnX3QgKmNmZyk7CitleHRlcm4gaW50IHdsY19zZXRfZ21vZGUoc3RydWN0IHdsY19pbmZvICp3bGMsIHU4IGdtb2RlLCBib29sIGNvbmZpZyk7CiAKLWV4dGVybiB2b2lkIHdsY19tYWNfYmNuX3Byb21pc2NfY2hhbmdlKHdsY19pbmZvX3QgKndsYywgYm9vbCBwcm9taXNjKTsKLWV4dGVybiB2b2lkIHdsY19tYWNfYmNuX3Byb21pc2Mod2xjX2luZm9fdCAqd2xjKTsKLWV4dGVybiB2b2lkIHdsY19tYWNfcHJvbWlzYyh3bGNfaW5mb190ICp3bGMpOwotZXh0ZXJuIHZvaWQgd2xjX3R4Zmxvd2NvbnRyb2wod2xjX2luZm9fdCAqd2xjLCB3bGNfdHhxX2luZm9fdCAqcWksIGJvb2wgb24sCitleHRlcm4gdm9pZCB3bGNfbWFjX2Jjbl9wcm9taXNjX2NoYW5nZShzdHJ1Y3Qgd2xjX2luZm8gKndsYywgYm9vbCBwcm9taXNjKTsKK2V4dGVybiB2b2lkIHdsY19tYWNfYmNuX3Byb21pc2Moc3RydWN0IHdsY19pbmZvICp3bGMpOworZXh0ZXJuIHZvaWQgd2xjX21hY19wcm9taXNjKHN0cnVjdCB3bGNfaW5mbyAqd2xjKTsKK2V4dGVybiB2b2lkIHdsY190eGZsb3djb250cm9sKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCB3bGNfdHhxX2luZm9fdCAqcWksIGJvb2wgb24sCiAJCQkgICAgICBpbnQgcHJpbyk7Ci1leHRlcm4gdm9pZCB3bGNfdHhmbG93Y29udHJvbF9vdmVycmlkZSh3bGNfaW5mb190ICp3bGMsIHdsY190eHFfaW5mb190ICpxaSwKK2V4dGVybiB2b2lkIHdsY190eGZsb3djb250cm9sX292ZXJyaWRlKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCB3bGNfdHhxX2luZm9fdCAqcWksCiAJCQkJICAgICAgIGJvb2wgb24sIHVpbnQgb3ZlcnJpZGUpOwotZXh0ZXJuIGJvb2wgd2xjX3R4Zmxvd2NvbnRyb2xfcHJpb19pc3NldCh3bGNfaW5mb190ICp3bGMsIHdsY190eHFfaW5mb190ICpxaSwKLQkJCQkJIGludCBwcmlvKTsKLWV4dGVybiB2b2lkIHdsY19zZW5kX3Eod2xjX2luZm9fdCAqd2xjLCB3bGNfdHhxX2luZm9fdCAqcWkpOwotZXh0ZXJuIGludCB3bGNfcHJlcF9wZHUod2xjX2luZm9fdCAqd2xjLCB2b2lkICpwZHUsIHVpbnQgKmZpZm8pOworZXh0ZXJuIGJvb2wgd2xjX3R4Zmxvd2NvbnRyb2xfcHJpb19pc3NldChzdHJ1Y3Qgd2xjX2luZm8gKndsYywKKwkJCQkJIHdsY190eHFfaW5mb190ICpxaSwgaW50IHByaW8pOworZXh0ZXJuIHZvaWQgd2xjX3NlbmRfcShzdHJ1Y3Qgd2xjX2luZm8gKndsYywgd2xjX3R4cV9pbmZvX3QgKnFpKTsKK2V4dGVybiBpbnQgd2xjX3ByZXBfcGR1KHN0cnVjdCB3bGNfaW5mbyAqd2xjLCBzdHJ1Y3Qgc2tfYnVmZiAqcGR1LCB1aW50ICpmaWZvKTsKIAotZXh0ZXJuIHUxNiB3bGNfY2FsY19sc2lnX2xlbih3bGNfaW5mb190ICp3bGMsIHJhdGVzcGVjX3QgcmF0ZXNwZWMsCitleHRlcm4gdTE2IHdsY19jYWxjX2xzaWdfbGVuKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCByYXRlc3BlY190IHJhdGVzcGVjLAogCQkJCXVpbnQgbWFjX2xlbik7Ci1leHRlcm4gcmF0ZXNwZWNfdCB3bGNfcnNwZWNfdG9fcnRzX3JzcGVjKHdsY19pbmZvX3QgKndsYywgcmF0ZXNwZWNfdCByc3BlYywKK2V4dGVybiByYXRlc3BlY190IHdsY19yc3BlY190b19ydHNfcnNwZWMoc3RydWN0IHdsY19pbmZvICp3bGMsIHJhdGVzcGVjX3QgcnNwZWMsCiAJCQkJCSBib29sIHVzZV9yc3BlYywgdTE2IG1pbW9fY3RsY2hidyk7Ci1leHRlcm4gdTE2IHdsY19jb21wdXRlX3J0c2N0c19kdXIod2xjX2luZm9fdCAqd2xjLCBib29sIGN0c19vbmx5LAorZXh0ZXJuIHUxNiB3bGNfY29tcHV0ZV9ydHNjdHNfZHVyKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCBib29sIGN0c19vbmx5LAogCQkJCSAgICAgcmF0ZXNwZWNfdCBydHNfcmF0ZSwgcmF0ZXNwZWNfdCBmcmFtZV9yYXRlLAogCQkJCSAgICAgdTggcnRzX3ByZWFtYmxlX3R5cGUsCiAJCQkJICAgICB1OCBmcmFtZV9wcmVhbWJsZV90eXBlLCB1aW50IGZyYW1lX2xlbiwKIAkJCQkgICAgIGJvb2wgYmEpOwogCi1leHRlcm4gdm9pZCB3bGNfdGJ0dCh3bGNfaW5mb190ICp3bGMsIGQxMXJlZ3NfdCAqcmVncyk7CitleHRlcm4gdm9pZCB3bGNfdGJ0dChzdHJ1Y3Qgd2xjX2luZm8gKndsYywgZDExcmVnc190ICpyZWdzKTsKIAogI2lmIGRlZmluZWQoQkNNREJHKQotZXh0ZXJuIHZvaWQgd2xjX2R1bXBfaWUod2xjX2luZm9fdCAqd2xjLCBiY21fdGx2X3QgKmllLCBzdHJ1Y3QgYmNtc3RyYnVmICpiKTsKK2V4dGVybiB2b2lkIHdsY19kdW1wX2llKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCBiY21fdGx2X3QgKmllLAorCQkJc3RydWN0IGJjbXN0cmJ1ZiAqYik7CiAjZW5kaWYKIAotZXh0ZXJuIGJvb2wgd2xjX3BzX2NoZWNrKHdsY19pbmZvX3QgKndsYyk7Ci1leHRlcm4gdm9pZCB3bGNfcmVwcmF0ZV9pbml0KHdsY19pbmZvX3QgKndsYyk7CitleHRlcm4gYm9vbCB3bGNfcHNfY2hlY2soc3RydWN0IHdsY19pbmZvICp3bGMpOworZXh0ZXJuIHZvaWQgd2xjX3JlcHJhdGVfaW5pdChzdHJ1Y3Qgd2xjX2luZm8gKndsYyk7CiBleHRlcm4gdm9pZCB3bGNfYnNzY2ZnX3JlcHJhdGVfaW5pdCh3bGNfYnNzY2ZnX3QgKmJzc2NmZyk7CiBleHRlcm4gdm9pZCB3bGNfdWludDY0X3N1Yih1MzIgKmFfaGlnaCwgdTMyICphX2xvdywgdTMyIGJfaGlnaCwKIAkJCSAgIHUzMiBiX2xvdyk7CiBleHRlcm4gdTMyIHdsY19jYWxjX3RidHRfb2Zmc2V0KHUzMiBiaSwgdTMyIHRzZl9oLCB1MzIgdHNmX2wpOwogCiAvKiBTaGFyZWQgbWVtb3J5IGFjY2VzcyAqLwotZXh0ZXJuIHZvaWQgd2xjX3dyaXRlX3NobSh3bGNfaW5mb190ICp3bGMsIHVpbnQgb2Zmc2V0LCB1MTYgdik7Ci1leHRlcm4gdTE2IHdsY19yZWFkX3NobSh3bGNfaW5mb190ICp3bGMsIHVpbnQgb2Zmc2V0KTsKLWV4dGVybiB2b2lkIHdsY19zZXRfc2htKHdsY19pbmZvX3QgKndsYywgdWludCBvZmZzZXQsIHUxNiB2LCBpbnQgbGVuKTsKLWV4dGVybiB2b2lkIHdsY19jb3B5dG9fc2htKHdsY19pbmZvX3QgKndsYywgdWludCBvZmZzZXQsIGNvbnN0IHZvaWQgKmJ1ZiwKK2V4dGVybiB2b2lkIHdsY193cml0ZV9zaG0oc3RydWN0IHdsY19pbmZvICp3bGMsIHVpbnQgb2Zmc2V0LCB1MTYgdik7CitleHRlcm4gdTE2IHdsY19yZWFkX3NobShzdHJ1Y3Qgd2xjX2luZm8gKndsYywgdWludCBvZmZzZXQpOworZXh0ZXJuIHZvaWQgd2xjX3NldF9zaG0oc3RydWN0IHdsY19pbmZvICp3bGMsIHVpbnQgb2Zmc2V0LCB1MTYgdiwgaW50IGxlbik7CitleHRlcm4gdm9pZCB3bGNfY29weXRvX3NobShzdHJ1Y3Qgd2xjX2luZm8gKndsYywgdWludCBvZmZzZXQsIGNvbnN0IHZvaWQgKmJ1ZiwKIAkJCSAgIGludCBsZW4pOwotZXh0ZXJuIHZvaWQgd2xjX2NvcHlmcm9tX3NobSh3bGNfaW5mb190ICp3bGMsIHVpbnQgb2Zmc2V0LCB2b2lkICpidWYsIGludCBsZW4pOworZXh0ZXJuIHZvaWQgd2xjX2NvcHlmcm9tX3NobShzdHJ1Y3Qgd2xjX2luZm8gKndsYywgdWludCBvZmZzZXQsIHZvaWQgKmJ1ZiwKKwkJCSAgICAgaW50IGxlbik7CiAKLWV4dGVybiB2b2lkIHdsY191cGRhdGVfYmVhY29uKHdsY19pbmZvX3QgKndsYyk7Ci1leHRlcm4gdm9pZCB3bGNfYnNzX3VwZGF0ZV9iZWFjb24od2xjX2luZm9fdCAqd2xjLCBzdHJ1Y3Qgd2xjX2Jzc2NmZyAqYnNzY2ZnKTsKK2V4dGVybiB2b2lkIHdsY191cGRhdGVfYmVhY29uKHN0cnVjdCB3bGNfaW5mbyAqd2xjKTsKK2V4dGVybiB2b2lkIHdsY19ic3NfdXBkYXRlX2JlYWNvbihzdHJ1Y3Qgd2xjX2luZm8gKndsYywKKwkJCQkgIHN0cnVjdCB3bGNfYnNzY2ZnICpic3NjZmcpOwogCi1leHRlcm4gdm9pZCB3bGNfdXBkYXRlX3Byb2JlX3Jlc3Aod2xjX2luZm9fdCAqd2xjLCBib29sIHN1c3BlbmQpOwotZXh0ZXJuIHZvaWQgd2xjX2Jzc191cGRhdGVfcHJvYmVfcmVzcCh3bGNfaW5mb190ICp3bGMsIHdsY19ic3NjZmdfdCAqY2ZnLAorZXh0ZXJuIHZvaWQgd2xjX3VwZGF0ZV9wcm9iZV9yZXNwKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCBib29sIHN1c3BlbmQpOworZXh0ZXJuIHZvaWQgd2xjX2Jzc191cGRhdGVfcHJvYmVfcmVzcChzdHJ1Y3Qgd2xjX2luZm8gKndsYywgd2xjX2Jzc2NmZ190ICpjZmcsCiAJCQkJICAgICAgYm9vbCBzdXNwZW5kKTsKIAotZXh0ZXJuIGJvb2wgd2xjX2lzbXBjKHdsY19pbmZvX3QgKndsYyk7Ci1leHRlcm4gYm9vbCB3bGNfaXNfbm9uX2RlbGF5X21wYyh3bGNfaW5mb190ICp3bGMpOwotZXh0ZXJuIHZvaWQgd2xjX3JhZGlvX21wY191cGQod2xjX2luZm9fdCAqd2xjKTsKLWV4dGVybiBib29sIHdsY19wcmVjX2VucSh3bGNfaW5mb190ICp3bGMsIHN0cnVjdCBwa3RxICpxLCB2b2lkICpwa3QsIGludCBwcmVjKTsKLWV4dGVybiBib29sIHdsY19wcmVjX2VucV9oZWFkKHdsY19pbmZvX3QgKndsYywgc3RydWN0IHBrdHEgKnEsIHZvaWQgKnBrdCwKLQkJCSAgICAgIGludCBwcmVjLCBib29sIGhlYWQpOwotZXh0ZXJuIHUxNiB3bGNfcGh5dHhjdGwxX2NhbGMod2xjX2luZm9fdCAqd2xjLCByYXRlc3BlY190IHJzcGVjKTsKLWV4dGVybiB2b2lkIHdsY19jb21wdXRlX3BsY3Aod2xjX2luZm9fdCAqd2xjLCByYXRlc3BlY190IHJhdGUsIHVpbnQgbGVuZ3RoLAorZXh0ZXJuIGJvb2wgd2xjX2lzbXBjKHN0cnVjdCB3bGNfaW5mbyAqd2xjKTsKK2V4dGVybiBib29sIHdsY19pc19ub25fZGVsYXlfbXBjKHN0cnVjdCB3bGNfaW5mbyAqd2xjKTsKK2V4dGVybiB2b2lkIHdsY19yYWRpb19tcGNfdXBkKHN0cnVjdCB3bGNfaW5mbyAqd2xjKTsKK2V4dGVybiBib29sIHdsY19wcmVjX2VucShzdHJ1Y3Qgd2xjX2luZm8gKndsYywgc3RydWN0IHBrdHEgKnEsIHZvaWQgKnBrdCwKKwkJCSBpbnQgcHJlYyk7CitleHRlcm4gYm9vbCB3bGNfcHJlY19lbnFfaGVhZChzdHJ1Y3Qgd2xjX2luZm8gKndsYywgc3RydWN0IHBrdHEgKnEsCisJCQkgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqcGt0LCBpbnQgcHJlYywgYm9vbCBoZWFkKTsKK2V4dGVybiB1MTYgd2xjX3BoeXR4Y3RsMV9jYWxjKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCByYXRlc3BlY190IHJzcGVjKTsKK2V4dGVybiB2b2lkIHdsY19jb21wdXRlX3BsY3Aoc3RydWN0IHdsY19pbmZvICp3bGMsIHJhdGVzcGVjX3QgcmF0ZSwgdWludCBsZW5ndGgsCiAJCQkgICAgIHU4ICpwbGNwKTsKLWV4dGVybiB1aW50IHdsY19jYWxjX2ZyYW1lX3RpbWUod2xjX2luZm9fdCAqd2xjLCByYXRlc3BlY190IHJhdGVzcGVjLAorZXh0ZXJuIHVpbnQgd2xjX2NhbGNfZnJhbWVfdGltZShzdHJ1Y3Qgd2xjX2luZm8gKndsYywgcmF0ZXNwZWNfdCByYXRlc3BlYywKIAkJCQl1OCBwcmVhbWJsZV90eXBlLCB1aW50IG1hY19sZW4pOwogCi1leHRlcm4gdm9pZCB3bGNfc2V0X2NoYW5zcGVjKHdsY19pbmZvX3QgKndsYywgY2hhbnNwZWNfdCBjaGFuc3BlYyk7CitleHRlcm4gdm9pZCB3bGNfc2V0X2NoYW5zcGVjKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCBjaGFuc3BlY190IGNoYW5zcGVjKTsKIAotZXh0ZXJuIGJvb2wgd2xjX3RpbWVyc19pbml0KHdsY19pbmZvX3QgKndsYywgaW50IHVuaXQpOworZXh0ZXJuIGJvb2wgd2xjX3RpbWVyc19pbml0KHN0cnVjdCB3bGNfaW5mbyAqd2xjLCBpbnQgdW5pdCk7CiAKIGV4dGVybiBjb25zdCBiY21faW92YXJfdCB3bGNfaW92YXJzW107CiAKIGV4dGVybiBpbnQgd2xjX2RvaW92YXIodm9pZCAqaGRsLCBjb25zdCBiY21faW92YXJfdCAqdmksIHUzMiBhY3Rpb25pZCwKIAkJICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIHZvaWQgKnBhcmFtcywgdWludCBwX2xlbiwgdm9pZCAqYXJnLAotCQkgICAgICAgaW50IGxlbiwgaW50IHZhbF9zaXplLCB3bGNfaWZfdCAqd2xjaWYpOworCQkgICAgICAgaW50IGxlbiwgaW50IHZhbF9zaXplLCBzdHJ1Y3Qgd2xjX2lmICp3bGNpZik7CiAKICNpZiBkZWZpbmVkKEJDTURCRykKLWV4dGVybiB2b2lkIHdsY19wcmludF9pZXMod2xjX2luZm9fdCAqd2xjLCB1OCAqaWVzLCB1aW50IGllc19sZW4pOworZXh0ZXJuIHZvaWQgd2xjX3ByaW50X2llcyhzdHJ1Y3Qgd2xjX2luZm8gKndsYywgdTggKmllcywgdWludCBpZXNfbGVuKTsKICNlbmRpZgogCi1leHRlcm4gaW50IHdsY19zZXRfbm1vZGUod2xjX2luZm9fdCAqd2xjLCBzMzIgbm1vZGUpOwotZXh0ZXJuIHZvaWQgd2xjX2h0X21pbW9wc19jYXBfdXBkYXRlKHdsY19pbmZvX3QgKndsYywgdTggbWltb3BzX21vZGUpOwotZXh0ZXJuIHZvaWQgd2xjX21pbW9wc19hY3Rpb25faHRfc2VuZCh3bGNfaW5mb190ICp3bGMsIHdsY19ic3NjZmdfdCAqYnNzY2ZnLAotCQkJCSAgICAgIHU4IG1pbW9wc19tb2RlKTsKK2V4dGVybiBpbnQgd2xjX3NldF9ubW9kZShzdHJ1Y3Qgd2xjX2luZm8gKndsYywgczMyIG5tb2RlKTsKK2V4dGVybiB2b2lkIHdsY19odF9taW1vcHNfY2FwX3VwZGF0ZShzdHJ1Y3Qgd2xjX2luZm8gKndsYywgdTggbWltb3BzX21vZGUpOworZXh0ZXJuIHZvaWQgd2xjX21pbW9wc19hY3Rpb25faHRfc2VuZChzdHJ1Y3Qgd2xjX2luZm8gKndsYywKKwkJCQkgICAgICB3bGNfYnNzY2ZnX3QgKmJzc2NmZywgdTggbWltb3BzX21vZGUpOwogCi1leHRlcm4gdm9pZCB3bGNfc3dpdGNoX3Nob3J0c2xvdCh3bGNfaW5mb190ICp3bGMsIGJvb2wgc2hvcnRzbG90KTsKK2V4dGVybiB2b2lkIHdsY19zd2l0Y2hfc2hvcnRzbG90KHN0cnVjdCB3bGNfaW5mbyAqd2xjLCBib29sIHNob3J0c2xvdCk7CiBleHRlcm4gdm9pZCB3bGNfc2V0X2Jzc2lkKHdsY19ic3NjZmdfdCAqY2ZnKTsKIGV4dGVybiB2b2lkIHdsY19lZGNmX3NldHBhcmFtcyh3bGNfYnNzY2ZnX3QgKmNmZywgYm9vbCBzdXNwZW5kKTsKLWV4dGVybiB2b2lkIHdsY193bWVfc2V0cGFyYW1zKHdsY19pbmZvX3QgKndsYywgdTE2IGFjaSwgdm9pZCAqYXJnLAotCQkJICAgICAgYm9vbCBzdXNwZW5kKTsKIAotZXh0ZXJuIHZvaWQgd2xjX3NldF9yYXRldGFibGUod2xjX2luZm9fdCAqd2xjKTsKK2V4dGVybiB2b2lkIHdsY19zZXRfcmF0ZXRhYmxlKHN0cnVjdCB3bGNfaW5mbyAqd2xjKTsKIGV4dGVybiBpbnQgd2xjX3NldF9tYWMod2xjX2Jzc2NmZ190ICpjZmcpOwotZXh0ZXJuIHZvaWQgd2xjX2JlYWNvbl9waHl0eGN0bF90eGFudF91cGQod2xjX2luZm9fdCAqd2xjLAorZXh0ZXJuIHZvaWQgd2xjX2JlYWNvbl9waHl0eGN0bF90eGFudF91cGQoc3RydWN0IHdsY19pbmZvICp3bGMsCiAJCQkJCSAgcmF0ZXNwZWNfdCBiY25fcmF0ZSk7Ci1leHRlcm4gdm9pZCB3bGNfbW9kX3ByYl9yc3BfcmF0ZV90YWJsZSh3bGNfaW5mb190ICp3bGMsIHVpbnQgZnJhbWVfbGVuKTsKLWV4dGVybiByYXRlc3BlY190IHdsY19sb3dlc3RfYmFzaWNfcnNwZWMod2xjX2luZm9fdCAqd2xjLCB3bGNfcmF0ZXNldF90ICpycyk7Ci1leHRlcm4gdTE2IHdsY19jb21wdXRlX2JjbnRzZm9mZih3bGNfaW5mb190ICp3bGMsIHJhdGVzcGVjX3QgcnNwZWMsCitleHRlcm4gdm9pZCB3bGNfbW9kX3ByYl9yc3BfcmF0ZV90YWJsZShzdHJ1Y3Qgd2xjX2luZm8gKndsYywgdWludCBmcmFtZV9sZW4pOworZXh0ZXJuIHJhdGVzcGVjX3Qgd2xjX2xvd2VzdF9iYXNpY19yc3BlYyhzdHJ1Y3Qgd2xjX2luZm8gKndsYywKKwkJCQkJIHdsY19yYXRlc2V0X3QgKnJzKTsKK2V4dGVybiB1MTYgd2xjX2NvbXB1dGVfYmNudHNmb2ZmKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCByYXRlc3BlY190IHJzcGVjLAogCQkJCSAgICBib29sIHNob3J0X3ByZWFtYmxlLCBib29sIHBoeWRlbGF5KTsKLWV4dGVybiB2b2lkIHdsY19yYWRpb19kaXNhYmxlKHdsY19pbmZvX3QgKndsYyk7Ci1leHRlcm4gdm9pZCB3bGNfYmNuX2xpX3VwZCh3bGNfaW5mb190ICp3bGMpOworZXh0ZXJuIHZvaWQgd2xjX3JhZGlvX2Rpc2FibGUoc3RydWN0IHdsY19pbmZvICp3bGMpOworZXh0ZXJuIHZvaWQgd2xjX2Jjbl9saV91cGQoc3RydWN0IHdsY19pbmZvICp3bGMpOwogCi1leHRlcm4gaW50IHdsY19nZXRfcmV2aXNpb25faW5mbyh3bGNfaW5mb190ICp3bGMsIHZvaWQgKmJ1ZiwgdWludCBsZW4pOwotZXh0ZXJuIHZvaWQgd2xjX291dCh3bGNfaW5mb190ICp3bGMpOwotZXh0ZXJuIHZvaWQgd2xjX3NldF9ob21lX2NoYW5zcGVjKHdsY19pbmZvX3QgKndsYywgY2hhbnNwZWNfdCBjaGFuc3BlYyk7Ci1leHRlcm4gdm9pZCB3bGNfd2F0Y2hkb2dfdXBkKHdsY19pbmZvX3QgKndsYywgYm9vbCB0YnR0KTsKLWV4dGVybiBib29sIHdsY19wc19hbGxvd2VkKHdsY19pbmZvX3QgKndsYyk7Ci1leHRlcm4gYm9vbCB3bGNfc3RheV9hd2FrZSh3bGNfaW5mb190ICp3bGMpOwotZXh0ZXJuIHZvaWQgd2xjX3dtZV9pbml0cGFyYW1zX3N0YSh3bGNfaW5mb190ICp3bGMsIHdtZV9wYXJhbV9pZV90ICpwZSk7CitleHRlcm4gaW50IHdsY19nZXRfcmV2aXNpb25faW5mbyhzdHJ1Y3Qgd2xjX2luZm8gKndsYywgdm9pZCAqYnVmLCB1aW50IGxlbik7CitleHRlcm4gdm9pZCB3bGNfb3V0KHN0cnVjdCB3bGNfaW5mbyAqd2xjKTsKK2V4dGVybiB2b2lkIHdsY19zZXRfaG9tZV9jaGFuc3BlYyhzdHJ1Y3Qgd2xjX2luZm8gKndsYywgY2hhbnNwZWNfdCBjaGFuc3BlYyk7CitleHRlcm4gdm9pZCB3bGNfd2F0Y2hkb2dfdXBkKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCBib29sIHRidHQpOworZXh0ZXJuIGJvb2wgd2xjX3BzX2FsbG93ZWQoc3RydWN0IHdsY19pbmZvICp3bGMpOworZXh0ZXJuIGJvb2wgd2xjX3N0YXlfYXdha2Uoc3RydWN0IHdsY19pbmZvICp3bGMpOworZXh0ZXJuIHZvaWQgd2xjX3dtZV9pbml0cGFyYW1zX3N0YShzdHJ1Y3Qgd2xjX2luZm8gKndsYywgd21lX3BhcmFtX2llX3QgKnBlKTsKIAotZXh0ZXJuIHZvaWQgd2xjX2Jzc19saXN0X2ZyZWUod2xjX2luZm9fdCAqd2xjLCB3bGNfYnNzX2xpc3RfdCAqYnNzX2xpc3QpOworZXh0ZXJuIHZvaWQgd2xjX2Jzc19saXN0X2ZyZWUoc3RydWN0IHdsY19pbmZvICp3bGMsIHdsY19ic3NfbGlzdF90ICpic3NfbGlzdCk7CitleHRlcm4gdm9pZCB3bGNfaHRfbWltb3BzX2NhcF91cGRhdGUoc3RydWN0IHdsY19pbmZvICp3bGMsIHU4IG1pbW9wc19tb2RlKTsKICNlbmRpZgkJCQkvKiBfd2xjX2hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3N5cy93bGNfcGh5X3NoaW0uYyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvc3lzL3dsY19waHlfc2hpbS5jCmluZGV4IGJmOGUyZTEuLjhiZDRlZGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvc3lzL3dsY19waHlfc2hpbS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvc3lzL3dsY19waHlfc2hpbS5jCkBAIC0yNCw5ICsyNCwxMCBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGJjbWRlZnMuaD4KICNpbmNsdWRlIDx3bGNfY2ZnLmg+Ci0jaW5jbHVkZSA8bGludXh2ZXIuaD4KLSNpbmNsdWRlIDxiY211dGlscy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPG9zbC5oPgorI2luY2x1ZGUgPGJjbXV0aWxzLmg+CiAKICNpbmNsdWRlIDxwcm90by84MDIuMTEuaD4KICNpbmNsdWRlIDxiY213aWZpLmg+CkBAIC00Niw2ICs0Nyw3IEBACiAjaW5jbHVkZSA8d2xjX2NoYW5uZWwuaD4KICNpbmNsdWRlIDxiY21zcm9tLmg+CiAjaW5jbHVkZSA8d2xjX2tleS5oPgorI2luY2x1ZGUgPHdsY19ldmVudC5oPgogCiAjaW5jbHVkZSA8d2xjX21hYzgwMjExLmg+CiAKQEAgLTUzLDIxICs1NSwyMyBAQAogI2luY2x1ZGUgPHdsY19waHlfc2hpbS5oPgogI2luY2x1ZGUgPHdsY19waHlfaGFsLmg+CiAjaW5jbHVkZSA8d2xfZXhwb3J0Lmg+CisjaW5jbHVkZSA8d2xfZGJnLmg+CiAKIC8qIFBIWSBTSElNIG1vZHVsZSBzcGVjaWZpYyBzdGF0ZSAqLwogc3RydWN0IHdsY19waHlfc2hpbV9pbmZvIHsKLQl3bGNfaHdfaW5mb190ICp3bGNfaHc7CS8qIHBvaW50ZXIgdG8gbWFpbiB3bGNfaHcgc3RydWN0dXJlICovCisJc3RydWN0IHdsY19od19pbmZvICp3bGNfaHc7CS8qIHBvaW50ZXIgdG8gbWFpbiB3bGNfaHcgc3RydWN0dXJlICovCiAJdm9pZCAqd2xjOwkJLyogcG9pbnRlciB0byBtYWluIHdsYyBzdHJ1Y3R1cmUgKi8KIAl2b2lkICp3bDsJCS8qIHBvaW50ZXIgdG8gb3Mtc3BlY2lmaWMgcHJpdmF0ZSBzdGF0ZSAqLwogfTsKIAotd2xjX3BoeV9zaGltX2luZm9fdCAqd2xjX3BoeV9zaGltX2F0dGFjaCh3bGNfaHdfaW5mb190ICp3bGNfaHcsCit3bGNfcGh5X3NoaW1faW5mb190ICp3bGNfcGh5X3NoaW1fYXR0YWNoKHN0cnVjdCB3bGNfaHdfaW5mbyAqd2xjX2h3LAogCQkJCQkJICAgICAgIHZvaWQgKndsLCB2b2lkICp3bGMpIHsKIAl3bGNfcGh5X3NoaW1faW5mb190ICpwaHlzaGltID0gTlVMTDsKIAogCXBoeXNoaW0gPSBremFsbG9jKHNpemVvZih3bGNfcGh5X3NoaW1faW5mb190KSwgR0ZQX0FUT01JQyk7CiAJaWYgKCFwaHlzaGltKSB7Ci0JCVdMX0VSUk9SKCgid2wlZDogd2xjX3BoeV9zaGltX2F0dGFjaDogb3V0IG9mIG1lbVxuIiwgd2xjX2h3LT51bml0KSk7CisJCVdMX0VSUk9SKCJ3bCVkOiB3bGNfcGh5X3NoaW1fYXR0YWNoOiBvdXQgb2YgbWVtXG4iLAorCQkJIHdsY19ody0+dW5pdCk7CiAJCXJldHVybiBOVUxMOwogCX0KIAlwaHlzaGltLT53bGNfaHcgPSB3bGNfaHc7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3N5cy93bGNfcHViLmggYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3N5cy93bGNfcHViLmgKaW5kZXggYTZhOGMzMy4uMTQ2YTY5MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9zeXMvd2xjX3B1Yi5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvc3lzL3dsY19wdWIuaApAQCAtMjUxLDcgKzI1MSw3IEBACiAgKiBQdWJsaWMgcG9ydGlvbiBvZiAiY29tbW9uIiBvcy1pbmRlcGVuZGVudCBzdGF0ZSBzdHJ1Y3R1cmUuCiAgKiBUaGUgd2xjIGhhbmRsZSBwb2ludHMgYXQgdGhpcy4KICAqLwotdHlwZWRlZiBzdHJ1Y3Qgd2xjX3B1YiB7CitzdHJ1Y3Qgd2xjX3B1YiB7CiAJdm9pZCAqd2xjOwogCiAJc3RydWN0IGllZWU4MDIxMV9odyAqaWVlZV9odzsKQEAgLTI2MCw3ICsyNjAsNyBAQAogCXVpbnQgbWFjODAyMTFfc3RhdGU7CiAJdWludCB1bml0OwkJLyogZGV2aWNlIGluc3RhbmNlIG51bWJlciAqLwogCXVpbnQgY29yZXJldjsJCS8qIGNvcmUgcmV2aXNpb24gKi8KLQlvc2xfdCAqb3NoOwkJLyogcG9pbnRlciB0byBvcyBoYW5kbGUgKi8KKwlzdHJ1Y3Qgb3NsX2luZm8gKm9zaDsJCS8qIHBvaW50ZXIgdG8gb3MgaGFuZGxlICovCiAJc2lfdCAqc2loOwkJLyogU0IgaGFuZGxlIChjb29raWUgZm9yIHNpdXRpbHMgY2FsbHMpICovCiAJY2hhciAqdmFyczsJCS8qICJlbnZpcm9ubWVudCIgbmFtZT12YWx1ZSAqLwogCWJvb2wgdXA7CQkvKiBpbnRlcmZhY2UgdXAgYW5kIHJ1bm5pbmcgKi8KQEAgLTMxOCw5ICszMTgsNiBAQAogCQkJCSAqIGlzIGltcGxlbWVudGVkIHByb3Blcmx5IGluIG9zbCBvZiB0aGF0IHBvcnQKIAkJCQkgKiB3aGVuIGl0IGVuYWJsZXMgdGhpcyBQb3dlciBTYXZlIGZlYXR1cmUuCiAJCQkJICovCi0jaWZkZWYgQkNNU0RJTwotCXVpbnQgc2Rpb2RfZHJpdmVfc3RyZW5ndGg7CS8qIFNESU8gZHJpdmUgc3RyZW5ndGggKi8KLSNlbmRpZgkJCQkvKiBCQ01TRElPICovCiAKIAl1MTYgYm9hcmRyZXY7CS8qIHZlcnNpb24gIyBvZiBwYXJ0aWN1bGFyIGJvYXJkICovCiAJdTggc3JvbXJldjsJCS8qIHZlcnNpb24gIyBvZiB0aGUgc3JvbSAqLwpAQCAtMzMzLDcgKzMzMCw3IEBACiAJYm9vbCBfbG1hY3Byb3RvOwkvKiBsbWFjIHByb3RvY29sIG1vZHVsZSBpbmNsdWRlZCBhbmQgZW5hYmxlZCAqLwogCWJvb2wgcGh5XzExbmNhcGFibGU7CS8qIHRoZSBQSFkvSFcgaXMgY2FwYWJsZSBvZiA4MDIuMTFOICovCiAJYm9vbCBfYW1wZHVtYWM7CQkvKiBtYWMgYXNzaXN0IGFtcGR1IGVuYWJsZWQgb3Igbm90ICovCi19IHdsY19wdWJfdDsKK307CiAKIC8qIHdsX21vbml0b3Igcnggc3RhdHVzIHBlciBwYWNrZXQgKi8KIHR5cGVkZWYgc3RydWN0IHdsX3J4c3RzIHsKQEAgLTQzNywxNyArNDM0LDEzIEBACiAjZGVmaW5lIEVEQ0ZfRU5BQihwdWIpIChXTUVfRU5BQihwdWIpKQogI2RlZmluZSBRT1NfRU5BQihwdWIpIChXTUVfRU5BQihwdWIpIHx8IE5fRU5BQihwdWIpKQogCi0jZGVmaW5lIE1PTklUT1JfRU5BQih3bGMpCShiY21zcGFjZSAmJiAod2xjKS0+bW9uaXRvcikKKyNkZWZpbmUgTU9OSVRPUl9FTkFCKHdsYykJKCh3bGMpLT5tb25pdG9yKQogCi0jZGVmaW5lIFBST01JU0NfRU5BQih3bGMpCShiY21zcGFjZSAmJiAod2xjKS0+cHJvbWlzYykKLQotZXh0ZXJuIHZvaWQgd2xjX3BrdHRhZ19pbmZvX21vdmUod2xjX3B1Yl90ICpwdWIsIHZvaWQgKnBrdF9mcm9tLCB2b2lkICpwa3RfdG8pOwotCi0jZGVmaW5lIFdMUEtUVEFHU0NCKHApIChXTFBLVFRBRyhwKS0+X3NjYikKKyNkZWZpbmUgUFJPTUlTQ19FTkFCKHdsYykJKCh3bGMpLT5wcm9taXNjKQogCiAjZGVmaW5lCVdMQ19QUkVDX0NPVU5UCQkxNgkvKiBNYXggcHJlY2VkZW5jZSBsZXZlbCBpbXBsZW1lbnRlZCAqLwogCi0vKiBwcmkgaXMgUEtUUFJJTyBlbmNvZGVkIGluIHRoZSBwYWNrZXQuIFRoaXMgbWFwcyB0aGUgUGFja2V0IHByaW9yaXR5IHRvCisvKiBwcmkgaXMgcHJpb3JpdHkgZW5jb2RlZCBpbiB0aGUgcGFja2V0LiBUaGlzIG1hcHMgdGhlIFBhY2tldCBwcmlvcml0eSB0bwogICogZW5xdWV1ZSBwcmVjZWRlbmNlIGFzIGRlZmluZWQgaW4gd2xjX3ByZWNfbWFwCiAgKi8KIGV4dGVybiBjb25zdCB1OCB3bGNfcHJpbzJwcmVjX21hcFtdOwpAQCAtNDk3LDggKzQ5MCw4IEBACiAKIC8qIGNvbW1vbiBmdW5jdGlvbnMgZm9yIGV2ZXJ5IHBvcnQgKi8KIGV4dGVybiB2b2lkICp3bGNfYXR0YWNoKHZvaWQgKndsLCB1MTYgdmVuZG9yLCB1MTYgZGV2aWNlLCB1aW50IHVuaXQsCi0JCQlib29sIHBpb21vZGUsIG9zbF90ICpvc2gsIHZvaWQgKnJlZ3N2YSwgdWludCBidXN0eXBlLAotCQkJdm9pZCAqYnRwYXJhbSwgdWludCAqcGVycik7CisJCQlib29sIHBpb21vZGUsIHN0cnVjdCBvc2xfaW5mbyAqb3NoLCB2b2lkICpyZWdzdmEsCisJCQl1aW50IGJ1c3R5cGUsIHZvaWQgKmJ0cGFyYW0sIHVpbnQgKnBlcnIpOwogZXh0ZXJuIHVpbnQgd2xjX2RldGFjaChzdHJ1Y3Qgd2xjX2luZm8gKndsYyk7CiBleHRlcm4gaW50IHdsY191cChzdHJ1Y3Qgd2xjX2luZm8gKndsYyk7CiBleHRlcm4gdWludCB3bGNfZG93bihzdHJ1Y3Qgd2xjX2luZm8gKndsYyk7CkBAIC01MTcsOCArNTEwLDEwIEBACiBleHRlcm4gYm9vbCB3bGNfaW50cnN1cGQoc3RydWN0IHdsY19pbmZvICp3bGMpOwogZXh0ZXJuIGJvb2wgd2xjX2lzcihzdHJ1Y3Qgd2xjX2luZm8gKndsYywgYm9vbCAqd2FudGRwYyk7CiBleHRlcm4gYm9vbCB3bGNfZHBjKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCBib29sIGJvdW5kZWQpOwotZXh0ZXJuIGJvb2wgd2xjX3NlbmQ4MDIxMV9yYXcoc3RydWN0IHdsY19pbmZvICp3bGMsIHdsY19pZl90ICp3bGNpZiwgdm9pZCAqcCwKLQkJCSAgICAgIHVpbnQgYWMpOworZXh0ZXJuIGJvb2wgd2xjX3NlbmQ4MDIxMV9yYXcoc3RydWN0IHdsY19pbmZvICp3bGMsIHN0cnVjdCB3bGNfaWYgKndsY2lmLAorCQkJICAgICAgdm9pZCAqcCwgdWludCBhYyk7CitleHRlcm4gYm9vbCB3bGNfc2VuZHBrdF9tYWM4MDIxMShzdHJ1Y3Qgd2xjX2luZm8gKndsYywgc3RydWN0IHNrX2J1ZmYgKnNkdSwKKwkJCQkgc3RydWN0IGllZWU4MDIxMV9odyAqaHcpOwogZXh0ZXJuIGludCB3bGNfaW92YXJfb3Aoc3RydWN0IHdsY19pbmZvICp3bGMsIGNvbnN0IGNoYXIgKm5hbWUsIHZvaWQgKnBhcmFtcywKIAkJCWludCBwX2xlbiwgdm9pZCAqYXJnLCBpbnQgbGVuLCBib29sIHNldCwKIAkJCXN0cnVjdCB3bGNfaWYgKndsY2lmKTsKQEAgLTUyNyw4ICs1MjIsMTMgQEAKIC8qIGhlbHBlciBmdW5jdGlvbnMgKi8KIGV4dGVybiB2b2lkIHdsY19zdGF0c3VwZChzdHJ1Y3Qgd2xjX2luZm8gKndsYyk7CiBleHRlcm4gaW50IHdsY19nZXRfaGVhZGVyX2xlbih2b2lkKTsKK2V4dGVybiB2b2lkIHdsY19tYWNfYmNuX3Byb21pc2NfY2hhbmdlKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCBib29sIHByb21pc2MpOworZXh0ZXJuIHZvaWQgd2xjX3NldF9hZGRybWF0Y2goc3RydWN0IHdsY19pbmZvICp3bGMsIGludCBtYXRjaF9yZWdfb2Zmc2V0LAorCQkJICAgICAgY29uc3Qgc3RydWN0IGV0aGVyX2FkZHIgKmFkZHIpOworZXh0ZXJuIHZvaWQgd2xjX3dtZV9zZXRwYXJhbXMoc3RydWN0IHdsY19pbmZvICp3bGMsIHUxNiBhY2ksIHZvaWQgKmFyZywKKwkJCSAgICAgIGJvb2wgc3VzcGVuZCk7CiAKLWV4dGVybiB3bGNfcHViX3QgKndsY19wdWIodm9pZCAqd2xjKTsKK2V4dGVybiBzdHJ1Y3Qgd2xjX3B1YiAqd2xjX3B1Yih2b2lkICp3bGMpOwogCiAvKiBjb21tb24gZnVuY3Rpb25zIGZvciBldmVyeSBwb3J0ICovCiBleHRlcm4gaW50IHdsY19ibWFjX3VwX3ByZXAoc3RydWN0IHdsY19od19pbmZvICp3bGNfaHcpOwpAQCAtNTU0LDEzICs1NTQsMTUgQEAKIC8qIGlvY3RsICovCiBleHRlcm4gaW50IHdsY19pb3Zhcl9nZXRzOChzdHJ1Y3Qgd2xjX2luZm8gKndsYywgY29uc3QgY2hhciAqbmFtZSwKIAkJCSAgICAgczggKmFyZyk7Ci1leHRlcm4gaW50IHdsY19pb3Zhcl9jaGVjayh3bGNfcHViX3QgKnB1YiwgY29uc3QgYmNtX2lvdmFyX3QgKnZpLCB2b2lkICphcmcsCitleHRlcm4gaW50IHdsY19pb3Zhcl9jaGVjayhzdHJ1Y3Qgd2xjX3B1YiAqcHViLCBjb25zdCBiY21faW92YXJfdCAqdmksCisJCQkgICB2b2lkICphcmcsCiAJCQkgICBpbnQgbGVuLCBib29sIHNldCk7CiAKLWV4dGVybiBpbnQgd2xjX21vZHVsZV9yZWdpc3Rlcih3bGNfcHViX3QgKnB1YiwgY29uc3QgYmNtX2lvdmFyX3QgKmlvdmFycywKK2V4dGVybiBpbnQgd2xjX21vZHVsZV9yZWdpc3RlcihzdHJ1Y3Qgd2xjX3B1YiAqcHViLCBjb25zdCBiY21faW92YXJfdCAqaW92YXJzLAogCQkJICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIHZvaWQgKmhkbCwgaW92YXJfZm5fdCBpb3Zhcl9mbiwKIAkJCSAgICAgICB3YXRjaGRvZ19mbl90IHdhdGNoZG9nX2ZuLCBkb3duX2ZuX3QgZG93bl9mbik7Ci1leHRlcm4gaW50IHdsY19tb2R1bGVfdW5yZWdpc3Rlcih3bGNfcHViX3QgKnB1YiwgY29uc3QgY2hhciAqbmFtZSwgdm9pZCAqaGRsKTsKK2V4dGVybiBpbnQgd2xjX21vZHVsZV91bnJlZ2lzdGVyKHN0cnVjdCB3bGNfcHViICpwdWIsIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkJIHZvaWQgKmhkbCk7CiBleHRlcm4gdm9pZCB3bGNfZXZlbnRfaWYoc3RydWN0IHdsY19pbmZvICp3bGMsIHN0cnVjdCB3bGNfYnNzY2ZnICpjZmcsCiAJCQkgd2xjX2V2ZW50X3QgKmUsIGNvbnN0IHN0cnVjdCBldGhlcl9hZGRyICphZGRyKTsKIGV4dGVybiB2b2lkIHdsY19zdXNwZW5kX21hY19hbmRfd2FpdChzdHJ1Y3Qgd2xjX2luZm8gKndsYyk7CkBAIC02MTcsMTAgKzYxOSw2IEBACiAjZGVmaW5lIEJBTkRfMkdfTkFNRQkJIjIuNEciCiAjZGVmaW5lIEJBTkRfNUdfTkFNRQkJIjVHIgogCi0jaWYgZGVmaW5lZChCQ01TRElPKSB8fCBkZWZpbmVkKFdMQ19ISUdIX09OTFkpCi12b2lkIHdsY19kZXZpY2VfcmVtb3ZlZCh2b2lkICphcmcpOwotI2VuZGlmCi0KIC8qIEJNQUMgUlBDOiA3IHUzMiBwYXJhbXM6IHBrdHRvdGxlbiwgZmlmbywgY29tbWl0LCBmaWQsIHR4cGt0cGVuZCwgcGt0ZmxhZywgcnBjX2lkICovCiAjZGVmaW5lIFdMQ19SUENUWF9QQVJBTVMJCTMyCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvc3lzL3dsY19yYXRlLmMgYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3N5cy93bGNfcmF0ZS5jCmluZGV4IGQyZDcyNTYuLmFiN2QwYmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvc3lzL3dsY19yYXRlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9zeXMvd2xjX3JhdGUuYwpAQCAtMTcsMTIgKzE3LDE0IEBACiAjaW5jbHVkZSA8YmNtZGVmcy5oPgogI2luY2x1ZGUgPHdsY19jZmcuaD4KICNpbmNsdWRlIDxvc2wuaD4KLSNpbmNsdWRlIDxsaW51eHZlci5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGJjbXV0aWxzLmg+CiAjaW5jbHVkZSA8c2l1dGlscy5oPgogI2luY2x1ZGUgPGJjbWVuZGlhbi5oPgogI2luY2x1ZGUgPHdsaW9jdGwuaD4KIAorI2luY2x1ZGUgPHNiaG5kcGlvLmg+CisjaW5jbHVkZSA8c2JobmRkbWEuaD4KICNpbmNsdWRlIDxwcm90by84MDIuMTEuaD4KICNpbmNsdWRlIDxkMTEuaD4KICNpbmNsdWRlIDx3bGNfcmF0ZS5oPgpAQCAtMjk3LDcgKzI5OSw3IEBACiAJdWludCBjb3VudDsKIAl1aW50IGk7CiAKLQliemVybyhyYXRlc2V0LCBzaXplb2YocmF0ZXNldCkpOworCW1lbXNldChyYXRlc2V0LCAwLCBzaXplb2YocmF0ZXNldCkpOwogCWNvdW50ID0gcnMtPmNvdW50OwogCiAJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvc3lzL3dsY19ycGMuaCBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvc3lzL3dsY19ycGMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGIzOTY0NS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3N5cy93bGNfcnBjLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MjcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxMCBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQotICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KLSAqCi0gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKLSAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWQotICogU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCi0gKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OCi0gKiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOCi0gKiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotICovCi0KLSNpZm5kZWYgX1dMQ19SUENfSF8KLSNkZWZpbmUgX1dMQ19SUENfSF8KLQotI2luY2x1ZGUgPHdsY190eXBlcy5oPgotCi0vKiBSUEMgSURzLCByZW9yZGVyaW5nIGlzIE9LLiBUaGlzIG5lZWRzIHRvIGJlIGluIHN5bmMgd2l0aCBSUENfSURfVEFCTEUgYmVsb3cgKi8KLXR5cGVkZWYgZW51bSB7Ci0JV0xSUENfTlVMTF9JRCA9IDAsCi0JV0xSUENfV0xDX1JFR19SRUFEX0lELAotCVdMUlBDX1dMQ19SRUdfV1JJVEVfSUQsCi0JV0xSUENfV0xDX01IRl9TRVRfSUQsCi0JV0xSUENfV0xDX01IRl9HRVRfSUQsCi0JV0xSUENfV0xDX0JNQUNfVVBfUFJFUF9JRCwKLQlXTFJQQ19XTENfQk1BQ19VUF9GSU5JU0hfSUQsCi0JV0xSUENfV0xDX0JNQUNfRE9XTl9QUkVQX0lELAotCVdMUlBDX1dMQ19CTUFDX0RPV05fRklOSVNIX0lELAotCVdMUlBDX1dMQ19CTUFDX1dSSVRFX0hXX0JDTlRFTVBMQVRFU19JRCwKLQlXTFJQQ19XTENfQk1BQ19SRVNFVF9JRCwKLQlXTFJQQ19XTENfRE5HTF9SRUJPT1RfSUQsCi0JV0xSUENfV0xDX0JNQUNfUlBDX1RYUV9XTV9TRVRfSUQsCi0JV0xSUENfV0xDX0JNQUNfUlBDX1RYUV9XTV9HRVRfSUQsCi0JV0xSUENfV0xDX0JNQUNfUlBDX0FHR19TRVRfSUQsCi0JV0xSUENfV0xDX0JNQUNfUlBDX01TR0xFVkVMX1NFVF9JRCwKLQlXTFJQQ19XTENfQk1BQ19SUENfQUdHX0xJTUlUX1NFVF9JRCwKLQlXTFJQQ19XTENfQk1BQ19SUENfQUdHX0xJTUlUX0dFVF9JRCwKLQlXTFJQQ19XTENfQk1BQ19JTklUX0lELAotCVdMUlBDX1dMQ19CTUFDX1NFVF9DV01JTl9JRCwKLQlXTFJQQ19XTENfQk1BQ19NVVRFX0lELAotCVdMUlBDX1dMQ19QSFlfRE9JT1ZBUl9JRCwKLQlXTFJQQ19XTENfUEhZX0hPTERfVVBEX0lELAotCVdMUlBDX1dMQ19QSFlfTVVURV9VUERfSUQsCi0JV0xSUENfV0xDX1BIWV9DTEVBUl9UU1NJX0lELAotCVdMUlBDX1dMQ19QSFlfQU5UX1JYRElWX0dFVF9JRCwKLQlXTFJQQ19XTENfUEhZX0FOVF9SWERJVl9TRVRfSUQsCi0JV0xSUENfV0xDX1BIWV9QUkVBTUJMRV9TRVRfSUQsCi0JV0xSUENfV0xDX1BIWV9GUkVRVFJBQ0tfRU5EX0lELAotCVdMUlBDX1dMQ19QSFlfRlJFUVRSQUNLX1NUQVJUX0lELAotCVdMUlBDX1dMQ19QSFlfSU9DVExfSUQsCi0JV0xSUENfV0xDX1BIWV9OT0lTRV9TQU1QTEVfUkVRVUVTVF9JRCwKLQlXTFJQQ19XTENfUEhZX0NBTF9QRVJJQ0FMX0lELAotCVdMUlBDX1dMQ19QSFlfVFhQT1dFUl9HRVRfSUQsCi0JV0xSUENfV0xDX1BIWV9UWFBPV0VSX1NFVF9JRCwKLQlXTFJQQ19XTENfUEhZX1RYUE9XRVJfU1JPTUxJTUlUX0lELAotCVdMUlBDX1dMQ19QSFlfUkFEQVJfREVURUNUX0VOQUJMRV9JRCwKLQlXTFJQQ19XTENfUEhZX1JBREFSX0RFVEVDVF9SVU5fSUQsCi0JV0xSUENfV0xDX1BIWV9URVNUX0lTT05fSUQsCi0JV0xSUENfV0xDX0JNQUNfQ09QWUZST01fT0JKTUVNX0lELAotCVdMUlBDX1dMQ19CTUFDX0NPUFlUT19PQkpNRU1fSUQsCi0JV0xSUENfV0xDX0VOQUJMRV9NQUNfSUQsCi0JV0xSUENfV0xDX01DVFJMX0lELAotCVdMUlBDX1dMQ19DT1JFUkVTRVRfSUQsCi0JV0xSUENfV0xDX0JNQUNfUkVBRF9TSE1fSUQsCi0JV0xSUENfV0xDX0JNQUNfUkVBRF9UU0ZfSUQsCi0JV0xSUENfV0xDX0JNQUNfU0VUX0FERFJNQVRDSF9JRCwKLQlXTFJQQ19XTENfQk1BQ19TRVRfQ1dNQVhfSUQsCi0JV0xSUENfV0xDX0JNQUNfU0VUX1JDTVRBX0lELAotCVdMUlBDX1dMQ19CTUFDX1NFVF9TSE1fSUQsCi0JV0xSUENfV0xDX1NVU1BFTkRfTUFDX0FORF9XQUlUX0lELAotCVdMUlBDX1dMQ19CTUFDX1dSSVRFX1NITV9JRCwKLQlXTFJQQ19XTENfQk1BQ19XUklURV9URU1QTEFURV9SQU1fSUQsCi0JV0xSUENfV0xDX1RYX0ZJRk9fU1VTUEVORF9JRCwKLQlXTFJQQ19XTENfVFhfRklGT19SRVNVTUVfSUQsCi0JV0xSUENfV0xDX1RYX0ZJRk9fU1VTUEVOREVEX0lELAotCVdMUlBDX1dMQ19IV19FVEhFUkFERFJfSUQsCi0JV0xSUENfV0xDX1NFVF9IV19FVEhFUkFERFJfSUQsCi0JV0xSUENfV0xDX0JNQUNfQ0hBTlNQRUNfU0VUX0lELAotCVdMUlBDX1dMQ19CTUFDX1RYQU5UX1NFVF9JRCwKLQlXTFJQQ19XTENfQk1BQ19BTlRTRUxfVFlQRV9TRVRfSUQsCi0JV0xSUENfV0xDX0JNQUNfVFhGSUZPX0lELAotCVdMUlBDX1dMQ19SQURJT19SRUFEX0hXRElTQUJMRURfSUQsCi0JV0xSUENfV0xDX1JNX0NDQV9NRUFTVVJFX0lELAotCVdMUlBDX1dMQ19TRVRfU0hPUlRTTE9UX0lELAotCVdMUlBDX1dMQ19XQUlUX0ZPUl9XQUtFX0lELAotCVdMUlBDX1dMQ19QSFlfVFhQT1dFUl9HRVRfQ1VSUkVOVF9JRCwKLQlXTFJQQ19XTENfUEhZX1RYUE9XRVJfSFdfQ1RSTF9HRVRfSUQsCi0JV0xSUENfV0xDX1BIWV9UWFBPV0VSX0hXX0NUUkxfU0VUX0lELAotCVdMUlBDX1dMQ19QSFlfQlNTSU5JVF9JRCwKLQlXTFJQQ19XTENfQkFORF9TVEZfU1NfU0VUX0lELAotCVdMUlBDX1dMQ19QSFlfQkFORF9GSVJTVF9DSEFOU1BFQ19JRCwKLQlXTFJQQ19XTENfUEhZX1RYUE9XRVJfTElNSVRfU0VUX0lELAotCVdMUlBDX1dMQ19QSFlfQkFORF9DSEFOTkVMU19JRCwKLQlXTFJQQ19XTENfQk1BQ19SRVZJTkZPX0dFVF9JRCwKLQlXTFJQQ19XTENfQk1BQ19TVEFURV9HRVRfSUQsCi0JV0xSUENfV0xDX0JNQUNfWE1URklGT19TWl9HRVRfSUQsCi0JV0xSUENfV0xDX0JNQUNfWE1URklGT19TWl9TRVRfSUQsCi0JV0xSUENfV0xDX0JNQUNfVkFMSURBVEVfQ0hJUF9BQ0NFU1NfSUQsCi0JV0xSUENfV0xDX1JNX0NDQV9DT01QTEVURV9JRCwKLQlXTFJQQ19XTENfUkVDVl9JRCwKLQlXTFJQQ19XTENfRE9UWFNUQVRVU19JRCwKLQlXTFJQQ19XTENfSElHSF9EUENfSUQsCi0JV0xSUENfV0xDX0ZBVEFMX0VSUk9SX0lELAotCVdMUlBDX1dMQ19QSFlfU0VUX0NIQU5ORUxfMTRfV0lERV9GSUxURVJfSUQsCi0JV0xSUENfV0xDX1BIWV9OT0lTRV9BVkdfSUQsCi0JV0xSUENfV0xDX1BIWUNIQUlOX0lOSVRfSUQsCi0JV0xSUENfV0xDX1BIWUNIQUlOX1NFVF9JRCwKLQlXTFJQQ19XTENfUEhZQ0hBSU5fR0VUX0lELAotCVdMUlBDX1dMQ19QSFlfVEtJUF9SSUZTX1dBUl9JRCwKLQlXTFJQQ19XTENfQk1BQ19DT1BZRlJPTV9WQVJTX0lELAotCVdMUlBDX1dMQ19CTUFDX1JFVFJZTElNSVRfVVBEX0lELAotCVdMUlBDX1dMQ19CTUFDX0JUQ19NT0RFX1NFVF9JRCwKLQlXTFJQQ19XTENfQk1BQ19CVENfTU9ERV9HRVRfSUQsCi0JV0xSUENfV0xDX0JNQUNfQlRDX1dJUkVfU0VUX0lELAotCVdMUlBDX1dMQ19CTUFDX0JUQ19XSVJFX0dFVF9JRCwKLQlXTFJQQ19XTENfQk1BQ19TRVRfTk9SRVNFVF9JRCwKLQlXTFJQQ19XTENfQU1QRFVfVFhTVEFUVVNfQ09NUExFVEVfSUQsCi0JV0xSUENfV0xDX0JNQUNfRklGT0VSUk9SU19JRCwKLQlXTFJQQ19XTENfUEhZX1RYUE9XRVJfR0VUX1RBUkdFVF9NSU5fSUQsCi0JV0xSUENfV0xDX1BIWV9UWFBPV0VSX0dFVF9UQVJHRVRfTUFYX0lELAotCVdMUlBDX1dMQ19OT0lTRV9DQl9JRCwKLQlXTFJQQ19XTENfQk1BQ19MRURfSFdfREVJTklUX0lELAotCVdMUlBDX1dMQ19CTUFDX0xFRF9IV19NQVNLX0lOSVRfSUQsCi0JV0xSUENfV0xDX1BMTFJFUV9JRCwKLQlXTFJQQ19XTENfQk1BQ19UQUNMRUFSX0lELAotCVdMUlBDX1dMQ19CTUFDX1NFVF9DTEtfSUQsCi0JV0xSUENfV0xDX1BIWV9PRkRNX1JBVEVTRVRfV0FSX0lELAotCVdMUlBDX1dMQ19QSFlfQkZfUFJFRU1QVF9FTkFCTEVfSUQsCi0JV0xSUENfV0xDX0JNQUNfRE9JT1ZBUlNfSUQsCi0JV0xSUENfV0xDX0JNQUNfRFVNUF9JRCwKLQlXTFJQQ19XTENfQ0lTV1JJVEVfSUQsCi0JV0xSUENfV0xDX0NJU0RVTVBfSUQsCi0JV0xSUENfV0xDX1VQREFURV9QSFlfTU9ERV9JRCwKLQlXTFJQQ19XTENfUkVTRVRfQk1BQ19ET05FX0lELAotCVdMUlBDX1dMQ19CTUFDX0xFRF9CTElOS19FVkVOVF9JRCwKLQlXTFJQQ19XTENfQk1BQ19MRURfU0VUX0lELAotCVdMUlBDX1dMQ19CTUFDX0xFRF9CTElOS19JRCwKLQlXTFJQQ19XTENfQk1BQ19MRURfSUQsCi0JV0xSUENfV0xDX0JNQUNfUkFURV9TSE1fT0ZGU0VUX0lELAotCVdMUlBDX1NJX0lTQ09SRV9VUF9JRCwKLQlXTFJQQ19XTENfQk1BQ19QU19TV0lUQ0hfSUQsCi0JV0xSUENfV0xDX1BIWV9TVEZfU1NNT0RFX0dFVF9JRCwKLQlXTFJQQ19XTENfQk1BQ19ERUJVR19JRCwKLQlXTFJQQ19XTENfRVhUTE9HX01TR19JRCwKLQlXTFJQQ19XTENfRVhUTE9HX0NGR19JRCwKLQlXTFJQQ19CQ01fQVNTRVJUX0xPR19JRCwKLQlXTFJQQ19CQ01fQVNTRVJUX1RZUEVfSUQsCi0JV0xSUENfV0xDX0JNQUNfU0VUX1BIWUNBTF9DQUNIRV9GTEFHX0lELAotCVdMUlBDX1dMQ19CTUFDX0dFVF9QSFlDQUxfQ0FDSEVfRkxBR19JRCwKLQlXTFJQQ19XTENfUEhZX0NBTF9DQUNIRV9JTklUX0lELAotCVdMUlBDX1dMQ19QSFlfQ0FMX0NBQ0hFX0RFSU5JVF9JRCwKLQlXTFJQQ19XTENfQk1BQ19IV19VUF9JRCwKLQlXTFJQQ19XTENfQk1BQ19TRVRfVFhQV1JfUEVSQ0VOVF9JRCwKLQlXTFJQQ19XTENfUEhZQ0hBSU5fQUNUSVZFX0dFVF9JRCwKLQlXTFJQQ19XTENfQk1BQ19CTElOS19TWU5DX0lELAotCVdMUlBDX1dMQ19CTUFDX1VDT0RFX0RCR1NFTF9TRVRfSUQsCi0JV0xSUENfV0xDX0JNQUNfVUNPREVfREJHU0VMX0dFVF9JRCwKLQlXTFJQQ19XTENfUEhZX1JBREFSX0RFVEVDVF9NT0RFX1NFVF9JRCwKLQlXTFJQQ19XTENfUEhZX0FDSU1fTk9JU0VNX1JFU0VUX05QSFlfSUQsCi0JV0xSUENfV0xDX1BIWV9JTlRFUkZFUl9TRVRfTlBIWV9JRCwKLQlXTFJQQ19XTENfQk1BQ19JRlNDVExfRURDUlNfU0VUX0lELAotCVdMUlBDX1dMQ19QS1RFTkdUWCwKLQlXTFJQQ19XTENfQk1BQ19TRVRfREVBRiwKLQlXTFJQQ19XTENfQk1BQ19DTEVBUl9ERUFGLAotCVdMUlBDX1dMQ19CTUFDX0JUQ19GTEFHU19TRVRfSUQsCi0JV0xSUENfV0xDX0JNQUNfQlRDX0ZMQUdTX0dFVF9JRCwKLQlXTFJQQ19XTENfQk1BQ19TRVRfUkNNVEFfVFlQRV9JRCwKLQlXTFJQQ19XTENfQk1BQ19CVENfRkxBR1NfVVBEX0lELAotCVdMUlBDX1dMQ19CTUFDX0JUQ19TVFVDS1dBUl9JRCwKLQlXTFJQQ19XTENfQk1BQ19DQ0FfU1RBVFNfUkVBRF9JRCwKLQlXTFJQQ19XTENfQk1BQ19BTlRTRUxfU0VUX0lELAotCVdMUlBDX1dMQ19CTUFDX1NFVF9VQ09ERV9MT0FERUQsCi0JV0xSUENfV0xDX1BIWV9MRFBDX1NFVF9JRCwKLQotCVdMUlBDX0xBU1QKLX0gd2xjX3JwY19pZF90OwotCi0jaWYgZGVmaW5lZChCQ01EQkcpIHwgMAotc3RydWN0IG5hbWVfZW50cnkgewotCWludCBpZDsKLQljaGFyICpuYW1lOwotfTsKLQotI2RlZmluZSBOQU1FX0VOVFJZKHgpIHt4LCAjeH0KLQotI2RlZmluZSBSUENfSURfVEFCTEUgeyBcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfUkVHX1JFQURfSUQpLAlcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfUkVHX1dSSVRFX0lEKSwJXAotCU5BTUVfRU5UUlkoV0xSUENfV0xDX01IRl9TRVRfSUQpLAlcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfTUhGX0dFVF9JRCksCVwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19CTUFDX1VQX1BSRVBfSUQpLAlcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfQk1BQ19VUF9GSU5JU0hfSUQpLAlcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfQk1BQ19ET1dOX1BSRVBfSUQpLAlcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfQk1BQ19ET1dOX0ZJTklTSF9JRCksCVwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19CTUFDX1dSSVRFX0hXX0JDTlRFTVBMQVRFU19JRCksCVwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19CTUFDX1JFU0VUX0lEKSwJXAotCU5BTUVfRU5UUlkoV0xSUENfV0xDX0ROR0xfUkVCT09UX0lEKSwJXAotCU5BTUVfRU5UUlkoV0xSUENfV0xDX0JNQUNfUlBDX1RYUV9XTV9TRVRfSUQpLAlcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfQk1BQ19SUENfVFhRX1dNX0dFVF9JRCksCVwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19CTUFDX1JQQ19BR0dfU0VUX0lEKSwJXAotCU5BTUVfRU5UUlkoV0xSUENfV0xDX0JNQUNfUlBDX01TR0xFVkVMX1NFVF9JRCksCVwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19CTUFDX1JQQ19BR0dfTElNSVRfU0VUX0lEKSwJXAotCU5BTUVfRU5UUlkoV0xSUENfV0xDX0JNQUNfUlBDX0FHR19MSU1JVF9HRVRfSUQpLAlcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfQk1BQ19JTklUX0lEKSwJXAotCU5BTUVfRU5UUlkoV0xSUENfV0xDX0JNQUNfU0VUX0NXTUlOX0lEKSwJXAotCU5BTUVfRU5UUlkoV0xSUENfV0xDX0JNQUNfTVVURV9JRCksCVwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19QSFlfRE9JT1ZBUl9JRCksCVwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19QSFlfSE9MRF9VUERfSUQpLAlcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfUEhZX01VVEVfVVBEX0lEKSwJXAotCU5BTUVfRU5UUlkoV0xSUENfV0xDX1BIWV9DTEVBUl9UU1NJX0lEKSwJXAotCU5BTUVfRU5UUlkoV0xSUENfV0xDX1BIWV9BTlRfUlhESVZfR0VUX0lEKSwJXAotCU5BTUVfRU5UUlkoV0xSUENfV0xDX1BIWV9BTlRfUlhESVZfU0VUX0lEKSwJXAotCU5BTUVfRU5UUlkoV0xSUENfV0xDX1BIWV9QUkVBTUJMRV9TRVRfSUQpLAlcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfUEhZX0ZSRVFUUkFDS19FTkRfSUQpLAlcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfUEhZX0ZSRVFUUkFDS19TVEFSVF9JRCksCVwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19QSFlfSU9DVExfSUQpLAlcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfUEhZX05PSVNFX1NBTVBMRV9SRVFVRVNUX0lEKSwJXAotCU5BTUVfRU5UUlkoV0xSUENfV0xDX1BIWV9DQUxfUEVSSUNBTF9JRCksCVwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19QSFlfVFhQT1dFUl9HRVRfSUQpLAlcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfUEhZX1RYUE9XRVJfU0VUX0lEKSwJXAotCU5BTUVfRU5UUlkoV0xSUENfV0xDX1BIWV9UWFBPV0VSX1NST01MSU1JVF9JRCksCVwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19QSFlfUkFEQVJfREVURUNUX0VOQUJMRV9JRCksCVwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19QSFlfUkFEQVJfREVURUNUX1JVTl9JRCksCVwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19QSFlfVEVTVF9JU09OX0lEKSwJXAotCU5BTUVfRU5UUlkoV0xSUENfV0xDX0JNQUNfQ09QWUZST01fT0JKTUVNX0lEKSwJXAotCU5BTUVfRU5UUlkoV0xSUENfV0xDX0JNQUNfQ09QWVRPX09CSk1FTV9JRCksCVwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19FTkFCTEVfTUFDX0lEKSwJXAotCU5BTUVfRU5UUlkoV0xSUENfV0xDX01DVFJMX0lEKSwJXAotCU5BTUVfRU5UUlkoV0xSUENfV0xDX0NPUkVSRVNFVF9JRCksIFwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19CTUFDX1JFQURfU0hNX0lEKSwJXAotCU5BTUVfRU5UUlkoV0xSUENfV0xDX0JNQUNfUkVBRF9UU0ZfSUQpLAlcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfQk1BQ19TRVRfQUREUk1BVENIX0lEKSwJXAotCU5BTUVfRU5UUlkoV0xSUENfV0xDX0JNQUNfU0VUX0NXTUFYX0lEKSwJXAotCU5BTUVfRU5UUlkoV0xSUENfV0xDX0JNQUNfU0VUX1JDTVRBX0lEKSwJXAotCU5BTUVfRU5UUlkoV0xSUENfV0xDX0JNQUNfU0VUX1NITV9JRCksCVwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19TVVNQRU5EX01BQ19BTkRfV0FJVF9JRCksCVwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19CTUFDX1dSSVRFX1NITV9JRCksCVwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19CTUFDX1dSSVRFX1RFTVBMQVRFX1JBTV9JRCksCVwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19UWF9GSUZPX1NVU1BFTkRfSUQpLAlcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfVFhfRklGT19SRVNVTUVfSUQpLAlcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfVFhfRklGT19TVVNQRU5ERURfSUQpLAlcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfSFdfRVRIRVJBRERSX0lEKSwJXAotCU5BTUVfRU5UUlkoV0xSUENfV0xDX1NFVF9IV19FVEhFUkFERFJfSUQpLAlcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfQk1BQ19DSEFOU1BFQ19TRVRfSUQpLAlcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfQk1BQ19UWEFOVF9TRVRfSUQpLAlcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfQk1BQ19BTlRTRUxfVFlQRV9TRVRfSUQpLAlcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfQk1BQ19UWEZJRk9fSUQpLAlcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfUkFESU9fUkVBRF9IV0RJU0FCTEVEX0lEKSwJXAotCU5BTUVfRU5UUlkoV0xSUENfV0xDX1JNX0NDQV9NRUFTVVJFX0lEKSwJXAotCU5BTUVfRU5UUlkoV0xSUENfV0xDX1NFVF9TSE9SVFNMT1RfSUQpLAlcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfV0FJVF9GT1JfV0FLRV9JRCksCVwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19QSFlfVFhQT1dFUl9HRVRfQ1VSUkVOVF9JRCksCVwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19QSFlfVFhQT1dFUl9IV19DVFJMX0dFVF9JRCksCVwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19QSFlfVFhQT1dFUl9IV19DVFJMX1NFVF9JRCksCVwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19QSFlfQlNTSU5JVF9JRCksCVwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19CQU5EX1NURl9TU19TRVRfSUQpLAlcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfUEhZX0JBTkRfRklSU1RfQ0hBTlNQRUNfSUQpLAlcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfUEhZX1RYUE9XRVJfTElNSVRfU0VUX0lEKSwJXAotCU5BTUVfRU5UUlkoV0xSUENfV0xDX1BIWV9CQU5EX0NIQU5ORUxTX0lEKSwJXAotCU5BTUVfRU5UUlkoV0xSUENfV0xDX0JNQUNfUkVWSU5GT19HRVRfSUQpLAlcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfQk1BQ19TVEFURV9HRVRfSUQpLAlcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfQk1BQ19YTVRGSUZPX1NaX0dFVF9JRCksCVwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19CTUFDX1hNVEZJRk9fU1pfU0VUX0lEKSwJXAotCU5BTUVfRU5UUlkoV0xSUENfV0xDX0JNQUNfVkFMSURBVEVfQ0hJUF9BQ0NFU1NfSUQpLAlcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfUk1fQ0NBX0NPTVBMRVRFX0lEKSwJXAotCU5BTUVfRU5UUlkoV0xSUENfV0xDX1JFQ1ZfSUQpLAlcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfRE9UWFNUQVRVU19JRCksCVwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19ISUdIX0RQQ19JRCksCVwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19GQVRBTF9FUlJPUl9JRCksCVwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19QSFlfU0VUX0NIQU5ORUxfMTRfV0lERV9GSUxURVJfSUQpLCBcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfUEhZX05PSVNFX0FWR19JRCksCVwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19QSFlDSEFJTl9JTklUX0lEKSwgXAotCU5BTUVfRU5UUlkoV0xSUENfV0xDX1BIWUNIQUlOX1NFVF9JRCksIFwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19QSFlDSEFJTl9HRVRfSUQpLCBcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfUEhZX1RLSVBfUklGU19XQVJfSUQpLCBcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfQk1BQ19DT1BZRlJPTV9WQVJTX0lEKSwgXAotCU5BTUVfRU5UUlkoV0xSUENfV0xDX0JNQUNfUkVUUllMSU1JVF9VUERfSUQpLCBcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfQk1BQ19CVENfTU9ERV9TRVRfSUQpLCBcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfQk1BQ19CVENfTU9ERV9HRVRfSUQpLCBcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfQk1BQ19CVENfV0lSRV9TRVRfSUQpLCBcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfQk1BQ19CVENfV0lSRV9HRVRfSUQpLCBcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfQk1BQ19TRVRfTk9SRVNFVF9JRCksIFwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19BTVBEVV9UWFNUQVRVU19DT01QTEVURV9JRCksIFwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19CTUFDX0ZJRk9FUlJPUlNfSUQpLCBcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfUEhZX1RYUE9XRVJfR0VUX1RBUkdFVF9NSU5fSUQpLCBcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfUEhZX1RYUE9XRVJfR0VUX1RBUkdFVF9NQVhfSUQpLCBcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfTk9JU0VfQ0JfSUQpLCBcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfQk1BQ19MRURfSFdfREVJTklUX0lEKSwgXAotCU5BTUVfRU5UUlkoV0xSUENfV0xDX0JNQUNfTEVEX0hXX01BU0tfSU5JVF9JRCksIFwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19QTExSRVFfSUQpLCBcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfQk1BQ19UQUNMRUFSX0lEKSwgXAotCU5BTUVfRU5UUlkoV0xSUENfV0xDX0JNQUNfU0VUX0NMS19JRCksIFwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19QSFlfT0ZETV9SQVRFU0VUX1dBUl9JRCksIFwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19QSFlfQkZfUFJFRU1QVF9FTkFCTEVfSUQpLCBcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfQk1BQ19ET0lPVkFSU19JRCksIFwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19CTUFDX0RVTVBfSUQpLCBcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfQ0lTV1JJVEVfSUQpLCBcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfQ0lTRFVNUF9JRCksIFwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19VUERBVEVfUEhZX01PREVfSUQpLCBcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfUkVTRVRfQk1BQ19ET05FX0lEKSwgXAotCU5BTUVfRU5UUlkoV0xSUENfV0xDX0JNQUNfTEVEX0JMSU5LX0VWRU5UX0lEKSwgXAotCU5BTUVfRU5UUlkoV0xSUENfV0xDX0JNQUNfTEVEX1NFVF9JRCksIFwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19CTUFDX0xFRF9CTElOS19JRCksIFwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19CTUFDX0xFRF9JRCksIFwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19CTUFDX1JBVEVfU0hNX09GRlNFVF9JRCksIFwKLQlOQU1FX0VOVFJZKFdMUlBDX1NJX0lTQ09SRV9VUF9JRCksIFwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19CTUFDX1BTX1NXSVRDSF9JRCksCVwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19QSFlfU1RGX1NTTU9ERV9HRVRfSUQpLCBcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfQk1BQ19ERUJVR19JRCksIFwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19FWFRMT0dfTVNHX0lEKSwgXAotCU5BTUVfRU5UUlkoV0xSUENfV0xDX0VYVExPR19DRkdfSUQpLCBcCi0JTkFNRV9FTlRSWShXTFJQQ19CQ01fQVNTRVJUX0xPR19JRCksIFwKLQlOQU1FX0VOVFJZKFdMUlBDX0JDTV9BU1NFUlRfVFlQRV9JRCksIFwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19CTUFDX1NFVF9QSFlDQUxfQ0FDSEVfRkxBR19JRCksIFwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19CTUFDX0dFVF9QSFlDQUxfQ0FDSEVfRkxBR19JRCksIFwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19QSFlfQ0FMX0NBQ0hFX0lOSVRfSUQpLCBcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfUEhZX0NBTF9DQUNIRV9ERUlOSVRfSUQpLCBcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfQk1BQ19IV19VUF9JRCksIFwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19CTUFDX1NFVF9UWFBXUl9QRVJDRU5UX0lEKSwgXAotCU5BTUVfRU5UUlkoV0xSUENfV0xDX1BIWUNIQUlOX0FDVElWRV9HRVRfSUQpLCBcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfQk1BQ19CTElOS19TWU5DX0lEKSwgXAotCU5BTUVfRU5UUlkoV0xSUENfV0xDX0JNQUNfVUNPREVfREJHU0VMX1NFVF9JRCksIFwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19CTUFDX1VDT0RFX0RCR1NFTF9HRVRfSUQpLCBcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfUEhZX1JBREFSX0RFVEVDVF9NT0RFX1NFVF9JRCksIFwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19QSFlfQUNJTV9OT0lTRU1fUkVTRVRfTlBIWV9JRCksIFwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19QSFlfSU5URVJGRVJfU0VUX05QSFlfSUQpLCBcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfQk1BQ19JRlNDVExfRURDUlNfU0VUX0lEKSwgXAotCU5BTUVfRU5UUlkoV0xSUENfV0xDX1BLVEVOR1RYKSwgXAotCU5BTUVfRU5UUlkoV0xSUENfV0xDX0JNQUNfU0VUX0RFQUYpLCBcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfQk1BQ19DTEVBUl9ERUFGKSwgXAotCU5BTUVfRU5UUlkoV0xSUENfV0xDX0JNQUNfQlRDX0ZMQUdTX1NFVF9JRCksIFwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19CTUFDX0JUQ19GTEFHU19HRVRfSUQpLCBcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfQk1BQ19TRVRfUkNNVEFfVFlQRV9JRCksIFwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19CTUFDX0NDQV9TVEFUU19SRUFEX0lEKSwgXAotCU5BTUVfRU5UUlkoV0xSUENfV0xDX0JNQUNfQU5UU0VMX1NFVF9JRCksIFwKLQlOQU1FX0VOVFJZKFdMUlBDX1dMQ19CTUFDX1NFVF9VQ09ERV9MT0FERUQpLCBcCi0JTkFNRV9FTlRSWShXTFJQQ19XTENfUEhZX0xEUENfU0VUX0lEKSwJXAotCXswLCBOVUxMfSBcCi0JfQotCi1zdGF0aWMgX19pbmxpbmUgY2hhciAqX3dsY19ycGNfaWRfbG9va3VwKGNvbnN0IHN0cnVjdCBuYW1lX2VudHJ5ICp0YmwsIGludCBfaWQpCi17Ci0JY29uc3Qgc3RydWN0IG5hbWVfZW50cnkgKmVsdCA9IHRibDsKLQlzdGF0aWMgY2hhciBfX3Vua25vd25bNjRdOwotCWZvciAoOyBlbHQtPm5hbWUgIT0gTlVMTDsgZWx0KyspIHsKLQkJaWYgKF9pZCA9PSBlbHQtPmlkKQotCQkJYnJlYWs7Ci0JfQotCWlmIChfaWQgPT0gZWx0LT5pZCkKLQkJc3RybmNweShfX3Vua25vd24sIGVsdC0+bmFtZSwgc2l6ZW9mKF9fdW5rbm93bikpOwotCWVsc2UKLQkJc25wcmludGYoX191bmtub3duLCBzaXplb2YoX191bmtub3duKSwgIklEOiVkIiwgX2lkKTsKLQlyZXR1cm4gX191bmtub3duOwotfQotCi0jZGVmaW5lIFdMQ19SUENfSURfTE9PS1VQKHRibCwgX2lkKSAoX3dsY19ycGNfaWRfbG9va3VwKHRibCwgX2lkKSkKLQotI2VuZGlmCQkJCS8qIEJDTURCRyAqLwotCi0vKiByZWZlciB0byB0eHB3cl9saW1pdHNfdCBmb3IgZWFjaCBlbGVtZW50cywgbWNzMzIgaXMgdGhlIGF0IHRoZSBlbmQgZm9yIDEgYnl0ZSAqLwotI2RlZmluZSBUWFBPV0VSX1hEUl9TWgkocm91bmR1cChXTENfTlVNX1JBVEVTX0NDSywgNCkgKyByb3VuZHVwKFdMQ19OVU1fUkFURVNfT0ZETSwgNCkgKiA0ICsgXAotCXJvdW5kdXAoV0xDX05VTV9SQVRFU19NQ1NfMV9TVFJFQU0sIDQpICogNiArIHJvdW5kdXAoV0xDX05VTV9SQVRFU19NQ1NfMl9TVFJFQU0sIDQpICogMiArIFwKLQlyb3VuZHVwKDEsIDQpKQotCi0jZGVmaW5lIHdsY19ycGNfdHhwd3JfbGltaXRzKGIsIHR4cHdyLCBvcCwgZXJyKQlcCi0JZG8gewkJCQkJCQkJCQkJXAotCQkoZXJyKSA9IGJjbV94ZHJfIyNvcCMjX3U4X3ZlYygoYiksICh0eHB3ciktPmNjaywgV0xDX05VTV9SQVRFU19DQ0spOwkJXAotCQlBU1NFUlQoIShlcnIpKTsJCQkJCQkJCQlcCi0JCQkJCQkJCQkJCQlcCi0JCS8qIDIwIE1IeiBMZWdhY3kgT0ZETSByYXRlcyB3aXRoIFNJU08gdHJhbnNtaXNzaW9uICovCQkJCVwKLQkJKGVycikgPSBiY21feGRyXyMjb3AjI191OF92ZWMoKGIpLCAodHhwd3IpLT5vZmRtLCBXTENfTlVNX1JBVEVTX09GRE0pOwlcCi0JCUFTU0VSVCghKGVycikpOwkJCQkJCQkJCVwKLQkJCQkJCQkJCQkJCVwKLQkJLyogMjAgTUh6IExlZ2FjeSBPRkRNIHJhdGVzIHdpdGggQ0REIHRyYW5zbWlzc2lvbiAqLwkJCQlcCi0JCShlcnIpID0gYmNtX3hkcl8jI29wIyNfdThfdmVjKChiKSwgKHR4cHdyKS0+b2ZkbV9jZGQsIFdMQ19OVU1fUkFURVNfT0ZETSk7ICAgXAotCQlBU1NFUlQoIShlcnIpKTsJCQkJCQkJCQlcCi0JCQkJCQkJCQkJCQlcCi0JCS8qIDQwIE1IeiBMZWdhY3kgT0ZETSByYXRlcyB3aXRoIFNJU08gdHJhbnNtaXNzaW9uICovCQkJCVwKLQkJKGVycikgPSBiY21feGRyXyMjb3AjI191OF92ZWMoKGIpLCAodHhwd3IpLT5vZmRtXzQwX3Npc28sIFdMQ19OVU1fUkFURVNfT0ZETSk7IFwKLQkJQVNTRVJUKCEoZXJyKSk7CQkJCQkJCQkJXAotCQkJCQkJCQkJCQkJXAotCQkvKiA0MCBNSHogTGVnYWN5IE9GRE0gcmF0ZXMgd2l0aCBDREQgdHJhbnNtaXNzaW9uICovCQkJCVwKLQkJKGVycikgPSBiY21feGRyXyMjb3AjI191OF92ZWMoKGIpLCAodHhwd3IpLT5vZmRtXzQwX2NkZCwgV0xDX05VTV9SQVRFU19PRkRNKTsgXAotCQlBU1NFUlQoIShlcnIpKTsJCQkJCQkJCQlcCi0JCQkJCQkJCQkJCQlcCi0JCS8qIDIwTUh6IE1DUyByYXRlcyBTSVNPL0NERC9TVEJDL1NETSAqLwkJCQkJCQkgXAotCQkoZXJyKSA9IGJjbV94ZHJfIyNvcCMjX3U4X3ZlYygoYiksICh0eHB3ciktPm1jc18yMF9zaXNvLCBXTENfTlVNX1JBVEVTX01DU18xX1NUUkVBTSk7IFwKLQkJQVNTRVJUKCEoZXJyKSk7CQkJCQkJCQkJXAotCQkJCQkJCQkJCQkJXAotCQkoZXJyKSA9IGJjbV94ZHJfIyNvcCMjX3U4X3ZlYygoYiksICh0eHB3ciktPm1jc18yMF9jZGQsIFdMQ19OVU1fUkFURVNfTUNTXzFfU1RSRUFNKTsgXAotCQlBU1NFUlQoIShlcnIpKTsJCQkJCQkJCQlcCi0JCQkJCQkJCQkJCQlcCi0JCShlcnIpID0gYmNtX3hkcl8jI29wIyNfdThfdmVjKChiKSwgKHR4cHdyKS0+bWNzXzIwX3N0YmMsIFdMQ19OVU1fUkFURVNfTUNTXzFfU1RSRUFNKTsgXAotCQlBU1NFUlQoIShlcnIpKTsJCQkJCQkJCQlcCi0JCQkJCQkJCQkJCQlcCi0JCShlcnIpID0gYmNtX3hkcl8jI29wIyNfdThfdmVjKChiKSwgKHR4cHdyKS0+bWNzXzIwX21pbW8sIFdMQ19OVU1fUkFURVNfTUNTXzJfU1RSRUFNKTsgXAotCQlBU1NFUlQoIShlcnIpKTsJCQkJCQkJCQlcCi0JCQkJCQkJCQkJCQlcCi0JCS8qIDQwTUh6IE1DUyByYXRlcyBTSVNPL0NERC9TVEJDL1NETSAqLwkJCQkJCQkgXAotCQkoZXJyKSA9IGJjbV94ZHJfIyNvcCMjX3U4X3ZlYygoYiksICh0eHB3ciktPm1jc180MF9zaXNvLCBXTENfTlVNX1JBVEVTX01DU18xX1NUUkVBTSk7IFwKLQkJQVNTRVJUKCEoZXJyKSk7CQkJCQkJCQkJXAotCQkJCQkJCQkJCQkJXAotCQkoZXJyKSA9IGJjbV94ZHJfIyNvcCMjX3U4X3ZlYygoYiksICh0eHB3ciktPm1jc180MF9jZGQsIFdMQ19OVU1fUkFURVNfTUNTXzFfU1RSRUFNKTsgXAotCQlBU1NFUlQoIShlcnIpKTsJCQkJCQkJCQlcCi0JCQkJCQkJCQkJCQlcCi0JCShlcnIpID0gYmNtX3hkcl8jI29wIyNfdThfdmVjKChiKSwgKHR4cHdyKS0+bWNzXzQwX3N0YmMsIFdMQ19OVU1fUkFURVNfTUNTXzFfU1RSRUFNKTsgXAotCQlBU1NFUlQoIShlcnIpKTsJCQkJCQkJCQlcCi0JCQkJCQkJCQkJCQlcCi0JCShlcnIpID0gYmNtX3hkcl8jI29wIyNfdThfdmVjKChiKSwgKHR4cHdyKS0+bWNzXzQwX21pbW8sIFdMQ19OVU1fUkFURVNfTUNTXzJfU1RSRUFNKTsgXAotCQlBU1NFUlQoIShlcnIpKTsJCQkJCQkJCQlcCi0JfSB3aGlsZSAoMCkKLQotdHlwZWRlZiBzdHJ1Y3Qgd2xjX3JwY19jdHggewotCXJwY19pbmZvX3QgKnJwYzsKLQl3bGNfaW5mb190ICp3bGM7Ci0Jd2xjX2h3X2luZm9fdCAqd2xjX2h3OwotfSB3bGNfcnBjX2N0eF90OwotCi1zdGF0aWMgaW5saW5lIHJwY19idWZfdCAqd2xjX3JwY19idWZfYWxsb2MocnBjX2luZm9fdCAqcnBjLCBiY21feGRyX2J1Zl90ICpiLAotCQkJCQkgICB1aW50IGxlbiwgd2xjX3JwY19pZF90IHJwY19pZCkKLXsKLQlycGNfYnVmX3QgKnJwY19idWY7Ci0KLQlycGNfYnVmID0gYmNtX3JwY19idWZfYWxsb2MocnBjLCBsZW4gKyBzaXplb2YodTMyKSk7Ci0KLQlpZiAoIXJwY19idWYpCi0JCXJldHVybiBOVUxMOwotCi0JYmNtX3hkcl9idWZfaW5pdChiLCBiY21fcnBjX2J1Zl9kYXRhKGJjbV9ycGNfdHBfZ2V0KHJwYyksIHJwY19idWYpLAotCQkJIGxlbiArIHNpemVvZih1MzIpKTsKLQotCWJjbV94ZHJfcGFja191MzIoYiwgcnBjX2lkKTsKLQotCXJldHVybiBycGNfYnVmOwotfQotCi0jaWYgZGVmaW5lZChCQ01EQkcpCi1zdGF0aWMgX19pbmxpbmUgd2xjX3JwY19pZF90Ci13bGNfcnBjX2lkX2dldChzdHJ1Y3QgcnBjX2luZm8gKnJwYywgcnBjX2J1Zl90ICpidWYpCi17Ci0Jd2xjX3JwY19pZF90IHJwY19pZDsKLQliY21feGRyX2J1Zl90IGI7Ci0KLQliY21feGRyX2J1Zl9pbml0KCZiLCBiY21fcnBjX2J1Zl9kYXRhKGJjbV9ycGNfdHBfZ2V0KHJwYyksIGJ1ZiksCi0JCQkgc2l6ZW9mKHUzMikpOwotCi0JYmNtX3hkcl91bnBhY2tfdTMyKCZiLCAodTMyICopKCh1bnNpZ25lZCBsb25nKSAmIHJwY19pZCkpOwotCXJldHVybiBycGNfaWQ7Ci19Ci0jZW5kaWYKLQotc3RhdGljIF9faW5saW5lIGludCBfd2xjX3JwY19jYWxsKHN0cnVjdCBycGNfaW5mbyAqcnBjLCBycGNfYnVmX3QgKnNlbmQpCi17Ci0JaW50IF9lcnIgPSAwOwotI2lmIGRlZmluZWQoQkNNREJHKQotCXdsY19ycGNfaWRfdCBycGNfaWQgPSB3bGNfcnBjX2lkX2dldChycGMsIHNlbmQpOwotCS8qIGNvbnN0IHN0cnVjdCBuYW1lX2VudHJ5IHJwY19uYW1lX3RibFtdID0gUlBDX0lEX1RBQkxFOyAqLwotCXN0YXRpYyBzdHJ1Y3QgbmFtZV9lbnRyeSBycGNfbmFtZV90YmxbXSA9IFJQQ19JRF9UQUJMRTsKLQlXTF9UUkFDRSgoIiVzOiBDYWxsZWQgaWQgJXNcbiIsIF9fZnVuY19fLAotCQkgIFdMQ19SUENfSURfTE9PS1VQKHJwY19uYW1lX3RibCwgcnBjX2lkKSkpOwotI2VuZGlmCi0JX2VyciA9IGJjbV9ycGNfY2FsbChycGMsIHNlbmQpOwotCWlmIChfZXJyKSB7Ci0jaWYgZGVmaW5lZChCQ01EQkcpCi0JCVdMX0VSUk9SKCgiJXM6IENhbGwgaWQgJXMgRkFJTEVEXG4iLCBfX2Z1bmNfXywKLQkJCSAgV0xDX1JQQ19JRF9MT09LVVAocnBjX25hbWVfdGJsLCBycGNfaWQpKSk7Ci0jZW5kaWYKLQkJX2VyciA9IDA7Ci0JfQotCXJldHVybiBfZXJyOwotfQotCi0jZGVmaW5lIHdsY19ycGNfY2FsbChycGMsIHNlbmQpIChfd2xjX3JwY19jYWxsKHJwYywgc2VuZCkpCi0KLSNpbmNsdWRlIDxzYmhuZGRtYS5oPgotI2luY2x1ZGUgPHNiaG5kcGlvLmg+Ci0jaW5jbHVkZSA8ZDExLmg+Ci0KLSNpZmRlZiBXTENfTE9XCi1leHRlcm4gdm9pZCB3bGNfcnBjX2JtYWNfZGlzcGF0Y2god2xjX3JwY19jdHhfdCAqcnBjX2N0eCwgc3RydWN0IHJwY19idWYgKmJ1Zik7Ci1leHRlcm4gdm9pZCB3bGNfcnBjX2JtYWNfZHVtcF90eGZpZm9oaXN0KHdsY19od19pbmZvX3QgKndsY19odywKLQkJCQkJIGJvb2wgZHVtcF9jbGVhcik7Ci0jZWxzZQotZXh0ZXJuIHZvaWQgd2xjX3JwY19oaWdoX2Rpc3BhdGNoKHdsY19ycGNfY3R4X3QgKmN0eCwgc3RydWN0IHJwY19idWYgKmJ1Zik7Ci0jZW5kaWYKLQotLyogUGFja2VkIHN0cnVjdHVyZSBmb3IgZWFzZSBvZiB0cmFuc3BvcnQgYWNyb3NzIFJQQyBidXMgYWxvbmcgdTMyIGJvdW5kYXJ5ICovCi10eXBlZGVmIHN0cnVjdCB3bGNfcnBjX3R4c3RhdHVzIHsKLQl1MzIgUEFEX2ZyYW1lbGVuOwotCXUzMiBzdGF0dXNfZnJhbWVpZDsKLQl1MzIgc2VxdWVuY2VfbGFzdHR4dGltZTsKLQl1MzIgYWNrcGh5cnhzaF9waHllcnI7Ci19IHdsY19ycGNfdHhzdGF0dXNfdDsKLQotc3RhdGljIGlubGluZQotICAgIHZvaWQgdHhzdGF0dXMycnBjX3R4c3RhdHVzKHR4X3N0YXR1c190ICp0eHN0YXR1cywKLQkJCSAgICAgICB3bGNfcnBjX3R4c3RhdHVzX3QgKnJwY190eHN0YXR1cykKLXsKLQlycGNfdHhzdGF0dXMtPlBBRF9mcmFtZWxlbiA9IHR4c3RhdHVzLT5mcmFtZWxlbjsKLQlycGNfdHhzdGF0dXMtPnN0YXR1c19mcmFtZWlkID0KLQkgICAgKHR4c3RhdHVzLT5zdGF0dXMgPDwgMTYpIHwgdHhzdGF0dXMtPmZyYW1laWQ7Ci0JcnBjX3R4c3RhdHVzLT5zZXF1ZW5jZV9sYXN0dHh0aW1lID0KLQkgICAgKHR4c3RhdHVzLT5zZXF1ZW5jZSA8PCAxNikgfCB0eHN0YXR1cy0+bGFzdHR4dGltZTsKLQlycGNfdHhzdGF0dXMtPmFja3BoeXJ4c2hfcGh5ZXJyID0KLQkgICAgKHR4c3RhdHVzLT5hY2twaHlyeHNoIDw8IDE2KSB8IHR4c3RhdHVzLT5waHllcnI7Ci19Ci0KLXN0YXRpYyBpbmxpbmUKLSAgICB2b2lkIHJwY190eHN0YXR1czJ0eHN0YXR1cyh3bGNfcnBjX3R4c3RhdHVzX3QgKnJwY190eHN0YXR1cywKLQkJCSAgICAgICB0eF9zdGF0dXNfdCAqdHhzdGF0dXMpCi17Ci0JdHhzdGF0dXMtPmZyYW1lbGVuID0gcnBjX3R4c3RhdHVzLT5QQURfZnJhbWVsZW4gJiAweGZmZmY7Ci0JdHhzdGF0dXMtPnN0YXR1cyA9IChycGNfdHhzdGF0dXMtPnN0YXR1c19mcmFtZWlkID4+IDE2KSAmIDB4ZmZmZjsKLQl0eHN0YXR1cy0+ZnJhbWVpZCA9IHJwY190eHN0YXR1cy0+c3RhdHVzX2ZyYW1laWQgJiAweGZmZmY7Ci0JdHhzdGF0dXMtPnNlcXVlbmNlID0gKHJwY190eHN0YXR1cy0+c2VxdWVuY2VfbGFzdHR4dGltZSA+PiAxNikgJiAweGZmZmY7Ci0JdHhzdGF0dXMtPmxhc3R0eHRpbWUgPSBycGNfdHhzdGF0dXMtPnNlcXVlbmNlX2xhc3R0eHRpbWUgJiAweGZmZmY7Ci0JdHhzdGF0dXMtPmFja3BoeXJ4c2ggPSAocnBjX3R4c3RhdHVzLT5hY2twaHlyeHNoX3BoeWVyciA+PiAxNikgJiAweGZmZmY7Ci0JdHhzdGF0dXMtPnBoeWVyciA9IHJwY190eHN0YXR1cy0+YWNrcGh5cnhzaF9waHllcnIgJiAweGZmZmY7Ci19Ci0KLWV4dGVybiB2b2lkIHdsY19ibWFjX2RuZ2xfcmVib290KHJwY19pbmZvX3QgKnJwYyk7Ci0KLSNlbmRpZgkJCQkvKiBXTENfUlBDX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvc3lzL3dsY19ycGN0eC5oIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9zeXMvd2xjX3JwY3R4LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0MjcxNTQuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9zeXMvd2xjX3JwY3R4LmgKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDEwIEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKgotICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55Ci0gKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgotICoKLSAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUwotICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZCi0gKiBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKLSAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04KLSAqIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4KLSAqIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0gKi8KLQotI2lmbmRlZiBfd2xjX3JwY3R4X2hfCi0jZGVmaW5lIF93bGNfcnBjdHhfaF8KLQotLyogZm9yd2FyZCBkZWNsYXJhdGlvbiAqLwotc3RydWN0IHdsY19pbmZvOwotCi0vKiBUaGlzIGNvbnRyb2xzIGhvdyBtYW55IHBhY2tldHMgYXJlIGdpdmVuIHRvIHRoZSBkb25nbGUuIFRoaXMgaXMgcmVxdWlyZWQgYXMKLSAqIE5UWEQgbmVlZHMgdG8gYmUgcG93ZXIgb2YgMiBidXQgd2UgbWF5IG5vdCBoYXZlIGVub3VnaCBtZW1vcnkgdG8gYWJzb3JiIHRoYXQKLSAqIGxhcmdlIG51bWJlciBvZiBmcmFtZXMKLSAqLwotI2lmbmRlZiBOUlBDVFhCVUZQT1NUCi0jZGVmaW5lIE5SUENUWEJVRlBPU1QgTlRYRAotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFdMQ19ISUdIX09OTFkpCi0KLXN0cnVjdCB3bGNfcnBjX3BoeSB7Ci0Jc3RydWN0IHJwY19pbmZvICpycGM7Ci19OwotCi0jZGVmaW5lIFJQQ1RYX0VOQUIocHViKQkJKHRydWUpCi1leHRlcm4gcnBjdHhfaW5mb190ICp3bGNfcnBjdHhfYXR0YWNoKHdsY19wdWJfdCAqcHViLCBzdHJ1Y3Qgd2xjX2luZm8gKndsYyk7Ci1leHRlcm4gaW50IHdsY19ycGN0eF9maWZvaW5pdChycGN0eF9pbmZvX3QgKnJwY3R4LCB1aW50IGZpZm8sIHVpbnQgbnR4ZCk7Ci1leHRlcm4gdm9pZCB3bGNfcnBjdHhfZGV0YWNoKHJwY3R4X2luZm9fdCAqcnBjdHgpOwotZXh0ZXJuIGludCB3bGNfcnBjdHhfZHVtcChycGN0eF9pbmZvX3QgKnJwY3R4LCBzdHJ1Y3QgYmNtc3RyYnVmICpiKTsKLWV4dGVybiB2b2lkICp3bGNfcnBjdHhfZ2V0bmV4dHR4cChycGN0eF9pbmZvX3QgKnJwY3R4LCB1aW50IGZpZm8pOwotZXh0ZXJuIHZvaWQgd2xjX3JwY3R4X3R4cmVjbGFpbShycGN0eF9pbmZvX3QgKnJwY3R4KTsKLWV4dGVybiB1aW50IHdsY19ycGN0eF90eGF2YWlsKHJwY3R4X2luZm9fdCAqcnBjdHgsIHVpbnQgZmlmbyk7Ci1leHRlcm4gaW50IHdsY19ycGN0eF9wa3RlbmcocnBjdHhfaW5mb190ICpycGN0eCwgdWludCBmaWZvLCB2b2lkICpwKTsKLWV4dGVybiBpbnQgd2xjX3JwY3R4X3R4KHJwY3R4X2luZm9fdCAqcnBjdHgsIHVpbnQgZmlmbywgdm9pZCAqcCwgYm9vbCBjb21taXQsCi0JCQl1MTYgZnJhbWVpZCwgdTggdHhwa3RwZW5kKTsKLWV4dGVybiB2b2lkIHdsY19ycGN0eF90eHBrdHBlbmRpbmMocnBjdHhfaW5mb190ICpycGN0eCwgdWludCBmaWZvLCB1OCB2YWwpOwotZXh0ZXJuIHZvaWQgd2xjX3JwY3R4X3R4cGt0cGVuZGRlYyhycGN0eF9pbmZvX3QgKnJwY3R4LCB1aW50IGZpZm8sIHU4IHZhbCk7Ci1leHRlcm4gdm9pZCB3bGNfcnBjdHhfdHhwa3RwZW5kY2xyKHJwY3R4X2luZm9fdCAqcnBjdHgsIHVpbnQgZmlmbyk7Ci1leHRlcm4gaW50IHdsY19ycGN0eF90eHBrdHBlbmQocnBjdHhfaW5mb190ICpycGN0eCwgdWludCBmaWZvLCBib29sIGFsbCk7Ci0KLSNlbHNlCi0jZGVmaW5lCVJQQ1RYX0VOQUIocHViKQkJCShmYWxzZSkKLSNkZWZpbmUJd2xjX3JwY3R4X2F0dGFjaChwdWIsIHdsYykJKE5VTEwpCi0jZGVmaW5lCXdsY19ycGN0eF9maWZvaW5pdChycGN0eCwgZmlmbywgbnR4ZCkgKDApCi0jZGVmaW5lCXdsY19ycGN0eF9kZXRhY2gocnBjdHgpCQlBU1NFUlQoMCkKLSNkZWZpbmUJd2xjX3JwY3R4X3R4YXZhaWwocnBjdHgsIGYpCShmYWxzZSkKLSNkZWZpbmUJd2xjX3JwY3R4X2R1bXAocnBjdHgsIGIpCQkoMCkKLSNkZWZpbmUJd2xjX3JwY3R4X2dldG5leHR0eHAocnBjdHgsIGYpCQkoTlVMTCkKLSNkZWZpbmUJd2xjX3JwY3R4X3R4cmVjbGFpbShycGN0eCkJCUFTU0VSVCgwKQotI2RlZmluZQl3bGNfcnBjdHhfcGt0ZW5nKHJwY3R4LCBmaWZvLCBwKQlkbyB7IH0gd2hpbGUgKDApCi0jZGVmaW5lCXdsY19ycGN0eF90eChycGN0eCwgZiwgcCwgYywgZmlkLCB0KQkoMCkKLSNkZWZpbmUJd2xjX3JwY3R4X3R4cGt0cGVuZGluYyhycGN0eCwgZiwgdmFsKQlkbyB7IH0gd2hpbGUgKDApCi0jZGVmaW5lCXdsY19ycGN0eF90eHBrdHBlbmRkZWMocnBjdHgsIGYsIHZhbCkJZG8geyB9IHdoaWxlICgwKQotI2RlZmluZQl3bGNfcnBjdHhfdHhwa3RwZW5kY2xyKHJwY3R4LCBmKQlkbyB7IH0gd2hpbGUgKDApCi0jZGVmaW5lCXdsY19ycGN0eF90eHBrdHBlbmQocnBjdHgsIGYsIGFsbCkJKDApCi0KLSNlbmRpZgkJCQkvKiBXTENfSElHSCAqLwotCi0jZW5kaWYJCQkJLyogX3dsY19ycGN0eF9oXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9zeXMvd2xjX3NjYi5oIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9zeXMvd2xjX3NjYi5oCmluZGV4IGNlMjZjNzQuLmZlODRlOTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvc3lzL3dsY19zY2IuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3N5cy93bGNfc2NiLmgKQEAgLTE5LDcgKzE5LDcgQEAKIAogI2luY2x1ZGUgPHByb3RvLzgwMi4xZC5oPgogCi1leHRlcm4gYm9vbCB3bGNfYWdncmVnYXRhYmxlKHdsY19pbmZvX3QgKndsYywgdTggdGlkKTsKK2V4dGVybiBib29sIHdsY19hZ2dyZWdhdGFibGUoc3RydWN0IHdsY19pbmZvICp3bGMsIHU4IHRpZCk7CiAKICNkZWZpbmUgQU1QRFVfVFhfQkFfTUFYX1dTSVpFCTY0CS8qIG1heCBUeCBiYSB3aW5kb3cgc2l6ZSAoaW4gcGR1KSAqLwogLyogc3RydWN0dXJlIHRvIHN0b3JlIHBlci10aWQgc3RhdGUgZm9yIHRoZSBhbXBkdSBpbml0aWF0b3IgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvc3lzL3dsY19zdGYuYyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvc3lzL3dsY19zdGYuYwppbmRleCA0NzI4YWQ5Li44OTc1YjA5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3N5cy93bGNfc3RmLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9zeXMvd2xjX3N0Zi5jCkBAIC0xNSw4ICsxNSw4IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPHdsY19jZmcuaD4KLSNpbmNsdWRlIDxsaW51eHZlci5oPgogI2luY2x1ZGUgPGJjbWRlZnMuaD4KICNpbmNsdWRlIDxvc2wuaD4KICNpbmNsdWRlIDxiY211dGlscy5oPgpAQCAtMjUsMjkgKzI1LDMzIEBACiAjaW5jbHVkZSA8cHJvdG8vODAyLjExLmg+CiAjaW5jbHVkZSA8d2xpb2N0bC5oPgogI2luY2x1ZGUgPGJjbXdpZmkuaD4KKyNpbmNsdWRlIDxzYmhuZHBpby5oPgorI2luY2x1ZGUgPHNiaG5kZG1hLmg+CiAjaW5jbHVkZSA8ZDExLmg+CiAjaW5jbHVkZSA8d2xjX3JhdGUuaD4KICNpbmNsdWRlIDx3bGNfcHViLmg+CiAjaW5jbHVkZSA8d2xjX2tleS5oPgogI2luY2x1ZGUgPHdsY19jaGFubmVsLmg+CiAjaW5jbHVkZSA8d2xjX2Jzc2NmZy5oPgorI2luY2x1ZGUgPHdsY19ldmVudC5oPgogI2luY2x1ZGUgPHdsY19tYWM4MDIxMS5oPgogI2luY2x1ZGUgPHdsY19zY2IuaD4KICNpbmNsdWRlIDx3bF9leHBvcnQuaD4KICNpbmNsdWRlIDx3bGNfYm1hYy5oPgogI2luY2x1ZGUgPHdsY19zdGYuaD4KKyNpbmNsdWRlIDx3bF9kYmcuaD4KIAogI2RlZmluZSBXTENfU1RGX1NTX1NUQkNfUlgod2xjKSAoV0xDSVNOUEhZKHdsYy0+YmFuZCkgJiYgXAogCU5SRVZfR1Qod2xjLT5iYW5kLT5waHlyZXYsIDMpICYmIE5SRVZfTEUod2xjLT5iYW5kLT5waHlyZXYsIDYpKQogCi1zdGF0aWMgczggd2xjX3N0Zl9zdGJjX3J4X2dldCh3bGNfaW5mb190ICp3bGMpOwotc3RhdGljIGJvb2wgd2xjX3N0Zl9zdGJjX3R4X3NldCh3bGNfaW5mb190ICp3bGMsIHMzMiBpbnRfdmFsKTsKLXN0YXRpYyBpbnQgd2xjX3N0Zl90eGNvcmVfc2V0KHdsY19pbmZvX3QgKndsYywgdTggTnN0cywgdTggdmFsKTsKLXN0YXRpYyBpbnQgd2xjX3N0Zl9zcGF0aWFsX3BvbGljeV9zZXQod2xjX2luZm9fdCAqd2xjLCBpbnQgdmFsKTsKLXN0YXRpYyB2b2lkIHdsY19zdGZfc3RiY19yeF9odF91cGRhdGUod2xjX2luZm9fdCAqd2xjLCBpbnQgdmFsKTsKK3N0YXRpYyBzOCB3bGNfc3RmX3N0YmNfcnhfZ2V0KHN0cnVjdCB3bGNfaW5mbyAqd2xjKTsKK3N0YXRpYyBib29sIHdsY19zdGZfc3RiY190eF9zZXQoc3RydWN0IHdsY19pbmZvICp3bGMsIHMzMiBpbnRfdmFsKTsKK3N0YXRpYyBpbnQgd2xjX3N0Zl90eGNvcmVfc2V0KHN0cnVjdCB3bGNfaW5mbyAqd2xjLCB1OCBOc3RzLCB1OCB2YWwpOworc3RhdGljIGludCB3bGNfc3RmX3NwYXRpYWxfcG9saWN5X3NldChzdHJ1Y3Qgd2xjX2luZm8gKndsYywgaW50IHZhbCk7CitzdGF0aWMgdm9pZCB3bGNfc3RmX3N0YmNfcnhfaHRfdXBkYXRlKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCBpbnQgdmFsKTsKIAotc3RhdGljIHZvaWQgX3dsY19zdGZfcGh5X3R4YW50X3VwZCh3bGNfaW5mb190ICp3bGMpOwotc3RhdGljIHUxNiBfd2xjX3N0Zl9waHl0eGNoYWluX3NlbCh3bGNfaW5mb190ICp3bGMsIHJhdGVzcGVjX3QgcnNwZWMpOworc3RhdGljIHZvaWQgX3dsY19zdGZfcGh5X3R4YW50X3VwZChzdHJ1Y3Qgd2xjX2luZm8gKndsYyk7CitzdGF0aWMgdTE2IF93bGNfc3RmX3BoeXR4Y2hhaW5fc2VsKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCByYXRlc3BlY190IHJzcGVjKTsKIAogI2RlZmluZSBOU1RTXzEJMQogI2RlZmluZSBOU1RTXzIJMgpAQCAtNjEsNyArNjUsNyBAQAogCSgweDBmKQkJCS8qIEZvciBOc3RzID0gNCwgZW5hYmxlIGFsbCBjb3JlcyAqLwogfTsKIAotc3RhdGljIHZvaWQgd2xjX3N0Zl9zdGJjX3J4X2h0X3VwZGF0ZSh3bGNfaW5mb190ICp3bGMsIGludCB2YWwpCitzdGF0aWMgdm9pZCB3bGNfc3RmX3N0YmNfcnhfaHRfdXBkYXRlKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCBpbnQgdmFsKQogewogCUFTU0VSVCgodmFsID09IEhUX0NBUF9SWF9TVEJDX05PKQogCSAgICAgICB8fCAodmFsID09IEhUX0NBUF9SWF9TVEJDX09ORV9TVFJFQU0pKTsKQEAgLTgyLDcgKzg2LDcgQEAKIH0KIAogLyogZXZlcnkgV0xDX1RFTVBTRU5TRV9QRVJJT0Qgc2Vjb25kcyB0ZW1wZXJhdHVyZSBjaGVjayB0byBkZWNpZGUgd2hldGhlciB0byB0dXJuIG9uL29mZiB0eGNoYWluICovCi12b2lkIHdsY190ZW1wc2Vuc2VfdXBkKHdsY19pbmZvX3QgKndsYykKK3ZvaWQgd2xjX3RlbXBzZW5zZV91cGQoc3RydWN0IHdsY19pbmZvICp3bGMpCiB7CiAJd2xjX3BoeV90ICpwaSA9IHdsYy0+YmFuZC0+cGk7CiAJdWludCBhY3RpdmVfY2hhaW5zLCB0eGNoYWluOwpAQCAtMTA2LDcgKzExMCw3IEBACiB9CiAKIHZvaWQKLXdsY19zdGZfc3NfYWxnb19jaGFubmVsX2dldCh3bGNfaW5mb190ICp3bGMsIHUxNiAqc3NfYWxnb19jaGFubmVsLAord2xjX3N0Zl9zc19hbGdvX2NoYW5uZWxfZ2V0KHN0cnVjdCB3bGNfaW5mbyAqd2xjLCB1MTYgKnNzX2FsZ29fY2hhbm5lbCwKIAkJCSAgICBjaGFuc3BlY190IGNoYW5zcGVjKQogewogCXR4X3Bvd2VyX3QgcG93ZXI7CkBAIC0xNDcsMTIgKzE1MSwxMiBAQAogCQlzZXRiaXQoc3NfYWxnb19jaGFubmVsLCBQSFlfVFhDMV9NT0RFX1NUQkMpOwogfQogCi1zdGF0aWMgczggd2xjX3N0Zl9zdGJjX3J4X2dldCh3bGNfaW5mb190ICp3bGMpCitzdGF0aWMgczggd2xjX3N0Zl9zdGJjX3J4X2dldChzdHJ1Y3Qgd2xjX2luZm8gKndsYykKIHsKIAlyZXR1cm4gKHdsYy0+aHRfY2FwLmNhcCAmIEhUX0NBUF9SWF9TVEJDX01BU0spID4+IEhUX0NBUF9SWF9TVEJDX1NISUZUOwogfQogCi1zdGF0aWMgYm9vbCB3bGNfc3RmX3N0YmNfdHhfc2V0KHdsY19pbmZvX3QgKndsYywgczMyIGludF92YWwpCitzdGF0aWMgYm9vbCB3bGNfc3RmX3N0YmNfdHhfc2V0KHN0cnVjdCB3bGNfaW5mbyAqd2xjLCBzMzIgaW50X3ZhbCkKIHsKIAlpZiAoKGludF92YWwgIT0gQVVUTykgJiYgKGludF92YWwgIT0gT0ZGKSAmJiAoaW50X3ZhbCAhPSBPTikpIHsKIAkJcmV0dXJuIGZhbHNlOwpAQCAtMTczLDcgKzE3Nyw3IEBACiAJcmV0dXJuIHRydWU7CiB9CiAKLWJvb2wgd2xjX3N0Zl9zdGJjX3J4X3NldCh3bGNfaW5mb190ICp3bGMsIHMzMiBpbnRfdmFsKQorYm9vbCB3bGNfc3RmX3N0YmNfcnhfc2V0KHN0cnVjdCB3bGNfaW5mbyAqd2xjLCBzMzIgaW50X3ZhbCkKIHsKIAlpZiAoKGludF92YWwgIT0gSFRfQ0FQX1JYX1NUQkNfTk8pCiAJICAgICYmIChpbnRfdmFsICE9IEhUX0NBUF9SWF9TVEJDX09ORV9TVFJFQU0pKSB7CkBAIC0xOTAsMTAgKzE5NCwxMCBAQAogCXJldHVybiB0cnVlOwogfQogCi1zdGF0aWMgaW50IHdsY19zdGZfdHhjb3JlX3NldCh3bGNfaW5mb190ICp3bGMsIHU4IE5zdHMsIHU4IGNvcmVfbWFzaykKK3N0YXRpYyBpbnQgd2xjX3N0Zl90eGNvcmVfc2V0KHN0cnVjdCB3bGNfaW5mbyAqd2xjLCB1OCBOc3RzLCB1OCBjb3JlX21hc2spCiB7Ci0JV0xfVFJBQ0UoKCJ3bCVkOiAlczogTnN0cyAlZCBjb3JlX21hc2sgJXhcbiIsCi0JCSAgd2xjLT5wdWItPnVuaXQsIF9fZnVuY19fLCBOc3RzLCBjb3JlX21hc2spKTsKKwlXTF9UUkFDRSgid2wlZDogJXM6IE5zdHMgJWQgY29yZV9tYXNrICV4XG4iLAorCQkgd2xjLT5wdWItPnVuaXQsIF9fZnVuY19fLCBOc3RzLCBjb3JlX21hc2spOwogCiAJQVNTRVJUKChOc3RzID4gMCkgJiYgKE5zdHMgPD0gTUFYX1NUUkVBTVNfU1VQUE9SVEVEKSk7CiAKQEAgLTIyNywxMiArMjMxLDEyIEBACiAJcmV0dXJuIEJDTUVfT0s7CiB9CiAKLXN0YXRpYyBpbnQgd2xjX3N0Zl9zcGF0aWFsX3BvbGljeV9zZXQod2xjX2luZm9fdCAqd2xjLCBpbnQgdmFsKQorc3RhdGljIGludCB3bGNfc3RmX3NwYXRpYWxfcG9saWN5X3NldChzdHJ1Y3Qgd2xjX2luZm8gKndsYywgaW50IHZhbCkKIHsKIAlpbnQgaTsKIAl1OCBjb3JlX21hc2sgPSAwOwogCi0JV0xfVFJBQ0UoKCJ3bCVkOiAlczogdmFsICV4XG4iLCB3bGMtPnB1Yi0+dW5pdCwgX19mdW5jX18sIHZhbCkpOworCVdMX1RSQUNFKCJ3bCVkOiAlczogdmFsICV4XG4iLCB3bGMtPnB1Yi0+dW5pdCwgX19mdW5jX18sIHZhbCk7CiAKIAl3bGMtPnN0Zi0+c3BhdGlhbF9wb2xpY3kgPSAoczgpIHZhbDsKIAlmb3IgKGkgPSAxOyBpIDw9IE1BWF9TVFJFQU1TX1NVUFBPUlRFRDsgaSsrKSB7CkBAIC0yNDMsNyArMjQ3LDcgQEAKIAlyZXR1cm4gQkNNRV9PSzsKIH0KIAotaW50IHdsY19zdGZfdHhjaGFpbl9zZXQod2xjX2luZm9fdCAqd2xjLCBzMzIgaW50X3ZhbCwgYm9vbCBmb3JjZSkKK2ludCB3bGNfc3RmX3R4Y2hhaW5fc2V0KHN0cnVjdCB3bGNfaW5mbyAqd2xjLCBzMzIgaW50X3ZhbCwgYm9vbCBmb3JjZSkKIHsKIAl1OCB0eGNoYWluID0gKHU4KSBpbnRfdmFsOwogCXU4IHR4c3RyZWFtczsKQEAgLTI3NCwxMyArMjc4LDE1IEBACiAJCQkJaWYgKFJTUEVDX1NURih3bGMtPmJhbmRzdGF0ZVtpXS0+cnNwZWNfb3ZlcnJpZGUpCiAJCQkJICAgICE9IFBIWV9UWEMxX01PREVfU0lTTykgewogCQkJCQl3bGMtPmJhbmRzdGF0ZVtpXS0+cnNwZWNfb3ZlcnJpZGUgPSAwOwotCQkJCQlXTF9FUlJPUigoIiVzKCk6IHRlbXAgc2Vuc2Ugb3ZlcnJpZGUgbm9uLVNJU08iICIgcnNwZWNfb3ZlcnJpZGUuXG4iLCBfX2Z1bmNfXykpOworCQkJCQlXTF9FUlJPUigiJXMoKTogdGVtcCBzZW5zZSBvdmVycmlkZSBub24tU0lTTyByc3BlY19vdmVycmlkZVxuIiwKKwkJCQkJCSBfX2Z1bmNfXyk7CiAJCQkJfQogCQkJCWlmIChSU1BFQ19TVEYKIAkJCQkgICAgKHdsYy0+YmFuZHN0YXRlW2ldLT5tcnNwZWNfb3ZlcnJpZGUpICE9CiAJCQkJICAgIFBIWV9UWEMxX01PREVfU0lTTykgewogCQkJCQl3bGMtPmJhbmRzdGF0ZVtpXS0+bXJzcGVjX292ZXJyaWRlID0gMDsKLQkJCQkJV0xfRVJST1IoKCIlcygpOiB0ZW1wIHNlbnNlIG92ZXJyaWRlIG5vbi1TSVNPIiAiIG1yc3BlY19vdmVycmlkZS5cbiIsIF9fZnVuY19fKSk7CisJCQkJCVdMX0VSUk9SKCIlcygpOiB0ZW1wIHNlbnNlIG92ZXJyaWRlIG5vbi1TSVNPIG1yc3BlY19vdmVycmlkZVxuIiwKKwkJCQkJCSBfX2Z1bmNfXyk7CiAJCQkJfQogCQkJfQogCX0KQEAgLTMwMyw3ICszMDksNyBAQAogCXJldHVybiBCQ01FX09LOwogfQogCi1pbnQgd2xjX3N0Zl9yeGNoYWluX3NldCh3bGNfaW5mb190ICp3bGMsIHMzMiBpbnRfdmFsKQoraW50IHdsY19zdGZfcnhjaGFpbl9zZXQoc3RydWN0IHdsY19pbmZvICp3bGMsIHMzMiBpbnRfdmFsKQogewogCXU4IHJ4Y2hhaW5fY250OwogCXU4IHJ4Y2hhaW4gPSAodTgpIGludF92YWw7CkBAIC0zNjcsNyArMzczLDcgQEAKIH0KIAogLyogdXBkYXRlIHdsYy0+c3RmLT5zc19vcG1vZGUgd2hpY2ggcmVwcmVzZW50cyB0aGUgb3BlcmF0aW9uYWwgc3RmX3NzIG1vZGUgd2UncmUgdXNpbmcgKi8KLWludCB3bGNfc3RmX3NzX3VwZGF0ZSh3bGNfaW5mb190ICp3bGMsIHdsY2JhbmRfdCAqYmFuZCkKK2ludCB3bGNfc3RmX3NzX3VwZGF0ZShzdHJ1Y3Qgd2xjX2luZm8gKndsYywgc3RydWN0IHdsY2JhbmQgKmJhbmQpCiB7CiAJaW50IHJldF9jb2RlID0gMDsKIAl1OCBwcmV2X3N0Zl9zczsKQEAgLTQwMiw3ICs0MDgsNyBAQAogCXJldHVybiByZXRfY29kZTsKIH0KIAotaW50IHdsY19zdGZfYXR0YWNoKHdsY19pbmZvX3QgKndsYykKK2ludCB3bGNfc3RmX2F0dGFjaChzdHJ1Y3Qgd2xjX2luZm8gKndsYykKIHsKIAl3bGMtPmJhbmRzdGF0ZVtCQU5EXzJHX0lOREVYXS0+YmFuZF9zdGZfc3NfbW9kZSA9IFBIWV9UWEMxX01PREVfU0lTTzsKIAl3bGMtPmJhbmRzdGF0ZVtCQU5EXzVHX0lOREVYXS0+YmFuZF9zdGZfc3NfbW9kZSA9IFBIWV9UWEMxX01PREVfQ0REOwpAQCAtNDI1LDExICs0MzEsMTEgQEAKIAlyZXR1cm4gMDsKIH0KIAotdm9pZCB3bGNfc3RmX2RldGFjaCh3bGNfaW5mb190ICp3bGMpCit2b2lkIHdsY19zdGZfZGV0YWNoKHN0cnVjdCB3bGNfaW5mbyAqd2xjKQogewogfQogCi1pbnQgd2xjX3N0Zl9hbnRfdHhhbnRfdmFsaWRhdGUod2xjX2luZm9fdCAqd2xjLCBzOCB2YWwpCitpbnQgd2xjX3N0Zl9hbnRfdHhhbnRfdmFsaWRhdGUoc3RydWN0IHdsY19pbmZvICp3bGMsIHM4IHZhbCkKIHsKIAlpbnQgYmNtZXJyb3IgPSBCQ01FX09LOwogCkBAIC00NzYsNyArNDgyLDcgQEAKICAqICAgIGRvIHR4LWFudGVubmEgc2VsZWN0aW9uIGZvciBTSVNPIHRyYW5zbWlzc2lvbnMKICAqIGZvciBOUkVWPj03LCBiaXQgNiBhbmQgYml0IDcgbWVhbiBhbnRlbm5hIDAgYW5kIDEgcmVzcGVjdGl2ZWx5LCBuaXQ2K2JpdDcgbWVhbnMgYm90aCBjb3JlcyBhY3RpdmUKICovCi1zdGF0aWMgdm9pZCBfd2xjX3N0Zl9waHlfdHhhbnRfdXBkKHdsY19pbmZvX3QgKndsYykKK3N0YXRpYyB2b2lkIF93bGNfc3RmX3BoeV90eGFudF91cGQoc3RydWN0IHdsY19pbmZvICp3bGMpCiB7CiAJczggdHhhbnQ7CiAKQEAgLTUxNywxMiArNTIzLDEyIEBACiAJd2xjX2JtYWNfdHhhbnRfc2V0KHdsYy0+aHcsIHdsYy0+c3RmLT5waHl0eGFudCk7CiB9CiAKLXZvaWQgd2xjX3N0Zl9waHlfdHhhbnRfdXBkKHdsY19pbmZvX3QgKndsYykKK3ZvaWQgd2xjX3N0Zl9waHlfdHhhbnRfdXBkKHN0cnVjdCB3bGNfaW5mbyAqd2xjKQogewogCV93bGNfc3RmX3BoeV90eGFudF91cGQod2xjKTsKIH0KIAotdm9pZCB3bGNfc3RmX3BoeV9jaGFpbl9jYWxjKHdsY19pbmZvX3QgKndsYykKK3ZvaWQgd2xjX3N0Zl9waHlfY2hhaW5fY2FsYyhzdHJ1Y3Qgd2xjX2luZm8gKndsYykKIHsKIAkvKiBnZXQgYXZhaWxhYmxlIHJ4L3R4IGNoYWlucyAqLwogCXdsYy0+c3RmLT5od190eGNoYWluID0gKHU4KSBnZXRpbnR2YXIod2xjLT5wdWItPnZhcnMsICJ0eGNoYWluIik7CkBAIC01NTksNyArNTY1LDcgQEAKIAl3bGNfc3RmX3NwYXRpYWxfcG9saWN5X3NldCh3bGMsIE1JTl9TUEFUSUFMX0VYUEFOU0lPTik7CiB9CiAKLXN0YXRpYyB1MTYgX3dsY19zdGZfcGh5dHhjaGFpbl9zZWwod2xjX2luZm9fdCAqd2xjLCByYXRlc3BlY190IHJzcGVjKQorc3RhdGljIHUxNiBfd2xjX3N0Zl9waHl0eGNoYWluX3NlbChzdHJ1Y3Qgd2xjX2luZm8gKndsYywgcmF0ZXNwZWNfdCByc3BlYykKIHsKIAl1MTYgcGh5dHhhbnQgPSB3bGMtPnN0Zi0+cGh5dHhhbnQ7CiAKQEAgLTU3MiwxMiArNTc4LDEyIEBACiAJcmV0dXJuIHBoeXR4YW50OwogfQogCi11MTYgd2xjX3N0Zl9waHl0eGNoYWluX3NlbCh3bGNfaW5mb190ICp3bGMsIHJhdGVzcGVjX3QgcnNwZWMpCit1MTYgd2xjX3N0Zl9waHl0eGNoYWluX3NlbChzdHJ1Y3Qgd2xjX2luZm8gKndsYywgcmF0ZXNwZWNfdCByc3BlYykKIHsKIAlyZXR1cm4gX3dsY19zdGZfcGh5dHhjaGFpbl9zZWwod2xjLCByc3BlYyk7CiB9CiAKLXUxNiB3bGNfc3RmX2QxMWhkcnNfcGh5Y3RsX3R4YW50KHdsY19pbmZvX3QgKndsYywgcmF0ZXNwZWNfdCByc3BlYykKK3UxNiB3bGNfc3RmX2QxMWhkcnNfcGh5Y3RsX3R4YW50KHN0cnVjdCB3bGNfaW5mbyAqd2xjLCByYXRlc3BlY190IHJzcGVjKQogewogCXUxNiBwaHl0eGFudCA9IHdsYy0+c3RmLT5waHl0eGFudDsKIAl1MTYgbWFzayA9IFBIWV9UWENfQU5UX01BU0s7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3N5cy93bGNfc3RmLmggYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3N5cy93bGNfc3RmLmgKaW5kZXggZWU5YjAyYS4uOGRlNjM4MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9zeXMvd2xjX3N0Zi5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvc3lzL3dsY19zdGYuaApAQCAtMjAsMjMgKzIwLDI0IEBACiAjZGVmaW5lIE1JTl9TUEFUSUFMX0VYUEFOU0lPTgkwCiAjZGVmaW5lIE1BWF9TUEFUSUFMX0VYUEFOU0lPTgkxCiAKLWV4dGVybiBpbnQgd2xjX3N0Zl9hdHRhY2god2xjX2luZm9fdCAqd2xjKTsKLWV4dGVybiB2b2lkIHdsY19zdGZfZGV0YWNoKHdsY19pbmZvX3QgKndsYyk7CitleHRlcm4gaW50IHdsY19zdGZfYXR0YWNoKHN0cnVjdCB3bGNfaW5mbyAqd2xjKTsKK2V4dGVybiB2b2lkIHdsY19zdGZfZGV0YWNoKHN0cnVjdCB3bGNfaW5mbyAqd2xjKTsKIAotZXh0ZXJuIHZvaWQgd2xjX3RlbXBzZW5zZV91cGQod2xjX2luZm9fdCAqd2xjKTsKLWV4dGVybiB2b2lkIHdsY19zdGZfc3NfYWxnb19jaGFubmVsX2dldCh3bGNfaW5mb190ICp3bGMsCitleHRlcm4gdm9pZCB3bGNfdGVtcHNlbnNlX3VwZChzdHJ1Y3Qgd2xjX2luZm8gKndsYyk7CitleHRlcm4gdm9pZCB3bGNfc3RmX3NzX2FsZ29fY2hhbm5lbF9nZXQoc3RydWN0IHdsY19pbmZvICp3bGMsCiAJCQkJCXUxNiAqc3NfYWxnb19jaGFubmVsLAogCQkJCQljaGFuc3BlY190IGNoYW5zcGVjKTsKLWV4dGVybiBpbnQgd2xjX3N0Zl9zc191cGRhdGUod2xjX2luZm9fdCAqd2xjLCBzdHJ1Y3Qgd2xjYmFuZCAqYmFuZCk7Ci1leHRlcm4gdm9pZCB3bGNfc3RmX3BoeV90eGFudF91cGQod2xjX2luZm9fdCAqd2xjKTsKLWV4dGVybiBpbnQgd2xjX3N0Zl90eGNoYWluX3NldCh3bGNfaW5mb190ICp3bGMsIHMzMiBpbnRfdmFsLCBib29sIGZvcmNlKTsKLWV4dGVybiBpbnQgd2xjX3N0Zl9yeGNoYWluX3NldCh3bGNfaW5mb190ICp3bGMsIHMzMiBpbnRfdmFsKTsKLWV4dGVybiBib29sIHdsY19zdGZfc3RiY19yeF9zZXQod2xjX2luZm9fdCAqd2xjLCBzMzIgaW50X3ZhbCk7CitleHRlcm4gaW50IHdsY19zdGZfc3NfdXBkYXRlKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCBzdHJ1Y3Qgd2xjYmFuZCAqYmFuZCk7CitleHRlcm4gdm9pZCB3bGNfc3RmX3BoeV90eGFudF91cGQoc3RydWN0IHdsY19pbmZvICp3bGMpOworZXh0ZXJuIGludCB3bGNfc3RmX3R4Y2hhaW5fc2V0KHN0cnVjdCB3bGNfaW5mbyAqd2xjLCBzMzIgaW50X3ZhbCwgYm9vbCBmb3JjZSk7CitleHRlcm4gaW50IHdsY19zdGZfcnhjaGFpbl9zZXQoc3RydWN0IHdsY19pbmZvICp3bGMsIHMzMiBpbnRfdmFsKTsKK2V4dGVybiBib29sIHdsY19zdGZfc3RiY19yeF9zZXQoc3RydWN0IHdsY19pbmZvICp3bGMsIHMzMiBpbnRfdmFsKTsKIAotZXh0ZXJuIGludCB3bGNfc3RmX2FudF90eGFudF92YWxpZGF0ZSh3bGNfaW5mb190ICp3bGMsIHM4IHZhbCk7Ci1leHRlcm4gdm9pZCB3bGNfc3RmX3BoeV90eGFudF91cGQod2xjX2luZm9fdCAqd2xjKTsKLWV4dGVybiB2b2lkIHdsY19zdGZfcGh5X2NoYWluX2NhbGMod2xjX2luZm9fdCAqd2xjKTsKLWV4dGVybiB1MTYgd2xjX3N0Zl9waHl0eGNoYWluX3NlbCh3bGNfaW5mb190ICp3bGMsIHJhdGVzcGVjX3QgcnNwZWMpOwotZXh0ZXJuIHUxNiB3bGNfc3RmX2QxMWhkcnNfcGh5Y3RsX3R4YW50KHdsY19pbmZvX3QgKndsYywgcmF0ZXNwZWNfdCByc3BlYyk7Ci1leHRlcm4gdTE2IHdsY19zdGZfc3BhdGlhbF9leHBhbnNpb25fZ2V0KHdsY19pbmZvX3QgKndsYywgcmF0ZXNwZWNfdCByc3BlYyk7CitleHRlcm4gaW50IHdsY19zdGZfYW50X3R4YW50X3ZhbGlkYXRlKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCBzOCB2YWwpOworZXh0ZXJuIHZvaWQgd2xjX3N0Zl9waHlfdHhhbnRfdXBkKHN0cnVjdCB3bGNfaW5mbyAqd2xjKTsKK2V4dGVybiB2b2lkIHdsY19zdGZfcGh5X2NoYWluX2NhbGMoc3RydWN0IHdsY19pbmZvICp3bGMpOworZXh0ZXJuIHUxNiB3bGNfc3RmX3BoeXR4Y2hhaW5fc2VsKHN0cnVjdCB3bGNfaW5mbyAqd2xjLCByYXRlc3BlY190IHJzcGVjKTsKK2V4dGVybiB1MTYgd2xjX3N0Zl9kMTFoZHJzX3BoeWN0bF90eGFudChzdHJ1Y3Qgd2xjX2luZm8gKndsYywgcmF0ZXNwZWNfdCByc3BlYyk7CitleHRlcm4gdTE2IHdsY19zdGZfc3BhdGlhbF9leHBhbnNpb25fZ2V0KHN0cnVjdCB3bGNfaW5mbyAqd2xjLAorCQkJCQkgcmF0ZXNwZWNfdCByc3BlYyk7CiAjZW5kaWYJCQkJLyogX3dsY19zdGZfaF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvc3lzL3dsY190eXBlcy5oIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9zeXMvd2xjX3R5cGVzLmgKaW5kZXggMzMwNDdlYi4uZGY2ZTA0YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9zeXMvd2xjX3R5cGVzLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9zeXMvd2xjX3R5cGVzLmgKQEAgLTE5LDM0ICsxOSwxOSBAQAogCiAvKiBmb3J3YXJkIGRlY2xhcmF0aW9ucyAqLwogCi10eXBlZGVmIHN0cnVjdCB3bGNfaW5mbyB3bGNfaW5mb190OwotdHlwZWRlZiBzdHJ1Y3Qgd2xjX2h3X2luZm8gd2xjX2h3X2luZm9fdDsKLXR5cGVkZWYgc3RydWN0IHdsY19pZiB3bGNfaWZfdDsKLXR5cGVkZWYgc3RydWN0IHdsX2lmIHdsX2lmX3Q7Ci10eXBlZGVmIHN0cnVjdCBsZWRfaW5mbyBsZWRfaW5mb190OwotdHlwZWRlZiBzdHJ1Y3QgYm1hY19sZWQgYm1hY19sZWRfdDsKLXR5cGVkZWYgc3RydWN0IGJtYWNfbGVkX2luZm8gYm1hY19sZWRfaW5mb190OwotdHlwZWRlZiBzdHJ1Y3Qgc2NiX21vZHVsZSBzY2JfbW9kdWxlX3Q7Ci10eXBlZGVmIHN0cnVjdCBiYV9pbmZvIGJhX2luZm9fdDsKLXR5cGVkZWYgc3RydWN0IGFtcGR1X2luZm8gYW1wZHVfaW5mb190OwotdHlwZWRlZiBzdHJ1Y3QgcmF0ZXNlbF9pbmZvIHJhdGVzZWxfaW5mb190OwotdHlwZWRlZiBzdHJ1Y3Qgd2xjX2FwX2luZm8gd2xjX2FwX2luZm9fdDsKLXR5cGVkZWYgc3RydWN0IHdsY19hdXRoX2luZm8gd2xjX2F1dGhfaW5mb190OwotdHlwZWRlZiBzdHJ1Y3Qgc3VwcGxpY2FudCBzdXBwbGljYW50X3Q7Ci10eXBlZGVmIHN0cnVjdCBhdXRoZW50aWNhdG9yIGF1dGhlbnRpY2F0b3JfdDsKLXR5cGVkZWYgc3RydWN0IGFudHNlbF9pbmZvIGFudHNlbF9pbmZvX3Q7Ci0jaWYgIWRlZmluZWQoV0xDX0xPVykKLXR5cGVkZWYgc3RydWN0IHJwY3R4X2luZm8gcnBjdHhfaW5mb190OwotI2VuZGlmCi0jaWZkZWYgV0xDX0xPVwotdHlwZWRlZiBzdHJ1Y3QgYm1hY19wbXEgYm1hY19wbXFfdDsKLSNlbmRpZgorc3RydWN0IHdsY19pbmZvOworc3RydWN0IHdsY19od19pbmZvOworc3RydWN0IHdsY19pZjsKK3N0cnVjdCB3bF9pZjsKK3N0cnVjdCBhbXBkdV9pbmZvOworc3RydWN0IGFudHNlbF9pbmZvOworc3RydWN0IGJtYWNfcG1xOwogCiBzdHJ1Y3QgZDExaW5pdDsKIAogI2lmbmRlZiBfaG5kZG1hX3B1Yl8KICNkZWZpbmUgX2huZGRtYV9wdWJfCi10eXBlZGVmIGNvbnN0IHN0cnVjdCBobmRkbWFfcHViIGhuZGRtYV90Oworc3RydWN0IGhuZGRtYV9wdWI7CiAjZW5kaWYJCQkJLyogX2huZGRtYV9wdWJfICovCiAKICNlbmRpZgkJCQkvKiBfd2xjX3R5cGVzX2hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3V0aWwvYWl1dGlscy5jIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS91dGlsL2FpdXRpbHMuYwppbmRleCA3NWE3ZTNhLi5kZGQyZjlkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3V0aWwvYWl1dGlscy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvdXRpbC9haXV0aWxzLmMKQEAgLTE0LDExICsxNCwxNiBAQAogICogQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KICAqLwogCisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxiY21kZWZzLmg+CisjaWZkZWYgQlJDTV9GVUxMTUFDCisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjZW5kaWYKICNpbmNsdWRlIDxvc2wuaD4KLSNpbmNsdWRlIDxsaW51eHZlci5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGJjbXV0aWxzLmg+CiAjaW5jbHVkZSA8c2l1dGlscy5oPgogI2luY2x1ZGUgPGhuZHNvYy5oPgpAQCAtMjYsOCArMzEsOCBAQAogI2luY2x1ZGUgPHBjaWNmZy5oPgogI2luY2x1ZGUgPGJjbWRldnMuaD4KIAotI2RlZmluZSBCQ000NzE2Ml9ETVAoKSAoKENISVBJRChzaWgtPmNoaXApID09IEJDTTQ3MTYyX0NISVBfSUQpICYmIFwKLQkJKENISVBSRVYoc2loLT5jaGlwcmV2KSA9PSAwKSAmJiBcCisjZGVmaW5lIEJDTTQ3MTYyX0RNUCgpICgoc2loLT5jaGlwID09IEJDTTQ3MTYyX0NISVBfSUQpICYmIFwKKwkJKHNpaC0+Y2hpcHJldiA9PSAwKSAmJiBcCiAJCShzaWktPmNvcmVpZFtzaWktPmN1cmlkeF0gPT0gTUlQUzc0S19DT1JFX0lEKSkKIAogLyogRVJPTSBwYXJzaW5nICovCkBAIC0xMTUsNyArMTIwLDcgQEAKIAogCWVyb21iYXNlID0gUl9SRUcoc2lpLT5vc2gsICZjYy0+ZXJvbXB0cik7CiAKLQlzd2l0Y2ggKEJVU1RZUEUoc2loLT5idXN0eXBlKSkgeworCXN3aXRjaCAoc2loLT5idXN0eXBlKSB7CiAJY2FzZSBTSV9CVVM6CiAJCWVyb21wdHIgPSAodTMyICopIFJFR19NQVAoZXJvbWJhc2UsIFNJX0NPUkVfU0laRSk7CiAJCWJyZWFrOwpAQCAtMTI1LDcgKzEzMCw3IEBACiAJCXNpaS0+Y3Vyd3JhcCA9ICh2b2lkICopKCh1bnNpZ25lZCBsb25nKXJlZ3MgKyBTSV9DT1JFX1NJWkUpOwogCiAJCS8qIE5vdyBwb2ludCB0aGUgd2luZG93IGF0IHRoZSBlcm9tICovCi0JCU9TTF9QQ0lfV1JJVEVfQ09ORklHKHNpaS0+b3NoLCBQQ0lfQkFSMF9XSU4sIDQsIGVyb21iYXNlKTsKKwkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChzaWktPm9zaC0+cGRldiwgUENJX0JBUjBfV0lOLCBlcm9tYmFzZSk7CiAJCWVyb21wdHIgPSByZWdzOwogCQlicmVhazsKIApAQCAtMzMwLDcgKzMzNSw3IEBACiAJQVNTRVJUKChzaWktPmludHJzZW5hYmxlZF9mbiA9PSBOVUxMKQogCSAgICAgICB8fCAhKCooc2lpKS0+aW50cnNlbmFibGVkX2ZuKSAoKHNpaSktPmludHJfYXJnKSk7CiAKLQlzd2l0Y2ggKEJVU1RZUEUoc2loLT5idXN0eXBlKSkgeworCXN3aXRjaCAoc2loLT5idXN0eXBlKSB7CiAJY2FzZSBTSV9CVVM6CiAJCS8qIG1hcCBuZXcgb25lICovCiAJCWlmICghc2lpLT5yZWdzW2NvcmVpZHhdKSB7CkBAIC0zNDcsMTAgKzM1MiwxMCBAQAogCiAJY2FzZSBQQ0lfQlVTOgogCQkvKiBwb2ludCBiYXIwIHdpbmRvdyAqLwotCQlPU0xfUENJX1dSSVRFX0NPTkZJRyhzaWktPm9zaCwgUENJX0JBUjBfV0lOLCA0LCBhZGRyKTsKKwkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChzaWktPm9zaC0+cGRldiwgUENJX0JBUjBfV0lOLCBhZGRyKTsKIAkJcmVncyA9IHNpaS0+Y3VybWFwOwogCQkvKiBwb2ludCBiYXIwIDJuZCA0S0Igd2luZG93ICovCi0JCU9TTF9QQ0lfV1JJVEVfQ09ORklHKHNpaS0+b3NoLCBQQ0lfQkFSMF9XSU4yLCA0LCB3cmFwKTsKKwkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChzaWktPm9zaC0+cGRldiwgUENJX0JBUjBfV0lOMiwgd3JhcCk7CiAJCWJyZWFrOwogCiAjaWZkZWYgQkNNU0RJTwpAQCAtNTA0LDcgKzUwOSw3IEBACiAJaWYgKGNvcmVpZHggPj0gU0lfTUFYQ09SRVMpCiAJCXJldHVybiAwOwogCi0JaWYgKEJVU1RZUEUoc2loLT5idXN0eXBlKSA9PSBTSV9CVVMpIHsKKwlpZiAoc2loLT5idXN0eXBlID09IFNJX0JVUykgewogCQkvKiBJZiBpbnRlcm5hbCBidXMsIHdlIGNhbiBhbHdheXMgZ2V0IGF0IGV2ZXJ5dGhpbmcgKi8KIAkJZmFzdCA9IHRydWU7CiAJCS8qIG1hcCBpZiBkb2VzIG5vdCBleGlzdCAqLwpAQCAtNTE0LDcgKzUxOSw3IEBACiAJCQlBU1NFUlQoR09PRFJFR1Moc2lpLT5yZWdzW2NvcmVpZHhdKSk7CiAJCX0KIAkJciA9ICh1MzIgKikgKCh1bnNpZ25lZCBjaGFyICopIHNpaS0+cmVnc1tjb3JlaWR4XSArIHJlZ29mZik7Ci0JfSBlbHNlIGlmIChCVVNUWVBFKHNpaC0+YnVzdHlwZSkgPT0gUENJX0JVUykgeworCX0gZWxzZSBpZiAoc2loLT5idXN0eXBlID09IFBDSV9CVVMpIHsKIAkJLyogSWYgcGNpL3BjaWUsIHdlIGNhbiBnZXQgYXQgcGNpL3BjaWUgcmVncyBhbmQgb24gbmV3ZXIgY29yZXMgdG8gY2hpcGMgKi8KIAogCQlpZiAoKHNpaS0+Y29yZWlkW2NvcmVpZHhdID09IENDX0NPUkVfSUQpICYmIFNJX0ZBU1Qoc2lpKSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS91dGlsL2JjbW90cC5jIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS91dGlsL2JjbW90cC5jCmluZGV4IGM5MDk4MzIuLmQ4MjBlN2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvdXRpbC9iY21vdHAuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3V0aWwvYmNtb3RwLmMKQEAgLTE0LDExICsxNCwxMyBAQAogICogQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KICAqLwogCisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxiY21kZWZzLmg+CiAjaW5jbHVkZSA8b3NsLmg+Ci0jaW5jbHVkZSA8bGludXh2ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxiY21kZXZzLmg+CiAjaW5jbHVkZSA8YmNtdXRpbHMuaD4KICNpbmNsdWRlIDxzaXV0aWxzLmg+CkBAIC03Nyw3ICs3OSw3IEBACiAJdWludCBjY3JldjsJCS8qIGNoaXBjIHJldmlzaW9uICovCiAJb3RwX2ZuX3QgKmZuOwkJLyogT1RQIGZ1bmN0aW9ucyAqLwogCXNpX3QgKnNpaDsJCS8qIFNhdmVkIHNiIGhhbmRsZSAqLwotCW9zbF90ICpvc2g7CisJc3RydWN0IG9zbF9pbmZvICpvc2g7CiAKICNpZmRlZiBCQ01JUFhPVFAKIAkvKiBJUFggT1RQIHNlY3Rpb24gKi8KQEAgLTIyMSw3ICsyMjMsNyBAQAogewogCWludCByZXQgPSAwOwogCi0Jc3dpdGNoIChDSElQSUQoc2loLT5jaGlwKSkgeworCXN3aXRjaCAoc2loLT5jaGlwKSB7CiAJY2FzZSBCQ000MzIyNF9DSElQX0lEOgogCWNhc2UgQkNNNDMyMjVfQ0hJUF9JRDoKIAkJcmV0ID0gb3NpemV3ICogMiAtIE9UUF9TWl9GVV83MiAtIE9UUF9TWl9DSEVDS1NVTTsKQEAgLTI3MSw4ICsyNzMsOCBAQAogCS8qIFJlYWQgT1RQIGxvY2sgYml0cyBhbmQgc3VicmVnaW9uIHByb2dyYW1tZWQgaW5kaWNhdGlvbiBiaXRzICovCiAJb2ktPnN0YXR1cyA9IFJfUkVHKG9pLT5vc2gsICZjYy0+b3Rwc3RhdHVzKTsKIAotCWlmICgoQ0hJUElEKG9pLT5zaWgtPmNoaXApID09IEJDTTQzMjI0X0NISVBfSUQpCi0JICAgIHx8IChDSElQSUQob2ktPnNpaC0+Y2hpcCkgPT0gQkNNNDMyMjVfQ0hJUF9JRCkpIHsKKwlpZiAoKG9pLT5zaWgtPmNoaXAgPT0gQkNNNDMyMjRfQ0hJUF9JRCkKKwkgICAgfHwgKG9pLT5zaWgtPmNoaXAgPT0gQkNNNDMyMjVfQ0hJUF9JRCkpIHsKIAkJdTMyIHBfYml0czsKIAkJcF9iaXRzID0KIAkJICAgIChpcHhvdHBfb3RwcihvaSwgY2MsIG9pLT5vdHBndV9iYXNlICsgT1RQR1VfUF9PRkYpICYKQEAgLTU2OSw3ICs1NzEsNyBAQAogc3RhdGljIHUxNiBobmRvdHBfb3Rwcih2b2lkICpvaCwgY2hpcGNyZWdzX3QgKmNjLCB1aW50IHduKQogewogCW90cGluZm9fdCAqb2kgPSAob3RwaW5mb190ICopIG9oOwotCW9zbF90ICpvc2g7CisJc3RydWN0IG9zbF9pbmZvICpvc2g7CiAJdm9sYXRpbGUgdTE2ICpwdHI7CiAKIAlBU1NFUlQod24gPCAoKG9pLT5zaXplIC8gMikgKyBPVFBfUkNfTElNX09GRikpOwpAQCAtNTg0LDcgKzU4Niw3IEBACiBzdGF0aWMgdTE2IGhuZG90cF9vdHByb2ZmKHZvaWQgKm9oLCBjaGlwY3JlZ3NfdCAqY2MsIGludCB3b2ZmKQogewogCW90cGluZm9fdCAqb2kgPSAob3RwaW5mb190ICopIG9oOwotCW9zbF90ICpvc2g7CisJc3RydWN0IG9zbF9pbmZvICpvc2g7CiAJdm9sYXRpbGUgdTE2ICpwdHI7CiAKIAlBU1NFUlQod29mZiA+PSAoLSgoaW50KW9pLT5zaXplIC8gMikpKTsKQEAgLTYwMyw3ICs2MDUsNyBAQAogCW90cGluZm9fdCAqb2kgPSAob3RwaW5mb190ICopIG9oOwogCXVpbnQgaywgcm93LCBjb2w7CiAJdTMyIG90cHAsIHN0OwotCW9zbF90ICpvc2g7CisJc3RydWN0IG9zbF9pbmZvICpvc2g7CiAKIAlvc2ggPSBzaV9vc2gob2ktPnNpaCk7CiAJcm93ID0gaWR4IC8gNjU7CkBAIC02MzYsNyArNjM4LDcgQEAKIAlvdHBpbmZvX3QgKm9pOwogCXUzMiBjYXAgPSAwLCBjbGtkaXYsIG90cGRpdiA9IDA7CiAJdm9pZCAqcmV0ID0gTlVMTDsKLQlvc2xfdCAqb3NoOworCXN0cnVjdCBvc2xfaW5mbyAqb3NoOwogCiAJb2kgPSAmb3RwaW5mbzsKIApAQCAtOTAwLDcgKzkwMiw3IEBACiAJdm9pZCAqcmV0ID0gTlVMTDsKIAogCW9pID0gJm90cGluZm87Ci0JYnplcm8ob2ksIHNpemVvZihvdHBpbmZvX3QpKTsKKwltZW1zZXQob2ksIDAsIHNpemVvZihvdHBpbmZvX3QpKTsKIAogCW9pLT5jY3JldiA9IHNpaC0+Y2NyZXY7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvdXRpbC9iY21zcm9tLmMgYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3V0aWwvYmNtc3JvbS5jCmluZGV4IDEyODJlZjcuLjE5ZDQ1MDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvdXRpbC9iY21zcm9tLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS91dGlsL2JjbXNyb20uYwpAQCAtMTUsOSArMTUsMTEgQEAKICAqLwogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CiAjaW5jbHVkZSA8YmNtZGVmcy5oPgogI2luY2x1ZGUgPG9zbC5oPgotI2luY2x1ZGUgPGxpbnV4dmVyLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8c3RkYXJnLmg+CiAjaW5jbHVkZSA8YmNtdXRpbHMuaD4KICNpbmNsdWRlIDxobmRzb2MuaD4KQEAgLTY2LDI5ICs2OCwzMCBAQAogCiAjZGVmaW5lIFNST01fQ0lTX1NJTkdMRQkxCiAKLXN0YXRpYyBpbnQgaW5pdHZhcnNfc3JvbV9zaShzaV90ICpzaWgsIG9zbF90ICpvc2gsIHZvaWQgKmN1cm1hcCwgY2hhciAqKnZhcnMsCi0JCQkgICAgdWludCAqY291bnQpOworc3RhdGljIGludCBpbml0dmFyc19zcm9tX3NpKHNpX3QgKnNpaCwgc3RydWN0IG9zbF9pbmZvICpvc2gsIHZvaWQgKmN1cm1hcCwKKwkJCSAgICBjaGFyICoqdmFycywgdWludCAqY291bnQpOwogc3RhdGljIHZvaWQgX2luaXR2YXJzX3Nyb21fcGNpKHU4IHNyb21yZXYsIHUxNiAqc3JvbSwgdWludCBvZmYsCiAJCQkgICAgICAgdmFyYnVmX3QgKmIpOwogc3RhdGljIGludCBpbml0dmFyc19zcm9tX3BjaShzaV90ICpzaWgsIHZvaWQgKmN1cm1hcCwgY2hhciAqKnZhcnMsCiAJCQkgICAgIHVpbnQgKmNvdW50KTsKIHN0YXRpYyBpbnQgaW5pdHZhcnNfZmxhc2hfc2koc2lfdCAqc2loLCBjaGFyICoqdmFycywgdWludCAqY291bnQpOwogI2lmZGVmIEJDTVNESU8KLXN0YXRpYyBpbnQgaW5pdHZhcnNfY2lzX3NkaW8ob3NsX3QgKm9zaCwgY2hhciAqKnZhcnMsIHVpbnQgKmNvdW50KTsKLXN0YXRpYyBpbnQgc3Byb21fY21kX3NkaW8ob3NsX3QgKm9zaCwgdTggY21kKTsKLXN0YXRpYyBpbnQgc3Byb21fcmVhZF9zZGlvKG9zbF90ICpvc2gsIHUxNiBhZGRyLCB1MTYgKmRhdGEpOworc3RhdGljIGludCBpbml0dmFyc19jaXNfc2RpbyhzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgY2hhciAqKnZhcnMsIHVpbnQgKmNvdW50KTsKK3N0YXRpYyBpbnQgc3Byb21fY21kX3NkaW8oc3RydWN0IG9zbF9pbmZvICpvc2gsIHU4IGNtZCk7CitzdGF0aWMgaW50IHNwcm9tX3JlYWRfc2RpbyhzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgdTE2IGFkZHIsIHUxNiAqZGF0YSk7CiAjZW5kaWYJCQkJLyogQkNNU0RJTyAqLwotc3RhdGljIGludCBzcHJvbV9yZWFkX3BjaShvc2xfdCAqb3NoLCBzaV90ICpzaWgsIHUxNiAqc3Byb20sIHVpbnQgd29yZG9mZiwKLQkJCSAgdTE2ICpidWYsIHVpbnQgbndvcmRzLCBib29sIGNoZWNrX2NyYyk7CitzdGF0aWMgaW50IHNwcm9tX3JlYWRfcGNpKHN0cnVjdCBvc2xfaW5mbyAqb3NoLCBzaV90ICpzaWgsIHUxNiAqc3Byb20sCisJCQkgIHVpbnQgd29yZG9mZiwgdTE2ICpidWYsIHVpbnQgbndvcmRzLCBib29sIGNoZWNrX2NyYyk7CiAjaWYgZGVmaW5lZChCQ01OVlJBTVIpCi1zdGF0aWMgaW50IG90cF9yZWFkX3BjaShvc2xfdCAqb3NoLCBzaV90ICpzaWgsIHUxNiAqYnVmLCB1aW50IGJ1ZnN6KTsKK3N0YXRpYyBpbnQgb3RwX3JlYWRfcGNpKHN0cnVjdCBvc2xfaW5mbyAqb3NoLCBzaV90ICpzaWgsIHUxNiAqYnVmLCB1aW50IGJ1ZnN6KTsKICNlbmRpZgotc3RhdGljIHUxNiBzcm9tX2NjX2NtZChzaV90ICpzaWgsIG9zbF90ICpvc2gsIHZvaWQgKmNjcmVncywgdTMyIGNtZCwKK3N0YXRpYyB1MTYgc3JvbV9jY19jbWQoc2lfdCAqc2loLCBzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgdm9pZCAqY2NyZWdzLCB1MzIgY21kLAogCQkJICB1aW50IHdvcmRvZmYsIHUxNiBkYXRhKTsKIAotc3RhdGljIGludCBpbml0dmFyc190YWJsZShvc2xfdCAqb3NoLCBjaGFyICpzdGFydCwgY2hhciAqZW5kLCBjaGFyICoqdmFycywKLQkJCSAgdWludCAqY291bnQpOwotc3RhdGljIGludCBpbml0dmFyc19mbGFzaChzaV90ICpzaWgsIG9zbF90ICpvc2gsIGNoYXIgKip2cCwgdWludCBsZW4pOworc3RhdGljIGludCBpbml0dmFyc190YWJsZShzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgY2hhciAqc3RhcnQsIGNoYXIgKmVuZCwKKwkJCSAgY2hhciAqKnZhcnMsIHVpbnQgKmNvdW50KTsKK3N0YXRpYyBpbnQgaW5pdHZhcnNfZmxhc2goc2lfdCAqc2loLCBzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgY2hhciAqKnZwLAorCQkJICB1aW50IGxlbik7CiAKIC8qIEluaXRpYWxpemF0aW9uIG9mIHZhcmJ1ZiBzdHJ1Y3R1cmUgKi8KIHN0YXRpYyB2b2lkIHZhcmJ1Zl9pbml0KHZhcmJ1Zl90ICpiLCBjaGFyICpidWYsIHVpbnQgc2l6ZSkKQEAgLTEyOSw3ICsxMzIsNyBAQAogCWlmIChzICE9IE5VTEwpIHsKIAkJbGVuID0gKHNpemVfdCkgKHMgLSBiLT5idWYpOwogCQlmb3IgKHMgPSBiLT5iYXNlOyBzIDwgYi0+YnVmOykgewotCQkJaWYgKChiY21wKHMsIGItPmJ1ZiwgbGVuKSA9PSAwKSAmJiBzW2xlbl0gPT0gJz0nKSB7CisJCQlpZiAoKG1lbWNtcChzLCBiLT5idWYsIGxlbikgPT0gMCkgJiYgc1tsZW5dID09ICc9JykgewogCQkJCWxlbiA9IHN0cmxlbihzKSArIDE7CiAJCQkJbWVtbW92ZShzLCAocyArIGxlbiksCiAJCQkJCSgoYi0+YnVmICsgciArIDEpIC0gKHMgKyBsZW4pKSk7CkBAIC0xNTUsMjEgKzE1OCwyMSBAQAogICogSW5pdGlhbGl6ZSBsb2NhbCB2YXJzIGZyb20gdGhlIHJpZ2h0IHNvdXJjZSBmb3IgdGhpcyBwbGF0Zm9ybS4KICAqIFJldHVybiAwIG9uIHN1Y2Nlc3MsIG5vbnplcm8gb24gZXJyb3IuCiAgKi8KLWludCBzcm9tX3Zhcl9pbml0KHNpX3QgKnNpaCwgdWludCBidXN0eXBlLCB2b2lkICpjdXJtYXAsIG9zbF90ICpvc2gsCitpbnQgc3JvbV92YXJfaW5pdChzaV90ICpzaWgsIHVpbnQgYnVzdHlwZSwgdm9pZCAqY3VybWFwLCBzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwKIAkJICBjaGFyICoqdmFycywgdWludCAqY291bnQpCiB7CiAJdWludCBsZW47CiAKIAlsZW4gPSAwOwogCi0JQVNTRVJUKGJ1c3R5cGUgPT0gQlVTVFlQRShidXN0eXBlKSk7CisJQVNTRVJUKGJ1c3R5cGUgPT0gYnVzdHlwZSk7CiAJaWYgKHZhcnMgPT0gTlVMTCB8fCBjb3VudCA9PSBOVUxMKQogCQlyZXR1cm4gMDsKIAogCSp2YXJzID0gTlVMTDsKIAkqY291bnQgPSAwOwogCi0Jc3dpdGNoIChCVVNUWVBFKGJ1c3R5cGUpKSB7CisJc3dpdGNoIChidXN0eXBlKSB7CiAJY2FzZSBTSV9CVVM6CiAJY2FzZSBKVEFHX0JVUzoKIAkJcmV0dXJuIGluaXR2YXJzX3Nyb21fc2koc2loLCBvc2gsIGN1cm1hcCwgdmFycywgY291bnQpOwpAQCAtMTk0LDcgKzE5Nyw3IEBACiAKIC8qIHN1cHBvcnQgb25seSAxNi1iaXQgd29yZCByZWFkIGZyb20gc3JvbSAqLwogaW50Ci1zcm9tX3JlYWQoc2lfdCAqc2loLCB1aW50IGJ1c3R5cGUsIHZvaWQgKmN1cm1hcCwgb3NsX3QgKm9zaCwKK3Nyb21fcmVhZChzaV90ICpzaWgsIHVpbnQgYnVzdHlwZSwgdm9pZCAqY3VybWFwLCBzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwKIAkgIHVpbnQgYnl0ZW9mZiwgdWludCBuYnl0ZXMsIHUxNiAqYnVmLCBib29sIGNoZWNrX2NyYykKIHsKIAl1aW50IG9mZiwgbnc7CkBAIC0yMDIsNyArMjA1LDcgQEAKIAl1aW50IGk7CiAjZW5kaWYJCQkJLyogQkNNU0RJTyAqLwogCi0JQVNTRVJUKGJ1c3R5cGUgPT0gQlVTVFlQRShidXN0eXBlKSk7CisJQVNTRVJUKGJ1c3R5cGUgPT0gYnVzdHlwZSk7CiAKIAkvKiBjaGVjayBpbnB1dCAtIDE2LWJpdCBhY2Nlc3Mgb25seSAqLwogCWlmIChieXRlb2ZmICYgMSB8fCBuYnl0ZXMgJiAxIHx8IChieXRlb2ZmICsgbmJ5dGVzKSA+IFNST01fTUFYKQpAQCAtMjExLDcgKzIxNCw3IEBACiAJb2ZmID0gYnl0ZW9mZiAvIDI7CiAJbncgPSBuYnl0ZXMgLyAyOwogCi0JaWYgKEJVU1RZUEUoYnVzdHlwZSkgPT0gUENJX0JVUykgeworCWlmIChidXN0eXBlID09IFBDSV9CVVMpIHsKIAkJaWYgKCFjdXJtYXApCiAJCQlyZXR1cm4gMTsKIApAQCAtMjMzLDcgKzIzNiw3IEBACiAJCX0KICNlbmRpZgogI2lmZGVmIEJDTVNESU8KLQl9IGVsc2UgaWYgKEJVU1RZUEUoYnVzdHlwZSkgPT0gU0RJT19CVVMpIHsKKwl9IGVsc2UgaWYgKGJ1c3R5cGUgPT0gU0RJT19CVVMpIHsKIAkJb2ZmID0gYnl0ZW9mZiAvIDI7CiAJCW53ID0gbmJ5dGVzIC8gMjsKIAkJZm9yIChpID0gMDsgaSA8IG53OyBpKyspIHsKQEAgLTI0Miw3ICsyNDUsNyBAQAogCQkJCXJldHVybiAxOwogCQl9CiAjZW5kaWYJCQkJLyogQkNNU0RJTyAqLwotCX0gZWxzZSBpZiAoQlVTVFlQRShidXN0eXBlKSA9PSBTSV9CVVMpIHsKKwl9IGVsc2UgaWYgKGJ1c3R5cGUgPT0gU0lfQlVTKSB7CiAJCXJldHVybiAxOwogCX0gZWxzZSB7CiAJCXJldHVybiAxOwpAQCAtMzc2LDcgKzM3OSw4IEBACiAvKiBGb3IgZG9uZ2xlIEhXLCBhY2NlcHQgcGFydGlhbCBjYWxpYnJhdGlvbiBwYXJhbWV0ZXJzICovCiAjZGVmaW5lIEJDTURPTkdMRUNBU0UobikKIAotaW50IHNyb21fcGFyc2VjaXMob3NsX3QgKm9zaCwgdTggKnBjaXNbXSwgdWludCBjaXNjbnQsIGNoYXIgKip2YXJzLCB1aW50ICpjb3VudCkKK2ludCBzcm9tX3BhcnNlY2lzKHN0cnVjdCBvc2xfaW5mbyAqb3NoLCB1OCAqcGNpc1tdLCB1aW50IGNpc2NudCwgY2hhciAqKnZhcnMsCisJCSAgdWludCAqY291bnQpCiB7CiAJY2hhciBlYWJ1ZlszMl07CiAJY2hhciAqYmFzZTsKQEAgLTQwMiw3ICs0MDYsNyBAQAogCQlyZXR1cm4gLTI7CiAKIAl2YXJidWZfaW5pdCgmYiwgYmFzZSwgTUFYU1pfTlZSQU1fVkFSUyk7Ci0JYnplcm8oYmFzZSwgTUFYU1pfTlZSQU1fVkFSUyk7CisJbWVtc2V0KGJhc2UsIDAsIE1BWFNaX05WUkFNX1ZBUlMpOwogCWVhYnVmWzBdID0gJ1wwJzsKIAlmb3IgKGNpc251bSA9IDA7IGNpc251bSA8IGNpc2NudDsgY2lzbnVtKyspIHsKIAkJY2lzID0gKnBjaXMrKzsKQEAgLTQ5NiwxMiArNTAwLDEyIEBACiAJCQkJCWJyZWFrOwogCQkJCWRlZmF1bHQ6CiAJCQkJCS8qIHNldCBtYWNhZGRyIGlmIEhOQlVfTUFDQUREUiBub3Qgc2VlbiB5ZXQgKi8KLQkJCQkJaWYgKGVhYnVmWzBdID09ICdcMCcKLQkJCQkJICAgICYmIGNpc1tpXSA9PSBMQU5fTklECi0JCQkJCSAgICAmJiAhKEVUSEVSX0lTTlVMTEFERFIoJmNpc1tpICsgMl0pKQotCQkJCQkgICAgJiYgIShFVEhFUl9JU01VTFRJKCZjaXNbaSArIDJdKSkpIHsKKwkJCQkJaWYgKGVhYnVmWzBdID09ICdcMCcgJiYKKwkJCQkJICAgIGNpc1tpXSA9PSBMQU5fTklEICYmCisJCQkJCSAgICAhaXNfemVyb19ldGhlcl9hZGRyKCZjaXNbaSArIDJdKSAmJgorCQkJCQkgICAgIWlzX211bHRpY2FzdF9ldGhlcl9hZGRyKCZjaXNbaSArIDJdKSkgewogCQkJCQkJQVNTRVJUKGNpc1tpICsgMV0gPT0KLQkJCQkJCSAgICAgICBFVEhFUl9BRERSX0xFTik7CisJCQkJCQkgICAgICAgRVRIX0FMRU4pOwogCQkJCQkJc25wcmludGYoZWFidWYsIHNpemVvZihlYWJ1ZiksCiAJCQkJCQkJIiVwTSIsICZjaXNbaSArIDJdKTsKIApAQCAtOTcwLDggKzk3NCw4IEBACiAJCQkJCWJyZWFrOwogCiAJCQkJY2FzZSBITkJVX01BQ0FERFI6Ci0JCQkJCWlmICghKEVUSEVSX0lTTlVMTEFERFIoJmNpc1tpICsgMV0pKSAmJgotCQkJCQkgICAgIShFVEhFUl9JU01VTFRJKCZjaXNbaSArIDFdKSkpIHsKKwkJCQkJaWYgKCFpc196ZXJvX2V0aGVyX2FkZHIoJmNpc1tpICsgMV0pICYmCisJCQkJCSAgICAhaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIoJmNpc1tpICsgMV0pKSB7CiAJCQkJCQlzbnByaW50ZihlYWJ1Ziwgc2l6ZW9mKGVhYnVmKSwKIAkJCQkJCQkiJXBNIiwgJmNpc1tpICsgMV0pOwogCkBAIC0xNDA1LDggKzE0MDksOCBAQAogICogbm90IGluIHRoZSBidXMgY29yZXMuCiAgKi8KIHN0YXRpYyB1MTYKLXNyb21fY2NfY21kKHNpX3QgKnNpaCwgb3NsX3QgKm9zaCwgdm9pZCAqY2NyZWdzLCB1MzIgY21kLCB1aW50IHdvcmRvZmYsCi0JICAgIHUxNiBkYXRhKQorc3JvbV9jY19jbWQoc2lfdCAqc2loLCBzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgdm9pZCAqY2NyZWdzLCB1MzIgY21kLAorCSAgICB1aW50IHdvcmRvZmYsIHUxNiBkYXRhKQogewogCWNoaXBjcmVnc190ICpjYyA9IChjaGlwY3JlZ3NfdCAqKSBjY3JlZ3M7CiAJdWludCB3YWl0X2NudCA9IDEwMDA7CkBAIC0xNDM5LDcgKzE0NDMsNyBAQAogICogUmV0dXJuIDAgb24gc3VjY2Vzcywgbm9uemVybyBvbiBlcnJvci4KICAqLwogc3RhdGljIGludAotc3Byb21fcmVhZF9wY2kob3NsX3QgKm9zaCwgc2lfdCAqc2loLCB1MTYgKnNwcm9tLCB1aW50IHdvcmRvZmYsCitzcHJvbV9yZWFkX3BjaShzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgc2lfdCAqc2loLCB1MTYgKnNwcm9tLCB1aW50IHdvcmRvZmYsCiAJICAgICAgIHUxNiAqYnVmLCB1aW50IG53b3JkcywgYm9vbCBjaGVja19jcmMpCiB7CiAJaW50IGVyciA9IDA7CkBAIC0xNDk5LDcgKzE1MDMsNyBAQAogfQogCiAjaWYgZGVmaW5lZChCQ01OVlJBTVIpCi1zdGF0aWMgaW50IG90cF9yZWFkX3BjaShvc2xfdCAqb3NoLCBzaV90ICpzaWgsIHUxNiAqYnVmLCB1aW50IGJ1ZnN6KQorc3RhdGljIGludCBvdHBfcmVhZF9wY2koc3RydWN0IG9zbF9pbmZvICpvc2gsIHNpX3QgKnNpaCwgdTE2ICpidWYsIHVpbnQgYnVmc3opCiB7CiAJdTggKm90cDsKIAl1aW50IHN6ID0gT1RQX1NaX01BWCAvIDI7CS8qIHNpemUgaW4gd29yZHMgKi8KQEAgLTE1NDcsOCArMTU1MSw4IEBACiAqIENyZWF0ZSB2YXJpYWJsZSB0YWJsZSBmcm9tIG1lbW9yeS4KICogUmV0dXJuIDAgb24gc3VjY2Vzcywgbm9uemVybyBvbiBlcnJvci4KICovCi1zdGF0aWMgaW50IGluaXR2YXJzX3RhYmxlKG9zbF90ICpvc2gsIGNoYXIgKnN0YXJ0LCBjaGFyICplbmQsIGNoYXIgKip2YXJzLAotCQkJICB1aW50ICpjb3VudCkKK3N0YXRpYyBpbnQgaW5pdHZhcnNfdGFibGUoc3RydWN0IG9zbF9pbmZvICpvc2gsIGNoYXIgKnN0YXJ0LCBjaGFyICplbmQsCisJCQkgIGNoYXIgKip2YXJzLCB1aW50ICpjb3VudCkKIHsKIAlpbnQgYyA9IChpbnQpKGVuZCAtIHN0YXJ0KTsKIApAQCAtMTU3NCw3ICsxNTc4LDggQEAKICAqIG9mIHRoZSB0YWJsZSB1cG9uIGVudGVyIGFuZCB0byB0aGUgZW5kIG9mIHRoZSB0YWJsZSB1cG9uIGV4aXQgd2hlbiBzdWNjZXNzLgogICogUmV0dXJuIDAgb24gc3VjY2Vzcywgbm9uemVybyBvbiBlcnJvci4KICAqLwotc3RhdGljIGludCBpbml0dmFyc19mbGFzaChzaV90ICpzaWgsIG9zbF90ICpvc2gsIGNoYXIgKipiYXNlLCB1aW50IGxlbikKK3N0YXRpYyBpbnQgaW5pdHZhcnNfZmxhc2goc2lfdCAqc2loLCBzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgY2hhciAqKmJhc2UsCisJCQkgIHVpbnQgbGVuKQogewogCWNoYXIgKnZwID0gKmJhc2U7CiAJY2hhciAqZmxhc2g7CkBAIC0xNjM0LDcgKzE2MzksNyBAQAogICovCiBzdGF0aWMgaW50IGluaXR2YXJzX2ZsYXNoX3NpKHNpX3QgKnNpaCwgY2hhciAqKnZhcnMsIHVpbnQgKmNvdW50KQogewotCW9zbF90ICpvc2ggPSBzaV9vc2goc2loKTsKKwlzdHJ1Y3Qgb3NsX2luZm8gKm9zaCA9IHNpX29zaChzaWgpOwogCWNoYXIgKnZwLCAqYmFzZTsKIAlpbnQgZXJyOwogCkBAIC0xODQ1LDcgKzE4NTAsNyBAQAogCXUzMiBzcjsKIAl2YXJidWZfdCBiOwogCWNoYXIgKnZwLCAqYmFzZSA9IE5VTEw7Ci0Jb3NsX3QgKm9zaCA9IHNpX29zaChzaWgpOworCXN0cnVjdCBvc2xfaW5mbyAqb3NoID0gc2lfb3NoKHNpaCk7CiAJYm9vbCBmbGFzaCA9IGZhbHNlOwogCWludCBlcnIgPSAwOwogCkBAIC0xOTg2LDcgKzE5OTEsNyBAQAogICogUmVhZCB0aGUgU0RJTyBjaXMgYW5kIGNhbGwgcGFyc2VjaXMgdG8gaW5pdGlhbGl6ZSB0aGUgdmFycy4KICAqIFJldHVybiAwIG9uIHN1Y2Nlc3MsIG5vbnplcm8gb24gZXJyb3IuCiAgKi8KLXN0YXRpYyBpbnQgaW5pdHZhcnNfY2lzX3NkaW8ob3NsX3QgKm9zaCwgY2hhciAqKnZhcnMsIHVpbnQgKmNvdW50KQorc3RhdGljIGludCBpbml0dmFyc19jaXNfc2RpbyhzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgY2hhciAqKnZhcnMsIHVpbnQgKmNvdW50KQogewogCXU4ICpjaXNbU0JTRElPX05VTV9GVU5DVElPTiArIDFdOwogCXVpbnQgZm4sIG51bWZuOwpAQCAtMjAyMCw3ICsyMDI1LDcgQEAKIH0KIAogLyogc2V0IFNESU8gc3Byb20gY29tbWFuZCByZWdpc3RlciAqLwotc3RhdGljIGludCBzcHJvbV9jbWRfc2Rpbyhvc2xfdCAqb3NoLCB1OCBjbWQpCitzdGF0aWMgaW50IHNwcm9tX2NtZF9zZGlvKHN0cnVjdCBvc2xfaW5mbyAqb3NoLCB1OCBjbWQpCiB7CiAJdTggc3RhdHVzID0gMDsKIAl1aW50IHdhaXRfY250ID0gMTAwMDsKQEAgLTIwNDAsNyArMjA0NSw3IEBACiB9CiAKIC8qIHJlYWQgYSB3b3JkIGZyb20gdGhlIFNESU8gc3JvbSAqLwotc3RhdGljIGludCBzcHJvbV9yZWFkX3NkaW8ob3NsX3QgKm9zaCwgdTE2IGFkZHIsIHUxNiAqZGF0YSkKK3N0YXRpYyBpbnQgc3Byb21fcmVhZF9zZGlvKHN0cnVjdCBvc2xfaW5mbyAqb3NoLCB1MTYgYWRkciwgdTE2ICpkYXRhKQogewogCXU4IGFkZHJfbCwgYWRkcl9oLCBkYXRhX2wsIGRhdGFfaDsKIApAQCAtMjA2OCw4ICsyMDczLDggQEAKIH0KICNlbmRpZgkJCQkvKiBCQ01TRElPICovCiAKLXN0YXRpYyBpbnQgaW5pdHZhcnNfc3JvbV9zaShzaV90ICpzaWgsIG9zbF90ICpvc2gsIHZvaWQgKmN1cm1hcCwgY2hhciAqKnZhcnMsCi0JCQkgICAgdWludCAqdmFyc3opCitzdGF0aWMgaW50IGluaXR2YXJzX3Nyb21fc2koc2lfdCAqc2loLCBzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgdm9pZCAqY3VybWFwLAorCQkJICAgIGNoYXIgKip2YXJzLCB1aW50ICp2YXJzeikKIHsKIAkvKiBTZWFyY2ggZmxhc2ggbnZyYW0gc2VjdGlvbiBmb3Igc3JvbSB2YXJpYWJsZXMgKi8KIAlyZXR1cm4gaW5pdHZhcnNfZmxhc2hfc2koc2loLCB2YXJzLCB2YXJzeik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3V0aWwvYmNtdXRpbHMuYyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvdXRpbC9iY211dGlscy5jCmluZGV4IDk3ODllYTQuLmZkMzBjYzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvdXRpbC9iY211dGlscy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvdXRpbC9iY211dGlscy5jCkBAIC0xOSw4ICsxOSwxMCBAQAogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGJjbWRlZnMuaD4KICNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KICNpbmNsdWRlIDxvc2wuaD4KLSNpbmNsdWRlIDxsaW51eHZlci5oPgogI2luY2x1ZGUgPGJjbXV0aWxzLmg+CiAjaW5jbHVkZSA8c2l1dGlscy5oPgogI2luY2x1ZGUgPGJjbW52cmFtLmg+CkBAIC0zMCwyNiArMzIsMjYgQEAKICNpbmNsdWRlIDxwcm90by84MDIuMWQuaD4KICNpbmNsdWRlIDxwcm90by84MDIuMTEuaD4KIAotCiAvKiBjb3B5IGEgYnVmZmVyIGludG8gYSBwa3QgYnVmZmVyIGNoYWluICovCi11aW50IHBrdGZyb21idWYob3NsX3QgKm9zaCwgdm9pZCAqcCwgdWludCBvZmZzZXQsIGludCBsZW4sIHVuc2lnbmVkIGNoYXIgKmJ1ZikKK3VpbnQgcGt0ZnJvbWJ1ZihzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgc3RydWN0IHNrX2J1ZmYgKnAsIHVpbnQgb2Zmc2V0LCBpbnQgbGVuLAorCQl1bnNpZ25lZCBjaGFyICpidWYpCiB7CiAJdWludCBuLCByZXQgPSAwOwogCiAJLyogc2tpcCAnb2Zmc2V0JyBieXRlcyAqLwotCWZvciAoOyBwICYmIG9mZnNldDsgcCA9IFBLVE5FWFQocCkpIHsKLQkJaWYgKG9mZnNldCA8ICh1aW50KSBQS1RMRU4ocCkpCisJZm9yICg7IHAgJiYgb2Zmc2V0OyBwID0gcC0+bmV4dCkgeworCQlpZiAob2Zmc2V0IDwgKHVpbnQpIChwLT5sZW4pKQogCQkJYnJlYWs7Ci0JCW9mZnNldCAtPSBQS1RMRU4ocCk7CisJCW9mZnNldCAtPSBwLT5sZW47CiAJfQogCiAJaWYgKCFwKQogCQlyZXR1cm4gMDsKIAogCS8qIGNvcHkgdGhlIGRhdGEgKi8KLQlmb3IgKDsgcCAmJiBsZW47IHAgPSBQS1RORVhUKHApKSB7Ci0JCW4gPSBtaW4oKHVpbnQpIFBLVExFTihwKSAtIG9mZnNldCwgKHVpbnQpIGxlbik7Ci0JCWJjb3B5KGJ1ZiwgUEtUREFUQShwKSArIG9mZnNldCwgbik7CisJZm9yICg7IHAgJiYgbGVuOyBwID0gcC0+bmV4dCkgeworCQluID0gbWluKCh1aW50KSAocC0+bGVuKSAtIG9mZnNldCwgKHVpbnQpIGxlbik7CisJCWJjb3B5KGJ1ZiwgcC0+ZGF0YSArIG9mZnNldCwgbik7CiAJCWJ1ZiArPSBuOwogCQlsZW4gLT0gbjsKIAkJcmV0ICs9IG47CkBAIC01OSwxMyArNjEsMTMgQEAKIAlyZXR1cm4gcmV0OwogfQogLyogcmV0dXJuIHRvdGFsIGxlbmd0aCBvZiBidWZmZXIgY2hhaW4gKi8KLXVpbnQgQkNNRkFTVFBBVEggcGt0dG90bGVuKG9zbF90ICpvc2gsIHZvaWQgKnApCit1aW50IEJDTUZBU1RQQVRIIHBrdHRvdGxlbihzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgc3RydWN0IHNrX2J1ZmYgKnApCiB7CiAJdWludCB0b3RhbDsKIAogCXRvdGFsID0gMDsKLQlmb3IgKDsgcDsgcCA9IFBLVE5FWFQocCkpCi0JCXRvdGFsICs9IFBLVExFTihwKTsKKwlmb3IgKDsgcDsgcCA9IHAtPm5leHQpCisJCXRvdGFsICs9IHAtPmxlbjsKIAlyZXR1cm4gdG90YWw7CiB9CiAKQEAgLTczLDEyICs3NSwxMyBAQAogICogb3NsIG11bHRpcGxlLXByZWNlZGVuY2UgcGFja2V0IHF1ZXVlCiAgKiBoaV9wcmVjIGlzIGFsd2F5cyA+PSB0aGUgbnVtYmVyIG9mIHRoZSBoaWdoZXN0IG5vbi1lbXB0eSBwcmVjZWRlbmNlCiAgKi8KLXZvaWQgKkJDTUZBU1RQQVRIIHBrdHFfcGVucShzdHJ1Y3QgcGt0cSAqcHEsIGludCBwcmVjLCB2b2lkICpwKQorc3RydWN0IHNrX2J1ZmYgKkJDTUZBU1RQQVRIIHBrdHFfcGVucShzdHJ1Y3QgcGt0cSAqcHEsIGludCBwcmVjLAorCQkJCSAgICAgIHN0cnVjdCBza19idWZmICpwKQogewogCXN0cnVjdCBwa3RxX3ByZWMgKnE7CiAKIAlBU1NFUlQocHJlYyA+PSAwICYmIHByZWMgPCBwcS0+bnVtX3ByZWMpOwotCUFTU0VSVChQS1RMSU5LKHApID09IE5VTEwpOwkvKiBxdWV1ZWluZyBjaGFpbnMgbm90IGFsbG93ZWQgKi8KKwlBU1NFUlQocC0+cHJldiA9PSBOVUxMKTsJLyogcXVldWVpbmcgY2hhaW5zIG5vdCBhbGxvd2VkICovCiAKIAlBU1NFUlQoIXBrdHFfZnVsbChwcSkpOwogCUFTU0VSVCghcGt0cV9wZnVsbChwcSwgcHJlYykpOwpAQCAtODYsNyArODksNyBAQAogCXEgPSAmcHEtPnFbcHJlY107CiAKIAlpZiAocS0+aGVhZCkKLQkJUEtUU0VUTElOSyhxLT50YWlsLCBwKTsKKwkJcS0+dGFpbC0+cHJldiA9IHA7CiAJZWxzZQogCQlxLT5oZWFkID0gcDsKIApAQCAtMTAxLDEyICsxMDQsMTMgQEAKIAlyZXR1cm4gcDsKIH0KIAotdm9pZCAqQkNNRkFTVFBBVEggcGt0cV9wZW5xX2hlYWQoc3RydWN0IHBrdHEgKnBxLCBpbnQgcHJlYywgdm9pZCAqcCkKK3N0cnVjdCBza19idWZmICpCQ01GQVNUUEFUSCBwa3RxX3BlbnFfaGVhZChzdHJ1Y3QgcGt0cSAqcHEsIGludCBwcmVjLAorCQkJCQkgICBzdHJ1Y3Qgc2tfYnVmZiAqcCkKIHsKIAlzdHJ1Y3QgcGt0cV9wcmVjICpxOwogCiAJQVNTRVJUKHByZWMgPj0gMCAmJiBwcmVjIDwgcHEtPm51bV9wcmVjKTsKLQlBU1NFUlQoUEtUTElOSyhwKSA9PSBOVUxMKTsJLyogcXVldWVpbmcgY2hhaW5zIG5vdCBhbGxvd2VkICovCisJQVNTRVJUKHAtPnByZXYgPT0gTlVMTCk7CS8qIHF1ZXVlaW5nIGNoYWlucyBub3QgYWxsb3dlZCAqLwogCiAJQVNTRVJUKCFwa3RxX2Z1bGwocHEpKTsKIAlBU1NFUlQoIXBrdHFfcGZ1bGwocHEsIHByZWMpKTsKQEAgLTExNiw3ICsxMjAsNyBAQAogCWlmIChxLT5oZWFkID09IE5VTEwpCiAJCXEtPnRhaWwgPSBwOwogCi0JUEtUU0VUTElOSyhwLCBxLT5oZWFkKTsKKwlwLT5wcmV2ID0gcS0+aGVhZDsKIAlxLT5oZWFkID0gcDsKIAlxLT5sZW4rKzsKIApAQCAtMTI4LDEwICsxMzIsMTAgQEAKIAlyZXR1cm4gcDsKIH0KIAotdm9pZCAqQkNNRkFTVFBBVEggcGt0cV9wZGVxKHN0cnVjdCBwa3RxICpwcSwgaW50IHByZWMpCitzdHJ1Y3Qgc2tfYnVmZiAqQkNNRkFTVFBBVEggcGt0cV9wZGVxKHN0cnVjdCBwa3RxICpwcSwgaW50IHByZWMpCiB7CiAJc3RydWN0IHBrdHFfcHJlYyAqcTsKLQl2b2lkICpwOworCXN0cnVjdCBza19idWZmICpwOwogCiAJQVNTRVJUKHByZWMgPj0gMCAmJiBwcmVjIDwgcHEtPm51bV9wcmVjKTsKIApAQCAtMTQxLDcgKzE0NSw3IEBACiAJaWYgKHAgPT0gTlVMTCkKIAkJcmV0dXJuIE5VTEw7CiAKLQlxLT5oZWFkID0gUEtUTElOSyhwKTsKKwlxLT5oZWFkID0gcC0+cHJldjsKIAlpZiAocS0+aGVhZCA9PSBOVUxMKQogCQlxLT50YWlsID0gTlVMTDsKIApAQCAtMTQ5LDE1ICsxNTMsMTUgQEAKIAogCXBxLT5sZW4tLTsKIAotCVBLVFNFVExJTksocCwgTlVMTCk7CisJcC0+cHJldiA9IE5VTEw7CiAKIAlyZXR1cm4gcDsKIH0KIAotdm9pZCAqQkNNRkFTVFBBVEggcGt0cV9wZGVxX3RhaWwoc3RydWN0IHBrdHEgKnBxLCBpbnQgcHJlYykKK3N0cnVjdCBza19idWZmICpCQ01GQVNUUEFUSCBwa3RxX3BkZXFfdGFpbChzdHJ1Y3QgcGt0cSAqcHEsIGludCBwcmVjKQogewogCXN0cnVjdCBwa3RxX3ByZWMgKnE7Ci0Jdm9pZCAqcCwgKnByZXY7CisJc3RydWN0IHNrX2J1ZmYgKnAsICpwcmV2OwogCiAJQVNTRVJUKHByZWMgPj0gMCAmJiBwcmVjIDwgcHEtPm51bV9wcmVjKTsKIApAQCAtMTY3LDExICsxNzEsMTEgQEAKIAlpZiAocCA9PSBOVUxMKQogCQlyZXR1cm4gTlVMTDsKIAotCWZvciAocHJldiA9IE5VTEw7IHAgIT0gcS0+dGFpbDsgcCA9IFBLVExJTksocCkpCisJZm9yIChwcmV2ID0gTlVMTDsgcCAhPSBxLT50YWlsOyBwID0gcC0+cHJldikKIAkJcHJldiA9IHA7CiAKIAlpZiAocHJldikKLQkJUEtUU0VUTElOSyhwcmV2LCBOVUxMKTsKKwkJcHJldi0+cHJldiA9IE5VTEw7CiAJZWxzZQogCQlxLT5oZWFkID0gTlVMTDsKIApAQCAtMTg0LDE3ICsxODgsMTcgQEAKIH0KIAogI2lmZGVmIEJSQ01fRlVMTE1BQwotdm9pZCBwa3RxX3BmbHVzaChvc2xfdCAqb3NoLCBzdHJ1Y3QgcGt0cSAqcHEsIGludCBwcmVjLCBib29sIGRpcikKK3ZvaWQgcGt0cV9wZmx1c2goc3RydWN0IG9zbF9pbmZvICpvc2gsIHN0cnVjdCBwa3RxICpwcSwgaW50IHByZWMsIGJvb2wgZGlyKQogewogCXN0cnVjdCBwa3RxX3ByZWMgKnE7Ci0Jdm9pZCAqcDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqcDsKIAogCXEgPSAmcHEtPnFbcHJlY107CiAJcCA9IHEtPmhlYWQ7CiAJd2hpbGUgKHApIHsKLQkJcS0+aGVhZCA9IFBLVExJTksocCk7Ci0JCVBLVFNFVExJTksocCwgTlVMTCk7Ci0JCVBLVEZSRUUob3NoLCBwLCBkaXIpOworCQlxLT5oZWFkID0gcC0+cHJldjsKKwkJcC0+cHJldiA9IE5VTEw7CisJCXBrdF9idWZfZnJlZV9za2Iob3NoLCBwLCBkaXIpOwogCQlxLT5sZW4tLTsKIAkJcHEtPmxlbi0tOwogCQlwID0gcS0+aGVhZDsKQEAgLTIwMyw3ICsyMDcsNyBAQAogCXEtPnRhaWwgPSBOVUxMOwogfQogCi12b2lkIHBrdHFfZmx1c2gob3NsX3QgKm9zaCwgc3RydWN0IHBrdHEgKnBxLCBib29sIGRpcikKK3ZvaWQgcGt0cV9mbHVzaChzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgc3RydWN0IHBrdHEgKnBxLCBib29sIGRpcikKIHsKIAlpbnQgcHJlYzsKIAlmb3IgKHByZWMgPSAwOyBwcmVjIDwgcHEtPm51bV9wcmVjOyBwcmVjKyspCkBAIC0yMTIsMTEgKzIxNiwxMSBAQAogfQogI2Vsc2UgLyogIUJSQ01fRlVMTE1BQyAqLwogdm9pZAotcGt0cV9wZmx1c2gob3NsX3QgKm9zaCwgc3RydWN0IHBrdHEgKnBxLCBpbnQgcHJlYywgYm9vbCBkaXIsIGlmcGt0X2NiX3QgZm4sCi0JICAgIGludCBhcmcpCitwa3RxX3BmbHVzaChzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgc3RydWN0IHBrdHEgKnBxLCBpbnQgcHJlYywgYm9vbCBkaXIsCisJICAgIGlmcGt0X2NiX3QgZm4sIGludCBhcmcpCiB7CiAJc3RydWN0IHBrdHFfcHJlYyAqcTsKLQl2b2lkICpwLCAqcHJldiA9IE5VTEw7CisJc3RydWN0IHNrX2J1ZmYgKnAsICpwcmV2ID0gTlVMTDsKIAogCXEgPSAmcHEtPnFbcHJlY107CiAJcCA9IHEtPmhlYWQ7CkBAIC0yMjQsMTcgKzIyOCwxNyBAQAogCQlpZiAoZm4gPT0gTlVMTCB8fCAoKmZuKSAocCwgYXJnKSkgewogCQkJYm9vbCBoZWFkID0gKHAgPT0gcS0+aGVhZCk7CiAJCQlpZiAoaGVhZCkKLQkJCQlxLT5oZWFkID0gUEtUTElOSyhwKTsKKwkJCQlxLT5oZWFkID0gcC0+cHJldjsKIAkJCWVsc2UKLQkJCQlQS1RTRVRMSU5LKHByZXYsIFBLVExJTksocCkpOwotCQkJUEtUU0VUTElOSyhwLCBOVUxMKTsKLQkJCVBLVEZSRUUob3NoLCBwLCBkaXIpOworCQkJCXByZXYtPnByZXYgPSBwLT5wcmV2OworCQkJcC0+cHJldiA9IE5VTEw7CisJCQlwa3RfYnVmX2ZyZWVfc2tiKG9zaCwgcCwgZGlyKTsKIAkJCXEtPmxlbi0tOwogCQkJcHEtPmxlbi0tOwotCQkJcCA9IChoZWFkID8gcS0+aGVhZCA6IFBLVExJTksocHJldikpOworCQkJcCA9IChoZWFkID8gcS0+aGVhZCA6IHByZXYtPnByZXYpOwogCQl9IGVsc2UgewogCQkJcHJldiA9IHA7Ci0JCQlwID0gUEtUTElOSyhwKTsKKwkJCXAgPSBwLT5wcmV2OwogCQl9CiAJfQogCkBAIC0yNDQsNyArMjQ4LDggQEAKIAl9CiB9CiAKLXZvaWQgcGt0cV9mbHVzaChvc2xfdCAqb3NoLCBzdHJ1Y3QgcGt0cSAqcHEsIGJvb2wgZGlyLCBpZnBrdF9jYl90IGZuLCBpbnQgYXJnKQordm9pZCBwa3RxX2ZsdXNoKHN0cnVjdCBvc2xfaW5mbyAqb3NoLCBzdHJ1Y3QgcGt0cSAqcHEsIGJvb2wgZGlyLAorCQlpZnBrdF9jYl90IGZuLCBpbnQgYXJnKQogewogCWludCBwcmVjOwogCWZvciAocHJlYyA9IDA7IHByZWMgPCBwcS0+bnVtX3ByZWM7IHByZWMrKykKQEAgLTI2MSw3ICsyNjYsNyBAQAogCUFTU0VSVChudW1fcHJlYyA+IDAgJiYgbnVtX3ByZWMgPD0gUEtUUV9NQVhfUFJFQyk7CiAKIAkvKiBwcSBpcyB2YXJpYWJsZSBzaXplOyBvbmx5IHplcm8gb3V0IHdoYXQncyByZXF1ZXN0ZWQgKi8KLQliemVybyhwcSwKKwltZW1zZXQocHEsIDAsCiAJICAgICAgb2Zmc2V0b2Yoc3RydWN0IHBrdHEsIHEpICsgKHNpemVvZihzdHJ1Y3QgcGt0cV9wcmVjKSAqIG51bV9wcmVjKSk7CiAKIAlwcS0+bnVtX3ByZWMgPSAodTE2KSBudW1fcHJlYzsKQEAgLTI3Miw3ICsyNzcsNyBAQAogCQlwcS0+cVtwcmVjXS5tYXggPSBwcS0+bWF4OwogfQogCi12b2lkICpwa3RxX3BlZWtfdGFpbChzdHJ1Y3QgcGt0cSAqcHEsIGludCAqcHJlY19vdXQpCitzdHJ1Y3Qgc2tfYnVmZiAqcGt0cV9wZWVrX3RhaWwoc3RydWN0IHBrdHEgKnBxLCBpbnQgKnByZWNfb3V0KQogewogCWludCBwcmVjOwogCkBAIC0zMDMsMTAgKzMwOCwxMSBAQAogCXJldHVybiBsZW47CiB9CiAvKiBQcmlvcml0eSBkZXF1ZXVlIGZyb20gYSBzcGVjaWZpYyBzZXQgb2YgcHJlY2VkZW5jZXMgKi8KLXZvaWQgKkJDTUZBU1RQQVRIIHBrdHFfbWRlcShzdHJ1Y3QgcGt0cSAqcHEsIHVpbnQgcHJlY19ibXAsIGludCAqcHJlY19vdXQpCitzdHJ1Y3Qgc2tfYnVmZiAqQkNNRkFTVFBBVEggcGt0cV9tZGVxKHN0cnVjdCBwa3RxICpwcSwgdWludCBwcmVjX2JtcCwKKwkJCQkgICAgICBpbnQgKnByZWNfb3V0KQogewogCXN0cnVjdCBwa3RxX3ByZWMgKnE7Ci0Jdm9pZCAqcDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqcDsKIAlpbnQgcHJlYzsKIAogCWlmIChwcS0+bGVuID09IDApCkBAIC0zMjUsNyArMzMxLDcgQEAKIAlpZiAocCA9PSBOVUxMKQogCQlyZXR1cm4gTlVMTDsKIAotCXEtPmhlYWQgPSBQS1RMSU5LKHApOworCXEtPmhlYWQgPSBwLT5wcmV2OwogCWlmIChxLT5oZWFkID09IE5VTEwpCiAJCXEtPnRhaWwgPSBOVUxMOwogCkBAIC0zMzYsNyArMzQyLDcgQEAKIAogCXBxLT5sZW4tLTsKIAotCVBLVFNFVExJTksocCwgTlVMTCk7CisJcC0+cHJldiA9IE5VTEw7CiAKIAlyZXR1cm4gcDsKIH0KQEAgLTM3Myw3ICszNzksNyBAQAogCiAJLyogZmlyc3QgbG9vayBpbiB2YXJzW10gKi8KIAlmb3IgKHMgPSB2YXJzOyBzICYmICpzOykgewotCQlpZiAoKGJjbXAocywgbmFtZSwgbGVuKSA9PSAwKSAmJiAoc1tsZW5dID09ICc9JykpCisJCWlmICgobWVtY21wKHMsIG5hbWUsIGxlbikgPT0gMCkgJiYgKHNbbGVuXSA9PSAnPScpKQogCQkJcmV0dXJuICZzW2xlbiArIDFdOwogCiAJCXdoaWxlICgqcysrKQpAQCAtNDA0LDE1ICs0MTAsMTUgQEAKIAogI2lmIGRlZmluZWQoQkNNREJHKQogLyogcHJldHR5IGhleCBwcmludCBhIHBrdCBidWZmZXIgY2hhaW4gKi8KLXZvaWQgcHJwa3QoY29uc3QgY2hhciAqbXNnLCBvc2xfdCAqb3NoLCB2b2lkICpwMCkKK3ZvaWQgcHJwa3QoY29uc3QgY2hhciAqbXNnLCBzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgc3RydWN0IHNrX2J1ZmYgKnAwKQogewotCXZvaWQgKnA7CisJc3RydWN0IHNrX2J1ZmYgKnA7CiAKIAlpZiAobXNnICYmIChtc2dbMF0gIT0gJ1wwJykpCiAJCXByaW50ZigiJXM6XG4iLCBtc2cpOwogCi0JZm9yIChwID0gcDA7IHA7IHAgPSBQS1RORVhUKHApKQotCQlwcmhleChOVUxMLCBQS1REQVRBKHApLCBQS1RMRU4ocCkpOworCWZvciAocCA9IHAwOyBwOyBwID0gcC0+bmV4dCkKKwkJcHJoZXgoTlVMTCwgcC0+ZGF0YSwgcC0+bGVuKTsKIH0KICNlbmRpZgkJCQkvKiBkZWZpbmVkKEJDTURCRykgKi8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS91dGlsL2JjbXdpZmkuYyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvdXRpbC9iY213aWZpLmMKaW5kZXggMWJiNmM3OC4uODFlNTRiZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS91dGlsL2JjbXdpZmkuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3V0aWwvYmNtd2lmaS5jCkBAIC0xNSw2ICsxNSwxMCBAQAogICovCiAjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpZmRlZiBCUkNNX0ZVTExNQUMKKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNlbmRpZgorI2luY2x1ZGUgPG9zbC5oPgogI2luY2x1ZGUgPGJjbWRlZnMuaD4KICNpbmNsdWRlIDxiY211dGlscy5oPgogI2luY2x1ZGUgPGJjbXdpZmkuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvdXRpbC9obmRkbWEuYyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvdXRpbC9obmRkbWEuYwppbmRleCBmZTUwM2U3Li5kMDg4NjkyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3V0aWwvaG5kZG1hLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS91dGlsL2huZGRtYS5jCkBAIC0xNiw3ICsxNiw4IEBACiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KLSNpbmNsdWRlIDxsaW51eHZlci5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGJjbWRlZnMuaD4KICNpbmNsdWRlIDxiY21kZXZzLmg+CiAjaW5jbHVkZSA8b3NsLmg+CkBAIC0yOCw2ICsyOSwxMCBAQAogI2luY2x1ZGUgPHNiaG5kZG1hLmg+CiAjaW5jbHVkZSA8aG5kZG1hLmg+CiAKKyNpZiBkZWZpbmVkKF9fbWlwc19fKQorI2luY2x1ZGUgPGFzbS9hZGRyc3BhY2UuaD4KKyNlbmRpZgorCiAvKiBkZWJ1Zy90cmFjZSAqLwogI2lmZGVmIEJDTURCRwogI2RlZmluZQlETUFfRVJST1IoYXJncykgXApAQCAtNjgsMTEgKzczLDEyIEBACiAKICNkZWZpbmUJRElfSU5GTyhkbWFoKQkoKGRtYV9pbmZvX3QgKilkbWFoKQogCisjZGVmaW5lIFJfU00ocikJCSgqKHIpKQorI2RlZmluZSBXX1NNKHIsIHYpCSgqKHIpID0gKHYpKQorCiAvKiBkbWEgZW5naW5lIHNvZnR3YXJlIHN0YXRlICovCiB0eXBlZGVmIHN0cnVjdCBkbWFfaW5mbyB7Ci0Jc3RydWN0IGhuZGRtYV9wdWIgaG5kZG1hOwkvKiBleHBvcnRlZCBzdHJ1Y3R1cmUsIGRvbid0IHVzZSBobmRkbWFfdCwKLQkJCQkJICogd2hpY2ggY291bGQgYmUgY29uc3QKLQkJCQkJICovCisJc3RydWN0IGhuZGRtYV9wdWIgaG5kZG1hOyAvKiBleHBvcnRlZCBzdHJ1Y3R1cmUgKi8KIAl1aW50ICptc2dfbGV2ZWw7CS8qIG1lc3NhZ2UgbGV2ZWwgcG9pbnRlciAqLwogCWNoYXIgbmFtZVtNQVhOQU1FTF07CS8qIGNhbGxlcnMgbmFtZSBmb3IgZGlhZyBtc2dzICovCiAKQEAgLTIyMiw3ICsyMjgsNyBAQAogc3RhdGljIHZvaWQgX2RtYV9maWZvbG9vcGJhY2tlbmFibGUoZG1hX2luZm9fdCAqZGkpOwogc3RhdGljIHVpbnQgX2RtYV9jdHJsZmxhZ3MoZG1hX2luZm9fdCAqZGksIHVpbnQgbWFzaywgdWludCBmbGFncyk7CiBzdGF0aWMgdTggZG1hX2FsaWduX3NpemV0b2JpdHModWludCBzaXplKTsKLXN0YXRpYyB2b2lkICpkbWFfcmluZ2FsbG9jKG9zbF90ICpvc2gsIHUzMiBib3VuZGFyeSwgdWludCBzaXplLAorc3RhdGljIHZvaWQgKmRtYV9yaW5nYWxsb2Moc3RydWN0IG9zbF9pbmZvICpvc2gsIHUzMiBib3VuZGFyeSwgdWludCBzaXplLAogCQkJICAgdTE2ICphbGlnbmJpdHMsIHVpbnQgKmFsbG9jZWQsCiAJCQkgICBkbWFhZGRyX3QgKmRlc2NwYSwgb3NsZG1hX3QgKipkbWFoKTsKIApAQCAtMjMxLDcgKzIzNyw3IEBACiBzdGF0aWMgYm9vbCBkbWEzMl90eHJlc2V0KGRtYV9pbmZvX3QgKmRpKTsKIHN0YXRpYyBib29sIGRtYTMyX3J4cmVzZXQoZG1hX2luZm9fdCAqZGkpOwogc3RhdGljIGJvb2wgZG1hMzJfdHhzdXNwZW5kZWRpZGxlKGRtYV9pbmZvX3QgKmRpKTsKLXN0YXRpYyBpbnQgZG1hMzJfdHhmYXN0KGRtYV9pbmZvX3QgKmRpLCB2b2lkICpwMCwgYm9vbCBjb21taXQpOworc3RhdGljIGludCBkbWEzMl90eGZhc3QoZG1hX2luZm9fdCAqZGksIHN0cnVjdCBza19idWZmICpwMCwgYm9vbCBjb21taXQpOwogc3RhdGljIHZvaWQgKmRtYTMyX2dldG5leHR0eHAoZG1hX2luZm9fdCAqZGksIHR4ZF9yYW5nZV90IHJhbmdlKTsKIHN0YXRpYyB2b2lkICpkbWEzMl9nZXRuZXh0cnhwKGRtYV9pbmZvX3QgKmRpLCBib29sIGZvcmNlYWxsKTsKIHN0YXRpYyB2b2lkIGRtYTMyX3R4cm90YXRlKGRtYV9pbmZvX3QgKmRpKTsKQEAgLTI0NiwxNCArMjUyLDE0IEBACiBzdGF0aWMgYm9vbCBkbWEzMl9yeHN0b3BwZWQoZG1hX2luZm9fdCAqZGkpOwogc3RhdGljIGJvb2wgZG1hMzJfcnhlbmFibGVkKGRtYV9pbmZvX3QgKmRpKTsKIAotc3RhdGljIGJvb2wgX2RtYTMyX2FkZHJleHQob3NsX3QgKm9zaCwgZG1hMzJyZWdzX3QgKmRtYTMycmVncyk7CitzdGF0aWMgYm9vbCBfZG1hMzJfYWRkcmV4dChzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgZG1hMzJyZWdzX3QgKmRtYTMycmVncyk7CiAKIC8qIFByb3RvdHlwZXMgZm9yIDY0LWJpdCByb3V0aW5lcyAqLwogc3RhdGljIGJvb2wgZG1hNjRfYWxsb2MoZG1hX2luZm9fdCAqZGksIHVpbnQgZGlyZWN0aW9uKTsKIHN0YXRpYyBib29sIGRtYTY0X3R4cmVzZXQoZG1hX2luZm9fdCAqZGkpOwogc3RhdGljIGJvb2wgZG1hNjRfcnhyZXNldChkbWFfaW5mb190ICpkaSk7CiBzdGF0aWMgYm9vbCBkbWE2NF90eHN1c3BlbmRlZGlkbGUoZG1hX2luZm9fdCAqZGkpOwotc3RhdGljIGludCBkbWE2NF90eGZhc3QoZG1hX2luZm9fdCAqZGksIHZvaWQgKnAwLCBib29sIGNvbW1pdCk7CitzdGF0aWMgaW50IGRtYTY0X3R4ZmFzdChkbWFfaW5mb190ICpkaSwgc3RydWN0IHNrX2J1ZmYgKnAwLCBib29sIGNvbW1pdCk7CiBzdGF0aWMgaW50IGRtYTY0X3R4dW5mcmFtZWQoZG1hX2luZm9fdCAqZGksIHZvaWQgKnAwLCB1aW50IGxlbiwgYm9vbCBjb21taXQpOwogc3RhdGljIHZvaWQgKmRtYTY0X2dldHBvcyhkbWFfaW5mb190ICpkaSwgYm9vbCBkaXJlY3Rpb24pOwogc3RhdGljIHZvaWQgKmRtYTY0X2dldG5leHR0eHAoZG1hX2luZm9fdCAqZGksIHR4ZF9yYW5nZV90IHJhbmdlKTsKQEAgLTI3MCw3ICsyNzYsNyBAQAogc3RhdGljIGJvb2wgZG1hNjRfdHhzdG9wcGVkKGRtYV9pbmZvX3QgKmRpKTsKIHN0YXRpYyBib29sIGRtYTY0X3J4c3RvcHBlZChkbWFfaW5mb190ICpkaSk7CiBzdGF0aWMgYm9vbCBkbWE2NF9yeGVuYWJsZWQoZG1hX2luZm9fdCAqZGkpOwotc3RhdGljIGJvb2wgX2RtYTY0X2FkZHJleHQob3NsX3QgKm9zaCwgZG1hNjRyZWdzX3QgKmRtYTY0cmVncyk7CitzdGF0aWMgYm9vbCBfZG1hNjRfYWRkcmV4dChzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgZG1hNjRyZWdzX3QgKmRtYTY0cmVncyk7CiAKIHN0YXRpYyBpbmxpbmUgdTMyIHBhcml0eTMyKHUzMiBkYXRhKTsKIApAQCAtMzY4LDEwICszNzQsMTAgQEAKIAkzOQogfTsKIAotaG5kZG1hX3QgKmRtYV9hdHRhY2gob3NsX3QgKm9zaCwgY2hhciAqbmFtZSwgc2lfdCAqc2loLCB2b2lkICpkbWFyZWdzdHgsCi0JCSAgICAgdm9pZCAqZG1hcmVnc3J4LCB1aW50IG50eGQsIHVpbnQgbnJ4ZCwgdWludCByeGJ1ZnNpemUsCi0JCSAgICAgaW50IHJ4ZXh0aGVhZHJvb20sIHVpbnQgbnJ4cG9zdCwgdWludCByeG9mZnNldCwKLQkJICAgICB1aW50ICptc2dfbGV2ZWwpCitzdHJ1Y3QgaG5kZG1hX3B1YiAqZG1hX2F0dGFjaChzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgY2hhciAqbmFtZSwgc2lfdCAqc2loLAorCQkgICAgIHZvaWQgKmRtYXJlZ3N0eCwgdm9pZCAqZG1hcmVnc3J4LCB1aW50IG50eGQsCisJCSAgICAgdWludCBucnhkLCB1aW50IHJ4YnVmc2l6ZSwgaW50IHJ4ZXh0aGVhZHJvb20sCisJCSAgICAgdWludCBucnhwb3N0LCB1aW50IHJ4b2Zmc2V0LCB1aW50ICptc2dfbGV2ZWwpCiB7CiAJZG1hX2luZm9fdCAqZGk7CiAJdWludCBzaXplOwpAQCAtNTcwLDcgKzU3Niw3IEBACiAJCX0KIAl9CiAKLQlyZXR1cm4gKGhuZGRtYV90ICopIGRpOworCXJldHVybiAoc3RydWN0IGhuZGRtYV9wdWIgKikgZGk7CiAKICBmYWlsOgogCV9kbWFfZGV0YWNoKGRpKTsKQEAgLTY2Myw3ICs2NjksNyBAQAogCX0KIH0KIAotc3RhdGljIGJvb2wgX2RtYTMyX2FkZHJleHQob3NsX3QgKm9zaCwgZG1hMzJyZWdzX3QgKmRtYTMycmVncykKK3N0YXRpYyBib29sIF9kbWEzMl9hZGRyZXh0KHN0cnVjdCBvc2xfaW5mbyAqb3NoLCBkbWEzMnJlZ3NfdCAqZG1hMzJyZWdzKQogewogCXUzMiB3OwogCkBAIC05MDIsNyArOTA4LDcgQEAKIAogCS8qIGNsZWFyIHJ4IGRlc2NyaXB0b3IgcmluZyAqLwogCWlmIChETUE2NF9FTkFCKGRpKSAmJiBETUE2NF9NT0RFKGRpKSkgewotCQlCWkVST19TTSgodm9pZCAqKWRpLT5yeGQ2NCwKKwkJbWVtc2V0KCh2b2lkICopZGktPnJ4ZDY0LCAnXDAnLAogCQkJIChkaS0+bnJ4ZCAqIHNpemVvZihkbWE2NGRkX3QpKSk7CiAKIAkJLyogRE1BIGVuZ2luZSB3aXRoIG91dCBhbGlnbm1lbnQgcmVxdWlyZW1lbnQgcmVxdWlyZXMgdGFibGUgdG8gYmUgaW5pdGVkCkBAIC05MTYsNyArOTIyLDcgQEAKIAkJaWYgKGRpLT5hbGlnbmRlc2NfNGspCiAJCQlfZG1hX2RkdGFibGVfaW5pdChkaSwgRE1BX1JYLCBkaS0+cnhkcGEpOwogCX0gZWxzZSBpZiAoRE1BMzJfRU5BQihkaSkpIHsKLQkJQlpFUk9fU00oKHZvaWQgKilkaS0+cnhkMzIsCisJCW1lbXNldCgodm9pZCAqKWRpLT5yeGQzMiwgJ1wwJywKIAkJCSAoZGktPm5yeGQgKiBzaXplb2YoZG1hMzJkZF90KSkpOwogCQlfZG1hX3J4ZW5hYmxlKGRpKTsKIAkJX2RtYV9kZHRhYmxlX2luaXQoZGksIERNQV9SWCwgZGktPnJ4ZHBhKTsKQEAgLTk3OCw3ICs5ODQsNyBAQAogICovCiBzdGF0aWMgdm9pZCAqQkNNRkFTVFBBVEggX2RtYV9yeChkbWFfaW5mb190ICpkaSkKIHsKLQl2b2lkICpwLCAqaGVhZCwgKnRhaWw7CisJc3RydWN0IHNrX2J1ZmYgKnAsICpoZWFkLCAqdGFpbDsKIAl1aW50IGxlbjsKIAl1aW50IHBrdF9sZW47CiAJaW50IHJlc2lkID0gMDsKQEAgLTk4OCwzMCArOTk0LDMxIEBACiAJaWYgKGhlYWQgPT0gTlVMTCkKIAkJcmV0dXJuIE5VTEw7CiAKLQlsZW4gPSBsdG9oMTYoKih1MTYgKikgKFBLVERBVEEoaGVhZCkpKTsKKwlsZW4gPSBsdG9oMTYoKih1MTYgKikgKGhlYWQtPmRhdGEpKTsKIAlETUFfVFJBQ0UoKCIlczogZG1hX3J4IGxlbiAlZFxuIiwgZGktPm5hbWUsIGxlbikpOwogCiAjaWYgZGVmaW5lZChfX21pcHNfXykKKyNkZWZpbmUgT1NMX1VOQ0FDSEVEKHZhKSAgICAgICAgKCh2b2lkICopS1NFRzFBRERSKCh2YSkpKQogCWlmICghbGVuKSB7Ci0JCXdoaWxlICghKGxlbiA9ICoodTE2ICopIE9TTF9VTkNBQ0hFRChQS1REQVRBKGhlYWQpKSkpCisJCXdoaWxlICghKGxlbiA9ICoodTE2ICopIE9TTF9VTkNBQ0hFRChoZWFkLT5kYXRhKSkpCiAJCQl1ZGVsYXkoMSk7CiAKLQkJKih1MTYgKikgUEtUREFUQShoZWFkKSA9IGh0b2wxNigodTE2KSBsZW4pOworCQkqKHUxNiAqKSAoaGVhZC0+ZGF0YSkgPSBodG9sMTYoKHUxNikgbGVuKTsKIAl9CiAjZW5kaWYJCQkJLyogZGVmaW5lZChfX21pcHNfXykgKi8KIAogCS8qIHNldCBhY3R1YWwgbGVuZ3RoICovCiAJcGt0X2xlbiA9IG1pbigoZGktPnJ4b2Zmc2V0ICsgbGVuKSwgZGktPnJ4YnVmc2l6ZSk7Ci0JUEtUU0VUTEVOKGhlYWQsIHBrdF9sZW4pOworCV9fc2tiX3RyaW0oaGVhZCwgcGt0X2xlbik7CiAJcmVzaWQgPSBsZW4gLSAoZGktPnJ4YnVmc2l6ZSAtIGRpLT5yeG9mZnNldCk7CiAKIAkvKiBjaGVjayBmb3Igc2luZ2xlIG9yIG11bHRpLWJ1ZmZlciByeCAqLwogCWlmIChyZXNpZCA+IDApIHsKIAkJdGFpbCA9IGhlYWQ7CiAJCXdoaWxlICgocmVzaWQgPiAwKSAmJiAocCA9IF9kbWFfZ2V0bmV4dHJ4cChkaSwgZmFsc2UpKSkgewotCQkJUEtUU0VUTkVYVCh0YWlsLCBwKTsKKwkJCXRhaWwtPm5leHQgPSBwOwogCQkJcGt0X2xlbiA9IG1pbihyZXNpZCwgKGludClkaS0+cnhidWZzaXplKTsKLQkJCVBLVFNFVExFTihwLCBwa3RfbGVuKTsKKwkJCV9fc2tiX3RyaW0ocCwgcGt0X2xlbik7CiAKIAkJCXRhaWwgPSBwOwogCQkJcmVzaWQgLT0gZGktPnJ4YnVmc2l6ZTsKQEAgLTEwMzcsNyArMTA0NCw3IEBACiAJCWlmICgoZGktPmhuZGRtYS5kbWFjdHJsZmxhZ3MgJiBETUFfQ1RSTF9SWE1VTFRJKSA9PSAwKSB7CiAJCQlETUFfRVJST1IoKCIlczogZG1hX3J4OiBiYWQgZnJhbWUgbGVuZ3RoICglZClcbiIsCiAJCQkJICAgZGktPm5hbWUsIGxlbikpOwotCQkJUEtURlJFRShkaS0+b3NoLCBoZWFkLCBmYWxzZSk7CisJCQlwa3RfYnVmX2ZyZWVfc2tiKGRpLT5vc2gsIGhlYWQsIGZhbHNlKTsKIAkJCWRpLT5obmRkbWEucnhnaWFudHMrKzsKIAkJCWdvdG8gbmV4dF9mcmFtZTsKIAkJfQpAQCAtMTA1Myw3ICsxMDYwLDcgQEAKICAqLwogc3RhdGljIGJvb2wgQkNNRkFTVFBBVEggX2RtYV9yeGZpbGwoZG1hX2luZm9fdCAqZGkpCiB7Ci0Jdm9pZCAqcDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqcDsKIAl1MTYgcnhpbiwgcnhvdXQ7CiAJdTMyIGZsYWdzID0gMDsKIAl1aW50IG47CkBAIC0xMDg1LDcgKzEwOTIsNyBAQAogCQkgICBzaXplIHRvIGJlIGFsbG9jYXRlZAogCQkgKi8KIAotCQlwID0gb3NsX3BrdGdldChkaS0+b3NoLCBkaS0+cnhidWZzaXplICsgZXh0cmFfb2Zmc2V0KTsKKwkJcCA9IHBrdF9idWZfZ2V0X3NrYihkaS0+b3NoLCBkaS0+cnhidWZzaXplICsgZXh0cmFfb2Zmc2V0KTsKIAogCQlpZiAocCA9PSBOVUxMKSB7CiAJCQlETUFfRVJST1IoKCIlczogZG1hX3J4ZmlsbDogb3V0IG9mIHJ4YnVmc1xuIiwKQEAgLTExMDksMTcgKzExMTYsMTggQEAKIAkJfQogCQkvKiByZXNlcnZlIGFuIGV4dHJhIGhlYWRyb29tLCBpZiBhcHBsaWNhYmxlICovCiAJCWlmIChleHRyYV9vZmZzZXQpCi0JCQlQS1RQVUxMKHAsIGV4dHJhX29mZnNldCk7CisJCQlza2JfcHVsbChwLCBleHRyYV9vZmZzZXQpOwogCiAJCS8qIERvIGEgY2FjaGVkIHdyaXRlIGluc3RlYWQgb2YgdW5jYWNoZWQgd3JpdGUgc2luY2UgRE1BX01BUAogCQkgKiB3aWxsIGZsdXNoIHRoZSBjYWNoZS4KIAkJICovCi0JCSoodTMyICopIChQS1REQVRBKHApKSA9IDA7CisJCSoodTMyICopIChwLT5kYXRhKSA9IDA7CiAKIAkJaWYgKERNQVNHTElTVF9FTkFCKQotCQkJYnplcm8oJmRpLT5yeHBfZG1haFtyeG91dF0sIHNpemVvZihobmRkbWFfc2VnX21hcF90KSk7CisJCQltZW1zZXQoJmRpLT5yeHBfZG1haFtyeG91dF0sIDAsCisJCQkJc2l6ZW9mKGhuZGRtYV9zZWdfbWFwX3QpKTsKIAotCQlwYSA9IERNQV9NQVAoZGktPm9zaCwgUEtUREFUQShwKSwKKwkJcGEgPSBETUFfTUFQKGRpLT5vc2gsIHAtPmRhdGEsCiAJCQkgICAgIGRpLT5yeGJ1ZnNpemUsIERNQV9SWCwgcCwgJmRpLT5yeHBfZG1haFtyeG91dF0pOwogCiAJCUFTU0VSVChJU19BTElHTkVEKFBIWVNBRERSTE8ocGEpLCA0KSk7CkBAIC0xMjIwLDE1ICsxMjI4LDEwIEBACiB7CiAJdm9pZCAqcDsKIAotCS8qICJ1bnVzZWQgbG9jYWwiIHdhcm5pbmcgc3VwcHJlc3Npb24gZm9yIE9TTHMgdGhhdAotCSAqIGRlZmluZSBQS1RGUkVFKCkgd2l0aG91dCB1c2luZyB0aGUgZGktPm9zaCBhcmcKLQkgKi8KLQlkaSA9IGRpOwotCiAJRE1BX1RSQUNFKCgiJXM6IGRtYV9yeHJlY2xhaW1cbiIsIGRpLT5uYW1lKSk7CiAKIAl3aGlsZSAoKHAgPSBfZG1hX2dldG5leHRyeHAoZGksIHRydWUpKSkKLQkJUEtURlJFRShkaS0+b3NoLCBwLCBmYWxzZSk7CisJCXBrdF9idWZfZnJlZV9za2IoZGktPm9zaCwgcCwgZmFsc2UpOwogfQogCiBzdGF0aWMgdm9pZCAqQkNNRkFTVFBBVEggX2RtYV9nZXRuZXh0cnhwKGRtYV9pbmZvX3QgKmRpLCBib29sIGZvcmNlYWxsKQpAQCAtMTM3Miw3ICsxMzc1LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotdm9pZCBkbWFfdHhwaW9sb29wYmFjayhvc2xfdCAqb3NoLCBkbWEzMnJlZ3NfdCAqcmVncykKK3ZvaWQgZG1hX3R4cGlvbG9vcGJhY2soc3RydWN0IG9zbF9pbmZvICpvc2gsIGRtYTMycmVnc190ICpyZWdzKQogewogCU9SX1JFRyhvc2gsICZyZWdzLT5jb250cm9sLCBYQ19MRSk7CiB9CkBAIC0xMzk1LDcgKzEzOTgsNyBAQAogICogZGVzY3JpcHRvciByaW5nIHNpemUgYWxpZ25lZCBsb2NhdGlvbi4gVGhpcyB3aWxsIGVuc3VyZSB0aGF0IHRoZSByaW5nIHdpbGwKICAqIG5vdCBjcm9zcyBwYWdlIGJvdW5kYXJ5CiAgKi8KLXN0YXRpYyB2b2lkICpkbWFfcmluZ2FsbG9jKG9zbF90ICpvc2gsIHUzMiBib3VuZGFyeSwgdWludCBzaXplLAorc3RhdGljIHZvaWQgKmRtYV9yaW5nYWxsb2Moc3RydWN0IG9zbF9pbmZvICpvc2gsIHUzMiBib3VuZGFyeSwgdWludCBzaXplLAogCQkJICAgdTE2ICphbGlnbmJpdHMsIHVpbnQgKmFsbG9jZWQsCiAJCQkgICBkbWFhZGRyX3QgKmRlc2NwYSwgb3NsZG1hX3QgKipkbWFoKQogewpAQCAtMTQzNCw3ICsxNDM3LDcgQEAKIAlkaS0+aG5kZG1hLnR4YXZhaWwgPSBkaS0+bnR4ZCAtIDE7CiAKIAkvKiBjbGVhciB0eCBkZXNjcmlwdG9yIHJpbmcgKi8KLQlCWkVST19TTSgodm9pZCAqKWRpLT50eGQzMiwgKGRpLT5udHhkICogc2l6ZW9mKGRtYTMyZGRfdCkpKTsKKwltZW1zZXQoKHZvaWQgKilkaS0+dHhkMzIsICdcMCcsIChkaS0+bnR4ZCAqIHNpemVvZihkbWEzMmRkX3QpKSk7CiAKIAlpZiAoKGRpLT5obmRkbWEuZG1hY3RybGZsYWdzICYgRE1BX0NUUkxfUEVOKSA9PSAwKQogCQljb250cm9sIHw9IFhDX1BEOwpAQCAtMTQ5MSw3ICsxNDk0LDcgQEAKIAkJcmV0dXJuOwogCiAJd2hpbGUgKChwID0gZG1hMzJfZ2V0bmV4dHR4cChkaSwgcmFuZ2UpKSkKLQkJUEtURlJFRShkaS0+b3NoLCBwLCB0cnVlKTsKKwkJcGt0X2J1Zl9mcmVlX3NrYihkaS0+b3NoLCBwLCB0cnVlKTsKIH0KIAogc3RhdGljIGJvb2wgZG1hMzJfdHhzdG9wcGVkKGRtYV9pbmZvX3QgKmRpKQpAQCAtMTY1MSw5ICsxNjU0LDkgQEAKICAqIFdBUk5JTkc6IGNhbGwgbXVzdCBjaGVjayB0aGUgcmV0dXJuIHZhbHVlIGZvciBlcnJvci4KICAqICAgdGhlIGVycm9yKHRvc3MgZnJhbWVzKSBjb3VsZCBiZSBmYXRhbCBhbmQgY2F1c2UgbWFueSBzdWJzZXF1ZW50IGhhcmQgdG8gZGVidWcgcHJvYmxlbXMKICAqLwotc3RhdGljIGludCBkbWEzMl90eGZhc3QoZG1hX2luZm9fdCAqZGksIHZvaWQgKnAwLCBib29sIGNvbW1pdCkKK3N0YXRpYyBpbnQgZG1hMzJfdHhmYXN0KGRtYV9pbmZvX3QgKmRpLCBzdHJ1Y3Qgc2tfYnVmZiAqcDAsIGJvb2wgY29tbWl0KQogewotCXZvaWQgKnAsICpuZXh0OworCXN0cnVjdCBza19idWZmICpwLCAqbmV4dDsKIAl1bnNpZ25lZCBjaGFyICpkYXRhOwogCXVpbnQgbGVuOwogCXUxNiB0eG91dDsKQEAgLTE2NzIsMTIgKzE2NzUsMTIgQEAKIAkJdWludCBuc2VncywgajsKIAkJaG5kZG1hX3NlZ19tYXBfdCAqbWFwOwogCi0JCWRhdGEgPSBQS1REQVRBKHApOwotCQlsZW4gPSBQS1RMRU4ocCk7CisJCWRhdGEgPSBwLT5kYXRhOworCQlsZW4gPSBwLT5sZW47CiAjaWZkZWYgQkNNX0RNQVBBRAogCQlsZW4gKz0gUEtURE1BUEFEKGRpLT5vc2gsIHApOwogI2VuZGlmCi0JCW5leHQgPSBQS1RORVhUKHApOworCQluZXh0ID0gcC0+bmV4dDsKIAogCQkvKiByZXR1cm4gbm9uemVybyBpZiBvdXQgb2YgdHggZGVzY3JpcHRvcnMgKi8KIAkJaWYgKE5FWFRUWEQodHhvdXQpID09IGRpLT50eGluKQpAQCAtMTY4Nyw3ICsxNjkwLDggQEAKIAkJCWNvbnRpbnVlOwogCiAJCWlmIChETUFTR0xJU1RfRU5BQikKLQkJCWJ6ZXJvKCZkaS0+dHhwX2RtYWhbdHhvdXRdLCBzaXplb2YoaG5kZG1hX3NlZ19tYXBfdCkpOworCQkJbWVtc2V0KCZkaS0+dHhwX2RtYWhbdHhvdXRdLCAwLAorCQkJCXNpemVvZihobmRkbWFfc2VnX21hcF90KSk7CiAKIAkJLyogZ2V0IHBoeXNpY2FsIGFkZHJlc3Mgb2YgYnVmZmVyIHN0YXJ0ICovCiAJCXBhID0gRE1BX01BUChkaS0+b3NoLCBkYXRhLCBsZW4sIERNQV9UWCwgcCwKQEAgLTE3NjEsNyArMTc2NSw3IEBACiAKICBvdXRvZnR4ZDoKIAlETUFfRVJST1IoKCIlczogZG1hX3R4ZmFzdDogb3V0IG9mIHR4ZHNcbiIsIGRpLT5uYW1lKSk7Ci0JUEtURlJFRShkaS0+b3NoLCBwMCwgdHJ1ZSk7CisJcGt0X2J1Zl9mcmVlX3NrYihkaS0+b3NoLCBwMCwgdHJ1ZSk7CiAJZGktPmhuZGRtYS50eGF2YWlsID0gMDsKIAlkaS0+aG5kZG1hLnR4bm9idWYrKzsKIAlyZXR1cm4gLTE7CkBAIC0xOTU5LDcgKzE5NjMsNyBAQAogCQlpZiAoRE1BU0dMSVNUX0VOQUIpIHsKIAkJCWJjb3B5KCZkaS0+dHhwX2RtYWhbb2xkXSwgJmRpLT50eHBfZG1haFtuZXddLAogCQkJICAgICAgc2l6ZW9mKGhuZGRtYV9zZWdfbWFwX3QpKTsKLQkJCWJ6ZXJvKCZkaS0+dHhwX2RtYWhbb2xkXSwgc2l6ZW9mKGhuZGRtYV9zZWdfbWFwX3QpKTsKKwkJCW1lbXNldCgmZGktPnR4cF9kbWFoW29sZF0sIDAsIHNpemVvZihobmRkbWFfc2VnX21hcF90KSk7CiAJCX0KIAogCQlkaS0+dHhwW29sZF0gPSBOVUxMOwpAQCAtMTk4OSw3ICsxOTkzLDcgQEAKIAlkaS0+aG5kZG1hLnR4YXZhaWwgPSBkaS0+bnR4ZCAtIDE7CiAKIAkvKiBjbGVhciB0eCBkZXNjcmlwdG9yIHJpbmcgKi8KLQlCWkVST19TTSgodm9pZCAqKWRpLT50eGQ2NCwgKGRpLT5udHhkICogc2l6ZW9mKGRtYTY0ZGRfdCkpKTsKKwltZW1zZXQoKHZvaWQgKilkaS0+dHhkNjQsICdcMCcsIChkaS0+bnR4ZCAqIHNpemVvZihkbWE2NGRkX3QpKSk7CiAKIAkvKiBETUEgZW5naW5lIHdpdGggb3V0IGFsaWdubWVudCByZXF1aXJlbWVudCByZXF1aXJlcyB0YWJsZSB0byBiZSBpbml0ZWQKIAkgKiBiZWZvcmUgZW5hYmxpbmcgdGhlIGVuZ2luZQpAQCAtMjA2MCw3ICsyMDY0LDcgQEAKIAl3aGlsZSAoKHAgPSBkbWE2NF9nZXRuZXh0dHhwKGRpLCByYW5nZSkpKSB7CiAJCS8qIEZvciB1bmZyYW1lZCBkYXRhLCB3ZSBkb24ndCBoYXZlIGFueSBwYWNrZXRzIHRvIGZyZWUgKi8KIAkJaWYgKCEoZGktPmhuZGRtYS5kbWFjdHJsZmxhZ3MgJiBETUFfQ1RSTF9VTkZSQU1FRCkpCi0JCQlQS1RGUkVFKGRpLT5vc2gsIHAsIHRydWUpOworCQkJcGt0X2J1Zl9mcmVlX3NrYihkaS0+b3NoLCBwLCB0cnVlKTsKIAl9CiB9CiAKQEAgLTIzMDAsOSArMjMwNCwxMCBAQAogICogV0FSTklORzogY2FsbCBtdXN0IGNoZWNrIHRoZSByZXR1cm4gdmFsdWUgZm9yIGVycm9yLgogICogICB0aGUgZXJyb3IodG9zcyBmcmFtZXMpIGNvdWxkIGJlIGZhdGFsIGFuZCBjYXVzZSBtYW55IHN1YnNlcXVlbnQgaGFyZCB0byBkZWJ1ZyBwcm9ibGVtcwogICovCi1zdGF0aWMgaW50IEJDTUZBU1RQQVRIIGRtYTY0X3R4ZmFzdChkbWFfaW5mb190ICpkaSwgdm9pZCAqcDAsIGJvb2wgY29tbWl0KQorc3RhdGljIGludCBCQ01GQVNUUEFUSCBkbWE2NF90eGZhc3QoZG1hX2luZm9fdCAqZGksIHN0cnVjdCBza19idWZmICpwMCwKKwkJCQkgICAgYm9vbCBjb21taXQpCiB7Ci0Jdm9pZCAqcCwgKm5leHQ7CisJc3RydWN0IHNrX2J1ZmYgKnAsICpuZXh0OwogCXVuc2lnbmVkIGNoYXIgKmRhdGE7CiAJdWludCBsZW47CiAJdTE2IHR4b3V0OwpAQCAtMjMyMSwxMiArMjMyNiwxMiBAQAogCQl1aW50IG5zZWdzLCBqOwogCQlobmRkbWFfc2VnX21hcF90ICptYXA7CiAKLQkJZGF0YSA9IFBLVERBVEEocCk7Ci0JCWxlbiA9IFBLVExFTihwKTsKKwkJZGF0YSA9IHAtPmRhdGE7CisJCWxlbiA9IHAtPmxlbjsKICNpZmRlZiBCQ01fRE1BUEFECiAJCWxlbiArPSBQS1RETUFQQUQoZGktPm9zaCwgcCk7CiAjZW5kaWYJCQkJLyogQkNNX0RNQVBBRCAqLwotCQluZXh0ID0gUEtUTkVYVChwKTsKKwkJbmV4dCA9IHAtPm5leHQ7CiAKIAkJLyogcmV0dXJuIG5vbnplcm8gaWYgb3V0IG9mIHR4IGRlc2NyaXB0b3JzICovCiAJCWlmIChORVhUVFhEKHR4b3V0KSA9PSBkaS0+dHhpbikKQEAgLTIzMzcsNyArMjM0Miw4IEBACiAKIAkJLyogZ2V0IHBoeXNpY2FsIGFkZHJlc3Mgb2YgYnVmZmVyIHN0YXJ0ICovCiAJCWlmIChETUFTR0xJU1RfRU5BQikKLQkJCWJ6ZXJvKCZkaS0+dHhwX2RtYWhbdHhvdXRdLCBzaXplb2YoaG5kZG1hX3NlZ19tYXBfdCkpOworCQkJbWVtc2V0KCZkaS0+dHhwX2RtYWhbdHhvdXRdLCAwLAorCQkJCXNpemVvZihobmRkbWFfc2VnX21hcF90KSk7CiAKIAkJcGEgPSBETUFfTUFQKGRpLT5vc2gsIGRhdGEsIGxlbiwgRE1BX1RYLCBwLAogCQkJICAgICAmZGktPnR4cF9kbWFoW3R4b3V0XSk7CkBAIC0yNDA5LDcgKzI0MTUsNyBAQAogCiAgb3V0b2Z0eGQ6CiAJRE1BX0VSUk9SKCgiJXM6IGRtYV90eGZhc3Q6IG91dCBvZiB0eGRzICEhIVxuIiwgZGktPm5hbWUpKTsKLQlQS1RGUkVFKGRpLT5vc2gsIHAwLCB0cnVlKTsKKwlwa3RfYnVmX2ZyZWVfc2tiKGRpLT5vc2gsIHAwLCB0cnVlKTsKIAlkaS0+aG5kZG1hLnR4YXZhaWwgPSAwOwogCWRpLT5obmRkbWEudHhub2J1ZisrOwogCXJldHVybiAtMTsKQEAgLTI1NjMsNyArMjU2OSw3IEBACiAJcmV0dXJuIHJ4cDsKIH0KIAotc3RhdGljIGJvb2wgX2RtYTY0X2FkZHJleHQob3NsX3QgKm9zaCwgZG1hNjRyZWdzX3QgKiBkbWE2NHJlZ3MpCitzdGF0aWMgYm9vbCBfZG1hNjRfYWRkcmV4dChzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgZG1hNjRyZWdzX3QgKiBkbWE2NHJlZ3MpCiB7CiAJdTMyIHc7CiAJT1JfUkVHKG9zaCwgJmRtYTY0cmVncy0+Y29udHJvbCwgRDY0X1hDX0FFKTsKQEAgLTI2MzUsNyArMjY0MSw3IEBACiAJCWlmIChETUFTR0xJU1RfRU5BQikgewogCQkJYmNvcHkoJmRpLT50eHBfZG1haFtvbGRdLCAmZGktPnR4cF9kbWFoW25ld10sCiAJCQkgICAgICBzaXplb2YoaG5kZG1hX3NlZ19tYXBfdCkpOwotCQkJYnplcm8oJmRpLT50eHBfZG1haFtvbGRdLCBzaXplb2YoaG5kZG1hX3NlZ19tYXBfdCkpOworCQkJbWVtc2V0KCZkaS0+dHhwX2RtYWhbb2xkXSwgMCwgc2l6ZW9mKGhuZGRtYV9zZWdfbWFwX3QpKTsKIAkJfQogCiAJCWRpLT50eHBbb2xkXSA9IE5VTEw7CkBAIC0yNjU0LDcgKzI2NjAsNyBAQAogdWludCBkbWFfYWRkcndpZHRoKHNpX3QgKnNpaCwgdm9pZCAqZG1hcmVncykKIHsKIAlkbWEzMnJlZ3NfdCAqZG1hMzJyZWdzOwotCW9zbF90ICpvc2g7CisJc3RydWN0IG9zbF9pbmZvICpvc2g7CiAKIAlvc2ggPSBzaV9vc2goc2loKTsKIApAQCAtMjY2NCw4ICsyNjcwLDggQEAKIAkJLyogYmFja3BsYW5lIGFyZSA2NC1iaXQgY2FwYWJsZSAqLwogCQlpZiAoc2lfYmFja3BsYW5lNjQoc2loKSkKIAkJCS8qIElmIGJ1cyBpcyBTeXN0ZW0gQmFja3BsYW5lIG9yIFBDSUUgdGhlbiB3ZSBjYW4gYWNjZXNzIDY0LWJpdHMgKi8KLQkJCWlmICgoQlVTVFlQRShzaWgtPmJ1c3R5cGUpID09IFNJX0JVUykgfHwKLQkJCSAgICAoKEJVU1RZUEUoc2loLT5idXN0eXBlKSA9PSBQQ0lfQlVTKSAmJgorCQkJaWYgKChzaWgtPmJ1c3R5cGUgPT0gU0lfQlVTKSB8fAorCQkJICAgICgoc2loLT5idXN0eXBlID09IFBDSV9CVVMpICYmCiAJCQkgICAgIChzaWgtPmJ1c2NvcmV0eXBlID09IFBDSUVfQ09SRV9JRCkpKQogCQkJCXJldHVybiBETUFERFJXSURUSF82NDsKIApAQCAtMjY3OSw4ICsyNjg1LDggQEAKIAlkbWEzMnJlZ3MgPSAoZG1hMzJyZWdzX3QgKikgZG1hcmVnczsKIAogCS8qIEZvciBTeXN0ZW0gQmFja3BsYW5lLCBQQ0lFIGJ1cyBvciBhZGRyZXh0IGZlYXR1cmUsIDMyLWJpdHMgb2sgKi8KLQlpZiAoKEJVU1RZUEUoc2loLT5idXN0eXBlKSA9PSBTSV9CVVMpIHx8Ci0JICAgICgoQlVTVFlQRShzaWgtPmJ1c3R5cGUpID09IFBDSV9CVVMpCisJaWYgKChzaWgtPmJ1c3R5cGUgPT0gU0lfQlVTKSB8fAorCSAgICAoKHNpaC0+YnVzdHlwZSA9PSBQQ0lfQlVTKQogCSAgICAgJiYgc2loLT5idXNjb3JldHlwZSA9PSBQQ0lFX0NPUkVfSUQpCiAJICAgIHx8IChfZG1hMzJfYWRkcmV4dChvc2gsIGRtYTMycmVncykpKQogCQlyZXR1cm4gRE1BRERSV0lEVEhfMzI7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3V0aWwvaG5kcG11LmMgYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3V0aWwvaG5kcG11LmMKaW5kZXggYThmMzMwNi4uNmNjNTlhOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS91dGlsL2huZHBtdS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvdXRpbC9obmRwbXUuYwpAQCAtMTMsOSArMTMsMTQgQEAKICAqIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4KICAqIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCiAgKi8KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgotI2luY2x1ZGUgPGxpbnV4dmVyLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaWZkZWYgQlJDTV9GVUxMTUFDCisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjZW5kaWYKICNpbmNsdWRlIDxiY21kZWZzLmg+CiAjaW5jbHVkZSA8b3NsLmg+CiAjaW5jbHVkZSA8YmNtdXRpbHMuaD4KQEAgLTQwLDIzICs0NSwyMyBAQAogI2RlZmluZQlQTVVfTk9ORShhcmdzKQogCiAvKiBQTEwgY29udHJvbHMvY2xvY2tzICovCi1zdGF0aWMgdm9pZCBzaV9wbXUxX3BsbGluaXQwKHNpX3QgKnNpaCwgb3NsX3QgKm9zaCwgY2hpcGNyZWdzX3QgKmNjLAorc3RhdGljIHZvaWQgc2lfcG11MV9wbGxpbml0MChzaV90ICpzaWgsIHN0cnVjdCBvc2xfaW5mbyAqb3NoLCBjaGlwY3JlZ3NfdCAqY2MsCiAJCQkgICAgIHUzMiB4dGFsKTsKLXN0YXRpYyB1MzIgc2lfcG11MV9jcHVjbGswKHNpX3QgKnNpaCwgb3NsX3QgKm9zaCwgY2hpcGNyZWdzX3QgKmNjKTsKLXN0YXRpYyB1MzIgc2lfcG11MV9hbHBjbGswKHNpX3QgKnNpaCwgb3NsX3QgKm9zaCwgY2hpcGNyZWdzX3QgKmNjKTsKK3N0YXRpYyB1MzIgc2lfcG11MV9jcHVjbGswKHNpX3QgKnNpaCwgc3RydWN0IG9zbF9pbmZvICpvc2gsIGNoaXBjcmVnc190ICpjYyk7CitzdGF0aWMgdTMyIHNpX3BtdTFfYWxwY2xrMChzaV90ICpzaWgsIHN0cnVjdCBvc2xfaW5mbyAqb3NoLCBjaGlwY3JlZ3NfdCAqY2MpOwogCiAvKiBQTVUgcmVzb3VyY2VzICovCiBzdGF0aWMgYm9vbCBzaV9wbXVfcmVzX2RlcGZsdHJfYmIoc2lfdCAqc2loKTsKIHN0YXRpYyBib29sIHNpX3BtdV9yZXNfZGVwZmx0cl9uY2Ioc2lfdCAqc2loKTsKIHN0YXRpYyBib29sIHNpX3BtdV9yZXNfZGVwZmx0cl9wYWxkbyhzaV90ICpzaWgpOwogc3RhdGljIGJvb2wgc2lfcG11X3Jlc19kZXBmbHRyX25wYWxkbyhzaV90ICpzaWgpOwotc3RhdGljIHUzMiBzaV9wbXVfcmVzX2RlcHMoc2lfdCAqc2loLCBvc2xfdCAqb3NoLCBjaGlwY3JlZ3NfdCAqY2MsCitzdGF0aWMgdTMyIHNpX3BtdV9yZXNfZGVwcyhzaV90ICpzaWgsIHN0cnVjdCBvc2xfaW5mbyAqb3NoLCBjaGlwY3JlZ3NfdCAqY2MsCiAJCQkgICAgICB1MzIgcnNyY3MsIGJvb2wgYWxsKTsKLXN0YXRpYyB1aW50IHNpX3BtdV9yZXNfdXB0aW1lKHNpX3QgKnNpaCwgb3NsX3QgKm9zaCwgY2hpcGNyZWdzX3QgKmNjLAorc3RhdGljIHVpbnQgc2lfcG11X3Jlc191cHRpbWUoc2lfdCAqc2loLCBzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgY2hpcGNyZWdzX3QgKmNjLAogCQkJICAgICAgdTggcnNyYyk7CiBzdGF0aWMgdm9pZCBzaV9wbXVfcmVzX21hc2tzKHNpX3QgKnNpaCwgdTMyICogcG1pbiwgdTMyICogcG1heCk7CiBzdGF0aWMgdm9pZCBzaV9wbXVfc3B1cmF2b2lkX3BsbHVwZGF0ZShzaV90ICpzaWgsIGNoaXBjcmVnc190ICpjYywKLQkJCQkgICAgICAgb3NsX3QgKm9zaCwgdTggc3B1cmF2b2lkKTsKKwkJCQkgICAgICAgc3RydWN0IG9zbF9pbmZvICpvc2gsIHU4IHNwdXJhdm9pZCk7CiAKIHN0YXRpYyB2b2lkIHNpX3BtdV9zZXRfNDMzMF9wbGxkaXZzKHNpX3QgKnNpaCk7CiAKQEAgLTEwMSw3ICsxMDYsNyBAQAogfQogCiAvKiBTZXR1cCBzd2l0Y2hlciB2b2x0YWdlICovCi12b2lkIHNpX3BtdV9zZXRfc3dpdGNoZXJfdm9sdGFnZShzaV90ICpzaWgsIG9zbF90ICpvc2gsIHU4IGJiX3ZvbHRhZ2UsCit2b2lkIHNpX3BtdV9zZXRfc3dpdGNoZXJfdm9sdGFnZShzaV90ICpzaWgsIHN0cnVjdCBvc2xfaW5mbyAqb3NoLCB1OCBiYl92b2x0YWdlLAogCQkJCSB1OCByZl92b2x0YWdlKQogewogCWNoaXBjcmVnc190ICpjYzsKQEAgLTEyNCwxNCArMTI5LDE0IEBACiAJc2lfc2V0Y29yZWlkeChzaWgsIG9yaWdpZHgpOwogfQogCi12b2lkIHNpX3BtdV9zZXRfbGRvX3ZvbHRhZ2Uoc2lfdCAqc2loLCBvc2xfdCAqb3NoLCB1OCBsZG8sIHU4IHZvbHRhZ2UpCit2b2lkIHNpX3BtdV9zZXRfbGRvX3ZvbHRhZ2Uoc2lfdCAqc2loLCBzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgdTggbGRvLCB1OCB2b2x0YWdlKQogewogCXU4IHNyX2NudGxfc2hpZnQgPSAwLCByY19zaGlmdCA9IDAsIHNoaWZ0ID0gMCwgbWFzayA9IDA7CiAJdTggYWRkciA9IDA7CiAKIAlBU1NFUlQoc2loLT5jY2NhcHMgJiBDQ19DQVBfUE1VKTsKIAotCXN3aXRjaCAoQ0hJUElEKHNpaC0+Y2hpcCkpIHsKKwlzd2l0Y2ggKHNpaC0+Y2hpcCkgewogCWNhc2UgQkNNNDMzNl9DSElQX0lEOgogCQlzd2l0Y2ggKGxkbykgewogCQljYXNlIFNFVF9MRE9fVk9MVEFHRV9DTERPX1BXTToKQEAgLTE4Miw3ICsxODcsNyBAQAogLyogZDExIHNsb3cgdG8gZmFzdCBjbG9jayB0cmFuc2l0aW9uIHRpbWUgaW4gc2xvdyBjbG9jayBjeWNsZXMgKi8KICNkZWZpbmUgRDExU0NDX1NMT1cyRkFTVF9UUkFOU0lUSU9OCTIKIAotdTE2IHNpX3BtdV9mYXN0X3B3cnVwX2RlbGF5KHNpX3QgKnNpaCwgb3NsX3QgKm9zaCkKK3UxNiBzaV9wbXVfZmFzdF9wd3J1cF9kZWxheShzaV90ICpzaWgsIHN0cnVjdCBvc2xfaW5mbyAqb3NoKQogewogCXVpbnQgZGVsYXkgPSBQTVVfTUFYX1RSQU5TSVRJT05fRExZOwogCWNoaXBjcmVnc190ICpjYzsKQEAgLTE5OSw3ICsyMDQsNyBAQAogCWNjID0gc2lfc2V0Y29yZWlkeChzaWgsIFNJX0NDX0lEWCk7CiAJQVNTRVJUKGNjICE9IE5VTEwpOwogCi0Jc3dpdGNoIChDSElQSUQoc2loLT5jaGlwKSkgeworCXN3aXRjaCAoc2loLT5jaGlwKSB7CiAJY2FzZSBCQ000MzIyNF9DSElQX0lEOgogCWNhc2UgQkNNNDMyMjVfQ0hJUF9JRDoKIAljYXNlIEJDTTQzNDIxX0NISVBfSUQ6CkBAIC0yNTksNyArMjY0LDcgQEAKIAlyZXR1cm4gKHUxNikgZGVsYXk7CiB9CiAKLXUzMiBzaV9wbXVfZm9yY2VfaWxwKHNpX3QgKnNpaCwgb3NsX3QgKm9zaCwgYm9vbCBmb3JjZSkKK3UzMiBzaV9wbXVfZm9yY2VfaWxwKHNpX3QgKnNpaCwgc3RydWN0IG9zbF9pbmZvICpvc2gsIGJvb2wgZm9yY2UpCiB7CiAJY2hpcGNyZWdzX3QgKmNjOwogCXVpbnQgb3JpZ2lkeDsKQEAgLTU5OSw3ICs2MDQsNyBAQAogCXJzcmNzID0gKHNpaC0+cG11Y2FwcyAmIFBDQVBfUkNfTUFTSykgPj4gUENBUF9SQ19TSElGVDsKIAogCS8qIGRldGVybWluZSBtaW4vbWF4IHJzcmMgbWFza3MgKi8KLQlzd2l0Y2ggKENISVBJRChzaWgtPmNoaXApKSB7CisJc3dpdGNoIChzaWgtPmNoaXApIHsKIAljYXNlIEJDTTQzMjI0X0NISVBfSUQ6CiAJY2FzZSBCQ000MzIyNV9DSElQX0lEOgogCWNhc2UgQkNNNDM0MjFfQ0hJUF9JRDoKQEAgLTY3Nyw3ICs2ODIsNyBAQAogfQogCiAvKiBpbml0aWFsaXplIFBNVSByZXNvdXJjZXMgKi8KLXZvaWQgc2lfcG11X3Jlc19pbml0KHNpX3QgKnNpaCwgb3NsX3QgKm9zaCkKK3ZvaWQgc2lfcG11X3Jlc19pbml0KHNpX3QgKnNpaCwgc3RydWN0IG9zbF9pbmZvICpvc2gpCiB7CiAJY2hpcGNyZWdzX3QgKmNjOwogCXVpbnQgb3JpZ2lkeDsKQEAgLTY5Niw3ICs3MDEsNyBAQAogCWNjID0gc2lfc2V0Y29yZWlkeChzaWgsIFNJX0NDX0lEWCk7CiAJQVNTRVJUKGNjICE9IE5VTEwpOwogCi0Jc3dpdGNoIChDSElQSUQoc2loLT5jaGlwKSkgeworCXN3aXRjaCAoc2loLT5jaGlwKSB7CiAJY2FzZSBCQ000MzI5X0NISVBfSUQ6CiAJCS8qIE9wdGltaXplIHJlc291cmNlcyB1cC9kb3duIHRpbWVycyAqLwogCQlpZiAoSVNTSU1fRU5BQihzaWgpKSB7CkBAIC0xMDk1LDcgKzExMDAsNyBAQAogI2lmZGVmIEJDTURCRwogCWNoYXIgY2huWzhdOwogI2VuZGlmCi0Jc3dpdGNoIChDSElQSUQoc2loLT5jaGlwKSkgeworCXN3aXRjaCAoc2loLT5jaGlwKSB7CiAJY2FzZSBCQ000MzI5X0NISVBfSUQ6CiAJCXJldHVybiBwbXUxX3h0YWx0YWIwXzg4MF80MzI5OwogCWNhc2UgQkNNNDMxOV9DSElQX0lEOgpAQCAtMTEyMyw3ICsxMTI4LDcgQEAKIAljaGFyIGNobls4XTsKICNlbmRpZgogCi0Jc3dpdGNoIChDSElQSUQoc2loLT5jaGlwKSkgeworCXN3aXRjaCAoc2loLT5jaGlwKSB7CiAJY2FzZSBCQ000MzI5X0NISVBfSUQ6CiAJCS8qIERlZmF1bHQgdG8gMzg0MDBLaHogKi8KIAkJcmV0dXJuICZwbXUxX3h0YWx0YWIwXzg4MF80MzI5W1BNVTFfWFRBTFRBQjBfODgwXzM4NDAwS107CkBAIC0xMTU1LDcgKzExNjAsNyBAQAogCWNoYXIgY2huWzhdOwogI2VuZGlmCiAKLQlzd2l0Y2ggKENISVBJRChzaWgtPmNoaXApKSB7CisJc3dpdGNoIChzaWgtPmNoaXApIHsKIAljYXNlIEJDTTQzMjlfQ0hJUF9JRDoKIAkJcmV0dXJuIEZWQ09fODgwOwogCWNhc2UgQkNNNDMxOV9DSElQX0lEOgpAQCAtMTE3OCw3ICsxMTgzLDcgQEAKIAogLyogcXVlcnkgYWxwL3h0YWwgY2xvY2sgZnJlcXVlbmN5ICovCiBzdGF0aWMgdTMyCi1zaV9wbXUxX2FscGNsazAoc2lfdCAqc2loLCBvc2xfdCAqb3NoLCBjaGlwY3JlZ3NfdCAqY2MpCitzaV9wbXUxX2FscGNsazAoc2lfdCAqc2loLCBzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgY2hpcGNyZWdzX3QgKmNjKQogewogCWNvbnN0IHBtdTFfeHRhbHRhYjBfdCAqeHQ7CiAJdTMyIHhmOwpAQCAtMTIwMyw3ICsxMjA4LDggQEAKICAqIGNhc2UgdGhlIHh0YWwgZnJlcXVlbmN5IGlzIHVua25vd24gdG8gdGhlIHMvdyBzbyB3ZSBuZWVkIHRvIGNhbGwKICAqIHNpX3BtdTFfeHRhbGRlZjAoKSB3aGVyZXZlciBpdCBpcyBuZWVkZWQgdG8gcmV0dXJuIGEgZGVmYXVsdCB2YWx1ZS4KICAqLwotc3RhdGljIHZvaWQgc2lfcG11MV9wbGxpbml0MChzaV90ICpzaWgsIG9zbF90ICpvc2gsIGNoaXBjcmVnc190ICpjYywgdTMyIHh0YWwpCitzdGF0aWMgdm9pZCBzaV9wbXUxX3BsbGluaXQwKHNpX3QgKnNpaCwgc3RydWN0IG9zbF9pbmZvICpvc2gsIGNoaXBjcmVnc190ICpjYywKKwkJCSAgICAgdTMyIHh0YWwpCiB7CiAJY29uc3QgcG11MV94dGFsdGFiMF90ICp4dDsKIAl1MzIgdG1wOwpAQCAtMTIzMyw4ICsxMjM5LDggQEAKIAkgKi8KIAlpZiAoKCgoUl9SRUcob3NoLCAmY2MtPnBtdWNvbnRyb2wpICYgUENUTF9YVEFMRlJFUV9NQVNLKSA+PgogCSAgICAgIFBDVExfWFRBTEZSRVFfU0hJRlQpID09IHh0LT54ZikgJiYKLQkgICAgISgoQ0hJUElEKHNpaC0+Y2hpcCkgPT0gQkNNNDMxOV9DSElQX0lEKQotCSAgICAgIHx8IChDSElQSUQoc2loLT5jaGlwKSA9PSBCQ000MzMwX0NISVBfSUQpKSkgeworCSAgICAhKChzaWgtPmNoaXAgPT0gQkNNNDMxOV9DSElQX0lEKQorCSAgICAgIHx8IChzaWgtPmNoaXAgPT0gQkNNNDMzMF9DSElQX0lEKSkpIHsKIAkJUE1VX01TRygoIlBMTCBhbHJlYWR5IHByb2dyYW1tZWQgZm9yICVkLiVkIE1IelxuIiwKIAkJCSB4dC0+ZnJlZiAvIDEwMDAsIHh0LT5mcmVmICUgMTAwMCkpOwogCQlyZXR1cm47CkBAIC0xMjQ0LDcgKzEyNTAsNyBAQAogCVBNVV9NU0coKCJQcm9ncmFtbWluZyBQTEwgZm9yICVkLiVkIE1IelxuIiwgeHQtPmZyZWYgLyAxMDAwLAogCQkgeHQtPmZyZWYgJSAxMDAwKSk7CiAKLQlzd2l0Y2ggKENISVBJRChzaWgtPmNoaXApKSB7CisJc3dpdGNoIChzaWgtPmNoaXApIHsKIAljYXNlIEJDTTQzMjlfQ0hJUF9JRDoKIAkJLyogQ2hhbmdlIHRoZSBCQlBMTCBkcml2ZSBzdHJlbmd0aCB0byA4IGZvciBhbGwgY2hhbm5lbHMgKi8KIAkJYnVmX3N0cmVuZ3RoID0gMHg4ODg4ODg7CkBAIC0xMzUxLDExICsxMzU3LDExIEBACiAJICAgICAgcDJkaXYgPDwgUE1VMV9QTEwwX1BDMF9QMkRJVl9TSElGVCkgJiBQTVUxX1BMTDBfUEMwX1AyRElWX01BU0spOwogCVdfUkVHKG9zaCwgJmNjLT5wbGxjb250cm9sX2RhdGEsIHRtcCk7CiAKLQlpZiAoKENISVBJRChzaWgtPmNoaXApID09IEJDTTQzMzBfQ0hJUF9JRCkpCisJaWYgKChzaWgtPmNoaXAgPT0gQkNNNDMzMF9DSElQX0lEKSkKIAkJc2lfcG11X3NldF80MzMwX3BsbGRpdnMoc2loKTsKIAotCWlmICgoQ0hJUElEKHNpaC0+Y2hpcCkgPT0gQkNNNDMyOV9DSElQX0lEKQotCSAgICAmJiAoQ0hJUFJFVihzaWgtPmNoaXByZXYpID09IDApKSB7CisJaWYgKChzaWgtPmNoaXAgPT0gQkNNNDMyOV9DSElQX0lEKQorCSAgICAmJiAoc2loLT5jaGlwcmV2ID09IDApKSB7CiAKIAkJV19SRUcob3NoLCAmY2MtPnBsbGNvbnRyb2xfYWRkciwgUE1VMV9QTEwwX1BMTENUTDEpOwogCQl0bXAgPSBSX1JFRyhvc2gsICZjYy0+cGxsY29udHJvbF9kYXRhKTsKQEAgLTEzNjMsOSArMTM2OSw5IEBACiAJCXRtcCA9IHRtcCB8IERPVDExTUFDXzg4ME1IWl9DTEtfRElWSVNPUl9WQUw7CiAJCVdfUkVHKG9zaCwgJmNjLT5wbGxjb250cm9sX2RhdGEsIHRtcCk7CiAJfQotCWlmICgoQ0hJUElEKHNpaC0+Y2hpcCkgPT0gQkNNNDMxOV9DSElQX0lEKSB8fAotCSAgICAoQ0hJUElEKHNpaC0+Y2hpcCkgPT0gQkNNNDMzNl9DSElQX0lEKSB8fAotCSAgICAoQ0hJUElEKHNpaC0+Y2hpcCkgPT0gQkNNNDMzMF9DSElQX0lEKSkKKwlpZiAoKHNpaC0+Y2hpcCA9PSBCQ000MzE5X0NISVBfSUQpIHx8CisJICAgIChzaWgtPmNoaXAgPT0gQkNNNDMzNl9DSElQX0lEKSB8fAorCSAgICAoc2loLT5jaGlwID09IEJDTTQzMzBfQ0hJUF9JRCkpCiAJCW5kaXZfbW9kZSA9IFBNVTFfUExMMF9QQzJfTkRJVl9NT0RFX01GQjsKIAllbHNlCiAJCW5kaXZfbW9kZSA9IFBNVTFfUExMMF9QQzJfTkRJVl9NT0RFX01BU0g7CkBAIC0xNDA3LDcgKzE0MTMsNyBAQAogCS8qIHRvIG9wZXJhdGUgdGhlIDQzMTkgdXNiIGluIDI0TUh6LzQ4TUh6OyBjaGlwY29udHJvbFsyXVs4NDo4M10gbmVlZHMKIAkgKiB0byBiZSB1cGRhdGVkLgogCSAqLwotCWlmICgoQ0hJUElEKHNpaC0+Y2hpcCkgPT0gQkNNNDMxOV9DSElQX0lEKQorCWlmICgoc2loLT5jaGlwID09IEJDTTQzMTlfQ0hJUF9JRCkKIAkgICAgJiYgKHh0LT5mcmVmICE9IFhUQUxfRlJFUV8zMDAwME1IWikpIHsKIAkJV19SRUcob3NoLCAmY2MtPmNoaXBjb250cm9sX2FkZHIsIFBNVTFfUExMMF9DSElQQ1RMMik7CiAJCXRtcCA9CkBAIC0xNDM2LDggKzE0NDIsOCBAQAogCQlQQ1RMX0lMUF9ESVZfTUFTSykgfAogCSAgICAoKHh0LT54ZiA8PCBQQ1RMX1hUQUxGUkVRX1NISUZUKSAmIFBDVExfWFRBTEZSRVFfTUFTSyk7CiAKLQlpZiAoKENISVBJRChzaWgtPmNoaXApID09IEJDTTQzMjlfQ0hJUF9JRCkKLQkgICAgJiYgQ0hJUFJFVihzaWgtPmNoaXByZXYpID09IDApIHsKKwlpZiAoKHNpaC0+Y2hpcCA9PSBCQ000MzI5X0NISVBfSUQpCisJICAgICYmIHNpaC0+Y2hpcHJldiA9PSAwKSB7CiAJCS8qIGNsZWFyIHRoZSBodHN0cmV0Y2ggYmVmb3JlIGNsZWFyaW5nIEhUUmVxRW4gKi8KIAkJQU5EX1JFRyhvc2gsICZjYy0+Y2xrc3RyZXRjaCwgfkNTVFJFVENIX0hUKTsKIAkJdG1wICY9IH5QQ1RMX0hUX1JFUV9FTjsKQEAgLTE0NDgsNyArMTQ1NCw3IEBACiAKIC8qIHF1ZXJ5IHRoZSBDUFUgY2xvY2sgZnJlcXVlbmN5ICovCiBzdGF0aWMgdTMyCi1zaV9wbXUxX2NwdWNsazAoc2lfdCAqc2loLCBvc2xfdCAqb3NoLCBjaGlwY3JlZ3NfdCAqY2MpCitzaV9wbXUxX2NwdWNsazAoc2lfdCAqc2loLCBzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgY2hpcGNyZWdzX3QgKmNjKQogewogCXUzMiB0bXAsIG0xZGl2OwogI2lmZGVmIEJDTURCRwpAQCAtMTUwMiw3ICsxNTA4LDcgQEAKIH0KIAogLyogaW5pdGlhbGl6ZSBQTEwgKi8KLXZvaWQgc2lfcG11X3BsbF9pbml0KHNpX3QgKnNpaCwgb3NsX3QgKm9zaCwgdWludCB4dGFsZnJlcSkKK3ZvaWQgc2lfcG11X3BsbF9pbml0KHNpX3QgKnNpaCwgc3RydWN0IG9zbF9pbmZvICpvc2gsIHVpbnQgeHRhbGZyZXEpCiB7CiAJY2hpcGNyZWdzX3QgKmNjOwogCXVpbnQgb3JpZ2lkeDsKQEAgLTE1MTcsNyArMTUyMyw3IEBACiAJY2MgPSBzaV9zZXRjb3JlaWR4KHNpaCwgU0lfQ0NfSURYKTsKIAlBU1NFUlQoY2MgIT0gTlVMTCk7CiAKLQlzd2l0Y2ggKENISVBJRChzaWgtPmNoaXApKSB7CisJc3dpdGNoIChzaWgtPmNoaXApIHsKIAljYXNlIEJDTTQzMjlfQ0hJUF9JRDoKIAkJaWYgKHh0YWxmcmVxID09IDApCiAJCQl4dGFsZnJlcSA9IDM4NDAwOwpAQCAtMTU1NSw3ICsxNTYxLDcgQEAKIH0KIAogLyogcXVlcnkgYWxwL3h0YWwgY2xvY2sgZnJlcXVlbmN5ICovCi11MzIgc2lfcG11X2FscF9jbG9jayhzaV90ICpzaWgsIG9zbF90ICpvc2gpCit1MzIgc2lfcG11X2FscF9jbG9jayhzaV90ICpzaWgsIHN0cnVjdCBvc2xfaW5mbyAqb3NoKQogewogCWNoaXBjcmVnc190ICpjYzsKIAl1aW50IG9yaWdpZHg7CkBAIC0xNTcxLDcgKzE1NzcsNyBAQAogCWNjID0gc2lfc2V0Y29yZWlkeChzaWgsIFNJX0NDX0lEWCk7CiAJQVNTRVJUKGNjICE9IE5VTEwpOwogCi0Jc3dpdGNoIChDSElQSUQoc2loLT5jaGlwKSkgeworCXN3aXRjaCAoc2loLT5jaGlwKSB7CiAJY2FzZSBCQ000MzIyNF9DSElQX0lEOgogCWNhc2UgQkNNNDMyMjVfQ0hJUF9JRDoKIAljYXNlIEJDTTQzNDIxX0NISVBfSUQ6CkBAIC0xNjE2LDcgKzE2MjIsNyBAQAogICogcGxscmVnICJwbGwwIiBpLmUuIDEyIGZvciBtYWluIDYgZm9yIHBoeSwgMCBmb3IgbWlzYy4KICAqLwogc3RhdGljIHUzMgotc2lfcG11NV9jbG9jayhzaV90ICpzaWgsIG9zbF90ICpvc2gsIGNoaXBjcmVnc190ICpjYywgdWludCBwbGwwLAorc2lfcG11NV9jbG9jayhzaV90ICpzaWgsIHN0cnVjdCBvc2xfaW5mbyAqb3NoLCBjaGlwY3JlZ3NfdCAqY2MsIHVpbnQgcGxsMCwKIAkJCSAgdWludCBtKSB7CiAJdTMyIHRtcCwgZGl2LCBuZGl2LCBwMSwgcDIsIGZjOwogCkBAIC0xNjMxLDcgKzE2MzcsNyBAQAogCQlyZXR1cm4gMDsKIAl9CiAKLQlpZiAoQ0hJUElEKHNpaC0+Y2hpcCkgPT0gQkNNNTM1N19DSElQX0lEKSB7CisJaWYgKHNpaC0+Y2hpcCA9PSBCQ001MzU3X0NISVBfSUQpIHsKIAkJLyogRGV0ZWN0IGZhaWx1cmUgaW4gY2xvY2sgc2V0dGluZyAqLwogCQlpZiAoKFJfUkVHKG9zaCwgJmNjLT5jaGlwc3RhdHVzKSAmIDB4NDAwMDApICE9IDApIHsKIAkJCXJldHVybiAxMzMgKiAxMDAwMDAwOwpAQCAtMTY2OSw3ICsxNjc1LDcgQEAKIC8qIEZvciBkZXNpZ25zIHRoYXQgZmVlZCB0aGUgc2FtZSBjbG9jayB0byBib3RoIGJhY2twbGFuZQogICogYW5kIENQVSBqdXN0IHJldHVybiB0aGUgQ1BVIGNsb2NrIHNwZWVkLgogICovCi11MzIgc2lfcG11X3NpX2Nsb2NrKHNpX3QgKnNpaCwgb3NsX3QgKm9zaCkKK3UzMiBzaV9wbXVfc2lfY2xvY2soc2lfdCAqc2loLCBzdHJ1Y3Qgb3NsX2luZm8gKm9zaCkKIHsKIAljaGlwY3JlZ3NfdCAqY2M7CiAJdWludCBvcmlnaWR4OwpAQCAtMTY4NSw3ICsxNjkxLDcgQEAKIAljYyA9IHNpX3NldGNvcmVpZHgoc2loLCBTSV9DQ19JRFgpOwogCUFTU0VSVChjYyAhPSBOVUxMKTsKIAotCXN3aXRjaCAoQ0hJUElEKHNpaC0+Y2hpcCkpIHsKKwlzd2l0Y2ggKHNpaC0+Y2hpcCkgewogCWNhc2UgQkNNNDMyMjRfQ0hJUF9JRDoKIAljYXNlIEJDTTQzMjI1X0NISVBfSUQ6CiAJY2FzZSBCQ000MzQyMV9DSElQX0lEOgpAQCAtMTcwMiw3ICsxNzA4LDcgQEAKIAkJCQkgIFBNVTVfTUFJTlBMTF9TSSk7CiAJCWJyZWFrOwogCWNhc2UgQkNNNDMyOV9DSElQX0lEOgotCQlpZiAoQ0hJUFJFVihzaWgtPmNoaXByZXYpID09IDApCisJCWlmIChzaWgtPmNoaXByZXYgPT0gMCkKIAkJCWNsb2NrID0gMzg0MDAgKiAxMDAwOwogCQllbHNlCiAJCQljbG9jayA9IHNpX3BtdTFfY3B1Y2xrMChzaWgsIG9zaCwgY2MpOwpAQCAtMTc0OCw3ICsxNzU0LDcgQEAKIH0KIAogLyogcXVlcnkgQ1BVIGNsb2NrIGZyZXF1ZW5jeSAqLwotdTMyIHNpX3BtdV9jcHVfY2xvY2soc2lfdCAqc2loLCBvc2xfdCAqb3NoKQordTMyIHNpX3BtdV9jcHVfY2xvY2soc2lfdCAqc2loLCBzdHJ1Y3Qgb3NsX2luZm8gKm9zaCkKIHsKIAljaGlwY3JlZ3NfdCAqY2M7CiAJdWludCBvcmlnaWR4OwpAQCAtMTc1NywxNCArMTc2MywxNCBAQAogCUFTU0VSVChzaWgtPmNjY2FwcyAmIENDX0NBUF9QTVUpOwogCiAJaWYgKChzaWgtPnBtdXJldiA+PSA1KSAmJgotCSAgICAhKChDSElQSUQoc2loLT5jaGlwKSA9PSBCQ000MzI5X0NISVBfSUQpIHx8Ci0JICAgICAgKENISVBJRChzaWgtPmNoaXApID09IEJDTTQzMTlfQ0hJUF9JRCkgfHwKLQkgICAgICAoQ0hJUElEKHNpaC0+Y2hpcCkgPT0gQkNNNDMyMzZfQ0hJUF9JRCkgfHwKLQkgICAgICAoQ0hJUElEKHNpaC0+Y2hpcCkgPT0gQkNNNDMzNl9DSElQX0lEKSB8fAotCSAgICAgIChDSElQSUQoc2loLT5jaGlwKSA9PSBCQ000MzMwX0NISVBfSUQpKSkgeworCSAgICAhKChzaWgtPmNoaXAgPT0gQkNNNDMyOV9DSElQX0lEKSB8fAorCSAgICAgIChzaWgtPmNoaXAgPT0gQkNNNDMxOV9DSElQX0lEKSB8fAorCSAgICAgIChzaWgtPmNoaXAgPT0gQkNNNDMyMzZfQ0hJUF9JRCkgfHwKKwkgICAgICAoc2loLT5jaGlwID09IEJDTTQzMzZfQ0hJUF9JRCkgfHwKKwkgICAgICAoc2loLT5jaGlwID09IEJDTTQzMzBfQ0hJUF9JRCkpKSB7CiAJCXVpbnQgcGxsOwogCi0JCXN3aXRjaCAoQ0hJUElEKHNpaC0+Y2hpcCkpIHsKKwkJc3dpdGNoIChzaWgtPmNoaXApIHsKIAkJY2FzZSBCQ001MzU2X0NISVBfSUQ6CiAJCQlwbGwgPSBQTVU1MzU2X01BSU5QTExfUExMMDsKIAkJCWJyZWFrOwpAQCAtMTc5Miw3ICsxNzk4LDcgQEAKIH0KIAogLyogcXVlcnkgbWVtb3J5IGNsb2NrIGZyZXF1ZW5jeSAqLwotdTMyIHNpX3BtdV9tZW1fY2xvY2soc2lfdCAqc2loLCBvc2xfdCAqb3NoKQordTMyIHNpX3BtdV9tZW1fY2xvY2soc2lfdCAqc2loLCBzdHJ1Y3Qgb3NsX2luZm8gKm9zaCkKIHsKIAljaGlwY3JlZ3NfdCAqY2M7CiAJdWludCBvcmlnaWR4OwpAQCAtMTgwMSwxNCArMTgwNywxNCBAQAogCUFTU0VSVChzaWgtPmNjY2FwcyAmIENDX0NBUF9QTVUpOwogCiAJaWYgKChzaWgtPnBtdXJldiA+PSA1KSAmJgotCSAgICAhKChDSElQSUQoc2loLT5jaGlwKSA9PSBCQ000MzI5X0NISVBfSUQpIHx8Ci0JICAgICAgKENISVBJRChzaWgtPmNoaXApID09IEJDTTQzMTlfQ0hJUF9JRCkgfHwKLQkgICAgICAoQ0hJUElEKHNpaC0+Y2hpcCkgPT0gQkNNNDMzMF9DSElQX0lEKSB8fAotCSAgICAgIChDSElQSUQoc2loLT5jaGlwKSA9PSBCQ000MzM2X0NISVBfSUQpIHx8Ci0JICAgICAgKENISVBJRChzaWgtPmNoaXApID09IEJDTTQzMjM2X0NISVBfSUQpKSkgeworCSAgICAhKChzaWgtPmNoaXAgPT0gQkNNNDMyOV9DSElQX0lEKSB8fAorCSAgICAgIChzaWgtPmNoaXAgPT0gQkNNNDMxOV9DSElQX0lEKSB8fAorCSAgICAgIChzaWgtPmNoaXAgPT0gQkNNNDMzMF9DSElQX0lEKSB8fAorCSAgICAgIChzaWgtPmNoaXAgPT0gQkNNNDMzNl9DSElQX0lEKSB8fAorCSAgICAgIChzaWgtPmNoaXAgPT0gQkNNNDMyMzZfQ0hJUF9JRCkpKSB7CiAJCXVpbnQgcGxsOwogCi0JCXN3aXRjaCAoQ0hJUElEKHNpaC0+Y2hpcCkpIHsKKwkJc3dpdGNoIChzaWgtPmNoaXApIHsKIAkJY2FzZSBCQ001MzU2X0NISVBfSUQ6CiAJCQlwbGwgPSBQTVU1MzU2X01BSU5QTExfUExMMDsKIAkJCWJyZWFrOwpAQCAtMTg0MSw3ICsxODQ3LDcgQEAKIAogc3RhdGljIHUzMiBpbHBjeWNsZXNfcGVyX3NlYzsKIAotdTMyIHNpX3BtdV9pbHBfY2xvY2soc2lfdCAqc2loLCBvc2xfdCAqb3NoKQordTMyIHNpX3BtdV9pbHBfY2xvY2soc2lfdCAqc2loLCBzdHJ1Y3Qgb3NsX2luZm8gKm9zaCkKIHsKIAlpZiAoSVNTSU1fRU5BQihzaWgpKQogCQlyZXR1cm4gSUxQX0NMT0NLOwpAQCAtMTkwNSw3ICsxOTExLDcgQEAKICNkZWZpbmUgU0RJT0RfRFJWU1RSX0tFWShjaGlwLCBwbXUpCSgoKGNoaXApIDw8IDE2KSB8IChwbXUpKQogCiB2b2lkCi1zaV9zZGlvZF9kcml2ZV9zdHJlbmd0aF9pbml0KHNpX3QgKnNpaCwgb3NsX3QgKm9zaCwKK3NpX3NkaW9kX2RyaXZlX3N0cmVuZ3RoX2luaXQoc2lfdCAqc2loLCBzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwKIAkJCQkJIHUzMiBkcml2ZXN0cmVuZ3RoKSB7CiAJY2hpcGNyZWdzX3QgKmNjOwogCXVpbnQgb3JpZ2lkeCwgaW50cl92YWwgPSAwOwpAQCAtMTk3Niw3ICsxOTgyLDcgQEAKIH0KIAogLyogaW5pdGlhbGl6ZSBQTVUgKi8KLXZvaWQgc2lfcG11X2luaXQoc2lfdCAqc2loLCBvc2xfdCAqb3NoKQordm9pZCBzaV9wbXVfaW5pdChzaV90ICpzaWgsIHN0cnVjdCBvc2xfaW5mbyAqb3NoKQogewogCWNoaXBjcmVnc190ICpjYzsKIAl1aW50IG9yaWdpZHg7CkBAIC0xOTkzLDcgKzE5OTksNyBAQAogCWVsc2UgaWYgKHNpaC0+cG11cmV2ID49IDIpCiAJCU9SX1JFRyhvc2gsICZjYy0+cG11Y29udHJvbCwgUENUTF9OT0lMUF9PTl9XQUlUKTsKIAotCWlmICgoQ0hJUElEKHNpaC0+Y2hpcCkgPT0gQkNNNDMyOV9DSElQX0lEKSAmJiAoc2loLT5jaGlwcmV2ID09IDIpKSB7CisJaWYgKChzaWgtPmNoaXAgPT0gQkNNNDMyOV9DSElQX0lEKSAmJiAoc2loLT5jaGlwcmV2ID09IDIpKSB7CiAJCS8qIEZpeCBmb3IgNDMyOWIwIGJhZCBMUE9NIHN0YXRlLiAqLwogCQlXX1JFRyhvc2gsICZjYy0+cmVnY29udHJvbF9hZGRyLCAyKTsKIAkJT1JfUkVHKG9zaCwgJmNjLT5yZWdjb250cm9sX2RhdGEsIDB4MTAwKTsKQEAgLTIwMDgsNyArMjAxNCw3IEBACiAKIC8qIFJldHVybiB1cCB0aW1lIGluIElMUCBjeWNsZXMgZm9yIHRoZSBnaXZlbiByZXNvdXJjZS4gKi8KIHN0YXRpYyB1aW50Ci1zaV9wbXVfcmVzX3VwdGltZShzaV90ICpzaWgsIG9zbF90ICpvc2gsIGNoaXBjcmVnc190ICpjYywKK3NpX3BtdV9yZXNfdXB0aW1lKHNpX3QgKnNpaCwgc3RydWN0IG9zbF9pbmZvICpvc2gsIGNoaXBjcmVnc190ICpjYywKIAkJCSAgICAgIHU4IHJzcmMpIHsKIAl1MzIgZGVwczsKIAl1aW50IHVwLCBpLCBkdXAsIGRtYXg7CkBAIC0yMDQ1LDcgKzIwNTEsNyBAQAogCiAvKiBSZXR1cm4gZGVwZW5kYW5jaWVzIChkaXJlY3Qgb3IgYWxsL2luZGlyZWN0KSBmb3IgdGhlIGdpdmVuIHJlc291cmNlcyAqLwogc3RhdGljIHUzMgotc2lfcG11X3Jlc19kZXBzKHNpX3QgKnNpaCwgb3NsX3QgKm9zaCwgY2hpcGNyZWdzX3QgKmNjLCB1MzIgcnNyY3MsCitzaV9wbXVfcmVzX2RlcHMoc2lfdCAqc2loLCBzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgY2hpcGNyZWdzX3QgKmNjLCB1MzIgcnNyY3MsCiAJCWJvb2wgYWxsKQogewogCXUzMiBkZXBzID0gMDsKQEAgLTIwNjUsNyArMjA3MSw3IEBACiB9CiAKIC8qIHBvd2VyIHVwL2Rvd24gT1RQIHRocm91Z2ggUE1VIHJlc291cmNlcyAqLwotdm9pZCBzaV9wbXVfb3RwX3Bvd2VyKHNpX3QgKnNpaCwgb3NsX3QgKm9zaCwgYm9vbCBvbikKK3ZvaWQgc2lfcG11X290cF9wb3dlcihzaV90ICpzaWgsIHN0cnVjdCBvc2xfaW5mbyAqb3NoLCBib29sIG9uKQogewogCWNoaXBjcmVnc190ICpjYzsKIAl1aW50IG9yaWdpZHg7CkBAIC0yMDg0LDcgKzIwOTAsNyBAQAogCWNjID0gc2lfc2V0Y29yZWlkeChzaWgsIFNJX0NDX0lEWCk7CiAJQVNTRVJUKGNjICE9IE5VTEwpOwogCi0Jc3dpdGNoIChDSElQSUQoc2loLT5jaGlwKSkgeworCXN3aXRjaCAoc2loLT5jaGlwKSB7CiAJY2FzZSBCQ000MzI5X0NISVBfSUQ6CiAJCXJzcmNzID0gUE1VUkVTX0JJVChSRVM0MzI5X09UUF9QVSk7CiAJCWJyZWFrOwpAQCAtMjEzNSw3ICsyMTQxLDcgQEAKIAlzaV9zZXRjb3JlaWR4KHNpaCwgb3JpZ2lkeCk7CiB9CiAKLXZvaWQgc2lfcG11X3JjYWwoc2lfdCAqc2loLCBvc2xfdCAqb3NoKQordm9pZCBzaV9wbXVfcmNhbChzaV90ICpzaWgsIHN0cnVjdCBvc2xfaW5mbyAqb3NoKQogewogCWNoaXBjcmVnc190ICpjYzsKIAl1aW50IG9yaWdpZHg7CkBAIC0yMTQ3LDcgKzIxNTMsNyBAQAogCWNjID0gc2lfc2V0Y29yZWlkeChzaWgsIFNJX0NDX0lEWCk7CiAJQVNTRVJUKGNjICE9IE5VTEwpOwogCi0Jc3dpdGNoIChDSElQSUQoc2loLT5jaGlwKSkgeworCXN3aXRjaCAoc2loLT5jaGlwKSB7CiAJY2FzZSBCQ000MzI5X0NISVBfSUQ6ewogCQkJdTggcmNhbF9jb2RlOwogCQkJdTMyIHZhbDsKQEAgLTIyMTgsNyArMjIyNCw3IEBACiAJc2lfc2V0Y29yZWlkeChzaWgsIG9yaWdpZHgpOwogfQogCi12b2lkIHNpX3BtdV9zcHVyYXZvaWQoc2lfdCAqc2loLCBvc2xfdCAqb3NoLCB1OCBzcHVyYXZvaWQpCit2b2lkIHNpX3BtdV9zcHVyYXZvaWQoc2lfdCAqc2loLCBzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgdTggc3B1cmF2b2lkKQogewogCWNoaXBjcmVnc190ICpjYzsKIAl1aW50IG9yaWdpZHgsIGludHJfdmFsOwpAQCAtMjIzMCw3ICsyMjM2LDcgQEAKIAlBU1NFUlQoY2MgIT0gTlVMTCk7CiAKIAkvKiBmb3JjZSB0aGUgSFQgb2ZmICAqLwotCWlmIChDSElQSUQoc2loLT5jaGlwKSA9PSBCQ000MzM2X0NISVBfSUQpIHsKKwlpZiAoc2loLT5jaGlwID09IEJDTTQzMzZfQ0hJUF9JRCkgewogCQl0bXAgPSBSX1JFRyhvc2gsICZjYy0+bWF4X3Jlc19tYXNrKTsKIAkJdG1wICY9IH5SRVM0MzM2X0hUX0FWQUlMOwogCQlXX1JFRyhvc2gsICZjYy0+bWF4X3Jlc19tYXNrLCB0bXApOwpAQCAtMjI0NCw3ICsyMjUwLDcgQEAKIAlzaV9wbXVfc3B1cmF2b2lkX3BsbHVwZGF0ZShzaWgsIGNjLCBvc2gsIHNwdXJhdm9pZCk7CiAKIAkvKiBlbmFibGUgSFQgYmFjayBvbiAgKi8KLQlpZiAoQ0hJUElEKHNpaC0+Y2hpcCkgPT0gQkNNNDMzNl9DSElQX0lEKSB7CisJaWYgKHNpaC0+Y2hpcCA9PSBCQ000MzM2X0NISVBfSUQpIHsKIAkJdG1wID0gUl9SRUcob3NoLCAmY2MtPm1heF9yZXNfbWFzayk7CiAJCXRtcCB8PSBSRVM0MzM2X0hUX0FWQUlMOwogCQlXX1JFRyhvc2gsICZjYy0+bWF4X3Jlc19tYXNrLCB0bXApOwpAQCAtMjI1NSw3ICsyMjYxLDcgQEAKIH0KIAogc3RhdGljIHZvaWQKLXNpX3BtdV9zcHVyYXZvaWRfcGxsdXBkYXRlKHNpX3QgKnNpaCwgY2hpcGNyZWdzX3QgKmNjLCBvc2xfdCAqb3NoLAorc2lfcG11X3NwdXJhdm9pZF9wbGx1cGRhdGUoc2lfdCAqc2loLCBjaGlwY3JlZ3NfdCAqY2MsIHN0cnVjdCBvc2xfaW5mbyAqb3NoLAogCQkJICAgdTggc3B1cmF2b2lkKQogewogCXUzMiB0bXAgPSAwOwpAQCAtMjI2MywxNCArMjI2OSwxNCBAQAogCXU4IGJjbTUzNTdfYmNtNDMyMzZfcDFkaXZbXSA9IHsgMHgxLCAweDUsIDB4NSB9OwogCXU4IGJjbTUzNTdfYmNtNDMyMzZfbmRpdltdID0geyAweDMwLCAweGY2LCAweGZjIH07CiAKLQlzd2l0Y2ggKENISVBJRChzaWgtPmNoaXApKSB7CisJc3dpdGNoIChzaWgtPmNoaXApIHsKIAljYXNlIEJDTTUzNTdfQ0hJUF9JRDoKIAljYXNlIEJDTTQzMjM1X0NISVBfSUQ6CiAJY2FzZSBCQ000MzIzNl9DSElQX0lEOgogCWNhc2UgQkNNNDMyMzhfQ0hJUF9JRDoKIAogCQkvKiBCQ001MzU3IG5lZWRzIHRvIHRvdWNoIFBMTDFfUExMQ1RMWzAyXSwgc28gb2Zmc2V0IFBMTDBfUExMQ1RMWzAyXSBieSA2ICovCi0JCXBoeXBsbF9vZmZzZXQgPSAoQ0hJUElEKHNpaC0+Y2hpcCkgPT0gQkNNNTM1N19DSElQX0lEKSA/IDYgOiAwOworCQlwaHlwbGxfb2Zmc2V0ID0gKHNpaC0+Y2hpcCA9PSBCQ001MzU3X0NISVBfSUQpID8gNiA6IDA7CiAKIAkJLyogUk1XIG9ubHkgdGhlIFAxIGRpdmlkZXIgKi8KIAkJV19SRUcob3NoLCAmY2MtPnBsbGNvbnRyb2xfYWRkciwKQEAgLTI0NTEsNyArMjQ1Nyw3IEBACiAJV19SRUcob3NoLCAmY2MtPnBtdWNvbnRyb2wsIHRtcCk7CiB9CiAKLWJvb2wgc2lfcG11X2lzX290cF9wb3dlcmVkKHNpX3QgKnNpaCwgb3NsX3QgKm9zaCkKK2Jvb2wgc2lfcG11X2lzX290cF9wb3dlcmVkKHNpX3QgKnNpaCwgc3RydWN0IG9zbF9pbmZvICpvc2gpCiB7CiAJdWludCBpZHg7CiAJY2hpcGNyZWdzX3QgKmNjOwpAQCAtMjQ2Miw3ICsyNDY4LDcgQEAKIAljYyA9IHNpX3NldGNvcmVpZHgoc2loLCBTSV9DQ19JRFgpOwogCUFTU0VSVChjYyAhPSBOVUxMKTsKIAotCXN3aXRjaCAoQ0hJUElEKHNpaC0+Y2hpcCkpIHsKKwlzd2l0Y2ggKHNpaC0+Y2hpcCkgewogCWNhc2UgQkNNNDMyOV9DSElQX0lEOgogCQlzdCA9IChSX1JFRyhvc2gsICZjYy0+cmVzX3N0YXRlKSAmIFBNVVJFU19CSVQoUkVTNDMyOV9PVFBfUFUpKQogCQkgICAgIT0gMDsKQEAgLTI1MDMsOSArMjUwOSw5IEBACiAKIHZvaWQKICNpZiBkZWZpbmVkKEJDTURCRykKLXNpX3BtdV9zcHJvbV9lbmFibGUoc2lfdCAqc2loLCBvc2xfdCAqb3NoLCBib29sIGVuYWJsZSkKK3NpX3BtdV9zcHJvbV9lbmFibGUoc2lfdCAqc2loLCBzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgYm9vbCBlbmFibGUpCiAjZWxzZQotc2lfcG11X3Nwcm9tX2VuYWJsZShzaV90ICpzaWgsIG9zbF90ICpvc2gsIGJvb2wgZW5hYmxlKQorc2lfcG11X3Nwcm9tX2VuYWJsZShzaV90ICpzaWgsIHN0cnVjdCBvc2xfaW5mbyAqb3NoLCBib29sIGVuYWJsZSkKICNlbmRpZgogewogCWNoaXBjcmVnc190ICpjYzsKQEAgLTI1MjEsNyArMjUyNyw3IEBACiB9CiAKIC8qIGluaXRpYWxpemUgUE1VIGNoaXAgY29udHJvbHMgYW5kIG90aGVyIGNoaXAgbGV2ZWwgc3R1ZmYgKi8KLXZvaWQgc2lfcG11X2NoaXBfaW5pdChzaV90ICpzaWgsIG9zbF90ICpvc2gpCit2b2lkIHNpX3BtdV9jaGlwX2luaXQoc2lfdCAqc2loLCBzdHJ1Y3Qgb3NsX2luZm8gKm9zaCkKIHsKIAl1aW50IG9yaWdpZHg7CiAKQEAgLTI1NDMsMTEgKzI1NDksMTEgQEAKIH0KIAogLyogaW5pdGlhbGl6ZSBQTVUgc3dpdGNoL3JlZ3VsYXRvcnMgKi8KLXZvaWQgc2lfcG11X3N3cmVnX2luaXQoc2lfdCAqc2loLCBvc2xfdCAqb3NoKQordm9pZCBzaV9wbXVfc3dyZWdfaW5pdChzaV90ICpzaWgsIHN0cnVjdCBvc2xfaW5mbyAqb3NoKQogewogCUFTU0VSVChzaWgtPmNjY2FwcyAmIENDX0NBUF9QTVUpOwogCi0Jc3dpdGNoIChDSElQSUQoc2loLT5jaGlwKSkgeworCXN3aXRjaCAoc2loLT5jaGlwKSB7CiAJY2FzZSBCQ000MzM2X0NISVBfSUQ6CiAJCS8qIFJlZHVjZSBDTERPIFBXTSBvdXRwdXQgdm9sdGFnZSB0byAxLjJWICovCiAJCXNpX3BtdV9zZXRfbGRvX3ZvbHRhZ2Uoc2loLCBvc2gsIFNFVF9MRE9fVk9MVEFHRV9DTERPX1BXTSwgMHhlKTsKQEAgLTI1NTYsNyArMjU2Miw3IEBACiAJCQkJICAgICAgIDB4ZSk7CiAJCS8qIFJlZHVjZSBMTkxETzEgb3V0cHV0IHZvbHRhZ2UgdG8gMS4yViAqLwogCQlzaV9wbXVfc2V0X2xkb192b2x0YWdlKHNpaCwgb3NoLCBTRVRfTERPX1ZPTFRBR0VfTE5MRE8xLCAweGUpOwotCQlpZiAoQ0hJUFJFVihzaWgtPmNoaXByZXYpID09IDApCisJCWlmIChzaWgtPmNoaXByZXYgPT0gMCkKIAkJCXNpX3BtdV9yZWdjb250cm9sKHNpaCwgMiwgMHg0MDAwMDAsIDB4NDAwMDAwKTsKIAkJYnJlYWs7CiAKQEAgLTI1NzMsNyArMjU3OSw3IEBACiB7CiAJQVNTRVJUKHNpaC0+Y2NjYXBzICYgQ0NfQ0FQX1BNVSk7CiAKLQlzd2l0Y2ggKENISVBJRChzaWgtPmNoaXApKSB7CisJc3dpdGNoIChzaWgtPmNoaXApIHsKIAljYXNlIEJDTTQzMTlfQ0hJUF9JRDoKIAkJaWYgKGVuYWJsZSkKIAkJCXNpX3dyaXRlX3dyYXBwZXJyZWcoc2loLCBBSV9PT0JTRUxPVVRCNzQsCkBAIC0yNTg3LDcgKzI1OTMsNyBAQAogCiAvKiBXYWl0IGZvciBhIHBhcnRpY3VsYXIgY2xvY2sgbGV2ZWwgdG8gYmUgb24gdGhlIGJhY2twbGFuZSAqLwogdTMyCi1zaV9wbXVfd2FpdGZvcmNsa19vbl9iYWNrcGxhbmUoc2lfdCAqc2loLCBvc2xfdCAqb3NoLCB1MzIgY2xrLAorc2lfcG11X3dhaXRmb3JjbGtfb25fYmFja3BsYW5lKHNpX3QgKnNpaCwgc3RydWN0IG9zbF9pbmZvICpvc2gsIHUzMiBjbGssCiAJCQkgICAgICAgdTMyIGRlbGF5KQogewogCWNoaXBjcmVnc190ICpjYzsKQEAgLTI2MTYsNyArMjYyMiw3IEBACiAKICNkZWZpbmUgRVhUX0lMUF9IWiAzMjc2OAogCi11MzIgc2lfcG11X21lYXN1cmVfYWxwY2xrKHNpX3QgKnNpaCwgb3NsX3QgKm9zaCkKK3UzMiBzaV9wbXVfbWVhc3VyZV9hbHBjbGsoc2lfdCAqc2loLCBzdHJ1Y3Qgb3NsX2luZm8gKm9zaCkKIHsKIAljaGlwY3JlZ3NfdCAqY2M7CiAJdWludCBvcmlnaWR4OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS91dGlsL2xpbnV4X29zbC5jIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS91dGlsL2xpbnV4X29zbC5jCmluZGV4IDJiYjViODcuLmU2NzE2ZTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvdXRpbC9saW51eF9vc2wuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3V0aWwvbGludXhfb3NsLmMKQEAgLTIwLDE0NSArMjAsNTcgQEAKICNpbmNsdWRlIDxhc20vcGFjY2Vzcy5oPgogI2VuZGlmCQkJCS8qIG1pcHMgKi8KICNpbmNsdWRlIDxiY21lbmRpYW4uaD4KLSNpbmNsdWRlIDxsaW51eHZlci5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8YmNtZGVmcy5oPgogI2luY2x1ZGUgPG9zbC5oPgogI2luY2x1ZGUgPGJjbXV0aWxzLmg+CiAjaW5jbHVkZSA8cGNpY2ZnLmg+CiAKIAotI2RlZmluZSBQQ0lfQ0ZHX1JFVFJZIAkJMTAKLQogI2RlZmluZSBPU19IQU5ETEVfTUFHSUMJCTB4MTIzNGFiY2QJLyogTWFnaWMgIyB0byByZWNvZ25pc2Ugb3NoICovCiAjZGVmaW5lIEJDTV9NRU1fRklMRU5BTUVfTEVOIAkyNAkvKiBNZW0uIGZpbGVuYW1lIGxlbmd0aCAqLwogCi1zdHJ1Y3Qgb3NsX2luZm8gewotCW9zbF9wdWJpbmZvX3QgcHViOwotCXVpbnQgbWFnaWM7Ci0Jdm9pZCAqcGRldjsKLQl1aW50IGZhaWxlZDsKLQl1aW50IGJ1c3R5cGU7Ci19OwotCiAvKiBHbG9iYWwgQVNTRVJUIHR5cGUgZmxhZyAqLwogdTMyIGdfYXNzZXJ0X3R5cGU7CiAKLSNpZmRlZiBCUkNNX0ZVTExNQUMKLXN0YXRpYyBzMTYgbGludXhiY21lcnJvcm1hcFtdID0geyAwLAkvKiAwICovCi0JLUVJTlZBTCwJCS8qIEJDTUVfRVJST1IgKi8KLQktRUlOVkFMLAkJLyogQkNNRV9CQURBUkcgKi8KLQktRUlOVkFMLAkJLyogQkNNRV9CQURPUFRJT04gKi8KLQktRUlOVkFMLAkJLyogQkNNRV9OT1RVUCAqLwotCS1FSU5WQUwsCQkvKiBCQ01FX05PVERPV04gKi8KLQktRUlOVkFMLAkJLyogQkNNRV9OT1RBUCAqLwotCS1FSU5WQUwsCQkvKiBCQ01FX05PVFNUQSAqLwotCS1FSU5WQUwsCQkvKiBCQ01FX0JBREtFWUlEWCAqLwotCS1FSU5WQUwsCQkvKiBCQ01FX1JBRElPT0ZGICovCi0JLUVJTlZBTCwJCS8qIEJDTUVfTk9UQkFORExPQ0tFRCAqLwotCS1FSU5WQUwsCQkvKiBCQ01FX05PQ0xLICovCi0JLUVJTlZBTCwJCS8qIEJDTUVfQkFEUkFURVNFVCAqLwotCS1FSU5WQUwsCQkvKiBCQ01FX0JBREJBTkQgKi8KLQktRTJCSUcsCQkJLyogQkNNRV9CVUZUT09TSE9SVCAqLwotCS1FMkJJRywJCQkvKiBCQ01FX0JVRlRPT0xPTkcgKi8KLQktRUJVU1ksCQkJLyogQkNNRV9CVVNZICovCi0JLUVJTlZBTCwJCS8qIEJDTUVfTk9UQVNTT0NJQVRFRCAqLwotCS1FSU5WQUwsCQkvKiBCQ01FX0JBRFNTSURMRU4gKi8KLQktRUlOVkFMLAkJLyogQkNNRV9PVVRPRlJBTkdFQ0hBTiAqLwotCS1FSU5WQUwsCQkvKiBCQ01FX0JBRENIQU4gKi8KLQktRUZBVUxULAkJLyogQkNNRV9CQURBRERSICovCi0JLUVOT01FTSwJCS8qIEJDTUVfTk9SRVNPVVJDRSAqLwotCS1FT1BOT1RTVVBQLAkJLyogQkNNRV9VTlNVUFBPUlRFRCAqLwotCS1FTVNHU0laRSwJCS8qIEJDTUVfQkFETEVOR1RIICovCi0JLUVJTlZBTCwJCS8qIEJDTUVfTk9UUkVBRFkgKi8KLQktRVBFUk0sCQkJLyogQkNNRV9OT1RQRVJNSVRURUQgKi8KLQktRU5PTUVNLAkJLyogQkNNRV9OT01FTSAqLwotCS1FSU5WQUwsCQkvKiBCQ01FX0FTU09DSUFURUQgKi8KLQktRVJBTkdFLAkJLyogQkNNRV9SQU5HRSAqLwotCS1FSU5WQUwsCQkvKiBCQ01FX05PVEZPVU5EICovCi0JLUVJTlZBTCwJCS8qIEJDTUVfV01FX05PVF9FTkFCTEVEICovCi0JLUVJTlZBTCwJCS8qIEJDTUVfVFNQRUNfTk9URk9VTkQgKi8KLQktRUlOVkFMLAkJLyogQkNNRV9BQ01fTk9UU1VQUE9SVEVEICovCi0JLUVJTlZBTCwJCS8qIEJDTUVfTk9UX1dNRV9BU1NPQ0lBVElPTiAqLwotCS1FSU8sCQkJLyogQkNNRV9TRElPX0VSUk9SICovCi0JLUVOT0RFViwJCS8qIEJDTUVfRE9OR0xFX0RPV04gKi8KLQktRUlOVkFMLAkJLyogQkNNRV9WRVJTSU9OICovCi0JLUVJTywJCQkvKiBCQ01FX1RYRkFJTCAqLwotCS1FSU8sCQkJLyogQkNNRV9SWEZBSUwgKi8KLQktRUlOVkFMLAkJLyogQkNNRV9OT0RFVklDRSAqLwotCS1FSU5WQUwsCQkvKiBCQ01FX05NT0RFX0RJU0FCTEVEICovCi0JLUVOT0RBVEEsCQkvKiBCQ01FX05PTlJFU0lERU5UICovCi0KLS8qIFdoZW4gYW4gbmV3IGVycm9yIGNvZGUgaXMgYWRkZWQgdG8gYmNtdXRpbHMuaCwgYWRkIG9zCi0gKiBzcGNlY2lmaWMgZXJyb3IgdHJhbnNsYXRpb24gaGVyZSBhcyB3ZWxsCi0gKi8KLS8qIGNoZWNrIGlmIEJDTUVfTEFTVCBjaGFuZ2VkIHNpbmNlIHRoZSBsYXN0IHRpbWUgdGhpcyBmdW5jdGlvbiB3YXMgdXBkYXRlZCAqLwotI2lmIEJDTUVfTEFTVCAhPSAtNDIKLSNlcnJvciAiWW91IG5lZWQgdG8gYWRkIGEgT1MgZXJyb3IgdHJhbnNsYXRpb24gaW4gdGhlIGxpbnV4YmNtZXJyb3JtYXAgXAotCWZvciBuZXcgZXJyb3IgY29kZSBkZWZpbmVkIGluIGJjbXV0aWxzLmgiCi0jZW5kaWYKLX07Ci0KLS8qIHRyYW5zbGF0ZSBiY21lcnJvcnMgaW50byBsaW51eCBlcnJvcnMgKi8KLWludCBvc2xfZXJyb3IoaW50IGJjbWVycm9yKQorc3RydWN0IG9zbF9pbmZvICpvc2xfYXR0YWNoKHZvaWQgKnBkZXYsIHVpbnQgYnVzdHlwZSkKIHsKLQlpZiAoYmNtZXJyb3IgPiAwKQotCQliY21lcnJvciA9IDA7Ci0JZWxzZSBpZiAoYmNtZXJyb3IgPCBCQ01FX0xBU1QpCi0JCWJjbWVycm9yID0gQkNNRV9FUlJPUjsKKwlzdHJ1Y3Qgb3NsX2luZm8gKm9zaDsKIAotCS8qIEFycmF5IGJvdW5kcyBjb3ZlcmVkIGJ5IEFTU0VSVCBpbiBvc2xfYXR0YWNoICovCi0JcmV0dXJuIGxpbnV4YmNtZXJyb3JtYXBbLWJjbWVycm9yXTsKLX0KLSNlbmRpZiAvKiBCUkNNX0ZVTExNQUMgKi8KLQotb3NsX3QgKm9zbF9hdHRhY2godm9pZCAqcGRldiwgdWludCBidXN0eXBlLCBib29sIHBrdHRhZykKLXsKLQlvc2xfdCAqb3NoOwotCi0Jb3NoID0ga21hbGxvYyhzaXplb2Yob3NsX3QpLCBHRlBfQVRPTUlDKTsKKwlvc2ggPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgb3NsX2luZm8pLCBHRlBfQVRPTUlDKTsKIAlBU1NFUlQob3NoKTsKIAotCWJ6ZXJvKG9zaCwgc2l6ZW9mKG9zbF90KSk7Ci0KLSNpZmRlZiBCUkNNX0ZVTExNQUMKLQkvKiBDaGVjayB0aGF0IGVycm9yIG1hcCBoYXMgdGhlIHJpZ2h0IG51bWJlciBvZiBlbnRyaWVzIGluIGl0ICovCi0JQVNTRVJUKEFCUyhCQ01FX0xBU1QpID09IChBUlJBWV9TSVpFKGxpbnV4YmNtZXJyb3JtYXApIC0gMSkpOwotI2VuZGlmIC8qIEJSQ01fRlVMTE1BQyAqLworCW1lbXNldChvc2gsIDAsIHNpemVvZihzdHJ1Y3Qgb3NsX2luZm8pKTsKIAogCW9zaC0+bWFnaWMgPSBPU19IQU5ETEVfTUFHSUM7Ci0Jb3NoLT5mYWlsZWQgPSAwOwogCW9zaC0+cGRldiA9IHBkZXY7Ci0Jb3NoLT5wdWIucGt0dGFnID0gcGt0dGFnOwogCW9zaC0+YnVzdHlwZSA9IGJ1c3R5cGU7CiAKIAlzd2l0Y2ggKGJ1c3R5cGUpIHsKIAljYXNlIFBDSV9CVVM6CiAJY2FzZSBTSV9CVVM6CiAJY2FzZSBQQ01DSUFfQlVTOgotCQlvc2gtPnB1Yi5tbWJ1cyA9IHRydWU7CisJCW9zaC0+bW1idXMgPSB0cnVlOwogCQlicmVhazsKIAljYXNlIEpUQUdfQlVTOgogCWNhc2UgU0RJT19CVVM6CiAJY2FzZSBVU0JfQlVTOgogCWNhc2UgU1BJX0JVUzoKIAljYXNlIFJQQ19CVVM6Ci0JCW9zaC0+cHViLm1tYnVzID0gZmFsc2U7CisJCW9zaC0+bW1idXMgPSBmYWxzZTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJQVNTRVJUKGZhbHNlKTsKIAkJYnJlYWs7CiAJfQogCi0jaWYgZGVmaW5lZChCQ01EQkcpICYmICFkZWZpbmVkKEJSQ01fRlVMTE1BQykKLQlpZiAocGt0dGFnKSB7Ci0JCXN0cnVjdCBza19idWZmICpza2I7Ci0JCUFTU0VSVChPU0xfUEtUVEFHX1NaIDw9IHNpemVvZihza2ItPmNiKSk7Ci0JfQotI2VuZGlmCiAJcmV0dXJuIG9zaDsKIH0KIAotdm9pZCBvc2xfZGV0YWNoKG9zbF90ICpvc2gpCit2b2lkIG9zbF9kZXRhY2goc3RydWN0IG9zbF9pbmZvICpvc2gpCiB7CiAJaWYgKG9zaCA9PSBOVUxMKQogCQlyZXR1cm47CkBAIC0xNjcsOCArNzksNyBAQAogCWtmcmVlKG9zaCk7CiB9CiAKLS8qIFJldHVybiBhIG5ldyBwYWNrZXQuIHplcm8gb3V0IHBrdHRhZyAqLwotdm9pZCAqQkNNRkFTVFBBVEggb3NsX3BrdGdldChvc2xfdCAqb3NoLCB1aW50IGxlbikKK3N0cnVjdCBza19idWZmICpCQ01GQVNUUEFUSCBwa3RfYnVmX2dldF9za2Ioc3RydWN0IG9zbF9pbmZvICpvc2gsIHVpbnQgbGVuKQogewogCXN0cnVjdCBza19idWZmICpza2I7CiAKQEAgLTE3NywyNCArODgsMjAgQEAKIAkJc2tiX3B1dChza2IsIGxlbik7CiAJCXNrYi0+cHJpb3JpdHkgPSAwOwogCi0JCW9zaC0+cHViLnBrdGFsbG9jZWQrKzsKKwkJb3NoLT5wa3RhbGxvY2VkKys7CiAJfQogCi0JcmV0dXJuICh2b2lkICopc2tiOworCXJldHVybiBza2I7CiB9CiAKIC8qIEZyZWUgdGhlIGRyaXZlciBwYWNrZXQuIEZyZWUgdGhlIHRhZyBpZiBwcmVzZW50ICovCi12b2lkIEJDTUZBU1RQQVRIIG9zbF9wa3RmcmVlKG9zbF90ICpvc2gsIHZvaWQgKnAsIGJvb2wgc2VuZCkKK3ZvaWQgQkNNRkFTVFBBVEggcGt0X2J1Zl9mcmVlX3NrYihzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwgYm9vbCBzZW5kKQogewotCXN0cnVjdCBza19idWZmICpza2IsICpuc2tiOworCXN0cnVjdCBza19idWZmICpuc2tiOwogCWludCBuZXN0ID0gMDsKIAotCXNrYiA9IChzdHJ1Y3Qgc2tfYnVmZiAqKXA7CiAJQVNTRVJUKHNrYik7CiAKLQlpZiAoc2VuZCAmJiBvc2gtPnB1Yi50eF9mbikKLQkJb3NoLT5wdWIudHhfZm4ob3NoLT5wdWIudHhfY3R4LCBwLCAwKTsKLQogCS8qIHBlcnZlcnNpb246IHdlIHVzZSBza2ItPm5leHQgdG8gY2hhaW4gbXVsdGktc2tiIHBhY2tldHMgKi8KIAl3aGlsZSAoc2tiKSB7CiAJCW5za2IgPSBza2ItPm5leHQ7CkBAIC0yMTEsNjMgKzExOCwxNCBAQAogCQkJICovCiAJCQlkZXZfa2ZyZWVfc2tiKHNrYik7CiAKLQkJb3NoLT5wdWIucGt0YWxsb2NlZC0tOworCQlvc2gtPnBrdGFsbG9jZWQtLTsKIAkJbmVzdCsrOwogCQlza2IgPSBuc2tiOwogCX0KIH0KIAotdTMyIG9zbF9wY2lfcmVhZF9jb25maWcob3NsX3QgKm9zaCwgdWludCBvZmZzZXQsIHVpbnQgc2l6ZSkKLXsKLQl1aW50IHZhbCA9IDA7Ci0JdWludCByZXRyeSA9IFBDSV9DRkdfUkVUUlk7Ci0KLQlBU1NFUlQoKG9zaCAmJiAob3NoLT5tYWdpYyA9PSBPU19IQU5ETEVfTUFHSUMpKSk7Ci0KLQkvKiBvbmx5IDRieXRlIGFjY2VzcyBzdXBwb3J0ZWQgKi8KLQlBU1NFUlQoc2l6ZSA9PSA0KTsKLQotCWRvIHsKLQkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKG9zaC0+cGRldiwgb2Zmc2V0LCAmdmFsKTsKLQkJaWYgKHZhbCAhPSAweGZmZmZmZmZmKQotCQkJYnJlYWs7Ci0JfSB3aGlsZSAocmV0cnktLSk7Ci0KLSNpZmRlZiBCQ01EQkcKLQlpZiAocmV0cnkgPCBQQ0lfQ0ZHX1JFVFJZKQotCQlwcmludGsoIlBDSSBDT05GSUcgUkVBRCBhY2Nlc3MgdG8gJWQgcmVxdWlyZWQgJWQgcmV0cmllc1xuIiwKLQkJICAgICAgIG9mZnNldCwgKFBDSV9DRkdfUkVUUlkgLSByZXRyeSkpOwotI2VuZGlmCQkJCS8qIEJDTURCRyAqLwotCi0JcmV0dXJuIHZhbDsKLX0KLQotdm9pZCBvc2xfcGNpX3dyaXRlX2NvbmZpZyhvc2xfdCAqb3NoLCB1aW50IG9mZnNldCwgdWludCBzaXplLCB1aW50IHZhbCkKLXsKLQl1aW50IHJldHJ5ID0gUENJX0NGR19SRVRSWTsKLQotCUFTU0VSVCgob3NoICYmIChvc2gtPm1hZ2ljID09IE9TX0hBTkRMRV9NQUdJQykpKTsKLQotCS8qIG9ubHkgNGJ5dGUgYWNjZXNzIHN1cHBvcnRlZCAqLwotCUFTU0VSVChzaXplID09IDQpOwotCi0JZG8gewotCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKG9zaC0+cGRldiwgb2Zmc2V0LCB2YWwpOwotCQlpZiAob2Zmc2V0ICE9IFBDSV9CQVIwX1dJTikKLQkJCWJyZWFrOwotCQlpZiAob3NsX3BjaV9yZWFkX2NvbmZpZyhvc2gsIG9mZnNldCwgc2l6ZSkgPT0gdmFsKQotCQkJYnJlYWs7Ci0JfSB3aGlsZSAocmV0cnktLSk7Ci0KLSNpZiBkZWZpbmVkKEJDTURCRykgJiYgIWRlZmluZWQoQlJDTV9GVUxMTUFDKQotCWlmIChyZXRyeSA8IFBDSV9DRkdfUkVUUlkpCi0JCXByaW50aygiUENJIENPTkZJRyBXUklURSBhY2Nlc3MgdG8gJWQgcmVxdWlyZWQgJWQgcmV0cmllc1xuIiwKLQkJICAgICAgIG9mZnNldCwgKFBDSV9DRkdfUkVUUlkgLSByZXRyeSkpOwotI2VuZGlmCQkJCS8qIEJDTURCRyAqLwotfQotCiAvKiByZXR1cm4gYnVzICMgZm9yIHRoZSBwY2kgZGV2aWNlIHBvaW50ZWQgYnkgb3NoLT5wZGV2ICovCi11aW50IG9zbF9wY2lfYnVzKG9zbF90ICpvc2gpCit1aW50IG9zbF9wY2lfYnVzKHN0cnVjdCBvc2xfaW5mbyAqb3NoKQogewogCUFTU0VSVChvc2ggJiYgKG9zaC0+bWFnaWMgPT0gT1NfSEFORExFX01BR0lDKSAmJiBvc2gtPnBkZXYpOwogCkBAIC0yNzUsNDAgKzEzMywzNyBAQAogfQogCiAvKiByZXR1cm4gc2xvdCAjIGZvciB0aGUgcGNpIGRldmljZSBwb2ludGVkIGJ5IG9zaC0+cGRldiAqLwotdWludCBvc2xfcGNpX3Nsb3Qob3NsX3QgKm9zaCkKK3VpbnQgb3NsX3BjaV9zbG90KHN0cnVjdCBvc2xfaW5mbyAqb3NoKQogewogCUFTU0VSVChvc2ggJiYgKG9zaC0+bWFnaWMgPT0gT1NfSEFORExFX01BR0lDKSAmJiBvc2gtPnBkZXYpOwogCiAJcmV0dXJuIFBDSV9TTE9UKCgoc3RydWN0IHBjaV9kZXYgKilvc2gtPnBkZXYpLT5kZXZmbik7CiB9CiAKLXVpbnQgb3NsX2RtYV9jb25zaXN0ZW50X2FsaWduKHZvaWQpCi17Ci0JcmV0dXJuIFBBR0VfU0laRTsKLX0KLQotdm9pZCAqb3NsX2RtYV9hbGxvY19jb25zaXN0ZW50KG9zbF90ICpvc2gsIHVpbnQgc2l6ZSwgdTE2IGFsaWduX2JpdHMsCit2b2lkICpvc2xfZG1hX2FsbG9jX2NvbnNpc3RlbnQoc3RydWN0IG9zbF9pbmZvICpvc2gsIHVpbnQgc2l6ZSwgdTE2IGFsaWduX2JpdHMsCiAJCQkgICAgICAgdWludCAqYWxsb2NlZCwgdW5zaWduZWQgbG9uZyAqcGFwKQogewogCUFTU0VSVCgob3NoICYmIChvc2gtPm1hZ2ljID09IE9TX0hBTkRMRV9NQUdJQykpKTsKIAogCWlmIChhbGlnbl9iaXRzKSB7CiAJCXUxNiBhbGlnbiA9ICgxIDw8IGFsaWduX2JpdHMpOwotCQlpZiAoIUlTX0FMSUdORUQoRE1BX0NPTlNJU1RFTlRfQUxJR04sIGFsaWduKSkKKwkJaWYgKCFJU19BTElHTkVEKFBBR0VfU0laRSwgYWxpZ24pKQogCQkJc2l6ZSArPSBhbGlnbjsKIAkJKmFsbG9jZWQgPSBzaXplOwogCX0KIAlyZXR1cm4gcGNpX2FsbG9jX2NvbnNpc3RlbnQob3NoLT5wZGV2LCBzaXplLCAoZG1hX2FkZHJfdCAqKSBwYXApOwogfQogCi12b2lkIG9zbF9kbWFfZnJlZV9jb25zaXN0ZW50KG9zbF90ICpvc2gsIHZvaWQgKnZhLCB1aW50IHNpemUsIHVuc2lnbmVkIGxvbmcgcGEpCit2b2lkIG9zbF9kbWFfZnJlZV9jb25zaXN0ZW50KHN0cnVjdCBvc2xfaW5mbyAqb3NoLCB2b2lkICp2YSwgdWludCBzaXplLAorCQkJICAgICB1bnNpZ25lZCBsb25nIHBhKQogewogCUFTU0VSVCgob3NoICYmIChvc2gtPm1hZ2ljID09IE9TX0hBTkRMRV9NQUdJQykpKTsKIAogCXBjaV9mcmVlX2NvbnNpc3RlbnQob3NoLT5wZGV2LCBzaXplLCB2YSwgKGRtYV9hZGRyX3QpIHBhKTsKIH0KIAotdWludCBCQ01GQVNUUEFUSCBvc2xfZG1hX21hcChvc2xfdCAqb3NoLCB2b2lkICp2YSwgdWludCBzaXplLCBpbnQgZGlyZWN0aW9uKQordWludCBCQ01GQVNUUEFUSCBvc2xfZG1hX21hcChzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgdm9pZCAqdmEsIHVpbnQgc2l6ZSwKKwkJCSAgICAgaW50IGRpcmVjdGlvbikKIHsKIAlpbnQgZGlyOwogCkBAIC0zMTcsNyArMTcyLDggQEAKIAlyZXR1cm4gcGNpX21hcF9zaW5nbGUob3NoLT5wZGV2LCB2YSwgc2l6ZSwgZGlyKTsKIH0KIAotdm9pZCBCQ01GQVNUUEFUSCBvc2xfZG1hX3VubWFwKG9zbF90ICpvc2gsIHVpbnQgcGEsIHVpbnQgc2l6ZSwgaW50IGRpcmVjdGlvbikKK3ZvaWQgQkNNRkFTVFBBVEggb3NsX2RtYV91bm1hcChzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgdWludCBwYSwgdWludCBzaXplLAorCQkJICAgICAgIGludCBkaXJlY3Rpb24pCiB7CiAJaW50IGRpcjsKIApAQCAtMzczLDUyICsyMjksMyBAQAogfQogI2VuZGlmCQkJCS8qIGRlZmluZWQoQkNNREJHX0FTU0VSVCkgKi8KIAotI2lmIGRlZmluZWQoQkNNU0RJTykgJiYgIWRlZmluZWQoQlJDTV9GVUxMTUFDKQotdTggb3NsX3JlYWRiKG9zbF90ICpvc2gsIHZvbGF0aWxlIHU4ICpyKQotewotCW9zbF9ycmVnX2ZuX3QgcnJlZyA9ICgob3NsX3B1YmluZm9fdCAqKSBvc2gpLT5ycmVnX2ZuOwotCXZvaWQgKmN0eCA9ICgob3NsX3B1YmluZm9fdCAqKSBvc2gpLT5yZWdfY3R4OwotCi0JcmV0dXJuICh1OCkgKChycmVnKSAoY3R4LCAodm9pZCAqKXIsIHNpemVvZih1OCkpKTsKLX0KLQotdTE2IG9zbF9yZWFkdyhvc2xfdCAqb3NoLCB2b2xhdGlsZSB1MTYgKnIpCi17Ci0Jb3NsX3JyZWdfZm5fdCBycmVnID0gKChvc2xfcHViaW5mb190ICopIG9zaCktPnJyZWdfZm47Ci0Jdm9pZCAqY3R4ID0gKChvc2xfcHViaW5mb190ICopIG9zaCktPnJlZ19jdHg7Ci0KLQlyZXR1cm4gKHUxNikgKChycmVnKSAoY3R4LCAodm9pZCAqKXIsIHNpemVvZih1MTYpKSk7Ci19Ci0KLXUzMiBvc2xfcmVhZGwob3NsX3QgKm9zaCwgdm9sYXRpbGUgdTMyICpyKQotewotCW9zbF9ycmVnX2ZuX3QgcnJlZyA9ICgob3NsX3B1YmluZm9fdCAqKSBvc2gpLT5ycmVnX2ZuOwotCXZvaWQgKmN0eCA9ICgob3NsX3B1YmluZm9fdCAqKSBvc2gpLT5yZWdfY3R4OwotCi0JcmV0dXJuICh1MzIpICgocnJlZykgKGN0eCwgKHZvaWQgKilyLCBzaXplb2YodTMyKSkpOwotfQotCi12b2lkIG9zbF93cml0ZWIob3NsX3QgKm9zaCwgdm9sYXRpbGUgdTggKnIsIHU4IHYpCi17Ci0Jb3NsX3dyZWdfZm5fdCB3cmVnID0gKChvc2xfcHViaW5mb190ICopIG9zaCktPndyZWdfZm47Ci0Jdm9pZCAqY3R4ID0gKChvc2xfcHViaW5mb190ICopIG9zaCktPnJlZ19jdHg7Ci0KLQkoKHdyZWcpIChjdHgsICh2b2lkICopciwgdiwgc2l6ZW9mKHU4KSkpOwotfQotCi12b2lkIG9zbF93cml0ZXcob3NsX3QgKm9zaCwgdm9sYXRpbGUgdTE2ICpyLCB1MTYgdikKLXsKLQlvc2xfd3JlZ19mbl90IHdyZWcgPSAoKG9zbF9wdWJpbmZvX3QgKikgb3NoKS0+d3JlZ19mbjsKLQl2b2lkICpjdHggPSAoKG9zbF9wdWJpbmZvX3QgKikgb3NoKS0+cmVnX2N0eDsKLQotCSgod3JlZykgKGN0eCwgKHZvaWQgKilyLCB2LCBzaXplb2YodTE2KSkpOwotfQotCi12b2lkIG9zbF93cml0ZWwob3NsX3QgKm9zaCwgdm9sYXRpbGUgdTMyICpyLCB1MzIgdikKLXsKLQlvc2xfd3JlZ19mbl90IHdyZWcgPSAoKG9zbF9wdWJpbmZvX3QgKikgb3NoKS0+d3JlZ19mbjsKLQl2b2lkICpjdHggPSAoKG9zbF9wdWJpbmZvX3QgKikgb3NoKS0+cmVnX2N0eDsKLQotCSgod3JlZykgKGN0eCwgKHZvaWQgKilyLCB2LCBzaXplb2YodTMyKSkpOwotfQotI2VuZGlmCS8qIEJDTVNESU8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvdXRpbC9uaWNwY2kuYyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvdXRpbC9uaWNwY2kuYwppbmRleCAyM2Y4NmRkLi41NmU2NThjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3V0aWwvbmljcGNpLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS91dGlsL25pY3BjaS5jCkBAIC0xNCw4ICsxNCw5IEBACiAgKiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgogICovCiAKKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgotI2luY2x1ZGUgPGxpbnV4dmVyLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8YmNtZGVmcy5oPgogI2luY2x1ZGUgPG9zbC5oPgogI2luY2x1ZGUgPGJjbXV0aWxzLmg+CkBAIC0zNSw3ICszNiw3IEBACiAJfSByZWdzOwkJCS8qIE1lbW9yeSBtYXBwZWQgcmVnaXN0ZXIgdG8gdGhlIGNvcmUgKi8KIAogCXNpX3QgKnNpaDsJCS8qIFN5c3RlbSBpbnRlcmNvbm5lY3QgaGFuZGxlICovCi0Jb3NsX3QgKm9zaDsJCS8qIE9TTCBoYW5kbGUgKi8KKwlzdHJ1Y3Qgb3NsX2luZm8gKm9zaDsJCS8qIE9TTCBoYW5kbGUgKi8KIAl1OCBwY2llY2FwX2xjcmVnX29mZnNldDsJLyogUENJRSBjYXBhYmlsaXR5IExDcmVnIG9mZnNldCBpbiB0aGUgY29uZmlnIHNwYWNlICovCiAJYm9vbCBwY2llX3ByNDI3Njc7CiAJdTggcGNpZV9wb2xhcml0eTsKQEAgLTQ3LDcgKzQ4LDggQEAKIAogLyogZGVidWcvdHJhY2UgKi8KICNkZWZpbmUJUENJX0VSUk9SKGFyZ3MpCi0jZGVmaW5lIFBDSUVfUFVCKHNpaCkgKChCVVNUWVBFKChzaWgpLT5idXN0eXBlKSA9PSBQQ0lfQlVTKSAmJiAoKHNpaCktPmJ1c2NvcmV0eXBlID09IFBDSUVfQ09SRV9JRCkpCisjZGVmaW5lIFBDSUVfUFVCKHNpaCkgXAorCSgoKHNpaCktPmJ1c3R5cGUgPT0gUENJX0JVUykgJiYgKChzaWgpLT5idXNjb3JldHlwZSA9PSBQQ0lFX0NPUkVfSUQpKQogCiAvKiByb3V0aW5lcyB0byBhY2Nlc3MgbWRpbyBzbGF2ZSBkZXZpY2UgcmVnaXN0ZXJzICovCiBzdGF0aWMgYm9vbCBwY2llX21kaW9zZXRibG9jayhwY2ljb3JlX2luZm9fdCAqcGksIHVpbnQgYmxrKTsKQEAgLTcxLDM1ICs3Myw2IEBACiAKICNkZWZpbmUgUENJRV9BU1BNKHNpaCkJKChQQ0lFX1BVQihzaWgpKSAmJiAoKChzaWgpLT5idXNjb3JlcmV2ID49IDMpICYmICgoc2loKS0+YnVzY29yZXJldiA8PSA1KSkpCiAKLSNkZWZpbmUgRFdPUkRfQUxJR04oeCkgICh4ICYgfigweDAzKSkKLSNkZWZpbmUgQllURV9QT1MoeCkgKHggJiAweDMpCi0jZGVmaW5lIFdPUkRfUE9TKHgpICh4ICYgMHgxKQotCi0jZGVmaW5lIEJZVEVfU0hJRlQoeCkgICg4ICogQllURV9QT1MoeCkpCi0jZGVmaW5lIFdPUkRfU0hJRlQoeCkgICgxNiAqIFdPUkRfUE9TKHgpKQotCi0jZGVmaW5lIEJZVEVfVkFMKGEsIHgpICgoYSA+PiBCWVRFX1NISUZUKHgpKSAmIDB4RkYpCi0jZGVmaW5lIFdPUkRfVkFMKGEsIHgpICgoYSA+PiBXT1JEX1NISUZUKHgpKSAmIDB4RkZGRikKLQotI2RlZmluZSByZWFkX3BjaV9jZmdfYnl0ZShhKSBcCi0JKEJZVEVfVkFMKE9TTF9QQ0lfUkVBRF9DT05GSUcob3NoLCBEV09SRF9BTElHTihhKSwgNCksIGEpICYgMHhmZikKLQotI2RlZmluZSByZWFkX3BjaV9jZmdfd29yZChhKSBcCi0JKFdPUkRfVkFMKE9TTF9QQ0lfUkVBRF9DT05GSUcob3NoLCBEV09SRF9BTElHTihhKSwgNCksIGEpICYgMHhmZmZmKQotCi0jZGVmaW5lIHdyaXRlX3BjaV9jZmdfYnl0ZShhLCB2YWwpIGRvIHsgXAotCXUzMiB0bXB2YWw7IFwKLQl0bXB2YWwgPSAoT1NMX1BDSV9SRUFEX0NPTkZJRyhvc2gsIERXT1JEX0FMSUdOKGEpLCA0KSAmIH4weEZGIDw8IEJZVEVfUE9TKGEpKSB8IFwKLQkJdmFsIDw8IEJZVEVfUE9TKGEpOyBcCi0JT1NMX1BDSV9XUklURV9DT05GSUcob3NoLCBEV09SRF9BTElHTihhKSwgNCwgdG1wdmFsKTsgXAotCX0gd2hpbGUgKDApCi0KLSNkZWZpbmUgd3JpdGVfcGNpX2NmZ193b3JkKGEsIHZhbCkgZG8geyBcCi0JdTMyIHRtcHZhbDsgXAotCXRtcHZhbCA9IChPU0xfUENJX1JFQURfQ09ORklHKG9zaCwgRFdPUkRfQUxJR04oYSksIDQpICYgfjB4RkZGRiA8PCBXT1JEX1BPUyhhKSkgfCBcCi0JCXZhbCA8PCBXT1JEX1BPUyhhKTsgXAotCU9TTF9QQ0lfV1JJVEVfQ09ORklHKG9zaCwgRFdPUkRfQUxJR04oYSksIDQsIHRtcHZhbCk7IFwKLQl9IHdoaWxlICgwKQogCiAvKiBkZWxheSBuZWVkZWQgYmV0d2VlbiB0aGUgbWRpbyBjb250cm9sLyBtZGlvZGF0YSByZWdpc3RlciBkYXRhIGFjY2VzcyAqLwogI2RlZmluZSBQUjI4ODI5X0RFTEFZKCkgdWRlbGF5KDEwKQpAQCAtMTA3LDcgKzgwLDcgQEAKIC8qIEluaXRpYWxpemUgdGhlIFBDSSBjb3JlLiBJdCdzIGNhbGxlcidzIHJlc3BvbnNpYmlsaXR5IHRvIG1ha2Ugc3VyZSB0aGF0IHRoaXMgaXMgZG9uZQogICogb25seSBvbmNlCiAgKi8KLXZvaWQgKnBjaWNvcmVfaW5pdChzaV90ICpzaWgsIG9zbF90ICpvc2gsIHZvaWQgKnJlZ3MpCit2b2lkICpwY2ljb3JlX2luaXQoc2lfdCAqc2loLCBzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgdm9pZCAqcmVncykKIHsKIAlwY2ljb3JlX2luZm9fdCAqcGk7CiAKQEAgLTE0OSw4ICsxMjIsOCBAQAogLyogcmV0dXJuIGNhcF9vZmZzZXQgaWYgcmVxdWVzdGVkIGNhcGFiaWxpdHkgZXhpc3RzIGluIHRoZSBQQ0kgY29uZmlnIHNwYWNlICovCiAvKiBOb3RlIHRoYXQgaXQncyBjYWxsZXIncyByZXNwb25zaWJpbGl0eSB0byBtYWtlIHN1cmUgaXQncyBhIHBjaSBidXMgKi8KIHU4Ci1wY2ljb3JlX2ZpbmRfcGNpX2NhcGFiaWxpdHkob3NsX3QgKm9zaCwgdTggcmVxX2NhcF9pZCwgdW5zaWduZWQgY2hhciAqYnVmLAotCQkJICAgIHUzMiAqYnVmbGVuKQorcGNpY29yZV9maW5kX3BjaV9jYXBhYmlsaXR5KHN0cnVjdCBvc2xfaW5mbyAqb3NoLCB1OCByZXFfY2FwX2lkLAorCQkJICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZiwgdTMyICpidWZsZW4pCiB7CiAJdTggY2FwX2lkOwogCXU4IGNhcF9wdHIgPSAwOwpAQCAtMTU4LDI5ICsxMzEsMjkgQEAKIAl1OCBieXRlX3ZhbDsKIAogCS8qIGNoZWNrIGZvciBIZWFkZXIgdHlwZSAwICovCi0JYnl0ZV92YWwgPSByZWFkX3BjaV9jZmdfYnl0ZShQQ0lfQ0ZHX0hEUik7CisJcGNpX3JlYWRfY29uZmlnX2J5dGUob3NoLT5wZGV2LCBQQ0lfQ0ZHX0hEUiwgJmJ5dGVfdmFsKTsKIAlpZiAoKGJ5dGVfdmFsICYgMHg3ZikgIT0gUENJX0hFQURFUl9OT1JNQUwpCiAJCWdvdG8gZW5kOwogCiAJLyogY2hlY2sgaWYgdGhlIGNhcGFiaWxpdHkgcG9pbnRlciBmaWVsZCBleGlzdHMgKi8KLQlieXRlX3ZhbCA9IHJlYWRfcGNpX2NmZ19ieXRlKFBDSV9DRkdfU1RBVCk7CisJcGNpX3JlYWRfY29uZmlnX2J5dGUob3NoLT5wZGV2LCBQQ0lfQ0ZHX1NUQVQsICZieXRlX3ZhbCk7CiAJaWYgKCEoYnl0ZV92YWwgJiBQQ0lfQ0FQUFRSX1BSRVNFTlQpKQogCQlnb3RvIGVuZDsKIAotCWNhcF9wdHIgPSByZWFkX3BjaV9jZmdfYnl0ZShQQ0lfQ0ZHX0NBUFBUUik7CisJcGNpX3JlYWRfY29uZmlnX2J5dGUob3NoLT5wZGV2LCBQQ0lfQ0ZHX0NBUFBUUiwgJmNhcF9wdHIpOwogCS8qIGNoZWNrIGlmIHRoZSBjYXBhYmlsaXR5IHBvaW50ZXIgaXMgMHgwMCAqLwogCWlmIChjYXBfcHRyID09IDB4MDApCiAJCWdvdG8gZW5kOwogCiAJLyogbG9vcCB0aHIndSB0aGUgY2FwYWJpbGl0eSBsaXN0IGFuZCBzZWUgaWYgdGhlIHBjaWUgY2FwYWJpbHR5IGV4aXN0cyAqLwogCi0JY2FwX2lkID0gcmVhZF9wY2lfY2ZnX2J5dGUoY2FwX3B0cik7CisJcGNpX3JlYWRfY29uZmlnX2J5dGUob3NoLT5wZGV2LCBjYXBfcHRyLCAmY2FwX2lkKTsKIAogCXdoaWxlIChjYXBfaWQgIT0gcmVxX2NhcF9pZCkgewotCQljYXBfcHRyID0gcmVhZF9wY2lfY2ZnX2J5dGUoKGNhcF9wdHIgKyAxKSk7CisJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKG9zaC0+cGRldiwgY2FwX3B0ciArIDEsICZjYXBfcHRyKTsKIAkJaWYgKGNhcF9wdHIgPT0gMHgwMCkKIAkJCWJyZWFrOwotCQljYXBfaWQgPSByZWFkX3BjaV9jZmdfYnl0ZShjYXBfcHRyKTsKKwkJcGNpX3JlYWRfY29uZmlnX2J5dGUob3NoLT5wZGV2LCBjYXBfcHRyLCAmY2FwX2lkKTsKIAl9CiAJaWYgKGNhcF9pZCAhPSByZXFfY2FwX2lkKSB7CiAJCWdvdG8gZW5kOwpAQCAtMTk5LDcgKzE3Miw3IEBACiAJCQlidWZzaXplID0gU1pQQ1IgLSBjYXBfZGF0YTsKIAkJKmJ1ZmxlbiA9IGJ1ZnNpemU7CiAJCXdoaWxlIChidWZzaXplLS0pIHsKLQkJCSpidWYgPSByZWFkX3BjaV9jZmdfYnl0ZShjYXBfZGF0YSk7CisJCQlwY2lfcmVhZF9jb25maWdfYnl0ZShvc2gtPnBkZXYsIGNhcF9kYXRhLCBidWYpOwogCQkJY2FwX2RhdGErKzsKIAkJCWJ1ZisrOwogCQl9CkBAIC0yMTAsNyArMTgzLDggQEAKIAogLyogKioqKiogUmVnaXN0ZXIgQWNjZXNzIEFQSSAqLwogdWludAotcGNpZV9yZWFkcmVnKG9zbF90ICpvc2gsIHNicGNpZXJlZ3NfdCAqcGNpZXJlZ3MsIHVpbnQgYWRkcnR5cGUsIHVpbnQgb2Zmc2V0KQorcGNpZV9yZWFkcmVnKHN0cnVjdCBvc2xfaW5mbyAqb3NoLCBzYnBjaWVyZWdzX3QgKnBjaWVyZWdzLCB1aW50IGFkZHJ0eXBlLAorCSAgICAgdWludCBvZmZzZXQpCiB7CiAJdWludCByZXR2YWwgPSAweEZGRkZGRkZGOwogCkBAIC0yMzYsOCArMjEwLDggQEAKIH0KIAogdWludAotcGNpZV93cml0ZXJlZyhvc2xfdCAqb3NoLCBzYnBjaWVyZWdzX3QgKnBjaWVyZWdzLCB1aW50IGFkZHJ0eXBlLCB1aW50IG9mZnNldCwKLQkgICAgICB1aW50IHZhbCkKK3BjaWVfd3JpdGVyZWcoc3RydWN0IG9zbF9pbmZvICpvc2gsIHNicGNpZXJlZ3NfdCAqcGNpZXJlZ3MsIHVpbnQgYWRkcnR5cGUsCisJICAgICAgdWludCBvZmZzZXQsIHVpbnQgdmFsKQogewogCUFTU0VSVChwY2llcmVncyAhPSBOVUxMKTsKIApAQCAtMzczLDE1ICszNDcsMTUgQEAKIAlpZiAoIW9mZnNldCkKIAkJcmV0dXJuIDA7CiAKLQlyZWdfdmFsID0gT1NMX1BDSV9SRUFEX0NPTkZJRyhwaS0+b3NoLCBvZmZzZXQsIHNpemVvZih1MzIpKTsKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQocGktPm9zaC0+cGRldiwgb2Zmc2V0LCAmcmVnX3ZhbCk7CiAJLyogc2V0IG9wZXJhdGlvbiAqLwogCWlmIChtYXNrKSB7CiAJCWlmICh2YWwpCiAJCQlyZWdfdmFsIHw9IFBDSUVfQ0xLUkVRX0VOQUI7CiAJCWVsc2UKIAkJCXJlZ192YWwgJj0gflBDSUVfQ0xLUkVRX0VOQUI7Ci0JCU9TTF9QQ0lfV1JJVEVfQ09ORklHKHBpLT5vc2gsIG9mZnNldCwgc2l6ZW9mKHUzMiksIHJlZ192YWwpOwotCQlyZWdfdmFsID0gT1NMX1BDSV9SRUFEX0NPTkZJRyhwaS0+b3NoLCBvZmZzZXQsIHNpemVvZih1MzIpKTsKKwkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwaS0+b3NoLT5wZGV2LCBvZmZzZXQsIHJlZ192YWwpOworCQlwY2lfcmVhZF9jb25maWdfZHdvcmQocGktPm9zaC0+cGRldiwgb2Zmc2V0LCAmcmVnX3ZhbCk7CiAJfQogCWlmIChyZWdfdmFsICYgUENJRV9DTEtSRVFfRU5BQikKIAkJcmV0dXJuIDE7CkBAIC0zOTMsNyArMzY3LDcgQEAKIHsKIAl1MzIgdzsKIAlzaV90ICpzaWggPSBwaS0+c2loOwotCW9zbF90ICpvc2ggPSBwaS0+b3NoOworCXN0cnVjdCBvc2xfaW5mbyAqb3NoID0gcGktPm9zaDsKIAlzYnBjaWVyZWdzX3QgKnBjaWVyZWdzID0gcGktPnJlZ3MucGNpZXJlZ3M7CiAKIAlpZiAoIVBDSUVfUFVCKHNpaCkgfHwgc2loLT5idXNjb3JlcmV2IDwgNykKQEAgLTUwMiwxMiArNDc2LDEyIEBACiAKIAkJV19SRUcocGktPm9zaCwgcmVnMTYsIHZhbDE2KTsKIAotCQl3ID0gT1NMX1BDSV9SRUFEX0NPTkZJRyhwaS0+b3NoLCBwaS0+cGNpZWNhcF9sY3JlZ19vZmZzZXQsCi0JCQkJCXNpemVvZih1MzIpKTsKKwkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBpLT5vc2gtPnBkZXYsIHBpLT5wY2llY2FwX2xjcmVnX29mZnNldCwKKwkJCQkJJncpOwogCQl3ICY9IH5QQ0lFX0FTUE1fRU5BQjsKIAkJdyB8PSBwaS0+cGNpZV93YXJfYXNwbV9vdnI7Ci0JCU9TTF9QQ0lfV1JJVEVfQ09ORklHKHBpLT5vc2gsIHBpLT5wY2llY2FwX2xjcmVnX29mZnNldCwKLQkJCQkgICAgIHNpemVvZih1MzIpLCB3KTsKKwkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwaS0+b3NoLT5wZGV2LAorCQkJCQlwaS0+cGNpZWNhcF9sY3JlZ19vZmZzZXQsIHcpOwogCX0KIAogCXJlZzE2ID0gJnBjaWVyZWdzLT5zcHJvbVtTUlNIX0NMS1JFUV9PRkZTRVRfUkVWNV07CkBAIC01NzcsNyArNTUxLDcgQEAKIHN0YXRpYyB2b2lkIHBjaWVfd2FyX3BjaV9zZXR1cChwY2ljb3JlX2luZm9fdCAqcGkpCiB7CiAJc2lfdCAqc2loID0gcGktPnNpaDsKLQlvc2xfdCAqb3NoID0gcGktPm9zaDsKKwlzdHJ1Y3Qgb3NsX2luZm8gKm9zaCA9IHBpLT5vc2g7CiAJc2JwY2llcmVnc190ICpwY2llcmVncyA9IHBpLT5yZWdzLnBjaWVyZWdzOwogCXUzMiB3OwogCkBAIC02OTQsMTEgKzY2OCw5IEBACiAJaWYgKCFwaSB8fCAhUENJRV9BU1BNKHBpLT5zaWgpKQogCQlyZXR1cm47CiAKLQl3ID0gT1NMX1BDSV9SRUFEX0NPTkZJRyhwaS0+b3NoLCBwaS0+cGNpZWNhcF9sY3JlZ19vZmZzZXQsCi0JCQkJc2l6ZW9mKHUzMikpOworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwaS0+b3NoLT5wZGV2LCBwaS0+cGNpZWNhcF9sY3JlZ19vZmZzZXQsICZ3KTsKIAl3ICY9IH5QQ0lFX0NBUF9MQ1JFR19BU1BNTDE7Ci0JT1NMX1BDSV9XUklURV9DT05GSUcocGktPm9zaCwgcGktPnBjaWVjYXBfbGNyZWdfb2Zmc2V0LCBzaXplb2YodTMyKSwKLQkJCSAgICAgdyk7CisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwaS0+b3NoLT5wZGV2LCBwaS0+cGNpZWNhcF9sY3JlZ19vZmZzZXQsIHcpOwogCiAJcGktPnBjaWVfcHI0Mjc2NyA9IGZhbHNlOwogfQpAQCAtNzE4LDcgKzY5MCw3IEBACiAKIC8qICoqKioqIFdha2Utb24td2lyZWxlc3MtTEFOIChXT1dMKSBzdXBwb3J0IGZ1bmN0aW9ucyAqKioqKiAqLwogLyogSnVzdCB1c2VzIFBDSSBjb25maWcgYWNjZXNzZXMgdG8gZmluZCBvdXQsIHdoZW4gbmVlZGVkIGJlZm9yZSBzYl9hdHRhY2ggaXMgZG9uZSAqLwotYm9vbCBwY2ljb3JlX3BtZWNhcF9mYXN0KG9zbF90ICpvc2gpCitib29sIHBjaWNvcmVfcG1lY2FwX2Zhc3Qoc3RydWN0IG9zbF9pbmZvICpvc2gpCiB7CiAJdTggY2FwX3B0cjsKIAl1MzIgcG1lY2FwOwpAQCAtNzMwLDcgKzcwMiw3IEBACiAJaWYgKCFjYXBfcHRyKQogCQlyZXR1cm4gZmFsc2U7CiAKLQlwbWVjYXAgPSBPU0xfUENJX1JFQURfQ09ORklHKG9zaCwgY2FwX3B0ciwgc2l6ZW9mKHUzMikpOworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChvc2gtPnBkZXYsIGNhcF9wdHIsICZwbWVjYXApOwogCiAJcmV0dXJuIChwbWVjYXAgJiBQTUVfQ0FQX1BNX1NUQVRFUykgIT0gMDsKIH0KQEAgLTc1Myw5ICs3MjUsOCBAQAogCiAJCXBpLT5wbWVjYXBfb2Zmc2V0ID0gY2FwX3B0cjsKIAotCQlwbWVjYXAgPQotCQkgICAgT1NMX1BDSV9SRUFEX0NPTkZJRyhwaS0+b3NoLCBwaS0+cG1lY2FwX29mZnNldCwKLQkJCQkJc2l6ZW9mKHUzMikpOworCQlwY2lfcmVhZF9jb25maWdfZHdvcmQocGktPm9zaC0+cGRldiwgcGktPnBtZWNhcF9vZmZzZXQsCisJCQkJCSZwbWVjYXApOwogCiAJCS8qIEF0IGxlYXN0IG9uZSBzdGF0ZSBjYW4gZ2VuZXJhdGUgUE1FICovCiAJCXBpLT5wbWVjYXAgPSAocG1lY2FwICYgUE1FX0NBUF9QTV9TVEFURVMpICE9IDA7CkBAIC03NzQsMTEgKzc0NSwxMSBAQAogCWlmICghcGNpY29yZV9wbWVjYXAocGkpKQogCQlyZXR1cm47CiAKLQl3ID0gT1NMX1BDSV9SRUFEX0NPTkZJRyhwaS0+b3NoLCBwaS0+cG1lY2FwX29mZnNldCArIFBNRV9DU1JfT0ZGU0VULAotCQkJCXNpemVvZih1MzIpKTsKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQocGktPm9zaC0+cGRldiwgcGktPnBtZWNhcF9vZmZzZXQgKyBQTUVfQ1NSX09GRlNFVCwKKwkJCQkmdyk7CiAJdyB8PSAoUE1FX0NTUl9QTUVfRU4pOwotCU9TTF9QQ0lfV1JJVEVfQ09ORklHKHBpLT5vc2gsIHBpLT5wbWVjYXBfb2Zmc2V0ICsgUE1FX0NTUl9PRkZTRVQsCi0JCQkgICAgIHNpemVvZih1MzIpLCB3KTsKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBpLT5vc2gtPnBkZXYsCisJCQkJcGktPnBtZWNhcF9vZmZzZXQgKyBQTUVfQ1NSX09GRlNFVCwgdyk7CiB9CiAKIC8qCkBAIC03OTIsOCArNzYzLDggQEAKIAlpZiAoIXBjaWNvcmVfcG1lY2FwKHBpKSkKIAkJcmV0dXJuIGZhbHNlOwogCi0JdyA9IE9TTF9QQ0lfUkVBRF9DT05GSUcocGktPm9zaCwgcGktPnBtZWNhcF9vZmZzZXQgKyBQTUVfQ1NSX09GRlNFVCwKLQkJCQlzaXplb2YodTMyKSk7CisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBpLT5vc2gtPnBkZXYsIHBpLT5wbWVjYXBfb2Zmc2V0ICsgUE1FX0NTUl9PRkZTRVQsCisJCQkJJncpOwogCiAJcmV0dXJuICh3ICYgUE1FX0NTUl9QTUVfU1RBVCkgPT0gUE1FX0NTUl9QTUVfU1RBVDsKIH0KQEAgLTgwOCwyMiArNzc5LDIzIEBACiAJaWYgKCFwY2ljb3JlX3BtZWNhcChwaSkpCiAJCXJldHVybjsKIAotCXcgPSBPU0xfUENJX1JFQURfQ09ORklHKHBpLT5vc2gsIHBpLT5wbWVjYXBfb2Zmc2V0ICsgUE1FX0NTUl9PRkZTRVQsCi0JCQkJc2l6ZW9mKHUzMikpOworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwaS0+b3NoLT5wZGV2LCBwaS0+cG1lY2FwX29mZnNldCArIFBNRV9DU1JfT0ZGU0VULAorCQkJCSZ3KTsKIAogCVBDSV9FUlJPUigoInBjaWNvcmVfcGNpX3BtZWNsciBQTUVDU1IgOiAweCV4XG4iLCB3KSk7CiAKIAkvKiBQTUVTVEFUIGlzIGNsZWFyZWQgYnkgd3JpdGluZyAxIHRvIGl0ICovCiAJdyAmPSB+KFBNRV9DU1JfUE1FX0VOKTsKIAotCU9TTF9QQ0lfV1JJVEVfQ09ORklHKHBpLT5vc2gsIHBpLT5wbWVjYXBfb2Zmc2V0ICsgUE1FX0NTUl9PRkZTRVQsCi0JCQkgICAgIHNpemVvZih1MzIpLCB3KTsKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBpLT5vc2gtPnBkZXYsCisJCQkJcGktPnBtZWNhcF9vZmZzZXQgKyBQTUVfQ1NSX09GRlNFVCwgdyk7CiB9CiAKIHUzMiBwY2llX2xjcmVnKHZvaWQgKnBjaCwgdTMyIG1hc2ssIHUzMiB2YWwpCiB7CiAJcGNpY29yZV9pbmZvX3QgKnBpID0gKHBjaWNvcmVfaW5mb190ICopIHBjaDsKIAl1OCBvZmZzZXQ7CisJdTMyIHRtcHZhbDsKIAogCW9mZnNldCA9IHBpLT5wY2llY2FwX2xjcmVnX29mZnNldDsKIAlpZiAoIW9mZnNldCkKQEAgLTgzMSw5ICs4MDMsMTAgQEAKIAogCS8qIHNldCBvcGVyYXRpb24gKi8KIAlpZiAobWFzaykKLQkJT1NMX1BDSV9XUklURV9DT05GSUcocGktPm9zaCwgb2Zmc2V0LCBzaXplb2YodTMyKSwgdmFsKTsKKwkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwaS0+b3NoLT5wZGV2LCBvZmZzZXQsIHZhbCk7CiAKLQlyZXR1cm4gT1NMX1BDSV9SRUFEX0NPTkZJRyhwaS0+b3NoLCBvZmZzZXQsIHNpemVvZih1MzIpKTsKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQocGktPm9zaC0+cGRldiwgb2Zmc2V0LCAmdG1wdmFsKTsKKwlyZXR1cm4gdG1wdmFsOwogfQogCiB1MzIKQEAgLTg0Miw3ICs4MTUsNyBAQAogCXUzMiByZWdfdmFsID0gMDsKIAlwY2ljb3JlX2luZm9fdCAqcGkgPSAocGNpY29yZV9pbmZvX3QgKikgcGNoOwogCXNicGNpZXJlZ3NfdCAqcGNpZXJlZ3MgPSBwaS0+cmVncy5wY2llcmVnczsKLQlvc2xfdCAqb3NoID0gcGktPm9zaDsKKwlzdHJ1Y3Qgb3NsX2luZm8gKm9zaCA9IHBpLT5vc2g7CiAKIAlpZiAobWFzaykgewogCQlQQ0lfRVJST1IoKCJQQ0lFUkVHOiAweCV4IHdyaXRldmFsICAweCV4XG4iLCBvZmZzZXQsIHZhbCkpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS91dGlsL252cmFtL252cmFtX3JvLmMgYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3V0aWwvbnZyYW0vbnZyYW1fcm8uYwppbmRleCBmODAzNzVjLi5lNGQ0MWVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3V0aWwvbnZyYW0vbnZyYW1fcm8uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3V0aWwvbnZyYW0vbnZyYW1fcm8uYwpAQCAtNDksNyArNDksNyBAQAogLyogY29weSBmbGFzaCB0byByYW0gKi8KIHN0YXRpYyB2b2lkIGdldF9mbGFzaF9udnJhbShzaV90ICpzaWgsIHN0cnVjdCBudnJhbV9oZWFkZXIgKm52aCkKIHsKLQlvc2xfdCAqb3NoOworCXN0cnVjdCBvc2xfaW5mbyAqb3NoOwogCXVpbnQgbnZzLCBidWZzejsKIAl2YXJzX3QgKm5ldzsKIApAQCAtMTMzLDcgKzEzMyw3IEBACiAJbGVuID0gc3RybGVuKG5hbWUpOwogCiAJZm9yIChzID0gdmFyczsgKHMgPCBsaW0pICYmICpzOykgewotCQlpZiAoKGJjbXAocywgbmFtZSwgbGVuKSA9PSAwKSAmJiAoc1tsZW5dID09ICc9JykpCisJCWlmICgobWVtY21wKHMsIG5hbWUsIGxlbikgPT0gMCkgJiYgKHNbbGVuXSA9PSAnPScpKQogCQkJcmV0dXJuICZzW2xlbiArIDFdOwogCiAJCXdoaWxlICgqcysrKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS91dGlsL3NidXRpbHMuYyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvdXRpbC9zYnV0aWxzLmMKaW5kZXggZTRjMGJhYi4uNjNjM2FiMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS91dGlsL3NidXRpbHMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3V0aWwvc2J1dGlscy5jCkBAIC0xNiw2ICsxNiw5IEBACiAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGJjbWRlZnMuaD4KKyNpZmRlZiBCUkNNX0ZVTExNQUMKKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNlbmRpZgogI2luY2x1ZGUgPG9zbC5oPgogI2luY2x1ZGUgPGJjbXV0aWxzLmg+CiAjaW5jbHVkZSA8c2l1dGlscy5oPgpAQCAtODcsNyArOTAsNyBAQAogewogCXUzMiBzYmFkZHIgPSAwOwogCi0Jc3dpdGNoIChCVVNUWVBFKHNpaS0+cHViLmJ1c3R5cGUpKSB7CisJc3dpdGNoIChzaWktPnB1Yi5idXN0eXBlKSB7CiAJY2FzZSBTUElfQlVTOgogCWNhc2UgU0RJT19CVVM6CiAJCXNiYWRkciA9ICh1MzIpKHVuc2lnbmVkIGxvbmcpc2lpLT5jdXJtYXA7CkBAIC0yNDgsNyArMjUxLDcgQEAKIAkJCWVsc2UgewogCQkJCS8qIE9sZGVyIGNoaXBzICovCiAJCQkJU0lfRVJST1IoKCJzYl9jaGlwMm51bWNvcmVzOiB1bnN1cHBvcnRlZCBjaGlwICIKLQkJCQkJIjB4JXhcbiIsIENISVBJRChzaWktPnB1Yi5jaGlwKSkpOworCQkJCQkJICAiMHgleFxuIiwgc2lpLT5wdWIuY2hpcCkpOwogCQkJCUFTU0VSVCgwKTsKIAkJCQludW1jb3JlcyA9IDE7CiAJCQl9CkBAIC0zNDQsNyArMzQ3LDcgQEAKIAl1MzIgc2JhZGRyID0gc2lpLT5jb3Jlc2JhW2NvcmVpZHhdOwogCXZvaWQgKnJlZ3M7CiAKLQlzd2l0Y2ggKEJVU1RZUEUoc2lpLT5wdWIuYnVzdHlwZSkpIHsKKwlzd2l0Y2ggKHNpaS0+cHViLmJ1c3R5cGUpIHsKICNpZmRlZiBCQ01TRElPCiAJY2FzZSBTUElfQlVTOgogCWNhc2UgU0RJT19CVVM6CkBAIC00MDksOCArNDEyLDggQEAKIAogCXNpaSA9IFNJX0lORk8oc2loKTsKIAotCWlmICgoQlVTVFlQRShzaWktPnB1Yi5idXN0eXBlKSA9PSBTRElPX0JVUykgfHwKLQkgICAgKEJVU1RZUEUoc2lpLT5wdWIuYnVzdHlwZSkgPT0gU1BJX0JVUykpIHsKKwlpZiAoKHNpaS0+cHViLmJ1c3R5cGUgPT0gU0RJT19CVVMpIHx8CisJICAgIChzaWktPnB1Yi5idXN0eXBlID09IFNQSV9CVVMpKSB7CiAKIAkJSU5UUl9PRkYoc2lpLCBpbnRyX3ZhbCk7CiAJCW9yaWdpZHggPSBzaV9jb3JlaWR4KHNpaCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3V0aWwvc2l1dGlscy5jIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS91dGlsL3NpdXRpbHMuYwppbmRleCBmM2VhN2UxLi5iNjZkZTliIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL3V0aWwvc2l1dGlscy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvdXRpbC9zaXV0aWxzLmMKQEAgLTE0LDExICsxNCwxNiBAQAogICogQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KICAqLwogCisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxiY21kZWZzLmg+CisjaWZkZWYgQlJDTV9GVUxMTUFDCisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjZW5kaWYKICNpbmNsdWRlIDxvc2wuaD4KLSNpbmNsdWRlIDxsaW51eHZlci5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGJjbXV0aWxzLmg+CiAjaW5jbHVkZSA8c2l1dGlscy5oPgogI2luY2x1ZGUgPGJjbWRldnMuaD4KQEAgLTUzLDcgKzU4LDcgQEAKICNlbmRpZgogCiAvKiBsb2NhbCBwcm90b3R5cGVzICovCi1zdGF0aWMgc2lfaW5mb190ICpzaV9kb2F0dGFjaChzaV9pbmZvX3QgKnNpaSwgdWludCBkZXZpZCwgb3NsX3QgKm9zaCwKK3N0YXRpYyBzaV9pbmZvX3QgKnNpX2RvYXR0YWNoKHNpX2luZm9fdCAqc2lpLCB1aW50IGRldmlkLCBzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwKIAkJCSAgICAgIHZvaWQgKnJlZ3MsIHVpbnQgYnVzdHlwZSwgdm9pZCAqc2RoLCBjaGFyICoqdmFycywKIAkJCSAgICAgIHVpbnQgKnZhcnN6KTsKIHN0YXRpYyBib29sIHNpX2J1c2NvcmVfcHJlcChzaV9pbmZvX3QgKnNpaSwgdWludCBidXN0eXBlLCB1aW50IGRldmlkLApAQCAtODEsOCArODYsOCBAQAogICogdmFycyAtIHBvaW50ZXIgdG8gYSBwb2ludGVyIGFyZWEgZm9yICJlbnZpcm9ubWVudCIgdmFyaWFibGVzCiAgKiB2YXJzeiAtIHBvaW50ZXIgdG8gaW50IHRvIHJldHVybiB0aGUgc2l6ZSBvZiB0aGUgdmFycwogICovCi1zaV90ICpzaV9hdHRhY2godWludCBkZXZpZCwgb3NsX3QgKm9zaCwgdm9pZCAqcmVncywgdWludCBidXN0eXBlLCB2b2lkICpzZGgsCi0JCWNoYXIgKip2YXJzLCB1aW50ICp2YXJzeikKK3NpX3QgKnNpX2F0dGFjaCh1aW50IGRldmlkLCBzdHJ1Y3Qgb3NsX2luZm8gKm9zaCwgdm9pZCAqcmVncywgdWludCBidXN0eXBlLAorCQl2b2lkICpzZGgsIGNoYXIgKip2YXJzLCB1aW50ICp2YXJzeikKIHsKIAlzaV9pbmZvX3QgKnNpaTsKIApAQCAtMTEzLDEyICsxMTgsMTIgQEAKIAogI2lmbmRlZiBCUkNNX0ZVTExNQUMKIAkvKiBrbHVkZ2UgdG8gZW5hYmxlIHRoZSBjbG9jayBvbiB0aGUgNDMwNiB3aGljaCBsYWNrcyBhIHNsb3djbG9jayAqLwotCWlmIChCVVNUWVBFKGJ1c3R5cGUpID09IFBDSV9CVVMgJiYgIXNpX2lzcGNpZShzaWkpKQorCWlmIChidXN0eXBlID09IFBDSV9CVVMgJiYgIXNpX2lzcGNpZShzaWkpKQogCQlzaV9jbGtjdGxfeHRhbCgmc2lpLT5wdWIsIFhUQUwgfCBQTEwsIE9OKTsKICNlbmRpZgogCiAjaWYgZGVmaW5lZChCQ01TRElPKQotCWlmIChCVVNUWVBFKGJ1c3R5cGUpID09IFNESU9fQlVTKSB7CisJaWYgKGJ1c3R5cGUgPT0gU0RJT19CVVMpIHsKIAkJaW50IGVycjsKIAkJdTggY2xrc2V0OwogCkBAIC0yMjAsNyArMjI1LDcgQEAKIAkJU0lfVk1TRygoIkNPUkVbJWRdOiBpZCAweCV4IHJldiAlZCBiYXNlIDB4JXggcmVncyAweCVwXG4iLAogCQkJIGksIGNpZCwgY3Jldiwgc2lpLT5jb3Jlc2JhW2ldLCBzaWktPnJlZ3NbaV0pKTsKIAotCQlpZiAoQlVTVFlQRShidXN0eXBlKSA9PSBQQ0lfQlVTKSB7CisJCWlmIChidXN0eXBlID09IFBDSV9CVVMpIHsKIAkJCWlmIChjaWQgPT0gUENJX0NPUkVfSUQpIHsKIAkJCQlwY2lpZHggPSBpOwogCQkJCXBjaXJldiA9IGNyZXY7CkBAIC0yMzIsOCArMjM3LDggQEAKIAkJCX0KIAkJfQogI2lmZGVmIEJDTVNESU8KLQkJZWxzZSBpZiAoKChCVVNUWVBFKGJ1c3R5cGUpID09IFNESU9fQlVTKSB8fAotCQkJICAoQlVTVFlQRShidXN0eXBlKSA9PSBTUElfQlVTKSkgJiYKKwkJZWxzZSBpZiAoKChidXN0eXBlID09IFNESU9fQlVTKSB8fAorCQkJICAoYnVzdHlwZSA9PSBTUElfQlVTKSkgJiYKIAkJCSAoKGNpZCA9PSBQQ01DSUFfQ09SRV9JRCkgfHwgKGNpZCA9PSBTRElPRF9DT1JFX0lEKSkpIHsKIAkJCXNpaS0+cHViLmJ1c2NvcmVyZXYgPSBjcmV2OwogCQkJc2lpLT5wdWIuYnVzY29yZXR5cGUgPSBjaWQ7CkBAIC0yNTUsNyArMjYwLDcgQEAKIAkqIG9yIGRvd25sb2FkZWQgY29kZSB3YXMKIAkqIGFscmVhZHkgcnVubmluZy4KIAkqLwotCWlmICgoQlVTVFlQRShidXN0eXBlKSA9PSBTRElPX0JVUykgfHwgKEJVU1RZUEUoYnVzdHlwZSkgPT0gU1BJX0JVUykpIHsKKwlpZiAoKGJ1c3R5cGUgPT0gU0RJT19CVVMpIHx8IChidXN0eXBlID09IFNQSV9CVVMpKSB7CiAJCWlmIChzaV9zZXRjb3JlKCZzaWktPnB1YiwgQVJNN1NfQ09SRV9JRCwgMCkgfHwKIAkJCXNpX3NldGNvcmUoJnNpaS0+cHViLCBBUk1DTTNfQ09SRV9JRCwgMCkpCiAJCQlzaV9jb3JlX2Rpc2FibGUoJnNpaS0+cHViLCAwKTsKQEAgLTI4MSw3ICsyODYsNyBAQAogCQkgc2lpLT5wdWIuYnVzY29yZXR5cGUsIHNpaS0+cHViLmJ1c2NvcmVyZXYpKTsKIAogCS8qIGZpeHVwIG5lY2Vzc2FyeSBjaGlwL2NvcmUgY29uZmlndXJhdGlvbnMgKi8KLQlpZiAoQlVTVFlQRShzaWktPnB1Yi5idXN0eXBlKSA9PSBQQ0lfQlVTKSB7CisJaWYgKHNpaS0+cHViLmJ1c3R5cGUgPT0gUENJX0JVUykgewogCQlpZiAoU0lfRkFTVChzaWkpKSB7CiAJCQlpZiAoIXNpaS0+cGNoKSB7CiAJCQkJc2lpLT5wY2ggPSAodm9pZCAqKXBjaWNvcmVfaW5pdCgKQEAgLTMwOCwxMCArMzEzLDEwIEBACiAJdWludCB3ID0gMDsKIAogCS8qIGdldCBib2FyZHR5cGUgYW5kIGJvYXJkcmV2ICovCi0Jc3dpdGNoIChCVVNUWVBFKHNpaS0+cHViLmJ1c3R5cGUpKSB7CisJc3dpdGNoIChzaWktPnB1Yi5idXN0eXBlKSB7CiAJY2FzZSBQQ0lfQlVTOgogCQkvKiBkbyBhIHBjaSBjb25maWcgcmVhZCB0byBnZXQgc3Vic3lzdGVtIGlkIGFuZCBzdWJ2ZW5kb3IgaWQgKi8KLQkJdyA9IE9TTF9QQ0lfUkVBRF9DT05GSUcoc2lpLT5vc2gsIFBDSV9DRkdfU1ZJRCwgc2l6ZW9mKHUzMikpOworCQlwY2lfcmVhZF9jb25maWdfZHdvcmQoc2lpLT5vc2gtPnBkZXYsIFBDSV9DRkdfU1ZJRCwgJncpOwogCQkvKiBMZXQgbnZyYW0gdmFyaWFibGVzIG92ZXJyaWRlIHN1YnN5c3RlbSBWZW5kL0lEICovCiAJCXNpaS0+cHViLmJvYXJkdmVuZG9yID0gKHUxNilzaV9nZXRkZXZwYXRoaW50dmFyKCZzaWktPnB1YiwKIAkJCSJib2FyZHZlbmRvciIpOwpAQCAtMzY0LDcgKzM2OSw3IEBACiAvKiB0aGlzIGlzIHdpbGwgbWFrZSBTb25pY3MgY2FsbHMgZGlyZWN0bHksIHNpbmNlIFNvbmljcyBpcyBubyBsb25nZXIgc3VwcG9ydGVkIGluIHRoZSBTaSBhYnN0cmFjdGlvbiAqLwogLyogdGhpcyBoYXMgYmVlbiBjdXN0b21pemVkIGZvciB0aGUgYmNtIDQzMjkgT05MWSAqLwogI2lmZGVmIEJDTVNESU8KLXN0YXRpYyBzaV9pbmZvX3QgKnNpX2RvYXR0YWNoKHNpX2luZm9fdCAqc2lpLCB1aW50IGRldmlkLCBvc2xfdCAqb3NoLAorc3RhdGljIHNpX2luZm9fdCAqc2lfZG9hdHRhY2goc2lfaW5mb190ICpzaWksIHVpbnQgZGV2aWQsIHN0cnVjdCBvc2xfaW5mbyAqb3NoLAogCQkJICAgICAgdm9pZCAqcmVncywgdWludCBidXN0eXBlLCB2b2lkICpzZGgsCiAJCQkgICAgICBjaGFyICoqdmFycywgdWludCAqdmFyc3opCiB7CkBAIC0zNzYsNyArMzgxLDcgQEAKIAogCUFTU0VSVChHT09EUkVHUyhyZWdzKSk7CiAKLQliemVybygodW5zaWduZWQgY2hhciAqKSBzaWksIHNpemVvZihzaV9pbmZvX3QpKTsKKwltZW1zZXQoKHVuc2lnbmVkIGNoYXIgKikgc2lpLCAwLCBzaXplb2Yoc2lfaW5mb190KSk7CiAKIAlzYXZld2luID0gMDsKIApAQCAtMzkwLDExICszOTUsNiBAQAogCWNjID0gKGNoaXBjcmVnc190ICopIHNpaS0+Y3VybWFwOwogCXNpaC0+YnVzdHlwZSA9IGJ1c3R5cGU7CiAKLQlpZiAoYnVzdHlwZSAhPSBCVVNUWVBFKGJ1c3R5cGUpKSB7Ci0JCVNJX0VSUk9SKCgic2lfZG9hdHRhY2g6IGJ1cyB0eXBlICVkIGRvZXMgbm90IG1hdGNoIGNvbmZpZ3VyZWQgYnVzIHR5cGUgJWRcbiIsIGJ1c3R5cGUsIEJVU1RZUEUoYnVzdHlwZSkpKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCiAJLyogYnVzL2NvcmUvY2xrIHNldHVwIGZvciByZWdpc3RlciBhY2Nlc3MgKi8KIAlpZiAoIXNpX2J1c2NvcmVfcHJlcChzaWksIGJ1c3R5cGUsIGRldmlkLCBzZGgpKSB7CiAJCVNJX0VSUk9SKCgic2lfZG9hdHRhY2g6IHNpX2NvcmVfY2xrX3ByZXAgZmFpbGVkICVkXG4iLApAQCAtNDE0LDcgKzQxNCw3IEBACiAJc2loLT5jaGlwcmV2ID0gKHcgJiBDSURfUkVWX01BU0spID4+IENJRF9SRVZfU0hJRlQ7CiAJc2loLT5jaGlwcGtnID0gKHcgJiBDSURfUEtHX01BU0spID4+IENJRF9QS0dfU0hJRlQ7CiAKLQlpZiAoKENISVBJRChzaWgtPmNoaXApID09IEJDTTQzMjlfQ0hJUF9JRCkgJiYKKwlpZiAoKHNpaC0+Y2hpcCA9PSBCQ000MzI5X0NISVBfSUQpICYmCiAJCShzaWgtPmNoaXBwa2cgIT0gQkNNNDMyOV8yODlQSU5fUEtHX0lEKSkKIAkJCXNpaC0+Y2hpcHBrZyA9IEJDTTQzMjlfMTgyUElOX1BLR19JRDsKIApAQCAtNDQ0LDcgKzQ0NCw3IEBACiAKIAkvKiBJbml0IG52cmFtIGZyb20gc3Byb20vb3RwIGlmIHRoZXkgZXhpc3QgKi8KIAlpZiAoc3JvbV92YXJfaW5pdAotCSAgICAoJnNpaS0+cHViLCBCVVNUWVBFKGJ1c3R5cGUpLCByZWdzLCBzaWktPm9zaCwgdmFycywgdmFyc3opKSB7CisJICAgICgmc2lpLT5wdWIsIGJ1c3R5cGUsIHJlZ3MsIHNpaS0+b3NoLCB2YXJzLCB2YXJzeikpIHsKIAkJU0lfRVJST1IoKCJzaV9kb2F0dGFjaDogc3JvbV92YXJfaW5pdCBmYWlsZWQ6IGJhZCBzcm9tXG4iKSk7CiAJCWdvdG8gZXhpdDsKIAl9CkBAIC00OTksNyArNDk5LDcgQEAKIH0KIAogI2Vsc2UJCQkJLyogQkNNU0RJTyAqLwotc3RhdGljIHNpX2luZm9fdCAqc2lfZG9hdHRhY2goc2lfaW5mb190ICpzaWksIHVpbnQgZGV2aWQsIG9zbF90ICpvc2gsCitzdGF0aWMgc2lfaW5mb190ICpzaV9kb2F0dGFjaChzaV9pbmZvX3QgKnNpaSwgdWludCBkZXZpZCwgc3RydWN0IG9zbF9pbmZvICpvc2gsCiAJCQkgICAgICB2b2lkICpyZWdzLCB1aW50IGJ1c3R5cGUsIHZvaWQgKnNkaCwKIAkJCSAgICAgIGNoYXIgKip2YXJzLCB1aW50ICp2YXJzeikKIHsKQEAgLTUxMSw3ICs1MTEsNyBAQAogCiAJQVNTRVJUKEdPT0RSRUdTKHJlZ3MpKTsKIAotCWJ6ZXJvKCh1bnNpZ25lZCBjaGFyICopIHNpaSwgc2l6ZW9mKHNpX2luZm9fdCkpOworCW1lbXNldCgodW5zaWduZWQgY2hhciAqKSBzaWksIDAsIHNpemVvZihzaV9pbmZvX3QpKTsKIAogCXNhdmV3aW4gPSAwOwogCkBAIC01MjIsMzAgKzUyMiwyOSBAQAogCXNpaS0+b3NoID0gb3NoOwogCiAJLyogY2hlY2sgdG8gc2VlIGlmIHdlIGFyZSBhIHNpIGNvcmUgbWltaWMnaW5nIGEgcGNpIGNvcmUgKi8KLQlpZiAoKGJ1c3R5cGUgPT0gUENJX0JVUykgJiYKLQkgICAgKE9TTF9QQ0lfUkVBRF9DT05GSUcoc2lpLT5vc2gsIFBDSV9TUFJPTV9DT05UUk9MLCBzaXplb2YodTMyKSkgPT0KLQkgICAgIDB4ZmZmZmZmZmYpKSB7Ci0JCVNJX0VSUk9SKCgiJXM6IGluY29taW5nIGJ1cyBpcyBQQ0kgYnV0IGl0J3MgYSBsaWUsIHN3aXRjaGluZyB0byBTSSAiICJkZXZpZDoweCV4XG4iLCBfX2Z1bmNfXywgZGV2aWQpKTsKLQkJYnVzdHlwZSA9IFNJX0JVUzsKKwlpZiAoYnVzdHlwZSA9PSBQQ0lfQlVTKSB7CisJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChzaWktPm9zaC0+cGRldiwgUENJX1NQUk9NX0NPTlRST0wsICAmdyk7CisJCWlmICh3ID09IDB4ZmZmZmZmZmYpIHsKKwkJCVNJX0VSUk9SKCgiJXM6IGluY29taW5nIGJ1cyBpcyBQQ0kgYnV0IGl0J3MgYSBsaWUsICIKKwkJCQkiIHN3aXRjaGluZyB0byBTSSBkZXZpZDoweCV4XG4iLAorCQkJCV9fZnVuY19fLCBkZXZpZCkpOworCQkJYnVzdHlwZSA9IFNJX0JVUzsKKwkJfQogCX0KIAogCS8qIGZpbmQgQ2hpcGNvbW1vbiBhZGRyZXNzICovCiAJaWYgKGJ1c3R5cGUgPT0gUENJX0JVUykgewotCQlzYXZld2luID0KLQkJICAgIE9TTF9QQ0lfUkVBRF9DT05GSUcoc2lpLT5vc2gsIFBDSV9CQVIwX1dJTiwgc2l6ZW9mKHUzMikpOworCQlwY2lfcmVhZF9jb25maWdfZHdvcmQoc2lpLT5vc2gtPnBkZXYsIFBDSV9CQVIwX1dJTiwgJnNhdmV3aW4pOwogCQlpZiAoIUdPT0RDT1JFQUREUihzYXZld2luLCBTSV9FTlVNX0JBU0UpKQogCQkJc2F2ZXdpbiA9IFNJX0VOVU1fQkFTRTsKLQkJT1NMX1BDSV9XUklURV9DT05GSUcoc2lpLT5vc2gsIFBDSV9CQVIwX1dJTiwgNCwgU0lfRU5VTV9CQVNFKTsKKwkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChzaWktPm9zaC0+cGRldiwgUENJX0JBUjBfV0lOLAorCQkJCSAgICAgICBTSV9FTlVNX0JBU0UpOwogCQljYyA9IChjaGlwY3JlZ3NfdCAqKSByZWdzOwogCX0gZWxzZSB7CiAJCWNjID0gKGNoaXBjcmVnc190ICopIFJFR19NQVAoU0lfRU5VTV9CQVNFLCBTSV9DT1JFX1NJWkUpOwogCX0KIAogCXNpaC0+YnVzdHlwZSA9IGJ1c3R5cGU7Ci0JaWYgKGJ1c3R5cGUgIT0gQlVTVFlQRShidXN0eXBlKSkgewotCQlTSV9FUlJPUigoInNpX2RvYXR0YWNoOiBidXMgdHlwZSAlZCBkb2VzIG5vdCBtYXRjaCBjb25maWd1cmVkIGJ1cyB0eXBlICVkXG4iLCBidXN0eXBlLCBCVVNUWVBFKGJ1c3R5cGUpKSk7Ci0JCXJldHVybiBOVUxMOwotCX0KIAogCS8qIGJ1cy9jb3JlL2NsayBzZXR1cCBmb3IgcmVnaXN0ZXIgYWNjZXNzICovCiAJaWYgKCFzaV9idXNjb3JlX3ByZXAoc2lpLCBidXN0eXBlLCBkZXZpZCwgc2RoKSkgewpAQCAtNTY5LDcgKzU2OCw3IEBACiAJc2loLT5pc3NpbSA9IElTX1NJTShzaWgtPmNoaXBwa2cpOwogCiAJLyogc2NhbiBmb3IgY29yZXMgKi8KLQlpZiAoQ0hJUFRZUEUoc2lpLT5wdWIuc29jaXR5cGUpID09IFNPQ0lfQUkpIHsKKwlpZiAoc2lpLT5wdWIuc29jaXR5cGUgPT0gU09DSV9BSSkgewogCQlTSV9NU0coKCJGb3VuZCBjaGlwIHR5cGUgQUkgKDB4JTA4eClcbiIsIHcpKTsKIAkJLyogcGFzcyBjaGlwYyBhZGRyZXNzIGluc3RlYWQgb2Ygb3JpZ2luYWwgY29yZSBiYXNlICovCiAJCWFpX3NjYW4oJnNpaS0+cHViLCAodm9pZCAqKWNjLCBkZXZpZCk7CkBAIC01OTIsMTAgKzU5MSwxMCBAQAogCS8qIGFzc3VtZSBjdXJyZW50IGNvcmUgaXMgQ0MgKi8KIAlpZiAoKHNpaS0+cHViLmNjcmV2ID09IDB4MjUpCiAJICAgICYmCi0JICAgICgoQ0hJUElEKHNpaC0+Y2hpcCkgPT0gQkNNNDMyMzZfQ0hJUF9JRAotCSAgICAgIHx8IENISVBJRChzaWgtPmNoaXApID09IEJDTTQzMjM1X0NISVBfSUQKLQkgICAgICB8fCBDSElQSUQoc2loLT5jaGlwKSA9PSBCQ000MzIzOF9DSElQX0lEKQotCSAgICAgJiYgKENISVBSRVYoc2lpLT5wdWIuY2hpcHJldikgPD0gMikpKSB7CisJICAgICgoc2loLT5jaGlwID09IEJDTTQzMjM2X0NISVBfSUQKKwkgICAgICB8fCBzaWgtPmNoaXAgPT0gQkNNNDMyMzVfQ0hJUF9JRAorCSAgICAgIHx8IHNpaC0+Y2hpcCA9PSBCQ000MzIzOF9DSElQX0lEKQorCSAgICAgJiYgKHNpaS0+cHViLmNoaXByZXYgPD0gMikpKSB7CiAKIAkJaWYgKChjYy0+Y2hpcHN0YXR1cyAmIENTVDQzMjM2X0JQX0NMSykgIT0gMCkgewogCQkJdWludCBjbGtkaXY7CkBAIC02MTMsNyArNjEyLDcgQEAKIAogCS8qIEluaXQgbnZyYW0gZnJvbSBzcHJvbS9vdHAgaWYgdGhleSBleGlzdCAqLwogCWlmIChzcm9tX3Zhcl9pbml0Ci0JICAgICgmc2lpLT5wdWIsIEJVU1RZUEUoYnVzdHlwZSksIHJlZ3MsIHNpaS0+b3NoLCB2YXJzLCB2YXJzeikpIHsKKwkgICAgKCZzaWktPnB1YiwgYnVzdHlwZSwgcmVncywgc2lpLT5vc2gsIHZhcnMsIHZhcnN6KSkgewogCQlTSV9FUlJPUigoInNpX2RvYXR0YWNoOiBzcm9tX3Zhcl9pbml0IGZhaWxlZDogYmFkIHNyb21cbiIpKTsKIAkJZ290byBleGl0OwogCX0KQEAgLTY1MSwxMCArNjUwLDEwIEBACiAJCXBjaWNvcmVfYXR0YWNoKHNpaS0+cGNoLCBwdmFycywgU0lfRE9BVFRBQ0gpOwogCX0KIAotCWlmICgoQ0hJUElEKHNpaC0+Y2hpcCkgPT0gQkNNNDMyMjRfQ0hJUF9JRCkgfHwKLQkgICAgKENISVBJRChzaWgtPmNoaXApID09IEJDTTQzNDIxX0NISVBfSUQpKSB7CisJaWYgKChzaWgtPmNoaXAgPT0gQkNNNDMyMjRfQ0hJUF9JRCkgfHwKKwkgICAgKHNpaC0+Y2hpcCA9PSBCQ000MzQyMV9DSElQX0lEKSkgewogCQkvKiBlbmFibGUgMTIgbUEgZHJpdmUgc3RyZW50aCBmb3IgNDMyMjQgYW5kIHNldCBjaGlwQ29udHJvbCByZWdpc3RlciBiaXQgMTUgKi8KLQkJaWYgKENISVBSRVYoc2loLT5jaGlwcmV2KSA9PSAwKSB7CisJCWlmIChzaWgtPmNoaXByZXYgPT0gMCkgewogCQkJU0lfTVNHKCgiQXBwbHlpbmcgNDMyMjRBMCBXQVJzXG4iKSk7CiAJCQlzaV9jb3JlcmVnKHNpaCwgU0lfQ0NfSURYLAogCQkJCSAgIG9mZnNldG9mKGNoaXBjcmVnc190LCBjaGlwY29udHJvbCksCkBAIC02NjMsMjggKzY2MiwyOCBAQAogCQkJc2lfcG11X2NoaXBjb250cm9sKHNpaCwgMCwgQ0NUUkxfNDMyMjRBMF8xMk1BX0xFRF9EUklWRSwKIAkJCQkJICAgQ0NUUkxfNDMyMjRBMF8xMk1BX0xFRF9EUklWRSk7CiAJCX0KLQkJaWYgKENISVBSRVYoc2loLT5jaGlwcmV2KSA+PSAxKSB7CisJCWlmIChzaWgtPmNoaXByZXYgPj0gMSkgewogCQkJU0lfTVNHKCgiQXBwbHlpbmcgNDMyMjRCMCsgV0FSc1xuIikpOwogCQkJc2lfcG11X2NoaXBjb250cm9sKHNpaCwgMCwgQ0NUUkxfNDMyMjRCMF8xMk1BX0xFRF9EUklWRSwKIAkJCQkJICAgQ0NUUkxfNDMyMjRCMF8xMk1BX0xFRF9EUklWRSk7CiAJCX0KIAl9CiAKLQlpZiAoQ0hJUElEKHNpaC0+Y2hpcCkgPT0gQkNNNDMxM19DSElQX0lEKSB7CisJaWYgKHNpaC0+Y2hpcCA9PSBCQ000MzEzX0NISVBfSUQpIHsKIAkJLyogZW5hYmxlIDEyIG1BIGRyaXZlIHN0cmVudGggZm9yIDQzMTMgYW5kIHNldCBjaGlwQ29udHJvbCByZWdpc3RlciBiaXQgMSAqLwogCQlTSV9NU0coKCJBcHBseWluZyA0MzEzIFdBUnNcbiIpKTsKIAkJc2lfcG11X2NoaXBjb250cm9sKHNpaCwgMCwgQ0NUUkxfNDMxM18xMk1BX0xFRF9EUklWRSwKIAkJCQkgICBDQ1RSTF80MzEzXzEyTUFfTEVEX0RSSVZFKTsKIAl9CiAKLQlpZiAoQ0hJUElEKHNpaC0+Y2hpcCkgPT0gQkNNNDMzMV9DSElQX0lEKSB7CisJaWYgKHNpaC0+Y2hpcCA9PSBCQ000MzMxX0NISVBfSUQpIHsKIAkJLyogRW5hYmxlIEV4dCBQQSBsaW5lcyBkZXBlbmRpbmcgb24gY2hpcCBwYWNrYWdlIG9wdGlvbiAqLwogCQlzaV9jaGlwY29udHJsX2VwYTQzMzEoc2loLCB0cnVlKTsKIAl9CiAKIAlyZXR1cm4gc2lpOwogIGV4aXQ6Ci0JaWYgKEJVU1RZUEUoc2loLT5idXN0eXBlKSA9PSBQQ0lfQlVTKSB7CisJaWYgKHNpaC0+YnVzdHlwZSA9PSBQQ0lfQlVTKSB7CiAJCWlmIChzaWktPnBjaCkKIAkJCXBjaWNvcmVfZGVpbml0KHNpaS0+cGNoKTsKIAkJc2lpLT5wY2ggPSBOVUxMOwpAQCAtNzA4LDE3ICs3MDcsMTcgQEAKIAlpZiAoc2lpID09IE5VTEwpCiAJCXJldHVybjsKIAotCWlmIChCVVNUWVBFKHNpaC0+YnVzdHlwZSkgPT0gU0lfQlVTKQorCWlmIChzaWgtPmJ1c3R5cGUgPT0gU0lfQlVTKQogCQlmb3IgKGlkeCA9IDA7IGlkeCA8IFNJX01BWENPUkVTOyBpZHgrKykKIAkJCWlmIChzaWktPnJlZ3NbaWR4XSkgewotCQkJCVJFR19VTk1BUChzaWktPnJlZ3NbaWR4XSk7CisJCQkJaW91bm1hcChzaWktPnJlZ3NbaWR4XSk7CiAJCQkJc2lpLT5yZWdzW2lkeF0gPSBOVUxMOwogCQkJfQogCiAjaWZuZGVmIEJSQ01fRlVMTE1BQwogCW52cmFtX2V4aXQoKHZvaWQgKilzaV9sb2NhbCk7CS8qIGZyZWUgdXAgbnZyYW0gYnVmZmVycyAqLwogCi0JaWYgKEJVU1RZUEUoc2loLT5idXN0eXBlKSA9PSBQQ0lfQlVTKSB7CisJaWYgKHNpaC0+YnVzdHlwZSA9PSBQQ0lfQlVTKSB7CiAJCWlmIChzaWktPnBjaCkKIAkJCXBjaWNvcmVfZGVpbml0KHNpaS0+cGNoKTsKIAkJc2lpLT5wY2ggPSBOVUxMOwpAQCAtNzMwLDcgKzcyOSw3IEBACiAJCWtmcmVlKHNpaSk7CiB9CiAKLXZvaWQgKnNpX29zaChzaV90ICpzaWgpCitzdHJ1Y3Qgb3NsX2luZm8gKnNpX29zaChzaV90ICpzaWgpCiB7CiAJc2lfaW5mb190ICpzaWk7CiAKQEAgLTc2Niw3ICs3NjUsNyBAQAogCiB1aW50IHNpX2ZsYWcoc2lfdCAqc2loKQogewotCWlmIChDSElQVFlQRShzaWgtPnNvY2l0eXBlKSA9PSBTT0NJX0FJKQorCWlmIChzaWgtPnNvY2l0eXBlID09IFNPQ0lfQUkpCiAJCXJldHVybiBhaV9mbGFnKHNpaCk7CiAJZWxzZSB7CiAJCUFTU0VSVCgwKTsKQEAgLTc3Niw3ICs3NzUsNyBAQAogCiB2b2lkIHNpX3NldGludChzaV90ICpzaWgsIGludCBzaWZsYWcpCiB7Ci0JaWYgKENISVBUWVBFKHNpaC0+c29jaXR5cGUpID09IFNPQ0lfQUkpCisJaWYgKHNpaC0+c29jaXR5cGUgPT0gU09DSV9BSSkKIAkJYWlfc2V0aW50KHNpaCwgc2lmbGFnKTsKIAllbHNlCiAJCUFTU0VSVCgwKTsKQEAgLTgwOCw3ICs4MDcsNyBAQAogI2lmbmRlZiBCQ01TRElPCiB1aW50IHNpX2NvcmVyZXYoc2lfdCAqc2loKQogewotCWlmIChDSElQVFlQRShzaWgtPnNvY2l0eXBlKSA9PSBTT0NJX0FJKQorCWlmIChzaWgtPnNvY2l0eXBlID09IFNPQ0lfQUkpCiAJCXJldHVybiBhaV9jb3JlcmV2KHNpaCk7CiAJZWxzZSB7CiAJCUFTU0VSVCgwKTsKQEAgLTg1MSw3ICs4NTAsNyBAQAogCWlmICghR09PRElEWChpZHgpKQogCQlyZXR1cm4gTlVMTDsKIAotCWlmIChDSElQVFlQRShzaWgtPnNvY2l0eXBlKSA9PSBTT0NJX0FJKQorCWlmIChzaWgtPnNvY2l0eXBlID09IFNPQ0lfQUkpCiAJCXJldHVybiBhaV9zZXRjb3JlaWR4KHNpaCwgaWR4KTsKIAllbHNlIHsKICNpZmRlZiBCQ01TRElPCkBAIC04NjYsNyArODY1LDcgQEAKICNpZm5kZWYgQkNNU0RJTwogdm9pZCAqc2lfc2V0Y29yZWlkeChzaV90ICpzaWgsIHVpbnQgY29yZWlkeCkKIHsKLQlpZiAoQ0hJUFRZUEUoc2loLT5zb2NpdHlwZSkgPT0gU09DSV9BSSkKKwlpZiAoc2loLT5zb2NpdHlwZSA9PSBTT0NJX0FJKQogCQlyZXR1cm4gYWlfc2V0Y29yZWlkeChzaWgsIGNvcmVpZHgpOwogCWVsc2UgewogCQlBU1NFUlQoMCk7CkBAIC05MTgsNyArOTE3LDcgQEAKIAogdTMyIHNpX2NvcmVfY2ZsYWdzKHNpX3QgKnNpaCwgdTMyIG1hc2ssIHUzMiB2YWwpCiB7Ci0JaWYgKENISVBUWVBFKHNpaC0+c29jaXR5cGUpID09IFNPQ0lfQUkpCisJaWYgKHNpaC0+c29jaXR5cGUgPT0gU09DSV9BSSkKIAkJcmV0dXJuIGFpX2NvcmVfY2ZsYWdzKHNpaCwgbWFzaywgdmFsKTsKIAllbHNlIHsKIAkJQVNTRVJUKDApOwpAQCAtOTI4LDcgKzkyNyw3IEBACiAKIHUzMiBzaV9jb3JlX3NmbGFncyhzaV90ICpzaWgsIHUzMiBtYXNrLCB1MzIgdmFsKQogewotCWlmIChDSElQVFlQRShzaWgtPnNvY2l0eXBlKSA9PSBTT0NJX0FJKQorCWlmIChzaWgtPnNvY2l0eXBlID09IFNPQ0lfQUkpCiAJCXJldHVybiBhaV9jb3JlX3NmbGFncyhzaWgsIG1hc2ssIHZhbCk7CiAJZWxzZSB7CiAJCUFTU0VSVCgwKTsKQEAgLTkzOCw3ICs5MzcsNyBAQAogCiBib29sIHNpX2lzY29yZXVwKHNpX3QgKnNpaCkKIHsKLQlpZiAoQ0hJUFRZUEUoc2loLT5zb2NpdHlwZSkgPT0gU09DSV9BSSkKKwlpZiAoc2loLT5zb2NpdHlwZSA9PSBTT0NJX0FJKQogCQlyZXR1cm4gYWlfaXNjb3JldXAoc2loKTsKIAllbHNlIHsKICNpZmRlZiBCQ01TRElPCkBAIC05NTMsNyArOTUyLDcgQEAKIHZvaWQgc2lfd3JpdGVfd3JhcHBlcnJlZyhzaV90ICpzaWgsIHUzMiBvZmZzZXQsIHUzMiB2YWwpCiB7CiAJLyogb25seSBmb3IgNDMxOSwgbm8gcmVxdWlyZW1lbnQgZm9yIFNPQ0lfU0IgKi8KLQlpZiAoQ0hJUFRZUEUoc2loLT5zb2NpdHlwZSkgPT0gU09DSV9BSSkgeworCWlmIChzaWgtPnNvY2l0eXBlID09IFNPQ0lfQUkpIHsKIAkJYWlfd3JpdGVfd3JhcF9yZWcoc2loLCBvZmZzZXQsIHZhbCk7CiAJfQogfQpAQCAtOTYxLDcgKzk2MCw3IEBACiB1aW50IHNpX2NvcmVyZWcoc2lfdCAqc2loLCB1aW50IGNvcmVpZHgsIHVpbnQgcmVnb2ZmLCB1aW50IG1hc2ssIHVpbnQgdmFsKQogewogCi0JaWYgKENISVBUWVBFKHNpaC0+c29jaXR5cGUpID09IFNPQ0lfQUkpCisJaWYgKHNpaC0+c29jaXR5cGUgPT0gU09DSV9BSSkKIAkJcmV0dXJuIGFpX2NvcmVyZWcoc2loLCBjb3JlaWR4LCByZWdvZmYsIG1hc2ssIHZhbCk7CiAJZWxzZSB7CiAjaWZkZWYgQkNNU0RJTwpAQCAtOTc2LDcgKzk3NSw3IEBACiB2b2lkIHNpX2NvcmVfZGlzYWJsZShzaV90ICpzaWgsIHUzMiBiaXRzKQogewogCi0JaWYgKENISVBUWVBFKHNpaC0+c29jaXR5cGUpID09IFNPQ0lfQUkpCisJaWYgKHNpaC0+c29jaXR5cGUgPT0gU09DSV9BSSkKIAkJYWlfY29yZV9kaXNhYmxlKHNpaCwgYml0cyk7CiAjaWZkZWYgQkNNU0RJTwogCWVsc2UKQEAgLTk4Niw3ICs5ODUsNyBAQAogCiB2b2lkIHNpX2NvcmVfcmVzZXQoc2lfdCAqc2loLCB1MzIgYml0cywgdTMyIHJlc2V0Yml0cykKIHsKLQlpZiAoQ0hJUFRZUEUoc2loLT5zb2NpdHlwZSkgPT0gU09DSV9BSSkKKwlpZiAoc2loLT5zb2NpdHlwZSA9PSBTT0NJX0FJKQogCQlhaV9jb3JlX3Jlc2V0KHNpaCwgYml0cywgcmVzZXRiaXRzKTsKICNpZmRlZiBCQ01TRElPCiAJZWxzZQpAQCAtMTA0Myw4ICsxMDQyLDggQEAKIAogCWlmIChQTVVDVExfRU5BQihzaWgpKSB7CiAKLQkJaWYgKChDSElQSUQoc2loLT5jaGlwKSA9PSBCQ000MzE5X0NISVBfSUQpICYmCi0JCSAgICAoQ0hJUFJFVihzaWgtPmNoaXByZXYpID09IDApICYmICh0aWNrcyAhPSAwKSkgeworCQlpZiAoKHNpaC0+Y2hpcCA9PSBCQ000MzE5X0NISVBfSUQpICYmCisJCSAgICAoc2loLT5jaGlwcmV2ID09IDApICYmICh0aWNrcyAhPSAwKSkgewogCQkJc2lfY29yZXJlZyhzaWgsIFNJX0NDX0lEWCwKIAkJCQkgICBvZmZzZXRvZihjaGlwY3JlZ3NfdCwgY2xrX2N0bF9zdCksIH4wLCAweDIpOwogCQkJc2lfc2V0Y29yZShzaWgsIFVTQjIwRF9DT1JFX0lELCAwKTsKQEAgLTEwODUsMTYgKzEwODQsMTggQEAKIHN0YXRpYyB1aW50IHNpX3Nsb3djbGtfc3JjKHNpX2luZm9fdCAqc2lpKQogewogCWNoaXBjcmVnc190ICpjYzsKKwl1MzIgdmFsOwogCiAJQVNTRVJUKFNJX0ZBU1Qoc2lpKSB8fCBzaV9jb3JlaWQoJnNpaS0+cHViKSA9PSBDQ19DT1JFX0lEKTsKIAogCWlmIChzaWktPnB1Yi5jY3JldiA8IDYpIHsKLQkJaWYgKChCVVNUWVBFKHNpaS0+cHViLmJ1c3R5cGUpID09IFBDSV9CVVMpICYmCi0JCSAgICAoT1NMX1BDSV9SRUFEX0NPTkZJRyhzaWktPm9zaCwgUENJX0dQSU9fT1VULCBzaXplb2YodTMyKSkKLQkJICAgICAmIFBDSV9DRkdfR1BJT19TQ1MpKQotCQkJcmV0dXJuIFNDQ19TU19QQ0k7Ci0JCWVsc2UKLQkJCXJldHVybiBTQ0NfU1NfWFRBTDsKKwkJaWYgKHNpaS0+cHViLmJ1c3R5cGUgPT0gUENJX0JVUykgeworCQkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHNpaS0+b3NoLT5wZGV2LCBQQ0lfR1BJT19PVVQsCisJCQkJCSAgICAgICZ2YWwpOworCQkJaWYgKHZhbCAmIFBDSV9DRkdfR1BJT19TQ1MpCisJCQkJcmV0dXJuIFNDQ19TU19QQ0k7CisJCX0KKwkJcmV0dXJuIFNDQ19TU19YVEFMOwogCX0gZWxzZSBpZiAoc2lpLT5wdWIuY2NyZXYgPCAxMCkgewogCQljYyA9IChjaGlwY3JlZ3NfdCAqKSBzaV9zZXRjb3JlaWR4KCZzaWktPnB1Yiwgc2lpLT5jdXJpZHgpOwogCQlyZXR1cm4gUl9SRUcoc2lpLT5vc2gsICZjYy0+c2xvd19jbGtfY3RsKSAmIFNDQ19TU19NQVNLOwpAQCAtMTI2NCw3ICsxMjY1LDcgQEAKIAogCXNpaSA9IFNJX0lORk8oc2loKTsKIAotCXN3aXRjaCAoQlVTVFlQRShzaWgtPmJ1c3R5cGUpKSB7CisJc3dpdGNoIChzaWgtPmJ1c3R5cGUpIHsKIAogI2lmZGVmIEJDTVNESU8KIAljYXNlIFNESU9fQlVTOgpAQCAtMTI3NiwxMiArMTI3Nyw5IEBACiAJCWlmIChQQ0lFKHNpaSkpCiAJCQlyZXR1cm4gLTE7CiAKLQkJaW4gPSBPU0xfUENJX1JFQURfQ09ORklHKHNpaS0+b3NoLCBQQ0lfR1BJT19JTiwgc2l6ZW9mKHUzMikpOwotCQlvdXQgPQotCQkgICAgT1NMX1BDSV9SRUFEX0NPTkZJRyhzaWktPm9zaCwgUENJX0dQSU9fT1VULCBzaXplb2YodTMyKSk7Ci0JCW91dGVuID0KLQkJICAgIE9TTF9QQ0lfUkVBRF9DT05GSUcoc2lpLT5vc2gsIFBDSV9HUElPX09VVEVOLAotCQkJCQlzaXplb2YodTMyKSk7CisJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChzaWktPm9zaC0+cGRldiwgUENJX0dQSU9fSU4sICZpbik7CisJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChzaWktPm9zaC0+cGRldiwgUENJX0dQSU9fT1VULCAmb3V0KTsKKwkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHNpaS0+b3NoLT5wZGV2LCBQQ0lfR1BJT19PVVRFTiwgJm91dGVuKTsKIAogCQkvKgogCQkgKiBBdm9pZCBnbGl0Y2hpbmcgdGhlIGNsb2NrIGlmIEdQUlMgaXMgYWxyZWFkeSB1c2luZyBpdC4KQEAgLTEzMDIsMTggKzEzMDAsMTggQEAKIAkJCQlvdXQgfD0gUENJX0NGR19HUElPX1hUQUw7CiAJCQkJaWYgKHdoYXQgJiBQTEwpCiAJCQkJCW91dCB8PSBQQ0lfQ0ZHX0dQSU9fUExMOwotCQkJCU9TTF9QQ0lfV1JJVEVfQ09ORklHKHNpaS0+b3NoLCBQQ0lfR1BJT19PVVQsCi0JCQkJCQkgICAgIHNpemVvZih1MzIpLCBvdXQpOwotCQkJCU9TTF9QQ0lfV1JJVEVfQ09ORklHKHNpaS0+b3NoLCBQQ0lfR1BJT19PVVRFTiwKLQkJCQkJCSAgICAgc2l6ZW9mKHUzMiksIG91dGVuKTsKKwkJCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHNpaS0+b3NoLT5wZGV2LAorCQkJCQkJICAgICAgIFBDSV9HUElPX09VVCwgb3V0KTsKKwkJCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHNpaS0+b3NoLT5wZGV2LAorCQkJCQkJICAgICAgIFBDSV9HUElPX09VVEVOLCBvdXRlbik7CiAJCQkJdWRlbGF5KFhUQUxfT05fREVMQVkpOwogCQkJfQogCiAJCQkvKiB0dXJuIHBsbCBvbiAqLwogCQkJaWYgKHdoYXQgJiBQTEwpIHsKIAkJCQlvdXQgJj0gflBDSV9DRkdfR1BJT19QTEw7Ci0JCQkJT1NMX1BDSV9XUklURV9DT05GSUcoc2lpLT5vc2gsIFBDSV9HUElPX09VVCwKLQkJCQkJCSAgICAgc2l6ZW9mKHUzMiksIG91dCk7CisJCQkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChzaWktPm9zaC0+cGRldiwKKwkJCQkJCSAgICAgICBQQ0lfR1BJT19PVVQsIG91dCk7CiAJCQkJbWRlbGF5KDIpOwogCQkJfQogCQl9IGVsc2UgewpAQCAtMTMyMSwxMCArMTMxOSwxMCBAQAogCQkJCW91dCAmPSB+UENJX0NGR19HUElPX1hUQUw7CiAJCQlpZiAod2hhdCAmIFBMTCkKIAkJCQlvdXQgfD0gUENJX0NGR19HUElPX1BMTDsKLQkJCU9TTF9QQ0lfV1JJVEVfQ09ORklHKHNpaS0+b3NoLCBQQ0lfR1BJT19PVVQsCi0JCQkJCSAgICAgc2l6ZW9mKHUzMiksIG91dCk7Ci0JCQlPU0xfUENJX1dSSVRFX0NPTkZJRyhzaWktPm9zaCwgUENJX0dQSU9fT1VURU4sCi0JCQkJCSAgICAgc2l6ZW9mKHUzMiksIG91dGVuKTsKKwkJCXBjaV93cml0ZV9jb25maWdfZHdvcmQoc2lpLT5vc2gtPnBkZXYsCisJCQkJCSAgICAgICBQQ0lfR1BJT19PVVQsIG91dCk7CisJCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHNpaS0+b3NoLT5wZGV2LAorCQkJCQkgICAgICAgUENJX0dQSU9fT1VURU4sIG91dGVuKTsKIAkJfQogCiAJZGVmYXVsdDoKQEAgLTEzNzgsNyArMTM3Niw3IEBACiAJCUlOVFJfT0ZGKHNpaSwgaW50cl92YWwpOwogCQlvcmlnaWR4ID0gc2lpLT5jdXJpZHg7CiAKLQkJaWYgKChCVVNUWVBFKHNpaS0+cHViLmJ1c3R5cGUpID09IFNJX0JVUykgJiYKKwkJaWYgKChzaWktPnB1Yi5idXN0eXBlID09IFNJX0JVUykgJiYKIAkJICAgIHNpX3NldGNvcmUoJnNpaS0+cHViLCBNSVBTMzNfQ09SRV9JRCwgMCkgJiYKIAkJICAgIChzaV9jb3JlcmV2KCZzaWktPnB1YikgPD0gNykgJiYgKHNpaS0+cHViLmNjcmV2ID49IDEwKSkKIAkJCWdvdG8gZG9uZTsKQEAgLTE0NjAsNyArMTQ1OCw3IEBACiAJaWYgKCFwYXRoIHx8IHNpemUgPD0gMCkKIAkJcmV0dXJuIC0xOwogCi0Jc3dpdGNoIChCVVNUWVBFKHNpaC0+YnVzdHlwZSkpIHsKKwlzd2l0Y2ggKHNpaC0+YnVzdHlwZSkgewogCWNhc2UgU0lfQlVTOgogCWNhc2UgSlRBR19CVVM6CiAJCXNsZW4gPSBzbnByaW50ZihwYXRoLCAoc2l6ZV90KSBzaXplLCAic2IvJXUvIiwgc2lfY29yZWlkeChzaWgpKTsKQEAgLTE1NTAsNyArMTU0OCw3IEBACiB7CiAJdTggY2FwX3B0cjsKIAotCWlmIChCVVNUWVBFKHNpaS0+cHViLmJ1c3R5cGUpICE9IFBDSV9CVVMpCisJaWYgKHNpaS0+cHViLmJ1c3R5cGUgIT0gUENJX0JVUykKIAkJcmV0dXJuIGZhbHNlOwogCiAJY2FwX3B0ciA9CkBAIC0xNjE3LDcgKzE2MTUsNyBAQAogCXNpaSA9IFNJX0lORk8oc2loKTsKIAogCS8qIGlmIG5vdCBwY2kgYnVzLCB3ZSdyZSBkb25lICovCi0JaWYgKEJVU1RZUEUoc2loLT5idXN0eXBlKSAhPSBQQ0lfQlVTKQorCWlmIChzaWgtPmJ1c3R5cGUgIT0gUENJX0JVUykKIAkJcmV0dXJuOwogCiAJaWYgKFBDSV9GT1JDRUhUKHNpaSkpCkBAIC0xNjQ2LDcgKzE2NDQsNyBAQAogCXNpaSA9IFNJX0lORk8oc2loKTsKIAogCS8qIGlmIG5vdCBwY2kgYnVzLCB3ZSdyZSBkb25lICovCi0JaWYgKEJVU1RZUEUoc2loLT5idXN0eXBlKSAhPSBQQ0lfQlVTKQorCWlmIChzaWgtPmJ1c3R5cGUgIT0gUENJX0JVUykKIAkJcmV0dXJuOwogCiAJLyogcmVsZWFzZSBGT1JDRUhUIHNpbmNlIGNoaXAgaXMgZ29pbmcgdG8gImRvd24iIHN0YXRlICovCkBAIC0xNjY5LDcgKzE2NjcsNyBAQAogCiAJc2lpID0gU0lfSU5GTyhzaWgpOwogCi0JaWYgKEJVU1RZUEUoc2lpLT5wdWIuYnVzdHlwZSkgIT0gUENJX0JVUykKKwlpZiAoc2lpLT5wdWIuYnVzdHlwZSAhPSBQQ0lfQlVTKQogCQlyZXR1cm47CiAKIAlBU1NFUlQoUENJKHNpaSkgfHwgUENJRShzaWkpKTsKQEAgLTE2OTIsOSArMTY5MCw5IEBACiAJICovCiAJaWYgKFBDSUUoc2lpKSB8fCAoUENJKHNpaSkgJiYgKChzaWktPnB1Yi5idXNjb3JlcmV2KSA+PSA2KSkpIHsKIAkJLyogcGNpIGNvbmZpZyB3cml0ZSB0byBzZXQgdGhpcyBjb3JlIGJpdCBpbiBQQ0lJbnRNYXNrICovCi0JCXcgPSBPU0xfUENJX1JFQURfQ09ORklHKHNpaS0+b3NoLCBQQ0lfSU5UX01BU0ssIHNpemVvZih1MzIpKTsKKwkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHNpaS0+b3NoLT5wZGV2LCBQQ0lfSU5UX01BU0ssICZ3KTsKIAkJdyB8PSAoY29yZW1hc2sgPDwgUENJX1NCSU1fU0hJRlQpOwotCQlPU0xfUENJX1dSSVRFX0NPTkZJRyhzaWktPm9zaCwgUENJX0lOVF9NQVNLLCBzaXplb2YodTMyKSwgdyk7CisJCXBjaV93cml0ZV9jb25maWdfZHdvcmQoc2lpLT5vc2gtPnBkZXYsIFBDSV9JTlRfTUFTSywgdyk7CiAJfSBlbHNlIHsKIAkJLyogc2V0IHNiaW50dmVjIGJpdCBmb3Igb3VyIGZsYWcgbnVtYmVyICovCiAJCXNpX3NldGludChzaWgsIHNpZmxhZyk7CkBAIC0xNzMxLDcgKzE3MjksNyBAQAogCiAJc2lfaW5mb190ICpzaWkgPSBTSV9JTkZPKHNpaCk7CiAKLQlBU1NFUlQoQlVTVFlQRShzaWktPnB1Yi5idXN0eXBlKSA9PSBQQ0lfQlVTKTsKKwlBU1NFUlQoc2lpLT5wdWIuYnVzdHlwZSA9PSBQQ0lfQlVTKTsKIAogCS8qIEZpeHVwIFBJIGluIFNST00gc2hhZG93IGFyZWEgdG8gZW5hYmxlIHRoZSBjb3JyZWN0IFBDSSBjb3JlIGFjY2VzcyAqLwogCS8qIHNhdmUgdGhlIGN1cnJlbnQgaW5kZXggKi8KQEAgLTE3NzcsNyArMTc3NSw3IEBACiAJICogaWdub3JlIHJlc2VydmF0aW9uIGlmIGl0J3MgaGlnaCBwcmlvcml0eSAoZS5nLiwgdGVzdCBhcHBzKQogCSAqLwogCWlmICgocHJpb3JpdHkgIT0gR1BJT19ISV9QUklPUklUWSkgJiYKLQkgICAgKEJVU1RZUEUoc2loLT5idXN0eXBlKSA9PSBTSV9CVVMpICYmICh2YWwgfHwgbWFzaykpIHsKKwkgICAgKHNpaC0+YnVzdHlwZSA9PSBTSV9CVVMpICYmICh2YWwgfHwgbWFzaykpIHsKIAkJbWFzayA9IHByaW9yaXR5ID8gKHNpX2dwaW9yZXNlcnZhdGlvbiAmIG1hc2spIDoKIAkJICAgICgoc2lfZ3Bpb3Jlc2VydmF0aW9uIHwgbWFzaykgJiB+KHNpX2dwaW9yZXNlcnZhdGlvbikpOwogCQl2YWwgJj0gbWFzazsKQEAgLTE5MjksMTAgKzE5MjcsMTAgQEAKIAogCXNpaSA9IFNJX0lORk8oc2loKTsKIAotCXN3aXRjaCAoQlVTVFlQRShzaWgtPmJ1c3R5cGUpKSB7CisJc3dpdGNoIChzaWgtPmJ1c3R5cGUpIHsKIAljYXNlIFBDSV9CVVM6CiAJCUFTU0VSVChzaWktPm9zaCAhPSBOVUxMKTsKLQkJdyA9IE9TTF9QQ0lfUkVBRF9DT05GSUcoc2lpLT5vc2gsIFBDSV9DRkdfVklELCBzaXplb2YodTMyKSk7CisJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChzaWktPm9zaC0+cGRldiwgUENJX0NGR19WSUQsICZ3KTsKIAkJaWYgKCh3ICYgMHhGRkZGKSAhPSBWRU5ET1JfQlJPQURDT00pCiAJCQlyZXR1cm4gdHJ1ZTsKIAkJYnJlYWs7CkBAIC0xOTU5LDcgKzE5NTcsNyBAQAogCQlyZXR1cm4gc3JvbWN0cmwgJiBTUkNfUFJFU0VOVDsKIAl9CiAKLQlzd2l0Y2ggKENISVBJRChzaWgtPmNoaXApKSB7CisJc3dpdGNoIChzaWgtPmNoaXApIHsKIAljYXNlIEJDTTQzMjlfQ0hJUF9JRDoKIAkJcmV0dXJuIChzaWgtPmNoaXBzdCAmIENTVDQzMjlfU1BST01fU0VMKSAhPSAwOwogCWNhc2UgQkNNNDMxOV9DSElQX0lEOgpAQCAtMTk3OSw3ICsxOTc3LDcgQEAKIAogYm9vbCBzaV9pc19vdHBfZGlzYWJsZWQoc2lfdCAqc2loKQogewotCXN3aXRjaCAoQ0hJUElEKHNpaC0+Y2hpcCkpIHsKKwlzd2l0Y2ggKHNpaC0+Y2hpcCkgewogCWNhc2UgQkNNNDMyOV9DSElQX0lEOgogCQlyZXR1cm4gKHNpaC0+Y2hpcHN0ICYgQ1NUNDMyOV9TUFJPTV9PVFBfU0VMX01BU0spID09CiAJCSAgICBDU1Q0MzI5X09UUF9QV1JETjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzLmMKaW5kZXggNGEyOWVkNy4uZGNhODYxZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzLmMKQEAgLTExNyw4ICsxMTcsNyBAQAogCiAJZm9yIChkcml2ID0gY29tZWRpX2RyaXZlcnM7IGRyaXY7IGRyaXYgPSBkcml2LT5uZXh0KSB7CiAJCWlmICghdHJ5X21vZHVsZV9nZXQoZHJpdi0+bW9kdWxlKSkgewotCQkJcHJpbnRrCi0JCQkgICAgKEtFUk5fSU5GTyAiY29tZWRpOiBmYWlsZWQgdG8gaW5jcmVtZW50IG1vZHVsZSBjb3VudCwgc2tpcHBpbmdcbiIpOworCQkJcHJpbnRrKEtFUk5fSU5GTyAiY29tZWRpOiBmYWlsZWQgdG8gaW5jcmVtZW50IG1vZHVsZSBjb3VudCwgc2tpcHBpbmdcbiIpOwogCQkJY29udGludWU7CiAJCX0KIAkJaWYgKGRyaXYtPm51bV9uYW1lcykgewpAQCAtMjA1LDkgKzIwNCw4IEBACiAJCW11dGV4X2xvY2soJmRldi0+bXV0ZXgpOwogCQlpZiAoZGV2LT5hdHRhY2hlZCAmJiBkZXYtPmRyaXZlciA9PSBkcml2ZXIpIHsKIAkJCWlmIChkZXYtPnVzZV9jb3VudCkKLQkJCQlwcmludGsKLQkJCQkgICAgKEtFUk5fV0FSTklORyAiQlVHISBkZXRhY2hpbmcgZGV2aWNlIHdpdGggdXNlX2NvdW50PSVkXG4iLAotCQkJCSAgICAgZGV2LT51c2VfY291bnQpOworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIkJVRyEgZGV0YWNoaW5nIGRldmljZSB3aXRoIHVzZV9jb3VudD0lZFxuIiwKKwkJCQkJCWRldi0+dXNlX2NvdW50KTsKIAkJCWNvbWVkaV9kZXZpY2VfZGV0YWNoKGRldik7CiAJCX0KIAkJbXV0ZXhfdW5sb2NrKCZkZXYtPm11dGV4KTsKQEAgLTQ0Miw3ICs0NDAsOSBAQAogCQl1bnNpZ25lZCBpOwogCQlmb3IgKGkgPSAwOyBpIDwgYXN5bmMtPm5fYnVmX3BhZ2VzOyArK2kpIHsKIAkJCWlmIChhc3luYy0+YnVmX3BhZ2VfbGlzdFtpXS52aXJ0X2FkZHIpIHsKLQkJCQljbGVhcl9iaXQoUEdfcmVzZXJ2ZWQsICYodmlydF90b19wYWdlKGFzeW5jLT5idWZfcGFnZV9saXN0W2ldLnZpcnRfYWRkciktPmZsYWdzKSk7CisJCQkJY2xlYXJfYml0KFBHX3Jlc2VydmVkLAorCQkJCQkmKHZpcnRfdG9fcGFnZShhc3luYy0+YnVmX3BhZ2VfbGlzdFtpXS4KKwkJCQkJCQl2aXJ0X2FkZHIpLT5mbGFncykpOwogCQkJCWlmIChzLT5hc3luY19kbWFfZGlyICE9IERNQV9OT05FKSB7CiAJCQkJCWRtYV9mcmVlX2NvaGVyZW50KGRldi0+aHdfZGV2LAogCQkJCQkJCSAgUEFHRV9TSVpFLApAQCAtNDcwLDEwICs0NzAsOCBAQAogCQlzdHJ1Y3QgcGFnZSAqKnBhZ2VzID0gTlVMTDsKIAogCQlhc3luYy0+YnVmX3BhZ2VfbGlzdCA9Ci0JCSAgICB2bWFsbG9jKHNpemVvZihzdHJ1Y3QgY29tZWRpX2J1Zl9wYWdlKSAqIG5fcGFnZXMpOworCQkgICAgdnphbGxvYyhzaXplb2Yoc3RydWN0IGNvbWVkaV9idWZfcGFnZSkgKiBuX3BhZ2VzKTsKIAkJaWYgKGFzeW5jLT5idWZfcGFnZV9saXN0KSB7Ci0JCQltZW1zZXQoYXN5bmMtPmJ1Zl9wYWdlX2xpc3QsIDAsCi0JCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBjb21lZGlfYnVmX3BhZ2UpICogbl9wYWdlcyk7CiAJCQlwYWdlcyA9IHZtYWxsb2Moc2l6ZW9mKHN0cnVjdCBwYWdlICopICogbl9wYWdlcyk7CiAJCX0KIAkJaWYgKHBhZ2VzKSB7CkBAIC00OTYsOCArNDk0LDEwIEBACiAJCQkJCWJyZWFrOwogCiAJCQkJc2V0X2JpdChQR19yZXNlcnZlZCwKLQkJCQkJJih2aXJ0X3RvX3BhZ2UoYXN5bmMtPmJ1Zl9wYWdlX2xpc3RbaV0udmlydF9hZGRyKS0+ZmxhZ3MpKTsKLQkJCQlwYWdlc1tpXSA9IHZpcnRfdG9fcGFnZShhc3luYy0+YnVmX3BhZ2VfbGlzdFtpXS52aXJ0X2FkZHIpOworCQkJCQkmKHZpcnRfdG9fcGFnZShhc3luYy0+YnVmX3BhZ2VfbGlzdFtpXS4KKwkJCQkJCQl2aXJ0X2FkZHIpLT5mbGFncykpOworCQkJCXBhZ2VzW2ldID0gdmlydF90b19wYWdlKGFzeW5jLT5idWZfcGFnZV9saXN0W2ldLgorCQkJCQkJCQl2aXJ0X2FkZHIpOwogCQkJfQogCQl9CiAJCWlmIChpID09IG5fcGFnZXMpIHsKQEAgLTUxNCw3ICs1MTQsMTAgQEAKIAkJCQkJICAgIE5VTEwpIHsKIAkJCQkJCWJyZWFrOwogCQkJCQl9Ci0JCQkJCWNsZWFyX2JpdChQR19yZXNlcnZlZCwgJih2aXJ0X3RvX3BhZ2UoYXN5bmMtPmJ1Zl9wYWdlX2xpc3RbaV0udmlydF9hZGRyKS0+ZmxhZ3MpKTsKKwkJCQkJY2xlYXJfYml0KFBHX3Jlc2VydmVkLAorCQkJCQkJJih2aXJ0X3RvX3BhZ2UoYXN5bmMtPgorCQkJCQkJCWJ1Zl9wYWdlX2xpc3RbaV0uCisJCQkJCQkJdmlydF9hZGRyKS0+ZmxhZ3MpKTsKIAkJCQkJaWYgKHMtPmFzeW5jX2RtYV9kaXIgIT0gRE1BX05PTkUpIHsKIAkJCQkJCWRtYV9mcmVlX2NvaGVyZW50KGRldi0+aHdfZGV2LAogCQkJCQkJCQkgIFBBR0VfU0laRSwKQEAgLTY0Niw4ICs2NDksNyBAQAogewogCWlmICgoaW50KShhc3luYy0+YnVmX3dyaXRlX2NvdW50ICsgbmJ5dGVzIC0KIAkJICBhc3luYy0+YnVmX3dyaXRlX2FsbG9jX2NvdW50KSA+IDApIHsKLQkJcHJpbnRrCi0JCSAgICAoS0VSTl9JTkZPICJjb21lZGk6IGF0dGVtcHRlZCB0byB3cml0ZS1mcmVlIG1vcmUgYnl0ZXMgdGhhbiBoYXZlIGJlZW4gd3JpdGUtYWxsb2NhdGVkLlxuIik7CisJCXByaW50ayhLRVJOX0lORk8gImNvbWVkaTogYXR0ZW1wdGVkIHRvIHdyaXRlLWZyZWUgbW9yZSBieXRlcyB0aGFuIGhhdmUgYmVlbiB3cml0ZS1hbGxvY2F0ZWQuXG4iKTsKIAkJbmJ5dGVzID0gYXN5bmMtPmJ1Zl93cml0ZV9hbGxvY19jb3VudCAtIGFzeW5jLT5idWZfd3JpdGVfY291bnQ7CiAJfQogCWFzeW5jLT5idWZfd3JpdGVfY291bnQgKz0gbmJ5dGVzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGktZGF0YS9BUENJMTcxMF9Ub3IuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpLWRhdGEvQVBDSTE3MTBfVG9yLmMKaW5kZXggNzM2MWQ1MC4uMGU2YWZmZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGktZGF0YS9BUENJMTcxMF9Ub3IuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaS1kYXRhL0FQQ0kxNzEwX1Rvci5jCkBAIC0xMDA4LDcgKzEwMDgsNyBAQAogCWJfRXh0ZXJuR2F0ZSA9ICh1bnNpZ25lZCBjaGFyKSBkYXRhWzNdOwogCWJfQ3ljbGVNb2RlID0gKHVuc2lnbmVkIGNoYXIpIGRhdGFbNF07CiAJYl9JbnRlcnJ1cHRFbmFibGUgPSAodW5zaWduZWQgY2hhcikgZGF0YVs1XTsKLQlpX1JldHVyblZhbHVlID0gaW5zbi0+bjs7CisJaV9SZXR1cm5WYWx1ZSA9IGluc24tPm47CiAJZGV2cHJpdi0+dHNrX0N1cnJlbnQgPSBjdXJyZW50OwkvKiAgU2F2ZSB0aGUgY3VycmVudCBwcm9jZXNzIHRhc2sgc3RydWN0dXJlICovCiAJLyoqKioqKioqKioqKioqKioqKioqKioqKioqLwogCS8qIFRlc3QgdGhlIG1vZHVsZSBudW1iZXIgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpLWRhdGEvYWRkaV9jb21tb24uYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpLWRhdGEvYWRkaV9jb21tb24uYwppbmRleCA5M2Q3YzA1Li43NmYyNDgzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaS1kYXRhL2FkZGlfY29tbW9uLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGktZGF0YS9hZGRpX2NvbW1vbi5jCkBAIC0yNzEwLDEwICsyNzEwLDEwIEBACiAJCQl9IGVsc2UgewogCQkJCW91dGwoMHg4MzgzODM4MywgZGV2cHJpdi0+aV9Jb2Jhc2VBbWNjICsgMHg2MCk7CiAJCQl9Ci0JCQkvKiAgRW5hYmxlIHRoZSBpbnRlcnJ1cHQgZm9yIHRoZSBjb250cm9sZXIgKi8KKwkJCS8qICBFbmFibGUgdGhlIGludGVycnVwdCBmb3IgdGhlIGNvbnRyb2xsZXIgKi8KIAkJCWR3X0R1bW15ID0gaW5sKGRldnByaXYtPmlfSW9iYXNlQW1jYyArIDB4MzgpOwogCQkJb3V0bChkd19EdW1teSB8IDB4MjAwMCwgZGV2cHJpdi0+aV9Jb2Jhc2VBbWNjICsgMHgzOCk7Ci0JCQlwcmludGsoIlxuRW5hYmxlIHRoZSBpbnRlcnJ1cHQgZm9yIHRoZSBjb250cm9sZXIiKTsKKwkJCXByaW50aygiXG5FbmFibGUgdGhlIGludGVycnVwdCBmb3IgdGhlIGNvbnRyb2xsZXIiKTsKIAkJfQogCQlwcmludGsoIlxuUmVhZCBFZXByb20iKTsKIAkJaV9FZXByb21SZWFkTWFpbkhlYWRlcihpb19hZGRyWzBdLCB0aGlzX2JvYXJkLT5wY19FZXByb21DaGlwLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGktZGF0YS9od2Rydl9BUENJMTcxMC5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGktZGF0YS9od2Rydl9BUENJMTcxMC5jCmluZGV4IDkxMmJjMGYuLmE3NmVkMjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpLWRhdGEvaHdkcnZfQVBDSTE3MTAuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaS1kYXRhL2h3ZHJ2X0FQQ0kxNzEwLmMKQEAgLTIyNSw3ICsyMjUsNyBAQAogCiAJZGV2cHJpdi0+c19Cb2FyZEluZm9zLmJfQm9hcmRWZXJzaW9uID0gMTsKIAotCS8qICBFbmFibGUgdGhlIGludGVycnVwdCBmb3IgdGhlIGNvbnRyb2xlciAqLworCS8qICBFbmFibGUgdGhlIGludGVycnVwdCBmb3IgdGhlIGNvbnRyb2xsZXIgKi8KIAlkd19EdW1teSA9IGlubChkZXZwcml2LT5zX0JvYXJkSW5mb3MudWlfQWRkcmVzcyArIDB4MzgpOwogCW91dGwoZHdfRHVtbXkgfCAweDIwMDAsIGRldnByaXYtPnNfQm9hcmRJbmZvcy51aV9BZGRyZXNzICsgMHgzOCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpLWRhdGEvaHdkcnZfYXBjaTE1MDAuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpLWRhdGEvaHdkcnZfYXBjaTE1MDAuYwppbmRleCAyYThhNmM3Li42MmY0MjFhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaS1kYXRhL2h3ZHJ2X2FwY2kxNTAwLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGktZGF0YS9od2Rydl9hcGNpMTUwMC5jCkBAIC0yODUwLDcgKzI4NTAsNyBAQAogCWlfTG9naWMgPSAwOwogCWlfQ291bnRlckxvZ2ljID0gMDsKIAlpX0ludGVycnVwdE1hc2sgPSAwOwotCWlfSW5wdXRDaGFubmVsID0gMDs7CisJaV9JbnB1dENoYW5uZWwgPSAwOwogCWlfVGltZXJDb3VudGVyMUVuYWJsZWQgPSAwOwogCWlfVGltZXJDb3VudGVyMkVuYWJsZWQgPSAwOwogCWlfV2F0Y2hkb2dDb3VudGVyM0VuYWJsZWQgPSAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGktZGF0YS9od2Rydl9hcGNpMTUxNi5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGktZGF0YS9od2Rydl9hcGNpMTUxNi5jCmluZGV4IDEyZmNjMzUuLjhhNTg0YTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpLWRhdGEvaHdkcnZfYXBjaTE1MTYuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaS1kYXRhL2h3ZHJ2X2FwY2kxNTE2LmMKQEAgLTMzNSw3ICszMzUsNyBAQAogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0JCS8qIGlmIGVsc2UgZGF0YVszXT09MSkgKi8KIAl9CQkJLyogaWYgZWxzZSBkYXRhWzNdPT0wKSAqLwotCXJldHVybiAoaW5zbi0+bik7OworCXJldHVybiAoaW5zbi0+bik7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaS1kYXRhL2h3ZHJ2X2FwY2kzMjAwLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaS1kYXRhL2h3ZHJ2X2FwY2kzMjAwLmMKaW5kZXggYjk0M2EwNi4uYTkzZTIzNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGktZGF0YS9od2Rydl9hcGNpMzIwMC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpLWRhdGEvaHdkcnZfYXBjaTMyMDAuYwpAQCAtMzAxMSw3ICszMDExLDcgQEAKIAogCW91dGwoMHg4MzgzODM4MywgZGV2cHJpdi0+aV9Jb2Jhc2VBbWNjICsgMHg2MCk7CiAKLQkvKiAgRW5hYmxlIHRoZSBpbnRlcnJ1cHQgZm9yIHRoZSBjb250cm9sZXIgKi8KKwkvKiAgRW5hYmxlIHRoZSBpbnRlcnJ1cHQgZm9yIHRoZSBjb250cm9sbGVyICovCiAJZHdfRHVtbXkgPSBpbmwoZGV2cHJpdi0+aV9Jb2Jhc2VBbWNjICsgMHgzOCk7CiAJb3V0bChkd19EdW1teSB8IDB4MjAwMCwgZGV2cHJpdi0+aV9Jb2Jhc2VBbWNjICsgMHgzOCk7CiAJb3V0bCgwLCBkZXZwcml2LT5pX0lvYmFzZUFkZG9uKTsJLyogUmVzZXRzIHRoZSBvdXRwdXQgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpLWRhdGEvaHdkcnZfYXBjaTM1MDEuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpLWRhdGEvaHdkcnZfYXBjaTM1MDEuYwppbmRleCAzNTZhMTg5Li5hY2FjZWIwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaS1kYXRhL2h3ZHJ2X2FwY2kzNTAxLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGktZGF0YS9od2Rydl9hcGNpMzUwMS5jCkBAIC0zMzksNyArMzM5LDcgQEAKIGludCBpX0FQQ0kzNTAxX1dyaXRlQW5hbG9nT3V0cHV0KHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAogCXN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwgdW5zaWduZWQgaW50ICpkYXRhKQogewotCXVuc2lnbmVkIGludCB1bF9Db21tYW5kMSA9IDAsIHVsX0NoYW5uZWxfbm8sIHVsX1BvbGFyaXR5LCB1bF9EQUNfUmVhZHkgPSAwOzsKKwl1bnNpZ25lZCBpbnQgdWxfQ29tbWFuZDEgPSAwLCB1bF9DaGFubmVsX25vLCB1bF9Qb2xhcml0eSwgdWxfREFDX1JlYWR5ID0gMDsKIAogCXVsX0NoYW5uZWxfbm8gPSBDUl9DSEFOKGluc24tPmNoYW5zcGVjKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FtcGxjX3BjaTIzMC5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FtcGxjX3BjaTIzMC5jCmluZGV4IDVkMDY0NTcuLjdlZGViMTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hbXBsY19wY2kyMzAuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYW1wbGNfcGNpMjMwLmMKQEAgLTk3MSw3ICs5NzEsNyBAQAogCWlmICh0aGlzYm9hcmQtPmFvX2NoYW5zID4gMCkgewogCQlzLT50eXBlID0gQ09NRURJX1NVQkRfQU87CiAJCXMtPnN1YmRldl9mbGFncyA9IFNERl9XUklUQUJMRSB8IFNERl9HUk9VTkQ7Ci0JCXMtPm5fY2hhbiA9IHRoaXNib2FyZC0+YW9fY2hhbnM7OworCQlzLT5uX2NoYW4gPSB0aGlzYm9hcmQtPmFvX2NoYW5zOwogCQlzLT5tYXhkYXRhID0gKDEgPDwgdGhpc2JvYXJkLT5hb19iaXRzKSAtIDE7CiAJCXMtPnJhbmdlX3RhYmxlID0gJnBjaTIzMF9hb19yYW5nZTsKIAkJcy0+aW5zbl93cml0ZSA9ICZwY2kyMzBfYW9fd2luc247CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvY2JfZGFzMTZfY3MuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jYl9kYXMxNl9jcy5jCmluZGV4IDAzNDViNGMuLmJiOTM2ODUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jYl9kYXMxNl9jcy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jYl9kYXMxNl9jcy5jCkBAIC0xNjksNyArMTY5LDcgQEAKIAlpZiAoIWxpbmspCiAJCXJldHVybiAtRUlPOwogCi0JZGV2LT5pb2Jhc2UgPSBsaW5rLT5yZXNvdXJjZVswXS0+c3RhcnQ7OworCWRldi0+aW9iYXNlID0gbGluay0+cmVzb3VyY2VbMF0tPnN0YXJ0OwogCXByaW50aygiSS9PIGJhc2U9MHglMDRseCAiLCBkZXYtPmlvYmFzZSk7CiAKIAlwcmludGsoImZpbmdlcnByaW50OlxuIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvY29tZWRpX2JvbmQuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jb21lZGlfYm9uZC5jCmluZGV4IGNmY2JkOWIuLmQ4YWVmYjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jb21lZGlfYm9uZC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jb21lZGlfYm9uZC5jCkBAIC0zNzAsNyArMzcwLDcgQEAKIAlzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2c19vcGVuZWRbQ09NRURJX05VTV9CT0FSRF9NSU5PUlNdOwogCiAJbWVtc2V0KGRldnNfb3BlbmVkLCAwLCBzaXplb2YoZGV2c19vcGVuZWQpKTsKLQlkZXZwcml2LT5uYW1lWzBdID0gMDs7CisJZGV2cHJpdi0+bmFtZVswXSA9IDA7CiAJLyogTG9vcCB0aHJvdWdoIGFsbCBjb21lZGkgZGV2aWNlcyBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQtbGluZSwKIAkgICBidWlsZGluZyBvdXIgZGV2aWNlIGxpc3QgKi8KIAlmb3IgKGkgPSAwOyBpIDwgQ09NRURJX05ERVZDT05GT1BUUyAmJiAoIWkgfHwgaXQtPm9wdGlvbnNbaV0pOyArK2kpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9paV9wY2kyMGtjLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvaWlfcGNpMjBrYy5jCmluZGV4IDM5YTZhODUuLmU0NzExZWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9paV9wY2kyMGtjLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2lpX3BjaTIwa2MuYwpAQCAtMTksNyArMTksNyBAQAogICoJCQkJLSAxNiBiaXQKICAqCiAgKglvbmx5IE9ORSBQQ0ktMjAzNDEgbW9kdWxlIHBvc3NpYmxlCi0gKiAJb25seSBPTkUgUENJLTIwMDA2IG1vZHVsZSBwb3NzaWJsZQorICoJb25seSBPTkUgUENJLTIwMDA2IG1vZHVsZSBwb3NzaWJsZQogICoJbm8gZXh0ZXJuIHRyaWdnZXIgaW1wbGVtZW50ZWQKICAqCiAgKglOT1QgV09SS0lORyAoYnV0IHNvb24pIG9ubHkgNCBvbi1ib2FyZCBkaWZmZXJlbnRpYWwgY2hhbm5lbHMgc3VwcG9ydGVkCkBAIC04MywxMSArODMsMTEgQEAKICNpbmNsdWRlICIuLi9jb21lZGlkZXYuaCIKIAogI2RlZmluZSBQQ0kyMDAwMF9JRAkJCTB4MWQKLSNkZWZpbmUgUENJMjAzNDFfSUQgICAgCQkJMHg3NwotI2RlZmluZSBQQ0kyMDAwNl9JRCAgICAgIAkJMHhlMworI2RlZmluZSBQQ0kyMDM0MV9JRAkJCTB4NzcKKyNkZWZpbmUgUENJMjAwMDZfSUQJCQkweGUzCiAjZGVmaW5lIFBDSTIweHh4X0VNUFRZX0lECQkweGZmCiAKLSNkZWZpbmUgUENJMjAwMDBfT0ZGU0VUIAkJMHgxMDAKKyNkZWZpbmUgUENJMjAwMDBfT0ZGU0VUCQkJMHgxMDAKICNkZWZpbmUgUENJMjAwMDBfTU9EVUxFUwkJMwogCiAjZGVmaW5lIFBDSTIwMDAwX0RJT18wCQkJMHg4MApAQCAtMjQ2LDcgKzI0Niw3IEBACiAJCQlwY2kyMDAwNl9pbml0KGRldiwgcywgaXQtPm9wdGlvbnNbMiAqIGkgKyAyXSwKIAkJCQkgICAgICBpdC0+b3B0aW9uc1syICogaSArIDNdKTsKIAkJCXByaW50ayhLRVJOX0lORk8gImNvbWVkaSVkOiAiCi0JCQkgICAgICAgImlpX3BjaTIwa2MgUENJLTIwMDA2IG1vZHVsZSBpbiBzbG90ICVkIFxuIiwKKwkJCSAgICAgICAiaWlfcGNpMjBrYyBQQ0ktMjAwMDYgbW9kdWxlIGluIHNsb3QgJWRcbiIsCiAJCQkgICAgICAgZGV2LT5taW5vciwgaSArIDEpOwogCQkJYnJlYWs7CiAJCWNhc2UgUENJMjAzNDFfSUQ6CkBAIC0yNTUsNyArMjU1LDcgQEAKIAkJCXBjaTIwMzQxX2luaXQoZGV2LCBzLCBpdC0+b3B0aW9uc1syICogaSArIDJdLAogCQkJCSAgICAgIGl0LT5vcHRpb25zWzIgKiBpICsgM10pOwogCQkJcHJpbnRrKEtFUk5fSU5GTyAiY29tZWRpJWQ6ICIKLQkJCSAgICAgICAiaWlfcGNpMjBrYyBQQ0ktMjAzNDEgbW9kdWxlIGluIHNsb3QgJWQgXG4iLAorCQkJICAgICAgICJpaV9wY2kyMGtjIFBDSS0yMDM0MSBtb2R1bGUgaW4gc2xvdCAlZFxuIiwKIAkJCSAgICAgICBkZXYtPm1pbm9yLCBpICsgMSk7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKQEAgLTM3Niw5ICszNzYsMjAgQEAKIHN0YXRpYyBjb25zdCBpbnQgcGNpMjAzNDFfdGltZWJhc2VbXSA9IHsgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNCB9Owogc3RhdGljIGNvbnN0IGludCBwY2kyMDM0MV9zZXR0bGluZ190aW1lW10gPSB7IDB4NTgsIDB4NTgsIDB4OTMsIDB4OTkgfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBjb21lZGlfbHJhbmdlIHJhbmdlX2JpcG9sYXIwXzUgPSB7IDEsIHtCSVBfUkFOR0UoMC41KX0gfTsKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgY29tZWRpX2xyYW5nZSByYW5nZV9iaXBvbGFyMF8wNSA9IHsgMSwge0JJUF9SQU5HRSgwLjA1KX0gfTsKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgY29tZWRpX2xyYW5nZSByYW5nZV9iaXBvbGFyMF8wMjUgPSB7IDEsIHtCSVBfUkFOR0UoMC4wMjUpfSB9Oworc3RhdGljIGNvbnN0IHN0cnVjdCBjb21lZGlfbHJhbmdlIHJhbmdlX2JpcG9sYXIwXzUgPSB7CisJMSwKKwl7QklQX1JBTkdFKDAuNSl9Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGNvbWVkaV9scmFuZ2UgcmFuZ2VfYmlwb2xhcjBfMDUgPSB7CisJMSwKKwl7QklQX1JBTkdFKDAuMDUpfQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBjb21lZGlfbHJhbmdlIHJhbmdlX2JpcG9sYXIwXzAyNSA9IHsKKwkxLAorCXtCSVBfUkFOR0UoMC4wMjUpfQorfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBjb21lZGlfbHJhbmdlICpjb25zdCBwY2kyMDM0MV9yYW5nZXNbXSA9IHsKIAkmcmFuZ2VfYmlwb2xhcjUsCkBAIC00MDgsMTIgKzQxOSwxOCBAQAogCXMtPm1heGRhdGEgPSAweGZmZmY7CiAJcy0+cmFuZ2VfdGFibGUgPSBwY2kyMDM0MV9yYW5nZXNbb3B0MF07CiAKLQlvcHRpb24gPSBzZHAtPnBjaTIwMzQxLnRpbWViYXNlIHwgUENJMjAzNDFfUkVQTU9ERTsJLyogZGVwZW5kcyBvbiBnYWluLCB0cmlnZ2VyLCByZXBldGl0aW9uIG1vZGUgKi8KKwkvKiBkZXBlbmRzIG9uIGdhaW4sIHRyaWdnZXIsIHJlcGV0aXRpb24gbW9kZSAqLworCW9wdGlvbiA9IHNkcC0+cGNpMjAzNDEudGltZWJhc2UgfCBQQ0kyMDM0MV9SRVBNT0RFOwogCi0Jd3JpdGViKFBDSTIwMzQxX0lOSVQsIHNkcC0+aW9iYXNlICsgUENJMjAzNDFfQ09ORklHX1JFRyk7CS8qIGluaXRpYWxpemUgTW9kdWxlICovCi0Jd3JpdGViKFBDSTIwMzQxX1BBQ0VSLCBzZHAtPmlvYmFzZSArIFBDSTIwMzQxX01PRF9TVEFUVVMpOwkvKiBzZXQgUGFjZXIgKi8KLQl3cml0ZWIob3B0aW9uLCBzZHAtPmlvYmFzZSArIFBDSTIwMzQxX09QVF9SRUcpOwkvKiBvcHRpb24gcmVnaXN0ZXIgKi8KLQl3cml0ZWIoc2RwLT5wY2kyMDM0MS5zZXR0bGluZ190aW1lLCBzZHAtPmlvYmFzZSArIFBDSTIwMzQxX1NFVF9USU1FX1JFRyk7CS8qIHNldHRsaW5nIHRpbWUgY291bnRlciAqLworCS8qIGluaXRpYWxpemUgTW9kdWxlICovCisJd3JpdGViKFBDSTIwMzQxX0lOSVQsIHNkcC0+aW9iYXNlICsgUENJMjAzNDFfQ09ORklHX1JFRyk7CisJLyogc2V0IFBhY2VyICovCisJd3JpdGViKFBDSTIwMzQxX1BBQ0VSLCBzZHAtPmlvYmFzZSArIFBDSTIwMzQxX01PRF9TVEFUVVMpOworCS8qIG9wdGlvbiByZWdpc3RlciAqLworCXdyaXRlYihvcHRpb24sIHNkcC0+aW9iYXNlICsgUENJMjAzNDFfT1BUX1JFRyk7CisJLyogc2V0dGxpbmcgdGltZSBjb3VudGVyICovCisJd3JpdGViKHNkcC0+cGNpMjAzNDEuc2V0dGxpbmdfdGltZSwKKwkJc2RwLT5pb2Jhc2UgKyBQQ0kyMDM0MV9TRVRfVElNRV9SRUcpOwogCS8qIHRyaWdnZXIgbm90IGltcGxlbWVudGVkICovCiAJcmV0dXJuIDA7CiB9CkBAIC00MjksMTEgKzQ0NiwxNSBAQAogCXVuc2lnbmVkIGludCBjbGI7CS8qIGNoYW5uZWwgbGlzdCBieXRlICovCiAJdW5zaWduZWQgaW50IGJvYXJkZGF0YTsKIAotCXdyaXRlYigxLCBzZHAtPmlvYmFzZSArIFBDSTIwMzQxX0xDSEFOX0FERFJfUkVHKTsJLyogd3JpdGUgbnVtYmVyIG9mIGlucHV0IGNoYW5uZWxzICovCisJLyogd3JpdGUgbnVtYmVyIG9mIGlucHV0IGNoYW5uZWxzICovCisJd3JpdGViKDEsIHNkcC0+aW9iYXNlICsgUENJMjAzNDFfTENIQU5fQUREUl9SRUcpOwogCWNsYiA9IFBDSTIwMzQxX0RBSVNZX0NIQUlOIHwgUENJMjAzNDFfTVVYIHwgKHNkcC0+cGNpMjAzNDEuYWlfZ2FpbiA8PCAzKQogCSAgICB8IENSX0NIQU4oaW5zbi0+Y2hhbnNwZWMpOwogCXdyaXRlYihjbGIsIHNkcC0+aW9iYXNlICsgUENJMjAzNDFfQ0hBTl9MSVNUKTsKLQl3cml0ZWIoMHgwMCwgc2RwLT5pb2Jhc2UgKyBQQ0kyMDM0MV9DQ19SRVNFVCk7CS8qIHJlc2V0IHNldHRsaW5nIHRpbWUgY291bnRlciBhbmQgdHJpZ2dlciBkZWxheSBjb3VudGVyICovCisKKwkvKiByZXNldCBzZXR0bGluZyB0aW1lIGNvdW50ZXIgYW5kIHRyaWdnZXIgZGVsYXkgY291bnRlciAqLworCXdyaXRlYigweDAwLCBzZHAtPmlvYmFzZSArIFBDSTIwMzQxX0NDX1JFU0VUKTsKKwogCXdyaXRlYigweDAwLCBzZHAtPmlvYmFzZSArIFBDSTIwMzQxX0NIQU5fUkVTRVQpOwogCiAJLyogZ2VuZXJhdGUgUGFjZXIgKi8KQEAgLTQ0NCw5ICs0NjUsMTIgQEAKIAkJICogdGhlIHdob2xlIGludGVycnVwdCBzdHVmZgogCQkgKi8KIAkJaiA9IDA7Ci0JCXJlYWRiKHNkcC0+aW9iYXNlICsgUENJMjAzNDFfU09GVF9QQUNFUik7CS8qIGdlbmVyYXRlIFBhY2VyICovCisJCS8qIGdlbmVyYXRlIFBhY2VyICovCisJCXJlYWRiKHNkcC0+aW9iYXNlICsgUENJMjAzNDFfU09GVF9QQUNFUik7CisKIAkJZW9jID0gcmVhZGIoc2RwLT5pb2Jhc2UgKyBQQ0kyMDM0MV9TVEFUVVNfUkVHKTsKLQkJd2hpbGUgKChlb2MgPCAweDgwKSAmJiBqIDwgMTAwKSB7CS8qIHBvbGwgSW50ZXJydXB0IEZsYWcgKi8KKwkJLyogcG9sbCBJbnRlcnJ1cHQgRmxhZyAqLworCQl3aGlsZSAoKGVvYyA8IDB4ODApICYmIGogPCAxMDApIHsKIAkJCWorKzsKIAkJCWVvYyA9IHJlYWRiKHNkcC0+aW9iYXNlICsgUENJMjAzNDFfU1RBVFVTX1JFRyk7CiAJCX0KQEAgLTQ2MCw3ICs0ODQsOSBAQAogCQlsbyA9IHJlYWRiKHNkcC0+aW9iYXNlICsgUENJMjAzNDFfTERBVEEpOwogCQloaSA9IHJlYWRiKHNkcC0+aW9iYXNlICsgUENJMjAzNDFfTERBVEEgKyAxKTsKIAkJYm9hcmRkYXRhID0gbG8gKyAweDEwMCAqIGhpOwotCQlkYXRhW2ldID0gKHNob3J0KSgoYm9hcmRkYXRhICsgMHg4MDAwKSAmIDB4ZmZmZik7CS8qIGJvYXJkLWRhdGEgLT4gY29tZWRpLWRhdGEgKi8KKworCQkvKiBib2FyZC1kYXRhIC0+IGNvbWVkaS1kYXRhICovCisJCWRhdGFbaV0gPSAoc2hvcnQpKChib2FyZGRhdGEgKyAweDgwMDApICYgMHhmZmZmKTsKIAl9CiAKIAlyZXR1cm4gaTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9qcjNfcGNpLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvanIzX3BjaS5jCmluZGV4IDhiMzgzZWUuLjVjNmM3MjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9qcjNfcGNpLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2pyM19wY2kuYwpAQCAtNTQsNiArNTQsNyBAQAogCiAjZGVmaW5lIFBDSV9WRU5ET1JfSURfSlIzIDB4MTc2MgogI2RlZmluZSBQQ0lfREVWSUNFX0lEX0pSM18xX0NIQU5ORUwgMHgzMTExCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSlIzXzFfQ0hBTk5FTF9ORVcgMHgxMTExCiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSlIzXzJfQ0hBTk5FTCAweDMxMTIKICNkZWZpbmUgUENJX0RFVklDRV9JRF9KUjNfM19DSEFOTkVMIDB4MzExMwogI2RlZmluZSBQQ0lfREVWSUNFX0lEX0pSM180X0NIQU5ORUwgMHgzMTE0CkBAIC03Myw2ICs3NCw4IEBACiAJewogCVBDSV9WRU5ET1JfSURfSlIzLCBQQ0lfREVWSUNFX0lEX0pSM18xX0NIQU5ORUwsCiAJCSAgICBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwgeworCVBDSV9WRU5ET1JfSURfSlIzLCBQQ0lfREVWSUNFX0lEX0pSM18xX0NIQU5ORUxfTkVXLAorCQkgICAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sIHsKIAlQQ0lfVkVORE9SX0lEX0pSMywgUENJX0RFVklDRV9JRF9KUjNfMl9DSEFOTkVMLAogCQkgICAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sIHsKIAlQQ0lfVkVORE9SX0lEX0pSMywgUENJX0RFVklDRV9JRF9KUjNfM19DSEFOTkVMLApAQCAtODA3LDYgKzgxMCwxMCBAQAogCQkJCQlkZXZwcml2LT5uX2NoYW5uZWxzID0gMTsKIAkJCQl9CiAJCQkJYnJlYWs7CisJCQljYXNlIFBDSV9ERVZJQ0VfSURfSlIzXzFfQ0hBTk5FTF9ORVc6eworCQkJCQlkZXZwcml2LT5uX2NoYW5uZWxzID0gMTsKKwkJCQl9CisJCQkJYnJlYWs7CiAJCQljYXNlIFBDSV9ERVZJQ0VfSURfSlIzXzJfQ0hBTk5FTDp7CiAJCQkJCWRldnByaXYtPm5fY2hhbm5lbHMgPSAyOwogCQkJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV90aW9jbWQuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV90aW9jbWQuYwppbmRleCBiMGQ0NGI1Li5hOTYxMTU4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfdGlvY21kLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX3Rpb2NtZC5jCkBAIC02MiwxMSArNjIsMTAgQEAKIAl1bnNpZ25lZCBpbnB1dF9zZWxlY3RfYml0cyA9IDA7CiAKIAlpZiAoZW5hYmxlKSB7Ci0JCWlmIChyZWFkX25vdF93cml0ZSkgeworCQlpZiAocmVhZF9ub3Rfd3JpdGUpCiAJCQlpbnB1dF9zZWxlY3RfYml0cyB8PSBHaV9SZWFkX0Fja25vd2xlZGdlc19JcnE7Ci0JCX0gZWxzZSB7CisJCWVsc2UKIAkJCWlucHV0X3NlbGVjdF9iaXRzIHw9IEdpX1dyaXRlX0Fja25vd2xlZGdlc19JcnE7Ci0JCX0KIAl9CiAJbmlfdGlvX3NldF9iaXRzKGNvdW50ZXIsCiAJCQlOSVRJT19HaV9JbnB1dF9TZWxlY3RfUmVnKGNvdW50ZXItPmNvdW50ZXJfaW5kZXgpLApAQCAtODQsOSArODMsOCBAQAogCQkJCWdpX2RtYV9jb25maWdfYml0cyB8PSBHaV9ETUFfRW5hYmxlX0JpdDsKIAkJCQlnaV9kbWFfY29uZmlnX2JpdHMgfD0gR2lfRE1BX0ludF9CaXQ7CiAJCQl9Ci0JCQlpZiAocmVhZF9ub3Rfd3JpdGUgPT0gMCkgeworCQkJaWYgKHJlYWRfbm90X3dyaXRlID09IDApCiAJCQkJZ2lfZG1hX2NvbmZpZ19iaXRzIHw9IEdpX0RNQV9Xcml0ZV9CaXQ7Ci0JCQl9CiAJCQluaV90aW9fc2V0X2JpdHMoY291bnRlciwKIAkJCQkJTklUSU9fR2lfRE1BX0NvbmZpZ19SZWcoY291bnRlci0+CiAJCQkJCQkJCWNvdW50ZXJfaW5kZXgpLApAQCAtMTc0LDcgKzE3Miw3IEBACiBzdGF0aWMgaW50IG5pX3Rpb19vdXRwdXRfY21kKHN0cnVjdCBuaV9ncGN0ICpjb3VudGVyLAogCQkJICAgICBzdHJ1Y3QgY29tZWRpX2FzeW5jICphc3luYykKIHsKLQlwcmludGsoIm5pX3Rpbzogb3V0cHV0IGNvbW1hbmRzIG5vdCB5ZXQgaW1wbGVtZW50ZWQuXG4iKTsKKwlwcmludGsoS0VSTl9FUlIgIm5pX3Rpbzogb3V0cHV0IGNvbW1hbmRzIG5vdCB5ZXQgaW1wbGVtZW50ZWQuXG4iKTsKIAlyZXR1cm4gLUVOT1RTVVBQOwogCiAJY291bnRlci0+bWl0ZV9jaGFuLT5kaXIgPSBDT01FRElfT1VUUFVUOwpAQCAtMTk4LDkgKzE5Niw4IEBACiAJCXNldF9nYXRlX3NvdXJjZSA9IDE7CiAJCWdhdGVfc291cmNlID0gY21kLT5jb252ZXJ0X2FyZzsKIAl9Ci0JaWYgKHNldF9nYXRlX3NvdXJjZSkgeworCWlmIChzZXRfZ2F0ZV9zb3VyY2UpCiAJCXJldHZhbCA9IG5pX3Rpb19zZXRfZ2F0ZV9zcmMoY291bnRlciwgMCwgZ2F0ZV9zb3VyY2UpOwotCX0KIAlpZiAoY21kLT5mbGFncyAmIFRSSUdfV0FLRV9FT1MpIHsKIAkJbmlfdGlvX3NldF9iaXRzKGNvdW50ZXIsCiAJCQkJTklUSU9fR2lfSW50ZXJydXB0X0VuYWJsZV9SZWcoY291bnRlci0+CkBAIC0yMjEsMjIgKzIxOCwyMSBAQAogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmNvdW50ZXItPmxvY2ssIGZsYWdzKTsKIAlpZiAoY291bnRlci0+bWl0ZV9jaGFuID09IE5VTEwpIHsKLQkJcHJpbnRrCi0JCSAgICAoIm5pX3RpbzogY29tbWFuZHMgb25seSBzdXBwb3J0ZWQgd2l0aCBETUEuICBJbnRlcnJ1cHQtZHJpdmVuIGNvbW1hbmRzIG5vdCB5ZXQgaW1wbGVtZW50ZWQuXG4iKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJuaV90aW86IGNvbW1hbmRzIG9ubHkgc3VwcG9ydGVkIHdpdGggRE1BLiAgSW50ZXJydXB0LWRyaXZlbiBjb21tYW5kcyBub3QgeWV0IGltcGxlbWVudGVkLlxuIik7CiAJCXJldHZhbCA9IC1FSU87CiAJfSBlbHNlIHsKIAkJcmV0dmFsID0gbmlfdGlvX2NtZF9zZXR1cChjb3VudGVyLCBhc3luYyk7CiAJCWlmIChyZXR2YWwgPT0gMCkgewotCQkJaWYgKGNtZC0+ZmxhZ3MgJiBDTURGX1dSSVRFKSB7CisJCQlpZiAoY21kLT5mbGFncyAmIENNREZfV1JJVEUpCiAJCQkJcmV0dmFsID0gbmlfdGlvX291dHB1dF9jbWQoY291bnRlciwgYXN5bmMpOwotCQkJfSBlbHNlIHsKKwkJCWVsc2UKIAkJCQlyZXR2YWwgPSBuaV90aW9faW5wdXRfY21kKGNvdW50ZXIsIGFzeW5jKTsKLQkJCX0KIAkJfQogCX0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjb3VudGVyLT5sb2NrLCBmbGFncyk7CiAJcmV0dXJuIHJldHZhbDsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKG5pX3Rpb19jbWQpOwogCiBpbnQgbmlfdGlvX2NtZHRlc3Qoc3RydWN0IG5pX2dwY3QgKmNvdW50ZXIsIHN0cnVjdCBjb21lZGlfY21kICpjbWQpCiB7CkBAIC0zNDIsNiArMzM4LDcgQEAKIAogCXJldHVybiAwOwogfQorRVhQT1JUX1NZTUJPTF9HUEwobmlfdGlvX2NtZHRlc3QpOwogCiBpbnQgbmlfdGlvX2NhbmNlbChzdHJ1Y3QgbmlfZ3BjdCAqY291bnRlcikKIHsKQEAgLTM0OSw5ICszNDYsOCBAQAogCiAJbmlfdGlvX2FybShjb3VudGVyLCAwLCAwKTsKIAlzcGluX2xvY2tfaXJxc2F2ZSgmY291bnRlci0+bG9jaywgZmxhZ3MpOwotCWlmIChjb3VudGVyLT5taXRlX2NoYW4pIHsKKwlpZiAoY291bnRlci0+bWl0ZV9jaGFuKQogCQltaXRlX2RtYV9kaXNhcm0oY291bnRlci0+bWl0ZV9jaGFuKTsKLQl9CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY291bnRlci0+bG9jaywgZmxhZ3MpOwogCW5pX3Rpb19jb25maWd1cmVfZG1hKGNvdW50ZXIsIDAsIDApOwogCkBAIC0zNjEsMTAgKzM1NywxMSBAQAogCQkJMHgwKTsKIAlyZXR1cm4gMDsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKG5pX3Rpb19jYW5jZWwpOwogCi0JLyogRHVyaW5nIGJ1ZmZlcmVkIGlucHV0IGNvdW50ZXIgb3BlcmF0aW9uIGZvciBlLXNlcmllcywgdGhlIGdhdGUgaW50ZXJydXB0IGlzIGFja2VkCi0JICAgYXV0b21hdGljYWxseSBieSB0aGUgZG1hIGNvbnRyb2xsZXIsIGR1ZSB0byB0aGUgR2lfUmVhZC9Xcml0ZV9BY2tub3dsZWRnZXNfSVJRIGJpdHMKLQkgICBpbiB0aGUgaW5wdXQgc2VsZWN0IHJlZ2lzdGVyLiAgKi8KKwkvKiBEdXJpbmcgYnVmZmVyZWQgaW5wdXQgY291bnRlciBvcGVyYXRpb24gZm9yIGUtc2VyaWVzLCB0aGUgZ2F0ZQorCSAgIGludGVycnVwdCBpcyBhY2tlZCBhdXRvbWF0aWNhbGx5IGJ5IHRoZSBkbWEgY29udHJvbGxlciwgZHVlIHRvIHRoZQorCSAgIEdpX1JlYWQvV3JpdGVfQWNrbm93bGVkZ2VzX0lSUSBiaXRzIGluIHRoZSBpbnB1dCBzZWxlY3QgcmVnaXN0ZXIuICAqLwogc3RhdGljIGludCBzaG91bGRfYWNrX2dhdGUoc3RydWN0IG5pX2dwY3QgKmNvdW50ZXIpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKQEAgLTM3Miw3ICszNjksMTAgQEAKIAogCXN3aXRjaCAoY291bnRlci0+Y291bnRlcl9kZXYtPnZhcmlhbnQpIHsKIAljYXNlIG5pX2dwY3RfdmFyaWFudF9tX3NlcmllczoKLQljYXNlIG5pX2dwY3RfdmFyaWFudF82NjB4OgkvKiAgbm90IHN1cmUgaWYgNjYweCByZWFsbHkgc3VwcG9ydHMgZ2F0ZSBpbnRlcnJ1cHRzICh0aGUgYml0cyBhcmUgbm90IGxpc3RlZCBpbiByZWdpc3Rlci1sZXZlbCBtYW51YWwpICovCisJLyogIG5vdCBzdXJlIGlmIDY2MHggcmVhbGx5IHN1cHBvcnRzIGdhdGUKKwkgICAgaW50ZXJydXB0cyAodGhlIGJpdHMgYXJlIG5vdCBsaXN0ZWQKKwkgICAgaW4gcmVnaXN0ZXItbGV2ZWwgbWFudWFsKSAqLworCWNhc2UgbmlfZ3BjdF92YXJpYW50XzY2MHg6CiAJCXJldHVybiAxOwogCQlicmVhazsKIAljYXNlIG5pX2dwY3RfdmFyaWFudF9lX3NlcmllczoKQEAgLTQxNiw3ICs0MTYsOCBAQAogCWlmIChneHhfc3RhdHVzICYgR2lfR2F0ZV9FcnJvcl9CaXQoY291bnRlci0+Y291bnRlcl9pbmRleCkpIHsKIAkJYWNrIHw9IEdpX0dhdGVfRXJyb3JfQ29uZmlybV9CaXQoY291bnRlci0+Y291bnRlcl9pbmRleCk7CiAJCWlmIChnYXRlX2Vycm9yKSB7Ci0JCQkvKjY2MHggZG9uJ3Qgc3VwcG9ydCBhdXRvbWF0aWMgYWNrbm93bGVkZ2VtZW50IG9mIGdhdGUgaW50ZXJydXB0IHZpYSBkbWEgcmVhZC93cml0ZQorCQkJLyo2NjB4IGRvbid0IHN1cHBvcnQgYXV0b21hdGljIGFja25vd2xlZGdlbWVudAorCQkJICBvZiBnYXRlIGludGVycnVwdCB2aWEgZG1hIHJlYWQvd3JpdGUKIAkJCSAgIGFuZCByZXBvcnQgYm9ndXMgZ2F0ZSBlcnJvcnMgKi8KIAkJCWlmIChjb3VudGVyLT5jb3VudGVyX2Rldi0+dmFyaWFudCAhPQogCQkJICAgIG5pX2dwY3RfdmFyaWFudF82NjB4KSB7CkBAIC00MjksOSArNDMwLDggQEAKIAkJaWYgKHRjX2Vycm9yKQogCQkJKnRjX2Vycm9yID0gMTsKIAl9Ci0JaWYgKGdpX3N0YXR1cyAmIEdpX1RDX0JpdCkgeworCWlmIChnaV9zdGF0dXMgJiBHaV9UQ19CaXQpCiAJCWFjayB8PSBHaV9UQ19JbnRlcnJ1cHRfQWNrX0JpdDsKLQl9CiAJaWYgKGdpX3N0YXR1cyAmIEdpX0dhdGVfSW50ZXJydXB0X0JpdCkgewogCQlpZiAoc2hvdWxkX2Fja19nYXRlKGNvdW50ZXIpKQogCQkJYWNrIHw9IEdpX0dhdGVfSW50ZXJydXB0X0Fja19CaXQ7CkBAIC00NTIsMTMgKzQ1MiwxNCBAQAogCQkJCSAgTklUSU9fR3h4X0pvaW50X1N0YXR1czJfUmVnCiAJCQkJICAoY291bnRlci0+Y291bnRlcl9pbmRleCkpICYKIAkJICAgIEdpX1Blcm1hbmVudF9TdGFsZV9CaXQoY291bnRlci0+Y291bnRlcl9pbmRleCkpIHsKLQkJCXByaW50aygiJXM6IEdpX1Blcm1hbmVudF9TdGFsZV9EYXRhIGRldGVjdGVkLlxuIiwKLQkJCSAgICAgICBfX0ZVTkNUSU9OX18pOworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEdpX1Blcm1hbmVudF9TdGFsZV9EYXRhIGRldGVjdGVkLlxuIiwKKwkJCSAgICAgICBfX2Z1bmNfXyk7CiAJCQlpZiAocGVybV9zdGFsZV9kYXRhKQogCQkJCSpwZXJtX3N0YWxlX2RhdGEgPSAxOwogCQl9CiAJfQogfQorRVhQT1JUX1NZTUJPTF9HUEwobmlfdGlvX2Fja25vd2xlZGdlX2FuZF9jb25maXJtKTsKIAogdm9pZCBuaV90aW9faGFuZGxlX2ludGVycnVwdChzdHJ1Y3QgbmlfZ3BjdCAqY291bnRlciwKIAkJCSAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMpCkBAIC00NzIsMjAgKzQ3MywxOSBAQAogCW5pX3Rpb19hY2tub3dsZWRnZV9hbmRfY29uZmlybShjb3VudGVyLCAmZ2F0ZV9lcnJvciwgJnRjX2Vycm9yLAogCQkJCSAgICAgICAmcGVybV9zdGFsZV9kYXRhLCBOVUxMKTsKIAlpZiAoZ2F0ZV9lcnJvcikgewotCQlwcmludGsoIiVzOiBHaV9HYXRlX0Vycm9yIGRldGVjdGVkLlxuIiwgX19GVU5DVElPTl9fKTsKKwkJcHJpbnRrKEtFUk5fTk9USUNFICIlczogR2lfR2F0ZV9FcnJvciBkZXRlY3RlZC5cbiIsIF9fZnVuY19fKTsKIAkJcy0+YXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfT1ZFUkZMT1c7CiAJfQotCWlmIChwZXJtX3N0YWxlX2RhdGEpIHsKKwlpZiAocGVybV9zdGFsZV9kYXRhKQogCQlzLT5hc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9FUlJPUjsKLQl9CiAJc3dpdGNoIChjb3VudGVyLT5jb3VudGVyX2Rldi0+dmFyaWFudCkgewogCWNhc2UgbmlfZ3BjdF92YXJpYW50X21fc2VyaWVzOgogCWNhc2UgbmlfZ3BjdF92YXJpYW50XzY2MHg6CiAJCWlmIChyZWFkX3JlZ2lzdGVyKGNvdW50ZXIsCi0JCQkJICBOSVRJT19HaV9ETUFfU3RhdHVzX1JlZwotCQkJCSAgKGNvdW50ZXItPmNvdW50ZXJfaW5kZXgpKSAmIEdpX0RSUV9FcnJvcl9CaXQpCi0JCXsKLQkJCXByaW50aygiJXM6IEdpX0RSUV9FcnJvciBkZXRlY3RlZC5cbiIsIF9fRlVOQ1RJT05fXyk7CisJCQkJTklUSU9fR2lfRE1BX1N0YXR1c19SZWcKKwkJCQkoY291bnRlci0+Y291bnRlcl9pbmRleCkpICYgR2lfRFJRX0Vycm9yX0JpdCkgeworCQkJcHJpbnRrKEtFUk5fTk9USUNFICIlczogR2lfRFJRX0Vycm9yIGRldGVjdGVkLlxuIiwKKwkJCQkJCQlfX2Z1bmNfXyk7CiAJCQlzLT5hc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9PVkVSRkxPVzsKIAkJfQogCQlicmVhazsKQEAgLTUwNiw2ICs1MDYsNyBAQAogCW1pdGVfc3luY19pbnB1dF9kbWEoY291bnRlci0+bWl0ZV9jaGFuLCBzLT5hc3luYyk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY291bnRlci0+bG9jaywgZmxhZ3MpOwogfQorRVhQT1JUX1NZTUJPTF9HUEwobmlfdGlvX2hhbmRsZV9pbnRlcnJ1cHQpOwogCiB2b2lkIG5pX3Rpb19zZXRfbWl0ZV9jaGFubmVsKHN0cnVjdCBuaV9ncGN0ICpjb3VudGVyLAogCQkJICAgICBzdHJ1Y3QgbWl0ZV9jaGFubmVsICptaXRlX2NoYW4pCkBAIC01MTYsNiArNTE3LDcgQEAKIAljb3VudGVyLT5taXRlX2NoYW4gPSBtaXRlX2NoYW47CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY291bnRlci0+bG9jaywgZmxhZ3MpOwogfQorRVhQT1JUX1NZTUJPTF9HUEwobmlfdGlvX3NldF9taXRlX2NoYW5uZWwpOwogCiBzdGF0aWMgaW50IF9faW5pdCBuaV90aW9jbWRfaW5pdF9tb2R1bGUodm9pZCkKIHsKQEAgLTUyOSwxMCArNTMxLDMgQEAKIH0KIAogbW9kdWxlX2V4aXQobmlfdGlvY21kX2NsZWFudXBfbW9kdWxlKTsKLQotRVhQT1JUX1NZTUJPTF9HUEwobmlfdGlvX2NtZCk7Ci1FWFBPUlRfU1lNQk9MX0dQTChuaV90aW9fY21kdGVzdCk7Ci1FWFBPUlRfU1lNQk9MX0dQTChuaV90aW9fY2FuY2VsKTsKLUVYUE9SVF9TWU1CT0xfR1BMKG5pX3Rpb19oYW5kbGVfaW50ZXJydXB0KTsKLUVYUE9SVF9TWU1CT0xfR1BMKG5pX3Rpb19zZXRfbWl0ZV9jaGFubmVsKTsKLUVYUE9SVF9TWU1CT0xfR1BMKG5pX3Rpb19hY2tub3dsZWRnZV9hbmRfY29uZmlybSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcnRkNTIwLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcnRkNTIwLmMKaW5kZXggNjBlYmZjMy4uYWE4YWVlZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3J0ZDUyMC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9ydGQ1MjAuYwpAQCAtNzUzLDcgKzc1Myw3IEBACiAJc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnM7CiAJc3RydWN0IHBjaV9kZXYgKnBjaWRldjsKIAlpbnQgcmV0OwotCXJlc291cmNlX3NpemVfdCBwaHlzTGFzMDsJLyogY29uZmlndWF0aW9uICovCisJcmVzb3VyY2Vfc2l6ZV90IHBoeXNMYXMwOwkvKiBjb25maWd1cmF0aW9uICovCiAJcmVzb3VyY2Vfc2l6ZV90IHBoeXNMYXMxOwkvKiBkYXRhIGFyZWEgKi8KIAlyZXNvdXJjZV9zaXplX3QgcGh5c0xjZmc7CS8qIFBMWDkwODAgKi8KICNpZmRlZiBVU0VfRE1BCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvczUyNi5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3M1MjYuYwppbmRleCAzNjA3YWFlLi4yYjM0ZGFlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvczUyNi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9zNTI2LmMKQEAgLTExNCw3ICsxMTQsNyBAQAogfTsKIAogc3RydWN0IGNvdW50ZXJfbW9kZV9yZWdpc3Rlcl90IHsKLSNpZiBkZWZpbmVkIChfX0xJVFRMRV9FTkRJQU5fQklURklFTEQpCisjaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU5fQklURklFTEQpCiAJdW5zaWduZWQgc2hvcnQgY291dFNvdXJjZToxOwogCXVuc2lnbmVkIHNob3J0IGNvdXRQb2xhcml0eToxOwogCXVuc2lnbmVkIHNob3J0IGF1dG9Mb2FkUmVzZXRSY2FwOjM7CkBAIC0yMDcsNyArMjA3LDkgQEAKIAogLyogdGhpcyBzdHJ1Y3R1cmUgaXMgZm9yIGRhdGEgdW5pcXVlIHRvIHRoaXMgaGFyZHdhcmUgZHJpdmVyLiAgSWYKICAgIHNldmVyYWwgaGFyZHdhcmUgZHJpdmVycyBrZWVwIHNpbWlsYXIgaW5mb3JtYXRpb24gaW4gdGhpcyBzdHJ1Y3R1cmUsCi0gICBmZWVsIGZyZWUgdG8gc3VnZ2VzdCBtb3ZpbmcgdGhlIHZhcmlhYmxlIHRvIHRoZSBzdHJ1Y3QgY29tZWRpX2RldmljZSBzdHJ1Y3QuICAqLworICAgZmVlbCBmcmVlIHRvIHN1Z2dlc3QgbW92aW5nIHRoZSB2YXJpYWJsZSB0byB0aGUgc3RydWN0IGNvbWVkaV9kZXZpY2UKKyAgIHN0cnVjdC4KKyovCiBzdHJ1Y3QgczUyNl9wcml2YXRlIHsKIAogCWludCBkYXRhOwpAQCAtMzA0LDcgKzMwNiw3IEBACiAvKiBpbnQgc3ViZGV2X2NoYW5uZWwgPSAwOyAqLwogCXVuaW9uIGNtUmVnIGNtUmVnOwogCi0JcHJpbnRrKCJjb21lZGklZDogczUyNjogIiwgZGV2LT5taW5vcik7CisJcHJpbnRrKEtFUk5fSU5GTyAiY29tZWRpJWQ6IHM1MjY6ICIsIGRldi0+bWlub3IpOwogCiAJaW9iYXNlID0gaXQtPm9wdGlvbnNbMF07CiAJaWYgKCFpb2Jhc2UgfHwgIXJlcXVlc3RfcmVnaW9uKGlvYmFzZSwgUzUyNl9JT1NJWkUsIHRoaXNib2FyZC0+bmFtZSkpIHsKQEAgLTMxNyw3ICszMTksOCBAQAogCiAJLyoqKiBtYWtlIGl0IGEgbGl0dGxlIHF1aWV0ZXIsIGV4dywgOC8yOS8wNgogCWZvciAoaSA9IDA7IGkgPCBTNTI2X05VTV9QT1JUUzsgaSsrKSB7Ci0JCXByaW50aygiMHglMDJ4OiAweCUwNHhcbiIsIEFERFJfUkVHKHM1MjZfcG9ydHNbaV0pLCBpbncoQUREUl9SRUcoczUyNl9wb3J0c1tpXSkpKTsKKwkJcHJpbnRrKCIweCUwMng6IDB4JTA0eFxuIiwgQUREUl9SRUcoczUyNl9wb3J0c1tpXSksCisJCQkJaW53KEFERFJfUkVHKHM1MjZfcG9ydHNbaV0pKSk7CiAJfQogCSoqKi8KIApAQCAtNDAyLDcgKzQwNSw3IEBACiAJCXMtPnR5cGUgPSBDT01FRElfU1VCRF9VTlVTRUQ7CiAJfQogCi0JcHJpbnRrKCJhdHRhY2hlZFxuIik7CisJcHJpbnRrKEtFUk5fSU5GTyAiYXR0YWNoZWRcbiIpOwogCiAJcmV0dXJuIDE7CiAKQEAgLTQxMSw3ICs0MTQsNyBAQAogCS8qIE9uZS1zaG90IChzb2Z0d2FyZSB0cmlnZ2VyKSAqLwogCWNtUmVnLnJlZy5jb3V0U291cmNlID0gMDsJLyogIG91dCBSQ0FQICovCiAJY21SZWcucmVnLmNvdXRQb2xhcml0eSA9IDE7CS8qICBQb2xhcml0eSBpbnZlcnRlZCAqLwotCWNtUmVnLnJlZy5hdXRvTG9hZFJlc2V0UmNhcCA9IDE7CS8qICBBdXRvIGxvYWQgMDpkaXNhYmxlZCwgMTplbmFibGVkICovCisJY21SZWcucmVnLmF1dG9Mb2FkUmVzZXRSY2FwID0gMTsvKiAgQXV0byBsb2FkIDA6ZGlzYWJsZWQsIDE6ZW5hYmxlZCAqLwogCWNtUmVnLnJlZy5od0N0RW5hYmxlU291cmNlID0gMzsJLyogIE5PVCBSQ0FQICovCiAJY21SZWcucmVnLmN0RW5hYmxlQ3RybCA9IDI7CS8qICBIYXJkd2FyZSAqLwogCWNtUmVnLnJlZy5jbG9ja1NvdXJjZSA9IDI7CS8qICBJbnRlcm5hbCAqLwpAQCAtNDI2LDEwICs0MjksMTIgQEAKIAlvdXR3KDB4MDAwMSwgQUREUl9DSEFOX1JFRyhSRUdfQzBILCBzdWJkZXZfY2hhbm5lbCkpOwogCW91dHcoMHgzQzY4LCBBRERSX0NIQU5fUkVHKFJFR19DMEwsIHN1YmRldl9jaGFubmVsKSk7CiAKLQlvdXR3KDB4ODAwMCwgQUREUl9DSEFOX1JFRyhSRUdfQzBDLCBzdWJkZXZfY2hhbm5lbCkpOwkvKiAgUmVzZXQgdGhlIGNvdW50ZXIgKi8KLQlvdXR3KDB4NDAwMCwgQUREUl9DSEFOX1JFRyhSRUdfQzBDLCBzdWJkZXZfY2hhbm5lbCkpOwkvKiAgTG9hZCB0aGUgY291bnRlciBmcm9tIFBSMCAqLwotCi0Jb3V0dygweDAwMDgsIEFERFJfQ0hBTl9SRUcoUkVHX0MwQywgc3ViZGV2X2NoYW5uZWwpKTsJLyogIFJlc2V0IFJDQVAgKGZpcmVzIG9uZS1zaG90KSAqLworCS8qICBSZXNldCB0aGUgY291bnRlciAqLworCW91dHcoMHg4MDAwLCBBRERSX0NIQU5fUkVHKFJFR19DMEMsIHN1YmRldl9jaGFubmVsKSk7CisJLyogIExvYWQgdGhlIGNvdW50ZXIgZnJvbSBQUjAgKi8KKwlvdXR3KDB4NDAwMCwgQUREUl9DSEFOX1JFRyhSRUdfQzBDLCBzdWJkZXZfY2hhbm5lbCkpOworCS8qICBSZXNldCBSQ0FQIChmaXJlcyBvbmUtc2hvdCkgKi8KKwlvdXR3KDB4MDAwOCwgQUREUl9DSEFOX1JFRyhSRUdfQzBDLCBzdWJkZXZfY2hhbm5lbCkpOwogCiAjZWxzZQogCkBAIC00NDcsMTEgKzQ1MiwxMiBAQAogCWNtUmVnLnJlZy5yZXNlcnZlZCA9IDA7CiAKIAluID0gMDsKLQlwcmludGsoIk1vZGUgcmVnPTB4JTA0eCwgMHglMDRseFxuIiwgY21SZWcudmFsdWUsIEFERFJfQ0hBTl9SRUcoUkVHX0MwTSwKLQkJCQkJCQkJCW4pKTsKKwlwcmludGsoS0VSTl9JTkZPICJNb2RlIHJlZz0weCUwNHgsIDB4JTA0bHhcbiIsCisJCWNtUmVnLnZhbHVlLCBBRERSX0NIQU5fUkVHKFJFR19DME0sIG4pKTsKIAlvdXR3KGNtUmVnLnZhbHVlLCBBRERSX0NIQU5fUkVHKFJFR19DME0sIG4pKTsKIAl1ZGVsYXkoMTAwMCk7Ci0JcHJpbnRrKCJSZWFkIGJhY2sgbW9kZSByZWc9MHglMDR4XG4iLCBpbncoQUREUl9DSEFOX1JFRyhSRUdfQzBNLCBuKSkpOworCXByaW50ayhLRVJOX0lORk8gIlJlYWQgYmFjayBtb2RlIHJlZz0weCUwNHhcbiIsCisJCWludyhBRERSX0NIQU5fUkVHKFJFR19DME0sIG4pKSk7CiAKIAkvKiAgTG9hZCB0aGUgcHJlLWxvYWQgcmVnaXN0ZXIgaGlnaCB3b3JkICovCiAvKiB2YWx1ZSA9IChzaG9ydCkgKDB4NTUpOyAqLwpAQCAtNDY2LDIwICs0NzIsMjMgQEAKIAogCS8qICBSZXNldCB0aGUgY291bnRlciBpZiBpdCBpcyBzb2Z0d2FyZSBwcmVsb2FkICovCiAJaWYgKGNtUmVnLnJlZy5hdXRvTG9hZFJlc2V0UmNhcCA9PSAwKSB7Ci0JCW91dHcoMHg4MDAwLCBBRERSX0NIQU5fUkVHKFJFR19DMEMsIG4pKTsJLyogIFJlc2V0IHRoZSBjb3VudGVyICovCi0JCW91dHcoMHg0MDAwLCBBRERSX0NIQU5fUkVHKFJFR19DMEMsIG4pKTsJLyogIExvYWQgdGhlIGNvdW50ZXIgZnJvbSBQUjAgKi8KKwkJLyogIFJlc2V0IHRoZSBjb3VudGVyICovCisJCW91dHcoMHg4MDAwLCBBRERSX0NIQU5fUkVHKFJFR19DMEMsIG4pKTsKKwkJLyogIExvYWQgdGhlIGNvdW50ZXIgZnJvbSBQUjAgKi8KKwkJb3V0dygweDQwMDAsIEFERFJfQ0hBTl9SRUcoUkVHX0MwQywgbikpOwogCX0KIAogCW91dHcoY21SZWcudmFsdWUsIEFERFJfQ0hBTl9SRUcoUkVHX0MwTSwgbikpOwogCXVkZWxheSgxMDAwKTsKLQlwcmludGsoIlJlYWQgYmFjayBtb2RlIHJlZz0weCUwNHhcbiIsIGludyhBRERSX0NIQU5fUkVHKFJFR19DME0sIG4pKSk7CisJcHJpbnRrKEtFUk5fSU5GTyAiUmVhZCBiYWNrIG1vZGUgcmVnPTB4JTA0eFxuIiwKKwkJCWludyhBRERSX0NIQU5fUkVHKFJFR19DME0sIG4pKSk7CiAKICNlbmRpZgotCXByaW50aygiQ3VycmVudCByZWdpc3RyZXM6XG4iKTsKKwlwcmludGsoS0VSTl9JTkZPICJDdXJyZW50IHJlZ2lzdHJlczpcbiIpOwogCiAJZm9yIChpID0gMDsgaSA8IFM1MjZfTlVNX1BPUlRTOyBpKyspIHsKLQkJcHJpbnRrKCIweCUwMmx4OiAweCUwNHhcbiIsIEFERFJfUkVHKHM1MjZfcG9ydHNbaV0pLAotCQkgICAgICAgaW53KEFERFJfUkVHKHM1MjZfcG9ydHNbaV0pKSk7CisJCXByaW50ayhLRVJOX0lORk8gIjB4JTAybHg6IDB4JTA0eFxuIiwKKwkJCUFERFJfUkVHKHM1MjZfcG9ydHNbaV0pLCBpbncoQUREUl9SRUcoczUyNl9wb3J0c1tpXSkpKTsKIAl9CiAJcmV0dXJuIDE7CiB9CkBAIC00OTQsNyArNTAzLDcgQEAKICAqLwogc3RhdGljIGludCBzNTI2X2RldGFjaChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2KQogewotCXByaW50aygiY29tZWRpJWQ6IHM1MjY6IHJlbW92ZVxuIiwgZGV2LT5taW5vcik7CisJcHJpbnRrKEtFUk5fSU5GTyAiY29tZWRpJWQ6IHM1MjY6IHJlbW92ZVxuIiwgZGV2LT5taW5vcik7CiAKIAlpZiAoZGV2LT5pb2Jhc2UgPiAwKQogCQlyZWxlYXNlX3JlZ2lvbihkZXYtPmlvYmFzZSwgUzUyNl9JT1NJWkUpOwpAQCAtNTEzLDcgKzUyMiw3IEBACiAKIAkvKiAgQ2hlY2sgaWYgKG4gPiAwKSAqLwogCWlmIChpbnNuLT5uIDw9IDApIHsKLQkJcHJpbnRrKCJzNTI2OiBJTlNOX1JFQUQ6IG4gc2hvdWxkIGJlID4gMFxuIik7CisJCXByaW50ayhLRVJOX0VSUiAiczUyNjogSU5TTl9SRUFEOiBuIHNob3VsZCBiZSA+IDBcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAJLyogIFJlYWQgdGhlIGxvdyB3b3JkIGZpcnN0ICovCkBAIC01MjIsNyArNTMxLDggQEAKIAkJZGF0YWhpZ2ggPSBpbncoQUREUl9DSEFOX1JFRyhSRUdfQzBILCBjb3VudGVyX2NoYW5uZWwpKTsKIAkJZGF0YVtpXSA9IChpbnQpKGRhdGFoaWdoICYgMHgwMEZGKTsKIAkJZGF0YVtpXSA9IChkYXRhW2ldIDw8IDE2KSB8IChkYXRhbG93ICYgMHhGRkZGKTsKLS8qIHByaW50aygiczUyNiBHUENUWyVkXTogJXgoMHglMDR4LCAweCUwNHgpXG4iLCBjb3VudGVyX2NoYW5uZWwsIGRhdGFbaV0sIGRhdGFoaWdoLCBkYXRhbG93KTsgKi8KKwkJLyogcHJpbnRrKCJzNTI2IEdQQ1RbJWRdOiAleCgweCUwNHgsIDB4JTA0eClcbiIsCisJCSAgIGNvdW50ZXJfY2hhbm5lbCwgZGF0YVtpXSwgZGF0YWhpZ2gsIGRhdGFsb3cpOyAqLwogCX0KIAlyZXR1cm4gaTsKIH0KQEAgLTUzNiw3ICs1NDYsOCBAQAogCXNob3J0IHZhbHVlOwogCXVuaW9uIGNtUmVnIGNtUmVnOwogCi0vKiBwcmludGsoInM1MjY6IEdQQ1RfSU5TTl9DT05GSUc6IENvbmZpZ3VyaW5nIENoYW5uZWwgJWRcbiIsIHN1YmRldl9jaGFubmVsKTsgKi8KKwkvKiBwcmludGsoInM1MjY6IEdQQ1RfSU5TTl9DT05GSUc6IENvbmZpZ3VyaW5nIENoYW5uZWwgJWRcbiIsCisJCQkJCQlzdWJkZXZfY2hhbm5lbCk7ICovCiAKIAlmb3IgKGkgPSAwOyBpIDwgTUFYX0dQQ1RfQ09ORklHX0RBVEE7IGkrKykgewogCQlkZXZwcml2LT5zNTI2X2dwY3RfY29uZmlnW3N1YmRldl9jaGFubmVsXS5kYXRhW2ldID0KQEAgLTU1NCw3ICs1NjUsNyBAQAogCQkgICBkYXRhWzJdOiBQcmUtbG9hZCBSZWdpc3RlciBWYWx1ZQogCQkgICBkYXRhWzNdOiBDb250ZXIgQ29udHJvbCBSZWdpc3RlcgogCQkgKi8KLQkJcHJpbnRrKCJzNTI2OiBHUENUX0lOU05fQ09ORklHOiBDb25maWd1cmluZyBFbmNvZGVyXG4iKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiczUyNjogR1BDVF9JTlNOX0NPTkZJRzogQ29uZmlndXJpbmcgRW5jb2RlclxuIik7CiAJCWRldnByaXYtPnM1MjZfZ3BjdF9jb25maWdbc3ViZGV2X2NoYW5uZWxdLmFwcCA9CiAJCSAgICBQb3NpdGlvbk1lYXN1cmVtZW50OwogCkBAIC01NjMsNyArNTc0LDcgQEAKIAkJLyogT25lLXNob3QgKHNvZnR3YXJlIHRyaWdnZXIpICovCiAJCWNtUmVnLnJlZy5jb3V0U291cmNlID0gMDsJLyogIG91dCBSQ0FQICovCiAJCWNtUmVnLnJlZy5jb3V0UG9sYXJpdHkgPSAxOwkvKiAgUG9sYXJpdHkgaW52ZXJ0ZWQgKi8KLQkJY21SZWcucmVnLmF1dG9Mb2FkUmVzZXRSY2FwID0gMDsJLyogIEF1dG8gbG9hZCBkaXNhYmxlZCAqLworCQljbVJlZy5yZWcuYXV0b0xvYWRSZXNldFJjYXAgPSAwOy8qICBBdXRvIGxvYWQgZGlzYWJsZWQgKi8KIAkJY21SZWcucmVnLmh3Q3RFbmFibGVTb3VyY2UgPSAzOwkvKiAgTk9UIFJDQVAgKi8KIAkJY21SZWcucmVnLmN0RW5hYmxlQ3RybCA9IDI7CS8qICBIYXJkd2FyZSAqLwogCQljbVJlZy5yZWcuY2xvY2tTb3VyY2UgPSAyOwkvKiAgSW50ZXJuYWwgKi8KQEAgLTU3OCwxMCArNTg5LDEzIEBACiAJCW91dHcoMHgwMDAxLCBBRERSX0NIQU5fUkVHKFJFR19DMEgsIHN1YmRldl9jaGFubmVsKSk7CiAJCW91dHcoMHgzQzY4LCBBRERSX0NIQU5fUkVHKFJFR19DMEwsIHN1YmRldl9jaGFubmVsKSk7CiAKLQkJb3V0dygweDgwMDAsIEFERFJfQ0hBTl9SRUcoUkVHX0MwQywgc3ViZGV2X2NoYW5uZWwpKTsJLyogIFJlc2V0IHRoZSBjb3VudGVyICovCi0JCW91dHcoMHg0MDAwLCBBRERSX0NIQU5fUkVHKFJFR19DMEMsIHN1YmRldl9jaGFubmVsKSk7CS8qICBMb2FkIHRoZSBjb3VudGVyIGZyb20gUFIwICovCisJCS8qICBSZXNldCB0aGUgY291bnRlciAqLworCQlvdXR3KDB4ODAwMCwgQUREUl9DSEFOX1JFRyhSRUdfQzBDLCBzdWJkZXZfY2hhbm5lbCkpOworCQkvKiAgTG9hZCB0aGUgY291bnRlciBmcm9tIFBSMCAqLworCQlvdXR3KDB4NDAwMCwgQUREUl9DSEFOX1JFRyhSRUdfQzBDLCBzdWJkZXZfY2hhbm5lbCkpOwogCi0JCW91dHcoMHgwMDA4LCBBRERSX0NIQU5fUkVHKFJFR19DMEMsIHN1YmRldl9jaGFubmVsKSk7CS8qICBSZXNldCBSQ0FQIChmaXJlcyBvbmUtc2hvdCkgKi8KKwkJLyogIFJlc2V0IFJDQVAgKGZpcmVzIG9uZS1zaG90KSAqLworCQlvdXR3KDB4MDAwOCwgQUREUl9DSEFOX1JFRyhSRUdfQzBDLCBzdWJkZXZfY2hhbm5lbCkpOwogCiAjZW5kaWYKIApAQCAtNTk0LDMwICs2MDgsMzQgQEAKIAogCQkvKiAgUmVzZXQgdGhlIGNvdW50ZXIgaWYgaXQgaXMgc29mdHdhcmUgcHJlbG9hZCAqLwogCQlpZiAoY21SZWcucmVnLmF1dG9Mb2FkUmVzZXRSY2FwID09IDApIHsKLQkJCW91dHcoMHg4MDAwLCBBRERSX0NIQU5fUkVHKFJFR19DMEMsIHN1YmRldl9jaGFubmVsKSk7CS8qICBSZXNldCB0aGUgY291bnRlciAqLwotLyogb3V0dygweDQwMDAsIEFERFJfQ0hBTl9SRUcoUkVHX0MwQywgc3ViZGV2X2NoYW5uZWwpKTsgICAgTG9hZCB0aGUgY291bnRlciBmcm9tIFBSMCAqLworCQkJLyogIFJlc2V0IHRoZSBjb3VudGVyICovCisJCQlvdXR3KDB4ODAwMCwgQUREUl9DSEFOX1JFRyhSRUdfQzBDLCBzdWJkZXZfY2hhbm5lbCkpOworCQkJLyogTG9hZCB0aGUgY291bnRlciBmcm9tIFBSMAorCQkJICogb3V0dygweDQwMDAsIEFERFJfQ0hBTl9SRUcoUkVHX0MwQywgc3ViZGV2X2NoYW5uZWwpKTsKKwkJCSAqLwogCQl9CiAjZWxzZQotCQljbVJlZy5yZWcuY291bnREaXJDdHJsID0gMDsJLyogIDAgcXVhZHJhdHVyZSwgMSBzb2Z0d2FyZSBjb250cm9sICovCisJCS8qICAwIHF1YWRyYXR1cmUsIDEgc29mdHdhcmUgY29udHJvbCAqLworCQljbVJlZy5yZWcuY291bnREaXJDdHJsID0gMDsKIAogCQkvKiAgZGF0YVsxXSBjb250YWlucyBHUENUX1gxLCBHUENUX1gyIG9yIEdQQ1RfWDQgKi8KLQkJaWYgKGluc24tPmRhdGFbMV0gPT0gR1BDVF9YMikgeworCQlpZiAoaW5zbi0+ZGF0YVsxXSA9PSBHUENUX1gyKQogCQkJY21SZWcucmVnLmNsb2NrU291cmNlID0gMTsKLQkJfSBlbHNlIGlmIChpbnNuLT5kYXRhWzFdID09IEdQQ1RfWDQpIHsKKwkJZWxzZSBpZiAoaW5zbi0+ZGF0YVsxXSA9PSBHUENUX1g0KQogCQkJY21SZWcucmVnLmNsb2NrU291cmNlID0gMjsKLQkJfSBlbHNlIHsKKwkJZWxzZQogCQkJY21SZWcucmVnLmNsb2NrU291cmNlID0gMDsKLQkJfQogCiAJCS8qICBXaGVuIHRvIHRha2UgaW50byBhY2NvdW50IHRoZSBpbmRleHB1bHNlOiAqLwotCQlpZiAoaW5zbi0+ZGF0YVsyXSA9PSBHUENUX0luZGV4UGhhc2VMb3dMb3cpIHsKKwkJLyppZiAoaW5zbi0+ZGF0YVsyXSA9PSBHUENUX0luZGV4UGhhc2VMb3dMb3cpIHsKIAkJfSBlbHNlIGlmIChpbnNuLT5kYXRhWzJdID09IEdQQ1RfSW5kZXhQaGFzZUxvd0hpZ2gpIHsKIAkJfSBlbHNlIGlmIChpbnNuLT5kYXRhWzJdID09IEdQQ1RfSW5kZXhQaGFzZUhpZ2hMb3cpIHsKIAkJfSBlbHNlIGlmIChpbnNuLT5kYXRhWzJdID09IEdQQ1RfSW5kZXhQaGFzZUhpZ2hIaWdoKSB7Ci0JCX0KKwkJfSovCiAJCS8qICBUYWtlIGludG8gYWNjb3VudCB0aGUgaW5kZXggcHVsc2U/ICovCiAJCWlmIChpbnNuLT5kYXRhWzNdID09IEdQQ1RfUkVTRVRfQ09VTlRFUl9PTl9JTkRFWCkKLQkJCWNtUmVnLnJlZy5hdXRvTG9hZFJlc2V0UmNhcCA9IDQ7CS8qICBBdXRvIGxvYWQgd2l0aCBJTkRFWF4gKi8KKwkJCS8qICBBdXRvIGxvYWQgd2l0aCBJTkRFWF4gKi8KKwkJCWNtUmVnLnJlZy5hdXRvTG9hZFJlc2V0UmNhcCA9IDQ7CiAKIAkJLyogIFNldCBDb3VudGVyIE1vZGUgUmVnaXN0ZXIgKi8KIAkJY21SZWcudmFsdWUgPSAoc2hvcnQpKGluc24tPmRhdGFbMV0gJiAweEZGRkYpOwpAQCAtNjM4LDggKzY1NiwxMCBAQAogCQl9CiAJCS8qICBSZXNldCB0aGUgY291bnRlciBpZiBpdCBpcyBzb2Z0d2FyZSBwcmVsb2FkICovCiAJCWlmIChjbVJlZy5yZWcuYXV0b0xvYWRSZXNldFJjYXAgPT0gMCkgewotCQkJb3V0dygweDgwMDAsIEFERFJfQ0hBTl9SRUcoUkVHX0MwQywgc3ViZGV2X2NoYW5uZWwpKTsJLyogIFJlc2V0IHRoZSBjb3VudGVyICovCi0JCQlvdXR3KDB4NDAwMCwgQUREUl9DSEFOX1JFRyhSRUdfQzBDLCBzdWJkZXZfY2hhbm5lbCkpOwkvKiAgTG9hZCB0aGUgY291bnRlciBmcm9tIFBSMCAqLworCQkJLyogIFJlc2V0IHRoZSBjb3VudGVyICovCisJCQlvdXR3KDB4ODAwMCwgQUREUl9DSEFOX1JFRyhSRUdfQzBDLCBzdWJkZXZfY2hhbm5lbCkpOworCQkJLyogIExvYWQgdGhlIGNvdW50ZXIgZnJvbSBQUjAgKi8KKwkJCW91dHcoMHg0MDAwLCBBRERSX0NIQU5fUkVHKFJFR19DMEMsIHN1YmRldl9jaGFubmVsKSk7CiAJCX0KICNlbmRpZgogCQlicmVhazsKQEAgLTY1Miw3ICs2NzIsNyBAQAogCQkgICBkYXRhWzNdOiBQcmUtbG9hZCBSZWdpc3RlciAxIFZhbHVlCiAJCSAgIGRhdGFbNF06IENvbnRlciBDb250cm9sIFJlZ2lzdGVyCiAJCSAqLwotCQlwcmludGsoInM1MjY6IEdQQ1RfSU5TTl9DT05GSUc6IENvbmZpZ3VyaW5nIFNQR1xuIik7CisJCXByaW50ayhLRVJOX0lORk8gInM1MjY6IEdQQ1RfSU5TTl9DT05GSUc6IENvbmZpZ3VyaW5nIFNQR1xuIik7CiAJCWRldnByaXYtPnM1MjZfZ3BjdF9jb25maWdbc3ViZGV2X2NoYW5uZWxdLmFwcCA9CiAJCSAgICBTaW5nbGVQdWxzZUdlbmVyYXRpb247CiAKQEAgLTY5Nyw3ICs3MTcsNyBAQAogCQkgICBkYXRhWzNdOiBQcmUtbG9hZCBSZWdpc3RlciAxIFZhbHVlCiAJCSAgIGRhdGFbNF06IENvbnRlciBDb250cm9sIFJlZ2lzdGVyCiAJCSAqLwotCQlwcmludGsoInM1MjY6IEdQQ1RfSU5TTl9DT05GSUc6IENvbmZpZ3VyaW5nIFBUR1xuIik7CisJCXByaW50ayhLRVJOX0lORk8gInM1MjY6IEdQQ1RfSU5TTl9DT05GSUc6IENvbmZpZ3VyaW5nIFBUR1xuIik7CiAJCWRldnByaXYtPnM1MjZfZ3BjdF9jb25maWdbc3ViZGV2X2NoYW5uZWxdLmFwcCA9CiAJCSAgICBQdWxzZVRyYWluR2VuZXJhdGlvbjsKIApAQCAtNzM1LDcgKzc1NSw3IEBACiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKLQkJcHJpbnRrKCJzNTI2OiB1bnN1cHBvcnRlZCBHUENUX2luc25fY29uZmlnXG4iKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJzNTI2OiB1bnN1cHBvcnRlZCBHUENUX2luc25fY29uZmlnXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJCWJyZWFrOwogCX0KQEAgLTc1MSwyMCArNzcxLDIxIEBACiAJc2hvcnQgdmFsdWU7CiAJdW5pb24gY21SZWcgY21SZWc7CiAKLQlwcmludGsoInM1MjY6IEdQQ1RfSU5TTl9XUklURSBvbiBjaGFubmVsICVkXG4iLCBzdWJkZXZfY2hhbm5lbCk7CisJcHJpbnRrKEtFUk5fSU5GTyAiczUyNjogR1BDVF9JTlNOX1dSSVRFIG9uIGNoYW5uZWwgJWRcbiIsCisJCQkJCXN1YmRldl9jaGFubmVsKTsKIAljbVJlZy52YWx1ZSA9IGludyhBRERSX0NIQU5fUkVHKFJFR19DME0sIHN1YmRldl9jaGFubmVsKSk7Ci0JcHJpbnRrKCJzNTI2OiBDb3VudGVyIE1vZGUgUmVnaXN0ZXI6ICV4XG4iLCBjbVJlZy52YWx1ZSk7CisJcHJpbnRrKEtFUk5fSU5GTyAiczUyNjogQ291bnRlciBNb2RlIFJlZ2lzdGVyOiAleFxuIiwgY21SZWcudmFsdWUpOwogCS8qICBDaGVjayB3aGF0IEFwcGxpY2F0aW9uIG9mIENvdW50ZXIgdGhpcyBjaGFubmVsIGlzIGNvbmZpZ3VyZWQgZm9yICovCiAJc3dpdGNoIChkZXZwcml2LT5zNTI2X2dwY3RfY29uZmlnW3N1YmRldl9jaGFubmVsXS5hcHApIHsKIAljYXNlIFBvc2l0aW9uTWVhc3VyZW1lbnQ6Ci0JCXByaW50aygiUzUyNjogSU5TTl9XUklURTogUE1cbiIpOworCQlwcmludGsoS0VSTl9JTkZPICJTNTI2OiBJTlNOX1dSSVRFOiBQTVxuIik7CiAJCW91dHcoMHhGRkZGICYgKCgqZGF0YSkgPj4gMTYpLCBBRERSX0NIQU5fUkVHKFJFR19DMEgsCiAJCQkJCQkJICAgICBzdWJkZXZfY2hhbm5lbCkpOwogCQlvdXR3KDB4RkZGRiAmICgqZGF0YSksIEFERFJfQ0hBTl9SRUcoUkVHX0MwTCwgc3ViZGV2X2NoYW5uZWwpKTsKIAkJYnJlYWs7CiAKIAljYXNlIFNpbmdsZVB1bHNlR2VuZXJhdGlvbjoKLQkJcHJpbnRrKCJTNTI2OiBJTlNOX1dSSVRFOiBTUEdcbiIpOworCQlwcmludGsoS0VSTl9JTkZPICJTNTI2OiBJTlNOX1dSSVRFOiBTUEdcbiIpOwogCQlvdXR3KDB4RkZGRiAmICgoKmRhdGEpID4+IDE2KSwgQUREUl9DSEFOX1JFRyhSRUdfQzBILAogCQkJCQkJCSAgICAgc3ViZGV2X2NoYW5uZWwpKTsKIAkJb3V0dygweEZGRkYgJiAoKmRhdGEpLCBBRERSX0NIQU5fUkVHKFJFR19DMEwsIHN1YmRldl9jaGFubmVsKSk7CkBAIC03NzcsMTQgKzc5OCwxNCBAQAogCQkgICBUaGUgYWJvdmUgcGVyaW9kcyBtdXN0IGJlIGV4cHJlc3NlZCBhcyBhIG11bHRpcGxlIG9mIHRoZQogCQkgICBwdWxzZSBmcmVxdWVuY3kgb24gdGhlIHNlbGVjdGVkIHNvdXJjZQogCQkgKi8KLQkJcHJpbnRrKCJTNTI2OiBJTlNOX1dSSVRFOiBQVEdcbiIpOworCQlwcmludGsoS0VSTl9JTkZPICJTNTI2OiBJTlNOX1dSSVRFOiBQVEdcbiIpOwogCQlpZiAoKGluc24tPmRhdGFbMV0gPiBpbnNuLT5kYXRhWzBdKSAmJiAoaW5zbi0+ZGF0YVswXSA+IDApKSB7CiAJCQkoZGV2cHJpdi0+czUyNl9ncGN0X2NvbmZpZ1tzdWJkZXZfY2hhbm5lbF0pLmRhdGFbMF0gPQogCQkJICAgIGluc24tPmRhdGFbMF07CiAJCQkoZGV2cHJpdi0+czUyNl9ncGN0X2NvbmZpZ1tzdWJkZXZfY2hhbm5lbF0pLmRhdGFbMV0gPQogCQkJICAgIGluc24tPmRhdGFbMV07CiAJCX0gZWxzZSB7Ci0JCQlwcmludGsoInM1MjY6IElOU05fV1JJVEU6IFBURzogUHJvYmxlbSB3aXRoIFB1bHNlIHBhcmFtcyAtPiAlZCAlZFxuIiwKKwkJCXByaW50ayhLRVJOX0VSUiAiczUyNjogSU5TTl9XUklURTogUFRHOiBQcm9ibGVtIHdpdGggUHVsc2UgcGFyYW1zIC0+ICVkICVkXG4iLAogCQkJCWluc24tPmRhdGFbMF0sIGluc24tPmRhdGFbMV0pOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KQEAgLTg3Myw3ICs4OTQsNyBAQAogCQlpZiAoaSA9PSBUSU1FT1VUKSB7CiAJCQkvKiBwcmludGsoKSBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkIG9mIHByaW50aygpCiAJCQkgKiB3aGVuZXZlciB0aGUgY29kZSBjYW4gYmUgY2FsbGVkIGZyb20gcmVhbC10aW1lLiAqLwotCQkJcHJpbnRrKCJzNTI2OiBBREMoMHglMDR4KSB0aW1lb3V0XG4iLAorCQkJcHJpbnRrKEtFUk5fRVJSICJzNTI2OiBBREMoMHglMDR4KSB0aW1lb3V0XG4iLAogCQkJICAgICAgIGludyhBRERSX1JFRyhSRUdfSVNSKSkpOwogCQkJcmV0dXJuIC1FVElNRURPVVQ7CiAJCX0KQEAgLTkwNiwxMSArOTI3LDE0IEBACiAJICogdmVyeSB1c2VmdWwsIGJ1dCB0aGF0J3MgaG93IHRoZSBpbnRlcmZhY2UgaXMgZGVmaW5lZC4gKi8KIAlmb3IgKGkgPSAwOyBpIDwgaW5zbi0+bjsgaSsrKSB7CiAJCS8qIGEgdHlwaWNhbCBwcm9ncmFtbWluZyBzZXF1ZW5jZSAqLwotLyogb3V0dyhkYXRhW2ldLCBkZXYtPmlvYmFzZSArIFJFR19BREQpOyAgICB3cml0ZSB0aGUgZGF0YSB0byBwcmVsb2FkIHJlZ2lzdGVyICovCi0JCW91dHcoZGF0YVtpXSwgQUREUl9SRUcoUkVHX0FERCkpOwkvKiAgd3JpdGUgdGhlIGRhdGEgdG8gcHJlbG9hZCByZWdpc3RlciAqLworCQkvKiB3cml0ZSB0aGUgZGF0YSB0byBwcmVsb2FkIHJlZ2lzdGVyCisJCSAqIG91dHcoZGF0YVtpXSwgZGV2LT5pb2Jhc2UgKyBSRUdfQUREKTsKKwkJICovCisJCS8qIHdyaXRlIHRoZSBkYXRhIHRvIHByZWxvYWQgcmVnaXN0ZXIgKi8KKwkJb3V0dyhkYXRhW2ldLCBBRERSX1JFRyhSRUdfQUREKSk7CiAJCWRldnByaXYtPmFvX3JlYWRiYWNrW2NoYW5dID0gZGF0YVtpXTsKIC8qIG91dHcodmFsICsgMSwgZGV2LT5pb2Jhc2UgKyBSRUdfREFDKTsgIHN0YXJ0cyB0aGUgRC9BIGNvbnZlcnNpb24uICovCi0JCW91dHcodmFsICsgMSwgQUREUl9SRUcoUkVHX0RBQykpOwkvKiAgc3RhcnRzIHRoZSBEL0EgY29udmVyc2lvbi4gKi8KKwkJb3V0dyh2YWwgKyAxLCBBRERSX1JFRyhSRUdfREFDKSk7IC8qc3RhcnRzIHRoZSBEL0EgY29udmVyc2lvbi4qLwogCX0KIAogCS8qIHJldHVybiB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgcmVhZC93cml0dGVuICovCkBAIC05NTQsNyArOTc4LDcgQEAKIAogCS8qIG9uIHJldHVybiwgZGF0YVsxXSBjb250YWlucyB0aGUgdmFsdWUgb2YgdGhlIGRpZ2l0YWwKIAkgKiBpbnB1dCBhbmQgb3V0cHV0IGxpbmVzLiAqLwotCWRhdGFbMV0gPSBpbncoQUREUl9SRUcoUkVHX0RJTykpICYgMHhGRjsJLyogIGxvdyA4IGJpdHMgYXJlIHRoZSBkYXRhICovCisJZGF0YVsxXSA9IGludyhBRERSX1JFRyhSRUdfRElPKSkgJiAweEZGOyAvKiBsb3cgOCBiaXRzIGFyZSB0aGUgZGF0YSAqLwogCS8qIG9yIHdlIGNvdWxkIGp1c3QgcmV0dXJuIHRoZSBzb2Z0d2FyZSBjb3B5IG9mIHRoZSBvdXRwdXQgdmFsdWVzIGlmCiAJICogaXQgd2FzIGEgcHVyZWx5IGRpZ2l0YWwgb3V0cHV0IHN1YmRldmljZSAqLwogCS8qIGRhdGFbMV09cy0+c3RhdGUgJiAweEZGOyAqLwpAQCAtOTY5LDcgKzk5Myw3IEBACiAJaW50IGNoYW4gPSBDUl9DSEFOKGluc24tPmNoYW5zcGVjKTsKIAlpbnQgZ3JvdXAsIG1hc2s7CiAKLQlwcmludGsoIlM1MjYgRElPIGluc25fY29uZmlnXG4iKTsKKwlwcmludGsoS0VSTl9JTkZPICJTNTI2IERJTyBpbnNuX2NvbmZpZ1xuIik7CiAKIAkvKiBUaGUgaW5wdXQgb3Igb3V0cHV0IGNvbmZpZ3VyYXRpb24gb2YgZWFjaCBkaWdpdGFsIGxpbmUgaXMKIAkgKiBjb25maWd1cmVkIGJ5IGEgc3BlY2lhbCBpbnNuX2NvbmZpZyBpbnN0cnVjdGlvbi4gIGNoYW5zcGVjCkBAIC05ODAsMTEgKzEwMDQsMTIgQEAKIAltYXNrID0gMHhGIDw8IChncm91cCA8PCAyKTsKIAlzd2l0Y2ggKGRhdGFbMF0pIHsKIAljYXNlIElOU05fQ09ORklHX0RJT19PVVRQVVQ6Ci0JCXMtPnN0YXRlIHw9IDEgPDwgKGdyb3VwICsgMTApOyAgLy8gYml0IDEwLzExIHNldCB0aGUgZ3JvdXAgMS8yJ3MgbW9kZQorCQkvKiBiaXQgMTAvMTEgc2V0IHRoZSBncm91cCAxLzIncyBtb2RlICovCisJCXMtPnN0YXRlIHw9IDEgPDwgKGdyb3VwICsgMTApOwogCQlzLT5pb19iaXRzIHw9IG1hc2s7CiAJCWJyZWFrOwogCWNhc2UgSU5TTl9DT05GSUdfRElPX0lOUFVUOgotCQlzLT5zdGF0ZSAmPSB+KDEgPDwgKGdyb3VwICsgMTApKTsvLyAxIGlzIG91dHB1dCwgMCBpcyBpbnB1dC4KKwkJcy0+c3RhdGUgJj0gfigxIDw8IChncm91cCArIDEwKSk7IC8qIDEgaXMgb3V0cHV0LCAwIGlzIGlucHV0LiAqLwogCQlzLT5pb19iaXRzICY9IH5tYXNrOwogCQlicmVhazsKIAljYXNlIElOU05fQ09ORklHX0RJT19RVUVSWToKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy91c2JkdXguYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy91c2JkdXguYwppbmRleCBkZTc4NGZmLi42OTZlZTA0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvdXNiZHV4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3VzYmR1eC5jCkBAIC0yMzk4LDcgKzIzOTgsNyBAQAogCXVzYmR1eHN1YltpbmRleF0uZHV4X2NvbW1hbmRzID0ga3phbGxvYyhTSVpFT0ZEVVhCVUZGRVIsIEdGUF9LRVJORUwpOwogCWlmICghdXNiZHV4c3ViW2luZGV4XS5kdXhfY29tbWFuZHMpIHsKIAkJZGV2X2VycihkZXYsICJjb21lZGlfOiB1c2JkdXg6ICIKLQkJCSJlcnJvciBhbGxvYyBzcGFjZSBmb3IgZGFjIGNvbW1hbmRzXG4iKTsKKwkJCSJlcnJvciBhbGxvYyBzcGFjZSBmb3IgZHV4IGNvbW1hbmRzXG4iKTsKIAkJdGlkeV91cCgmKHVzYmR1eHN1YltpbmRleF0pKTsKIAkJdXAoJnN0YXJ0X3N0b3Bfc2VtKTsKIAkJcmV0dXJuIC1FTk9NRU07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY3B0bTEyMTcvS2NvbmZpZyBiL2RyaXZlcnMvc3RhZ2luZy9jcHRtMTIxNy9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzYjFjYzAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvY3B0bTEyMTcvS2NvbmZpZwpAQCAtMCwwICsxLDEyIEBACitjb25maWcgVE9VQ0hTQ1JFRU5fQ0xFQVJQQURfVE0xMjE3CisJdHJpc3RhdGUgIlN5bmFwdGljcyBDbGVhcnBhZCBUTTEyMTciCisJZGVwZW5kcyBvbiBJMkMKKwlkZXBlbmRzIG9uIEdQSU9MSUIKKwlkZXBlbmRzIG9uIElOUFVUCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3UgaGF2ZSBhIFN5bmFwdGljcyBDbGVhcnBhZCBUTTEyMTcgQ29udHJvbGxlcgorCisJICBJZiB1bnN1cmUsIHNheSBOLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBjbGVhcnBhZF90bTEyMTcuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY3B0bTEyMTcvTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvY3B0bTEyMTcvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODk2MWZhZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jcHRtMTIxNy9NYWtlZmlsZQpAQCAtMCwwICsxLDIgQEAKK29iai0kKENPTkZJR19UT1VDSFNDUkVFTl9DTEVBUlBBRF9UTTEyMTcpCSs9IGNsZWFycGFkX3RtMTIxNy5vCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jcHRtMTIxNy9UT0RPIGIvZHJpdmVycy9zdGFnaW5nL2NwdG0xMjE3L1RPRE8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzAzOTIyNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jcHRtMTIxNy9UT0RPCkBAIC0wLDAgKzEsNSBAQAorLSBXYWl0IGZvciB0aGUgb2ZmaWNpYWwgdXBzdHJlYW0gZ2VuZXJhbCBjbGVhcnBhZCBkcml2ZXJzIGFzIHByb21pc2VkIG92ZXIKKyAgdGhlIHBhc3QgZmV3IG1vbnRocworLSBNZXJnZSBhbnkgZGV2aWNlIHN1cHBvcnQgbmVlZGVkIGZyb20gdGhpcyBkcml2ZXIgaW50byBpdAorLSBEZWxldGUgdGhpcyBkcml2ZXIKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NwdG0xMjE3L2NsZWFycGFkX3RtMTIxNy5jIGIvZHJpdmVycy9zdGFnaW5nL2NwdG0xMjE3L2NsZWFycGFkX3RtMTIxNy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2ZTRiNzgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvY3B0bTEyMTcvY2xlYXJwYWRfdG0xMjE3LmMKQEAgLTAsMCArMSw2NzUgQEAKKy8qCisgKiBjbGVhcnBhZF90bTEyMTcuYyAtIFRvdWNoIFNjcmVlbiBkcml2ZXIgZm9yIFN5bmFwdGljcyBDbGVhcnBhZAorICogVE0xMjE3IGNvbnRyb2xsZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggSW50ZWwgQ29ycAorICoKKyAqIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLglTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWZub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQS4KKyAqCisgKiBRdWVzdGlvbnMvQ29tbWVudHMvQnVnIGZpeGVzIHRvIFJhbWVzaCBBZ2Fyd2FsIChyYW1lc2guYWdhcndhbEBpbnRlbC5jb20pCisgKiB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvaHJ0aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlICJjcF90bTEyMTcuaCIKKworI2RlZmluZSBDUFRNMTIxN19ERVZJQ0VfTkFNRQkJImNwdG0xMjE3IgorI2RlZmluZSBDUFRNMTIxN19EUklWRVJfTkFNRQkJQ1BUTTEyMTdfREVWSUNFX05BTUUKKworI2RlZmluZSBNQVhfVE9VQ0hfU1VQUE9SVEVECQkyCisjZGVmaW5lIFRPVUNIX1NVUFBPUlRFRAkJCTEKKyNkZWZpbmUgU0FNUExJTkdfRlJFUQkJCTgwCS8qIEZyZXF1ZW5jeSBpbiBIWiAqLworI2RlZmluZSBERUxBWV9CVFdJTl9TQU1QTEUJCSgxMDAwIC8gU0FNUExJTkdfRlJFUSkKKyNkZWZpbmUgV0FJVF9GT1JfUkVTUE9OU0UJCTUJLyogNW1zZWMganVzdCB3b3JrcyAqLworI2RlZmluZSBNQVhfUkVUUklFUwkJCTUJLyogQXMgYWJvdmUgKi8KKyNkZWZpbmUgSU5DUkVNRU5UQUxfREVMQVkJCTUJLyogQXMgYWJvdmUgKi8KKworLyogUmVnc3RlciBEZWZpbml0aW9ucyAqLworI2RlZmluZSBUTUExMjE3X0RFVl9TVEFUVVMJCTB4MTMJLyogRGV2aWNlIFN0YXR1cyAqLworI2RlZmluZSBUTUExMjE3X0lOVF9TVEFUVVMJCTB4MTQJLyogSW50ZXJydXB0IFN0YXR1cyAqLworCisvKiBDb250cm9sbGVyIGNhbiBkZXRlY3QgdXB0byAyIHBvc3NpYmxlIGZpbmdlciB0b3VjaGVzLgorICogRWFjaCBmaW5nZXIgdG91Y2ggcHJvdmlkZXMgIDEyIGJpdCBYIFkgY28tb3JkaW5hdGVzLCB0aGUgdmFsdWVzIGFyZSBzcGxpdAorICogYWNyb3NzIDIgcmVnaXN0ZXJzLCBhbmQgYW4gOCBiaXQgIFogdmFsdWUgKi8KKyNkZWZpbmUgVE1BMTIxN19GSU5HRVJfU1RBVEUJCTB4MTggLyogRmluZ2VyIFN0YXRlICovCisjZGVmaW5lIFRNQTEyMTdfRklOR0VSMV9YX0hJR0hFUjgJMHgxOSAvKiBIaWdoZXIgOCBiaXQgb2YgWCBjb29yZGluYXRlICovCisjZGVmaW5lIFRNQTEyMTdfRklOR0VSMV9ZX0hJR0hFUjgJMHgxQSAvKiBIaWdoZXIgOCBiaXQgb2YgWSBjb29yZGluYXRlICovCisjZGVmaW5lIFRNQTEyMTdfRklOR0VSMV9YWV9MT1dFUjQJMHgxQiAvKiBMb3dlciA0IGJpdHMgb2YgWCBhbmQgWSAqLworI2RlZmluZSBUTUExMjE3X0ZJTkdFUjFfWl9WQUxVRQkJMHgxRCAvKiA4IGJpdCBaIHZhbHVlIGZvciBmaW5nZXIgMSAqLworI2RlZmluZSBUTUExMjE3X0ZJTkdFUjJfWF9ISUdIRVI4CTB4MUUgLyogSGlnaGVyIDggYml0IG9mIFggY29vcmRpbmF0ZSAqLworI2RlZmluZSBUTUExMjE3X0ZJTkdFUjJfWV9ISUdIRVI4CTB4MUYgLyogSGlnaGVyIDggYml0IG9mIFkgY29vcmRpbmF0ZSAqLworI2RlZmluZSBUTUExMjE3X0ZJTkdFUjJfWFlfTE9XRVI0CTB4MjAgLyogTG93ZXIgNCBiaXRzIG9mIFggYW5kIFkgKi8KKyNkZWZpbmUgVE1BMTIxN19GSU5HRVIyX1pfVkFMVUUJCTB4MjIgLyogOCBiaXQgWiB2YWx1ZSBmb3IgZmluZ2VyIDIgKi8KKyNkZWZpbmUgVE1BMTIxN19ERVZJQ0VfQ1RSTAkJMHgyMyAvKiBEZXZpY2UgQ29udHJvbCAqLworI2RlZmluZSBUTUExMjE3X0lOVEVSUlVQVF9FTkFCTEUJMHgyNCAvKiBJbnRlcnJ1cHQgRW5hYmxlICovCisjZGVmaW5lIFRNQTEyMTdfUkVQT1JUX01PREUJCTB4MkIgLyogUmVwb3J0aW5nIE1vZGUgKi8KKyNkZWZpbmUgVE1BMTIxN19NQVhfWF9MT1dFUjgJCTB4MzEgLyogQml0IDAtNyBmb3IgTWF4IFggKi8KKyNkZWZpbmUgVE1BMTIxN19NQVhfWF9ISUdIRVI0CQkweDMyIC8qIEJpdCA4LTExIGZvciBNYXggWCAqLworI2RlZmluZSBUTUExMjE3X01BWF9ZX0xPV0VSOAkJMHgzMyAvKiBCaXQgMC03IGZvciBNYXggWSAqLworI2RlZmluZSBUTUExMjE3X01BWF9ZX0hJR0hFUjQJCTB4MzQgLyogQml0IDgtMTEgZm9yIE1heCBZICovCisjZGVmaW5lIFRNQTEyMTdfREVWSUNFX0NNRF9SRVNFVAkweDY3IC8qIERldmljZSBDTUQgcmVnIGZvciByZXNldCAqLworI2RlZmluZSBUTUExMjE3X0RFVklDRV9DTURfUkVaRVJPCTB4NjkgLyogRGV2aWNlIENNRCByZWcgZm9yIHJlemVybyAqLworCisjZGVmaW5lIFRNQTEyMTdfTUFOVUZBQ1RVUkVSX0lECQkweDczIC8qIE1hbnVmYWN0dXJlciBJZCAqLworI2RlZmluZSBUTUExMjE3X1BST0RVQ1RfRkFNSUxZCQkweDc1IC8qIFByb2R1Y3QgRmFtaWx5ICovCisjZGVmaW5lIFRNQTEyMTdfRklSTVdBUkVfUkVWSVNJT04JMHg3NiAvKiBGaXJtd2FyZSBSZXZpc2lvbiAqLworI2RlZmluZSBUTUExMjE3X1NFUklBTF9OT19ISUdICQkweDdDIC8qIEJpdCA4LTE1IG9mIGRldmljZSBzZXJpYWwgbm8uICovCisjZGVmaW5lIFRNQTEyMTdfU0VSSUFMX05PX0xPVwkJMHg3RCAvKiBCaXQgMC03IG9mIGRldmljZSBzZXJpYWwgbm8uICovCisjZGVmaW5lIFRNQTEyMTdfUFJPRFVDVF9JRF9TVEFSVAkweDdFIC8qIFN0YXJ0IGFkZHJlc3MgZm9yIDEwIGJ5dGUgSUQgKi8KKyNkZWZpbmUgVE1BMTIxN19ERVZJQ0VfQ0FQQUJJTElUWQkweDhCIC8qIFJlcG9ydGluZyBjYXBhYmlsaXR5ICovCisKKworLyoKKyAqIFRoZSB0b3VjaCBwb3NpdGlvbiBzdHJ1Y3R1cmUuCisgKi8KK3N0cnVjdCB0b3VjaF9zdGF0ZSB7CisJaW50CXg7CisJaW50CXk7CisJYm9vbCBidXR0b247Cit9OworCisvKiBEZXZpY2UgU3BlY2lmaWMgaW5mbyBnaXZlbiBieSB0aGUgY29udHJvbGxlciAqLworc3RydWN0IGNwX2Rldl9pbmZvIHsKKwl1MTYJbWF4WDsKKwl1MTYJbWF4WTsKK307CisKKy8qIFZlbmRvciByZWxhdGVkIGluZm8gZ2l2ZW4gYnkgdGhlIGNvbnRyb2xsZXIgKi8KK3N0cnVjdCBjcF92ZW5kb3JfaW5mbyB7CisJdTgJdmVuZG9yX2lkOworCXU4CXByb2R1Y3RfZmFtaWx5OworCXU4CWZpcm13YXJlX3JldjsKKwl1MTYJc2VyaWFsX25vOworfTsKKworLyoKKyAqIFByaXZhdGUgc3RydWN0dXJlIHRvIHN0b3JlIHRoZSBkZXZpY2UgZGV0YWlscworICovCitzdHJ1Y3QgY3BfdG0xMjE3X2RldmljZSB7CisJc3RydWN0IGkyY19jbGllbnQJKmNsaWVudDsKKwlzdHJ1Y3QgZGV2aWNlCQkqZGV2OworCXN0cnVjdCBjcF92ZW5kb3JfaW5mbwl2aW5mbzsKKwlzdHJ1Y3QgY3BfZGV2X2luZm8JZGluZm87CisJc3RydWN0IGlucHV0X2Rldl9pbmZvIHsKKwkJY2hhcgkJCXBoeXNbMzJdOworCQljaGFyCQkJbmFtZVsxMjhdOworCQlzdHJ1Y3QgaW5wdXRfZGV2CSppbnB1dDsKKwkJc3RydWN0IHRvdWNoX3N0YXRlCXRvdWNoOworCX0gY3BfaW5wdXRfaW5mb1tNQVhfVE9VQ0hfU1VQUE9SVEVEXTsKKworCWludAl0aHJlYWRfcnVubmluZzsKKwlzdHJ1Y3QgbXV0ZXgJdGhyZWFkX211dGV4OworCisJaW50IGdwaW87Cit9OworCisKKy8qIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGFyZSB1c2VkIHRvIHJlYWQvd3JpdGUgcmVnaXN0ZXJzIG9uIHRoZSBkZXZpY2UKKyAqIGFzIHBlciB0aGUgUk1JIHByb3JvY29sLiBUZWNobmljYWxseSwgYSBwYWdlIHNlbGVjdCBzaG91bGQgYmUgd3JpdHRlbgorICogYmVmb3JlIGRvaW5nIHJlYWQvd3JpdGUgYnV0IHNpbmNlIHRoZSByZWdpc3RlciBvZmZzZXRzIGFyZSBiZWxvdyAweEZGCisgKiB3ZSBjYW4gdXNlIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHBhZ2Ugd2hpY2ggaXMgMHgwMAorICovCitzdGF0aWMgaW50IGNwX3RtMTIxN19yZWFkKHN0cnVjdCBjcF90bTEyMTdfZGV2aWNlICp0cywKKwkJCQl1OCAqcmVxLCBpbnQgc2l6ZSkKK3sKKwlpbnQgaSwgcmV0dmFsOworCisJLyogU2VuZCB0aGUgYWRkcmVzcyAqLworCXJldHZhbCA9IGkyY19tYXN0ZXJfc2VuZCh0cy0+Y2xpZW50LCAmcmVxWzBdLCAxKTsKKwlpZiAocmV0dmFsICE9IDEpIHsKKwkJZGV2X2Vycih0cy0+ZGV2LCAiY3BfdG0xMjE3OiBJMkMgc2VuZCBmYWlsZWRcbiIpOworCQlyZXR1cm4gcmV0dmFsOworCX0KKwltc2xlZXAoV0FJVF9GT1JfUkVTUE9OU0UpOworCWZvciAoaSA9IDA7IGkgPCBNQVhfUkVUUklFUzsgaSsrKSB7CisJCXJldHZhbCA9IGkyY19tYXN0ZXJfcmVjdih0cy0+Y2xpZW50LCAmcmVxWzFdLCBzaXplKTsKKwkJaWYgKHJldHZhbCA9PSBzaXplKSB7CisJCQlicmVhazsKKwkJfSBlbHNlIHsKKwkJCW1zbGVlcChJTkNSRU1FTlRBTF9ERUxBWSk7CisJCQlkZXZfZGJnKHRzLT5kZXYsICJjcF90bTEyMTc6IFJldHJ5IGNvdW50IGlzICVkXG4iLCBpKTsKKwkJfQorCX0KKwlpZiAocmV0dmFsICE9IHNpemUpCisJCWRldl9lcnIodHMtPmRldiwgImNwX3RtMTIxNzogUmVhZCBmcm9tIGRldmljZSBmYWlsZWRcbiIpOworCisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGludCBjcF90bTEyMTdfd3JpdGUoc3RydWN0IGNwX3RtMTIxN19kZXZpY2UgKnRzLAorCQkJCXU4ICpyZXEsIGludCBzaXplKQoreworCWludCByZXR2YWw7CisKKwkvKiBTZW5kIHRoZSBhZGRyZXNzIGFuZCB0aGUgZGF0YSB0byBiZSB3cml0dGVuICovCisJcmV0dmFsID0gaTJjX21hc3Rlcl9zZW5kKHRzLT5jbGllbnQsICZyZXFbMF0sIHNpemUgKyAxKTsKKwlpZiAocmV0dmFsICE9IHNpemUgKyAxKSB7CisJCWRldl9lcnIodHMtPmRldiwgImNwX3RtMTIxNzogSTJDIHdyaXRlICBmYWlsZWQ6ICVkXG4iLCByZXR2YWwpOworCQlyZXR1cm4gcmV0dmFsOworCX0KKwkvKiBXYWl0IGZvciB0aGUgd3JpdGUgdG8gY29tcGxldGUuIFRCRCB3aHkgdGhpcyBpcyByZXF1aXJlZCAqLworCW1zbGVlcChXQUlUX0ZPUl9SRVNQT05TRSk7CisKKwlyZXR1cm4gc2l6ZTsKK30KKworc3RhdGljIGludCBjcF90bTEyMTdfbWFza19pbnRlcnJ1cHQoc3RydWN0IGNwX3RtMTIxN19kZXZpY2UgKnRzKQoreworCXU4IHJlcVsyXTsKKwlpbnQgcmV0dmFsOworCisJcmVxWzBdID0gVE1BMTIxN19JTlRFUlJVUFRfRU5BQkxFOworCXJlcVsxXSA9IDB4MDsKKwlyZXR2YWwgPSBjcF90bTEyMTdfd3JpdGUodHMsIHJlcSwgMSk7CisJaWYgKHJldHZhbCAhPSAxKQorCQlyZXR1cm4gLUVJTzsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNwX3RtMTIxN191bm1hc2tfaW50ZXJydXB0KHN0cnVjdCBjcF90bTEyMTdfZGV2aWNlICp0cykKK3sKKwl1OCByZXFbMl07CisJaW50IHJldHZhbDsKKworCXJlcVswXSA9IFRNQTEyMTdfSU5URVJSVVBUX0VOQUJMRTsKKwlyZXFbMV0gPSAweGE7CisJcmV0dmFsID0gY3BfdG0xMjE3X3dyaXRlKHRzLCByZXEsIDEpOworCWlmIChyZXR2YWwgIT0gMSkKKwkJcmV0dXJuIC1FSU87CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcHJvY2Vzc190b3VjaChzdHJ1Y3QgY3BfdG0xMjE3X2RldmljZSAqdHMsIGludCBpbmRleCkKK3sKKwlpbnQgcmV0dmFsOworCXN0cnVjdCBpbnB1dF9kZXZfaW5mbyAqaW5wdXRfaW5mbyA9CisJCShzdHJ1Y3QgaW5wdXRfZGV2X2luZm8gKikmdHMtPmNwX2lucHV0X2luZm9baW5kZXhdOworCXU4IHh5X2RhdGFbNl07CisKKwlpZiAoaW5kZXggPT0gMCkKKwkJeHlfZGF0YVswXSA9IFRNQTEyMTdfRklOR0VSMV9YX0hJR0hFUjg7CisJZWxzZQorCQl4eV9kYXRhWzBdID0gVE1BMTIxN19GSU5HRVIyX1hfSElHSEVSODsKKworCXJldHZhbCA9IGNwX3RtMTIxN19yZWFkKHRzLCB4eV9kYXRhLCA1KTsKKwlpZiAocmV0dmFsIDwgNSkgeworCQlkZXZfZXJyKHRzLT5kZXYsICJjcF90bTEyMTc6IFhZIHJlYWQgZnJvbSBkZXZpY2UgZmFpbGVkXG4iKTsKKwkJcmV0dXJuOworCX0KKworCS8qIE5vdGU6IEN1cnJlbnRseSBub3QgdXNpbmcgdGhlIFogdmFsdWVzIGJ1dCBtYXkgYmUgcmVxdXJpZWQgaW4KKwkgICB0aGUgZnV0dXJlLiAqLworCWlucHV0X2luZm8tPnRvdWNoLnggPSAoeHlfZGF0YVsxXSA8PCA0KQorCQkJCQl8ICh4eV9kYXRhWzNdICYgMHgwRik7CisJaW5wdXRfaW5mby0+dG91Y2gueSA9ICh4eV9kYXRhWzJdIDw8IDQpCisJCQkJCXwgKCh4eV9kYXRhWzNdICYgMHhGMCkgPj4gNCk7CisJaW5wdXRfcmVwb3J0X2FicyhpbnB1dF9pbmZvLT5pbnB1dCwgQUJTX1gsIGlucHV0X2luZm8tPnRvdWNoLngpOworCWlucHV0X3JlcG9ydF9hYnMoaW5wdXRfaW5mby0+aW5wdXQsIEFCU19ZLCBpbnB1dF9pbmZvLT50b3VjaC55KTsKKwlpbnB1dF9zeW5jKGlucHV0X2luZm8tPmlucHV0KTsKK30KKworc3RhdGljIHZvaWQgY3BfdG0xMjE3X2dldF9kYXRhKHN0cnVjdCBjcF90bTEyMTdfZGV2aWNlICp0cykKK3sKKwl1OCByZXFbMl07CisJaW50IHJldHZhbCwgaSwgZmluZ2VyX3RvdWNoZWQgPSAwOworCisJZG8geworCQlyZXFbMF0gPSBUTUExMjE3X0ZJTkdFUl9TVEFURTsKKwkJcmV0dmFsID0gY3BfdG0xMjE3X3JlYWQodHMsIHJlcSwgMSk7CisJCWlmIChyZXR2YWwgIT0gMSkgeworCQkJZGV2X2Vycih0cy0+ZGV2LAorCQkJCSJjcF90bTEyMTc6IFJlYWQgZnJvbSBkZXZpY2UgZmFpbGVkXG4iKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWZpbmdlcl90b3VjaGVkID0gMDsKKwkJLyogU3RhcnQgc2FtcGxpbmcgdW50aWwgdGhlIHByZXNzdXJlIGlzIGJlbG93CisJCSAgdGhyZXNob2xkICovCisJCWZvciAoaSA9IDA7IGkgPCBUT1VDSF9TVVBQT1JURUQ7IGkrKykgeworCQkJaWYgKHJlcVsxXSAmIDB4MykgeworCQkJCWZpbmdlcl90b3VjaGVkKys7CisJCQkJaWYgKHRzLT5jcF9pbnB1dF9pbmZvW2ldLnRvdWNoLmJ1dHRvbiA9PSAwKSB7CisJCQkJCS8qIHNlbmQgdGhlIGJ1dHRvbiB0b3VjaCBldmVudCAqLworCQkJCQlpbnB1dF9yZXBvcnRfa2V5KAorCQkJCQkJdHMtPmNwX2lucHV0X2luZm9baV0uaW5wdXQsCisJCQkJCQlCVE5fVE9VQ0gsIDEpOworCQkJCQl0cy0+Y3BfaW5wdXRfaW5mb1tpXS50b3VjaC5idXR0b24gPSAxOworCQkJCX0KKwkJCQlwcm9jZXNzX3RvdWNoKHRzLCBpKTsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKHRzLT5jcF9pbnB1dF9pbmZvW2ldLnRvdWNoLmJ1dHRvbiA9PSAxKSB7CisJCQkJCS8qIHNlbmQgdGhlIGJ1dHRvbiByZWxlYXNlIGV2ZW50ICovCisJCQkJCWlucHV0X3JlcG9ydF9rZXkoCisJCQkJCQl0cy0+Y3BfaW5wdXRfaW5mb1tpXS5pbnB1dCwKKwkJCQkJCUJUTl9UT1VDSCwgMCk7CisJCQkJCWlucHV0X3N5bmModHMtPmNwX2lucHV0X2luZm9baV0uaW5wdXQpOworCQkJCQl0cy0+Y3BfaW5wdXRfaW5mb1tpXS50b3VjaC5idXR0b24gPSAwOworCQkJCX0KKwkJCX0KKwkJCXJlcVsxXSA9IHJlcVsxXSA+PiAyOworCQl9CisJCW1zbGVlcChERUxBWV9CVFdJTl9TQU1QTEUpOworCX0gd2hpbGUgKGZpbmdlcl90b3VjaGVkID4gMCk7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBjcF90bTEyMTdfc2FtcGxlX3RocmVhZChpbnQgaXJxLCB2b2lkICpoYW5kbGUpCit7CisJc3RydWN0IGNwX3RtMTIxN19kZXZpY2UgKnRzID0gKHN0cnVjdCBjcF90bTEyMTdfZGV2aWNlICopIGhhbmRsZTsKKwl1OCByZXFbMl07CisJaW50IHJldHZhbDsKKworCS8qIENoZWRrIGlmIGFub3RoZXIgdGhyZWFkIGlzIGFscmVhZHkgcnVubmluZyAqLworCW11dGV4X2xvY2soJnRzLT50aHJlYWRfbXV0ZXgpOworCWlmICh0cy0+dGhyZWFkX3J1bm5pbmcgPT0gMSkgeworCQltdXRleF91bmxvY2soJnRzLT50aHJlYWRfbXV0ZXgpOworCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJfSBlbHNlIHsKKwkJdHMtPnRocmVhZF9ydW5uaW5nID0gMTsKKwkJbXV0ZXhfdW5sb2NrKCZ0cy0+dGhyZWFkX211dGV4KTsKKwl9CisKKwkvKiBNYXNrIHRoZSBpbnRlcnJ1cHRzICovCisJcmV0dmFsID0gY3BfdG0xMjE3X21hc2tfaW50ZXJydXB0KHRzKTsKKworCS8qIFJlYWQgdGhlIEludGVycnVwdCBTdGF0dXMgcmVnaXN0ZXIgdG8gZmluZCB0aGUgY2F1c2Ugb2YgdGhlCisJICAgSW50ZXJydXB0ICovCisJcmVxWzBdID0gVE1BMTIxN19JTlRfU1RBVFVTOworCXJldHZhbCA9IGNwX3RtMTIxN19yZWFkKHRzLCByZXEsIDEpOworCWlmIChyZXR2YWwgIT0gMSkKKwkJZ290byBleGl0X3RocmVhZDsKKworCWlmICghKHJlcVsxXSAmIDB4OCkpCisJCWdvdG8gZXhpdF90aHJlYWQ7CisKKwljcF90bTEyMTdfZ2V0X2RhdGEodHMpOworCitleGl0X3RocmVhZDoKKwkvKiBVbm1hc2sgdGhlIGludGVycnVwdHMgYmVmb3JlIGdvaW5nIHRvIHNsZWVwICovCisJcmV0dmFsID0gY3BfdG0xMjE3X3VubWFza19pbnRlcnJ1cHQodHMpOworCisJbXV0ZXhfbG9jaygmdHMtPnRocmVhZF9tdXRleCk7CisJdHMtPnRocmVhZF9ydW5uaW5nID0gMDsKKwltdXRleF91bmxvY2soJnRzLT50aHJlYWRfbXV0ZXgpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaW50IGNwX3RtMTIxN19pbml0X2RhdGEoc3RydWN0IGNwX3RtMTIxN19kZXZpY2UgKnRzKQoreworCWludCByZXR2YWw7CisJdTgJcmVxWzJdOworCisJLyogUmVhZCB0aGUgdmVuZG9yIGlkLyBmdyByZXZpc2lvbiBldGMuIElnbm9yaW5nIHJldHVybiBjaGVjayBhcyB0aGlzCisJICAgaXMgbm9uIGNyaXRpY2FsIGluZm8gICovCisJcmVxWzBdID0gVE1BMTIxN19NQU5VRkFDVFVSRVJfSUQ7CisJcmV0dmFsID0gY3BfdG0xMjE3X3JlYWQodHMsIHJlcSwgMSk7CisJdHMtPnZpbmZvLnZlbmRvcl9pZCA9IHJlcVsxXTsKKworCXJlcVswXSA9IFRNQTEyMTdfUFJPRFVDVF9GQU1JTFk7CisJcmV0dmFsID0gY3BfdG0xMjE3X3JlYWQodHMsIHJlcSwgMSk7CisJdHMtPnZpbmZvLnByb2R1Y3RfZmFtaWx5ID0gcmVxWzFdOworCisJcmVxWzBdID0gVE1BMTIxN19GSVJNV0FSRV9SRVZJU0lPTjsKKwlyZXR2YWwgPSBjcF90bTEyMTdfcmVhZCh0cywgcmVxLCAxKTsKKwl0cy0+dmluZm8uZmlybXdhcmVfcmV2ID0gcmVxWzFdOworCisJcmVxWzBdID0gVE1BMTIxN19TRVJJQUxfTk9fSElHSDsKKwlyZXR2YWwgPSBjcF90bTEyMTdfcmVhZCh0cywgcmVxLCAxKTsKKwl0cy0+dmluZm8uc2VyaWFsX25vID0gKHJlcVsxXSA8PCA4KTsKKworCXJlcVswXSA9IFRNQTEyMTdfU0VSSUFMX05PX0xPVzsKKwlyZXR2YWwgPSBjcF90bTEyMTdfcmVhZCh0cywgcmVxLCAxKTsKKwl0cy0+dmluZm8uc2VyaWFsX25vID0gdHMtPnZpbmZvLnNlcmlhbF9ubyB8IHJlcVsxXTsKKworCXJlcVswXSA9IFRNQTEyMTdfTUFYX1hfSElHSEVSNDsKKwlyZXR2YWwgPSBjcF90bTEyMTdfcmVhZCh0cywgcmVxLCAxKTsKKwl0cy0+ZGluZm8ubWF4WCA9IChyZXFbMV0gJiAweEYpIDw8IDg7CisKKwlyZXFbMF0gPSBUTUExMjE3X01BWF9YX0xPV0VSODsKKwlyZXR2YWwgPSBjcF90bTEyMTdfcmVhZCh0cywgcmVxLCAxKTsKKwl0cy0+ZGluZm8ubWF4WCA9IHRzLT5kaW5mby5tYXhYIHwgcmVxWzFdOworCisJcmVxWzBdID0gVE1BMTIxN19NQVhfWV9ISUdIRVI0OworCXJldHZhbCA9IGNwX3RtMTIxN19yZWFkKHRzLCByZXEsIDEpOworCXRzLT5kaW5mby5tYXhZID0gKHJlcVsxXSAmIDB4RikgPDwgODsKKworCXJlcVswXSA9IFRNQTEyMTdfTUFYX1lfTE9XRVI4OworCXJldHZhbCA9IGNwX3RtMTIxN19yZWFkKHRzLCByZXEsIDEpOworCXRzLT5kaW5mby5tYXhZID0gdHMtPmRpbmZvLm1heFkgfCByZXFbMV07CisKKwlyZXR1cm4gMDsKKworfQorCisvKgorICoJU2V0IHVwIGEgR1BJTyBmb3IgdXNlIGFzIHRoZSBpbnRlcnJ1cHQuIFdlIGNhbid0IHNpbXBseSBkbyB0aGlzIGF0CisgKglib290IHRpbWUgYmVjYXVzZSB0aGUgR1BJTyBkcml2ZXJzIHRoZW1zZWx2ZXMgbWF5IG5vdCBiZSBhcm91bmQgYXQKKyAqCWJvb3QvZmlybXdhcmUgc2V0IHVwIHRpbWUgdG8gZG8gdGhlIHdvcmsuIEluc3RlYWQgZGVmZXIgaXQgdG8gZHJpdmVyCisgKglkZXRlY3Rpb24uCisgKi8KKworc3RhdGljIGludCBjcF90bTEyMTdfc2V0dXBfZ3Bpb19pcnEoc3RydWN0IGNwX3RtMTIxN19kZXZpY2UgKnRzKQoreworCWludCByZXR2YWw7CisKKwkvKiBIb29rIHVwIHRoZSBpcnEgaGFuZGxlciAqLworCXJldHZhbCA9IGdwaW9fcmVxdWVzdCh0cy0+Z3BpbywgImNwX3RtMTIxN190b3VjaCIpOworCWlmIChyZXR2YWwgPCAwKSB7CisJCWRldl9lcnIodHMtPmRldiwgImNwX3RtMTIxNzogR1BJTyByZXF1ZXN0IGZhaWxlZCBlcnJvciAlZFxuIiwKKwkJCQkJCQkJcmV0dmFsKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CisKKwlyZXR2YWwgPSBncGlvX2RpcmVjdGlvbl9pbnB1dCh0cy0+Z3Bpbyk7CisJaWYgKHJldHZhbCA8IDApIHsKKwkJZGV2X2Vycih0cy0+ZGV2LAorCQkiY3BfdG0xMjE3OiBHUElPIGRpcmVjdGlvbiBjb25maWd1cmF0aW9uIGZhaWxlZCwgZXJyb3IgJWRcbiIsCisJCQkJCQkJCXJldHZhbCk7CisJCWdwaW9fZnJlZSh0cy0+Z3Bpbyk7CisJCXJldHVybiByZXR2YWw7CisJfQorCisJcmV0dmFsID0gZ3Bpb190b19pcnEodHMtPmdwaW8pOworCWlmIChyZXR2YWwgPCAwKSB7CisJCWRldl9lcnIodHMtPmRldiwgImNwX3RtMTIxNzogR1BJTyB0byBJUlEgZmFpbGVkaSwiCisJCSIgZXJyb3IgJWRcbiIsIHJldHZhbCk7CisJCWdwaW9fZnJlZSh0cy0+Z3Bpbyk7CisJfQorCWRldl9kYmcodHMtPmRldiwKKwkJImNwX3RtMTIxNzogR290IElSUSBudW1iZXIgaXMgJWQgZm9yIEdQSU8gJWRcbiIsCisJCXJldHZhbCwgdHMtPmdwaW8pOworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBpbnQgY3BfdG0xMjE3X3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJCQljb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IGNwX3RtMTIxN19kZXZpY2UgKnRzOworCXN0cnVjdCBpbnB1dF9kZXYgKmlucHV0X2RldjsKKwlzdHJ1Y3QgaW5wdXRfZGV2X2luZm8JKmlucHV0X2luZm87CisJc3RydWN0IGNwX3RtMTIxN19wbGF0Zm9ybV9kYXRhICpwZGF0YTsKKwl1OCByZXFbMl07CisJaW50IGksIHJldHZhbDsKKworCS8qIE5vIHBkYXRhIGlzIGZpbmUgLSB3ZSB0aGVuIHVzZSAibm9ybWFsIiBJUlEgbW9kZSAqLworCisJcGRhdGEgPSBjbGllbnQtPmRldi5wbGF0Zm9ybV9kYXRhOworCisJdHMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgY3BfdG0xMjE3X2RldmljZSksIEdGUF9LRVJORUwpOworCWlmICghdHMpIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsCisJCQkiY3BfdG0xMjE3OiBQcml2YXRlIERldmljZSBTdHJ1Y3QgYWxsb2MgZmFpbGVkXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJdHMtPmNsaWVudCA9IGNsaWVudDsKKwl0cy0+ZGV2ID0gJmNsaWVudC0+ZGV2OworCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIHRzKTsKKworCXRzLT50aHJlYWRfcnVubmluZyA9IDA7CisJbXV0ZXhfaW5pdCgmdHMtPnRocmVhZF9tdXRleCk7CisKKwkvKiBSZXNldCB0aGUgQ29udHJvbGxlciAqLworCXJlcVswXSA9IFRNQTEyMTdfREVWSUNFX0NNRF9SRVNFVDsKKwlyZXFbMV0gPSAweDE7CisJcmV0dmFsID0gY3BfdG0xMjE3X3dyaXRlKHRzLCByZXEsIDEpOworCWlmIChyZXR2YWwgIT0gMSkgeworCQlkZXZfZXJyKHRzLT5kZXYsICJjcF90bTEyMTc6IENvbnRyb2xsZXIgcmVzZXQgZmFpbGVkXG4iKTsKKwkJa2ZyZWUodHMpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwkvKiBDbGVhciB1cCB0aGUgaW50ZXJydXB0IHN0YXR1cyBmcm9tIHJlc2V0LiAqLworCXJlcVswXSA9IFRNQTEyMTdfSU5UX1NUQVRVUzsKKwlyZXR2YWwgPSBjcF90bTEyMTdfcmVhZCh0cywgcmVxLCAxKTsKKworCS8qIE1hc2sgYWxsIHRoZSBpbnRlcnJ1cHRzICovCisJcmV0dmFsID0gY3BfdG0xMjE3X21hc2tfaW50ZXJydXB0KHRzKTsKKworCS8qIFJlYWQgdGhlIGNvbnRyb2xsZXIgaW5mb3JtYXRpb24gKi8KKwljcF90bTEyMTdfaW5pdF9kYXRhKHRzKTsKKworCS8qIFRoZSBmb2xsb3dpbmcgY29kZSB3aWxsIHJlZ2lzdGVyIG11bHRpcGxlIGV2ZW50IGRldmljZXMgd2hlbgorCSAgIG11bHRpLXBvaW50ZXIgaXMgZW5hYmxlZCwgdGhlIGNvZGUgaGFzIG5vdCBiZWVuIHRlc3RlZAorCSAgIHdpdGggTVBYICovCisJZm9yIChpID0gMDsgaSA8IFRPVUNIX1NVUFBPUlRFRDsgaSsrKSB7CisJCWlucHV0X2RldiA9IGlucHV0X2FsbG9jYXRlX2RldmljZSgpOworCQlpZiAoaW5wdXRfZGV2ID09IE5VTEwpIHsKKwkJCWRldl9lcnIodHMtPmRldiwKKwkJCQkiY3BfdG0xMjE3OklucHV0IERldmljZSBTdHJ1Y3QgYWxsb2MgZmFpbGVkXG4iKTsKKwkJCWtmcmVlKHRzKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJCWlucHV0X2luZm8gPSAmdHMtPmNwX2lucHV0X2luZm9baV07CisJCXNucHJpbnRmKGlucHV0X2luZm8tPm5hbWUsIHNpemVvZihpbnB1dF9pbmZvLT5uYW1lKSwKKwkJCSJjcF90bTEyMTdfdG91Y2hzY3JlZW5fJWQiLCBpKTsKKwkJaW5wdXRfZGV2LT5uYW1lID0gaW5wdXRfaW5mby0+bmFtZTsKKwkJc25wcmludGYoaW5wdXRfaW5mby0+cGh5cywgc2l6ZW9mKGlucHV0X2luZm8tPnBoeXMpLAorCQkJIiVzL2lucHV0JWQiLCBkZXZfbmFtZSgmY2xpZW50LT5kZXYpLCBpKTsKKworCQlpbnB1dF9kZXYtPnBoeXMgPSBpbnB1dF9pbmZvLT5waHlzOworCQlpbnB1dF9kZXYtPmlkLmJ1c3R5cGUgPSBCVVNfSTJDOworCisJCWlucHV0X2Rldi0+ZXZiaXRbMF0gPSBCSVRfTUFTSyhFVl9LRVkpIHwgQklUX01BU0soRVZfQUJTKTsKKwkJaW5wdXRfZGV2LT5rZXliaXRbQklUX1dPUkQoQlROX1RPVUNIKV0gPSBCSVRfTUFTSyhCVE5fVE9VQ0gpOworCisJCWlucHV0X3NldF9hYnNfcGFyYW1zKGlucHV0X2RldiwgQUJTX1gsIDAsIHRzLT5kaW5mby5tYXhYLCAwLCAwKTsKKwkJaW5wdXRfc2V0X2Fic19wYXJhbXMoaW5wdXRfZGV2LCBBQlNfWSwgMCwgdHMtPmRpbmZvLm1heFksIDAsIDApOworCisJCXJldHZhbCA9IGlucHV0X3JlZ2lzdGVyX2RldmljZShpbnB1dF9kZXYpOworCQlpZiAocmV0dmFsKSB7CisJCQlkZXZfZXJyKHRzLT5kZXYsCisJCQkJIklucHV0IGRldiByZWdpc3RyYXRpb24gZmFpbGVkIGZvciAlc1xuIiwKKwkJCQkJaW5wdXRfZGV2LT5uYW1lKTsKKwkJCWdvdG8gZmFpbDsKKwkJfQorCQlpbnB1dF9pbmZvLT5pbnB1dCA9IGlucHV0X2RldjsKKwl9CisKKwkvKiBTZXR1cCB0aGUgcmVwb3J0aW5nIG1vZGUgdG8gc2VuZCBhbiBpbnRlcnJ1cHQgb25seSB3aGVuCisJICAgZmluZ2VyIGFycml2ZXMgb3IgZGVwYXJ0cy4gKi8KKwlyZXFbMF0gPSBUTUExMjE3X1JFUE9SVF9NT0RFOworCXJlcVsxXSA9IDB4MDI7CisJcmV0dmFsID0gY3BfdG0xMjE3X3dyaXRlKHRzLCByZXEsIDEpOworCisJLyogU2V0dXAgdGhlIGRldmljZSB0byBubyBzbGVlcCBtb2RlIGZvciBub3cgYW5kIG1ha2UgaXQgY29uZmlndXJlZCAqLworCXJlcVswXSA9IFRNQTEyMTdfREVWSUNFX0NUUkw7CisJcmVxWzFdID0gMHg4NDsKKwlyZXR2YWwgPSBjcF90bTEyMTdfd3JpdGUodHMsIHJlcSwgMSk7CisKKwkvKiBDaGVjayBmb3IgdGhlIHN0YXR1cyBvZiB0aGUgZGV2aWNlICovCisJcmVxWzBdID0gVE1BMTIxN19ERVZfU1RBVFVTOworCXJldHZhbCA9IGNwX3RtMTIxN19yZWFkKHRzLCByZXEsIDEpOworCWlmIChyZXFbMV0gIT0gMCkgeworCQlkZXZfZXJyKHRzLT5kZXYsCisJCQkiY3BfdG0xMjE3OiBEZXZpY2UgU3RhdHVzIDB4JXggIT0gMDogY29uZmlnIGZhaWxlZFxuIiwKKwkJCXJlcVsxXSk7CisKKwkJcmV0dmFsID0gLUVJTzsKKwkJZ290byBmYWlsOworCX0KKworCWlmIChwZGF0YSAmJiBwZGF0YS0+Z3BpbykgeworCQl0cy0+Z3BpbyA9IHBkYXRhLT5ncGlvOworCQlyZXR2YWwgPSBjcF90bTEyMTdfc2V0dXBfZ3Bpb19pcnEodHMpOworCX0gZWxzZQorCQlyZXR2YWwgPSBjbGllbnQtPmlycTsKKworCWlmIChyZXR2YWwgPCAwKSB7CisJCWRldl9lcnIodHMtPmRldiwgImNwX3RtMTIxNzogR1BJTyByZXF1ZXN0IGZhaWxlZCBlcnJvciAlZFxuIiwKKwkJCQkJCQkJcmV0dmFsKTsKKwkJZ290byBmYWlsOworCX0KKworCWNsaWVudC0+aXJxID0gcmV0dmFsOworCisKKwlyZXR2YWwgPSByZXF1ZXN0X3RocmVhZGVkX2lycShjbGllbnQtPmlycSwKKwkJTlVMTCwgY3BfdG0xMjE3X3NhbXBsZV90aHJlYWQsCisJCUlSUUZfVFJJR0dFUl9GQUxMSU5HLCAiY3BfdG0xMjE3X3RvdWNoIiwgdHMpOworCWlmIChyZXR2YWwgPCAwKSB7CisJCWRldl9lcnIodHMtPmRldiwgImNwX3RtMTIxNzogUmVxdWVzdCBJUlEgZXJyb3IgJWRcbiIsIHJldHZhbCk7CisJCWdvdG8gZmFpbF9ncGlvOworCX0KKworCS8qIFVubWFzayB0aGUgaW50ZXJydXB0cyAqLworCXJldHZhbCA9IGNwX3RtMTIxN191bm1hc2tfaW50ZXJydXB0KHRzKTsKKwlpZiAocmV0dmFsID09IDApCisJCXJldHVybiAwOworCisJZnJlZV9pcnEoY2xpZW50LT5pcnEsIHRzKTsKK2ZhaWxfZ3BpbzoKKwlpZiAodHMtPmdwaW8pCisJCWdwaW9fZnJlZSh0cy0+Z3Bpbyk7CitmYWlsOgorCS8qIENsZWFuIHVwIGJlZm9yZSByZXR1cm5pbmcgZmFpbHVyZSAqLworCWZvciAoaSA9IDA7IGkgPCBUT1VDSF9TVVBQT1JURUQ7IGkrKykgeworCQlpZiAodHMtPmNwX2lucHV0X2luZm9baV0uaW5wdXQpIHsKKwkJCWlucHV0X3VucmVnaXN0ZXJfZGV2aWNlKHRzLT5jcF9pbnB1dF9pbmZvW2ldLmlucHV0KTsKKwkJCWlucHV0X2ZyZWVfZGV2aWNlKHRzLT5jcF9pbnB1dF9pbmZvW2ldLmlucHV0KTsKKwkJfQorCX0KKwlrZnJlZSh0cyk7CisJcmV0dXJuIHJldHZhbDsKKworfQorCisvKgorICogY3BfdG0xMjE3IHN1c3BlbmQKKyAqCisgKi8KK3N0YXRpYyBpbnQgY3BfdG0xMjE3X3N1c3BlbmQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgcG1fbWVzc2FnZV90IG1lc2cpCit7CisJc3RydWN0IGNwX3RtMTIxN19kZXZpY2UgKnRzID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJdTggcmVxWzJdOworCWludCByZXR2YWw7CisKKwkvKiBQdXQgdGhlIGNvbnRyb2xsZXIgdG8gc2xlZXAgKi8KKwlyZXFbMF0gPSBUTUExMjE3X0RFVklDRV9DVFJMOworCXJldHZhbCA9IGNwX3RtMTIxN19yZWFkKHRzLCByZXEsIDEpOworCXJlcVsxXSA9IChyZXFbMV0gJiAweEY4KSB8IDB4MTsKKwlyZXR2YWwgPSBjcF90bTEyMTdfd3JpdGUodHMsIHJlcSwgMSk7CisKKwlpZiAoZGV2aWNlX21heV93YWtldXAoJmNsaWVudC0+ZGV2KSkKKwkJZW5hYmxlX2lycV93YWtlKGNsaWVudC0+aXJxKTsKKworCXJldHVybiAwOworfQorCisvKgorICogY3BfdG0xMjE3X3Jlc3VtZQorICoKKyAqLworc3RhdGljIGludCBjcF90bTEyMTdfcmVzdW1lKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJc3RydWN0IGNwX3RtMTIxN19kZXZpY2UgKnRzID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJdTggcmVxWzJdOworCWludCByZXR2YWw7CisKKwkvKiBUYWtlIHRoZSBjb250cm9sbGVyIG91dCBvZiBzbGVlcCAqLworCXJlcVswXSA9IFRNQTEyMTdfREVWSUNFX0NUUkw7CisJcmV0dmFsID0gY3BfdG0xMjE3X3JlYWQodHMsIHJlcSwgMSk7CisJcmVxWzFdID0gKHJlcVsxXSAmIDB4RjgpIHwgMHg0OworCXJldHZhbCA9IGNwX3RtMTIxN193cml0ZSh0cywgcmVxLCAxKTsKKworCS8qIFJlc3RvcmUgdGhlIHJlZ2lzdGVyIHNldHRpbmdzIHNpbmMgdGhlIHBvd2VyIHRvIHRoZQorCSAgIGNvdWxkIGhhdmUgYmVlbiBjdXQgb2ZmICovCisKKwkvKiBTZXR1cCB0aGUgcmVwb3J0aW5nIG1vZGUgdG8gc2VuZCBhbiBpbnRlcnJ1cHQgb25seSB3aGVuCisJICAgZmluZ2VyIGFycml2ZXMgb3IgZGVwYXJ0cy4gKi8KKwlyZXFbMF0gPSBUTUExMjE3X1JFUE9SVF9NT0RFOworCXJlcVsxXSA9IDB4MDI7CisJcmV0dmFsID0gY3BfdG0xMjE3X3dyaXRlKHRzLCByZXEsIDEpOworCisJLyogU2V0dXAgdGhlIGRldmljZSB0byBubyBzbGVlcCBtb2RlIGZvciBub3cgYW5kIG1ha2UgaXQgY29uZmlndXJlZCAqLworCXJlcVswXSA9IFRNQTEyMTdfREVWSUNFX0NUUkw7CisJcmVxWzFdID0gMHg4NDsKKwlyZXR2YWwgPSBjcF90bTEyMTdfd3JpdGUodHMsIHJlcSwgMSk7CisKKwkvKiBTZXR1cCB0aGUgaW50ZXJydXB0IG1hc2sgKi8KKwlyZXR2YWwgPSBjcF90bTEyMTdfdW5tYXNrX2ludGVycnVwdCh0cyk7CisKKwlpZiAoZGV2aWNlX21heV93YWtldXAoJmNsaWVudC0+ZGV2KSkKKwkJZGlzYWJsZV9pcnFfd2FrZShjbGllbnQtPmlycSk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGNwX3RtMTIxN19yZW1vdmUKKyAqCisgKi8KK3N0YXRpYyBpbnQgY3BfdG0xMjE3X3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXN0cnVjdCBjcF90bTEyMTdfZGV2aWNlICp0cyA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCWludCBpOworCisJZnJlZV9pcnEoY2xpZW50LT5pcnEsIHRzKTsKKwlpZiAodHMtPmdwaW8pCisJCWdwaW9fZnJlZSh0cy0+Z3Bpbyk7CisJZm9yIChpID0gMDsgaSA8IFRPVUNIX1NVUFBPUlRFRDsgaSsrKQorCQlpbnB1dF91bnJlZ2lzdGVyX2RldmljZSh0cy0+Y3BfaW5wdXRfaW5mb1tpXS5pbnB1dCk7CisJa2ZyZWUodHMpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGkyY19kZXZpY2VfaWQgY3BfdG0xMjE3X2lkdGFibGVbXSA9IHsKKwl7IENQVE0xMjE3X0RFVklDRV9OQU1FLCAwIH0sCisJeyB9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgY3BfdG0xMjE3X2lkdGFibGUpOworCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgY3BfdG0xMjE3X2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwkJLm5hbWUJPSBDUFRNMTIxN19EUklWRVJfTkFNRSwKKwl9LAorCS5pZF90YWJsZQk9IGNwX3RtMTIxN19pZHRhYmxlLAorCS5wcm9iZQkJPSBjcF90bTEyMTdfcHJvYmUsCisJLnJlbW92ZQkJPSBjcF90bTEyMTdfcmVtb3ZlLAorCS5zdXNwZW5kICAgID0gY3BfdG0xMjE3X3N1c3BlbmQsCisJLnJlc3VtZSAgICAgPSBjcF90bTEyMTdfcmVzdW1lLAorfTsKKworc3RhdGljIGludCBfX2luaXQgY2xlYXJwYWRfdG0xMjE3X2luaXQodm9pZCkKK3sKKwlyZXR1cm4gaTJjX2FkZF9kcml2ZXIoJmNwX3RtMTIxN19kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgY2xlYXJwYWRfdG0xMjE3X2V4aXQodm9pZCkKK3sKKwlpMmNfZGVsX2RyaXZlcigmY3BfdG0xMjE3X2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGNsZWFycGFkX3RtMTIxN19pbml0KTsKK21vZHVsZV9leGl0KGNsZWFycGFkX3RtMTIxN19leGl0KTsKKworTU9EVUxFX0FVVEhPUigiUmFtZXNoIEFnYXJ3YWwgPHJhbWVzaC5hZ2Fyd2FsQGludGVsLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiU3luYXB0aWNzIFRNMTIxNyBUb3VjaFNjcmVlbiBEcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jcHRtMTIxNy9jcF90bTEyMTcuaCBiL2RyaXZlcnMvc3RhZ2luZy9jcHRtMTIxNy9jcF90bTEyMTcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMGNlMzFkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NwdG0xMjE3L2NwX3RtMTIxNy5oCkBAIC0wLDAgKzEsOSBAQAorI2lmbmRlZiBfX0xJTlVYX0kyQ19DUF9UTTEyMTdfSAorI2RlZmluZSBfX0xJTlVYX0kyQ19DUF9UTTEyMTdfSAorCitzdHJ1Y3QgY3BfdG0xMjE3X3BsYXRmb3JtX2RhdGEKK3sKKwlpbnQgZ3BpbzsJCS8qIElmIG5vdCBzZXQgdXNlcyB0aGUgSVJRIHJlc291cmNlIDAgKi8KK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NyeXN0YWxoZC9jcnlzdGFsaGRfaHcuYyBiL2RyaXZlcnMvc3RhZ2luZy9jcnlzdGFsaGQvY3J5c3RhbGhkX2h3LmMKaW5kZXggZjYzMTg1Ny4uMTUzZGRiZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NyeXN0YWxoZC9jcnlzdGFsaGRfaHcuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY3J5c3RhbGhkL2NyeXN0YWxoZF9ody5jCkBAIC0xNzExLDcgKzE3MTEsNyBAQAogCX0KIAogCUJDTUxPRyhCQ01MT0dfSU5GTywgIkZpcm13YXJlIERvd25sb2FkZWQgU3VjY2Vzc2Z1bGx5XG4iKTsKLQlyZXR1cm4gQkNfU1RTX1NVQ0NFU1M7OworCXJldHVybiBCQ19TVFNfU1VDQ0VTUzsKIH0KIAogZW51bSBCQ19TVEFUVVMgY3J5c3RhbGhkX2RvX2Z3X2NtZChzdHJ1Y3QgY3J5c3RhbGhkX2h3ICpodywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jcnlzdGFsaGQvY3J5c3RhbGhkX2xueC5jIGIvZHJpdmVycy9zdGFnaW5nL2NyeXN0YWxoZC9jcnlzdGFsaGRfbG54LmMKaW5kZXggMjhjNmI4Yy4uNzE5ZTcwYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NyeXN0YWxoZC9jcnlzdGFsaGRfbG54LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NyeXN0YWxoZC9jcnlzdGFsaGRfbG54LmMKQEAgLTUxNiw3ICs1MTYsNyBAQAogCiAJQkNNTE9HX0VOVEVSOwogCi0JcGluZm8gPSAoc3RydWN0IGNyeXN0YWxoZF9hZHAgKikgcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCXBpbmZvID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOwogCWlmICghcGluZm8pIHsKIAkJQkNNTE9HX0VSUigiY291bGQgbm90IGdldCBhZHBcbiIpOwogCQlyZXR1cm47CkBAIC02MjYsNyArNjI2LDcgQEAKIAlzdHJ1Y3QgY3J5c3RhbGhkX2lvY3RsX2RhdGEgKnRlbXA7CiAJZW51bSBCQ19TVEFUVVMgc3RzID0gQkNfU1RTX1NVQ0NFU1M7CiAKLQlhZHAgPSAoc3RydWN0IGNyeXN0YWxoZF9hZHAgKilwY2lfZ2V0X2RydmRhdGEocGRldik7CisJYWRwID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOwogCWlmICghYWRwKSB7CiAJCUJDTUxPR19FUlIoImNvdWxkIG5vdCBnZXQgYWRwXG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CkBAIC02NjAsNyArNjYwLDcgQEAKIAllbnVtIEJDX1NUQVRVUyBzdHMgPSBCQ19TVFNfU1VDQ0VTUzsKIAlpbnQgcmM7CiAKLQlhZHAgPSAoc3RydWN0IGNyeXN0YWxoZF9hZHAgKilwY2lfZ2V0X2RydmRhdGEocGRldik7CisJYWRwID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOwogCWlmICghYWRwKSB7CiAJCUJDTUxPR19FUlIoImNvdWxkIG5vdCBnZXQgYWRwXG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY3gyNTgyMS9jeDI1ODIxLWFsc2EuYyBiL2RyaXZlcnMvc3RhZ2luZy9jeDI1ODIxL2N4MjU4MjEtYWxzYS5jCmluZGV4IDlhMjA1YTMuLjE2MGY2NjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jeDI1ODIxL2N4MjU4MjEtYWxzYS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jeDI1ODIxL2N4MjU4MjEtYWxzYS5jCkBAIC02MzAsNyArNjMwLDcgQEAKICAqIE9ubHkgYm9hcmRzIHdpdGggZWVwcm9tIGFuZCBieXRlIDEgYXQgZWVwcm9tPTEgaGF2ZSBpdAogICovCiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCBjeDI1ODIxX2F1ZGlvX3BjaV90YmxbXSBfX2RldmluaXRkYXRhID0geworc3RhdGljIERFRklORV9QQ0lfREVWSUNFX1RBQkxFKGN4MjU4MjFfYXVkaW9fcGNpX3RibCkgPSB7CiAJezB4MTRmMSwgMHgwOTIwLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKIAl7MCx9CiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2N4dDFlMS9jb21ldC5jIGIvZHJpdmVycy9zdGFnaW5nL2N4dDFlMS9jb21ldC5jCmluZGV4IGRjYmU2YjYuLjUyMjI0Y2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jeHQxZTEvY29tZXQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY3h0MWUxL2NvbWV0LmMKQEAgLTI5LDcgKzI5LDcgQEAKICNlbmRpZgogCiAKLWV4dGVybiBpbnQgIGxvZ19sZXZlbDsKK2V4dGVybiBpbnQgIGN4dDFlMV9sb2dfbGV2ZWw7CiAKICNkZWZpbmUgQ09NRVRfTlVNX1NBTVBMRVMgICAyNCAgLyogTnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIHdhdmVmb3JtIHRhYmxlICovCiAjZGVmaW5lIENPTUVUX05VTV9VTklUUyAgICAgNSAgIC8qIE51bWJlciBvZiBwb2ludHMgcGVyIGVudHJ5IGluIHRhYmxlICovCkBAIC0yOTIsMTIgKzI5MiwxMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGkuZS5GUE1PREU9MCAoQDB4MjApICovCiAgICAgICAgIGlmICgobW9yZVBhcmFtcyAmIENGR19DTEtfUE9SVF9NQVNLKSA9PSBDRkdfQ0xLX1BPUlRfSU5URVJOQUwpCiAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChsb2dfbGV2ZWwgPj0gTE9HX1NCRUJVRzEyKQorICAgICAgICAgICAgaWYgKGN4dDFlMV9sb2dfbGV2ZWwgPj0gTE9HX1NCRUJVRzEyKQogICAgICAgICAgICAgICAgIHByX2luZm8oIj4+ICVzOiBjbG9ja21hc3RlciBpbnRlcm5hbCBjbG9ja1xuIiwgX19mdW5jX18pOwogICAgICAgICAgICAgcGNpX3dyaXRlXzMyICgodV9pbnQzMl90ICopICZjb21ldC0+dHhfdGltZSwgMHgwZCk7IC8qIGludGVybmFsIG9zY2lsbGF0b3IgKi8KICAgICAgICAgfSBlbHNlICAgICAgICAgICAgICAgICAgICAgIC8qIGV4dGVybmFsIGNsb2NrIHNvdXJjZSAqLwogICAgICAgICB7Ci0gICAgICAgICAgICBpZiAobG9nX2xldmVsID49IExPR19TQkVCVUcxMikKKyAgICAgICAgICAgIGlmIChjeHQxZTFfbG9nX2xldmVsID49IExPR19TQkVCVUcxMikKICAgICAgICAgICAgICAgICBwcl9pbmZvKCI+PiAlczogY2xvY2ttYXN0ZXIgZXh0ZXJuYWwgY2xvY2tcbiIsIF9fZnVuY19fKTsKICAgICAgICAgICAgIHBjaV93cml0ZV8zMiAoKHVfaW50MzJfdCAqKSAmY29tZXQtPnR4X3RpbWUsIDB4MDkpOyAvKiBsb29wIHRpbWluZwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIChleHRlcm5hbCkgKi8KQEAgLTMxMiw3ICszMTIsNyBAQAogICAgICAgICAgICAgcGNpX3dyaXRlXzMyICgodV9pbnQzMl90ICopICZjb21ldC0+YnJpZl9jZmcsIDB4MjEpOyAgICAgICAgLyogU2xhdmUgTW9kZSAoQ01PREU9MSkgKi8KICAgICAgICAgcGNpX3dyaXRlXzMyICgodV9pbnQzMl90ICopICZjb21ldC0+YnJpZl9mcGNmZywgMHgyMCk7ICAvKiBTbGF2ZSBNb2RlIGkuZS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBGUE1PREU9MSAoQDB4MjApICovCi0gICAgICAgIGlmIChsb2dfbGV2ZWwgPj0gTE9HX1NCRUJVRzEyKQorICAgICAgICBpZiAoY3h0MWUxX2xvZ19sZXZlbCA+PSBMT0dfU0JFQlVHMTIpCiAgICAgICAgICAgICBwcl9pbmZvKCI+PiAlczogY2xvY2tzbGF2ZSBpbnRlcm5hbCBjbG9ja1xuIiwgX19mdW5jX18pOwogICAgICAgICBwY2lfd3JpdGVfMzIgKCh1X2ludDMyX3QgKikgJmNvbWV0LT50eF90aW1lLCAweDBkKTsgICAgIC8qIG9zY2lsbGF0b3IgdGltaW5nICovCiAgICAgfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2N4dDFlMS9mdW5jdGlvbnMuYyBiL2RyaXZlcnMvc3RhZ2luZy9jeHQxZTEvZnVuY3Rpb25zLmMKaW5kZXggYWIzOTljMi4uZDlhOWFhMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2N4dDFlMS9mdW5jdGlvbnMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY3h0MWUxL2Z1bmN0aW9ucy5jCkBAIC01NCw3ICs1NCw3IEBACiAKICNlbmRpZgogCi1leHRlcm4gaW50ICBsb2dfbGV2ZWw7CitleHRlcm4gaW50ICBjeHQxZTFfbG9nX2xldmVsOwogZXh0ZXJuIGludCAgZHJ2cl9zdGF0ZTsKIAogCkBAIC02Nyw3ICs2Nyw3IEBACiAKICAgICBGTFVTSF9QQ0lfUkVBRCAoKTsKICAgICB2ID0gbGUzMl90b19jcHUgKCpwKTsKLSAgICBpZiAobG9nX2xldmVsID49IExPR19ERUJVRykKKyAgICBpZiAoY3h0MWUxX2xvZ19sZXZlbCA+PSBMT0dfREVCVUcpCiAgICAgICAgIHByX2luZm8oInBjaV9yZWFkIDogJXggPSAleFxuIiwgKHVfaW50MzJfdCkgcCwgdik7CiAgICAgcmV0dXJuIHY7CiAjZWxzZQpAQCAtODAsNyArODAsNyBAQAogcGNpX3dyaXRlXzMyICh1X2ludDMyX3QgKnAsIHVfaW50MzJfdCB2KQogewogI2lmZGVmIEZMT1dfREVCVUcKLSAgICBpZiAobG9nX2xldmVsID49IExPR19ERUJVRykKKyAgICBpZiAoY3h0MWUxX2xvZ19sZXZlbCA+PSBMT0dfREVCVUcpCiAgICAgICAgIHByX2luZm8oInBjaV93cml0ZTogJXggPSAleFxuIiwgKHVfaW50MzJfdCkgcCwgdik7CiAjZW5kaWYKICAgICAqcCA9IGNwdV90b19sZTMyICh2KTsKQEAgLTExOCw3ICsxMTgsNyBAQAogCiAgICAgaWYgKGRydnJfc3RhdGUgIT0gU0JFX0RSVlJfQVZBSUxBQkxFKQogICAgIHsKLSAgICAgICAgaWYgKGxvZ19sZXZlbCA+PSBMT0dfTU9OSVRPUikKKyAgICAgICAgaWYgKGN4dDFlMV9sb2dfbGV2ZWwgPj0gTE9HX01PTklUT1IpCiAgICAgICAgICAgICBwcl93YXJuaW5nKCIlczogZHJ2ciBub3QgYXZhaWxhYmxlICgleClcbiIsIF9fZnVuY19fLCBkcnZyX3N0YXRlKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jeHQxZTEvaHdwcm9iZS5jIGIvZHJpdmVycy9zdGFnaW5nL2N4dDFlMS9od3Byb2JlLmMKaW5kZXggODkyMDBlNy4uYzUxN2NjMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2N4dDFlMS9od3Byb2JlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2N4dDFlMS9od3Byb2JlLmMKQEAgLTM3LDcgKzM3LDcgQEAKICNkZWZpbmUgU1RBVElDICBzdGF0aWMKICNlbmRpZgogCi1leHRlcm4gaW50ICBsb2dfbGV2ZWw7CitleHRlcm4gaW50ICBjeHQxZTFfbG9nX2xldmVsOwogZXh0ZXJuIGludCAgZXJyb3JfZmxhZzsKIGV4dGVybiBpbnQgIGRydnJfc3RhdGU7CiAKQEAgLTE0Myw3ICsxNDMsNyBAQAogICAgIGlmICgoaGktPnByb21mbXQgPSBwbWNfdmVyaWZ5X2Nrc3VtICgmaGktPm1mZ19pbmZvLmRhdGEpKSA9PSBQUk9NX0ZPUk1BVF9VbmspCiAgICAgewogICAgICAgICAvKiBiYWQgY3JjLCBkYXRhIGlzIHN1c3BlY3QgKi8KLSAgICAgICAgaWYgKGxvZ19sZXZlbCA+PSBMT0dfV0FSTikKKyAgICAgICAgaWYgKGN4dDFlMV9sb2dfbGV2ZWwgPj0gTE9HX1dBUk4pCiAgICAgICAgICAgICBwcl9pbmZvKCIlczogRUVQUk9NIGNrc3VtIGVycm9yXG4iLCBoaS0+ZGV2bmFtZSk7CiAgICAgICAgIGhpLT5tZmdfaW5mb19zdHMgPSBFRVBST01fQ1JDRVJSOwogICAgIH0gZWxzZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2N4dDFlMS9saW51eC5jIGIvZHJpdmVycy9zdGFnaW5nL2N4dDFlMS9saW51eC5jCmluZGV4IGM3OTMwMjguLjBmNzhmODkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jeHQxZTEvbGludXguYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY3h0MWUxL2xpbnV4LmMKQEAgLTEwOCw5ICsxMDgsOSBAQAogI2VuZGlmCiAKIGludCAgICAgICAgIGVycm9yX2ZsYWc7ICAgICAgICAgLyogbW9kdWxlIGxvYWQgZXJyb3IgcmVwb3J0aW5nICovCi1pbnQgICAgICAgICBsb2dfbGV2ZWwgPSBMT0dfRVJST1I7CitpbnQgICAgICAgICBjeHQxZTFfbG9nX2xldmVsID0gTE9HX0VSUk9SOwogaW50ICAgICAgICAgbG9nX2xldmVsX2RlZmF1bHQgPSBMT0dfRVJST1I7Ci1tb2R1bGVfcGFyYW0obG9nX2xldmVsLCBpbnQsIDA0NDQpOworbW9kdWxlX3BhcmFtKGN4dDFlMV9sb2dfbGV2ZWwsIGludCwgMDQ0NCk7CiAKIGludCAgICAgICAgIGN4dDFlMV9tYXhfbXJ1ID0gTVVTWUNDX01SVTsKIGludCAgICAgICAgIG1heF9tcnVfZGVmYXVsdCA9IE1VU1lDQ19NUlU7CkBAIC00OTcsNyArNDk3LDcgQEAKICAgICBydG5sX2xvY2sgKCk7ICAgICAgICAgICAgICAgICAgIC8qIG5lZWRlZCBkdWUgdG8gSW9jdGwgY2FsbGluZyBzZXF1ZW5jZSAqLwogICAgIGlmIChyZXQpCiAgICAgewotICAgICAgICBpZiAobG9nX2xldmVsID49IExPR19XQVJOKQorICAgICAgICBpZiAoY3h0MWUxX2xvZ19sZXZlbCA+PSBMT0dfV0FSTikKICAgICAgICAgICAgIHByX2luZm8oIiVzOiBjcmVhdGVfY2hhblslZF0gcmVnaXN0cmF0aW9uIGVycm9yID0gJWQuXG4iLAogICAgICAgICAgICAgICAgICAgICBjaS0+ZGV2bmFtZSwgY3AtPmNoYW5udW0sIHJldCk7CiAgICAgICAgIGZyZWVfbmV0ZGV2IChkZXYpOyAgICAgICAgICAvKiBjbGVhbnVwICovCkBAIC03MjIsMTEgKzcyMiwxMSBAQAogU1RBVElDICAgICAgc3RhdHVzX3QKIGRvX3NldF9sb2dsZXZlbCAoc3RydWN0IG5ldF9kZXZpY2UgKiBuZGV2LCB2b2lkICpkYXRhKQogewotICAgIHVuc2lnbmVkIGludCBsb2dfbGV2ZWw7CisgICAgdW5zaWduZWQgaW50IGN4dDFlMV9sb2dfbGV2ZWw7CiAKLSAgICBpZiAoY29weV9mcm9tX3VzZXIgKCZsb2dfbGV2ZWwsIGRhdGEsIHNpemVvZiAoaW50KSkpCisgICAgaWYgKGNvcHlfZnJvbV91c2VyICgmY3h0MWUxX2xvZ19sZXZlbCwgZGF0YSwgc2l6ZW9mIChpbnQpKSkKICAgICAgICAgcmV0dXJuIC1FRkFVTFQ7Ci0gICAgc2JlY29tX3NldF9sb2dsZXZlbCAobG9nX2xldmVsKTsKKyAgICBzYmVjb21fc2V0X2xvZ2xldmVsIChjeHQxZTFfbG9nX2xldmVsKTsKICAgICByZXR1cm4gMDsKIH0KIApAQCAtMTExNSw5ICsxMTE1LDkgQEAKICAgICAgICAgcmV0dXJuIC1ydG47ICAgICAgICAgICAgICAgIC8qIGluc3RhbGxhdGlvbiBmYWlsdXJlIC0gc2VlIHN5c3RlbSBsb2cgKi8KIAogICAgIC8qIGhvdXNla2VlcGluZyBub3RpZmljYXRpb25zICovCi0gICAgaWYgKGxvZ19sZXZlbCAhPSBsb2dfbGV2ZWxfZGVmYXVsdCkKLSAgICAgICAgcHJfaW5mbygiTk9URTogZHJpdmVyIHBhcmFtZXRlciA8bG9nX2xldmVsPiBjaGFuZ2VkIGZyb20gZGVmYXVsdCAlZCB0byAlZC5cbiIsCi0gICAgICAgICAgICAgICAgbG9nX2xldmVsX2RlZmF1bHQsIGxvZ19sZXZlbCk7CisgICAgaWYgKGN4dDFlMV9sb2dfbGV2ZWwgIT0gbG9nX2xldmVsX2RlZmF1bHQpCisgICAgICAgIHByX2luZm8oIk5PVEU6IGRyaXZlciBwYXJhbWV0ZXIgPGN4dDFlMV9sb2dfbGV2ZWw+IGNoYW5nZWQgZnJvbSBkZWZhdWx0ICVkIHRvICVkLlxuIiwKKyAgICAgICAgICAgICAgICBsb2dfbGV2ZWxfZGVmYXVsdCwgY3h0MWUxX2xvZ19sZXZlbCk7CiAgICAgICAgaWYgKGN4dDFlMV9tYXhfbXJ1ICE9IG1heF9tcnVfZGVmYXVsdCkKICAgICAgICAgICAgICAgIHByX2luZm8oIk5PVEU6IGRyaXZlciBwYXJhbWV0ZXIgPGN4dDFlMV9tYXhfbXJ1PiBjaGFuZ2VkIGZyb20gZGVmYXVsdCAlZCB0byAlZC5cbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X21ydV9kZWZhdWx0LCBjeHQxZTFfbWF4X21ydSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY3h0MWUxL211c3ljYy5jIGIvZHJpdmVycy9zdGFnaW5nL2N4dDFlMS9tdXN5Y2MuYwppbmRleCBmYzE1NjEwLi5mMjc0Yzc3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY3h0MWUxL211c3ljYy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jeHQxZTEvbXVzeWNjLmMKQEAgLTk3LDcgKzk3LDcgQEAKIC8qIGdsb2JhbCBkcml2ZXIgdmFyaWFibGVzICovCiBleHRlcm4gY2lfdCAqYzRfbGlzdDsKIGV4dGVybiBpbnQgIGRydnJfc3RhdGU7Ci1leHRlcm4gaW50ICBsb2dfbGV2ZWw7CitleHRlcm4gaW50ICBjeHQxZTFfbG9nX2xldmVsOwogCiBleHRlcm4gaW50ICBjeHQxZTFfbWF4X21ydTsKIGV4dGVybiBpbnQgIGN4dDFlMV9tYXhfbXR1OwpAQCAtNjI3LDcgKzYyNyw3IEBACiAKICAgICBpZiAoKHIgIT0gcmVxKSAmJiAocmVxICE9IFNSX0NISVBfUkVTRVQpICYmICgrK3JjbnQgPD0gTVVTWUNDX1NSX1JFVFJZX0NOVCkpCiAgICAgewotICAgICAgICBpZiAobG9nX2xldmVsID49IExPR19NT05JVE9SKQorICAgICAgICBpZiAoY3h0MWUxX2xvZ19sZXZlbCA+PSBMT0dfTU9OSVRPUikKICAgICAgICAgICAgIHByX2luZm8oIiVzOiAlZCAtIHJlaXNzdWUgc3J2IHJlcS9sYXN0ICV4LyV4IChoZHcgcmVhZHMgJXgpLCBDaGFuICVkLlxuIiwKICAgICAgICAgICAgICAgICAgICAgcGktPnVwLT5kZXZuYW1lLCByY250LCByZXEsIHBpLT5zcl9sYXN0LCByLAogICAgICAgICAgICAgICAgICAgICAocGktPnBvcnRudW0gKiBNVVNZQ0NfTkNIQU5TKSArIChyZXEgJiAweDFmKSk7CkBAIC05NTEsNyArOTUxLDcgQEAKICAgICBjaCA9IHBpLT5jaGFuW2djaGFuXTsKICAgICBpZiAoY2ggPT0gMCB8fCBjaC0+c3RhdGUgIT0gVVApCiAgICAgewotICAgICAgICBpZiAobG9nX2xldmVsID49IExPR19FUlJPUikKKyAgICAgICAgaWYgKGN4dDFlMV9sb2dfbGV2ZWwgPj0gTE9HX0VSUk9SKQogICAgICAgICAgICAgcHJfaW5mbygiJXM6IGludHI6IHhtaXQgRU9NIG9uIHVuaW5pdGlhbGl6ZWQgY2hhbm5lbCAlZFxuIiwKICAgICAgICAgICAgICAgICAgICAgcGktPnVwLT5kZXZuYW1lLCBnY2hhbik7CiAgICAgfQpAQCAtMTAwMiw3ICsxMDAyLDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChzdGF0dXMgJiBNVVNZQ0NfVFhfT1dORUQpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKGxvZ19sZXZlbCA+PSBMT0dfTU9OSVRPUikKKyAgICAgICAgICAgICAgICBpZiAoY3h0MWUxX2xvZ19sZXZlbCA+PSBMT0dfTU9OSVRPUikKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIHByX2luZm8oIiVzOiBQb3J0ICVkIENoYW4gJTJkIC0gdW5leHBlY3RlZCBUWCBtc2cgb3duZXJzaGlwIGludHIgKG1kICVwIHN0cyAleClcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGktPnVwLT5kZXZuYW1lLCBwaS0+cG9ydG51bSwgY2gtPmNoYW5udW0sCkBAIC0xMDE2LDcgKzEwMTYsNyBAQAogICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgLyogTm90IG91ciBtZGVzYywgZG9uZSAqLwogICAgICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKGxvZ19sZXZlbCA+PSBMT0dfTU9OSVRPUikKKyAgICAgICAgICAgICAgICBpZiAoY3h0MWUxX2xvZ19sZXZlbCA+PSBMT0dfTU9OSVRPUikKICAgICAgICAgICAgICAgICAgICAgcHJfaW5mbygiJXM6IFBvcnQgJWQgQ2hhbiAlMmQgLSByZWNvdmVyZWQgVFggbXNnIG93bmVyc2hpcCBbJWRdIChtZCAlcCBzdHMgJXgpXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpLT51cC0+ZGV2bmFtZSwgcGktPnBvcnRudW0sIGNoLT5jaGFubnVtLCByZWFkQ291bnQsIG1kLCBzdGF0dXMpOwogICAgICAgICAgICAgfQpAQCAtMTA1NCw3ICsxMDU0LDcgQEAKICAgICAgICAgfQogICAgICAgICBtZC0+c3RhdHVzID0gMDsKICNpZmRlZiBSTERfVFhGVUxMX0RFQlVHCi0gICAgICAgIGlmIChsb2dfbGV2ZWwgPj0gTE9HX01PTklUT1IyKQorICAgICAgICBpZiAoY3h0MWUxX2xvZ19sZXZlbCA+PSBMT0dfTU9OSVRPUjIpCiAgICAgICAgICAgICBwcl9pbmZvKCJ+fiB0eF9lb206IHR4X2Z1bGwgJXggIHR4ZF9mcmVlICVkIC0+ICVkXG4iLAogICAgICAgICAgICAgICAgICAgICBjaC0+dHhfZnVsbCwgY2gtPnR4ZF9mcmVlLCBjaC0+dHhkX2ZyZWUgKyAxKTsKICNlbmRpZgpAQCAtMTA2Myw3ICsxMDYzLDcgQEAKIAogICAgICAgICBpZiAoKGNoLT5wLmNoYW5fbW9kZSAhPSBDRkdfQ0hfUFJPVE9fVFJBTlMpICYmIChzdGF0dXMgJiBFT0JJUlFfRU5BQkxFKSkKICAgICAgICAgewotICAgICAgICAgICAgaWYgKGxvZ19sZXZlbCA+PSBMT0dfTU9OSVRPUikKKyAgICAgICAgICAgIGlmIChjeHQxZTFfbG9nX2xldmVsID49IExPR19NT05JVE9SKQogICAgICAgICAgICAgICAgIHByX2luZm8oIiVzOiBNb2RlICgleCkgaW5jb3JyZWN0IEVPQiBzdGF0dXMgKCV4KVxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgIHBpLT51cC0+ZGV2bmFtZSwgY2gtPnAuY2hhbl9tb2RlLCBzdGF0dXMpOwogICAgICAgICAgICAgaWYgKChzdGF0dXMgJiBFT01JUlFfRU5BQkxFKSA9PSAwKQpAQCAtMTA5NCw3ICsxMDk0LDcgQEAKICAgICAgICAgewogCiAjaWZkZWYgUkxEX1RYRlVMTF9ERUJVRwotICAgICAgICAgICAgaWYgKGxvZ19sZXZlbCA+PSBMT0dfTU9OSVRPUjIpCisgICAgICAgICAgICBpZiAoY3h0MWUxX2xvZ19sZXZlbCA+PSBMT0dfTU9OSVRPUjIpCiAgICAgICAgICAgICAgICAgcHJfaW5mbygidHhfZW9tWyVkXTogZW5hYmxlIHhtaXQgdHhfZnVsbCBubyBtb3JlLCB0eGRfZnJlZSAlZCB0eGRfbnVtLzIgJWRcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICBjaC0+Y2hhbm51bSwKICAgICAgICAgICAgICAgICAgICAgICAgIGNoLT50eGRfZnJlZSwgY2gtPnR4ZF9udW0gLyAyKTsKQEAgLTExMDgsNyArMTEwOCw3IEBACiAjaWZkZWYgUkxEX1RYRlVMTF9ERUJVRwogICAgIGVsc2UgaWYgKGNoLT50eF9mdWxsKQogICAgIHsKLSAgICAgICAgaWYgKGxvZ19sZXZlbCA+PSBMT0dfTU9OSVRPUjIpCisgICAgICAgIGlmIChjeHQxZTFfbG9nX2xldmVsID49IExPR19NT05JVE9SMikKICAgICAgICAgICAgIHByX2luZm8oInR4X2VvbVslZF06IGJ5cGFzcyBUWCBlbmFibGUgdGhvdWdoIHJvb20gYXZhaWxhYmxlPyAodHhkX2ZyZWUgJWQgdHhkX251bS8yICVkKVxuIiwKICAgICAgICAgICAgICAgICAgICAgY2gtPmNoYW5udW0sCiAgICAgICAgICAgICAgICAgICAgIGNoLT50eGRfZnJlZSwgY2gtPnR4ZF9udW0gLyAyKTsKQEAgLTExMzgsNyArMTEzOCw3IEBACiAgICAgY2ggPSBwaS0+Y2hhbltnY2hhbl07CiAgICAgaWYgKGNoID09IDAgfHwgY2gtPnN0YXRlICE9IFVQKQogICAgIHsKLSAgICAgICAgaWYgKGxvZ19sZXZlbCA+IExPR19FUlJPUikKKyAgICAgICAgaWYgKGN4dDFlMV9sb2dfbGV2ZWwgPiBMT0dfRVJST1IpCiAgICAgICAgICAgICBwcl9pbmZvKCIlczogaW50cjogcmVjZWl2ZSBFT00gb24gdW5pbml0aWFsaXplZCBjaGFubmVsICVkXG4iLAogICAgICAgICAgICAgICAgICAgICBwaS0+dXAtPmRldm5hbWUsIGdjaGFuKTsKICAgICAgICAgcmV0dXJuOwpAQCAtMTI2OSw3ICsxMjY5LDcgQEAKIAogICAgIGlmIChuZXh0SW50ICE9IElOVFJQVFNfTkVYVElOVCAoY2ktPmludGxvZy50aGlzX3N0YXR1c19uZXcpKQogICAgIHsKLSAgICAgICAgaWYgKGxvZ19sZXZlbCA+PSBMT0dfTU9OSVRPUikKKyAgICAgICAgaWYgKGN4dDFlMV9sb2dfbGV2ZWwgPj0gTE9HX01PTklUT1IpCiAgICAgICAgIHsKICAgICAgICAgICAgIHByX2luZm8oIiVzOiBub3RlIC0gdXBkYXRlZCBJU0QgZnJvbSAlMDh4IHRvICUwOHhcbiIsCiAgICAgICAgICAgICAgICAgICAgIGNpLT5kZXZuYW1lLCBzdGF0dXMsCkBAIC0xMzM3LDExICsxMzM3LDExIEBACiAgICAgY2ktPmludGxvZy5sYXN0X3N0YXR1c19uZXcgPSBjaS0+aW50bG9nLnRoaXNfc3RhdHVzX25ldzsKICAgICBjaS0+aW50bG9nLnRoaXNfc3RhdHVzX25ldyA9IGN1cnJJbnQ7CiAKLSAgICBpZiAoKGxvZ19sZXZlbCA+PSBMT0dfV0FSTikgJiYgKHN0YXR1cyAmIElOVFJQVFNfSU5URlVMTF9NKSkKKyAgICBpZiAoKGN4dDFlMV9sb2dfbGV2ZWwgPj0gTE9HX1dBUk4pICYmIChzdGF0dXMgJiBJTlRSUFRTX0lOVEZVTExfTSkpCiAgICAgewogICAgICAgICBwcl9pbmZvKCIlczogSW50ZXJydXB0IHF1ZXVlIGZ1bGwgY29uZGl0aW9uIG9jY3VycmVkXG4iLCBjaS0+ZGV2bmFtZSk7CiAgICAgfQotICAgIGlmIChsb2dfbGV2ZWwgPj0gTE9HX0RFQlVHKQorICAgIGlmIChjeHQxZTFfbG9nX2xldmVsID49IExPR19ERUJVRykKICAgICAgICAgcHJfaW5mbygiJXM6IGludGVycnVwdHMgcGVuZGluZywgaXNkIEAgMHglcDogJXggY3VyciAlZCBjbnQgJWQgTkVYVCAlZFxuIiwKICAgICAgICAgICAgICAgICBjaS0+ZGV2bmFtZSwgJmNpLT5yZWctPmlzZCwKICAgICAgICAgc3RhdHVzLCBuZXh0SW50LCBpbnRDbnQsIChpbnRDbnQgKyBuZXh0SW50KSAmIChJTlRfUVVFVUVfU0laRSAtIDEpKTsKQEAgLTE0NDgsNyArMTQ0OCw3IEBACiAgICAgICAgIGlmICgoY3VyckludCA9PSBiYWRJbnQpIHx8IChjdXJySW50ID09IGJhZEludDIpKSAgICAgICAgLyogY2F0Y2ggZmFpbHVyZSBvZiBCdWcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBGaXggY2hlY2tpbmcgKi8KICAgICAgICAgewotICAgICAgICAgICAgaWYgKGxvZ19sZXZlbCA+PSBMT0dfV0FSTikKKyAgICAgICAgICAgIGlmIChjeHQxZTFfbG9nX2xldmVsID49IExPR19XQVJOKQogICAgICAgICAgICAgICAgIHByX2luZm8oIiVzOiBJbGxlZ2FsIEludGVycnVwdCBEZXRlY3RlZCBAIDB4JXAsIG1vZCAlZC4pXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgY2ktPmRldm5hbWUsICZjaS0+aXFkX3BbaGVhZHhdLCBoZWFkeCk7CiAKQEAgLTE0ODMsNyArMTQ4Myw3IEBACiAgICAgICAgIGNpLT5pcWRfcFtoZWFkeF0gPSBfX2NvbnN0YW50X2NwdV90b19sZTMyIChJTlRfRU1QVFlfRU5UUlkpOwogICAgICAgICBGTFVTSF9NRU1fV1JJVEUgKCk7CiAKLSAgICAgICAgaWYgKGxvZ19sZXZlbCA+PSBMT0dfREVCVUcpCisgICAgICAgIGlmIChjeHQxZTFfbG9nX2xldmVsID49IExPR19ERUJVRykKICAgICAgICAgewogICAgICAgICAgICAgaWYgKGVyciAhPSAwKQogICAgICAgICAgICAgICAgIHByX2luZm8oIiAlMDh4IC0+IGVycjogJTJkLCIsIGN1cnJJbnQsIGVycik7CkBAIC0xNDk3LDcgKzE0OTcsNyBAQAogICAgICAgICBzd2l0Y2ggKGV2ZW50KQogICAgICAgICB7CiAgICAgICAgIGNhc2UgRVZFX1NBQ0s6ICAgICAgICAgICAgICAvKiBTZXJ2aWNlIFJlcXVlc3QgQWNrbm93bGVkZ2UgKi8KLSAgICAgICAgICAgIGlmIChsb2dfbGV2ZWwgPj0gTE9HX0RFQlVHKQorICAgICAgICAgICAgaWYgKGN4dDFlMV9sb2dfbGV2ZWwgPj0gTE9HX0RFQlVHKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIHZvbGF0aWxlIHVfaW50MzJfdCByOwogCkBAIC0xNTM0LDcgKzE1MzQsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBpZiAobG9nX2xldmVsID49IExPR19XQVJOKQorICAgICAgICAgICAgaWYgKGN4dDFlMV9sb2dfbGV2ZWwgPj0gTE9HX1dBUk4pCiAgICAgICAgICAgICAgICAgcHJfaW5mbygiJXM6IHVuZXhwZWN0ZWQgaW50ZXJydXB0IGV2ZW50OiAlZCwgaXFkWyVkXTogJTA4eCwgcG9ydDogJWRcbiIsIGNpLT5kZXZuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQsIGhlYWR4LCBjdXJySW50LCBncm91cCk7CiAgICAgICAgICAgICBicmVhazsKQEAgLTE1NzMsOSArMTU3Myw5IEBACiAKICAgICAgICAgICAgICAgICB7CiAjaWZkZWYgUkxEX1RSQU5TX0RFQlVHCi0gICAgICAgICAgICAgICAgICAgIGlmICgxIHx8IGxvZ19sZXZlbCA+PSBMT0dfTU9OSVRPUikKKyAgICAgICAgICAgICAgICAgICAgaWYgKDEgfHwgY3h0MWUxX2xvZ19sZXZlbCA+PSBMT0dfTU9OSVRPUikKICNlbHNlCi0gICAgICAgICAgICAgICAgICAgIGlmIChsb2dfbGV2ZWwgPj0gTE9HX01PTklUT1IpCisgICAgICAgICAgICAgICAgICAgIGlmIChjeHQxZTFfbG9nX2xldmVsID49IExPR19NT05JVE9SKQogI2VuZGlmCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHByX2luZm8oIiVzOiBUWCBidWZmZXIgdW5kZXJmbG93IFtPTlJdIG9uIGNoYW5uZWwgJWQsIG1vZGUgJXggUVN0b3BwZWQgJXggZnJlZSAlZFxuIiwKQEAgLTE2MDUsNyArMTYwNSw3IEBACiAgICAgICAgICAgICAgICAgY2gtPnMucnhfb3Zlcl9lcnJvcnMrKzsKICAgICAgICAgICAgICAgICBjaC0+Y2hfc3RhcnRfcnggPSBDSF9TVEFSVF9SWF9PTlI7CiAKLSAgICAgICAgICAgICAgICBpZiAobG9nX2xldmVsID49IExPR19XQVJOKQorICAgICAgICAgICAgICAgIGlmIChjeHQxZTFfbG9nX2xldmVsID49IExPR19XQVJOKQogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgcHJfaW5mbygiJXM6IFJYIGJ1ZmZlciBvdmVyZmxvdyBbT05SXSBvbiBjaGFubmVsICVkLCBtb2RlICV4XG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNpLT5kZXZuYW1lLCBjaC0+Y2hhbm51bSwgY2gtPnAuY2hhbl9tb2RlKTsKQEAgLTE2MjMsNyArMTYyMyw3IEBACiAgICAgICAgICAgICAgICAgICogUGVyIE1VU1lDQyBtYW51YWwsIFNlY3Rpb24gIDYuNC44LjMgW1RyYW5zbWl0IEVycm9yc10sCiAgICAgICAgICAgICAgICAgICogdGhpcyBCVUZGIGVycm9yIHJlcXVpcmVzIFRyYW5zbWl0IGNoYW5uZWwgcmVhY3RpdmF0aW9uLgogICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIGlmIChsb2dfbGV2ZWwgPj0gTE9HX01PTklUT1IpCisgICAgICAgICAgICAgICAgaWYgKGN4dDFlMV9sb2dfbGV2ZWwgPj0gTE9HX01PTklUT1IpCiAgICAgICAgICAgICAgICAgICAgIHByX2luZm8oIiVzOiBUWCBidWZmZXIgdW5kZXJydW4gW0JVRkZdIG9uIGNoYW5uZWwgJWQsIG1vZGUgJXhcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2ktPmRldm5hbWUsIGNoLT5jaGFubnVtLCBjaC0+cC5jaGFuX21vZGUpOwogICAgICAgICAgICAgfSBlbHNlICAgICAgICAgICAgICAgICAgLyogUlggYnVmZmVyIG92ZXJydW4gKi8KQEAgLTE2MzYsNyArMTYzNiw3IEBACiAgICAgICAgICAgICAgICAgICogc3BhY2UgZm9yIHRoaXMgY2hhbm5lbC4gIFJlY2VpdmUgY2hhbm5lbCByZWFjdGl2YXRpb24gaXMKICAgICAgICAgICAgICAgICAgKiBub3QgcmVxdWlyZWQsIGJ1dCBkYXRhIGhhcyBiZWVuIGxvc3QuCiAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgaWYgKGxvZ19sZXZlbCA+PSBMT0dfV0FSTikKKyAgICAgICAgICAgICAgICBpZiAoY3h0MWUxX2xvZ19sZXZlbCA+PSBMT0dfV0FSTikKICAgICAgICAgICAgICAgICAgICAgcHJfaW5mbygiJXM6IFJYIGJ1ZmZlciBvdmVycnVuIFtCVUZGXSBvbiBjaGFubmVsICVkLCBtb2RlICV4XG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNpLT5kZXZuYW1lLCBjaC0+Y2hhbm51bSwgY2gtPnAuY2hhbl9tb2RlKTsKICAgICAgICAgICAgICAgICAvKgpAQCAtMTY1OCw3ICsxNjU4LDcgQEAKICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN3aXRjaCBvbiBlcnIgKi8KIAogICAgICAgICAvKiBDaGVjayBmb3IgaW50ZXJydXB0IGxvc3QgY29uZGl0aW9uICovCi0gICAgICAgIGlmICgoY3VyckludCAmIElOVFJQVF9JTE9TVF9NKSAmJiAobG9nX2xldmVsID49IExPR19FUlJPUikpCisgICAgICAgIGlmICgoY3VyckludCAmIElOVFJQVF9JTE9TVF9NKSAmJiAoY3h0MWUxX2xvZ19sZXZlbCA+PSBMT0dfRVJST1IpKQogICAgICAgICB7CiAgICAgICAgICAgICBwcl9pbmZvKCIlczogSW50ZXJydXB0IHF1ZXVlIG92ZXJmbG93IC0gSUxPU1QgYXNzZXJ0ZWRcbiIsCiAgICAgICAgICAgICAgICAgICAgIGNpLT5kZXZuYW1lKTsKQEAgLTE2NjcsNyArMTY2Nyw3IEBACiAgICAgICAgIEZMVVNIX01FTV9XUklURSAoKTsKICAgICAgICAgRkxVU0hfTUVNX1JFQUQgKCk7CiAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB3aGlsZSAqLwotICAgIGlmICgobG9nX2xldmVsID49IExPR19NT05JVE9SMikgJiYgKGNpLT5pcXBfaGVhZHggIT0gY2ktPmlxcF90YWlseCkpCisgICAgaWYgKChjeHQxZTFfbG9nX2xldmVsID49IExPR19NT05JVE9SMikgJiYgKGNpLT5pcXBfaGVhZHggIT0gY2ktPmlxcF90YWlseCkpCiAgICAgewogICAgICAgICBpbnQgICAgICAgICBiaDsKIApAQCAtMTgyMSw5ICsxODIxLDkgQEAKICAgICAgICAgcmV0dXJuIEVST0ZTOyAgICAgICAgICAgICAgIC8qIGhvdyBlbHNlIHRvIGZsYWcgdW53cml0YWJsZSBzdGF0ZSA/ICovCiAKICNpZmRlZiBSTERfVFJBTlNfREVCVUd4Ci0gICAgaWYgKDEgfHwgbG9nX2xldmVsID49IExPR19NT05JVE9SMikKKyAgICBpZiAoMSB8fCBjeHQxZTFfbG9nX2xldmVsID49IExPR19NT05JVE9SMikKICNlbHNlCi0gICAgaWYgKGxvZ19sZXZlbCA+PSBMT0dfTU9OSVRPUjIpCisgICAgaWYgKGN4dDFlMV9sb2dfbGV2ZWwgPj0gTE9HX01PTklUT1IyKQogI2VuZGlmCiAgICAgewogICAgICAgICBwcl9pbmZvKCIrKyBzdGFydF94bXRbJWRdOiBzdGF0ZSAleCBzdGFydCAleCBmdWxsICVkIGZyZWUgJWQgcmVxdWlyZWQgJWQgc3RvcHBlZCAleFxuIiwKQEAgLTE4NDYsNyArMTg0Niw3IEBACiAKICAgICBpZiAodHhkX25lZWRfY250ID09IDApCiAgICAgewotICAgICAgICBpZiAobG9nX2xldmVsID49IExPR19NT05JVE9SMikKKyAgICAgICAgaWYgKGN4dDFlMV9sb2dfbGV2ZWwgPj0gTE9HX01PTklUT1IyKQogICAgICAgICAgICAgcHJfaW5mbygiJXMgY2hhbm5lbCAlZDogbm8gVFggZGF0YSBpbiBVc2VyIGJ1ZmZlclxuIiwgY2ktPmRldm5hbWUsIGNoYW5udW0pOwogICAgICAgICBPU19tZW1fdG9rZW5fZnJlZSAobWVtX3Rva2VuKTsKICAgICAgICAgcmV0dXJuIDA7ICAgICAgICAgICAgICAgICAgIC8qIG5vIGRhdGEgdG8gc2VuZCAqLwpAQCAtMTg1Nyw3ICsxODU3LDcgQEAKICAgICBpZiAodHhkX25lZWRfY250ID4gY2gtPnR4ZF9udW0pIC8qIG5ldmVyIGVub3VnaCBkZXNjcmlwdG9ycyBmb3IgdGhpcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogbGFyZ2UgYSBidWZmZXIgKi8KICAgICB7Ci0gICAgICAgIGlmIChsb2dfbGV2ZWwgPj0gTE9HX0RFQlVHKQorICAgICAgICBpZiAoY3h0MWUxX2xvZ19sZXZlbCA+PSBMT0dfREVCVUcpCiAgICAgICAgIHsKICAgICAgICAgICAgIHByX2luZm8oInN0YXJ0X3htaXQ6IGRpc2NhcmRpbmcgYnVmZmVyLCBpbnN1ZmZpY2llbnQgZGVzY3JpcHRvciBjbnQgJWQsIG5lZWQgJWQuXG4iLAogICAgICAgICAgICAgICAgICAgICBjaC0+dHhkX251bSwgdHhkX25lZWRfY250ICsgMSk7CkBAIC0xODc0LDcgKzE4NzQsNyBAQAogICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAgICAgaWYgKHR4ZF9uZWVkX2NudCA+IGNoLT50eGRfZnJlZSkKICAgICB7Ci0gICAgICAgIGlmIChsb2dfbGV2ZWwgPj0gTE9HX01PTklUT1IyKQorICAgICAgICBpZiAoY3h0MWUxX2xvZ19sZXZlbCA+PSBMT0dfTU9OSVRPUjIpCiAgICAgICAgIHsKICAgICAgICAgICAgIHByX2luZm8oInN0YXJ0X3htaXRbJWRdOiBFQlVTWSAtIG5lZWQgbW9yZSBkZXNjcmlwdG9ycywgaGF2ZSAlZCBvZiAlZCBuZWVkICVkXG4iLAogICAgICAgICAgICAgICAgICAgICBjaGFubnVtLCBjaC0+dHhkX2ZyZWUsIGNoLT50eGRfbnVtLCB0eGRfbmVlZF9jbnQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2N4dDFlMS9wbWNjNF9kcnYuYyBiL2RyaXZlcnMvc3RhZ2luZy9jeHQxZTEvcG1jYzRfZHJ2LmMKaW5kZXggNWM4YTNlYi4uMzQxZTdhOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2N4dDFlMS9wbWNjNF9kcnYuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY3h0MWUxL3BtY2M0X2Rydi5jCkBAIC0xMzUsNyArMTM1LDcgQEAKIHZvaWQgICAgICAgIG11c3ljY191cGRhdGVfdGltZXNsb3RzIChtcGlfdCAqKTsKIAogZXh0ZXJuIHZvaWQgbXVzeWNjX3VwZGF0ZV90eF90aHAgKG1jaF90ICopOwotZXh0ZXJuIGludCAgbG9nX2xldmVsOworZXh0ZXJuIGludCAgY3h0MWUxX2xvZ19sZXZlbDsKIGV4dGVybiBpbnQgIGN4dDFlMV9tYXhfbXJ1OwogZXh0ZXJuIGludCAgY3h0MWUxX21heF9tdHU7CiBleHRlcm4gaW50ICBtYXhfcnhkZXNjX3VzZWQsIG1heF9yeGRlc2NfZGVmYXVsdDsKQEAgLTE2OCwxMiArMTY4LDEyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGZvciBjYXJkIDAgb25seSAqLwogICAgIH0gZWxzZQogICAgIHsKLSAgICAgICAgaWYgKGxvZ19sZXZlbCAhPSBkKQorICAgICAgICBpZiAoY3h0MWUxX2xvZ19sZXZlbCAhPSBkKQogICAgICAgICB7Ci0gICAgICAgICAgICBwcl9pbmZvKCJsb2cgbGV2ZWwgY2hhbmdlZCBmcm9tICVkIHRvICVkXG4iLCBsb2dfbGV2ZWwsIGQpOwotICAgICAgICAgICAgbG9nX2xldmVsID0gZDsgICAgICAgICAgLyogc2V0IG5ldyAqLworICAgICAgICAgICAgcHJfaW5mbygibG9nIGxldmVsIGNoYW5nZWQgZnJvbSAlZCB0byAlZFxuIiwgY3h0MWUxX2xvZ19sZXZlbCwgZCk7CisgICAgICAgICAgICBjeHQxZTFfbG9nX2xldmVsID0gZDsgICAgICAgICAgLyogc2V0IG5ldyAqLwogICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgIHByX2luZm8oImxvZyBsZXZlbCBpcyAlZFxuIiwgbG9nX2xldmVsKTsKKyAgICAgICAgICAgIHByX2luZm8oImxvZyBsZXZlbCBpcyAlZFxuIiwgY3h0MWUxX2xvZ19sZXZlbCk7CiAgICAgfQogfQogCkBAIC01MTMsNyArNTEzLDcgQEAKICAgICAgICAgICAgIGlmICgodmFsdWUgPT0gMHgxYykgfHwgKHZhbHVlID09IDB4MTkpIHx8ICh2YWx1ZSA9PSAweDEyKSkKICAgICAgICAgICAgICAgICBjNF9sb29wX3BvcnQgKGNpLCBwb3J0bnVtLCBDT01FVF9NRElBR19MQk9GRik7ICAvKiB0YWtlIHBvcnQgb3V0IG9mIGFueQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGxvb3BiayBtb2RlICovCi0gICAgICAgICAgICBpZiAobG9nX2xldmVsID49IExPR19ERUJVRykKKyAgICAgICAgICAgIGlmIChjeHQxZTFfbG9nX2xldmVsID49IExPR19ERUJVRykKICAgICAgICAgICAgICAgICBpZiAodmFsdWUgIT0gMHgzZikKICAgICAgICAgICAgICAgICAgICAgcHJfd2FybmluZygiJXM6IEJPQyB2YWx1ZSA9ICV4IG9uIFBvcnQgJWRcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2ktPmRldm5hbWUsIHZhbHVlLCBwb3J0bnVtKTsKQEAgLTUzMyw3ICs1MzMsNyBAQAogewogICAgIGlmIChkcnZyX3N0YXRlICE9IFNCRV9EUlZSX0FWQUlMQUJMRSkKICAgICB7Ci0gICAgICAgIGlmIChsb2dfbGV2ZWwgPj0gTE9HX01PTklUT1IpCisgICAgICAgIGlmIChjeHQxZTFfbG9nX2xldmVsID49IExPR19NT05JVE9SKQogICAgICAgICAgICAgcHJfaW5mbygiZHJ2ciBub3QgYXZhaWxhYmxlICgleClcbiIsIGRydnJfc3RhdGUpOwogICAgICAgICByZXR1cm47CiAgICAgfQpAQCAtNzk0LDE5ICs3OTQsMTkgQEAKICAgICAgICAgfQogCiAgICAgICAgIHBjaV93cml0ZV8zMiAoKHVfaW50MzJfdCAqKSAmY29tZXQtPm1kaWFnLCBjbWQpOwotICAgICAgICBpZiAobG9nX2xldmVsID49IExPR19XQVJOKQorICAgICAgICBpZiAoY3h0MWUxX2xvZ19sZXZlbCA+PSBMT0dfV0FSTikKICAgICAgICAgICAgIHByX2luZm8oIiVzOiBsb29wYmFjayBtb2RlIGNoYW5nZWQgdG8gJTJ4IGZyb20gJTJ4IG9uIFBvcnQgJWRcbiIsCiAgICAgICAgICAgICAgICAgICAgIGNpLT5kZXZuYW1lLCBjbWQsIGxvb3BWYWx1ZSwgcG9ydG51bSk7CiAgICAgICAgIGxvb3BWYWx1ZSA9IHBjaV9yZWFkXzMyICgodV9pbnQzMl90ICopICZjb21ldC0+bWRpYWcpICYgQ09NRVRfTURJQUdfTEJNQVNLOwogICAgICAgICBpZiAobG9vcFZhbHVlICE9IGNtZCkKICAgICAgICAgewotICAgICAgICAgICAgaWYgKGxvZ19sZXZlbCA+PSBMT0dfRVJST1IpCisgICAgICAgICAgICBpZiAoY3h0MWUxX2xvZ19sZXZlbCA+PSBMT0dfRVJST1IpCiAgICAgICAgICAgICAgICAgcHJfaW5mbygiJXM6IHdyaXRlIHRvIGxvb3AgcmVnaXN0ZXIgZmFpbGVkLCB1bmtub3duIHN0YXRlIGZvciBQb3J0ICVkXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgY2ktPmRldm5hbWUsIHBvcnRudW0pOwogICAgICAgICB9CiAgICAgfSBlbHNlCiAgICAgewotICAgICAgICBpZiAobG9nX2xldmVsID49IExPR19XQVJOKQorICAgICAgICBpZiAoY3h0MWUxX2xvZ19sZXZlbCA+PSBMT0dfV0FSTikKICAgICAgICAgICAgIHByX2luZm8oIiVzOiBsb29wYmFjayBhbHJlYWR5IGluIHRoYXQgbW9kZSAoJTJ4KVxuIiwKICAgICAgICAgICAgICAgICAgICAgY2ktPmRldm5hbWUsIGxvb3BWYWx1ZSk7CiAgICAgfQpAQCAtOTk3LDcgKzk5Nyw3IEBACiAgICAgcGkgPSAmY2ktPnBvcnRbcG9ydG51bV07CiAgICAgcHAgPSAmY2ktPnBvcnRbcG9ydG51bV0ucDsKICAgICBlMW1vZGUgPSBJU19GUkFNRV9BTllfRTEgKHBwLT5wb3J0X21vZGUpOwotICAgIGlmIChsb2dfbGV2ZWwgPj0gTE9HX01PTklUT1IyKQorICAgIGlmIChjeHQxZTFfbG9nX2xldmVsID49IExPR19NT05JVE9SMikKICAgICB7CiAgICAgICAgIHByX2luZm8oIiVzOiBjNF9zZXRfcG9ydFslZF06ICBlbnRlcmVkLCBlMW1vZGUgPSAleCwgb3BlbmNoYW5zICVkLlxuIiwKICAgICAgICAgICAgICAgICBjaS0+ZGV2bmFtZSwKQEAgLTEyNzgsMTIgKzEyNzgsMTIgQEAKICAgICB9CiAgICAgaWYgKG1heCAhPSAqbGVuKQogICAgIHsKLSAgICAgICAgaWYgKGxvZ19sZXZlbCA+PSBMT0dfV0FSTikKKyAgICAgICAgaWYgKGN4dDFlMV9sb2dfbGV2ZWwgPj0gTE9HX1dBUk4pCiAgICAgICAgICAgICBwcl9pbmZvKCIlczogd2FudGVkIHRvIGFsbG9jYXRlICVkIGZpZm8gc3BhY2UsIGJ1dCBnb3Qgb25seSAlZFxuIiwKICAgICAgICAgICAgICAgICAgICAgcGktPnVwLT5kZXZuYW1lLCAqbGVuLCBtYXgpOwogICAgICAgICAqbGVuID0gbWF4OwogICAgIH0KLSAgICBpZiAobG9nX2xldmVsID49IExPR19ERUJVRykKKyAgICBpZiAoY3h0MWUxX2xvZ19sZXZlbCA+PSBMT0dfREVCVUcpCiAgICAgICAgIHByX2luZm8oIiVzOiBhbGxvY2F0ZWQgJWQgZmlmbyBhdCAlZCBmb3IgY2hhbm5lbCAlZC8lZFxuIiwKICAgICAgICAgICAgICAgICBwaS0+dXAtPmRldm5hbWUsIG1heCwgc3RhcnQsIGNoYW4sIHBpLT5wLnBvcnRudW0pOwogICAgIGZvciAoaSA9IG1heHN0YXJ0OyBpIDwgKG1heHN0YXJ0ICsgbWF4KTsgaSsrKQpAQCAtMTI5Niw3ICsxMjk2LDcgQEAKIHsKICAgICBpbnQgICAgICAgICBpOwogCi0gICAgaWYgKGxvZ19sZXZlbCA+PSBMT0dfREVCVUcpCisgICAgaWYgKGN4dDFlMV9sb2dfbGV2ZWwgPj0gTE9HX0RFQlVHKQogICAgICAgICBwcl9pbmZvKCIlczogZGVhbGxvY2F0ZWQgZmlmbyBmb3IgY2hhbm5lbCAlZC8lZFxuIiwKICAgICAgICAgICAgICAgICBwaS0+dXAtPmRldm5hbWUsIGNoYW4sIHBpLT5wLnBvcnRudW0pOwogICAgIGZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKQpAQCAtMTMyMSw3ICsxMzIxLDcgQEAKICAgICAgICAgcmV0dXJuIEVOT0VOVDsKICAgICBpZiAoY2gtPnN0YXRlID09IFVQKQogICAgIHsKLSAgICAgICAgaWYgKGxvZ19sZXZlbCA+PSBMT0dfTU9OSVRPUikKKyAgICAgICAgaWYgKGN4dDFlMV9sb2dfbGV2ZWwgPj0gTE9HX01PTklUT1IpCiAgICAgICAgICAgICBwcl9pbmZvKCIlczogY2hhbm5lbCBhbHJlYWR5IFVQLCBncmFjZWZ1bCBlYXJseSBleGl0XG4iLAogICAgICAgICAgICAgICAgICAgICBjaS0+ZGV2bmFtZSk7CiAgICAgICAgIHJldHVybiAwOwpAQCAtMTMzNCw3ICsxMzM0LDcgQEAKICAgICB7CiAgICAgICAgIGlmIChjaC0+cC5iaXRtYXNrW2ldICYgcGktPnRzbVtpXSkKICAgICAgICAgewotICAgICAgICAgICAgaWYgKDEgfHwgbG9nX2xldmVsID49IExPR19XQVJOKQorICAgICAgICAgICAgaWYgKDEgfHwgY3h0MWUxX2xvZ19sZXZlbCA+PSBMT0dfV0FSTikKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBwcl9pbmZvKCIlczogYzRfY2hhbl91cFslZF0gRUlOVkFMIChhdHRlbXB0IHRvIGNmZyBpbi11c2Ugb3IgdW5hdmFpbGFibGUgVGltZVNsb3RbJWRdKVxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgIGNpLT5kZXZuYW1lLCBjaGFubnVtLCBpKTsKQEAgLTEzNTEsNyArMTM1MSw3IEBACiAgICAgbmJ1ZiA9IG50cyAvIDggPyBudHMgLyA4IDogMTsKICAgICBpZiAoIW5idWYpCiAgICAgewotICAgICAgICAvKiBpZiggbG9nX2xldmVsID49IExPR19XQVJOKSAgKi8KKyAgICAgICAgLyogaWYoIGN4dDFlMV9sb2dfbGV2ZWwgPj0gTE9HX1dBUk4pICAqLwogICAgICAgICBwcl9pbmZvKCIlczogYzRfY2hhbl91cFslZF0gRU5PQlVGUyAobm8gVGltZVNsb3RzIGFzc2lnbmVkKVxuIiwKICAgICAgICAgICAgICAgICBjaS0+ZGV2bmFtZSwgY2hhbm51bSk7CiAgICAgICAgIHJldHVybiBFTk9CVUZTOyAgICAgICAgICAgICAvKiB0aGlzIHNob3VsZCBub3QgaGFwcGVuICovCkBAIC0xNDIwLDcgKzE0MjAsNyBAQAogCiAjaWYgMAogICAgIC8qIERFQlVHIElORk8gKi8KLSAgICBpZiAobG9nX2xldmVsID49IExPR19NT05JVE9SKQorICAgIGlmIChjeHQxZTFfbG9nX2xldmVsID49IExPR19NT05JVE9SKQogICAgICAgICBwcl9pbmZvKCIlczogbW9kZSAleCByeG51bSAlZCAocnh1c2VkICVkIGRlZiAlZCkgdHhudW0gJWQgKHR4dXNlZCAlZCBkZWYgJWQpXG4iLAogICAgICAgICAgICAgICAgIGNpLT5kZXZuYW1lLCBjaC0+cC5jaGFuX21vZGUsCiAgICAgICAgICAgICAgICAgcnhudW0sIG1heF9yeGRlc2NfdXNlZCwgbWF4X3J4ZGVzY19kZWZhdWx0LApAQCAtMTQ1MSw3ICsxNDUxLDcgQEAKIAogICAgICAgICAgICAgICAgaWYgKCEobSA9IE9TX21lbV90b2tlbl9hbGxvYyAoY3h0MWUxX21heF9tcnUpKSkKICAgICAgICAgewotICAgICAgICAgICAgaWYgKGxvZ19sZXZlbCA+PSBMT0dfTU9OSVRPUikKKyAgICAgICAgICAgIGlmIChjeHQxZTFfbG9nX2xldmVsID49IExPR19NT05JVE9SKQogICAgICAgICAgICAgICAgIHByX2luZm8oIiVzOiBjNF9jaGFuX3VwWyVkXSAtIHRva2VuIGFsbG9jIGZhaWx1cmUsIHNpemUgPSAlZC5cbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNpLT5kZXZuYW1lLCBjaGFubnVtLCBjeHQxZTFfbWF4X21ydSk7CiAgICAgICAgICAgICBnb3RvIGVycmZyZWU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY3h0MWUxL3NiZWNvbV9pbmxpbmVfbGludXguaCBiL2RyaXZlcnMvc3RhZ2luZy9jeHQxZTEvc2JlY29tX2lubGluZV9saW51eC5oCmluZGV4IDVhNzJjYjUuLjUwMWEzMzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jeHQxZTEvc2JlY29tX2lubGluZV9saW51eC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jeHQxZTEvc2JlY29tX2lubGluZV9saW51eC5oCkBAIC04Niw3ICs4Niw3IEBACiAKICAgICBGTFVTSF9QQ0lfUkVBRCAoKTsKICAgICB2ID0gbGUzMl90b19jcHUgKCpwKTsKLSAgICBpZiAobG9nX2xldmVsID49IExPR19ERUJVRykKKyAgICBpZiAoY3h0MWUxX2xvZ19sZXZlbCA+PSBMT0dfREVCVUcpCiAgICAgICAgIHByX2luZm8oInBjaV9yZWFkIDogJXggPSAleFxuIiwgKHVfaW50MzJfdCkgcCwgdik7CiAgICAgcmV0dXJuIHY7CiAjZWxzZQpAQCAtOTksNyArOTksNyBAQAogcGNpX3dyaXRlXzMyICh1X2ludDMyX3QgKnAsIHVfaW50MzJfdCB2KQogewogI2lmZGVmIEZMT1dfREVCVUcKLSAgICBpZiAobG9nX2xldmVsID49IExPR19ERUJVRykKKyAgICBpZiAoY3h0MWUxX2xvZ19sZXZlbCA+PSBMT0dfREVCVUcpCiAgICAgICAgIHByX2luZm8oInBjaV93cml0ZTogJXggPSAleFxuIiwgKHVfaW50MzJfdCkgcCwgdik7CiAjZW5kaWYKICAgICAqcCA9IGNwdV90b19sZTMyICh2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lYXN5Y2FwL0tjb25maWcgYi9kcml2ZXJzL3N0YWdpbmcvZWFzeWNhcC9LY29uZmlnCmluZGV4IDlkNWZlNGQuLmJkOTZmMzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9lYXN5Y2FwL0tjb25maWcKKysrIGIvZHJpdmVycy9zdGFnaW5nL2Vhc3ljYXAvS2NvbmZpZwpAQCAtMSw3ICsxLDYgQEAKIGNvbmZpZyBFQVNZQ0FQCiAJdHJpc3RhdGUgIkVhc3lDQVAgVVNCIElEIDA1ZTE6MDQwOCBzdXBwb3J0IgogCWRlcGVuZHMgb24gVVNCICYmIFZJREVPX0RFVgotCWRlcGVuZHMgb24gQktMICMgcGxlYXNlIGZpeAogCiAJLS0taGVscC0tLQogCSAgVGhpcyBpcyBhbiBpbnRlZ3JhdGVkIGF1ZGlvL3ZpZGVvIGRyaXZlciBmb3IgRWFzeUNBUCBjYXJkcyB3aXRoCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZWFzeWNhcC9NYWtlZmlsZSBiL2RyaXZlcnMvc3RhZ2luZy9lYXN5Y2FwL01ha2VmaWxlCmluZGV4IDhhM2Q5MTEuLmYxZjJmYmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9lYXN5Y2FwL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lYXN5Y2FwL01ha2VmaWxlCkBAIC0xMCw0ICsxMCw1IEBACiBjY2ZsYWdzLXkgKz0gLURFQVNZQ0FQX0lTX1ZJREVPREVWX0NMSUVOVAogY2NmbGFncy15ICs9IC1ERUFTWUNBUF9ORUVEU19WNEwyX0RFVklDRV9ICiBjY2ZsYWdzLXkgKz0gLURFQVNZQ0FQX05FRURTX1Y0TDJfRk9QUworY2NmbGFncy15ICs9IC1ERUFTWUNBUF9ORUVEU19VTkxPQ0tFRF9JT0NUTAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZWFzeWNhcC9SRUFETUUgYi9kcml2ZXJzL3N0YWdpbmcvZWFzeWNhcC9SRUFETUUKaW5kZXggMzc3NTQ4MS4uNmI1YWMwZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2Vhc3ljYXAvUkVBRE1FCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lYXN5Y2FwL1JFQURNRQpAQCAtMjQsNiArMjQsOSBAQAogQlVJTEQgT1BUSU9OUyBBTkQgREVQRU5ERU5DSUVTCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAorVW5sZXNzIEVBU1lDQVBfREVCVUcgaXMgZGVmaW5lZCBkdXJpbmcgY29tcGlsYXRpb24gaXQgd2lsbCBub3QgYmUgcG9zc2libGUKK3RvIHNlbGVjdCBhIGRlYnVnIGxldmVsIGF0IHRoZSB0aW1lIG9mIG1vZHVsZSBpbnN0YWxsYXRpb24uCisKIElmIHRoZSBwYXJhbWV0ZXIgRUFTWUNBUF9JU19WSURFT0RFVl9DTElFTlQgaXMgdW5kZWZpbmVkIGR1cmluZyBjb21waWxhdGlvbgogdGhlIGJ1aWx0IG1vZHVsZSBpcyBlbnRpcmVseSBpbmRlcGVuZGVudCBvZiB0aGUgdmlkZW9kZXYgbW9kdWxlLCBhbmQgd2hlbgogdGhlIEVhc3lDQVAgaXMgcGh5c2ljYWxseSBwbHVnZ2VkIGludG8gYSBVU0IgcG9ydCB0aGUgc3BlY2lhbCBmaWxlcwpAQCAtMzMsNDEgKzM2LDU0IEBACiBJZiB0aGUgcGFyYW1ldGVyIEVBU1lDQVBfSVNfVklERU9ERVZfQ0xJRU5UIGlzIGRlZmluZWQgZHVyaW5nIGNvbXBpbGF0aW9uCiB0aGUgYnVpbHQgZWFzeWNhcCBtb2R1bGUgaXMgY29uZmlndXJlZCB0byByZWdpc3RlciB3aXRoIHRoZSB2aWRlb2RldiBtb2R1bGUsCiBpbiB3aGljaCBjYXNlIHRoZSBzcGVjaWFsIGZpbGVzIGNyZWF0ZWQgd2hlbiB0aGUgRWFzeUNBUCBpcyBwbHVnZ2VkIGluIGFyZQotL2Rldi92aWRlbzAgYW5kIC9kZXYvZWFzeXNuZDAuICBVc2Ugb2YgdGhlIGVhc3ljYXAgbW9kdWxlIGFzIGEgY2xpZW50IG9mCi10aGUgdmlkZW9kZXYgbW9kdWxlIGhhcyByZWNlaXZlZCB2ZXJ5IGxpdHRsZSB0ZXN0aW5nIGFzIG9mIEp1bmUgMjAxMC4KKy9kZXYvdmlkZW8wIGFuZCAvZGV2L2Vhc3lzbmQwLgogCitEdXJpbmcgaW4tdHJlZSBidWlsZHMgdGhlIGZvbGxvd2luZyBzaG91bGQgc2hvdWxkIGJlIGRlZmluZWQgd2hlbmV2ZXIgdGhlCitwYXJhbWV0ZXIgRUFTWUNBUF9JU19WSURFT0RFVl9DTElFTlQgaXMgZGVmaW5lZDoKIAotS05PV04gQlVJTEQgUFJPQkxFTVMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFQVNZQ0FQX05FRURTX1Y0TDJfREVWSUNFX0gKK0VBU1lDQVBfTkVFRFNfVjRMMl9GT1BTCitFQVNZQ0FQX05FRURTX1VOTE9DS0VEX0lPQ1RMCiAKLSgxKSBSZWNlbnQgZ2NjIHZlcnNpb25zIG1heSBnZW5lcmF0ZSB0aGUgbWVzc2FnZToKLQotICAgICB3YXJuaW5nOiB0aGUgZnJhbWUgc2l6ZSBvZiAuLi4uIGJ5dGVzIGlzIGxhcmdlciB0aGFuIDEwMjQgYnl0ZXMKLQotVGhpcyB3YXJuaW5nIGNhbiBiZSBzdXBwcmVzc2VkIGJ5IHNwZWNpZnlpbmcgaW4gdGhlIE1ha2VmaWxlOgotCi0gICAgIEVYVFJBX0NGTEFHUyArPSAtV2ZyYW1lLWxhcmdlci10aGFuPTgxOTIKLQotYnV0IGl0IHdvdWxkIGJlIHByZWZlcmFibGUgdG8gcmVtb3ZlIHRoZSBjYXVzZSBvZiB0aGUgd2FybmluZy4KK0lmIHRoZSBidWlsZCBpcyBwZXJmb3JtZWQgb3V0LW9mLXRyZWUgYWdhaW5zdCBvbGRlciBrZXJuZWxzIHRoZSBwYXJhbWV0ZXJzCit0byBiZSBkZWZpbmVkIGRlcGVuZCBvbiB0aGUga2VybmVsIHZlcnNpb24gaW4gYSB3YXkgd2hpY2ggd2lsbCBub3QgYmUKK2Rpc2N1c3NlZCBoZXJlLgogCiAKIEtOT1dOIFJVTlRJTUUgSVNTVUVTCiAtLS0tLS0tLS0tLS0tLS0tLS0tLQogCi0oMSkgUmFuZG9tbHkgKG1heWJlIDUgdG8gMTAlIG9mIG9jY2FzaW9ucykgdGhlIGRyaXZlciBmYWlscyB0byBwcm9kdWNlIGFueQotb3V0cHV0IGF0IHN0YXJ0LXVwLiAgQ2xvc2luZyBtcGxheWVyIChvciB3aGF0ZXZlciB0aGUgdXNlciBwcm9ncmFtIGlzKSBhbmQKLXJlc3RhcnRpbmcgaXQgcmVzdG9yZXMgbm9ybWFsIHBlcmZvcm1hbmNlIHdpdGhvdXQgYW55IG90aGVyIHJlbWVkaWFsIGFjdGlvbgotYmVpbmcgbmVjZXNzYXJ5LiAgVGhlIHJlYXNvbiBmb3IgdGhpcyBpcyBub3Qga25vd24uCisoMSkgSW50ZW50aW9uYWxseSwgdGhpcyBkcml2ZXIgd2lsbCBub3Qgc3RyZWFtIG1hdGVyaWFsIHdoaWNoIGlzIHVuYW1iaWd1b3VzbHkKK2lkZW50aWZpZWQgYnkgdGhlIGhhcmR3YXJlIGFzIGNvcHktcHJvdGVjdGVkLiAgTm9ybWFsIHZpZGVvIG91dHB1dCB3aWxsIGJlCitwcmVzZW50IGZvciBhYm91dCBhIG1pbnV0ZSBidXQgd2lsbCB0aGVuIGZyZWV6ZSB3aGVuIHRoaXMgc2l0dWF0aW9uIGFyaXNlcy4KIAotKDIpIEludGVudGlvbmFsbHksIHRoaXMgZHJpdmVyIHdpbGwgbm90IHN0cmVhbSBtYXRlcmlhbCB3aGljaCBpcyB1bmFtYmlndW91c2x5Ci1pZGVudGlmaWVkIGJ5IHRoZSBoYXJkd2FyZSBhcyBjb3B5LXByb3RlY3RlZC4gIFRoZSB2aWRlbyBvdXRwdXQgd2lsbCBmcmVlemUKLXdpdGhpbiBhYm91dCBhIG1pbnV0ZSB3aGVuIHRoaXMgc2l0dWF0aW9uIGFyaXNlcy4KLQotKDMpIFRoZSBjb250cm9scyBmb3IgbHVtaW5hbmNlLCBjb250cmFzdCwgc2F0dXJhdGlvbiwgaHVlIGFuZCB2b2x1bWUgbWF5IG5vdAorKDIpIFRoZSBjb250cm9scyBmb3IgbHVtaW5hbmNlLCBjb250cmFzdCwgc2F0dXJhdGlvbiwgaHVlIGFuZCB2b2x1bWUgbWF5IG5vdAogYWx3YXlzIHdvcmsgcHJvcGVybHkuCiAKLSg0KSBSZWR1Y2VkLXJlc29sdXRpb24gUy1WaWRlbyBzZWVtcyB0byBzdWZmZXIgZnJvbSBtb2lyZSBhcnRlZmFjdHMuICBObwotYXR0ZW1wdCBoYXMgeWV0IGJlZW4gbWFkZSB0byByZW1lbWR5IHRoaXMuCisoMykgUmVkdWNlZC1yZXNvbHV0aW9uIFMtVmlkZW8gc2VlbXMgdG8gc3VmZmVyIGZyb20gbW9pcmUgYXJ0ZWZhY3RzLgorCisKK0lOUFVUIE5VTUJFUklORworLS0tLS0tLS0tLS0tLS0tCisKK0ZvciB0aGUgRWFzeUNBUCB3aXRoIFMtVklERU8gaW5wdXQgY2FibGUgdGhlIGRyaXZlciByZWdhcmRzIGEgcmVxdWVzdCBmb3IKK2lucHV0cyBudW1iZXJlZCAwIG9yIDEgYXMgcmVmZXJyaW5nIHRvIENWQlMgYW5kIGEgcmVxdWVzdCBmb3IgaW5wdXQKK251bWJlcmVkIDUgYXMgcmVmZXJyaW5nIHRvIFMtVklERU8uCisKK0ZvciB0aGUgRWFzeUNBUCB3aXRoIGZvdXIgQ1ZCUyBpbnB1dHMgdGhlIGRyaXZlciBleHBlY3RzIHRvIGJlIGFza2VkIGZvcgorYW55IG9uZSBvZiBpbnB1dHMgbnVtYmVyZWQgMSwyLDMsNC4gIElmIGlucHV0IDAgaXMgYXNrZWQgZm9yLCBpdCBpcworaW50ZXJwcmV0ZWQgYXMgaW5wdXQgMS4KKworCitNT0RVTEUgUEFSQU1FVEVSUworLS0tLS0tLS0tLS0tLS0tLS0KKworVGhyZWUgbW9kdWxlIHBhcmFtZXRlcnMgYXJlIGRlZmluZWQ6CisKK2RlYnVnICAgICAgdGhlIGVhc3ljYXAgbW9kdWxlIGlzIGNvbmZpZ3VyZWQgYXQgZGlhZ25vc3RpYyBsZXZlbCBuICgwIHRvIDkpCitnYWluICAgICAgIGF1ZGlvIGdhaW4gbGV2ZWwgbiAoMCB0byAzMSwgZGVmYXVsdCBpcyAxNikKK2JhcnMgICAgICAgMCA9PiAgdGVzdGNhcmQgYmFycyB3aGVuIGluY29taW5nIHZpZGVvIHNpZ25hbCBpcyBsb3N0CisgICAgICAgICAgIDEgPT4gIHRlc3RjYXJkIGJhcnMgd2hlbiBpbmNvbWluZyB2aWRlbyBzaWduYWwgaXMgbG9zdCAoZGVmYXVsdCkKIAogCiBTVVBQT1JURUQgVFYgU1RBTkRBUkRTIEFORCBSRVNPTFVUSU9OUwpAQCAtODIsMTggKzk4LDI5IEBACiAgICAgUEFMXzYwLCAgICAgICBOVFNDXzQ0MywKICAgICBQQUxfTS4KIAorSW4gYWRkaXRpb24sIHRoZSBkcml2ZXIgb2ZmZXJzICJjdXN0b20iIHBzZXVkby1zdGFuZGFyZHMgd2l0aCBhIGZyYW1lcmF0ZQord2hpY2ggaXMgMjAlIG9mIHRoZSB1c3VhbCBmcmFtZXJhdGUuICBUaGVzZSBwc2V1ZG8tc3RhbmRhcmRzIGFyZSBuYW1lZDoKKworICAgIFBBTF9CR0hJTl9TTE9XLCAgICBOVFNDX05fNDQzX1NMT1csCisgICAgUEFMX05jX1NMT1csICAgICAgIE5UU0NfTl9TTE9XLAorICAgIFNFQ0FNX1NMT1csICAgICAgICBOVFNDX01fU0xPVywgICAgICAgIE5UU0NfTV9KUF9TTE9XLAorICAgIFBBTF82MF9TTE9XLCAgICAgICBOVFNDXzQ0M19TTE9XLAorICAgIFBBTF9NX1NMT1cuCisKKwogVGhlIGF2YWlsYWJsZSBwaWN0dXJlIHNpemVzIGFyZToKIAogICAgICBhdCAyNSBmcmFtZXMgcGVyIHNlY29uZDogICA3MjB4NTc2LCA3MDR4NTc2LCA2NDB4NDgwLCAzNjB4Mjg4LCAzMjB4MjQwOwotICAgICBhdCAzMCBmcmFtZXMgcGVyIHNlY29uZDogICA3MjB4NDgwLCA2NDB4NDgwLCAzNjB4MjQwLCAzMjB4MjQwOworICAgICBhdCAzMCBmcmFtZXMgcGVyIHNlY29uZDogICA3MjB4NDgwLCA2NDB4NDgwLCAzNjB4MjQwLCAzMjB4MjQwLgogCiAKIFdIQVQnUyBURVNURUQgQU5EIFdIQVQnUyBOT1QKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotVGhpcyBkcml2ZXIgaXMga25vd24gdG8gd29yayB3aXRoIG1wbGF5ZXIsIG1lbmNvZGVyLCB0dnRpbWUgYW5kIHN1ZmZpY2llbnRseQotcmVjZW50IHZlcnNpb25zIG9mIHZsYy4gIEFuIGludGVyZmFjZSB0byBmZm1wZWcgaXMgaW1wbGVtZW50ZWQsIGJ1dCBzZXJpb3VzCi1hdWRpby12aWRlbyBzeW5jaHJvbml6YXRpb24gcHJvYmxlbXMgcmVtYWluLgorVGhpcyBkcml2ZXIgaXMga25vd24gdG8gd29yayB3aXRoIG1wbGF5ZXIsIG1lbmNvZGVyLCB0dnRpbWUsIHpvbmVtaW5kZXIsCit4YXd0diwgZ3N0cmVhbWVyIGFuZCBzdWZmaWNpZW50bHkgcmVjZW50IHZlcnNpb25zIG9mIHZsYy4gIEFuIGludGVyZmFjZQordG8gZmZtcGVnIGlzIGltcGxlbWVudGVkLCBidXQgc2VyaW91cyBhdWRpby12aWRlbyBzeW5jaHJvbml6YXRpb24gcHJvYmxlbXMKK3JlbWFpbi4KIAogVGhlIGRyaXZlciBpcyBkZXNpZ25lZCB0byBzdXBwb3J0IGFsbCB0aGUgVFYgc3RhbmRhcmRzIGFjY2VwdGVkIGJ5IHRoZQogaGFyZHdhcmUsIGJ1dCBhcyB5ZXQgaXQgaGFzIGFjdHVhbGx5IGJlZW4gdGVzdGVkIG9uIG9ubHkgYSBmZXcgb2YgdGhlc2UuCkBAIC0xMDEsMTAgKzEyOCw3IEBACiBJIGhhdmUgYmVlbiB1bmFibGUgdG8gdGVzdCBhbmQgY2FsaWJyYXRlIHRoZSBTLXZpZGVvIGlucHV0IG15c2VsZiBiZWNhdXNlIEkKIGRvIG5vdCBwb3NzZXNzIGFueSBlcXVpcG1lbnQgd2l0aCBTLXZpZGVvIG91dHB1dC4KIAotVGhpcyBkcml2ZXIgZG9lcyBub3QgdW5kZXJzdGFuZCB0aGUgVjRMMSBJT0NUTCBjb21tYW5kcywgc28gcHJvZ3JhbXMgc3VjaAotYXMgY2Ftb3JhbWEgYXJlIG5vdCBjb21wYXRpYmxlLiAgVGhlcmUgYXJlIHJlcG9ydHMgdGhhdCB0aGUgZHJpdmVyIGRvZXMKLXdvcmsgd2l0aCBzdWZmaWNpZW50bHkgcmVjZW50IChWNEwyKSB2ZXJzaW9ucyBvZiB6b25lbWluZGVyLCBidXQgSSBoYXZlIG5vdAotYXR0ZW1wdGVkIHRvIGNvbmZpcm0gdGhpcyBteXNlbGYuCitUaGlzIGRyaXZlciBkb2VzIG5vdCB1bmRlcnN0YW5kIHRoZSBWNEwxIElPQ1RMIGNvbW1hbmRzLgogCiAKIFVERVYgUlVMRVMKQEAgLTEyMCw2ICsxNDQsMTcgQEAKIExBQkVMPSJlYXN5Y2FwX3J1bGVzX2VuZCIKIAogCitNT0RQUk9CRSBDT05GSUdVUkFUSU9OCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSBlYXN5Y2FwIG1vZHVsZSBpcyBpbiBjb21wZXRpdGlvbiB3aXRoIHRoZSBtb2R1bGUgc25kLXVzYi1hdWRpbyBmb3IgdGhlCitFYXN5Q0FQJ3MgYXVkaW8gY2hhbm5lbCwgYW5kIGl0cyBpbnN0YWxsYXRpb24gY2FuIGJlIGFpZGVkIGJ5IHByb3ZpZGluZyBhCitmaWxlIGluIGRpcmVjdG9yeSAvZXRjL21vZHByb2JlLmQgd2l0aCBjb250ZW50OgorCitvcHRpb25zIGVhc3ljYXAgIGdhaW49MTYgYmFycz0xCitpbnN0YWxsIGVhc3ljYXAgL3NiaW4vcm1tb2Qgc25kLXVzYi1hdWRpbzsgL3NiaW4vbW9kcHJvYmUgLS1pZ25vcmUtaW5zdGFsbCBlYXN5Y2FwCisKKwogQUNLTk9XTEVHRU1FTlRTIEFORCBSRUZFUkVOQ0VTCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFRoaXMgZHJpdmVyIG1ha2VzIHVzZSBvZiBpbmZvcm1hdGlvbiBjb250YWluZWQgaW4gdGhlIFN5bnRlayBTZW1pY29uIERDLTExMjUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lYXN5Y2FwL2Vhc3ljYXAuaCBiL2RyaXZlcnMvc3RhZ2luZy9lYXN5Y2FwL2Vhc3ljYXAuaAppbmRleCA4ODQyNjNiLi44ZWJmOTZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZWFzeWNhcC9lYXN5Y2FwLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2Vhc3ljYXAvZWFzeWNhcC5oCkBAIC0zMyw2ICszMyw3IEBACiAgKiAgICAgICAgICAgICAgICBFQVNZQ0FQX05FRURTX1VTQlZJREVPX0gKICAqICAgICAgICAgICAgICAgIEVBU1lDQVBfTkVFRFNfVjRMMl9ERVZJQ0VfSAogICogICAgICAgICAgICAgICAgRUFTWUNBUF9ORUVEU19WNEwyX0ZPUFMKKyAqICAgICAgICAgICAgICAgIEVBU1lDQVBfTkVFRFNfVU5MT0NLRURfSU9DVEwKICAqCiAgKiAgSUYgUkVRVUlSRUQgVEhFWSBNVVNUIEJFIEVYVEVSTkFMTFkgREVGSU5FRCwgRk9SIEVYQU1QTEUgQVMgQ09NUElMRVIKICAqICBPUFRJT05TLgpAQCAtNDIsMzUgKzQzLDI0IEBACiAjaWYgKCFkZWZpbmVkKEVBU1lDQVBfSCkpCiAjZGVmaW5lIEVBU1lDQVBfSAogCi0jaWYgZGVmaW5lZChFQVNZQ0FQX0RFQlVHKQotI2lmICg5IDwgRUFTWUNBUF9ERUJVRykKLSNlcnJvciBEZWJ1ZyBsZXZlbHMgMCB0byA5IGFyZSBva2F5LlwKLSAgVG8gYWNoaWV2ZSBoaWdoZXIgbGV2ZWxzLCByZW1vdmUgdGhpcyB0cmFwIG1hbnVhbGx5IGZyb20gZWFzeWNhcC5oCi0jZW5kaWYKLSNlbmRpZiAvKkVBU1lDQVBfREVCVUcqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqICBUSEVTRSBBUkUgTk9STUFMTFkgREVGSU5FRAorICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjZGVmaW5lICBQQVRJRU5DRSAgNTAwCisjdW5kZWYgICBQUkVGRVJfTlRTQworI2RlZmluZSAgUEVSU0VWRVJFCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKgogICogIFRIRVNFIEFSRSBGT1IgTUFJTlRFTkFOQ0UgT05MWSAtIE5PUk1BTExZIFVOREVGSU5FRDoKICAqLwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI3VuZGVmICBQUkVGRVJfTlRTQwogI3VuZGVmICBFQVNZQ0FQX1RFU1RDQVJECiAjdW5kZWYgIEVBU1lDQVBfVEVTVFRPTkUKLSN1bmRlZiAgTE9DS0ZSQU1FCiAjdW5kZWYgIE5PUkVBREJBQ0sKICN1bmRlZiAgQVVESU9USU1FCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKgotICoKLSAqICBERUZJTkUgICBCUklER0VSICAgVE8gQUNUSVZBVEUgVEhFIFJPVVRJTkUgRk9SIEJSSURHSU5HIFZJREVPVEFQRSBEUk9QT1VUUy4KLSAqCi0gKiAgICAgICAgICAgICAqKiogVU5ERVIgREVWRUxPUE1FTlQvVEVTVElORyAtIE5PVCBSRUFEWSBZRVQhKioqCi0gKgotICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jdW5kZWYgIEJSSURHRVIKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgpAQCAtOTIsMjUgKzgyLDE0IEBACiAKIC8qdnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnYqLwogI2lmIGRlZmluZWQoRUFTWUNBUF9JU19WSURFT0RFVl9DTElFTlQpCi0jaWYgKCFkZWZpbmVkKF9fT0xEX1ZJRElPQ18pKQotI2RlZmluZSBfX09MRF9WSURJT0NfCi0jZW5kaWYgLyogIWRlZmluZWQoX19PTERfVklESU9DXykgKi8KLQogI2luY2x1ZGUgPG1lZGlhL3Y0bDItZGV2Lmg+Ci0KICNpZiBkZWZpbmVkKEVBU1lDQVBfTkVFRFNfVjRMMl9ERVZJQ0VfSCkKICNpbmNsdWRlIDxtZWRpYS92NGwyLWRldmljZS5oPgogI2VuZGlmIC8qRUFTWUNBUF9ORUVEU19WNEwyX0RFVklDRV9IKi8KICNlbmRpZiAvKkVBU1lDQVBfSVNfVklERU9ERVZfQ0xJRU5UKi8KIC8qXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl4qLwotCi0jaWYgKCFkZWZpbmVkKF9fT0xEX1ZJRElPQ18pKQotI2RlZmluZSBfX09MRF9WSURJT0NfCi0jZW5kaWYgLyogIWRlZmluZWQoX19PTERfVklESU9DXykgKi8KICNpbmNsdWRlIDxsaW51eC92aWRlb2RldjIuaD4KLQogI2luY2x1ZGUgPGxpbnV4L3NvdW5kY2FyZC5oPgotCiAjaWYgZGVmaW5lZChFQVNZQ0FQX05FRURTX1VTQlZJREVPX0gpCiAjaW5jbHVkZSA8Y29uZmlnL3ZpZGVvL3VzYnZpZGVvLmg+CiAjZW5kaWYgLypFQVNZQ0FQX05FRURTX1VTQlZJREVPX0gqLwpAQCAtMTIxLDcgKzEwMCw2IEBACiAKICNkZWZpbmUgU1RSSU5HSVpFX0FHQUlOKHgpICN4CiAjZGVmaW5lIFNUUklOR0laRSh4KSBTVFJJTkdJWkVfQUdBSU4oeCkKLQogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyogIFZFTkRPUiwgUFJPRFVDVDogIFN5bnRlayBTZW1pY29uZHVjdG9yIENvLiwgTHRkCiAgKgpAQCAtMTM1LDEyICsxMTMsMTIgQEAKICNkZWZpbmUgVVNCX0VBU1lDQVBfVkVORE9SX0lECTB4MDVlMQogI2RlZmluZSBVU0JfRUFTWUNBUF9QUk9EVUNUX0lECTB4MDQwOAogCi0jZGVmaW5lIEVBU1lDQVBfRFJJVkVSX1ZFUlNJT04gIjAuOC4yMSIKKyNkZWZpbmUgRUFTWUNBUF9EUklWRVJfVkVSU0lPTiAiMC44LjQxIgogI2RlZmluZSBFQVNZQ0FQX0RSSVZFUl9ERVNDUklQVElPTiAiZWFzeWNhcGRjNjAiCiAKICNkZWZpbmUgVVNCX1NLRUxfTUlOT1JfQkFTRSAgICAgMTkyCi0jZGVmaW5lIFZJREVPX0RFVklDRV9NQU5ZIDgKLQorI2RlZmluZSBET05HTEVfTUFOWSA4CisjZGVmaW5lIElOUFVUX01BTlkgNgogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyoKICAqICBERUZBVUxUIExVTUlOQU5DRSwgQ09OVFJBU1QsIFNBVFVSQVRJT04gQU5EIEhVRQpAQCAtMTY0LDYgKzE0Miw4IEBACiAjaWYgKFVTQl8yXzBfTUFYUEFDS0VUU0laRSA+IFBBR0VfU0laRSkKICNlcnJvciB2aWRlb19pc29jX2J1ZmZlclsuXSB3aWxsIG5vdCBiZSBiaWcgZW5vdWdoCiAjZW5kaWYKKyNkZWZpbmUgVklERU9fSlVOS19UT0xFUkFURSBWSURFT19JU09DX0JVRkZFUl9NQU5ZCisjZGVmaW5lIFZJREVPX0xPU1RfVE9MRVJBVEUgNTAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8qCiAgKiAgVklERU8gQlVGRkVSUwpAQCAtMjEwLDcgKzE5MCwxNyBAQAogI2RlZmluZSAgTlRTQ19NX0pQICAgICAgNQogI2RlZmluZSAgUEFMXzYwICAgICAgICAgNwogI2RlZmluZSAgUEFMX00gICAgICAgICAgOQotI2RlZmluZSAgU1RBTkRBUkRfTUFOWSAxMAorI2RlZmluZSAgUEFMX0JHSElOX1NMT1cgICAgMTAKKyNkZWZpbmUgIFBBTF9OY19TTE9XICAgICAgIDEyCisjZGVmaW5lICBTRUNBTV9TTE9XICAgICAgICAxNAorI2RlZmluZSAgTlRTQ19OX1NMT1cgICAgICAgMTYKKyNkZWZpbmUgIE5UU0NfTl80NDNfU0xPVyAgIDE4CisjZGVmaW5lICBOVFNDX01fU0xPVyAgICAgICAxMQorI2RlZmluZSAgTlRTQ180NDNfU0xPVyAgICAgMTMKKyNkZWZpbmUgIE5UU0NfTV9KUF9TTE9XICAgIDE1CisjZGVmaW5lICBQQUxfNjBfU0xPVyAgICAgICAxNworI2RlZmluZSAgUEFMX01fU0xPVyAgICAgICAgMTkKKyNkZWZpbmUgIFNUQU5EQVJEX01BTlkgMjAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8qCiAgKiAgRU5VTVMKQEAgLTIzOCw3ICsyMjgsNiBAQAogZW51bSB7CiBGSUVMRF9OT05FLAogRklFTERfSU5URVJMQUNFRCwKLUZJRUxEX0FMVEVSTkFURSwKIElOVEVSTEFDRV9NQU5ZCiB9OwogI2RlZmluZSBTRVRUSU5HU19NQU5ZCShTVEFOREFSRF9NQU5ZICogXApAQCAtMjUxLDExICsyNDAsMTggQEAKICAqICBTVFJVQ1RVUkUgREVGSU5JVElPTlMKICAqLwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RydWN0IGVhc3ljYXBfZG9uZ2xlIHsKK3N0cnVjdCBlYXN5Y2FwICpwZWFzeWNhcDsKK3N0cnVjdCBtdXRleCBtdXRleF92aWRlbzsKK3N0cnVjdCBtdXRleCBtdXRleF9hdWRpbzsKK307CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiBzdHJ1Y3QgZGF0YV9idWZmZXIgewogc3RydWN0IGxpc3RfaGVhZCBsaXN0X2hlYWQ7CiB2b2lkICpwZ287CiB2b2lkICpwdG87CiBfX3UxNiBrb3VudDsKK19fdTE2IGlucHV0OwogfTsKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIHN0cnVjdCBkYXRhX3VyYiB7CkBAIC0yNzQsNiArMjcwLDIyIEBACiBjaGFyIG5hbWVbMTI4XTsKIHN0cnVjdCB2NGwyX2Zvcm1hdCB2NGwyX2Zvcm1hdDsKIH07CitzdHJ1Y3QgaW5wdXRzZXQgeworaW50IGlucHV0OworaW50IGlucHV0X29rOworaW50IHN0YW5kYXJkX29mZnNldDsKK2ludCBzdGFuZGFyZF9vZmZzZXRfb2s7CitpbnQgZm9ybWF0X29mZnNldDsKK2ludCBmb3JtYXRfb2Zmc2V0X29rOworaW50IGJyaWdodG5lc3M7CitpbnQgYnJpZ2h0bmVzc19vazsKK2ludCBjb250cmFzdDsKK2ludCBjb250cmFzdF9vazsKK2ludCBzYXR1cmF0aW9uOworaW50IHNhdHVyYXRpb25fb2s7CitpbnQgaHVlOworaW50IGh1ZV9vazsKK307CiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKgogICogICBlYXN5Y2FwLmlsayA9PSAwICAgPT4gIENWQlMrUy1WSURFTyBIQVJEV0FSRSwgQVVESU8gd01heFBhY2tldFNpemU9MjU2CkBAIC0yODIsNiArMjk0LDE5IEBACiAgKi8KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIHN0cnVjdCBlYXN5Y2FwIHsKKyNkZWZpbmUgVEVMTFRBTEUgImV4cGVjdGVkc3RyaW5nIgorY2hhciB0ZWxsdGFsZVsxNl07CitpbnQgaXNkb25nbGU7CisKKy8qdnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2Ki8KKyNpZiBkZWZpbmVkKEVBU1lDQVBfSVNfVklERU9ERVZfQ0xJRU5UKQorc3RydWN0IHZpZGVvX2RldmljZSB2aWRlb19kZXZpY2U7CisjaWYgZGVmaW5lZChFQVNZQ0FQX05FRURTX1Y0TDJfREVWSUNFX0gpCitzdHJ1Y3QgdjRsMl9kZXZpY2UgdjRsMl9kZXZpY2U7CisjZW5kaWYgLypFQVNZQ0FQX05FRURTX1Y0TDJfREVWSUNFX0gqLworI2VuZGlmIC8qRUFTWUNBUF9JU19WSURFT0RFVl9DTElFTlQqLworLypeXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl4qLworaW50IHN0YXR1czsKIHVuc2lnbmVkIGludCBhdWRpb19wYWdlc19wZXJfZnJhZ21lbnQ7CiB1bnNpZ25lZCBpbnQgYXVkaW9fYnl0ZXNfcGVyX2ZyYWdtZW50OwogdW5zaWduZWQgaW50IGF1ZGlvX2J1ZmZlcl9wYWdlX21hbnk7CkBAIC0yOTEsMjYgKzMxNiwxNCBAQAogX19zMTYgb2xkYXVkaW87CiAjZW5kaWYgLypVUFNBTVBMRSovCiAKLXN0cnVjdCBlYXN5Y2FwX2Zvcm1hdCBlYXN5Y2FwX2Zvcm1hdFsxICsgU0VUVElOR1NfTUFOWV07Ci0KIGludCBpbGs7CiBib29sIG1pY3JvcGhvbmU7CiAKLS8qdnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnYqLwotI2lmIGRlZmluZWQoRUFTWUNBUF9JU19WSURFT0RFVl9DTElFTlQpCi1zdHJ1Y3QgdmlkZW9fZGV2aWNlICpwdmlkZW9fZGV2aWNlOwotI2VuZGlmIC8qRUFTWUNBUF9JU19WSURFT0RFVl9DTElFTlQqLwotLypeXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXiovCi0KIHN0cnVjdCB1c2JfZGV2aWNlICpwdXNiX2RldmljZTsKIHN0cnVjdCB1c2JfaW50ZXJmYWNlICpwdXNiX2ludGVyZmFjZTsKIAogc3RydWN0IGtyZWYga3JlZjsKIAotc3RydWN0IG11dGV4IG11dGV4X21tYXBfdmlkZW9bRlJBTUVfQlVGRkVSX01BTlldOwotc3RydWN0IG11dGV4IG11dGV4X3RpbWV2YWwwOwotc3RydWN0IG11dGV4IG11dGV4X3RpbWV2YWwxOwotCiBpbnQgcXVldWVkW0ZSQU1FX0JVRkZFUl9NQU5ZXTsKIGludCBkb25lW0ZSQU1FX0JVRkZFUl9NQU5ZXTsKIApAQCAtMzIxLDE2ICszMzQsMjQgQEAKIGludCBwb2xsZWQ7CiBpbnQgc3RhbmRhcmRfb2Zmc2V0OwogaW50IGZvcm1hdF9vZmZzZXQ7CitzdHJ1Y3QgaW5wdXRzZXQgaW5wdXRzZXRbSU5QVVRfTUFOWV07CiAKK2Jvb2wgbnRzYzsKIGludCBmcHM7CiBpbnQgdXNlYzsKIGludCB0b2xlcmF0ZTsKK2ludCBza2lwOworaW50IHNraXBwZWQ7CitpbnQgbG9zdFtJTlBVVF9NQU5ZXTsKIGludCBtZXJpdFsxODBdOwogCiBzdHJ1Y3QgdGltZXZhbCB0aW1ldmFsMDsKIHN0cnVjdCB0aW1ldmFsIHRpbWV2YWwxOwogc3RydWN0IHRpbWV2YWwgdGltZXZhbDI7CitzdHJ1Y3QgdGltZXZhbCB0aW1ldmFsMzsKK3N0cnVjdCB0aW1ldmFsIHRpbWV2YWw2Owogc3RydWN0IHRpbWV2YWwgdGltZXZhbDc7CitzdHJ1Y3QgdGltZXZhbCB0aW1ldmFsODsKIGxvbmcgbG9uZyBpbnQgZG5ieWR0OwogCiBpbnQgICAgdmlkZW9faW50ZXJmYWNlOwpAQCAtMzQ3LDggKzM2OCw2IEBACiBpbnQgICAgdmlkZW9fZW9mOwogaW50ICAgIHZpZGVvX2p1bms7CiAKLWludCAgICBmdWRnZTsKLQogc3RydWN0IGRhdGFfYnVmZmVyIHZpZGVvX2lzb2NfYnVmZmVyW1ZJREVPX0lTT0NfQlVGRkVSX01BTlldOwogc3RydWN0IGRhdGFfYnVmZmVyIFwKIAkgICAgIGZpZWxkX2J1ZmZlcltGSUVMRF9CVUZGRVJfTUFOWV1bKEZJRUxEX0JVRkZFUl9TSVpFL1BBR0VfU0laRSldOwpAQCAtMzU4LDYgKzM3NywxMyBAQAogc3RydWN0IGxpc3RfaGVhZCB1cmJfdmlkZW9faGVhZDsKIHN0cnVjdCBsaXN0X2hlYWQgKnB1cmJfdmlkZW9faGVhZDsKIAorX191OCBjYWNoZVs4XTsKK19fdTggKnBjYWNoZTsKK2ludCB2aWRlb19tdDsKK2ludCBhdWRpb19tdDsKK2xvbmcgbG9uZyBhdWRpb19ieXRlczsKK19fdTMyIGlzZXF1ZW5jZTsKKwogaW50IHZtYV9tYW55OwogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCkBAIC0zODMsNyArNDA5LDYgQEAKICAqLwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogX191MzIgICAgICAgICAgICAgICAgICAgcGl4ZWxmb3JtYXQ7Ci1fX3UzMiAgICAgICAgICAgICAgICAgICBmaWVsZDsKIGludCAgICAgICAgICAgICAgICAgICAgIHdpZHRoOwogaW50ICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OwogaW50ICAgICAgICAgICAgICAgICAgICAgYnl0ZXNwZXJwaXhlbDsKQEAgLTQ2Myw4ICs0ODgsMTAgQEAKIHZvaWQgICAgICAgICAgICAgZWFzeWNhcF9jb21wbGV0ZShzdHJ1Y3QgdXJiICopOwogaW50ICAgICAgICAgICAgICBlYXN5Y2FwX29wZW4oc3RydWN0IGlub2RlICosIHN0cnVjdCBmaWxlICopOwogaW50ICAgICAgICAgICAgICBlYXN5Y2FwX3JlbGVhc2Uoc3RydWN0IGlub2RlICosIHN0cnVjdCBmaWxlICopOwotbG9uZyAgICAgICAgICAgICBlYXN5Y2FwX2lvY3RsKHN0cnVjdCBmaWxlICosIHVuc2lnbmVkIGludCwgIHVuc2lnbmVkIGxvbmcpOwotCitsb25nICAgICAgICAgICAgIGVhc3ljYXBfaW9jdGxfbm9pbm9kZShzdHJ1Y3QgZmlsZSAqLCB1bnNpZ25lZCBpbnQsIFwKKwkJCQkJCQkJdW5zaWduZWQgbG9uZyk7CitpbnQgICAgICAgICAgICAgIGVhc3ljYXBfaW9jdGwoc3RydWN0IGlub2RlICosIHN0cnVjdCBmaWxlICosIHVuc2lnbmVkIGludCwgXAorCQkJCQkJCQl1bnNpZ25lZCBsb25nKTsKIC8qdnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnYqLwogI2lmIGRlZmluZWQoRUFTWUNBUF9JU19WSURFT0RFVl9DTElFTlQpCiBpbnQgICAgICAgICAgICAgIGVhc3ljYXBfb3Blbl9ub2lub2RlKHN0cnVjdCBmaWxlICopOwpAQCAtNDg5LDEyICs1MTYsMTAgQEAKIGludCAgICAgICAgICAgICAgZmllbGQyZnJhbWUoc3RydWN0IGVhc3ljYXAgKik7CiBpbnQgICAgICAgICAgICAgIHJlZGF1YihzdHJ1Y3QgZWFzeWNhcCAqLCB2b2lkICosIHZvaWQgKiwgXAogCQkJCQkJaW50LCBpbnQsIF9fdTgsIF9fdTgsIGJvb2wpOwotdm9pZCAgICAgICAgICAgICBkZWJyaWVmKHN0cnVjdCBlYXN5Y2FwICopOwotdm9pZCAgICAgICAgICAgICBzYXlyZWFkb25seShzdHJ1Y3QgZWFzeWNhcCAqKTsKIHZvaWQgICAgICAgICAgICAgZWFzeWNhcF90ZXN0Y2FyZChzdHJ1Y3QgZWFzeWNhcCAqLCBpbnQpOwotaW50ICAgICAgICAgICAgICBleHBsYWluX2lvY3RsKF9fdTMyKTsKLWludCAgICAgICAgICAgICAgZXhwbGFpbl9jaWQoX191MzIpOwogaW50ICAgICAgICAgICAgICBmaWxsaW5fZm9ybWF0cyh2b2lkKTsKK2ludCAgICAgICAgICAgICAgcmVzZXQoc3RydWN0IGVhc3ljYXAgKik7CitpbnQgICAgICAgICAgICAgIG5ld2lucHV0KHN0cnVjdCBlYXN5Y2FwICosIGludCk7CiBpbnQgICAgICAgICAgICAgIGFkanVzdF9zdGFuZGFyZChzdHJ1Y3QgZWFzeWNhcCAqLCB2NGwyX3N0ZF9pZCk7CiBpbnQgICAgICAgICAgICAgIGFkanVzdF9mb3JtYXQoc3RydWN0IGVhc3ljYXAgKiwgX191MzIsIF9fdTMyLCBfX3UzMiwgXAogCQkJCQkJCQlpbnQsIGJvb2wpOwpAQCAtNTEyLDcgKzUzNywxMCBAQAogc3NpemVfdCAgICAgICAgICBlYXN5c25kX3JlYWQoc3RydWN0IGZpbGUgKiwgY2hhciBfX3VzZXIgKiwgc2l6ZV90LCBsb2ZmX3QgKik7CiBpbnQgICAgICAgICAgICAgIGVhc3lzbmRfb3BlbihzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGZpbGUgKik7CiBpbnQgICAgICAgICAgICAgIGVhc3lzbmRfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGZpbGUgKik7Ci1sb25nICAgICAgICAgICAgIGVhc3lzbmRfaW9jdGwoc3RydWN0IGZpbGUgKiwgdW5zaWduZWQgaW50LCAgdW5zaWduZWQgbG9uZyk7Citsb25nICAgICAgICAgICAgIGVhc3lzbmRfaW9jdGxfbm9pbm9kZShzdHJ1Y3QgZmlsZSAqLCB1bnNpZ25lZCBpbnQsIFwKKwkJCQkJCQkJdW5zaWduZWQgbG9uZyk7CitpbnQgICAgICAgICAgICAgIGVhc3lzbmRfaW9jdGwoc3RydWN0IGlub2RlICosIHN0cnVjdCBmaWxlICosIHVuc2lnbmVkIGludCwgXAorCQkJCQkJCQl1bnNpZ25lZCBsb25nKTsKIHVuc2lnbmVkIGludCAgICAgZWFzeXNuZF9wb2xsKHN0cnVjdCBmaWxlICosIHBvbGxfdGFibGUgKik7CiB2b2lkICAgICAgICAgICAgIGVhc3lzbmRfZGVsZXRlKHN0cnVjdCBrcmVmICopOwogaW50ICAgICAgICAgICAgICBzdWJtaXRfYXVkaW9fdXJicyhzdHJ1Y3QgZWFzeWNhcCAqKTsKQEAgLTUzMiwxMSArNTYwLDExIEBACiBpbnQgICAgICAgICAgICAgIGNvbmZpcm1fcmVzb2x1dGlvbihzdHJ1Y3QgdXNiX2RldmljZSAqKTsKIGludCAgICAgICAgICAgICAgY29uZmlybV9zdHJlYW0oc3RydWN0IHVzYl9kZXZpY2UgKik7CiAKLWludCAgICAgICAgICAgICAgc2V0dXBfc3RrKHN0cnVjdCB1c2JfZGV2aWNlICopOwotaW50ICAgICAgICAgICAgICBzZXR1cF9zYWEoc3RydWN0IHVzYl9kZXZpY2UgKik7CitpbnQgICAgICAgICAgICAgIHNldHVwX3N0ayhzdHJ1Y3QgdXNiX2RldmljZSAqLCBib29sKTsKK2ludCAgICAgICAgICAgICAgc2V0dXBfc2FhKHN0cnVjdCB1c2JfZGV2aWNlICosIGJvb2wpOwogaW50ICAgICAgICAgICAgICBzZXR1cF92dChzdHJ1Y3QgdXNiX2RldmljZSAqKTsKLWludCAgICAgICAgICAgICAgY2hlY2tfc3RrKHN0cnVjdCB1c2JfZGV2aWNlICopOwotaW50ICAgICAgICAgICAgICBjaGVja19zYWEoc3RydWN0IHVzYl9kZXZpY2UgKik7CitpbnQgICAgICAgICAgICAgIGNoZWNrX3N0ayhzdHJ1Y3QgdXNiX2RldmljZSAqLCBib29sKTsKK2ludCAgICAgICAgICAgICAgY2hlY2tfc2FhKHN0cnVjdCB1c2JfZGV2aWNlICosIGJvb2wpOwogaW50ICAgICAgICAgICAgICByZWFkeV9zYWEoc3RydWN0IHVzYl9kZXZpY2UgKik7CiBpbnQgICAgICAgICAgICAgIG1lcml0X3NhYShzdHJ1Y3QgdXNiX2RldmljZSAqKTsKIGludCAgICAgICAgICAgICAgY2hlY2tfdnQoc3RydWN0IHVzYl9kZXZpY2UgKik7CkBAIC01NTQsMTIgKzU4Miw5IEBACiBpbnQgICAgICAgICAgICAgIHdyaXRlXzMwMChzdHJ1Y3QgdXNiX2RldmljZSAqKTsKIGludCAgICAgICAgICAgICAgcmVhZF92dChzdHJ1Y3QgdXNiX2RldmljZSAqLCBfX3UxNik7CiBpbnQgICAgICAgICAgICAgIHdyaXRlX3Z0KHN0cnVjdCB1c2JfZGV2aWNlICosIF9fdTE2LCBfX3UxNik7Ci0KLWludCAgICAgICAgICAgICAgc2V0MnRvNzgoc3RydWN0IHVzYl9kZXZpY2UgKik7Ci1pbnQgICAgICAgICAgICAgIHNldDJ0bzkzKHN0cnVjdCB1c2JfZGV2aWNlICopOwotCiBpbnQgICAgICAgICAgICAgIHJlZ3NldChzdHJ1Y3QgdXNiX2RldmljZSAqLCBfX3UxNiwgX191MTYpOwogaW50ICAgICAgICAgICAgICByZWdnZXQoc3RydWN0IHVzYl9kZXZpY2UgKiwgX191MTYsIHZvaWQgKik7CitpbnQJCWlzZG9uZ2xlKHN0cnVjdCBlYXN5Y2FwICopOwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogc3RydWN0IHNpZ25lZF9kaXZfcmVzdWx0IHsKIGxvbmcgbG9uZyBpbnQgcXVvdGllbnQ7CkBAIC01ODcsMjQgKzYxMiw0MSBAQAogCX0gXAogfSB3aGlsZSAoMCkKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQorLyoKKyAqICBNQUNST1MgU0FNKC4uLikgQU5EIEpPTSguLi4pIEFMTE9XIERJQUdOT1NUSUMgT1VUUFVUIFRPIEJFIFRBR0dFRCBXSVRICisgKiAgVEhFIElERU5USVRZIE9GIFRIRSBET05HTEUgVE8gV0hJQ0ggSVQgQVBQTElFUywgQlVUIElGIElOVk9LRUQgV0hFTiBUSEUKKyAqICBQT0lOVEVSIHBlYXN5Y2FwIElTIElOVkFMSUQgQU4gT29wcyBJUyBMSUtFTFksIEFORCBJVFMgQ0FVU0UgTUFZIE5PVCBCRQorICogIElNTUVESUFURUxZIE9CVklPVVMgRlJPTSBBIENBU1VBTCBSRUFESU5HIE9GIFRIRSBTT1VSQ0UgQ09ERS4gIEJFV0FSRS4KKyovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAjZGVmaW5lIFNBWShmb3JtYXQsIGFyZ3MuLi4pIGRvIHsgXAotCXByaW50ayhLRVJOX0RFQlVHICJlYXN5Y2FwOiAlczogIiBmb3JtYXQsIF9fZnVuY19fLCAjI2FyZ3MpOyBcCisJcHJpbnRrKEtFUk5fREVCVUcgImVhc3ljYXA6OiAlczogIiBcCisJCQlmb3JtYXQsIF9fZnVuY19fLCAjI2FyZ3MpOyBcCiB9IHdoaWxlICgwKQotCisjZGVmaW5lIFNBTShmb3JtYXQsIGFyZ3MuLi4pIGRvIHsgXAorCXByaW50ayhLRVJOX0RFQlVHICJlYXN5Y2FwOjolaSVzOiAiIFwKKwkJCWZvcm1hdCwgcGVhc3ljYXAtPmlzZG9uZ2xlLCBfX2Z1bmNfXywgIyNhcmdzKTtcCit9IHdoaWxlICgwKQogCiAjaWYgZGVmaW5lZChFQVNZQ0FQX0RFQlVHKQogI2RlZmluZSBKT1QobiwgZm9ybWF0LCBhcmdzLi4uKSBkbyB7IFwKIAlpZiAobiA8PSBlYXN5Y2FwX2RlYnVnKSB7IFwKLQkJcHJpbnRrKEtFUk5fREVCVUcgImVhc3ljYXA6ICVzOiAiIGZvcm1hdCwgX19mdW5jX18sICMjYXJncyk7IFwKKwkJcHJpbnRrKEtFUk5fREVCVUcgImVhc3ljYXA6OiAlczogIiBcCisJCQlmb3JtYXQsIF9fZnVuY19fLCAjI2FyZ3MpO1wKIAl9IFwKIH0gd2hpbGUgKDApCisjZGVmaW5lIEpPTShuLCBmb3JtYXQsIGFyZ3MuLi4pIGRvIHsgXAorCWlmIChuIDw9IGVhc3ljYXBfZGVidWcpIHsgXAorCQlwcmludGsoS0VSTl9ERUJVRyAiZWFzeWNhcDo6JWklczogIiBcCisJCQlmb3JtYXQsIHBlYXN5Y2FwLT5pc2RvbmdsZSwgX19mdW5jX18sICMjYXJncyk7XAorCX0gXAorfSB3aGlsZSAoMCkKKwogI2Vsc2UKICNkZWZpbmUgSk9UKG4sIGZvcm1hdCwgYXJncy4uLikgZG8ge30gd2hpbGUgKDApCisjZGVmaW5lIEpPTShuLCBmb3JtYXQsIGFyZ3MuLi4pIGRvIHt9IHdoaWxlICgwKQogI2VuZGlmIC8qRUFTWUNBUF9ERUJVRyovCiAKLSNkZWZpbmUgUE9VVCBKT1QoOCwgIjotKGluIGZpbGUgJXMgbGluZSAlNGlcbiIsIF9fRklMRV9fLCBfX0xJTkVfXykKLQogI2RlZmluZSBNSUNST1NFQ09ORFMoWCwgWSkgXAogCQkJKCgxMDAwMDAwKigobG9uZyBsb25nIGludCkoWC50dl9zZWMgLSBZLnR2X3NlYykpKSArIFwKIAkJCQkJKGxvbmcgbG9uZyBpbnQpKFgudHZfdXNlYyAtIFkudHZfdXNlYykpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZWFzeWNhcC9lYXN5Y2FwX2RlYnVnLmggYi9kcml2ZXJzL3N0YWdpbmcvZWFzeWNhcC9lYXN5Y2FwX2RlYnVnLmgKaW5kZXggMWQxMGQ3ZS4uYjZiNTcxOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2Vhc3ljYXAvZWFzeWNhcF9kZWJ1Zy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lYXN5Y2FwL2Vhc3ljYXBfZGVidWcuaApAQCAtMjUsMyArMjUsNSBAQAogKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIGV4dGVybiBpbnQgZWFzeWNhcF9kZWJ1ZzsKK2V4dGVybiBpbnQgZWFzeWNhcF9nYWluOworZXh0ZXJuIHN0cnVjdCBlYXN5Y2FwX2RvbmdsZSBlYXN5Y2FwX2RvbmdsZVtdOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2Vhc3ljYXAvZWFzeWNhcF9pb2N0bC5jIGIvZHJpdmVycy9zdGFnaW5nL2Vhc3ljYXAvZWFzeWNhcF9pb2N0bC5jCmluZGV4IDlhNDJhZTAuLjQ0Nzk1M2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9lYXN5Y2FwL2Vhc3ljYXBfaW9jdGwuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZWFzeWNhcC9lYXN5Y2FwX2lvY3RsLmMKQEAgLTM2LDUzICszNiwxMDEgQEAKICAqICBVTkxFU1MgVEhFUkUgSVMgQSBQUkVNQVRVUkUgRVJST1IgUkVUVVJOIFRISVMgUk9VVElORSBVUERBVEVTIFRIRQogICogIEZPTExPV0lORzoKICAqICAgICAgICAgIHBlYXN5Y2FwLT5zdGFuZGFyZF9vZmZzZXQKKyAqICAgICAgICAgIHBlYXN5Y2FwLT5pbnB1dHNldFtwZWFzeWNhcC0+aW5wdXRdLnN0YW5kYXJkX29mZnNldAogICogICAgICAgICAgcGVhc3ljYXAtPmZwcwogICogICAgICAgICAgcGVhc3ljYXAtPnVzZWMKICAqICAgICAgICAgIHBlYXN5Y2FwLT50b2xlcmF0ZQorICogICAgICAgICAgcGVhc3ljYXAtPnNraXAKICAqLwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogaW50IGFkanVzdF9zdGFuZGFyZChzdHJ1Y3QgZWFzeWNhcCAqcGVhc3ljYXAsIHY0bDJfc3RkX2lkIHN0ZF9pZCkKIHsKIHN0cnVjdCBlYXN5Y2FwX3N0YW5kYXJkIGNvbnN0ICpwZWFzeWNhcF9zdGFuZGFyZDsKIF9fdTE2IHJlZywgc2V0OwotaW50IGlyLCByYywgbmVlZDsKK2ludCBpciwgcmMsIG5lZWQsIGs7CiB1bnNpZ25lZCBpbnQgaXR3YXMsIGlzbm93OworYm9vbCByZXN1Ym1pdDsKIAoraWYgKE5VTEwgPT0gcGVhc3ljYXApIHsKKwlTQVkoIkVSUk9SOiBwZWFzeWNhcCBpcyBOVUxMXG4iKTsKKwlyZXR1cm4gLUVGQVVMVDsKK30KIGlmICgoc3RydWN0IHVzYl9kZXZpY2UgKilOVUxMID09IHBlYXN5Y2FwLT5wdXNiX2RldmljZSkgewotCVNBWSgiRVJST1I6IHBlYXN5Y2FwLT5wdXNiX2RldmljZSBpcyBOVUxMXG4iKTsKKwlTQU0oIkVSUk9SOiBwZWFzeWNhcC0+cHVzYl9kZXZpY2UgaXMgTlVMTFxuIik7CiAJcmV0dXJuIC1FRkFVTFQ7CiB9CiBwZWFzeWNhcF9zdGFuZGFyZCA9ICZlYXN5Y2FwX3N0YW5kYXJkWzBdOwogd2hpbGUgKDB4RkZGRiAhPSBwZWFzeWNhcF9zdGFuZGFyZC0+bWFzaykgewotCWlmIChzdGRfaWQgJiBwZWFzeWNhcF9zdGFuZGFyZC0+djRsMl9zdGFuZGFyZC5pZCkKKwlpZiAoc3RkX2lkID09IHBlYXN5Y2FwX3N0YW5kYXJkLT52NGwyX3N0YW5kYXJkLmlkKQogCQlicmVhazsKIAlwZWFzeWNhcF9zdGFuZGFyZCsrOwogfQogaWYgKDB4RkZGRiA9PSBwZWFzeWNhcF9zdGFuZGFyZC0+bWFzaykgewotCVNBWSgiRVJST1I6IDB4JTA4WD1zdGRfaWQ6IHN0YW5kYXJkIG5vdCBmb3VuZFxuIiwgXAorCXBlYXN5Y2FwX3N0YW5kYXJkID0gJmVhc3ljYXBfc3RhbmRhcmRbMF07CisJd2hpbGUgKDB4RkZGRiAhPSBwZWFzeWNhcF9zdGFuZGFyZC0+bWFzaykgeworCQlpZiAoc3RkX2lkICYgcGVhc3ljYXBfc3RhbmRhcmQtPnY0bDJfc3RhbmRhcmQuaWQpCisJCQlicmVhazsKKwkJcGVhc3ljYXBfc3RhbmRhcmQrKzsKKwl9Cit9CitpZiAoMHhGRkZGID09IHBlYXN5Y2FwX3N0YW5kYXJkLT5tYXNrKSB7CisJU0FNKCJFUlJPUjogMHglMDhYPXN0ZF9pZDogc3RhbmRhcmQgbm90IGZvdW5kXG4iLCBcCiAJCQkJCQkJKHVuc2lnbmVkIGludClzdGRfaWQpOwogCXJldHVybiAtRUlOVkFMOwogfQotU0FZKCJ1c2VyIHJlcXVlc3RzIHN0YW5kYXJkOiAlc1xuIiwgXAorU0FNKCJzZWxlY3RlZCBzdGFuZGFyZDogJXNcbiIsIFwKIAkJCSYocGVhc3ljYXBfc3RhbmRhcmQtPnY0bDJfc3RhbmRhcmQubmFtZVswXSkpOwogaWYgKHBlYXN5Y2FwLT5zdGFuZGFyZF9vZmZzZXQgPT0gXAogCQkJKGludCkocGVhc3ljYXBfc3RhbmRhcmQgLSAmZWFzeWNhcF9zdGFuZGFyZFswXSkpIHsKLQlTQVkoInJlcXVlc3RlZCBzdGFuZGFyZCBhbHJlYWR5IGluIGVmZmVjdFxuIik7CisJU0FNKCJyZXF1ZXN0ZWQgc3RhbmRhcmQgYWxyZWFkeSBpbiBlZmZlY3RcbiIpOwogCXJldHVybiAwOwogfQogcGVhc3ljYXAtPnN0YW5kYXJkX29mZnNldCA9IChpbnQpKHBlYXN5Y2FwX3N0YW5kYXJkIC0gJmVhc3ljYXBfc3RhbmRhcmRbMF0pOworZm9yIChrID0gMDsgayA8IElOUFVUX01BTlk7ICBrKyspIHsKKwlpZiAoIXBlYXN5Y2FwLT5pbnB1dHNldFtrXS5zdGFuZGFyZF9vZmZzZXRfb2spIHsKKwkJCXBlYXN5Y2FwLT5pbnB1dHNldFtrXS5zdGFuZGFyZF9vZmZzZXQgPSBcCisJCQkJCQlwZWFzeWNhcC0+c3RhbmRhcmRfb2Zmc2V0OworCX0KK30KK2lmICgoMCA8PSBwZWFzeWNhcC0+aW5wdXQpICYmIChJTlBVVF9NQU5ZID4gcGVhc3ljYXAtPmlucHV0KSkgeworCXBlYXN5Y2FwLT5pbnB1dHNldFtwZWFzeWNhcC0+aW5wdXRdLnN0YW5kYXJkX29mZnNldCA9IFwKKwkJCQkJCXBlYXN5Y2FwLT5zdGFuZGFyZF9vZmZzZXQ7CisJcGVhc3ljYXAtPmlucHV0c2V0W3BlYXN5Y2FwLT5pbnB1dF0uc3RhbmRhcmRfb2Zmc2V0X29rID0gMTsKK30gZWxzZQorCUpPTSg4LCAiJWk9cGVhc3ljYXAtPmlucHV0XG4iLCBwZWFzeWNhcC0+aW5wdXQpOwogcGVhc3ljYXAtPmZwcyA9IHBlYXN5Y2FwX3N0YW5kYXJkLT52NGwyX3N0YW5kYXJkLmZyYW1lcGVyaW9kLmRlbm9taW5hdG9yIC8gXAogCQlwZWFzeWNhcF9zdGFuZGFyZC0+djRsMl9zdGFuZGFyZC5mcmFtZXBlcmlvZC5udW1lcmF0b3I7Ci1pZiAoIXBlYXN5Y2FwLT5mcHMpIHsKLQlTQVkoIk1JU1RBS0U6IGZyYW1lcy1wZXItc2Vjb25kIGlzIHplcm9cbiIpOwotCXJldHVybiAtRUZBVUxUOworc3dpdGNoIChwZWFzeWNhcC0+ZnBzKSB7CitjYXNlIDY6CitjYXNlIDMwOiB7CisJcGVhc3ljYXAtPm50c2MgPSB0cnVlOworCWJyZWFrOwogfQotSk9UKDgsICIlaSBmcmFtZXMtcGVyLXNlY29uZFxuIiwgcGVhc3ljYXAtPmZwcyk7Ci1wZWFzeWNhcC0+dXNlYyA9IDEwMDAwMDAgLyAoMiAqIHBlYXN5Y2FwLT5mcHMpOwotcGVhc3ljYXAtPnRvbGVyYXRlID0gMTAwMCAqICgyNSAvIHBlYXN5Y2FwLT5mcHMpOwotCi1raWxsX3ZpZGVvX3VyYnMocGVhc3ljYXApOwotCitjYXNlIDU6CitjYXNlIDI1OiB7CisJcGVhc3ljYXAtPm50c2MgPSBmYWxzZTsKKwlicmVhazsKK30KK2RlZmF1bHQ6IHsKKwlTQU0oIk1JU1RBS0U6ICVpPWZyYW1lcy1wZXItc2Vjb25kXG4iLCBwZWFzeWNhcC0+ZnBzKTsKKwlyZXR1cm4gLUVOT0VOVDsKK30KK30KK0pPTSg4LCAiJWkgZnJhbWVzLXBlci1zZWNvbmRcbiIsIHBlYXN5Y2FwLT5mcHMpOworaWYgKDB4ODAwMCAmIHBlYXN5Y2FwX3N0YW5kYXJkLT5tYXNrKSB7CisJcGVhc3ljYXAtPnNraXAgPSA1OworCXBlYXN5Y2FwLT51c2VjID0gMTAwMDAwMCAvICgyICogKDUgKiBwZWFzeWNhcC0+ZnBzKSk7CisJcGVhc3ljYXAtPnRvbGVyYXRlID0gMTAwMCAqICgyNSAvICg1ICogcGVhc3ljYXAtPmZwcykpOworfSBlbHNlIHsKKwlwZWFzeWNhcC0+c2tpcCA9IDA7CisJcGVhc3ljYXAtPnVzZWMgPSAxMDAwMDAwIC8gKDIgKiBwZWFzeWNhcC0+ZnBzKTsKKwlwZWFzeWNhcC0+dG9sZXJhdGUgPSAxMDAwICogKDI1IC8gcGVhc3ljYXAtPmZwcyk7Cit9CitpZiAocGVhc3ljYXAtPnZpZGVvX2lzb2Nfc3RyZWFtaW5nKSB7CisJcmVzdWJtaXQgPSB0cnVlOworCWtpbGxfdmlkZW9fdXJicyhwZWFzeWNhcCk7Cit9IGVsc2UKKwlyZXN1Ym1pdCA9IGZhbHNlOwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKgogICogIFNBQTcxMTNIIERBVEFTSEVFVCBQQUdFIDQ0LCBUQUJMRSA0MgpAQCAtOTQsNTUgKzE0Miw0MSBAQAogCXJlZyA9IDB4MEE7ICBzZXQgPSAweDk1OwogCWlyID0gcmVhZF9zYWEocGVhc3ljYXAtPnB1c2JfZGV2aWNlLCByZWcpOwogCWlmICgwID4gaXIpCi0JCVNBWSgiRVJST1I6IGNhbm5vdCByZWFkIFNBQSByZWdpc3RlciAweCUwMlhcbiIsIHJlZyk7CisJCVNBTSgiRVJST1I6IGNhbm5vdCByZWFkIFNBQSByZWdpc3RlciAweCUwMlhcbiIsIHJlZyk7CiAJZWxzZQogCQlpdHdhcyA9ICh1bnNpZ25lZCBpbnQpaXI7Ci0KLQotCXNldDJ0bzc4KHBlYXN5Y2FwLT5wdXNiX2RldmljZSk7Ci0KLQogCXJjID0gd3JpdGVfc2FhKHBlYXN5Y2FwLT5wdXNiX2RldmljZSwgcmVnLCBzZXQpOwogCWlmICgwICE9IHJjKQotCQlTQVkoIkVSUk9SOiBmYWlsZWQgdG8gc2V0IFNBQSByZWdpc3RlciAiIFwKKwkJU0FNKCJFUlJPUjogZmFpbGVkIHRvIHNldCBTQUEgcmVnaXN0ZXIgIiBcCiAJCQkiMHglMDJYIHRvIDB4JTAyWCBmb3IgSlAgc3RhbmRhcmRcbiIsIHJlZywgc2V0KTsKIAllbHNlIHsKIAkJaXNub3cgPSAodW5zaWduZWQgaW50KXJlYWRfc2FhKHBlYXN5Y2FwLT5wdXNiX2RldmljZSwgcmVnKTsKIAkJaWYgKDAgPiBpcikKLQkJCUpPVCg4LCAiU0FBIHJlZ2lzdGVyIDB4JTAyWCBjaGFuZ2VkICIgXAorCQkJSk9NKDgsICJTQUEgcmVnaXN0ZXIgMHglMDJYIGNoYW5nZWQgIiBcCiAJCQkJInRvIDB4JTAyWFxuIiwgcmVnLCBpc25vdyk7CiAJCWVsc2UKLQkJCUpPVCg4LCAiU0FBIHJlZ2lzdGVyIDB4JTAyWCBjaGFuZ2VkICIgXAorCQkJSk9NKDgsICJTQUEgcmVnaXN0ZXIgMHglMDJYIGNoYW5nZWQgIiBcCiAJCQkJImZyb20gMHglMDJYIHRvIDB4JTAyWFxuIiwgcmVnLCBpdHdhcywgaXNub3cpOwotCi0JCXNldDJ0bzc4KHBlYXN5Y2FwLT5wdXNiX2RldmljZSk7Ci0KIAl9CiAKIAlyZWcgPSAweDBCOyAgc2V0ID0gMHg0ODsKIAlpciA9IHJlYWRfc2FhKHBlYXN5Y2FwLT5wdXNiX2RldmljZSwgcmVnKTsKIAlpZiAoMCA+IGlyKQotCQlTQVkoIkVSUk9SOiBjYW5ub3QgcmVhZCBTQUEgcmVnaXN0ZXIgMHglMDJYXG4iLCByZWcpOworCQlTQU0oIkVSUk9SOiBjYW5ub3QgcmVhZCBTQUEgcmVnaXN0ZXIgMHglMDJYXG4iLCByZWcpOwogCWVsc2UKIAkJaXR3YXMgPSAodW5zaWduZWQgaW50KWlyOwotCi0Jc2V0MnRvNzgocGVhc3ljYXAtPnB1c2JfZGV2aWNlKTsKLQogCXJjID0gd3JpdGVfc2FhKHBlYXN5Y2FwLT5wdXNiX2RldmljZSwgcmVnLCBzZXQpOwogCWlmICgwICE9IHJjKQotCQlTQVkoIkVSUk9SOiBmYWlsZWQgdG8gc2V0IFNBQSByZWdpc3RlciAweCUwMlggdG8gMHglMDJYICIgXAorCQlTQU0oIkVSUk9SOiBmYWlsZWQgdG8gc2V0IFNBQSByZWdpc3RlciAweCUwMlggdG8gMHglMDJYICIgXAogCQkJCQkJImZvciBKUCBzdGFuZGFyZFxuIiwgcmVnLCBzZXQpOwogCWVsc2UgewogCQlpc25vdyA9ICh1bnNpZ25lZCBpbnQpcmVhZF9zYWEocGVhc3ljYXAtPnB1c2JfZGV2aWNlLCByZWcpOwogCQlpZiAoMCA+IGlyKQotCQkJSk9UKDgsICJTQUEgcmVnaXN0ZXIgMHglMDJYIGNoYW5nZWQgIiBcCisJCQlKT00oOCwgIlNBQSByZWdpc3RlciAweCUwMlggY2hhbmdlZCAiIFwKIAkJCQkidG8gMHglMDJYXG4iLCByZWcsIGlzbm93KTsKIAkJZWxzZQotCQkJSk9UKDgsICJTQUEgcmVnaXN0ZXIgMHglMDJYIGNoYW5nZWQgIiBcCisJCQlKT00oOCwgIlNBQSByZWdpc3RlciAweCUwMlggY2hhbmdlZCAiIFwKIAkJCQkiZnJvbSAweCUwMlggdG8gMHglMDJYXG4iLCByZWcsIGl0d2FzLCBpc25vdyk7Ci0KLQkJc2V0MnRvNzgocGVhc3ljYXAtPnB1c2JfZGV2aWNlKTsKLQogCX0KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyoKQEAgLTE3NiwyMyArMjEwLDIwIEBACiBpZiAobmVlZCkgewogCWlyID0gcmVhZF9zYWEocGVhc3ljYXAtPnB1c2JfZGV2aWNlLCByZWcpOwogCWlmICgwID4gaXIpCi0JCVNBWSgiRVJST1I6IGZhaWxlZCB0byByZWFkIFNBQSByZWdpc3RlciAweCUwMlhcbiIsIHJlZyk7CisJCVNBTSgiRVJST1I6IGZhaWxlZCB0byByZWFkIFNBQSByZWdpc3RlciAweCUwMlhcbiIsIHJlZyk7CiAJZWxzZQogCQlpdHdhcyA9ICh1bnNpZ25lZCBpbnQpaXI7Ci0KLQlzZXQydG83OChwZWFzeWNhcC0+cHVzYl9kZXZpY2UpOwotCiAJcmMgPSB3cml0ZV9zYWEocGVhc3ljYXAtPnB1c2JfZGV2aWNlLCByZWcsIHNldCk7CiAJaWYgKDAgIT0gd3JpdGVfc2FhKHBlYXN5Y2FwLT5wdXNiX2RldmljZSwgcmVnLCBzZXQpKSB7Ci0JCVNBWSgiRVJST1I6IGZhaWxlZCB0byBzZXQgU0FBIHJlZ2lzdGVyICIgXAorCQlTQU0oIkVSUk9SOiBmYWlsZWQgdG8gc2V0IFNBQSByZWdpc3RlciAiIFwKIAkJCSIweCUwMlggdG8gMHglMDJYIGZvciB0YWJsZSA0MlxuIiwgcmVnLCBzZXQpOwogCX0gZWxzZSB7CiAJCWlzbm93ID0gKHVuc2lnbmVkIGludClyZWFkX3NhYShwZWFzeWNhcC0+cHVzYl9kZXZpY2UsIHJlZyk7CiAJCWlmICgwID4gaXIpCi0JCQlKT1QoOCwgIlNBQSByZWdpc3RlciAweCUwMlggY2hhbmdlZCAiIFwKKwkJCUpPTSg4LCAiU0FBIHJlZ2lzdGVyIDB4JTAyWCBjaGFuZ2VkICIgXAogCQkJCSJ0byAweCUwMlhcbiIsIHJlZywgaXNub3cpOwogCQllbHNlCi0JCQlKT1QoOCwgIlNBQSByZWdpc3RlciAweCUwMlggY2hhbmdlZCAiIFwKKwkJCUpPTSg4LCAiU0FBIHJlZ2lzdGVyIDB4JTAyWCBjaGFuZ2VkICIgXAogCQkJCSJmcm9tIDB4JTAyWCB0byAweCUwMlhcbiIsIHJlZywgaXR3YXMsIGlzbm93KTsKIAl9CiB9CkBAIC0yMDQsNyArMjM1LDcgQEAKIHJlZyA9IDB4MDg7CiBpciA9IHJlYWRfc2FhKHBlYXN5Y2FwLT5wdXNiX2RldmljZSwgcmVnKTsKIGlmICgwID4gaXIpCi0JU0FZKCJFUlJPUjogZmFpbGVkIHRvIHJlYWQgU0FBIHJlZ2lzdGVyIDB4JTAyWCAiIFwKKwlTQU0oIkVSUk9SOiBmYWlsZWQgdG8gcmVhZCBTQUEgcmVnaXN0ZXIgMHglMDJYICIgXAogCQkJCQkJInNvIGNhbm5vdCByZXNldFxuIiwgcmVnKTsKIGVsc2UgewogCWl0d2FzID0gKHVuc2lnbmVkIGludClpcjsKQEAgLTIxMiwxOSArMjQzLDE4IEBACiAJCXNldCA9IGl0d2FzIHwgMHg0MCA7CiAJZWxzZQogCQlzZXQgPSBpdHdhcyAmIH4weDQwIDsKLQotc2V0MnRvNzgocGVhc3ljYXAtPnB1c2JfZGV2aWNlKTsKLQotcmMgID0gd3JpdGVfc2FhKHBlYXN5Y2FwLT5wdXNiX2RldmljZSwgcmVnLCBzZXQpOwotaWYgKDAgIT0gcmMpCi0JU0FZKCJFUlJPUjogZmFpbGVkIHRvIHNldCBTQUEgcmVnaXN0ZXIgMHglMDJYIHRvIDB4JTAyWFxuIiwgcmVnLCBzZXQpOwotZWxzZSB7Ci0JaXNub3cgPSAodW5zaWduZWQgaW50KXJlYWRfc2FhKHBlYXN5Y2FwLT5wdXNiX2RldmljZSwgcmVnKTsKLQlpZiAoMCA+IGlyKQotCQlKT1QoOCwgIlNBQSByZWdpc3RlciAweCUwMlggY2hhbmdlZCB0byAweCUwMlhcbiIsIHJlZywgaXNub3cpOwotCWVsc2UKLQkJSk9UKDgsICJTQUEgcmVnaXN0ZXIgMHglMDJYIGNoYW5nZWQgIiBcCi0JCQkiZnJvbSAweCUwMlggdG8gMHglMDJYXG4iLCByZWcsIGl0d2FzLCBpc25vdyk7CisJcmMgID0gd3JpdGVfc2FhKHBlYXN5Y2FwLT5wdXNiX2RldmljZSwgcmVnLCBzZXQpOworCWlmICgwICE9IHJjKQorCQlTQU0oIkVSUk9SOiBmYWlsZWQgdG8gc2V0IFNBQSByZWdpc3RlciAweCUwMlggdG8gMHglMDJYXG4iLCBcCisJCQkJCQkJCXJlZywgc2V0KTsKKwllbHNlIHsKKwkJaXNub3cgPSAodW5zaWduZWQgaW50KXJlYWRfc2FhKHBlYXN5Y2FwLT5wdXNiX2RldmljZSwgcmVnKTsKKwkJaWYgKDAgPiBpcikKKwkJCUpPTSg4LCAiU0FBIHJlZ2lzdGVyIDB4JTAyWCBjaGFuZ2VkIHRvIDB4JTAyWFxuIiwgXAorCQkJCQkJCQlyZWcsIGlzbm93KTsKKwkJZWxzZQorCQkJSk9NKDgsICJTQUEgcmVnaXN0ZXIgMHglMDJYIGNoYW5nZWQgIiBcCisJCQkJImZyb20gMHglMDJYIHRvIDB4JTAyWFxuIiwgcmVnLCBpdHdhcywgaXNub3cpOwogCX0KIH0KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpAQCAtMjM1LDcgKzI2NSw3IEBACiByZWcgPSAweDQwOwogaXIgPSByZWFkX3NhYShwZWFzeWNhcC0+cHVzYl9kZXZpY2UsIHJlZyk7CiBpZiAoMCA+IGlyKQotCVNBWSgiRVJST1I6IGZhaWxlZCB0byByZWFkIFNBQSByZWdpc3RlciAweCUwMlggIiBcCisJU0FNKCJFUlJPUjogZmFpbGVkIHRvIHJlYWQgU0FBIHJlZ2lzdGVyIDB4JTAyWCAiIFwKIAkJCQkJCSJzbyBjYW5ub3QgcmVzZXRcbiIsIHJlZyk7CiBlbHNlIHsKIAlpdHdhcyA9ICh1bnNpZ25lZCBpbnQpaXI7CkBAIC0yNDMsMTkgKzI3MywxOCBAQAogCQlzZXQgPSBpdHdhcyB8IDB4ODAgOwogCWVsc2UKIAkJc2V0ID0gaXR3YXMgJiB+MHg4MCA7Ci0KLXNldDJ0bzc4KHBlYXN5Y2FwLT5wdXNiX2RldmljZSk7Ci0KLXJjID0gd3JpdGVfc2FhKHBlYXN5Y2FwLT5wdXNiX2RldmljZSwgcmVnLCBzZXQpOwotaWYgKDAgIT0gcmMpCi0JU0FZKCJFUlJPUjogZmFpbGVkIHRvIHNldCBTQUEgcmVnaXN0ZXIgMHglMDJYIHRvIDB4JTAyWFxuIiwgcmVnLCBzZXQpOwotZWxzZSB7Ci0JaXNub3cgPSAodW5zaWduZWQgaW50KXJlYWRfc2FhKHBlYXN5Y2FwLT5wdXNiX2RldmljZSwgcmVnKTsKLQlpZiAoMCA+IGlyKQotCQlKT1QoOCwgIlNBQSByZWdpc3RlciAweCUwMlggY2hhbmdlZCB0byAweCUwMlhcbiIsIHJlZywgaXNub3cpOwotCWVsc2UKLQkJSk9UKDgsICJTQUEgcmVnaXN0ZXIgMHglMDJYIGNoYW5nZWQgIiBcCi0JCQkiZnJvbSAweCUwMlggdG8gMHglMDJYXG4iLCByZWcsIGl0d2FzLCBpc25vdyk7CisJcmMgPSB3cml0ZV9zYWEocGVhc3ljYXAtPnB1c2JfZGV2aWNlLCByZWcsIHNldCk7CisJaWYgKDAgIT0gcmMpCisJCVNBTSgiRVJST1I6IGZhaWxlZCB0byBzZXQgU0FBIHJlZ2lzdGVyIDB4JTAyWCB0byAweCUwMlhcbiIsIFwKKwkJCQkJCQkJcmVnLCBzZXQpOworCWVsc2UgeworCQlpc25vdyA9ICh1bnNpZ25lZCBpbnQpcmVhZF9zYWEocGVhc3ljYXAtPnB1c2JfZGV2aWNlLCByZWcpOworCQlpZiAoMCA+IGlyKQorCQkJSk9NKDgsICJTQUEgcmVnaXN0ZXIgMHglMDJYIGNoYW5nZWQgdG8gMHglMDJYXG4iLCBcCisJCQkJCQkJCXJlZywgaXNub3cpOworCQllbHNlCisJCQlKT00oOCwgIlNBQSByZWdpc3RlciAweCUwMlggY2hhbmdlZCAiIFwKKwkJCQkiZnJvbSAweCUwMlggdG8gMHglMDJYXG4iLCByZWcsIGl0d2FzLCBpc25vdyk7CiAJfQogfQogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCkBAIC0yNjYsNDEgKzI5NSwzOSBAQAogcmVnID0gMHg1QTsKIGlyID0gcmVhZF9zYWEocGVhc3ljYXAtPnB1c2JfZGV2aWNlLCByZWcpOwogaWYgKDAgPiBpcikKLQlTQVkoIkVSUk9SOiBmYWlsZWQgdG8gcmVhZCBTQUEgcmVnaXN0ZXIgMHglMDJYIGJ1dCBjb250aW51aW5nXG4iLCByZWcpOworCVNBTSgiRVJST1I6IGZhaWxlZCB0byByZWFkIFNBQSByZWdpc3RlciAweCUwMlggYnV0IGNvbnRpbnVpbmdcbiIsIHJlZyk7CiAJaXR3YXMgPSAodW5zaWduZWQgaW50KWlyOwogCWlmIChwZWFzeWNhcF9zdGFuZGFyZC0+bWFzayAmIDB4MDAwMSkKIAkJc2V0ID0gMHgwQSA7CiAJZWxzZQogCQlzZXQgPSAweDA3IDsKLQotCXNldDJ0bzc4KHBlYXN5Y2FwLT5wdXNiX2RldmljZSk7Ci0KIAlpZiAoMCAhPSB3cml0ZV9zYWEocGVhc3ljYXAtPnB1c2JfZGV2aWNlLCByZWcsIHNldCkpCi0JCVNBWSgiRVJST1I6IGZhaWxlZCB0byBzZXQgU0FBIHJlZ2lzdGVyIDB4JTAyWCB0byAweCUwMlhcbiIsIFwKKwkJU0FNKCJFUlJPUjogZmFpbGVkIHRvIHNldCBTQUEgcmVnaXN0ZXIgMHglMDJYIHRvIDB4JTAyWFxuIiwgXAogCQkJCQkJCQlyZWcsIHNldCk7CiAJZWxzZSB7CiAJCWlzbm93ID0gKHVuc2lnbmVkIGludClyZWFkX3NhYShwZWFzeWNhcC0+cHVzYl9kZXZpY2UsIHJlZyk7CiAJCWlmICgwID4gaXIpCi0JCQlKT1QoOCwgIlNBQSByZWdpc3RlciAweCUwMlggY2hhbmdlZCAiCisJCQlKT00oOCwgIlNBQSByZWdpc3RlciAweCUwMlggY2hhbmdlZCAiCiAJCQkJInRvIDB4JTAyWFxuIiwgcmVnLCBpc25vdyk7CiAJCWVsc2UKLQkJCUpPVCg4LCAiU0FBIHJlZ2lzdGVyIDB4JTAyWCBjaGFuZ2VkICIKKwkJCUpPTSg4LCAiU0FBIHJlZ2lzdGVyIDB4JTAyWCBjaGFuZ2VkICIKIAkJCQkiZnJvbSAweCUwMlggdG8gMHglMDJYXG4iLCByZWcsIGl0d2FzLCBpc25vdyk7CiAJfQotCWlmICgwICE9IGNoZWNrX3NhYShwZWFzeWNhcC0+cHVzYl9kZXZpY2UpKQotCQlTQVkoIkVSUk9SOiBjaGVja19zYWEoKSBmYWlsZWRcbiIpOworaWYgKHRydWUgPT0gcmVzdWJtaXQpCisJc3VibWl0X3ZpZGVvX3VyYnMocGVhc3ljYXApOwogcmV0dXJuIDA7CiB9CiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8qCi0gKiAgVEhFIEFMR09SSVRITSBGT1IgUkVTUE9ORElORyBUTyBUSEUgVklESU9fU19GTVQgSU9DVEwgREVQRU5EUyBPTiBUSEUKLSAqICBDVVJSRU5UIFZBTFVFIE9GIHBlYXN5Y2FwLT5zdGFuZGFyZF9vZmZzZXQuCisgKiAgVEhFIEFMR09SSVRITSBGT1IgUkVTUE9ORElORyBUTyBUSEUgVklESU9fU19GTVQgSU9DVEwgUkVRVUlSRVMKKyAqICBBIFZBTElEIFZBTFVFIE9GIHBlYXN5Y2FwLT5zdGFuZGFyZF9vZmZzZXQsIE9USEVSV0lTRSAtRUJVU1kgSVMgUkVUVVJORUQuCisgKgogICogIFBST1ZJREVEIFRIRSBBUkdVTUVOVCB0cnkgSVMgZmFsc2UgQU5EIFRIRVJFIElTIE5PIFBSRU1BVFVSRSBFUlJPUiBSRVRVUk4KICAqICBUSElTIFJPVVRJTkUgVVBEQVRFUyBUSEUgRk9MTE9XSU5HOgogICogICAgICAgICAgcGVhc3ljYXAtPmZvcm1hdF9vZmZzZXQKKyAqICAgICAgICAgIHBlYXN5Y2FwLT5pbnB1dHNldFtwZWFzeWNhcC0+aW5wdXRdLmZvcm1hdF9vZmZzZXQKICAqICAgICAgICAgIHBlYXN5Y2FwLT5waXhlbGZvcm1hdAotICogICAgICAgICAgcGVhc3ljYXAtPmZpZWxkCiAgKiAgICAgICAgICBwZWFzeWNhcC0+aGVpZ2h0CiAgKiAgICAgICAgICBwZWFzeWNhcC0+d2lkdGgKICAqICAgICAgICAgIHBlYXN5Y2FwLT5ieXRlc3BlcnBpeGVsCkBAIC0zMjEsMzkgKzM0OCw5MyBAQAogc3RydWN0IGVhc3ljYXBfZm9ybWF0ICpwZWFzeWNhcF9mb3JtYXQsICpwZWFzeWNhcF9iZXN0X2Zvcm1hdDsKIF9fdTE2IG1hc2s7CiBzdHJ1Y3QgdXNiX2RldmljZSAqcDsKLWludCBtaXNzLCBtdWx0aXBsaWVyLCBiZXN0OwotY2hhciBiZls1XSwgKnBjOworaW50IG1pc3MsIG11bHRpcGxpZXIsIGJlc3QsIGs7CitjaGFyIGJmWzVdLCBmb1szMl0sICpwYzsKIF9fdTMyIHVjOworYm9vbCByZXN1Ym1pdDsKIAotaWYgKChzdHJ1Y3QgZWFzeWNhcCAqKU5VTEwgPT0gcGVhc3ljYXApIHsKK2lmIChOVUxMID09IHBlYXN5Y2FwKSB7CiAJU0FZKCJFUlJPUjogcGVhc3ljYXAgaXMgTlVMTFxuIik7CiAJcmV0dXJuIC1FRkFVTFQ7CiB9CitpZiAoMCA+IHBlYXN5Y2FwLT5zdGFuZGFyZF9vZmZzZXQpIHsKKwlKT00oOCwgIiVpPXBlYXN5Y2FwLT5zdGFuZGFyZF9vZmZzZXRcbiIsIHBlYXN5Y2FwLT5zdGFuZGFyZF9vZmZzZXQpOworCXJldHVybiAtRUJVU1k7Cit9CiBwID0gcGVhc3ljYXAtPnB1c2JfZGV2aWNlOwogaWYgKChzdHJ1Y3QgdXNiX2RldmljZSAqKU5VTEwgPT0gcCkgewotCVNBWSgiRVJST1I6IHBlYXljYXAtPnB1c2JfZGV2aWNlIGlzIE5VTExcbiIpOworCVNBTSgiRVJST1I6IHBlYXljYXAtPnB1c2JfZGV2aWNlIGlzIE5VTExcbiIpOwogCXJldHVybiAtRUZBVUxUOwogfQogcGMgPSAmYmZbMF07Ci11YyA9IHBpeGVsZm9ybWF0OyAgbWVtY3B5KCh2b2lkICopcGMsICh2b2lkICopKCZ1YyksIDQpOyAgYmZbNF0gPSAwOwotbWFzayA9IGVhc3ljYXBfc3RhbmRhcmRbcGVhc3ljYXAtPnN0YW5kYXJkX29mZnNldF0ubWFzazsKLVNBWSgic291Z2h0OiAgICAlaXglaSwlcygweCUwOFgpLCVpPWZpZWxkLDB4JTAyWD1zdGQgbWFza1xuIiwgXAordWMgPSBwaXhlbGZvcm1hdDsKK21lbWNweSgodm9pZCAqKXBjLCAodm9pZCAqKSgmdWMpLCA0KTsKK2JmWzRdID0gMDsKK21hc2sgPSAweEZGICYgZWFzeWNhcF9zdGFuZGFyZFtwZWFzeWNhcC0+c3RhbmRhcmRfb2Zmc2V0XS5tYXNrOworU0FNKCJzb3VnaHQ6ICAgICVpeCVpLCVzKDB4JTA4WCksJWk9ZmllbGQsMHglMDJYPXN0ZCBtYXNrXG4iLCBcCiAJCQkJd2lkdGgsIGhlaWdodCwgcGMsIHBpeGVsZm9ybWF0LCBmaWVsZCwgbWFzayk7Citzd2l0Y2ggKGZpZWxkKSB7CitjYXNlIFY0TDJfRklFTERfQU5ZOiB7CisJc3RyY3B5KCZmb1swXSwgIlY0TDJfRklFTERfQU5ZICIpOworCWJyZWFrOworfQorY2FzZSBWNEwyX0ZJRUxEX05PTkU6IHsKKwlzdHJjcHkoJmZvWzBdLCAiVjRMMl9GSUVMRF9OT05FIik7CisJYnJlYWs7Cit9CitjYXNlIFY0TDJfRklFTERfVE9QOiB7CisJc3RyY3B5KCZmb1swXSwgIlY0TDJfRklFTERfVE9QIik7CisJYnJlYWs7Cit9CitjYXNlIFY0TDJfRklFTERfQk9UVE9NOiB7CisJc3RyY3B5KCZmb1swXSwgIlY0TDJfRklFTERfQk9UVE9NIik7CisJYnJlYWs7Cit9CitjYXNlIFY0TDJfRklFTERfSU5URVJMQUNFRDogeworCXN0cmNweSgmZm9bMF0sICJWNEwyX0ZJRUxEX0lOVEVSTEFDRUQiKTsKKwlicmVhazsKK30KK2Nhc2UgVjRMMl9GSUVMRF9TRVFfVEI6IHsKKwlzdHJjcHkoJmZvWzBdLCAiVjRMMl9GSUVMRF9TRVFfVEIiKTsKKwlicmVhazsKK30KK2Nhc2UgVjRMMl9GSUVMRF9TRVFfQlQ6IHsKKwlzdHJjcHkoJmZvWzBdLCAiVjRMMl9GSUVMRF9TRVFfQlQiKTsKKwlicmVhazsKK30KK2Nhc2UgVjRMMl9GSUVMRF9BTFRFUk5BVEU6IHsKKwlzdHJjcHkoJmZvWzBdLCAiVjRMMl9GSUVMRF9BTFRFUk5BVEUiKTsKKwlicmVhazsKK30KK2Nhc2UgVjRMMl9GSUVMRF9JTlRFUkxBQ0VEX1RCOiB7CisJc3RyY3B5KCZmb1swXSwgIlY0TDJfRklFTERfSU5URVJMQUNFRF9UQiIpOworCWJyZWFrOworfQorY2FzZSBWNEwyX0ZJRUxEX0lOVEVSTEFDRURfQlQ6IHsKKwlzdHJjcHkoJmZvWzBdLCAiVjRMMl9GSUVMRF9JTlRFUkxBQ0VEX0JUIik7CisJYnJlYWs7Cit9CitkZWZhdWx0OiB7CisJc3RyY3B5KCZmb1swXSwgIlY0TDJfRklFTERfLi4uIFVOS05PV04gICIpOworCWJyZWFrOworfQorfQorU0FNKCJzb3VnaHQ6ICAgICVzXG4iLCAmZm9bMF0pOwogaWYgKFY0TDJfRklFTERfQU5ZID09IGZpZWxkKSB7Ci0JZmllbGQgPSBWNEwyX0ZJRUxEX0lOVEVSTEFDRUQ7Ci0JU0FZKCJwcmVmZXI6ICAgIFY0TDJfRklFTERfSU5URVJMQUNFRD1maWVsZCwgd2FzIFY0TDJfRklFTERfQU5ZXG4iKTsKKwlmaWVsZCA9IFY0TDJfRklFTERfTk9ORTsKKwlTQU0oInByZWZlcjogICAgVjRMMl9GSUVMRF9OT05FPWZpZWxkLCB3YXMgVjRMMl9GSUVMRF9BTllcbiIpOwogfQogcGVhc3ljYXBfYmVzdF9mb3JtYXQgPSAoc3RydWN0IGVhc3ljYXBfZm9ybWF0ICopTlVMTDsKIHBlYXN5Y2FwX2Zvcm1hdCA9ICZlYXN5Y2FwX2Zvcm1hdFswXTsKIHdoaWxlICgwICE9IHBlYXN5Y2FwX2Zvcm1hdC0+djRsMl9mb3JtYXQuZm10LnBpeC53aWR0aCkgewotCUpPVCgxNiwgIi4+ICVpICVpIDB4JTA4WCAlaXglaVxuIiwgXAorCUpPTSgxNiwgIi4+ICVpICVpIDB4JTA4WCAlaXglaVxuIiwgXAogCQlwZWFzeWNhcF9mb3JtYXQtPm1hc2sgJiAweDAxLAogCQlwZWFzeWNhcF9mb3JtYXQtPnY0bDJfZm9ybWF0LmZtdC5waXguZmllbGQsCiAJCXBlYXN5Y2FwX2Zvcm1hdC0+djRsMl9mb3JtYXQuZm10LnBpeC5waXhlbGZvcm1hdCwKIAkJcGVhc3ljYXBfZm9ybWF0LT52NGwyX2Zvcm1hdC5mbXQucGl4LndpZHRoLAogCQlwZWFzeWNhcF9mb3JtYXQtPnY0bDJfZm9ybWF0LmZtdC5waXguaGVpZ2h0KTsKIAotCWlmICgoKHBlYXN5Y2FwX2Zvcm1hdC0+bWFzayAmIDB4MEYpID09IChtYXNrICYgMHgwRikpICYmIFwKKwlpZiAoKChwZWFzeWNhcF9mb3JtYXQtPm1hc2sgJiAweDFGKSA9PSAobWFzayAmIDB4MUYpKSAmJiBcCiAJCShwZWFzeWNhcF9mb3JtYXQtPnY0bDJfZm9ybWF0LmZtdC5waXguZmllbGQgPT0gZmllbGQpICYmIFwKIAkJKHBlYXN5Y2FwX2Zvcm1hdC0+djRsMl9mb3JtYXQuZm10LnBpeC5waXhlbGZvcm1hdCA9PSBcCiAJCQkJCQkJcGl4ZWxmb3JtYXQpICYmIFwKQEAgLTM2NSwxMSArNDQ2LDExIEBACiAJcGVhc3ljYXBfZm9ybWF0Kys7CiB9CiBpZiAoMCA9PSBwZWFzeWNhcF9mb3JtYXQtPnY0bDJfZm9ybWF0LmZtdC5waXgud2lkdGgpIHsKLQlTQVkoImNhbm5vdCBkbzogJWl4JWkgd2l0aCBzdGFuZGFyZCBtYXNrIDB4JTAyWFxuIiwgXAorCVNBTSgiY2Fubm90IGRvOiAlaXglaSB3aXRoIHN0YW5kYXJkIG1hc2sgMHglMDJYXG4iLCBcCiAJCQkJCQkJd2lkdGgsIGhlaWdodCwgbWFzayk7CiAJcGVhc3ljYXBfZm9ybWF0ID0gJmVhc3ljYXBfZm9ybWF0WzBdOyAgYmVzdCA9IC0xOwogCXdoaWxlICgwICE9IHBlYXN5Y2FwX2Zvcm1hdC0+djRsMl9mb3JtYXQuZm10LnBpeC53aWR0aCkgewotCQlpZiAoKChwZWFzeWNhcF9mb3JtYXQtPm1hc2sgJiAweDBGKSA9PSAobWFzayAmIDB4MEYpKSAmJiBcCisJCWlmICgoKHBlYXN5Y2FwX2Zvcm1hdC0+bWFzayAmIDB4MUYpID09IChtYXNrICYgMHgxRikpICYmIFwKIAkJCQkgKHBlYXN5Y2FwX2Zvcm1hdC0+djRsMl9mb3JtYXQuZm10LnBpeFwKIAkJCQkJCS5maWVsZCA9PSBmaWVsZCkgJiYgXAogCQkJCSAocGVhc3ljYXBfZm9ybWF0LT52NGwyX2Zvcm1hdC5mbXQucGl4XApAQCAtMzg2LDE2ICs0NjcsMTYgQEAKIAkJcGVhc3ljYXBfZm9ybWF0Kys7CiAJfQogCWlmICgtMSA9PSBiZXN0KSB7Ci0JCVNBWSgiY2Fubm90IGRvICVpeC4uLiB3aXRoIHN0YW5kYXJkIG1hc2sgMHglMDJYXG4iLCBcCisJCVNBTSgiY2Fubm90IGRvICVpeC4uLiB3aXRoIHN0YW5kYXJkIG1hc2sgMHglMDJYXG4iLCBcCiAJCQkJCQkJCXdpZHRoLCBtYXNrKTsKLQkJU0FZKCJjYW5ub3QgZG8gLi4ueCVpIHdpdGggc3RhbmRhcmQgbWFzayAweCUwMlhcbiIsIFwKKwkJU0FNKCJjYW5ub3QgZG8gLi4ueCVpIHdpdGggc3RhbmRhcmQgbWFzayAweCUwMlhcbiIsIFwKIAkJCQkJCQkJaGVpZ2h0LCBtYXNrKTsKLQkJU0FZKCIgICAgICAgICAgICVpeCVpIHVubWF0Y2hlZFxuIiwgd2lkdGgsIGhlaWdodCk7CisJCVNBTSgiICAgICAgICAgICAlaXglaSB1bm1hdGNoZWRcbiIsIHdpZHRoLCBoZWlnaHQpOwogCQlyZXR1cm4gcGVhc3ljYXAtPmZvcm1hdF9vZmZzZXQ7CiAJfQogfQogaWYgKChzdHJ1Y3QgZWFzeWNhcF9mb3JtYXQgKilOVUxMID09IHBlYXN5Y2FwX2Jlc3RfZm9ybWF0KSB7Ci0JU0FZKCJNSVNUQUtFOiBwZWFzeWNhcF9iZXN0X2Zvcm1hdCBpcyBOVUxMIik7CisJU0FNKCJNSVNUQUtFOiBwZWFzeWNhcF9iZXN0X2Zvcm1hdCBpcyBOVUxMIik7CiAJcmV0dXJuIC1FSU5WQUw7CiB9CiBwZWFzeWNhcF9mb3JtYXQgPSBwZWFzeWNhcF9iZXN0X2Zvcm1hdDsKQEAgLTQwNiwyMyArNDg3LDQzIEBACiAvKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiovCiAKIGlmIChmYWxzZSAhPSB0cnkpIHsKLQlTQVkoIk1JU1RBS0U6IHRydWU9PXRyeSB3aGVyZSBpcyBzaG91bGQgYmUgZmFsc2VcbiIpOworCVNBTSgiTUlTVEFLRTogdHJ1ZT09dHJ5IHdoZXJlIGlzIHNob3VsZCBiZSBmYWxzZVxuIik7CiAJcmV0dXJuIC1FSU5WQUw7CiB9Ci1TQVkoImFjdGlvbmluZzogJWl4JWkgJXNcbiIsIFwKK1NBTSgiYWN0aW9uaW5nOiAlaXglaSAlc1xuIiwgXAogCQkJcGVhc3ljYXBfZm9ybWF0LT52NGwyX2Zvcm1hdC5mbXQucGl4LndpZHRoLCBcCiAJCQlwZWFzeWNhcF9mb3JtYXQtPnY0bDJfZm9ybWF0LmZtdC5waXguaGVpZ2h0LAogCQkJJnBlYXN5Y2FwX2Zvcm1hdC0+bmFtZVswXSk7CiBwZWFzeWNhcC0+aGVpZ2h0ICAgICAgICA9IHBlYXN5Y2FwX2Zvcm1hdC0+djRsMl9mb3JtYXQuZm10LnBpeC5oZWlnaHQ7CiBwZWFzeWNhcC0+d2lkdGggICAgICAgICA9IHBlYXN5Y2FwX2Zvcm1hdC0+djRsMl9mb3JtYXQuZm10LnBpeC53aWR0aDsKIHBlYXN5Y2FwLT5waXhlbGZvcm1hdCAgID0gcGVhc3ljYXBfZm9ybWF0LT52NGwyX2Zvcm1hdC5mbXQucGl4LnBpeGVsZm9ybWF0OwotcGVhc3ljYXAtPmZpZWxkICAgICAgICAgPSBwZWFzeWNhcF9mb3JtYXQtPnY0bDJfZm9ybWF0LmZtdC5waXguZmllbGQ7CiBwZWFzeWNhcC0+Zm9ybWF0X29mZnNldCA9IChpbnQpKHBlYXN5Y2FwX2Zvcm1hdCAtICZlYXN5Y2FwX2Zvcm1hdFswXSk7Ci1wZWFzeWNhcC0+Ynl0ZXNwZXJwaXhlbCA9ICgweDAwRjAgJiBwZWFzeWNhcF9mb3JtYXQtPm1hc2spID4+IDQgOworCisKK2ZvciAoayA9IDA7IGsgPCBJTlBVVF9NQU5ZOyBrKyspIHsKKwlpZiAoIXBlYXN5Y2FwLT5pbnB1dHNldFtrXS5mb3JtYXRfb2Zmc2V0X29rKSB7CisJCXBlYXN5Y2FwLT5pbnB1dHNldFtrXS5mb3JtYXRfb2Zmc2V0ID0gXAorCQkJCQkJcGVhc3ljYXAtPmZvcm1hdF9vZmZzZXQ7CisJfQorfQoraWYgKCgwIDw9IHBlYXN5Y2FwLT5pbnB1dCkgJiYgKElOUFVUX01BTlkgPiBwZWFzeWNhcC0+aW5wdXQpKSB7CisJcGVhc3ljYXAtPmlucHV0c2V0W3BlYXN5Y2FwLT5pbnB1dF0uZm9ybWF0X29mZnNldCA9IFwKKwkJCQkJCXBlYXN5Y2FwLT5mb3JtYXRfb2Zmc2V0OworCXBlYXN5Y2FwLT5pbnB1dHNldFtwZWFzeWNhcC0+aW5wdXRdLmZvcm1hdF9vZmZzZXRfb2sgPSAxOworfSBlbHNlCisJSk9NKDgsICIlaT1wZWFzeWNhcC0+aW5wdXRcbiIsIHBlYXN5Y2FwLT5pbnB1dCk7CisKKworCitwZWFzeWNhcC0+Ynl0ZXNwZXJwaXhlbCA9ICgweDAwRTAgJiBwZWFzeWNhcF9mb3JtYXQtPm1hc2spID4+IDUgOwogaWYgKDB4MDEwMCAmIHBlYXN5Y2FwX2Zvcm1hdC0+bWFzaykKIAlwZWFzeWNhcC0+Ynl0ZXN3YXBvcmRlciA9IHRydWU7CiBlbHNlCiAJcGVhc3ljYXAtPmJ5dGVzd2Fwb3JkZXIgPSBmYWxzZTsKK2lmICgweDAyMDAgJiBwZWFzeWNhcF9mb3JtYXQtPm1hc2spCisJcGVhc3ljYXAtPnNraXAgPSA1OworZWxzZQorCXBlYXN5Y2FwLT5za2lwID0gMDsKIGlmICgweDA4MDAgJiBwZWFzeWNhcF9mb3JtYXQtPm1hc2spCiAJcGVhc3ljYXAtPmRlY2ltYXRlcGl4ZWwgPSB0cnVlOwogZWxzZQpAQCAtNDM5LDI3ICs1NDAsMTEgQEAKIAkJCQkJbXVsdGlwbGllciAqIHBlYXN5Y2FwLT5oZWlnaHQ7CiBwZWFzeWNhcC0+ZnJhbWVfYnVmZmVyX3VzZWQgPSBwZWFzeWNhcC0+Ynl0ZXNwZXJwaXhlbCAqIFwKIAkJCQkJcGVhc3ljYXAtPndpZHRoICogcGVhc3ljYXAtPmhlaWdodDsKLQotaWYgKHRydWUgPT0gcGVhc3ljYXAtPm9mZmVyZmllbGRzKSB7Ci0JU0FZKCJXQVJOSU5HOiAlaT1wZWFzeWNhcC0+ZmllbGQgaXMgdW50ZXN0ZWQ6ICIgXAotCQkJCSJwbGVhc2UgcmVwb3J0IHByb2JsZW1zXG4iLCBwZWFzeWNhcC0+ZmllbGQpOwotCi0KLS8qCi0gKiAgICBGSVhNRSAtLS0tIFRISVMgSVMgVU5URVNURUQsIE1BWSBCRSAoQU5EIFBST0JBQkxZIElTKSBJTkNPUlJFQ1Q6Ci0gKgotICogICAgcGVhc3ljYXAtPmZyYW1lX2J1ZmZlcl91c2VkID0gcGVhc3ljYXAtPmZyYW1lX2J1ZmZlcl91c2VkIC8gMjsKLSAqCi0gKiAgICBTTyBETyBOT1QgUklTSyBJVCBZRVQuCi0gKgotICovCi0KLQotCi19Ci0KLWtpbGxfdmlkZW9fdXJicyhwZWFzeWNhcCk7Ci0KK2lmIChwZWFzeWNhcC0+dmlkZW9faXNvY19zdHJlYW1pbmcpIHsKKwlyZXN1Ym1pdCA9IHRydWU7CisJa2lsbF92aWRlb191cmJzKHBlYXN5Y2FwKTsKK30gZWxzZQorCXJlc3VibWl0ID0gZmFsc2U7CiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKgogICogIFBBTApAQCAtNDc0LDEzICs1NTksMTMgQEAKIAkJCSgyODggPT0gXAogCQkJcGVhc3ljYXBfZm9ybWF0LT52NGwyX2Zvcm1hdC5mbXQucGl4LmhlaWdodCkpKSB7CiAJCWlmICgwICE9IHNldF9yZXNvbHV0aW9uKHAsIDB4MDAwMCwgMHgwMDAxLCAweDA1QTAsIDB4MDEyMSkpIHsKLQkJCVNBWSgiRVJST1I6IHNldF9yZXNvbHV0aW9uKCkgZmFpbGVkXG4iKTsKKwkJCVNBTSgiRVJST1I6IHNldF9yZXNvbHV0aW9uKCkgZmFpbGVkXG4iKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAJfSBlbHNlIGlmICgoNzA0ID09IHBlYXN5Y2FwX2Zvcm1hdC0+djRsMl9mb3JtYXQuZm10LnBpeC53aWR0aCkgJiYgXAogCQkJKDU3NiA9PSBwZWFzeWNhcF9mb3JtYXQtPnY0bDJfZm9ybWF0LmZtdC5waXguaGVpZ2h0KSkgewogCQlpZiAoMCAhPSBzZXRfcmVzb2x1dGlvbihwLCAweDAwMDQsIDB4MDAwMSwgMHgwNTg0LCAweDAxMjEpKSB7Ci0JCQlTQVkoIkVSUk9SOiBzZXRfcmVzb2x1dGlvbigpIGZhaWxlZFxuIik7CisJCQlTQU0oIkVSUk9SOiBzZXRfcmVzb2x1dGlvbigpIGZhaWxlZFxuIik7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCX0gZWxzZSBpZiAoKCg2NDAgPT0gcGVhc3ljYXBfZm9ybWF0LT52NGwyX2Zvcm1hdC5mbXQucGl4LndpZHRoKSAmJiBcCkBAIC00OTEsMTEgKzU3NiwxMSBAQAogCQkJKDI0MCA9PSBcCiAJCQlwZWFzeWNhcF9mb3JtYXQtPnY0bDJfZm9ybWF0LmZtdC5waXguaGVpZ2h0KSkpIHsKIAkJaWYgKDAgIT0gc2V0X3Jlc29sdXRpb24ocCwgMHgwMDE0LCAweDAwMjAsIDB4MDUxNCwgMHgwMTEwKSkgewotCQkJU0FZKCJFUlJPUjogc2V0X3Jlc29sdXRpb24oKSBmYWlsZWRcbiIpOworCQkJU0FNKCJFUlJPUjogc2V0X3Jlc29sdXRpb24oKSBmYWlsZWRcbiIpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIAl9IGVsc2UgewotCQlTQVkoIk1JU1RBS0U6IGJhZCBmb3JtYXQsIGNhbm5vdCBzZXQgcmVzb2x1dGlvblxuIik7CisJCVNBTSgiTUlTVEFLRTogYmFkIGZvcm1hdCwgY2Fubm90IHNldCByZXNvbHV0aW9uXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpAQCAtNTEyLDcgKzU5Nyw3IEBACiAJCQkoMjQwID09IFwKIAkJCXBlYXN5Y2FwX2Zvcm1hdC0+djRsMl9mb3JtYXQuZm10LnBpeC5oZWlnaHQpKSkgewogCQlpZiAoMCAhPSBzZXRfcmVzb2x1dGlvbihwLCAweDAwMDAsIDB4MDAwMywgMHgwNUEwLCAweDAwRjMpKSB7Ci0JCQlTQVkoIkVSUk9SOiBzZXRfcmVzb2x1dGlvbigpIGZhaWxlZFxuIik7CisJCQlTQU0oIkVSUk9SOiBzZXRfcmVzb2x1dGlvbigpIGZhaWxlZFxuIik7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCX0gZWxzZSBpZiAoKCg2NDAgPT0gcGVhc3ljYXBfZm9ybWF0LT52NGwyX2Zvcm1hdC5mbXQucGl4LndpZHRoKSAmJiBcCkBAIC01MjMsMjggKzYwOCwzMSBAQAogCQkJKDI0MCA9PSBcCiAJCQlwZWFzeWNhcF9mb3JtYXQtPnY0bDJfZm9ybWF0LmZtdC5waXguaGVpZ2h0KSkpIHsKIAkJaWYgKDAgIT0gc2V0X3Jlc29sdXRpb24ocCwgMHgwMDE0LCAweDAwMDMsIDB4MDUxNCwgMHgwMEYzKSkgewotCQkJU0FZKCJFUlJPUjogc2V0X3Jlc29sdXRpb24oKSBmYWlsZWRcbiIpOworCQkJU0FNKCJFUlJPUjogc2V0X3Jlc29sdXRpb24oKSBmYWlsZWRcbiIpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIAl9IGVsc2UgewotCQlTQVkoIk1JU1RBS0U6IGJhZCBmb3JtYXQsIGNhbm5vdCBzZXQgcmVzb2x1dGlvblxuIik7CisJCVNBTSgiTUlTVEFLRTogYmFkIGZvcm1hdCwgY2Fubm90IHNldCByZXNvbHV0aW9uXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogfQogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1jaGVja19zdGsocGVhc3ljYXAtPnB1c2JfZGV2aWNlKTsKLQoraWYgKHRydWUgPT0gcmVzdWJtaXQpCisJc3VibWl0X3ZpZGVvX3VyYnMocGVhc3ljYXApOwogcmV0dXJuIChpbnQpKHBlYXN5Y2FwX2Jlc3RfZm9ybWF0IC0gJmVhc3ljYXBfZm9ybWF0WzBdKTsKIH0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIGludCBhZGp1c3RfYnJpZ2h0bmVzcyhzdHJ1Y3QgZWFzeWNhcCAqcGVhc3ljYXAsIGludCB2YWx1ZSkKIHsKIHVuc2lnbmVkIGludCBtb29kOwotaW50IGkxOworaW50IGkxLCBrOwogCitpZiAoTlVMTCA9PSBwZWFzeWNhcCkgeworCVNBWSgiRVJST1I6IHBlYXN5Y2FwIGlzIE5VTExcbiIpOworCXJldHVybiAtRUZBVUxUOworfQogaWYgKChzdHJ1Y3QgdXNiX2RldmljZSAqKU5VTEwgPT0gcGVhc3ljYXAtPnB1c2JfZGV2aWNlKSB7Ci0JU0FZKCJFUlJPUjogcGVhc3ljYXAtPnB1c2JfZGV2aWNlIGlzIE5VTExcbiIpOworCVNBTSgiRVJST1I6IHBlYXN5Y2FwLT5wdXNiX2RldmljZSBpcyBOVUxMXG4iKTsKIAlyZXR1cm4gLUVGQVVMVDsKIH0KIGkxID0gMDsKQEAgLTU1MywzNyArNjQxLDU2IEBACiAJCWlmICgoZWFzeWNhcF9jb250cm9sW2kxXS5taW5pbXVtID4gdmFsdWUpIHx8IFwKIAkJCQkJKGVhc3ljYXBfY29udHJvbFtpMV0ubWF4aW11bSA8IHZhbHVlKSkKIAkJCXZhbHVlID0gZWFzeWNhcF9jb250cm9sW2kxXS5kZWZhdWx0X3ZhbHVlOworCisJCWlmICgoZWFzeWNhcF9jb250cm9sW2kxXS5taW5pbXVtIDw9IHBlYXN5Y2FwLT5icmlnaHRuZXNzKSAmJiBcCisJCQkJCShlYXN5Y2FwX2NvbnRyb2xbaTFdLm1heGltdW0gPj0gXAorCQkJCQkJcGVhc3ljYXAtPmJyaWdodG5lc3MpKSB7CisJCQlpZiAocGVhc3ljYXAtPmJyaWdodG5lc3MgPT0gdmFsdWUpIHsKKwkJCQlTQU0oInVuY2hhbmdlZCBicmlnaHRuZXNzIGF0ICAweCUwMlhcbiIsIFwKKwkJCQkJCQkJdmFsdWUpOworCQkJCXJldHVybiAwOworCQkJfQorCQl9CiAJCXBlYXN5Y2FwLT5icmlnaHRuZXNzID0gdmFsdWU7CisJCWZvciAoayA9IDA7IGsgPCBJTlBVVF9NQU5ZOyBrKyspIHsKKwkJCWlmICghcGVhc3ljYXAtPmlucHV0c2V0W2tdLmJyaWdodG5lc3Nfb2spCisJCQkJcGVhc3ljYXAtPmlucHV0c2V0W2tdLmJyaWdodG5lc3MgPSBcCisJCQkJCQkJcGVhc3ljYXAtPmJyaWdodG5lc3M7CisJCX0KKwkJaWYgKCgwIDw9IHBlYXN5Y2FwLT5pbnB1dCkgJiYgKElOUFVUX01BTlkgPiBwZWFzeWNhcC0+aW5wdXQpKSB7CisJCQlwZWFzeWNhcC0+aW5wdXRzZXRbcGVhc3ljYXAtPmlucHV0XS5icmlnaHRuZXNzID0gXAorCQkJCQkJCXBlYXN5Y2FwLT5icmlnaHRuZXNzOworCQkJcGVhc3ljYXAtPmlucHV0c2V0W3BlYXN5Y2FwLT5pbnB1dF0uYnJpZ2h0bmVzc19vayA9IDE7CisJCX0gZWxzZQorCQkJSk9NKDgsICIlaT1wZWFzeWNhcC0+aW5wdXRcbiIsIHBlYXN5Y2FwLT5pbnB1dCk7CiAJCW1vb2QgPSAweDAwRkYgJiAodW5zaWduZWQgaW50KXBlYXN5Y2FwLT5icmlnaHRuZXNzOwotCi0JCXNldDJ0bzc4KHBlYXN5Y2FwLT5wdXNiX2RldmljZSk7Ci0KIAkJaWYgKCF3cml0ZV9zYWEocGVhc3ljYXAtPnB1c2JfZGV2aWNlLCAweDBBLCBtb29kKSkgewotCQkJU0FZKCJhZGp1c3RpbmcgYnJpZ2h0bmVzcyB0byAgMHglMDJYXG4iLCBtb29kKTsKKwkJCVNBTSgiYWRqdXN0aW5nIGJyaWdodG5lc3MgdG8gIDB4JTAyWFxuIiwgbW9vZCk7CiAJCQlyZXR1cm4gMDsKIAkJfSBlbHNlIHsKLQkJCVNBWSgiV0FSTklORzogZmFpbGVkIHRvIGFkanVzdCBicmlnaHRuZXNzICIgXAorCQkJU0FNKCJXQVJOSU5HOiBmYWlsZWQgdG8gYWRqdXN0IGJyaWdodG5lc3MgIiBcCiAJCQkJCQkJInRvIDB4JTAyWFxuIiwgbW9vZCk7CiAJCQlyZXR1cm4gLUVOT0VOVDsKIAkJfQotCi0JCXNldDJ0bzc4KHBlYXN5Y2FwLT5wdXNiX2RldmljZSk7Ci0KIAkJYnJlYWs7CiAJfQogCWkxKys7CiB9Ci1TQVkoIldBUk5JTkc6IGZhaWxlZCB0byBhZGp1c3QgYnJpZ2h0bmVzczogY29udHJvbCBub3QgZm91bmRcbiIpOworU0FNKCJXQVJOSU5HOiBmYWlsZWQgdG8gYWRqdXN0IGJyaWdodG5lc3M6IGNvbnRyb2wgbm90IGZvdW5kXG4iKTsKIHJldHVybiAtRU5PRU5UOwogfQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogaW50IGFkanVzdF9jb250cmFzdChzdHJ1Y3QgZWFzeWNhcCAqcGVhc3ljYXAsIGludCB2YWx1ZSkKIHsKIHVuc2lnbmVkIGludCBtb29kOwotaW50IGkxOworaW50IGkxLCBrOwogCitpZiAoTlVMTCA9PSBwZWFzeWNhcCkgeworCVNBWSgiRVJST1I6IHBlYXN5Y2FwIGlzIE5VTExcbiIpOworCXJldHVybiAtRUZBVUxUOworfQogaWYgKChzdHJ1Y3QgdXNiX2RldmljZSAqKU5VTEwgPT0gcGVhc3ljYXAtPnB1c2JfZGV2aWNlKSB7Ci0JU0FZKCJFUlJPUjogcGVhc3ljYXAtPnB1c2JfZGV2aWNlIGlzIE5VTExcbiIpOworCVNBTSgiRVJST1I6IHBlYXN5Y2FwLT5wdXNiX2RldmljZSBpcyBOVUxMXG4iKTsKIAlyZXR1cm4gLUVGQVVMVDsKIH0KIGkxID0gMDsKQEAgLTU5MiwzNyArNjk5LDU4IEBACiAJCWlmICgoZWFzeWNhcF9jb250cm9sW2kxXS5taW5pbXVtID4gdmFsdWUpIHx8IFwKIAkJCQkJKGVhc3ljYXBfY29udHJvbFtpMV0ubWF4aW11bSA8IHZhbHVlKSkKIAkJCXZhbHVlID0gZWFzeWNhcF9jb250cm9sW2kxXS5kZWZhdWx0X3ZhbHVlOworCisKKworCQlpZiAoKGVhc3ljYXBfY29udHJvbFtpMV0ubWluaW11bSA8PSBwZWFzeWNhcC0+Y29udHJhc3QpICYmIFwKKwkJCQkoZWFzeWNhcF9jb250cm9sW2kxXS5tYXhpbXVtID49IFwKKwkJCQkJCQlwZWFzeWNhcC0+Y29udHJhc3QpKSB7CisJCQlpZiAocGVhc3ljYXAtPmNvbnRyYXN0ID09IHZhbHVlKSB7CisJCQkJU0FNKCJ1bmNoYW5nZWQgY29udHJhc3QgYXQgIDB4JTAyWFxuIiwgdmFsdWUpOworCQkJCXJldHVybiAwOworCQkJfQorCQl9CiAJCXBlYXN5Y2FwLT5jb250cmFzdCA9IHZhbHVlOworCQlmb3IgKGsgPSAwOyBrIDwgSU5QVVRfTUFOWTsgaysrKSB7CisJCQlpZiAoIXBlYXN5Y2FwLT5pbnB1dHNldFtrXS5jb250cmFzdF9vaykgeworCQkJCXBlYXN5Y2FwLT5pbnB1dHNldFtrXS5jb250cmFzdCA9IFwKKwkJCQkJCQlwZWFzeWNhcC0+Y29udHJhc3Q7CisJCQl9CisJCX0KKwkJaWYgKCgwIDw9IHBlYXN5Y2FwLT5pbnB1dCkgJiYgKElOUFVUX01BTlkgPiBwZWFzeWNhcC0+aW5wdXQpKSB7CisJCQlwZWFzeWNhcC0+aW5wdXRzZXRbcGVhc3ljYXAtPmlucHV0XS5jb250cmFzdCA9IFwKKwkJCQkJCQlwZWFzeWNhcC0+Y29udHJhc3Q7CisJCQlwZWFzeWNhcC0+aW5wdXRzZXRbcGVhc3ljYXAtPmlucHV0XS5jb250cmFzdF9vayA9IDE7CisJCX0gZWxzZQorCQkJSk9NKDgsICIlaT1wZWFzeWNhcC0+aW5wdXRcbiIsIHBlYXN5Y2FwLT5pbnB1dCk7CiAJCW1vb2QgPSAweDAwRkYgJiAodW5zaWduZWQgaW50KSAocGVhc3ljYXAtPmNvbnRyYXN0IC0gMTI4KTsKLQotCQlzZXQydG83OChwZWFzeWNhcC0+cHVzYl9kZXZpY2UpOwotCiAJCWlmICghd3JpdGVfc2FhKHBlYXN5Y2FwLT5wdXNiX2RldmljZSwgMHgwQiwgbW9vZCkpIHsKLQkJCVNBWSgiYWRqdXN0aW5nIGNvbnRyYXN0IHRvICAweCUwMlhcbiIsIG1vb2QpOworCQkJU0FNKCJhZGp1c3RpbmcgY29udHJhc3QgdG8gIDB4JTAyWFxuIiwgbW9vZCk7CiAJCQlyZXR1cm4gMDsKIAkJfSBlbHNlIHsKLQkJCVNBWSgiV0FSTklORzogZmFpbGVkIHRvIGFkanVzdCBjb250cmFzdCB0byAiIFwKKwkJCVNBTSgiV0FSTklORzogZmFpbGVkIHRvIGFkanVzdCBjb250cmFzdCB0byAiIFwKIAkJCQkJCQkiMHglMDJYXG4iLCBtb29kKTsKIAkJCXJldHVybiAtRU5PRU5UOwogCQl9Ci0KLQkJc2V0MnRvNzgocGVhc3ljYXAtPnB1c2JfZGV2aWNlKTsKLQogCQlicmVhazsKIAl9CiAJaTErKzsKIH0KLVNBWSgiV0FSTklORzogZmFpbGVkIHRvIGFkanVzdCBjb250cmFzdDogY29udHJvbCBub3QgZm91bmRcbiIpOworU0FNKCJXQVJOSU5HOiBmYWlsZWQgdG8gYWRqdXN0IGNvbnRyYXN0OiBjb250cm9sIG5vdCBmb3VuZFxuIik7CiByZXR1cm4gLUVOT0VOVDsKIH0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIGludCBhZGp1c3Rfc2F0dXJhdGlvbihzdHJ1Y3QgZWFzeWNhcCAqcGVhc3ljYXAsIGludCB2YWx1ZSkKIHsKIHVuc2lnbmVkIGludCBtb29kOwotaW50IGkxOworaW50IGkxLCBrOwogCitpZiAoTlVMTCA9PSBwZWFzeWNhcCkgeworCVNBWSgiRVJST1I6IHBlYXN5Y2FwIGlzIE5VTExcbiIpOworCXJldHVybiAtRUZBVUxUOworfQogaWYgKChzdHJ1Y3QgdXNiX2RldmljZSAqKU5VTEwgPT0gcGVhc3ljYXAtPnB1c2JfZGV2aWNlKSB7Ci0JU0FZKCJFUlJPUjogcGVhc3ljYXAtPnB1c2JfZGV2aWNlIGlzIE5VTExcbiIpOworCVNBTSgiRVJST1I6IHBlYXN5Y2FwLT5wdXNiX2RldmljZSBpcyBOVUxMXG4iKTsKIAlyZXR1cm4gLUVGQVVMVDsKIH0KIGkxID0gMDsKQEAgLTYzMSwzNyArNzU5LDU4IEBACiAJCWlmICgoZWFzeWNhcF9jb250cm9sW2kxXS5taW5pbXVtID4gdmFsdWUpIHx8IFwKIAkJCQkJKGVhc3ljYXBfY29udHJvbFtpMV0ubWF4aW11bSA8IHZhbHVlKSkKIAkJCXZhbHVlID0gZWFzeWNhcF9jb250cm9sW2kxXS5kZWZhdWx0X3ZhbHVlOworCisKKwkJaWYgKChlYXN5Y2FwX2NvbnRyb2xbaTFdLm1pbmltdW0gPD0gcGVhc3ljYXAtPnNhdHVyYXRpb24pICYmIFwKKwkJCQkJKGVhc3ljYXBfY29udHJvbFtpMV0ubWF4aW11bSA+PSBcCisJCQkJCQlwZWFzeWNhcC0+c2F0dXJhdGlvbikpIHsKKwkJCWlmIChwZWFzeWNhcC0+c2F0dXJhdGlvbiA9PSB2YWx1ZSkgeworCQkJCVNBTSgidW5jaGFuZ2VkIHNhdHVyYXRpb24gYXQgIDB4JTAyWFxuIiwgXAorCQkJCQkJCQl2YWx1ZSk7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCX0KIAkJcGVhc3ljYXAtPnNhdHVyYXRpb24gPSB2YWx1ZTsKKwkJZm9yIChrID0gMDsgayA8IElOUFVUX01BTlk7IGsrKykgeworCQkJaWYgKCFwZWFzeWNhcC0+aW5wdXRzZXRba10uc2F0dXJhdGlvbl9vaykgeworCQkJCXBlYXN5Y2FwLT5pbnB1dHNldFtrXS5zYXR1cmF0aW9uID0gXAorCQkJCQkJCXBlYXN5Y2FwLT5zYXR1cmF0aW9uOworCQkJfQorCQl9CisJCWlmICgoMCA8PSBwZWFzeWNhcC0+aW5wdXQpICYmIChJTlBVVF9NQU5ZID4gcGVhc3ljYXAtPmlucHV0KSkgeworCQkJcGVhc3ljYXAtPmlucHV0c2V0W3BlYXN5Y2FwLT5pbnB1dF0uc2F0dXJhdGlvbiA9IFwKKwkJCQkJCQlwZWFzeWNhcC0+c2F0dXJhdGlvbjsKKwkJCXBlYXN5Y2FwLT5pbnB1dHNldFtwZWFzeWNhcC0+aW5wdXRdLnNhdHVyYXRpb25fb2sgPSAxOworCQl9IGVsc2UKKwkJCUpPTSg4LCAiJWk9cGVhc3ljYXAtPmlucHV0XG4iLCBwZWFzeWNhcC0+aW5wdXQpOwogCQltb29kID0gMHgwMEZGICYgKHVuc2lnbmVkIGludCkgKHBlYXN5Y2FwLT5zYXR1cmF0aW9uIC0gMTI4KTsKLQotCQlzZXQydG83OChwZWFzeWNhcC0+cHVzYl9kZXZpY2UpOwotCiAJCWlmICghd3JpdGVfc2FhKHBlYXN5Y2FwLT5wdXNiX2RldmljZSwgMHgwQywgbW9vZCkpIHsKLQkJCVNBWSgiYWRqdXN0aW5nIHNhdHVyYXRpb24gdG8gIDB4JTAyWFxuIiwgbW9vZCk7CisJCQlTQU0oImFkanVzdGluZyBzYXR1cmF0aW9uIHRvICAweCUwMlhcbiIsIG1vb2QpOwogCQkJcmV0dXJuIDA7CiAJCX0gZWxzZSB7Ci0JCQlTQVkoIldBUk5JTkc6IGZhaWxlZCB0byBhZGp1c3Qgc2F0dXJhdGlvbiB0byAiIFwKKwkJCVNBTSgiV0FSTklORzogZmFpbGVkIHRvIGFkanVzdCBzYXR1cmF0aW9uIHRvICIgXAogCQkJCQkJCSIweCUwMlhcbiIsIG1vb2QpOwogCQkJcmV0dXJuIC1FTk9FTlQ7CiAJCX0KIAkJYnJlYWs7Ci0KLQkJc2V0MnRvNzgocGVhc3ljYXAtPnB1c2JfZGV2aWNlKTsKLQogCX0KIAlpMSsrOwogfQotU0FZKCJXQVJOSU5HOiBmYWlsZWQgdG8gYWRqdXN0IHNhdHVyYXRpb246IGNvbnRyb2wgbm90IGZvdW5kXG4iKTsKK1NBTSgiV0FSTklORzogZmFpbGVkIHRvIGFkanVzdCBzYXR1cmF0aW9uOiBjb250cm9sIG5vdCBmb3VuZFxuIik7CiByZXR1cm4gLUVOT0VOVDsKIH0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIGludCBhZGp1c3RfaHVlKHN0cnVjdCBlYXN5Y2FwICpwZWFzeWNhcCwgaW50IHZhbHVlKQogewogdW5zaWduZWQgaW50IG1vb2Q7Ci1pbnQgaTEsIGkyOworaW50IGkxLCBpMiwgazsKIAoraWYgKE5VTEwgPT0gcGVhc3ljYXApIHsKKwlTQVkoIkVSUk9SOiBwZWFzeWNhcCBpcyBOVUxMXG4iKTsKKwlyZXR1cm4gLUVGQVVMVDsKK30KIGlmICgoc3RydWN0IHVzYl9kZXZpY2UgKilOVUxMID09IHBlYXN5Y2FwLT5wdXNiX2RldmljZSkgewotCVNBWSgiRVJST1I6IHBlYXN5Y2FwLT5wdXNiX2RldmljZSBpcyBOVUxMXG4iKTsKKwlTQU0oIkVSUk9SOiBwZWFzeWNhcC0+cHVzYl9kZXZpY2UgaXMgTlVMTFxuIik7CiAJcmV0dXJuIC1FRkFVTFQ7CiB9CiBpMSA9IDA7CkBAIC02NzAsMjcgKzgxOSw0MCBAQAogCQlpZiAoKGVhc3ljYXBfY29udHJvbFtpMV0ubWluaW11bSA+IHZhbHVlKSB8fCBcCiAJCQkJCShlYXN5Y2FwX2NvbnRyb2xbaTFdLm1heGltdW0gPCB2YWx1ZSkpCiAJCQl2YWx1ZSA9IGVhc3ljYXBfY29udHJvbFtpMV0uZGVmYXVsdF92YWx1ZTsKKworCQlpZiAoKGVhc3ljYXBfY29udHJvbFtpMV0ubWluaW11bSA8PSBwZWFzeWNhcC0+aHVlKSAmJiBcCisJCQkJCShlYXN5Y2FwX2NvbnRyb2xbaTFdLm1heGltdW0gPj0gXAorCQkJCQkJCXBlYXN5Y2FwLT5odWUpKSB7CisJCQlpZiAocGVhc3ljYXAtPmh1ZSA9PSB2YWx1ZSkgeworCQkJCVNBTSgidW5jaGFuZ2VkIGh1ZSBhdCAgMHglMDJYXG4iLCB2YWx1ZSk7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCX0KIAkJcGVhc3ljYXAtPmh1ZSA9IHZhbHVlOworCQlmb3IgKGsgPSAwOyBrIDwgSU5QVVRfTUFOWTsgaysrKSB7CisJCQlpZiAoIXBlYXN5Y2FwLT5pbnB1dHNldFtrXS5odWVfb2spCisJCQkJcGVhc3ljYXAtPmlucHV0c2V0W2tdLmh1ZSA9IHBlYXN5Y2FwLT5odWU7CisJCX0KKwkJaWYgKCgwIDw9IHBlYXN5Y2FwLT5pbnB1dCkgJiYgKElOUFVUX01BTlkgPiBwZWFzeWNhcC0+aW5wdXQpKSB7CisJCQlwZWFzeWNhcC0+aW5wdXRzZXRbcGVhc3ljYXAtPmlucHV0XS5odWUgPSBcCisJCQkJCQkJcGVhc3ljYXAtPmh1ZTsKKwkJCXBlYXN5Y2FwLT5pbnB1dHNldFtwZWFzeWNhcC0+aW5wdXRdLmh1ZV9vayA9IDE7CisJCX0gZWxzZQorCQkJSk9NKDgsICIlaT1wZWFzeWNhcC0+aW5wdXRcbiIsIHBlYXN5Y2FwLT5pbnB1dCk7CiAJCWkyID0gcGVhc3ljYXAtPmh1ZSAtIDEyODsKIAkJbW9vZCA9IDB4MDBGRiAmICgoaW50KSBpMik7Ci0KLQkJc2V0MnRvNzgocGVhc3ljYXAtPnB1c2JfZGV2aWNlKTsKLQogCQlpZiAoIXdyaXRlX3NhYShwZWFzeWNhcC0+cHVzYl9kZXZpY2UsIDB4MEQsIG1vb2QpKSB7Ci0JCQlTQVkoImFkanVzdGluZyBodWUgdG8gIDB4JTAyWFxuIiwgbW9vZCk7CisJCQlTQU0oImFkanVzdGluZyBodWUgdG8gIDB4JTAyWFxuIiwgbW9vZCk7CiAJCQlyZXR1cm4gMDsKIAkJfSBlbHNlIHsKLQkJCVNBWSgiV0FSTklORzogZmFpbGVkIHRvIGFkanVzdCBodWUgdG8gMHglMDJYXG4iLCBtb29kKTsKKwkJCVNBTSgiV0FSTklORzogZmFpbGVkIHRvIGFkanVzdCBodWUgdG8gMHglMDJYXG4iLCBtb29kKTsKIAkJCXJldHVybiAtRU5PRU5UOwogCQl9Ci0KLQkJc2V0MnRvNzgocGVhc3ljYXAtPnB1c2JfZGV2aWNlKTsKLQogCQlicmVhazsKIAl9CiAJaTErKzsKIH0KLVNBWSgiV0FSTklORzogZmFpbGVkIHRvIGFkanVzdCBodWU6IGNvbnRyb2wgbm90IGZvdW5kXG4iKTsKK1NBTSgiV0FSTklORzogZmFpbGVkIHRvIGFkanVzdCBodWU6IGNvbnRyb2wgbm90IGZvdW5kXG4iKTsKIHJldHVybiAtRU5PRU5UOwogfQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtNjk5LDMzICs4NjEsNDUgQEAKIF9fczggbW9vZDsKIGludCBpMTsKIAoraWYgKE5VTEwgPT0gcGVhc3ljYXApIHsKKwlTQVkoIkVSUk9SOiBwZWFzeWNhcCBpcyBOVUxMXG4iKTsKKwlyZXR1cm4gLUVGQVVMVDsKK30KIGlmICgoc3RydWN0IHVzYl9kZXZpY2UgKilOVUxMID09IHBlYXN5Y2FwLT5wdXNiX2RldmljZSkgewotCVNBWSgiRVJST1I6IHBlYXN5Y2FwLT5wdXNiX2RldmljZSBpcyBOVUxMXG4iKTsKKwlTQU0oIkVSUk9SOiBwZWFzeWNhcC0+cHVzYl9kZXZpY2UgaXMgTlVMTFxuIik7CiAJcmV0dXJuIC1FRkFVTFQ7CiB9CiBpMSA9IDA7CiB3aGlsZSAoMHhGRkZGRkZGRiAhPSBlYXN5Y2FwX2NvbnRyb2xbaTFdLmlkKSB7CiAJaWYgKFY0TDJfQ0lEX0FVRElPX1ZPTFVNRSA9PSBlYXN5Y2FwX2NvbnRyb2xbaTFdLmlkKSB7CiAJCWlmICgoZWFzeWNhcF9jb250cm9sW2kxXS5taW5pbXVtID4gdmFsdWUpIHx8IFwKLQkJCShlYXN5Y2FwX2NvbnRyb2xbaTFdLm1heGltdW0gPCB2YWx1ZSkpCisJCQkJKGVhc3ljYXBfY29udHJvbFtpMV0ubWF4aW11bSA8IHZhbHVlKSkKIAkJCXZhbHVlID0gZWFzeWNhcF9jb250cm9sW2kxXS5kZWZhdWx0X3ZhbHVlOworCQlpZiAoKGVhc3ljYXBfY29udHJvbFtpMV0ubWluaW11bSA8PSBwZWFzeWNhcC0+dm9sdW1lKSAmJiBcCisJCQkJCShlYXN5Y2FwX2NvbnRyb2xbaTFdLm1heGltdW0gPj0gXAorCQkJCQkJCXBlYXN5Y2FwLT52b2x1bWUpKSB7CisJCQlpZiAocGVhc3ljYXAtPnZvbHVtZSA9PSB2YWx1ZSkgeworCQkJCVNBTSgidW5jaGFuZ2VkIHZvbHVtZSBhdCAgMHglMDJYXG4iLCB2YWx1ZSk7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCX0KIAkJcGVhc3ljYXAtPnZvbHVtZSA9IHZhbHVlOwogCQltb29kID0gKDE2ID4gcGVhc3ljYXAtPnZvbHVtZSkgPyAxNiA6IFwKIAkJCSgoMzEgPCBwZWFzeWNhcC0+dm9sdW1lKSA/IDMxIDogXAogCQkJKF9fczgpIHBlYXN5Y2FwLT52b2x1bWUpOwogCQlpZiAoIWF1ZGlvX2dhaW5zZXQocGVhc3ljYXAtPnB1c2JfZGV2aWNlLCBtb29kKSkgewotCQkJU0FZKCJhZGp1c3Rpbmcgdm9sdW1lIHRvIDB4JTAxWFxuIiwgbW9vZCk7CisJCQlTQU0oImFkanVzdGluZyB2b2x1bWUgdG8gMHglMDJYXG4iLCBtb29kKTsKIAkJCXJldHVybiAwOwogCQl9IGVsc2UgewotCQkJU0FZKCJXQVJOSU5HOiBmYWlsZWQgdG8gYWRqdXN0IHZvbHVtZSB0byAiIFwKLQkJCQkJCQkiMHglMVhcbiIsIG1vb2QpOworCQkJU0FNKCJXQVJOSU5HOiBmYWlsZWQgdG8gYWRqdXN0IHZvbHVtZSB0byAiIFwKKwkJCQkJCQkiMHglMlhcbiIsIG1vb2QpOwogCQkJcmV0dXJuIC1FTk9FTlQ7CiAJCX0KIAkJYnJlYWs7CiAJfQogaTErKzsKIH0KLVNBWSgiV0FSTklORzogZmFpbGVkIHRvIGFkanVzdCB2b2x1bWU6IGNvbnRyb2wgbm90IGZvdW5kXG4iKTsKK1NBTSgiV0FSTklORzogZmFpbGVkIHRvIGFkanVzdCB2b2x1bWU6IGNvbnRyb2wgbm90IGZvdW5kXG4iKTsKIHJldHVybiAtRU5PRU5UOwogfQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtNzQ0LDggKzkxOCwxMiBAQAogewogaW50IGkxOwogCitpZiAoTlVMTCA9PSBwZWFzeWNhcCkgeworCVNBWSgiRVJST1I6IHBlYXN5Y2FwIGlzIE5VTExcbiIpOworCXJldHVybiAtRUZBVUxUOworfQogaWYgKChzdHJ1Y3QgdXNiX2RldmljZSAqKU5VTEwgPT0gcGVhc3ljYXAtPnB1c2JfZGV2aWNlKSB7Ci0JU0FZKCJFUlJPUjogcGVhc3ljYXAtPnB1c2JfZGV2aWNlIGlzIE5VTExcbiIpOworCVNBTSgiRVJST1I6IHBlYXN5Y2FwLT5wdXNiX2RldmljZSBpcyBOVUxMXG4iKTsKIAlyZXR1cm4gLUVGQVVMVDsKIH0KIGkxID0gMDsKQEAgLTc1NiwxMyArOTM0LDEzIEBACiAJCWNhc2UgMTogewogCQkJcGVhc3ljYXAtPmF1ZGlvX2lkbGUgPSAxOwogCQkJcGVhc3ljYXAtPnRpbWV2YWwwLnR2X3NlYyA9IDA7Ci0JCQlTQVkoImFkanVzdGluZyBtdXRlOiAlaT1wZWFzeWNhcC0+YXVkaW9faWRsZVxuIiwgXAorCQkJU0FNKCJhZGp1c3RpbmcgbXV0ZTogJWk9cGVhc3ljYXAtPmF1ZGlvX2lkbGVcbiIsIFwKIAkJCQkJCQlwZWFzeWNhcC0+YXVkaW9faWRsZSk7CiAJCQlyZXR1cm4gMDsKIAkJfQogCQlkZWZhdWx0OiB7CiAJCQlwZWFzeWNhcC0+YXVkaW9faWRsZSA9IDA7Ci0JCQlTQVkoImFkanVzdGluZyBtdXRlOiAlaT1wZWFzeWNhcC0+YXVkaW9faWRsZVxuIiwgXAorCQkJU0FNKCJhZGp1c3RpbmcgbXV0ZTogJWk9cGVhc3ljYXAtPmF1ZGlvX2lkbGVcbiIsIFwKIAkJCQkJCQlwZWFzeWNhcC0+YXVkaW9faWRsZSk7CiAJCQlyZXR1cm4gMDsKIAkJfQpAQCAtNzcxLDQ3ICs5NDksMTA3IEBACiAJfQogCWkxKys7CiB9Ci1TQVkoIldBUk5JTkc6IGZhaWxlZCB0byBhZGp1c3QgbXV0ZTogY29udHJvbCBub3QgZm91bmRcbiIpOworU0FNKCJXQVJOSU5HOiBmYWlsZWQgdG8gYWRqdXN0IG11dGU6IGNvbnRyb2wgbm90IGZvdW5kXG4iKTsKIHJldHVybiAtRU5PRU5UOwogfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXN0YXRpYyBpbnQgZWFzeWNhcF9pb2N0bF9ia2woc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCi0JCQkgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyp2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2Ki8KKyNpZiAoKGRlZmluZWQoRUFTWUNBUF9JU19WSURFT0RFVl9DTElFTlQpKSB8fCBcCisJKGRlZmluZWQoRUFTWUNBUF9ORUVEU19VTkxPQ0tFRF9JT0NUTCkpKQorbG9uZworZWFzeWNhcF9pb2N0bF9ub2lub2RlKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykgeworCXJldHVybiAobG9uZyllYXN5Y2FwX2lvY3RsKChzdHJ1Y3QgaW5vZGUgKilOVUxMLCBmaWxlLCBjbWQsIGFyZyk7Cit9CisjZW5kaWYgLypFQVNZQ0FQX0lTX1ZJREVPREVWX0NMSUVOVHx8RUFTWUNBUF9ORUVEU19VTkxPQ0tFRF9JT0NUTCovCisvKl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl4qLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworaW50CitlYXN5Y2FwX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAorCQkJCQl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKLXN0YXRpYyBzdHJ1Y3QgZWFzeWNhcCAqcGVhc3ljYXA7Ci1zdGF0aWMgc3RydWN0IHVzYl9kZXZpY2UgKnA7Ci1zdGF0aWMgX191MzIgaXNlcXVlbmNlOworc3RydWN0IGVhc3ljYXAgKnBlYXN5Y2FwOworc3RydWN0IHVzYl9kZXZpY2UgKnA7CitpbnQga2Q7CiAKK2lmIChOVUxMID09IGZpbGUpIHsKKwlTQVkoIkVSUk9SOiAgZmlsZSBpcyBOVUxMXG4iKTsKKwlyZXR1cm4gLUVSRVNUQVJUU1lTOworfQogcGVhc3ljYXAgPSBmaWxlLT5wcml2YXRlX2RhdGE7CiBpZiAoTlVMTCA9PSBwZWFzeWNhcCkgewogCVNBWSgiRVJST1I6ICBwZWFzeWNhcCBpcyBOVUxMXG4iKTsKIAlyZXR1cm4gLTE7CiB9Ci1wID0gcGVhc3ljYXAtPnB1c2JfZGV2aWNlOwotaWYgKChzdHJ1Y3QgdXNiX2RldmljZSAqKU5VTEwgPT0gcCkgewotCVNBWSgiRVJST1I6IHBlYXN5Y2FwLT5wdXNiX2RldmljZSBpcyBOVUxMXG4iKTsKK2lmIChtZW1jbXAoJnBlYXN5Y2FwLT50ZWxsdGFsZVswXSwgVEVMTFRBTEUsIHN0cmxlbihURUxMVEFMRSkpKSB7CisJU0FZKCJFUlJPUjogYmFkIHBlYXN5Y2FwXG4iKTsKIAlyZXR1cm4gLUVGQVVMVDsKIH0KK3AgPSBwZWFzeWNhcC0+cHVzYl9kZXZpY2U7CitpZiAoTlVMTCA9PSBwKSB7CisJU0FNKCJFUlJPUjogcGVhc3ljYXAtPnB1c2JfZGV2aWNlIGlzIE5VTExcbiIpOworCXJldHVybiAtRUZBVUxUOworfQora2QgPSBpc2RvbmdsZShwZWFzeWNhcCk7CitpZiAoMCA8PSBrZCAmJiBET05HTEVfTUFOWSA+IGtkKSB7CisJaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X3ZpZGVvKSkgeworCQlTQVkoIkVSUk9SOiBjYW5ub3QgbG9jayBlYXN5Y2FwX2RvbmdsZVslaV0ubXV0ZXhfdmlkZW9cbiIsIGtkKTsKKwkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKwl9CisJSk9NKDQsICJsb2NrZWQgZWFzeWNhcF9kb25nbGVbJWldLm11dGV4X3ZpZGVvXG4iLCBrZCk7CiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKgotICogIE1PU1QgT0YgVEhFIFZBUklBQkxFUyBERUNMQVJFRCBzdGF0aWMgSU4gVEhFIGNhc2V7fSBCTE9DS1MgQkVMT1cgQVJFIFNPCi0gKiAgREVDTEFSRUQgU0lNUExZIFRPIEFWT0lEIEEgQ09NUElMRVIgV0FSTklORyBPRiBUSEUgS0lORDoKLSAqICBlYXN5Y2FwX2lvY3RsLmM6IHdhcm5pbmc6Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgdGhlIGZyYW1lIHNpemUgb2YgLi4uIGJ5dGVzIGlzIGxhcmdlciB0aGFuIDEwMjQgYnl0ZXMKLSAqLworICogIE1FQU5XSElMRSwgZWFzeWNhcF91c2JfZGlzY29ubmVjdCgpIE1BWSBIQVZFIEZSRUVEIFBPSU5URVIgcGVhc3ljYXAsCisgKiAgSU4gV0hJQ0ggQ0FTRSBBIFJFUEVBVCBDQUxMIFRPIGlzZG9uZ2xlKCkgV0lMTCBGQUlMLgorICogIElGIE5FQ0VTU0FSWSwgQkFJTCBPVVQuCisqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCWlmIChrZCAhPSBpc2RvbmdsZShwZWFzeWNhcCkpCisJCXJldHVybiAtRVJFU1RBUlRTWVM7CisJaWYgKE5VTEwgPT0gZmlsZSkgeworCQlTQVkoIkVSUk9SOiAgZmlsZSBpcyBOVUxMXG4iKTsKKwkJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfdmlkZW8pOworCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCX0KKwlwZWFzeWNhcCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlpZiAoTlVMTCA9PSBwZWFzeWNhcCkgeworCQlTQVkoIkVSUk9SOiAgcGVhc3ljYXAgaXMgTlVMTFxuIik7CisJCW11dGV4X3VubG9jaygmZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X3ZpZGVvKTsKKwkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKwl9CisJaWYgKG1lbWNtcCgmcGVhc3ljYXAtPnRlbGx0YWxlWzBdLCBURUxMVEFMRSwgc3RybGVuKFRFTExUQUxFKSkpIHsKKwkJU0FZKCJFUlJPUjogYmFkIHBlYXN5Y2FwXG4iKTsKKwkJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfdmlkZW8pOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisJcCA9IHBlYXN5Y2FwLT5wdXNiX2RldmljZTsKKwlpZiAoTlVMTCA9PSBwZWFzeWNhcC0+cHVzYl9kZXZpY2UpIHsKKwkJU0FNKCJFUlJPUjogcGVhc3ljYXAtPnB1c2JfZGV2aWNlIGlzIE5VTExcbiIpOworCQltdXRleF91bmxvY2soJmVhc3ljYXBfZG9uZ2xlW2tkXS5tdXRleF92aWRlbyk7CisJCXJldHVybiAtRVJFU1RBUlRTWVM7CisJfQorfSBlbHNlIHsKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiAgSUYgZWFzeWNhcF91c2JfZGlzY29ubmVjdCgpIEhBUyBBTFJFQURZIEZSRUVEIFBPSU5URVIgcGVhc3ljYXAgQkVGT1JFIFRIRQorICogIEFUVEVNUFQgVE8gQUNRVUlSRSBUSEUgU0VNQVBIT1JFLCBpc2RvbmdsZSgpIFdJTEwgSEFWRSBGQUlMRUQuICBCQUlMIE9VVC4KKyovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJcmV0dXJuIC1FUkVTVEFSVFNZUzsKK30KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIHN3aXRjaCAoY21kKSB7CiBjYXNlIFZJRElPQ19RVUVSWUNBUDogewotCXN0YXRpYyBzdHJ1Y3QgdjRsMl9jYXBhYmlsaXR5IHY0bDJfY2FwYWJpbGl0eTsKLQlzdGF0aWMgY2hhciB2ZXJzaW9uWzE2XSwgKnAxLCAqcDI7Ci0Jc3RhdGljIGludCBpLCByYywga1szXTsKLQlzdGF0aWMgbG9uZyBsbmc7CisJc3RydWN0IHY0bDJfY2FwYWJpbGl0eSB2NGwyX2NhcGFiaWxpdHk7CisJY2hhciB2ZXJzaW9uWzE2XSwgKnAxLCAqcDI7CisJaW50IGksIHJjLCBrWzNdOworCWxvbmcgbG5nOwogCi0JSk9UKDgsICJWSURJT0NfUVVFUllDQVBcbiIpOworCUpPTSg4LCAiVklESU9DX1FVRVJZQ0FQXG4iKTsKIAogCWlmICgxNiA8PSBzdHJsZW4oRUFTWUNBUF9EUklWRVJfVkVSU0lPTikpIHsKLQkJU0FZKCJFUlJPUjogYmFkIGRyaXZlciB2ZXJzaW9uIHN0cmluZ1xuIik7IHJldHVybiAtRUlOVkFMOworCQlTQU0oIkVSUk9SOiBiYWQgZHJpdmVyIHZlcnNpb24gc3RyaW5nXG4iKTsKKwkJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfdmlkZW8pOworCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAJc3RyY3B5KCZ2ZXJzaW9uWzBdLCBFQVNZQ0FQX0RSSVZFUl9WRVJTSU9OKTsKIAlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQpAQCAtODI2LDggKzEwNjQsOSBAQAogCQlpZiAoMyA+IGkpIHsKIAkJCXJjID0gKGludCkgc3RyaWN0X3N0cnRvbChwMSwgMTAsICZsbmcpOwogCQkJaWYgKDAgIT0gcmMpIHsKLQkJCQlTQVkoIkVSUk9SOiAlaT1zdHJpY3Rfc3RydG9sKCVzLC4sLClcbiIsIFwKKwkJCQlTQU0oIkVSUk9SOiAlaT1zdHJpY3Rfc3RydG9sKCVzLC4sLClcbiIsIFwKIAkJCQkJCQkJcmMsIHAxKTsKKwkJCQltdXRleF91bmxvY2soJmVhc3ljYXBfZG9uZ2xlW2tkXS5tdXRleF92aWRlbyk7CiAJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCQl9CiAJCQlrW2ldID0gKGludClsbmc7CkBAIC04NDQsNyArMTA4Myw3IEBACiAJCQkJVjRMMl9DQVBfQVVESU8gICAgICAgICB8IFY0TDJfQ0FQX1JFQURXUklURTsKIAogCXY0bDJfY2FwYWJpbGl0eS52ZXJzaW9uID0gS0VSTkVMX1ZFUlNJT04oa1swXSwga1sxXSwga1syXSk7Ci0JSk9UKDgsICJ2NGwyX2NhcGFiaWxpdHkudmVyc2lvbj0oJWksJWksJWkpXG4iLCBrWzBdLCBrWzFdLCBrWzJdKTsKKwlKT00oOCwgInY0bDJfY2FwYWJpbGl0eS52ZXJzaW9uPSglaSwlaSwlaSlcbiIsIGtbMF0sIGtbMV0sIGtbMl0pOwogCiAJc3RybGNweSgmdjRsMl9jYXBhYmlsaXR5LmNhcmRbMF0sICJFYXN5Q0FQIERDNjAiLCBcCiAJCXNpemVvZih2NGwyX2NhcGFiaWxpdHkuY2FyZCkpOwpAQCAtODUzLDI2ICsxMDkyLDI2IEBACiAJCQkJc2l6ZW9mKHY0bDJfY2FwYWJpbGl0eS5idXNfaW5mbykpIDwgMCkgewogCQlzdHJsY3B5KCZ2NGwyX2NhcGFiaWxpdHkuYnVzX2luZm9bMF0sICJFYXN5Q0FQIGJ1c19pbmZvIiwgXAogCQkJCQlzaXplb2YodjRsMl9jYXBhYmlsaXR5LmJ1c19pbmZvKSk7Ci0JCUpPVCg4LCAiJXM9djRsMl9jYXBhYmlsaXR5LmJ1c19pbmZvXG4iLCBcCisJCUpPTSg4LCAiJXM9djRsMl9jYXBhYmlsaXR5LmJ1c19pbmZvXG4iLCBcCiAJCQkJCSZ2NGwyX2NhcGFiaWxpdHkuYnVzX2luZm9bMF0pOwogCX0KIAlpZiAoMCAhPSBjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLCAmdjRsMl9jYXBhYmlsaXR5LCBcCiAJCQkJCXNpemVvZihzdHJ1Y3QgdjRsMl9jYXBhYmlsaXR5KSkpIHsKLQkJUE9VVDsKKwkJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfdmlkZW8pOwogCQlyZXR1cm4gLUVGQVVMVDsKIAl9CiAJYnJlYWs7CiB9CiAvKiAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCiBjYXNlIFZJRElPQ19FTlVNSU5QVVQ6IHsKLQlzdGF0aWMgc3RydWN0IHY0bDJfaW5wdXQgdjRsMl9pbnB1dDsKLQlzdGF0aWMgX191MzIgaW5kZXg7CisJc3RydWN0IHY0bDJfaW5wdXQgdjRsMl9pbnB1dDsKKwlfX3UzMiBpbmRleDsKIAotCUpPVCg4LCAiVklESU9DX0VOVU1JTlBVVFxuIik7CisJSk9NKDgsICJWSURJT0NfRU5VTUlOUFVUXG4iKTsKIAogCWlmICgwICE9IGNvcHlfZnJvbV91c2VyKCZ2NGwyX2lucHV0LCAodm9pZCBfX3VzZXIgKilhcmcsIFwKIAkJCQkJc2l6ZW9mKHN0cnVjdCB2NGwyX2lucHV0KSkpIHsKLQkJUE9VVDsKKwkJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfdmlkZW8pOwogCQlyZXR1cm4gLUVGQVVMVDsKIAl9CiAKQEAgLTg4OSw3ICsxMTI4LDcgQEAKIAkJdjRsMl9pbnB1dC5zdGQgPSBWNEwyX1NURF9QQUwgfCBWNEwyX1NURF9TRUNBTSB8IFwKIAkJCQlWNEwyX1NURF9OVFNDIDsKIAkJdjRsMl9pbnB1dC5zdGF0dXMgPSAwOwotCQlKT1QoOCwgIiVpPWluZGV4OiAlc1xuIiwgaW5kZXgsICZ2NGwyX2lucHV0Lm5hbWVbMF0pOworCQlKT00oOCwgIiVpPWluZGV4OiAlc1xuIiwgaW5kZXgsICZ2NGwyX2lucHV0Lm5hbWVbMF0pOwogCQlicmVhazsKIAl9CiAJY2FzZSAxOiB7CkBAIC05MDEsNyArMTE0MCw3IEBACiAJCXY0bDJfaW5wdXQuc3RkID0gVjRMMl9TVERfUEFMIHwgVjRMMl9TVERfU0VDQU0gfCBcCiAJCQkJVjRMMl9TVERfTlRTQyA7CiAJCXY0bDJfaW5wdXQuc3RhdHVzID0gMDsKLQkJSk9UKDgsICIlaT1pbmRleDogJXNcbiIsIGluZGV4LCAmdjRsMl9pbnB1dC5uYW1lWzBdKTsKKwkJSk9NKDgsICIlaT1pbmRleDogJXNcbiIsIGluZGV4LCAmdjRsMl9pbnB1dC5uYW1lWzBdKTsKIAkJYnJlYWs7CiAJfQogCWNhc2UgMjogewpAQCAtOTEzLDcgKzExNTIsNyBAQAogCQl2NGwyX2lucHV0LnN0ZCA9IFY0TDJfU1REX1BBTCB8IFY0TDJfU1REX1NFQ0FNIHwgXAogCQkJCVY0TDJfU1REX05UU0MgOwogCQl2NGwyX2lucHV0LnN0YXR1cyA9IDA7Ci0JCUpPVCg4LCAiJWk9aW5kZXg6ICVzXG4iLCBpbmRleCwgJnY0bDJfaW5wdXQubmFtZVswXSk7CisJCUpPTSg4LCAiJWk9aW5kZXg6ICVzXG4iLCBpbmRleCwgJnY0bDJfaW5wdXQubmFtZVswXSk7CiAJCWJyZWFrOwogCX0KIAljYXNlIDM6IHsKQEAgLTkyNSw3ICsxMTY0LDcgQEAKIAkJdjRsMl9pbnB1dC5zdGQgPSBWNEwyX1NURF9QQUwgfCBWNEwyX1NURF9TRUNBTSB8IFwKIAkJCQlWNEwyX1NURF9OVFNDIDsKIAkJdjRsMl9pbnB1dC5zdGF0dXMgPSAwOwotCQlKT1QoOCwgIiVpPWluZGV4OiAlc1xuIiwgaW5kZXgsICZ2NGwyX2lucHV0Lm5hbWVbMF0pOworCQlKT00oOCwgIiVpPWluZGV4OiAlc1xuIiwgaW5kZXgsICZ2NGwyX2lucHV0Lm5hbWVbMF0pOwogCQlicmVhazsKIAl9CiAJY2FzZSA0OiB7CkBAIC05MzcsNyArMTE3Niw3IEBACiAJCXY0bDJfaW5wdXQuc3RkID0gVjRMMl9TVERfUEFMIHwgVjRMMl9TVERfU0VDQU0gfCBcCiAJCQkJVjRMMl9TVERfTlRTQyA7CiAJCXY0bDJfaW5wdXQuc3RhdHVzID0gMDsKLQkJSk9UKDgsICIlaT1pbmRleDogJXNcbiIsIGluZGV4LCAmdjRsMl9pbnB1dC5uYW1lWzBdKTsKKwkJSk9NKDgsICIlaT1pbmRleDogJXNcbiIsIGluZGV4LCAmdjRsMl9pbnB1dC5uYW1lWzBdKTsKIAkJYnJlYWs7CiAJfQogCWNhc2UgNTogewpAQCAtOTQ5LDMxICsxMTg4LDMyIEBACiAJCXY0bDJfaW5wdXQuc3RkID0gVjRMMl9TVERfUEFMIHwgVjRMMl9TVERfU0VDQU0gfCBcCiAJCQkJVjRMMl9TVERfTlRTQyA7CiAJCXY0bDJfaW5wdXQuc3RhdHVzID0gMDsKLQkJSk9UKDgsICIlaT1pbmRleDogJXNcbiIsIGluZGV4LCAmdjRsMl9pbnB1dC5uYW1lWzBdKTsKKwkJSk9NKDgsICIlaT1pbmRleDogJXNcbiIsIGluZGV4LCAmdjRsMl9pbnB1dC5uYW1lWzBdKTsKIAkJYnJlYWs7CiAJfQogCWRlZmF1bHQ6IHsKLQkJSk9UKDgsICIlaT1pbmRleDogZXhoYXVzdHMgaW5wdXRzXG4iLCBpbmRleCk7CisJCUpPTSg4LCAiJWk9aW5kZXg6IGV4aGF1c3RzIGlucHV0c1xuIiwgaW5kZXgpOworCQltdXRleF91bmxvY2soJmVhc3ljYXBfZG9uZ2xlW2tkXS5tdXRleF92aWRlbyk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAl9CiAKIAlpZiAoMCAhPSBjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLCAmdjRsMl9pbnB1dCwgXAogCQkJCQkJc2l6ZW9mKHN0cnVjdCB2NGwyX2lucHV0KSkpIHsKLQkJUE9VVDsKKwkJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfdmlkZW8pOwogCQlyZXR1cm4gLUVGQVVMVDsKIAl9CiAJYnJlYWs7CiB9CiAvKiAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCiBjYXNlIFZJRElPQ19HX0lOUFVUOiB7Ci0Jc3RhdGljIF9fdTMyIGluZGV4OworCV9fdTMyIGluZGV4OwogCi0JSk9UKDgsICJWSURJT0NfR19JTlBVVFxuIik7CisJSk9NKDgsICJWSURJT0NfR19JTlBVVFxuIik7CiAJaW5kZXggPSAoX191MzIpcGVhc3ljYXAtPmlucHV0OwotCUpPVCg4LCAidXNlciBpcyB0b2xkOiAlaVxuIiwgaW5kZXgpOworCUpPTSg4LCAidXNlciBpcyB0b2xkOiAlaVxuIiwgaW5kZXgpOwogCWlmICgwICE9IGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsICZpbmRleCwgc2l6ZW9mKF9fdTMyKSkpIHsKLQkJUE9VVDsKKwkJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfdmlkZW8pOwogCQlyZXR1cm4gLUVGQVVMVDsKIAl9CiAJYnJlYWs7CkBAIC05ODEsNzkgKzEyMjEsODkgQEAKIC8qIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KIGNhc2UgVklESU9DX1NfSU5QVVQ6CiAJewotCXN0YXRpYyBfX3UzMiBpbmRleDsKKwlfX3UzMiBpbmRleDsKKwlpbnQgcmM7CiAKLQlKT1QoOCwgIlZJRElPQ19TX0lOUFVUXG4iKTsKKwlKT00oOCwgIlZJRElPQ19TX0lOUFVUXG4iKTsKIAogCWlmICgwICE9IGNvcHlfZnJvbV91c2VyKCZpbmRleCwgKHZvaWQgX191c2VyICopYXJnLCBzaXplb2YoX191MzIpKSkgewotCQlQT1VUOworCQltdXRleF91bmxvY2soJmVhc3ljYXBfZG9uZ2xlW2tkXS5tdXRleF92aWRlbyk7CiAJCXJldHVybiAtRUZBVUxUOwogCX0KIAotCUpPVCg4LCAidXNlciByZXF1ZXN0cyBpbnB1dCAlaVxuIiwgaW5kZXgpOworCUpPTSg4LCAidXNlciByZXF1ZXN0cyBpbnB1dCAlaVxuIiwgaW5kZXgpOwogCiAJaWYgKChpbnQpaW5kZXggPT0gcGVhc3ljYXAtPmlucHV0KSB7Ci0JCVNBWSgicmVxdWVzdGVkIGlucHV0IGFscmVhZHkgaW4gZWZmZWN0XG4iKTsKKwkJU0FNKCJyZXF1ZXN0ZWQgaW5wdXQgYWxyZWFkeSBpbiBlZmZlY3RcbiIpOwogCQlicmVhazsKIAl9CiAKLQlpZiAoKDAgPiBpbmRleCkgfHwgKDUgPCBpbmRleCkpIHsKLQkJSk9UKDgsICJFUlJPUjogIGJhZCByZXF1ZXN0ZWQgaW5wdXQ6ICVpXG4iLCBpbmRleCk7CisJaWYgKCgwID4gaW5kZXgpIHx8IChJTlBVVF9NQU5ZIDw9IGluZGV4KSkgeworCQlKT00oOCwgIkVSUk9SOiAgYmFkIHJlcXVlc3RlZCBpbnB1dDogJWlcbiIsIGluZGV4KTsKKwkJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfdmlkZW8pOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9Ci0JcGVhc3ljYXAtPmlucHV0ID0gKGludClpbmRleDsKIAotCXNlbGVjdF9pbnB1dChwZWFzeWNhcC0+cHVzYl9kZXZpY2UsIHBlYXN5Y2FwLT5pbnB1dCwgOSk7Ci0KKwlyYyA9IG5ld2lucHV0KHBlYXN5Y2FwLCAoaW50KWluZGV4KTsKKwlpZiAoMCA9PSByYykgeworCQlKT00oOCwgIm5ld2lucHV0KC4sJWkpIE9LXG4iLCAoaW50KWluZGV4KTsKKwl9IGVsc2UgeworCQlTQU0oIkVSUk9SOiBuZXdpbnB1dCguLCVpKSByZXR1cm5lZCAlaVxuIiwgKGludClpbmRleCwgcmMpOworCQltdXRleF91bmxvY2soJmVhc3ljYXBfZG9uZ2xlW2tkXS5tdXRleF92aWRlbyk7CisJCXJldHVybiAtRUZBVUxUOworCX0KIAlicmVhazsKIH0KIC8qIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KIGNhc2UgVklESU9DX0VOVU1BVURJTzogewotCUpPVCg4LCAiVklESU9DX0VOVU1BVURJT1xuIik7CisJSk9NKDgsICJWSURJT0NfRU5VTUFVRElPXG4iKTsKKwltdXRleF91bmxvY2soJmVhc3ljYXBfZG9uZ2xlW2tkXS5tdXRleF92aWRlbyk7CiAJcmV0dXJuIC1FSU5WQUw7CiB9CiAvKiAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCiBjYXNlIFZJRElPQ19FTlVNQVVET1VUOiB7Ci0Jc3RhdGljIHN0cnVjdCB2NGwyX2F1ZGlvb3V0IHY0bDJfYXVkaW9vdXQ7CisJc3RydWN0IHY0bDJfYXVkaW9vdXQgdjRsMl9hdWRpb291dDsKIAotCUpPVCg4LCAiVklESU9DX0VOVU1BVURPVVRcbiIpOworCUpPTSg4LCAiVklESU9DX0VOVU1BVURPVVRcbiIpOwogCiAJaWYgKDAgIT0gY29weV9mcm9tX3VzZXIoJnY0bDJfYXVkaW9vdXQsICh2b2lkIF9fdXNlciAqKWFyZywgXAogCQkJCQlzaXplb2Yoc3RydWN0IHY0bDJfYXVkaW9vdXQpKSkgewotCQlQT1VUOworCQltdXRleF91bmxvY2soJmVhc3ljYXBfZG9uZ2xlW2tkXS5tdXRleF92aWRlbyk7CiAJCXJldHVybiAtRUZBVUxUOwogCX0KIAotCWlmICgwICE9IHY0bDJfYXVkaW9vdXQuaW5kZXgpCisJaWYgKDAgIT0gdjRsMl9hdWRpb291dC5pbmRleCkgeworCQltdXRleF91bmxvY2soJmVhc3ljYXBfZG9uZ2xlW2tkXS5tdXRleF92aWRlbyk7CiAJCXJldHVybiAtRUlOVkFMOworCX0KIAltZW1zZXQoJnY0bDJfYXVkaW9vdXQsIDAsIHNpemVvZihzdHJ1Y3QgdjRsMl9hdWRpb291dCkpOwogCXY0bDJfYXVkaW9vdXQuaW5kZXggPSAwOwogCXN0cmNweSgmdjRsMl9hdWRpb291dC5uYW1lWzBdLCAiU291bmR0cmFjayIpOwogCiAJaWYgKDAgIT0gY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKWFyZywgJnY0bDJfYXVkaW9vdXQsIFwKIAkJCQkJc2l6ZW9mKHN0cnVjdCB2NGwyX2F1ZGlvb3V0KSkpIHsKLQkJUE9VVDsKKwkJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfdmlkZW8pOwogCQlyZXR1cm4gLUVGQVVMVDsKIAl9CiAJYnJlYWs7CiB9CiAvKiAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCiBjYXNlIFZJRElPQ19RVUVSWUNUUkw6IHsKLQlzdGF0aWMgaW50IGkxOwotCXN0YXRpYyBzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgdjRsMl9xdWVyeWN0cmw7CisJaW50IGkxOworCXN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCB2NGwyX3F1ZXJ5Y3RybDsKIAotCUpPVCg4LCAiVklESU9DX1FVRVJZQ1RSTFxuIik7CisJSk9NKDgsICJWSURJT0NfUVVFUllDVFJMXG4iKTsKIAogCWlmICgwICE9IGNvcHlfZnJvbV91c2VyKCZ2NGwyX3F1ZXJ5Y3RybCwgKHZvaWQgX191c2VyICopYXJnLCBcCiAJCQkJCXNpemVvZihzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwpKSkgewotCQlQT1VUOworCQltdXRleF91bmxvY2soJmVhc3ljYXBfZG9uZ2xlW2tkXS5tdXRleF92aWRlbyk7CiAJCXJldHVybiAtRUZBVUxUOwogCX0KIAogCWkxID0gMDsKIAl3aGlsZSAoMHhGRkZGRkZGRiAhPSBlYXN5Y2FwX2NvbnRyb2xbaTFdLmlkKSB7CiAJCWlmIChlYXN5Y2FwX2NvbnRyb2xbaTFdLmlkID09IHY0bDJfcXVlcnljdHJsLmlkKSB7Ci0JCQlKT1QoOCwgIlZJRElPQ19RVUVSWUNUUkwgICVzPWVhc3ljYXBfY29udHJvbFslaV0iIFwKKwkJCUpPTSg4LCAiVklESU9DX1FVRVJZQ1RSTCAgJXM9ZWFzeWNhcF9jb250cm9sWyVpXSIgXAogCQkJCSIubmFtZVxuIiwgJmVhc3ljYXBfY29udHJvbFtpMV0ubmFtZVswXSwgaTEpOwogCQkJbWVtY3B5KCZ2NGwyX3F1ZXJ5Y3RybCwgJmVhc3ljYXBfY29udHJvbFtpMV0sIFwKIAkJCQkJCXNpemVvZihzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwpKTsKQEAgLTEwNjIsMTI3ICsxMzEyLDEzNyBAQAogCQlpMSsrOwogCX0KIAlpZiAoMHhGRkZGRkZGRiA9PSBlYXN5Y2FwX2NvbnRyb2xbaTFdLmlkKSB7Ci0JCUpPVCg4LCAiJWk9aW5kZXg6IGV4aGF1c3RzIGNvbnRyb2xzXG4iLCBpMSk7CisJCUpPTSg4LCAiJWk9aW5kZXg6IGV4aGF1c3RzIGNvbnRyb2xzXG4iLCBpMSk7CisJCW11dGV4X3VubG9jaygmZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X3ZpZGVvKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCWlmICgwICE9IGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsICZ2NGwyX3F1ZXJ5Y3RybCwgXAogCQkJCQlzaXplb2Yoc3RydWN0IHY0bDJfcXVlcnljdHJsKSkpIHsKLQkJUE9VVDsKKwkJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfdmlkZW8pOwogCQlyZXR1cm4gLUVGQVVMVDsKIAl9CiAJYnJlYWs7CiB9CiAvKiAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCiBjYXNlIFZJRElPQ19RVUVSWU1FTlU6IHsKLQlKT1QoOCwgIlZJRElPQ19RVUVSWU1FTlUgdW5zdXBwb3J0ZWRcbiIpOworCUpPTSg4LCAiVklESU9DX1FVRVJZTUVOVSB1bnN1cHBvcnRlZFxuIik7CisJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfdmlkZW8pOwogCXJldHVybiAtRUlOVkFMOwotCWJyZWFrOwogfQogLyogLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLwogY2FzZSBWSURJT0NfR19DVFJMOiB7Ci0Jc3RhdGljIHN0cnVjdCB2NGwyX2NvbnRyb2wgdjRsMl9jb250cm9sOworCXN0cnVjdCB2NGwyX2NvbnRyb2wgKnB2NGwyX2NvbnRyb2w7CiAKLQlKT1QoOCwgIlZJRElPQ19HX0NUUkxcbiIpOwotCi0JaWYgKDAgIT0gY29weV9mcm9tX3VzZXIoJnY0bDJfY29udHJvbCwgKHZvaWQgX191c2VyICopYXJnLCBcCisJSk9NKDgsICJWSURJT0NfR19DVFJMXG4iKTsKKwlwdjRsMl9jb250cm9sID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHY0bDJfY29udHJvbCksIEdGUF9LRVJORUwpOworCWlmICghcHY0bDJfY29udHJvbCkgeworCQlTQU0oIkVSUk9SOiBvdXQgb2YgbWVtb3J5XG4iKTsKKwkJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfdmlkZW8pOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJaWYgKDAgIT0gY29weV9mcm9tX3VzZXIocHY0bDJfY29udHJvbCwgKHZvaWQgX191c2VyICopYXJnLCBcCiAJCQkJCXNpemVvZihzdHJ1Y3QgdjRsMl9jb250cm9sKSkpIHsKLQkJUE9VVDsKKwkJa2ZyZWUocHY0bDJfY29udHJvbCk7CisJCW11dGV4X3VubG9jaygmZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X3ZpZGVvKTsKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJfQogCi0Jc3dpdGNoICh2NGwyX2NvbnRyb2wuaWQpIHsKKwlzd2l0Y2ggKHB2NGwyX2NvbnRyb2wtPmlkKSB7CiAJY2FzZSBWNEwyX0NJRF9CUklHSFRORVNTOiB7Ci0JCXY0bDJfY29udHJvbC52YWx1ZSA9IHBlYXN5Y2FwLT5icmlnaHRuZXNzOwotCQlKT1QoOCwgInVzZXIgZW5xdWlyZXMgYnJpZ2h0bmVzczogJWlcbiIsIHY0bDJfY29udHJvbC52YWx1ZSk7CisJCXB2NGwyX2NvbnRyb2wtPnZhbHVlID0gcGVhc3ljYXAtPmJyaWdodG5lc3M7CisJCUpPTSg4LCAidXNlciBlbnF1aXJlcyBicmlnaHRuZXNzOiAlaVxuIiwgcHY0bDJfY29udHJvbC0+dmFsdWUpOwogCQlicmVhazsKIAl9CiAJY2FzZSBWNEwyX0NJRF9DT05UUkFTVDogewotCQl2NGwyX2NvbnRyb2wudmFsdWUgPSBwZWFzeWNhcC0+Y29udHJhc3Q7Ci0JCUpPVCg4LCAidXNlciBlbnF1aXJlcyBjb250cmFzdDogJWlcbiIsIHY0bDJfY29udHJvbC52YWx1ZSk7CisJCXB2NGwyX2NvbnRyb2wtPnZhbHVlID0gcGVhc3ljYXAtPmNvbnRyYXN0OworCQlKT00oOCwgInVzZXIgZW5xdWlyZXMgY29udHJhc3Q6ICVpXG4iLCBwdjRsMl9jb250cm9sLT52YWx1ZSk7CiAJCWJyZWFrOwogCX0KIAljYXNlIFY0TDJfQ0lEX1NBVFVSQVRJT046IHsKLQkJdjRsMl9jb250cm9sLnZhbHVlID0gcGVhc3ljYXAtPnNhdHVyYXRpb247Ci0JCUpPVCg4LCAidXNlciBlbnF1aXJlcyBzYXR1cmF0aW9uOiAlaVxuIiwgdjRsMl9jb250cm9sLnZhbHVlKTsKKwkJcHY0bDJfY29udHJvbC0+dmFsdWUgPSBwZWFzeWNhcC0+c2F0dXJhdGlvbjsKKwkJSk9NKDgsICJ1c2VyIGVucXVpcmVzIHNhdHVyYXRpb246ICVpXG4iLCBwdjRsMl9jb250cm9sLT52YWx1ZSk7CiAJCWJyZWFrOwogCX0KIAljYXNlIFY0TDJfQ0lEX0hVRTogewotCQl2NGwyX2NvbnRyb2wudmFsdWUgPSBwZWFzeWNhcC0+aHVlOwotCQlKT1QoOCwgInVzZXIgZW5xdWlyZXMgaHVlOiAlaVxuIiwgdjRsMl9jb250cm9sLnZhbHVlKTsKKwkJcHY0bDJfY29udHJvbC0+dmFsdWUgPSBwZWFzeWNhcC0+aHVlOworCQlKT00oOCwgInVzZXIgZW5xdWlyZXMgaHVlOiAlaVxuIiwgcHY0bDJfY29udHJvbC0+dmFsdWUpOwogCQlicmVhazsKIAl9CiAJY2FzZSBWNEwyX0NJRF9BVURJT19WT0xVTUU6IHsKLQkJdjRsMl9jb250cm9sLnZhbHVlID0gcGVhc3ljYXAtPnZvbHVtZTsKLQkJSk9UKDgsICJ1c2VyIGVucXVpcmVzIHZvbHVtZTogJWlcbiIsIHY0bDJfY29udHJvbC52YWx1ZSk7CisJCXB2NGwyX2NvbnRyb2wtPnZhbHVlID0gcGVhc3ljYXAtPnZvbHVtZTsKKwkJSk9NKDgsICJ1c2VyIGVucXVpcmVzIHZvbHVtZTogJWlcbiIsIHB2NGwyX2NvbnRyb2wtPnZhbHVlKTsKIAkJYnJlYWs7CiAJfQogCWNhc2UgVjRMMl9DSURfQVVESU9fTVVURTogewogCQlpZiAoMSA9PSBwZWFzeWNhcC0+bXV0ZSkKLQkJCXY0bDJfY29udHJvbC52YWx1ZSA9IHRydWU7CisJCQlwdjRsMl9jb250cm9sLT52YWx1ZSA9IHRydWU7CiAJCWVsc2UKLQkJCXY0bDJfY29udHJvbC52YWx1ZSA9IGZhbHNlOwotCQlKT1QoOCwgInVzZXIgZW5xdWlyZXMgbXV0ZTogJWlcbiIsIHY0bDJfY29udHJvbC52YWx1ZSk7CisJCQlwdjRsMl9jb250cm9sLT52YWx1ZSA9IGZhbHNlOworCQlKT00oOCwgInVzZXIgZW5xdWlyZXMgbXV0ZTogJWlcbiIsIHB2NGwyX2NvbnRyb2wtPnZhbHVlKTsKIAkJYnJlYWs7CiAJfQogCWRlZmF1bHQ6IHsKLQkJU0FZKCJFUlJPUjogdW5rbm93biBWNEwyIGNvbnRyb2w6IDB4JTA4WD1pZFxuIiwgXAotCQkJCQkJCXY0bDJfY29udHJvbC5pZCk7Ci0JCWV4cGxhaW5fY2lkKHY0bDJfY29udHJvbC5pZCk7CisJCVNBTSgiRVJST1I6IHVua25vd24gVjRMMiBjb250cm9sOiAweCUwOFg9aWRcbiIsIFwKKwkJCQkJCQlwdjRsMl9jb250cm9sLT5pZCk7CisJCWtmcmVlKHB2NGwyX2NvbnRyb2wpOworCQltdXRleF91bmxvY2soJmVhc3ljYXBfZG9uZ2xlW2tkXS5tdXRleF92aWRlbyk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAl9Ci0JaWYgKDAgIT0gY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKWFyZywgJnY0bDJfY29udHJvbCwgXAorCWlmICgwICE9IGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsIHB2NGwyX2NvbnRyb2wsIFwKIAkJCQkJc2l6ZW9mKHN0cnVjdCB2NGwyX2NvbnRyb2wpKSkgewotCQlQT1VUOworCQlrZnJlZShwdjRsMl9jb250cm9sKTsKKwkJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfdmlkZW8pOwogCQlyZXR1cm4gLUVGQVVMVDsKIAl9CisJa2ZyZWUocHY0bDJfY29udHJvbCk7CiAJYnJlYWs7CiB9CiAvKiAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCiAjaWYgZGVmaW5lZChWSURJT0NfU19DVFJMX09MRCkKIGNhc2UgVklESU9DX1NfQ1RSTF9PTEQ6IHsKLQlKT1QoOCwgIlZJRElPQ19TX0NUUkxfT0xEIHJlcXVpcmVkIGF0IGxlYXN0IGZvciB4YXd0dlxuIik7CisJSk9NKDgsICJWSURJT0NfU19DVFJMX09MRCByZXF1aXJlZCBhdCBsZWFzdCBmb3IgeGF3dHZcbiIpOwogfQogI2VuZGlmIC8qVklESU9DX1NfQ1RSTF9PTEQqLwogY2FzZSBWSURJT0NfU19DVFJMOgogCXsKLQlzdGF0aWMgc3RydWN0IHY0bDJfY29udHJvbCB2NGwyX2NvbnRyb2w7CisJc3RydWN0IHY0bDJfY29udHJvbCB2NGwyX2NvbnRyb2w7CiAKLQlKT1QoOCwgIlZJRElPQ19TX0NUUkxcbiIpOworCUpPTSg4LCAiVklESU9DX1NfQ1RSTFxuIik7CiAKIAlpZiAoMCAhPSBjb3B5X2Zyb21fdXNlcigmdjRsMl9jb250cm9sLCAodm9pZCBfX3VzZXIgKilhcmcsIFwKIAkJCQkJc2l6ZW9mKHN0cnVjdCB2NGwyX2NvbnRyb2wpKSkgewotCQlQT1VUOworCQltdXRleF91bmxvY2soJmVhc3ljYXBfZG9uZ2xlW2tkXS5tdXRleF92aWRlbyk7CiAJCXJldHVybiAtRUZBVUxUOwogCX0KIAogCXN3aXRjaCAodjRsMl9jb250cm9sLmlkKSB7CiAJY2FzZSBWNEwyX0NJRF9CUklHSFRORVNTOiB7Ci0JCUpPVCg4LCAidXNlciByZXF1ZXN0cyBicmlnaHRuZXNzICVpXG4iLCB2NGwyX2NvbnRyb2wudmFsdWUpOworCQlKT00oOCwgInVzZXIgcmVxdWVzdHMgYnJpZ2h0bmVzcyAlaVxuIiwgdjRsMl9jb250cm9sLnZhbHVlKTsKIAkJaWYgKDAgIT0gYWRqdXN0X2JyaWdodG5lc3MocGVhc3ljYXAsIHY0bDJfY29udHJvbC52YWx1ZSkpCiAJCQk7CiAJCWJyZWFrOwogCX0KIAljYXNlIFY0TDJfQ0lEX0NPTlRSQVNUOiB7Ci0JCUpPVCg4LCAidXNlciByZXF1ZXN0cyBjb250cmFzdCAlaVxuIiwgdjRsMl9jb250cm9sLnZhbHVlKTsKKwkJSk9NKDgsICJ1c2VyIHJlcXVlc3RzIGNvbnRyYXN0ICVpXG4iLCB2NGwyX2NvbnRyb2wudmFsdWUpOwogCQlpZiAoMCAhPSBhZGp1c3RfY29udHJhc3QocGVhc3ljYXAsIHY0bDJfY29udHJvbC52YWx1ZSkpCiAJCQk7CiAJCWJyZWFrOwogCX0KIAljYXNlIFY0TDJfQ0lEX1NBVFVSQVRJT046IHsKLQkJSk9UKDgsICJ1c2VyIHJlcXVlc3RzIHNhdHVyYXRpb24gJWlcbiIsIHY0bDJfY29udHJvbC52YWx1ZSk7CisJCUpPTSg4LCAidXNlciByZXF1ZXN0cyBzYXR1cmF0aW9uICVpXG4iLCB2NGwyX2NvbnRyb2wudmFsdWUpOwogCQlpZiAoMCAhPSBhZGp1c3Rfc2F0dXJhdGlvbihwZWFzeWNhcCwgdjRsMl9jb250cm9sLnZhbHVlKSkKIAkJCTsKIAkJYnJlYWs7CiAJfQogCWNhc2UgVjRMMl9DSURfSFVFOiB7Ci0JCUpPVCg4LCAidXNlciByZXF1ZXN0cyBodWUgJWlcbiIsIHY0bDJfY29udHJvbC52YWx1ZSk7CisJCUpPTSg4LCAidXNlciByZXF1ZXN0cyBodWUgJWlcbiIsIHY0bDJfY29udHJvbC52YWx1ZSk7CiAJCWlmICgwICE9IGFkanVzdF9odWUocGVhc3ljYXAsIHY0bDJfY29udHJvbC52YWx1ZSkpCiAJCQk7CiAJCWJyZWFrOwogCX0KIAljYXNlIFY0TDJfQ0lEX0FVRElPX1ZPTFVNRTogewotCQlKT1QoOCwgInVzZXIgcmVxdWVzdHMgdm9sdW1lICVpXG4iLCB2NGwyX2NvbnRyb2wudmFsdWUpOworCQlKT00oOCwgInVzZXIgcmVxdWVzdHMgdm9sdW1lICVpXG4iLCB2NGwyX2NvbnRyb2wudmFsdWUpOwogCQlpZiAoMCAhPSBhZGp1c3Rfdm9sdW1lKHBlYXN5Y2FwLCB2NGwyX2NvbnRyb2wudmFsdWUpKQogCQkJOwogCQlicmVhazsKQEAgLTExOTAsNDAgKzE0NTAsNDEgQEAKIAljYXNlIFY0TDJfQ0lEX0FVRElPX01VVEU6IHsKIAkJaW50IG11dGU7CiAKLQkJSk9UKDgsICJ1c2VyIHJlcXVlc3RzIG11dGUgJWlcbiIsIHY0bDJfY29udHJvbC52YWx1ZSk7CisJCUpPTSg4LCAidXNlciByZXF1ZXN0cyBtdXRlICVpXG4iLCB2NGwyX2NvbnRyb2wudmFsdWUpOwogCQlpZiAodHJ1ZSA9PSB2NGwyX2NvbnRyb2wudmFsdWUpCiAJCQltdXRlID0gMTsKIAkJZWxzZQogCQkJbXV0ZSA9IDA7CiAKIAkJaWYgKDAgIT0gYWRqdXN0X211dGUocGVhc3ljYXAsIG11dGUpKQotCQkJU0FZKCJXQVJOSU5HOiBmYWlsZWQgdG8gYWRqdXN0IG11dGUgdG8gJWlcbiIsIG11dGUpOworCQkJU0FNKCJXQVJOSU5HOiBmYWlsZWQgdG8gYWRqdXN0IG11dGUgdG8gJWlcbiIsIG11dGUpOwogCQlicmVhazsKIAl9CiAJZGVmYXVsdDogewotCQlTQVkoIkVSUk9SOiB1bmtub3duIFY0TDIgY29udHJvbDogMHglMDhYPWlkXG4iLCBcCisJCVNBTSgiRVJST1I6IHVua25vd24gVjRMMiBjb250cm9sOiAweCUwOFg9aWRcbiIsIFwKIAkJCQkJCQl2NGwyX2NvbnRyb2wuaWQpOwotCQlleHBsYWluX2NpZCh2NGwyX2NvbnRyb2wuaWQpOwotCXJldHVybiAtRUlOVkFMOwotCQkJfQotCQl9CisJCW11dGV4X3VubG9jaygmZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X3ZpZGVvKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCX0KIAlicmVhazsKIH0KIC8qIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KIGNhc2UgVklESU9DX1NfRVhUX0NUUkxTOiB7Ci0JSk9UKDgsICJWSURJT0NfU19FWFRfQ1RSTFMgdW5zdXBwb3J0ZWRcbiIpOworCUpPTSg4LCAiVklESU9DX1NfRVhUX0NUUkxTIHVuc3VwcG9ydGVkXG4iKTsKKwltdXRleF91bmxvY2soJmVhc3ljYXBfZG9uZ2xlW2tkXS5tdXRleF92aWRlbyk7CiAJcmV0dXJuIC1FSU5WQUw7CiB9CiAvKiAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCiBjYXNlIFZJRElPQ19FTlVNX0ZNVDogewotCXN0YXRpYyBfX3UzMiBpbmRleDsKLQlzdGF0aWMgc3RydWN0IHY0bDJfZm10ZGVzYyB2NGwyX2ZtdGRlc2M7CisJX191MzIgaW5kZXg7CisJc3RydWN0IHY0bDJfZm10ZGVzYyB2NGwyX2ZtdGRlc2M7CiAKLQlKT1QoOCwgIlZJRElPQ19FTlVNX0ZNVFxuIik7CisJSk9NKDgsICJWSURJT0NfRU5VTV9GTVRcbiIpOwogCiAJaWYgKDAgIT0gY29weV9mcm9tX3VzZXIoJnY0bDJfZm10ZGVzYywgKHZvaWQgX191c2VyICopYXJnLCBcCiAJCQkJCXNpemVvZihzdHJ1Y3QgdjRsMl9mbXRkZXNjKSkpIHsKLQkJUE9VVDsKKwkJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfdmlkZW8pOwogCQlyZXR1cm4gLUVGQVVMVDsKIAl9CiAKQEAgLTEyMzgsMTE3ICsxNDk5LDMyNyBAQAogCQl2NGwyX2ZtdGRlc2MuZmxhZ3MgPSAwOwogCQlzdHJjcHkoJnY0bDJfZm10ZGVzYy5kZXNjcmlwdGlvblswXSwgInV5dnkiKTsKIAkJdjRsMl9mbXRkZXNjLnBpeGVsZm9ybWF0ID0gVjRMMl9QSVhfRk1UX1VZVlk7Ci0JCUpPVCg4LCAiJWk9aW5kZXg6ICVzXG4iLCBpbmRleCwgJnY0bDJfZm10ZGVzYy5kZXNjcmlwdGlvblswXSk7CisJCUpPTSg4LCAiJWk9aW5kZXg6ICVzXG4iLCBpbmRleCwgJnY0bDJfZm10ZGVzYy5kZXNjcmlwdGlvblswXSk7CiAJCWJyZWFrOwogCX0KIAljYXNlIDE6IHsKIAkJdjRsMl9mbXRkZXNjLmZsYWdzID0gMDsKIAkJc3RyY3B5KCZ2NGwyX2ZtdGRlc2MuZGVzY3JpcHRpb25bMF0sICJ5dXkyIik7CiAJCXY0bDJfZm10ZGVzYy5waXhlbGZvcm1hdCA9IFY0TDJfUElYX0ZNVF9ZVVlWOwotCQlKT1QoOCwgIiVpPWluZGV4OiAlc1xuIiwgaW5kZXgsICZ2NGwyX2ZtdGRlc2MuZGVzY3JpcHRpb25bMF0pOworCQlKT00oOCwgIiVpPWluZGV4OiAlc1xuIiwgaW5kZXgsICZ2NGwyX2ZtdGRlc2MuZGVzY3JpcHRpb25bMF0pOwogCQlicmVhazsKIAl9CiAJY2FzZSAyOiB7CiAJCXY0bDJfZm10ZGVzYy5mbGFncyA9IDA7CiAJCXN0cmNweSgmdjRsMl9mbXRkZXNjLmRlc2NyaXB0aW9uWzBdLCAicmdiMjQiKTsKIAkJdjRsMl9mbXRkZXNjLnBpeGVsZm9ybWF0ID0gVjRMMl9QSVhfRk1UX1JHQjI0OwotCQlKT1QoOCwgIiVpPWluZGV4OiAlc1xuIiwgaW5kZXgsICZ2NGwyX2ZtdGRlc2MuZGVzY3JpcHRpb25bMF0pOworCQlKT00oOCwgIiVpPWluZGV4OiAlc1xuIiwgaW5kZXgsICZ2NGwyX2ZtdGRlc2MuZGVzY3JpcHRpb25bMF0pOwogCQlicmVhazsKIAl9CiAJY2FzZSAzOiB7CiAJCXY0bDJfZm10ZGVzYy5mbGFncyA9IDA7CiAJCXN0cmNweSgmdjRsMl9mbXRkZXNjLmRlc2NyaXB0aW9uWzBdLCAicmdiMzIiKTsKIAkJdjRsMl9mbXRkZXNjLnBpeGVsZm9ybWF0ID0gVjRMMl9QSVhfRk1UX1JHQjMyOwotCQlKT1QoOCwgIiVpPWluZGV4OiAlc1xuIiwgaW5kZXgsICZ2NGwyX2ZtdGRlc2MuZGVzY3JpcHRpb25bMF0pOworCQlKT00oOCwgIiVpPWluZGV4OiAlc1xuIiwgaW5kZXgsICZ2NGwyX2ZtdGRlc2MuZGVzY3JpcHRpb25bMF0pOwogCQlicmVhazsKIAl9CiAJY2FzZSA0OiB7CiAJCXY0bDJfZm10ZGVzYy5mbGFncyA9IDA7CiAJCXN0cmNweSgmdjRsMl9mbXRkZXNjLmRlc2NyaXB0aW9uWzBdLCAiYmdyMjQiKTsKIAkJdjRsMl9mbXRkZXNjLnBpeGVsZm9ybWF0ID0gVjRMMl9QSVhfRk1UX0JHUjI0OwotCQlKT1QoOCwgIiVpPWluZGV4OiAlc1xuIiwgaW5kZXgsICZ2NGwyX2ZtdGRlc2MuZGVzY3JpcHRpb25bMF0pOworCQlKT00oOCwgIiVpPWluZGV4OiAlc1xuIiwgaW5kZXgsICZ2NGwyX2ZtdGRlc2MuZGVzY3JpcHRpb25bMF0pOwogCQlicmVhazsKIAl9CiAJY2FzZSA1OiB7CiAJCXY0bDJfZm10ZGVzYy5mbGFncyA9IDA7CiAJCXN0cmNweSgmdjRsMl9mbXRkZXNjLmRlc2NyaXB0aW9uWzBdLCAiYmdyMzIiKTsKIAkJdjRsMl9mbXRkZXNjLnBpeGVsZm9ybWF0ID0gVjRMMl9QSVhfRk1UX0JHUjMyOwotCQlKT1QoOCwgIiVpPWluZGV4OiAlc1xuIiwgaW5kZXgsICZ2NGwyX2ZtdGRlc2MuZGVzY3JpcHRpb25bMF0pOworCQlKT00oOCwgIiVpPWluZGV4OiAlc1xuIiwgaW5kZXgsICZ2NGwyX2ZtdGRlc2MuZGVzY3JpcHRpb25bMF0pOwogCQlicmVhazsKIAl9CiAJZGVmYXVsdDogewotCQlKT1QoOCwgIiVpPWluZGV4OiBleGhhdXN0cyBmb3JtYXRzXG4iLCBpbmRleCk7CisJCUpPTSg4LCAiJWk9aW5kZXg6IGV4aGF1c3RzIGZvcm1hdHNcbiIsIGluZGV4KTsKKwkJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfdmlkZW8pOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAJfQogCWlmICgwICE9IGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsICZ2NGwyX2ZtdGRlc2MsIFwKIAkJCQkJc2l6ZW9mKHN0cnVjdCB2NGwyX2ZtdGRlc2MpKSkgewotCQlQT1VUOworCQltdXRleF91bmxvY2soJmVhc3ljYXBfZG9uZ2xlW2tkXS5tdXRleF92aWRlbyk7CiAJCXJldHVybiAtRUZBVUxUOwogCX0KIAlicmVhazsKIH0KIC8qIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KKy8qCisgKiAgVEhFIFJFU1BPTlNFIFRPIFZJRElPQ19FTlVNX0ZSQU1FU0laRVMgTVVTVCBCRSBDT05ESVRJT05FRCBPTiBUSEUKKyAqICBUSEUgQ1VSUkVOVCBTVEFOREFSRCwgQkVDQVVTRSBUSEFUIElTIFdIQVQgZ3N0cmVhbWVyIEVYUEVDVFMuICBCRVdBUkUuCisqLworLyogLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLwogY2FzZSBWSURJT0NfRU5VTV9GUkFNRVNJWkVTOiB7Ci0JSk9UKDgsICJWSURJT0NfRU5VTV9GUkFNRVNJWkVTIHVuc3VwcG9ydGVkXG4iKTsKLQlyZXR1cm4gLUVJTlZBTDsKKwlfX3UzMiBpbmRleDsKKwlzdHJ1Y3QgdjRsMl9mcm1zaXplZW51bSB2NGwyX2ZybXNpemVlbnVtOworCisJSk9NKDgsICJWSURJT0NfRU5VTV9GUkFNRVNJWkVTXG4iKTsKKworCWlmICgwICE9IGNvcHlfZnJvbV91c2VyKCZ2NGwyX2ZybXNpemVlbnVtLCAodm9pZCBfX3VzZXIgKilhcmcsIFwKKwkJCQkJc2l6ZW9mKHN0cnVjdCB2NGwyX2ZybXNpemVlbnVtKSkpIHsKKwkJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfdmlkZW8pOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlpbmRleCA9IHY0bDJfZnJtc2l6ZWVudW0uaW5kZXg7CisKKwl2NGwyX2ZybXNpemVlbnVtLnR5cGUgPSAoX191MzIpIFY0TDJfRlJNU0laRV9UWVBFX0RJU0NSRVRFOworCisJaWYgKHRydWUgPT0gcGVhc3ljYXAtPm50c2MpIHsKKwkJc3dpdGNoIChpbmRleCkgeworCQljYXNlIDA6IHsKKwkJCXY0bDJfZnJtc2l6ZWVudW0uZGlzY3JldGUud2lkdGggPSA2NDA7CisJCQl2NGwyX2ZybXNpemVlbnVtLmRpc2NyZXRlLmhlaWdodCA9IDQ4MDsKKwkJCUpPTSg4LCAiJWk9aW5kZXg6ICVpeCVpXG4iLCBpbmRleCwgXAorCQkJCQkoaW50KSh2NGwyX2ZybXNpemVlbnVtLlwKKwkJCQkJCSBkaXNjcmV0ZS53aWR0aCksIFwKKwkJCQkJKGludCkodjRsMl9mcm1zaXplZW51bS5cCisJCQkJCQlkaXNjcmV0ZS5oZWlnaHQpKTsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgMTogeworCQkJdjRsMl9mcm1zaXplZW51bS5kaXNjcmV0ZS53aWR0aCA9IDMyMDsKKwkJCXY0bDJfZnJtc2l6ZWVudW0uZGlzY3JldGUuaGVpZ2h0ID0gMjQwOworCQkJSk9NKDgsICIlaT1pbmRleDogJWl4JWlcbiIsIGluZGV4LCBcCisJCQkJCShpbnQpKHY0bDJfZnJtc2l6ZWVudW0uXAorCQkJCQkJZGlzY3JldGUud2lkdGgpLCBcCisJCQkJCShpbnQpKHY0bDJfZnJtc2l6ZWVudW0uXAorCQkJCQkJZGlzY3JldGUuaGVpZ2h0KSk7CisJCQlicmVhazsKKwkJfQorCQljYXNlIDI6IHsKKwkJCXY0bDJfZnJtc2l6ZWVudW0uZGlzY3JldGUud2lkdGggPSA3MjA7CisJCQl2NGwyX2ZybXNpemVlbnVtLmRpc2NyZXRlLmhlaWdodCA9IDQ4MDsKKwkJCUpPTSg4LCAiJWk9aW5kZXg6ICVpeCVpXG4iLCBpbmRleCwgXAorCQkJCQkoaW50KSh2NGwyX2ZybXNpemVlbnVtLlwKKwkJCQkJCWRpc2NyZXRlLndpZHRoKSwgXAorCQkJCQkoaW50KSh2NGwyX2ZybXNpemVlbnVtLlwKKwkJCQkJCWRpc2NyZXRlLmhlaWdodCkpOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSAzOiB7CisJCQl2NGwyX2ZybXNpemVlbnVtLmRpc2NyZXRlLndpZHRoID0gMzYwOworCQkJdjRsMl9mcm1zaXplZW51bS5kaXNjcmV0ZS5oZWlnaHQgPSAyNDA7CisJCQlKT00oOCwgIiVpPWluZGV4OiAlaXglaVxuIiwgaW5kZXgsIFwKKwkJCQkJKGludCkodjRsMl9mcm1zaXplZW51bS5cCisJCQkJCQlkaXNjcmV0ZS53aWR0aCksIFwKKwkJCQkJKGludCkodjRsMl9mcm1zaXplZW51bS5cCisJCQkJCQlkaXNjcmV0ZS5oZWlnaHQpKTsKKwkJCWJyZWFrOworCQl9CisJCWRlZmF1bHQ6IHsKKwkJCUpPTSg4LCAiJWk9aW5kZXg6IGV4aGF1c3RzIGZyYW1lc2l6ZXNcbiIsIGluZGV4KTsKKwkJCW11dGV4X3VubG9jaygmZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X3ZpZGVvKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCX0KKwl9IGVsc2UgeworCQlzd2l0Y2ggKGluZGV4KSB7CisJCWNhc2UgMDogeworCQkJdjRsMl9mcm1zaXplZW51bS5kaXNjcmV0ZS53aWR0aCA9IDY0MDsKKwkJCXY0bDJfZnJtc2l6ZWVudW0uZGlzY3JldGUuaGVpZ2h0ID0gNDgwOworCQkJSk9NKDgsICIlaT1pbmRleDogJWl4JWlcbiIsIGluZGV4LCBcCisJCQkJCShpbnQpKHY0bDJfZnJtc2l6ZWVudW0uXAorCQkJCQkJZGlzY3JldGUud2lkdGgpLCBcCisJCQkJCShpbnQpKHY0bDJfZnJtc2l6ZWVudW0uXAorCQkJCQkJZGlzY3JldGUuaGVpZ2h0KSk7CisJCQlicmVhazsKKwkJfQorCQljYXNlIDE6IHsKKwkJCXY0bDJfZnJtc2l6ZWVudW0uZGlzY3JldGUud2lkdGggPSAzMjA7CisJCQl2NGwyX2ZybXNpemVlbnVtLmRpc2NyZXRlLmhlaWdodCA9IDI0MDsKKwkJCUpPTSg4LCAiJWk9aW5kZXg6ICVpeCVpXG4iLCBpbmRleCwgXAorCQkJCQkoaW50KSh2NGwyX2ZybXNpemVlbnVtLlwKKwkJCQkJCWRpc2NyZXRlLndpZHRoKSwgXAorCQkJCQkoaW50KSh2NGwyX2ZybXNpemVlbnVtLlwKKwkJCQkJCWRpc2NyZXRlLmhlaWdodCkpOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSAyOiB7CisJCQl2NGwyX2ZybXNpemVlbnVtLmRpc2NyZXRlLndpZHRoID0gNzA0OworCQkJdjRsMl9mcm1zaXplZW51bS5kaXNjcmV0ZS5oZWlnaHQgPSA1NzY7CisJCQlKT00oOCwgIiVpPWluZGV4OiAlaXglaVxuIiwgaW5kZXgsIFwKKwkJCQkJKGludCkodjRsMl9mcm1zaXplZW51bS5cCisJCQkJCQlkaXNjcmV0ZS53aWR0aCksIFwKKwkJCQkJKGludCkodjRsMl9mcm1zaXplZW51bS5cCisJCQkJCQlkaXNjcmV0ZS5oZWlnaHQpKTsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgMzogeworCQkJdjRsMl9mcm1zaXplZW51bS5kaXNjcmV0ZS53aWR0aCA9IDcyMDsKKwkJCXY0bDJfZnJtc2l6ZWVudW0uZGlzY3JldGUuaGVpZ2h0ID0gNTc2OworCQkJSk9NKDgsICIlaT1pbmRleDogJWl4JWlcbiIsIGluZGV4LCBcCisJCQkJCShpbnQpKHY0bDJfZnJtc2l6ZWVudW0uXAorCQkJCQkJZGlzY3JldGUud2lkdGgpLCBcCisJCQkJCShpbnQpKHY0bDJfZnJtc2l6ZWVudW0uXAorCQkJCQkJZGlzY3JldGUuaGVpZ2h0KSk7CisJCQlicmVhazsKKwkJfQorCQljYXNlIDQ6IHsKKwkJCXY0bDJfZnJtc2l6ZWVudW0uZGlzY3JldGUud2lkdGggPSAzNjA7CisJCQl2NGwyX2ZybXNpemVlbnVtLmRpc2NyZXRlLmhlaWdodCA9IDI4ODsKKwkJCUpPTSg4LCAiJWk9aW5kZXg6ICVpeCVpXG4iLCBpbmRleCwgXAorCQkJCQkoaW50KSh2NGwyX2ZybXNpemVlbnVtLlwKKwkJCQkJCWRpc2NyZXRlLndpZHRoKSwgXAorCQkJCQkoaW50KSh2NGwyX2ZybXNpemVlbnVtLlwKKwkJCQkJCWRpc2NyZXRlLmhlaWdodCkpOworCQkJYnJlYWs7CisJCX0KKwkJZGVmYXVsdDogeworCQkJSk9NKDgsICIlaT1pbmRleDogZXhoYXVzdHMgZnJhbWVzaXplc1xuIiwgaW5kZXgpOworCQkJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfdmlkZW8pOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJfQorCX0KKwlpZiAoMCAhPSBjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLCAmdjRsMl9mcm1zaXplZW51bSwgXAorCQkJCQlzaXplb2Yoc3RydWN0IHY0bDJfZnJtc2l6ZWVudW0pKSkgeworCQltdXRleF91bmxvY2soJmVhc3ljYXBfZG9uZ2xlW2tkXS5tdXRleF92aWRlbyk7CisJCXJldHVybiAtRUZBVUxUOworCX0KKwlicmVhazsKIH0KKy8qIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KKy8qCisgKiAgVEhFIFJFU1BPTlNFIFRPIFZJRElPQ19FTlVNX0ZSQU1FSU5URVJWQUxTIE1VU1QgQkUgQ09ORElUSU9ORUQgT04gVEhFCisgKiAgVEhFIENVUlJFTlQgU1RBTkRBUkQsIEJFQ0FVU0UgVEhBVCBJUyBXSEFUIGdzdHJlYW1lciBFWFBFQ1RTLiAgQkVXQVJFLgorKi8KKy8qIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KIGNhc2UgVklESU9DX0VOVU1fRlJBTUVJTlRFUlZBTFM6IHsKLQlKT1QoOCwgIlZJRElPQ19FTlVNX0ZSQU1FX0lOVEVSVkFMUyB1bnN1cHBvcnRlZFxuIik7Ci0JcmV0dXJuIC1FSU5WQUw7CisJX191MzIgaW5kZXg7CisJaW50IGRlbm9taW5hdG9yOworCXN0cnVjdCB2NGwyX2ZybWl2YWxlbnVtIHY0bDJfZnJtaXZhbGVudW07CisKKwlKT00oOCwgIlZJRElPQ19FTlVNX0ZSQU1FSU5URVJWQUxTXG4iKTsKKworCWlmIChwZWFzeWNhcC0+ZnBzKQorCQlkZW5vbWluYXRvciA9IHBlYXN5Y2FwLT5mcHM7CisJZWxzZSB7CisJCWlmICh0cnVlID09IHBlYXN5Y2FwLT5udHNjKQorCQkJZGVub21pbmF0b3IgPSAzMDsKKwkJZWxzZQorCQkJZGVub21pbmF0b3IgPSAyNTsKKwl9CisKKwlpZiAoMCAhPSBjb3B5X2Zyb21fdXNlcigmdjRsMl9mcm1pdmFsZW51bSwgKHZvaWQgX191c2VyICopYXJnLCBcCisJCQkJCXNpemVvZihzdHJ1Y3QgdjRsMl9mcm1pdmFsZW51bSkpKSB7CisJCW11dGV4X3VubG9jaygmZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X3ZpZGVvKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJaW5kZXggPSB2NGwyX2ZybWl2YWxlbnVtLmluZGV4OworCisJdjRsMl9mcm1pdmFsZW51bS50eXBlID0gKF9fdTMyKSBWNEwyX0ZSTUlWQUxfVFlQRV9ESVNDUkVURTsKKworCXN3aXRjaCAoaW5kZXgpIHsKKwljYXNlIDA6IHsKKwkJdjRsMl9mcm1pdmFsZW51bS5kaXNjcmV0ZS5udW1lcmF0b3IgPSAxOworCQl2NGwyX2ZybWl2YWxlbnVtLmRpc2NyZXRlLmRlbm9taW5hdG9yID0gZGVub21pbmF0b3I7CisJCUpPTSg4LCAiJWk9aW5kZXg6ICVpLyVpXG4iLCBpbmRleCwgXAorCQkJKGludCkodjRsMl9mcm1pdmFsZW51bS5kaXNjcmV0ZS5udW1lcmF0b3IpLCBcCisJCQkoaW50KSh2NGwyX2ZybWl2YWxlbnVtLmRpc2NyZXRlLmRlbm9taW5hdG9yKSk7CisJCWJyZWFrOworCX0KKwljYXNlIDE6IHsKKwkJdjRsMl9mcm1pdmFsZW51bS5kaXNjcmV0ZS5udW1lcmF0b3IgPSAxOworCQl2NGwyX2ZybWl2YWxlbnVtLmRpc2NyZXRlLmRlbm9taW5hdG9yID0gZGVub21pbmF0b3IvNTsKKwkJSk9NKDgsICIlaT1pbmRleDogJWkvJWlcbiIsIGluZGV4LCBcCisJCQkoaW50KSh2NGwyX2ZybWl2YWxlbnVtLmRpc2NyZXRlLm51bWVyYXRvciksIFwKKwkJCShpbnQpKHY0bDJfZnJtaXZhbGVudW0uZGlzY3JldGUuZGVub21pbmF0b3IpKTsKKwkJYnJlYWs7CisJfQorCWRlZmF1bHQ6IHsKKwkJSk9NKDgsICIlaT1pbmRleDogZXhoYXVzdHMgZnJhbWVpbnRlcnZhbHNcbiIsIGluZGV4KTsKKwkJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfdmlkZW8pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJfQorCWlmICgwICE9IGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsICZ2NGwyX2ZybWl2YWxlbnVtLCBcCisJCQkJCXNpemVvZihzdHJ1Y3QgdjRsMl9mcm1pdmFsZW51bSkpKSB7CisJCW11dGV4X3VubG9jaygmZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X3ZpZGVvKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCWJyZWFrOwogfQogLyogLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLwogY2FzZSBWSURJT0NfR19GTVQ6IHsKLQlzdGF0aWMgc3RydWN0IHY0bDJfZm9ybWF0IHY0bDJfZm9ybWF0OwotCXN0YXRpYyBzdHJ1Y3QgdjRsMl9waXhfZm9ybWF0IHY0bDJfcGl4X2Zvcm1hdDsKKwlzdHJ1Y3QgdjRsMl9mb3JtYXQgKnB2NGwyX2Zvcm1hdDsKKwlzdHJ1Y3QgdjRsMl9waXhfZm9ybWF0ICpwdjRsMl9waXhfZm9ybWF0OwogCi0JSk9UKDgsICJWSURJT0NfR19GTVRcbiIpOwotCi0JaWYgKDAgIT0gY29weV9mcm9tX3VzZXIoJnY0bDJfZm9ybWF0LCAodm9pZCBfX3VzZXIgKilhcmcsIFwKKwlKT00oOCwgIlZJRElPQ19HX0ZNVFxuIik7CisJcHY0bDJfZm9ybWF0ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHY0bDJfZm9ybWF0KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwdjRsMl9mb3JtYXQpIHsKKwkJU0FNKCJFUlJPUjogb3V0IG9mIG1lbW9yeVxuIik7CisJCW11dGV4X3VubG9jaygmZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X3ZpZGVvKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCXB2NGwyX3BpeF9mb3JtYXQgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgdjRsMl9waXhfZm9ybWF0KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwdjRsMl9waXhfZm9ybWF0KSB7CisJCVNBTSgiRVJST1I6IG91dCBvZiBtZW1vcnlcbiIpOworCQlrZnJlZShwdjRsMl9mb3JtYXQpOworCQltdXRleF91bmxvY2soJmVhc3ljYXBfZG9uZ2xlW2tkXS5tdXRleF92aWRlbyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlpZiAoMCAhPSBjb3B5X2Zyb21fdXNlcihwdjRsMl9mb3JtYXQsICh2b2lkIF9fdXNlciAqKWFyZywgXAogCQkJCQlzaXplb2Yoc3RydWN0IHY0bDJfZm9ybWF0KSkpIHsKLQkJUE9VVDsKKwkJa2ZyZWUocHY0bDJfZm9ybWF0KTsKKwkJa2ZyZWUocHY0bDJfcGl4X2Zvcm1hdCk7CisJCW11dGV4X3VubG9jaygmZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X3ZpZGVvKTsKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJfQogCi0JaWYgKHY0bDJfZm9ybWF0LnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFKSB7Ci0JCVBPVVQ7CisJaWYgKHB2NGwyX2Zvcm1hdC0+dHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpIHsKKwkJa2ZyZWUocHY0bDJfZm9ybWF0KTsKKwkJa2ZyZWUocHY0bDJfcGl4X2Zvcm1hdCk7CisJCW11dGV4X3VubG9jaygmZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X3ZpZGVvKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JbWVtc2V0KCZ2NGwyX3BpeF9mb3JtYXQsIDAsIHNpemVvZihzdHJ1Y3QgdjRsMl9waXhfZm9ybWF0KSk7Ci0JdjRsMl9mb3JtYXQudHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRTsKLQltZW1jcHkoJih2NGwyX2Zvcm1hdC5mbXQucGl4KSwgXAotCQkJICYoZWFzeWNhcF9mb3JtYXRbcGVhc3ljYXAtPmZvcm1hdF9vZmZzZXRdXAotCQkJLnY0bDJfZm9ybWF0LmZtdC5waXgpLCBzaXplb2YodjRsMl9waXhfZm9ybWF0KSk7Ci0JSk9UKDgsICJ1c2VyIGlzIHRvbGQ6ICVzXG4iLCBcCisJbWVtc2V0KHB2NGwyX3BpeF9mb3JtYXQsIDAsIHNpemVvZihzdHJ1Y3QgdjRsMl9waXhfZm9ybWF0KSk7CisJcHY0bDJfZm9ybWF0LT50eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOworCW1lbWNweSgmcHY0bDJfZm9ybWF0LT5mbXQucGl4LCBcCisJCQkgJmVhc3ljYXBfZm9ybWF0W3BlYXN5Y2FwLT5mb3JtYXRfb2Zmc2V0XVwKKwkJCS52NGwyX2Zvcm1hdC5mbXQucGl4LCBzaXplb2Yoc3RydWN0IHY0bDJfcGl4X2Zvcm1hdCkpOworCUpPTSg4LCAidXNlciBpcyB0b2xkOiAlc1xuIiwgXAogCQkJJmVhc3ljYXBfZm9ybWF0W3BlYXN5Y2FwLT5mb3JtYXRfb2Zmc2V0XS5uYW1lWzBdKTsKIAotCWlmICgwICE9IGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsICZ2NGwyX2Zvcm1hdCwgXAorCWlmICgwICE9IGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsIHB2NGwyX2Zvcm1hdCwgXAogCQkJCQlzaXplb2Yoc3RydWN0IHY0bDJfZm9ybWF0KSkpIHsKLQkJUE9VVDsKKwkJa2ZyZWUocHY0bDJfZm9ybWF0KTsKKwkJa2ZyZWUocHY0bDJfcGl4X2Zvcm1hdCk7CisJCW11dGV4X3VubG9jaygmZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X3ZpZGVvKTsKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJfQorCWtmcmVlKHB2NGwyX2Zvcm1hdCk7CisJa2ZyZWUocHY0bDJfcGl4X2Zvcm1hdCk7CiAJYnJlYWs7CiB9CiAvKiAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCiBjYXNlIFZJRElPQ19UUllfRk1UOgogY2FzZSBWSURJT0NfU19GTVQ6IHsKLQlzdGF0aWMgc3RydWN0IHY0bDJfZm9ybWF0IHY0bDJfZm9ybWF0OwotCXN0YXRpYyBzdHJ1Y3QgdjRsMl9waXhfZm9ybWF0IHY0bDJfcGl4X2Zvcm1hdDsKLQlzdGF0aWMgYm9vbCB0cnk7Ci0Jc3RhdGljIGludCBiZXN0X2Zvcm1hdDsKKwlzdHJ1Y3QgdjRsMl9mb3JtYXQgdjRsMl9mb3JtYXQ7CisJc3RydWN0IHY0bDJfcGl4X2Zvcm1hdCB2NGwyX3BpeF9mb3JtYXQ7CisJYm9vbCB0cnk7CisJaW50IGJlc3RfZm9ybWF0OwogCiAJaWYgKFZJRElPQ19UUllfRk1UID09IGNtZCkgewotCQlKT1QoOCwgIlZJRElPQ19UUllfRk1UXG4iKTsKKwkJSk9NKDgsICJWSURJT0NfVFJZX0ZNVFxuIik7CiAJCXRyeSA9IHRydWU7CiAJfSBlbHNlIHsKLQkJSk9UKDgsICJWSURJT0NfU19GTVRcbiIpOworCQlKT00oOCwgIlZJRElPQ19TX0ZNVFxuIik7CiAJCXRyeSA9IGZhbHNlOwogCX0KIAogCWlmICgwICE9IGNvcHlfZnJvbV91c2VyKCZ2NGwyX2Zvcm1hdCwgKHZvaWQgX191c2VyICopYXJnLCBcCiAJCQkJCXNpemVvZihzdHJ1Y3QgdjRsMl9mb3JtYXQpKSkgewotCQlQT1VUOworCQltdXRleF91bmxvY2soJmVhc3ljYXBfZG9uZ2xlW2tkXS5tdXRleF92aWRlbyk7CiAJCXJldHVybiAtRUZBVUxUOwogCX0KIApAQCAtMTM1OSw3ICsxODMwLDEyIEBACiAJCQkJCXY0bDJfZm9ybWF0LmZtdC5waXguZmllbGQsIFwKIAkJCQkJdHJ5KTsKIAlpZiAoMCA+IGJlc3RfZm9ybWF0KSB7Ci0JCUpPVCg4LCAiV0FSTklORzogYWRqdXN0X2Zvcm1hdCgpIHJldHVybmVkICVpXG4iLCBiZXN0X2Zvcm1hdCk7CisJCWlmICgtRUJVU1kgPT0gYmVzdF9mb3JtYXQpIHsKKwkJCW11dGV4X3VubG9jaygmZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X3ZpZGVvKTsKKwkJCXJldHVybiAtRUJVU1k7CisJCX0KKwkJSk9NKDgsICJXQVJOSU5HOiBhZGp1c3RfZm9ybWF0KCkgcmV0dXJuZWQgJWlcbiIsIGJlc3RfZm9ybWF0KTsKKwkJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfdmlkZW8pOwogCQlyZXR1cm4gLUVOT0VOVDsKIAl9CiAvKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiovCkBAIC0xMzY4LDI5ICsxODQ0LDI5IEBACiAKIAltZW1jcHkoJih2NGwyX2Zvcm1hdC5mbXQucGl4KSwgJihlYXN5Y2FwX2Zvcm1hdFtiZXN0X2Zvcm1hdF1cCiAJCQkudjRsMl9mb3JtYXQuZm10LnBpeCksIHNpemVvZih2NGwyX3BpeF9mb3JtYXQpKTsKLQlKT1QoOCwgInVzZXIgaXMgdG9sZDogJXNcbiIsICZlYXN5Y2FwX2Zvcm1hdFtiZXN0X2Zvcm1hdF0ubmFtZVswXSk7CisJSk9NKDgsICJ1c2VyIGlzIHRvbGQ6ICVzXG4iLCAmZWFzeWNhcF9mb3JtYXRbYmVzdF9mb3JtYXRdLm5hbWVbMF0pOwogCiAJaWYgKDAgIT0gY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKWFyZywgJnY0bDJfZm9ybWF0LCBcCiAJCQkJCXNpemVvZihzdHJ1Y3QgdjRsMl9mb3JtYXQpKSkgewotCQlQT1VUOworCQltdXRleF91bmxvY2soJmVhc3ljYXBfZG9uZ2xlW2tkXS5tdXRleF92aWRlbyk7CiAJCXJldHVybiAtRUZBVUxUOwogCX0KIAlicmVhazsKIH0KIC8qIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KIGNhc2UgVklESU9DX0NST1BDQVA6IHsKLQlzdGF0aWMgc3RydWN0IHY0bDJfY3JvcGNhcCB2NGwyX2Nyb3BjYXA7CisJc3RydWN0IHY0bDJfY3JvcGNhcCB2NGwyX2Nyb3BjYXA7CiAKLQlKT1QoOCwgIlZJRElPQ19DUk9QQ0FQXG4iKTsKKwlKT00oOCwgIlZJRElPQ19DUk9QQ0FQXG4iKTsKIAogCWlmICgwICE9IGNvcHlfZnJvbV91c2VyKCZ2NGwyX2Nyb3BjYXAsICh2b2lkIF9fdXNlciAqKWFyZywgXAogCQkJCQlzaXplb2Yoc3RydWN0IHY0bDJfY3JvcGNhcCkpKSB7Ci0JCVBPVVQ7CisJCW11dGV4X3VubG9jaygmZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X3ZpZGVvKTsKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJfQogCiAJaWYgKHY0bDJfY3JvcGNhcC50eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSkKLQkJSk9UKDgsICJ2NGwyX2Nyb3BjYXAudHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkVcbiIpOworCQlKT00oOCwgInY0bDJfY3JvcGNhcC50eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRVxuIik7CiAKIAltZW1zZXQoJnY0bDJfY3JvcGNhcCwgMCwgc2l6ZW9mKHN0cnVjdCB2NGwyX2Nyb3BjYXApKTsKIAl2NGwyX2Nyb3BjYXAudHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRTsKQEAgLTE0MDUsMTEgKzE4ODEsMTEgQEAKIAl2NGwyX2Nyb3BjYXAucGl4ZWxhc3BlY3QubnVtZXJhdG9yID0gMTsKIAl2NGwyX2Nyb3BjYXAucGl4ZWxhc3BlY3QuZGVub21pbmF0b3IgPSAxOwogCi0JSk9UKDgsICJ1c2VyIGlzIHRvbGQ6ICVpeCVpXG4iLCBwZWFzeWNhcC0+d2lkdGgsIHBlYXN5Y2FwLT5oZWlnaHQpOworCUpPTSg4LCAidXNlciBpcyB0b2xkOiAlaXglaVxuIiwgcGVhc3ljYXAtPndpZHRoLCBwZWFzeWNhcC0+aGVpZ2h0KTsKIAogCWlmICgwICE9IGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsICZ2NGwyX2Nyb3BjYXAsIFwKIAkJCQkJc2l6ZW9mKHN0cnVjdCB2NGwyX2Nyb3BjYXApKSkgewotCQlQT1VUOworCQltdXRleF91bmxvY2soJmVhc3ljYXBfZG9uZ2xlW2tkXS5tdXRleF92aWRlbyk7CiAJCXJldHVybiAtRUZBVUxUOwogCX0KIAlicmVhazsKQEAgLTE0MTcsMTMgKzE4OTMsMTUgQEAKIC8qIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KIGNhc2UgVklESU9DX0dfQ1JPUDoKIGNhc2UgVklESU9DX1NfQ1JPUDogewotCUpPVCg4LCAiVklESU9DX0dfQ1JPUHxWSURJT0NfU19DUk9QICB1bnN1cHBvcnRlZFxuIik7CisJSk9NKDgsICJWSURJT0NfR19DUk9QfFZJRElPQ19TX0NST1AgIHVuc3VwcG9ydGVkXG4iKTsKKwltdXRleF91bmxvY2soJmVhc3ljYXBfZG9uZ2xlW2tkXS5tdXRleF92aWRlbyk7CiAJcmV0dXJuIC1FSU5WQUw7CiB9CiAvKiAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCiBjYXNlIFZJRElPQ19RVUVSWVNURDogewotCUpPVCg4LCAiVklESU9DX1FVRVJZU1REOiAiIFwKKwlKT00oOCwgIlZJRElPQ19RVUVSWVNURDogIiBcCiAJCQkiRWFzeUNBUCBpcyBpbmNhcGFibGUgb2YgZGV0ZWN0aW5nIHN0YW5kYXJkXG4iKTsKKwltdXRleF91bmxvY2soJmVhc3ljYXBfZG9uZ2xlW2tkXS5tdXRleF92aWRlbyk7CiAJcmV0dXJuIC1FSU5WQUw7CiAJYnJlYWs7CiB9CkBAIC0xNDM2LDE2ICsxOTE0LDE2IEBACiAgKi8KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIGNhc2UgVklESU9DX0VOVU1TVEQ6IHsKLQlzdGF0aWMgaW50IGxhc3QwID0gLTEsIGxhc3QxID0gLTEsIGxhc3QyID0gLTEsIGxhc3QzID0gLTE7Ci0Jc3RhdGljIHN0cnVjdCB2NGwyX3N0YW5kYXJkIHY0bDJfc3RhbmRhcmQ7Ci0Jc3RhdGljIF9fdTMyIGluZGV4OwotCXN0YXRpYyBzdHJ1Y3QgZWFzeWNhcF9zdGFuZGFyZCBjb25zdCAqcGVhc3ljYXBfc3RhbmRhcmQ7CisJaW50IGxhc3QwID0gLTEsIGxhc3QxID0gLTEsIGxhc3QyID0gLTEsIGxhc3QzID0gLTE7CisJc3RydWN0IHY0bDJfc3RhbmRhcmQgdjRsMl9zdGFuZGFyZDsKKwlfX3UzMiBpbmRleDsKKwlzdHJ1Y3QgZWFzeWNhcF9zdGFuZGFyZCBjb25zdCAqcGVhc3ljYXBfc3RhbmRhcmQ7CiAKLQlKT1QoOCwgIlZJRElPQ19FTlVNU1REXG4iKTsKKwlKT00oOCwgIlZJRElPQ19FTlVNU1REXG4iKTsKIAogCWlmICgwICE9IGNvcHlfZnJvbV91c2VyKCZ2NGwyX3N0YW5kYXJkLCAodm9pZCBfX3VzZXIgKilhcmcsIFwKIAkJCQkJc2l6ZW9mKHN0cnVjdCB2NGwyX3N0YW5kYXJkKSkpIHsKLQkJUE9VVDsKKwkJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfdmlkZW8pOwogCQlyZXR1cm4gLUVGQVVMVDsKIAl9CiAJaW5kZXggPSB2NGwyX3N0YW5kYXJkLmluZGV4OwpAQCAtMTQ2NiwxMCArMTk0NCwxMSBAQAogCQlwZWFzeWNhcF9zdGFuZGFyZCsrOwogCX0KIAlpZiAoMHhGRkZGID09IHBlYXN5Y2FwX3N0YW5kYXJkLT5tYXNrKSB7Ci0JCUpPVCg4LCAiJWk9aW5kZXg6IGV4aGF1c3RzIHN0YW5kYXJkc1xuIiwgaW5kZXgpOworCQlKT00oOCwgIiVpPWluZGV4OiBleGhhdXN0cyBzdGFuZGFyZHNcbiIsIGluZGV4KTsKKwkJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfdmlkZW8pOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9Ci0JSk9UKDgsICIlaT1pbmRleDogJXNcbiIsIGluZGV4LCBcCisJSk9NKDgsICIlaT1pbmRleDogJXNcbiIsIGluZGV4LCBcCiAJCQkJJihwZWFzeWNhcF9zdGFuZGFyZC0+djRsMl9zdGFuZGFyZC5uYW1lWzBdKSk7CiAJbWVtY3B5KCZ2NGwyX3N0YW5kYXJkLCAmKHBlYXN5Y2FwX3N0YW5kYXJkLT52NGwyX3N0YW5kYXJkKSwgXAogCQkJCQlzaXplb2Yoc3RydWN0IHY0bDJfc3RhbmRhcmQpKTsKQEAgLTE0NzgsODcgKzE5NTcsMTAxIEBACiAKIAlpZiAoMCAhPSBjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLCAmdjRsMl9zdGFuZGFyZCwgXAogCQkJCQlzaXplb2Yoc3RydWN0IHY0bDJfc3RhbmRhcmQpKSkgewotCQlQT1VUOworCQltdXRleF91bmxvY2soJmVhc3ljYXBfZG9uZ2xlW2tkXS5tdXRleF92aWRlbyk7CiAJCXJldHVybiAtRUZBVUxUOwogCX0KIAlicmVhazsKIH0KIC8qIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KIGNhc2UgVklESU9DX0dfU1REOiB7Ci0Jc3RhdGljIHY0bDJfc3RkX2lkIHN0ZF9pZDsKLQlzdGF0aWMgc3RydWN0IGVhc3ljYXBfc3RhbmRhcmQgY29uc3QgKnBlYXN5Y2FwX3N0YW5kYXJkOworCXY0bDJfc3RkX2lkIHN0ZF9pZDsKKwlzdHJ1Y3QgZWFzeWNhcF9zdGFuZGFyZCBjb25zdCAqcGVhc3ljYXBfc3RhbmRhcmQ7CiAKLQlKT1QoOCwgIlZJRElPQ19HX1NURFxuIik7CisJSk9NKDgsICJWSURJT0NfR19TVERcbiIpOworCisJaWYgKDAgPiBwZWFzeWNhcC0+c3RhbmRhcmRfb2Zmc2V0KSB7CisJCUpPTSg4LCAiJWk9cGVhc3ljYXAtPnN0YW5kYXJkX29mZnNldFxuIiwgXAorCQkJCQlwZWFzeWNhcC0+c3RhbmRhcmRfb2Zmc2V0KTsKKwkJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfdmlkZW8pOworCQlyZXR1cm4gLUVCVVNZOworCX0KIAogCWlmICgwICE9IGNvcHlfZnJvbV91c2VyKCZzdGRfaWQsICh2b2lkIF9fdXNlciAqKWFyZywgXAogCQkJCQkJc2l6ZW9mKHY0bDJfc3RkX2lkKSkpIHsKLQkJUE9VVDsKKwkJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfdmlkZW8pOwogCQlyZXR1cm4gLUVGQVVMVDsKIAl9CiAKIAlwZWFzeWNhcF9zdGFuZGFyZCA9ICZlYXN5Y2FwX3N0YW5kYXJkW3BlYXN5Y2FwLT5zdGFuZGFyZF9vZmZzZXRdOwogCXN0ZF9pZCA9IHBlYXN5Y2FwX3N0YW5kYXJkLT52NGwyX3N0YW5kYXJkLmlkOwogCi0JSk9UKDgsICJ1c2VyIGlzIHRvbGQ6ICVzXG4iLCBcCisJSk9NKDgsICJ1c2VyIGlzIHRvbGQ6ICVzXG4iLCBcCiAJCQkJJnBlYXN5Y2FwX3N0YW5kYXJkLT52NGwyX3N0YW5kYXJkLm5hbWVbMF0pOwogCiAJaWYgKDAgIT0gY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKWFyZywgJnN0ZF9pZCwgXAogCQkJCQkJc2l6ZW9mKHY0bDJfc3RkX2lkKSkpIHsKLQkJUE9VVDsKKwkJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfdmlkZW8pOwogCQlyZXR1cm4gLUVGQVVMVDsKIAl9CiAJYnJlYWs7CiB9CiAvKiAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCiBjYXNlIFZJRElPQ19TX1NURDogewotCXN0YXRpYyB2NGwyX3N0ZF9pZCBzdGRfaWQ7Ci0Jc3RhdGljIGludCByYzsKKwl2NGwyX3N0ZF9pZCBzdGRfaWQ7CisJaW50IHJjOwogCi0JSk9UKDgsICJWSURJT0NfU19TVERcbiIpOworCUpPTSg4LCAiVklESU9DX1NfU1REXG4iKTsKIAogCWlmICgwICE9IGNvcHlfZnJvbV91c2VyKCZzdGRfaWQsICh2b2lkIF9fdXNlciAqKWFyZywgXAogCQkJCQkJc2l6ZW9mKHY0bDJfc3RkX2lkKSkpIHsKLQkJUE9VVDsKKwkJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfdmlkZW8pOwogCQlyZXR1cm4gLUVGQVVMVDsKIAl9CiAKKwlKT00oOCwgIlVzZXIgcmVxdWVzdHMgc3RhbmRhcmQ6IDB4JTA4WCUwOFhcbiIsIFwKKwkJKGludCkoKHN0ZF9pZCAmICgoKHY0bDJfc3RkX2lkKTB4RkZGRkZGRkYpIDw8IDMyKSkgPj4gMzIpLCBcCisJCShpbnQpKHN0ZF9pZCAmICgodjRsMl9zdGRfaWQpMHhGRkZGRkZGRikpKTsKKwogCXJjID0gYWRqdXN0X3N0YW5kYXJkKHBlYXN5Y2FwLCBzdGRfaWQpOwogCWlmICgwID4gcmMpIHsKLQkJSk9UKDgsICJXQVJOSU5HOiBhZGp1c3Rfc3RhbmRhcmQoKSByZXR1cm5lZCAlaVxuIiwgcmMpOworCQlKT00oOCwgIldBUk5JTkc6IGFkanVzdF9zdGFuZGFyZCgpIHJldHVybmVkICVpXG4iLCByYyk7CisJCW11dGV4X3VubG9jaygmZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X3ZpZGVvKTsKIAkJcmV0dXJuIC1FTk9FTlQ7CiAJfQogCWJyZWFrOwogfQogLyogLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLwogY2FzZSBWSURJT0NfUkVRQlVGUzogewotCXN0YXRpYyBpbnQgbmJ1ZmZlcnM7Ci0Jc3RhdGljIHN0cnVjdCB2NGwyX3JlcXVlc3RidWZmZXJzIHY0bDJfcmVxdWVzdGJ1ZmZlcnM7CisJaW50IG5idWZmZXJzOworCXN0cnVjdCB2NGwyX3JlcXVlc3RidWZmZXJzIHY0bDJfcmVxdWVzdGJ1ZmZlcnM7CiAKLQlKT1QoOCwgIlZJRElPQ19SRVFCVUZTXG4iKTsKKwlKT00oOCwgIlZJRElPQ19SRVFCVUZTXG4iKTsKIAogCWlmICgwICE9IGNvcHlfZnJvbV91c2VyKCZ2NGwyX3JlcXVlc3RidWZmZXJzLCAodm9pZCBfX3VzZXIgKilhcmcsIFwKIAkJCQlzaXplb2Yoc3RydWN0IHY0bDJfcmVxdWVzdGJ1ZmZlcnMpKSkgewotCQlQT1VUOworCQltdXRleF91bmxvY2soJmVhc3ljYXBfZG9uZ2xlW2tkXS5tdXRleF92aWRlbyk7CiAJCXJldHVybiAtRUZBVUxUOwogCX0KIAotCWlmICh2NGwyX3JlcXVlc3RidWZmZXJzLnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFKQorCWlmICh2NGwyX3JlcXVlc3RidWZmZXJzLnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFKSB7CisJCW11dGV4X3VubG9jaygmZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X3ZpZGVvKTsKIAkJcmV0dXJuIC1FSU5WQUw7CisJfQogCWlmICh2NGwyX3JlcXVlc3RidWZmZXJzLm1lbW9yeSAhPSBWNEwyX01FTU9SWV9NTUFQKSB7Ci0JCVBPVVQ7CisJCW11dGV4X3VubG9jaygmZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X3ZpZGVvKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCW5idWZmZXJzID0gdjRsMl9yZXF1ZXN0YnVmZmVycy5jb3VudDsKLQlKT1QoOCwgIiAgICAgICAgICAgICAgICAgICBVc2VyIHJlcXVlc3RzICVpIGJ1ZmZlcnMgLi4uXG4iLCBuYnVmZmVycyk7CisJSk9NKDgsICIgICAgICAgICAgICAgICAgICAgVXNlciByZXF1ZXN0cyAlaSBidWZmZXJzIC4uLlxuIiwgbmJ1ZmZlcnMpOwogCWlmIChuYnVmZmVycyA8IDIpCiAJCW5idWZmZXJzID0gMjsKIAlpZiAobmJ1ZmZlcnMgPiBGUkFNRV9CVUZGRVJfTUFOWSkKIAkJbmJ1ZmZlcnMgPSBGUkFNRV9CVUZGRVJfTUFOWTsKIAlpZiAodjRsMl9yZXF1ZXN0YnVmZmVycy5jb3VudCA9PSBuYnVmZmVycykgewotCQlKT1QoOCwgIiAgICAgICAgICAgICAgICAgICAuLi4gYWdyZWUgdG8gICVpIGJ1ZmZlcnNcbiIsIFwKKwkJSk9NKDgsICIgICAgICAgICAgICAgICAgICAgLi4uIGFncmVlIHRvICAlaSBidWZmZXJzXG4iLCBcCiAJCQkJCQkJCW5idWZmZXJzKTsKIAl9IGVsc2UgewotCQlKT1QoOCwgIiAgICAgICAgICAgICAgICAgIC4uLiBpbnNpc3Qgb24gICVpIGJ1ZmZlcnNcbiIsIFwKKwkJSk9NKDgsICIgICAgICAgICAgICAgICAgICAuLi4gaW5zaXN0IG9uICAlaSBidWZmZXJzXG4iLCBcCiAJCQkJCQkJCW5idWZmZXJzKTsKIAkJdjRsMl9yZXF1ZXN0YnVmZmVycy5jb3VudCA9IG5idWZmZXJzOwogCX0KQEAgLTE1NjYsMzIgKzIwNTksMzUgQEAKIAogCWlmICgwICE9IGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsICZ2NGwyX3JlcXVlc3RidWZmZXJzLCBcCiAJCQkJc2l6ZW9mKHN0cnVjdCB2NGwyX3JlcXVlc3RidWZmZXJzKSkpIHsKLQkJUE9VVDsKKwkJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfdmlkZW8pOwogCQlyZXR1cm4gLUVGQVVMVDsKIAl9CiAJYnJlYWs7CiB9CiAvKiAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCiBjYXNlIFZJRElPQ19RVUVSWUJVRjogewotCXN0YXRpYyBfX3UzMiBpbmRleDsKLQlzdGF0aWMgc3RydWN0IHY0bDJfYnVmZmVyIHY0bDJfYnVmZmVyOworCV9fdTMyIGluZGV4OworCXN0cnVjdCB2NGwyX2J1ZmZlciB2NGwyX2J1ZmZlcjsKIAotCUpPVCg4LCAiVklESU9DX1FVRVJZQlVGXG4iKTsKKwlKT00oOCwgIlZJRElPQ19RVUVSWUJVRlxuIik7CiAKIAlpZiAocGVhc3ljYXAtPnZpZGVvX2VvZikgewotCQlKT1QoOCwgInJldHVybmluZyAtMSBiZWNhdXNlICAlaT12aWRlb19lb2ZcbiIsIFwKKwkJSk9NKDgsICJyZXR1cm5pbmcgLUVJTyBiZWNhdXNlICAlaT12aWRlb19lb2ZcbiIsIFwKIAkJCQkJCQlwZWFzeWNhcC0+dmlkZW9fZW9mKTsKLQkJcmV0dXJuIC0xOworCQltdXRleF91bmxvY2soJmVhc3ljYXBfZG9uZ2xlW2tkXS5tdXRleF92aWRlbyk7CisJCXJldHVybiAtRUlPOwogCX0KIAogCWlmICgwICE9IGNvcHlfZnJvbV91c2VyKCZ2NGwyX2J1ZmZlciwgKHZvaWQgX191c2VyICopYXJnLCBcCiAJCQkJCXNpemVvZihzdHJ1Y3QgdjRsMl9idWZmZXIpKSkgewotCQlQT1VUOworCQltdXRleF91bmxvY2soJmVhc3ljYXBfZG9uZ2xlW2tkXS5tdXRleF92aWRlbyk7CiAJCXJldHVybiAtRUZBVUxUOwogCX0KIAotCWlmICh2NGwyX2J1ZmZlci50eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSkKKwlpZiAodjRsMl9idWZmZXIudHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpIHsKKwkJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfdmlkZW8pOwogCQlyZXR1cm4gLUVJTlZBTDsKKwl9CiAJaW5kZXggPSB2NGwyX2J1ZmZlci5pbmRleDsKIAlpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IHBlYXN5Y2FwLT5mcmFtZV9idWZmZXJfbWFueSkKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0xNjAyLDQ5ICsyMDk4LDU1IEBACiAJdjRsMl9idWZmZXIuZmxhZ3MgPSBWNEwyX0JVRl9GTEFHX01BUFBFRCB8IFwKIAkJCQkJCXBlYXN5Y2FwLT5kb25lW2luZGV4XSB8IFwKIAkJCQkJCXBlYXN5Y2FwLT5xdWV1ZWRbaW5kZXhdOwotCXY0bDJfYnVmZmVyLmZpZWxkID0gcGVhc3ljYXAtPmZpZWxkOworCXY0bDJfYnVmZmVyLmZpZWxkID0gVjRMMl9GSUVMRF9OT05FOwogCXY0bDJfYnVmZmVyLm1lbW9yeSA9IFY0TDJfTUVNT1JZX01NQVA7CiAJdjRsMl9idWZmZXIubS5vZmZzZXQgPSBpbmRleCAqIEZSQU1FX0JVRkZFUl9TSVpFOwogCXY0bDJfYnVmZmVyLmxlbmd0aCA9IEZSQU1FX0JVRkZFUl9TSVpFOwogCi0JSk9UKDE2LCAiICAlMTBpPWluZGV4XG4iLCB2NGwyX2J1ZmZlci5pbmRleCk7Ci0JSk9UKDE2LCAiICAweCUwOFg9dHlwZVxuIiwgdjRsMl9idWZmZXIudHlwZSk7Ci0JSk9UKDE2LCAiICAlMTBpPWJ5dGVzdXNlZFxuIiwgdjRsMl9idWZmZXIuYnl0ZXN1c2VkKTsKLQlKT1QoMTYsICIgIDB4JTA4WD1mbGFnc1xuIiwgdjRsMl9idWZmZXIuZmxhZ3MpOwotCUpPVCgxNiwgIiAgJTEwaT1maWVsZFxuIiwgdjRsMl9idWZmZXIuZmllbGQpOwotCUpPVCgxNiwgIiAgJTEwbGk9dGltZXN0YW1wLnR2X3VzZWNcbiIsIFwKKwlKT00oMTYsICIgICUxMGk9aW5kZXhcbiIsIHY0bDJfYnVmZmVyLmluZGV4KTsKKwlKT00oMTYsICIgIDB4JTA4WD10eXBlXG4iLCB2NGwyX2J1ZmZlci50eXBlKTsKKwlKT00oMTYsICIgICUxMGk9Ynl0ZXN1c2VkXG4iLCB2NGwyX2J1ZmZlci5ieXRlc3VzZWQpOworCUpPTSgxNiwgIiAgMHglMDhYPWZsYWdzXG4iLCB2NGwyX2J1ZmZlci5mbGFncyk7CisJSk9NKDE2LCAiICAlMTBpPWZpZWxkXG4iLCB2NGwyX2J1ZmZlci5maWVsZCk7CisJSk9NKDE2LCAiICAlMTBsaT10aW1lc3RhbXAudHZfdXNlY1xuIiwgXAogCQkJCQkgKGxvbmcpdjRsMl9idWZmZXIudGltZXN0YW1wLnR2X3VzZWMpOwotCUpPVCgxNiwgIiAgJTEwaT1zZXF1ZW5jZVxuIiwgdjRsMl9idWZmZXIuc2VxdWVuY2UpOwotCUpPVCgxNiwgIiAgMHglMDhYPW1lbW9yeVxuIiwgdjRsMl9idWZmZXIubWVtb3J5KTsKLQlKT1QoMTYsICIgICUxMGk9bS5vZmZzZXRcbiIsIHY0bDJfYnVmZmVyLm0ub2Zmc2V0KTsKLQlKT1QoMTYsICIgICUxMGk9bGVuZ3RoXG4iLCB2NGwyX2J1ZmZlci5sZW5ndGgpOworCUpPTSgxNiwgIiAgJTEwaT1zZXF1ZW5jZVxuIiwgdjRsMl9idWZmZXIuc2VxdWVuY2UpOworCUpPTSgxNiwgIiAgMHglMDhYPW1lbW9yeVxuIiwgdjRsMl9idWZmZXIubWVtb3J5KTsKKwlKT00oMTYsICIgICUxMGk9bS5vZmZzZXRcbiIsIHY0bDJfYnVmZmVyLm0ub2Zmc2V0KTsKKwlKT00oMTYsICIgICUxMGk9bGVuZ3RoXG4iLCB2NGwyX2J1ZmZlci5sZW5ndGgpOwogCiAJaWYgKDAgIT0gY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKWFyZywgJnY0bDJfYnVmZmVyLCBcCiAJCQkJCXNpemVvZihzdHJ1Y3QgdjRsMl9idWZmZXIpKSkgewotCQlQT1VUOworCQltdXRleF91bmxvY2soJmVhc3ljYXBfZG9uZ2xlW2tkXS5tdXRleF92aWRlbyk7CiAJCXJldHVybiAtRUZBVUxUOwogCX0KIAlicmVhazsKIH0KIC8qIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KIGNhc2UgVklESU9DX1FCVUY6IHsKLQlzdGF0aWMgc3RydWN0IHY0bDJfYnVmZmVyIHY0bDJfYnVmZmVyOworCXN0cnVjdCB2NGwyX2J1ZmZlciB2NGwyX2J1ZmZlcjsKIAotCUpPVCg4LCAiVklESU9DX1FCVUZcbiIpOworCUpPTSg4LCAiVklESU9DX1FCVUZcbiIpOwogCiAJaWYgKDAgIT0gY29weV9mcm9tX3VzZXIoJnY0bDJfYnVmZmVyLCAodm9pZCBfX3VzZXIgKilhcmcsIFwKIAkJCQkJc2l6ZW9mKHN0cnVjdCB2NGwyX2J1ZmZlcikpKSB7Ci0JCVBPVVQ7CisJCW11dGV4X3VubG9jaygmZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X3ZpZGVvKTsKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJfQogCi0JaWYgKHY0bDJfYnVmZmVyLnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFKQorCWlmICh2NGwyX2J1ZmZlci50eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSkgeworCQltdXRleF91bmxvY2soJmVhc3ljYXBfZG9uZ2xlW2tkXS5tdXRleF92aWRlbyk7CiAJCXJldHVybiAtRUlOVkFMOwotCWlmICh2NGwyX2J1ZmZlci5tZW1vcnkgIT0gVjRMMl9NRU1PUllfTU1BUCkKKwl9CisJaWYgKHY0bDJfYnVmZmVyLm1lbW9yeSAhPSBWNEwyX01FTU9SWV9NTUFQKSB7CisJCW11dGV4X3VubG9jaygmZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X3ZpZGVvKTsKIAkJcmV0dXJuIC1FSU5WQUw7CisJfQogCWlmICh2NGwyX2J1ZmZlci5pbmRleCA8IDAgfHwgXAotCQkgKHY0bDJfYnVmZmVyLmluZGV4ID49IHBlYXN5Y2FwLT5mcmFtZV9idWZmZXJfbWFueSkpCisJCSAodjRsMl9idWZmZXIuaW5kZXggPj0gcGVhc3ljYXAtPmZyYW1lX2J1ZmZlcl9tYW55KSkgeworCQltdXRleF91bmxvY2soJmVhc3ljYXBfZG9uZ2xlW2tkXS5tdXRleF92aWRlbyk7CiAJCXJldHVybiAtRUlOVkFMOworCX0KIAl2NGwyX2J1ZmZlci5mbGFncyA9IFY0TDJfQlVGX0ZMQUdfTUFQUEVEIHwgVjRMMl9CVUZfRkxBR19RVUVVRUQ7CiAKIAlwZWFzeWNhcC0+ZG9uZVt2NGwyX2J1ZmZlci5pbmRleF0gICA9IDA7CkBAIC0xNjUyLDExICsyMTU0LDExIEBACiAKIAlpZiAoMCAhPSBjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLCAmdjRsMl9idWZmZXIsIFwKIAkJCQkJc2l6ZW9mKHN0cnVjdCB2NGwyX2J1ZmZlcikpKSB7Ci0JCVBPVVQ7CisJCW11dGV4X3VubG9jaygmZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X3ZpZGVvKTsKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJfQogCi0JSk9UKDgsICIuLi4uLiAgIHVzZXIgcXVldWVpbmcgZnJhbWUgYnVmZmVyICVpXG4iLCBcCisJSk9NKDgsICIuLi4uLiAgIHVzZXIgcXVldWVpbmcgZnJhbWUgYnVmZmVyICVpXG4iLCBcCiAJCQkJCQkoaW50KXY0bDJfYnVmZmVyLmluZGV4KTsKIAogCXBlYXN5Y2FwLT5mcmFtZV9sb2NrID0gMDsKQEAgLTE2NjcsMzYgKzIxNjksNjAgQEAKIGNhc2UgVklESU9DX0RRQlVGOgogCXsKICNpZiBkZWZpbmVkKEFVRElPVElNRSkKLQlzdGF0aWMgc3RydWN0IHNpZ25lZF9kaXZfcmVzdWx0IHNkcjsKLQlzdGF0aWMgbG9uZyBsb25nIGludCBhYm92ZSwgYmVsb3csIGRuYnlkdCwgZnVkZ2UsIHNsbDsKLQlzdGF0aWMgdW5zaWduZWQgbG9uZyBsb25nIGludCB1bGw7Ci0Jc3RhdGljIHN0cnVjdCB0aW1ldmFsIHRpbWV2YWwwOworCXN0cnVjdCBzaWduZWRfZGl2X3Jlc3VsdCBzZHI7CisJbG9uZyBsb25nIGludCBhYm92ZSwgYmVsb3csIGRuYnlkdCwgZnVkZ2UsIHNsbDsKKwl1bnNpZ25lZCBsb25nIGxvbmcgaW50IHVsbDsKKwlzdHJ1Y3QgdGltZXZhbCB0aW1ldmFsODsKIAlzdHJ1Y3QgdGltZXZhbCB0aW1ldmFsMTsKICNlbmRpZiAvKkFVRElPVElNRSovCi0Jc3RhdGljIHN0cnVjdCB0aW1ldmFsIHRpbWV2YWwsIHRpbWV2YWwyOwotCXN0YXRpYyBpbnQgaSwgajsKLQlzdGF0aWMgc3RydWN0IHY0bDJfYnVmZmVyIHY0bDJfYnVmZmVyOworCXN0cnVjdCB0aW1ldmFsIHRpbWV2YWwsIHRpbWV2YWwyOworCWludCBpLCBqOworCXN0cnVjdCB2NGwyX2J1ZmZlciB2NGwyX2J1ZmZlcjsKKwlpbnQgcmNkcTsKKwlfX3UxNiBpbnB1dDsKIAotCUpPVCg4LCAiVklESU9DX0RRQlVGXG4iKTsKKwlKT00oOCwgIlZJRElPQ19EUUJVRlxuIik7CiAKIAlpZiAoKHBlYXN5Y2FwLT52aWRlb19pZGxlKSB8fCAocGVhc3ljYXAtPnZpZGVvX2VvZikpIHsKLQkJSk9UKDgsICJyZXR1cm5pbmcgLUVJTyBiZWNhdXNlICAiIFwKKwkJSk9NKDgsICJyZXR1cm5pbmcgLUVJTyBiZWNhdXNlICAiIFwKIAkJCQkiJWk9dmlkZW9faWRsZSAgJWk9dmlkZW9fZW9mXG4iLCBcCiAJCQkJcGVhc3ljYXAtPnZpZGVvX2lkbGUsIHBlYXN5Y2FwLT52aWRlb19lb2YpOworCQltdXRleF91bmxvY2soJmVhc3ljYXBfZG9uZ2xlW2tkXS5tdXRleF92aWRlbyk7CiAJCXJldHVybiAtRUlPOwogCX0KIAogCWlmICgwICE9IGNvcHlfZnJvbV91c2VyKCZ2NGwyX2J1ZmZlciwgKHZvaWQgX191c2VyICopYXJnLCBcCiAJCQkJCXNpemVvZihzdHJ1Y3QgdjRsMl9idWZmZXIpKSkgewotCQlQT1VUOworCQltdXRleF91bmxvY2soJmVhc3ljYXBfZG9uZ2xlW2tkXS5tdXRleF92aWRlbyk7CiAJCXJldHVybiAtRUZBVUxUOwogCX0KIAotCWlmICh2NGwyX2J1ZmZlci50eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSkKKwlpZiAodjRsMl9idWZmZXIudHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpIHsKKwkJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfdmlkZW8pOwogCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAodHJ1ZSA9PSBwZWFzeWNhcC0+b2ZmZXJmaWVsZHMpIHsKKwkJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJCS8qCisJCSAqICBJTiBJVFMgNTAgImZwcyIgTU9ERSB0dnRpbWUgU0VFTVMgQUxXQVlTIFRPIFJFUVVFU1QKKwkJICogIFY0TDJfRklFTERfQk9UVE9NCisJCSovCisJCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCQlpZiAoVjRMMl9GSUVMRF9UT1AgPT0gdjRsMl9idWZmZXIuZmllbGQpCisJCQlKT00oOCwgInVzZXIgd2FudHMgVjRMMl9GSUVMRF9UT1BcbiIpOworCQllbHNlIGlmIChWNEwyX0ZJRUxEX0JPVFRPTSA9PSB2NGwyX2J1ZmZlci5maWVsZCkKKwkJCUpPTSg4LCAidXNlciB3YW50cyBWNEwyX0ZJRUxEX0JPVFRPTVxuIik7CisJCWVsc2UgaWYgKFY0TDJfRklFTERfQU5ZID09IHY0bDJfYnVmZmVyLmZpZWxkKQorCQkJSk9NKDgsICJ1c2VyIHdhbnRzIFY0TDJfRklFTERfQU5ZXG4iKTsKKwkJZWxzZQorCQkJSk9NKDgsICJ1c2VyIHdhbnRzIFY0TDJfRklFTERfLi4uVU5LTk9XTjogJWlcbiIsIFwKKwkJCQkJCQl2NGwyX2J1ZmZlci5maWVsZCk7CisJfQogCiAJaWYgKCFwZWFzeWNhcC0+dmlkZW9faXNvY19zdHJlYW1pbmcpIHsKLQkJSk9UKDE2LCAicmV0dXJuaW5nIC1FSU8gYmVjYXVzZSB2aWRlbyB1cmJzIG5vdCBzdHJlYW1pbmdcbiIpOworCQlKT00oMTYsICJyZXR1cm5pbmcgLUVJTyBiZWNhdXNlIHZpZGVvIHVyYnMgbm90IHN0cmVhbWluZ1xuIik7CisJCW11dGV4X3VubG9jaygmZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X3ZpZGVvKTsKIAkJcmV0dXJuIC1FSU87CiAJfQogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpAQCAtMTcwOCwxOSArMjIzNCwyOCBAQAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCiAJaWYgKCFwZWFzeWNhcC0+cG9sbGVkKSB7Ci0JCWlmICgtRUlPID09IGVhc3ljYXBfZHFidWYocGVhc3ljYXAsIDApKQotCQkJcmV0dXJuIC1FSU87CisJCWRvIHsKKwkJCXJjZHEgPSBlYXN5Y2FwX2RxYnVmKHBlYXN5Y2FwLCAwKTsKKwkJCWlmICgtRUlPID09IHJjZHEpIHsKKwkJCQlKT00oOCwgInJldHVybmluZyAtRUlPIGJlY2F1c2UgIiBcCisJCQkJCQkiZHFidWYoKSByZXR1cm5lZCAtRUlPXG4iKTsKKwkJCQltdXRleF91bmxvY2soJmVhc3ljYXBfZG9uZ2xlW2tkXS5tdXRleF92aWRlbyk7CisJCQkJcmV0dXJuIC1FSU87CisJCQl9CisJCX0gd2hpbGUgKDAgIT0gcmNkcSk7CiAJfSBlbHNlIHsKLQkJaWYgKHBlYXN5Y2FwLT52aWRlb19lb2YpCisJCWlmIChwZWFzeWNhcC0+dmlkZW9fZW9mKSB7CisJCQltdXRleF91bmxvY2soJmVhc3ljYXBfZG9uZ2xlW2tkXS5tdXRleF92aWRlbyk7CiAJCQlyZXR1cm4gLUVJTzsKKwkJfQogCX0KIAlpZiAoVjRMMl9CVUZfRkxBR19ET05FICE9IHBlYXN5Y2FwLT5kb25lW3BlYXN5Y2FwLT5mcmFtZV9yZWFkXSkgewotCQlTQVkoIkVSUk9SOiBWNEwyX0JVRl9GTEFHX0RPTkUgIT0gMHglMDhYXG4iLCBcCisJCVNBTSgiRVJST1I6IFY0TDJfQlVGX0ZMQUdfRE9ORSAhPSAweCUwOFhcbiIsIFwKIAkJCQkJcGVhc3ljYXAtPmRvbmVbcGVhc3ljYXAtPmZyYW1lX3JlYWRdKTsKIAl9CiAJcGVhc3ljYXAtPnBvbGxlZCA9IDA7CiAKLQlpZiAoIShpc2VxdWVuY2UgJSAxMCkpIHsKKwlpZiAoIShwZWFzeWNhcC0+aXNlcXVlbmNlICUgMTApKSB7CiAJCWZvciAoaSA9IDA7IGkgPCAxNzk7IGkrKykKIAkJCXBlYXN5Y2FwLT5tZXJpdFtpXSA9IHBlYXN5Y2FwLT5tZXJpdFtpKzFdOwogCQlwZWFzeWNhcC0+bWVyaXRbMTc5XSA9IG1lcml0X3NhYShwZWFzeWNhcC0+cHVzYl9kZXZpY2UpOwpAQCAtMTcyOCw3ICsyMjYzLDcgQEAKIAkJZm9yIChpID0gMDsgaSA8IDE4MDsgaSsrKQogCQkJaiArPSBwZWFzeWNhcC0+bWVyaXRbaV07CiAJCWlmICg5MCA8IGopIHsKLQkJCVNBWSgiZWFzeWNhcCBkcml2ZXIgc2h1dHRpbmcgZG93biAiIFwKKwkJCVNBTSgiZWFzeWNhcCBkcml2ZXIgc2h1dHRpbmcgZG93biAiIFwKIAkJCQkJCQkib24gY29uZGl0aW9uIGJsdWVcbiIpOwogCQkJcGVhc3ljYXAtPnZpZGVvX2VvZiA9IDE7IHBlYXN5Y2FwLT5hdWRpb19lb2YgPSAxOwogCQl9CkBAIC0xNzM4LDMxICsyMjczLDIzIEBACiAJdjRsMl9idWZmZXIudHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRTsKIAl2NGwyX2J1ZmZlci5ieXRlc3VzZWQgPSBwZWFzeWNhcC0+ZnJhbWVfYnVmZmVyX3VzZWQ7CiAJdjRsMl9idWZmZXIuZmxhZ3MgPSBWNEwyX0JVRl9GTEFHX01BUFBFRCB8IFY0TDJfQlVGX0ZMQUdfRE9ORTsKLQl2NGwyX2J1ZmZlci5maWVsZCA9ICBwZWFzeWNhcC0+ZmllbGQ7Ci0JaWYgKFY0TDJfRklFTERfQUxURVJOQVRFID09IHY0bDJfYnVmZmVyLmZpZWxkKQotCQl2NGwyX2J1ZmZlci5maWVsZCA9IFwKLQkJCQkweDAwMEYgJiAocGVhc3ljYXAtPlwKLQkJCQlmcmFtZV9idWZmZXJbcGVhc3ljYXAtPmZyYW1lX3JlYWRdWzBdLmtvdW50KTsKKwlpZiAodHJ1ZSA9PSBwZWFzeWNhcC0+b2ZmZXJmaWVsZHMpCisJCXY0bDJfYnVmZmVyLmZpZWxkID0gVjRMMl9GSUVMRF9CT1RUT007CisJZWxzZQorCQl2NGwyX2J1ZmZlci5maWVsZCA9IFY0TDJfRklFTERfTk9ORTsKIAlkb19nZXR0aW1lb2ZkYXkoJnRpbWV2YWwpOwogCXRpbWV2YWwyID0gdGltZXZhbDsKIAogI2lmIGRlZmluZWQoQVVESU9USU1FKQogCWlmICghcGVhc3ljYXAtPnRpbWV2YWwwLnR2X3NlYykgewotCQl0aW1ldmFsMCA9IHRpbWV2YWw7CisJCXRpbWV2YWw4ID0gdGltZXZhbDsKIAkJdGltZXZhbDEgPSB0aW1ldmFsOwogCQl0aW1ldmFsMiA9IHRpbWV2YWw7CiAJCWRuYnlkdCA9IDE5MjAwMDsKLQotCQlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCYocGVhc3ljYXAtPm11dGV4X3RpbWV2YWwwKSkpCi0JCQlyZXR1cm4gLUVSRVNUQVJUU1lTOwotCQlwZWFzeWNhcC0+dGltZXZhbDAgPSB0aW1ldmFsMDsKLQkJbXV0ZXhfdW5sb2NrKCYocGVhc3ljYXAtPm11dGV4X3RpbWV2YWwwKSk7CisJCXBlYXN5Y2FwLT50aW1ldmFsMCA9IHRpbWV2YWw4OwogCX0gZWxzZSB7Ci0JCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJihwZWFzeWNhcC0+bXV0ZXhfdGltZXZhbDEpKSkKLQkJCXJldHVybiAtRVJFU1RBUlRTWVM7CiAJCWRuYnlkdCA9IHBlYXN5Y2FwLT5kbmJ5ZHQ7CiAJCXRpbWV2YWwxID0gcGVhc3ljYXAtPnRpbWV2YWwxOwotCQltdXRleF91bmxvY2soJihwZWFzeWNhcC0+bXV0ZXhfdGltZXZhbDEpKTsKIAkJYWJvdmUgPSBkbmJ5ZHQgKiBNSUNST1NFQ09ORFModGltZXZhbCwgdGltZXZhbDEpOwogCQliZWxvdyA9IDE5MjAwMDsKIAkJc2RyID0gc2lnbmVkX2RpdihhYm92ZSwgYmVsb3cpOwpAQCAtMTc3NCw3MiArMjMwMSw3NiBAQAogCQl0aW1ldmFsMi50dl91c2VjID0gc2RyLnJlbWFpbmRlcjsKIAkJdGltZXZhbDIudHZfc2VjID0gdGltZXZhbDEudHZfc2VjICsgc2RyLnF1b3RpZW50OwogCX0KLQlpZiAoIShpc2VxdWVuY2UgJSA1MDApKSB7CisJaWYgKCEocGVhc3ljYXAtPmlzZXF1ZW5jZSAlIDUwMCkpIHsKIAkJZnVkZ2UgPSAoKGxvbmcgbG9uZyBpbnQpKDEwMDAwMDApKSAqIFwKIAkJCQkoKGxvbmcgbG9uZyBpbnQpKHRpbWV2YWwudHZfc2VjIC0gXAogCQkJCQkJdGltZXZhbDIudHZfc2VjKSkgKyBcCiAJCQkJKGxvbmcgbG9uZyBpbnQpKHRpbWV2YWwudHZfdXNlYyAtIFwKLQkJCQl0aW1ldmFsMi50dl91c2VjKTsKKwkJCQkJCXRpbWV2YWwyLnR2X3VzZWMpOwogCQlzZHIgPSBzaWduZWRfZGl2KGZ1ZGdlLCAxMDAwKTsKIAkJc2xsID0gc2RyLnF1b3RpZW50OwogCQl1bGwgPSBzZHIucmVtYWluZGVyOwogCi0JCVNBWSgiJTVsbGkuJS0zbGxpPW1zIHRpbWVzdGFtcCBmdWRnZVxuIiwgc2xsLCB1bGwpOworCQlTQU0oIiU1bGxpLiUtM2xsaT1tcyB0aW1lc3RhbXAgZnVkZ2VcbiIsIHNsbCwgdWxsKTsKIAl9CiAjZW5kaWYgLypBVURJT1RJTUUqLwogCiAJdjRsMl9idWZmZXIudGltZXN0YW1wID0gdGltZXZhbDI7Ci0JdjRsMl9idWZmZXIuc2VxdWVuY2UgPSBpc2VxdWVuY2UrKzsKKwl2NGwyX2J1ZmZlci5zZXF1ZW5jZSA9IHBlYXN5Y2FwLT5pc2VxdWVuY2UrKzsKIAl2NGwyX2J1ZmZlci5tZW1vcnkgPSBWNEwyX01FTU9SWV9NTUFQOwogCXY0bDJfYnVmZmVyLm0ub2Zmc2V0ID0gdjRsMl9idWZmZXIuaW5kZXggKiBGUkFNRV9CVUZGRVJfU0laRTsKIAl2NGwyX2J1ZmZlci5sZW5ndGggPSBGUkFNRV9CVUZGRVJfU0laRTsKIAotCUpPVCgxNiwgIiAgJTEwaT1pbmRleFxuIiwgdjRsMl9idWZmZXIuaW5kZXgpOwotCUpPVCgxNiwgIiAgMHglMDhYPXR5cGVcbiIsIHY0bDJfYnVmZmVyLnR5cGUpOwotCUpPVCgxNiwgIiAgJTEwaT1ieXRlc3VzZWRcbiIsIHY0bDJfYnVmZmVyLmJ5dGVzdXNlZCk7Ci0JSk9UKDE2LCAiICAweCUwOFg9ZmxhZ3NcbiIsIHY0bDJfYnVmZmVyLmZsYWdzKTsKLQlKT1QoMTYsICIgICUxMGk9ZmllbGRcbiIsIHY0bDJfYnVmZmVyLmZpZWxkKTsKLQlKT1QoMTYsICIgICUxMGxpPXRpbWVzdGFtcC50dl91c2VjXG4iLCBcCisJSk9NKDE2LCAiICAlMTBpPWluZGV4XG4iLCB2NGwyX2J1ZmZlci5pbmRleCk7CisJSk9NKDE2LCAiICAweCUwOFg9dHlwZVxuIiwgdjRsMl9idWZmZXIudHlwZSk7CisJSk9NKDE2LCAiICAlMTBpPWJ5dGVzdXNlZFxuIiwgdjRsMl9idWZmZXIuYnl0ZXN1c2VkKTsKKwlKT00oMTYsICIgIDB4JTA4WD1mbGFnc1xuIiwgdjRsMl9idWZmZXIuZmxhZ3MpOworCUpPTSgxNiwgIiAgJTEwaT1maWVsZFxuIiwgdjRsMl9idWZmZXIuZmllbGQpOworCUpPTSgxNiwgIiAgJTEwbGk9dGltZXN0YW1wLnR2X3NlY1xuIiwgXAorCQkJCQkobG9uZyl2NGwyX2J1ZmZlci50aW1lc3RhbXAudHZfc2VjKTsKKwlKT00oMTYsICIgICUxMGxpPXRpbWVzdGFtcC50dl91c2VjXG4iLCBcCiAJCQkJCShsb25nKXY0bDJfYnVmZmVyLnRpbWVzdGFtcC50dl91c2VjKTsKLQlKT1QoMTYsICIgICUxMGk9c2VxdWVuY2VcbiIsIHY0bDJfYnVmZmVyLnNlcXVlbmNlKTsKLQlKT1QoMTYsICIgIDB4JTA4WD1tZW1vcnlcbiIsIHY0bDJfYnVmZmVyLm1lbW9yeSk7Ci0JSk9UKDE2LCAiICAlMTBpPW0ub2Zmc2V0XG4iLCB2NGwyX2J1ZmZlci5tLm9mZnNldCk7Ci0JSk9UKDE2LCAiICAlMTBpPWxlbmd0aFxuIiwgdjRsMl9idWZmZXIubGVuZ3RoKTsKKwlKT00oMTYsICIgICUxMGk9c2VxdWVuY2VcbiIsIHY0bDJfYnVmZmVyLnNlcXVlbmNlKTsKKwlKT00oMTYsICIgIDB4JTA4WD1tZW1vcnlcbiIsIHY0bDJfYnVmZmVyLm1lbW9yeSk7CisJSk9NKDE2LCAiICAlMTBpPW0ub2Zmc2V0XG4iLCB2NGwyX2J1ZmZlci5tLm9mZnNldCk7CisJSk9NKDE2LCAiICAlMTBpPWxlbmd0aFxuIiwgdjRsMl9idWZmZXIubGVuZ3RoKTsKIAogCWlmICgwICE9IGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsICZ2NGwyX2J1ZmZlciwgXAogCQkJCQkJc2l6ZW9mKHN0cnVjdCB2NGwyX2J1ZmZlcikpKSB7Ci0JCVBPVVQ7CisJCW11dGV4X3VubG9jaygmZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X3ZpZGVvKTsKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJfQogCi0JSk9UKDgsICIuLi4uLiB1c2VyIGlzIG9mZmVyZWQgZnJhbWUgYnVmZmVyICVpXG4iLCBcCisJaW5wdXQgPSBwZWFzeWNhcC0+ZnJhbWVfYnVmZmVyW3BlYXN5Y2FwLT5mcmFtZV9yZWFkXVswXS5pbnB1dDsKKwlpZiAoMHgwOCAmIGlucHV0KSB7CisJCUpPTSg4LCAidXNlciBpcyBvZmZlcmVkIGZyYW1lIGJ1ZmZlciAlaSwgaW5wdXQgJWlcbiIsIFwKKwkJCQkJcGVhc3ljYXAtPmZyYW1lX3JlYWQsICgweDA3ICYgaW5wdXQpKTsKKwl9IGVsc2UgeworCQlKT00oOCwgInVzZXIgaXMgb2ZmZXJlZCBmcmFtZSBidWZmZXIgJWlcbiIsIFwKIAkJCQkJCQlwZWFzeWNhcC0+ZnJhbWVfcmVhZCk7CisJfQogCXBlYXN5Y2FwLT5mcmFtZV9sb2NrID0gMTsKKwlKT00oOCwgIiVpPXBlYXN5Y2FwLT5mcmFtZV9maWxsXG4iLCBwZWFzeWNhcC0+ZnJhbWVfZmlsbCk7CiAJaWYgKHBlYXN5Y2FwLT5mcmFtZV9yZWFkID09IHBlYXN5Y2FwLT5mcmFtZV9maWxsKSB7CiAJCWlmIChwZWFzeWNhcC0+ZnJhbWVfbG9jaykgewotCQkJSk9UKDgsICJFUlJPUjogIGZpbGxpbmcgZnJhbWUgYnVmZmVyICIgXAorCQkJSk9NKDgsICJXT1JSWTogIGZpbGxpbmcgZnJhbWUgYnVmZmVyICIgXAogCQkJCQkJIndoaWxlIG9mZmVyZWQgdG8gdXNlclxuIik7CiAJCX0KIAl9CiAJYnJlYWs7CiB9CiAvKiAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKgotICogIEFVRElPIFVSQlMgSEFWRSBBTFJFQURZIEJFRU4gU1VCTUlUVEVEIFdIRU4gVEhJUyBDT01NQU5EIElTIFJFQ0VJVkVEOwotICogIFZJREVPIFVSQlMgSEFWRSBOT1QuCi0gKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIGNhc2UgVklESU9DX1NUUkVBTU9OOiB7Ci0Jc3RhdGljIGludCBpOworCWludCBpOwogCi0JSk9UKDgsICJWSURJT0NfU1RSRUFNT05cbiIpOworCUpPTSg4LCAiVklESU9DX1NUUkVBTU9OXG4iKTsKIAotCWlzZXF1ZW5jZSA9IDA7CisJcGVhc3ljYXAtPmlzZXF1ZW5jZSA9IDA7CiAJZm9yIChpID0gMDsgaSA8IDE4MDsgaSsrKQogCQlwZWFzeWNhcC0+bWVyaXRbaV0gPSAwOwogCWlmICgoc3RydWN0IHVzYl9kZXZpY2UgKilOVUxMID09IHBlYXN5Y2FwLT5wdXNiX2RldmljZSkgewotCQlTQVkoIkVSUk9SOiBwZWFzeWNhcC0+cHVzYl9kZXZpY2UgaXMgTlVMTFxuIik7CisJCVNBTSgiRVJST1I6IHBlYXN5Y2FwLT5wdXNiX2RldmljZSBpcyBOVUxMXG4iKTsKKwkJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfdmlkZW8pOwogCQlyZXR1cm4gLUVGQVVMVDsKIAl9CiAJc3VibWl0X3ZpZGVvX3VyYnMocGVhc3ljYXApOwpAQCAtMTg1MSwxMCArMjM4MiwxMSBAQAogfQogLyogLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLwogY2FzZSBWSURJT0NfU1RSRUFNT0ZGOiB7Ci0JSk9UKDgsICJWSURJT0NfU1RSRUFNT0ZGXG4iKTsKKwlKT00oOCwgIlZJRElPQ19TVFJFQU1PRkZcbiIpOwogCiAJaWYgKChzdHJ1Y3QgdXNiX2RldmljZSAqKU5VTEwgPT0gcGVhc3ljYXAtPnB1c2JfZGV2aWNlKSB7Ci0JCVNBWSgiRVJST1I6IHBlYXN5Y2FwLT5wdXNiX2RldmljZSBpcyBOVUxMXG4iKTsKKwkJU0FNKCJFUlJPUjogcGVhc3ljYXAtPnB1c2JfZGV2aWNlIGlzIE5VTExcbiIpOworCQltdXRleF91bmxvY2soJmVhc3ljYXBfZG9uZ2xlW2tkXS5tdXRleF92aWRlbyk7CiAJCXJldHVybiAtRUZBVUxUOwogCX0KIApAQCAtMTg2Niw3ICsyMzk4LDcgQEAKICAqICBUSEUgVVNFUlNQQUNFIFBST0dSQU0sIEUuRy4gbXBsYXllciwgTUFZIEhBTkcgT04gRVhJVC4gICBCRVdBUkUuCiAgKi8KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQlKT1QoOCwgImNhbGxpbmcgd2FrZV91cCBvbiB3cV92aWRlbyBhbmQgd3FfYXVkaW9cbiIpOworCUpPTSg4LCAiY2FsbGluZyB3YWtlX3VwIG9uIHdxX3ZpZGVvIGFuZCB3cV9hdWRpb1xuIik7CiAJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCYocGVhc3ljYXAtPndxX3ZpZGVvKSk7CiAJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCYocGVhc3ljYXAtPndxX2F1ZGlvKSk7CiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCkBAIC0xODc0LDExMSArMjQwNiwyMDAgQEAKIH0KIC8qIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KIGNhc2UgVklESU9DX0dfUEFSTTogewotCXN0YXRpYyBzdHJ1Y3QgdjRsMl9zdHJlYW1wYXJtIHY0bDJfc3RyZWFtcGFybTsKKwlzdHJ1Y3QgdjRsMl9zdHJlYW1wYXJtICpwdjRsMl9zdHJlYW1wYXJtOwogCi0JSk9UKDgsICJWSURJT0NfR19QQVJNXG4iKTsKLQotCWlmICgwICE9IGNvcHlfZnJvbV91c2VyKCZ2NGwyX3N0cmVhbXBhcm0sICh2b2lkIF9fdXNlciAqKWFyZywgXAorCUpPTSg4LCAiVklESU9DX0dfUEFSTVxuIik7CisJcHY0bDJfc3RyZWFtcGFybSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB2NGwyX3N0cmVhbXBhcm0pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXB2NGwyX3N0cmVhbXBhcm0pIHsKKwkJU0FNKCJFUlJPUjogb3V0IG9mIG1lbW9yeVxuIik7CisJCW11dGV4X3VubG9jaygmZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X3ZpZGVvKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCWlmICgwICE9IGNvcHlfZnJvbV91c2VyKHB2NGwyX3N0cmVhbXBhcm0sICh2b2lkIF9fdXNlciAqKWFyZywgXAogCQkJCQlzaXplb2Yoc3RydWN0IHY0bDJfc3RyZWFtcGFybSkpKSB7Ci0JCVBPVVQ7CisJCWtmcmVlKHB2NGwyX3N0cmVhbXBhcm0pOworCQltdXRleF91bmxvY2soJmVhc3ljYXBfZG9uZ2xlW2tkXS5tdXRleF92aWRlbyk7CiAJCXJldHVybiAtRUZBVUxUOwogCX0KIAotCWlmICh2NGwyX3N0cmVhbXBhcm0udHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpIHsKLQkJUE9VVDsKKwlpZiAocHY0bDJfc3RyZWFtcGFybS0+dHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpIHsKKwkJa2ZyZWUocHY0bDJfc3RyZWFtcGFybSk7CisJCW11dGV4X3VubG9jaygmZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X3ZpZGVvKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQotCXY0bDJfc3RyZWFtcGFybS5wYXJtLmNhcHR1cmUuY2FwYWJpbGl0eSA9IDA7Ci0JdjRsMl9zdHJlYW1wYXJtLnBhcm0uY2FwdHVyZS5jYXB0dXJlbW9kZSA9IDA7Ci0JdjRsMl9zdHJlYW1wYXJtLnBhcm0uY2FwdHVyZS50aW1lcGVyZnJhbWUubnVtZXJhdG9yID0gMTsKLQl2NGwyX3N0cmVhbXBhcm0ucGFybS5jYXB0dXJlLnRpbWVwZXJmcmFtZS5kZW5vbWluYXRvciA9IDMwOwotCXY0bDJfc3RyZWFtcGFybS5wYXJtLmNhcHR1cmUucmVhZGJ1ZmZlcnMgPSBwZWFzeWNhcC0+ZnJhbWVfYnVmZmVyX21hbnk7Ci0JdjRsMl9zdHJlYW1wYXJtLnBhcm0uY2FwdHVyZS5leHRlbmRlZG1vZGUgPSAwOwotCWlmICgwICE9IGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsICZ2NGwyX3N0cmVhbXBhcm0sIFwKKwlwdjRsMl9zdHJlYW1wYXJtLT5wYXJtLmNhcHR1cmUuY2FwYWJpbGl0eSA9IDA7CisJcHY0bDJfc3RyZWFtcGFybS0+cGFybS5jYXB0dXJlLmNhcHR1cmVtb2RlID0gMDsKKwlwdjRsMl9zdHJlYW1wYXJtLT5wYXJtLmNhcHR1cmUudGltZXBlcmZyYW1lLm51bWVyYXRvciA9IDE7CisKKwlpZiAocGVhc3ljYXAtPmZwcykgeworCQlwdjRsMl9zdHJlYW1wYXJtLT5wYXJtLmNhcHR1cmUudGltZXBlcmZyYW1lLlwKKwkJCQkJCWRlbm9taW5hdG9yID0gcGVhc3ljYXAtPmZwczsKKwl9IGVsc2UgeworCQlpZiAodHJ1ZSA9PSBwZWFzeWNhcC0+bnRzYykgeworCQkJcHY0bDJfc3RyZWFtcGFybS0+cGFybS5jYXB0dXJlLnRpbWVwZXJmcmFtZS5cCisJCQkJCQlkZW5vbWluYXRvciA9IDMwOworCQl9IGVsc2UgeworCQkJcHY0bDJfc3RyZWFtcGFybS0+cGFybS5jYXB0dXJlLnRpbWVwZXJmcmFtZS5cCisJCQkJCQlkZW5vbWluYXRvciA9IDI1OworCQl9CisJfQorCisJcHY0bDJfc3RyZWFtcGFybS0+cGFybS5jYXB0dXJlLnJlYWRidWZmZXJzID0gXAorCQkJCQkJcGVhc3ljYXAtPmZyYW1lX2J1ZmZlcl9tYW55OworCXB2NGwyX3N0cmVhbXBhcm0tPnBhcm0uY2FwdHVyZS5leHRlbmRlZG1vZGUgPSAwOworCWlmICgwICE9IGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsIHB2NGwyX3N0cmVhbXBhcm0sIFwKIAkJCQkJc2l6ZW9mKHN0cnVjdCB2NGwyX3N0cmVhbXBhcm0pKSkgewotCQlQT1VUOworCQlrZnJlZShwdjRsMl9zdHJlYW1wYXJtKTsKKwkJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfdmlkZW8pOwogCQlyZXR1cm4gLUVGQVVMVDsKIAl9CisJa2ZyZWUocHY0bDJfc3RyZWFtcGFybSk7CiAJYnJlYWs7CiB9CiAvKiAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCiBjYXNlIFZJRElPQ19TX1BBUk06IHsKLQlKT1QoOCwgIlZJRElPQ19TX1BBUk0gdW5zdXBwb3J0ZWRcbiIpOworCUpPTSg4LCAiVklESU9DX1NfUEFSTSB1bnN1cHBvcnRlZFxuIik7CisJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfdmlkZW8pOwogCXJldHVybiAtRUlOVkFMOwogfQogLyogLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLwogY2FzZSBWSURJT0NfR19BVURJTzogewotCUpPVCg4LCAiVklESU9DX0dfQVVESU8gdW5zdXBwb3J0ZWRcbiIpOworCUpPTSg4LCAiVklESU9DX0dfQVVESU8gdW5zdXBwb3J0ZWRcbiIpOworCW11dGV4X3VubG9jaygmZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X3ZpZGVvKTsKIAlyZXR1cm4gLUVJTlZBTDsKIH0KIC8qIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KIGNhc2UgVklESU9DX1NfQVVESU86IHsKLQlKT1QoOCwgIlZJRElPQ19TX0FVRElPIHVuc3VwcG9ydGVkXG4iKTsKKwlKT00oOCwgIlZJRElPQ19TX0FVRElPIHVuc3VwcG9ydGVkXG4iKTsKKwltdXRleF91bmxvY2soJmVhc3ljYXBfZG9uZ2xlW2tkXS5tdXRleF92aWRlbyk7CiAJcmV0dXJuIC1FSU5WQUw7CiB9CiAvKiAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCiBjYXNlIFZJRElPQ19TX1RVTkVSOiB7Ci0JSk9UKDgsICJWSURJT0NfU19UVU5FUiB1bnN1cHBvcnRlZFxuIik7CisJSk9NKDgsICJWSURJT0NfU19UVU5FUiB1bnN1cHBvcnRlZFxuIik7CisJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfdmlkZW8pOwogCXJldHVybiAtRUlOVkFMOwogfQogLyogLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLwogY2FzZSBWSURJT0NfR19GQlVGOgogY2FzZSBWSURJT0NfU19GQlVGOgogY2FzZSBWSURJT0NfT1ZFUkxBWTogewotCUpPVCg4LCAiVklESU9DX0dfRkJVRnxWSURJT0NfU19GQlVGfFZJRElPQ19PVkVSTEFZIHVuc3VwcG9ydGVkXG4iKTsKKwlKT00oOCwgIlZJRElPQ19HX0ZCVUZ8VklESU9DX1NfRkJVRnxWSURJT0NfT1ZFUkxBWSB1bnN1cHBvcnRlZFxuIik7CisJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfdmlkZW8pOwogCXJldHVybiAtRUlOVkFMOwogfQogLyogLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLwogY2FzZSBWSURJT0NfR19UVU5FUjogewotCUpPVCg4LCAiVklESU9DX0dfVFVORVIgdW5zdXBwb3J0ZWRcbiIpOworCUpPTSg4LCAiVklESU9DX0dfVFVORVIgdW5zdXBwb3J0ZWRcbiIpOworCW11dGV4X3VubG9jaygmZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X3ZpZGVvKTsKIAlyZXR1cm4gLUVJTlZBTDsKIH0KIGNhc2UgVklESU9DX0dfRlJFUVVFTkNZOgogY2FzZSBWSURJT0NfU19GUkVRVUVOQ1k6IHsKLQlKT1QoOCwgIlZJRElPQ19HX0ZSRVFVRU5DWXxWSURJT0NfU19GUkVRVUVOQ1kgdW5zdXBwb3J0ZWRcbiIpOworCUpPTSg4LCAiVklESU9DX0dfRlJFUVVFTkNZfFZJRElPQ19TX0ZSRVFVRU5DWSB1bnN1cHBvcnRlZFxuIik7CisJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfdmlkZW8pOwogCXJldHVybiAtRUlOVkFMOwogfQogLyogLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLwogZGVmYXVsdDogewotCUpPVCg4LCAiRVJST1I6IHVucmVjb2duaXplZCBWNEwyIElPQ1RMIGNvbW1hbmQ6IDB4JTA4WFxuIiwgY21kKTsKLQlleHBsYWluX2lvY3RsKGNtZCk7Ci0JUE9VVDsKKwlKT00oOCwgIkVSUk9SOiB1bnJlY29nbml6ZWQgVjRMMiBJT0NUTCBjb21tYW5kOiAweCUwOFhcbiIsIGNtZCk7CisJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfdmlkZW8pOwogCXJldHVybiAtRU5PSU9DVExDTUQ7CiB9CiB9CittdXRleF91bmxvY2soJmVhc3ljYXBfZG9uZ2xlW2tkXS5tdXRleF92aWRlbyk7CitKT00oNCwgInVubG9ja2VkIGVhc3ljYXBfZG9uZ2xlWyVpXS5tdXRleF92aWRlb1xuIiwga2QpOwogcmV0dXJuIDA7CiB9Ci0KLWxvbmcgZWFzeWNhcF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCi17Ci0Jc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlOwotCWxvbmcgcmV0OwotCi0JbG9ja19rZXJuZWwoKTsKLQlyZXQgPSBlYXN5Y2FwX2lvY3RsX2JrbChpbm9kZSwgZmlsZSwgY21kLCBhcmcpOwotCXVubG9ja19rZXJuZWwoKTsKLQotCXJldHVybiByZXQ7CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnYqLworI2lmICgoZGVmaW5lZChFQVNZQ0FQX0lTX1ZJREVPREVWX0NMSUVOVCkpIHx8IFwKKwkoZGVmaW5lZChFQVNZQ0FQX05FRURTX1VOTE9DS0VEX0lPQ1RMKSkpCitsb25nCitlYXN5c25kX2lvY3RsX25vaW5vZGUoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKSB7CisJcmV0dXJuIChsb25nKWVhc3lzbmRfaW9jdGwoKHN0cnVjdCBpbm9kZSAqKU5VTEwsIGZpbGUsIGNtZCwgYXJnKTsKIH0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1zdGF0aWMgaW50IGVhc3lzbmRfaW9jdGxfYmtsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAotCQkJICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKKyNlbmRpZiAvKkVBU1lDQVBfSVNfVklERU9ERVZfQ0xJRU5UfHxFQVNZQ0FQX05FRURTX1VOTE9DS0VEX0lPQ1RMKi8KKy8qXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXiovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitpbnQKK2Vhc3lzbmRfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCQkJCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQogewogc3RydWN0IGVhc3ljYXAgKnBlYXN5Y2FwOwogc3RydWN0IHVzYl9kZXZpY2UgKnA7CitpbnQga2Q7CiAKK2lmIChOVUxMID09IGZpbGUpIHsKKwlTQVkoIkVSUk9SOiAgZmlsZSBpcyBOVUxMXG4iKTsKKwlyZXR1cm4gLUVSRVNUQVJUU1lTOworfQogcGVhc3ljYXAgPSBmaWxlLT5wcml2YXRlX2RhdGE7CiBpZiAoTlVMTCA9PSBwZWFzeWNhcCkgewogCVNBWSgiRVJST1I6ICBwZWFzeWNhcCBpcyBOVUxMLlxuIik7Ci0JcmV0dXJuIC0xOworCXJldHVybiAtRUZBVUxUOworfQoraWYgKG1lbWNtcCgmcGVhc3ljYXAtPnRlbGx0YWxlWzBdLCBURUxMVEFMRSwgc3RybGVuKFRFTExUQUxFKSkpIHsKKwlTQVkoIkVSUk9SOiBiYWQgcGVhc3ljYXBcbiIpOworCXJldHVybiAtRUZBVUxUOwogfQogcCA9IHBlYXN5Y2FwLT5wdXNiX2RldmljZTsKK2lmIChOVUxMID09IHApIHsKKwlTQU0oIkVSUk9SOiBwZWFzeWNhcC0+cHVzYl9kZXZpY2UgaXMgTlVMTFxuIik7CisJcmV0dXJuIC1FRkFVTFQ7Cit9CitrZCA9IGlzZG9uZ2xlKHBlYXN5Y2FwKTsKK2lmICgwIDw9IGtkICYmIERPTkdMRV9NQU5ZID4ga2QpIHsKKwlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfYXVkaW8pKSB7CisJCVNBWSgiRVJST1I6IGNhbm5vdCBsb2NrIGVhc3ljYXBfZG9uZ2xlWyVpXS5tdXRleF9hdWRpb1xuIiwga2QpOworCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCX0KKwlKT00oNCwgImxvY2tlZCBlYXN5Y2FwX2RvbmdsZVslaV0ubXV0ZXhfYXVkaW9cbiIsIGtkKTsKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiAgTUVBTldISUxFLCBlYXN5Y2FwX3VzYl9kaXNjb25uZWN0KCkgTUFZIEhBVkUgRlJFRUQgUE9JTlRFUiBwZWFzeWNhcCwKKyAqICBJTiBXSElDSCBDQVNFIEEgUkVQRUFUIENBTEwgVE8gaXNkb25nbGUoKSBXSUxMIEZBSUwuCisgKiAgSUYgTkVDRVNTQVJZLCBCQUlMIE9VVC4KKyovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJaWYgKGtkICE9IGlzZG9uZ2xlKHBlYXN5Y2FwKSkKKwkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKwlpZiAoTlVMTCA9PSBmaWxlKSB7CisJCVNBWSgiRVJST1I6ICBmaWxlIGlzIE5VTExcbiIpOworCQltdXRleF91bmxvY2soJmVhc3ljYXBfZG9uZ2xlW2tkXS5tdXRleF9hdWRpbyk7CisJCXJldHVybiAtRVJFU1RBUlRTWVM7CisJfQorCXBlYXN5Y2FwID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCWlmIChOVUxMID09IHBlYXN5Y2FwKSB7CisJCVNBWSgiRVJST1I6ICBwZWFzeWNhcCBpcyBOVUxMXG4iKTsKKwkJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfYXVkaW8pOworCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCX0KKwlpZiAobWVtY21wKCZwZWFzeWNhcC0+dGVsbHRhbGVbMF0sIFRFTExUQUxFLCBzdHJsZW4oVEVMTFRBTEUpKSkgeworCQlTQVkoIkVSUk9SOiBiYWQgcGVhc3ljYXBcbiIpOworCQltdXRleF91bmxvY2soJmVhc3ljYXBfZG9uZ2xlW2tkXS5tdXRleF9hdWRpbyk7CisJCXJldHVybiAtRUZBVUxUOworCX0KKwlwID0gcGVhc3ljYXAtPnB1c2JfZGV2aWNlOworCWlmIChOVUxMID09IHBlYXN5Y2FwLT5wdXNiX2RldmljZSkgeworCQlTQU0oIkVSUk9SOiBwZWFzeWNhcC0+cHVzYl9kZXZpY2UgaXMgTlVMTFxuIik7CisJCW11dGV4X3VubG9jaygmZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X2F1ZGlvKTsKKwkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKwl9Cit9IGVsc2UgeworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqICBJRiBlYXN5Y2FwX3VzYl9kaXNjb25uZWN0KCkgSEFTIEFMUkVBRFkgRlJFRUQgUE9JTlRFUiBwZWFzeWNhcCBCRUZPUkUgVEhFCisgKiAgQVRURU1QVCBUTyBBQ1FVSVJFIFRIRSBTRU1BUEhPUkUsIGlzZG9uZ2xlKCkgV0lMTCBIQVZFIEZBSUxFRC4gIEJBSUwgT1VULgorKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwlyZXR1cm4gLUVSRVNUQVJUU1lTOworfQogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogc3dpdGNoIChjbWQpIHsKIGNhc2UgU05EQ1RMX0RTUF9HRVRDQVBTOiB7CiAJaW50IGNhcHM7Ci0JSk9UKDgsICJTTkRDVExfRFNQX0dFVENBUFNcbiIpOworCUpPTSg4LCAiU05EQ1RMX0RTUF9HRVRDQVBTXG4iKTsKIAogI2lmIGRlZmluZWQoVVBTQU1QTEUpCiAJaWYgKHRydWUgPT0gcGVhc3ljYXAtPm1pY3JvcGhvbmUpCkBAIC0xOTkyLDEzICsyNjEzLDE1IEBACiAJCWNhcHMgPSAweDA0NDAwMDAwOwogI2VuZGlmIC8qVVBTQU1QTEUqLwogCi0JaWYgKDAgIT0gY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKWFyZywgJmNhcHMsIHNpemVvZihpbnQpKSkKKwlpZiAoMCAhPSBjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLCAmY2Fwcywgc2l6ZW9mKGludCkpKSB7CisJCW11dGV4X3VubG9jaygmZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X2F1ZGlvKTsKIAkJcmV0dXJuIC1FRkFVTFQ7CisJfQogCWJyZWFrOwogfQogY2FzZSBTTkRDVExfRFNQX0dFVEZNVFM6IHsKIAlpbnQgaW5jb21pbmc7Ci0JSk9UKDgsICJTTkRDVExfRFNQX0dFVEZNVFNcbiIpOworCUpPTSg4LCAiU05EQ1RMX0RTUF9HRVRGTVRTXG4iKTsKIAogI2lmIGRlZmluZWQoVVBTQU1QTEUpCiAJaWYgKHRydWUgPT0gcGVhc3ljYXAtPm1pY3JvcGhvbmUpCkBAIC0yMDEyLDE2ICsyNjM1LDIwIEBACiAJCWluY29taW5nID0gQUZNVF9TMTZfTEU7CiAjZW5kaWYgLypVUFNBTVBMRSovCiAKLQlpZiAoMCAhPSBjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLCAmaW5jb21pbmcsIHNpemVvZihpbnQpKSkKKwlpZiAoMCAhPSBjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLCAmaW5jb21pbmcsIHNpemVvZihpbnQpKSkgeworCQltdXRleF91bmxvY2soJmVhc3ljYXBfZG9uZ2xlW2tkXS5tdXRleF9hdWRpbyk7CiAJCXJldHVybiAtRUZBVUxUOworCX0KIAlicmVhazsKIH0KIGNhc2UgU05EQ1RMX0RTUF9TRVRGTVQ6IHsKIAlpbnQgaW5jb21pbmcsIG91dGdvaW5nOwotCUpPVCg4LCAiU05EQ1RMX0RTUF9TRVRGTVRcbiIpOwotCWlmICgwICE9IGNvcHlfZnJvbV91c2VyKCZpbmNvbWluZywgKHZvaWQgX191c2VyICopYXJnLCBzaXplb2YoaW50KSkpCisJSk9NKDgsICJTTkRDVExfRFNQX1NFVEZNVFxuIik7CisJaWYgKDAgIT0gY29weV9mcm9tX3VzZXIoJmluY29taW5nLCAodm9pZCBfX3VzZXIgKilhcmcsIHNpemVvZihpbnQpKSkgeworCQltdXRleF91bmxvY2soJmVhc3ljYXBfZG9uZ2xlW2tkXS5tdXRleF9hdWRpbyk7CiAJCXJldHVybiAtRUZBVUxUOwotCUpPVCg4LCAiLi4uLi4uLi4uLi4gJWk9aW5jb21pbmdcbiIsIGluY29taW5nKTsKKwl9CisJSk9NKDgsICIuLi4uLi4uLi4uLiAlaT1pbmNvbWluZ1xuIiwgaW5jb21pbmcpOwogCiAjaWYgZGVmaW5lZChVUFNBTVBMRSkKIAlpZiAodHJ1ZSA9PSBwZWFzeWNhcC0+bWljcm9waG9uZSkKQEAgLTIwMzYsMjIgKzI2NjMsMjcgQEAKICNlbmRpZiAvKlVQU0FNUExFKi8KIAogCWlmIChpbmNvbWluZyAhPSBvdXRnb2luZykgewotCQlKT1QoOCwgIi4uLi4uLi4uLi4uICVpPW91dGdvaW5nXG4iLCBvdXRnb2luZyk7Ci0JCUpPVCg4LCAiICAgICAgICBjZi4gJWk9QUZNVF9TMTZfTEVcbiIsIEFGTVRfUzE2X0xFKTsKLQkJSk9UKDgsICIgICAgICAgIGNmLiAlaT1BRk1UX1U4XG4iLCBBRk1UX1U4KTsKKwkJSk9NKDgsICIuLi4uLi4uLi4uLiAlaT1vdXRnb2luZ1xuIiwgb3V0Z29pbmcpOworCQlKT00oOCwgIiAgICAgICAgY2YuICVpPUFGTVRfUzE2X0xFXG4iLCBBRk1UX1MxNl9MRSk7CisJCUpPTSg4LCAiICAgICAgICBjZi4gJWk9QUZNVF9VOFxuIiwgQUZNVF9VOCk7CiAJCWlmICgwICE9IGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsICZvdXRnb2luZywgXAotCQkJCQkJCQlzaXplb2YoaW50KSkpCisJCQkJCQkJCXNpemVvZihpbnQpKSkgeworCQkJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfYXVkaW8pOwogCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwkJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfYXVkaW8pOwogCQlyZXR1cm4gLUVJTlZBTCA7CiAJfQogCWJyZWFrOwogfQogY2FzZSBTTkRDVExfRFNQX1NURVJFTzogewogCWludCBpbmNvbWluZzsKLQlKT1QoOCwgIlNORENUTF9EU1BfU1RFUkVPXG4iKTsKLQlpZiAoMCAhPSBjb3B5X2Zyb21fdXNlcigmaW5jb21pbmcsICh2b2lkIF9fdXNlciAqKWFyZywgc2l6ZW9mKGludCkpKQorCUpPTSg4LCAiU05EQ1RMX0RTUF9TVEVSRU9cbiIpOworCWlmICgwICE9IGNvcHlfZnJvbV91c2VyKCZpbmNvbWluZywgKHZvaWQgX191c2VyICopYXJnLCBzaXplb2YoaW50KSkpIHsKKwkJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfYXVkaW8pOwogCQlyZXR1cm4gLUVGQVVMVDsKLQlKT1QoOCwgIi4uLi4uLi4uLi4uICVpPWluY29taW5nXG4iLCBpbmNvbWluZyk7CisJfQorCUpPTSg4LCAiLi4uLi4uLi4uLi4gJWk9aW5jb21pbmdcbiIsIGluY29taW5nKTsKIAogI2lmIGRlZmluZWQoVVBTQU1QTEUpCiAJaWYgKHRydWUgPT0gcGVhc3ljYXAtPm1pY3JvcGhvbmUpCkBAIC0yMDY1LDE2ICsyNjk3LDIwIEBACiAJCWluY29taW5nID0gMTsKICNlbmRpZiAvKlVQU0FNUExFKi8KIAotCWlmICgwICE9IGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsICZpbmNvbWluZywgc2l6ZW9mKGludCkpKQorCWlmICgwICE9IGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsICZpbmNvbWluZywgc2l6ZW9mKGludCkpKSB7CisJCW11dGV4X3VubG9jaygmZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X2F1ZGlvKTsKIAkJcmV0dXJuIC1FRkFVTFQ7CisJfQogCWJyZWFrOwogfQogY2FzZSBTTkRDVExfRFNQX1NQRUVEOiB7CiAJaW50IGluY29taW5nOwotCUpPVCg4LCAiU05EQ1RMX0RTUF9TUEVFRFxuIik7Ci0JaWYgKDAgIT0gY29weV9mcm9tX3VzZXIoJmluY29taW5nLCAodm9pZCBfX3VzZXIgKilhcmcsIHNpemVvZihpbnQpKSkKKwlKT00oOCwgIlNORENUTF9EU1BfU1BFRURcbiIpOworCWlmICgwICE9IGNvcHlfZnJvbV91c2VyKCZpbmNvbWluZywgKHZvaWQgX191c2VyICopYXJnLCBzaXplb2YoaW50KSkpIHsKKwkJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfYXVkaW8pOwogCQlyZXR1cm4gLUVGQVVMVDsKLQlKT1QoOCwgIi4uLi4uLi4uLi4uICVpPWluY29taW5nXG4iLCBpbmNvbWluZyk7CisJfQorCUpPTSg4LCAiLi4uLi4uLi4uLi4gJWk9aW5jb21pbmdcbiIsIGluY29taW5nKTsKIAogI2lmIGRlZmluZWQoVVBTQU1QTEUpCiAJaWYgKHRydWUgPT0gcGVhc3ljYXAtPm1pY3JvcGhvbmUpCkBAIC0yMDg4LDI5ICsyNzI0LDM3IEBACiAJCWluY29taW5nID0gNDgwMDA7CiAjZW5kaWYgLypVUFNBTVBMRSovCiAKLQlpZiAoMCAhPSBjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLCAmaW5jb21pbmcsIHNpemVvZihpbnQpKSkKKwlpZiAoMCAhPSBjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLCAmaW5jb21pbmcsIHNpemVvZihpbnQpKSkgeworCQltdXRleF91bmxvY2soJmVhc3ljYXBfZG9uZ2xlW2tkXS5tdXRleF9hdWRpbyk7CiAJCXJldHVybiAtRUZBVUxUOworCX0KIAlicmVhazsKIH0KIGNhc2UgU05EQ1RMX0RTUF9HRVRUUklHR0VSOiB7CiAJaW50IGluY29taW5nOwotCUpPVCg4LCAiU05EQ1RMX0RTUF9HRVRUUklHR0VSXG4iKTsKLQlpZiAoMCAhPSBjb3B5X2Zyb21fdXNlcigmaW5jb21pbmcsICh2b2lkIF9fdXNlciAqKWFyZywgc2l6ZW9mKGludCkpKQorCUpPTSg4LCAiU05EQ1RMX0RTUF9HRVRUUklHR0VSXG4iKTsKKwlpZiAoMCAhPSBjb3B5X2Zyb21fdXNlcigmaW5jb21pbmcsICh2b2lkIF9fdXNlciAqKWFyZywgc2l6ZW9mKGludCkpKSB7CisJCW11dGV4X3VubG9jaygmZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X2F1ZGlvKTsKIAkJcmV0dXJuIC1FRkFVTFQ7Ci0JSk9UKDgsICIuLi4uLi4uLi4uLiAlaT1pbmNvbWluZ1xuIiwgaW5jb21pbmcpOworCX0KKwlKT00oOCwgIi4uLi4uLi4uLi4uICVpPWluY29taW5nXG4iLCBpbmNvbWluZyk7CiAKIAlpbmNvbWluZyA9IFBDTV9FTkFCTEVfSU5QVVQ7Ci0JaWYgKDAgIT0gY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKWFyZywgJmluY29taW5nLCBzaXplb2YoaW50KSkpCisJaWYgKDAgIT0gY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKWFyZywgJmluY29taW5nLCBzaXplb2YoaW50KSkpIHsKKwkJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfYXVkaW8pOwogCQlyZXR1cm4gLUVGQVVMVDsKKwl9CiAJYnJlYWs7CiB9CiBjYXNlIFNORENUTF9EU1BfU0VUVFJJR0dFUjogewogCWludCBpbmNvbWluZzsKLQlKT1QoOCwgIlNORENUTF9EU1BfU0VUVFJJR0dFUlxuIik7Ci0JaWYgKDAgIT0gY29weV9mcm9tX3VzZXIoJmluY29taW5nLCAodm9pZCBfX3VzZXIgKilhcmcsIHNpemVvZihpbnQpKSkKKwlKT00oOCwgIlNORENUTF9EU1BfU0VUVFJJR0dFUlxuIik7CisJaWYgKDAgIT0gY29weV9mcm9tX3VzZXIoJmluY29taW5nLCAodm9pZCBfX3VzZXIgKilhcmcsIHNpemVvZihpbnQpKSkgeworCQltdXRleF91bmxvY2soJmVhc3ljYXBfZG9uZ2xlW2tkXS5tdXRleF9hdWRpbyk7CiAJCXJldHVybiAtRUZBVUxUOwotCUpPVCg4LCAiLi4uLi4uLi4uLi4gJWk9aW5jb21pbmdcbiIsIGluY29taW5nKTsKLQlKT1QoOCwgIi4uLi4uLi4uLi4uIGNmIDB4JXg9UENNX0VOQUJMRV9JTlBVVCAiIFwKKwl9CisJSk9NKDgsICIuLi4uLi4uLi4uLiAlaT1pbmNvbWluZ1xuIiwgaW5jb21pbmcpOworCUpPTSg4LCAiLi4uLi4uLi4uLi4gY2YgMHgleD1QQ01fRU5BQkxFX0lOUFVUICIgXAogCQkJCSIweCV4PVBDTV9FTkFCTEVfT1VUUFVUXG4iLCBcCiAJCQkJCVBDTV9FTkFCTEVfSU5QVVQsIFBDTV9FTkFCTEVfT1VUUFVUKTsKIAk7CkBAIC0yMTIxLDE5ICsyNzY1LDIzIEBACiB9CiBjYXNlIFNORENUTF9EU1BfR0VUQkxLU0laRTogewogCWludCBpbmNvbWluZzsKLQlKT1QoOCwgIlNORENUTF9EU1BfR0VUQkxLU0laRVxuIik7Ci0JaWYgKDAgIT0gY29weV9mcm9tX3VzZXIoJmluY29taW5nLCAodm9pZCBfX3VzZXIgKilhcmcsIHNpemVvZihpbnQpKSkKKwlKT00oOCwgIlNORENUTF9EU1BfR0VUQkxLU0laRVxuIik7CisJaWYgKDAgIT0gY29weV9mcm9tX3VzZXIoJmluY29taW5nLCAodm9pZCBfX3VzZXIgKilhcmcsIHNpemVvZihpbnQpKSkgeworCQltdXRleF91bmxvY2soJmVhc3ljYXBfZG9uZ2xlW2tkXS5tdXRleF9hdWRpbyk7CiAJCXJldHVybiAtRUZBVUxUOwotCUpPVCg4LCAiLi4uLi4uLi4uLi4gJWk9aW5jb21pbmdcbiIsIGluY29taW5nKTsKKwl9CisJSk9NKDgsICIuLi4uLi4uLi4uLiAlaT1pbmNvbWluZ1xuIiwgaW5jb21pbmcpOwogCWluY29taW5nID0gcGVhc3ljYXAtPmF1ZGlvX2J5dGVzX3Blcl9mcmFnbWVudDsKLQlpZiAoMCAhPSBjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLCAmaW5jb21pbmcsIHNpemVvZihpbnQpKSkKKwlpZiAoMCAhPSBjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLCAmaW5jb21pbmcsIHNpemVvZihpbnQpKSkgeworCQltdXRleF91bmxvY2soJmVhc3ljYXBfZG9uZ2xlW2tkXS5tdXRleF9hdWRpbyk7CiAJCXJldHVybiAtRUZBVUxUOworCX0KIAlicmVhazsKIH0KIGNhc2UgU05EQ1RMX0RTUF9HRVRJU1BBQ0U6IHsKIAlzdHJ1Y3QgYXVkaW9fYnVmX2luZm8gYXVkaW9fYnVmX2luZm87CiAKLQlKT1QoOCwgIlNORENUTF9EU1BfR0VUSVNQQUNFXG4iKTsKKwlKT00oOCwgIlNORENUTF9EU1BfR0VUSVNQQUNFXG4iKTsKIAogCWF1ZGlvX2J1Zl9pbmZvLmJ5dGVzICAgICAgPSBwZWFzeWNhcC0+YXVkaW9fYnl0ZXNfcGVyX2ZyYWdtZW50OwogCWF1ZGlvX2J1Zl9pbmZvLmZyYWdtZW50cyAgPSAxOwpAQCAtMjE0MSw1NTUgKzI3ODksMzEgQEAKIAlhdWRpb19idWZfaW5mby5mcmFnc3RvdGFsID0gMDsKIAogCWlmICgwICE9IGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsICZhdWRpb19idWZfaW5mbywgXAotCQkJCQkJCQlzaXplb2YoaW50KSkpCisJCQkJCQkJCXNpemVvZihpbnQpKSkgeworCQltdXRleF91bmxvY2soJmVhc3ljYXBfZG9uZ2xlW2tkXS5tdXRleF9hdWRpbyk7CiAJCXJldHVybiAtRUZBVUxUOworCX0KIAlicmVhazsKIH0KK2Nhc2UgMHgwMDAwNTQwMToKK2Nhc2UgMHgwMDAwNTQwMjoKK2Nhc2UgMHgwMDAwNTQwMzoKK2Nhc2UgMHgwMDAwNTQwNDoKK2Nhc2UgMHgwMDAwNTQwNToKK2Nhc2UgMHgwMDAwNTQwNjogeworCUpPTSg4LCAiU05EQ1RMX1RNUl8uLi46IDB4JTA4WCB1bnN1cHBvcnRlZFxuIiwgY21kKTsKKwltdXRleF91bmxvY2soJmVhc3ljYXBfZG9uZ2xlW2tkXS5tdXRleF9hdWRpbyk7CisJcmV0dXJuIC1FTk9JT0NUTENNRDsKK30KIGRlZmF1bHQ6IHsKLQlKT1QoOCwgIkVSUk9SOiB1bnJlY29nbml6ZWQgRFNQIElPQ1RMIGNvbW1hbmQ6IDB4JTA4WFxuIiwgY21kKTsKLQlQT1VUOworCUpPTSg4LCAiRVJST1I6IHVucmVjb2duaXplZCBEU1AgSU9DVEwgY29tbWFuZDogMHglMDhYXG4iLCBjbWQpOworCW11dGV4X3VubG9jaygmZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X2F1ZGlvKTsKIAlyZXR1cm4gLUVOT0lPQ1RMQ01EOwogfQogfQorbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfYXVkaW8pOwogcmV0dXJuIDA7CiB9Ci0KLWxvbmcgZWFzeXNuZF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCi17Ci0Jc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlOwotCWxvbmcgcmV0OwotCi0JbG9ja19rZXJuZWwoKTsKLQlyZXQgPSBlYXN5c25kX2lvY3RsX2JrbChpbm9kZSwgZmlsZSwgY21kLCBhcmcpOwotCXVubG9ja19rZXJuZWwoKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBleHBsYWluX2lvY3RsKF9fdTMyIHdvdCkKLXsKLWludCBrOwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyoKLSAqICBUSEUgREFUQSBGT1IgVEhFIEFSUkFZIG1lc3MgQkVMT1cgV0VSRSBDT05TVFJVQ1RFRCBCWSBSVU5OSU5HIFRIRSBGT0xMT1dJTkcKLSAqICBTSEVMTCBTQ1JJUFQ6Ci0gKiAgIwotICogIGNhdCAvdXNyL3NyYy9saW51eC1oZWFkZXJzLWB1bmFtZSAtcmAvaW5jbHVkZS9saW51eC92aWRlb2RldjIuaCB8IFwKLSAqICAgICBncmVwICJeI2RlZmluZSBWSURJT0NfIiAtIHwgZ3JlcCAtdiAiX09MRCIgLSB8IFwKLSAqICAgICBzZWQgLWUgInMsX0lPLiokLCw7cCIgfCBzZWQgLWUgIk47cyxcbiwsICIgfCBcCi0gKiAgICAgc2VkIC1lICJzL14jZGVmaW5lIC8gIHsvO3MvI2RlZmluZSAvLCBcIi87cy8kL1wifSwvIiB8IFwKLSAqICAgICBzZWQgLWUgInMsCSwsZztzLCAsLGciID5pb2N0bC50bXAKLSAqICBlY2hvICJ7MHhGRkZGRkZGRixcIlwifSIgPj5pb2N0bC50bXAKLSAqICBleGl0IDAKLSAqICAjCi0gKiBBTkQgUkVJTlNUQVRJTkcgVEhFIEVYQ0lTRUQgIl9PTEQiIENBU0VTIFdFUkUgTEFURVIgTUFOVUFMTFkuCi0gKgotICogVEhFIERBVEEgRk9SIFRIRSBBUlJBWSBtZXNzMSBCRUxPVyBXRVJFIENPTlNUUlVDVEVEIEJZIFJVTk5JTkcgVEhFIEZPTExPV0lORwotICogU0hFTEwgU0NSSVBUOgotICogIGNhdCAvdXNyL3NyYy9saW51eC1oZWFkZXJzLWB1bmFtZSAtcmAvaW5jbHVkZS9saW51eC92aWRlb2Rldi5oIHwgXAotICogICAgIGdyZXAgIl4jZGVmaW5lIFZJRElPQyIgLSB8IGdyZXAgLXYgIl9PTEQiIC0gfCBcCi0gKiAgICAgc2VkIC1lICJzLF9JTy4qJCwsO3AiIHwgc2VkIC1lICJOO3MsXG4sLCAiIHwgXAotICogICAgIHNlZCAtZSAicy9eI2RlZmluZSAvICB7LztzLyNkZWZpbmUgLywgXCIvO3MvJC9cIn0sLyIgfCBcCi0gKiAgICAgc2VkIC1lICJzLCAgICwsZztzLCAsLGciID5pb2N0bC50bXAKLSAqICBlY2hvICJ7MHhGRkZGRkZGRixcIlwifSIgPj5pb2N0bC50bXAKLSAqICBleGl0IDAKLSAqICAjCi0gKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXN0YXRpYyBzdHJ1Y3QgbWVzcyB7Ci0JX191MzIgY29tbWFuZDsKLQljaGFyICBuYW1lWzY0XTsKLX0gbWVzc1tdID0gewotI2lmIGRlZmluZWQoVklESU9DX1FVRVJZQ0FQKQote1ZJRElPQ19RVUVSWUNBUCwgIlZJRElPQ19RVUVSWUNBUCJ9LAotI2VuZGlmCi0jaWYgZGVmaW5lZChWSURJT0NfUkVTRVJWRUQpCi17VklESU9DX1JFU0VSVkVELCAiVklESU9DX1JFU0VSVkVEIn0sCi0jZW5kaWYKLSNpZiBkZWZpbmVkKFZJRElPQ19FTlVNX0ZNVCkKLXtWSURJT0NfRU5VTV9GTVQsICJWSURJT0NfRU5VTV9GTVQifSwKLSNlbmRpZgotI2lmIGRlZmluZWQoVklESU9DX0dfRk1UKQote1ZJRElPQ19HX0ZNVCwgIlZJRElPQ19HX0ZNVCJ9LAotI2VuZGlmCi0jaWYgZGVmaW5lZChWSURJT0NfU19GTVQpCi17VklESU9DX1NfRk1ULCAiVklESU9DX1NfRk1UIn0sCi0jZW5kaWYKLSNpZiBkZWZpbmVkKFZJRElPQ19SRVFCVUZTKQote1ZJRElPQ19SRVFCVUZTLCAiVklESU9DX1JFUUJVRlMifSwKLSNlbmRpZgotI2lmIGRlZmluZWQoVklESU9DX1FVRVJZQlVGKQote1ZJRElPQ19RVUVSWUJVRiwgIlZJRElPQ19RVUVSWUJVRiJ9LAotI2VuZGlmCi0jaWYgZGVmaW5lZChWSURJT0NfR19GQlVGKQote1ZJRElPQ19HX0ZCVUYsICJWSURJT0NfR19GQlVGIn0sCi0jZW5kaWYKLSNpZiBkZWZpbmVkKFZJRElPQ19TX0ZCVUYpCi17VklESU9DX1NfRkJVRiwgIlZJRElPQ19TX0ZCVUYifSwKLSNlbmRpZgotI2lmIGRlZmluZWQoVklESU9DX09WRVJMQVkpCi17VklESU9DX09WRVJMQVksICJWSURJT0NfT1ZFUkxBWSJ9LAotI2VuZGlmCi0jaWYgZGVmaW5lZChWSURJT0NfUUJVRikKLXtWSURJT0NfUUJVRiwgIlZJRElPQ19RQlVGIn0sCi0jZW5kaWYKLSNpZiBkZWZpbmVkKFZJRElPQ19EUUJVRikKLXtWSURJT0NfRFFCVUYsICJWSURJT0NfRFFCVUYifSwKLSNlbmRpZgotI2lmIGRlZmluZWQoVklESU9DX1NUUkVBTU9OKQote1ZJRElPQ19TVFJFQU1PTiwgIlZJRElPQ19TVFJFQU1PTiJ9LAotI2VuZGlmCi0jaWYgZGVmaW5lZChWSURJT0NfU1RSRUFNT0ZGKQote1ZJRElPQ19TVFJFQU1PRkYsICJWSURJT0NfU1RSRUFNT0ZGIn0sCi0jZW5kaWYKLSNpZiBkZWZpbmVkKFZJRElPQ19HX1BBUk0pCi17VklESU9DX0dfUEFSTSwgIlZJRElPQ19HX1BBUk0ifSwKLSNlbmRpZgotI2lmIGRlZmluZWQoVklESU9DX1NfUEFSTSkKLXtWSURJT0NfU19QQVJNLCAiVklESU9DX1NfUEFSTSJ9LAotI2VuZGlmCi0jaWYgZGVmaW5lZChWSURJT0NfR19TVEQpCi17VklESU9DX0dfU1RELCAiVklESU9DX0dfU1REIn0sCi0jZW5kaWYKLSNpZiBkZWZpbmVkKFZJRElPQ19TX1NURCkKLXtWSURJT0NfU19TVEQsICJWSURJT0NfU19TVEQifSwKLSNlbmRpZgotI2lmIGRlZmluZWQoVklESU9DX0VOVU1TVEQpCi17VklESU9DX0VOVU1TVEQsICJWSURJT0NfRU5VTVNURCJ9LAotI2VuZGlmCi0jaWYgZGVmaW5lZChWSURJT0NfRU5VTUlOUFVUKQote1ZJRElPQ19FTlVNSU5QVVQsICJWSURJT0NfRU5VTUlOUFVUIn0sCi0jZW5kaWYKLSNpZiBkZWZpbmVkKFZJRElPQ19HX0NUUkwpCi17VklESU9DX0dfQ1RSTCwgIlZJRElPQ19HX0NUUkwifSwKLSNlbmRpZgotI2lmIGRlZmluZWQoVklESU9DX1NfQ1RSTCkKLXtWSURJT0NfU19DVFJMLCAiVklESU9DX1NfQ1RSTCJ9LAotI2VuZGlmCi0jaWYgZGVmaW5lZChWSURJT0NfR19UVU5FUikKLXtWSURJT0NfR19UVU5FUiwgIlZJRElPQ19HX1RVTkVSIn0sCi0jZW5kaWYKLSNpZiBkZWZpbmVkKFZJRElPQ19TX1RVTkVSKQote1ZJRElPQ19TX1RVTkVSLCAiVklESU9DX1NfVFVORVIifSwKLSNlbmRpZgotI2lmIGRlZmluZWQoVklESU9DX0dfQVVESU8pCi17VklESU9DX0dfQVVESU8sICJWSURJT0NfR19BVURJTyJ9LAotI2VuZGlmCi0jaWYgZGVmaW5lZChWSURJT0NfU19BVURJTykKLXtWSURJT0NfU19BVURJTywgIlZJRElPQ19TX0FVRElPIn0sCi0jZW5kaWYKLSNpZiBkZWZpbmVkKFZJRElPQ19RVUVSWUNUUkwpCi17VklESU9DX1FVRVJZQ1RSTCwgIlZJRElPQ19RVUVSWUNUUkwifSwKLSNlbmRpZgotI2lmIGRlZmluZWQoVklESU9DX1FVRVJZTUVOVSkKLXtWSURJT0NfUVVFUllNRU5VLCAiVklESU9DX1FVRVJZTUVOVSJ9LAotI2VuZGlmCi0jaWYgZGVmaW5lZChWSURJT0NfR19JTlBVVCkKLXtWSURJT0NfR19JTlBVVCwgIlZJRElPQ19HX0lOUFVUIn0sCi0jZW5kaWYKLSNpZiBkZWZpbmVkKFZJRElPQ19TX0lOUFVUKQote1ZJRElPQ19TX0lOUFVULCAiVklESU9DX1NfSU5QVVQifSwKLSNlbmRpZgotI2lmIGRlZmluZWQoVklESU9DX0dfT1VUUFVUKQote1ZJRElPQ19HX09VVFBVVCwgIlZJRElPQ19HX09VVFBVVCJ9LAotI2VuZGlmCi0jaWYgZGVmaW5lZChWSURJT0NfU19PVVRQVVQpCi17VklESU9DX1NfT1VUUFVULCAiVklESU9DX1NfT1VUUFVUIn0sCi0jZW5kaWYKLSNpZiBkZWZpbmVkKFZJRElPQ19FTlVNT1VUUFVUKQote1ZJRElPQ19FTlVNT1VUUFVULCAiVklESU9DX0VOVU1PVVRQVVQifSwKLSNlbmRpZgotI2lmIGRlZmluZWQoVklESU9DX0dfQVVET1VUKQote1ZJRElPQ19HX0FVRE9VVCwgIlZJRElPQ19HX0FVRE9VVCJ9LAotI2VuZGlmCi0jaWYgZGVmaW5lZChWSURJT0NfU19BVURPVVQpCi17VklESU9DX1NfQVVET1VULCAiVklESU9DX1NfQVVET1VUIn0sCi0jZW5kaWYKLSNpZiBkZWZpbmVkKFZJRElPQ19HX01PRFVMQVRPUikKLXtWSURJT0NfR19NT0RVTEFUT1IsICJWSURJT0NfR19NT0RVTEFUT1IifSwKLSNlbmRpZgotI2lmIGRlZmluZWQoVklESU9DX1NfTU9EVUxBVE9SKQote1ZJRElPQ19TX01PRFVMQVRPUiwgIlZJRElPQ19TX01PRFVMQVRPUiJ9LAotI2VuZGlmCi0jaWYgZGVmaW5lZChWSURJT0NfR19GUkVRVUVOQ1kpCi17VklESU9DX0dfRlJFUVVFTkNZLCAiVklESU9DX0dfRlJFUVVFTkNZIn0sCi0jZW5kaWYKLSNpZiBkZWZpbmVkKFZJRElPQ19TX0ZSRVFVRU5DWSkKLXtWSURJT0NfU19GUkVRVUVOQ1ksICJWSURJT0NfU19GUkVRVUVOQ1kifSwKLSNlbmRpZgotI2lmIGRlZmluZWQoVklESU9DX0NST1BDQVApCi17VklESU9DX0NST1BDQVAsICJWSURJT0NfQ1JPUENBUCJ9LAotI2VuZGlmCi0jaWYgZGVmaW5lZChWSURJT0NfR19DUk9QKQote1ZJRElPQ19HX0NST1AsICJWSURJT0NfR19DUk9QIn0sCi0jZW5kaWYKLSNpZiBkZWZpbmVkKFZJRElPQ19TX0NST1ApCi17VklESU9DX1NfQ1JPUCwgIlZJRElPQ19TX0NST1AifSwKLSNlbmRpZgotI2lmIGRlZmluZWQoVklESU9DX0dfSlBFR0NPTVApCi17VklESU9DX0dfSlBFR0NPTVAsICJWSURJT0NfR19KUEVHQ09NUCJ9LAotI2VuZGlmCi0jaWYgZGVmaW5lZChWSURJT0NfU19KUEVHQ09NUCkKLXtWSURJT0NfU19KUEVHQ09NUCwgIlZJRElPQ19TX0pQRUdDT01QIn0sCi0jZW5kaWYKLSNpZiBkZWZpbmVkKFZJRElPQ19RVUVSWVNURCkKLXtWSURJT0NfUVVFUllTVEQsICJWSURJT0NfUVVFUllTVEQifSwKLSNlbmRpZgotI2lmIGRlZmluZWQoVklESU9DX1RSWV9GTVQpCi17VklESU9DX1RSWV9GTVQsICJWSURJT0NfVFJZX0ZNVCJ9LAotI2VuZGlmCi0jaWYgZGVmaW5lZChWSURJT0NfRU5VTUFVRElPKQote1ZJRElPQ19FTlVNQVVESU8sICJWSURJT0NfRU5VTUFVRElPIn0sCi0jZW5kaWYKLSNpZiBkZWZpbmVkKFZJRElPQ19FTlVNQVVET1VUKQote1ZJRElPQ19FTlVNQVVET1VULCAiVklESU9DX0VOVU1BVURPVVQifSwKLSNlbmRpZgotI2lmIGRlZmluZWQoVklESU9DX0dfUFJJT1JJVFkpCi17VklESU9DX0dfUFJJT1JJVFksICJWSURJT0NfR19QUklPUklUWSJ9LAotI2VuZGlmCi0jaWYgZGVmaW5lZChWSURJT0NfU19QUklPUklUWSkKLXtWSURJT0NfU19QUklPUklUWSwgIlZJRElPQ19TX1BSSU9SSVRZIn0sCi0jZW5kaWYKLSNpZiBkZWZpbmVkKFZJRElPQ19HX1NMSUNFRF9WQklfQ0FQKQote1ZJRElPQ19HX1NMSUNFRF9WQklfQ0FQLCAiVklESU9DX0dfU0xJQ0VEX1ZCSV9DQVAifSwKLSNlbmRpZgotI2lmIGRlZmluZWQoVklESU9DX0xPR19TVEFUVVMpCi17VklESU9DX0xPR19TVEFUVVMsICJWSURJT0NfTE9HX1NUQVRVUyJ9LAotI2VuZGlmCi0jaWYgZGVmaW5lZChWSURJT0NfR19FWFRfQ1RSTFMpCi17VklESU9DX0dfRVhUX0NUUkxTLCAiVklESU9DX0dfRVhUX0NUUkxTIn0sCi0jZW5kaWYKLSNpZiBkZWZpbmVkKFZJRElPQ19TX0VYVF9DVFJMUykKLXtWSURJT0NfU19FWFRfQ1RSTFMsICJWSURJT0NfU19FWFRfQ1RSTFMifSwKLSNlbmRpZgotI2lmIGRlZmluZWQoVklESU9DX1RSWV9FWFRfQ1RSTFMpCi17VklESU9DX1RSWV9FWFRfQ1RSTFMsICJWSURJT0NfVFJZX0VYVF9DVFJMUyJ9LAotI2VuZGlmCi0jaWYgZGVmaW5lZChWSURJT0NfRU5VTV9GUkFNRVNJWkVTKQote1ZJRElPQ19FTlVNX0ZSQU1FU0laRVMsICJWSURJT0NfRU5VTV9GUkFNRVNJWkVTIn0sCi0jZW5kaWYKLSNpZiBkZWZpbmVkKFZJRElPQ19FTlVNX0ZSQU1FSU5URVJWQUxTKQote1ZJRElPQ19FTlVNX0ZSQU1FSU5URVJWQUxTLCAiVklESU9DX0VOVU1fRlJBTUVJTlRFUlZBTFMifSwKLSNlbmRpZgotI2lmIGRlZmluZWQoVklESU9DX0dfRU5DX0lOREVYKQote1ZJRElPQ19HX0VOQ19JTkRFWCwgIlZJRElPQ19HX0VOQ19JTkRFWCJ9LAotI2VuZGlmCi0jaWYgZGVmaW5lZChWSURJT0NfRU5DT0RFUl9DTUQpCi17VklESU9DX0VOQ09ERVJfQ01ELCAiVklESU9DX0VOQ09ERVJfQ01EIn0sCi0jZW5kaWYKLSNpZiBkZWZpbmVkKFZJRElPQ19UUllfRU5DT0RFUl9DTUQpCi17VklESU9DX1RSWV9FTkNPREVSX0NNRCwgIlZJRElPQ19UUllfRU5DT0RFUl9DTUQifSwKLSNlbmRpZgotI2lmIGRlZmluZWQoVklESU9DX0dfQ0hJUF9JREVOVCkKLXtWSURJT0NfR19DSElQX0lERU5ULCAiVklESU9DX0dfQ0hJUF9JREVOVCJ9LAotI2VuZGlmCiAKLSNpZiBkZWZpbmVkKFZJRElPQ19PVkVSTEFZX09MRCkKLXtWSURJT0NfT1ZFUkxBWV9PTEQsICJWSURJT0NfT1ZFUkxBWV9PTEQifSwKLSNlbmRpZgotI2lmIGRlZmluZWQoVklESU9DX1NfUEFSTV9PTEQpCi17VklESU9DX1NfUEFSTV9PTEQsICJWSURJT0NfU19QQVJNX09MRCJ9LAotI2VuZGlmCi0jaWYgZGVmaW5lZChWSURJT0NfU19DVFJMX09MRCkKLXtWSURJT0NfU19DVFJMX09MRCwgIlZJRElPQ19TX0NUUkxfT0xEIn0sCi0jZW5kaWYKLSNpZiBkZWZpbmVkKFZJRElPQ19HX0FVRElPX09MRCkKLXtWSURJT0NfR19BVURJT19PTEQsICJWSURJT0NfR19BVURJT19PTEQifSwKLSNlbmRpZgotI2lmIGRlZmluZWQoVklESU9DX0dfQVVET1VUX09MRCkKLXtWSURJT0NfR19BVURPVVRfT0xELCAiVklESU9DX0dfQVVET1VUX09MRCJ9LAotI2VuZGlmCi0jaWYgZGVmaW5lZChWSURJT0NfQ1JPUENBUF9PTEQpCi17VklESU9DX0NST1BDQVBfT0xELCAiVklESU9DX0NST1BDQVBfT0xEIn0sCi0jZW5kaWYKLXsweEZGRkZGRkZGLCAiIn0KLX07CiAKLXN0YXRpYyBzdHJ1Y3QgbWVzcyBtZXNzMVtdID0gXAotewotI2lmIGRlZmluZWQoVklESU9DR0NBUCkKLXtWSURJT0NHQ0FQLCAiVklESU9DR0NBUCJ9LAotI2VuZGlmCi0jaWYgZGVmaW5lZChWSURJT0NHQ0hBTikKLXtWSURJT0NHQ0hBTiwgIlZJRElPQ0dDSEFOIn0sCi0jZW5kaWYKLSNpZiBkZWZpbmVkKFZJRElPQ1NDSEFOKQote1ZJRElPQ1NDSEFOLCAiVklESU9DU0NIQU4ifSwKLSNlbmRpZgotI2lmIGRlZmluZWQoVklESU9DR1RVTkVSKQote1ZJRElPQ0dUVU5FUiwgIlZJRElPQ0dUVU5FUiJ9LAotI2VuZGlmCi0jaWYgZGVmaW5lZChWSURJT0NTVFVORVIpCi17VklESU9DU1RVTkVSLCAiVklESU9DU1RVTkVSIn0sCi0jZW5kaWYKLSNpZiBkZWZpbmVkKFZJRElPQ0dQSUNUKQote1ZJRElPQ0dQSUNULCAiVklESU9DR1BJQ1QifSwKLSNlbmRpZgotI2lmIGRlZmluZWQoVklESU9DU1BJQ1QpCi17VklESU9DU1BJQ1QsICJWSURJT0NTUElDVCJ9LAotI2VuZGlmCi0jaWYgZGVmaW5lZChWSURJT0NDQVBUVVJFKQote1ZJRElPQ0NBUFRVUkUsICJWSURJT0NDQVBUVVJFIn0sCi0jZW5kaWYKLSNpZiBkZWZpbmVkKFZJRElPQ0dXSU4pCi17VklESU9DR1dJTiwgIlZJRElPQ0dXSU4ifSwKLSNlbmRpZgotI2lmIGRlZmluZWQoVklESU9DU1dJTikKLXtWSURJT0NTV0lOLCAiVklESU9DU1dJTiJ9LAotI2VuZGlmCi0jaWYgZGVmaW5lZChWSURJT0NHRkJVRikKLXtWSURJT0NHRkJVRiwgIlZJRElPQ0dGQlVGIn0sCi0jZW5kaWYKLSNpZiBkZWZpbmVkKFZJRElPQ1NGQlVGKQote1ZJRElPQ1NGQlVGLCAiVklESU9DU0ZCVUYifSwKLSNlbmRpZgotI2lmIGRlZmluZWQoVklESU9DS0VZKQote1ZJRElPQ0tFWSwgIlZJRElPQ0tFWSJ9LAotI2VuZGlmCi0jaWYgZGVmaW5lZChWSURJT0NHRlJFUSkKLXtWSURJT0NHRlJFUSwgIlZJRElPQ0dGUkVRIn0sCi0jZW5kaWYKLSNpZiBkZWZpbmVkKFZJRElPQ1NGUkVRKQote1ZJRElPQ1NGUkVRLCAiVklESU9DU0ZSRVEifSwKLSNlbmRpZgotI2lmIGRlZmluZWQoVklESU9DR0FVRElPKQote1ZJRElPQ0dBVURJTywgIlZJRElPQ0dBVURJTyJ9LAotI2VuZGlmCi0jaWYgZGVmaW5lZChWSURJT0NTQVVESU8pCi17VklESU9DU0FVRElPLCAiVklESU9DU0FVRElPIn0sCi0jZW5kaWYKLSNpZiBkZWZpbmVkKFZJRElPQ1NZTkMpCi17VklESU9DU1lOQywgIlZJRElPQ1NZTkMifSwKLSNlbmRpZgotI2lmIGRlZmluZWQoVklESU9DTUNBUFRVUkUpCi17VklESU9DTUNBUFRVUkUsICJWSURJT0NNQ0FQVFVSRSJ9LAotI2VuZGlmCi0jaWYgZGVmaW5lZChWSURJT0NHTUJVRikKLXtWSURJT0NHTUJVRiwgIlZJRElPQ0dNQlVGIn0sCi0jZW5kaWYKLSNpZiBkZWZpbmVkKFZJRElPQ0dVTklUKQote1ZJRElPQ0dVTklULCAiVklESU9DR1VOSVQifSwKLSNlbmRpZgotI2lmIGRlZmluZWQoVklESU9DR0NBUFRVUkUpCi17VklESU9DR0NBUFRVUkUsICJWSURJT0NHQ0FQVFVSRSJ9LAotI2VuZGlmCi0jaWYgZGVmaW5lZChWSURJT0NTQ0FQVFVSRSkKLXtWSURJT0NTQ0FQVFVSRSwgIlZJRElPQ1NDQVBUVVJFIn0sCi0jZW5kaWYKLSNpZiBkZWZpbmVkKFZJRElPQ1NQTEFZTU9ERSkKLXtWSURJT0NTUExBWU1PREUsICJWSURJT0NTUExBWU1PREUifSwKLSNlbmRpZgotI2lmIGRlZmluZWQoVklESU9DU1dSSVRFTU9ERSkKLXtWSURJT0NTV1JJVEVNT0RFLCAiVklESU9DU1dSSVRFTU9ERSJ9LAotI2VuZGlmCi0jaWYgZGVmaW5lZChWSURJT0NHUExBWUlORk8pCi17VklESU9DR1BMQVlJTkZPLCAiVklESU9DR1BMQVlJTkZPIn0sCi0jZW5kaWYKLSNpZiBkZWZpbmVkKFZJRElPQ1NNSUNST0NPREUpCi17VklESU9DU01JQ1JPQ09ERSwgIlZJRElPQ1NNSUNST0NPREUifSwKLSNlbmRpZgotezB4RkZGRkZGRkYsICIifQotfTsKLQotayA9IDA7Ci13aGlsZSAobWVzc1trXS5uYW1lWzBdKSB7Ci0JaWYgKHdvdCA9PSBtZXNzW2tdLmNvbW1hbmQpIHsKLQkJSk9UKDgsICJpb2N0bCAweCUwOFggaXMgJXNcbiIsIFwKLQkJCQkJbWVzc1trXS5jb21tYW5kLCAmbWVzc1trXS5uYW1lWzBdKTsKLQkJcmV0dXJuIDA7Ci0JfQotCWsrKzsKLX0KLUpPVCg4LCAiaW9jdGwgMHglMDhYIGlzIG5vdCBpbiB2aWRlb2RldjIuaFxuIiwgd290KTsKLQotayA9IDA7Ci13aGlsZSAobWVzczFba10ubmFtZVswXSkgewotCWlmICh3b3QgPT0gbWVzczFba10uY29tbWFuZCkgewotCQlKT1QoOCwgImlvY3RsIDB4JTA4WCBpcyAlcyAoVjRMMSlcbiIsIFwKLQkJCQkJbWVzczFba10uY29tbWFuZCwgJm1lc3MxW2tdLm5hbWVbMF0pOwotCQlyZXR1cm4gMDsKLQl9Ci0JaysrOwotfQotSk9UKDgsICJpb2N0bCAweCUwOFggaXMgbm90IGluIHZpZGVvZGV2LmhcbiIsIHdvdCk7Ci1yZXR1cm4gLTE7Ci19Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgZXhwbGFpbl9jaWQoX191MzIgd290KQotewotaW50IGs7Ci0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKgotICogIFRIRSBEQVRBIEZPUiBUSEUgQVJSQVkgbWVzcyBCRUxPVyBXRVJFIENPTlNUUlVDVEVEIEJZIFJVTk5JTkcgVEhFIEZPTExPV0lORwotICogIFNIRUxMIFNDUklQVDoKLSAqICAjCi0gKiAgY2F0IC91c3Ivc3JjL2xpbnV4LWhlYWRlcnMtYHVuYW1lIC1yYC9pbmNsdWRlL2xpbnV4L3ZpZGVvZGV2Mi5oIHwgXAotICogICAgIGdyZXAgIl4jZGVmaW5lIFY0TDJfQ0lEXyIgfCAgXAotICogICAgIHNlZCAtZSAicywoLiokLCw7cCIgfCBzZWQgLWUgIk47cyxcbiwsICIgfCBcCi0gKiAgICAgc2VkIC1lICJzL14jZGVmaW5lIC8gIHsvO3MvI2RlZmluZSAvLCBcIi87cy8kL1wifSwvIiB8IFwKLSAqICAgICBzZWQgLWUgInMsCSwsZztzLCAsLGciIHwgZ3JlcCAtdiAiX0JBU0UiIHwgZ3JlcCAtdiAiTVBFRyIgPmNpZC50bXAKLSAqICBlY2hvICJ7MHhGRkZGRkZGRixcIlwifSIgPj5jaWQudG1wCi0gKiAgZXhpdCAwCi0gKiAgIwotICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1zdGF0aWMgc3RydWN0IG1lc3MKLXsKLV9fdTMyIGNvbW1hbmQ7Ci1jaGFyICBuYW1lWzY0XTsKLX0gbWVzc1tdID0gewotI2lmIGRlZmluZWQoVjRMMl9DSURfVVNFUl9DTEFTUykKLXtWNEwyX0NJRF9VU0VSX0NMQVNTLCAiVjRMMl9DSURfVVNFUl9DTEFTUyJ9LAotI2VuZGlmCi0jaWYgZGVmaW5lZChWNEwyX0NJRF9CUklHSFRORVNTKQote1Y0TDJfQ0lEX0JSSUdIVE5FU1MsICJWNEwyX0NJRF9CUklHSFRORVNTIn0sCi0jZW5kaWYKLSNpZiBkZWZpbmVkKFY0TDJfQ0lEX0NPTlRSQVNUKQote1Y0TDJfQ0lEX0NPTlRSQVNULCAiVjRMMl9DSURfQ09OVFJBU1QifSwKLSNlbmRpZgotI2lmIGRlZmluZWQoVjRMMl9DSURfU0FUVVJBVElPTikKLXtWNEwyX0NJRF9TQVRVUkFUSU9OLCAiVjRMMl9DSURfU0FUVVJBVElPTiJ9LAotI2VuZGlmCi0jaWYgZGVmaW5lZChWNEwyX0NJRF9IVUUpCi17VjRMMl9DSURfSFVFLCAiVjRMMl9DSURfSFVFIn0sCi0jZW5kaWYKLSNpZiBkZWZpbmVkKFY0TDJfQ0lEX0FVRElPX1ZPTFVNRSkKLXtWNEwyX0NJRF9BVURJT19WT0xVTUUsICJWNEwyX0NJRF9BVURJT19WT0xVTUUifSwKLSNlbmRpZgotI2lmIGRlZmluZWQoVjRMMl9DSURfQVVESU9fQkFMQU5DRSkKLXtWNEwyX0NJRF9BVURJT19CQUxBTkNFLCAiVjRMMl9DSURfQVVESU9fQkFMQU5DRSJ9LAotI2VuZGlmCi0jaWYgZGVmaW5lZChWNEwyX0NJRF9BVURJT19CQVNTKQote1Y0TDJfQ0lEX0FVRElPX0JBU1MsICJWNEwyX0NJRF9BVURJT19CQVNTIn0sCi0jZW5kaWYKLSNpZiBkZWZpbmVkKFY0TDJfQ0lEX0FVRElPX1RSRUJMRSkKLXtWNEwyX0NJRF9BVURJT19UUkVCTEUsICJWNEwyX0NJRF9BVURJT19UUkVCTEUifSwKLSNlbmRpZgotI2lmIGRlZmluZWQoVjRMMl9DSURfQVVESU9fTVVURSkKLXtWNEwyX0NJRF9BVURJT19NVVRFLCAiVjRMMl9DSURfQVVESU9fTVVURSJ9LAotI2VuZGlmCi0jaWYgZGVmaW5lZChWNEwyX0NJRF9BVURJT19MT1VETkVTUykKLXtWNEwyX0NJRF9BVURJT19MT1VETkVTUywgIlY0TDJfQ0lEX0FVRElPX0xPVURORVNTIn0sCi0jZW5kaWYKLSNpZiBkZWZpbmVkKFY0TDJfQ0lEX0JMQUNLX0xFVkVMKQote1Y0TDJfQ0lEX0JMQUNLX0xFVkVMLCAiVjRMMl9DSURfQkxBQ0tfTEVWRUwifSwKLSNlbmRpZgotI2lmIGRlZmluZWQoVjRMMl9DSURfQVVUT19XSElURV9CQUxBTkNFKQote1Y0TDJfQ0lEX0FVVE9fV0hJVEVfQkFMQU5DRSwgIlY0TDJfQ0lEX0FVVE9fV0hJVEVfQkFMQU5DRSJ9LAotI2VuZGlmCi0jaWYgZGVmaW5lZChWNEwyX0NJRF9ET19XSElURV9CQUxBTkNFKQote1Y0TDJfQ0lEX0RPX1dISVRFX0JBTEFOQ0UsICJWNEwyX0NJRF9ET19XSElURV9CQUxBTkNFIn0sCi0jZW5kaWYKLSNpZiBkZWZpbmVkKFY0TDJfQ0lEX1JFRF9CQUxBTkNFKQote1Y0TDJfQ0lEX1JFRF9CQUxBTkNFLCAiVjRMMl9DSURfUkVEX0JBTEFOQ0UifSwKLSNlbmRpZgotI2lmIGRlZmluZWQoVjRMMl9DSURfQkxVRV9CQUxBTkNFKQote1Y0TDJfQ0lEX0JMVUVfQkFMQU5DRSwgIlY0TDJfQ0lEX0JMVUVfQkFMQU5DRSJ9LAotI2VuZGlmCi0jaWYgZGVmaW5lZChWNEwyX0NJRF9HQU1NQSkKLXtWNEwyX0NJRF9HQU1NQSwgIlY0TDJfQ0lEX0dBTU1BIn0sCi0jZW5kaWYKLSNpZiBkZWZpbmVkKFY0TDJfQ0lEX1dISVRFTkVTUykKLXtWNEwyX0NJRF9XSElURU5FU1MsICJWNEwyX0NJRF9XSElURU5FU1MifSwKLSNlbmRpZgotI2lmIGRlZmluZWQoVjRMMl9DSURfRVhQT1NVUkUpCi17VjRMMl9DSURfRVhQT1NVUkUsICJWNEwyX0NJRF9FWFBPU1VSRSJ9LAotI2VuZGlmCi0jaWYgZGVmaW5lZChWNEwyX0NJRF9BVVRPR0FJTikKLXtWNEwyX0NJRF9BVVRPR0FJTiwgIlY0TDJfQ0lEX0FVVE9HQUlOIn0sCi0jZW5kaWYKLSNpZiBkZWZpbmVkKFY0TDJfQ0lEX0dBSU4pCi17VjRMMl9DSURfR0FJTiwgIlY0TDJfQ0lEX0dBSU4ifSwKLSNlbmRpZgotI2lmIGRlZmluZWQoVjRMMl9DSURfSEZMSVApCi17VjRMMl9DSURfSEZMSVAsICJWNEwyX0NJRF9IRkxJUCJ9LAotI2VuZGlmCi0jaWYgZGVmaW5lZChWNEwyX0NJRF9WRkxJUCkKLXtWNEwyX0NJRF9WRkxJUCwgIlY0TDJfQ0lEX1ZGTElQIn0sCi0jZW5kaWYKLSNpZiBkZWZpbmVkKFY0TDJfQ0lEX0hDRU5URVIpCi17VjRMMl9DSURfSENFTlRFUiwgIlY0TDJfQ0lEX0hDRU5URVIifSwKLSNlbmRpZgotI2lmIGRlZmluZWQoVjRMMl9DSURfVkNFTlRFUikKLXtWNEwyX0NJRF9WQ0VOVEVSLCAiVjRMMl9DSURfVkNFTlRFUiJ9LAotI2VuZGlmCi0jaWYgZGVmaW5lZChWNEwyX0NJRF9QT1dFUl9MSU5FX0ZSRVFVRU5DWSkKLXtWNEwyX0NJRF9QT1dFUl9MSU5FX0ZSRVFVRU5DWSwgIlY0TDJfQ0lEX1BPV0VSX0xJTkVfRlJFUVVFTkNZIn0sCi0jZW5kaWYKLSNpZiBkZWZpbmVkKFY0TDJfQ0lEX0hVRV9BVVRPKQote1Y0TDJfQ0lEX0hVRV9BVVRPLCAiVjRMMl9DSURfSFVFX0FVVE8ifSwKLSNlbmRpZgotI2lmIGRlZmluZWQoVjRMMl9DSURfV0hJVEVfQkFMQU5DRV9URU1QRVJBVFVSRSkKLXtWNEwyX0NJRF9XSElURV9CQUxBTkNFX1RFTVBFUkFUVVJFLCAiVjRMMl9DSURfV0hJVEVfQkFMQU5DRV9URU1QRVJBVFVSRSJ9LAotI2VuZGlmCi0jaWYgZGVmaW5lZChWNEwyX0NJRF9TSEFSUE5FU1MpCi17VjRMMl9DSURfU0hBUlBORVNTLCAiVjRMMl9DSURfU0hBUlBORVNTIn0sCi0jZW5kaWYKLSNpZiBkZWZpbmVkKFY0TDJfQ0lEX0JBQ0tMSUdIVF9DT01QRU5TQVRJT04pCi17VjRMMl9DSURfQkFDS0xJR0hUX0NPTVBFTlNBVElPTiwgIlY0TDJfQ0lEX0JBQ0tMSUdIVF9DT01QRU5TQVRJT04ifSwKLSNlbmRpZgotI2lmIGRlZmluZWQoVjRMMl9DSURfQ0hST01BX0FHQykKLXtWNEwyX0NJRF9DSFJPTUFfQUdDLCAiVjRMMl9DSURfQ0hST01BX0FHQyJ9LAotI2VuZGlmCi0jaWYgZGVmaW5lZChWNEwyX0NJRF9DT0xPUl9LSUxMRVIpCi17VjRMMl9DSURfQ09MT1JfS0lMTEVSLCAiVjRMMl9DSURfQ09MT1JfS0lMTEVSIn0sCi0jZW5kaWYKLSNpZiBkZWZpbmVkKFY0TDJfQ0lEX0xBU1RQMSkKLXtWNEwyX0NJRF9MQVNUUDEsICJWNEwyX0NJRF9MQVNUUDEifSwKLSNlbmRpZgotI2lmIGRlZmluZWQoVjRMMl9DSURfQ0FNRVJBX0NMQVNTKQote1Y0TDJfQ0lEX0NBTUVSQV9DTEFTUywgIlY0TDJfQ0lEX0NBTUVSQV9DTEFTUyJ9LAotI2VuZGlmCi0jaWYgZGVmaW5lZChWNEwyX0NJRF9FWFBPU1VSRV9BVVRPKQote1Y0TDJfQ0lEX0VYUE9TVVJFX0FVVE8sICJWNEwyX0NJRF9FWFBPU1VSRV9BVVRPIn0sCi0jZW5kaWYKLSNpZiBkZWZpbmVkKFY0TDJfQ0lEX0VYUE9TVVJFX0FCU09MVVRFKQote1Y0TDJfQ0lEX0VYUE9TVVJFX0FCU09MVVRFLCAiVjRMMl9DSURfRVhQT1NVUkVfQUJTT0xVVEUifSwKLSNlbmRpZgotI2lmIGRlZmluZWQoVjRMMl9DSURfRVhQT1NVUkVfQVVUT19QUklPUklUWSkKLXtWNEwyX0NJRF9FWFBPU1VSRV9BVVRPX1BSSU9SSVRZLCAiVjRMMl9DSURfRVhQT1NVUkVfQVVUT19QUklPUklUWSJ9LAotI2VuZGlmCi0jaWYgZGVmaW5lZChWNEwyX0NJRF9QQU5fUkVMQVRJVkUpCi17VjRMMl9DSURfUEFOX1JFTEFUSVZFLCAiVjRMMl9DSURfUEFOX1JFTEFUSVZFIn0sCi0jZW5kaWYKLSNpZiBkZWZpbmVkKFY0TDJfQ0lEX1RJTFRfUkVMQVRJVkUpCi17VjRMMl9DSURfVElMVF9SRUxBVElWRSwgIlY0TDJfQ0lEX1RJTFRfUkVMQVRJVkUifSwKLSNlbmRpZgotI2lmIGRlZmluZWQoVjRMMl9DSURfUEFOX1JFU0VUKQote1Y0TDJfQ0lEX1BBTl9SRVNFVCwgIlY0TDJfQ0lEX1BBTl9SRVNFVCJ9LAotI2VuZGlmCi0jaWYgZGVmaW5lZChWNEwyX0NJRF9USUxUX1JFU0VUKQote1Y0TDJfQ0lEX1RJTFRfUkVTRVQsICJWNEwyX0NJRF9USUxUX1JFU0VUIn0sCi0jZW5kaWYKLSNpZiBkZWZpbmVkKFY0TDJfQ0lEX1BBTl9BQlNPTFVURSkKLXtWNEwyX0NJRF9QQU5fQUJTT0xVVEUsICJWNEwyX0NJRF9QQU5fQUJTT0xVVEUifSwKLSNlbmRpZgotI2lmIGRlZmluZWQoVjRMMl9DSURfVElMVF9BQlNPTFVURSkKLXtWNEwyX0NJRF9USUxUX0FCU09MVVRFLCAiVjRMMl9DSURfVElMVF9BQlNPTFVURSJ9LAotI2VuZGlmCi0jaWYgZGVmaW5lZChWNEwyX0NJRF9GT0NVU19BQlNPTFVURSkKLXtWNEwyX0NJRF9GT0NVU19BQlNPTFVURSwgIlY0TDJfQ0lEX0ZPQ1VTX0FCU09MVVRFIn0sCi0jZW5kaWYKLSNpZiBkZWZpbmVkKFY0TDJfQ0lEX0ZPQ1VTX1JFTEFUSVZFKQote1Y0TDJfQ0lEX0ZPQ1VTX1JFTEFUSVZFLCAiVjRMMl9DSURfRk9DVVNfUkVMQVRJVkUifSwKLSNlbmRpZgotI2lmIGRlZmluZWQoVjRMMl9DSURfRk9DVVNfQVVUTykKLXtWNEwyX0NJRF9GT0NVU19BVVRPLCAiVjRMMl9DSURfRk9DVVNfQVVUTyJ9LAotI2VuZGlmCi17MHhGRkZGRkZGRiwgIiJ9Ci19OwotCi1rID0gMDsKLXdoaWxlIChtZXNzW2tdLm5hbWVbMF0pIHsKLQlpZiAod290ID09IG1lc3Nba10uY29tbWFuZCkgewotCQlKT1QoOCwgImlvY3RsIDB4JTA4WCBpcyAlc1xuIiwgXAotCQkJCQltZXNzW2tdLmNvbW1hbmQsICZtZXNzW2tdLm5hbWVbMF0pOwotCQlyZXR1cm4gMDsKLQl9Ci0JaysrOwotfQotSk9UKDgsICJjaWQgMHglMDhYIGlzIG5vdCBpbiB2aWRlb2RldjIuaFxuIiwgd290KTsKLXJldHVybiAtMTsKLX0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lYXN5Y2FwL2Vhc3ljYXBfbG93LmMgYi9kcml2ZXJzL3N0YWdpbmcvZWFzeWNhcC9lYXN5Y2FwX2xvdy5jCmluZGV4IGFkMWZjNGMuLjI4YzRkMWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9lYXN5Y2FwL2Vhc3ljYXBfbG93LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2Vhc3ljYXAvZWFzeWNhcF9sb3cuYwpAQCAtMzgsMTQ4ICszOCwyMDkgQEAKICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotI2luY2x1ZGUgImVhc3ljYXBfZGVidWcuaCIKICNpbmNsdWRlICJlYXN5Y2FwLmgiCisjaW5jbHVkZSAiZWFzeWNhcF9kZWJ1Zy5oIgogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWNvbnN0IHN0cnVjdCBzdGsxMTYwY29uZmlnIHsgaW50IHJlZzsgaW50IHNldDsgfSBzdGsxMTYwY29uZmlnWzI1Nl0gPSB7Ci0JezB4MDAwLCAweDAwOTh9LAotCXsweDAwMiwgMHgwMDkzfSwKK2NvbnN0IHN0cnVjdCBzdGsxMTYwY29uZmlnIHsgaW50IHJlZzsgaW50IHNldDsgfSBzdGsxMTYwY29uZmlnUEFMWzI1Nl0gPSB7CisJCXsweDAwMCwgMHgwMDk4fSwKKwkJezB4MDAyLCAweDAwOTN9LAogCi0JezB4MDAxLCAweDAwMDN9LAotCXsweDAwMywgMHgwMDgwfSwKLQl7MHgwMEQsIDB4MDAwMH0sCi0JezB4MDBGLCAweDAwMDJ9LAotCXsweDAxOCwgMHgwMDEwfSwKLQl7MHgwMTksIDB4MDAwMH0sCi0JezB4MDFBLCAweDAwMTR9LAotCXsweDAxQiwgMHgwMDBFfSwKLQl7MHgwMUMsIDB4MDA0Nn0sCisJCXsweDAwMSwgMHgwMDAzfSwKKwkJezB4MDAzLCAweDAwODB9LAorCQl7MHgwMEQsIDB4MDAwMH0sCisJCXsweDAwRiwgMHgwMDAyfSwKKwkJezB4MDE4LCAweDAwMTB9LAorCQl7MHgwMTksIDB4MDAwMH0sCisJCXsweDAxQSwgMHgwMDE0fSwKKwkJezB4MDFCLCAweDAwMEV9LAorCQl7MHgwMUMsIDB4MDA0Nn0sCiAKLQl7MHgxMDAsIDB4MDAzM30sCi0JezB4MTAzLCAweDAwMDB9LAotCXsweDEwNCwgMHgwMDAwfSwKLQl7MHgxMDUsIDB4MDAwMH0sCi0JezB4MTA2LCAweDAwMDB9LAorCQl7MHgxMDAsIDB4MDAzM30sCisJCXsweDEwMywgMHgwMDAwfSwKKwkJezB4MTA0LCAweDAwMDB9LAorCQl7MHgxMDUsIDB4MDAwMH0sCisJCXsweDEwNiwgMHgwMDAwfSwKIAotI2lmIGRlZmluZWQoUFJFRkVSX05UU0MpCisvKiAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCisvKgorICogIFJFU09MVVRJT04gNjQweDQ4MAorKi8KKy8qIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KKwkJezB4MTEwLCAweDAwMDh9LAorCQl7MHgxMTEsIDB4MDAwMH0sCisJCXsweDExMiwgMHgwMDIwfSwKKwkJezB4MTEzLCAweDAwMDB9LAorCQl7MHgxMTQsIDB4MDUwOH0sCisJCXsweDExNSwgMHgwMDA1fSwKKwkJezB4MTE2LCAweDAxMTB9LAorCQl7MHgxMTcsIDB4MDAwMX0sCisvKiAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCiAKLSN1bmRlZiAgT0xETUFSR0lOCi0jaWYgZGVmaW5lZChPTERNQVJHSU4pCi0JezB4MTEwLCAweDAwMDh9LAotI2Vsc2UKLQl7MHgxMTAsIDB4MDAxNH0sCi0jZW5kaWYgLypPTERNQVJHSU4qLworCQl7MHgyMDIsIDB4MDAwRn0sCisJCXsweDIwMywgMHgwMDRBfSwKKwkJezB4MkZGLCAweDAwMDB9LAogCi0JezB4MTExLCAweDAwMDB9LAotCXsweDExMiwgMHgwMDAzfSwKLQl7MHgxMTMsIDB4MDAwMH0sCi0KLSNpZiBkZWZpbmVkKE9MRE1BUkdJTikKLQl7MHgxMTQsIDB4MDUwOH0sCi0jZWxzZQotCXsweDExNCwgMHgwNTE0fSwKLSNlbmRpZiAvKk9MRE1BUkdJTiovCi0KLQl7MHgxMTUsIDB4MDAwNX0sCi0JezB4MTE2LCAweDAwRjN9LAotCXsweDExNywgMHgwMDAwfSwKLQotI2Vsc2UgLyogISBQUkVGRVJfTlRTQyovCi0KLSNpZiBkZWZpbmVkKE9MRE1BUkdJTikKLQl7MHgxMTAsIDB4MDAwOH0sCi0jZWxzZQotCXsweDExMCwgMHgwMDE0fSwKLSNlbmRpZiAvKk9MRE1BUkdJTiovCi0KLQl7MHgxMTEsIDB4MDAwMH0sCi0JezB4MTEyLCAweDAwMjB9LAotCXsweDExMywgMHgwMDAwfSwKLQotI2lmIGRlZmluZWQoT0xETUFSR0lOKQotCXsweDExNCwgMHgwNTA4fSwKLSNlbHNlCi0JezB4MTE0LCAweDA1MTR9LAotI2VuZGlmIC8qT0xETUFSR0lOKi8KLQotCXsweDExNSwgMHgwMDA1fSwKLQl7MHgxMTYsIDB4MDExMH0sCi0JezB4MTE3LCAweDAwMDF9LAotCi0jZW5kaWYgLyogISBQUkVGRVJfTlRTQyovCi0KLQl7MHgyMDIsIDB4MDAwRn0sCi0JezB4MjAzLCAweDAwNEF9LAotCXsweDJGRiwgMHgwMDAwfSwKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQl7MHhGRkYsIDB4RkZGRn0KLQl9OworCQl7MHhGRkYsIDB4RkZGRn0KK307CiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWNvbnN0IHN0cnVjdCBzYWE3MTEzY29uZmlnIHsgaW50IHJlZzsgaW50IHNldDsgfSBzYWE3MTEzY29uZmlnWzI1Nl0gPSB7Ci0JezB4MDEsIDB4MDh9LAotCXsweDAyLCAweDgwfSwKLQl7MHgwMywgMHgzM30sCi0JezB4MDQsIDB4MDB9LAotCXsweDA1LCAweDAwfSwKLQl7MHgwNiwgMHhFOX0sCi0JezB4MDcsIDB4MER9LAotI2lmIGRlZmluZWQoUFJFRkVSX05UU0MpCi0JezB4MDgsIDB4Nzh9LAorY29uc3Qgc3RydWN0IHN0azExNjBjb25maWcgc3RrMTE2MGNvbmZpZ05UU0NbMjU2XSA9IHsKKwkJezB4MDAwLCAweDAwOTh9LAorCQl7MHgwMDIsIDB4MDA5M30sCisKKwkJezB4MDAxLCAweDAwMDN9LAorCQl7MHgwMDMsIDB4MDA4MH0sCisJCXsweDAwRCwgMHgwMDAwfSwKKwkJezB4MDBGLCAweDAwMDJ9LAorCQl7MHgwMTgsIDB4MDAxMH0sCisJCXsweDAxOSwgMHgwMDAwfSwKKwkJezB4MDFBLCAweDAwMTR9LAorCQl7MHgwMUIsIDB4MDAwRX0sCisJCXsweDAxQywgMHgwMDQ2fSwKKworCQl7MHgxMDAsIDB4MDAzM30sCisJCXsweDEwMywgMHgwMDAwfSwKKwkJezB4MTA0LCAweDAwMDB9LAorCQl7MHgxMDUsIDB4MDAwMH0sCisJCXsweDEwNiwgMHgwMDAwfSwKKworLyogLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLworLyoKKyAqICBSRVNPTFVUSU9OIDY0MHg0ODAKKyovCisvKiAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCisJCXsweDExMCwgMHgwMDA4fSwKKwkJezB4MTExLCAweDAwMDB9LAorCQl7MHgxMTIsIDB4MDAwM30sCisJCXsweDExMywgMHgwMDAwfSwKKwkJezB4MTE0LCAweDA1MDh9LAorCQl7MHgxMTUsIDB4MDAwNX0sCisJCXsweDExNiwgMHgwMEYzfSwKKwkJezB4MTE3LCAweDAwMDB9LAorLyogLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLworCisJCXsweDIwMiwgMHgwMDBGfSwKKwkJezB4MjAzLCAweDAwNEF9LAorCQl7MHgyRkYsIDB4MDAwMH0sCisKKwkJezB4RkZGLCAweEZGRkZ9Cit9OworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitjb25zdCBzdHJ1Y3Qgc2FhNzExM2NvbmZpZyB7IGludCByZWc7IGludCBzZXQ7IH0gc2FhNzExM2NvbmZpZ1BBTFsyNTZdID0geworCQl7MHgwMSwgMHgwOH0sCisjaWYgZGVmaW5lZChBTlRJQUxJQVMpCisJCXsweDAyLCAweEMwfSwKICNlbHNlCi0JezB4MDgsIDB4Mzh9LAotI2VuZGlmIC8qICEgUFJFRkVSX05UU0MqLwotCXsweDA5LCAweDAwfSwKLQl7MHgwQSwgU0FBXzBBX0RFRkFVTFR9LAotCXsweDBCLCBTQUFfMEJfREVGQVVMVH0sCi0JezB4MEMsIFNBQV8wQ19ERUZBVUxUfSwKLQl7MHgwRCwgU0FBXzBEX0RFRkFVTFR9LAotCXsweDBFLCAweDAxfSwKLQl7MHgwRiwgMHgzNn0sCi0JezB4MTAsIDB4MDB9LAotCXsweDExLCAweDBDfSwKLQl7MHgxMiwgMHhFN30sCi0JezB4MTMsIDB4MDB9LAotCXsweDE1LCAweDAwfSwKLQl7MHgxNiwgMHgwMH0sCi0jaWYgZGVmaW5lZChQUkVGRVJfTlRTQykKLQl7MHg0MCwgMHg4Mn0sCisJCXsweDAyLCAweDgwfSwKKyNlbmRpZiAvKkFOVElBTElBUyovCisJCXsweDAzLCAweDMzfSwKKwkJezB4MDQsIDB4MDB9LAorCQl7MHgwNSwgMHgwMH0sCisJCXsweDA2LCAweEU5fSwKKwkJezB4MDcsIDB4MER9LAorCQl7MHgwOCwgMHgzOH0sCisJCXsweDA5LCAweDAwfSwKKwkJezB4MEEsIFNBQV8wQV9ERUZBVUxUfSwKKwkJezB4MEIsIFNBQV8wQl9ERUZBVUxUfSwKKwkJezB4MEMsIFNBQV8wQ19ERUZBVUxUfSwKKwkJezB4MEQsIFNBQV8wRF9ERUZBVUxUfSwKKwkJezB4MEUsIDB4MDF9LAorCQl7MHgwRiwgMHgzNn0sCisJCXsweDEwLCAweDAwfSwKKwkJezB4MTEsIDB4MEN9LAorCQl7MHgxMiwgMHhFN30sCisJCXsweDEzLCAweDAwfSwKKwkJezB4MTUsIDB4MDB9LAorCQl7MHgxNiwgMHgwMH0sCisJCXsweDQwLCAweDAyfSwKKwkJezB4NDEsIDB4RkZ9LAorCQl7MHg0MiwgMHhGRn0sCisJCXsweDQzLCAweEZGfSwKKwkJezB4NDQsIDB4RkZ9LAorCQl7MHg0NSwgMHhGRn0sCisJCXsweDQ2LCAweEZGfSwKKwkJezB4NDcsIDB4RkZ9LAorCQl7MHg0OCwgMHhGRn0sCisJCXsweDQ5LCAweEZGfSwKKwkJezB4NEEsIDB4RkZ9LAorCQl7MHg0QiwgMHhGRn0sCisJCXsweDRDLCAweEZGfSwKKwkJezB4NEQsIDB4RkZ9LAorCQl7MHg0RSwgMHhGRn0sCisJCXsweDRGLCAweEZGfSwKKwkJezB4NTAsIDB4RkZ9LAorCQl7MHg1MSwgMHhGRn0sCisJCXsweDUyLCAweEZGfSwKKwkJezB4NTMsIDB4RkZ9LAorCQl7MHg1NCwgMHhGRn0sCisJCXsweDU1LCAweEZGfSwKKwkJezB4NTYsIDB4RkZ9LAorCQl7MHg1NywgMHhGRn0sCisJCXsweDU4LCAweDQwfSwKKwkJezB4NTksIDB4NTR9LAorCQl7MHg1QSwgMHgwN30sCisJCXsweDVCLCAweDgzfSwKKworCQl7MHhGRiwgMHhGRn0KK307CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2NvbnN0IHN0cnVjdCBzYWE3MTEzY29uZmlnIHNhYTcxMTNjb25maWdOVFNDWzI1Nl0gPSB7CisJCXsweDAxLCAweDA4fSwKKyNpZiBkZWZpbmVkKEFOVElBTElBUykKKwkJezB4MDIsIDB4QzB9LAogI2Vsc2UKLQl7MHg0MCwgMHgwMn0sCi0jZW5kaWYgLyogISBQUkVGRVJfTlRTQyovCi0JezB4NDEsIDB4RkZ9LAotCXsweDQyLCAweEZGfSwKLQl7MHg0MywgMHhGRn0sCi0JezB4NDQsIDB4RkZ9LAotCXsweDQ1LCAweEZGfSwKLQl7MHg0NiwgMHhGRn0sCi0JezB4NDcsIDB4RkZ9LAotCXsweDQ4LCAweEZGfSwKLQl7MHg0OSwgMHhGRn0sCi0JezB4NEEsIDB4RkZ9LAotCXsweDRCLCAweEZGfSwKLQl7MHg0QywgMHhGRn0sCi0JezB4NEQsIDB4RkZ9LAotCXsweDRFLCAweEZGfSwKLQl7MHg0RiwgMHhGRn0sCi0JezB4NTAsIDB4RkZ9LAotCXsweDUxLCAweEZGfSwKLQl7MHg1MiwgMHhGRn0sCi0JezB4NTMsIDB4RkZ9LAotCXsweDU0LCAweEZGfSwKLQl7MHg1NSwgMHhGRn0sCi0JezB4NTYsIDB4RkZ9LAotCXsweDU3LCAweEZGfSwKLQl7MHg1OCwgMHg0MH0sCi0JezB4NTksIDB4NTR9LAotI2lmIGRlZmluZWQoUFJFRkVSX05UU0MpCi0JezB4NUEsIDB4MEF9LAotI2Vsc2UKLQl7MHg1QSwgMHgwN30sCi0jZW5kaWYgLyogISBQUkVGRVJfTlRTQyovCi0JezB4NUIsIDB4ODN9LAotCXsweEZGLCAweEZGfQotCX07CisJCXsweDAyLCAweDgwfSwKKyNlbmRpZiAvKkFOVElBTElBUyovCisJCXsweDAzLCAweDMzfSwKKwkJezB4MDQsIDB4MDB9LAorCQl7MHgwNSwgMHgwMH0sCisJCXsweDA2LCAweEU5fSwKKwkJezB4MDcsIDB4MER9LAorCQl7MHgwOCwgMHg3OH0sCisJCXsweDA5LCAweDAwfSwKKwkJezB4MEEsIFNBQV8wQV9ERUZBVUxUfSwKKwkJezB4MEIsIFNBQV8wQl9ERUZBVUxUfSwKKwkJezB4MEMsIFNBQV8wQ19ERUZBVUxUfSwKKwkJezB4MEQsIFNBQV8wRF9ERUZBVUxUfSwKKwkJezB4MEUsIDB4MDF9LAorCQl7MHgwRiwgMHgzNn0sCisJCXsweDEwLCAweDAwfSwKKwkJezB4MTEsIDB4MEN9LAorCQl7MHgxMiwgMHhFN30sCisJCXsweDEzLCAweDAwfSwKKwkJezB4MTUsIDB4MDB9LAorCQl7MHgxNiwgMHgwMH0sCisJCXsweDQwLCAweDgyfSwKKwkJezB4NDEsIDB4RkZ9LAorCQl7MHg0MiwgMHhGRn0sCisJCXsweDQzLCAweEZGfSwKKwkJezB4NDQsIDB4RkZ9LAorCQl7MHg0NSwgMHhGRn0sCisJCXsweDQ2LCAweEZGfSwKKwkJezB4NDcsIDB4RkZ9LAorCQl7MHg0OCwgMHhGRn0sCisJCXsweDQ5LCAweEZGfSwKKwkJezB4NEEsIDB4RkZ9LAorCQl7MHg0QiwgMHhGRn0sCisJCXsweDRDLCAweEZGfSwKKwkJezB4NEQsIDB4RkZ9LAorCQl7MHg0RSwgMHhGRn0sCisJCXsweDRGLCAweEZGfSwKKwkJezB4NTAsIDB4RkZ9LAorCQl7MHg1MSwgMHhGRn0sCisJCXsweDUyLCAweEZGfSwKKwkJezB4NTMsIDB4RkZ9LAorCQl7MHg1NCwgMHhGRn0sCisJCXsweDU1LCAweEZGfSwKKwkJezB4NTYsIDB4RkZ9LAorCQl7MHg1NywgMHhGRn0sCisJCXsweDU4LCAweDQwfSwKKwkJezB4NTksIDB4NTR9LAorCQl7MHg1QSwgMHgwQX0sCisJCXsweDVCLCAweDgzfSwKKworCQl7MHhGRiwgMHhGRn0KK307CiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0xODcsNiArMjQ4LDkgQEAKIGNvbmZpcm1fcmVzb2x1dGlvbihzdHJ1Y3QgdXNiX2RldmljZSAqcCkKIHsKIF9fdTggZ2V0MCwgZ2V0MSwgZ2V0MiwgZ2V0MywgZ2V0NCwgZ2V0NSwgZ2V0NiwgZ2V0NzsKKworaWYgKE5VTEwgPT0gcCkKKwlyZXR1cm4gLUVOT0RFVjsKIEdFVChwLCAweDAxMTAsICZnZXQwKTsKIEdFVChwLCAweDAxMTEsICZnZXQxKTsKIEdFVChwLCAweDAxMTIsICZnZXQyKTsKQEAgLTIyNyw2ICsyOTEsOCBAQAogX191MTYgZ2V0MjsKIF9fdTggaWdvdDsKIAoraWYgKE5VTEwgPT0gcCkKKwlyZXR1cm4gLUVOT0RFVjsKIEdFVChwLCAweDAxMDAsICZpZ290KTsgIGdldDIgPSAweDgwICYgaWdvdDsKIGlmICgweDgwID09IGdldDIpCiAJSk9UKDgsICJjb25maXJtX3N0cmVhbTogIE9LXG4iKTsKQEAgLTIzNiwxNSArMzAyLDI0IEBACiB9CiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIGludAotc2V0dXBfc3RrKHN0cnVjdCB1c2JfZGV2aWNlICpwKQorc2V0dXBfc3RrKHN0cnVjdCB1c2JfZGV2aWNlICpwLCBib29sIG50c2MpCiB7CiBpbnQgaTA7CiAKK2lmIChOVUxMID09IHApCisJcmV0dXJuIC1FTk9ERVY7CiBpMCA9IDA7Ci13aGlsZSAoMHhGRkYgIT0gc3RrMTE2MGNvbmZpZ1tpMF0ucmVnKSB7Ci0JU0VUKHAsIHN0azExNjBjb25maWdbaTBdLnJlZywgc3RrMTE2MGNvbmZpZ1tpMF0uc2V0KTsKLQlpMCsrOworaWYgKHRydWUgPT0gbnRzYykgeworCXdoaWxlICgweEZGRiAhPSBzdGsxMTYwY29uZmlnTlRTQ1tpMF0ucmVnKSB7CisJCVNFVChwLCBzdGsxMTYwY29uZmlnTlRTQ1tpMF0ucmVnLCBzdGsxMTYwY29uZmlnTlRTQ1tpMF0uc2V0KTsKKwkJaTArKzsKIAl9Cit9IGVsc2UgeworCXdoaWxlICgweEZGRiAhPSBzdGsxMTYwY29uZmlnUEFMW2kwXS5yZWcpIHsKKwkJU0VUKHAsIHN0azExNjBjb25maWdQQUxbaTBdLnJlZywgc3RrMTE2MGNvbmZpZ1BBTFtpMF0uc2V0KTsKKwkJaTArKzsKKwl9Cit9CiAKIHdyaXRlXzMwMChwKTsKIApAQCAtMjUyLDE5ICszMjcsMjYgQEAKIH0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogaW50Ci1zZXR1cF9zYWEoc3RydWN0IHVzYl9kZXZpY2UgKnApCitzZXR1cF9zYWEoc3RydWN0IHVzYl9kZXZpY2UgKnAsIGJvb2wgbnRzYykKIHsKIGludCBpMCwgaXI7CiAKLQotc2V0MnRvNzgocCk7Ci0KLQoraWYgKE5VTEwgPT0gcCkKKwlyZXR1cm4gLUVOT0RFVjsKIGkwID0gMDsKLXdoaWxlICgweEZGICE9IHNhYTcxMTNjb25maWdbaTBdLnJlZykgewotCWlyID0gd3JpdGVfc2FhKHAsIHNhYTcxMTNjb25maWdbaTBdLnJlZywgc2FhNzExM2NvbmZpZ1tpMF0uc2V0KTsKLQlpMCsrOworaWYgKHRydWUgPT0gbnRzYykgeworCXdoaWxlICgweEZGICE9IHNhYTcxMTNjb25maWdOVFNDW2kwXS5yZWcpIHsKKwkJaXIgPSB3cml0ZV9zYWEocCwgc2FhNzExM2NvbmZpZ05UU0NbaTBdLnJlZywgXAorCQkJCQlzYWE3MTEzY29uZmlnTlRTQ1tpMF0uc2V0KTsKKwkJaTArKzsKIAl9Cit9IGVsc2UgeworCXdoaWxlICgweEZGICE9IHNhYTcxMTNjb25maWdQQUxbaTBdLnJlZykgeworCQlpciA9IHdyaXRlX3NhYShwLCBzYWE3MTEzY29uZmlnUEFMW2kwXS5yZWcsIFwKKwkJCQkJc2FhNzExM2NvbmZpZ1BBTFtpMF0uc2V0KTsKKwkJaTArKzsKKwl9Cit9CiByZXR1cm4gMDsKIH0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMjczLDYgKzM1NSw4IEBACiB7CiBfX3U4IGlnb3QwLCBpZ290MjsKIAoraWYgKE5VTEwgPT0gcCkKKwlyZXR1cm4gLUVOT0RFVjsKIEdFVChwLCAweDAwMDIsICZpZ290Mik7CiBHRVQocCwgMHgwMDAwLCAmaWdvdDApOwogU0VUKHAsIDB4MDAwMiwgc2V0Mik7CkBAIC0yODMsNiArMzY3LDggQEAKIGludAogd3JpdGVfc2FhKHN0cnVjdCB1c2JfZGV2aWNlICpwLCBfX3UxNiByZWcwLCBfX3UxNiBzZXQwKQogeworaWYgKE5VTEwgPT0gcCkKKwlyZXR1cm4gLUVOT0RFVjsKIFNFVChwLCAweDIwMCwgMHgwMCk7CiBTRVQocCwgMHgyMDQsIHJlZzApOwogU0VUKHAsIDB4MjA1LCBzZXQwKTsKQEAgLTMwNiw2ICszOTIsOCBAQAogX191MTYgZ290NTAyLCBnb3Q1MDM7CiBfX3UxNiBzZXQ1MDIsIHNldDUwMzsKIAoraWYgKE5VTEwgPT0gcCkKKwlyZXR1cm4gLUVOT0RFVjsKIFNFVChwLCAweDA1MDQsIHJlZzApOwogU0VUKHAsIDB4MDUwMCwgMHgwMDhCKTsKIApAQCAtMzQxLDYgKzQyOSw4IEBACiBfX3U4IGlnb3Q7CiBfX3UxNiBnb3Q1MDIsIGdvdDUwMzsKIAoraWYgKE5VTEwgPT0gcCkKKwlyZXR1cm4gLUVOT0RFVjsKIFNFVChwLCAweDA1MDQsIHJlZzApOwogU0VUKHAsIDB4MDUwMCwgMHgwMDhCKTsKIApAQCAtMzYwLDYgKzQ1MCw4IEBACiBpbnQKIHdyaXRlXzMwMChzdHJ1Y3QgdXNiX2RldmljZSAqcCkKIHsKK2lmIChOVUxMID09IHApCisJcmV0dXJuIC1FTk9ERVY7CiBTRVQocCwgMHgzMDAsIDB4MDAxMik7CiBTRVQocCwgMHgzNTAsIDB4MDAyRCk7CiBTRVQocCwgMHgzNTEsIDB4MDAwMSk7CkBAIC0zNzYsMjQgKzQ2OCw0OCBAQAogICovCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIGludAotY2hlY2tfc2FhKHN0cnVjdCB1c2JfZGV2aWNlICpwKQorY2hlY2tfc2FhKHN0cnVjdCB1c2JfZGV2aWNlICpwLCBib29sIG50c2MpCiB7CiBpbnQgaTAsIGlyLCByYzsKKworaWYgKE5VTEwgPT0gcCkKKwlyZXR1cm4gLUVOT0RFVjsKIGkwID0gMDsKLQogcmMgPSAwOwotd2hpbGUgKDB4RkYgIT0gc2FhNzExM2NvbmZpZ1tpMF0ucmVnKSB7Ci0JaWYgKDB4MEYgPT0gc2FhNzExM2NvbmZpZ1tpMF0ucmVnKSB7Ci0JCWkwKys7IGNvbnRpbnVlOwotCX0KK2lmICh0cnVlID09IG50c2MpIHsKKwl3aGlsZSAoMHhGRiAhPSBzYWE3MTEzY29uZmlnTlRTQ1tpMF0ucmVnKSB7CisJCWlmICgweDBGID09IHNhYTcxMTNjb25maWdOVFNDW2kwXS5yZWcpIHsKKwkJCWkwKys7CisJCQljb250aW51ZTsKKwkJfQogCi0JaXIgPSByZWFkX3NhYShwLCBzYWE3MTEzY29uZmlnW2kwXS5yZWcpOwotCWlmIChpciAhPSBzYWE3MTEzY29uZmlnW2kwXS5zZXQpIHsKLQkJU0FZKCJTQUEgcmVnaXN0ZXIgMHglMDJYIGhhcyAweCUwMlgsIGV4cGVjdGVkIDB4JTAyWFxuIiwgXAotCQkJc2FhNzExM2NvbmZpZ1tpMF0ucmVnLCBpciwgc2FhNzExM2NvbmZpZ1tpMF0uc2V0KTsKLQkJcmMtLTsKKwkJaXIgPSByZWFkX3NhYShwLCBzYWE3MTEzY29uZmlnTlRTQ1tpMF0ucmVnKTsKKwkJaWYgKGlyICE9IHNhYTcxMTNjb25maWdOVFNDW2kwXS5zZXQpIHsKKwkJCVNBWSgiU0FBIHJlZ2lzdGVyIDB4JTAyWCBoYXMgMHglMDJYLCAiIFwKKwkJCQkJCSJleHBlY3RlZCAweCUwMlhcbiIsIFwKKwkJCQkJCXNhYTcxMTNjb25maWdOVFNDW2kwXS5yZWcsIFwKKwkJCQkJCWlyLCBzYWE3MTEzY29uZmlnTlRTQ1tpMF0uc2V0KTsKKwkJCXJjLS07CisJCX0KKwkJaTArKzsKIAl9Ci0JaTArKzsKK30gZWxzZSB7CisJd2hpbGUgKDB4RkYgIT0gc2FhNzExM2NvbmZpZ1BBTFtpMF0ucmVnKSB7CisJCWlmICgweDBGID09IHNhYTcxMTNjb25maWdQQUxbaTBdLnJlZykgeworCQkJaTArKzsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaXIgPSByZWFkX3NhYShwLCBzYWE3MTEzY29uZmlnUEFMW2kwXS5yZWcpOworCQlpZiAoaXIgIT0gc2FhNzExM2NvbmZpZ1BBTFtpMF0uc2V0KSB7CisJCQlTQVkoIlNBQSByZWdpc3RlciAweCUwMlggaGFzIDB4JTAyWCwgIiBcCisJCQkJCQkiZXhwZWN0ZWQgMHglMDJYXG4iLCBcCisJCQkJCQlzYWE3MTEzY29uZmlnUEFMW2kwXS5yZWcsIFwKKwkJCQkJCWlyLCBzYWE3MTEzY29uZmlnUEFMW2kwXS5zZXQpOworCQkJcmMtLTsKKwkJfQorCQlpMCsrOworCX0KIH0KIGlmICgtOCA+IHJjKQogCXJldHVybiByYzsKQEAgLTQwNiw2ICs1MjIsOCBAQAogewogaW50IHJjOwogCitpZiAoTlVMTCA9PSBwKQorCXJldHVybiAtRU5PREVWOwogcmMgPSByZWFkX3NhYShwLCAweDFGKTsKIGlmICgoMCA+IHJjKSB8fCAoMHgwMiAmIHJjKSkKIAlyZXR1cm4gMSA7CkBAIC00MTYsMjkgKzUzNCw0NiBAQAogaW50CiByZWFkeV9zYWEoc3RydWN0IHVzYl9kZXZpY2UgKnApCiB7Ci1pbnQgaiwgcmM7Ci1zdGF0aWMgaW50IG1heCA9IDEwOwotCitpbnQgaiwgcmMsIHJhdGU7Citjb25zdCBpbnQgbWF4ID0gNSwgbWFya3RpbWUgPSBQQVRJRU5DRS81OworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogICBSRVRVUk5TICAgIDAgICAgIEZPUiBJTlRFUkxBQ0VEICAgICAgIDUwIEh6CisgKiAgICAgICAgICAgICAgMSAgICAgRk9SIE5PTi1JTlRFUkxBQ0VEICAgNTAgSHoKKyAqICAgICAgICAgICAgICAyICAgICBGT1IgSU5URVJMQUNFRCAgICAgICA2MCBIegorICogICAgICAgICAgICAgIDMgICAgIEZPUiBOT04tSU5URVJMQUNFRCAgIDYwIEh6CisqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitpZiAoTlVMTCA9PSBwKQorCXJldHVybiAtRU5PREVWOwogaiA9IDA7CiB3aGlsZSAobWF4ID4gaikgewogCXJjID0gcmVhZF9zYWEocCwgMHgxRik7CiAJaWYgKDAgPD0gcmMpIHsKLQkJaWYgKCgxID09ICgweDAxICYgcmMpKSYmKDAgPT0gKDB4NDAgJiByYykpKQorCQlpZiAoMCA9PSAoMHg0MCAmIHJjKSkKKwkJCWJyZWFrOworCQlpZiAoMSA9PSAoMHgwMSAmIHJjKSkKIAkJCWJyZWFrOwogCX0KLQltc2xlZXAoMTAwKTsgIGorKzsKKwltc2xlZXAobWFya3RpbWUpOworCWorKzsKIH0KIGlmIChtYXggPT0gaikKIAlyZXR1cm4gLTE7CiBlbHNlIHsKLQlpZiAoMHgyMCAmIHJjKQorCWlmICgweDIwICYgcmMpIHsKKwkJcmF0ZSA9IDI7CiAJCUpPVCg4LCAiaGFyZHdhcmUgZGV0ZWN0cyA2MCBIelxuIik7Ci0JZWxzZQorCX0gZWxzZSB7CisJCXJhdGUgPSAwOwogCQlKT1QoOCwgImhhcmR3YXJlIGRldGVjdHMgNTAgSHpcbiIpOworCX0KIAlpZiAoMHg4MCAmIHJjKQogCQlKT1QoOCwgImhhcmR3YXJlIGRldGVjdHMgaW50ZXJsYWNpbmdcbiIpOwotCWVsc2UKKwllbHNlIHsKKwkJcmF0ZSsrOwogCQlKT1QoOCwgImhhcmR3YXJlIGRldGVjdHMgbm8gaW50ZXJsYWNpbmdcbiIpOworCX0KIH0KIHJldHVybiAwOwogfQpAQCAtNDQ3LDQ1ICs1ODIsODAgQEAKIC8qCiAgKiAgTk9URTogVEhFIEZPTExPV0lORyBBUkUgTk9UIENIRUNLRUQ6CiAgKiAgUkVHSVNURVJTIDB4MDAwLCAweDAwMjogIEZVTkNUSU9OQUxJVFkgSVMgTk9UIEtOT1dOCi0gKiAgUkVHSVNURVIgIDB4MTAwOiAgQUNDRVBUIEFMU08gKDB4ODAgfCBzdGsxMTYwY29uZmlnWy5dLnNldCkKKyAqICBSRUdJU1RFUiAgMHgxMDA6ICBBQ0NFUFQgQUxTTyAoMHg4MCB8IHN0azExNjBjb25maWcuLi4uWy5dLnNldCkKICAqLwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiBpbnQKLWNoZWNrX3N0ayhzdHJ1Y3QgdXNiX2RldmljZSAqcCkKK2NoZWNrX3N0ayhzdHJ1Y3QgdXNiX2RldmljZSAqcCwgYm9vbCBudHNjKQogewogaW50IGkwLCBpcjsKKworaWYgKE5VTEwgPT0gcCkKKwlyZXR1cm4gLUVOT0RFVjsKIGkwID0gMDsKLXdoaWxlICgweEZGRiAhPSBzdGsxMTYwY29uZmlnW2kwXS5yZWcpIHsKLQlpZiAoMHgwMDAgPT0gc3RrMTE2MGNvbmZpZ1tpMF0ucmVnKSB7Ci0JCWkwKys7IGNvbnRpbnVlOwotCX0KLQlpZiAoMHgwMDIgPT0gc3RrMTE2MGNvbmZpZ1tpMF0ucmVnKSB7Ci0JCWkwKys7IGNvbnRpbnVlOwotCX0KLQotCWlyID0gcmVhZF9zdGsocCwgc3RrMTE2MGNvbmZpZ1tpMF0ucmVnKTsKLQotCWlmICgweDEwMCA9PSBzdGsxMTYwY29uZmlnW2kwXS5yZWcpIHsKLQkJaWYgKChpciAhPSAoMHhGRiAmIHN0azExNjBjb25maWdbaTBdLnNldCkpICYmIFwKLQkJCShpciAhPSAoMHg4MCB8ICgweEZGICYgc3RrMTE2MGNvbmZpZ1tpMF0uc2V0KSkpICYmIFwKLQkJCQkoMHhGRkZGICE9IHN0azExNjBjb25maWdbaTBdLnNldCkpIHsKLQkJCVNBWSgiU1RLIHJlZ2lzdGVyIDB4JTAzWCBoYXMgMHglMDJYLCAiIFwKLQkJCQkJImV4cGVjdGVkIDB4JTAyWFxuIiwgXAotCQkJCQlzdGsxMTYwY29uZmlnW2kwXS5yZWcsIGlyLCBcCi0JCQkJCXN0azExNjBjb25maWdbaTBdLnNldCk7CitpZiAodHJ1ZSA9PSBudHNjKSB7CisJd2hpbGUgKDB4RkZGICE9IHN0azExNjBjb25maWdOVFNDW2kwXS5yZWcpIHsKKwkJaWYgKDB4MDAwID09IHN0azExNjBjb25maWdOVFNDW2kwXS5yZWcpIHsKKwkJCWkwKys7IGNvbnRpbnVlOworCQl9CisJCWlmICgweDAwMiA9PSBzdGsxMTYwY29uZmlnTlRTQ1tpMF0ucmVnKSB7CisJCQlpMCsrOyBjb250aW51ZTsKKwkJfQorCQlpciA9IHJlYWRfc3RrKHAsIHN0azExNjBjb25maWdOVFNDW2kwXS5yZWcpOworCQlpZiAoMHgxMDAgPT0gc3RrMTE2MGNvbmZpZ05UU0NbaTBdLnJlZykgeworCQkJaWYgKChpciAhPSAoMHhGRiAmIHN0azExNjBjb25maWdOVFNDW2kwXS5zZXQpKSAmJiBcCisJCQkJCShpciAhPSAoMHg4MCB8ICgweEZGICYgXAorCQkJCQlzdGsxMTYwY29uZmlnTlRTQ1tpMF0uc2V0KSkpICYmIFwKKwkJCQkJKDB4RkZGRiAhPSBcCisJCQkJCXN0azExNjBjb25maWdOVFNDW2kwXS5zZXQpKSB7CisJCQkJU0FZKCJTVEsgcmVnaXN0ZXIgMHglMDNYIGhhcyAweCUwMlgsICIgXAorCQkJCQkJImV4cGVjdGVkIDB4JTAyWFxuIiwgXAorCQkJCQkJc3RrMTE2MGNvbmZpZ05UU0NbaTBdLnJlZywgXAorCQkJCQkJaXIsIHN0azExNjBjb25maWdOVFNDW2kwXS5zZXQpOworCQkJCX0KKwkJCWkwKys7IGNvbnRpbnVlOwogCQkJfQotCQlpMCsrOyBjb250aW51ZTsKKwkJaWYgKChpciAhPSAoMHhGRiAmIHN0azExNjBjb25maWdOVFNDW2kwXS5zZXQpKSAmJiBcCisJCQkJKDB4RkZGRiAhPSBzdGsxMTYwY29uZmlnTlRTQ1tpMF0uc2V0KSkgeworCQkJU0FZKCJTVEsgcmVnaXN0ZXIgMHglMDNYIGhhcyAweCUwMlgsICIgXAorCQkJCQkJImV4cGVjdGVkIDB4JTAyWFxuIiwgXAorCQkJCQkJc3RrMTE2MGNvbmZpZ05UU0NbaTBdLnJlZywgXAorCQkJCQkJaXIsIHN0azExNjBjb25maWdOVFNDW2kwXS5zZXQpOwogCQl9Ci0KLQlpZiAoKGlyICE9ICgweEZGICYgc3RrMTE2MGNvbmZpZ1tpMF0uc2V0KSkgJiYgXAotCQkJKDB4RkZGRiAhPSBzdGsxMTYwY29uZmlnW2kwXS5zZXQpKSB7Ci0JCVNBWSgiU1RLIHJlZ2lzdGVyIDB4JTAzWCBoYXMgMHglMDJYLCAiIFwKLQkJCQkJImV4cGVjdGVkIDB4JTAyWFxuIiwgXAotCQkJCQlzdGsxMTYwY29uZmlnW2kwXS5yZWcsIGlyLCBcCi0JCQkJCXN0azExNjBjb25maWdbaTBdLnNldCk7Ci0JCX0KLQlpMCsrOworCQlpMCsrOwogCX0KK30gZWxzZSB7CisJd2hpbGUgKDB4RkZGICE9IHN0azExNjBjb25maWdQQUxbaTBdLnJlZykgeworCQlpZiAoMHgwMDAgPT0gc3RrMTE2MGNvbmZpZ1BBTFtpMF0ucmVnKSB7CisJCQlpMCsrOyBjb250aW51ZTsKKwkJfQorCQlpZiAoMHgwMDIgPT0gc3RrMTE2MGNvbmZpZ1BBTFtpMF0ucmVnKSB7CisJCQlpMCsrOyBjb250aW51ZTsKKwkJfQorCQlpciA9IHJlYWRfc3RrKHAsIHN0azExNjBjb25maWdQQUxbaTBdLnJlZyk7CisJCWlmICgweDEwMCA9PSBzdGsxMTYwY29uZmlnUEFMW2kwXS5yZWcpIHsKKwkJCWlmICgoaXIgIT0gKDB4RkYgJiBzdGsxMTYwY29uZmlnUEFMW2kwXS5zZXQpKSAmJiBcCisJCQkJCShpciAhPSAoMHg4MCB8ICgweEZGICYgXAorCQkJCQlzdGsxMTYwY29uZmlnUEFMW2kwXS5zZXQpKSkgJiYgXAorCQkJCQkoMHhGRkZGICE9IFwKKwkJCQkJc3RrMTE2MGNvbmZpZ1BBTFtpMF0uc2V0KSkgeworCQkJCVNBWSgiU1RLIHJlZ2lzdGVyIDB4JTAzWCBoYXMgMHglMDJYLCAiIFwKKwkJCQkJCSJleHBlY3RlZCAweCUwMlhcbiIsIFwKKwkJCQkJCXN0azExNjBjb25maWdQQUxbaTBdLnJlZywgXAorCQkJCQkJaXIsIHN0azExNjBjb25maWdQQUxbaTBdLnNldCk7CisJCQkJfQorCQkJaTArKzsgY29udGludWU7CisJCQl9CisJCWlmICgoaXIgIT0gKDB4RkYgJiBzdGsxMTYwY29uZmlnUEFMW2kwXS5zZXQpKSAmJiBcCisJCQkJKDB4RkZGRiAhPSBzdGsxMTYwY29uZmlnUEFMW2kwXS5zZXQpKSB7CisJCQlTQVkoIlNUSyByZWdpc3RlciAweCUwM1ggaGFzIDB4JTAyWCwgIiBcCisJCQkJCQkiZXhwZWN0ZWQgMHglMDJYXG4iLCBcCisJCQkJCQlzdGsxMTYwY29uZmlnUEFMW2kwXS5yZWcsIFwKKwkJCQkJCWlyLCBzdGsxMTYwY29uZmlnUEFMW2kwXS5zZXQpOworCQl9CisJCWkwKys7CisJfQorfQogcmV0dXJuIDA7CiB9CiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTQ5NCw2ICs2NjQsOCBAQAogewogX191OCBpZ290OwogCitpZiAoTlVMTCA9PSBwKQorCXJldHVybiAtRU5PREVWOwogU0VUKHAsIDB4MjA4LCByZWcwKTsKIFNFVChwLCAweDIwMCwgMHgyMCk7CiBpZiAoMCAhPSB3YWl0X2kyYyhwKSkKQEAgLTUwOCwxMiArNjgwLDE0IEBACiB7CiBfX3U4IGlnb3Q7CiAKK2lmIChOVUxMID09IHApCisJcmV0dXJuIC1FTk9ERVY7CiBpZ290ID0gMDsKIEdFVChwLCByZWcwLCAmaWdvdCk7CiByZXR1cm4gaWdvdDsKIH0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKgogICogICAgSEFSRFdBUkUgICAgVVNFUlNQQUNFIElOUFVUIE5VTUJFUiAgIFBIWVNJQ0FMIElOUFVUICAgRFJJVkVSIGlucHV0IFZBTFVFCiAgKgpAQCAtNTM0LDgxICs3MDgsMTAwIEBACiBpbnQKIHNlbGVjdF9pbnB1dChzdHJ1Y3QgdXNiX2RldmljZSAqcCwgaW50IGlucHV0LCBpbnQgbW9kZSkKIHsKK2ludCBpcjsKIAoraWYgKE5VTEwgPT0gcCkKKwlyZXR1cm4gLUVOT0RFVjsKIHN0b3BfMTAwKHApOwotCi1tc2xlZXAoMjApOwogc3dpdGNoIChpbnB1dCkgewogY2FzZSAwOgogY2FzZSAxOiB7Ci0JU0VUKHAsIDB4MDAwMCwgMHgwMDk4KTsgYnJlYWs7CisJaWYgKDAgIT0gd3JpdGVfc2FhKHAsIDB4MDIsIDB4ODApKSB7CisJCVNBWSgiRVJST1I6IGZhaWxlZCB0byBzZXQgU0FBIHJlZ2lzdGVyIDB4MDIgZm9yIGlucHV0ICVpXG4iLCBcCisJCQkJCQkJCQlpbnB1dCk7CisJfQorCVNFVChwLCAweDAwMDAsIDB4MDA5OCk7CisJU0VUKHAsIDB4MDAwMiwgMHgwMDc4KTsKKwlicmVhazsKIH0KIGNhc2UgMjogewotCVNFVChwLCAweDAwMDAsIDB4MDA5MCk7IGJyZWFrOworCWlmICgwICE9IHdyaXRlX3NhYShwLCAweDAyLCAweDgwKSkgeworCQlTQVkoIkVSUk9SOiBmYWlsZWQgdG8gc2V0IFNBQSByZWdpc3RlciAweDAyIGZvciBpbnB1dCAlaVxuIiwgXAorCQkJCQkJCQkJaW5wdXQpOworCX0KKwlTRVQocCwgMHgwMDAwLCAweDAwOTApOworCVNFVChwLCAweDAwMDIsIDB4MDA3OCk7CisJYnJlYWs7CiB9CiBjYXNlIDM6IHsKLQlTRVQocCwgMHgwMDAwLCAweDAwODgpOyBicmVhazsKKwlpZiAoMCAhPSB3cml0ZV9zYWEocCwgMHgwMiwgMHg4MCkpIHsKKwkJU0FZKCJFUlJPUjogZmFpbGVkIHRvIHNldCBTQUEgcmVnaXN0ZXIgMHgwMiBmb3IgaW5wdXQgJWlcbiIsIFwKKwkJCQkJCQkJCWlucHV0KTsKKwl9CisJU0VUKHAsIDB4MDAwMCwgMHgwMDg4KTsKKwlTRVQocCwgMHgwMDAyLCAweDAwNzgpOworCWJyZWFrOwogfQogY2FzZSA0OiB7Ci0JU0VUKHAsIDB4MDAwMCwgMHgwMDgwKTsgYnJlYWs7CisJaWYgKDAgIT0gd3JpdGVfc2FhKHAsIDB4MDIsIDB4ODApKSB7CisJCVNBWSgiRVJST1I6IGZhaWxlZCB0byBzZXQgU0FBIHJlZ2lzdGVyIDB4MDIgZm9yIGlucHV0ICVpXG4iLCBcCisJCQkJCQkJCQlpbnB1dCk7CisJfQorCVNFVChwLCAweDAwMDAsIDB4MDA4MCk7CisJU0VUKHAsIDB4MDAwMiwgMHgwMDc4KTsKKwlicmVhazsKIH0KIGNhc2UgNTogewogCWlmICg5ICE9IG1vZGUpCiAJCW1vZGUgPSA3OwogCXN3aXRjaCAobW9kZSkgewotCWNhc2UgNzoKLQkJeworCWNhc2UgNzogewogCQlpZiAoMCAhPSB3cml0ZV9zYWEocCwgMHgwMiwgMHg4NykpIHsKLQkJCVNBWSgiRVJST1I6IGZhaWxlZCB0byBzZXQgU0FBICIgXAotCQkJCSJyZWdpc3RlciAweDAyIGZvciBpbnB1dCAiIFwKLQkJCQkiJWlcbiIsIGlucHV0KTsKKwkJCVNBWSgiRVJST1I6IGZhaWxlZCB0byBzZXQgU0FBIHJlZ2lzdGVyIDB4MDIgIiBcCisJCQkJCQkiZm9yIGlucHV0ICVpXG4iLCBpbnB1dCk7CiAJCX0KIAkJaWYgKDAgIT0gd3JpdGVfc2FhKHAsIDB4MDUsIDB4RkYpKSB7Ci0JCQlTQVkoIkVSUk9SOiBmYWlsZWQgdG8gc2V0IFNBQSAiIFwKLQkJCQkicmVnaXN0ZXIgMHgwNSBmb3IgaW5wdXQgIiBcCi0JCQkJIiVpXG4iLCBpbnB1dCk7CisJCQlTQVkoIkVSUk9SOiBmYWlsZWQgdG8gc2V0IFNBQSByZWdpc3RlciAweDA1ICIgXAorCQkJCQkJImZvciBpbnB1dCAlaVxuIiwgaW5wdXQpOwogCQl9CiAJCWJyZWFrOwogCX0KLQljYXNlIDk6Ci0JCXsKKwljYXNlIDk6IHsKIAkJaWYgKDAgIT0gd3JpdGVfc2FhKHAsIDB4MDIsIDB4ODkpKSB7Ci0JCQlTQVkoIkVSUk9SOiBmYWlsZWQgdG8gc2V0IFNBQSAiIFwKLQkJCQkicmVnaXN0ZXIgMHgwMiBmb3IgaW5wdXQgIiBcCi0JCQkJIiVpXG4iLCBpbnB1dCk7CisJCQlTQVkoIkVSUk9SOiBmYWlsZWQgdG8gc2V0IFNBQSByZWdpc3RlciAweDAyICIgXAorCQkJCQkJImZvciBpbnB1dCAlaVxuIiwgaW5wdXQpOwogCQl9CiAJCWlmICgwICE9IHdyaXRlX3NhYShwLCAweDA1LCAweDAwKSkgewotCQkJU0FZKCJFUlJPUjogZmFpbGVkIHRvIHNldCBTQUEgIiBcCi0JCQkJInJlZ2lzdGVyIDB4MDUgZm9yIGlucHV0ICIgXAotCQkJCSIlaVxuIiwgaW5wdXQpOworCQkJU0FZKCJFUlJPUjogZmFpbGVkIHRvIHNldCBTQUEgcmVnaXN0ZXIgMHgwNSAiIFwKKwkJCQkJCSJmb3IgaW5wdXQgJWlcbiIsIGlucHV0KTsKIAkJfQotCQlicmVhazsKKwlicmVhazsKIAl9Ci0JZGVmYXVsdDoKLQkJeworCWRlZmF1bHQ6IHsKIAkJU0FZKCJNSVNUQUtFOiAgYmFkIG1vZGU6ICVpXG4iLCBtb2RlKTsKIAkJcmV0dXJuIC0xOwotCQl9CisJfQogCX0KIAlpZiAoMCAhPSB3cml0ZV9zYWEocCwgMHgwNCwgMHgwMCkpIHsKLQkJU0FZKCJFUlJPUjogZmFpbGVkIHRvIHNldCBTQUEgcmVnaXN0ZXIgMHgwNCAiIFwKLQkJCQkJImZvciBpbnB1dCAlaVxuIiwgaW5wdXQpOworCQlTQVkoIkVSUk9SOiBmYWlsZWQgdG8gc2V0IFNBQSByZWdpc3RlciAweDA0IGZvciBpbnB1dCAlaVxuIiwgXAorCQkJCQkJCQkJaW5wdXQpOwogCX0KIAlpZiAoMCAhPSB3cml0ZV9zYWEocCwgMHgwOSwgMHg4MCkpIHsKLQkJU0FZKCJFUlJPUjogZmFpbGVkIHRvIHNldCBTQUEgcmVnaXN0ZXIgMHgwOSAiIFwKLQkJCQkJImZvciBpbnB1dCAlaVxuIiwgaW5wdXQpOworCQlTQVkoIkVSUk9SOiBmYWlsZWQgdG8gc2V0IFNBQSByZWdpc3RlciAweDA5IGZvciBpbnB1dCAlaVxuIiwgXAorCQkJCQkJCQkJaW5wdXQpOwogCX0KKwlTRVQocCwgMHgwMDAyLCAweDAwOTMpOwogCWJyZWFrOwogfQotZGVmYXVsdDoKLQl7CitkZWZhdWx0OiB7CiAJU0FZKCJFUlJPUjogIGJhZCBpbnB1dDogJWlcbiIsIGlucHV0KTsKIAlyZXR1cm4gLTE7CiB9CiB9Ci1tc2xlZXAoMjApOwotU0VUKHAsIDB4MDAwMiwgMHgwMDkzKTsKLW1zbGVlcCgyMCk7CitpciA9IHJlYWRfc3RrKHAsIDB4MDApOworSk9UKDgsICJTVEsgcmVnaXN0ZXIgMHgwMCBoYXMgMHglMDJYXG4iLCBpcik7CitpciA9IHJlYWRfc2FhKHAsIDB4MDIpOworSk9UKDgsICJTQUEgcmVnaXN0ZXIgMHgwMiBoYXMgMHglMDJYXG4iLCBpcik7CiAKIHN0YXJ0XzEwMChwKTsKIApAQCAtNjIxLDYgKzgxNCw4IEBACiB7CiBfX3UxNiB1MHgwMTExLCB1MHgwMTEzLCB1MHgwMTE1LCB1MHgwMTE3OwogCitpZiAoTlVMTCA9PSBwKQorCXJldHVybiAtRU5PREVWOwogdTB4MDExMSA9ICgoMHhGRjAwICYgc2V0MCkgPj4gOCk7CiB1MHgwMTEzID0gKCgweEZGMDAgJiBzZXQxKSA+PiA4KTsKIHUweDAxMTUgPSAoKDB4RkYwMCAmIHNldDIpID4+IDgpOwpAQCAtNjQxLDEzICs4MzYsMjUgQEAKIGludAogc3RhcnRfMTAwKHN0cnVjdCB1c2JfZGV2aWNlICpwKQogewotX191MTYgZ2V0MDsKLV9fdTggaWdvdDsKK19fdTE2IGdldDExNiwgZ2V0MTE3LCBnZXQwOworX191OCBpZ290MTE2LCBpZ290MTE3LCBpZ290OwogCi1HRVQocCwgMHgwMTAwLCAmaWdvdCk7ICBnZXQwID0gaWdvdDsKLW1zbGVlcCgweDFmNCk7CitpZiAoTlVMTCA9PSBwKQorCXJldHVybiAtRU5PREVWOworR0VUKHAsIDB4MDExNiwgJmlnb3QxMTYpOworZ2V0MTE2ID0gaWdvdDExNjsKK0dFVChwLCAweDAxMTcsICZpZ290MTE3KTsKK2dldDExNyA9IGlnb3QxMTc7CitTRVQocCwgMHgwMTE2LCAweDAwMDApOworU0VUKHAsIDB4MDExNywgMHgwMDAwKTsKKworR0VUKHAsIDB4MDEwMCwgJmlnb3QpOworZ2V0MCA9IGlnb3Q7CiBTRVQocCwgMHgwMTAwLCAoMHg4MCB8IGdldDApKTsKLW1zbGVlcCgweDFmNCk7CisKK1NFVChwLCAweDAxMTYsIGdldDExNik7CitTRVQocCwgMHgwMTE3LCBnZXQxMTcpOworCiByZXR1cm4gMDsKIH0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtNjU3LDEwICs4NjQsMTEgQEAKIF9fdTE2IGdldDA7CiBfX3U4IGlnb3Q7CiAKLUdFVChwLCAweDAxMDAsICZpZ290KTsgIGdldDAgPSBpZ290OwotbXNsZWVwKDB4MWY0KTsKK2lmIChOVUxMID09IHApCisJcmV0dXJuIC1FTk9ERVY7CitHRVQocCwgMHgwMTAwLCAmaWdvdCk7CitnZXQwID0gaWdvdDsKIFNFVChwLCAweDAxMDAsICgweDdGICYgZ2V0MCkpOwotbXNsZWVwKDB4MWY0KTsKIHJldHVybiAwOwogfQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC02NzQsOSArODgyLDExIEBACiB7CiBfX3UxNiBnZXQwOwogX191OCBpZ290OwotY29uc3QgaW50IG1heCA9IDQ7Citjb25zdCBpbnQgbWF4ID0gMjsKIGludCBrOwogCitpZiAoTlVMTCA9PSBwKQorCXJldHVybiAtRU5PREVWOwogZm9yIChrID0gMDsgIGsgPCBtYXg7ICBrKyspIHsKIAlHRVQocCwgMHgwMjAxLCAmaWdvdCk7ICBnZXQwID0gaWdvdDsKIAlzd2l0Y2ggKGdldDApIHsKQEAgLTY4NSw3ICs4OTUsNyBAQAogCQlyZXR1cm4gMDsKIAl9CiAJY2FzZSAweDAwOiB7Ci0JCW1zbGVlcCgxMCk7CisJCW1zbGVlcCgyMCk7CiAJCWNvbnRpbnVlOwogCX0KIAlkZWZhdWx0OiB7CkBAIC03MDMsOCArOTEzLDcgQEAKIGludCByYzAsIHJjMTsKIAogaWYgKCFwdXNiX2RldmljZSkKLQlyZXR1cm4gLUVGQVVMVDsKLQorCXJldHVybiAtRU5PREVWOwogcmMxID0gMDsgIGlnb3QgPSAwOwogcmMwID0gdXNiX2NvbnRyb2xfbXNnKHB1c2JfZGV2aWNlLCB1c2Jfc25kY3RybHBpcGUocHVzYl9kZXZpY2UsIDApLCBcCiAJCShfX3U4KTB4MDEsIFwKQEAgLTc0MSwyNyArOTUwLDE0IEBACiBjYXNlIDB4MjA1OgogY2FzZSAweDM1MDoKIGNhc2UgMHgzNTE6IHsKLQlpZiAoMCAhPSBpZ290KSB7CisJaWYgKDAgIT0gKDB4RkYgJiBpZ290KSkgewogCQlKT1QoOCwgInVuZXhwZWN0ZWQgMHglMDJYIGZvciBTVEsgcmVnaXN0ZXIgMHglMDNYXG4iLCBcCiAJCQkJCQkJCWlnb3QsIGluZGV4KTsKIAl9CiBicmVhazsKIH0KLWNhc2UgMHgxMTQ6Ci1jYXNlIDB4MTE2OiB7Ci0JaWYgKCgweEZGICYgdmFsdWUpICE9IGlnb3QpIHsKLQkJSk9UKDgsICJ1bmV4cGVjdGVkIDB4JTAyWCAhPSAweCUwMlggIiBcCi0JCQkJCQkiZm9yIFNUSyByZWdpc3RlciAweCUwM1hcbiIsIFwKLQkJCQkJCWlnb3QsIHZhbHVlLCBpbmRleCk7Ci0JfQotYnJlYWs7Ci19Ci1jYXNlIDB4MjAwOiB7Ci0JaWYgKDAgPT0gaWdvdCkKLQkJYnJlYWs7Ci19CiBkZWZhdWx0OiB7Ci0JaWYgKHZhbHVlICE9IGlnb3QpIHsKKwlpZiAoKDB4RkYgJiB2YWx1ZSkgIT0gKDB4RkYgJiBpZ290KSkgewogCQlKT1QoOCwgInVuZXhwZWN0ZWQgMHglMDJYICE9IDB4JTAyWCAiIFwKIAkJCQkJImZvciBTVEsgcmVnaXN0ZXIgMHglMDNYXG4iLCBcCiAJCQkJCWlnb3QsIHZhbHVlLCBpbmRleCk7CkBAIC03ODAsOCArOTc2LDcgQEAKIGludCBpcjsKIAogaWYgKCFwdXNiX2RldmljZSkKLQlyZXR1cm4gLUVGQVVMVDsKLQorCXJldHVybiAtRU5PREVWOwogaXIgPSB1c2JfY29udHJvbF9tc2cocHVzYl9kZXZpY2UsIHVzYl9yY3ZjdHJscGlwZShwdXNiX2RldmljZSwgMCksIFwKIAkJKF9fdTgpMHgwMCwgXAogCQkoX191OCkoVVNCX0RJUl9JTiB8IFVTQl9UWVBFX1ZFTkRPUiB8IFVTQl9SRUNJUF9ERVZJQ0UpLCBcCkBAIC03OTYsNiArOTkxLDggQEAKIGludAogd2FrZXVwX2RldmljZShzdHJ1Y3QgdXNiX2RldmljZSAqcHVzYl9kZXZpY2UpCiB7CitpZiAoIXB1c2JfZGV2aWNlKQorCXJldHVybiAtRU5PREVWOwogcmV0dXJuIHVzYl9jb250cm9sX21zZyhwdXNiX2RldmljZSwgdXNiX3NuZGN0cmxwaXBlKHB1c2JfZGV2aWNlLCAwKSwgXAogCQkoX191OClVU0JfUkVRX1NFVF9GRUFUVVJFLCBcCiAJCShfX3U4KShVU0JfRElSX09VVCB8IFVTQl9UWVBFX1NUQU5EQVJEIHwgVVNCX1JFQ0lQX0RFVklDRSksIFwKQEAgLTgwNiw2ICsxMDAzLDEyIEBACiAJCShpbnQpNTAwMDApOwogfQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50CithdWRpb19zZXR1cChzdHJ1Y3QgZWFzeWNhcCAqcGVhc3ljYXApCit7CitzdHJ1Y3QgdXNiX2RldmljZSAqcHVzYl9kZXZpY2U7Cit1bnNpZ25lZCBjaGFyIGJ1ZmZlclsxXTsKK2ludCByYywgaWQxLCBpZDI7CiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKgogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElNUE9SVEFOVDoKQEAgLTgxNCwyOSArMTAxNywyMSBAQAogICogIFRPIEVOQUJMRSBBVURJTyAgVEhFIFZBTFVFIDB4MDIwMCBNVVNUIEJFIFNFTlQuCiAgKi8KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWludAotYXVkaW9fc2V0dXAoc3RydWN0IGVhc3ljYXAgKnBlYXN5Y2FwKQotewotc3RydWN0IHVzYl9kZXZpY2UgKnB1c2JfZGV2aWNlOwotc3RhdGljIF9fdTggcmVxdWVzdCA9IDB4MDE7Ci1zdGF0aWMgX191OCByZXF1ZXN0dHlwZSA9IFwKK2NvbnN0IF9fdTggcmVxdWVzdCA9IDB4MDE7Citjb25zdCBfX3U4IHJlcXVlc3R0eXBlID0gXAogCQkoX191OCkoVVNCX0RJUl9PVVQgfCBVU0JfVFlQRV9DTEFTUyB8IFVTQl9SRUNJUF9JTlRFUkZBQ0UpOwotCi1zdGF0aWMgX191MTYgdmFsdWVfdW5tdXRlID0gMHgwMjAwOwotc3RhdGljIF9fdTE2IGluZGV4ID0gMHgwMzAxOwotCi1zdGF0aWMgdW5zaWduZWQgY2hhciBidWZmZXJbMV07Ci1zdGF0aWMgX191MTYgbGVuZ3RoID0gMTsKLWludCByYywgaWQxLCBpZDI7Citjb25zdCBfX3UxNiB2YWx1ZV91bm11dGUgPSAweDAyMDA7Citjb25zdCBfX3UxNiBpbmRleCA9IDB4MDMwMTsKK2NvbnN0IF9fdTE2IGxlbmd0aCA9IDE7CiAKIGlmIChOVUxMID09IHBlYXN5Y2FwKQogCXJldHVybiAtRUZBVUxUOwogCiBwdXNiX2RldmljZSA9IHBlYXN5Y2FwLT5wdXNiX2RldmljZTsKIGlmIChOVUxMID09IHB1c2JfZGV2aWNlKQotCXJldHVybiAtRUZBVUxUOworCXJldHVybiAtRU5PREVWOwogCi1KT1QoOCwgIiUwMlggJTAyWCAlMDJYICUwMlggJTAyWCAlMDJYICUwMlggJTAyWFxuIiwJXAorSk9NKDgsICIlMDJYICUwMlggJTAyWCAlMDJYICUwMlggJTAyWCAlMDJYICUwMlhcbiIsCVwKIAkJCXJlcXVlc3R0eXBlLCByZXF1ZXN0LAkJXAogCQkJKDB4MDBGRiAmIHZhbHVlX3VubXV0ZSksCVwKIAkJCSgweEZGMDAgJiB2YWx1ZV91bm11dGUpID4+IDgsCVwKQEAgLTg3NSw0MSArMTA3MCwyNSBAQAogICogICAgICAgICAgICAgICAgICAgIFRIRSBVUFBFUiBCWVRFIFNFRU1TIFRPIEhBVkUgTk8gRUZGRUNULgogICovCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQogU0VUKHB1c2JfZGV2aWNlLCAweDA1MDAsIDB4MDA5NCk7Ci0KIFNFVChwdXNiX2RldmljZSwgMHgwNTAwLCAweDAwOEMpOwotCiBTRVQocHVzYl9kZXZpY2UsIDB4MDUwNiwgMHgwMDAxKTsKIFNFVChwdXNiX2RldmljZSwgMHgwNTA3LCAweDAwMDApOwotCiBpZDEgPSByZWFkX3Z0KHB1c2JfZGV2aWNlLCAweDAwN0MpOwogaWQyID0gcmVhZF92dChwdXNiX2RldmljZSwgMHgwMDdFKTsKLVNBWSgiMHglMDRYOjB4JTA0WCBpcyBhdWRpbyB2ZW5kb3IgaWRcbiIsIGlkMSwgaWQyKTsKLQorU0FNKCIweCUwNFg6MHglMDRYIGlzIGF1ZGlvIHZlbmRvciBpZFxuIiwgaWQxLCBpZDIpOwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyoKLSogICBTRUxFQ1QgQVVESU8gU09VUkNFICJMSU5FIElOIiBBTkQgU0VUIERFRkFVTFQgR0FJTiBUTyAwIGRCLgotKgotKiAgIFRIRVNFIENPTU1BTkRTIFNFRU0gVE8gQkUgQUNDRVBURUQgKFRIT1VHSCBQT1NTSUJMWSBJR05PUkVEKSBFVkVOIFdIRU4KLSogICBUSEVSRSBJUyBOTyBTRVBBUkFURSBBVURJTyBDSElQIFBSRVNFTlQuCisgKiAgU0VMRUNUIEFVRElPIFNPVVJDRSAiTElORSBJTiIgQU5EIFNFVCBUSEUgQVVESU8gR0FJTi4KICovCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXdyaXRlX3Z0KHB1c2JfZGV2aWNlLCAweDAwMDIsIDB4ODAwMCk7Ci13cml0ZV92dChwdXNiX2RldmljZSwgMHgwMDFDLCAweDgwMDApOwotCi13cml0ZV92dChwdXNiX2RldmljZSwgMHgwMDBFLCAweDAwMDApOwotd3JpdGVfdnQocHVzYl9kZXZpY2UsIDB4MDAxMCwgMHgwMDAwKTsKLXdyaXRlX3Z0KHB1c2JfZGV2aWNlLCAweDAwMTIsIDB4ODAwMCk7Ci13cml0ZV92dChwdXNiX2RldmljZSwgMHgwMDE2LCAweDAwMDApOwotCi13cml0ZV92dChwdXNiX2RldmljZSwgMHgwMDFBLCAweDA0MDQpOwotd3JpdGVfdnQocHVzYl9kZXZpY2UsIDB4MDAwMiwgMHgwMDAwKTsKLXdyaXRlX3Z0KHB1c2JfZGV2aWNlLCAweDAwMUMsIDB4MDAwMCk7Ci0KK2lmICgzMSA8IGVhc3ljYXBfZ2FpbikKKwllYXN5Y2FwX2dhaW4gPSAzMTsKK2lmICgwID4gZWFzeWNhcF9nYWluKQorCWVhc3ljYXBfZ2FpbiA9IDA7CitpZiAoMCAhPSBhdWRpb19nYWluc2V0KHB1c2JfZGV2aWNlLCAoX19zOCllYXN5Y2FwX2dhaW4pKQorCVNBWSgiRVJST1I6IGF1ZGlvX2dhaW5zZXQoKSBmYWlsZWRcbiIpOwogY2hlY2tfdnQocHVzYl9kZXZpY2UpOwotCiByZXR1cm4gMDsKIH0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTkxOCw2ICsxMDk3LDggQEAKIHsKIGludCBpZ290OwogCitpZiAoIXB1c2JfZGV2aWNlKQorCXJldHVybiAtRU5PREVWOwogaWdvdCA9IHJlYWRfdnQocHVzYl9kZXZpY2UsIDB4MDAwMik7CiBpZiAoMCA+IGlnb3QpCiAJU0FZKCJFUlJPUjogZmFpbGVkIHRvIHJlYWQgVlQxNjEyQSByZWdpc3RlciAweDAyXG4iKTsKQEAgLTk0MiwxNyArMTEyMywyMyBAQAogaWYgKDB4ODAwMCAmIGlnb3QpCiAJU0FZKCJyZWdpc3RlciAweCUwMlggbXV0ZWRcbiIsIDB4MTIpOwogCitpZ290ID0gcmVhZF92dChwdXNiX2RldmljZSwgMHgwMDE0KTsKK2lmICgwID4gaWdvdCkKKwlTQVkoIkVSUk9SOiBmYWlsZWQgdG8gcmVhZCBWVDE2MTJBIHJlZ2lzdGVyIDB4MTRcbiIpOworaWYgKDB4ODAwMCAmIGlnb3QpCisJU0FZKCJyZWdpc3RlciAweCUwMlggbXV0ZWRcbiIsIDB4MTQpOworCiBpZ290ID0gcmVhZF92dChwdXNiX2RldmljZSwgMHgwMDE2KTsKIGlmICgwID4gaWdvdCkKIAlTQVkoIkVSUk9SOiBmYWlsZWQgdG8gcmVhZCBWVDE2MTJBIHJlZ2lzdGVyIDB4MTZcbiIpOwogaWYgKDB4ODAwMCAmIGlnb3QpCiAJU0FZKCJyZWdpc3RlciAweCUwMlggbXV0ZWRcbiIsIDB4MTYpOwogCi1pZ290ID0gcmVhZF92dChwdXNiX2RldmljZSwgMHgwMDFBKTsKK2lnb3QgPSByZWFkX3Z0KHB1c2JfZGV2aWNlLCAweDAwMTgpOwogaWYgKDAgPiBpZ290KQotCVNBWSgiRVJST1I6IGZhaWxlZCB0byByZWFkIFZUMTYxMkEgcmVnaXN0ZXIgMHgxQVxuIik7CisJU0FZKCJFUlJPUjogZmFpbGVkIHRvIHJlYWQgVlQxNjEyQSByZWdpc3RlciAweDE4XG4iKTsKIGlmICgweDgwMDAgJiBpZ290KQotCVNBWSgicmVnaXN0ZXIgMHglMDJYIG11dGVkXG4iLCAweDFBKTsKKwlTQVkoInJlZ2lzdGVyIDB4JTAyWCBtdXRlZFxuIiwgMHgxOCk7CiAKIGlnb3QgPSByZWFkX3Z0KHB1c2JfZGV2aWNlLCAweDAwMUMpOwogaWYgKDAgPiBpZ290KQpAQCAtOTY0LDE0ICsxMTUxLDE4IEBACiB9CiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKgotICogIE5PVEU6ICBUSElTIERPRVMgSU5DUkVBU0UgVEhFIFZPTFVNRSBEUkFNQVRJQ0FMTFk6Ci0gKiAgICAgICAgIGF1ZGlvX2dhaW5zZXQocHVzYl9kZXZpY2UsIDB4MDAwRik7CisvKiAgTk9URTogIFRISVMgRE9FUyBJTkNSRUFTRSBUSEUgVk9MVU1FIERSQU1BVElDQUxMWToKKyAqICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2dhaW5zZXQocHVzYl9kZXZpY2UsIDB4MDAwRik7CiAgKgotICogIElGIDE2PGxvdWQ8MzEgVlQxNjIxQSBSRUdJU1RFUiAweDFDIElTIFNFVCBGT1IgUE9TSVRJVkUgR0FJTi4KLSAqICBJRiBsb3VkPD0xNiBWVDE2MjFBIFJFR0lTVEVSIDB4MUMgSVMgU0VUIEZPUiBaRVJPIEdBSU4uCi0gKiAgVEhFUkUgSVMgTkVWRVIgQU5ZIChBRERJVElPTkFMKSBBVFRFTlVBVElPTi4KLSAqLworICogICAgICAgbG91ZCAgICAgICAgZEIgIHJlZ2lzdGVyIDB4MTAgICAgICBkQiByZWdpc3RlciAweDFDICAgIGRCIHRvdGFsCisgKiAgICAgICAgIDAgICAgICAgICAgICAgICAtMzQuNSAgICAgICAgICAgICAgICAgICAwICAgICAgICAgICAgIC0zNC41CisgKiAgICAgICAgLi4gICAgICAgICAgICAgICAgLi4uLiAgICAgICAgICAgICAgICAgICAuICAgICAgICAgICAgICAuLi4uCisgKiAgICAgICAgMTUgICAgICAgICAgICAgICAgMTAuNSAgICAgICAgICAgICAgICAgICAwICAgICAgICAgICAgICAxMC41CisgKiAgICAgICAgMTYgICAgICAgICAgICAgICAgMTIuMCAgICAgICAgICAgICAgICAgICAwICAgICAgICAgICAgICAxMi4wCisgKiAgICAgICAgMTcgICAgICAgICAgICAgICAgMTIuMCAgICAgICAgICAgICAgICAgICAxLjUgICAgICAgICAgICAxMy41CisgKiAgICAgICAgLi4gICAgICAgICAgICAgICAgLi4uLiAgICAgICAgICAgICAgICAgIC4uLi4gICAgICAgICAgICAuLi4uCisgKiAgICAgICAgMzEgICAgICAgICAgICAgICAgMTIuMCAgICAgICAgICAgICAgICAgIDIyLjUgICAgICAgICAgICAzNC41CisqLwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogaW50CiBhdWRpb19nYWluc2V0KHN0cnVjdCB1c2JfZGV2aWNlICpwdXNiX2RldmljZSwgX19zOCBsb3VkKQpAQCAtOTgwLDI1ICsxMTcxLDY1IEBACiBfX3U4IHU4OwogX191MTYgbXV0ZTsKIAotaWYgKDE2ID4gbG91ZCkKLQlsb3VkID0gMTY7Ci11OCA9IDB4MDAwRiAmIChfX3U4KShsb3VkIC0gMTYpOworaWYgKE5VTEwgPT0gcHVzYl9kZXZpY2UpCisJcmV0dXJuIC1FTk9ERVY7CitpZiAoMCA+IGxvdWQpCisJbG91ZCA9IDA7CitpZiAoMzEgPCBsb3VkKQorCWxvdWQgPSAzMTsKIAogd3JpdGVfdnQocHVzYl9kZXZpY2UsIDB4MDAwMiwgMHg4MDAwKTsKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2lnb3QgPSByZWFkX3Z0KHB1c2JfZGV2aWNlLCAweDAwMEUpOworaWYgKDAgPiBpZ290KSB7CisJU0FZKCJFUlJPUjogZmFpbGVkIHRvIHJlYWQgVlQxNjEyQSByZWdpc3RlciAweDBFXG4iKTsKKwltdXRlID0gMHgwMDAwOworfSBlbHNlCisJbXV0ZSA9IDB4ODAwMCAmICgodW5zaWduZWQgaW50KWlnb3QpOworbXV0ZSA9IDA7CiAKK2lmICgxNiA+IGxvdWQpCisJdTggPSAweDAxIHwgKDB4MDAxRiAmICgoKF9fdTgpKDE1IC0gbG91ZCkpIDw8IDEpKTsKK2Vsc2UKKwl1OCA9IDA7CisKK0pPVCg4LCAiMHglMDRYPShtdXRlfHU4KSBmb3IgVlQxNjEyQSByZWdpc3RlciAweDBFXG4iLCBtdXRlIHwgdTgpOword3JpdGVfdnQocHVzYl9kZXZpY2UsIDB4MDAwRSwgKG11dGUgfCB1OCkpOworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworaWdvdCA9IHJlYWRfdnQocHVzYl9kZXZpY2UsIDB4MDAxMCk7CitpZiAoMCA+IGlnb3QpIHsKKwlTQVkoIkVSUk9SOiBmYWlsZWQgdG8gcmVhZCBWVDE2MTJBIHJlZ2lzdGVyIDB4MTBcbiIpOworCW11dGUgPSAweDAwMDA7Cit9IGVsc2UKKwltdXRlID0gMHg4MDAwICYgKCh1bnNpZ25lZCBpbnQpaWdvdCk7CittdXRlID0gMDsKKworSk9UKDgsICIweCUwNFg9KG11dGV8dTh8KHU4PDw4KSkgZm9yIFZUMTYxMkEgcmVnaXN0ZXIgMHgxMCwuLi4weDE4XG4iLCBcCisJCQkJCQkJbXV0ZSB8IHU4IHwgKHU4IDw8IDgpKTsKK3dyaXRlX3Z0KHB1c2JfZGV2aWNlLCAweDAwMTAsIChtdXRlIHwgdTggfCAodTggPDwgOCkpKTsKK3dyaXRlX3Z0KHB1c2JfZGV2aWNlLCAweDAwMTIsIChtdXRlIHwgdTggfCAodTggPDwgOCkpKTsKK3dyaXRlX3Z0KHB1c2JfZGV2aWNlLCAweDAwMTQsIChtdXRlIHwgdTggfCAodTggPDwgOCkpKTsKK3dyaXRlX3Z0KHB1c2JfZGV2aWNlLCAweDAwMTYsIChtdXRlIHwgdTggfCAodTggPDwgOCkpKTsKK3dyaXRlX3Z0KHB1c2JfZGV2aWNlLCAweDAwMTgsIChtdXRlIHwgdTggfCAodTggPDwgOCkpKTsKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIGlnb3QgPSByZWFkX3Z0KHB1c2JfZGV2aWNlLCAweDAwMUMpOwogaWYgKDAgPiBpZ290KSB7CiAJU0FZKCJFUlJPUjogZmFpbGVkIHRvIHJlYWQgVlQxNjEyQSByZWdpc3RlciAweDFDXG4iKTsKIAltdXRlID0gMHgwMDAwOwogfSBlbHNlCiAJbXV0ZSA9IDB4ODAwMCAmICgodW5zaWduZWQgaW50KWlnb3QpOworbXV0ZSA9IDA7CiAKLUpPVCg4LCAiMHglMDRYPShtdXRlfHU4fCh1ODw8OCkpXG4iLCBtdXRlIHwgdTggfCAodTggPDwgOCkpOworaWYgKDE2IDw9IGxvdWQpCisJdTggPSAweDAwMEYgJiAoX191OCkobG91ZCAtIDE2KTsKK2Vsc2UKKwl1OCA9IDA7CiAKLXdyaXRlX3Z0KHB1c2JfZGV2aWNlLCAweDAwMUMsIDB4ODAwMCk7CitKT1QoOCwgIjB4JTA0WD0obXV0ZXx1OHwodTg8PDgpKSBmb3IgVlQxNjEyQSByZWdpc3RlciAweDFDXG4iLCBcCisJCQkJCQkJbXV0ZSB8IHU4IHwgKHU4IDw8IDgpKTsKIHdyaXRlX3Z0KHB1c2JfZGV2aWNlLCAweDAwMUMsIChtdXRlIHwgdTggfCAodTggPDwgOCkpKTsKK3dyaXRlX3Z0KHB1c2JfZGV2aWNlLCAweDAwMUEsIDB4MDQwNCk7CiB3cml0ZV92dChwdXNiX2RldmljZSwgMHgwMDAyLCAweDAwMDApOwotCiByZXR1cm4gMDsKIH0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTEwMDcsMzUgKzEyMzgsMTEgQEAKIHsKIGludCBpZ290OwogCitpZiAoTlVMTCA9PSBwdXNiX2RldmljZSkKKwlyZXR1cm4gLUVOT0RFVjsKIGlnb3QgPSByZWFkX3Z0KHB1c2JfZGV2aWNlLCAweDAwMUMpOwogaWYgKDAgPiBpZ290KQogCVNBWSgiRVJST1I6IGZhaWxlZCB0byByZWFkIFZUMTYxMkEgcmVnaXN0ZXIgMHgxQ1xuIik7CiByZXR1cm4gaWdvdDsKIH0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludAotc2V0MnRvNzgoc3RydWN0IHVzYl9kZXZpY2UgKnApCi17Ci1pbnQgaXI7Ci0KLW1zbGVlcCgyMCk7Ci1pciA9IHJlZ3NldChwLCAweDAwMDIsIDB4MDA3OCk7Ci1pZiAoMCA+IGlyKQotCVNBWSgiRVJST1I6IGZhaWxlZCB0byBzZXQgcmVnaXN0ZXIgMHgwMDAyIHRvIDB4MDA3OFxuIik7Ci1tc2xlZXAoMjApOwotcmV0dXJuIGlyOwotfQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50Ci1zZXQydG85MyhzdHJ1Y3QgdXNiX2RldmljZSAqcCkKLXsKLWludCBpcjsKLQotbXNsZWVwKDIwKTsKLWlyID0gcmVnc2V0KHAsIDB4MDAwMiwgMHgwMDkzKTsKLWlmICgwID4gaXIpCi0JU0FZKCJFUlJPUjogZmFpbGVkIHRvIHNldCByZWdpc3RlciAweDAwMDIgdG8gMHgwMDc4XG4iKTsKLW1zbGVlcCgyMCk7Ci1yZXR1cm4gaXI7Ci19Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZWFzeWNhcC9lYXN5Y2FwX21haW4uYyBiL2RyaXZlcnMvc3RhZ2luZy9lYXN5Y2FwL2Vhc3ljYXBfbWFpbi5jCmluZGV4IDVhNGJiZDkuLmFjYzFmNTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9lYXN5Y2FwL2Vhc3ljYXBfbWFpbi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lYXN5Y2FwL2Vhc3ljYXBfbWFpbi5jCkBAIC0zMCw5ICszMCwyOSBAQAogCiAjaW5jbHVkZSAiZWFzeWNhcC5oIgogI2luY2x1ZGUgImVhc3ljYXBfc3RhbmRhcmQuaCIKKyNpbmNsdWRlICJlYXN5Y2FwX2lvY3RsLmgiCiAKLWludCBlYXN5Y2FwX2RlYnVnOwotbW9kdWxlX3BhcmFtKGVhc3ljYXBfZGVidWcsIGludCwgU19JUlVHTyB8IFNfSVdVU1IpOworc3RhdGljIGludCBlYXN5Y2FwX2RlYnVnOworc3RhdGljIGludCBlYXN5Y2FwX2JhcnM7CitpbnQgZWFzeWNhcF9nYWluID0gMTY7Cittb2R1bGVfcGFyYW1fbmFtZWQoZGVidWcsIGVhc3ljYXBfZGVidWcsIGludCwgU19JUlVHTyB8IFNfSVdVU1IpOworbW9kdWxlX3BhcmFtX25hbWVkKGJhcnMsIGVhc3ljYXBfYmFycywgaW50LCBTX0lSVUdPIHwgU19JV1VTUik7Cittb2R1bGVfcGFyYW1fbmFtZWQoZ2FpbiwgZWFzeWNhcF9nYWluLCBpbnQsIFNfSVJVR08gfCBTX0lXVVNSKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqICBkb25nbGVfdGhpcyBJUyBJTkRJU1BFTlNJQkxZIHN0YXRpYyBCRUNBVVNFIEZVTkNUSU9OIGVhc3ljYXBfdXNiX3Byb2JlKCkKKyAqICBJUyBDQUxMRUQgU1VDQ0VTU0lWRUxZIEZPUiBJTlRFUkZBQ0VTIDAsIDEsIDIgQU5EIFRIRSBQT0lOVEVSIHBlYXN5Y2FwCisgKiAgQUxMT0NBVEVEIERVUklORyBUSEUgUFJPQklORyBPRiBJTlRFUkZBQ0UgMCBNVVNUIEJFIFJFTUVNQkVSRUQgV0hFTgorICogIFBST0JJTkcgSU5URVJGQUNFUyAxIEFORCAyLgorICoKKyAqICBJT0NUTCBMT0NLSU5HIElTIERPTkUgQVQgTU9EVUxFIExFVkVMLCBOT1QgREVWSUNFIExFVkVMLgorKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RydWN0IGVhc3ljYXBfZG9uZ2xlIGVhc3ljYXBfZG9uZ2xlW0RPTkdMRV9NQU5ZXTsKK3N0YXRpYyBpbnQgZG9uZ2xlX3RoaXM7CitzdGF0aWMgaW50IGRvbmdsZV9kb25lOwogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKgpAQCAtNjMsMjIgKzgzLDI1IEBACiAJLm93bmVyCQk9IFRISVNfTU9EVUxFLAogCS5vcGVuCQk9IGVhc3ljYXBfb3BlbiwKIAkucmVsZWFzZQk9IGVhc3ljYXBfcmVsZWFzZSwKLQkudW5sb2NrZWRfaW9jdGwJPSBlYXN5Y2FwX2lvY3RsLAorI2lmIGRlZmluZWQoRUFTWUNBUF9ORUVEU19VTkxPQ0tFRF9JT0NUTCkKKwkudW5sb2NrZWRfaW9jdGwJPSBlYXN5Y2FwX2lvY3RsX25vaW5vZGUsCisjZWxzZQorCS5pb2N0bAkJPSBlYXN5Y2FwX2lvY3RsLAorI2VuZGlmIC8qRUFTWUNBUF9ORUVEU19VTkxPQ0tFRF9JT0NUTCovCiAJLnBvbGwJCT0gZWFzeWNhcF9wb2xsLAogCS5tbWFwCQk9IGVhc3ljYXBfbW1hcCwKIAkubGxzZWVrCQk9IG5vX2xsc2VlaywKIH07CiBzdHJ1Y3Qgdm1fb3BlcmF0aW9uc19zdHJ1Y3QgZWFzeWNhcF92bV9vcHMgPSB7Ci0ub3BlbiAgPSBlYXN5Y2FwX3ZtYV9vcGVuLAotLmNsb3NlID0gZWFzeWNhcF92bWFfY2xvc2UsCi0uZmF1bHQgPSBlYXN5Y2FwX3ZtYV9mYXVsdCwKKwkub3BlbiAgPSBlYXN5Y2FwX3ZtYV9vcGVuLAorCS5jbG9zZSA9IGVhc3ljYXBfdm1hX2Nsb3NlLAorCS5mYXVsdCA9IGVhc3ljYXBfdm1hX2ZhdWx0LAogfTsKIHN0cnVjdCB1c2JfY2xhc3NfZHJpdmVyIGVhc3ljYXBfY2xhc3MgPSB7Ci0ubmFtZSA9ICJ1c2IvZWFzeWNhcCVkIiwKLS5mb3BzID0gJmVhc3ljYXBfZm9wcywKLS5taW5vcl9iYXNlID0gVVNCX1NLRUxfTUlOT1JfQkFTRSwKKwkubmFtZSA9ICJ1c2IvZWFzeWNhcCVkIiwKKwkuZm9wcyA9ICZlYXN5Y2FwX2ZvcHMsCisJLm1pbm9yX2Jhc2UgPSBVU0JfU0tFTF9NSU5PUl9CQVNFLAogfTsKLQogLyp2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2diovCiAjaWYgZGVmaW5lZChFQVNZQ0FQX0lTX1ZJREVPREVWX0NMSUVOVCkKICNpZiBkZWZpbmVkKEVBU1lDQVBfTkVFRFNfVjRMMl9GT1BTKQpAQCAtODYsMTYgKzEwOSwxNyBAQAogCS5vd25lcgkJPSBUSElTX01PRFVMRSwKIAkub3BlbgkJPSBlYXN5Y2FwX29wZW5fbm9pbm9kZSwKIAkucmVsZWFzZQk9IGVhc3ljYXBfcmVsZWFzZV9ub2lub2RlLAotCS51bmxvY2tlZF9pb2N0bAk9IGVhc3ljYXBfaW9jdGwsCisjaWYgZGVmaW5lZChFQVNZQ0FQX05FRURTX1VOTE9DS0VEX0lPQ1RMKQorCS51bmxvY2tlZF9pb2N0bAk9IGVhc3ljYXBfaW9jdGxfbm9pbm9kZSwKKyNlbHNlCisJLmlvY3RsCQk9IGVhc3ljYXBfaW9jdGwsCisjZW5kaWYgLypFQVNZQ0FQX05FRURTX1VOTE9DS0VEX0lPQ1RMKi8KIAkucG9sbAkJPSBlYXN5Y2FwX3BvbGwsCiAJLm1tYXAJCT0gZWFzeWNhcF9tbWFwLAogfTsKICNlbmRpZiAvKkVBU1lDQVBfTkVFRFNfVjRMMl9GT1BTKi8KLWludCB2aWRlb19kZXZpY2VfbWFueSAvKj0wKi87Ci1zdHJ1Y3QgdmlkZW9fZGV2aWNlICpwdmlkZW9fYXJyYXlbVklERU9fREVWSUNFX01BTlldLCAqcHZpZGVvX2RldmljZTsKICNlbmRpZiAvKkVBU1lDQVBfSVNfVklERU9ERVZfQ0xJRU5UKi8KIC8qXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl4qLwotCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8qCiAgKiAgUEFSQU1FVEVSUyBVU0VEIFdIRU4gUkVHSVNURVJJTkcgVEhFIEFVRElPIElOVEVSRkFDRQpAQCAtMTA1LDcgKzEyOSwxMSBAQAogCS5vd25lcgkJPSBUSElTX01PRFVMRSwKIAkub3BlbgkJPSBlYXN5c25kX29wZW4sCiAJLnJlbGVhc2UJPSBlYXN5c25kX3JlbGVhc2UsCi0JLnVubG9ja2VkX2lvY3RsCT0gZWFzeXNuZF9pb2N0bCwKKyNpZiBkZWZpbmVkKEVBU1lDQVBfTkVFRFNfVU5MT0NLRURfSU9DVEwpCisJLnVubG9ja2VkX2lvY3RsCT0gZWFzeXNuZF9pb2N0bF9ub2lub2RlLAorI2Vsc2UKKwkuaW9jdGwJCT0gZWFzeXNuZF9pb2N0bCwKKyNlbmRpZiAvKkVBU1lDQVBfTkVFRFNfVU5MT0NLRURfSU9DVEwqLwogCS5yZWFkCQk9IGVhc3lzbmRfcmVhZCwKIAkubGxzZWVrCQk9IG5vX2xsc2VlaywKIH07CkBAIC0xMTUsMTcgKzE0MywyNiBAQAogLm1pbm9yX2Jhc2UgPSBVU0JfU0tFTF9NSU5PUl9CQVNFLAogfTsKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKgotICogIElUIElTIE5PVCBBUFBST1BSSUFURSBGT1IgZWFzeWNhcF9vcGVuKCkgVE8gU1VCTUlUIFRIRSBWSURFTyBVUkJTIEhFUkUsCi0gKiAgQkVDQVVTRSBUSEVSRSBXSUxMIEFMV0FZUyBCRSBTVUJTRVFVRU5UIE5FR09USUFUSU9OIE9GIFRWIFNUQU5EQVJEIEFORAotICogIEZPUk1BVCBCWSBJT0NUTCBBTkQgSVQgSVMgSU5BRFZJU0FCTEUgVE8gSEFWRSBUSEUgVVJCUyBSVU5OSU5HIFdISUxFCi0gKiAgUkVHSVNURVJTIE9GIFRIRSBTQTcxMTNIIEFSRSBCRUlORyBNQU5JUFVMQVRFRC4KLSAqCi0gKiAgVEhFIFNVQk1JU1NJT04gT0YgVklERU8gVVJCUyBJUyBUSEVSRUZPUkUgREVMQVlFRCBVTlRJTCBUSEUgSU9DVEwgQ09NTUFORAotICogIFNUUkVBTU9OIElTIFJFQ0VJVkVELgotICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAqICBUSElTIFJPVVRJTkUgRE9FUyBOT1QgREVURUNUIERVUExJQ0FURSBPQ0NVUlJFTkNFUyBPRiBQT0lOVEVSIHBlYXN5Y2FwCisqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworaW50Citpc2RvbmdsZShzdHJ1Y3QgZWFzeWNhcCAqcGVhc3ljYXApCit7CitpbnQgazsKK2lmIChOVUxMID09IHBlYXN5Y2FwKQorCXJldHVybiAtMjsKK2ZvciAoayA9IDA7IGsgPCBET05HTEVfTUFOWTsgaysrKSB7CisJaWYgKGVhc3ljYXBfZG9uZ2xlW2tdLnBlYXN5Y2FwID09IHBlYXN5Y2FwKSB7CisJCXBlYXN5Y2FwLT5pc2RvbmdsZSA9IGs7CisJCXJldHVybiBrOworCX0KK30KK3JldHVybiAtMTsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qdnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnYqLwogI2lmIGRlZmluZWQoRUFTWUNBUF9JU19WSURFT0RFVl9DTElFTlQpCiBpbnQKQEAgLTE0MCwxNSArMTc3LDE3IEBACiB7CiAjaWYgKCFkZWZpbmVkKEVBU1lDQVBfSVNfVklERU9ERVZfQ0xJRU5UKSkKIHN0cnVjdCB1c2JfaW50ZXJmYWNlICpwdXNiX2ludGVyZmFjZTsKKyNlbHNlCitzdHJ1Y3QgdmlkZW9fZGV2aWNlICpwdmlkZW9fZGV2aWNlOwogI2VuZGlmIC8qRUFTWUNBUF9JU19WSURFT0RFVl9DTElFTlQqLwotc3RydWN0IHVzYl9kZXZpY2UgKnA7CiBzdHJ1Y3QgZWFzeWNhcCAqcGVhc3ljYXA7Ci1pbnQgaSwgaywgbSwgcmM7CitpbnQgcmM7CiAKIEpPVCg0LCAiXG4iKTsKIFNBWSgiPT09PT09PT09PU9QRU49PT09PT09PT1cbiIpOwogCiBwZWFzeWNhcCA9IChzdHJ1Y3QgZWFzeWNhcCAqKU5VTEw7CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAjaWYgKCFkZWZpbmVkKEVBU1lDQVBfSVNfVklERU9ERVZfQ0xJRU5UKSkKIGlmICgoc3RydWN0IGlub2RlICopTlVMTCA9PSBpbm9kZSkgewogCVNBWSgiRVJST1I6IGlub2RlIGlzIE5VTEwuXG4iKTsKQEAgLTE2MiwxNjEgKzIwMSw0MjcgQEAKIHBlYXN5Y2FwID0gdXNiX2dldF9pbnRmZGF0YShwdXNiX2ludGVyZmFjZSk7CiAvKnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2Ki8KICNlbHNlCi1mb3IgKGkgPSAwOyAgaSA8IHZpZGVvX2RldmljZV9tYW55OyAgaSsrKSB7Ci0JcHZpZGVvX2RldmljZSA9IHB2aWRlb19hcnJheVtpXTsKLQlpZiAoKHN0cnVjdCB2aWRlb19kZXZpY2UgKilOVUxMICE9IHB2aWRlb19kZXZpY2UpIHsKLQkJcGVhc3ljYXAgPSAoc3RydWN0IGVhc3ljYXAgKil2aWRlb19nZXRfZHJ2ZGF0YShwdmlkZW9fZGV2aWNlKTsKLQkJYnJlYWs7Ci0JfQotfQotLypeXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXiovCi0jZW5kaWYgLypFQVNZQ0FQX0lTX1ZJREVPREVWX0NMSUVOVCovCi1pZiAoKHN0cnVjdCBlYXN5Y2FwICopTlVMTCA9PSBwZWFzeWNhcCkgewotCVNBWSgiTUlTVEFLRTogcGVhc3ljYXAgaXMgTlVMTFxuIik7CitwdmlkZW9fZGV2aWNlID0gdmlkZW9fZGV2ZGF0YShmaWxlKTsKK2lmICgoc3RydWN0IHZpZGVvX2RldmljZSAqKU5VTEwgPT0gcHZpZGVvX2RldmljZSkgeworCVNBWSgiRVJST1I6IHB2aWRlb19kZXZpY2UgaXMgTlVMTC5cbiIpOwogCXJldHVybiAtRUZBVUxUOwogfQotZmlsZS0+cHJpdmF0ZV9kYXRhID0gcGVhc3ljYXA7Ci0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKgotICogIElOSVRJQUxJWkFUSU9OCi0gKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLUpPVCg0LCAic3RhcnRpbmcgaW5pdGlhbGl6YXRpb25cbiIpOwotCi1mb3IgKGsgPSAwOyAgayA8IEZSQU1FX0JVRkZFUl9NQU5ZOyAgaysrKSB7Ci0JZm9yIChtID0gMDsgIG0gPCBGUkFNRV9CVUZGRVJfU0laRS9QQUdFX1NJWkU7ICBtKyspCi0JCW1lbXNldChwZWFzeWNhcC0+ZnJhbWVfYnVmZmVyW2tdW21dLnBnbywgMCwgUEFHRV9TSVpFKTsKK3BlYXN5Y2FwID0gKHN0cnVjdCBlYXN5Y2FwICopdmlkZW9fZ2V0X2RydmRhdGEocHZpZGVvX2RldmljZSk7CisjZW5kaWYgLypFQVNZQ0FQX0lTX1ZJREVPREVWX0NMSUVOVCovCisvKl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eKi8KK2lmIChOVUxMID09IHBlYXN5Y2FwKSB7CisJU0FZKCJFUlJPUjogcGVhc3ljYXAgaXMgTlVMTFxuIik7CisJcmV0dXJuIC1FRkFVTFQ7CiB9Ci1wID0gcGVhc3ljYXAtPnB1c2JfZGV2aWNlOwotaWYgKChzdHJ1Y3QgdXNiX2RldmljZSAqKU5VTEwgPT0gcCkgewotCVNBWSgiRVJST1I6IHBlYXN5Y2FwLT5wdXNiX2RldmljZSBpcyBOVUxMXG4iKTsKK2lmIChtZW1jbXAoJnBlYXN5Y2FwLT50ZWxsdGFsZVswXSwgVEVMTFRBTEUsIHN0cmxlbihURUxMVEFMRSkpKSB7CisJU0FZKCJFUlJPUjogYmFkIHBlYXN5Y2FwOiAweCUwOGxYXG4iLCAodW5zaWduZWQgbG9uZyBpbnQpIHBlYXN5Y2FwKTsKKwlyZXR1cm4gLUVGQVVMVDsKK30KK2lmIChOVUxMID09IHBlYXN5Y2FwLT5wdXNiX2RldmljZSkgeworCVNBTSgiRVJST1I6IHBlYXN5Y2FwLT5wdXNiX2RldmljZSBpcyBOVUxMXG4iKTsKIAlyZXR1cm4gLUVGQVVMVDsKIH0gZWxzZSB7Ci0JSk9UKDE2LCAiMHglMDhsWD1wZWFzeWNhcC0+cHVzYl9kZXZpY2VcbiIsIFwKKwlKT00oMTYsICIweCUwOGxYPXBlYXN5Y2FwLT5wdXNiX2RldmljZVxuIiwgXAogCQkJCQkobG9uZyBpbnQpcGVhc3ljYXAtPnB1c2JfZGV2aWNlKTsKIH0KK2ZpbGUtPnByaXZhdGVfZGF0YSA9IHBlYXN5Y2FwOwogcmMgPSB3YWtldXBfZGV2aWNlKHBlYXN5Y2FwLT5wdXNiX2RldmljZSk7CiBpZiAoMCA9PSByYykKLQlKT1QoOCwgIndha2V1cF9kZXZpY2UoKSBPS1xuIik7CisJSk9NKDgsICJ3YWtldXBfZGV2aWNlKCkgT0tcbiIpOwogZWxzZSB7Ci0JU0FZKCJFUlJPUjogd2FrZXVwX2RldmljZSgpIHJldHVybmVkICVpXG4iLCByYyk7CisJU0FNKCJFUlJPUjogd2FrZXVwX2RldmljZSgpIHJldHVybmVkICVpXG4iLCByYyk7CisJaWYgKC1FTk9ERVYgPT0gcmMpCisJCVNBTSgiRVJST1I6IHdha2V1cF9kZXZpY2UoKSByZXR1cm5lZCAtRU5PREVWXG4iKTsKKwllbHNlCisJCVNBTSgiRVJST1I6IHdha2V1cF9kZXZpY2UoKSByZXR1cm5lZCAlaVxuIiwgcmMpOworCXJldHVybiByYzsKK30KK3BlYXN5Y2FwLT5pbnB1dCA9IDA7CityYyA9IHJlc2V0KHBlYXN5Y2FwKTsKK2lmICgwICE9IHJjKSB7CisJU0FNKCJFUlJPUjogcmVzZXQoKSByZXR1cm5lZCAlaVxuIiwgcmMpOwogCXJldHVybiAtRUZBVUxUOwogfQotcmMgPSBzZXR1cF9zdGsocCk7ICBwZWFzeWNhcC0+aW5wdXQgPSAwOwotaWYgKDAgPT0gcmMpCi0JSk9UKDgsICJzZXR1cF9zdGsoKSBPS1xuIik7Ci1lbHNlIHsKLQlTQVkoIkVSUk9SOiBzZXR1cF9zdGsoKSByZXR1cm5lZCAlaVxuIiwgcmMpOwotCXJldHVybiAtRUZBVUxUOworcmV0dXJuIDA7CiB9Ci1yYyA9IHNldHVwX3NhYShwKTsKLWlmICgwID09IHJjKQotCUpPVCg4LCAic2V0dXBfc2FhKCkgT0tcbiIpOwotZWxzZSB7Ci0JU0FZKCJFUlJPUjogc2V0dXBfc2FhKCkgcmV0dXJuZWQgJWlcbiIsIHJjKTsKLQlyZXR1cm4gLUVGQVVMVDsKLX0KLXJjID0gY2hlY2tfc2FhKHApOwotaWYgKDAgPT0gcmMpCi0JSk9UKDgsICJjaGVja19zYWEoKSBPS1xuIik7Ci1lbHNlIGlmICgtOCA8IHJjKQotCVNBWSgiY2hlY2tfc2FhKCkgcmV0dXJuZWQgJWlcbiIsIHJjKTsKLWVsc2UgewotCVNBWSgiRVJST1I6IGNoZWNrX3NhYSgpIHJldHVybmVkICVpXG4iLCByYyk7Ci0JcmV0dXJuIC1FRkFVTFQ7Ci19Ci1wZWFzeWNhcC0+c3RhbmRhcmRfb2Zmc2V0ID0gLTE7CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jaWYgZGVmaW5lZChQUkVGRVJfTlRTQykKLQotcmMgPSBhZGp1c3Rfc3RhbmRhcmQocGVhc3ljYXAsIFY0TDJfU1REX05UU0NfTSk7Ci1pZiAoMCA9PSByYykKLQlKT1QoOCwgImFkanVzdF9zdGFuZGFyZCguLE5UU0NfTSkgT0tcbiIpOwotZWxzZSB7Ci0JU0FZKCJFUlJPUjogYWRqdXN0X3N0YW5kYXJkKC4sTlRTQ19NKSByZXR1cm5lZCAlaVxuIiwgcmMpOwotCXJldHVybiAtRUZBVUxUOwotfQotcmMgPSBhZGp1c3RfZm9ybWF0KHBlYXN5Y2FwLCA2NDAsIDQ4MCwgVjRMMl9QSVhfRk1UX1VZVlksIFY0TDJfRklFTERfTk9ORSwgXAotCQkJCQkJCQkJZmFsc2UpOwotaWYgKDAgPD0gcmMpCi0JSk9UKDgsICJhZGp1c3RfZm9ybWF0KC4sNjQwLDQ4MCxVWVZZKSBPS1xuIik7Ci1lbHNlIHsKLQlTQVkoIkVSUk9SOiBhZGp1c3RfZm9ybWF0KC4sNjQwLDQ4MCxVWVZZKSByZXR1cm5lZCAlaVxuIiwgcmMpOwotCXJldHVybiAtRUZBVUxUOwotfQotCi0jZWxzZQotCi1yYyA9IGFkanVzdF9zdGFuZGFyZChwZWFzeWNhcCwgXAotCQkoVjRMMl9TVERfUEFMX0IgfCBWNEwyX1NURF9QQUxfRyB8IFY0TDJfU1REX1BBTF9IIHwgXAotCQlWNEwyX1NURF9QQUxfSSB8IFY0TDJfU1REX1BBTF9OKSk7Ci1pZiAoMCA9PSByYykKLQlKT1QoOCwgImFkanVzdF9zdGFuZGFyZCguLFBBTF9CR0hJTikgT0tcbiIpOwotZWxzZSB7Ci0JU0FZKCJFUlJPUjogYWRqdXN0X3N0YW5kYXJkKC4sUEFMX0JHSElOKSByZXR1cm5lZCAlaVxuIiwgcmMpOwotCXJldHVybiAtRUZBVUxUOwotfQotcmMgPSBhZGp1c3RfZm9ybWF0KHBlYXN5Y2FwLCA2NDAsIDQ4MCwgVjRMMl9QSVhfRk1UX1VZVlksIFY0TDJfRklFTERfTk9ORSwgXAotCQkJCQkJCQkJZmFsc2UpOwotaWYgKDAgPD0gcmMpCi0JSk9UKDgsICJhZGp1c3RfZm9ybWF0KC4sNjQwLDQ4MCx1eXZ5LGZhbHNlKSBPS1xuIik7Ci1lbHNlIHsKLQlTQVkoIkVSUk9SOiBhZGp1c3RfZm9ybWF0KC4sNjQwLDQ4MCx1eXZ5LGZhbHNlKSByZXR1cm5lZCAlaVxuIiwgcmMpOwotCXJldHVybiAtRUZBVUxUOwotfQotCi0jZW5kaWYgLyogIVBSRUZFUl9OVFNDKi8KKy8qCisgKiAgUkVTRVQgVEhFIEhBUkRXQVJFIFRPIElUUyBSRUZFUkVOQ0UgU1RBVEUuCisgKgorICogIFRISVMgUk9VVElORSBNQVkgQkUgQ0FMTEVEIFJFUEVBVEVETFkgSUYgZWFzeWNhcF9jb21wbGV0ZSgpIERFVEVDVFMKKyAqICBBIEJBRCBWSURFTyBGUkFNRSBTSVpFLgorKi8KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXJjID0gYWRqdXN0X2JyaWdodG5lc3MocGVhc3ljYXAsIC04MTkyKTsKLWlmICgwICE9IHJjKSB7Ci0JU0FZKCJFUlJPUjogYWRqdXN0X2JyaWdodG5lc3MoZGVmYXVsdCkgcmV0dXJuZWQgJWlcbiIsIHJjKTsKK2ludAorcmVzZXQoc3RydWN0IGVhc3ljYXAgKnBlYXN5Y2FwKQoreworc3RydWN0IGVhc3ljYXBfc3RhbmRhcmQgY29uc3QgKnBlYXN5Y2FwX3N0YW5kYXJkOworaW50IGksIHJjLCBpbnB1dCwgcmF0ZTsKK2Jvb2wgbnRzYywgb3RoZXI7CisKK2lmIChOVUxMID09IHBlYXN5Y2FwKSB7CisJU0FZKCJFUlJPUjogcGVhc3ljYXAgaXMgTlVMTFxuIik7CiAJcmV0dXJuIC1FRkFVTFQ7CiB9Ci1yYyA9IGFkanVzdF9jb250cmFzdChwZWFzeWNhcCwgLTgxOTIpOwotaWYgKDAgIT0gcmMpIHsKLQlTQVkoIkVSUk9SOiBhZGp1c3RfY29udHJhc3QoZGVmYXVsdCkgcmV0dXJuZWQgJWlcbiIsIHJjKTsKLQlyZXR1cm4gLUVGQVVMVDsKLX0KLXJjID0gYWRqdXN0X3NhdHVyYXRpb24ocGVhc3ljYXAsIC04MTkyKTsKLWlmICgwICE9IHJjKSB7Ci0JU0FZKCJFUlJPUjogYWRqdXN0X3NhdHVyYXRpb24oZGVmYXVsdCkgcmV0dXJuZWQgJWlcbiIsIHJjKTsKLQlyZXR1cm4gLUVGQVVMVDsKLX0KLXJjID0gYWRqdXN0X2h1ZShwZWFzeWNhcCwgLTgxOTIpOwotaWYgKDAgIT0gcmMpIHsKLQlTQVkoIkVSUk9SOiBhZGp1c3RfaHVlKGRlZmF1bHQpIHJldHVybmVkICVpXG4iLCByYyk7Ci0JcmV0dXJuIC1FRkFVTFQ7Ci19CitpbnB1dCA9IHBlYXN5Y2FwLT5pbnB1dDsKKwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotcmMgPSB1c2Jfc2V0X2ludGVyZmFjZShwZWFzeWNhcC0+cHVzYl9kZXZpY2UsIHBlYXN5Y2FwLT52aWRlb19pbnRlcmZhY2UsIFwKLQkJCQkJCXBlYXN5Y2FwLT52aWRlb19hbHRzZXR0aW5nX29uKTsKKy8qCisgKiAgSUYgVEhFIFNBQTcxMTNIIEhBUyBBTFJFQURZIEFDUVVJUkVEIFNZTkMsIFVTRSBJVFMgSEFSRFdBUkUtREVURUNURUQKKyAqICBGSUVMRCBGUkVRVUVOQ1kgVE8gRElTVElOR1VJU0ggTlRTQyBGUk9NIFBBTC4gIFRISVMgSVMgRVNTRU5USUFMIEZPUgorICogIGdzdHJlYW1lciBBTkQgT1RIRVIgVVNFUlNQQUNFIFBST0dSQU1TIFdISUNIIE1BWSBOT1QgQVRURU1QVCBUTyBJTklUSUFURQorICogIEEgU1dJVENIIEJFVFdFRU4gUEFMIEFORCBOVFNDLgorICoKKyAqICBGVU5DVElPTiByZWFkeV9zYWEoKSBNQVkgUkVRVUlSRSBBIFNVQlNUQU5USUFMIEZSQUNUSU9OIE9GIEEgU0VDT05EIFRPCisgKiAgQ09NUExFVEUsIFNPIFNIT1VMRCBOT1QgQkUgSU5WT0tFRCBXSVRIT1VUIEdPT0QgUkVBU09OLgorKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK290aGVyID0gZmFsc2U7CitpZiAodHJ1ZSA9PSBwZWFzeWNhcC0+bnRzYykKKwlKT00oOCwgInRydWU9cGVhc3ljYXAtPm50c2NcbiIpOworZWxzZQorCUpPTSg4LCAiZmFsc2U9cGVhc3ljYXAtPm50c2NcbiIpOworcmF0ZSA9IHJlYWR5X3NhYShwZWFzeWNhcC0+cHVzYl9kZXZpY2UpOworaWYgKDAgPiByYXRlKSB7CisJSk9NKDgsICJub3QgcmVhZHkgdG8gY2FwdHVyZSBhZnRlciAlaSBtcyAuLi5cbiIsIFBBVElFTkNFKTsKKwlpZiAodHJ1ZSA9PSBwZWFzeWNhcC0+bnRzYykgeworCQlKT00oOCwgIi4uLiB0cnlpbmcgUEFMIC4uLlxuIik7ICBudHNjID0gZmFsc2U7CisJfSBlbHNlIHsKKwkJSk9NKDgsICIuLi4gdHJ5aW5nIE5UU0MgLi4uXG4iKTsgbnRzYyA9IHRydWU7Cit9CityYyA9IHNldHVwX3N0ayhwZWFzeWNhcC0+cHVzYl9kZXZpY2UsIG50c2MpOwogaWYgKDAgPT0gcmMpCi0JSk9UKDgsICJ1c2Jfc2V0X2ludGVyZmFjZSguLCVpLCVpKSBPS1xuIiwgcGVhc3ljYXAtPnZpZGVvX2ludGVyZmFjZSwgXAotCQkJCQkJcGVhc3ljYXAtPnZpZGVvX2FsdHNldHRpbmdfb24pOworCUpPTSg0LCAic2V0dXBfc3RrKCkgT0tcbiIpOwogZWxzZSB7Ci0JU0FZKCJFUlJPUjogdXNiX3NldF9pbnRlcmZhY2UoKSByZXR1cm5lZCAlaVxuIiwgcmMpOworCVNBTSgiRVJST1I6IHNldHVwX3N0aygpIHJldHVybmVkICVpXG4iLCByYyk7CiAJcmV0dXJuIC1FRkFVTFQ7CiB9Ci1yYyA9IHN0YXJ0XzEwMChwKTsKK3JjID0gc2V0dXBfc2FhKHBlYXN5Y2FwLT5wdXNiX2RldmljZSwgbnRzYyk7CiBpZiAoMCA9PSByYykKLQlKT1QoOCwgInN0YXJ0XzEwMCgpIE9LXG4iKTsKKwlKT00oNCwgInNldHVwX3NhYSgpIE9LXG4iKTsKIGVsc2UgewotCVNBWSgiRVJST1I6IHN0YXJ0XzEwMCgpIHJldHVybmVkICVpXG4iLCByYyk7CisJU0FNKCJFUlJPUjogc2V0dXBfc2FhKCkgcmV0dXJuZWQgJWlcbiIsIHJjKTsKIAlyZXR1cm4gLUVGQVVMVDsKIH0KLXBlYXN5Y2FwLT52aWRlb19pc29jX3NlcXVlbmNlID0gVklERU9fSVNPQ19CVUZGRVJfTUFOWSAtIDE7Ci1wZWFzeWNhcC0+dmlkZW9faWRsZSA9IDA7Ci1wZWFzeWNhcC0+dmlkZW9fanVuayA9IDA7CityYXRlID0gcmVhZHlfc2FhKHBlYXN5Y2FwLT5wdXNiX2RldmljZSk7CitpZiAoMCA+IHJhdGUpIHsKKwlKT00oOCwgIm5vdCByZWFkeSB0byBjYXB0dXJlIGFmdGVyICVpIG1zIC4uLlxuIiwgUEFUSUVOQ0UpOworCUpPTSg4LCAiLi4uIHNhYSByZWdpc3RlciAweDFGIGhhcyAweCUwMlhcbiIsIFwKKwkJCQlyZWFkX3NhYShwZWFzeWNhcC0+cHVzYl9kZXZpY2UsIDB4MUYpKTsKKwludHNjID0gcGVhc3ljYXAtPm50c2M7CisJfSBlbHNlIHsKKwkJSk9NKDgsICIuLi4gc3VjY2VzcyBhdCBzZWNvbmQgdHJ5OiAgJWk9cmF0ZVxuIiwgcmF0ZSk7CisJCW50c2MgPSAoMCA8IChyYXRlLzIpKSA/IHRydWUgOiBmYWxzZSA7CisJCW90aGVyID0gdHJ1ZTsKKwl9Cit9IGVsc2UgeworCUpPTSg4LCAiLi4uIHN1Y2Nlc3MgYXQgZmlyc3QgdHJ5OiAgJWk9cmF0ZVxuIiwgcmF0ZSk7CisJbnRzYyA9ICgwIDwgcmF0ZS8yKSA/IHRydWUgOiBmYWxzZSA7Cit9CitpZiAodHJ1ZSA9PSBudHNjKQorCUpPTSg4LCAidHJ1ZT1udHNjXG4iKTsKK2Vsc2UKKwlKT00oOCwgImZhbHNlPW50c2NcbiIpOworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCityYyA9IHNldHVwX3N0ayhwZWFzeWNhcC0+cHVzYl9kZXZpY2UsIG50c2MpOworaWYgKDAgPT0gcmMpCisJSk9NKDQsICJzZXR1cF9zdGsoKSBPS1xuIik7CitlbHNlIHsKKwlTQU0oIkVSUk9SOiBzZXR1cF9zdGsoKSByZXR1cm5lZCAlaVxuIiwgcmMpOworCXJldHVybiAtRUZBVUxUOworfQorcmMgPSBzZXR1cF9zYWEocGVhc3ljYXAtPnB1c2JfZGV2aWNlLCBudHNjKTsKK2lmICgwID09IHJjKQorCUpPTSg0LCAic2V0dXBfc2FhKCkgT0tcbiIpOworZWxzZSB7CisJU0FNKCJFUlJPUjogc2V0dXBfc2FhKCkgcmV0dXJuZWQgJWlcbiIsIHJjKTsKKwlyZXR1cm4gLUVGQVVMVDsKK30KKwogZm9yIChpID0gMDsgaSA8IDE4MDsgaSsrKQogCXBlYXN5Y2FwLT5tZXJpdFtpXSA9IDA7CiBwZWFzeWNhcC0+dmlkZW9fZW9mID0gMDsKIHBlYXN5Y2FwLT5hdWRpb19lb2YgPSAwOwotCiBkb19nZXR0aW1lb2ZkYXkoJnBlYXN5Y2FwLT50aW1ldmFsNyk7CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogUkVTVE9SRSBJTlBVVCBBTkQgRk9SQ0UgUkVGUkVTSCBPRiBTVEFOREFSRCwgRk9STUFULCBFVEMuCisgKgorICogV0hJTEUgVEhJUyBQUk9DRURVUkUgSVMgSU4gUFJPR1JFU1MsIFNPTUUgSU9DVEwgQ09NTUFORFMgV0lMTCBSRVRVUk4gLUVCVVNZLgorKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3BlYXN5Y2FwLT5pbnB1dCA9IC04MTkyOworcGVhc3ljYXAtPnN0YW5kYXJkX29mZnNldCA9IC04MTkyOworaWYgKHRydWUgPT0gb3RoZXIpIHsKKwlwZWFzeWNhcF9zdGFuZGFyZCA9ICZlYXN5Y2FwX3N0YW5kYXJkWzBdOworCXdoaWxlICgweEZGRkYgIT0gcGVhc3ljYXBfc3RhbmRhcmQtPm1hc2spIHsKKwkJaWYgKHRydWUgPT0gbnRzYykgeworCQkJaWYgKE5UU0NfTSA9PSBcCisJCQkJcGVhc3ljYXBfc3RhbmRhcmQtPnY0bDJfc3RhbmRhcmQuaW5kZXgpIHsKKwkJCQlwZWFzeWNhcC0+aW5wdXRzZXRbaW5wdXRdLnN0YW5kYXJkX29mZnNldCA9IFwKKwkJCQkJCXBlYXN5Y2FwX3N0YW5kYXJkIC0gXAorCQkJCQkJCSZlYXN5Y2FwX3N0YW5kYXJkWzBdOworCQkJCWJyZWFrOworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKFBBTF9CR0hJTiA9PSBcCisJCQkJcGVhc3ljYXBfc3RhbmRhcmQtPnY0bDJfc3RhbmRhcmQuaW5kZXgpIHsKKwkJCQlwZWFzeWNhcC0+aW5wdXRzZXRbaW5wdXRdLnN0YW5kYXJkX29mZnNldCA9IFwKKwkJCQkJCXBlYXN5Y2FwX3N0YW5kYXJkIC0KKwkJCQkJCQkmZWFzeWNhcF9zdGFuZGFyZFswXTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlwZWFzeWNhcF9zdGFuZGFyZCsrOworCX0KKwlpZiAoMHhGRkZGID09IHBlYXN5Y2FwX3N0YW5kYXJkLT5tYXNrKSB7CisJCVNBTSgiRVJST1I6IHN0YW5kYXJkIG5vdCBmb3VuZFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KK0pPTSg4LCAiJWk9cGVhc3ljYXAtPmlucHV0c2V0WyVpXS5zdGFuZGFyZF9vZmZzZXRcbiIsIFwKKwkJcGVhc3ljYXAtPmlucHV0c2V0W2lucHV0XS5zdGFuZGFyZF9vZmZzZXQsIGlucHV0KTsKK30KK3BlYXN5Y2FwLT5mb3JtYXRfb2Zmc2V0ID0gLTgxOTI7CitwZWFzeWNhcC0+YnJpZ2h0bmVzcyA9IC04MTkyOworcGVhc3ljYXAtPmNvbnRyYXN0ID0gLTgxOTI7CitwZWFzeWNhcC0+c2F0dXJhdGlvbiA9IC04MTkyOworcGVhc3ljYXAtPmh1ZSA9IC04MTkyOwogCi1wZWFzeWNhcC0+ZnVkZ2UgPSAwOworcmMgPSBuZXdpbnB1dChwZWFzeWNhcCwgaW5wdXQpOwogCi1KT1QoNCwgImZpbmlzaGVkIGluaXRpYWxpemF0aW9uXG4iKTsKK2lmICgwID09IHJjKQorCUpPTSg0LCAicmVzdG9yZWQgaW5wdXQsIHN0YW5kYXJkIGFuZCBmb3JtYXRcbiIpOworZWxzZSB7CisJU0FNKCJFUlJPUjogbmV3aW5wdXQoLiwlaSkgcmV0dXJuZWQgJWlcbiIsIHJjLCBpbnB1dCk7CisJcmV0dXJuIC1FRkFVTFQ7Cit9CitpZiAodHJ1ZSA9PSBwZWFzeWNhcC0+bnRzYykKKwlKT00oOCwgInRydWU9cGVhc3ljYXAtPm50c2NcbiIpOworZWxzZQorCUpPTSg4LCAiZmFsc2U9cGVhc3ljYXAtPm50c2NcbiIpOworCitpZiAoMCA+IHBlYXN5Y2FwLT5pbnB1dCkgeworCVNBTSgiTUlTVEFLRTogICVpPXBlYXN5Y2FwLT5pbnB1dFxuIiwgcGVhc3ljYXAtPmlucHV0KTsKKwlyZXR1cm4gLUVOT0VOVDsKK30KK2lmICgwID4gcGVhc3ljYXAtPnN0YW5kYXJkX29mZnNldCkgeworCVNBTSgiTUlTVEFLRTogICVpPXBlYXN5Y2FwLT5zdGFuZGFyZF9vZmZzZXRcbiIsIFwKKwkJCQkJCXBlYXN5Y2FwLT5zdGFuZGFyZF9vZmZzZXQpOworCXJldHVybiAtRU5PRU5UOworfQoraWYgKDAgPiBwZWFzeWNhcC0+Zm9ybWF0X29mZnNldCkgeworCVNBTSgiTUlTVEFLRTogICVpPXBlYXN5Y2FwLT5mb3JtYXRfb2Zmc2V0XG4iLCBcCisJCQkJCQlwZWFzeWNhcC0+Zm9ybWF0X29mZnNldCk7CisJcmV0dXJuIC1FTk9FTlQ7Cit9CitpZiAoMCA+IHBlYXN5Y2FwLT5icmlnaHRuZXNzKSB7CisJU0FNKCJNSVNUQUtFOiAgJWk9cGVhc3ljYXAtPmJyaWdodG5lc3NcbiIsIHBlYXN5Y2FwLT5icmlnaHRuZXNzKTsKKwlyZXR1cm4gLUVOT0VOVDsKK30KK2lmICgwID4gcGVhc3ljYXAtPmNvbnRyYXN0KSB7CisJU0FNKCJNSVNUQUtFOiAgJWk9cGVhc3ljYXAtPmNvbnRyYXN0XG4iLCBwZWFzeWNhcC0+Y29udHJhc3QpOworCXJldHVybiAtRU5PRU5UOworfQoraWYgKDAgPiBwZWFzeWNhcC0+c2F0dXJhdGlvbikgeworCVNBTSgiTUlTVEFLRTogICVpPXBlYXN5Y2FwLT5zYXR1cmF0aW9uXG4iLCBwZWFzeWNhcC0+c2F0dXJhdGlvbik7CisJcmV0dXJuIC1FTk9FTlQ7Cit9CitpZiAoMCA+IHBlYXN5Y2FwLT5odWUpIHsKKwlTQU0oIk1JU1RBS0U6ICAlaT1wZWFzeWNhcC0+aHVlXG4iLCBwZWFzeWNhcC0+aHVlKTsKKwlyZXR1cm4gLUVOT0VOVDsKK30KK3JldHVybiAwOworfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqICBJRiBUSEUgUkVRVUVTVEVEIElOUFVUIElTIFRIRSBTQU1FIEFTIFRIRSBFWElTVElORyBJTlBVVCwgRE8gTk9USElORy4KKyAqICBPVEhFUldJU0U6CisgKiAgICAgIEtJTEwgVVJCUywgQ0xFQVIgRklFTEQgQU5EIEZSQU1FIEJVRkZFUlMgQU5EIFJFU0VUIFRIRUlSCisgKiAgICAgICAgICAgX3JlYWQgQU5EIF9maWxsIFBPSU5URVJTLgorICogICAgICBTRUxFQ1QgVEhFIE5FVyBJTlBVVC4KKyAqICAgICAgQURKVVNUIFRIRSBTVEFOREFSRCwgRk9STUFULCBCUklHSFRORVNTLCBDT05UUkFTVCwgU0FUVVJBVElPTiBBTkQgSFVFCisgKiAgICAgICAgICBPTiBUSEUgQkFTSVMgT0YgSU5GT1JNQVRJT04gSU4gU1RSVUNUVVJFIGVhc3ljYXAuaW5wdXRzZXRbaW5wdXRdLgorICogICAgICBSRVNVQk1JVCBUSEUgVVJCUyBJRiBTVFJFQU1JTkcgV0FTIEFMUkVBRFkgSU4gUFJPR1JFU1MuCisgKgorICogIE5PVEU6CisgKiAgICAgIFRISVMgUk9VVElORSBNQVkgQkUgQ0FMTEVEIEZSRVFVRU5UTFkgQlkgWk9ORU1JTkRFUiBWSUEgSU9DVEwsCisgKiAgICAgIFNPIElUIFNIT1VMRCBXUklURSBPTkxZIFNQQVJJTkdMWSBUTyBUSEUgTE9HRklMRS4KKyovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitpbnQKK25ld2lucHV0KHN0cnVjdCBlYXN5Y2FwICpwZWFzeWNhcCwgaW50IGlucHV0KQoreworaW50IHJjLCBrLCBtLCBtb29kLCBvZmY7CitpbnQgaW5wdXRub3csIHZpZGVvX2lkbGVub3csIGF1ZGlvX2lkbGVub3c7Citib29sIHJlc3VibWl0OworCitpZiAoTlVMTCA9PSBwZWFzeWNhcCkgeworCVNBWSgiRVJST1I6IHBlYXN5Y2FwIGlzIE5VTExcbiIpOworCXJldHVybiAtRUZBVUxUOworfQorSk9NKDgsICIlaT1pbnB1dCBzb3VnaHRcbiIsIGlucHV0KTsKKworaWYgKDAgPiBpbnB1dCAmJiBJTlBVVF9NQU5ZIDw9IGlucHV0KQorCXJldHVybiAtRU5PRU5UOworaW5wdXRub3cgPSBwZWFzeWNhcC0+aW5wdXQ7CitpZiAoaW5wdXQgPT0gaW5wdXRub3cpCisJcmV0dXJuIDA7CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogIElGIFNUUkVBTUlORyBJUyBJTiBQUk9HUkVTUyBUSEUgVVJCUyBBUkUgS0lMTEVEIEFUIFRISVMKKyAqICBTVEFHRSBBTkQgV0lMTCBCRSBSRVNVQk1JVFRFRCBQUklPUiBUTyBFWElUIEZST00gVEhFIFJPVVRJTkUuCisgKiAgSUYgTk8gU1RSRUFNSU5HIElTIElOIFBST0dSRVNTIE5PIFVSQlMgV0lMTCBCRSBTVUJNSVRURUQgQlkgVEhFCisgKiAgUk9VVElORS4KKyovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2aWRlb19pZGxlbm93ID0gcGVhc3ljYXAtPnZpZGVvX2lkbGU7CithdWRpb19pZGxlbm93ID0gcGVhc3ljYXAtPmF1ZGlvX2lkbGU7CisKK3BlYXN5Y2FwLT52aWRlb19pZGxlID0gMTsKK3BlYXN5Y2FwLT5hdWRpb19pZGxlID0gMTsKK2lmIChwZWFzeWNhcC0+dmlkZW9faXNvY19zdHJlYW1pbmcpIHsKKwlyZXN1Ym1pdCA9IHRydWU7CisJa2lsbF92aWRlb191cmJzKHBlYXN5Y2FwKTsKK30gZWxzZQorCXJlc3VibWl0ID0gZmFsc2U7CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitpZiAoTlVMTCA9PSBwZWFzeWNhcC0+cHVzYl9kZXZpY2UpIHsKKwlTQU0oIkVSUk9SOiBwZWFzeWNhcC0+cHVzYl9kZXZpY2UgaXMgTlVMTFxuIik7CisJcmV0dXJuIC1FTk9ERVY7Cit9CityYyA9IHVzYl9zZXRfaW50ZXJmYWNlKHBlYXN5Y2FwLT5wdXNiX2RldmljZSwKKwkJCXBlYXN5Y2FwLT52aWRlb19pbnRlcmZhY2UsIFwKKwkJCXBlYXN5Y2FwLT52aWRlb19hbHRzZXR0aW5nX29mZik7CitpZiAoMCAhPSByYykgeworCVNBTSgiRVJST1I6IHVzYl9zZXRfaW50ZXJmYWNlKCkgcmV0dXJuZWQgJWlcbiIsIHJjKTsKKwlyZXR1cm4gLUVGQVVMVDsKK30KK3JjID0gc3RvcF8xMDAocGVhc3ljYXAtPnB1c2JfZGV2aWNlKTsKK2lmICgwICE9IHJjKSB7CisJU0FNKCJFUlJPUjogc3RvcF8xMDAoKSByZXR1cm5lZCAlaVxuIiwgcmMpOworCXJldHVybiAtRUZBVUxUOworfQorZm9yIChrID0gMDsgayA8IEZJRUxEX0JVRkZFUl9NQU5ZOyBrKyspIHsKKwlmb3IgKG0gPSAwOyBtIDwgRklFTERfQlVGRkVSX1NJWkUvUEFHRV9TSVpFOyBtKyspCisJCW1lbXNldChwZWFzeWNhcC0+ZmllbGRfYnVmZmVyW2tdW21dLnBnbywgMCwgUEFHRV9TSVpFKTsKK30KK2ZvciAoayA9IDA7IGsgPCBGUkFNRV9CVUZGRVJfTUFOWTsgaysrKSB7CisJZm9yIChtID0gMDsgbSA8IEZSQU1FX0JVRkZFUl9TSVpFL1BBR0VfU0laRTsgbSsrKQorCQltZW1zZXQocGVhc3ljYXAtPmZyYW1lX2J1ZmZlcltrXVttXS5wZ28sIDAsIFBBR0VfU0laRSk7Cit9CitwZWFzeWNhcC0+ZmllbGRfcGFnZSA9IDA7CitwZWFzeWNhcC0+ZmllbGRfcmVhZCA9IDA7CitwZWFzeWNhcC0+ZmllbGRfZmlsbCA9IDA7CisKK3BlYXN5Y2FwLT5mcmFtZV9yZWFkID0gMDsKK3BlYXN5Y2FwLT5mcmFtZV9maWxsID0gMDsKK2ZvciAoayA9IDA7IGsgPCBwZWFzeWNhcC0+aW5wdXQ7IGsrKykgeworCShwZWFzeWNhcC0+ZnJhbWVfZmlsbCkrKzsKKwlpZiAocGVhc3ljYXAtPmZyYW1lX2J1ZmZlcl9tYW55IDw9IHBlYXN5Y2FwLT5mcmFtZV9maWxsKQorCQlwZWFzeWNhcC0+ZnJhbWVfZmlsbCA9IDA7Cit9CitwZWFzeWNhcC0+aW5wdXQgPSBpbnB1dDsKK3NlbGVjdF9pbnB1dChwZWFzeWNhcC0+cHVzYl9kZXZpY2UsIHBlYXN5Y2FwLT5pbnB1dCwgOSk7CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitpZiAoaW5wdXQgPT0gcGVhc3ljYXAtPmlucHV0c2V0W2lucHV0XS5pbnB1dCkgeworCW9mZiA9IHBlYXN5Y2FwLT5pbnB1dHNldFtpbnB1dF0uc3RhbmRhcmRfb2Zmc2V0OworCWlmIChvZmYgIT0gcGVhc3ljYXAtPnN0YW5kYXJkX29mZnNldCkgeworCQlyYyA9IGFkanVzdF9zdGFuZGFyZChwZWFzeWNhcCwgXAorCQkJCWVhc3ljYXBfc3RhbmRhcmRbb2ZmXS52NGwyX3N0YW5kYXJkLmlkKTsKKwkJaWYgKDAgIT0gcmMpIHsKKwkJCVNBTSgiRVJST1I6IGFkanVzdF9zdGFuZGFyZCgpIHJldHVybmVkICVpXG4iLCByYyk7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCQlKT00oOCwgIiVpPXBlYXN5Y2FwLT5zdGFuZGFyZF9vZmZzZXRcbiIsIFwKKwkJCQkJCXBlYXN5Y2FwLT5zdGFuZGFyZF9vZmZzZXQpOworCX0gZWxzZSB7CisJCUpPTSg4LCAiJWk9cGVhc3ljYXAtPnN0YW5kYXJkX29mZnNldCB1bmNoYW5nZWRcbiIsIFwKKwkJCQkJCXBlYXN5Y2FwLT5zdGFuZGFyZF9vZmZzZXQpOworCX0KKwlvZmYgPSBwZWFzeWNhcC0+aW5wdXRzZXRbaW5wdXRdLmZvcm1hdF9vZmZzZXQ7CisJaWYgKG9mZiAhPSBwZWFzeWNhcC0+Zm9ybWF0X29mZnNldCkgeworCQlyYyA9IGFkanVzdF9mb3JtYXQocGVhc3ljYXAsIFwKKwkJCWVhc3ljYXBfZm9ybWF0W29mZl0udjRsMl9mb3JtYXQuZm10LnBpeC53aWR0aCwgXAorCQkJZWFzeWNhcF9mb3JtYXRbb2ZmXS52NGwyX2Zvcm1hdC5mbXQucGl4LmhlaWdodCwgXAorCQkJZWFzeWNhcF9mb3JtYXRbb2ZmXS52NGwyX2Zvcm1hdC5mbXQucGl4LnBpeGVsZm9ybWF0LCBcCisJCQllYXN5Y2FwX2Zvcm1hdFtvZmZdLnY0bDJfZm9ybWF0LmZtdC5waXguZmllbGQsIGZhbHNlKTsKKwkJaWYgKDAgPiByYykgeworCQkJU0FNKCJFUlJPUjogYWRqdXN0X2Zvcm1hdCgpIHJldHVybmVkICVpXG4iLCByYyk7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCQlKT00oOCwgIiVpPXBlYXN5Y2FwLT5mb3JtYXRfb2Zmc2V0XG4iLCBwZWFzeWNhcC0+Zm9ybWF0X29mZnNldCk7CisJfSBlbHNlIHsKKwkJSk9NKDgsICIlaT1wZWFzeWNhcC0+Zm9ybWF0X29mZnNldCB1bmNoYW5nZWRcbiIsIFwKKwkJCQkJCXBlYXN5Y2FwLT5mb3JtYXRfb2Zmc2V0KTsKKwl9CisJbW9vZCA9IHBlYXN5Y2FwLT5pbnB1dHNldFtpbnB1dF0uYnJpZ2h0bmVzczsKKwlpZiAobW9vZCAhPSBwZWFzeWNhcC0+YnJpZ2h0bmVzcykgeworCQlyYyA9IGFkanVzdF9icmlnaHRuZXNzKHBlYXN5Y2FwLCBtb29kKTsKKwkJaWYgKDAgIT0gcmMpIHsKKwkJCVNBTSgiRVJST1I6IGFkanVzdF9icmlnaHRuZXNzIHJldHVybmVkICVpXG4iLCByYyk7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCQlKT00oOCwgIiVpPXBlYXN5Y2FwLT5icmlnaHRuZXNzXG4iLCBwZWFzeWNhcC0+YnJpZ2h0bmVzcyk7CisJfQorCW1vb2QgPSBwZWFzeWNhcC0+aW5wdXRzZXRbaW5wdXRdLmNvbnRyYXN0OworCWlmIChtb29kICE9IHBlYXN5Y2FwLT5jb250cmFzdCkgeworCQlyYyA9IGFkanVzdF9jb250cmFzdChwZWFzeWNhcCwgbW9vZCk7CisJCWlmICgwICE9IHJjKSB7CisJCQlTQU0oIkVSUk9SOiBhZGp1c3RfY29udHJhc3QgcmV0dXJuZWQgJWlcbiIsIHJjKTsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisJCUpPTSg4LCAiJWk9cGVhc3ljYXAtPmNvbnRyYXN0XG4iLCBwZWFzeWNhcC0+Y29udHJhc3QpOworCX0KKwltb29kID0gcGVhc3ljYXAtPmlucHV0c2V0W2lucHV0XS5zYXR1cmF0aW9uOworCWlmIChtb29kICE9IHBlYXN5Y2FwLT5zYXR1cmF0aW9uKSB7CisJCXJjID0gYWRqdXN0X3NhdHVyYXRpb24ocGVhc3ljYXAsIG1vb2QpOworCQlpZiAoMCAhPSByYykgeworCQkJU0FNKCJFUlJPUjogYWRqdXN0X3NhdHVyYXRpb24gcmV0dXJuZWQgJWlcbiIsIHJjKTsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisJCUpPTSg4LCAiJWk9cGVhc3ljYXAtPnNhdHVyYXRpb25cbiIsIHBlYXN5Y2FwLT5zYXR1cmF0aW9uKTsKKwl9CisJbW9vZCA9IHBlYXN5Y2FwLT5pbnB1dHNldFtpbnB1dF0uaHVlOworCWlmIChtb29kICE9IHBlYXN5Y2FwLT5odWUpIHsKKwkJcmMgPSBhZGp1c3RfaHVlKHBlYXN5Y2FwLCBtb29kKTsKKwkJaWYgKDAgIT0gcmMpIHsKKwkJCVNBTSgiRVJST1I6IGFkanVzdF9odWUgcmV0dXJuZWQgJWlcbiIsIHJjKTsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisJCUpPTSg4LCAiJWk9cGVhc3ljYXAtPmh1ZVxuIiwgcGVhc3ljYXAtPmh1ZSk7CisJfQorfSBlbHNlIHsKKwlTQU0oIk1JU1RBS0U6IGVhc3ljYXAuaW5wdXRzZXRbJWldIHVucG9wdWxhdGVkXG4iLCBpbnB1dCk7CisJcmV0dXJuIC1FTk9FTlQ7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitpZiAoTlVMTCA9PSBwZWFzeWNhcC0+cHVzYl9kZXZpY2UpIHsKKwlTQU0oIkVSUk9SOiBwZWFzeWNhcC0+cHVzYl9kZXZpY2UgaXMgTlVMTFxuIik7CisJcmV0dXJuIC1FTk9ERVY7Cit9CityYyA9IHVzYl9zZXRfaW50ZXJmYWNlKHBlYXN5Y2FwLT5wdXNiX2RldmljZSwKKwkJCXBlYXN5Y2FwLT52aWRlb19pbnRlcmZhY2UsIFwKKwkJCXBlYXN5Y2FwLT52aWRlb19hbHRzZXR0aW5nX29uKTsKK2lmICgwICE9IHJjKSB7CisJU0FNKCJFUlJPUjogdXNiX3NldF9pbnRlcmZhY2UoKSByZXR1cm5lZCAlaVxuIiwgcmMpOworCXJldHVybiAtRUZBVUxUOworfQorcmMgPSBzdGFydF8xMDAocGVhc3ljYXAtPnB1c2JfZGV2aWNlKTsKK2lmICgwICE9IHJjKSB7CisJU0FNKCJFUlJPUjogc3RhcnRfMTAwKCkgcmV0dXJuZWQgJWlcbiIsIHJjKTsKKwlyZXR1cm4gLUVGQVVMVDsKK30KK2lmICh0cnVlID09IHJlc3VibWl0KQorCXN1Ym1pdF92aWRlb191cmJzKHBlYXN5Y2FwKTsKKworcGVhc3ljYXAtPnZpZGVvX2lzb2Nfc2VxdWVuY2UgPSBWSURFT19JU09DX0JVRkZFUl9NQU5ZIC0gMTsKK3BlYXN5Y2FwLT52aWRlb19pZGxlID0gdmlkZW9faWRsZW5vdzsKK3BlYXN5Y2FwLT5hdWRpb19pZGxlID0gYXVkaW9faWRsZW5vdzsKK3BlYXN5Y2FwLT52aWRlb19qdW5rID0gMDsKKwogcmV0dXJuIDA7CiB9CiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0zMjYsMzMgKzYzMSwyNSBAQAogc3RydWN0IGRhdGFfdXJiICpwZGF0YV91cmI7CiBzdHJ1Y3QgdXJiICpwdXJiOwogc3RydWN0IGxpc3RfaGVhZCAqcGxpc3RfaGVhZDsKLWludCBqLCBpc2JhZCwgbSwgcmM7CitpbnQgaiwgaXNiYWQsIG5vc3BjLCBtLCByYzsKIGludCBpc2J1ZjsKIAotaWYgKChzdHJ1Y3QgbGlzdF9oZWFkICopTlVMTCA9PSBwZWFzeWNhcC0+cHVyYl92aWRlb19oZWFkKSB7CitpZiAoTlVMTCA9PSBwZWFzeWNhcCkgeworCVNBWSgiRVJST1I6IHBlYXN5Y2FwIGlzIE5VTExcbiIpOworCXJldHVybiAtRUZBVUxUOworfQorCitpZiAoTlVMTCA9PSBwZWFzeWNhcC0+cHVyYl92aWRlb19oZWFkKSB7CiAJU0FZKCJFUlJPUjogcGVhc3ljYXAtPnVyYl92aWRlb19oZWFkIHVuaW5pdGlhbGl6ZWRcbiIpOwogCXJldHVybiAtRUZBVUxUOwogfQotaWYgKChzdHJ1Y3QgdXNiX2RldmljZSAqKU5VTEwgPT0gcGVhc3ljYXAtPnB1c2JfZGV2aWNlKSB7CitpZiAoTlVMTCA9PSBwZWFzeWNhcC0+cHVzYl9kZXZpY2UpIHsKIAlTQVkoIkVSUk9SOiBwZWFzeWNhcC0+cHVzYl9kZXZpY2UgaXMgTlVMTFxuIik7Ci0JcmV0dXJuIC1FRkFVTFQ7CisJcmV0dXJuIC1FTk9ERVY7CiB9CiBpZiAoIXBlYXN5Y2FwLT52aWRlb19pc29jX3N0cmVhbWluZykgewotCi0KLQotCi0KLQotCi0KLQlKT1QoNCwgInN1Ym1pc3Npb24gb2YgYWxsIHZpZGVvIHVyYnNcbiIpOwotCWlmICgwICE9IHJlYWR5X3NhYShwZWFzeWNhcC0+cHVzYl9kZXZpY2UpKSB7Ci0JCVNBWSgiRVJST1I6IG5vdCByZWFkeSB0byBjYXB0dXJlIGFmdGVyIHdhaXRpbmcgIiBcCi0JCQkJCQkJIm9uZSBzZWNvbmRcbiIpOwotCQlTQVkoIi4uLi4uICBjb250aW51aW5nIGFueXdheVxuIik7Ci0JfQotCWlzYmFkID0gMDsgIG0gPSAwOworCUpPTSg0LCAic3VibWlzc2lvbiBvZiBhbGwgdmlkZW8gdXJic1xuIik7CisJaXNiYWQgPSAwOyAgbm9zcGMgPSAwOyAgbSA9IDA7CiAJbGlzdF9mb3JfZWFjaChwbGlzdF9oZWFkLCAocGVhc3ljYXAtPnB1cmJfdmlkZW9faGVhZCkpIHsKIAkJcGRhdGFfdXJiID0gbGlzdF9lbnRyeShwbGlzdF9oZWFkLCBzdHJ1Y3QgZGF0YV91cmIsIGxpc3RfaGVhZCk7CiAJCWlmIChOVUxMICE9IHBkYXRhX3VyYikgewpAQCAtMzg5LDQ0ICs2ODYsNTcgQEAKIAkJCQlyYyA9IHVzYl9zdWJtaXRfdXJiKHB1cmIsIEdGUF9LRVJORUwpOwogCQkJCWlmICgwICE9IHJjKSB7CiAJCQkJCWlzYmFkKys7Ci0JCQkJCVNBWSgiRVJST1I6IHVzYl9zdWJtaXRfdXJiKCkgZmFpbGVkICIgXAorCQkJCQlTQU0oIkVSUk9SOiB1c2Jfc3VibWl0X3VyYigpIGZhaWxlZCAiIFwKIAkJCQkJCQkiZm9yIHVyYiB3aXRoIHJjOlxuIik7CiAJCQkJCXN3aXRjaCAocmMpIHsKIAkJCQkJY2FzZSAtRU5PTUVNOiB7Ci0JCQkJCQlTQVkoIkVOT01FTVxuIik7CisJCQkJCQlTQU0oIkVSUk9SOiAtRU5PTUVNPSIgXAorCQkJCQkJCSJ1c2Jfc3VibWl0X3VyYigpXG4iKTsKIAkJCQkJCWJyZWFrOwogCQkJCQl9CiAJCQkJCWNhc2UgLUVOT0RFVjogewotCQkJCQkJU0FZKCJFTk9ERVZcbiIpOworCQkJCQkJU0FNKCJFUlJPUjogLUVOT0RFVj0iIFwKKwkJCQkJCQkidXNiX3N1Ym1pdF91cmIoKVxuIik7CiAJCQkJCQlicmVhazsKIAkJCQkJfQogCQkJCQljYXNlIC1FTlhJTzogewotCQkJCQkJU0FZKCJFTlhJT1xuIik7CisJCQkJCQlTQU0oIkVSUk9SOiAtRU5YSU89IiBcCisJCQkJCQkJInVzYl9zdWJtaXRfdXJiKClcbiIpOwogCQkJCQkJYnJlYWs7CiAJCQkJCX0KIAkJCQkJY2FzZSAtRUlOVkFMOiB7Ci0JCQkJCQlTQVkoIkVJTlZBTFxuIik7CisJCQkJCQlTQU0oIkVSUk9SOiAtRUlOVkFMPSIgXAorCQkJCQkJCSJ1c2Jfc3VibWl0X3VyYigpXG4iKTsKIAkJCQkJCWJyZWFrOwogCQkJCQl9CiAJCQkJCWNhc2UgLUVBR0FJTjogewotCQkJCQkJU0FZKCJFQUdBSU5cbiIpOworCQkJCQkJU0FNKCJFUlJPUjogLUVBR0FJTj0iIFwKKwkJCQkJCQkidXNiX3N1Ym1pdF91cmIoKVxuIik7CiAJCQkJCQlicmVhazsKIAkJCQkJfQogCQkJCQljYXNlIC1FRkJJRzogewotCQkJCQkJU0FZKCJFRkJJR1xuIik7CisJCQkJCQlTQU0oIkVSUk9SOiAtRUZCSUc9IiBcCisJCQkJCQkJInVzYl9zdWJtaXRfdXJiKClcbiIpOwogCQkJCQkJYnJlYWs7CiAJCQkJCX0KIAkJCQkJY2FzZSAtRVBJUEU6IHsKLQkJCQkJCVNBWSgiRVBJUEVcbiIpOworCQkJCQkJU0FNKCJFUlJPUjogLUVQSVBFPSIgXAorCQkJCQkJCSJ1c2Jfc3VibWl0X3VyYigpXG4iKTsKIAkJCQkJCWJyZWFrOwogCQkJCQl9CiAJCQkJCWNhc2UgLUVNU0dTSVpFOiB7Ci0JCQkJCQlTQVkoIkVNU0dTSVpFXG4iKTsKKwkJCQkJCVNBTSgiRVJST1I6IC1FTVNHU0laRT0iIFwKKwkJCQkJCQkidXNiX3N1Ym1pdF91cmIoKVxuIik7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCQljYXNlIC1FTk9TUEM6IHsKKwkJCQkJCW5vc3BjKys7CiAJCQkJCQlicmVhazsKIAkJCQkJfQogCQkJCQlkZWZhdWx0OiB7Ci0JCQkJCQlTQVkoInVua25vd24gZXJyb3IgY29kZSAlaVxuIixcCi0JCQkJCQkJCQkgcmMpOworCQkJCQkJU0FNKCJFUlJPUjogJWk9IiBcCisJCQkJCQkJInVzYl9zdWJtaXRfdXJiKClcbiIsXAorCQkJCQkJCXJjKTsKIAkJCQkJCWJyZWFrOwogCQkJCQl9CiAJCQkJCX0KQEAgLTQzNCwxNCArNzQ0LDIwIEBACiAJCQkJCW0rKzsKIAkJCQl9CiAJCQkJfSBlbHNlIHsKLQkJCQkJaXNiYWQrKzsKKwkJCQkJIGlzYmFkKys7CiAJCQkJfQogCQkJfSBlbHNlIHsKIAkJCQkgaXNiYWQrKzsKIAkJCX0KIAkJfQorCWlmIChub3NwYykgeworCQlTQU0oIi1FTk9TUEM9dXNiX3N1Ym1pdF91cmIoKSBmb3IgJWkgdXJic1xuIiwgbm9zcGMpOworCQlTQU0oIi4uLi4uICBwb3NzaWJseSBpbmFkZXF1YXRlIFVTQiBiYW5kd2lkdGhcbiIpOworCQlwZWFzeWNhcC0+dmlkZW9fZW9mID0gMTsKKwl9CisKIAlpZiAoaXNiYWQpIHsKLQkJSk9UKDQsICJhdHRlbXB0aW5nIGNsZWFudXAgaW5zdGVhZCBvZiBzdWJtaXR0aW5nXG4iKTsKKwkJSk9NKDQsICJhdHRlbXB0aW5nIGNsZWFudXAgaW5zdGVhZCBvZiBzdWJtaXR0aW5nXG4iKTsKIAkJbGlzdF9mb3JfZWFjaChwbGlzdF9oZWFkLCAocGVhc3ljYXAtPnB1cmJfdmlkZW9faGVhZCkpIHsKIAkJCXBkYXRhX3VyYiA9IGxpc3RfZW50cnkocGxpc3RfaGVhZCwgc3RydWN0IGRhdGFfdXJiLCBcCiAJCQkJCQkJCWxpc3RfaGVhZCk7CkBAIC00NTQsMTYgKzc3MCwxMCBAQAogCQlwZWFzeWNhcC0+dmlkZW9faXNvY19zdHJlYW1pbmcgPSAwOwogCX0gZWxzZSB7CiAJCXBlYXN5Y2FwLT52aWRlb19pc29jX3N0cmVhbWluZyA9IDE7Ci0JCUpPVCg0LCAic3VibWl0dGVkICVpIHZpZGVvIHVyYnNcbiIsIG0pOworCQlKT00oNCwgInN1Ym1pdHRlZCAlaSB2aWRlbyB1cmJzXG4iLCBtKTsKIAl9Ci0KLQotCi0KLQotCiB9IGVsc2UgewotCUpPVCg0LCAiYWxyZWFkeSBzdHJlYW1pbmcgdmlkZW8gdXJic1xuIik7CisJSk9NKDQsICJhbHJlYWR5IHN0cmVhbWluZyB2aWRlbyB1cmJzXG4iKTsKIH0KIHJldHVybiAwOwogfQpAQCAtNDc1LDM1ICs3ODUsMzIgQEAKIHN0cnVjdCBsaXN0X2hlYWQgKnBsaXN0X2hlYWQ7CiBzdHJ1Y3QgZGF0YV91cmIgKnBkYXRhX3VyYjsKIAotaWYgKChzdHJ1Y3QgZWFzeWNhcCAqKU5VTEwgPT0gcGVhc3ljYXApIHsKK2lmIChOVUxMID09IHBlYXN5Y2FwKSB7CiAJU0FZKCJFUlJPUjogcGVhc3ljYXAgaXMgTlVMTFxuIik7CiAJcmV0dXJuIC1FRkFVTFQ7CiB9CiBpZiAocGVhc3ljYXAtPnZpZGVvX2lzb2Nfc3RyZWFtaW5nKSB7Ci0KLQotCiAJaWYgKChzdHJ1Y3QgbGlzdF9oZWFkICopTlVMTCAhPSBwZWFzeWNhcC0+cHVyYl92aWRlb19oZWFkKSB7CiAJCXBlYXN5Y2FwLT52aWRlb19pc29jX3N0cmVhbWluZyA9IDA7Ci0JCUpPVCg0LCAia2lsbGluZyB2aWRlbyB1cmJzXG4iKTsKKwkJSk9NKDQsICJraWxsaW5nIHZpZGVvIHVyYnNcbiIpOwogCQltID0gMDsKIAkJbGlzdF9mb3JfZWFjaChwbGlzdF9oZWFkLCAocGVhc3ljYXAtPnB1cmJfdmlkZW9faGVhZCkpIHsKIAkJCXBkYXRhX3VyYiA9IGxpc3RfZW50cnkocGxpc3RfaGVhZCwgc3RydWN0IGRhdGFfdXJiLCBcCiAJCQkJCQkJCWxpc3RfaGVhZCk7Ci0JCQlpZiAoKHN0cnVjdCBkYXRhX3VyYiAqKU5VTEwgIT0gcGRhdGFfdXJiKSB7Ci0JCQkJaWYgKChzdHJ1Y3QgdXJiICopTlVMTCAhPSBwZGF0YV91cmItPnB1cmIpIHsKKwkJCWlmIChOVUxMICE9IHBkYXRhX3VyYikgeworCQkJCWlmIChOVUxMICE9IHBkYXRhX3VyYi0+cHVyYikgewogCQkJCQl1c2Jfa2lsbF91cmIocGRhdGFfdXJiLT5wdXJiKTsKIAkJCQkJbSsrOwogCQkJCX0KIAkJCX0KIAkJfQotCQlKT1QoNCwgIiVpIHZpZGVvIHVyYnMga2lsbGVkXG4iLCBtKTsKKwkJSk9NKDQsICIlaSB2aWRlbyB1cmJzIGtpbGxlZFxuIiwgbSk7CiAJfSBlbHNlIHsKLQkJU0FZKCJFUlJPUjogcGVhc3ljYXAtPnB1cmJfdmlkZW9faGVhZCBpcyBOVUxMXG4iKTsKKwkJU0FNKCJFUlJPUjogcGVhc3ljYXAtPnB1cmJfdmlkZW9faGVhZCBpcyBOVUxMXG4iKTsKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJfQogfSBlbHNlIHsKLQlKT1QoOCwgIiVpPXZpZGVvX2lzb2Nfc3RyZWFtaW5nLCBubyB2aWRlbyB1cmJzIGtpbGxlZFxuIiwgXAorCUpPTSg4LCAiJWk9dmlkZW9faXNvY19zdHJlYW1pbmcsIG5vIHZpZGVvIHVyYnMga2lsbGVkXG4iLCBcCiAJCQkJCXBlYXN5Y2FwLT52aWRlb19pc29jX3N0cmVhbWluZyk7CiB9CiByZXR1cm4gMDsKQEAgLTUzMywxMSArODQwLDE1IEBACiAJU0FZKCJlbmRpbmcgdW5zdWNjZXNzZnVsbHlcbiIpOwogCXJldHVybiAtRUZBVUxUOwogfQotaWYgKDAgIT0ga2lsbF92aWRlb191cmJzKHBlYXN5Y2FwKSkgewotCVNBWSgiRVJST1I6IGtpbGxfdmlkZW9fdXJicygpIGZhaWxlZFxuIik7CitpZiAobWVtY21wKCZwZWFzeWNhcC0+dGVsbHRhbGVbMF0sIFRFTExUQUxFLCBzdHJsZW4oVEVMTFRBTEUpKSkgeworCVNBWSgiRVJST1I6IGJhZCBwZWFzeWNhcDogMHglMDhsWFxuIiwgKHVuc2lnbmVkIGxvbmcgaW50KSBwZWFzeWNhcCk7CiAJcmV0dXJuIC1FRkFVTFQ7CiB9Ci1KT1QoNCwgImVuZGluZyBzdWNjZXNzZnVsbHlcbiIpOworaWYgKDAgIT0ga2lsbF92aWRlb191cmJzKHBlYXN5Y2FwKSkgeworCVNBTSgiRVJST1I6IGtpbGxfdmlkZW9fdXJicygpIGZhaWxlZFxuIik7CisJcmV0dXJuIC1FRkFVTFQ7Cit9CitKT00oNCwgImVuZGluZyBzdWNjZXNzZnVsbHlcbiIpOwogLyp2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2diovCiAjZWxzZQogIwpAQCAtNTUwLDYzICs4NjEsNDUgQEAKIC8qdnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnYqLwogI2lmIGRlZmluZWQoRUFTWUNBUF9JU19WSURFT0RFVl9DTElFTlQpCiBpbnQKLXZpZGVvZGV2X3JlbGVhc2Uoc3RydWN0IHZpZGVvX2RldmljZSAqcHZkKQordmlkZW9kZXZfcmVsZWFzZShzdHJ1Y3QgdmlkZW9fZGV2aWNlICpwdmlkZW9fZGV2aWNlKQogewogc3RydWN0IGVhc3ljYXAgKnBlYXN5Y2FwOwotaW50IGksIGosIGs7CiAKIEpPVCg0LCAiXG4iKTsKIAotayA9IDA7Ci1mb3IgKGkgPSAwOyAgaSA8IHZpZGVvX2RldmljZV9tYW55OyAgaSsrKSB7Ci0JcHZpZGVvX2RldmljZSA9IHB2aWRlb19hcnJheVtpXTsKLQlpZiAoKHN0cnVjdCB2aWRlb19kZXZpY2UgKilOVUxMICE9IHB2aWRlb19kZXZpY2UpIHsKLQkJaWYgKHB2ZC0+bWlub3IgPT0gcHZpZGVvX2RldmljZS0+bWlub3IpIHsKLQkJCXBlYXN5Y2FwID0gKHN0cnVjdCBlYXN5Y2FwICopXAotCQkJCQl2aWRlb19nZXRfZHJ2ZGF0YShwdmlkZW9fZGV2aWNlKTsKLQkJCWlmICgoc3RydWN0IGVhc3ljYXAgKilOVUxMID09IHBlYXN5Y2FwKSB7Ci0JCQkJU0FZKCJFUlJPUjogIHBlYXN5Y2FwIGlzIE5VTExcbiIpOwotCQkJCVNBWSgiZW5kaW5nIHVuc3VjY2Vzc2Z1bGx5XG4iKTsKLQkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJCX0KLQkJCWlmICgwICE9IGtpbGxfdmlkZW9fdXJicyhwZWFzeWNhcCkpIHsKLQkJCQlTQVkoIkVSUk9SOiBraWxsX3ZpZGVvX3VyYnMoKSBmYWlsZWRcbiIpOwotCQkJCXJldHVybiAtRUZBVUxUOwotCQkJfQotCQkJSk9UKDQsICJmcmVlaW5nIHZpZGVvX2RldmljZSBzdHJ1Y3R1cmU6ICIgXAotCQkJCQkJCSIvZGV2L3ZpZGVvJWlcbiIsIGkpOwotCQkJa2ZyZWUoKHZvaWQgKilwdmlkZW9fZGV2aWNlKTsKLQkJCWZvciAoaiA9IGk7ICBqIDwgKFZJREVPX0RFVklDRV9NQU5ZIC0gMSk7ICBqKyspCi0JCQkJcHZpZGVvX2FycmF5W2pdID0gcHZpZGVvX2FycmF5W2ogKyAxXTsKLQkJCXZpZGVvX2RldmljZV9tYW55LS07ICBrKys7Ci0JCQlicmVhazsKLQkJfQotCX0KLX0KLWlmICghaykgewotCVNBWSgiRVJST1I6IGxvc3QgdmlkZW9fZGV2aWNlIHN0cnVjdHVyZSBmb3IgJWk9bWlub3JcbiIsIHB2ZC0+bWlub3IpOwotCVNBWSgiY2Fubm90IGZyZWU6IG1heSBjYXVzZSBtZW1vcnkgbGVha1xuIik7CitwZWFzeWNhcCA9IHZpZGVvX2dldF9kcnZkYXRhKHB2aWRlb19kZXZpY2UpOworaWYgKE5VTEwgPT0gcGVhc3ljYXApIHsKKwlTQVkoIkVSUk9SOiAgcGVhc3ljYXAgaXMgTlVMTFxuIik7CiAJU0FZKCJlbmRpbmcgdW5zdWNjZXNzZnVsbHlcbiIpOwogCXJldHVybiAtRUZBVUxUOwogfQotCi1KT1QoNCwgImVuZGluZyBzdWNjZXNzZnVsbHlcbiIpOworaWYgKG1lbWNtcCgmcGVhc3ljYXAtPnRlbGx0YWxlWzBdLCBURUxMVEFMRSwgc3RybGVuKFRFTExUQUxFKSkpIHsKKwlTQVkoIkVSUk9SOiBiYWQgcGVhc3ljYXA6IDB4JTA4bFhcbiIsICh1bnNpZ25lZCBsb25nIGludCkgcGVhc3ljYXApOworCXJldHVybiAtRUZBVUxUOworfQoraWYgKDAgIT0ga2lsbF92aWRlb191cmJzKHBlYXN5Y2FwKSkgeworCVNBTSgiRVJST1I6IGtpbGxfdmlkZW9fdXJicygpIGZhaWxlZFxuIik7CisJcmV0dXJuIC1FRkFVTFQ7Cit9CitKT00oNCwgImVuZGluZyBzdWNjZXNzZnVsbHlcbiIpOwogcmV0dXJuIDA7CiB9CiAjZW5kaWYgLypFQVNZQ0FQX0lTX1ZJREVPREVWX0NMSUVOVCovCi0vKl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLypeXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl4qLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKgotICogIFRISVMgRlVOQ1RJT04gSVMgQ0FMTEVEIEZST00gV0lUSElOIGVhc3ljYXBfdXNiX2Rpc2Nvbm5lY3QoKS4KLSAqICBCWSBUSElTIFNUQUdFIFRIRSBERVZJQ0UgSEFTIEFMUkVBRFkgQkVFTiBQSFlTSUNBTExZIFVOUExVR0dFRC4KLSAqICBwZWFzeWNhcC0+cHVzYl9kZXZpY2UgSVMgTk8gTE9OR0VSIFZBTElEIEFORCBTSE9VTEQgSEFWRSBCRUVOIFNFVCBUTyBOVUxMLgorICogIFRISVMgRlVOQ1RJT04gSVMgQ0FMTEVEIEZST00gV0lUSElOIGVhc3ljYXBfdXNiX2Rpc2Nvbm5lY3QoKSBBTkQgSVMKKyAqICBQUk9URUNURUQgQlkgU0VNQVBIT1JFUyBTRVQgQU5EIENMRUFSRUQgQlkgZWFzeWNhcF91c2JfZGlzY29ubmVjdCgpLgorICoKKyAqICBCWSBUSElTIFNUQUdFIFRIRSBERVZJQ0UgSEFTIEFMUkVBRFkgQkVFTiBQSFlTSUNBTExZIFVOUExVR0dFRCwgU08KKyAqICBwZWFzeWNhcC0+cHVzYl9kZXZpY2UgSVMgTk8gTE9OR0VSIFZBTElELgogICovCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiB2b2lkCiBlYXN5Y2FwX2RlbGV0ZShzdHJ1Y3Qga3JlZiAqcGtyZWYpCiB7Ci1pbnQgaywgbSwgbG9zdDsKK2ludCBrLCBtLCBnb25lLCBrZDsKIGludCBhbGxvY2F0aW9uX3ZpZGVvX3VyYiwgYWxsb2NhdGlvbl92aWRlb19wYWdlLCBhbGxvY2F0aW9uX3ZpZGVvX3N0cnVjdDsKIGludCBhbGxvY2F0aW9uX2F1ZGlvX3VyYiwgYWxsb2NhdGlvbl9hdWRpb19wYWdlLCBhbGxvY2F0aW9uX2F1ZGlvX3N0cnVjdDsKIGludCByZWdpc3RlcmVkX3ZpZGVvLCByZWdpc3RlcmVkX2F1ZGlvOwpAQCAtNjE3LDIyICs5MTAsMjcgQEAKIEpPVCg0LCAiXG4iKTsKIAogcGVhc3ljYXAgPSBjb250YWluZXJfb2YocGtyZWYsIHN0cnVjdCBlYXN5Y2FwLCBrcmVmKTsKLWlmICgoc3RydWN0IGVhc3ljYXAgKilOVUxMID09IHBlYXN5Y2FwKSB7Ci0JU0FZKCJFUlJPUjogcGVhc3ljYXAgaXMgTlVMTDogY2Fubm90IHBlcmZvcm0gZGVsZXRpb25zXG4iKTsKK2lmIChOVUxMID09IHBlYXN5Y2FwKSB7CisJU0FNKCJFUlJPUjogcGVhc3ljYXAgaXMgTlVMTDogY2Fubm90IHBlcmZvcm0gZGVsZXRpb25zXG4iKTsKIAlyZXR1cm47CiB9CitpZiAobWVtY21wKCZwZWFzeWNhcC0+dGVsbHRhbGVbMF0sIFRFTExUQUxFLCBzdHJsZW4oVEVMTFRBTEUpKSkgeworCVNBWSgiRVJST1I6IGJhZCBwZWFzeWNhcDogMHglMDhsWFxuIiwgKHVuc2lnbmVkIGxvbmcgaW50KSBwZWFzeWNhcCk7CisJcmV0dXJuOworfQora2QgPSBpc2RvbmdsZShwZWFzeWNhcCk7CiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKgogICogIEZSRUUgVklERU8uCiAgKi8KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIGlmICgoc3RydWN0IGxpc3RfaGVhZCAqKU5VTEwgIT0gcGVhc3ljYXAtPnB1cmJfdmlkZW9faGVhZCkgewotCUpPVCg0LCAiZnJlZWluZyB2aWRlbyB1cmJzXG4iKTsKKwlKT00oNCwgImZyZWVpbmcgdmlkZW8gdXJic1xuIik7CiAJbSA9IDA7CiAJbGlzdF9mb3JfZWFjaChwbGlzdF9oZWFkLCAocGVhc3ljYXAtPnB1cmJfdmlkZW9faGVhZCkpIHsKIAkJcGRhdGFfdXJiID0gbGlzdF9lbnRyeShwbGlzdF9oZWFkLCBzdHJ1Y3QgZGF0YV91cmIsIGxpc3RfaGVhZCk7CiAJCWlmIChOVUxMID09IHBkYXRhX3VyYikKLQkJCUpPVCg0LCAiRVJST1I6IHBkYXRhX3VyYiBpcyBOVUxMXG4iKTsKKwkJCUpPTSg0LCAiRVJST1I6IHBkYXRhX3VyYiBpcyBOVUxMXG4iKTsKIAkJZWxzZSB7CiAJCQlpZiAoKHN0cnVjdCB1cmIgKilOVUxMICE9IHBkYXRhX3VyYi0+cHVyYikgewogCQkJCXVzYl9mcmVlX3VyYihwZGF0YV91cmItPnB1cmIpOwpAQCAtNjQzLDkgKzk0MSw5IEBACiAJCX0KIAl9CiAKLQlKT1QoNCwgIiVpIHZpZGVvIHVyYnMgZnJlZWRcbiIsIG0pOworCUpPTSg0LCAiJWkgdmlkZW8gdXJicyBmcmVlZFxuIiwgbSk7CiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0JSk9UKDQsICJmcmVlaW5nIHZpZGVvIGRhdGFfdXJiIHN0cnVjdHVyZXMuXG4iKTsKKwlKT00oNCwgImZyZWVpbmcgdmlkZW8gZGF0YV91cmIgc3RydWN0dXJlcy5cbiIpOwogCW0gPSAwOwogCWxpc3RfZm9yX2VhY2hfc2FmZShwbGlzdF9oZWFkLCBwbGlzdF9uZXh0LCBwZWFzeWNhcC0+cHVyYl92aWRlb19oZWFkKSB7CiAJCXBkYXRhX3VyYiA9IGxpc3RfZW50cnkocGxpc3RfaGVhZCwgc3RydWN0IGRhdGFfdXJiLCBsaXN0X2hlYWQpOwpAQCAtNjU2LDE0ICs5NTQsMTIgQEAKIAkJCW0rKzsKIAkJfQogCX0KLQlKT1QoNCwgIiVpIHZpZGVvIGRhdGFfdXJiIHN0cnVjdHVyZXMgZnJlZWRcbiIsIG0pOwotCUpPVCg0LCAic2V0dGluZyBwZWFzeWNhcC0+cHVyYl92aWRlb19oZWFkPU5VTExcbiIpOworCUpPTSg0LCAiJWkgdmlkZW8gZGF0YV91cmIgc3RydWN0dXJlcyBmcmVlZFxuIiwgbSk7CisJSk9NKDQsICJzZXR0aW5nIHBlYXN5Y2FwLT5wdXJiX3ZpZGVvX2hlYWQ9TlVMTFxuIik7CiAJcGVhc3ljYXAtPnB1cmJfdmlkZW9faGVhZCA9IChzdHJ1Y3QgbGlzdF9oZWFkICopTlVMTDsKLQl9IGVsc2UgewotSk9UKDQsICJwZWFzeWNhcC0+cHVyYl92aWRlb19oZWFkIGlzIE5VTExcbiIpOwogfQogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotSk9UKDQsICJmcmVlaW5nIHZpZGVvIGlzb2MgYnVmZmVycy5cbiIpOworSk9NKDQsICJmcmVlaW5nIHZpZGVvIGlzb2MgYnVmZmVycy5cbiIpOwogbSA9IDA7CiBmb3IgKGsgPSAwOyAgayA8IFZJREVPX0lTT0NfQlVGRkVSX01BTlk7ICBrKyspIHsKIAlpZiAoKHZvaWQgKilOVUxMICE9IHBlYXN5Y2FwLT52aWRlb19pc29jX2J1ZmZlcltrXS5wZ28pIHsKQEAgLTY3NiwxMCArOTcyLDEwIEBACiAJCW0rKzsKIAl9CiB9Ci1KT1QoNCwgImlzb2MgdmlkZW8gYnVmZmVycyBmcmVlZDogJWkgcGFnZXNcbiIsIG0gKiAoMHgwMSA8PCBWSURFT19JU09DX09SREVSKSk7CitKT00oNCwgImlzb2MgdmlkZW8gYnVmZmVycyBmcmVlZDogJWkgcGFnZXNcbiIsIG0gKiAoMHgwMSA8PCBWSURFT19JU09DX09SREVSKSk7CiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1KT1QoNCwgImZyZWVpbmcgdmlkZW8gZmllbGQgYnVmZmVycy5cbiIpOwotbG9zdCA9IDA7CitKT00oNCwgImZyZWVpbmcgdmlkZW8gZmllbGQgYnVmZmVycy5cbiIpOworZ29uZSA9IDA7CiBmb3IgKGsgPSAwOyAgayA8IEZJRUxEX0JVRkZFUl9NQU5ZOyAgaysrKSB7CiAJZm9yIChtID0gMDsgIG0gPCBGSUVMRF9CVUZGRVJfU0laRS9QQUdFX1NJWkU7ICBtKyspIHsKIAkJaWYgKCh2b2lkICopTlVMTCAhPSBwZWFzeWNhcC0+ZmllbGRfYnVmZmVyW2tdW21dLnBnbykgewpAQCAtNjg3LDE0ICs5ODMsMTQgQEAKIAkJCQkJKHBlYXN5Y2FwLT5maWVsZF9idWZmZXJba11bbV0ucGdvKSk7CiAJCQlwZWFzeWNhcC0+ZmllbGRfYnVmZmVyW2tdW21dLnBnbyA9ICh2b2lkICopTlVMTDsKIAkJCXBlYXN5Y2FwLT5hbGxvY2F0aW9uX3ZpZGVvX3BhZ2UgLT0gMTsKLQkJCWxvc3QrKzsKKwkJCWdvbmUrKzsKIAkJfQogCX0KIH0KLUpPVCg0LCAidmlkZW8gZmllbGQgYnVmZmVycyBmcmVlZDogJWkgcGFnZXNcbiIsIGxvc3QpOworSk9NKDQsICJ2aWRlbyBmaWVsZCBidWZmZXJzIGZyZWVkOiAlaSBwYWdlc1xuIiwgZ29uZSk7CiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1KT1QoNCwgImZyZWVpbmcgdmlkZW8gZnJhbWUgYnVmZmVycy5cbiIpOwotbG9zdCA9IDA7CitKT00oNCwgImZyZWVpbmcgdmlkZW8gZnJhbWUgYnVmZmVycy5cbiIpOworZ29uZSA9IDA7CiBmb3IgKGsgPSAwOyAgayA8IEZSQU1FX0JVRkZFUl9NQU5ZOyAgaysrKSB7CiAJZm9yIChtID0gMDsgIG0gPCBGUkFNRV9CVUZGRVJfU0laRS9QQUdFX1NJWkU7ICBtKyspIHsKIAkJaWYgKCh2b2lkICopTlVMTCAhPSBwZWFzeWNhcC0+ZnJhbWVfYnVmZmVyW2tdW21dLnBnbykgewpAQCAtNzAyLDIzICs5OTgsMjMgQEAKIAkJCQkJKHBlYXN5Y2FwLT5mcmFtZV9idWZmZXJba11bbV0ucGdvKSk7CiAJCQlwZWFzeWNhcC0+ZnJhbWVfYnVmZmVyW2tdW21dLnBnbyA9ICh2b2lkICopTlVMTDsKIAkJCXBlYXN5Y2FwLT5hbGxvY2F0aW9uX3ZpZGVvX3BhZ2UgLT0gMTsKLQkJCWxvc3QrKzsKKwkJCWdvbmUrKzsKIAkJfQogCX0KIH0KLUpPVCg0LCAidmlkZW8gZnJhbWUgYnVmZmVycyBmcmVlZDogJWkgcGFnZXNcbiIsIGxvc3QpOworSk9NKDQsICJ2aWRlbyBmcmFtZSBidWZmZXJzIGZyZWVkOiAlaSBwYWdlc1xuIiwgZ29uZSk7CiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKgogICogIEZSRUUgQVVESU8uCiAgKi8KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIGlmICgoc3RydWN0IGxpc3RfaGVhZCAqKU5VTEwgIT0gcGVhc3ljYXAtPnB1cmJfYXVkaW9faGVhZCkgewotCUpPVCg0LCAiZnJlZWluZyBhdWRpbyB1cmJzXG4iKTsKKwlKT00oNCwgImZyZWVpbmcgYXVkaW8gdXJic1xuIik7CiAJbSA9IDA7CiAJbGlzdF9mb3JfZWFjaChwbGlzdF9oZWFkLCAocGVhc3ljYXAtPnB1cmJfYXVkaW9faGVhZCkpIHsKIAkJcGRhdGFfdXJiID0gbGlzdF9lbnRyeShwbGlzdF9oZWFkLCBzdHJ1Y3QgZGF0YV91cmIsIGxpc3RfaGVhZCk7CiAJCWlmIChOVUxMID09IHBkYXRhX3VyYikKLQkJCUpPVCg0LCAiRVJST1I6IHBkYXRhX3VyYiBpcyBOVUxMXG4iKTsKKwkJCUpPTSg0LCAiRVJST1I6IHBkYXRhX3VyYiBpcyBOVUxMXG4iKTsKIAkJZWxzZSB7CiAJCQlpZiAoKHN0cnVjdCB1cmIgKilOVUxMICE9IHBkYXRhX3VyYi0+cHVyYikgewogCQkJCXVzYl9mcmVlX3VyYihwZGF0YV91cmItPnB1cmIpOwpAQCAtNzI4LDkgKzEwMjQsOSBAQAogCQkJfQogCQl9CiAJfQotCUpPVCg0LCAiJWkgYXVkaW8gdXJicyBmcmVlZFxuIiwgbSk7CisJSk9NKDQsICIlaSBhdWRpbyB1cmJzIGZyZWVkXG4iLCBtKTsKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQlKT1QoNCwgImZyZWVpbmcgYXVkaW8gZGF0YV91cmIgc3RydWN0dXJlcy5cbiIpOworCUpPTSg0LCAiZnJlZWluZyBhdWRpbyBkYXRhX3VyYiBzdHJ1Y3R1cmVzLlxuIik7CiAJbSA9IDA7CiAJbGlzdF9mb3JfZWFjaF9zYWZlKHBsaXN0X2hlYWQsIHBsaXN0X25leHQsIHBlYXN5Y2FwLT5wdXJiX2F1ZGlvX2hlYWQpIHsKIAkJcGRhdGFfdXJiID0gbGlzdF9lbnRyeShwbGlzdF9oZWFkLCBzdHJ1Y3QgZGF0YV91cmIsIGxpc3RfaGVhZCk7CkBAIC03NDEsMTQgKzEwMzcsMTIgQEAKIAkJCW0rKzsKIAkJfQogCX0KLUpPVCg0LCAiJWkgYXVkaW8gZGF0YV91cmIgc3RydWN0dXJlcyBmcmVlZFxuIiwgbSk7Ci1KT1QoNCwgInNldHRpbmcgcGVhc3ljYXAtPnB1cmJfYXVkaW9faGVhZD1OVUxMXG4iKTsKK0pPTSg0LCAiJWkgYXVkaW8gZGF0YV91cmIgc3RydWN0dXJlcyBmcmVlZFxuIiwgbSk7CitKT00oNCwgInNldHRpbmcgcGVhc3ljYXAtPnB1cmJfYXVkaW9faGVhZD1OVUxMXG4iKTsKIHBlYXN5Y2FwLT5wdXJiX2F1ZGlvX2hlYWQgPSAoc3RydWN0IGxpc3RfaGVhZCAqKU5VTEw7Ci19IGVsc2UgewotSk9UKDQsICJwZWFzeWNhcC0+cHVyYl9hdWRpb19oZWFkIGlzIE5VTExcbiIpOwogfQogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotSk9UKDQsICJmcmVlaW5nIGF1ZGlvIGlzb2MgYnVmZmVycy5cbiIpOworSk9NKDQsICJmcmVlaW5nIGF1ZGlvIGlzb2MgYnVmZmVycy5cbiIpOwogbSA9IDA7CiBmb3IgKGsgPSAwOyAgayA8IEFVRElPX0lTT0NfQlVGRkVSX01BTlk7ICBrKyspIHsKIAlpZiAoKHZvaWQgKilOVUxMICE9IHBlYXN5Y2FwLT5hdWRpb19pc29jX2J1ZmZlcltrXS5wZ28pIHsKQEAgLTc2MSwyMiArMTA1NSwyMiBAQAogCQltKys7CiAJfQogfQotSk9UKDQsICJlYXN5c25kX2RlbGV0ZSgpOiBpc29jIGF1ZGlvIGJ1ZmZlcnMgZnJlZWQ6ICVpIHBhZ2VzXG4iLCBcCitKT00oNCwgImVhc3lzbmRfZGVsZXRlKCk6IGlzb2MgYXVkaW8gYnVmZmVycyBmcmVlZDogJWkgcGFnZXNcbiIsIFwKIAkJCQkJbSAqICgweDAxIDw8IEFVRElPX0lTT0NfT1JERVIpKTsKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLUpPVCg0LCAiZnJlZWluZyBhdWRpbyBidWZmZXJzLlxuIik7Ci1sb3N0ID0gMDsKK0pPTSg0LCAiZnJlZWluZyBhdWRpbyBidWZmZXJzLlxuIik7Citnb25lID0gMDsKIGZvciAoayA9IDA7ICBrIDwgcGVhc3ljYXAtPmF1ZGlvX2J1ZmZlcl9wYWdlX21hbnk7ICBrKyspIHsKIAlpZiAoKHZvaWQgKilOVUxMICE9IHBlYXN5Y2FwLT5hdWRpb19idWZmZXJba10ucGdvKSB7CiAJCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZykocGVhc3ljYXAtPmF1ZGlvX2J1ZmZlcltrXS5wZ28pKTsKIAkJcGVhc3ljYXAtPmF1ZGlvX2J1ZmZlcltrXS5wZ28gPSAodm9pZCAqKU5VTEw7CiAJCXBlYXN5Y2FwLT5hbGxvY2F0aW9uX2F1ZGlvX3BhZ2UgLT0gMTsKLQkJbG9zdCsrOworCQlnb25lKys7CiAJfQogfQotSk9UKDQsICJlYXN5c25kX2RlbGV0ZSgpOiBhdWRpbyBidWZmZXJzIGZyZWVkOiAlaSBwYWdlc1xuIiwgbG9zdCk7CitKT00oNCwgImVhc3lzbmRfZGVsZXRlKCk6IGF1ZGlvIGJ1ZmZlcnMgZnJlZWQ6ICVpIHBhZ2VzXG4iLCBnb25lKTsKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLUpPVCg0LCAiZnJlZWluZyBlYXN5Y2FwIHN0cnVjdHVyZS5cbiIpOworSk9NKDQsICJmcmVlaW5nIGVhc3ljYXAgc3RydWN0dXJlLlxuIik7CiBhbGxvY2F0aW9uX3ZpZGVvX3VyYiAgICA9IHBlYXN5Y2FwLT5hbGxvY2F0aW9uX3ZpZGVvX3VyYjsKIGFsbG9jYXRpb25fdmlkZW9fcGFnZSAgID0gcGVhc3ljYXAtPmFsbG9jYXRpb25fdmlkZW9fcGFnZTsKIGFsbG9jYXRpb25fdmlkZW9fc3RydWN0ID0gcGVhc3ljYXAtPmFsbG9jYXRpb25fdmlkZW9fc3RydWN0OwpAQCAtNzg1LDE1ICsxMDc5LDE2IEBACiBhbGxvY2F0aW9uX2F1ZGlvX3BhZ2UgICA9IHBlYXN5Y2FwLT5hbGxvY2F0aW9uX2F1ZGlvX3BhZ2U7CiBhbGxvY2F0aW9uX2F1ZGlvX3N0cnVjdCA9IHBlYXN5Y2FwLT5hbGxvY2F0aW9uX2F1ZGlvX3N0cnVjdDsKIHJlZ2lzdGVyZWRfYXVkaW8gICAgICAgID0gcGVhc3ljYXAtPnJlZ2lzdGVyZWRfYXVkaW87Ci1tID0gMDsKLWlmICgoc3RydWN0IGVhc3ljYXAgKilOVUxMICE9IHBlYXN5Y2FwKSB7Ci0Ja2ZyZWUocGVhc3ljYXApOyAgcGVhc3ljYXAgPSAoc3RydWN0IGVhc3ljYXAgKilOVUxMOwotCWFsbG9jYXRpb25fdmlkZW9fc3RydWN0IC09IHNpemVvZihzdHJ1Y3QgZWFzeWNhcCk7Ci0JbSsrOwotfQotSk9UKDQsICIlaSBlYXN5Y2FwIHN0cnVjdHVyZSBmcmVlZFxuIiwgbSk7Ci0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKK2tmcmVlKHBlYXN5Y2FwKTsKK2lmICgwIDw9IGtkICYmIERPTkdMRV9NQU5ZID4ga2QpIHsKKwllYXN5Y2FwX2RvbmdsZVtrZF0ucGVhc3ljYXAgPSAoc3RydWN0IGVhc3ljYXAgKilOVUxMOworCUpPVCg0LCAiICAgbnVsbC0tPmVhc3ljYXBfZG9uZ2xlWyVpXS5wZWFzeWNhcFxuIiwga2QpOworCWFsbG9jYXRpb25fdmlkZW9fc3RydWN0IC09IHNpemVvZihzdHJ1Y3QgZWFzeWNhcCk7Cit9IGVsc2UgeworCVNBWSgiRVJST1I6IGNhbm5vdCBwdXJnZSBlYXN5Y2FwX2RvbmdsZVtdLnBlYXN5Y2FwIik7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiBTQVkoIiU4aT0gdmlkZW8gdXJicyAgICAgYWZ0ZXIgYWxsIGRlbGV0aW9uc1xuIiwgYWxsb2NhdGlvbl92aWRlb191cmIpOwogU0FZKCIlOGk9IHZpZGVvIHBhZ2VzICAgIGFmdGVyIGFsbCBkZWxldGlvbnNcbiIsIGFsbG9jYXRpb25fdmlkZW9fcGFnZSk7CiBTQVkoIiU4aT0gdmlkZW8gc3RydWN0cyAgYWZ0ZXIgYWxsIGRlbGV0aW9uc1xuIiwgYWxsb2NhdGlvbl92aWRlb19zdHJ1Y3QpOwpAQCAtODEwLDI3ICsxMTA1LDg1IEBACiB1bnNpZ25lZCBpbnQgZWFzeWNhcF9wb2xsKHN0cnVjdCBmaWxlICpmaWxlLCBwb2xsX3RhYmxlICp3YWl0KQogewogc3RydWN0IGVhc3ljYXAgKnBlYXN5Y2FwOworaW50IHJjLCBrZDsKIAogSk9UKDgsICJcbiIpOwogCiBpZiAoTlVMTCA9PSAoKHBvbGxfdGFibGUgKil3YWl0KSkKIAlKT1QoOCwgIldBUk5JTkc6ICBwb2xsIHRhYmxlIHBvaW50ZXIgaXMgTlVMTCAuLi4gY29udGludWluZ1xuIik7Ci1pZiAoTlVMTCA9PSAoKHN0cnVjdCBmaWxlICopZmlsZSkpIHsKK2lmICgoc3RydWN0IGZpbGUgKilOVUxMID09IGZpbGUpIHsKIAlTQVkoIkVSUk9SOiAgZmlsZSBwb2ludGVyIGlzIE5VTExcbiIpOwotCXJldHVybiAtRUZBVUxUOworCXJldHVybiAtRVJFU1RBUlRTWVM7CiB9CiBwZWFzeWNhcCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKIGlmIChOVUxMID09IHBlYXN5Y2FwKSB7CiAJU0FZKCJFUlJPUjogIHBlYXN5Y2FwIGlzIE5VTExcbiIpOwogCXJldHVybiAtRUZBVUxUOwogfQoraWYgKG1lbWNtcCgmcGVhc3ljYXAtPnRlbGx0YWxlWzBdLCBURUxMVEFMRSwgc3RybGVuKFRFTExUQUxFKSkpIHsKKwlTQVkoIkVSUk9SOiBiYWQgcGVhc3ljYXA6IDB4JTA4bFhcbiIsICh1bnNpZ25lZCBsb25nIGludCkgcGVhc3ljYXApOworCXJldHVybiAtRUZBVUxUOworfQoraWYgKE5VTEwgPT0gcGVhc3ljYXAtPnB1c2JfZGV2aWNlKSB7CisJU0FZKCJFUlJPUjogIHBlYXN5Y2FwLT5wdXNiX2RldmljZSBpcyBOVUxMXG4iKTsKKwlyZXR1cm4gLUVGQVVMVDsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2tkID0gaXNkb25nbGUocGVhc3ljYXApOworaWYgKDAgPD0ga2QgJiYgRE9OR0xFX01BTlkgPiBrZCkgeworCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJmVhc3ljYXBfZG9uZ2xlW2tkXS5tdXRleF92aWRlbykpIHsKKwkJU0FZKCJFUlJPUjogY2Fubm90IGRvd24gZWFzeWNhcF9kb25nbGVbJWldLm11dGV4X3ZpZGVvXG4iLCBrZCk7CisJCXJldHVybiAtRVJFU1RBUlRTWVM7CisJfQorCUpPTSg0LCAibG9ja2VkIGVhc3ljYXBfZG9uZ2xlWyVpXS5tdXRleF92aWRlb1xuIiwga2QpOworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJLyoKKwkgKiAgTUVBTldISUxFLCBlYXN5Y2FwX3VzYl9kaXNjb25uZWN0KCkgTUFZIEhBVkUgRlJFRUQgUE9JTlRFUgorCSAqICBwZWFzeWNhcCwgSU4gV0hJQ0ggQ0FTRSBBIFJFUEVBVCBDQUxMIFRPIGlzZG9uZ2xlKCkgV0lMTCBGQUlMLgorCSAqICBJRiBORUNFU1NBUlksIEJBSUwgT1VULgorCSovCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwlpZiAoa2QgIT0gaXNkb25nbGUocGVhc3ljYXApKQorCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCWlmIChOVUxMID09IGZpbGUpIHsKKwkJU0FZKCJFUlJPUjogIGZpbGUgaXMgTlVMTFxuIik7CisJCW11dGV4X3VubG9jaygmZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X3ZpZGVvKTsKKwkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKwl9CisJcGVhc3ljYXAgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJaWYgKE5VTEwgPT0gcGVhc3ljYXApIHsKKwkJU0FZKCJFUlJPUjogIHBlYXN5Y2FwIGlzIE5VTExcbiIpOworCQltdXRleF91bmxvY2soJmVhc3ljYXBfZG9uZ2xlW2tkXS5tdXRleF92aWRlbyk7CisJCXJldHVybiAtRVJFU1RBUlRTWVM7CisJfQorCWlmIChtZW1jbXAoJnBlYXN5Y2FwLT50ZWxsdGFsZVswXSwgVEVMTFRBTEUsIHN0cmxlbihURUxMVEFMRSkpKSB7CisJCVNBWSgiRVJST1I6IGJhZCBwZWFzeWNhcDogMHglMDhsWFxuIiwgXAorCQkJCQkJKHVuc2lnbmVkIGxvbmcgaW50KSBwZWFzeWNhcCk7CisJCW11dGV4X3VubG9jaygmZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X3ZpZGVvKTsKKwkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKwl9CisJaWYgKE5VTEwgPT0gcGVhc3ljYXAtPnB1c2JfZGV2aWNlKSB7CisJCVNBTSgiRVJST1I6IHBlYXN5Y2FwLT5wdXNiX2RldmljZSBpcyBOVUxMXG4iKTsKKwkJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfdmlkZW8pOworCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCX0KK30gZWxzZQorCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJLyoKKwkgKiAgSUYgZWFzeWNhcF91c2JfZGlzY29ubmVjdCgpIEhBUyBBTFJFQURZIEZSRUVEIFBPSU5URVIgcGVhc3ljYXAKKwkgKiAgQkVGT1JFIFRIRSBBVFRFTVBUIFRPIEFDUVVJUkUgVEhFIFNFTUFQSE9SRSwgaXNkb25nbGUoKSBXSUxMCisJICogIEhBVkUgRkFJTEVELiAgQkFJTCBPVVQuCisJKi8KKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCXJldHVybiAtRVJFU1RBUlRTWVM7CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCityYyA9IGVhc3ljYXBfZHFidWYocGVhc3ljYXAsIDApOwogcGVhc3ljYXAtPnBvbGxlZCA9IDE7Ci0KLWlmICgwID09IGVhc3ljYXBfZHFidWYocGVhc3ljYXAsIDApKQorbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfdmlkZW8pOworaWYgKDAgPT0gcmMpCiAJcmV0dXJuIFBPTExJTiB8IFBPTExSRE5PUk07CiBlbHNlCiAJcmV0dXJuIFBPTExFUlI7Ci0KIH0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KQEAgLTg0MSw3ICsxMTk0LDcgQEAKIGludAogZWFzeWNhcF9kcWJ1ZihzdHJ1Y3QgZWFzeWNhcCAqcGVhc3ljYXAsIGludCBtb2RlKQogewotaW50IG1pc3MsIHJjOworaW50IGlucHV0LCBpZmllbGQsIG1pc3MsIHJjOwogCiBKT1QoOCwgIlxuIik7CiAKQEAgLTg0OSwxMjkgKzEyMDIsMTg4IEBACiAJU0FZKCJFUlJPUjogIHBlYXN5Y2FwIGlzIE5VTExcbiIpOwogCXJldHVybiAtRUZBVUxUOwogfQoraWYgKE5VTEwgPT0gcGVhc3ljYXAtPnB1c2JfZGV2aWNlKSB7CisJU0FZKCJFUlJPUjogIHBlYXN5Y2FwLT5wdXNiX2RldmljZSBpcyBOVUxMXG4iKTsKKwlyZXR1cm4gLUVGQVVMVDsKK30KK2lmaWVsZCA9IDA7CitKT00oOCwgIiVpPWlmaWVsZFxuIiwgaWZpZWxkKTsKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8qCi0gKiAgV0FJVCBGT1IgRklFTEQgMAorICogIENIRUNLIEZPUiBMT1NUIElOUFVUIFNJR05BTC4KKyAqCisgKiAgRk9SIFRIRSBGT1VSLUNWQlMgRWFzeUNBUCwgVEhJUyBET0VTIE5PVCBXT1JLIEFTIEVYUEVDVEVELgorICogIElGIElOUFVUIDAgSVMgUFJFU0VOVCBBTkQgU1lOQyBBQ1FVSVJFRCwgVU5QTFVHR0lORyBJTlBVVCA0IERPRVMgTk9UCisgKiAgUkVTVUxUIElOIFNFVFRJTkcgQklUIDB4NDAgT04gUkVHSVNURVIgMHgxRiwgUFJFU1VNQUJMWSBCRUNBVVNFIFRIRVJFCisgKiAgSVMgRkxZV0hFRUxJTkcgT04gSU5QVVQgMC4gIFRIRSBVUFNIT1QgSVM6CisgKgorICogICAgSU5QVVQgMCAgIFBMVUdHRUQsIElOUFVUIDQgICBQTFVHR0VEID0+IFNDUkVFTiAwIE9LLCAgIFNDUkVFTiA0IE9LCisgKiAgICBJTlBVVCAwICAgUExVR0dFRCwgSU5QVVQgNCBVTlBMVUdHRUQgPT4gU0NSRUVOIDAgT0ssICAgU0NSRUVOIDQgQkxBQ0sKKyAqICAgIElOUFVUIDAgVU5QTFVHR0VELCBJTlBVVCA0ICAgUExVR0dFRCA9PiBTQ1JFRU4gMCBCQVJTLCBTQ1JFRU4gNCBPSworICogICAgSU5QVVQgMCBVTlBMVUdHRUQsIElOUFVUIDQgVU5QTFVHR0VEID0+IFNDUkVFTiAwIEJBUlMsIFNDUkVFTiA0IEJBUlMKKyovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitpbnB1dCA9IHBlYXN5Y2FwLT5pbnB1dDsKK2lmICgwIDw9IGlucHV0ICYmIElOUFVUX01BTlkgPiBpbnB1dCkgeworCXJjID0gcmVhZF9zYWEocGVhc3ljYXAtPnB1c2JfZGV2aWNlLCAweDFGKTsKKwlpZiAoMCA8PSByYykgeworCQlpZiAocmMgJiAweDQwKQorCQkJcGVhc3ljYXAtPmxvc3RbaW5wdXRdICs9IDE7CisJCWVsc2UKKwkJCXBlYXN5Y2FwLT5sb3N0W2lucHV0XSAtPSAyOworCisJaWYgKDAgPiBwZWFzeWNhcC0+bG9zdFtpbnB1dF0pCisJCXBlYXN5Y2FwLT5sb3N0W2lucHV0XSA9IDA7CisJZWxzZSBpZiAoKDIgKiBWSURFT19MT1NUX1RPTEVSQVRFKSA8IHBlYXN5Y2FwLT5sb3N0W2lucHV0XSkKKwkJcGVhc3ljYXAtPmxvc3RbaW5wdXRdID0gKDIgKiBWSURFT19MT1NUX1RPTEVSQVRFKTsKKwl9Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogIFdBSVQgRk9SIEZJRUxEIGlmaWVsZCAgKDAgPT4gVE9QLCAxID0+IEJPVFRPTSkKICAqLwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogbWlzcyA9IDA7Ci1pZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCYocGVhc3ljYXAtPm11dGV4X21tYXBfdmlkZW9bMF0pKSkKLQlyZXR1cm4gLUVSRVNUQVJUU1lTOwogd2hpbGUgKChwZWFzeWNhcC0+ZmllbGRfcmVhZCA9PSBwZWFzeWNhcC0+ZmllbGRfZmlsbCkgfHwgXAogCQkJCSgwICE9ICgweEZGMDAgJiBwZWFzeWNhcC0+ZmllbGRfYnVmZmVyXAogCQkJCQlbcGVhc3ljYXAtPmZpZWxkX3JlYWRdWzBdLmtvdW50KSkgfHwgXAotCQkJCSgwICE9ICgweDAwRkYgJiBwZWFzeWNhcC0+ZmllbGRfYnVmZmVyXAorCQkJCShpZmllbGQgIT0gKDB4MDBGRiAmIHBlYXN5Y2FwLT5maWVsZF9idWZmZXJcCiAJCQkJCVtwZWFzeWNhcC0+ZmllbGRfcmVhZF1bMF0ua291bnQpKSkgewotCW11dGV4X3VubG9jaygmKHBlYXN5Y2FwLT5tdXRleF9tbWFwX3ZpZGVvWzBdKSk7Ci0KIAlpZiAobW9kZSkKIAkJcmV0dXJuIC1FQUdBSU47CiAKLQlKT1QoOCwgImZpcnN0IHdhaXQgIG9uIHdxX3ZpZGVvLCAiIFwKKwlKT00oOCwgImZpcnN0IHdhaXQgIG9uIHdxX3ZpZGVvLCAiIFwKIAkJCQkiJWk9ZmllbGRfcmVhZCAgJWk9ZmllbGRfZmlsbFxuIiwgXAogCQkJCXBlYXN5Y2FwLT5maWVsZF9yZWFkLCBwZWFzeWNhcC0+ZmllbGRfZmlsbCk7CiAKLQltc2xlZXAoMSk7CiAJaWYgKDAgIT0gKHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShwZWFzeWNhcC0+d3FfdmlkZW8sIFwKIAkJCShwZWFzeWNhcC0+dmlkZW9faWRsZSB8fCBwZWFzeWNhcC0+dmlkZW9fZW9mICB8fCBcCiAJCQkoKHBlYXN5Y2FwLT5maWVsZF9yZWFkICE9IHBlYXN5Y2FwLT5maWVsZF9maWxsKSAmJiBcCiAJCQkJKDAgPT0gKDB4RkYwMCAmIHBlYXN5Y2FwLT5maWVsZF9idWZmZXJcCiAJCQkJCVtwZWFzeWNhcC0+ZmllbGRfcmVhZF1bMF0ua291bnQpKSAmJiBcCi0JCQkJKDAgPT0gKDB4MDBGRiAmIHBlYXN5Y2FwLT5maWVsZF9idWZmZXJcCi0JCQkJCVtwZWFzeWNhcC0+ZmllbGRfcmVhZF1bMF0ua291bnQpKSkpKSkpewotCQlTQVkoImFib3J0ZWQgYnkgc2lnbmFsXG4iKTsKKwkJCQkoaWZpZWxkID09ICgweDAwRkYgJiBwZWFzeWNhcC0+ZmllbGRfYnVmZmVyXAorCQkJCQlbcGVhc3ljYXAtPmZpZWxkX3JlYWRdWzBdLmtvdW50KSkpKSkpKSB7CisJCVNBTSgiYWJvcnRlZCBieSBzaWduYWxcbiIpOwogCQlyZXR1cm4gLUVJTzsKIAkJfQogCWlmIChwZWFzeWNhcC0+dmlkZW9faWRsZSkgewotCQlKT1QoOCwgIiVpPXBlYXN5Y2FwLT52aWRlb19pZGxlXG4iLCBwZWFzeWNhcC0+dmlkZW9faWRsZSk7Ci0JCXJldHVybiAtRUlPOworCQlKT00oOCwgIiVpPXBlYXN5Y2FwLT52aWRlb19pZGxlIC4uLiByZXR1cm5pbmcgLUVBR0FJTlxuIiwgXAorCQkJCQkJCXBlYXN5Y2FwLT52aWRlb19pZGxlKTsKKwkJcmV0dXJuIC1FQUdBSU47CiAJfQogCWlmIChwZWFzeWNhcC0+dmlkZW9fZW9mKSB7Ci0JCUpPVCg4LCAiJWk9cGVhc3ljYXAtPnZpZGVvX2VvZlxuIiwgcGVhc3ljYXAtPnZpZGVvX2VvZik7Ci0JCWRlYnJpZWYocGVhc3ljYXApOworCQlKT00oOCwgIiVpPXBlYXN5Y2FwLT52aWRlb19lb2ZcbiIsIHBlYXN5Y2FwLT52aWRlb19lb2YpOworCQkjaWYgZGVmaW5lZChQRVJTRVZFUkUpCisJCWlmICgxID09IHBlYXN5Y2FwLT5zdGF0dXMpIHsKKwkJCUpPTSg4LCAicGVyc2V2ZXJpbmcgLi4uXG4iKTsKKwkJCXBlYXN5Y2FwLT52aWRlb19lb2YgPSAwOworCQkJcGVhc3ljYXAtPmF1ZGlvX2VvZiA9IDA7CisJCQlpZiAoMCAhPSByZXNldChwZWFzeWNhcCkpIHsKKwkJCQlKT00oOCwgIiAuLi4gZmFpbGVkIC4uLiByZXR1cm5pbmcgLUVJT1xuIik7CisJCQkJcGVhc3ljYXAtPnZpZGVvX2VvZiA9IDE7CisJCQkJcGVhc3ljYXAtPmF1ZGlvX2VvZiA9IDE7CisJCQkJa2lsbF92aWRlb191cmJzKHBlYXN5Y2FwKTsKKwkJCQlyZXR1cm4gLUVJTzsKKwkJCX0KKwkJCXBlYXN5Y2FwLT5zdGF0dXMgPSAwOworCQkJSk9NKDgsICIgLi4uIE9LIC4uLiByZXR1cm5pbmcgLUVBR0FJTlxuIik7CisJCQlyZXR1cm4gLUVBR0FJTjsKKwkJfQorCQkjZW5kaWYgLypQRVJTRVZFUkUqLworCQlwZWFzeWNhcC0+dmlkZW9fZW9mID0gMTsKKwkJcGVhc3ljYXAtPmF1ZGlvX2VvZiA9IDE7CiAJCWtpbGxfdmlkZW9fdXJicyhwZWFzeWNhcCk7CisJCUpPTSg4LCAicmV0dXJuaW5nIC1FSU9cbiIpOwogCQlyZXR1cm4gLUVJTzsKIAl9CiBtaXNzKys7Ci1pZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCYocGVhc3ljYXAtPm11dGV4X21tYXBfdmlkZW9bMF0pKSkKLQlyZXR1cm4gLUVSRVNUQVJUU1lTOwogfQotbXV0ZXhfdW5sb2NrKCYocGVhc3ljYXAtPm11dGV4X21tYXBfdmlkZW9bMF0pKTsKLUpPVCg4LCAiZmlyc3QgYXdha2VuaW5nIG9uIHdxX3ZpZGVvIGFmdGVyICVpIHdhaXRzXG4iLCBtaXNzKTsKK0pPTSg4LCAiZmlyc3QgYXdha2VuaW5nIG9uIHdxX3ZpZGVvIGFmdGVyICVpIHdhaXRzXG4iLCBtaXNzKTsKIAogcmMgPSBmaWVsZDJmcmFtZShwZWFzeWNhcCk7CiBpZiAoMCAhPSByYykKLQlTQVkoIkVSUk9SOiBmaWVsZDJmcmFtZSgpIHJldHVybmVkICVpXG4iLCByYyk7Ci0KLWlmICh0cnVlID09IHBlYXN5Y2FwLT5vZmZlcmZpZWxkcykgewotCXBlYXN5Y2FwLT5mcmFtZV9yZWFkID0gcGVhc3ljYXAtPmZyYW1lX2ZpbGw7Ci0JKHBlYXN5Y2FwLT5mcmFtZV9maWxsKSsrOwotCWlmIChwZWFzeWNhcC0+ZnJhbWVfYnVmZmVyX21hbnkgPD0gcGVhc3ljYXAtPmZyYW1lX2ZpbGwpCi0JCXBlYXN5Y2FwLT5mcmFtZV9maWxsID0gMDsKLQotCWlmICgweDAxICYgZWFzeWNhcF9zdGFuZGFyZFtwZWFzeWNhcC0+c3RhbmRhcmRfb2Zmc2V0XS5tYXNrKSB7Ci0JCXBlYXN5Y2FwLT5mcmFtZV9idWZmZXJbcGVhc3ljYXAtPmZyYW1lX3JlYWRdWzBdLmtvdW50ID0gXAotCQkJCQkJCVY0TDJfRklFTERfQk9UVE9NOwotCX0gZWxzZSB7Ci0JCXBlYXN5Y2FwLT5mcmFtZV9idWZmZXJbcGVhc3ljYXAtPmZyYW1lX3JlYWRdWzBdLmtvdW50ID0gXAotCQkJCQkJCVY0TDJfRklFTERfVE9QOwotCX0KLUpPVCg4LCAic2V0dGluZzogICAgJWk9cGVhc3ljYXAtPmZyYW1lX3JlYWRcbiIsIHBlYXN5Y2FwLT5mcmFtZV9yZWFkKTsKLUpPVCg4LCAiYnVtcGVkIHRvOiAgJWk9cGVhc3ljYXAtPmZyYW1lX2ZpbGxcbiIsIHBlYXN5Y2FwLT5mcmFtZV9maWxsKTsKLX0KKwlTQU0oIkVSUk9SOiBmaWVsZDJmcmFtZSgpIHJldHVybmVkICVpXG4iLCByYyk7CiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKgotICogIFdBSVQgRk9SIEZJRUxEIDEKKyAqICBXQUlUIEZPUiBUSEUgT1RIRVIgRklFTEQKICAqLwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworaWYgKGlmaWVsZCkKKwlpZmllbGQgPSAwOworZWxzZQorCWlmaWVsZCA9IDE7CiBtaXNzID0gMDsKLWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJihwZWFzeWNhcC0+bXV0ZXhfbW1hcF92aWRlb1swXSkpKQotCXJldHVybiAtRVJFU1RBUlRTWVM7CiB3aGlsZSAoKHBlYXN5Y2FwLT5maWVsZF9yZWFkID09IHBlYXN5Y2FwLT5maWVsZF9maWxsKSB8fCBcCiAJCQkJKDAgIT0gKDB4RkYwMCAmIHBlYXN5Y2FwLT5maWVsZF9idWZmZXJcCiAJCQkJCVtwZWFzeWNhcC0+ZmllbGRfcmVhZF1bMF0ua291bnQpKSB8fCBcCi0JCQkJKDAgPT0gKDB4MDBGRiAmIHBlYXN5Y2FwLT5maWVsZF9idWZmZXJcCisJCQkJKGlmaWVsZCAhPSAoMHgwMEZGICYgcGVhc3ljYXAtPmZpZWxkX2J1ZmZlclwKIAkJCQkJW3BlYXN5Y2FwLT5maWVsZF9yZWFkXVswXS5rb3VudCkpKSB7Ci0JbXV0ZXhfdW5sb2NrKCYocGVhc3ljYXAtPm11dGV4X21tYXBfdmlkZW9bMF0pKTsKLQogCWlmIChtb2RlKQogCQlyZXR1cm4gLUVBR0FJTjsKIAotCUpPVCg4LCAic2Vjb25kIHdhaXQgb24gd3FfdmlkZW8sICIgXAorCUpPTSg4LCAic2Vjb25kIHdhaXQgb24gd3FfdmlkZW8sICIgXAogCQkJCSIlaT1maWVsZF9yZWFkICAlaT1maWVsZF9maWxsXG4iLCBcCiAJCQkJcGVhc3ljYXAtPmZpZWxkX3JlYWQsIHBlYXN5Y2FwLT5maWVsZF9maWxsKTsKLQltc2xlZXAoMSk7CiAJaWYgKDAgIT0gKHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShwZWFzeWNhcC0+d3FfdmlkZW8sIFwKIAkJCShwZWFzeWNhcC0+dmlkZW9faWRsZSB8fCBwZWFzeWNhcC0+dmlkZW9fZW9mICB8fCBcCiAJCQkoKHBlYXN5Y2FwLT5maWVsZF9yZWFkICE9IHBlYXN5Y2FwLT5maWVsZF9maWxsKSAmJiBcCiAJCQkJKDAgPT0gKDB4RkYwMCAmIHBlYXN5Y2FwLT5maWVsZF9idWZmZXJcCiAJCQkJCVtwZWFzeWNhcC0+ZmllbGRfcmVhZF1bMF0ua291bnQpKSAmJiBcCi0JCQkJKDAgIT0gKDB4MDBGRiAmIHBlYXN5Y2FwLT5maWVsZF9idWZmZXJcCi0JCQkJCVtwZWFzeWNhcC0+ZmllbGRfcmVhZF1bMF0ua291bnQpKSkpKSkpewotCQlTQVkoImFib3J0ZWQgYnkgc2lnbmFsXG4iKTsKKwkJCQkoaWZpZWxkID09ICgweDAwRkYgJiBwZWFzeWNhcC0+ZmllbGRfYnVmZmVyXAorCQkJCQlbcGVhc3ljYXAtPmZpZWxkX3JlYWRdWzBdLlwKKwkJCQkJCQkJa291bnQpKSkpKSkpIHsKKwkJU0FNKCJhYm9ydGVkIGJ5IHNpZ25hbFxuIik7CiAJCXJldHVybiAtRUlPOwogCX0KIAlpZiAocGVhc3ljYXAtPnZpZGVvX2lkbGUpIHsKLQkJSk9UKDgsICIlaT1wZWFzeWNhcC0+dmlkZW9faWRsZVxuIiwgcGVhc3ljYXAtPnZpZGVvX2lkbGUpOwotCQlyZXR1cm4gLUVJTzsKKwkJSk9NKDgsICIlaT1wZWFzeWNhcC0+dmlkZW9faWRsZSAuLi4gcmV0dXJuaW5nIC1FQUdBSU5cbiIsIFwKKwkJCQkJCQlwZWFzeWNhcC0+dmlkZW9faWRsZSk7CisJCXJldHVybiAtRUFHQUlOOwogCX0KIAlpZiAocGVhc3ljYXAtPnZpZGVvX2VvZikgewotCQlKT1QoOCwgIiVpPXBlYXN5Y2FwLT52aWRlb19lb2ZcbiIsIHBlYXN5Y2FwLT52aWRlb19lb2YpOwotCQlkZWJyaWVmKHBlYXN5Y2FwKTsKKwkJSk9NKDgsICIlaT1wZWFzeWNhcC0+dmlkZW9fZW9mXG4iLCBwZWFzeWNhcC0+dmlkZW9fZW9mKTsKKwkJI2lmIGRlZmluZWQoUEVSU0VWRVJFKQorCQlpZiAoMSA9PSBwZWFzeWNhcC0+c3RhdHVzKSB7CisJCQlKT00oOCwgInBlcnNldmVyaW5nIC4uLlxuIik7CisJCQlwZWFzeWNhcC0+dmlkZW9fZW9mID0gMDsKKwkJCXBlYXN5Y2FwLT5hdWRpb19lb2YgPSAwOworCQkJaWYgKDAgIT0gcmVzZXQocGVhc3ljYXApKSB7CisJCQkJSk9NKDgsICIgLi4uIGZhaWxlZCAuLi4gcmV0dXJuaW5nIC1FSU9cbiIpOworCQkJCXBlYXN5Y2FwLT52aWRlb19lb2YgPSAxOworCQkJCXBlYXN5Y2FwLT5hdWRpb19lb2YgPSAxOworCQkJCWtpbGxfdmlkZW9fdXJicyhwZWFzeWNhcCk7CisJCQkJcmV0dXJuIC1FSU87CisJCQl9CisJCQlwZWFzeWNhcC0+c3RhdHVzID0gMDsKKwkJCUpPTSg4LCAiIC4uLiBPSyAuLi4gcmV0dXJuaW5nIC1FQUdBSU5cbiIpOworCQkJcmV0dXJuIC1FQUdBSU47CisJCX0KKwkJI2VuZGlmIC8qUEVSU0VWRVJFKi8KKwkJcGVhc3ljYXAtPnZpZGVvX2VvZiA9IDE7CisJCXBlYXN5Y2FwLT5hdWRpb19lb2YgPSAxOwogCQlraWxsX3ZpZGVvX3VyYnMocGVhc3ljYXApOworCQlKT00oOCwgInJldHVybmluZyAtRUlPXG4iKTsKIAkJcmV0dXJuIC1FSU87CiAJfQogbWlzcysrOwotaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmKHBlYXN5Y2FwLT5tdXRleF9tbWFwX3ZpZGVvWzBdKSkpCi0JcmV0dXJuIC1FUkVTVEFSVFNZUzsKIH0KLW11dGV4X3VubG9jaygmKHBlYXN5Y2FwLT5tdXRleF9tbWFwX3ZpZGVvWzBdKSk7Ci1KT1QoOCwgInNlY29uZCBhd2FrZW5pbmcgb24gd3FfdmlkZW8gYWZ0ZXIgJWkgd2FpdHNcbiIsIG1pc3MpOworSk9NKDgsICJzZWNvbmQgYXdha2VuaW5nIG9uIHdxX3ZpZGVvIGFmdGVyICVpIHdhaXRzXG4iLCBtaXNzKTsKIAogcmMgPSBmaWVsZDJmcmFtZShwZWFzeWNhcCk7CiBpZiAoMCAhPSByYykKLQlTQVkoIkVSUk9SOiBmaWVsZDJmcmFtZSgpIHJldHVybmVkICVpXG4iLCByYyk7Ci0KKwlTQU0oIkVSUk9SOiBmaWVsZDJmcmFtZSgpIHJldHVybmVkICVpXG4iLCByYyk7CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogIFdBU1RFIFRISVMgRlJBTUUKKyovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitpZiAoMCAhPSBwZWFzeWNhcC0+c2tpcCkgeworCXBlYXN5Y2FwLT5za2lwcGVkKys7CisJaWYgKHBlYXN5Y2FwLT5za2lwICE9IHBlYXN5Y2FwLT5za2lwcGVkKQorCQlyZXR1cm4gcGVhc3ljYXAtPnNraXAgLSBwZWFzeWNhcC0+c2tpcHBlZDsKKwlwZWFzeWNhcC0+c2tpcHBlZCA9IDA7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiBwZWFzeWNhcC0+ZnJhbWVfcmVhZCA9IHBlYXN5Y2FwLT5mcmFtZV9maWxsOwogcGVhc3ljYXAtPnF1ZXVlZFtwZWFzeWNhcC0+ZnJhbWVfcmVhZF0gPSAwOwogcGVhc3ljYXAtPmRvbmVbcGVhc3ljYXAtPmZyYW1lX3JlYWRdICAgPSBWNEwyX0JVRl9GTEFHX0RPTkU7CkBAIC05ODgsOCArMTQwMCw4IEBACiAJCQkJCQkJVjRMMl9GSUVMRF9CT1RUT007CiB9CiAKLUpPVCg4LCAic2V0dGluZzogICAgJWk9cGVhc3ljYXAtPmZyYW1lX3JlYWRcbiIsIHBlYXN5Y2FwLT5mcmFtZV9yZWFkKTsKLUpPVCg4LCAiYnVtcGVkIHRvOiAgJWk9cGVhc3ljYXAtPmZyYW1lX2ZpbGxcbiIsIHBlYXN5Y2FwLT5mcmFtZV9maWxsKTsKK0pPTSg4LCAic2V0dGluZzogICAgJWk9cGVhc3ljYXAtPmZyYW1lX3JlYWRcbiIsIHBlYXN5Y2FwLT5mcmFtZV9yZWFkKTsKK0pPTSg4LCAiYnVtcGVkIHRvOiAgJWk9cGVhc3ljYXAtPmZyYW1lX2ZpbGxcbiIsIHBlYXN5Y2FwLT5mcmFtZV9maWxsKTsKIAogcmV0dXJuIDA7CiB9CkBAIC0xMDAzLDE0ICsxNDE1LDEyIEBACiAgKiAgb2RkPT1mYWxzZSBJUyBUUkFOU0ZFUlJFRCBUTyBUSEUgRlJBTUUgQlVGRkVSLgogICoKICAqICBUSEUgQk9PTEVBTiBQQVJBTUVURVIgb2ZmZXJmaWVsZHMgSVMgdHJ1ZSBPTkxZIFdIRU4gVEhFIFVTRVIgUFJPR1JBTQotICogIENIT09TRVMgVEhFIE9QVElPTiBWNEwyX0ZJRUxEX0FMVEVSTkFURS4gIE5PIFVTRVJTUEFDRSBQUk9HUkFNIFRFU1RFRAotICogIFRPIERBVEUgSEFTIERPTkUgVEhJUy4gIEJVR1MgQVJFIExJS0VMWS4KKyAqICBDSE9PU0VTIFRIRSBPUFRJT04gVjRMMl9GSUVMRF9JTlRFUkxBQ0VELgogICovCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiBpbnQKIGZpZWxkMmZyYW1lKHN0cnVjdCBlYXN5Y2FwICpwZWFzeWNhcCkKIHsKLXN0YXRpYyBzdHJ1Y3QgdGltZXZhbCB0aW1ldmFsMDsKIHN0cnVjdCB0aW1ldmFsIHRpbWV2YWw7CiBsb25nIGxvbmcgaW50IGFib3ZlLCBiZWxvdzsKIF9fdTMyIHJlbWFpbmRlcjsKQEAgLTEwMTksMTYgKzE0MjksMjYgQEAKIHZvaWQgKnBleCwgKnBhZDsKIGludCBrZXgsIGthZCwgbWV4LCBtYWQsIHJleCwgcmFkLCByYWQyOwogaW50IGMyLCBjMywgdzIsIHczLCBjeiwgd3o7Ci1pbnQgcmMsIGJ5dGVzcGVycGl4ZWwsIG11bHRpcGxpZXIsIG11Y2gsIG1vcmUsIG92ZXIsIHJ1bXAsIGNhY2hlczsKK2ludCByYywgYnl0ZXNwZXJwaXhlbCwgbXVsdGlwbGllciwgbXVjaCwgbW9yZSwgb3ZlciwgcnVtcCwgY2FjaGVzLCBpbnB1dDsKIF9fdTggbWFzaywgbWFyZ2luOwotYm9vbCBvZGQsIGlzdXksIGRlY2ltYXRlcGl4ZWwsIG9mZmVyZmllbGRzOworYm9vbCBvZGQsIGlzdXksIGRlY2ltYXRlcGl4ZWwsIG9mZmVyZmllbGRzLCBiYWRpbnB1dDsKIAotSk9UKDgsICI9PT09PSAgcGFyaXR5ICVpLCBmaWVsZCBidWZmZXIgJWkgLS0+IGZyYW1lIGJ1ZmZlciAlaVxuIiwgXAoraWYgKE5VTEwgPT0gcGVhc3ljYXApIHsKKwlTQVkoIkVSUk9SOiBwZWFzeWNhcCBpcyBOVUxMXG4iKTsKKwlyZXR1cm4gLUVGQVVMVDsKK30KKworYmFkaW5wdXQgPSBmYWxzZTsKK2lucHV0ID0gMHgwNyAmIHBlYXN5Y2FwLT5maWVsZF9idWZmZXJbcGVhc3ljYXAtPmZpZWxkX3JlYWRdWzBdLmlucHV0OworCitKT00oOCwgIj09PT09ICBwYXJpdHkgJWksIGlucHV0IDB4JTAyWCwgZmllbGQgYnVmZmVyICVpIC0tPiAiIFwKKwkJCQkJCSJmcmFtZSBidWZmZXIgJWlcbiIsIFwKIAkJCXBlYXN5Y2FwLT5maWVsZF9idWZmZXJbcGVhc3ljYXAtPmZpZWxkX3JlYWRdWzBdLmtvdW50LFwKKwkJCXBlYXN5Y2FwLT5maWVsZF9idWZmZXJbcGVhc3ljYXAtPmZpZWxkX3JlYWRdWzBdLmlucHV0LFwKIAkJCXBlYXN5Y2FwLT5maWVsZF9yZWFkLCBwZWFzeWNhcC0+ZnJhbWVfZmlsbCk7Ci1KT1QoOCwgIj09PT09ICAlaT1ieXRlc3BlcnBpeGVsXG4iLCBwZWFzeWNhcC0+Ynl0ZXNwZXJwaXhlbCk7CitKT00oOCwgIj09PT09ICAlaT1ieXRlc3BlcnBpeGVsXG4iLCBwZWFzeWNhcC0+Ynl0ZXNwZXJwaXhlbCk7CiBpZiAodHJ1ZSA9PSBwZWFzeWNhcC0+b2ZmZXJmaWVsZHMpCi0JSk9UKDgsICI9PT09PSBvZmZlcmZpZWxkc1xuIik7CisJSk9NKDgsICI9PT09PSBvZmZlcmZpZWxkc1xuIik7CiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8qCkBAIC0xMDM2LDE1ICsxNDU2LDE3IEBACiAgKi8KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIGlmIChwZWFzeWNhcC0+ZmllbGRfcmVhZCA9PSBwZWFzeWNhcC0+ZmllbGRfZmlsbCkgewotCVNBWSgiRVJST1I6IG9uIGVudHJ5LCBzdGlsbCBmaWxsaW5nIGZpZWxkIGJ1ZmZlciAlaVxuIiwgXAorCVNBTSgiRVJST1I6IG9uIGVudHJ5LCBzdGlsbCBmaWxsaW5nIGZpZWxkIGJ1ZmZlciAlaVxuIiwgXAogCQkJCQkJCXBlYXN5Y2FwLT5maWVsZF9yZWFkKTsKIAlyZXR1cm4gMDsKIH0KICNpZiBkZWZpbmVkKEVBU1lDQVBfVEVTVENBUkQpCiBlYXN5Y2FwX3Rlc3RjYXJkKHBlYXN5Y2FwLCBwZWFzeWNhcC0+ZmllbGRfcmVhZCk7CiAjZWxzZQotaWYgKDAgIT0gKDB4MDQwMCAmIHBlYXN5Y2FwLT5maWVsZF9idWZmZXJbcGVhc3ljYXAtPmZpZWxkX3JlYWRdWzBdLmtvdW50KSkKLQllYXN5Y2FwX3Rlc3RjYXJkKHBlYXN5Y2FwLCBwZWFzeWNhcC0+ZmllbGRfcmVhZCk7CitpZiAoMCA8PSBpbnB1dCAmJiBJTlBVVF9NQU5ZID4gaW5wdXQpIHsKKwlpZiAoZWFzeWNhcF9iYXJzICYmIFZJREVPX0xPU1RfVE9MRVJBVEUgPD0gcGVhc3ljYXAtPmxvc3RbaW5wdXRdKQorCQllYXN5Y2FwX3Rlc3RjYXJkKHBlYXN5Y2FwLCBwZWFzeWNhcC0+ZmllbGRfcmVhZCk7Cit9CiAjZW5kaWYgLypFQVNZQ0FQX1RFU1RDQVJEKi8KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIApAQCAtMTA1NSw3ICsxNDc3LDcgQEAKIGlmICgoMiAhPSBieXRlc3BlcnBpeGVsKSAmJiBcCiAJCQkoMyAhPSBieXRlc3BlcnBpeGVsKSAmJiBcCiAJCQkoNCAhPSBieXRlc3BlcnBpeGVsKSkgewotCVNBWSgiTUlTVEFLRTogJWk9Ynl0ZXNwZXJwaXhlbFxuIiwgYnl0ZXNwZXJwaXhlbCk7CisJU0FNKCJNSVNUQUtFOiAlaT1ieXRlc3BlcnBpeGVsXG4iLCBieXRlc3BlcnBpeGVsKTsKIAlyZXR1cm4gLUVGQVVMVDsKIH0KIGlmICh0cnVlID09IGRlY2ltYXRlcGl4ZWwpCkBAIC0xMDgyLDggKzE1MDQsOCBAQAogZWxzZQogCW9kZCA9IGZhbHNlOwogCi1pZiAoKHRydWUgPT0gb2RkKSAmJiAoZmFsc2UgPT0gb2ZmZXJmaWVsZHMpICYmKGZhbHNlID09IGRlY2ltYXRlcGl4ZWwpKSB7Ci0JSk9UKDgsICIgIGluaXRpYWwgc2tpcHBpbmcgICAgJTRpICAgICAgICAgIGJ5dGVzIHAuJTRpXG4iLCBcCitpZiAoKHRydWUgPT0gb2RkKSAmJiAoZmFsc2UgPT0gZGVjaW1hdGVwaXhlbCkpIHsKKwlKT00oOCwgIiAgaW5pdGlhbCBza2lwcGluZyAgICAlNGkgICAgICAgICAgYnl0ZXMgcC4lNGlcbiIsIFwKIAkJCQkJCQl3My9tdWx0aXBsaWVyLCBtYWQpOwogCXBhZCArPSAodzMgLyBtdWx0aXBsaWVyKTsgIHJhZCAtPSAodzMgLyBtdWx0aXBsaWVyKTsKIH0KQEAgLTExMDgsNyArMTUzMCw3IEBACiAJCQlydW1wID0gMDsKIAogCQkJaWYgKG11Y2ggJSAyKSB7Ci0JCQkJU0FZKCJNSVNUQUtFOiBtdWNoIGlzIG9kZFxuIik7CisJCQkJU0FNKCJNSVNUQUtFOiBtdWNoIGlzIG9kZFxuIik7CiAJCQkJcmV0dXJuIC1FRkFVTFQ7CiAJCQl9CiAKQEAgLTExMTYsMTMgKzE1MzgsMTEgQEAKIAkJCQkJbXVjaCkgLyAyOwogLyogLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLwogCQkJaWYgKDEgPCBieXRlc3BlcnBpeGVsKSB7Ci0JCQkJaWYgKChyYWQgKiBcCi0JCQkJCTIpIDwgKG11Y2ggKiBcCi0JCQkJCQlieXRlc3BlcnBpeGVsKSkgeworCQkJCWlmIChyYWQgKiAyIDwgbXVjaCAqIGJ5dGVzcGVycGl4ZWwpIHsKIAkJCQkJLyoKIAkJCQkJKiogICBJTkpVRElDSU9VUyBBTFRFUkFUSU9OIE9GIFRISVMKLQkJCQkJKiogICBCTE9DSyBXSUxMIENBVVNFIEJSRUFLQUdFLgotCQkJCQkqKiAgIEJFV0FSRS4KKwkJCQkJKiogICBTVEFURU1FTlQgQkxPQ0sgV0lMTCBDQVVTRQorCQkJCQkqKiAgIEJSRUFLQUdFLiAgQkVXQVJFLgogCQkJCQkqKi8KIAkJCQkJcmFkMiA9IHJhZCArIGJ5dGVzcGVycGl4ZWwgLSAxOwogCQkJCQltdWNoID0gKCgoKDIgKiBcCkBAIC0xMTQ1LDE4ICsxNTY1LDI1IEBACiAJCQkJfQogLyogLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLwogCQkJfSBlbHNlIHsKLQkJCQlTQVkoIk1JU1RBS0U6ICVpPWJ5dGVzcGVycGl4ZWxcbiIsIFwKKwkJCQlTQU0oIk1JU1RBS0U6ICVpPWJ5dGVzcGVycGl4ZWxcbiIsIFwKIAkJCQkJCWJ5dGVzcGVycGl4ZWwpOwogCQkJCXJldHVybiAtRUZBVUxUOwogCQkJfQogLyogLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLwogCQkJaWYgKHJ1bXApCiAJCQkJY2FjaGVzKys7Ci0KKwkJCQlpZiAodHJ1ZSA9PSBiYWRpbnB1dCkgeworCQkJCQlKT00oOCwgIkVSUk9SOiAweCUwMlg9LT5maWVsZF9idWZmZXIiIFwKKwkJCQkJCSJbJWldWyVpXS5pbnB1dCwgIiBcCisJCQkJCQkiMHglMDJYPSgweDA4fC0+aW5wdXQpXG4iLCBcCisJCQkJCQlwZWFzeWNhcC0+ZmllbGRfYnVmZmVyXAorCQkJCQkJW2tleF1bbWV4XS5pbnB1dCwga2V4LCBtZXgsIFwKKwkJCQkJCSgweDA4fHBlYXN5Y2FwLT5pbnB1dCkpOworCQkJCX0KIAkJCXJjID0gcmVkYXViKHBlYXN5Y2FwLCBwYWQsIHBleCwgbXVjaCwgbW9yZSwgXAogCQkJCQkJCW1hc2ssIG1hcmdpbiwgaXN1eSk7CiAJCQlpZiAoMCA+IHJjKSB7Ci0JCQkJU0FZKCJFUlJPUjogcmVkYXViKCkgZmFpbGVkXG4iKTsKKwkJCQlTQU0oIkVSUk9SOiByZWRhdWIoKSBmYWlsZWRcbiIpOwogCQkJCXJldHVybiAtRUZBVUxUOwogCQkJfQogCQkJaWYgKG11Y2ggJSA0KSB7CkBAIC0xMTcxLDYgKzE1OTgsOSBAQAogCQkJCW1leCsrOwogCQkJCXBleCA9IHBlYXN5Y2FwLT5maWVsZF9idWZmZXJba2V4XVttZXhdLnBnbzsKIAkJCQlyZXggPSBQQUdFX1NJWkU7CisJCQkJaWYgKHBlYXN5Y2FwLT5maWVsZF9idWZmZXJba2V4XVttZXhdLmlucHV0ICE9IFwKKwkJCQkJCSgweDA4fHBlYXN5Y2FwLT5pbnB1dCkpCisJCQkJCWJhZGlucHV0ID0gdHJ1ZTsKIAkJCX0KIAkJCXBhZCAgKz0gbW9yZTsKIAkJCXJhZCAtPSBtb3JlOwpAQCAtMTE5MCw3ICsxNjIwLDcgQEAKICAqICBVTkxFU1MgSVQgSVMgVEhFIExBU1QgTElORSBPRiBBTiBPREQgRlJBTUUKICAqLwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCQlpZiAoKChmYWxzZSA9PSBvZGQpIHx8IChjeiAhPSB3eikpJiYoZmFsc2UgPT0gb2ZmZXJmaWVsZHMpKSB7CisJCWlmICgoZmFsc2UgPT0gb2RkKSB8fCAoY3ogIT0gd3opKSB7CiAJCQlvdmVyID0gdzM7CiAJCQlkbyB7CiAJCQkJaWYgKCFyYWQpIHsKQEAgLTEyMjQsNyArMTY1NCw3IEBACiAJCQlydW1wID0gMDsKIAogCQkJaWYgKG11Y2ggJSAyKSB7Ci0JCQkJU0FZKCJNSVNUQUtFOiBtdWNoIGlzIG9kZFxuIik7CisJCQkJU0FNKCJNSVNUQUtFOiBtdWNoIGlzIG9kZFxuIik7CiAJCQkJcmV0dXJuIC1FRkFVTFQ7CiAJCQl9CiAKQEAgLTEyMzIsMTIgKzE2NjIsMTEgQEAKIAkJCQkJbXVjaCkgLyA0OwogLyogLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLwogCQkJaWYgKDEgPCBieXRlc3BlcnBpeGVsKSB7Ci0JCQkJaWYgKChyYWQgKiA0KSA8IChtdWNoICogXAotCQkJCQkJYnl0ZXNwZXJwaXhlbCkpIHsKKwkJCQlpZiAocmFkICogNCA8IG11Y2ggKiBieXRlc3BlcnBpeGVsKSB7CiAJCQkJCS8qCiAJCQkJCSoqICAgSU5KVURJQ0lPVVMgQUxURVJBVElPTiBPRiBUSElTCi0JCQkJCSoqICAgQkxPQ0sgV0lMTCBDQVVTRSBCUkVBS0FHRS4KLQkJCQkJKiogICBCRVdBUkUuCisJCQkJCSoqICAgU1RBVEVNRU5UIEJMT0NLIFdJTEwgQ0FVU0UKKwkJCQkJKiogICBCUkVBS0FHRS4gIEJFV0FSRS4KIAkJCQkJKiovCiAJCQkJCXJhZDIgPSByYWQgKyBieXRlc3BlcnBpeGVsIC0gMTsKIAkJCQkJbXVjaCA9ICgoKCgyICogcmFkMikvYnl0ZXNwZXJwaXhlbCkvMilcCkBAIC0xMjYxLDcgKzE2OTAsNyBAQAogCQkJCQl9CiAvKiAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCiAJCQkJfSBlbHNlIHsKLQkJCQkJU0FZKCJNSVNUQUtFOiAlaT1ieXRlc3BlcnBpeGVsXG4iLCBcCisJCQkJCVNBTSgiTUlTVEFLRTogJWk9Ynl0ZXNwZXJwaXhlbFxuIiwgXAogCQkJCQkJYnl0ZXNwZXJwaXhlbCk7CiAJCQkJCXJldHVybiAtRUZBVUxUOwogCQkJCX0KQEAgLTEyNjksMTAgKzE2OTgsMTggQEAKIAkJCWlmIChydW1wKQogCQkJCWNhY2hlcysrOwogCisJCQkJaWYgKHRydWUgPT0gYmFkaW5wdXQpIHsKKwkJCQkJSk9NKDgsICJFUlJPUjogMHglMDJYPS0+ZmllbGRfYnVmZmVyIiBcCisJCQkJCQkiWyVpXVslaV0uaW5wdXQsICIgXAorCQkJCQkJIjB4JTAyWD0oMHgwOHwtPmlucHV0KVxuIiwgXAorCQkJCQkJcGVhc3ljYXAtPmZpZWxkX2J1ZmZlclwKKwkJCQkJCVtrZXhdW21leF0uaW5wdXQsIGtleCwgbWV4LCBcCisJCQkJCQkoMHgwOHxwZWFzeWNhcC0+aW5wdXQpKTsKKwkJCQl9CiAJCQlyYyA9IHJlZGF1YihwZWFzeWNhcCwgcGFkLCBwZXgsIG11Y2gsIG1vcmUsIFwKIAkJCQkJCQltYXNrLCBtYXJnaW4sIGlzdXkpOwogCQkJaWYgKDAgPiByYykgewotCQkJCVNBWSgiRVJST1I6IHJlZGF1YigpIGZhaWxlZFxuIik7CisJCQkJU0FNKCJFUlJPUjogcmVkYXViKCkgZmFpbGVkXG4iKTsKIAkJCQlyZXR1cm4gLUVGQVVMVDsKIAkJCX0KIAkJCW92ZXIgLT0gbXVjaDsgICBjeiArPSBtdWNoOwpAQCAtMTI4MSw2ICsxNzE4LDkgQEAKIAkJCQltZXgrKzsKIAkJCQlwZXggPSBwZWFzeWNhcC0+ZmllbGRfYnVmZmVyW2tleF1bbWV4XS5wZ287CiAJCQkJcmV4ID0gUEFHRV9TSVpFOworCQkJCWlmIChwZWFzeWNhcC0+ZmllbGRfYnVmZmVyW2tleF1bbWV4XS5pbnB1dCAhPSBcCisJCQkJCQkoMHgwOHxwZWFzeWNhcC0+aW5wdXQpKQorCQkJCQliYWRpbnB1dCA9IHRydWU7CiAJCQl9CiAJCQlwYWQgICs9IG1vcmU7CiAJCQlyYWQgLT0gbW9yZTsKQEAgLTEzMDcsNiArMTc0NywxNiBAQAogCQkJCW1leCsrOwogCQkJCXBleCA9IHBlYXN5Y2FwLT5maWVsZF9idWZmZXJba2V4XVttZXhdLnBnbzsKIAkJCQlyZXggPSBQQUdFX1NJWkU7CisJCQkJaWYgKHBlYXN5Y2FwLT5maWVsZF9idWZmZXJba2V4XVttZXhdLmlucHV0ICE9IFwKKwkJCQkJCSgweDA4fHBlYXN5Y2FwLT5pbnB1dCkpIHsKKwkJCQkJSk9NKDgsICJFUlJPUjogMHglMDJYPS0+ZmllbGRfYnVmZmVyIlwKKwkJCQkJCSJbJWldWyVpXS5pbnB1dCwgIiBcCisJCQkJCQkiMHglMDJYPSgweDA4fC0+aW5wdXQpXG4iLCBcCisJCQkJCQlwZWFzeWNhcC0+ZmllbGRfYnVmZmVyXAorCQkJCQkJW2tleF1bbWV4XS5pbnB1dCwga2V4LCBtZXgsIFwKKwkJCQkJCSgweDA4fHBlYXN5Y2FwLT5pbnB1dCkpOworCQkJCQliYWRpbnB1dCA9IHRydWU7CisJCQkJfQogCQkJfQogCQkJbXVjaCA9IG92ZXI7CiAJCQlpZiAocmV4IDwgbXVjaCkKQEAgLTEzMjUsMzkgKzE3NzUsMzkgQEAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIGMyID0gKG1leCArIDEpKlBBR0VfU0laRSAtIHJleDsKIGlmIChjeiAhPSBjMikKLQlTQVkoIkVSUk9SOiBkaXNjcmVwYW5jeSAlaSBpbiBieXRlcyByZWFkXG4iLCBjMiAtIGN6KTsKKwlTQU0oIkVSUk9SOiBkaXNjcmVwYW5jeSAlaSBpbiBieXRlcyByZWFkXG4iLCBjMiAtIGN6KTsKIGMzID0gKG1hZCArIDEpKlBBR0VfU0laRSAtIHJhZDsKIAogaWYgKGZhbHNlID09IGRlY2ltYXRlcGl4ZWwpIHsKIAlpZiAoYnl0ZXNwZXJwaXhlbCAqIFwKIAkJY3ogIT0gYzMpIFwKLQkJU0FZKCJFUlJPUjogZGlzY3JlcGFuY3kgJWkgaW4gYnl0ZXMgd3JpdHRlblxuIiwgXAorCQlTQU0oIkVSUk9SOiBkaXNjcmVwYW5jeSAlaSBpbiBieXRlcyB3cml0dGVuXG4iLCBcCiAJCQkJCQljMyAtIChieXRlc3BlcnBpeGVsICogXAogCQkJCQkJCQkJY3opKTsKIH0gZWxzZSB7CiAJaWYgKGZhbHNlID09IG9kZCkgewogCQlpZiAoYnl0ZXNwZXJwaXhlbCAqIFwKIAkJCWN6ICE9ICg0ICogYzMpKQotCQkJU0FZKCJFUlJPUjogZGlzY3JlcGFuY3kgJWkgaW4gYnl0ZXMgd3JpdHRlblxuIiwgXAorCQkJU0FNKCJFUlJPUjogZGlzY3JlcGFuY3kgJWkgaW4gYnl0ZXMgd3JpdHRlblxuIiwgXAogCQkJCQkJKDIqYzMpLShieXRlc3BlcnBpeGVsICogXAogCQkJCQkJCQkJY3opKTsKIAkJfSBlbHNlIHsKIAkJCWlmICgwICE9IGMzKQotCQkJCVNBWSgiRVJST1I6IGRpc2NyZXBhbmN5ICVpICIgXAorCQkJCVNBTSgiRVJST1I6IGRpc2NyZXBhbmN5ICVpICIgXAogCQkJCQkJImluIGJ5dGVzIHdyaXR0ZW5cbiIsIGMzKTsKIAkJfQogfQogaWYgKHJ1bXApCi0JU0FZKCJFUlJPUjogdW5kaXNjaGFyZ2VkIGNhY2hlIGF0IGVuZCBvZiBsaW5lIGluIGZyYW1lIGJ1ZmZlclxuIik7CisJU0FNKCJXT1JSWTogdW5kaXNjaGFyZ2VkIGNhY2hlIGF0IGVuZCBvZiBsaW5lIGluIGZyYW1lIGJ1ZmZlclxuIik7CiAKLUpPVCg4LCAiPT09PT0gZmllbGQyZnJhbWUoKTogJWkgYnl0ZXMgLS0+ICVpIGJ5dGVzIChpbmNsIHNraXApXG4iLCBjMiwgYzMpOwotSk9UKDgsICI9PT09PSBmaWVsZDJmcmFtZSgpOiAlaT1tYWQgICVpPXJhZFxuIiwgbWFkLCByYWQpOworSk9NKDgsICI9PT09PSBmaWVsZDJmcmFtZSgpOiAlaSBieXRlcyAtLT4gJWkgYnl0ZXMgKGluY2wgc2tpcClcbiIsIGMyLCBjMyk7CitKT00oOCwgIj09PT09IGZpZWxkMmZyYW1lKCk6ICVpPW1hZCAgJWk9cmFkXG4iLCBtYWQsIHJhZCk7CiAKIGlmICh0cnVlID09IG9kZCkKLQlKT1QoOCwgIisrKysrIGZpZWxkMmZyYW1lKCk6ICBmcmFtZSBidWZmZXIgJWkgaXMgZnVsbFxuIiwga2FkKTsKKwlKT00oOCwgIisrKysrIGZpZWxkMmZyYW1lKCk6ICBmcmFtZSBidWZmZXIgJWkgaXMgZnVsbFxuIiwga2FkKTsKIAogaWYgKHBlYXN5Y2FwLT5maWVsZF9yZWFkID09IHBlYXN5Y2FwLT5maWVsZF9maWxsKQotCVNBWSgiV0FSTklORzogb24gZXhpdCwgZmlsbGluZyBmaWVsZCBidWZmZXIgJWlcbiIsIFwKKwlTQU0oIldBUk5JTkc6IG9uIGV4aXQsIGZpbGxpbmcgZmllbGQgYnVmZmVyICVpXG4iLCBcCiAJCQkJCQkJcGVhc3ljYXAtPmZpZWxkX3JlYWQpOwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyoKQEAgLTEzNjUsMjMgKzE4MTUsMjQgQEAKICAqLwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogZG9fZ2V0dGltZW9mZGF5KCZ0aW1ldmFsKTsKLWlmICh0aW1ldmFsMC50dl9zZWMpIHsKK2lmIChwZWFzeWNhcC0+dGltZXZhbDYudHZfc2VjKSB7CiAJYmVsb3cgPSAoKGxvbmcgbG9uZyBpbnQpKDEwMDAwMDApKSAqIFwKLQkJKChsb25nIGxvbmcgaW50KSh0aW1ldmFsLnR2X3NlYyAgLSB0aW1ldmFsMC50dl9zZWMpKSArIFwKLQkJCSAobG9uZyBsb25nIGludCkodGltZXZhbC50dl91c2VjIC0gdGltZXZhbDAudHZfdXNlYyk7CisJCSgobG9uZyBsb25nIGludCkodGltZXZhbC50dl9zZWMgLSBcCisJCQkJCXBlYXN5Y2FwLT50aW1ldmFsNi50dl9zZWMpKSArIFwKKwkJIChsb25nIGxvbmcgaW50KSh0aW1ldmFsLnR2X3VzZWMgLSBwZWFzeWNhcC0+dGltZXZhbDYudHZfdXNlYyk7CiAJYWJvdmUgPSAobG9uZyBsb25nIGludCkxMDAwMDAwOwogCiAJc2RyID0gc2lnbmVkX2RpdihhYm92ZSwgYmVsb3cpOwogCWFib3ZlID0gc2RyLnF1b3RpZW50OwogCXJlbWFpbmRlciA9IChfX3UzMilzZHIucmVtYWluZGVyOwogCi0JSk9UKDgsICJ2aWRlbyBzdHJlYW1pbmcgYXQgJTNsbGkuJTAzaSBmaWVsZHMgcGVyIHNlY29uZFxuIiwgYWJvdmUsIFwKKwlKT00oOCwgInZpZGVvIHN0cmVhbWluZyBhdCAlM2xsaS4lMDNpIGZpZWxkcyBwZXIgc2Vjb25kXG4iLCBhYm92ZSwgXAogCQkJCQkJCShyZW1haW5kZXIvMTAwMCkpOwogfQotdGltZXZhbDAgPSB0aW1ldmFsOworcGVhc3ljYXAtPnRpbWV2YWw2ID0gdGltZXZhbDsKIAogaWYgKGNhY2hlcykKLQlKT1QoOCwgIiVpPWNhY2hlc1xuIiwgY2FjaGVzKTsKKwlKT00oOCwgIiVpPWNhY2hlc1xuIiwgY2FjaGVzKTsKIHJldHVybiAwOwogfQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMTQzNCw3ICsxODg1LDcgQEAKIAkJCQkJX191OCBtYXNrLCBfX3U4IG1hcmdpbiwgYm9vbCBpc3V5KQogewogc3RhdGljIF9fczMyIGF5WzI1Nl0sIGJ1WzI1Nl0sIHJ2WzI1Nl0sIGd1WzI1Nl0sIGd2WzI1Nl07Ci1zdGF0aWMgX191OCBjYWNoZVs4XSwgKnBjYWNoZTsKK19fdTggKnBjYWNoZTsKIF9fdTggciwgZywgYiwgeSwgdSwgdiwgYywgKnAyLCAqcDMsICpweiwgKnByOwogaW50ICBieXRlc3BlcnBpeGVsOwogYm9vbCBieXRlc3dhcG9yZGVyLCBkZWNpbWF0ZXBpeGVsLCBsYXN0OwpAQCAtMTQ0Miw3ICsxODkzLDcgQEAKIF9fczMyIHMzMjsKIAogaWYgKG11Y2ggJSAyKSB7Ci0JU0FZKCJNSVNUQUtFOiBtdWNoIGlzIG9kZFxuIik7CisJU0FNKCJNSVNUQUtFOiBtdWNoIGlzIG9kZFxuIik7CiAJcmV0dXJuIC1FRkFVTFQ7CiB9CiBieXRlc3BlcnBpeGVsID0gcGVhc3ljYXAtPmJ5dGVzcGVycGl4ZWw7CkBAIC0xNDc1LDMwICsxOTI2LDMxIEBACiAJCWF5W2pdID0gYXlbMTZdOwogCWZvciAoaiA9IDIzNjsgaiA8IDI1NjsgaisrKQogCQlheVtqXSA9IGF5WzIzNV07Ci0JSk9UKDgsICJsb29rdXAgdGFibGVzIGFyZSBwcmVwYXJlZFxuIik7CisJSk9NKDgsICJsb29rdXAgdGFibGVzIGFyZSBwcmVwYXJlZFxuIik7CiB9Ci1pZiAoKF9fdTggKilOVUxMID09IHBjYWNoZSkKLQlwY2FjaGUgPSAmY2FjaGVbMF07CitwY2FjaGUgPSBwZWFzeWNhcC0+cGNhY2hlOworaWYgKE5VTEwgPT0gcGNhY2hlKQorCXBjYWNoZSA9ICZwZWFzeWNhcC0+Y2FjaGVbMF07CiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKgogICogIFRSQU5TRkVSIENPTlRFTlRTIE9GIENBQ0hFIFRPIFRIRSBGUkFNRSBCVUZGRVIKICAqLwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogaWYgKCFwY2FjaGUpIHsKLQlTQVkoIk1JU1RBS0U6IHBjYWNoZSBpcyBOVUxMXG4iKTsKKwlTQU0oIk1JU1RBS0U6IHBjYWNoZSBpcyBOVUxMXG4iKTsKIAlyZXR1cm4gLUVGQVVMVDsKIH0KIAotaWYgKHBjYWNoZSAhPSAmY2FjaGVbMF0pCi0JSk9UKDE2LCAiY2FjaGUgaGFzICVpIGJ5dGVzXG4iLCAoaW50KShwY2FjaGUgLSAmY2FjaGVbMF0pKTsKLXAyID0gJmNhY2hlWzBdOwotcDMgPSAoX191OCAqKXBhZCAtIChpbnQpKHBjYWNoZSAtICZjYWNoZVswXSk7CitpZiAocGNhY2hlICE9ICZwZWFzeWNhcC0+Y2FjaGVbMF0pCisJSk9NKDE2LCAiY2FjaGUgaGFzICVpIGJ5dGVzXG4iLCAoaW50KShwY2FjaGUgLSAmcGVhc3ljYXAtPmNhY2hlWzBdKSk7CitwMiA9ICZwZWFzeWNhcC0+Y2FjaGVbMF07CitwMyA9IChfX3U4ICopcGFkIC0gKGludCkocGNhY2hlIC0gJnBlYXN5Y2FwLT5jYWNoZVswXSk7CiB3aGlsZSAocDIgPCBwY2FjaGUpIHsKIAkqcDMrKyA9ICpwMjsgIHAyKys7CiB9Ci1wY2FjaGUgPSAmY2FjaGVbMF07CitwY2FjaGUgPSAmcGVhc3ljYXAtPmNhY2hlWzBdOwogaWYgKHAzICE9IHBhZCkgewotCVNBWSgiTUlTVEFLRTogcG9pbnRlciBtaXNhbGlnbm1lbnRcbiIpOworCVNBTSgiTUlTVEFLRTogcG9pbnRlciBtaXNhbGlnbm1lbnRcbiIpOwogCXJldHVybiAtRUZBVUxUOwogfQogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpAQCAtMTUxMyw3ICsxOTY1LDcgQEAKIAl2ID0gKihwMiAtIDEpOwogCiBpZiAocnVtcCkKLQlKT1QoMTYsICIlNGk9bXVjaCAgJTRpPW1vcmUgICVpPXJ1bXBcbiIsIG11Y2gsIG1vcmUsIHJ1bXApOworCUpPTSgxNiwgIiU0aT1tdWNoICAlNGk9bW9yZSAgJWk9cnVtcFxuIiwgbXVjaCwgbW9yZSwgcnVtcCk7CiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIHN3aXRjaCAoYnl0ZXNwZXJwaXhlbCkgewpAQCAtMTYxOSw3ICsyMDcxLDcgQEAKIAkJCQkJCQkwIDogKF9fdTgpczMyKTsKIAogCQkJCWlmICgodHJ1ZSA9PSBsYXN0KSAmJiBydW1wKSB7Ci0JCQkJCXBjYWNoZSA9ICZjYWNoZVswXTsKKwkJCQkJcGNhY2hlID0gJnBlYXN5Y2FwLT5jYWNoZVswXTsKIAkJCQkJc3dpdGNoIChieXRlc3BlcnBpeGVsIC0gcnVtcCkgewogCQkJCQljYXNlIDE6IHsKIAkJCQkJCSpwMyA9IHI7CkBAIC0xNjM0LDcgKzIwODYsNyBAQAogCQkJCQkJYnJlYWs7CiAJCQkJCX0KIAkJCQkJZGVmYXVsdDogewotCQkJCQkJU0FZKCJNSVNUQUtFOiAlaT1ydW1wXG4iLCBcCisJCQkJCQlTQU0oIk1JU1RBS0U6ICVpPXJ1bXBcbiIsIFwKIAkJCQkJCQlieXRlc3BlcnBpeGVsIC0gcnVtcCk7CiAJCQkJCQlyZXR1cm4gLUVGQVVMVDsKIAkJCQkJfQpAQCAtMTY5Miw3ICsyMTQ0LDcgQEAKIAkJCQkJCQkJMCA6IChfX3U4KXMzMik7CiAKIAkJCQlpZiAoKHRydWUgPT0gbGFzdCkgJiYgcnVtcCkgewotCQkJCQlwY2FjaGUgPSAmY2FjaGVbMF07CisJCQkJCXBjYWNoZSA9ICZwZWFzeWNhcC0+Y2FjaGVbMF07CiAJCQkJCXN3aXRjaCAoYnl0ZXNwZXJwaXhlbCAtIHJ1bXApIHsKIAkJCQkJY2FzZSAxOiB7CiAJCQkJCQkqcDMgPSBiOwpAQCAtMTcwNyw3ICsyMTU5LDcgQEAKIAkJCQkJCWJyZWFrOwogCQkJCQl9CiAJCQkJCWRlZmF1bHQ6IHsKLQkJCQkJCVNBWSgiTUlTVEFLRTogJWk9cnVtcFxuIiwgXAorCQkJCQkJU0FNKCJNSVNUQUtFOiAlaT1ydW1wXG4iLCBcCiAJCQkJCQkJYnl0ZXNwZXJwaXhlbCAtIHJ1bXApOwogCQkJCQkJcmV0dXJuIC1FRkFVTFQ7CiAJCQkJCX0KQEAgLTE3NjgsNyArMjIyMCw3IEBACiAJCQkJCQkJCTAgOiAoX191OClzMzIpOwogCiAJCQkJCWlmICgodHJ1ZSA9PSBsYXN0KSAmJiBydW1wKSB7Ci0JCQkJCQlwY2FjaGUgPSAmY2FjaGVbMF07CisJCQkJCQlwY2FjaGUgPSAmcGVhc3ljYXAtPmNhY2hlWzBdOwogCQkJCQkJc3dpdGNoIChieXRlc3BlcnBpeGVsIC0gcnVtcCkgewogCQkJCQkJY2FzZSAxOiB7CiAJCQkJCQkJKnAzID0gcjsKQEAgLTE3ODMsNyArMjIzNSw3IEBACiAJCQkJCQkJYnJlYWs7CiAJCQkJCQl9CiAJCQkJCQlkZWZhdWx0OiB7Ci0JCQkJCQkJU0FZKCJNSVNUQUtFOiAiIFwKKwkJCQkJCQlTQU0oIk1JU1RBS0U6ICIgXAogCQkJCQkJCSIlaT1ydW1wXG4iLCBcCiAJCQkJCQkJYnl0ZXNwZXJwaXhlbCAtIHJ1bXApOwogCQkJCQkJCXJldHVybiAtRUZBVUxUOwpAQCAtMTg0NCw3ICsyMjk2LDcgQEAKIAkJCQkJCQkJMCA6IChfX3U4KXMzMik7CiAKIAkJCQkJaWYgKCh0cnVlID09IGxhc3QpICYmIHJ1bXApIHsKLQkJCQkJCXBjYWNoZSA9ICZjYWNoZVswXTsKKwkJCQkJCXBjYWNoZSA9ICZwZWFzeWNhcC0+Y2FjaGVbMF07CiAJCQkJCQlzd2l0Y2ggKGJ5dGVzcGVycGl4ZWwgLSBydW1wKSB7CiAJCQkJCQljYXNlIDE6IHsKIAkJCQkJCQkqcDMgPSBiOwpAQCAtMTg1OSw3ICsyMzExLDcgQEAKIAkJCQkJCQlicmVhazsKIAkJCQkJCX0KIAkJCQkJCWRlZmF1bHQ6IHsKLQkJCQkJCQlTQVkoIk1JU1RBS0U6ICIgXAorCQkJCQkJCVNBTSgiTUlTVEFLRTogIiBcCiAJCQkJCQkJIiVpPXJ1bXBcbiIsIFwKIAkJCQkJCQlieXRlc3BlcnBpeGVsIC0gcnVtcCk7CiAJCQkJCQkJcmV0dXJuIC1FRkFVTFQ7CkBAIC0xOTI0LDcgKzIzNzYsNyBAQAogCQkJCQkJCQkwIDogKF9fdTgpczMyKTsKIAogCQkJCWlmICgodHJ1ZSA9PSBsYXN0KSAmJiBydW1wKSB7Ci0JCQkJCXBjYWNoZSA9ICZjYWNoZVswXTsKKwkJCQkJcGNhY2hlID0gJnBlYXN5Y2FwLT5jYWNoZVswXTsKIAkJCQkJc3dpdGNoIChieXRlc3BlcnBpeGVsIC0gcnVtcCkgewogCQkJCQljYXNlIDE6IHsKIAkJCQkJCSpwMyA9IHI7CkBAIC0xOTQ4LDcgKzI0MDAsNyBAQAogCQkJCQkJYnJlYWs7CiAJCQkJCX0KIAkJCQkJZGVmYXVsdDogewotCQkJCQkJU0FZKCJNSVNUQUtFOiAlaT1ydW1wXG4iLCBcCisJCQkJCQlTQU0oIk1JU1RBS0U6ICVpPXJ1bXBcbiIsIFwKIAkJCQkJCQlieXRlc3BlcnBpeGVsIC0gcnVtcCk7CiAJCQkJCQlyZXR1cm4gLUVGQVVMVDsKIAkJCQkJfQpAQCAtMjAwNiw3ICsyNDU4LDcgQEAKIAkJCQkJCQkJMCA6IChfX3U4KXMzMik7CiAKIAkJCQlpZiAoKHRydWUgPT0gbGFzdCkgJiYgcnVtcCkgewotCQkJCQlwY2FjaGUgPSAmY2FjaGVbMF07CisJCQkJCXBjYWNoZSA9ICZwZWFzeWNhcC0+Y2FjaGVbMF07CiAJCQkJCXN3aXRjaCAoYnl0ZXNwZXJwaXhlbCAtIHJ1bXApIHsKIAkJCQkJY2FzZSAxOiB7CiAJCQkJCQkqcDMgPSBiOwpAQCAtMjAzMCw3ICsyNDgyLDcgQEAKIAkJCQkJCWJyZWFrOwogCQkJCQl9CiAJCQkJCWRlZmF1bHQ6IHsKLQkJCQkJCVNBWSgiTUlTVEFLRTogJWk9cnVtcFxuIiwgXAorCQkJCQkJU0FNKCJNSVNUQUtFOiAlaT1ydW1wXG4iLCBcCiAJCQkJCQkJYnl0ZXNwZXJwaXhlbCAtIHJ1bXApOwogCQkJCQkJcmV0dXJuIC1FRkFVTFQ7CiAJCQkJCX0KQEAgLTIwOTMsNyArMjU0NSw3IEBACiAJCQkJCQkJCTAgOiAoX191OClzMzIpOwogCiAJCQkJCWlmICgodHJ1ZSA9PSBsYXN0KSAmJiBydW1wKSB7Ci0JCQkJCQlwY2FjaGUgPSAmY2FjaGVbMF07CisJCQkJCQlwY2FjaGUgPSAmcGVhc3ljYXAtPmNhY2hlWzBdOwogCQkJCQkJc3dpdGNoIChieXRlc3BlcnBpeGVsIC0gcnVtcCkgewogCQkJCQkJY2FzZSAxOiB7CiAJCQkJCQkJKnAzID0gcjsKQEAgLTIxMTcsNyArMjU2OSw3IEBACiAJCQkJCQkJYnJlYWs7CiAJCQkJCQl9CiAJCQkJCQlkZWZhdWx0OiB7Ci0JCQkJCQkJU0FZKCJNSVNUQUtFOiAiIFwKKwkJCQkJCQlTQU0oIk1JU1RBS0U6ICIgXAogCQkJCQkJCSIlaT1ydW1wXG4iLCBcCiAJCQkJCQkJYnl0ZXNwZXJwaXhlbCAtIFwKIAkJCQkJCQlydW1wKTsKQEAgLTIxNzgsNyArMjYzMCw3IEBACiAJCQkJCQkJCTAgOiAoX191OClzMzIpOwogCiAJCQkJCWlmICgodHJ1ZSA9PSBsYXN0KSAmJiBydW1wKSB7Ci0JCQkJCQlwY2FjaGUgPSAmY2FjaGVbMF07CisJCQkJCQlwY2FjaGUgPSAmcGVhc3ljYXAtPmNhY2hlWzBdOwogCQkJCQkJc3dpdGNoIChieXRlc3BlcnBpeGVsIC0gcnVtcCkgewogCQkJCQkJY2FzZSAxOiB7CiAJCQkJCQkJKnAzID0gYjsKQEAgLTIyMDIsNyArMjY1NCw3IEBACiAJCQkJCQkJYnJlYWs7CiAJCQkJCQl9CiAJCQkJCQlkZWZhdWx0OiB7Ci0JCQkJCQkJU0FZKCJNSVNUQUtFOiAiIFwKKwkJCQkJCQlTQU0oIk1JU1RBS0U6ICIgXAogCQkJCQkJCSIlaT1ydW1wXG4iLCBcCiAJCQkJCQkJYnl0ZXNwZXJwaXhlbCAtIHJ1bXApOwogCQkJCQkJCXJldHVybiAtRUZBVUxUOwpAQCAtMjIyNiw0OCArMjY3OCwxMyBAQAogCWJyZWFrOwogCX0KIGRlZmF1bHQ6IHsKLQlTQVkoIk1JU1RBS0U6ICVpPWJ5dGVzcGVycGl4ZWxcbiIsIGJ5dGVzcGVycGl4ZWwpOworCVNBTSgiTUlTVEFLRTogJWk9Ynl0ZXNwZXJwaXhlbFxuIiwgYnl0ZXNwZXJwaXhlbCk7CiAJcmV0dXJuIC1FRkFVTFQ7CiAJfQogfQogcmV0dXJuIDA7CiB9CiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkCi1kZWJyaWVmKHN0cnVjdCBlYXN5Y2FwICpwZWFzeWNhcCkKLXsKLWlmICgoc3RydWN0IHVzYl9kZXZpY2UgKilOVUxMICE9IHBlYXN5Y2FwLT5wdXNiX2RldmljZSkgewotCWNoZWNrX3N0ayhwZWFzeWNhcC0+cHVzYl9kZXZpY2UpOwotCWNoZWNrX3NhYShwZWFzeWNhcC0+cHVzYl9kZXZpY2UpOwotCXNheXJlYWRvbmx5KHBlYXN5Y2FwKTsKLQlTQVkoIiVpPXBlYXN5Y2FwLT5maWVsZF9maWxsXG4iLCBwZWFzeWNhcC0+ZmllbGRfZmlsbCk7Ci0JU0FZKCIlaT1wZWFzeWNhcC0+ZmllbGRfcmVhZFxuIiwgcGVhc3ljYXAtPmZpZWxkX3JlYWQpOwotCVNBWSgiJWk9cGVhc3ljYXAtPmZyYW1lX2ZpbGxcbiIsIHBlYXN5Y2FwLT5mcmFtZV9maWxsKTsKLQlTQVkoIiVpPXBlYXN5Y2FwLT5mcmFtZV9yZWFkXG4iLCBwZWFzeWNhcC0+ZnJhbWVfcmVhZCk7Ci19Ci1yZXR1cm47Ci19Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkCi1zYXlyZWFkb25seShzdHJ1Y3QgZWFzeWNhcCAqcGVhc3ljYXApCi17Ci1zdGF0aWMgaW50IGRvbmU7Ci1pbnQgZ290MDAsIGdvdDFGLCBnb3Q2MCwgZ290NjEsIGdvdDYyOwotCi1pZiAoKCFkb25lKSAmJiAoKHN0cnVjdCB1c2JfZGV2aWNlICopTlVMTCAhPSBwZWFzeWNhcC0+cHVzYl9kZXZpY2UpKSB7Ci0JZG9uZSA9IDE7Ci0JZ290MDAgPSByZWFkX3NhYShwZWFzeWNhcC0+cHVzYl9kZXZpY2UsIDB4MDApOwotCWdvdDFGID0gcmVhZF9zYWEocGVhc3ljYXAtPnB1c2JfZGV2aWNlLCAweDFGKTsKLQlnb3Q2MCA9IHJlYWRfc2FhKHBlYXN5Y2FwLT5wdXNiX2RldmljZSwgMHg2MCk7Ci0JZ290NjEgPSByZWFkX3NhYShwZWFzeWNhcC0+cHVzYl9kZXZpY2UsIDB4NjEpOwotCWdvdDYyID0gcmVhZF9zYWEocGVhc3ljYXAtPnB1c2JfZGV2aWNlLCAweDYyKTsKLQlTQVkoIjB4JTAyWD1yZWcweDAwICAweCUwMlg9cmVnMHgxRlxuIiwgZ290MDAsIGdvdDFGKTsKLQlTQVkoIjB4JTAyWD1yZWcweDYwICAweCUwMlg9cmVnMHg2MSAgMHglMDJYPXJlZzB4NjJcbiIsIFwKLQkJCQkJCQlnb3Q2MCwgZ290NjEsIGdvdDYyKTsKLX0KLXJldHVybjsKLX0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8qCiAgKiAgU0VFIENPUkJFVCBFVCBBTC4gIkxJTlVYIERFVklDRSBEUklWRVJTIiwgM3JkIEVESVRJT04sIFBBR0VTIDQzMC00MzQKQEAgLTIyOTIsMTEgKzI3MDksMTYgQEAKIHN0cnVjdCBlYXN5Y2FwICpwZWFzeWNhcDsKIAogcGVhc3ljYXAgPSBwdm1hLT52bV9wcml2YXRlX2RhdGE7Ci1pZiAoTlVMTCAhPSBwZWFzeWNhcCkKLQlwZWFzeWNhcC0+dm1hX21hbnkrKzsKLQoraWYgKE5VTEwgPT0gcGVhc3ljYXApIHsKKwlTQVkoIkVSUk9SOiBwZWFzeWNhcCBpcyBOVUxMXG4iKTsKKwlyZXR1cm47Cit9CitpZiAobWVtY21wKCZwZWFzeWNhcC0+dGVsbHRhbGVbMF0sIFRFTExUQUxFLCBzdHJsZW4oVEVMTFRBTEUpKSkgeworCVNBWSgiRVJST1I6IGJhZCBwZWFzeWNhcDogMHglMDhsWFxuIiwgKHVuc2lnbmVkIGxvbmcgaW50KSBwZWFzeWNhcCk7CisJcmV0dXJuOworfQorcGVhc3ljYXAtPnZtYV9tYW55Kys7CiBKT1QoOCwgIiVpPXBlYXN5Y2FwLT52bWFfbWFueVxuIiwgcGVhc3ljYXAtPnZtYV9tYW55KTsKLQogcmV0dXJuOwogfQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMjMwNiwxMCArMjcyOCwxNiBAQAogc3RydWN0IGVhc3ljYXAgKnBlYXN5Y2FwOwogCiBwZWFzeWNhcCA9IHB2bWEtPnZtX3ByaXZhdGVfZGF0YTsKLWlmIChOVUxMICE9IHBlYXN5Y2FwKSB7Ci0JcGVhc3ljYXAtPnZtYV9tYW55LS07Ci0JSk9UKDgsICIlaT1wZWFzeWNhcC0+dm1hX21hbnlcbiIsIHBlYXN5Y2FwLT52bWFfbWFueSk7CitpZiAoTlVMTCA9PSBwZWFzeWNhcCkgeworCVNBWSgiRVJST1I6IHBlYXN5Y2FwIGlzIE5VTExcbiIpOworCXJldHVybjsKIH0KK2lmIChtZW1jbXAoJnBlYXN5Y2FwLT50ZWxsdGFsZVswXSwgVEVMTFRBTEUsIHN0cmxlbihURUxMVEFMRSkpKSB7CisJU0FZKCJFUlJPUjogYmFkIHBlYXN5Y2FwOiAweCUwOGxYXG4iLCAodW5zaWduZWQgbG9uZyBpbnQpIHBlYXN5Y2FwKTsKKwlyZXR1cm47Cit9CitwZWFzeWNhcC0+dm1hX21hbnktLTsKK0pPVCg4LCAiJWk9cGVhc3ljYXAtPnZtYV9tYW55XG4iLCBwZWFzeWNhcC0+dm1hX21hbnkpOwogcmV0dXJuOwogfQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMjM1NSwyNCArMjc4MywyMiBAQAogCVNBWSgiRVJST1I6IHBlYXN5Y2FwIGlzIE5VTExcbiIpOwogCXJldHVybiByZXRjb2RlOwogfQotbXV0ZXhfbG9jaygmKHBlYXN5Y2FwLT5tdXRleF9tbWFwX3ZpZGVvWzBdKSk7CiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiBwYnVmID0gcGVhc3ljYXAtPmZyYW1lX2J1ZmZlcltrXVttXS5wZ287CiBpZiAoTlVMTCA9PSBwYnVmKSB7Ci0JU0FZKCJFUlJPUjogIHBidWYgaXMgTlVMTFxuIik7CisJU0FNKCJFUlJPUjogIHBidWYgaXMgTlVMTFxuIik7CiAJZ290byBmaW5pc2g7CiB9CiBwYWdlID0gdmlydF90b19wYWdlKHBidWYpOwogaWYgKE5VTEwgPT0gcGFnZSkgewotCVNBWSgiRVJST1I6ICBwYWdlIGlzIE5VTExcbiIpOworCVNBTSgiRVJST1I6ICBwYWdlIGlzIE5VTExcbiIpOwogCWdvdG8gZmluaXNoOwogfQogZ2V0X3BhZ2UocGFnZSk7CiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiBmaW5pc2g6Ci1tdXRleF91bmxvY2soJihwZWFzeWNhcC0+bXV0ZXhfbW1hcF92aWRlb1swXSkpOwogaWYgKE5VTEwgPT0gcGFnZSkgewotCVNBWSgiRVJST1I6ICBwYWdlIGlzIE5VTEwgYWZ0ZXIgZ2V0X3BhZ2UocGFnZSlcbiIpOworCVNBTSgiRVJST1I6ICBwYWdlIGlzIE5VTEwgYWZ0ZXIgZ2V0X3BhZ2UocGFnZSlcbiIpOwogfSBlbHNlIHsKIAlwdm1mLT5wYWdlID0gcGFnZTsKIAlyZXRjb2RlID0gVk1fRkFVTFRfTUlOT1I7CkBAIC0yMzgzLDcgKzI4MDksNyBAQAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyoKICAqICBPTiBDT01QTEVUSU9OIE9GIEEgVklERU8gVVJCIElUUyBEQVRBIElTIENPUElFRCBUTyBUSEUgRklFTEQgQlVGRkVSUwotICogIFBST1ZJREVEIHBlYXN5Y2FwLT52aWRlb19pZGxlIElTIFpFUjAuICBSRUdBUkRMRVNTIE9GIFRISVMgQkVJTkcgVFJVRSwKKyAqICBQUk9WSURFRCBwZWFzeWNhcC0+dmlkZW9faWRsZSBJUyBaRVJPLiAgUkVHQVJETEVTUyBPRiBUSElTIEJFSU5HIFRSVUUsCiAgKiAgSVQgSVMgUkVTVUJNSVRURUQgUFJPVklERUQgcGVhc3ljYXAtPnZpZGVvX2lzb2Nfc3RyZWFtaW5nIElTIE5PVCBaRVJPLgogICoKICAqICBUSElTIEZVTkNUSU9OIElTIEFOIElOVEVSUlVQVCBTRVJWSUNFIFJPVVRJTkUgQU5EIE1VU1QgTk9UIFNMRUVQLgpAQCAtMjQwMCw3ICsyODI2LDggQEAKICAqICAgICAgMCAhPSAoa291bnQgJiAweDgwMDApICAgPT4gQVQgTEVBU1QgT05FIFVSQiBDT01QTEVURUQgV0lUSCBFUlJPUlMKICAqICAgICAgMCAhPSAoa291bnQgJiAweDQwMDApICAgPT4gQlVGRkVSIEhBUyBUT08gTVVDSCBEQVRBCiAgKiAgICAgIDAgIT0gKGtvdW50ICYgMHgyMDAwKSAgID0+IEJVRkZFUiBIQVMgTk9UIEVOT1VHSCBEQVRBCi0gKiAgICAgIDAgIT0gKGtvdW50ICYgMHgwNDAwKSAgID0+IEZJRUxEIFdBUyBTVUJNSVRURUQgQlkgQlJJREdFUiBST1VUSU5FCisgKiAgICAgIDAgIT0gKGtvdW50ICYgMHgxMDAwKSAgID0+IEJVRkZFUiBIQVMgREFUQSBGUk9NIERJU1BBUkFURSBJTlBVVFMKKyAqICAgICAgMCAhPSAoa291bnQgJiAweDA0MDApICAgPT4gUkVTRVJWRUQKICAqICAgICAgMCAhPSAoa291bnQgJiAweDAyMDApICAgPT4gRklFTEQgQlVGRkVSIE5PVCBZRVQgQ0hFQ0tFRAogICogICAgICAwICE9IChrb3VudCAmIDB4MDEwMCkgICA9PiBCVUZGRVIgSEFTIFRXTyBFWFRSQSBCWVRFUyAtIFdIWT8KICAqLwpAQCAtMjQwOCwxOSArMjgzNSwxNCBAQAogdm9pZAogZWFzeWNhcF9jb21wbGV0ZShzdHJ1Y3QgdXJiICpwdXJiKQogewotc3RhdGljIGludCBtdDsKIHN0cnVjdCBlYXN5Y2FwICpwZWFzeWNhcDsKIHN0cnVjdCBkYXRhX2J1ZmZlciAqcGZpZWxkX2J1ZmZlcjsKIGNoYXIgZXJyYnVmWzE2XTsKIGludCBpLCBtb3JlLCBtdWNoLCBsZWFwLCByYywgbGFzdDsKIGludCB2aWRlb2ZpZWxkYW1vdW50OwotdW5zaWduZWQgaW50IG92ZXJyaWRlOwordW5zaWduZWQgaW50IG92ZXJyaWRlLCBiYWQ7CiBpbnQgZnJhbWVzdGF0dXMsIGZyYW1lbGVuZ3RoLCBmcmFtZWFjdHVhbCwgZnJhbWVvZmZzZXQ7CiBfX3U4ICpwdTsKLSNpZiBkZWZpbmVkKEJSSURHRVIpCi1zdHJ1Y3QgdGltZXZhbCB0aW1ldmFsOwotbG9uZyBsb25nIHVzZWM7Ci0jZW5kaWYgLypCUklER0VSKi8KIAogaWYgKE5VTEwgPT0gcHVyYikgewogCVNBWSgiRVJST1I6IGVhc3ljYXBfY29tcGxldGUoKTogcHVyYiBpcyBOVUxMXG4iKTsKQEAgLTI0MzEsNzQgKzI4NTMsNzggQEAKIAlTQVkoIkVSUk9SOiBlYXN5Y2FwX2NvbXBsZXRlKCk6IHBlYXN5Y2FwIGlzIE5VTExcbiIpOwogCXJldHVybjsKIH0KLQoraWYgKG1lbWNtcCgmcGVhc3ljYXAtPnRlbGx0YWxlWzBdLCBURUxMVEFMRSwgc3RybGVuKFRFTExUQUxFKSkpIHsKKwlTQVkoIkVSUk9SOiBiYWQgcGVhc3ljYXA6IDB4JTA4bFhcbiIsICh1bnNpZ25lZCBsb25nIGludCkgcGVhc3ljYXApOworCXJldHVybjsKK30KIGlmIChwZWFzeWNhcC0+dmlkZW9fZW9mKQogCXJldHVybjsKLQogZm9yIChpID0gMDsgaSA8IFZJREVPX0lTT0NfQlVGRkVSX01BTlk7IGkrKykKIAlpZiAocHVyYi0+dHJhbnNmZXJfYnVmZmVyID09IHBlYXN5Y2FwLT52aWRlb19pc29jX2J1ZmZlcltpXS5wZ28pCiAJCWJyZWFrOwotSk9UKDE2LCAiJTJpPXVyYlxuIiwgaSk7CitKT00oMTYsICIlMmk9dXJiXG4iLCBpKTsKIGxhc3QgPSBwZWFzeWNhcC0+dmlkZW9faXNvY19zZXF1ZW5jZTsKIGlmICgoKChWSURFT19JU09DX0JVRkZFUl9NQU5ZIC0gMSkgPT0gbGFzdCkgJiYgXAogCQkJCQkJKDAgIT0gaSkpIHx8IFwKIAkoKChWSURFT19JU09DX0JVRkZFUl9NQU5ZIC0gMSkgIT0gbGFzdCkgJiYgXAogCQkJCQkJKChsYXN0ICsgMSkgIT0gaSkpKSB7Ci0JU0FZKCJFUlJPUjogb3V0LW9mLW9yZGVyIHVyYnMgJWksJWkgLi4uIGNvbnRpbnVpbmdcbiIsIGxhc3QsIGkpOworCUpPTSgxNiwgIkVSUk9SOiBvdXQtb2Ytb3JkZXIgdXJicyAlaSwlaSAuLi4gY29udGludWluZ1xuIiwgbGFzdCwgaSk7CiB9CiBwZWFzeWNhcC0+dmlkZW9faXNvY19zZXF1ZW5jZSA9IGk7CiAKIGlmIChwZWFzeWNhcC0+dmlkZW9faWRsZSkgewotCUpPVCgxNiwgIiVpPXZpZGVvX2lkbGUgICVpPXZpZGVvX2lzb2Nfc3RyZWFtaW5nXG4iLCBcCisJSk9NKDE2LCAiJWk9dmlkZW9faWRsZSAgJWk9dmlkZW9faXNvY19zdHJlYW1pbmdcbiIsIFwKIAkJCXBlYXN5Y2FwLT52aWRlb19pZGxlLCBwZWFzeWNhcC0+dmlkZW9faXNvY19zdHJlYW1pbmcpOwogCWlmIChwZWFzeWNhcC0+dmlkZW9faXNvY19zdHJlYW1pbmcpIHsKIAkJcmMgPSB1c2Jfc3VibWl0X3VyYihwdXJiLCBHRlBfQVRPTUlDKTsKIAkJaWYgKDAgIT0gcmMpIHsKLQkJCVNBWSgiRVJST1I6IHdoaWxlICVpPXZpZGVvX2lkbGUsICIgXAotCQkJCQkidXNiX3N1Ym1pdF91cmIoKSBmYWlsZWQgd2l0aCByYzpcbiIsIFwKLQkJCQkJCQlwZWFzeWNhcC0+dmlkZW9faWRsZSk7CiAJCQlzd2l0Y2ggKHJjKSB7CiAJCQljYXNlIC1FTk9NRU06IHsKLQkJCQlTQVkoIkVOT01FTVxuIik7CisJCQkJU0FNKCJFTk9NRU1cbiIpOwogCQkJCWJyZWFrOwogCQkJfQogCQkJY2FzZSAtRU5PREVWOiB7Ci0JCQkJU0FZKCJFTk9ERVZcbiIpOworCQkJCVNBTSgiRU5PREVWXG4iKTsKIAkJCQlicmVhazsKIAkJCX0KIAkJCWNhc2UgLUVOWElPOiB7Ci0JCQkJU0FZKCJFTlhJT1xuIik7CisJCQkJU0FNKCJFTlhJT1xuIik7CiAJCQkJYnJlYWs7CiAJCQl9CiAJCQljYXNlIC1FSU5WQUw6IHsKLQkJCQlTQVkoIkVJTlZBTFxuIik7CisJCQkJU0FNKCJFSU5WQUxcbiIpOwogCQkJCWJyZWFrOwogCQkJfQogCQkJY2FzZSAtRUFHQUlOOiB7Ci0JCQkJU0FZKCJFQUdBSU5cbiIpOworCQkJCVNBTSgiRUFHQUlOXG4iKTsKIAkJCQlicmVhazsKIAkJCX0KIAkJCWNhc2UgLUVGQklHOiB7Ci0JCQkJU0FZKCJFRkJJR1xuIik7CisJCQkJU0FNKCJFRkJJR1xuIik7CiAJCQkJYnJlYWs7CiAJCQl9CiAJCQljYXNlIC1FUElQRTogewotCQkJCVNBWSgiRVBJUEVcbiIpOworCQkJCVNBTSgiRVBJUEVcbiIpOwogCQkJCWJyZWFrOwogCQkJfQogCQkJY2FzZSAtRU1TR1NJWkU6IHsKLQkJCQlTQVkoIkVNU0dTSVpFXG4iKTsKKwkJCQlTQU0oIkVNU0dTSVpFXG4iKTsKIAkJCQlicmVhazsKIAkJCX0KIAkJCWNhc2UgLUVOT1NQQzogewotCQkJCVNBWSgiRU5PU1BDXG4iKTsKKwkJCQlTQU0oIkVOT1NQQ1xuIik7CiAJCQkJYnJlYWs7CiAJCQl9CiAJCQlkZWZhdWx0OiB7Ci0JCQkJU0FZKCIweCUwOFhcbiIsIHJjKTsKKwkJCQlTQU0oIjB4JTA4WFxuIiwgcmMpOwogCQkJCWJyZWFrOwogCQkJfQogCQkJfQorCQkJaWYgKC1FTk9ERVYgIT0gcmMpIFwKKwkJCQlTQU0oIkVSUk9SOiB3aGlsZSAlaT12aWRlb19pZGxlLCAiIFwKKwkJCQkJCQkidXNiX3N1Ym1pdF91cmIoKSAiIFwKKwkJCQkJCQkiZmFpbGVkIHdpdGggcmM6XG4iLCBcCisJCQkJCQkJcGVhc3ljYXAtPnZpZGVvX2lkbGUpOwogCQl9CiAJfQogcmV0dXJuOwpAQCAtMjUwNiw4MCArMjkzMiw4MCBAQAogb3ZlcnJpZGUgPSAwOwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogaWYgKEZJRUxEX0JVRkZFUl9NQU5ZIDw9IHBlYXN5Y2FwLT5maWVsZF9maWxsKSB7Ci0JU0FZKCJFUlJPUjogYmFkIHBlYXN5Y2FwLT5maWVsZF9maWxsXG4iKTsKKwlTQU0oIkVSUk9SOiBiYWQgcGVhc3ljYXAtPmZpZWxkX2ZpbGxcbiIpOwogCXJldHVybjsKIH0KIGlmIChwdXJiLT5zdGF0dXMpIHsKIAlpZiAoKC1FU0hVVERPV04gPT0gcHVyYi0+c3RhdHVzKSB8fCAoLUVOT0VOVCA9PSBwdXJiLT5zdGF0dXMpKSB7Ci0JCUpPVCg4LCAidXJiIHN0YXR1cyAtRVNIVVRET1dOIG9yIC1FTk9FTlRcbiIpOworCQlKT00oOCwgInVyYiBzdGF0dXMgLUVTSFVURE9XTiBvciAtRU5PRU5UXG4iKTsKIAkJcmV0dXJuOwogCX0KIAogCShwZWFzeWNhcC0+ZmllbGRfYnVmZmVyW3BlYXN5Y2FwLT5maWVsZF9maWxsXVswXS5rb3VudCkgfD0gMHg4MDAwIDsKLQlTQVkoIkVSUk9SOiBiYWQgdXJiIHN0YXR1czpcbiIpOworCVNBTSgiRVJST1I6IGJhZCB1cmIgc3RhdHVzOlxuIik7CiAJc3dpdGNoIChwdXJiLT5zdGF0dXMpIHsKIAljYXNlIC1FSU5QUk9HUkVTUzogewotCQlTQVkoIi1FSU5QUk9HUkVTU1xuIik7IGJyZWFrOworCQlTQU0oIi1FSU5QUk9HUkVTU1xuIik7IGJyZWFrOwogCX0KIAljYXNlIC1FTk9TUjogewotCQlTQVkoIi1FTk9TUlxuIik7IGJyZWFrOworCQlTQU0oIi1FTk9TUlxuIik7IGJyZWFrOwogCX0KIAljYXNlIC1FUElQRTogewotCQlTQVkoIi1FUElQRVxuIik7IGJyZWFrOworCQlTQU0oIi1FUElQRVxuIik7IGJyZWFrOwogCX0KIAljYXNlIC1FT1ZFUkZMT1c6IHsKLQkJU0FZKCItRU9WRVJGTE9XXG4iKTsgYnJlYWs7CisJCVNBTSgiLUVPVkVSRkxPV1xuIik7IGJyZWFrOwogCX0KIAljYXNlIC1FUFJPVE86IHsKLQkJU0FZKCItRVBST1RPXG4iKTsgYnJlYWs7CisJCVNBTSgiLUVQUk9UT1xuIik7IGJyZWFrOwogCX0KIAljYXNlIC1FSUxTRVE6IHsKLQkJU0FZKCItRUlMU0VRXG4iKTsgYnJlYWs7CisJCVNBTSgiLUVJTFNFUVxuIik7IGJyZWFrOwogCX0KIAljYXNlIC1FVElNRURPVVQ6IHsKLQkJU0FZKCItRVRJTUVET1VUXG4iKTsgYnJlYWs7CisJCVNBTSgiLUVUSU1FRE9VVFxuIik7IGJyZWFrOwogCX0KIAljYXNlIC1FTVNHU0laRTogewotCQlTQVkoIi1FTVNHU0laRVxuIik7IGJyZWFrOworCQlTQU0oIi1FTVNHU0laRVxuIik7IGJyZWFrOwogCX0KIAljYXNlIC1FT1BOT1RTVVBQOiB7Ci0JCVNBWSgiLUVPUE5PVFNVUFBcbiIpOyBicmVhazsKKwkJU0FNKCItRU9QTk9UU1VQUFxuIik7IGJyZWFrOwogCX0KIAljYXNlIC1FUEZOT1NVUFBPUlQ6IHsKLQkJU0FZKCItRVBGTk9TVVBQT1JUXG4iKTsgYnJlYWs7CisJCVNBTSgiLUVQRk5PU1VQUE9SVFxuIik7IGJyZWFrOwogCX0KIAljYXNlIC1FQUZOT1NVUFBPUlQ6IHsKLQkJU0FZKCItRUFGTk9TVVBQT1JUXG4iKTsgYnJlYWs7CisJCVNBTSgiLUVBRk5PU1VQUE9SVFxuIik7IGJyZWFrOwogCX0KIAljYXNlIC1FQUREUklOVVNFOiB7Ci0JCVNBWSgiLUVBRERSSU5VU0VcbiIpOyBicmVhazsKKwkJU0FNKCItRUFERFJJTlVTRVxuIik7IGJyZWFrOwogCX0KIAljYXNlIC1FQUREUk5PVEFWQUlMOiB7Ci0JCVNBWSgiLUVBRERSTk9UQVZBSUxcbiIpOyBicmVhazsKKwkJU0FNKCItRUFERFJOT1RBVkFJTFxuIik7IGJyZWFrOwogCX0KIAljYXNlIC1FTk9CVUZTOiB7Ci0JCVNBWSgiLUVOT0JVRlNcbiIpOyBicmVhazsKKwkJU0FNKCItRU5PQlVGU1xuIik7IGJyZWFrOwogCX0KIAljYXNlIC1FSVNDT05OOiB7Ci0JCVNBWSgiLUVJU0NPTk5cbiIpOyBicmVhazsKKwkJU0FNKCItRUlTQ09OTlxuIik7IGJyZWFrOwogCX0KIAljYXNlIC1FTk9UQ09OTjogewotCQlTQVkoIi1FTk9UQ09OTlxuIik7IGJyZWFrOworCQlTQU0oIi1FTk9UQ09OTlxuIik7IGJyZWFrOwogCX0KIAljYXNlIC1FU0hVVERPV046IHsKLQkJU0FZKCItRVNIVVRET1dOXG4iKTsgYnJlYWs7CisJCVNBTSgiLUVTSFVURE9XTlxuIik7IGJyZWFrOwogCX0KIAljYXNlIC1FTk9FTlQ6IHsKLQkJU0FZKCItRU5PRU5UXG4iKTsgYnJlYWs7CisJCVNBTSgiLUVOT0VOVFxuIik7IGJyZWFrOwogCX0KIAljYXNlIC1FQ09OTlJFU0VUOiB7Ci0JCVNBWSgiLUVDT05OUkVTRVRcbiIpOyBicmVhazsKKwkJU0FNKCItRUNPTk5SRVNFVFxuIik7IGJyZWFrOwogCX0KIAljYXNlIC1FTk9TUEM6IHsKLQkJU0FZKCJFTk9TUENcbiIpOyBicmVhazsKKwkJU0FNKCJFTk9TUENcbiIpOyBicmVhazsKIAl9CiAJZGVmYXVsdDogewotCQlTQVkoInVua25vd24gZXJyb3IgY29kZSAweCUwOFhcbiIsIHB1cmItPnN0YXR1cyk7IGJyZWFrOworCQlTQU0oInVua25vd24gZXJyb3IgY29kZSAweCUwOFhcbiIsIHB1cmItPnN0YXR1cyk7IGJyZWFrOwogCX0KIAl9CiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCkBAIC0yNjM4LDcgKzMwNjQsNyBAQAogCQkJCXN0cmNweSgmZXJyYnVmWzBdLCAiLUVDT05OUkVTRVQiKTsgYnJlYWs7CiAJCQl9CiAJCQljYXNlIC1FTk9TUEM6IHsKLQkJCQlTQVkoIkVOT1NQQ1xuIik7IGJyZWFrOworCQkJCVNBTSgiRU5PU1BDXG4iKTsgYnJlYWs7CiAJCQl9CiAJCQljYXNlIC1FU0hVVERPV046IHsKIAkJCQlzdHJjcHkoJmVycmJ1ZlswXSwgIi1FU0hVVERPV04iKTsgYnJlYWs7CkBAIC0yNjUzLDcgKzMwNzksNyBAQAogCQlmcmFtZWFjdHVhbCA9IHB1cmItPmlzb19mcmFtZV9kZXNjW2ldLmFjdHVhbF9sZW5ndGg7CiAJCWZyYW1lb2Zmc2V0ID0gcHVyYi0+aXNvX2ZyYW1lX2Rlc2NbaV0ub2Zmc2V0OwogCi0JCUpPVCgxNiwgImZyYW1lWyUyaV06IiBcCisJCUpPTSgxNiwgImZyYW1lWyUyaV06IiBcCiAJCQkJIiU0aT1zdGF0dXMgIiAgXAogCQkJCSIlNGk9YWN0dWFsICIgIFwKIAkJCQkiJTRpPWxlbmd0aCAiICBcCkBAIC0yNjY3LDE5ICszMDkzLDIwIEBACiAJCQkJUEFHRV9TSVpFKSArIFwKIAkJCQkoaW50KShwZmllbGRfYnVmZmVyLT5wdG8gLSBwZmllbGRfYnVmZmVyLT5wZ28pOwogCQlpZiAoNCA9PSBtb3JlKQotCQkJbXQrKzsKKwkJCXBlYXN5Y2FwLT52aWRlb19tdCsrOwogCQlpZiAoNCA8IG1vcmUpIHsKLQkJCWlmIChtdCkgewotCQkJCUpPVCg4LCAiJTRpIGVtcHR5IHZpZGVvIHVyYiBmcmFtZXNcbiIsIG10KTsKLQkJCQltdCA9IDA7CisJCQlpZiAocGVhc3ljYXAtPnZpZGVvX210KSB7CisJCQkJSk9NKDgsICIlNGkgZW1wdHkgdmlkZW8gdXJiIGZyYW1lc1xuIiwgXAorCQkJCQkJCXBlYXN5Y2FwLT52aWRlb19tdCk7CisJCQkJcGVhc3ljYXAtPnZpZGVvX210ID0gMDsKIAkJCX0KIAkJCWlmIChGSUVMRF9CVUZGRVJfTUFOWSA8PSBwZWFzeWNhcC0+ZmllbGRfZmlsbCkgewotCQkJCVNBWSgiRVJST1I6IGJhZCBwZWFzeWNhcC0+ZmllbGRfZmlsbFxuIik7CisJCQkJU0FNKCJFUlJPUjogYmFkIHBlYXN5Y2FwLT5maWVsZF9maWxsXG4iKTsKIAkJCQlyZXR1cm47CiAJCQl9CiAJCQlpZiAoRklFTERfQlVGRkVSX1NJWkUvUEFHRV9TSVpFIDw9IFwKIAkJCQkJCQlwZWFzeWNhcC0+ZmllbGRfcGFnZSkgewotCQkJCVNBWSgiRVJST1I6IGJhZCBwZWFzeWNhcC0+ZmllbGRfcGFnZVxuIik7CisJCQkJU0FNKCJFUlJPUjogYmFkIHBlYXN5Y2FwLT5maWVsZF9wYWdlXG4iKTsKIAkJCQlyZXR1cm47CiAJCQl9CiAJCQlwZmllbGRfYnVmZmVyID0gJnBlYXN5Y2FwLT5maWVsZF9idWZmZXJcCkBAIC0yNzEyLDExICszMTM5LDEzIEBACiAJCQkJCQlwZWFzeWNhcC0+dmlkZW9maWVsZGFtb3VudCkgewogCQkJCQlpZiAoMiA9PSB2aWRlb2ZpZWxkYW1vdW50IC0gXAogCQkJCQkJCXBlYXN5Y2FwLT5cCi0JCQkJCQkJdmlkZW9maWVsZGFtb3VudCkKKwkJCQkJCQl2aWRlb2ZpZWxkYW1vdW50KSB7CiAJCQkJCQkocGVhc3ljYXAtPmZpZWxkX2J1ZmZlclwKIAkJCQkJCVtwZWFzeWNhcC0+ZmllbGRfZmlsbF1cCiAJCQkJCQkJWzBdLmtvdW50KSB8PSAweDAxMDA7Ci0JCQkJCWVsc2UKKwkJCQkJCXBlYXN5Y2FwLT52aWRlb19qdW5rICs9ICgxICsgXAorCQkJCQkJCVZJREVPX0pVTktfVE9MRVJBVEUpOworCQkJCQl9IGVsc2UKIAkJCQkJCShwZWFzeWNhcC0+ZmllbGRfYnVmZmVyXAogCQkJCQkJW3BlYXN5Y2FwLT5maWVsZF9maWxsXVwKIAkJCQkJCQlbMF0ua291bnQpIHw9IDB4NDAwMDsKQEAgLTI3MjcsNTMgKzMxNTYsNzQgQEAKIAkJCQkJCVtwZWFzeWNhcC0+ZmllbGRfZmlsbF1cCiAJCQkJCQkJWzBdLmtvdW50KSB8PSAweDIwMDA7CiAJCQkJCX0KLQkJCQlpZiAoISgweEZGMDAgJiBwZWFzeWNhcC0+ZmllbGRfYnVmZmVyXAorCQkJCQliYWQgPSAweEZGMDAgJiBwZWFzeWNhcC0+ZmllbGRfYnVmZmVyXAogCQkJCQkJW3BlYXN5Y2FwLT5maWVsZF9maWxsXVwKLQkJCQkJCVswXS5rb3VudCkpIHsKLQkJCQkJKHBlYXN5Y2FwLT52aWRlb19qdW5rKS0tOwotCQkJCQlpZiAoLTE2ID4gcGVhc3ljYXAtPnZpZGVvX2p1bmspCi0JCQkJCQlwZWFzeWNhcC0+dmlkZW9fanVuayA9IC0xNjsKLQkJCQkJcGVhc3ljYXAtPmZpZWxkX3JlYWQgPSBcCisJCQkJCQlbMF0ua291bnQ7CisJCQkJCWlmICghYmFkKSB7CisJCQkJCQkocGVhc3ljYXAtPnZpZGVvX2p1bmspLS07CisJCQkJCQlpZiAoLVZJREVPX0pVTktfVE9MRVJBVEUgPiBcCisJCQkJCQkJcGVhc3ljYXAtPnZpZGVvX2p1bmspIFwKKwkJCQkJCQlwZWFzeWNhcC0+dmlkZW9fanVuayA9XAorCQkJCQkJCS1WSURFT19KVU5LX1RPTEVSQVRFOworCQkJCQkJcGVhc3ljYXAtPmZpZWxkX3JlYWQgPSBcCiAJCQkJCQkJKHBlYXN5Y2FwLT5cCiAJCQkJCQkJCWZpZWxkX2ZpbGwpKys7Ci0KLQkJCQkJaWYgKEZJRUxEX0JVRkZFUl9NQU5ZIDw9IFwKLQkJCQkJCXBlYXN5Y2FwLT5maWVsZF9maWxsKQotCQkJCQkJcGVhc3ljYXAtPmZpZWxkX2ZpbGwgPSAwOwotCQkJCQlwZWFzeWNhcC0+ZmllbGRfcGFnZSA9IDA7Ci0JCQkJCXBmaWVsZF9idWZmZXIgPSAmcGVhc3ljYXAtPlwKLQkJCQkJCWZpZWxkX2J1ZmZlclwKLQkJCQkJCVtwZWFzeWNhcC0+ZmllbGRfZmlsbF1cCi0JCQkJCQlbcGVhc3ljYXAtPmZpZWxkX3BhZ2VdOwotCQkJCQlwZmllbGRfYnVmZmVyLT5wdG8gPSBcCisJCQkJCQlpZiAoRklFTERfQlVGRkVSX01BTlkgPD0gXAorCQkJCQkJCQlwZWFzeWNhcC0+XAorCQkJCQkJCQlmaWVsZF9maWxsKQorCQkJCQkJCXBlYXN5Y2FwLT5cCisJCQkJCQkJCWZpZWxkX2ZpbGwgPSAwOworCQkJCQkJcGVhc3ljYXAtPmZpZWxkX3BhZ2UgPSAwOworCQkJCQkJcGZpZWxkX2J1ZmZlciA9ICZwZWFzeWNhcC0+XAorCQkJCQkJCWZpZWxkX2J1ZmZlclwKKwkJCQkJCQlbcGVhc3ljYXAtPlwKKwkJCQkJCQlmaWVsZF9maWxsXVwKKwkJCQkJCQlbcGVhc3ljYXAtPlwKKwkJCQkJCQlmaWVsZF9wYWdlXTsKKwkJCQkJCXBmaWVsZF9idWZmZXItPnB0byA9IFwKIAkJCQkJCQlwZmllbGRfYnVmZmVyLT5wZ287Ci0KLQkJCQkJSk9UKDgsICJidW1wZWQgdG86ICVpPXBlYXN5Y2FwLT4iIFwKLQkJCQkJCSJmaWVsZF9maWxsICAlaT1wYXJpdHlcbiIsIFwKLQkJCQkJCXBlYXN5Y2FwLT5maWVsZF9maWxsLCBcCi0JCQkJCQkweDAwRkYgJiBwZmllbGRfYnVmZmVyLT5rb3VudCk7Ci0JCQkJCUpPVCg4LCAiZmllbGQgYnVmZmVyICVpIGhhcyAlaSAiIFwKLQkJCQkJCSJieXRlcyBmaXQgdG8gYmUgcmVhZFxuIiwgXAotCQkJCQkJcGVhc3ljYXAtPmZpZWxkX3JlYWQsIFwKLQkJCQkJCXZpZGVvZmllbGRhbW91bnQpOwotCQkJCQlKT1QoOCwgIndha2V1cCBjYWxsIHRvIHdxX3ZpZGVvLCAiIFwKLQkJCQkJCSIlaT1maWVsZF9yZWFkICVpPWZpZWxkX2ZpbGwgIlwKLQkJCQkJCSIlaT1wYXJpdHlcbiIsIFwKLQkJCQkJCXBlYXN5Y2FwLT5maWVsZF9yZWFkLCBcCi0JCQkJCQlwZWFzeWNhcC0+ZmllbGRfZmlsbCwgXAotCQkJCQkJMHgwMEZGICYgcGVhc3ljYXAtPlwKLQkJCQkJCWZpZWxkX2J1ZmZlcltwZWFzeWNhcC0+XAotCQkJCQkJZmllbGRfcmVhZF1bMF0ua291bnQpOwotCQkJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJihwZWFzeWNhcC0+XAotCQkJCQkJCQl3cV92aWRlbykpOwotCQkJCQlkb19nZXR0aW1lb2ZkYXkoJnBlYXN5Y2FwLT50aW1ldmFsNyk7CisJCQkJCQlKT00oOCwgImJ1bXBlZCB0bzogJWk9IlwKKwkJCQkJCQkicGVhc3ljYXAtPiIgXAorCQkJCQkJCSJmaWVsZF9maWxsICAlaT0iXAorCQkJCQkJCSJwYXJpdHlcbiIsIFwKKwkJCQkJCQlwZWFzeWNhcC0+ZmllbGRfZmlsbCwgXAorCQkJCQkJCTB4MDBGRiAmIFwKKwkJCQkJCQlwZmllbGRfYnVmZmVyLT5rb3VudCk7CisJCQkJCQlKT00oOCwgImZpZWxkIGJ1ZmZlciAlaSBoYXMgIlwKKwkJCQkJCQkiJWkgYnl0ZXMgZml0IHRvIGJlICJcCisJCQkJCQkJInJlYWRcbiIsIFwKKwkJCQkJCQlwZWFzeWNhcC0+ZmllbGRfcmVhZCwgXAorCQkJCQkJCXZpZGVvZmllbGRhbW91bnQpOworCQkJCQkJSk9NKDgsICJ3YWtldXAgY2FsbCB0byAiXAorCQkJCQkJCSJ3cV92aWRlbywgIiBcCisJCQkJCQkJIiVpPWZpZWxkX3JlYWQgIlwKKwkJCQkJCQkiJWk9ZmllbGRfZmlsbCAiXAorCQkJCQkJCSIlaT1wYXJpdHlcbiIsIFwKKwkJCQkJCQlwZWFzeWNhcC0+ZmllbGRfcmVhZCwgXAorCQkJCQkJCXBlYXN5Y2FwLT5maWVsZF9maWxsLCBcCisJCQkJCQkJMHgwMEZGICYgcGVhc3ljYXAtPlwKKwkJCQkJCQlmaWVsZF9idWZmZXJcCisJCQkJCQkJW3BlYXN5Y2FwLT5cCisJCQkJCQkJZmllbGRfcmVhZF1bMF0ua291bnQpOworCQkJCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlXAorCQkJCQkJCSgmKHBlYXN5Y2FwLT5cCisJCQkJCQkJCSB3cV92aWRlbykpOworCQkJCQkJZG9fZ2V0dGltZW9mZGF5XAorCQkJCQkJCSgmcGVhc3ljYXAtPnRpbWV2YWw3KTsKIAkJCQkJfSBlbHNlIHsKIAkJCQkJcGVhc3ljYXAtPnZpZGVvX2p1bmsrKzsKLQkJCQkJSk9UKDgsICJmaWVsZCBidWZmZXIgJWkgaGFkICVpICIgXAotCQkJCQkJImJ5dGVzLCBub3cgZGlzY2FyZGVkXG4iLCBcCisJCQkJCWlmIChiYWQgJiAweDAwMTApIFwKKwkJCQkJCXBlYXN5Y2FwLT52aWRlb19qdW5rICs9IFwKKwkJCQkJCSgxICsgVklERU9fSlVOS19UT0xFUkFURS8yKTsKKwkJCQkJSk9NKDgsICJmaWVsZCBidWZmZXIgJWkgaGFkICVpICIgXAorCQkJCQkJImJ5dGVzLCBub3cgZGlzY2FyZGVkOiAiXAorCQkJCQkJIjB4JTA0WFxuIiwgXAogCQkJCQkJcGVhc3ljYXAtPmZpZWxkX2ZpbGwsIFwKLQkJCQkJCXZpZGVvZmllbGRhbW91bnQpOwotCisJCQkJCQl2aWRlb2ZpZWxkYW1vdW50LFwKKwkJCQkJCSgweEZGMDAgJiBcCisJCQkJCQlwZWFzeWNhcC0+ZmllbGRfYnVmZmVyXAorCQkJCQkJW3BlYXN5Y2FwLT5maWVsZF9maWxsXVswXS5cCisJCQkJCQlrb3VudCkpOwogCQkJCQkocGVhc3ljYXAtPmZpZWxkX2ZpbGwpKys7CiAKIAkJCQkJaWYgKEZJRUxEX0JVRkZFUl9NQU5ZIDw9IFwKQEAgLTI3ODcsMjAgKzMyMzcsMjIgQEAKIAkJCQkJcGZpZWxkX2J1ZmZlci0+cHRvID0gXAogCQkJCQkJCXBmaWVsZF9idWZmZXItPnBnbzsKIAotCQkJCQlKT1QoOCwgImJ1bXBlZCB0bzogJWk9cGVhc3ljYXAtPiIgXAorCQkJCQlKT00oOCwgImJ1bXBlZCB0bzogJWk9cGVhc3ljYXAtPiIgXAogCQkJCQkJImZpZWxkX2ZpbGwgICVpPXBhcml0eVxuIiwgXAogCQkJCQkJcGVhc3ljYXAtPmZpZWxkX2ZpbGwsIFwKIAkJCQkJCTB4MDBGRiAmIHBmaWVsZF9idWZmZXItPmtvdW50KTsKIAkJCQl9CiAJCQkJaWYgKDggPT0gbW9yZSkgewotCQkJCQlKT1QoOCwgImVuZC1vZi1maWVsZDogcmVjZWl2ZWQgIiBcCisJCQkJCUpPTSg4LCAiZW5kLW9mLWZpZWxkOiByZWNlaXZlZCAiIFwKIAkJCQkJCSJwYXJpdHkgYnl0ZSAweCUwMlhcbiIsIFwKIAkJCQkJCSgweEZGICYgKnB1KSk7CiAJCQkJCWlmICgweDQwICYgKnB1KQogCQkJCQkJcGZpZWxkX2J1ZmZlci0+a291bnQgPSAweDAwMDA7CiAJCQkJCWVsc2UKIAkJCQkJCXBmaWVsZF9idWZmZXItPmtvdW50ID0gMHgwMDAxOwotCQkJCQlKT1QoOCwgImVuZC1vZi1maWVsZDogMHglMDJYPWtvdW50XG4iLFwKKwkJCQkJcGZpZWxkX2J1ZmZlci0+aW5wdXQgPSAweDA4IHwgXAorCQkJCQkJKDB4MDcgJiBwZWFzeWNhcC0+aW5wdXQpOworCQkJCQlKT00oOCwgImVuZC1vZi1maWVsZDogMHglMDJYPWtvdW50XG4iLFwKIAkJCQkJCTB4RkYgJiBwZmllbGRfYnVmZmVyLT5rb3VudCk7CiAJCQkJfQogCQkJfQpAQCAtMjgxMywxMiArMzI2NSwxMiBAQAogCQkJbW9yZSAtPSBsZWFwOwogCiAJCQlpZiAoRklFTERfQlVGRkVSX01BTlkgPD0gcGVhc3ljYXAtPmZpZWxkX2ZpbGwpIHsKLQkJCQlTQVkoIkVSUk9SOiBiYWQgcGVhc3ljYXAtPmZpZWxkX2ZpbGxcbiIpOworCQkJCVNBTSgiRVJST1I6IGJhZCBwZWFzeWNhcC0+ZmllbGRfZmlsbFxuIik7CiAJCQkJcmV0dXJuOwogCQkJfQogCQkJaWYgKEZJRUxEX0JVRkZFUl9TSVpFL1BBR0VfU0laRSA8PSBcCiAJCQkJCQkJcGVhc3ljYXAtPmZpZWxkX3BhZ2UpIHsKLQkJCQlTQVkoIkVSUk9SOiBiYWQgcGVhc3ljYXAtPmZpZWxkX3BhZ2VcbiIpOworCQkJCVNBTSgiRVJST1I6IGJhZCBwZWFzeWNhcC0+ZmllbGRfcGFnZVxuIik7CiAJCQkJcmV0dXJuOwogCQkJfQogCQkJcGZpZWxkX2J1ZmZlciA9ICZwZWFzeWNhcC0+ZmllbGRfYnVmZmVyXApAQCAtMjgyOSw3ICszMjgxLDcgQEAKIAkJCQkJCVtwZWFzeWNhcC0+ZmllbGRfcGFnZV07CiAJCQkJaWYgKFBBR0VfU0laRSA8IChwZmllbGRfYnVmZmVyLT5wdG8gLSBcCiAJCQkJCQkJcGZpZWxkX2J1ZmZlci0+cGdvKSkgewotCQkJCQlTQVkoIkVSUk9SOiBiYWQgcGZpZWxkX2J1ZmZlci0+cHRvXG4iKTsKKwkJCQkJU0FNKCJFUlJPUjogYmFkIHBmaWVsZF9idWZmZXItPnB0b1xuIik7CiAJCQkJCXJldHVybjsKIAkJCQl9CiAJCQkJaWYgKFBBR0VfU0laRSA9PSAocGZpZWxkX2J1ZmZlci0+cHRvIC0gXApAQCAtMjgzNyw3ICszMjg5LDcgQEAKIAkJCQkJKHBlYXN5Y2FwLT5maWVsZF9wYWdlKSsrOwogCQkJCQlpZiAoRklFTERfQlVGRkVSX1NJWkUvUEFHRV9TSVpFIDw9IFwKIAkJCQkJCQlwZWFzeWNhcC0+ZmllbGRfcGFnZSkgewotCQkJCQkJSk9UKDE2LCAid3JhcHBpbmcgcGVhc3ljYXAtPiIgXAorCQkJCQkJSk9NKDE2LCAid3JhcHBpbmcgcGVhc3ljYXAtPiIgXAogCQkJCQkJCSJmaWVsZF9wYWdlXG4iKTsKIAkJCQkJCXBlYXN5Y2FwLT5maWVsZF9wYWdlID0gMDsKIAkJCQkJfQpAQCAtMjg0Nyw2ICszMjk5LDE1IEBACiAJCQkJCQkJW3BlYXN5Y2FwLT5maWVsZF9wYWdlXTsKIAkJCQkJcGZpZWxkX2J1ZmZlci0+cHRvID0gXAogCQkJCQkJCXBmaWVsZF9idWZmZXItPnBnbzsKKwkJCQkJcGZpZWxkX2J1ZmZlci0+aW5wdXQgPSAweDA4IHwgXAorCQkJCQkJKDB4MDcgJiBwZWFzeWNhcC0+aW5wdXQpOworCQkJCQlpZiAoKHBlYXN5Y2FwLT5maWVsZF9idWZmZXJbcGVhc3ljYXAtPlwKKwkJCQkJCQlmaWVsZF9maWxsXVswXSkuXAorCQkJCQkJCQlpbnB1dCAhPSBcCisJCQkJCQkJcGZpZWxkX2J1ZmZlci0+aW5wdXQpCisJCQkJCQkocGVhc3ljYXAtPmZpZWxkX2J1ZmZlclwKKwkJCQkJCQlbcGVhc3ljYXAtPmZpZWxkX2ZpbGxdXAorCQkJCQkJCVswXSkua291bnQgfD0gMHgxMDAwOwogCQkJCX0KIAogCQkJCW11Y2ggPSBQQUdFX1NJWkUgLSAoaW50KShwZmllbGRfYnVmZmVyLT5wdG8gLSBcCkBAIC0yODY1LDU1ICszMzI2LDYgQEAKIH0KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8qCi0gKgotICoKLSAqICAgICAgICAgICAgICoqKiBVTkRFUiBERVZFTE9QTUVOVC9URVNUSU5HIC0gTk9UIFJFQURZIFlFVCEgKioqCi0gKgotICoKLSAqCi0gKiAgVklERU9UQVBFUyBNQVkgSEFWRSBCRUVOIE1BTlVBTExZIFBBVVNFRCBBTkQgUkVTVEFSVEVEIERVUklORyBSRUNPUkRJTkcuCi0gKiAgVEhJUyBDQVVTRVMgTE9TUyBPRiBTWU5DLCBDT05GVVNJTkcgRE9XTlNUUkVBTSBVU0VSU1BBQ0UgUFJPR1JBTVMgV0hJQ0gKLSAqICBNQVkgSU5URVJQUkVUIFRIRSBJTlRFUlJVUFRJT04gQVMgQSBTWU1QVE9NIE9GIExBVEVOQ1kuICBUTyBPVkVSQ09NRSBUSElTCi0gKiAgVEhFIERSSVZFUiBCUklER0VTIFRIRSBISUFUVVMgQlkgU0VORElORyBEVU1NWSBWSURFTyBGUkFNRVMgQVQgUk9VR0hMWQotICogIFRIRSBSSUdIVCBUSU1FIElOVEVSVkFMUyBJTiBUSEUgSE9QRSBPRiBQRVJTVUFESU5HIFRIRSBET1dOU1RSRUFNIFVTRVJTUEFDRQotICogIFBST0dSQU0gVE8gUkVTVU1FIE5PUk1BTCBTRVJWSUNFIFdIRU4gVEhFIElOVEVSUlVQVElPTiBJUyBPVkVSLgotICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jaWYgZGVmaW5lZChCUklER0VSKQotZG9fZ2V0dGltZW9mZGF5KCZ0aW1ldmFsKTsKLWlmIChwZWFzeWNhcC0+dGltZXZhbDcudHZfc2VjKSB7Ci0JdXNlYyA9IDEwMDAwMDAqKHRpbWV2YWwudHZfc2VjICAtIHBlYXN5Y2FwLT50aW1ldmFsNy50dl9zZWMpICsgXAotCQkJKHRpbWV2YWwudHZfdXNlYyAtIHBlYXN5Y2FwLT50aW1ldmFsNy50dl91c2VjKTsKLQlpZiAodXNlYyA+IChwZWFzeWNhcC0+dXNlYyArIHBlYXN5Y2FwLT50b2xlcmF0ZSkpIHsKLQkJSk9UKDgsICJicmlkZ2luZyBoaWF0dXNcbiIpOwotCQlwZWFzeWNhcC0+dmlkZW9fanVuayA9IDA7Ci0JCXBlYXN5Y2FwLT5maWVsZF9idWZmZXJbcGVhc3ljYXAtPmZpZWxkX2ZpbGxdWzBdLmtvdW50IHw9IDB4MDQwMDsKLQotCQlwZWFzeWNhcC0+ZmllbGRfcmVhZCA9IChwZWFzeWNhcC0+ZmllbGRfZmlsbCkrKzsKLQotCQlpZiAoRklFTERfQlVGRkVSX01BTlkgPD0gcGVhc3ljYXAtPmZpZWxkX2ZpbGwpIFwKLQkJCQkJCXBlYXN5Y2FwLT5maWVsZF9maWxsID0gMDsKLQkJcGVhc3ljYXAtPmZpZWxkX3BhZ2UgPSAwOwotCQlwZmllbGRfYnVmZmVyID0gJnBlYXN5Y2FwLT5maWVsZF9idWZmZXJcCi0JCQkJW3BlYXN5Y2FwLT5maWVsZF9maWxsXVtwZWFzeWNhcC0+ZmllbGRfcGFnZV07Ci0JCXBmaWVsZF9idWZmZXItPnB0byA9IHBmaWVsZF9idWZmZXItPnBnbzsKLQotCQlKT1QoOCwgImJ1bXBlZCB0bzogJWk9cGVhc3ljYXAtPmZpZWxkX2ZpbGwgICVpPXBhcml0eVxuIiwgXAotCQkJcGVhc3ljYXAtPmZpZWxkX2ZpbGwsIDB4MDBGRiAmIHBmaWVsZF9idWZmZXItPmtvdW50KTsKLQkJSk9UKDgsICJmaWVsZCBidWZmZXIgJWkgaGFzICVpIGJ5dGVzIHRvIGJlIG92ZXJ3cml0dGVuXG4iLCBcCi0JCQlwZWFzeWNhcC0+ZmllbGRfcmVhZCwgdmlkZW9maWVsZGFtb3VudCk7Ci0JCUpPVCg4LCAid2FrZXVwIGNhbGwgdG8gd3FfdmlkZW8sICIgXAotCQkJIiVpPWZpZWxkX3JlYWQgJWk9ZmllbGRfZmlsbCAlaT1wYXJpdHlcbiIsIFwKLQkJCXBlYXN5Y2FwLT5maWVsZF9yZWFkLCBwZWFzeWNhcC0+ZmllbGRfZmlsbCwgXAotCQkJMHgwMEZGICYgXAotCQkJcGVhc3ljYXAtPmZpZWxkX2J1ZmZlcltwZWFzeWNhcC0+ZmllbGRfcmVhZF1bMF0ua291bnQpOwotCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJihwZWFzeWNhcC0+d3FfdmlkZW8pKTsKLQkJZG9fZ2V0dGltZW9mZGF5KCZwZWFzeWNhcC0+dGltZXZhbDcpOwotCX0KLX0KLSNlbmRpZiAvKkJSSURHRVIqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyoKICAqICBSRVNVQk1JVCBUSElTIFVSQiwgVU5MRVNTIEEgU0VWRVJFIFBFUlNJU1RFTlQgRVJST1IgQ09ORElUSU9OIEVYSVNUUy4KICAqCiAgKiAgSUYgVEhFIFdBSVQgUVVFVUVTIEFSRSBOT1QgQ0xFQVJFRCBJTiBSRVNQT05TRSBUTyBBTiBFUlJPUiBDT05ESVRJT04KQEAgLTI5MjEsNTEgKzMzMzMsNTcgQEAKICAqLwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogaWYgKFZJREVPX0lTT0NfQlVGRkVSX01BTlkgPD0gcGVhc3ljYXAtPnZpZGVvX2p1bmspIHsKLQlTQVkoImVhc3ljYXAgZHJpdmVyIHNodXR0aW5nIGRvd24gb24gY29uZGl0aW9uIGdyZWVuXG4iKTsKKwlTQU0oImVhc3ljYXAgZHJpdmVyIHNodXR0aW5nIGRvd24gb24gY29uZGl0aW9uIGdyZWVuXG4iKTsKKwlwZWFzeWNhcC0+c3RhdHVzID0gMTsKIAlwZWFzeWNhcC0+dmlkZW9fZW9mID0gMTsKKwlwZWFzeWNhcC0+dmlkZW9fanVuayA9IDA7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZwZWFzeWNhcC0+d3FfdmlkZW8pOworI2lmICFkZWZpbmVkKFBFUlNFVkVSRSkKIAlwZWFzeWNhcC0+YXVkaW9fZW9mID0gMTsKLQlwZWFzeWNhcC0+dmlkZW9fanVuayA9IC1WSURFT19JU09DX0JVRkZFUl9NQU5ZOwotCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmKHBlYXN5Y2FwLT53cV92aWRlbykpOwotCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmKHBlYXN5Y2FwLT53cV9hdWRpbykpOworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcGVhc3ljYXAtPndxX2F1ZGlvKTsKKyNlbmRpZiAvKlBFUlNFVkVSRSovCiAJcmV0dXJuOwogfQogaWYgKHBlYXN5Y2FwLT52aWRlb19pc29jX3N0cmVhbWluZykgewogCXJjID0gdXNiX3N1Ym1pdF91cmIocHVyYiwgR0ZQX0FUT01JQyk7CiAJaWYgKDAgIT0gcmMpIHsKLQkJU0FZKCJFUlJPUjogd2hpbGUgJWk9dmlkZW9faWRsZSwgdXNiX3N1Ym1pdF91cmIoKSBmYWlsZWQgIiBcCi0JCQkJCSJ3aXRoIHJjOlxuIiwgcGVhc3ljYXAtPnZpZGVvX2lkbGUpOwogCQlzd2l0Y2ggKHJjKSB7CiAJCWNhc2UgLUVOT01FTTogewotCQkJU0FZKCJFTk9NRU1cbiIpOyBicmVhazsKKwkJCVNBTSgiRU5PTUVNXG4iKTsgYnJlYWs7CiAJCX0KIAkJY2FzZSAtRU5PREVWOiB7Ci0JCQlTQVkoIkVOT0RFVlxuIik7IGJyZWFrOworCQkJU0FNKCJFTk9ERVZcbiIpOyBicmVhazsKIAkJfQogCQljYXNlIC1FTlhJTzogewotCQkJU0FZKCJFTlhJT1xuIik7IGJyZWFrOworCQkJU0FNKCJFTlhJT1xuIik7IGJyZWFrOwogCQl9CiAJCWNhc2UgLUVJTlZBTDogewotCQkJU0FZKCJFSU5WQUxcbiIpOyBicmVhazsKKwkJCVNBTSgiRUlOVkFMXG4iKTsgYnJlYWs7CiAJCX0KIAkJY2FzZSAtRUFHQUlOOiB7Ci0JCQlTQVkoIkVBR0FJTlxuIik7IGJyZWFrOworCQkJU0FNKCJFQUdBSU5cbiIpOyBicmVhazsKIAkJfQogCQljYXNlIC1FRkJJRzogewotCQkJU0FZKCJFRkJJR1xuIik7IGJyZWFrOworCQkJU0FNKCJFRkJJR1xuIik7IGJyZWFrOwogCQl9CiAJCWNhc2UgLUVQSVBFOiB7Ci0JCQlTQVkoIkVQSVBFXG4iKTsgYnJlYWs7CisJCQlTQU0oIkVQSVBFXG4iKTsgYnJlYWs7CiAJCX0KIAkJY2FzZSAtRU1TR1NJWkU6IHsKLQkJCVNBWSgiRU1TR1NJWkVcbiIpOyAgYnJlYWs7CisJCQlTQU0oIkVNU0dTSVpFXG4iKTsgIGJyZWFrOwogCQl9CiAJCWNhc2UgLUVOT1NQQzogewotCQkJU0FZKCJFTk9TUENcbiIpOyBicmVhazsKKwkJCVNBTSgiRU5PU1BDXG4iKTsgYnJlYWs7CiAJCX0KIAkJZGVmYXVsdDogewotCQkJU0FZKCIweCUwOFhcbiIsIHJjKTsgYnJlYWs7CisJCQlTQU0oIjB4JTA4WFxuIiwgcmMpOyBicmVhazsKIAkJfQogCQl9CisJCWlmICgtRU5PREVWICE9IHJjKSBcCisJCQlTQU0oIkVSUk9SOiB3aGlsZSAlaT12aWRlb19pZGxlLCAiIFwKKwkJCQkJCSJ1c2Jfc3VibWl0X3VyYigpICIgXAorCQkJCQkJImZhaWxlZCB3aXRoIHJjOlxuIiwgXAorCQkJCQkJcGVhc3ljYXAtPnZpZGVvX2lkbGUpOwogCX0KIH0KIHJldHVybjsKQEAgLTI5NzcsOCArMzM5NSw4IEBACiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhNRQogICoKICAqCi0gKiAgVEhJUyBGVU5DVElPTiBBU1NVTUVTIFRIQVQsIE9OIEVBQ0ggQU5EIEVWRVJZIE9DQ0FTSU9OIFRIQVQgVEhFIERFVklDRSBJUwotICogIFBIWVNJQ0FMTFkgUExVR0dFRCBJTiwgSU5URVJGQUNFIDAgSVMgUFJPQkVEIEZJUlNULgorICogIFRISVMgRlVOQ1RJT04gQVNTVU1FUyBUSEFULCBPTiBFQUNIIEFORCBFVkVSWSBPQ0NBU0lPTiBUSEFUIFRIRSBFYXN5Q0FQCisgKiAgSVMgUEhZU0lDQUxMWSBQTFVHR0VEIElOLCBJTlRFUkZBQ0UgMCBJUyBQUk9CRUQgRklSU1QuCiAgKiAgSUYgVEhJUyBJUyBOT1QgVFJVRSwgVEhFUkUgSVMgVEhFIFBPU1NJQklMSVRZIE9GIEFOIE9vcHMuCiAgKgogICogIFRISVMgSEFTIE5FVkVSIEJFRU4gQSBQUk9CTEVNIElOIFBSQUNUSUNFLCBCVVQgU09NRVRISU5HIFNFRU1TIFdST05HIEhFUkUuCkBAIC0yOTk0LDcgKzM0MTIsNyBAQAogc3RydWN0IHVzYl9pbnRlcmZhY2VfZGVzY3JpcHRvciAqcHVzYl9pbnRlcmZhY2VfZGVzY3JpcHRvcjsKIHN0cnVjdCB1c2JfaW50ZXJmYWNlX2Fzc29jX2Rlc2NyaXB0b3IgKnB1c2JfaW50ZXJmYWNlX2Fzc29jX2Rlc2NyaXB0b3I7CiBzdHJ1Y3QgdXJiICpwdXJiOwotc3RhdGljIHN0cnVjdCBlYXN5Y2FwICpwZWFzeWNhcCAvKj1OVUxMKi87CitzdHJ1Y3QgZWFzeWNhcCAqcGVhc3ljYXA7CiBzdHJ1Y3QgZGF0YV91cmIgKnBkYXRhX3VyYjsKIHNpemVfdCB3TWF4UGFja2V0U2l6ZTsKIGludCBJU09Dd01heFBhY2tldFNpemU7CkBAIC0zMDA0LDE5ICszNDIyLDMyIEBACiBfX3U4IGJFbmRwb2ludEFkZHJlc3M7CiBfX3U4IElTT0NiRW5kcG9pbnRBZGRyZXNzOwogX191OCBJTlRiRW5kcG9pbnRBZGRyZXNzOwotaW50IGlzaW4sIGksIGosIGssIG07CitpbnQgaXNpbiwgaSwgaiwgaywgbSwgcmM7CiBfX3U4IGJJbnRlcmZhY2VOdW1iZXI7CiBfX3U4IGJJbnRlcmZhY2VDbGFzczsKIF9fdTggYkludGVyZmFjZVN1YkNsYXNzOwogdm9pZCAqcGJ1ZjsKIGludCBva2FsdFs4XSwgaXNva2FsdDsKLWludCBva2Vwbls4XSwgaXNva2VwbjsKLWludCBva21wc1s4XSwgaXNva21wczsKK2ludCBva2Vwbls4XTsKK2ludCBva21wc1s4XTsKIGludCBtYXhwYWNrZXRzaXplOwotaW50IHJjOworX191MTYgbWFzazsKK19fczMyIHZhbHVlOworc3RydWN0IGVhc3ljYXBfZm9ybWF0ICpwZWFzeWNhcF9mb3JtYXQ7CiAKIEpPVCg0LCAiXG4iKTsKIAoraWYgKCFkb25nbGVfZG9uZSkgeworCWRvbmdsZV9kb25lID0gMTsKKwlmb3IgKGsgPSAwOyBrIDwgRE9OR0xFX01BTlk7IGsrKykgeworCQllYXN5Y2FwX2RvbmdsZVtrXS5wZWFzeWNhcCA9IChzdHJ1Y3QgZWFzeWNhcCAqKU5VTEw7CisJCW11dGV4X2luaXQoJmVhc3ljYXBfZG9uZ2xlW2tdLm11dGV4X3ZpZGVvKTsKKwkJbXV0ZXhfaW5pdCgmZWFzeWNhcF9kb25nbGVba10ubXV0ZXhfYXVkaW8pOworCX0KK30KKworcGVhc3ljYXAgPSAoc3RydWN0IGVhc3ljYXAgKilOVUxMOworCiBpZiAoKHN0cnVjdCB1c2JfaW50ZXJmYWNlICopTlVMTCA9PSBwdXNiX2ludGVyZmFjZSkgewogCVNBWSgiRVJST1I6IHB1c2JfaW50ZXJmYWNlIGlzIE5VTExcbiIpOwogCXJldHVybiAtRUZBVUxUOwpAQCAtMzExNyw0NiArMzU0OCw4MyBAQAogLyoKICAqICBBIE5FVyBzdHJ1Y3QgZWFzeWNhcCBJUyBBTFdBWVMgQUxMT0NBVEVEIFdIRU4gSU5URVJGQUNFIDAgSVMgUFJPQkVELgogICogIElUIElTIE5PVCBQT1NTSUJMRSBIRVJFIFRPIEZSRUUgQU5ZIEVYSVNUSU5HIHN0cnVjdCBlYXN5Y2FwLiAgVEhJUwotICogIFNIT1VMRCBIQVZFIEJFRU4gRE9ORSBCWSBlYXN5Y2FwX2RlbGV0ZSgpIFdIRU4gVEhFIERFVklDRSBXQVMgUEhZU0lDQUxMWQotICogIFVOUExVR0dFRC4KLSAqLworICogIFNIT1VMRCBIQVZFIEJFRU4gRE9ORSBCWSBlYXN5Y2FwX2RlbGV0ZSgpIFdIRU4gVEhFIEVhc3lDQVAgV0FTCisgKiAgUEhZU0lDQUxMWSBVTlBMVUdHRUQuCisgKgorICogIFRIRSBQT0lOVEVSIHBlYXN5Y2FwIFRPIFRIRSBzdHJ1Y3QgZWFzeWNhcCBJUyBSRU1FTUJFUkVEIFdIRU4KKyAqICBJTlRFUkZBQ0VTIDEgQU5EIDIgQVJFIFBST0JFRC4KKyAqCisgKiAgSUYgVFdPIEVhc3lDQVBzIEFSRSBQTFVHR0VEIElOIE5FQVJMWSBTSU1VTFRBTkVPVVNMWSBUSEVSRSBXSUxMCisgKiAgQkUgVFJPVUJMRS4gIEJFV0FSRS4KKyovCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiBpZiAoMCA9PSBiSW50ZXJmYWNlTnVtYmVyKSB7CiAJcGVhc3ljYXAgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZWFzeWNhcCksIEdGUF9LRVJORUwpOwogCWlmIChOVUxMID09IHBlYXN5Y2FwKSB7CiAJCVNBWSgiRVJST1I6IENvdWxkIG5vdCBhbGxvY2F0ZSBwZWFzeWNhcFxuIik7CiAJCXJldHVybiAtRU5PTUVNOwotCX0gZWxzZSB7Ci0JCXBlYXN5Y2FwLT5hbGxvY2F0aW9uX3ZpZGVvX3N0cnVjdCA9IHNpemVvZihzdHJ1Y3QgZWFzeWNhcCk7Ci0JCXBlYXN5Y2FwLT5hbGxvY2F0aW9uX3ZpZGVvX3BhZ2UgPSAwOwotCQlwZWFzeWNhcC0+YWxsb2NhdGlvbl92aWRlb191cmIgPSAwOwotCQlwZWFzeWNhcC0+YWxsb2NhdGlvbl9hdWRpb19zdHJ1Y3QgPSAwOwotCQlwZWFzeWNhcC0+YWxsb2NhdGlvbl9hdWRpb19wYWdlID0gMDsKLQkJcGVhc3ljYXAtPmFsbG9jYXRpb25fYXVkaW9fdXJiID0gMDsKIAl9CisJU0FNKCJhbGxvY2F0ZWQgMHglMDhsWD1wZWFzeWNhcFxuIiwgKHVuc2lnbmVkIGxvbmcgaW50KSBwZWFzeWNhcCk7CisvKnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2diovCisjaWYgZGVmaW5lZChFQVNZQ0FQX0lTX1ZJREVPREVWX0NMSUVOVCkKKwlTQU0oIndoZXJlICAgICAweCUwOGxYPSZwZWFzeWNhcC0+dmlkZW9fZGV2aWNlXG4iLCBcCisJCQkJKHVuc2lnbmVkIGxvbmcgaW50KSAmcGVhc3ljYXAtPnZpZGVvX2RldmljZSk7CisjaWYgZGVmaW5lZChFQVNZQ0FQX05FRURTX1Y0TDJfREVWSUNFX0gpCisJU0FNKCJhbmQgICAgICAgMHglMDhsWD0mcGVhc3ljYXAtPnY0bDJfZGV2aWNlXG4iLCBcCisJCQkJKHVuc2lnbmVkIGxvbmcgaW50KSAmcGVhc3ljYXAtPnY0bDJfZGV2aWNlKTsKKyNlbmRpZiAvKkVBU1lDQVBfTkVFRFNfVjRMMl9ERVZJQ0VfSCovCisjZW5kaWYgLypFQVNZQ0FQX0lTX1ZJREVPREVWX0NMSUVOVCovCisvKl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXiovCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKgotICogIElOSVRJQUxJWkUgVEhFIE5FVyBlYXN5Y2FwIFNUUlVDVFVSRS4KLSAqICBOTyBQQVJBTUVURVJTIEFSRSBTUEVDSUZJRUQgSEVSRSBSRVFVSVJJTkcgVEhFIFNFVFRJTkcgT0YgUkVHSVNURVJTLgotICogIFRIQVQgSVMgRE9ORSBGSVJTVCBCWSBlYXN5Y2FwX29wZW4oKSBBTkQgTEFURVIgQlkgZWFzeWNhcF9pb2N0bCgpLgotICovCisgKiAgUEVSRk9STSBVUkdFTlQgSU5USUFMSVpBVElPTlMgLi4uCisqLwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCXBlYXN5Y2FwLT5wdXNiX2RldmljZSA9IHB1c2JfZGV2aWNlOwotCXBlYXN5Y2FwLT5wdXNiX2ludGVyZmFjZSA9IHB1c2JfaW50ZXJmYWNlOwotCisJc3RyY3B5KCZwZWFzeWNhcC0+dGVsbHRhbGVbMF0sIFRFTExUQUxFKTsKIAlrcmVmX2luaXQoJnBlYXN5Y2FwLT5rcmVmKTsKLQlKT1QoOCwgImludGZbJWldOiBhZnRlciBrcmVmX2luaXQoLi4uX3ZpZGVvKSAiIFwKKwlKT00oOCwgImludGZbJWldOiBhZnRlciBrcmVmX2luaXQoLi4uX3ZpZGVvKSAiIFwKIAkJCSIlaT1wZWFzeWNhcC0+a3JlZi5yZWZjb3VudC5jb3VudGVyXG4iLCBcCiAJCQliSW50ZXJmYWNlTnVtYmVyLCBwZWFzeWNhcC0+a3JlZi5yZWZjb3VudC5jb3VudGVyKTsKIAotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJihwZWFzeWNhcC0+d3FfdmlkZW8pKTsKLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCYocGVhc3ljYXAtPndxX2F1ZGlvKSk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmcGVhc3ljYXAtPndxX3ZpZGVvKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZwZWFzeWNhcC0+d3FfYXVkaW8pOwogCi0JbXV0ZXhfaW5pdCgmKHBlYXN5Y2FwLT5tdXRleF90aW1ldmFsMCkpOwotCW11dGV4X2luaXQoJihwZWFzeWNhcC0+bXV0ZXhfdGltZXZhbDEpKTsKKwlmb3IgKGRvbmdsZV90aGlzID0gMDsgZG9uZ2xlX3RoaXMgPCBET05HTEVfTUFOWTsgZG9uZ2xlX3RoaXMrKykgeworCQlpZiAoTlVMTCA9PSBlYXN5Y2FwX2RvbmdsZVtkb25nbGVfdGhpc10ucGVhc3ljYXApIHsKKwkJCWlmICgwID09IG11dGV4X2lzX2xvY2tlZCgmZWFzeWNhcF9kb25nbGVcCisJCQkJCQlbZG9uZ2xlX3RoaXNdLm11dGV4X3ZpZGVvKSkgeworCQkJCWlmICgwID09IG11dGV4X2lzX2xvY2tlZCgmZWFzeWNhcF9kb25nbGVcCisJCQkJCQlbZG9uZ2xlX3RoaXNdLm11dGV4X2F1ZGlvKSkgeworCQkJCQllYXN5Y2FwX2RvbmdsZVwKKwkJCQkJCVtkb25nbGVfdGhpc10ucGVhc3ljYXAgPSBcCisJCQkJCQkJCXBlYXN5Y2FwOworCQkJCQlKT00oOCwgImludGZbJWldOiBwZWFzeWNhcC0tPmVhc3ljYXAiIFwKKwkJCQkJCSJfZG9uZ2xlWyVpXS5wZWFzeWNhcFxuIiwgXAorCQkJCQkJYkludGVyZmFjZU51bWJlciwgZG9uZ2xlX3RoaXMpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisJaWYgKERPTkdMRV9NQU5ZIDw9IGRvbmdsZV90aGlzKSB7CisJCVNBTSgiRVJST1I6IHRvbyBtYW55IGRvbmdsZXNcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CiAKLQlmb3IgKGsgPSAwOyBrIDwgRlJBTUVfQlVGRkVSX01BTlk7IGsrKykKLQkJbXV0ZXhfaW5pdCgmKHBlYXN5Y2FwLT5tdXRleF9tbWFwX3ZpZGVvW2tdKSk7CisJcGVhc3ljYXAtPmFsbG9jYXRpb25fdmlkZW9fc3RydWN0ID0gc2l6ZW9mKHN0cnVjdCBlYXN5Y2FwKTsKKwlwZWFzeWNhcC0+YWxsb2NhdGlvbl92aWRlb19wYWdlID0gMDsKKwlwZWFzeWNhcC0+YWxsb2NhdGlvbl92aWRlb191cmIgPSAwOworCXBlYXN5Y2FwLT5hbGxvY2F0aW9uX2F1ZGlvX3N0cnVjdCA9IDA7CisJcGVhc3ljYXAtPmFsbG9jYXRpb25fYXVkaW9fcGFnZSA9IDA7CisJcGVhc3ljYXAtPmFsbG9jYXRpb25fYXVkaW9fdXJiID0gMDsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqICAuLi4gQU5EIEZVUlRIRVIgSU5JVElBTElaRSBUSEUgU1RSVUNUVVJFCisqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCXBlYXN5Y2FwLT5wdXNiX2RldmljZSA9IHB1c2JfZGV2aWNlOworCXBlYXN5Y2FwLT5wdXNiX2ludGVyZmFjZSA9IHB1c2JfaW50ZXJmYWNlOwogCiAJcGVhc3ljYXAtPmlsayA9IDA7CiAJcGVhc3ljYXAtPm1pY3JvcGhvbmUgPSBmYWxzZTsKQEAgLTMxNzcsNDYgKzM2NDUsMTcyIEBACiAKIAlwZWFzeWNhcC0+ZnJhbWVfYnVmZmVyX21hbnkgPSBGUkFNRV9CVUZGRVJfTUFOWTsKIAotCWlmICgoc3RydWN0IG11dGV4ICopTlVMTCA9PSAmKHBlYXN5Y2FwLT5tdXRleF9tbWFwX3ZpZGVvWzBdKSkgewotCQlTQVkoIkVSUk9SOiAmKHBlYXN5Y2FwLT5tdXRleF9tbWFwX3ZpZGVvWyVpXSkgaXMgTlVMTFxuIiwgMCk7Ci0JCXJldHVybiAtRUZBVUxUOwotCX0KKwlmb3IgKGsgPSAwOyBrIDwgSU5QVVRfTUFOWTsgaysrKQorCQlwZWFzeWNhcC0+bG9zdFtrXSA9IDA7CisJcGVhc3ljYXAtPnNraXAgPSAwOworCXBlYXN5Y2FwLT5za2lwcGVkID0gMDsKKwlwZWFzeWNhcC0+b2ZmZXJmaWVsZHMgPSAwOwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyoKLSAqICBEWU5BTUlDQUxMWSBGSUxMIElOIFRIRSBBVkFJTEFCTEUgRk9STUFUUy4KKyAqICBEWU5BTUlDQUxMWSBGSUxMIElOIFRIRSBBVkFJTEFCTEUgRk9STUFUUyAuLi4KICAqLwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCXJjID0gZmlsbGluX2Zvcm1hdHMoKTsKIAlpZiAoMCA+IHJjKSB7Ci0JCVNBWSgiRVJST1I6IGZpbGxpbl9mb3JtYXRzKCkgcmV0dXJuZWQgJWlcbiIsIHJjKTsKKwkJU0FNKCJFUlJPUjogZmlsbGluX2Zvcm1hdHMoKSByZXR1cm5lZCAlaVxuIiwgcmMpOwogCQlyZXR1cm4gLUVGQVVMVDsKIAl9Ci0JSk9UKDQsICIlaSBmb3JtYXRzIGF2YWlsYWJsZVxuIiwgcmMpOwotCX0gZWxzZSB7CisJSk9NKDQsICIlaSBmb3JtYXRzIGF2YWlsYWJsZVxuIiwgcmMpOwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCQlpZiAoKHN0cnVjdCBlYXN5Y2FwICopTlVMTCA9PSBwZWFzeWNhcCkgewotCQkJU0FZKCJFUlJPUjogcGVhc3ljYXAgaXMgTlVMTCAiIFwKLQkJCQkJIndoZW4gcHJvYmluZyBpbnRlcmZhY2UgJWlcbiIsIFwKLQkJCQkJCQliSW50ZXJmYWNlTnVtYmVyKTsKLQkJCXJldHVybiAtRUZBVUxUOworLyoKKyAqICAuLi4gQU5EIFBPUFVMQVRFIGVhc3ljYXAuaW5wdXRzZXRbXQorKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwlmb3IgKGsgPSAwOyBrIDwgSU5QVVRfTUFOWTsgaysrKSB7CisJCXBlYXN5Y2FwLT5pbnB1dHNldFtrXS5pbnB1dF9vayA9IDA7CisJCXBlYXN5Y2FwLT5pbnB1dHNldFtrXS5zdGFuZGFyZF9vZmZzZXRfb2sgPSAwOworCQlwZWFzeWNhcC0+aW5wdXRzZXRba10uZm9ybWF0X29mZnNldF9vayA9IDA7CisJCXBlYXN5Y2FwLT5pbnB1dHNldFtrXS5icmlnaHRuZXNzX29rID0gMDsKKwkJcGVhc3ljYXAtPmlucHV0c2V0W2tdLmNvbnRyYXN0X29rID0gMDsKKwkJcGVhc3ljYXAtPmlucHV0c2V0W2tdLnNhdHVyYXRpb25fb2sgPSAwOworCQlwZWFzeWNhcC0+aW5wdXRzZXRba10uaHVlX29rID0gMDsKKwl9CisJaWYgKHRydWUgPT0gcGVhc3ljYXAtPm50c2MpIHsKKwkJaSA9IDA7CisJCW0gPSAwOworCQltYXNrID0gMDsKKwkJd2hpbGUgKDB4RkZGRiAhPSBlYXN5Y2FwX3N0YW5kYXJkW2ldLm1hc2spIHsKKwkJCWlmIChOVFNDX00gPT0gZWFzeWNhcF9zdGFuZGFyZFtpXS5cCisJCQkJCQkJdjRsMl9zdGFuZGFyZC5pbmRleCkgeworCQkJCW0rKzsKKwkJCQlmb3IgKGsgPSAwOyBrIDwgSU5QVVRfTUFOWTsgaysrKSB7CisJCQkJCXBlYXN5Y2FwLT5pbnB1dHNldFtrXS5cCisJCQkJCQkJc3RhbmRhcmRfb2Zmc2V0ID0gaTsKKwkJCQl9CisJCQltYXNrID0gZWFzeWNhcF9zdGFuZGFyZFtpXS5tYXNrOworCQkJfQorCQkJaSsrOwogCQl9CisJfSBlbHNlIHsKKwkJaSA9IDA7CisJCW0gPSAwOworCQltYXNrID0gMDsKKwkJd2hpbGUgKDB4RkZGRiAhPSBlYXN5Y2FwX3N0YW5kYXJkW2ldLm1hc2spIHsKKwkJCWlmIChQQUxfQkdISU4gPT0gZWFzeWNhcF9zdGFuZGFyZFtpXS5cCisJCQkJCQkJdjRsMl9zdGFuZGFyZC5pbmRleCkgeworCQkJCW0rKzsKKwkJCQlmb3IgKGsgPSAwOyBrIDwgSU5QVVRfTUFOWTsgaysrKSB7CisJCQkJCXBlYXN5Y2FwLT5pbnB1dHNldFtrXS5cCisJCQkJCQkJc3RhbmRhcmRfb2Zmc2V0ID0gaTsKKwkJCQl9CisJCQltYXNrID0gZWFzeWNhcF9zdGFuZGFyZFtpXS5tYXNrOworCQkJfQorCQkJaSsrOworCQl9CisJfQogCi0JSk9UKDgsICJrcmVmX2dldCgpIHdpdGggJWk9cGVhc3ljYXAtPmtyZWYucmVmY291bnQuY291bnRlclxuIiwgXAotCQkJCQkoaW50KXBlYXN5Y2FwLT5rcmVmLnJlZmNvdW50LmNvdW50ZXIpOwotCWtyZWZfZ2V0KCZwZWFzeWNhcC0+a3JlZik7CisJaWYgKDEgIT0gbSkgeworCQlTQU0oIk1JU1RBS0U6IGVhc3ljYXAuaW5wdXRzZXRbXS5zdGFuZGFyZF9vZmZzZXQgIiBcCisJCQkJCQkidW5wb3B1bGF0ZWQsICVpPW1cbiIsIG0pOworCQlyZXR1cm4gLUVOT0VOVDsKKwl9CisKKwlwZWFzeWNhcF9mb3JtYXQgPSAmZWFzeWNhcF9mb3JtYXRbMF07CisJaSA9IDA7CisJbSA9IDA7CisJd2hpbGUgKDAgIT0gcGVhc3ljYXBfZm9ybWF0LT52NGwyX2Zvcm1hdC5mbXQucGl4LndpZHRoKSB7CisJCWlmICgoKHBlYXN5Y2FwX2Zvcm1hdC0+bWFzayAmIDB4MEYpID09IChtYXNrICYgMHgwRikpICYmIFwKKwkJCQkocGVhc3ljYXBfZm9ybWF0LT5cCisJCQkJCXY0bDJfZm9ybWF0LmZtdC5waXguZmllbGQgPT0gXAorCQkJCQkJCVY0TDJfRklFTERfTk9ORSkgJiYgXAorCQkJCShwZWFzeWNhcF9mb3JtYXQtPlwKKwkJCQkJdjRsMl9mb3JtYXQuZm10LnBpeC5waXhlbGZvcm1hdCA9PSBcCisJCQkJCQkJVjRMMl9QSVhfRk1UX1VZVlkpICYmIFwKKwkJCQkocGVhc3ljYXBfZm9ybWF0LT5cCisJCQkJCXY0bDJfZm9ybWF0LmZtdC5waXgud2lkdGggID09IFwKKwkJCQkJCQk2NDApICYmIFwKKwkJCQkocGVhc3ljYXBfZm9ybWF0LT5cCisJCQkJCXY0bDJfZm9ybWF0LmZtdC5waXguaGVpZ2h0ID09IDQ4MCkpIHsKKwkJCW0rKzsKKwkJCWZvciAoayA9IDA7IGsgPCBJTlBVVF9NQU5ZOyBrKyspCisJCQkJcGVhc3ljYXAtPmlucHV0c2V0W2tdLmZvcm1hdF9vZmZzZXQgPSBpOworCQkJYnJlYWs7CisJCX0KKwlwZWFzeWNhcF9mb3JtYXQrKzsKKwlpKys7CisJfQorCWlmICgxICE9IG0pIHsKKwkJU0FNKCJNSVNUQUtFOiBlYXN5Y2FwLmlucHV0c2V0W10uZm9ybWF0X29mZnNldCB1bnBvcHVsYXRlZFxuIik7CisJcmV0dXJuIC1FTk9FTlQ7CisJfQorCisJaSA9IDA7CisJbSA9IDA7CisJd2hpbGUgKDB4RkZGRkZGRkYgIT0gZWFzeWNhcF9jb250cm9sW2ldLmlkKSB7CisJCXZhbHVlID0gZWFzeWNhcF9jb250cm9sW2ldLmRlZmF1bHRfdmFsdWU7CisJCWlmIChWNEwyX0NJRF9CUklHSFRORVNTID09IGVhc3ljYXBfY29udHJvbFtpXS5pZCkgeworCQkJbSsrOworCQkJZm9yIChrID0gMDsgayA8IElOUFVUX01BTlk7IGsrKykKKwkJCQlwZWFzeWNhcC0+aW5wdXRzZXRba10uYnJpZ2h0bmVzcyA9IHZhbHVlOworCQl9IGVsc2UgaWYgKFY0TDJfQ0lEX0NPTlRSQVNUID09IGVhc3ljYXBfY29udHJvbFtpXS5pZCkgeworCQkJbSsrOworCQkJZm9yIChrID0gMDsgayA8IElOUFVUX01BTlk7IGsrKykKKwkJCQlwZWFzeWNhcC0+aW5wdXRzZXRba10uY29udHJhc3QgPSB2YWx1ZTsKKwkJfSBlbHNlIGlmIChWNEwyX0NJRF9TQVRVUkFUSU9OID09IGVhc3ljYXBfY29udHJvbFtpXS5pZCkgeworCQkJbSsrOworCQkJZm9yIChrID0gMDsgayA8IElOUFVUX01BTlk7IGsrKykKKwkJCQlwZWFzeWNhcC0+aW5wdXRzZXRba10uc2F0dXJhdGlvbiA9IHZhbHVlOworCQl9IGVsc2UgaWYgKFY0TDJfQ0lEX0hVRSA9PSBlYXN5Y2FwX2NvbnRyb2xbaV0uaWQpIHsKKwkJCW0rKzsKKwkJCWZvciAoayA9IDA7IGsgPCBJTlBVVF9NQU5ZOyBrKyspCisJCQkJcGVhc3ljYXAtPmlucHV0c2V0W2tdLmh1ZSA9IHZhbHVlOworCQl9CisJCWkrKzsKKwl9CisJaWYgKDQgIT0gbSkgeworCQlTQU0oIk1JU1RBS0U6IGVhc3ljYXAuaW5wdXRzZXRbXS5icmlnaHRuZXNzLC4uLiAiIFwKKwkJCQkJCSJ1bmRlcnBvcHVsYXRlZFxuIik7CisJCXJldHVybiAtRU5PRU5UOworCX0KKwlmb3IgKGsgPSAwOyBrIDwgSU5QVVRfTUFOWTsgaysrKQorCQlwZWFzeWNhcC0+aW5wdXRzZXRba10uaW5wdXQgPSBrOworCUpPTSg0LCAicG9wdWxhdGVkIGVhc3ljYXAuaW5wdXRzZXRbXVxuIik7CisJSk9NKDQsICJmaW5pc2hlZCBpbml0aWFsaXphdGlvblxuIik7Cit9IGVsc2UgeworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCS8qCisJICogIEZPUiBJTlRFUkZBQ0VTIDEgQU5EIDIgVEhFIFBPSU5URVIgcGVhc3ljYXAgSVMgT0JUQUlORUQgQlkgQVNTVU1JTkcKKwkgKiAgVEhBVCBkb25nbGVfdGhpcyBIQVMgTk9UIENIQU5HRUQgU0lOQ0UgSU5URVJGQUNFIDAgV0FTIFBST0JFRC4gIElGCisJICogIFRISVMgSVMgTk9UIFRIRSBDQVNFLCBGT1IgRVhBTVBMRSBXSEVOIFRXTyBFQVNZQ0FQcyBBUkUgUExVR0dFRCBJTgorCSAqICBTSU1VTFRBTkVPVVNMWSwgVEhFUkUgV0lMTCBCRSBTRVJJT1VTIFRST1VCTEUuCisJKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwlpZiAoKDAgPiBkb25nbGVfdGhpcykgfHwgKERPTkdMRV9NQU5ZIDw9IGRvbmdsZV90aGlzKSkgeworCQlTQVkoIkVSUk9SOiBiYWQgZG9uZ2xlIGNvdW50XG4iKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCXBlYXN5Y2FwID0gZWFzeWNhcF9kb25nbGVbZG9uZ2xlX3RoaXNdLnBlYXN5Y2FwOworCUpPVCg4LCAiaW50ZlslaV06IGVhc3ljYXBfZG9uZ2xlWyVpXS5wZWFzeWNhcC0tPnBlYXN5Y2FwXG4iLCBcCisJCQkJCQliSW50ZXJmYWNlTnVtYmVyLCBkb25nbGVfdGhpcyk7CisKKwlpZiAoKHN0cnVjdCBlYXN5Y2FwICopTlVMTCA9PSBwZWFzeWNhcCkgeworCQlTQVkoIkVSUk9SOiBwZWFzeWNhcCBpcyBOVUxMIHdoZW4gcHJvYmluZyBpbnRlcmZhY2UgJWlcbiIsIFwKKwkJCQkJCQliSW50ZXJmYWNlTnVtYmVyKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQogfQogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogaWYgKChVU0JfQ0xBU1NfVklERU8gPT0gYkludGVyZmFjZUNsYXNzKSB8fCBcCi0JKFVTQl9DTEFTU19WRU5ET1JfU1BFQyA9PSBiSW50ZXJmYWNlQ2xhc3MpKSB7CisJCShVU0JfQ0xBU1NfVkVORE9SX1NQRUMgPT0gYkludGVyZmFjZUNsYXNzKSkgewogCWlmICgtMSA9PSBwZWFzeWNhcC0+dmlkZW9faW50ZXJmYWNlKSB7CiAJCXBlYXN5Y2FwLT52aWRlb19pbnRlcmZhY2UgPSBiSW50ZXJmYWNlTnVtYmVyOwotCQlKT1QoNCwgInNldHRpbmcgcGVhc3ljYXAtPnZpZGVvX2ludGVyZmFjZT0laVxuIiwgXAorCQlKT00oNCwgInNldHRpbmcgcGVhc3ljYXAtPnZpZGVvX2ludGVyZmFjZT0laVxuIiwgXAogCQkJCQkJcGVhc3ljYXAtPnZpZGVvX2ludGVyZmFjZSk7CiAJfSBlbHNlIHsKIAkJaWYgKHBlYXN5Y2FwLT52aWRlb19pbnRlcmZhY2UgIT0gYkludGVyZmFjZU51bWJlcikgewotCQkJU0FZKCJFUlJPUjogYXR0ZW1wdGluZyB0byByZXNldCAiIFwKKwkJCVNBTSgiRVJST1I6IGF0dGVtcHRpbmcgdG8gcmVzZXQgIiBcCiAJCQkJCSJwZWFzeWNhcC0+dmlkZW9faW50ZXJmYWNlXG4iKTsKLQkJCVNBWSgiLi4uLi4uIGNvbnRpbnVpbmcgd2l0aCAiIFwKKwkJCVNBTSgiLi4uLi4uIGNvbnRpbnVpbmcgd2l0aCAiIFwKIAkJCQkJIiVpPXBlYXN5Y2FwLT52aWRlb19pbnRlcmZhY2VcbiIsIFwKIAkJCQkJcGVhc3ljYXAtPnZpZGVvX2ludGVyZmFjZSk7CiAJCX0KQEAgLTMyMjUsMTMgKzM4MTksMTMgQEAKIAkJCQkJCSgweDAyID09IGJJbnRlcmZhY2VTdWJDbGFzcykpIHsKIAlpZiAoLTEgPT0gcGVhc3ljYXAtPmF1ZGlvX2ludGVyZmFjZSkgewogCQlwZWFzeWNhcC0+YXVkaW9faW50ZXJmYWNlID0gYkludGVyZmFjZU51bWJlcjsKLQkJSk9UKDQsICJzZXR0aW5nIHBlYXN5Y2FwLT5hdWRpb19pbnRlcmZhY2U9JWlcbiIsIFwKKwkJSk9NKDQsICJzZXR0aW5nIHBlYXN5Y2FwLT5hdWRpb19pbnRlcmZhY2U9JWlcbiIsIFwKIAkJCQkJCSBwZWFzeWNhcC0+YXVkaW9faW50ZXJmYWNlKTsKIAl9IGVsc2UgewogCQlpZiAocGVhc3ljYXAtPmF1ZGlvX2ludGVyZmFjZSAhPSBiSW50ZXJmYWNlTnVtYmVyKSB7Ci0JCQlTQVkoIkVSUk9SOiBhdHRlbXB0aW5nIHRvIHJlc2V0ICIgXAorCQkJU0FNKCJFUlJPUjogYXR0ZW1wdGluZyB0byByZXNldCAiIFwKIAkJCQkJInBlYXN5Y2FwLT5hdWRpb19pbnRlcmZhY2VcbiIpOwotCQkJU0FZKCIuLi4uLi4gY29udGludWluZyB3aXRoICIgXAorCQkJU0FNKCIuLi4uLi4gY29udGludWluZyB3aXRoICIgXAogCQkJCQkiJWk9cGVhc3ljYXAtPmF1ZGlvX2ludGVyZmFjZVxuIiwgXAogCQkJCQlwZWFzeWNhcC0+YXVkaW9faW50ZXJmYWNlKTsKIAkJfQpAQCAtMzI0NCwzNyArMzgzOCwzNSBAQAogICovCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiBpc29rYWx0ID0gMDsKLWlzb2tlcG4gPSAwOwotaXNva21wcyA9IDA7CiAKIGZvciAoaSA9IDA7IGkgPCBwdXNiX2ludGVyZmFjZS0+bnVtX2FsdHNldHRpbmc7IGkrKykgewogCXB1c2JfaG9zdF9pbnRlcmZhY2UgPSAmKHB1c2JfaW50ZXJmYWNlLT5hbHRzZXR0aW5nW2ldKTsKIAlpZiAoKHN0cnVjdCB1c2JfaG9zdF9pbnRlcmZhY2UgKilOVUxMID09IHB1c2JfaG9zdF9pbnRlcmZhY2UpIHsKLQkJU0FZKCJFUlJPUjogcHVzYl9ob3N0X2ludGVyZmFjZSBpcyBOVUxMXG4iKTsKKwkJU0FNKCJFUlJPUjogcHVzYl9ob3N0X2ludGVyZmFjZSBpcyBOVUxMXG4iKTsKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJfQogCXB1c2JfaW50ZXJmYWNlX2Rlc2NyaXB0b3IgPSAmKHB1c2JfaG9zdF9pbnRlcmZhY2UtPmRlc2MpOwogCWlmICgoc3RydWN0IHVzYl9pbnRlcmZhY2VfZGVzY3JpcHRvciAqKU5VTEwgPT0gXAogCQkJCQkJcHVzYl9pbnRlcmZhY2VfZGVzY3JpcHRvcikgewotCQlTQVkoIkVSUk9SOiBwdXNiX2ludGVyZmFjZV9kZXNjcmlwdG9yIGlzIE5VTExcbiIpOworCQlTQU0oIkVSUk9SOiBwdXNiX2ludGVyZmFjZV9kZXNjcmlwdG9yIGlzIE5VTExcbiIpOwogCQlyZXR1cm4gLUVGQVVMVDsKIAl9CiAKLQlKT1QoNCwgImludGZbJWldYWx0WyVpXTogZGVzYy5iRGVzY3JpcHRvclR5cGU9MHglMDJYXG4iLCBcCisJSk9NKDQsICJpbnRmWyVpXWFsdFslaV06IGRlc2MuYkRlc2NyaXB0b3JUeXBlPTB4JTAyWFxuIiwgXAogCWJJbnRlcmZhY2VOdW1iZXIsIGksIHB1c2JfaW50ZXJmYWNlX2Rlc2NyaXB0b3ItPmJEZXNjcmlwdG9yVHlwZSk7Ci0JSk9UKDQsICJpbnRmWyVpXWFsdFslaV06IGRlc2MuYkludGVyZmFjZU51bWJlcj0weCUwMlhcbiIsIFwKKwlKT00oNCwgImludGZbJWldYWx0WyVpXTogZGVzYy5iSW50ZXJmYWNlTnVtYmVyPTB4JTAyWFxuIiwgXAogCWJJbnRlcmZhY2VOdW1iZXIsIGksIHB1c2JfaW50ZXJmYWNlX2Rlc2NyaXB0b3ItPmJJbnRlcmZhY2VOdW1iZXIpOwotCUpPVCg0LCAiaW50ZlslaV1hbHRbJWldOiBkZXNjLmJBbHRlcm5hdGVTZXR0aW5nPTB4JTAyWFxuIiwgXAorCUpPTSg0LCAiaW50ZlslaV1hbHRbJWldOiBkZXNjLmJBbHRlcm5hdGVTZXR0aW5nPTB4JTAyWFxuIiwgXAogCWJJbnRlcmZhY2VOdW1iZXIsIGksIHB1c2JfaW50ZXJmYWNlX2Rlc2NyaXB0b3ItPmJBbHRlcm5hdGVTZXR0aW5nKTsKLQlKT1QoNCwgImludGZbJWldYWx0WyVpXTogZGVzYy5iTnVtRW5kcG9pbnRzPTB4JTAyWFxuIiwgXAorCUpPTSg0LCAiaW50ZlslaV1hbHRbJWldOiBkZXNjLmJOdW1FbmRwb2ludHM9MHglMDJYXG4iLCBcCiAJYkludGVyZmFjZU51bWJlciwgaSwgcHVzYl9pbnRlcmZhY2VfZGVzY3JpcHRvci0+Yk51bUVuZHBvaW50cyk7Ci0JSk9UKDQsICJpbnRmWyVpXWFsdFslaV06IGRlc2MuYkludGVyZmFjZUNsYXNzPTB4JTAyWFxuIiwgXAorCUpPTSg0LCAiaW50ZlslaV1hbHRbJWldOiBkZXNjLmJJbnRlcmZhY2VDbGFzcz0weCUwMlhcbiIsIFwKIAliSW50ZXJmYWNlTnVtYmVyLCBpLCBwdXNiX2ludGVyZmFjZV9kZXNjcmlwdG9yLT5iSW50ZXJmYWNlQ2xhc3MpOwotCUpPVCg0LCAiaW50ZlslaV1hbHRbJWldOiBkZXNjLmJJbnRlcmZhY2VTdWJDbGFzcz0weCUwMlhcbiIsIFwKKwlKT00oNCwgImludGZbJWldYWx0WyVpXTogZGVzYy5iSW50ZXJmYWNlU3ViQ2xhc3M9MHglMDJYXG4iLCBcCiAJYkludGVyZmFjZU51bWJlciwgaSwgcHVzYl9pbnRlcmZhY2VfZGVzY3JpcHRvci0+YkludGVyZmFjZVN1YkNsYXNzKTsKLQlKT1QoNCwgImludGZbJWldYWx0WyVpXTogZGVzYy5iSW50ZXJmYWNlUHJvdG9jb2w9MHglMDJYXG4iLCBcCisJSk9NKDQsICJpbnRmWyVpXWFsdFslaV06IGRlc2MuYkludGVyZmFjZVByb3RvY29sPTB4JTAyWFxuIiwgXAogCWJJbnRlcmZhY2VOdW1iZXIsIGksIHB1c2JfaW50ZXJmYWNlX2Rlc2NyaXB0b3ItPmJJbnRlcmZhY2VQcm90b2NvbCk7Ci0JSk9UKDQsICJpbnRmWyVpXWFsdFslaV06IGRlc2MuaUludGVyZmFjZT0weCUwMlhcbiIsIFwKKwlKT00oNCwgImludGZbJWldYWx0WyVpXTogZGVzYy5pSW50ZXJmYWNlPTB4JTAyWFxuIiwgXAogCWJJbnRlcmZhY2VOdW1iZXIsIGksIHB1c2JfaW50ZXJmYWNlX2Rlc2NyaXB0b3ItPmlJbnRlcmZhY2UpOwogCiAJSVNPQ3dNYXhQYWNrZXRTaXplID0gLTE7CkBAIC0zMjg1LDg2ICszODc3LDgwIEBACiAJSU5UYkVuZHBvaW50QWRkcmVzcyA9IDA7CiAKIAlpZiAoMCA9PSBwdXNiX2ludGVyZmFjZV9kZXNjcmlwdG9yLT5iTnVtRW5kcG9pbnRzKQotCQkJCUpPVCg0LCAiaW50ZlslaV1hbHRbJWldIGhhcyBubyBlbmRwb2ludHNcbiIsIFwKKwkJCQlKT00oNCwgImludGZbJWldYWx0WyVpXSBoYXMgbm8gZW5kcG9pbnRzXG4iLCBcCiAJCQkJCQkJYkludGVyZmFjZU51bWJlciwgaSk7CiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAJZm9yIChqID0gMDsgaiA8IHB1c2JfaW50ZXJmYWNlX2Rlc2NyaXB0b3ItPmJOdW1FbmRwb2ludHM7IGorKykgewogCQlwZXBkID0gJihwdXNiX2hvc3RfaW50ZXJmYWNlLT5lbmRwb2ludFtqXS5kZXNjKTsKIAkJaWYgKChzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKilOVUxMID09IHBlcGQpIHsKLQkJCVNBWSgiRVJST1I6ICBwZXBkIGlzIE5VTEwuXG4iKTsKLQkJCVNBWSgiLi4uLi4uIHNraXBwaW5nXG4iKTsKKwkJCVNBTSgiRVJST1I6ICBwZXBkIGlzIE5VTEwuXG4iKTsKKwkJCVNBTSgiLi4uLi4uIHNraXBwaW5nXG4iKTsKIAkJCWNvbnRpbnVlOwogCQl9CiAJCXdNYXhQYWNrZXRTaXplID0gbGUxNl90b19jcHUocGVwZC0+d01heFBhY2tldFNpemUpOwogCQliRW5kcG9pbnRBZGRyZXNzID0gcGVwZC0+YkVuZHBvaW50QWRkcmVzczsKIAotCQlKT1QoNCwgImludGZbJWldYWx0WyVpXWVuZFslaV06IGJFbmRwb2ludEFkZHJlc3M9MHglWFxuIiwgXAorCQlKT00oNCwgImludGZbJWldYWx0WyVpXWVuZFslaV06IGJFbmRwb2ludEFkZHJlc3M9MHglWFxuIiwgXAogCQkJCWJJbnRlcmZhY2VOdW1iZXIsIGksIGosIFwKIAkJCQlwZXBkLT5iRW5kcG9pbnRBZGRyZXNzKTsKLQkJSk9UKDQsICJpbnRmWyVpXWFsdFslaV1lbmRbJWldOiBibUF0dHJpYnV0ZXM9MHglWFxuIiwgXAorCQlKT00oNCwgImludGZbJWldYWx0WyVpXWVuZFslaV06IGJtQXR0cmlidXRlcz0weCVYXG4iLCBcCiAJCQkJYkludGVyZmFjZU51bWJlciwgaSwgaiwgXAogCQkJCXBlcGQtPmJtQXR0cmlidXRlcyk7Ci0JCUpPVCg0LCAiaW50ZlslaV1hbHRbJWldZW5kWyVpXTogd01heFBhY2tldFNpemU9JWlcbiIsIFwKKwkJSk9NKDQsICJpbnRmWyVpXWFsdFslaV1lbmRbJWldOiB3TWF4UGFja2V0U2l6ZT0laVxuIiwgXAogCQkJCWJJbnRlcmZhY2VOdW1iZXIsIGksIGosIFwKIAkJCQlwZXBkLT53TWF4UGFja2V0U2l6ZSk7Ci0JCUpPVCg0LCAiaW50ZlslaV1hbHRbJWldZW5kWyVpXTogYkludGVydmFsPSVpXG4iLAorCQlKT00oNCwgImludGZbJWldYWx0WyVpXWVuZFslaV06IGJJbnRlcnZhbD0laVxuIiwKIAkJCQliSW50ZXJmYWNlTnVtYmVyLCBpLCBqLCBcCiAJCQkJcGVwZC0+YkludGVydmFsKTsKIAogCQlpZiAocGVwZC0+YkVuZHBvaW50QWRkcmVzcyAmIFVTQl9ESVJfSU4pIHsKLQkJCUpPVCg0LCAiaW50ZlslaV1hbHRbJWldZW5kWyVpXSBpcyBhbiAgSU4gIGVuZHBvaW50XG4iLFwKKwkJCUpPTSg0LCAiaW50ZlslaV1hbHRbJWldZW5kWyVpXSBpcyBhbiAgSU4gIGVuZHBvaW50XG4iLFwKIAkJCQkJCWJJbnRlcmZhY2VOdW1iZXIsIGksIGopOwogCQkJaXNpbiA9IDE7CiAJCX0gZWxzZSB7Ci0JCQlKT1QoNCwgImludGZbJWldYWx0WyVpXWVuZFslaV0gaXMgYW4gIE9VVCBlbmRwb2ludFxuIixcCisJCQlKT00oNCwgImludGZbJWldYWx0WyVpXWVuZFslaV0gaXMgYW4gIE9VVCBlbmRwb2ludFxuIixcCiAJCQkJCQliSW50ZXJmYWNlTnVtYmVyLCBpLCBqKTsKLQkJCVNBWSgiRVJST1I6IE9VVCBlbmRwb2ludCB1bmV4cGVjdGVkXG4iKTsKLQkJCVNBWSgiLi4uLi4uIGNvbnRpbnVpbmdcbiIpOworCQkJU0FNKCJFUlJPUjogT1VUIGVuZHBvaW50IHVuZXhwZWN0ZWRcbiIpOworCQkJU0FNKCIuLi4uLi4gY29udGludWluZ1xuIik7CiAJCQlpc2luID0gMDsKIAkJfQogCQlpZiAoKHBlcGQtPmJtQXR0cmlidXRlcyAmIFwKIAkJCQlVU0JfRU5EUE9JTlRfWEZFUlRZUEVfTUFTSykgPT0gXAogCQkJCVVTQl9FTkRQT0lOVF9YRkVSX0lTT0MpIHsKLQkJCUpPVCg0LCAiaW50ZlslaV1hbHRbJWldZW5kWyVpXSBpcyBhbiBJU09DIGVuZHBvaW50XG4iLFwKKwkJCUpPTSg0LCAiaW50ZlslaV1hbHRbJWldZW5kWyVpXSBpcyBhbiBJU09DIGVuZHBvaW50XG4iLFwKIAkJCQkJCWJJbnRlcmZhY2VOdW1iZXIsIGksIGopOwogCQkJaWYgKGlzaW4pIHsKIAkJCQlzd2l0Y2ggKGJJbnRlcmZhY2VDbGFzcykgewogCQkJCWNhc2UgVVNCX0NMQVNTX1ZJREVPOgogCQkJCWNhc2UgVVNCX0NMQVNTX1ZFTkRPUl9TUEVDOiB7CiAJCQkJCWlmICghcGVhc3ljYXApIHsKLQkJCQkJCVNBWSgiTUlTVEFLRTogIiBcCisJCQkJCQlTQU0oIk1JU1RBS0U6ICIgXAogCQkJCQkJCSJwZWFzeWNhcCBpcyBOVUxMXG4iKTsKIAkJCQkJCXJldHVybiAtRUZBVUxUOwogCQkJCQl9CiAJCQkJCWlmIChwZXBkLT53TWF4UGFja2V0U2l6ZSkgewogCQkJCQkJaWYgKDggPiBpc29rYWx0KSB7CiAJCQkJCQkJb2thbHRbaXNva2FsdF0gPSBpOwotCQkJCQkJCUpPVCg0LFwKKwkJCQkJCQlKT00oNCxcCiAJCQkJCQkJIiVpPW9rYWx0WyVpXVxuIiwgXAogCQkJCQkJCW9rYWx0W2lzb2thbHRdLCBcCiAJCQkJCQkJaXNva2FsdCk7Ci0JCQkJCQkJaXNva2FsdCsrOwotCQkJCQkJfQotCQkJCQkJaWYgKDggPiBpc29rZXBuKSB7Ci0JCQkJCQkJb2tlcG5baXNva2Vwbl0gPSBcCisJCQkJCQkJb2tlcG5baXNva2FsdF0gPSBcCiAJCQkJCQkJcGVwZC0+XAogCQkJCQkJCWJFbmRwb2ludEFkZHJlc3MgJiBcCiAJCQkJCQkJMHgwRjsKLQkJCQkJCQlKT1QoNCxcCisJCQkJCQkJSk9NKDQsXAogCQkJCQkJCSIlaT1va2VwblslaV1cbiIsIFwKLQkJCQkJCQlva2Vwbltpc29rZXBuXSwgXAotCQkJCQkJCWlzb2tlcG4pOwotCQkJCQkJCWlzb2tlcG4rKzsKLQkJCQkJCX0KLQkJCQkJCWlmICg4ID4gaXNva21wcykgewotCQkJCQkJCW9rbXBzW2lzb2ttcHNdID0gXAorCQkJCQkJCW9rZXBuW2lzb2thbHRdLCBcCisJCQkJCQkJaXNva2FsdCk7CisJCQkJCQkJb2ttcHNbaXNva2FsdF0gPSBcCiAJCQkJCQkJbGUxNl90b19jcHUocGVwZC0+XAogCQkJCQkJCXdNYXhQYWNrZXRTaXplKTsKLQkJCQkJCQlKT1QoNCxcCisJCQkJCQkJSk9NKDQsXAogCQkJCQkJCSIlaT1va21wc1slaV1cbiIsIFwKLQkJCQkJCQlva21wc1tpc29rbXBzXSwgXAotCQkJCQkJCWlzb2ttcHMpOwotCQkJCQkJCWlzb2ttcHMrKzsKKwkJCQkJCQlva21wc1tpc29rYWx0XSwgXAorCQkJCQkJCWlzb2thbHQpOworCQkJCQkJCWlzb2thbHQrKzsKIAkJCQkJCX0KIAkJCQkJfSBlbHNlIHsKIAkJCQkJCWlmICgtMSA9PSBwZWFzeWNhcC0+XApAQCAtMzM3MiwxNiArMzk1OCwxNiBAQAogCQkJCQkJCXBlYXN5Y2FwLT5cCiAJCQkJCQkJdmlkZW9fYWx0c2V0dGluZ19vZmYgPVwKIAkJCQkJCQkJCSBpOwotCQkJCQkJCUpPVCg0LCAiJWk9dmlkZW9fIiBcCisJCQkJCQkJSk9NKDQsICIlaT12aWRlb18iIFwKIAkJCQkJCQkiYWx0c2V0dGluZ19vZmYgIiBcCiAJCQkJCQkJCSI8PT09PVxuIiwgXAogCQkJCQkJCXBlYXN5Y2FwLT5cCiAJCQkJCQkJdmlkZW9fYWx0c2V0dGluZ19vZmYpOwogCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlTQVkoIkVSUk9SOiBwZWFzeWNhcCIgXAorCQkJCQkJCVNBTSgiRVJST1I6IHBlYXN5Y2FwIiBcCiAJCQkJCQkJIi0+dmlkZW9fYWx0c2V0dGluZ18iIFwKIAkJCQkJCQkib2ZmIGFscmVhZHkgc2V0XG4iKTsKLQkJCQkJCQlTQVkoIi4uLi4uLiAiIFwKKwkJCQkJCQlTQU0oIi4uLi4uLiAiIFwKIAkJCQkJCQkiY29udGludWluZyB3aXRoICIgXAogCQkJCQkJCSIlaT1wZWFzeWNhcC0+dmlkZW9fIiBcCiAJCQkJCQkJImFsdHNldHRpbmdfb2ZmXG4iLCBcCkBAIC0zMzk1LDM5ICszOTgxLDMzIEBACiAJCQkJCWlmICgweDAyICE9IGJJbnRlcmZhY2VTdWJDbGFzcykKIAkJCQkJCWJyZWFrOwogCQkJCQlpZiAoIXBlYXN5Y2FwKSB7Ci0JCQkJCQlTQVkoIk1JU1RBS0U6ICIgXAorCQkJCQkJU0FNKCJNSVNUQUtFOiAiIFwKIAkJCQkJCSJwZWFzeWNhcCBpcyBOVUxMXG4iKTsKIAkJCQkJCXJldHVybiAtRUZBVUxUOwogCQkJCQl9CiAJCQkJCWlmIChwZXBkLT53TWF4UGFja2V0U2l6ZSkgewogCQkJCQkJaWYgKDggPiBpc29rYWx0KSB7CiAJCQkJCQkJb2thbHRbaXNva2FsdF0gPSBpIDsKLQkJCQkJCQlKT1QoNCxcCisJCQkJCQkJSk9NKDQsXAogCQkJCQkJCSIlaT1va2FsdFslaV1cbiIsIFwKIAkJCQkJCQlva2FsdFtpc29rYWx0XSwgXAogCQkJCQkJCWlzb2thbHQpOwotCQkJCQkJCWlzb2thbHQrKzsKLQkJCQkJCX0KLQkJCQkJCWlmICg4ID4gaXNva2VwbikgewotCQkJCQkJCW9rZXBuW2lzb2tlcG5dID0gXAorCQkJCQkJCW9rZXBuW2lzb2thbHRdID0gXAogCQkJCQkJCXBlcGQtPlwKIAkJCQkJCQliRW5kcG9pbnRBZGRyZXNzICYgXAogCQkJCQkJCTB4MEY7Ci0JCQkJCQkJSk9UKDQsXAorCQkJCQkJCUpPTSg0LFwKIAkJCQkJCQkiJWk9b2tlcG5bJWldXG4iLCBcCi0JCQkJCQkJb2tlcG5baXNva2Vwbl0sIFwKLQkJCQkJCQlpc29rZXBuKTsKLQkJCQkJCQlpc29rZXBuKys7Ci0JCQkJCQl9Ci0JCQkJCQlpZiAoOCA+IGlzb2ttcHMpIHsKLQkJCQkJCQlva21wc1tpc29rbXBzXSA9IFwKKwkJCQkJCQlva2Vwbltpc29rYWx0XSwgXAorCQkJCQkJCWlzb2thbHQpOworCQkJCQkJCW9rbXBzW2lzb2thbHRdID0gXAogCQkJCQkJCWxlMTZfdG9fY3B1KHBlcGQtPlwKIAkJCQkJCQl3TWF4UGFja2V0U2l6ZSk7Ci0JCQkJCQkJSk9UKDQsXAorCQkJCQkJCUpPTSg0LFwKIAkJCQkJCQkiJWk9b2ttcHNbJWldXG4iLFwKLQkJCQkJCQlva21wc1tpc29rbXBzXSwgXAotCQkJCQkJCWlzb2ttcHMpOwotCQkJCQkJCWlzb2ttcHMrKzsKKwkJCQkJCQlva21wc1tpc29rYWx0XSwgXAorCQkJCQkJCWlzb2thbHQpOworCQkJCQkJCWlzb2thbHQrKzsKIAkJCQkJCX0KIAkJCQkJfSBlbHNlIHsKIAkJCQkJCWlmICgtMSA9PSBwZWFzeWNhcC0+XApAQCAtMzQzNSwxNiArNDAxNSwxNiBAQAogCQkJCQkJCXBlYXN5Y2FwLT5cCiAJCQkJCQkJYXVkaW9fYWx0c2V0dGluZ19vZmYgPVwKIAkJCQkJCQkJCSBpOwotCQkJCQkJCUpPVCg0LCAiJWk9YXVkaW9fIiBcCisJCQkJCQkJSk9NKDQsICIlaT1hdWRpb18iIFwKIAkJCQkJCQkiYWx0c2V0dGluZ19vZmYgIiBcCiAJCQkJCQkJIjw9PT09XG4iLCBcCiAJCQkJCQkJcGVhc3ljYXAtPlwKIAkJCQkJCQlhdWRpb19hbHRzZXR0aW5nX29mZik7CiAJCQkJCQl9IGVsc2UgewotCQkJCQkJCVNBWSgiRVJST1I6IHBlYXN5Y2FwIiBcCisJCQkJCQkJU0FNKCJFUlJPUjogcGVhc3ljYXAiIFwKIAkJCQkJCQkiLT5hdWRpb19hbHRzZXR0aW5nXyIgXAogCQkJCQkJCSJvZmYgYWxyZWFkeSBzZXRcbiIpOwotCQkJCQkJCVNBWSgiLi4uLi4uICIgXAorCQkJCQkJCVNBTSgiLi4uLi4uICIgXAogCQkJCQkJCSJjb250aW51aW5nIHdpdGggIiBcCiAJCQkJCQkJIiVpPXBlYXN5Y2FwLT5cCiAJCQkJCQkJYXVkaW9fYWx0c2V0dGluZ18iIFwKQEAgLTM0NjIsMTkgKzQwNDIsMTkgQEAKIAkJfSBlbHNlIGlmICgocGVwZC0+Ym1BdHRyaWJ1dGVzICYgXAogCQkJCQkJVVNCX0VORFBPSU5UX1hGRVJUWVBFX01BU0spID09XAogCQkJCQkJVVNCX0VORFBPSU5UX1hGRVJfQlVMSykgewotCQkJSk9UKDQsICJpbnRmWyVpXWFsdFslaV1lbmRbJWldIGlzIGEgIEJVTEsgZW5kcG9pbnRcbiIsXAorCQkJSk9NKDQsICJpbnRmWyVpXWFsdFslaV1lbmRbJWldIGlzIGEgIEJVTEsgZW5kcG9pbnRcbiIsXAogCQkJCQkJYkludGVyZmFjZU51bWJlciwgaSwgaik7CiAJCX0gZWxzZSBpZiAoKHBlcGQtPmJtQXR0cmlidXRlcyAmIFwKIAkJCQkJCVVTQl9FTkRQT0lOVF9YRkVSVFlQRV9NQVNLKSA9PVwKIAkJCQkJCVVTQl9FTkRQT0lOVF9YRkVSX0lOVCkgewotCQkJSk9UKDQsICJpbnRmWyVpXWFsdFslaV1lbmRbJWldIGlzIGFuICBJTlQgZW5kcG9pbnRcbiIsXAorCQkJSk9NKDQsICJpbnRmWyVpXWFsdFslaV1lbmRbJWldIGlzIGFuICBJTlQgZW5kcG9pbnRcbiIsXAogCQkJCQkJYkludGVyZmFjZU51bWJlciwgaSwgaik7CiAJCX0gZWxzZSB7Ci0JCQlKT1QoNCwgImludGZbJWldYWx0WyVpXWVuZFslaV0gaXMgYSAgQ1RSTCBlbmRwb2ludFxuIixcCisJCQlKT00oNCwgImludGZbJWldYWx0WyVpXWVuZFslaV0gaXMgYSAgQ1RSTCBlbmRwb2ludFxuIixcCiAJCQkJCQliSW50ZXJmYWNlTnVtYmVyLCBpLCBqKTsKIAkJfQogCQlpZiAoMCA9PSBwZXBkLT53TWF4UGFja2V0U2l6ZSkgewotCQkJSk9UKDQsICJpbnRmWyVpXWFsdFslaV1lbmRbJWldICIgXAorCQkJSk9NKDQsICJpbnRmWyVpXWFsdFslaV1lbmRbJWldICIgXAogCQkJCQkJImhhcyB6ZXJvIHBhY2tldCBzaXplXG4iLCBcCiAJCQkJCQliSW50ZXJmYWNlTnVtYmVyLCBpLCBqKTsKIAkJfQpAQCAtMzQ4NSw3ICs0MDY1LDcgQEAKICAqICBQRVJGT1JNIElOSVRJQUxJWkFUSU9OIE9GIFRIRSBQUk9CRUQgSU5URVJGQUNFCiAgKi8KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLUpPVCg0LCAiaW5pdGlhbGl6YXRpb24gYmVnaW5zIGZvciBpbnRlcmZhY2UgJWlcbiIsIFwKK0pPTSg0LCAiaW5pdGlhbGl6YXRpb24gYmVnaW5zIGZvciBpbnRlcmZhY2UgJWlcbiIsIFwKIAkJCQlwdXNiX2ludGVyZmFjZV9kZXNjcmlwdG9yLT5iSW50ZXJmYWNlTnVtYmVyKTsKIHN3aXRjaCAoYkludGVyZmFjZU51bWJlcikgewogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpAQCAtMzQ5NSw4OSArNDA3NSw3OCBAQAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogY2FzZSAwOiB7CiAJaWYgKCFwZWFzeWNhcCkgewotCQlTQVkoIk1JU1RBS0U6IHBlYXN5Y2FwIGlzIE5VTExcbiIpOworCQlTQU0oIk1JU1RBS0U6IHBlYXN5Y2FwIGlzIE5VTExcbiIpOwogCQlyZXR1cm4gLUVGQVVMVDsKIAl9CiAJaWYgKCFpc29rYWx0KSB7Ci0JCVNBWSgiRVJST1I6ICBubyB2aWFibGUgdmlkZW9fYWx0c2V0dGluZ19vblxuIik7CisJCVNBTSgiRVJST1I6ICBubyB2aWFibGUgdmlkZW9fYWx0c2V0dGluZ19vblxuIik7CiAJCXJldHVybiAtRU5PRU5UOwogCX0gZWxzZSB7CiAJCXBlYXN5Y2FwLT52aWRlb19hbHRzZXR0aW5nX29uID0gb2thbHRbaXNva2FsdCAtIDFdOwotCQlKT1QoNCwgIiVpPXZpZGVvX2FsdHNldHRpbmdfb24gPD09PT1cbiIsIFwKKwkJSk9NKDQsICIlaT12aWRlb19hbHRzZXR0aW5nX29uIDw9PT09XG4iLCBcCiAJCQkJCXBlYXN5Y2FwLT52aWRlb19hbHRzZXR0aW5nX29uKTsKIAl9Ci0JaWYgKCFpc29rZXBuKSB7Ci0JCVNBWSgiRVJST1I6ICBubyB2aWFibGUgdmlkZW9fZW5kcG9pbnRudW1iZXJcbiIpOwotCQlyZXR1cm4gLUVOT0VOVDsKLQl9IGVsc2UgewotCQlwZWFzeWNhcC0+dmlkZW9fZW5kcG9pbnRudW1iZXIgPSBva2Vwbltpc29rZXBuIC0gMV07Ci0JCUpPVCg0LCAiJWk9dmlkZW9fZW5kcG9pbnRudW1iZXJcbiIsIFwKLQkJCQkJcGVhc3ljYXAtPnZpZGVvX2VuZHBvaW50bnVtYmVyKTsKLQkJfQotCWlmICghaXNva21wcykgewotCQlTQVkoIkVSUk9SOiAgbm8gdmlhYmxlIHZpZGVvX21heHBhY2tldHNpemVcbiIpOwotCQlyZXR1cm4gLUVOT0VOVDsKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8qCiAgKiAgREVDSURFIFRIRSBWSURFTyBTVFJFQU1JTkcgUEFSQU1FVEVSUwogICovCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJcGVhc3ljYXAtPnZpZGVvX2VuZHBvaW50bnVtYmVyID0gb2tlcG5baXNva2FsdCAtIDFdOworCUpPTSg0LCAiJWk9dmlkZW9fZW5kcG9pbnRudW1iZXJcbiIsIHBlYXN5Y2FwLT52aWRlb19lbmRwb2ludG51bWJlcik7CisJbWF4cGFja2V0c2l6ZSA9IG9rbXBzW2lzb2thbHQgLSAxXTsKKwlpZiAoVVNCXzJfMF9NQVhQQUNLRVRTSVpFID4gbWF4cGFja2V0c2l6ZSkgeworCQlwZWFzeWNhcC0+dmlkZW9faXNvY19tYXhmcmFtZXNpemUgPSBtYXhwYWNrZXRzaXplOwogCX0gZWxzZSB7Ci0JCW1heHBhY2tldHNpemUgPSBva21wc1tpc29rbXBzIC0gMV0gLSAxMDI0OwotCQlpZiAoVVNCXzJfMF9NQVhQQUNLRVRTSVpFID4gbWF4cGFja2V0c2l6ZSkgewotCQkJcGVhc3ljYXAtPnZpZGVvX2lzb2NfbWF4ZnJhbWVzaXplID0gbWF4cGFja2V0c2l6ZTsKLQkJfSBlbHNlIHsKLQkJCXBlYXN5Y2FwLT52aWRlb19pc29jX21heGZyYW1lc2l6ZSA9IFwKLQkJCQkJCQlVU0JfMl8wX01BWFBBQ0tFVFNJWkU7Ci0JCX0KLQkJSk9UKDQsICIlaT12aWRlb19pc29jX21heGZyYW1lc2l6ZVxuIiwgXAotCQkJCQlwZWFzeWNhcC0+dmlkZW9faXNvY19tYXhmcmFtZXNpemUpOwotCQlpZiAoMCA+PSBwZWFzeWNhcC0+dmlkZW9faXNvY19tYXhmcmFtZXNpemUpIHsKLQkJCVNBWSgiRVJST1I6ICBiYWQgdmlkZW9faXNvY19tYXhmcmFtZXNpemVcbiIpOwotCQkJcmV0dXJuIC1FTk9FTlQ7Ci0JCX0KLQkJcGVhc3ljYXAtPnZpZGVvX2lzb2NfZnJhbWVzcGVyZGVzYyA9IFZJREVPX0lTT0NfRlJBTUVTUEVSREVTQzsKLQkJSk9UKDQsICIlaT12aWRlb19pc29jX2ZyYW1lc3BlcmRlc2NcbiIsIFwKLQkJCQkJcGVhc3ljYXAtPnZpZGVvX2lzb2NfZnJhbWVzcGVyZGVzYyk7Ci0JCWlmICgwID49IHBlYXN5Y2FwLT52aWRlb19pc29jX2ZyYW1lc3BlcmRlc2MpIHsKLQkJCVNBWSgiRVJST1I6ICBiYWQgdmlkZW9faXNvY19mcmFtZXNwZXJkZXNjXG4iKTsKLQkJCXJldHVybiAtRU5PRU5UOwotCQl9Ci0JCXBlYXN5Y2FwLT52aWRlb19pc29jX2J1ZmZlcl9zaXplID0gXAotCQkJCQlwZWFzeWNhcC0+dmlkZW9faXNvY19tYXhmcmFtZXNpemUgKiBcCi0JCQkJCXBlYXN5Y2FwLT52aWRlb19pc29jX2ZyYW1lc3BlcmRlc2M7Ci0JCUpPVCg0LCAiJWk9dmlkZW9faXNvY19idWZmZXJfc2l6ZVxuIiwgXAotCQkJCQlwZWFzeWNhcC0+dmlkZW9faXNvY19idWZmZXJfc2l6ZSk7Ci0JCWlmICgoUEFHRV9TSVpFIDw8IFZJREVPX0lTT0NfT1JERVIpIDwgXAotCQkJCQlwZWFzeWNhcC0+dmlkZW9faXNvY19idWZmZXJfc2l6ZSkgewotCQkJU0FZKCJNSVNUQUtFOiAiIFwKLQkJCQkicGVhc3ljYXAtPnZpZGVvX2lzb2NfYnVmZmVyX3NpemUgdG9vIGJpZ1xuIik7Ci0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJfQorCQlwZWFzeWNhcC0+dmlkZW9faXNvY19tYXhmcmFtZXNpemUgPSBcCisJCQkJCQlVU0JfMl8wX01BWFBBQ0tFVFNJWkU7CisJfQorCUpPTSg0LCAiJWk9dmlkZW9faXNvY19tYXhmcmFtZXNpemVcbiIsIFwKKwkJCQlwZWFzeWNhcC0+dmlkZW9faXNvY19tYXhmcmFtZXNpemUpOworCWlmICgwID49IHBlYXN5Y2FwLT52aWRlb19pc29jX21heGZyYW1lc2l6ZSkgeworCQlTQU0oIkVSUk9SOiAgYmFkIHZpZGVvX2lzb2NfbWF4ZnJhbWVzaXplXG4iKTsKKwkJU0FNKCIgICAgICAgIHBvc3NpYmx5IGJlY2F1c2UgcG9ydCBpcyBVU0IgMS4xXG4iKTsKKwkJcmV0dXJuIC1FTk9FTlQ7CisJfQorCXBlYXN5Y2FwLT52aWRlb19pc29jX2ZyYW1lc3BlcmRlc2MgPSBWSURFT19JU09DX0ZSQU1FU1BFUkRFU0M7CisJSk9NKDQsICIlaT12aWRlb19pc29jX2ZyYW1lc3BlcmRlc2NcbiIsIFwKKwkJCQlwZWFzeWNhcC0+dmlkZW9faXNvY19mcmFtZXNwZXJkZXNjKTsKKwlpZiAoMCA+PSBwZWFzeWNhcC0+dmlkZW9faXNvY19mcmFtZXNwZXJkZXNjKSB7CisJCVNBTSgiRVJST1I6ICBiYWQgdmlkZW9faXNvY19mcmFtZXNwZXJkZXNjXG4iKTsKKwkJcmV0dXJuIC1FTk9FTlQ7CisJfQorCXBlYXN5Y2FwLT52aWRlb19pc29jX2J1ZmZlcl9zaXplID0gXAorCQkJCXBlYXN5Y2FwLT52aWRlb19pc29jX21heGZyYW1lc2l6ZSAqIFwKKwkJCQlwZWFzeWNhcC0+dmlkZW9faXNvY19mcmFtZXNwZXJkZXNjOworCUpPTSg0LCAiJWk9dmlkZW9faXNvY19idWZmZXJfc2l6ZVxuIiwgXAorCQkJCXBlYXN5Y2FwLT52aWRlb19pc29jX2J1ZmZlcl9zaXplKTsKKwlpZiAoKFBBR0VfU0laRSA8PCBWSURFT19JU09DX09SREVSKSA8IFwKKwkJCQlwZWFzeWNhcC0+dmlkZW9faXNvY19idWZmZXJfc2l6ZSkgeworCQlTQU0oIk1JU1RBS0U6IHBlYXN5Y2FwLT52aWRlb19pc29jX2J1ZmZlcl9zaXplIHRvbyBiaWdcbiIpOworCQlyZXR1cm4gLUVGQVVMVDsKIAl9CiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAJaWYgKC0xID09IHBlYXN5Y2FwLT52aWRlb19pbnRlcmZhY2UpIHsKLQkJU0FZKCJNSVNUQUtFOiAgdmlkZW9faW50ZXJmYWNlIGlzIHVuc2V0XG4iKTsKKwkJU0FNKCJNSVNUQUtFOiAgdmlkZW9faW50ZXJmYWNlIGlzIHVuc2V0XG4iKTsKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJfQogCWlmICgtMSA9PSBwZWFzeWNhcC0+dmlkZW9fYWx0c2V0dGluZ19vbikgewotCQlTQVkoIk1JU1RBS0U6ICB2aWRlb19hbHRzZXR0aW5nX29uIGlzIHVuc2V0XG4iKTsKKwkJU0FNKCJNSVNUQUtFOiAgdmlkZW9fYWx0c2V0dGluZ19vbiBpcyB1bnNldFxuIik7CiAJCXJldHVybiAtRUZBVUxUOwogCX0KIAlpZiAoLTEgPT0gcGVhc3ljYXAtPnZpZGVvX2FsdHNldHRpbmdfb2ZmKSB7Ci0JCVNBWSgiTUlTVEFLRTogIHZpZGVvX2ludGVyZmFjZV9vZmYgaXMgdW5zZXRcbiIpOworCQlTQU0oIk1JU1RBS0U6ICB2aWRlb19pbnRlcmZhY2Vfb2ZmIGlzIHVuc2V0XG4iKTsKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJfQogCWlmICgtMSA9PSBwZWFzeWNhcC0+dmlkZW9fZW5kcG9pbnRudW1iZXIpIHsKLQkJU0FZKCJNSVNUQUtFOiAgdmlkZW9fZW5kcG9pbnRudW1iZXIgaXMgdW5zZXRcbiIpOworCQlTQU0oIk1JU1RBS0U6ICB2aWRlb19lbmRwb2ludG51bWJlciBpcyB1bnNldFxuIik7CiAJCXJldHVybiAtRUZBVUxUOwogCX0KIAlpZiAoLTEgPT0gcGVhc3ljYXAtPnZpZGVvX2lzb2NfbWF4ZnJhbWVzaXplKSB7Ci0JCVNBWSgiTUlTVEFLRTogIHZpZGVvX2lzb2NfbWF4ZnJhbWVzaXplIGlzIHVuc2V0XG4iKTsKKwkJU0FNKCJNSVNUQUtFOiAgdmlkZW9faXNvY19tYXhmcmFtZXNpemUgaXMgdW5zZXRcbiIpOwogCQlyZXR1cm4gLUVGQVVMVDsKIAl9CiAJaWYgKC0xID09IHBlYXN5Y2FwLT52aWRlb19pc29jX2J1ZmZlcl9zaXplKSB7Ci0JCVNBWSgiTUlTVEFLRTogIHZpZGVvX2lzb2NfYnVmZmVyX3NpemUgaXMgdW5zZXRcbiIpOworCQlTQU0oIk1JU1RBS0U6ICB2aWRlb19pc29jX2J1ZmZlcl9zaXplIGlzIHVuc2V0XG4iKTsKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJfQogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpAQCAtMzU4OCwyMCArNDE1NywyMCBAQAogCUlOSVRfTElTVF9IRUFEKCYocGVhc3ljYXAtPnVyYl92aWRlb19oZWFkKSk7CiAJcGVhc3ljYXAtPnB1cmJfdmlkZW9faGVhZCA9ICYocGVhc3ljYXAtPnVyYl92aWRlb19oZWFkKTsKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQlKT1QoNCwgImFsbG9jYXRpbmcgJWkgZnJhbWUgYnVmZmVycyBvZiBzaXplICVsaVxuIiwgIFwKKwlKT00oNCwgImFsbG9jYXRpbmcgJWkgZnJhbWUgYnVmZmVycyBvZiBzaXplICVsaVxuIiwgIFwKIAkJCUZSQU1FX0JVRkZFUl9NQU5ZLCAobG9uZyBpbnQpRlJBTUVfQlVGRkVSX1NJWkUpOwotCUpPVCg0LCAiLi4uLiBlYWNoIHNjYXR0ZXJlZCBvdmVyICVsaSBwYWdlc1xuIiwgXAorCUpPTSg0LCAiLi4uLiBlYWNoIHNjYXR0ZXJlZCBvdmVyICVsaSBwYWdlc1xuIiwgXAogCQkJCQkJRlJBTUVfQlVGRkVSX1NJWkUvUEFHRV9TSVpFKTsKIAogCWZvciAoayA9IDA7ICBrIDwgRlJBTUVfQlVGRkVSX01BTlk7ICBrKyspIHsKIAkJZm9yIChtID0gMDsgIG0gPCBGUkFNRV9CVUZGRVJfU0laRS9QQUdFX1NJWkU7ICBtKyspIHsKIAkJCWlmICgodm9pZCAqKU5VTEwgIT0gcGVhc3ljYXAtPmZyYW1lX2J1ZmZlcltrXVttXS5wZ28pCi0JCQkJU0FZKCJhdHRlbXB0aW5nIHRvIHJlYWxsb2NhdGUgZnJhbWUgIiBcCisJCQkJU0FNKCJhdHRlbXB0aW5nIHRvIHJlYWxsb2NhdGUgZnJhbWUgIiBcCiAJCQkJCQkJCSIgYnVmZmVyc1xuIik7CiAJCQllbHNlIHsKIAkJCQlwYnVmID0gKHZvaWQgKilfX2dldF9mcmVlX3BhZ2UoR0ZQX0tFUk5FTCk7CiAJCQkJaWYgKCh2b2lkICopTlVMTCA9PSBwYnVmKSB7Ci0JCQkJCVNBWSgiRVJST1I6IENvdWxkIG5vdCBhbGxvY2F0ZSBmcmFtZSAiXAorCQkJCQlTQU0oIkVSUk9SOiBDb3VsZCBub3QgYWxsb2NhdGUgZnJhbWUgIlwKIAkJCQkJCSJidWZmZXIgJWkgcGFnZSAlaVxuIiwgaywgbSk7CiAJCQkJCXJldHVybiAtRU5PTUVNOwogCQkJCX0gZWxzZQpAQCAtMzYxNSwyMyArNDE4NCwyMyBAQAogCiAJcGVhc3ljYXAtPmZyYW1lX2ZpbGwgPSAwOwogCXBlYXN5Y2FwLT5mcmFtZV9yZWFkID0gMDsKLQlKT1QoNCwgImFsbG9jYXRpb24gb2YgZnJhbWUgYnVmZmVycyBkb25lOiAgJWkgcGFnZXNcbiIsIGsgKiBcCisJSk9NKDQsICJhbGxvY2F0aW9uIG9mIGZyYW1lIGJ1ZmZlcnMgZG9uZTogICVpIHBhZ2VzXG4iLCBrICogXAogCQkJCQkJCQltKTsKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQlKT1QoNCwgImFsbG9jYXRpbmcgJWkgZmllbGQgYnVmZmVycyBvZiBzaXplICVsaVxuIiwgIFwKKwlKT00oNCwgImFsbG9jYXRpbmcgJWkgZmllbGQgYnVmZmVycyBvZiBzaXplICVsaVxuIiwgIFwKIAkJCUZJRUxEX0JVRkZFUl9NQU5ZLCAobG9uZyBpbnQpRklFTERfQlVGRkVSX1NJWkUpOwotCUpPVCg0LCAiLi4uLiBlYWNoIHNjYXR0ZXJlZCBvdmVyICVsaSBwYWdlc1xuIiwgXAorCUpPTSg0LCAiLi4uLiBlYWNoIHNjYXR0ZXJlZCBvdmVyICVsaSBwYWdlc1xuIiwgXAogCQkJCQlGSUVMRF9CVUZGRVJfU0laRS9QQUdFX1NJWkUpOwogCiAJZm9yIChrID0gMDsgIGsgPCBGSUVMRF9CVUZGRVJfTUFOWTsgIGsrKykgewogCQlmb3IgKG0gPSAwOyAgbSA8IEZJRUxEX0JVRkZFUl9TSVpFL1BBR0VfU0laRTsgIG0rKykgewogCQkJaWYgKCh2b2lkICopTlVMTCAhPSBwZWFzeWNhcC0+ZmllbGRfYnVmZmVyW2tdW21dLnBnbykgewotCQkJCVNBWSgiRVJST1I6IGF0dGVtcHRpbmcgdG8gcmVhbGxvY2F0ZSAiIFwKKwkJCQlTQU0oIkVSUk9SOiBhdHRlbXB0aW5nIHRvIHJlYWxsb2NhdGUgIiBcCiAJCQkJCQkJImZpZWxkIGJ1ZmZlcnNcbiIpOwogCQkJfSBlbHNlIHsKIAkJCQlwYnVmID0gKHZvaWQgKikgX19nZXRfZnJlZV9wYWdlKEdGUF9LRVJORUwpOwogCQkJCWlmICgodm9pZCAqKU5VTEwgPT0gcGJ1ZikgewotCQkJCQlTQVkoIkVSUk9SOiBDb3VsZCBub3QgYWxsb2NhdGUgZmllbGQiIFwKKwkJCQkJU0FNKCJFUlJPUjogQ291bGQgbm90IGFsbG9jYXRlIGZpZWxkIiBcCiAJCQkJCQkiIGJ1ZmZlciAlaSBwYWdlICVpXG4iLCBrLCBtKTsKIAkJCQkJcmV0dXJuIC1FTk9NRU07CiAJCQkJCX0KQEAgLTM2NDcsMTggKzQyMTYsMTggQEAKIAlwZWFzeWNhcC0+ZmllbGRfZmlsbCA9IDA7CiAJcGVhc3ljYXAtPmZpZWxkX3BhZ2UgPSAwOwogCXBlYXN5Y2FwLT5maWVsZF9yZWFkID0gMDsKLQlKT1QoNCwgImFsbG9jYXRpb24gb2YgZmllbGQgYnVmZmVycyBkb25lOiAgJWkgcGFnZXNcbiIsIGsgKiBcCisJSk9NKDQsICJhbGxvY2F0aW9uIG9mIGZpZWxkIGJ1ZmZlcnMgZG9uZTogICVpIHBhZ2VzXG4iLCBrICogXAogCQkJCQkJCQltKTsKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQlKT1QoNCwgImFsbG9jYXRpbmcgJWkgaXNvYyB2aWRlbyBidWZmZXJzIG9mIHNpemUgJWlcbiIsICBcCisJSk9NKDQsICJhbGxvY2F0aW5nICVpIGlzb2MgdmlkZW8gYnVmZmVycyBvZiBzaXplICVpXG4iLCAgXAogCQkJCQlWSURFT19JU09DX0JVRkZFUl9NQU5ZLCBcCiAJCQkJCXBlYXN5Y2FwLT52aWRlb19pc29jX2J1ZmZlcl9zaXplKTsKLQlKT1QoNCwgIi4uLi4gZWFjaCBvY2N1cHlpbmcgY29udGlndW91cyBtZW1vcnkgcGFnZXNcbiIpOworCUpPTSg0LCAiLi4uLiBlYWNoIG9jY3VweWluZyBjb250aWd1b3VzIG1lbW9yeSBwYWdlc1xuIik7CiAKIAlmb3IgKGsgPSAwOyAgayA8IFZJREVPX0lTT0NfQlVGRkVSX01BTlk7IGsrKykgewogCQlwYnVmID0gKHZvaWQgKilfX2dldF9mcmVlX3BhZ2VzKEdGUF9LRVJORUwsIFZJREVPX0lTT0NfT1JERVIpOwogCQlpZiAoTlVMTCA9PSBwYnVmKSB7Ci0JCQlTQVkoIkVSUk9SOiBDb3VsZCBub3QgYWxsb2NhdGUgaXNvYyB2aWRlbyBidWZmZXIgIiBcCisJCQlTQU0oIkVSUk9SOiBDb3VsZCBub3QgYWxsb2NhdGUgaXNvYyB2aWRlbyBidWZmZXIgIiBcCiAJCQkJCQkJCSIlaVxuIiwgayk7CiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJfSBlbHNlCkBAIC0zNjcwLDI2ICs0MjM5LDI2IEBACiAJCQkJCXBlYXN5Y2FwLT52aWRlb19pc29jX2J1ZmZlcl9zaXplOwogCQlwZWFzeWNhcC0+dmlkZW9faXNvY19idWZmZXJba10ua291bnQgPSBrOwogCX0KLQlKT1QoNCwgImFsbG9jYXRpb24gb2YgaXNvYyB2aWRlbyBidWZmZXJzIGRvbmU6ICVpIHBhZ2VzXG4iLCBcCisJSk9NKDQsICJhbGxvY2F0aW9uIG9mIGlzb2MgdmlkZW8gYnVmZmVycyBkb25lOiAlaSBwYWdlc1xuIiwgXAogCQkJCQlrICogKDB4MDEgPDwgVklERU9fSVNPQ19PUkRFUikpOwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyoKICAqICBBTExPQ0FURSBBTkQgSU5JVElBTElaRSBNVUxUSVBMRSBzdHJ1Y3QgdXJiIC4uLgogICovCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0JSk9UKDQsICJhbGxvY2F0aW5nICVpIHN0cnVjdCB1cmIuXG4iLCBWSURFT19JU09DX0JVRkZFUl9NQU5ZKTsKLQlKT1QoNCwgInVzaW5nICVpPXBlYXN5Y2FwLT52aWRlb19pc29jX2ZyYW1lc3BlcmRlc2NcbiIsIFwKKwlKT00oNCwgImFsbG9jYXRpbmcgJWkgc3RydWN0IHVyYi5cbiIsIFZJREVPX0lTT0NfQlVGRkVSX01BTlkpOworCUpPTSg0LCAidXNpbmcgJWk9cGVhc3ljYXAtPnZpZGVvX2lzb2NfZnJhbWVzcGVyZGVzY1xuIiwgXAogCQkJCQlwZWFzeWNhcC0+dmlkZW9faXNvY19mcmFtZXNwZXJkZXNjKTsKLQlKT1QoNCwgInVzaW5nICVpPXBlYXN5Y2FwLT52aWRlb19pc29jX21heGZyYW1lc2l6ZVxuIiwgXAorCUpPTSg0LCAidXNpbmcgJWk9cGVhc3ljYXAtPnZpZGVvX2lzb2NfbWF4ZnJhbWVzaXplXG4iLCBcCiAJCQkJCXBlYXN5Y2FwLT52aWRlb19pc29jX21heGZyYW1lc2l6ZSk7Ci0JSk9UKDQsICJ1c2luZyAlaT1wZWFzeWNhcC0+dmlkZW9faXNvY19idWZmZXJfc2l6ZW4iLCBcCisJSk9NKDQsICJ1c2luZyAlaT1wZWFzeWNhcC0+dmlkZW9faXNvY19idWZmZXJfc2l6ZW4iLCBcCiAJCQkJCXBlYXN5Y2FwLT52aWRlb19pc29jX2J1ZmZlcl9zaXplKTsKIAogCWZvciAoayA9IDA7ICBrIDwgVklERU9fSVNPQ19CVUZGRVJfTUFOWTsgaysrKSB7CiAJCXB1cmIgPSB1c2JfYWxsb2NfdXJiKHBlYXN5Y2FwLT52aWRlb19pc29jX2ZyYW1lc3BlcmRlc2MsIFwKIAkJCQkJCQkJR0ZQX0tFUk5FTCk7CiAJCWlmIChOVUxMID09IHB1cmIpIHsKLQkJCVNBWSgiRVJST1I6IHVzYl9hbGxvY191cmIgcmV0dXJuZWQgTlVMTCBmb3IgYnVmZmVyICIgXAorCQkJU0FNKCJFUlJPUjogdXNiX2FsbG9jX3VyYiByZXR1cm5lZCBOVUxMIGZvciBidWZmZXIgIiBcCiAJCQkJCQkJCSIlaVxuIiwgayk7CiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJfSBlbHNlCkBAIC0zNjk3LDcgKzQyNjYsNyBAQAogLyogLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLwogCQlwZGF0YV91cmIgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZGF0YV91cmIpLCBHRlBfS0VSTkVMKTsKIAkJaWYgKE5VTEwgPT0gcGRhdGFfdXJiKSB7Ci0JCQlTQVkoIkVSUk9SOiBDb3VsZCBub3QgYWxsb2NhdGUgc3RydWN0IGRhdGFfdXJiLlxuIik7CisJCQlTQU0oIkVSUk9SOiBDb3VsZCBub3QgYWxsb2NhdGUgc3RydWN0IGRhdGFfdXJiLlxuIik7CiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJfSBlbHNlCiAJCQlwZWFzeWNhcC0+YWxsb2NhdGlvbl92aWRlb19zdHJ1Y3QgKz0gXApAQCAtMzcxNCwzMCArNDI4MywzMCBAQAogICovCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAJCWlmICghaykgewotCQkJSk9UKDQsICJpbml0aWFsaXppbmcgdmlkZW8gdXJicyB0aHVzOlxuIik7Ci0JCQlKT1QoNCwgIiAgcHVyYi0+aW50ZXJ2YWwgPSAxO1xuIik7Ci0JCQlKT1QoNCwgIiAgcHVyYi0+ZGV2ID0gcGVhc3ljYXAtPnB1c2JfZGV2aWNlO1xuIik7Ci0JCQlKT1QoNCwgIiAgcHVyYi0+cGlwZSA9IHVzYl9yY3Zpc29jcGlwZSIgXAorCQkJSk9NKDQsICJpbml0aWFsaXppbmcgdmlkZW8gdXJicyB0aHVzOlxuIik7CisJCQlKT00oNCwgIiAgcHVyYi0+aW50ZXJ2YWwgPSAxO1xuIik7CisJCQlKT00oNCwgIiAgcHVyYi0+ZGV2ID0gcGVhc3ljYXAtPnB1c2JfZGV2aWNlO1xuIik7CisJCQlKT00oNCwgIiAgcHVyYi0+cGlwZSA9IHVzYl9yY3Zpc29jcGlwZSIgXAogCQkJCQkiKHBlYXN5Y2FwLT5wdXNiX2RldmljZSwlaSk7XG4iLCBcCiAJCQkJCXBlYXN5Y2FwLT52aWRlb19lbmRwb2ludG51bWJlcik7Ci0JCQlKT1QoNCwgIiAgcHVyYi0+dHJhbnNmZXJfZmxhZ3MgPSBVUkJfSVNPX0FTQVA7XG4iKTsKLQkJCUpPVCg0LCAiICBwdXJiLT50cmFuc2Zlcl9idWZmZXIgPSBwZWFzeWNhcC0+IiBcCisJCQlKT00oNCwgIiAgcHVyYi0+dHJhbnNmZXJfZmxhZ3MgPSBVUkJfSVNPX0FTQVA7XG4iKTsKKwkJCUpPTSg0LCAiICBwdXJiLT50cmFuc2Zlcl9idWZmZXIgPSBwZWFzeWNhcC0+IiBcCiAJCQkJCSJ2aWRlb19pc29jX2J1ZmZlclsuXS5wZ287XG4iKTsKLQkJCUpPVCg0LCAiICBwdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoID0gJWk7XG4iLCBcCisJCQlKT00oNCwgIiAgcHVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCA9ICVpO1xuIiwgXAogCQkJCQlwZWFzeWNhcC0+dmlkZW9faXNvY19idWZmZXJfc2l6ZSk7Ci0JCQlKT1QoNCwgIiAgcHVyYi0+Y29tcGxldGUgPSBlYXN5Y2FwX2NvbXBsZXRlO1xuIik7Ci0JCQlKT1QoNCwgIiAgcHVyYi0+Y29udGV4dCA9IHBlYXN5Y2FwO1xuIik7Ci0JCQlKT1QoNCwgIiAgcHVyYi0+c3RhcnRfZnJhbWUgPSAwO1xuIik7Ci0JCQlKT1QoNCwgIiAgcHVyYi0+bnVtYmVyX29mX3BhY2tldHMgPSAlaTtcbiIsIFwKKwkJCUpPTSg0LCAiICBwdXJiLT5jb21wbGV0ZSA9IGVhc3ljYXBfY29tcGxldGU7XG4iKTsKKwkJCUpPTSg0LCAiICBwdXJiLT5jb250ZXh0ID0gcGVhc3ljYXA7XG4iKTsKKwkJCUpPTSg0LCAiICBwdXJiLT5zdGFydF9mcmFtZSA9IDA7XG4iKTsKKwkJCUpPTSg0LCAiICBwdXJiLT5udW1iZXJfb2ZfcGFja2V0cyA9ICVpO1xuIiwgXAogCQkJCQlwZWFzeWNhcC0+dmlkZW9faXNvY19mcmFtZXNwZXJkZXNjKTsKLQkJCUpPVCg0LCAiICBmb3IgKGogPSAwOyBqIDwgJWk7IGorKylcbiIsIFwKKwkJCUpPTSg0LCAiICBmb3IgKGogPSAwOyBqIDwgJWk7IGorKylcbiIsIFwKIAkJCQkJcGVhc3ljYXAtPnZpZGVvX2lzb2NfZnJhbWVzcGVyZGVzYyk7Ci0JCQlKT1QoNCwgIiAgICB7XG4iKTsKLQkJCUpPVCg0LCAiICAgIHB1cmItPmlzb19mcmFtZV9kZXNjW2pdLm9mZnNldCA9IGoqJWk7XG4iLFwKKwkJCUpPTSg0LCAiICAgIHtcbiIpOworCQkJSk9NKDQsICIgICAgcHVyYi0+aXNvX2ZyYW1lX2Rlc2Nbal0ub2Zmc2V0ID0gaiolaTtcbiIsXAogCQkJCQlwZWFzeWNhcC0+dmlkZW9faXNvY19tYXhmcmFtZXNpemUpOwotCQkJSk9UKDQsICIgICAgcHVyYi0+aXNvX2ZyYW1lX2Rlc2Nbal0ubGVuZ3RoID0gJWk7XG4iLCBcCisJCQlKT00oNCwgIiAgICBwdXJiLT5pc29fZnJhbWVfZGVzY1tqXS5sZW5ndGggPSAlaTtcbiIsIFwKIAkJCQkJcGVhc3ljYXAtPnZpZGVvX2lzb2NfbWF4ZnJhbWVzaXplKTsKLQkJCUpPVCg0LCAiICAgIH1cbiIpOworCQkJSk9NKDQsICIgICAgfVxuIik7CiAJCX0KIAogCQlwdXJiLT5pbnRlcnZhbCA9IDE7CkBAIC0zNzU5LDEzICs0MzI4LDMzIEBACiAJCQkJCXBlYXN5Y2FwLT52aWRlb19pc29jX21heGZyYW1lc2l6ZTsKIAkJfQogCX0KLQlKT1QoNCwgImFsbG9jYXRpb24gb2YgJWkgc3RydWN0IHVyYiBkb25lLlxuIiwgayk7CisJSk9NKDQsICJhbGxvY2F0aW9uIG9mICVpIHN0cnVjdCB1cmIgZG9uZS5cbiIsIGspOwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKgogICogIFNBVkUgUE9JTlRFUiBwZWFzeWNhcCBJTiBUSElTIElOVEVSRkFDRS4KICAqLwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAJdXNiX3NldF9pbnRmZGF0YShwdXNiX2ludGVyZmFjZSwgcGVhc3ljYXApOworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqICBJVCBJUyBFU1NFTlRJQUwgVE8gSU5JVElBTElaRSBUSEUgSEFSRFdBUkUgQkVGT1JFLCBSQVRIRVIgVEhBTiBBRlRFUiwKKyAqICBUSEUgREVWSUNFIElTIFJFR0lTVEVSRUQsIEJFQ0FVU0UgU09NRSBWRVJTSU9OUyBPRiBUSEUgdmlkZW9kZXYgTU9EVUxFCisgKiAgQ0FMTCBlYXN5Y2FwX29wZW4oKSBJTU1FRElBVEVMWSBBRlRFUiBSRUdJU1RSQVRJT04sIENBVVNJTkcgQSBDTEFTSC4KKyAqICBCRVdBUkUuCisqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmIGRlZmluZWQoUFJFRkVSX05UU0MpCisJcGVhc3ljYXAtPm50c2MgPSB0cnVlOworCUpPTSg4LCAiZGVmYXVsdGluZyBpbml0aWFsbHkgdG8gTlRTQ1xuIik7CisjZWxzZQorCXBlYXN5Y2FwLT5udHNjID0gZmFsc2U7CisJSk9NKDgsICJkZWZhdWx0aW5nIGluaXRpYWxseSB0byBQQUxcbiIpOworI2VuZGlmIC8qUFJFRkVSX05UU0MqLworCXJjID0gcmVzZXQocGVhc3ljYXApOworCWlmICgwICE9IHJjKSB7CisJCVNBTSgiRVJST1I6IHJlc2V0KCkgcmV0dXJuZWQgJWlcbiIsIHJjKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKgogICogIFRIRSBWSURFTyBERVZJQ0UgQ0FOIEJFIFJFR0lTVEVSRUQgTk9XLCBBUyBJVCBJUyBSRUFEWS4KQEAgLTM3NzYsNDggKzQzNjUsNTggQEAKIAkJZXJyKCJOb3QgYWJsZSB0byBnZXQgYSBtaW5vciBmb3IgdGhpcyBkZXZpY2UiKTsKIAkJdXNiX3NldF9pbnRmZGF0YShwdXNiX2ludGVyZmFjZSwgTlVMTCk7CiAJCXJldHVybiAtRU5PREVWOwotCX0gZWxzZQorCX0gZWxzZSB7CiAJCShwZWFzeWNhcC0+cmVnaXN0ZXJlZF92aWRlbykrKzsKLQlTQVkoImVhc3ljYXAgYXR0YWNoZWQgdG8gbWlub3IgIyVkXG4iLCBwdXNiX2ludGVyZmFjZS0+bWlub3IpOwotCWJyZWFrOwotLyp2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2diovCi0jZWxzZQotCXB2aWRlb19kZXZpY2UgPSAoc3RydWN0IHZpZGVvX2RldmljZSAqKVwKLQkJCWt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB2aWRlb19kZXZpY2UpLCBHRlBfS0VSTkVMKTsKLQlpZiAoKHN0cnVjdCB2aWRlb19kZXZpY2UgKilOVUxMID09IHB2aWRlb19kZXZpY2UpIHsKLQkJU0FZKCJFUlJPUjogQ291bGQgbm90IGFsbG9jYXRlIHN0cnVjdHVyZSB2aWRlb19kZXZpY2VcbiIpOwotCQlyZXR1cm4gLUVOT01FTTsKKwkJU0FNKCJlYXN5Y2FwIGF0dGFjaGVkIHRvIG1pbm9yICMlZFxuIiwgcHVzYl9pbnRlcmZhY2UtPm1pbm9yKTsKKwkJYnJlYWs7CiAJfQotCWlmIChWSURFT19ERVZJQ0VfTUFOWSA8PSB2aWRlb19kZXZpY2VfbWFueSkgewotCQlTQVkoIkVSUk9SOiBUb28gbWFueSAvZGV2L3ZpZGVvc1xuIik7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQlwdmlkZW9fYXJyYXlbdmlkZW9fZGV2aWNlX21hbnldID0gcHZpZGVvX2RldmljZTsgIHZpZGVvX2RldmljZV9tYW55Kys7Ci0KLQlzdHJjcHkoJnB2aWRlb19kZXZpY2UtPm5hbWVbMF0sICJlYXN5Y2FwZGM2MCIpOwotI2lmIGRlZmluZWQoRUFTWUNBUF9ORUVEU19WNEwyX0ZPUFMpCi0JcHZpZGVvX2RldmljZS0+Zm9wcyA9ICZ2NGwyX2ZvcHM7CisvKnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2diovCiAjZWxzZQotCXB2aWRlb19kZXZpY2UtPmZvcHMgPSAmZWFzeWNhcF9mb3BzOwotI2VuZGlmIC8qRUFTWUNBUF9ORUVEU19WNEwyX0ZPUFMqLwotCXB2aWRlb19kZXZpY2UtPm1pbm9yID0gLTE7Ci0JcHZpZGVvX2RldmljZS0+cmVsZWFzZSA9ICh2b2lkICopKCZ2aWRlb2Rldl9yZWxlYXNlKTsKLQotCXZpZGVvX3NldF9kcnZkYXRhKHB2aWRlb19kZXZpY2UsICh2b2lkICopcGVhc3ljYXApOwotCi0JcmMgPSB2aWRlb19yZWdpc3Rlcl9kZXZpY2UocHZpZGVvX2RldmljZSwgVkZMX1RZUEVfR1JBQkJFUiwgLTEpOwotCWlmICgwICE9IHJjKSB7Ci0JCWVycigiTm90IGFibGUgdG8gcmVnaXN0ZXIgd2l0aCB2aWRlb2RldiIpOwotCQl2aWRlb2Rldl9yZWxlYXNlKHB2aWRlb19kZXZpY2UpOworI2lmIGRlZmluZWQoRUFTWUNBUF9ORUVEU19WNEwyX0RFVklDRV9IKQorCWlmICgwICE9ICh2NGwyX2RldmljZV9yZWdpc3RlcigmKHB1c2JfaW50ZXJmYWNlLT5kZXYpLCBcCisJCQkJCQkmKHBlYXN5Y2FwLT52NGwyX2RldmljZSkpKSkgeworCQlTQU0oInY0bDJfZGV2aWNlX3JlZ2lzdGVyKCkgZmFpbGVkXG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfSBlbHNlIHsKLQkJcGVhc3ljYXAtPnB2aWRlb19kZXZpY2UgPSBwdmlkZW9fZGV2aWNlOwotCQkocGVhc3ljYXAtPnJlZ2lzdGVyZWRfdmlkZW8pKys7Ci0JCUpPVCg0LCAicmVnaXN0ZXJlZCB3aXRoIHZpZGVvZGV2OiAlaT1taW5vclxuIiwgXAotCQkJCQkJCXB2aWRlb19kZXZpY2UtPm1pbm9yKTsKKwkJSk9NKDQsICJyZWdpc3RlcmVkIGRldmljZSBpbnN0YW5jZTogJXNcbiIsIFwKKwkJCQkJJihwZWFzeWNhcC0+djRsMl9kZXZpY2UubmFtZVswXSkpOwogCX0KLS8qXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl4qLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhNRQorICoKKyAqCisgKiAgVEhJUyBJUyBCRUxJRVZFRCBUTyBCRSBIQVJNTEVTUywgQlVUIE1BWSBXRUxMIEJFIFVOTkVDRVNTQVJZIE9SIFdST05HOgorKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwlwZWFzeWNhcC0+dmlkZW9fZGV2aWNlLnY0bDJfZGV2ID0gKHN0cnVjdCB2NGwyX2RldmljZSAqKU5VTEw7CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNlbmRpZiAvKkVBU1lDQVBfTkVFRFNfVjRMMl9ERVZJQ0VfSCovCisKKwlzdHJjcHkoJnBlYXN5Y2FwLT52aWRlb19kZXZpY2UubmFtZVswXSwgImVhc3ljYXBkYzYwIik7CisjaWYgZGVmaW5lZChFQVNZQ0FQX05FRURTX1Y0TDJfRk9QUykKKwlwZWFzeWNhcC0+dmlkZW9fZGV2aWNlLmZvcHMgPSAmdjRsMl9mb3BzOworI2Vsc2UKKwlwZWFzeWNhcC0+dmlkZW9fZGV2aWNlLmZvcHMgPSAmZWFzeWNhcF9mb3BzOworI2VuZGlmIC8qRUFTWUNBUF9ORUVEU19WNEwyX0ZPUFMqLworCXBlYXN5Y2FwLT52aWRlb19kZXZpY2UubWlub3IgPSAtMTsKKwlwZWFzeWNhcC0+dmlkZW9fZGV2aWNlLnJlbGVhc2UgPSAodm9pZCAqKSgmdmlkZW9kZXZfcmVsZWFzZSk7CisKKwl2aWRlb19zZXRfZHJ2ZGF0YSgmKHBlYXN5Y2FwLT52aWRlb19kZXZpY2UpLCAodm9pZCAqKXBlYXN5Y2FwKTsKKworCWlmICgwICE9ICh2aWRlb19yZWdpc3Rlcl9kZXZpY2UoJihwZWFzeWNhcC0+dmlkZW9fZGV2aWNlKSwgXAorCQkJCQkJVkZMX1RZUEVfR1JBQkJFUiwgLTEpKSkgeworCQllcnIoIk5vdCBhYmxlIHRvIHJlZ2lzdGVyIHdpdGggdmlkZW9kZXYiKTsKKwkJdmlkZW9kZXZfcmVsZWFzZSgmKHBlYXN5Y2FwLT52aWRlb19kZXZpY2UpKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfSBlbHNlIHsKKwkJKHBlYXN5Y2FwLT5yZWdpc3RlcmVkX3ZpZGVvKSsrOworCQlTQU0oInJlZ2lzdGVyZWQgd2l0aCB2aWRlb2RldjogJWk9bWlub3JcbiIsIFwKKwkJCQkJCXBlYXN5Y2FwLT52aWRlb19kZXZpY2UubWlub3IpOworCX0KICNlbmRpZiAvKkVBU1lDQVBfSVNfVklERU9ERVZfQ0xJRU5UKi8KKy8qXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eKi8KIAlicmVhazsKIH0KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpAQCAtMzgyNywxMjUgKzQ0MjYsMTE4IEBACiAgKi8KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogY2FzZSAxOiB7CisJaWYgKCFwZWFzeWNhcCkgeworCQlTQU0oIkVSUk9SOiBwZWFzeWNhcCBpcyBOVUxMXG4iKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKgogICogIFNBVkUgUE9JTlRFUiBwZWFzeWNhcCBJTiBJTlRFUkZBQ0UgMQogICovCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAl1c2Jfc2V0X2ludGZkYXRhKHB1c2JfaW50ZXJmYWNlLCBwZWFzeWNhcCk7Ci0JSk9UKDQsICJubyBpbml0aWFsaXphdGlvbiByZXF1aXJlZCBmb3IgaW50ZXJmYWNlICVpXG4iLCBcCisJSk9NKDQsICJubyBpbml0aWFsaXphdGlvbiByZXF1aXJlZCBmb3IgaW50ZXJmYWNlICVpXG4iLCBcCiAJCQkJcHVzYl9pbnRlcmZhY2VfZGVzY3JpcHRvci0+YkludGVyZmFjZU51bWJlcik7CiAJYnJlYWs7CiB9CiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIGNhc2UgMjogewogCWlmICghcGVhc3ljYXApIHsKLQkJU0FZKCJNSVNUQUtFOiBwZWFzeWNhcCBpcyBOVUxMXG4iKTsKKwkJU0FNKCJNSVNUQUtFOiBwZWFzeWNhcCBpcyBOVUxMXG4iKTsKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJfQogCWlmICghaXNva2FsdCkgewotCQlTQVkoIkVSUk9SOiAgbm8gdmlhYmxlIGF1ZGlvX2FsdHNldHRpbmdfb25cbiIpOworCQlTQU0oIkVSUk9SOiAgbm8gdmlhYmxlIGF1ZGlvX2FsdHNldHRpbmdfb25cbiIpOwogCQlyZXR1cm4gLUVOT0VOVDsKIAl9IGVsc2UgewogCQlwZWFzeWNhcC0+YXVkaW9fYWx0c2V0dGluZ19vbiA9IG9rYWx0W2lzb2thbHQgLSAxXTsKLQkJSk9UKDQsICIlaT1hdWRpb19hbHRzZXR0aW5nX29uIDw9PT09XG4iLCBcCisJCUpPTSg0LCAiJWk9YXVkaW9fYWx0c2V0dGluZ19vbiA8PT09PVxuIiwgXAogCQkJCQkJcGVhc3ljYXAtPmF1ZGlvX2FsdHNldHRpbmdfb24pOwogCX0KLQlpZiAoIWlzb2tlcG4pIHsKLQkJU0FZKCJFUlJPUjogIG5vIHZpYWJsZSBhdWRpb19lbmRwb2ludG51bWJlclxuIik7Ci0JCXJldHVybiAtRU5PRU5UOwotCX0gZWxzZSB7Ci0JCXBlYXN5Y2FwLT5hdWRpb19lbmRwb2ludG51bWJlciA9IG9rZXBuW2lzb2tlcG4gLSAxXTsKLQkJSk9UKDQsICIlaT1hdWRpb19lbmRwb2ludG51bWJlclxuIiwgXAotCQkJCQlwZWFzeWNhcC0+YXVkaW9fZW5kcG9pbnRudW1iZXIpOwotCX0KLQlpZiAoIWlzb2ttcHMpIHsKLQkJU0FZKCJFUlJPUjogIG5vIHZpYWJsZSBhdWRpb19tYXhwYWNrZXRzaXplXG4iKTsKLQkJcmV0dXJuIC1FTk9FTlQ7Ci0JfSBlbHNlIHsKLQkJcGVhc3ljYXAtPmF1ZGlvX2lzb2NfbWF4ZnJhbWVzaXplID0gb2ttcHNbaXNva21wcyAtIDFdOwotCQlKT1QoNCwgIiVpPWF1ZGlvX2lzb2NfbWF4ZnJhbWVzaXplXG4iLCBcCi0JCQkJCXBlYXN5Y2FwLT5hdWRpb19pc29jX21heGZyYW1lc2l6ZSk7Ci0JCWlmICgwID49IHBlYXN5Y2FwLT5hdWRpb19pc29jX21heGZyYW1lc2l6ZSkgewotCQkJU0FZKCJFUlJPUjogIGJhZCBhdWRpb19pc29jX21heGZyYW1lc2l6ZVxuIik7Ci0JCQlyZXR1cm4gLUVOT0VOVDsKLQkJfQotCQlpZiAoOSA9PSBwZWFzeWNhcC0+YXVkaW9faXNvY19tYXhmcmFtZXNpemUpIHsKLQkJCXBlYXN5Y2FwLT5pbGsgfD0gMHgwMjsKLQkJCVNBWSgiaGFyZHdhcmUgaXMgRk9VUi1DVkJTXG4iKTsKLQkJCXBlYXN5Y2FwLT5taWNyb3Bob25lID0gdHJ1ZTsKLQkJCXBlYXN5Y2FwLT5hdWRpb19wYWdlc19wZXJfZnJhZ21lbnQgPSA0OwotCQl9IGVsc2UgaWYgKDI1NiA9PSBwZWFzeWNhcC0+YXVkaW9faXNvY19tYXhmcmFtZXNpemUpIHsKLQkJCXBlYXN5Y2FwLT5pbGsgJj0gfjB4MDI7Ci0JCQlTQVkoImhhcmR3YXJlIGlzIENWQlMrUy1WSURFT1xuIik7Ci0JCQlwZWFzeWNhcC0+bWljcm9waG9uZSA9IGZhbHNlOwotCQkJcGVhc3ljYXAtPmF1ZGlvX3BhZ2VzX3Blcl9mcmFnbWVudCA9IDQ7Ci0JCX0gZWxzZSB7Ci0JCQlTQVkoImhhcmR3YXJlIGlzIHVuaWRlbnRpZmllZDpcbiIpOwotCQkJU0FZKCIlaT1hdWRpb19pc29jX21heGZyYW1lc2l6ZVxuIiwgXAotCQkJCQlwZWFzeWNhcC0+YXVkaW9faXNvY19tYXhmcmFtZXNpemUpOwotCQkJcmV0dXJuIC1FTk9FTlQ7Ci0JCX0KIAotCQlwZWFzeWNhcC0+YXVkaW9fYnl0ZXNfcGVyX2ZyYWdtZW50ID0gXAorCXBlYXN5Y2FwLT5hdWRpb19lbmRwb2ludG51bWJlciA9IG9rZXBuW2lzb2thbHQgLSAxXTsKKwlKT00oNCwgIiVpPWF1ZGlvX2VuZHBvaW50bnVtYmVyXG4iLCBwZWFzeWNhcC0+YXVkaW9fZW5kcG9pbnRudW1iZXIpOworCisJcGVhc3ljYXAtPmF1ZGlvX2lzb2NfbWF4ZnJhbWVzaXplID0gb2ttcHNbaXNva2FsdCAtIDFdOworCUpPTSg0LCAiJWk9YXVkaW9faXNvY19tYXhmcmFtZXNpemVcbiIsIFwKKwkJCQkJcGVhc3ljYXAtPmF1ZGlvX2lzb2NfbWF4ZnJhbWVzaXplKTsKKwlpZiAoMCA+PSBwZWFzeWNhcC0+YXVkaW9faXNvY19tYXhmcmFtZXNpemUpIHsKKwkJU0FNKCJFUlJPUjogIGJhZCBhdWRpb19pc29jX21heGZyYW1lc2l6ZVxuIik7CisJCXJldHVybiAtRU5PRU5UOworCX0KKwlpZiAoOSA9PSBwZWFzeWNhcC0+YXVkaW9faXNvY19tYXhmcmFtZXNpemUpIHsKKwkJcGVhc3ljYXAtPmlsayB8PSAweDAyOworCQlTQU0oImhhcmR3YXJlIGlzIEZPVVItQ1ZCU1xuIik7CisJCXBlYXN5Y2FwLT5taWNyb3Bob25lID0gdHJ1ZTsKKwkJcGVhc3ljYXAtPmF1ZGlvX3BhZ2VzX3Blcl9mcmFnbWVudCA9IDQ7CisJfSBlbHNlIGlmICgyNTYgPT0gcGVhc3ljYXAtPmF1ZGlvX2lzb2NfbWF4ZnJhbWVzaXplKSB7CisJCXBlYXN5Y2FwLT5pbGsgJj0gfjB4MDI7CisJCVNBTSgiaGFyZHdhcmUgaXMgQ1ZCUytTLVZJREVPXG4iKTsKKwkJcGVhc3ljYXAtPm1pY3JvcGhvbmUgPSBmYWxzZTsKKwkJcGVhc3ljYXAtPmF1ZGlvX3BhZ2VzX3Blcl9mcmFnbWVudCA9IDQ7CisJfSBlbHNlIHsKKwkJU0FNKCJoYXJkd2FyZSBpcyB1bmlkZW50aWZpZWQ6XG4iKTsKKwkJU0FNKCIlaT1hdWRpb19pc29jX21heGZyYW1lc2l6ZVxuIiwgXAorCQkJCQlwZWFzeWNhcC0+YXVkaW9faXNvY19tYXhmcmFtZXNpemUpOworCQlyZXR1cm4gLUVOT0VOVDsKKwl9CisKKwlwZWFzeWNhcC0+YXVkaW9fYnl0ZXNfcGVyX2ZyYWdtZW50ID0gXAogCQkJCQlwZWFzeWNhcC0+YXVkaW9fcGFnZXNfcGVyX2ZyYWdtZW50ICogXAogCQkJCQkJCQlQQUdFX1NJWkUgOwotCQlwZWFzeWNhcC0+YXVkaW9fYnVmZmVyX3BhZ2VfbWFueSA9IChBVURJT19GUkFHTUVOVF9NQU5ZICogXAorCXBlYXN5Y2FwLT5hdWRpb19idWZmZXJfcGFnZV9tYW55ID0gKEFVRElPX0ZSQUdNRU5UX01BTlkgKiBcCiAJCQkJCXBlYXN5Y2FwLT5hdWRpb19wYWdlc19wZXJfZnJhZ21lbnQpOwogCi0JCUpPVCg0LCAiJTZpPUFVRElPX0ZSQUdNRU5UX01BTllcbiIsIEFVRElPX0ZSQUdNRU5UX01BTlkpOwotCQlKT1QoNCwgIiU2aT1hdWRpb19wYWdlc19wZXJfZnJhZ21lbnRcbiIsIFwKKwlKT00oNCwgIiU2aT1BVURJT19GUkFHTUVOVF9NQU5ZXG4iLCBBVURJT19GUkFHTUVOVF9NQU5ZKTsKKwlKT00oNCwgIiU2aT1hdWRpb19wYWdlc19wZXJfZnJhZ21lbnRcbiIsIFwKIAkJCQkJcGVhc3ljYXAtPmF1ZGlvX3BhZ2VzX3Blcl9mcmFnbWVudCk7Ci0JCUpPVCg0LCAiJTZpPWF1ZGlvX2J5dGVzX3Blcl9mcmFnbWVudFxuIiwgXAorCUpPTSg0LCAiJTZpPWF1ZGlvX2J5dGVzX3Blcl9mcmFnbWVudFxuIiwgXAogCQkJCQlwZWFzeWNhcC0+YXVkaW9fYnl0ZXNfcGVyX2ZyYWdtZW50KTsKLQkJSk9UKDQsICIlNmk9YXVkaW9fYnVmZmVyX3BhZ2VfbWFueVxuIiwgXAorCUpPTSg0LCAiJTZpPWF1ZGlvX2J1ZmZlcl9wYWdlX21hbnlcbiIsIFwKIAkJCQkJcGVhc3ljYXAtPmF1ZGlvX2J1ZmZlcl9wYWdlX21hbnkpOwogCi0JCXBlYXN5Y2FwLT5hdWRpb19pc29jX2ZyYW1lc3BlcmRlc2MgPSAxMjg7CisJcGVhc3ljYXAtPmF1ZGlvX2lzb2NfZnJhbWVzcGVyZGVzYyA9IDEyODsKIAotCQlKT1QoNCwgIiVpPWF1ZGlvX2lzb2NfZnJhbWVzcGVyZGVzY1xuIiwgXAorCUpPTSg0LCAiJWk9YXVkaW9faXNvY19mcmFtZXNwZXJkZXNjXG4iLCBcCiAJCQkJCXBlYXN5Y2FwLT5hdWRpb19pc29jX2ZyYW1lc3BlcmRlc2MpOwotCQlpZiAoMCA+PSBwZWFzeWNhcC0+YXVkaW9faXNvY19mcmFtZXNwZXJkZXNjKSB7Ci0JCQlTQVkoIkVSUk9SOiAgYmFkIGF1ZGlvX2lzb2NfZnJhbWVzcGVyZGVzY1xuIik7Ci0JCQlyZXR1cm4gLUVOT0VOVDsKLQkJfQotCi0JCXBlYXN5Y2FwLT5hdWRpb19pc29jX2J1ZmZlcl9zaXplID0gXAotCQkJCXBlYXN5Y2FwLT5hdWRpb19pc29jX21heGZyYW1lc2l6ZSAqIFwKLQkJCQlwZWFzeWNhcC0+YXVkaW9faXNvY19mcmFtZXNwZXJkZXNjOwotCQlKT1QoNCwgIiVpPWF1ZGlvX2lzb2NfYnVmZmVyX3NpemVcbiIsIFwKLQkJCQkJcGVhc3ljYXAtPmF1ZGlvX2lzb2NfYnVmZmVyX3NpemUpOwotCQlpZiAoQVVESU9fSVNPQ19CVUZGRVJfU0laRSA8IFwKLQkJCQkJcGVhc3ljYXAtPmF1ZGlvX2lzb2NfYnVmZmVyX3NpemUpIHsKLQkJCVNBWSgiTUlTVEFLRTogIGF1ZGlvX2lzb2NfYnVmZmVyX3NpemUgYmlnZ2VyICIKLQkJCSJ0aGFuICVsaT1BVURJT19JU09DX0JVRkZFUl9TSVpFXG4iLCBcCi0JCQkJCQlBVURJT19JU09DX0JVRkZFUl9TSVpFKTsKLQkJCXJldHVybiAtRUZBVUxUOwotCQl9CisJaWYgKDAgPj0gcGVhc3ljYXAtPmF1ZGlvX2lzb2NfZnJhbWVzcGVyZGVzYykgeworCQlTQU0oIkVSUk9SOiAgYmFkIGF1ZGlvX2lzb2NfZnJhbWVzcGVyZGVzY1xuIik7CisJCXJldHVybiAtRU5PRU5UOwogCX0KIAorCXBlYXN5Y2FwLT5hdWRpb19pc29jX2J1ZmZlcl9zaXplID0gXAorCQkJCXBlYXN5Y2FwLT5hdWRpb19pc29jX21heGZyYW1lc2l6ZSAqIFwKKwkJCQlwZWFzeWNhcC0+YXVkaW9faXNvY19mcmFtZXNwZXJkZXNjOworCUpPTSg0LCAiJWk9YXVkaW9faXNvY19idWZmZXJfc2l6ZVxuIiwgXAorCQkJCQlwZWFzeWNhcC0+YXVkaW9faXNvY19idWZmZXJfc2l6ZSk7CisJaWYgKEFVRElPX0lTT0NfQlVGRkVSX1NJWkUgPCBwZWFzeWNhcC0+YXVkaW9faXNvY19idWZmZXJfc2l6ZSkgeworCQkJU0FNKCJNSVNUQUtFOiAgYXVkaW9faXNvY19idWZmZXJfc2l6ZSBiaWdnZXIgIgorCQkJInRoYW4gJWxpPUFVRElPX0lTT0NfQlVGRkVSX1NJWkVcbiIsIFwKKwkJCQkJCUFVRElPX0lTT0NfQlVGRkVSX1NJWkUpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CiAJaWYgKC0xID09IHBlYXN5Y2FwLT5hdWRpb19pbnRlcmZhY2UpIHsKLQkJU0FZKCJNSVNUQUtFOiAgYXVkaW9faW50ZXJmYWNlIGlzIHVuc2V0XG4iKTsKKwkJU0FNKCJNSVNUQUtFOiAgYXVkaW9faW50ZXJmYWNlIGlzIHVuc2V0XG4iKTsKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJfQogCWlmICgtMSA9PSBwZWFzeWNhcC0+YXVkaW9fYWx0c2V0dGluZ19vbikgewotCQlTQVkoIk1JU1RBS0U6ICBhdWRpb19hbHRzZXR0aW5nX29uIGlzIHVuc2V0XG4iKTsKKwkJU0FNKCJNSVNUQUtFOiAgYXVkaW9fYWx0c2V0dGluZ19vbiBpcyB1bnNldFxuIik7CiAJCXJldHVybiAtRUZBVUxUOwogCX0KIAlpZiAoLTEgPT0gcGVhc3ljYXAtPmF1ZGlvX2FsdHNldHRpbmdfb2ZmKSB7Ci0JCVNBWSgiTUlTVEFLRTogIGF1ZGlvX2ludGVyZmFjZV9vZmYgaXMgdW5zZXRcbiIpOworCQlTQU0oIk1JU1RBS0U6ICBhdWRpb19pbnRlcmZhY2Vfb2ZmIGlzIHVuc2V0XG4iKTsKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJfQogCWlmICgtMSA9PSBwZWFzeWNhcC0+YXVkaW9fZW5kcG9pbnRudW1iZXIpIHsKLQkJU0FZKCJNSVNUQUtFOiAgYXVkaW9fZW5kcG9pbnRudW1iZXIgaXMgdW5zZXRcbiIpOworCQlTQU0oIk1JU1RBS0U6ICBhdWRpb19lbmRwb2ludG51bWJlciBpcyB1bnNldFxuIik7CiAJCXJldHVybiAtRUZBVUxUOwogCX0KIAlpZiAoLTEgPT0gcGVhc3ljYXAtPmF1ZGlvX2lzb2NfbWF4ZnJhbWVzaXplKSB7Ci0JCVNBWSgiTUlTVEFLRTogIGF1ZGlvX2lzb2NfbWF4ZnJhbWVzaXplIGlzIHVuc2V0XG4iKTsKKwkJU0FNKCJNSVNUQUtFOiAgYXVkaW9faXNvY19tYXhmcmFtZXNpemUgaXMgdW5zZXRcbiIpOwogCQlyZXR1cm4gLUVGQVVMVDsKIAl9CiAJaWYgKC0xID09IHBlYXN5Y2FwLT5hdWRpb19pc29jX2J1ZmZlcl9zaXplKSB7Ci0JCVNBWSgiTUlTVEFLRTogIGF1ZGlvX2lzb2NfYnVmZmVyX3NpemUgaXMgdW5zZXRcbiIpOworCQlTQU0oIk1JU1RBS0U6ICBhdWRpb19pc29jX2J1ZmZlcl9zaXplIGlzIHVuc2V0XG4iKTsKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJfQogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpAQCAtMzk1NiwxNyArNDU0OCwxNyBAQAogCUlOSVRfTElTVF9IRUFEKCYocGVhc3ljYXAtPnVyYl9hdWRpb19oZWFkKSk7CiAJcGVhc3ljYXAtPnB1cmJfYXVkaW9faGVhZCA9ICYocGVhc3ljYXAtPnVyYl9hdWRpb19oZWFkKTsKIAotCUpPVCg0LCAiYWxsb2NhdGluZyBhbiBhdWRpbyBidWZmZXJcbiIpOwotCUpPVCg0LCAiLi4uLiBzY2F0dGVyZWQgb3ZlciAlaSBwYWdlc1xuIiwgXAorCUpPTSg0LCAiYWxsb2NhdGluZyBhbiBhdWRpbyBidWZmZXJcbiIpOworCUpPTSg0LCAiLi4uLiBzY2F0dGVyZWQgb3ZlciAlaSBwYWdlc1xuIiwgXAogCQkJCQlwZWFzeWNhcC0+YXVkaW9fYnVmZmVyX3BhZ2VfbWFueSk7CiAKIAlmb3IgKGsgPSAwOyAgayA8IHBlYXN5Y2FwLT5hdWRpb19idWZmZXJfcGFnZV9tYW55OyAgaysrKSB7CiAJCWlmICgodm9pZCAqKU5VTEwgIT0gcGVhc3ljYXAtPmF1ZGlvX2J1ZmZlcltrXS5wZ28pIHsKLQkJCVNBWSgiRVJST1I6IGF0dGVtcHRpbmcgdG8gcmVhbGxvY2F0ZSBhdWRpbyBidWZmZXJzXG4iKTsKKwkJCVNBTSgiRVJST1I6IGF0dGVtcHRpbmcgdG8gcmVhbGxvY2F0ZSBhdWRpbyBidWZmZXJzXG4iKTsKIAkJfSBlbHNlIHsKIAkJCXBidWYgPSAodm9pZCAqKSBfX2dldF9mcmVlX3BhZ2UoR0ZQX0tFUk5FTCk7CiAJCQlpZiAoKHZvaWQgKilOVUxMID09IHBidWYpIHsKLQkJCQlTQVkoIkVSUk9SOiBDb3VsZCBub3QgYWxsb2NhdGUgYXVkaW8gIiBcCisJCQkJU0FNKCJFUlJPUjogQ291bGQgbm90IGFsbG9jYXRlIGF1ZGlvICIgXAogCQkJCQkJCSJidWZmZXIgcGFnZSAlaVxuIiwgayk7CiAJCQkJcmV0dXJuIC1FTk9NRU07CiAJCQl9IGVsc2UKQEAgLTM5NzksMTYgKzQ1NzEsMTYgQEAKIAogCXBlYXN5Y2FwLT5hdWRpb19maWxsID0gMDsKIAlwZWFzeWNhcC0+YXVkaW9fcmVhZCA9IDA7Ci0JSk9UKDQsICJhbGxvY2F0aW9uIG9mIGF1ZGlvIGJ1ZmZlciBkb25lOiAgJWkgcGFnZXNcbiIsIGspOworCUpPTSg0LCAiYWxsb2NhdGlvbiBvZiBhdWRpbyBidWZmZXIgZG9uZTogICVpIHBhZ2VzXG4iLCBrKTsKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQlKT1QoNCwgImFsbG9jYXRpbmcgJWkgaXNvYyBhdWRpbyBidWZmZXJzIG9mIHNpemUgJWlcbiIsICBcCisJSk9NKDQsICJhbGxvY2F0aW5nICVpIGlzb2MgYXVkaW8gYnVmZmVycyBvZiBzaXplICVpXG4iLCAgXAogCQlBVURJT19JU09DX0JVRkZFUl9NQU5ZLCBwZWFzeWNhcC0+YXVkaW9faXNvY19idWZmZXJfc2l6ZSk7Ci0JSk9UKDQsICIuLi4uIGVhY2ggb2NjdXB5aW5nIGNvbnRpZ3VvdXMgbWVtb3J5IHBhZ2VzXG4iKTsKKwlKT00oNCwgIi4uLi4gZWFjaCBvY2N1cHlpbmcgY29udGlndW91cyBtZW1vcnkgcGFnZXNcbiIpOwogCiAJZm9yIChrID0gMDsgIGsgPCBBVURJT19JU09DX0JVRkZFUl9NQU5ZOyAgaysrKSB7CiAJCXBidWYgPSAodm9pZCAqKV9fZ2V0X2ZyZWVfcGFnZXMoR0ZQX0tFUk5FTCwgQVVESU9fSVNPQ19PUkRFUik7CiAJCWlmIChOVUxMID09IHBidWYpIHsKLQkJCVNBWSgiRVJST1I6IENvdWxkIG5vdCBhbGxvY2F0ZSBpc29jIGF1ZGlvIGJ1ZmZlciAiIFwKKwkJCVNBTSgiRVJST1I6IENvdWxkIG5vdCBhbGxvY2F0ZSBpc29jIGF1ZGlvIGJ1ZmZlciAiIFwKIAkJCQkJCQkiJWlcbiIsIGspOwogCQkJcmV0dXJuIC1FTk9NRU07CiAJCX0gZWxzZQpAQCAtNDAwMCwyNSArNDU5MiwyNSBAQAogCQlwZWFzeWNhcC0+YXVkaW9faXNvY19idWZmZXJfc2l6ZTsKIAkJcGVhc3ljYXAtPmF1ZGlvX2lzb2NfYnVmZmVyW2tdLmtvdW50ID0gazsKIAl9Ci0JSk9UKDQsICJhbGxvY2F0aW9uIG9mIGlzb2MgYXVkaW8gYnVmZmVycyBkb25lLlxuIik7CisJSk9NKDQsICJhbGxvY2F0aW9uIG9mIGlzb2MgYXVkaW8gYnVmZmVycyBkb25lLlxuIik7CiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKgogICogIEFMTE9DQVRFIEFORCBJTklUSUFMSVpFIE1VTFRJUExFIHN0cnVjdCB1cmIgLi4uCiAgKi8KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQlKT1QoNCwgImFsbG9jYXRpbmcgJWkgc3RydWN0IHVyYi5cbiIsIEFVRElPX0lTT0NfQlVGRkVSX01BTlkpOwotCUpPVCg0LCAidXNpbmcgJWk9cGVhc3ljYXAtPmF1ZGlvX2lzb2NfZnJhbWVzcGVyZGVzY1xuIiwgXAorCUpPTSg0LCAiYWxsb2NhdGluZyAlaSBzdHJ1Y3QgdXJiLlxuIiwgQVVESU9fSVNPQ19CVUZGRVJfTUFOWSk7CisJSk9NKDQsICJ1c2luZyAlaT1wZWFzeWNhcC0+YXVkaW9faXNvY19mcmFtZXNwZXJkZXNjXG4iLCBcCiAJCQkJCXBlYXN5Y2FwLT5hdWRpb19pc29jX2ZyYW1lc3BlcmRlc2MpOwotCUpPVCg0LCAidXNpbmcgJWk9cGVhc3ljYXAtPmF1ZGlvX2lzb2NfbWF4ZnJhbWVzaXplXG4iLCBcCisJSk9NKDQsICJ1c2luZyAlaT1wZWFzeWNhcC0+YXVkaW9faXNvY19tYXhmcmFtZXNpemVcbiIsIFwKIAkJCQkJcGVhc3ljYXAtPmF1ZGlvX2lzb2NfbWF4ZnJhbWVzaXplKTsKLQlKT1QoNCwgInVzaW5nICVpPXBlYXN5Y2FwLT5hdWRpb19pc29jX2J1ZmZlcl9zaXplXG4iLCBcCisJSk9NKDQsICJ1c2luZyAlaT1wZWFzeWNhcC0+YXVkaW9faXNvY19idWZmZXJfc2l6ZVxuIiwgXAogCQkJCQlwZWFzeWNhcC0+YXVkaW9faXNvY19idWZmZXJfc2l6ZSk7CiAKIAlmb3IgKGsgPSAwOyAgayA8IEFVRElPX0lTT0NfQlVGRkVSX01BTlk7IGsrKykgewogCQlwdXJiID0gdXNiX2FsbG9jX3VyYihwZWFzeWNhcC0+YXVkaW9faXNvY19mcmFtZXNwZXJkZXNjLCBcCiAJCQkJCQkJCUdGUF9LRVJORUwpOwogCQlpZiAoTlVMTCA9PSBwdXJiKSB7Ci0JCQlTQVkoIkVSUk9SOiB1c2JfYWxsb2NfdXJiIHJldHVybmVkIE5VTEwgZm9yIGJ1ZmZlciAiIFwKKwkJCVNBTSgiRVJST1I6IHVzYl9hbGxvY191cmIgcmV0dXJuZWQgTlVMTCBmb3IgYnVmZmVyICIgXAogCQkJCQkJCSIlaVxuIiwgayk7CiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJfSBlbHNlCkBAIC00MDI2LDcgKzQ2MTgsNyBAQAogLyogLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLwogCQlwZGF0YV91cmIgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZGF0YV91cmIpLCBHRlBfS0VSTkVMKTsKIAkJaWYgKE5VTEwgPT0gcGRhdGFfdXJiKSB7Ci0JCQlTQVkoIkVSUk9SOiBDb3VsZCBub3QgYWxsb2NhdGUgc3RydWN0IGRhdGFfdXJiLlxuIik7CisJCQlTQU0oIkVSUk9SOiBDb3VsZCBub3QgYWxsb2NhdGUgc3RydWN0IGRhdGFfdXJiLlxuIik7CiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJfSBlbHNlCiAJCQlwZWFzeWNhcC0+YWxsb2NhdGlvbl9hdWRpb19zdHJ1Y3QgKz0gXApAQCAtNDA0MywzMCArNDYzNSwzMCBAQAogICovCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAJCWlmICghaykgewotCQkJSk9UKDQsICJpbml0aWFsaXppbmcgYXVkaW8gdXJicyB0aHVzOlxuIik7Ci0JCQlKT1QoNCwgIiAgcHVyYi0+aW50ZXJ2YWwgPSAxO1xuIik7Ci0JCQlKT1QoNCwgIiAgcHVyYi0+ZGV2ID0gcGVhc3ljYXAtPnB1c2JfZGV2aWNlO1xuIik7Ci0JCQlKT1QoNCwgIiAgcHVyYi0+cGlwZSA9IHVzYl9yY3Zpc29jcGlwZShwZWFzeWNhcC0+IiBcCisJCQlKT00oNCwgImluaXRpYWxpemluZyBhdWRpbyB1cmJzIHRodXM6XG4iKTsKKwkJCUpPTSg0LCAiICBwdXJiLT5pbnRlcnZhbCA9IDE7XG4iKTsKKwkJCUpPTSg0LCAiICBwdXJiLT5kZXYgPSBwZWFzeWNhcC0+cHVzYl9kZXZpY2U7XG4iKTsKKwkJCUpPTSg0LCAiICBwdXJiLT5waXBlID0gdXNiX3Jjdmlzb2NwaXBlKHBlYXN5Y2FwLT4iIFwKIAkJCQkJInB1c2JfZGV2aWNlLCVpKTtcbiIsIFwKIAkJCQkJcGVhc3ljYXAtPmF1ZGlvX2VuZHBvaW50bnVtYmVyKTsKLQkJCUpPVCg0LCAiICBwdXJiLT50cmFuc2Zlcl9mbGFncyA9IFVSQl9JU09fQVNBUDtcbiIpOwotCQkJSk9UKDQsICIgIHB1cmItPnRyYW5zZmVyX2J1ZmZlciA9ICIgXAorCQkJSk9NKDQsICIgIHB1cmItPnRyYW5zZmVyX2ZsYWdzID0gVVJCX0lTT19BU0FQO1xuIik7CisJCQlKT00oNCwgIiAgcHVyYi0+dHJhbnNmZXJfYnVmZmVyID0gIiBcCiAJCQkJInBlYXN5Y2FwLT5hdWRpb19pc29jX2J1ZmZlclsuXS5wZ287XG4iKTsKLQkJCUpPVCg0LCAiICBwdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoID0gJWk7XG4iLCBcCisJCQlKT00oNCwgIiAgcHVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCA9ICVpO1xuIiwgXAogCQkJCQlwZWFzeWNhcC0+YXVkaW9faXNvY19idWZmZXJfc2l6ZSk7Ci0JCQlKT1QoNCwgIiAgcHVyYi0+Y29tcGxldGUgPSBlYXN5c25kX2NvbXBsZXRlO1xuIik7Ci0JCQlKT1QoNCwgIiAgcHVyYi0+Y29udGV4dCA9IHBlYXN5Y2FwO1xuIik7Ci0JCQlKT1QoNCwgIiAgcHVyYi0+c3RhcnRfZnJhbWUgPSAwO1xuIik7Ci0JCQlKT1QoNCwgIiAgcHVyYi0+bnVtYmVyX29mX3BhY2tldHMgPSAlaTtcbiIsIFwKKwkJCUpPTSg0LCAiICBwdXJiLT5jb21wbGV0ZSA9IGVhc3lzbmRfY29tcGxldGU7XG4iKTsKKwkJCUpPTSg0LCAiICBwdXJiLT5jb250ZXh0ID0gcGVhc3ljYXA7XG4iKTsKKwkJCUpPTSg0LCAiICBwdXJiLT5zdGFydF9mcmFtZSA9IDA7XG4iKTsKKwkJCUpPTSg0LCAiICBwdXJiLT5udW1iZXJfb2ZfcGFja2V0cyA9ICVpO1xuIiwgXAogCQkJCQlwZWFzeWNhcC0+YXVkaW9faXNvY19mcmFtZXNwZXJkZXNjKTsKLQkJCUpPVCg0LCAiICBmb3IgKGogPSAwOyBqIDwgJWk7IGorKylcbiIsIFwKKwkJCUpPTSg0LCAiICBmb3IgKGogPSAwOyBqIDwgJWk7IGorKylcbiIsIFwKIAkJCQkJcGVhc3ljYXAtPmF1ZGlvX2lzb2NfZnJhbWVzcGVyZGVzYyk7Ci0JCQlKT1QoNCwgIiAgICB7XG4iKTsKLQkJCUpPVCg0LCAiICAgIHB1cmItPmlzb19mcmFtZV9kZXNjW2pdLm9mZnNldCA9IGoqJWk7XG4iLFwKKwkJCUpPTSg0LCAiICAgIHtcbiIpOworCQkJSk9NKDQsICIgICAgcHVyYi0+aXNvX2ZyYW1lX2Rlc2Nbal0ub2Zmc2V0ID0gaiolaTtcbiIsXAogCQkJCQlwZWFzeWNhcC0+YXVkaW9faXNvY19tYXhmcmFtZXNpemUpOwotCQkJSk9UKDQsICIgICAgcHVyYi0+aXNvX2ZyYW1lX2Rlc2Nbal0ubGVuZ3RoID0gJWk7XG4iLCBcCisJCQlKT00oNCwgIiAgICBwdXJiLT5pc29fZnJhbWVfZGVzY1tqXS5sZW5ndGggPSAlaTtcbiIsIFwKIAkJCQkJcGVhc3ljYXAtPmF1ZGlvX2lzb2NfbWF4ZnJhbWVzaXplKTsKLQkJCUpPVCg0LCAiICAgIH1cbiIpOworCQkJSk9NKDQsICIgICAgfVxuIik7CiAJCQl9CiAKIAkJcHVyYi0+aW50ZXJ2YWwgPSAxOwpAQCAtNDA4OCw3ICs0NjgwLDcgQEAKIAkJCQkJcGVhc3ljYXAtPmF1ZGlvX2lzb2NfbWF4ZnJhbWVzaXplOwogCQl9CiAJfQotCUpPVCg0LCAiYWxsb2NhdGlvbiBvZiAlaSBzdHJ1Y3QgdXJiIGRvbmUuXG4iLCBrKTsKKwlKT00oNCwgImFsbG9jYXRpb24gb2YgJWkgc3RydWN0IHVyYiBkb25lLlxuIiwgayk7CiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKgogICogIFNBVkUgUE9JTlRFUiBwZWFzeWNhcCBJTiBUSElTIElOVEVSRkFDRS4KQEAgLTQxMDUsMTQgKzQ2OTcsMTggQEAKIAkJZXJyKCJOb3QgYWJsZSB0byBnZXQgYSBtaW5vciBmb3IgdGhpcyBkZXZpY2UuIik7CiAJCXVzYl9zZXRfaW50ZmRhdGEocHVzYl9pbnRlcmZhY2UsIE5VTEwpOwogCQlyZXR1cm4gLUVOT0RFVjsKLQl9IGVsc2UKKwl9IGVsc2UgeworCQlKT00oOCwgImtyZWZfZ2V0KCkgd2l0aCAlaT1wZWFzeWNhcC0+a3JlZi5yZWZjb3VudC5jb3VudGVyXG4iLFwKKwkJCQkJKGludClwZWFzeWNhcC0+a3JlZi5yZWZjb3VudC5jb3VudGVyKTsKKwkJa3JlZl9nZXQoJnBlYXN5Y2FwLT5rcmVmKTsKIAkJKHBlYXN5Y2FwLT5yZWdpc3RlcmVkX2F1ZGlvKSsrOworCX0KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8qCiAgKiAgTEVUIFRIRSBVU0VSIEtOT1cgV0hBVCBOT0RFIFRIRSBBVURJTyBERVZJQ0UgSVMgQVRUQUNIRUQgVE8uCiAgKi8KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQlTQVkoImVhc3lzbmQgYXR0YWNoZWQgdG8gbWlub3IgIyVkXG4iLCBwdXNiX2ludGVyZmFjZS0+bWlub3IpOworCVNBTSgiZWFzeXNuZCBhdHRhY2hlZCB0byBtaW5vciAjJWRcbiIsIHB1c2JfaW50ZXJmYWNlLT5taW5vcik7CiAJYnJlYWs7CiB9CiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCkBAIC00MTIxLDIwICs0NzE3LDE5IEBACiAgKi8KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIGRlZmF1bHQ6IHsKLQlKT1QoNCwgIkVSUk9SOiB1bmV4cGVjdGVkIGludGVyZmFjZSAlaVxuIiwgYkludGVyZmFjZU51bWJlcik7CisJSk9NKDQsICJFUlJPUjogdW5leHBlY3RlZCBpbnRlcmZhY2UgJWlcbiIsIGJJbnRlcmZhY2VOdW1iZXIpOwogCXJldHVybiAtRUlOVkFMOwogfQogfQotSk9UKDQsICJlbmRzIHN1Y2Nlc3NmdWxseSBmb3IgaW50ZXJmYWNlICVpXG4iLCBcCitKT00oNCwgImVuZHMgc3VjY2Vzc2Z1bGx5IGZvciBpbnRlcmZhY2UgJWlcbiIsIFwKIAkJCQlwdXNiX2ludGVyZmFjZV9kZXNjcmlwdG9yLT5iSW50ZXJmYWNlTnVtYmVyKTsKIHJldHVybiAwOwogfQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyoKLSAqICBXSEVOIFRISVMgRlVOQ1RJT04gSVMgQ0FMTEVEIFRIRSBERVZJQ0UgSEFTIEFMUkVBRFkgQkVFTiBQSFlTSUNBTExZCi0gKiAgVU5QTFVHR0VELgotICogIEhFTkNFIHBlYXN5Y2FwLT5wdXNiX2RldmljZSBJUyBOTyBMT05HRVIgVkFMSUQgQU5EIE1VU1QgQkUgU0VUIFRPIE5VTEwuCisgKiAgV0hFTiBUSElTIEZVTkNUSU9OIElTIENBTExFRCBUSEUgRWFzeUNBUCBIQVMgQUxSRUFEWSBCRUVOIFBIWVNJQ0FMTFkKKyAqICBVTlBMVUdHRUQuICBIRU5DRSBwZWFzeWNhcC0+cHVzYl9kZXZpY2UgSVMgTk8gTE9OR0VSIFZBTElELgogICovCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiB2b2lkCkBAIC00MTQ3LDcgKzQ3NDIsMTQgQEAKIAogc3RydWN0IGxpc3RfaGVhZCAqcGxpc3RfaGVhZDsKIHN0cnVjdCBkYXRhX3VyYiAqcGRhdGFfdXJiOwotaW50IG1pbm9yLCBtOworaW50IG1pbm9yLCBtLCBrZDsKKy8qdnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2Ki8KKyNpZiBkZWZpbmVkKEVBU1lDQVBfSVNfVklERU9ERVZfQ0xJRU5UKQorI2lmIGRlZmluZWQoRUFTWUNBUF9ORUVEU19WNEwyX0RFVklDRV9IKQorc3RydWN0IHY0bDJfZGV2aWNlICpwdjRsMl9kZXZpY2U7CisjZW5kaWYgLypFQVNZQ0FQX05FRURTX1Y0TDJfREVWSUNFX0gqLworI2VuZGlmIC8qRUFTWUNBUF9JU19WSURFT0RFVl9DTElFTlQqLworLypeXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl4qLwogCiBKT1QoNCwgIlxuIik7CiAKQEAgLTQxNjksMTA3ICs0NzcxLDE4OCBAQAogbWlub3IgPSBwdXNiX2ludGVyZmFjZS0+bWlub3I7CiBKT1QoNCwgImludGZbJWldOiBtaW5vcj0laVxuIiwgYkludGVyZmFjZU51bWJlciwgbWlub3IpOwogCitpZiAoMSA9PSBiSW50ZXJmYWNlTnVtYmVyKQorCXJldHVybjsKKwogcGVhc3ljYXAgPSB1c2JfZ2V0X2ludGZkYXRhKHB1c2JfaW50ZXJmYWNlKTsKLWlmICgoc3RydWN0IGVhc3ljYXAgKilOVUxMID09IHBlYXN5Y2FwKQoraWYgKE5VTEwgPT0gcGVhc3ljYXApIHsKIAlTQVkoIkVSUk9SOiBwZWFzeWNhcCBpcyBOVUxMXG4iKTsKLWVsc2UgewotCXBlYXN5Y2FwLT5wdXNiX2RldmljZSA9IChzdHJ1Y3QgdXNiX2RldmljZSAqKU5VTEw7Ci0Jc3dpdGNoIChiSW50ZXJmYWNlTnVtYmVyKSB7CisJcmV0dXJuOworfQogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCWNhc2UgMDogewotCQlpZiAoKHN0cnVjdCBsaXN0X2hlYWQgKilOVUxMICE9IHBlYXN5Y2FwLT5wdXJiX3ZpZGVvX2hlYWQpIHsKLQkJCUpPVCg0LCAia2lsbGluZyB2aWRlbyB1cmJzXG4iKTsKLQkJCW0gPSAwOwotCQkJbGlzdF9mb3JfZWFjaChwbGlzdF9oZWFkLCAocGVhc3ljYXAtPnB1cmJfdmlkZW9faGVhZCkpCi0JCQkJewotCQkJCXBkYXRhX3VyYiA9IGxpc3RfZW50cnkocGxpc3RfaGVhZCwgXAotCQkJCQkJc3RydWN0IGRhdGFfdXJiLCBsaXN0X2hlYWQpOwotCQkJCWlmICgoc3RydWN0IGRhdGFfdXJiICopTlVMTCAhPSBwZGF0YV91cmIpIHsKLQkJCQkJaWYgKChzdHJ1Y3QgdXJiICopTlVMTCAhPSBcCi0JCQkJCQkJcGRhdGFfdXJiLT5wdXJiKSB7Ci0JCQkJCQl1c2Jfa2lsbF91cmIocGRhdGFfdXJiLT5wdXJiKTsKLQkJCQkJCW0rKzsKLQkJCQkJfQorI2lmICghZGVmaW5lZChFQVNZQ0FQX0lTX1ZJREVPREVWX0NMSUVOVCkpCisjCisvKnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2diovCisjZWxzZQorI2lmIGRlZmluZWQoRUFTWUNBUF9ORUVEU19WNEwyX0RFVklDRV9IKQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqICBTT01FIFZFUlNJT05TIE9GIFRIRSB2aWRlb2RldiBNT0RVTEUgT1ZFUldSSVRFIFRIRSBEQVRBIFdISUNIIEhBUworICogIEJFRU4gV1JJVFRFTiBCWSBUSEUgQ0FMTCBUTyB1c2Jfc2V0X2ludGZkYXRhKCkgSU4gZWFzeWNhcF91c2JfcHJvYmUoKSwKKyAqICBSRVBMQUNJTkcgSVQgV0lUSCBBIFBPSU5URVIgVE8gVEhFIEVNQkVEREVEIHY0bDJfZGV2aWNlIFNUUlVDVFVSRS4KKyAqICBUTyBERVRFQ1QgVEhJUywgVEhFIFNUUklORyBJTiBUSEUgZWFzeWNhcC50ZWxsdGFsZVtdIEJVRkZFUiBJUyBDSEVDS0VELgorKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2lmIChtZW1jbXAoJnBlYXN5Y2FwLT50ZWxsdGFsZVswXSwgVEVMTFRBTEUsIHN0cmxlbihURUxMVEFMRSkpKSB7CisJcHY0bDJfZGV2aWNlID0gdXNiX2dldF9pbnRmZGF0YShwdXNiX2ludGVyZmFjZSk7CisJaWYgKChzdHJ1Y3QgdjRsMl9kZXZpY2UgKilOVUxMID09IHB2NGwyX2RldmljZSkgeworCQlTQVkoIkVSUk9SOiBwdjRsMl9kZXZpY2UgaXMgTlVMTFxuIik7CisJCXJldHVybjsKKwl9CisJcGVhc3ljYXAgPSAoc3RydWN0IGVhc3ljYXAgKikgXAorCQljb250YWluZXJfb2YocHY0bDJfZGV2aWNlLCBzdHJ1Y3QgZWFzeWNhcCwgdjRsMl9kZXZpY2UpOworfQorI2VuZGlmIC8qRUFTWUNBUF9ORUVEU19WNEwyX0RFVklDRV9IKi8KKyMKKyNlbmRpZiAvKkVBU1lDQVBfSVNfVklERU9ERVZfQ0xJRU5UKi8KKy8qXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2lmIChtZW1jbXAoJnBlYXN5Y2FwLT50ZWxsdGFsZVswXSwgVEVMTFRBTEUsIHN0cmxlbihURUxMVEFMRSkpKSB7CisJU0FZKCJFUlJPUjogYmFkIHBlYXN5Y2FwOiAweCUwOGxYXG4iLCAodW5zaWduZWQgbG9uZyBpbnQpIHBlYXN5Y2FwKTsKKwlyZXR1cm47Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogIElGIFRIRSBXQUlUIFFVRVVFUyBBUkUgTk9UIENMRUFSRUQgQSBERUFETE9DSyBJUyBQT1NTSUJMRS4gIEJFV0FSRS4KKyovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitwZWFzeWNhcC0+dmlkZW9fZW9mID0gMTsKK3BlYXN5Y2FwLT5hdWRpb19lb2YgPSAxOword2FrZV91cF9pbnRlcnJ1cHRpYmxlKCYocGVhc3ljYXAtPndxX3ZpZGVvKSk7Cit3YWtlX3VwX2ludGVycnVwdGlibGUoJihwZWFzeWNhcC0+d3FfYXVkaW8pKTsKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N3aXRjaCAoYkludGVyZmFjZU51bWJlcikgeworY2FzZSAwOiB7CisJaWYgKChzdHJ1Y3QgbGlzdF9oZWFkICopTlVMTCAhPSBwZWFzeWNhcC0+cHVyYl92aWRlb19oZWFkKSB7CisJCUpPTSg0LCAia2lsbGluZyB2aWRlbyB1cmJzXG4iKTsKKwkJbSA9IDA7CisJCWxpc3RfZm9yX2VhY2gocGxpc3RfaGVhZCwgKHBlYXN5Y2FwLT5wdXJiX3ZpZGVvX2hlYWQpKQorCQkJeworCQkJcGRhdGFfdXJiID0gbGlzdF9lbnRyeShwbGlzdF9oZWFkLCBcCisJCQkJCXN0cnVjdCBkYXRhX3VyYiwgbGlzdF9oZWFkKTsKKwkJCWlmICgoc3RydWN0IGRhdGFfdXJiICopTlVMTCAhPSBwZGF0YV91cmIpIHsKKwkJCQlpZiAoKHN0cnVjdCB1cmIgKilOVUxMICE9IFwKKwkJCQkJCXBkYXRhX3VyYi0+cHVyYikgeworCQkJCQl1c2Jfa2lsbF91cmIocGRhdGFfdXJiLT5wdXJiKTsKKwkJCQkJbSsrOwogCQkJCX0KIAkJCX0KLQkJCUpPVCg0LCAiJWkgdmlkZW8gdXJicyBraWxsZWRcbiIsIG0pOwotCQl9IGVsc2UKLQkJCVNBWSgiRVJST1I6IHBlYXN5Y2FwLT5wdXJiX3ZpZGVvX2hlYWQgaXMgTlVMTFxuIik7Ci0JCWJyZWFrOworCQl9CisJCUpPTSg0LCAiJWkgdmlkZW8gdXJicyBraWxsZWRcbiIsIG0pOwogCX0KKwlicmVhazsKK30KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQljYXNlIDI6IHsKLQkJaWYgKChzdHJ1Y3QgbGlzdF9oZWFkICopTlVMTCAhPSBwZWFzeWNhcC0+cHVyYl9hdWRpb19oZWFkKSB7Ci0JCQlKT1QoNCwgImtpbGxpbmcgYXVkaW8gdXJic1xuIik7Ci0JCQltID0gMDsKLQkJCWxpc3RfZm9yX2VhY2gocGxpc3RfaGVhZCwgXAotCQkJCQkJKHBlYXN5Y2FwLT5wdXJiX2F1ZGlvX2hlYWQpKSB7Ci0JCQkJcGRhdGFfdXJiID0gbGlzdF9lbnRyeShwbGlzdF9oZWFkLCBcCi0JCQkJCQlzdHJ1Y3QgZGF0YV91cmIsIGxpc3RfaGVhZCk7Ci0JCQkJaWYgKChzdHJ1Y3QgZGF0YV91cmIgKilOVUxMICE9IHBkYXRhX3VyYikgewotCQkJCQlpZiAoKHN0cnVjdCB1cmIgKilOVUxMICE9IFwKLQkJCQkJCQlwZGF0YV91cmItPnB1cmIpIHsKLQkJCQkJCXVzYl9raWxsX3VyYihwZGF0YV91cmItPnB1cmIpOwotCQkJCQkJbSsrOwotCQkJCQl9CitjYXNlIDI6IHsKKwlpZiAoKHN0cnVjdCBsaXN0X2hlYWQgKilOVUxMICE9IHBlYXN5Y2FwLT5wdXJiX2F1ZGlvX2hlYWQpIHsKKwkJSk9NKDQsICJraWxsaW5nIGF1ZGlvIHVyYnNcbiIpOworCQltID0gMDsKKwkJbGlzdF9mb3JfZWFjaChwbGlzdF9oZWFkLCBcCisJCQkJCShwZWFzeWNhcC0+cHVyYl9hdWRpb19oZWFkKSkgeworCQkJcGRhdGFfdXJiID0gbGlzdF9lbnRyeShwbGlzdF9oZWFkLCBcCisJCQkJCXN0cnVjdCBkYXRhX3VyYiwgbGlzdF9oZWFkKTsKKwkJCWlmICgoc3RydWN0IGRhdGFfdXJiICopTlVMTCAhPSBwZGF0YV91cmIpIHsKKwkJCQlpZiAoKHN0cnVjdCB1cmIgKilOVUxMICE9IFwKKwkJCQkJCXBkYXRhX3VyYi0+cHVyYikgeworCQkJCQl1c2Jfa2lsbF91cmIocGRhdGFfdXJiLT5wdXJiKTsKKwkJCQkJbSsrOwogCQkJCX0KIAkJCX0KLQkJCUpPVCg0LCAiJWkgYXVkaW8gdXJicyBraWxsZWRcbiIsIG0pOwotCQl9IGVsc2UKLQkJCVNBWSgiRVJST1I6IHBlYXN5Y2FwLT5wdXJiX2F1ZGlvX2hlYWQgaXMgTlVMTFxuIik7Ci0JCWJyZWFrOworCQl9CisJCUpPTSg0LCAiJWkgYXVkaW8gdXJicyBraWxsZWRcbiIsIG0pOwogCX0KKwlicmVhazsKK30KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQlkZWZhdWx0OgotCQlicmVhazsKLQl9CitkZWZhdWx0OgorCWJyZWFrOwogfQogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKgogICogIERFUkVHSVNURVIKKyAqCisgKiAgVEhJUyBQUk9DRURVUkUgV0lMTCBCTE9DSyBVTlRJTCBlYXN5Y2FwX3BvbGwoKSwgVklERU8gSU9DVEwgQU5EIEFVRElPCisgKiAgSU9DVEwgQVJFIEFMTCBVTkxPQ0tFRC4gIElGIFRISVMgSVMgTk9UIERPTkUgQU4gT29wcyBDQU4gT0NDVVIgV0hFTgorICogIEFOIEVhc3lDQVAgSVMgVU5QTFVHR0VEIFdISUxFIFRIRSBVUkJTIEFSRSBSVU5OSU5HLiAgQkVXQVJFLgogICovCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2tkID0gaXNkb25nbGUocGVhc3ljYXApOwogc3dpdGNoIChiSW50ZXJmYWNlTnVtYmVyKSB7CiBjYXNlIDA6IHsKKwlpZiAoMCA8PSBrZCAmJiBET05HTEVfTUFOWSA+IGtkKSB7CisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcGVhc3ljYXAtPndxX3ZpZGVvKTsKKwkJSk9NKDQsICJhYm91dCB0byBsb2NrIGVhc3ljYXBfZG9uZ2xlWyVpXS5tdXRleF92aWRlb1xuIiwga2QpOworCQlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZlYXN5Y2FwX2RvbmdsZVtrZF0uXAorCQkJCQkJCQltdXRleF92aWRlbykpIHsKKwkJCVNBWSgiRVJST1I6IGNhbm5vdCBsb2NrIGVhc3ljYXBfZG9uZ2xlWyVpXS4iIFwKKwkJCQkJCQkibXV0ZXhfdmlkZW9cbiIsIGtkKTsKKwkJCXJldHVybjsKKwkJfQorCQlKT00oNCwgImxvY2tlZCBlYXN5Y2FwX2RvbmdsZVslaV0ubXV0ZXhfdmlkZW9cbiIsIGtkKTsKKwl9IGVsc2UKKwkJU0FZKCJFUlJPUjogJWk9a2QgaXMgYmFkOiBjYW5ub3QgbG9jayBkb25nbGVcbiIsIGtkKTsKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICNpZiAoIWRlZmluZWQoRUFTWUNBUF9JU19WSURFT0RFVl9DTElFTlQpKQogCWlmICgoc3RydWN0IGVhc3ljYXAgKilOVUxMID09IHBlYXN5Y2FwKSB7Ci0JCVNBWSgiRVJST1I6IHBlYXN5Y2FwIGhhcyBiZWNvbWUgTlVMTFxuIik7CisJCVNBTSgiRVJST1I6IHBlYXN5Y2FwIGhhcyBiZWNvbWUgTlVMTFxuIik7CiAJfSBlbHNlIHsKLQkJbG9ja19rZXJuZWwoKTsKIAkJdXNiX2RlcmVnaXN0ZXJfZGV2KHB1c2JfaW50ZXJmYWNlLCAmZWFzeWNhcF9jbGFzcyk7CiAJCShwZWFzeWNhcC0+cmVnaXN0ZXJlZF92aWRlbyktLTsKLQotCQlKT1QoNCwgImludGZbJWldOiB1c2JfZGVyZWdpc3Rlcl9kZXYoKVxuIiwgYkludGVyZmFjZU51bWJlcik7Ci0JCXVubG9ja19rZXJuZWwoKTsKLQkJU0FZKCJlYXN5Y2FwIGRldGFjaGVkIGZyb20gbWlub3IgIyVkXG4iLCBtaW5vcik7CisJCUpPTSg0LCAiaW50ZlslaV06IHVzYl9kZXJlZ2lzdGVyX2RldigpXG4iLCBiSW50ZXJmYWNlTnVtYmVyKTsKKwkJU0FNKCJlYXN5Y2FwIGRldGFjaGVkIGZyb20gbWlub3IgIyVkXG4iLCBtaW5vcik7CiAJfQotLyp2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2diovCisvKnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2diovCiAjZWxzZQotCWlmICgoc3RydWN0IGVhc3ljYXAgKilOVUxMID09IHBlYXN5Y2FwKQotCQlTQVkoIkVSUk9SOiBwZWFzeWNhcCBoYXMgYmVjb21lIE5VTExcbiIpOwotCWVsc2UgewotCQlsb2NrX2tlcm5lbCgpOwotCQl2aWRlb191bnJlZ2lzdGVyX2RldmljZShwZWFzeWNhcC0+cHZpZGVvX2RldmljZSk7Ci0JCShwZWFzeWNhcC0+cmVnaXN0ZXJlZF92aWRlbyktLTsKLQkJdW5sb2NrX2tlcm5lbCgpOwotCQlKT1QoNCwgInVucmVnaXN0ZXJlZCB3aXRoIHZpZGVvZGV2OiAlaT1taW5vclxuIiwgXAotCQkJCQkJCXB2aWRlb19kZXZpY2UtPm1pbm9yKTsKKyNpZiBkZWZpbmVkKEVBU1lDQVBfTkVFRFNfVjRMMl9ERVZJQ0VfSCkKKwlpZiAoIXBlYXN5Y2FwLT52NGwyX2RldmljZS5uYW1lWzBdKSB7CisJCVNBTSgiRVJST1I6IHBlYXN5Y2FwLT52NGwyX2RldmljZS5uYW1lIGlzIGVtcHR5XG4iKTsKKwkJaWYgKDAgPD0ga2QgJiYgRE9OR0xFX01BTlkgPiBrZCkKKwkJCW11dGV4X3VubG9jaygmZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X3ZpZGVvKTsKKwkJcmV0dXJuOwogCX0KLS8qXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl4qLworCXY0bDJfZGV2aWNlX2Rpc2Nvbm5lY3QoJnBlYXN5Y2FwLT52NGwyX2RldmljZSk7CisJSk9NKDQsICJ2NGwyX2RldmljZV9kaXNjb25uZWN0KCkgT0tcbiIpOworCXY0bDJfZGV2aWNlX3VucmVnaXN0ZXIoJnBlYXN5Y2FwLT52NGwyX2RldmljZSk7CisJSk9NKDQsICJ2NGwyX2RldmljZV91bnJlZ2lzdGVyKCkgT0tcbiIpOworI2VuZGlmIC8qRUFTWUNBUF9ORUVEU19WNEwyX0RFVklDRV9IKi8KKworCXZpZGVvX3VucmVnaXN0ZXJfZGV2aWNlKCZwZWFzeWNhcC0+dmlkZW9fZGV2aWNlKTsKKwlKT00oNCwgImludGZbJWldOiB2aWRlb191bnJlZ2lzdGVyX2RldmljZSgpIE9LXG4iLCBiSW50ZXJmYWNlTnVtYmVyKTsKKwkocGVhc3ljYXAtPnJlZ2lzdGVyZWRfdmlkZW8pLS07CisJSk9NKDQsICJ1bnJlZ2lzdGVyZWQgd2l0aCB2aWRlb2RldjogJWk9bWlub3JcbiIsIG1pbm9yKTsKICNlbmRpZiAvKkVBU1lDQVBfSVNfVklERU9ERVZfQ0xJRU5UKi8KKy8qXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eKi8KKworCWlmICgwIDw9IGtkICYmIERPTkdMRV9NQU5ZID4ga2QpIHsKKwkJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfdmlkZW8pOworCQlKT00oNCwgInVubG9ja2VkIGVhc3ljYXBfZG9uZ2xlWyVpXS5tdXRleF92aWRlb1xuIiwga2QpOworCX0KIAlicmVhazsKIH0KIGNhc2UgMjogewotCWxvY2tfa2VybmVsKCk7CisJaWYgKDAgPD0ga2QgJiYgRE9OR0xFX01BTlkgPiBrZCkgeworCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnBlYXN5Y2FwLT53cV9hdWRpbyk7CisJCUpPTSg0LCAiYWJvdXQgdG8gbG9jayBlYXN5Y2FwX2RvbmdsZVslaV0ubXV0ZXhfYXVkaW9cbiIsIGtkKTsKKwkJaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmZWFzeWNhcF9kb25nbGVba2RdLlwKKwkJCQkJCQkJbXV0ZXhfYXVkaW8pKSB7CisJCQlTQVkoIkVSUk9SOiBjYW5ub3QgbG9jayBlYXN5Y2FwX2RvbmdsZVslaV0uIiBcCisJCQkJCQkJIm11dGV4X2F1ZGlvXG4iLCBrZCk7CisJCQlyZXR1cm47CisJCX0KKwkJSk9NKDQsICJsb2NrZWQgZWFzeWNhcF9kb25nbGVbJWldLm11dGV4X2F1ZGlvXG4iLCBrZCk7CisJfSBlbHNlCisJCVNBWSgiRVJST1I6ICVpPWtkIGlzIGJhZDogY2Fubm90IGxvY2sgZG9uZ2xlXG4iLCBrZCk7CiAKIAl1c2JfZGVyZWdpc3Rlcl9kZXYocHVzYl9pbnRlcmZhY2UsICZlYXN5c25kX2NsYXNzKTsKLQlpZiAoKHN0cnVjdCBlYXN5Y2FwICopTlVMTCAhPSBwZWFzeWNhcCkKLQkJKHBlYXN5Y2FwLT5yZWdpc3RlcmVkX2F1ZGlvKS0tOworCShwZWFzeWNhcC0+cmVnaXN0ZXJlZF9hdWRpbyktLTsKIAotCUpPVCg0LCAiaW50ZlslaV06IHVzYl9kZXJlZ2lzdGVyX2RldigpXG4iLCBiSW50ZXJmYWNlTnVtYmVyKTsKLQl1bmxvY2tfa2VybmVsKCk7CisJSk9NKDQsICJpbnRmWyVpXTogdXNiX2RlcmVnaXN0ZXJfZGV2KClcbiIsIGJJbnRlcmZhY2VOdW1iZXIpOworCVNBTSgiZWFzeXNuZCBkZXRhY2hlZCBmcm9tIG1pbm9yICMlZFxuIiwgbWlub3IpOwogCi0JU0FZKCJlYXN5c25kIGRldGFjaGVkIGZyb20gbWlub3IgIyVkXG4iLCBtaW5vcik7CisJaWYgKDAgPD0ga2QgJiYgRE9OR0xFX01BTlkgPiBrZCkgeworCQltdXRleF91bmxvY2soJmVhc3ljYXBfZG9uZ2xlW2tkXS5tdXRleF9hdWRpbyk7CisJCUpPTSg0LCAidW5sb2NrZWQgZWFzeWNhcF9kb25nbGVbJWldLm11dGV4X2F1ZGlvXG4iLCBrZCk7CisJfQogCWJyZWFrOwogfQogZGVmYXVsdDoKQEAgLTQyODAsMjUgKzQ5NjMsNDIgQEAKICAqICBDQUxMIGVhc3ljYXBfZGVsZXRlKCkgSUYgTk8gUkVNQUlOSU5HIFJFRkVSRU5DRVMgVE8gcGVhc3ljYXAKICAqLwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotaWYgKChzdHJ1Y3QgZWFzeWNhcCAqKU5VTEwgPT0gcGVhc3ljYXApIHsKLQlTQVkoIkVSUk9SOiBwZWFzeWNhcCBoYXMgYmVjb21lIE5VTExcbiIpOwotCVNBWSgiY2Fubm90IGNhbGwga3JlZl9wdXQoKVxuIik7Ci0JU0FZKCJlbmRpbmcgdW5zdWNjZXNzZnVsbHk6IG1heSBjYXVzZSBtZW1vcnkgbGVha1xuIik7Ci0JcmV0dXJuOwotfQogaWYgKCFwZWFzeWNhcC0+a3JlZi5yZWZjb3VudC5jb3VudGVyKSB7Ci0JU0FZKCJFUlJPUjogcGVhc3ljYXAtPmtyZWYucmVmY291bnQuY291bnRlciBpcyB6ZXJvICIgXAorCVNBTSgiRVJST1I6IHBlYXN5Y2FwLT5rcmVmLnJlZmNvdW50LmNvdW50ZXIgaXMgemVybyAiCiAJCQkJCQkic28gY2Fubm90IGNhbGwga3JlZl9wdXQoKVxuIik7Ci0JU0FZKCJlbmRpbmcgdW5zdWNjZXNzZnVsbHk6IG1heSBjYXVzZSBtZW1vcnkgbGVha1xuIik7CisJU0FNKCJlbmRpbmcgdW5zdWNjZXNzZnVsbHk6IG1heSBjYXVzZSBtZW1vcnkgbGVha1xuIik7CiAJcmV0dXJuOwogfQotSk9UKDQsICJpbnRmWyVpXToga3JlZl9wdXQoKSB3aXRoICVpPXBlYXN5Y2FwLT5rcmVmLnJlZmNvdW50LmNvdW50ZXJcbiIsIFwKK2lmICgwIDw9IGtkICYmIERPTkdMRV9NQU5ZID4ga2QpIHsKKwlKT00oNCwgImFib3V0IHRvIGxvY2sgZWFzeWNhcF9kb25nbGVbJWldLm11dGV4X3ZpZGVvXG4iLCBrZCk7CisJaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X3ZpZGVvKSkgeworCQlTQVkoIkVSUk9SOiBjYW5ub3QgZG93biBlYXN5Y2FwX2RvbmdsZVslaV0ubXV0ZXhfdmlkZW9cbiIsIGtkKTsKKwkJU0FNKCJlbmRpbmcgdW5zdWNjZXNzZnVsbHk6IG1heSBjYXVzZSBtZW1vcnkgbGVha1xuIik7CisJcmV0dXJuOworCX0KKwlKT00oNCwgImxvY2tlZCBlYXN5Y2FwX2RvbmdsZVslaV0ubXV0ZXhfdmlkZW9cbiIsIGtkKTsKKwlKT00oNCwgImFib3V0IHRvIGxvY2sgZWFzeWNhcF9kb25nbGVbJWldLm11dGV4X2F1ZGlvXG4iLCBrZCk7CisJaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X2F1ZGlvKSkgeworCQlTQVkoIkVSUk9SOiBjYW5ub3QgZG93biBlYXN5Y2FwX2RvbmdsZVslaV0ubXV0ZXhfYXVkaW9cbiIsIGtkKTsKKwkJbXV0ZXhfdW5sb2NrKCYoZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X3ZpZGVvKSk7CisJCUpPTSg0LCAidW5sb2NrZWQgZWFzeWNhcF9kb25nbGVbJWldLm11dGV4X3ZpZGVvXG4iLCBrZCk7CisJCVNBTSgiZW5kaW5nIHVuc3VjY2Vzc2Z1bGx5OiBtYXkgY2F1c2UgbWVtb3J5IGxlYWtcbiIpOworCQlyZXR1cm47CisJfQorCUpPTSg0LCAibG9ja2VkIGVhc3ljYXBfZG9uZ2xlWyVpXS5tdXRleF9hdWRpb1xuIiwga2QpOworfQorSk9NKDQsICJpbnRmWyVpXTogJWk9cGVhc3ljYXAtPmtyZWYucmVmY291bnQuY291bnRlclxuIiwgXAogCQliSW50ZXJmYWNlTnVtYmVyLCAoaW50KXBlYXN5Y2FwLT5rcmVmLnJlZmNvdW50LmNvdW50ZXIpOwoga3JlZl9wdXQoJnBlYXN5Y2FwLT5rcmVmLCBlYXN5Y2FwX2RlbGV0ZSk7CiBKT1QoNCwgImludGZbJWldOiBrcmVmX3B1dCgpIGRvbmUuXG4iLCBiSW50ZXJmYWNlTnVtYmVyKTsKK2lmICgwIDw9IGtkICYmIERPTkdMRV9NQU5ZID4ga2QpIHsKKwltdXRleF91bmxvY2soJihlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfYXVkaW8pKTsKKwlKT1QoNCwgInVubG9ja2VkIGVhc3ljYXBfZG9uZ2xlWyVpXS5tdXRleF9hdWRpb1xuIiwga2QpOworCW11dGV4X3VubG9jaygmZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X3ZpZGVvKTsKKwlKT1QoNCwgInVubG9ja2VkIGVhc3ljYXBfZG9uZ2xlWyVpXS5tdXRleF92aWRlb1xuIiwga2QpOworfQogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1KT1QoNCwgImVuZHNcbiIpOworSk9NKDQsICJlbmRzXG4iKTsKIHJldHVybjsKIH0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTQzMDgsNyArNTAwOCw4IEBACiBpbnQgcmVzdWx0OwogCiBTQVkoIj09PT09PT09ZWFzeWNhcD09PT09PT1cbiIpOwotSk9UKDQsICJiZWdpbnMuICAlaT1kZWJ1Z1xuIiwgZWFzeWNhcF9kZWJ1Zyk7CitKT1QoNCwgImJlZ2lucy4gICVpPWRlYnVnICVpPWJhcnMgJWk9Z2FpblxuIiwgZWFzeWNhcF9kZWJ1ZywgZWFzeWNhcF9iYXJzLCBcCisJCQkJCQllYXN5Y2FwX2dhaW4pOwogU0FZKCJ2ZXJzaW9uOiAiIEVBU1lDQVBfRFJJVkVSX1ZFUlNJT04gIlxuIik7CiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKgpAQCAtNDM0OSw2ICs1MDUwLDkgQEAKIE1PRFVMRV9ERVNDUklQVElPTihFQVNZQ0FQX0RSSVZFUl9ERVNDUklQVElPTik7CiBNT0RVTEVfVkVSU0lPTihFQVNZQ0FQX0RSSVZFUl9WRVJTSU9OKTsKICNpZiBkZWZpbmVkKEVBU1lDQVBfREVCVUcpCi1NT0RVTEVfUEFSTV9ERVNDKGVhc3ljYXBfZGVidWcsICJkZWJ1ZzogMCAoZGVmYXVsdCksIDEsIDIsLi4uIik7CitNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAiRGVidWcgbGV2ZWw6IDAoZGVmYXVsdCksMSwyLC4uLiw5Iik7CiAjZW5kaWYgLypFQVNZQ0FQX0RFQlVHKi8KK01PRFVMRV9QQVJNX0RFU0MoYmFycywgXAorCSJUZXN0Y2FyZCBiYXJzIG9uIGlucHV0IHNpZ25hbCBmYWlsdXJlOiAwPT5ubywgMT0+eWVzKGRlZmF1bHQpIik7CitNT0RVTEVfUEFSTV9ERVNDKGdhaW4sICJBdWRpbyBnYWluOiAwLC4uLiwxNihkZWZhdWx0KSwuLi4zMSIpOwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2Vhc3ljYXAvZWFzeWNhcF9zZXR0aW5ncy5jIGIvZHJpdmVycy9zdGFnaW5nL2Vhc3ljYXAvZWFzeWNhcF9zZXR0aW5ncy5jCmluZGV4IDM4ZDk0MDUuLmRmM2YxN2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9lYXN5Y2FwL2Vhc3ljYXBfc2V0dGluZ3MuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZWFzeWNhcC9lYXN5Y2FwX3NldHRpbmdzLmMKQEAgLTMzLDExICszMywxNSBAQAogICogIFRIRSBMRUFTVCBTSUdOSUZJQ0FOVCBCSVQgT0YgZWFzeWNhcF9zdGFuZGFyZC5tYXNrIEhBUyBNRUFOSU5HOgogICogICAgICAgICAgICAgICAgICAgICAgICAgMCA9PiAyNSBmcHMKICAqICAgICAgICAgICAgICAgICAgICAgICAgIDEgPT4gMzAgZnBzCisgKgorICogIFRIRSBNT1NUICBTSUdOSUZJQ0FOVCBCSVQgT0YgZWFzeWNhcF9zdGFuZGFyZC5tYXNrIEhBUyBNRUFOSU5HOgorICogICAgICAgICAgICAgICAgICAgICAgICAgMCA9PiBmdWxsIGZyYW1lcmF0ZQorICogICAgICAgICAgICAgICAgICAgICAgICAgMSA9PiAyMCUgIGZyYW1lcmF0ZQogICovCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiBjb25zdCBzdHJ1Y3QgZWFzeWNhcF9zdGFuZGFyZCBlYXN5Y2FwX3N0YW5kYXJkW10gPSB7CiB7Ci0ubWFzayA9IDB4MDAwRiAmIFBBTF9CR0hJTiAsCisubWFzayA9IDB4MDBGRiAmIFBBTF9CR0hJTiAsCiAudjRsMl9zdGFuZGFyZCA9IHsKIAkuaW5kZXggPSBQQUxfQkdISU4sCiAJLmlkID0gKFY0TDJfU1REX1BBTF9CIHwgVjRMMl9TVERfUEFMX0cgfCBWNEwyX1NURF9QQUxfSCB8IFwKQEAgLTUwLDcgKzU0LDcgQEAKIH0sCiAvKiAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCiB7Ci0ubWFzayA9IDB4MDAwRiAmIE5UU0NfTl80NDMgLAorLm1hc2sgPSAweDAwRkYgJiBOVFNDX05fNDQzICwKIC52NGwyX3N0YW5kYXJkID0gewogCS5pbmRleCA9IE5UU0NfTl80NDMsCiAJLmlkID0gVjRMMl9TVERfVU5LTk9XTiwKQEAgLTYyLDcgKzY2LDcgQEAKIH0sCiAvKiAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCiB7Ci0ubWFzayA9IDB4MDAwRiAmIFBBTF9OYyAsCisubWFzayA9IDB4MDBGRiAmIFBBTF9OYyAsCiAudjRsMl9zdGFuZGFyZCA9IHsKIAkuaW5kZXggPSBQQUxfTmMsCiAJLmlkID0gVjRMMl9TVERfUEFMX05jLApAQCAtNzQsNyArNzgsNyBAQAogfSwKIC8qIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KIHsKLS5tYXNrID0gMHgwMDBGICYgTlRTQ19OICwKKy5tYXNrID0gMHgwMEZGICYgTlRTQ19OICwKIC52NGwyX3N0YW5kYXJkID0gewogCS5pbmRleCA9IE5UU0NfTiwKIAkuaWQgPSBWNEwyX1NURF9VTktOT1dOLApAQCAtODYsNyArOTAsNyBAQAogfSwKIC8qIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KIHsKLS5tYXNrID0gMHgwMDBGICYgU0VDQU0gLAorLm1hc2sgPSAweDAwRkYgJiBTRUNBTSAsCiAudjRsMl9zdGFuZGFyZCA9IHsKIAkuaW5kZXggPSBTRUNBTSwKIAkuaWQgPSBWNEwyX1NURF9TRUNBTSwKQEAgLTk4LDcgKzEwMiw3IEBACiB9LAogLyogLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLwogewotLm1hc2sgPSAweDAwMEYgJiBOVFNDX00gLAorLm1hc2sgPSAweDAwRkYgJiBOVFNDX00gLAogLnY0bDJfc3RhbmRhcmQgPSB7CiAJLmluZGV4ID0gTlRTQ19NLAogCS5pZCA9IFY0TDJfU1REX05UU0NfTSwKQEAgLTExMCw3ICsxMTQsNyBAQAogfSwKIC8qIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KIHsKLS5tYXNrID0gMHgwMDBGICYgTlRTQ19NX0pQICwKKy5tYXNrID0gMHgwMEZGICYgTlRTQ19NX0pQICwKIC52NGwyX3N0YW5kYXJkID0gewogCS5pbmRleCA9IE5UU0NfTV9KUCwKIAkuaWQgPSBWNEwyX1NURF9OVFNDX01fSlAsCkBAIC0xMjIsNyArMTI2LDcgQEAKIH0sCiAvKiAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCiB7Ci0ubWFzayA9IDB4MDAwRiAmIFBBTF82MCAsCisubWFzayA9IDB4MDBGRiAmIFBBTF82MCAsCiAudjRsMl9zdGFuZGFyZCA9IHsKIAkuaW5kZXggPSBQQUxfNjAsCiAJLmlkID0gVjRMMl9TVERfUEFMXzYwLApAQCAtMTM0LDcgKzEzOCw3IEBACiB9LAogLyogLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLwogewotLm1hc2sgPSAweDAwMEYgJiBOVFNDXzQ0MyAsCisubWFzayA9IDB4MDBGRiAmIE5UU0NfNDQzICwKIC52NGwyX3N0YW5kYXJkID0gewogCS5pbmRleCA9IE5UU0NfNDQzLAogCS5pZCA9IFY0TDJfU1REX05UU0NfNDQzLApAQCAtMTQ2LDcgKzE1MCw3IEBACiB9LAogLyogLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLwogewotLm1hc2sgPSAweDAwMEYgJiBQQUxfTSAsCisubWFzayA9IDB4MDBGRiAmIFBBTF9NICwKIC52NGwyX3N0YW5kYXJkID0gewogCS5pbmRleCA9IFBBTF9NLAogCS5pZCA9IFY0TDJfU1REX1BBTF9NLApAQCAtMTU4LDYgKzE2MiwxMjggQEAKIH0sCiAvKiAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCiB7CisubWFzayA9IDB4ODAwMCB8ICgweDAwRkYgJiBQQUxfQkdISU5fU0xPVyksCisudjRsMl9zdGFuZGFyZCA9IHsKKwkuaW5kZXggPSBQQUxfQkdISU5fU0xPVywKKwkuaWQgPSAoVjRMMl9TVERfUEFMX0IgfCBWNEwyX1NURF9QQUxfRyB8IFY0TDJfU1REX1BBTF9IIHwgXAorCQkJCVY0TDJfU1REX1BBTF9JIHwgVjRMMl9TVERfUEFMX04gfCBcCisJCQkJCSgoKHY0bDJfc3RkX2lkKTB4MDEpIDw8IDMyKSksCisJLm5hbWUgPSAiUEFMX0JHSElOX1NMT1ciLAorCS5mcmFtZXBlcmlvZCA9IHsxLCA1fSwKKwkuZnJhbWVsaW5lcyA9IDYyNSwKKwkucmVzZXJ2ZWQgPSB7MCwgMCwgMCwgMH0KK30KK30sCisvKiAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCit7CisubWFzayA9IDB4ODAwMCB8ICgweDAwRkYgJiBOVFNDX05fNDQzX1NMT1cpLAorLnY0bDJfc3RhbmRhcmQgPSB7CisJLmluZGV4ID0gTlRTQ19OXzQ0M19TTE9XLAorCS5pZCA9IChWNEwyX1NURF9VTktOT1dOIHwgKCgodjRsMl9zdGRfaWQpMHgxMSkgPDwgMzIpKSwKKwkubmFtZSA9ICJOVFNDX05fNDQzX1NMT1ciLAorCS5mcmFtZXBlcmlvZCA9IHsxLCA1fSwKKwkuZnJhbWVsaW5lcyA9IDQ4MCwKKwkucmVzZXJ2ZWQgPSB7MCwgMCwgMCwgMH0KK30KK30sCisvKiAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCit7CisubWFzayA9IDB4ODAwMCB8ICgweDAwRkYgJiBQQUxfTmNfU0xPVyksCisudjRsMl9zdGFuZGFyZCA9IHsKKwkuaW5kZXggPSBQQUxfTmNfU0xPVywKKwkuaWQgPSAoVjRMMl9TVERfUEFMX05jIHwgKCgodjRsMl9zdGRfaWQpMHgwMSkgPDwgMzIpKSwKKwkubmFtZSA9ICJQQUxfTmNfU0xPVyIsCisJLmZyYW1lcGVyaW9kID0gezEsIDV9LAorCS5mcmFtZWxpbmVzID0gNjI1LAorCS5yZXNlcnZlZCA9IHswLCAwLCAwLCAwfQorfQorfSwKKy8qIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KK3sKKy5tYXNrID0gMHg4MDAwIHwgKDB4MDBGRiAmIE5UU0NfTl9TTE9XKSwKKy52NGwyX3N0YW5kYXJkID0geworCS5pbmRleCA9IE5UU0NfTl9TTE9XLAorCS5pZCA9IChWNEwyX1NURF9VTktOT1dOIHwgKCgodjRsMl9zdGRfaWQpMHgyMSkgPDwgMzIpKSwKKwkubmFtZSA9ICJOVFNDX05fU0xPVyIsCisJLmZyYW1lcGVyaW9kID0gezEsIDV9LAorCS5mcmFtZWxpbmVzID0gNTI1LAorCS5yZXNlcnZlZCA9IHswLCAwLCAwLCAwfQorfQorfSwKKy8qIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KK3sKKy5tYXNrID0gMHg4MDAwIHwgKDB4MDBGRiAmIFNFQ0FNX1NMT1cpLAorLnY0bDJfc3RhbmRhcmQgPSB7CisJLmluZGV4ID0gU0VDQU1fU0xPVywKKwkuaWQgPSAoVjRMMl9TVERfU0VDQU0gfCAoKCh2NGwyX3N0ZF9pZCkweDAxKSA8PCAzMikpLAorCS5uYW1lID0gIlNFQ0FNX1NMT1ciLAorCS5mcmFtZXBlcmlvZCA9IHsxLCA1fSwKKwkuZnJhbWVsaW5lcyA9IDYyNSwKKwkucmVzZXJ2ZWQgPSB7MCwgMCwgMCwgMH0KK30KK30sCisvKiAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCit7CisubWFzayA9IDB4ODAwMCB8ICgweDAwRkYgJiBOVFNDX01fU0xPVyksCisudjRsMl9zdGFuZGFyZCA9IHsKKwkuaW5kZXggPSBOVFNDX01fU0xPVywKKwkuaWQgPSAoVjRMMl9TVERfTlRTQ19NIHwgKCgodjRsMl9zdGRfaWQpMHgwMSkgPDwgMzIpKSwKKwkubmFtZSA9ICJOVFNDX01fU0xPVyIsCisJLmZyYW1lcGVyaW9kID0gezEsIDZ9LAorCS5mcmFtZWxpbmVzID0gNTI1LAorCS5yZXNlcnZlZCA9IHswLCAwLCAwLCAwfQorfQorfSwKKy8qIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KK3sKKy5tYXNrID0gMHg4MDAwIHwgKDB4MDBGRiAmIE5UU0NfTV9KUF9TTE9XKSwKKy52NGwyX3N0YW5kYXJkID0geworCS5pbmRleCA9IE5UU0NfTV9KUF9TTE9XLAorCS5pZCA9IChWNEwyX1NURF9OVFNDX01fSlAgfCAoKCh2NGwyX3N0ZF9pZCkweDAxKSA8PCAzMikpLAorCS5uYW1lID0gIk5UU0NfTV9KUF9TTE9XIiwKKwkuZnJhbWVwZXJpb2QgPSB7MSwgNn0sCisJLmZyYW1lbGluZXMgPSA1MjUsCisJLnJlc2VydmVkID0gezAsIDAsIDAsIDB9Cit9Cit9LAorLyogLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLworeworLm1hc2sgPSAweDgwMDAgfCAoMHgwMEZGICYgUEFMXzYwX1NMT1cpLAorLnY0bDJfc3RhbmRhcmQgPSB7CisJLmluZGV4ID0gUEFMXzYwX1NMT1csCisJLmlkID0gKFY0TDJfU1REX1BBTF82MCB8ICgoKHY0bDJfc3RkX2lkKTB4MDEpIDw8IDMyKSksCisJLm5hbWUgPSAiUEFMXzYwX1NMT1ciLAorCS5mcmFtZXBlcmlvZCA9IHsxLCA2fSwKKwkuZnJhbWVsaW5lcyA9IDUyNSwKKwkucmVzZXJ2ZWQgPSB7MCwgMCwgMCwgMH0KK30KK30sCisvKiAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCit7CisubWFzayA9IDB4ODAwMCB8ICgweDAwRkYgJiBOVFNDXzQ0M19TTE9XKSwKKy52NGwyX3N0YW5kYXJkID0geworCS5pbmRleCA9IE5UU0NfNDQzX1NMT1csCisJLmlkID0gKFY0TDJfU1REX05UU0NfNDQzIHwgKCgodjRsMl9zdGRfaWQpMHgwMSkgPDwgMzIpKSwKKwkubmFtZSA9ICJOVFNDXzQ0M19TTE9XIiwKKwkuZnJhbWVwZXJpb2QgPSB7MSwgNn0sCisJLmZyYW1lbGluZXMgPSA1MjUsCisJLnJlc2VydmVkID0gezAsIDAsIDAsIDB9Cit9Cit9LAorLyogLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLworeworLm1hc2sgPSAweDgwMDAgfCAoMHgwMEZGICYgUEFMX01fU0xPVyksCisudjRsMl9zdGFuZGFyZCA9IHsKKwkuaW5kZXggPSBQQUxfTV9TTE9XLAorCS5pZCA9IChWNEwyX1NURF9QQUxfTSB8ICgoKHY0bDJfc3RkX2lkKTB4MDEpIDw8IDMyKSksCisJLm5hbWUgPSAiUEFMX01fU0xPVyIsCisJLmZyYW1lcGVyaW9kID0gezEsIDZ9LAorCS5mcmFtZWxpbmVzID0gNTI1LAorCS5yZXNlcnZlZCA9IHswLCAwLCAwLCAwfQorfQorfSwKKy8qIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KK3sKIC5tYXNrID0gMHhGRkZGCiB9CiB9OwpAQCAtMTY1LDE1ICsyOTEsMTYgQEAKIC8qCiAgKiAgVEhFIDE2LUJJVCBlYXN5Y2FwX2Zvcm1hdC5tYXNrIEhBUyBNRUFOSU5HOgogICogICAgKGxlYXN0IHNpZ25pZmljYW50KSBCSVQgIDA6ICAgICAwID0+IFBBTCwgMjUgRlBTOyAgIDEgPT4gTlRTQywgMzAgRlBTCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIEJJVFMgMS0zOiAgIFJFU0VSVkVEIEZPUiBESUZGRVJFTlRJQVRJTkcgU1RBTkRBUkRTCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIEJJVFMgNC03OiAgIE5VTUJFUiBPRiBCWVRFUyBQRVIgUElYRUwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgQklUUyAyLTQ6ICAgUkVTRVJWRUQgRk9SIERJRkZFUkVOVElBVElORyBTVEFOREFSRFMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgQklUUyA1LTc6ICAgTlVNQkVSIE9GIEJZVEVTIFBFUiBQSVhFTAogICogICAgICAgICAgICAgICAgICAgICAgICBCSVQgIDg6ICAgICAwID0+IE5BVElWRSBCWVRFIE9SREVSOyAgMSA9PiBTV0FQUEVECiAgKiAgICAgICAgICAgICAgICAgICAgICAgIEJJVFMgOS0xMDogIFJFU0VSVkVEIEZPUiBPVEhFUiBCWVRFIFBFUk1VVEFUSU9OUwotICogICAgICAgICAgICAgICAgICAgICAgICBCSVQgMTE6ICAgICAwID0+IFVOREVDSU1BVEVEOyAgMSA9PiBERUNJTUFURUQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgQklUIDEyOiAgICAgMCA9PiBPRkZFUiBGUkFNRVM7IDEgPT4gT0ZGRVIgRklFTERTCi0gKiAgICAgKG1vc3Qgc2lnbmlmaWNhbnQpIEJJVFMgMTMtMTU6IFJFU0VSVkVEIEZPUiBPVEhFUiBGSUVMRCBPUkRFUiBPUFRJT05TCisgKiAgICAgICAgICAgICAgICAgICAgICAgIEJJVCAxMTogICAgIDAgPT4gVU5ERUNJTUFURUQ7ICAgIDEgPT4gREVDSU1BVEVECisgKiAgICAgICAgICAgICAgICAgICAgICAgIEJJVCAxMjogICAgIDAgPT4gT0ZGRVIgRlJBTUVTOyAgIDEgPT4gT0ZGRVIgRklFTERTCisgKiAgICAgICAgICAgICAgICAgICAgICAgIEJJVCAxMzogICAgIDAgPT4gRlVMTCBGUkFNRVJBVEU7IDEgPT4gUkVEVUNFRAorICogICAgIChtb3N0IHNpZ25pZmljYW50KSBCSVRTIDE0LTE1OiBSRVNFUlZFRCBGT1IgT1RIRVIgRklFTEQvRlJBTUUgT1BUSU9OUwogICogIElUIEZPTExPV1MgVEhBVDoKLSAqICAgICBieXRlc3BlcnBpeGVsIElTICAgICAgICAgKCgweDAwRjAgJiBlYXN5Y2FwX2Zvcm1hdC5tYXNrKSA+PiA0KQorICogICAgIGJ5dGVzcGVycGl4ZWwgSVMgICAgICAgICAoKDB4MDBFMCAmIGVhc3ljYXBfZm9ybWF0Lm1hc2spID4+IDUpCiAgKiAgICAgYnl0ZXN3YXBvcmRlciBJUyB0cnVlIElGICgwICE9ICgweDAxMDAgJiBlYXN5Y2FwX2Zvcm1hdC5tYXNrKSkKICAqCiAgKiAgICAgZGVjaW1hdGVwaXhlbCBJUyB0cnVlIElGICgwICE9ICgweDA4MDAgJiBlYXN5Y2FwX2Zvcm1hdC5tYXNrKSkKQEAgLTE5Nyw2NSArMzI0LDEzNSBAQAogCW1hc2sxID0gMHgwMDAwOwogCXN3aXRjaCAoaSkgewogCWNhc2UgUEFMX0JHSElOOiB7Ci0JCW1hc2sxID0gUEFMX0JHSElOOworCQltYXNrMSA9IDB4MUYgJiBQQUxfQkdISU47CiAJCXN0cmNweSgmbmFtZTFbMF0sICJQQUxfQkdISU4iKTsKIAkJY29sb3JzcGFjZSA9IFY0TDJfQ09MT1JTUEFDRV80NzBfU1lTVEVNX0JHOwogCQlicmVhazsKIAl9CiAJY2FzZSBTRUNBTTogewotCQltYXNrMSA9IFNFQ0FNOworCQltYXNrMSA9IDB4MUYgJiBTRUNBTTsKIAkJc3RyY3B5KCZuYW1lMVswXSwgIlNFQ0FNIik7CiAJCWNvbG9yc3BhY2UgPSBWNEwyX0NPTE9SU1BBQ0VfNDcwX1NZU1RFTV9CRzsKIAkJYnJlYWs7CiAJfQogCWNhc2UgUEFMX05jOiB7Ci0JCW1hc2sxID0gUEFMX05jOworCQltYXNrMSA9IDB4MUYgJiBQQUxfTmM7CiAJCXN0cmNweSgmbmFtZTFbMF0sICJQQUxfTmMiKTsKIAkJY29sb3JzcGFjZSA9IFY0TDJfQ09MT1JTUEFDRV80NzBfU1lTVEVNX0JHOwogCQlicmVhazsKIAl9CiAJY2FzZSBQQUxfNjA6IHsKLQkJbWFzazEgPSBQQUxfNjA7CisJCW1hc2sxID0gMHgxRiAmIFBBTF82MDsKIAkJc3RyY3B5KCZuYW1lMVswXSwgIlBBTF82MCIpOwogCQljb2xvcnNwYWNlID0gVjRMMl9DT0xPUlNQQUNFXzQ3MF9TWVNURU1fQkc7CiAJCWJyZWFrOwogCX0KIAljYXNlIFBBTF9NOiB7Ci0JCW1hc2sxID0gUEFMX007CisJCW1hc2sxID0gMHgxRiAmIFBBTF9NOwogCQlzdHJjcHkoJm5hbWUxWzBdLCAiUEFMX00iKTsKIAkJY29sb3JzcGFjZSA9IFY0TDJfQ09MT1JTUEFDRV80NzBfU1lTVEVNX0JHOwogCQlicmVhazsKIAl9CiAJY2FzZSBOVFNDX006IHsKLQkJbWFzazEgPSBOVFNDX007CisJCW1hc2sxID0gMHgxRiAmIE5UU0NfTTsKIAkJc3RyY3B5KCZuYW1lMVswXSwgIk5UU0NfTSIpOwogCQljb2xvcnNwYWNlID0gVjRMMl9DT0xPUlNQQUNFXzQ3MF9TWVNURU1fTTsKIAkJYnJlYWs7CiAJfQogCWNhc2UgTlRTQ180NDM6IHsKLQkJbWFzazEgPSBOVFNDXzQ0MzsKKwkJbWFzazEgPSAweDFGICYgTlRTQ180NDM7CiAJCXN0cmNweSgmbmFtZTFbMF0sICJOVFNDXzQ0MyIpOwogCQljb2xvcnNwYWNlID0gVjRMMl9DT0xPUlNQQUNFXzQ3MF9TWVNURU1fTTsKIAkJYnJlYWs7CiAJfQogCWNhc2UgTlRTQ19NX0pQOiB7Ci0JCW1hc2sxID0gTlRTQ19NX0pQOworCQltYXNrMSA9IDB4MUYgJiBOVFNDX01fSlA7CiAJCXN0cmNweSgmbmFtZTFbMF0sICJOVFNDX01fSlAiKTsKIAkJY29sb3JzcGFjZSA9IFY0TDJfQ09MT1JTUEFDRV80NzBfU1lTVEVNX007CiAJCWJyZWFrOwogCX0KIAljYXNlIE5UU0NfTjogewotCQltYXNrMSA9IE5UU0NfTTsKKwkJbWFzazEgPSAweDFGICYgTlRTQ19NOwogCQlzdHJjcHkoJm5hbWUxWzBdLCAiTlRTQ19OIik7CiAJCWNvbG9yc3BhY2UgPSBWNEwyX0NPTE9SU1BBQ0VfNDcwX1NZU1RFTV9NOwogCQlicmVhazsKIAl9CiAJY2FzZSBOVFNDX05fNDQzOiB7Ci0JCW1hc2sxID0gTlRTQ19OXzQ0MzsKKwkJbWFzazEgPSAweDFGICYgTlRTQ19OXzQ0MzsKIAkJc3RyY3B5KCZuYW1lMVswXSwgIk5UU0NfTl80NDMiKTsKIAkJY29sb3JzcGFjZSA9IFY0TDJfQ09MT1JTUEFDRV80NzBfU1lTVEVNX007CiAJCWJyZWFrOwogCX0KKwljYXNlIFBBTF9CR0hJTl9TTE9XOiB7CisJCW1hc2sxID0gMHgwMDFGICYgUEFMX0JHSElOX1NMT1c7CisJCW1hc2sxIHw9IDB4MDIwMDsKKwkJc3RyY3B5KCZuYW1lMVswXSwgIlBBTF9CR0hJTl9TTE9XIik7CisJCWNvbG9yc3BhY2UgPSBWNEwyX0NPTE9SU1BBQ0VfNDcwX1NZU1RFTV9CRzsKKwkJYnJlYWs7CisJfQorCWNhc2UgU0VDQU1fU0xPVzogeworCQltYXNrMSA9IDB4MDAxRiAmIFNFQ0FNX1NMT1c7CisJCW1hc2sxIHw9IDB4MDIwMDsKKwkJc3RyY3B5KCZuYW1lMVswXSwgIlNFQ0FNX1NMT1ciKTsKKwkJY29sb3JzcGFjZSA9IFY0TDJfQ09MT1JTUEFDRV80NzBfU1lTVEVNX0JHOworCQlicmVhazsKKwl9CisJY2FzZSBQQUxfTmNfU0xPVzogeworCQltYXNrMSA9IDB4MDAxRiAmIFBBTF9OY19TTE9XOworCQltYXNrMSB8PSAweDAyMDA7CisJCXN0cmNweSgmbmFtZTFbMF0sICJQQUxfTmNfU0xPVyIpOworCQljb2xvcnNwYWNlID0gVjRMMl9DT0xPUlNQQUNFXzQ3MF9TWVNURU1fQkc7CisJCWJyZWFrOworCX0KKwljYXNlIFBBTF82MF9TTE9XOiB7CisJCW1hc2sxID0gMHgwMDFGICYgUEFMXzYwX1NMT1c7CisJCW1hc2sxIHw9IDB4MDIwMDsKKwkJc3RyY3B5KCZuYW1lMVswXSwgIlBBTF82MF9TTE9XIik7CisJCWNvbG9yc3BhY2UgPSBWNEwyX0NPTE9SU1BBQ0VfNDcwX1NZU1RFTV9CRzsKKwkJYnJlYWs7CisJfQorCWNhc2UgUEFMX01fU0xPVzogeworCQltYXNrMSA9IDB4MDAxRiAmIFBBTF9NX1NMT1c7CisJCW1hc2sxIHw9IDB4MDIwMDsKKwkJc3RyY3B5KCZuYW1lMVswXSwgIlBBTF9NX1NMT1ciKTsKKwkJY29sb3JzcGFjZSA9IFY0TDJfQ09MT1JTUEFDRV80NzBfU1lTVEVNX0JHOworCQlicmVhazsKKwl9CisJY2FzZSBOVFNDX01fU0xPVzogeworCQltYXNrMSA9IDB4MDAxRiAmIE5UU0NfTV9TTE9XOworCQltYXNrMSB8PSAweDAyMDA7CisJCXN0cmNweSgmbmFtZTFbMF0sICJOVFNDX01fU0xPVyIpOworCQljb2xvcnNwYWNlID0gVjRMMl9DT0xPUlNQQUNFXzQ3MF9TWVNURU1fTTsKKwkJYnJlYWs7CisJfQorCWNhc2UgTlRTQ180NDNfU0xPVzogeworCQltYXNrMSA9IDB4MDAxRiAmIE5UU0NfNDQzX1NMT1c7CisJCW1hc2sxIHw9IDB4MDIwMDsKKwkJc3RyY3B5KCZuYW1lMVswXSwgIk5UU0NfNDQzX1NMT1ciKTsKKwkJY29sb3JzcGFjZSA9IFY0TDJfQ09MT1JTUEFDRV80NzBfU1lTVEVNX007CisJCWJyZWFrOworCX0KKwljYXNlIE5UU0NfTV9KUF9TTE9XOiB7CisJCW1hc2sxID0gMHgwMDFGICYgTlRTQ19NX0pQX1NMT1c7CisJCW1hc2sxIHw9IDB4MDIwMDsKKwkJc3RyY3B5KCZuYW1lMVswXSwgIk5UU0NfTV9KUF9TTE9XIik7CisJCWNvbG9yc3BhY2UgPSBWNEwyX0NPTE9SU1BBQ0VfNDcwX1NZU1RFTV9NOworCQlicmVhazsKKwl9CisJY2FzZSBOVFNDX05fU0xPVzogeworCQltYXNrMSA9IDB4MDAxRiAmIE5UU0NfTl9TTE9XOworCQltYXNrMSB8PSAweDAyMDA7CisJCXN0cmNweSgmbmFtZTFbMF0sICJOVFNDX05fU0xPVyIpOworCQljb2xvcnNwYWNlID0gVjRMMl9DT0xPUlNQQUNFXzQ3MF9TWVNURU1fTTsKKwkJYnJlYWs7CisJfQorCWNhc2UgTlRTQ19OXzQ0M19TTE9XOiB7CisJCW1hc2sxID0gMHgwMDFGICYgTlRTQ19OXzQ0M19TTE9XOworCQltYXNrMSB8PSAweDAyMDA7CisJCXN0cmNweSgmbmFtZTFbMF0sICJOVFNDX05fNDQzX1NMT1ciKTsKKwkJY29sb3JzcGFjZSA9IFY0TDJfQ09MT1JTUEFDRV80NzBfU1lTVEVNX007CisJCWJyZWFrOworCX0KIAlkZWZhdWx0OgogCQlyZXR1cm4gLTE7CiAJfQpAQCAtMzExLDM5ICs1MDgsMzkgQEAKIAkJCWNhc2UgRk1UX1VZVlk6IHsKIAkJCQlzdHJjcHkoJm5hbWUzWzBdLCAiXyIgU1RSSU5HSVpFKEZNVF9VWVZZKSk7CiAJCQkJcGl4ZWxmb3JtYXQgPSBWNEwyX1BJWF9GTVRfVVlWWTsKLQkJCQltYXNrMyB8PSAoMHgwMiA8PCA0KTsKKwkJCQltYXNrMyB8PSAoMHgwMiA8PCA1KTsKIAkJCQlicmVhazsKIAkJCX0KIAkJCWNhc2UgRk1UX1lVWTI6IHsKIAkJCQlzdHJjcHkoJm5hbWUzWzBdLCAiXyIgU1RSSU5HSVpFKEZNVF9ZVVkyKSk7CiAJCQkJcGl4ZWxmb3JtYXQgPSBWNEwyX1BJWF9GTVRfWVVZVjsKLQkJCQltYXNrMyB8PSAoMHgwMiA8PCA0KTsKKwkJCQltYXNrMyB8PSAoMHgwMiA8PCA1KTsKIAkJCQltYXNrMyB8PSAweDAxMDA7CiAJCQkJYnJlYWs7CiAJCQl9CiAJCQljYXNlIEZNVF9SR0IyNDogewogCQkJCXN0cmNweSgmbmFtZTNbMF0sICJfIiBTVFJJTkdJWkUoRk1UX1JHQjI0KSk7CiAJCQkJcGl4ZWxmb3JtYXQgPSBWNEwyX1BJWF9GTVRfUkdCMjQ7Ci0JCQkJbWFzazMgfD0gKDB4MDMgPDwgNCk7CisJCQkJbWFzazMgfD0gKDB4MDMgPDwgNSk7CiAJCQkJYnJlYWs7CiAJCQl9CiAJCQljYXNlIEZNVF9SR0IzMjogewogCQkJCXN0cmNweSgmbmFtZTNbMF0sICJfIiBTVFJJTkdJWkUoRk1UX1JHQjMyKSk7CiAJCQkJcGl4ZWxmb3JtYXQgPSBWNEwyX1BJWF9GTVRfUkdCMzI7Ci0JCQkJbWFzazMgfD0gKDB4MDQgPDwgNCk7CisJCQkJbWFzazMgfD0gKDB4MDQgPDwgNSk7CiAJCQkJYnJlYWs7CiAJCQl9CiAJCQljYXNlIEZNVF9CR1IyNDogewogCQkJCXN0cmNweSgmbmFtZTNbMF0sICJfIiBTVFJJTkdJWkUoRk1UX0JHUjI0KSk7CiAJCQkJcGl4ZWxmb3JtYXQgPSBWNEwyX1BJWF9GTVRfQkdSMjQ7Ci0JCQkJbWFzazMgfD0gKDB4MDMgPDwgNCk7CisJCQkJbWFzazMgfD0gKDB4MDMgPDwgNSk7CiAJCQkJbWFzazMgfD0gMHgwMTAwOwogCQkJCWJyZWFrOwogCQkJfQogCQkJY2FzZSBGTVRfQkdSMzI6IHsKIAkJCQlzdHJjcHkoJm5hbWUzWzBdLCAiXyIgU1RSSU5HSVpFKEZNVF9CR1IzMikpOwogCQkJCXBpeGVsZm9ybWF0ID0gVjRMMl9QSVhfRk1UX0JHUjMyOwotCQkJCW1hc2szIHw9ICgweDA0IDw8IDQpOworCQkJCW1hc2szIHw9ICgweDA0IDw8IDUpOwogCQkJCW1hc2szIHw9IDB4MDEwMDsKIAkJCQlicmVhazsKIAkJCX0KQEAgLTM2MywxMyArNTYwLDggQEAKIAkJCQl9CiAJCQkJY2FzZSBGSUVMRF9JTlRFUkxBQ0VEOiB7CiAJCQkJCXN0cmNweSgmbmFtZTRbMF0sICItaSIpOwotCQkJCQlmaWVsZCA9IFY0TDJfRklFTERfSU5URVJMQUNFRDsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgRklFTERfQUxURVJOQVRFOiB7Ci0JCQkJCXN0cmNweSgmbmFtZTRbMF0sICItYSIpOwogCQkJCQltYXNrNCB8PSAweDEwMDA7Ci0JCQkJCWZpZWxkID0gVjRMMl9GSUVMRF9BTFRFUk5BVEU7CisJCQkJCWZpZWxkID0gVjRMMl9GSUVMRF9JTlRFUkxBQ0VEOwogCQkJCQlicmVhazsKIAkJCQl9CiAJCQkJZGVmYXVsdDoKQEAgLTQxMyw3ICs2MDUsNyBAQAogfQogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogc3RydWN0IHY0bDJfcXVlcnljdHJsIGVhc3ljYXBfY29udHJvbFtdID0gXAotIHt7Cit7ewogLmlkICAgICAgID0gVjRMMl9DSURfQlJJR0hUTkVTUywKIC50eXBlICAgICA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCiAubmFtZSAgICAgPSAiQnJpZ2h0bmVzcyIsCkBAIC00ODUsNSArNjc3LDUgQEAKIHsKIC5pZCA9IDB4RkZGRkZGRkYKIH0KLSB9OworfTsKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lYXN5Y2FwL2Vhc3ljYXBfc291bmQuYyBiL2RyaXZlcnMvc3RhZ2luZy9lYXN5Y2FwL2Vhc3ljYXBfc291bmQuYwppbmRleCA2MzU2MmJkLi4yNGQ4YmI0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZWFzeWNhcC9lYXN5Y2FwX3NvdW5kLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2Vhc3ljYXAvZWFzeWNhcF9zb3VuZC5jCkBAIC0zNiwxNyArMzYsMTUgQEAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8qCiAgKiAgT04gQ09NUExFVElPTiBPRiBBTiBBVURJTyBVUkIgSVRTIERBVEEgSVMgQ09QSUVEIFRPIFRIRSBBVURJTyBCVUZGRVJTCi0gKiAgUFJPVklERUQgcGVhc3ljYXAtPmF1ZGlvX2lkbGUgSVMgWkVSMC4gIFJFR0FSRExFU1MgT0YgVEhJUyBCRUlORyBUUlVFLAorICogIFBST1ZJREVEIHBlYXN5Y2FwLT5hdWRpb19pZGxlIElTIFpFUk8uICBSRUdBUkRMRVNTIE9GIFRISVMgQkVJTkcgVFJVRSwKICAqICBJVCBJUyBSRVNVQk1JVFRFRCBQUk9WSURFRCBwZWFzeWNhcC0+YXVkaW9faXNvY19zdHJlYW1pbmcgSVMgTk9UIFpFUk8uCiAgKi8KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIHZvaWQKIGVhc3lzbmRfY29tcGxldGUoc3RydWN0IHVyYiAqcHVyYikKIHsKLXN0YXRpYyBpbnQgbXQ7CiBzdHJ1Y3QgZWFzeWNhcCAqcGVhc3ljYXA7CiBzdHJ1Y3QgZGF0YV9idWZmZXIgKnBhdWRpb19idWZmZXI7Ci1jaGFyIGVycmJ1ZlsxNl07CiBfX3U4ICpwMSwgKnAyOwogX19zMTYgczE2OwogaW50IGksIGosIG1vcmUsIG11Y2gsIGxlYXAsIHJjOwpAQCAtNjYsNDggKzY0LDYyIEBACiAJU0FZKCJFUlJPUjogcGVhc3ljYXAgaXMgTlVMTFxuIik7CiAJcmV0dXJuOwogfQoraWYgKG1lbWNtcCgmcGVhc3ljYXAtPnRlbGx0YWxlWzBdLCBURUxMVEFMRSwgc3RybGVuKFRFTExUQUxFKSkpIHsKKwlTQVkoIkVSUk9SOiBiYWQgcGVhc3ljYXBcbiIpOworCXJldHVybjsKK30KKwogbXVjaCA9IDA7CiAKLQogaWYgKHBlYXN5Y2FwLT5hdWRpb19pZGxlKSB7Ci0JSk9UKDE2LCAiJWk9YXVkaW9faWRsZSAgJWk9YXVkaW9faXNvY19zdHJlYW1pbmdcbiIsIFwKKwlKT00oMTYsICIlaT1hdWRpb19pZGxlICAlaT1hdWRpb19pc29jX3N0cmVhbWluZ1xuIiwgXAogCQkJcGVhc3ljYXAtPmF1ZGlvX2lkbGUsIHBlYXN5Y2FwLT5hdWRpb19pc29jX3N0cmVhbWluZyk7CiAJaWYgKHBlYXN5Y2FwLT5hdWRpb19pc29jX3N0cmVhbWluZykgewogCQlyYyA9IHVzYl9zdWJtaXRfdXJiKHB1cmIsIEdGUF9BVE9NSUMpOwogCQlpZiAoMCAhPSByYykgewotCQkJU0FZKCJFUlJPUjogd2hpbGUgJWk9YXVkaW9faWRsZSwgIiBcCisJCQlpZiAoLUVOT0RFViAhPSByYykKKwkJCQlTQU0oIkVSUk9SOiB3aGlsZSAlaT1hdWRpb19pZGxlLCAiIFwKIAkJCQkJInVzYl9zdWJtaXRfdXJiKCkgZmFpbGVkIHdpdGggcmM6XG4iLCBcCiAJCQkJCQkJcGVhc3ljYXAtPmF1ZGlvX2lkbGUpOwogCQkJc3dpdGNoIChyYykgewogCQkJY2FzZSAtRU5PTUVNOiB7Ci0JCQkJU0FZKCJFTk9NRU1cbiIpOyAgICBicmVhazsKKwkJCQlTQU0oIi1FTk9NRU1cbiIpOworCQkJCWJyZWFrOwogCQkJfQogCQkJY2FzZSAtRU5PREVWOiB7Ci0JCQkJU0FZKCJFTk9ERVZcbiIpOyAgICBicmVhazsKKwkJCQlicmVhazsKIAkJCX0KIAkJCWNhc2UgLUVOWElPOiB7Ci0JCQkJU0FZKCJFTlhJT1xuIik7ICAgICBicmVhazsKKwkJCQlTQU0oIi1FTlhJT1xuIik7CisJCQkJYnJlYWs7CiAJCQl9CiAJCQljYXNlIC1FSU5WQUw6IHsKLQkJCQlTQVkoIkVJTlZBTFxuIik7ICAgIGJyZWFrOworCQkJCVNBTSgiLUVJTlZBTFxuIik7CisJCQkJYnJlYWs7CiAJCQl9CiAJCQljYXNlIC1FQUdBSU46IHsKLQkJCQlTQVkoIkVBR0FJTlxuIik7ICAgIGJyZWFrOworCQkJCVNBTSgiLUVBR0FJTlxuIik7CisJCQkJYnJlYWs7CiAJCQl9CiAJCQljYXNlIC1FRkJJRzogewotCQkJCVNBWSgiRUZCSUdcbiIpOyAgICAgYnJlYWs7CisJCQkJU0FNKCItRUZCSUdcbiIpOworCQkJCWJyZWFrOwogCQkJfQogCQkJY2FzZSAtRVBJUEU6IHsKLQkJCQlTQVkoIkVQSVBFXG4iKTsgICAgIGJyZWFrOworCQkJCVNBTSgiLUVQSVBFXG4iKTsKKwkJCQlicmVhazsKIAkJCX0KIAkJCWNhc2UgLUVNU0dTSVpFOiB7Ci0JCQkJU0FZKCJFTVNHU0laRVxuIik7ICBicmVhazsKKwkJCQlTQU0oIi1FTVNHU0laRVxuIik7CisJCQkJYnJlYWs7CiAJCQl9CiAJCQljYXNlIC1FTk9TUEM6IHsKLQkJCQlTQVkoIkVOT1NQQ1xuIik7ICBicmVhazsKKwkJCQlTQU0oIi1FTk9TUENcbiIpOworCQkJCWJyZWFrOwogCQkJfQogCQkJZGVmYXVsdDogewotCQkJCVNBWSgiMHglMDhYXG4iLCByYyk7IGJyZWFrOworCQkJCVNBTSgidW5rbm93biBlcnJvcjogMHglMDhYXG4iLCByYyk7CisJCQkJYnJlYWs7CiAJCQl9CiAJCQl9CiAJCX0KQEAgLTExNiw3NCArMTI4LDk1IEBACiB9CiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiBpZiAocHVyYi0+c3RhdHVzKSB7Ci0JaWYgKC1FU0hVVERPV04gPT0gcHVyYi0+c3RhdHVzKSB7Ci0JCUpPVCgxNiwgImltbWVkaWF0ZSByZXR1cm4gYmVjYXVzZSAtRVNIVVRET1dOPXB1cmItPnN0YXR1c1xuIik7CisJaWYgKCgtRVNIVVRET1dOID09IHB1cmItPnN0YXR1cykgfHwgKC1FTk9FTlQgPT0gcHVyYi0+c3RhdHVzKSkgeworCQlKT00oMTYsICJ1cmIgc3RhdHVzIC1FU0hVVERPV04gb3IgLUVOT0VOVFxuIik7CiAJCXJldHVybjsKIAl9Ci0JU0FZKCJFUlJPUjogbm9uLXplcm8gdXJiIHN0YXR1czpcbiIpOworCVNBTSgiRVJST1I6IG5vbi16ZXJvIHVyYiBzdGF0dXM6XG4iKTsKIAlzd2l0Y2ggKHB1cmItPnN0YXR1cykgewogCWNhc2UgLUVJTlBST0dSRVNTOiB7Ci0JCVNBWSgiLUVJTlBST0dSRVNTXG4iKTsgYnJlYWs7CisJCVNBTSgiLUVJTlBST0dSRVNTXG4iKTsKKwkJYnJlYWs7CiAJfQogCWNhc2UgLUVOT1NSOiB7Ci0JCVNBWSgiLUVOT1NSXG4iKTsgYnJlYWs7CisJCVNBTSgiLUVOT1NSXG4iKTsKKwkJYnJlYWs7CiAJfQogCWNhc2UgLUVQSVBFOiB7Ci0JCVNBWSgiLUVQSVBFXG4iKTsgYnJlYWs7CisJCVNBTSgiLUVQSVBFXG4iKTsKKwkJYnJlYWs7CiAJfQogCWNhc2UgLUVPVkVSRkxPVzogewotCQlTQVkoIi1FT1ZFUkZMT1dcbiIpOyBicmVhazsKKwkJU0FNKCItRU9WRVJGTE9XXG4iKTsKKwkJYnJlYWs7CiAJfQogCWNhc2UgLUVQUk9UTzogewotCQlTQVkoIi1FUFJPVE9cbiIpOyBicmVhazsKKwkJU0FNKCItRVBST1RPXG4iKTsKKwkJYnJlYWs7CiAJfQogCWNhc2UgLUVJTFNFUTogewotCQlTQVkoIi1FSUxTRVFcbiIpOyBicmVhazsKKwkJU0FNKCItRUlMU0VRXG4iKTsKKwkJYnJlYWs7CiAJfQogCWNhc2UgLUVUSU1FRE9VVDogewotCQlTQVkoIi1FVElNRURPVVRcbiIpOyBicmVhazsKKwkJU0FNKCItRVRJTUVET1VUXG4iKTsKKwkJYnJlYWs7CiAJfQogCWNhc2UgLUVNU0dTSVpFOiB7Ci0JCVNBWSgiLUVNU0dTSVpFXG4iKTsgYnJlYWs7CisJCVNBTSgiLUVNU0dTSVpFXG4iKTsKKwkJYnJlYWs7CiAJfQogCWNhc2UgLUVPUE5PVFNVUFA6IHsKLQkJU0FZKCItRU9QTk9UU1VQUFxuIik7IGJyZWFrOworCQlTQU0oIi1FT1BOT1RTVVBQXG4iKTsKKwkJYnJlYWs7CiAJfQogCWNhc2UgLUVQRk5PU1VQUE9SVDogewotCQlTQVkoIi1FUEZOT1NVUFBPUlRcbiIpOyBicmVhazsKKwkJU0FNKCItRVBGTk9TVVBQT1JUXG4iKTsKKwkJYnJlYWs7CiAJfQogCWNhc2UgLUVBRk5PU1VQUE9SVDogewotCQlTQVkoIi1FQUZOT1NVUFBPUlRcbiIpOyBicmVhazsKKwkJU0FNKCItRUFGTk9TVVBQT1JUXG4iKTsKKwkJYnJlYWs7CiAJfQogCWNhc2UgLUVBRERSSU5VU0U6IHsKLQkJU0FZKCItRUFERFJJTlVTRVxuIik7IGJyZWFrOworCQlTQU0oIi1FQUREUklOVVNFXG4iKTsKKwkJYnJlYWs7CiAJfQogCWNhc2UgLUVBRERSTk9UQVZBSUw6IHsKLQkJU0FZKCItRUFERFJOT1RBVkFJTFxuIik7IGJyZWFrOworCQlTQU0oIi1FQUREUk5PVEFWQUlMXG4iKTsKKwkJYnJlYWs7CiAJfQogCWNhc2UgLUVOT0JVRlM6IHsKLQkJU0FZKCItRU5PQlVGU1xuIik7IGJyZWFrOworCQlTQU0oIi1FTk9CVUZTXG4iKTsKKwkJYnJlYWs7CiAJfQogCWNhc2UgLUVJU0NPTk46IHsKLQkJU0FZKCItRUlTQ09OTlxuIik7IGJyZWFrOworCQlTQU0oIi1FSVNDT05OXG4iKTsKKwkJYnJlYWs7CiAJfQogCWNhc2UgLUVOT1RDT05OOiB7Ci0JCVNBWSgiLUVOT1RDT05OXG4iKTsgYnJlYWs7CisJCVNBTSgiLUVOT1RDT05OXG4iKTsKKwkJYnJlYWs7CiAJfQogCWNhc2UgLUVTSFVURE9XTjogewotCQlTQVkoIi1FU0hVVERPV05cbiIpOyBicmVhazsKKwkJU0FNKCItRVNIVVRET1dOXG4iKTsKKwkJYnJlYWs7CiAJfQogCWNhc2UgLUVOT0VOVDogewotCQlTQVkoIi1FTk9FTlRcbiIpOyBicmVhazsKKwkJU0FNKCItRU5PRU5UXG4iKTsKKwkJYnJlYWs7CiAJfQogCWNhc2UgLUVDT05OUkVTRVQ6IHsKLQkJU0FZKCItRUNPTk5SRVNFVFxuIik7IGJyZWFrOworCQlTQU0oIi1FQ09OTlJFU0VUXG4iKTsKKwkJYnJlYWs7CiAJfQogCWNhc2UgLUVOT1NQQzogewotCQlTQVkoIkVOT1NQQ1xuIik7ICBicmVhazsKKwkJU0FNKCJFTk9TUENcbiIpOworCQlicmVhazsKIAl9CiAJZGVmYXVsdDogewotCQlTQVkoInVua25vd24gZXJyb3IgY29kZSAweCUwOFhcbiIsIHB1cmItPnN0YXR1cyk7IGJyZWFrOworCQlTQU0oInVua25vd24gZXJyb3IgY29kZSAweCUwOFhcbiIsIHB1cmItPnN0YXR1cyk7CisJCWJyZWFrOwogCX0KIAl9CiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCkBAIC0xOTYsMzUgKzIyOSw0MyBAQAogCWlmIChwZWFzeWNhcC0+YXVkaW9faXNvY19zdHJlYW1pbmcpIHsKIAkJcmMgPSB1c2Jfc3VibWl0X3VyYihwdXJiLCBHRlBfQVRPTUlDKTsKIAkJaWYgKDAgIT0gcmMpIHsKLQkJCVNBWSgiRVJST1I6IHdoaWxlICVpPWF1ZGlvX2lkbGUsIHVzYl9zdWJtaXRfdXJiKCkgIgorCQkJU0FNKCJFUlJPUjogd2hpbGUgJWk9YXVkaW9faWRsZSwgdXNiX3N1Ym1pdF91cmIoKSAiCiAJCQkJImZhaWxlZCB3aXRoIHJjOlxuIiwgcGVhc3ljYXAtPmF1ZGlvX2lkbGUpOwogCQkJc3dpdGNoIChyYykgewogCQkJY2FzZSAtRU5PTUVNOiB7Ci0JCQkJU0FZKCJFTk9NRU1cbiIpOyAgICBicmVhazsKKwkJCQlTQU0oIi1FTk9NRU1cbiIpOworCQkJCWJyZWFrOwogCQkJfQogCQkJY2FzZSAtRU5PREVWOiB7Ci0JCQkJU0FZKCJFTk9ERVZcbiIpOyAgICBicmVhazsKKwkJCQlTQU0oIi1FTk9ERVZcbiIpOworCQkJCWJyZWFrOwogCQkJfQogCQkJY2FzZSAtRU5YSU86IHsKLQkJCQlTQVkoIkVOWElPXG4iKTsgICAgIGJyZWFrOworCQkJCVNBTSgiLUVOWElPXG4iKTsKKwkJCQlicmVhazsKIAkJCX0KIAkJCWNhc2UgLUVJTlZBTDogewotCQkJCVNBWSgiRUlOVkFMXG4iKTsgICAgYnJlYWs7CisJCQkJU0FNKCItRUlOVkFMXG4iKTsKKwkJCQlicmVhazsKIAkJCX0KIAkJCWNhc2UgLUVBR0FJTjogewotCQkJCVNBWSgiRUFHQUlOXG4iKTsgICAgYnJlYWs7CisJCQkJU0FNKCItRUFHQUlOXG4iKTsKKwkJCQlicmVhazsKIAkJCX0KIAkJCWNhc2UgLUVGQklHOiB7Ci0JCQkJU0FZKCJFRkJJR1xuIik7ICAgICBicmVhazsKKwkJCQlTQU0oIi1FRkJJR1xuIik7CisJCQkJYnJlYWs7CiAJCQl9CiAJCQljYXNlIC1FUElQRTogewotCQkJCVNBWSgiRVBJUEVcbiIpOyAgICAgYnJlYWs7CisJCQkJU0FNKCItRVBJUEVcbiIpOworCQkJCWJyZWFrOwogCQkJfQogCQkJY2FzZSAtRU1TR1NJWkU6IHsKLQkJCQlTQVkoIkVNU0dTSVpFXG4iKTsgIGJyZWFrOworCQkJCVNBTSgiLUVNU0dTSVpFXG4iKTsKKwkJCQlicmVhazsKIAkJCX0KIAkJCWRlZmF1bHQ6IHsKLQkJCQlTQVkoIjB4JTA4WFxuIiwgcmMpOyBicmVhazsKKwkJCQlTQU0oIjB4JTA4WFxuIiwgcmMpOyBicmVhazsKIAkJCX0KIAkJCX0KIAkJfQpAQCAtMjQzLDczICsyODQsODEgQEAKIGZvciAoaSA9IDA7ICBpIDwgcHVyYi0+bnVtYmVyX29mX3BhY2tldHM7IGkrKykgewogCXN3aXRjaCAocHVyYi0+aXNvX2ZyYW1lX2Rlc2NbaV0uc3RhdHVzKSB7CiAJY2FzZSAgMDogewotCQlzdHJjcHkoJmVycmJ1ZlswXSwgIk9LIik7IGJyZWFrOworCQlicmVhazsKIAl9CiAJY2FzZSAtRU5PRU5UOiB7Ci0JCXN0cmNweSgmZXJyYnVmWzBdLCAiLUVOT0VOVCIpOyBicmVhazsKKwkJU0FNKCItRU5PRU5UXG4iKTsKKwkJYnJlYWs7CiAJfQogCWNhc2UgLUVJTlBST0dSRVNTOiB7Ci0JCXN0cmNweSgmZXJyYnVmWzBdLCAiLUVJTlBST0dSRVNTIik7IGJyZWFrOworCQlTQU0oIi1FSU5QUk9HUkVTU1xuIik7CisJCWJyZWFrOwogCX0KIAljYXNlIC1FUFJPVE86IHsKLQkJc3RyY3B5KCZlcnJidWZbMF0sICItRVBST1RPIik7IGJyZWFrOworCQlTQU0oIi1FUFJPVE9cbiIpOworCQlicmVhazsKIAl9CiAJY2FzZSAtRUlMU0VROiB7Ci0JCXN0cmNweSgmZXJyYnVmWzBdLCAiLUVJTFNFUSIpOyBicmVhazsKKwkJU0FNKCItRUlMU0VRXG4iKTsKKwkJYnJlYWs7CiAJfQogCWNhc2UgLUVUSU1FOiB7Ci0JCXN0cmNweSgmZXJyYnVmWzBdLCAiLUVUSU1FIik7IGJyZWFrOworCQlTQU0oIi1FVElNRVxuIik7CisJCWJyZWFrOwogCX0KIAljYXNlIC1FVElNRURPVVQ6IHsKLQkJc3RyY3B5KCZlcnJidWZbMF0sICItRVRJTUVET1VUIik7IGJyZWFrOworCQlTQU0oIi1FVElNRURPVVRcbiIpOworCQlicmVhazsKIAl9CiAJY2FzZSAtRVBJUEU6IHsKLQkJc3RyY3B5KCZlcnJidWZbMF0sICItRVBJUEUiKTsgYnJlYWs7CisJCVNBTSgiLUVQSVBFXG4iKTsKKwkJYnJlYWs7CiAJfQogCWNhc2UgLUVDT01NOiB7Ci0JCXN0cmNweSgmZXJyYnVmWzBdLCAiLUVDT01NIik7IGJyZWFrOworCQlTQU0oIi1FQ09NTVxuIik7CisJCWJyZWFrOwogCX0KIAljYXNlIC1FTk9TUjogewotCQlzdHJjcHkoJmVycmJ1ZlswXSwgIi1FTk9TUiIpOyBicmVhazsKKwkJU0FNKCItRU5PU1JcbiIpOworCQlicmVhazsKIAl9CiAJY2FzZSAtRU9WRVJGTE9XOiB7Ci0JCXN0cmNweSgmZXJyYnVmWzBdLCAiLUVPVkVSRkxPVyIpOyBicmVhazsKKwkJU0FNKCItRU9WRVJGTE9XXG4iKTsKKwkJYnJlYWs7CiAJfQogCWNhc2UgLUVSRU1PVEVJTzogewotCQlzdHJjcHkoJmVycmJ1ZlswXSwgIi1FUkVNT1RFSU8iKTsgYnJlYWs7CisJCVNBTSgiLUVSRU1PVEVJT1xuIik7CisJCWJyZWFrOwogCX0KIAljYXNlIC1FTk9ERVY6IHsKLQkJc3RyY3B5KCZlcnJidWZbMF0sICItRU5PREVWIik7IGJyZWFrOworCQlTQU0oIi1FTk9ERVZcbiIpOworCQlicmVhazsKIAl9CiAJY2FzZSAtRVhERVY6IHsKLQkJc3RyY3B5KCZlcnJidWZbMF0sICItRVhERVYiKTsgYnJlYWs7CisJCVNBTSgiLUVYREVWXG4iKTsKKwkJYnJlYWs7CiAJfQogCWNhc2UgLUVJTlZBTDogewotCQlzdHJjcHkoJmVycmJ1ZlswXSwgIi1FSU5WQUwiKTsgYnJlYWs7CisJCVNBTSgiLUVJTlZBTFxuIik7CisJCWJyZWFrOwogCX0KIAljYXNlIC1FQ09OTlJFU0VUOiB7Ci0JCXN0cmNweSgmZXJyYnVmWzBdLCAiLUVDT05OUkVTRVQiKTsgYnJlYWs7CisJCVNBTSgiLUVDT05OUkVTRVRcbiIpOworCQlicmVhazsKIAl9CiAJY2FzZSAtRU5PU1BDOiB7Ci0JCXN0cmNweSgmZXJyYnVmWzBdLCAiLUVOT1NQQyIpOyBicmVhazsKKwkJU0FNKCItRU5PU1BDXG4iKTsKKwkJYnJlYWs7CiAJfQogCWNhc2UgLUVTSFVURE9XTjogewotCQlzdHJjcHkoJmVycmJ1ZlswXSwgIi1FU0hVVERPV04iKTsgYnJlYWs7CisJCVNBTSgiLUVTSFVURE9XTlxuIik7CisJCWJyZWFrOwogCX0KIAlkZWZhdWx0OiB7Ci0JCXN0cmNweSgmZXJyYnVmWzBdLCAiVU5LTk9XTiIpOyBicmVhazsKKwkJU0FNKCJ1bmtub3duIGVycm9yOjB4JTA4WFxuIiwgcHVyYi0+aXNvX2ZyYW1lX2Rlc2NbaV0uc3RhdHVzKTsKKwkJYnJlYWs7CiAJfQogCX0KLQlpZiAoKCFwdXJiLT5pc29fZnJhbWVfZGVzY1tpXS5zdGF0dXMpICYmIDApIHsKLQkJSk9UKDE2LCAiZnJhbWVbJTJpXTogJWk9c3RhdHVzez0lMTZzfSAgIiAgXAotCQkJCQkJIiU1aT1hY3R1YWwgICIgIFwKLQkJCQkJCSIlNWk9bGVuZ3RoICAiICBcCi0JCQkJCQkiJTNpPW9mZnNldFxuIiwgXAotCQkJCWksIHB1cmItPmlzb19mcmFtZV9kZXNjW2ldLnN0YXR1cywgJmVycmJ1ZlswXSwKLQkJCQlwdXJiLT5pc29fZnJhbWVfZGVzY1tpXS5hY3R1YWxfbGVuZ3RoLAotCQkJCXB1cmItPmlzb19mcmFtZV9kZXNjW2ldLmxlbmd0aCwKLQkJCQlwdXJiLT5pc29fZnJhbWVfZGVzY1tpXS5vZmZzZXQpOwotCX0KIAlpZiAoIXB1cmItPmlzb19mcmFtZV9kZXNjW2ldLnN0YXR1cykgewogCQltb3JlID0gcHVyYi0+aXNvX2ZyYW1lX2Rlc2NbaV0uYWN0dWFsX2xlbmd0aDsKIApAQCAtMzE5LDExICszNjgsMTIgQEAKICNlbmRpZgogCiAJCWlmICghbW9yZSkKLQkJCW10Kys7CisJCQlwZWFzeWNhcC0+YXVkaW9fbXQrKzsKIAkJZWxzZSB7Ci0JCQlpZiAobXQpIHsKLQkJCQlKT1QoMTYsICIlNGkgZW1wdHkgYXVkaW8gdXJiIGZyYW1lc1xuIiwgbXQpOwotCQkJCW10ID0gMDsKKwkJCWlmIChwZWFzeWNhcC0+YXVkaW9fbXQpIHsKKwkJCQlKT00oMTYsICIlNGkgZW1wdHkgYXVkaW8gdXJiIGZyYW1lc1xuIiwgXAorCQkJCQkJCXBlYXN5Y2FwLT5hdWRpb19tdCk7CisJCQkJcGVhc3ljYXAtPmF1ZGlvX210ID0gMDsKIAkJCX0KIAogCQkJcDEgPSAoX191OCAqKShwdXJiLT50cmFuc2Zlcl9idWZmZXIgKyBcCkBAIC0zNDAsMTMgKzM5MCwxMyBAQAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCQkJd2hpbGUgKG1vcmUpIHsKIAkJCQlpZiAoMCA+IG1vcmUpIHsKLQkJCQkJU0FZKCJlYXN5c25kX2NvbXBsZXRlOiBNSVNUQUtFOiAiIFwKKwkJCQkJU0FNKCJlYXN5c25kX2NvbXBsZXRlOiBNSVNUQUtFOiAiIFwKIAkJCQkJCQkibW9yZSBpcyBuZWdhdGl2ZVxuIik7CiAJCQkJCXJldHVybjsKIAkJCQl9CiAJCQkJaWYgKHBlYXN5Y2FwLT5hdWRpb19idWZmZXJfcGFnZV9tYW55IDw9IFwKIAkJCQkJCQlwZWFzeWNhcC0+YXVkaW9fZmlsbCkgewotCQkJCQlTQVkoIkVSUk9SOiBiYWQgIiBcCisJCQkJCVNBTSgiRVJST1I6IGJhZCAiIFwKIAkJCQkJCSJwZWFzeWNhcC0+YXVkaW9fZmlsbFxuIik7CiAJCQkJCXJldHVybjsKIAkJCQl9CkBAIC0zNTUsNyArNDA1LDcgQEAKIAkJCQkJCQlbcGVhc3ljYXAtPmF1ZGlvX2ZpbGxdOwogCQkJCWlmIChQQUdFX1NJWkUgPCAocGF1ZGlvX2J1ZmZlci0+cHRvIC0gXAogCQkJCQkJcGF1ZGlvX2J1ZmZlci0+cGdvKSkgewotCQkJCQlTQVkoIkVSUk9SOiBiYWQgcGF1ZGlvX2J1ZmZlci0+cHRvXG4iKTsKKwkJCQkJU0FNKCJFUlJPUjogYmFkIHBhdWRpb19idWZmZXItPnB0b1xuIik7CiAJCQkJCXJldHVybjsKIAkJCQl9CiAJCQkJaWYgKFBBR0VfU0laRSA9PSAocGF1ZGlvX2J1ZmZlci0+cHRvIC0gXApAQCAtMzc0LDcgKzQyNCw3IEBACiAJCQkJCQkJcGVhc3ljYXAtPmF1ZGlvX2ZpbGwpCiAJCQkJCQlwZWFzeWNhcC0+YXVkaW9fZmlsbCA9IDA7CiAKLQkJCQkJSk9UKDEyLCAiYnVtcGVkIHBlYXN5Y2FwLT4iIFwKKwkJCQkJSk9NKDEyLCAiYnVtcGVkIHBlYXN5Y2FwLT4iIFwKIAkJCQkJCQkiYXVkaW9fZmlsbCB0byAlaVxuIiwgXAogCQkJCQkJCXBlYXN5Y2FwLT5hdWRpb19maWxsKTsKIApAQCAtMzg3LDcgKzQzNyw3IEBACiAJCQkJCWlmICghKHBlYXN5Y2FwLT5hdWRpb19maWxsICUgXAogCQkJCQkJcGVhc3ljYXAtPlwKIAkJCQkJCWF1ZGlvX3BhZ2VzX3Blcl9mcmFnbWVudCkpIHsKLQkJCQkJCUpPVCgxMiwgIndha2V1cCBjYWxsIG9uIHdxXyIgXAorCQkJCQkJSk9NKDEyLCAid2FrZXVwIGNhbGwgb24gd3FfIiBcCiAJCQkJCQkiYXVkaW8sICVpPWZyYWcgcmVhZGluZyAgJWkiIFwKIAkJCQkJCSI9ZnJhZ21lbnQgZmlsbFxuIiwgXAogCQkJCQkJKHBlYXN5Y2FwLT5hdWRpb19yZWFkIC8gXApAQCAtNDE0LDcgKzQ2NCw3IEBACiAJCQkJfSBlbHNlIHsKICNpZiBkZWZpbmVkKFVQU0FNUExFKQogCQkJCQlpZiAobXVjaCAlIDE2KQotCQkJCQkJSk9UKDgsICJNSVNUQUtFPyBtdWNoIiBcCisJCQkJCQlKT00oOCwgIk1JU1RBS0U/IG11Y2giIFwKIAkJCQkJCSIgaXMgbm90IGRpdmlzaWJsZSBieSAxNlxuIik7CiAJCQkJCWlmIChtdWNoID4gKDE2ICogXAogCQkJCQkJCW1vcmUpKQpAQCAtNDY4LDcgKzUxOCw3IEBACiAJCQl9CiAJCX0KIAl9IGVsc2UgewotCQlKT1QoMTIsICJkaXNjYXJkaW5nIGF1ZGlvIHNhbXBsZXMgYmVjYXVzZSAiIFwKKwkJSk9NKDEyLCAiZGlzY2FyZGluZyBhdWRpbyBzYW1wbGVzIGJlY2F1c2UgIiBcCiAJCQkiJWk9cHVyYi0+aXNvX2ZyYW1lX2Rlc2NbaV0uc3RhdHVzXG4iLCBcCiAJCQkJcHVyYi0+aXNvX2ZyYW1lX2Rlc2NbaV0uc3RhdHVzKTsKIAl9CkBAIC00ODYsMzggKzUzNiw1MCBAQAogaWYgKHBlYXN5Y2FwLT5hdWRpb19pc29jX3N0cmVhbWluZykgewogCXJjID0gdXNiX3N1Ym1pdF91cmIocHVyYiwgR0ZQX0FUT01JQyk7CiAJaWYgKDAgIT0gcmMpIHsKLQkJU0FZKCJFUlJPUjogd2hpbGUgJWk9YXVkaW9faWRsZSwgdXNiX3N1Ym1pdF91cmIoKSBmYWlsZWQgIiBcCisJCWlmICgtRU5PREVWICE9IHJjKSB7CisJCQlTQU0oIkVSUk9SOiB3aGlsZSAlaT1hdWRpb19pZGxlLCAiIFwKKwkJCQkJInVzYl9zdWJtaXRfdXJiKCkgZmFpbGVkICIgXAogCQkJCQkid2l0aCByYzpcbiIsIHBlYXN5Y2FwLT5hdWRpb19pZGxlKTsKKwkJfQogCQlzd2l0Y2ggKHJjKSB7CiAJCWNhc2UgLUVOT01FTTogewotCQkJU0FZKCJFTk9NRU1cbiIpOyAgICBicmVhazsKKwkJCVNBTSgiLUVOT01FTVxuIik7CisJCQlicmVhazsKIAkJfQogCQljYXNlIC1FTk9ERVY6IHsKLQkJCVNBWSgiRU5PREVWXG4iKTsgICAgYnJlYWs7CisJCQlicmVhazsKIAkJfQogCQljYXNlIC1FTlhJTzogewotCQkJU0FZKCJFTlhJT1xuIik7ICAgICBicmVhazsKKwkJCVNBTSgiLUVOWElPXG4iKTsKKwkJCWJyZWFrOwogCQl9CiAJCWNhc2UgLUVJTlZBTDogewotCQkJU0FZKCJFSU5WQUxcbiIpOyAgICBicmVhazsKKwkJCVNBTSgiLUVJTlZBTFxuIik7CisJCQlicmVhazsKIAkJfQogCQljYXNlIC1FQUdBSU46IHsKLQkJCVNBWSgiRUFHQUlOXG4iKTsgICAgYnJlYWs7CisJCQlTQU0oIi1FQUdBSU5cbiIpOworCQkJYnJlYWs7CiAJCX0KIAkJY2FzZSAtRUZCSUc6IHsKLQkJCVNBWSgiRUZCSUdcbiIpOyAgICAgYnJlYWs7CisJCQlTQU0oIi1FRkJJR1xuIik7CisJCQlicmVhazsKIAkJfQogCQljYXNlIC1FUElQRTogewotCQkJU0FZKCJFUElQRVxuIik7ICAgICBicmVhazsKKwkJCVNBTSgiLUVQSVBFXG4iKTsKKwkJCWJyZWFrOwogCQl9CiAJCWNhc2UgLUVNU0dTSVpFOiB7Ci0JCQlTQVkoIkVNU0dTSVpFXG4iKTsgIGJyZWFrOworCQkJU0FNKCItRU1TR1NJWkVcbiIpOworCQkJYnJlYWs7CiAJCX0KIAkJY2FzZSAtRU5PU1BDOiB7Ci0JCQlTQVkoIkVOT1NQQ1xuIik7ICBicmVhazsKKwkJCVNBTSgiLUVOT1NQQ1xuIik7CisJCQlicmVhazsKIAkJfQogCQlkZWZhdWx0OiB7Ci0JCQlTQVkoIjB4JTA4WFxuIiwgcmMpOyBicmVhazsKKwkJCVNBTSgidW5rbm93biBlcnJvcjogMHglMDhYXG4iLCByYyk7CisJCQlicmVhazsKIAkJfQogCQl9CiAJfQpAQCAtNTI5LDggKzU5MSw3IEBACiAvKgogICogIFRIRSBBVURJTyBVUkJTIEFSRSBTVUJNSVRURUQgQVQgVEhJUyBFQVJMWSBTVEFHRSBTTyBUSEFUIElUIElTIFBPU1NJQkxFIFRPCiAgKiAgU1RSRUFNIEZST00gL2Rldi9lYXN5c25kMSBXSVRIIFNJTVBMRSBQUk9HUkFNUyBTVUNIIEFTIGNhdCBXSElDSCBETyBOT1QKLSAqICBIQVZFIEFOIElPQ1RMIElOVEVSRkFDRS4gIFRIRSBWSURFTyBVUkJTLCBCWSBDT05UUkFTVCwgTVVTVCBCRSBTVUJNSVRURUQKLSAqICBNVUNIIExBVEVSOiBTRUUgQ09NTUVOVFMgSU4gRklMRSBlYXN5Y2FwX21haW4uYy4KKyAqICBIQVZFIEFOIElPQ1RMIElOVEVSRkFDRS4KICAqLwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogaW50CkBAIC01MzksOCArNjAwLDE1IEBACiBzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqcHVzYl9pbnRlcmZhY2U7CiBzdHJ1Y3QgZWFzeWNhcCAqcGVhc3ljYXA7CiBpbnQgc3VibWlub3IsIHJjOworLyp2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnYqLworI2lmIGRlZmluZWQoRUFTWUNBUF9JU19WSURFT0RFVl9DTElFTlQpCisjaWYgZGVmaW5lZChFQVNZQ0FQX05FRURTX1Y0TDJfREVWSUNFX0gpCitzdHJ1Y3QgdjRsMl9kZXZpY2UgKnB2NGwyX2RldmljZTsKKyNlbmRpZiAvKkVBU1lDQVBfTkVFRFNfVjRMMl9ERVZJQ0VfSCovCisjZW5kaWYgLypFQVNZQ0FQX0lTX1ZJREVPREVWX0NMSUVOVCovCisvKl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXiovCiAKLUpPVCg0LCAiYmVnaW5zLlxuIik7CitKT1QoNCwgImJlZ2luc1xuIik7CiAKIHN1Ym1pbm9yID0gaW1pbm9yKGlub2RlKTsKIApAQCAtNTU2LDcwICs2MjQsOTAgQEAKIAlTQVkoImVuZGluZyB1bnN1Y2Nlc3NmdWxseVxuIik7CiAJcmV0dXJuIC0xOwogfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmICghZGVmaW5lZChFQVNZQ0FQX0lTX1ZJREVPREVWX0NMSUVOVCkpCisjCisvKnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2diovCisjZWxzZQorI2lmIGRlZmluZWQoRUFTWUNBUF9ORUVEU19WNEwyX0RFVklDRV9IKQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqICBTT01FIFZFUlNJT05TIE9GIFRIRSB2aWRlb2RldiBNT0RVTEUgT1ZFUldSSVRFIFRIRSBEQVRBIFdISUNIIEhBUworICogIEJFRU4gV1JJVFRFTiBCWSBUSEUgQ0FMTCBUTyB1c2Jfc2V0X2ludGZkYXRhKCkgSU4gZWFzeWNhcF91c2JfcHJvYmUoKSwKKyAqICBSRVBMQUNJTkcgSVQgV0lUSCBBIFBPSU5URVIgVE8gVEhFIEVNQkVEREVEIHY0bDJfZGV2aWNlIFNUUlVDVFVSRS4KKyAqICBUTyBERVRFQ1QgVEhJUywgVEhFIFNUUklORyBJTiBUSEUgZWFzeWNhcC50ZWxsdGFsZVtdIEJVRkZFUiBJUyBDSEVDS0VELgorKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2lmIChtZW1jbXAoJnBlYXN5Y2FwLT50ZWxsdGFsZVswXSwgVEVMTFRBTEUsIHN0cmxlbihURUxMVEFMRSkpKSB7CisJcHY0bDJfZGV2aWNlID0gdXNiX2dldF9pbnRmZGF0YShwdXNiX2ludGVyZmFjZSk7CisJaWYgKChzdHJ1Y3QgdjRsMl9kZXZpY2UgKilOVUxMID09IHB2NGwyX2RldmljZSkgeworCQlTQVkoIkVSUk9SOiBwdjRsMl9kZXZpY2UgaXMgTlVMTFxuIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKwlwZWFzeWNhcCA9IChzdHJ1Y3QgZWFzeWNhcCAqKSBcCisJCWNvbnRhaW5lcl9vZihwdjRsMl9kZXZpY2UsIHN0cnVjdCBlYXN5Y2FwLCB2NGwyX2RldmljZSk7Cit9CisjZW5kaWYgLypFQVNZQ0FQX05FRURTX1Y0TDJfREVWSUNFX0gqLworIworI2VuZGlmIC8qRUFTWUNBUF9JU19WSURFT0RFVl9DTElFTlQqLworLypeXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl4qLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworaWYgKG1lbWNtcCgmcGVhc3ljYXAtPnRlbGx0YWxlWzBdLCBURUxMVEFMRSwgc3RybGVuKFRFTExUQUxFKSkpIHsKKwlTQVkoIkVSUk9SOiBiYWQgcGVhc3ljYXA6IDB4JTA4bFhcbiIsICh1bnNpZ25lZCBsb25nIGludCkgcGVhc3ljYXApOworCXJldHVybiAtRUZBVUxUOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCiBmaWxlLT5wcml2YXRlX2RhdGEgPSBwZWFzeWNhcDsKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyoKLSAqICBJTklUSUFMSVpBVElPTi4KKyAqICBJTklUSUFMSVpBVElPTgogICovCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1KT1QoNCwgInN0YXJ0aW5nIGluaXRpYWxpemF0aW9uXG4iKTsKK0pPTSg0LCAic3RhcnRpbmcgaW5pdGlhbGl6YXRpb25cbiIpOwogCiBpZiAoKHN0cnVjdCB1c2JfZGV2aWNlICopTlVMTCA9PSBwZWFzeWNhcC0+cHVzYl9kZXZpY2UpIHsKLQlTQVkoIkVSUk9SOiBwZWFzeWNhcC0+cHVzYl9kZXZpY2UgaXMgTlVMTFxuIik7Ci0JcmV0dXJuIC1FRkFVTFQ7Ci19IGVsc2UgewotCUpPVCgxNiwgIjB4JTA4bFg9cGVhc3ljYXAtPnB1c2JfZGV2aWNlXG4iLCBcCi0JCQkJCShsb25nIGludClwZWFzeWNhcC0+cHVzYl9kZXZpY2UpOworCVNBTSgiRVJST1I6IHBlYXN5Y2FwLT5wdXNiX2RldmljZSBpcyBOVUxMXG4iKTsKKwlyZXR1cm4gLUVOT0RFVjsKIH0KK0pPTSgxNiwgIjB4JTA4bFg9cGVhc3ljYXAtPnB1c2JfZGV2aWNlXG4iLCAobG9uZyBpbnQpcGVhc3ljYXAtPnB1c2JfZGV2aWNlKTsKIAogcmMgPSBhdWRpb19zZXR1cChwZWFzeWNhcCk7CiBpZiAoMCA8PSByYykKLQlKT1QoOCwgImF1ZGlvX3NldHVwKCkgcmV0dXJuZWQgJWlcbiIsIHJjKTsKKwlKT00oOCwgImF1ZGlvX3NldHVwKCkgcmV0dXJuZWQgJWlcbiIsIHJjKTsKIGVsc2UKLQlKT1QoOCwgImVhc3lzbmQgb3BlbigpOiBFUlJPUjogYXVkaW9fc2V0dXAoKSByZXR1cm5lZCAlaVxuIiwgcmMpOworCUpPTSg4LCAiZWFzeXNuZCBvcGVuKCk6IEVSUk9SOiBhdWRpb19zZXR1cCgpIHJldHVybmVkICVpXG4iLCByYyk7CiAKIGlmICgoc3RydWN0IHVzYl9kZXZpY2UgKilOVUxMID09IHBlYXN5Y2FwLT5wdXNiX2RldmljZSkgewotCVNBWSgiRVJST1I6IHBlYXN5Y2FwLT5wdXNiX2RldmljZSBoYXMgYmVjb21lIE5VTExcbiIpOwotCXJldHVybiAtRUZBVUxUOwotfQotcmMgPSBhZGp1c3Rfdm9sdW1lKHBlYXN5Y2FwLCAtODE5Mik7Ci1pZiAoMCAhPSByYykgewotCVNBWSgiRVJST1I6IGFkanVzdF92b2x1bWUoZGVmYXVsdCkgcmV0dXJuZWQgJWlcbiIsIHJjKTsKLQlyZXR1cm4gLUVGQVVMVDsKKwlTQU0oIkVSUk9SOiBwZWFzeWNhcC0+cHVzYl9kZXZpY2UgaGFzIGJlY29tZSBOVUxMXG4iKTsKKwlyZXR1cm4gLUVOT0RFVjsKIH0KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIGlmICgoc3RydWN0IHVzYl9kZXZpY2UgKilOVUxMID09IHBlYXN5Y2FwLT5wdXNiX2RldmljZSkgewotCVNBWSgiRVJST1I6IHBlYXN5Y2FwLT5wdXNiX2RldmljZSBoYXMgYmVjb21lIE5VTExcbiIpOwotCXJldHVybiAtRUZBVUxUOworCVNBTSgiRVJST1I6IHBlYXN5Y2FwLT5wdXNiX2RldmljZSBoYXMgYmVjb21lIE5VTExcbiIpOworCXJldHVybiAtRU5PREVWOwogfQogcmMgPSB1c2Jfc2V0X2ludGVyZmFjZShwZWFzeWNhcC0+cHVzYl9kZXZpY2UsIHBlYXN5Y2FwLT5hdWRpb19pbnRlcmZhY2UsIFwKIAkJCQkJcGVhc3ljYXAtPmF1ZGlvX2FsdHNldHRpbmdfb24pOwotSk9UKDgsICJ1c2Jfc2V0X2ludGVyZmFjZSguLCVpLCVpKSByZXR1cm5lZCAlaVxuIiwgcGVhc3ljYXAtPmF1ZGlvX2ludGVyZmFjZSwgXAorSk9NKDgsICJ1c2Jfc2V0X2ludGVyZmFjZSguLCVpLCVpKSByZXR1cm5lZCAlaVxuIiwgcGVhc3ljYXAtPmF1ZGlvX2ludGVyZmFjZSwgXAogCQkJCQlwZWFzeWNhcC0+YXVkaW9fYWx0c2V0dGluZ19vbiwgcmMpOwogCi1pZiAoKHN0cnVjdCB1c2JfZGV2aWNlICopTlVMTCA9PSBwZWFzeWNhcC0+cHVzYl9kZXZpY2UpIHsKLQlTQVkoIkVSUk9SOiBwZWFzeWNhcC0+cHVzYl9kZXZpY2UgaGFzIGJlY29tZSBOVUxMXG4iKTsKLQlyZXR1cm4gLUVGQVVMVDsKLX0KIHJjID0gd2FrZXVwX2RldmljZShwZWFzeWNhcC0+cHVzYl9kZXZpY2UpOwogaWYgKDAgPT0gcmMpCi0JSk9UKDgsICJ3YWtldXBfZGV2aWNlKCkgcmV0dXJuZWQgJWlcbiIsIHJjKTsKKwlKT00oOCwgIndha2V1cF9kZXZpY2UoKSByZXR1cm5lZCAlaVxuIiwgcmMpOwogZWxzZQotCUpPVCg4LCAiZWFzeXNuZCBvcGVuKCk6IEVSUk9SOiB3YWtldXBfZGV2aWNlKCkgcmV0dXJuZWQgJWlcbiIsIHJjKTsKKwlKT00oOCwgIkVSUk9SOiB3YWtldXBfZGV2aWNlKCkgcmV0dXJuZWQgJWlcbiIsIHJjKTsKIAotaWYgKChzdHJ1Y3QgdXNiX2RldmljZSAqKU5VTEwgPT0gcGVhc3ljYXAtPnB1c2JfZGV2aWNlKSB7Ci0JU0FZKCJFUlJPUjogcGVhc3ljYXAtPnB1c2JfZGV2aWNlIGhhcyBiZWNvbWUgTlVMTFxuIik7Ci0JcmV0dXJuIC1FRkFVTFQ7Ci19Ci1zdWJtaXRfYXVkaW9fdXJicyhwZWFzeWNhcCk7CitwZWFzeWNhcC0+YXVkaW9fZW9mID0gMDsKIHBlYXN5Y2FwLT5hdWRpb19pZGxlID0gMDsKIAogcGVhc3ljYXAtPnRpbWV2YWwxLnR2X3NlYyAgPSAwOwogcGVhc3ljYXAtPnRpbWV2YWwxLnR2X3VzZWMgPSAwOwogCi1KT1QoNCwgImZpbmlzaGVkIGluaXRpYWxpemF0aW9uXG4iKTsKK3N1Ym1pdF9hdWRpb191cmJzKHBlYXN5Y2FwKTsKKworSk9NKDQsICJmaW5pc2hlZCBpbml0aWFsaXphdGlvblxuIik7CiByZXR1cm4gMDsKIH0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTYzNSwxMSArNzIzLDE1IEBACiAJU0FZKCJFUlJPUjogIHBlYXN5Y2FwIGlzIE5VTEwuXG4iKTsKIAlyZXR1cm4gLUVGQVVMVDsKIH0KLWlmICgwICE9IGtpbGxfYXVkaW9fdXJicyhwZWFzeWNhcCkpIHsKLQlTQVkoIkVSUk9SOiBraWxsX2F1ZGlvX3VyYnMoKSBmYWlsZWRcbiIpOworaWYgKG1lbWNtcCgmcGVhc3ljYXAtPnRlbGx0YWxlWzBdLCBURUxMVEFMRSwgc3RybGVuKFRFTExUQUxFKSkpIHsKKwlTQVkoIkVSUk9SOiBiYWQgcGVhc3ljYXA6IDB4JTA4bFhcbiIsICh1bnNpZ25lZCBsb25nIGludCkgcGVhc3ljYXApOwogCXJldHVybiAtRUZBVUxUOwogfQotSk9UKDQsICJlbmRpbmcgc3VjY2Vzc2Z1bGx5XG4iKTsKK2lmICgwICE9IGtpbGxfYXVkaW9fdXJicyhwZWFzeWNhcCkpIHsKKwlTQU0oIkVSUk9SOiBraWxsX2F1ZGlvX3VyYnMoKSBmYWlsZWRcbiIpOworCXJldHVybiAtRUZBVUxUOworfQorSk9NKDQsICJlbmRpbmcgc3VjY2Vzc2Z1bGx5XG4iKTsKIHJldHVybiAwOwogfQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtNjQ4LDEyICs3NDAsMTEgQEAKIAkJCQkJCXNpemVfdCBrb3VudCwgbG9mZl90ICpwb2ZmKQogewogc3RydWN0IHRpbWV2YWwgdGltZXZhbDsKLXN0YXRpYyBzdHJ1Y3QgdGltZXZhbCB0aW1ldmFsMTsKLXN0YXRpYyBsb25nIGxvbmcgaW50IGF1ZGlvX2J5dGVzLCBhYm92ZSwgYmVsb3csIG1lYW47Citsb25nIGxvbmcgaW50IGFib3ZlLCBiZWxvdywgbWVhbjsKIHN0cnVjdCBzaWduZWRfZGl2X3Jlc3VsdCBzZHI7CiB1bnNpZ25lZCBjaGFyICpwMDsKIGxvbmcgaW50IGtvdW50MSwgbW9yZSwgcmMsIGwwLCBsbTsKLWludCBmcmFnbWVudDsKK2ludCBmcmFnbWVudCwga2Q7CiBzdHJ1Y3QgZWFzeWNhcCAqcGVhc3ljYXA7CiBzdHJ1Y3QgZGF0YV9idWZmZXIgKnBkYXRhX2J1ZmZlcjsKIHNpemVfdCBzenJldDsKQEAgLTY3MSwyMyArNzYyLDg5IEBACiAKIEpPVCg4LCAiPT09PT0gZWFzeXNuZF9yZWFkKCk6IGtvdW50PSVpLCAqcG9mZj0laVxuIiwgKGludClrb3VudCwgKGludCkoKnBvZmYpKTsKIAotcGVhc3ljYXAgPSAoc3RydWN0IGVhc3ljYXAgKikoZmlsZS0+cHJpdmF0ZV9kYXRhKTsKK2lmIChOVUxMID09IGZpbGUpIHsKKwlTQVkoIkVSUk9SOiAgZmlsZSBpcyBOVUxMXG4iKTsKKwlyZXR1cm4gLUVSRVNUQVJUU1lTOworfQorcGVhc3ljYXAgPSBmaWxlLT5wcml2YXRlX2RhdGE7CiBpZiAoTlVMTCA9PSBwZWFzeWNhcCkgewogCVNBWSgiRVJST1IgaW4gZWFzeXNuZF9yZWFkKCk6IHBlYXN5Y2FwIGlzIE5VTExcbiIpOwogCXJldHVybiAtRUZBVUxUOwogfQoraWYgKG1lbWNtcCgmcGVhc3ljYXAtPnRlbGx0YWxlWzBdLCBURUxMVEFMRSwgc3RybGVuKFRFTExUQUxFKSkpIHsKKwlTQVkoIkVSUk9SOiBiYWQgcGVhc3ljYXA6IDB4JTA4bFhcbiIsICh1bnNpZ25lZCBsb25nIGludCkgcGVhc3ljYXApOworCXJldHVybiAtRUZBVUxUOworfQoraWYgKE5VTEwgPT0gcGVhc3ljYXAtPnB1c2JfZGV2aWNlKSB7CisJU0FZKCJFUlJPUiBpbiBlYXN5c25kX3JlYWQoKTogcGVhc3ljYXAtPnB1c2JfZGV2aWNlIGlzIE5VTExcbiIpOworCXJldHVybiAtRUZBVUxUOworfQora2QgPSBpc2RvbmdsZShwZWFzeWNhcCk7CitpZiAoMCA8PSBrZCAmJiBET05HTEVfTUFOWSA+IGtkKSB7CisJaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmKGVhc3ljYXBfZG9uZ2xlW2tkXS5tdXRleF9hdWRpbykpKSB7CisJCVNBWSgiRVJST1I6IGNhbm5vdCBsb2NrIGVhc3ljYXBfZG9uZ2xlWyVpXS5tdXRleF9hdWRpb1xuIiwga2QpOworCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCX0KKwlKT00oNCwgImxvY2tlZCBlYXN5Y2FwX2RvbmdsZVslaV0ubXV0ZXhfYXVkaW9cbiIsIGtkKTsKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiAgTUVBTldISUxFLCBlYXN5Y2FwX3VzYl9kaXNjb25uZWN0KCkgTUFZIEhBVkUgRlJFRUQgUE9JTlRFUiBwZWFzeWNhcCwKKyAqICBJTiBXSElDSCBDQVNFIEEgUkVQRUFUIENBTEwgVE8gaXNkb25nbGUoKSBXSUxMIEZBSUwuCisgKiAgSUYgTkVDRVNTQVJZLCBCQUlMIE9VVC4KKyovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJaWYgKGtkICE9IGlzZG9uZ2xlKHBlYXN5Y2FwKSkKKwkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKwlpZiAoTlVMTCA9PSBmaWxlKSB7CisJCVNBWSgiRVJST1I6ICBmaWxlIGlzIE5VTExcbiIpOworCQltdXRleF91bmxvY2soJmVhc3ljYXBfZG9uZ2xlW2tkXS5tdXRleF9hdWRpbyk7CisJCXJldHVybiAtRVJFU1RBUlRTWVM7CisJfQorCXBlYXN5Y2FwID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCWlmIChOVUxMID09IHBlYXN5Y2FwKSB7CisJCVNBWSgiRVJST1I6ICBwZWFzeWNhcCBpcyBOVUxMXG4iKTsKKwkJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfYXVkaW8pOworCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCX0KKwlpZiAobWVtY21wKCZwZWFzeWNhcC0+dGVsbHRhbGVbMF0sIFRFTExUQUxFLCBzdHJsZW4oVEVMTFRBTEUpKSkgeworCQlTQVkoIkVSUk9SOiBiYWQgcGVhc3ljYXA6IDB4JTA4bFhcbiIsIFwKKwkJCQkJCSh1bnNpZ25lZCBsb25nIGludCkgcGVhc3ljYXApOworCQltdXRleF91bmxvY2soJmVhc3ljYXBfZG9uZ2xlW2tkXS5tdXRleF9hdWRpbyk7CisJCXJldHVybiAtRVJFU1RBUlRTWVM7CisJfQorCWlmIChOVUxMID09IHBlYXN5Y2FwLT5wdXNiX2RldmljZSkgeworCQlTQU0oIkVSUk9SOiBwZWFzeWNhcC0+cHVzYl9kZXZpY2UgaXMgTlVMTFxuIik7CisJCW11dGV4X3VubG9jaygmZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X2F1ZGlvKTsKKwkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKwl9Cit9IGVsc2UgeworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqICBJRiBlYXN5Y2FwX3VzYl9kaXNjb25uZWN0KCkgSEFTIEFMUkVBRFkgRlJFRUQgUE9JTlRFUiBwZWFzeWNhcCBCRUZPUkUgVEhFCisgKiAgQVRURU1QVCBUTyBBQ1FVSVJFIFRIRSBTRU1BUEhPUkUsIGlzZG9uZ2xlKCkgV0lMTCBIQVZFIEZBSUxFRC4gIEJBSUwgT1VULgorKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwlyZXR1cm4gLUVSRVNUQVJUU1lTOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKQorCUpPVCgxNiwgIk5PTkJMT0NLICBrb3VudD0laSwgKnBvZmY9JWlcbiIsIChpbnQpa291bnQsIChpbnQpKCpwb2ZmKSk7CitlbHNlCisJSk9UKDgsICJCTE9DS0lORyAga291bnQ9JWksICpwb2ZmPSVpXG4iLCAoaW50KWtvdW50LCAoaW50KSgqcG9mZikpOworCiBpZiAoKDAgPiBwZWFzeWNhcC0+YXVkaW9fcmVhZCkgfHwgXAogCQkocGVhc3ljYXAtPmF1ZGlvX2J1ZmZlcl9wYWdlX21hbnkgPD0gcGVhc3ljYXAtPmF1ZGlvX3JlYWQpKSB7Ci0JU0FZKCJFUlJPUjogcGVhc3ljYXAtPmF1ZGlvX3JlYWQgb3V0IG9mIHJhbmdlXG4iKTsKKwlTQU0oIkVSUk9SOiBwZWFzeWNhcC0+YXVkaW9fcmVhZCBvdXQgb2YgcmFuZ2VcbiIpOworCW11dGV4X3VubG9jaygmZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X2F1ZGlvKTsKIAlyZXR1cm4gLUVGQVVMVDsKIH0KIHBkYXRhX2J1ZmZlciA9ICZwZWFzeWNhcC0+YXVkaW9fYnVmZmVyW3BlYXN5Y2FwLT5hdWRpb19yZWFkXTsKIGlmICgoc3RydWN0IGRhdGFfYnVmZmVyICopTlVMTCA9PSBwZGF0YV9idWZmZXIpIHsKLQlTQVkoIkVSUk9SOiBwZGF0YV9idWZmZXIgaXMgTlVMTFxuIik7CisJU0FNKCJFUlJPUjogcGRhdGFfYnVmZmVyIGlzIE5VTExcbiIpOworCW11dGV4X3VubG9jaygmZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X2F1ZGlvKTsKIAlyZXR1cm4gLUVGQVVMVDsKIH0KLUpPVCgxMiwgImJlZm9yZSB3YWl0LCAlaT1mcmFnIHJlYWQgICVpPWZyYWcgZmlsbFxuIiwgXAorSk9NKDEyLCAiYmVmb3JlIHdhaXQsICVpPWZyYWcgcmVhZCAgJWk9ZnJhZyBmaWxsXG4iLCBcCiAJCShwZWFzeWNhcC0+YXVkaW9fcmVhZCAvIHBlYXN5Y2FwLT5hdWRpb19wYWdlc19wZXJfZnJhZ21lbnQpLCBcCiAJCShwZWFzeWNhcC0+YXVkaW9fZmlsbCAvIHBlYXN5Y2FwLT5hdWRpb19wYWdlc19wZXJfZnJhZ21lbnQpKTsKIGZyYWdtZW50ID0gKHBlYXN5Y2FwLT5hdWRpb19yZWFkIC8gcGVhc3ljYXAtPmF1ZGlvX3BhZ2VzX3Blcl9mcmFnbWVudCk7CkBAIC02OTUsNyArODUyLDggQEAKIAkJCQlwZWFzeWNhcC0+YXVkaW9fcGFnZXNfcGVyX2ZyYWdtZW50KSkgfHwgXAogCQkoMCA9PSAoUEFHRV9TSVpFIC0gKHBkYXRhX2J1ZmZlci0+cHRvIC0gcGRhdGFfYnVmZmVyLT5wZ28pKSkpIHsKIAlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHsKLQkJSk9UKDE2LCAicmV0dXJuaW5nIC1FQUdBSU4gYXMgaW5zdHJ1Y3RlZFxuIik7CisJCUpPTSgxNiwgInJldHVybmluZyAtRUFHQUlOIGFzIGluc3RydWN0ZWRcbiIpOworCQltdXRleF91bmxvY2soJmVhc3ljYXBfZG9uZ2xlW2tkXS5tdXRleF9hdWRpbyk7CiAJCXJldHVybiAtRUFHQUlOOwogCX0KIAlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShwZWFzeWNhcC0+d3FfYXVkaW8sIFwKQEAgLTcwNCw1MCArODYyLDU2IEBACiAJCQkJcGVhc3ljYXAtPmF1ZGlvX3BhZ2VzX3Blcl9mcmFnbWVudCkpICYmIFwKIAkJKDAgPCAoUEFHRV9TSVpFIC0gKHBkYXRhX2J1ZmZlci0+cHRvIC0gcGRhdGFfYnVmZmVyLT5wZ28pKSkpKSk7CiAJaWYgKDAgIT0gcmMpIHsKLQkJU0FZKCJhYm9ydGVkIGJ5IHNpZ25hbFxuIik7CisJCVNBTSgiYWJvcnRlZCBieSBzaWduYWxcbiIpOworCQltdXRleF91bmxvY2soJmVhc3ljYXBfZG9uZ2xlW2tkXS5tdXRleF9hdWRpbyk7CiAJCXJldHVybiAtRVJFU1RBUlRTWVM7CiAJfQogCWlmIChwZWFzeWNhcC0+YXVkaW9fZW9mKSB7Ci0JCUpPVCg4LCAicmV0dXJuaW5nIDAgYmVjYXVzZSAgJWk9YXVkaW9fZW9mXG4iLCBcCisJCUpPTSg4LCAicmV0dXJuaW5nIDAgYmVjYXVzZSAgJWk9YXVkaW9fZW9mXG4iLCBcCiAJCQkJCQkJcGVhc3ljYXAtPmF1ZGlvX2VvZik7CiAJCWtpbGxfYXVkaW9fdXJicyhwZWFzeWNhcCk7Ci0JCW1zbGVlcCg1MDApOworCQltdXRleF91bmxvY2soJmVhc3ljYXBfZG9uZ2xlW2tkXS5tdXRleF9hdWRpbyk7CiAJCXJldHVybiAwOwogCX0KIAlpZiAocGVhc3ljYXAtPmF1ZGlvX2lkbGUpIHsKLQkJSk9UKDE2LCAicmV0dXJuaW5nIDAgYmVjYXVzZSAgJWk9YXVkaW9faWRsZVxuIiwgXAorCQlKT00oMTYsICJyZXR1cm5pbmcgMCBiZWNhdXNlICAlaT1hdWRpb19pZGxlXG4iLCBcCiAJCQkJCQkJcGVhc3ljYXAtPmF1ZGlvX2lkbGUpOworCQltdXRleF91bmxvY2soJmVhc3ljYXBfZG9uZ2xlW2tkXS5tdXRleF9hdWRpbyk7CiAJCXJldHVybiAwOwogCX0KIAlpZiAoIXBlYXN5Y2FwLT5hdWRpb19pc29jX3N0cmVhbWluZykgewotCQlKT1QoMTYsICJyZXR1cm5pbmcgMCBiZWNhdXNlIGF1ZGlvIHVyYnMgbm90IHN0cmVhbWluZ1xuIik7CisJCUpPTSgxNiwgInJldHVybmluZyAwIGJlY2F1c2UgYXVkaW8gdXJicyBub3Qgc3RyZWFtaW5nXG4iKTsKKwkJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfYXVkaW8pOwogCQlyZXR1cm4gMDsKIAl9CiB9Ci1KT1QoMTIsICJhZnRlciAgd2FpdCwgJWk9ZnJhZyByZWFkICAlaT1mcmFnIGZpbGxcbiIsIFwKK0pPTSgxMiwgImFmdGVyICB3YWl0LCAlaT1mcmFnIHJlYWQgICVpPWZyYWcgZmlsbFxuIiwgXAogCQkocGVhc3ljYXAtPmF1ZGlvX3JlYWQgLyBwZWFzeWNhcC0+YXVkaW9fcGFnZXNfcGVyX2ZyYWdtZW50KSwgXAogCQkocGVhc3ljYXAtPmF1ZGlvX2ZpbGwgLyBwZWFzeWNhcC0+YXVkaW9fcGFnZXNfcGVyX2ZyYWdtZW50KSk7CiBzenJldCA9IChzaXplX3QpMDsKIHdoaWxlIChmcmFnbWVudCA9PSAocGVhc3ljYXAtPmF1ZGlvX3JlYWQgLyBcCiAJCQkJcGVhc3ljYXAtPmF1ZGlvX3BhZ2VzX3Blcl9mcmFnbWVudCkpIHsKIAlpZiAoTlVMTCA9PSBwZGF0YV9idWZmZXItPnBnbykgewotCQlTQVkoIkVSUk9SOiBwZGF0YV9idWZmZXItPnBnbyBpcyBOVUxMXG4iKTsKKwkJU0FNKCJFUlJPUjogcGRhdGFfYnVmZmVyLT5wZ28gaXMgTlVMTFxuIik7CisJCW11dGV4X3VubG9jaygmZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X2F1ZGlvKTsKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJfQogCWlmIChOVUxMID09IHBkYXRhX2J1ZmZlci0+cHRvKSB7Ci0JCVNBWSgiRVJST1I6IHBkYXRhX2J1ZmZlci0+cHRvIGlzIE5VTExcbiIpOworCQlTQU0oIkVSUk9SOiBwZGF0YV9idWZmZXItPnB0byBpcyBOVUxMXG4iKTsKKwkJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfYXVkaW8pOwogCQlyZXR1cm4gLUVGQVVMVDsKIAl9CiAJa291bnQxID0gUEFHRV9TSVpFIC0gKHBkYXRhX2J1ZmZlci0+cHRvIC0gcGRhdGFfYnVmZmVyLT5wZ28pOwogCWlmICgwID4ga291bnQxKSB7Ci0JCVNBWSgiZWFzeXNuZF9yZWFkOiBNSVNUQUtFOiBrb3VudDEgaXMgbmVnYXRpdmVcbiIpOworCQlTQU0oImVhc3lzbmRfcmVhZDogTUlTVEFLRToga291bnQxIGlzIG5lZ2F0aXZlXG4iKTsKKwkJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfYXVkaW8pOwogCQlyZXR1cm4gLUVSRVNUQVJUU1lTOwogCX0KIAlpZiAoIWtvdW50MSkgewogCQkocGVhc3ljYXAtPmF1ZGlvX3JlYWQpKys7CiAJCWlmIChwZWFzeWNhcC0+YXVkaW9fYnVmZmVyX3BhZ2VfbWFueSA8PSBwZWFzeWNhcC0+YXVkaW9fcmVhZCkKIAkJCXBlYXN5Y2FwLT5hdWRpb19yZWFkID0gMDsKLQkJSk9UKDEyLCAiYnVtcGVkIHBlYXN5Y2FwLT5hdWRpb19yZWFkIHRvICVpXG4iLCBcCisJCUpPTSgxMiwgImJ1bXBlZCBwZWFzeWNhcC0+YXVkaW9fcmVhZCB0byAlaVxuIiwgXAogCQkJCQkJcGVhc3ljYXAtPmF1ZGlvX3JlYWQpOwogCiAJCWlmIChmcmFnbWVudCAhPSAocGVhc3ljYXAtPmF1ZGlvX3JlYWQgLyBcCkBAIC03NTcsMzAgKzkyMSwzNCBAQAogCQlpZiAoKDAgPiBwZWFzeWNhcC0+YXVkaW9fcmVhZCkgfHwgXAogCQkJKHBlYXN5Y2FwLT5hdWRpb19idWZmZXJfcGFnZV9tYW55IDw9IFwKIAkJCQkJcGVhc3ljYXAtPmF1ZGlvX3JlYWQpKSB7Ci0JCQlTQVkoIkVSUk9SOiBwZWFzeWNhcC0+YXVkaW9fcmVhZCBvdXQgb2YgcmFuZ2VcbiIpOworCQkJU0FNKCJFUlJPUjogcGVhc3ljYXAtPmF1ZGlvX3JlYWQgb3V0IG9mIHJhbmdlXG4iKTsKKwkJCW11dGV4X3VubG9jaygmZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X2F1ZGlvKTsKIAkJCXJldHVybiAtRUZBVUxUOwogCQl9CiAJCXBkYXRhX2J1ZmZlciA9ICZwZWFzeWNhcC0+YXVkaW9fYnVmZmVyW3BlYXN5Y2FwLT5hdWRpb19yZWFkXTsKIAkJaWYgKChzdHJ1Y3QgZGF0YV9idWZmZXIgKilOVUxMID09IHBkYXRhX2J1ZmZlcikgewotCQkJU0FZKCJFUlJPUjogcGRhdGFfYnVmZmVyIGlzIE5VTExcbiIpOworCQkJU0FNKCJFUlJPUjogcGRhdGFfYnVmZmVyIGlzIE5VTExcbiIpOworCQkJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfYXVkaW8pOwogCQkJcmV0dXJuIC1FRkFVTFQ7CiAJCX0KIAkJaWYgKE5VTEwgPT0gcGRhdGFfYnVmZmVyLT5wZ28pIHsKLQkJCVNBWSgiRVJST1I6IHBkYXRhX2J1ZmZlci0+cGdvIGlzIE5VTExcbiIpOworCQkJU0FNKCJFUlJPUjogcGRhdGFfYnVmZmVyLT5wZ28gaXMgTlVMTFxuIik7CisJCQltdXRleF91bmxvY2soJmVhc3ljYXBfZG9uZ2xlW2tkXS5tdXRleF9hdWRpbyk7CiAJCQlyZXR1cm4gLUVGQVVMVDsKIAkJfQogCQlpZiAoTlVMTCA9PSBwZGF0YV9idWZmZXItPnB0bykgewotCQkJU0FZKCJFUlJPUjogcGRhdGFfYnVmZmVyLT5wdG8gaXMgTlVMTFxuIik7CisJCQlTQU0oIkVSUk9SOiBwZGF0YV9idWZmZXItPnB0byBpcyBOVUxMXG4iKTsKKwkJCW11dGV4X3VubG9jaygmZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X2F1ZGlvKTsKIAkJCXJldHVybiAtRUZBVUxUOwogCQl9CiAJCWtvdW50MSA9IFBBR0VfU0laRSAtIChwZGF0YV9idWZmZXItPnB0byAtIHBkYXRhX2J1ZmZlci0+cGdvKTsKIAl9Ci0JSk9UKDEyLCAicmVhZHkgIHRvIHNlbmQgJWxpIGJ5dGVzXG4iLCAobG9uZyBpbnQpIGtvdW50MSk7Ci0JSk9UKDEyLCAic3RpbGwgIHRvIHNlbmQgJWxpIGJ5dGVzXG4iLCAobG9uZyBpbnQpIGtvdW50KTsKKwlKT00oMTIsICJyZWFkeSAgdG8gc2VuZCAlbGkgYnl0ZXNcbiIsIChsb25nIGludCkga291bnQxKTsKKwlKT00oMTIsICJzdGlsbCAgdG8gc2VuZCAlbGkgYnl0ZXNcbiIsIChsb25nIGludCkga291bnQpOwogCW1vcmUgPSBrb3VudDE7CiAJaWYgKG1vcmUgPiBrb3VudCkKIAkJbW9yZSA9IGtvdW50OwotCUpPVCgxMiwgImFncmVlZCB0byBzZW5kICVsaSBieXRlcyBmcm9tIHBhZ2UgJWlcbiIsIFwKKwlKT00oMTIsICJhZ3JlZWQgdG8gc2VuZCAlbGkgYnl0ZXMgZnJvbSBwYWdlICVpXG4iLCBcCiAJCQkJCQltb3JlLCBwZWFzeWNhcC0+YXVkaW9fcmVhZCk7CiAJaWYgKCFtb3JlKQogCQlicmVhazsKQEAgLTc5OCw3ICs5NjYsOCBAQAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCXJjID0gY29weV90b191c2VyKHB1c2Vyc3BhY2VidWZmZXIsIHBkYXRhX2J1ZmZlci0+cHRvLCBtb3JlKTsKIAlpZiAoMCAhPSByYykgewotCQlTQVkoIkVSUk9SOiBjb3B5X3RvX3VzZXIoKSByZXR1cm5lZCAlbGlcbiIsIHJjKTsKKwkJU0FNKCJFUlJPUjogY29weV90b191c2VyKCkgcmV0dXJuZWQgJWxpXG4iLCByYyk7CisJCW11dGV4X3VubG9jaygmZWFzeWNhcF9kb25nbGVba2RdLm11dGV4X2F1ZGlvKTsKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJfQogCSpwb2ZmICs9IChsb2ZmX3QpbW9yZTsKQEAgLTgwNywxMSArOTc2LDExIEBACiAJcHVzZXJzcGFjZWJ1ZmZlciArPSBtb3JlOwogCWtvdW50IC09IChzaXplX3QpbW9yZTsKIH0KLUpPVCgxMiwgImFmdGVyICByZWFkLCAlaT1mcmFnIHJlYWQgICVpPWZyYWcgZmlsbFxuIiwgXAorSk9NKDEyLCAiYWZ0ZXIgIHJlYWQsICVpPWZyYWcgcmVhZCAgJWk9ZnJhZyBmaWxsXG4iLCBcCiAJCShwZWFzeWNhcC0+YXVkaW9fcmVhZCAvIHBlYXN5Y2FwLT5hdWRpb19wYWdlc19wZXJfZnJhZ21lbnQpLCBcCiAJCShwZWFzeWNhcC0+YXVkaW9fZmlsbCAvIHBlYXN5Y2FwLT5hdWRpb19wYWdlc19wZXJfZnJhZ21lbnQpKTsKIGlmIChrb3VudCA8IDApIHsKLQlTQVkoIk1JU1RBS0U6ICAlbGk9a291bnQgICVsaT1zenJldFxuIiwgXAorCVNBTSgiTUlTVEFLRTogICVsaT1rb3VudCAgJWxpPXN6cmV0XG4iLCBcCiAJCQkJCShsb25nIGludClrb3VudCwgKGxvbmcgaW50KXN6cmV0KTsKIH0KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KQEAgLTgyNywxMSArOTk2LDExIEBACiAJbWVhbiA9IHBlYXN5Y2FwLT5hdWRpb19uaXZlYXU7CiAJc2RyID0gc2lnbmVkX2RpdihtZWFuLCBwZWFzeWNhcC0+YXVkaW9fc2FtcGxlKTsKIAotCUpPVCg4LCAiJThsbGk9bWVhbiAgJThsbGk9bWVhbnNxdWFyZSBhZnRlciAlbGxpIHNhbXBsZXMsID0+XG4iLCBcCisJSk9NKDgsICIlOGxsaT1tZWFuICAlOGxsaT1tZWFuc3F1YXJlIGFmdGVyICVsbGkgc2FtcGxlcywgPT5cbiIsIFwKIAkJCQlzZHIucXVvdGllbnQsIGFib3ZlLCBwZWFzeWNhcC0+YXVkaW9fc2FtcGxlKTsKIAogCXNkciA9IHNpZ25lZF9kaXYoYWJvdmUsIDMyNzY4KTsKLQlKT1QoOCwgImF1ZGlvIGR5bmFtaWMgcmFuZ2UgaXMgcm91Z2hseSAlbGxpXG4iLCBzZHIucXVvdGllbnQpOworCUpPTSg4LCAiYXVkaW8gZHluYW1pYyByYW5nZSBpcyByb3VnaGx5ICVsbGlcbiIsIHNkci5xdW90aWVudCk7CiB9CiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKgpAQCAtODQwLDMzICsxMDA5LDI4IEBACiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiBkb19nZXR0aW1lb2ZkYXkoJnRpbWV2YWwpOwogaWYgKCFwZWFzeWNhcC0+dGltZXZhbDEudHZfc2VjKSB7Ci0JYXVkaW9fYnl0ZXMgPSAwOwotCXRpbWV2YWwxID0gdGltZXZhbDsKLQotCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJihwZWFzeWNhcC0+bXV0ZXhfdGltZXZhbDEpKSkKLQkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKLQlwZWFzeWNhcC0+dGltZXZhbDEgPSB0aW1ldmFsMTsKLQltdXRleF91bmxvY2soJihwZWFzeWNhcC0+bXV0ZXhfdGltZXZhbDEpKTsKKwlwZWFzeWNhcC0+YXVkaW9fYnl0ZXMgPSAwOworCXBlYXN5Y2FwLT50aW1ldmFsMyA9IHRpbWV2YWw7CisJcGVhc3ljYXAtPnRpbWV2YWwxID0gcGVhc3ljYXAtPnRpbWV2YWwzOwogCXNkci5xdW90aWVudCA9IDE5MjAwMDsKIH0gZWxzZSB7Ci0JYXVkaW9fYnl0ZXMgKz0gKGxvbmcgbG9uZyBpbnQpIHN6cmV0OworCXBlYXN5Y2FwLT5hdWRpb19ieXRlcyArPSAobG9uZyBsb25nIGludCkgc3pyZXQ7CiAJYmVsb3cgPSAoKGxvbmcgbG9uZyBpbnQpKDEwMDAwMDApKSAqIFwKLQkJKChsb25nIGxvbmcgaW50KSh0aW1ldmFsLnR2X3NlYyAgLSB0aW1ldmFsMS50dl9zZWMpKSArIFwKLQkJKGxvbmcgbG9uZyBpbnQpKHRpbWV2YWwudHZfdXNlYyAtIHRpbWV2YWwxLnR2X3VzZWMpOwotCWFib3ZlID0gMTAwMDAwMCAqICgobG9uZyBsb25nIGludCkgYXVkaW9fYnl0ZXMpOworCQkoKGxvbmcgbG9uZyBpbnQpKHRpbWV2YWwudHZfc2VjICAtIFwKKwkJCQkJCXBlYXN5Y2FwLT50aW1ldmFsMy50dl9zZWMpKSArIFwKKwkJKGxvbmcgbG9uZyBpbnQpKHRpbWV2YWwudHZfdXNlYyAtIHBlYXN5Y2FwLT50aW1ldmFsMy50dl91c2VjKTsKKwlhYm92ZSA9IDEwMDAwMDAgKiAoKGxvbmcgbG9uZyBpbnQpIHBlYXN5Y2FwLT5hdWRpb19ieXRlcyk7CiAKIAlpZiAoYmVsb3cpCiAJCXNkciA9IHNpZ25lZF9kaXYoYWJvdmUsIGJlbG93KTsKIAllbHNlCiAJCXNkci5xdW90aWVudCA9IDE5MjAwMDsKIH0KLUpPVCg4LCAiYXVkaW8gc3RyZWFtaW5nIGF0ICVsbGkgYnl0ZXMvc2Vjb25kXG4iLCBzZHIucXVvdGllbnQpOwotaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmKHBlYXN5Y2FwLT5tdXRleF90aW1ldmFsMSkpKQotCXJldHVybiAtRVJFU1RBUlRTWVM7CitKT00oOCwgImF1ZGlvIHN0cmVhbWluZyBhdCAlbGxpIGJ5dGVzL3NlY29uZFxuIiwgc2RyLnF1b3RpZW50KTsKIHBlYXN5Y2FwLT5kbmJ5ZHQgPSBzZHIucXVvdGllbnQ7Ci1tdXRleF91bmxvY2soJihwZWFzeWNhcC0+bXV0ZXhfdGltZXZhbDEpKTsKIAotSk9UKDgsICJyZXR1cm5pbmcgJWxpXG4iLCAobG9uZyBpbnQpc3pyZXQpOworSk9NKDgsICJyZXR1cm5pbmcgJWxpXG4iLCAobG9uZyBpbnQpc3pyZXQpOworbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwX2RvbmdsZVtrZF0ubXV0ZXhfYXVkaW8pOwogcmV0dXJuIHN6cmV0OwogfQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtODgxLDI3ICsxMDQ1LDMxIEBACiBzdHJ1Y3QgZGF0YV91cmIgKnBkYXRhX3VyYjsKIHN0cnVjdCB1cmIgKnB1cmI7CiBzdHJ1Y3QgbGlzdF9oZWFkICpwbGlzdF9oZWFkOwotaW50IGosIGlzYmFkLCBtLCByYzsKK2ludCBqLCBpc2JhZCwgbm9zcGMsIG0sIHJjOwogaW50IGlzYnVmOwogCitpZiAoTlVMTCA9PSBwZWFzeWNhcCkgeworCVNBWSgiRVJST1I6IHBlYXN5Y2FwIGlzIE5VTExcbiIpOworCXJldHVybiAtRUZBVUxUOworfQogaWYgKChzdHJ1Y3QgbGlzdF9oZWFkICopTlVMTCA9PSBwZWFzeWNhcC0+cHVyYl9hdWRpb19oZWFkKSB7Ci0JU0FZKCJFUlJPUjogcGVhc3ljYXAtPnVyYl9hdWRpb19oZWFkIHVuaW5pdGlhbGl6ZWRcbiIpOworCVNBTSgiRVJST1I6IHBlYXN5Y2FwLT51cmJfYXVkaW9faGVhZCB1bmluaXRpYWxpemVkXG4iKTsKIAlyZXR1cm4gLUVGQVVMVDsKIH0KIGlmICgoc3RydWN0IHVzYl9kZXZpY2UgKilOVUxMID09IHBlYXN5Y2FwLT5wdXNiX2RldmljZSkgewotCVNBWSgiRVJST1I6IHBlYXN5Y2FwLT5wdXNiX2RldmljZSBpcyBOVUxMXG4iKTsKKwlTQU0oIkVSUk9SOiBwZWFzeWNhcC0+cHVzYl9kZXZpY2UgaXMgTlVMTFxuIik7CiAJcmV0dXJuIC1FRkFVTFQ7CiB9CiBpZiAoIXBlYXN5Y2FwLT5hdWRpb19pc29jX3N0cmVhbWluZykgewotCUpPVCg0LCAiaW5pdGlhbCBzdWJtaXNzaW9uIG9mIGFsbCBhdWRpbyB1cmJzXG4iKTsKKwlKT00oNCwgImluaXRpYWwgc3VibWlzc2lvbiBvZiBhbGwgYXVkaW8gdXJic1xuIik7CiAJcmMgPSB1c2Jfc2V0X2ludGVyZmFjZShwZWFzeWNhcC0+cHVzYl9kZXZpY2UsCiAJCQkJCXBlYXN5Y2FwLT5hdWRpb19pbnRlcmZhY2UsIFwKIAkJCQkJcGVhc3ljYXAtPmF1ZGlvX2FsdHNldHRpbmdfb24pOwotCUpPVCg4LCAidXNiX3NldF9pbnRlcmZhY2UoLiwlaSwlaSkgcmV0dXJuZWQgJWlcbiIsIFwKKwlKT00oOCwgInVzYl9zZXRfaW50ZXJmYWNlKC4sJWksJWkpIHJldHVybmVkICVpXG4iLCBcCiAJCQkJCXBlYXN5Y2FwLT5hdWRpb19pbnRlcmZhY2UsIFwKIAkJCQkJcGVhc3ljYXAtPmF1ZGlvX2FsdHNldHRpbmdfb24sIHJjKTsKIAotCWlzYmFkID0gMDsgIG0gPSAwOworCWlzYmFkID0gMDsgIG5vc3BjID0gMDsgIG0gPSAwOwogCWxpc3RfZm9yX2VhY2gocGxpc3RfaGVhZCwgKHBlYXN5Y2FwLT5wdXJiX2F1ZGlvX2hlYWQpKSB7CiAJCXBkYXRhX3VyYiA9IGxpc3RfZW50cnkocGxpc3RfaGVhZCwgc3RydWN0IGRhdGFfdXJiLCBsaXN0X2hlYWQpOwogCQlpZiAoTlVMTCAhPSBwZGF0YV91cmIpIHsKQEAgLTkzOCwzOSArMTEwNiw0OSBAQAogCQkJCXJjID0gdXNiX3N1Ym1pdF91cmIocHVyYiwgR0ZQX0tFUk5FTCk7CiAJCQkJaWYgKDAgIT0gcmMpIHsKIAkJCQkJaXNiYWQrKzsKLQkJCQkJU0FZKCJFUlJPUjogdXNiX3N1Ym1pdF91cmIoKSBmYWlsZWQiIFwKKwkJCQkJU0FNKCJFUlJPUjogdXNiX3N1Ym1pdF91cmIoKSBmYWlsZWQiIFwKIAkJCQkJCQkiIGZvciB1cmIgd2l0aCByYzpcbiIpOwogCQkJCQlzd2l0Y2ggKHJjKSB7CiAJCQkJCWNhc2UgLUVOT01FTTogewotCQkJCQkJU0FZKCJFTk9NRU1cbiIpOyBicmVhazsKKwkJCQkJCVNBTSgiLUVOT01FTVxuIik7CisJCQkJCQlicmVhazsKIAkJCQkJfQogCQkJCQljYXNlIC1FTk9ERVY6IHsKLQkJCQkJCVNBWSgiRU5PREVWXG4iKTsgYnJlYWs7CisJCQkJCQlTQU0oIi1FTk9ERVZcbiIpOworCQkJCQkJYnJlYWs7CiAJCQkJCX0KIAkJCQkJY2FzZSAtRU5YSU86IHsKLQkJCQkJCVNBWSgiRU5YSU9cbiIpOyBicmVhazsKKwkJCQkJCVNBTSgiLUVOWElPXG4iKTsKKwkJCQkJCWJyZWFrOwogCQkJCQl9CiAJCQkJCWNhc2UgLUVJTlZBTDogewotCQkJCQkJU0FZKCJFSU5WQUxcbiIpOyBicmVhazsKKwkJCQkJCVNBTSgiLUVJTlZBTFxuIik7CisJCQkJCQlicmVhazsKIAkJCQkJfQogCQkJCQljYXNlIC1FQUdBSU46IHsKLQkJCQkJCVNBWSgiRUFHQUlOXG4iKTsgYnJlYWs7CisJCQkJCQlTQU0oIi1FQUdBSU5cbiIpOworCQkJCQkJYnJlYWs7CiAJCQkJCX0KIAkJCQkJY2FzZSAtRUZCSUc6IHsKLQkJCQkJCVNBWSgiRUZCSUdcbiIpOyBicmVhazsKKwkJCQkJCVNBTSgiLUVGQklHXG4iKTsKKwkJCQkJCWJyZWFrOwogCQkJCQl9CiAJCQkJCWNhc2UgLUVQSVBFOiB7Ci0JCQkJCQlTQVkoIkVQSVBFXG4iKTsgYnJlYWs7CisJCQkJCQlTQU0oIi1FUElQRVxuIik7CisJCQkJCQlicmVhazsKIAkJCQkJfQogCQkJCQljYXNlIC1FTVNHU0laRTogewotCQkJCQkJU0FZKCJFTVNHU0laRVxuIik7IGJyZWFrOworCQkJCQkJU0FNKCItRU1TR1NJWkVcbiIpOworCQkJCQkJYnJlYWs7CiAJCQkJCX0KIAkJCQkJY2FzZSAtRU5PU1BDOiB7Ci0JCQkJCQlTQVkoIkVOT1NQQ1xuIik7IGJyZWFrOworCQkJCQkJbm9zcGMrKzsKKwkJCQkJCWJyZWFrOwogCQkJCQl9CiAJCQkJCWRlZmF1bHQ6IHsKLQkJCQkJCVNBWSgidW5rbm93biBlcnJvciBjb2RlICVpXG4iLFwKLQkJCQkJCQkJIHJjKTsgYnJlYWs7CisJCQkJCQlTQU0oInVua25vd24gZXJyb3IgY29kZSAlaVxuIixcCisJCQkJCQkJCSByYyk7CisJCQkJCQlicmVhazsKIAkJCQkJfQogCQkJCQl9CiAJCQkJfSBlbHNlIHsKQEAgLTk4Myw4ICsxMTYxLDEzIEBACiAJCQlpc2JhZCsrOwogCQl9CiAJfQorCWlmIChub3NwYykgeworCQlTQU0oIi1FTk9TUEM9dXNiX3N1Ym1pdF91cmIoKSBmb3IgJWkgdXJic1xuIiwgbm9zcGMpOworCQlTQU0oIi4uLi4uICBwb3NzaWJseSBpbmFkZXF1YXRlIFVTQiBiYW5kd2lkdGhcbiIpOworCQlwZWFzeWNhcC0+YXVkaW9fZW9mID0gMTsKKwl9CiAJaWYgKGlzYmFkKSB7Ci0JCUpPVCg0LCAiYXR0ZW1wdGluZyBjbGVhbnVwIGluc3RlYWQgb2Ygc3VibWl0dGluZ1xuIik7CisJCUpPTSg0LCAiYXR0ZW1wdGluZyBjbGVhbnVwIGluc3RlYWQgb2Ygc3VibWl0dGluZ1xuIik7CiAJCWxpc3RfZm9yX2VhY2gocGxpc3RfaGVhZCwgKHBlYXN5Y2FwLT5wdXJiX2F1ZGlvX2hlYWQpKSB7CiAJCQlwZGF0YV91cmIgPSBsaXN0X2VudHJ5KHBsaXN0X2hlYWQsIHN0cnVjdCBkYXRhX3VyYiwgXAogCQkJCQkJCQlsaXN0X2hlYWQpOwpAQCAtOTk3LDEwICsxMTgwLDEwIEBACiAJCXBlYXN5Y2FwLT5hdWRpb19pc29jX3N0cmVhbWluZyA9IDA7CiAJfSBlbHNlIHsKIAkJcGVhc3ljYXAtPmF1ZGlvX2lzb2Nfc3RyZWFtaW5nID0gMTsKLQkJSk9UKDQsICJzdWJtaXR0ZWQgJWkgYXVkaW8gdXJic1xuIiwgbSk7CisJCUpPTSg0LCAic3VibWl0dGVkICVpIGF1ZGlvIHVyYnNcbiIsIG0pOwogCX0KIH0gZWxzZQotCUpPVCg0LCAiYWxyZWFkeSBzdHJlYW1pbmcgYXVkaW8gdXJic1xuIik7CisJSk9NKDQsICJhbHJlYWR5IHN0cmVhbWluZyBhdWRpbyB1cmJzXG4iKTsKIAogcmV0dXJuIDA7CiB9CkBAIC0xMDE3LDEwICsxMjAwLDE0IEBACiBzdHJ1Y3QgbGlzdF9oZWFkICpwbGlzdF9oZWFkOwogc3RydWN0IGRhdGFfdXJiICpwZGF0YV91cmI7CiAKK2lmIChOVUxMID09IHBlYXN5Y2FwKSB7CisJU0FZKCJFUlJPUjogcGVhc3ljYXAgaXMgTlVMTFxuIik7CisJcmV0dXJuIC1FRkFVTFQ7Cit9CiBpZiAocGVhc3ljYXAtPmF1ZGlvX2lzb2Nfc3RyZWFtaW5nKSB7CiAJaWYgKChzdHJ1Y3QgbGlzdF9oZWFkICopTlVMTCAhPSBwZWFzeWNhcC0+cHVyYl9hdWRpb19oZWFkKSB7CiAJCXBlYXN5Y2FwLT5hdWRpb19pc29jX3N0cmVhbWluZyA9IDA7Ci0JCUpPVCg0LCAia2lsbGluZyBhdWRpbyB1cmJzXG4iKTsKKwkJSk9NKDQsICJraWxsaW5nIGF1ZGlvIHVyYnNcbiIpOwogCQltID0gMDsKIAkJbGlzdF9mb3JfZWFjaChwbGlzdF9oZWFkLCAocGVhc3ljYXAtPnB1cmJfYXVkaW9faGVhZCkpIHsKIAkJCXBkYXRhX3VyYiA9IGxpc3RfZW50cnkocGxpc3RfaGVhZCwgc3RydWN0IGRhdGFfdXJiLApAQCAtMTAzMiwxMyArMTIxOSwxMyBAQAogCQkJCX0KIAkJCX0KIAkJfQotCQlKT1QoNCwgIiVpIGF1ZGlvIHVyYnMga2lsbGVkXG4iLCBtKTsKKwkJSk9NKDQsICIlaSBhdWRpbyB1cmJzIGtpbGxlZFxuIiwgbSk7CiAJfSBlbHNlIHsKLQkJU0FZKCJFUlJPUjogcGVhc3ljYXAtPnB1cmJfYXVkaW9faGVhZCBpcyBOVUxMXG4iKTsKKwkJU0FNKCJFUlJPUjogcGVhc3ljYXAtPnB1cmJfYXVkaW9faGVhZCBpcyBOVUxMXG4iKTsKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJfQogfSBlbHNlIHsKLQlKT1QoOCwgIiVpPWF1ZGlvX2lzb2Nfc3RyZWFtaW5nLCBubyBhdWRpbyB1cmJzIGtpbGxlZFxuIiwgXAorCUpPTSg4LCAiJWk9YXVkaW9faXNvY19zdHJlYW1pbmcsIG5vIGF1ZGlvIHVyYnMga2lsbGVkXG4iLCBcCiAJCQkJCXBlYXN5Y2FwLT5hdWRpb19pc29jX3N0cmVhbWluZyk7CiB9CiByZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lYXN5Y2FwL2Vhc3ljYXBfdGVzdGNhcmQuYyBiL2RyaXZlcnMvc3RhZ2luZy9lYXN5Y2FwL2Vhc3ljYXBfdGVzdGNhcmQuYwppbmRleCAzYzJjZTI4Li5lMjdkZmU5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZWFzeWNhcC9lYXN5Y2FwX3Rlc3RjYXJkLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2Vhc3ljYXAvZWFzeWNhcF90ZXN0Y2FyZC5jCkBAIC0yOSwzNyArMjksNjkgQEAKICNpbmNsdWRlICJlYXN5Y2FwX2RlYnVnLmgiCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgVEVTVENBUkRfQllURVNQRVJMSU5FICgyICogMTQ0MCkKKyNkZWZpbmUgVEVTVENBUkRfQllURVNQRVJMSU5FICgyICogNzIwKQogdm9pZAotZWFzeWNhcF90ZXN0Y2FyZChzdHJ1Y3QgZWFzeWNhcCAqcGVhc3ljYXAsIGludCBmaWVsZF9maWxsKQorZWFzeWNhcF90ZXN0Y2FyZChzdHJ1Y3QgZWFzeWNhcCAqcGVhc3ljYXAsIGludCBmaWVsZCkKIHsKIGludCB0b3RhbDsKIGludCB5LCB1LCB2LCByLCBnLCBiOwogdW5zaWduZWQgY2hhciB1eXZ5WzRdOwotCi1pbnQgaTEsIGxpbmUsIGssIG0sIG4sIG1vcmUsIG11Y2gsIGJhcndpZHRoOworaW50IGkxLCBsaW5lLCBrLCBtLCBuLCBtb3JlLCBtdWNoLCBiYXJ3aWR0aCwgYmFyaGVpZ2h0OwogdW5zaWduZWQgY2hhciBiZmJhcltURVNUQ0FSRF9CWVRFU1BFUkxJTkUgLyA4XSwgKnAxLCAqcDI7CiBzdHJ1Y3QgZGF0YV9idWZmZXIgKnBmaWVsZF9idWZmZXI7CiAKLUpPVCg4LCAiJWk9ZmllbGRfZmlsbFxuIiwgZmllbGRfZmlsbCk7Ci0KLWlmICgoVEVTVENBUkRfQllURVNQRVJMSU5FIC8gMikgPCBwZWFzeWNhcC0+d2lkdGgpIHsKLQlTQVkoIkVSUk9SOiBpbWFnZSBpcyB0b28gd2lkZVxuIik7CitpZiAoTlVMTCA9PSBwZWFzeWNhcCkgeworCVNBWSgiRVJST1I6IHBlYXN5Y2FwIGlzIE5VTExcbiIpOwogCXJldHVybjsKIH0KLWlmIChwZWFzeWNhcC0+d2lkdGggJSAxNikgewotCVNBWSgiRVJST1I6IGluZGl2aXNpYmxlIGltYWdlIHdpZHRoXG4iKTsKK0pPTSg4LCAiJWk9ZmllbGRcbiIsIGZpZWxkKTsKK3N3aXRjaCAocGVhc3ljYXAtPndpZHRoKSB7CitjYXNlIDcyMDoKK2Nhc2UgMzYwOiB7CisJYmFyd2lkdGggPSAoMiAqIDcyMCkgLyA4OworCWJyZWFrOworfQorY2FzZSA3MDQ6CitjYXNlIDM1MjogeworCWJhcndpZHRoID0gKDIgKiA3MDQpIC8gODsKKwlicmVhazsKK30KK2Nhc2UgNjQwOgorY2FzZSAzMjA6IHsKKwliYXJ3aWR0aCA9ICgyICogNjQwKSAvIDg7CisJYnJlYWs7Cit9CitkZWZhdWx0OiB7CisJU0FNKCJFUlJPUjogIGNhbm5vdCBzZXQgYmFyd2lkdGhcbiIpOwogCXJldHVybjsKIH0KLQorfQoraWYgKFRFU1RDQVJEX0JZVEVTUEVSTElORSA8IGJhcndpZHRoKSB7CisJU0FNKCJFUlJPUjogYmFyd2lkdGggaXMgdG9vIGxhcmdlXG4iKTsKKwlyZXR1cm47Cit9Citzd2l0Y2ggKHBlYXN5Y2FwLT5oZWlnaHQpIHsKK2Nhc2UgNTc2OgorY2FzZSAyODg6IHsKKwliYXJoZWlnaHQgPSA1NzY7CisJYnJlYWs7Cit9CitjYXNlIDQ4MDoKK2Nhc2UgMjQwOiB7CisJYmFyaGVpZ2h0ID0gNDgwOworCWJyZWFrOworfQorZGVmYXVsdDogeworCVNBTSgiRVJST1I6IGNhbm5vdCBzZXQgYmFyaGVpZ2h0XG4iKTsKKwlyZXR1cm47Cit9Cit9CiB0b3RhbCA9IDA7Ci1iYXJ3aWR0aCA9ICgyICogcGVhc3ljYXAtPndpZHRoKSAvIDg7Ci0KLWsgPSBmaWVsZF9maWxsOworayA9IGZpZWxkOwogbSA9IDA7CiBuID0gMDsKIAotZm9yIChsaW5lID0gMDsgIGxpbmUgPCAocGVhc3ljYXAtPmhlaWdodCAvIDIpOyAgbGluZSsrKSB7Citmb3IgKGxpbmUgPSAwOyAgbGluZSA8IChiYXJoZWlnaHQgLyAyKTsgIGxpbmUrKykgewogCWZvciAoaTEgPSAwOyAgaTEgPCA4OyAgaTErKykgewogCQlyID0gKGkxICogMjU2KS84OwogCQlnID0gKGkxICogMjU2KS84OwpAQCAtODgsMTUgKzEyMCwxNSBAQAogCiAJCXdoaWxlIChtb3JlKSB7CiAJCQlpZiAoKEZJRUxEX0JVRkZFUl9TSVpFL1BBR0VfU0laRSkgPD0gbSkgewotCQkJCVNBWSgiRVJST1I6ICBiYWQgbSByZWFjaGVkXG4iKTsKKwkJCQlTQU0oIkVSUk9SOiAgYmFkIG0gcmVhY2hlZFxuIik7CiAJCQkJcmV0dXJuOwogCQkJfQogCQlpZiAoUEFHRV9TSVpFIDwgbikgewotCQkJU0FZKCJFUlJPUjogIGJhZCBuIHJlYWNoZWRcbiIpOyByZXR1cm47CisJCQlTQU0oIkVSUk9SOiAgYmFkIG4gcmVhY2hlZFxuIik7IHJldHVybjsKIAkJfQogCiAJCWlmICgwID4gbW9yZSkgewotCQkJU0FZKCJFUlJPUjogIGludGVybmFsIGZhdWx0XG4iKTsKKwkJCVNBTSgiRVJST1I6ICBpbnRlcm5hbCBmYXVsdFxuIik7CiAJCQlyZXR1cm47CiAJCX0KIApAQCAtMTE3LDEwICsxNDksNiBAQAogCQl9CiAJfQogfQotCi1KT1QoOCwgIiVpPXRvdGFsXG4iLCB0b3RhbCk7Ci1pZiAodG90YWwgIT0gcGVhc3ljYXAtPndpZHRoICogcGVhc3ljYXAtPmhlaWdodCkKLQlTQVkoIkVSUk9SOiB3cm9uZyBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbjogICVpXG4iLCB0b3RhbCk7CiByZXR1cm47CiB9CiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0xNTcsMzUgKzE4NSwzNSBAQAogCQlwcmludGYoIiU2aSwgIiwgaTIpOyAgcHJpbnRmKCIlNmlcbn07XG4iLCBpMik7CiAJCX0KIAl9Ci1yZXR1cm4oMCk7CityZXR1cm4gMDsKIH0KIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIGludCB0b25lc1syMDQ4XSA9IHsKLSAgICAgMCwgICAgIDAsICAgNTAyLCAgIDUwMiwgIDEwMDQsICAxMDA0LCAgMTUwNSwgIDE1MDUsICAyMDA1LCAgMjAwNSwKLSAgMjUwMywgIDI1MDMsICAyOTk4LCAgMjk5OCwgIDM0OTEsICAzNDkxLCAgMzk4MCwgIDM5ODAsICA0NDY2LCAgNDQ2NiwKLSAgNDk0OCwgIDQ5NDgsICA1NDI0LCAgNTQyNCwgIDU4OTYsICA1ODk2LCAgNjM2MiwgIDYzNjIsICA2ODIyLCAgNjgyMiwKLSAgNzI3NiwgIDcyNzYsICA3NzIzLCAgNzcyMywgIDgxNjIsICA4MTYyLCAgODU5NCwgIDg1OTQsICA5MDE4LCAgOTAxOCwKLSAgOTQzNCwgIDk0MzQsICA5ODQwLCAgOTg0MCwgMTAyMzcsIDEwMjM3LCAxMDYyNSwgMTA2MjUsIDExMDAyLCAxMTAwMiwKLSAxMTM3MCwgMTEzNzAsIDExNzI2LCAxMTcyNiwgMTIwNzIsIDEyMDcyLCAxMjQwNiwgMTI0MDYsIDEyNzI4LCAxMjcyOCwKLSAxMzAzOCwgMTMwMzgsIDEzMzM3LCAxMzMzNywgMTM2MjIsIDEzNjIyLCAxMzg5NSwgMTM4OTUsIDE0MTU1LCAxNDE1NSwKLSAxNDQwMSwgMTQ0MDEsIDE0NjM0LCAxNDYzNCwgMTQ4NTMsIDE0ODUzLCAxNTA1OCwgMTUwNTgsIDE1MjQ5LCAxNTI0OSwKLSAxNTQyNiwgMTU0MjYsIDE1NTg4LCAxNTU4OCwgMTU3MzUsIDE1NzM1LCAxNTg2OCwgMTU4NjgsIDE1OTg1LCAxNTk4NSwKLSAxNjA4OCwgMTYwODgsIDE2MTc1LCAxNjE3NSwgMTYyNDgsIDE2MjQ4LCAxNjMwNSwgMTYzMDUsIDE2MzQ2LCAxNjM0NiwKLSAxNjM3MiwgMTYzNzIsIDE2MzgzLCAxNjM4MywgMTYzNzksIDE2Mzc5LCAxNjM1OSwgMTYzNTksIDE2MzIzLCAxNjMyMywKLSAxNjI3MiwgMTYyNzIsIDE2MjA2LCAxNjIwNiwgMTYxMjUsIDE2MTI1LCAxNjAyOCwgMTYwMjgsIDE1OTE3LCAxNTkxNywKLSAxNTc5MCwgMTU3OTAsIDE1NjQ5LCAxNTY0OSwgMTU0OTIsIDE1NDkyLCAxNTMyMiwgMTUzMjIsIDE1MTM2LCAxNTEzNiwKLSAxNDkzNywgMTQ5MzcsIDE0NzIzLCAxNDcyMywgMTQ0OTYsIDE0NDk2LCAxNDI1NSwgMTQyNTUsIDE0MDAxLCAxNDAwMSwKLSAxMzczMywgMTM3MzMsIDEzNDUyLCAxMzQ1MiwgMTMxNTksIDEzMTU5LCAxMjg1NCwgMTI4NTQsIDEyNTM2LCAxMjUzNiwKLSAxMjIwNywgMTIyMDcsIDExODY2LCAxMTg2NiwgMTE1MTMsIDExNTEzLCAxMTE1MCwgMTExNTAsIDEwNzc3LCAxMDc3NywKLSAxMDM5MywgMTAzOTMsIDEwMDAwLCAxMDAwMCwgIDk1OTcsICA5NTk3LCAgOTE4NSwgIDkxODUsICA4NzY1LCAgODc2NSwKLSAgODMzNiwgIDgzMzYsICA3OTAwLCAgNzkwMCwgIDc0NTYsICA3NDU2LCAgNzAwNSwgIDcwMDUsICA2NTQ3LCAgNjU0NywKLSAgNjA4MywgIDYwODMsICA1NjE0LCAgNTYxNCwgIDUxMzksICA1MTM5LCAgNDY1OSwgIDQ2NTksICA0MTc1LCAgNDE3NSwKLSAgMzY4NywgIDM2ODcsICAzMTk2LCAgMzE5NiwgIDI3MDEsICAyNzAxLCAgMjIwNCwgIDIyMDQsICAxNzA1LCAgMTcwNSwKLSAgMTIwNSwgIDEyMDUsICAgNzAzLCAgIDcwMywgICAyMDEsICAgMjAxLCAgLTMwMSwgIC0zMDEsICAtODAzLCAgLTgwMywKLSAtMTMwNSwgLTEzMDUsIC0xODA1LCAtMTgwNSwgLTIzMDQsIC0yMzA0LCAtMjgwMSwgLTI4MDEsIC0zMjk0LCAtMzI5NCwKLSAtMzc4NSwgLTM3ODUsIC00MjcyLCAtNDI3MiwgLTQ3NTYsIC00NzU2LCAtNTIzNCwgLTUyMzQsIC01NzA4LCAtNTcwOCwKLSAtNjE3NiwgLTYxNzYsIC02NjM5LCAtNjYzOSwgLTcwOTUsIC03MDk1LCAtNzU0NSwgLTc1NDUsIC03OTg4LCAtNzk4OCwKLSAtODQyMywgLTg0MjMsIC04ODUwLCAtODg1MCwgLTkyNjgsIC05MjY4LCAtOTY3OSwgLTk2NzksIC0xMDA3OSwgLTEwMDc5LAorMCwgICAgIDAsICAgNTAyLCAgIDUwMiwgIDEwMDQsICAxMDA0LCAgMTUwNSwgIDE1MDUsICAyMDA1LCAgMjAwNSwKKzI1MDMsICAyNTAzLCAgMjk5OCwgIDI5OTgsICAzNDkxLCAgMzQ5MSwgIDM5ODAsICAzOTgwLCAgNDQ2NiwgIDQ0NjYsCis0OTQ4LCAgNDk0OCwgIDU0MjQsICA1NDI0LCAgNTg5NiwgIDU4OTYsICA2MzYyLCAgNjM2MiwgIDY4MjIsICA2ODIyLAorNzI3NiwgIDcyNzYsICA3NzIzLCAgNzcyMywgIDgxNjIsICA4MTYyLCAgODU5NCwgIDg1OTQsICA5MDE4LCAgOTAxOCwKKzk0MzQsICA5NDM0LCAgOTg0MCwgIDk4NDAsIDEwMjM3LCAxMDIzNywgMTA2MjUsIDEwNjI1LCAxMTAwMiwgMTEwMDIsCisxMTM3MCwgMTEzNzAsIDExNzI2LCAxMTcyNiwgMTIwNzIsIDEyMDcyLCAxMjQwNiwgMTI0MDYsIDEyNzI4LCAxMjcyOCwKKzEzMDM4LCAxMzAzOCwgMTMzMzcsIDEzMzM3LCAxMzYyMiwgMTM2MjIsIDEzODk1LCAxMzg5NSwgMTQxNTUsIDE0MTU1LAorMTQ0MDEsIDE0NDAxLCAxNDYzNCwgMTQ2MzQsIDE0ODUzLCAxNDg1MywgMTUwNTgsIDE1MDU4LCAxNTI0OSwgMTUyNDksCisxNTQyNiwgMTU0MjYsIDE1NTg4LCAxNTU4OCwgMTU3MzUsIDE1NzM1LCAxNTg2OCwgMTU4NjgsIDE1OTg1LCAxNTk4NSwKKzE2MDg4LCAxNjA4OCwgMTYxNzUsIDE2MTc1LCAxNjI0OCwgMTYyNDgsIDE2MzA1LCAxNjMwNSwgMTYzNDYsIDE2MzQ2LAorMTYzNzIsIDE2MzcyLCAxNjM4MywgMTYzODMsIDE2Mzc5LCAxNjM3OSwgMTYzNTksIDE2MzU5LCAxNjMyMywgMTYzMjMsCisxNjI3MiwgMTYyNzIsIDE2MjA2LCAxNjIwNiwgMTYxMjUsIDE2MTI1LCAxNjAyOCwgMTYwMjgsIDE1OTE3LCAxNTkxNywKKzE1NzkwLCAxNTc5MCwgMTU2NDksIDE1NjQ5LCAxNTQ5MiwgMTU0OTIsIDE1MzIyLCAxNTMyMiwgMTUxMzYsIDE1MTM2LAorMTQ5MzcsIDE0OTM3LCAxNDcyMywgMTQ3MjMsIDE0NDk2LCAxNDQ5NiwgMTQyNTUsIDE0MjU1LCAxNDAwMSwgMTQwMDEsCisxMzczMywgMTM3MzMsIDEzNDUyLCAxMzQ1MiwgMTMxNTksIDEzMTU5LCAxMjg1NCwgMTI4NTQsIDEyNTM2LCAxMjUzNiwKKzEyMjA3LCAxMjIwNywgMTE4NjYsIDExODY2LCAxMTUxMywgMTE1MTMsIDExMTUwLCAxMTE1MCwgMTA3NzcsIDEwNzc3LAorMTAzOTMsIDEwMzkzLCAxMDAwMCwgMTAwMDAsICA5NTk3LCAgOTU5NywgIDkxODUsICA5MTg1LCAgODc2NSwgIDg3NjUsCis4MzM2LCAgODMzNiwgIDc5MDAsICA3OTAwLCAgNzQ1NiwgIDc0NTYsICA3MDA1LCAgNzAwNSwgIDY1NDcsICA2NTQ3LAorNjA4MywgIDYwODMsICA1NjE0LCAgNTYxNCwgIDUxMzksICA1MTM5LCAgNDY1OSwgIDQ2NTksICA0MTc1LCAgNDE3NSwKKzM2ODcsICAzNjg3LCAgMzE5NiwgIDMxOTYsICAyNzAxLCAgMjcwMSwgIDIyMDQsICAyMjA0LCAgMTcwNSwgIDE3MDUsCisxMjA1LCAgMTIwNSwgICA3MDMsICAgNzAzLCAgIDIwMSwgICAyMDEsICAtMzAxLCAgLTMwMSwgIC04MDMsICAtODAzLAorLTEzMDUsIC0xMzA1LCAtMTgwNSwgLTE4MDUsIC0yMzA0LCAtMjMwNCwgLTI4MDEsIC0yODAxLCAtMzI5NCwgLTMyOTQsCistMzc4NSwgLTM3ODUsIC00MjcyLCAtNDI3MiwgLTQ3NTYsIC00NzU2LCAtNTIzNCwgLTUyMzQsIC01NzA4LCAtNTcwOCwKKy02MTc2LCAtNjE3NiwgLTY2MzksIC02NjM5LCAtNzA5NSwgLTcwOTUsIC03NTQ1LCAtNzU0NSwgLTc5ODgsIC03OTg4LAorLTg0MjMsIC04NDIzLCAtODg1MCwgLTg4NTAsIC05MjY4LCAtOTI2OCwgLTk2NzksIC05Njc5LCAtMTAwNzksIC0xMDA3OSwKIC0xMDQ3MSwgLTEwNDcxLCAtMTA4NTMsIC0xMDg1MywgLTExMjI0LCAtMTEyMjQsIC0xMTU4NSwgLTExNTg1LCAtMTE5MzUsIC0xMTkzNSwKIC0xMjI3MywgLTEyMjczLCAtMTI2MDAsIC0xMjYwMCwgLTEyOTE2LCAtMTI5MTYsIC0xMzIxOSwgLTEzMjE5LCAtMTM1MTAsIC0xMzUxMCwKIC0xMzc4OCwgLTEzNzg4LCAtMTQwNTMsIC0xNDA1MywgLTE0MzA0LCAtMTQzMDQsIC0xNDU0MywgLTE0NTQzLCAtMTQ3NjcsIC0xNDc2NywKQEAgLTE5OCwzNSArMjI2LDM1IEBACiAtMTQzNTMsIC0xNDM1MywgLTE0MTA0LCAtMTQxMDQsIC0xMzg0MiwgLTEzODQyLCAtMTM1NjYsIC0xMzU2NiwgLTEzMjc4LCAtMTMyNzgsCiAtMTI5NzcsIC0xMjk3NywgLTEyNjY1LCAtMTI2NjUsIC0xMjM0MCwgLTEyMzQwLCAtMTIwMDMsIC0xMjAwMywgLTExNjU2LCAtMTE2NTYsCiAtMTEyOTcsIC0xMTI5NywgLTEwOTI4LCAtMTA5MjgsIC0xMDU0OCwgLTEwNTQ4LCAtMTAxNTksIC0xMDE1OSwgLTk3NTksIC05NzU5LAotIC05MzUxLCAtOTM1MSwgLTg5MzQsIC04OTM0LCAtODUwOSwgLTg1MDksIC04MDc1LCAtODA3NSwgLTc2MzQsIC03NjM0LAotIC03MTg2LCAtNzE4NiwgLTY3MzEsIC02NzMxLCAtNjI2OSwgLTYyNjksIC01ODAyLCAtNTgwMiwgLTUzMjksIC01MzI5LAotIC00ODUyLCAtNDg1MiwgLTQzNjksIC00MzY5LCAtMzg4MywgLTM4ODMsIC0zMzkzLCAtMzM5MywgLTI5MDAsIC0yOTAwLAotIC0yNDA0LCAtMjQwNCwgLTE5MDUsIC0xOTA1LCAtMTQwNSwgLTE0MDUsICAtOTA0LCAgLTkwNCwgIC00MDIsICAtNDAyLAotICAgMTAwLCAgIDEwMCwgICA2MDMsICAgNjAzLCAgMTEwNSwgIDExMDUsICAxNjA1LCAgMTYwNSwgIDIxMDUsICAyMTA1LAotICAyNjAyLCAgMjYwMiwgIDMwOTcsICAzMDk3LCAgMzU4OSwgIDM1ODksICA0MDc4LCAgNDA3OCwgIDQ1NjMsICA0NTYzLAotICA1MDQzLCAgNTA0MywgIDU1MTksICA1NTE5LCAgNTk5MCwgIDU5OTAsICA2NDU1LCAgNjQ1NSwgIDY5MTQsICA2OTE0LAotICA3MzY2LCAgNzM2NiwgIDc4MTEsICA3ODExLCAgODI0OSwgIDgyNDksICA4NjgwLCAgODY4MCwgIDkxMDIsICA5MTAyLAotICA5NTE2LCAgOTUxNiwgIDk5MjAsICA5OTIwLCAxMDMxNSwgMTAzMTUsIDEwNzAxLCAxMDcwMSwgMTEwNzcsIDExMDc3LAotIDExNDQyLCAxMTQ0MiwgMTE3OTYsIDExNzk2LCAxMjEzOSwgMTIxMzksIDEyNDcxLCAxMjQ3MSwgMTI3OTEsIDEyNzkxLAotIDEzMDk5LCAxMzA5OSwgMTMzOTUsIDEzMzk1LCAxMzY3OCwgMTM2NzgsIDEzOTQ4LCAxMzk0OCwgMTQyMDUsIDE0MjA1LAotIDE0NDQ5LCAxNDQ0OSwgMTQ2NzksIDE0Njc5LCAxNDg5NSwgMTQ4OTUsIDE1MDk4LCAxNTA5OCwgMTUyODYsIDE1Mjg2LAotIDE1NDU5LCAxNTQ1OSwgMTU2MTgsIDE1NjE4LCAxNTc2MywgMTU3NjMsIDE1ODkyLCAxNTg5MiwgMTYwMDcsIDE2MDA3LAotIDE2MTA3LCAxNjEwNywgMTYxOTEsIDE2MTkxLCAxNjI2MCwgMTYyNjAsIDE2MzE0LCAxNjMxNCwgMTYzNTMsIDE2MzUzLAotIDE2Mzc2LCAxNjM3NiwgMTYzODQsIDE2Mzg0LCAxNjM3NiwgMTYzNzYsIDE2MzUzLCAxNjM1MywgMTYzMTQsIDE2MzE0LAotIDE2MjYwLCAxNjI2MCwgMTYxOTEsIDE2MTkxLCAxNjEwNywgMTYxMDcsIDE2MDA3LCAxNjAwNywgMTU4OTIsIDE1ODkyLAotIDE1NzYzLCAxNTc2MywgMTU2MTgsIDE1NjE4LCAxNTQ1OSwgMTU0NTksIDE1Mjg2LCAxNTI4NiwgMTUwOTgsIDE1MDk4LAotIDE0ODk1LCAxNDg5NSwgMTQ2NzksIDE0Njc5LCAxNDQ0OSwgMTQ0NDksIDE0MjA1LCAxNDIwNSwgMTM5NDgsIDEzOTQ4LAotIDEzNjc4LCAxMzY3OCwgMTMzOTUsIDEzMzk1LCAxMzA5OSwgMTMwOTksIDEyNzkxLCAxMjc5MSwgMTI0NzEsIDEyNDcxLAotIDEyMTM5LCAxMjEzOSwgMTE3OTYsIDExNzk2LCAxMTQ0MiwgMTE0NDIsIDExMDc3LCAxMTA3NywgMTA3MDEsIDEwNzAxLAotIDEwMzE1LCAxMDMxNSwgIDk5MjAsICA5OTIwLCAgOTUxNiwgIDk1MTYsICA5MTAyLCAgOTEwMiwgIDg2ODAsICA4NjgwLAotICA4MjQ5LCAgODI0OSwgIDc4MTEsICA3ODExLCAgNzM2NiwgIDczNjYsICA2OTE0LCAgNjkxNCwgIDY0NTUsICA2NDU1LAotICA1OTkwLCAgNTk5MCwgIDU1MTksICA1NTE5LCAgNTA0MywgIDUwNDMsICA0NTYzLCAgNDU2MywgIDQwNzgsICA0MDc4LAotICAzNTg5LCAgMzU4OSwgIDMwOTcsICAzMDk3LCAgMjYwMiwgIDI2MDIsICAyMTA1LCAgMjEwNSwgIDE2MDUsICAxNjA1LAotICAxMTA1LCAgMTEwNSwgICA2MDMsICAgNjAzLCAgIDEwMCwgICAxMDAsICAtNDAyLCAgLTQwMiwgIC05MDQsICAtOTA0LAotIC0xNDA1LCAtMTQwNSwgLTE5MDUsIC0xOTA1LCAtMjQwNCwgLTI0MDQsIC0yOTAwLCAtMjkwMCwgLTMzOTMsIC0zMzkzLAotIC0zODgzLCAtMzg4MywgLTQzNjksIC00MzY5LCAtNDg1MiwgLTQ4NTIsIC01MzI5LCAtNTMyOSwgLTU4MDIsIC01ODAyLAotIC02MjY5LCAtNjI2OSwgLTY3MzEsIC02NzMxLCAtNzE4NiwgLTcxODYsIC03NjM0LCAtNzYzNCwgLTgwNzUsIC04MDc1LAotIC04NTA5LCAtODUwOSwgLTg5MzQsIC04OTM0LCAtOTM1MSwgLTkzNTEsIC05NzU5LCAtOTc1OSwgLTEwMTU5LCAtMTAxNTksCistOTM1MSwgLTkzNTEsIC04OTM0LCAtODkzNCwgLTg1MDksIC04NTA5LCAtODA3NSwgLTgwNzUsIC03NjM0LCAtNzYzNCwKKy03MTg2LCAtNzE4NiwgLTY3MzEsIC02NzMxLCAtNjI2OSwgLTYyNjksIC01ODAyLCAtNTgwMiwgLTUzMjksIC01MzI5LAorLTQ4NTIsIC00ODUyLCAtNDM2OSwgLTQzNjksIC0zODgzLCAtMzg4MywgLTMzOTMsIC0zMzkzLCAtMjkwMCwgLTI5MDAsCistMjQwNCwgLTI0MDQsIC0xOTA1LCAtMTkwNSwgLTE0MDUsIC0xNDA1LCAgLTkwNCwgIC05MDQsICAtNDAyLCAgLTQwMiwKKzEwMCwgICAxMDAsICAgNjAzLCAgIDYwMywgIDExMDUsICAxMTA1LCAgMTYwNSwgIDE2MDUsICAyMTA1LCAgMjEwNSwKKzI2MDIsICAyNjAyLCAgMzA5NywgIDMwOTcsICAzNTg5LCAgMzU4OSwgIDQwNzgsICA0MDc4LCAgNDU2MywgIDQ1NjMsCis1MDQzLCAgNTA0MywgIDU1MTksICA1NTE5LCAgNTk5MCwgIDU5OTAsICA2NDU1LCAgNjQ1NSwgIDY5MTQsICA2OTE0LAorNzM2NiwgIDczNjYsICA3ODExLCAgNzgxMSwgIDgyNDksICA4MjQ5LCAgODY4MCwgIDg2ODAsICA5MTAyLCAgOTEwMiwKKzk1MTYsICA5NTE2LCAgOTkyMCwgIDk5MjAsIDEwMzE1LCAxMDMxNSwgMTA3MDEsIDEwNzAxLCAxMTA3NywgMTEwNzcsCisxMTQ0MiwgMTE0NDIsIDExNzk2LCAxMTc5NiwgMTIxMzksIDEyMTM5LCAxMjQ3MSwgMTI0NzEsIDEyNzkxLCAxMjc5MSwKKzEzMDk5LCAxMzA5OSwgMTMzOTUsIDEzMzk1LCAxMzY3OCwgMTM2NzgsIDEzOTQ4LCAxMzk0OCwgMTQyMDUsIDE0MjA1LAorMTQ0NDksIDE0NDQ5LCAxNDY3OSwgMTQ2NzksIDE0ODk1LCAxNDg5NSwgMTUwOTgsIDE1MDk4LCAxNTI4NiwgMTUyODYsCisxNTQ1OSwgMTU0NTksIDE1NjE4LCAxNTYxOCwgMTU3NjMsIDE1NzYzLCAxNTg5MiwgMTU4OTIsIDE2MDA3LCAxNjAwNywKKzE2MTA3LCAxNjEwNywgMTYxOTEsIDE2MTkxLCAxNjI2MCwgMTYyNjAsIDE2MzE0LCAxNjMxNCwgMTYzNTMsIDE2MzUzLAorMTYzNzYsIDE2Mzc2LCAxNjM4NCwgMTYzODQsIDE2Mzc2LCAxNjM3NiwgMTYzNTMsIDE2MzUzLCAxNjMxNCwgMTYzMTQsCisxNjI2MCwgMTYyNjAsIDE2MTkxLCAxNjE5MSwgMTYxMDcsIDE2MTA3LCAxNjAwNywgMTYwMDcsIDE1ODkyLCAxNTg5MiwKKzE1NzYzLCAxNTc2MywgMTU2MTgsIDE1NjE4LCAxNTQ1OSwgMTU0NTksIDE1Mjg2LCAxNTI4NiwgMTUwOTgsIDE1MDk4LAorMTQ4OTUsIDE0ODk1LCAxNDY3OSwgMTQ2NzksIDE0NDQ5LCAxNDQ0OSwgMTQyMDUsIDE0MjA1LCAxMzk0OCwgMTM5NDgsCisxMzY3OCwgMTM2NzgsIDEzMzk1LCAxMzM5NSwgMTMwOTksIDEzMDk5LCAxMjc5MSwgMTI3OTEsIDEyNDcxLCAxMjQ3MSwKKzEyMTM5LCAxMjEzOSwgMTE3OTYsIDExNzk2LCAxMTQ0MiwgMTE0NDIsIDExMDc3LCAxMTA3NywgMTA3MDEsIDEwNzAxLAorMTAzMTUsIDEwMzE1LCAgOTkyMCwgIDk5MjAsICA5NTE2LCAgOTUxNiwgIDkxMDIsICA5MTAyLCAgODY4MCwgIDg2ODAsCis4MjQ5LCAgODI0OSwgIDc4MTEsICA3ODExLCAgNzM2NiwgIDczNjYsICA2OTE0LCAgNjkxNCwgIDY0NTUsICA2NDU1LAorNTk5MCwgIDU5OTAsICA1NTE5LCAgNTUxOSwgIDUwNDMsICA1MDQzLCAgNDU2MywgIDQ1NjMsICA0MDc4LCAgNDA3OCwKKzM1ODksICAzNTg5LCAgMzA5NywgIDMwOTcsICAyNjAyLCAgMjYwMiwgIDIxMDUsICAyMTA1LCAgMTYwNSwgIDE2MDUsCisxMTA1LCAgMTEwNSwgICA2MDMsICAgNjAzLCAgIDEwMCwgICAxMDAsICAtNDAyLCAgLTQwMiwgIC05MDQsICAtOTA0LAorLTE0MDUsIC0xNDA1LCAtMTkwNSwgLTE5MDUsIC0yNDA0LCAtMjQwNCwgLTI5MDAsIC0yOTAwLCAtMzM5MywgLTMzOTMsCistMzg4MywgLTM4ODMsIC00MzY5LCAtNDM2OSwgLTQ4NTIsIC00ODUyLCAtNTMyOSwgLTUzMjksIC01ODAyLCAtNTgwMiwKKy02MjY5LCAtNjI2OSwgLTY3MzEsIC02NzMxLCAtNzE4NiwgLTcxODYsIC03NjM0LCAtNzYzNCwgLTgwNzUsIC04MDc1LAorLTg1MDksIC04NTA5LCAtODkzNCwgLTg5MzQsIC05MzUxLCAtOTM1MSwgLTk3NTksIC05NzU5LCAtMTAxNTksIC0xMDE1OSwKIC0xMDU0OCwgLTEwNTQ4LCAtMTA5MjgsIC0xMDkyOCwgLTExMjk3LCAtMTEyOTcsIC0xMTY1NiwgLTExNjU2LCAtMTIwMDMsIC0xMjAwMywKIC0xMjM0MCwgLTEyMzQwLCAtMTI2NjUsIC0xMjY2NSwgLTEyOTc3LCAtMTI5NzcsIC0xMzI3OCwgLTEzMjc4LCAtMTM1NjYsIC0xMzU2NiwKIC0xMzg0MiwgLTEzODQyLCAtMTQxMDQsIC0xNDEwNCwgLTE0MzUzLCAtMTQzNTMsIC0xNDU4OSwgLTE0NTg5LCAtMTQ4MTAsIC0xNDgxMCwKQEAgLTIzOSwzNSArMjY3LDM1IEBACiAtMTQzMDQsIC0xNDMwNCwgLTE0MDUzLCAtMTQwNTMsIC0xMzc4OCwgLTEzNzg4LCAtMTM1MTAsIC0xMzUxMCwgLTEzMjE5LCAtMTMyMTksCiAtMTI5MTYsIC0xMjkxNiwgLTEyNjAwLCAtMTI2MDAsIC0xMjI3MywgLTEyMjczLCAtMTE5MzUsIC0xMTkzNSwgLTExNTg1LCAtMTE1ODUsCiAtMTEyMjQsIC0xMTIyNCwgLTEwODUzLCAtMTA4NTMsIC0xMDQ3MSwgLTEwNDcxLCAtMTAwNzksIC0xMDA3OSwgLTk2NzksIC05Njc5LAotIC05MjY4LCAtOTI2OCwgLTg4NTAsIC04ODUwLCAtODQyMywgLTg0MjMsIC03OTg4LCAtNzk4OCwgLTc1NDUsIC03NTQ1LAotIC03MDk1LCAtNzA5NSwgLTY2MzksIC02NjM5LCAtNjE3NiwgLTYxNzYsIC01NzA4LCAtNTcwOCwgLTUyMzQsIC01MjM0LAotIC00NzU2LCAtNDc1NiwgLTQyNzIsIC00MjcyLCAtMzc4NSwgLTM3ODUsIC0zMjk0LCAtMzI5NCwgLTI4MDEsIC0yODAxLAotIC0yMzA0LCAtMjMwNCwgLTE4MDUsIC0xODA1LCAtMTMwNSwgLTEzMDUsICAtODAzLCAgLTgwMywgIC0zMDEsICAtMzAxLAotICAgMjAxLCAgIDIwMSwgICA3MDMsICAgNzAzLCAgMTIwNSwgIDEyMDUsICAxNzA1LCAgMTcwNSwgIDIyMDQsICAyMjA0LAotICAyNzAxLCAgMjcwMSwgIDMxOTYsICAzMTk2LCAgMzY4NywgIDM2ODcsICA0MTc1LCAgNDE3NSwgIDQ2NTksICA0NjU5LAotICA1MTM5LCAgNTEzOSwgIDU2MTQsICA1NjE0LCAgNjA4MywgIDYwODMsICA2NTQ3LCAgNjU0NywgIDcwMDUsICA3MDA1LAotICA3NDU2LCAgNzQ1NiwgIDc5MDAsICA3OTAwLCAgODMzNiwgIDgzMzYsICA4NzY1LCAgODc2NSwgIDkxODUsICA5MTg1LAotICA5NTk3LCAgOTU5NywgMTAwMDAsIDEwMDAwLCAxMDM5MywgMTAzOTMsIDEwNzc3LCAxMDc3NywgMTExNTAsIDExMTUwLAotIDExNTEzLCAxMTUxMywgMTE4NjYsIDExODY2LCAxMjIwNywgMTIyMDcsIDEyNTM2LCAxMjUzNiwgMTI4NTQsIDEyODU0LAotIDEzMTU5LCAxMzE1OSwgMTM0NTIsIDEzNDUyLCAxMzczMywgMTM3MzMsIDE0MDAxLCAxNDAwMSwgMTQyNTUsIDE0MjU1LAotIDE0NDk2LCAxNDQ5NiwgMTQ3MjMsIDE0NzIzLCAxNDkzNywgMTQ5MzcsIDE1MTM2LCAxNTEzNiwgMTUzMjIsIDE1MzIyLAotIDE1NDkyLCAxNTQ5MiwgMTU2NDksIDE1NjQ5LCAxNTc5MCwgMTU3OTAsIDE1OTE3LCAxNTkxNywgMTYwMjgsIDE2MDI4LAotIDE2MTI1LCAxNjEyNSwgMTYyMDYsIDE2MjA2LCAxNjI3MiwgMTYyNzIsIDE2MzIzLCAxNjMyMywgMTYzNTksIDE2MzU5LAotIDE2Mzc5LCAxNjM3OSwgMTYzODMsIDE2MzgzLCAxNjM3MiwgMTYzNzIsIDE2MzQ2LCAxNjM0NiwgMTYzMDUsIDE2MzA1LAotIDE2MjQ4LCAxNjI0OCwgMTYxNzUsIDE2MTc1LCAxNjA4OCwgMTYwODgsIDE1OTg1LCAxNTk4NSwgMTU4NjgsIDE1ODY4LAotIDE1NzM1LCAxNTczNSwgMTU1ODgsIDE1NTg4LCAxNTQyNiwgMTU0MjYsIDE1MjQ5LCAxNTI0OSwgMTUwNTgsIDE1MDU4LAotIDE0ODUzLCAxNDg1MywgMTQ2MzQsIDE0NjM0LCAxNDQwMSwgMTQ0MDEsIDE0MTU1LCAxNDE1NSwgMTM4OTUsIDEzODk1LAotIDEzNjIyLCAxMzYyMiwgMTMzMzcsIDEzMzM3LCAxMzAzOCwgMTMwMzgsIDEyNzI4LCAxMjcyOCwgMTI0MDYsIDEyNDA2LAotIDEyMDcyLCAxMjA3MiwgMTE3MjYsIDExNzI2LCAxMTM3MCwgMTEzNzAsIDExMDAyLCAxMTAwMiwgMTA2MjUsIDEwNjI1LAotIDEwMjM3LCAxMDIzNywgIDk4NDAsICA5ODQwLCAgOTQzNCwgIDk0MzQsICA5MDE4LCAgOTAxOCwgIDg1OTQsICA4NTk0LAotICA4MTYyLCAgODE2MiwgIDc3MjMsICA3NzIzLCAgNzI3NiwgIDcyNzYsICA2ODIyLCAgNjgyMiwgIDYzNjIsICA2MzYyLAotICA1ODk2LCAgNTg5NiwgIDU0MjQsICA1NDI0LCAgNDk0OCwgIDQ5NDgsICA0NDY2LCAgNDQ2NiwgIDM5ODAsICAzOTgwLAotICAzNDkxLCAgMzQ5MSwgIDI5OTgsICAyOTk4LCAgMjUwMywgIDI1MDMsICAyMDA1LCAgMjAwNSwgIDE1MDUsICAxNTA1LAotICAxMDA0LCAgMTAwNCwgICA1MDIsICAgNTAyLCAgICAgMCwgICAgIDAsICAtNTAyLCAgLTUwMiwgLTEwMDQsIC0xMDA0LAotIC0xNTA1LCAtMTUwNSwgLTIwMDUsIC0yMDA1LCAtMjUwMywgLTI1MDMsIC0yOTk4LCAtMjk5OCwgLTM0OTEsIC0zNDkxLAotIC0zOTgwLCAtMzk4MCwgLTQ0NjYsIC00NDY2LCAtNDk0OCwgLTQ5NDgsIC01NDI0LCAtNTQyNCwgLTU4OTYsIC01ODk2LAotIC02MzYyLCAtNjM2MiwgLTY4MjIsIC02ODIyLCAtNzI3NiwgLTcyNzYsIC03NzIzLCAtNzcyMywgLTgxNjIsIC04MTYyLAotIC04NTk0LCAtODU5NCwgLTkwMTgsIC05MDE4LCAtOTQzNCwgLTk0MzQsIC05ODQwLCAtOTg0MCwgLTEwMjM3LCAtMTAyMzcsCistOTI2OCwgLTkyNjgsIC04ODUwLCAtODg1MCwgLTg0MjMsIC04NDIzLCAtNzk4OCwgLTc5ODgsIC03NTQ1LCAtNzU0NSwKKy03MDk1LCAtNzA5NSwgLTY2MzksIC02NjM5LCAtNjE3NiwgLTYxNzYsIC01NzA4LCAtNTcwOCwgLTUyMzQsIC01MjM0LAorLTQ3NTYsIC00NzU2LCAtNDI3MiwgLTQyNzIsIC0zNzg1LCAtMzc4NSwgLTMyOTQsIC0zMjk0LCAtMjgwMSwgLTI4MDEsCistMjMwNCwgLTIzMDQsIC0xODA1LCAtMTgwNSwgLTEzMDUsIC0xMzA1LCAgLTgwMywgIC04MDMsICAtMzAxLCAgLTMwMSwKKzIwMSwgICAyMDEsICAgNzAzLCAgIDcwMywgIDEyMDUsICAxMjA1LCAgMTcwNSwgIDE3MDUsICAyMjA0LCAgMjIwNCwKKzI3MDEsICAyNzAxLCAgMzE5NiwgIDMxOTYsICAzNjg3LCAgMzY4NywgIDQxNzUsICA0MTc1LCAgNDY1OSwgIDQ2NTksCis1MTM5LCAgNTEzOSwgIDU2MTQsICA1NjE0LCAgNjA4MywgIDYwODMsICA2NTQ3LCAgNjU0NywgIDcwMDUsICA3MDA1LAorNzQ1NiwgIDc0NTYsICA3OTAwLCAgNzkwMCwgIDgzMzYsICA4MzM2LCAgODc2NSwgIDg3NjUsICA5MTg1LCAgOTE4NSwKKzk1OTcsICA5NTk3LCAxMDAwMCwgMTAwMDAsIDEwMzkzLCAxMDM5MywgMTA3NzcsIDEwNzc3LCAxMTE1MCwgMTExNTAsCisxMTUxMywgMTE1MTMsIDExODY2LCAxMTg2NiwgMTIyMDcsIDEyMjA3LCAxMjUzNiwgMTI1MzYsIDEyODU0LCAxMjg1NCwKKzEzMTU5LCAxMzE1OSwgMTM0NTIsIDEzNDUyLCAxMzczMywgMTM3MzMsIDE0MDAxLCAxNDAwMSwgMTQyNTUsIDE0MjU1LAorMTQ0OTYsIDE0NDk2LCAxNDcyMywgMTQ3MjMsIDE0OTM3LCAxNDkzNywgMTUxMzYsIDE1MTM2LCAxNTMyMiwgMTUzMjIsCisxNTQ5MiwgMTU0OTIsIDE1NjQ5LCAxNTY0OSwgMTU3OTAsIDE1NzkwLCAxNTkxNywgMTU5MTcsIDE2MDI4LCAxNjAyOCwKKzE2MTI1LCAxNjEyNSwgMTYyMDYsIDE2MjA2LCAxNjI3MiwgMTYyNzIsIDE2MzIzLCAxNjMyMywgMTYzNTksIDE2MzU5LAorMTYzNzksIDE2Mzc5LCAxNjM4MywgMTYzODMsIDE2MzcyLCAxNjM3MiwgMTYzNDYsIDE2MzQ2LCAxNjMwNSwgMTYzMDUsCisxNjI0OCwgMTYyNDgsIDE2MTc1LCAxNjE3NSwgMTYwODgsIDE2MDg4LCAxNTk4NSwgMTU5ODUsIDE1ODY4LCAxNTg2OCwKKzE1NzM1LCAxNTczNSwgMTU1ODgsIDE1NTg4LCAxNTQyNiwgMTU0MjYsIDE1MjQ5LCAxNTI0OSwgMTUwNTgsIDE1MDU4LAorMTQ4NTMsIDE0ODUzLCAxNDYzNCwgMTQ2MzQsIDE0NDAxLCAxNDQwMSwgMTQxNTUsIDE0MTU1LCAxMzg5NSwgMTM4OTUsCisxMzYyMiwgMTM2MjIsIDEzMzM3LCAxMzMzNywgMTMwMzgsIDEzMDM4LCAxMjcyOCwgMTI3MjgsIDEyNDA2LCAxMjQwNiwKKzEyMDcyLCAxMjA3MiwgMTE3MjYsIDExNzI2LCAxMTM3MCwgMTEzNzAsIDExMDAyLCAxMTAwMiwgMTA2MjUsIDEwNjI1LAorMTAyMzcsIDEwMjM3LCAgOTg0MCwgIDk4NDAsICA5NDM0LCAgOTQzNCwgIDkwMTgsICA5MDE4LCAgODU5NCwgIDg1OTQsCis4MTYyLCAgODE2MiwgIDc3MjMsICA3NzIzLCAgNzI3NiwgIDcyNzYsICA2ODIyLCAgNjgyMiwgIDYzNjIsICA2MzYyLAorNTg5NiwgIDU4OTYsICA1NDI0LCAgNTQyNCwgIDQ5NDgsICA0OTQ4LCAgNDQ2NiwgIDQ0NjYsICAzOTgwLCAgMzk4MCwKKzM0OTEsICAzNDkxLCAgMjk5OCwgIDI5OTgsICAyNTAzLCAgMjUwMywgIDIwMDUsICAyMDA1LCAgMTUwNSwgIDE1MDUsCisxMDA0LCAgMTAwNCwgICA1MDIsICAgNTAyLCAgICAgMCwgICAgIDAsICAtNTAyLCAgLTUwMiwgLTEwMDQsIC0xMDA0LAorLTE1MDUsIC0xNTA1LCAtMjAwNSwgLTIwMDUsIC0yNTAzLCAtMjUwMywgLTI5OTgsIC0yOTk4LCAtMzQ5MSwgLTM0OTEsCistMzk4MCwgLTM5ODAsIC00NDY2LCAtNDQ2NiwgLTQ5NDgsIC00OTQ4LCAtNTQyNCwgLTU0MjQsIC01ODk2LCAtNTg5NiwKKy02MzYyLCAtNjM2MiwgLTY4MjIsIC02ODIyLCAtNzI3NiwgLTcyNzYsIC03NzIzLCAtNzcyMywgLTgxNjIsIC04MTYyLAorLTg1OTQsIC04NTk0LCAtOTAxOCwgLTkwMTgsIC05NDM0LCAtOTQzNCwgLTk4NDAsIC05ODQwLCAtMTAyMzcsIC0xMDIzNywKIC0xMDYyNSwgLTEwNjI1LCAtMTEwMDIsIC0xMTAwMiwgLTExMzcwLCAtMTEzNzAsIC0xMTcyNiwgLTExNzI2LCAtMTIwNzIsIC0xMjA3MiwKIC0xMjQwNiwgLTEyNDA2LCAtMTI3MjgsIC0xMjcyOCwgLTEzMDM4LCAtMTMwMzgsIC0xMzMzNywgLTEzMzM3LCAtMTM2MjIsIC0xMzYyMiwKIC0xMzg5NSwgLTEzODk1LCAtMTQxNTUsIC0xNDE1NSwgLTE0NDAxLCAtMTQ0MDEsIC0xNDYzNCwgLTE0NjM0LCAtMTQ4NTMsIC0xNDg1MywKQEAgLTI4MCwzNSArMzA4LDM1IEBACiAtMTQyNTUsIC0xNDI1NSwgLTE0MDAxLCAtMTQwMDEsIC0xMzczMywgLTEzNzMzLCAtMTM0NTIsIC0xMzQ1MiwgLTEzMTU5LCAtMTMxNTksCiAtMTI4NTQsIC0xMjg1NCwgLTEyNTM2LCAtMTI1MzYsIC0xMjIwNywgLTEyMjA3LCAtMTE4NjYsIC0xMTg2NiwgLTExNTEzLCAtMTE1MTMsCiAtMTExNTAsIC0xMTE1MCwgLTEwNzc3LCAtMTA3NzcsIC0xMDM5MywgLTEwMzkzLCAtMTAwMDAsIC0xMDAwMCwgLTk1OTcsIC05NTk3LAotIC05MTg1LCAtOTE4NSwgLTg3NjUsIC04NzY1LCAtODMzNiwgLTgzMzYsIC03OTAwLCAtNzkwMCwgLTc0NTYsIC03NDU2LAotIC03MDA1LCAtNzAwNSwgLTY1NDcsIC02NTQ3LCAtNjA4MywgLTYwODMsIC01NjE0LCAtNTYxNCwgLTUxMzksIC01MTM5LAotIC00NjU5LCAtNDY1OSwgLTQxNzUsIC00MTc1LCAtMzY4NywgLTM2ODcsIC0zMTk2LCAtMzE5NiwgLTI3MDEsIC0yNzAxLAotIC0yMjA0LCAtMjIwNCwgLTE3MDUsIC0xNzA1LCAtMTIwNSwgLTEyMDUsICAtNzAzLCAgLTcwMywgIC0yMDEsICAtMjAxLAotICAgMzAxLCAgIDMwMSwgICA4MDMsICAgODAzLCAgMTMwNSwgIDEzMDUsICAxODA1LCAgMTgwNSwgIDIzMDQsICAyMzA0LAotICAyODAxLCAgMjgwMSwgIDMyOTQsICAzMjk0LCAgMzc4NSwgIDM3ODUsICA0MjcyLCAgNDI3MiwgIDQ3NTYsICA0NzU2LAotICA1MjM0LCAgNTIzNCwgIDU3MDgsICA1NzA4LCAgNjE3NiwgIDYxNzYsICA2NjM5LCAgNjYzOSwgIDcwOTUsICA3MDk1LAotICA3NTQ1LCAgNzU0NSwgIDc5ODgsICA3OTg4LCAgODQyMywgIDg0MjMsICA4ODUwLCAgODg1MCwgIDkyNjgsICA5MjY4LAotICA5Njc5LCAgOTY3OSwgMTAwNzksIDEwMDc5LCAxMDQ3MSwgMTA0NzEsIDEwODUzLCAxMDg1MywgMTEyMjQsIDExMjI0LAotIDExNTg1LCAxMTU4NSwgMTE5MzUsIDExOTM1LCAxMjI3MywgMTIyNzMsIDEyNjAwLCAxMjYwMCwgMTI5MTYsIDEyOTE2LAotIDEzMjE5LCAxMzIxOSwgMTM1MTAsIDEzNTEwLCAxMzc4OCwgMTM3ODgsIDE0MDUzLCAxNDA1MywgMTQzMDQsIDE0MzA0LAotIDE0NTQzLCAxNDU0MywgMTQ3NjcsIDE0NzY3LCAxNDk3OCwgMTQ5NzgsIDE1MTc1LCAxNTE3NSwgMTUzNTcsIDE1MzU3LAotIDE1NTI1LCAxNTUyNSwgMTU2NzgsIDE1Njc4LCAxNTgxNywgMTU4MTcsIDE1OTQwLCAxNTk0MCwgMTYwNDksIDE2MDQ5LAotIDE2MTQyLCAxNjE0MiwgMTYyMjEsIDE2MjIxLCAxNjI4NCwgMTYyODQsIDE2MzMxLCAxNjMzMSwgMTYzNjQsIDE2MzY0LAotIDE2MzgxLCAxNjM4MSwgMTYzODIsIDE2MzgyLCAxNjM2OCwgMTYzNjgsIDE2MzM5LCAxNjMzOSwgMTYyOTQsIDE2Mjk0LAotIDE2MjM0LCAxNjIzNCwgMTYxNTksIDE2MTU5LCAxNjA2OSwgMTYwNjksIDE1OTYzLCAxNTk2MywgMTU4NDIsIDE1ODQyLAotIDE1NzA3LCAxNTcwNywgMTU1NTcsIDE1NTU3LCAxNTM5MiwgMTUzOTIsIDE1MjEyLCAxNTIxMiwgMTUwMTgsIDE1MDE4LAotIDE0ODEwLCAxNDgxMCwgMTQ1ODksIDE0NTg5LCAxNDM1MywgMTQzNTMsIDE0MTA0LCAxNDEwNCwgMTM4NDIsIDEzODQyLAotIDEzNTY2LCAxMzU2NiwgMTMyNzgsIDEzMjc4LCAxMjk3NywgMTI5NzcsIDEyNjY1LCAxMjY2NSwgMTIzNDAsIDEyMzQwLAotIDEyMDAzLCAxMjAwMywgMTE2NTYsIDExNjU2LCAxMTI5NywgMTEyOTcsIDEwOTI4LCAxMDkyOCwgMTA1NDgsIDEwNTQ4LAotIDEwMTU5LCAxMDE1OSwgIDk3NTksICA5NzU5LCAgOTM1MSwgIDkzNTEsICA4OTM0LCAgODkzNCwgIDg1MDksICA4NTA5LAotICA4MDc1LCAgODA3NSwgIDc2MzQsICA3NjM0LCAgNzE4NiwgIDcxODYsICA2NzMxLCAgNjczMSwgIDYyNjksICA2MjY5LAotICA1ODAyLCAgNTgwMiwgIDUzMjksICA1MzI5LCAgNDg1MiwgIDQ4NTIsICA0MzY5LCAgNDM2OSwgIDM4ODMsICAzODgzLAotICAzMzkzLCAgMzM5MywgIDI5MDAsICAyOTAwLCAgMjQwNCwgIDI0MDQsICAxOTA1LCAgMTkwNSwgIDE0MDUsICAxNDA1LAotICAgOTA0LCAgIDkwNCwgICA0MDIsICAgNDAyLCAgLTEwMCwgIC0xMDAsICAtNjAzLCAgLTYwMywgLTExMDUsIC0xMTA1LAotIC0xNjA1LCAtMTYwNSwgLTIxMDUsIC0yMTA1LCAtMjYwMiwgLTI2MDIsIC0zMDk3LCAtMzA5NywgLTM1ODksIC0zNTg5LAotIC00MDc4LCAtNDA3OCwgLTQ1NjMsIC00NTYzLCAtNTA0MywgLTUwNDMsIC01NTE5LCAtNTUxOSwgLTU5OTAsIC01OTkwLAotIC02NDU1LCAtNjQ1NSwgLTY5MTQsIC02OTE0LCAtNzM2NiwgLTczNjYsIC03ODExLCAtNzgxMSwgLTgyNDksIC04MjQ5LAotIC04NjgwLCAtODY4MCwgLTkxMDIsIC05MTAyLCAtOTUxNiwgLTk1MTYsIC05OTIwLCAtOTkyMCwgLTEwMzE1LCAtMTAzMTUsCistOTE4NSwgLTkxODUsIC04NzY1LCAtODc2NSwgLTgzMzYsIC04MzM2LCAtNzkwMCwgLTc5MDAsIC03NDU2LCAtNzQ1NiwKKy03MDA1LCAtNzAwNSwgLTY1NDcsIC02NTQ3LCAtNjA4MywgLTYwODMsIC01NjE0LCAtNTYxNCwgLTUxMzksIC01MTM5LAorLTQ2NTksIC00NjU5LCAtNDE3NSwgLTQxNzUsIC0zNjg3LCAtMzY4NywgLTMxOTYsIC0zMTk2LCAtMjcwMSwgLTI3MDEsCistMjIwNCwgLTIyMDQsIC0xNzA1LCAtMTcwNSwgLTEyMDUsIC0xMjA1LCAgLTcwMywgIC03MDMsICAtMjAxLCAgLTIwMSwKKzMwMSwgICAzMDEsICAgODAzLCAgIDgwMywgIDEzMDUsICAxMzA1LCAgMTgwNSwgIDE4MDUsICAyMzA0LCAgMjMwNCwKKzI4MDEsICAyODAxLCAgMzI5NCwgIDMyOTQsICAzNzg1LCAgMzc4NSwgIDQyNzIsICA0MjcyLCAgNDc1NiwgIDQ3NTYsCis1MjM0LCAgNTIzNCwgIDU3MDgsICA1NzA4LCAgNjE3NiwgIDYxNzYsICA2NjM5LCAgNjYzOSwgIDcwOTUsICA3MDk1LAorNzU0NSwgIDc1NDUsICA3OTg4LCAgNzk4OCwgIDg0MjMsICA4NDIzLCAgODg1MCwgIDg4NTAsICA5MjY4LCAgOTI2OCwKKzk2NzksICA5Njc5LCAxMDA3OSwgMTAwNzksIDEwNDcxLCAxMDQ3MSwgMTA4NTMsIDEwODUzLCAxMTIyNCwgMTEyMjQsCisxMTU4NSwgMTE1ODUsIDExOTM1LCAxMTkzNSwgMTIyNzMsIDEyMjczLCAxMjYwMCwgMTI2MDAsIDEyOTE2LCAxMjkxNiwKKzEzMjE5LCAxMzIxOSwgMTM1MTAsIDEzNTEwLCAxMzc4OCwgMTM3ODgsIDE0MDUzLCAxNDA1MywgMTQzMDQsIDE0MzA0LAorMTQ1NDMsIDE0NTQzLCAxNDc2NywgMTQ3NjcsIDE0OTc4LCAxNDk3OCwgMTUxNzUsIDE1MTc1LCAxNTM1NywgMTUzNTcsCisxNTUyNSwgMTU1MjUsIDE1Njc4LCAxNTY3OCwgMTU4MTcsIDE1ODE3LCAxNTk0MCwgMTU5NDAsIDE2MDQ5LCAxNjA0OSwKKzE2MTQyLCAxNjE0MiwgMTYyMjEsIDE2MjIxLCAxNjI4NCwgMTYyODQsIDE2MzMxLCAxNjMzMSwgMTYzNjQsIDE2MzY0LAorMTYzODEsIDE2MzgxLCAxNjM4MiwgMTYzODIsIDE2MzY4LCAxNjM2OCwgMTYzMzksIDE2MzM5LCAxNjI5NCwgMTYyOTQsCisxNjIzNCwgMTYyMzQsIDE2MTU5LCAxNjE1OSwgMTYwNjksIDE2MDY5LCAxNTk2MywgMTU5NjMsIDE1ODQyLCAxNTg0MiwKKzE1NzA3LCAxNTcwNywgMTU1NTcsIDE1NTU3LCAxNTM5MiwgMTUzOTIsIDE1MjEyLCAxNTIxMiwgMTUwMTgsIDE1MDE4LAorMTQ4MTAsIDE0ODEwLCAxNDU4OSwgMTQ1ODksIDE0MzUzLCAxNDM1MywgMTQxMDQsIDE0MTA0LCAxMzg0MiwgMTM4NDIsCisxMzU2NiwgMTM1NjYsIDEzMjc4LCAxMzI3OCwgMTI5NzcsIDEyOTc3LCAxMjY2NSwgMTI2NjUsIDEyMzQwLCAxMjM0MCwKKzEyMDAzLCAxMjAwMywgMTE2NTYsIDExNjU2LCAxMTI5NywgMTEyOTcsIDEwOTI4LCAxMDkyOCwgMTA1NDgsIDEwNTQ4LAorMTAxNTksIDEwMTU5LCAgOTc1OSwgIDk3NTksICA5MzUxLCAgOTM1MSwgIDg5MzQsICA4OTM0LCAgODUwOSwgIDg1MDksCis4MDc1LCAgODA3NSwgIDc2MzQsICA3NjM0LCAgNzE4NiwgIDcxODYsICA2NzMxLCAgNjczMSwgIDYyNjksICA2MjY5LAorNTgwMiwgIDU4MDIsICA1MzI5LCAgNTMyOSwgIDQ4NTIsICA0ODUyLCAgNDM2OSwgIDQzNjksICAzODgzLCAgMzg4MywKKzMzOTMsICAzMzkzLCAgMjkwMCwgIDI5MDAsICAyNDA0LCAgMjQwNCwgIDE5MDUsICAxOTA1LCAgMTQwNSwgIDE0MDUsCis5MDQsICAgOTA0LCAgIDQwMiwgICA0MDIsICAtMTAwLCAgLTEwMCwgIC02MDMsICAtNjAzLCAtMTEwNSwgLTExMDUsCistMTYwNSwgLTE2MDUsIC0yMTA1LCAtMjEwNSwgLTI2MDIsIC0yNjAyLCAtMzA5NywgLTMwOTcsIC0zNTg5LCAtMzU4OSwKKy00MDc4LCAtNDA3OCwgLTQ1NjMsIC00NTYzLCAtNTA0MywgLTUwNDMsIC01NTE5LCAtNTUxOSwgLTU5OTAsIC01OTkwLAorLTY0NTUsIC02NDU1LCAtNjkxNCwgLTY5MTQsIC03MzY2LCAtNzM2NiwgLTc4MTEsIC03ODExLCAtODI0OSwgLTgyNDksCistODY4MCwgLTg2ODAsIC05MTAyLCAtOTEwMiwgLTk1MTYsIC05NTE2LCAtOTkyMCwgLTk5MjAsIC0xMDMxNSwgLTEwMzE1LAogLTEwNzAxLCAtMTA3MDEsIC0xMTA3NywgLTExMDc3LCAtMTE0NDIsIC0xMTQ0MiwgLTExNzk2LCAtMTE3OTYsIC0xMjEzOSwgLTEyMTM5LAogLTEyNDcxLCAtMTI0NzEsIC0xMjc5MSwgLTEyNzkxLCAtMTMwOTksIC0xMzA5OSwgLTEzMzk1LCAtMTMzOTUsIC0xMzY3OCwgLTEzNjc4LAogLTEzOTQ4LCAtMTM5NDgsIC0xNDIwNSwgLTE0MjA1LCAtMTQ0NDksIC0xNDQ0OSwgLTE0Njc5LCAtMTQ2NzksIC0xNDg5NSwgLTE0ODk1LApAQCAtMzIxLDM1ICszNDksMzUgQEAKIC0xNDIwNSwgLTE0MjA1LCAtMTM5NDgsIC0xMzk0OCwgLTEzNjc4LCAtMTM2NzgsIC0xMzM5NSwgLTEzMzk1LCAtMTMwOTksIC0xMzA5OSwKIC0xMjc5MSwgLTEyNzkxLCAtMTI0NzEsIC0xMjQ3MSwgLTEyMTM5LCAtMTIxMzksIC0xMTc5NiwgLTExNzk2LCAtMTE0NDIsIC0xMTQ0MiwKIC0xMTA3NywgLTExMDc3LCAtMTA3MDEsIC0xMDcwMSwgLTEwMzE1LCAtMTAzMTUsIC05OTIwLCAtOTkyMCwgLTk1MTYsIC05NTE2LAotIC05MTAyLCAtOTEwMiwgLTg2ODAsIC04NjgwLCAtODI0OSwgLTgyNDksIC03ODExLCAtNzgxMSwgLTczNjYsIC03MzY2LAotIC02OTE0LCAtNjkxNCwgLTY0NTUsIC02NDU1LCAtNTk5MCwgLTU5OTAsIC01NTE5LCAtNTUxOSwgLTUwNDMsIC01MDQzLAotIC00NTYzLCAtNDU2MywgLTQwNzgsIC00MDc4LCAtMzU4OSwgLTM1ODksIC0zMDk3LCAtMzA5NywgLTI2MDIsIC0yNjAyLAotIC0yMTA1LCAtMjEwNSwgLTE2MDUsIC0xNjA1LCAtMTEwNSwgLTExMDUsICAtNjAzLCAgLTYwMywgIC0xMDAsICAtMTAwLAotICAgNDAyLCAgIDQwMiwgICA5MDQsICAgOTA0LCAgMTQwNSwgIDE0MDUsICAxOTA1LCAgMTkwNSwgIDI0MDQsICAyNDA0LAotICAyOTAwLCAgMjkwMCwgIDMzOTMsICAzMzkzLCAgMzg4MywgIDM4ODMsICA0MzY5LCAgNDM2OSwgIDQ4NTIsICA0ODUyLAotICA1MzI5LCAgNTMyOSwgIDU4MDIsICA1ODAyLCAgNjI2OSwgIDYyNjksICA2NzMxLCAgNjczMSwgIDcxODYsICA3MTg2LAotICA3NjM0LCAgNzYzNCwgIDgwNzUsICA4MDc1LCAgODUwOSwgIDg1MDksICA4OTM0LCAgODkzNCwgIDkzNTEsICA5MzUxLAotICA5NzU5LCAgOTc1OSwgMTAxNTksIDEwMTU5LCAxMDU0OCwgMTA1NDgsIDEwOTI4LCAxMDkyOCwgMTEyOTcsIDExMjk3LAotIDExNjU2LCAxMTY1NiwgMTIwMDMsIDEyMDAzLCAxMjM0MCwgMTIzNDAsIDEyNjY1LCAxMjY2NSwgMTI5NzcsIDEyOTc3LAotIDEzMjc4LCAxMzI3OCwgMTM1NjYsIDEzNTY2LCAxMzg0MiwgMTM4NDIsIDE0MTA0LCAxNDEwNCwgMTQzNTMsIDE0MzUzLAotIDE0NTg5LCAxNDU4OSwgMTQ4MTAsIDE0ODEwLCAxNTAxOCwgMTUwMTgsIDE1MjEyLCAxNTIxMiwgMTUzOTIsIDE1MzkyLAotIDE1NTU3LCAxNTU1NywgMTU3MDcsIDE1NzA3LCAxNTg0MiwgMTU4NDIsIDE1OTYzLCAxNTk2MywgMTYwNjksIDE2MDY5LAotIDE2MTU5LCAxNjE1OSwgMTYyMzQsIDE2MjM0LCAxNjI5NCwgMTYyOTQsIDE2MzM5LCAxNjMzOSwgMTYzNjgsIDE2MzY4LAotIDE2MzgyLCAxNjM4MiwgMTYzODEsIDE2MzgxLCAxNjM2NCwgMTYzNjQsIDE2MzMxLCAxNjMzMSwgMTYyODQsIDE2Mjg0LAotIDE2MjIxLCAxNjIyMSwgMTYxNDIsIDE2MTQyLCAxNjA0OSwgMTYwNDksIDE1OTQwLCAxNTk0MCwgMTU4MTcsIDE1ODE3LAotIDE1Njc4LCAxNTY3OCwgMTU1MjUsIDE1NTI1LCAxNTM1NywgMTUzNTcsIDE1MTc1LCAxNTE3NSwgMTQ5NzgsIDE0OTc4LAotIDE0NzY3LCAxNDc2NywgMTQ1NDMsIDE0NTQzLCAxNDMwNCwgMTQzMDQsIDE0MDUzLCAxNDA1MywgMTM3ODgsIDEzNzg4LAotIDEzNTEwLCAxMzUxMCwgMTMyMTksIDEzMjE5LCAxMjkxNiwgMTI5MTYsIDEyNjAwLCAxMjYwMCwgMTIyNzMsIDEyMjczLAotIDExOTM1LCAxMTkzNSwgMTE1ODUsIDExNTg1LCAxMTIyNCwgMTEyMjQsIDEwODUzLCAxMDg1MywgMTA0NzEsIDEwNDcxLAotIDEwMDc5LCAxMDA3OSwgIDk2NzksICA5Njc5LCAgOTI2OCwgIDkyNjgsICA4ODUwLCAgODg1MCwgIDg0MjMsICA4NDIzLAotICA3OTg4LCAgNzk4OCwgIDc1NDUsICA3NTQ1LCAgNzA5NSwgIDcwOTUsICA2NjM5LCAgNjYzOSwgIDYxNzYsICA2MTc2LAotICA1NzA4LCAgNTcwOCwgIDUyMzQsICA1MjM0LCAgNDc1NiwgIDQ3NTYsICA0MjcyLCAgNDI3MiwgIDM3ODUsICAzNzg1LAotICAzMjk0LCAgMzI5NCwgIDI4MDEsICAyODAxLCAgMjMwNCwgIDIzMDQsICAxODA1LCAgMTgwNSwgIDEzMDUsICAxMzA1LAotICAgODAzLCAgIDgwMywgICAzMDEsICAgMzAxLCAgLTIwMSwgIC0yMDEsICAtNzAzLCAgLTcwMywgLTEyMDUsIC0xMjA1LAotIC0xNzA1LCAtMTcwNSwgLTIyMDQsIC0yMjA0LCAtMjcwMSwgLTI3MDEsIC0zMTk2LCAtMzE5NiwgLTM2ODcsIC0zNjg3LAotIC00MTc1LCAtNDE3NSwgLTQ2NTksIC00NjU5LCAtNTEzOSwgLTUxMzksIC01NjE0LCAtNTYxNCwgLTYwODMsIC02MDgzLAotIC02NTQ3LCAtNjU0NywgLTcwMDUsIC03MDA1LCAtNzQ1NiwgLTc0NTYsIC03OTAwLCAtNzkwMCwgLTgzMzYsIC04MzM2LAotIC04NzY1LCAtODc2NSwgLTkxODUsIC05MTg1LCAtOTU5NywgLTk1OTcsIC0xMDAwMCwgLTEwMDAwLCAtMTAzOTMsIC0xMDM5MywKKy05MTAyLCAtOTEwMiwgLTg2ODAsIC04NjgwLCAtODI0OSwgLTgyNDksIC03ODExLCAtNzgxMSwgLTczNjYsIC03MzY2LAorLTY5MTQsIC02OTE0LCAtNjQ1NSwgLTY0NTUsIC01OTkwLCAtNTk5MCwgLTU1MTksIC01NTE5LCAtNTA0MywgLTUwNDMsCistNDU2MywgLTQ1NjMsIC00MDc4LCAtNDA3OCwgLTM1ODksIC0zNTg5LCAtMzA5NywgLTMwOTcsIC0yNjAyLCAtMjYwMiwKKy0yMTA1LCAtMjEwNSwgLTE2MDUsIC0xNjA1LCAtMTEwNSwgLTExMDUsICAtNjAzLCAgLTYwMywgIC0xMDAsICAtMTAwLAorNDAyLCAgIDQwMiwgICA5MDQsICAgOTA0LCAgMTQwNSwgIDE0MDUsICAxOTA1LCAgMTkwNSwgIDI0MDQsICAyNDA0LAorMjkwMCwgIDI5MDAsICAzMzkzLCAgMzM5MywgIDM4ODMsICAzODgzLCAgNDM2OSwgIDQzNjksICA0ODUyLCAgNDg1MiwKKzUzMjksICA1MzI5LCAgNTgwMiwgIDU4MDIsICA2MjY5LCAgNjI2OSwgIDY3MzEsICA2NzMxLCAgNzE4NiwgIDcxODYsCis3NjM0LCAgNzYzNCwgIDgwNzUsICA4MDc1LCAgODUwOSwgIDg1MDksICA4OTM0LCAgODkzNCwgIDkzNTEsICA5MzUxLAorOTc1OSwgIDk3NTksIDEwMTU5LCAxMDE1OSwgMTA1NDgsIDEwNTQ4LCAxMDkyOCwgMTA5MjgsIDExMjk3LCAxMTI5NywKKzExNjU2LCAxMTY1NiwgMTIwMDMsIDEyMDAzLCAxMjM0MCwgMTIzNDAsIDEyNjY1LCAxMjY2NSwgMTI5NzcsIDEyOTc3LAorMTMyNzgsIDEzMjc4LCAxMzU2NiwgMTM1NjYsIDEzODQyLCAxMzg0MiwgMTQxMDQsIDE0MTA0LCAxNDM1MywgMTQzNTMsCisxNDU4OSwgMTQ1ODksIDE0ODEwLCAxNDgxMCwgMTUwMTgsIDE1MDE4LCAxNTIxMiwgMTUyMTIsIDE1MzkyLCAxNTM5MiwKKzE1NTU3LCAxNTU1NywgMTU3MDcsIDE1NzA3LCAxNTg0MiwgMTU4NDIsIDE1OTYzLCAxNTk2MywgMTYwNjksIDE2MDY5LAorMTYxNTksIDE2MTU5LCAxNjIzNCwgMTYyMzQsIDE2Mjk0LCAxNjI5NCwgMTYzMzksIDE2MzM5LCAxNjM2OCwgMTYzNjgsCisxNjM4MiwgMTYzODIsIDE2MzgxLCAxNjM4MSwgMTYzNjQsIDE2MzY0LCAxNjMzMSwgMTYzMzEsIDE2Mjg0LCAxNjI4NCwKKzE2MjIxLCAxNjIyMSwgMTYxNDIsIDE2MTQyLCAxNjA0OSwgMTYwNDksIDE1OTQwLCAxNTk0MCwgMTU4MTcsIDE1ODE3LAorMTU2NzgsIDE1Njc4LCAxNTUyNSwgMTU1MjUsIDE1MzU3LCAxNTM1NywgMTUxNzUsIDE1MTc1LCAxNDk3OCwgMTQ5NzgsCisxNDc2NywgMTQ3NjcsIDE0NTQzLCAxNDU0MywgMTQzMDQsIDE0MzA0LCAxNDA1MywgMTQwNTMsIDEzNzg4LCAxMzc4OCwKKzEzNTEwLCAxMzUxMCwgMTMyMTksIDEzMjE5LCAxMjkxNiwgMTI5MTYsIDEyNjAwLCAxMjYwMCwgMTIyNzMsIDEyMjczLAorMTE5MzUsIDExOTM1LCAxMTU4NSwgMTE1ODUsIDExMjI0LCAxMTIyNCwgMTA4NTMsIDEwODUzLCAxMDQ3MSwgMTA0NzEsCisxMDA3OSwgMTAwNzksICA5Njc5LCAgOTY3OSwgIDkyNjgsICA5MjY4LCAgODg1MCwgIDg4NTAsICA4NDIzLCAgODQyMywKKzc5ODgsICA3OTg4LCAgNzU0NSwgIDc1NDUsICA3MDk1LCAgNzA5NSwgIDY2MzksICA2NjM5LCAgNjE3NiwgIDYxNzYsCis1NzA4LCAgNTcwOCwgIDUyMzQsICA1MjM0LCAgNDc1NiwgIDQ3NTYsICA0MjcyLCAgNDI3MiwgIDM3ODUsICAzNzg1LAorMzI5NCwgIDMyOTQsICAyODAxLCAgMjgwMSwgIDIzMDQsICAyMzA0LCAgMTgwNSwgIDE4MDUsICAxMzA1LCAgMTMwNSwKKzgwMywgICA4MDMsICAgMzAxLCAgIDMwMSwgIC0yMDEsICAtMjAxLCAgLTcwMywgIC03MDMsIC0xMjA1LCAtMTIwNSwKKy0xNzA1LCAtMTcwNSwgLTIyMDQsIC0yMjA0LCAtMjcwMSwgLTI3MDEsIC0zMTk2LCAtMzE5NiwgLTM2ODcsIC0zNjg3LAorLTQxNzUsIC00MTc1LCAtNDY1OSwgLTQ2NTksIC01MTM5LCAtNTEzOSwgLTU2MTQsIC01NjE0LCAtNjA4MywgLTYwODMsCistNjU0NywgLTY1NDcsIC03MDA1LCAtNzAwNSwgLTc0NTYsIC03NDU2LCAtNzkwMCwgLTc5MDAsIC04MzM2LCAtODMzNiwKKy04NzY1LCAtODc2NSwgLTkxODUsIC05MTg1LCAtOTU5NywgLTk1OTcsIC0xMDAwMCwgLTEwMDAwLCAtMTAzOTMsIC0xMDM5MywKIC0xMDc3NywgLTEwNzc3LCAtMTExNTAsIC0xMTE1MCwgLTExNTEzLCAtMTE1MTMsIC0xMTg2NiwgLTExODY2LCAtMTIyMDcsIC0xMjIwNywKIC0xMjUzNiwgLTEyNTM2LCAtMTI4NTQsIC0xMjg1NCwgLTEzMTU5LCAtMTMxNTksIC0xMzQ1MiwgLTEzNDUyLCAtMTM3MzMsIC0xMzczMywKIC0xNDAwMSwgLTE0MDAxLCAtMTQyNTUsIC0xNDI1NSwgLTE0NDk2LCAtMTQ0OTYsIC0xNDcyMywgLTE0NzIzLCAtMTQ5MzcsIC0xNDkzNywKQEAgLTM2MiwxMCArMzkwLDEwIEBACiAtMTQxNTUsIC0xNDE1NSwgLTEzODk1LCAtMTM4OTUsIC0xMzYyMiwgLTEzNjIyLCAtMTMzMzcsIC0xMzMzNywgLTEzMDM4LCAtMTMwMzgsCiAtMTI3MjgsIC0xMjcyOCwgLTEyNDA2LCAtMTI0MDYsIC0xMjA3MiwgLTEyMDcyLCAtMTE3MjYsIC0xMTcyNiwgLTExMzcwLCAtMTEzNzAsCiAtMTEwMDIsIC0xMTAwMiwgLTEwNjI1LCAtMTA2MjUsIC0xMDIzNywgLTEwMjM3LCAtOTg0MCwgLTk4NDAsIC05NDM0LCAtOTQzNCwKLSAtOTAxOCwgLTkwMTgsIC04NTk0LCAtODU5NCwgLTgxNjIsIC04MTYyLCAtNzcyMywgLTc3MjMsIC03Mjc2LCAtNzI3NiwKLSAtNjgyMiwgLTY4MjIsIC02MzYyLCAtNjM2MiwgLTU4OTYsIC01ODk2LCAtNTQyNCwgLTU0MjQsIC00OTQ4LCAtNDk0OCwKLSAtNDQ2NiwgLTQ0NjYsIC0zOTgwLCAtMzk4MCwgLTM0OTEsIC0zNDkxLCAtMjk5OCwgLTI5OTgsIC0yNTAzLCAtMjUwMywKLSAtMjAwNSwgLTIwMDUsIC0xNTA1LCAtMTUwNSwgLTEwMDQsIC0xMDA0LCAgLTUwMiwgIC01MDIKKy05MDE4LCAtOTAxOCwgLTg1OTQsIC04NTk0LCAtODE2MiwgLTgxNjIsIC03NzIzLCAtNzcyMywgLTcyNzYsIC03Mjc2LAorLTY4MjIsIC02ODIyLCAtNjM2MiwgLTYzNjIsIC01ODk2LCAtNTg5NiwgLTU0MjQsIC01NDI0LCAtNDk0OCwgLTQ5NDgsCistNDQ2NiwgLTQ0NjYsIC0zOTgwLCAtMzk4MCwgLTM0OTEsIC0zNDkxLCAtMjk5OCwgLTI5OTgsIC0yNTAzLCAtMjUwMywKKy0yMDA1LCAtMjAwNSwgLTE1MDUsIC0xNTA1LCAtMTAwNCwgLTEwMDQsICAtNTAyLCAgLTUwMgogfTsKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHZvaWQKQEAgLTM3NSwxMCArNDAzLDEyIEBACiB1bnNpZ25lZCBjaGFyICpwMjsKIHN0cnVjdCBkYXRhX2J1ZmZlciAqcGF1ZGlvX2J1ZmZlcjsKIAotSk9UKDgsICIlaT1hdWRpb19maWxsXG4iLCBhdWRpb19maWxsKTsKLQoraWYgKE5VTEwgPT0gcGVhc3ljYXApIHsKKwlTQVkoIkVSUk9SOiBwZWFzeWNhcCBpcyBOVUxMXG4iKTsKKwlyZXR1cm47Cit9CitKT00oOCwgIiVpPWF1ZGlvX2ZpbGxcbiIsIGF1ZGlvX2ZpbGwpOwogcGF1ZGlvX2J1ZmZlciA9ICZwZWFzeWNhcC0+YXVkaW9fYnVmZmVyW2F1ZGlvX2ZpbGxdOwotCiBwMiA9ICh1bnNpZ25lZCBjaGFyICopKHBhdWRpb19idWZmZXItPnBnbyk7CiBmb3IgKGkxID0gMDsgIGkxIDwgUEFHRV9TSVpFOyAgaTEgKz0gNCwgcDIgKz0gNCkgewogCSpwMiAgICAgICA9ICh1bnNpZ25lZCBjaGFyKSAoMHgwMEZGICYgdG9uZXNbaTEvMl0pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2V0MTMxeC9ldDEzMXhfaW5pdHBjaS5jIGIvZHJpdmVycy9zdGFnaW5nL2V0MTMxeC9ldDEzMXhfaW5pdHBjaS5jCmluZGV4IDEwYmNiNDUuLmY2MmJhN2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ldDEzMXgvZXQxMzF4X2luaXRwY2kuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZXQxMzF4L2V0MTMxeF9pbml0cGNpLmMKQEAgLTc4Myw3ICs3ODMsNyBAQAogCS8qIFJldHJpZXZlIHRoZSBuZXRfZGV2aWNlIHBvaW50ZXIgZnJvbSB0aGUgcGNpX2RldiBzdHJ1Y3QsIGFzIHdlbGwKIAkgKiBhcyB0aGUgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdAogCSAqLwotCW5ldGRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisJbmV0ZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOwogCWFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwogCiAJLyogUGVyZm9ybSBkZXZpY2UgY2xlYW51cCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2Zyb250aWVyL2FscGhhdHJhY2suYyBiL2RyaXZlcnMvc3RhZ2luZy9mcm9udGllci9hbHBoYXRyYWNrLmMKaW5kZXggZWY3ZmJmOC4uMmJhYmIwMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2Zyb250aWVyL2FscGhhdHJhY2suYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZnJvbnRpZXIvYWxwaGF0cmFjay5jCkBAIC04OSw3ICs4OSw3IEBACiAKIC8qIFVzZSBvdXIgb3duIGRiZyBtYWNybyAqLwogI2RlZmluZSBkYmdfaW5mbyhkZXYsIGZvcm1hdCwgYXJnLi4uKSBkbyBcCi0gICAgeyBpZiAoZGVidWcpIGRldl9pbmZvKGRldiAsIGZvcm1hdCAsICMjIGFyZyk7IH0gd2hpbGUgKDApCisJeyBpZiAoZGVidWcpIGRldl9pbmZvKGRldiAsIGZvcm1hdCAsICMjIGFyZyk7IH0gd2hpbGUgKDApCiAKICNkZWZpbmUgYWxwaGF0cmFja19vY21kX2luZm8oZGV2LCBjbWQsIGZvcm1hdCwgYXJnLi4uKQogCkBAIC03NjksNyArNzY5LDcgQEAKIAl9CiAKIAlkZXYtPndyaXRlX2J1ZmZlciA9Ci0JICAgIGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBhbHBoYXRyYWNrX29jbWQpICogdHJ1ZV9zaXplLCBHRlBfS0VSTkVMKTsKKwkgICAga21hbGxvYyh0cnVlX3NpemUgKiBzaXplb2Yoc3RydWN0IGFscGhhdHJhY2tfb2NtZCksIEdGUF9LRVJORUwpOwogCiAJaWYgKCFkZXYtPndyaXRlX2J1ZmZlcikgewogCQlkZXZfZXJyKCZpbnRmLT5kZXYsICJDb3VsZG4ndCBhbGxvY2F0ZSB3cml0ZV9idWZmZXJcbiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2Z0MTAwMC9mdDEwMDAtcGNtY2lhL2Z0MTAwMF9ody5jIGIvZHJpdmVycy9zdGFnaW5nL2Z0MTAwMC9mdDEwMDAtcGNtY2lhL2Z0MTAwMF9ody5jCmluZGV4IGVlZDdlOTQuLjU4OGFmZDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9mdDEwMDAvZnQxMDAwLXBjbWNpYS9mdDEwMDBfaHcuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZnQxMDAwL2Z0MTAwMC1wY21jaWEvZnQxMDAwX2h3LmMKQEAgLTEzMiw3ICsxMzIsNyBAQAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIHN0YXRpYyBpbmxpbmUgdTE2IGZ0MTAwMF9yZWFkX2ZpZm9fbGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7Ci0JRlQxMDAwX0lORk8gKmluZm8gPSAoRlQxMDAwX0lORk8gKikgbmV0ZGV2X3ByaXYoZGV2KTsKKwlGVDEwMDBfSU5GTyAqaW5mbyA9IG5ldGRldl9wcml2KGRldik7CiAKIAlpZiAoaW5mby0+QXNpY0lEID09IEVMRUNUUkFCVVpaX0lEKSB7CiAJCXJldHVybiAoZnQxMDAwX3JlYWRfcmVnKGRldiwgRlQxMDAwX1JFR19VRklGT19TVEFUKSAtIDE2KTsKQEAgLTE1NSw3ICsxNTUsNyBAQAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIHUxNiBmdDEwMDBfcmVhZF9kcHJhbShzdHJ1Y3QgbmV0X2RldmljZSAqIGRldiwgaW50IG9mZnNldCkKIHsKLQlGVDEwMDBfSU5GTyAqaW5mbyA9IChGVDEwMDBfSU5GTyAqKSBuZXRkZXZfcHJpdihkZXYpOworCUZUMTAwMF9JTkZPICppbmZvID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXUxNiBkYXRhOwogCkBAIC0xODQsNyArMTg0LDcgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBmdDEwMDBfd3JpdGVfZHByYW0oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKIAkJCQkJICBpbnQgb2Zmc2V0LCB1MTYgdmFsdWUpCiB7Ci0JRlQxMDAwX0lORk8gKmluZm8gPSAoRlQxMDAwX0lORk8gKikgbmV0ZGV2X3ByaXYoZGV2KTsKKwlGVDEwMDBfSU5GTyAqaW5mbyA9IG5ldGRldl9wcml2KGRldik7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCS8vIFByb3ZpZGUgbXV0dWFsIGV4Y2x1c2l2ZSBhY2Nlc3Mgd2hpbGUgcmVhZGluZyBBU0lDIHJlZ2lzdGVycy4KQEAgLTIwOCw3ICsyMDgsNyBAQAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIHUxNiBmdDEwMDBfcmVhZF9kcHJhbV9tYWdfMTYoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG9mZnNldCwgaW50IEluZGV4KQogewotCUZUMTAwMF9JTkZPICppbmZvID0gKEZUMTAwMF9JTkZPICopIG5ldGRldl9wcml2KGRldik7CisJRlQxMDAwX0lORk8gKmluZm8gPSBuZXRkZXZfcHJpdihkZXYpOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdTE2IGRhdGE7CiAKQEAgLTI0Miw3ICsyNDIsNyBAQAogc3RhdGljIGlubGluZSB2b2lkIGZ0MTAwMF93cml0ZV9kcHJhbV9tYWdfMTYoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKIAkJCQkJCSBpbnQgb2Zmc2V0LCB1MTYgdmFsdWUsIGludCBJbmRleCkKIHsKLQlGVDEwMDBfSU5GTyAqaW5mbyA9IChGVDEwMDBfSU5GTyAqKSBuZXRkZXZfcHJpdihkZXYpOworCUZUMTAwMF9JTkZPICppbmZvID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJLy8gUHJvdmlkZSBtdXR1YWwgZXhjbHVzaXZlIGFjY2VzcyB3aGlsZSByZWFkaW5nIEFTSUMgcmVnaXN0ZXJzLgpAQCAtMjcwLDcgKzI3MCw3IEBACiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogdTMyIGZ0MTAwMF9yZWFkX2RwcmFtX21hZ18zMihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgb2Zmc2V0KQogewotCUZUMTAwMF9JTkZPICppbmZvID0gKEZUMTAwMF9JTkZPICopIG5ldGRldl9wcml2KGRldik7CisJRlQxMDAwX0lORk8gKmluZm8gPSBuZXRkZXZfcHJpdihkZXYpOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdTMyIGRhdGE7CiAKQEAgLTI5OCw3ICsyOTgsNyBAQAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIHZvaWQgZnQxMDAwX3dyaXRlX2RwcmFtX21hZ18zMihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgb2Zmc2V0LCB1MzIgdmFsdWUpCiB7Ci0JRlQxMDAwX0lORk8gKmluZm8gPSAoRlQxMDAwX0lORk8gKikgbmV0ZGV2X3ByaXYoZGV2KTsKKwlGVDEwMDBfSU5GTyAqaW5mbyA9IG5ldGRldl9wcml2KGRldik7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCS8vIFByb3ZpZGUgbXV0dWFsIGV4Y2x1c2l2ZSBhY2Nlc3Mgd2hpbGUgcmVhZGluZyBBU0lDIHJlZ2lzdGVycy4KQEAgLTMyMCw3ICszMjAsNyBAQAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIHN0YXRpYyB2b2lkIGZ0MTAwMF9lbmFibGVfaW50ZXJydXB0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewotCUZUMTAwMF9JTkZPICppbmZvID0gKEZUMTAwMF9JTkZPICopIG5ldGRldl9wcml2KGRldik7CisJRlQxMDAwX0lORk8gKmluZm8gPSBuZXRkZXZfcHJpdihkZXYpOwogCXUxNiB0ZW1wd29yZDsKIAogCURFQlVHKDEsICJmdDEwMDBfaHc6ZnQxMDAwX2VuYWJsZV9pbnRlcnJ1cHRzKClcbiIpOwpAQCAtMzQ1LDcgKzM0NSw3IEBACiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogc3RhdGljIHZvaWQgZnQxMDAwX2Rpc2FibGVfaW50ZXJydXB0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewotCUZUMTAwMF9JTkZPICppbmZvID0gKEZUMTAwMF9JTkZPICopIG5ldGRldl9wcml2KGRldik7CisJRlQxMDAwX0lORk8gKmluZm8gPSBuZXRkZXZfcHJpdihkZXYpOwogCXUxNiB0ZW1wd29yZDsKIAogCURFQlVHKDEsICJmdDEwMDBfaHc6IGZ0MTAwMF9kaXNhYmxlX2ludGVycnVwdHMoKVxuIik7CkBAIC0zNzAsNyArMzcwLDcgQEAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBzdGF0aWMgdm9pZCBmdDEwMDBfcmVzZXRfYXNpYyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewotCUZUMTAwMF9JTkZPICppbmZvID0gKEZUMTAwMF9JTkZPICopIG5ldGRldl9wcml2KGRldik7CisJRlQxMDAwX0lORk8gKmluZm8gPSBuZXRkZXZfcHJpdihkZXYpOwogCXUxNiB0ZW1wd29yZDsKIAogCURFQlVHKDEsICJmdDEwMDBfaHc6ZnQxMDAwX3Jlc2V0X2FzaWMgY2FsbGVkXG4iKTsKQEAgLTQxNCw3ICs0MTQsNyBAQAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIHN0YXRpYyBpbnQgZnQxMDAwX3Jlc2V0X2NhcmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKLQlGVDEwMDBfSU5GTyAqaW5mbyA9IChGVDEwMDBfSU5GTyAqKSBuZXRkZXZfcHJpdihkZXYpOworCUZUMTAwMF9JTkZPICppbmZvID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAl1MTYgdGVtcHdvcmQ7CiAJaW50IGk7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKQEAgLTYxOCw3ICs2MTgsNyBAQAogCUZUMTAwMF9JTkZPICppbmZvOwogCVVTSE9SVCB0ZW1wd29yZDsKIAotCWluZm8gPSAoRlQxMDAwX0lORk8gKikgbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbmZvID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAogCWlmIChpbmZvLT5DYXJkUmVhZHkgPT0gMSkgewogCQkvLyBQZXJmb3JtIGRzcCBoZWFydGJlYXQgY2hlY2sKQEAgLTgzMSw3ICs4MzEsNyBAQAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIHZvaWQgZnQxMDAwX3NlbmRfY21kIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MTYgKnB0ZW1wYnVmZmVyLCBpbnQgc2l6ZSwgdTE2IHF0eXBlKQogewotCUZUMTAwMF9JTkZPICppbmZvID0gKEZUMTAwMF9JTkZPICopIG5ldGRldl9wcml2KGRldik7CisJRlQxMDAwX0lORk8gKmluZm8gPSBuZXRkZXZfcHJpdihkZXYpOwogCWludCBpOwogCXUxNiB0ZW1wd29yZDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwpAQCAtOTE2LDcgKzkxNiw3IEBACiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogQk9PTEVBTiBmdDEwMDBfcmVjZWl2ZV9jbWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTE2ICogcGJ1ZmZlciwgaW50IG1heHN6LCB1MTYgKnBueHRwaCkKIHsKLQlGVDEwMDBfSU5GTyAqaW5mbyA9IChGVDEwMDBfSU5GTyAqKSBuZXRkZXZfcHJpdihkZXYpOworCUZUMTAwMF9JTkZPICppbmZvID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAl1MTYgc2l6ZTsKIAl1MTYgKnBwc2V1ZG9oZHI7CiAJaW50IGk7CkBAIC0xMDA5LDcgKzEwMDksNyBAQAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIHZvaWQgZnQxMDAwX3Byb2NfZHJ2bXNnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7Ci0JRlQxMDAwX0lORk8gKmluZm8gPSAoRlQxMDAwX0lORk8gKikgbmV0ZGV2X3ByaXYoZGV2KTsKKwlGVDEwMDBfSU5GTyAqaW5mbyA9IG5ldGRldl9wcml2KGRldik7CiAJdTE2IG1zZ3R5cGU7CiAJdTE2IHRlbXB3b3JkOwogCVBNRURJQU1TRyBwbWVkaWFtc2c7CkBAIC0xMjkyLDcgKzEyOTIsNyBAQAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIGludCBmdDEwMDBfcGFyc2VfZHByYW1fbXNnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7Ci0JRlQxMDAwX0lORk8gKmluZm8gPSAoRlQxMDAwX0lORk8gKikgbmV0ZGV2X3ByaXYoZGV2KTsKKwlGVDEwMDBfSU5GTyAqaW5mbyA9IG5ldGRldl9wcml2KGRldik7CiAJdTE2IGRvb3JiZWxsOwogCXUxNiBwb3J0aWQ7CiAJdTE2IG54dHBoOwpAQCAtMTQ0OSw3ICsxNDQ5LDcgQEAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBzdGF0aWMgdm9pZCBmdDEwMDBfZmx1c2hfZmlmbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MTYgRHJ2RXJyTnVtKQogewotCUZUMTAwMF9JTkZPICppbmZvID0gKEZUMTAwMF9JTkZPICopIG5ldGRldl9wcml2KGRldik7CisJRlQxMDAwX0lORk8gKmluZm8gPSBuZXRkZXZfcHJpdihkZXYpOwogCXUxNiBpOwogCXUzMiB0ZW1wbG9uZzsKIAl1MTYgdGVtcHdvcmQ7CkBAIC0xNTk2LDcgKzE1OTYsNyBAQAogaW50IGZ0MTAwMF9jb3B5X3VwX3BrdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXUxNiB0ZW1wd29yZDsKLQlGVDEwMDBfSU5GTyAqaW5mbyA9IChGVDEwMDBfSU5GTyAqKSBuZXRkZXZfcHJpdihkZXYpOworCUZUMTAwMF9JTkZPICppbmZvID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAl1MTYgbGVuOwogCXN0cnVjdCBza19idWZmICpza2I7CiAJdTE2IGk7CkBAIC0xNzgzLDcgKzE3ODMsNyBAQAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIGludCBmdDEwMDBfY29weV9kb3duX3BrdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MTYgKiBwYWNrZXQsIHUxNiBsZW4pCiB7Ci0JRlQxMDAwX0lORk8gKmluZm8gPSAoRlQxMDAwX0lORk8gKikgbmV0ZGV2X3ByaXYoZGV2KTsKKwlGVDEwMDBfSU5GTyAqaW5mbyA9IG5ldGRldl9wcml2KGRldik7CiAJdW5pb24gewogCQlQU0VVRE9fSERSIGJsazsKIAkJdTE2IGJ1ZmZbc2l6ZW9mKFBTRVVET19IRFIpID4+IDFdOwpAQCAtMTk0Myw3ICsxOTQzLDcgQEAKIAogc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpmdDEwMDBfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKLQlGVDEwMDBfSU5GTyAqaW5mbyA9IChGVDEwMDBfSU5GTyAqKSBuZXRkZXZfcHJpdihkZXYpOworCUZUMTAwMF9JTkZPICppbmZvID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlyZXR1cm4gKCZpbmZvLT5zdGF0cyk7CiB9CiAKQEAgLTE5NjcsNyArMTk2Nyw3IEBACiAKIHN0YXRpYyBpbnQgZnQxMDAwX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7Ci0JRlQxMDAwX0lORk8gKmluZm8gPSAoRlQxMDAwX0lORk8gKikgbmV0ZGV2X3ByaXYoZGV2KTsKKwlGVDEwMDBfSU5GTyAqaW5mbyA9IG5ldGRldl9wcml2KGRldik7CiAKIAlERUJVRygwLCAiZnQxMDAwX2h3OiBmdDEwMDBfY2xvc2UoKVxuIik7CiAKQEAgLTE5ODksNyArMTk4OSw3IEBACiAKIHN0YXRpYyBpbnQgZnQxMDAwX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKLQlGVDEwMDBfSU5GTyAqaW5mbyA9IChGVDEwMDBfSU5GTyAqKSBuZXRkZXZfcHJpdihkZXYpOworCUZUMTAwMF9JTkZPICppbmZvID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAl1OCAqcGRhdGE7CiAKIAlERUJVRygxLCAiZnQxMDAwX2h3OiBmdDEwMDBfc3RhcnRfeG1pdCgpXG4iKTsKQEAgLTIwMjYsNyArMjAyNiw3IEBACiBzdGF0aWMgaXJxcmV0dXJuX3QgZnQxMDAwX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQpCiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKWRldl9pZDsKLQlGVDEwMDBfSU5GTyAqaW5mbyA9IChGVDEwMDBfSU5GTyAqKSBuZXRkZXZfcHJpdihkZXYpOworCUZUMTAwMF9JTkZPICppbmZvID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAl1MTYgdGVtcHdvcmQ7CiAJdTE2IGludHR5cGU7CiAJaW50IGNudDsKQEAgLTIwOTEsNyArMjA5MSw3IEBACiAKIHZvaWQgc3RvcF9mdDEwMDBfY2FyZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewotCUZUMTAwMF9JTkZPICppbmZvID0gKEZUMTAwMF9JTkZPICopIG5ldGRldl9wcml2KGRldik7CisJRlQxMDAwX0lORk8gKmluZm8gPSBuZXRkZXZfcHJpdihkZXYpOwogCVBQUk9WX1JFQ09SRCBwdHI7CiAvLwlpbnQgY250OwogCkBAIC0yMTI3LDcgKzIxMjcsNyBAQAogCQkJCSAgIHN0cnVjdCBldGh0b29sX2RydmluZm8gKmluZm8pCiB7CiAJRlQxMDAwX0lORk8gKmZ0X2luZm87Ci0JZnRfaW5mbyA9IChGVDEwMDBfSU5GTyAqKSBuZXRkZXZfcHJpdihkZXYpOworCWZ0X2luZm8gPSBuZXRkZXZfcHJpdihkZXYpOwogCiAJc25wcmludGYoaW5mby0+ZHJpdmVyLCAzMiwgImZ0MTAwMCIpOwogCXNucHJpbnRmKGluZm8tPmJ1c19pbmZvLCBFVEhUT09MX0JVU0lORk9fTEVOLCAiUENNQ0lBIDB4JWx4IiwKQEAgLTIxMzksNyArMjEzOSw3IEBACiBzdGF0aWMgdTMyIGZ0MTAwMF9nZXRfbGluayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCUZUMTAwMF9JTkZPICppbmZvOwotCWluZm8gPSAoRlQxMDAwX0lORk8gKikgbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbmZvID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlyZXR1cm4gaW5mby0+bWVkaWFzdGF0ZTsKIH0KIApAQCAtMjE4NSw3ICsyMTg1LDcgQEAKIAl9CiAKIAlTRVRfTkVUREVWX0RFVihkZXYsIGZkZXYpOwotCWluZm8gPSAoRlQxMDAwX0lORk8gKikgbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbmZvID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAogCW1lbXNldChpbmZvLCAwLCBzaXplb2YoRlQxMDAwX0lORk8pKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2Z0MTAwMC9mdDEwMDAtcGNtY2lhL2Z0MTAwMF9wcm9jLmMgYi9kcml2ZXJzL3N0YWdpbmcvZnQxMDAwL2Z0MTAwMC1wY21jaWEvZnQxMDAwX3Byb2MuYwppbmRleCBiNDVkZTliLi45MzU2MDhlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZnQxMDAwL2Z0MTAwMC1wY21jaWEvZnQxMDAwX3Byb2MuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZnQxMDAwL2Z0MTAwMC1wY21jaWEvZnQxMDAwX3Byb2MuYwpAQCAtNjUsNyArNjUsNyBAQAogCXRpbWVfdCBkZWx0YTsKIAogCWRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKWRhdGE7Ci0JaW5mbyA9IChGVDEwMDBfSU5GTyAqKSBuZXRkZXZfcHJpdihkZXYpOworCWluZm8gPSBuZXRkZXZfcHJpdihkZXYpOwogCiAJaWYgKG9mZiA+IDApIHsKIAkJKmVvZiA9IDE7CkBAIC0xNzQsNyArMTc0LDcgQEAKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcHRyOwogCUZUMTAwMF9JTkZPICppbmZvOwogCi0JaW5mbyA9IChGVDEwMDBfSU5GTyAqKSBuZXRkZXZfcHJpdihkZXYpOworCWluZm8gPSBuZXRkZXZfcHJpdihkZXYpOwogCiAJc3dpdGNoIChldmVudCkgewogCWNhc2UgTkVUREVWX0NIQU5HRU5BTUU6CkBAIC0xOTUsNyArMTk1LDcgQEAKIHsKIAlGVDEwMDBfSU5GTyAqaW5mbzsKIAotCWluZm8gPSAoRlQxMDAwX0lORk8gKikgbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbmZvID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAogCWluZm8tPnByb2NfZnQxMDAwID0gcHJvY19ta2RpcihGVDEwMDBfUFJPQywgaW5pdF9uZXQucHJvY19uZXQpOwogCWNyZWF0ZV9wcm9jX3JlYWRfZW50cnkoZGV2LT5uYW1lLCAwNjQ0LCBpbmZvLT5wcm9jX2Z0MTAwMCwKQEAgLTIwOCw3ICsyMDgsNyBAQAogewogCUZUMTAwMF9JTkZPICppbmZvOwogCi0JaW5mbyA9IChGVDEwMDBfSU5GTyAqKSBuZXRkZXZfcHJpdihkZXYpOworCWluZm8gPSBuZXRkZXZfcHJpdihkZXYpOwogCiAJcmVtb3ZlX3Byb2NfZW50cnkoZGV2LT5uYW1lLCBpbmZvLT5wcm9jX2Z0MTAwMCk7CiAJcmVtb3ZlX3Byb2NfZW50cnkoRlQxMDAwX1BST0MsIGluaXRfbmV0LnByb2NfbmV0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9mdDEwMDAvZnQxMDAwLXVzYi9NYWtlZmlsZSBiL2RyaXZlcnMvc3RhZ2luZy9mdDEwMDAvZnQxMDAwLXVzYi9NYWtlZmlsZQppbmRleCBkZDg3ZWNkLi5mMGY1MjQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZnQxMDAwL2Z0MTAwMC11c2IvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9zdGFnaW5nL2Z0MTAwMC9mdDEwMDAtdXNiL01ha2VmaWxlCkBAIC0xLDMgKzEsMyBAQAogb2JqLSQoQ09ORklHX0ZUMTAwMF9VU0IpICs9IGZ0MTAwMC5vCiAKLWZ0MTAwMC15IDo9IGZ0MTAwMF9jaGRldi5vIGZ0MTAwMF9kb3dubG9hZC5vIGZ0MTAwMF9ody5vIGZ0MTAwMF9wcm9jLm8gZnQxMDAwX3VzYi5vCitmdDEwMDAteSA6PSBmdDEwMDBfZGVidWcubyBmdDEwMDBfZG93bmxvYWQubyBmdDEwMDBfaHcubyBmdDEwMDBfcHJvYy5vIGZ0MTAwMF91c2IubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2Z0MTAwMC9mdDEwMDAtdXNiL2Z0MTAwMF9jaGRldi5jIGIvZHJpdmVycy9zdGFnaW5nL2Z0MTAwMC9mdDEwMDAtdXNiL2Z0MTAwMF9kZWJ1Zy5jCnNpbWlsYXJpdHkgaW5kZXggNjElCnJlbmFtZSBmcm9tIGRyaXZlcnMvc3RhZ2luZy9mdDEwMDAvZnQxMDAwLXVzYi9mdDEwMDBfY2hkZXYuYwpyZW5hbWUgdG8gZHJpdmVycy9zdGFnaW5nL2Z0MTAwMC9mdDEwMDAtdXNiL2Z0MTAwMF9kZWJ1Zy5jCmluZGV4IDIwZDUwOTguLjE0OWJhNTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9mdDEwMDAvZnQxMDAwLXVzYi9mdDEwMDBfY2hkZXYuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZnQxMDAwL2Z0MTAwMC11c2IvZnQxMDAwX2RlYnVnLmMKQEAgLTI3LDMzICsyNywyMiBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvc2lnbmFsLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KIAotI2luY2x1ZGUgPGxpbnV4L2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgva21vZC5oPgogI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+Ci0jaW5jbHVkZSA8bGludXgvdW5pc3RkLmg+Ci0KKyNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+CiAjaW5jbHVkZSAiZnQxMDAwX3VzYi5oIgotLy8jaW5jbHVkZSAiZnQxMDAwX2lvY3RsLmgiCiAKIHN0YXRpYyBpbnQgZnQxMDAwX2ZsYXJpb25fY250ID0gMDsKIAotLy9uZWVkIHRvIGxvb2tpbmcgdXNhZ2Ugb2YgZnQxMDAwSGFuZGxlCi0KLXN0YXRpYyBpbnQgZnQxMDAwX0NoT3BlbiAoc3RydWN0IGlub2RlICpJbm9kZSwgc3RydWN0IGZpbGUgKkZpbGUpOwotc3RhdGljIHVuc2lnbmVkIGludCBmdDEwMDBfQ2hQb2xsKHN0cnVjdCBmaWxlICpmaWxlLCBwb2xsX3RhYmxlICp3YWl0KTsKLXN0YXRpYyBsb25nIGZ0MTAwMF9DaElvY3RsKHN0cnVjdCBmaWxlICpGaWxlLCB1bnNpZ25lZCBpbnQgQ29tbWFuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgQXJndW1lbnQpOwotc3RhdGljIGludCBmdDEwMDBfQ2hSZWxlYXNlIChzdHJ1Y3QgaW5vZGUgKklub2RlLCBzdHJ1Y3QgZmlsZSAqRmlsZSk7Ci0KLS8vIEdsb2JhbCBwb2ludGVyIHRvIGRldmljZSBvYmplY3QKLXN0YXRpYyBzdHJ1Y3QgZnQxMDAwX2RldmljZSAqcGRldm9ialtNQVhfTlVNX0NBUkRTICsgMl07Ci0vL3N0YXRpYyBkZXZmc19oYW5kbGVfdCBmdDEwMDBIYW5kbGVbTUFYX05VTV9DQVJEU107CitzdGF0aWMgaW50IGZ0MTAwMF9vcGVuIChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSk7CitzdGF0aWMgdW5zaWduZWQgaW50IGZ0MTAwMF9wb2xsX2RldihzdHJ1Y3QgZmlsZSAqZmlsZSwgcG9sbF90YWJsZSAqd2FpdCk7CitzdGF0aWMgbG9uZyBmdDEwMDBfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjb21tYW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBhcmd1bWVudCk7CitzdGF0aWMgaW50IGZ0MTAwMF9yZWxlYXNlIChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSk7CiAKIC8vIExpc3QgdG8gZnJlZSByZWNlaXZlIGNvbW1hbmQgYnVmZmVyIHBvb2wKIHN0cnVjdCBsaXN0X2hlYWQgZnJlZXJjdnBvb2w7CkBAIC02MywxMDMgKzUyLDE4IEBACiAKIGludCBudW1vZm1zZ2J1ZiA9IDA7CiAKLS8vIEdsb2JhbCB2YXJpYWJsZSB0byBpbmRpY2F0ZSB0aGF0IGFsbCBwcm92aXNpb25pbmcgZGF0YSBpcyBzZW50IHRvIERTUAotLy9CT09MRUFOIGZQcm92Q29tcGxldGU7Ci0KIC8vCiAvLyBUYWJsZSBvZiBlbnRyeS1wb2ludCByb3V0aW5lcyBmb3IgY2hhciBkZXZpY2UKIC8vCiBzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBmdDEwMDBmb3BzID0KIHsKLQkudW5sb2NrZWRfaW9jdGwJPSBmdDEwMDBfQ2hJb2N0bCwKLQkucG9sbAkJPSBmdDEwMDBfQ2hQb2xsLAotCS5vcGVuCQk9IGZ0MTAwMF9DaE9wZW4sCi0JLnJlbGVhc2UJPSBmdDEwMDBfQ2hSZWxlYXNlLAorCS51bmxvY2tlZF9pb2N0bAk9IGZ0MTAwMF9pb2N0bCwKKwkucG9sbAkJPSBmdDEwMDBfcG9sbF9kZXYsCisJLm9wZW4JCT0gZnQxMDAwX29wZW4sCisJLnJlbGVhc2UJPSBmdDEwMDBfcmVsZWFzZSwKIAkubGxzZWVrCQk9IG5vX2xsc2VlaywKIH07CiAKLQotCi0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBGdW5jdGlvbjogICAgZXhlY19ta25vZAotLy8KLS8vIFBhcmFtZXRlcnM6Ci0vLwotLy8gUmV0dXJuczoKLS8vCi0vLyBEZXNjcmlwdGlvbjoKLS8vCi0vLyBOb3RlczoKLS8vCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotc3RhdGljIGludCBleGVjX21rbm9kICh2b2lkICpwZGF0YSkKLXsKLQlzdHJ1Y3QgZnQxMDAwX2luZm8gKmluZm87Ci0gICAgY2hhciBtam51bVs0XTsKLSAgICBjaGFyIG1pbm9ybnVtWzRdOwotICAgIGNoYXIgdGVtcFszMl07Ci0gICAgaW50IHJldGNvZGU7Ci0vLyAgICBpbnQgaTsJCQkJCS8vYWVsaWFzIFstXSByZWFzb24gOiB1bnVzZWQgdmFyaWFibGUKLSAgICBjaGFyICplbnZwW10gPSB7ICJIT01FPS8iLCAiUEFUSD0vdXNyL2JpbjovYmluIiwgTlVMTCB9OwotICAgIGNoYXIgKmFyZ3ZbXT17Ii1tIDY2NiIsdGVtcCwiYyIsbWpudW0sbWlub3JudW0sTlVMTH07Ci0KLSAgICBpbmZvID0gcGRhdGE7Ci0gICAgREVCVUcoImZ0MTAwMF9jaGRldjpleGVjX21rbm9kIGlzIGNhbGxlZCB3aXRoIG1ham9yIG51bWJlciA9ICVkXG4iLCBpbmZvLT5EZXZpY2VNYWpvcik7Ci0gICAgc3ByaW50Zih0ZW1wLCAiJXMlcyIsICIvZGV2LyIsIGluZm8tPkRldmljZU5hbWUpIDsKLSAgICBzcHJpbnRmKG1qbnVtLCAiJWQiLCBpbmZvLT5EZXZpY2VNYWpvcik7Ci0gICAgc3ByaW50ZihtaW5vcm51bSwgIiVkIiwgaW5mby0+Q2FyZE51bWJlcik7Ci0KLSAgICAvL2NoYXIgKmFyZ3ZbXT17Im1rbm9kIiwiLW0gNjY2Iix0ZW1wLCJjIixtam51bSxtaW5vcm51bSxOVUxMfTsKLS8vICAgIGNoYXIgKmFyZ3ZbXT17Ii1tIDY2NiIsdGVtcCwiYyIsbWpudW0sbWlub3JudW0sTlVMTH07Ci0KLSAgICAvL2ZvciAoaT0wOyBpPDc7aSsrKQotICAgIC8vICAgIERFQlVHKCJhcmd2WyVkXT0lc1xuIiwgaSwgYXJndltpXSk7Ci0KLQotICAgIHJldGNvZGUgPSBjYWxsX3VzZXJtb2RlaGVscGVyICgiL2Jpbi9ta25vZCIsIGFyZ3YsIGVudnAsIDEpOwotICAgIGlmIChyZXRjb2RlKSB7Ci0gICAgICAgIERFQlVHKCJmdDEwMDBfY2hkZXY6ZXhlY19ta25vZCBmYWlsZWQgdG8gbWFrZSB0aGUgbm9kZTogcmV0Y29kZSA9ICVkXG4iLCByZXRjb2RlKTsKLSAgICB9Ci0KLQotCi0gICAgcmV0dXJuIHJldGNvZGU7Ci0KLX0KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIEZ1bmN0aW9uOiAgICBybV9ta25vZAotLy8KLS8vIERlc2NyaXB0aW9uOiBUaGlzIG1vZHVsZSByZW1vdmVzIHRoZSBGVDEwMDAgZGV2aWNlIGZpbGUKLS8vCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotc3RhdGljIGludCBybV9ta25vZCAodm9pZCAqcGRhdGEpCi17Ci0KLQlzdHJ1Y3QgZnQxMDAwX2luZm8gKmluZm87Ci0gICAgLy9jaGFyICphcmd2WzRdPXsicm0iLCAiLWYiLCAiL2Rldi9GVDEwMDAiLCBOVUxMfTsKLSAgICBpbnQgcmV0Y29kZTsKLSAgICBjaGFyIHRlbXBbMzJdOwotICAgIGNoYXIgKmFyZ3ZbXT17InJtIiwgIi1mIiwgdGVtcCwgTlVMTH07Ci0KLQlpbmZvID0gKHN0cnVjdCBmdDEwMDBfaW5mbyAqKXBkYXRhOwotICAgIERFQlVHKCJmdDEwMDBfY2hkZXY6cm1fbWtub2QgaXMgY2FsbGVkIGZvciBkZXZpY2UgJXNcbiIsIGluZm8tPkRldmljZU5hbWUpOwotICAgIHNwcmludGYodGVtcCwgIiVzJXMiLCAiL2Rldi8iLCBpbmZvLT5EZXZpY2VOYW1lKSA7Ci0KLS8vICAgIGNoYXIgKmFyZ3ZbXT17InJtIiwgIi1mIiwgdGVtcCwgTlVMTH07Ci0KLSAgICByZXRjb2RlID0gY2FsbF91c2VybW9kZWhlbHBlciAoIi9iaW4vcm0iLCBhcmd2LCBOVUxMLCAxKTsKLSAgICBpZiAocmV0Y29kZSkgewotICAgICAgICBERUJVRygiZnQxMDAwX2NoZGV2OnJtX21rbm9kIGZhaWxlZCB0byByZW1vdmUgdGhlIG5vZGU6IHJldGNvZGUgPSAlZFxuIiwgcmV0Y29kZSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgICAgREVCVUcoImZ0MTAwMF9jaGRldjpybV9ta25vZCBkb25lIVxuIik7Ci0KLQotICAgIHJldHVybiByZXRjb2RlOwotCi19CiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8gRnVuY3Rpb246ICAgIGZ0MTAwMF9nZXRfYnVmZmVyCiAvLwpAQCAtMjMzLDgwICsxMzcsNTUgQEAKIC8vIE5vdGVzOiAgICAgICBPbmx5IGNhbGxlZCBieSBpbml0X21vZHVsZSgpLgogLy8KIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1pbnQgZnQxMDAwX0NyZWF0ZURldmljZShzdHJ1Y3QgZnQxMDAwX2RldmljZSAqZGV2KQoraW50IGZ0MTAwMF9jcmVhdGVfZGV2KHN0cnVjdCBmdDEwMDBfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGZ0MTAwMF9pbmZvICppbmZvID0gbmV0ZGV2X3ByaXYoZGV2LT5uZXQpOwogICAgIGludCByZXN1bHQ7CiAgICAgaW50IGk7Ci0gICAgcGlkX3QgcGlkOworCXN0cnVjdCBkZW50cnkgKmRpciwgKmZpbGU7CisJc3RydWN0IGZ0MTAwMF9kZWJ1Z19kaXJzICp0bXA7CiAKICAgICAvLyBtYWtlIGEgbmV3IGRldmljZSBuYW1lCi0gICAgc3ByaW50ZihpbmZvLT5EZXZpY2VOYW1lLCAiJXMlZCIsICJGVDEwMCIsIGluZm8tPkNhcmROdW1iZXIpOworICAgIHNwcmludGYoaW5mby0+RGV2aWNlTmFtZSwgIiVzJWQiLCAiRlQxMDAwXyIsIGluZm8tPkNhcmROdW1iZXIpOwogCi0gICAgLy8gRGVsZXRlIGFueSBleGlzdGluZyBGVDEwMDAgbm9kZQotICAgIHBpZCA9IGtlcm5lbF90aHJlYWQgKHJtX21rbm9kLCh2b2lkICopaW5mbywgMCk7Ci0gICAgbXNsZWVwKDEwMDApOwotCi0gICAgREVCVUcoImZ0MTAwMF9DcmVhdGVEZXZpY2U6IG51bWJlciBvZiBpbnN0YW5jZSA9ICVkXG4iLCBmdDEwMDBfZmxhcmlvbl9jbnQpOworICAgIERFQlVHKCIlczogbnVtYmVyIG9mIGluc3RhbmNlID0gJWRcbiIsIF9fZnVuY19fLCBmdDEwMDBfZmxhcmlvbl9jbnQpOwogICAgIERFQlVHKCJEZXZpY2VDcmVhdGVkID0gJXhcbiIsIGluZm8tPkRldmljZUNyZWF0ZWQpOwogCi0gICAgLy9zYXZlIHRoZSBkZXZpY2UgaW5mbyB0byBnbG9iYWwgYXJyYXkKLSAgICBwZGV2b2JqW2luZm8tPkNhcmROdW1iZXJdID0gZGV2OwotCi0gICAgREVCVUcoImZ0MTAwMF9DcmVhdGVEZXZpY2U6ICoqKioqKlNBVkVEIHBkZXZvYmpbJWRdPSVwXG4iLCBpbmZvLT5DYXJkTnVtYmVyLCBwZGV2b2JqW2luZm8tPkNhcmROdW1iZXJdKTsJLy9hZWxpYXMgWytdIHJlYXNvbjp1cAotCiAgICAgaWYgKGluZm8tPkRldmljZUNyZWF0ZWQpCiAgICAgewotCURFQlVHKCJmdDEwMDBfQ3JlYXRlRGV2aWNlOiBcIiVzXCIgYWxyZWFkeSByZWdpc3RlcmVkXG4iLCBpbmZvLT5EZXZpY2VOYW1lKTsKKwlERUJVRygiJXM6IFwiJXNcIiBhbHJlYWR5IHJlZ2lzdGVyZWRcbiIsIF9fZnVuY19fLCBpbmZvLT5EZXZpY2VOYW1lKTsKIAlyZXR1cm4gLUVJTzsKICAgICB9CiAKIAogICAgIC8vIHJlZ2lzdGVyIHRoZSBkZXZpY2UKLSAgICBERUJVRygiZnQxMDAwX0NyZWF0ZURldmljZTogXCIlc1wiIGRldmljZSByZWdpc3RyYXRpb25cbiIsIGluZm8tPkRldmljZU5hbWUpOwotICAgIGluZm8tPkRldmljZU1ham9yID0gMDsKKyAgICBERUJVRygiJXM6IFwiJXNcIiBkZWJ1Z2ZzIGRldmljZSByZWdpc3RyYXRpb25cbiIsIF9fZnVuY19fLCBpbmZvLT5EZXZpY2VOYW1lKTsKIAotICAgIHJlc3VsdCA9IHJlZ2lzdGVyX2NocmRldihpbmZvLT5EZXZpY2VNYWpvciwgaW5mby0+RGV2aWNlTmFtZSwgJmZ0MTAwMGZvcHMpOwotICAgIGlmIChyZXN1bHQgPCAwKQotICAgIHsKLQlERUJVRygiZnQxMDAwX0NyZWF0ZURldmljZTogdW5hYmxlIHRvIGdldCBtYWpvciAlZFxuIiwgaW5mby0+RGV2aWNlTWFqb3IpOwotCXJldHVybiByZXN1bHQ7Ci0gICAgfQorCXRtcCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBmdDEwMDBfZGVidWdfZGlycyksIEdGUF9LRVJORUwpOworCWlmICh0bXAgPT0gTlVMTCkgeworCQlyZXN1bHQgPSAtMTsKKwkJZ290byBmYWlsOworCX0KIAotICAgIERFQlVHKCJmdDEwMDBfQ3JlYXRlRGV2aWNlOiByZWdpc3RlcmVkIGNoYXIgZGV2aWNlIFwiJXNcIlxuIiwgaW5mby0+RGV2aWNlTmFtZSk7CisJZGlyID0gZGVidWdmc19jcmVhdGVfZGlyKGluZm8tPkRldmljZU5hbWUsIDApOworCWlmIChJU19FUlIoZGlyKSkgeworCQlyZXN1bHQgPSBQVFJfRVJSKGRpcik7CisJCWdvdG8gZGVidWdfZGlyX2ZhaWw7CisJfQogCi0gICAgLy8gc2F2ZSBhIGR5bmFtaWMgZGV2aWNlIG1ham9yIG51bWJlcgotICAgIGlmIChpbmZvLT5EZXZpY2VNYWpvciA9PSAwKQotICAgIHsKLQlpbmZvLT5EZXZpY2VNYWpvciA9IHJlc3VsdDsKLQlERUJVRygiZnQxMDAwX1BjZENyZWF0ZURldmljZTogZGV2aWNlIG1ham9yID0gJWRcbiIsIGluZm8tPkRldmljZU1ham9yKTsKLSAgICB9CisJZmlsZSA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoImRldmljZSIsIFNfSVJVR08gfCBTX0lXVVNSLCBkaXIsCisJCQkJCWRldiwgJmZ0MTAwMGZvcHMpOworCWlmIChJU19FUlIoZmlsZSkpIHsKKwkJcmVzdWx0ID0gUFRSX0VSUihmaWxlKTsKKwkJZ290byBkZWJ1Z19maWxlX2ZhaWw7CisJfQogCi0gICAgLy8gQ3JlYXRlIGEgdGhyZWFkIHRvIGNhbGwgdXNlciBtb2RlIGFwcCB0byBta25vZAotICAgIHBpZCA9IGtlcm5lbF90aHJlYWQgKGV4ZWNfbWtub2QsICh2b2lkICopaW5mbywgMCk7CisJdG1wLT5kZW50ID0gZGlyOworCXRtcC0+ZmlsZSA9IGZpbGU7CisJdG1wLT5pbnRfbnVtYmVyID0gaW5mby0+Q2FyZE51bWJlcjsKKwlsaXN0X2FkZCgmKHRtcC0+bGlzdCksICYoaW5mby0+bm9kZXMubGlzdCkpOwogCi0gICAgLy8gaW5pdGlhbGl6ZSBhcHBsaWNhdGlvbiBpbmZvcm1hdGlvbgotCi0vLyAgICBpZiAoZnQxMDAwX2ZsYXJpb25fY250ID09IDApIHsKLS8vCi0vLyAgICAJICBERUJVRygiSW5pdGlhbGl6ZSBmcmVlX2J1ZmZfbG9jayBhbmQgZnJlZXJjdnBvb2xcbiIpOwotLy8gICAgICAgIHNwaW5fbG9ja19pbml0KCZmcmVlX2J1ZmZfbG9jayk7Ci0vLwotLy8gICAgICAgIC8vIGluaXRpYWxpemUgYSBsaXN0IG9mIGJ1ZmZlcnMgdG8gYmUgdXNlIGZvciBxdWV1aW5nIHVwIHJlY2VpdmUgY29tbWFuZCBkYXRhCi0vLyAgICAgICAgSU5JVF9MSVNUX0hFQUQgKCZmcmVlcmN2cG9vbCk7Ci0vLwotLy8gICAgICAgIC8vIGNyZWF0ZSBsaXN0IG9mIGZyZWUgYnVmZmVycwotLy8gICAgICAgIGZvciAoaT0wOyBpPE5VTV9PRl9GUkVFX0JVRkZFUlM7IGkrKykgewotLy8gICAgICAgICAgICAvLyBHZXQgbWVtb3J5IGZvciBEUFJBTV9EQVRBIGxpbmsgbGlzdAotLy8gICAgICAgICAgICBwZHByYW1fYmxrID0ga21hbGxvYyAoIHNpemVvZihzdHJ1Y3QgZHByYW1fYmxrKSwgR0ZQX0tFUk5FTCApOwotLy8gICAgICAgICAgICAvLyBHZXQgYSBibG9jayBvZiBtZW1vcnkgdG8gc3RvcmUgY29tbWFuZCBkYXRhCi0vLyAgICAgICAgICAgIHBkcHJhbV9ibGstPnBidWZmZXIgPSBrbWFsbG9jICggTUFYX0NNRF9TUVNJWkUsIEdGUF9LRVJORUwgKTsKLS8vICAgICAgICAgICAgLy8gbGluayBwcm92aXNpb25pbmcgZGF0YQotLy8gICAgICAgICAgICBsaXN0X2FkZF90YWlsICgmcGRwcmFtX2Jsay0+bGlzdCwgJmZyZWVyY3Zwb29sKTsKLS8vICAgICAgICB9Ci0vLyAgICAgICAgbnVtb2Ztc2didWYgPSBOVU1fT0ZfRlJFRV9CVUZGRVJTOwotLy8gICAgfQotCisgICAgREVCVUcoIiVzOiByZWdpc3RlcmVkIGRlYnVnZnMgZGlyZWN0b3J5IFwiJXNcIlxuIiwgX19mdW5jX18sIGluZm8tPkRldmljZU5hbWUpOwogCiAgICAgLy8gaW5pdGlhbGl6ZSBhcHBsaWNhdGlvbiBpbmZvcm1hdGlvbgogICAgIGluZm8tPmFwcGNudCA9IDA7CkBAIC0zMjMsMTcgKzIwMiwxNyBAQAogICAgICAgICBJTklUX0xJU1RfSEVBRCAoJmluZm8tPmFwcF9pbmZvW2ldLmFwcF9zcWxpc3QpOwogICAgIH0KIAotCi0KLQotLy8gICAgZnQxMDAwSGFuZGxlW2luZm8tPkNhcmROdW1iZXJdID0gZGV2ZnNfcmVnaXN0ZXIoTlVMTCwgaW5mby0+RGV2aWNlTmFtZSwgREVWRlNfRkxfQVVUT19ERVZOVU0sIDAsIDAsCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTX0lGQ0hSIHwgU19JUlVHTyB8IFNfSVdVR08sICZmdDEwMDBmb3BzLCBOVUxMKTsKLQotCiAgICAgaW5mby0+RGV2aWNlQ3JlYXRlZCA9IFRSVUU7CiAgICAgZnQxMDAwX2ZsYXJpb25fY250Kys7CiAKLSAgICByZXR1cm4gcmVzdWx0OworCXJldHVybiAwOworCitkZWJ1Z19maWxlX2ZhaWw6CisJZGVidWdmc19yZW1vdmUoZGlyKTsKK2RlYnVnX2Rpcl9mYWlsOgorCWtmcmVlKHRtcCk7CitmYWlsOgorCXJldHVybiByZXN1bHQ7CiB9CiAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0zNDYsMjcgKzIyNSwzMyBAQAogLy8gTm90ZXM6ICAgICAgIE9ubHkgY2FsbGVkIGJ5IGNsZWFudXBfbW9kdWxlKCkuCiAvLwogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXZvaWQgZnQxMDAwX0Rlc3Ryb3lEZXZpY2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3ZvaWQgZnQxMDAwX2Rlc3Ryb3lfZGV2KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGZ0MTAwMF9pbmZvICppbmZvID0gbmV0ZGV2X3ByaXYoZGV2KTsKLSAgICBpbnQgcmVzdWx0ID0gMDsKLSAgICBwaWRfdCBwaWQ7CiAJCWludCBpOwogCXN0cnVjdCBkcHJhbV9ibGsgKnBkcHJhbV9ibGs7CiAJc3RydWN0IGRwcmFtX2JsayAqcHRyOworCXN0cnVjdCBsaXN0X2hlYWQgKnBvcywgKnE7CisJc3RydWN0IGZ0MTAwMF9kZWJ1Z19kaXJzICpkaXI7CiAKLSAgICBERUJVRygiZnQxMDAwX2NoZGV2OmZ0MTAwMF9EZXN0cm95RGV2aWNlIGNhbGxlZFxuIik7CisgICAgREVCVUcoIiVzIGNhbGxlZFxuIiwgX19mdW5jX18pOwogCiAKIAogICAgIGlmIChpbmZvLT5EZXZpY2VDcmVhdGVkKQogCXsKICAgICAgICAgZnQxMDAwX2ZsYXJpb25fY250LS07Ci0JCXVucmVnaXN0ZXJfY2hyZGV2KGluZm8tPkRldmljZU1ham9yLCBpbmZvLT5EZXZpY2VOYW1lKTsKLQkJREVCVUcoImZ0MTAwMF9EZXN0cm95RGV2aWNlOiB1bnJlZ2lzdGVyZWQgZGV2aWNlIFwiJXNcIiwgcmVzdWx0ID0gJWRcbiIsCi0JCQkJCSAgIGluZm8tPkRldmljZU5hbWUsIHJlc3VsdCk7Ci0KLSAgICAgICBwaWQgPSBrZXJuZWxfdGhyZWFkIChybV9ta25vZCwgKHZvaWQgKilpbmZvLCAwKTsKKwkJbGlzdF9mb3JfZWFjaF9zYWZlKHBvcywgcSwgJmluZm8tPm5vZGVzLmxpc3QpIHsKKwkJCWRpciA9IGxpc3RfZW50cnkocG9zLCBzdHJ1Y3QgZnQxMDAwX2RlYnVnX2RpcnMsIGxpc3QpOworCQkJaWYgKGRpci0+aW50X251bWJlciA9PSBpbmZvLT5DYXJkTnVtYmVyKSB7CisJCQkJZGVidWdmc19yZW1vdmUoZGlyLT5maWxlKTsKKwkJCQlkZWJ1Z2ZzX3JlbW92ZShkaXItPmRlbnQpOworCQkJCWxpc3RfZGVsKHBvcyk7CisJCQkJa2ZyZWUoZGlyKTsKKwkJCX0KKwkJfQorCQlERUJVRygiJXM6IHVucmVnaXN0ZXJlZCBkZXZpY2UgXCIlc1wiXG4iLCBfX2Z1bmNfXywKKwkJCQkJICAgaW5mby0+RGV2aWNlTmFtZSk7CiAKICAgICAgICAgLy8gTWFrZSBzdXJlIHdlIGZyZWUgYW55IG1lbW9yeSByZXNlcnZlIGZvciBzbG93IFF1ZXVlCiAgICAgICAgIGZvciAoaT0wOyBpPE1BWF9OVU1fQVBQOyBpKyspIHsKQEAgLTM4OCwxOSArMjczLDE0IEBACiAgICAgICAgICAgICAgICAga2ZyZWUocHRyKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotCi0vLyAgICAgICAgZGV2ZnNfdW5yZWdpc3RlcihmdDEwMDBIYW5kbGVbaW5mby0+Q2FyZE51bWJlcl0pOwotCiAJCWluZm8tPkRldmljZUNyZWF0ZWQgPSBGQUxTRTsKLQotCQlwZGV2b2JqW2luZm8tPkNhcmROdW1iZXJdID0gTlVMTDsKIAl9CiAKIAogfQogCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gRnVuY3Rpb246ICAgIGZ0MTAwMF9DaE9wZW4KKy8vIEZ1bmN0aW9uOiAgICBmdDEwMDBfb3BlbgogLy8KIC8vIFBhcmFtZXRlcnM6CiAvLwpAQCAtNDA5LDI4ICsyODksMTkgQEAKIC8vIE5vdGVzOgogLy8KIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1zdGF0aWMgaW50IGZ0MTAwMF9DaE9wZW4gKHN0cnVjdCBpbm9kZSAqSW5vZGUsIHN0cnVjdCBmaWxlICpGaWxlKQorc3RhdGljIGludCBmdDEwMDBfb3BlbiAoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCiB7CiAJc3RydWN0IGZ0MTAwMF9pbmZvICppbmZvOworCXN0cnVjdCBmdDEwMDBfZGV2aWNlICpkZXYgPSAoc3RydWN0IGZ0MTAwMF9kZXZpY2UgKilpbm9kZS0+aV9wcml2YXRlOwogICAgIGludCBpLG51bTsKIAotICAgIERFQlVHKCJmdDEwMDBfQ2hPcGVuIGNhbGxlZFxuIik7Ci0gICAgbnVtID0gKE1JTk9SKElub2RlLT5pX3JkZXYpICYgMHhmKTsKLSAgICBERUJVRygiZnQxMDAwX0NoT3BlbjogbWlub3IgbnVtYmVyPSVkXG4iLCBudW0pOworICAgIERFQlVHKCIlcyBjYWxsZWRcbiIsIF9fZnVuY19fKTsKKyAgICBudW0gPSAoTUlOT1IoaW5vZGUtPmlfcmRldikgJiAweGYpOworICAgIERFQlVHKCJmdDEwMDBfb3BlbjogbWlub3IgbnVtYmVyPSVkXG4iLCBudW0pOwogCi0gICAgZm9yIChpPTA7IGk8NTsgaSsrKQotICAgICAgICBERUJVRygicGRldm9ialslZF09JXBcbiIsIGksIHBkZXZvYmpbaV0pOyAvL2FlbGlhcyBbK10gcmVhc29uOiBkb3duCisJaW5mbyA9IGZpbGUtPnByaXZhdGVfZGF0YSA9IG5ldGRldl9wcml2KGRldi0+bmV0KTsKIAotICAgIGlmICggcGRldm9ialtudW1dICE9IE5VTEwgKQotICAgICAgICAvL2luZm8gPSAoc3RydWN0IGZ0MTAwMF9pbmZvICopKHBkZXZvYmpbbnVtXS0+bmV0LT5wcml2KTsKLQkJaW5mbyA9IChzdHJ1Y3QgZnQxMDAwX2luZm8gKiluZXRkZXZfcHJpdihwZGV2b2JqW251bV0tPm5ldCk7Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgREVCVUcoImZ0MTAwMF9DaE9wZW46IGNhbiBub3QgZmluZCBkZXZpY2Ugb2JqZWN0ICVkXG4iLCBudW0pOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgREVCVUcoImZfb3duZXIgPSAlcCBudW1iZXIgb2YgYXBwbGljYXRpb24gPSAlZFxuIiwgKCZGaWxlLT5mX293bmVyKSwgaW5mby0+YXBwY250ICk7CisgICAgREVCVUcoImZfb3duZXIgPSAlcCBudW1iZXIgb2YgYXBwbGljYXRpb24gPSAlZFxuIiwgKCZmaWxlLT5mX293bmVyKSwgaW5mby0+YXBwY250ICk7CiAKICAgICAvLyBDaGVjayBpZiBtYXhpbXVtIG51bWJlciBvZiBhcHBsaWNhdGlvbiBleGNlZWRlZAogICAgIGlmIChpbmZvLT5hcHBjbnQgPiBNQVhfTlVNX0FQUCkgewpAQCAtNDUyLDIxICszMjMsMTkgQEAKICAgICB9CiAKICAgICBpbmZvLT5hcHBjbnQrKzsKLSAgICBpbmZvLT5hcHBfaW5mb1tpXS5maWxlb2JqZWN0ID0gJkZpbGUtPmZfb3duZXI7CisgICAgaW5mby0+YXBwX2luZm9baV0uZmlsZW9iamVjdCA9ICZmaWxlLT5mX293bmVyOwogICAgIGluZm8tPmFwcF9pbmZvW2ldLm5UeE1zZyA9IDA7CiAgICAgaW5mby0+YXBwX2luZm9baV0ublJ4TXNnID0gMDsKICAgICBpbmZvLT5hcHBfaW5mb1tpXS5uVHhNc2dSZWplY3QgPSAwOwogICAgIGluZm8tPmFwcF9pbmZvW2ldLm5SeE1zZ01pc3MgPSAwOwogCi0gICAgRmlsZS0+cHJpdmF0ZV9kYXRhID0gcGRldm9ialtudW1dLT5uZXQ7Ci0KLQlub25zZWVrYWJsZV9vcGVuKElub2RlLCBGaWxlKTsKKwlub25zZWVrYWJsZV9vcGVuKGlub2RlLCBmaWxlKTsKICAgICByZXR1cm4gMDsKIH0KIAogCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gRnVuY3Rpb246ICAgIGZ0MTAwMF9DaFBvbGwKKy8vIEZ1bmN0aW9uOiAgICBmdDEwMDBfcG9sbF9kZXYKIC8vCiAvLyBQYXJhbWV0ZXJzOgogLy8KQEAgLTQ3Niw0NyArMzQ1LDQ3IEBACiAvLwogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotc3RhdGljIHVuc2lnbmVkIGludCBmdDEwMDBfQ2hQb2xsKHN0cnVjdCBmaWxlICpmaWxlLCBwb2xsX3RhYmxlICp3YWl0KQorc3RhdGljIHVuc2lnbmVkIGludCBmdDEwMDBfcG9sbF9kZXYoc3RydWN0IGZpbGUgKmZpbGUsIHBvbGxfdGFibGUgKndhaXQpCiB7CiAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKIAlzdHJ1Y3QgZnQxMDAwX2luZm8gKmluZm87CiAgICAgaW50IGk7CiAKLSAgICAvL0RFQlVHKCJmdDEwMDBfQ2hQb2xsIGNhbGxlZFxuIik7CisgICAgLy9ERUJVRygiZnQxMDAwX3BvbGxfZGV2IGNhbGxlZFxuIik7CiAgICAgaWYgKGZ0MTAwMF9mbGFyaW9uX2NudCA9PSAwKSB7Ci0gICAgICAgIERFQlVHKCJGVDEwMDA6ZnQxMDAwX0NoUG9sbCBjYWxsZWQgd2hlbiBmdDEwMDBfZmxhcmlvbl9jbnQgaXMgemVyb1xuIik7CisgICAgICAgIERFQlVHKCJGVDEwMDA6ZnQxMDAwX3BvbGxfZGV2IGNhbGxlZCB3aGVuIGZ0MTAwMF9mbGFyaW9uX2NudCBpcyB6ZXJvXG4iKTsKICAgICAgICAgcmV0dXJuICgtRUJBREYpOwogICAgIH0KIAotCWluZm8gPSAoc3RydWN0IGZ0MTAwMF9pbmZvICopIG5ldGRldl9wcml2KGRldik7CisJaW5mbyA9IG5ldGRldl9wcml2KGRldik7CiAKICAgICAvLyBTZWFyY2ggZm9yIG1hdGNoaW5nIGZpbGUgb2JqZWN0CiAgICAgZm9yIChpPTA7IGk8TUFYX05VTV9BUFA7IGkrKykgewogICAgICAgICBpZiAoIGluZm8tPmFwcF9pbmZvW2ldLmZpbGVvYmplY3QgPT0gJmZpbGUtPmZfb3duZXIpIHsKLSAgICAgICAgICAgIC8vREVCVUcoIkZUMTAwMDpmdDEwMDBfQ2hJb2N0bDogTWVzc2FnZSBpcyBmb3IgQXBwSWQgPSAlZFxuIiwgaW5mby0+YXBwX2luZm9baV0uYXBwX2lkKTsKKyAgICAgICAgICAgIC8vREVCVUcoIkZUMTAwMDpmdDEwMDBfaW9jdGw6IE1lc3NhZ2UgaXMgZm9yIEFwcElkID0gJWRcbiIsIGluZm8tPmFwcF9pbmZvW2ldLmFwcF9pZCk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgIH0KIAogICAgIC8vIENvdWxkIG5vdCBmaW5kIGFwcGxpY2F0aW9uIGluZm8gYmxvY2sKICAgICBpZiAoaSA9PSBNQVhfTlVNX0FQUCkgewotICAgICAgICBERUJVRygiRlQxMDAwOmZ0MTAwMF9DaElvY3RsOkNvdWxkIG5vdCBmaW5kIGFwcGxpY2F0aW9uIGluZm8gYmxvY2tcbiIpOworICAgICAgICBERUJVRygiRlQxMDAwOmZ0MTAwMF9pb2N0bDpDb3VsZCBub3QgZmluZCBhcHBsaWNhdGlvbiBpbmZvIGJsb2NrXG4iKTsKICAgICAgICAgcmV0dXJuICggLUVBQ0NFUyApOwogICAgIH0KIAogICAgIGlmIChsaXN0X2VtcHR5KCZpbmZvLT5hcHBfaW5mb1tpXS5hcHBfc3FsaXN0KSA9PSAwKSB7Ci0gICAgICAgIERFQlVHKCJGVDEwMDA6ZnQxMDAwX0NoUG9sbDpNZXNzYWdlIGRldGVjdGVkIGluIHNsb3cgcXVldWVcbiIpOworICAgICAgICBERUJVRygiRlQxMDAwOmZ0MTAwMF9wb2xsX2RldjpNZXNzYWdlIGRldGVjdGVkIGluIHNsb3cgcXVldWVcbiIpOwogICAgICAgICByZXR1cm4oUE9MTElOIHwgUE9MTFJETk9STSB8IFBPTExQUkkpOwogICAgIH0KIAogICAgIHBvbGxfd2FpdCAoZmlsZSwgJmluZm8tPmFwcF9pbmZvW2ldLndhaXRfZHByYW1fbXNnLCB3YWl0KTsKLSAgICAvL0RFQlVHKCJGVDEwMDA6ZnQxMDAwX0NoUG9sbDpQb2xsaW5nIGZvciBkYXRhIGZyb20gRFNQXG4iKTsKKyAgICAvL0RFQlVHKCJGVDEwMDA6ZnQxMDAwX3BvbGxfZGV2OlBvbGxpbmcgZm9yIGRhdGEgZnJvbSBEU1BcbiIpOwogCiAgICAgcmV0dXJuICgwKTsKIH0KIAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIEZ1bmN0aW9uOiAgICBmdDEwMDBfQ2hJb2N0bAorLy8gRnVuY3Rpb246ICAgIGZ0MTAwMF9pb2N0bAogLy8KIC8vIFBhcmFtZXRlcnM6CiAvLwpAQCAtNTI1LDExICszOTQsMTAgQEAKIC8vIE5vdGVzOgogLy8KIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1zdGF0aWMgbG9uZyBmdDEwMDBfQ2hJb2N0bCAoc3RydWN0IGZpbGUgKkZpbGUsIHVuc2lnbmVkIGludCBDb21tYW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBBcmd1bWVudCkKK3N0YXRpYyBsb25nIGZ0MTAwMF9pb2N0bCAoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjb21tYW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBhcmd1bWVudCkKIHsKLSAgICB2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKUFyZ3VtZW50OwotICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisgICAgdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmd1bWVudDsKIAlzdHJ1Y3QgZnQxMDAwX2luZm8gKmluZm87CiAgICAgc3RydWN0IGZ0MTAwMF9kZXZpY2UgKmZ0MTAwMGRldjsKICAgICBpbnQgcmVzdWx0PTA7CkBAIC01NTAsMjUgKzQxOCwyNCBAQAogICAgIHVuc2lnbmVkIHNob3J0IGxlZFN0YXQ9MDsKICAgICB1bnNpZ25lZCBzaG9ydCBjb25TdGF0PTA7CiAKLSAgICAvL0RFQlVHKCJmdDEwMDBfQ2hJb2N0bCBjYWxsZWRcbiIpOworICAgIC8vREVCVUcoImZ0MTAwMF9pb2N0bCBjYWxsZWRcbiIpOwogCiAgICAgaWYgKGZ0MTAwMF9mbGFyaW9uX2NudCA9PSAwKSB7Ci0gICAgICAgIERFQlVHKCJGVDEwMDA6ZnQxMDAwX0NoSW9jdGwgY2FsbGVkIHdoZW4gZnQxMDAwX2ZsYXJpb25fY250IGlzIHplcm9cbiIpOworICAgICAgICBERUJVRygiRlQxMDAwOmZ0MTAwMF9pb2N0bCBjYWxsZWQgd2hlbiBmdDEwMDBfZmxhcmlvbl9jbnQgaXMgemVyb1xuIik7CiAgICAgICAgIHJldHVybiAoLUVCQURGKTsKICAgICB9CiAKLSAgICAvL0RFQlVHKCJGVDEwMDA6ZnQxMDAwX0NoSW9jdGw6Q29tbWFuZCA9IDB4JXggQXJndW1lbnQgPSAweCU4eFxuIiwgQ29tbWFuZCwgKHUzMilBcmd1bWVudCk7CisgICAgLy9ERUJVRygiRlQxMDAwOmZ0MTAwMF9pb2N0bDpjb21tYW5kID0gMHgleCBhcmd1bWVudCA9IDB4JTh4XG4iLCBjb21tYW5kLCAodTMyKWFyZ3VtZW50KTsKIAotICAgIGRldiA9IEZpbGUtPnByaXZhdGVfZGF0YTsKLQlpbmZvID0gKHN0cnVjdCBmdDEwMDBfaW5mbyAqKSBuZXRkZXZfcHJpdihkZXYpOwotICAgIGZ0MTAwMGRldiA9IGluZm8tPnBGdDEwMDBEZXY7Ci0gICAgY21kID0gX0lPQ19OUihDb21tYW5kKTsKLSAgICAvL0RFQlVHKCJGVDEwMDA6ZnQxMDAwX0NoSW9jdGw6Y21kID0gMHgleFxuIiwgY21kKTsKKwlpbmZvID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCWZ0MTAwMGRldiA9IGluZm8tPnBGdDEwMDBEZXY7CisgICAgY21kID0gX0lPQ19OUihjb21tYW5kKTsKKyAgICAvL0RFQlVHKCJGVDEwMDA6ZnQxMDAwX2lvY3RsOmNtZCA9IDB4JXhcbiIsIGNtZCk7CiAKICAgICAvLyBwcm9jZXNzIHRoZSBjb21tYW5kCiAgICAgc3dpdGNoIChjbWQpIHsKICAgICBjYXNlIElPQ1RMX1JFR0lTVEVSX0NNRDoKLSAgICAgICAgICAgIERFQlVHKCJGVDEwMDA6ZnQxMDAwX0NoSW9jdGw6IElPQ1RMX0ZUMTAwMF9SRUdJU1RFUiBjYWxsZWRcbiIpOworICAgICAgICAgICAgREVCVUcoIkZUMTAwMDpmdDEwMDBfaW9jdGw6IElPQ1RMX0ZUMTAwMF9SRUdJU1RFUiBjYWxsZWRcbiIpOwogICAgICAgICAgICAgcmVzdWx0ID0gZ2V0X3VzZXIodGVtcHdvcmQsIChfX3UxNiBfX3VzZXIqKWFyZ3ApOwogICAgICAgICAgICAgaWYgKHJlc3VsdCkgewogICAgICAgICAgICAgICAgIERFQlVHKCJyZXN1bHQgPSAlZCBmYWlsZWQgdG8gZ2V0X3VzZXJcbiIsIHJlc3VsdCk7CkBAIC01NzcsOSArNDQ0LDkgQEAKICAgICAgICAgICAgIGlmICh0ZW1wd29yZCA9PSBEU1BCQ01TR0lEKSB7CiAgICAgICAgICAgICAgICAgLy8gU2VhcmNoIGZvciBtYXRjaGluZyBmaWxlIG9iamVjdAogICAgICAgICAgICAgICAgIGZvciAoaT0wOyBpPE1BWF9OVU1fQVBQOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCBpbmZvLT5hcHBfaW5mb1tpXS5maWxlb2JqZWN0ID09ICZGaWxlLT5mX293bmVyKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICggaW5mby0+YXBwX2luZm9baV0uZmlsZW9iamVjdCA9PSAmZmlsZS0+Zl9vd25lcikgewogICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+YXBwX2luZm9baV0uRHNwQkNNc2dGbGFnID0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHKCJGVDEwMDA6ZnQxMDAwX0NoSW9jdGw6UmVnaXN0ZXJlZCBmb3IgYnJvYWRjYXN0IG1lc3NhZ2VzXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHKCJGVDEwMDA6ZnQxMDAwX2lvY3RsOlJlZ2lzdGVyZWQgZm9yIGJyb2FkY2FzdCBtZXNzYWdlc1xuIik7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KQEAgLTU4NywzNCArNDU0LDM0IEBACiAgICAgICAgICAgICBicmVhazsKIAogICAgIGNhc2UgSU9DVExfR0VUX1ZFUl9DTUQ6Ci0gICAgICAgIERFQlVHKCJGVDEwMDA6ZnQxMDAwX0NoSW9jdGw6IElPQ1RMX0ZUMTAwMF9HRVRfVkVSIGNhbGxlZFxuIik7CisgICAgICAgIERFQlVHKCJGVDEwMDA6ZnQxMDAwX2lvY3RsOiBJT0NUTF9GVDEwMDBfR0VUX1ZFUiBjYWxsZWRcbiIpOwogCiAgICAgICAgIGdldF92ZXJfZGF0YS5kcnZfdmVyID0gRlQxMDAwX0RSVl9WRVI7CiAKICAgICAgICAgaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmZ2V0X3Zlcl9kYXRhLCBzaXplb2YoZ2V0X3Zlcl9kYXRhKSkgKSB7Ci0gICAgICAgICAgICBERUJVRygiRlQxMDAwOmZ0MTAwMF9DaElvY3RsOiBjb3B5IGZhdWx0IG9jY3VycmVkXG4iKTsKKyAgICAgICAgICAgIERFQlVHKCJGVDEwMDA6ZnQxMDAwX2lvY3RsOiBjb3B5IGZhdWx0IG9jY3VycmVkXG4iKTsKICAgICAgICAgICAgIHJlc3VsdCA9IC1FRkFVTFQ7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCi0gICAgICAgIERFQlVHKCJGVDEwMDA6ZnQxMDAwX0NoSW9jdGw6ZHJpdmVyIHZlcnNpb24gPSAweCV4XG4iLCh1bnNpZ25lZCBpbnQpZ2V0X3Zlcl9kYXRhLmRydl92ZXIpOworICAgICAgICBERUJVRygiRlQxMDAwOmZ0MTAwMF9pb2N0bDpkcml2ZXIgdmVyc2lvbiA9IDB4JXhcbiIsKHVuc2lnbmVkIGludClnZXRfdmVyX2RhdGEuZHJ2X3Zlcik7CiAKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBJT0NUTF9DT05ORUNUOgogICAgICAgICAvLyBDb25uZWN0IE1lc3NhZ2UKLSAgICAgICAgREVCVUcoIkZUMTAwMDpmdDEwMDBfQ2hJb2N0bDogSU9DVExfRlQxMDAwX0NPTk5FQ1RcbiIpOworICAgICAgICBERUJVRygiRlQxMDAwOmZ0MTAwMF9pb2N0bDogSU9DVExfRlQxMDAwX0NPTk5FQ1RcbiIpOwogICAgICAgICBDb25uZWN0aW9uTXNnWzc5XSA9IDB4ZmM7CiAJCQkgICBDYXJkU2VuZENvbW1hbmQoZnQxMDAwZGV2LCAodW5zaWduZWQgc2hvcnQgKilDb25uZWN0aW9uTXNnLCAweDRjKTsKIAogICAgICAgICBicmVhazsKICAgICBjYXNlIElPQ1RMX0RJU0NPTk5FQ1Q6CiAgICAgICAgIC8vIERpc2Nvbm5lY3QgTWVzc2FnZQotICAgICAgICBERUJVRygiRlQxMDAwOmZ0MTAwMF9DaElvY3RsOiBJT0NUTF9GVDEwMDBfRElTQ09OTkVDVFxuIik7CisgICAgICAgIERFQlVHKCJGVDEwMDA6ZnQxMDAwX2lvY3RsOiBJT0NUTF9GVDEwMDBfRElTQ09OTkVDVFxuIik7CiAgICAgICAgIENvbm5lY3Rpb25Nc2dbNzldID0gMHhmZDsKIAkJCSAgIENhcmRTZW5kQ29tbWFuZChmdDEwMDBkZXYsICh1bnNpZ25lZCBzaG9ydCAqKUNvbm5lY3Rpb25Nc2csIDB4NGMpOwogICAgICAgICBicmVhazsKICAgICBjYXNlIElPQ1RMX0dFVF9EU1BfU1RBVF9DTUQ6Ci0gICAgICAgIC8vREVCVUcoIkZUMTAwMDpmdDEwMDBfQ2hJb2N0bDogSU9DVExfRlQxMDAwX0dFVF9EU1BfU1RBVCBjYWxsZWRcbiIpOworICAgICAgICAvL0RFQlVHKCJGVDEwMDA6ZnQxMDAwX2lvY3RsOiBJT0NUTF9GVDEwMDBfR0VUX0RTUF9TVEFUIGNhbGxlZFxuIik7CiAJbWVtc2V0KCZnZXRfc3RhdF9kYXRhLCAwLCBzaXplb2YoZ2V0X3N0YXRfZGF0YSkpOwogICAgICAgICBtZW1jcHkoZ2V0X3N0YXRfZGF0YS5Ec3BWZXIsIGluZm8tPkRzcFZlciwgRFNQVkVSU1opOwogICAgICAgICBtZW1jcHkoZ2V0X3N0YXRfZGF0YS5Id1Nlck51bSwgaW5mby0+SHdTZXJOdW0sIEhXU0VSTlVNU1opOwpAQCAtNjIyLDEyICs0ODksMTIgQEAKICAgICAgICAgbWVtY3B5KGdldF9zdGF0X2RhdGEuZXVpNjQsIGluZm8tPmV1aTY0LCBFVUlTWik7CiAKICAgICAgICAgICAgIGlmIChpbmZvLT5Qcm9nQ29uU3RhdCAhPSAweEZGKSB7Ci0gICAgICAgICAgICAgICAgZnQxMDAwX3JlYWRfZHByYW0xNihmdDEwMDBkZXYsIEZUMTAwMF9NQUdfRFNQX0xFRCwgKFBVQ0hBUikmbGVkU3RhdCwgRlQxMDAwX01BR19EU1BfTEVEX0lORFgpOworICAgICAgICAgICAgICAgIGZ0MTAwMF9yZWFkX2RwcmFtMTYoZnQxMDAwZGV2LCBGVDEwMDBfTUFHX0RTUF9MRUQsICh1OCAqKSZsZWRTdGF0LCBGVDEwMDBfTUFHX0RTUF9MRURfSU5EWCk7CiAgICAgICAgICAgICAgICAgZ2V0X3N0YXRfZGF0YS5MZWRTdGF0ID0gbnRvaHMobGVkU3RhdCk7Ci0gICAgICAgICAgICAgICAgREVCVUcoIkZUMTAwMDpmdDEwMDBfQ2hJb2N0bDogTGVkU3RhdCA9IDB4JXhcbiIsIGdldF9zdGF0X2RhdGEuTGVkU3RhdCk7Ci0gICAgICAgICAgICAgICAgZnQxMDAwX3JlYWRfZHByYW0xNihmdDEwMDBkZXYsIEZUMTAwMF9NQUdfRFNQX0NPTl9TVEFURSwgKFBVQ0hBUikmY29uU3RhdCwgRlQxMDAwX01BR19EU1BfQ09OX1NUQVRFX0lORFgpOworICAgICAgICAgICAgICAgIERFQlVHKCJGVDEwMDA6ZnQxMDAwX2lvY3RsOiBMZWRTdGF0ID0gMHgleFxuIiwgZ2V0X3N0YXRfZGF0YS5MZWRTdGF0KTsKKyAgICAgICAgICAgICAgICBmdDEwMDBfcmVhZF9kcHJhbTE2KGZ0MTAwMGRldiwgRlQxMDAwX01BR19EU1BfQ09OX1NUQVRFLCAodTggKikmY29uU3RhdCwgRlQxMDAwX01BR19EU1BfQ09OX1NUQVRFX0lORFgpOwogICAgICAgICAgICAgICAgIGdldF9zdGF0X2RhdGEuQ29uU3RhdCA9IG50b2hzKGNvblN0YXQpOwotICAgICAgICAgICAgICAgIERFQlVHKCJGVDEwMDA6ZnQxMDAwX0NoSW9jdGw6IENvblN0YXQgPSAweCV4XG4iLCBnZXRfc3RhdF9kYXRhLkNvblN0YXQpOworICAgICAgICAgICAgICAgIERFQlVHKCJGVDEwMDA6ZnQxMDAwX2lvY3RsOiBDb25TdGF0ID0gMHgleFxuIiwgZ2V0X3N0YXRfZGF0YS5Db25TdGF0KTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgIGdldF9zdGF0X2RhdGEuQ29uU3RhdCA9IDB4MGY7CkBAIC02NDIsNyArNTA5LDcgQEAKICAgICAgICAgZ2V0X3N0YXRfZGF0YS5Db25UbSA9ICh1MzIpKHR2LnR2X3NlYyAtIGluZm8tPkNvblRtKTsKICAgICAgICAgREVCVUcoIkNvbm5lY3Rpb24gVGltZSA9ICVkXG4iLCAoaW50KWdldF9zdGF0X2RhdGEuQ29uVG0pOwogICAgICAgICBpZiAoY29weV90b191c2VyKGFyZ3AsICZnZXRfc3RhdF9kYXRhLCBzaXplb2YoZ2V0X3N0YXRfZGF0YSkpICkgewotICAgICAgICAgICAgREVCVUcoIkZUMTAwMDpmdDEwMDBfQ2hJb2N0bDogY29weSBmYXVsdCBvY2N1cnJlZFxuIik7CisgICAgICAgICAgICBERUJVRygiRlQxMDAwOmZ0MTAwMF9pb2N0bDogY29weSBmYXVsdCBvY2N1cnJlZFxuIik7CiAgICAgICAgICAgICByZXN1bHQgPSAtRUZBVUxUOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KQEAgLTY1MCwxNyArNTE3LDE3IEBACiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgSU9DVExfU0VUX0RQUkFNX0NNRDoKICAgICAgICAgewotICAgICAgICAgICAgSU9DVExfRFBSQU1fQkxLICpkcHJhbV9kYXRhOworICAgICAgICAgICAgSU9DVExfRFBSQU1fQkxLICpkcHJhbV9kYXRhID0gTlVMTDsKICAgICAgICAgICAgIC8vSU9DVExfRFBSQU1fQ09NTUFORCBkcHJhbV9jb21tYW5kOwotICAgICAgICAgICAgVVNIT1JUIHF0eXBlOwotICAgICAgICAgICAgVVNIT1JUIG1zZ3N6OworICAgICAgICAgICAgdTE2IHF0eXBlOworICAgICAgICAgICAgdTE2IG1zZ3N6OwogCQlzdHJ1Y3QgcHNldWRvX2hkciAqcHBzZXVkb19oZHI7Ci0gICAgICAgICAgICBQVVNIT1JUIHBtc2c7Ci0gICAgICAgICAgICBVU0hPUlQgdG90YWxfbGVuOwotICAgICAgICAgICAgVVNIT1JUIGFwcF9pbmRleDsKKyAgICAgICAgICAgIHUxNiAqcG1zZzsKKyAgICAgICAgICAgIHUxNiB0b3RhbF9sZW47CisgICAgICAgICAgICB1MTYgYXBwX2luZGV4OwogICAgICAgICAgICAgdTE2IHN0YXR1czsKIAotICAgICAgICAgICAgLy9ERUJVRygiRlQxMDAwOmZ0MTAwMF9DaElvY3RsOiBJT0NUTF9GVDEwMDBfU0VUX0RQUkFNIGNhbGxlZFxuIik7CisgICAgICAgICAgICAvL0RFQlVHKCJGVDEwMDA6ZnQxMDAwX2lvY3RsOiBJT0NUTF9GVDEwMDBfU0VUX0RQUkFNIGNhbGxlZFxuIik7CiAKIAogICAgICAgICAgICAgaWYgKGZ0MTAwMF9mbGFyaW9uX2NudCA9PSAwKSB7CkBAIC02NzksMTUgKzU0NiwxNSBAQAogCiAgICAgICAgICAgICBpZiAoaW5mby0+Q2FyZFJlYWR5KSB7CiAKLSAgICAgICAgICAgICAgIC8vREVCVUcoIkZUMTAwMDpmdDEwMDBfQ2hJb2N0bDogdHJ5IHRvIFNFVF9EUFJBTSBcbiIpOworICAgICAgICAgICAgICAgLy9ERUJVRygiRlQxMDAwOmZ0MTAwMF9pb2N0bDogdHJ5IHRvIFNFVF9EUFJBTSBcbiIpOwogCiAgICAgICAgICAgICAgICAgLy8gR2V0IHRoZSBsZW5ndGggZmllbGQgdG8gc2VlIGhvdyBtYW55IGJ5dGVzIHRvIGNvcHkKICAgICAgICAgICAgICAgICByZXN1bHQgPSBnZXRfdXNlcihtc2dzeiwgKF9fdTE2IF9fdXNlciAqKWFyZ3ApOwogICAgICAgICAgICAgICAgIG1zZ3N6ID0gbnRvaHMgKG1zZ3N6KTsKLSAgICAgICAgICAgICAgICAvL0RFQlVHKCJGVDEwMDA6ZnQxMDAwX0NoSW9jdGw6IGxlbmd0aCBvZiBtZXNzYWdlID0gJWRcbiIsIG1zZ3N6KTsKKyAgICAgICAgICAgICAgICAvL0RFQlVHKCJGVDEwMDA6ZnQxMDAwX2lvY3RsOiBsZW5ndGggb2YgbWVzc2FnZSA9ICVkXG4iLCBtc2dzeik7CiAKICAgICAgICAgICAgICAgICBpZiAobXNnc3ogPiBNQVhfQ01EX1NRU0laRSkgewotICAgICAgICAgICAgICAgICAgICBERUJVRygiRlQxMDAwOmZ0MTAwMF9DaElvY3RsOiBiYWQgbWVzc2FnZSBsZW5ndGggPSAlZFxuIiwgbXNnc3opOworICAgICAgICAgICAgICAgICAgICBERUJVRygiRlQxMDAwOmZ0MTAwMF9pb2N0bDogYmFkIG1lc3NhZ2UgbGVuZ3RoID0gJWRcbiIsIG1zZ3N6KTsKICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gLUVJTlZBTDsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQpAQCAtNjk3LDIyICs1NjQsMTQgQEAKIAkJaWYgKCFkcHJhbV9kYXRhKQogCQkJYnJlYWs7CiAKLSAgICAgICAgICAgICAgICAvL2lmICggY29weV9mcm9tX3VzZXIoJihkcHJhbV9jb21tYW5kLmRwcmFtX2JsayksIChQSU9DVExfRFBSQU1fQkxLKUFyZ3VtZW50LCBtc2dzeisyKSApIHsKLSAgICAgICAgICAgICAgICBpZiAoIGNvcHlfZnJvbV91c2VyKCZkcHJhbV9kYXRhLCBhcmdwLCBtc2dzeisyKSApIHsKKyAgICAgICAgICAgICAgICBpZiAoIGNvcHlfZnJvbV91c2VyKGRwcmFtX2RhdGEsIGFyZ3AsIG1zZ3N6KzIpICkgewogICAgICAgICAgICAgICAgICAgICBERUJVRygiRlQxMDAwOmZ0MTAwMF9DaElvY3RsOiBjb3B5IGZhdWx0IG9jY3VycmVkXG4iKTsKICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gLUVGQVVMVDsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgZWxzZSB7Ci0jaWYgMAotICAgICAgICAgICAgICAgICAgICAvLyB3aGMgLSBmb3IgZGVidWdnaW5nIG9ubHkKLSAgICAgICAgICAgICAgICAgICAgcHRyID0gKGNoYXIgKikmZHByYW1fZGF0YTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpPTA7IGk8bXNnc3o7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgREVCVUcoMSwiRlQxMDAwOmZ0MTAwMF9DaElvY3RsOiBkYXRhICVkID0gMHgleFxuIiwgaSwgKnB0cisrKTsKLSAgICAgICAgICAgICAgICAgICAgfQotI2VuZGlmCiAgICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoaXMgbWVzc2FnZSBjYW1lIGZyb20gYSByZWdpc3RlcmVkIGFwcGxpY2F0aW9uCiAgICAgICAgICAgICAgICAgICAgIGZvciAoaT0wOyBpPE1BWF9OVU1fQVBQOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICggaW5mby0+YXBwX2luZm9baV0uZmlsZW9iamVjdCA9PSAmRmlsZS0+Zl9vd25lcikgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBpbmZvLT5hcHBfaW5mb1tpXS5maWxlb2JqZWN0ID09ICZmaWxlLT5mX293bmVyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTcyNSwxNiArNTg0LDE1IEBACiAgICAgICAgICAgICAgICAgICAgIGFwcF9pbmRleCA9IGk7CiAKICAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgbWVzc2FnZSBxdHlwZSB0eXBlIHdoaWNoIGlzIHRoZSBsb3dlciBieXRlIHdpdGhpbiBxb3NfY2xhc3MKLSAgICAgICAgICAgICAgICAgICAgLy9xdHlwZSA9IG50b2hzKGRwcmFtX2NvbW1hbmQuZHByYW1fYmxrLnBzZXVkb2hkci5xb3NfY2xhc3MpICYgMHhmZjsKICAgICAgICAgICAgICAgICAgICAgcXR5cGUgPSBudG9ocyhkcHJhbV9kYXRhLT5wc2V1ZG9oZHIucW9zX2NsYXNzKSAmIDB4ZmY7Ci0gICAgICAgICAgICAgICAgICAgIC8vREVCVUcoIkZUMTAwMF9mdDEwMDBfQ2hJb2N0bDogcXR5cGUgPSAlZFxuIiwgcXR5cGUpOworICAgICAgICAgICAgICAgICAgICAvL0RFQlVHKCJGVDEwMDBfZnQxMDAwX2lvY3RsOiBxdHlwZSA9ICVkXG4iLCBxdHlwZSk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChxdHlwZSkgewogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgLy8gUHV0IG1lc3NhZ2UgaW50byBTbG93IFF1ZXVlCiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBPbmx5IHB1dCBhIG1lc3NhZ2UgaW50byB0aGUgRFBSQU0gaWYgbXNnIGRvb3JiZWxsIGlzIGF2YWlsYWJsZQogICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gZnQxMDAwX3JlYWRfcmVnaXN0ZXIoZnQxMDAwZGV2LCAmdGVtcHdvcmQsIEZUMTAwMF9SRUdfRE9PUkJFTEwpOwotICAgICAgICAgICAgICAgICAgICAgICAgLy9ERUJVRygiRlQxMDAwX2Z0MTAwMF9DaElvY3RsOiBSRUFEIFJFR0lTVEVSIHRlbXB3b3JkPSV4XG4iLCB0ZW1wd29yZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAvL0RFQlVHKCJGVDEwMDBfZnQxMDAwX2lvY3RsOiBSRUFEIFJFR0lTVEVSIHRlbXB3b3JkPSV4XG4iLCB0ZW1wd29yZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGVtcHdvcmQgJiBGVDEwMDBfREJfRFBSQU1fVFgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTdXNwZW5kIGZvciAybXMgYW5kIHRyeSBhZ2FpbiBkdWUgdG8gRFNQIGRvb3JiZWxsIGJ1c3kKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZGVsYXkoMik7CkBAIC03NTAsNyArNjA4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZGVsYXkoMyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gZnQxMDAwX3JlYWRfcmVnaXN0ZXIoZnQxMDAwZGV2LCAmdGVtcHdvcmQsIEZUMTAwMF9SRUdfRE9PUkJFTEwpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0ZW1wd29yZCAmIEZUMTAwMF9EQl9EUFJBTV9UWCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUJVRygiRlQxMDAwOmZ0MTAwMF9DaElvY3RsOkRvb3JiZWxsIG5vdCBhdmFpbGFibGVcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUJVRygiRlQxMDAwOmZ0MTAwMF9pb2N0bDpEb29yYmVsbCBub3QgYXZhaWxhYmxlXG4iKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gLUVOT1RUWTsKIAkJCQkJCWtmcmVlKGRwcmFtX2RhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTc2MCwxMyArNjE4LDEyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgICAgICAgICAvL0RFQlVHKCJGVDEwMDBfZnQxMDAwX0NoSW9jdGw6IGZpbmlzaGVkIHJlYWRpbmcgcmVnaXN0ZXJcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgLy9ERUJVRygiRlQxMDAwX2Z0MTAwMF9pb2N0bDogZmluaXNoZWQgcmVhZGluZyByZWdpc3RlclxuIik7CiAKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB3ZSBhcmUgd2l0aGluIHRoZSBsaW1pdHMgb2YgdGhlIHNsb3cgcXVldWUgbWVtb3J5IGxpbWl0YXRpb24KICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKG1zZ3N6IDwgTUFYX0NNRF9TUVNJWkUpICYmIChtc2dzeiA+IFBTRVVET1NaKSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOZWVkIHRvIHB1dCBzZXF1ZW5jZSBudW1iZXIgcGx1cyBuZXcgY2hlY2tzdW0gZm9yIG1lc3NhZ2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3Btc2cgPSAoUFVTSE9SVCkmZHByYW1fY29tbWFuZC5kcHJhbV9ibGsucHNldWRvaGRyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBtc2cgPSAoUFVTSE9SVCkmZHByYW1fZGF0YS0+cHNldWRvaGRyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBtc2cgPSAodTE2ICopJmRwcmFtX2RhdGEtPnBzZXVkb2hkcjsKIAkJCQlwcHNldWRvX2hkciA9IChzdHJ1Y3QgcHNldWRvX2hkciAqKXBtc2c7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxfbGVuID0gbXNnc3orMjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodG90YWxfbGVuICYgMHgxKSB7CkBAIC03ODUsMTcgKzY0Miw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBtc2crKzsKIAkJCQlwcHNldWRvX2hkciA9IChzdHJ1Y3QgcHNldWRvX2hkciAqKXBtc2c7Ci0jaWYgMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ciA9IGRwcmFtX2RhdGE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgREVCVUcoIkZUMTAwMDpmdDEwMDBfQ2hJb2N0bDogQ29tbWFuZCBTZW5kXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaTx0b3RhbF9sZW47IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUJVRygiRlQxMDAwOmZ0MTAwMF9DaElvY3RsOiBkYXRhICVkID0gMHgleFxuIiwgaSwgKnB0cisrKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0jZW5kaWYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2RwcmFtX2NvbW1hbmQuZXh0cmEgPSAwOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9DYXJkU2VuZENvbW1hbmQoZnQxMDAwZGV2LCh1bnNpZ25lZCBjaGFyKikmZHByYW1fY29tbWFuZCx0b3RhbF9sZW4rMik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FyZFNlbmRDb21tYW5kKGZ0MTAwMGRldiwodW5zaWduZWQgc2hvcnQqKWRwcmFtX2RhdGEsdG90YWxfbGVuKzIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FyZFNlbmRDb21tYW5kKGZ0MTAwMGRldiwodW5zaWduZWQgc2hvcnQqKWRwcmFtX2RhdGEsdG90YWxfbGVuKzIpOwogCiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5hcHBfaW5mb1thcHBfaW5kZXhdLm5UeE1zZysrOwpAQCAtODA3LDcgKzY1NCw3IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgREVCVUcoIkZUMTAwMDpmdDEwMDBfQ2hJb2N0bDogQ2FyZCBub3QgcmVhZHkgdGFrZSBtZXNzYWdlc1xuIik7CisgICAgICAgICAgICAgICAgREVCVUcoIkZUMTAwMDpmdDEwMDBfaW9jdGw6IENhcmQgbm90IHJlYWR5IHRha2UgbWVzc2FnZXNcbiIpOwogICAgICAgICAgICAgICAgIHJlc3VsdCA9IC1FQUNDRVM7CiAgICAgICAgICAgICB9CiAJICAgIGtmcmVlKGRwcmFtX2RhdGEpOwpAQCAtODIwLDcgKzY2Nyw3IEBACiAgICAgICAgICAgICBJT0NUTF9EUFJBTV9CTEsgX191c2VyICpwaW9jdGxfZHByYW07CiAgICAgICAgICAgICBpbnQgbXNnbGVuOwogCi0gICAgICAgICAgICAvL0RFQlVHKCJGVDEwMDA6ZnQxMDAwX0NoSW9jdGw6IElPQ1RMX0ZUMTAwMF9HRVRfRFBSQU0gY2FsbGVkXG4iKTsKKyAgICAgICAgICAgIC8vREVCVUcoIkZUMTAwMDpmdDEwMDBfaW9jdGw6IElPQ1RMX0ZUMTAwMF9HRVRfRFBSQU0gY2FsbGVkXG4iKTsKIAogICAgICAgICAgICAgaWYgKGZ0MTAwMF9mbGFyaW9uX2NudCA9PSAwKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuICgtRUJBREYpOwpAQCAtODI4LDE1ICs2NzUsMTUgQEAKIAogICAgICAgICAgICAgLy8gU2VhcmNoIGZvciBtYXRjaGluZyBmaWxlIG9iamVjdAogICAgICAgICAgICAgZm9yIChpPTA7IGk8TUFYX05VTV9BUFA7IGkrKykgewotICAgICAgICAgICAgICAgIGlmICggaW5mby0+YXBwX2luZm9baV0uZmlsZW9iamVjdCA9PSAmRmlsZS0+Zl9vd25lcikgewotICAgICAgICAgICAgICAgICAgICAvL0RFQlVHKCJGVDEwMDA6ZnQxMDAwX0NoSW9jdGw6IE1lc3NhZ2UgaXMgZm9yIEFwcElkID0gJWRcbiIsIGluZm8tPmFwcF9pbmZvW2ldLmFwcF9pZCk7CisgICAgICAgICAgICAgICAgaWYgKCBpbmZvLT5hcHBfaW5mb1tpXS5maWxlb2JqZWN0ID09ICZmaWxlLT5mX293bmVyKSB7CisgICAgICAgICAgICAgICAgICAgIC8vREVCVUcoIkZUMTAwMDpmdDEwMDBfaW9jdGw6IE1lc3NhZ2UgaXMgZm9yIEFwcElkID0gJWRcbiIsIGluZm8tPmFwcF9pbmZvW2ldLmFwcF9pZCk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgLy8gQ291bGQgbm90IGZpbmQgYXBwbGljYXRpb24gaW5mbyBibG9jawogICAgICAgICAgICAgaWYgKGkgPT0gTUFYX05VTV9BUFApIHsKLSAgICAgICAgICAgICAgICBERUJVRygiRlQxMDAwOmZ0MTAwMF9DaElvY3RsOkNvdWxkIG5vdCBmaW5kIGFwcGxpY2F0aW9uIGluZm8gYmxvY2tcbiIpOworICAgICAgICAgICAgICAgIERFQlVHKCJGVDEwMDA6ZnQxMDAwX2lvY3RsOkNvdWxkIG5vdCBmaW5kIGFwcGxpY2F0aW9uIGluZm8gYmxvY2tcbiIpOwogICAgICAgICAgICAgICAgIHJlc3VsdCA9IC1FQkFERjsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KQEAgLTg0NCwyMiArNjkxLDIyIEBACiAgICAgICAgICAgICByZXN1bHQgPSAwOwogICAgICAgICAgICAgcGlvY3RsX2RwcmFtID0gYXJncDsKICAgICAgICAgICAgIGlmIChsaXN0X2VtcHR5KCZpbmZvLT5hcHBfaW5mb1tpXS5hcHBfc3FsaXN0KSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgLy9ERUJVRygiRlQxMDAwOmZ0MTAwMF9DaElvY3RsOk1lc3NhZ2UgZGV0ZWN0ZWQgaW4gc2xvdyBxdWV1ZVxuIik7CisgICAgICAgICAgICAgICAgLy9ERUJVRygiRlQxMDAwOmZ0MTAwMF9pb2N0bDpNZXNzYWdlIGRldGVjdGVkIGluIHNsb3cgcXVldWVcbiIpOwogICAgICAgICAgICAgICAgIHNwaW5fbG9ja19pcnFzYXZlKCZmcmVlX2J1ZmZfbG9jaywgZmxhZ3MpOwogICAgICAgICAgICAgICAgIHBkcHJhbV9ibGsgPSBsaXN0X2VudHJ5KGluZm8tPmFwcF9pbmZvW2ldLmFwcF9zcWxpc3QubmV4dCwgc3RydWN0IGRwcmFtX2JsaywgbGlzdCk7CiAgICAgICAgICAgICAgICAgbGlzdF9kZWwoJnBkcHJhbV9ibGstPmxpc3QpOwogICAgICAgICAgICAgICAgIGluZm8tPmFwcF9pbmZvW2ldLk51bU9mTXNnLS07Ci0gICAgICAgICAgICAgICAgLy9ERUJVRygiRlQxMDAwOmZ0MTAwMF9DaElvY3RsOk51bU9mTXNnIGZvciBhcHAgJWQgPSAlZFxuIiwgaSwgaW5mby0+YXBwX2luZm9baV0uTnVtT2ZNc2cpOworICAgICAgICAgICAgICAgIC8vREVCVUcoIkZUMTAwMDpmdDEwMDBfaW9jdGw6TnVtT2ZNc2cgZm9yIGFwcCAlZCA9ICVkXG4iLCBpLCBpbmZvLT5hcHBfaW5mb1tpXS5OdW1PZk1zZyk7CiAgICAgICAgICAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZnJlZV9idWZmX2xvY2ssIGZsYWdzKTsKICAgICAgICAgICAgICAgICBtc2dsZW4gPSBudG9ocygqKHUxNiAqKXBkcHJhbV9ibGstPnBidWZmZXIpICsgUFNFVURPU1o7CiAgICAgICAgICAgICAgICAgcmVzdWx0ID0gZ2V0X3VzZXIobXNnbGVuLCAmcGlvY3RsX2RwcmFtLT50b3RhbF9sZW4pOwogCQlpZiAocmVzdWx0KQogCQkJYnJlYWs7CiAJCW1zZ2xlbiA9IGh0b25zKG1zZ2xlbik7Ci0gICAgICAgICAgICAgICAgLy9ERUJVRygiRlQxMDAwOmZ0MTAwMF9DaElvY3RsOm1zZyBsZW5ndGggPSAleFxuIiwgbXNnbGVuKTsKKyAgICAgICAgICAgICAgICAvL0RFQlVHKCJGVDEwMDA6ZnQxMDAwX2lvY3RsOm1zZyBsZW5ndGggPSAleFxuIiwgbXNnbGVuKTsKICAgICAgICAgICAgICAgICBpZihjb3B5X3RvX3VzZXIgKCZwaW9jdGxfZHByYW0tPnBzZXVkb2hkciwgcGRwcmFtX2Jsay0+cGJ1ZmZlciwgbXNnbGVuKSkKIAkJCQl7Ci0JCQkJCURFQlVHKCJGVDEwMDA6ZnQxMDAwX0NoSW9jdGw6IGNvcHkgZmF1bHQgb2NjdXJyZWRcbiIpOworCQkJCQlERUJVRygiRlQxMDAwOmZ0MTAwMF9pb2N0bDogY29weSBmYXVsdCBvY2N1cnJlZFxuIik7CiAJICAgICAgICAgICAgIAlyZXN1bHQgPSAtRUZBVUxUOwogCSAgICAgICAgICAgICAJYnJlYWs7CiAJCQkJfQpAQCAtODY3LDEyICs3MTQsMTIgQEAKICAgICAgICAgICAgICAgICBmdDEwMDBfZnJlZV9idWZmZXIocGRwcmFtX2JsaywgJmZyZWVyY3Zwb29sKTsKICAgICAgICAgICAgICAgICByZXN1bHQgPSBtc2dsZW47CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvL0RFQlVHKCJGVDEwMDA6ZnQxMDAwX0NoSW9jdGw6IElPQ1RMX0ZUMTAwMF9HRVRfRFBSQU0gbm8gbWVzc2FnZVxuIik7CisgICAgICAgICAgICAvL0RFQlVHKCJGVDEwMDA6ZnQxMDAwX2lvY3RsOiBJT0NUTF9GVDEwMDBfR0VUX0RQUkFNIG5vIG1lc3NhZ2VcbiIpOwogICAgICAgICB9CiAgICAgICAgIGJyZWFrOwogCiAgICAgZGVmYXVsdDoKLSAgICAgICAgREVCVUcoIkZUMTAwMDpmdDEwMDBfQ2hJb2N0bDp1bmtub3duIGNvbW1hbmQ6IDB4JXhcbiIsIENvbW1hbmQpOworICAgICAgICBERUJVRygiRlQxMDAwOmZ0MTAwMF9pb2N0bDp1bmtub3duIGNvbW1hbmQ6IDB4JXhcbiIsIGNvbW1hbmQpOwogICAgICAgICByZXN1bHQgPSAtRU5PVFRZOwogICAgICAgICBicmVhazsKICAgICB9CkBAIC04ODEsNyArNzI4LDcgQEAKIH0KIAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIEZ1bmN0aW9uOiAgICBmdDEwMDBfQ2hSZWxlYXNlCisvLyBGdW5jdGlvbjogICAgZnQxMDAwX3JlbGVhc2UKIC8vCiAvLyBQYXJhbWV0ZXJzOgogLy8KQEAgLTg5MCwxNyArNzM3LDE3IEBACiAvLyBOb3RlczoKIC8vCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotc3RhdGljIGludCBmdDEwMDBfQ2hSZWxlYXNlIChzdHJ1Y3QgaW5vZGUgKklub2RlLCBzdHJ1Y3QgZmlsZSAqRmlsZSkKK3N0YXRpYyBpbnQgZnQxMDAwX3JlbGVhc2UgKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQogewogCXN0cnVjdCBmdDEwMDBfaW5mbyAqaW5mbzsKICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OwogICAgIGludCBpOwogCXN0cnVjdCBkcHJhbV9ibGsgKnBkcHJhbV9ibGs7CiAKLSAgICBERUJVRygiZnQxMDAwX0NoUmVsZWFzZSBjYWxsZWRcbiIpOworICAgIERFQlVHKCJmdDEwMDBfcmVsZWFzZSBjYWxsZWRcbiIpOwogCi0gICAgZGV2ID0gRmlsZS0+cHJpdmF0ZV9kYXRhOwotCWluZm8gPSAoc3RydWN0IGZ0MTAwMF9pbmZvICopIG5ldGRldl9wcml2KGRldik7CisgICAgZGV2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCWluZm8gPSBuZXRkZXZfcHJpdihkZXYpOwogCiAgICAgaWYgKGZ0MTAwMF9mbGFyaW9uX2NudCA9PSAwKSB7CiAgICAgICAgIGluZm8tPmFwcGNudC0tOwpAQCAtOTA5LDggKzc1Niw4IEBACiAKICAgICAvLyBTZWFyY2ggZm9yIG1hdGNoaW5nIGZpbGUgb2JqZWN0CiAgICAgZm9yIChpPTA7IGk8TUFYX05VTV9BUFA7IGkrKykgewotICAgICAgICBpZiAoIGluZm8tPmFwcF9pbmZvW2ldLmZpbGVvYmplY3QgPT0gJkZpbGUtPmZfb3duZXIpIHsKLSAgICAgICAgICAgIC8vREVCVUcoIkZUMTAwMDpmdDEwMDBfQ2hJb2N0bDogTWVzc2FnZSBpcyBmb3IgQXBwSWQgPSAlZFxuIiwgaW5mby0+YXBwX2luZm9baV0uYXBwX2lkKTsKKyAgICAgICAgaWYgKCBpbmZvLT5hcHBfaW5mb1tpXS5maWxlb2JqZWN0ID09ICZmaWxlLT5mX293bmVyKSB7CisgICAgICAgICAgICAvL0RFQlVHKCJGVDEwMDA6ZnQxMDAwX2lvY3RsOiBNZXNzYWdlIGlzIGZvciBBcHBJZCA9ICVkXG4iLCBpbmZvLT5hcHBfaW5mb1tpXS5hcHBfaWQpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZnQxMDAwL2Z0MTAwMC11c2IvZnQxMDAwX2Rvd25sb2FkLmMgYi9kcml2ZXJzL3N0YWdpbmcvZnQxMDAwL2Z0MTAwMC11c2IvZnQxMDAwX2Rvd25sb2FkLmMKaW5kZXggNGRkNDU2Zi4uMTc1NDZkOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2Z0MTAwMC9mdDEwMDAtdXNiL2Z0MTAwMF9kb3dubG9hZC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9mdDEwMDAvZnQxMDAwLXVzYi9mdDEwMDBfZG93bmxvYWQuYwpAQCAtMTIzLDExICsxMjMsMTEgQEAKIC8vIE5vdGVzOgogLy8KIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1zdGF0aWMgVUxPTkcgY2hlY2tfdXNiX2RiIChzdHJ1Y3QgZnQxMDAwX2RldmljZSAqZnQxMDAwZGV2KQorc3RhdGljIHUzMiBjaGVja191c2JfZGIgKHN0cnVjdCBmdDEwMDBfZGV2aWNlICpmdDEwMDBkZXYpCiB7CiAgICBpbnQgICAgICAgICAgICAgICBsb29wY250OwotICAgVVNIT1JUICAgICAgICAgICAgdGVtcDsKLSAgIFVMT05HICAgICAgICAgICAgIHN0YXR1czsKKyAgIHUxNiAgICAgICAgICAgIHRlbXA7CisgICB1MzIgICAgICAgICAgICAgc3RhdHVzOwogCiAgICBsb29wY250ID0gMDsKICAgIHdoaWxlIChsb29wY250IDwgMTApCkBAIC0xOTAsNyArMTkwLDcgQEAKIC8vIEZ1bmN0aW9uOiAgICBnZXRfaGFuZHNoYWtlCiAvLwogLy8gUGFyYW1ldGVyczogIHN0cnVjdCBmdDEwMDBfZGV2aWNlICAtIGRldmljZSBzdHJ1Y3R1cmUKLS8vICAgICAgICAgICAgICBVU0hPUlQgZXhwZWN0ZWRfdmFsdWUgLSB0aGUgaGFuZHNoYWtlIHZhbHVlIGV4cGVjdGVkCisvLyAgICAgICAgICAgICAgdTE2IGV4cGVjdGVkX3ZhbHVlIC0gdGhlIGhhbmRzaGFrZSB2YWx1ZSBleHBlY3RlZAogLy8KIC8vIFJldHVybnM6ICAgICBoYW5kc2hha2V2YWx1ZSAtIHN1Y2Nlc3MKIC8vICAgICAgICAgICAgICBIQU5EU0hBS0VfVElNRU9VVF9WQUxVRSAtIGZhaWx1cmUKQEAgLTIwMCwxMSArMjAwLDExIEBACiAvLyBOb3RlczoKIC8vCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotc3RhdGljIFVTSE9SVCBnZXRfaGFuZHNoYWtlKHN0cnVjdCBmdDEwMDBfZGV2aWNlICpmdDEwMDBkZXYsIFVTSE9SVCBleHBlY3RlZF92YWx1ZSkKK3N0YXRpYyB1MTYgZ2V0X2hhbmRzaGFrZShzdHJ1Y3QgZnQxMDAwX2RldmljZSAqZnQxMDAwZGV2LCB1MTYgZXhwZWN0ZWRfdmFsdWUpCiB7Ci0gICBVU0hPUlQgICAgICAgICAgICBoYW5kc2hha2U7CisgICB1MTYgICAgICAgICAgICBoYW5kc2hha2U7CiAgICBpbnQgICAgICAgICAgICAgICBsb29wY250OwotICAgVUxPTkcgICAgICAgICAgICAgc3RhdHVzPTA7CisgICB1MzIgICAgICAgICAgICAgc3RhdHVzPTA7CiAJc3RydWN0IGZ0MTAwMF9pbmZvICpwZnQxMDAwaW5mbyA9IG5ldGRldl9wcml2KGZ0MTAwMGRldi0+bmV0KTsKIAogICAgbG9vcGNudCA9IDA7CkBAIC0yMjgsNyArMjI4LDcgQEAKICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBmdDEwMDBfd3JpdGVfcmVnaXN0ZXIgKGZ0MTAwMGRldiwgIEZUMTAwMF9EQl9ETkxEX1JYLCBGVDEwMDBfUkVHX0RPT1JCRUxMKTsKICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIHN0YXR1cyA9IGZ0MTAwMF9yZWFkX2RwcmFtMTYgKGZ0MTAwMGRldiwgRFdOTERfTUFHMV9IQU5EU0hBS0VfTE9DLCAoUFVDSEFSKSZoYW5kc2hha2UsIDEpOworICAgICAgICAgICAgICAgIHN0YXR1cyA9IGZ0MTAwMF9yZWFkX2RwcmFtMTYgKGZ0MTAwMGRldiwgRFdOTERfTUFHMV9IQU5EU0hBS0VfTE9DLCAodTggKikmaGFuZHNoYWtlLCAxKTsKICAgICAgICAgICAgICAgICAvL0RFQlVHKCJnZXRfaGFuZHNoYWtlOiBoYW5kc2hha2UgaXMgJXhcbiIsIHRlbXB4KTsKICAgICAgICAgICAgICAgICBoYW5kc2hha2UgPSBudG9ocyhoYW5kc2hha2UpOwogICAgICAgICAgICAgICAgIC8vREVCVUcoImdldF9oYW5kc2hha2U6IGFmdGVyIHN3YXAsIGhhbmRzaGFrZSBpcyAleFxuIiwgaGFuZHNoYWtlKTsKQEAgLTI1OSw3ICsyNTksNyBAQAogLy8gRnVuY3Rpb246ICAgIHB1dF9oYW5kc2hha2UKIC8vCiAvLyBQYXJhbWV0ZXJzOiAgc3RydWN0IGZ0MTAwMF9kZXZpY2UgIC0gZGV2aWNlIHN0cnVjdHVyZQotLy8gICAgICAgICAgICAgIFVTSE9SVCBoYW5kc2hha2VfdmFsdWUgLSBoYW5kc2hha2UgdG8gYmUgd3JpdHRlbgorLy8gICAgICAgICAgICAgIHUxNiBoYW5kc2hha2VfdmFsdWUgLSBoYW5kc2hha2UgdG8gYmUgd3JpdHRlbgogLy8KIC8vIFJldHVybnM6ICAgICBub25lCiAvLwpAQCAtMjY5LDMwICsyNjksMzAgQEAKIC8vIE5vdGVzOgogLy8KIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1zdGF0aWMgdm9pZCBwdXRfaGFuZHNoYWtlKHN0cnVjdCBmdDEwMDBfZGV2aWNlICpmdDEwMDBkZXYsVVNIT1JUIGhhbmRzaGFrZV92YWx1ZSkKK3N0YXRpYyB2b2lkIHB1dF9oYW5kc2hha2Uoc3RydWN0IGZ0MTAwMF9kZXZpY2UgKmZ0MTAwMGRldix1MTYgaGFuZHNoYWtlX3ZhbHVlKQogewotICAgIFVMT05HIHRlbXB4OwotICAgIFVTSE9SVCB0ZW1wd29yZDsKLSAgICBVTE9ORyBzdGF0dXM7CisgICAgdTMyIHRlbXB4OworICAgIHUxNiB0ZW1wd29yZDsKKyAgICB1MzIgc3RhdHVzOwogCiAKIAotICAgICAgICB0ZW1weCA9IChVTE9ORyloYW5kc2hha2VfdmFsdWU7CisgICAgICAgIHRlbXB4ID0gKHUzMiloYW5kc2hha2VfdmFsdWU7CiAgICAgICAgIHRlbXB4ID0gbnRvaGwodGVtcHgpOwogCi0gICAgICAgIHRlbXB3b3JkID0gKFVTSE9SVCkodGVtcHggJiAweGZmZmYpOworICAgICAgICB0ZW1wd29yZCA9ICh1MTYpKHRlbXB4ICYgMHhmZmZmKTsKICAgICAgICAgc3RhdHVzID0gZnQxMDAwX3dyaXRlX2RwcmFtMTYgKGZ0MTAwMGRldiwgRFdOTERfTUFHMV9IQU5EU0hBS0VfTE9DLCB0ZW1wd29yZCwgMCk7Ci0gICAgICAgIHRlbXB3b3JkID0gKFVTSE9SVCkodGVtcHggPj4gMTYpOworICAgICAgICB0ZW1wd29yZCA9ICh1MTYpKHRlbXB4ID4+IDE2KTsKICAgICAgICAgc3RhdHVzID0gZnQxMDAwX3dyaXRlX2RwcmFtMTYgKGZ0MTAwMGRldiwgRFdOTERfTUFHMV9IQU5EU0hBS0VfTE9DLCB0ZW1wd29yZCwgMSk7CiAgICAgICAgIHN0YXR1cyA9IGZ0MTAwMF93cml0ZV9yZWdpc3RlcihmdDEwMDBkZXYsIEZUMTAwMF9EQl9ETkxEX1RYLCBGVDEwMDBfUkVHX0RPT1JCRUxMKTsKIH0KIAotc3RhdGljIFVTSE9SVCBnZXRfaGFuZHNoYWtlX3VzYihzdHJ1Y3QgZnQxMDAwX2RldmljZSAqZnQxMDAwZGV2LCBVU0hPUlQgZXhwZWN0ZWRfdmFsdWUpCitzdGF0aWMgdTE2IGdldF9oYW5kc2hha2VfdXNiKHN0cnVjdCBmdDEwMDBfZGV2aWNlICpmdDEwMDBkZXYsIHUxNiBleHBlY3RlZF92YWx1ZSkKIHsKLSAgIFVTSE9SVCAgICAgICAgICAgIGhhbmRzaGFrZTsKKyAgIHUxNiAgICAgICAgICAgIGhhbmRzaGFrZTsKICAgIGludCAgICAgICAgICAgICAgIGxvb3BjbnQ7Ci0gICBVU0hPUlQgICAgICAgICAgICB0ZW1wOwotICAgVUxPTkcgICAgICAgICAgICAgc3RhdHVzPTA7CisgICB1MTYgICAgICAgICAgICB0ZW1wOworICAgdTMyICAgICAgICAgICAgIHN0YXR1cz0wOwogCiAJc3RydWN0IGZ0MTAwMF9pbmZvICpwZnQxMDAwaW5mbyA9IG5ldGRldl9wcml2KGZ0MTAwMGRldi0+bmV0KTsKICAgIGxvb3BjbnQgPSAwOwpAQCAtMzAwLDEwICszMDAsMTAgQEAKICAgIHdoaWxlIChsb29wY250IDwgMTAwKQogICAgewogICAgICAgIGlmIChwZnQxMDAwaW5mby0+dXNiYm9vdCA9PSAyKSB7Ci0gICAgICAgICAgIHN0YXR1cyA9IGZ0MTAwMF9yZWFkX2RwcmFtMzIgKGZ0MTAwMGRldiwgMCwgKFBVQ0hBUikmKHBmdDEwMDBpbmZvLT50ZW1wYnVmWzBdKSwgNjQpOworICAgICAgICAgICBzdGF0dXMgPSBmdDEwMDBfcmVhZF9kcHJhbTMyIChmdDEwMDBkZXYsIDAsICh1OCAqKSYocGZ0MTAwMGluZm8tPnRlbXBidWZbMF0pLCA2NCk7CiAgICAgICAgICAgIGZvciAodGVtcD0wOyB0ZW1wPDE2OyB0ZW1wKyspCiAgICAgICAgICAgICAgICBERUJVRygidGVtcGJ1ZiAlZCA9IDB4JXhcbiIsIHRlbXAsIHBmdDEwMDBpbmZvLT50ZW1wYnVmW3RlbXBdKTsKLSAgICAgICAgICAgc3RhdHVzID0gZnQxMDAwX3JlYWRfZHByYW0xNiAoZnQxMDAwZGV2LCBEV05MRF9NQUcxX0hBTkRTSEFLRV9MT0MsIChQVUNIQVIpJmhhbmRzaGFrZSwgMSk7CisgICAgICAgICAgIHN0YXR1cyA9IGZ0MTAwMF9yZWFkX2RwcmFtMTYgKGZ0MTAwMGRldiwgRFdOTERfTUFHMV9IQU5EU0hBS0VfTE9DLCAodTggKikmaGFuZHNoYWtlLCAxKTsKICAgICAgICAgICAgREVCVUcoImhhbmRzaGFrZSBmcm9tIHJlYWRfZHByYW0xNiA9IDB4JXhcbiIsIGhhbmRzaGFrZSk7CiAgICAgICAgICAgIGlmIChwZnQxMDAwaW5mby0+ZHNwYWxpdmUgPT0gcGZ0MTAwMGluZm8tPnRlbXBidWZbNl0pCiAgICAgICAgICAgICAgICBoYW5kc2hha2UgPSAwOwpAQCAtMzEzLDcgKzMxMyw3IEBACiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgIHN0YXR1cyA9IGZ0MTAwMF9yZWFkX2RwcmFtMTYgKGZ0MTAwMGRldiwgRFdOTERfTUFHMV9IQU5EU0hBS0VfTE9DLCAoUFVDSEFSKSZoYW5kc2hha2UsIDEpOworICAgICAgICAgICBzdGF0dXMgPSBmdDEwMDBfcmVhZF9kcHJhbTE2IChmdDEwMDBkZXYsIERXTkxEX01BRzFfSEFORFNIQUtFX0xPQywgKHU4ICopJmhhbmRzaGFrZSwgMSk7CiAgICAgICAgfQogICAgICAgIGxvb3BjbnQrKzsKICAgICAgICBtc2xlZXAoMTApOwpAQCAtMzI3LDcgKzMyNyw3IEBACiAgICByZXR1cm4gSEFORFNIQUtFX1RJTUVPVVRfVkFMVUU7CiB9CiAKLXN0YXRpYyB2b2lkIHB1dF9oYW5kc2hha2VfdXNiKHN0cnVjdCBmdDEwMDBfZGV2aWNlICpmdDEwMDBkZXYsVVNIT1JUIGhhbmRzaGFrZV92YWx1ZSkKK3N0YXRpYyB2b2lkIHB1dF9oYW5kc2hha2VfdXNiKHN0cnVjdCBmdDEwMDBfZGV2aWNlICpmdDEwMDBkZXYsdTE2IGhhbmRzaGFrZV92YWx1ZSkKIHsKICAgIGludCBpOwogCkBAIC0zNDYsNDQgKzM0Niw0NCBAQAogLy8gTm90ZXM6CiAvLwogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXN0YXRpYyBVU0hPUlQgZ2V0X3JlcXVlc3RfdHlwZShzdHJ1Y3QgZnQxMDAwX2RldmljZSAqZnQxMDAwZGV2KQorc3RhdGljIHUxNiBnZXRfcmVxdWVzdF90eXBlKHN0cnVjdCBmdDEwMDBfZGV2aWNlICpmdDEwMDBkZXYpCiB7Ci0gICBVU0hPUlQgICByZXF1ZXN0X3R5cGU7Ci0gICBVTE9ORyAgICBzdGF0dXM7Ci0gICBVU0hPUlQgICB0ZW1wd29yZDsKLSAgIFVMT05HICAgIHRlbXB4OworICAgdTE2ICAgcmVxdWVzdF90eXBlOworICAgdTMyICAgIHN0YXR1czsKKyAgIHUxNiAgIHRlbXB3b3JkOworICAgdTMyICAgIHRlbXB4OwogCXN0cnVjdCBmdDEwMDBfaW5mbyAqcGZ0MTAwMGluZm8gPSBuZXRkZXZfcHJpdihmdDEwMDBkZXYtPm5ldCk7CiAKICAgIGlmICggcGZ0MTAwMGluZm8tPmJvb3Rtb2RlID09IDEpCiAgICB7Ci0gICAgICAgc3RhdHVzID0gZml4X2Z0MTAwMF9yZWFkX2RwcmFtMzIgKGZ0MTAwMGRldiwgRFdOTERfTUFHMV9UWVBFX0xPQywgKFBVQ0hBUikmdGVtcHgpOworICAgICAgIHN0YXR1cyA9IGZpeF9mdDEwMDBfcmVhZF9kcHJhbTMyIChmdDEwMDBkZXYsIERXTkxEX01BRzFfVFlQRV9MT0MsICh1OCAqKSZ0ZW1weCk7CiAgICAgICAgdGVtcHggPSBudG9obCh0ZW1weCk7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgdGVtcHggPSAwOwogCi0gICAgICAgc3RhdHVzID0gZnQxMDAwX3JlYWRfZHByYW0xNiAoZnQxMDAwZGV2LCBEV05MRF9NQUcxX1RZUEVfTE9DLCAoUFVDSEFSKSZ0ZW1wd29yZCwgMSk7CisgICAgICAgc3RhdHVzID0gZnQxMDAwX3JlYWRfZHByYW0xNiAoZnQxMDAwZGV2LCBEV05MRF9NQUcxX1RZUEVfTE9DLCAodTggKikmdGVtcHdvcmQsIDEpOwogICAgICAgIHRlbXB4IHw9ICh0ZW1wd29yZCA8PCAxNik7CiAgICAgICAgdGVtcHggPSBudG9obCh0ZW1weCk7CiAgICB9Ci0gICByZXF1ZXN0X3R5cGUgPSAoVVNIT1JUKXRlbXB4OworICAgcmVxdWVzdF90eXBlID0gKHUxNil0ZW1weDsKIAogICAgLy9ERUJVRygiZ2V0X3JlcXVlc3RfdHlwZTogcmVxdWVzdF90eXBlIGlzICV4XG4iLCByZXF1ZXN0X3R5cGUpOwogICAgcmV0dXJuIHJlcXVlc3RfdHlwZTsKIAogfQogCi1zdGF0aWMgVVNIT1JUIGdldF9yZXF1ZXN0X3R5cGVfdXNiKHN0cnVjdCBmdDEwMDBfZGV2aWNlICpmdDEwMDBkZXYpCitzdGF0aWMgdTE2IGdldF9yZXF1ZXN0X3R5cGVfdXNiKHN0cnVjdCBmdDEwMDBfZGV2aWNlICpmdDEwMDBkZXYpCiB7Ci0gICBVU0hPUlQgICByZXF1ZXN0X3R5cGU7Ci0gICBVTE9ORyAgICBzdGF0dXM7Ci0gICBVU0hPUlQgICB0ZW1wd29yZDsKLSAgIFVMT05HICAgIHRlbXB4OworICAgdTE2ICAgcmVxdWVzdF90eXBlOworICAgdTMyICAgIHN0YXR1czsKKyAgIHUxNiAgIHRlbXB3b3JkOworICAgdTMyICAgIHRlbXB4OwogCXN0cnVjdCBmdDEwMDBfaW5mbyAqcGZ0MTAwMGluZm8gPSBuZXRkZXZfcHJpdihmdDEwMDBkZXYtPm5ldCk7CiAgICBpZiAoIHBmdDEwMDBpbmZvLT5ib290bW9kZSA9PSAxKQogICAgewotICAgICAgIHN0YXR1cyA9IGZpeF9mdDEwMDBfcmVhZF9kcHJhbTMyIChmdDEwMDBkZXYsIERXTkxEX01BRzFfVFlQRV9MT0MsIChQVUNIQVIpJnRlbXB4KTsKKyAgICAgICBzdGF0dXMgPSBmaXhfZnQxMDAwX3JlYWRfZHByYW0zMiAoZnQxMDAwZGV2LCBEV05MRF9NQUcxX1RZUEVfTE9DLCAodTggKikmdGVtcHgpOwogICAgICAgIHRlbXB4ID0gbnRvaGwodGVtcHgpOwogICAgfQogICAgZWxzZQpAQCAtMzk0LDEyICszOTQsMTIgQEAKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgdGVtcHggPSAwOwotICAgICAgICAgIHN0YXR1cyA9IGZ0MTAwMF9yZWFkX2RwcmFtMTYgKGZ0MTAwMGRldiwgRFdOTERfTUFHMV9UWVBFX0xPQywgKFBVQ0hBUikmdGVtcHdvcmQsIDEpOworICAgICAgICAgIHN0YXR1cyA9IGZ0MTAwMF9yZWFkX2RwcmFtMTYgKGZ0MTAwMGRldiwgRFdOTERfTUFHMV9UWVBFX0xPQywgKHU4ICopJnRlbXB3b3JkLCAxKTsKICAgICAgICB9CiAgICAgICAgdGVtcHggfD0gKHRlbXB3b3JkIDw8IDE2KTsKICAgICAgICB0ZW1weCA9IG50b2hsKHRlbXB4KTsKICAgIH0KLSAgIHJlcXVlc3RfdHlwZSA9IChVU0hPUlQpdGVtcHg7CisgICByZXF1ZXN0X3R5cGUgPSAodTE2KXRlbXB4OwogCiAgICAvL0RFQlVHKCJnZXRfcmVxdWVzdF90eXBlOiByZXF1ZXN0X3R5cGUgaXMgJXhcbiIsIHJlcXVlc3RfdHlwZSk7CiAgICByZXR1cm4gcmVxdWVzdF90eXBlOwpAQCAtNDIwLDIyICs0MjAsMjIgQEAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBzdGF0aWMgbG9uZyBnZXRfcmVxdWVzdF92YWx1ZShzdHJ1Y3QgZnQxMDAwX2RldmljZSAqZnQxMDAwZGV2KQogewotICAgVUxPTkcgICAgIHZhbHVlOwotICAgVVNIT1JUICAgdGVtcHdvcmQ7Ci0gICBVTE9ORyAgICBzdGF0dXM7CisgICB1MzIgICAgIHZhbHVlOworICAgdTE2ICAgdGVtcHdvcmQ7CisgICB1MzIgICAgc3RhdHVzOwogCXN0cnVjdCBmdDEwMDBfaW5mbyAqcGZ0MTAwMGluZm8gPSBuZXRkZXZfcHJpdihmdDEwMDBkZXYtPm5ldCk7CiAKIAogICAgICAgIGlmICggcGZ0MTAwMGluZm8tPmJvb3Rtb2RlID09IDEpCiAgICAgICAgewotCSAgIHN0YXR1cyA9IGZpeF9mdDEwMDBfcmVhZF9kcHJhbTMyKGZ0MTAwMGRldiwgRFdOTERfTUFHMV9TSVpFX0xPQywgKFBVQ0hBUikmdmFsdWUpOworCSAgIHN0YXR1cyA9IGZpeF9mdDEwMDBfcmVhZF9kcHJhbTMyKGZ0MTAwMGRldiwgRFdOTERfTUFHMV9TSVpFX0xPQywgKHU4ICopJnZhbHVlKTsKIAkgICB2YWx1ZSA9IG50b2hsKHZhbHVlKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKLQkgICBzdGF0dXMgPSBmdDEwMDBfcmVhZF9kcHJhbTE2KGZ0MTAwMGRldiwgRFdOTERfTUFHMV9TSVpFX0xPQywgKFBVQ0hBUikmdGVtcHdvcmQsIDApOworCSAgIHN0YXR1cyA9IGZ0MTAwMF9yZWFkX2RwcmFtMTYoZnQxMDAwZGV2LCBEV05MRF9NQUcxX1NJWkVfTE9DLCAodTggKikmdGVtcHdvcmQsIDApOwogCSAgIHZhbHVlID0gdGVtcHdvcmQ7Ci0gICAgICAgICAgIHN0YXR1cyA9IGZ0MTAwMF9yZWFkX2RwcmFtMTYoZnQxMDAwZGV2LCBEV05MRF9NQUcxX1NJWkVfTE9DLCAoUFVDSEFSKSZ0ZW1wd29yZCwgMSk7CisgICAgICAgICAgIHN0YXR1cyA9IGZ0MTAwMF9yZWFkX2RwcmFtMTYoZnQxMDAwZGV2LCBEV05MRF9NQUcxX1NJWkVfTE9DLCAodTggKikmdGVtcHdvcmQsIDEpOwogCSAgIHZhbHVlIHw9ICh0ZW1wd29yZCA8PCAxNik7CiAJICAgdmFsdWUgPSBudG9obCh2YWx1ZSk7CiAgICAgICAgfQpAQCAtNDQ5LDkgKzQ0OSw5IEBACiAjaWYgMAogc3RhdGljIGxvbmcgZ2V0X3JlcXVlc3RfdmFsdWVfdXNiKHN0cnVjdCBmdDEwMDBfZGV2aWNlICpmdDEwMDBkZXYpCiB7Ci0gICBVTE9ORyAgICAgdmFsdWU7Ci0gICBVU0hPUlQgICB0ZW1wd29yZDsKLSAgIFVMT05HICAgIHN0YXR1czsKKyAgIHUzMiAgICAgdmFsdWU7CisgICB1MTYgICB0ZW1wd29yZDsKKyAgIHUzMiAgICBzdGF0dXM7CiAgICBzdHJ1Y3QgZnQxMDAwX2luZm8gKiBwZnQxMDAwaW5mbyA9IG5ldGRldl9wcml2KGZ0MTAwMGRldi0+bmV0KTsKIAogICAgICAgIGlmIChwZnQxMDAwaW5mby0+dXNiYm9vdCA9PSAyKSB7CkBAIC00NjAsNyArNDYwLDcgQEAKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgdmFsdWUgPSAwOwotICAgICAgICAgIHN0YXR1cyA9IGZ0MTAwMF9yZWFkX2RwcmFtMTYoZnQxMDAwZGV2LCBEV05MRF9NQUcxX1NJWkVfTE9DLCAoUFVDSEFSKSZ0ZW1wd29yZCwgMSk7CisgICAgICAgICAgc3RhdHVzID0gZnQxMDAwX3JlYWRfZHByYW0xNihmdDEwMDBkZXYsIERXTkxEX01BRzFfU0laRV9MT0MsICh1OCAqKSZ0ZW1wd29yZCwgMSk7CiAgICAgICAgfQogCiAgICAgICAgdmFsdWUgfD0gKHRlbXB3b3JkIDw8IDE2KTsKQEAgLTQ5MCwxMSArNDkwLDExIEBACiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogc3RhdGljIHZvaWQgcHV0X3JlcXVlc3RfdmFsdWUoc3RydWN0IGZ0MTAwMF9kZXZpY2UgKmZ0MTAwMGRldiwgbG9uZyBsdmFsdWUpCiB7Ci0gICBVTE9ORyAgICB0ZW1weDsKLSAgIFVMT05HICAgIHN0YXR1czsKKyAgIHUzMiAgICB0ZW1weDsKKyAgIHUzMiAgICBzdGF0dXM7CiAKICAgICAgICB0ZW1weCA9IG50b2hsKGx2YWx1ZSk7Ci0gICAgICAgc3RhdHVzID0gZml4X2Z0MTAwMF93cml0ZV9kcHJhbTMyKGZ0MTAwMGRldiwgRFdOTERfTUFHMV9TSVpFX0xPQywgKFBVQ0hBUikmdGVtcHgpOworICAgICAgIHN0YXR1cyA9IGZpeF9mdDEwMDBfd3JpdGVfZHByYW0zMihmdDEwMDBkZXYsIERXTkxEX01BRzFfU0laRV9MT0MsICh1OCAqKSZ0ZW1weCk7CiAKIAogCkBAIC01MTYsMTAgKzUxNiwxMCBAQAogLy8gTm90ZXM6CiAvLwogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXN0YXRpYyBVU0hPUlQgaGRyX2NoZWNrc3VtKHN0cnVjdCBwc2V1ZG9faGRyICpwSGRyKQorc3RhdGljIHUxNiBoZHJfY2hlY2tzdW0oc3RydWN0IHBzZXVkb19oZHIgKnBIZHIpCiB7Ci0gICBVU0hPUlQgICAqdXNQdHIgPSAoVVNIT1JUICopcEhkcjsKLSAgIFVTSE9SVCAgIGNoa3N1bTsKKyAgIHUxNiAgICp1c1B0ciA9ICh1MTYgKilwSGRyOworICAgdTE2ICAgY2hrc3VtOwogCiAKICAgY2hrc3VtID0gKCgoKCgodXNQdHJbMF0gXiB1c1B0clsxXSkgXiB1c1B0clsyXSkgXiB1c1B0clszXSkgXgpAQCAtNTMzLDggKzUzMyw4IEBACiAvLyBGdW5jdGlvbjogICAgd3JpdGVfYmxrCiAvLwogLy8gUGFyYW1ldGVyczogIHN0cnVjdCBmdDEwMDBfZGV2aWNlICAtIGRldmljZSBzdHJ1Y3R1cmUKLS8vICAgICAgICAgICAgICBVU0hPUlQgKipwVXNGaWxlIC0gRFNQIGltYWdlIGZpbGUgcG9pbnRlciBpbiBVU0hPUlQKLS8vICAgICAgICAgICAgICBVQ0hBUiAgKipwVWNGaWxlIC0gRFNQIGltYWdlIGZpbGUgcG9pbnRlciBpbiBVQ0hBUgorLy8gICAgICAgICAgICAgIHUxNiAqKnBVc0ZpbGUgLSBEU1AgaW1hZ2UgZmlsZSBwb2ludGVyIGluIHUxNgorLy8gICAgICAgICAgICAgIHU4ICAqKnBVY0ZpbGUgLSBEU1AgaW1hZ2UgZmlsZSBwb2ludGVyIGluIHU4CiAvLyAgICAgICAgICAgICAgbG9uZyAgIHdvcmRfbGVuZ3RoIC0gbGVuZ2h0IG9mIHRoZSBidWZmZXIgdG8gYmUgd3JpdHRlbgogLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIERQUkFNCiAvLwpAQCAtNTQ2LDIwICs1NDYsMjAgQEAKIC8vIE5vdGVzOgogLy8KIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1zdGF0aWMgVUxPTkcgd3JpdGVfYmxrIChzdHJ1Y3QgZnQxMDAwX2RldmljZSAqZnQxMDAwZGV2LCBVU0hPUlQgKipwVXNGaWxlLCBVQ0hBUiAqKnBVY0ZpbGUsIGxvbmcgd29yZF9sZW5ndGgpCitzdGF0aWMgdTMyIHdyaXRlX2JsayAoc3RydWN0IGZ0MTAwMF9kZXZpY2UgKmZ0MTAwMGRldiwgdTE2ICoqcFVzRmlsZSwgdTggKipwVWNGaWxlLCBsb25nIHdvcmRfbGVuZ3RoKQogewotICAgVUxPTkcgU3RhdHVzID0gU1RBVFVTX1NVQ0NFU1M7Ci0gICBVU0hPUlQgZHByYW07CisgICB1MzIgU3RhdHVzID0gU1RBVFVTX1NVQ0NFU1M7CisgICB1MTYgZHByYW07CiAgICBsb25nIHRlbXBfd29yZF9sZW5ndGg7CiAgICBpbnQgbG9vcGNudCwgaSwgajsKLSAgIFVTSE9SVCAqcFRlbXBGaWxlOwotICAgVVNIT1JUIHRlbXB3b3JkOwotICAgVVNIT1JUIHRlbXBidWZmZXJbNjRdOwotICAgVVNIT1JUIHJlc3VsdGJ1ZmZlcls2NF07CisgICB1MTYgKnBUZW1wRmlsZTsKKyAgIHUxNiB0ZW1wd29yZDsKKyAgIHUxNiB0ZW1wYnVmZmVyWzY0XTsKKyAgIHUxNiByZXN1bHRidWZmZXJbNjRdOwogCXN0cnVjdCBmdDEwMDBfaW5mbyAqcGZ0MTAwMGluZm8gPSBuZXRkZXZfcHJpdihmdDEwMDBkZXYtPm5ldCk7CiAKICAgIC8vREVCVUcoIkZUMTAwMDpkb3dubG9hZDpzdGFydCB3b3JkX2xlbmd0aCA9ICVkXG4iLChpbnQpd29yZF9sZW5ndGgpOwotICAgZHByYW0gPSAoVVNIT1JUKURXTkxEX01BRzFfUFNfSERSX0xPQzsKKyAgIGRwcmFtID0gKHUxNilEV05MRF9NQUcxX1BTX0hEUl9MT0M7CiAgICB0ZW1wd29yZCA9ICooKnBVc0ZpbGUpOwogICAgKCpwVXNGaWxlKSsrOwogICAgU3RhdHVzID0gZnQxMDAwX3dyaXRlX2RwcmFtMTYoZnQxMDAwZGV2LCBkcHJhbSwgdGVtcHdvcmQsIDApOwpAQCAtNTY5LDcgKzU2OSw3IEBACiAKICAgICpwVWNGaWxlID0gKnBVY0ZpbGUgKyA0OwogICAgd29yZF9sZW5ndGgtLTsKLSAgIHRlbXB3b3JkID0gKFVTSE9SVCl3b3JkX2xlbmd0aDsKKyAgIHRlbXB3b3JkID0gKHUxNil3b3JkX2xlbmd0aDsKICAgIHdvcmRfbGVuZ3RoID0gKHdvcmRfbGVuZ3RoIC8gMTYpICsgMTsKICAgIHBUZW1wRmlsZSA9ICpwVXNGaWxlOwogICAgdGVtcF93b3JkX2xlbmd0aCA9IHdvcmRfbGVuZ3RoOwpAQCAtNjAyLDI0ICs2MDIsMjQgQEAKIAkgICAgICBpZiAocGZ0MTAwMGluZm8tPmJvb3Rtb2RlID09IDApCiAJICAgICAgewogCQkgaWYgKGRwcmFtID49IDB4M0Y0KQotICAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gZnQxMDAwX3dyaXRlX2RwcmFtMzIgKGZ0MTAwMGRldiwgZHByYW0sIChQVUNIQVIpJnRlbXBidWZmZXJbMF0sIDgpOworICAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gZnQxMDAwX3dyaXRlX2RwcmFtMzIgKGZ0MTAwMGRldiwgZHByYW0sICh1OCAqKSZ0ZW1wYnVmZmVyWzBdLCA4KTsKIAkgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IGZ0MTAwMF93cml0ZV9kcHJhbTMyIChmdDEwMDBkZXYsIGRwcmFtLCAoUFVDSEFSKSZ0ZW1wYnVmZmVyWzBdLCA2NCk7CisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IGZ0MTAwMF93cml0ZV9kcHJhbTMyIChmdDEwMDBkZXYsIGRwcmFtLCAodTggKikmdGVtcGJ1ZmZlclswXSwgNjQpOwogCSAgICAgIH0KIAkgICAgICBlbHNlCiAJICAgICAgewogICAgICAgICAgICAgICAgICBmb3IgKGo9MDsgajwxMDsgaisrKQogICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgU3RhdHVzID0gZnQxMDAwX3dyaXRlX2RwcmFtMzIgKGZ0MTAwMGRldiwgZHByYW0sIChQVUNIQVIpJnRlbXBidWZmZXJbMF0sIDY0KTsKKyAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSBmdDEwMDBfd3JpdGVfZHByYW0zMiAoZnQxMDAwZGV2LCBkcHJhbSwgKHU4ICopJnRlbXBidWZmZXJbMF0sIDY0KTsKIAkJICAgaWYgKFN0YXR1cyA9PSBTVEFUVVNfU1VDQ0VTUykKIAkJICAgewogCQkgICAgICAgLy8gV29yayBhcm91bmQgZm9yIEFTSUMgYml0IHN0dWZmaW5nIHByb2JsZW0uCiAJCSAgICAgICBpZiAoICh0ZW1wYnVmZmVyWzMxXSAmIDB4ZmUwMCkgPT0gMHhmZTAwKQogCQkgICAgICAgewotICAgICAgCQkgICAgICAgICAgIFN0YXR1cyA9IGZ0MTAwMF93cml0ZV9kcHJhbTMyKGZ0MTAwMGRldiwgZHByYW0rMTIsIChQVUNIQVIpJnRlbXBidWZmZXJbMjRdLCA2NCk7CisgICAgICAJCSAgICAgICAgICAgU3RhdHVzID0gZnQxMDAwX3dyaXRlX2RwcmFtMzIoZnQxMDAwZGV2LCBkcHJhbSsxMiwgKHU4ICopJnRlbXBidWZmZXJbMjRdLCA2NCk7CiAJCSAgICAgICB9CiAgICAgCQkgICAgICAgLy8gTGV0J3MgY2hlY2sgdGhlIGRhdGEgd3JpdHRlbgotCSAgICAJICAgICAgIFN0YXR1cyA9IGZ0MTAwMF9yZWFkX2RwcmFtMzIgKGZ0MTAwMGRldiwgZHByYW0sIChQVUNIQVIpJnJlc3VsdGJ1ZmZlclswXSwgNjQpOworCSAgICAJICAgICAgIFN0YXR1cyA9IGZ0MTAwMF9yZWFkX2RwcmFtMzIgKGZ0MTAwMGRldiwgZHByYW0sICh1OCAqKSZyZXN1bHRidWZmZXJbMF0sIDY0KTsKIAkJICAgICAgIGlmICggKHRlbXBidWZmZXJbMzFdICYgMHhmZTAwKSA9PSAweGZlMDApCiAJCSAgICAgICB7CiAJCSAgICAgICAgICAgZm9yIChpPTA7IGk8Mjg7IGkrKykKQEAgLTYzMyw3ICs2MzMsNyBAQAogCQkJCSAgIGJyZWFrOwogCQkJCX0KIAkJCSAgIH0KLSAgIAkJCSAgIFN0YXR1cyA9IGZ0MTAwMF9yZWFkX2RwcmFtMzIgKGZ0MTAwMGRldiwgZHByYW0rMTIsIChQVUNIQVIpJnJlc3VsdGJ1ZmZlclswXSwgNjQpOworICAgCQkJICAgU3RhdHVzID0gZnQxMDAwX3JlYWRfZHByYW0zMiAoZnQxMDAwZGV2LCBkcHJhbSsxMiwgKHU4ICopJnJlc3VsdGJ1ZmZlclswXSwgNjQpOwogCQkgICAgICAgICAgIGZvciAoaT0wOyBpPDE2OyBpKyspCiAJCSAgICAgICAgICAgewogICAgIAkJCSAgICAgICBpZiAocmVzdWx0YnVmZmVyW2ldICE9IHRlbXBidWZmZXJbaSsyNF0pCkBAIC02ODksOCArNjg5LDggQEAKIC8vIEZ1bmN0aW9uOiAgICB3cml0ZV9ibGtfZmlmbwogLy8KIC8vIFBhcmFtZXRlcnM6ICBzdHJ1Y3QgZnQxMDAwX2RldmljZSAgLSBkZXZpY2Ugc3RydWN0dXJlCi0vLyAgICAgICAgICAgICAgVVNIT1JUICoqcFVzRmlsZSAtIERTUCBpbWFnZSBmaWxlIHBvaW50ZXIgaW4gVVNIT1JUCi0vLyAgICAgICAgICAgICAgVUNIQVIgICoqcFVjRmlsZSAtIERTUCBpbWFnZSBmaWxlIHBvaW50ZXIgaW4gVUNIQVIKKy8vICAgICAgICAgICAgICB1MTYgKipwVXNGaWxlIC0gRFNQIGltYWdlIGZpbGUgcG9pbnRlciBpbiB1MTYKKy8vICAgICAgICAgICAgICB1OCAgKipwVWNGaWxlIC0gRFNQIGltYWdlIGZpbGUgcG9pbnRlciBpbiB1OAogLy8gICAgICAgICAgICAgIGxvbmcgICB3b3JkX2xlbmd0aCAtIGxlbmdodCBvZiB0aGUgYnVmZmVyIHRvIGJlIHdyaXR0ZW4KIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBEUFJBTQogLy8KQEAgLTcwMiw5ICs3MDIsOSBAQAogLy8gTm90ZXM6CiAvLwogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXN0YXRpYyBVTE9ORyB3cml0ZV9ibGtfZmlmbyAoc3RydWN0IGZ0MTAwMF9kZXZpY2UgKmZ0MTAwMGRldiwgVVNIT1JUICoqcFVzRmlsZSwgVUNIQVIgKipwVWNGaWxlLCBsb25nIHdvcmRfbGVuZ3RoKQorc3RhdGljIHUzMiB3cml0ZV9ibGtfZmlmbyAoc3RydWN0IGZ0MTAwMF9kZXZpY2UgKmZ0MTAwMGRldiwgdTE2ICoqcFVzRmlsZSwgdTggKipwVWNGaWxlLCBsb25nIHdvcmRfbGVuZ3RoKQogewotICAgVUxPTkcgU3RhdHVzID0gU1RBVFVTX1NVQ0NFU1M7CisgICB1MzIgU3RhdHVzID0gU1RBVFVTX1NVQ0NFU1M7CiAgICBpbnQgYnl0ZV9sZW5ndGg7CiAgICBsb25nIGFsaWduY250OwogCkBAIC03NzAsMzYgKzc3MCwzNiBAQAogLy8gIFJldHVybnM6ICAgIHN0YXR1cyAgICAgICAgICAgICAgICAgIC0gcmV0dXJuIGNvZGUKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLXUxNiBzY3JhbV9kbmxkcihzdHJ1Y3QgZnQxMDAwX2RldmljZSAqZnQxMDAwZGV2LCB2b2lkICpwRmlsZVN0YXJ0LCBVTE9ORyAgRmlsZUxlbmd0aCkKK3UxNiBzY3JhbV9kbmxkcihzdHJ1Y3QgZnQxMDAwX2RldmljZSAqZnQxMDAwZGV2LCB2b2lkICpwRmlsZVN0YXJ0LCB1MzIgIEZpbGVMZW5ndGgpCiB7Ci0gICB1MTYgICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSBTVEFUVVNfU1VDQ0VTUzsKLSAgIFVJTlQgICAgICAgICAgICAgICAgICAgIHVpU3RhdGU7Ci0gICBVU0hPUlQgICAgICAgICAgICAgICAgICBoYW5kc2hha2U7Ci0Jc3RydWN0IHBzZXVkb19oZHIgKnBIZHI7Ci0gICBVU0hPUlQgICAgICAgICAgICAgICAgICB1c0hkckxlbmd0aDsKKyAgIHUxNiAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IFNUQVRVU19TVUNDRVNTOworICAgdTMyICAgICAgICAgICAgICAgICAgICBzdGF0ZTsKKyAgIHUxNiAgICAgICAgICAgICAgICAgIGhhbmRzaGFrZTsKKwlzdHJ1Y3QgcHNldWRvX2hkciAqcHNldWRvX2hlYWRlcjsKKyAgIHUxNiAgICAgICAgICAgICAgICAgIHBzZXVkb19oZWFkZXJfbGVuOwogICAgbG9uZyAgICAgICAgICAgICAgICAgICAgd29yZF9sZW5ndGg7Ci0gICBVU0hPUlQgICAgICAgICAgICAgICAgICByZXF1ZXN0OwotICAgVVNIT1JUICAgICAgICAgICAgICAgICAgdGVtcDsKLSAgIFVTSE9SVCAgICAgICAgICAgICAgICAgIHRlbXB3b3JkOworICAgdTE2ICAgICAgICAgICAgICAgICAgcmVxdWVzdDsKKyAgIHUxNiAgICAgICAgICAgICAgICAgIHRlbXA7CisgICB1MTYgICAgICAgICAgICAgICAgICB0ZW1wd29yZDsKIAotCXN0cnVjdCBkc3BfZmlsZV9oZHIgKnBGaWxlSGRyNTsKLQlzdHJ1Y3QgZHNwX2ltYWdlX2luZm8gKnBEc3BJbWFnZUluZm9WNiA9IE5VTEw7CisJc3RydWN0IGRzcF9maWxlX2hkciAqZmlsZV9oZHI7CisJc3RydWN0IGRzcF9pbWFnZV9pbmZvICpkc3BfaW1nX2luZm8gPSBOVUxMOwogICAgbG9uZyAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkX3ZlcnNpb247Ci0gICBCT09MRUFOICAgICAgICAgICAgICAgICBiR29vZFZlcnNpb247Ci0Jc3RydWN0IGRydl9tc2cgKnBNYWlsQm94RGF0YTsKLSAgIFVTSE9SVCAgICAgICAgICAgICAgICAgICpwVXNEYXRhID0gTlVMTDsKLSAgIFVTSE9SVCAgICAgICAgICAgICAgICAgICpwVXNGaWxlID0gTlVMTDsKLSAgIFVDSEFSICAgICAgICAgICAgICAgICAgICpwVWNGaWxlID0gTlVMTDsKLSAgIFVDSEFSICAgICAgICAgICAgICAgICAgICpwQm9vdEVuZCA9IE5VTEwsICpwQ29kZUVuZD0gTlVMTDsKLSAgIGludCAgICAgICAgICAgICAgICAgICAgIGltYWdlTjsKKyAgIGJvb2wgICAgICAgICAgICAgICAgIGNvcnJlY3RfdmVyc2lvbjsKKwlzdHJ1Y3QgZHJ2X21zZyAqbWFpbGJveF9kYXRhOworICAgdTE2ICAgICAgICAgICAgICAgICAgKmRhdGEgPSBOVUxMOworICAgdTE2ICAgICAgICAgICAgICAgICAgKnNfZmlsZSA9IE5VTEw7CisgICB1OCAgICAgICAgICAgICAgICAgICAqY19maWxlID0gTlVMTDsKKyAgIHU4ICAgICAgICAgICAgICAgICAgICpib290X2VuZCA9IE5VTEwsICpjb2RlX2VuZD0gTlVMTDsKKyAgIGludCAgICAgICAgICAgICAgICAgICAgIGltYWdlOwogICAgbG9uZyAgICAgICAgICAgICAgICAgICAgbG9hZGVyX2NvZGVfYWRkcmVzcywgbG9hZGVyX2NvZGVfc2l6ZSA9IDA7CiAgICBsb25nICAgICAgICAgICAgICAgICAgICBydW5fYWRkcmVzcyA9IDAsIHJ1bl9zaXplID0gMDsKIAotICAgVUxPTkcgICAgICAgICAgICAgICAgICAgdGVtcGxvbmc7Ci0gICBVTE9ORyAgICAgICAgICAgICAgICAgICBpbWFnZV9jaGtzdW0gPSAwOworICAgdTMyICAgICAgICAgICAgICAgICAgIHRlbXBsb25nOworICAgdTMyICAgICAgICAgICAgICAgICAgIGltYWdlX2Noa3N1bSA9IDA7CiAKLSAgIFVTSE9SVCAgICAgICAgICAgICAgICAgIGRwcmFtID0gMDsKLSAgIFBVQ0hBUiAgICAgICAgICAgICAgICAgIHBidWZmZXI7CisgICB1MTYgICAgICAgICAgICAgICAgICBkcHJhbSA9IDA7CisgICB1OCAqcGJ1ZmZlcjsKIAlzdHJ1Y3QgcHJvdl9yZWNvcmQgKnBwcm92X3JlY29yZDsKIAlzdHJ1Y3QgZnQxMDAwX2luZm8gKnBmdDEwMDBpbmZvID0gbmV0ZGV2X3ByaXYoZnQxMDAwZGV2LT5uZXQpOwogCkBAIC04MTQsMjQgKzgxNCwyNCBAQAogICAgLy8gR2V0IHZlcnNpb24gaWQgb2YgZmlsZSwgYXQgZmlyc3QgNCBieXRlcyBvZiBmaWxlLCBmb3IgbmV3ZXIgZmlsZXMuCiAgICAvLwogCi0gICB1aVN0YXRlID0gU1RBVEVfU1RBUlRfRFdOTEQ7CisgICBzdGF0ZSA9IFNUQVRFX1NUQVJUX0RXTkxEOwogCi0gICBwRmlsZUhkcjUgPSAoc3RydWN0IGRzcF9maWxlX2hkciAqKXBGaWxlU3RhcnQ7CisgICBmaWxlX2hkciA9IChzdHJ1Y3QgZHNwX2ZpbGVfaGRyICopcEZpbGVTdGFydDsKIAogICAgZnQxMDAwX3dyaXRlX3JlZ2lzdGVyIChmdDEwMDBkZXYsIDB4ODAwLCBGVDEwMDBfUkVHX01BR19XQVRFUk1BUkspOwogCi0gICAgICBwVXNGaWxlID0gKFVTSE9SVCAqKShwRmlsZVN0YXJ0ICsgcEZpbGVIZHI1LT5sb2FkZXJfb2Zmc2V0KTsKLSAgICAgIHBVY0ZpbGUgPSAoVUNIQVIgKikocEZpbGVTdGFydCArIHBGaWxlSGRyNS0+bG9hZGVyX29mZnNldCk7CisgICAgICBzX2ZpbGUgPSAodTE2ICopKHBGaWxlU3RhcnQgKyBmaWxlX2hkci0+bG9hZGVyX29mZnNldCk7CisgICAgICBjX2ZpbGUgPSAodTggKikocEZpbGVTdGFydCArIGZpbGVfaGRyLT5sb2FkZXJfb2Zmc2V0KTsKIAotICAgICAgcEJvb3RFbmQgPSAoVUNIQVIgKikocEZpbGVTdGFydCArIHBGaWxlSGRyNS0+bG9hZGVyX2NvZGVfZW5kKTsKKyAgICAgIGJvb3RfZW5kID0gKHU4ICopKHBGaWxlU3RhcnQgKyBmaWxlX2hkci0+bG9hZGVyX2NvZGVfZW5kKTsKIAotICAgICAgbG9hZGVyX2NvZGVfYWRkcmVzcyA9IHBGaWxlSGRyNS0+bG9hZGVyX2NvZGVfYWRkcmVzczsKLSAgICAgIGxvYWRlcl9jb2RlX3NpemUgPSBwRmlsZUhkcjUtPmxvYWRlcl9jb2RlX3NpemU7Ci0gICAgICBiR29vZFZlcnNpb24gPSBGQUxTRTsKKyAgICAgIGxvYWRlcl9jb2RlX2FkZHJlc3MgPSBmaWxlX2hkci0+bG9hZGVyX2NvZGVfYWRkcmVzczsKKyAgICAgIGxvYWRlcl9jb2RlX3NpemUgPSBmaWxlX2hkci0+bG9hZGVyX2NvZGVfc2l6ZTsKKyAgICAgIGNvcnJlY3RfdmVyc2lvbiA9IEZBTFNFOwogCi0gICB3aGlsZSAoKFN0YXR1cyA9PSBTVEFUVVNfU1VDQ0VTUykgJiYgKHVpU3RhdGUgIT0gU1RBVEVfRE9ORV9GSUxFKSkKKyAgIHdoaWxlICgoc3RhdHVzID09IFNUQVRVU19TVUNDRVNTKSAmJiAoc3RhdGUgIT0gU1RBVEVfRE9ORV9GSUxFKSkKICAgIHsKLSAgICAgIHN3aXRjaCAodWlTdGF0ZSkKKyAgICAgIHN3aXRjaCAoc3RhdGUpCiAgICAgICB7CiAgICAgICBjYXNlICBTVEFURV9TVEFSVF9EV05MRDoKICAgICAgICAgIERFQlVHKCJGVDEwMDA6U1RBVEVfU1RBUlRfRFdOTERcbiIpOwpAQCAtODQ4LDEwICs4NDgsMTAgQEAKICAgICAgICAgIGVsc2UKICAgICAgICAgIHsKICAgICAgICAgICAgIERFQlVHKCJGVDEwMDA6ZG93bmxvYWQ6RG93bmxvYWQgZXJyb3I6IEhhbmRzaGFrZSBmYWlsZWRcbiIpOwotICAgICAgICAgICAgU3RhdHVzID0gU1RBVFVTX0ZBSUxVUkU7CisgICAgICAgICAgICBzdGF0dXMgPSBTVEFUVVNfRkFJTFVSRTsKICAgICAgICAgIH0KIAotICAgICAgICAgdWlTdGF0ZSA9IFNUQVRFX0JPT1RfRFdOTEQ7CisgICAgICAgICBzdGF0ZSA9IFNUQVRFX0JPT1RfRFdOTEQ7CiAKICAgICAgICAgIGJyZWFrOwogCkBAIC04NzgsMTEgKzg3OCwxMSBAQAogICAgICAgICAgICAgY2FzZSAgUkVRVUVTVF9ET05FX0JMOgogICAgICAgICAgICAgICAgREVCVUcoIkZUMTAwMDpSRVFVRVNUX0RPTkVfQkxcbiIpOwogICAgICAgICAgICAgICAgLyogUmVwb3NpdGlvbiBwdHJzIHRvIGJlZ2lubmluZyBvZiBjb2RlIHNlY3Rpb24gKi8KLSAgICAgICAgICAgICAgIHBVc0ZpbGUgPSAoVVNIT1JUICopKHBCb290RW5kKTsKLSAgICAgICAgICAgICAgIHBVY0ZpbGUgPSAoVUNIQVIgKikocEJvb3RFbmQpOwotICAgICAgICAgICAgICAgLy9ERUJVRygiRlQxMDAwOmRvd25sb2FkOnBVc0ZpbGUgPSAweCU4eFxuIiwgKGludClwVXNGaWxlKTsKLSAgICAgICAgICAgICAgIC8vREVCVUcoIkZUMTAwMDpkb3dubG9hZDpwVWNGaWxlID0gMHglOHhcbiIsIChpbnQpcFVjRmlsZSk7Ci0gICAgICAgICAgICAgICB1aVN0YXRlID0gU1RBVEVfQ09ERV9EV05MRDsKKyAgICAgICAgICAgICAgIHNfZmlsZSA9ICh1MTYgKikoYm9vdF9lbmQpOworICAgICAgICAgICAgICAgY19maWxlID0gKHU4ICopKGJvb3RfZW5kKTsKKyAgICAgICAgICAgICAgIC8vREVCVUcoIkZUMTAwMDpkb3dubG9hZDpzX2ZpbGUgPSAweCU4eFxuIiwgKGludClzX2ZpbGUpOworICAgICAgICAgICAgICAgLy9ERUJVRygiRlQxMDAwOmRvd25sb2FkOmNfZmlsZSA9IDB4JTh4XG4iLCAoaW50KWNfZmlsZSk7CisgICAgICAgICAgICAgICBzdGF0ZSA9IFNUQVRFX0NPREVfRFdOTEQ7CiAgICAgICAgICAgICAgICBwZnQxMDAwaW5mby0+ZmNvZGVsZHIgPSAxOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlICBSRVFVRVNUX0NPREVfU0VHTUVOVDoKQEAgLTg5MywzMyArODkzLDMzIEBACiAgICAgICAgICAgICAgICBpZiAod29yZF9sZW5ndGggPiBNQVhfTEVOR1RIKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgREVCVUcoIkZUMTAwMDpkb3dubG9hZDpEb3dubG9hZCBlcnJvcjogTWF4IGxlbmd0aCBleGNlZWRlZFxuIik7Ci0gICAgICAgICAgICAgICAgICBTdGF0dXMgPSBTVEFUVVNfRkFJTFVSRTsKKyAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IFNUQVRVU19GQUlMVVJFOwogICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICBpZiAoICh3b3JkX2xlbmd0aCoyICsgcFVjRmlsZSkgPiBwQm9vdEVuZCkKKyAgICAgICAgICAgICAgIGlmICggKHdvcmRfbGVuZ3RoKjIgKyBjX2ZpbGUpID4gYm9vdF9lbmQpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICAgICogRXJyb3IsIGJleW9uZCBib290IGNvZGUgcmFuZ2UuCiAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgIERFQlVHKCJGVDEwMDA6ZG93bmxvYWQ6RG93bmxvYWQgZXJyb3I6IFJlcXVlc3RlZCBsZW49JWQgZXhjZWVkcyBCT09UIGNvZGUgYm91bmRyeS5cbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KXdvcmRfbGVuZ3RoKTsKLSAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IFNUQVRVU19GQUlMVVJFOworICAgICAgICAgICAgICAgICAgc3RhdHVzID0gU1RBVFVTX0ZBSUxVUkU7CiAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgKiBQb3NpdGlvbiBBU0lDIERQUkFNIGF1dG8taW5jcmVtZW50IHBvaW50ZXIuCiAgICAgICAgICAgICAgICAgKi8KLQkJCQkgICAgZHByYW0gPSAoVVNIT1JUKURXTkxEX01BRzFfUFNfSERSX0xPQzsKKwkJCQkgICAgZHByYW0gPSAodTE2KURXTkxEX01BRzFfUFNfSERSX0xPQzsKIAkJCQkJaWYgKHdvcmRfbGVuZ3RoICYgMHgxKQogCQkJCQkJd29yZF9sZW5ndGgrKzsKIAkJCQkJd29yZF9sZW5ndGggPSB3b3JkX2xlbmd0aCAvIDI7CiAKLQkJCVN0YXR1cyA9ICAgd3JpdGVfYmxrKGZ0MTAwMGRldiwgJnBVc0ZpbGUsICZwVWNGaWxlLCB3b3JkX2xlbmd0aCk7Ci0JCQkvL0RFQlVHKCJ3cml0ZV9ibGsgcmV0dXJuZWQgJWRcbiIsIFN0YXR1cyk7CisJCQlzdGF0dXMgPSAgIHdyaXRlX2JsayhmdDEwMDBkZXYsICZzX2ZpbGUsICZjX2ZpbGUsIHdvcmRfbGVuZ3RoKTsKKwkJCS8vREVCVUcoIndyaXRlX2JsayByZXR1cm5lZCAlZFxuIiwgc3RhdHVzKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIERFQlVHKCJGVDEwMDA6ZG93bmxvYWQ6RG93bmxvYWQgZXJyb3I6IEJhZCByZXF1ZXN0IHR5cGU9JWQgaW4gQk9PVCBkb3dubG9hZCBzdGF0ZS5cbiIscmVxdWVzdCk7Ci0gICAgICAgICAgICAgICBTdGF0dXMgPSBTVEFUVVNfRkFJTFVSRTsKKyAgICAgICAgICAgICAgIHN0YXR1cyA9IFNUQVRVU19GQUlMVVJFOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAocGZ0MTAwMGluZm8tPnVzYmJvb3QpCkBAIC05MzAsNyArOTMwLDcgQEAKICAgICAgICAgIGVsc2UKICAgICAgICAgIHsKICAgICAgICAgICAgIERFQlVHKCJGVDEwMDA6ZG93bmxvYWQ6RG93bmxvYWQgZXJyb3I6IEhhbmRzaGFrZSBmYWlsZWRcbiIpOwotICAgICAgICAgICAgU3RhdHVzID0gU1RBVFVTX0ZBSUxVUkU7CisgICAgICAgICAgICBzdGF0dXMgPSBTVEFUVVNfRkFJTFVSRTsKICAgICAgICAgIH0KIAogICAgICAgICAgYnJlYWs7CkBAIC05NTksNyArOTU5LDcgQEAKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgIFJFUVVFU1RfUlVOX0FERFJFU1M6CiAgICAgICAgICAgICAgICBERUJVRygiRlQxMDAwOmRvd25sb2FkOiAgUkVRVUVTVF9SVU5fQUREUkVTU1xuIik7Ci0gICAgICAgICAgICAgICBpZiAoYkdvb2RWZXJzaW9uKQorICAgICAgICAgICAgICAgaWYgKGNvcnJlY3RfdmVyc2lvbikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgIERFQlVHKCJGVDEwMDA6ZG93bmxvYWQ6cnVuX2FkZHJlc3MgPSAweCU4eFxuIiwgKGludClydW5fYWRkcmVzcyk7CiAgICAgICAgICAgICAgICAgICBwdXRfcmVxdWVzdF92YWx1ZShmdDEwMDBkZXYsIHJ1bl9hZGRyZXNzKTsKQEAgLTk2NywxMyArOTY3LDEzIEBACiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICBERUJVRygiRlQxMDAwOmRvd25sb2FkOkRvd25sb2FkIGVycm9yOiBHb3QgUnVuIGFkZHJlc3MgcmVxdWVzdCBiZWZvcmUgaW1hZ2Ugb2Zmc2V0IHJlcXVlc3QuXG4iKTsKLSAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IFNUQVRVU19GQUlMVVJFOworICAgICAgICAgICAgICAgICAgc3RhdHVzID0gU1RBVFVTX0ZBSUxVUkU7CiAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSAgUkVRVUVTVF9DT0RFX0xFTkdUSDoKICAgICAgICAgICAgICAgIERFQlVHKCJGVDEwMDA6ZG93bmxvYWQ6UkVRVUVTVF9DT0RFX0xFTkdUSFxuIik7Ci0gICAgICAgICAgICAgICBpZiAoYkdvb2RWZXJzaW9uKQorICAgICAgICAgICAgICAgaWYgKGNvcnJlY3RfdmVyc2lvbikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgIERFQlVHKCJGVDEwMDA6ZG93bmxvYWQ6cnVuX3NpemUgPSAweCU4eFxuIiwgKGludClydW5fc2l6ZSk7CiAgICAgICAgICAgICAgICAgICBwdXRfcmVxdWVzdF92YWx1ZShmdDEwMDBkZXYsIHJ1bl9zaXplKTsKQEAgLTk4MSwyMyArOTgxLDIzIEBACiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICBERUJVRygiRlQxMDAwOmRvd25sb2FkOkRvd25sb2FkIGVycm9yOiBHb3QgU2l6ZSByZXF1ZXN0IGJlZm9yZSBpbWFnZSBvZmZzZXQgcmVxdWVzdC5cbiIpOwotICAgICAgICAgICAgICAgICAgU3RhdHVzID0gU1RBVFVTX0ZBSUxVUkU7CisgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBTVEFUVVNfRkFJTFVSRTsKICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlICBSRVFVRVNUX0RPTkVfQ0w6CiAgICAgICAgICAgICAgICBwZnQxMDAwaW5mby0+dXNiYm9vdCA9IDM7CiAgICAgICAgICAgICAgICAvKiBSZXBvc2l0aW9uIHB0cnMgdG8gYmVnaW5uaW5nIG9mIHByb3Zpc2lvbmluZyBzZWN0aW9uICovCi0gICAgICAgICAgICAgICAgICBwVXNGaWxlID0gKFVTSE9SVCAqKShwRmlsZVN0YXJ0ICsgcEZpbGVIZHI1LT5jb21tYW5kc19vZmZzZXQpOwotICAgICAgICAgICAgICAgICAgcFVjRmlsZSA9IChVQ0hBUiAqKShwRmlsZVN0YXJ0ICsgcEZpbGVIZHI1LT5jb21tYW5kc19vZmZzZXQpOwotICAgICAgICAgICAgICAgdWlTdGF0ZSA9IFNUQVRFX0RPTkVfRFdOTEQ7CisgICAgICAgICAgICAgICAgICBzX2ZpbGUgPSAodTE2ICopKHBGaWxlU3RhcnQgKyBmaWxlX2hkci0+Y29tbWFuZHNfb2Zmc2V0KTsKKyAgICAgICAgICAgICAgICAgIGNfZmlsZSA9ICh1OCAqKShwRmlsZVN0YXJ0ICsgZmlsZV9oZHItPmNvbW1hbmRzX29mZnNldCk7CisgICAgICAgICAgICAgICBzdGF0ZSA9IFNUQVRFX0RPTkVfRFdOTEQ7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgIFJFUVVFU1RfQ09ERV9TRUdNRU5UOgogICAgICAgICAgICAgICAgLy9ERUJVRygiRlQxMDAwOmRvd25sb2FkOiBSRVFVRVNUX0NPREVfU0VHTUVOVCAtIENPREVMT0FERVJcbiIpOwotICAgICAgICAgICAgICAgaWYgKCFiR29vZFZlcnNpb24pCisgICAgICAgICAgICAgICBpZiAoIWNvcnJlY3RfdmVyc2lvbikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgIERFQlVHKCJGVDEwMDA6ZG93bmxvYWQ6RG93bmxvYWQgZXJyb3I6IEdvdCBDb2RlIFNlZ21lbnQgcmVxdWVzdCBiZWZvcmUgaW1hZ2Ugb2Zmc2V0IHJlcXVlc3QuXG4iKTsKLSAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IFNUQVRVU19GQUlMVVJFOworICAgICAgICAgICAgICAgICAgc3RhdHVzID0gU1RBVFVTX0ZBSUxVUkU7CiAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICNpZiAwCkBAIC0xMDExLDI4ICsxMDExLDI4IEBACiAjZW5kaWYKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgIERFQlVHKCJGVDEwMDA6ZG93bmxvYWQ6RG93bmxvYWQgZXJyb3I6IE1heCBsZW5ndGggZXhjZWVkZWRcbiIpOwotICAgICAgICAgICAgICAgICAgU3RhdHVzID0gU1RBVFVTX0ZBSUxVUkU7CisgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBTVEFUVVNfRkFJTFVSRTsKICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgaWYgKCAod29yZF9sZW5ndGgqMiArIHBVY0ZpbGUpID4gcENvZGVFbmQpCisgICAgICAgICAgICAgICBpZiAoICh3b3JkX2xlbmd0aCoyICsgY19maWxlKSA+IGNvZGVfZW5kKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAgICAqIEVycm9yLCBiZXlvbmQgYm9vdCBjb2RlIHJhbmdlLgogICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICBERUJVRygiRlQxMDAwOmRvd25sb2FkOkRvd25sb2FkIGVycm9yOiBSZXF1ZXN0ZWQgbGVuPSVkIGV4Y2VlZHMgRFNQIGNvZGUgYm91bmRyeS5cbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCl3b3JkX2xlbmd0aCk7Ci0gICAgICAgICAgICAgICAgICBTdGF0dXMgPSBTVEFUVVNfRkFJTFVSRTsKKyAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IFNUQVRVU19GQUlMVVJFOwogICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICogUG9zaXRpb24gQVNJQyBEUFJBTSBhdXRvLWluY3JlbWVudCBwb2ludGVyLgogICAgICAgICAgICAgICAgICovCi0JCSAgIGRwcmFtID0gKFVTSE9SVClEV05MRF9NQUcxX1BTX0hEUl9MT0M7CisJCSAgIGRwcmFtID0gKHUxNilEV05MRF9NQUcxX1BTX0hEUl9MT0M7CiAJCSAgIGlmICh3b3JkX2xlbmd0aCAmIDB4MSkKIAkJCXdvcmRfbGVuZ3RoKys7CiAJCSAgIHdvcmRfbGVuZ3RoID0gd29yZF9sZW5ndGggLyAyOwogCi0gICAJICAgICAgIHdyaXRlX2Jsa19maWZvIChmdDEwMDBkZXYsICZwVXNGaWxlLCAmcFVjRmlsZSwgd29yZF9sZW5ndGgpOworICAgCSAgICAgICB3cml0ZV9ibGtfZmlmbyAoZnQxMDAwZGV2LCAmc19maWxlLCAmY19maWxlLCB3b3JkX2xlbmd0aCk7CiAgICAgICAgICAgICAgICBpZiAocGZ0MTAwMGluZm8tPnVzYmJvb3QgPT0gMCkKICAgICAgICAgICAgICAgICAgICBwZnQxMDAwaW5mby0+dXNiYm9vdCsrOwogICAgICAgICAgICAgICAgaWYgKHBmdDEwMDBpbmZvLT51c2Jib290ID09IDEpIHsKQEAgLTEwNDcsMTQgKzEwNDcsMTQgQEAKICAgICAgICAgICAgICAgIC8vIENvbnZlcnQgbGVuZ3RoIGZyb20gYnl0ZSBjb3VudCB0byB3b3JkIGNvdW50LiBNYWtlIHN1cmUgd2Ugcm91bmQgdXAuCiAgICAgICAgICAgICAgICB3b3JkX2xlbmd0aCA9IChsb25nKShwZnQxMDAwaW5mby0+RFNQSW5mb0Jsa2xlbiArIDEpLzI7CiAgICAgICAgICAgICAgICBwdXRfcmVxdWVzdF92YWx1ZShmdDEwMDBkZXYsIHdvcmRfbGVuZ3RoKTsKLQkJcE1haWxCb3hEYXRhID0gKHN0cnVjdCBkcnZfbXNnICopJihwZnQxMDAwaW5mby0+RFNQSW5mb0Jsa1swXSk7CisJCW1haWxib3hfZGF0YSA9IChzdHJ1Y3QgZHJ2X21zZyAqKSYocGZ0MTAwMGluZm8tPkRTUEluZm9CbGtbMF0pOwogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAqIFBvc2l0aW9uIEFTSUMgRFBSQU0gYXV0by1pbmNyZW1lbnQgcG9pbnRlci4KICAgICAgICAgICAgICAgICAqLwogCiAKLSAgICAgICAgICAgICAgICAgICBwVXNEYXRhID0gKFVTSE9SVCAqKSZwTWFpbEJveERhdGEtPmRhdGFbMF07Ci0gICAgICAgICAgICAgICAgICAgZHByYW0gPSAoVVNIT1JUKURXTkxEX01BRzFfUFNfSERSX0xPQzsKKyAgICAgICAgICAgICAgICAgICBkYXRhID0gKHUxNiAqKSZtYWlsYm94X2RhdGEtPmRhdGFbMF07CisgICAgICAgICAgICAgICAgICAgZHByYW0gPSAodTE2KURXTkxEX01BRzFfUFNfSERSX0xPQzsKICAgICAgICAgICAgICAgICAgICBpZiAod29yZF9sZW5ndGggJiAweDEpCiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmRfbGVuZ3RoKys7CiAKQEAgLTEwNjQsMjUgKzEwNjQsMjUgQEAKICAgICAgICAgICAgICAgIGZvciAoOyB3b3JkX2xlbmd0aCA+IDA7IHdvcmRfbGVuZ3RoLS0pIC8qIEluIHdvcmRzICovCiAgICAgICAgICAgICAgICB7CiAKLSAgICAgICAgICAgICAgICAgICAgICB0ZW1wbG9uZyA9ICpwVXNEYXRhKys7Ci0JCQkJCSAgdGVtcGxvbmcgfD0gKCpwVXNEYXRhKysgPDwgMTYpOwotICAgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IGZpeF9mdDEwMDBfd3JpdGVfZHByYW0zMiAoZnQxMDAwZGV2LCBkcHJhbSsrLCAoUFVDSEFSKSZ0ZW1wbG9uZyk7CisgICAgICAgICAgICAgICAgICAgICAgdGVtcGxvbmcgPSAqZGF0YSsrOworCQkJCQkgIHRlbXBsb25nIHw9ICgqZGF0YSsrIDw8IDE2KTsKKyAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBmaXhfZnQxMDAwX3dyaXRlX2RwcmFtMzIgKGZ0MTAwMGRldiwgZHByYW0rKywgKHU4ICopJnRlbXBsb25nKTsKIAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgICAgIGNhc2UgIFJFUVVFU1RfVkVSU0lPTl9JTkZPOgogICAgICAgICAgICAgICAgREVCVUcoIkZUMTAwMDpkb3dubG9hZDpSRVFVRVNUX1ZFUlNJT05fSU5GT1xuIik7Ci0gICAgICAgICAgICAgICB3b3JkX2xlbmd0aCA9IHBGaWxlSGRyNS0+dmVyc2lvbl9kYXRhX3NpemU7CisgICAgICAgICAgICAgICB3b3JkX2xlbmd0aCA9IGZpbGVfaGRyLT52ZXJzaW9uX2RhdGFfc2l6ZTsKICAgICAgICAgICAgICAgIHB1dF9yZXF1ZXN0X3ZhbHVlKGZ0MTAwMGRldiwgd29yZF9sZW5ndGgpOwogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAqIFBvc2l0aW9uIEFTSUMgRFBSQU0gYXV0by1pbmNyZW1lbnQgcG9pbnRlci4KICAgICAgICAgICAgICAgICAqLwogCi0gICAgICAgICAgICAgICBwVXNGaWxlID0gKFVTSE9SVCAqKShwRmlsZVN0YXJ0ICsgcEZpbGVIZHI1LT52ZXJzaW9uX2RhdGFfb2Zmc2V0KTsKKyAgICAgICAgICAgICAgIHNfZmlsZSA9ICh1MTYgKikocEZpbGVTdGFydCArIGZpbGVfaGRyLT52ZXJzaW9uX2RhdGFfb2Zmc2V0KTsKIAogCi0gICAgICAgICAgICAgICAgICAgZHByYW0gPSAoVVNIT1JUKURXTkxEX01BRzFfUFNfSERSX0xPQzsKKyAgICAgICAgICAgICAgICAgICBkcHJhbSA9ICh1MTYpRFdOTERfTUFHMV9QU19IRFJfTE9DOwogICAgICAgICAgICAgICAgICAgIGlmICh3b3JkX2xlbmd0aCAmIDB4MSkKICAgICAgICAgICAgICAgICAgICAgICAgd29yZF9sZW5ndGgrKzsKIApAQCAtMTA5Miw1OSArMTA5Miw1OSBAQAogICAgICAgICAgICAgICAgZm9yICg7IHdvcmRfbGVuZ3RoID4gMDsgd29yZF9sZW5ndGgtLSkgLyogSW4gd29yZHMgKi8KICAgICAgICAgICAgICAgIHsKIAotICAgICAgICAgICAgICAgICAgICAgIHRlbXBsb25nID0gbnRvaHMoKnBVc0ZpbGUrKyk7Ci0JCQkJCSAgdGVtcCA9IG50b2hzKCpwVXNGaWxlKyspOworICAgICAgICAgICAgICAgICAgICAgIHRlbXBsb25nID0gbnRvaHMoKnNfZmlsZSsrKTsKKwkJCQkJICB0ZW1wID0gbnRvaHMoKnNfZmlsZSsrKTsKIAkJCQkJICB0ZW1wbG9uZyB8PSAodGVtcCA8PCAxNik7Ci0gICAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gZml4X2Z0MTAwMF93cml0ZV9kcHJhbTMyIChmdDEwMDBkZXYsIGRwcmFtKyssIChQVUNIQVIpJnRlbXBsb25nKTsKKyAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBmaXhfZnQxMDAwX3dyaXRlX2RwcmFtMzIgKGZ0MTAwMGRldiwgZHByYW0rKywgKHU4ICopJnRlbXBsb25nKTsKIAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgICAgIGNhc2UgIFJFUVVFU1RfQ09ERV9CWV9WRVJTSU9OOgogICAgICAgICAgICAgICAgREVCVUcoIkZUMTAwMDpkb3dubG9hZDpSRVFVRVNUX0NPREVfQllfVkVSU0lPTlxuIik7Ci0gICAgICAgICAgICAgICBiR29vZFZlcnNpb24gPSBGQUxTRTsKKyAgICAgICAgICAgICAgIGNvcnJlY3RfdmVyc2lvbiA9IEZBTFNFOwogICAgICAgICAgICAgICAgcmVxdWVzdGVkX3ZlcnNpb24gPSBnZXRfcmVxdWVzdF92YWx1ZShmdDEwMDBkZXYpOwogCi0gICAgICAgICAgICAgICAgICAgcERzcEltYWdlSW5mb1Y2ID0gKHN0cnVjdCBkc3BfaW1hZ2VfaW5mbyAqKShwRmlsZVN0YXJ0ICsgc2l6ZW9mKHN0cnVjdCBkc3BfZmlsZV9oZHIgKSk7CisgICAgICAgICAgICAgICAgICAgZHNwX2ltZ19pbmZvID0gKHN0cnVjdCBkc3BfaW1hZ2VfaW5mbyAqKShwRmlsZVN0YXJ0ICsgc2l6ZW9mKHN0cnVjdCBkc3BfZmlsZV9oZHIgKSk7CiAKLSAgICAgICAgICAgICAgIGZvciAoaW1hZ2VOID0gMDsgaW1hZ2VOIDwgcEZpbGVIZHI1LT5uRHNwSW1hZ2VzOyBpbWFnZU4rKykKKyAgICAgICAgICAgICAgIGZvciAoaW1hZ2UgPSAwOyBpbWFnZSA8IGZpbGVfaGRyLT5uRHNwSW1hZ2VzOyBpbWFnZSsrKQogICAgICAgICAgICAgICAgewogCi0gICAgICAgICAgICAgICAgICAgICAgIHRlbXAgPSAoVVNIT1JUKShwRHNwSW1hZ2VJbmZvVjYtPnZlcnNpb24pOworICAgICAgICAgICAgICAgICAgICAgICB0ZW1wID0gKHUxNikoZHNwX2ltZ19pbmZvLT52ZXJzaW9uKTsKICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxvbmcgPSB0ZW1wOwotICAgICAgICAgICAgICAgICAgICAgICB0ZW1wID0gKFVTSE9SVCkocERzcEltYWdlSW5mb1Y2LT52ZXJzaW9uID4+IDE2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgdGVtcCA9ICh1MTYpKGRzcF9pbWdfaW5mby0+dmVyc2lvbiA+PiAxNik7CiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsb25nIHw9ICh0ZW1wIDw8IDE2KTsKLSAgICAgICAgICAgICAgICAgICBpZiAodGVtcGxvbmcgPT0gKFVMT05HKXJlcXVlc3RlZF92ZXJzaW9uKQorICAgICAgICAgICAgICAgICAgIGlmICh0ZW1wbG9uZyA9PSAodTMyKXJlcXVlc3RlZF92ZXJzaW9uKQogICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBiR29vZFZlcnNpb24gPSBUUlVFOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgREVCVUcoIkZUMTAwMDpkb3dubG9hZDogYkdvb2RWZXJzaW9uIGlzIFRSVUVcbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgcFVzRmlsZSA9IChVU0hPUlQgKikocEZpbGVTdGFydCArIHBEc3BJbWFnZUluZm9WNi0+YmVnaW5fb2Zmc2V0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBVY0ZpbGUgPSAoVUNIQVIgKikocEZpbGVTdGFydCArIHBEc3BJbWFnZUluZm9WNi0+YmVnaW5fb2Zmc2V0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDb2RlRW5kID0gKFVDSEFSICopKHBGaWxlU3RhcnQgKyBwRHNwSW1hZ2VJbmZvVjYtPmVuZF9vZmZzZXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuX2FkZHJlc3MgPSBwRHNwSW1hZ2VJbmZvVjYtPnJ1bl9hZGRyZXNzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuX3NpemUgPSBwRHNwSW1hZ2VJbmZvVjYtPmltYWdlX3NpemU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZV9jaGtzdW0gPSAoVUxPTkcpcERzcEltYWdlSW5mb1Y2LT5jaGVja3N1bTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcnJlY3RfdmVyc2lvbiA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICBERUJVRygiRlQxMDAwOmRvd25sb2FkOiBjb3JyZWN0X3ZlcnNpb24gaXMgVFJVRVxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICBzX2ZpbGUgPSAodTE2ICopKHBGaWxlU3RhcnQgKyBkc3BfaW1nX2luZm8tPmJlZ2luX29mZnNldCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICBjX2ZpbGUgPSAodTggKikocEZpbGVTdGFydCArIGRzcF9pbWdfaW5mby0+YmVnaW5fb2Zmc2V0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVfZW5kID0gKHU4ICopKHBGaWxlU3RhcnQgKyBkc3BfaW1nX2luZm8tPmVuZF9vZmZzZXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuX2FkZHJlc3MgPSBkc3BfaW1nX2luZm8tPnJ1bl9hZGRyZXNzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuX3NpemUgPSBkc3BfaW1nX2luZm8tPmltYWdlX3NpemU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZV9jaGtzdW0gPSAodTMyKWRzcF9pbWdfaW5mby0+Y2hlY2tzdW07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBEc3BJbWFnZUluZm9WNisrOworICAgICAgICAgICAgICAgICAgICAgICAgZHNwX2ltZ19pbmZvKys7CiAKIAogICAgICAgICAgICAgICAgfSAvL2VuZCBvZiBmb3IKIAotICAgICAgICAgICAgICAgaWYgKCFiR29vZFZlcnNpb24pCisgICAgICAgICAgICAgICBpZiAoIWNvcnJlY3RfdmVyc2lvbikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgICAgKiBFcnJvciwgYmV5b25kIGJvb3QgY29kZSByYW5nZS4KICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgREVCVUcoIkZUMTAwMDpkb3dubG9hZDpEb3dubG9hZCBlcnJvcjogQmFkIFZlcnNpb24gUmVxdWVzdCA9IDB4JXguXG4iLChpbnQpcmVxdWVzdGVkX3ZlcnNpb24pOwotICAgICAgICAgICAgICAgICAgU3RhdHVzID0gU1RBVFVTX0ZBSUxVUkU7CisgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBTVEFUVVNfRkFJTFVSRTsKICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICBERUJVRygiRlQxMDAwOmRvd25sb2FkOkRvd25sb2FkIGVycm9yOiBCYWQgcmVxdWVzdCB0eXBlPSVkIGluIENPREUgZG93bmxvYWQgc3RhdGUuXG4iLHJlcXVlc3QpOwotICAgICAgICAgICAgICAgU3RhdHVzID0gU1RBVFVTX0ZBSUxVUkU7CisgICAgICAgICAgICAgICBzdGF0dXMgPSBTVEFUVVNfRkFJTFVSRTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKHBmdDEwMDBpbmZvLT51c2Jib290KQpAQCAtMTE1NSw5NCArMTE1NSw5NCBAQAogICAgICAgICAgZWxzZQogICAgICAgICAgewogICAgICAgICAgICAgREVCVUcoIkZUMTAwMDpkb3dubG9hZDpEb3dubG9hZCBlcnJvcjogSGFuZHNoYWtlIGZhaWxlZFxuIik7Ci0gICAgICAgICAgICBTdGF0dXMgPSBTVEFUVVNfRkFJTFVSRTsKKyAgICAgICAgICAgIHN0YXR1cyA9IFNUQVRVU19GQUlMVVJFOwogICAgICAgICAgfQogCiAgICAgICAgICBicmVhazsKIAogICAgICAgY2FzZSBTVEFURV9ET05FX0RXTkxEOgogICAgICAgICAgREVCVUcoIkZUMTAwMDpkb3dubG9hZDpDb2RlIGxvYWRlciBpcyBkb25lLi4uXG4iKTsKLSAgICAgICAgIHVpU3RhdGUgPSBTVEFURV9TRUNUSU9OX1BST1Y7CisgICAgICAgICBzdGF0ZSA9IFNUQVRFX1NFQ1RJT05fUFJPVjsKICAgICAgICAgIGJyZWFrOwogCiAgICAgICBjYXNlICBTVEFURV9TRUNUSU9OX1BST1Y6CiAgICAgICAgICBERUJVRygiRlQxMDAwOmRvd25sb2FkOlNUQVRFX1NFQ1RJT05fUFJPVlxuIik7Ci0JCXBIZHIgPSAoc3RydWN0IHBzZXVkb19oZHIgKilwVWNGaWxlOworCQlwc2V1ZG9faGVhZGVyID0gKHN0cnVjdCBwc2V1ZG9faGRyICopY19maWxlOwogCi0gICAgICAgICBpZiAocEhkci0+Y2hlY2tzdW0gPT0gaGRyX2NoZWNrc3VtKHBIZHIpKQorICAgICAgICAgaWYgKHBzZXVkb19oZWFkZXItPmNoZWNrc3VtID09IGhkcl9jaGVja3N1bShwc2V1ZG9faGVhZGVyKSkKICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChwSGRyLT5wb3J0ZGVzdCAhPSAweDgwIC8qIERzcCBPQU0gKi8pCisgICAgICAgICAgICBpZiAocHNldWRvX2hlYWRlci0+cG9ydGRlc3QgIT0gMHg4MCAvKiBEc3AgT0FNICovKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgdWlTdGF0ZSA9IFNUQVRFX0RPTkVfUFJPVjsKKyAgICAgICAgICAgICAgIHN0YXRlID0gU1RBVEVfRE9ORV9QUk9WOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB1c0hkckxlbmd0aCA9IG50b2hzKHBIZHItPmxlbmd0aCk7ICAgIC8qIEJ5dGUgbGVuZ3RoIGZvciBQUk9WIHJlY29yZHMgKi8KKyAgICAgICAgICAgIHBzZXVkb19oZWFkZXJfbGVuID0gbnRvaHMocHNldWRvX2hlYWRlci0+bGVuZ3RoKTsgICAgLyogQnl0ZSBsZW5ndGggZm9yIFBST1YgcmVjb3JkcyAqLwogCiAgICAgICAgICAgICAvLyBHZXQgYnVmZmVyIGZvciBwcm92aXNpb25pbmcgZGF0YQotCQlwYnVmZmVyID0ga21hbGxvYygodXNIZHJMZW5ndGggKyBzaXplb2Yoc3RydWN0IHBzZXVkb19oZHIpKSwgR0ZQX0FUT01JQyk7CisJCXBidWZmZXIgPSBrbWFsbG9jKChwc2V1ZG9faGVhZGVyX2xlbiArIHNpemVvZihzdHJ1Y3QgcHNldWRvX2hkcikpLCBHRlBfQVRPTUlDKTsKICAgICAgICAgICAgIGlmIChwYnVmZmVyKSB7Ci0JCW1lbWNweShwYnVmZmVyLCAodm9pZCAqKXBVY0ZpbGUsIChVSU5UKSh1c0hkckxlbmd0aCArIHNpemVvZihzdHJ1Y3QgcHNldWRvX2hkcikpKTsKKwkJbWVtY3B5KHBidWZmZXIsICh2b2lkICopY19maWxlLCAodTMyKShwc2V1ZG9faGVhZGVyX2xlbiArIHNpemVvZihzdHJ1Y3QgcHNldWRvX2hkcikpKTsKICAgICAgICAgICAgICAgICAvLyBsaW5rIHByb3Zpc2lvbmluZyBkYXRhCiAJCXBwcm92X3JlY29yZCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBwcm92X3JlY29yZCksIEdGUF9BVE9NSUMpOwogICAgICAgICAgICAgICAgIGlmIChwcHJvdl9yZWNvcmQpIHsKICAgICAgICAgICAgICAgICAgICAgcHByb3ZfcmVjb3JkLT5wcHJvdl9kYXRhID0gcGJ1ZmZlcjsKICAgICAgICAgICAgICAgICAgICAgbGlzdF9hZGRfdGFpbCAoJnBwcm92X3JlY29yZC0+bGlzdCwgJnBmdDEwMDBpbmZvLT5wcm92X2xpc3QpOwogICAgICAgICAgICAgICAgICAgICAvLyBNb3ZlIHRvIG5leHQgZW50cnkgaWYgYXZhaWxhYmxlCi0JCQlwVWNGaWxlID0gKFVDSEFSICopKCh1bnNpZ25lZCBsb25nKXBVY0ZpbGUgKyAoVUlOVCkoKHVzSGRyTGVuZ3RoICsgMSkgJiAweEZGRkZGRkZFKSArIHNpemVvZihzdHJ1Y3QgcHNldWRvX2hkcikpOwotICAgICAgICAgICAgICAgICAgICBpZiAoICh1bnNpZ25lZCBsb25nKShwVWNGaWxlKSAtICh1bnNpZ25lZCBsb25nKShwRmlsZVN0YXJ0KSA+PSAodW5zaWduZWQgbG9uZylGaWxlTGVuZ3RoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHVpU3RhdGUgPSBTVEFURV9ET05FX0ZJTEU7CisJCQljX2ZpbGUgPSAodTggKikoKHVuc2lnbmVkIGxvbmcpY19maWxlICsgKHUzMikoKHBzZXVkb19oZWFkZXJfbGVuICsgMSkgJiAweEZGRkZGRkZFKSArIHNpemVvZihzdHJ1Y3QgcHNldWRvX2hkcikpOworICAgICAgICAgICAgICAgICAgICBpZiAoICh1bnNpZ25lZCBsb25nKShjX2ZpbGUpIC0gKHVuc2lnbmVkIGxvbmcpKHBGaWxlU3RhcnQpID49ICh1bnNpZ25lZCBsb25nKUZpbGVMZW5ndGgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBTVEFURV9ET05FX0ZJTEU7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIGtmcmVlKHBidWZmZXIpOwotICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSBTVEFUVVNfRkFJTFVSRTsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gU1RBVFVTX0ZBSUxVUkU7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgU3RhdHVzID0gU1RBVFVTX0ZBSUxVUkU7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gU1RBVFVTX0ZBSUxVUkU7CiAgICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBlbHNlCiAgICAgICAgICB7CiAgICAgICAgICAgICAvKiBDaGVja3N1bSBkaWQgbm90IGNvbXB1dGUgKi8KLSAgICAgICAgICAgIFN0YXR1cyA9IFNUQVRVU19GQUlMVVJFOworICAgICAgICAgICAgc3RhdHVzID0gU1RBVFVTX0ZBSUxVUkU7CiAgICAgICAgICB9Ci0gICAgICAgICBERUJVRygiZnQxMDAwOmRvd25sb2FkOiBhZnRlciBTVEFURV9TRUNUSU9OX1BST1YsIHVpU3RhdGUgPSAlZCwgU3RhdHVzPSAlZFxuIiwgdWlTdGF0ZSwgU3RhdHVzKTsKKyAgICAgICAgIERFQlVHKCJmdDEwMDA6ZG93bmxvYWQ6IGFmdGVyIFNUQVRFX1NFQ1RJT05fUFJPViwgc3RhdGUgPSAlZCwgc3RhdHVzPSAlZFxuIiwgc3RhdGUsIHN0YXR1cyk7CiAgICAgICAgICBicmVhazsKIAogICAgICAgY2FzZSAgU1RBVEVfRE9ORV9QUk9WOgogICAgICAgICAgREVCVUcoIkZUMTAwMDpkb3dubG9hZDpTVEFURV9ET05FX1BST1ZcbiIpOwotICAgICAgICAgdWlTdGF0ZSA9IFNUQVRFX0RPTkVfRklMRTsKKyAgICAgICAgIHN0YXRlID0gU1RBVEVfRE9ORV9GSUxFOwogICAgICAgICAgYnJlYWs7CiAKIAogICAgICAgZGVmYXVsdDoKLSAgICAgICAgIFN0YXR1cyA9IFNUQVRVU19GQUlMVVJFOworICAgICAgICAgc3RhdHVzID0gU1RBVFVTX0ZBSUxVUkU7CiAgICAgICAgICBicmVhazsKICAgICAgIH0gLyogRW5kIFN3aXRjaCAqLwogCi0gICAgICBpZiAoU3RhdHVzICE9IFNUQVRVU19TVUNDRVNTKSB7CisgICAgICBpZiAoc3RhdHVzICE9IFNUQVRVU19TVUNDRVNTKSB7CiAgICAgICAgICAgYnJlYWs7CiAgICAgICB9CiAKIC8qKioqCiAgICAgICAvLyBDaGVjayBpZiBDYXJkIGlzIHByZXNlbnQKLSAgICAgIFN0YXR1cyA9IEhhcmxleV9SZWFkX1JlZ2lzdGVyKCZ0ZW1wLCBGVDEwMDBfUkVHX1NVUF9JTUFTSyk7Ci0gICAgICBpZiAoIChTdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykgfHwgKHRlbXAgPT0gMHgwMDAwKSApIHsKKyAgICAgIHN0YXR1cyA9IEhhcmxleV9SZWFkX1JlZ2lzdGVyKCZ0ZW1wLCBGVDEwMDBfUkVHX1NVUF9JTUFTSyk7CisgICAgICBpZiAoIChzdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykgfHwgKHRlbXAgPT0gMHgwMDAwKSApIHsKICAgICAgICAgICBicmVhazsKICAgICAgIH0KIAotICAgICAgU3RhdHVzID0gSGFybGV5X1JlYWRfUmVnaXN0ZXIoJnRlbXAsIEZUMTAwMF9SRUdfQVNJQ19JRCk7Ci0gICAgICBpZiAoIChTdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykgfHwgKHRlbXAgPT0gMHhmZmZmKSApIHsKKyAgICAgIHN0YXR1cyA9IEhhcmxleV9SZWFkX1JlZ2lzdGVyKCZ0ZW1wLCBGVDEwMDBfUkVHX0FTSUNfSUQpOworICAgICAgaWYgKCAoc3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpIHx8ICh0ZW1wID09IDB4ZmZmZikgKSB7CiAgICAgICAgICAgYnJlYWs7CiAgICAgICB9CiAqKioqLwogCiAgICB9IC8qIEVuZCB3aGlsZSAqLwogCi0gICBERUJVRygiRG93bmxvYWQgZXhpdGluZyB3aXRoIHN0YXR1cyA9IDB4JTh4XG4iLCBTdGF0dXMpOworICAgREVCVUcoIkRvd25sb2FkIGV4aXRpbmcgd2l0aCBzdGF0dXMgPSAweCU4eFxuIiwgc3RhdHVzKTsKICAgIGZ0MTAwMF93cml0ZV9yZWdpc3RlcihmdDEwMDBkZXYsIEZUMTAwMF9EQl9ETkxEX1RYLCBGVDEwMDBfUkVHX0RPT1JCRUxMKTsKIAotICAgcmV0dXJuIFN0YXR1czsKKyAgIHJldHVybiBzdGF0dXM7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9mdDEwMDAvZnQxMDAwLXVzYi9mdDEwMDBfaHcuYyBiL2RyaXZlcnMvc3RhZ2luZy9mdDEwMDAvZnQxMDAwLXVzYi9mdDEwMDBfaHcuYwppbmRleCA1Yjg5ZWUyLi42NDNhNjM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZnQxMDAwL2Z0MTAwMC11c2IvZnQxMDAwX2h3LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2Z0MTAwMC9mdDEwMDAtdXNiL2Z0MTAwMF9ody5jCkBAIC00MSwzNyArNDEsOSBAQAogLy9KaW0KIAogc3RhdGljIHU4IHRlbXBidWZmZXJbMTYwMF07Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBnQ2FyZEluZGV4OwogCiAjZGVmaW5lIE1BWF9SQ1ZfTE9PUCAgIDEwMAogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgIGZ0MTAwMF9jb250cm9sX2NvbXBsZXRlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGZ0MTAwMF9jb250cm9sX2NvbXBsZXRlKHN0cnVjdCB1cmIgKnVyYikKLXsKLSAgICBzdHJ1Y3QgZnQxMDAwX2RldmljZSAqZnQxMDAwZGV2ID0gKHN0cnVjdCBmdDEwMDBfZGV2aWNlICopdXJiLT5jb250ZXh0OwotCi0gICAgLy9ERUJVRygiRlQxMDAwX0NPTlRST0xfQ09NUExFVEUgRU5URVJFRFxuIik7Ci0gICAgaWYgKGZ0MTAwMGRldiA9PSBOVUxMICkKLSAgICB7Ci0gICAgICAgIERFQlVHKCJOVUxMIGZ0MTAwMGRldiwgZmFpbHVyZVxuIik7Ci0gICAgICAgIHJldHVybiA7Ci0gICAgfQotICAgIGVsc2UgaWYgKCBmdDEwMDBkZXYtPmRldiA9PSBOVUxMICkKLSAgICB7Ci0gICAgICAgIERFQlVHKCJOVUxMIGZ0MTAwMGRldi0+ZGV2LCBmYWlsdXJlXG4iKTsKLSAgICAgICAgcmV0dXJuIDsKLSAgICB9Ci0KLSAgICBpZih3YWl0cXVldWVfYWN0aXZlKCZmdDEwMDBkZXYtPmNvbnRyb2xfd2FpdCkpCi0gICAgewotICAgICAgICB3YWtlX3VwKCZmdDEwMDBkZXYtPmNvbnRyb2xfd2FpdCk7Ci0gICAgfQotCi0gICAgLy9ERUJVRygiRlQxMDAwX0NPTlRST0xfQ09NUExFVEUgUkVUVVJORURcbiIpOwotfQotCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8gRnVuY3Rpb246ICAgIGZ0MTAwMF9jb250cm9sCiAvLwpAQCAtMTg3LDcgKzE1OSw3IEBACiAvLyBOb3RlczoKIC8vCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotdTE2IGZ0MTAwMF93cml0ZV9yZWdpc3RlcihzdHJ1Y3QgZnQxMDAwX2RldmljZSAqZnQxMDAwZGV2LCBVU0hPUlQgdmFsdWUsIHUxNiBuUmVnSW5keCkKK3UxNiBmdDEwMDBfd3JpdGVfcmVnaXN0ZXIoc3RydWN0IGZ0MTAwMF9kZXZpY2UgKmZ0MTAwMGRldiwgdTE2IHZhbHVlLCB1MTYgblJlZ0luZHgpCiB7CiAgICAgIHUxNiByZXQgPSBTVEFUVVNfU1VDQ0VTUzsKIApAQCAtMjIzLDcgKzE5NSw3IEBACiAvLwogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotdTE2IGZ0MTAwMF9yZWFkX2RwcmFtMzIoc3RydWN0IGZ0MTAwMF9kZXZpY2UgKmZ0MTAwMGRldiwgVVNIT1JUIGluZHgsIFBVQ0hBUiBidWZmZXIsIFVTSE9SVCBjbnQpCit1MTYgZnQxMDAwX3JlYWRfZHByYW0zMihzdHJ1Y3QgZnQxMDAwX2RldmljZSAqZnQxMDAwZGV2LCB1MTYgaW5keCwgdTggKmJ1ZmZlciwgdTE2IGNudCkKIHsKICAgICB1MTYgcmV0ID0gU1RBVFVTX1NVQ0NFU1M7CiAKQEAgLTI2Miw3ICsyMzQsNyBAQAogLy8gTm90ZXM6CiAvLwogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXUxNiBmdDEwMDBfd3JpdGVfZHByYW0zMihzdHJ1Y3QgZnQxMDAwX2RldmljZSAqZnQxMDAwZGV2LCBVU0hPUlQgaW5keCwgUFVDSEFSIGJ1ZmZlciwgVVNIT1JUIGNudCkKK3UxNiBmdDEwMDBfd3JpdGVfZHByYW0zMihzdHJ1Y3QgZnQxMDAwX2RldmljZSAqZnQxMDAwZGV2LCB1MTYgaW5keCwgdTggKmJ1ZmZlciwgdTE2IGNudCkKIHsKICAgICAgdTE2IHJldCA9IFNUQVRVU19TVUNDRVNTOwogCkBAIC0yOTksNyArMjcxLDcgQEAKIC8vIE5vdGVzOgogLy8KIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi11MTYgZnQxMDAwX3JlYWRfZHByYW0xNihzdHJ1Y3QgZnQxMDAwX2RldmljZSAqZnQxMDAwZGV2LCBVU0hPUlQgaW5keCwgUFVDSEFSIGJ1ZmZlciwgdTggaGlnaGxvdykKK3UxNiBmdDEwMDBfcmVhZF9kcHJhbTE2KHN0cnVjdCBmdDEwMDBfZGV2aWNlICpmdDEwMDBkZXYsIHUxNiBpbmR4LCB1OCAqYnVmZmVyLCB1OCBoaWdobG93KQogewogICAgIHUxNiByZXQgPSBTVEFUVVNfU1VDQ0VTUzsKIApAQCAtMzQ3LDcgKzMxOSw3IEBACiAvLyBOb3RlczoKIC8vCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotdTE2IGZ0MTAwMF93cml0ZV9kcHJhbTE2KHN0cnVjdCBmdDEwMDBfZGV2aWNlICpmdDEwMDBkZXYsIFVTSE9SVCBpbmR4LCBVU0hPUlQgdmFsdWUsIHU4IGhpZ2hsb3cpCit1MTYgZnQxMDAwX3dyaXRlX2RwcmFtMTYoc3RydWN0IGZ0MTAwMF9kZXZpY2UgKmZ0MTAwMGRldiwgdTE2IGluZHgsIHUxNiB2YWx1ZSwgdTggaGlnaGxvdykKIHsKICAgICAgdTE2IHJldCA9IFNUQVRVU19TVUNDRVNTOwogCkBAIC0zOTIsMTAgKzM2NCwxMCBAQAogLy8gTm90ZXM6CiAvLwogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXUxNiBmaXhfZnQxMDAwX3JlYWRfZHByYW0zMihzdHJ1Y3QgZnQxMDAwX2RldmljZSAqZnQxMDAwZGV2LCBVU0hPUlQgaW5keCwgUFVDSEFSIGJ1ZmZlcikKK3UxNiBmaXhfZnQxMDAwX3JlYWRfZHByYW0zMihzdHJ1Y3QgZnQxMDAwX2RldmljZSAqZnQxMDAwZGV2LCB1MTYgaW5keCwgdTggKmJ1ZmZlcikKIHsKLSAgICBVQ0hBUiBidWZbMTZdOwotICAgIFVTSE9SVCBwb3M7CisgICAgdTggYnVmWzE2XTsKKyAgICB1MTYgcG9zOwogICAgIHUxNiByZXQgPSBTVEFUVVNfU1VDQ0VTUzsKIAogICAgIC8vREVCVUcoImZpeF9mdDEwMDBfcmVhZF9kcHJhbTMyOiBpbmR4OiAlZCAgXG4iLCBpbmR4KTsKQEAgLTQ0MSwxNCArNDEzLDE0IEBACiAvLyBOb3RlczoKIC8vCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotdTE2IGZpeF9mdDEwMDBfd3JpdGVfZHByYW0zMihzdHJ1Y3QgZnQxMDAwX2RldmljZSAqZnQxMDAwZGV2LCBVU0hPUlQgaW5keCwgUFVDSEFSIGJ1ZmZlcikKK3UxNiBmaXhfZnQxMDAwX3dyaXRlX2RwcmFtMzIoc3RydWN0IGZ0MTAwMF9kZXZpY2UgKmZ0MTAwMGRldiwgdTE2IGluZHgsIHU4ICpidWZmZXIpCiB7Ci0gICAgVVNIT1JUIHBvczE7Ci0gICAgVVNIT1JUIHBvczI7Ci0gICAgVVNIT1JUIGk7Ci0gICAgVUNIQVIgYnVmWzMyXTsKLSAgICBVQ0hBUiByZXN1bHRidWZmZXJbMzJdOwotICAgIFBVQ0hBUiBwZGF0YTsKKyAgICB1MTYgcG9zMTsKKyAgICB1MTYgcG9zMjsKKyAgICB1MTYgaTsKKyAgICB1OCBidWZbMzJdOworICAgIHU4IHJlc3VsdGJ1ZmZlclszMl07CisgICAgdTggKnBkYXRhOwogICAgIHUxNiByZXQgID0gU1RBVFVTX1NVQ0NFU1M7CiAKICAgICAvL0RFQlVHKCJmaXhfZnQxMDAwX3dyaXRlX2RwcmFtMzI6IEVudGVyZWQ6XG4iKTsKQEAgLTQ3Miw3ICs0NDQsNyBAQAogICAgICAgICByZXR1cm4gcmV0OwogICAgIH0KIAotICAgIHJldCA9IGZ0MTAwMF9yZWFkX2RwcmFtMzIoZnQxMDAwZGV2LCBwb3MxLCAoUFVDSEFSKSZyZXN1bHRidWZmZXJbMF0sIDE2KTsKKyAgICByZXQgPSBmdDEwMDBfcmVhZF9kcHJhbTMyKGZ0MTAwMGRldiwgcG9zMSwgKHU4ICopJnJlc3VsdGJ1ZmZlclswXSwgMTYpOwogICAgIGlmIChyZXQgPT0gU1RBVFVTX1NVQ0NFU1MpCiAgICAgewogICAgICAgICBidWZmZXIgPSBwZGF0YTsKQEAgLTQ4Nyw4ICs0NTksOCBAQAogCiAgICAgaWYgKHJldCA9PSBTVEFUVVNfRkFJTFVSRSkKICAgICB7Ci0gICAgICAgIHJldCA9IGZ0MTAwMF93cml0ZV9kcHJhbTMyKGZ0MTAwMGRldiwgcG9zMSwgKFBVQ0hBUikmdGVtcGJ1ZmZlclswXSwgMTYpOwotICAgICAgICByZXQgPSBmdDEwMDBfcmVhZF9kcHJhbTMyKGZ0MTAwMGRldiwgcG9zMSwgKFBVQ0hBUikmcmVzdWx0YnVmZmVyWzBdLCAxNik7CisgICAgICAgIHJldCA9IGZ0MTAwMF93cml0ZV9kcHJhbTMyKGZ0MTAwMGRldiwgcG9zMSwgKHU4ICopJnRlbXBidWZmZXJbMF0sIDE2KTsKKyAgICAgICAgcmV0ID0gZnQxMDAwX3JlYWRfZHByYW0zMihmdDEwMDBkZXYsIHBvczEsICh1OCAqKSZyZXN1bHRidWZmZXJbMF0sIDE2KTsKICAgICAgICAgaWYgKHJldCA9PSBTVEFUVVNfU1VDQ0VTUykKICAgICAgICAgewogICAgICAgICAgICAgYnVmZmVyID0gcGRhdGE7CkBAIC01MTgsMTAgKzQ5MCwxMCBAQAogLy8KIC8vICBSZXR1cm5zOiAgICBOb25lCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1zdGF0aWMgdm9pZCBjYXJkX3Jlc2V0X2RzcCAoc3RydWN0IGZ0MTAwMF9kZXZpY2UgKmZ0MTAwMGRldiwgQk9PTEVBTiB2YWx1ZSkKK3N0YXRpYyB2b2lkIGNhcmRfcmVzZXRfZHNwIChzdHJ1Y3QgZnQxMDAwX2RldmljZSAqZnQxMDAwZGV2LCBib29sIHZhbHVlKQogewogICAgIHUxNiBzdGF0dXMgPSBTVEFUVVNfU1VDQ0VTUzsKLSAgICBVU0hPUlQgdGVtcHdvcmQ7CisgICAgdTE2IHRlbXB3b3JkOwogCiAgICAgc3RhdHVzID0gZnQxMDAwX3dyaXRlX3JlZ2lzdGVyIChmdDEwMDBkZXYsIEhPU1RfSU5URl9CRSwgRlQxMDAwX1JFR19TVVBfQ1RSTCk7CiAgICAgc3RhdHVzID0gZnQxMDAwX3JlYWRfcmVnaXN0ZXIoZnQxMDAwZGV2LCAmdGVtcHdvcmQsIEZUMTAwMF9SRUdfU1VQX0NUUkwpOwpAQCAtNjIwLDggKzU5Miw4IEBACiBpbnQgZHNwX3JlbG9hZChzdHJ1Y3QgZnQxMDAwX2RldmljZSAqZnQxMDAwZGV2KQogewogICAgIHUxNiBzdGF0dXM7Ci0gICAgVVNIT1JUIHRlbXB3b3JkOwotICAgIFVMT05HIHRlbXBsb25nOworICAgIHUxNiB0ZW1wd29yZDsKKyAgICB1MzIgdGVtcGxvbmc7CiAKIAlzdHJ1Y3QgZnQxMDAwX2luZm8gKnBmdDEwMDBpbmZvOwogCkBAIC02NDgsNyArNjIwLDcgQEAKICAgICBzdGF0dXMgPSBmdDEwMDBfd3JpdGVfcmVnaXN0ZXIgKGZ0MTAwMGRldiwgSE9TVF9JTlRGX0JFLCBGVDEwMDBfUkVHX1NVUF9DVFJMKTsKIAogICAgIC8vIExldCdzIGNoZWNrIGZvciBGRUZFCi0gICAgc3RhdHVzID0gZnQxMDAwX3JlYWRfZHByYW0zMiAoZnQxMDAwZGV2LCBGVDEwMDBfTUFHX0RQUkFNX0ZFRkVfSU5EWCwgKFBVQ0hBUikmdGVtcGxvbmcsIDQpOworICAgIHN0YXR1cyA9IGZ0MTAwMF9yZWFkX2RwcmFtMzIgKGZ0MTAwMGRldiwgRlQxMDAwX01BR19EUFJBTV9GRUZFX0lORFgsICh1OCAqKSZ0ZW1wbG9uZywgNCk7CiAgICAgREVCVUcoInRlbXBsb25nIChmZWZlKSA9IDB4JTh4XG4iLCB0ZW1wbG9uZyk7CiAKICAgICAvLyBjYWxsIGNvZGVsb2FkZXIKQEAgLTc1Myw3ICs3MjUsNyBAQAogCiAgICAgLy8gSW5pdGlhbGl6ZSBEU1AgaGVhcnRiZWF0IGFyZWEgdG8gaG8KICAgICBmdDEwMDBfd3JpdGVfZHByYW0xNihmdDEwMDBkZXYsIEZUMTAwMF9NQUdfSElfSE8sIGhvX21hZywgRlQxMDAwX01BR19ISV9IT19JTkRYKTsKLSAgICBmdDEwMDBfcmVhZF9kcHJhbTE2KGZ0MTAwMGRldiwgRlQxMDAwX01BR19ISV9ITywgKFBDSEFSKSZ0ZW1wd29yZCwgRlQxMDAwX01BR19ISV9IT19JTkRYKTsKKyAgICBmdDEwMDBfcmVhZF9kcHJhbTE2KGZ0MTAwMGRldiwgRlQxMDAwX01BR19ISV9ITywgKHU4ICopJnRlbXB3b3JkLCBGVDEwMDBfTUFHX0hJX0hPX0lORFgpOwogICAgIERFQlVHKCJmdDEwMDBfaHc6ZnQxMDAwX3Jlc2V0X2NhcmQ6aGlfaG8gdmFsdWUgPSAweCV4XG4iLCB0ZW1wd29yZCk7CiAKIApAQCAtODAwLDggKzc3Miw3IEBACiAJaW50IGksIHJldF92YWw7CiAJc3RydWN0IGxpc3RfaGVhZCAqY3VyLCAqdG1wOwogCWNoYXIgY2FyZF9uclsyXTsKLQotCWdDYXJkSW5kZXg9MDsgLy9tYmVsaWFuCisJdW5zaWduZWQgbG9uZyBnQ2FyZEluZGV4ID0gMDsKIAogICAgIERFQlVHKCJFbnRlciBpbml0X2Z0MTAwMF9uZXRkZXYuLi5cbiIpOwogCkBAIC04MTMsNyArNzg0LDcgQEAKIAlyZXR1cm4gLUVOT01FTTsKICAgICB9CiAKLQlwSW5mbyA9IChzdHJ1Y3QgZnQxMDAwX2luZm8gKikgbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlwSW5mbyA9IG5ldGRldl9wcml2KG5ldGRldik7CiAKICAgICAvL0RFQlVHKCJpbml0X2Z0MTAwMF9uZXRkZXY6IGdGdDEwMDBJbmZvPSV4LCBuZXRkZXY9JXgsIGZ0MTAwMGRldj0leFxuIiwgZ0Z0MTAwMEluZm8sIG5ldGRldiwgZnQxMDAwZGV2KTsKIApAQCAtODIxLDkgKzc5Miw2IEBACiAKICAgICBkZXZfYWxsb2NfbmFtZShuZXRkZXYsIG5ldGRldi0+bmFtZSk7CiAKLSAgICAvL2ZvciB0aGUgZmlyc3QgaW5zZXJ0ZWQgY2FyZCwgZGVjaWRlIHRoZSBjYXJkIGluZGV4IGJlZ2lubmluZyBudW1iZXIsIGluIGNhc2UgdGhlcmUgYXJlIGV4aXN0aW5nIG5ldHdvcmsgaW50ZXJmYWNlcwotICAgIGlmICggZ0NhcmRJbmRleCA9PSAwICkKLSAgICB7CiAgICAgICAgIERFQlVHKCJpbml0X2Z0MTAwMF9uZXRkZXY6IG5ldHdvcmsgZGV2aWNlIG5hbWUgaXMgJXNcbiIsIG5ldGRldi0+bmFtZSk7CiAKIAlpZiAoIHN0cm5jbXAobmV0ZGV2LT5uYW1lLCJldGgiLCAzKSA9PSAwKSB7CkBAIC04NDMsMTMgKzgxMSw2IEBACiAJCXJldF92YWwgPSAtRU5YSU87CiAJCWdvdG8gZXJyX25ldDsKICAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvL25vdCB0aGUgZmlyc3QgaW5zZXJ0ZWQgY2FyZCwgaW5jcmVhc2UgY2FyZCBudW1iZXIgYnkgMQotICAgICAgICBwSW5mby0+Q2FyZE51bWJlciA9IGdDYXJkSW5kZXg7Ci0gICAgICAgIC8qREVCVUcoImNhcmQgbnVtYmVyID0gJWRcbiIsIHBJbmZvLT5DYXJkTnVtYmVyKTsqLyAvL21iZWxpYW4KLSAgICB9CiAKICAgICBtZW1zZXQoJnBJbmZvLT5zdGF0cywgMCwgc2l6ZW9mKHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzKSApOwogCkBAIC04NjIsNyArODIzLDYgQEAKICAgICBwSW5mby0+bWVkaWFzdGF0ZSA9IDA7CiAgICAgcEluZm8tPmZpZm9fY250ID0gMDsKICAgICBwSW5mby0+RGV2aWNlQ3JlYXRlZCA9IEZBTFNFOwotICAgIHBJbmZvLT5EZXZpY2VNYWpvciA9IDA7CiAgICAgcEluZm8tPkN1cnJlbnRJbnRlcnJ1cHRFbmFibGVNYXNrID0gSVNSX0RFRkFVTFRfTUFTSzsKICAgICBwSW5mby0+SW50ZXJydXB0c0VuYWJsZWQgPSBGQUxTRTsKICAgICBwSW5mby0+Q2FyZFJlYWR5ID0gMDsKQEAgLTg3NCwxMyArODM0LDExIEBACiAgICAgcEluZm8tPmZDb25kUmVzZXRQZW5kID0gMDsKIAlwSW5mby0+dXNiYm9vdCA9IDA7CiAJcEluZm8tPmRzcGFsaXZlID0gMDsKLQlmb3IgKGk9MDtpPDMyIDtpKysgKQotCXsKLQkJcEluZm8tPnRlbXBidWZbaV0gPSAwOwotCX0KKwltZW1zZXQoJnBJbmZvLT50ZW1wYnVmWzBdLCAwLCBzaXplb2YocEluZm8tPnRlbXBidWYpKTsKIAogICAgIElOSVRfTElTVF9IRUFEKCZwSW5mby0+cHJvdl9saXN0KTsKIAorCUlOSVRfTElTVF9IRUFEKCZwSW5mby0+bm9kZXMubGlzdCk7CiAvL21iZWxpYW4KICNpZmRlZiBIQVZFX05FVF9ERVZJQ0VfT1BTCiAJbmV0ZGV2LT5uZXRkZXZfb3BzID0gJmZ0bmV0X29wczsKQEAgLTk4Miw3ICs5NDAsNyBAQAogCiAKICAgICAvL0NyZWF0ZSBjaGFyYWN0ZXIgZGV2aWNlLCBpbXBsZW1lbnRlZCBieSBKaW0KLSAgICBmdDEwMDBfQ3JlYXRlRGV2aWNlKGZ0MTAwMGRldik7CisgICAgZnQxMDAwX2NyZWF0ZV9kZXYoZnQxMDAwZGV2KTsKIAogICAgIERFQlVHICgicmVnX2Z0MTAwMF9uZXRkZXYgcmV0dXJuZWRcbiIpOwogCkBAIC0xMDI2LDE3OCArOTg0LDYgQEAKICAgICAvL0RFQlVHKCJSZXR1cm4gZnJvbSBmdDEwMDBfdXNiX3RyYW5zbWl0X2NvbXBsZXRlXG4iKTsKIH0KIAotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgIGZ0MTAwMF9jb250cm9sCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpbnQgZnQxMDAwX3JlYWRfZmlmb19yZWcoc3RydWN0IGZ0MTAwMF9kZXZpY2UgKmZ0MTAwMGRldix1bnNpZ25lZCBpbnQgcGlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdTggcmVxdWVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdTggcmVxdWVzdHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHUxNiB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdTE2IGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICB1MTYgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRpbWVvdXQpCi17Ci0gICAgdTE2IHJldDsKLQotICAgIERFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOwotICAgIHN0cnVjdCB1cmIgKnVyYjsKLSAgICBzdHJ1Y3QgdXNiX2N0cmxyZXF1ZXN0ICpkcjsKLSAgICBpbnQgc3RhdHVzOwotCi0gICAgaWYgKGZ0MTAwMGRldiA9PSBOVUxMICkKLSAgICB7Ci0gICAgICAgIERFQlVHKCJOVUxMIGZ0MTAwMGRldiwgZmFpbHVyZVxuIik7Ci0gICAgICAgIHJldHVybiBTVEFUVVNfRkFJTFVSRTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoIGZ0MTAwMGRldi0+ZGV2ID09IE5VTEwgKQotICAgIHsKLSAgICAgICAgREVCVUcoIk5VTEwgZnQxMDAwZGV2LT5kZXYsIGZhaWx1cmVcbiIpOwotICAgICAgICByZXR1cm4gU1RBVFVTX0ZBSUxVUkU7Ci0gICAgfQotCi0gICAgc3Bpbl9sb2NrKCZmdDEwMDBkZXYtPmRldmljZV9sb2NrKTsKLQotICAgIGlmKGluX2ludGVycnVwdCgpKQotICAgIHsKLSAgICAgICAgc3Bpbl91bmxvY2soJmZ0MTAwMGRldi0+ZGV2aWNlX2xvY2spOwotICAgICAgICByZXR1cm4gLUVCVVNZOwotICAgIH0KLQotICAgIHVyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7Ci0gICAgZHIgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgdXNiX2N0cmxyZXF1ZXN0KSwgaW5faW50ZXJydXB0KCkgPyBHRlBfQVRPTUlDIDogR0ZQX0tFUk5FTCk7Ci0KLSAgICBpZighdXJiIHx8ICFkcikKLSAgICB7Ci0Ja2ZyZWUoZHIpOwotCXVzYl9mcmVlX3VyYih1cmIpOwotICAgICAgICBzcGluX3VubG9jaygmZnQxMDAwZGV2LT5kZXZpY2VfbG9jayk7Ci0gICAgICAgIHJldHVybiAtRU5PTUVNOwotICAgIH0KLQotCi0KLSAgICBkci0+YlJlcXVlc3RUeXBlID0gcmVxdWVzdHR5cGU7Ci0gICAgZHItPmJSZXF1ZXN0ID0gcmVxdWVzdDsKLSAgICBkci0+d1ZhbHVlID0gdmFsdWU7Ci0gICAgZHItPndJbmRleCA9IGluZGV4OwotICAgIGRyLT53TGVuZ3RoID0gc2l6ZTsKLQotICAgIHVzYl9maWxsX2NvbnRyb2xfdXJiKHVyYiwgZnQxMDAwZGV2LT5kZXYsIHBpcGUsIChjaGFyKilkciwgKHZvaWQqKWRhdGEsIHNpemUsICh2b2lkICopZnQxMDAwX2NvbnRyb2xfY29tcGxldGUsICh2b2lkKilmdDEwMDBkZXYpOwotCi0KLSAgICBpbml0X3dhaXRxdWV1ZV9oZWFkKCZmdDEwMDBkZXYtPmNvbnRyb2xfd2FpdCk7Ci0KLQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwotCi0gICAgYWRkX3dhaXRfcXVldWUoJmZ0MTAwMGRldi0+Y29udHJvbF93YWl0LCAmd2FpdCk7Ci0KLQotCi0KLSAgICBzdGF0dXMgPSB1c2Jfc3VibWl0X3VyYih1cmIsIEdGUF9LRVJORUwpOwotCi0gICAgaWYoc3RhdHVzKQotICAgIHsKLSAgICAgICAgdXNiX2ZyZWVfdXJiKHVyYik7Ci0gICAgICAgIGtmcmVlKGRyKTsKLSAgICAgICAgcmVtb3ZlX3dhaXRfcXVldWUoJmZ0MTAwMGRldi0+Y29udHJvbF93YWl0LCAmd2FpdCk7Ci0gICAgICAgIHNwaW5fdW5sb2NrKCZmdDEwMDBkZXYtPmRldmljZV9sb2NrKTsKLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0KLSAgICBpZih1cmItPnN0YXR1cyA9PSAtRUlOUFJPR1JFU1MpCi0gICAgewotICAgICAgICB3aGlsZSh0aW1lb3V0ICYmIHVyYi0+c3RhdHVzID09IC1FSU5QUk9HUkVTUykKLSAgICAgICAgewotICAgICAgICAgICAgc3RhdHVzID0gdGltZW91dCA9IHNjaGVkdWxlX3RpbWVvdXQodGltZW91dCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgc3RhdHVzID0gMTsKLSAgICB9Ci0KLSAgICByZW1vdmVfd2FpdF9xdWV1ZSgmZnQxMDAwZGV2LT5jb250cm9sX3dhaXQsICZ3YWl0KTsKLQotICAgIGlmKCFzdGF0dXMpCi0gICAgewotICAgICAgICB1c2JfdW5saW5rX3VyYih1cmIpOwotICAgICAgICBwcmludGsoImZ0MTAwMCB0aW1lb3V0XG4iKTsKLSAgICAgICAgc3RhdHVzID0gLUVUSU1FRE9VVDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgc3RhdHVzID0gdXJiLT5zdGF0dXM7Ci0KLSAgICAgICAgaWYodXJiLT5zdGF0dXMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHByaW50aygiZnQxMDAwIGNvbnRyb2wgbWVzc2FnZSBmYWlsZWQgKHVyYiBhZGRyOiAlcCkgd2l0aCBlcnJvciBudW1iZXI6ICVpXG4iLCB1cmIsIChpbnQpc3RhdHVzKTsKLQotICAgICAgICAgICAgdXNiX2NsZWFyX2hhbHQoZnQxMDAwZGV2LT5kZXYsIHVzYl9yY3ZjdHJscGlwZShmdDEwMDBkZXYtPmRldiwgMCkpOwotICAgICAgICAgICAgdXNiX2NsZWFyX2hhbHQoZnQxMDAwZGV2LT5kZXYsIHVzYl9zbmRjdHJscGlwZShmdDEwMDBkZXYtPmRldiwgMCkpOwotICAgICAgICAgICAgdXNiX3VubGlua191cmIodXJiKTsKLSAgICAgICAgfQotICAgIH0KLQotCi0KLSAgICB1c2JfZnJlZV91cmIodXJiKTsKLSAgICBrZnJlZShkcik7Ci0gICAgc3Bpbl91bmxvY2soJmZ0MTAwMGRldi0+ZGV2aWNlX2xvY2spOwotICAgIHJldHVybiByZXQ7Ci0KLQotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gRnVuY3Rpb246ICAgIGZ0MTAwMF9yZWFkX2ZpZm9fbGVuCi0vLwotLy8gUGFyYW1ldGVyczogIGZ0MTAwMGRldiAtIGRldmljZSBzdHJ1Y3R1cmUKLS8vCi0vLwotLy8gUmV0dXJuczogICAgIG5vbmUKLS8vCi0vLyBEZXNjcmlwdGlvbjogcmVhZCB0aGUgZmlmbyBsZW5ndGggcmVnaXN0ZXIgY29udGVudAotLy8KLS8vIE5vdGVzOgotLy8KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1zdGF0aWMgaW5saW5lIHUxNiBmdDEwMDBfcmVhZF9maWZvX2xlbiAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKLXsKLSAgICB1MTYgdGVtcDsKLSAgICB1MTYgcmV0OwotCi0Jc3RydWN0IGZ0MTAwMF9pbmZvICppbmZvID0gKHN0cnVjdCBmdDEwMDBfaW5mbyAqKSBuZXRkZXZfcHJpdihkZXYpOwotICAgIHN0cnVjdCBmdDEwMDBfZGV2aWNlICpmdDEwMDBkZXYgPSBpbmZvLT5wRnQxMDAwRGV2OwotLy8gICAgREVCVUcoImZ0MTAwMF9yZWFkX2ZpZm9fbGVuOiBlbnRlciBmdDEwMDBkZXYgJXhcbiIsIGZ0MTAwMGRldik7CQkJLy9hZWxpYXMgWy1dIHJlYXNvbjogd2FybmluZzogZm9ybWF0ID8/PyV4Pz8/IGV4cGVjdHMgdHlwZSA/Pz91bnNpZ25lZCBpbnQ/Pz8sIGJ1dCBhcmd1bWVudCAyIGhhcyB0eXBlID8/P3N0cnVjdCBmdDEwMDBfZGV2aWNlICo/Pz8KLSAgICBERUJVRygiZnQxMDAwX3JlYWRfZmlmb19sZW46IGVudGVyIGZ0MTAwMGRldiAlcFxuIiwgZnQxMDAwZGV2KTsJLy9hZWxpYXMgWytdIHJlYXNvbjogdXAKLQotICAgIHJldCA9IFNUQVRVU19TVUNDRVNTOwotCi0gICAgcmV0ID0gZnQxMDAwX3JlYWRfZmlmb19yZWcoZnQxMDAwZGV2LAotICAgICAgICAgICAgICAgICAgICAgICAgICB1c2JfcmN2Y3RybHBpcGUoZnQxMDAwZGV2LT5kZXYsMCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEhBUkxFWV9SRUFEX1JFR0lTVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICBIQVJMRVlfUkVBRF9PUEVSQVRJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUMTAwMF9SRUdfTUFHX1VGU1IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICZ0ZW1wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICBMQVJHRV9USU1FT1VUKTsKLQotICAgIGlmIChyZXQ+MCkKLSAgICAgICAgcmV0ID0gU1RBVFVTX1NVQ0NFU1M7Ci0gICAgZWxzZQotICAgICAgICByZXQgPSBTVEFUVVNfRkFJTFVSRTsKLQotICAgIERFQlVHKCJmdDEwMDBfcmVhZF9maWZvX2xlbjogcmV0dXJuZWQgJWRcbiIsIHRlbXApOwotCi0gICAgcmV0dXJuICh0ZW1wLSAxNik7Ci0KLX0KLQotCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8KIC8vIEZ1bmN0aW9uOiAgIGZ0MTAwMF9jb3B5X2Rvd25fcGt0CkBAIC0xMjE5LDE2ICsxMDA1LDE1IEBACiAgICAgc3RydWN0IGZ0MTAwMF9kZXZpY2UgKnBGdDEwMDBEZXYgPSBwSW5mby0+cEZ0MTAwMERldjsKIAogCi0gICAgaW50IGksIGNvdW50LCByZXQ7Ci0gICAgVVNIT1JUICpwVGVtcDsKLSAgICBVU0hPUlQgY2hlY2tzdW07CisJaW50IGNvdW50LCByZXQ7CiAgICAgdTggKnQ7CisJc3RydWN0IHBzZXVkb19oZHIgaGRyOwogCiAgICAgaWYgKCFwSW5mby0+Q2FyZFJlYWR5KQogICAgIHsKIAogICAgICAgICBERUJVRygiZnQxMDAwX2NvcHlfZG93bl9wa3Q6OkNhcmQgTm90IFJlYWR5XG4iKTsKLSAgICAJcmV0dXJuIFNUQVRVU19GQUlMVVJFOworCXJldHVybiAtRU5PREVWOwogCiAgICAgfQogCkBAIC0xMjQwLDI3ICsxMDI1LDI3IEBACiAgICAgewogICAgICAgICBERUJVRygiRXJyb3I6ZnQxMDAwX2NvcHlfZG93bl9wa3Q6TWVzc2FnZSBTaXplIE92ZXJmbG93IVxuIik7CiAgICAgCURFQlVHKCJzaXplID0gJWRcbiIsIGNvdW50KTsKLSAgICAJcmV0dXJuIFNUQVRVU19GQUlMVVJFOworCXJldHVybiAtRUlOVkFMOwogICAgIH0KIAogICAgIGlmICggY291bnQgJSA0KQogICAgICAgICBjb3VudCA9IGNvdW50ICsgKDQtIChjb3VudCAlNCkgKTsKIAotICAgIHBUZW1wID0gKFBVU0hPUlQpJihwRnQxMDAwRGV2LT50eF9idWZbMF0pOwotICAgICpwVGVtcCArKyA9IG50b2hzKGNvdW50KTsKLSAgICAqcFRlbXAgKysgPSAweDEwMjA7Ci0gICAgKnBUZW1wICsrID0gMHgyMDEwOwotICAgICpwVGVtcCArKyA9IDB4OTEwMDsKLSAgICAqcFRlbXAgKysgPSAwOwotICAgICpwVGVtcCArKyA9IDA7Ci0gICAgKnBUZW1wICsrID0gMDsKLSAgICBwVGVtcCA9IChQVVNIT1JUKSYocEZ0MTAwMERldi0+dHhfYnVmWzBdKTsKLSAgICBjaGVja3N1bSA9ICpwVGVtcCArKzsKLSAgICBmb3IgKGk9MTsgaTw3OyBpKyspCi0gICAgewotICAgICAgICBjaGVja3N1bSBePSAqcFRlbXAgKys7Ci0gICAgfQotICAgICpwVGVtcCsrID0gY2hlY2tzdW07CisJbWVtc2V0KCZoZHIsIDAsIHNpemVvZihzdHJ1Y3QgcHNldWRvX2hkcikpOworCisJaGRyLmxlbmd0aCA9IG50b2hzKGNvdW50KTsKKwloZHIuc291cmNlID0gMHgxMDsKKwloZHIuZGVzdGluYXRpb24gPSAweDIwOworCWhkci5wb3J0ZGVzdCA9IDB4MjA7CisJaGRyLnBvcnRzcmMgPSAweDEwOworCWhkci5zaF9zdHJfaWQgPSAweDkxOworCWhkci5jb250cm9sID0gMHgwMDsKKworCWhkci5jaGVja3N1bSA9IGhkci5sZW5ndGggXiBoZHIuc291cmNlIF4gaGRyLmRlc3RpbmF0aW9uIF4KKwkJCWhkci5wb3J0ZGVzdCBeIGhkci5wb3J0c3JjIF4gaGRyLnNoX3N0cl9pZCBeCisJCQloZHIuY29udHJvbDsKKworCW1lbWNweSgmcEZ0MTAwMERldi0+dHhfYnVmWzBdLCAmaGRyLCBzaXplb2YoaGRyKSk7CiAJbWVtY3B5KCYocEZ0MTAwMERldi0+dHhfYnVmW3NpemVvZihzdHJ1Y3QgcHNldWRvX2hkcildKSwgcGFja2V0LCBsZW4pOwogCiAgICAgbmV0aWZfc3RvcF9xdWV1ZShuZXRkZXYpOwpAQCAtMTI4MywyNSArMTA2OCwxOCBAQAogICAgIH0qLwogCiAKLSAgICByZXQgPSB1c2Jfc3VibWl0X3VyYihwRnQxMDAwRGV2LT50eF91cmIsIEdGUF9BVE9NSUMpOwotICAgIGlmKHJldCkKLSAgICB7CisJcmV0ID0gdXNiX3N1Ym1pdF91cmIocEZ0MTAwMERldi0+dHhfdXJiLCBHRlBfQVRPTUlDKTsKKwlpZiAocmV0KSB7CiAJCURFQlVHKCJmdDEwMDAgZmFpbGVkIHR4X3VyYiAlZFxuIiwgcmV0KTsKLQotCQlyZXR1cm4gU1RBVFVTX0ZBSUxVUkU7Ci0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLy9ERUJVRygiZnQxMDAwIHN1Y2VzcyB0eF91cmIgJWRcbiIsIHJldCk7Ci0KLSAgICAgICAgcEluZm8tPnN0YXRzLnR4X3BhY2tldHMrKzsKLSAgICAgICAgcEluZm8tPnN0YXRzLnR4X2J5dGVzICs9IChsZW4rMTQpOwotICAgIH0KKwkJcmV0dXJuIHJldDsKKwl9IGVsc2UgeworCQlwSW5mby0+c3RhdHMudHhfcGFja2V0cysrOworCQlwSW5mby0+c3RhdHMudHhfYnl0ZXMgKz0gKGxlbisxNCk7CisJfQogCiAgICAgLy9ERUJVRygiZnQxMDAwX2NvcHlfZG93bl9wa3QoKSBleGl0XG4iKTsKIAotICAgIHJldHVybiBTVEFUVVNfU1VDQ0VTUzsKKwlyZXR1cm4gMDsKIH0KIAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTEzMzEsMTQgKzExMDksMTMgQEAKICAgICBpZiAoIHNrYiA9PSBOVUxMICkKICAgICB7CiAgICAgICAgIERFQlVHICgiZnQxMDAwX2h3OiBmdDEwMDBfc3RhcnRfeG1pdDpza2IgPT0gTlVMTCEhIVxuIiApOwotICAgICAgICByZXR1cm4gU1RBVFVTX0ZBSUxVUkU7CisJcmV0dXJuIE5FVERFVl9UWF9PSzsKICAgICB9CiAKICAgICBpZiAoIHBGdDEwMDBEZXYtPnN0YXR1cyAmIEZUMTAwMF9TVEFUVVNfQ0xPU0lORykKICAgICB7CiAgICAgICAgIERFQlVHKCJuZXR3b3JrIGRyaXZlciBpcyBjbG9zZWQsIHJldHVyblxuIik7Ci0gICAgICAgIGRldl9rZnJlZV9za2Ioc2tiKTsKLSAgICAgICAgcmV0dXJuIFNUQVRVU19TVUNDRVNTOworCWdvdG8gZXJyOwogICAgIH0KIAogICAgIC8vREVCVUcoImZ0MTAwMF9zdGFydF94bWl0IDE6bGVuZ3RoIG9mIHBhY2tldCA9ICVkXG4iLCBza2ItPmxlbik7CkBAIC0xMzU3LDI4ICsxMTM0LDI0IEBACiAgICAgewogICAgICAgICAvKiBEcm9wIHBhY2tldCBpcyBtZWRpYXN0YXRlIGlzIGRvd24gKi8KICAgICAgICAgREVCVUcoImZ0MTAwMF9odzpmdDEwMDBfc3RhcnRfeG1pdDptZWRpYXN0YXRlIGlzIGRvd25cbiIpOwotICAgICAgICBkZXZfa2ZyZWVfc2tiKHNrYik7Ci0gICAgICAgIHJldHVybiBTVEFUVVNfU1VDQ0VTUzsKKwlnb3RvIGVycjsKICAgICB9CiAKICAgICBpZiAoIChza2ItPmxlbiA8IEVORVRfSEVBREVSX1NJWkUpIHx8IChza2ItPmxlbiA+IEVORVRfTUFYX1NJWkUpICkKICAgICB7CiAgICAgICAgIC8qIERyb3AgcGFja2V0IHdoaWNoIGhhcyBpbnZhbGlkIHNpemUgKi8KICAgICAgICAgREVCVUcoImZ0MTAwMF9odzpmdDEwMDBfc3RhcnRfeG1pdDppbnZhbGlkIGV0aGVybmV0IGxlbmd0aFxuIik7Ci0gICAgICAgIGRldl9rZnJlZV9za2Ioc2tiKTsKLSAgICAgICAgcmV0dXJuIFNUQVRVU19TVUNDRVNTOworCWdvdG8gZXJyOwogICAgIH0KIC8vbWJlbGlhbgotICAgIGlmKGZ0MTAwMF9jb3B5X2Rvd25fcGt0IChkZXYsIChwZGF0YStFTkVUX0hFQURFUl9TSVpFLTIpLCBza2ItPmxlbiAtIEVORVRfSEVBREVSX1NJWkUgKyAyKSA9PSBTVEFUVVNfRkFJTFVSRSkKLQl7Ci0gICAgCWRldl9rZnJlZV9za2Ioc2tiKTsKLQkJcmV0dXJuIFNUQVRVU19TVUNDRVNTOwotCX0KKwlmdDEwMDBfY29weV9kb3duX3BrdChkZXYsIChwZGF0YStFTkVUX0hFQURFUl9TSVpFLTIpLAorCQkJCXNrYi0+bGVuIC0gRU5FVF9IRUFERVJfU0laRSArIDIpOwogCi0gICAgZGV2X2tmcmVlX3NrYihza2IpOworZXJyOgorCWRldl9rZnJlZV9za2Ioc2tiKTsKICAgICAvL0RFQlVHKCIgZnQxMDAwX3N0YXJ0X3htaXQoKSBleGl0XG4iKTsKIAotICAgIHJldHVybiAwOworCXJldHVybiBORVRERVZfVFhfT0s7CiB9CiAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0xNDI0LDcgKzExOTcsNyBAQAogICAgIC8vREVCVUcoImZ0MTAwMF9jb3B5X3VwX3BrdDogdHJhbnNmZXJfYnVmZmVyX2xlbmd0aD0lZCwgYWN0dWFsX2J1ZmZlcl9sZW49JWRcbiIsCiAgICAgICAvLyAgICAgICB1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGgsIHVyYi0+YWN0dWFsX2xlbmd0aCk7CiAKLSAgICBjaGtzdW0gPSAoUFVTSE9SVClmdDEwMDBkZXYtPnJ4X2J1ZjsKKyAgICBjaGtzdW0gPSAodTE2ICopZnQxMDAwZGV2LT5yeF9idWY7CiAKICAgICB0ZW1wd29yZCA9ICpjaGtzdW0rKzsKICAgICBmb3IgKGk9MTsgaTw3OyBpKyspCkBAIC0xNTIxLDcgKzEyOTQsNyBAQAogICAgIHsKICAgICAgICAgREVCVUcoIm5ldHdvcmsgZHJpdmVyIGlzIGNsb3NlZCwgcmV0dXJuXG4iKTsKICAgICAgICAgLy91c2Jfa2lsbF91cmIocEZ0MTAwMERldi0+cnhfdXJiKTsgLy9tYmVsaWFuCi0gICAgICAgIHJldHVybiBTVEFUVVNfU1VDQ0VTUzsKKwlyZXR1cm4gLUVOT0RFVjsKICAgICB9CiAKICAgICB1c2JfZmlsbF9idWxrX3VyYihwRnQxMDAwRGV2LT5yeF91cmIsCkBAIC0xNTM2LDEyICsxMzA5LDEyIEBACiAgICAgaWYoKHJlc3VsdCA9IHVzYl9zdWJtaXRfdXJiKHBGdDEwMDBEZXYtPnJ4X3VyYiwgR0ZQX0FUT01JQykpKQogICAgIHsKICAgICAgICAgcHJpbnRrKCJmdDEwMDBfc3VibWl0X3J4X3VyYjogc3VibWl0dGluZyByeF91cmIgJWQgZmFpbGVkXG4iLCByZXN1bHQpOwotICAgICAgICByZXR1cm4gU1RBVFVTX0ZBSUxVUkU7CisJcmV0dXJuIHJlc3VsdDsKICAgICB9CiAKICAgICAvL0RFQlVHKCJmdDEwMDBfc3VibWl0X3J4X3VyYiBleGl0OiByZXN1bHQ9JWRcbiIsIHJlc3VsdCk7CiAKLSAgICByZXR1cm4gU1RBVFVTX1NVQ0NFU1M7CisJcmV0dXJuIDA7CiB9CiAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0xNTYwLDggKzEzMzMsOSBAQAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIHN0YXRpYyBpbnQgZnQxMDAwX29wZW4gKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7Ci0Jc3RydWN0IGZ0MTAwMF9pbmZvICpwSW5mbyA9IChzdHJ1Y3QgZnQxMDAwX2luZm8gKiluZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBmdDEwMDBfaW5mbyAqcEluZm8gPSBuZXRkZXZfcHJpdihkZXYpOwogICAgIHN0cnVjdCB0aW1ldmFsIHR2OyAvL21iZWxpYW4KKwlpbnQgcmV0OwogCiAgICAgREVCVUcoImZ0MTAwMF9vcGVuIGlzIGNhbGxlZCBmb3IgY2FyZCAlZFxuIiwgcEluZm8tPkNhcmROdW1iZXIpOwogICAgIC8vREVCVUcoImZ0MTAwMF9vcGVuOiBkZXYtPmFkZHI9JXgsIGRldi0+YWRkcl9sZW49JWRcbiIsIGRldi0+YWRkciwgZGV2LT5hZGRyX2xlbik7CkBAIC0xNTc5LDggKzEzNTMsOSBAQAogCiAgICAgbmV0aWZfY2Fycmllcl9vbihkZXYpOyAvL21iZWxpYW4KIAotICAgIGZ0MTAwMF9zdWJtaXRfcnhfdXJiKHBJbmZvKTsKLSAgICByZXR1cm4gMDsKKwlyZXQgPSBmdDEwMDBfc3VibWl0X3J4X3VyYihwSW5mbyk7CisKKwlyZXR1cm4gcmV0OwogfQogCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMTU5OSw3ICsxMzc0LDcgQEAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBpbnQgZnQxMDAwX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpuZXQpCiB7Ci0Jc3RydWN0IGZ0MTAwMF9pbmZvICpwSW5mbyA9IChzdHJ1Y3QgZnQxMDAwX2luZm8gKikgbmV0ZGV2X3ByaXYobmV0KTsKKwlzdHJ1Y3QgZnQxMDAwX2luZm8gKnBJbmZvID0gbmV0ZGV2X3ByaXYobmV0KTsKICAgICBzdHJ1Y3QgZnQxMDAwX2RldmljZSAqZnQxMDAwZGV2ID0gcEluZm8tPnBGdDEwMDBEZXY7CiAKICAgICAvL0RFQlVHICgiZnQxMDAwX2Nsb3NlOiBuZXRkZXYtPnJlZmNudD0lZFxuIiwgbmV0LT5yZWZjbnQpOwpAQCAtMTYyMiw3ICsxMzk3LDcgQEAKIAogc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpmdDEwMDBfbmV0ZGV2X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7Ci0Jc3RydWN0IGZ0MTAwMF9pbmZvICppbmZvID0gKHN0cnVjdCBmdDEwMDBfaW5mbyAqKSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBmdDEwMDBfaW5mbyAqaW5mbyA9IG5ldGRldl9wcml2KGRldik7CiAKIAlyZXR1cm4gJihpbmZvLT5zdGF0cyk7IC8vbWJlbGlhbgogfQpAQCAtMTY0OCw3ICsxNDIzLDcgQEAKIHN0YXRpYyBpbnQgZnQxMDAwX2Noa2NhcmQgKHN0cnVjdCBmdDEwMDBfZGV2aWNlICpkZXYpIHsKICAgICB1MTYgdGVtcHdvcmQ7CiAgICAgdTE2IHN0YXR1czsKLQlzdHJ1Y3QgZnQxMDAwX2luZm8gKmluZm8gPSAoc3RydWN0IGZ0MTAwMF9pbmZvICopIG5ldGRldl9wcml2KGRldi0+bmV0KTsKKwlzdHJ1Y3QgZnQxMDAwX2luZm8gKmluZm8gPSBuZXRkZXZfcHJpdihkZXYtPm5ldCk7CiAKICAgICBpZiAoaW5mby0+ZkNvbmRSZXNldFBlbmQpCiAgICAgewpAQCAtMTY5MiwxMyArMTQ2NywxMyBAQAogLy8gICAgICAgICAgPSAxIChzdWNjZXNzZnVsKQogLy8KIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1zdGF0aWMgQk9PTEVBTiBmdDEwMDBfcmVjZWl2ZV9jbWQgKHN0cnVjdCBmdDEwMDBfZGV2aWNlICpkZXYsIHUxNiAqcGJ1ZmZlciwgaW50IG1heHN6LCB1MTYgKnBueHRwaCkgeworc3RhdGljIGJvb2wgZnQxMDAwX3JlY2VpdmVfY21kIChzdHJ1Y3QgZnQxMDAwX2RldmljZSAqZGV2LCB1MTYgKnBidWZmZXIsIGludCBtYXhzeiwgdTE2ICpwbnh0cGgpIHsKICAgICB1MTYgc2l6ZSwgcmV0OwogICAgIHUxNiAqcHBzZXVkb2hkcjsKICAgICBpbnQgaTsKICAgICB1MTYgdGVtcHdvcmQ7CiAKLSAgICByZXQgPSBmdDEwMDBfcmVhZF9kcHJhbTE2KGRldiwgRlQxMDAwX01BR19QSF9MRU4sIChQVUNIQVIpJnNpemUsIEZUMTAwMF9NQUdfUEhfTEVOX0lORFgpOworICAgIHJldCA9IGZ0MTAwMF9yZWFkX2RwcmFtMTYoZGV2LCBGVDEwMDBfTUFHX1BIX0xFTiwgKHU4ICopJnNpemUsIEZUMTAwMF9NQUdfUEhfTEVOX0lORFgpOwogICAgIHNpemUgPSBudG9ocyhzaXplKSArIFBTRVVET1NaOwogICAgIGlmIChzaXplID4gbWF4c3opIHsKICAgICAgICAgREVCVUcoIkZUMTAwMDpmdDEwMDBfcmVjZWl2ZV9jbWQ6SW52YWxpZCBjb21tYW5kIGxlbmd0aCA9ICVkXG4iLCBzaXplKTsKQEAgLTE3NDgsMTUgKzE1MjMsMTUgQEAKIHN0YXRpYyBpbnQgZnQxMDAwX2RzcF9wcm92KHZvaWQgKmFyZykKIHsKICAgICBzdHJ1Y3QgZnQxMDAwX2RldmljZSAqZGV2ID0gKHN0cnVjdCBmdDEwMDBfZGV2aWNlICopYXJnOwotCXN0cnVjdCBmdDEwMDBfaW5mbyAqaW5mbyA9IChzdHJ1Y3QgZnQxMDAwX2luZm8gKikgbmV0ZGV2X3ByaXYoZGV2LT5uZXQpOworCXN0cnVjdCBmdDEwMDBfaW5mbyAqaW5mbyA9IG5ldGRldl9wcml2KGRldi0+bmV0KTsKICAgICB1MTYgdGVtcHdvcmQ7CiAgICAgdTE2IGxlbjsKICAgICB1MTYgaT0wOwogCXN0cnVjdCBwcm92X3JlY29yZCAqcHRyOwogCXN0cnVjdCBwc2V1ZG9faGRyICpwcHNldWRvX2hkcjsKLSAgICBQVVNIT1JUIHBtc2c7CisgICAgdTE2ICpwbXNnOwogICAgIHUxNiBzdGF0dXM7Ci0gICAgVVNIT1JUIFRlbXBTaG9ydEJ1ZiBbMjU2XTsKKyAgICB1MTYgVGVtcFNob3J0QnVmIFsyNTZdOwogCiAgICAgREVCVUcoIioqKiBEc3BQcm92IEVudGVyZWRcbiIpOwogCkBAIC0xNzkyLDcgKzE1NjcsNyBAQAogICAgICAgICAgICAgbGVuID0gaHRvbnMobGVuKTsKICAgICAgICAgICAgIGxlbiArPSBQU0VVRE9TWjsKIAotICAgICAgICAgICAgcG1zZyA9IChQVVNIT1JUKXB0ci0+cHByb3ZfZGF0YTsKKyAgICAgICAgICAgIHBtc2cgPSAodTE2ICopcHRyLT5wcHJvdl9kYXRhOwogCQlwcHNldWRvX2hkciA9IChzdHJ1Y3QgcHNldWRvX2hkciAqKXBtc2c7CiAgICAgICAgICAgICAvLyBJbnNlcnQgc2xvdyBxdWV1ZSBzZXF1ZW5jZSBudW1iZXIKICAgICAgICAgICAgIHBwc2V1ZG9faGRyLT5zZXFfbnVtID0gaW5mby0+c3F1ZXNlcW51bSsrOwpAQCAtMTgwOSw3ICsxNTg0LDcgQEAKICAgICAgICAgICAgIFRlbXBTaG9ydEJ1ZlsxXSA9IGh0b25zIChsZW4pOwogICAgICAgICAgICAgbWVtY3B5KCZUZW1wU2hvcnRCdWZbMl0sIHBwc2V1ZG9faGRyLCBsZW4pOwogCi0gICAgICAgICAgICBzdGF0dXMgPSBmdDEwMDBfd3JpdGVfZHByYW0zMiAoZGV2LCAwLCAoUFVDSEFSKSZUZW1wU2hvcnRCdWZbMF0sICh1bnNpZ25lZCBzaG9ydCkobGVuKzIpKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IGZ0MTAwMF93cml0ZV9kcHJhbTMyIChkZXYsIDAsICh1OCAqKSZUZW1wU2hvcnRCdWZbMF0sICh1bnNpZ25lZCBzaG9ydCkobGVuKzIpKTsKICAgICAgICAgICAgIHN0YXR1cyA9IGZ0MTAwMF93cml0ZV9yZWdpc3RlciAoZGV2LCBGVDEwMDBfREJfRFBSQU1fVFgsIEZUMTAwMF9SRUdfRE9PUkJFTEwpOwogCiAgICAgICAgICAgICBsaXN0X2RlbCgmcHRyLT5saXN0KTsKQEAgLTE4MzEsNyArMTYwNiw3IEBACiAKIAogc3RhdGljIGludCBmdDEwMDBfcHJvY19kcnZtc2cgKHN0cnVjdCBmdDEwMDBfZGV2aWNlICpkZXYsIHUxNiBzaXplKSB7Ci0Jc3RydWN0IGZ0MTAwMF9pbmZvICppbmZvID0gKHN0cnVjdCBmdDEwMDBfaW5mbyAqKSBuZXRkZXZfcHJpdihkZXYtPm5ldCk7CisJc3RydWN0IGZ0MTAwMF9pbmZvICppbmZvID0gbmV0ZGV2X3ByaXYoZGV2LT5uZXQpOwogICAgIHUxNiBtc2d0eXBlOwogICAgIHUxNiB0ZW1wd29yZDsKIAlzdHJ1Y3QgbWVkaWFfbXNnICpwbWVkaWFtc2c7CkBAIC0xODM5LDcgKzE2MTQsNyBAQAogCXN0cnVjdCBkcnZfbXNnICpwZHJ2bXNnOwogICAgIHUxNiBpOwogCXN0cnVjdCBwc2V1ZG9faGRyICpwcHNldWRvX2hkcjsKLSAgICBQVVNIT1JUIHBtc2c7CisgICAgdTE2ICpwbXNnOwogICAgIHUxNiBzdGF0dXM7CiAgICAgdW5pb24gewogICAgICAgICB1OCAgYnl0ZVsyXTsKQEAgLTE5NzEsNyArMTc0Niw3IEBACiAgICAgICAgICAgICAgICAgdGVtcHdvcmQgPSBudG9ocyhwZHJ2bXNnLT5sZW5ndGgpOwogICAgICAgICAgICAgICAgIGluZm8tPkRTUEluZm9CbGtsZW4gPSB0ZW1wd29yZDsKICAgICAgICAgICAgICAgICBpZiAodGVtcHdvcmQgPCAoTUFYX0RTUF9TRVNTX1JFQy00KSApIHsKLSAgICAgICAgICAgICAgICAgICAgcG1zZyA9IChQVVNIT1JUKSZwZHJ2bXNnLT5kYXRhWzBdOworICAgICAgICAgICAgICAgICAgICBwbXNnID0gKHUxNiAqKSZwZHJ2bXNnLT5kYXRhWzBdOwogICAgICAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaTwoKHRlbXB3b3JkKzEpLzIpOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHKCJGVDEwMDA6ZHJpdmVybXNnOmRzcCBpbmZvIGRhdGEgPSAweCV4XG4iLCAqcG1zZyk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5EU1BJbmZvQmxrW2krMTBdID0gKnBtc2crKzsKQEAgLTIwMDMsMTAgKzE3NzgsMTAgQEAKIAogICAgICAgICAgICAgICAgIC8vIFB1dCBtZXNzYWdlIGludG8gU2xvdyBRdWV1ZQogICAgICAgICAgICAgICAgIC8vIEZvcm0gUHNldWRvIGhlYWRlcgotICAgICAgICAgICAgICAgIHBtc2cgPSAoUFVTSE9SVClpbmZvLT5EU1BJbmZvQmxrOworICAgICAgICAgICAgICAgIHBtc2cgPSAodTE2ICopaW5mby0+RFNQSW5mb0JsazsKICAgICAgICAgICAgICAgICAqcG1zZysrID0gMDsKICAgICAgICAgICAgICAgICAqcG1zZysrID0gaHRvbnMoaW5mby0+RFNQSW5mb0Jsa2xlbisyMCtpbmZvLT5EU1BJbmZvQmxrbGVuKTsKLQkJcHBzZXVkb19oZHIgPSAoc3RydWN0IHBzZXVkb19oZHIgKikoUFVTSE9SVCkmaW5mby0+RFNQSW5mb0Jsa1syXTsKKwkJcHBzZXVkb19oZHIgPSAoc3RydWN0IHBzZXVkb19oZHIgKikodTE2ICopJmluZm8tPkRTUEluZm9CbGtbMl07CiAgICAgICAgICAgICAgICAgcHBzZXVkb19oZHItPmxlbmd0aCA9IGh0b25zKGluZm8tPkRTUEluZm9CbGtsZW4rNCtpbmZvLT5EU1BJbmZvQmxrbGVuKTsKICAgICAgICAgICAgICAgICBwcHNldWRvX2hkci0+c291cmNlID0gMHgxMDsKICAgICAgICAgICAgICAgICBwcHNldWRvX2hkci0+ZGVzdGluYXRpb24gPSAweDIwOwpAQCAtMjAyOCw3ICsxODAzLDcgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaW5mby0+RFNQSW5mb0Jsa1sxMF0gPSAweDcyMDA7CiAgICAgICAgICAgICAgICAgaW5mby0+RFNQSW5mb0Jsa1sxMV0gPSBodG9ucyhpbmZvLT5EU1BJbmZvQmxrbGVuKTsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBmdDEwMDBfd3JpdGVfZHByYW0zMiAoZGV2LCAwLCAoUFVDSEFSKSZpbmZvLT5EU1BJbmZvQmxrWzBdLCAodW5zaWduZWQgc2hvcnQpKGluZm8tPkRTUEluZm9CbGtsZW4rMjIpKTsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBmdDEwMDBfd3JpdGVfZHByYW0zMiAoZGV2LCAwLCAodTggKikmaW5mby0+RFNQSW5mb0Jsa1swXSwgKHVuc2lnbmVkIHNob3J0KShpbmZvLT5EU1BJbmZvQmxrbGVuKzIyKSk7CiAgICAgICAgICAgICAgICAgc3RhdHVzID0gZnQxMDAwX3dyaXRlX3JlZ2lzdGVyIChkZXYsIEZUMTAwMF9EQl9EUFJBTV9UWCwgRlQxMDAwX1JFR19ET09SQkVMTCk7CiAgICAgICAgICAgICAgICAgaW5mby0+RHJ2TXNnUGVuZCA9IDA7CiAKQEAgLTIwNTMsNyArMTgyOCw3IEBACiAgICAgICAgICAgICAgIGlmICggKHRlbXB3b3JkICYgRlQxMDAwX0RCX0RQUkFNX1RYKSA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAvLyBQdXQgbWVzc2FnZSBpbnRvIFNsb3cgUXVldWUKICAgICAgICAgICAgICAgICAgIC8vIEZvcm0gUHNldWRvIGhlYWRlcgotICAgICAgICAgICAgICAgICAgcG1zZyA9IChQVVNIT1JUKSZ0ZW1wYnVmZmVyWzBdOworICAgICAgICAgICAgICAgICAgcG1zZyA9ICh1MTYgKikmdGVtcGJ1ZmZlclswXTsKIAkJCXBwc2V1ZG9faGRyID0gKHN0cnVjdCBwc2V1ZG9faGRyICopcG1zZzsKICAgICAgICAgICAgICAgICAgIHBwc2V1ZG9faGRyLT5sZW5ndGggPSBodG9ucygweDAwMTIpOwogICAgICAgICAgICAgICAgICAgcHBzZXVkb19oZHItPnNvdXJjZSA9IDB4MTA7CkBAIC0yMDc0LDcgKzE4NDksNyBAQAogICAgICAgICAgICAgICAgICAgZm9yIChpPTE7IGk8NzsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgcHBzZXVkb19oZHItPmNoZWNrc3VtIF49ICpwbXNnKys7CiAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICBwbXNnID0gKFBVU0hPUlQpJnRlbXBidWZmZXJbMTZdOworICAgICAgICAgICAgICAgICAgcG1zZyA9ICh1MTYgKikmdGVtcGJ1ZmZlclsxNl07CiAgICAgICAgICAgICAgICAgICAqcG1zZysrID0gaHRvbnMoUlNQX0RSVl9FUlJfUlBUX01TRyk7CiAgICAgICAgICAgICAgICAgICAqcG1zZysrID0gaHRvbnMoMHgwMDBlKTsKICAgICAgICAgICAgICAgICAgICpwbXNnKysgPSBodG9ucyhpbmZvLT5EU1BfVElNRVswXSk7CkBAIC0yMDg5LDcgKzE4NjQsNyBAQAogICAgICAgICAgICAgICAgICAgKnBtc2crKyA9IGNvbnZlcnQud3JkOwogICAgICAgICAgICAgICAgICAgKnBtc2crKyA9IGh0b25zKGluZm8tPkRydkVyck51bSk7CiAKLSAgICAgICAgICAgICAgICAgIENhcmRTZW5kQ29tbWFuZCAoZGV2LCAodW5zaWduZWQgY2hhciopJnRlbXBidWZmZXJbMF0sIChVU0hPUlQpKDB4MDAxMiArIFBTRVVET1NaKSk7CisgICAgICAgICAgICAgICAgICBDYXJkU2VuZENvbW1hbmQgKGRldiwgKHVuc2lnbmVkIGNoYXIqKSZ0ZW1wYnVmZmVyWzBdLCAodTE2KSgweDAwMTIgKyBQU0VVRE9TWikpOwogICAgICAgICAgICAgICAgICAgaW5mby0+RHJ2RXJyTnVtID0gMDsKICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICBpbmZvLT5EcnZNc2dQZW5kID0gMDsKQEAgLTIxMTQsMTUgKzE4ODksMTUgQEAKIGludCBmdDEwMDBfcG9sbCh2b2lkKiBkZXZfaWQpIHsKIAogICAgIHN0cnVjdCBmdDEwMDBfZGV2aWNlICpkZXYgPSAoc3RydWN0IGZ0MTAwMF9kZXZpY2UgKilkZXZfaWQ7Ci0Jc3RydWN0IGZ0MTAwMF9pbmZvICppbmZvID0gKHN0cnVjdCBmdDEwMDBfaW5mbyAqKSBuZXRkZXZfcHJpdihkZXYtPm5ldCk7CisJc3RydWN0IGZ0MTAwMF9pbmZvICppbmZvID0gbmV0ZGV2X3ByaXYoZGV2LT5uZXQpOwogCiAgICAgdTE2IHRlbXB3b3JkOwogICAgIHUxNiBzdGF0dXM7CiAgICAgdTE2IHNpemU7CiAgICAgaW50IGk7Ci0gICAgVVNIT1JUIGRhdGE7Ci0gICAgVVNIT1JUIG1vZHVsbzsKLSAgICBVU0hPUlQgcG9ydGlkOworICAgIHUxNiBkYXRhOworICAgIHUxNiBtb2R1bG87CisgICAgdTE2IHBvcnRpZDsKICAgICB1MTYgbnh0cGg7CiAJc3RydWN0IGRwcmFtX2JsayAqcGRwcmFtX2JsazsKIAlzdHJ1Y3QgcHNldWRvX2hkciAqcHBzZXVkb19oZHI7CkBAIC0yMTQzLDE0ICsxOTE4LDE0IEBACiAgICAgICAgIGlmICh0ZW1wd29yZCAmIEZUMTAwMF9EQl9EUFJBTV9SWCkgewogICAgICAgICAgICAgLy9ERUJVRygiZnQxMDAwX3BvbGw6IEZUMTAwMF9SRUdfRE9PUkJFTEwgbWVzc2FnZSB0eXBlOiAgRlQxMDAwX0RCX0RQUkFNX1JYXG4iKTsKIAotICAgICAgICAgICAgc3RhdHVzID0gZnQxMDAwX3JlYWRfZHByYW0xNihkZXYsIDB4MjAwLCAoUFVDSEFSKSZkYXRhLCAwKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IGZ0MTAwMF9yZWFkX2RwcmFtMTYoZGV2LCAweDIwMCwgKHU4ICopJmRhdGEsIDApOwogICAgICAgICAgICAgLy9ERUJVRygiZnQxMDAwX3BvbGw6RlQxMDAwX0RCX0RQUkFNX1JYOmZ0MTAwMF9yZWFkX2RwcmFtMTY6c2l6ZSA9IDB4JXhcbiIsIGRhdGEpOwogICAgICAgICAgICAgc2l6ZSA9IG50b2hzKGRhdGEpICsgMTYgKyAyOyAvL3dhaQogICAgICAgICAgICAgaWYgKHNpemUgJSA0KSB7CiAgICAgICAgICAgICAgICAgbW9kdWxvID0gNCAtIChzaXplICUgNCk7CiAgICAgICAgICAgICAgICAgc2l6ZSA9IHNpemUgKyBtb2R1bG87CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBzdGF0dXMgPSBmdDEwMDBfcmVhZF9kcHJhbTE2KGRldiwgMHgyMDEsIChQVUNIQVIpJnBvcnRpZCwgMSk7CisgICAgICAgICAgICBzdGF0dXMgPSBmdDEwMDBfcmVhZF9kcHJhbTE2KGRldiwgMHgyMDEsICh1OCAqKSZwb3J0aWQsIDEpOwogICAgICAgICAgICAgcG9ydGlkICY9IDB4ZmY7CiAgICAgICAgICAgICAvL0RFQlVHKCJmdDEwMDBfcG9sbDogRlQxMDAwX1JFR19ET09SQkVMTCBtZXNzYWdlIHR5cGU6IEZUMTAwMF9EQl9EUFJBTV9SWCA6IHBvcnRpZCAweCV4XG4iLCBwb3J0aWQpOwogCkBAIC0yMjg1LDcgKzIwNjAsNyBAQAogICAgICAgICAgICAgc3RhdHVzID0gZnQxMDAwX3dyaXRlX3JlZ2lzdGVyIChkZXYsIEZUMTAwMF9BU0lDX1JFU0VUX1JFUSwgRlQxMDAwX1JFR19ET09SQkVMTCk7CiAgICAgICAgICAgICBzdGF0dXMgPSBmdDEwMDBfd3JpdGVfcmVnaXN0ZXIgKGRldiwgSE9TVF9JTlRGX0JFLCBGVDEwMDBfUkVHX1NVUF9DVFJMKTsKICAgICAgICAgICAgIC8vIGNvcHkgZHNwIHNlc3Npb24gcmVjb3JkIGZyb20gQWRhcHRlciBibG9jawotICAgICAgICAgICAgc3RhdHVzID0gZnQxMDAwX3dyaXRlX2RwcmFtMzIgKGRldiwgMCwgKFBVQ0hBUikmaW5mby0+RFNQU2Vzcy5SZWNbMF0sIDEwMjQpOworICAgICAgICAgICAgc3RhdHVzID0gZnQxMDAwX3dyaXRlX2RwcmFtMzIgKGRldiwgMCwgKHU4ICopJmluZm8tPkRTUFNlc3MuUmVjWzBdLCAxMDI0KTsKICAgICAgICAgICAgIC8vIFByb2dyYW0gV01BUksgcmVnaXN0ZXIKICAgICAgICAgICAgIHN0YXR1cyA9IGZ0MTAwMF93cml0ZV9yZWdpc3RlciAoZGV2LCAweDYwMCwgRlQxMDAwX1JFR19NQUdfV0FURVJNQVJLKTsKICAgICAgICAgICAgIC8vIHJpbmcgZG9vcmJlbGwgdG8gdGVsbCBEU1AgdGhhdCBBU0lDIGlzIG91dCBvZiByZXNldApAQCAtMjI5OSwxMCArMjA3NCwxMCBAQAogICAgICAgICAgICAgaWYgKGluZm8tPmZBcHBNc2dQZW5kID09IDApIHsKICAgICAgICAgICAgICAgIC8vIFJlc2V0IEFTSUMgYW5kIERTUAogCi0gICAgICAgICAgICAgICAgc3RhdHVzICAgID0gZnQxMDAwX3JlYWRfZHByYW0xNihkZXYsIEZUMTAwMF9NQUdfRFNQX1RJTUVSMCwgKFBVQ0hBUikmKGluZm8tPkRTUF9USU1FWzBdKSwgRlQxMDAwX01BR19EU1BfVElNRVIwX0lORFgpOwotICAgICAgICAgICAgICAgIHN0YXR1cyAgICA9IGZ0MTAwMF9yZWFkX2RwcmFtMTYoZGV2LCBGVDEwMDBfTUFHX0RTUF9USU1FUjEsIChQVUNIQVIpJihpbmZvLT5EU1BfVElNRVsxXSksIEZUMTAwMF9NQUdfRFNQX1RJTUVSMV9JTkRYKTsKLSAgICAgICAgICAgICAgICBzdGF0dXMgICAgPSBmdDEwMDBfcmVhZF9kcHJhbTE2KGRldiwgRlQxMDAwX01BR19EU1BfVElNRVIyLCAoUFVDSEFSKSYoaW5mby0+RFNQX1RJTUVbMl0pLCBGVDEwMDBfTUFHX0RTUF9USU1FUjJfSU5EWCk7Ci0gICAgICAgICAgICAgICAgc3RhdHVzICAgID0gZnQxMDAwX3JlYWRfZHByYW0xNihkZXYsIEZUMTAwMF9NQUdfRFNQX1RJTUVSMywgKFBVQ0hBUikmKGluZm8tPkRTUF9USU1FWzNdKSwgRlQxMDAwX01BR19EU1BfVElNRVIzX0lORFgpOworICAgICAgICAgICAgICAgIHN0YXR1cyAgICA9IGZ0MTAwMF9yZWFkX2RwcmFtMTYoZGV2LCBGVDEwMDBfTUFHX0RTUF9USU1FUjAsICh1OCAqKSYoaW5mby0+RFNQX1RJTUVbMF0pLCBGVDEwMDBfTUFHX0RTUF9USU1FUjBfSU5EWCk7CisgICAgICAgICAgICAgICAgc3RhdHVzICAgID0gZnQxMDAwX3JlYWRfZHByYW0xNihkZXYsIEZUMTAwMF9NQUdfRFNQX1RJTUVSMSwgKHU4ICopJihpbmZvLT5EU1BfVElNRVsxXSksIEZUMTAwMF9NQUdfRFNQX1RJTUVSMV9JTkRYKTsKKyAgICAgICAgICAgICAgICBzdGF0dXMgICAgPSBmdDEwMDBfcmVhZF9kcHJhbTE2KGRldiwgRlQxMDAwX01BR19EU1BfVElNRVIyLCAodTggKikmKGluZm8tPkRTUF9USU1FWzJdKSwgRlQxMDAwX01BR19EU1BfVElNRVIyX0lORFgpOworICAgICAgICAgICAgICAgIHN0YXR1cyAgICA9IGZ0MTAwMF9yZWFkX2RwcmFtMTYoZGV2LCBGVDEwMDBfTUFHX0RTUF9USU1FUjMsICh1OCAqKSYoaW5mby0+RFNQX1RJTUVbM10pLCBGVDEwMDBfTUFHX0RTUF9USU1FUjNfSU5EWCk7CiAgICAgICAgICAgICAgICAgaW5mby0+Q2FyZFJlYWR5ID0gMDsKICAgICAgICAgICAgICAgICBpbmZvLT5EcnZFcnJOdW0gPSBEU1BfQ09ORFJFU0VUX0lORk87CiAgICAgICAgICAgICAgICAgREVCVUcoImZ0MTAwMF9odzpEU1AgY29uZGl0aW9uYWwgcmVzZXQgcmVxdWVzdGVkXG4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9mdDEwMDAvZnQxMDAwLXVzYi9mdDEwMDBfaHcuaCBiL2RyaXZlcnMvc3RhZ2luZy9mdDEwMDAvZnQxMDAwLXVzYi9mdDEwMDBfaHcuaAppbmRleCBjNTgwNzQxLi5hYjkzMTJmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZnQxMDAwL2Z0MTAwMC11c2IvZnQxMDAwX2h3LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2Z0MTAwMC9mdDEwMDAtdXNiL2Z0MTAwMF9ody5oCkBAIC00LDcgKzQsNyBAQAogCiAjaW5jbHVkZSAiZnQxMDAwX3VzYi5oIgogCi1leHRlcm4gdTE2IGZ0MTAwMF9yZWFkX3JlZ2lzdGVyKHN0cnVjdCB1c2JfZGV2aWNlICpkZXYsIFBVU0hPUlQgRGF0YSwgdTggblJlZ0luZHgpOwotZXh0ZXJuIHUxNiBmdDEwMDBfd3JpdGVfcmVnaXN0ZXIoc3RydWN0IHVzYl9kZXZpY2UgKmRldiwgVVNIT1JUIHZhbHVlLCB1OCBuUmVnSW5keCk7CitleHRlcm4gdTE2IGZ0MTAwMF9yZWFkX3JlZ2lzdGVyKHN0cnVjdCB1c2JfZGV2aWNlICpkZXYsIHUxNiAqRGF0YSwgdTggblJlZ0luZHgpOworZXh0ZXJuIHUxNiBmdDEwMDBfd3JpdGVfcmVnaXN0ZXIoc3RydWN0IHVzYl9kZXZpY2UgKmRldiwgdTE2IHZhbHVlLCB1OCBuUmVnSW5keCk7CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2Z0MTAwMC9mdDEwMDAtdXNiL2Z0MTAwMF9wcm9jLmMgYi9kcml2ZXJzL3N0YWdpbmcvZnQxMDAwL2Z0MTAwMC11c2IvZnQxMDAwX3Byb2MuYwppbmRleCAzNmNkZDU4Li5iODc1NDJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZnQxMDAwL2Z0MTAwMC11c2IvZnQxMDAwX3Byb2MuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZnQxMDAwL2Z0MTAwMC11c2IvZnQxMDAwX3Byb2MuYwpAQCAtMSwzICsxLDI0IEBACisvKgorICogZnQxMDAwX3Byb2MuYyAtIGZ0MTAwMCBwcm9jIGludGVyZmFjZQorICoKKyAqIENvcHlyaWdodAkoQykgMjAwOS0yMDEwIFF1aW50ZWMKKyAqCQkoQykgMjAxMCBPcGVuLW5hbmRyYQorICogICAgICA8bWFyZWsuYmVsaXNrb0BvcGVuLW5hbmRyYS5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbAorICogUHVibGljIExpY2Vuc2UuIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMKKyAqIGFyY2hpdmUgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CkBAIC0xNCwyMTkgKzM1LDIxNyBAQAogCiAjZGVmaW5lIFBVVFhfVE9fUEFHRShsZW4scGFnZSxtZXNzYWdlLHNpemUsdmFyKSBcCiAJbGVuICs9IHNucHJpbnRmKHBhZ2UrbGVuLCBQQUdFX1NJWkUgLSBsZW4sIG1lc3NhZ2UpOyBcCi0JZm9yKGkgPSAwOyBpIDwgKHNpemUgLSAxKTsgaSsrKSBcCi0JeyBcCisJZm9yIChpID0gMDsgaSA8IChzaXplIC0gMSk7IGkrKykge1wKIAkJbGVuICs9IHNucHJpbnRmKHBhZ2UrbGVuLCBQQUdFX1NJWkUgLSBsZW4sICIlMDJ4OiIsIHZhcltpXSk7IFwKIAl9IFwKIAlsZW4gKz0gc25wcmludGYocGFnZStsZW4sIFBBR0VfU0laRSAtIGxlbiwgIiUwMnhcbiIsIHZhcltpXSkKIAogI2RlZmluZSBQVVREX1RPX1BBR0UobGVuLHBhZ2UsbWVzc2FnZSxzaXplLHZhcikgXAogCWxlbiArPSBzbnByaW50ZihwYWdlK2xlbiwgUEFHRV9TSVpFIC0gbGVuLCBtZXNzYWdlKTsgXAotCWZvcihpID0gMDsgaSA8IChzaXplIC0gMSk7IGkrKykgXAotCXsgXAorCWZvciAoaSA9IDA7IGkgPCAoc2l6ZSAtIDEpOyBpKyspIHtcCiAJCWxlbiArPSBzbnByaW50ZihwYWdlK2xlbiwgUEFHRV9TSVpFIC0gbGVuLCAiJWQuIiwgdmFyW2ldKTsgXAogCX0gXAogCWxlbiArPSBzbnByaW50ZihwYWdlK2xlbiwgUEFHRV9TSVpFIC0gbGVuLCAiJWRcbiIsIHZhcltpXSkKIAogCi0KLQotLy8jaWZkZWYgSU5JVF9ORVRfTlMKICNkZWZpbmUgRlRORVRfUFJPQyBpbml0X25ldC5wcm9jX25ldAotLy8jZWxzZQotLy8jZGVmaW5lIEZUTkVUX1BST0MgcHJvY19uZXQKLS8vI2VuZGlmCiAKIAotdTE2IGZ0MTAwMF9yZWFkX2RwcmFtMTYgKHN0cnVjdCBmdDEwMDBfZGV2aWNlICpmdDEwMDBkZXYsIFVTSE9SVCBpbmR4LAotCQkJIFBVQ0hBUiBidWZmZXIsIHU4IGhpZ2hsb3cpOwordTE2IGZ0MTAwMF9yZWFkX2RwcmFtMTYgKHN0cnVjdCBmdDEwMDBfZGV2aWNlICpmdDEwMDBkZXYsIHUxNiBpbmR4LAorCQkJIHU4ICpidWZmZXIsIHU4IGhpZ2hsb3cpOwogCiAKIHN0YXRpYyBpbnQKLWZ0MTAwMFJlYWRQcm9jIChjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZiwgaW50IGNvdW50LCBpbnQgKmVvZiwKK2Z0MTAwMFJlYWRQcm9jKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2ZmLCBpbnQgY291bnQsIGludCAqZW9mLAogCQl2b2lkICpkYXRhKQogewotICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OwotICBpbnQgbGVuOwotICBpbnQgaTsKLSAgdW5zaWduZWQgc2hvcnQgbGVkU3RhdDsKLSAgdW5zaWduZWQgc2hvcnQgY29uU3RhdDsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCWludCBsZW47CisJaW50IGk7CisJdW5zaWduZWQgc2hvcnQgbGVkU3RhdDsKKwl1bnNpZ25lZCBzaG9ydCBjb25TdGF0OwogCiAJc3RydWN0IGZ0MTAwMF9pbmZvICppbmZvOwogCi0gIGNoYXIgKnN0YXR1c1tdID0geyAiSWRsZSAoRGlzY29ubmVjdCkiLCAiU2VhcmNoaW5nIiwgIkFjdGl2ZSAoQ29ubmVjdGVkKSIsCi0gICAgIldhaXRpbmcgZm9yIEwyIiwgIlNsZWVwIiwgIk5vIENvdmVyYWdlIiwgIiIsICIiCi0gIH07CisJY2hhciAqc3RhdHVzW10gPSB7IAorCQkiSWRsZSAoRGlzY29ubmVjdCkiLCAKKwkJIlNlYXJjaGluZyIsCisJCSJBY3RpdmUgKENvbm5lY3RlZCkiLAorCQkiV2FpdGluZyBmb3IgTDIiLAorCQkiU2xlZXAiLAorCQkiTm8gQ292ZXJhZ2UiLAorCQkiIiwKKwkJIiIsCisJfTsKIAotICBjaGFyICpzaWduYWxbXSA9IHsgIiIsICIqIiwgIioqIiwgIioqKiIsICIqKioqIiB9OwotICBpbnQgc3RyZW5ndGg7Ci0gIGludCBxdWFsaXR5OwotICBzdHJ1Y3QgdGltZXZhbCB0djsKLSAgdGltZV90IGRlbHRhOworCWNoYXIgKnNpZ25hbFtdID0geyAiIiwgIioiLCAiKioiLCAiKioqIiwgIioqKioiIH07CisJaW50IHN0cmVuZ3RoOworCWludCBxdWFsaXR5OworCXN0cnVjdCB0aW1ldmFsIHR2OworCXRpbWVfdCBkZWx0YTsKIAotICBkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKikgZGF0YTsKLQlpbmZvID0gKHN0cnVjdCBmdDEwMDBfaW5mbyAqKSBuZXRkZXZfcHJpdihkZXYpOworCWRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKSBkYXRhOworCWluZm8gPSBuZXRkZXZfcHJpdihkZXYpOwogCi0gIGlmIChvZmYgPiAwKQotICAgIHsKLSAgICAgICplb2YgPSAxOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQorCWlmIChvZmYgPiAwKSB7CisJCSplb2YgPSAxOworCQlyZXR1cm4gMDsKKwl9CiAKIAotICBpZiAoaW5mby0+UHJvZ0NvblN0YXQgIT0gMHhGRikKLSAgICB7Ci0gICAgICBmdDEwMDBfcmVhZF9kcHJhbTE2IChpbmZvLT5wRnQxMDAwRGV2LCBGVDEwMDBfTUFHX0RTUF9MRUQsCi0JCQkgICAoUFVDSEFSKSAmIGxlZFN0YXQsIEZUMTAwMF9NQUdfRFNQX0xFRF9JTkRYKTsKLSAgICAgIGluZm8tPkxlZFN0YXQgPSBudG9ocyAobGVkU3RhdCk7CisJaWYgKGluZm8tPlByb2dDb25TdGF0ICE9IDB4RkYpIHsKKwkJZnQxMDAwX3JlYWRfZHByYW0xNihpbmZvLT5wRnQxMDAwRGV2LCBGVDEwMDBfTUFHX0RTUF9MRUQsCisJCQkgICAodTggKikmbGVkU3RhdCwgRlQxMDAwX01BR19EU1BfTEVEX0lORFgpOworCQlpbmZvLT5MZWRTdGF0ID0gbnRvaHMobGVkU3RhdCk7CiAKLSAgICAgIGZ0MTAwMF9yZWFkX2RwcmFtMTYgKGluZm8tPnBGdDEwMDBEZXYsIEZUMTAwMF9NQUdfRFNQX0NPTl9TVEFURSwKLQkJCSAgIChQVUNIQVIpICYgY29uU3RhdCwgRlQxMDAwX01BR19EU1BfQ09OX1NUQVRFX0lORFgpOwotICAgICAgaW5mby0+Q29uU3RhdCA9IG50b2hzIChjb25TdGF0KTsKLSAgICAgIGRvX2dldHRpbWVvZmRheSAoJnR2KTsKLSAgICAgIGRlbHRhID0gKHR2LnR2X3NlYyAtIGluZm8tPkNvblRtKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpbmZvLT5Db25TdGF0ID0gMHhmOwotICAgICAgZGVsdGEgPSAwOwotICAgIH0KKwkJZnQxMDAwX3JlYWRfZHByYW0xNihpbmZvLT5wRnQxMDAwRGV2LCBGVDEwMDBfTUFHX0RTUF9DT05fU1RBVEUsCisJCQkodTggKikmY29uU3RhdCwgRlQxMDAwX01BR19EU1BfQ09OX1NUQVRFX0lORFgpOworCQlpbmZvLT5Db25TdGF0ID0gbnRvaHMoY29uU3RhdCk7CisJCWRvX2dldHRpbWVvZmRheSgmdHYpOworCQlkZWx0YSA9ICh0di50dl9zZWMgLSBpbmZvLT5Db25UbSk7CisJfSBlbHNlIHsKKwkJaW5mby0+Q29uU3RhdCA9IDB4ZjsKKwkJZGVsdGEgPSAwOworCX0KIAorCWkgPSAoaW5mby0+TGVkU3RhdCkgJiAweGY7CisJc3dpdGNoIChpKSB7CisJY2FzZSAweDE6CisJCXN0cmVuZ3RoID0gMTsKKwkJYnJlYWs7CisJY2FzZSAweDM6CisJCXN0cmVuZ3RoID0gMjsKKwkJYnJlYWs7CisJY2FzZSAweDc6CisJCXN0cmVuZ3RoID0gMzsKKwkJYnJlYWs7CisJY2FzZSAweGY6CisJCXN0cmVuZ3RoID0gNDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJc3RyZW5ndGggPSAwOworCX0KIAorCWkgPSAoaW5mby0+TGVkU3RhdCA+PiA4KSAmIDB4ZjsKKwlzd2l0Y2ggKGkpIHsKKwljYXNlIDB4MToKKwkJcXVhbGl0eSA9IDE7CisJCWJyZWFrOworCWNhc2UgMHgzOgorCQlxdWFsaXR5ID0gMjsKKwkJYnJlYWs7CisJY2FzZSAweDc6CisJCXF1YWxpdHkgPSAzOworCQlicmVhazsKKwljYXNlIDB4ZjoKKwkJcXVhbGl0eSA9IDQ7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXF1YWxpdHkgPSAwOworCX0KIAotICBpID0gKGluZm8tPkxlZFN0YXQpICYgMHhmOwotICBzd2l0Y2ggKGkpCi0gICAgewotICAgIGNhc2UgMHgxOgotICAgICAgc3RyZW5ndGggPSAxOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAweDM6Ci0gICAgICBzdHJlbmd0aCA9IDI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDB4NzoKLSAgICAgIHN0cmVuZ3RoID0gMzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMHhmOgotICAgICAgc3RyZW5ndGggPSA0OwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHN0cmVuZ3RoID0gMDsKLSAgICB9CisJbGVuID0gMDsKKwlQVVRNX1RPX1BBR0UobGVuLCBwYWdlLCAiQ29ubmVjdGlvbiBUaW1lOiAlMDJsZDolMDJsZDolMDJsZFxuIiwKKyAgICAgIAkJKChkZWx0YSAvIDM2MDApICUgMjQpLCAoKGRlbHRhIC8gNjApICUgNjApLCAoZGVsdGEgJSA2MCkpOworCVBVVE1fVE9fUEFHRShsZW4sIHBhZ2UsICJDb25uZWN0aW9uIFRpbWVbc106ICVsZFxuIiwgZGVsdGEpOworCVBVVE1fVE9fUEFHRShsZW4sIHBhZ2UsICJBc2ljIElEOiAlc1xuIiwKKyAgICAgIAkoaW5mby0+QXNpY0lEKSA9PQorICAgICAgCUVMRUNUUkFCVVpaX0lEID8gIkVMRUNUUkFCVVpaIEFTSUMiIDogIk1BR05FTUlURSBBU0lDIik7CisJUFVUWF9UT19QQUdFKGxlbiwgcGFnZSwgIlNLVTogIiwgU0tVU1osIGluZm8tPlNrdSk7CisJUFVUWF9UT19QQUdFKGxlbiwgcGFnZSwgIkVVSTY0OiAiLCBFVUlTWiwgaW5mby0+ZXVpNjQpOworCVBVVERfVE9fUEFHRShsZW4sIHBhZ2UsICJEU1AgdmVyc2lvbiBudW1iZXI6ICIsIERTUFZFUlNaLCBpbmZvLT5Ec3BWZXIpOworCVBVVFhfVE9fUEFHRShsZW4sIHBhZ2UsICJIYXJkd2FyZSBTZXJpYWwgTnVtYmVyOiAiLCBIV1NFUk5VTVNaLAorICAgICAgCQlpbmZvLT5Id1Nlck51bSk7CisJUFVUWF9UT19QQUdFKGxlbiwgcGFnZSwgIkNhbGliZXJhdGlvbiBWZXJzaW9uOiAiLCBDQUxWRVJTWiwKKyAgICAgIAkJaW5mby0+UmZDYWxWZXIpOworCVBVVERfVE9fUEFHRShsZW4sIHBhZ2UsICJDYWxpYmVyYXRpb24gRGF0ZTogIiwgQ0FMREFURVNaLAorCQlpbmZvLT5SZkNhbERhdGUpOworCVBVVE1fVE9fUEFHRShsZW4sIHBhZ2UsICJNZWRpYSBTdGF0ZTogJXNcbiIsCisgICAgICAJCShpbmZvLT5tZWRpYXN0YXRlKSA/ICJsaW5rIiA6ICJubyBsaW5rIik7CisJUFVUTV9UT19QQUdFKGxlbiwgcGFnZSwgIkNvbm5lY3Rpb24gU3RhdHVzOiAlc1xuIiwKKyAgICAgIAkJc3RhdHVzWygoaW5mby0+Q29uU3RhdCkgJiAweDcpXSk7CisJUFVUTV9UT19QQUdFKGxlbiwgcGFnZSwgIlJYIHBhY2tldHM6ICVsZFxuIiwgaW5mby0+c3RhdHMucnhfcGFja2V0cyk7CisJUFVUTV9UT19QQUdFKGxlbiwgcGFnZSwgIlRYIHBhY2tldHM6ICVsZFxuIiwgaW5mby0+c3RhdHMudHhfcGFja2V0cyk7CisJUFVUTV9UT19QQUdFKGxlbiwgcGFnZSwgIlJYIGJ5dGVzOiAlbGRcbiIsIGluZm8tPnN0YXRzLnJ4X2J5dGVzKTsKKwlQVVRNX1RPX1BBR0UobGVuLCBwYWdlLCAiVFggYnl0ZXM6ICVsZFxuIiwgaW5mby0+c3RhdHMudHhfYnl0ZXMpOworCVBVVE1fVE9fUEFHRShsZW4sIHBhZ2UsICJTaWduYWwgU3RyZW5ndGg6ICVzXG4iLCBzaWduYWxbc3RyZW5ndGhdKTsKKwlQVVRNX1RPX1BBR0UobGVuLCBwYWdlLCAiU2lnbmFsIFF1YWxpdHk6ICVzXG4iLCBzaWduYWxbcXVhbGl0eV0pOwogCi0gIGkgPSAoaW5mby0+TGVkU3RhdCA+PiA4KSAmIDB4ZjsKLSAgc3dpdGNoIChpKQotICAgIHsKLSAgICBjYXNlIDB4MToKLSAgICAgIHF1YWxpdHkgPSAxOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAweDM6Ci0gICAgICBxdWFsaXR5ID0gMjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMHg3OgotICAgICAgcXVhbGl0eSA9IDM7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDB4ZjoKLSAgICAgIHF1YWxpdHkgPSA0OwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHF1YWxpdHkgPSAwOwotICAgIH0KLQotCi0gIGxlbiA9IDA7Ci0gIFBVVE1fVE9fUEFHRSAobGVuLCBwYWdlLCAiQ29ubmVjdGlvbiBUaW1lOiAlMDJsZDolMDJsZDolMDJsZFxuIiwKLQkJKChkZWx0YSAvIDM2MDApICUgMjQpLCAoKGRlbHRhIC8gNjApICUgNjApLCAoZGVsdGEgJSA2MCkpOwotICBQVVRNX1RPX1BBR0UgKGxlbiwgcGFnZSwgIkNvbm5lY3Rpb24gVGltZVtzXTogJWxkXG4iLCBkZWx0YSk7Ci0gIFBVVE1fVE9fUEFHRSAobGVuLCBwYWdlLCAiQXNpYyBJRDogJXNcbiIsCi0JCShpbmZvLT5Bc2ljSUQpID09Ci0JCUVMRUNUUkFCVVpaX0lEID8gIkVMRUNUUkFCVVpaIEFTSUMiIDogIk1BR05FTUlURSBBU0lDIik7Ci0gIFBVVFhfVE9fUEFHRSAobGVuLCBwYWdlLCAiU0tVOiAiLCBTS1VTWiwgaW5mby0+U2t1KTsKLSAgUFVUWF9UT19QQUdFIChsZW4sIHBhZ2UsICJFVUk2NDogIiwgRVVJU1osIGluZm8tPmV1aTY0KTsKLSAgUFVURF9UT19QQUdFIChsZW4sIHBhZ2UsICJEU1AgdmVyc2lvbiBudW1iZXI6ICIsIERTUFZFUlNaLCBpbmZvLT5Ec3BWZXIpOwotICBQVVRYX1RPX1BBR0UgKGxlbiwgcGFnZSwgIkhhcmR3YXJlIFNlcmlhbCBOdW1iZXI6ICIsIEhXU0VSTlVNU1osCi0JCWluZm8tPkh3U2VyTnVtKTsKLSAgUFVUWF9UT19QQUdFIChsZW4sIHBhZ2UsICJDYWxpYmVyYXRpb24gVmVyc2lvbjogIiwgQ0FMVkVSU1osCi0JCWluZm8tPlJmQ2FsVmVyKTsKLSAgUFVURF9UT19QQUdFIChsZW4sIHBhZ2UsICJDYWxpYmVyYXRpb24gRGF0ZTogIiwgQ0FMREFURVNaLCBpbmZvLT5SZkNhbERhdGUpOwotICBQVVRNX1RPX1BBR0UgKGxlbiwgcGFnZSwgIk1lZGlhIFN0YXRlOiAlc1xuIiwKLQkJKGluZm8tPm1lZGlhc3RhdGUpID8gImxpbmsiIDogIm5vIGxpbmsiKTsKLSAgUFVUTV9UT19QQUdFIChsZW4sIHBhZ2UsICJDb25uZWN0aW9uIFN0YXR1czogJXNcbiIsCi0JCXN0YXR1c1soKGluZm8tPkNvblN0YXQpICYgMHg3KV0pOwotICBQVVRNX1RPX1BBR0UgKGxlbiwgcGFnZSwgIlJYIHBhY2tldHM6ICVsZFxuIiwgaW5mby0+c3RhdHMucnhfcGFja2V0cyk7Ci0gIFBVVE1fVE9fUEFHRSAobGVuLCBwYWdlLCAiVFggcGFja2V0czogJWxkXG4iLCBpbmZvLT5zdGF0cy50eF9wYWNrZXRzKTsKLSAgUFVUTV9UT19QQUdFIChsZW4sIHBhZ2UsICJSWCBieXRlczogJWxkXG4iLCBpbmZvLT5zdGF0cy5yeF9ieXRlcyk7Ci0gIFBVVE1fVE9fUEFHRSAobGVuLCBwYWdlLCAiVFggYnl0ZXM6ICVsZFxuIiwgaW5mby0+c3RhdHMudHhfYnl0ZXMpOwotICBQVVRNX1RPX1BBR0UgKGxlbiwgcGFnZSwgIlNpZ25hbCBTdHJlbmd0aDogJXNcbiIsIHNpZ25hbFtzdHJlbmd0aF0pOwotICBQVVRNX1RPX1BBR0UgKGxlbiwgcGFnZSwgIlNpZ25hbCBRdWFsaXR5OiAlc1xuIiwgc2lnbmFsW3F1YWxpdHldKTsKLQotCi0KLQotICByZXR1cm4gbGVuOworCXJldHVybiBsZW47CiB9CiAKIHN0YXRpYyBpbnQKLWZ0MTAwME5vdGlmeVByb2MgKHN0cnVjdCBub3RpZmllcl9ibG9jayAqdGhpcywgdW5zaWduZWQgbG9uZyBldmVudCwgdm9pZCAqcHRyKQorZnQxMDAwTm90aWZ5UHJvYyhzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnRoaXMsIHVuc2lnbmVkIGxvbmcgZXZlbnQsIHZvaWQgKnB0cikKIHsKLSAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHB0cjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcHRyOwogCXN0cnVjdCBmdDEwMDBfaW5mbyAqaW5mbzsKLSAgc3RydWN0IHByb2NfZGlyX2VudHJ5ICpmdDEwMDBfcHJvY19maWxlOworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZnQxMDAwX3Byb2NfZmlsZTsKIAotaW5mbyA9IChzdHJ1Y3QgZnQxMDAwX2luZm8gKikgbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbmZvID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAorCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIE5FVERFVl9DSEFOR0VOQU1FOgorCQlyZW1vdmVfcHJvY19lbnRyeShpbmZvLT5uZXRkZXZuYW1lLCBpbmZvLT5mdDEwMDBfcHJvY19kaXIpOworCQlmdDEwMDBfcHJvY19maWxlID0gY3JlYXRlX3Byb2NfcmVhZF9lbnRyeShkZXYtPm5hbWUsIDA2NDQsCisJCQkJCWluZm8tPmZ0MTAwMF9wcm9jX2RpciwKKwkJCQkJZnQxMDAwUmVhZFByb2MsIGRldik7CisJCXNucHJpbnRmKGluZm8tPm5ldGRldm5hbWUsIElGTkFNU0laLCAiJXMiLCBkZXYtPm5hbWUpOworCQlicmVhazsKKwl9CiAKLSAgc3dpdGNoIChldmVudCkKLSAgICB7Ci0gICAgY2FzZSBORVRERVZfQ0hBTkdFTkFNRToKLSAgICAgIHJlbW92ZV9wcm9jX2VudHJ5IChpbmZvLT5uZXRkZXZuYW1lLCBpbmZvLT5mdDEwMDBfcHJvY19kaXIpOwotICAgICAgZnQxMDAwX3Byb2NfZmlsZSA9IGNyZWF0ZV9wcm9jX3JlYWRfZW50cnkgKGRldi0+bmFtZSwgMDY0NCwKLQkJCQkJCSBpbmZvLT5mdDEwMDBfcHJvY19kaXIsCi0JCQkJCQkgZnQxMDAwUmVhZFByb2MsIGRldik7Ci0gICAgICBzbnByaW50ZiAoaW5mby0+bmV0ZGV2bmFtZSwgSUZOQU1TSVosICIlcyIsIGRldi0+bmFtZSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIHJldHVybiBOT1RJRllfRE9ORTsKKwlyZXR1cm4gTk9USUZZX0RPTkU7CiB9CiAKIHN0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgZnQxMDAwX25ldGRldl9ub3RpZmllciA9IHsKLSAgLm5vdGlmaWVyX2NhbGwgPSBmdDEwMDBOb3RpZnlQcm9jCisJLm5vdGlmaWVyX2NhbGwgPSBmdDEwMDBOb3RpZnlQcm9jLAogfTsKIAogCi12b2lkCi1mdDEwMDBJbml0UHJvYyAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK2ludCBmdDEwMDBfaW5pdF9wcm9jKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGZ0MTAwMF9pbmZvICppbmZvOwotICBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmZ0MTAwMF9wcm9jX2ZpbGU7Ci0JaW5mbyA9IChzdHJ1Y3QgZnQxMDAwX2luZm8gKikgbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmZ0MTAwMF9wcm9jX2ZpbGU7CisJaW50IHJldCA9IDA7CiAKKwlpbmZvID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAotICBpbmZvLT5mdDEwMDBfcHJvY19kaXIgPSBwcm9jX21rZGlyIChGVDEwMDBfUFJPQ19ESVIsIEZUTkVUX1BST0MpOwotICBpZiAoaW5mby0+ZnQxMDAwX3Byb2NfZGlyID09IE5VTEwpCi0gICAgewotICAgICAgcmVtb3ZlX3Byb2NfZW50cnkgKEZUMTAwMF9QUk9DX0RJUiwgRlRORVRfUFJPQyk7Ci0gICAgfQorCWluZm8tPmZ0MTAwMF9wcm9jX2RpciA9IHByb2NfbWtkaXIoRlQxMDAwX1BST0NfRElSLCBGVE5FVF9QUk9DKTsKKwlpZiAoaW5mby0+ZnQxMDAwX3Byb2NfZGlyID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiVW5hYmxlIHRvIGNyZWF0ZSAlcyBkaXIuXG4iLAorCQkJRlQxMDAwX1BST0NfRElSKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBmYWlsOworCX0KIAorCWZ0MTAwMF9wcm9jX2ZpbGUgPQorCQljcmVhdGVfcHJvY19yZWFkX2VudHJ5KGRldi0+bmFtZSwgMDY0NCwKKwkJCWluZm8tPmZ0MTAwMF9wcm9jX2RpciwgZnQxMDAwUmVhZFByb2MsIGRldik7CiAKLSAgZnQxMDAwX3Byb2NfZmlsZSA9Ci0gICAgY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSAoZGV2LT5uYW1lLCAwNjQ0LCBpbmZvLT5mdDEwMDBfcHJvY19kaXIsCi0JCQkgICAgZnQxMDAwUmVhZFByb2MsIGRldik7Ci0gIGlmIChmdDEwMDBfcHJvY19maWxlID09IE5VTEwpCi0gICAgewotICAgICAgcmVtb3ZlX3Byb2NfZW50cnkgKGluZm8tPm5ldGRldm5hbWUsIGluZm8tPmZ0MTAwMF9wcm9jX2Rpcik7Ci0gICAgfQorCWlmIChmdDEwMDBfcHJvY19maWxlID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiVW5hYmxlIHRvIGNyZWF0ZSAvcHJvYyBlbnRyeS5cbiIpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGZhaWxfZW50cnk7CisJfQogCi0gIHNucHJpbnRmIChpbmZvLT5uZXRkZXZuYW1lLCBJRk5BTVNJWiwgIiVzIiwgZGV2LT5uYW1lKTsKLSAgcmVnaXN0ZXJfbmV0ZGV2aWNlX25vdGlmaWVyICgmZnQxMDAwX25ldGRldl9ub3RpZmllcik7Ci0gIHJldHVybjsKKwlzbnByaW50ZihpbmZvLT5uZXRkZXZuYW1lLCBJRk5BTVNJWiwgIiVzIiwgZGV2LT5uYW1lKTsKKworCXJldCA9IHJlZ2lzdGVyX25ldGRldmljZV9ub3RpZmllcigmZnQxMDAwX25ldGRldl9ub3RpZmllcik7CisJaWYgKHJldCkKKwkJZ290byBmYWlsX25vdGlmOworCisJcmV0dXJuIDA7CisKK2ZhaWxfbm90aWY6CisJcmVtb3ZlX3Byb2NfZW50cnkoaW5mby0+bmV0ZGV2bmFtZSwgaW5mby0+ZnQxMDAwX3Byb2NfZGlyKTsKK2ZhaWxfZW50cnk6CisJcmVtb3ZlX3Byb2NfZW50cnkoRlQxMDAwX1BST0NfRElSLCBGVE5FVF9QUk9DKTsKK2ZhaWw6CisJcmV0dXJuIHJldDsKIH0KIAotdm9pZAotZnQxMDAwQ2xlYW51cFByb2Moc3RydWN0IGZ0MTAwMF9pbmZvICppbmZvKQordm9pZCBmdDEwMDBfY2xlYW51cF9wcm9jKHN0cnVjdCBmdDEwMDBfaW5mbyAqaW5mbykKIHsKLSAgcmVtb3ZlX3Byb2NfZW50cnkgKGluZm8tPm5ldGRldm5hbWUsIGluZm8tPmZ0MTAwMF9wcm9jX2Rpcik7Ci0gIHJlbW92ZV9wcm9jX2VudHJ5IChGVDEwMDBfUFJPQ19ESVIsIEZUTkVUX1BST0MpOwotICB1bnJlZ2lzdGVyX25ldGRldmljZV9ub3RpZmllciAoJmZ0MTAwMF9uZXRkZXZfbm90aWZpZXIpOwotCi0gIHJldHVybjsKKwlyZW1vdmVfcHJvY19lbnRyeShpbmZvLT5uZXRkZXZuYW1lLCBpbmZvLT5mdDEwMDBfcHJvY19kaXIpOworCXJlbW92ZV9wcm9jX2VudHJ5KEZUMTAwMF9QUk9DX0RJUiwgRlRORVRfUFJPQyk7CisJdW5yZWdpc3Rlcl9uZXRkZXZpY2Vfbm90aWZpZXIoJmZ0MTAwMF9uZXRkZXZfbm90aWZpZXIpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2Z0MTAwMC9mdDEwMDAtdXNiL2Z0MTAwMF91c2IuYyBiL2RyaXZlcnMvc3RhZ2luZy9mdDEwMDAvZnQxMDAwLXVzYi9mdDEwMDBfdXNiLmMKaW5kZXggMjhmNTViMi4uNzk0ODJhYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2Z0MTAwMC9mdDEwMDAtdXNiL2Z0MTAwMF91c2IuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZnQxMDAwL2Z0MTAwMC11c2IvZnQxMDAwX3VzYi5jCkBAIC0zNiw3ICszNiw3IEBACiAKIE1PRFVMRV9ERVZJQ0VfVEFCTEUodXNiLCBpZF90YWJsZSk7CiAKLXN0YXRpYyBCT09MRUFOIGdQb2xsaW5nZmFpbGVkID0gRkFMU0U7CitzdGF0aWMgYm9vbCBnUG9sbGluZ2ZhaWxlZCA9IEZBTFNFOwogaW50IGZ0MTAwMF9wb2xsX3RocmVhZCh2b2lkICphcmcpCiB7CiAJaW50IHJldCA9IFNUQVRVU19TVUNDRVNTOwpAQCAtNjQsNyArNjQsNyBAQAogCWludCBpLCByZXQgPSAwLCBzaXplOwogCiAJc3RydWN0IGZ0MTAwMF9kZXZpY2UgKmZ0MTAwMGRldjsKLQlzdHJ1Y3QgZnQxMDAwX2luZm8gKnBmdDEwMDBpbmZvOworCXN0cnVjdCBmdDEwMDBfaW5mbyAqcGZ0MTAwMGluZm8gPSBOVUxMOwogCWNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZHNwX2Z3OwogCiAJZnQxMDAwZGV2ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGZ0MTAwMF9kZXZpY2UpLCBHRlBfS0VSTkVMKTsKQEAgLTg0LDcgKzg0LDYgQEAKIAlmdDEwMDBkZXYtPmRldiA9IGRldjsKIAlmdDEwMDBkZXYtPnN0YXR1cyA9IDA7CiAJZnQxMDAwZGV2LT5uZXQgPSBOVUxMOwotCXNwaW5fbG9ja19pbml0KCZmdDEwMDBkZXYtPmRldmljZV9sb2NrKTsKIAlmdDEwMDBkZXYtPnR4X3VyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0FUT01JQyk7CiAJZnQxMDAwZGV2LT5yeF91cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9BVE9NSUMpOwogCkBAIC0xNjQsNyArMTYzLDcgQEAKIAlpZiAocmV0KQogCQlnb3RvIGVycl9sb2FkOwogCi0JcGZ0MTAwMGluZm8gPSAoc3RydWN0IGZ0MTAwMF9pbmZvICopIG5ldGRldl9wcml2KGZ0MTAwMGRldi0+bmV0KTsKKwlwZnQxMDAwaW5mbyA9IG5ldGRldl9wcml2KGZ0MTAwMGRldi0+bmV0KTsKIAogCURFQlVHKCJJbiBwcm9iZTogcGZ0MTAwMGluZm89JXBcbiIsIHBmdDEwMDBpbmZvKTsKIAlyZXQgPSBkc3BfcmVsb2FkKGZ0MTAwMGRldik7CkBAIC0xNzYsMTQgKzE3NSwxOCBAQAogCWdQb2xsaW5nZmFpbGVkID0gRkFMU0U7CiAJcGZ0MTAwMGluZm8tPnBQb2xsVGhyZWFkID0KIAkgICAga3RocmVhZF9ydW4oZnQxMDAwX3BvbGxfdGhyZWFkLCBmdDEwMDBkZXYsICJmdDEwMDBfcG9sbCIpOworCisJaWYgKElTX0VSUihwZnQxMDAwaW5mby0+cFBvbGxUaHJlYWQpKSB7CisJCXJldCA9IFBUUl9FUlIocGZ0MTAwMGluZm8tPnBQb2xsVGhyZWFkKTsKKwkJZ290byBlcnJfbG9hZDsKKwl9CisKIAltc2xlZXAoNTAwKTsKIAogCXdoaWxlICghcGZ0MTAwMGluZm8tPkNhcmRSZWFkeSkgewogCQlpZiAoZ1BvbGxpbmdmYWlsZWQpIHsKLQkJCWlmIChwZnQxMDAwaW5mby0+cFBvbGxUaHJlYWQpCi0JCQkJa3RocmVhZF9zdG9wKHBmdDEwMDBpbmZvLT5wUG9sbFRocmVhZCk7CiAJCQlyZXQgPSAtRUlPOwotCQkJZ290byBlcnJfbG9hZDsKKwkJCWdvdG8gZXJyX3RocmVhZDsKIAkJfQogCQltc2xlZXAoMTAwKTsKIAkJREVCVUcoImZ0MTAwMF9wcm9iZTo6V2FpdGluZyBmb3IgQ2FyZCBSZWFkeVxuIik7CkBAIC0xOTMsMTQgKzE5NiwyMSBAQAogCiAJcmV0ID0gcmVnX2Z0MTAwMF9uZXRkZXYoZnQxMDAwZGV2LCBpbnRlcmZhY2UpOwogCWlmIChyZXQpCi0JCWdvdG8gZXJyX2xvYWQ7CisJCWdvdG8gZXJyX3RocmVhZDsKKworCXJldCA9IGZ0MTAwMF9pbml0X3Byb2MoZnQxMDAwZGV2LT5uZXQpOworCWlmIChyZXQpCisJCWdvdG8gZXJyX3Byb2M7CiAKIAlwZnQxMDAwaW5mby0+TmV0RGV2UmVnRG9uZSA9IDE7CiAKLQlmdDEwMDBJbml0UHJvYyhmdDEwMDBkZXYtPm5ldCk7Ci0KIAlyZXR1cm4gMDsKIAorZXJyX3Byb2M6CisJdW5yZWdpc3Rlcl9uZXRkZXYoZnQxMDAwZGV2LT5uZXQpOworCWZyZWVfbmV0ZGV2KGZ0MTAwMGRldi0+bmV0KTsKK2Vycl90aHJlYWQ6CisJa3RocmVhZF9zdG9wKHBmdDEwMDBpbmZvLT5wUG9sbFRocmVhZCk7CiBlcnJfbG9hZDoKIAlrZnJlZShwRmlsZVN0YXJ0KTsKIGVycl9mdzoKQEAgLTIxOCw3ICsyMjgsNyBAQAogCURFQlVHKCJJbiBkaXNjb25uZWN0IHBmdDEwMDBpbmZvPSVwXG4iLCBwZnQxMDAwaW5mbyk7CiAKIAlpZiAocGZ0MTAwMGluZm8pIHsKLQkJZnQxMDAwQ2xlYW51cFByb2MocGZ0MTAwMGluZm8pOworCQlmdDEwMDBfY2xlYW51cF9wcm9jKHBmdDEwMDBpbmZvKTsKIAkJaWYgKHBmdDEwMDBpbmZvLT5wUG9sbFRocmVhZCkKIAkJCWt0aHJlYWRfc3RvcChwZnQxMDAwaW5mby0+cFBvbGxUaHJlYWQpOwogCkBAIC0yMjYsNyArMjM2LDcgQEAKIAogCQlpZiAocGZ0MTAwMGluZm8tPnBGdDEwMDBEZXYtPm5ldCkgewogCQkJREVCVUcoImZ0MTAwMF9kaXNjb25uZWN0OiBkZXN0cm95IGNoYXIgZHJpdmVyXG4iKTsKLQkJCWZ0MTAwMF9EZXN0cm95RGV2aWNlKHBmdDEwMDBpbmZvLT5wRnQxMDAwRGV2LT5uZXQpOworCQkJZnQxMDAwX2Rlc3Ryb3lfZGV2KHBmdDEwMDBpbmZvLT5wRnQxMDAwRGV2LT5uZXQpOwogCQkJdW5yZWdpc3Rlcl9uZXRkZXYocGZ0MTAwMGluZm8tPnBGdDEwMDBEZXYtPm5ldCk7CiAJCQlERUJVRwogCQkJICAgICgiZnQxMDAwX2Rpc2Nvbm5lY3Q6IG5ldHdvcmsgZGV2aWNlIHVucmVnaXN0ZXJkXG4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9mdDEwMDAvZnQxMDAwLXVzYi9mdDEwMDBfdXNiLmggYi9kcml2ZXJzL3N0YWdpbmcvZnQxMDAwL2Z0MTAwMC11c2IvZnQxMDAwX3VzYi5oCmluZGV4IGE5ZDQxOWEuLmExNDNlOWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9mdDEwMDAvZnQxMDAwLXVzYi9mdDEwMDBfdXNiLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2Z0MTAwMC9mdDEwMDAtdXNiL2Z0MTAwMF91c2IuaApAQCAtOTgsMTYgKzk4LDYgQEAKIC8qZW5kIG9mIEppbSovCiAjZGVmaW5lIERFQlVHKGFyZ3MuLi4pIHByaW50ayhLRVJOX0lORk8gYXJncykKIAotI2RlZmluZSBVQ0hBUiAgICAgICAgICAgICAgIHU4Ci0jZGVmaW5lIFVTSE9SVCAgICAgICAgICAgICAgdTE2Ci0jZGVmaW5lIFVMT05HICAgICAgICAgICAgICAgdTMyIC8qIFdURiA/Pz8gKi8KLSNkZWZpbmUgQk9PTEVBTiAgICAgICAgICAgICB1OAotI2RlZmluZSBQVUxPTkcgICAgICAgICAgICAgIHUzMiAqCi0jZGVmaW5lIFBVU0hPUlQgICAgICAgICAgICAgdTE2ICoKLSNkZWZpbmUgUFVDSEFSICAgICAgICAgICAgICB1OCAqCi0jZGVmaW5lIFBDSEFSICAgICAgICAgICAgICAgdTggKgotI2RlZmluZSBVSU5UICAgICAgICAgICAgICAgIHUzMgotCiAjZGVmaW5lIEZBTFNFICAgICAgICAgICAwCiAjZGVmaW5lIFRSVUUgICAgICAgICAgICAxCiAKQEAgLTM3MiwxNSArMzYyLDE1IEBACiAKIAogCi0jZGVmaW5lIElTUl9FTVBUWQkJCShVQ0hBUikweDAwIAkgLy8gbm8gYml0cyBzZXQgaW4gSVNSCisjZGVmaW5lIElTUl9FTVBUWQkJCSh1OCkweDAwIAkgLy8gbm8gYml0cyBzZXQgaW4gSVNSCiAKLSNkZWZpbmUgSVNSX0RPT1JCRUxMX0FDSwkoVUNIQVIpMHgwMQkJIC8vICB0aGUgZG9vcmJlbGwgaSBzZW50IGhhcyBiZWVuIHJlY2lldmVkLgorI2RlZmluZSBJU1JfRE9PUkJFTExfQUNLCSh1OCkweDAxCQkgLy8gIHRoZSBkb29yYmVsbCBpIHNlbnQgaGFzIGJlZW4gcmVjaWV2ZWQuCiAKLSNkZWZpbmUgSVNSX0RPT1JCRUxMX1BFTkQJKFVDSEFSKTB4MDIgCSAvLyAgZG9vcmJlbGwgZm9yIG1lCisjZGVmaW5lIElTUl9ET09SQkVMTF9QRU5ECSh1OCkweDAyIAkgLy8gIGRvb3JiZWxsIGZvciBtZQogCi0jZGVmaW5lIElTUl9SQ1YJCQkJKFVDSEFSKTB4MDQgCSAvLyBwYWNrZXQgcmVjZWl2ZWQgd2l0aCBubyBlcnJvcnMKKyNkZWZpbmUgSVNSX1JDVgkJCQkodTgpMHgwNCAJIC8vIHBhY2tldCByZWNlaXZlZCB3aXRoIG5vIGVycm9ycwogCi0jZGVmaW5lIElTUl9XQVRFUk1BUksJCShVQ0hBUikweDA4IAkgLy8KKyNkZWZpbmUgSVNSX1dBVEVSTUFSSwkJKHU4KTB4MDggCSAvLwogCiAKIApAQCAtNDY2LDEyICs0NTYsOSBAQAogewogCXN0cnVjdCB1c2JfZGV2aWNlICpkZXY7CiAJc3RydWN0IG5ldF9kZXZpY2UgKm5ldDsKLQlzcGlubG9ja190IGRldmljZV9sb2NrOwogCiAJdTMyIHN0YXR1czsKIAotCXdhaXRfcXVldWVfaGVhZF90IGNvbnRyb2xfd2FpdDsKLQogCXN0cnVjdCB1cmIgKnJ4X3VyYjsKIAlzdHJ1Y3QgdXJiICp0eF91cmI7CiAKQEAgLTQ4Niw2ICs0NzMsMTMgQEAKIC8vCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOyAvL21iZWxpYW4KIH0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwogCitzdHJ1Y3QgZnQxMDAwX2RlYnVnX2RpcnMgeworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwlzdHJ1Y3QgZGVudHJ5ICpkZW50OworCXN0cnVjdCBkZW50cnkgKmZpbGU7CisJaW50IGludF9udW1iZXI7Cit9OworCiBzdHJ1Y3QgZnQxMDAwX2luZm8gewogICAgIHN0cnVjdCBmdDEwMDBfZGV2aWNlICpwRnQxMDAwRGV2OwogICAgIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOwpAQCAtNDk3LDkgKzQ5MSw5IEBACiAJdW5zaWduZWQgY2hhciB1c2Jib290OwogICAgIHVuc2lnbmVkIHNob3J0IGRzcGFsaXZlOwogICAgIHUxNiBBU0lDX0lEOwotICAgIEJPT0xFQU4gZlByb3ZDb21wbGV0ZTsKLSAgICBCT09MRUFOIGZDb25kUmVzZXRQZW5kOwotICAgIEJPT0xFQU4gZkFwcE1zZ1BlbmQ7CisgICAgYm9vbCBmUHJvdkNvbXBsZXRlOworICAgIGJvb2wgZkNvbmRSZXNldFBlbmQ7CisgICAgYm9vbCBmQXBwTXNnUGVuZDsKICAgICBjaGFyICpwZndpbWc7CiAgICAgaW50IGZ3aW1nc3o7CiAgICAgdTE2IERydkVyck51bTsKQEAgLTUyMCw3ICs1MTQsNyBAQAogICAgIGludCBOZXREZXZSZWdEb25lOwogICAgIHU4IENhcmROdW1iZXI7CiAgICAgdTggRGV2aWNlTmFtZVsxNV07Ci0gICAgaW50IERldmljZU1ham9yOworICAgIHN0cnVjdCBmdDEwMDBfZGVidWdfZGlycyBub2RlczsKICAgICBpbnQgcmVnaXN0ZXJlZDsKICAgICBpbnQgbWVkaWFzdGF0ZTsKICAgICBpbnQgZGhjcGZsZzsKQEAgLTU2NywyNiArNTYxLDI2IEBACiB9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKIAogdTE2IGZ0MTAwMF9yZWFkX3JlZ2lzdGVyKHN0cnVjdCBmdDEwMDBfZGV2aWNlICpmdDEwMDBkZXYsIHUxNiogRGF0YSwgdTE2IG5SZWdJbmR4KTsKLXUxNiBmdDEwMDBfd3JpdGVfcmVnaXN0ZXIoc3RydWN0IGZ0MTAwMF9kZXZpY2UgKmZ0MTAwMGRldiwgVVNIT1JUIHZhbHVlLCB1MTYgblJlZ0luZHgpOwotdTE2IGZ0MTAwMF9yZWFkX2RwcmFtMzIoc3RydWN0IGZ0MTAwMF9kZXZpY2UgKmZ0MTAwMGRldiwgVVNIT1JUIGluZHgsIFBVQ0hBUiBidWZmZXIsIFVTSE9SVCBjbnQpOwotdTE2IGZ0MTAwMF93cml0ZV9kcHJhbTMyKHN0cnVjdCBmdDEwMDBfZGV2aWNlICpmdDEwMDBkZXYsIFVTSE9SVCBpbmR4LCBQVUNIQVIgYnVmZmVyLCBVU0hPUlQgY250KTsKLXUxNiBmdDEwMDBfcmVhZF9kcHJhbTE2KHN0cnVjdCBmdDEwMDBfZGV2aWNlICpmdDEwMDBkZXYsIFVTSE9SVCBpbmR4LCBQVUNIQVIgYnVmZmVyLCB1OCBoaWdobG93KTsKLXUxNiBmdDEwMDBfd3JpdGVfZHByYW0xNihzdHJ1Y3QgZnQxMDAwX2RldmljZSAqZnQxMDAwZGV2LCBVU0hPUlQgaW5keCwgVVNIT1JUIHZhbHVlLCB1OCBoaWdobG93KTsKLXUxNiBmaXhfZnQxMDAwX3JlYWRfZHByYW0zMihzdHJ1Y3QgZnQxMDAwX2RldmljZSAqZnQxMDAwZGV2LCBVU0hPUlQgaW5keCwgUFVDSEFSIGJ1ZmZlcik7Ci11MTYgZml4X2Z0MTAwMF93cml0ZV9kcHJhbTMyKHN0cnVjdCBmdDEwMDBfZGV2aWNlICpmdDEwMDBkZXYsIFVTSE9SVCBpbmR4LCBQVUNIQVIgYnVmZmVyKTsKK3UxNiBmdDEwMDBfd3JpdGVfcmVnaXN0ZXIoc3RydWN0IGZ0MTAwMF9kZXZpY2UgKmZ0MTAwMGRldiwgdTE2IHZhbHVlLCB1MTYgblJlZ0luZHgpOwordTE2IGZ0MTAwMF9yZWFkX2RwcmFtMzIoc3RydWN0IGZ0MTAwMF9kZXZpY2UgKmZ0MTAwMGRldiwgdTE2IGluZHgsIHU4ICpidWZmZXIsIHUxNiBjbnQpOwordTE2IGZ0MTAwMF93cml0ZV9kcHJhbTMyKHN0cnVjdCBmdDEwMDBfZGV2aWNlICpmdDEwMDBkZXYsIHUxNiBpbmR4LCB1OCAqYnVmZmVyLCB1MTYgY250KTsKK3UxNiBmdDEwMDBfcmVhZF9kcHJhbTE2KHN0cnVjdCBmdDEwMDBfZGV2aWNlICpmdDEwMDBkZXYsIHUxNiBpbmR4LCB1OCAqYnVmZmVyLCB1OCBoaWdobG93KTsKK3UxNiBmdDEwMDBfd3JpdGVfZHByYW0xNihzdHJ1Y3QgZnQxMDAwX2RldmljZSAqZnQxMDAwZGV2LCB1MTYgaW5keCwgdTE2IHZhbHVlLCB1OCBoaWdobG93KTsKK3UxNiBmaXhfZnQxMDAwX3JlYWRfZHByYW0zMihzdHJ1Y3QgZnQxMDAwX2RldmljZSAqZnQxMDAwZGV2LCB1MTYgaW5keCwgdTggKmJ1ZmZlcik7Cit1MTYgZml4X2Z0MTAwMF93cml0ZV9kcHJhbTMyKHN0cnVjdCBmdDEwMDBfZGV2aWNlICpmdDEwMDBkZXYsIHUxNiBpbmR4LCB1OCAqYnVmZmVyKTsKIAogZXh0ZXJuIHZvaWQgKnBGaWxlU3RhcnQ7CiBleHRlcm4gc2l6ZV90IEZpbGVMZW5ndGg7CiBleHRlcm4gaW50IG51bW9mbXNnYnVmOwogCiBpbnQgZnQxMDAwX2Nsb3NlIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKLXUxNiBzY3JhbV9kbmxkcihzdHJ1Y3QgZnQxMDAwX2RldmljZSAqZnQxMDAwZGV2LCB2b2lkICpwRmlsZVN0YXJ0LCBVTE9ORyAgRmlsZUxlbmd0aCk7Cit1MTYgc2NyYW1fZG5sZHIoc3RydWN0IGZ0MTAwMF9kZXZpY2UgKmZ0MTAwMGRldiwgdm9pZCAqcEZpbGVTdGFydCwgdTMyICBGaWxlTGVuZ3RoKTsKIAogZXh0ZXJuIHN0cnVjdCBsaXN0X2hlYWQgZnJlZXJjdnBvb2w7CiBleHRlcm4gc3BpbmxvY2tfdCBmcmVlX2J1ZmZfbG9jazsgICAvLyBsb2NrIHRvIGFyYml0cmF0ZSBmcmVlIGJ1ZmZlciBsaXN0IGZvciByZWNlaXZlIGNvbW1hbmQgZGF0YQogCi1pbnQgZnQxMDAwX0NyZWF0ZURldmljZShzdHJ1Y3QgZnQxMDAwX2RldmljZSAqZGV2KTsKLXZvaWQgZnQxMDAwX0Rlc3Ryb3lEZXZpY2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitpbnQgZnQxMDAwX2NyZWF0ZV9kZXYoc3RydWN0IGZ0MTAwMF9kZXZpY2UgKmRldik7Cit2b2lkIGZ0MTAwMF9kZXN0cm95X2RldihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIGV4dGVybiB2b2lkIENhcmRTZW5kQ29tbWFuZChzdHJ1Y3QgZnQxMDAwX2RldmljZSAqZnQxMDAwZGV2LCB2b2lkICpwdGVtcGJ1ZmZlciwgaW50IHNpemUpOwogCiBzdHJ1Y3QgZHByYW1fYmxrICpmdDEwMDBfZ2V0X2J1ZmZlcihzdHJ1Y3QgbGlzdF9oZWFkICpidWZmbGlzdCk7CkBAIC02MDAsOCArNTk0LDggQEAKIGludCByZWdfZnQxMDAwX25ldGRldihzdHJ1Y3QgZnQxMDAwX2RldmljZSAqZnQxMDAwZGV2LCBzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50Zik7CiBpbnQgZnQxMDAwX3BvbGwodm9pZCogZGV2X2lkKTsKIAotdm9pZCBmdDEwMDBJbml0UHJvYyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKLXZvaWQgZnQxMDAwQ2xlYW51cFByb2Moc3RydWN0IGZ0MTAwMF9pbmZvICppbmZvKTsKK2ludCBmdDEwMDBfaW5pdF9wcm9jKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwordm9pZCBmdDEwMDBfY2xlYW51cF9wcm9jKHN0cnVjdCBmdDEwMDBfaW5mbyAqaW5mbyk7CiAKIAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZ283MDA3L2dvNzAwNy1kcml2ZXIuYyBiL2RyaXZlcnMvc3RhZ2luZy9nbzcwMDcvZ283MDA3LWRyaXZlci5jCmluZGV4IDQ4ZDRlNDguLjZjOTI3OWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9nbzcwMDcvZ283MDA3LWRyaXZlci5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9nbzcwMDcvZ283MDA3LWRyaXZlci5jCkBAIC02MjQsNyArNjI0LDcgQEAKIAlnby0+ZHZkX21vZGUgPSAwOwogCWdvLT5pbnRlcmxhY2VfY29kaW5nID0gMDsKIAlmb3IgKGkgPSAwOyBpIDwgNDsgKytpKQotCQlnby0+bW9kZXRbaV0uZW5hYmxlID0gMDs7CisJCWdvLT5tb2RldFtpXS5lbmFibGUgPSAwOwogCWZvciAoaSA9IDA7IGkgPCAxNjI0OyArK2kpCiAJCWdvLT5tb2RldF9tYXBbaV0gPSAwOwogCWdvLT5hdWRpb19kZWxpdmVyID0gTlVMTDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9odi9NYWtlZmlsZSBiL2RyaXZlcnMvc3RhZ2luZy9odi9NYWtlZmlsZQppbmRleCBiNDYzNDliLi5hY2QzOWJkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaHYvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9zdGFnaW5nL2h2L01ha2VmaWxlCkBAIC01LDcgKzUsNyBAQAogb2JqLSQoQ09ORklHX0hZUEVSVl9VVElMUykJKz0gaHZfdXRpbHMubwogCiBodl92bWJ1cy15IDo9IHZtYnVzX2Rydi5vIG9zZC5vIFwKLQkJIHZtYnVzLm8gaHYubyBjb25uZWN0aW9uLm8gY2hhbm5lbC5vIFwKKwkJIGh2Lm8gY29ubmVjdGlvbi5vIGNoYW5uZWwubyBcCiAJCSBjaGFubmVsX21nbXQubyByaW5nX2J1ZmZlci5vCiBodl9zdG9ydnNjLXkgOj0gc3RvcnZzY19kcnYubyBzdG9ydnNjLm8KIGh2X2Jsa3ZzYy15IDo9IGJsa3ZzY19kcnYubyBibGt2c2MubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2h2L2Jsa3ZzYy5jIGIvZHJpdmVycy9zdGFnaW5nL2h2L2Jsa3ZzYy5jCmluZGV4IGQ1YjBhYmQuLmJjMTZkOTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9odi9ibGt2c2MuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaHYvYmxrdnNjLmMKQEAgLTI1LDI0ICsyNSwyNCBAQAogI2luY2x1ZGUgIm9zZC5oIgogI2luY2x1ZGUgInN0b3J2c2MuYyIKIAotc3RhdGljIGNvbnN0IGNoYXIgKmdCbGtEcml2ZXJOYW1lID0gImJsa3ZzYyI7CitzdGF0aWMgY29uc3QgY2hhciAqZ19ibGtfZHJpdmVyX25hbWUgPSAiYmxrdnNjIjsKIAogLyogezMyNDEyNjMyLTg2Y2ItNDRhMi05YjVjLTUwZDE0MTczNTRmNX0gKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaHZfZ3VpZCBnQmxrVnNjRGV2aWNlVHlwZSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaHZfZ3VpZCBnX2Jsa19kZXZpY2VfdHlwZSA9IHsKIAkuZGF0YSA9IHsKIAkJMHgzMiwgMHgyNiwgMHg0MSwgMHgzMiwgMHhjYiwgMHg4NiwgMHhhMiwgMHg0NCwKIAkJMHg5YiwgMHg1YywgMHg1MCwgMHhkMSwgMHg0MSwgMHg3MywgMHg1NCwgMHhmNQogCX0KIH07CiAKLXN0YXRpYyBpbnQgQmxrVnNjT25EZXZpY2VBZGQoc3RydWN0IGh2X2RldmljZSAqRGV2aWNlLCB2b2lkICpBZGRpdGlvbmFsSW5mbykKK3N0YXRpYyBpbnQgYmxrX3ZzY19vbl9kZXZpY2VfYWRkKHN0cnVjdCBodl9kZXZpY2UgKmRldmljZSwgdm9pZCAqYWRkaXRpb25hbF9pbmZvKQogewotCXN0cnVjdCBzdG9ydnNjX2RldmljZV9pbmZvICpkZXZpY2VJbmZvOworCXN0cnVjdCBzdG9ydnNjX2RldmljZV9pbmZvICpkZXZpY2VfaW5mbzsKIAlpbnQgcmV0ID0gMDsKIAotCWRldmljZUluZm8gPSAoc3RydWN0IHN0b3J2c2NfZGV2aWNlX2luZm8gKilBZGRpdGlvbmFsSW5mbzsKKwlkZXZpY2VfaW5mbyA9IChzdHJ1Y3Qgc3RvcnZzY19kZXZpY2VfaW5mbyAqKWFkZGl0aW9uYWxfaW5mbzsKIAotCXJldCA9IFN0b3JWc2NPbkRldmljZUFkZChEZXZpY2UsIEFkZGl0aW9uYWxJbmZvKTsKKwlyZXQgPSBzdG9yX3ZzY19vbl9kZXZpY2VfYWRkKGRldmljZSwgYWRkaXRpb25hbF9pbmZvKTsKIAlpZiAocmV0ICE9IDApCiAJCXJldHVybiByZXQ7CiAKQEAgLTUxLDMxICs1MSwzMSBAQAogCSAqIGlkLiBGb3IgSURFIGRldmljZXMsIHRoZSBkZXZpY2UgaW5zdGFuY2UgaWQgaXMgZm9ybWF0dGVkIGFzCiAJICogPGJ1cyBpZD4gKiAtIDxkZXZpY2UgaWQ+IC0gODg5OSAtIDAwMDAwMDAwMDAwMC4KIAkgKi8KLQlkZXZpY2VJbmZvLT5QYXRoSWQgPSBEZXZpY2UtPmRldmljZUluc3RhbmNlLmRhdGFbM10gPDwgMjQgfAotCQkJICAgICBEZXZpY2UtPmRldmljZUluc3RhbmNlLmRhdGFbMl0gPDwgMTYgfAotCQkJICAgICBEZXZpY2UtPmRldmljZUluc3RhbmNlLmRhdGFbMV0gPDwgOCAgfAotCQkJICAgICBEZXZpY2UtPmRldmljZUluc3RhbmNlLmRhdGFbMF07CisJZGV2aWNlX2luZm8tPnBhdGhfaWQgPSBkZXZpY2UtPmRldmljZUluc3RhbmNlLmRhdGFbM10gPDwgMjQgfAorCQkJICAgICBkZXZpY2UtPmRldmljZUluc3RhbmNlLmRhdGFbMl0gPDwgMTYgfAorCQkJICAgICBkZXZpY2UtPmRldmljZUluc3RhbmNlLmRhdGFbMV0gPDwgOCAgfAorCQkJICAgICBkZXZpY2UtPmRldmljZUluc3RhbmNlLmRhdGFbMF07CiAKLQlkZXZpY2VJbmZvLT5UYXJnZXRJZCA9IERldmljZS0+ZGV2aWNlSW5zdGFuY2UuZGF0YVs1XSA8PCA4IHwKLQkJCSAgICAgICBEZXZpY2UtPmRldmljZUluc3RhbmNlLmRhdGFbNF07CisJZGV2aWNlX2luZm8tPnRhcmdldF9pZCA9IGRldmljZS0+ZGV2aWNlSW5zdGFuY2UuZGF0YVs1XSA8PCA4IHwKKwkJCSAgICAgICBkZXZpY2UtPmRldmljZUluc3RhbmNlLmRhdGFbNF07CiAKIAlyZXR1cm4gcmV0OwogfQogCi1pbnQgQmxrVnNjSW5pdGlhbGl6ZShzdHJ1Y3QgaHZfZHJpdmVyICpEcml2ZXIpCitpbnQgYmxrX3ZzY19pbml0aWFsaXplKHN0cnVjdCBodl9kcml2ZXIgKmRyaXZlcikKIHsKLQlzdHJ1Y3Qgc3RvcnZzY19kcml2ZXJfb2JqZWN0ICpzdG9yRHJpdmVyOworCXN0cnVjdCBzdG9ydnNjX2RyaXZlcl9vYmplY3QgKnN0b3JfZHJpdmVyOwogCWludCByZXQgPSAwOwogCi0Jc3RvckRyaXZlciA9IChzdHJ1Y3Qgc3RvcnZzY19kcml2ZXJfb2JqZWN0ICopRHJpdmVyOworCXN0b3JfZHJpdmVyID0gKHN0cnVjdCBzdG9ydnNjX2RyaXZlcl9vYmplY3QgKilkcml2ZXI7CiAKIAkvKiBNYWtlIHN1cmUgd2UgYXJlIGF0IGxlYXN0IDIgcGFnZXMgc2luY2UgMSBwYWdlIGlzIHVzZWQgZm9yIGNvbnRyb2wgKi8KLQkvKiBBU1NFUlQoc3RvckRyaXZlci0+UmluZ0J1ZmZlclNpemUgPj0gKFBBR0VfU0laRSA8PCAxKSk7ICovCisJLyogQVNTRVJUKHN0b3JfZHJpdmVyLT5SaW5nQnVmZmVyU2l6ZSA+PSAoUEFHRV9TSVpFIDw8IDEpKTsgKi8KIAotCURyaXZlci0+bmFtZSA9IGdCbGtEcml2ZXJOYW1lOwotCW1lbWNweSgmRHJpdmVyLT5kZXZpY2VUeXBlLCAmZ0Jsa1ZzY0RldmljZVR5cGUsIHNpemVvZihzdHJ1Y3QgaHZfZ3VpZCkpOworCWRyaXZlci0+bmFtZSA9IGdfYmxrX2RyaXZlcl9uYW1lOworCW1lbWNweSgmZHJpdmVyLT5kZXZpY2VUeXBlLCAmZ19ibGtfZGV2aWNlX3R5cGUsIHNpemVvZihzdHJ1Y3QgaHZfZ3VpZCkpOwogCi0Jc3RvckRyaXZlci0+UmVxdWVzdEV4dFNpemUgPSBzaXplb2Yoc3RydWN0IHN0b3J2c2NfcmVxdWVzdF9leHRlbnNpb24pOworCXN0b3JfZHJpdmVyLT5yZXF1ZXN0X2V4dF9zaXplID0gc2l6ZW9mKHN0cnVjdCBzdG9ydnNjX3JlcXVlc3RfZXh0ZW5zaW9uKTsKIAogCS8qCiAJICogRGl2aWRlIHRoZSByaW5nIGJ1ZmZlciBkYXRhIHNpemUgKHdoaWNoIGlzIDEgcGFnZSBsZXNzIHRoYW4gdGhlIHJpbmcKQEAgLTgzLDIwICs4MywyMCBAQAogCSAqIGJ5IHRoZSBtYXggcmVxdWVzdCBzaXplICh3aGljaCBpcwogCSAqIHZtYnVzX2NoYW5uZWxfcGFja2V0X211bHRpcGFnZV9idWZmZXIgKyBzdHJ1Y3QgdnN0b3JfcGFja2V0ICsgdTY0KQogCSAqLwotCXN0b3JEcml2ZXItPk1heE91dHN0YW5kaW5nUmVxdWVzdHNQZXJDaGFubmVsID0KLQkJKChzdG9yRHJpdmVyLT5SaW5nQnVmZmVyU2l6ZSAtIFBBR0VfU0laRSkgLworCXN0b3JfZHJpdmVyLT5tYXhfb3V0c3RhbmRpbmdfcmVxX3Blcl9jaGFubmVsID0KKwkJKChzdG9yX2RyaXZlci0+cmluZ19idWZmZXJfc2l6ZSAtIFBBR0VfU0laRSkgLwogCQkgIEFMSUdOX1VQKE1BWF9NVUxUSVBBR0VfQlVGRkVSX1BBQ0tFVCArCiAJCQkgICBzaXplb2Yoc3RydWN0IHZzdG9yX3BhY2tldCkgKyBzaXplb2YodTY0KSwKIAkJCSAgIHNpemVvZih1NjQpKSk7CiAKIAlEUFJJTlRfSU5GTyhCTEtWU0MsICJtYXggaW8gb3V0c3RkICV1IiwKLQkJICAgIHN0b3JEcml2ZXItPk1heE91dHN0YW5kaW5nUmVxdWVzdHNQZXJDaGFubmVsKTsKKwkJICAgIHN0b3JfZHJpdmVyLT5tYXhfb3V0c3RhbmRpbmdfcmVxX3Blcl9jaGFubmVsKTsKIAogCS8qIFNldHVwIHRoZSBkaXNwYXRjaCB0YWJsZSAqLwotCXN0b3JEcml2ZXItPkJhc2UuT25EZXZpY2VBZGQgPSBCbGtWc2NPbkRldmljZUFkZDsKLQlzdG9yRHJpdmVyLT5CYXNlLk9uRGV2aWNlUmVtb3ZlID0gU3RvclZzY09uRGV2aWNlUmVtb3ZlOwotCXN0b3JEcml2ZXItPkJhc2UuT25DbGVhbnVwID0gU3RvclZzY09uQ2xlYW51cDsKLQlzdG9yRHJpdmVyLT5PbklPUmVxdWVzdAk9IFN0b3JWc2NPbklPUmVxdWVzdDsKKwlzdG9yX2RyaXZlci0+YmFzZS5PbkRldmljZUFkZCA9IGJsa192c2Nfb25fZGV2aWNlX2FkZDsKKwlzdG9yX2RyaXZlci0+YmFzZS5PbkRldmljZVJlbW92ZSA9IHN0b3JfdnNjX29uX2RldmljZV9yZW1vdmU7CisJc3Rvcl9kcml2ZXItPmJhc2UuT25DbGVhbnVwID0gc3Rvcl92c2Nfb25fY2xlYW51cDsKKwlzdG9yX2RyaXZlci0+b25faW9fcmVxdWVzdCA9IHN0b3JfdnNjX29uX2lvX3JlcXVlc3Q7CiAKIAlyZXR1cm4gcmV0OwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2h2L2Jsa3ZzY19kcnYuYyBiL2RyaXZlcnMvc3RhZ2luZy9odi9ibGt2c2NfZHJ2LmMKaW5kZXggM2Y4MWNhNS4uYjNkMDVmYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2h2L2Jsa3ZzY19kcnYuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaHYvYmxrdnNjX2Rydi5jCkBAIC0xNzcsMTMgKzE3NywxMyBAQAogCXN0cnVjdCBkcml2ZXJfY29udGV4dCAqZHJ2X2N0eCA9ICZnX2Jsa3ZzY19kcnYuZHJ2X2N0eDsKIAlpbnQgcmV0OwogCi0Jc3RvcnZzY19kcnZfb2JqLT5SaW5nQnVmZmVyU2l6ZSA9IGJsa3ZzY19yaW5nYnVmZmVyX3NpemU7CisJc3RvcnZzY19kcnZfb2JqLT5yaW5nX2J1ZmZlcl9zaXplID0gYmxrdnNjX3JpbmdidWZmZXJfc2l6ZTsKIAogCS8qIENhbGxiYWNrIHRvIGNsaWVudCBkcml2ZXIgdG8gY29tcGxldGUgdGhlIGluaXRpYWxpemF0aW9uICovCi0JZHJ2X2luaXQoJnN0b3J2c2NfZHJ2X29iai0+QmFzZSk7CisJZHJ2X2luaXQoJnN0b3J2c2NfZHJ2X29iai0+YmFzZSk7CiAKLQlkcnZfY3R4LT5kcml2ZXIubmFtZSA9IHN0b3J2c2NfZHJ2X29iai0+QmFzZS5uYW1lOwotCW1lbWNweSgmZHJ2X2N0eC0+Y2xhc3NfaWQsICZzdG9ydnNjX2Rydl9vYmotPkJhc2UuZGV2aWNlVHlwZSwKKwlkcnZfY3R4LT5kcml2ZXIubmFtZSA9IHN0b3J2c2NfZHJ2X29iai0+YmFzZS5uYW1lOworCW1lbWNweSgmZHJ2X2N0eC0+Y2xhc3NfaWQsICZzdG9ydnNjX2Rydl9vYmotPmJhc2UuZGV2aWNlVHlwZSwKIAkgICAgICAgc2l6ZW9mKHN0cnVjdCBodl9ndWlkKSk7CiAKIAlkcnZfY3R4LT5wcm9iZSA9IGJsa3ZzY19wcm9iZTsKQEAgLTIzMCw4ICsyMzAsOCBAQAogCQlkZXZpY2VfdW5yZWdpc3RlcihjdXJyZW50X2Rldik7CiAJfQogCi0JaWYgKHN0b3J2c2NfZHJ2X29iai0+QmFzZS5PbkNsZWFudXApCi0JCXN0b3J2c2NfZHJ2X29iai0+QmFzZS5PbkNsZWFudXAoJnN0b3J2c2NfZHJ2X29iai0+QmFzZSk7CisJaWYgKHN0b3J2c2NfZHJ2X29iai0+YmFzZS5PbkNsZWFudXApCisJCXN0b3J2c2NfZHJ2X29iai0+YmFzZS5PbkNsZWFudXAoJnN0b3J2c2NfZHJ2X29iai0+YmFzZSk7CiAKIAl2bWJ1c19jaGlsZF9kcml2ZXJfdW5yZWdpc3RlcihkcnZfY3R4KTsKIApAQCAtMjYyLDcgKzI2Miw3IEBACiAKIAlEUFJJTlRfREJHKEJMS1ZTQ19EUlYsICJibGt2c2NfcHJvYmUgLSBlbnRlciIpOwogCi0JaWYgKCFzdG9ydnNjX2Rydl9vYmotPkJhc2UuT25EZXZpY2VBZGQpIHsKKwlpZiAoIXN0b3J2c2NfZHJ2X29iai0+YmFzZS5PbkRldmljZUFkZCkgewogCQlEUFJJTlRfRVJSKEJMS1ZTQ19EUlYsICJPbkRldmljZUFkZCgpIG5vdCBzZXQiKTsKIAkJcmV0ID0gLTE7CiAJCWdvdG8gQ2xlYW51cDsKQEAgLTI4NCw3ICsyODQsNyBAQAogCiAJYmxrZGV2LT5yZXF1ZXN0X3Bvb2wgPSBrbWVtX2NhY2hlX2NyZWF0ZShkZXZfbmFtZSgmZGV2aWNlX2N0eC0+ZGV2aWNlKSwKIAkJCQkJc2l6ZW9mKHN0cnVjdCBibGt2c2NfcmVxdWVzdCkgKwotCQkJCQlzdG9ydnNjX2Rydl9vYmotPlJlcXVlc3RFeHRTaXplLCAwLAorCQkJCQlzdG9ydnNjX2Rydl9vYmotPnJlcXVlc3RfZXh0X3NpemUsIDAsCiAJCQkJCVNMQUJfSFdDQUNIRV9BTElHTiwgTlVMTCk7CiAJaWYgKCFibGtkZXYtPnJlcXVlc3RfcG9vbCkgewogCQlyZXQgPSAtRU5PTUVNOwpAQCAtMjkzLDcgKzI5Myw3IEBACiAKIAogCS8qIENhbGwgdG8gdGhlIHZzYyBkcml2ZXIgdG8gYWRkIHRoZSBkZXZpY2UgKi8KLQlyZXQgPSBzdG9ydnNjX2Rydl9vYmotPkJhc2UuT25EZXZpY2VBZGQoZGV2aWNlX29iaiwgJmRldmljZV9pbmZvKTsKKwlyZXQgPSBzdG9ydnNjX2Rydl9vYmotPmJhc2UuT25EZXZpY2VBZGQoZGV2aWNlX29iaiwgJmRldmljZV9pbmZvKTsKIAlpZiAocmV0ICE9IDApIHsKIAkJRFBSSU5UX0VSUihCTEtWU0NfRFJWLCAidW5hYmxlIHRvIGFkZCBibGt2c2MgZGV2aWNlIik7CiAJCWdvdG8gQ2xlYW51cDsKQEAgLTMwMSw5ICszMDEsOSBAQAogCiAJYmxrZGV2LT5kZXZpY2VfY3R4ID0gZGV2aWNlX2N0eDsKIAkvKiB0aGlzIGlkZW50aWZpZWQgdGhlIGRldmljZSAwIG9yIDEgKi8KLQlibGtkZXYtPnRhcmdldCA9IGRldmljZV9pbmZvLlRhcmdldElkOworCWJsa2Rldi0+dGFyZ2V0ID0gZGV2aWNlX2luZm8udGFyZ2V0X2lkOwogCS8qIHRoaXMgaWRlbnRpZmllZCB0aGUgaWRlIGN0cmwgMCBvciAxICovCi0JYmxrZGV2LT5wYXRoID0gZGV2aWNlX2luZm8uUGF0aElkOworCWJsa2Rldi0+cGF0aCA9IGRldmljZV9pbmZvLnBhdGhfaWQ7CiAKIAlkZXZfc2V0X2RydmRhdGEoZGV2aWNlLCBibGtkZXYpOwogCkBAIC0zOTEsNyArMzkxLDcgQEAKIAlyZXR1cm4gcmV0OwogCiBSZW1vdmU6Ci0Jc3RvcnZzY19kcnZfb2JqLT5CYXNlLk9uRGV2aWNlUmVtb3ZlKGRldmljZV9vYmopOworCXN0b3J2c2NfZHJ2X29iai0+YmFzZS5PbkRldmljZVJlbW92ZShkZXZpY2Vfb2JqKTsKIAogQ2xlYW51cDoKIAlpZiAoYmxrZGV2KSB7CkBAIC00NTksOSArNDU5LDkgQEAKIAlibGt2c2NfcmVxLT5yZXEgPSBOVUxMOwogCWJsa3ZzY19yZXEtPndyaXRlID0gMDsKIAotCWJsa3ZzY19yZXEtPnJlcXVlc3QuRGF0YUJ1ZmZlci5QZm5BcnJheVswXSA9IDA7Ci0JYmxrdnNjX3JlcS0+cmVxdWVzdC5EYXRhQnVmZmVyLk9mZnNldCA9IDA7Ci0JYmxrdnNjX3JlcS0+cmVxdWVzdC5EYXRhQnVmZmVyLkxlbmd0aCA9IDA7CisJYmxrdnNjX3JlcS0+cmVxdWVzdC5kYXRhX2J1ZmZlci5QZm5BcnJheVswXSA9IDA7CisJYmxrdnNjX3JlcS0+cmVxdWVzdC5kYXRhX2J1ZmZlci5PZmZzZXQgPSAwOworCWJsa3ZzY19yZXEtPnJlcXVlc3QuZGF0YV9idWZmZXIuTGVuZ3RoID0gMDsKIAogCWJsa3ZzY19yZXEtPmNtbmRbMF0gPSBTWU5DSFJPTklaRV9DQUNIRTsKIAlibGt2c2NfcmVxLT5jbWRfbGVuID0gMTA7CkBAIC01MDYsOSArNTA2LDkgQEAKIAlibGt2c2NfcmVxLT5yZXEgPSBOVUxMOwogCWJsa3ZzY19yZXEtPndyaXRlID0gMDsKIAotCWJsa3ZzY19yZXEtPnJlcXVlc3QuRGF0YUJ1ZmZlci5QZm5BcnJheVswXSA9IHBhZ2VfdG9fcGZuKHBhZ2VfYnVmKTsKLQlibGt2c2NfcmVxLT5yZXF1ZXN0LkRhdGFCdWZmZXIuT2Zmc2V0ID0gMDsKLQlibGt2c2NfcmVxLT5yZXF1ZXN0LkRhdGFCdWZmZXIuTGVuZ3RoID0gNjQ7CisJYmxrdnNjX3JlcS0+cmVxdWVzdC5kYXRhX2J1ZmZlci5QZm5BcnJheVswXSA9IHBhZ2VfdG9fcGZuKHBhZ2VfYnVmKTsKKwlibGt2c2NfcmVxLT5yZXF1ZXN0LmRhdGFfYnVmZmVyLk9mZnNldCA9IDA7CisJYmxrdnNjX3JlcS0+cmVxdWVzdC5kYXRhX2J1ZmZlci5MZW5ndGggPSA2NDsKIAogCWJsa3ZzY19yZXEtPmNtbmRbMF0gPSBJTlFVSVJZOwogCWJsa3ZzY19yZXEtPmNtbmRbMV0gPSAweDE7CQkvKiBHZXQgcHJvZHVjdCBkYXRhICovCkBAIC01OTMsOSArNTkzLDkgQEAKIAlibGt2c2NfcmVxLT5yZXEgPSBOVUxMOwogCWJsa3ZzY19yZXEtPndyaXRlID0gMDsKIAotCWJsa3ZzY19yZXEtPnJlcXVlc3QuRGF0YUJ1ZmZlci5QZm5BcnJheVswXSA9IHBhZ2VfdG9fcGZuKHBhZ2VfYnVmKTsKLQlibGt2c2NfcmVxLT5yZXF1ZXN0LkRhdGFCdWZmZXIuT2Zmc2V0ID0gMDsKLQlibGt2c2NfcmVxLT5yZXF1ZXN0LkRhdGFCdWZmZXIuTGVuZ3RoID0gODsKKwlibGt2c2NfcmVxLT5yZXF1ZXN0LmRhdGFfYnVmZmVyLlBmbkFycmF5WzBdID0gcGFnZV90b19wZm4ocGFnZV9idWYpOworCWJsa3ZzY19yZXEtPnJlcXVlc3QuZGF0YV9idWZmZXIuT2Zmc2V0ID0gMDsKKwlibGt2c2NfcmVxLT5yZXF1ZXN0LmRhdGFfYnVmZmVyLkxlbmd0aCA9IDg7CiAKIAlibGt2c2NfcmVxLT5jbW5kWzBdID0gUkVBRF9DQVBBQ0lUWTsKIAlibGt2c2NfcmVxLT5jbWRfbGVuID0gMTY7CkBAIC02MTQsNyArNjE0LDcgQEAKIAl3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoYmxrdnNjX3JlcS0+d2V2ZW50LCBibGt2c2NfcmVxLT5jb25kKTsKIAogCS8qIGNoZWNrIGVycm9yICovCi0JaWYgKGJsa3ZzY19yZXEtPnJlcXVlc3QuU3RhdHVzKSB7CisJaWYgKGJsa3ZzY19yZXEtPnJlcXVlc3Quc3RhdHVzKSB7CiAJCXNjc2lfbm9ybWFsaXplX3NlbnNlKGJsa3ZzY19yZXEtPnNlbnNlX2J1ZmZlciwKIAkJCQkgICAgIFNDU0lfU0VOU0VfQlVGRkVSU0laRSwgJnNlbnNlX2hkcik7CiAKQEAgLTY3MCw5ICs2NzAsOSBAQAogCWJsa3ZzY19yZXEtPnJlcSA9IE5VTEw7CiAJYmxrdnNjX3JlcS0+d3JpdGUgPSAwOwogCi0JYmxrdnNjX3JlcS0+cmVxdWVzdC5EYXRhQnVmZmVyLlBmbkFycmF5WzBdID0gcGFnZV90b19wZm4ocGFnZV9idWYpOwotCWJsa3ZzY19yZXEtPnJlcXVlc3QuRGF0YUJ1ZmZlci5PZmZzZXQgPSAwOwotCWJsa3ZzY19yZXEtPnJlcXVlc3QuRGF0YUJ1ZmZlci5MZW5ndGggPSAxMjsKKwlibGt2c2NfcmVxLT5yZXF1ZXN0LmRhdGFfYnVmZmVyLlBmbkFycmF5WzBdID0gcGFnZV90b19wZm4ocGFnZV9idWYpOworCWJsa3ZzY19yZXEtPnJlcXVlc3QuZGF0YV9idWZmZXIuT2Zmc2V0ID0gMDsKKwlibGt2c2NfcmVxLT5yZXF1ZXN0LmRhdGFfYnVmZmVyLkxlbmd0aCA9IDEyOwogCiAJYmxrdnNjX3JlcS0+Y21uZFswXSA9IDB4OUU7IC8qIFJFQURfQ0FQQUNJVFkxNjsgKi8KIAlibGt2c2NfcmVxLT5jbWRfbGVuID0gMTY7CkBAIC02OTEsNyArNjkxLDcgQEAKIAl3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoYmxrdnNjX3JlcS0+d2V2ZW50LCBibGt2c2NfcmVxLT5jb25kKTsKIAogCS8qIGNoZWNrIGVycm9yICovCi0JaWYgKGJsa3ZzY19yZXEtPnJlcXVlc3QuU3RhdHVzKSB7CisJaWYgKGJsa3ZzY19yZXEtPnJlcXVlc3Quc3RhdHVzKSB7CiAJCXNjc2lfbm9ybWFsaXplX3NlbnNlKGJsa3ZzY19yZXEtPnNlbnNlX2J1ZmZlciwKIAkJCQkgICAgIFNDU0lfU0VOU0VfQlVGRkVSU0laRSwgJnNlbnNlX2hkcik7CiAJCWlmIChzZW5zZV9oZHIuYXNjID09IDB4M0EpIHsKQEAgLTc0MSwxNCArNzQxLDE0IEBACiAKIAlEUFJJTlRfREJHKEJMS1ZTQ19EUlYsICJibGt2c2NfcmVtb3ZlKClcbiIpOwogCi0JaWYgKCFzdG9ydnNjX2Rydl9vYmotPkJhc2UuT25EZXZpY2VSZW1vdmUpCisJaWYgKCFzdG9ydnNjX2Rydl9vYmotPmJhc2UuT25EZXZpY2VSZW1vdmUpCiAJCXJldHVybiAtMTsKIAogCS8qCiAJICogQ2FsbCB0byB0aGUgdnNjIGRyaXZlciB0byBsZXQgaXQga25vdyB0aGF0IHRoZSBkZXZpY2UgaXMgYmVpbmcKIAkgKiByZW1vdmVkCiAJICovCi0JcmV0ID0gc3RvcnZzY19kcnZfb2JqLT5CYXNlLk9uRGV2aWNlUmVtb3ZlKGRldmljZV9vYmopOworCXJldCA9IHN0b3J2c2NfZHJ2X29iai0+YmFzZS5PbkRldmljZVJlbW92ZShkZXZpY2Vfb2JqKTsKIAlpZiAocmV0ICE9IDApIHsKIAkJLyogVE9ETzogKi8KIAkJRFBSSU5UX0VSUihCTEtWU0NfRFJWLApAQCAtODY1LDM4ICs4NjUsMzggQEAKIAkJICAgKGJsa3ZzY19yZXEtPndyaXRlKSA/ICJXUklURSIgOiAiUkVBRCIsCiAJCSAgICh1bnNpZ25lZCBsb25nKSBibGt2c2NfcmVxLT5zZWN0b3Jfc3RhcnQsCiAJCSAgIGJsa3ZzY19yZXEtPnNlY3Rvcl9jb3VudCwKLQkJICAgYmxrdnNjX3JlcS0+cmVxdWVzdC5EYXRhQnVmZmVyLk9mZnNldCwKLQkJICAgYmxrdnNjX3JlcS0+cmVxdWVzdC5EYXRhQnVmZmVyLkxlbmd0aCk7CisJCSAgIGJsa3ZzY19yZXEtPnJlcXVlc3QuZGF0YV9idWZmZXIuT2Zmc2V0LAorCQkgICBibGt2c2NfcmVxLT5yZXF1ZXN0LmRhdGFfYnVmZmVyLkxlbmd0aCk7CiAjaWYgMAotCWZvciAoaSA9IDA7IGkgPCAoYmxrdnNjX3JlcS0+cmVxdWVzdC5EYXRhQnVmZmVyLkxlbmd0aCA+PiAxMik7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCAoYmxrdnNjX3JlcS0+cmVxdWVzdC5kYXRhX2J1ZmZlci5MZW5ndGggPj4gMTIpOyBpKyspIHsKIAkJRFBSSU5UX0RCRyhCTEtWU0NfRFJWLCAiYmxrdnNjX3N1Ym1pdF9yZXF1ZXN0KCkgLSAiCiAJCQkgICAicmVxICVwIHBmblslZF0gJWxseFxuIiwKIAkJCSAgIGJsa3ZzY19yZXEsIGksCi0JCQkgICBibGt2c2NfcmVxLT5yZXF1ZXN0LkRhdGFCdWZmZXIuUGZuQXJyYXlbaV0pOworCQkJICAgYmxrdnNjX3JlcS0+cmVxdWVzdC5kYXRhX2J1ZmZlci5QZm5BcnJheVtpXSk7CiAJfQogI2VuZGlmCiAKIAlzdG9ydnNjX3JlcSA9ICZibGt2c2NfcmVxLT5yZXF1ZXN0OwotCXN0b3J2c2NfcmVxLT5FeHRlbnNpb24gPSAodm9pZCAqKSgodW5zaWduZWQgbG9uZylibGt2c2NfcmVxICsKKwlzdG9ydnNjX3JlcS0+ZXh0ZW5zaW9uID0gKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpYmxrdnNjX3JlcSArCiAJCQkJCSAgc2l6ZW9mKHN0cnVjdCBibGt2c2NfcmVxdWVzdCkpOwogCi0Jc3RvcnZzY19yZXEtPlR5cGUgPSBibGt2c2NfcmVxLT53cml0ZSA/IFdSSVRFX1RZUEUgOiBSRUFEX1RZUEU7CisJc3RvcnZzY19yZXEtPnR5cGUgPSBibGt2c2NfcmVxLT53cml0ZSA/IFdSSVRFX1RZUEUgOiBSRUFEX1RZUEU7CiAKLQlzdG9ydnNjX3JlcS0+T25JT0NvbXBsZXRpb24gPSByZXF1ZXN0X2NvbXBsZXRpb247Ci0Jc3RvcnZzY19yZXEtPkNvbnRleHQgPSBibGt2c2NfcmVxOworCXN0b3J2c2NfcmVxLT5vbl9pb19jb21wbGV0aW9uID0gcmVxdWVzdF9jb21wbGV0aW9uOworCXN0b3J2c2NfcmVxLT5jb250ZXh0ID0gYmxrdnNjX3JlcTsKIAotCXN0b3J2c2NfcmVxLT5Ib3N0ID0gYmxrZGV2LT5wb3J0OwotCXN0b3J2c2NfcmVxLT5CdXMgPSBibGtkZXYtPnBhdGg7Ci0Jc3RvcnZzY19yZXEtPlRhcmdldElkID0gYmxrZGV2LT50YXJnZXQ7Ci0Jc3RvcnZzY19yZXEtPkx1bklkID0gMDsJIC8qIHRoaXMgaXMgbm90IHJlYWxseSB1c2VkIGF0IGFsbCAqLworCXN0b3J2c2NfcmVxLT5ob3N0ID0gYmxrZGV2LT5wb3J0OworCXN0b3J2c2NfcmVxLT5idXMgPSBibGtkZXYtPnBhdGg7CisJc3RvcnZzY19yZXEtPnRhcmdldF9pZCA9IGJsa2Rldi0+dGFyZ2V0OworCXN0b3J2c2NfcmVxLT5sdW5faWQgPSAwOwkgLyogdGhpcyBpcyBub3QgcmVhbGx5IHVzZWQgYXQgYWxsICovCiAKLQlzdG9ydnNjX3JlcS0+Q2RiTGVuID0gYmxrdnNjX3JlcS0+Y21kX2xlbjsKLQlzdG9ydnNjX3JlcS0+Q2RiID0gYmxrdnNjX3JlcS0+Y21uZDsKKwlzdG9ydnNjX3JlcS0+Y2RiX2xlbiA9IGJsa3ZzY19yZXEtPmNtZF9sZW47CisJc3RvcnZzY19yZXEtPmNkYiA9IGJsa3ZzY19yZXEtPmNtbmQ7CiAKLQlzdG9ydnNjX3JlcS0+U2Vuc2VCdWZmZXIgPSBibGt2c2NfcmVxLT5zZW5zZV9idWZmZXI7Ci0Jc3RvcnZzY19yZXEtPlNlbnNlQnVmZmVyU2l6ZSA9IFNDU0lfU0VOU0VfQlVGRkVSU0laRTsKKwlzdG9ydnNjX3JlcS0+c2Vuc2VfYnVmZmVyID0gYmxrdnNjX3JlcS0+c2Vuc2VfYnVmZmVyOworCXN0b3J2c2NfcmVxLT5zZW5zZV9idWZmZXJfc2l6ZSA9IFNDU0lfU0VOU0VfQlVGRkVSU0laRTsKIAotCXJldCA9IHN0b3J2c2NfZHJ2X29iai0+T25JT1JlcXVlc3QoJmJsa2Rldi0+ZGV2aWNlX2N0eC0+ZGV2aWNlX29iaiwKKwlyZXQgPSBzdG9ydnNjX2Rydl9vYmotPm9uX2lvX3JlcXVlc3QoJmJsa2Rldi0+ZGV2aWNlX2N0eC0+ZGV2aWNlX29iaiwKIAkJCQkJICAgJmJsa3ZzY19yZXEtPnJlcXVlc3QpOwogCWlmIChyZXQgPT0gMCkKIAkJYmxrZGV2LT5udW1fb3V0c3RhbmRpbmdfcmVxcysrOwpAQCAtOTkyLDggKzk5MiwxMCBAQAogCiAJCQkJCWJsa3ZzY19yZXEtPmRldiA9IGJsa2RldjsKIAkJCQkJYmxrdnNjX3JlcS0+cmVxID0gcmVxOwotCQkJCQlibGt2c2NfcmVxLT5yZXF1ZXN0LkRhdGFCdWZmZXIuT2Zmc2V0ID0gYnZlYy0+YnZfb2Zmc2V0OwotCQkJCQlibGt2c2NfcmVxLT5yZXF1ZXN0LkRhdGFCdWZmZXIuTGVuZ3RoID0gMDsKKwkJCQkJYmxrdnNjX3JlcS0+cmVxdWVzdC5kYXRhX2J1ZmZlci5PZmZzZXQKKwkJCQkJCT0gYnZlYy0+YnZfb2Zmc2V0OworCQkJCQlibGt2c2NfcmVxLT5yZXF1ZXN0LmRhdGFfYnVmZmVyLkxlbmd0aAorCQkJCQkJPSAwOwogCiAJCQkJCS8qIEFkZCB0byB0aGUgZ3JvdXAgKi8KIAkJCQkJYmxrdnNjX3JlcS0+Z3JvdXAgPSBncm91cDsKQEAgLTEwMDcsOCArMTAwOSwxMSBAQAogCQkJCX0KIAogCQkJCS8qIEFkZCB0aGUgY3VyciBidmVjL3NlZ21lbnQgdG8gdGhlIGN1cnIgYmxrdnNjX3JlcSAqLwotCQkJCWJsa3ZzY19yZXEtPnJlcXVlc3QuRGF0YUJ1ZmZlci5QZm5BcnJheVtkYXRhYnVmX2lkeF0gPSBwYWdlX3RvX3BmbihidmVjLT5idl9wYWdlKTsKLQkJCQlibGt2c2NfcmVxLT5yZXF1ZXN0LkRhdGFCdWZmZXIuTGVuZ3RoICs9IGJ2ZWMtPmJ2X2xlbjsKKwkJCQlibGt2c2NfcmVxLT5yZXF1ZXN0LmRhdGFfYnVmZmVyLgorCQkJCQlQZm5BcnJheVtkYXRhYnVmX2lkeF0KKwkJCQkJCT0gcGFnZV90b19wZm4oYnZlYy0+YnZfcGFnZSk7CisJCQkJYmxrdnNjX3JlcS0+cmVxdWVzdC5kYXRhX2J1ZmZlci5MZW5ndGgKKwkJCQkJKz0gYnZlYy0+YnZfbGVuOwogCiAJCQkJcHJldl9idmVjID0gYnZlYzsKIApAQCAtMTA3Myw3ICsxMDc4LDcgQEAKIHN0YXRpYyB2b2lkIGJsa3ZzY19jbWRfY29tcGxldGlvbihzdHJ1Y3QgaHZfc3RvcnZzY19yZXF1ZXN0ICpyZXF1ZXN0KQogewogCXN0cnVjdCBibGt2c2NfcmVxdWVzdCAqYmxrdnNjX3JlcSA9Ci0JCQkoc3RydWN0IGJsa3ZzY19yZXF1ZXN0ICopcmVxdWVzdC0+Q29udGV4dDsKKwkJCShzdHJ1Y3QgYmxrdnNjX3JlcXVlc3QgKilyZXF1ZXN0LT5jb250ZXh0OwogCXN0cnVjdCBibG9ja19kZXZpY2VfY29udGV4dCAqYmxrZGV2ID0KIAkJCShzdHJ1Y3QgYmxvY2tfZGV2aWNlX2NvbnRleHQgKilibGt2c2NfcmVxLT5kZXY7CiAJc3RydWN0IHNjc2lfc2Vuc2VfaGRyIHNlbnNlX2hkcjsKQEAgLTEwODMsNyArMTA4OCw3IEBACiAKIAlibGtkZXYtPm51bV9vdXRzdGFuZGluZ19yZXFzLS07CiAKLQlpZiAoYmxrdnNjX3JlcS0+cmVxdWVzdC5TdGF0dXMpCisJaWYgKGJsa3ZzY19yZXEtPnJlcXVlc3Quc3RhdHVzKQogCQlpZiAoc2NzaV9ub3JtYWxpemVfc2Vuc2UoYmxrdnNjX3JlcS0+c2Vuc2VfYnVmZmVyLAogCQkJCQkgU0NTSV9TRU5TRV9CVUZGRVJTSVpFLCAmc2Vuc2VfaGRyKSkKIAkJCXNjc2lfcHJpbnRfc2Vuc2VfaGRyKCJibGt2c2MiLCAmc2Vuc2VfaGRyKTsKQEAgLTEwOTUsNyArMTEwMCw3IEBACiBzdGF0aWMgdm9pZCBibGt2c2NfcmVxdWVzdF9jb21wbGV0aW9uKHN0cnVjdCBodl9zdG9ydnNjX3JlcXVlc3QgKnJlcXVlc3QpCiB7CiAJc3RydWN0IGJsa3ZzY19yZXF1ZXN0ICpibGt2c2NfcmVxID0KLQkJCShzdHJ1Y3QgYmxrdnNjX3JlcXVlc3QgKilyZXF1ZXN0LT5Db250ZXh0OworCQkJKHN0cnVjdCBibGt2c2NfcmVxdWVzdCAqKXJlcXVlc3QtPmNvbnRleHQ7CiAJc3RydWN0IGJsb2NrX2RldmljZV9jb250ZXh0ICpibGtkZXYgPQogCQkJKHN0cnVjdCBibG9ja19kZXZpY2VfY29udGV4dCAqKWJsa3ZzY19yZXEtPmRldjsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwpAQCAtMTExMCw3ICsxMTE1LDcgQEAKIAkJICAgKGJsa3ZzY19yZXEtPndyaXRlKSA/ICJXUklURSIgOiAiUkVBRCIsCiAJCSAgICh1bnNpZ25lZCBsb25nKWJsa3ZzY19yZXEtPnNlY3Rvcl9zdGFydCwKIAkJICAgYmxrdnNjX3JlcS0+c2VjdG9yX2NvdW50LAotCQkgICBibGt2c2NfcmVxLT5yZXF1ZXN0LkRhdGFCdWZmZXIuTGVuZ3RoLAorCQkgICBibGt2c2NfcmVxLT5yZXF1ZXN0LmRhdGFfYnVmZmVyLkxlbmd0aCwKIAkJICAgYmxrdnNjX3JlcS0+Z3JvdXAtPm91dHN0YW5kaW5nLAogCQkgICBibGtkZXYtPm51bV9vdXRzdGFuZGluZ19yZXFzKTsKIApAQCAtMTEzNyw3ICsxMTQyLDcgQEAKIAkJCWxpc3RfZGVsKCZjb21wX3JlcS0+cmVxX2VudHJ5KTsKIAogCQkJaWYgKCFfX2Jsa19lbmRfcmVxdWVzdChjb21wX3JlcS0+cmVxLAotCQkJCSghY29tcF9yZXEtPnJlcXVlc3QuU3RhdHVzID8gMCA6IC1FSU8pLAorCQkJCSghY29tcF9yZXEtPnJlcXVlc3Quc3RhdHVzID8gMCA6IC1FSU8pLAogCQkJCWNvbXBfcmVxLT5zZWN0b3JfY291bnQgKiBibGtkZXYtPnNlY3Rvcl9zaXplKSkgewogCQkJCS8qCiAJCQkJICogQWxsIHRoZSBzZWN0b3JzIGhhdmUgYmVlbiB4ZmVycmVkIGllIHRoZQpAQCAtMTE5NSw3ICsxMjAwLDcgQEAKIAogCQkJaWYgKGNvbXBfcmVxLT5yZXEpIHsKIAkJCQlyZXQgPSBfX2Jsa19lbmRfcmVxdWVzdChjb21wX3JlcS0+cmVxLAotCQkJCQkoIWNvbXBfcmVxLT5yZXF1ZXN0LlN0YXR1cyA/IDAgOiAtRUlPKSwKKwkJCQkJKCFjb21wX3JlcS0+cmVxdWVzdC5zdGF0dXMgPyAwIDogLUVJTyksCiAJCQkJCWNvbXBfcmVxLT5zZWN0b3JfY291bnQgKgogCQkJCQlibGtkZXYtPnNlY3Rvcl9zaXplKTsKIApAQCAtMTQ4Miw3ICsxNDg3LDcgQEAKIAogCURQUklOVF9JTkZPKEJMS1ZTQ19EUlYsICJCbGt2c2MgaW5pdGlhbGl6aW5nLi4uLiIpOwogCi0JcmV0ID0gYmxrdnNjX2Rydl9pbml0KEJsa1ZzY0luaXRpYWxpemUpOworCXJldCA9IGJsa3ZzY19kcnZfaW5pdChibGtfdnNjX2luaXRpYWxpemUpOwogCiAJcmV0dXJuIHJldDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9odi9jaGFubmVsLmMgYi9kcml2ZXJzL3N0YWdpbmcvaHYvY2hhbm5lbC5jCmluZGV4IDI2ZWJjNzcuLjQ1YTYyN2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9odi9jaGFubmVsLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2h2L2NoYW5uZWwuYwpAQCAtNDMsMjQgKzQzLDI0IEBACiAJaW50IGogPSAwOwogCiAJRFBSSU5UX0RCRyhWTUJVUywgIm1vbml0b3JQYWdlIC0gJXAsIHRyaWdnZXIgc3RhdGUgLSAlZCIsCi0JCSAgIE1vbml0b3JQYWdlLCBNb25pdG9yUGFnZS0+VHJpZ2dlclN0YXRlKTsKKwkJICAgTW9uaXRvclBhZ2UsIE1vbml0b3JQYWdlLT50cmlnZ2VyX3N0YXRlKTsKIAogCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspCiAJCURQUklOVF9EQkcoVk1CVVMsICJ0cmlnZ2VyIGdyb3VwICglZCkgLSAlbGx4IiwgaSwKLQkJCSAgIE1vbml0b3JQYWdlLT5UcmlnZ2VyR3JvdXBbaV0uQXNVSU5UNjQpOworCQkJICAgTW9uaXRvclBhZ2UtPnRyaWdnZXJfZ3JvdXBbaV0uYXNfdWludDY0KTsKIAogCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKIAkJZm9yIChqID0gMDsgaiA8IDMyOyBqKyspIHsKIAkJCURQUklOVF9EQkcoVk1CVVMsICJsYXRlbmN5ICglZCkoJWQpIC0gJWxseCIsIGksIGosCi0JCQkJICAgTW9uaXRvclBhZ2UtPkxhdGVuY3lbaV1bal0pOworCQkJCSAgIE1vbml0b3JQYWdlLT5sYXRlbmN5W2ldW2pdKTsKIAkJfQogCX0KIAlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CiAJCWZvciAoaiA9IDA7IGogPCAzMjsgaisrKSB7CiAJCQlEUFJJTlRfREJHKFZNQlVTLCAicGFyYW0tY29ubiBpZCAoJWQpKCVkKSAtICVkIiwgaSwgaiwKLQkJCSAgICAgICBNb25pdG9yUGFnZS0+UGFyYW1ldGVyW2ldW2pdLkNvbm5lY3Rpb25JZC5Bc3UzMik7CisJCQkgICAgICAgTW9uaXRvclBhZ2UtPnBhcmFtZXRlcltpXVtqXS5jb25uZWN0aW9uaWQuYXN1MzIpOwogCQkJRFBSSU5UX0RCRyhWTUJVUywgInBhcmFtLWZsYWcgKCVkKSglZCkgLSAlZCIsIGksIGosCi0JCQkJTW9uaXRvclBhZ2UtPlBhcmFtZXRlcltpXVtqXS5GbGFnTnVtYmVyKTsKKwkJCQlNb25pdG9yUGFnZS0+cGFyYW1ldGVyW2ldW2pdLmZsYWdfbnVtYmVyKTsKIAkJfQogCX0KIH0KQEAgLTc0LDIxICs3NCwyMSBAQAogewogCXN0cnVjdCBodl9tb25pdG9yX3BhZ2UgKm1vbml0b3JwYWdlOwogCi0JaWYgKGNoYW5uZWwtPk9mZmVyTXNnLk1vbml0b3JBbGxvY2F0ZWQpIHsKKwlpZiAoY2hhbm5lbC0+b2ZmZXJtc2cubW9uaXRvcl9hbGxvY2F0ZWQpIHsKIAkJLyogRWFjaCB1MzIgcmVwcmVzZW50cyAzMiBjaGFubmVscyAqLwotCQlzZXRfYml0KGNoYW5uZWwtPk9mZmVyTXNnLkNoaWxkUmVsSWQgJiAzMSwKKwkJc2V0X2JpdChjaGFubmVsLT5vZmZlcm1zZy5jaGlsZF9yZWxpZCAmIDMxLAogCQkJKHVuc2lnbmVkIGxvbmcgKikgZ1ZtYnVzQ29ubmVjdGlvbi5TZW5kSW50ZXJydXB0UGFnZSArCi0JCQkoY2hhbm5lbC0+T2ZmZXJNc2cuQ2hpbGRSZWxJZCA+PiA1KSk7CisJCQkoY2hhbm5lbC0+b2ZmZXJtc2cuY2hpbGRfcmVsaWQgPj4gNSkpOwogCiAJCW1vbml0b3JwYWdlID0gZ1ZtYnVzQ29ubmVjdGlvbi5Nb25pdG9yUGFnZXM7CiAJCW1vbml0b3JwYWdlKys7IC8qIEdldCB0aGUgY2hpbGQgdG8gcGFyZW50IG1vbml0b3IgcGFnZSAqLwogCi0JCXNldF9iaXQoY2hhbm5lbC0+TW9uaXRvckJpdCwKLQkJCSh1bnNpZ25lZCBsb25nICopJm1vbml0b3JwYWdlLT5UcmlnZ2VyR3JvdXAKLQkJCQkJW2NoYW5uZWwtPk1vbml0b3JHcm91cF0uUGVuZGluZyk7CisJCXNldF9iaXQoY2hhbm5lbC0+bW9uaXRvcl9iaXQsCisJCQkodW5zaWduZWQgbG9uZyAqKSZtb25pdG9ycGFnZS0+dHJpZ2dlcl9ncm91cAorCQkJCQlbY2hhbm5lbC0+bW9uaXRvcl9ncnBdLnBlbmRpbmcpOwogCiAJfSBlbHNlIHsKLQkJVm1idXNTZXRFdmVudChjaGFubmVsLT5PZmZlck1zZy5DaGlsZFJlbElkKTsKKwkJVm1idXNTZXRFdmVudChjaGFubmVsLT5vZmZlcm1zZy5jaGlsZF9yZWxpZCk7CiAJfQogfQogCkBAIC05NywxOSArOTcsMTkgQEAKIHsKIAlzdHJ1Y3QgaHZfbW9uaXRvcl9wYWdlICptb25pdG9yUGFnZTsKIAotCWlmIChDaGFubmVsLT5PZmZlck1zZy5Nb25pdG9yQWxsb2NhdGVkKSB7CisJaWYgKENoYW5uZWwtPm9mZmVybXNnLm1vbml0b3JfYWxsb2NhdGVkKSB7CiAJCS8qIEVhY2ggdTMyIHJlcHJlc2VudHMgMzIgY2hhbm5lbHMgKi8KLQkJY2xlYXJfYml0KENoYW5uZWwtPk9mZmVyTXNnLkNoaWxkUmVsSWQgJiAzMSwKKwkJY2xlYXJfYml0KENoYW5uZWwtPm9mZmVybXNnLmNoaWxkX3JlbGlkICYgMzEsCiAJCQkgICh1bnNpZ25lZCBsb25nICopZ1ZtYnVzQ29ubmVjdGlvbi5TZW5kSW50ZXJydXB0UGFnZSArCi0JCQkgIChDaGFubmVsLT5PZmZlck1zZy5DaGlsZFJlbElkID4+IDUpKTsKKwkJCSAgKENoYW5uZWwtPm9mZmVybXNnLmNoaWxkX3JlbGlkID4+IDUpKTsKIAogCQltb25pdG9yUGFnZSA9CiAJCQkoc3RydWN0IGh2X21vbml0b3JfcGFnZSAqKWdWbWJ1c0Nvbm5lY3Rpb24uTW9uaXRvclBhZ2VzOwogCQltb25pdG9yUGFnZSsrOyAvKiBHZXQgdGhlIGNoaWxkIHRvIHBhcmVudCBtb25pdG9yIHBhZ2UgKi8KIAotCQljbGVhcl9iaXQoQ2hhbm5lbC0+TW9uaXRvckJpdCwKLQkJCSAgKHVuc2lnbmVkIGxvbmcgKikmbW9uaXRvclBhZ2UtPlRyaWdnZXJHcm91cAotCQkJCQlbQ2hhbm5lbC0+TW9uaXRvckdyb3VwXS5QZW5kaW5nKTsKKwkJY2xlYXJfYml0KENoYW5uZWwtPm1vbml0b3JfYml0LAorCQkJICAodW5zaWduZWQgbG9uZyAqKSZtb25pdG9yUGFnZS0+dHJpZ2dlcl9ncm91cAorCQkJCQlbQ2hhbm5lbC0+bW9uaXRvcl9ncnBdLlBlbmRpbmcpOwogCX0KIH0KIApAQCAtMTIxLDQyICsxMjEsNDIgQEAKIAkJCSAgICAgIHN0cnVjdCB2bWJ1c19jaGFubmVsX2RlYnVnX2luZm8gKmRlYnVnaW5mbykKIHsKIAlzdHJ1Y3QgaHZfbW9uaXRvcl9wYWdlICptb25pdG9ycGFnZTsKLQl1OCBtb25pdG9yX2dyb3VwID0gKHU4KWNoYW5uZWwtPk9mZmVyTXNnLk1vbml0b3JJZCAvIDMyOwotCXU4IG1vbml0b3Jfb2Zmc2V0ID0gKHU4KWNoYW5uZWwtPk9mZmVyTXNnLk1vbml0b3JJZCAlIDMyOworCXU4IG1vbml0b3JfZ3JvdXAgPSAodTgpY2hhbm5lbC0+b2ZmZXJtc2cubW9uaXRvcmlkIC8gMzI7CisJdTggbW9uaXRvcl9vZmZzZXQgPSAodTgpY2hhbm5lbC0+b2ZmZXJtc2cubW9uaXRvcmlkICUgMzI7CiAJLyogdTMyIG1vbml0b3JCaXQJPSAxIDw8IG1vbml0b3JPZmZzZXQ7ICovCiAKLQlkZWJ1Z2luZm8tPlJlbElkID0gY2hhbm5lbC0+T2ZmZXJNc2cuQ2hpbGRSZWxJZDsKLQlkZWJ1Z2luZm8tPlN0YXRlID0gY2hhbm5lbC0+U3RhdGU7Ci0JbWVtY3B5KCZkZWJ1Z2luZm8tPkludGVyZmFjZVR5cGUsCi0JICAgICAgICZjaGFubmVsLT5PZmZlck1zZy5PZmZlci5JbnRlcmZhY2VUeXBlLCBzaXplb2Yoc3RydWN0IGh2X2d1aWQpKTsKLQltZW1jcHkoJmRlYnVnaW5mby0+SW50ZXJmYWNlSW5zdGFuY2UsCi0JICAgICAgICZjaGFubmVsLT5PZmZlck1zZy5PZmZlci5JbnRlcmZhY2VJbnN0YW5jZSwKKwlkZWJ1Z2luZm8tPnJlbGlkID0gY2hhbm5lbC0+b2ZmZXJtc2cuY2hpbGRfcmVsaWQ7CisJZGVidWdpbmZvLT5zdGF0ZSA9IGNoYW5uZWwtPnN0YXRlOworCW1lbWNweSgmZGVidWdpbmZvLT5pbnRlcmZhY2V0eXBlLAorCSAgICAgICAmY2hhbm5lbC0+b2ZmZXJtc2cub2ZmZXIuSW50ZXJmYWNlVHlwZSwgc2l6ZW9mKHN0cnVjdCBodl9ndWlkKSk7CisJbWVtY3B5KCZkZWJ1Z2luZm8tPmludGVyZmFjZV9pbnN0YW5jZSwKKwkgICAgICAgJmNoYW5uZWwtPm9mZmVybXNnLm9mZmVyLkludGVyZmFjZUluc3RhbmNlLAogCSAgICAgICBzaXplb2Yoc3RydWN0IGh2X2d1aWQpKTsKIAogCW1vbml0b3JwYWdlID0gKHN0cnVjdCBodl9tb25pdG9yX3BhZ2UgKilnVm1idXNDb25uZWN0aW9uLk1vbml0b3JQYWdlczsKIAotCWRlYnVnaW5mby0+TW9uaXRvcklkID0gY2hhbm5lbC0+T2ZmZXJNc2cuTW9uaXRvcklkOworCWRlYnVnaW5mby0+bW9uaXRvcmlkID0gY2hhbm5lbC0+b2ZmZXJtc2cubW9uaXRvcmlkOwogCi0JZGVidWdpbmZvLT5TZXJ2ZXJNb25pdG9yUGVuZGluZyA9Ci0JCQltb25pdG9ycGFnZS0+VHJpZ2dlckdyb3VwW21vbml0b3JfZ3JvdXBdLlBlbmRpbmc7Ci0JZGVidWdpbmZvLT5TZXJ2ZXJNb25pdG9yTGF0ZW5jeSA9Ci0JCQltb25pdG9ycGFnZS0+TGF0ZW5jeVttb25pdG9yX2dyb3VwXVttb25pdG9yX29mZnNldF07Ci0JZGVidWdpbmZvLT5TZXJ2ZXJNb25pdG9yQ29ubmVjdGlvbklkID0KLQkJCW1vbml0b3JwYWdlLT5QYXJhbWV0ZXJbbW9uaXRvcl9ncm91cF0KLQkJCQkJW21vbml0b3Jfb2Zmc2V0XS5Db25uZWN0aW9uSWQudS5JZDsKKwlkZWJ1Z2luZm8tPnNlcnZlcm1vbml0b3JfcGVuZGluZyA9CisJCQltb25pdG9ycGFnZS0+dHJpZ2dlcl9ncm91cFttb25pdG9yX2dyb3VwXS5wZW5kaW5nOworCWRlYnVnaW5mby0+c2VydmVybW9uaXRvcl9sYXRlbmN5ID0KKwkJCW1vbml0b3JwYWdlLT5sYXRlbmN5W21vbml0b3JfZ3JvdXBdW21vbml0b3Jfb2Zmc2V0XTsKKwlkZWJ1Z2luZm8tPnNlcnZlcm1vbml0b3JfY29ubmVjdGlvbmlkID0KKwkJCW1vbml0b3JwYWdlLT5wYXJhbWV0ZXJbbW9uaXRvcl9ncm91cF0KKwkJCQkJW21vbml0b3Jfb2Zmc2V0XS5jb25uZWN0aW9uaWQudS5pZDsKIAogCW1vbml0b3JwYWdlKys7CiAKLQlkZWJ1Z2luZm8tPkNsaWVudE1vbml0b3JQZW5kaW5nID0KLQkJCW1vbml0b3JwYWdlLT5UcmlnZ2VyR3JvdXBbbW9uaXRvcl9ncm91cF0uUGVuZGluZzsKLQlkZWJ1Z2luZm8tPkNsaWVudE1vbml0b3JMYXRlbmN5ID0KLQkJCW1vbml0b3JwYWdlLT5MYXRlbmN5W21vbml0b3JfZ3JvdXBdW21vbml0b3Jfb2Zmc2V0XTsKLQlkZWJ1Z2luZm8tPkNsaWVudE1vbml0b3JDb25uZWN0aW9uSWQgPQotCQkJbW9uaXRvcnBhZ2UtPlBhcmFtZXRlclttb25pdG9yX2dyb3VwXQotCQkJCQlbbW9uaXRvcl9vZmZzZXRdLkNvbm5lY3Rpb25JZC51LklkOworCWRlYnVnaW5mby0+Y2xpZW50bW9uaXRvcl9wZW5kaW5nID0KKwkJCW1vbml0b3JwYWdlLT50cmlnZ2VyX2dyb3VwW21vbml0b3JfZ3JvdXBdLnBlbmRpbmc7CisJZGVidWdpbmZvLT5jbGllbnRtb25pdG9yX2xhdGVuY3kgPQorCQkJbW9uaXRvcnBhZ2UtPmxhdGVuY3lbbW9uaXRvcl9ncm91cF1bbW9uaXRvcl9vZmZzZXRdOworCWRlYnVnaW5mby0+Y2xpZW50bW9uaXRvcl9jb25uZWN0aW9uaWQgPQorCQkJbW9uaXRvcnBhZ2UtPnBhcmFtZXRlclttb25pdG9yX2dyb3VwXQorCQkJCQlbbW9uaXRvcl9vZmZzZXRdLmNvbm5lY3Rpb25pZC51LmlkOwogCi0JUmluZ0J1ZmZlckdldERlYnVnSW5mbygmY2hhbm5lbC0+SW5ib3VuZCwgJmRlYnVnaW5mby0+SW5ib3VuZCk7Ci0JUmluZ0J1ZmZlckdldERlYnVnSW5mbygmY2hhbm5lbC0+T3V0Ym91bmQsICZkZWJ1Z2luZm8tPk91dGJvdW5kKTsKKwlyaW5nYnVmZmVyX2dldF9kZWJ1Z2luZm8oJmNoYW5uZWwtPmluYm91bmQsICZkZWJ1Z2luZm8tPmluYm91bmQpOworCXJpbmdidWZmZXJfZ2V0X2RlYnVnaW5mbygmY2hhbm5lbC0+b3V0Ym91bmQsICZkZWJ1Z2luZm8tPm91dGJvdW5kKTsKIH0KIAogLyoKQEAgLTE3NiwxMSArMTc2LDExIEBACiAJLyogQVNTRVJUKCEoU2VuZFJpbmdCdWZmZXJTaXplICYgKFBBR0VfU0laRSAtIDEpKSk7ICovCiAJLyogQVNTRVJUKCEoUmVjdlJpbmdCdWZmZXJTaXplICYgKFBBR0VfU0laRSAtIDEpKSk7ICovCiAKLQluZXdjaGFubmVsLT5PbkNoYW5uZWxDYWxsYmFjayA9IG9uY2hhbm5lbGNhbGxiYWNrOwotCW5ld2NoYW5uZWwtPkNoYW5uZWxDYWxsYmFja0NvbnRleHQgPSBjb250ZXh0OworCW5ld2NoYW5uZWwtPm9uY2hhbm5lbF9jYWxsYmFjayA9IG9uY2hhbm5lbGNhbGxiYWNrOworCW5ld2NoYW5uZWwtPmNoYW5uZWxfY2FsbGJhY2tfY29udGV4dCA9IGNvbnRleHQ7CiAKIAkvKiBBbGxvY2F0ZSB0aGUgcmluZyBidWZmZXIgKi8KLQlvdXQgPSBvc2RfUGFnZUFsbG9jKChzZW5kX3JpbmdidWZmZXJfc2l6ZSArIHJlY3ZfcmluZ2J1ZmZlcl9zaXplKQorCW91dCA9IG9zZF9wYWdlX2FsbG9jKChzZW5kX3JpbmdidWZmZXJfc2l6ZSArIHJlY3ZfcmluZ2J1ZmZlcl9zaXplKQogCQkJICAgICA+PiBQQUdFX1NISUZUKTsKIAlpZiAoIW91dCkKIAkJcmV0dXJuIC1FTk9NRU07CkBAIC0xODksMTcgKzE4OSwxNyBAQAogCiAJaW4gPSAodm9pZCAqKSgodW5zaWduZWQgbG9uZylvdXQgKyBzZW5kX3JpbmdidWZmZXJfc2l6ZSk7CiAKLQluZXdjaGFubmVsLT5SaW5nQnVmZmVyUGFnZXMgPSBvdXQ7Ci0JbmV3Y2hhbm5lbC0+UmluZ0J1ZmZlclBhZ2VDb3VudCA9IChzZW5kX3JpbmdidWZmZXJfc2l6ZSArCisJbmV3Y2hhbm5lbC0+cmluZ2J1ZmZlcl9wYWdlcyA9IG91dDsKKwluZXdjaGFubmVsLT5yaW5nYnVmZmVyX3BhZ2Vjb3VudCA9IChzZW5kX3JpbmdidWZmZXJfc2l6ZSArCiAJCQkJCSAgIHJlY3ZfcmluZ2J1ZmZlcl9zaXplKSA+PiBQQUdFX1NISUZUOwogCi0JcmV0ID0gUmluZ0J1ZmZlckluaXQoJm5ld2NoYW5uZWwtPk91dGJvdW5kLCBvdXQsIHNlbmRfcmluZ2J1ZmZlcl9zaXplKTsKKwlyZXQgPSByaW5nYnVmZmVyX2luaXQoJm5ld2NoYW5uZWwtPm91dGJvdW5kLCBvdXQsIHNlbmRfcmluZ2J1ZmZlcl9zaXplKTsKIAlpZiAocmV0ICE9IDApIHsKIAkJZXJyID0gcmV0OwogCQlnb3RvIGVycm9yb3V0OwogCX0KIAotCXJldCA9IFJpbmdCdWZmZXJJbml0KCZuZXdjaGFubmVsLT5JbmJvdW5kLCBpbiwgcmVjdl9yaW5nYnVmZmVyX3NpemUpOworCXJldCA9IHJpbmdidWZmZXJfaW5pdCgmbmV3Y2hhbm5lbC0+aW5ib3VuZCwgaW4sIHJlY3ZfcmluZ2J1ZmZlcl9zaXplKTsKIAlpZiAocmV0ICE9IDApIHsKIAkJZXJyID0gcmV0OwogCQlnb3RvIGVycm9yb3V0OwpAQCAtMjEwLDEzICsyMTAsMTMgQEAKIAlEUFJJTlRfREJHKFZNQlVTLCAiRXN0YWJsaXNoaW5nIHJpbmcgYnVmZmVyJ3MgZ3BhZGwgZm9yIGNoYW5uZWwgJXAuLi4iLAogCQkgICBuZXdjaGFubmVsKTsKIAotCW5ld2NoYW5uZWwtPlJpbmdCdWZmZXJHcGFkbEhhbmRsZSA9IDA7CisJbmV3Y2hhbm5lbC0+cmluZ2J1ZmZlcl9ncGFkbGhhbmRsZSA9IDA7CiAKIAlyZXQgPSB2bWJ1c19lc3RhYmxpc2hfZ3BhZGwobmV3Y2hhbm5lbCwKLQkJCQkJIG5ld2NoYW5uZWwtPk91dGJvdW5kLlJpbmdCdWZmZXIsCisJCQkJCSBuZXdjaGFubmVsLT5vdXRib3VuZC5yaW5nX2J1ZmZlciwKIAkJCQkJIHNlbmRfcmluZ2J1ZmZlcl9zaXplICsKIAkJCQkJIHJlY3ZfcmluZ2J1ZmZlcl9zaXplLAotCQkJCQkgJm5ld2NoYW5uZWwtPlJpbmdCdWZmZXJHcGFkbEhhbmRsZSk7CisJCQkJCSAmbmV3Y2hhbm5lbC0+cmluZ2J1ZmZlcl9ncGFkbGhhbmRsZSk7CiAKIAlpZiAocmV0ICE9IDApIHsKIAkJZXJyID0gcmV0OwpAQCAtMjI1LDEyICsyMjUsMTIgQEAKIAogCURQUklOVF9EQkcoVk1CVVMsICJjaGFubmVsICVwIDxyZWxpZCAlZCBncGFkbCAweCV4IHNlbmQgcmluZyAlcCAiCiAJCSAgICJzaXplICVkIHJlY3YgcmluZyAlcCBzaXplICVkLCBkb3duc3RyZWFtb2Zmc2V0ICVkPiIsCi0JCSAgIG5ld2NoYW5uZWwsIG5ld2NoYW5uZWwtPk9mZmVyTXNnLkNoaWxkUmVsSWQsCi0JCSAgIG5ld2NoYW5uZWwtPlJpbmdCdWZmZXJHcGFkbEhhbmRsZSwKLQkJICAgbmV3Y2hhbm5lbC0+T3V0Ym91bmQuUmluZ0J1ZmZlciwKLQkJICAgbmV3Y2hhbm5lbC0+T3V0Ym91bmQuUmluZ1NpemUsCi0JCSAgIG5ld2NoYW5uZWwtPkluYm91bmQuUmluZ0J1ZmZlciwKLQkJICAgbmV3Y2hhbm5lbC0+SW5ib3VuZC5SaW5nU2l6ZSwKKwkJICAgbmV3Y2hhbm5lbCwgbmV3Y2hhbm5lbC0+b2ZmZXJtc2cuY2hpbGRfcmVsaWQsCisJCSAgIG5ld2NoYW5uZWwtPnJpbmdidWZmZXJfZ3BhZGxoYW5kbGUsCisJCSAgIG5ld2NoYW5uZWwtPm91dGJvdW5kLnJpbmdfYnVmZmVyLAorCQkgICBuZXdjaGFubmVsLT5vdXRib3VuZC5yaW5nX3NpemUsCisJCSAgIG5ld2NoYW5uZWwtPmluYm91bmQucmluZ19idWZmZXIsCisJCSAgIG5ld2NoYW5uZWwtPmluYm91bmQucmluZ19zaXplLAogCQkgICBzZW5kX3JpbmdidWZmZXJfc2l6ZSk7CiAKIAkvKiBDcmVhdGUgYW5kIGluaXQgdGhlIGNoYW5uZWwgb3BlbiBtZXNzYWdlICovCkBAIC0yNDIsMjAgKzI0MiwyMCBAQAogCQlnb3RvIGVycm9yb3V0OwogCX0KIAotCW9wZW5JbmZvLT5XYWl0RXZlbnQgPSBvc2RfV2FpdEV2ZW50Q3JlYXRlKCk7Ci0JaWYgKCFvcGVuSW5mby0+V2FpdEV2ZW50KSB7CisJb3BlbkluZm8tPndhaXRldmVudCA9IG9zZF93YWl0ZXZlbnRfY3JlYXRlKCk7CisJaWYgKCFvcGVuSW5mby0+d2FpdGV2ZW50KSB7CiAJCWVyciA9IC1FTk9NRU07CiAJCWdvdG8gZXJyb3JvdXQ7CiAJfQogCi0Jb3Blbk1zZyA9IChzdHJ1Y3Qgdm1idXNfY2hhbm5lbF9vcGVuX2NoYW5uZWwgKilvcGVuSW5mby0+TXNnOwotCW9wZW5Nc2ctPkhlYWRlci5NZXNzYWdlVHlwZSA9IENoYW5uZWxNZXNzYWdlT3BlbkNoYW5uZWw7Ci0Jb3Blbk1zZy0+T3BlbklkID0gbmV3Y2hhbm5lbC0+T2ZmZXJNc2cuQ2hpbGRSZWxJZDsgLyogRklYTUUgKi8KLQlvcGVuTXNnLT5DaGlsZFJlbElkID0gbmV3Y2hhbm5lbC0+T2ZmZXJNc2cuQ2hpbGRSZWxJZDsKLQlvcGVuTXNnLT5SaW5nQnVmZmVyR3BhZGxIYW5kbGUgPSBuZXdjaGFubmVsLT5SaW5nQnVmZmVyR3BhZGxIYW5kbGU7Ci0Jb3Blbk1zZy0+RG93bnN0cmVhbVJpbmdCdWZmZXJQYWdlT2Zmc2V0ID0gc2VuZF9yaW5nYnVmZmVyX3NpemUgPj4KKwlvcGVuTXNnID0gKHN0cnVjdCB2bWJ1c19jaGFubmVsX29wZW5fY2hhbm5lbCAqKW9wZW5JbmZvLT5tc2c7CisJb3Blbk1zZy0+aGVhZGVyLm1zZ3R5cGUgPSBDSEFOTkVMTVNHX09QRU5DSEFOTkVMOworCW9wZW5Nc2ctPm9wZW5pZCA9IG5ld2NoYW5uZWwtPm9mZmVybXNnLmNoaWxkX3JlbGlkOyAvKiBGSVhNRSAqLworCW9wZW5Nc2ctPmNoaWxkX3JlbGlkID0gbmV3Y2hhbm5lbC0+b2ZmZXJtc2cuY2hpbGRfcmVsaWQ7CisJb3Blbk1zZy0+cmluZ2J1ZmZlcl9ncGFkbGhhbmRsZSA9IG5ld2NoYW5uZWwtPnJpbmdidWZmZXJfZ3BhZGxoYW5kbGU7CisJb3Blbk1zZy0+ZG93bnN0cmVhbV9yaW5nYnVmZmVyX3BhZ2VvZmZzZXQgPSBzZW5kX3JpbmdidWZmZXJfc2l6ZSA+PgogCQkJCQkJICBQQUdFX1NISUZUOwotCW9wZW5Nc2ctPlNlcnZlckNvbnRleHRBcmVhR3BhZGxIYW5kbGUgPSAwOyAvKiBUT0RPICovCisJb3Blbk1zZy0+c2VydmVyX2NvbnRleHRhcmVhX2dwYWRsaGFuZGxlID0gMDsgLyogVE9ETyAqLwogCiAJaWYgKHVzZXJkYXRhbGVuID4gTUFYX1VTRVJfREVGSU5FRF9CWVRFUykgewogCQllcnIgPSAtRUlOVkFMOwpAQCAtMjYzLDEwICsyNjMsMTAgQEAKIAl9CiAKIAlpZiAodXNlcmRhdGFsZW4pCi0JCW1lbWNweShvcGVuTXNnLT5Vc2VyRGF0YSwgdXNlcmRhdGEsIHVzZXJkYXRhbGVuKTsKKwkJbWVtY3B5KG9wZW5Nc2ctPnVzZXJkYXRhLCB1c2VyZGF0YSwgdXNlcmRhdGFsZW4pOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmdWbWJ1c0Nvbm5lY3Rpb24uY2hhbm5lbG1zZ19sb2NrLCBmbGFncyk7Ci0JbGlzdF9hZGRfdGFpbCgmb3BlbkluZm8tPk1zZ0xpc3RFbnRyeSwKKwlsaXN0X2FkZF90YWlsKCZvcGVuSW5mby0+bXNnbGlzdGVudHJ5LAogCQkgICAgICAmZ1ZtYnVzQ29ubmVjdGlvbi5DaGFubmVsTXNnTGlzdCk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ1ZtYnVzQ29ubmVjdGlvbi5jaGFubmVsbXNnX2xvY2ssIGZsYWdzKTsKIApAQCAtMjgwLDI3ICsyODAsMjcgQEAKIAl9CiAKIAkvKiBGSVhNRTogTmVlZCB0byB0aW1lLW91dCBoZXJlICovCi0Jb3NkX1dhaXRFdmVudFdhaXQob3BlbkluZm8tPldhaXRFdmVudCk7CisJb3NkX3dhaXRldmVudF93YWl0KG9wZW5JbmZvLT53YWl0ZXZlbnQpOwogCi0JaWYgKG9wZW5JbmZvLT5SZXNwb25zZS5PcGVuUmVzdWx0LlN0YXR1cyA9PSAwKQorCWlmIChvcGVuSW5mby0+cmVzcG9uc2Uub3Blbl9yZXN1bHQuc3RhdHVzID09IDApCiAJCURQUklOVF9JTkZPKFZNQlVTLCAiY2hhbm5lbCA8JXA+IG9wZW4gc3VjY2VzcyEhIiwgbmV3Y2hhbm5lbCk7CiAJZWxzZQogCQlEUFJJTlRfSU5GTyhWTUJVUywgImNoYW5uZWwgPCVwPiBvcGVuIGZhaWxlZCAtICVkISEiLAotCQkJICAgIG5ld2NoYW5uZWwsIG9wZW5JbmZvLT5SZXNwb25zZS5PcGVuUmVzdWx0LlN0YXR1cyk7CisJCQkgICAgbmV3Y2hhbm5lbCwgb3BlbkluZm8tPnJlc3BvbnNlLm9wZW5fcmVzdWx0LnN0YXR1cyk7CiAKIENsZWFudXA6CiAJc3Bpbl9sb2NrX2lycXNhdmUoJmdWbWJ1c0Nvbm5lY3Rpb24uY2hhbm5lbG1zZ19sb2NrLCBmbGFncyk7Ci0JbGlzdF9kZWwoJm9wZW5JbmZvLT5Nc2dMaXN0RW50cnkpOworCWxpc3RfZGVsKCZvcGVuSW5mby0+bXNnbGlzdGVudHJ5KTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZnVm1idXNDb25uZWN0aW9uLmNoYW5uZWxtc2dfbG9jaywgZmxhZ3MpOwogCi0Ja2ZyZWUob3BlbkluZm8tPldhaXRFdmVudCk7CisJa2ZyZWUob3BlbkluZm8tPndhaXRldmVudCk7CiAJa2ZyZWUob3BlbkluZm8pOwogCXJldHVybiAwOwogCiBlcnJvcm91dDoKLQlSaW5nQnVmZmVyQ2xlYW51cCgmbmV3Y2hhbm5lbC0+T3V0Ym91bmQpOwotCVJpbmdCdWZmZXJDbGVhbnVwKCZuZXdjaGFubmVsLT5JbmJvdW5kKTsKLQlvc2RfUGFnZUZyZWUob3V0LCAoc2VuZF9yaW5nYnVmZmVyX3NpemUgKyByZWN2X3JpbmdidWZmZXJfc2l6ZSkKKwlyaW5nYnVmZmVyX2NsZWFudXAoJm5ld2NoYW5uZWwtPm91dGJvdW5kKTsKKwlyaW5nYnVmZmVyX2NsZWFudXAoJm5ld2NoYW5uZWwtPmluYm91bmQpOworCW9zZF9wYWdlX2ZyZWUob3V0LCAoc2VuZF9yaW5nYnVmZmVyX3NpemUgKyByZWN2X3JpbmdidWZmZXJfc2l6ZSkKIAkJICAgICA+PiBQQUdFX1NISUZUKTsKIAlrZnJlZShvcGVuSW5mbyk7CiAJcmV0dXJuIGVycjsKQEAgLTMyMiw3ICszMjIsNyBAQAogCiAJZm9yIChpID0gMDsgaSA8IHBmbmNvdW50OyBpKyspCiAJCURQUklOVF9EQkcoVk1CVVMsICJncGFkbCBib2R5ICAtICVkKSBwZm4gJWxsdSIsCi0JCQkgICBpLCBncGFkbC0+UGZuW2ldKTsKKwkJCSAgIGksIGdwYWRsLT5wZm5baV0pOwogfQogCiAvKgpAQCAtMzM2LDE4ICszMzYsMTggQEAKIAogCURQUklOVF9EQkcoVk1CVVMsCiAJCSAgICJncGFkbCBoZWFkZXIgLSByZWxpZCAlZCwgcmFuZ2UgY291bnQgJWQsIHJhbmdlIGJ1ZmxlbiAlZCIsCi0JCSAgIGdwYWRsLT5DaGlsZFJlbElkLCBncGFkbC0+UmFuZ2VDb3VudCwgZ3BhZGwtPlJhbmdlQnVmTGVuKTsKLQlmb3IgKGkgPSAwOyBpIDwgZ3BhZGwtPlJhbmdlQ291bnQ7IGkrKykgewotCQlwYWdlY291bnQgPSBncGFkbC0+UmFuZ2VbaV0uQnl0ZUNvdW50ID4+IFBBR0VfU0hJRlQ7CisJCSAgIGdwYWRsLT5jaGlsZF9yZWxpZCwgZ3BhZGwtPnJhbmdlY291bnQsIGdwYWRsLT5yYW5nZV9idWZsZW4pOworCWZvciAoaSA9IDA7IGkgPCBncGFkbC0+cmFuZ2Vjb3VudDsgaSsrKSB7CisJCXBhZ2Vjb3VudCA9IGdwYWRsLT5yYW5nZVtpXS5CeXRlQ291bnQgPj4gUEFHRV9TSElGVDsKIAkJcGFnZWNvdW50ID0gKHBhZ2Vjb3VudCA+IDI2KSA/IDI2IDogcGFnZWNvdW50OwogCiAJCURQUklOVF9EQkcoVk1CVVMsICJncGFkbCByYW5nZSAlZCAtIGxlbiAlZCBvZmZzZXQgJWQgIgotCQkJICAgInBhZ2UgY291bnQgJWQiLCBpLCBncGFkbC0+UmFuZ2VbaV0uQnl0ZUNvdW50LAotCQkJICAgZ3BhZGwtPlJhbmdlW2ldLkJ5dGVPZmZzZXQsIHBhZ2Vjb3VudCk7CisJCQkgICAicGFnZSBjb3VudCAlZCIsIGksIGdwYWRsLT5yYW5nZVtpXS5CeXRlQ291bnQsCisJCQkgICBncGFkbC0+cmFuZ2VbaV0uQnl0ZU9mZnNldCwgcGFnZWNvdW50KTsKIAogCQlmb3IgKGogPSAwOyBqIDwgcGFnZWNvdW50OyBqKyspCiAJCQlEUFJJTlRfREJHKFZNQlVTLCAiJWQpIHBmbiAlbGx1IiwgaiwKLQkJCQkgICBncGFkbC0+UmFuZ2VbaV0uUGZuQXJyYXlbal0pOworCQkJCSAgIGdwYWRsLT5yYW5nZVtpXS5QZm5BcnJheVtqXSk7CiAJfQogfQogCkBAIC0zOTEsMTggKzM5MSwxOCBAQAogCQlpZiAoIW1zZ2hlYWRlcikKIAkJCWdvdG8gbm9tZW07CiAKLQkJSU5JVF9MSVNUX0hFQUQoJm1zZ2hlYWRlci0+U3ViTXNnTGlzdCk7Ci0JCW1zZ2hlYWRlci0+TWVzc2FnZVNpemUgPSBtc2dzaXplOworCQlJTklUX0xJU1RfSEVBRCgmbXNnaGVhZGVyLT5zdWJtc2dsaXN0KTsKKwkJbXNnaGVhZGVyLT5tc2dzaXplID0gbXNnc2l6ZTsKIAogCQlncGFkbF9oZWFkZXIgPSAoc3RydWN0IHZtYnVzX2NoYW5uZWxfZ3BhZGxfaGVhZGVyICopCi0JCQltc2doZWFkZXItPk1zZzsKLQkJZ3BhZGxfaGVhZGVyLT5SYW5nZUNvdW50ID0gMTsKLQkJZ3BhZGxfaGVhZGVyLT5SYW5nZUJ1ZkxlbiA9IHNpemVvZihzdHJ1Y3QgZ3BhX3JhbmdlKSArCisJCQltc2doZWFkZXItPm1zZzsKKwkJZ3BhZGxfaGVhZGVyLT5yYW5nZWNvdW50ID0gMTsKKwkJZ3BhZGxfaGVhZGVyLT5yYW5nZV9idWZsZW4gPSBzaXplb2Yoc3RydWN0IGdwYV9yYW5nZSkgKwogCQkJCQkgcGFnZWNvdW50ICogc2l6ZW9mKHU2NCk7Ci0JCWdwYWRsX2hlYWRlci0+UmFuZ2VbMF0uQnl0ZU9mZnNldCA9IDA7Ci0JCWdwYWRsX2hlYWRlci0+UmFuZ2VbMF0uQnl0ZUNvdW50ID0gc2l6ZTsKKwkJZ3BhZGxfaGVhZGVyLT5yYW5nZVswXS5CeXRlT2Zmc2V0ID0gMDsKKwkJZ3BhZGxfaGVhZGVyLT5yYW5nZVswXS5CeXRlQ291bnQgPSBzaXplOwogCQlmb3IgKGkgPSAwOyBpIDwgcGZuY291bnQ7IGkrKykKLQkJCWdwYWRsX2hlYWRlci0+UmFuZ2VbMF0uUGZuQXJyYXlbaV0gPSBwZm4raTsKKwkJCWdwYWRsX2hlYWRlci0+cmFuZ2VbMF0uUGZuQXJyYXlbaV0gPSBwZm4raTsKIAkJKm1zZ2luZm8gPSBtc2doZWFkZXI7CiAJCSptZXNzYWdlY291bnQgPSAxOwogCkBAIC00MjgsMTAgKzQyOCwxMCBAQAogCQkJLyogRklYTUU6IHdlIHByb2JhYmx5IG5lZWQgdG8gbW9yZSBpZiB0aGlzIGZhaWxzICovCiAJCQlpZiAoIW1zZ2JvZHkpCiAJCQkJZ290byBub21lbTsKLQkJCW1zZ2JvZHktPk1lc3NhZ2VTaXplID0gbXNnc2l6ZTsKKwkJCW1zZ2JvZHktPm1zZ3NpemUgPSBtc2dzaXplOwogCQkJKCptZXNzYWdlY291bnQpKys7CiAJCQlncGFkbF9ib2R5ID0KLQkJCQkoc3RydWN0IHZtYnVzX2NoYW5uZWxfZ3BhZGxfYm9keSAqKW1zZ2JvZHktPk1zZzsKKwkJCQkoc3RydWN0IHZtYnVzX2NoYW5uZWxfZ3BhZGxfYm9keSAqKW1zZ2JvZHktPm1zZzsKIAogCQkJLyoKIAkJCSAqIEZJWE1FOgpAQCAtNDQwLDExICs0NDAsMTEgQEAKIAkJCSAqLwogCQkJLyogZ3BhZGxfYm9keS0+R3BhZGwgPSBrYnVmZmVyOyAqLwogCQkJZm9yIChpID0gMDsgaSA8IHBmbmN1cnI7IGkrKykKLQkJCQlncGFkbF9ib2R5LT5QZm5baV0gPSBwZm4gKyBwZm5zdW0gKyBpOworCQkJCWdwYWRsX2JvZHktPnBmbltpXSA9IHBmbiArIHBmbnN1bSArIGk7CiAKIAkJCS8qIGFkZCB0byBtc2cgaGVhZGVyICovCi0JCQlsaXN0X2FkZF90YWlsKCZtc2dib2R5LT5Nc2dMaXN0RW50cnksCi0JCQkJICAgICAgJm1zZ2hlYWRlci0+U3ViTXNnTGlzdCk7CisJCQlsaXN0X2FkZF90YWlsKCZtc2dib2R5LT5tc2dsaXN0ZW50cnksCisJCQkJICAgICAgJm1zZ2hlYWRlci0+c3VibXNnbGlzdCk7CiAJCQlwZm5zdW0gKz0gcGZuY3VycjsKIAkJCXBmbmxlZnQgLT0gcGZuY3VycjsKIAkJfQpAQCAtNDU2LDE3ICs0NTYsMTcgQEAKIAkJbXNnaGVhZGVyID0ga3phbGxvYyhtc2dzaXplLCBHRlBfS0VSTkVMKTsKIAkJaWYgKG1zZ2hlYWRlciA9PSBOVUxMKQogCQkJZ290byBub21lbTsKLQkJbXNnaGVhZGVyLT5NZXNzYWdlU2l6ZSA9IG1zZ3NpemU7CisJCW1zZ2hlYWRlci0+bXNnc2l6ZSA9IG1zZ3NpemU7CiAKIAkJZ3BhZGxfaGVhZGVyID0gKHN0cnVjdCB2bWJ1c19jaGFubmVsX2dwYWRsX2hlYWRlciAqKQotCQkJbXNnaGVhZGVyLT5Nc2c7Ci0JCWdwYWRsX2hlYWRlci0+UmFuZ2VDb3VudCA9IDE7Ci0JCWdwYWRsX2hlYWRlci0+UmFuZ2VCdWZMZW4gPSBzaXplb2Yoc3RydWN0IGdwYV9yYW5nZSkgKworCQkJbXNnaGVhZGVyLT5tc2c7CisJCWdwYWRsX2hlYWRlci0+cmFuZ2Vjb3VudCA9IDE7CisJCWdwYWRsX2hlYWRlci0+cmFuZ2VfYnVmbGVuID0gc2l6ZW9mKHN0cnVjdCBncGFfcmFuZ2UpICsKIAkJCQkJIHBhZ2Vjb3VudCAqIHNpemVvZih1NjQpOwotCQlncGFkbF9oZWFkZXItPlJhbmdlWzBdLkJ5dGVPZmZzZXQgPSAwOwotCQlncGFkbF9oZWFkZXItPlJhbmdlWzBdLkJ5dGVDb3VudCA9IHNpemU7CisJCWdwYWRsX2hlYWRlci0+cmFuZ2VbMF0uQnl0ZU9mZnNldCA9IDA7CisJCWdwYWRsX2hlYWRlci0+cmFuZ2VbMF0uQnl0ZUNvdW50ID0gc2l6ZTsKIAkJZm9yIChpID0gMDsgaSA8IHBhZ2Vjb3VudDsgaSsrKQotCQkJZ3BhZGxfaGVhZGVyLT5SYW5nZVswXS5QZm5BcnJheVtpXSA9IHBmbitpOworCQkJZ3BhZGxfaGVhZGVyLT5yYW5nZVswXS5QZm5BcnJheVtpXSA9IHBmbitpOwogCiAJCSptc2dpbmZvID0gbXNnaGVhZGVyOwogCQkqbWVzc2FnZWNvdW50ID0gMTsKQEAgLTUwOCwyMSArNTA4LDIxIEBACiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAotCW1zZ2luZm8tPldhaXRFdmVudCA9IG9zZF9XYWl0RXZlbnRDcmVhdGUoKTsKLQlpZiAoIW1zZ2luZm8tPldhaXRFdmVudCkgeworCW1zZ2luZm8tPndhaXRldmVudCA9IG9zZF93YWl0ZXZlbnRfY3JlYXRlKCk7CisJaWYgKCFtc2dpbmZvLT53YWl0ZXZlbnQpIHsKIAkJcmV0ID0gLUVOT01FTTsKIAkJZ290byBDbGVhbnVwOwogCX0KIAotCWdwYWRsbXNnID0gKHN0cnVjdCB2bWJ1c19jaGFubmVsX2dwYWRsX2hlYWRlciAqKW1zZ2luZm8tPk1zZzsKLQlncGFkbG1zZy0+SGVhZGVyLk1lc3NhZ2VUeXBlID0gQ2hhbm5lbE1lc3NhZ2VHcGFkbEhlYWRlcjsKLQlncGFkbG1zZy0+Q2hpbGRSZWxJZCA9IGNoYW5uZWwtPk9mZmVyTXNnLkNoaWxkUmVsSWQ7Ci0JZ3BhZGxtc2ctPkdwYWRsID0gbmV4dF9ncGFkbF9oYW5kbGU7CisJZ3BhZGxtc2cgPSAoc3RydWN0IHZtYnVzX2NoYW5uZWxfZ3BhZGxfaGVhZGVyICopbXNnaW5mby0+bXNnOworCWdwYWRsbXNnLT5oZWFkZXIubXNndHlwZSA9IENIQU5ORUxNU0dfR1BBRExfSEVBREVSOworCWdwYWRsbXNnLT5jaGlsZF9yZWxpZCA9IGNoYW5uZWwtPm9mZmVybXNnLmNoaWxkX3JlbGlkOworCWdwYWRsbXNnLT5ncGFkbCA9IG5leHRfZ3BhZGxfaGFuZGxlOwogCiAJZHVtcF9ncGFkbF9oZWFkZXIoZ3BhZGxtc2cpOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmdWbWJ1c0Nvbm5lY3Rpb24uY2hhbm5lbG1zZ19sb2NrLCBmbGFncyk7Ci0JbGlzdF9hZGRfdGFpbCgmbXNnaW5mby0+TXNnTGlzdEVudHJ5LAorCWxpc3RfYWRkX3RhaWwoJm1zZ2luZm8tPm1zZ2xpc3RlbnRyeSwKIAkJICAgICAgJmdWbWJ1c0Nvbm5lY3Rpb24uQ2hhbm5lbE1zZ0xpc3QpOwogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ1ZtYnVzQ29ubmVjdGlvbi5jaGFubmVsbXNnX2xvY2ssIGZsYWdzKTsKQEAgLTUzMCw5ICs1MzAsOSBAQAogCQkgICBrYnVmZmVyLCBzaXplLCBtc2djb3VudCk7CiAKIAlEUFJJTlRfREJHKFZNQlVTLCAiU2VuZGluZyBHUEFETCBIZWFkZXIgLSBsZW4gJXpkIiwKLQkJICAgbXNnaW5mby0+TWVzc2FnZVNpemUgLSBzaXplb2YoKm1zZ2luZm8pKTsKKwkJICAgbXNnaW5mby0+bXNnc2l6ZSAtIHNpemVvZigqbXNnaW5mbykpOwogCi0JcmV0ID0gVm1idXNQb3N0TWVzc2FnZShncGFkbG1zZywgbXNnaW5mby0+TWVzc2FnZVNpemUgLQorCXJldCA9IFZtYnVzUG9zdE1lc3NhZ2UoZ3BhZGxtc2csIG1zZ2luZm8tPm1zZ3NpemUgLQogCQkJICAgICAgIHNpemVvZigqbXNnaW5mbykpOwogCWlmIChyZXQgIT0gMCkgewogCQlEUFJJTlRfRVJSKFZNQlVTLCAiVW5hYmxlIHRvIG9wZW4gY2hhbm5lbCAtICVkIiwgcmV0KTsKQEAgLTU0MCw0OCArNTQwLDQ4IEBACiAJfQogCiAJaWYgKG1zZ2NvdW50ID4gMSkgewotCQlsaXN0X2Zvcl9lYWNoKGN1cnIsICZtc2dpbmZvLT5TdWJNc2dMaXN0KSB7CisJCWxpc3RfZm9yX2VhY2goY3VyciwgJm1zZ2luZm8tPnN1Ym1zZ2xpc3QpIHsKIAogCQkJLyogRklYTUU6IHNob3VsZCB0aGlzIHVzZSBsaXN0X2VudHJ5KCkgaW5zdGVhZCA/ICovCiAJCQlzdWJtc2dpbmZvID0gKHN0cnVjdCB2bWJ1c19jaGFubmVsX21zZ2luZm8gKiljdXJyOwogCQkJZ3BhZGxfYm9keSA9Ci0JCQkgICAgIChzdHJ1Y3Qgdm1idXNfY2hhbm5lbF9ncGFkbF9ib2R5ICopc3VibXNnaW5mby0+TXNnOworCQkJICAgICAoc3RydWN0IHZtYnVzX2NoYW5uZWxfZ3BhZGxfYm9keSAqKXN1Ym1zZ2luZm8tPm1zZzsKIAotCQkJZ3BhZGxfYm9keS0+SGVhZGVyLk1lc3NhZ2VUeXBlID0KLQkJCQlDaGFubmVsTWVzc2FnZUdwYWRsQm9keTsKLQkJCWdwYWRsX2JvZHktPkdwYWRsID0gbmV4dF9ncGFkbF9oYW5kbGU7CisJCQlncGFkbF9ib2R5LT5oZWFkZXIubXNndHlwZSA9CisJCQkJQ0hBTk5FTE1TR19HUEFETF9CT0RZOworCQkJZ3BhZGxfYm9keS0+Z3BhZGwgPSBuZXh0X2dwYWRsX2hhbmRsZTsKIAogCQkJRFBSSU5UX0RCRyhWTUJVUywgIlNlbmRpbmcgR1BBREwgQm9keSAtIGxlbiAlemQiLAotCQkJCSAgIHN1Ym1zZ2luZm8tPk1lc3NhZ2VTaXplIC0KKwkJCQkgICBzdWJtc2dpbmZvLT5tc2dzaXplIC0KIAkJCQkgICBzaXplb2YoKnN1Ym1zZ2luZm8pKTsKIAotCQkJZHVtcF9ncGFkbF9ib2R5KGdwYWRsX2JvZHksIHN1Ym1zZ2luZm8tPk1lc3NhZ2VTaXplIC0KKwkJCWR1bXBfZ3BhZGxfYm9keShncGFkbF9ib2R5LCBzdWJtc2dpbmZvLT5tc2dzaXplIC0KIAkJCQkgICAgICBzaXplb2YoKnN1Ym1zZ2luZm8pKTsKIAkJCXJldCA9IFZtYnVzUG9zdE1lc3NhZ2UoZ3BhZGxfYm9keSwKLQkJCQkJICAgICAgIHN1Ym1zZ2luZm8tPk1lc3NhZ2VTaXplIC0KKwkJCQkJICAgICAgIHN1Ym1zZ2luZm8tPm1zZ3NpemUgLQogCQkJCQkgICAgICAgc2l6ZW9mKCpzdWJtc2dpbmZvKSk7CiAJCQlpZiAocmV0ICE9IDApCiAJCQkJZ290byBDbGVhbnVwOwogCiAJCX0KIAl9Ci0Jb3NkX1dhaXRFdmVudFdhaXQobXNnaW5mby0+V2FpdEV2ZW50KTsKKwlvc2Rfd2FpdGV2ZW50X3dhaXQobXNnaW5mby0+d2FpdGV2ZW50KTsKIAogCS8qIEF0IHRoaXMgcG9pbnQsIHdlIHJlY2VpdmVkIHRoZSBncGFkbCBjcmVhdGVkIG1zZyAqLwogCURQUklOVF9EQkcoVk1CVVMsICJSZWNlaXZlZCBHUEFETCBjcmVhdGVkICIKIAkJICAgIihyZWxpZCAlZCwgc3RhdHVzICVkIGhhbmRsZSAleCkiLAotCQkgICBjaGFubmVsLT5PZmZlck1zZy5DaGlsZFJlbElkLAotCQkgICBtc2dpbmZvLT5SZXNwb25zZS5HcGFkbENyZWF0ZWQuQ3JlYXRpb25TdGF0dXMsCi0JCSAgIGdwYWRsbXNnLT5HcGFkbCk7CisJCSAgIGNoYW5uZWwtPm9mZmVybXNnLmNoaWxkX3JlbGlkLAorCQkgICBtc2dpbmZvLT5yZXNwb25zZS5ncGFkbF9jcmVhdGVkLmNyZWF0aW9uX3N0YXR1cywKKwkJICAgZ3BhZGxtc2ctPmdwYWRsKTsKIAotCSpncGFkbF9oYW5kbGUgPSBncGFkbG1zZy0+R3BhZGw7CisJKmdwYWRsX2hhbmRsZSA9IGdwYWRsbXNnLT5ncGFkbDsKIAogQ2xlYW51cDoKIAlzcGluX2xvY2tfaXJxc2F2ZSgmZ1ZtYnVzQ29ubmVjdGlvbi5jaGFubmVsbXNnX2xvY2ssIGZsYWdzKTsKLQlsaXN0X2RlbCgmbXNnaW5mby0+TXNnTGlzdEVudHJ5KTsKKwlsaXN0X2RlbCgmbXNnaW5mby0+bXNnbGlzdGVudHJ5KTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZnVm1idXNDb25uZWN0aW9uLmNoYW5uZWxtc2dfbG9jaywgZmxhZ3MpOwogCi0Ja2ZyZWUobXNnaW5mby0+V2FpdEV2ZW50KTsKKwlrZnJlZShtc2dpbmZvLT53YWl0ZXZlbnQpOwogCWtmcmVlKG1zZ2luZm8pOwogCXJldHVybiByZXQ7CiB9CkBAIC02MDQsMjAgKzYwNCwyMCBAQAogCWlmICghaW5mbykKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlpbmZvLT5XYWl0RXZlbnQgPSBvc2RfV2FpdEV2ZW50Q3JlYXRlKCk7Ci0JaWYgKCFpbmZvLT5XYWl0RXZlbnQpIHsKKwlpbmZvLT53YWl0ZXZlbnQgPSBvc2Rfd2FpdGV2ZW50X2NyZWF0ZSgpOworCWlmICghaW5mby0+d2FpdGV2ZW50KSB7CiAJCWtmcmVlKGluZm8pOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKLQltc2cgPSAoc3RydWN0IHZtYnVzX2NoYW5uZWxfZ3BhZGxfdGVhcmRvd24gKilpbmZvLT5Nc2c7CisJbXNnID0gKHN0cnVjdCB2bWJ1c19jaGFubmVsX2dwYWRsX3RlYXJkb3duICopaW5mby0+bXNnOwogCi0JbXNnLT5IZWFkZXIuTWVzc2FnZVR5cGUgPSBDaGFubmVsTWVzc2FnZUdwYWRsVGVhcmRvd247Ci0JbXNnLT5DaGlsZFJlbElkID0gY2hhbm5lbC0+T2ZmZXJNc2cuQ2hpbGRSZWxJZDsKLQltc2ctPkdwYWRsID0gZ3BhZGxfaGFuZGxlOworCW1zZy0+aGVhZGVyLm1zZ3R5cGUgPSBDSEFOTkVMTVNHX0dQQURMX1RFQVJET1dOOworCW1zZy0+Y2hpbGRfcmVsaWQgPSBjaGFubmVsLT5vZmZlcm1zZy5jaGlsZF9yZWxpZDsKKwltc2ctPmdwYWRsID0gZ3BhZGxfaGFuZGxlOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmdWbWJ1c0Nvbm5lY3Rpb24uY2hhbm5lbG1zZ19sb2NrLCBmbGFncyk7Ci0JbGlzdF9hZGRfdGFpbCgmaW5mby0+TXNnTGlzdEVudHJ5LAorCWxpc3RfYWRkX3RhaWwoJmluZm8tPm1zZ2xpc3RlbnRyeSwKIAkJICAgICAgJmdWbWJ1c0Nvbm5lY3Rpb24uQ2hhbm5lbE1zZ0xpc3QpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdWbWJ1c0Nvbm5lY3Rpb24uY2hhbm5lbG1zZ19sb2NrLCBmbGFncyk7CiAKQEAgLTYyOCwxNCArNjI4LDE0IEBACiAJCS8qIHNvbWV0aGluZy4uLiAqLwogCX0KIAotCW9zZF9XYWl0RXZlbnRXYWl0KGluZm8tPldhaXRFdmVudCk7CisJb3NkX3dhaXRldmVudF93YWl0KGluZm8tPndhaXRldmVudCk7CiAKIAkvKiBSZWNlaXZlZCBhIHRvcm5kb3duIHJlc3BvbnNlICovCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmdWbWJ1c0Nvbm5lY3Rpb24uY2hhbm5lbG1zZ19sb2NrLCBmbGFncyk7Ci0JbGlzdF9kZWwoJmluZm8tPk1zZ0xpc3RFbnRyeSk7CisJbGlzdF9kZWwoJmluZm8tPm1zZ2xpc3RlbnRyeSk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ1ZtYnVzQ29ubmVjdGlvbi5jaGFubmVsbXNnX2xvY2ssIGZsYWdzKTsKIAotCWtmcmVlKGluZm8tPldhaXRFdmVudCk7CisJa2ZyZWUoaW5mby0+d2FpdGV2ZW50KTsKIAlrZnJlZShpbmZvKTsKIAlyZXR1cm4gcmV0OwogfQpAQCAtNjUyLDcgKzY1Miw3IEBACiAJaW50IHJldDsKIAogCS8qIFN0b3AgY2FsbGJhY2sgYW5kIGNhbmNlbCB0aGUgdGltZXIgYXNhcCAqLwotCWNoYW5uZWwtPk9uQ2hhbm5lbENhbGxiYWNrID0gTlVMTDsKKwljaGFubmVsLT5vbmNoYW5uZWxfY2FsbGJhY2sgPSBOVUxMOwogCWRlbF90aW1lcl9zeW5jKCZjaGFubmVsLT5wb2xsX3RpbWVyKTsKIAogCS8qIFNlbmQgYSBjbG9zaW5nIG1lc3NhZ2UgKi8KQEAgLTY2MywxMSArNjYzLDExIEBACiAJaWYgKCFpbmZvKQogCQlyZXR1cm47CiAKLQkvKiBpbmZvLT53YWl0RXZlbnQgPSBvc2RfV2FpdEV2ZW50Q3JlYXRlKCk7ICovCisJLyogaW5mby0+d2FpdEV2ZW50ID0gb3NkX3dhaXRldmVudF9jcmVhdGUoKTsgKi8KIAotCW1zZyA9IChzdHJ1Y3Qgdm1idXNfY2hhbm5lbF9jbG9zZV9jaGFubmVsICopaW5mby0+TXNnOwotCW1zZy0+SGVhZGVyLk1lc3NhZ2VUeXBlID0gQ2hhbm5lbE1lc3NhZ2VDbG9zZUNoYW5uZWw7Ci0JbXNnLT5DaGlsZFJlbElkID0gY2hhbm5lbC0+T2ZmZXJNc2cuQ2hpbGRSZWxJZDsKKwltc2cgPSAoc3RydWN0IHZtYnVzX2NoYW5uZWxfY2xvc2VfY2hhbm5lbCAqKWluZm8tPm1zZzsKKwltc2ctPmhlYWRlci5tc2d0eXBlID0gQ0hBTk5FTE1TR19DTE9TRUNIQU5ORUw7CisJbXNnLT5jaGlsZF9yZWxpZCA9IGNoYW5uZWwtPm9mZmVybXNnLmNoaWxkX3JlbGlkOwogCiAJcmV0ID0gVm1idXNQb3N0TWVzc2FnZShtc2csIHNpemVvZihzdHJ1Y3Qgdm1idXNfY2hhbm5lbF9jbG9zZV9jaGFubmVsKSk7CiAJaWYgKHJldCAhPSAwKSB7CkBAIC02NzYsMTcgKzY3NiwxNyBAQAogCX0KIAogCS8qIFRlYXIgZG93biB0aGUgZ3BhZGwgZm9yIHRoZSBjaGFubmVsJ3MgcmluZyBidWZmZXIgKi8KLQlpZiAoY2hhbm5lbC0+UmluZ0J1ZmZlckdwYWRsSGFuZGxlKQorCWlmIChjaGFubmVsLT5yaW5nYnVmZmVyX2dwYWRsaGFuZGxlKQogCQl2bWJ1c190ZWFyZG93bl9ncGFkbChjaGFubmVsLAotCQkJCQkgIGNoYW5uZWwtPlJpbmdCdWZmZXJHcGFkbEhhbmRsZSk7CisJCQkJCSAgY2hhbm5lbC0+cmluZ2J1ZmZlcl9ncGFkbGhhbmRsZSk7CiAKIAkvKiBUT0RPOiBTZW5kIGEgbXNnIHRvIHJlbGVhc2UgdGhlIGNoaWxkUmVsSWQgKi8KIAogCS8qIENsZWFudXAgdGhlIHJpbmcgYnVmZmVycyBmb3IgdGhpcyBjaGFubmVsICovCi0JUmluZ0J1ZmZlckNsZWFudXAoJmNoYW5uZWwtPk91dGJvdW5kKTsKLQlSaW5nQnVmZmVyQ2xlYW51cCgmY2hhbm5lbC0+SW5ib3VuZCk7CisJcmluZ2J1ZmZlcl9jbGVhbnVwKCZjaGFubmVsLT5vdXRib3VuZCk7CisJcmluZ2J1ZmZlcl9jbGVhbnVwKCZjaGFubmVsLT5pbmJvdW5kKTsKIAotCW9zZF9QYWdlRnJlZShjaGFubmVsLT5SaW5nQnVmZmVyUGFnZXMsIGNoYW5uZWwtPlJpbmdCdWZmZXJQYWdlQ291bnQpOworCW9zZF9wYWdlX2ZyZWUoY2hhbm5lbC0+cmluZ2J1ZmZlcl9wYWdlcywgY2hhbm5lbC0+cmluZ2J1ZmZlcl9wYWdlY291bnQpOwogCiAJa2ZyZWUoaW5mbyk7CiAKQEAgLTY5Niw5ICs2OTYsOSBAQAogCSAqIGNhbGxlciB3aWxsIGZyZWUgdGhlIGNoYW5uZWwKIAkgKi8KIAotCWlmIChjaGFubmVsLT5TdGF0ZSA9PSBDSEFOTkVMX09QRU5fU1RBVEUpIHsKKwlpZiAoY2hhbm5lbC0+c3RhdGUgPT0gQ0hBTk5FTF9PUEVOX1NUQVRFKSB7CiAJCXNwaW5fbG9ja19pcnFzYXZlKCZnVm1idXNDb25uZWN0aW9uLmNoYW5uZWxfbG9jaywgZmxhZ3MpOwotCQlsaXN0X2RlbCgmY2hhbm5lbC0+TGlzdEVudHJ5KTsKKwkJbGlzdF9kZWwoJmNoYW5uZWwtPmxpc3RlbnRyeSk7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdWbWJ1c0Nvbm5lY3Rpb24uY2hhbm5lbF9sb2NrLCBmbGFncyk7CiAKIAkJZnJlZV9jaGFubmVsKGNoYW5uZWwpOwpAQCAtNzUyLDEwICs3NTIsMTAgQEAKIAlzZ19zZXRfYnVmKCZidWZmZXJsaXN0WzJdLCAmYWxpZ25lZF9kYXRhLAogCQkgICBwYWNrZXRsZW5fYWxpZ25lZCAtIHBhY2tldGxlbik7CiAKLQlyZXQgPSBSaW5nQnVmZmVyV3JpdGUoJmNoYW5uZWwtPk91dGJvdW5kLCBidWZmZXJsaXN0LCAzKTsKKwlyZXQgPSByaW5nYnVmZmVyX3dyaXRlKCZjaGFubmVsLT5vdXRib3VuZCwgYnVmZmVybGlzdCwgMyk7CiAKIAkvKiBUT0RPOiBXZSBzaG91bGQgZGV0ZXJtaW5lIGlmIHRoaXMgaXMgb3B0aW9uYWwgKi8KLQlpZiAocmV0ID09IDAgJiYgIUdldFJpbmdCdWZmZXJJbnRlcnJ1cHRNYXNrKCZjaGFubmVsLT5PdXRib3VuZCkpCisJaWYgKHJldCA9PSAwICYmICFnZXRfcmluZ2J1ZmZlcl9pbnRlcnJ1cHRfbWFzaygmY2hhbm5lbC0+b3V0Ym91bmQpKQogCQl2bWJ1c19zZXRldmVudChjaGFubmVsKTsKIAogCXJldHVybiByZXQ7CkBAIC04MTcsMTAgKzgxNywxMCBAQAogCXNnX3NldF9idWYoJmJ1ZmZlcmxpc3RbMl0sICZhbGlnbmVkX2RhdGEsCiAJCXBhY2tldGxlbl9hbGlnbmVkIC0gcGFja2V0bGVuKTsKIAotCXJldCA9IFJpbmdCdWZmZXJXcml0ZSgmY2hhbm5lbC0+T3V0Ym91bmQsIGJ1ZmZlcmxpc3QsIDMpOworCXJldCA9IHJpbmdidWZmZXJfd3JpdGUoJmNoYW5uZWwtPm91dGJvdW5kLCBidWZmZXJsaXN0LCAzKTsKIAogCS8qIFRPRE86IFdlIHNob3VsZCBkZXRlcm1pbmUgaWYgdGhpcyBpcyBvcHRpb25hbCAqLwotCWlmIChyZXQgPT0gMCAmJiAhR2V0UmluZ0J1ZmZlckludGVycnVwdE1hc2soJmNoYW5uZWwtPk91dGJvdW5kKSkKKwlpZiAocmV0ID09IDAgJiYgIWdldF9yaW5nYnVmZmVyX2ludGVycnVwdF9tYXNrKCZjaGFubmVsLT5vdXRib3VuZCkpCiAJCXZtYnVzX3NldGV2ZW50KGNoYW5uZWwpOwogCiAJcmV0dXJuIHJldDsKQEAgLTg4NiwxMCArODg2LDEwIEBACiAJc2dfc2V0X2J1ZigmYnVmZmVybGlzdFsyXSwgJmFsaWduZWRfZGF0YSwKIAkJcGFja2V0bGVuX2FsaWduZWQgLSBwYWNrZXRsZW4pOwogCi0JcmV0ID0gUmluZ0J1ZmZlcldyaXRlKCZjaGFubmVsLT5PdXRib3VuZCwgYnVmZmVybGlzdCwgMyk7CisJcmV0ID0gcmluZ2J1ZmZlcl93cml0ZSgmY2hhbm5lbC0+b3V0Ym91bmQsIGJ1ZmZlcmxpc3QsIDMpOwogCiAJLyogVE9ETzogV2Ugc2hvdWxkIGRldGVybWluZSBpZiB0aGlzIGlzIG9wdGlvbmFsICovCi0JaWYgKHJldCA9PSAwICYmICFHZXRSaW5nQnVmZmVySW50ZXJydXB0TWFzaygmY2hhbm5lbC0+T3V0Ym91bmQpKQorCWlmIChyZXQgPT0gMCAmJiAhZ2V0X3JpbmdidWZmZXJfaW50ZXJydXB0X21hc2soJmNoYW5uZWwtPm91dGJvdW5kKSkKIAkJdm1idXNfc2V0ZXZlbnQoY2hhbm5lbCk7CiAKIAlyZXR1cm4gcmV0OwpAQCAtOTIzLDcgKzkyMyw3IEBACiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmY2hhbm5lbC0+aW5ib3VuZF9sb2NrLCBmbGFncyk7CiAKLQlyZXQgPSBSaW5nQnVmZmVyUGVlaygmY2hhbm5lbC0+SW5ib3VuZCwgJmRlc2MsCisJcmV0ID0gcmluZ2J1ZmZlcl9wZWVrKCZjaGFubmVsLT5pbmJvdW5kLCAmZGVzYywKIAkJCSAgICAgc2l6ZW9mKHN0cnVjdCB2bXBhY2tldF9kZXNjcmlwdG9yKSk7CiAJaWYgKHJldCAhPSAwKSB7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoYW5uZWwtPmluYm91bmRfbG9jaywgZmxhZ3MpOwpAQCAtOTQwLDcgKzk0MCw3IEBACiAKIAlEUFJJTlRfREJHKFZNQlVTLCAicGFja2V0IHJlY2VpdmVkIG9uIGNoYW5uZWwgJXAgcmVsaWQgJWQgPHR5cGUgJWQgIgogCQkgICAiZmxhZyAlZCB0aWQgJWxseCBwa3RsZW4gJWQgZGF0YWxlbiAlZD4gIiwKLQkJICAgY2hhbm5lbCwgY2hhbm5lbC0+T2ZmZXJNc2cuQ2hpbGRSZWxJZCwgZGVzYy5UeXBlLAorCQkgICBjaGFubmVsLCBjaGFubmVsLT5vZmZlcm1zZy5jaGlsZF9yZWxpZCwgZGVzYy5UeXBlLAogCQkgICBkZXNjLkZsYWdzLCBkZXNjLlRyYW5zYWN0aW9uSWQsIHBhY2tldGxlbiwgdXNlcmxlbik7CiAKIAkqYnVmZmVyX2FjdHVhbF9sZW4gPSB1c2VybGVuOwpAQCAtOTU2LDcgKzk1Niw3IEBACiAJKnJlcXVlc3RpZCA9IGRlc2MuVHJhbnNhY3Rpb25JZDsKIAogCS8qIENvcHkgb3ZlciB0aGUgcGFja2V0IHRvIHRoZSB1c2VyIGJ1ZmZlciAqLwotCXJldCA9IFJpbmdCdWZmZXJSZWFkKCZjaGFubmVsLT5JbmJvdW5kLCBidWZmZXIsIHVzZXJsZW4sCisJcmV0ID0gcmluZ2J1ZmZlcl9yZWFkKCZjaGFubmVsLT5pbmJvdW5kLCBidWZmZXIsIHVzZXJsZW4sCiAJCQkgICAgIChkZXNjLkRhdGFPZmZzZXQ4IDw8IDMpKTsKIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoYW5uZWwtPmluYm91bmRfbG9jaywgZmxhZ3MpOwpAQCAtOTgzLDcgKzk4Myw3IEBACiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmY2hhbm5lbC0+aW5ib3VuZF9sb2NrLCBmbGFncyk7CiAKLQlyZXQgPSBSaW5nQnVmZmVyUGVlaygmY2hhbm5lbC0+SW5ib3VuZCwgJmRlc2MsCisJcmV0ID0gcmluZ2J1ZmZlcl9wZWVrKCZjaGFubmVsLT5pbmJvdW5kLCAmZGVzYywKIAkJCSAgICAgc2l6ZW9mKHN0cnVjdCB2bXBhY2tldF9kZXNjcmlwdG9yKSk7CiAJaWYgKHJldCAhPSAwKSB7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoYW5uZWwtPmluYm91bmRfbG9jaywgZmxhZ3MpOwpAQCAtOTk5LDcgKzk5OSw3IEBACiAKIAlEUFJJTlRfREJHKFZNQlVTLCAicGFja2V0IHJlY2VpdmVkIG9uIGNoYW5uZWwgJXAgcmVsaWQgJWQgPHR5cGUgJWQgIgogCQkgICAiZmxhZyAlZCB0aWQgJWxseCBwa3RsZW4gJWQgZGF0YWxlbiAlZD4gIiwKLQkJICAgY2hhbm5lbCwgY2hhbm5lbC0+T2ZmZXJNc2cuQ2hpbGRSZWxJZCwgZGVzYy5UeXBlLAorCQkgICBjaGFubmVsLCBjaGFubmVsLT5vZmZlcm1zZy5jaGlsZF9yZWxpZCwgZGVzYy5UeXBlLAogCQkgICBkZXNjLkZsYWdzLCBkZXNjLlRyYW5zYWN0aW9uSWQsIHBhY2tldGxlbiwgdXNlcmxlbik7CiAKIAkqYnVmZmVyX2FjdHVhbF9sZW4gPSBwYWNrZXRsZW47CkBAIC0xMDE1LDcgKzEwMTUsNyBAQAogCSpyZXF1ZXN0aWQgPSBkZXNjLlRyYW5zYWN0aW9uSWQ7CiAKIAkvKiBDb3B5IG92ZXIgdGhlIGVudGlyZSBwYWNrZXQgdG8gdGhlIHVzZXIgYnVmZmVyICovCi0JcmV0ID0gUmluZ0J1ZmZlclJlYWQoJmNoYW5uZWwtPkluYm91bmQsIGJ1ZmZlciwgcGFja2V0bGVuLCAwKTsKKwlyZXQgPSByaW5nYnVmZmVyX3JlYWQoJmNoYW5uZWwtPmluYm91bmQsIGJ1ZmZlciwgcGFja2V0bGVuLCAwKTsKIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoYW5uZWwtPmluYm91bmRfbG9jaywgZmxhZ3MpOwogCXJldHVybiAwOwpAQCAtMTAzMCw3ICsxMDMwLDcgQEAKIAlkdW1wX3ZtYnVzX2NoYW5uZWwoY2hhbm5lbCk7CiAJLyogQVNTRVJUKENoYW5uZWwtPk9uQ2hhbm5lbENhbGxiYWNrKTsgKi8KIAotCWNoYW5uZWwtPk9uQ2hhbm5lbENhbGxiYWNrKGNoYW5uZWwtPkNoYW5uZWxDYWxsYmFja0NvbnRleHQpOworCWNoYW5uZWwtPm9uY2hhbm5lbF9jYWxsYmFjayhjaGFubmVsLT5jaGFubmVsX2NhbGxiYWNrX2NvbnRleHQpOwogCiAJbW9kX3RpbWVyKCZjaGFubmVsLT5wb2xsX3RpbWVyLCBqaWZmaWVzICsgdXNlY3NfdG9famlmZmllcygxMDApKTsKIH0KQEAgLTEwNDIsOCArMTA0Miw4IEBACiB7CiAJc3RydWN0IHZtYnVzX2NoYW5uZWwgKmNoYW5uZWwgPSAoc3RydWN0IHZtYnVzX2NoYW5uZWwgKilkYXRhOwogCi0JaWYgKGNoYW5uZWwtPk9uQ2hhbm5lbENhbGxiYWNrKQotCQljaGFubmVsLT5PbkNoYW5uZWxDYWxsYmFjayhjaGFubmVsLT5DaGFubmVsQ2FsbGJhY2tDb250ZXh0KTsKKwlpZiAoY2hhbm5lbC0+b25jaGFubmVsX2NhbGxiYWNrKQorCQljaGFubmVsLT5vbmNoYW5uZWxfY2FsbGJhY2soY2hhbm5lbC0+Y2hhbm5lbF9jYWxsYmFja19jb250ZXh0KTsKIH0KIAogLyoKQEAgLTEwNTEsNyArMTA1MSw3IEBACiAgKi8KIHN0YXRpYyB2b2lkIGR1bXBfdm1idXNfY2hhbm5lbChzdHJ1Y3Qgdm1idXNfY2hhbm5lbCAqY2hhbm5lbCkKIHsKLQlEUFJJTlRfREJHKFZNQlVTLCAiQ2hhbm5lbCAoJWQpIiwgY2hhbm5lbC0+T2ZmZXJNc2cuQ2hpbGRSZWxJZCk7Ci0JRHVtcFJpbmdJbmZvKCZjaGFubmVsLT5PdXRib3VuZCwgIk91dGJvdW5kICIpOwotCUR1bXBSaW5nSW5mbygmY2hhbm5lbC0+SW5ib3VuZCwgIkluYm91bmQgIik7CisJRFBSSU5UX0RCRyhWTUJVUywgIkNoYW5uZWwgKCVkKSIsIGNoYW5uZWwtPm9mZmVybXNnLmNoaWxkX3JlbGlkKTsKKwlkdW1wX3JpbmdfaW5mbygmY2hhbm5lbC0+b3V0Ym91bmQsICJPdXRib3VuZCAiKTsKKwlkdW1wX3JpbmdfaW5mbygmY2hhbm5lbC0+aW5ib3VuZCwgIkluYm91bmQgIik7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaHYvY2hhbm5lbF9tZ210LmMgYi9kcml2ZXJzL3N0YWdpbmcvaHYvY2hhbm5lbF9tZ210LmMKaW5kZXggNDVkYmUzMC4uZDQ0ZDVjMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2h2L2NoYW5uZWxfbWdtdC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9odi9jaGFubmVsX21nbXQuYwpAQCAtMjUxLDggKzI1MSw4IEBACiAJY2hhbm5lbC0+cG9sbF90aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpY2hhbm5lbDsKIAljaGFubmVsLT5wb2xsX3RpbWVyLmZ1bmN0aW9uID0gdm1idXNfb250aW1lcjsKIAotCWNoYW5uZWwtPkNvbnRyb2xXUSA9IGNyZWF0ZV93b3JrcXVldWUoImh2X3ZtYnVzX2N0bCIpOwotCWlmICghY2hhbm5lbC0+Q29udHJvbFdRKSB7CisJY2hhbm5lbC0+Y29udHJvbHdxID0gY3JlYXRlX3dvcmtxdWV1ZSgiaHZfdm1idXNfY3RsIik7CisJaWYgKCFjaGFubmVsLT5jb250cm9sd3EpIHsKIAkJa2ZyZWUoY2hhbm5lbCk7CiAJCXJldHVybiBOVUxMOwogCX0KQEAgLTI2MywxMiArMjYzLDE0IEBACiAvKgogICogcmVsZWFzZV9oYW5uZWwgLSBSZWxlYXNlIHRoZSB2bWJ1cyBjaGFubmVsIG9iamVjdCBpdHNlbGYKICAqLwotc3RhdGljIGlubGluZSB2b2lkIHJlbGVhc2VfY2hhbm5lbCh2b2lkICpjb250ZXh0KQorc3RhdGljIHZvaWQgcmVsZWFzZV9jaGFubmVsKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKLQlzdHJ1Y3Qgdm1idXNfY2hhbm5lbCAqY2hhbm5lbCA9IGNvbnRleHQ7CisJc3RydWN0IHZtYnVzX2NoYW5uZWwgKmNoYW5uZWwgPSBjb250YWluZXJfb2Yod29yaywKKwkJCQkJCSAgICAgc3RydWN0IHZtYnVzX2NoYW5uZWwsCisJCQkJCQkgICAgIHdvcmspOwogCiAJRFBSSU5UX0RCRyhWTUJVUywgInJlbGVhc2luZyBjaGFubmVsICglcCkiLCBjaGFubmVsKTsKLQlkZXN0cm95X3dvcmtxdWV1ZShjaGFubmVsLT5Db250cm9sV1EpOworCWRlc3Ryb3lfd29ya3F1ZXVlKGNoYW5uZWwtPmNvbnRyb2x3cSk7CiAJRFBSSU5UX0RCRyhWTUJVUywgImNoYW5uZWwgcmVsZWFzZWQgKCVwKSIsIGNoYW5uZWwpOwogCiAJa2ZyZWUoY2hhbm5lbCk7CkBAIC0yODYsOCArMjg4LDggQEAKIAkgKiB3b3JrcXVldWUvdGhyZWFkIGNvbnRleHQKIAkgKiBpZSB3ZSBjYW4ndCBkZXN0cm95IG91cnNlbHZlcy4KIAkgKi8KLQlvc2Rfc2NoZWR1bGVfY2FsbGJhY2soZ1ZtYnVzQ29ubmVjdGlvbi5Xb3JrUXVldWUsIHJlbGVhc2VfY2hhbm5lbCwKLQkJCSAgICAgIGNoYW5uZWwpOworCUlOSVRfV09SSygmY2hhbm5lbC0+d29yaywgcmVsZWFzZV9jaGFubmVsKTsKKwlxdWV1ZV93b3JrKGdWbWJ1c0Nvbm5lY3Rpb24uV29ya1F1ZXVlLCAmY2hhbm5lbC0+d29yayk7CiB9CiAKIApAQCAtMzA4LDI5ICszMTAsNDYgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZnVm1idXNDb25uZWN0aW9uLmNoYW5uZWxfbG9jaywgZmxhZ3MpOwogfQogCisvKgorICogdm1idXNfcHJvY2Vzc19yZXNjaW5kX29mZmVyIC0KKyAqIFJlc2NpbmQgdGhlIG9mZmVyIGJ5IGluaXRpYXRpbmcgYSBkZXZpY2UgcmVtb3ZhbAorICovCitzdGF0aWMgdm9pZCB2bWJ1c19wcm9jZXNzX3Jlc2NpbmRfb2ZmZXIoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCB2bWJ1c19jaGFubmVsICpjaGFubmVsID0gY29udGFpbmVyX29mKHdvcmssCisJCQkJCQkgICAgIHN0cnVjdCB2bWJ1c19jaGFubmVsLAorCQkJCQkJICAgICB3b3JrKTsKKworCXZtYnVzX2NoaWxkX2RldmljZV91bnJlZ2lzdGVyKGNoYW5uZWwtPmRldmljZV9vYmopOworfQogCiAvKgogICogdm1idXNfcHJvY2Vzc19vZmZlciAtIFByb2Nlc3MgdGhlIG9mZmVyIGJ5IGNyZWF0aW5nIGEgY2hhbm5lbC9kZXZpY2UKICAqIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG9mZmVyCiAgKi8KLXN0YXRpYyB2b2lkIHZtYnVzX3Byb2Nlc3Nfb2ZmZXIodm9pZCAqY29udGV4dCkKK3N0YXRpYyB2b2lkIHZtYnVzX3Byb2Nlc3Nfb2ZmZXIoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewotCXN0cnVjdCB2bWJ1c19jaGFubmVsICpuZXdjaGFubmVsID0gY29udGV4dDsKKwlzdHJ1Y3Qgdm1idXNfY2hhbm5lbCAqbmV3Y2hhbm5lbCA9IGNvbnRhaW5lcl9vZih3b3JrLAorCQkJCQkJCXN0cnVjdCB2bWJ1c19jaGFubmVsLAorCQkJCQkJCXdvcmspOwogCXN0cnVjdCB2bWJ1c19jaGFubmVsICpjaGFubmVsOwogCWJvb2wgZm5ldyA9IHRydWU7CiAJaW50IHJldDsKIAlpbnQgY250OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKKwkvKiBUaGUgbmV4dCBwb3NzaWJsZSB3b3JrIGlzIHJlc2NpbmQgaGFuZGxpbmcgKi8KKwlJTklUX1dPUksoJm5ld2NoYW5uZWwtPndvcmssIHZtYnVzX3Byb2Nlc3NfcmVzY2luZF9vZmZlcik7CisKIAkvKiBNYWtlIHN1cmUgdGhpcyBpcyBhIG5ldyBvZmZlciAqLwogCXNwaW5fbG9ja19pcnFzYXZlKCZnVm1idXNDb25uZWN0aW9uLmNoYW5uZWxfbG9jaywgZmxhZ3MpOwogCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShjaGFubmVsLCAmZ1ZtYnVzQ29ubmVjdGlvbi5DaGFubmVsTGlzdCwgTGlzdEVudHJ5KSB7Ci0JCWlmICghbWVtY21wKCZjaGFubmVsLT5PZmZlck1zZy5PZmZlci5JbnRlcmZhY2VUeXBlLAotCQkJICAgICZuZXdjaGFubmVsLT5PZmZlck1zZy5PZmZlci5JbnRlcmZhY2VUeXBlLAorCWxpc3RfZm9yX2VhY2hfZW50cnkoY2hhbm5lbCwgJmdWbWJ1c0Nvbm5lY3Rpb24uQ2hhbm5lbExpc3QsIGxpc3RlbnRyeSkgeworCQlpZiAoIW1lbWNtcCgmY2hhbm5lbC0+b2ZmZXJtc2cub2ZmZXIuSW50ZXJmYWNlVHlwZSwKKwkJCSAgICAmbmV3Y2hhbm5lbC0+b2ZmZXJtc2cub2ZmZXIuSW50ZXJmYWNlVHlwZSwKIAkJCSAgICBzaXplb2Yoc3RydWN0IGh2X2d1aWQpKSAmJgotCQkgICAgIW1lbWNtcCgmY2hhbm5lbC0+T2ZmZXJNc2cuT2ZmZXIuSW50ZXJmYWNlSW5zdGFuY2UsCi0JCQkgICAgJm5ld2NoYW5uZWwtPk9mZmVyTXNnLk9mZmVyLkludGVyZmFjZUluc3RhbmNlLAorCQkgICAgIW1lbWNtcCgmY2hhbm5lbC0+b2ZmZXJtc2cub2ZmZXIuSW50ZXJmYWNlSW5zdGFuY2UsCisJCQkgICAgJm5ld2NoYW5uZWwtPm9mZmVybXNnLm9mZmVyLkludGVyZmFjZUluc3RhbmNlLAogCQkJICAgIHNpemVvZihzdHJ1Y3QgaHZfZ3VpZCkpKSB7CiAJCQlmbmV3ID0gZmFsc2U7CiAJCQlicmVhazsKQEAgLTMzOCwxNCArMzU3LDE0IEBACiAJfQogCiAJaWYgKGZuZXcpCi0JCWxpc3RfYWRkX3RhaWwoJm5ld2NoYW5uZWwtPkxpc3RFbnRyeSwKKwkJbGlzdF9hZGRfdGFpbCgmbmV3Y2hhbm5lbC0+bGlzdGVudHJ5LAogCQkJICAgICAgJmdWbWJ1c0Nvbm5lY3Rpb24uQ2hhbm5lbExpc3QpOwogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ1ZtYnVzQ29ubmVjdGlvbi5jaGFubmVsX2xvY2ssIGZsYWdzKTsKIAogCWlmICghZm5ldykgewogCQlEUFJJTlRfREJHKFZNQlVTLCAiSWdub3JpbmcgZHVwbGljYXRlIG9mZmVyIGZvciByZWxpZCAoJWQpIiwKLQkJCSAgIG5ld2NoYW5uZWwtPk9mZmVyTXNnLkNoaWxkUmVsSWQpOworCQkJICAgbmV3Y2hhbm5lbC0+b2ZmZXJtc2cuY2hpbGRfcmVsaWQpOwogCQlmcmVlX2NoYW5uZWwobmV3Y2hhbm5lbCk7CiAJCXJldHVybjsKIAl9CkBAIC0zNTUsMjcgKzM3NCwyNyBAQAogCSAqIFdlIG5lZWQgdG8gc2V0IHRoZSBEZXZpY2VPYmplY3QgZmllbGQgYmVmb3JlIGNhbGxpbmcKIAkgKiBWbWJ1c0NoaWxkRGV2aWNlQWRkKCkKIAkgKi8KLQluZXdjaGFubmVsLT5EZXZpY2VPYmplY3QgPSBWbWJ1c0NoaWxkRGV2aWNlQ3JlYXRlKAotCQkmbmV3Y2hhbm5lbC0+T2ZmZXJNc2cuT2ZmZXIuSW50ZXJmYWNlVHlwZSwKLQkJJm5ld2NoYW5uZWwtPk9mZmVyTXNnLk9mZmVyLkludGVyZmFjZUluc3RhbmNlLAorCW5ld2NoYW5uZWwtPmRldmljZV9vYmogPSB2bWJ1c19jaGlsZF9kZXZpY2VfY3JlYXRlKAorCQkmbmV3Y2hhbm5lbC0+b2ZmZXJtc2cub2ZmZXIuSW50ZXJmYWNlVHlwZSwKKwkJJm5ld2NoYW5uZWwtPm9mZmVybXNnLm9mZmVyLkludGVyZmFjZUluc3RhbmNlLAogCQluZXdjaGFubmVsKTsKIAogCURQUklOVF9EQkcoVk1CVVMsICJjaGlsZCBkZXZpY2Ugb2JqZWN0IGFsbG9jYXRlZCAtICVwIiwKLQkJICAgbmV3Y2hhbm5lbC0+RGV2aWNlT2JqZWN0KTsKKwkJICAgbmV3Y2hhbm5lbC0+ZGV2aWNlX29iaik7CiAKIAkvKgogCSAqIEFkZCB0aGUgbmV3IGRldmljZSB0byB0aGUgYnVzLiBUaGlzIHdpbGwga2ljayBvZmYgZGV2aWNlLWRyaXZlcgogCSAqIGJpbmRpbmcgd2hpY2ggZXZlbnR1YWxseSBpbnZva2VzIHRoZSBkZXZpY2UgZHJpdmVyJ3MgQWRkRGV2aWNlKCkKIAkgKiBtZXRob2QuCiAJICovCi0JcmV0ID0gVm1idXNDaGlsZERldmljZUFkZChuZXdjaGFubmVsLT5EZXZpY2VPYmplY3QpOworCXJldCA9IFZtYnVzQ2hpbGREZXZpY2VBZGQobmV3Y2hhbm5lbC0+ZGV2aWNlX29iaik7CiAJaWYgKHJldCAhPSAwKSB7CiAJCURQUklOVF9FUlIoVk1CVVMsCiAJCQkgICAidW5hYmxlIHRvIGFkZCBjaGlsZCBkZXZpY2Ugb2JqZWN0IChyZWxpZCAlZCkiLAotCQkJICAgbmV3Y2hhbm5lbC0+T2ZmZXJNc2cuQ2hpbGRSZWxJZCk7CisJCQkgICBuZXdjaGFubmVsLT5vZmZlcm1zZy5jaGlsZF9yZWxpZCk7CiAKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJmdWbWJ1c0Nvbm5lY3Rpb24uY2hhbm5lbF9sb2NrLCBmbGFncyk7Ci0JCWxpc3RfZGVsKCZuZXdjaGFubmVsLT5MaXN0RW50cnkpOworCQlsaXN0X2RlbCgmbmV3Y2hhbm5lbC0+bGlzdGVudHJ5KTsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ1ZtYnVzQ29ubmVjdGlvbi5jaGFubmVsX2xvY2ssIGZsYWdzKTsKIAogCQlmcmVlX2NoYW5uZWwobmV3Y2hhbm5lbCk7CkBAIC0zODUsMTEgKzQwNCwxMSBAQAogCQkgKiBzbyB0aGF0IHdoZW4gd2UgZG8gY2xvc2UgdGhlIGNoYW5uZWwgbm9ybWFsbHksIHdlCiAJCSAqIGNhbiBjbGVhbnVwIHByb3Blcmx5CiAJCSAqLwotCQluZXdjaGFubmVsLT5TdGF0ZSA9IENIQU5ORUxfT1BFTl9TVEFURTsKKwkJbmV3Y2hhbm5lbC0+c3RhdGUgPSBDSEFOTkVMX09QRU5fU1RBVEU7CiAKIAkJLyogT3BlbiBJQyBjaGFubmVscyAqLwogCQlmb3IgKGNudCA9IDA7IGNudCA8IE1BWF9NU0dfVFlQRVM7IGNudCsrKSB7Ci0JCQlpZiAobWVtY21wKCZuZXdjaGFubmVsLT5PZmZlck1zZy5PZmZlci5JbnRlcmZhY2VUeXBlLAorCQkJaWYgKG1lbWNtcCgmbmV3Y2hhbm5lbC0+b2ZmZXJtc2cub2ZmZXIuSW50ZXJmYWNlVHlwZSwKIAkJCQkgICAmaHZfY2JfdXRpbHNbY250XS5kYXRhLAogCQkJCSAgIHNpemVvZihzdHJ1Y3QgaHZfZ3VpZCkpID09IDAgJiYKIAkJCQl2bWJ1c19vcGVuKG5ld2NoYW5uZWwsIDIgKiBQQUdFX1NJWkUsCkBAIC00MDYsMTcgKzQyNSw2IEBACiB9CiAKIC8qCi0gKiB2bWJ1c19wcm9jZXNzX3Jlc2NpbmRfb2ZmZXIgLQotICogUmVzY2luZCB0aGUgb2ZmZXIgYnkgaW5pdGlhdGluZyBhIGRldmljZSByZW1vdmFsCi0gKi8KLXN0YXRpYyB2b2lkIHZtYnVzX3Byb2Nlc3NfcmVzY2luZF9vZmZlcih2b2lkICpjb250ZXh0KQotewotCXN0cnVjdCB2bWJ1c19jaGFubmVsICpjaGFubmVsID0gY29udGV4dDsKLQotCVZtYnVzQ2hpbGREZXZpY2VSZW1vdmUoY2hhbm5lbC0+RGV2aWNlT2JqZWN0KTsKLX0KLQotLyoKICAqIHZtYnVzX29ub2ZmZXIgLSBIYW5kbGVyIGZvciBjaGFubmVsIG9mZmVycyBmcm9tIHZtYnVzIGluIHBhcmVudCBwYXJ0aXRpb24uCiAgKgogICogV2UgaWdub3JlIGFsbCBvZmZlcnMgZXhjZXB0IG5ldHdvcmsgYW5kIHN0b3JhZ2Ugb2ZmZXJzLiBGb3IgZWFjaCBuZXR3b3JrIGFuZApAQCAtNDM0LDcgKzQ0Miw3IEBACiAKIAlvZmZlciA9IChzdHJ1Y3Qgdm1idXNfY2hhbm5lbF9vZmZlcl9jaGFubmVsICopaGRyOwogCWZvciAoaSA9IDA7IGkgPCBNQVhfTlVNX0RFVklDRV9DTEFTU0VTX1NVUFBPUlRFRDsgaSsrKSB7Ci0JCWlmIChtZW1jbXAoJm9mZmVyLT5PZmZlci5JbnRlcmZhY2VUeXBlLAorCQlpZiAobWVtY21wKCZvZmZlci0+b2ZmZXIuSW50ZXJmYWNlVHlwZSwKIAkJICAgICZnU3VwcG9ydGVkRGV2aWNlQ2xhc3Nlc1tpXSwgc2l6ZW9mKHN0cnVjdCBodl9ndWlkKSkgPT0gMCkgewogCQkJZnN1cHBvcnRlZCA9IDE7CiAJCQlicmVhazsKQEAgLTQ0MywxMiArNDUxLDEyIEBACiAKIAlpZiAoIWZzdXBwb3J0ZWQpIHsKIAkJRFBSSU5UX0RCRyhWTUJVUywgIklnbm9yaW5nIGNoYW5uZWwgb2ZmZXIgbm90aWZpY2F0aW9uIGZvciAiCi0JCQkgICAiY2hpbGQgcmVsaWQgJWQiLCBvZmZlci0+Q2hpbGRSZWxJZCk7CisJCQkgICAiY2hpbGQgcmVsaWQgJWQiLCBvZmZlci0+Y2hpbGRfcmVsaWQpOwogCQlyZXR1cm47CiAJfQogCi0JZ3VpZHR5cGUgPSAmb2ZmZXItPk9mZmVyLkludGVyZmFjZVR5cGU7Ci0JZ3VpZGluc3RhbmNlID0gJm9mZmVyLT5PZmZlci5JbnRlcmZhY2VJbnN0YW5jZTsKKwlndWlkdHlwZSA9ICZvZmZlci0+b2ZmZXIuSW50ZXJmYWNlVHlwZTsKKwlndWlkaW5zdGFuY2UgPSAmb2ZmZXItPm9mZmVyLkludGVyZmFjZUluc3RhbmNlOwogCiAJRFBSSU5UX0lORk8oVk1CVVMsICJDaGFubmVsIG9mZmVyIG5vdGlmaWNhdGlvbiAtICIKIAkJICAgICJjaGlsZCByZWxpZCAlZCBtb25pdG9yIGlkICVkIGFsbG9jYXRlZCAlZCwgIgpAQCAtNDU2LDggKzQ2NCw4IEBACiAJCSAgICAiJTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnh9ICIKIAkJICAgICJpbnN0YW5jZSB7JTAyeCUwMnglMDJ4JTAyeC0lMDJ4JTAyeC0lMDJ4JTAyeC0iCiAJCSAgICAiJTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnh9IiwKLQkJICAgIG9mZmVyLT5DaGlsZFJlbElkLCBvZmZlci0+TW9uaXRvcklkLAotCQkgICAgb2ZmZXItPk1vbml0b3JBbGxvY2F0ZWQsCisJCSAgICBvZmZlci0+Y2hpbGRfcmVsaWQsIG9mZmVyLT5tb25pdG9yaWQsCisJCSAgICBvZmZlci0+bW9uaXRvcl9hbGxvY2F0ZWQsCiAJCSAgICBndWlkdHlwZS0+ZGF0YVszXSwgZ3VpZHR5cGUtPmRhdGFbMl0sCiAJCSAgICBndWlkdHlwZS0+ZGF0YVsxXSwgZ3VpZHR5cGUtPmRhdGFbMF0sCiAJCSAgICBndWlkdHlwZS0+ZGF0YVs1XSwgZ3VpZHR5cGUtPmRhdGFbNF0sCkBAIC00ODQsMTQgKzQ5MiwxNCBAQAogCiAJRFBSSU5UX0RCRyhWTUJVUywgImNoYW5uZWwgb2JqZWN0IGFsbG9jYXRlZCAtICVwIiwgbmV3Y2hhbm5lbCk7CiAKLQltZW1jcHkoJm5ld2NoYW5uZWwtPk9mZmVyTXNnLCBvZmZlciwKKwltZW1jcHkoJm5ld2NoYW5uZWwtPm9mZmVybXNnLCBvZmZlciwKIAkgICAgICAgc2l6ZW9mKHN0cnVjdCB2bWJ1c19jaGFubmVsX29mZmVyX2NoYW5uZWwpKTsKLQluZXdjaGFubmVsLT5Nb25pdG9yR3JvdXAgPSAodTgpb2ZmZXItPk1vbml0b3JJZCAvIDMyOwotCW5ld2NoYW5uZWwtPk1vbml0b3JCaXQgPSAodTgpb2ZmZXItPk1vbml0b3JJZCAlIDMyOworCW5ld2NoYW5uZWwtPm1vbml0b3JfZ3JwID0gKHU4KW9mZmVyLT5tb25pdG9yaWQgLyAzMjsKKwluZXdjaGFubmVsLT5tb25pdG9yX2JpdCA9ICh1OClvZmZlci0+bW9uaXRvcmlkICUgMzI7CiAKIAkvKiBUT0RPOiBNYWtlIHN1cmUgdGhlIG9mZmVyIGNvbWVzIGZyb20gb3VyIHBhcmVudCBwYXJ0aXRpb24gKi8KLQlvc2Rfc2NoZWR1bGVfY2FsbGJhY2sobmV3Y2hhbm5lbC0+Q29udHJvbFdRLCB2bWJ1c19wcm9jZXNzX29mZmVyLAotCQkJICAgICAgbmV3Y2hhbm5lbCk7CisJSU5JVF9XT1JLKCZuZXdjaGFubmVsLT53b3JrLCB2bWJ1c19wcm9jZXNzX29mZmVyKTsKKwlxdWV1ZV93b3JrKG5ld2NoYW5uZWwtPmNvbnRyb2x3cSwgJm5ld2NoYW5uZWwtPndvcmspOwogfQogCiAvKgpAQCAtNTA1LDE2ICs1MTMsMTYgQEAKIAlzdHJ1Y3Qgdm1idXNfY2hhbm5lbCAqY2hhbm5lbDsKIAogCXJlc2NpbmQgPSAoc3RydWN0IHZtYnVzX2NoYW5uZWxfcmVzY2luZF9vZmZlciAqKWhkcjsKLQljaGFubmVsID0gR2V0Q2hhbm5lbEZyb21SZWxJZChyZXNjaW5kLT5DaGlsZFJlbElkKTsKKwljaGFubmVsID0gR2V0Q2hhbm5lbEZyb21SZWxJZChyZXNjaW5kLT5jaGlsZF9yZWxpZCk7CiAJaWYgKGNoYW5uZWwgPT0gTlVMTCkgewogCQlEUFJJTlRfREJHKFZNQlVTLCAiY2hhbm5lbCBub3QgZm91bmQgZm9yIHJlbElkICVkIiwKLQkJCSAgIHJlc2NpbmQtPkNoaWxkUmVsSWQpOworCQkJICAgcmVzY2luZC0+Y2hpbGRfcmVsaWQpOwogCQlyZXR1cm47CiAJfQogCi0Jb3NkX3NjaGVkdWxlX2NhbGxiYWNrKGNoYW5uZWwtPkNvbnRyb2xXUSwKLQkJCSAgICAgIHZtYnVzX3Byb2Nlc3NfcmVzY2luZF9vZmZlciwKLQkJCSAgICAgIGNoYW5uZWwpOworCS8qIHdvcmsgaXMgaW5pdGlhbGl6ZWQgZm9yIHZtYnVzX3Byb2Nlc3NfcmVzY2luZF9vZmZlcigpIGZyb20KKwkgKiB2bWJ1c19wcm9jZXNzX29mZmVyKCkgd2hlcmUgdGhlIGNoYW5uZWwgZ290IGNyZWF0ZWQgKi8KKwlxdWV1ZV93b3JrKGNoYW5uZWwtPmNvbnRyb2x3cSwgJmNoYW5uZWwtPndvcmspOwogfQogCiAvKgpAQCAtNTQ1LDcgKzU1Myw3IEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCXJlc3VsdCA9IChzdHJ1Y3Qgdm1idXNfY2hhbm5lbF9vcGVuX3Jlc3VsdCAqKWhkcjsKLQlEUFJJTlRfREJHKFZNQlVTLCAidm1idXMgb3BlbiByZXN1bHQgLSAlZCIsIHJlc3VsdC0+U3RhdHVzKTsKKwlEUFJJTlRfREJHKFZNQlVTLCAidm1idXMgb3BlbiByZXN1bHQgLSAlZCIsIHJlc3VsdC0+c3RhdHVzKTsKIAogCS8qCiAJICogRmluZCB0aGUgb3BlbiBtc2csIGNvcHkgdGhlIHJlc3VsdCBhbmQgc2lnbmFsL3VuYmxvY2sgdGhlIHdhaXQgZXZlbnQKQEAgLTU1NiwxNyArNTY0LDE3IEBACiAvKiBGSVhNRTogdGhpcyBzaG91bGQgcHJvYmFibHkgdXNlIGxpc3RfZW50cnkoKSBpbnN0ZWFkICovCiAJCW1zZ2luZm8gPSAoc3RydWN0IHZtYnVzX2NoYW5uZWxfbXNnaW5mbyAqKWN1cnI7CiAJCXJlcXVlc3RoZWFkZXIgPQotCQkJKHN0cnVjdCB2bWJ1c19jaGFubmVsX21lc3NhZ2VfaGVhZGVyICopbXNnaW5mby0+TXNnOworCQkJKHN0cnVjdCB2bWJ1c19jaGFubmVsX21lc3NhZ2VfaGVhZGVyICopbXNnaW5mby0+bXNnOwogCi0JCWlmIChyZXF1ZXN0aGVhZGVyLT5NZXNzYWdlVHlwZSA9PSBDaGFubmVsTWVzc2FnZU9wZW5DaGFubmVsKSB7CisJCWlmIChyZXF1ZXN0aGVhZGVyLT5tc2d0eXBlID09IENIQU5ORUxNU0dfT1BFTkNIQU5ORUwpIHsKIAkJCW9wZW5tc2cgPQotCQkJKHN0cnVjdCB2bWJ1c19jaGFubmVsX29wZW5fY2hhbm5lbCAqKW1zZ2luZm8tPk1zZzsKLQkJCWlmIChvcGVubXNnLT5DaGlsZFJlbElkID09IHJlc3VsdC0+Q2hpbGRSZWxJZCAmJgotCQkJICAgIG9wZW5tc2ctPk9wZW5JZCA9PSByZXN1bHQtPk9wZW5JZCkgewotCQkJCW1lbWNweSgmbXNnaW5mby0+UmVzcG9uc2UuT3BlblJlc3VsdCwKKwkJCShzdHJ1Y3Qgdm1idXNfY2hhbm5lbF9vcGVuX2NoYW5uZWwgKiltc2dpbmZvLT5tc2c7CisJCQlpZiAob3Blbm1zZy0+Y2hpbGRfcmVsaWQgPT0gcmVzdWx0LT5jaGlsZF9yZWxpZCAmJgorCQkJICAgIG9wZW5tc2ctPm9wZW5pZCA9PSByZXN1bHQtPm9wZW5pZCkgeworCQkJCW1lbWNweSgmbXNnaW5mby0+cmVzcG9uc2Uub3Blbl9yZXN1bHQsCiAJCQkJICAgICAgIHJlc3VsdCwKIAkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCB2bWJ1c19jaGFubmVsX29wZW5fcmVzdWx0KSk7Ci0JCQkJb3NkX1dhaXRFdmVudFNldChtc2dpbmZvLT5XYWl0RXZlbnQpOworCQkJCW9zZF93YWl0ZXZlbnRfc2V0KG1zZ2luZm8tPndhaXRldmVudCk7CiAJCQkJYnJlYWs7CiAJCQl9CiAJCX0KQEAgLTU5Miw3ICs2MDAsNyBAQAogCiAJZ3BhZGxjcmVhdGVkID0gKHN0cnVjdCB2bWJ1c19jaGFubmVsX2dwYWRsX2NyZWF0ZWQgKiloZHI7CiAJRFBSSU5UX0RCRyhWTUJVUywgInZtYnVzIGdwYWRsIGNyZWF0ZWQgcmVzdWx0IC0gJWQiLAotCQkgICBncGFkbGNyZWF0ZWQtPkNyZWF0aW9uU3RhdHVzKTsKKwkJICAgZ3BhZGxjcmVhdGVkLT5jcmVhdGlvbl9zdGF0dXMpOwogCiAJLyoKIAkgKiBGaW5kIHRoZSBlc3RhYmxpc2ggbXNnLCBjb3B5IHRoZSByZXN1bHQgYW5kIHNpZ25hbC91bmJsb2NrIHRoZSB3YWl0CkBAIC02MDQsMTkgKzYxMiwxOSBAQAogLyogRklYTUU6IHRoaXMgc2hvdWxkIHByb2JhYmx5IHVzZSBsaXN0X2VudHJ5KCkgaW5zdGVhZCAqLwogCQltc2dpbmZvID0gKHN0cnVjdCB2bWJ1c19jaGFubmVsX21zZ2luZm8gKiljdXJyOwogCQlyZXF1ZXN0aGVhZGVyID0KLQkJCShzdHJ1Y3Qgdm1idXNfY2hhbm5lbF9tZXNzYWdlX2hlYWRlciAqKW1zZ2luZm8tPk1zZzsKKwkJCShzdHJ1Y3Qgdm1idXNfY2hhbm5lbF9tZXNzYWdlX2hlYWRlciAqKW1zZ2luZm8tPm1zZzsKIAotCQlpZiAocmVxdWVzdGhlYWRlci0+TWVzc2FnZVR5cGUgPT0gQ2hhbm5lbE1lc3NhZ2VHcGFkbEhlYWRlcikgeworCQlpZiAocmVxdWVzdGhlYWRlci0+bXNndHlwZSA9PSBDSEFOTkVMTVNHX0dQQURMX0hFQURFUikgewogCQkJZ3BhZGxoZWFkZXIgPQogCQkJKHN0cnVjdCB2bWJ1c19jaGFubmVsX2dwYWRsX2hlYWRlciAqKXJlcXVlc3RoZWFkZXI7CiAKLQkJCWlmICgoZ3BhZGxjcmVhdGVkLT5DaGlsZFJlbElkID09Ci0JCQkgICAgIGdwYWRsaGVhZGVyLT5DaGlsZFJlbElkKSAmJgotCQkJICAgIChncGFkbGNyZWF0ZWQtPkdwYWRsID09IGdwYWRsaGVhZGVyLT5HcGFkbCkpIHsKLQkJCQltZW1jcHkoJm1zZ2luZm8tPlJlc3BvbnNlLkdwYWRsQ3JlYXRlZCwKKwkJCWlmICgoZ3BhZGxjcmVhdGVkLT5jaGlsZF9yZWxpZCA9PQorCQkJICAgICBncGFkbGhlYWRlci0+Y2hpbGRfcmVsaWQpICYmCisJCQkgICAgKGdwYWRsY3JlYXRlZC0+Z3BhZGwgPT0gZ3BhZGxoZWFkZXItPmdwYWRsKSkgeworCQkJCW1lbWNweSgmbXNnaW5mby0+cmVzcG9uc2UuZ3BhZGxfY3JlYXRlZCwKIAkJCQkgICAgICAgZ3BhZGxjcmVhdGVkLAogCQkJCSAgICAgICBzaXplb2Yoc3RydWN0IHZtYnVzX2NoYW5uZWxfZ3BhZGxfY3JlYXRlZCkpOwotCQkJCW9zZF9XYWl0RXZlbnRTZXQobXNnaW5mby0+V2FpdEV2ZW50KTsKKwkJCQlvc2Rfd2FpdGV2ZW50X3NldChtc2dpbmZvLT53YWl0ZXZlbnQpOwogCQkJCWJyZWFrOwogCQkJfQogCQl9CkBAIC02NTIsMTcgKzY2MCwxNyBAQAogLyogRklYTUU6IHRoaXMgc2hvdWxkIHByb2JhYmx5IHVzZSBsaXN0X2VudHJ5KCkgaW5zdGVhZCAqLwogCQltc2dpbmZvID0gKHN0cnVjdCB2bWJ1c19jaGFubmVsX21zZ2luZm8gKiljdXJyOwogCQlyZXF1ZXN0aGVhZGVyID0KLQkJCShzdHJ1Y3Qgdm1idXNfY2hhbm5lbF9tZXNzYWdlX2hlYWRlciAqKW1zZ2luZm8tPk1zZzsKKwkJCShzdHJ1Y3Qgdm1idXNfY2hhbm5lbF9tZXNzYWdlX2hlYWRlciAqKW1zZ2luZm8tPm1zZzsKIAotCQlpZiAocmVxdWVzdGhlYWRlci0+TWVzc2FnZVR5cGUgPT0gQ2hhbm5lbE1lc3NhZ2VHcGFkbFRlYXJkb3duKSB7CisJCWlmIChyZXF1ZXN0aGVhZGVyLT5tc2d0eXBlID09IENIQU5ORUxNU0dfR1BBRExfVEVBUkRPV04pIHsKIAkJCWdwYWRsX3RlYXJkb3duID0KIAkJCShzdHJ1Y3Qgdm1idXNfY2hhbm5lbF9ncGFkbF90ZWFyZG93biAqKXJlcXVlc3RoZWFkZXI7CiAKLQkJCWlmIChncGFkbF90b3JuZG93bi0+R3BhZGwgPT0gZ3BhZGxfdGVhcmRvd24tPkdwYWRsKSB7Ci0JCQkJbWVtY3B5KCZtc2dpbmZvLT5SZXNwb25zZS5HcGFkbFRvcm5kb3duLAorCQkJaWYgKGdwYWRsX3Rvcm5kb3duLT5ncGFkbCA9PSBncGFkbF90ZWFyZG93bi0+Z3BhZGwpIHsKKwkJCQltZW1jcHkoJm1zZ2luZm8tPnJlc3BvbnNlLmdwYWRsX3Rvcm5kb3duLAogCQkJCSAgICAgICBncGFkbF90b3JuZG93biwKIAkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCB2bWJ1c19jaGFubmVsX2dwYWRsX3Rvcm5kb3duKSk7Ci0JCQkJb3NkX1dhaXRFdmVudFNldChtc2dpbmZvLT5XYWl0RXZlbnQpOworCQkJCW9zZF93YWl0ZXZlbnRfc2V0KG1zZ2luZm8tPndhaXRldmVudCk7CiAJCQkJYnJlYWs7CiAJCQl9CiAJCX0KQEAgLTY5NCwxNiArNzAyLDE2IEBACiAvKiBGSVhNRTogdGhpcyBzaG91bGQgcHJvYmFibHkgdXNlIGxpc3RfZW50cnkoKSBpbnN0ZWFkICovCiAJCW1zZ2luZm8gPSAoc3RydWN0IHZtYnVzX2NoYW5uZWxfbXNnaW5mbyAqKWN1cnI7CiAJCXJlcXVlc3RoZWFkZXIgPQotCQkJKHN0cnVjdCB2bWJ1c19jaGFubmVsX21lc3NhZ2VfaGVhZGVyICopbXNnaW5mby0+TXNnOworCQkJKHN0cnVjdCB2bWJ1c19jaGFubmVsX21lc3NhZ2VfaGVhZGVyICopbXNnaW5mby0+bXNnOwogCi0JCWlmIChyZXF1ZXN0aGVhZGVyLT5NZXNzYWdlVHlwZSA9PQotCQkgICAgQ2hhbm5lbE1lc3NhZ2VJbml0aWF0ZUNvbnRhY3QpIHsKKwkJaWYgKHJlcXVlc3RoZWFkZXItPm1zZ3R5cGUgPT0KKwkJICAgIENIQU5ORUxNU0dfSU5JVElBVEVfQ09OVEFDVCkgewogCQkJaW5pdGlhdGUgPQogCQkJKHN0cnVjdCB2bWJ1c19jaGFubmVsX2luaXRpYXRlX2NvbnRhY3QgKilyZXF1ZXN0aGVhZGVyOwotCQkJbWVtY3B5KCZtc2dpbmZvLT5SZXNwb25zZS5WZXJzaW9uUmVzcG9uc2UsCisJCQltZW1jcHkoJm1zZ2luZm8tPnJlc3BvbnNlLnZlcnNpb25fcmVzcG9uc2UsCiAJCQkgICAgICB2ZXJzaW9uX3Jlc3BvbnNlLAogCQkJICAgICAgc2l6ZW9mKHN0cnVjdCB2bWJ1c19jaGFubmVsX3ZlcnNpb25fcmVzcG9uc2UpKTsKLQkJCW9zZF9XYWl0RXZlbnRTZXQobXNnaW5mby0+V2FpdEV2ZW50KTsKKwkJCW9zZF93YWl0ZXZlbnRfc2V0KG1zZ2luZm8tPndhaXRldmVudCk7CiAJCX0KIAl9CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ1ZtYnVzQ29ubmVjdGlvbi5jaGFubmVsbXNnX2xvY2ssIGZsYWdzKTsKQEAgLTcxMSwyNCArNzE5LDI0IEBACiAKIC8qIENoYW5uZWwgbWVzc2FnZSBkaXNwYXRjaCB0YWJsZSAqLwogc3RhdGljIHN0cnVjdCB2bWJ1c19jaGFubmVsX21lc3NhZ2VfdGFibGVfZW50cnkKLQlnQ2hhbm5lbE1lc3NhZ2VUYWJsZVtDaGFubmVsTWVzc2FnZUNvdW50XSA9IHsKLQl7Q2hhbm5lbE1lc3NhZ2VJbnZhbGlkLAkJCU5VTEx9LAotCXtDaGFubmVsTWVzc2FnZU9mZmVyQ2hhbm5lbCwJCXZtYnVzX29ub2ZmZXJ9LAotCXtDaGFubmVsTWVzc2FnZVJlc2NpbmRDaGFubmVsT2ZmZXIsCXZtYnVzX29ub2ZmZXJfcmVzY2luZH0sCi0Je0NoYW5uZWxNZXNzYWdlUmVxdWVzdE9mZmVycywJCU5VTEx9LAotCXtDaGFubmVsTWVzc2FnZUFsbE9mZmVyc0RlbGl2ZXJlZCwJdm1idXNfb25vZmZlcnNfZGVsaXZlcmVkfSwKLQl7Q2hhbm5lbE1lc3NhZ2VPcGVuQ2hhbm5lbCwJCU5VTEx9LAotCXtDaGFubmVsTWVzc2FnZU9wZW5DaGFubmVsUmVzdWx0LAl2bWJ1c19vbm9wZW5fcmVzdWx0fSwKLQl7Q2hhbm5lbE1lc3NhZ2VDbG9zZUNoYW5uZWwsCQlOVUxMfSwKLQl7Q2hhbm5lbE1lc3NhZ2VHcGFkbEhlYWRlciwJCU5VTEx9LAotCXtDaGFubmVsTWVzc2FnZUdwYWRsQm9keSwJCU5VTEx9LAotCXtDaGFubmVsTWVzc2FnZUdwYWRsQ3JlYXRlZCwJCXZtYnVzX29uZ3BhZGxfY3JlYXRlZH0sCi0Je0NoYW5uZWxNZXNzYWdlR3BhZGxUZWFyZG93biwJCU5VTEx9LAotCXtDaGFubmVsTWVzc2FnZUdwYWRsVG9ybmRvd24sCQl2bWJ1c19vbmdwYWRsX3Rvcm5kb3dufSwKLQl7Q2hhbm5lbE1lc3NhZ2VSZWxJZFJlbGVhc2VkLAkJTlVMTH0sCi0Je0NoYW5uZWxNZXNzYWdlSW5pdGlhdGVDb250YWN0LAkJTlVMTH0sCi0Je0NoYW5uZWxNZXNzYWdlVmVyc2lvblJlc3BvbnNlLAkJdm1idXNfb252ZXJzaW9uX3Jlc3BvbnNlfSwKLQl7Q2hhbm5lbE1lc3NhZ2VVbmxvYWQsCQkJTlVMTH0sCisJZ0NoYW5uZWxNZXNzYWdlVGFibGVbQ0hBTk5FTE1TR19DT1VOVF0gPSB7CisJe0NIQU5ORUxNU0dfSU5WQUxJRCwJCQlOVUxMfSwKKwl7Q0hBTk5FTE1TR19PRkZFUkNIQU5ORUwsCQl2bWJ1c19vbm9mZmVyfSwKKwl7Q0hBTk5FTE1TR19SRVNDSU5EX0NIQU5ORUxPRkZFUiwJdm1idXNfb25vZmZlcl9yZXNjaW5kfSwKKwl7Q0hBTk5FTE1TR19SRVFVRVNUT0ZGRVJTLAkJTlVMTH0sCisJe0NIQU5ORUxNU0dfQUxMT0ZGRVJTX0RFTElWRVJFRCwJdm1idXNfb25vZmZlcnNfZGVsaXZlcmVkfSwKKwl7Q0hBTk5FTE1TR19PUEVOQ0hBTk5FTCwJCU5VTEx9LAorCXtDSEFOTkVMTVNHX09QRU5DSEFOTkVMX1JFU1VMVCwJdm1idXNfb25vcGVuX3Jlc3VsdH0sCisJe0NIQU5ORUxNU0dfQ0xPU0VDSEFOTkVMLAkJTlVMTH0sCisJe0NIQU5ORUxNU0dfR1BBRExfSEVBREVSLAkJTlVMTH0sCisJe0NIQU5ORUxNU0dfR1BBRExfQk9EWSwJCU5VTEx9LAorCXtDSEFOTkVMTVNHX0dQQURMX0NSRUFURUQsCQl2bWJ1c19vbmdwYWRsX2NyZWF0ZWR9LAorCXtDSEFOTkVMTVNHX0dQQURMX1RFQVJET1dOLAkJTlVMTH0sCisJe0NIQU5ORUxNU0dfR1BBRExfVE9STkRPV04sCQl2bWJ1c19vbmdwYWRsX3Rvcm5kb3dufSwKKwl7Q0hBTk5FTE1TR19SRUxJRF9SRUxFQVNFRCwJCU5VTEx9LAorCXtDSEFOTkVMTVNHX0lOSVRJQVRFX0NPTlRBQ1QsCQlOVUxMfSwKKwl7Q0hBTk5FTE1TR19WRVJTSU9OX1JFU1BPTlNFLAkJdm1idXNfb252ZXJzaW9uX3Jlc3BvbnNlfSwKKwl7Q0hBTk5FTE1TR19VTkxPQUQsCQkJTlVMTH0sCiB9OwogCiAvKgpAQCAtNzQyLDI5ICs3NTAsMjUgQEAKIAlzdHJ1Y3Qgdm1idXNfY2hhbm5lbF9tZXNzYWdlX2hlYWRlciAqaGRyOwogCWludCBzaXplOwogCi0JaGRyID0gKHN0cnVjdCB2bWJ1c19jaGFubmVsX21lc3NhZ2VfaGVhZGVyICopbXNnLT51LlBheWxvYWQ7Ci0Jc2l6ZSA9IG1zZy0+SGVhZGVyLlBheWxvYWRTaXplOworCWhkciA9IChzdHJ1Y3Qgdm1idXNfY2hhbm5lbF9tZXNzYWdlX2hlYWRlciAqKW1zZy0+dS5wYXlsb2FkOworCXNpemUgPSBtc2ctPmhlYWRlci5wYXlsb2FkX3NpemU7CiAKLQlEUFJJTlRfREJHKFZNQlVTLCAibWVzc2FnZSB0eXBlICVkIHNpemUgJWQiLCBoZHItPk1lc3NhZ2VUeXBlLCBzaXplKTsKKwlEUFJJTlRfREJHKFZNQlVTLCAibWVzc2FnZSB0eXBlICVkIHNpemUgJWQiLCBoZHItPm1zZ3R5cGUsIHNpemUpOwogCi0JaWYgKGhkci0+TWVzc2FnZVR5cGUgPj0gQ2hhbm5lbE1lc3NhZ2VDb3VudCkgeworCWlmIChoZHItPm1zZ3R5cGUgPj0gQ0hBTk5FTE1TR19DT1VOVCkgewogCQlEUFJJTlRfRVJSKFZNQlVTLAogCQkJICAgIlJlY2VpdmVkIGludmFsaWQgY2hhbm5lbCBtZXNzYWdlIHR5cGUgJWQgc2l6ZSAlZCIsCi0JCQkgICBoZHItPk1lc3NhZ2VUeXBlLCBzaXplKTsKKwkJCSAgIGhkci0+bXNndHlwZSwgc2l6ZSk7CiAJCXByaW50X2hleF9kdW1wX2J5dGVzKCIiLCBEVU1QX1BSRUZJWF9OT05FLAotCQkJCSAgICAgKHVuc2lnbmVkIGNoYXIgKiltc2ctPnUuUGF5bG9hZCwgc2l6ZSk7Ci0JCWtmcmVlKG1zZyk7CisJCQkJICAgICAodW5zaWduZWQgY2hhciAqKW1zZy0+dS5wYXlsb2FkLCBzaXplKTsKIAkJcmV0dXJuOwogCX0KIAotCWlmIChnQ2hhbm5lbE1lc3NhZ2VUYWJsZVtoZHItPk1lc3NhZ2VUeXBlXS5tZXNzYWdlSGFuZGxlcikKLQkJZ0NoYW5uZWxNZXNzYWdlVGFibGVbaGRyLT5NZXNzYWdlVHlwZV0ubWVzc2FnZUhhbmRsZXIoaGRyKTsKKwlpZiAoZ0NoYW5uZWxNZXNzYWdlVGFibGVbaGRyLT5tc2d0eXBlXS5tZXNzYWdlSGFuZGxlcikKKwkJZ0NoYW5uZWxNZXNzYWdlVGFibGVbaGRyLT5tc2d0eXBlXS5tZXNzYWdlSGFuZGxlcihoZHIpOwogCWVsc2UKIAkJRFBSSU5UX0VSUihWTUJVUywgIlVuaGFuZGxlZCBjaGFubmVsIG1lc3NhZ2UgdHlwZSAlZCIsCi0JCQkgICBoZHItPk1lc3NhZ2VUeXBlKTsKLQotCS8qIEZyZWUgdGhlIG1zZyB0aGF0IHdhcyBhbGxvY2F0ZWQgaW4gVm1idXNPbk1zZ0RQQygpICovCi0Ja2ZyZWUobXNnKTsKKwkJCSAgIGhkci0+bXNndHlwZSk7CiB9CiAKIC8qCkBAIC03ODIsMTUgKzc4NiwxNSBAQAogCWlmICghbXNnaW5mbykKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQltc2dpbmZvLT5XYWl0RXZlbnQgPSBvc2RfV2FpdEV2ZW50Q3JlYXRlKCk7Ci0JaWYgKCFtc2dpbmZvLT5XYWl0RXZlbnQpIHsKKwltc2dpbmZvLT53YWl0ZXZlbnQgPSBvc2Rfd2FpdGV2ZW50X2NyZWF0ZSgpOworCWlmICghbXNnaW5mby0+d2FpdGV2ZW50KSB7CiAJCWtmcmVlKG1zZ2luZm8pOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKLQltc2cgPSAoc3RydWN0IHZtYnVzX2NoYW5uZWxfbWVzc2FnZV9oZWFkZXIgKiltc2dpbmZvLT5Nc2c7CisJbXNnID0gKHN0cnVjdCB2bWJ1c19jaGFubmVsX21lc3NhZ2VfaGVhZGVyICopbXNnaW5mby0+bXNnOwogCi0JbXNnLT5NZXNzYWdlVHlwZSA9IENoYW5uZWxNZXNzYWdlUmVxdWVzdE9mZmVyczsKKwltc2ctPm1zZ3R5cGUgPSBDSEFOTkVMTVNHX1JFUVVFU1RPRkZFUlM7CiAKIAkvKlNwaW5sb2NrQWNxdWlyZShnVm1idXNDb25uZWN0aW9uLmNoYW5uZWxNc2dMb2NrKTsKIAlJTlNFUlRfVEFJTF9MSVNUKCZnVm1idXNDb25uZWN0aW9uLmNoYW5uZWxNc2dMaXN0LApAQCAtODA4LDcgKzgxMiw3IEBACiAKIAkJZ290byBDbGVhbnVwOwogCX0KLQkvKiBvc2RfV2FpdEV2ZW50V2FpdChtc2dJbmZvLT53YWl0RXZlbnQpOyAqLworCS8qIG9zZF93YWl0ZXZlbnRfd2FpdChtc2dJbmZvLT53YWl0RXZlbnQpOyAqLwogCiAJLypTcGlubG9ja0FjcXVpcmUoZ1ZtYnVzQ29ubmVjdGlvbi5jaGFubmVsTXNnTG9jayk7CiAJUkVNT1ZFX0VOVFJZX0xJU1QoJm1zZ0luZm8tPm1zZ0xpc3RFbnRyeSk7CkBAIC04MTcsNyArODIxLDcgQEAKIAogQ2xlYW51cDoKIAlpZiAobXNnaW5mbykgewotCQlrZnJlZShtc2dpbmZvLT5XYWl0RXZlbnQpOworCQlrZnJlZShtc2dpbmZvLT53YWl0ZXZlbnQpOwogCQlrZnJlZShtc2dpbmZvKTsKIAl9CiAKQEAgLTgzNywxNyArODQxLDE3IEBACiAJc3Bpbl9sb2NrX2lycXNhdmUoJmdWbWJ1c0Nvbm5lY3Rpb24uY2hhbm5lbF9sb2NrLCBmbGFncyk7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoY2hhbm5lbCwgcG9zLCAmZ1ZtYnVzQ29ubmVjdGlvbi5DaGFubmVsTGlzdCwKLQkJCQkgTGlzdEVudHJ5KSB7CisJCQkJIGxpc3RlbnRyeSkgewogCQlpZiAoY2hhbm5lbCA9PSBzdGFydCkKIAkJCWJyZWFrOwogCi0JCWlmICghY2hhbm5lbC0+RGV2aWNlT2JqZWN0LT5Ecml2ZXIpIHsKLQkJCWxpc3RfZGVsKCZjaGFubmVsLT5MaXN0RW50cnkpOworCQlpZiAoIWNoYW5uZWwtPmRldmljZV9vYmotPkRyaXZlcikgeworCQkJbGlzdF9kZWwoJmNoYW5uZWwtPmxpc3RlbnRyeSk7CiAJCQlEUFJJTlRfSU5GTyhWTUJVUywKIAkJCQkgICAgIlJlbGVhc2luZyB1bmF0dGFjaGVkIGRldmljZSBvYmplY3QgJXAiLAotCQkJCSAgICBjaGFubmVsLT5EZXZpY2VPYmplY3QpOworCQkJCSAgICBjaGFubmVsLT5kZXZpY2Vfb2JqKTsKIAotCQkJVm1idXNDaGlsZERldmljZVJlbW92ZShjaGFubmVsLT5EZXZpY2VPYmplY3QpOworCQkJdm1idXNfY2hpbGRfZGV2aWNlX3VucmVnaXN0ZXIoY2hhbm5lbC0+ZGV2aWNlX29iaik7CiAJCQlmcmVlX2NoYW5uZWwoY2hhbm5lbCk7CiAJCX0gZWxzZSB7CiAJCQlpZiAoIXN0YXJ0KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2h2L2NoYW5uZWxfbWdtdC5oIGIvZHJpdmVycy9zdGFnaW5nL2h2L2NoYW5uZWxfbWdtdC5oCmluZGV4IGQxNmNjMDguLmRlNmIyYTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9odi9jaGFubmVsX21nbXQuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaHYvY2hhbm5lbF9tZ210LmgKQEAgLTMzLDYwICszMyw2MCBAQAogCiAvKiBWZXJzaW9uIDEgbWVzc2FnZXMgKi8KIGVudW0gdm1idXNfY2hhbm5lbF9tZXNzYWdlX3R5cGUgewotCUNoYW5uZWxNZXNzYWdlSW52YWxpZAkJCT0gIDAsCi0JQ2hhbm5lbE1lc3NhZ2VPZmZlckNoYW5uZWwJCT0gIDEsCi0JQ2hhbm5lbE1lc3NhZ2VSZXNjaW5kQ2hhbm5lbE9mZmVyCT0gIDIsCi0JQ2hhbm5lbE1lc3NhZ2VSZXF1ZXN0T2ZmZXJzCQk9ICAzLAotCUNoYW5uZWxNZXNzYWdlQWxsT2ZmZXJzRGVsaXZlcmVkCT0gIDQsCi0JQ2hhbm5lbE1lc3NhZ2VPcGVuQ2hhbm5lbAkJPSAgNSwKLQlDaGFubmVsTWVzc2FnZU9wZW5DaGFubmVsUmVzdWx0CQk9ICA2LAotCUNoYW5uZWxNZXNzYWdlQ2xvc2VDaGFubmVsCQk9ICA3LAotCUNoYW5uZWxNZXNzYWdlR3BhZGxIZWFkZXIJCT0gIDgsCi0JQ2hhbm5lbE1lc3NhZ2VHcGFkbEJvZHkJCQk9ICA5LAotCUNoYW5uZWxNZXNzYWdlR3BhZGxDcmVhdGVkCQk9IDEwLAotCUNoYW5uZWxNZXNzYWdlR3BhZGxUZWFyZG93bgkJPSAxMSwKLQlDaGFubmVsTWVzc2FnZUdwYWRsVG9ybmRvd24JCT0gMTIsCi0JQ2hhbm5lbE1lc3NhZ2VSZWxJZFJlbGVhc2VkCQk9IDEzLAotCUNoYW5uZWxNZXNzYWdlSW5pdGlhdGVDb250YWN0CQk9IDE0LAotCUNoYW5uZWxNZXNzYWdlVmVyc2lvblJlc3BvbnNlCQk9IDE1LAotCUNoYW5uZWxNZXNzYWdlVW5sb2FkCQkJPSAxNiwKKwlDSEFOTkVMTVNHX0lOVkFMSUQJCQk9ICAwLAorCUNIQU5ORUxNU0dfT0ZGRVJDSEFOTkVMCQk9ICAxLAorCUNIQU5ORUxNU0dfUkVTQ0lORF9DSEFOTkVMT0ZGRVIJPSAgMiwKKwlDSEFOTkVMTVNHX1JFUVVFU1RPRkZFUlMJCT0gIDMsCisJQ0hBTk5FTE1TR19BTExPRkZFUlNfREVMSVZFUkVECT0gIDQsCisJQ0hBTk5FTE1TR19PUEVOQ0hBTk5FTAkJPSAgNSwKKwlDSEFOTkVMTVNHX09QRU5DSEFOTkVMX1JFU1VMVAkJPSAgNiwKKwlDSEFOTkVMTVNHX0NMT1NFQ0hBTk5FTAkJPSAgNywKKwlDSEFOTkVMTVNHX0dQQURMX0hFQURFUgkJPSAgOCwKKwlDSEFOTkVMTVNHX0dQQURMX0JPRFkJCQk9ICA5LAorCUNIQU5ORUxNU0dfR1BBRExfQ1JFQVRFRAkJPSAxMCwKKwlDSEFOTkVMTVNHX0dQQURMX1RFQVJET1dOCQk9IDExLAorCUNIQU5ORUxNU0dfR1BBRExfVE9STkRPV04JCT0gMTIsCisJQ0hBTk5FTE1TR19SRUxJRF9SRUxFQVNFRAkJPSAxMywKKwlDSEFOTkVMTVNHX0lOSVRJQVRFX0NPTlRBQ1QJCT0gMTQsCisJQ0hBTk5FTE1TR19WRVJTSU9OX1JFU1BPTlNFCQk9IDE1LAorCUNIQU5ORUxNU0dfVU5MT0FECQkJPSAxNiwKICNpZmRlZiBWTUJVU19GRUFUVVJFX1BBUkVOVF9PUl9QRUVSX01FTU9SWV9NQVBQRURfSU5UT19BX0NISUxECi0JQ2hhbm5lbE1lc3NhZ2VWaWV3UmFuZ2VBZGQJCT0gMTcsCi0JQ2hhbm5lbE1lc3NhZ2VWaWV3UmFuZ2VSZW1vdmUJCT0gMTgsCisJQ0hBTk5FTE1TR19WSUVXUkFOR0VfQURECQk9IDE3LAorCUNIQU5ORUxNU0dfVklFV1JBTkdFX1JFTU9WRQkJPSAxOCwKICNlbmRpZgotCUNoYW5uZWxNZXNzYWdlQ291bnQKKwlDSEFOTkVMTVNHX0NPVU5UCiB9OwogCiBzdHJ1Y3Qgdm1idXNfY2hhbm5lbF9tZXNzYWdlX2hlYWRlciB7Ci0JZW51bSB2bWJ1c19jaGFubmVsX21lc3NhZ2VfdHlwZSBNZXNzYWdlVHlwZTsKLQl1MzIgUGFkZGluZzsKKwllbnVtIHZtYnVzX2NoYW5uZWxfbWVzc2FnZV90eXBlIG1zZ3R5cGU7CisJdTMyIHBhZGRpbmc7CiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCiAvKiBRdWVyeSBWTUJ1cyBWZXJzaW9uIHBhcmFtZXRlcnMgKi8KIHN0cnVjdCB2bWJ1c19jaGFubmVsX3F1ZXJ5X3ZtYnVzX3ZlcnNpb24gewotCXN0cnVjdCB2bWJ1c19jaGFubmVsX21lc3NhZ2VfaGVhZGVyIEhlYWRlcjsKLQl1MzIgVmVyc2lvbjsKKwlzdHJ1Y3Qgdm1idXNfY2hhbm5lbF9tZXNzYWdlX2hlYWRlciBoZWFkZXI7CisJdTMyIHZlcnNpb247CiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCiAvKiBWTUJ1cyBWZXJzaW9uIFN1cHBvcnRlZCBwYXJhbWV0ZXJzICovCiBzdHJ1Y3Qgdm1idXNfY2hhbm5lbF92ZXJzaW9uX3N1cHBvcnRlZCB7Ci0Jc3RydWN0IHZtYnVzX2NoYW5uZWxfbWVzc2FnZV9oZWFkZXIgSGVhZGVyOwotCWJvb2wgVmVyc2lvblN1cHBvcnRlZDsKKwlzdHJ1Y3Qgdm1idXNfY2hhbm5lbF9tZXNzYWdlX2hlYWRlciBoZWFkZXI7CisJYm9vbCB2ZXJzaW9uX3N1cHBvcnRlZDsKIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CiAKIC8qIE9mZmVyIENoYW5uZWwgcGFyYW1ldGVycyAqLwogc3RydWN0IHZtYnVzX2NoYW5uZWxfb2ZmZXJfY2hhbm5lbCB7Ci0Jc3RydWN0IHZtYnVzX2NoYW5uZWxfbWVzc2FnZV9oZWFkZXIgSGVhZGVyOwotCXN0cnVjdCB2bWJ1c19jaGFubmVsX29mZmVyIE9mZmVyOwotCXUzMiBDaGlsZFJlbElkOwotCXU4IE1vbml0b3JJZDsKLQlib29sIE1vbml0b3JBbGxvY2F0ZWQ7CisJc3RydWN0IHZtYnVzX2NoYW5uZWxfbWVzc2FnZV9oZWFkZXIgaGVhZGVyOworCXN0cnVjdCB2bWJ1c19jaGFubmVsX29mZmVyIG9mZmVyOworCXUzMiBjaGlsZF9yZWxpZDsKKwl1OCBtb25pdG9yaWQ7CisJYm9vbCBtb25pdG9yX2FsbG9jYXRlZDsKIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CiAKIC8qIFJlc2NpbmQgT2ZmZXIgcGFyYW1ldGVycyAqLwogc3RydWN0IHZtYnVzX2NoYW5uZWxfcmVzY2luZF9vZmZlciB7Ci0Jc3RydWN0IHZtYnVzX2NoYW5uZWxfbWVzc2FnZV9oZWFkZXIgSGVhZGVyOwotCXUzMiBDaGlsZFJlbElkOworCXN0cnVjdCB2bWJ1c19jaGFubmVsX21lc3NhZ2VfaGVhZGVyIGhlYWRlcjsKKwl1MzIgY2hpbGRfcmVsaWQ7CiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCiAvKgpAQCAtMTAwLDQzICsxMDAsNDMgQEAKIAogLyogT3BlbiBDaGFubmVsIHBhcmFtZXRlcnMgKi8KIHN0cnVjdCB2bWJ1c19jaGFubmVsX29wZW5fY2hhbm5lbCB7Ci0Jc3RydWN0IHZtYnVzX2NoYW5uZWxfbWVzc2FnZV9oZWFkZXIgSGVhZGVyOworCXN0cnVjdCB2bWJ1c19jaGFubmVsX21lc3NhZ2VfaGVhZGVyIGhlYWRlcjsKIAogCS8qIElkZW50aWZpZXMgdGhlIHNwZWNpZmljIFZNQnVzIGNoYW5uZWwgdGhhdCBpcyBiZWluZyBvcGVuZWQuICovCi0JdTMyIENoaWxkUmVsSWQ7CisJdTMyIGNoaWxkX3JlbGlkOwogCiAJLyogSUQgbWFraW5nIGEgcGFydGljdWxhciBvcGVuIHJlcXVlc3QgYXQgYSBjaGFubmVsIG9mZmVyIHVuaXF1ZS4gKi8KLQl1MzIgT3BlbklkOworCXUzMiBvcGVuaWQ7CiAKIAkvKiBHUEFETCBmb3IgdGhlIGNoYW5uZWwncyByaW5nIGJ1ZmZlci4gKi8KLQl1MzIgUmluZ0J1ZmZlckdwYWRsSGFuZGxlOworCXUzMiByaW5nYnVmZmVyX2dwYWRsaGFuZGxlOwogCiAJLyogR1BBREwgZm9yIHRoZSBjaGFubmVsJ3Mgc2VydmVyIGNvbnRleHQgc2F2ZSBhcmVhLiAqLwotCXUzMiBTZXJ2ZXJDb250ZXh0QXJlYUdwYWRsSGFuZGxlOworCXUzMiBzZXJ2ZXJfY29udGV4dGFyZWFfZ3BhZGxoYW5kbGU7CiAKIAkvKgogCSogVGhlIHVwc3RyZWFtIHJpbmcgYnVmZmVyIGJlZ2lucyBhdCBvZmZzZXQgemVybyBpbiB0aGUgbWVtb3J5CiAJKiBkZXNjcmliZWQgYnkgUmluZ0J1ZmZlckdwYWRsSGFuZGxlLiBUaGUgZG93bnN0cmVhbSByaW5nIGJ1ZmZlcgogCSogZm9sbG93cyBpdCBhdCB0aGlzIG9mZnNldCAoaW4gcGFnZXMpLgogCSovCi0JdTMyIERvd25zdHJlYW1SaW5nQnVmZmVyUGFnZU9mZnNldDsKKwl1MzIgZG93bnN0cmVhbV9yaW5nYnVmZmVyX3BhZ2VvZmZzZXQ7CiAKIAkvKiBVc2VyLXNwZWNpZmljIGRhdGEgdG8gYmUgcGFzc2VkIGFsb25nIHRvIHRoZSBzZXJ2ZXIgZW5kcG9pbnQuICovCi0JdW5zaWduZWQgY2hhciBVc2VyRGF0YVtNQVhfVVNFUl9ERUZJTkVEX0JZVEVTXTsKKwl1bnNpZ25lZCBjaGFyIHVzZXJkYXRhW01BWF9VU0VSX0RFRklORURfQllURVNdOwogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIAogLyogT3BlbiBDaGFubmVsIFJlc3VsdCBwYXJhbWV0ZXJzICovCiBzdHJ1Y3Qgdm1idXNfY2hhbm5lbF9vcGVuX3Jlc3VsdCB7Ci0Jc3RydWN0IHZtYnVzX2NoYW5uZWxfbWVzc2FnZV9oZWFkZXIgSGVhZGVyOwotCXUzMiBDaGlsZFJlbElkOwotCXUzMiBPcGVuSWQ7Ci0JdTMyIFN0YXR1czsKKwlzdHJ1Y3Qgdm1idXNfY2hhbm5lbF9tZXNzYWdlX2hlYWRlciBoZWFkZXI7CisJdTMyIGNoaWxkX3JlbGlkOworCXUzMiBvcGVuaWQ7CisJdTMyIHN0YXR1czsKIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CiAKIC8qIENsb3NlIGNoYW5uZWwgcGFyYW1ldGVyczsgKi8KIHN0cnVjdCB2bWJ1c19jaGFubmVsX2Nsb3NlX2NoYW5uZWwgewotCXN0cnVjdCB2bWJ1c19jaGFubmVsX21lc3NhZ2VfaGVhZGVyIEhlYWRlcjsKLQl1MzIgQ2hpbGRSZWxJZDsKKwlzdHJ1Y3Qgdm1idXNfY2hhbm5lbF9tZXNzYWdlX2hlYWRlciBoZWFkZXI7CisJdTMyIGNoaWxkX3JlbGlkOwogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIAogLyogQ2hhbm5lbCBNZXNzYWdlIEdQQURMICovCkBAIC0xNTEsNzIgKzE1MSw3MiBAQAogICogZm9sbG93LXVwIHBhY2tldCB0aGF0IGNvbnRhaW5zIG1vcmUuCiAgKi8KIHN0cnVjdCB2bWJ1c19jaGFubmVsX2dwYWRsX2hlYWRlciB7Ci0Jc3RydWN0IHZtYnVzX2NoYW5uZWxfbWVzc2FnZV9oZWFkZXIgSGVhZGVyOwotCXUzMiBDaGlsZFJlbElkOwotCXUzMiBHcGFkbDsKLQl1MTYgUmFuZ2VCdWZMZW47Ci0JdTE2IFJhbmdlQ291bnQ7Ci0Jc3RydWN0IGdwYV9yYW5nZSBSYW5nZVswXTsKKwlzdHJ1Y3Qgdm1idXNfY2hhbm5lbF9tZXNzYWdlX2hlYWRlciBoZWFkZXI7CisJdTMyIGNoaWxkX3JlbGlkOworCXUzMiBncGFkbDsKKwl1MTYgcmFuZ2VfYnVmbGVuOworCXUxNiByYW5nZWNvdW50OworCXN0cnVjdCBncGFfcmFuZ2UgcmFuZ2VbMF07CiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCiAvKiBUaGlzIGlzIHRoZSBmb2xsb3d1cCBwYWNrZXQgdGhhdCBjb250YWlucyBtb3JlIFBGTnMuICovCiBzdHJ1Y3Qgdm1idXNfY2hhbm5lbF9ncGFkbF9ib2R5IHsKLQlzdHJ1Y3Qgdm1idXNfY2hhbm5lbF9tZXNzYWdlX2hlYWRlciBIZWFkZXI7Ci0JdTMyIE1lc3NhZ2VOdW1iZXI7Ci0JdTMyIEdwYWRsOwotCXU2NCBQZm5bMF07CisJc3RydWN0IHZtYnVzX2NoYW5uZWxfbWVzc2FnZV9oZWFkZXIgaGVhZGVyOworCXUzMiBtc2dudW1iZXI7CisJdTMyIGdwYWRsOworCXU2NCBwZm5bMF07CiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCiBzdHJ1Y3Qgdm1idXNfY2hhbm5lbF9ncGFkbF9jcmVhdGVkIHsKLQlzdHJ1Y3Qgdm1idXNfY2hhbm5lbF9tZXNzYWdlX2hlYWRlciBIZWFkZXI7Ci0JdTMyIENoaWxkUmVsSWQ7Ci0JdTMyIEdwYWRsOwotCXUzMiBDcmVhdGlvblN0YXR1czsKKwlzdHJ1Y3Qgdm1idXNfY2hhbm5lbF9tZXNzYWdlX2hlYWRlciBoZWFkZXI7CisJdTMyIGNoaWxkX3JlbGlkOworCXUzMiBncGFkbDsKKwl1MzIgY3JlYXRpb25fc3RhdHVzOwogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIAogc3RydWN0IHZtYnVzX2NoYW5uZWxfZ3BhZGxfdGVhcmRvd24gewotCXN0cnVjdCB2bWJ1c19jaGFubmVsX21lc3NhZ2VfaGVhZGVyIEhlYWRlcjsKLQl1MzIgQ2hpbGRSZWxJZDsKLQl1MzIgR3BhZGw7CisJc3RydWN0IHZtYnVzX2NoYW5uZWxfbWVzc2FnZV9oZWFkZXIgaGVhZGVyOworCXUzMiBjaGlsZF9yZWxpZDsKKwl1MzIgZ3BhZGw7CiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCiBzdHJ1Y3Qgdm1idXNfY2hhbm5lbF9ncGFkbF90b3JuZG93biB7Ci0Jc3RydWN0IHZtYnVzX2NoYW5uZWxfbWVzc2FnZV9oZWFkZXIgSGVhZGVyOwotCXUzMiBHcGFkbDsKKwlzdHJ1Y3Qgdm1idXNfY2hhbm5lbF9tZXNzYWdlX2hlYWRlciBoZWFkZXI7CisJdTMyIGdwYWRsOwogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIAogI2lmZGVmIFZNQlVTX0ZFQVRVUkVfUEFSRU5UX09SX1BFRVJfTUVNT1JZX01BUFBFRF9JTlRPX0FfQ0hJTEQKIHN0cnVjdCB2bWJ1c19jaGFubmVsX3ZpZXdfcmFuZ2VfYWRkIHsKLQlzdHJ1Y3Qgdm1idXNfY2hhbm5lbF9tZXNzYWdlX2hlYWRlciBIZWFkZXI7Ci0JUEhZU0lDQUxfQUREUkVTUyBWaWV3UmFuZ2VCYXNlOwotCXU2NCBWaWV3UmFuZ2VMZW5ndGg7Ci0JdTMyIENoaWxkUmVsSWQ7CisJc3RydWN0IHZtYnVzX2NoYW5uZWxfbWVzc2FnZV9oZWFkZXIgaGVhZGVyOworCVBIWVNJQ0FMX0FERFJFU1Mgdmlld3JhbmdlX2Jhc2U7CisJdTY0IHZpZXdyYW5nZV9sZW5ndGg7CisJdTMyIGNoaWxkX3JlbGlkOwogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIAogc3RydWN0IHZtYnVzX2NoYW5uZWxfdmlld19yYW5nZV9yZW1vdmUgewotCXN0cnVjdCB2bWJ1c19jaGFubmVsX21lc3NhZ2VfaGVhZGVyIEhlYWRlcjsKLQlQSFlTSUNBTF9BRERSRVNTIFZpZXdSYW5nZUJhc2U7Ci0JdTMyIENoaWxkUmVsSWQ7CisJc3RydWN0IHZtYnVzX2NoYW5uZWxfbWVzc2FnZV9oZWFkZXIgaGVhZGVyOworCVBIWVNJQ0FMX0FERFJFU1Mgdmlld3JhbmdlX2Jhc2U7CisJdTMyIGNoaWxkX3JlbGlkOwogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKICNlbmRpZgogCiBzdHJ1Y3Qgdm1idXNfY2hhbm5lbF9yZWxpZF9yZWxlYXNlZCB7Ci0Jc3RydWN0IHZtYnVzX2NoYW5uZWxfbWVzc2FnZV9oZWFkZXIgSGVhZGVyOwotCXUzMiBDaGlsZFJlbElkOworCXN0cnVjdCB2bWJ1c19jaGFubmVsX21lc3NhZ2VfaGVhZGVyIGhlYWRlcjsKKwl1MzIgY2hpbGRfcmVsaWQ7CiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCiBzdHJ1Y3Qgdm1idXNfY2hhbm5lbF9pbml0aWF0ZV9jb250YWN0IHsKLQlzdHJ1Y3Qgdm1idXNfY2hhbm5lbF9tZXNzYWdlX2hlYWRlciBIZWFkZXI7Ci0JdTMyIFZNQnVzVmVyc2lvblJlcXVlc3RlZDsKLQl1MzIgUGFkZGluZzI7Ci0JdTY0IEludGVycnVwdFBhZ2U7Ci0JdTY0IE1vbml0b3JQYWdlMTsKLQl1NjQgTW9uaXRvclBhZ2UyOworCXN0cnVjdCB2bWJ1c19jaGFubmVsX21lc3NhZ2VfaGVhZGVyIGhlYWRlcjsKKwl1MzIgdm1idXNfdmVyc2lvbl9yZXF1ZXN0ZWQ7CisJdTMyIHBhZGRpbmcyOworCXU2NCBpbnRlcnJ1cHRfcGFnZTsKKwl1NjQgbW9uaXRvcl9wYWdlMTsKKwl1NjQgbW9uaXRvcl9wYWdlMjsKIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CiAKIHN0cnVjdCB2bWJ1c19jaGFubmVsX3ZlcnNpb25fcmVzcG9uc2UgewotCXN0cnVjdCB2bWJ1c19jaGFubmVsX21lc3NhZ2VfaGVhZGVyIEhlYWRlcjsKLQlib29sIFZlcnNpb25TdXBwb3J0ZWQ7CisJc3RydWN0IHZtYnVzX2NoYW5uZWxfbWVzc2FnZV9oZWFkZXIgaGVhZGVyOworCWJvb2wgdmVyc2lvbl9zdXBwb3J0ZWQ7CiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCiBlbnVtIHZtYnVzX2NoYW5uZWxfc3RhdGUgewpAQCAtMjI2LDU0ICsyMjYsNTUgQEAKIH07CiAKIHN0cnVjdCB2bWJ1c19jaGFubmVsIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkIExpc3RFbnRyeTsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3RlbnRyeTsKIAotCXN0cnVjdCBodl9kZXZpY2UgKkRldmljZU9iamVjdDsKKwlzdHJ1Y3QgaHZfZGV2aWNlICpkZXZpY2Vfb2JqOwogCiAJc3RydWN0IHRpbWVyX2xpc3QgcG9sbF90aW1lcjsgLyogU0EtMTExIHdvcmthcm91bmQgKi8KKwlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd29yazsKIAotCWVudW0gdm1idXNfY2hhbm5lbF9zdGF0ZSBTdGF0ZTsKKwllbnVtIHZtYnVzX2NoYW5uZWxfc3RhdGUgc3RhdGU7CiAKLQlzdHJ1Y3Qgdm1idXNfY2hhbm5lbF9vZmZlcl9jaGFubmVsIE9mZmVyTXNnOworCXN0cnVjdCB2bWJ1c19jaGFubmVsX29mZmVyX2NoYW5uZWwgb2ZmZXJtc2c7CiAJLyoKIAkgKiBUaGVzZSBhcmUgYmFzZWQgb24gdGhlIE9mZmVyTXNnLk1vbml0b3JJZC4KIAkgKiBTYXZlIGl0IGhlcmUgZm9yIGVhc3kgYWNjZXNzLgogCSAqLwotCXU4IE1vbml0b3JHcm91cDsKLQl1OCBNb25pdG9yQml0OworCXU4IG1vbml0b3JfZ3JwOworCXU4IG1vbml0b3JfYml0OwogCi0JdTMyIFJpbmdCdWZmZXJHcGFkbEhhbmRsZTsKKwl1MzIgcmluZ2J1ZmZlcl9ncGFkbGhhbmRsZTsKIAogCS8qIEFsbG9jYXRlZCBtZW1vcnkgZm9yIHJpbmcgYnVmZmVyICovCi0Jdm9pZCAqUmluZ0J1ZmZlclBhZ2VzOwotCXUzMiBSaW5nQnVmZmVyUGFnZUNvdW50OwotCXN0cnVjdCBodl9yaW5nX2J1ZmZlcl9pbmZvIE91dGJvdW5kOwkvKiBzZW5kIHRvIHBhcmVudCAqLwotCXN0cnVjdCBodl9yaW5nX2J1ZmZlcl9pbmZvIEluYm91bmQ7CS8qIHJlY2VpdmUgZnJvbSBwYXJlbnQgKi8KKwl2b2lkICpyaW5nYnVmZmVyX3BhZ2VzOworCXUzMiByaW5nYnVmZmVyX3BhZ2Vjb3VudDsKKwlzdHJ1Y3QgaHZfcmluZ19idWZmZXJfaW5mbyBvdXRib3VuZDsJLyogc2VuZCB0byBwYXJlbnQgKi8KKwlzdHJ1Y3QgaHZfcmluZ19idWZmZXJfaW5mbyBpbmJvdW5kOwkvKiByZWNlaXZlIGZyb20gcGFyZW50ICovCiAJc3BpbmxvY2tfdCBpbmJvdW5kX2xvY2s7Ci0Jc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKkNvbnRyb2xXUTsKKwlzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqY29udHJvbHdxOwogCiAJLyogQ2hhbm5lbCBjYWxsYmFjayBhcmUgaW52b2tlZCBpbiB0aGlzIHdvcmtxdWV1ZSBjb250ZXh0ICovCiAJLyogSEFORExFIGRhdGFXb3JrUXVldWU7ICovCiAKLQl2b2lkICgqT25DaGFubmVsQ2FsbGJhY2spKHZvaWQgKmNvbnRleHQpOwotCXZvaWQgKkNoYW5uZWxDYWxsYmFja0NvbnRleHQ7CisJdm9pZCAoKm9uY2hhbm5lbF9jYWxsYmFjaykodm9pZCAqY29udGV4dCk7CisJdm9pZCAqY2hhbm5lbF9jYWxsYmFja19jb250ZXh0OwogfTsKIAogc3RydWN0IHZtYnVzX2NoYW5uZWxfZGVidWdfaW5mbyB7Ci0JdTMyIFJlbElkOwotCWVudW0gdm1idXNfY2hhbm5lbF9zdGF0ZSBTdGF0ZTsKLQlzdHJ1Y3QgaHZfZ3VpZCBJbnRlcmZhY2VUeXBlOwotCXN0cnVjdCBodl9ndWlkIEludGVyZmFjZUluc3RhbmNlOwotCXUzMiBNb25pdG9ySWQ7Ci0JdTMyIFNlcnZlck1vbml0b3JQZW5kaW5nOwotCXUzMiBTZXJ2ZXJNb25pdG9yTGF0ZW5jeTsKLQl1MzIgU2VydmVyTW9uaXRvckNvbm5lY3Rpb25JZDsKLQl1MzIgQ2xpZW50TW9uaXRvclBlbmRpbmc7Ci0JdTMyIENsaWVudE1vbml0b3JMYXRlbmN5OwotCXUzMiBDbGllbnRNb25pdG9yQ29ubmVjdGlvbklkOworCXUzMiByZWxpZDsKKwllbnVtIHZtYnVzX2NoYW5uZWxfc3RhdGUgc3RhdGU7CisJc3RydWN0IGh2X2d1aWQgaW50ZXJmYWNldHlwZTsKKwlzdHJ1Y3QgaHZfZ3VpZCBpbnRlcmZhY2VfaW5zdGFuY2U7CisJdTMyIG1vbml0b3JpZDsKKwl1MzIgc2VydmVybW9uaXRvcl9wZW5kaW5nOworCXUzMiBzZXJ2ZXJtb25pdG9yX2xhdGVuY3k7CisJdTMyIHNlcnZlcm1vbml0b3JfY29ubmVjdGlvbmlkOworCXUzMiBjbGllbnRtb25pdG9yX3BlbmRpbmc7CisJdTMyIGNsaWVudG1vbml0b3JfbGF0ZW5jeTsKKwl1MzIgY2xpZW50bW9uaXRvcl9jb25uZWN0aW9uaWQ7CiAKLQlzdHJ1Y3QgaHZfcmluZ19idWZmZXJfZGVidWdfaW5mbyBJbmJvdW5kOwotCXN0cnVjdCBodl9yaW5nX2J1ZmZlcl9kZWJ1Z19pbmZvIE91dGJvdW5kOworCXN0cnVjdCBodl9yaW5nX2J1ZmZlcl9kZWJ1Z19pbmZvIGluYm91bmQ7CisJc3RydWN0IGh2X3JpbmdfYnVmZmVyX2RlYnVnX2luZm8gb3V0Ym91bmQ7CiB9OwogCiAvKgpAQCAtMjgyLDI4ICsyODMsMjggQEAKICAqLwogc3RydWN0IHZtYnVzX2NoYW5uZWxfbXNnaW5mbyB7CiAJLyogQm9va2tlZXBpbmcgc3R1ZmYgKi8KLQlzdHJ1Y3QgbGlzdF9oZWFkIE1zZ0xpc3RFbnRyeTsKKwlzdHJ1Y3QgbGlzdF9oZWFkIG1zZ2xpc3RlbnRyeTsKIAogCS8qIFNvIGZhciwgdGhpcyBpcyBvbmx5IHVzZWQgdG8gaGFuZGxlIGdwYWRsIGJvZHkgbWVzc2FnZSAqLwotCXN0cnVjdCBsaXN0X2hlYWQgU3ViTXNnTGlzdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHN1Ym1zZ2xpc3Q7CiAKIAkvKiBTeW5jaHJvbml6ZSB0aGUgcmVxdWVzdC9yZXNwb25zZSBpZiBuZWVkZWQgKi8KLQlzdHJ1Y3Qgb3NkX3dhaXRldmVudCAqV2FpdEV2ZW50OworCXN0cnVjdCBvc2Rfd2FpdGV2ZW50ICp3YWl0ZXZlbnQ7CiAKIAl1bmlvbiB7Ci0JCXN0cnVjdCB2bWJ1c19jaGFubmVsX3ZlcnNpb25fc3VwcG9ydGVkIFZlcnNpb25TdXBwb3J0ZWQ7Ci0JCXN0cnVjdCB2bWJ1c19jaGFubmVsX29wZW5fcmVzdWx0IE9wZW5SZXN1bHQ7Ci0JCXN0cnVjdCB2bWJ1c19jaGFubmVsX2dwYWRsX3Rvcm5kb3duIEdwYWRsVG9ybmRvd247Ci0JCXN0cnVjdCB2bWJ1c19jaGFubmVsX2dwYWRsX2NyZWF0ZWQgR3BhZGxDcmVhdGVkOwotCQlzdHJ1Y3Qgdm1idXNfY2hhbm5lbF92ZXJzaW9uX3Jlc3BvbnNlIFZlcnNpb25SZXNwb25zZTsKLQl9IFJlc3BvbnNlOworCQlzdHJ1Y3Qgdm1idXNfY2hhbm5lbF92ZXJzaW9uX3N1cHBvcnRlZCB2ZXJzaW9uX3N1cHBvcnRlZDsKKwkJc3RydWN0IHZtYnVzX2NoYW5uZWxfb3Blbl9yZXN1bHQgb3Blbl9yZXN1bHQ7CisJCXN0cnVjdCB2bWJ1c19jaGFubmVsX2dwYWRsX3Rvcm5kb3duIGdwYWRsX3Rvcm5kb3duOworCQlzdHJ1Y3Qgdm1idXNfY2hhbm5lbF9ncGFkbF9jcmVhdGVkIGdwYWRsX2NyZWF0ZWQ7CisJCXN0cnVjdCB2bWJ1c19jaGFubmVsX3ZlcnNpb25fcmVzcG9uc2UgdmVyc2lvbl9yZXNwb25zZTsKKwl9IHJlc3BvbnNlOwogCi0JdTMyIE1lc3NhZ2VTaXplOworCXUzMiBtc2dzaXplOwogCS8qCiAJICogVGhlIGNoYW5uZWwgbWVzc2FnZSB0aGF0IGdvZXMgb3V0IG9uIHRoZSAid2lyZSIuCiAJICogSXQgd2lsbCBjb250YWluIGF0IG1pbmltdW0gdGhlIFZNQlVTX0NIQU5ORUxfTUVTU0FHRV9IRUFERVIgaGVhZGVyCiAJICovCi0JdW5zaWduZWQgY2hhciBNc2dbMF07CisJdW5zaWduZWQgY2hhciBtc2dbMF07CiB9OwogCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9odi9jb25uZWN0aW9uLmMgYi9kcml2ZXJzL3N0YWdpbmcvaHYvY29ubmVjdGlvbi5jCmluZGV4IGY4NDc3MDcuLmMyZTI5OGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9odi9jb25uZWN0aW9uLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2h2L2Nvbm5lY3Rpb24uYwpAQCAtNjYsNyArNjYsNyBAQAogCSAqIFNldHVwIHRoZSB2bWJ1cyBldmVudCBjb25uZWN0aW9uIGZvciBjaGFubmVsIGludGVycnVwdAogCSAqIGFic3RyYWN0aW9uIHN0dWZmCiAJICovCi0JZ1ZtYnVzQ29ubmVjdGlvbi5JbnRlcnJ1cHRQYWdlID0gb3NkX1BhZ2VBbGxvYygxKTsKKwlnVm1idXNDb25uZWN0aW9uLkludGVycnVwdFBhZ2UgPSBvc2RfcGFnZV9hbGxvYygxKTsKIAlpZiAoZ1ZtYnVzQ29ubmVjdGlvbi5JbnRlcnJ1cHRQYWdlID09IE5VTEwpIHsKIAkJcmV0ID0gLTE7CiAJCWdvdG8gQ2xlYW51cDsKQEAgLTgxLDcgKzgxLDcgQEAKIAkgKiBTZXR1cCB0aGUgbW9uaXRvciBub3RpZmljYXRpb24gZmFjaWxpdHkuIFRoZSAxc3QgcGFnZSBmb3IKIAkgKiBwYXJlbnQtPmNoaWxkIGFuZCB0aGUgMm5kIHBhZ2UgZm9yIGNoaWxkLT5wYXJlbnQKIAkgKi8KLQlnVm1idXNDb25uZWN0aW9uLk1vbml0b3JQYWdlcyA9IG9zZF9QYWdlQWxsb2MoMik7CisJZ1ZtYnVzQ29ubmVjdGlvbi5Nb25pdG9yUGFnZXMgPSBvc2RfcGFnZV9hbGxvYygyKTsKIAlpZiAoZ1ZtYnVzQ29ubmVjdGlvbi5Nb25pdG9yUGFnZXMgPT0gTlVMTCkgewogCQlyZXQgPSAtMTsKIAkJZ290byBDbGVhbnVwOwpAQCAtOTUsMTkgKzk1LDE5IEBACiAJCWdvdG8gQ2xlYW51cDsKIAl9CiAKLQltc2dJbmZvLT5XYWl0RXZlbnQgPSBvc2RfV2FpdEV2ZW50Q3JlYXRlKCk7Ci0JaWYgKCFtc2dJbmZvLT5XYWl0RXZlbnQpIHsKKwltc2dJbmZvLT53YWl0ZXZlbnQgPSBvc2Rfd2FpdGV2ZW50X2NyZWF0ZSgpOworCWlmICghbXNnSW5mby0+d2FpdGV2ZW50KSB7CiAJCXJldCA9IC1FTk9NRU07CiAJCWdvdG8gQ2xlYW51cDsKIAl9CiAKLQltc2cgPSAoc3RydWN0IHZtYnVzX2NoYW5uZWxfaW5pdGlhdGVfY29udGFjdCAqKW1zZ0luZm8tPk1zZzsKKwltc2cgPSAoc3RydWN0IHZtYnVzX2NoYW5uZWxfaW5pdGlhdGVfY29udGFjdCAqKW1zZ0luZm8tPm1zZzsKIAotCW1zZy0+SGVhZGVyLk1lc3NhZ2VUeXBlID0gQ2hhbm5lbE1lc3NhZ2VJbml0aWF0ZUNvbnRhY3Q7Ci0JbXNnLT5WTUJ1c1ZlcnNpb25SZXF1ZXN0ZWQgPSBWTUJVU19SRVZJU0lPTl9OVU1CRVI7Ci0JbXNnLT5JbnRlcnJ1cHRQYWdlID0gdmlydF90b19waHlzKGdWbWJ1c0Nvbm5lY3Rpb24uSW50ZXJydXB0UGFnZSk7Ci0JbXNnLT5Nb25pdG9yUGFnZTEgPSB2aXJ0X3RvX3BoeXMoZ1ZtYnVzQ29ubmVjdGlvbi5Nb25pdG9yUGFnZXMpOwotCW1zZy0+TW9uaXRvclBhZ2UyID0gdmlydF90b19waHlzKAorCW1zZy0+aGVhZGVyLm1zZ3R5cGUgPSBDSEFOTkVMTVNHX0lOSVRJQVRFX0NPTlRBQ1Q7CisJbXNnLT52bWJ1c192ZXJzaW9uX3JlcXVlc3RlZCA9IFZNQlVTX1JFVklTSU9OX05VTUJFUjsKKwltc2ctPmludGVycnVwdF9wYWdlID0gdmlydF90b19waHlzKGdWbWJ1c0Nvbm5lY3Rpb24uSW50ZXJydXB0UGFnZSk7CisJbXNnLT5tb25pdG9yX3BhZ2UxID0gdmlydF90b19waHlzKGdWbWJ1c0Nvbm5lY3Rpb24uTW9uaXRvclBhZ2VzKTsKKwltc2ctPm1vbml0b3JfcGFnZTIgPSB2aXJ0X3RvX3BoeXMoCiAJCQkodm9pZCAqKSgodW5zaWduZWQgbG9uZylnVm1idXNDb25uZWN0aW9uLk1vbml0b3JQYWdlcyArCiAJCQkJIFBBR0VfU0laRSkpOwogCkBAIC0xMTYsMzAgKzExNiwzMCBAQAogCSAqIHJlY2VpdmUgdGhlIHJlc3BvbnNlIGJlZm9yZSByZXR1cm5pbmcgZnJvbSB0aGlzIHJvdXRpbmUKIAkgKi8KIAlzcGluX2xvY2tfaXJxc2F2ZSgmZ1ZtYnVzQ29ubmVjdGlvbi5jaGFubmVsbXNnX2xvY2ssIGZsYWdzKTsKLQlsaXN0X2FkZF90YWlsKCZtc2dJbmZvLT5Nc2dMaXN0RW50cnksCisJbGlzdF9hZGRfdGFpbCgmbXNnSW5mby0+bXNnbGlzdGVudHJ5LAogCQkgICAgICAmZ1ZtYnVzQ29ubmVjdGlvbi5DaGFubmVsTXNnTGlzdCk7CiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZnVm1idXNDb25uZWN0aW9uLmNoYW5uZWxtc2dfbG9jaywgZmxhZ3MpOwogCiAJRFBSSU5UX0RCRyhWTUJVUywgIlZtYnVzIGNvbm5lY3Rpb24gLSBpbnRlcnJ1cHQgcGZuICVsbHgsICIKIAkJICAgIm1vbml0b3IxIHBmbiAlbGx4LCwgbW9uaXRvcjIgcGZuICVsbHgiLAotCQkgICBtc2ctPkludGVycnVwdFBhZ2UsIG1zZy0+TW9uaXRvclBhZ2UxLCBtc2ctPk1vbml0b3JQYWdlMik7CisJCSAgIG1zZy0+aW50ZXJydXB0X3BhZ2UsIG1zZy0+bW9uaXRvcl9wYWdlMSwgbXNnLT5tb25pdG9yX3BhZ2UyKTsKIAogCURQUklOVF9EQkcoVk1CVVMsICJTZW5kaW5nIGNoYW5uZWwgaW5pdGlhdGUgbXNnLi4uIik7CiAJcmV0ID0gVm1idXNQb3N0TWVzc2FnZShtc2csCiAJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCB2bWJ1c19jaGFubmVsX2luaXRpYXRlX2NvbnRhY3QpKTsKIAlpZiAocmV0ICE9IDApIHsKLQkJbGlzdF9kZWwoJm1zZ0luZm8tPk1zZ0xpc3RFbnRyeSk7CisJCWxpc3RfZGVsKCZtc2dJbmZvLT5tc2dsaXN0ZW50cnkpOwogCQlnb3RvIENsZWFudXA7CiAJfQogCiAJLyogV2FpdCBmb3IgdGhlIGNvbm5lY3Rpb24gcmVzcG9uc2UgKi8KLQlvc2RfV2FpdEV2ZW50V2FpdChtc2dJbmZvLT5XYWl0RXZlbnQpOworCW9zZF93YWl0ZXZlbnRfd2FpdChtc2dJbmZvLT53YWl0ZXZlbnQpOwogCi0JbGlzdF9kZWwoJm1zZ0luZm8tPk1zZ0xpc3RFbnRyeSk7CisJbGlzdF9kZWwoJm1zZ0luZm8tPm1zZ2xpc3RlbnRyeSk7CiAKIAkvKiBDaGVjayBpZiBzdWNjZXNzZnVsICovCi0JaWYgKG1zZ0luZm8tPlJlc3BvbnNlLlZlcnNpb25SZXNwb25zZS5WZXJzaW9uU3VwcG9ydGVkKSB7CisJaWYgKG1zZ0luZm8tPnJlc3BvbnNlLnZlcnNpb25fcmVzcG9uc2UudmVyc2lvbl9zdXBwb3J0ZWQpIHsKIAkJRFBSSU5UX0lORk8oVk1CVVMsICJWbWJ1cyBjb25uZWN0ZWQhISIpOwogCQlnVm1idXNDb25uZWN0aW9uLkNvbm5lY3RTdGF0ZSA9IENvbm5lY3RlZDsKIApAQCAtMTUxLDcgKzE1MSw3IEBACiAJCWdvdG8gQ2xlYW51cDsKIAl9CiAKLQlrZnJlZShtc2dJbmZvLT5XYWl0RXZlbnQpOworCWtmcmVlKG1zZ0luZm8tPndhaXRldmVudCk7CiAJa2ZyZWUobXNnSW5mbyk7CiAJcmV0dXJuIDA7CiAKQEAgLTE2MiwxNyArMTYyLDE3IEBACiAJCWRlc3Ryb3lfd29ya3F1ZXVlKGdWbWJ1c0Nvbm5lY3Rpb24uV29ya1F1ZXVlKTsKIAogCWlmIChnVm1idXNDb25uZWN0aW9uLkludGVycnVwdFBhZ2UpIHsKLQkJb3NkX1BhZ2VGcmVlKGdWbWJ1c0Nvbm5lY3Rpb24uSW50ZXJydXB0UGFnZSwgMSk7CisJCW9zZF9wYWdlX2ZyZWUoZ1ZtYnVzQ29ubmVjdGlvbi5JbnRlcnJ1cHRQYWdlLCAxKTsKIAkJZ1ZtYnVzQ29ubmVjdGlvbi5JbnRlcnJ1cHRQYWdlID0gTlVMTDsKIAl9CiAKIAlpZiAoZ1ZtYnVzQ29ubmVjdGlvbi5Nb25pdG9yUGFnZXMpIHsKLQkJb3NkX1BhZ2VGcmVlKGdWbWJ1c0Nvbm5lY3Rpb24uTW9uaXRvclBhZ2VzLCAyKTsKKwkJb3NkX3BhZ2VfZnJlZShnVm1idXNDb25uZWN0aW9uLk1vbml0b3JQYWdlcywgMik7CiAJCWdWbWJ1c0Nvbm5lY3Rpb24uTW9uaXRvclBhZ2VzID0gTlVMTDsKIAl9CiAKIAlpZiAobXNnSW5mbykgewotCQlrZnJlZShtc2dJbmZvLT5XYWl0RXZlbnQpOworCQlrZnJlZShtc2dJbmZvLT53YWl0ZXZlbnQpOwogCQlrZnJlZShtc2dJbmZvKTsKIAl9CiAKQEAgLTE5NSwxNCArMTk1LDE0IEBACiAJaWYgKCFtc2cpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JbXNnLT5NZXNzYWdlVHlwZSA9IENoYW5uZWxNZXNzYWdlVW5sb2FkOworCW1zZy0+bXNndHlwZSA9IENIQU5ORUxNU0dfVU5MT0FEOwogCiAJcmV0ID0gVm1idXNQb3N0TWVzc2FnZShtc2csCiAJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCB2bWJ1c19jaGFubmVsX21lc3NhZ2VfaGVhZGVyKSk7CiAJaWYgKHJldCAhPSAwKQogCQlnb3RvIENsZWFudXA7CiAKLQlvc2RfUGFnZUZyZWUoZ1ZtYnVzQ29ubmVjdGlvbi5JbnRlcnJ1cHRQYWdlLCAxKTsKKwlvc2RfcGFnZV9mcmVlKGdWbWJ1c0Nvbm5lY3Rpb24uSW50ZXJydXB0UGFnZSwgMSk7CiAKIAkvKiBUT0RPOiBpdGVyYXRlIHRocnUgdGhlIG1zZyBsaXN0IGFuZCBmcmVlIHVwICovCiAJZGVzdHJveV93b3JrcXVldWUoZ1ZtYnVzQ29ubmVjdGlvbi5Xb3JrUXVldWUpOwpAQCAtMjI2LDggKzIyNiw4IEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZnVm1idXNDb25uZWN0aW9uLmNoYW5uZWxfbG9jaywgZmxhZ3MpOwotCWxpc3RfZm9yX2VhY2hfZW50cnkoY2hhbm5lbCwgJmdWbWJ1c0Nvbm5lY3Rpb24uQ2hhbm5lbExpc3QsIExpc3RFbnRyeSkgewotCQlpZiAoY2hhbm5lbC0+T2ZmZXJNc2cuQ2hpbGRSZWxJZCA9PSByZWxJZCkgeworCWxpc3RfZm9yX2VhY2hfZW50cnkoY2hhbm5lbCwgJmdWbWJ1c0Nvbm5lY3Rpb24uQ2hhbm5lbExpc3QsIGxpc3RlbnRyeSkgeworCQlpZiAoY2hhbm5lbC0+b2ZmZXJtc2cuY2hpbGRfcmVsaWQgPT0gcmVsSWQpIHsKIAkJCWZvdW5kQ2hhbm5lbCA9IGNoYW5uZWw7CiAJCQlicmVhazsKIAkJfQpAQCAtMzA5LDkgKzMwOSw5IEBACiB7CiAJdW5pb24gaHZfY29ubmVjdGlvbl9pZCBjb25uSWQ7CiAKLQljb25uSWQuQXN1MzIgPSAwOwotCWNvbm5JZC51LklkID0gVk1CVVNfTUVTU0FHRV9DT05ORUNUSU9OX0lEOwotCXJldHVybiBIdlBvc3RNZXNzYWdlKGNvbm5JZCwgMSwgYnVmZmVyLCBidWZmZXJMZW4pOworCWNvbm5JZC5hc3UzMiA9IDA7CisJY29ubklkLnUuaWQgPSBWTUJVU19NRVNTQUdFX0NPTk5FQ1RJT05fSUQ7CisJcmV0dXJuIGh2X3Bvc3RfbWVzc2FnZShjb25uSWQsIDEsIGJ1ZmZlciwgYnVmZmVyTGVuKTsKIH0KIAogLyoKQEAgLTMyNCw1ICszMjQsNSBAQAogCQkodW5zaWduZWQgbG9uZyAqKWdWbWJ1c0Nvbm5lY3Rpb24uU2VuZEludGVycnVwdFBhZ2UgKwogCQkoY2hpbGRSZWxJZCA+PiA1KSk7CiAKLQlyZXR1cm4gSHZTaWduYWxFdmVudCgpOworCXJldHVybiBodl9zaWduYWxfZXZlbnQoKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9odi9odi5jIGIvZHJpdmVycy9zdGFnaW5nL2h2L2h2LmMKaW5kZXggODZiMWRkZC4uYTM0ZDcxMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2h2L2h2LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2h2L2h2LmMKQEAgLTI4LDE3ICsyOCwxOCBAQAogI2luY2x1ZGUgInZtYnVzX3ByaXZhdGUuaCIKIAogLyogVGhlIG9uZSBhbmQgb25seSAqLwotc3RydWN0IGh2X2NvbnRleHQgZ0h2Q29udGV4dCA9IHsKLQkuU3luSUNJbml0aWFsaXplZAk9IGZhbHNlLAotCS5IeXBlcmNhbGxQYWdlCQk9IE5VTEwsCi0JLlNpZ25hbEV2ZW50UGFyYW0JPSBOVUxMLAotCS5TaWduYWxFdmVudEJ1ZmZlcgk9IE5VTEwsCitzdHJ1Y3QgaHZfY29udGV4dCBodl9jb250ZXh0ID0geworCS5zeW5pY19pbml0aWFsaXplZAk9IGZhbHNlLAorCS5oeXBlcmNhbGxfcGFnZQkJPSBOVUxMLAorCS5zaWduYWxfZXZlbnRfcGFyYW0JPSBOVUxMLAorCS5zaWduYWxfZXZlbnRfYnVmZmVyCT0gTlVMTCwKIH07CiAKIC8qCi0gKiBIdlF1ZXJ5SHlwZXJ2aXNvclByZXNlbmNlIC0gUXVlcnkgdGhlIGNwdWlkIGZvciBwcmVzZW5zZSBvZiB3aW5kb3dzIGh5cGVydmlzb3IKKyAqIHF1ZXJ5X2h5cGVydmlzb3JfcHJlc2VuY2UKKyAqIC0gUXVlcnkgdGhlIGNwdWlkIGZvciBwcmVzZW5zZSBvZiB3aW5kb3dzIGh5cGVydmlzb3IKICAqLwotc3RhdGljIGludCBIdlF1ZXJ5SHlwZXJ2aXNvclByZXNlbmNlKHZvaWQpCitzdGF0aWMgaW50IHF1ZXJ5X2h5cGVydmlzb3JfcHJlc2VuY2Uodm9pZCkKIHsKIAl1bnNpZ25lZCBpbnQgZWF4OwogCXVuc2lnbmVkIGludCBlYng7CkBAIC01MCwyMiArNTEsMjIgQEAKIAllYnggPSAwOwogCWVjeCA9IDA7CiAJZWR4ID0gMDsKLQlvcCA9IEh2Q3B1SWRGdW5jdGlvblZlcnNpb25BbmRGZWF0dXJlczsKKwlvcCA9IEhWQ1BVSURfVkVSU0lPTl9GRUFUVVJFUzsKIAljcHVpZChvcCwgJmVheCwgJmVieCwgJmVjeCwgJmVkeCk7CiAKIAlyZXR1cm4gZWN4ICYgSFZfUFJFU0VOVF9CSVQ7CiB9CiAKIC8qCi0gKiBIdlF1ZXJ5SHlwZXJ2aXNvckluZm8gLSBHZXQgdmVyc2lvbiBpbmZvIG9mIHRoZSB3aW5kb3dzIGh5cGVydmlzb3IKKyAqIHF1ZXJ5X2h5cGVydmlzb3JfaW5mbyAtIEdldCB2ZXJzaW9uIGluZm8gb2YgdGhlIHdpbmRvd3MgaHlwZXJ2aXNvcgogICovCi1zdGF0aWMgaW50IEh2UXVlcnlIeXBlcnZpc29ySW5mbyh2b2lkKQorc3RhdGljIGludCBxdWVyeV9oeXBlcnZpc29yX2luZm8odm9pZCkKIHsKIAl1bnNpZ25lZCBpbnQgZWF4OwogCXVuc2lnbmVkIGludCBlYng7CiAJdW5zaWduZWQgaW50IGVjeDsKIAl1bnNpZ25lZCBpbnQgZWR4OwotCXVuc2lnbmVkIGludCBtYXhMZWFmOworCXVuc2lnbmVkIGludCBtYXhfbGVhZjsKIAl1bnNpZ25lZCBpbnQgb3A7CiAKIAkvKgpAQCAtNzYsNyArNzcsNyBAQAogCWVieCA9IDA7CiAJZWN4ID0gMDsKIAllZHggPSAwOwotCW9wID0gSHZDcHVJZEZ1bmN0aW9uSHZWZW5kb3JBbmRNYXhGdW5jdGlvbjsKKwlvcCA9IEhWQ1BVSURfVkVORE9SX01BWEZVTkNUSU9OOwogCWNwdWlkKG9wLCAmZWF4LCAmZWJ4LCAmZWN4LCAmZWR4KTsKIAogCURQUklOVF9JTkZPKFZNQlVTLCAiVmVuZG9yIElEOiAlYyVjJWMlYyVjJWMlYyVjJWMlYyVjJWMiLApAQCAtOTMsMTIgKzk0LDEyIEBACiAJCSAgICAoKGVkeCA+PiAxNikgJiAweEZGKSwKIAkJICAgICgoZWR4ID4+IDI0KSAmIDB4RkYpKTsKIAotCW1heExlYWYgPSBlYXg7CisJbWF4X2xlYWYgPSBlYXg7CiAJZWF4ID0gMDsKIAllYnggPSAwOwogCWVjeCA9IDA7CiAJZWR4ID0gMDsKLQlvcCA9IEh2Q3B1SWRGdW5jdGlvbkh2SW50ZXJmYWNlOworCW9wID0gSFZDUFVJRF9JTlRFUkZBQ0U7CiAJY3B1aWQob3AsICZlYXgsICZlYngsICZlY3gsICZlZHgpOwogCiAJRFBSSU5UX0lORk8oVk1CVVMsICJJbnRlcmZhY2UgSUQ6ICVjJWMlYyVjIiwKQEAgLTEwNywxMiArMTA4LDEyIEBACiAJCSAgICAoKGVheCA+PiAxNikgJiAweEZGKSwKIAkJICAgICgoZWF4ID4+IDI0KSAmIDB4RkYpKTsKIAotCWlmIChtYXhMZWFmID49IEh2Q3B1SWRGdW5jdGlvbk1zSHZWZXJzaW9uKSB7CisJaWYgKG1heF9sZWFmID49IEhWQ1BVSURfVkVSU0lPTikgewogCQllYXggPSAwOwogCQllYnggPSAwOwogCQllY3ggPSAwOwogCQllZHggPSAwOwotCQlvcCA9IEh2Q3B1SWRGdW5jdGlvbk1zSHZWZXJzaW9uOworCQlvcCA9IEhWQ1BVSURfVkVSU0lPTjsKIAkJY3B1aWQob3AsICZlYXgsICZlYngsICZlY3gsICZlZHgpOwogCQlEUFJJTlRfSU5GTyhWTUJVUywgIk9TIEJ1aWxkOiVkLSVkLiVkLSVkLSVkLiVkIixcCiAJCQkgICAgZWF4LApAQCAtMTIyLDgwICsxMjMsODEgQEAKIAkJCSAgICBlZHggPj4gMjQsCiAJCQkgICAgZWR4ICYgMHhGRkZGRkYpOwogCX0KLQlyZXR1cm4gbWF4TGVhZjsKKwlyZXR1cm4gbWF4X2xlYWY7CiB9CiAKIC8qCi0gKiBIdkRvSHlwZXJjYWxsIC0gSW52b2tlIHRoZSBzcGVjaWZpZWQgaHlwZXJjYWxsCisgKiBkb19oeXBlcmNhbGwtIEludm9rZSB0aGUgc3BlY2lmaWVkIGh5cGVyY2FsbAogICovCi1zdGF0aWMgdTY0IEh2RG9IeXBlcmNhbGwodTY0IENvbnRyb2wsIHZvaWQgKklucHV0LCB2b2lkICpPdXRwdXQpCitzdGF0aWMgdTY0IGRvX2h5cGVyY2FsbCh1NjQgY29udHJvbCwgdm9pZCAqaW5wdXQsIHZvaWQgKm91dHB1dCkKIHsKICNpZmRlZiBDT05GSUdfWDg2XzY0Ci0JdTY0IGh2U3RhdHVzID0gMDsKLQl1NjQgaW5wdXRBZGRyZXNzID0gKElucHV0KSA/IHZpcnRfdG9fcGh5cyhJbnB1dCkgOiAwOwotCXU2NCBvdXRwdXRBZGRyZXNzID0gKE91dHB1dCkgPyB2aXJ0X3RvX3BoeXMoT3V0cHV0KSA6IDA7Ci0Jdm9sYXRpbGUgdm9pZCAqaHlwZXJjYWxsUGFnZSA9IGdIdkNvbnRleHQuSHlwZXJjYWxsUGFnZTsKKwl1NjQgaHZfc3RhdHVzID0gMDsKKwl1NjQgaW5wdXRfYWRkcmVzcyA9IChpbnB1dCkgPyB2aXJ0X3RvX3BoeXMoaW5wdXQpIDogMDsKKwl1NjQgb3V0cHV0X2FkZHJlc3MgPSAob3V0cHV0KSA/IHZpcnRfdG9fcGh5cyhvdXRwdXQpIDogMDsKKwl2b2xhdGlsZSB2b2lkICpoeXBlcmNhbGxfcGFnZSA9IGh2X2NvbnRleHQuaHlwZXJjYWxsX3BhZ2U7CiAKIAlEUFJJTlRfREJHKFZNQlVTLCAiSHlwZXJjYWxsIDxjb250cm9sICVsbHggaW5wdXQgcGh5cyAlbGx4IHZpcnQgJXAgIgogCQkgICAib3V0cHV0IHBoeXMgJWxseCB2aXJ0ICVwIGh5cGVyY2FsbCAlcD4iLAotCQkgICBDb250cm9sLCBpbnB1dEFkZHJlc3MsIElucHV0LAotCQkgICBvdXRwdXRBZGRyZXNzLCBPdXRwdXQsIGh5cGVyY2FsbFBhZ2UpOworCQkgICBjb250cm9sLCBpbnB1dF9hZGRyZXNzLCBpbnB1dCwKKwkJICAgb3V0cHV0X2FkZHJlc3MsIG91dHB1dCwgaHlwZXJjYWxsX3BhZ2UpOwogCi0JX19hc21fXyBfX3ZvbGF0aWxlX18oIm1vdiAlMCwgJSVyOCIgOiA6ICJyIiAob3V0cHV0QWRkcmVzcykgOiAicjgiKTsKLQlfX2FzbV9fIF9fdm9sYXRpbGVfXygiY2FsbCAqJTMiIDogIj1hIiAoaHZTdGF0dXMpIDoKLQkJCSAgICAgImMiIChDb250cm9sKSwgImQiIChpbnB1dEFkZHJlc3MpLAotCQkJICAgICAibSIgKGh5cGVyY2FsbFBhZ2UpKTsKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygibW92ICUwLCAlJXI4IiA6IDogInIiIChvdXRwdXRfYWRkcmVzcykgOiAicjgiKTsKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygiY2FsbCAqJTMiIDogIj1hIiAoaHZfc3RhdHVzKSA6CisJCQkgICAgICJjIiAoY29udHJvbCksICJkIiAoaW5wdXRfYWRkcmVzcyksCisJCQkgICAgICJtIiAoaHlwZXJjYWxsX3BhZ2UpKTsKIAotCURQUklOVF9EQkcoVk1CVVMsICJIeXBlcmNhbGwgPHJldHVybiAlbGx4PiIsICBodlN0YXR1cyk7CisJRFBSSU5UX0RCRyhWTUJVUywgIkh5cGVyY2FsbCA8cmV0dXJuICVsbHg+IiwgIGh2X3N0YXR1cyk7CiAKLQlyZXR1cm4gaHZTdGF0dXM7CisJcmV0dXJuIGh2X3N0YXR1czsKIAogI2Vsc2UKIAotCXUzMiBjb250cm9sSGkgPSBDb250cm9sID4+IDMyOwotCXUzMiBjb250cm9sTG8gPSBDb250cm9sICYgMHhGRkZGRkZGRjsKLQl1MzIgaHZTdGF0dXNIaSA9IDE7Ci0JdTMyIGh2U3RhdHVzTG8gPSAxOwotCXU2NCBpbnB1dEFkZHJlc3MgPSAoSW5wdXQpID8gdmlydF90b19waHlzKElucHV0KSA6IDA7Ci0JdTMyIGlucHV0QWRkcmVzc0hpID0gaW5wdXRBZGRyZXNzID4+IDMyOwotCXUzMiBpbnB1dEFkZHJlc3NMbyA9IGlucHV0QWRkcmVzcyAmIDB4RkZGRkZGRkY7Ci0JdTY0IG91dHB1dEFkZHJlc3MgPSAoT3V0cHV0KSA/IHZpcnRfdG9fcGh5cyhPdXRwdXQpIDogMDsKLQl1MzIgb3V0cHV0QWRkcmVzc0hpID0gb3V0cHV0QWRkcmVzcyA+PiAzMjsKLQl1MzIgb3V0cHV0QWRkcmVzc0xvID0gb3V0cHV0QWRkcmVzcyAmIDB4RkZGRkZGRkY7Ci0Jdm9sYXRpbGUgdm9pZCAqaHlwZXJjYWxsUGFnZSA9IGdIdkNvbnRleHQuSHlwZXJjYWxsUGFnZTsKKwl1MzIgY29udHJvbF9oaSA9IGNvbnRyb2wgPj4gMzI7CisJdTMyIGNvbnRyb2xfbG8gPSBjb250cm9sICYgMHhGRkZGRkZGRjsKKwl1MzIgaHZfc3RhdHVzX2hpID0gMTsKKwl1MzIgaHZfc3RhdHVzX2xvID0gMTsKKwl1NjQgaW5wdXRfYWRkcmVzcyA9IChpbnB1dCkgPyB2aXJ0X3RvX3BoeXMoaW5wdXQpIDogMDsKKwl1MzIgaW5wdXRfYWRkcmVzc19oaSA9IGlucHV0X2FkZHJlc3MgPj4gMzI7CisJdTMyIGlucHV0X2FkZHJlc3NfbG8gPSBpbnB1dF9hZGRyZXNzICYgMHhGRkZGRkZGRjsKKwl1NjQgb3V0cHV0X2FkZHJlc3MgPSAob3V0cHV0KSA/IHZpcnRfdG9fcGh5cyhvdXRwdXQpIDogMDsKKwl1MzIgb3V0cHV0X2FkZHJlc3NfaGkgPSBvdXRwdXRfYWRkcmVzcyA+PiAzMjsKKwl1MzIgb3V0cHV0X2FkZHJlc3NfbG8gPSBvdXRwdXRfYWRkcmVzcyAmIDB4RkZGRkZGRkY7CisJdm9sYXRpbGUgdm9pZCAqaHlwZXJjYWxsX3BhZ2UgPSBodl9jb250ZXh0Lmh5cGVyY2FsbF9wYWdlOwogCiAJRFBSSU5UX0RCRyhWTUJVUywgIkh5cGVyY2FsbCA8Y29udHJvbCAlbGx4IGlucHV0ICVwIG91dHB1dCAlcD4iLAotCQkgICBDb250cm9sLCBJbnB1dCwgT3V0cHV0KTsKKwkJICAgY29udHJvbCwgaW5wdXQsIG91dHB1dCk7CiAKLQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImNhbGwgKiU4IiA6ICI9ZCIoaHZTdGF0dXNIaSksCi0JCQkgICAgICAiPWEiKGh2U3RhdHVzTG8pIDogImQiIChjb250cm9sSGkpLAotCQkJICAgICAgImEiIChjb250cm9sTG8pLCAiYiIgKGlucHV0QWRkcmVzc0hpKSwKLQkJCSAgICAgICJjIiAoaW5wdXRBZGRyZXNzTG8pLCAiRCIob3V0cHV0QWRkcmVzc0hpKSwKLQkJCSAgICAgICJTIihvdXRwdXRBZGRyZXNzTG8pLCAibSIgKGh5cGVyY2FsbFBhZ2UpKTsKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImNhbGwgKiU4IiA6ICI9ZCIoaHZfc3RhdHVzX2hpKSwKKwkJCSAgICAgICI9YSIoaHZfc3RhdHVzX2xvKSA6ICJkIiAoY29udHJvbF9oaSksCisJCQkgICAgICAiYSIgKGNvbnRyb2xfbG8pLCAiYiIgKGlucHV0X2FkZHJlc3NfaGkpLAorCQkJICAgICAgImMiIChpbnB1dF9hZGRyZXNzX2xvKSwgIkQiKG91dHB1dF9hZGRyZXNzX2hpKSwKKwkJCSAgICAgICJTIihvdXRwdXRfYWRkcmVzc19sbyksICJtIiAoaHlwZXJjYWxsX3BhZ2UpKTsKIAogCURQUklOVF9EQkcoVk1CVVMsICJIeXBlcmNhbGwgPHJldHVybiAlbGx4PiIsCi0JCSAgIGh2U3RhdHVzTG8gfCAoKHU2NClodlN0YXR1c0hpIDw8IDMyKSk7CisJCSAgIGh2X3N0YXR1c19sbyB8ICgodTY0KWh2X3N0YXR1c19oaSA8PCAzMikpOwogCi0JcmV0dXJuIGh2U3RhdHVzTG8gfCAoKHU2NClodlN0YXR1c0hpIDw8IDMyKTsKKwlyZXR1cm4gaHZfc3RhdHVzX2xvIHwgKCh1NjQpaHZfc3RhdHVzX2hpIDw8IDMyKTsKICNlbmRpZiAvKiAheDg2XzY0ICovCiB9CiAKIC8qCi0gKiBIdkluaXQgLSBNYWluIGluaXRpYWxpemF0aW9uIHJvdXRpbmUuCisgKiBodl9pbml0IC0gTWFpbiBpbml0aWFsaXphdGlvbiByb3V0aW5lLgogICoKICAqIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgYW55IG90aGVyIHJvdXRpbmVzIGluIGhlcmUgYXJlIGNhbGxlZAogICovCi1pbnQgSHZJbml0KHZvaWQpCitpbnQgaHZfaW5pdCh2b2lkKQogewogCWludCByZXQgPSAwOwotCWludCBtYXhMZWFmOwotCXVuaW9uIGh2X3g2NF9tc3JfaHlwZXJjYWxsX2NvbnRlbnRzIGh5cGVyY2FsbE1zcjsKLQl2b2lkICp2aXJ0QWRkciA9IE5VTEw7CisJaW50IG1heF9sZWFmOworCXVuaW9uIGh2X3g2NF9tc3JfaHlwZXJjYWxsX2NvbnRlbnRzIGh5cGVyY2FsbF9tc3I7CisJdm9pZCAqdmlydGFkZHIgPSBOVUxMOwogCi0JbWVtc2V0KGdIdkNvbnRleHQuc3luSUNFdmVudFBhZ2UsIDAsIHNpemVvZih2b2lkICopICogTUFYX05VTV9DUFVTKTsKLQltZW1zZXQoZ0h2Q29udGV4dC5zeW5JQ01lc3NhZ2VQYWdlLCAwLCBzaXplb2Yodm9pZCAqKSAqIE1BWF9OVU1fQ1BVUyk7CisJbWVtc2V0KGh2X2NvbnRleHQuc3luaWNfZXZlbnRfcGFnZSwgMCwgc2l6ZW9mKHZvaWQgKikgKiBNQVhfTlVNX0NQVVMpOworCW1lbXNldChodl9jb250ZXh0LnN5bmljX21lc3NhZ2VfcGFnZSwgMCwKKwkgICAgICAgc2l6ZW9mKHZvaWQgKikgKiBNQVhfTlVNX0NQVVMpOwogCi0JaWYgKCFIdlF1ZXJ5SHlwZXJ2aXNvclByZXNlbmNlKCkpIHsKKwlpZiAoIXF1ZXJ5X2h5cGVydmlzb3JfcHJlc2VuY2UoKSkgewogCQlEUFJJTlRfRVJSKFZNQlVTLCAiTm8gV2luZG93cyBoeXBlcnZpc29yIGRldGVjdGVkISEiKTsKIAkJZ290byBDbGVhbnVwOwogCX0KQEAgLTIwMywxNDYgKzIwNSwxNDggQEAKIAlEUFJJTlRfSU5GTyhWTUJVUywKIAkJICAgICJXaW5kb3dzIGh5cGVydmlzb3IgZGV0ZWN0ZWQhIFJldHJpZXZpbmcgbW9yZSBpbmZvLi4uIik7CiAKLQltYXhMZWFmID0gSHZRdWVyeUh5cGVydmlzb3JJbmZvKCk7CisJbWF4X2xlYWYgPSBxdWVyeV9oeXBlcnZpc29yX2luZm8oKTsKIAkvKiBIdlF1ZXJ5SHlwZXJ2aXNvckZlYXR1cmVzKG1heExlYWYpOyAqLwogCiAJLyoKIAkgKiBXZSBvbmx5IHN1cHBvcnQgcnVubmluZyBvbiB0b3Agb2YgSHlwZXItVgogCSAqLwotCXJkbXNybChIVl9YNjRfTVNSX0dVRVNUX09TX0lELCBnSHZDb250ZXh0Lkd1ZXN0SWQpOworCXJkbXNybChIVl9YNjRfTVNSX0dVRVNUX09TX0lELCBodl9jb250ZXh0Lmd1ZXN0aWQpOwogCi0JaWYgKGdIdkNvbnRleHQuR3Vlc3RJZCAhPSAwKSB7CisJaWYgKGh2X2NvbnRleHQuZ3Vlc3RpZCAhPSAwKSB7CiAJCURQUklOVF9FUlIoVk1CVVMsICJVbmtub3duIGd1ZXN0IGlkICgweCVsbHgpISEiLAotCQkJCWdIdkNvbnRleHQuR3Vlc3RJZCk7CisJCQkJaHZfY29udGV4dC5ndWVzdGlkKTsKIAkJZ290byBDbGVhbnVwOwogCX0KIAogCS8qIFdyaXRlIG91ciBPUyBpbmZvICovCiAJd3Jtc3JsKEhWX1g2NF9NU1JfR1VFU1RfT1NfSUQsIEhWX0xJTlVYX0dVRVNUX0lEKTsKLQlnSHZDb250ZXh0Lkd1ZXN0SWQgPSBIVl9MSU5VWF9HVUVTVF9JRDsKKwlodl9jb250ZXh0Lmd1ZXN0aWQgPSBIVl9MSU5VWF9HVUVTVF9JRDsKIAogCS8qIFNlZSBpZiB0aGUgaHlwZXJjYWxsIHBhZ2UgaXMgYWxyZWFkeSBzZXQgKi8KLQlyZG1zcmwoSFZfWDY0X01TUl9IWVBFUkNBTEwsIGh5cGVyY2FsbE1zci5Bc1VJTlQ2NCk7CisJcmRtc3JsKEhWX1g2NF9NU1JfSFlQRVJDQUxMLCBoeXBlcmNhbGxfbXNyLmFzX3VpbnQ2NCk7CiAKIAkvKgogCSogQWxsb2NhdGUgdGhlIGh5cGVyY2FsbCBwYWdlIG1lbW9yeQotCSogdmlydEFkZHIgPSBvc2RfUGFnZUFsbG9jKDEpOworCSogdmlydGFkZHIgPSBvc2RfcGFnZV9hbGxvYygxKTsKIAkqLwotCXZpcnRBZGRyID0gb3NkX1ZpcnR1YWxBbGxvY0V4ZWMoUEFHRV9TSVpFKTsKKwl2aXJ0YWRkciA9IG9zZF92aXJ0dWFsX2FsbG9jX2V4ZWMoUEFHRV9TSVpFKTsKIAotCWlmICghdmlydEFkZHIpIHsKKwlpZiAoIXZpcnRhZGRyKSB7CiAJCURQUklOVF9FUlIoVk1CVVMsCiAJCQkgICAidW5hYmxlIHRvIGFsbG9jYXRlIGh5cGVyY2FsbCBwYWdlISEiKTsKIAkJZ290byBDbGVhbnVwOwogCX0KIAotCWh5cGVyY2FsbE1zci5FbmFibGUgPSAxOworCWh5cGVyY2FsbF9tc3IuZW5hYmxlID0gMTsKIAotCWh5cGVyY2FsbE1zci5HdWVzdFBoeXNpY2FsQWRkcmVzcyA9IHZtYWxsb2NfdG9fcGZuKHZpcnRBZGRyKTsKLQl3cm1zcmwoSFZfWDY0X01TUl9IWVBFUkNBTEwsIGh5cGVyY2FsbE1zci5Bc1VJTlQ2NCk7CisJaHlwZXJjYWxsX21zci5ndWVzdF9waHlzaWNhbF9hZGRyZXNzID0gdm1hbGxvY190b19wZm4odmlydGFkZHIpOworCXdybXNybChIVl9YNjRfTVNSX0hZUEVSQ0FMTCwgaHlwZXJjYWxsX21zci5hc191aW50NjQpOwogCiAJLyogQ29uZmlybSB0aGF0IGh5cGVyY2FsbCBwYWdlIGRpZCBnZXQgc2V0dXAuICovCi0JaHlwZXJjYWxsTXNyLkFzVUlOVDY0ID0gMDsKLQlyZG1zcmwoSFZfWDY0X01TUl9IWVBFUkNBTEwsIGh5cGVyY2FsbE1zci5Bc1VJTlQ2NCk7CisJaHlwZXJjYWxsX21zci5hc191aW50NjQgPSAwOworCXJkbXNybChIVl9YNjRfTVNSX0hZUEVSQ0FMTCwgaHlwZXJjYWxsX21zci5hc191aW50NjQpOwogCi0JaWYgKCFoeXBlcmNhbGxNc3IuRW5hYmxlKSB7CisJaWYgKCFoeXBlcmNhbGxfbXNyLmVuYWJsZSkgewogCQlEUFJJTlRfRVJSKFZNQlVTLCAidW5hYmxlIHRvIHNldCBoeXBlcmNhbGwgcGFnZSEhIik7CiAJCWdvdG8gQ2xlYW51cDsKIAl9CiAKLQlnSHZDb250ZXh0Lkh5cGVyY2FsbFBhZ2UgPSB2aXJ0QWRkcjsKKwlodl9jb250ZXh0Lmh5cGVyY2FsbF9wYWdlID0gdmlydGFkZHI7CiAKIAlEUFJJTlRfSU5GTyhWTUJVUywgIkh5cGVyY2FsbCBwYWdlIFZBPSVwLCBQQT0weCUwbGx4IiwKLQkJICAgIGdIdkNvbnRleHQuSHlwZXJjYWxsUGFnZSwKLQkJICAgICh1NjQpaHlwZXJjYWxsTXNyLkd1ZXN0UGh5c2ljYWxBZGRyZXNzIDw8IFBBR0VfU0hJRlQpOworCQkgICAgaHZfY29udGV4dC5oeXBlcmNhbGxfcGFnZSwKKwkJICAgICh1NjQpaHlwZXJjYWxsX21zci5ndWVzdF9waHlzaWNhbF9hZGRyZXNzIDw8IFBBR0VfU0hJRlQpOwogCiAJLyogU2V0dXAgdGhlIGdsb2JhbCBzaWduYWwgZXZlbnQgcGFyYW0gZm9yIHRoZSBzaWduYWwgZXZlbnQgaHlwZXJjYWxsICovCi0JZ0h2Q29udGV4dC5TaWduYWxFdmVudEJ1ZmZlciA9CisJaHZfY29udGV4dC5zaWduYWxfZXZlbnRfYnVmZmVyID0KIAkJCWttYWxsb2Moc2l6ZW9mKHN0cnVjdCBodl9pbnB1dF9zaWduYWxfZXZlbnRfYnVmZmVyKSwKIAkJCQlHRlBfS0VSTkVMKTsKLQlpZiAoIWdIdkNvbnRleHQuU2lnbmFsRXZlbnRCdWZmZXIpCisJaWYgKCFodl9jb250ZXh0LnNpZ25hbF9ldmVudF9idWZmZXIpCiAJCWdvdG8gQ2xlYW51cDsKIAotCWdIdkNvbnRleHQuU2lnbmFsRXZlbnRQYXJhbSA9CisJaHZfY29udGV4dC5zaWduYWxfZXZlbnRfcGFyYW0gPQogCQkoc3RydWN0IGh2X2lucHV0X3NpZ25hbF9ldmVudCAqKQotCQkJKEFMSUdOX1VQKCh1bnNpZ25lZCBsb25nKWdIdkNvbnRleHQuU2lnbmFsRXZlbnRCdWZmZXIsCisJCQkoQUxJR05fVVAoKHVuc2lnbmVkIGxvbmcpCisJCQkJICBodl9jb250ZXh0LnNpZ25hbF9ldmVudF9idWZmZXIsCiAJCQkJICBIVl9IWVBFUkNBTExfUEFSQU1fQUxJR04pKTsKLQlnSHZDb250ZXh0LlNpZ25hbEV2ZW50UGFyYW0tPkNvbm5lY3Rpb25JZC5Bc3UzMiA9IDA7Ci0JZ0h2Q29udGV4dC5TaWduYWxFdmVudFBhcmFtLT5Db25uZWN0aW9uSWQudS5JZCA9CisJaHZfY29udGV4dC5zaWduYWxfZXZlbnRfcGFyYW0tPmNvbm5lY3Rpb25pZC5hc3UzMiA9IDA7CisJaHZfY29udGV4dC5zaWduYWxfZXZlbnRfcGFyYW0tPmNvbm5lY3Rpb25pZC51LmlkID0KIAkJCQkJCVZNQlVTX0VWRU5UX0NPTk5FQ1RJT05fSUQ7Ci0JZ0h2Q29udGV4dC5TaWduYWxFdmVudFBhcmFtLT5GbGFnTnVtYmVyID0gMDsKLQlnSHZDb250ZXh0LlNpZ25hbEV2ZW50UGFyYW0tPlJzdmRaID0gMDsKKwlodl9jb250ZXh0LnNpZ25hbF9ldmVudF9wYXJhbS0+ZmxhZ19udW1iZXIgPSAwOworCWh2X2NvbnRleHQuc2lnbmFsX2V2ZW50X3BhcmFtLT5yc3ZkeiA9IDA7CiAKIAlyZXR1cm4gcmV0OwogCiBDbGVhbnVwOgotCWlmICh2aXJ0QWRkcikgewotCQlpZiAoaHlwZXJjYWxsTXNyLkVuYWJsZSkgewotCQkJaHlwZXJjYWxsTXNyLkFzVUlOVDY0ID0gMDsKLQkJCXdybXNybChIVl9YNjRfTVNSX0hZUEVSQ0FMTCwgaHlwZXJjYWxsTXNyLkFzVUlOVDY0KTsKKwlpZiAodmlydGFkZHIpIHsKKwkJaWYgKGh5cGVyY2FsbF9tc3IuZW5hYmxlKSB7CisJCQloeXBlcmNhbGxfbXNyLmFzX3VpbnQ2NCA9IDA7CisJCQl3cm1zcmwoSFZfWDY0X01TUl9IWVBFUkNBTEwsIGh5cGVyY2FsbF9tc3IuYXNfdWludDY0KTsKIAkJfQogCi0JCXZmcmVlKHZpcnRBZGRyKTsKKwkJdmZyZWUodmlydGFkZHIpOwogCX0KIAlyZXQgPSAtMTsKIAlyZXR1cm4gcmV0OwogfQogCiAvKgotICogSHZDbGVhbnVwIC0gQ2xlYW51cCByb3V0aW5lLgorICogaHZfY2xlYW51cCAtIENsZWFudXAgcm91dGluZS4KICAqCiAgKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIG5vcm1hbGx5IGR1cmluZyBkcml2ZXIgdW5sb2FkaW5nIG9yIGV4aXRpbmcuCiAgKi8KLXZvaWQgSHZDbGVhbnVwKHZvaWQpCit2b2lkIGh2X2NsZWFudXAodm9pZCkKIHsKLQl1bmlvbiBodl94NjRfbXNyX2h5cGVyY2FsbF9jb250ZW50cyBoeXBlcmNhbGxNc3I7CisJdW5pb24gaHZfeDY0X21zcl9oeXBlcmNhbGxfY29udGVudHMgaHlwZXJjYWxsX21zcjsKIAotCWtmcmVlKGdIdkNvbnRleHQuU2lnbmFsRXZlbnRCdWZmZXIpOwotCWdIdkNvbnRleHQuU2lnbmFsRXZlbnRCdWZmZXIgPSBOVUxMOwotCWdIdkNvbnRleHQuU2lnbmFsRXZlbnRQYXJhbSA9IE5VTEw7CisJa2ZyZWUoaHZfY29udGV4dC5zaWduYWxfZXZlbnRfYnVmZmVyKTsKKwlodl9jb250ZXh0LnNpZ25hbF9ldmVudF9idWZmZXIgPSBOVUxMOworCWh2X2NvbnRleHQuc2lnbmFsX2V2ZW50X3BhcmFtID0gTlVMTDsKIAotCWlmIChnSHZDb250ZXh0Lkh5cGVyY2FsbFBhZ2UpIHsKLQkJaHlwZXJjYWxsTXNyLkFzVUlOVDY0ID0gMDsKLQkJd3Jtc3JsKEhWX1g2NF9NU1JfSFlQRVJDQUxMLCBoeXBlcmNhbGxNc3IuQXNVSU5UNjQpOwotCQl2ZnJlZShnSHZDb250ZXh0Lkh5cGVyY2FsbFBhZ2UpOwotCQlnSHZDb250ZXh0Lkh5cGVyY2FsbFBhZ2UgPSBOVUxMOworCWlmIChodl9jb250ZXh0Lmh5cGVyY2FsbF9wYWdlKSB7CisJCWh5cGVyY2FsbF9tc3IuYXNfdWludDY0ID0gMDsKKwkJd3Jtc3JsKEhWX1g2NF9NU1JfSFlQRVJDQUxMLCBoeXBlcmNhbGxfbXNyLmFzX3VpbnQ2NCk7CisJCXZmcmVlKGh2X2NvbnRleHQuaHlwZXJjYWxsX3BhZ2UpOworCQlodl9jb250ZXh0Lmh5cGVyY2FsbF9wYWdlID0gTlVMTDsKIAl9CiB9CiAKIC8qCi0gKiBIdlBvc3RNZXNzYWdlIC0gUG9zdCBhIG1lc3NhZ2UgdXNpbmcgdGhlIGh5cGVydmlzb3IgbWVzc2FnZSBJUEMuCisgKiBodl9wb3N0X21lc3NhZ2UgLSBQb3N0IGEgbWVzc2FnZSB1c2luZyB0aGUgaHlwZXJ2aXNvciBtZXNzYWdlIElQQy4KICAqCiAgKiBUaGlzIGludm9sdmVzIGEgaHlwZXJjYWxsLgogICovCi11MTYgSHZQb3N0TWVzc2FnZSh1bmlvbiBodl9jb25uZWN0aW9uX2lkIGNvbm5lY3Rpb25JZCwKLQkJICBlbnVtIGh2X21lc3NhZ2VfdHlwZSBtZXNzYWdlVHlwZSwKLQkJICB2b2lkICpwYXlsb2FkLCBzaXplX3QgcGF5bG9hZFNpemUpCit1MTYgaHZfcG9zdF9tZXNzYWdlKHVuaW9uIGh2X2Nvbm5lY3Rpb25faWQgY29ubmVjdGlvbl9pZCwKKwkJICBlbnVtIGh2X21lc3NhZ2VfdHlwZSBtZXNzYWdlX3R5cGUsCisJCSAgdm9pZCAqcGF5bG9hZCwgc2l6ZV90IHBheWxvYWRfc2l6ZSkKIHsKLQlzdHJ1Y3QgYWxpZ25lZElucHV0IHsKKwlzdHJ1Y3QgYWxpZ25lZF9pbnB1dCB7CiAJCXU2NCBhbGlnbm1lbnQ4OwogCQlzdHJ1Y3QgaHZfaW5wdXRfcG9zdF9tZXNzYWdlIG1zZzsKIAl9OwogCi0Jc3RydWN0IGh2X2lucHV0X3Bvc3RfbWVzc2FnZSAqYWxpZ25lZE1zZzsKKwlzdHJ1Y3QgaHZfaW5wdXRfcG9zdF9tZXNzYWdlICphbGlnbmVkX21zZzsKIAl1MTYgc3RhdHVzOwogCXVuc2lnbmVkIGxvbmcgYWRkcjsKIAotCWlmIChwYXlsb2FkU2l6ZSA+IEhWX01FU1NBR0VfUEFZTE9BRF9CWVRFX0NPVU5UKQorCWlmIChwYXlsb2FkX3NpemUgPiBIVl9NRVNTQUdFX1BBWUxPQURfQllURV9DT1VOVCkKIAkJcmV0dXJuIC0xOwogCi0JYWRkciA9ICh1bnNpZ25lZCBsb25nKWttYWxsb2Moc2l6ZW9mKHN0cnVjdCBhbGlnbmVkSW5wdXQpLCBHRlBfQVRPTUlDKTsKKwlhZGRyID0gKHVuc2lnbmVkIGxvbmcpa21hbGxvYyhzaXplb2Yoc3RydWN0IGFsaWduZWRfaW5wdXQpLCBHRlBfQVRPTUlDKTsKIAlpZiAoIWFkZHIpCiAJCXJldHVybiAtMTsKIAotCWFsaWduZWRNc2cgPSAoc3RydWN0IGh2X2lucHV0X3Bvc3RfbWVzc2FnZSAqKQorCWFsaWduZWRfbXNnID0gKHN0cnVjdCBodl9pbnB1dF9wb3N0X21lc3NhZ2UgKikKIAkJCShBTElHTl9VUChhZGRyLCBIVl9IWVBFUkNBTExfUEFSQU1fQUxJR04pKTsKIAotCWFsaWduZWRNc2ctPkNvbm5lY3Rpb25JZCA9IGNvbm5lY3Rpb25JZDsKLQlhbGlnbmVkTXNnLT5NZXNzYWdlVHlwZSA9IG1lc3NhZ2VUeXBlOwotCWFsaWduZWRNc2ctPlBheWxvYWRTaXplID0gcGF5bG9hZFNpemU7Ci0JbWVtY3B5KCh2b2lkICopYWxpZ25lZE1zZy0+UGF5bG9hZCwgcGF5bG9hZCwgcGF5bG9hZFNpemUpOworCWFsaWduZWRfbXNnLT5jb25uZWN0aW9uaWQgPSBjb25uZWN0aW9uX2lkOworCWFsaWduZWRfbXNnLT5tZXNzYWdlX3R5cGUgPSBtZXNzYWdlX3R5cGU7CisJYWxpZ25lZF9tc2ctPnBheWxvYWRfc2l6ZSA9IHBheWxvYWRfc2l6ZTsKKwltZW1jcHkoKHZvaWQgKilhbGlnbmVkX21zZy0+cGF5bG9hZCwgcGF5bG9hZCwgcGF5bG9hZF9zaXplKTsKIAotCXN0YXR1cyA9IEh2RG9IeXBlcmNhbGwoSHZDYWxsUG9zdE1lc3NhZ2UsIGFsaWduZWRNc2csIE5VTEwpICYgMHhGRkZGOworCXN0YXR1cyA9IGRvX2h5cGVyY2FsbChIVkNBTExfUE9TVF9NRVNTQUdFLCBhbGlnbmVkX21zZywgTlVMTCkKKwkJJiAweEZGRkY7CiAKIAlrZnJlZSgodm9pZCAqKWFkZHIpOwogCkBAIC0zNTEsMzggKzM1NSw0MCBAQAogCiAKIC8qCi0gKiBIdlNpZ25hbEV2ZW50IC0gU2lnbmFsIGFuIGV2ZW50IG9uIHRoZSBzcGVjaWZpZWQgY29ubmVjdGlvbiB1c2luZyB0aGUgaHlwZXJ2aXNvciBldmVudCBJUEMuCisgKiBodl9zaWduYWxfZXZlbnQgLQorICogU2lnbmFsIGFuIGV2ZW50IG9uIHRoZSBzcGVjaWZpZWQgY29ubmVjdGlvbiB1c2luZyB0aGUgaHlwZXJ2aXNvciBldmVudCBJUEMuCiAgKgogICogVGhpcyBpbnZvbHZlcyBhIGh5cGVyY2FsbC4KICAqLwotdTE2IEh2U2lnbmFsRXZlbnQodm9pZCkKK3UxNiBodl9zaWduYWxfZXZlbnQodm9pZCkKIHsKIAl1MTYgc3RhdHVzOwogCi0Jc3RhdHVzID0gSHZEb0h5cGVyY2FsbChIdkNhbGxTaWduYWxFdmVudCwgZ0h2Q29udGV4dC5TaWduYWxFdmVudFBhcmFtLAorCXN0YXR1cyA9IGRvX2h5cGVyY2FsbChIVkNBTExfU0lHTkFMX0VWRU5ULAorCQkJICAgICAgIGh2X2NvbnRleHQuc2lnbmFsX2V2ZW50X3BhcmFtLAogCQkJICAgICAgIE5VTEwpICYgMHhGRkZGOwogCXJldHVybiBzdGF0dXM7CiB9CiAKIC8qCi0gKiBIdlN5bmljSW5pdCAtIEluaXRpYWxpemUgdGhlIFN5bnRoZXRoaWMgSW50ZXJydXB0IENvbnRyb2xsZXIuCisgKiBodl9zeW5pY19pbml0IC0gSW5pdGlhbGl6ZSB0aGUgU3ludGhldGhpYyBJbnRlcnJ1cHQgQ29udHJvbGxlci4KICAqCiAgKiBJZiBpdCBpcyBhbHJlYWR5IGluaXRpYWxpemVkIGJ5IGFub3RoZXIgZW50aXR5IChpZSB4MnYgc2hpbSksIHdlIG5lZWQgdG8KICAqIHJldHJpZXZlIHRoZSBpbml0aWFsaXplZCBtZXNzYWdlIGFuZCBldmVudCBwYWdlcy4gIE90aGVyd2lzZSwgd2UgY3JlYXRlIGFuZAogICogaW5pdGlhbGl6ZSB0aGUgbWVzc2FnZSBhbmQgZXZlbnQgcGFnZXMuCiAgKi8KLXZvaWQgSHZTeW5pY0luaXQodm9pZCAqaXJxYXJnKQordm9pZCBodl9zeW5pY19pbml0KHZvaWQgKmlycWFyZykKIHsKIAl1NjQgdmVyc2lvbjsKIAl1bmlvbiBodl9zeW5pY19zaW1wIHNpbXA7CiAJdW5pb24gaHZfc3luaWNfc2llZnAgc2llZnA7Ci0JdW5pb24gaHZfc3luaWNfc2ludCBzaGFyZWRTaW50OworCXVuaW9uIGh2X3N5bmljX3NpbnQgc2hhcmVkX3NpbnQ7CiAJdW5pb24gaHZfc3luaWNfc2NvbnRyb2wgc2N0cmw7CiAKLQl1MzIgaXJxVmVjdG9yID0gKigodTMyICopKGlycWFyZykpOworCXUzMiBpcnFfdmVjdG9yID0gKigodTMyICopKGlycWFyZykpOwogCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CiAKLQlpZiAoIWdIdkNvbnRleHQuSHlwZXJjYWxsUGFnZSkKKwlpZiAoIWh2X2NvbnRleHQuaHlwZXJjYWxsX3BhZ2UpCiAJCXJldHVybjsKIAogCS8qIENoZWNrIHRoZSB2ZXJzaW9uICovCkBAIC0zOTAsMTEwICszOTYsMTEyIEBACiAKIAlEUFJJTlRfSU5GTyhWTUJVUywgIlN5bklDIHZlcnNpb246ICVsbHgiLCB2ZXJzaW9uKTsKIAotCWdIdkNvbnRleHQuc3luSUNNZXNzYWdlUGFnZVtjcHVdID0gKHZvaWQgKilnZXRfemVyb2VkX3BhZ2UoR0ZQX0FUT01JQyk7CisJaHZfY29udGV4dC5zeW5pY19tZXNzYWdlX3BhZ2VbY3B1XSA9CisJCSh2b2lkICopZ2V0X3plcm9lZF9wYWdlKEdGUF9BVE9NSUMpOwogCi0JaWYgKGdIdkNvbnRleHQuc3luSUNNZXNzYWdlUGFnZVtjcHVdID09IE5VTEwpIHsKKwlpZiAoaHZfY29udGV4dC5zeW5pY19tZXNzYWdlX3BhZ2VbY3B1XSA9PSBOVUxMKSB7CiAJCURQUklOVF9FUlIoVk1CVVMsCiAJCQkgICAidW5hYmxlIHRvIGFsbG9jYXRlIFNZTklDIG1lc3NhZ2UgcGFnZSEhIik7CiAJCWdvdG8gQ2xlYW51cDsKIAl9CiAKLQlnSHZDb250ZXh0LnN5bklDRXZlbnRQYWdlW2NwdV0gPSAodm9pZCAqKWdldF96ZXJvZWRfcGFnZShHRlBfQVRPTUlDKTsKKwlodl9jb250ZXh0LnN5bmljX2V2ZW50X3BhZ2VbY3B1XSA9CisJCSh2b2lkICopZ2V0X3plcm9lZF9wYWdlKEdGUF9BVE9NSUMpOwogCi0JaWYgKGdIdkNvbnRleHQuc3luSUNFdmVudFBhZ2VbY3B1XSA9PSBOVUxMKSB7CisJaWYgKGh2X2NvbnRleHQuc3luaWNfZXZlbnRfcGFnZVtjcHVdID09IE5VTEwpIHsKIAkJRFBSSU5UX0VSUihWTUJVUywKIAkJCSAgICJ1bmFibGUgdG8gYWxsb2NhdGUgU1lOSUMgZXZlbnQgcGFnZSEhIik7CiAJCWdvdG8gQ2xlYW51cDsKIAl9CiAKIAkvKiBTZXR1cCB0aGUgU3luaWMncyBtZXNzYWdlIHBhZ2UgKi8KLQlyZG1zcmwoSFZfWDY0X01TUl9TSU1QLCBzaW1wLkFzVUlOVDY0KTsKLQlzaW1wLlNpbXBFbmFibGVkID0gMTsKLQlzaW1wLkJhc2VTaW1wR3BhID0gdmlydF90b19waHlzKGdIdkNvbnRleHQuc3luSUNNZXNzYWdlUGFnZVtjcHVdKQorCXJkbXNybChIVl9YNjRfTVNSX1NJTVAsIHNpbXAuYXNfdWludDY0KTsKKwlzaW1wLnNpbXBfZW5hYmxlZCA9IDE7CisJc2ltcC5iYXNlX3NpbXBfZ3BhID0gdmlydF90b19waHlzKGh2X2NvbnRleHQuc3luaWNfbWVzc2FnZV9wYWdlW2NwdV0pCiAJCT4+IFBBR0VfU0hJRlQ7CiAKLQlEUFJJTlRfREJHKFZNQlVTLCAiSFZfWDY0X01TUl9TSU1QIG1zciBzZXQgdG86ICVsbHgiLCBzaW1wLkFzVUlOVDY0KTsKKwlEUFJJTlRfREJHKFZNQlVTLCAiSFZfWDY0X01TUl9TSU1QIG1zciBzZXQgdG86ICVsbHgiLCBzaW1wLmFzX3VpbnQ2NCk7CiAKLQl3cm1zcmwoSFZfWDY0X01TUl9TSU1QLCBzaW1wLkFzVUlOVDY0KTsKKwl3cm1zcmwoSFZfWDY0X01TUl9TSU1QLCBzaW1wLmFzX3VpbnQ2NCk7CiAKIAkvKiBTZXR1cCB0aGUgU3luaWMncyBldmVudCBwYWdlICovCi0JcmRtc3JsKEhWX1g2NF9NU1JfU0lFRlAsIHNpZWZwLkFzVUlOVDY0KTsKLQlzaWVmcC5TaWVmcEVuYWJsZWQgPSAxOwotCXNpZWZwLkJhc2VTaWVmcEdwYSA9IHZpcnRfdG9fcGh5cyhnSHZDb250ZXh0LnN5bklDRXZlbnRQYWdlW2NwdV0pCisJcmRtc3JsKEhWX1g2NF9NU1JfU0lFRlAsIHNpZWZwLmFzX3VpbnQ2NCk7CisJc2llZnAuc2llZnBfZW5hYmxlZCA9IDE7CisJc2llZnAuYmFzZV9zaWVmcF9ncGEgPSB2aXJ0X3RvX3BoeXMoaHZfY29udGV4dC5zeW5pY19ldmVudF9wYWdlW2NwdV0pCiAJCT4+IFBBR0VfU0hJRlQ7CiAKLQlEUFJJTlRfREJHKFZNQlVTLCAiSFZfWDY0X01TUl9TSUVGUCBtc3Igc2V0IHRvOiAlbGx4Iiwgc2llZnAuQXNVSU5UNjQpOworCURQUklOVF9EQkcoVk1CVVMsICJIVl9YNjRfTVNSX1NJRUZQIG1zciBzZXQgdG86ICVsbHgiLCBzaWVmcC5hc191aW50NjQpOwogCi0Jd3Jtc3JsKEhWX1g2NF9NU1JfU0lFRlAsIHNpZWZwLkFzVUlOVDY0KTsKKwl3cm1zcmwoSFZfWDY0X01TUl9TSUVGUCwgc2llZnAuYXNfdWludDY0KTsKIAogCS8qIFNldHVwIHRoZSBpbnRlcmNlcHRpb24gU0lOVC4gKi8KIAkvKiB3cm1zcmwoKEhWX1g2NF9NU1JfU0lOVDAgKyBIVl9TWU5JQ19JTlRFUkNFUFRJT05fU0lOVF9JTkRFWCksICovCi0JLyoJICBpbnRlcmNlcHRpb25TaW50LkFzVUlOVDY0KTsgKi8KKwkvKgkgIGludGVyY2VwdGlvblNpbnQuYXNfdWludDY0KTsgKi8KIAogCS8qIFNldHVwIHRoZSBzaGFyZWQgU0lOVC4gKi8KLQlyZG1zcmwoSFZfWDY0X01TUl9TSU5UMCArIFZNQlVTX01FU1NBR0VfU0lOVCwgc2hhcmVkU2ludC5Bc1VJTlQ2NCk7CisJcmRtc3JsKEhWX1g2NF9NU1JfU0lOVDAgKyBWTUJVU19NRVNTQUdFX1NJTlQsIHNoYXJlZF9zaW50LmFzX3VpbnQ2NCk7CiAKLQlzaGFyZWRTaW50LkFzVUlOVDY0ID0gMDsKLQlzaGFyZWRTaW50LlZlY3RvciA9IGlycVZlY3RvcjsgLyogSFZfU0hBUkVEX1NJTlRfSURUX1ZFQ1RPUiArIDB4MjA7ICovCi0Jc2hhcmVkU2ludC5NYXNrZWQgPSBmYWxzZTsKLQlzaGFyZWRTaW50LkF1dG9Fb2kgPSB0cnVlOworCXNoYXJlZF9zaW50LmFzX3VpbnQ2NCA9IDA7CisJc2hhcmVkX3NpbnQudmVjdG9yID0gaXJxX3ZlY3RvcjsgLyogSFZfU0hBUkVEX1NJTlRfSURUX1ZFQ1RPUiArIDB4MjA7ICovCisJc2hhcmVkX3NpbnQubWFza2VkID0gZmFsc2U7CisJc2hhcmVkX3NpbnQuYXV0b19lb2kgPSB0cnVlOwogCiAJRFBSSU5UX0RCRyhWTUJVUywgIkhWX1g2NF9NU1JfU0lOVDEgbXNyIHNldCB0bzogJWxseCIsCi0JCSAgIHNoYXJlZFNpbnQuQXNVSU5UNjQpOworCQkgICBzaGFyZWRfc2ludC5hc191aW50NjQpOwogCi0Jd3Jtc3JsKEhWX1g2NF9NU1JfU0lOVDAgKyBWTUJVU19NRVNTQUdFX1NJTlQsIHNoYXJlZFNpbnQuQXNVSU5UNjQpOworCXdybXNybChIVl9YNjRfTVNSX1NJTlQwICsgVk1CVVNfTUVTU0FHRV9TSU5ULCBzaGFyZWRfc2ludC5hc191aW50NjQpOwogCiAJLyogRW5hYmxlIHRoZSBnbG9iYWwgc3luaWMgYml0ICovCi0JcmRtc3JsKEhWX1g2NF9NU1JfU0NPTlRST0wsIHNjdHJsLkFzVUlOVDY0KTsKLQlzY3RybC5FbmFibGUgPSAxOworCXJkbXNybChIVl9YNjRfTVNSX1NDT05UUk9MLCBzY3RybC5hc191aW50NjQpOworCXNjdHJsLmVuYWJsZSA9IDE7CiAKLQl3cm1zcmwoSFZfWDY0X01TUl9TQ09OVFJPTCwgc2N0cmwuQXNVSU5UNjQpOworCXdybXNybChIVl9YNjRfTVNSX1NDT05UUk9MLCBzY3RybC5hc191aW50NjQpOwogCi0JZ0h2Q29udGV4dC5TeW5JQ0luaXRpYWxpemVkID0gdHJ1ZTsKKwlodl9jb250ZXh0LnN5bmljX2luaXRpYWxpemVkID0gdHJ1ZTsKIAlyZXR1cm47CiAKIENsZWFudXA6Ci0JaWYgKGdIdkNvbnRleHQuc3luSUNFdmVudFBhZ2VbY3B1XSkKLQkJb3NkX1BhZ2VGcmVlKGdIdkNvbnRleHQuc3luSUNFdmVudFBhZ2VbY3B1XSwgMSk7CisJaWYgKGh2X2NvbnRleHQuc3luaWNfZXZlbnRfcGFnZVtjcHVdKQorCQlvc2RfcGFnZV9mcmVlKGh2X2NvbnRleHQuc3luaWNfZXZlbnRfcGFnZVtjcHVdLCAxKTsKIAotCWlmIChnSHZDb250ZXh0LnN5bklDTWVzc2FnZVBhZ2VbY3B1XSkKLQkJb3NkX1BhZ2VGcmVlKGdIdkNvbnRleHQuc3luSUNNZXNzYWdlUGFnZVtjcHVdLCAxKTsKKwlpZiAoaHZfY29udGV4dC5zeW5pY19tZXNzYWdlX3BhZ2VbY3B1XSkKKwkJb3NkX3BhZ2VfZnJlZShodl9jb250ZXh0LnN5bmljX21lc3NhZ2VfcGFnZVtjcHVdLCAxKTsKIAlyZXR1cm47CiB9CiAKIC8qCi0gKiBIdlN5bmljQ2xlYW51cCAtIENsZWFudXAgcm91dGluZSBmb3IgSHZTeW5pY0luaXQoKS4KKyAqIGh2X3N5bmljX2NsZWFudXAgLSBDbGVhbnVwIHJvdXRpbmUgZm9yIGh2X3N5bmljX2luaXQoKS4KICAqLwotdm9pZCBIdlN5bmljQ2xlYW51cCh2b2lkICphcmcpCit2b2lkIGh2X3N5bmljX2NsZWFudXAodm9pZCAqYXJnKQogewotCXVuaW9uIGh2X3N5bmljX3NpbnQgc2hhcmVkU2ludDsKKwl1bmlvbiBodl9zeW5pY19zaW50IHNoYXJlZF9zaW50OwogCXVuaW9uIGh2X3N5bmljX3NpbXAgc2ltcDsKIAl1bmlvbiBodl9zeW5pY19zaWVmcCBzaWVmcDsKIAlpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwogCi0JaWYgKCFnSHZDb250ZXh0LlN5bklDSW5pdGlhbGl6ZWQpCisJaWYgKCFodl9jb250ZXh0LnN5bmljX2luaXRpYWxpemVkKQogCQlyZXR1cm47CiAKLQlyZG1zcmwoSFZfWDY0X01TUl9TSU5UMCArIFZNQlVTX01FU1NBR0VfU0lOVCwgc2hhcmVkU2ludC5Bc1VJTlQ2NCk7CisJcmRtc3JsKEhWX1g2NF9NU1JfU0lOVDAgKyBWTUJVU19NRVNTQUdFX1NJTlQsIHNoYXJlZF9zaW50LmFzX3VpbnQ2NCk7CiAKLQlzaGFyZWRTaW50Lk1hc2tlZCA9IDE7CisJc2hhcmVkX3NpbnQubWFza2VkID0gMTsKIAogCS8qIE5lZWQgdG8gY29ycmVjdGx5IGNsZWFudXAgaW4gdGhlIGNhc2Ugb2YgU01QISEhICovCiAJLyogRGlzYWJsZSB0aGUgaW50ZXJydXB0ICovCi0Jd3Jtc3JsKEhWX1g2NF9NU1JfU0lOVDAgKyBWTUJVU19NRVNTQUdFX1NJTlQsIHNoYXJlZFNpbnQuQXNVSU5UNjQpOworCXdybXNybChIVl9YNjRfTVNSX1NJTlQwICsgVk1CVVNfTUVTU0FHRV9TSU5ULCBzaGFyZWRfc2ludC5hc191aW50NjQpOwogCi0JcmRtc3JsKEhWX1g2NF9NU1JfU0lNUCwgc2ltcC5Bc1VJTlQ2NCk7Ci0Jc2ltcC5TaW1wRW5hYmxlZCA9IDA7Ci0Jc2ltcC5CYXNlU2ltcEdwYSA9IDA7CisJcmRtc3JsKEhWX1g2NF9NU1JfU0lNUCwgc2ltcC5hc191aW50NjQpOworCXNpbXAuc2ltcF9lbmFibGVkID0gMDsKKwlzaW1wLmJhc2Vfc2ltcF9ncGEgPSAwOwogCi0Jd3Jtc3JsKEhWX1g2NF9NU1JfU0lNUCwgc2ltcC5Bc1VJTlQ2NCk7CisJd3Jtc3JsKEhWX1g2NF9NU1JfU0lNUCwgc2ltcC5hc191aW50NjQpOwogCi0JcmRtc3JsKEhWX1g2NF9NU1JfU0lFRlAsIHNpZWZwLkFzVUlOVDY0KTsKLQlzaWVmcC5TaWVmcEVuYWJsZWQgPSAwOwotCXNpZWZwLkJhc2VTaWVmcEdwYSA9IDA7CisJcmRtc3JsKEhWX1g2NF9NU1JfU0lFRlAsIHNpZWZwLmFzX3VpbnQ2NCk7CisJc2llZnAuc2llZnBfZW5hYmxlZCA9IDA7CisJc2llZnAuYmFzZV9zaWVmcF9ncGEgPSAwOwogCi0Jd3Jtc3JsKEhWX1g2NF9NU1JfU0lFRlAsIHNpZWZwLkFzVUlOVDY0KTsKKwl3cm1zcmwoSFZfWDY0X01TUl9TSUVGUCwgc2llZnAuYXNfdWludDY0KTsKIAotCW9zZF9QYWdlRnJlZShnSHZDb250ZXh0LnN5bklDTWVzc2FnZVBhZ2VbY3B1XSwgMSk7Ci0Jb3NkX1BhZ2VGcmVlKGdIdkNvbnRleHQuc3luSUNFdmVudFBhZ2VbY3B1XSwgMSk7CisJb3NkX3BhZ2VfZnJlZShodl9jb250ZXh0LnN5bmljX21lc3NhZ2VfcGFnZVtjcHVdLCAxKTsKKwlvc2RfcGFnZV9mcmVlKGh2X2NvbnRleHQuc3luaWNfZXZlbnRfcGFnZVtjcHVdLCAxKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9odi9odi5oIGIvZHJpdmVycy9zdGFnaW5nL2h2L2h2LmgKaW5kZXggNDFmNWViYi4uODI5YWZmOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2h2L2h2LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2h2L2h2LmgKQEAgLTkyLDQ5ICs5Miw0OSBAQAogCiAKIHN0cnVjdCBodl9pbnB1dF9zaWduYWxfZXZlbnRfYnVmZmVyIHsKLQl1NjQgQWxpZ244OwotCXN0cnVjdCBodl9pbnB1dF9zaWduYWxfZXZlbnQgRXZlbnQ7CisJdTY0IGFsaWduODsKKwlzdHJ1Y3QgaHZfaW5wdXRfc2lnbmFsX2V2ZW50IGV2ZW50OwogfTsKIAogc3RydWN0IGh2X2NvbnRleHQgewogCS8qIFdlIG9ubHkgc3VwcG9ydCBydW5uaW5nIG9uIHRvcCBvZiBIeXBlci1WCiAJKiBTbyBhdCB0aGlzIHBvaW50IHRoaXMgcmVhbGx5IGNhbiBvbmx5IGNvbnRhaW4gdGhlIEh5cGVyLVYgSUQKIAkqLwotCXU2NCBHdWVzdElkOworCXU2NCBndWVzdGlkOwogCi0Jdm9pZCAqSHlwZXJjYWxsUGFnZTsKKwl2b2lkICpoeXBlcmNhbGxfcGFnZTsKIAotCWJvb2wgU3luSUNJbml0aWFsaXplZDsKKwlib29sIHN5bmljX2luaXRpYWxpemVkOwogCiAJLyoKIAkgKiBUaGlzIGlzIHVzZWQgYXMgYW4gaW5wdXQgcGFyYW0gdG8gSHZDYWxsU2lnbmFsRXZlbnQgaHlwZXJjYWxsLiBUaGUKIAkgKiBpbnB1dCBwYXJhbSBpcyBpbW11dGFibGUgaW4gb3VyIHVzYWdlIGFuZCBtdXN0IGJlIGR5bmFtaWMgbWVtICh2cwogCSAqIHN0YWNrIG9yIGdsb2JhbCkuICovCi0Jc3RydWN0IGh2X2lucHV0X3NpZ25hbF9ldmVudF9idWZmZXIgKlNpZ25hbEV2ZW50QnVmZmVyOworCXN0cnVjdCBodl9pbnB1dF9zaWduYWxfZXZlbnRfYnVmZmVyICpzaWduYWxfZXZlbnRfYnVmZmVyOwogCS8qIDgtYnl0ZXMgYWxpZ25lZCBvZiB0aGUgYnVmZmVyIGFib3ZlICovCi0Jc3RydWN0IGh2X2lucHV0X3NpZ25hbF9ldmVudCAqU2lnbmFsRXZlbnRQYXJhbTsKKwlzdHJ1Y3QgaHZfaW5wdXRfc2lnbmFsX2V2ZW50ICpzaWduYWxfZXZlbnRfcGFyYW07CiAKLQl2b2lkICpzeW5JQ01lc3NhZ2VQYWdlW01BWF9OVU1fQ1BVU107Ci0Jdm9pZCAqc3luSUNFdmVudFBhZ2VbTUFYX05VTV9DUFVTXTsKKwl2b2lkICpzeW5pY19tZXNzYWdlX3BhZ2VbTUFYX05VTV9DUFVTXTsKKwl2b2lkICpzeW5pY19ldmVudF9wYWdlW01BWF9OVU1fQ1BVU107CiB9OwogCi1leHRlcm4gc3RydWN0IGh2X2NvbnRleHQgZ0h2Q29udGV4dDsKK2V4dGVybiBzdHJ1Y3QgaHZfY29udGV4dCBodl9jb250ZXh0OwogCiAKIC8qIEh2IEludGVyZmFjZSAqLwogCi1leHRlcm4gaW50IEh2SW5pdCh2b2lkKTsKK2V4dGVybiBpbnQgaHZfaW5pdCh2b2lkKTsKIAotZXh0ZXJuIHZvaWQgSHZDbGVhbnVwKHZvaWQpOworZXh0ZXJuIHZvaWQgaHZfY2xlYW51cCh2b2lkKTsKIAotZXh0ZXJuIHUxNiBIdlBvc3RNZXNzYWdlKHVuaW9uIGh2X2Nvbm5lY3Rpb25faWQgY29ubmVjdGlvbklkLAotCQkJIGVudW0gaHZfbWVzc2FnZV90eXBlIG1lc3NhZ2VUeXBlLAotCQkJIHZvaWQgKnBheWxvYWQsIHNpemVfdCBwYXlsb2FkU2l6ZSk7CitleHRlcm4gdTE2IGh2X3Bvc3RfbWVzc2FnZSh1bmlvbiBodl9jb25uZWN0aW9uX2lkIGNvbm5lY3Rpb25faWQsCisJCQkgZW51bSBodl9tZXNzYWdlX3R5cGUgbWVzc2FnZV90eXBlLAorCQkJIHZvaWQgKnBheWxvYWQsIHNpemVfdCBwYXlsb2FkX3NpemUpOwogCi1leHRlcm4gdTE2IEh2U2lnbmFsRXZlbnQodm9pZCk7CitleHRlcm4gdTE2IGh2X3NpZ25hbF9ldmVudCh2b2lkKTsKIAotZXh0ZXJuIHZvaWQgSHZTeW5pY0luaXQodm9pZCAqaXJxYXJnKTsKK2V4dGVybiB2b2lkIGh2X3N5bmljX2luaXQodm9pZCAqaXJxYXJnKTsKIAotZXh0ZXJuIHZvaWQgSHZTeW5pY0NsZWFudXAodm9pZCAqYXJnKTsKK2V4dGVybiB2b2lkIGh2X3N5bmljX2NsZWFudXAodm9pZCAqYXJnKTsKIAogI2VuZGlmIC8qIF9fSFZfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaHYvaHZfYXBpLmggYi9kcml2ZXJzL3N0YWdpbmcvaHYvaHZfYXBpLmgKaW5kZXggOWViODE4ZS4uNzBlODYzYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2h2L2h2X2FwaS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9odi9odl9hcGkuaApAQCAtNTEwLDIxICs1MTAsMjEgQEAKIAogLyoKICAqIFRoZSBiZWxvdyBDUFVJRCBsZWF2ZXMgYXJlIHByZXNlbnQgaWYgVmVyc2lvbkFuZEZlYXR1cmVzLkh5cGVydmlzb3JQcmVzZW50Ci0gKiBpcyBzZXQgYnkgQ1BVSUQoSHZDcHVJZEZ1bmN0aW9uVmVyc2lvbkFuZEZlYXR1cmVzKS4KKyAqIGlzIHNldCBieSBDUFVJRChIVkNQVUlEX1ZFUlNJT05fRkVBVFVSRVMpLgogICovCiBlbnVtIGh2X2NwdWlkX2Z1bmN0aW9uIHsKLQlIdkNwdUlkRnVuY3Rpb25WZXJzaW9uQW5kRmVhdHVyZXMJCT0gMHgwMDAwMDAwMSwKLQlIdkNwdUlkRnVuY3Rpb25IdlZlbmRvckFuZE1heEZ1bmN0aW9uCQk9IDB4NDAwMDAwMDAsCi0JSHZDcHVJZEZ1bmN0aW9uSHZJbnRlcmZhY2UJCQk9IDB4NDAwMDAwMDEsCisJSFZDUFVJRF9WRVJTSU9OX0ZFQVRVUkVTCQk9IDB4MDAwMDAwMDEsCisJSFZDUFVJRF9WRU5ET1JfTUFYRlVOQ1RJT04JCT0gMHg0MDAwMDAwMCwKKwlIVkNQVUlEX0lOVEVSRkFDRQkJCT0gMHg0MDAwMDAwMSwKIAogCS8qCiAJICogVGhlIHJlbWFpbmluZyBmdW5jdGlvbnMgZGVwZW5kIG9uIHRoZSB2YWx1ZSBvZgotCSAqIEh2Q3B1SWRGdW5jdGlvbkludGVyZmFjZQorCSAqIEhWQ1BVSURfSU5URVJGQUNFCiAJICovCi0JSHZDcHVJZEZ1bmN0aW9uTXNIdlZlcnNpb24JCQk9IDB4NDAwMDAwMDIsCi0JSHZDcHVJZEZ1bmN0aW9uTXNIdkZlYXR1cmVzCQkJPSAweDQwMDAwMDAzLAotCUh2Q3B1SWRGdW5jdGlvbk1zSHZFbmxpZ2h0ZW5tZW50SW5mb3JtYXRpb24JPSAweDQwMDAwMDA0LAotCUh2Q3B1SWRGdW5jdGlvbk1zSHZJbXBsZW1lbnRhdGlvbkxpbWl0cwkJPSAweDQwMDAwMDA1LAorCUhWQ1BVSURfVkVSU0lPTgkJCT0gMHg0MDAwMDAwMiwKKwlIVkNQVUlEX0ZFQVRVUkVTCQkJPSAweDQwMDAwMDAzLAorCUhWQ1BVSURfRU5MSUdIVEVOTUVOVF9JTkZPCT0gMHg0MDAwMDAwNCwKKwlIVkNQVUlEX0lNUExFTUVOVEFUSU9OX0xJTUlUUwkJPSAweDQwMDAwMDA1LAogfTsKIAogLyogRGVmaW5lIHRoZSB2aXJ0dWFsIEFQSUMgcmVnaXN0ZXJzICovCkBAIC01NzUsMzAgKzU3NSwzMCBAQAogCiAvKiBEZWZpbmUgaHlwZXJ2aXNvciBtZXNzYWdlIHR5cGVzLiAqLwogZW51bSBodl9tZXNzYWdlX3R5cGUgewotCUh2TWVzc2FnZVR5cGVOb25lCQkJPSAweDAwMDAwMDAwLAorCUhWTVNHX05PTkUJCQk9IDB4MDAwMDAwMDAsCiAKIAkvKiBNZW1vcnkgYWNjZXNzIG1lc3NhZ2VzLiAqLwotCUh2TWVzc2FnZVR5cGVVbm1hcHBlZEdwYQkJPSAweDgwMDAwMDAwLAotCUh2TWVzc2FnZVR5cGVHcGFJbnRlcmNlcHQJCT0gMHg4MDAwMDAwMSwKKwlIVk1TR19VTk1BUFBFRF9HUEEJCT0gMHg4MDAwMDAwMCwKKwlIVk1TR19HUEFfSU5URVJDRVBUCQk9IDB4ODAwMDAwMDEsCiAKIAkvKiBUaW1lciBub3RpZmljYXRpb24gbWVzc2FnZXMuICovCi0JSHZNZXNzYWdlVGltZXJFeHBpcmVkCQkJPSAweDgwMDAwMDEwLAorCUhWTVNHX1RJTUVSX0VYUElSRUQJCQk9IDB4ODAwMDAwMTAsCiAKIAkvKiBFcnJvciBtZXNzYWdlcy4gKi8KLQlIdk1lc3NhZ2VUeXBlSW52YWxpZFZwUmVnaXN0ZXJWYWx1ZQk9IDB4ODAwMDAwMjAsCi0JSHZNZXNzYWdlVHlwZVVucmVjb3ZlcmFibGVFeGNlcHRpb24JPSAweDgwMDAwMDIxLAotCUh2TWVzc2FnZVR5cGVVbnN1cHBvcnRlZEZlYXR1cmUJCT0gMHg4MDAwMDAyMiwKKwlIVk1TR19JTlZBTElEX1ZQX1JFR0lTVEVSX1ZBTFVFCT0gMHg4MDAwMDAyMCwKKwlIVk1TR19VTlJFQ09WRVJBQkxFX0VYQ0VQVElPTgk9IDB4ODAwMDAwMjEsCisJSFZNU0dfVU5TVVBQT1JURURfRkVBVFVSRQkJPSAweDgwMDAwMDIyLAogCiAJLyogVHJhY2UgYnVmZmVyIGNvbXBsZXRlIG1lc3NhZ2VzLiAqLwotCUh2TWVzc2FnZVR5cGVFdmVudExvZ0J1ZmZlckNvbXBsZXRlCT0gMHg4MDAwMDA0MCwKKwlIVk1TR19FVkVOVExPR19CVUZGRVJDT01QTEVURQk9IDB4ODAwMDAwNDAsCiAKIAkvKiBQbGF0Zm9ybS1zcGVjaWZpYyBwcm9jZXNzb3IgaW50ZXJjZXB0IG1lc3NhZ2VzLiAqLwotCUh2TWVzc2FnZVR5cGVYNjRJb1BvcnRJbnRlcmNlcHQJCT0gMHg4MDAxMDAwMCwKLQlIdk1lc3NhZ2VUeXBlWDY0TXNySW50ZXJjZXB0CQk9IDB4ODAwMTAwMDEsCi0JSHZNZXNzYWdlVHlwZVg2NENwdWlkSW50ZXJjZXB0CQk9IDB4ODAwMTAwMDIsCi0JSHZNZXNzYWdlVHlwZVg2NEV4Y2VwdGlvbkludGVyY2VwdAk9IDB4ODAwMTAwMDMsCi0JSHZNZXNzYWdlVHlwZVg2NEFwaWNFb2kJCQk9IDB4ODAwMTAwMDQsCi0JSHZNZXNzYWdlVHlwZVg2NExlZ2FjeUZwRXJyb3IJCT0gMHg4MDAxMDAwNQorCUhWTVNHX1g2NF9JT1BPUlRfSU5URVJDRVBUCQk9IDB4ODAwMTAwMDAsCisJSFZNU0dfWDY0X01TUl9JTlRFUkNFUFQJCT0gMHg4MDAxMDAwMSwKKwlIVk1TR19YNjRfQ1BVSURfSU5URVJDRVBUCQk9IDB4ODAwMTAwMDIsCisJSFZNU0dfWDY0X0VYQ0VQVElPTl9JTlRFUkNFUFQJPSAweDgwMDEwMDAzLAorCUhWTVNHX1g2NF9BUElDX0VPSQkJCT0gMHg4MDAxMDAwNCwKKwlIVk1TR19YNjRfTEVHQUNZX0ZQX0VSUk9SCQk9IDB4ODAwMTAwMDUKIH07CiAKIC8qIERlZmluZSB0aGUgbnVtYmVyIG9mIHN5bnRoZXRpYyBpbnRlcnJ1cHQgc291cmNlcy4gKi8KQEAgLTYxMCwxMDMgKzYxMCwxMDMgQEAKIAogLyogRGVmaW5lIGNvbm5lY3Rpb24gaWRlbnRpZmllciB0eXBlLiAqLwogdW5pb24gaHZfY29ubmVjdGlvbl9pZCB7Ci0JdTMyIEFzdTMyOworCXUzMiBhc3UzMjsKIAlzdHJ1Y3QgewotCQl1MzIgSWQ6MjQ7Ci0JCXUzMiBSZXNlcnZlZDo4OworCQl1MzIgaWQ6MjQ7CisJCXUzMiByZXNlcnZlZDo4OwogCX0gdTsKIH07CiAKIC8qIERlZmluZSBwb3J0IGlkZW50aWZpZXIgdHlwZS4gKi8KIHVuaW9uIGh2X3BvcnRfaWQgewotCXUzMiBBc3UzMjsKKwl1MzIgYXN1MzI7CiAJc3RydWN0IHsKLQkJdTMyIElkOjI0OwotCQl1MzIgUmVzZXJ2ZWQ6ODsKKwkJdTMyIGlkOjI0OworCQl1MzIgcmVzZXJ2ZWQ6ODsKIAl9IHUgOwogfTsKIAogLyogRGVmaW5lIHBvcnQgdHlwZS4gKi8KIGVudW0gaHZfcG9ydF90eXBlIHsKLQlIdlBvcnRUeXBlTWVzc2FnZQk9IDEsCi0JSHZQb3J0VHlwZUV2ZW50CQk9IDIsCi0JSHZQb3J0VHlwZU1vbml0b3IJPSAzCisJSFZQT1JUX01TRwk9IDEsCisJSFZQT1JUX0VWRU5UCQk9IDIsCisJSFZQT1JUX01PTklUT1IJPSAzCiB9OwogCiAvKiBEZWZpbmUgcG9ydCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUuICovCiBzdHJ1Y3QgaHZfcG9ydF9pbmZvIHsKLQllbnVtIGh2X3BvcnRfdHlwZSBQb3J0VHlwZTsKLQl1MzIgUGFkZGluZzsKKwllbnVtIGh2X3BvcnRfdHlwZSBwb3J0X3R5cGU7CisJdTMyIHBhZGRpbmc7CiAJdW5pb24gewogCQlzdHJ1Y3QgewotCQkJdTMyIFRhcmdldFNpbnQ7Ci0JCQl1MzIgVGFyZ2V0VnA7Ci0JCQl1NjQgUnN2ZFo7Ci0JCX0gTWVzc2FnZVBvcnRJbmZvOworCQkJdTMyIHRhcmdldF9zaW50OworCQkJdTMyIHRhcmdldF92cDsKKwkJCXU2NCByc3ZkejsKKwkJfSBtZXNzYWdlX3BvcnRfaW5mbzsKIAkJc3RydWN0IHsKLQkJCXUzMiBUYXJnZXRTaW50OwotCQkJdTMyIFRhcmdldFZwOwotCQkJdTE2IEJhc2VGbGFnTnVtYmVyOwotCQkJdTE2IEZsYWdDb3VudDsKLQkJCXUzMiBSc3ZkWjsKLQkJfSBFdmVudFBvcnRJbmZvOworCQkJdTMyIHRhcmdldF9zaW50OworCQkJdTMyIHRhcmdldF92cDsKKwkJCXUxNiBiYXNlX2ZsYWdfYnVtYmVyOworCQkJdTE2IGZsYWdfY291bnQ7CisJCQl1MzIgcnN2ZHo7CisJCX0gZXZlbnRfcG9ydF9pbmZvOwogCQlzdHJ1Y3QgewotCQkJdTY0IE1vbml0b3JBZGRyZXNzOwotCQkJdTY0IFJzdmRaOwotCQl9IE1vbml0b3JQb3J0SW5mbzsKKwkJCXU2NCBtb25pdG9yX2FkZHJlc3M7CisJCQl1NjQgcnN2ZHo7CisJCX0gbW9uaXRvcl9wb3J0X2luZm87CiAJfTsKIH07CiAKIHN0cnVjdCBodl9jb25uZWN0aW9uX2luZm8gewotCWVudW0gaHZfcG9ydF90eXBlIFBvcnRUeXBlOwotCXUzMiBQYWRkaW5nOworCWVudW0gaHZfcG9ydF90eXBlIHBvcnRfdHlwZTsKKwl1MzIgcGFkZGluZzsKIAl1bmlvbiB7CiAJCXN0cnVjdCB7Ci0JCQl1NjQgUnN2ZFo7Ci0JCX0gTWVzc2FnZUNvbm5lY3Rpb25JbmZvOworCQkJdTY0IHJzdmR6OworCQl9IG1lc3NhZ2VfY29ubmVjdGlvbl9pbmZvOwogCQlzdHJ1Y3QgewotCQkJdTY0IFJzdmRaOwotCQl9IEV2ZW50Q29ubmVjdGlvbkluZm87CisJCQl1NjQgcnN2ZHo7CisJCX0gZXZlbnRfY29ubmVjdGlvbl9pbmZvOwogCQlzdHJ1Y3QgewotCQkJdTY0IE1vbml0b3JBZGRyZXNzOwotCQl9IE1vbml0b3JDb25uZWN0aW9uSW5mbzsKKwkJCXU2NCBtb25pdG9yX2FkZHJlc3M7CisJCX0gbW9uaXRvcl9jb25uZWN0aW9uX2luZm87CiAJfTsKIH07CiAKIC8qIERlZmluZSBzeW50aGV0aWMgaW50ZXJydXB0IGNvbnRyb2xsZXIgbWVzc2FnZSBmbGFncy4gKi8KIHVuaW9uIGh2X21lc3NhZ2VfZmxhZ3MgewotCXU4IEFzdTg7CisJdTggYXN1ODsKIAlzdHJ1Y3QgewotCQl1OCBNZXNzYWdlUGVuZGluZzoxOwotCQl1OCBSZXNlcnZlZDo3OworCQl1OCBtc2dfcGVuZGluZzoxOworCQl1OCByZXNlcnZlZDo3OwogCX07CiB9OwogCiAvKiBEZWZpbmUgc3ludGhldGljIGludGVycnVwdCBjb250cm9sbGVyIG1lc3NhZ2UgaGVhZGVyLiAqLwogc3RydWN0IGh2X21lc3NhZ2VfaGVhZGVyIHsKLQllbnVtIGh2X21lc3NhZ2VfdHlwZSBNZXNzYWdlVHlwZTsKLQl1OCBQYXlsb2FkU2l6ZTsKLQl1bmlvbiBodl9tZXNzYWdlX2ZsYWdzIE1lc3NhZ2VGbGFnczsKLQl1OCBSZXNlcnZlZFsyXTsKKwllbnVtIGh2X21lc3NhZ2VfdHlwZSBtZXNzYWdlX3R5cGU7CisJdTggcGF5bG9hZF9zaXplOworCXVuaW9uIGh2X21lc3NhZ2VfZmxhZ3MgbWVzc2FnZV9mbGFnczsKKwl1OCByZXNlcnZlZFsyXTsKIAl1bmlvbiB7Ci0JCXU2NCBTZW5kZXI7Ci0JCXVuaW9uIGh2X3BvcnRfaWQgUG9ydDsKKwkJdTY0IHNlbmRlcjsKKwkJdW5pb24gaHZfcG9ydF9pZCBwb3J0OwogCX07CiB9OwogCiAvKiBEZWZpbmUgdGltZXIgbWVzc2FnZSBwYXlsb2FkIHN0cnVjdHVyZS4gKi8KIHN0cnVjdCBodl90aW1lcl9tZXNzYWdlX3BheWxvYWQgewotCXUzMiBUaW1lckluZGV4OwotCXUzMiBSZXNlcnZlZDsKLQl1NjQgRXhwaXJhdGlvblRpbWU7CS8qIFdoZW4gdGhlIHRpbWVyIGV4cGlyZWQgKi8KLQl1NjQgRGVsaXZlcnlUaW1lOwkvKiBXaGVuIHRoZSBtZXNzYWdlIHdhcyBkZWxpdmVyZWQgKi8KKwl1MzIgdGltZXJfaW5kZXg7CisJdTMyIHJlc2VydmVkOworCXU2NCBleHBpcmF0aW9uX3RpbWU7CS8qIFdoZW4gdGhlIHRpbWVyIGV4cGlyZWQgKi8KKwl1NjQgZGVsaXZlcnlfdGltZTsJLyogV2hlbiB0aGUgbWVzc2FnZSB3YXMgZGVsaXZlcmVkICovCiB9OwogCiAvKiBEZWZpbmUgc3ludGhldGljIGludGVycnVwdCBjb250cm9sbGVyIG1lc3NhZ2UgZm9ybWF0LiAqLwogc3RydWN0IGh2X21lc3NhZ2UgewotCXN0cnVjdCBodl9tZXNzYWdlX2hlYWRlciBIZWFkZXI7CisJc3RydWN0IGh2X21lc3NhZ2VfaGVhZGVyIGhlYWRlcjsKIAl1bmlvbiB7Ci0JCXU2NCBQYXlsb2FkW0hWX01FU1NBR0VfUEFZTE9BRF9RV09SRF9DT1VOVF07CisJCXU2NCBwYXlsb2FkW0hWX01FU1NBR0VfUEFZTE9BRF9RV09SRF9DT1VOVF07CiAJfSB1IDsKIH07CiAKQEAgLTcxNSw4MiArNzE1LDgyIEBACiAKIC8qIERlZmluZSB0aGUgc3ludGhldGljIGludGVycnVwdCBtZXNzYWdlIHBhZ2UgbGF5b3V0LiAqLwogc3RydWN0IGh2X21lc3NhZ2VfcGFnZSB7Ci0Jc3RydWN0IGh2X21lc3NhZ2UgU2ludE1lc3NhZ2VbSFZfU1lOSUNfU0lOVF9DT1VOVF07CisJc3RydWN0IGh2X21lc3NhZ2Ugc2ludF9tZXNzYWdlW0hWX1NZTklDX1NJTlRfQ09VTlRdOwogfTsKIAogLyogRGVmaW5lIHRoZSBzeW50aGV0aWMgaW50ZXJydXB0IGNvbnRyb2xsZXIgZXZlbnQgZmxhZ3MgZm9ybWF0LiAqLwogdW5pb24gaHZfc3luaWNfZXZlbnRfZmxhZ3MgewotCXU4IEZsYWdzOFtIVl9FVkVOVF9GTEFHU19CWVRFX0NPVU5UXTsKLQl1MzIgRmxhZ3MzMltIVl9FVkVOVF9GTEFHU19EV09SRF9DT1VOVF07CisJdTggZmxhZ3M4W0hWX0VWRU5UX0ZMQUdTX0JZVEVfQ09VTlRdOworCXUzMiBmbGFnczMyW0hWX0VWRU5UX0ZMQUdTX0RXT1JEX0NPVU5UXTsKIH07CiAKIC8qIERlZmluZSB0aGUgc3ludGhldGljIGludGVycnVwdCBmbGFncyBwYWdlIGxheW91dC4gKi8KIHN0cnVjdCBodl9zeW5pY19ldmVudF9mbGFnc19wYWdlIHsKLQl1bmlvbiBodl9zeW5pY19ldmVudF9mbGFncyBTaW50RXZlbnRGbGFnc1tIVl9TWU5JQ19TSU5UX0NPVU5UXTsKKwl1bmlvbiBodl9zeW5pY19ldmVudF9mbGFncyBzaW50ZXZlbnRfZmxhZ3NbSFZfU1lOSUNfU0lOVF9DT1VOVF07CiB9OwogCiAvKiBEZWZpbmUgU3luSUMgY29udHJvbCByZWdpc3Rlci4gKi8KIHVuaW9uIGh2X3N5bmljX3Njb250cm9sIHsKLQl1NjQgQXNVSU5UNjQ7CisJdTY0IGFzX3VpbnQ2NDsKIAlzdHJ1Y3QgewotCQl1NjQgRW5hYmxlOjE7Ci0JCXU2NCBSZXNlcnZlZDo2MzsKKwkJdTY0IGVuYWJsZToxOworCQl1NjQgcmVzZXJ2ZWQ6NjM7CiAJfTsKIH07CiAKIC8qIERlZmluZSBzeW50aGV0aWMgaW50ZXJydXB0IHNvdXJjZS4gKi8KIHVuaW9uIGh2X3N5bmljX3NpbnQgewotCXU2NCBBc1VJTlQ2NDsKKwl1NjQgYXNfdWludDY0OwogCXN0cnVjdCB7Ci0JCXU2NCBWZWN0b3I6ODsKLQkJdTY0IFJlc2VydmVkMTo4OwotCQl1NjQgTWFza2VkOjE7Ci0JCXU2NCBBdXRvRW9pOjE7Ci0JCXU2NCBSZXNlcnZlZDI6NDY7CisJCXU2NCB2ZWN0b3I6ODsKKwkJdTY0IHJlc2VydmVkMTo4OworCQl1NjQgbWFza2VkOjE7CisJCXU2NCBhdXRvX2VvaToxOworCQl1NjQgcmVzZXJ2ZWQyOjQ2OwogCX07CiB9OwogCiAvKiBEZWZpbmUgdGhlIGZvcm1hdCBvZiB0aGUgU0lNUCByZWdpc3RlciAqLwogdW5pb24gaHZfc3luaWNfc2ltcCB7Ci0JdTY0IEFzVUlOVDY0OworCXU2NCBhc191aW50NjQ7CiAJc3RydWN0IHsKLQkJdTY0IFNpbXBFbmFibGVkOjE7Ci0JCXU2NCBQcmVzZXJ2ZWQ6MTE7Ci0JCXU2NCBCYXNlU2ltcEdwYTo1MjsKKwkJdTY0IHNpbXBfZW5hYmxlZDoxOworCQl1NjQgcHJlc2VydmVkOjExOworCQl1NjQgYmFzZV9zaW1wX2dwYTo1MjsKIAl9OwogfTsKIAogLyogRGVmaW5lIHRoZSBmb3JtYXQgb2YgdGhlIFNJRUZQIHJlZ2lzdGVyICovCiB1bmlvbiBodl9zeW5pY19zaWVmcCB7Ci0JdTY0IEFzVUlOVDY0OworCXU2NCBhc191aW50NjQ7CiAJc3RydWN0IHsKLQkJdTY0IFNpZWZwRW5hYmxlZDoxOwotCQl1NjQgUHJlc2VydmVkOjExOwotCQl1NjQgQmFzZVNpZWZwR3BhOjUyOworCQl1NjQgc2llZnBfZW5hYmxlZDoxOworCQl1NjQgcHJlc2VydmVkOjExOworCQl1NjQgYmFzZV9zaWVmcF9ncGE6NTI7CiAJfTsKIH07CiAKIC8qIERlZmluaXRpb25zIGZvciB0aGUgbW9uaXRvcmVkIG5vdGlmaWNhdGlvbiBmYWNpbGl0eSAqLwogdW5pb24gaHZfbW9uaXRvcl90cmlnZ2VyX2dyb3VwIHsKLQl1NjQgQXNVSU5UNjQ7CisJdTY0IGFzX3VpbnQ2NDsKIAlzdHJ1Y3QgewotCQl1MzIgUGVuZGluZzsKLQkJdTMyIEFybWVkOworCQl1MzIgcGVuZGluZzsKKwkJdTMyIGFybWVkOwogCX07CiB9OwogCiBzdHJ1Y3QgaHZfbW9uaXRvcl9wYXJhbWV0ZXIgewotCXVuaW9uIGh2X2Nvbm5lY3Rpb25faWQgQ29ubmVjdGlvbklkOwotCXUxNiBGbGFnTnVtYmVyOwotCXUxNiBSc3ZkWjsKKwl1bmlvbiBodl9jb25uZWN0aW9uX2lkIGNvbm5lY3Rpb25pZDsKKwl1MTYgZmxhZ251bWJlcjsKKwl1MTYgcnN2ZHo7CiB9OwogCiB1bmlvbiBodl9tb25pdG9yX3RyaWdnZXJfc3RhdGUgewotCXUzMiBBc3UzMjsKKwl1MzIgYXN1MzI7CiAKIAlzdHJ1Y3QgewotCQl1MzIgR3JvdXBFbmFibGU6NDsKLQkJdTMyIFJzdmRaOjI4OworCQl1MzIgZ3JvdXBfZW5hYmxlOjQ7CisJCXUzMiByc3ZkejoyODsKIAl9OwogfTsKIApAQCAtODE0LDQyICs4MTQsNDIgQEAKIC8qIHwgODQwIHwgUnN2ZDRbMF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAqLwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiBzdHJ1Y3QgaHZfbW9uaXRvcl9wYWdlIHsKLQl1bmlvbiBodl9tb25pdG9yX3RyaWdnZXJfc3RhdGUgVHJpZ2dlclN0YXRlOwotCXUzMiBSc3ZkWjE7CisJdW5pb24gaHZfbW9uaXRvcl90cmlnZ2VyX3N0YXRlIHRyaWdnZXJfc3RhdGU7CisJdTMyIHJzdmR6MTsKIAotCXVuaW9uIGh2X21vbml0b3JfdHJpZ2dlcl9ncm91cCBUcmlnZ2VyR3JvdXBbNF07Ci0JdTY0IFJzdmRaMlszXTsKKwl1bmlvbiBodl9tb25pdG9yX3RyaWdnZXJfZ3JvdXAgdHJpZ2dlcl9ncm91cFs0XTsKKwl1NjQgcnN2ZHoyWzNdOwogCi0JczMyIE5leHRDaGVja1RpbWVbNF1bMzJdOworCXMzMiBuZXh0X2NoZWNrdGltZVs0XVszMl07CiAKLQl1MTYgTGF0ZW5jeVs0XVszMl07Ci0JdTY0IFJzdmRaM1szMl07CisJdTE2IGxhdGVuY3lbNF1bMzJdOworCXU2NCByc3ZkejNbMzJdOwogCi0Jc3RydWN0IGh2X21vbml0b3JfcGFyYW1ldGVyIFBhcmFtZXRlcls0XVszMl07CisJc3RydWN0IGh2X21vbml0b3JfcGFyYW1ldGVyIHBhcmFtZXRlcls0XVszMl07CiAKLQl1OCBSc3ZkWjRbMTk4NF07CisJdTggcnN2ZHo0WzE5ODRdOwogfTsKIAogLyogRGVjbGFyZSB0aGUgdmFyaW91cyBoeXBlcmNhbGwgb3BlcmF0aW9ucy4gKi8KIGVudW0gaHZfY2FsbF9jb2RlIHsKLQlIdkNhbGxQb3N0TWVzc2FnZQk9IDB4MDA1YywKLQlIdkNhbGxTaWduYWxFdmVudAk9IDB4MDA1ZCwKKwlIVkNBTExfUE9TVF9NRVNTQUdFCT0gMHgwMDVjLAorCUhWQ0FMTF9TSUdOQUxfRVZFTlQJPSAweDAwNWQsCiB9OwogCi0vKiBEZWZpbml0aW9uIG9mIHRoZSBIdlBvc3RNZXNzYWdlIGh5cGVyY2FsbCBpbnB1dCBzdHJ1Y3R1cmUuICovCisvKiBEZWZpbml0aW9uIG9mIHRoZSBodl9wb3N0X21lc3NhZ2UgaHlwZXJjYWxsIGlucHV0IHN0cnVjdHVyZS4gKi8KIHN0cnVjdCBodl9pbnB1dF9wb3N0X21lc3NhZ2UgewotCXVuaW9uIGh2X2Nvbm5lY3Rpb25faWQgQ29ubmVjdGlvbklkOwotCXUzMiBSZXNlcnZlZDsKLQllbnVtIGh2X21lc3NhZ2VfdHlwZSBNZXNzYWdlVHlwZTsKLQl1MzIgUGF5bG9hZFNpemU7Ci0JdTY0IFBheWxvYWRbSFZfTUVTU0FHRV9QQVlMT0FEX1FXT1JEX0NPVU5UXTsKKwl1bmlvbiBodl9jb25uZWN0aW9uX2lkIGNvbm5lY3Rpb25pZDsKKwl1MzIgcmVzZXJ2ZWQ7CisJZW51bSBodl9tZXNzYWdlX3R5cGUgbWVzc2FnZV90eXBlOworCXUzMiBwYXlsb2FkX3NpemU7CisJdTY0IHBheWxvYWRbSFZfTUVTU0FHRV9QQVlMT0FEX1FXT1JEX0NPVU5UXTsKIH07CiAKLS8qIERlZmluaXRpb24gb2YgdGhlIEh2U2lnbmFsRXZlbnQgaHlwZXJjYWxsIGlucHV0IHN0cnVjdHVyZS4gKi8KKy8qIERlZmluaXRpb24gb2YgdGhlIGh2X3NpZ25hbF9ldmVudCBoeXBlcmNhbGwgaW5wdXQgc3RydWN0dXJlLiAqLwogc3RydWN0IGh2X2lucHV0X3NpZ25hbF9ldmVudCB7Ci0JdW5pb24gaHZfY29ubmVjdGlvbl9pZCBDb25uZWN0aW9uSWQ7Ci0JdTE2IEZsYWdOdW1iZXI7Ci0JdTE2IFJzdmRaOworCXVuaW9uIGh2X2Nvbm5lY3Rpb25faWQgY29ubmVjdGlvbmlkOworCXUxNiBmbGFnX251bWJlcjsKKwl1MTYgcnN2ZHo7CiB9OwogCiAvKgpAQCAtODU5LDE2ICs4NTksMTYgQEAKIAogLyogVmVyc2lvbiBpbmZvIHJlcG9ydGVkIGJ5IGd1ZXN0IE9TJ3MgKi8KIGVudW0gaHZfZ3Vlc3Rfb3NfdmVuZG9yIHsKLQlIdkd1ZXN0T3NWZW5kb3JNaWNyb3NvZnQJPSAweDAwMDEKKwlIVkdVRVNUT1NfVkVORE9SX01JQ1JPU09GVAk9IDB4MDAwMQogfTsKIAogZW51bSBodl9ndWVzdF9vc19taWNyb3NvZnRfaWRzIHsKLQlIdkd1ZXN0T3NNaWNyb3NvZnRVbmRlZmluZWQJPSAweDAwLAotCUh2R3Vlc3RPc01pY3Jvc29mdE1TRE9TCQk9IDB4MDEsCi0JSHZHdWVzdE9zTWljcm9zb2Z0V2luZG93czN4CT0gMHgwMiwKLQlIdkd1ZXN0T3NNaWNyb3NvZnRXaW5kb3dzOXgJPSAweDAzLAotCUh2R3Vlc3RPc01pY3Jvc29mdFdpbmRvd3NOVAk9IDB4MDQsCi0JSHZHdWVzdE9zTWljcm9zb2Z0V2luZG93c0NFCT0gMHgwNQorCUhWR1VFU1RPU19NSUNST1NPRlRfVU5ERUZJTkVECT0gMHgwMCwKKwlIVkdVRVNUT1NfTUlDUk9TT0ZUX01TRE9TCQk9IDB4MDEsCisJSFZHVUVTVE9TX01JQ1JPU09GVF9XSU5ET1dTM1gJPSAweDAyLAorCUhWR1VFU1RPU19NSUNST1NPRlRfV0lORE9XUzlYCT0gMHgwMywKKwlIVkdVRVNUT1NfTUlDUk9TT0ZUX1dJTkRPV1NOVAk9IDB4MDQsCisJSFZHVUVTVE9TX01JQ1JPU09GVF9XSU5ET1dTQ0UJPSAweDA1CiB9OwogCiAvKgpAQCAtODc3LDE0ICs4NzcsMTQgQEAKICNkZWZpbmUgSFZfWDY0X01TUl9HVUVTVF9PU19JRAkweDQwMDAwMDAwCiAKIHVuaW9uIGh2X3g2NF9tc3JfZ3Vlc3Rfb3NfaWRfY29udGVudHMgewotCXU2NCBBc1VJTlQ2NDsKKwl1NjQgYXNfdWludDY0OwogCXN0cnVjdCB7Ci0JCXU2NCBCdWlsZE51bWJlcjoxNjsKLQkJdTY0IFNlcnZpY2VWZXJzaW9uOjg7IC8qIFNlcnZpY2UgUGFjaywgZXRjLiAqLwotCQl1NjQgTWlub3JWZXJzaW9uOjg7Ci0JCXU2NCBNYWpvclZlcnNpb246ODsKLQkJdTY0IE9zSWQ6ODsgLyogZW51bSBodl9ndWVzdF9vc19taWNyb3NvZnRfaWRzIChpZiBWZW5kb3I9TVMpICovCi0JCXU2NCBWZW5kb3JJZDoxNjsgLyogZW51bSBodl9ndWVzdF9vc192ZW5kb3IgKi8KKwkJdTY0IGJ1aWxkX251bWJlcjoxNjsKKwkJdTY0IHNlcnZpY2VfdmVyc2lvbjo4OyAvKiBTZXJ2aWNlIFBhY2ssIGV0Yy4gKi8KKwkJdTY0IG1pbm9yX3ZlcnNpb246ODsKKwkJdTY0IG1ham9yX3ZlcnNpb246ODsKKwkJdTY0IG9zX2lkOjg7IC8qIGVudW0gaHZfZ3Vlc3Rfb3NfbWljcm9zb2Z0X2lkcyAoaWYgVmVuZG9yPU1TKSAqLworCQl1NjQgdmVuZG9yX2lkOjE2OyAvKiBlbnVtIGh2X2d1ZXN0X29zX3ZlbmRvciAqLwogCX07CiB9OwogCkBAIC04OTQsMTEgKzg5NCwxMSBAQAogI2RlZmluZSBIVl9YNjRfTVNSX0hZUEVSQ0FMTAkweDQwMDAwMDAxCiAKIHVuaW9uIGh2X3g2NF9tc3JfaHlwZXJjYWxsX2NvbnRlbnRzIHsKLQl1NjQgQXNVSU5UNjQ7CisJdTY0IGFzX3VpbnQ2NDsKIAlzdHJ1Y3QgewotCQl1NjQgRW5hYmxlOjE7Ci0JCXU2NCBSZXNlcnZlZDoxMTsKLQkJdTY0IEd1ZXN0UGh5c2ljYWxBZGRyZXNzOjUyOworCQl1NjQgZW5hYmxlOjE7CisJCXU2NCByZXNlcnZlZDoxMTsKKwkJdTY0IGd1ZXN0X3BoeXNpY2FsX2FkZHJlc3M6NTI7CiAJfTsKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9odi9odl91dGlscy5jIGIvZHJpdmVycy9zdGFnaW5nL2h2L2h2X3V0aWxzLmMKaW5kZXggYTk5ZTkwMC4uMDA3NDU4MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2h2L2h2X3V0aWxzLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2h2L2h2X3V0aWxzLmMKQEAgLTM4LDEyICszOCwxNCBAQAogI2luY2x1ZGUgInZtYnVzX2FwaS5oIgogI2luY2x1ZGUgInV0aWxzLmgiCiAKK3N0YXRpYyB1OCAqc2h1dF90eGZfYnVmOworc3RhdGljIHU4ICp0aW1lX3R4Zl9idWY7CitzdGF0aWMgdTggKmhiZWF0X3R4Zl9idWY7CiAKIHN0YXRpYyB2b2lkIHNodXRkb3duX29uY2hhbm5lbGNhbGxiYWNrKHZvaWQgKmNvbnRleHQpCiB7CiAJc3RydWN0IHZtYnVzX2NoYW5uZWwgKmNoYW5uZWwgPSBjb250ZXh0OwotCXU4ICpidWY7Ci0JdTMyIGJ1ZmxlbiwgcmVjdmxlbjsKKwl1MzIgcmVjdmxlbjsKIAl1NjQgcmVxdWVzdGlkOwogCXU4ICBleGVjdXRlX3NodXRkb3duID0gZmFsc2U7CiAKQEAgLTUyLDI0ICs1NCwyMyBAQAogCXN0cnVjdCBpY21zZ19oZHIgKmljbXNnaGRycDsKIAlzdHJ1Y3QgaWNtc2dfbmVnb3RpYXRlICpuZWdvcCA9IE5VTEw7CiAKLQlidWZsZW4gPSBQQUdFX1NJWkU7Ci0JYnVmID0ga21hbGxvYyhidWZsZW4sIEdGUF9BVE9NSUMpOwotCi0Jdm1idXNfcmVjdnBhY2tldChjaGFubmVsLCBidWYsIGJ1ZmxlbiwgJnJlY3ZsZW4sICZyZXF1ZXN0aWQpOworCXZtYnVzX3JlY3ZwYWNrZXQoY2hhbm5lbCwgc2h1dF90eGZfYnVmLAorCQkJIFBBR0VfU0laRSwgJnJlY3ZsZW4sICZyZXF1ZXN0aWQpOwogCiAJaWYgKHJlY3ZsZW4gPiAwKSB7CiAJCURQUklOVF9EQkcoVk1CVVMsICJzaHV0ZG93biBwYWNrZXQ6IGxlbj0lZCwgcmVxdWVzdGlkPSVsbGQiLAogCQkJICAgcmVjdmxlbiwgcmVxdWVzdGlkKTsKIAotCQlpY21zZ2hkcnAgPSAoc3RydWN0IGljbXNnX2hkciAqKSZidWZbCisJCWljbXNnaGRycCA9IChzdHJ1Y3QgaWNtc2dfaGRyICopJnNodXRfdHhmX2J1ZlsKIAkJCXNpemVvZihzdHJ1Y3Qgdm1idXNwaXBlX2hkcildOwogCiAJCWlmIChpY21zZ2hkcnAtPmljbXNndHlwZSA9PSBJQ01TR1RZUEVfTkVHT1RJQVRFKSB7Ci0JCQlwcmVwX25lZ290aWF0ZV9yZXNwKGljbXNnaGRycCwgbmVnb3AsIGJ1Zik7CisJCQlwcmVwX25lZ290aWF0ZV9yZXNwKGljbXNnaGRycCwgbmVnb3AsIHNodXRfdHhmX2J1Zik7CiAJCX0gZWxzZSB7Ci0JCQlzaHV0ZG93bl9tc2cgPSAoc3RydWN0IHNodXRkb3duX21zZ19kYXRhICopJmJ1ZlsKLQkJCQlzaXplb2Yoc3RydWN0IHZtYnVzcGlwZV9oZHIpICsKLQkJCQlzaXplb2Yoc3RydWN0IGljbXNnX2hkcildOworCQkJc2h1dGRvd25fbXNnID0KKwkJCQkoc3RydWN0IHNodXRkb3duX21zZ19kYXRhICopJnNodXRfdHhmX2J1ZlsKKwkJCQkJc2l6ZW9mKHN0cnVjdCB2bWJ1c3BpcGVfaGRyKSArCisJCQkJCXNpemVvZihzdHJ1Y3QgaWNtc2dfaGRyKV07CiAKIAkJCXN3aXRjaCAoc2h1dGRvd25fbXNnLT5mbGFncykgewogCQkJY2FzZSAwOgpAQCAtOTMsMTMgKzk0LDExIEBACiAJCWljbXNnaGRycC0+aWNmbGFncyA9IElDTVNHSERSRkxBR19UUkFOU0FDVElPTgogCQkJfCBJQ01TR0hEUkZMQUdfUkVTUE9OU0U7CiAKLQkJdm1idXNfc2VuZHBhY2tldChjaGFubmVsLCBidWYsCisJCXZtYnVzX3NlbmRwYWNrZXQoY2hhbm5lbCwgc2h1dF90eGZfYnVmLAogCQkJCSAgICAgICByZWN2bGVuLCByZXF1ZXN0aWQsCiAJCQkJICAgICAgIFZtYnVzUGFja2V0VHlwZURhdGFJbkJhbmQsIDApOwogCX0KIAotCWtmcmVlKGJ1Zik7Ci0KIAlpZiAoZXhlY3V0ZV9zaHV0ZG93biA9PSB0cnVlKQogCQlvcmRlcmx5X3Bvd2Vyb2ZmKGZhbHNlKTsKIH0KQEAgLTE1MCwyOCArMTQ5LDI1IEBACiBzdGF0aWMgdm9pZCB0aW1lc3luY19vbmNoYW5uZWxjYWxsYmFjayh2b2lkICpjb250ZXh0KQogewogCXN0cnVjdCB2bWJ1c19jaGFubmVsICpjaGFubmVsID0gY29udGV4dDsKLQl1OCAqYnVmOwotCXUzMiBidWZsZW4sIHJlY3ZsZW47CisJdTMyIHJlY3ZsZW47CiAJdTY0IHJlcXVlc3RpZDsKIAlzdHJ1Y3QgaWNtc2dfaGRyICppY21zZ2hkcnA7CiAJc3RydWN0IGljdGltZXN5bmNfZGF0YSAqdGltZWRhdGFwOwogCi0JYnVmbGVuID0gUEFHRV9TSVpFOwotCWJ1ZiA9IGttYWxsb2MoYnVmbGVuLCBHRlBfQVRPTUlDKTsKLQotCXZtYnVzX3JlY3ZwYWNrZXQoY2hhbm5lbCwgYnVmLCBidWZsZW4sICZyZWN2bGVuLCAmcmVxdWVzdGlkKTsKKwl2bWJ1c19yZWN2cGFja2V0KGNoYW5uZWwsIHRpbWVfdHhmX2J1ZiwKKwkJCSBQQUdFX1NJWkUsICZyZWN2bGVuLCAmcmVxdWVzdGlkKTsKIAogCWlmIChyZWN2bGVuID4gMCkgewogCQlEUFJJTlRfREJHKFZNQlVTLCAidGltZXN5bmMgcGFja2V0OiByZWN2bGVuPSVkLCByZXF1ZXN0aWQ9JWxsZCIsCiAJCQlyZWN2bGVuLCByZXF1ZXN0aWQpOwogCi0JCWljbXNnaGRycCA9IChzdHJ1Y3QgaWNtc2dfaGRyICopJmJ1ZlsKKwkJaWNtc2doZHJwID0gKHN0cnVjdCBpY21zZ19oZHIgKikmdGltZV90eGZfYnVmWwogCQkJCXNpemVvZihzdHJ1Y3Qgdm1idXNwaXBlX2hkcildOwogCiAJCWlmIChpY21zZ2hkcnAtPmljbXNndHlwZSA9PSBJQ01TR1RZUEVfTkVHT1RJQVRFKSB7Ci0JCQlwcmVwX25lZ290aWF0ZV9yZXNwKGljbXNnaGRycCwgTlVMTCwgYnVmKTsKKwkJCXByZXBfbmVnb3RpYXRlX3Jlc3AoaWNtc2doZHJwLCBOVUxMLCB0aW1lX3R4Zl9idWYpOwogCQl9IGVsc2UgewotCQkJdGltZWRhdGFwID0gKHN0cnVjdCBpY3RpbWVzeW5jX2RhdGEgKikmYnVmWworCQkJdGltZWRhdGFwID0gKHN0cnVjdCBpY3RpbWVzeW5jX2RhdGEgKikmdGltZV90eGZfYnVmWwogCQkJCXNpemVvZihzdHJ1Y3Qgdm1idXNwaXBlX2hkcikgKwogCQkJCXNpemVvZihzdHJ1Y3QgaWNtc2dfaGRyKV07CiAJCQlhZGpfZ3Vlc3R0aW1lKHRpbWVkYXRhcC0+cGFyZW50dGltZSwgdGltZWRhdGFwLT5mbGFncyk7CkBAIC0xODAsMTIgKzE3NiwxMCBAQAogCQlpY21zZ2hkcnAtPmljZmxhZ3MgPSBJQ01TR0hEUkZMQUdfVFJBTlNBQ1RJT04KIAkJCXwgSUNNU0dIRFJGTEFHX1JFU1BPTlNFOwogCi0JCXZtYnVzX3NlbmRwYWNrZXQoY2hhbm5lbCwgYnVmLAorCQl2bWJ1c19zZW5kcGFja2V0KGNoYW5uZWwsIHRpbWVfdHhmX2J1ZiwKIAkJCQlyZWN2bGVuLCByZXF1ZXN0aWQsCiAJCQkJVm1idXNQYWNrZXRUeXBlRGF0YUluQmFuZCwgMCk7CiAJfQotCi0Ja2ZyZWUoYnVmKTsKIH0KIAogLyoKQEAgLTE5NiwzMCArMTkwLDI4IEBACiBzdGF0aWMgdm9pZCBoZWFydGJlYXRfb25jaGFubmVsY2FsbGJhY2sodm9pZCAqY29udGV4dCkKIHsKIAlzdHJ1Y3Qgdm1idXNfY2hhbm5lbCAqY2hhbm5lbCA9IGNvbnRleHQ7Ci0JdTggKmJ1ZjsKLQl1MzIgYnVmbGVuLCByZWN2bGVuOworCXUzMiByZWN2bGVuOwogCXU2NCByZXF1ZXN0aWQ7CiAJc3RydWN0IGljbXNnX2hkciAqaWNtc2doZHJwOwogCXN0cnVjdCBoZWFydGJlYXRfbXNnX2RhdGEgKmhlYXJ0YmVhdF9tc2c7CiAKLQlidWZsZW4gPSBQQUdFX1NJWkU7Ci0JYnVmID0ga21hbGxvYyhidWZsZW4sIEdGUF9BVE9NSUMpOwotCi0Jdm1idXNfcmVjdnBhY2tldChjaGFubmVsLCBidWYsIGJ1ZmxlbiwgJnJlY3ZsZW4sICZyZXF1ZXN0aWQpOworCXZtYnVzX3JlY3ZwYWNrZXQoY2hhbm5lbCwgaGJlYXRfdHhmX2J1ZiwKKwkJCSBQQUdFX1NJWkUsICZyZWN2bGVuLCAmcmVxdWVzdGlkKTsKIAogCWlmIChyZWN2bGVuID4gMCkgewogCQlEUFJJTlRfREJHKFZNQlVTLCAiaGVhcnRiZWF0IHBhY2tldDogbGVuPSVkLCByZXF1ZXN0aWQ9JWxsZCIsCiAJCQkgICByZWN2bGVuLCByZXF1ZXN0aWQpOwogCi0JCWljbXNnaGRycCA9IChzdHJ1Y3QgaWNtc2dfaGRyICopJmJ1ZlsKKwkJaWNtc2doZHJwID0gKHN0cnVjdCBpY21zZ19oZHIgKikmaGJlYXRfdHhmX2J1ZlsKIAkJCQlzaXplb2Yoc3RydWN0IHZtYnVzcGlwZV9oZHIpXTsKIAogCQlpZiAoaWNtc2doZHJwLT5pY21zZ3R5cGUgPT0gSUNNU0dUWVBFX05FR09USUFURSkgewotCQkJcHJlcF9uZWdvdGlhdGVfcmVzcChpY21zZ2hkcnAsIE5VTEwsIGJ1Zik7CisJCQlwcmVwX25lZ290aWF0ZV9yZXNwKGljbXNnaGRycCwgTlVMTCwgaGJlYXRfdHhmX2J1Zik7CiAJCX0gZWxzZSB7Ci0JCQloZWFydGJlYXRfbXNnID0gKHN0cnVjdCBoZWFydGJlYXRfbXNnX2RhdGEgKikmYnVmWwotCQkJCXNpemVvZihzdHJ1Y3Qgdm1idXNwaXBlX2hkcikgKwotCQkJCXNpemVvZihzdHJ1Y3QgaWNtc2dfaGRyKV07CisJCQloZWFydGJlYXRfbXNnID0KKwkJCQkoc3RydWN0IGhlYXJ0YmVhdF9tc2dfZGF0YSAqKSZoYmVhdF90eGZfYnVmWworCQkJCQlzaXplb2Yoc3RydWN0IHZtYnVzcGlwZV9oZHIpICsKKwkJCQkJc2l6ZW9mKHN0cnVjdCBpY21zZ19oZHIpXTsKIAogCQkJRFBSSU5UX0RCRyhWTUJVUywgImhlYXJ0YmVhdCBzZXEgPSAlbGxkIiwKIAkJCQkgICBoZWFydGJlYXRfbXNnLT5zZXFfbnVtKTsKQEAgLTIzMCwxMiArMjIyLDEwIEBACiAJCWljbXNnaGRycC0+aWNmbGFncyA9IElDTVNHSERSRkxBR19UUkFOU0FDVElPTgogCQkJfCBJQ01TR0hEUkZMQUdfUkVTUE9OU0U7CiAKLQkJdm1idXNfc2VuZHBhY2tldChjaGFubmVsLCBidWYsCisJCXZtYnVzX3NlbmRwYWNrZXQoY2hhbm5lbCwgaGJlYXRfdHhmX2J1ZiwKIAkJCQkgICAgICAgcmVjdmxlbiwgcmVxdWVzdGlkLAogCQkJCSAgICAgICBWbWJ1c1BhY2tldFR5cGVEYXRhSW5CYW5kLCAwKTsKIAl9Ci0KLQlrZnJlZShidWYpOwogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgX19pbml0Y29uc3QKQEAgLTI2OCwxNSArMjU4LDI4IEBACiAJaWYgKCFkbWlfY2hlY2tfc3lzdGVtKGh2X3V0aWxzX2RtaV90YWJsZSkpCiAJCXJldHVybiAtRU5PREVWOwogCi0JaHZfY2JfdXRpbHNbSFZfU0hVVERPV05fTVNHXS5jaGFubmVsLT5PbkNoYW5uZWxDYWxsYmFjayA9CisJc2h1dF90eGZfYnVmID0ga21hbGxvYyhQQUdFX1NJWkUsIEdGUF9LRVJORUwpOworCXRpbWVfdHhmX2J1ZiA9IGttYWxsb2MoUEFHRV9TSVpFLCBHRlBfS0VSTkVMKTsKKwloYmVhdF90eGZfYnVmID0ga21hbGxvYyhQQUdFX1NJWkUsIEdGUF9LRVJORUwpOworCisJaWYgKCFzaHV0X3R4Zl9idWYgfHwgIXRpbWVfdHhmX2J1ZiB8fCAhaGJlYXRfdHhmX2J1ZikgeworCQlwcmludGsoS0VSTl9JTkZPCisJCSAgICAgICAiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgcmVjZWl2ZSBidWZmZXJcbiIpOworCQlrZnJlZShzaHV0X3R4Zl9idWYpOworCQlrZnJlZSh0aW1lX3R4Zl9idWYpOworCQlrZnJlZShoYmVhdF90eGZfYnVmKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJaHZfY2JfdXRpbHNbSFZfU0hVVERPV05fTVNHXS5jaGFubmVsLT5vbmNoYW5uZWxfY2FsbGJhY2sgPQogCQkmc2h1dGRvd25fb25jaGFubmVsY2FsbGJhY2s7CiAJaHZfY2JfdXRpbHNbSFZfU0hVVERPV05fTVNHXS5jYWxsYmFjayA9ICZzaHV0ZG93bl9vbmNoYW5uZWxjYWxsYmFjazsKIAotCWh2X2NiX3V0aWxzW0hWX1RJTUVTWU5DX01TR10uY2hhbm5lbC0+T25DaGFubmVsQ2FsbGJhY2sgPQorCWh2X2NiX3V0aWxzW0hWX1RJTUVTWU5DX01TR10uY2hhbm5lbC0+b25jaGFubmVsX2NhbGxiYWNrID0KIAkJJnRpbWVzeW5jX29uY2hhbm5lbGNhbGxiYWNrOwogCWh2X2NiX3V0aWxzW0hWX1RJTUVTWU5DX01TR10uY2FsbGJhY2sgPSAmdGltZXN5bmNfb25jaGFubmVsY2FsbGJhY2s7CiAKLQlodl9jYl91dGlsc1tIVl9IRUFSVEJFQVRfTVNHXS5jaGFubmVsLT5PbkNoYW5uZWxDYWxsYmFjayA9CisJaHZfY2JfdXRpbHNbSFZfSEVBUlRCRUFUX01TR10uY2hhbm5lbC0+b25jaGFubmVsX2NhbGxiYWNrID0KIAkJJmhlYXJ0YmVhdF9vbmNoYW5uZWxjYWxsYmFjazsKIAlodl9jYl91dGlsc1tIVl9IRUFSVEJFQVRfTVNHXS5jYWxsYmFjayA9ICZoZWFydGJlYXRfb25jaGFubmVsY2FsbGJhY2s7CiAKQEAgLTI4NywxNyArMjkwLDIxIEBACiB7CiAJcHJpbnRrKEtFUk5fSU5GTyAiRGUtUmVnaXN0ZXJlZCBIeXBlclYgVXRpbGl0eSBEcml2ZXJcbiIpOwogCi0JaHZfY2JfdXRpbHNbSFZfU0hVVERPV05fTVNHXS5jaGFubmVsLT5PbkNoYW5uZWxDYWxsYmFjayA9CisJaHZfY2JfdXRpbHNbSFZfU0hVVERPV05fTVNHXS5jaGFubmVsLT5vbmNoYW5uZWxfY2FsbGJhY2sgPQogCQkmY2huX2NiX25lZ290aWF0ZTsKIAlodl9jYl91dGlsc1tIVl9TSFVURE9XTl9NU0ddLmNhbGxiYWNrID0gJmNobl9jYl9uZWdvdGlhdGU7CiAKLQlodl9jYl91dGlsc1tIVl9USU1FU1lOQ19NU0ddLmNoYW5uZWwtPk9uQ2hhbm5lbENhbGxiYWNrID0KKwlodl9jYl91dGlsc1tIVl9USU1FU1lOQ19NU0ddLmNoYW5uZWwtPm9uY2hhbm5lbF9jYWxsYmFjayA9CiAJCSZjaG5fY2JfbmVnb3RpYXRlOwogCWh2X2NiX3V0aWxzW0hWX1RJTUVTWU5DX01TR10uY2FsbGJhY2sgPSAmY2huX2NiX25lZ290aWF0ZTsKIAotCWh2X2NiX3V0aWxzW0hWX0hFQVJUQkVBVF9NU0ddLmNoYW5uZWwtPk9uQ2hhbm5lbENhbGxiYWNrID0KKwlodl9jYl91dGlsc1tIVl9IRUFSVEJFQVRfTVNHXS5jaGFubmVsLT5vbmNoYW5uZWxfY2FsbGJhY2sgPQogCQkmY2huX2NiX25lZ290aWF0ZTsKIAlodl9jYl91dGlsc1tIVl9IRUFSVEJFQVRfTVNHXS5jYWxsYmFjayA9ICZjaG5fY2JfbmVnb3RpYXRlOworCisJa2ZyZWUoc2h1dF90eGZfYnVmKTsKKwlrZnJlZSh0aW1lX3R4Zl9idWYpOworCWtmcmVlKGhiZWF0X3R4Zl9idWYpOwogfQogCiBtb2R1bGVfaW5pdChpbml0X2h5cGVydl91dGlscyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaHYvbmV0dnNjLmMgYi9kcml2ZXJzL3N0YWdpbmcvaHYvbmV0dnNjLmMKaW5kZXggNGMyNjMyYy4uZGY5Y2QxMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2h2L25ldHZzYy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9odi9uZXR2c2MuYwpAQCAtMzEsMTQ3ICszMSwxNDkgQEAKIAogCiAvKiBHbG9iYWxzICovCi1zdGF0aWMgY29uc3QgY2hhciAqZ0RyaXZlck5hbWUgPSAibmV0dnNjIjsKK3N0YXRpYyBjb25zdCBjaGFyICpkcml2ZXJfbmFtZSA9ICJuZXR2c2MiOwogCiAvKiB7Rjg2MTUxNjMtREYzRS00NmM1LTkxM0YtRjJEMkY5NjVFRDBFfSAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBodl9ndWlkIGdOZXRWc2NEZXZpY2VUeXBlID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBodl9ndWlkIG5ldHZzY19kZXZpY2VfdHlwZSA9IHsKIAkuZGF0YSA9IHsKIAkJMHg2MywgMHg1MSwgMHg2MSwgMHhGOCwgMHgzRSwgMHhERiwgMHhjNSwgMHg0NiwKIAkJMHg5MSwgMHgzRiwgMHhGMiwgMHhEMiwgMHhGOSwgMHg2NSwgMHhFRCwgMHgwRQogCX0KIH07CiAKLXN0YXRpYyBpbnQgTmV0VnNjT25EZXZpY2VBZGQoc3RydWN0IGh2X2RldmljZSAqRGV2aWNlLCB2b2lkICpBZGRpdGlvbmFsSW5mbyk7CitzdGF0aWMgaW50IG5ldHZzY19kZXZpY2VfYWRkKHN0cnVjdCBodl9kZXZpY2UgKmRldmljZSwgdm9pZCAqYWRkaXRpb25hbF9pbmZvKTsKIAotc3RhdGljIGludCBOZXRWc2NPbkRldmljZVJlbW92ZShzdHJ1Y3QgaHZfZGV2aWNlICpEZXZpY2UpOworc3RhdGljIGludCBuZXR2c2NfZGV2aWNlX3JlbW92ZShzdHJ1Y3QgaHZfZGV2aWNlICpkZXZpY2UpOwogCi1zdGF0aWMgdm9pZCBOZXRWc2NPbkNsZWFudXAoc3RydWN0IGh2X2RyaXZlciAqRHJpdmVyKTsKK3N0YXRpYyB2b2lkIG5ldHZzY19jbGVhbnVwKHN0cnVjdCBodl9kcml2ZXIgKmRyaXZlcik7CiAKLXN0YXRpYyB2b2lkIE5ldFZzY09uQ2hhbm5lbENhbGxiYWNrKHZvaWQgKmNvbnRleHQpOworc3RhdGljIHZvaWQgbmV0dnNjX2NoYW5uZWxfY2Iodm9pZCAqY29udGV4dCk7CiAKLXN0YXRpYyBpbnQgTmV0VnNjSW5pdGlhbGl6ZVNlbmRCdWZmZXJXaXRoTmV0VnNwKHN0cnVjdCBodl9kZXZpY2UgKkRldmljZSk7CitzdGF0aWMgaW50IG5ldHZzY19pbml0X3NlbmRfYnVmKHN0cnVjdCBodl9kZXZpY2UgKmRldmljZSk7CiAKLXN0YXRpYyBpbnQgTmV0VnNjSW5pdGlhbGl6ZVJlY2VpdmVCdWZmZXJXaXRoTmV0VnNwKHN0cnVjdCBodl9kZXZpY2UgKkRldmljZSk7CitzdGF0aWMgaW50IG5ldHZzY19pbml0X3JlY3ZfYnVmKHN0cnVjdCBodl9kZXZpY2UgKmRldmljZSk7CiAKLXN0YXRpYyBpbnQgTmV0VnNjRGVzdHJveVNlbmRCdWZmZXIoc3RydWN0IG5ldHZzY19kZXZpY2UgKk5ldERldmljZSk7CitzdGF0aWMgaW50IG5ldHZzY19kZXN0cm95X3NlbmRfYnVmKHN0cnVjdCBuZXR2c2NfZGV2aWNlICpuZXRfZGV2aWNlKTsKIAotc3RhdGljIGludCBOZXRWc2NEZXN0cm95UmVjZWl2ZUJ1ZmZlcihzdHJ1Y3QgbmV0dnNjX2RldmljZSAqTmV0RGV2aWNlKTsKK3N0YXRpYyBpbnQgbmV0dnNjX2Rlc3Ryb3lfcmVjdl9idWYoc3RydWN0IG5ldHZzY19kZXZpY2UgKm5ldF9kZXZpY2UpOwogCi1zdGF0aWMgaW50IE5ldFZzY0Nvbm5lY3RUb1ZzcChzdHJ1Y3QgaHZfZGV2aWNlICpEZXZpY2UpOworc3RhdGljIGludCBuZXR2c2NfY29ubmVjdF92c3Aoc3RydWN0IGh2X2RldmljZSAqZGV2aWNlKTsKIAotc3RhdGljIHZvaWQgTmV0VnNjT25TZW5kQ29tcGxldGlvbihzdHJ1Y3QgaHZfZGV2aWNlICpEZXZpY2UsCi0JCQkJICAgc3RydWN0IHZtcGFja2V0X2Rlc2NyaXB0b3IgKlBhY2tldCk7CitzdGF0aWMgdm9pZCBuZXR2c2Nfc2VuZF9jb21wbGV0aW9uKHN0cnVjdCBodl9kZXZpY2UgKmRldmljZSwKKwkJCQkgICBzdHJ1Y3Qgdm1wYWNrZXRfZGVzY3JpcHRvciAqcGFja2V0KTsKIAotc3RhdGljIGludCBOZXRWc2NPblNlbmQoc3RydWN0IGh2X2RldmljZSAqRGV2aWNlLAotCQkJc3RydWN0IGh2X25ldHZzY19wYWNrZXQgKlBhY2tldCk7CitzdGF0aWMgaW50IG5ldHZzY19zZW5kKHN0cnVjdCBodl9kZXZpY2UgKmRldmljZSwKKwkJCXN0cnVjdCBodl9uZXR2c2NfcGFja2V0ICpwYWNrZXQpOwogCi1zdGF0aWMgdm9pZCBOZXRWc2NPblJlY2VpdmUoc3RydWN0IGh2X2RldmljZSAqRGV2aWNlLAotCQkJICAgIHN0cnVjdCB2bXBhY2tldF9kZXNjcmlwdG9yICpQYWNrZXQpOworc3RhdGljIHZvaWQgbmV0dnNjX3JlY2VpdmUoc3RydWN0IGh2X2RldmljZSAqZGV2aWNlLAorCQkJICAgIHN0cnVjdCB2bXBhY2tldF9kZXNjcmlwdG9yICpwYWNrZXQpOwogCi1zdGF0aWMgdm9pZCBOZXRWc2NPblJlY2VpdmVDb21wbGV0aW9uKHZvaWQgKkNvbnRleHQpOworc3RhdGljIHZvaWQgbmV0dnNjX3JlY2VpdmVfY29tcGxldGlvbih2b2lkICpjb250ZXh0KTsKIAotc3RhdGljIHZvaWQgTmV0VnNjU2VuZFJlY2VpdmVDb21wbGV0aW9uKHN0cnVjdCBodl9kZXZpY2UgKkRldmljZSwKLQkJCQkJdTY0IFRyYW5zYWN0aW9uSWQpOworc3RhdGljIHZvaWQgbmV0dnNjX3NlbmRfcmVjdl9jb21wbGV0aW9uKHN0cnVjdCBodl9kZXZpY2UgKmRldmljZSwKKwkJCQkJdTY0IHRyYW5zYWN0aW9uX2lkKTsKIAogCi1zdGF0aWMgc3RydWN0IG5ldHZzY19kZXZpY2UgKkFsbG9jTmV0RGV2aWNlKHN0cnVjdCBodl9kZXZpY2UgKkRldmljZSkKK3N0YXRpYyBzdHJ1Y3QgbmV0dnNjX2RldmljZSAqYWxsb2NfbmV0X2RldmljZShzdHJ1Y3QgaHZfZGV2aWNlICpkZXZpY2UpCiB7Ci0Jc3RydWN0IG5ldHZzY19kZXZpY2UgKm5ldERldmljZTsKKwlzdHJ1Y3QgbmV0dnNjX2RldmljZSAqbmV0X2RldmljZTsKIAotCW5ldERldmljZSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBuZXR2c2NfZGV2aWNlKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFuZXREZXZpY2UpCisJbmV0X2RldmljZSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBuZXR2c2NfZGV2aWNlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFuZXRfZGV2aWNlKQogCQlyZXR1cm4gTlVMTDsKIAogCS8qIFNldCB0byAyIHRvIGFsbG93IGJvdGggaW5ib3VuZCBhbmQgb3V0Ym91bmQgdHJhZmZpYyAqLwotCWF0b21pY19jbXB4Y2hnKCZuZXREZXZpY2UtPlJlZkNvdW50LCAwLCAyKTsKKwlhdG9taWNfY21weGNoZygmbmV0X2RldmljZS0+cmVmY250LCAwLCAyKTsKIAotCW5ldERldmljZS0+RGV2aWNlID0gRGV2aWNlOwotCURldmljZS0+RXh0ZW5zaW9uID0gbmV0RGV2aWNlOworCW5ldF9kZXZpY2UtPmRldiA9IGRldmljZTsKKwlkZXZpY2UtPkV4dGVuc2lvbiA9IG5ldF9kZXZpY2U7CiAKLQlyZXR1cm4gbmV0RGV2aWNlOworCXJldHVybiBuZXRfZGV2aWNlOwogfQogCi1zdGF0aWMgdm9pZCBGcmVlTmV0RGV2aWNlKHN0cnVjdCBuZXR2c2NfZGV2aWNlICpEZXZpY2UpCitzdGF0aWMgdm9pZCBmcmVlX25ldF9kZXZpY2Uoc3RydWN0IG5ldHZzY19kZXZpY2UgKmRldmljZSkKIHsKLQlXQVJOX09OKGF0b21pY19yZWFkKCZEZXZpY2UtPlJlZkNvdW50KSA9PSAwKTsKLQlEZXZpY2UtPkRldmljZS0+RXh0ZW5zaW9uID0gTlVMTDsKLQlrZnJlZShEZXZpY2UpOworCVdBUk5fT04oYXRvbWljX3JlYWQoJmRldmljZS0+cmVmY250KSA9PSAwKTsKKwlkZXZpY2UtPmRldi0+RXh0ZW5zaW9uID0gTlVMTDsKKwlrZnJlZShkZXZpY2UpOwogfQogCiAKIC8qIEdldCB0aGUgbmV0IGRldmljZSBvYmplY3QgaWZmIGV4aXN0cyBhbmQgaXRzIHJlZmNvdW50ID4gMSAqLwotc3RhdGljIHN0cnVjdCBuZXR2c2NfZGV2aWNlICpHZXRPdXRib3VuZE5ldERldmljZShzdHJ1Y3QgaHZfZGV2aWNlICpEZXZpY2UpCitzdGF0aWMgc3RydWN0IG5ldHZzY19kZXZpY2UgKmdldF9vdXRib3VuZF9uZXRfZGV2aWNlKHN0cnVjdCBodl9kZXZpY2UgKmRldmljZSkKIHsKLQlzdHJ1Y3QgbmV0dnNjX2RldmljZSAqbmV0RGV2aWNlOworCXN0cnVjdCBuZXR2c2NfZGV2aWNlICpuZXRfZGV2aWNlOwogCi0JbmV0RGV2aWNlID0gRGV2aWNlLT5FeHRlbnNpb247Ci0JaWYgKG5ldERldmljZSAmJiBhdG9taWNfcmVhZCgmbmV0RGV2aWNlLT5SZWZDb3VudCkgPiAxKQotCQlhdG9taWNfaW5jKCZuZXREZXZpY2UtPlJlZkNvdW50KTsKKwluZXRfZGV2aWNlID0gZGV2aWNlLT5FeHRlbnNpb247CisJaWYgKG5ldF9kZXZpY2UgJiYgYXRvbWljX3JlYWQoJm5ldF9kZXZpY2UtPnJlZmNudCkgPiAxKQorCQlhdG9taWNfaW5jKCZuZXRfZGV2aWNlLT5yZWZjbnQpOwogCWVsc2UKLQkJbmV0RGV2aWNlID0gTlVMTDsKKwkJbmV0X2RldmljZSA9IE5VTEw7CiAKLQlyZXR1cm4gbmV0RGV2aWNlOworCXJldHVybiBuZXRfZGV2aWNlOwogfQogCiAvKiBHZXQgdGhlIG5ldCBkZXZpY2Ugb2JqZWN0IGlmZiBleGlzdHMgYW5kIGl0cyByZWZjb3VudCA+IDAgKi8KLXN0YXRpYyBzdHJ1Y3QgbmV0dnNjX2RldmljZSAqR2V0SW5ib3VuZE5ldERldmljZShzdHJ1Y3QgaHZfZGV2aWNlICpEZXZpY2UpCitzdGF0aWMgc3RydWN0IG5ldHZzY19kZXZpY2UgKmdldF9pbmJvdW5kX25ldF9kZXZpY2Uoc3RydWN0IGh2X2RldmljZSAqZGV2aWNlKQogewotCXN0cnVjdCBuZXR2c2NfZGV2aWNlICpuZXREZXZpY2U7CisJc3RydWN0IG5ldHZzY19kZXZpY2UgKm5ldF9kZXZpY2U7CiAKLQluZXREZXZpY2UgPSBEZXZpY2UtPkV4dGVuc2lvbjsKLQlpZiAobmV0RGV2aWNlICYmIGF0b21pY19yZWFkKCZuZXREZXZpY2UtPlJlZkNvdW50KSkKLQkJYXRvbWljX2luYygmbmV0RGV2aWNlLT5SZWZDb3VudCk7CisJbmV0X2RldmljZSA9IGRldmljZS0+RXh0ZW5zaW9uOworCWlmIChuZXRfZGV2aWNlICYmIGF0b21pY19yZWFkKCZuZXRfZGV2aWNlLT5yZWZjbnQpKQorCQlhdG9taWNfaW5jKCZuZXRfZGV2aWNlLT5yZWZjbnQpOwogCWVsc2UKLQkJbmV0RGV2aWNlID0gTlVMTDsKKwkJbmV0X2RldmljZSA9IE5VTEw7CiAKLQlyZXR1cm4gbmV0RGV2aWNlOworCXJldHVybiBuZXRfZGV2aWNlOwogfQogCi1zdGF0aWMgdm9pZCBQdXROZXREZXZpY2Uoc3RydWN0IGh2X2RldmljZSAqRGV2aWNlKQorc3RhdGljIHZvaWQgcHV0X25ldF9kZXZpY2Uoc3RydWN0IGh2X2RldmljZSAqZGV2aWNlKQogewotCXN0cnVjdCBuZXR2c2NfZGV2aWNlICpuZXREZXZpY2U7CisJc3RydWN0IG5ldHZzY19kZXZpY2UgKm5ldF9kZXZpY2U7CiAKLQluZXREZXZpY2UgPSBEZXZpY2UtPkV4dGVuc2lvbjsKKwluZXRfZGV2aWNlID0gZGV2aWNlLT5FeHRlbnNpb247CiAJLyogQVNTRVJUKG5ldERldmljZSk7ICovCiAKLQlhdG9taWNfZGVjKCZuZXREZXZpY2UtPlJlZkNvdW50KTsKKwlhdG9taWNfZGVjKCZuZXRfZGV2aWNlLT5yZWZjbnQpOwogfQogCi1zdGF0aWMgc3RydWN0IG5ldHZzY19kZXZpY2UgKlJlbGVhc2VPdXRib3VuZE5ldERldmljZShzdHJ1Y3QgaHZfZGV2aWNlICpEZXZpY2UpCitzdGF0aWMgc3RydWN0IG5ldHZzY19kZXZpY2UgKnJlbGVhc2Vfb3V0Ym91bmRfbmV0X2RldmljZSgKKwkJc3RydWN0IGh2X2RldmljZSAqZGV2aWNlKQogewotCXN0cnVjdCBuZXR2c2NfZGV2aWNlICpuZXREZXZpY2U7CisJc3RydWN0IG5ldHZzY19kZXZpY2UgKm5ldF9kZXZpY2U7CiAKLQluZXREZXZpY2UgPSBEZXZpY2UtPkV4dGVuc2lvbjsKLQlpZiAobmV0RGV2aWNlID09IE5VTEwpCisJbmV0X2RldmljZSA9IGRldmljZS0+RXh0ZW5zaW9uOworCWlmIChuZXRfZGV2aWNlID09IE5VTEwpCiAJCXJldHVybiBOVUxMOwogCiAJLyogQnVzeSB3YWl0IHVudGlsIHRoZSByZWYgZHJvcCB0byAyLCB0aGVuIHNldCBpdCB0byAxICovCi0Jd2hpbGUgKGF0b21pY19jbXB4Y2hnKCZuZXREZXZpY2UtPlJlZkNvdW50LCAyLCAxKSAhPSAyKQorCXdoaWxlIChhdG9taWNfY21weGNoZygmbmV0X2RldmljZS0+cmVmY250LCAyLCAxKSAhPSAyKQogCQl1ZGVsYXkoMTAwKTsKIAotCXJldHVybiBuZXREZXZpY2U7CisJcmV0dXJuIG5ldF9kZXZpY2U7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgbmV0dnNjX2RldmljZSAqUmVsZWFzZUluYm91bmROZXREZXZpY2Uoc3RydWN0IGh2X2RldmljZSAqRGV2aWNlKQorc3RhdGljIHN0cnVjdCBuZXR2c2NfZGV2aWNlICpyZWxlYXNlX2luYm91bmRfbmV0X2RldmljZSgKKwkJc3RydWN0IGh2X2RldmljZSAqZGV2aWNlKQogewotCXN0cnVjdCBuZXR2c2NfZGV2aWNlICpuZXREZXZpY2U7CisJc3RydWN0IG5ldHZzY19kZXZpY2UgKm5ldF9kZXZpY2U7CiAKLQluZXREZXZpY2UgPSBEZXZpY2UtPkV4dGVuc2lvbjsKLQlpZiAobmV0RGV2aWNlID09IE5VTEwpCisJbmV0X2RldmljZSA9IGRldmljZS0+RXh0ZW5zaW9uOworCWlmIChuZXRfZGV2aWNlID09IE5VTEwpCiAJCXJldHVybiBOVUxMOwogCiAJLyogQnVzeSB3YWl0IHVudGlsIHRoZSByZWYgZHJvcCB0byAxLCB0aGVuIHNldCBpdCB0byAwICovCi0Jd2hpbGUgKGF0b21pY19jbXB4Y2hnKCZuZXREZXZpY2UtPlJlZkNvdW50LCAxLCAwKSAhPSAxKQorCXdoaWxlIChhdG9taWNfY21weGNoZygmbmV0X2RldmljZS0+cmVmY250LCAxLCAwKSAhPSAxKQogCQl1ZGVsYXkoMTAwKTsKIAotCURldmljZS0+RXh0ZW5zaW9uID0gTlVMTDsKLQlyZXR1cm4gbmV0RGV2aWNlOworCWRldmljZS0+RXh0ZW5zaW9uID0gTlVMTDsKKwlyZXR1cm4gbmV0X2RldmljZTsKIH0KIAogLyoKLSAqIE5ldFZzY0luaXRpYWxpemUgLSBNYWluIGVudHJ5IHBvaW50CisgKiBuZXR2c2NfaW5pdGlhbGl6ZSAtIE1haW4gZW50cnkgcG9pbnQKICAqLwotaW50IE5ldFZzY0luaXRpYWxpemUoc3RydWN0IGh2X2RyaXZlciAqZHJ2KQoraW50IG5ldHZzY19pbml0aWFsaXplKHN0cnVjdCBodl9kcml2ZXIgKmRydikKIHsKIAlzdHJ1Y3QgbmV0dnNjX2RyaXZlciAqZHJpdmVyID0gKHN0cnVjdCBuZXR2c2NfZHJpdmVyICopZHJ2OwogCkBAIC0xODUsOCArMTg3LDggQEAKIAkvKiBNYWtlIHN1cmUgd2UgYXJlIGF0IGxlYXN0IDIgcGFnZXMgc2luY2UgMSBwYWdlIGlzIHVzZWQgZm9yIGNvbnRyb2wgKi8KIAkvKiBBU1NFUlQoZHJpdmVyLT5SaW5nQnVmZmVyU2l6ZSA+PSAoUEFHRV9TSVpFIDw8IDEpKTsgKi8KIAotCWRydi0+bmFtZSA9IGdEcml2ZXJOYW1lOwotCW1lbWNweSgmZHJ2LT5kZXZpY2VUeXBlLCAmZ05ldFZzY0RldmljZVR5cGUsIHNpemVvZihzdHJ1Y3QgaHZfZ3VpZCkpOworCWRydi0+bmFtZSA9IGRyaXZlcl9uYW1lOworCW1lbWNweSgmZHJ2LT5kZXZpY2VUeXBlLCAmbmV0dnNjX2RldmljZV90eXBlLCBzaXplb2Yoc3RydWN0IGh2X2d1aWQpKTsKIAogCS8qIE1ha2Ugc3VyZSBpdCBpcyBzZXQgYnkgdGhlIGNhbGxlciAqLwogCS8qIEZJWE1FOiBUaGVzZSBwcm9iYWJseSBzaG91bGQgc3RpbGwgYmUgdGVzdGVkIGluIHNvbWUgd2F5ICovCkBAIC0xOTQsMjQgKzE5NiwyNCBAQAogCS8qIEFTU0VSVChkcml2ZXItPk9uTGlua1N0YXR1c0NoYW5nZWQpOyAqLwogCiAJLyogU2V0dXAgdGhlIGRpc3BhdGNoIHRhYmxlICovCi0JZHJpdmVyLT5CYXNlLk9uRGV2aWNlQWRkCT0gTmV0VnNjT25EZXZpY2VBZGQ7Ci0JZHJpdmVyLT5CYXNlLk9uRGV2aWNlUmVtb3ZlCT0gTmV0VnNjT25EZXZpY2VSZW1vdmU7Ci0JZHJpdmVyLT5CYXNlLk9uQ2xlYW51cAkJPSBOZXRWc2NPbkNsZWFudXA7CisJZHJpdmVyLT5iYXNlLk9uRGV2aWNlQWRkCT0gbmV0dnNjX2RldmljZV9hZGQ7CisJZHJpdmVyLT5iYXNlLk9uRGV2aWNlUmVtb3ZlCT0gbmV0dnNjX2RldmljZV9yZW1vdmU7CisJZHJpdmVyLT5iYXNlLk9uQ2xlYW51cAkJPSBuZXR2c2NfY2xlYW51cDsKIAotCWRyaXZlci0+T25TZW5kCQkJPSBOZXRWc2NPblNlbmQ7CisJZHJpdmVyLT5zZW5kCQkJPSBuZXR2c2Nfc2VuZDsKIAotCVJuZGlzRmlsdGVySW5pdChkcml2ZXIpOworCXJuZGlzX2ZpbHRlcl9pbml0KGRyaXZlcik7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgTmV0VnNjSW5pdGlhbGl6ZVJlY2VpdmVCdWZmZXJXaXRoTmV0VnNwKHN0cnVjdCBodl9kZXZpY2UgKkRldmljZSkKK3N0YXRpYyBpbnQgbmV0dnNjX2luaXRfcmVjdl9idWYoc3RydWN0IGh2X2RldmljZSAqZGV2aWNlKQogewogCWludCByZXQgPSAwOwotCXN0cnVjdCBuZXR2c2NfZGV2aWNlICpuZXREZXZpY2U7Ci0Jc3RydWN0IG52c3BfbWVzc2FnZSAqaW5pdFBhY2tldDsKKwlzdHJ1Y3QgbmV0dnNjX2RldmljZSAqbmV0X2RldmljZTsKKwlzdHJ1Y3QgbnZzcF9tZXNzYWdlICppbml0X3BhY2tldDsKIAotCW5ldERldmljZSA9IEdldE91dGJvdW5kTmV0RGV2aWNlKERldmljZSk7Ci0JaWYgKCFuZXREZXZpY2UpIHsKKwluZXRfZGV2aWNlID0gZ2V0X291dGJvdW5kX25ldF9kZXZpY2UoZGV2aWNlKTsKKwlpZiAoIW5ldF9kZXZpY2UpIHsKIAkJRFBSSU5UX0VSUihORVRWU0MsICJ1bmFibGUgdG8gZ2V0IG5ldCBkZXZpY2UuLi4iCiAJCQkgICAiZGV2aWNlIGJlaW5nIGRlc3Ryb3llZD8iKTsKIAkJcmV0dXJuIC0xOwpAQCAtMjIwLDEyICsyMjIsMTIgQEAKIAkvKiBwYWdlLXNpemUgZ3JhbmR1bGFyaXR5ICovCiAJLyogQVNTRVJUKChuZXREZXZpY2UtPlJlY2VpdmVCdWZmZXJTaXplICYgKFBBR0VfU0laRSAtIDEpKSA9PSAwKTsgKi8KIAotCW5ldERldmljZS0+UmVjZWl2ZUJ1ZmZlciA9Ci0JCW9zZF9QYWdlQWxsb2MobmV0RGV2aWNlLT5SZWNlaXZlQnVmZmVyU2l6ZSA+PiBQQUdFX1NISUZUKTsKLQlpZiAoIW5ldERldmljZS0+UmVjZWl2ZUJ1ZmZlcikgeworCW5ldF9kZXZpY2UtPnJlY3ZfYnVmID0KKwkJb3NkX3BhZ2VfYWxsb2MobmV0X2RldmljZS0+cmVjdl9idWZfc2l6ZSA+PiBQQUdFX1NISUZUKTsKKwlpZiAoIW5ldF9kZXZpY2UtPnJlY3ZfYnVmKSB7CiAJCURQUklOVF9FUlIoTkVUVlNDLAogCQkJICAgInVuYWJsZSB0byBhbGxvY2F0ZSByZWNlaXZlIGJ1ZmZlciBvZiBzaXplICVkIiwKLQkJCSAgIG5ldERldmljZS0+UmVjZWl2ZUJ1ZmZlclNpemUpOworCQkJICAgbmV0X2RldmljZS0+cmVjdl9idWZfc2l6ZSk7CiAJCXJldCA9IC0xOwogCQlnb3RvIENsZWFudXA7CiAJfQpAQCAtMjQwLDMyICsyNDIsMzQgQEAKIAkgKiBjaGFubmVsLiAgTm90ZTogVGhpcyBjYWxsIHVzZXMgdGhlIHZtYnVzIGNvbm5lY3Rpb24gcmF0aGVyCiAJICogdGhhbiB0aGUgY2hhbm5lbCB0byBlc3RhYmxpc2ggdGhlIGdwYWRsIGhhbmRsZS4KIAkgKi8KLQlyZXQgPSB2bWJ1c19lc3RhYmxpc2hfZ3BhZGwoRGV2aWNlLT5jaGFubmVsLCBuZXREZXZpY2UtPlJlY2VpdmVCdWZmZXIsCi0JCQkJICAgIG5ldERldmljZS0+UmVjZWl2ZUJ1ZmZlclNpemUsCi0JCQkJICAgICZuZXREZXZpY2UtPlJlY2VpdmVCdWZmZXJHcGFkbEhhbmRsZSk7CisJcmV0ID0gdm1idXNfZXN0YWJsaXNoX2dwYWRsKGRldmljZS0+Y2hhbm5lbCwgbmV0X2RldmljZS0+cmVjdl9idWYsCisJCQkJICAgIG5ldF9kZXZpY2UtPnJlY3ZfYnVmX3NpemUsCisJCQkJICAgICZuZXRfZGV2aWNlLT5yZWN2X2J1Zl9ncGFkbF9oYW5kbGUpOwogCWlmIChyZXQgIT0gMCkgewogCQlEUFJJTlRfRVJSKE5FVFZTQywKIAkJCSAgICJ1bmFibGUgdG8gZXN0YWJsaXNoIHJlY2VpdmUgYnVmZmVyJ3MgZ3BhZGwiKTsKIAkJZ290byBDbGVhbnVwOwogCX0KIAotCS8qIG9zZF9XYWl0RXZlbnRXYWl0KGV4dC0+Q2hhbm5lbEluaXRFdmVudCk7ICovCisJLyogb3NkX3dhaXRldmVudF93YWl0KGV4dC0+Q2hhbm5lbEluaXRFdmVudCk7ICovCiAKIAkvKiBOb3RpZnkgdGhlIE5ldFZzcCBvZiB0aGUgZ3BhZGwgaGFuZGxlICovCiAJRFBSSU5UX0lORk8oTkVUVlNDLCAiU2VuZGluZyBOdnNwTWVzc2FnZTFUeXBlU2VuZFJlY2VpdmVCdWZmZXIuLi4iKTsKIAotCWluaXRQYWNrZXQgPSAmbmV0RGV2aWNlLT5DaGFubmVsSW5pdFBhY2tldDsKKwlpbml0X3BhY2tldCA9ICZuZXRfZGV2aWNlLT5jaGFubmVsX2luaXRfcGt0OwogCi0JbWVtc2V0KGluaXRQYWNrZXQsIDAsIHNpemVvZihzdHJ1Y3QgbnZzcF9tZXNzYWdlKSk7CisJbWVtc2V0KGluaXRfcGFja2V0LCAwLCBzaXplb2Yoc3RydWN0IG52c3BfbWVzc2FnZSkpOwogCi0JaW5pdFBhY2tldC0+SGVhZGVyLk1lc3NhZ2VUeXBlID0gTnZzcE1lc3NhZ2UxVHlwZVNlbmRSZWNlaXZlQnVmZmVyOwotCWluaXRQYWNrZXQtPk1lc3NhZ2VzLlZlcnNpb24xTWVzc2FnZXMuU2VuZFJlY2VpdmVCdWZmZXIuR3BhZGxIYW5kbGUgPSBuZXREZXZpY2UtPlJlY2VpdmVCdWZmZXJHcGFkbEhhbmRsZTsKLQlpbml0UGFja2V0LT5NZXNzYWdlcy5WZXJzaW9uMU1lc3NhZ2VzLlNlbmRSZWNlaXZlQnVmZmVyLklkID0gTkVUVlNDX1JFQ0VJVkVfQlVGRkVSX0lEOworCWluaXRfcGFja2V0LT5oZHIubXNnX3R5cGUgPSBOVlNQX01TRzFfVFlQRV9TRU5EX1JFQ1ZfQlVGOworCWluaXRfcGFja2V0LT5tc2cudjFfbXNnLnNlbmRfcmVjdl9idWYuCisJCWdwYWRsX2hhbmRsZSA9IG5ldF9kZXZpY2UtPnJlY3ZfYnVmX2dwYWRsX2hhbmRsZTsKKwlpbml0X3BhY2tldC0+bXNnLnYxX21zZy4KKwkJc2VuZF9yZWN2X2J1Zi5pZCA9IE5FVFZTQ19SRUNFSVZFX0JVRkZFUl9JRDsKIAogCS8qIFNlbmQgdGhlIGdwYWRsIG5vdGlmaWNhdGlvbiByZXF1ZXN0ICovCi0JcmV0ID0gdm1idXNfc2VuZHBhY2tldChEZXZpY2UtPmNoYW5uZWwsIGluaXRQYWNrZXQsCisJcmV0ID0gdm1idXNfc2VuZHBhY2tldChkZXZpY2UtPmNoYW5uZWwsIGluaXRfcGFja2V0LAogCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgbnZzcF9tZXNzYWdlKSwKLQkJCSAgICAgICAodW5zaWduZWQgbG9uZylpbml0UGFja2V0LAorCQkJICAgICAgICh1bnNpZ25lZCBsb25nKWluaXRfcGFja2V0LAogCQkJICAgICAgIFZtYnVzUGFja2V0VHlwZURhdGFJbkJhbmQsCiAJCQkgICAgICAgVk1CVVNfREFUQV9QQUNLRVRfRkxBR19DT01QTEVUSU9OX1JFUVVFU1RFRCk7CiAJaWYgKHJldCAhPSAwKSB7CkBAIC0yNzQsMTMgKzI3OCwxNSBAQAogCQlnb3RvIENsZWFudXA7CiAJfQogCi0Jb3NkX1dhaXRFdmVudFdhaXQobmV0RGV2aWNlLT5DaGFubmVsSW5pdEV2ZW50KTsKKwlvc2Rfd2FpdGV2ZW50X3dhaXQobmV0X2RldmljZS0+Y2hhbm5lbF9pbml0X2V2ZW50KTsKIAogCS8qIENoZWNrIHRoZSByZXNwb25zZSAqLwotCWlmIChpbml0UGFja2V0LT5NZXNzYWdlcy5WZXJzaW9uMU1lc3NhZ2VzLlNlbmRSZWNlaXZlQnVmZmVyQ29tcGxldGUuU3RhdHVzICE9IE52c3BTdGF0dXNTdWNjZXNzKSB7CisJaWYgKGluaXRfcGFja2V0LT5tc2cudjFfbXNnLgorCSAgICBzZW5kX3JlY3ZfYnVmX2NvbXBsZXRlLnN0YXR1cyAhPSBOVlNQX1NUQVRfU1VDQ0VTUykgewogCQlEUFJJTlRfRVJSKE5FVFZTQywgIlVuYWJsZSB0byBjb21wbGV0ZSByZWNlaXZlIGJ1ZmZlciAiCiAJCQkgICAiaW5pdGlhbHphdGlvbiB3aXRoIE5ldFZzcCAtIHN0YXR1cyAlZCIsCi0JCQkgICBpbml0UGFja2V0LT5NZXNzYWdlcy5WZXJzaW9uMU1lc3NhZ2VzLlNlbmRSZWNlaXZlQnVmZmVyQ29tcGxldGUuU3RhdHVzKTsKKwkJCSAgIGluaXRfcGFja2V0LT5tc2cudjFfbXNnLgorCQkJICAgc2VuZF9yZWN2X2J1Zl9jb21wbGV0ZS5zdGF0dXMpOwogCQlyZXQgPSAtMTsKIAkJZ290byBDbGVhbnVwOwogCX0KQEAgLTI4OSwzMiArMjk1LDM2IEBACiAJLyogQVNTRVJUKG5ldERldmljZS0+UmVjZWl2ZVNlY3Rpb25Db3VudCA9PSAwKTsgKi8KIAkvKiBBU1NFUlQobmV0RGV2aWNlLT5SZWNlaXZlU2VjdGlvbnMgPT0gTlVMTCk7ICovCiAKLQluZXREZXZpY2UtPlJlY2VpdmVTZWN0aW9uQ291bnQgPSBpbml0UGFja2V0LT5NZXNzYWdlcy5WZXJzaW9uMU1lc3NhZ2VzLlNlbmRSZWNlaXZlQnVmZmVyQ29tcGxldGUuTnVtU2VjdGlvbnM7CisJbmV0X2RldmljZS0+cmVjdl9zZWN0aW9uX2NudCA9IGluaXRfcGFja2V0LT5tc2cuCisJCXYxX21zZy5zZW5kX3JlY3ZfYnVmX2NvbXBsZXRlLm51bV9zZWN0aW9uczsKIAotCW5ldERldmljZS0+UmVjZWl2ZVNlY3Rpb25zID0ga21hbGxvYyhuZXREZXZpY2UtPlJlY2VpdmVTZWN0aW9uQ291bnQgKiBzaXplb2Yoc3RydWN0IG52c3BfMV9yZWNlaXZlX2J1ZmZlcl9zZWN0aW9uKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKG5ldERldmljZS0+UmVjZWl2ZVNlY3Rpb25zID09IE5VTEwpIHsKKwluZXRfZGV2aWNlLT5yZWN2X3NlY3Rpb24gPSBrbWFsbG9jKG5ldF9kZXZpY2UtPnJlY3Zfc2VjdGlvbl9jbnQKKwkJKiBzaXplb2Yoc3RydWN0IG52c3BfMV9yZWNlaXZlX2J1ZmZlcl9zZWN0aW9uKSwgR0ZQX0tFUk5FTCk7CisJaWYgKG5ldF9kZXZpY2UtPnJlY3Zfc2VjdGlvbiA9PSBOVUxMKSB7CiAJCXJldCA9IC0xOwogCQlnb3RvIENsZWFudXA7CiAJfQogCi0JbWVtY3B5KG5ldERldmljZS0+UmVjZWl2ZVNlY3Rpb25zLAotCQlpbml0UGFja2V0LT5NZXNzYWdlcy5WZXJzaW9uMU1lc3NhZ2VzLlNlbmRSZWNlaXZlQnVmZmVyQ29tcGxldGUuU2VjdGlvbnMsCi0JCW5ldERldmljZS0+UmVjZWl2ZVNlY3Rpb25Db3VudCAqIHNpemVvZihzdHJ1Y3QgbnZzcF8xX3JlY2VpdmVfYnVmZmVyX3NlY3Rpb24pKTsKKwltZW1jcHkobmV0X2RldmljZS0+cmVjdl9zZWN0aW9uLAorCQlpbml0X3BhY2tldC0+bXNnLnYxX21zZy4KKwkgICAgICAgc2VuZF9yZWN2X2J1Zl9jb21wbGV0ZS5zZWN0aW9ucywKKwkJbmV0X2RldmljZS0+cmVjdl9zZWN0aW9uX2NudCAqCisJICAgICAgIHNpemVvZihzdHJ1Y3QgbnZzcF8xX3JlY2VpdmVfYnVmZmVyX3NlY3Rpb24pKTsKIAogCURQUklOVF9JTkZPKE5FVFZTQywgIlJlY2VpdmUgc2VjdGlvbnMgaW5mbyAoY291bnQgJWQsIG9mZnNldCAlZCwgIgogCQkgICAgImVuZG9mZnNldCAlZCwgc3ViYWxsb2Mgc2l6ZSAlZCwgbnVtIHN1YmFsbG9jcyAlZCkiLAotCQkgICAgbmV0RGV2aWNlLT5SZWNlaXZlU2VjdGlvbkNvdW50LAotCQkgICAgbmV0RGV2aWNlLT5SZWNlaXZlU2VjdGlvbnNbMF0uT2Zmc2V0LAotCQkgICAgbmV0RGV2aWNlLT5SZWNlaXZlU2VjdGlvbnNbMF0uRW5kT2Zmc2V0LAotCQkgICAgbmV0RGV2aWNlLT5SZWNlaXZlU2VjdGlvbnNbMF0uU3ViQWxsb2NhdGlvblNpemUsCi0JCSAgICBuZXREZXZpY2UtPlJlY2VpdmVTZWN0aW9uc1swXS5OdW1TdWJBbGxvY2F0aW9ucyk7CisJCSAgICBuZXRfZGV2aWNlLT5yZWN2X3NlY3Rpb25fY250LAorCQkgICAgbmV0X2RldmljZS0+cmVjdl9zZWN0aW9uWzBdLm9mZnNldCwKKwkJICAgIG5ldF9kZXZpY2UtPnJlY3Zfc2VjdGlvblswXS5lbmRfb2Zmc2V0LAorCQkgICAgbmV0X2RldmljZS0+cmVjdl9zZWN0aW9uWzBdLnN1Yl9hbGxvY19zaXplLAorCQkgICAgbmV0X2RldmljZS0+cmVjdl9zZWN0aW9uWzBdLm51bV9zdWJfYWxsb2NzKTsKIAogCS8qCiAJICogRm9yIDFzdCByZWxlYXNlLCB0aGVyZSBzaG91bGQgb25seSBiZSAxIHNlY3Rpb24gdGhhdCByZXByZXNlbnRzIHRoZQogCSAqIGVudGlyZSByZWNlaXZlIGJ1ZmZlcgogCSAqLwotCWlmIChuZXREZXZpY2UtPlJlY2VpdmVTZWN0aW9uQ291bnQgIT0gMSB8fAotCSAgICBuZXREZXZpY2UtPlJlY2VpdmVTZWN0aW9ucy0+T2Zmc2V0ICE9IDApIHsKKwlpZiAobmV0X2RldmljZS0+cmVjdl9zZWN0aW9uX2NudCAhPSAxIHx8CisJICAgIG5ldF9kZXZpY2UtPnJlY3Zfc2VjdGlvbi0+b2Zmc2V0ICE9IDApIHsKIAkJcmV0ID0gLTE7CiAJCWdvdG8gQ2xlYW51cDsKIAl9CkBAIC0zMjIsMjYgKzMzMiwyNiBAQAogCWdvdG8gRXhpdDsKIAogQ2xlYW51cDoKLQlOZXRWc2NEZXN0cm95UmVjZWl2ZUJ1ZmZlcihuZXREZXZpY2UpOworCW5ldHZzY19kZXN0cm95X3JlY3ZfYnVmKG5ldF9kZXZpY2UpOwogCiBFeGl0OgotCVB1dE5ldERldmljZShEZXZpY2UpOworCXB1dF9uZXRfZGV2aWNlKGRldmljZSk7CiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBOZXRWc2NJbml0aWFsaXplU2VuZEJ1ZmZlcldpdGhOZXRWc3Aoc3RydWN0IGh2X2RldmljZSAqRGV2aWNlKQorc3RhdGljIGludCBuZXR2c2NfaW5pdF9zZW5kX2J1ZihzdHJ1Y3QgaHZfZGV2aWNlICpkZXZpY2UpCiB7CiAJaW50IHJldCA9IDA7Ci0Jc3RydWN0IG5ldHZzY19kZXZpY2UgKm5ldERldmljZTsKLQlzdHJ1Y3QgbnZzcF9tZXNzYWdlICppbml0UGFja2V0OworCXN0cnVjdCBuZXR2c2NfZGV2aWNlICpuZXRfZGV2aWNlOworCXN0cnVjdCBudnNwX21lc3NhZ2UgKmluaXRfcGFja2V0OwogCi0JbmV0RGV2aWNlID0gR2V0T3V0Ym91bmROZXREZXZpY2UoRGV2aWNlKTsKLQlpZiAoIW5ldERldmljZSkgeworCW5ldF9kZXZpY2UgPSBnZXRfb3V0Ym91bmRfbmV0X2RldmljZShkZXZpY2UpOworCWlmICghbmV0X2RldmljZSkgewogCQlEUFJJTlRfRVJSKE5FVFZTQywgInVuYWJsZSB0byBnZXQgbmV0IGRldmljZS4uLiIKIAkJCSAgICJkZXZpY2UgYmVpbmcgZGVzdHJveWVkPyIpOwogCQlyZXR1cm4gLTE7CiAJfQotCWlmIChuZXREZXZpY2UtPlNlbmRCdWZmZXJTaXplIDw9IDApIHsKKwlpZiAobmV0X2RldmljZS0+c2VuZF9idWZfc2l6ZSA8PSAwKSB7CiAJCXJldCA9IC1FSU5WQUw7CiAJCWdvdG8gQ2xlYW51cDsKIAl9CkBAIC0zNDksMTEgKzM1OSwxMSBAQAogCS8qIHBhZ2Utc2l6ZSBncmFuZHVsYXJpdHkgKi8KIAkvKiBBU1NFUlQoKG5ldERldmljZS0+U2VuZEJ1ZmZlclNpemUgJiAoUEFHRV9TSVpFIC0gMSkpID09IDApOyAqLwogCi0JbmV0RGV2aWNlLT5TZW5kQnVmZmVyID0KLQkJb3NkX1BhZ2VBbGxvYyhuZXREZXZpY2UtPlNlbmRCdWZmZXJTaXplID4+IFBBR0VfU0hJRlQpOwotCWlmICghbmV0RGV2aWNlLT5TZW5kQnVmZmVyKSB7CisJbmV0X2RldmljZS0+c2VuZF9idWYgPQorCQlvc2RfcGFnZV9hbGxvYyhuZXRfZGV2aWNlLT5zZW5kX2J1Zl9zaXplID4+IFBBR0VfU0hJRlQpOworCWlmICghbmV0X2RldmljZS0+c2VuZF9idWYpIHsKIAkJRFBSSU5UX0VSUihORVRWU0MsICJ1bmFibGUgdG8gYWxsb2NhdGUgc2VuZCBidWZmZXIgb2Ygc2l6ZSAlZCIsCi0JCQkgICBuZXREZXZpY2UtPlNlbmRCdWZmZXJTaXplKTsKKwkJCSAgIG5ldF9kZXZpY2UtPnNlbmRfYnVmX3NpemUpOwogCQlyZXQgPSAtMTsKIAkJZ290byBDbGVhbnVwOwogCX0KQEAgLTM2NywzMSArMzc3LDMzIEBACiAJICogY2hhbm5lbC4gIE5vdGU6IFRoaXMgY2FsbCB1c2VzIHRoZSB2bWJ1cyBjb25uZWN0aW9uIHJhdGhlcgogCSAqIHRoYW4gdGhlIGNoYW5uZWwgdG8gZXN0YWJsaXNoIHRoZSBncGFkbCBoYW5kbGUuCiAJICovCi0JcmV0ID0gdm1idXNfZXN0YWJsaXNoX2dwYWRsKERldmljZS0+Y2hhbm5lbCwgbmV0RGV2aWNlLT5TZW5kQnVmZmVyLAotCQkJCSAgICBuZXREZXZpY2UtPlNlbmRCdWZmZXJTaXplLAotCQkJCSAgICAmbmV0RGV2aWNlLT5TZW5kQnVmZmVyR3BhZGxIYW5kbGUpOworCXJldCA9IHZtYnVzX2VzdGFibGlzaF9ncGFkbChkZXZpY2UtPmNoYW5uZWwsIG5ldF9kZXZpY2UtPnNlbmRfYnVmLAorCQkJCSAgICBuZXRfZGV2aWNlLT5zZW5kX2J1Zl9zaXplLAorCQkJCSAgICAmbmV0X2RldmljZS0+c2VuZF9idWZfZ3BhZGxfaGFuZGxlKTsKIAlpZiAocmV0ICE9IDApIHsKIAkJRFBSSU5UX0VSUihORVRWU0MsICJ1bmFibGUgdG8gZXN0YWJsaXNoIHNlbmQgYnVmZmVyJ3MgZ3BhZGwiKTsKIAkJZ290byBDbGVhbnVwOwogCX0KIAotCS8qIG9zZF9XYWl0RXZlbnRXYWl0KGV4dC0+Q2hhbm5lbEluaXRFdmVudCk7ICovCisJLyogb3NkX3dhaXRldmVudF93YWl0KGV4dC0+Q2hhbm5lbEluaXRFdmVudCk7ICovCiAKIAkvKiBOb3RpZnkgdGhlIE5ldFZzcCBvZiB0aGUgZ3BhZGwgaGFuZGxlICovCiAJRFBSSU5UX0lORk8oTkVUVlNDLCAiU2VuZGluZyBOdnNwTWVzc2FnZTFUeXBlU2VuZFNlbmRCdWZmZXIuLi4iKTsKIAotCWluaXRQYWNrZXQgPSAmbmV0RGV2aWNlLT5DaGFubmVsSW5pdFBhY2tldDsKKwlpbml0X3BhY2tldCA9ICZuZXRfZGV2aWNlLT5jaGFubmVsX2luaXRfcGt0OwogCi0JbWVtc2V0KGluaXRQYWNrZXQsIDAsIHNpemVvZihzdHJ1Y3QgbnZzcF9tZXNzYWdlKSk7CisJbWVtc2V0KGluaXRfcGFja2V0LCAwLCBzaXplb2Yoc3RydWN0IG52c3BfbWVzc2FnZSkpOwogCi0JaW5pdFBhY2tldC0+SGVhZGVyLk1lc3NhZ2VUeXBlID0gTnZzcE1lc3NhZ2UxVHlwZVNlbmRTZW5kQnVmZmVyOwotCWluaXRQYWNrZXQtPk1lc3NhZ2VzLlZlcnNpb24xTWVzc2FnZXMuU2VuZFJlY2VpdmVCdWZmZXIuR3BhZGxIYW5kbGUgPSBuZXREZXZpY2UtPlNlbmRCdWZmZXJHcGFkbEhhbmRsZTsKLQlpbml0UGFja2V0LT5NZXNzYWdlcy5WZXJzaW9uMU1lc3NhZ2VzLlNlbmRSZWNlaXZlQnVmZmVyLklkID0gTkVUVlNDX1NFTkRfQlVGRkVSX0lEOworCWluaXRfcGFja2V0LT5oZHIubXNnX3R5cGUgPSBOVlNQX01TRzFfVFlQRV9TRU5EX1NFTkRfQlVGOworCWluaXRfcGFja2V0LT5tc2cudjFfbXNnLnNlbmRfcmVjdl9idWYuCisJCWdwYWRsX2hhbmRsZSA9IG5ldF9kZXZpY2UtPnNlbmRfYnVmX2dwYWRsX2hhbmRsZTsKKwlpbml0X3BhY2tldC0+bXNnLnYxX21zZy5zZW5kX3JlY3ZfYnVmLmlkID0KKwkJTkVUVlNDX1NFTkRfQlVGRkVSX0lEOwogCiAJLyogU2VuZCB0aGUgZ3BhZGwgbm90aWZpY2F0aW9uIHJlcXVlc3QgKi8KLQlyZXQgPSB2bWJ1c19zZW5kcGFja2V0KERldmljZS0+Y2hhbm5lbCwgaW5pdFBhY2tldCwKKwlyZXQgPSB2bWJ1c19zZW5kcGFja2V0KGRldmljZS0+Y2hhbm5lbCwgaW5pdF9wYWNrZXQsCiAJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBudnNwX21lc3NhZ2UpLAotCQkJICAgICAgICh1bnNpZ25lZCBsb25nKWluaXRQYWNrZXQsCisJCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpaW5pdF9wYWNrZXQsCiAJCQkgICAgICAgVm1idXNQYWNrZXRUeXBlRGF0YUluQmFuZCwKIAkJCSAgICAgICBWTUJVU19EQVRBX1BBQ0tFVF9GTEFHX0NPTVBMRVRJT05fUkVRVUVTVEVEKTsKIAlpZiAocmV0ICE9IDApIHsKQEAgLTQwMCwzMiArNDEyLDM1IEBACiAJCWdvdG8gQ2xlYW51cDsKIAl9CiAKLQlvc2RfV2FpdEV2ZW50V2FpdChuZXREZXZpY2UtPkNoYW5uZWxJbml0RXZlbnQpOworCW9zZF93YWl0ZXZlbnRfd2FpdChuZXRfZGV2aWNlLT5jaGFubmVsX2luaXRfZXZlbnQpOwogCiAJLyogQ2hlY2sgdGhlIHJlc3BvbnNlICovCi0JaWYgKGluaXRQYWNrZXQtPk1lc3NhZ2VzLlZlcnNpb24xTWVzc2FnZXMuU2VuZFNlbmRCdWZmZXJDb21wbGV0ZS5TdGF0dXMgIT0gTnZzcFN0YXR1c1N1Y2Nlc3MpIHsKKwlpZiAoaW5pdF9wYWNrZXQtPm1zZy52MV9tc2cuCisJICAgIHNlbmRfc2VuZF9idWZfY29tcGxldGUuc3RhdHVzICE9IE5WU1BfU1RBVF9TVUNDRVNTKSB7CiAJCURQUklOVF9FUlIoTkVUVlNDLCAiVW5hYmxlIHRvIGNvbXBsZXRlIHNlbmQgYnVmZmVyICIKIAkJCSAgICJpbml0aWFsemF0aW9uIHdpdGggTmV0VnNwIC0gc3RhdHVzICVkIiwKLQkJCSAgIGluaXRQYWNrZXQtPk1lc3NhZ2VzLlZlcnNpb24xTWVzc2FnZXMuU2VuZFNlbmRCdWZmZXJDb21wbGV0ZS5TdGF0dXMpOworCQkJICAgaW5pdF9wYWNrZXQtPm1zZy52MV9tc2cuCisJCQkgICBzZW5kX3NlbmRfYnVmX2NvbXBsZXRlLnN0YXR1cyk7CiAJCXJldCA9IC0xOwogCQlnb3RvIENsZWFudXA7CiAJfQogCi0JbmV0RGV2aWNlLT5TZW5kU2VjdGlvblNpemUgPSBpbml0UGFja2V0LT5NZXNzYWdlcy5WZXJzaW9uMU1lc3NhZ2VzLlNlbmRTZW5kQnVmZmVyQ29tcGxldGUuU2VjdGlvblNpemU7CisJbmV0X2RldmljZS0+c2VuZF9zZWN0aW9uX3NpemUgPSBpbml0X3BhY2tldC0+CisJbXNnLnYxX21zZy5zZW5kX3NlbmRfYnVmX2NvbXBsZXRlLnNlY3Rpb25fc2l6ZTsKIAogCWdvdG8gRXhpdDsKIAogQ2xlYW51cDoKLQlOZXRWc2NEZXN0cm95U2VuZEJ1ZmZlcihuZXREZXZpY2UpOworCW5ldHZzY19kZXN0cm95X3NlbmRfYnVmKG5ldF9kZXZpY2UpOwogCiBFeGl0OgotCVB1dE5ldERldmljZShEZXZpY2UpOworCXB1dF9uZXRfZGV2aWNlKGRldmljZSk7CiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBOZXRWc2NEZXN0cm95UmVjZWl2ZUJ1ZmZlcihzdHJ1Y3QgbmV0dnNjX2RldmljZSAqTmV0RGV2aWNlKQorc3RhdGljIGludCBuZXR2c2NfZGVzdHJveV9yZWN2X2J1ZihzdHJ1Y3QgbmV0dnNjX2RldmljZSAqbmV0X2RldmljZSkKIHsKLQlzdHJ1Y3QgbnZzcF9tZXNzYWdlICpyZXZva2VQYWNrZXQ7CisJc3RydWN0IG52c3BfbWVzc2FnZSAqcmV2b2tlX3BhY2tldDsKIAlpbnQgcmV0ID0gMDsKIAogCS8qCkBAIC00MzQsMjAgKzQ0OSwyMyBAQAogCSAqIE52c3BNZXNzYWdlMVR5cGVTZW5kUmVjZWl2ZUJ1ZmZlciBtc2cpIHRoZXJlZm9yZSwgd2UgbmVlZAogCSAqIHRvIHNlbmQgYSByZXZva2UgbXNnIGhlcmUKIAkgKi8KLQlpZiAoTmV0RGV2aWNlLT5SZWNlaXZlU2VjdGlvbkNvdW50KSB7CisJaWYgKG5ldF9kZXZpY2UtPnJlY3Zfc2VjdGlvbl9jbnQpIHsKIAkJRFBSSU5UX0lORk8oTkVUVlNDLAogCQkJICAgICJTZW5kaW5nIE52c3BNZXNzYWdlMVR5cGVSZXZva2VSZWNlaXZlQnVmZmVyLi4uIik7CiAKIAkJLyogU2VuZCB0aGUgcmV2b2tlIHJlY2VpdmUgYnVmZmVyICovCi0JCXJldm9rZVBhY2tldCA9ICZOZXREZXZpY2UtPlJldm9rZVBhY2tldDsKLQkJbWVtc2V0KHJldm9rZVBhY2tldCwgMCwgc2l6ZW9mKHN0cnVjdCBudnNwX21lc3NhZ2UpKTsKKwkJcmV2b2tlX3BhY2tldCA9ICZuZXRfZGV2aWNlLT5yZXZva2VfcGFja2V0OworCQltZW1zZXQocmV2b2tlX3BhY2tldCwgMCwgc2l6ZW9mKHN0cnVjdCBudnNwX21lc3NhZ2UpKTsKIAotCQlyZXZva2VQYWNrZXQtPkhlYWRlci5NZXNzYWdlVHlwZSA9IE52c3BNZXNzYWdlMVR5cGVSZXZva2VSZWNlaXZlQnVmZmVyOwotCQlyZXZva2VQYWNrZXQtPk1lc3NhZ2VzLlZlcnNpb24xTWVzc2FnZXMuUmV2b2tlUmVjZWl2ZUJ1ZmZlci5JZCA9IE5FVFZTQ19SRUNFSVZFX0JVRkZFUl9JRDsKKwkJcmV2b2tlX3BhY2tldC0+aGRyLm1zZ190eXBlID0KKwkJCU5WU1BfTVNHMV9UWVBFX1JFVk9LRV9SRUNWX0JVRjsKKwkJcmV2b2tlX3BhY2tldC0+bXNnLnYxX21zZy4KKwkJcmV2b2tlX3JlY3ZfYnVmLmlkID0gTkVUVlNDX1JFQ0VJVkVfQlVGRkVSX0lEOwogCi0JCXJldCA9IHZtYnVzX3NlbmRwYWNrZXQoTmV0RGV2aWNlLT5EZXZpY2UtPmNoYW5uZWwsIHJldm9rZVBhY2tldCwKKwkJcmV0ID0gdm1idXNfc2VuZHBhY2tldChuZXRfZGV2aWNlLT5kZXYtPmNoYW5uZWwsCisJCQkJICAgICAgIHJldm9rZV9wYWNrZXQsCiAJCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgbnZzcF9tZXNzYWdlKSwKLQkJCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpcmV2b2tlUGFja2V0LAorCQkJCSAgICAgICAodW5zaWduZWQgbG9uZylyZXZva2VfcGFja2V0LAogCQkJCSAgICAgICBWbWJ1c1BhY2tldFR5cGVEYXRhSW5CYW5kLCAwKTsKIAkJLyoKIAkJICogSWYgd2UgZmFpbGVkIGhlcmUsIHdlIG1pZ2h0IGFzIHdlbGwgcmV0dXJuIGFuZApAQCAtNDYxLDExICs0NzksMTEgQEAKIAl9CiAKIAkvKiBUZWFyZG93biB0aGUgZ3BhZGwgb24gdGhlIHZzcCBlbmQgKi8KLQlpZiAoTmV0RGV2aWNlLT5SZWNlaXZlQnVmZmVyR3BhZGxIYW5kbGUpIHsKKwlpZiAobmV0X2RldmljZS0+cmVjdl9idWZfZ3BhZGxfaGFuZGxlKSB7CiAJCURQUklOVF9JTkZPKE5FVFZTQywgIlRlYXJpbmcgZG93biByZWNlaXZlIGJ1ZmZlcidzIEdQQURMLi4uIik7CiAKLQkJcmV0ID0gdm1idXNfdGVhcmRvd25fZ3BhZGwoTmV0RGV2aWNlLT5EZXZpY2UtPmNoYW5uZWwsCi0JCQkJCSAgIE5ldERldmljZS0+UmVjZWl2ZUJ1ZmZlckdwYWRsSGFuZGxlKTsKKwkJcmV0ID0gdm1idXNfdGVhcmRvd25fZ3BhZGwobmV0X2RldmljZS0+ZGV2LT5jaGFubmVsLAorCQkJICAgbmV0X2RldmljZS0+cmVjdl9idWZfZ3BhZGxfaGFuZGxlKTsKIAogCQkvKiBJZiB3ZSBmYWlsZWQgaGVyZSwgd2UgbWlnaHQgYXMgd2VsbCByZXR1cm4gYW5kIGhhdmUgYSBsZWFrIHJhdGhlciB0aGFuIGNvbnRpbnVlIGFuZCBhIGJ1Z2NoayAqLwogCQlpZiAocmV0ICE9IDApIHsKQEAgLTQ3MywzMCArNDkxLDMwIEBACiAJCQkJICAgInVuYWJsZSB0byB0ZWFyZG93biByZWNlaXZlIGJ1ZmZlcidzIGdwYWRsIik7CiAJCQlyZXR1cm4gLTE7CiAJCX0KLQkJTmV0RGV2aWNlLT5SZWNlaXZlQnVmZmVyR3BhZGxIYW5kbGUgPSAwOworCQluZXRfZGV2aWNlLT5yZWN2X2J1Zl9ncGFkbF9oYW5kbGUgPSAwOwogCX0KIAotCWlmIChOZXREZXZpY2UtPlJlY2VpdmVCdWZmZXIpIHsKKwlpZiAobmV0X2RldmljZS0+cmVjdl9idWYpIHsKIAkJRFBSSU5UX0lORk8oTkVUVlNDLCAiRnJlZWluZyB1cCByZWNlaXZlIGJ1ZmZlci4uLiIpOwogCiAJCS8qIEZyZWUgdXAgdGhlIHJlY2VpdmUgYnVmZmVyICovCi0JCW9zZF9QYWdlRnJlZShOZXREZXZpY2UtPlJlY2VpdmVCdWZmZXIsCi0JCQkgICAgIE5ldERldmljZS0+UmVjZWl2ZUJ1ZmZlclNpemUgPj4gUEFHRV9TSElGVCk7Ci0JCU5ldERldmljZS0+UmVjZWl2ZUJ1ZmZlciA9IE5VTEw7CisJCW9zZF9wYWdlX2ZyZWUobmV0X2RldmljZS0+cmVjdl9idWYsCisJCQkgICAgIG5ldF9kZXZpY2UtPnJlY3ZfYnVmX3NpemUgPj4gUEFHRV9TSElGVCk7CisJCW5ldF9kZXZpY2UtPnJlY3ZfYnVmID0gTlVMTDsKIAl9CiAKLQlpZiAoTmV0RGV2aWNlLT5SZWNlaXZlU2VjdGlvbnMpIHsKLQkJTmV0RGV2aWNlLT5SZWNlaXZlU2VjdGlvbkNvdW50ID0gMDsKLQkJa2ZyZWUoTmV0RGV2aWNlLT5SZWNlaXZlU2VjdGlvbnMpOwotCQlOZXREZXZpY2UtPlJlY2VpdmVTZWN0aW9ucyA9IE5VTEw7CisJaWYgKG5ldF9kZXZpY2UtPnJlY3Zfc2VjdGlvbikgeworCQluZXRfZGV2aWNlLT5yZWN2X3NlY3Rpb25fY250ID0gMDsKKwkJa2ZyZWUobmV0X2RldmljZS0+cmVjdl9zZWN0aW9uKTsKKwkJbmV0X2RldmljZS0+cmVjdl9zZWN0aW9uID0gTlVMTDsKIAl9CiAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IE5ldFZzY0Rlc3Ryb3lTZW5kQnVmZmVyKHN0cnVjdCBuZXR2c2NfZGV2aWNlICpOZXREZXZpY2UpCitzdGF0aWMgaW50IG5ldHZzY19kZXN0cm95X3NlbmRfYnVmKHN0cnVjdCBuZXR2c2NfZGV2aWNlICpuZXRfZGV2aWNlKQogewotCXN0cnVjdCBudnNwX21lc3NhZ2UgKnJldm9rZVBhY2tldDsKKwlzdHJ1Y3QgbnZzcF9tZXNzYWdlICpyZXZva2VfcGFja2V0OwogCWludCByZXQgPSAwOwogCiAJLyoKQEAgLTUwNSwyMCArNTIzLDIzIEBACiAJICogIE52c3BNZXNzYWdlMVR5cGVTZW5kUmVjZWl2ZUJ1ZmZlciBtc2cpIHRoZXJlZm9yZSwgd2UgbmVlZAogCSAqICB0byBzZW5kIGEgcmV2b2tlIG1zZyBoZXJlCiAJICovCi0JaWYgKE5ldERldmljZS0+U2VuZFNlY3Rpb25TaXplKSB7CisJaWYgKG5ldF9kZXZpY2UtPnNlbmRfc2VjdGlvbl9zaXplKSB7CiAJCURQUklOVF9JTkZPKE5FVFZTQywKIAkJCSAgICAiU2VuZGluZyBOdnNwTWVzc2FnZTFUeXBlUmV2b2tlU2VuZEJ1ZmZlci4uLiIpOwogCiAJCS8qIFNlbmQgdGhlIHJldm9rZSBzZW5kIGJ1ZmZlciAqLwotCQlyZXZva2VQYWNrZXQgPSAmTmV0RGV2aWNlLT5SZXZva2VQYWNrZXQ7Ci0JCW1lbXNldChyZXZva2VQYWNrZXQsIDAsIHNpemVvZihzdHJ1Y3QgbnZzcF9tZXNzYWdlKSk7CisJCXJldm9rZV9wYWNrZXQgPSAmbmV0X2RldmljZS0+cmV2b2tlX3BhY2tldDsKKwkJbWVtc2V0KHJldm9rZV9wYWNrZXQsIDAsIHNpemVvZihzdHJ1Y3QgbnZzcF9tZXNzYWdlKSk7CiAKLQkJcmV2b2tlUGFja2V0LT5IZWFkZXIuTWVzc2FnZVR5cGUgPSBOdnNwTWVzc2FnZTFUeXBlUmV2b2tlU2VuZEJ1ZmZlcjsKLQkJcmV2b2tlUGFja2V0LT5NZXNzYWdlcy5WZXJzaW9uMU1lc3NhZ2VzLlJldm9rZVNlbmRCdWZmZXIuSWQgPSBORVRWU0NfU0VORF9CVUZGRVJfSUQ7CisJCXJldm9rZV9wYWNrZXQtPmhkci5tc2dfdHlwZSA9CisJCQlOVlNQX01TRzFfVFlQRV9SRVZPS0VfU0VORF9CVUY7CisJCXJldm9rZV9wYWNrZXQtPm1zZy52MV9tc2cuCisJCQlyZXZva2Vfc2VuZF9idWYuaWQgPSBORVRWU0NfU0VORF9CVUZGRVJfSUQ7CiAKLQkJcmV0ID0gdm1idXNfc2VuZHBhY2tldChOZXREZXZpY2UtPkRldmljZS0+Y2hhbm5lbCwgcmV2b2tlUGFja2V0LAorCQlyZXQgPSB2bWJ1c19zZW5kcGFja2V0KG5ldF9kZXZpY2UtPmRldi0+Y2hhbm5lbCwKKwkJCQkgICAgICAgcmV2b2tlX3BhY2tldCwKIAkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBudnNwX21lc3NhZ2UpLAotCQkJCSAgICAgICAodW5zaWduZWQgbG9uZylyZXZva2VQYWNrZXQsCisJCQkJICAgICAgICh1bnNpZ25lZCBsb25nKXJldm9rZV9wYWNrZXQsCiAJCQkJICAgICAgIFZtYnVzUGFja2V0VHlwZURhdGFJbkJhbmQsIDApOwogCQkvKgogCQkgKiBJZiB3ZSBmYWlsZWQgaGVyZSwgd2UgbWlnaHQgYXMgd2VsbCByZXR1cm4gYW5kIGhhdmUgYSBsZWFrCkBAIC01MzIsMTAgKzU1MywxMCBAQAogCX0KIAogCS8qIFRlYXJkb3duIHRoZSBncGFkbCBvbiB0aGUgdnNwIGVuZCAqLwotCWlmIChOZXREZXZpY2UtPlNlbmRCdWZmZXJHcGFkbEhhbmRsZSkgeworCWlmIChuZXRfZGV2aWNlLT5zZW5kX2J1Zl9ncGFkbF9oYW5kbGUpIHsKIAkJRFBSSU5UX0lORk8oTkVUVlNDLCAiVGVhcmluZyBkb3duIHNlbmQgYnVmZmVyJ3MgR1BBREwuLi4iKTsKLQkJcmV0ID0gdm1idXNfdGVhcmRvd25fZ3BhZGwoTmV0RGV2aWNlLT5EZXZpY2UtPmNoYW5uZWwsCi0JCQkJCSAgIE5ldERldmljZS0+U2VuZEJ1ZmZlckdwYWRsSGFuZGxlKTsKKwkJcmV0ID0gdm1idXNfdGVhcmRvd25fZ3BhZGwobmV0X2RldmljZS0+ZGV2LT5jaGFubmVsLAorCQkJCQkgICBuZXRfZGV2aWNlLT5zZW5kX2J1Zl9ncGFkbF9oYW5kbGUpOwogCiAJCS8qCiAJCSAqIElmIHdlIGZhaWxlZCBoZXJlLCB3ZSBtaWdodCBhcyB3ZWxsIHJldHVybiBhbmQgaGF2ZSBhIGxlYWsKQEAgLTU0Niw0OSArNTY3LDUxIEBACiAJCQkJICAgImdwYWRsIik7CiAJCQlyZXR1cm4gLTE7CiAJCX0KLQkJTmV0RGV2aWNlLT5TZW5kQnVmZmVyR3BhZGxIYW5kbGUgPSAwOworCQluZXRfZGV2aWNlLT5zZW5kX2J1Zl9ncGFkbF9oYW5kbGUgPSAwOwogCX0KIAotCWlmIChOZXREZXZpY2UtPlNlbmRCdWZmZXIpIHsKKwlpZiAobmV0X2RldmljZS0+c2VuZF9idWYpIHsKIAkJRFBSSU5UX0lORk8oTkVUVlNDLCAiRnJlZWluZyB1cCBzZW5kIGJ1ZmZlci4uLiIpOwogCiAJCS8qIEZyZWUgdXAgdGhlIHJlY2VpdmUgYnVmZmVyICovCi0JCW9zZF9QYWdlRnJlZShOZXREZXZpY2UtPlNlbmRCdWZmZXIsCi0JCQkgICAgIE5ldERldmljZS0+U2VuZEJ1ZmZlclNpemUgPj4gUEFHRV9TSElGVCk7Ci0JCU5ldERldmljZS0+U2VuZEJ1ZmZlciA9IE5VTEw7CisJCW9zZF9wYWdlX2ZyZWUobmV0X2RldmljZS0+c2VuZF9idWYsCisJCQkgICAgIG5ldF9kZXZpY2UtPnNlbmRfYnVmX3NpemUgPj4gUEFHRV9TSElGVCk7CisJCW5ldF9kZXZpY2UtPnNlbmRfYnVmID0gTlVMTDsKIAl9CiAKIAlyZXR1cm4gcmV0OwogfQogCiAKLXN0YXRpYyBpbnQgTmV0VnNjQ29ubmVjdFRvVnNwKHN0cnVjdCBodl9kZXZpY2UgKkRldmljZSkKK3N0YXRpYyBpbnQgbmV0dnNjX2Nvbm5lY3RfdnNwKHN0cnVjdCBodl9kZXZpY2UgKmRldmljZSkKIHsKIAlpbnQgcmV0OwotCXN0cnVjdCBuZXR2c2NfZGV2aWNlICpuZXREZXZpY2U7Ci0Jc3RydWN0IG52c3BfbWVzc2FnZSAqaW5pdFBhY2tldDsKLQlpbnQgbmRpc1ZlcnNpb247CisJc3RydWN0IG5ldHZzY19kZXZpY2UgKm5ldF9kZXZpY2U7CisJc3RydWN0IG52c3BfbWVzc2FnZSAqaW5pdF9wYWNrZXQ7CisJaW50IG5kaXNfdmVyc2lvbjsKIAotCW5ldERldmljZSA9IEdldE91dGJvdW5kTmV0RGV2aWNlKERldmljZSk7Ci0JaWYgKCFuZXREZXZpY2UpIHsKKwluZXRfZGV2aWNlID0gZ2V0X291dGJvdW5kX25ldF9kZXZpY2UoZGV2aWNlKTsKKwlpZiAoIW5ldF9kZXZpY2UpIHsKIAkJRFBSSU5UX0VSUihORVRWU0MsICJ1bmFibGUgdG8gZ2V0IG5ldCBkZXZpY2UuLi4iCiAJCQkgICAiZGV2aWNlIGJlaW5nIGRlc3Ryb3llZD8iKTsKIAkJcmV0dXJuIC0xOwogCX0KIAotCWluaXRQYWNrZXQgPSAmbmV0RGV2aWNlLT5DaGFubmVsSW5pdFBhY2tldDsKKwlpbml0X3BhY2tldCA9ICZuZXRfZGV2aWNlLT5jaGFubmVsX2luaXRfcGt0OwogCi0JbWVtc2V0KGluaXRQYWNrZXQsIDAsIHNpemVvZihzdHJ1Y3QgbnZzcF9tZXNzYWdlKSk7Ci0JaW5pdFBhY2tldC0+SGVhZGVyLk1lc3NhZ2VUeXBlID0gTnZzcE1lc3NhZ2VUeXBlSW5pdDsKLQlpbml0UGFja2V0LT5NZXNzYWdlcy5Jbml0TWVzc2FnZXMuSW5pdC5NaW5Qcm90b2NvbFZlcnNpb24gPSBOVlNQX01JTl9QUk9UT0NPTF9WRVJTSU9OOwotCWluaXRQYWNrZXQtPk1lc3NhZ2VzLkluaXRNZXNzYWdlcy5Jbml0Lk1heFByb3RvY29sVmVyc2lvbiA9IE5WU1BfTUFYX1BST1RPQ09MX1ZFUlNJT047CisJbWVtc2V0KGluaXRfcGFja2V0LCAwLCBzaXplb2Yoc3RydWN0IG52c3BfbWVzc2FnZSkpOworCWluaXRfcGFja2V0LT5oZHIubXNnX3R5cGUgPSBOVlNQX01TR19UWVBFX0lOSVQ7CisJaW5pdF9wYWNrZXQtPm1zZy5pbml0X21zZy5pbml0Lm1pbl9wcm90b2NvbF92ZXIgPQorCQlOVlNQX01JTl9QUk9UT0NPTF9WRVJTSU9OOworCWluaXRfcGFja2V0LT5tc2cuaW5pdF9tc2cuaW5pdC5tYXhfcHJvdG9jb2xfdmVyID0KKwkJTlZTUF9NQVhfUFJPVE9DT0xfVkVSU0lPTjsKIAogCURQUklOVF9JTkZPKE5FVFZTQywgIlNlbmRpbmcgTnZzcE1lc3NhZ2VUeXBlSW5pdC4uLiIpOwogCiAJLyogU2VuZCB0aGUgaW5pdCByZXF1ZXN0ICovCi0JcmV0ID0gdm1idXNfc2VuZHBhY2tldChEZXZpY2UtPmNoYW5uZWwsIGluaXRQYWNrZXQsCisJcmV0ID0gdm1idXNfc2VuZHBhY2tldChkZXZpY2UtPmNoYW5uZWwsIGluaXRfcGFja2V0LAogCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgbnZzcF9tZXNzYWdlKSwKLQkJCSAgICAgICAodW5zaWduZWQgbG9uZylpbml0UGFja2V0LAorCQkJICAgICAgICh1bnNpZ25lZCBsb25nKWluaXRfcGFja2V0LAogCQkJICAgICAgIFZtYnVzUGFja2V0VHlwZURhdGFJbkJhbmQsCiAJCQkgICAgICAgVk1CVVNfREFUQV9QQUNLRVRfRkxBR19DT01QTEVUSU9OX1JFUVVFU1RFRCk7CiAKQEAgLTU5Nyw0NyArNjIwLDUyIEBACiAJCWdvdG8gQ2xlYW51cDsKIAl9CiAKLQlvc2RfV2FpdEV2ZW50V2FpdChuZXREZXZpY2UtPkNoYW5uZWxJbml0RXZlbnQpOworCW9zZF93YWl0ZXZlbnRfd2FpdChuZXRfZGV2aWNlLT5jaGFubmVsX2luaXRfZXZlbnQpOwogCiAJLyogTm93LCBjaGVjayB0aGUgcmVzcG9uc2UgKi8KIAkvKiBBU1NFUlQoaW5pdFBhY2tldC0+TWVzc2FnZXMuSW5pdE1lc3NhZ2VzLkluaXRDb21wbGV0ZS5NYXhpbXVtTWRsQ2hhaW5MZW5ndGggPD0gTUFYX01VTFRJUEFHRV9CVUZGRVJfQ09VTlQpOyAqLwogCURQUklOVF9JTkZPKE5FVFZTQywgIk52c3BNZXNzYWdlVHlwZUluaXQgc3RhdHVzKCVkKSBtYXggbWRsIGNoYWluICglZCkiLAotCQlpbml0UGFja2V0LT5NZXNzYWdlcy5Jbml0TWVzc2FnZXMuSW5pdENvbXBsZXRlLlN0YXR1cywKLQkJaW5pdFBhY2tldC0+TWVzc2FnZXMuSW5pdE1lc3NhZ2VzLkluaXRDb21wbGV0ZS5NYXhpbXVtTWRsQ2hhaW5MZW5ndGgpOworCQlpbml0X3BhY2tldC0+bXNnLmluaXRfbXNnLmluaXRfY29tcGxldGUuc3RhdHVzLAorCQlpbml0X3BhY2tldC0+bXNnLmluaXRfbXNnLgorCQkgICAgaW5pdF9jb21wbGV0ZS5tYXhfbWRsX2NoYWluX2xlbik7CiAKLQlpZiAoaW5pdFBhY2tldC0+TWVzc2FnZXMuSW5pdE1lc3NhZ2VzLkluaXRDb21wbGV0ZS5TdGF0dXMgIT0KLQkgICAgTnZzcFN0YXR1c1N1Y2Nlc3MpIHsKKwlpZiAoaW5pdF9wYWNrZXQtPm1zZy5pbml0X21zZy5pbml0X2NvbXBsZXRlLnN0YXR1cyAhPQorCSAgICBOVlNQX1NUQVRfU1VDQ0VTUykgewogCQlEUFJJTlRfRVJSKE5FVFZTQywKIAkJCSJ1bmFibGUgdG8gaW5pdGlhbGl6ZSB3aXRoIG5ldHZzcCAoc3RhdHVzIDB4JXgpIiwKLQkJCWluaXRQYWNrZXQtPk1lc3NhZ2VzLkluaXRNZXNzYWdlcy5Jbml0Q29tcGxldGUuU3RhdHVzKTsKKwkJCWluaXRfcGFja2V0LT5tc2cuaW5pdF9tc2cuaW5pdF9jb21wbGV0ZS5zdGF0dXMpOwogCQlyZXQgPSAtMTsKIAkJZ290byBDbGVhbnVwOwogCX0KIAotCWlmIChpbml0UGFja2V0LT5NZXNzYWdlcy5Jbml0TWVzc2FnZXMuSW5pdENvbXBsZXRlLk5lZ290aWF0ZWRQcm90b2NvbFZlcnNpb24gIT0gTlZTUF9QUk9UT0NPTF9WRVJTSU9OXzEpIHsKKwlpZiAoaW5pdF9wYWNrZXQtPm1zZy5pbml0X21zZy5pbml0X2NvbXBsZXRlLgorCSAgICBuZWdvdGlhdGVkX3Byb3RvY29sX3ZlciAhPSBOVlNQX1BST1RPQ09MX1ZFUlNJT05fMSkgewogCQlEUFJJTlRfRVJSKE5FVFZTQywgInVuYWJsZSB0byBpbml0aWFsaXplIHdpdGggbmV0dnNwICIKIAkJCSAgICIodmVyc2lvbiBleHBlY3RlZCAxIGdvdCAlZCkiLAotCQkJICAgaW5pdFBhY2tldC0+TWVzc2FnZXMuSW5pdE1lc3NhZ2VzLkluaXRDb21wbGV0ZS5OZWdvdGlhdGVkUHJvdG9jb2xWZXJzaW9uKTsKKwkJCSAgIGluaXRfcGFja2V0LT5tc2cuaW5pdF9tc2cuCisJCQkgICBpbml0X2NvbXBsZXRlLm5lZ290aWF0ZWRfcHJvdG9jb2xfdmVyKTsKIAkJcmV0ID0gLTE7CiAJCWdvdG8gQ2xlYW51cDsKIAl9CiAJRFBSSU5UX0lORk8oTkVUVlNDLCAiU2VuZGluZyBOdnNwTWVzc2FnZTFUeXBlU2VuZE5kaXNWZXJzaW9uLi4uIik7CiAKIAkvKiBTZW5kIHRoZSBuZGlzIHZlcnNpb24gKi8KLQltZW1zZXQoaW5pdFBhY2tldCwgMCwgc2l6ZW9mKHN0cnVjdCBudnNwX21lc3NhZ2UpKTsKKwltZW1zZXQoaW5pdF9wYWNrZXQsIDAsIHNpemVvZihzdHJ1Y3QgbnZzcF9tZXNzYWdlKSk7CiAKLQluZGlzVmVyc2lvbiA9IDB4MDAwNTAwMDA7CisJbmRpc192ZXJzaW9uID0gMHgwMDA1MDAwMDsKIAotCWluaXRQYWNrZXQtPkhlYWRlci5NZXNzYWdlVHlwZSA9IE52c3BNZXNzYWdlMVR5cGVTZW5kTmRpc1ZlcnNpb247Ci0JaW5pdFBhY2tldC0+TWVzc2FnZXMuVmVyc2lvbjFNZXNzYWdlcy5TZW5kTmRpc1ZlcnNpb24uTmRpc01ham9yVmVyc2lvbiA9Ci0JCQkJKG5kaXNWZXJzaW9uICYgMHhGRkZGMDAwMCkgPj4gMTY7Ci0JaW5pdFBhY2tldC0+TWVzc2FnZXMuVmVyc2lvbjFNZXNzYWdlcy5TZW5kTmRpc1ZlcnNpb24uTmRpc01pbm9yVmVyc2lvbiA9Ci0JCQkJbmRpc1ZlcnNpb24gJiAweEZGRkY7CisJaW5pdF9wYWNrZXQtPmhkci5tc2dfdHlwZSA9IE5WU1BfTVNHMV9UWVBFX1NFTkRfTkRJU19WRVI7CisJaW5pdF9wYWNrZXQtPm1zZy52MV9tc2cuCisJCXNlbmRfbmRpc192ZXIubmRpc19tYWpvcl92ZXIgPQorCQkJCShuZGlzX3ZlcnNpb24gJiAweEZGRkYwMDAwKSA+PiAxNjsKKwlpbml0X3BhY2tldC0+bXNnLnYxX21zZy4KKwkJc2VuZF9uZGlzX3Zlci5uZGlzX21pbm9yX3ZlciA9CisJCQkJbmRpc192ZXJzaW9uICYgMHhGRkZGOwogCiAJLyogU2VuZCB0aGUgaW5pdCByZXF1ZXN0ICovCi0JcmV0ID0gdm1idXNfc2VuZHBhY2tldChEZXZpY2UtPmNoYW5uZWwsIGluaXRQYWNrZXQsCisJcmV0ID0gdm1idXNfc2VuZHBhY2tldChkZXZpY2UtPmNoYW5uZWwsIGluaXRfcGFja2V0LAogCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgbnZzcF9tZXNzYWdlKSwKLQkJCSAgICAgICAodW5zaWduZWQgbG9uZylpbml0UGFja2V0LAorCQkJICAgICAgICh1bnNpZ25lZCBsb25nKWluaXRfcGFja2V0LAogCQkJICAgICAgIFZtYnVzUGFja2V0VHlwZURhdGFJbkJhbmQsIDApOwogCWlmIChyZXQgIT0gMCkgewogCQlEUFJJTlRfRVJSKE5FVFZTQywKQEAgLTY1MSw1MSArNjc5LDUyIEBACiAJICogcGFja2V0KSBzaW5jZSBvdXIgVm1idXMgYWx3YXlzIHNldCB0aGUKIAkgKiBWTUJVU19EQVRBX1BBQ0tFVF9GTEFHX0NPTVBMRVRJT05fUkVRVUVTVEVEIGZsYWcKIAkgKi8KLQkgLyogb3NkX1dhaXRFdmVudFdhaXQoTmV0VnNjQ2hhbm5lbC0+Q2hhbm5lbEluaXRFdmVudCk7ICovCisJIC8qIG9zZF93YWl0ZXZlbnRfd2FpdChOZXRWc2NDaGFubmVsLT5DaGFubmVsSW5pdEV2ZW50KTsgKi8KIAogCS8qIFBvc3QgdGhlIGJpZyByZWNlaXZlIGJ1ZmZlciB0byBOZXRWU1AgKi8KLQlyZXQgPSBOZXRWc2NJbml0aWFsaXplUmVjZWl2ZUJ1ZmZlcldpdGhOZXRWc3AoRGV2aWNlKTsKKwlyZXQgPSBuZXR2c2NfaW5pdF9yZWN2X2J1ZihkZXZpY2UpOwogCWlmIChyZXQgPT0gMCkKLQkJcmV0ID0gTmV0VnNjSW5pdGlhbGl6ZVNlbmRCdWZmZXJXaXRoTmV0VnNwKERldmljZSk7CisJCXJldCA9IG5ldHZzY19pbml0X3NlbmRfYnVmKGRldmljZSk7CiAKIENsZWFudXA6Ci0JUHV0TmV0RGV2aWNlKERldmljZSk7CisJcHV0X25ldF9kZXZpY2UoZGV2aWNlKTsKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgdm9pZCBOZXRWc2NEaXNjb25uZWN0RnJvbVZzcChzdHJ1Y3QgbmV0dnNjX2RldmljZSAqTmV0RGV2aWNlKQorc3RhdGljIHZvaWQgTmV0VnNjRGlzY29ubmVjdEZyb21Wc3Aoc3RydWN0IG5ldHZzY19kZXZpY2UgKm5ldF9kZXZpY2UpCiB7Ci0JTmV0VnNjRGVzdHJveVJlY2VpdmVCdWZmZXIoTmV0RGV2aWNlKTsKLQlOZXRWc2NEZXN0cm95U2VuZEJ1ZmZlcihOZXREZXZpY2UpOworCW5ldHZzY19kZXN0cm95X3JlY3ZfYnVmKG5ldF9kZXZpY2UpOworCW5ldHZzY19kZXN0cm95X3NlbmRfYnVmKG5ldF9kZXZpY2UpOwogfQogCiAvKgotICogTmV0VnNjT25EZXZpY2VBZGQgLSBDYWxsYmFjayB3aGVuIHRoZSBkZXZpY2UgYmVsb25naW5nIHRvIHRoaXMgZHJpdmVyIGlzIGFkZGVkCisgKiBuZXR2c2NfZGV2aWNlX2FkZCAtIENhbGxiYWNrIHdoZW4gdGhlIGRldmljZSBiZWxvbmdpbmcgdG8gdGhpcworICogZHJpdmVyIGlzIGFkZGVkCiAgKi8KLXN0YXRpYyBpbnQgTmV0VnNjT25EZXZpY2VBZGQoc3RydWN0IGh2X2RldmljZSAqRGV2aWNlLCB2b2lkICpBZGRpdGlvbmFsSW5mbykKK3N0YXRpYyBpbnQgbmV0dnNjX2RldmljZV9hZGQoc3RydWN0IGh2X2RldmljZSAqZGV2aWNlLCB2b2lkICphZGRpdGlvbmFsX2luZm8pCiB7CiAJaW50IHJldCA9IDA7CiAJaW50IGk7Ci0Jc3RydWN0IG5ldHZzY19kZXZpY2UgKm5ldERldmljZTsKKwlzdHJ1Y3QgbmV0dnNjX2RldmljZSAqbmV0X2RldmljZTsKIAlzdHJ1Y3QgaHZfbmV0dnNjX3BhY2tldCAqcGFja2V0LCAqcG9zOwotCXN0cnVjdCBuZXR2c2NfZHJpdmVyICpuZXREcml2ZXIgPQotCQkJCShzdHJ1Y3QgbmV0dnNjX2RyaXZlciAqKURldmljZS0+RHJpdmVyOworCXN0cnVjdCBuZXR2c2NfZHJpdmVyICpuZXRfZHJpdmVyID0KKwkJCQkoc3RydWN0IG5ldHZzY19kcml2ZXIgKilkZXZpY2UtPkRyaXZlcjsKIAotCW5ldERldmljZSA9IEFsbG9jTmV0RGV2aWNlKERldmljZSk7Ci0JaWYgKCFuZXREZXZpY2UpIHsKKwluZXRfZGV2aWNlID0gYWxsb2NfbmV0X2RldmljZShkZXZpY2UpOworCWlmICghbmV0X2RldmljZSkgewogCQlyZXQgPSAtMTsKIAkJZ290byBDbGVhbnVwOwogCX0KIAotCURQUklOVF9EQkcoTkVUVlNDLCAibmV0dnNjIGNoYW5uZWwgb2JqZWN0IGFsbG9jYXRlZCAtICVwIiwgbmV0RGV2aWNlKTsKKwlEUFJJTlRfREJHKE5FVFZTQywgIm5ldHZzYyBjaGFubmVsIG9iamVjdCBhbGxvY2F0ZWQgLSAlcCIsIG5ldF9kZXZpY2UpOwogCiAJLyogSW5pdGlhbGl6ZSB0aGUgTmV0VlNDIGNoYW5uZWwgZXh0ZW5zaW9uICovCi0JbmV0RGV2aWNlLT5SZWNlaXZlQnVmZmVyU2l6ZSA9IE5FVFZTQ19SRUNFSVZFX0JVRkZFUl9TSVpFOwotCXNwaW5fbG9ja19pbml0KCZuZXREZXZpY2UtPnJlY2VpdmVfcGFja2V0X2xpc3RfbG9jayk7CisJbmV0X2RldmljZS0+cmVjdl9idWZfc2l6ZSA9IE5FVFZTQ19SRUNFSVZFX0JVRkZFUl9TSVpFOworCXNwaW5fbG9ja19pbml0KCZuZXRfZGV2aWNlLT5yZWN2X3BrdF9saXN0X2xvY2spOwogCi0JbmV0RGV2aWNlLT5TZW5kQnVmZmVyU2l6ZSA9IE5FVFZTQ19TRU5EX0JVRkZFUl9TSVpFOworCW5ldF9kZXZpY2UtPnNlbmRfYnVmX3NpemUgPSBORVRWU0NfU0VORF9CVUZGRVJfU0laRTsKIAotCUlOSVRfTElTVF9IRUFEKCZuZXREZXZpY2UtPlJlY2VpdmVQYWNrZXRMaXN0KTsKKwlJTklUX0xJU1RfSEVBRCgmbmV0X2RldmljZS0+cmVjdl9wa3RfbGlzdCk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgTkVUVlNDX1JFQ0VJVkVfUEFDS0VUTElTVF9DT1VOVDsgaSsrKSB7CiAJCXBhY2tldCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBodl9uZXR2c2NfcGFja2V0KSArCkBAIC03MDcsMTkgKzczNiwxOSBAQAogCQkJCSAgIE5FVFZTQ19SRUNFSVZFX1BBQ0tFVExJU1RfQ09VTlQsIGkpOwogCQkJYnJlYWs7CiAJCX0KLQkJbGlzdF9hZGRfdGFpbCgmcGFja2V0LT5MaXN0RW50cnksCi0JCQkgICAgICAmbmV0RGV2aWNlLT5SZWNlaXZlUGFja2V0TGlzdCk7CisJCWxpc3RfYWRkX3RhaWwoJnBhY2tldC0+bGlzdF9lbnQsCisJCQkgICAgICAmbmV0X2RldmljZS0+cmVjdl9wa3RfbGlzdCk7CiAJfQotCW5ldERldmljZS0+Q2hhbm5lbEluaXRFdmVudCA9IG9zZF9XYWl0RXZlbnRDcmVhdGUoKTsKLQlpZiAoIW5ldERldmljZS0+Q2hhbm5lbEluaXRFdmVudCkgeworCW5ldF9kZXZpY2UtPmNoYW5uZWxfaW5pdF9ldmVudCA9IG9zZF93YWl0ZXZlbnRfY3JlYXRlKCk7CisJaWYgKCFuZXRfZGV2aWNlLT5jaGFubmVsX2luaXRfZXZlbnQpIHsKIAkJcmV0ID0gLUVOT01FTTsKIAkJZ290byBDbGVhbnVwOwogCX0KIAogCS8qIE9wZW4gdGhlIGNoYW5uZWwgKi8KLQlyZXQgPSB2bWJ1c19vcGVuKERldmljZS0+Y2hhbm5lbCwgbmV0RHJpdmVyLT5SaW5nQnVmZmVyU2l6ZSwKLQkJCSBuZXREcml2ZXItPlJpbmdCdWZmZXJTaXplLCBOVUxMLCAwLAotCQkJIE5ldFZzY09uQ2hhbm5lbENhbGxiYWNrLCBEZXZpY2UpOworCXJldCA9IHZtYnVzX29wZW4oZGV2aWNlLT5jaGFubmVsLCBuZXRfZHJpdmVyLT5yaW5nX2J1Zl9zaXplLAorCQkJIG5ldF9kcml2ZXItPnJpbmdfYnVmX3NpemUsIE5VTEwsIDAsCisJCQkgbmV0dnNjX2NoYW5uZWxfY2IsIGRldmljZSk7CiAKIAlpZiAocmV0ICE9IDApIHsKIAkJRFBSSU5UX0VSUihORVRWU0MsICJ1bmFibGUgdG8gb3BlbiBjaGFubmVsOiAlZCIsIHJldCk7CkBAIC03MzEsNyArNzYwLDcgQEAKIAlEUFJJTlRfSU5GTyhORVRWU0MsICIqKiogTmV0VlNDIGNoYW5uZWwgb3BlbmVkIHN1Y2Nlc3NmdWxseSEgKioqIik7CiAKIAkvKiBDb25uZWN0IHdpdGggdGhlIE5ldFZzcCAqLwotCXJldCA9IE5ldFZzY0Nvbm5lY3RUb1ZzcChEZXZpY2UpOworCXJldCA9IG5ldHZzY19jb25uZWN0X3ZzcChkZXZpY2UpOwogCWlmIChyZXQgIT0gMCkgewogCQlEUFJJTlRfRVJSKE5FVFZTQywgInVuYWJsZSB0byBjb25uZWN0IHRvIE5ldFZTUCAtICVkIiwgcmV0KTsKIAkJcmV0ID0gLTE7CkBAIC03NDUsMTc0ICs3NzQsMTc4IEBACiAKIGNsb3NlOgogCS8qIE5vdywgd2UgY2FuIGNsb3NlIHRoZSBjaGFubmVsIHNhZmVseSAqLwotCXZtYnVzX2Nsb3NlKERldmljZS0+Y2hhbm5lbCk7CisJdm1idXNfY2xvc2UoZGV2aWNlLT5jaGFubmVsKTsKIAogQ2xlYW51cDoKIAotCWlmIChuZXREZXZpY2UpIHsKLQkJa2ZyZWUobmV0RGV2aWNlLT5DaGFubmVsSW5pdEV2ZW50KTsKKwlpZiAobmV0X2RldmljZSkgeworCQlrZnJlZShuZXRfZGV2aWNlLT5jaGFubmVsX2luaXRfZXZlbnQpOwogCiAJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwYWNrZXQsIHBvcywKLQkJCQkJICZuZXREZXZpY2UtPlJlY2VpdmVQYWNrZXRMaXN0LAotCQkJCQkgTGlzdEVudHJ5KSB7Ci0JCQlsaXN0X2RlbCgmcGFja2V0LT5MaXN0RW50cnkpOworCQkJCQkgJm5ldF9kZXZpY2UtPnJlY3ZfcGt0X2xpc3QsCisJCQkJCSBsaXN0X2VudCkgeworCQkJbGlzdF9kZWwoJnBhY2tldC0+bGlzdF9lbnQpOwogCQkJa2ZyZWUocGFja2V0KTsKIAkJfQogCi0JCVJlbGVhc2VPdXRib3VuZE5ldERldmljZShEZXZpY2UpOwotCQlSZWxlYXNlSW5ib3VuZE5ldERldmljZShEZXZpY2UpOworCQlyZWxlYXNlX291dGJvdW5kX25ldF9kZXZpY2UoZGV2aWNlKTsKKwkJcmVsZWFzZV9pbmJvdW5kX25ldF9kZXZpY2UoZGV2aWNlKTsKIAotCQlGcmVlTmV0RGV2aWNlKG5ldERldmljZSk7CisJCWZyZWVfbmV0X2RldmljZShuZXRfZGV2aWNlKTsKIAl9CiAKIAlyZXR1cm4gcmV0OwogfQogCiAvKgotICogTmV0VnNjT25EZXZpY2VSZW1vdmUgLSBDYWxsYmFjayB3aGVuIHRoZSByb290IGJ1cyBkZXZpY2UgaXMgcmVtb3ZlZAorICogbmV0dnNjX2RldmljZV9yZW1vdmUgLSBDYWxsYmFjayB3aGVuIHRoZSByb290IGJ1cyBkZXZpY2UgaXMgcmVtb3ZlZAogICovCi1zdGF0aWMgaW50IE5ldFZzY09uRGV2aWNlUmVtb3ZlKHN0cnVjdCBodl9kZXZpY2UgKkRldmljZSkKK3N0YXRpYyBpbnQgbmV0dnNjX2RldmljZV9yZW1vdmUoc3RydWN0IGh2X2RldmljZSAqZGV2aWNlKQogewotCXN0cnVjdCBuZXR2c2NfZGV2aWNlICpuZXREZXZpY2U7Ci0Jc3RydWN0IGh2X25ldHZzY19wYWNrZXQgKm5ldHZzY1BhY2tldCwgKnBvczsKKwlzdHJ1Y3QgbmV0dnNjX2RldmljZSAqbmV0X2RldmljZTsKKwlzdHJ1Y3QgaHZfbmV0dnNjX3BhY2tldCAqbmV0dnNjX3BhY2tldCwgKnBvczsKIAogCURQUklOVF9JTkZPKE5FVFZTQywgIkRpc2FibGluZyBvdXRib3VuZCB0cmFmZmljIG9uIG5ldCBkZXZpY2UgKCVwKS4uLiIsCi0JCSAgICBEZXZpY2UtPkV4dGVuc2lvbik7CisJCSAgICBkZXZpY2UtPkV4dGVuc2lvbik7CiAKIAkvKiBTdG9wIG91dGJvdW5kIHRyYWZmaWMgaWUgc2VuZHMgYW5kIHJlY2VpdmVzIGNvbXBsZXRpb25zICovCi0JbmV0RGV2aWNlID0gUmVsZWFzZU91dGJvdW5kTmV0RGV2aWNlKERldmljZSk7Ci0JaWYgKCFuZXREZXZpY2UpIHsKKwluZXRfZGV2aWNlID0gcmVsZWFzZV9vdXRib3VuZF9uZXRfZGV2aWNlKGRldmljZSk7CisJaWYgKCFuZXRfZGV2aWNlKSB7CiAJCURQUklOVF9FUlIoTkVUVlNDLCAiTm8gbmV0IGRldmljZSBwcmVzZW50ISEiKTsKIAkJcmV0dXJuIC0xOwogCX0KIAogCS8qIFdhaXQgZm9yIGFsbCBzZW5kIGNvbXBsZXRpb25zICovCi0Jd2hpbGUgKGF0b21pY19yZWFkKCZuZXREZXZpY2UtPk51bU91dHN0YW5kaW5nU2VuZHMpKSB7CisJd2hpbGUgKGF0b21pY19yZWFkKCZuZXRfZGV2aWNlLT5udW1fb3V0c3RhbmRpbmdfc2VuZHMpKSB7CiAJCURQUklOVF9JTkZPKE5FVFZTQywgIndhaXRpbmcgZm9yICVkIHJlcXVlc3RzIHRvIGNvbXBsZXRlLi4uIiwKLQkJCSAgICBhdG9taWNfcmVhZCgmbmV0RGV2aWNlLT5OdW1PdXRzdGFuZGluZ1NlbmRzKSk7CisJCQkgICAgYXRvbWljX3JlYWQoJm5ldF9kZXZpY2UtPm51bV9vdXRzdGFuZGluZ19zZW5kcykpOwogCQl1ZGVsYXkoMTAwKTsKIAl9CiAKIAlEUFJJTlRfSU5GTyhORVRWU0MsICJEaXNjb25uZWN0aW5nIGZyb20gbmV0dnNwLi4uIik7CiAKLQlOZXRWc2NEaXNjb25uZWN0RnJvbVZzcChuZXREZXZpY2UpOworCU5ldFZzY0Rpc2Nvbm5lY3RGcm9tVnNwKG5ldF9kZXZpY2UpOwogCiAJRFBSSU5UX0lORk8oTkVUVlNDLCAiRGlzYWJsaW5nIGluYm91bmQgdHJhZmZpYyBvbiBuZXQgZGV2aWNlICglcCkuLi4iLAotCQkgICAgRGV2aWNlLT5FeHRlbnNpb24pOworCQkgICAgZGV2aWNlLT5FeHRlbnNpb24pOwogCiAJLyogU3RvcCBpbmJvdW5kIHRyYWZmaWMgaWUgcmVjZWl2ZXMgYW5kIHNlbmRzIGNvbXBsZXRpb25zICovCi0JbmV0RGV2aWNlID0gUmVsZWFzZUluYm91bmROZXREZXZpY2UoRGV2aWNlKTsKKwluZXRfZGV2aWNlID0gcmVsZWFzZV9pbmJvdW5kX25ldF9kZXZpY2UoZGV2aWNlKTsKIAogCS8qIEF0IHRoaXMgcG9pbnQsIG5vIG9uZSBzaG91bGQgYmUgYWNjZXNzaW5nIG5ldERldmljZSBleGNlcHQgaW4gaGVyZSAqLwotCURQUklOVF9JTkZPKE5FVFZTQywgIm5ldCBkZXZpY2UgKCVwKSBzYWZlIHRvIHJlbW92ZSIsIG5ldERldmljZSk7CisJRFBSSU5UX0lORk8oTkVUVlNDLCAibmV0IGRldmljZSAoJXApIHNhZmUgdG8gcmVtb3ZlIiwgbmV0X2RldmljZSk7CiAKIAkvKiBOb3csIHdlIGNhbiBjbG9zZSB0aGUgY2hhbm5lbCBzYWZlbHkgKi8KLQl2bWJ1c19jbG9zZShEZXZpY2UtPmNoYW5uZWwpOworCXZtYnVzX2Nsb3NlKGRldmljZS0+Y2hhbm5lbCk7CiAKIAkvKiBSZWxlYXNlIGFsbCByZXNvdXJjZXMgKi8KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobmV0dnNjUGFja2V0LCBwb3MsCi0JCQkJICZuZXREZXZpY2UtPlJlY2VpdmVQYWNrZXRMaXN0LCBMaXN0RW50cnkpIHsKLQkJbGlzdF9kZWwoJm5ldHZzY1BhY2tldC0+TGlzdEVudHJ5KTsKLQkJa2ZyZWUobmV0dnNjUGFja2V0KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobmV0dnNjX3BhY2tldCwgcG9zLAorCQkJCSAmbmV0X2RldmljZS0+cmVjdl9wa3RfbGlzdCwgbGlzdF9lbnQpIHsKKwkJbGlzdF9kZWwoJm5ldHZzY19wYWNrZXQtPmxpc3RfZW50KTsKKwkJa2ZyZWUobmV0dnNjX3BhY2tldCk7CiAJfQogCi0Ja2ZyZWUobmV0RGV2aWNlLT5DaGFubmVsSW5pdEV2ZW50KTsKLQlGcmVlTmV0RGV2aWNlKG5ldERldmljZSk7CisJa2ZyZWUobmV0X2RldmljZS0+Y2hhbm5lbF9pbml0X2V2ZW50KTsKKwlmcmVlX25ldF9kZXZpY2UobmV0X2RldmljZSk7CiAJcmV0dXJuIDA7CiB9CiAKIC8qCi0gKiBOZXRWc2NPbkNsZWFudXAgLSBQZXJmb3JtIGFueSBjbGVhbnVwIHdoZW4gdGhlIGRyaXZlciBpcyByZW1vdmVkCisgKiBuZXR2c2NfY2xlYW51cCAtIFBlcmZvcm0gYW55IGNsZWFudXAgd2hlbiB0aGUgZHJpdmVyIGlzIHJlbW92ZWQKICAqLwotc3RhdGljIHZvaWQgTmV0VnNjT25DbGVhbnVwKHN0cnVjdCBodl9kcml2ZXIgKmRydikKK3N0YXRpYyB2b2lkIG5ldHZzY19jbGVhbnVwKHN0cnVjdCBodl9kcml2ZXIgKmRydikKIHsKIH0KIAotc3RhdGljIHZvaWQgTmV0VnNjT25TZW5kQ29tcGxldGlvbihzdHJ1Y3QgaHZfZGV2aWNlICpEZXZpY2UsCi0JCQkJICAgc3RydWN0IHZtcGFja2V0X2Rlc2NyaXB0b3IgKlBhY2tldCkKK3N0YXRpYyB2b2lkIG5ldHZzY19zZW5kX2NvbXBsZXRpb24oc3RydWN0IGh2X2RldmljZSAqZGV2aWNlLAorCQkJCSAgIHN0cnVjdCB2bXBhY2tldF9kZXNjcmlwdG9yICpwYWNrZXQpCiB7Ci0Jc3RydWN0IG5ldHZzY19kZXZpY2UgKm5ldERldmljZTsKLQlzdHJ1Y3QgbnZzcF9tZXNzYWdlICpudnNwUGFja2V0OwotCXN0cnVjdCBodl9uZXR2c2NfcGFja2V0ICpudnNjUGFja2V0OworCXN0cnVjdCBuZXR2c2NfZGV2aWNlICpuZXRfZGV2aWNlOworCXN0cnVjdCBudnNwX21lc3NhZ2UgKm52c3BfcGFja2V0OworCXN0cnVjdCBodl9uZXR2c2NfcGFja2V0ICpudnNjX3BhY2tldDsKIAotCW5ldERldmljZSA9IEdldEluYm91bmROZXREZXZpY2UoRGV2aWNlKTsKLQlpZiAoIW5ldERldmljZSkgeworCW5ldF9kZXZpY2UgPSBnZXRfaW5ib3VuZF9uZXRfZGV2aWNlKGRldmljZSk7CisJaWYgKCFuZXRfZGV2aWNlKSB7CiAJCURQUklOVF9FUlIoTkVUVlNDLCAidW5hYmxlIHRvIGdldCBuZXQgZGV2aWNlLi4uIgogCQkJICAgImRldmljZSBiZWluZyBkZXN0cm95ZWQ/Iik7CiAJCXJldHVybjsKIAl9CiAKLQludnNwUGFja2V0ID0gKHN0cnVjdCBudnNwX21lc3NhZ2UgKikoKHVuc2lnbmVkIGxvbmcpUGFja2V0ICsgKFBhY2tldC0+RGF0YU9mZnNldDggPDwgMykpOworCW52c3BfcGFja2V0ID0gKHN0cnVjdCBudnNwX21lc3NhZ2UgKikoKHVuc2lnbmVkIGxvbmcpcGFja2V0ICsKKwkJCShwYWNrZXQtPkRhdGFPZmZzZXQ4IDw8IDMpKTsKIAogCURQUklOVF9EQkcoTkVUVlNDLCAic2VuZCBjb21wbGV0aW9uIHBhY2tldCAtIHR5cGUgJWQiLAotCQkgICBudnNwUGFja2V0LT5IZWFkZXIuTWVzc2FnZVR5cGUpOworCQkgICBudnNwX3BhY2tldC0+aGRyLm1zZ190eXBlKTsKIAotCWlmICgobnZzcFBhY2tldC0+SGVhZGVyLk1lc3NhZ2VUeXBlID09IE52c3BNZXNzYWdlVHlwZUluaXRDb21wbGV0ZSkgfHwKLQkgICAgKG52c3BQYWNrZXQtPkhlYWRlci5NZXNzYWdlVHlwZSA9PQotCSAgICAgTnZzcE1lc3NhZ2UxVHlwZVNlbmRSZWNlaXZlQnVmZmVyQ29tcGxldGUpIHx8Ci0JICAgIChudnNwUGFja2V0LT5IZWFkZXIuTWVzc2FnZVR5cGUgPT0KLQkgICAgIE52c3BNZXNzYWdlMVR5cGVTZW5kU2VuZEJ1ZmZlckNvbXBsZXRlKSkgeworCWlmICgobnZzcF9wYWNrZXQtPmhkci5tc2dfdHlwZSA9PSBOVlNQX01TR19UWVBFX0lOSVRfQ09NUExFVEUpIHx8CisJICAgIChudnNwX3BhY2tldC0+aGRyLm1zZ190eXBlID09CisJICAgICBOVlNQX01TRzFfVFlQRV9TRU5EX1JFQ1ZfQlVGX0NPTVBMRVRFKSB8fAorCSAgICAobnZzcF9wYWNrZXQtPmhkci5tc2dfdHlwZSA9PQorCSAgICAgTlZTUF9NU0cxX1RZUEVfU0VORF9TRU5EX0JVRl9DT01QTEVURSkpIHsKIAkJLyogQ29weSB0aGUgcmVzcG9uc2UgYmFjayAqLwotCQltZW1jcHkoJm5ldERldmljZS0+Q2hhbm5lbEluaXRQYWNrZXQsIG52c3BQYWNrZXQsCisJCW1lbWNweSgmbmV0X2RldmljZS0+Y2hhbm5lbF9pbml0X3BrdCwgbnZzcF9wYWNrZXQsCiAJCSAgICAgICBzaXplb2Yoc3RydWN0IG52c3BfbWVzc2FnZSkpOwotCQlvc2RfV2FpdEV2ZW50U2V0KG5ldERldmljZS0+Q2hhbm5lbEluaXRFdmVudCk7Ci0JfSBlbHNlIGlmIChudnNwUGFja2V0LT5IZWFkZXIuTWVzc2FnZVR5cGUgPT0KLQkJICAgTnZzcE1lc3NhZ2UxVHlwZVNlbmRSTkRJU1BhY2tldENvbXBsZXRlKSB7CisJCW9zZF93YWl0ZXZlbnRfc2V0KG5ldF9kZXZpY2UtPmNoYW5uZWxfaW5pdF9ldmVudCk7CisJfSBlbHNlIGlmIChudnNwX3BhY2tldC0+aGRyLm1zZ190eXBlID09CisJCSAgIE5WU1BfTVNHMV9UWVBFX1NFTkRfUk5ESVNfUEtUX0NPTVBMRVRFKSB7CiAJCS8qIEdldCB0aGUgc2VuZCBjb250ZXh0ICovCi0JCW52c2NQYWNrZXQgPSAoc3RydWN0IGh2X25ldHZzY19wYWNrZXQgKikodW5zaWduZWQgbG9uZylQYWNrZXQtPlRyYW5zYWN0aW9uSWQ7CisJCW52c2NfcGFja2V0ID0gKHN0cnVjdCBodl9uZXR2c2NfcGFja2V0ICopKHVuc2lnbmVkIGxvbmcpCisJCQlwYWNrZXQtPlRyYW5zYWN0aW9uSWQ7CiAJCS8qIEFTU0VSVChudnNjUGFja2V0KTsgKi8KIAogCQkvKiBOb3RpZnkgdGhlIGxheWVyIGFib3ZlIHVzICovCi0JCW52c2NQYWNrZXQtPkNvbXBsZXRpb24uU2VuZC5PblNlbmRDb21wbGV0aW9uKG52c2NQYWNrZXQtPkNvbXBsZXRpb24uU2VuZC5TZW5kQ29tcGxldGlvbkNvbnRleHQpOworCQludnNjX3BhY2tldC0+Y29tcGxldGlvbi5zZW5kLnNlbmRfY29tcGxldGlvbigKKwkJCW52c2NfcGFja2V0LT5jb21wbGV0aW9uLnNlbmQuc2VuZF9jb21wbGV0aW9uX2N0eCk7CiAKLQkJYXRvbWljX2RlYygmbmV0RGV2aWNlLT5OdW1PdXRzdGFuZGluZ1NlbmRzKTsKKwkJYXRvbWljX2RlYygmbmV0X2RldmljZS0+bnVtX291dHN0YW5kaW5nX3NlbmRzKTsKIAl9IGVsc2UgewogCQlEUFJJTlRfRVJSKE5FVFZTQywgIlVua25vd24gc2VuZCBjb21wbGV0aW9uIHBhY2tldCB0eXBlIC0gIgotCQkJICAgIiVkIHJlY2VpdmVkISEiLCBudnNwUGFja2V0LT5IZWFkZXIuTWVzc2FnZVR5cGUpOworCQkJICAgIiVkIHJlY2VpdmVkISEiLCBudnNwX3BhY2tldC0+aGRyLm1zZ190eXBlKTsKIAl9CiAKLQlQdXROZXREZXZpY2UoRGV2aWNlKTsKKwlwdXRfbmV0X2RldmljZShkZXZpY2UpOwogfQogCi1zdGF0aWMgaW50IE5ldFZzY09uU2VuZChzdHJ1Y3QgaHZfZGV2aWNlICpEZXZpY2UsCi0JCQlzdHJ1Y3QgaHZfbmV0dnNjX3BhY2tldCAqUGFja2V0KQorc3RhdGljIGludCBuZXR2c2Nfc2VuZChzdHJ1Y3QgaHZfZGV2aWNlICpkZXZpY2UsCisJCQlzdHJ1Y3QgaHZfbmV0dnNjX3BhY2tldCAqcGFja2V0KQogewotCXN0cnVjdCBuZXR2c2NfZGV2aWNlICpuZXREZXZpY2U7CisJc3RydWN0IG5ldHZzY19kZXZpY2UgKm5ldF9kZXZpY2U7CiAJaW50IHJldCA9IDA7CiAKIAlzdHJ1Y3QgbnZzcF9tZXNzYWdlIHNlbmRNZXNzYWdlOwogCi0JbmV0RGV2aWNlID0gR2V0T3V0Ym91bmROZXREZXZpY2UoRGV2aWNlKTsKLQlpZiAoIW5ldERldmljZSkgeworCW5ldF9kZXZpY2UgPSBnZXRfb3V0Ym91bmRfbmV0X2RldmljZShkZXZpY2UpOworCWlmICghbmV0X2RldmljZSkgewogCQlEUFJJTlRfRVJSKE5FVFZTQywgIm5ldCBkZXZpY2UgKCVwKSBzaHV0dGluZyBkb3duLi4uIgotCQkJICAgImlnbm9yaW5nIG91dGJvdW5kIHBhY2tldHMiLCBuZXREZXZpY2UpOworCQkJICAgImlnbm9yaW5nIG91dGJvdW5kIHBhY2tldHMiLCBuZXRfZGV2aWNlKTsKIAkJcmV0dXJuIC0yOwogCX0KIAotCXNlbmRNZXNzYWdlLkhlYWRlci5NZXNzYWdlVHlwZSA9IE52c3BNZXNzYWdlMVR5cGVTZW5kUk5ESVNQYWNrZXQ7Ci0JaWYgKFBhY2tldC0+SXNEYXRhUGFja2V0KSB7CisJc2VuZE1lc3NhZ2UuaGRyLm1zZ190eXBlID0gTlZTUF9NU0cxX1RZUEVfU0VORF9STkRJU19QS1Q7CisJaWYgKHBhY2tldC0+aXNfZGF0YV9wa3QpIHsKIAkJLyogMCBpcyBSTUNfREFUQTsgKi8KLQkJc2VuZE1lc3NhZ2UuTWVzc2FnZXMuVmVyc2lvbjFNZXNzYWdlcy5TZW5kUk5ESVNQYWNrZXQuQ2hhbm5lbFR5cGUgPSAwOworCQlzZW5kTWVzc2FnZS5tc2cudjFfbXNnLnNlbmRfcm5kaXNfcGt0LmNoYW5uZWxfdHlwZSA9IDA7CiAJfSBlbHNlIHsKIAkJLyogMSBpcyBSTUNfQ09OVFJPTDsgKi8KLQkJc2VuZE1lc3NhZ2UuTWVzc2FnZXMuVmVyc2lvbjFNZXNzYWdlcy5TZW5kUk5ESVNQYWNrZXQuQ2hhbm5lbFR5cGUgPSAxOworCQlzZW5kTWVzc2FnZS5tc2cudjFfbXNnLnNlbmRfcm5kaXNfcGt0LmNoYW5uZWxfdHlwZSA9IDE7CiAJfQogCiAJLyogTm90IHVzaW5nIHNlbmQgYnVmZmVyIHNlY3Rpb24gKi8KLQlzZW5kTWVzc2FnZS5NZXNzYWdlcy5WZXJzaW9uMU1lc3NhZ2VzLlNlbmRSTkRJU1BhY2tldC5TZW5kQnVmZmVyU2VjdGlvbkluZGV4ID0gMHhGRkZGRkZGRjsKLQlzZW5kTWVzc2FnZS5NZXNzYWdlcy5WZXJzaW9uMU1lc3NhZ2VzLlNlbmRSTkRJU1BhY2tldC5TZW5kQnVmZmVyU2VjdGlvblNpemUgPSAwOworCXNlbmRNZXNzYWdlLm1zZy52MV9tc2cuc2VuZF9ybmRpc19wa3Quc2VuZF9idWZfc2VjdGlvbl9pbmRleCA9CisJCTB4RkZGRkZGRkY7CisJc2VuZE1lc3NhZ2UubXNnLnYxX21zZy5zZW5kX3JuZGlzX3BrdC5zZW5kX2J1Zl9zZWN0aW9uX3NpemUgPSAwOwogCi0JaWYgKFBhY2tldC0+UGFnZUJ1ZmZlckNvdW50KSB7Ci0JCXJldCA9IHZtYnVzX3NlbmRwYWNrZXRfcGFnZWJ1ZmZlcihEZXZpY2UtPmNoYW5uZWwsCi0JCQkJCQkgIFBhY2tldC0+UGFnZUJ1ZmZlcnMsCi0JCQkJCQkgIFBhY2tldC0+UGFnZUJ1ZmZlckNvdW50LAorCWlmIChwYWNrZXQtPnBhZ2VfYnVmX2NudCkgeworCQlyZXQgPSB2bWJ1c19zZW5kcGFja2V0X3BhZ2VidWZmZXIoZGV2aWNlLT5jaGFubmVsLAorCQkJCQkJICBwYWNrZXQtPnBhZ2VfYnVmLAorCQkJCQkJICBwYWNrZXQtPnBhZ2VfYnVmX2NudCwKIAkJCQkJCSAgJnNlbmRNZXNzYWdlLAogCQkJCQkJICBzaXplb2Yoc3RydWN0IG52c3BfbWVzc2FnZSksCi0JCQkJCQkgICh1bnNpZ25lZCBsb25nKVBhY2tldCk7CisJCQkJCQkgICh1bnNpZ25lZCBsb25nKXBhY2tldCk7CiAJfSBlbHNlIHsKLQkJcmV0ID0gdm1idXNfc2VuZHBhY2tldChEZXZpY2UtPmNoYW5uZWwsICZzZW5kTWVzc2FnZSwKKwkJcmV0ID0gdm1idXNfc2VuZHBhY2tldChkZXZpY2UtPmNoYW5uZWwsICZzZW5kTWVzc2FnZSwKIAkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBudnNwX21lc3NhZ2UpLAotCQkJCSAgICAgICAodW5zaWduZWQgbG9uZylQYWNrZXQsCisJCQkJICAgICAgICh1bnNpZ25lZCBsb25nKXBhY2tldCwKIAkJCQkgICAgICAgVm1idXNQYWNrZXRUeXBlRGF0YUluQmFuZCwKIAkJCQkgICAgICAgVk1CVVNfREFUQV9QQUNLRVRfRkxBR19DT01QTEVUSU9OX1JFUVVFU1RFRCk7CiAKQEAgLTkyMCwzMSArOTUzLDMxIEBACiAKIAlpZiAocmV0ICE9IDApCiAJCURQUklOVF9FUlIoTkVUVlNDLCAiVW5hYmxlIHRvIHNlbmQgcGFja2V0ICVwIHJldCAlZCIsCi0JCQkgICBQYWNrZXQsIHJldCk7CisJCQkgICBwYWNrZXQsIHJldCk7CiAKLQlhdG9taWNfaW5jKCZuZXREZXZpY2UtPk51bU91dHN0YW5kaW5nU2VuZHMpOwotCVB1dE5ldERldmljZShEZXZpY2UpOworCWF0b21pY19pbmMoJm5ldF9kZXZpY2UtPm51bV9vdXRzdGFuZGluZ19zZW5kcyk7CisJcHV0X25ldF9kZXZpY2UoZGV2aWNlKTsKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgdm9pZCBOZXRWc2NPblJlY2VpdmUoc3RydWN0IGh2X2RldmljZSAqRGV2aWNlLAotCQkJICAgIHN0cnVjdCB2bXBhY2tldF9kZXNjcmlwdG9yICpQYWNrZXQpCitzdGF0aWMgdm9pZCBuZXR2c2NfcmVjZWl2ZShzdHJ1Y3QgaHZfZGV2aWNlICpkZXZpY2UsCisJCQkgICAgc3RydWN0IHZtcGFja2V0X2Rlc2NyaXB0b3IgKnBhY2tldCkKIHsKLQlzdHJ1Y3QgbmV0dnNjX2RldmljZSAqbmV0RGV2aWNlOwotCXN0cnVjdCB2bXRyYW5zZmVyX3BhZ2VfcGFja2V0X2hlYWRlciAqdm14ZmVycGFnZVBhY2tldDsKLQlzdHJ1Y3QgbnZzcF9tZXNzYWdlICpudnNwUGFja2V0OwotCXN0cnVjdCBodl9uZXR2c2NfcGFja2V0ICpuZXR2c2NQYWNrZXQgPSBOVUxMOworCXN0cnVjdCBuZXR2c2NfZGV2aWNlICpuZXRfZGV2aWNlOworCXN0cnVjdCB2bXRyYW5zZmVyX3BhZ2VfcGFja2V0X2hlYWRlciAqdm14ZmVycGFnZV9wYWNrZXQ7CisJc3RydWN0IG52c3BfbWVzc2FnZSAqbnZzcF9wYWNrZXQ7CisJc3RydWN0IGh2X25ldHZzY19wYWNrZXQgKm5ldHZzY19wYWNrZXQgPSBOVUxMOwogCXVuc2lnbmVkIGxvbmcgc3RhcnQ7Ci0JdW5zaWduZWQgbG9uZyBlbmQsIGVuZFZpcnR1YWw7CisJdW5zaWduZWQgbG9uZyBlbmQsIGVuZF92aXJ0dWFsOwogCS8qIHN0cnVjdCBuZXR2c2NfZHJpdmVyICpuZXR2c2NEcml2ZXI7ICovCi0Jc3RydWN0IHhmZXJwYWdlX3BhY2tldCAqeGZlcnBhZ2VQYWNrZXQgPSBOVUxMOworCXN0cnVjdCB4ZmVycGFnZV9wYWNrZXQgKnhmZXJwYWdlX3BhY2tldCA9IE5VTEw7CiAJaW50IGksIGo7Ci0JaW50IGNvdW50ID0gMCwgYnl0ZXNSZW1haW4gPSAwOworCWludCBjb3VudCA9IDAsIGJ5dGVzX3JlbWFpbiA9IDA7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlMSVNUX0hFQUQobGlzdEhlYWQpOwogCi0JbmV0RGV2aWNlID0gR2V0SW5ib3VuZE5ldERldmljZShEZXZpY2UpOwotCWlmICghbmV0RGV2aWNlKSB7CisJbmV0X2RldmljZSA9IGdldF9pbmJvdW5kX25ldF9kZXZpY2UoZGV2aWNlKTsKKwlpZiAoIW5ldF9kZXZpY2UpIHsKIAkJRFBSSU5UX0VSUihORVRWU0MsICJ1bmFibGUgdG8gZ2V0IG5ldCBkZXZpY2UuLi4iCiAJCQkgICAiZGV2aWNlIGJlaW5nIGRlc3Ryb3llZD8iKTsKIAkJcmV0dXJuOwpAQCAtOTU0LDM5ICs5ODcsNDAgQEAKIAkgKiBBbGwgaW5ib3VuZCBwYWNrZXRzIG90aGVyIHRoYW4gc2VuZCBjb21wbGV0aW9uIHNob3VsZCBiZSB4ZmVyIHBhZ2UKIAkgKiBwYWNrZXQKIAkgKi8KLQlpZiAoUGFja2V0LT5UeXBlICE9IFZtYnVzUGFja2V0VHlwZURhdGFVc2luZ1RyYW5zZmVyUGFnZXMpIHsKKwlpZiAocGFja2V0LT5UeXBlICE9IFZtYnVzUGFja2V0VHlwZURhdGFVc2luZ1RyYW5zZmVyUGFnZXMpIHsKIAkJRFBSSU5UX0VSUihORVRWU0MsICJVbmtub3duIHBhY2tldCB0eXBlIHJlY2VpdmVkIC0gJWQiLAotCQkJICAgUGFja2V0LT5UeXBlKTsKLQkJUHV0TmV0RGV2aWNlKERldmljZSk7CisJCQkgICBwYWNrZXQtPlR5cGUpOworCQlwdXRfbmV0X2RldmljZShkZXZpY2UpOwogCQlyZXR1cm47CiAJfQogCi0JbnZzcFBhY2tldCA9IChzdHJ1Y3QgbnZzcF9tZXNzYWdlICopKCh1bnNpZ25lZCBsb25nKVBhY2tldCArCi0JCQkoUGFja2V0LT5EYXRhT2Zmc2V0OCA8PCAzKSk7CisJbnZzcF9wYWNrZXQgPSAoc3RydWN0IG52c3BfbWVzc2FnZSAqKSgodW5zaWduZWQgbG9uZylwYWNrZXQgKworCQkJKHBhY2tldC0+RGF0YU9mZnNldDggPDwgMykpOwogCiAJLyogTWFrZSBzdXJlIHRoaXMgaXMgYSB2YWxpZCBudnNwIHBhY2tldCAqLwotCWlmIChudnNwUGFja2V0LT5IZWFkZXIuTWVzc2FnZVR5cGUgIT0gTnZzcE1lc3NhZ2UxVHlwZVNlbmRSTkRJU1BhY2tldCkgeworCWlmIChudnNwX3BhY2tldC0+aGRyLm1zZ190eXBlICE9CisJICAgIE5WU1BfTVNHMV9UWVBFX1NFTkRfUk5ESVNfUEtUKSB7CiAJCURQUklOVF9FUlIoTkVUVlNDLCAiVW5rbm93biBudnNwIHBhY2tldCB0eXBlIHJlY2VpdmVkIC0gJWQiLAotCQkJICAgbnZzcFBhY2tldC0+SGVhZGVyLk1lc3NhZ2VUeXBlKTsKLQkJUHV0TmV0RGV2aWNlKERldmljZSk7CisJCQkgICBudnNwX3BhY2tldC0+aGRyLm1zZ190eXBlKTsKKwkJcHV0X25ldF9kZXZpY2UoZGV2aWNlKTsKIAkJcmV0dXJuOwogCX0KIAogCURQUklOVF9EQkcoTkVUVlNDLCAiTlZTUCBwYWNrZXQgcmVjZWl2ZWQgLSB0eXBlICVkIiwKLQkJICAgbnZzcFBhY2tldC0+SGVhZGVyLk1lc3NhZ2VUeXBlKTsKKwkJICAgbnZzcF9wYWNrZXQtPmhkci5tc2dfdHlwZSk7CiAKLQl2bXhmZXJwYWdlUGFja2V0ID0gKHN0cnVjdCB2bXRyYW5zZmVyX3BhZ2VfcGFja2V0X2hlYWRlciAqKVBhY2tldDsKKwl2bXhmZXJwYWdlX3BhY2tldCA9IChzdHJ1Y3Qgdm10cmFuc2Zlcl9wYWdlX3BhY2tldF9oZWFkZXIgKilwYWNrZXQ7CiAKLQlpZiAodm14ZmVycGFnZVBhY2tldC0+VHJhbnNmZXJQYWdlU2V0SWQgIT0gTkVUVlNDX1JFQ0VJVkVfQlVGRkVSX0lEKSB7CisJaWYgKHZteGZlcnBhZ2VfcGFja2V0LT5UcmFuc2ZlclBhZ2VTZXRJZCAhPSBORVRWU0NfUkVDRUlWRV9CVUZGRVJfSUQpIHsKIAkJRFBSSU5UX0VSUihORVRWU0MsICJJbnZhbGlkIHhmZXIgcGFnZSBzZXQgaWQgLSAiCiAJCQkgICAiZXhwZWN0aW5nICV4IGdvdCAleCIsIE5FVFZTQ19SRUNFSVZFX0JVRkZFUl9JRCwKLQkJCSAgIHZteGZlcnBhZ2VQYWNrZXQtPlRyYW5zZmVyUGFnZVNldElkKTsKLQkJUHV0TmV0RGV2aWNlKERldmljZSk7CisJCQkgICB2bXhmZXJwYWdlX3BhY2tldC0+VHJhbnNmZXJQYWdlU2V0SWQpOworCQlwdXRfbmV0X2RldmljZShkZXZpY2UpOwogCQlyZXR1cm47CiAJfQogCiAJRFBSSU5UX0RCRyhORVRWU0MsICJ4ZmVyIHBhZ2UgLSByYW5nZSBjb3VudCAlZCIsCi0JCSAgIHZteGZlcnBhZ2VQYWNrZXQtPlJhbmdlQ291bnQpOworCQkgICB2bXhmZXJwYWdlX3BhY2tldC0+UmFuZ2VDb3VudCk7CiAKIAkvKgogCSAqIEdyYWIgZnJlZSBwYWNrZXRzIChyYW5nZSBjb3VudCArIDEpIHRvIHJlcHJlc2VudCB0aGlzIHhmZXIKQEAgLTk5NCwxMyArMTAyOCwxMyBAQAogCSAqIFdlIGdyYWIgaXQgaGVyZSBzbyB0aGF0IHdlIGtub3cgZXhhY3RseSBob3cgbWFueSB3ZSBjYW4KIAkgKiBmdWxmaWwKIAkgKi8KLQlzcGluX2xvY2tfaXJxc2F2ZSgmbmV0RGV2aWNlLT5yZWNlaXZlX3BhY2tldF9saXN0X2xvY2ssIGZsYWdzKTsKLQl3aGlsZSAoIWxpc3RfZW1wdHkoJm5ldERldmljZS0+UmVjZWl2ZVBhY2tldExpc3QpKSB7Ci0JCWxpc3RfbW92ZV90YWlsKG5ldERldmljZS0+UmVjZWl2ZVBhY2tldExpc3QubmV4dCwgJmxpc3RIZWFkKTsKLQkJaWYgKCsrY291bnQgPT0gdm14ZmVycGFnZVBhY2tldC0+UmFuZ2VDb3VudCArIDEpCisJc3Bpbl9sb2NrX2lycXNhdmUoJm5ldF9kZXZpY2UtPnJlY3ZfcGt0X2xpc3RfbG9jaywgZmxhZ3MpOworCXdoaWxlICghbGlzdF9lbXB0eSgmbmV0X2RldmljZS0+cmVjdl9wa3RfbGlzdCkpIHsKKwkJbGlzdF9tb3ZlX3RhaWwobmV0X2RldmljZS0+cmVjdl9wa3RfbGlzdC5uZXh0LCAmbGlzdEhlYWQpOworCQlpZiAoKytjb3VudCA9PSB2bXhmZXJwYWdlX3BhY2tldC0+UmFuZ2VDb3VudCArIDEpCiAJCQlicmVhazsKIAl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbmV0RGV2aWNlLT5yZWNlaXZlX3BhY2tldF9saXN0X2xvY2ssIGZsYWdzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZuZXRfZGV2aWNlLT5yZWN2X3BrdF9saXN0X2xvY2ssIGZsYWdzKTsKIAogCS8qCiAJICogV2UgbmVlZCBhdCBsZWFzdCAyIG5ldHZzYyBwa3RzICgxIHRvIHJlcHJlc2VudCB0aGUgeGZlcgpAQCAtMTAxMCwxNDAgKzEwNDQsMTQ5IEBACiAJaWYgKGNvdW50IDwgMikgewogCQlEUFJJTlRfRVJSKE5FVFZTQywgIkdvdCBvbmx5ICVkIG5ldHZzYyBwa3QuLi5uZWVkZWQgJWQgcGt0cy4gIgogCQkJICAgIkRyb3BwaW5nIHRoaXMgeGZlciBwYWdlIHBhY2tldCBjb21wbGV0ZWx5ISIsCi0JCQkgICBjb3VudCwgdm14ZmVycGFnZVBhY2tldC0+UmFuZ2VDb3VudCArIDEpOworCQkJICAgY291bnQsIHZteGZlcnBhZ2VfcGFja2V0LT5SYW5nZUNvdW50ICsgMSk7CiAKIAkJLyogUmV0dXJuIGl0IHRvIHRoZSBmcmVlbGlzdCAqLwotCQlzcGluX2xvY2tfaXJxc2F2ZSgmbmV0RGV2aWNlLT5yZWNlaXZlX3BhY2tldF9saXN0X2xvY2ssIGZsYWdzKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJm5ldF9kZXZpY2UtPnJlY3ZfcGt0X2xpc3RfbG9jaywgZmxhZ3MpOwogCQlmb3IgKGkgPSBjb3VudDsgaSAhPSAwOyBpLS0pIHsKIAkJCWxpc3RfbW92ZV90YWlsKGxpc3RIZWFkLm5leHQsCi0JCQkJICAgICAgICZuZXREZXZpY2UtPlJlY2VpdmVQYWNrZXRMaXN0KTsKKwkJCQkgICAgICAgJm5ldF9kZXZpY2UtPnJlY3ZfcGt0X2xpc3QpOwogCQl9Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm5ldERldmljZS0+cmVjZWl2ZV9wYWNrZXRfbGlzdF9sb2NrLAorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZuZXRfZGV2aWNlLT5yZWN2X3BrdF9saXN0X2xvY2ssCiAJCQkJICAgICAgIGZsYWdzKTsKIAotCQlOZXRWc2NTZW5kUmVjZWl2ZUNvbXBsZXRpb24oRGV2aWNlLAotCQkJCQkgICAgdm14ZmVycGFnZVBhY2tldC0+ZC5UcmFuc2FjdGlvbklkKTsKKwkJbmV0dnNjX3NlbmRfcmVjdl9jb21wbGV0aW9uKGRldmljZSwKKwkJCQkJICAgIHZteGZlcnBhZ2VfcGFja2V0LT5kLlRyYW5zYWN0aW9uSWQpOwogCi0JCVB1dE5ldERldmljZShEZXZpY2UpOworCQlwdXRfbmV0X2RldmljZShkZXZpY2UpOwogCQlyZXR1cm47CiAJfQogCiAJLyogUmVtb3ZlIHRoZSAxc3QgcGFja2V0IHRvIHJlcHJlc2VudCB0aGUgeGZlciBwYWdlIHBhY2tldCBpdHNlbGYgKi8KLQl4ZmVycGFnZVBhY2tldCA9IChzdHJ1Y3QgeGZlcnBhZ2VfcGFja2V0ICopbGlzdEhlYWQubmV4dDsKLQlsaXN0X2RlbCgmeGZlcnBhZ2VQYWNrZXQtPkxpc3RFbnRyeSk7CisJeGZlcnBhZ2VfcGFja2V0ID0gKHN0cnVjdCB4ZmVycGFnZV9wYWNrZXQgKilsaXN0SGVhZC5uZXh0OworCWxpc3RfZGVsKCZ4ZmVycGFnZV9wYWNrZXQtPmxpc3RfZW50KTsKIAogCS8qIFRoaXMgaXMgaG93IG11Y2ggd2UgY2FuIHNhdGlzZnkgKi8KLQl4ZmVycGFnZVBhY2tldC0+Q291bnQgPSBjb3VudCAtIDE7CisJeGZlcnBhZ2VfcGFja2V0LT5jb3VudCA9IGNvdW50IC0gMTsKIAkvKiBBU1NFUlQoeGZlcnBhZ2VQYWNrZXQtPkNvdW50ID4gMCAmJiB4ZmVycGFnZVBhY2tldC0+Q291bnQgPD0gKi8KIAkvKiAJdm14ZmVycGFnZVBhY2tldC0+UmFuZ2VDb3VudCk7ICovCiAKLQlpZiAoeGZlcnBhZ2VQYWNrZXQtPkNvdW50ICE9IHZteGZlcnBhZ2VQYWNrZXQtPlJhbmdlQ291bnQpIHsKKwlpZiAoeGZlcnBhZ2VfcGFja2V0LT5jb3VudCAhPSB2bXhmZXJwYWdlX3BhY2tldC0+UmFuZ2VDb3VudCkgewogCQlEUFJJTlRfSU5GTyhORVRWU0MsICJOZWVkZWQgJWQgbmV0dnNjIHBrdHMgdG8gc2F0aXN5IHRoaXMgeGZlciAiCi0JCQkgICAgInBhZ2UuLi5nb3QgJWQiLCB2bXhmZXJwYWdlUGFja2V0LT5SYW5nZUNvdW50LAotCQkJICAgIHhmZXJwYWdlUGFja2V0LT5Db3VudCk7CisJCQkgICAgInBhZ2UuLi5nb3QgJWQiLCB2bXhmZXJwYWdlX3BhY2tldC0+UmFuZ2VDb3VudCwKKwkJCSAgICB4ZmVycGFnZV9wYWNrZXQtPmNvdW50KTsKIAl9CiAKIAkvKiBFYWNoIHJhbmdlIHJlcHJlc2VudHMgMSBSTkRJUyBwa3QgdGhhdCBjb250YWlucyAxIGV0aGVybmV0IGZyYW1lICovCiAJZm9yIChpID0gMDsgaSA8IChjb3VudCAtIDEpOyBpKyspIHsKLQkJbmV0dnNjUGFja2V0ID0gKHN0cnVjdCBodl9uZXR2c2NfcGFja2V0ICopbGlzdEhlYWQubmV4dDsKLQkJbGlzdF9kZWwoJm5ldHZzY1BhY2tldC0+TGlzdEVudHJ5KTsKKwkJbmV0dnNjX3BhY2tldCA9IChzdHJ1Y3QgaHZfbmV0dnNjX3BhY2tldCAqKWxpc3RIZWFkLm5leHQ7CisJCWxpc3RfZGVsKCZuZXR2c2NfcGFja2V0LT5saXN0X2VudCk7CiAKIAkJLyogSW5pdGlhbGl6ZSB0aGUgbmV0dnNjIHBhY2tldCAqLwotCQluZXR2c2NQYWNrZXQtPlhmZXJQYWdlUGFja2V0ID0geGZlcnBhZ2VQYWNrZXQ7Ci0JCW5ldHZzY1BhY2tldC0+Q29tcGxldGlvbi5SZWN2Lk9uUmVjZWl2ZUNvbXBsZXRpb24gPQotCQkJCQlOZXRWc2NPblJlY2VpdmVDb21wbGV0aW9uOwotCQluZXR2c2NQYWNrZXQtPkNvbXBsZXRpb24uUmVjdi5SZWNlaXZlQ29tcGxldGlvbkNvbnRleHQgPQotCQkJCQluZXR2c2NQYWNrZXQ7Ci0JCW5ldHZzY1BhY2tldC0+RGV2aWNlID0gRGV2aWNlOworCQluZXR2c2NfcGFja2V0LT54ZmVyX3BhZ2VfcGt0ID0geGZlcnBhZ2VfcGFja2V0OworCQluZXR2c2NfcGFja2V0LT5jb21wbGV0aW9uLnJlY3YucmVjdl9jb21wbGV0aW9uID0KKwkJCQkJbmV0dnNjX3JlY2VpdmVfY29tcGxldGlvbjsKKwkJbmV0dnNjX3BhY2tldC0+Y29tcGxldGlvbi5yZWN2LnJlY3ZfY29tcGxldGlvbl9jdHggPQorCQkJCQluZXR2c2NfcGFja2V0OworCQluZXR2c2NfcGFja2V0LT5kZXZpY2UgPSBkZXZpY2U7CiAJCS8qIFNhdmUgdGhpcyBzbyB0aGF0IHdlIGNhbiBzZW5kIGl0IGJhY2sgKi8KLQkJbmV0dnNjUGFja2V0LT5Db21wbGV0aW9uLlJlY3YuUmVjZWl2ZUNvbXBsZXRpb25UaWQgPQotCQkJCQl2bXhmZXJwYWdlUGFja2V0LT5kLlRyYW5zYWN0aW9uSWQ7CisJCW5ldHZzY19wYWNrZXQtPmNvbXBsZXRpb24ucmVjdi5yZWN2X2NvbXBsZXRpb25fdGlkID0KKwkJCQkJdm14ZmVycGFnZV9wYWNrZXQtPmQuVHJhbnNhY3Rpb25JZDsKIAotCQluZXR2c2NQYWNrZXQtPlRvdGFsRGF0YUJ1ZmZlckxlbmd0aCA9Ci0JCQkJCXZteGZlcnBhZ2VQYWNrZXQtPlJhbmdlc1tpXS5CeXRlQ291bnQ7Ci0JCW5ldHZzY1BhY2tldC0+UGFnZUJ1ZmZlckNvdW50ID0gMTsKKwkJbmV0dnNjX3BhY2tldC0+dG90YWxfZGF0YV9idWZsZW4gPQorCQkJCQl2bXhmZXJwYWdlX3BhY2tldC0+UmFuZ2VzW2ldLkJ5dGVDb3VudDsKKwkJbmV0dnNjX3BhY2tldC0+cGFnZV9idWZfY250ID0gMTsKIAogCQkvKiBBU1NFUlQodm14ZmVycGFnZVBhY2tldC0+UmFuZ2VzW2ldLkJ5dGVPZmZzZXQgKyAqLwogCQkvKiAJdm14ZmVycGFnZVBhY2tldC0+UmFuZ2VzW2ldLkJ5dGVDb3VudCA8ICovCiAJCS8qIAluZXREZXZpY2UtPlJlY2VpdmVCdWZmZXJTaXplKTsgKi8KIAotCQluZXR2c2NQYWNrZXQtPlBhZ2VCdWZmZXJzWzBdLkxlbmd0aCA9Ci0JCQkJCXZteGZlcnBhZ2VQYWNrZXQtPlJhbmdlc1tpXS5CeXRlQ291bnQ7CisJCW5ldHZzY19wYWNrZXQtPnBhZ2VfYnVmWzBdLkxlbmd0aCA9CisJCQkJCXZteGZlcnBhZ2VfcGFja2V0LT5SYW5nZXNbaV0uQnl0ZUNvdW50OwogCi0JCXN0YXJ0ID0gdmlydF90b19waHlzKCh2b2lkICopKCh1bnNpZ25lZCBsb25nKW5ldERldmljZS0+UmVjZWl2ZUJ1ZmZlciArIHZteGZlcnBhZ2VQYWNrZXQtPlJhbmdlc1tpXS5CeXRlT2Zmc2V0KSk7CisJCXN0YXJ0ID0gdmlydF90b19waHlzKCh2b2lkICopKCh1bnNpZ25lZCBsb25nKW5ldF9kZXZpY2UtPgorCQlyZWN2X2J1ZiArIHZteGZlcnBhZ2VfcGFja2V0LT5SYW5nZXNbaV0uQnl0ZU9mZnNldCkpOwogCi0JCW5ldHZzY1BhY2tldC0+UGFnZUJ1ZmZlcnNbMF0uUGZuID0gc3RhcnQgPj4gUEFHRV9TSElGVDsKLQkJZW5kVmlydHVhbCA9ICh1bnNpZ25lZCBsb25nKW5ldERldmljZS0+UmVjZWl2ZUJ1ZmZlcgotCQkgICAgKyB2bXhmZXJwYWdlUGFja2V0LT5SYW5nZXNbaV0uQnl0ZU9mZnNldAotCQkgICAgKyB2bXhmZXJwYWdlUGFja2V0LT5SYW5nZXNbaV0uQnl0ZUNvdW50IC0gMTsKLQkJZW5kID0gdmlydF90b19waHlzKCh2b2lkICopZW5kVmlydHVhbCk7CisJCW5ldHZzY19wYWNrZXQtPnBhZ2VfYnVmWzBdLlBmbiA9IHN0YXJ0ID4+IFBBR0VfU0hJRlQ7CisJCWVuZF92aXJ0dWFsID0gKHVuc2lnbmVkIGxvbmcpbmV0X2RldmljZS0+cmVjdl9idWYKKwkJICAgICsgdm14ZmVycGFnZV9wYWNrZXQtPlJhbmdlc1tpXS5CeXRlT2Zmc2V0CisJCSAgICArIHZteGZlcnBhZ2VfcGFja2V0LT5SYW5nZXNbaV0uQnl0ZUNvdW50IC0gMTsKKwkJZW5kID0gdmlydF90b19waHlzKCh2b2lkICopZW5kX3ZpcnR1YWwpOwogCiAJCS8qIENhbGN1bGF0ZSB0aGUgcGFnZSByZWxhdGl2ZSBvZmZzZXQgKi8KLQkJbmV0dnNjUGFja2V0LT5QYWdlQnVmZmVyc1swXS5PZmZzZXQgPQotCQkJdm14ZmVycGFnZVBhY2tldC0+UmFuZ2VzW2ldLkJ5dGVPZmZzZXQgJiAoUEFHRV9TSVpFIC0gMSk7CisJCW5ldHZzY19wYWNrZXQtPnBhZ2VfYnVmWzBdLk9mZnNldCA9CisJCQl2bXhmZXJwYWdlX3BhY2tldC0+UmFuZ2VzW2ldLkJ5dGVPZmZzZXQgJgorCQkJKFBBR0VfU0laRSAtIDEpOwogCQlpZiAoKGVuZCA+PiBQQUdFX1NISUZUKSAhPSAoc3RhcnQgPj4gUEFHRV9TSElGVCkpIHsKIAkJCS8qIEhhbmRsZSBmcmFtZSBhY3Jvc3MgbXVsdGlwbGUgcGFnZXM6ICovCi0JCQluZXR2c2NQYWNrZXQtPlBhZ2VCdWZmZXJzWzBdLkxlbmd0aCA9Ci0JCQkJKG5ldHZzY1BhY2tldC0+UGFnZUJ1ZmZlcnNbMF0uUGZuIDw8IFBBR0VfU0hJRlQpCisJCQluZXR2c2NfcGFja2V0LT5wYWdlX2J1ZlswXS5MZW5ndGggPQorCQkJCShuZXR2c2NfcGFja2V0LT5wYWdlX2J1ZlswXS5QZm4gPDwKKwkJCQkgUEFHRV9TSElGVCkKIAkJCQkrIFBBR0VfU0laRSAtIHN0YXJ0OwotCQkJYnl0ZXNSZW1haW4gPSBuZXR2c2NQYWNrZXQtPlRvdGFsRGF0YUJ1ZmZlckxlbmd0aCAtCi0JCQkJCW5ldHZzY1BhY2tldC0+UGFnZUJ1ZmZlcnNbMF0uTGVuZ3RoOworCQkJYnl0ZXNfcmVtYWluID0gbmV0dnNjX3BhY2tldC0+dG90YWxfZGF0YV9idWZsZW4gLQorCQkJCQluZXR2c2NfcGFja2V0LT5wYWdlX2J1ZlswXS5MZW5ndGg7CiAJCQlmb3IgKGogPSAxOyBqIDwgTkVUVlNDX1BBQ0tFVF9NQVhQQUdFOyBqKyspIHsKLQkJCQluZXR2c2NQYWNrZXQtPlBhZ2VCdWZmZXJzW2pdLk9mZnNldCA9IDA7Ci0JCQkJaWYgKGJ5dGVzUmVtYWluIDw9IFBBR0VfU0laRSkgewotCQkJCQluZXR2c2NQYWNrZXQtPlBhZ2VCdWZmZXJzW2pdLkxlbmd0aCA9IGJ5dGVzUmVtYWluOwotCQkJCQlieXRlc1JlbWFpbiA9IDA7CisJCQkJbmV0dnNjX3BhY2tldC0+cGFnZV9idWZbal0uT2Zmc2V0ID0gMDsKKwkJCQlpZiAoYnl0ZXNfcmVtYWluIDw9IFBBR0VfU0laRSkgeworCQkJCQluZXR2c2NfcGFja2V0LT5wYWdlX2J1ZltqXS5MZW5ndGggPQorCQkJCQkJYnl0ZXNfcmVtYWluOworCQkJCQlieXRlc19yZW1haW4gPSAwOwogCQkJCX0gZWxzZSB7Ci0JCQkJCW5ldHZzY1BhY2tldC0+UGFnZUJ1ZmZlcnNbal0uTGVuZ3RoID0gUEFHRV9TSVpFOwotCQkJCQlieXRlc1JlbWFpbiAtPSBQQUdFX1NJWkU7CisJCQkJCW5ldHZzY19wYWNrZXQtPnBhZ2VfYnVmW2pdLkxlbmd0aCA9CisJCQkJCQlQQUdFX1NJWkU7CisJCQkJCWJ5dGVzX3JlbWFpbiAtPSBQQUdFX1NJWkU7CiAJCQkJfQotCQkJCW5ldHZzY1BhY2tldC0+UGFnZUJ1ZmZlcnNbal0uUGZuID0KLQkJCQkgICAgdmlydF90b19waHlzKCh2b2lkICopKGVuZFZpcnR1YWwgLSBieXRlc1JlbWFpbikpID4+IFBBR0VfU0hJRlQ7Ci0JCQkJbmV0dnNjUGFja2V0LT5QYWdlQnVmZmVyQ291bnQrKzsKLQkJCQlpZiAoYnl0ZXNSZW1haW4gPT0gMCkKKwkJCQluZXR2c2NfcGFja2V0LT5wYWdlX2J1ZltqXS5QZm4gPQorCQkJCSAgICB2aXJ0X3RvX3BoeXMoKHZvaWQgKikoZW5kX3ZpcnR1YWwgLQorCQkJCQkJYnl0ZXNfcmVtYWluKSkgPj4gUEFHRV9TSElGVDsKKwkJCQluZXR2c2NfcGFja2V0LT5wYWdlX2J1Zl9jbnQrKzsKKwkJCQlpZiAoYnl0ZXNfcmVtYWluID09IDApCiAJCQkJCWJyZWFrOwogCQkJfQogCQkJLyogQVNTRVJUKGJ5dGVzUmVtYWluID09IDApOyAqLwogCQl9CiAJCURQUklOVF9EQkcoTkVUVlNDLCAiWyVkXSAtIChhYnMgb2Zmc2V0ICV1IGxlbiAldSkgPT4gIgogCQkJICAgIihwZm4gJWxseCwgb2Zmc2V0ICV1LCBsZW4gJXUpIiwgaSwKLQkJCSAgIHZteGZlcnBhZ2VQYWNrZXQtPlJhbmdlc1tpXS5CeXRlT2Zmc2V0LAotCQkJICAgdm14ZmVycGFnZVBhY2tldC0+UmFuZ2VzW2ldLkJ5dGVDb3VudCwKLQkJCSAgIG5ldHZzY1BhY2tldC0+UGFnZUJ1ZmZlcnNbMF0uUGZuLAotCQkJICAgbmV0dnNjUGFja2V0LT5QYWdlQnVmZmVyc1swXS5PZmZzZXQsCi0JCQkgICBuZXR2c2NQYWNrZXQtPlBhZ2VCdWZmZXJzWzBdLkxlbmd0aCk7CisJCQkgICB2bXhmZXJwYWdlX3BhY2tldC0+UmFuZ2VzW2ldLkJ5dGVPZmZzZXQsCisJCQkgICB2bXhmZXJwYWdlX3BhY2tldC0+UmFuZ2VzW2ldLkJ5dGVDb3VudCwKKwkJCSAgIG5ldHZzY19wYWNrZXQtPnBhZ2VfYnVmWzBdLlBmbiwKKwkJCSAgIG5ldHZzY19wYWNrZXQtPnBhZ2VfYnVmWzBdLk9mZnNldCwKKwkJCSAgIG5ldHZzY19wYWNrZXQtPnBhZ2VfYnVmWzBdLkxlbmd0aCk7CiAKIAkJLyogUGFzcyBpdCB0byB0aGUgdXBwZXIgbGF5ZXIgKi8KLQkJKChzdHJ1Y3QgbmV0dnNjX2RyaXZlciAqKURldmljZS0+RHJpdmVyKS0+T25SZWNlaXZlQ2FsbGJhY2soRGV2aWNlLCBuZXR2c2NQYWNrZXQpOworCQkoKHN0cnVjdCBuZXR2c2NfZHJpdmVyICopZGV2aWNlLT5Ecml2ZXIpLT4KKwkJCXJlY3ZfY2IoZGV2aWNlLCBuZXR2c2NfcGFja2V0KTsKIAotCQlOZXRWc2NPblJlY2VpdmVDb21wbGV0aW9uKG5ldHZzY1BhY2tldC0+Q29tcGxldGlvbi5SZWN2LlJlY2VpdmVDb21wbGV0aW9uQ29udGV4dCk7CisJCW5ldHZzY19yZWNlaXZlX2NvbXBsZXRpb24obmV0dnNjX3BhY2tldC0+CisJCQkJY29tcGxldGlvbi5yZWN2LnJlY3ZfY29tcGxldGlvbl9jdHgpOwogCX0KIAogCS8qIEFTU0VSVChsaXN0X2VtcHR5KCZsaXN0SGVhZCkpOyAqLwogCi0JUHV0TmV0RGV2aWNlKERldmljZSk7CisJcHV0X25ldF9kZXZpY2UoZGV2aWNlKTsKIH0KIAotc3RhdGljIHZvaWQgTmV0VnNjU2VuZFJlY2VpdmVDb21wbGV0aW9uKHN0cnVjdCBodl9kZXZpY2UgKkRldmljZSwKLQkJCQkJdTY0IFRyYW5zYWN0aW9uSWQpCitzdGF0aWMgdm9pZCBuZXR2c2Nfc2VuZF9yZWN2X2NvbXBsZXRpb24oc3RydWN0IGh2X2RldmljZSAqZGV2aWNlLAorCQkJCQl1NjQgdHJhbnNhY3Rpb25faWQpCiB7CiAJc3RydWN0IG52c3BfbWVzc2FnZSByZWN2Y29tcE1lc3NhZ2U7CiAJaW50IHJldHJpZXMgPSAwOwogCWludCByZXQ7CiAKIAlEUFJJTlRfREJHKE5FVFZTQywgIlNlbmRpbmcgcmVjZWl2ZSBjb21wbGV0aW9uIHBrdCAtICVsbHgiLAotCQkgICBUcmFuc2FjdGlvbklkKTsKKwkJICAgdHJhbnNhY3Rpb25faWQpOwogCi0JcmVjdmNvbXBNZXNzYWdlLkhlYWRlci5NZXNzYWdlVHlwZSA9Ci0JCQkJTnZzcE1lc3NhZ2UxVHlwZVNlbmRSTkRJU1BhY2tldENvbXBsZXRlOworCXJlY3Zjb21wTWVzc2FnZS5oZHIubXNnX3R5cGUgPQorCQkJCU5WU1BfTVNHMV9UWVBFX1NFTkRfUk5ESVNfUEtUX0NPTVBMRVRFOwogCiAJLyogRklYTUU6IFBhc3MgaW4gdGhlIHN0YXR1cyAqLwotCXJlY3Zjb21wTWVzc2FnZS5NZXNzYWdlcy5WZXJzaW9uMU1lc3NhZ2VzLlNlbmRSTkRJU1BhY2tldENvbXBsZXRlLlN0YXR1cyA9IE52c3BTdGF0dXNTdWNjZXNzOworCXJlY3Zjb21wTWVzc2FnZS5tc2cudjFfbXNnLnNlbmRfcm5kaXNfcGt0X2NvbXBsZXRlLnN0YXR1cyA9CisJCU5WU1BfU1RBVF9TVUNDRVNTOwogCiByZXRyeV9zZW5kX2NtcGx0OgogCS8qIFNlbmQgdGhlIGNvbXBsZXRpb24gKi8KLQlyZXQgPSB2bWJ1c19zZW5kcGFja2V0KERldmljZS0+Y2hhbm5lbCwgJnJlY3Zjb21wTWVzc2FnZSwKLQkJCSAgICAgICBzaXplb2Yoc3RydWN0IG52c3BfbWVzc2FnZSksIFRyYW5zYWN0aW9uSWQsCisJcmV0ID0gdm1idXNfc2VuZHBhY2tldChkZXZpY2UtPmNoYW5uZWwsICZyZWN2Y29tcE1lc3NhZ2UsCisJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBudnNwX21lc3NhZ2UpLCB0cmFuc2FjdGlvbl9pZCwKIAkJCSAgICAgICBWbWJ1c1BhY2tldFR5cGVDb21wbGV0aW9uLCAwKTsKIAlpZiAocmV0ID09IDApIHsKIAkJLyogc3VjY2VzcyAqLwpAQCAtMTE1Miw3ICsxMTk1LDcgQEAKIAkJLyogbm8gbW9yZSByb29tLi4ud2FpdCBhIGJpdCBhbmQgYXR0ZW1wdCB0byByZXRyeSAzIHRpbWVzICovCiAJCXJldHJpZXMrKzsKIAkJRFBSSU5UX0VSUihORVRWU0MsICJ1bmFibGUgdG8gc2VuZCByZWNlaXZlIGNvbXBsZXRpb24gcGt0ICIKLQkJCSAgICIodGlkICVsbHgpLi4ucmV0cnlpbmcgJWQiLCBUcmFuc2FjdGlvbklkLCByZXRyaWVzKTsKKwkJCSAgICIodGlkICVsbHgpLi4ucmV0cnlpbmcgJWQiLCB0cmFuc2FjdGlvbl9pZCwgcmV0cmllcyk7CiAKIAkJaWYgKHJldHJpZXMgPCA0KSB7CiAJCQl1ZGVsYXkoMTAwKTsKQEAgLTExNjAsMjIgKzEyMDMsMjIgQEAKIAkJfSBlbHNlIHsKIAkJCURQUklOVF9FUlIoTkVUVlNDLCAidW5hYmxlIHRvIHNlbmQgcmVjZWl2ZSBjb21wbGV0aW9uICIKIAkJCQkgICJwa3QgKHRpZCAlbGx4KS4uLmdpdmUgdXAgcmV0cnlpbmciLAotCQkJCSAgVHJhbnNhY3Rpb25JZCk7CisJCQkJICB0cmFuc2FjdGlvbl9pZCk7CiAJCX0KIAl9IGVsc2UgewogCQlEUFJJTlRfRVJSKE5FVFZTQywgInVuYWJsZSB0byBzZW5kIHJlY2VpdmUgY29tcGxldGlvbiBwa3QgLSAiCi0JCQkgICAiJWxseCIsIFRyYW5zYWN0aW9uSWQpOworCQkJICAgIiVsbHgiLCB0cmFuc2FjdGlvbl9pZCk7CiAJfQogfQogCiAvKiBTZW5kIGEgcmVjZWl2ZSBjb21wbGV0aW9uIHBhY2tldCB0byBSTkRJUyBkZXZpY2UgKGllIE5ldFZzcCkgKi8KLXN0YXRpYyB2b2lkIE5ldFZzY09uUmVjZWl2ZUNvbXBsZXRpb24odm9pZCAqQ29udGV4dCkKK3N0YXRpYyB2b2lkIG5ldHZzY19yZWNlaXZlX2NvbXBsZXRpb24odm9pZCAqY29udGV4dCkKIHsKLQlzdHJ1Y3QgaHZfbmV0dnNjX3BhY2tldCAqcGFja2V0ID0gQ29udGV4dDsKLQlzdHJ1Y3QgaHZfZGV2aWNlICpkZXZpY2UgPSAoc3RydWN0IGh2X2RldmljZSAqKXBhY2tldC0+RGV2aWNlOwotCXN0cnVjdCBuZXR2c2NfZGV2aWNlICpuZXREZXZpY2U7Ci0JdTY0IHRyYW5zYWN0aW9uSWQgPSAwOwotCWJvb2wgZlNlbmRSZWNlaXZlQ29tcCA9IGZhbHNlOworCXN0cnVjdCBodl9uZXR2c2NfcGFja2V0ICpwYWNrZXQgPSBjb250ZXh0OworCXN0cnVjdCBodl9kZXZpY2UgKmRldmljZSA9IChzdHJ1Y3QgaHZfZGV2aWNlICopcGFja2V0LT5kZXZpY2U7CisJc3RydWN0IG5ldHZzY19kZXZpY2UgKm5ldF9kZXZpY2U7CisJdTY0IHRyYW5zYWN0aW9uX2lkID0gMDsKKwlib29sIGZzZW5kX3JlY2VpdmVfY29tcCA9IGZhbHNlOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAkvKiBBU1NFUlQocGFja2V0LT5YZmVyUGFnZVBhY2tldCk7ICovCkBAIC0xMTg1LDQ5ICsxMjI4LDQ5IEBACiAJICogc2VuZCBvdXQgcmVjZWl2ZSBjb21wbGV0aW9uLCB3ZSBhcmUgdXNpbmcgR2V0SW5ib3VuZE5ldERldmljZSgpCiAJICogc2luY2Ugd2UgbWF5IGhhdmUgZGlzYWJsZSBvdXRib3VuZCB0cmFmZmljIGFscmVhZHkuCiAJICovCi0JbmV0RGV2aWNlID0gR2V0SW5ib3VuZE5ldERldmljZShkZXZpY2UpOwotCWlmICghbmV0RGV2aWNlKSB7CisJbmV0X2RldmljZSA9IGdldF9pbmJvdW5kX25ldF9kZXZpY2UoZGV2aWNlKTsKKwlpZiAoIW5ldF9kZXZpY2UpIHsKIAkJRFBSSU5UX0VSUihORVRWU0MsICJ1bmFibGUgdG8gZ2V0IG5ldCBkZXZpY2UuLi4iCiAJCQkgICAiZGV2aWNlIGJlaW5nIGRlc3Ryb3llZD8iKTsKIAkJcmV0dXJuOwogCX0KIAogCS8qIE92ZXJsb2FkaW5nIHVzZSBvZiB0aGUgbG9jay4gKi8KLQlzcGluX2xvY2tfaXJxc2F2ZSgmbmV0RGV2aWNlLT5yZWNlaXZlX3BhY2tldF9saXN0X2xvY2ssIGZsYWdzKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbmV0X2RldmljZS0+cmVjdl9wa3RfbGlzdF9sb2NrLCBmbGFncyk7CiAKIAkvKiBBU1NFUlQocGFja2V0LT5YZmVyUGFnZVBhY2tldC0+Q291bnQgPiAwKTsgKi8KLQlwYWNrZXQtPlhmZXJQYWdlUGFja2V0LT5Db3VudC0tOworCXBhY2tldC0+eGZlcl9wYWdlX3BrdC0+Y291bnQtLTsKIAogCS8qCiAJICogTGFzdCBvbmUgaW4gdGhlIGxpbmUgdGhhdCByZXByZXNlbnQgMSB4ZmVyIHBhZ2UgcGFja2V0LgogCSAqIFJldHVybiB0aGUgeGZlciBwYWdlIHBhY2tldCBpdHNlbGYgdG8gdGhlIGZyZWVsaXN0CiAJICovCi0JaWYgKHBhY2tldC0+WGZlclBhZ2VQYWNrZXQtPkNvdW50ID09IDApIHsKLQkJZlNlbmRSZWNlaXZlQ29tcCA9IHRydWU7Ci0JCXRyYW5zYWN0aW9uSWQgPSBwYWNrZXQtPkNvbXBsZXRpb24uUmVjdi5SZWNlaXZlQ29tcGxldGlvblRpZDsKLQkJbGlzdF9hZGRfdGFpbCgmcGFja2V0LT5YZmVyUGFnZVBhY2tldC0+TGlzdEVudHJ5LAotCQkJICAgICAgJm5ldERldmljZS0+UmVjZWl2ZVBhY2tldExpc3QpOworCWlmIChwYWNrZXQtPnhmZXJfcGFnZV9wa3QtPmNvdW50ID09IDApIHsKKwkJZnNlbmRfcmVjZWl2ZV9jb21wID0gdHJ1ZTsKKwkJdHJhbnNhY3Rpb25faWQgPSBwYWNrZXQtPmNvbXBsZXRpb24ucmVjdi5yZWN2X2NvbXBsZXRpb25fdGlkOworCQlsaXN0X2FkZF90YWlsKCZwYWNrZXQtPnhmZXJfcGFnZV9wa3QtPmxpc3RfZW50LAorCQkJICAgICAgJm5ldF9kZXZpY2UtPnJlY3ZfcGt0X2xpc3QpOwogCiAJfQogCiAJLyogUHV0IHRoZSBwYWNrZXQgYmFjayAqLwotCWxpc3RfYWRkX3RhaWwoJnBhY2tldC0+TGlzdEVudHJ5LCAmbmV0RGV2aWNlLT5SZWNlaXZlUGFja2V0TGlzdCk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbmV0RGV2aWNlLT5yZWNlaXZlX3BhY2tldF9saXN0X2xvY2ssIGZsYWdzKTsKKwlsaXN0X2FkZF90YWlsKCZwYWNrZXQtPmxpc3RfZW50LCAmbmV0X2RldmljZS0+cmVjdl9wa3RfbGlzdCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbmV0X2RldmljZS0+cmVjdl9wa3RfbGlzdF9sb2NrLCBmbGFncyk7CiAKIAkvKiBTZW5kIGEgcmVjZWl2ZSBjb21wbGV0aW9uIGZvciB0aGUgeGZlciBwYWdlIHBhY2tldCAqLwotCWlmIChmU2VuZFJlY2VpdmVDb21wKQotCQlOZXRWc2NTZW5kUmVjZWl2ZUNvbXBsZXRpb24oZGV2aWNlLCB0cmFuc2FjdGlvbklkKTsKKwlpZiAoZnNlbmRfcmVjZWl2ZV9jb21wKQorCQluZXR2c2Nfc2VuZF9yZWN2X2NvbXBsZXRpb24oZGV2aWNlLCB0cmFuc2FjdGlvbl9pZCk7CiAKLQlQdXROZXREZXZpY2UoZGV2aWNlKTsKKwlwdXRfbmV0X2RldmljZShkZXZpY2UpOwogfQogCi1zdGF0aWMgdm9pZCBOZXRWc2NPbkNoYW5uZWxDYWxsYmFjayh2b2lkICpDb250ZXh0KQorc3RhdGljIHZvaWQgbmV0dnNjX2NoYW5uZWxfY2Iodm9pZCAqY29udGV4dCkKIHsKIAlpbnQgcmV0OwotCXN0cnVjdCBodl9kZXZpY2UgKmRldmljZSA9IENvbnRleHQ7Ci0Jc3RydWN0IG5ldHZzY19kZXZpY2UgKm5ldERldmljZTsKLQl1MzIgYnl0ZXNSZWN2ZDsKLQl1NjQgcmVxdWVzdElkOworCXN0cnVjdCBodl9kZXZpY2UgKmRldmljZSA9IGNvbnRleHQ7CisJc3RydWN0IG5ldHZzY19kZXZpY2UgKm5ldF9kZXZpY2U7CisJdTMyIGJ5dGVzX3JlY3ZkOworCXU2NCByZXF1ZXN0X2lkOwogCXVuc2lnbmVkIGNoYXIgKnBhY2tldDsKIAlzdHJ1Y3Qgdm1wYWNrZXRfZGVzY3JpcHRvciAqZGVzYzsKIAl1bnNpZ25lZCBjaGFyICpidWZmZXI7CkBAIC0xMjQxLDM3ICsxMjg0LDM3IEBACiAJCXJldHVybjsKIAlidWZmZXIgPSBwYWNrZXQ7CiAKLQluZXREZXZpY2UgPSBHZXRJbmJvdW5kTmV0RGV2aWNlKGRldmljZSk7Ci0JaWYgKCFuZXREZXZpY2UpIHsKKwluZXRfZGV2aWNlID0gZ2V0X2luYm91bmRfbmV0X2RldmljZShkZXZpY2UpOworCWlmICghbmV0X2RldmljZSkgewogCQlEUFJJTlRfRVJSKE5FVFZTQywgIm5ldCBkZXZpY2UgKCVwKSBzaHV0dGluZyBkb3duLi4uIgotCQkJICAgImlnbm9yaW5nIGluYm91bmQgcGFja2V0cyIsIG5ldERldmljZSk7CisJCQkgICAiaWdub3JpbmcgaW5ib3VuZCBwYWNrZXRzIiwgbmV0X2RldmljZSk7CiAJCWdvdG8gb3V0OwogCX0KIAogCWRvIHsKIAkJcmV0ID0gdm1idXNfcmVjdnBhY2tldF9yYXcoZGV2aWNlLT5jaGFubmVsLCBidWZmZXIsIGJ1ZmZlcmxlbiwKLQkJCQkJICAgJmJ5dGVzUmVjdmQsICZyZXF1ZXN0SWQpOworCQkJCQkgICAmYnl0ZXNfcmVjdmQsICZyZXF1ZXN0X2lkKTsKIAkJaWYgKHJldCA9PSAwKSB7Ci0JCQlpZiAoYnl0ZXNSZWN2ZCA+IDApIHsKKwkJCWlmIChieXRlc19yZWN2ZCA+IDApIHsKIAkJCQlEUFJJTlRfREJHKE5FVFZTQywgInJlY2VpdmUgJWQgYnl0ZXMsIHRpZCAlbGx4IiwKLQkJCQkJICAgYnl0ZXNSZWN2ZCwgcmVxdWVzdElkKTsKKwkJCQkJICAgYnl0ZXNfcmVjdmQsIHJlcXVlc3RfaWQpOwogCiAJCQkJZGVzYyA9IChzdHJ1Y3Qgdm1wYWNrZXRfZGVzY3JpcHRvciAqKWJ1ZmZlcjsKIAkJCQlzd2l0Y2ggKGRlc2MtPlR5cGUpIHsKIAkJCQljYXNlIFZtYnVzUGFja2V0VHlwZUNvbXBsZXRpb246Ci0JCQkJCU5ldFZzY09uU2VuZENvbXBsZXRpb24oZGV2aWNlLCBkZXNjKTsKKwkJCQkJbmV0dnNjX3NlbmRfY29tcGxldGlvbihkZXZpY2UsIGRlc2MpOwogCQkJCQlicmVhazsKIAogCQkJCWNhc2UgVm1idXNQYWNrZXRUeXBlRGF0YVVzaW5nVHJhbnNmZXJQYWdlczoKLQkJCQkJTmV0VnNjT25SZWNlaXZlKGRldmljZSwgZGVzYyk7CisJCQkJCW5ldHZzY19yZWNlaXZlKGRldmljZSwgZGVzYyk7CiAJCQkJCWJyZWFrOwogCiAJCQkJZGVmYXVsdDoKIAkJCQkJRFBSSU5UX0VSUihORVRWU0MsCiAJCQkJCQkgICAidW5oYW5kbGVkIHBhY2tldCB0eXBlICVkLCAiCiAJCQkJCQkgICAidGlkICVsbHggbGVuICVkXG4iLAotCQkJCQkJICAgZGVzYy0+VHlwZSwgcmVxdWVzdElkLAotCQkJCQkJICAgYnl0ZXNSZWN2ZCk7CisJCQkJCQkgICBkZXNjLT5UeXBlLCByZXF1ZXN0X2lkLAorCQkJCQkJICAgYnl0ZXNfcmVjdmQpOwogCQkJCQlicmVhazsKIAkJCQl9CiAKQEAgLTEyOTMsMjAgKzEzMzYsMjAgQEAKIAkJCX0KIAkJfSBlbHNlIGlmIChyZXQgPT0gLTIpIHsKIAkJCS8qIEhhbmRsZSBsYXJnZSBwYWNrZXQgKi8KLQkJCWJ1ZmZlciA9IGttYWxsb2MoYnl0ZXNSZWN2ZCwgR0ZQX0FUT01JQyk7CisJCQlidWZmZXIgPSBrbWFsbG9jKGJ5dGVzX3JlY3ZkLCBHRlBfQVRPTUlDKTsKIAkJCWlmIChidWZmZXIgPT0gTlVMTCkgewogCQkJCS8qIFRyeSBhZ2FpbiBuZXh0IHRpbWUgYXJvdW5kICovCiAJCQkJRFBSSU5UX0VSUihORVRWU0MsCiAJCQkJCSAgICJ1bmFibGUgdG8gYWxsb2NhdGUgYnVmZmVyIG9mIHNpemUgIgotCQkJCQkgICAiKCVkKSEhIiwgYnl0ZXNSZWN2ZCk7CisJCQkJCSAgICIoJWQpISEiLCBieXRlc19yZWN2ZCk7CiAJCQkJYnJlYWs7CiAJCQl9CiAKLQkJCWJ1ZmZlcmxlbiA9IGJ5dGVzUmVjdmQ7CisJCQlidWZmZXJsZW4gPSBieXRlc19yZWN2ZDsKIAkJfQogCX0gd2hpbGUgKDEpOwogCi0JUHV0TmV0RGV2aWNlKGRldmljZSk7CisJcHV0X25ldF9kZXZpY2UoZGV2aWNlKTsKIG91dDoKIAlrZnJlZShidWZmZXIpOwogCXJldHVybjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9odi9uZXR2c2MuaCBiL2RyaXZlcnMvc3RhZ2luZy9odi9uZXR2c2MuaAppbmRleCBjNzFkY2U1Li45MzJhNzdjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaHYvbmV0dnNjLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2h2L25ldHZzYy5oCkBAIC0zOCw0OCArMzgsNDggQEAKICNkZWZpbmUgTlZTUF9NQVhfUFJPVE9DT0xfVkVSU0lPTglOVlNQX1BST1RPQ09MX1ZFUlNJT05fMQogCiBlbnVtIHsKLQlOdnNwTWVzc2FnZVR5cGVOb25lID0gMCwKKwlOVlNQX01TR19UWVBFX05PTkUgPSAwLAogCiAJLyogSW5pdCBNZXNzYWdlcyAqLwotCU52c3BNZXNzYWdlVHlwZUluaXQJCQk9IDEsCi0JTnZzcE1lc3NhZ2VUeXBlSW5pdENvbXBsZXRlCQk9IDIsCisJTlZTUF9NU0dfVFlQRV9JTklUCQkJPSAxLAorCU5WU1BfTVNHX1RZUEVfSU5JVF9DT01QTEVURQkJPSAyLAogCi0JTnZzcFZlcnNpb25NZXNzYWdlU3RhcnQJCQk9IDEwMCwKKwlOVlNQX1ZFUlNJT05fTVNHX1NUQVJUCQkJPSAxMDAsCiAKIAkvKiBWZXJzaW9uIDEgTWVzc2FnZXMgKi8KLQlOdnNwTWVzc2FnZTFUeXBlU2VuZE5kaXNWZXJzaW9uCQk9IE52c3BWZXJzaW9uTWVzc2FnZVN0YXJ0LAorCU5WU1BfTVNHMV9UWVBFX1NFTkRfTkRJU19WRVIJCT0gTlZTUF9WRVJTSU9OX01TR19TVEFSVCwKIAotCU52c3BNZXNzYWdlMVR5cGVTZW5kUmVjZWl2ZUJ1ZmZlciwKLQlOdnNwTWVzc2FnZTFUeXBlU2VuZFJlY2VpdmVCdWZmZXJDb21wbGV0ZSwKLQlOdnNwTWVzc2FnZTFUeXBlUmV2b2tlUmVjZWl2ZUJ1ZmZlciwKKwlOVlNQX01TRzFfVFlQRV9TRU5EX1JFQ1ZfQlVGLAorCU5WU1BfTVNHMV9UWVBFX1NFTkRfUkVDVl9CVUZfQ09NUExFVEUsCisJTlZTUF9NU0cxX1RZUEVfUkVWT0tFX1JFQ1ZfQlVGLAogCi0JTnZzcE1lc3NhZ2UxVHlwZVNlbmRTZW5kQnVmZmVyLAotCU52c3BNZXNzYWdlMVR5cGVTZW5kU2VuZEJ1ZmZlckNvbXBsZXRlLAotCU52c3BNZXNzYWdlMVR5cGVSZXZva2VTZW5kQnVmZmVyLAorCU5WU1BfTVNHMV9UWVBFX1NFTkRfU0VORF9CVUYsCisJTlZTUF9NU0cxX1RZUEVfU0VORF9TRU5EX0JVRl9DT01QTEVURSwKKwlOVlNQX01TRzFfVFlQRV9SRVZPS0VfU0VORF9CVUYsCiAKLQlOdnNwTWVzc2FnZTFUeXBlU2VuZFJORElTUGFja2V0LAotCU52c3BNZXNzYWdlMVR5cGVTZW5kUk5ESVNQYWNrZXRDb21wbGV0ZSwKKwlOVlNQX01TRzFfVFlQRV9TRU5EX1JORElTX1BLVCwKKwlOVlNQX01TRzFfVFlQRV9TRU5EX1JORElTX1BLVF9DT01QTEVURSwKIAogCS8qCiAJICogVGhpcyBzaG91bGQgYmUgc2V0IHRvIHRoZSBudW1iZXIgb2YgbWVzc2FnZXMgZm9yIHRoZSB2ZXJzaW9uIHdpdGgKIAkgKiB0aGUgbWF4aW11bSBudW1iZXIgb2YgbWVzc2FnZXMuCiAJICovCi0JTnZzcE51bU1lc3NhZ2VQZXJWZXJzaW9uCQk9IDksCisJTlZTUF9OVU1fTVNHX1BFUl9WRVJTSU9OCQk9IDksCiB9OwogCiBlbnVtIHsKLQlOdnNwU3RhdHVzTm9uZSA9IDAsCi0JTnZzcFN0YXR1c1N1Y2Nlc3MsCi0JTnZzcFN0YXR1c0ZhaWx1cmUsCi0JTnZzcFN0YXR1c1Byb3RvY29sVmVyc2lvblJhbmdlVG9vTmV3LAotCU52c3BTdGF0dXNQcm90b2NvbFZlcnNpb25SYW5nZVRvb09sZCwKLQlOdnNwU3RhdHVzSW52YWxpZFJuZGlzUGFja2V0LAotCU52c3BTdGF0dXNCdXN5LAotCU52c3BTdGF0dXNNYXgsCisJTlZTUF9TVEFUX05PTkUgPSAwLAorCU5WU1BfU1RBVF9TVUNDRVNTLAorCU5WU1BfU1RBVF9GQUlMLAorCU5WU1BfU1RBVF9QUk9UT0NPTF9UT09fTkVXLAorCU5WU1BfU1RBVF9QUk9UT0NPTF9UT09fT0xELAorCU5WU1BfU1RBVF9JTlZBTElEX1JORElTX1BLVCwKKwlOVlNQX1NUQVRfQlVTWSwKKwlOVlNQX1NUQVRfTUFYLAogfTsKIAogc3RydWN0IG52c3BfbWVzc2FnZV9oZWFkZXIgewotCXUzMiBNZXNzYWdlVHlwZTsKKwl1MzIgbXNnX3R5cGU7CiB9OwogCiAvKiBJbml0IE1lc3NhZ2VzICovCkBAIC05MCw4ICs5MCw4IEBACiAgKiB2ZXJzaW9uaW5nIChpLmUuIHRoaXMgbWVzc2FnZSB3aWxsIGJlIHRoZSBzYW1lIGZvciBldmVyKS4KICAqLwogc3RydWN0IG52c3BfbWVzc2FnZV9pbml0IHsKLQl1MzIgTWluUHJvdG9jb2xWZXJzaW9uOwotCXUzMiBNYXhQcm90b2NvbFZlcnNpb247CisJdTMyIG1pbl9wcm90b2NvbF92ZXI7CisJdTMyIG1heF9wcm90b2NvbF92ZXI7CiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCiAvKgpAQCAtMTAwLDE0ICsxMDAsMTQgQEAKICAqIChpLmUuIHRoaXMgbWVzc2FnZSB3aWxsIGJlIHRoZSBzYW1lIGZvciBldmVyKS4KICAqLwogc3RydWN0IG52c3BfbWVzc2FnZV9pbml0X2NvbXBsZXRlIHsKLQl1MzIgTmVnb3RpYXRlZFByb3RvY29sVmVyc2lvbjsKLQl1MzIgTWF4aW11bU1kbENoYWluTGVuZ3RoOwotCXUzMiBTdGF0dXM7CisJdTMyIG5lZ290aWF0ZWRfcHJvdG9jb2xfdmVyOworCXUzMiBtYXhfbWRsX2NoYWluX2xlbjsKKwl1MzIgc3RhdHVzOwogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIAogdW5pb24gbnZzcF9tZXNzYWdlX2luaXRfdWJlciB7Ci0Jc3RydWN0IG52c3BfbWVzc2FnZV9pbml0IEluaXQ7Ci0Jc3RydWN0IG52c3BfbWVzc2FnZV9pbml0X2NvbXBsZXRlIEluaXRDb21wbGV0ZTsKKwlzdHJ1Y3QgbnZzcF9tZXNzYWdlX2luaXQgaW5pdDsKKwlzdHJ1Y3QgbnZzcF9tZXNzYWdlX2luaXRfY29tcGxldGUgaW5pdF9jb21wbGV0ZTsKIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CiAKIC8qIFZlcnNpb24gMSBNZXNzYWdlcyAqLwpAQCAtMTE3LDggKzExNyw4IEBACiAgKiBjYW4gdXNlIHRoaXMgaW5mb3JtYXRpb24gd2hlbiBoYW5kbGluZyBPSURzIHNlbnQgYnkgdGhlIFZTQy4KICAqLwogc3RydWN0IG52c3BfMV9tZXNzYWdlX3NlbmRfbmRpc192ZXJzaW9uIHsKLQl1MzIgTmRpc01ham9yVmVyc2lvbjsKLQl1MzIgTmRpc01pbm9yVmVyc2lvbjsKKwl1MzIgbmRpc19tYWpvcl92ZXI7CisJdTMyIG5kaXNfbWlub3JfdmVyOwogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIAogLyoKQEAgLTEyNiwxNSArMTI2LDE1IEBACiAgKiBjYW4gdGhlbiB1c2UgdGhlIHJlY2VpdmUgYnVmZmVyIHRvIHNlbmQgZGF0YSB0byB0aGUgVlNDLgogICovCiBzdHJ1Y3QgbnZzcF8xX21lc3NhZ2Vfc2VuZF9yZWNlaXZlX2J1ZmZlciB7Ci0JdTMyIEdwYWRsSGFuZGxlOwotCXUxNiBJZDsKKwl1MzIgZ3BhZGxfaGFuZGxlOworCXUxNiBpZDsKIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CiAKIHN0cnVjdCBudnNwXzFfcmVjZWl2ZV9idWZmZXJfc2VjdGlvbiB7Ci0JdTMyIE9mZnNldDsKLQl1MzIgU3ViQWxsb2NhdGlvblNpemU7Ci0JdTMyIE51bVN1YkFsbG9jYXRpb25zOwotCXUzMiBFbmRPZmZzZXQ7CisJdTMyIG9mZnNldDsKKwl1MzIgc3ViX2FsbG9jX3NpemU7CisJdTMyIG51bV9zdWJfYWxsb2NzOworCXUzMiBlbmRfb2Zmc2V0OwogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIAogLyoKQEAgLTE0Myw4ICsxNDMsOCBAQAogICogYnVmZmVyLgogICovCiBzdHJ1Y3QgbnZzcF8xX21lc3NhZ2Vfc2VuZF9yZWNlaXZlX2J1ZmZlcl9jb21wbGV0ZSB7Ci0JdTMyIFN0YXR1czsKLQl1MzIgTnVtU2VjdGlvbnM7CisJdTMyIHN0YXR1czsKKwl1MzIgbnVtX3NlY3Rpb25zOwogCiAJLyoKIAkgKiBUaGUgcmVjZWl2ZSBidWZmZXIgaXMgc3BsaXQgaW50byB0d28gcGFydHMsIGEgbGFyZ2Ugc3ViYWxsb2NhdGlvbgpAQCAtMTY1LDcgKzE2NSw3IEBACiAJICogIExhcmdlT2Zmc2V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsT2Zmc2V0CiAJICovCiAKLQlzdHJ1Y3QgbnZzcF8xX3JlY2VpdmVfYnVmZmVyX3NlY3Rpb24gU2VjdGlvbnNbMV07CisJc3RydWN0IG52c3BfMV9yZWNlaXZlX2J1ZmZlcl9zZWN0aW9uIHNlY3Rpb25zWzFdOwogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIAogLyoKQEAgLTE3NCw3ICsxNzQsNyBAQAogICogYWdhaW4uCiAgKi8KIHN0cnVjdCBudnNwXzFfbWVzc2FnZV9yZXZva2VfcmVjZWl2ZV9idWZmZXIgewotCXUxNiBJZDsKKwl1MTYgaWQ7CiB9OwogCiAvKgpAQCAtMTgyLDggKzE4Miw4IEBACiAgKiBjYW4gdGhlbiB1c2UgdGhlIHNlbmQgYnVmZmVyIHRvIHNlbmQgZGF0YSB0byB0aGUgVlNQLgogICovCiBzdHJ1Y3QgbnZzcF8xX21lc3NhZ2Vfc2VuZF9zZW5kX2J1ZmZlciB7Ci0JdTMyIEdwYWRsSGFuZGxlOwotCXUxNiBJZDsKKwl1MzIgZ3BhZGxfaGFuZGxlOworCXUxNiBpZDsKIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CiAKIC8qCkBAIC0xOTIsNyArMTkyLDcgQEAKICAqIGJ1ZmZlci4KICAqLwogc3RydWN0IG52c3BfMV9tZXNzYWdlX3NlbmRfc2VuZF9idWZmZXJfY29tcGxldGUgewotCXUzMiBTdGF0dXM7CisJdTMyIHN0YXR1czsKIAogCS8qCiAJICogVGhlIFZTQyBnZXRzIHRvIGNob29zZSB0aGUgc2l6ZSBvZiB0aGUgc2VuZCBidWZmZXIgYW5kIHRoZSBWU1AgZ2V0cwpAQCAtMjAwLDcgKzIwMCw3IEBACiAJICogZHluYW1pYyByZWNvbmZpZ3VyYXRpb25zIHdoZW4gdGhlIGNvc3Qgb2YgR1BBLWRpcmVjdCBidWZmZXJzCiAJICogZGVjcmVhc2VzLgogCSAqLwotCXUzMiBTZWN0aW9uU2l6ZTsKKwl1MzIgc2VjdGlvbl9zaXplOwogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIAogLyoKQEAgLTIwOCw3ICsyMDgsNyBAQAogICogY29tcGxldGVzIHRoaXMgdHJhbnNhY3Rpb24sIHRoZSB2c3Agc2hvdWxkIG5ldmVyIHVzZSB0aGUgc2VuZCBidWZmZXIgYWdhaW4uCiAgKi8KIHN0cnVjdCBudnNwXzFfbWVzc2FnZV9yZXZva2Vfc2VuZF9idWZmZXIgewotCXUxNiBJZDsKKwl1MTYgaWQ7CiB9OwogCiAvKgpAQCAtMjIxLDcgKzIyMSw3IEBACiAJICogY2hhbm5lbHMgb2YgY29tbXVuaWNhdGlvbi4gSG93ZXZlciwgdGhlIE5ldHdvcmsgVlNQIG9ubHkgaGFzIG9uZS4KIAkgKiBUaGVyZWZvcmUsIHRoZSBjaGFubmVsIHRyYXZlbHMgd2l0aCB0aGUgUk5ESVMgcGFja2V0LgogCSAqLwotCXUzMiBDaGFubmVsVHlwZTsKKwl1MzIgY2hhbm5lbF90eXBlOwogCiAJLyoKIAkgKiBUaGlzIGZpZWxkIGlzIHVzZWQgdG8gc2VuZCBwYXJ0IG9yIGFsbCBvZiB0aGUgZGF0YSB0aHJvdWdoIGEgc2VuZApAQCAtMjI5LDggKzIyOSw4IEBACiAJICogaW5kZXggaXMgMHhGRkZGRkZGRiwgdGhlbiB0aGUgc2VuZCBidWZmZXIgaXMgbm90IGJlaW5nIHVzZWQgYW5kIGFsbAogCSAqIG9mIHRoZSBkYXRhIHdhcyBzZW50IHRocm91Z2ggb3RoZXIgVk1CdXMgbWVjaGFuaXNtcy4KIAkgKi8KLQl1MzIgU2VuZEJ1ZmZlclNlY3Rpb25JbmRleDsKLQl1MzIgU2VuZEJ1ZmZlclNlY3Rpb25TaXplOworCXUzMiBzZW5kX2J1Zl9zZWN0aW9uX2luZGV4OworCXUzMiBzZW5kX2J1Zl9zZWN0aW9uX3NpemU7CiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCiAvKgpAQCAtMjM5LDM1ICsyMzksMzUgQEAKICAqIG1lc3NhZ2UgY2Fubm90IHVzZSBhbnkgcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aCB0aGUgb3JpZ2luYWwgUk5ESVMgcGFja2V0LgogICovCiBzdHJ1Y3QgbnZzcF8xX21lc3NhZ2Vfc2VuZF9ybmRpc19wYWNrZXRfY29tcGxldGUgewotCXUzMiBTdGF0dXM7CisJdTMyIHN0YXR1czsKIH07CiAKIHVuaW9uIG52c3BfMV9tZXNzYWdlX3ViZXIgewotCXN0cnVjdCBudnNwXzFfbWVzc2FnZV9zZW5kX25kaXNfdmVyc2lvbiBTZW5kTmRpc1ZlcnNpb247CisJc3RydWN0IG52c3BfMV9tZXNzYWdlX3NlbmRfbmRpc192ZXJzaW9uIHNlbmRfbmRpc192ZXI7CiAKLQlzdHJ1Y3QgbnZzcF8xX21lc3NhZ2Vfc2VuZF9yZWNlaXZlX2J1ZmZlciBTZW5kUmVjZWl2ZUJ1ZmZlcjsKKwlzdHJ1Y3QgbnZzcF8xX21lc3NhZ2Vfc2VuZF9yZWNlaXZlX2J1ZmZlciBzZW5kX3JlY3ZfYnVmOwogCXN0cnVjdCBudnNwXzFfbWVzc2FnZV9zZW5kX3JlY2VpdmVfYnVmZmVyX2NvbXBsZXRlCi0JCQkJCQlTZW5kUmVjZWl2ZUJ1ZmZlckNvbXBsZXRlOwotCXN0cnVjdCBudnNwXzFfbWVzc2FnZV9yZXZva2VfcmVjZWl2ZV9idWZmZXIgUmV2b2tlUmVjZWl2ZUJ1ZmZlcjsKKwkJCQkJCXNlbmRfcmVjdl9idWZfY29tcGxldGU7CisJc3RydWN0IG52c3BfMV9tZXNzYWdlX3Jldm9rZV9yZWNlaXZlX2J1ZmZlciByZXZva2VfcmVjdl9idWY7CiAKLQlzdHJ1Y3QgbnZzcF8xX21lc3NhZ2Vfc2VuZF9zZW5kX2J1ZmZlciBTZW5kU2VuZEJ1ZmZlcjsKLQlzdHJ1Y3QgbnZzcF8xX21lc3NhZ2Vfc2VuZF9zZW5kX2J1ZmZlcl9jb21wbGV0ZSBTZW5kU2VuZEJ1ZmZlckNvbXBsZXRlOwotCXN0cnVjdCBudnNwXzFfbWVzc2FnZV9yZXZva2Vfc2VuZF9idWZmZXIgUmV2b2tlU2VuZEJ1ZmZlcjsKKwlzdHJ1Y3QgbnZzcF8xX21lc3NhZ2Vfc2VuZF9zZW5kX2J1ZmZlciBzZW5kX3NlbmRfYnVmOworCXN0cnVjdCBudnNwXzFfbWVzc2FnZV9zZW5kX3NlbmRfYnVmZmVyX2NvbXBsZXRlIHNlbmRfc2VuZF9idWZfY29tcGxldGU7CisJc3RydWN0IG52c3BfMV9tZXNzYWdlX3Jldm9rZV9zZW5kX2J1ZmZlciByZXZva2Vfc2VuZF9idWY7CiAKLQlzdHJ1Y3QgbnZzcF8xX21lc3NhZ2Vfc2VuZF9ybmRpc19wYWNrZXQgU2VuZFJORElTUGFja2V0OworCXN0cnVjdCBudnNwXzFfbWVzc2FnZV9zZW5kX3JuZGlzX3BhY2tldCBzZW5kX3JuZGlzX3BrdDsKIAlzdHJ1Y3QgbnZzcF8xX21lc3NhZ2Vfc2VuZF9ybmRpc19wYWNrZXRfY29tcGxldGUKLQkJCQkJCVNlbmRSTkRJU1BhY2tldENvbXBsZXRlOworCQkJCQkJc2VuZF9ybmRpc19wa3RfY29tcGxldGU7CiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCiB1bmlvbiBudnNwX2FsbF9tZXNzYWdlcyB7Ci0JdW5pb24gbnZzcF9tZXNzYWdlX2luaXRfdWJlciBJbml0TWVzc2FnZXM7Ci0JdW5pb24gbnZzcF8xX21lc3NhZ2VfdWJlciBWZXJzaW9uMU1lc3NhZ2VzOworCXVuaW9uIG52c3BfbWVzc2FnZV9pbml0X3ViZXIgaW5pdF9tc2c7CisJdW5pb24gbnZzcF8xX21lc3NhZ2VfdWJlciB2MV9tc2c7CiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCiAvKiBBTEwgTWVzc2FnZXMgKi8KIHN0cnVjdCBudnNwX21lc3NhZ2UgewotCXN0cnVjdCBudnNwX21lc3NhZ2VfaGVhZGVyIEhlYWRlcjsKLQl1bmlvbiBudnNwX2FsbF9tZXNzYWdlcyBNZXNzYWdlczsKKwlzdHJ1Y3QgbnZzcF9tZXNzYWdlX2hlYWRlciBoZHI7CisJdW5pb24gbnZzcF9hbGxfbWVzc2FnZXMgbXNnOwogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIAogCkBAIC0yOTMsMzkgKzI5MywzOSBAQAogCiAvKiBQZXIgbmV0dnNjIGNoYW5uZWwtc3BlY2lmaWMgKi8KIHN0cnVjdCBuZXR2c2NfZGV2aWNlIHsKLQlzdHJ1Y3QgaHZfZGV2aWNlICpEZXZpY2U7CisJc3RydWN0IGh2X2RldmljZSAqZGV2OwogCi0JYXRvbWljX3QgUmVmQ291bnQ7Ci0JYXRvbWljX3QgTnVtT3V0c3RhbmRpbmdTZW5kczsKKwlhdG9taWNfdCByZWZjbnQ7CisJYXRvbWljX3QgbnVtX291dHN0YW5kaW5nX3NlbmRzOwogCS8qCiAJICogTGlzdCBvZiBmcmVlIHByZWFsbG9jYXRlZCBodl9uZXR2c2NfcGFja2V0IHRvIHJlcHJlc2VudCByZWNlaXZlCiAJICogcGFja2V0CiAJICovCi0Jc3RydWN0IGxpc3RfaGVhZCBSZWNlaXZlUGFja2V0TGlzdDsKLQlzcGlubG9ja190IHJlY2VpdmVfcGFja2V0X2xpc3RfbG9jazsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHJlY3ZfcGt0X2xpc3Q7CisJc3BpbmxvY2tfdCByZWN2X3BrdF9saXN0X2xvY2s7CiAKIAkvKiBTZW5kIGJ1ZmZlciBhbGxvY2F0ZWQgYnkgdXMgYnV0IG1hbmFnZXMgYnkgTmV0VlNQICovCi0Jdm9pZCAqU2VuZEJ1ZmZlcjsKLQl1MzIgU2VuZEJ1ZmZlclNpemU7Ci0JdTMyIFNlbmRCdWZmZXJHcGFkbEhhbmRsZTsKLQl1MzIgU2VuZFNlY3Rpb25TaXplOworCXZvaWQgKnNlbmRfYnVmOworCXUzMiBzZW5kX2J1Zl9zaXplOworCXUzMiBzZW5kX2J1Zl9ncGFkbF9oYW5kbGU7CisJdTMyIHNlbmRfc2VjdGlvbl9zaXplOwogCiAJLyogUmVjZWl2ZSBidWZmZXIgYWxsb2NhdGVkIGJ5IHVzIGJ1dCBtYW5hZ2VzIGJ5IE5ldFZTUCAqLwotCXZvaWQgKlJlY2VpdmVCdWZmZXI7Ci0JdTMyIFJlY2VpdmVCdWZmZXJTaXplOwotCXUzMiBSZWNlaXZlQnVmZmVyR3BhZGxIYW5kbGU7Ci0JdTMyIFJlY2VpdmVTZWN0aW9uQ291bnQ7Ci0Jc3RydWN0IG52c3BfMV9yZWNlaXZlX2J1ZmZlcl9zZWN0aW9uICpSZWNlaXZlU2VjdGlvbnM7CisJdm9pZCAqcmVjdl9idWY7CisJdTMyIHJlY3ZfYnVmX3NpemU7CisJdTMyIHJlY3ZfYnVmX2dwYWRsX2hhbmRsZTsKKwl1MzIgcmVjdl9zZWN0aW9uX2NudDsKKwlzdHJ1Y3QgbnZzcF8xX3JlY2VpdmVfYnVmZmVyX3NlY3Rpb24gKnJlY3Zfc2VjdGlvbjsKIAogCS8qIFVzZWQgZm9yIE5ldFZTUCBpbml0aWFsaXphdGlvbiBwcm90b2NvbCAqLwotCXN0cnVjdCBvc2Rfd2FpdGV2ZW50ICpDaGFubmVsSW5pdEV2ZW50OwotCXN0cnVjdCBudnNwX21lc3NhZ2UgQ2hhbm5lbEluaXRQYWNrZXQ7CisJc3RydWN0IG9zZF93YWl0ZXZlbnQgKmNoYW5uZWxfaW5pdF9ldmVudDsKKwlzdHJ1Y3QgbnZzcF9tZXNzYWdlIGNoYW5uZWxfaW5pdF9wa3Q7CiAKLQlzdHJ1Y3QgbnZzcF9tZXNzYWdlIFJldm9rZVBhY2tldDsKKwlzdHJ1Y3QgbnZzcF9tZXNzYWdlIHJldm9rZV9wYWNrZXQ7CiAJLyogdW5zaWduZWQgY2hhciBId01hY0FkZHJbSFdfTUFDQUREUl9MRU5dOyAqLwogCiAJLyogSG9sZHMgcm5kaXMgZGV2aWNlIGluZm8gKi8KLQl2b2lkICpFeHRlbnNpb247CisJdm9pZCAqZXh0ZW5zaW9uOwogfTsKIAogI2VuZGlmIC8qIF9ORVRWU0NfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9odi9uZXR2c2NfYXBpLmggYi9kcml2ZXJzL3N0YWdpbmcvaHYvbmV0dnNjX2FwaS5oCmluZGV4IDRiNWIzYWMuLmI0YmVkMzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9odi9uZXR2c2NfYXBpLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2h2L25ldHZzY19hcGkuaApAQCAtMzIsMTAgKzMyLDEwIEBACiAKIC8qIFJlcHJlc2VudCB0aGUgeGZlciBwYWdlIHBhY2tldCB3aGljaCBjb250YWlucyAxIG9yIG1vcmUgbmV0dnNjIHBhY2tldCAqLwogc3RydWN0IHhmZXJwYWdlX3BhY2tldCB7Ci0Jc3RydWN0IGxpc3RfaGVhZCBMaXN0RW50cnk7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0X2VudDsKIAogCS8qICMgb2YgbmV0dnNjIHBhY2tldHMgdGhpcyB4ZmVyIHBhY2tldCBjb250YWlucyAqLwotCXUzMiBDb3VudDsKKwl1MzIgY291bnQ7CiB9OwogCiAvKiBUaGUgbnVtYmVyIG9mIHBhZ2VzIHdoaWNoIGFyZSBlbm91Z2ggdG8gY292ZXIganVtYm8gZnJhbWUgYnVmZmVyLiAqLwpAQCAtNDcsNzAgKzQ3LDcwIEBACiAgKi8KIHN0cnVjdCBodl9uZXR2c2NfcGFja2V0IHsKIAkvKiBCb29ra2VlcGluZyBzdHVmZiAqLwotCXN0cnVjdCBsaXN0X2hlYWQgTGlzdEVudHJ5OworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdF9lbnQ7CiAKLQlzdHJ1Y3QgaHZfZGV2aWNlICpEZXZpY2U7Ci0JYm9vbCBJc0RhdGFQYWNrZXQ7CisJc3RydWN0IGh2X2RldmljZSAqZGV2aWNlOworCWJvb2wgaXNfZGF0YV9wa3Q7CiAKIAkvKgogCSAqIFZhbGlkIG9ubHkgZm9yIHJlY2VpdmVzIHdoZW4gd2UgYnJlYWsgYSB4ZmVyIHBhZ2UgcGFja2V0CiAJICogaW50byBtdWx0aXBsZSBuZXR2c2MgcGFja2V0cwogCSAqLwotCXN0cnVjdCB4ZmVycGFnZV9wYWNrZXQgKlhmZXJQYWdlUGFja2V0OworCXN0cnVjdCB4ZmVycGFnZV9wYWNrZXQgKnhmZXJfcGFnZV9wa3Q7CiAKIAl1bmlvbiB7CiAJCXN0cnVjdHsKLQkJCXU2NCBSZWNlaXZlQ29tcGxldGlvblRpZDsKLQkJCXZvaWQgKlJlY2VpdmVDb21wbGV0aW9uQ29udGV4dDsKLQkJCXZvaWQgKCpPblJlY2VpdmVDb21wbGV0aW9uKSh2b2lkICpjb250ZXh0KTsKLQkJfSBSZWN2OworCQkJdTY0IHJlY3ZfY29tcGxldGlvbl90aWQ7CisJCQl2b2lkICpyZWN2X2NvbXBsZXRpb25fY3R4OworCQkJdm9pZCAoKnJlY3ZfY29tcGxldGlvbikodm9pZCAqY29udGV4dCk7CisJCX0gcmVjdjsKIAkJc3RydWN0ewotCQkJdTY0IFNlbmRDb21wbGV0aW9uVGlkOwotCQkJdm9pZCAqU2VuZENvbXBsZXRpb25Db250ZXh0OwotCQkJdm9pZCAoKk9uU2VuZENvbXBsZXRpb24pKHZvaWQgKmNvbnRleHQpOwotCQl9IFNlbmQ7Ci0JfSBDb21wbGV0aW9uOworCQkJdTY0IHNlbmRfY29tcGxldGlvbl90aWQ7CisJCQl2b2lkICpzZW5kX2NvbXBsZXRpb25fY3R4OworCQkJdm9pZCAoKnNlbmRfY29tcGxldGlvbikodm9pZCAqY29udGV4dCk7CisJCX0gc2VuZDsKKwl9IGNvbXBsZXRpb247CiAKLQkvKiBUaGlzIHBvaW50cyB0byB0aGUgbWVtb3J5IGFmdGVyIFBhZ2VCdWZmZXJzICovCi0Jdm9pZCAqRXh0ZW5zaW9uOworCS8qIFRoaXMgcG9pbnRzIHRvIHRoZSBtZW1vcnkgYWZ0ZXIgcGFnZV9idWYgKi8KKwl2b2lkICpleHRlbnNpb247CiAKLQl1MzIgVG90YWxEYXRhQnVmZmVyTGVuZ3RoOworCXUzMiB0b3RhbF9kYXRhX2J1ZmxlbjsKIAkvKiBQb2ludHMgdG8gdGhlIHNlbmQvcmVjZWl2ZSBidWZmZXIgd2hlcmUgdGhlIGV0aGVybmV0IGZyYW1lIGlzICovCi0JdTMyIFBhZ2VCdWZmZXJDb3VudDsKLQlzdHJ1Y3QgaHZfcGFnZV9idWZmZXIgUGFnZUJ1ZmZlcnNbTkVUVlNDX1BBQ0tFVF9NQVhQQUdFXTsKKwl1MzIgcGFnZV9idWZfY250OworCXN0cnVjdCBodl9wYWdlX2J1ZmZlciBwYWdlX2J1ZltORVRWU0NfUEFDS0VUX01BWFBBR0VdOwogfTsKIAogLyogUmVwcmVzZW50cyB0aGUgbmV0IHZzYyBkcml2ZXIgKi8KIHN0cnVjdCBuZXR2c2NfZHJpdmVyIHsKIAkvKiBNdXN0IGJlIHRoZSBmaXJzdCBmaWVsZCAqLwogCS8qIFdoaWNoIGlzIGEgYnVnIEZJWE1FISAqLwotCXN0cnVjdCBodl9kcml2ZXIgQmFzZTsKKwlzdHJ1Y3QgaHZfZHJpdmVyIGJhc2U7CiAKLQl1MzIgUmluZ0J1ZmZlclNpemU7Ci0JdTMyIFJlcXVlc3RFeHRTaXplOworCXUzMiByaW5nX2J1Zl9zaXplOworCXUzMiByZXFfZXh0X3NpemU7CiAKIAkvKgogCSAqIFRoaXMgaXMgc2V0IGJ5IHRoZSBjYWxsZXIgdG8gYWxsb3cgdXMgdG8gY2FsbGJhY2sgd2hlbiB3ZQogCSAqIHJlY2VpdmUgYSBwYWNrZXQgZnJvbSB0aGUgIndpcmUiCiAJICovCi0JaW50ICgqT25SZWNlaXZlQ2FsbGJhY2spKHN0cnVjdCBodl9kZXZpY2UgKmRldiwKKwlpbnQgKCpyZWN2X2NiKShzdHJ1Y3QgaHZfZGV2aWNlICpkZXYsCiAJCQkJIHN0cnVjdCBodl9uZXR2c2NfcGFja2V0ICpwYWNrZXQpOwotCXZvaWQgKCpPbkxpbmtTdGF0dXNDaGFuZ2VkKShzdHJ1Y3QgaHZfZGV2aWNlICpkZXYsIHUzMiBTdGF0dXMpOworCXZvaWQgKCpsaW5rX3N0YXR1c19jaGFuZ2UpKHN0cnVjdCBodl9kZXZpY2UgKmRldiwgdTMyIHN0YXR1cyk7CiAKIAkvKiBTcGVjaWZpYyB0byB0aGlzIGRyaXZlciAqLwotCWludCAoKk9uU2VuZCkoc3RydWN0IGh2X2RldmljZSAqZGV2LCBzdHJ1Y3QgaHZfbmV0dnNjX3BhY2tldCAqcGFja2V0KTsKKwlpbnQgKCpzZW5kKShzdHJ1Y3QgaHZfZGV2aWNlICpkZXYsIHN0cnVjdCBodl9uZXR2c2NfcGFja2V0ICpwYWNrZXQpOwogCi0Jdm9pZCAqQ29udGV4dDsKKwl2b2lkICpjdHg7CiB9OwogCiBzdHJ1Y3QgbmV0dnNjX2RldmljZV9pbmZvIHsKLSAgICB1bnNpZ25lZCBjaGFyIE1hY0FkZHJbNl07Ci0gICAgYm9vbCBMaW5rU3RhdGU7CS8qIDAgLSBsaW5rIHVwLCAxIC0gbGluayBkb3duICovCisJdW5zaWduZWQgY2hhciBtYWNfYWRyWzZdOworCWJvb2wgbGlua19zdGF0ZTsJLyogMCAtIGxpbmsgdXAsIDEgLSBsaW5rIGRvd24gKi8KIH07CiAKIC8qIEludGVyZmFjZSAqLwotaW50IE5ldFZzY0luaXRpYWxpemUoc3RydWN0IGh2X2RyaXZlciAqZHJ2KTsKLWludCBSbmRpc0ZpbHRlck9uT3BlbihzdHJ1Y3QgaHZfZGV2aWNlICpEZXZpY2UpOwotaW50IFJuZGlzRmlsdGVyT25DbG9zZShzdHJ1Y3QgaHZfZGV2aWNlICpEZXZpY2UpOworaW50IG5ldHZzY19pbml0aWFsaXplKHN0cnVjdCBodl9kcml2ZXIgKmRydik7CitpbnQgcm5kaXNfZmlsdGVyX29wZW4oc3RydWN0IGh2X2RldmljZSAqZGV2KTsKK2ludCBybmRpc19maWx0ZXJfY2xvc2Uoc3RydWN0IGh2X2RldmljZSAqZGV2KTsKIAogI2VuZGlmIC8qIF9ORVRWU0NfQVBJX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaHYvbmV0dnNjX2Rydi5jIGIvZHJpdmVycy9zdGFnaW5nL2h2L25ldHZzY19kcnYuYwppbmRleCAxNDE1MzUyLi4wMTQ3YjQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaHYvbmV0dnNjX2Rydi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9odi9uZXR2c2NfZHJ2LmMKQEAgLTY2LDYgKzY2LDkgQEAKIC8qIFRoZSBvbmUgYW5kIG9ubHkgb25lICovCiBzdGF0aWMgc3RydWN0IG5ldHZzY19kcml2ZXJfY29udGV4dCBnX25ldHZzY19kcnY7CiAKKy8qIG5vLW9wIHNvIHRoZSBuZXRkZXYgY29yZSBkb2Vzbid0IHJldHVybiAtRUlOVkFMIHdoZW4gbW9kaWZ5aW5nIHRoZSB0aGUKKyAqIG11bHRpY2FzdCBhZGRyZXNzIGxpc3QgaW4gU0lPQ0FERE1VTFRJLiBodiBpcyBzZXR1cCB0byBnZXQgYWxsIG11bHRpY2FzdAorICogd2hlbiBpdCBjYWxscyBSbmRpc0ZpbHRlck9uT3BlbigpICovCiBzdGF0aWMgdm9pZCBuZXR2c2Nfc2V0X211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpuZXQpCiB7CiB9CkBAIC03OCw3ICs4MSw3IEBACiAKIAlpZiAobmV0aWZfY2Fycmllcl9vayhuZXQpKSB7CiAJCS8qIE9wZW4gdXAgdGhlIGRldmljZSAqLwotCQlyZXQgPSBSbmRpc0ZpbHRlck9uT3BlbihkZXZpY2Vfb2JqKTsKKwkJcmV0ID0gcm5kaXNfZmlsdGVyX29wZW4oZGV2aWNlX29iaik7CiAJCWlmIChyZXQgIT0gMCkgewogCQkJRFBSSU5UX0VSUihORVRWU0NfRFJWLAogCQkJCSAgICJ1bmFibGUgdG8gb3BlbiBkZXZpY2UgKHJldCAlZCkuIiwgcmV0KTsKQEAgLTEwMSw3ICsxMDQsNyBAQAogCiAJbmV0aWZfc3RvcF9xdWV1ZShuZXQpOwogCi0JcmV0ID0gUm5kaXNGaWx0ZXJPbkNsb3NlKGRldmljZV9vYmopOworCXJldCA9IHJuZGlzX2ZpbHRlcl9jbG9zZShkZXZpY2Vfb2JqKTsKIAlpZiAocmV0ICE9IDApCiAJCURQUklOVF9FUlIoTkVUVlNDX0RSViwgInVuYWJsZSB0byBjbG9zZSBkZXZpY2UgKHJldCAlZCkuIiwgcmV0KTsKIApAQCAtMTEyLDcgKzExNSw3IEBACiB7CiAJc3RydWN0IGh2X25ldHZzY19wYWNrZXQgKnBhY2tldCA9IChzdHJ1Y3QgaHZfbmV0dnNjX3BhY2tldCAqKWNvbnRleHQ7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IChzdHJ1Y3Qgc2tfYnVmZiAqKQotCQkodW5zaWduZWQgbG9uZylwYWNrZXQtPkNvbXBsZXRpb24uU2VuZC5TZW5kQ29tcGxldGlvblRpZDsKKwkJKHVuc2lnbmVkIGxvbmcpcGFja2V0LT5jb21wbGV0aW9uLnNlbmQuc2VuZF9jb21wbGV0aW9uX3RpZDsKIAogCWtmcmVlKHBhY2tldCk7CiAKQEAgLTE1MSw3ICsxNTQsNyBAQAogCS8qIEFsbG9jYXRlIGEgbmV0dnNjIHBhY2tldCBiYXNlZCBvbiAjIG9mIGZyYWdzLiAqLwogCXBhY2tldCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBodl9uZXR2c2NfcGFja2V0KSArCiAJCQkgKG51bV9wYWdlcyAqIHNpemVvZihzdHJ1Y3QgaHZfcGFnZV9idWZmZXIpKSArCi0JCQkgbmV0X2Rydl9vYmotPlJlcXVlc3RFeHRTaXplLCBHRlBfQVRPTUlDKTsKKwkJCSBuZXRfZHJ2X29iai0+cmVxX2V4dF9zaXplLCBHRlBfQVRPTUlDKTsKIAlpZiAoIXBhY2tldCkgewogCQkvKiBvdXQgb2YgbWVtb3J5LCBzaWxlbnRseSBkcm9wIHBhY2tldCAqLwogCQlEUFJJTlRfRVJSKE5FVFZTQ19EUlYsICJ1bmFibGUgdG8gYWxsb2NhdGUgaHZfbmV0dnNjX3BhY2tldCIpOwpAQCAtMTYxLDQwICsxNjQsNDAgQEAKIAkJcmV0dXJuIE5FVERFVl9UWF9PSzsKIAl9CiAKLQlwYWNrZXQtPkV4dGVuc2lvbiA9ICh2b2lkICopKHVuc2lnbmVkIGxvbmcpcGFja2V0ICsKKwlwYWNrZXQtPmV4dGVuc2lvbiA9ICh2b2lkICopKHVuc2lnbmVkIGxvbmcpcGFja2V0ICsKIAkJCQlzaXplb2Yoc3RydWN0IGh2X25ldHZzY19wYWNrZXQpICsKIAkJCQkgICAgKG51bV9wYWdlcyAqIHNpemVvZihzdHJ1Y3QgaHZfcGFnZV9idWZmZXIpKTsKIAogCS8qIFNldHVwIHRoZSBybmRpcyBoZWFkZXIgKi8KLQlwYWNrZXQtPlBhZ2VCdWZmZXJDb3VudCA9IG51bV9wYWdlczsKKwlwYWNrZXQtPnBhZ2VfYnVmX2NudCA9IG51bV9wYWdlczsKIAogCS8qIFRPRE86IEZsdXNoIGFsbCB3cml0ZSBidWZmZXJzLyBtZW1vcnkgZmVuY2UgPz8/ICovCiAJLyogd21iKCk7ICovCiAKIAkvKiBJbml0aWFsaXplIGl0IGZyb20gdGhlIHNrYiAqLwotCXBhY2tldC0+VG90YWxEYXRhQnVmZmVyTGVuZ3RoCT0gc2tiLT5sZW47CisJcGFja2V0LT50b3RhbF9kYXRhX2J1Zmxlbgk9IHNrYi0+bGVuOwogCiAJLyogU3RhcnQgZmlsbGluZyBpbiB0aGUgcGFnZSBidWZmZXJzIHN0YXJ0aW5nIGFmdGVyIFJORElTIGJ1ZmZlci4gKi8KLQlwYWNrZXQtPlBhZ2VCdWZmZXJzWzFdLlBmbiA9IHZpcnRfdG9fcGh5cyhza2ItPmRhdGEpID4+IFBBR0VfU0hJRlQ7Ci0JcGFja2V0LT5QYWdlQnVmZmVyc1sxXS5PZmZzZXQKKwlwYWNrZXQtPnBhZ2VfYnVmWzFdLlBmbiA9IHZpcnRfdG9fcGh5cyhza2ItPmRhdGEpID4+IFBBR0VfU0hJRlQ7CisJcGFja2V0LT5wYWdlX2J1ZlsxXS5PZmZzZXQKIAkJPSAodW5zaWduZWQgbG9uZylza2ItPmRhdGEgJiAoUEFHRV9TSVpFIC0gMSk7Ci0JcGFja2V0LT5QYWdlQnVmZmVyc1sxXS5MZW5ndGggPSBza2JfaGVhZGxlbihza2IpOworCXBhY2tldC0+cGFnZV9idWZbMV0uTGVuZ3RoID0gc2tiX2hlYWRsZW4oc2tiKTsKIAogCS8qIEFkZGl0aW9uYWwgZnJhZ21lbnRzIGFyZSBhZnRlciBTS0IgZGF0YSAqLwogCWZvciAoaSA9IDA7IGkgPCBza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzOyBpKyspIHsKIAkJc2tiX2ZyYWdfdCAqZiA9ICZza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2ldOwogCi0JCXBhY2tldC0+UGFnZUJ1ZmZlcnNbaSsyXS5QZm4gPSBwYWdlX3RvX3BmbihmLT5wYWdlKTsKLQkJcGFja2V0LT5QYWdlQnVmZmVyc1tpKzJdLk9mZnNldCA9IGYtPnBhZ2Vfb2Zmc2V0OwotCQlwYWNrZXQtPlBhZ2VCdWZmZXJzW2krMl0uTGVuZ3RoID0gZi0+c2l6ZTsKKwkJcGFja2V0LT5wYWdlX2J1ZltpKzJdLlBmbiA9IHBhZ2VfdG9fcGZuKGYtPnBhZ2UpOworCQlwYWNrZXQtPnBhZ2VfYnVmW2krMl0uT2Zmc2V0ID0gZi0+cGFnZV9vZmZzZXQ7CisJCXBhY2tldC0+cGFnZV9idWZbaSsyXS5MZW5ndGggPSBmLT5zaXplOwogCX0KIAogCS8qIFNldCB0aGUgY29tcGxldGlvbiByb3V0aW5lICovCi0JcGFja2V0LT5Db21wbGV0aW9uLlNlbmQuT25TZW5kQ29tcGxldGlvbiA9IG5ldHZzY194bWl0X2NvbXBsZXRpb247Ci0JcGFja2V0LT5Db21wbGV0aW9uLlNlbmQuU2VuZENvbXBsZXRpb25Db250ZXh0ID0gcGFja2V0OwotCXBhY2tldC0+Q29tcGxldGlvbi5TZW5kLlNlbmRDb21wbGV0aW9uVGlkID0gKHVuc2lnbmVkIGxvbmcpc2tiOworCXBhY2tldC0+Y29tcGxldGlvbi5zZW5kLnNlbmRfY29tcGxldGlvbiA9IG5ldHZzY194bWl0X2NvbXBsZXRpb247CisJcGFja2V0LT5jb21wbGV0aW9uLnNlbmQuc2VuZF9jb21wbGV0aW9uX2N0eCA9IHBhY2tldDsKKwlwYWNrZXQtPmNvbXBsZXRpb24uc2VuZC5zZW5kX2NvbXBsZXRpb25fdGlkID0gKHVuc2lnbmVkIGxvbmcpc2tiOwogCi0JcmV0ID0gbmV0X2Rydl9vYmotPk9uU2VuZCgmbmV0X2RldmljZV9jdHgtPmRldmljZV9jdHgtPmRldmljZV9vYmosCisJcmV0ID0gbmV0X2Rydl9vYmotPnNlbmQoJm5ldF9kZXZpY2VfY3R4LT5kZXZpY2VfY3R4LT5kZXZpY2Vfb2JqLAogCQkJCSAgcGFja2V0KTsKIAlpZiAocmV0ID09IDApIHsKIAkJbmV0LT5zdGF0cy50eF9ieXRlcyArPSBza2ItPmxlbjsKQEAgLTI2MCw3ICsyNjMsNyBAQAogCX0KIAogCS8qIEFsbG9jYXRlIGEgc2tiIC0gVE9ETyBkaXJlY3QgSS9PIHRvIHBhZ2VzPyAqLwotCXNrYiA9IG5ldGRldl9hbGxvY19za2JfaXBfYWxpZ24obmV0LCBwYWNrZXQtPlRvdGFsRGF0YUJ1ZmZlckxlbmd0aCk7CisJc2tiID0gbmV0ZGV2X2FsbG9jX3NrYl9pcF9hbGlnbihuZXQsIHBhY2tldC0+dG90YWxfZGF0YV9idWZsZW4pOwogCWlmICh1bmxpa2VseSghc2tiKSkgewogCQkrK25ldC0+c3RhdHMucnhfZHJvcHBlZDsKIAkJcmV0dXJuIDA7CkBAIC0yNzMsMTcgKzI3NiwxNyBAQAogCSAqIENvcHkgdG8gc2tiLiBUaGlzIGNvcHkgaXMgbmVlZGVkIGhlcmUgc2luY2UgdGhlIG1lbW9yeSBwb2ludGVkIGJ5CiAJICogaHZfbmV0dnNjX3BhY2tldCBjYW5ub3QgYmUgZGVhbGxvY2F0ZWQKIAkgKi8KLQlmb3IgKGkgPSAwOyBpIDwgcGFja2V0LT5QYWdlQnVmZmVyQ291bnQ7IGkrKykgewotCQlkYXRhID0ga21hcF9hdG9taWMocGZuX3RvX3BhZ2UocGFja2V0LT5QYWdlQnVmZmVyc1tpXS5QZm4pLAorCWZvciAoaSA9IDA7IGkgPCBwYWNrZXQtPnBhZ2VfYnVmX2NudDsgaSsrKSB7CisJCWRhdGEgPSBrbWFwX2F0b21pYyhwZm5fdG9fcGFnZShwYWNrZXQtPnBhZ2VfYnVmW2ldLlBmbiksCiAJCQkJCSAgICAgICBLTV9JUlExKTsKIAkJZGF0YSA9ICh2b2lkICopKHVuc2lnbmVkIGxvbmcpZGF0YSArCi0JCQkJcGFja2V0LT5QYWdlQnVmZmVyc1tpXS5PZmZzZXQ7CisJCQkJcGFja2V0LT5wYWdlX2J1ZltpXS5PZmZzZXQ7CiAKLQkJbWVtY3B5KHNrYl9wdXQoc2tiLCBwYWNrZXQtPlBhZ2VCdWZmZXJzW2ldLkxlbmd0aCksIGRhdGEsCi0JCSAgICAgICBwYWNrZXQtPlBhZ2VCdWZmZXJzW2ldLkxlbmd0aCk7CisJCW1lbWNweShza2JfcHV0KHNrYiwgcGFja2V0LT5wYWdlX2J1ZltpXS5MZW5ndGgpLCBkYXRhLAorCQkgICAgICAgcGFja2V0LT5wYWdlX2J1ZltpXS5MZW5ndGgpOwogCiAJCWt1bm1hcF9hdG9taWMoKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpZGF0YSAtCi0JCQkJICAgICAgIHBhY2tldC0+UGFnZUJ1ZmZlcnNbaV0uT2Zmc2V0KSwgS01fSVJRMSk7CisJCQkJICAgICAgIHBhY2tldC0+cGFnZV9idWZbaV0uT2Zmc2V0KSwgS01fSVJRMSk7CiAJfQogCiAJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwpAQCAtMzQ2LDcgKzM0OSw3IEBACiAJc3RydWN0IG5ldHZzY19kZXZpY2VfaW5mbyBkZXZpY2VfaW5mbzsKIAlpbnQgcmV0OwogCi0JaWYgKCFuZXRfZHJ2X29iai0+QmFzZS5PbkRldmljZUFkZCkKKwlpZiAoIW5ldF9kcnZfb2JqLT5iYXNlLk9uRGV2aWNlQWRkKQogCQlyZXR1cm4gLTE7CiAKIAluZXQgPSBhbGxvY19ldGhlcmRldihzaXplb2Yoc3RydWN0IG5ldF9kZXZpY2VfY29udGV4dCkpOwpAQCAtMzYzLDcgKzM2Niw3IEBACiAJZGV2X3NldF9kcnZkYXRhKGRldmljZSwgbmV0KTsKIAogCS8qIE5vdGlmeSB0aGUgbmV0dnNjIGRyaXZlciBvZiB0aGUgbmV3IGRldmljZSAqLwotCXJldCA9IG5ldF9kcnZfb2JqLT5CYXNlLk9uRGV2aWNlQWRkKGRldmljZV9vYmosICZkZXZpY2VfaW5mbyk7CisJcmV0ID0gbmV0X2Rydl9vYmotPmJhc2UuT25EZXZpY2VBZGQoZGV2aWNlX29iaiwgJmRldmljZV9pbmZvKTsKIAlpZiAocmV0ICE9IDApIHsKIAkJZnJlZV9uZXRkZXYobmV0KTsKIAkJZGV2X3NldF9kcnZkYXRhKGRldmljZSwgTlVMTCk7CkBAIC0zODIsMTAgKzM4NSwxMCBAQAogCSAqIG91dCBvZiBzeW5jIHdpdGggdGhlIGRldmljZSdzIGxpbmsgc3RhdHVzCiAJICovCiAJaWYgKCFuZXRpZl9jYXJyaWVyX29rKG5ldCkpCi0JCWlmICghZGV2aWNlX2luZm8uTGlua1N0YXRlKQorCQlpZiAoIWRldmljZV9pbmZvLmxpbmtfc3RhdGUpCiAJCQluZXRpZl9jYXJyaWVyX29uKG5ldCk7CiAKLQltZW1jcHkobmV0LT5kZXZfYWRkciwgZGV2aWNlX2luZm8uTWFjQWRkciwgRVRIX0FMRU4pOworCW1lbWNweShuZXQtPmRldl9hZGRyLCBkZXZpY2VfaW5mby5tYWNfYWRyLCBFVEhfQUxFTik7CiAKIAluZXQtPm5ldGRldl9vcHMgPSAmZGV2aWNlX29wczsKIApAQCAtMzk4LDcgKzQwMSw3IEBACiAJcmV0ID0gcmVnaXN0ZXJfbmV0ZGV2KG5ldCk7CiAJaWYgKHJldCAhPSAwKSB7CiAJCS8qIFJlbW92ZSB0aGUgZGV2aWNlIGFuZCByZWxlYXNlIHRoZSByZXNvdXJjZSAqLwotCQluZXRfZHJ2X29iai0+QmFzZS5PbkRldmljZVJlbW92ZShkZXZpY2Vfb2JqKTsKKwkJbmV0X2Rydl9vYmotPmJhc2UuT25EZXZpY2VSZW1vdmUoZGV2aWNlX29iaik7CiAJCWZyZWVfbmV0ZGV2KG5ldCk7CiAJfQogCkBAIC00MjIsNyArNDI1LDcgQEAKIAkJcmV0dXJuIDA7CiAJfQogCi0JaWYgKCFuZXRfZHJ2X29iai0+QmFzZS5PbkRldmljZVJlbW92ZSkKKwlpZiAoIW5ldF9kcnZfb2JqLT5iYXNlLk9uRGV2aWNlUmVtb3ZlKQogCQlyZXR1cm4gLTE7CiAKIAkvKiBTdG9wIG91dGJvdW5kIGFzYXAgKi8KQEAgLTQzNSw3ICs0MzgsNyBAQAogCSAqIENhbGwgdG8gdGhlIHZzYyBkcml2ZXIgdG8gbGV0IGl0IGtub3cgdGhhdCB0aGUgZGV2aWNlIGlzIGJlaW5nCiAJICogcmVtb3ZlZAogCSAqLwotCXJldCA9IG5ldF9kcnZfb2JqLT5CYXNlLk9uRGV2aWNlUmVtb3ZlKGRldmljZV9vYmopOworCXJldCA9IG5ldF9kcnZfb2JqLT5iYXNlLk9uRGV2aWNlUmVtb3ZlKGRldmljZV9vYmopOwogCWlmIChyZXQgIT0gMCkgewogCQkvKiBUT0RPOiAqLwogCQlEUFJJTlRfRVJSKE5FVFZTQywgInVuYWJsZSB0byByZW1vdmUgdnNjIGRldmljZSAocmV0ICVkKSIsIHJldCk7CkBAIC00ODEsOCArNDg0LDggQEAKIAkJZGV2aWNlX3VucmVnaXN0ZXIoY3VycmVudF9kZXYpOwogCX0KIAotCWlmIChuZXR2c2NfZHJ2X29iai0+QmFzZS5PbkNsZWFudXApCi0JCW5ldHZzY19kcnZfb2JqLT5CYXNlLk9uQ2xlYW51cCgmbmV0dnNjX2Rydl9vYmotPkJhc2UpOworCWlmIChuZXR2c2NfZHJ2X29iai0+YmFzZS5PbkNsZWFudXApCisJCW5ldHZzY19kcnZfb2JqLT5iYXNlLk9uQ2xlYW51cCgmbmV0dnNjX2Rydl9vYmotPmJhc2UpOwogCiAJdm1idXNfY2hpbGRfZHJpdmVyX3VucmVnaXN0ZXIoZHJ2X2N0eCk7CiAKQEAgLTQ5NSwxNSArNDk4LDE1IEBACiAJc3RydWN0IGRyaXZlcl9jb250ZXh0ICpkcnZfY3R4ID0gJmdfbmV0dnNjX2Rydi5kcnZfY3R4OwogCWludCByZXQ7CiAKLQluZXRfZHJ2X29iai0+UmluZ0J1ZmZlclNpemUgPSByaW5nX3NpemUgKiBQQUdFX1NJWkU7Ci0JbmV0X2Rydl9vYmotPk9uUmVjZWl2ZUNhbGxiYWNrID0gbmV0dnNjX3JlY3ZfY2FsbGJhY2s7Ci0JbmV0X2Rydl9vYmotPk9uTGlua1N0YXR1c0NoYW5nZWQgPSBuZXR2c2NfbGlua3N0YXR1c19jYWxsYmFjazsKKwluZXRfZHJ2X29iai0+cmluZ19idWZfc2l6ZSA9IHJpbmdfc2l6ZSAqIFBBR0VfU0laRTsKKwluZXRfZHJ2X29iai0+cmVjdl9jYiA9IG5ldHZzY19yZWN2X2NhbGxiYWNrOworCW5ldF9kcnZfb2JqLT5saW5rX3N0YXR1c19jaGFuZ2UgPSBuZXR2c2NfbGlua3N0YXR1c19jYWxsYmFjazsKIAogCS8qIENhbGxiYWNrIHRvIGNsaWVudCBkcml2ZXIgdG8gY29tcGxldGUgdGhlIGluaXRpYWxpemF0aW9uICovCi0JZHJ2X2luaXQoJm5ldF9kcnZfb2JqLT5CYXNlKTsKKwlkcnZfaW5pdCgmbmV0X2Rydl9vYmotPmJhc2UpOwogCi0JZHJ2X2N0eC0+ZHJpdmVyLm5hbWUgPSBuZXRfZHJ2X29iai0+QmFzZS5uYW1lOwotCW1lbWNweSgmZHJ2X2N0eC0+Y2xhc3NfaWQsICZuZXRfZHJ2X29iai0+QmFzZS5kZXZpY2VUeXBlLAorCWRydl9jdHgtPmRyaXZlci5uYW1lID0gbmV0X2Rydl9vYmotPmJhc2UubmFtZTsKKwltZW1jcHkoJmRydl9jdHgtPmNsYXNzX2lkLCAmbmV0X2Rydl9vYmotPmJhc2UuZGV2aWNlVHlwZSwKIAkgICAgICAgc2l6ZW9mKHN0cnVjdCBodl9ndWlkKSk7CiAKIAlkcnZfY3R4LT5wcm9iZSA9IG5ldHZzY19wcm9iZTsKQEAgLTUzNiw3ICs1MzksNyBAQAogCWlmICghZG1pX2NoZWNrX3N5c3RlbShodl9uZXR2c2NfZG1pX3RhYmxlKSkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKLQlyZXR1cm4gbmV0dnNjX2Rydl9pbml0KE5ldFZzY0luaXRpYWxpemUpOworCXJldHVybiBuZXR2c2NfZHJ2X2luaXQobmV0dnNjX2luaXRpYWxpemUpOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgbmV0dnNjX2V4aXQodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9odi9vc2QuYyBiL2RyaXZlcnMvc3RhZ2luZy9odi9vc2QuYwppbmRleCA4YzNlYjI3Li5iNWEzOTQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaHYvb3NkLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2h2L29zZC5jCkBAIC00MywxMyArNDMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlICJvc2QuaCIKIAotc3RydWN0IG9zZF9jYWxsYmFja19zdHJ1Y3QgewotCXN0cnVjdCB3b3JrX3N0cnVjdCB3b3JrOwotCXZvaWQgKCpjYWxsYmFjaykodm9pZCAqKTsKLQl2b2lkICpkYXRhOwotfTsKLQotdm9pZCAqb3NkX1ZpcnR1YWxBbGxvY0V4ZWModW5zaWduZWQgaW50IHNpemUpCit2b2lkICpvc2RfdmlydHVhbF9hbGxvY19leGVjKHVuc2lnbmVkIGludCBzaXplKQogewogI2lmZGVmIF9feDg2XzY0X18KIAlyZXR1cm4gX192bWFsbG9jKHNpemUsIEdGUF9LRVJORUwsIFBBR0VfS0VSTkVMX0VYRUMpOwpAQCAtNjAsNyArNTQsNyBAQAogfQogCiAvKioKLSAqIG9zZF9QYWdlQWxsb2MoKSAtIEFsbG9jYXRlIHBhZ2VzCisgKiBvc2RfcGFnZV9hbGxvYygpIC0gQWxsb2NhdGUgcGFnZXMKICAqIEBjb3VudDogICAgICBUb3RhbCBudW1iZXIgb2YgS2VybmVsIHBhZ2VzIHlvdSB3YW50IHRvIGFsbG9jYXRlCiAgKgogICogVHJpZXMgdG8gYWxsb2NhdGUgQGNvdW50IG51bWJlciBvZiBjb25zZWN1dGl2ZSBmcmVlIGtlcm5lbCBwYWdlcy4KQEAgLTY4LDcgKzYyLDcgQEAKICAqIElmIHN1Y2Nlc3NmdWxsIGl0IHdpbGwgcmV0dXJuIHBvaW50ZXIgdG8gdGhlIEBjb3VudCBwYWdlcy4KICAqIE1haW5seSB1c2VkIGJ5IEh5cGVyLVYgZHJpdmVycy4KICAqLwotdm9pZCAqb3NkX1BhZ2VBbGxvYyh1bnNpZ25lZCBpbnQgY291bnQpCit2b2lkICpvc2RfcGFnZV9hbGxvYyh1bnNpZ25lZCBpbnQgY291bnQpCiB7CiAJdm9pZCAqcDsKIApAQCAtODUsMjYgKzc5LDI2IEBACiAJLyogaWYgKHApIG1lbXNldChwLCAwLCBQQUdFX1NJWkUpOyAqLwogCS8qIHJldHVybiBwOyAqLwogfQotRVhQT1JUX1NZTUJPTF9HUEwob3NkX1BhZ2VBbGxvYyk7CitFWFBPUlRfU1lNQk9MX0dQTChvc2RfcGFnZV9hbGxvYyk7CiAKIC8qKgotICogb3NkX1BhZ2VGcmVlKCkgLSBGcmVlIHBhZ2VzCisgKiBvc2RfcGFnZV9mcmVlKCkgLSBGcmVlIHBhZ2VzCiAgKiBAcGFnZTogICAgICAgUG9pbnRlciB0byB0aGUgZmlyc3QgcGFnZSB0byBiZSBmcmVlZAogICogQGNvdW50OiAgICAgIFRvdGFsIG51bWJlciBvZiBLZXJuZWwgcGFnZXMgeW91IGZyZWUKICAqCi0gKiBGcmVlcyB0aGUgcGFnZXMgYWxsb2NhdGVkIGJ5IG9zZF9QYWdlQWxsb2MoKQorICogRnJlZXMgdGhlIHBhZ2VzIGFsbG9jYXRlZCBieSBvc2RfcGFnZV9hbGxvYygpCiAgKiBNYWlubHkgdXNlZCBieSBIeXBlci1WIGRyaXZlcnMuCiAgKi8KLXZvaWQgb3NkX1BhZ2VGcmVlKHZvaWQgKnBhZ2UsIHVuc2lnbmVkIGludCBjb3VudCkKK3ZvaWQgb3NkX3BhZ2VfZnJlZSh2b2lkICpwYWdlLCB1bnNpZ25lZCBpbnQgY291bnQpCiB7CiAJZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZylwYWdlLCBnZXRfb3JkZXIoY291bnQgKiBQQUdFX1NJWkUpKTsKIAkvKnN0cnVjdCBwYWdlKiBwID0gdmlydF90b19wYWdlKHBhZ2UpOwogCV9fZnJlZV9wYWdlKHApOyovCiB9Ci1FWFBPUlRfU1lNQk9MX0dQTChvc2RfUGFnZUZyZWUpOworRVhQT1JUX1NZTUJPTF9HUEwob3NkX3BhZ2VfZnJlZSk7CiAKIC8qKgotICogb3NkX1dhaXRFdmVudENyZWF0ZSgpIC0gQ3JlYXRlIHRoZSBldmVudCBxdWV1ZQorICogb3NkX3dhaXRldmVudF9jcmVhdGUoKSAtIENyZWF0ZSB0aGUgZXZlbnQgcXVldWUKICAqCiAgKiBBbGxvY2F0ZXMgbWVtb3J5IGZvciBhICZzdHJ1Y3Qgb3NkX3dhaXRldmVudC4gQW5kIHRoZW4gY2FsbHMKICAqIGluaXRfd2FpdHF1ZXVlX2hlYWQgdG8gc2V0IHVwIHRoZSB3YWl0IHF1ZXVlIGZvciB0aGUgZXZlbnQuCkBAIC0xMTQsNyArMTA4LDcgQEAKICAqIFJldHVybnMgcG9pbnRlciB0byAmc3RydWN0IG9zZF93YWl0ZXZlbnQKICAqIE1haW5seSB1c2VkIGJ5IEh5cGVyLVYgZHJpdmVycy4KICAqLwotc3RydWN0IG9zZF93YWl0ZXZlbnQgKm9zZF9XYWl0RXZlbnRDcmVhdGUodm9pZCkKK3N0cnVjdCBvc2Rfd2FpdGV2ZW50ICpvc2Rfd2FpdGV2ZW50X2NyZWF0ZSh2b2lkKQogewogCXN0cnVjdCBvc2Rfd2FpdGV2ZW50ICp3YWl0ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IG9zZF93YWl0ZXZlbnQpLAogCQkJCQkgICAgIEdGUF9LRVJORUwpOwpAQCAtMTI1LDE0ICsxMTksMTQgQEAKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZ3YWl0LT5ldmVudCk7CiAJcmV0dXJuIHdhaXQ7CiB9Ci1FWFBPUlRfU1lNQk9MX0dQTChvc2RfV2FpdEV2ZW50Q3JlYXRlKTsKK0VYUE9SVF9TWU1CT0xfR1BMKG9zZF93YWl0ZXZlbnRfY3JlYXRlKTsKIAogCiAvKioKLSAqIG9zZF9XYWl0RXZlbnRTZXQoKSAtIFdha2UgdXAgdGhlIHByb2Nlc3MKLSAqIEB3YWl0RXZlbnQ6IFN0cnVjdHVyZSB0byBldmVudCB0byBiZSB3b2tlbiB1cAorICogb3NkX3dhaXRldmVudF9zZXQoKSAtIFdha2UgdXAgdGhlIHByb2Nlc3MKKyAqIEB3YWl0X2V2ZW50OiBTdHJ1Y3R1cmUgdG8gZXZlbnQgdG8gYmUgd29rZW4gdXAKICAqCi0gKiBAd2FpdGV2ZW50IGlzIG9mIHR5cGUgJnN0cnVjdCBvc2Rfd2FpdGV2ZW50CisgKiBAd2FpdF9ldmVudCBpcyBvZiB0eXBlICZzdHJ1Y3Qgb3NkX3dhaXRldmVudAogICoKICAqIFdha2UgdXAgdGhlIHNsZWVwaW5nIHByb2Nlc3Mgc28gaXQgY2FuIGRvIHNvbWUgd29yay4KICAqIEFuZCBzZXQgY29uZGl0aW9uIGluZGljYXRvciBpbiAmc3RydWN0IG9zZF93YWl0ZXZlbnQgdG8gaW5kaWNhdGUKQEAgLTE0MCwxOCArMTM0LDE4IEBACiAgKgogICogT25seSB1c2VkIGJ5IE5ldHdvcmsgYW5kIFN0b3JhZ2UgSHlwZXItViBkcml2ZXJzLgogICovCi12b2lkIG9zZF9XYWl0RXZlbnRTZXQoc3RydWN0IG9zZF93YWl0ZXZlbnQgKndhaXRFdmVudCkKK3ZvaWQgb3NkX3dhaXRldmVudF9zZXQoc3RydWN0IG9zZF93YWl0ZXZlbnQgKndhaXRfZXZlbnQpCiB7Ci0Jd2FpdEV2ZW50LT5jb25kaXRpb24gPSAxOwotCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmd2FpdEV2ZW50LT5ldmVudCk7CisJd2FpdF9ldmVudC0+Y29uZGl0aW9uID0gMTsKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJndhaXRfZXZlbnQtPmV2ZW50KTsKIH0KLUVYUE9SVF9TWU1CT0xfR1BMKG9zZF9XYWl0RXZlbnRTZXQpOworRVhQT1JUX1NZTUJPTF9HUEwob3NkX3dhaXRldmVudF9zZXQpOwogCiAvKioKLSAqIG9zZF9XYWl0RXZlbnRXYWl0KCkgLSBXYWl0IGZvciBldmVudCB0aWxsIGNvbmRpdGlvbiBpcyB0cnVlCi0gKiBAd2FpdEV2ZW50OiBTdHJ1Y3R1cmUgdG8gZXZlbnQgdG8gYmUgcHV0IHRvIHNsZWVwCisgKiBvc2Rfd2FpdGV2ZW50X3dhaXQoKSAtIFdhaXQgZm9yIGV2ZW50IHRpbGwgY29uZGl0aW9uIGlzIHRydWUKKyAqIEB3YWl0X2V2ZW50OiBTdHJ1Y3R1cmUgdG8gZXZlbnQgdG8gYmUgcHV0IHRvIHNsZWVwCiAgKgotICogQHdhaXRldmVudCBpcyBvZiB0eXBlICZzdHJ1Y3Qgb3NkX3dhaXRldmVudAorICogQHdhaXRfZXZlbnQgaXMgb2YgdHlwZSAmc3RydWN0IG9zZF93YWl0ZXZlbnQKICAqCiAgKiBTZXQgdXAgdGhlIHByb2Nlc3MgdG8gc2xlZXAgdW50aWwgd2FpdEV2ZW50LT5jb25kaXRpb24gZ2V0IHRydWUuCiAgKiBBbmQgc2V0IGNvbmRpdGlvbiBpbmRpY2F0b3IgaW4gJnN0cnVjdCBvc2Rfd2FpdGV2ZW50IHRvIGluZGljYXRlCkBAIC0xNjEsMjUgKzE1NSwyNSBAQAogICoKICAqIE1haW5seSB1c2VkIGJ5IEh5cGVyLVYgZHJpdmVycy4KICAqLwotaW50IG9zZF9XYWl0RXZlbnRXYWl0KHN0cnVjdCBvc2Rfd2FpdGV2ZW50ICp3YWl0RXZlbnQpCitpbnQgb3NkX3dhaXRldmVudF93YWl0KHN0cnVjdCBvc2Rfd2FpdGV2ZW50ICp3YWl0X2V2ZW50KQogewogCWludCByZXQgPSAwOwogCi0JcmV0ID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKHdhaXRFdmVudC0+ZXZlbnQsCi0JCQkJICAgICAgIHdhaXRFdmVudC0+Y29uZGl0aW9uKTsKLQl3YWl0RXZlbnQtPmNvbmRpdGlvbiA9IDA7CisJcmV0ID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKHdhaXRfZXZlbnQtPmV2ZW50LAorCQkJCSAgICAgICB3YWl0X2V2ZW50LT5jb25kaXRpb24pOworCXdhaXRfZXZlbnQtPmNvbmRpdGlvbiA9IDA7CiAJcmV0dXJuIHJldDsKIH0KLUVYUE9SVF9TWU1CT0xfR1BMKG9zZF9XYWl0RXZlbnRXYWl0KTsKK0VYUE9SVF9TWU1CT0xfR1BMKG9zZF93YWl0ZXZlbnRfd2FpdCk7CiAKIC8qKgotICogb3NkX1dhaXRFdmVudFdhaXRFeCgpIC0gV2FpdCBmb3IgZXZlbnQgb3IgdGltZW91dCBmb3IgcHJvY2VzcyB3YWtldXAKLSAqIEB3YWl0RXZlbnQ6IFN0cnVjdHVyZSB0byBldmVudCB0byBiZSBwdXQgdG8gc2xlZXAKLSAqIEBUaW1lb3V0SW5NczogICAgICAgVG90YWwgbnVtYmVyIG9mIE1pbGxpc2Vjb25kcyB0byB3YWl0IGJlZm9yZSB3YWtpbmcgdXAKKyAqIG9zZF93YWl0ZXZlbnRfd2FpdGV4KCkgLSBXYWl0IGZvciBldmVudCBvciB0aW1lb3V0IGZvciBwcm9jZXNzIHdha2V1cAorICogQHdhaXRfZXZlbnQ6IFN0cnVjdHVyZSB0byBldmVudCB0byBiZSBwdXQgdG8gc2xlZXAKKyAqIEB0aW1lb3V0X2luX21zOiAgICAgICBUb3RhbCBudW1iZXIgb2YgTWlsbGlzZWNvbmRzIHRvIHdhaXQgYmVmb3JlIHdha2luZyB1cAogICoKLSAqIEB3YWl0ZXZlbnQgaXMgb2YgdHlwZSAmc3RydWN0IG9zZF93YWl0ZXZlbnQKKyAqIEB3YWl0X2V2ZW50IGlzIG9mIHR5cGUgJnN0cnVjdCBvc2Rfd2FpdGV2ZW50CiAgKiBTZXQgdXAgdGhlIHByb2Nlc3MgdG8gc2xlZXAgdW50aWwgQHdhaXRFdmVudC0+Y29uZGl0aW9uIGdldCB0cnVlIG9yCi0gKiBAVGltZW91dEluTXMgKFRpbWUgb3V0IGluIE1pbGxpc2Vjb25kcykgaGFzIGJlZW4gcmVhY2hlZC4KKyAqIEB0aW1lb3V0X2luX21zIChUaW1lIG91dCBpbiBNaWxsaXNlY29uZHMpIGhhcyBiZWVuIHJlYWNoZWQuCiAgKiBBbmQgc2V0IGNvbmRpdGlvbiBpbmRpY2F0b3IgaW4gJnN0cnVjdCBvc2Rfd2FpdGV2ZW50IHRvIGluZGljYXRlCiAgKiB0aGUgcHJvY2VzcyBpcyBpbiBhIHNsZWVwaW5nIHN0YXRlLgogICoKQEAgLTE4Nyw0MiArMTgxLDE0IEBACiAgKgogICogTWFpbmx5IHVzZWQgYnkgSHlwZXItViBkcml2ZXJzLgogICovCi1pbnQgb3NkX1dhaXRFdmVudFdhaXRFeChzdHJ1Y3Qgb3NkX3dhaXRldmVudCAqd2FpdEV2ZW50LCB1MzIgVGltZW91dEluTXMpCitpbnQgb3NkX3dhaXRldmVudF93YWl0ZXgoc3RydWN0IG9zZF93YWl0ZXZlbnQgKndhaXRfZXZlbnQsIHUzMiB0aW1lb3V0X2luX21zKQogewogCWludCByZXQgPSAwOwogCi0JcmV0ID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQod2FpdEV2ZW50LT5ldmVudCwKLQkJCQkJICAgICAgIHdhaXRFdmVudC0+Y29uZGl0aW9uLAotCQkJCQkgICAgICAgbXNlY3NfdG9famlmZmllcyhUaW1lb3V0SW5NcykpOwotCXdhaXRFdmVudC0+Y29uZGl0aW9uID0gMDsKKwlyZXQgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dCh3YWl0X2V2ZW50LT5ldmVudCwKKwkJCQkJICAgICAgIHdhaXRfZXZlbnQtPmNvbmRpdGlvbiwKKwkJCQkJICAgICAgIG1zZWNzX3RvX2ppZmZpZXModGltZW91dF9pbl9tcykpOworCXdhaXRfZXZlbnQtPmNvbmRpdGlvbiA9IDA7CiAJcmV0dXJuIHJldDsKIH0KLUVYUE9SVF9TWU1CT0xfR1BMKG9zZF9XYWl0RXZlbnRXYWl0RXgpOwotCi1zdGF0aWMgdm9pZCBvc2RfY2FsbGJhY2tfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCi17Ci0Jc3RydWN0IG9zZF9jYWxsYmFja19zdHJ1Y3QgKmNiID0gY29udGFpbmVyX29mKHdvcmssCi0JCQkJCQlzdHJ1Y3Qgb3NkX2NhbGxiYWNrX3N0cnVjdCwKLQkJCQkJCXdvcmspOwotCShjYi0+Y2FsbGJhY2spKGNiLT5kYXRhKTsKLQlrZnJlZShjYik7Ci19Ci0KLWludCBvc2Rfc2NoZWR1bGVfY2FsbGJhY2soc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKndxLAotCQkJICB2b2lkICgqZnVuYykodm9pZCAqKSwKLQkJCSAgdm9pZCAqZGF0YSkKLXsKLQlzdHJ1Y3Qgb3NkX2NhbGxiYWNrX3N0cnVjdCAqY2I7Ci0KLQljYiA9IGttYWxsb2Moc2l6ZW9mKCpjYiksIEdGUF9LRVJORUwpOwotCWlmICghY2IpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJ1bmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGluIG9zZF9zY2hlZHVsZV9jYWxsYmFja1xuIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQljYi0+Y2FsbGJhY2sgPSBmdW5jOwotCWNiLT5kYXRhID0gZGF0YTsKLQlJTklUX1dPUksoJmNiLT53b3JrLCBvc2RfY2FsbGJhY2tfd29yayk7Ci0JcmV0dXJuIHF1ZXVlX3dvcmsod3EsICZjYi0+d29yayk7Ci19Ci0KK0VYUE9SVF9TWU1CT0xfR1BMKG9zZF93YWl0ZXZlbnRfd2FpdGV4KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9odi9vc2QuaCBiL2RyaXZlcnMvc3RhZ2luZy9odi9vc2QuaAppbmRleCBjZTA2NGU4Li44NzBlZjA3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaHYvb3NkLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2h2L29zZC5oCkBAIC01MCwyMSArNTAsMTcgQEAKIAogLyogT3NkIHJvdXRpbmVzICovCiAKLWV4dGVybiB2b2lkICpvc2RfVmlydHVhbEFsbG9jRXhlYyh1bnNpZ25lZCBpbnQgc2l6ZSk7CitleHRlcm4gdm9pZCAqb3NkX3ZpcnR1YWxfYWxsb2NfZXhlYyh1bnNpZ25lZCBpbnQgc2l6ZSk7CiAKLWV4dGVybiB2b2lkICpvc2RfUGFnZUFsbG9jKHVuc2lnbmVkIGludCBjb3VudCk7Ci1leHRlcm4gdm9pZCBvc2RfUGFnZUZyZWUodm9pZCAqcGFnZSwgdW5zaWduZWQgaW50IGNvdW50KTsKK2V4dGVybiB2b2lkICpvc2RfcGFnZV9hbGxvYyh1bnNpZ25lZCBpbnQgY291bnQpOworZXh0ZXJuIHZvaWQgb3NkX3BhZ2VfZnJlZSh2b2lkICpwYWdlLCB1bnNpZ25lZCBpbnQgY291bnQpOwogCi1leHRlcm4gc3RydWN0IG9zZF93YWl0ZXZlbnQgKm9zZF9XYWl0RXZlbnRDcmVhdGUodm9pZCk7Ci1leHRlcm4gdm9pZCBvc2RfV2FpdEV2ZW50U2V0KHN0cnVjdCBvc2Rfd2FpdGV2ZW50ICp3YWl0RXZlbnQpOwotZXh0ZXJuIGludCBvc2RfV2FpdEV2ZW50V2FpdChzdHJ1Y3Qgb3NkX3dhaXRldmVudCAqd2FpdEV2ZW50KTsKK2V4dGVybiBzdHJ1Y3Qgb3NkX3dhaXRldmVudCAqb3NkX3dhaXRldmVudF9jcmVhdGUodm9pZCk7CitleHRlcm4gdm9pZCBvc2Rfd2FpdGV2ZW50X3NldChzdHJ1Y3Qgb3NkX3dhaXRldmVudCAqd2FpdF9ldmVudCk7CitleHRlcm4gaW50IG9zZF93YWl0ZXZlbnRfd2FpdChzdHJ1Y3Qgb3NkX3dhaXRldmVudCAqd2FpdF9ldmVudCk7CiAKLS8qIElmID4wLCB3YWl0RXZlbnQgZ290IHNpZ25hbGVkLiBJZiA9PTAsIHRpbWVvdXQuIElmIDwgMCwgZXJyb3IgKi8KLWV4dGVybiBpbnQgb3NkX1dhaXRFdmVudFdhaXRFeChzdHJ1Y3Qgb3NkX3dhaXRldmVudCAqd2FpdEV2ZW50LAotCQkJICAgICAgIHUzMiBUaW1lb3V0SW5Ncyk7Ci0KLWludCBvc2Rfc2NoZWR1bGVfY2FsbGJhY2soc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKndxLAotCQkJICB2b2lkICgqZnVuYykodm9pZCAqKSwKLQkJCSAgdm9pZCAqZGF0YSk7CisvKiBJZiA+MCwgd2FpdF9ldmVudCBnb3Qgc2lnbmFsZWQuIElmID09MCwgdGltZW91dC4gSWYgPCAwLCBlcnJvciAqLworZXh0ZXJuIGludCBvc2Rfd2FpdGV2ZW50X3dhaXRleChzdHJ1Y3Qgb3NkX3dhaXRldmVudCAqd2FpdF9ldmVudCwKKwkJCSAgICAgICB1MzIgdGltZW91dF9pbl9tcyk7CiAKICNlbmRpZiAvKiBfT1NEX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaHYvcmluZ19idWZmZXIuYyBiL2RyaXZlcnMvc3RhZ2luZy9odi9yaW5nX2J1ZmZlci5jCmluZGV4IGQ3OGM1NjkuLjRkNTMzOTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9odi9yaW5nX2J1ZmZlci5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9odi9yaW5nX2J1ZmZlci5jCkBAIC0zOCw3ICszOCw3IEBACiAvKisrCiAKIE5hbWU6Ci0JR2V0UmluZ0J1ZmZlckF2YWlsQnl0ZXMoKQorCWdldF9yaW5nYnVmZmVyX2F2YWlsYnl0ZXMoKQogCiBEZXNjcmlwdGlvbjoKIAlHZXQgbnVtYmVyIG9mIGJ5dGVzIGF2YWlsYWJsZSB0byByZWFkIGFuZCB0byB3cml0ZSB0bwpAQCAtNDYsMzMgKzQ2LDM0IEBACiAKIC0tKi8KIHN0YXRpYyBpbmxpbmUgdm9pZAotR2V0UmluZ0J1ZmZlckF2YWlsQnl0ZXMoc3RydWN0IGh2X3JpbmdfYnVmZmVyX2luZm8gKnJiaSwgdTMyICpyZWFkLCB1MzIgKndyaXRlKQorZ2V0X3JpbmdidWZmZXJfYXZhaWxieXRlcyhzdHJ1Y3QgaHZfcmluZ19idWZmZXJfaW5mbyAqcmJpLAorCQkJICB1MzIgKnJlYWQsIHUzMiAqd3JpdGUpCiB7CiAJdTMyIHJlYWRfbG9jLCB3cml0ZV9sb2M7CiAKIAkvKiBDYXB0dXJlIHRoZSByZWFkL3dyaXRlIGluZGljZXMgYmVmb3JlIHRoZXkgY2hhbmdlZCAqLwotCXJlYWRfbG9jID0gcmJpLT5SaW5nQnVmZmVyLT5SZWFkSW5kZXg7Ci0Jd3JpdGVfbG9jID0gcmJpLT5SaW5nQnVmZmVyLT5Xcml0ZUluZGV4OworCXJlYWRfbG9jID0gcmJpLT5yaW5nX2J1ZmZlci0+cmVhZF9pbmRleDsKKwl3cml0ZV9sb2MgPSByYmktPnJpbmdfYnVmZmVyLT53cml0ZV9pbmRleDsKIAotCSp3cml0ZSA9IEJZVEVTX0FWQUlMX1RPX1dSSVRFKHJlYWRfbG9jLCB3cml0ZV9sb2MsIHJiaS0+UmluZ0RhdGFTaXplKTsKLQkqcmVhZCA9IHJiaS0+UmluZ0RhdGFTaXplIC0gKndyaXRlOworCSp3cml0ZSA9IEJZVEVTX0FWQUlMX1RPX1dSSVRFKHJlYWRfbG9jLCB3cml0ZV9sb2MsIHJiaS0+cmluZ19kYXRhc2l6ZSk7CisJKnJlYWQgPSByYmktPnJpbmdfZGF0YXNpemUgLSAqd3JpdGU7CiB9CiAKIC8qKysKIAogTmFtZToKLQlHZXROZXh0V3JpdGVMb2NhdGlvbigpCisJZ2V0X25leHRfd3JpdGVfbG9jYXRpb24oKQogCiBEZXNjcmlwdGlvbjoKIAlHZXQgdGhlIG5leHQgd3JpdGUgbG9jYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgcmluZyBidWZmZXIKIAogLS0qLwogc3RhdGljIGlubGluZSB1MzIKLUdldE5leHRXcml0ZUxvY2F0aW9uKHN0cnVjdCBodl9yaW5nX2J1ZmZlcl9pbmZvICpSaW5nSW5mbykKK2dldF9uZXh0X3dyaXRlX2xvY2F0aW9uKHN0cnVjdCBodl9yaW5nX2J1ZmZlcl9pbmZvICpyaW5nX2luZm8pCiB7Ci0JdTMyIG5leHQgPSBSaW5nSW5mby0+UmluZ0J1ZmZlci0+V3JpdGVJbmRleDsKKwl1MzIgbmV4dCA9IHJpbmdfaW5mby0+cmluZ19idWZmZXItPndyaXRlX2luZGV4OwogCi0JLyogQVNTRVJUKG5leHQgPCBSaW5nSW5mby0+UmluZ0RhdGFTaXplKTsgKi8KKwkvKiBBU1NFUlQobmV4dCA8IHJpbmdfaW5mby0+UmluZ0RhdGFTaXplKTsgKi8KIAogCXJldHVybiBuZXh0OwogfQpAQCAtODAsMzQgKzgxLDM0IEBACiAvKisrCiAKIE5hbWU6Ci0JU2V0TmV4dFdyaXRlTG9jYXRpb24oKQorCXNldF9uZXh0X3dyaXRlX2xvY2F0aW9uKCkKIAogRGVzY3JpcHRpb246CiAJU2V0IHRoZSBuZXh0IHdyaXRlIGxvY2F0aW9uIGZvciB0aGUgc3BlY2lmaWVkIHJpbmcgYnVmZmVyCiAKIC0tKi8KIHN0YXRpYyBpbmxpbmUgdm9pZAotU2V0TmV4dFdyaXRlTG9jYXRpb24oc3RydWN0IGh2X3JpbmdfYnVmZmVyX2luZm8gKlJpbmdJbmZvLAotCQkgICAgIHUzMiBOZXh0V3JpdGVMb2NhdGlvbikKK3NldF9uZXh0X3dyaXRlX2xvY2F0aW9uKHN0cnVjdCBodl9yaW5nX2J1ZmZlcl9pbmZvICpyaW5nX2luZm8sCisJCSAgICAgdTMyIG5leHRfd3JpdGVfbG9jYXRpb24pCiB7Ci0JUmluZ0luZm8tPlJpbmdCdWZmZXItPldyaXRlSW5kZXggPSBOZXh0V3JpdGVMb2NhdGlvbjsKKwlyaW5nX2luZm8tPnJpbmdfYnVmZmVyLT53cml0ZV9pbmRleCA9IG5leHRfd3JpdGVfbG9jYXRpb247CiB9CiAKIC8qKysKIAogTmFtZToKLQlHZXROZXh0UmVhZExvY2F0aW9uKCkKKwlnZXRfbmV4dF9yZWFkX2xvY2F0aW9uKCkKIAogRGVzY3JpcHRpb246CiAJR2V0IHRoZSBuZXh0IHJlYWQgbG9jYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgcmluZyBidWZmZXIKIAogLS0qLwogc3RhdGljIGlubGluZSB1MzIKLUdldE5leHRSZWFkTG9jYXRpb24oc3RydWN0IGh2X3JpbmdfYnVmZmVyX2luZm8gKlJpbmdJbmZvKQorZ2V0X25leHRfcmVhZF9sb2NhdGlvbihzdHJ1Y3QgaHZfcmluZ19idWZmZXJfaW5mbyAqcmluZ19pbmZvKQogewotCXUzMiBuZXh0ID0gUmluZ0luZm8tPlJpbmdCdWZmZXItPlJlYWRJbmRleDsKKwl1MzIgbmV4dCA9IHJpbmdfaW5mby0+cmluZ19idWZmZXItPnJlYWRfaW5kZXg7CiAKLQkvKiBBU1NFUlQobmV4dCA8IFJpbmdJbmZvLT5SaW5nRGF0YVNpemUpOyAqLworCS8qIEFTU0VSVChuZXh0IDwgcmluZ19pbmZvLT5SaW5nRGF0YVNpemUpOyAqLwogCiAJcmV0dXJuIG5leHQ7CiB9CkBAIC0xMTUsNyArMTE2LDcgQEAKIC8qKysKIAogTmFtZToKLQlHZXROZXh0UmVhZExvY2F0aW9uV2l0aE9mZnNldCgpCisJZ2V0X25leHRfcmVhZGxvY2F0aW9uX3dpdGhvZmZzZXQoKQogCiBEZXNjcmlwdGlvbjoKIAlHZXQgdGhlIG5leHQgcmVhZCBsb2NhdGlvbiArIG9mZnNldCBmb3IgdGhlIHNwZWNpZmllZCByaW5nIGJ1ZmZlci4KQEAgLTEyMywxMyArMTI0LDE0IEBACiAKIC0tKi8KIHN0YXRpYyBpbmxpbmUgdTMyCi1HZXROZXh0UmVhZExvY2F0aW9uV2l0aE9mZnNldChzdHJ1Y3QgaHZfcmluZ19idWZmZXJfaW5mbyAqUmluZ0luZm8sIHUzMiBPZmZzZXQpCitnZXRfbmV4dF9yZWFkbG9jYXRpb25fd2l0aG9mZnNldChzdHJ1Y3QgaHZfcmluZ19idWZmZXJfaW5mbyAqcmluZ19pbmZvLAorCQkJCSB1MzIgb2Zmc2V0KQogewotCXUzMiBuZXh0ID0gUmluZ0luZm8tPlJpbmdCdWZmZXItPlJlYWRJbmRleDsKKwl1MzIgbmV4dCA9IHJpbmdfaW5mby0+cmluZ19idWZmZXItPnJlYWRfaW5kZXg7CiAKLQkvKiBBU1NFUlQobmV4dCA8IFJpbmdJbmZvLT5SaW5nRGF0YVNpemUpOyAqLwotCW5leHQgKz0gT2Zmc2V0OwotCW5leHQgJT0gUmluZ0luZm8tPlJpbmdEYXRhU2l6ZTsKKwkvKiBBU1NFUlQobmV4dCA8IHJpbmdfaW5mby0+UmluZ0RhdGFTaXplKTsgKi8KKwluZXh0ICs9IG9mZnNldDsKKwluZXh0ICU9IHJpbmdfaW5mby0+cmluZ19kYXRhc2l6ZTsKIAogCXJldHVybiBuZXh0OwogfQpAQCAtMTM3LDE0MSArMTM5LDE0NSBAQAogLyorKwogCiBOYW1lOgotCVNldE5leHRSZWFkTG9jYXRpb24oKQorCXNldF9uZXh0X3JlYWRfbG9jYXRpb24oKQogCiBEZXNjcmlwdGlvbjoKIAlTZXQgdGhlIG5leHQgcmVhZCBsb2NhdGlvbiBmb3IgdGhlIHNwZWNpZmllZCByaW5nIGJ1ZmZlcgogCiAtLSovCiBzdGF0aWMgaW5saW5lIHZvaWQKLVNldE5leHRSZWFkTG9jYXRpb24oc3RydWN0IGh2X3JpbmdfYnVmZmVyX2luZm8gKlJpbmdJbmZvLCB1MzIgTmV4dFJlYWRMb2NhdGlvbikKK3NldF9uZXh0X3JlYWRfbG9jYXRpb24oc3RydWN0IGh2X3JpbmdfYnVmZmVyX2luZm8gKnJpbmdfaW5mbywKKwkJICAgIHUzMiBuZXh0X3JlYWRfbG9jYXRpb24pCiB7Ci0JUmluZ0luZm8tPlJpbmdCdWZmZXItPlJlYWRJbmRleCA9IE5leHRSZWFkTG9jYXRpb247CisJcmluZ19pbmZvLT5yaW5nX2J1ZmZlci0+cmVhZF9pbmRleCA9IG5leHRfcmVhZF9sb2NhdGlvbjsKIH0KIAogCiAvKisrCiAKIE5hbWU6Ci0JR2V0UmluZ0J1ZmZlcigpCisJZ2V0X3JpbmdfYnVmZmVyKCkKIAogRGVzY3JpcHRpb246CiAJR2V0IHRoZSBzdGFydCBvZiB0aGUgcmluZyBidWZmZXIKIAogLS0qLwogc3RhdGljIGlubGluZSB2b2lkICoKLUdldFJpbmdCdWZmZXIoc3RydWN0IGh2X3JpbmdfYnVmZmVyX2luZm8gKlJpbmdJbmZvKQorZ2V0X3JpbmdfYnVmZmVyKHN0cnVjdCBodl9yaW5nX2J1ZmZlcl9pbmZvICpyaW5nX2luZm8pCiB7Ci0JcmV0dXJuICh2b2lkICopUmluZ0luZm8tPlJpbmdCdWZmZXItPkJ1ZmZlcjsKKwlyZXR1cm4gKHZvaWQgKilyaW5nX2luZm8tPnJpbmdfYnVmZmVyLT5idWZmZXI7CiB9CiAKIAogLyorKwogCiBOYW1lOgotCUdldFJpbmdCdWZmZXJTaXplKCkKKwlnZXRfcmluZ19idWZmZXJzaXplKCkKIAogRGVzY3JpcHRpb246CiAJR2V0IHRoZSBzaXplIG9mIHRoZSByaW5nIGJ1ZmZlcgogCiAtLSovCiBzdGF0aWMgaW5saW5lIHUzMgotR2V0UmluZ0J1ZmZlclNpemUoc3RydWN0IGh2X3JpbmdfYnVmZmVyX2luZm8gKlJpbmdJbmZvKQorZ2V0X3JpbmdfYnVmZmVyc2l6ZShzdHJ1Y3QgaHZfcmluZ19idWZmZXJfaW5mbyAqcmluZ19pbmZvKQogewotCXJldHVybiBSaW5nSW5mby0+UmluZ0RhdGFTaXplOworCXJldHVybiByaW5nX2luZm8tPnJpbmdfZGF0YXNpemU7CiB9CiAKIC8qKysKIAogTmFtZToKLQlHZXRSaW5nQnVmZmVySW5kaWNlcygpCisJZ2V0X3JpbmdfYnVmZmVyaW5kaWNlcygpCiAKIERlc2NyaXB0aW9uOgogCUdldCB0aGUgcmVhZCBhbmQgd3JpdGUgaW5kaWNlcyBhcyB1NjQgb2YgdGhlIHNwZWNpZmllZCByaW5nIGJ1ZmZlcgogCiAtLSovCiBzdGF0aWMgaW5saW5lIHU2NAotR2V0UmluZ0J1ZmZlckluZGljZXMoc3RydWN0IGh2X3JpbmdfYnVmZmVyX2luZm8gKlJpbmdJbmZvKQorZ2V0X3JpbmdfYnVmZmVyaW5kaWNlcyhzdHJ1Y3QgaHZfcmluZ19idWZmZXJfaW5mbyAqcmluZ19pbmZvKQogewotCXJldHVybiAodTY0KVJpbmdJbmZvLT5SaW5nQnVmZmVyLT5Xcml0ZUluZGV4IDw8IDMyOworCXJldHVybiAodTY0KXJpbmdfaW5mby0+cmluZ19idWZmZXItPndyaXRlX2luZGV4IDw8IDMyOwogfQogCiAKIC8qKysKIAogTmFtZToKLQlEdW1wUmluZ0luZm8oKQorCWR1bXBfcmluZ19pbmZvKCkKIAogRGVzY3JpcHRpb246CiAJRHVtcCBvdXQgdG8gY29uc29sZSB0aGUgcmluZyBidWZmZXIgaW5mbwogCiAtLSovCi12b2lkIER1bXBSaW5nSW5mbyhzdHJ1Y3QgaHZfcmluZ19idWZmZXJfaW5mbyAqUmluZ0luZm8sIGNoYXIgKlByZWZpeCkKK3ZvaWQgZHVtcF9yaW5nX2luZm8oc3RydWN0IGh2X3JpbmdfYnVmZmVyX2luZm8gKnJpbmdfaW5mbywgY2hhciAqcHJlZml4KQogewotCXUzMiBieXRlc0F2YWlsVG9Xcml0ZTsKLQl1MzIgYnl0ZXNBdmFpbFRvUmVhZDsKKwl1MzIgYnl0ZXNfYXZhaWxfdG93cml0ZTsKKwl1MzIgYnl0ZXNfYXZhaWxfdG9yZWFkOwogCi0JR2V0UmluZ0J1ZmZlckF2YWlsQnl0ZXMoUmluZ0luZm8sCi0JJmJ5dGVzQXZhaWxUb1JlYWQsCi0JJmJ5dGVzQXZhaWxUb1dyaXRlKTsKKwlnZXRfcmluZ2J1ZmZlcl9hdmFpbGJ5dGVzKHJpbmdfaW5mbywKKwkmYnl0ZXNfYXZhaWxfdG9yZWFkLAorCSZieXRlc19hdmFpbF90b3dyaXRlKTsKIAogCURQUklOVChWTUJVUywKIAkJREVCVUdfUklOR19MVkwsCiAJCSIlcyA8PHJpbmdpbmZvICVwIGJ1ZmZlciAlcCBhdmFpbCB3cml0ZSAldSAiCiAJCSJhdmFpbCByZWFkICV1IHJlYWQgaWR4ICV1IHdyaXRlIGlkeCAldT4+IiwKLQkJUHJlZml4LAotCQlSaW5nSW5mbywKLQkJUmluZ0luZm8tPlJpbmdCdWZmZXItPkJ1ZmZlciwKLQkJYnl0ZXNBdmFpbFRvV3JpdGUsCi0JCWJ5dGVzQXZhaWxUb1JlYWQsCi0JCVJpbmdJbmZvLT5SaW5nQnVmZmVyLT5SZWFkSW5kZXgsCi0JCVJpbmdJbmZvLT5SaW5nQnVmZmVyLT5Xcml0ZUluZGV4KTsKKwkJcHJlZml4LAorCQlyaW5nX2luZm8sCisJCXJpbmdfaW5mby0+cmluZ19idWZmZXItPmJ1ZmZlciwKKwkJYnl0ZXNfYXZhaWxfdG93cml0ZSwKKwkJYnl0ZXNfYXZhaWxfdG9yZWFkLAorCQlyaW5nX2luZm8tPnJpbmdfYnVmZmVyLT5yZWFkX2luZGV4LAorCQlyaW5nX2luZm8tPnJpbmdfYnVmZmVyLT53cml0ZV9pbmRleCk7CiB9CiAKIAogLyogSW50ZXJuYWwgcm91dGluZXMgKi8KIAogc3RhdGljIHUzMgotQ29weVRvUmluZ0J1ZmZlcigKLQlzdHJ1Y3QgaHZfcmluZ19idWZmZXJfaW5mbwkqUmluZ0luZm8sCi0JdTMyCQkJCVN0YXJ0V3JpdGVPZmZzZXQsCi0Jdm9pZAkJCQkqU3JjLAotCXUzMgkJCQlTcmNMZW4pOworY29weXRvX3JpbmdidWZmZXIoCisJc3RydWN0IGh2X3JpbmdfYnVmZmVyX2luZm8JKnJpbmdfaW5mbywKKwl1MzIJCQkJc3RhcnRfd3JpdGVfb2Zmc2V0LAorCXZvaWQJCQkJKnNyYywKKwl1MzIJCQkJc3JjbGVuKTsKIAogc3RhdGljIHUzMgotQ29weUZyb21SaW5nQnVmZmVyKAotCXN0cnVjdCBodl9yaW5nX2J1ZmZlcl9pbmZvCSpSaW5nSW5mbywKLQl2b2lkCQkJCSpEZXN0LAotCXUzMgkJCQlEZXN0TGVuLAotCXUzMgkJCQlTdGFydFJlYWRPZmZzZXQpOworY29weWZyb21fcmluZ2J1ZmZlcigKKwlzdHJ1Y3QgaHZfcmluZ19idWZmZXJfaW5mbwkqcmluZ19pbmZvLAorCXZvaWQJCQkJKmRlc3QsCisJdTMyCQkJCWRlc3RsZW4sCisJdTMyCQkJCXN0YXJ0X3JlYWRfb2Zmc2V0KTsKIAogCiAKIC8qKysKIAogTmFtZToKLQlSaW5nQnVmZmVyR2V0RGVidWdJbmZvKCkKKwlyaW5nYnVmZmVyX2dldF9kZWJ1Z2luZm8oKQogCiBEZXNjcmlwdGlvbjoKIAlHZXQgdmFyaW91cyBkZWJ1ZyBtZXRyaWNzIGZvciB0aGUgc3BlY2lmaWVkIHJpbmcgYnVmZmVyCiAKIC0tKi8KLXZvaWQgUmluZ0J1ZmZlckdldERlYnVnSW5mbyhzdHJ1Y3QgaHZfcmluZ19idWZmZXJfaW5mbyAqUmluZ0luZm8sCit2b2lkIHJpbmdidWZmZXJfZ2V0X2RlYnVnaW5mbyhzdHJ1Y3QgaHZfcmluZ19idWZmZXJfaW5mbyAqcmluZ19pbmZvLAogCQkJICAgIHN0cnVjdCBodl9yaW5nX2J1ZmZlcl9kZWJ1Z19pbmZvICpkZWJ1Z19pbmZvKQogewotCXUzMiBieXRlc0F2YWlsVG9Xcml0ZTsKLQl1MzIgYnl0ZXNBdmFpbFRvUmVhZDsKKwl1MzIgYnl0ZXNfYXZhaWxfdG93cml0ZTsKKwl1MzIgYnl0ZXNfYXZhaWxfdG9yZWFkOwogCi0JaWYgKFJpbmdJbmZvLT5SaW5nQnVmZmVyKSB7Ci0JCUdldFJpbmdCdWZmZXJBdmFpbEJ5dGVzKFJpbmdJbmZvLAotCQkJCQkmYnl0ZXNBdmFpbFRvUmVhZCwKLQkJCQkJJmJ5dGVzQXZhaWxUb1dyaXRlKTsKKwlpZiAocmluZ19pbmZvLT5yaW5nX2J1ZmZlcikgeworCQlnZXRfcmluZ2J1ZmZlcl9hdmFpbGJ5dGVzKHJpbmdfaW5mbywKKwkJCQkJJmJ5dGVzX2F2YWlsX3RvcmVhZCwKKwkJCQkJJmJ5dGVzX2F2YWlsX3Rvd3JpdGUpOwogCi0JCWRlYnVnX2luZm8tPkJ5dGVzQXZhaWxUb1JlYWQgPSBieXRlc0F2YWlsVG9SZWFkOwotCQlkZWJ1Z19pbmZvLT5CeXRlc0F2YWlsVG9Xcml0ZSA9IGJ5dGVzQXZhaWxUb1dyaXRlOwotCQlkZWJ1Z19pbmZvLT5DdXJyZW50UmVhZEluZGV4ID0gUmluZ0luZm8tPlJpbmdCdWZmZXItPlJlYWRJbmRleDsKLQkJZGVidWdfaW5mby0+Q3VycmVudFdyaXRlSW5kZXggPSBSaW5nSW5mby0+UmluZ0J1ZmZlci0+V3JpdGVJbmRleDsKLQkJZGVidWdfaW5mby0+Q3VycmVudEludGVycnVwdE1hc2sgPSBSaW5nSW5mby0+UmluZ0J1ZmZlci0+SW50ZXJydXB0TWFzazsKKwkJZGVidWdfaW5mby0+Ynl0ZXNfYXZhaWxfdG9yZWFkID0gYnl0ZXNfYXZhaWxfdG9yZWFkOworCQlkZWJ1Z19pbmZvLT5ieXRlc19hdmFpbF90b3dyaXRlID0gYnl0ZXNfYXZhaWxfdG93cml0ZTsKKwkJZGVidWdfaW5mby0+Y3VycmVudF9yZWFkX2luZGV4ID0KKwkJCXJpbmdfaW5mby0+cmluZ19idWZmZXItPnJlYWRfaW5kZXg7CisJCWRlYnVnX2luZm8tPmN1cnJlbnRfd3JpdGVfaW5kZXggPQorCQkJcmluZ19pbmZvLT5yaW5nX2J1ZmZlci0+d3JpdGVfaW5kZXg7CisJCWRlYnVnX2luZm8tPmN1cnJlbnRfaW50ZXJydXB0X21hc2sgPQorCQkJcmluZ19pbmZvLT5yaW5nX2J1ZmZlci0+aW50ZXJydXB0X21hc2s7CiAJfQogfQogCkBAIC0yNzksNDAgKzI4NSw0MiBAQAogLyorKwogCiBOYW1lOgotCUdldFJpbmdCdWZmZXJJbnRlcnJ1cHRNYXNrKCkKKwlnZXRfcmluZ2J1ZmZlcl9pbnRlcnJ1cHRfbWFzaygpCiAKIERlc2NyaXB0aW9uOgogCUdldCB0aGUgaW50ZXJydXB0IG1hc2sgZm9yIHRoZSBzcGVjaWZpZWQgcmluZyBidWZmZXIKIAogLS0qLwotdTMyIEdldFJpbmdCdWZmZXJJbnRlcnJ1cHRNYXNrKHN0cnVjdCBodl9yaW5nX2J1ZmZlcl9pbmZvICpyYmkpCit1MzIgZ2V0X3JpbmdidWZmZXJfaW50ZXJydXB0X21hc2soc3RydWN0IGh2X3JpbmdfYnVmZmVyX2luZm8gKnJiaSkKIHsKLQlyZXR1cm4gcmJpLT5SaW5nQnVmZmVyLT5JbnRlcnJ1cHRNYXNrOworCXJldHVybiByYmktPnJpbmdfYnVmZmVyLT5pbnRlcnJ1cHRfbWFzazsKIH0KIAogLyorKwogCiBOYW1lOgotCVJpbmdCdWZmZXJJbml0KCkKKwlyaW5nYnVmZmVyX2luaXQoKQogCiBEZXNjcmlwdGlvbjoKIAlJbml0aWFsaXplIHRoZSByaW5nIGJ1ZmZlcgogCiAtLSovCi1pbnQgUmluZ0J1ZmZlckluaXQoc3RydWN0IGh2X3JpbmdfYnVmZmVyX2luZm8gKlJpbmdJbmZvLCB2b2lkICpCdWZmZXIsIHUzMiBCdWZmZXJMZW4pCitpbnQgcmluZ2J1ZmZlcl9pbml0KHN0cnVjdCBodl9yaW5nX2J1ZmZlcl9pbmZvICpyaW5nX2luZm8sCisJCSAgIHZvaWQgKmJ1ZmZlciwgdTMyIGJ1ZmxlbikKIHsKIAlpZiAoc2l6ZW9mKHN0cnVjdCBodl9yaW5nX2J1ZmZlcikgIT0gUEFHRV9TSVpFKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCW1lbXNldChSaW5nSW5mbywgMCwgc2l6ZW9mKHN0cnVjdCBodl9yaW5nX2J1ZmZlcl9pbmZvKSk7CisJbWVtc2V0KHJpbmdfaW5mbywgMCwgc2l6ZW9mKHN0cnVjdCBodl9yaW5nX2J1ZmZlcl9pbmZvKSk7CiAKLQlSaW5nSW5mby0+UmluZ0J1ZmZlciA9IChzdHJ1Y3QgaHZfcmluZ19idWZmZXIgKilCdWZmZXI7Ci0JUmluZ0luZm8tPlJpbmdCdWZmZXItPlJlYWRJbmRleCA9IFJpbmdJbmZvLT5SaW5nQnVmZmVyLT5Xcml0ZUluZGV4ID0gMDsKKwlyaW5nX2luZm8tPnJpbmdfYnVmZmVyID0gKHN0cnVjdCBodl9yaW5nX2J1ZmZlciAqKWJ1ZmZlcjsKKwlyaW5nX2luZm8tPnJpbmdfYnVmZmVyLT5yZWFkX2luZGV4ID0KKwkJcmluZ19pbmZvLT5yaW5nX2J1ZmZlci0+d3JpdGVfaW5kZXggPSAwOwogCi0JUmluZ0luZm8tPlJpbmdTaXplID0gQnVmZmVyTGVuOwotCVJpbmdJbmZvLT5SaW5nRGF0YVNpemUgPSBCdWZmZXJMZW4gLSBzaXplb2Yoc3RydWN0IGh2X3JpbmdfYnVmZmVyKTsKKwlyaW5nX2luZm8tPnJpbmdfc2l6ZSA9IGJ1ZmxlbjsKKwlyaW5nX2luZm8tPnJpbmdfZGF0YXNpemUgPSBidWZsZW4gLSBzaXplb2Yoc3RydWN0IGh2X3JpbmdfYnVmZmVyKTsKIAotCXNwaW5fbG9ja19pbml0KCZSaW5nSW5mby0+cmluZ19sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmcmluZ19pbmZvLT5yaW5nX2xvY2spOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0zMjAsOTcgKzMyOCw5NyBAQAogLyorKwogCiBOYW1lOgotCVJpbmdCdWZmZXJDbGVhbnVwKCkKKwlyaW5nYnVmZmVyX2NsZWFudXAoKQogCiBEZXNjcmlwdGlvbjoKIAlDbGVhbnVwIHRoZSByaW5nIGJ1ZmZlcgogCiAtLSovCi12b2lkIFJpbmdCdWZmZXJDbGVhbnVwKHN0cnVjdCBodl9yaW5nX2J1ZmZlcl9pbmZvICpSaW5nSW5mbykKK3ZvaWQgcmluZ2J1ZmZlcl9jbGVhbnVwKHN0cnVjdCBodl9yaW5nX2J1ZmZlcl9pbmZvICpyaW5nX2luZm8pCiB7CiB9CiAKIC8qKysKIAogTmFtZToKLQlSaW5nQnVmZmVyV3JpdGUoKQorCXJpbmdidWZmZXJfd3JpdGUoKQogCiBEZXNjcmlwdGlvbjoKIAlXcml0ZSB0byB0aGUgcmluZyBidWZmZXIKIAogLS0qLwotaW50IFJpbmdCdWZmZXJXcml0ZShzdHJ1Y3QgaHZfcmluZ19idWZmZXJfaW5mbyAqT3V0UmluZ0luZm8sCitpbnQgcmluZ2J1ZmZlcl93cml0ZShzdHJ1Y3QgaHZfcmluZ19idWZmZXJfaW5mbyAqb3V0cmluZ19pbmZvLAogCQkgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ2xpc3QsIHUzMiBzZ2NvdW50KQogewogCWludCBpID0gMDsKLQl1MzIgYnl0ZUF2YWlsVG9Xcml0ZTsKLQl1MzIgYnl0ZUF2YWlsVG9SZWFkOwotCXUzMiB0b3RhbEJ5dGVzVG9Xcml0ZSA9IDA7CisJdTMyIGJ5dGVzX2F2YWlsX3Rvd3JpdGU7CisJdTMyIGJ5dGVzX2F2YWlsX3RvcmVhZDsKKwl1MzIgdG90YWxieXRlc190b3dyaXRlID0gMDsKIAogCXN0cnVjdCBzY2F0dGVybGlzdCAqc2c7Ci0Jdm9sYXRpbGUgdTMyIG5leHRXcml0ZUxvY2F0aW9uOwotCXU2NCBwcmV2SW5kaWNlcyA9IDA7CisJdm9sYXRpbGUgdTMyIG5leHRfd3JpdGVfbG9jYXRpb247CisJdTY0IHByZXZfaW5kaWNlcyA9IDA7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCWZvcl9lYWNoX3NnKHNnbGlzdCwgc2csIHNnY291bnQsIGkpCiAJewotCQl0b3RhbEJ5dGVzVG9Xcml0ZSArPSBzZy0+bGVuZ3RoOworCQl0b3RhbGJ5dGVzX3Rvd3JpdGUgKz0gc2ctPmxlbmd0aDsKIAl9CiAKLQl0b3RhbEJ5dGVzVG9Xcml0ZSArPSBzaXplb2YodTY0KTsKKwl0b3RhbGJ5dGVzX3Rvd3JpdGUgKz0gc2l6ZW9mKHU2NCk7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmT3V0UmluZ0luZm8tPnJpbmdfbG9jaywgZmxhZ3MpOworCXNwaW5fbG9ja19pcnFzYXZlKCZvdXRyaW5nX2luZm8tPnJpbmdfbG9jaywgZmxhZ3MpOwogCi0JR2V0UmluZ0J1ZmZlckF2YWlsQnl0ZXMoT3V0UmluZ0luZm8sCi0JCQkJJmJ5dGVBdmFpbFRvUmVhZCwKLQkJCQkmYnl0ZUF2YWlsVG9Xcml0ZSk7CisJZ2V0X3JpbmdidWZmZXJfYXZhaWxieXRlcyhvdXRyaW5nX2luZm8sCisJCQkJJmJ5dGVzX2F2YWlsX3RvcmVhZCwKKwkJCQkmYnl0ZXNfYXZhaWxfdG93cml0ZSk7CiAKLQlEUFJJTlRfREJHKFZNQlVTLCAiV3JpdGluZyAldSBieXRlcy4uLiIsIHRvdGFsQnl0ZXNUb1dyaXRlKTsKKwlEUFJJTlRfREJHKFZNQlVTLCAiV3JpdGluZyAldSBieXRlcy4uLiIsIHRvdGFsYnl0ZXNfdG93cml0ZSk7CiAKLQkvKiBEdW1wUmluZ0luZm8oT3V0UmluZ0luZm8sICJCRUZPUkUgIik7ICovCisJLyogRHVtcHJpbmdfaW5mbyhPdXRyaW5nX2luZm8sICJCRUZPUkUgIik7ICovCiAKIAkvKiBJZiB0aGVyZSBpcyBvbmx5IHJvb20gZm9yIHRoZSBwYWNrZXQsIGFzc3VtZSBpdCBpcyBmdWxsLiAqLwogCS8qIE90aGVyd2lzZSwgdGhlIG5leHQgdGltZSBhcm91bmQsIHdlIHRoaW5rIHRoZSByaW5nIGJ1ZmZlciAqLwogCS8qIGlzIGVtcHR5IHNpbmNlIHRoZSByZWFkIGluZGV4ID09IHdyaXRlIGluZGV4ICovCi0JaWYgKGJ5dGVBdmFpbFRvV3JpdGUgPD0gdG90YWxCeXRlc1RvV3JpdGUpIHsKKwlpZiAoYnl0ZXNfYXZhaWxfdG93cml0ZSA8PSB0b3RhbGJ5dGVzX3Rvd3JpdGUpIHsKIAkJRFBSSU5UX0RCRyhWTUJVUywKIAkJCSJObyBtb3JlIHNwYWNlIGxlZnQgb24gb3V0Ym91bmQgcmluZyBidWZmZXIgIgogCQkJIihuZWVkZWQgJXUsIGF2YWlsICV1KSIsCi0JCQl0b3RhbEJ5dGVzVG9Xcml0ZSwKLQkJCWJ5dGVBdmFpbFRvV3JpdGUpOworCQkJdG90YWxieXRlc190b3dyaXRlLAorCQkJYnl0ZXNfYXZhaWxfdG93cml0ZSk7CiAKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmT3V0UmluZ0luZm8tPnJpbmdfbG9jaywgZmxhZ3MpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZvdXRyaW5nX2luZm8tPnJpbmdfbG9jaywgZmxhZ3MpOwogCQlyZXR1cm4gLTE7CiAJfQogCiAJLyogV3JpdGUgdG8gdGhlIHJpbmcgYnVmZmVyICovCi0JbmV4dFdyaXRlTG9jYXRpb24gPSBHZXROZXh0V3JpdGVMb2NhdGlvbihPdXRSaW5nSW5mbyk7CisJbmV4dF93cml0ZV9sb2NhdGlvbiA9IGdldF9uZXh0X3dyaXRlX2xvY2F0aW9uKG91dHJpbmdfaW5mbyk7CiAKIAlmb3JfZWFjaF9zZyhzZ2xpc3QsIHNnLCBzZ2NvdW50LCBpKQogCXsKLQkJbmV4dFdyaXRlTG9jYXRpb24gPSBDb3B5VG9SaW5nQnVmZmVyKE91dFJpbmdJbmZvLAotCQkJCQkJICAgICBuZXh0V3JpdGVMb2NhdGlvbiwKKwkJbmV4dF93cml0ZV9sb2NhdGlvbiA9IGNvcHl0b19yaW5nYnVmZmVyKG91dHJpbmdfaW5mbywKKwkJCQkJCSAgICAgbmV4dF93cml0ZV9sb2NhdGlvbiwKIAkJCQkJCSAgICAgc2dfdmlydChzZyksCiAJCQkJCQkgICAgIHNnLT5sZW5ndGgpOwogCX0KIAogCS8qIFNldCBwcmV2aW91cyBwYWNrZXQgc3RhcnQgKi8KLQlwcmV2SW5kaWNlcyA9IEdldFJpbmdCdWZmZXJJbmRpY2VzKE91dFJpbmdJbmZvKTsKKwlwcmV2X2luZGljZXMgPSBnZXRfcmluZ19idWZmZXJpbmRpY2VzKG91dHJpbmdfaW5mbyk7CiAKLQluZXh0V3JpdGVMb2NhdGlvbiA9IENvcHlUb1JpbmdCdWZmZXIoT3V0UmluZ0luZm8sCi0JCQkJCSAgICAgbmV4dFdyaXRlTG9jYXRpb24sCi0JCQkJCSAgICAgJnByZXZJbmRpY2VzLAorCW5leHRfd3JpdGVfbG9jYXRpb24gPSBjb3B5dG9fcmluZ2J1ZmZlcihvdXRyaW5nX2luZm8sCisJCQkJCSAgICAgbmV4dF93cml0ZV9sb2NhdGlvbiwKKwkJCQkJICAgICAmcHJldl9pbmRpY2VzLAogCQkJCQkgICAgIHNpemVvZih1NjQpKTsKIAogCS8qIE1ha2Ugc3VyZSB3ZSBmbHVzaCBhbGwgd3JpdGVzIGJlZm9yZSB1cGRhdGluZyB0aGUgd3JpdGVJbmRleCAqLwogCW1iKCk7CiAKIAkvKiBOb3csIHVwZGF0ZSB0aGUgd3JpdGUgbG9jYXRpb24gKi8KLQlTZXROZXh0V3JpdGVMb2NhdGlvbihPdXRSaW5nSW5mbywgbmV4dFdyaXRlTG9jYXRpb24pOworCXNldF9uZXh0X3dyaXRlX2xvY2F0aW9uKG91dHJpbmdfaW5mbywgbmV4dF93cml0ZV9sb2NhdGlvbik7CiAKLQkvKiBEdW1wUmluZ0luZm8oT3V0UmluZ0luZm8sICJBRlRFUiAiKTsgKi8KKwkvKiBEdW1wcmluZ19pbmZvKE91dHJpbmdfaW5mbywgIkFGVEVSICIpOyAqLwogCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmT3V0UmluZ0luZm8tPnJpbmdfbG9jaywgZmxhZ3MpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm91dHJpbmdfaW5mby0+cmluZ19sb2NrLCBmbGFncyk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTQxOCw0NyArNDI2LDQ4IEBACiAvKisrCiAKIE5hbWU6Ci0JUmluZ0J1ZmZlclBlZWsoKQorCXJpbmdidWZmZXJfcGVlaygpCiAKIERlc2NyaXB0aW9uOgogCVJlYWQgd2l0aG91dCBhZHZhbmNpbmcgdGhlIHJlYWQgaW5kZXgKIAogLS0qLwotaW50IFJpbmdCdWZmZXJQZWVrKHN0cnVjdCBodl9yaW5nX2J1ZmZlcl9pbmZvICpJblJpbmdJbmZvLCB2b2lkICpCdWZmZXIsIHUzMiBCdWZmZXJMZW4pCitpbnQgcmluZ2J1ZmZlcl9wZWVrKHN0cnVjdCBodl9yaW5nX2J1ZmZlcl9pbmZvICpJbnJpbmdfaW5mbywKKwkJICAgdm9pZCAqQnVmZmVyLCB1MzIgYnVmbGVuKQogewotCXUzMiBieXRlc0F2YWlsVG9Xcml0ZTsKLQl1MzIgYnl0ZXNBdmFpbFRvUmVhZDsKLQl1MzIgbmV4dFJlYWRMb2NhdGlvbiA9IDA7CisJdTMyIGJ5dGVzX2F2YWlsX3Rvd3JpdGU7CisJdTMyIGJ5dGVzX2F2YWlsX3RvcmVhZDsKKwl1MzIgbmV4dF9yZWFkX2xvY2F0aW9uID0gMDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJkluUmluZ0luZm8tPnJpbmdfbG9jaywgZmxhZ3MpOworCXNwaW5fbG9ja19pcnFzYXZlKCZJbnJpbmdfaW5mby0+cmluZ19sb2NrLCBmbGFncyk7CiAKLQlHZXRSaW5nQnVmZmVyQXZhaWxCeXRlcyhJblJpbmdJbmZvLAotCQkJCSZieXRlc0F2YWlsVG9SZWFkLAotCQkJCSZieXRlc0F2YWlsVG9Xcml0ZSk7CisJZ2V0X3JpbmdidWZmZXJfYXZhaWxieXRlcyhJbnJpbmdfaW5mbywKKwkJCQkmYnl0ZXNfYXZhaWxfdG9yZWFkLAorCQkJCSZieXRlc19hdmFpbF90b3dyaXRlKTsKIAogCS8qIE1ha2Ugc3VyZSB0aGVyZSBpcyBzb21ldGhpbmcgdG8gcmVhZCAqLwotCWlmIChieXRlc0F2YWlsVG9SZWFkIDwgQnVmZmVyTGVuKSB7CisJaWYgKGJ5dGVzX2F2YWlsX3RvcmVhZCA8IGJ1ZmxlbikgewogCQkvKiBEUFJJTlRfREJHKFZNQlVTLAogCQkJImdvdCBjYWxsYmFjayBidXQgbm90IGVub3VnaCB0byByZWFkICIKIAkJCSI8YXZhaWwgdG8gcmVhZCAlZCByZWFkIHNpemUgJWQ+ISEiLAotCQkJYnl0ZXNBdmFpbFRvUmVhZCwKKwkJCWJ5dGVzX2F2YWlsX3RvcmVhZCwKIAkJCUJ1ZmZlckxlbik7ICovCiAKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmSW5SaW5nSW5mby0+cmluZ19sb2NrLCBmbGFncyk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJklucmluZ19pbmZvLT5yaW5nX2xvY2ssIGZsYWdzKTsKIAogCQlyZXR1cm4gLTE7CiAJfQogCiAJLyogQ29udmVydCB0byBieXRlIG9mZnNldCAqLwotCW5leHRSZWFkTG9jYXRpb24gPSBHZXROZXh0UmVhZExvY2F0aW9uKEluUmluZ0luZm8pOworCW5leHRfcmVhZF9sb2NhdGlvbiA9IGdldF9uZXh0X3JlYWRfbG9jYXRpb24oSW5yaW5nX2luZm8pOwogCi0JbmV4dFJlYWRMb2NhdGlvbiA9IENvcHlGcm9tUmluZ0J1ZmZlcihJblJpbmdJbmZvLAorCW5leHRfcmVhZF9sb2NhdGlvbiA9IGNvcHlmcm9tX3JpbmdidWZmZXIoSW5yaW5nX2luZm8sCiAJCQkJCQlCdWZmZXIsCi0JCQkJCQlCdWZmZXJMZW4sCi0JCQkJCQluZXh0UmVhZExvY2F0aW9uKTsKKwkJCQkJCWJ1ZmxlbiwKKwkJCQkJCW5leHRfcmVhZF9sb2NhdGlvbik7CiAKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZJblJpbmdJbmZvLT5yaW5nX2xvY2ssIGZsYWdzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZJbnJpbmdfaW5mby0+cmluZ19sb2NrLCBmbGFncyk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTQ2Nyw1OCArNDc2LDU5IEBACiAvKisrCiAKIE5hbWU6Ci0JUmluZ0J1ZmZlclJlYWQoKQorCXJpbmdidWZmZXJfcmVhZCgpCiAKIERlc2NyaXB0aW9uOgogCVJlYWQgYW5kIGFkdmFuY2UgdGhlIHJlYWQgaW5kZXgKIAogLS0qLwotaW50IFJpbmdCdWZmZXJSZWFkKHN0cnVjdCBodl9yaW5nX2J1ZmZlcl9pbmZvICpJblJpbmdJbmZvLCB2b2lkICpCdWZmZXIsCi0JCSAgIHUzMiBCdWZmZXJMZW4sIHUzMiBPZmZzZXQpCitpbnQgcmluZ2J1ZmZlcl9yZWFkKHN0cnVjdCBodl9yaW5nX2J1ZmZlcl9pbmZvICppbnJpbmdfaW5mbywgdm9pZCAqYnVmZmVyLAorCQkgICB1MzIgYnVmbGVuLCB1MzIgb2Zmc2V0KQogewotCXUzMiBieXRlc0F2YWlsVG9Xcml0ZTsKLQl1MzIgYnl0ZXNBdmFpbFRvUmVhZDsKLQl1MzIgbmV4dFJlYWRMb2NhdGlvbiA9IDA7Ci0JdTY0IHByZXZJbmRpY2VzID0gMDsKKwl1MzIgYnl0ZXNfYXZhaWxfdG93cml0ZTsKKwl1MzIgYnl0ZXNfYXZhaWxfdG9yZWFkOworCXUzMiBuZXh0X3JlYWRfbG9jYXRpb24gPSAwOworCXU2NCBwcmV2X2luZGljZXMgPSAwOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlpZiAoQnVmZmVyTGVuIDw9IDApCisJaWYgKGJ1ZmxlbiA8PSAwKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZJblJpbmdJbmZvLT5yaW5nX2xvY2ssIGZsYWdzKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5yaW5nX2luZm8tPnJpbmdfbG9jaywgZmxhZ3MpOwogCi0JR2V0UmluZ0J1ZmZlckF2YWlsQnl0ZXMoSW5SaW5nSW5mbywKLQkJCQkmYnl0ZXNBdmFpbFRvUmVhZCwKLQkJCQkmYnl0ZXNBdmFpbFRvV3JpdGUpOworCWdldF9yaW5nYnVmZmVyX2F2YWlsYnl0ZXMoaW5yaW5nX2luZm8sCisJCQkJJmJ5dGVzX2F2YWlsX3RvcmVhZCwKKwkJCQkmYnl0ZXNfYXZhaWxfdG93cml0ZSk7CiAKLQlEUFJJTlRfREJHKFZNQlVTLCAiUmVhZGluZyAldSBieXRlcy4uLiIsIEJ1ZmZlckxlbik7CisJRFBSSU5UX0RCRyhWTUJVUywgIlJlYWRpbmcgJXUgYnl0ZXMuLi4iLCBidWZsZW4pOwogCi0JLyogRHVtcFJpbmdJbmZvKEluUmluZ0luZm8sICJCRUZPUkUgIik7ICovCisJLyogRHVtcHJpbmdfaW5mbyhJbnJpbmdfaW5mbywgIkJFRk9SRSAiKTsgKi8KIAogCS8qIE1ha2Ugc3VyZSB0aGVyZSBpcyBzb21ldGhpbmcgdG8gcmVhZCAqLwotCWlmIChieXRlc0F2YWlsVG9SZWFkIDwgQnVmZmVyTGVuKSB7CisJaWYgKGJ5dGVzX2F2YWlsX3RvcmVhZCA8IGJ1ZmxlbikgewogCQlEUFJJTlRfREJHKFZNQlVTLAogCQkJImdvdCBjYWxsYmFjayBidXQgbm90IGVub3VnaCB0byByZWFkICIKIAkJCSI8YXZhaWwgdG8gcmVhZCAlZCByZWFkIHNpemUgJWQ+ISEiLAotCQkJYnl0ZXNBdmFpbFRvUmVhZCwKLQkJCUJ1ZmZlckxlbik7CisJCQlieXRlc19hdmFpbF90b3JlYWQsCisJCQlidWZsZW4pOwogCi0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJkluUmluZ0luZm8tPnJpbmdfbG9jaywgZmxhZ3MpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnJpbmdfaW5mby0+cmluZ19sb2NrLCBmbGFncyk7CiAKIAkJcmV0dXJuIC0xOwogCX0KIAotCW5leHRSZWFkTG9jYXRpb24gPSBHZXROZXh0UmVhZExvY2F0aW9uV2l0aE9mZnNldChJblJpbmdJbmZvLCBPZmZzZXQpOworCW5leHRfcmVhZF9sb2NhdGlvbiA9CisJCWdldF9uZXh0X3JlYWRsb2NhdGlvbl93aXRob2Zmc2V0KGlucmluZ19pbmZvLCBvZmZzZXQpOwogCi0JbmV4dFJlYWRMb2NhdGlvbiA9IENvcHlGcm9tUmluZ0J1ZmZlcihJblJpbmdJbmZvLAotCQkJCQkJQnVmZmVyLAotCQkJCQkJQnVmZmVyTGVuLAotCQkJCQkJbmV4dFJlYWRMb2NhdGlvbik7CisJbmV4dF9yZWFkX2xvY2F0aW9uID0gY29weWZyb21fcmluZ2J1ZmZlcihpbnJpbmdfaW5mbywKKwkJCQkJCWJ1ZmZlciwKKwkJCQkJCWJ1ZmxlbiwKKwkJCQkJCW5leHRfcmVhZF9sb2NhdGlvbik7CiAKLQluZXh0UmVhZExvY2F0aW9uID0gQ29weUZyb21SaW5nQnVmZmVyKEluUmluZ0luZm8sCi0JCQkJCQkmcHJldkluZGljZXMsCisJbmV4dF9yZWFkX2xvY2F0aW9uID0gY29weWZyb21fcmluZ2J1ZmZlcihpbnJpbmdfaW5mbywKKwkJCQkJCSZwcmV2X2luZGljZXMsCiAJCQkJCQlzaXplb2YodTY0KSwKLQkJCQkJCW5leHRSZWFkTG9jYXRpb24pOworCQkJCQkJbmV4dF9yZWFkX2xvY2F0aW9uKTsKIAogCS8qIE1ha2Ugc3VyZSBhbGwgcmVhZHMgYXJlIGRvbmUgYmVmb3JlIHdlIHVwZGF0ZSB0aGUgcmVhZCBpbmRleCBzaW5jZSAqLwogCS8qIHRoZSB3cml0ZXIgbWF5IHN0YXJ0IHdyaXRpbmcgdG8gdGhlIHJlYWQgYXJlYSBvbmNlIHRoZSByZWFkIGluZGV4ICovCkBAIC01MjYsMTEgKzUzNiwxMSBAQAogCW1iKCk7CiAKIAkvKiBVcGRhdGUgdGhlIHJlYWQgaW5kZXggKi8KLQlTZXROZXh0UmVhZExvY2F0aW9uKEluUmluZ0luZm8sIG5leHRSZWFkTG9jYXRpb24pOworCXNldF9uZXh0X3JlYWRfbG9jYXRpb24oaW5yaW5nX2luZm8sIG5leHRfcmVhZF9sb2NhdGlvbik7CiAKLQkvKiBEdW1wUmluZ0luZm8oSW5SaW5nSW5mbywgIkFGVEVSICIpOyAqLworCS8qIER1bXByaW5nX2luZm8oSW5yaW5nX2luZm8sICJBRlRFUiAiKTsgKi8KIAotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJkluUmluZ0luZm8tPnJpbmdfbG9jaywgZmxhZ3MpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlucmluZ19pbmZvLT5yaW5nX2xvY2ssIGZsYWdzKTsKIAogCXJldHVybiAwOwogfQpAQCAtNTM5LDcgKzU0OSw3IEBACiAvKisrCiAKIE5hbWU6Ci0JQ29weVRvUmluZ0J1ZmZlcigpCisJY29weXRvX3JpbmdidWZmZXIoKQogCiBEZXNjcmlwdGlvbjoKIAlIZWxwZXIgcm91dGluZSB0byBjb3B5IGZyb20gc291cmNlIHRvIHJpbmcgYnVmZmVyLgpAQCAtNTQ3LDM3ICs1NTcsMzcgQEAKIAogLS0qLwogc3RhdGljIHUzMgotQ29weVRvUmluZ0J1ZmZlcigKLQlzdHJ1Y3QgaHZfcmluZ19idWZmZXJfaW5mbwkqUmluZ0luZm8sCi0JdTMyCQkJCVN0YXJ0V3JpdGVPZmZzZXQsCi0Jdm9pZAkJCQkqU3JjLAotCXUzMgkJCQlTcmNMZW4pCitjb3B5dG9fcmluZ2J1ZmZlcigKKwlzdHJ1Y3QgaHZfcmluZ19idWZmZXJfaW5mbwkqcmluZ19pbmZvLAorCXUzMgkJCQlzdGFydF93cml0ZV9vZmZzZXQsCisJdm9pZAkJCQkqc3JjLAorCXUzMgkJCQlzcmNsZW4pCiB7Ci0Jdm9pZCAqcmluZ0J1ZmZlciA9IEdldFJpbmdCdWZmZXIoUmluZ0luZm8pOwotCXUzMiByaW5nQnVmZmVyU2l6ZSA9IEdldFJpbmdCdWZmZXJTaXplKFJpbmdJbmZvKTsKLQl1MzIgZnJhZ0xlbjsKKwl2b2lkICpyaW5nX2J1ZmZlciA9IGdldF9yaW5nX2J1ZmZlcihyaW5nX2luZm8pOworCXUzMiByaW5nX2J1ZmZlcl9zaXplID0gZ2V0X3JpbmdfYnVmZmVyc2l6ZShyaW5nX2luZm8pOworCXUzMiBmcmFnX2xlbjsKIAogCS8qIHdyYXAtYXJvdW5kIGRldGVjdGVkISAqLwotCWlmIChTcmNMZW4gPiByaW5nQnVmZmVyU2l6ZSAtIFN0YXJ0V3JpdGVPZmZzZXQpIHsKKwlpZiAoc3JjbGVuID4gcmluZ19idWZmZXJfc2l6ZSAtIHN0YXJ0X3dyaXRlX29mZnNldCkgewogCQlEUFJJTlRfREJHKFZNQlVTLCAid3JhcC1hcm91bmQgZGV0ZWN0ZWQhIik7CiAKLQkJZnJhZ0xlbiA9IHJpbmdCdWZmZXJTaXplIC0gU3RhcnRXcml0ZU9mZnNldDsKLQkJbWVtY3B5KHJpbmdCdWZmZXIgKyBTdGFydFdyaXRlT2Zmc2V0LCBTcmMsIGZyYWdMZW4pOwotCQltZW1jcHkocmluZ0J1ZmZlciwgU3JjICsgZnJhZ0xlbiwgU3JjTGVuIC0gZnJhZ0xlbik7CisJCWZyYWdfbGVuID0gcmluZ19idWZmZXJfc2l6ZSAtIHN0YXJ0X3dyaXRlX29mZnNldDsKKwkJbWVtY3B5KHJpbmdfYnVmZmVyICsgc3RhcnRfd3JpdGVfb2Zmc2V0LCBzcmMsIGZyYWdfbGVuKTsKKwkJbWVtY3B5KHJpbmdfYnVmZmVyLCBzcmMgKyBmcmFnX2xlbiwgc3JjbGVuIC0gZnJhZ19sZW4pOwogCX0gZWxzZQotCQltZW1jcHkocmluZ0J1ZmZlciArIFN0YXJ0V3JpdGVPZmZzZXQsIFNyYywgU3JjTGVuKTsKKwkJbWVtY3B5KHJpbmdfYnVmZmVyICsgc3RhcnRfd3JpdGVfb2Zmc2V0LCBzcmMsIHNyY2xlbik7CiAKLQlTdGFydFdyaXRlT2Zmc2V0ICs9IFNyY0xlbjsKLQlTdGFydFdyaXRlT2Zmc2V0ICU9IHJpbmdCdWZmZXJTaXplOworCXN0YXJ0X3dyaXRlX29mZnNldCArPSBzcmNsZW47CisJc3RhcnRfd3JpdGVfb2Zmc2V0ICU9IHJpbmdfYnVmZmVyX3NpemU7CiAKLQlyZXR1cm4gU3RhcnRXcml0ZU9mZnNldDsKKwlyZXR1cm4gc3RhcnRfd3JpdGVfb2Zmc2V0OwogfQogCiAKIC8qKysKIAogTmFtZToKLQlDb3B5RnJvbVJpbmdCdWZmZXIoKQorCWNvcHlmcm9tX3JpbmdidWZmZXIoKQogCiBEZXNjcmlwdGlvbjoKIAlIZWxwZXIgcm91dGluZSB0byBjb3B5IHRvIHNvdXJjZSBmcm9tIHJpbmcgYnVmZmVyLgpAQCAtNTg1LDM0ICs1OTUsMzQgQEAKIAogLS0qLwogc3RhdGljIHUzMgotQ29weUZyb21SaW5nQnVmZmVyKAotCXN0cnVjdCBodl9yaW5nX2J1ZmZlcl9pbmZvCSpSaW5nSW5mbywKLQl2b2lkCQkJCSpEZXN0LAotCXUzMgkJCQlEZXN0TGVuLAotCXUzMgkJCQlTdGFydFJlYWRPZmZzZXQpCitjb3B5ZnJvbV9yaW5nYnVmZmVyKAorCXN0cnVjdCBodl9yaW5nX2J1ZmZlcl9pbmZvCSpyaW5nX2luZm8sCisJdm9pZAkJCQkqZGVzdCwKKwl1MzIJCQkJZGVzdGxlbiwKKwl1MzIJCQkJc3RhcnRfcmVhZF9vZmZzZXQpCiB7Ci0Jdm9pZCAqcmluZ0J1ZmZlciA9IEdldFJpbmdCdWZmZXIoUmluZ0luZm8pOwotCXUzMiByaW5nQnVmZmVyU2l6ZSA9IEdldFJpbmdCdWZmZXJTaXplKFJpbmdJbmZvKTsKKwl2b2lkICpyaW5nX2J1ZmZlciA9IGdldF9yaW5nX2J1ZmZlcihyaW5nX2luZm8pOworCXUzMiByaW5nX2J1ZmZlcl9zaXplID0gZ2V0X3JpbmdfYnVmZmVyc2l6ZShyaW5nX2luZm8pOwogCi0JdTMyIGZyYWdMZW47CisJdTMyIGZyYWdfbGVuOwogCiAJLyogd3JhcC1hcm91bmQgZGV0ZWN0ZWQgYXQgdGhlIHNyYyAqLwotCWlmIChEZXN0TGVuID4gcmluZ0J1ZmZlclNpemUgLSBTdGFydFJlYWRPZmZzZXQpIHsKKwlpZiAoZGVzdGxlbiA+IHJpbmdfYnVmZmVyX3NpemUgLSBzdGFydF9yZWFkX29mZnNldCkgewogCQlEUFJJTlRfREJHKFZNQlVTLCAic3JjIHdyYXAtYXJvdW5kIGRldGVjdGVkISIpOwogCi0JCWZyYWdMZW4gPSByaW5nQnVmZmVyU2l6ZSAtIFN0YXJ0UmVhZE9mZnNldDsKKwkJZnJhZ19sZW4gPSByaW5nX2J1ZmZlcl9zaXplIC0gc3RhcnRfcmVhZF9vZmZzZXQ7CiAKLQkJbWVtY3B5KERlc3QsIHJpbmdCdWZmZXIgKyBTdGFydFJlYWRPZmZzZXQsIGZyYWdMZW4pOwotCQltZW1jcHkoRGVzdCArIGZyYWdMZW4sIHJpbmdCdWZmZXIsIERlc3RMZW4gLSBmcmFnTGVuKTsKKwkJbWVtY3B5KGRlc3QsIHJpbmdfYnVmZmVyICsgc3RhcnRfcmVhZF9vZmZzZXQsIGZyYWdfbGVuKTsKKwkJbWVtY3B5KGRlc3QgKyBmcmFnX2xlbiwgcmluZ19idWZmZXIsIGRlc3RsZW4gLSBmcmFnX2xlbik7CiAJfSBlbHNlCiAKLQkJbWVtY3B5KERlc3QsIHJpbmdCdWZmZXIgKyBTdGFydFJlYWRPZmZzZXQsIERlc3RMZW4pOworCQltZW1jcHkoZGVzdCwgcmluZ19idWZmZXIgKyBzdGFydF9yZWFkX29mZnNldCwgZGVzdGxlbik7CiAKIAotCVN0YXJ0UmVhZE9mZnNldCArPSBEZXN0TGVuOwotCVN0YXJ0UmVhZE9mZnNldCAlPSByaW5nQnVmZmVyU2l6ZTsKKwlzdGFydF9yZWFkX29mZnNldCArPSBkZXN0bGVuOworCXN0YXJ0X3JlYWRfb2Zmc2V0ICU9IHJpbmdfYnVmZmVyX3NpemU7CiAKLQlyZXR1cm4gU3RhcnRSZWFkT2Zmc2V0OworCXJldHVybiBzdGFydF9yZWFkX29mZnNldDsKIH0KIAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaHYvcmluZ19idWZmZXIuaCBiL2RyaXZlcnMvc3RhZ2luZy9odi9yaW5nX2J1ZmZlci5oCmluZGV4IGE3ZjE3MTcuLjdiZDZlY2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9odi9yaW5nX2J1ZmZlci5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9odi9yaW5nX2J1ZmZlci5oCkBAIC0yOSwxOCArMjksMTggQEAKIAogc3RydWN0IGh2X3JpbmdfYnVmZmVyIHsKIAkvKiBPZmZzZXQgaW4gYnl0ZXMgZnJvbSB0aGUgc3RhcnQgb2YgcmluZyBkYXRhIGJlbG93ICovCi0Jdm9sYXRpbGUgdTMyIFdyaXRlSW5kZXg7CisJdm9sYXRpbGUgdTMyIHdyaXRlX2luZGV4OwogCiAJLyogT2Zmc2V0IGluIGJ5dGVzIGZyb20gdGhlIHN0YXJ0IG9mIHJpbmcgZGF0YSBiZWxvdyAqLwotCXZvbGF0aWxlIHUzMiBSZWFkSW5kZXg7CisJdm9sYXRpbGUgdTMyIHJlYWRfaW5kZXg7CiAKLQl2b2xhdGlsZSB1MzIgSW50ZXJydXB0TWFzazsKKwl2b2xhdGlsZSB1MzIgaW50ZXJydXB0X21hc2s7CiAKIAkvKiBQYWQgaXQgdG8gUEFHRV9TSVpFIHNvIHRoYXQgZGF0YSBzdGFydHMgb24gcGFnZSBib3VuZGFyeSAqLwotCXU4CVJlc2VydmVkWzQwODRdOworCXU4CXJlc2VydmVkWzQwODRdOwogCiAJLyogTk9URToKLQkgKiBUaGUgSW50ZXJydXB0TWFzayBmaWVsZCBpcyB1c2VkIG9ubHkgZm9yIGNoYW5uZWxzIGJ1dCBzaW5jZSBvdXIKKwkgKiBUaGUgaW50ZXJydXB0X21hc2sgZmllbGQgaXMgdXNlZCBvbmx5IGZvciBjaGFubmVscyBidXQgc2luY2Ugb3VyCiAJICogdm1idXMgY29ubmVjdGlvbiBhbHNvIHVzZXMgdGhpcyBkYXRhIHN0cnVjdHVyZSBhbmQgaXRzIGRhdGEgc3RhcnRzCiAJICogaGVyZSwgd2UgY29tbWVudGVkIG91dCB0aGlzIGZpZWxkLgogCSAqLwpAQCAtNTAsMjQgKzUwLDI0IEBACiAJICogUmluZyBkYXRhIHN0YXJ0cyBoZXJlICsgUmluZ0RhdGFTdGFydE9mZnNldAogCSAqICEhISBETyBOT1QgcGxhY2UgYW55IGZpZWxkcyBiZWxvdyB0aGlzICEhIQogCSAqLwotCXU4IEJ1ZmZlclswXTsKKwl1OCBidWZmZXJbMF07CiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCiBzdHJ1Y3QgaHZfcmluZ19idWZmZXJfaW5mbyB7Ci0Jc3RydWN0IGh2X3JpbmdfYnVmZmVyICpSaW5nQnVmZmVyOwotCXUzMiBSaW5nU2l6ZTsJCQkvKiBJbmNsdWRlIHRoZSBzaGFyZWQgaGVhZGVyICovCisJc3RydWN0IGh2X3JpbmdfYnVmZmVyICpyaW5nX2J1ZmZlcjsKKwl1MzIgcmluZ19zaXplOwkJCS8qIEluY2x1ZGUgdGhlIHNoYXJlZCBoZWFkZXIgKi8KIAlzcGlubG9ja190IHJpbmdfbG9jazsKIAotCXUzMiBSaW5nRGF0YVNpemU7CQkvKiA8IHJpbmdTaXplICovCi0JdTMyIFJpbmdEYXRhU3RhcnRPZmZzZXQ7CisJdTMyIHJpbmdfZGF0YXNpemU7CQkvKiA8IHJpbmdfc2l6ZSAqLworCXUzMiByaW5nX2RhdGFfc3RhcnRvZmZzZXQ7CiB9OwogCiBzdHJ1Y3QgaHZfcmluZ19idWZmZXJfZGVidWdfaW5mbyB7Ci0JdTMyIEN1cnJlbnRJbnRlcnJ1cHRNYXNrOwotCXUzMiBDdXJyZW50UmVhZEluZGV4OwotCXUzMiBDdXJyZW50V3JpdGVJbmRleDsKLQl1MzIgQnl0ZXNBdmFpbFRvUmVhZDsKLQl1MzIgQnl0ZXNBdmFpbFRvV3JpdGU7CisJdTMyIGN1cnJlbnRfaW50ZXJydXB0X21hc2s7CisJdTMyIGN1cnJlbnRfcmVhZF9pbmRleDsKKwl1MzIgY3VycmVudF93cml0ZV9pbmRleDsKKwl1MzIgYnl0ZXNfYXZhaWxfdG9yZWFkOworCXUzMiBieXRlc19hdmFpbF90b3dyaXRlOwogfTsKIAogCkBAIC03NSwyOCArNzUsMjggQEAKIC8qIEludGVyZmFjZSAqLwogCiAKLWludCBSaW5nQnVmZmVySW5pdChzdHJ1Y3QgaHZfcmluZ19idWZmZXJfaW5mbyAqUmluZ0luZm8sIHZvaWQgKkJ1ZmZlciwKLQkJICAgdTMyIEJ1ZmZlckxlbik7CitpbnQgcmluZ2J1ZmZlcl9pbml0KHN0cnVjdCBodl9yaW5nX2J1ZmZlcl9pbmZvICpyaW5nX2luZm8sIHZvaWQgKmJ1ZmZlciwKKwkJICAgdTMyIGJ1Zmxlbik7CiAKLXZvaWQgUmluZ0J1ZmZlckNsZWFudXAoc3RydWN0IGh2X3JpbmdfYnVmZmVyX2luZm8gKlJpbmdJbmZvKTsKK3ZvaWQgcmluZ2J1ZmZlcl9jbGVhbnVwKHN0cnVjdCBodl9yaW5nX2J1ZmZlcl9pbmZvICpyaW5nX2luZm8pOwogCi1pbnQgUmluZ0J1ZmZlcldyaXRlKHN0cnVjdCBodl9yaW5nX2J1ZmZlcl9pbmZvICpSaW5nSW5mbywKK2ludCByaW5nYnVmZmVyX3dyaXRlKHN0cnVjdCBodl9yaW5nX2J1ZmZlcl9pbmZvICpyaW5nX2luZm8sCiAJCSAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnbGlzdCwKIAkJICAgIHUzMiBzZ2NvdW50KTsKIAotaW50IFJpbmdCdWZmZXJQZWVrKHN0cnVjdCBodl9yaW5nX2J1ZmZlcl9pbmZvICpSaW5nSW5mbywgdm9pZCAqQnVmZmVyLAotCQkgICB1MzIgQnVmZmVyTGVuKTsKK2ludCByaW5nYnVmZmVyX3BlZWsoc3RydWN0IGh2X3JpbmdfYnVmZmVyX2luZm8gKnJpbmdfaW5mbywgdm9pZCAqYnVmZmVyLAorCQkgICB1MzIgYnVmbGVuKTsKIAotaW50IFJpbmdCdWZmZXJSZWFkKHN0cnVjdCBodl9yaW5nX2J1ZmZlcl9pbmZvICpSaW5nSW5mbywKLQkJICAgdm9pZCAqQnVmZmVyLAotCQkgICB1MzIgQnVmZmVyTGVuLAotCQkgICB1MzIgT2Zmc2V0KTsKK2ludCByaW5nYnVmZmVyX3JlYWQoc3RydWN0IGh2X3JpbmdfYnVmZmVyX2luZm8gKnJpbmdfaW5mbywKKwkJICAgdm9pZCAqYnVmZmVyLAorCQkgICB1MzIgYnVmbGVuLAorCQkgICB1MzIgb2Zmc2V0KTsKIAotdTMyIEdldFJpbmdCdWZmZXJJbnRlcnJ1cHRNYXNrKHN0cnVjdCBodl9yaW5nX2J1ZmZlcl9pbmZvICpSaW5nSW5mbyk7Cit1MzIgZ2V0X3JpbmdidWZmZXJfaW50ZXJydXB0X21hc2soc3RydWN0IGh2X3JpbmdfYnVmZmVyX2luZm8gKnJpbmdfaW5mbyk7CiAKLXZvaWQgRHVtcFJpbmdJbmZvKHN0cnVjdCBodl9yaW5nX2J1ZmZlcl9pbmZvICpSaW5nSW5mbywgY2hhciAqUHJlZml4KTsKK3ZvaWQgZHVtcF9yaW5nX2luZm8oc3RydWN0IGh2X3JpbmdfYnVmZmVyX2luZm8gKnJpbmdfaW5mbywgY2hhciAqcHJlZml4KTsKIAotdm9pZCBSaW5nQnVmZmVyR2V0RGVidWdJbmZvKHN0cnVjdCBodl9yaW5nX2J1ZmZlcl9pbmZvICpSaW5nSW5mbywKK3ZvaWQgcmluZ2J1ZmZlcl9nZXRfZGVidWdpbmZvKHN0cnVjdCBodl9yaW5nX2J1ZmZlcl9pbmZvICpyaW5nX2luZm8sCiAJCQkgICAgc3RydWN0IGh2X3JpbmdfYnVmZmVyX2RlYnVnX2luZm8gKmRlYnVnX2luZm8pOwogCiAjZW5kaWYgLyogX1JJTkdfQlVGRkVSX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaHYvcm5kaXMuaCBiL2RyaXZlcnMvc3RhZ2luZy9odi9ybmRpcy5oCmluZGV4IDcyM2UxZjEuLjAxNGRlMDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9odi9ybmRpcy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9odi9ybmRpcy5oCkBAIC0yODgsMjQgKzI4OCwyNCBAQAogI2RlZmluZSBSTkRJU19ERl9SQVdfREFUQQkJCTB4MDAwMDAwMDQKIAogLyogIFJlbW90ZSBORElTIG1lZGl1bSB0eXBlcy4gKi8KLSNkZWZpbmUgUk5kaXNNZWRpdW04MDJfMwkJCTB4MDAwMDAwMDAKLSNkZWZpbmUgUk5kaXNNZWRpdW04MDJfNQkJCTB4MDAwMDAwMDEKLSNkZWZpbmUgUk5kaXNNZWRpdW1GZGRpCQkJCTB4MDAwMDAwMDIKLSNkZWZpbmUgUk5kaXNNZWRpdW1XYW4JCQkJMHgwMDAwMDAwMwotI2RlZmluZSBSTmRpc01lZGl1bUxvY2FsVGFsawkJCTB4MDAwMDAwMDQKLSNkZWZpbmUgUk5kaXNNZWRpdW1BcmNuZXRSYXcJCQkweDAwMDAwMDA2Ci0jZGVmaW5lIFJOZGlzTWVkaXVtQXJjbmV0ODc4XzIJCQkweDAwMDAwMDA3Ci0jZGVmaW5lIFJOZGlzTWVkaXVtQXRtCQkJCTB4MDAwMDAwMDgKLSNkZWZpbmUgUk5kaXNNZWRpdW1XaXJlbGVzc1dhbgkJCTB4MDAwMDAwMDkKLSNkZWZpbmUgUk5kaXNNZWRpdW1JcmRhCQkJCTB4MDAwMDAwMGEKLSNkZWZpbmUgUk5kaXNNZWRpdW1Db1dhbgkJCTB4MDAwMDAwMGIKKyNkZWZpbmUgUk5ESVNfTUVESVVNXzgwMl8zCQkJMHgwMDAwMDAwMAorI2RlZmluZSBSTkRJU19NRURJVU1fODAyXzUJCQkweDAwMDAwMDAxCisjZGVmaW5lIFJORElTX01FRElVTV9GRERJCQkJCTB4MDAwMDAwMDIKKyNkZWZpbmUgUk5ESVNfTUVESVVNX1dBTgkJCQkweDAwMDAwMDAzCisjZGVmaW5lIFJORElTX01FRElVTV9MT0NBTF9UQUxLCQkJMHgwMDAwMDAwNAorI2RlZmluZSBSTkRJU19NRURJVU1fQVJDTkVUX1JBVwkJCTB4MDAwMDAwMDYKKyNkZWZpbmUgUk5ESVNfTUVESVVNX0FSQ05FVF84NzhfMgkJCTB4MDAwMDAwMDcKKyNkZWZpbmUgUk5ESVNfTUVESVVNX0FUTQkJCQkweDAwMDAwMDA4CisjZGVmaW5lIFJORElTX01FRElVTV9XSVJFTEVTU19XQU4JCQkweDAwMDAwMDA5CisjZGVmaW5lIFJORElTX01FRElVTV9JUkRBCQkJCTB4MDAwMDAwMGEKKyNkZWZpbmUgUk5ESVNfTUVESVVNX0NPX1dBTgkJCTB4MDAwMDAwMGIKIC8qIE5vdCBhIHJlYWwgbWVkaXVtLCBkZWZpbmVkIGFzIGFuIHVwcGVyLWJvdW5kICovCi0jZGVmaW5lIFJOZGlzTWVkaXVtTWF4CQkJCTB4MDAwMDAwMGQKKyNkZWZpbmUgUk5ESVNfTUVESVVNX01BWAkJCQkweDAwMDAwMDBkCiAKIAogLyogUmVtb3RlIE5ESVMgbWVkaXVtIGNvbm5lY3Rpb24gc3RhdGVzLiAqLwotI2RlZmluZSBSTmRpc01lZGlhU3RhdGVDb25uZWN0ZWQJCTB4MDAwMDAwMDAKLSNkZWZpbmUgUk5kaXNNZWRpYVN0YXRlRGlzY29ubmVjdGVkCQkweDAwMDAwMDAxCisjZGVmaW5lIFJORElTX01FRElBX1NUQVRFX0NPTk5FQ1RFRAkJMHgwMDAwMDAwMAorI2RlZmluZSBSTkRJU19NRURJQV9TVEFURV9ESVNDT05ORUNURUQJCTB4MDAwMDAwMDEKIAogLyogIFJlbW90ZSBORElTIHZlcnNpb24gbnVtYmVycyAqLwogI2RlZmluZSBSTkRJU19NQUpPUl9WRVJTSU9OCQkJMHgwMDAwMDAwMQpAQCAtMzE0LDEwNiArMzE0LDEwNiBAQAogCiAvKiBOZGlzSW5pdGlhbGl6ZSBtZXNzYWdlICovCiBzdHJ1Y3Qgcm5kaXNfaW5pdGlhbGl6ZV9yZXF1ZXN0IHsKLQl1MzIgUmVxdWVzdElkOwotCXUzMiBNYWpvclZlcnNpb247Ci0JdTMyIE1pbm9yVmVyc2lvbjsKLQl1MzIgTWF4VHJhbnNmZXJTaXplOworCXUzMiByZXFfaWQ7CisJdTMyIG1ham9yX3ZlcjsKKwl1MzIgbWlub3JfdmVyOworCXUzMiBtYXhfeGZlcl9zaXplOwogfTsKIAogLyogUmVzcG9uc2UgdG8gTmRpc0luaXRpYWxpemUgKi8KIHN0cnVjdCBybmRpc19pbml0aWFsaXplX2NvbXBsZXRlIHsKLQl1MzIgUmVxdWVzdElkOwotCXUzMiBTdGF0dXM7Ci0JdTMyIE1ham9yVmVyc2lvbjsKLQl1MzIgTWlub3JWZXJzaW9uOwotCXUzMiBEZXZpY2VGbGFnczsKLQl1MzIgTWVkaXVtOwotCXUzMiBNYXhQYWNrZXRzUGVyTWVzc2FnZTsKLQl1MzIgTWF4VHJhbnNmZXJTaXplOwotCXUzMiBQYWNrZXRBbGlnbm1lbnRGYWN0b3I7Ci0JdTMyIEFGTGlzdE9mZnNldDsKLQl1MzIgQUZMaXN0U2l6ZTsKKwl1MzIgcmVxX2lkOworCXUzMiBzdGF0dXM7CisJdTMyIG1ham9yX3ZlcjsKKwl1MzIgbWlub3JfdmVyOworCXUzMiBkZXZfZmxhZ3M7CisJdTMyIG1lZGl1bTsKKwl1MzIgbWF4X3BrdF9wZXJfbXNnOworCXUzMiBtYXhfeGZlcl9zaXplOworCXUzMiBwa3RfYWxpZ25tZW50X2ZhY3RvcjsKKwl1MzIgYWZfbGlzdF9vZmZzZXQ7CisJdTMyIGFmX2xpc3Rfc2l6ZTsKIH07CiAKIC8qIENhbGwgbWFuYWdlciBkZXZpY2VzIG9ubHk6IEluZm9ybWF0aW9uIGFib3V0IGFuIGFkZHJlc3MgZmFtaWx5ICovCiAvKiBzdXBwb3J0ZWQgYnkgdGhlIGRldmljZSBpcyBhcHBlbmRlZCB0byB0aGUgcmVzcG9uc2UgdG8gTmRpc0luaXRpYWxpemUuICovCiBzdHJ1Y3Qgcm5kaXNfY29fYWRkcmVzc19mYW1pbHkgewotCXUzMiBBZGRyZXNzRmFtaWx5OwotCXUzMiBNYWpvclZlcnNpb247Ci0JdTMyIE1pbm9yVmVyc2lvbjsKKwl1MzIgYWRkcmVzc19mYW1pbHk7CisJdTMyIG1ham9yX3ZlcjsKKwl1MzIgbWlub3JfdmVyOwogfTsKIAogLyogTmRpc0hhbHQgbWVzc2FnZSAqLwogc3RydWN0IHJuZGlzX2hhbHRfcmVxdWVzdCB7Ci0JdTMyIFJlcXVlc3RJZDsKKwl1MzIgcmVxX2lkOwogfTsKIAogLyogTmRpc1F1ZXJ5UmVxdWVzdCBtZXNzYWdlICovCiBzdHJ1Y3Qgcm5kaXNfcXVlcnlfcmVxdWVzdCB7Ci0JdTMyIFJlcXVlc3RJZDsKLQl1MzIgT2lkOwotCXUzMiBJbmZvcm1hdGlvbkJ1ZmZlckxlbmd0aDsKLQl1MzIgSW5mb3JtYXRpb25CdWZmZXJPZmZzZXQ7Ci0JdTMyIERldmljZVZjSGFuZGxlOworCXUzMiByZXFfaWQ7CisJdTMyIG9pZDsKKwl1MzIgaW5mb19idWZsZW47CisJdTMyIGluZm9fYnVmX29mZnNldDsKKwl1MzIgZGV2X3ZjX2hhbmRsZTsKIH07CiAKIC8qIFJlc3BvbnNlIHRvIE5kaXNRdWVyeVJlcXVlc3QgKi8KIHN0cnVjdCBybmRpc19xdWVyeV9jb21wbGV0ZSB7Ci0JdTMyIFJlcXVlc3RJZDsKLQl1MzIgU3RhdHVzOwotCXUzMiBJbmZvcm1hdGlvbkJ1ZmZlckxlbmd0aDsKLQl1MzIgSW5mb3JtYXRpb25CdWZmZXJPZmZzZXQ7CisJdTMyIHJlcV9pZDsKKwl1MzIgc3RhdHVzOworCXUzMiBpbmZvX2J1ZmxlbjsKKwl1MzIgaW5mb19idWZfb2Zmc2V0OwogfTsKIAogLyogTmRpc1NldFJlcXVlc3QgbWVzc2FnZSAqLwogc3RydWN0IHJuZGlzX3NldF9yZXF1ZXN0IHsKLQl1MzIgUmVxdWVzdElkOwotCXUzMiBPaWQ7Ci0JdTMyIEluZm9ybWF0aW9uQnVmZmVyTGVuZ3RoOwotCXUzMiBJbmZvcm1hdGlvbkJ1ZmZlck9mZnNldDsKLQl1MzIgRGV2aWNlVmNIYW5kbGU7CisJdTMyIHJlcV9pZDsKKwl1MzIgb2lkOworCXUzMiBpbmZvX2J1ZmxlbjsKKwl1MzIgaW5mb19idWZfb2Zmc2V0OworCXUzMiBkZXZfdmNfaGFuZGxlOwogfTsKIAogLyogUmVzcG9uc2UgdG8gTmRpc1NldFJlcXVlc3QgKi8KIHN0cnVjdCBybmRpc19zZXRfY29tcGxldGUgewotCXUzMiBSZXF1ZXN0SWQ7Ci0JdTMyIFN0YXR1czsKKwl1MzIgcmVxX2lkOworCXUzMiBzdGF0dXM7CiB9OwogCiAvKiBOZGlzUmVzZXQgbWVzc2FnZSAqLwogc3RydWN0IHJuZGlzX3Jlc2V0X3JlcXVlc3QgewotCXUzMiBSZXNlcnZlZDsKKwl1MzIgcmVzZXJ2ZWQ7CiB9OwogCiAvKiBSZXNwb25zZSB0byBOZGlzUmVzZXQgKi8KIHN0cnVjdCBybmRpc19yZXNldF9jb21wbGV0ZSB7Ci0JdTMyIFN0YXR1czsKLQl1MzIgQWRkcmVzc2luZ1Jlc2V0OworCXUzMiBzdGF0dXM7CisJdTMyIGFkZHJlc3NpbmdfcmVzZXQ7CiB9OwogCiAvKiBOZGlzTUluZGljYXRlU3RhdHVzIG1lc3NhZ2UgKi8KIHN0cnVjdCBybmRpc19pbmRpY2F0ZV9zdGF0dXMgewotCXUzMiBTdGF0dXM7Ci0JdTMyIFN0YXR1c0J1ZmZlckxlbmd0aDsKLQl1MzIgU3RhdHVzQnVmZmVyT2Zmc2V0OworCXUzMiBzdGF0dXM7CisJdTMyIHN0YXR1c19idWZsZW47CisJdTMyIHN0YXR1c19idWZfb2Zmc2V0OwogfTsKIAogLyogRGlhZ25vc3RpYyBpbmZvcm1hdGlvbiBwYXNzZWQgYXMgdGhlIHN0YXR1cyBidWZmZXIgaW4gKi8KIC8qIHN0cnVjdCBybmRpc19pbmRpY2F0ZV9zdGF0dXMgbWVzc2FnZXMgc2lnbmlmeWluZyBlcnJvciBjb25kaXRpb25zLiAqLwogc3RydWN0IHJuZGlzX2RpYWdub3N0aWNfaW5mbyB7Ci0JdTMyIERpYWdTdGF0dXM7Ci0JdTMyIEVycm9yT2Zmc2V0OworCXUzMiBkaWFnX3N0YXR1czsKKwl1MzIgZXJyb3Jfb2Zmc2V0OwogfTsKIAogLyogTmRpc0tlZXBBbGl2ZSBtZXNzYWdlICovCiBzdHJ1Y3Qgcm5kaXNfa2VlcGFsaXZlX3JlcXVlc3QgewotCXUzMiBSZXF1ZXN0SWQ7CisJdTMyIHJlcV9pZDsKIH07CiAKIC8qIFJlc3BvbnNlIHRvIE5kaXNLZWVwQWxpdmUgKi8KIHN0cnVjdCBybmRpc19rZWVwYWxpdmVfY29tcGxldGUgewotCXUzMiBSZXF1ZXN0SWQ7Ci0JdTMyIFN0YXR1czsKKwl1MzIgcmVxX2lkOworCXUzMiBzdGF0dXM7CiB9OwogCiAvKgpAQCAtNDIyLDM5ICs0MjIsMzkgQEAKICAqIHRvIDAgZm9yIGNvbm5lY3Rpb25sZXNzIGRhdGEsIG90aGVyd2lzZSBpdCBjb250YWlucyB0aGUgVkMgaGFuZGxlLgogICovCiBzdHJ1Y3Qgcm5kaXNfcGFja2V0IHsKLQl1MzIgRGF0YU9mZnNldDsKLQl1MzIgRGF0YUxlbmd0aDsKLQl1MzIgT09CRGF0YU9mZnNldDsKLQl1MzIgT09CRGF0YUxlbmd0aDsKLQl1MzIgTnVtT09CRGF0YUVsZW1lbnRzOwotCXUzMiBQZXJQYWNrZXRJbmZvT2Zmc2V0OwotCXUzMiBQZXJQYWNrZXRJbmZvTGVuZ3RoOwotCXUzMiBWY0hhbmRsZTsKLQl1MzIgUmVzZXJ2ZWQ7CisJdTMyIGRhdGFfb2Zmc2V0OworCXUzMiBkYXRhX2xlbjsKKwl1MzIgb29iX2RhdGFfb2Zmc2V0OworCXUzMiBvb2JfZGF0YV9sZW47CisJdTMyIG51bV9vb2JfZGF0YV9lbGVtZW50czsKKwl1MzIgcGVyX3BrdF9pbmZvX29mZnNldDsKKwl1MzIgcGVyX3BrdF9pbmZvX2xlbjsKKwl1MzIgdmNfaGFuZGxlOworCXUzMiByZXNlcnZlZDsKIH07CiAKIC8qIE9wdGlvbmFsIE91dCBvZiBCYW5kIGRhdGEgYXNzb2NpYXRlZCB3aXRoIGEgRGF0YSBtZXNzYWdlLiAqLwogc3RydWN0IHJuZGlzX29vYmQgewotCXUzMiBTaXplOwotCXUzMiBUeXBlOwotCXUzMiBDbGFzc0luZm9ybWF0aW9uT2Zmc2V0OworCXUzMiBzaXplOworCXUzMiB0eXBlOworCXUzMiBjbGFzc19pbmZvX29mZnNldDsKIH07CiAKIC8qIFBhY2tldCBleHRlbnNpb24gZmllbGQgY29udGVudHMgYXNzb2NpYXRlZCB3aXRoIGEgRGF0YSBtZXNzYWdlLiAqLwogc3RydWN0IHJuZGlzX3Blcl9wYWNrZXRfaW5mbyB7Ci0JdTMyIFNpemU7Ci0JdTMyIFR5cGU7Ci0JdTMyIFBlclBhY2tldEluZm9ybWF0aW9uT2Zmc2V0OworCXUzMiBzaXplOworCXUzMiB0eXBlOworCXUzMiBwZXJfcGt0X2luZm9fb2Zmc2V0OwogfTsKIAogLyogRm9ybWF0IG9mIEluZm9ybWF0aW9uIGJ1ZmZlciBwYXNzZWQgaW4gYSBTZXRSZXF1ZXN0IGZvciB0aGUgT0lEICovCiAvKiBPSURfR0VOX1JORElTX0NPTkZJR19QQVJBTUVURVIuICovCiBzdHJ1Y3Qgcm5kaXNfY29uZmlnX3BhcmFtZXRlcl9pbmZvIHsKLQl1MzIgUGFyYW1ldGVyTmFtZU9mZnNldDsKLQl1MzIgUGFyYW1ldGVyTmFtZUxlbmd0aDsKLQl1MzIgUGFyYW1ldGVyVHlwZTsKLQl1MzIgUGFyYW1ldGVyVmFsdWVPZmZzZXQ7Ci0JdTMyIFBhcmFtZXRlclZhbHVlTGVuZ3RoOworCXUzMiBwYXJhbWV0ZXJfbmFtZV9vZmZzZXQ7CisJdTMyIHBhcmFtZXRlcl9uYW1lX2xlbmd0aDsKKwl1MzIgcGFyYW1ldGVyX3R5cGU7CisJdTMyIHBhcmFtZXRlcl92YWx1ZV9vZmZzZXQ7CisJdTMyIHBhcmFtZXRlcl92YWx1ZV9sZW5ndGg7CiB9OwogCiAvKiBWYWx1ZXMgZm9yIFBhcmFtZXRlclR5cGUgaW4gc3RydWN0IHJuZGlzX2NvbmZpZ19wYXJhbWV0ZXJfaW5mbyAqLwpAQCAtNDY2LDE4NyArNDY2LDE4OCBAQAogCiAvKiBDb05kaXNNaW5pcG9ydENyZWF0ZVZjIG1lc3NhZ2UgKi8KIHN0cnVjdCByY29uZGlzX21wX2NyZWF0ZV92YyB7Ci0JdTMyIFJlcXVlc3RJZDsKLQl1MzIgTmRpc1ZjSGFuZGxlOworCXUzMiByZXFfaWQ7CisJdTMyIG5kaXNfdmNfaGFuZGxlOwogfTsKIAogLyogUmVzcG9uc2UgdG8gQ29OZGlzTWluaXBvcnRDcmVhdGVWYyAqLwogc3RydWN0IHJjb25kaXNfbXBfY3JlYXRlX3ZjX2NvbXBsZXRlIHsKLQl1MzIgUmVxdWVzdElkOwotCXUzMiBEZXZpY2VWY0hhbmRsZTsKLQl1MzIgU3RhdHVzOworCXUzMiByZXFfaWQ7CisJdTMyIGRldl92Y19oYW5kbGU7CisJdTMyIHN0YXR1czsKIH07CiAKIC8qIENvTmRpc01pbmlwb3J0RGVsZXRlVmMgbWVzc2FnZSAqLwogc3RydWN0IHJjb25kaXNfbXBfZGVsZXRlX3ZjIHsKLQl1MzIgUmVxdWVzdElkOwotCXUzMiBEZXZpY2VWY0hhbmRsZTsKKwl1MzIgcmVxX2lkOworCXUzMiBkZXZfdmNfaGFuZGxlOwogfTsKIAogLyogUmVzcG9uc2UgdG8gQ29OZGlzTWluaXBvcnREZWxldGVWYyAqLwogc3RydWN0IHJjb25kaXNfbXBfZGVsZXRlX3ZjX2NvbXBsZXRlIHsKLQl1MzIgUmVxdWVzdElkOwotCXUzMiBTdGF0dXM7CisJdTMyIHJlcV9pZDsKKwl1MzIgc3RhdHVzOwogfTsKIAogLyogQ29OZGlzTWluaXBvcnRRdWVyeVJlcXVlc3QgbWVzc2FnZSAqLwogc3RydWN0IHJjb25kaXNfbXBfcXVlcnlfcmVxdWVzdCB7Ci0JdTMyIFJlcXVlc3RJZDsKLQl1MzIgUmVxdWVzdFR5cGU7Ci0JdTMyIE9pZDsKLQl1MzIgRGV2aWNlVmNIYW5kbGU7Ci0JdTMyIEluZm9ybWF0aW9uQnVmZmVyTGVuZ3RoOwotCXUzMiBJbmZvcm1hdGlvbkJ1ZmZlck9mZnNldDsKKwl1MzIgcmVxX2lkOworCXUzMiByZXF1ZXN0X3R5cGU7CisJdTMyIG9pZDsKKwl1MzIgZGV2X3ZjX2hhbmRsZTsKKwl1MzIgaW5mb19idWZsZW47CisJdTMyIGluZm9fYnVmX29mZnNldDsKIH07CiAKIC8qIENvTmRpc01pbmlwb3J0U2V0UmVxdWVzdCBtZXNzYWdlICovCiBzdHJ1Y3QgcmNvbmRpc19tcF9zZXRfcmVxdWVzdCB7Ci0JdTMyIFJlcXVlc3RJZDsKLQl1MzIgUmVxdWVzdFR5cGU7Ci0JdTMyIE9pZDsKLQl1MzIgRGV2aWNlVmNIYW5kbGU7Ci0JdTMyIEluZm9ybWF0aW9uQnVmZmVyTGVuZ3RoOwotCXUzMiBJbmZvcm1hdGlvbkJ1ZmZlck9mZnNldDsKKwl1MzIgcmVxX2lkOworCXUzMiByZXF1ZXN0X3R5cGU7CisJdTMyIG9pZDsKKwl1MzIgZGV2X3ZjX2hhbmRsZTsKKwl1MzIgaW5mb19idWZsZW47CisJdTMyIGluZm9fYnVmX29mZnNldDsKIH07CiAKIC8qIENvTmRpc0luZGljYXRlU3RhdHVzIG1lc3NhZ2UgKi8KIHN0cnVjdCByY29uZGlzX2luZGljYXRlX3N0YXR1cyB7Ci0JdTMyIE5kaXNWY0hhbmRsZTsKLQl1MzIgU3RhdHVzOwotCXUzMiBTdGF0dXNCdWZmZXJMZW5ndGg7Ci0JdTMyIFN0YXR1c0J1ZmZlck9mZnNldDsKKwl1MzIgbmRpc192Y19oYW5kbGU7CisJdTMyIHN0YXR1czsKKwl1MzIgc3RhdHVzX2J1ZmxlbjsKKwl1MzIgc3RhdHVzX2J1Zl9vZmZzZXQ7CiB9OwogCiAvKiBDT05ESVMgQ2FsbC9WQyBwYXJhbWV0ZXJzICovCiBzdHJ1Y3QgcmNvbmRpc19zcGVjaWZpY19wYXJhbWV0ZXJzIHsKLQl1MzIgUGFyYW1ldGVyVHlwZTsKLQl1MzIgUGFyYW1ldGVyTGVuZ3RoOwotCXUzMiBQYXJhbWV0ZXJPZmZzZXQ7CisJdTMyIHBhcmFtZXRlcl90eXBlOworCXUzMiBwYXJhbWV0ZXJfbGVuZ3RoOworCXUzMiBwYXJhbWV0ZXJfbGZmc2V0OwogfTsKIAogc3RydWN0IHJjb25kaXNfbWVkaWFfcGFyYW1ldGVycyB7Ci0JdTMyIEZsYWdzOwotCXUzMiBSZXNlcnZlZDE7Ci0JdTMyIFJlc2VydmVkMjsKLQlzdHJ1Y3QgcmNvbmRpc19zcGVjaWZpY19wYXJhbWV0ZXJzIE1lZGlhU3BlY2lmaWM7CisJdTMyIGZsYWdzOworCXUzMiByZXNlcnZlZDE7CisJdTMyIHJlc2VydmVkMjsKKwlzdHJ1Y3QgcmNvbmRpc19zcGVjaWZpY19wYXJhbWV0ZXJzIG1lZGlhX3NwZWNpZmljOwogfTsKIAogc3RydWN0IHJuZGlzX2Zsb3dzcGVjIHsKLQl1MzIgVG9rZW5SYXRlOwotCXUzMiBUb2tlbkJ1Y2tldFNpemU7Ci0JdTMyIFBlYWtCYW5kd2lkdGg7Ci0JdTMyIExhdGVuY3k7Ci0JdTMyIERlbGF5VmFyaWF0aW9uOwotCXUzMiBTZXJ2aWNlVHlwZTsKLQl1MzIgTWF4U2R1U2l6ZTsKLQl1MzIgTWluaW11bVBvbGljZWRTaXplOworCXUzMiB0b2tlbl9yYXRlOworCXUzMiB0b2tlbl9idWNrZXRfc2l6ZTsKKwl1MzIgcGVha19iYW5kd2lkdGg7CisJdTMyIGxhdGVuY3k7CisJdTMyIGRlbGF5X3ZhcmlhdGlvbjsKKwl1MzIgc2VydmljZV90eXBlOworCXUzMiBtYXhfc2R1X3NpemU7CisJdTMyIG1pbmltdW1fcG9saWNlZF9zaXplOwogfTsKIAogc3RydWN0IHJjb25kaXNfY2FsbF9tYW5hZ2VyX3BhcmFtZXRlcnMgewotCXN0cnVjdCBybmRpc19mbG93c3BlYyBUcmFuc21pdDsKLQlzdHJ1Y3Qgcm5kaXNfZmxvd3NwZWMgUmVjZWl2ZTsKLQlzdHJ1Y3QgcmNvbmRpc19zcGVjaWZpY19wYXJhbWV0ZXJzIENhbGxNZ3JTcGVjaWZpYzsKKwlzdHJ1Y3Qgcm5kaXNfZmxvd3NwZWMgdHJhbnNtaXQ7CisJc3RydWN0IHJuZGlzX2Zsb3dzcGVjIHJlY2VpdmU7CisJc3RydWN0IHJjb25kaXNfc3BlY2lmaWNfcGFyYW1ldGVycyBjYWxsX21ncl9zcGVjaWZpYzsKIH07CiAKIC8qIENvTmRpc01pbmlwb3J0QWN0aXZhdGVWYyBtZXNzYWdlICovCiBzdHJ1Y3QgcmNvbmRpc19tcF9hY3RpdmF0ZV92Y19yZXF1ZXN0IHsKLQl1MzIgUmVxdWVzdElkOwotCXUzMiBGbGFnczsKLQl1MzIgRGV2aWNlVmNIYW5kbGU7Ci0JdTMyIE1lZGlhUGFyYW1zT2Zmc2V0OwotCXUzMiBNZWRpYVBhcmFtc0xlbmd0aDsKLQl1MzIgQ2FsbE1nclBhcmFtc09mZnNldDsKLQl1MzIgQ2FsbE1nclBhcmFtc0xlbmd0aDsKKwl1MzIgcmVxX2lkOworCXUzMiBmbGFnczsKKwl1MzIgZGV2X3ZjX2hhbmRsZTsKKwl1MzIgbWVkaWFfcGFyYW1zX29mZnNldDsKKwl1MzIgbWVkaWFfcGFyYW1zX2xlbmd0aDsKKwl1MzIgY2FsbF9tZ3JfcGFyYW1zX29mZnNldDsKKwl1MzIgY2FsbF9tZ3JfcGFyYW1zX2xlbmd0aDsKIH07CiAKIC8qIFJlc3BvbnNlIHRvIENvTmRpc01pbmlwb3J0QWN0aXZhdGVWYyAqLwogc3RydWN0IHJjb25kaXNfbXBfYWN0aXZhdGVfdmNfY29tcGxldGUgewotCXUzMiBSZXF1ZXN0SWQ7Ci0JdTMyIFN0YXR1czsKKwl1MzIgcmVxX2lkOworCXUzMiBzdGF0dXM7CiB9OwogCiAvKiBDb05kaXNNaW5pcG9ydERlYWN0aXZhdGVWYyBtZXNzYWdlICovCiBzdHJ1Y3QgcmNvbmRpc19tcF9kZWFjdGl2YXRlX3ZjX3JlcXVlc3QgewotCXUzMiBSZXF1ZXN0SWQ7Ci0JdTMyIEZsYWdzOwotCXUzMiBEZXZpY2VWY0hhbmRsZTsKKwl1MzIgcmVxX2lkOworCXUzMiBmbGFnczsKKwl1MzIgZGV2X3ZjX2hhbmRsZTsKIH07CiAKIC8qIFJlc3BvbnNlIHRvIENvTmRpc01pbmlwb3J0RGVhY3RpdmF0ZVZjICovCiBzdHJ1Y3QgcmNvbmRpc19tcF9kZWFjdGl2YXRlX3ZjX2NvbXBsZXRlIHsKLQl1MzIgUmVxdWVzdElkOwotCXUzMiBTdGF0dXM7CisJdTMyIHJlcV9pZDsKKwl1MzIgc3RhdHVzOwogfTsKIAogCiAvKiB1bmlvbiB3aXRoIGFsbCBvZiB0aGUgUk5ESVMgbWVzc2FnZXMgKi8KIHVuaW9uIHJuZGlzX21lc3NhZ2VfY29udGFpbmVyIHsKLQlzdHJ1Y3Qgcm5kaXNfcGFja2V0IFBhY2tldDsKLQlzdHJ1Y3Qgcm5kaXNfaW5pdGlhbGl6ZV9yZXF1ZXN0IEluaXRpYWxpemVSZXF1ZXN0OwotCXN0cnVjdCBybmRpc19oYWx0X3JlcXVlc3QgSGFsdFJlcXVlc3Q7Ci0Jc3RydWN0IHJuZGlzX3F1ZXJ5X3JlcXVlc3QgUXVlcnlSZXF1ZXN0OwotCXN0cnVjdCBybmRpc19zZXRfcmVxdWVzdCBTZXRSZXF1ZXN0OwotCXN0cnVjdCBybmRpc19yZXNldF9yZXF1ZXN0IFJlc2V0UmVxdWVzdDsKLQlzdHJ1Y3Qgcm5kaXNfa2VlcGFsaXZlX3JlcXVlc3QgS2VlcGFsaXZlUmVxdWVzdDsKLQlzdHJ1Y3Qgcm5kaXNfaW5kaWNhdGVfc3RhdHVzIEluZGljYXRlU3RhdHVzOwotCXN0cnVjdCBybmRpc19pbml0aWFsaXplX2NvbXBsZXRlIEluaXRpYWxpemVDb21wbGV0ZTsKLQlzdHJ1Y3Qgcm5kaXNfcXVlcnlfY29tcGxldGUgUXVlcnlDb21wbGV0ZTsKLQlzdHJ1Y3Qgcm5kaXNfc2V0X2NvbXBsZXRlIFNldENvbXBsZXRlOwotCXN0cnVjdCBybmRpc19yZXNldF9jb21wbGV0ZSBSZXNldENvbXBsZXRlOwotCXN0cnVjdCBybmRpc19rZWVwYWxpdmVfY29tcGxldGUgS2VlcGFsaXZlQ29tcGxldGU7Ci0Jc3RydWN0IHJjb25kaXNfbXBfY3JlYXRlX3ZjIENvTWluaXBvcnRDcmVhdGVWYzsKLQlzdHJ1Y3QgcmNvbmRpc19tcF9kZWxldGVfdmMgQ29NaW5pcG9ydERlbGV0ZVZjOwotCXN0cnVjdCByY29uZGlzX2luZGljYXRlX3N0YXR1cyBDb0luZGljYXRlU3RhdHVzOwotCXN0cnVjdCByY29uZGlzX21wX2FjdGl2YXRlX3ZjX3JlcXVlc3QgQ29NaW5pcG9ydEFjdGl2YXRlVmM7Ci0Jc3RydWN0IHJjb25kaXNfbXBfZGVhY3RpdmF0ZV92Y19yZXF1ZXN0IENvTWluaXBvcnREZWFjdGl2YXRlVmM7Ci0Jc3RydWN0IHJjb25kaXNfbXBfY3JlYXRlX3ZjX2NvbXBsZXRlIENvTWluaXBvcnRDcmVhdGVWY0NvbXBsZXRlOwotCXN0cnVjdCByY29uZGlzX21wX2RlbGV0ZV92Y19jb21wbGV0ZSBDb01pbmlwb3J0RGVsZXRlVmNDb21wbGV0ZTsKLQlzdHJ1Y3QgcmNvbmRpc19tcF9hY3RpdmF0ZV92Y19jb21wbGV0ZSBDb01pbmlwb3J0QWN0aXZhdGVWY0NvbXBsZXRlOwotCXN0cnVjdCByY29uZGlzX21wX2RlYWN0aXZhdGVfdmNfY29tcGxldGUgQ29NaW5pcG9ydERlYWN0aXZhdGVWY0NvbXBsZXRlOworCXN0cnVjdCBybmRpc19wYWNrZXQgcGt0OworCXN0cnVjdCBybmRpc19pbml0aWFsaXplX3JlcXVlc3QgaW5pdF9yZXE7CisJc3RydWN0IHJuZGlzX2hhbHRfcmVxdWVzdCBoYWx0X3JlcTsKKwlzdHJ1Y3Qgcm5kaXNfcXVlcnlfcmVxdWVzdCBxdWVyeV9yZXE7CisJc3RydWN0IHJuZGlzX3NldF9yZXF1ZXN0IHNldF9yZXE7CisJc3RydWN0IHJuZGlzX3Jlc2V0X3JlcXVlc3QgcmVzZXRfcmVxOworCXN0cnVjdCBybmRpc19rZWVwYWxpdmVfcmVxdWVzdCBrZWVwX2FsaXZlX3JlcTsKKwlzdHJ1Y3Qgcm5kaXNfaW5kaWNhdGVfc3RhdHVzIGluZGljYXRlX3N0YXR1czsKKwlzdHJ1Y3Qgcm5kaXNfaW5pdGlhbGl6ZV9jb21wbGV0ZSBpbml0X2NvbXBsZXRlOworCXN0cnVjdCBybmRpc19xdWVyeV9jb21wbGV0ZSBxdWVyeV9jb21wbGV0ZTsKKwlzdHJ1Y3Qgcm5kaXNfc2V0X2NvbXBsZXRlIHNldF9jb21wbGV0ZTsKKwlzdHJ1Y3Qgcm5kaXNfcmVzZXRfY29tcGxldGUgcmVzZXRfY29tcGxldGU7CisJc3RydWN0IHJuZGlzX2tlZXBhbGl2ZV9jb21wbGV0ZSBrZWVwX2FsaXZlX2NvbXBsZXRlOworCXN0cnVjdCByY29uZGlzX21wX2NyZWF0ZV92YyBjb19taW5pcG9ydF9jcmVhdGVfdmM7CisJc3RydWN0IHJjb25kaXNfbXBfZGVsZXRlX3ZjIGNvX21pbmlwb3J0X2RlbGV0ZV92YzsKKwlzdHJ1Y3QgcmNvbmRpc19pbmRpY2F0ZV9zdGF0dXMgY29faW5kaWNhdGVfc3RhdHVzOworCXN0cnVjdCByY29uZGlzX21wX2FjdGl2YXRlX3ZjX3JlcXVlc3QgY29fbWluaXBvcnRfYWN0aXZhdGVfdmM7CisJc3RydWN0IHJjb25kaXNfbXBfZGVhY3RpdmF0ZV92Y19yZXF1ZXN0IGNvX21pbmlwb3J0X2RlYWN0aXZhdGVfdmM7CisJc3RydWN0IHJjb25kaXNfbXBfY3JlYXRlX3ZjX2NvbXBsZXRlIGNvX21pbmlwb3J0X2NyZWF0ZV92Y19jb21wbGV0ZTsKKwlzdHJ1Y3QgcmNvbmRpc19tcF9kZWxldGVfdmNfY29tcGxldGUgY29fbWluaXBvcnRfZGVsZXRlX3ZjX2NvbXBsZXRlOworCXN0cnVjdCByY29uZGlzX21wX2FjdGl2YXRlX3ZjX2NvbXBsZXRlIGNvX21pbmlwb3J0X2FjdGl2YXRlX3ZjX2NvbXBsZXRlOworCXN0cnVjdCByY29uZGlzX21wX2RlYWN0aXZhdGVfdmNfY29tcGxldGUKKwkJY29fbWluaXBvcnRfZGVhY3RpdmF0ZV92Y19jb21wbGV0ZTsKIH07CiAKIC8qIFJlbW90ZSBORElTIG1lc3NhZ2UgZm9ybWF0ICovCiBzdHJ1Y3Qgcm5kaXNfbWVzc2FnZSB7Ci0JdTMyIE5kaXNNZXNzYWdlVHlwZTsKKwl1MzIgbmRpc19tc2dfdHlwZTsKIAogCS8qIFRvdGFsIGxlbmd0aCBvZiB0aGlzIG1lc3NhZ2UsIGZyb20gdGhlIGJlZ2lubmluZyAqLwogCS8qIG9mIHRoZSBzcnVjdCBybmRpc19tZXNzYWdlLCBpbiBieXRlcy4gKi8KLQl1MzIgTWVzc2FnZUxlbmd0aDsKKwl1MzIgbXNnX2xlbjsKIAogCS8qIEFjdHVhbCBtZXNzYWdlICovCi0JdW5pb24gcm5kaXNfbWVzc2FnZV9jb250YWluZXIgTWVzc2FnZTsKKwl1bmlvbiBybmRpc19tZXNzYWdlX2NvbnRhaW5lciBtc2c7CiB9OwogCiAvKiBIYW5keSBtYWNyb3MgKi8KIAogLyogZ2V0IHRoZSBzaXplIG9mIGFuIFJORElTIG1lc3NhZ2UuIFBhc3MgaW4gdGhlIG1lc3NhZ2UgdHlwZSwgKi8KIC8qIHN0cnVjdCBybmRpc19zZXRfcmVxdWVzdCwgc3RydWN0IHJuZGlzX3BhY2tldCBmb3IgZXhhbXBsZSAqLwotI2RlZmluZSBSTkRJU19NRVNTQUdFX1NJWkUoTWVzc2FnZSkJCQkJXAotCShzaXplb2YoTWVzc2FnZSkgKyAoc2l6ZW9mKHN0cnVjdCBybmRpc19tZXNzYWdlKSAtCVwKKyNkZWZpbmUgUk5ESVNfTUVTU0FHRV9TSVpFKG1zZykJCQkJXAorCShzaXplb2YobXNnKSArIChzaXplb2Yoc3RydWN0IHJuZGlzX21lc3NhZ2UpIC0JXAogCSBzaXplb2YodW5pb24gcm5kaXNfbWVzc2FnZV9jb250YWluZXIpKSkKIAogLyogZ2V0IHBvaW50ZXIgdG8gaW5mbyBidWZmZXIgd2l0aCBtZXNzYWdlIHBvaW50ZXIgKi8KLSNkZWZpbmUgTUVTU0FHRV9UT19JTkZPX0JVRkZFUihNZXNzYWdlKQkJCQlcCi0JKCgodW5zaWduZWQgY2hhciAqKShNZXNzYWdlKSkgKyBNZXNzYWdlLT5JbmZvcm1hdGlvbkJ1ZmZlck9mZnNldCkKKyNkZWZpbmUgTUVTU0FHRV9UT19JTkZPX0JVRkZFUihtc2cpCQkJCVwKKwkoKCh1bnNpZ25lZCBjaGFyICopKG1zZykpICsgbXNnLT5pbmZvX2J1Zl9vZmZzZXQpCiAKIC8qIGdldCBwb2ludGVyIHRvIHN0YXR1cyBidWZmZXIgd2l0aCBtZXNzYWdlIHBvaW50ZXIgKi8KLSNkZWZpbmUgTUVTU0FHRV9UT19TVEFUVVNfQlVGRkVSKE1lc3NhZ2UpCQkJXAotCSgoKHVuc2lnbmVkIGNoYXIgKikoTWVzc2FnZSkpICsgTWVzc2FnZS0+U3RhdHVzQnVmZmVyT2Zmc2V0KQorI2RlZmluZSBNRVNTQUdFX1RPX1NUQVRVU19CVUZGRVIobXNnKQkJCVwKKwkoKCh1bnNpZ25lZCBjaGFyICopKG1zZykpICsgbXNnLT5zdGF0dXNfYnVmX29mZnNldCkKIAogLyogZ2V0IHBvaW50ZXIgdG8gT09CRCBidWZmZXIgd2l0aCBtZXNzYWdlIHBvaW50ZXIgKi8KLSNkZWZpbmUgTUVTU0FHRV9UT19PT0JEX0JVRkZFUihNZXNzYWdlKQkJCQlcCi0JKCgodW5zaWduZWQgY2hhciAqKShNZXNzYWdlKSkgKyBNZXNzYWdlLT5PT0JEYXRhT2Zmc2V0KQorI2RlZmluZSBNRVNTQUdFX1RPX09PQkRfQlVGRkVSKG1zZykJCQkJXAorCSgoKHVuc2lnbmVkIGNoYXIgKikobXNnKSkgKyBtc2ctPm9vYl9kYXRhX29mZnNldCkKIAogLyogZ2V0IHBvaW50ZXIgdG8gZGF0YSBidWZmZXIgd2l0aCBtZXNzYWdlIHBvaW50ZXIgKi8KLSNkZWZpbmUgTUVTU0FHRV9UT19EQVRBX0JVRkZFUihNZXNzYWdlKQkJCQlcCi0JKCgodW5zaWduZWQgY2hhciAqKShNZXNzYWdlKSkgKyBNZXNzYWdlLT5QZXJQYWNrZXRJbmZvT2Zmc2V0KQorI2RlZmluZSBNRVNTQUdFX1RPX0RBVEFfQlVGRkVSKG1zZykJCQkJXAorCSgoKHVuc2lnbmVkIGNoYXIgKikobXNnKSkgKyBtc2ctPnBlcl9wa3RfaW5mb19vZmZzZXQpCiAKIC8qIGdldCBwb2ludGVyIHRvIGNvbnRhaW5lZCBtZXNzYWdlIGZyb20gTkRJU19NRVNTQUdFIHBvaW50ZXIgKi8KLSNkZWZpbmUgUk5ESVNfTUVTU0FHRV9QVFJfVE9fTUVTU0FHRV9QVFIoUm5kaXNNZXNzYWdlKQkJXAotCSgodm9pZCAqKSAmUm5kaXNNZXNzYWdlLT5NZXNzYWdlKQorI2RlZmluZSBSTkRJU19NRVNTQUdFX1BUUl9UT19NRVNTQUdFX1BUUihybmRpc19tc2cpCQlcCisJKCh2b2lkICopICZybmRpc19tc2ctPm1zZykKIAogLyogZ2V0IHBvaW50ZXIgdG8gY29udGFpbmVkIG1lc3NhZ2UgZnJvbSBORElTX01FU1NBR0UgcG9pbnRlciAqLwotI2RlZmluZSBSTkRJU19NRVNTQUdFX1JBV19QVFJfVE9fTUVTU0FHRV9QVFIoUm5kaXNNZXNzYWdlKQlcCi0JKCh2b2lkICopIFJuZGlzTWVzc2FnZSkKKyNkZWZpbmUgUk5ESVNfTUVTU0FHRV9SQVdfUFRSX1RPX01FU1NBR0VfUFRSKHJuZGlzX21zZykJXAorCSgodm9pZCAqKSBybmRpc19tc2cpCiAKICNlbmRpZiAvKiBfUk5ESVNfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9odi9ybmRpc19maWx0ZXIuYyBiL2RyaXZlcnMvc3RhZ2luZy9odi9ybmRpc19maWx0ZXIuYwppbmRleCBmYTIxNDFmLi41MzY3NmRjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaHYvcm5kaXNfZmlsdGVyLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2h2L3JuZGlzX2ZpbHRlci5jCkBAIC0zMiw3ICszMiw3IEBACiAvKiBEYXRhIHR5cGVzICovCiBzdHJ1Y3Qgcm5kaXNfZmlsdGVyX2RyaXZlcl9vYmplY3QgewogCS8qIFRoZSBvcmlnaW5hbCBkcml2ZXIgKi8KLQlzdHJ1Y3QgbmV0dnNjX2RyaXZlciBJbm5lckRyaXZlcjsKKwlzdHJ1Y3QgbmV0dnNjX2RyaXZlciBpbm5lcl9kcnY7CiB9OwogCiBlbnVtIHJuZGlzX2RldmljZV9zdGF0ZSB7CkBAIC00Myw2MyArNDMsNjMgQEAKIH07CiAKIHN0cnVjdCBybmRpc19kZXZpY2UgewotCXN0cnVjdCBuZXR2c2NfZGV2aWNlICpOZXREZXZpY2U7CisJc3RydWN0IG5ldHZzY19kZXZpY2UgKm5ldF9kZXY7CiAKLQllbnVtIHJuZGlzX2RldmljZV9zdGF0ZSBTdGF0ZTsKLQl1MzIgTGlua1N0YXR1czsKLQlhdG9taWNfdCBOZXdSZXF1ZXN0SWQ7CisJZW51bSBybmRpc19kZXZpY2Vfc3RhdGUgc3RhdGU7CisJdTMyIGxpbmtfc3RhdDsKKwlhdG9taWNfdCBuZXdfcmVxX2lkOwogCiAJc3BpbmxvY2tfdCByZXF1ZXN0X2xvY2s7Ci0Jc3RydWN0IGxpc3RfaGVhZCBSZXF1ZXN0TGlzdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHJlcV9saXN0OwogCi0JdW5zaWduZWQgY2hhciBId01hY0FkZHJbRVRIX0FMRU5dOworCXVuc2lnbmVkIGNoYXIgaHdfbWFjX2FkcltFVEhfQUxFTl07CiB9OwogCiBzdHJ1Y3Qgcm5kaXNfcmVxdWVzdCB7Ci0Jc3RydWN0IGxpc3RfaGVhZCBMaXN0RW50cnk7Ci0Jc3RydWN0IG9zZF93YWl0ZXZlbnQgKldhaXRFdmVudDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3RfZW50OworCXN0cnVjdCBvc2Rfd2FpdGV2ZW50ICp3YWl0ZXZlbnQ7CiAKIAkvKgogCSAqIEZJWE1FOiBXZSBhc3N1bWVkIGEgZml4ZWQgc2l6ZSByZXNwb25zZSBoZXJlLiBJZiB3ZSBkbyBldmVyIG5lZWQgdG8KIAkgKiBoYW5kbGUgYSBiaWdnZXIgcmVzcG9uc2UsIHdlIGNhbiBlaXRoZXIgZGVmaW5lIGEgbWF4IHJlc3BvbnNlCiAJICogbWVzc2FnZSBvciBhZGQgYSByZXNwb25zZSBidWZmZXIgdmFyaWFibGUgYWJvdmUgdGhpcyBmaWVsZAogCSAqLwotCXN0cnVjdCBybmRpc19tZXNzYWdlIFJlc3BvbnNlTWVzc2FnZTsKKwlzdHJ1Y3Qgcm5kaXNfbWVzc2FnZSByZXNwb25zZV9tc2c7CiAKIAkvKiBTaW1wbGlmeSBhbGxvY2F0aW9uIGJ5IGhhdmluZyBhIG5ldHZzYyBwYWNrZXQgaW5saW5lICovCi0Jc3RydWN0IGh2X25ldHZzY19wYWNrZXQJUGFja2V0OwotCXN0cnVjdCBodl9wYWdlX2J1ZmZlciBCdWZmZXI7CisJc3RydWN0IGh2X25ldHZzY19wYWNrZXQJcGt0OworCXN0cnVjdCBodl9wYWdlX2J1ZmZlciBidWY7CiAJLyogRklYTUU6IFdlIGFzc3VtZWQgYSBmaXhlZCBzaXplIHJlcXVlc3QgaGVyZS4gKi8KLQlzdHJ1Y3Qgcm5kaXNfbWVzc2FnZSBSZXF1ZXN0TWVzc2FnZTsKKwlzdHJ1Y3Qgcm5kaXNfbWVzc2FnZSByZXF1ZXN0X21zZzsKIH07CiAKIAogc3RydWN0IHJuZGlzX2ZpbHRlcl9wYWNrZXQgewotCXZvaWQgKkNvbXBsZXRpb25Db250ZXh0OwotCXZvaWQgKCpPbkNvbXBsZXRpb24pKHZvaWQgKmNvbnRleHQpOwotCXN0cnVjdCBybmRpc19tZXNzYWdlIE1lc3NhZ2U7CisJdm9pZCAqY29tcGxldGlvbl9jdHg7CisJdm9pZCAoKmNvbXBsZXRpb24pKHZvaWQgKmNvbnRleHQpOworCXN0cnVjdCBybmRpc19tZXNzYWdlIG1zZzsKIH07CiAKIAotc3RhdGljIGludCBSbmRpc0ZpbHRlck9uRGV2aWNlQWRkKHN0cnVjdCBodl9kZXZpY2UgKkRldmljZSwKLQkJCQkgIHZvaWQgKkFkZGl0aW9uYWxJbmZvKTsKK3N0YXRpYyBpbnQgcm5kaXNfZmlsdGVfZGV2aWNlX2FkZChzdHJ1Y3QgaHZfZGV2aWNlICpkZXYsCisJCQkJICB2b2lkICphZGRpdGlvbmFsX2luZm8pOwogCi1zdGF0aWMgaW50IFJuZGlzRmlsdGVyT25EZXZpY2VSZW1vdmUoc3RydWN0IGh2X2RldmljZSAqRGV2aWNlKTsKK3N0YXRpYyBpbnQgcm5kaXNfZmlsdGVyX2RldmljZV9yZW1vdmUoc3RydWN0IGh2X2RldmljZSAqZGV2KTsKIAotc3RhdGljIHZvaWQgUm5kaXNGaWx0ZXJPbkNsZWFudXAoc3RydWN0IGh2X2RyaXZlciAqRHJpdmVyKTsKK3N0YXRpYyB2b2lkIHJuZGlzX2ZpbHRlcl9jbGVhbnVwKHN0cnVjdCBodl9kcml2ZXIgKmRydik7CiAKLXN0YXRpYyBpbnQgUm5kaXNGaWx0ZXJPblNlbmQoc3RydWN0IGh2X2RldmljZSAqRGV2aWNlLAotCQkJICAgICBzdHJ1Y3QgaHZfbmV0dnNjX3BhY2tldCAqUGFja2V0KTsKK3N0YXRpYyBpbnQgcm5kaXNfZmlsdGVyX3NlbmQoc3RydWN0IGh2X2RldmljZSAqZGV2LAorCQkJICAgICBzdHJ1Y3QgaHZfbmV0dnNjX3BhY2tldCAqcGt0KTsKIAotc3RhdGljIHZvaWQgUm5kaXNGaWx0ZXJPblNlbmRDb21wbGV0aW9uKHZvaWQgKkNvbnRleHQpOworc3RhdGljIHZvaWQgcm5kaXNfZmlsdGVyX3NlbmRfY29tcGxldGlvbih2b2lkICpjdHgpOwogCi1zdGF0aWMgdm9pZCBSbmRpc0ZpbHRlck9uU2VuZFJlcXVlc3RDb21wbGV0aW9uKHZvaWQgKkNvbnRleHQpOworc3RhdGljIHZvaWQgcm5kaXNfZmlsdGVyX3NlbmRfcmVxdWVzdF9jb21wbGV0aW9uKHZvaWQgKmN0eCk7CiAKIAogLyogVGhlIG9uZSBhbmQgb25seSAqLwotc3RhdGljIHN0cnVjdCBybmRpc19maWx0ZXJfZHJpdmVyX29iamVjdCBnUm5kaXNGaWx0ZXI7CitzdGF0aWMgc3RydWN0IHJuZGlzX2ZpbHRlcl9kcml2ZXJfb2JqZWN0IHJuZGlzX2ZpbHRlcjsKIAotc3RhdGljIHN0cnVjdCBybmRpc19kZXZpY2UgKkdldFJuZGlzRGV2aWNlKHZvaWQpCitzdGF0aWMgc3RydWN0IHJuZGlzX2RldmljZSAqZ2V0X3JuZGlzX2RldmljZSh2b2lkKQogewogCXN0cnVjdCBybmRpc19kZXZpY2UgKmRldmljZTsKIApAQCAtMTA5LDE5ICsxMDksMTkgQEAKIAogCXNwaW5fbG9ja19pbml0KCZkZXZpY2UtPnJlcXVlc3RfbG9jayk7CiAKLQlJTklUX0xJU1RfSEVBRCgmZGV2aWNlLT5SZXF1ZXN0TGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJmRldmljZS0+cmVxX2xpc3QpOwogCi0JZGV2aWNlLT5TdGF0ZSA9IFJORElTX0RFVl9VTklOSVRJQUxJWkVEOworCWRldmljZS0+c3RhdGUgPSBSTkRJU19ERVZfVU5JTklUSUFMSVpFRDsKIAogCXJldHVybiBkZXZpY2U7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgcm5kaXNfcmVxdWVzdCAqR2V0Um5kaXNSZXF1ZXN0KHN0cnVjdCBybmRpc19kZXZpY2UgKkRldmljZSwKLQkJCQkJICAgICB1MzIgTWVzc2FnZVR5cGUsCi0JCQkJCSAgICAgdTMyIE1lc3NhZ2VMZW5ndGgpCitzdGF0aWMgc3RydWN0IHJuZGlzX3JlcXVlc3QgKmdldF9ybmRpc19yZXF1ZXN0KHN0cnVjdCBybmRpc19kZXZpY2UgKmRldiwKKwkJCQkJICAgICB1MzIgbXNnX3R5cGUsCisJCQkJCSAgICAgdTMyIG1zZ19sZW4pCiB7CiAJc3RydWN0IHJuZGlzX3JlcXVlc3QgKnJlcXVlc3Q7Ci0Jc3RydWN0IHJuZGlzX21lc3NhZ2UgKnJuZGlzTWVzc2FnZTsKKwlzdHJ1Y3Qgcm5kaXNfbWVzc2FnZSAqcm5kaXNfbXNnOwogCXN0cnVjdCBybmRpc19zZXRfcmVxdWVzdCAqc2V0OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKQEAgLTEyOSw2MSArMTI5LDYxIEBACiAJaWYgKCFyZXF1ZXN0KQogCQlyZXR1cm4gTlVMTDsKIAotCXJlcXVlc3QtPldhaXRFdmVudCA9IG9zZF9XYWl0RXZlbnRDcmVhdGUoKTsKLQlpZiAoIXJlcXVlc3QtPldhaXRFdmVudCkgeworCXJlcXVlc3QtPndhaXRldmVudCA9IG9zZF93YWl0ZXZlbnRfY3JlYXRlKCk7CisJaWYgKCFyZXF1ZXN0LT53YWl0ZXZlbnQpIHsKIAkJa2ZyZWUocmVxdWVzdCk7CiAJCXJldHVybiBOVUxMOwogCX0KIAotCXJuZGlzTWVzc2FnZSA9ICZyZXF1ZXN0LT5SZXF1ZXN0TWVzc2FnZTsKLQlybmRpc01lc3NhZ2UtPk5kaXNNZXNzYWdlVHlwZSA9IE1lc3NhZ2VUeXBlOwotCXJuZGlzTWVzc2FnZS0+TWVzc2FnZUxlbmd0aCA9IE1lc3NhZ2VMZW5ndGg7CisJcm5kaXNfbXNnID0gJnJlcXVlc3QtPnJlcXVlc3RfbXNnOworCXJuZGlzX21zZy0+bmRpc19tc2dfdHlwZSA9IG1zZ190eXBlOworCXJuZGlzX21zZy0+bXNnX2xlbiA9IG1zZ19sZW47CiAKIAkvKgogCSAqIFNldCB0aGUgcmVxdWVzdCBpZC4gVGhpcyBmaWVsZCBpcyBhbHdheXMgYWZ0ZXIgdGhlIHJuZGlzIGhlYWRlciBmb3IKIAkgKiByZXF1ZXN0L3Jlc3BvbnNlIHBhY2tldCB0eXBlcyBzbyB3ZSBqdXN0IHVzZWQgdGhlIFNldFJlcXVlc3QgYXMgYQogCSAqIHRlbXBsYXRlCiAJICovCi0Jc2V0ID0gJnJuZGlzTWVzc2FnZS0+TWVzc2FnZS5TZXRSZXF1ZXN0OwotCXNldC0+UmVxdWVzdElkID0gYXRvbWljX2luY19yZXR1cm4oJkRldmljZS0+TmV3UmVxdWVzdElkKTsKKwlzZXQgPSAmcm5kaXNfbXNnLT5tc2cuc2V0X3JlcTsKKwlzZXQtPnJlcV9pZCA9IGF0b21pY19pbmNfcmV0dXJuKCZkZXYtPm5ld19yZXFfaWQpOwogCiAJLyogQWRkIHRvIHRoZSByZXF1ZXN0IGxpc3QgKi8KLQlzcGluX2xvY2tfaXJxc2F2ZSgmRGV2aWNlLT5yZXF1ZXN0X2xvY2ssIGZsYWdzKTsKLQlsaXN0X2FkZF90YWlsKCZyZXF1ZXN0LT5MaXN0RW50cnksICZEZXZpY2UtPlJlcXVlc3RMaXN0KTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZEZXZpY2UtPnJlcXVlc3RfbG9jaywgZmxhZ3MpOworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPnJlcXVlc3RfbG9jaywgZmxhZ3MpOworCWxpc3RfYWRkX3RhaWwoJnJlcXVlc3QtPmxpc3RfZW50LCAmZGV2LT5yZXFfbGlzdCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5yZXF1ZXN0X2xvY2ssIGZsYWdzKTsKIAogCXJldHVybiByZXF1ZXN0OwogfQogCi1zdGF0aWMgdm9pZCBQdXRSbmRpc1JlcXVlc3Qoc3RydWN0IHJuZGlzX2RldmljZSAqRGV2aWNlLAotCQkJICAgIHN0cnVjdCBybmRpc19yZXF1ZXN0ICpSZXF1ZXN0KQorc3RhdGljIHZvaWQgcHV0X3JuZGlzX3JlcXVlc3Qoc3RydWN0IHJuZGlzX2RldmljZSAqZGV2LAorCQkJICAgIHN0cnVjdCBybmRpc19yZXF1ZXN0ICpyZXEpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZEZXZpY2UtPnJlcXVlc3RfbG9jaywgZmxhZ3MpOwotCWxpc3RfZGVsKCZSZXF1ZXN0LT5MaXN0RW50cnkpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJkRldmljZS0+cmVxdWVzdF9sb2NrLCBmbGFncyk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+cmVxdWVzdF9sb2NrLCBmbGFncyk7CisJbGlzdF9kZWwoJnJlcS0+bGlzdF9lbnQpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+cmVxdWVzdF9sb2NrLCBmbGFncyk7CiAKLQlrZnJlZShSZXF1ZXN0LT5XYWl0RXZlbnQpOwotCWtmcmVlKFJlcXVlc3QpOworCWtmcmVlKHJlcS0+d2FpdGV2ZW50KTsKKwlrZnJlZShyZXEpOwogfQogCi1zdGF0aWMgdm9pZCBEdW1wUm5kaXNNZXNzYWdlKHN0cnVjdCBybmRpc19tZXNzYWdlICpSbmRpc01lc3NhZ2UpCitzdGF0aWMgdm9pZCBkdW1wX3JuZGlzX21lc3NhZ2Uoc3RydWN0IHJuZGlzX21lc3NhZ2UgKnJuZGlzX21zZykKIHsKLQlzd2l0Y2ggKFJuZGlzTWVzc2FnZS0+TmRpc01lc3NhZ2VUeXBlKSB7CisJc3dpdGNoIChybmRpc19tc2ctPm5kaXNfbXNnX3R5cGUpIHsKIAljYXNlIFJFTU9URV9ORElTX1BBQ0tFVF9NU0c6CiAJCURQUklOVF9EQkcoTkVUVlNDLCAiUkVNT1RFX05ESVNfUEFDS0VUX01TRyAobGVuICV1LCAiCiAJCQkgICAiZGF0YSBvZmZzZXQgJXUgZGF0YSBsZW4gJXUsICMgb29iICV1LCAiCiAJCQkgICAib29iIG9mZnNldCAldSwgb29iIGxlbiAldSwgcGt0IG9mZnNldCAldSwgIgogCQkJICAgInBrdCBsZW4gJXUiLAotCQkJICAgUm5kaXNNZXNzYWdlLT5NZXNzYWdlTGVuZ3RoLAotCQkJICAgUm5kaXNNZXNzYWdlLT5NZXNzYWdlLlBhY2tldC5EYXRhT2Zmc2V0LAotCQkJICAgUm5kaXNNZXNzYWdlLT5NZXNzYWdlLlBhY2tldC5EYXRhTGVuZ3RoLAotCQkJICAgUm5kaXNNZXNzYWdlLT5NZXNzYWdlLlBhY2tldC5OdW1PT0JEYXRhRWxlbWVudHMsCi0JCQkgICBSbmRpc01lc3NhZ2UtPk1lc3NhZ2UuUGFja2V0Lk9PQkRhdGFPZmZzZXQsCi0JCQkgICBSbmRpc01lc3NhZ2UtPk1lc3NhZ2UuUGFja2V0Lk9PQkRhdGFMZW5ndGgsCi0JCQkgICBSbmRpc01lc3NhZ2UtPk1lc3NhZ2UuUGFja2V0LlBlclBhY2tldEluZm9PZmZzZXQsCi0JCQkgICBSbmRpc01lc3NhZ2UtPk1lc3NhZ2UuUGFja2V0LlBlclBhY2tldEluZm9MZW5ndGgpOworCQkJICAgcm5kaXNfbXNnLT5tc2dfbGVuLAorCQkJICAgcm5kaXNfbXNnLT5tc2cucGt0LmRhdGFfb2Zmc2V0LAorCQkJICAgcm5kaXNfbXNnLT5tc2cucGt0LmRhdGFfbGVuLAorCQkJICAgcm5kaXNfbXNnLT5tc2cucGt0Lm51bV9vb2JfZGF0YV9lbGVtZW50cywKKwkJCSAgIHJuZGlzX21zZy0+bXNnLnBrdC5vb2JfZGF0YV9vZmZzZXQsCisJCQkgICBybmRpc19tc2ctPm1zZy5wa3Qub29iX2RhdGFfbGVuLAorCQkJICAgcm5kaXNfbXNnLT5tc2cucGt0LnBlcl9wa3RfaW5mb19vZmZzZXQsCisJCQkgICBybmRpc19tc2ctPm1zZy5wa3QucGVyX3BrdF9pbmZvX2xlbik7CiAJCWJyZWFrOwogCiAJY2FzZSBSRU1PVEVfTkRJU19JTklUSUFMSVpFX0NNUExUOgpAQCAtMTkxLDE0NyArMTkxLDE1NyBAQAogCQkJIihsZW4gJXUsIGlkIDB4JXgsIHN0YXR1cyAweCV4LCBtYWpvciAlZCwgbWlub3IgJWQsICIKIAkJCSJkZXZpY2UgZmxhZ3MgJWQsIG1heCB4ZmVyIHNpemUgMHgleCwgbWF4IHBrdHMgJXUsICIKIAkJCSJwa3QgYWxpZ25lZCAldSkiLAotCQkJUm5kaXNNZXNzYWdlLT5NZXNzYWdlTGVuZ3RoLAotCQkJUm5kaXNNZXNzYWdlLT5NZXNzYWdlLkluaXRpYWxpemVDb21wbGV0ZS5SZXF1ZXN0SWQsCi0JCQlSbmRpc01lc3NhZ2UtPk1lc3NhZ2UuSW5pdGlhbGl6ZUNvbXBsZXRlLlN0YXR1cywKLQkJCVJuZGlzTWVzc2FnZS0+TWVzc2FnZS5Jbml0aWFsaXplQ29tcGxldGUuTWFqb3JWZXJzaW9uLAotCQkJUm5kaXNNZXNzYWdlLT5NZXNzYWdlLkluaXRpYWxpemVDb21wbGV0ZS5NaW5vclZlcnNpb24sCi0JCQlSbmRpc01lc3NhZ2UtPk1lc3NhZ2UuSW5pdGlhbGl6ZUNvbXBsZXRlLkRldmljZUZsYWdzLAotCQkJUm5kaXNNZXNzYWdlLT5NZXNzYWdlLkluaXRpYWxpemVDb21wbGV0ZS5NYXhUcmFuc2ZlclNpemUsCi0JCQlSbmRpc01lc3NhZ2UtPk1lc3NhZ2UuSW5pdGlhbGl6ZUNvbXBsZXRlLk1heFBhY2tldHNQZXJNZXNzYWdlLAotCQkJUm5kaXNNZXNzYWdlLT5NZXNzYWdlLkluaXRpYWxpemVDb21wbGV0ZS5QYWNrZXRBbGlnbm1lbnRGYWN0b3IpOworCQkJcm5kaXNfbXNnLT5tc2dfbGVuLAorCQkJcm5kaXNfbXNnLT5tc2cuaW5pdF9jb21wbGV0ZS5yZXFfaWQsCisJCQlybmRpc19tc2ctPm1zZy5pbml0X2NvbXBsZXRlLnN0YXR1cywKKwkJCXJuZGlzX21zZy0+bXNnLmluaXRfY29tcGxldGUubWFqb3JfdmVyLAorCQkJcm5kaXNfbXNnLT5tc2cuaW5pdF9jb21wbGV0ZS5taW5vcl92ZXIsCisJCQlybmRpc19tc2ctPm1zZy5pbml0X2NvbXBsZXRlLmRldl9mbGFncywKKwkJCXJuZGlzX21zZy0+bXNnLmluaXRfY29tcGxldGUubWF4X3hmZXJfc2l6ZSwKKwkJCXJuZGlzX21zZy0+bXNnLmluaXRfY29tcGxldGUuCisJCQkgICBtYXhfcGt0X3Blcl9tc2csCisJCQlybmRpc19tc2ctPm1zZy5pbml0X2NvbXBsZXRlLgorCQkJICAgcGt0X2FsaWdubWVudF9mYWN0b3IpOwogCQlicmVhazsKIAogCWNhc2UgUkVNT1RFX05ESVNfUVVFUllfQ01QTFQ6CiAJCURQUklOVF9EQkcoTkVUVlNDLCAiUkVNT1RFX05ESVNfUVVFUllfQ01QTFQgIgogCQkJIihsZW4gJXUsIGlkIDB4JXgsIHN0YXR1cyAweCV4LCBidWYgbGVuICV1LCAiCiAJCQkiYnVmIG9mZnNldCAldSkiLAotCQkJUm5kaXNNZXNzYWdlLT5NZXNzYWdlTGVuZ3RoLAotCQkJUm5kaXNNZXNzYWdlLT5NZXNzYWdlLlF1ZXJ5Q29tcGxldGUuUmVxdWVzdElkLAotCQkJUm5kaXNNZXNzYWdlLT5NZXNzYWdlLlF1ZXJ5Q29tcGxldGUuU3RhdHVzLAotCQkJUm5kaXNNZXNzYWdlLT5NZXNzYWdlLlF1ZXJ5Q29tcGxldGUuSW5mb3JtYXRpb25CdWZmZXJMZW5ndGgsCi0JCQlSbmRpc01lc3NhZ2UtPk1lc3NhZ2UuUXVlcnlDb21wbGV0ZS5JbmZvcm1hdGlvbkJ1ZmZlck9mZnNldCk7CisJCQlybmRpc19tc2ctPm1zZ19sZW4sCisJCQlybmRpc19tc2ctPm1zZy5xdWVyeV9jb21wbGV0ZS5yZXFfaWQsCisJCQlybmRpc19tc2ctPm1zZy5xdWVyeV9jb21wbGV0ZS5zdGF0dXMsCisJCQlybmRpc19tc2ctPm1zZy5xdWVyeV9jb21wbGV0ZS4KKwkJCSAgIGluZm9fYnVmbGVuLAorCQkJcm5kaXNfbXNnLT5tc2cucXVlcnlfY29tcGxldGUuCisJCQkgICBpbmZvX2J1Zl9vZmZzZXQpOwogCQlicmVhazsKIAogCWNhc2UgUkVNT1RFX05ESVNfU0VUX0NNUExUOgogCQlEUFJJTlRfREJHKE5FVFZTQywKIAkJCSJSRU1PVEVfTkRJU19TRVRfQ01QTFQgKGxlbiAldSwgaWQgMHgleCwgc3RhdHVzIDB4JXgpIiwKLQkJCVJuZGlzTWVzc2FnZS0+TWVzc2FnZUxlbmd0aCwKLQkJCVJuZGlzTWVzc2FnZS0+TWVzc2FnZS5TZXRDb21wbGV0ZS5SZXF1ZXN0SWQsCi0JCQlSbmRpc01lc3NhZ2UtPk1lc3NhZ2UuU2V0Q29tcGxldGUuU3RhdHVzKTsKKwkJCXJuZGlzX21zZy0+bXNnX2xlbiwKKwkJCXJuZGlzX21zZy0+bXNnLnNldF9jb21wbGV0ZS5yZXFfaWQsCisJCQlybmRpc19tc2ctPm1zZy5zZXRfY29tcGxldGUuc3RhdHVzKTsKIAkJYnJlYWs7CiAKIAljYXNlIFJFTU9URV9ORElTX0lORElDQVRFX1NUQVRVU19NU0c6CiAJCURQUklOVF9EQkcoTkVUVlNDLCAiUkVNT1RFX05ESVNfSU5ESUNBVEVfU1RBVFVTX01TRyAiCiAJCQkiKGxlbiAldSwgc3RhdHVzIDB4JXgsIGJ1ZiBsZW4gJXUsIGJ1ZiBvZmZzZXQgJXUpIiwKLQkJCVJuZGlzTWVzc2FnZS0+TWVzc2FnZUxlbmd0aCwKLQkJCVJuZGlzTWVzc2FnZS0+TWVzc2FnZS5JbmRpY2F0ZVN0YXR1cy5TdGF0dXMsCi0JCQlSbmRpc01lc3NhZ2UtPk1lc3NhZ2UuSW5kaWNhdGVTdGF0dXMuU3RhdHVzQnVmZmVyTGVuZ3RoLAotCQkJUm5kaXNNZXNzYWdlLT5NZXNzYWdlLkluZGljYXRlU3RhdHVzLlN0YXR1c0J1ZmZlck9mZnNldCk7CisJCQlybmRpc19tc2ctPm1zZ19sZW4sCisJCQlybmRpc19tc2ctPm1zZy5pbmRpY2F0ZV9zdGF0dXMuc3RhdHVzLAorCQkJcm5kaXNfbXNnLT5tc2cuaW5kaWNhdGVfc3RhdHVzLnN0YXR1c19idWZsZW4sCisJCQlybmRpc19tc2ctPm1zZy5pbmRpY2F0ZV9zdGF0dXMuc3RhdHVzX2J1Zl9vZmZzZXQpOwogCQlicmVhazsKIAogCWRlZmF1bHQ6CiAJCURQUklOVF9EQkcoTkVUVlNDLCAiMHgleCAobGVuICV1KSIsCi0JCQlSbmRpc01lc3NhZ2UtPk5kaXNNZXNzYWdlVHlwZSwKLQkJCVJuZGlzTWVzc2FnZS0+TWVzc2FnZUxlbmd0aCk7CisJCQlybmRpc19tc2ctPm5kaXNfbXNnX3R5cGUsCisJCQlybmRpc19tc2ctPm1zZ19sZW4pOwogCQlicmVhazsKIAl9CiB9CiAKLXN0YXRpYyBpbnQgUm5kaXNGaWx0ZXJTZW5kUmVxdWVzdChzdHJ1Y3Qgcm5kaXNfZGV2aWNlICpEZXZpY2UsCi0JCQkJICBzdHJ1Y3Qgcm5kaXNfcmVxdWVzdCAqUmVxdWVzdCkKK3N0YXRpYyBpbnQgcm5kaXNfZmlsdGVyX3NlbmRfcmVxdWVzdChzdHJ1Y3Qgcm5kaXNfZGV2aWNlICpkZXYsCisJCQkJICBzdHJ1Y3Qgcm5kaXNfcmVxdWVzdCAqcmVxKQogewogCWludCByZXQ7CiAJc3RydWN0IGh2X25ldHZzY19wYWNrZXQgKnBhY2tldDsKIAogCS8qIFNldHVwIHRoZSBwYWNrZXQgdG8gc2VuZCBpdCAqLwotCXBhY2tldCA9ICZSZXF1ZXN0LT5QYWNrZXQ7CisJcGFja2V0ID0gJnJlcS0+cGt0OwogCi0JcGFja2V0LT5Jc0RhdGFQYWNrZXQgPSBmYWxzZTsKLQlwYWNrZXQtPlRvdGFsRGF0YUJ1ZmZlckxlbmd0aCA9IFJlcXVlc3QtPlJlcXVlc3RNZXNzYWdlLk1lc3NhZ2VMZW5ndGg7Ci0JcGFja2V0LT5QYWdlQnVmZmVyQ291bnQgPSAxOworCXBhY2tldC0+aXNfZGF0YV9wa3QgPSBmYWxzZTsKKwlwYWNrZXQtPnRvdGFsX2RhdGFfYnVmbGVuID0gcmVxLT5yZXF1ZXN0X21zZy5tc2dfbGVuOworCXBhY2tldC0+cGFnZV9idWZfY250ID0gMTsKIAotCXBhY2tldC0+UGFnZUJ1ZmZlcnNbMF0uUGZuID0gdmlydF90b19waHlzKCZSZXF1ZXN0LT5SZXF1ZXN0TWVzc2FnZSkgPj4KKwlwYWNrZXQtPnBhZ2VfYnVmWzBdLlBmbiA9IHZpcnRfdG9fcGh5cygmcmVxLT5yZXF1ZXN0X21zZykgPj4KIAkJCQkJUEFHRV9TSElGVDsKLQlwYWNrZXQtPlBhZ2VCdWZmZXJzWzBdLkxlbmd0aCA9IFJlcXVlc3QtPlJlcXVlc3RNZXNzYWdlLk1lc3NhZ2VMZW5ndGg7Ci0JcGFja2V0LT5QYWdlQnVmZmVyc1swXS5PZmZzZXQgPQotCQkodW5zaWduZWQgbG9uZykmUmVxdWVzdC0+UmVxdWVzdE1lc3NhZ2UgJiAoUEFHRV9TSVpFIC0gMSk7CisJcGFja2V0LT5wYWdlX2J1ZlswXS5MZW5ndGggPSByZXEtPnJlcXVlc3RfbXNnLm1zZ19sZW47CisJcGFja2V0LT5wYWdlX2J1ZlswXS5PZmZzZXQgPQorCQkodW5zaWduZWQgbG9uZykmcmVxLT5yZXF1ZXN0X21zZyAmIChQQUdFX1NJWkUgLSAxKTsKIAotCXBhY2tldC0+Q29tcGxldGlvbi5TZW5kLlNlbmRDb21wbGV0aW9uQ29udGV4dCA9IFJlcXVlc3Q7LyogcGFja2V0OyAqLwotCXBhY2tldC0+Q29tcGxldGlvbi5TZW5kLk9uU2VuZENvbXBsZXRpb24gPQotCQlSbmRpc0ZpbHRlck9uU2VuZFJlcXVlc3RDb21wbGV0aW9uOwotCXBhY2tldC0+Q29tcGxldGlvbi5TZW5kLlNlbmRDb21wbGV0aW9uVGlkID0gKHVuc2lnbmVkIGxvbmcpRGV2aWNlOworCXBhY2tldC0+Y29tcGxldGlvbi5zZW5kLnNlbmRfY29tcGxldGlvbl9jdHggPSByZXE7LyogcGFja2V0OyAqLworCXBhY2tldC0+Y29tcGxldGlvbi5zZW5kLnNlbmRfY29tcGxldGlvbiA9CisJCXJuZGlzX2ZpbHRlcl9zZW5kX3JlcXVlc3RfY29tcGxldGlvbjsKKwlwYWNrZXQtPmNvbXBsZXRpb24uc2VuZC5zZW5kX2NvbXBsZXRpb25fdGlkID0gKHVuc2lnbmVkIGxvbmcpZGV2OwogCi0JcmV0ID0gZ1JuZGlzRmlsdGVyLklubmVyRHJpdmVyLk9uU2VuZChEZXZpY2UtPk5ldERldmljZS0+RGV2aWNlLCBwYWNrZXQpOworCXJldCA9IHJuZGlzX2ZpbHRlci5pbm5lcl9kcnYuc2VuZChkZXYtPm5ldF9kZXYtPmRldiwgcGFja2V0KTsKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgdm9pZCBSbmRpc0ZpbHRlclJlY2VpdmVSZXNwb25zZShzdHJ1Y3Qgcm5kaXNfZGV2aWNlICpEZXZpY2UsCi0JCQkJICAgICAgIHN0cnVjdCBybmRpc19tZXNzYWdlICpSZXNwb25zZSkKK3N0YXRpYyB2b2lkIHJuZGlzX2ZpbHRlcl9yZWNlaXZlX3Jlc3BvbnNlKHN0cnVjdCBybmRpc19kZXZpY2UgKmRldiwKKwkJCQkgICAgICAgc3RydWN0IHJuZGlzX21lc3NhZ2UgKnJlc3ApCiB7CiAJc3RydWN0IHJuZGlzX3JlcXVlc3QgKnJlcXVlc3QgPSBOVUxMOwogCWJvb2wgZm91bmQgPSBmYWxzZTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJkRldmljZS0+cmVxdWVzdF9sb2NrLCBmbGFncyk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeShyZXF1ZXN0LCAmRGV2aWNlLT5SZXF1ZXN0TGlzdCwgTGlzdEVudHJ5KSB7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+cmVxdWVzdF9sb2NrLCBmbGFncyk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShyZXF1ZXN0LCAmZGV2LT5yZXFfbGlzdCwgbGlzdF9lbnQpIHsKIAkJLyoKIAkJICogQWxsIHJlcXVlc3QvcmVzcG9uc2UgbWVzc2FnZSBjb250YWlucyBSZXF1ZXN0SWQgYXMgdGhlIDFzdAogCQkgKiBmaWVsZAogCQkgKi8KLQkJaWYgKHJlcXVlc3QtPlJlcXVlc3RNZXNzYWdlLk1lc3NhZ2UuSW5pdGlhbGl6ZVJlcXVlc3QuUmVxdWVzdElkCi0JCSAgICA9PSBSZXNwb25zZS0+TWVzc2FnZS5Jbml0aWFsaXplQ29tcGxldGUuUmVxdWVzdElkKSB7CisJCWlmIChyZXF1ZXN0LT5yZXF1ZXN0X21zZy5tc2cuaW5pdF9yZXEucmVxX2lkCisJCSAgICA9PSByZXNwLT5tc2cuaW5pdF9jb21wbGV0ZS5yZXFfaWQpIHsKIAkJCURQUklOVF9EQkcoTkVUVlNDLCAiZm91bmQgcm5kaXMgcmVxdWVzdCBmb3IgIgogCQkJCSJ0aGlzIHJlc3BvbnNlIChpZCAweCV4IHJlcSB0eXBlIDB4JXggcmVzICIKIAkJCQkidHlwZSAweCV4KSIsCi0JCQkJcmVxdWVzdC0+UmVxdWVzdE1lc3NhZ2UuTWVzc2FnZS5Jbml0aWFsaXplUmVxdWVzdC5SZXF1ZXN0SWQsCi0JCQkJcmVxdWVzdC0+UmVxdWVzdE1lc3NhZ2UuTmRpc01lc3NhZ2VUeXBlLAotCQkJCVJlc3BvbnNlLT5OZGlzTWVzc2FnZVR5cGUpOworCQkJCXJlcXVlc3QtPnJlcXVlc3RfbXNnLm1zZy4KKwkJCQkgICBpbml0X3JlcS5yZXFfaWQsCisJCQkJcmVxdWVzdC0+cmVxdWVzdF9tc2cubmRpc19tc2dfdHlwZSwKKwkJCQlyZXNwLT5uZGlzX21zZ190eXBlKTsKIAogCQkJZm91bmQgPSB0cnVlOwogCQkJYnJlYWs7CiAJCX0KIAl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmRGV2aWNlLT5yZXF1ZXN0X2xvY2ssIGZsYWdzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPnJlcXVlc3RfbG9jaywgZmxhZ3MpOwogCiAJaWYgKGZvdW5kKSB7Ci0JCWlmIChSZXNwb25zZS0+TWVzc2FnZUxlbmd0aCA8PSBzaXplb2Yoc3RydWN0IHJuZGlzX21lc3NhZ2UpKSB7Ci0JCQltZW1jcHkoJnJlcXVlc3QtPlJlc3BvbnNlTWVzc2FnZSwgUmVzcG9uc2UsCi0JCQkgICAgICAgUmVzcG9uc2UtPk1lc3NhZ2VMZW5ndGgpOworCQlpZiAocmVzcC0+bXNnX2xlbiA8PSBzaXplb2Yoc3RydWN0IHJuZGlzX21lc3NhZ2UpKSB7CisJCQltZW1jcHkoJnJlcXVlc3QtPnJlc3BvbnNlX21zZywgcmVzcCwKKwkJCSAgICAgICByZXNwLT5tc2dfbGVuKTsKIAkJfSBlbHNlIHsKIAkJCURQUklOVF9FUlIoTkVUVlNDLCAicm5kaXMgcmVzcG9uc2UgYnVmZmVyIG92ZXJmbG93ICIKIAkJCQkgICJkZXRlY3RlZCAoc2l6ZSAldSBtYXggJXp1KSIsCi0JCQkJICBSZXNwb25zZS0+TWVzc2FnZUxlbmd0aCwKKwkJCQkgIHJlc3AtPm1zZ19sZW4sCiAJCQkJICBzaXplb2Yoc3RydWN0IHJuZGlzX2ZpbHRlcl9wYWNrZXQpKTsKIAotCQkJaWYgKFJlc3BvbnNlLT5OZGlzTWVzc2FnZVR5cGUgPT0KKwkJCWlmIChyZXNwLT5uZGlzX21zZ190eXBlID09CiAJCQkgICAgUkVNT1RFX05ESVNfUkVTRVRfQ01QTFQpIHsKIAkJCQkvKiBkb2VzIG5vdCBoYXZlIGEgcmVxdWVzdCBpZCBmaWVsZCAqLwotCQkJCXJlcXVlc3QtPlJlc3BvbnNlTWVzc2FnZS5NZXNzYWdlLlJlc2V0Q29tcGxldGUuU3RhdHVzID0gU1RBVFVTX0JVRkZFUl9PVkVSRkxPVzsKKwkJCQlyZXF1ZXN0LT5yZXNwb25zZV9tc2cubXNnLnJlc2V0X2NvbXBsZXRlLgorCQkJCQlzdGF0dXMgPSBTVEFUVVNfQlVGRkVSX09WRVJGTE9XOwogCQkJfSBlbHNlIHsKLQkJCQlyZXF1ZXN0LT5SZXNwb25zZU1lc3NhZ2UuTWVzc2FnZS5Jbml0aWFsaXplQ29tcGxldGUuU3RhdHVzID0gU1RBVFVTX0JVRkZFUl9PVkVSRkxPVzsKKwkJCQlyZXF1ZXN0LT5yZXNwb25zZV9tc2cubXNnLgorCQkJCWluaXRfY29tcGxldGUuc3RhdHVzID0KKwkJCQkJU1RBVFVTX0JVRkZFUl9PVkVSRkxPVzsKIAkJCX0KIAkJfQogCi0JCW9zZF9XYWl0RXZlbnRTZXQocmVxdWVzdC0+V2FpdEV2ZW50KTsKKwkJb3NkX3dhaXRldmVudF9zZXQocmVxdWVzdC0+d2FpdGV2ZW50KTsKIAl9IGVsc2UgewogCQlEUFJJTlRfRVJSKE5FVFZTQywgIm5vIHJuZGlzIHJlcXVlc3QgZm91bmQgZm9yIHRoaXMgcmVzcG9uc2UgIgogCQkJICAgIihpZCAweCV4IHJlcyB0eXBlIDB4JXgpIiwKLQkJCSAgIFJlc3BvbnNlLT5NZXNzYWdlLkluaXRpYWxpemVDb21wbGV0ZS5SZXF1ZXN0SWQsCi0JCQkgICBSZXNwb25zZS0+TmRpc01lc3NhZ2VUeXBlKTsKKwkJCSAgIHJlc3AtPm1zZy5pbml0X2NvbXBsZXRlLnJlcV9pZCwKKwkJCSAgIHJlc3AtPm5kaXNfbXNnX3R5cGUpOwogCX0KIH0KIAotc3RhdGljIHZvaWQgUm5kaXNGaWx0ZXJSZWNlaXZlSW5kaWNhdGVTdGF0dXMoc3RydWN0IHJuZGlzX2RldmljZSAqRGV2aWNlLAotCQkJCQkgICAgIHN0cnVjdCBybmRpc19tZXNzYWdlICpSZXNwb25zZSkKK3N0YXRpYyB2b2lkIHJuZGlzX2ZpbHRlcl9yZWNlaXZlX2luZGljYXRlX3N0YXR1cyhzdHJ1Y3Qgcm5kaXNfZGV2aWNlICpkZXYsCisJCQkJCSAgICAgc3RydWN0IHJuZGlzX21lc3NhZ2UgKnJlc3ApCiB7CiAJc3RydWN0IHJuZGlzX2luZGljYXRlX3N0YXR1cyAqaW5kaWNhdGUgPQotCQkJJlJlc3BvbnNlLT5NZXNzYWdlLkluZGljYXRlU3RhdHVzOworCQkJJnJlc3AtPm1zZy5pbmRpY2F0ZV9zdGF0dXM7CiAKLQlpZiAoaW5kaWNhdGUtPlN0YXR1cyA9PSBSTkRJU19TVEFUVVNfTUVESUFfQ09OTkVDVCkgewotCQlnUm5kaXNGaWx0ZXIuSW5uZXJEcml2ZXIuT25MaW5rU3RhdHVzQ2hhbmdlZChEZXZpY2UtPk5ldERldmljZS0+RGV2aWNlLCAxKTsKLQl9IGVsc2UgaWYgKGluZGljYXRlLT5TdGF0dXMgPT0gUk5ESVNfU1RBVFVTX01FRElBX0RJU0NPTk5FQ1QpIHsKLQkJZ1JuZGlzRmlsdGVyLklubmVyRHJpdmVyLk9uTGlua1N0YXR1c0NoYW5nZWQoRGV2aWNlLT5OZXREZXZpY2UtPkRldmljZSwgMCk7CisJaWYgKGluZGljYXRlLT5zdGF0dXMgPT0gUk5ESVNfU1RBVFVTX01FRElBX0NPTk5FQ1QpIHsKKwkJcm5kaXNfZmlsdGVyLmlubmVyX2Rydi5saW5rX3N0YXR1c19jaGFuZ2UoCisJCQlkZXYtPm5ldF9kZXYtPmRldiwgMSk7CisJfSBlbHNlIGlmIChpbmRpY2F0ZS0+c3RhdHVzID09IFJORElTX1NUQVRVU19NRURJQV9ESVNDT05ORUNUKSB7CisJCXJuZGlzX2ZpbHRlci5pbm5lcl9kcnYubGlua19zdGF0dXNfY2hhbmdlKAorCQkJZGV2LT5uZXRfZGV2LT5kZXYsIDApOwogCX0gZWxzZSB7CiAJCS8qCiAJCSAqIFRPRE86CkBAIC0zMzksMTggKzM0OSwxOCBAQAogCX0KIH0KIAotc3RhdGljIHZvaWQgUm5kaXNGaWx0ZXJSZWNlaXZlRGF0YShzdHJ1Y3Qgcm5kaXNfZGV2aWNlICpEZXZpY2UsCi0JCQkJICAgc3RydWN0IHJuZGlzX21lc3NhZ2UgKk1lc3NhZ2UsCi0JCQkJICAgc3RydWN0IGh2X25ldHZzY19wYWNrZXQgKlBhY2tldCkKK3N0YXRpYyB2b2lkIHJuZGlzX2ZpbHRlcl9yZWNlaXZlX2RhdGEoc3RydWN0IHJuZGlzX2RldmljZSAqZGV2LAorCQkJCSAgIHN0cnVjdCBybmRpc19tZXNzYWdlICptc2csCisJCQkJICAgc3RydWN0IGh2X25ldHZzY19wYWNrZXQgKnBrdCkKIHsKLQlzdHJ1Y3Qgcm5kaXNfcGFja2V0ICpybmRpc1BhY2tldDsKLQl1MzIgZGF0YU9mZnNldDsKKwlzdHJ1Y3Qgcm5kaXNfcGFja2V0ICpybmRpc19wa3Q7CisJdTMyIGRhdGFfb2Zmc2V0OwogCiAJLyogZW1wdHkgZXRoZXJuZXQgZnJhbWUgPz8gKi8KIAkvKiBBU1NFUlQoUGFja2V0LT5QYWdlQnVmZmVyc1swXS5MZW5ndGggPiAqLwogCS8qIAlSTkRJU19NRVNTQUdFX1NJWkUoc3RydWN0IHJuZGlzX3BhY2tldCkpOyAqLwogCi0Jcm5kaXNQYWNrZXQgPSAmTWVzc2FnZS0+TWVzc2FnZS5QYWNrZXQ7CisJcm5kaXNfcGt0ID0gJm1zZy0+bXNnLnBrdDsKIAogCS8qCiAJICogRklYTUU6IEhhbmRsZSBtdWx0aXBsZSBybmRpcyBwa3QgbXNncyB0aGF0IG1heWJlIGVuY2xvc2VkIGluIHRoaXMKQEAgLTM1OCw0OCArMzY4LDQ4IEBACiAJICovCiAKIAkvKiBSZW1vdmUgdGhlIHJuZGlzIGhlYWRlciBhbmQgcGFzcyBpdCBiYWNrIHVwIHRoZSBzdGFjayAqLwotCWRhdGFPZmZzZXQgPSBSTkRJU19IRUFERVJfU0laRSArIHJuZGlzUGFja2V0LT5EYXRhT2Zmc2V0OworCWRhdGFfb2Zmc2V0ID0gUk5ESVNfSEVBREVSX1NJWkUgKyBybmRpc19wa3QtPmRhdGFfb2Zmc2V0OwogCi0JUGFja2V0LT5Ub3RhbERhdGFCdWZmZXJMZW5ndGggLT0gZGF0YU9mZnNldDsKLQlQYWNrZXQtPlBhZ2VCdWZmZXJzWzBdLk9mZnNldCArPSBkYXRhT2Zmc2V0OwotCVBhY2tldC0+UGFnZUJ1ZmZlcnNbMF0uTGVuZ3RoIC09IGRhdGFPZmZzZXQ7CisJcGt0LT50b3RhbF9kYXRhX2J1ZmxlbiAtPSBkYXRhX29mZnNldDsKKwlwa3QtPnBhZ2VfYnVmWzBdLk9mZnNldCArPSBkYXRhX29mZnNldDsKKwlwa3QtPnBhZ2VfYnVmWzBdLkxlbmd0aCAtPSBkYXRhX29mZnNldDsKIAotCVBhY2tldC0+SXNEYXRhUGFja2V0ID0gdHJ1ZTsKKwlwa3QtPmlzX2RhdGFfcGt0ID0gdHJ1ZTsKIAotCWdSbmRpc0ZpbHRlci5Jbm5lckRyaXZlci5PblJlY2VpdmVDYWxsYmFjayhEZXZpY2UtPk5ldERldmljZS0+RGV2aWNlLAotCQkJCQkJICAgUGFja2V0KTsKKwlybmRpc19maWx0ZXIuaW5uZXJfZHJ2LnJlY3ZfY2IoZGV2LT5uZXRfZGV2LT5kZXYsCisJCQkJCQkgICBwa3QpOwogfQogCi1zdGF0aWMgaW50IFJuZGlzRmlsdGVyT25SZWNlaXZlKHN0cnVjdCBodl9kZXZpY2UgKkRldmljZSwKLQkJCQlzdHJ1Y3QgaHZfbmV0dnNjX3BhY2tldAkqUGFja2V0KQorc3RhdGljIGludCBybmRpc19maWx0ZXJfcmVjZWl2ZShzdHJ1Y3QgaHZfZGV2aWNlICpkZXYsCisJCQkJc3RydWN0IGh2X25ldHZzY19wYWNrZXQJKnBrdCkKIHsKLQlzdHJ1Y3QgbmV0dnNjX2RldmljZSAqbmV0RGV2aWNlID0gRGV2aWNlLT5FeHRlbnNpb247Ci0Jc3RydWN0IHJuZGlzX2RldmljZSAqcm5kaXNEZXZpY2U7Ci0Jc3RydWN0IHJuZGlzX21lc3NhZ2Ugcm5kaXNNZXNzYWdlOwotCXN0cnVjdCBybmRpc19tZXNzYWdlICpybmRpc0hlYWRlcjsKKwlzdHJ1Y3QgbmV0dnNjX2RldmljZSAqbmV0X2RldiA9IGRldi0+RXh0ZW5zaW9uOworCXN0cnVjdCBybmRpc19kZXZpY2UgKnJuZGlzX2RldjsKKwlzdHJ1Y3Qgcm5kaXNfbWVzc2FnZSBybmRpc19tc2c7CisJc3RydWN0IHJuZGlzX21lc3NhZ2UgKnJuZGlzX2hkcjsKIAotCWlmICghbmV0RGV2aWNlKQorCWlmICghbmV0X2RldikKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAkvKiBNYWtlIHN1cmUgdGhlIHJuZGlzIGRldmljZSBzdGF0ZSBpcyBpbml0aWFsaXplZCAqLwotCWlmICghbmV0RGV2aWNlLT5FeHRlbnNpb24pIHsKKwlpZiAoIW5ldF9kZXYtPmV4dGVuc2lvbikgewogCQlEUFJJTlRfRVJSKE5FVFZTQywgImdvdCBybmRpcyBtZXNzYWdlIGJ1dCBubyBybmRpcyBkZXZpY2UuLi4iCiAJCQkgICJkcm9wcGluZyB0aGlzIG1lc3NhZ2UhIik7CiAJCXJldHVybiAtMTsKIAl9CiAKLQlybmRpc0RldmljZSA9IChzdHJ1Y3Qgcm5kaXNfZGV2aWNlICopbmV0RGV2aWNlLT5FeHRlbnNpb247Ci0JaWYgKHJuZGlzRGV2aWNlLT5TdGF0ZSA9PSBSTkRJU19ERVZfVU5JTklUSUFMSVpFRCkgeworCXJuZGlzX2RldiA9IChzdHJ1Y3Qgcm5kaXNfZGV2aWNlICopbmV0X2Rldi0+ZXh0ZW5zaW9uOworCWlmIChybmRpc19kZXYtPnN0YXRlID09IFJORElTX0RFVl9VTklOSVRJQUxJWkVEKSB7CiAJCURQUklOVF9FUlIoTkVUVlNDLCAiZ290IHJuZGlzIG1lc3NhZ2UgYnV0IHJuZGlzIGRldmljZSAiCiAJCQkgICAidW5pbml0aWFsaXplZC4uLmRyb3BwaW5nIHRoaXMgbWVzc2FnZSEiKTsKIAkJcmV0dXJuIC0xOwogCX0KIAotCXJuZGlzSGVhZGVyID0gKHN0cnVjdCBybmRpc19tZXNzYWdlICopa21hcF9hdG9taWMoCi0JCQlwZm5fdG9fcGFnZShQYWNrZXQtPlBhZ2VCdWZmZXJzWzBdLlBmbiksIEtNX0lSUTApOworCXJuZGlzX2hkciA9IChzdHJ1Y3Qgcm5kaXNfbWVzc2FnZSAqKWttYXBfYXRvbWljKAorCQkJcGZuX3RvX3BhZ2UocGt0LT5wYWdlX2J1ZlswXS5QZm4pLCBLTV9JUlEwKTsKIAotCXJuZGlzSGVhZGVyID0gKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpcm5kaXNIZWFkZXIgKwotCQkJUGFja2V0LT5QYWdlQnVmZmVyc1swXS5PZmZzZXQpOworCXJuZGlzX2hkciA9ICh2b2lkICopKCh1bnNpZ25lZCBsb25nKXJuZGlzX2hkciArCisJCQlwa3QtPnBhZ2VfYnVmWzBdLk9mZnNldCk7CiAKIAkvKiBNYWtlIHN1cmUgd2UgZ290IGEgdmFsaWQgcm5kaXMgbWVzc2FnZSAqLwogCS8qCkBAIC00MDgsMzkgKzQxOCwzOSBAQAogCSAqIHJhbmdlIHNob3dzIDUyIGJ5dGVzCiAJICogKi8KICNpZiAwCi0JaWYgKFBhY2tldC0+VG90YWxEYXRhQnVmZmVyTGVuZ3RoICE9IHJuZGlzSGVhZGVyLT5NZXNzYWdlTGVuZ3RoKSB7Ci0JCWt1bm1hcF9hdG9taWMocm5kaXNIZWFkZXIgLSBQYWNrZXQtPlBhZ2VCdWZmZXJzWzBdLk9mZnNldCwKKwlpZiAocGt0LT50b3RhbF9kYXRhX2J1ZmxlbiAhPSBybmRpc19oZHItPm1zZ19sZW4pIHsKKwkJa3VubWFwX2F0b21pYyhybmRpc19oZHIgLSBwa3QtPnBhZ2VfYnVmWzBdLk9mZnNldCwKIAkJCSAgICAgIEtNX0lSUTApOwogCiAJCURQUklOVF9FUlIoTkVUVlNDLCAiaW52YWxpZCBybmRpcyBtZXNzYWdlPyAoZXhwZWN0ZWQgJXUgIgogCQkJICAgImJ5dGVzIGdvdCAldSkuLi5kcm9wcGluZyB0aGlzIG1lc3NhZ2UhIiwKLQkJCSAgIHJuZGlzSGVhZGVyLT5NZXNzYWdlTGVuZ3RoLAotCQkJICAgUGFja2V0LT5Ub3RhbERhdGFCdWZmZXJMZW5ndGgpOworCQkJICAgcm5kaXNfaGRyLT5tc2dfbGVuLAorCQkJICAgcGt0LT50b3RhbF9kYXRhX2J1Zmxlbik7CiAJCXJldHVybiAtMTsKIAl9CiAjZW5kaWYKIAotCWlmICgocm5kaXNIZWFkZXItPk5kaXNNZXNzYWdlVHlwZSAhPSBSRU1PVEVfTkRJU19QQUNLRVRfTVNHKSAmJgotCSAgICAocm5kaXNIZWFkZXItPk1lc3NhZ2VMZW5ndGggPiBzaXplb2Yoc3RydWN0IHJuZGlzX21lc3NhZ2UpKSkgeworCWlmICgocm5kaXNfaGRyLT5uZGlzX21zZ190eXBlICE9IFJFTU9URV9ORElTX1BBQ0tFVF9NU0cpICYmCisJICAgIChybmRpc19oZHItPm1zZ19sZW4gPiBzaXplb2Yoc3RydWN0IHJuZGlzX21lc3NhZ2UpKSkgewogCQlEUFJJTlRfRVJSKE5FVFZTQywgImluY29taW5nIHJuZGlzIG1lc3NhZ2UgYnVmZmVyIG92ZXJmbG93ICIKIAkJCSAgICJkZXRlY3RlZCAoZ290ICV1LCBtYXggJXp1KS4uLm1hcmtpbmcgaXQgYW4gZXJyb3IhIiwKLQkJCSAgIHJuZGlzSGVhZGVyLT5NZXNzYWdlTGVuZ3RoLAorCQkJICAgcm5kaXNfaGRyLT5tc2dfbGVuLAogCQkJICAgc2l6ZW9mKHN0cnVjdCBybmRpc19tZXNzYWdlKSk7CiAJfQogCi0JbWVtY3B5KCZybmRpc01lc3NhZ2UsIHJuZGlzSGVhZGVyLAotCQkocm5kaXNIZWFkZXItPk1lc3NhZ2VMZW5ndGggPiBzaXplb2Yoc3RydWN0IHJuZGlzX21lc3NhZ2UpKSA/CisJbWVtY3B5KCZybmRpc19tc2csIHJuZGlzX2hkciwKKwkJKHJuZGlzX2hkci0+bXNnX2xlbiA+IHNpemVvZihzdHJ1Y3Qgcm5kaXNfbWVzc2FnZSkpID8KIAkJCXNpemVvZihzdHJ1Y3Qgcm5kaXNfbWVzc2FnZSkgOgotCQkJcm5kaXNIZWFkZXItPk1lc3NhZ2VMZW5ndGgpOworCQkJcm5kaXNfaGRyLT5tc2dfbGVuKTsKIAotCWt1bm1hcF9hdG9taWMocm5kaXNIZWFkZXIgLSBQYWNrZXQtPlBhZ2VCdWZmZXJzWzBdLk9mZnNldCwgS01fSVJRMCk7CisJa3VubWFwX2F0b21pYyhybmRpc19oZHIgLSBwa3QtPnBhZ2VfYnVmWzBdLk9mZnNldCwgS01fSVJRMCk7CiAKLQlEdW1wUm5kaXNNZXNzYWdlKCZybmRpc01lc3NhZ2UpOworCWR1bXBfcm5kaXNfbWVzc2FnZSgmcm5kaXNfbXNnKTsKIAotCXN3aXRjaCAocm5kaXNNZXNzYWdlLk5kaXNNZXNzYWdlVHlwZSkgeworCXN3aXRjaCAocm5kaXNfbXNnLm5kaXNfbXNnX3R5cGUpIHsKIAljYXNlIFJFTU9URV9ORElTX1BBQ0tFVF9NU0c6CiAJCS8qIGRhdGEgbXNnICovCi0JCVJuZGlzRmlsdGVyUmVjZWl2ZURhdGEocm5kaXNEZXZpY2UsICZybmRpc01lc3NhZ2UsIFBhY2tldCk7CisJCXJuZGlzX2ZpbHRlcl9yZWNlaXZlX2RhdGEocm5kaXNfZGV2LCAmcm5kaXNfbXNnLCBwa3QpOwogCQlicmVhazsKIAogCWNhc2UgUkVNT1RFX05ESVNfSU5JVElBTElaRV9DTVBMVDoKQEAgLTQ0OSwzNyArNDU5LDM3IEBACiAJLyogY2FzZSBSRU1PVEVfTkRJU19SRVNFVF9DTVBMVDogKi8KIAkvKiBjYXNlIFJFTU9URV9ORElTX0tFRVBBTElWRV9DTVBMVDogKi8KIAkJLyogY29tcGxldGlvbiBtc2dzICovCi0JCVJuZGlzRmlsdGVyUmVjZWl2ZVJlc3BvbnNlKHJuZGlzRGV2aWNlLCAmcm5kaXNNZXNzYWdlKTsKKwkJcm5kaXNfZmlsdGVyX3JlY2VpdmVfcmVzcG9uc2Uocm5kaXNfZGV2LCAmcm5kaXNfbXNnKTsKIAkJYnJlYWs7CiAKIAljYXNlIFJFTU9URV9ORElTX0lORElDQVRFX1NUQVRVU19NU0c6CiAJCS8qIG5vdGlmaWNhdGlvbiBtc2dzICovCi0JCVJuZGlzRmlsdGVyUmVjZWl2ZUluZGljYXRlU3RhdHVzKHJuZGlzRGV2aWNlLCAmcm5kaXNNZXNzYWdlKTsKKwkJcm5kaXNfZmlsdGVyX3JlY2VpdmVfaW5kaWNhdGVfc3RhdHVzKHJuZGlzX2RldiwgJnJuZGlzX21zZyk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCURQUklOVF9FUlIoTkVUVlNDLCAidW5oYW5kbGVkIHJuZGlzIG1lc3NhZ2UgKHR5cGUgJXUgbGVuICV1KSIsCi0JCQkgICBybmRpc01lc3NhZ2UuTmRpc01lc3NhZ2VUeXBlLAotCQkJICAgcm5kaXNNZXNzYWdlLk1lc3NhZ2VMZW5ndGgpOworCQkJICAgcm5kaXNfbXNnLm5kaXNfbXNnX3R5cGUsCisJCQkgICBybmRpc19tc2cubXNnX2xlbik7CiAJCWJyZWFrOwogCX0KIAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IFJuZGlzRmlsdGVyUXVlcnlEZXZpY2Uoc3RydWN0IHJuZGlzX2RldmljZSAqRGV2aWNlLCB1MzIgT2lkLAotCQkJCSAgdm9pZCAqUmVzdWx0LCB1MzIgKlJlc3VsdFNpemUpCitzdGF0aWMgaW50IHJuZGlzX2ZpbHRlcl9xdWVyeV9kZXZpY2Uoc3RydWN0IHJuZGlzX2RldmljZSAqZGV2LCB1MzIgb2lkLAorCQkJCSAgdm9pZCAqcmVzdWx0LCB1MzIgKnJlc3VsdF9zaXplKQogewogCXN0cnVjdCBybmRpc19yZXF1ZXN0ICpyZXF1ZXN0OwotCXUzMiBpbnJlc3VsdFNpemUgPSAqUmVzdWx0U2l6ZTsKKwl1MzIgaW5yZXN1bHRfc2l6ZSA9ICpyZXN1bHRfc2l6ZTsKIAlzdHJ1Y3Qgcm5kaXNfcXVlcnlfcmVxdWVzdCAqcXVlcnk7Ci0Jc3RydWN0IHJuZGlzX3F1ZXJ5X2NvbXBsZXRlICpxdWVyeUNvbXBsZXRlOworCXN0cnVjdCBybmRpc19xdWVyeV9jb21wbGV0ZSAqcXVlcnlfY29tcGxldGU7CiAJaW50IHJldCA9IDA7CiAKLQlpZiAoIVJlc3VsdCkKKwlpZiAoIXJlc3VsdCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQkqUmVzdWx0U2l6ZSA9IDA7Ci0JcmVxdWVzdCA9IEdldFJuZGlzUmVxdWVzdChEZXZpY2UsIFJFTU9URV9ORElTX1FVRVJZX01TRywKKwkqcmVzdWx0X3NpemUgPSAwOworCXJlcXVlc3QgPSBnZXRfcm5kaXNfcmVxdWVzdChkZXYsIFJFTU9URV9ORElTX1FVRVJZX01TRywKIAkJCVJORElTX01FU1NBR0VfU0laRShzdHJ1Y3Qgcm5kaXNfcXVlcnlfcmVxdWVzdCkpOwogCWlmICghcmVxdWVzdCkgewogCQlyZXQgPSAtMTsKQEAgLTQ4Nyw3MSArNDk3LDcxIEBACiAJfQogCiAJLyogU2V0dXAgdGhlIHJuZGlzIHF1ZXJ5ICovCi0JcXVlcnkgPSAmcmVxdWVzdC0+UmVxdWVzdE1lc3NhZ2UuTWVzc2FnZS5RdWVyeVJlcXVlc3Q7Ci0JcXVlcnktPk9pZCA9IE9pZDsKLQlxdWVyeS0+SW5mb3JtYXRpb25CdWZmZXJPZmZzZXQgPSBzaXplb2Yoc3RydWN0IHJuZGlzX3F1ZXJ5X3JlcXVlc3QpOwotCXF1ZXJ5LT5JbmZvcm1hdGlvbkJ1ZmZlckxlbmd0aCA9IDA7Ci0JcXVlcnktPkRldmljZVZjSGFuZGxlID0gMDsKKwlxdWVyeSA9ICZyZXF1ZXN0LT5yZXF1ZXN0X21zZy5tc2cucXVlcnlfcmVxOworCXF1ZXJ5LT5vaWQgPSBvaWQ7CisJcXVlcnktPmluZm9fYnVmX29mZnNldCA9IHNpemVvZihzdHJ1Y3Qgcm5kaXNfcXVlcnlfcmVxdWVzdCk7CisJcXVlcnktPmluZm9fYnVmbGVuID0gMDsKKwlxdWVyeS0+ZGV2X3ZjX2hhbmRsZSA9IDA7CiAKLQlyZXQgPSBSbmRpc0ZpbHRlclNlbmRSZXF1ZXN0KERldmljZSwgcmVxdWVzdCk7CisJcmV0ID0gcm5kaXNfZmlsdGVyX3NlbmRfcmVxdWVzdChkZXYsIHJlcXVlc3QpOwogCWlmIChyZXQgIT0gMCkKIAkJZ290byBDbGVhbnVwOwogCi0Jb3NkX1dhaXRFdmVudFdhaXQocmVxdWVzdC0+V2FpdEV2ZW50KTsKKwlvc2Rfd2FpdGV2ZW50X3dhaXQocmVxdWVzdC0+d2FpdGV2ZW50KTsKIAogCS8qIENvcHkgdGhlIHJlc3BvbnNlIGJhY2sgKi8KLQlxdWVyeUNvbXBsZXRlID0gJnJlcXVlc3QtPlJlc3BvbnNlTWVzc2FnZS5NZXNzYWdlLlF1ZXJ5Q29tcGxldGU7CisJcXVlcnlfY29tcGxldGUgPSAmcmVxdWVzdC0+cmVzcG9uc2VfbXNnLm1zZy5xdWVyeV9jb21wbGV0ZTsKIAotCWlmIChxdWVyeUNvbXBsZXRlLT5JbmZvcm1hdGlvbkJ1ZmZlckxlbmd0aCA+IGlucmVzdWx0U2l6ZSkgeworCWlmIChxdWVyeV9jb21wbGV0ZS0+aW5mb19idWZsZW4gPiBpbnJlc3VsdF9zaXplKSB7CiAJCXJldCA9IC0xOwogCQlnb3RvIENsZWFudXA7CiAJfQogCi0JbWVtY3B5KFJlc3VsdCwKLQkgICAgICAgKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpcXVlcnlDb21wbGV0ZSArCi0JCQkgcXVlcnlDb21wbGV0ZS0+SW5mb3JtYXRpb25CdWZmZXJPZmZzZXQpLAotCSAgICAgICBxdWVyeUNvbXBsZXRlLT5JbmZvcm1hdGlvbkJ1ZmZlckxlbmd0aCk7CisJbWVtY3B5KHJlc3VsdCwKKwkgICAgICAgKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpcXVlcnlfY29tcGxldGUgKworCQkJIHF1ZXJ5X2NvbXBsZXRlLT5pbmZvX2J1Zl9vZmZzZXQpLAorCSAgICAgICBxdWVyeV9jb21wbGV0ZS0+aW5mb19idWZsZW4pOwogCi0JKlJlc3VsdFNpemUgPSBxdWVyeUNvbXBsZXRlLT5JbmZvcm1hdGlvbkJ1ZmZlckxlbmd0aDsKKwkqcmVzdWx0X3NpemUgPSBxdWVyeV9jb21wbGV0ZS0+aW5mb19idWZsZW47CiAKIENsZWFudXA6CiAJaWYgKHJlcXVlc3QpCi0JCVB1dFJuZGlzUmVxdWVzdChEZXZpY2UsIHJlcXVlc3QpOworCQlwdXRfcm5kaXNfcmVxdWVzdChkZXYsIHJlcXVlc3QpOwogCiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBSbmRpc0ZpbHRlclF1ZXJ5RGV2aWNlTWFjKHN0cnVjdCBybmRpc19kZXZpY2UgKkRldmljZSkKK3N0YXRpYyBpbnQgcm5kaXNfZmlsdGVyX3F1ZXJ5X2RldmljZV9tYWMoc3RydWN0IHJuZGlzX2RldmljZSAqZGV2KQogewogCXUzMiBzaXplID0gRVRIX0FMRU47CiAKLQlyZXR1cm4gUm5kaXNGaWx0ZXJRdWVyeURldmljZShEZXZpY2UsCisJcmV0dXJuIHJuZGlzX2ZpbHRlcl9xdWVyeV9kZXZpY2UoZGV2LAogCQkJCSAgICAgIFJORElTX09JRF84MDJfM19QRVJNQU5FTlRfQUREUkVTUywKLQkJCQkgICAgICBEZXZpY2UtPkh3TWFjQWRkciwgJnNpemUpOworCQkJCSAgICAgIGRldi0+aHdfbWFjX2FkciwgJnNpemUpOwogfQogCi1zdGF0aWMgaW50IFJuZGlzRmlsdGVyUXVlcnlEZXZpY2VMaW5rU3RhdHVzKHN0cnVjdCBybmRpc19kZXZpY2UgKkRldmljZSkKK3N0YXRpYyBpbnQgcm5kaXNfZmlsdGVyX3F1ZXJ5X2RldmljZV9saW5rX3N0YXR1cyhzdHJ1Y3Qgcm5kaXNfZGV2aWNlICpkZXYpCiB7CiAJdTMyIHNpemUgPSBzaXplb2YodTMyKTsKIAotCXJldHVybiBSbmRpc0ZpbHRlclF1ZXJ5RGV2aWNlKERldmljZSwKKwlyZXR1cm4gcm5kaXNfZmlsdGVyX3F1ZXJ5X2RldmljZShkZXYsCiAJCQkJICAgICAgUk5ESVNfT0lEX0dFTl9NRURJQV9DT05ORUNUX1NUQVRVUywKLQkJCQkgICAgICAmRGV2aWNlLT5MaW5rU3RhdHVzLCAmc2l6ZSk7CisJCQkJICAgICAgJmRldi0+bGlua19zdGF0LCAmc2l6ZSk7CiB9CiAKLXN0YXRpYyBpbnQgUm5kaXNGaWx0ZXJTZXRQYWNrZXRGaWx0ZXIoc3RydWN0IHJuZGlzX2RldmljZSAqRGV2aWNlLAotCQkJCSAgICAgIHUzMiBOZXdGaWx0ZXIpCitzdGF0aWMgaW50IHJuZGlzX2ZpbHRlcl9zZXRfcGFja2V0X2ZpbHRlcihzdHJ1Y3Qgcm5kaXNfZGV2aWNlICpkZXYsCisJCQkJICAgICAgdTMyIG5ld19maWx0ZXIpCiB7CiAJc3RydWN0IHJuZGlzX3JlcXVlc3QgKnJlcXVlc3Q7CiAJc3RydWN0IHJuZGlzX3NldF9yZXF1ZXN0ICpzZXQ7Ci0Jc3RydWN0IHJuZGlzX3NldF9jb21wbGV0ZSAqc2V0Q29tcGxldGU7CisJc3RydWN0IHJuZGlzX3NldF9jb21wbGV0ZSAqc2V0X2NvbXBsZXRlOwogCXUzMiBzdGF0dXM7CiAJaW50IHJldDsKIAogCS8qIEFTU0VSVChSTkRJU19NRVNTQUdFX1NJWkUoc3RydWN0IHJuZGlzX3NldF9yZXF1ZXN0KSArIHNpemVvZih1MzIpIDw9ICovCiAJLyogCXNpemVvZihzdHJ1Y3Qgcm5kaXNfbWVzc2FnZSkpOyAqLwogCi0JcmVxdWVzdCA9IEdldFJuZGlzUmVxdWVzdChEZXZpY2UsIFJFTU9URV9ORElTX1NFVF9NU0csCisJcmVxdWVzdCA9IGdldF9ybmRpc19yZXF1ZXN0KGRldiwgUkVNT1RFX05ESVNfU0VUX01TRywKIAkJCVJORElTX01FU1NBR0VfU0laRShzdHJ1Y3Qgcm5kaXNfc2V0X3JlcXVlc3QpICsKIAkJCXNpemVvZih1MzIpKTsKIAlpZiAoIXJlcXVlc3QpIHsKQEAgLTU2MCwxOSArNTcwLDE5IEBACiAJfQogCiAJLyogU2V0dXAgdGhlIHJuZGlzIHNldCAqLwotCXNldCA9ICZyZXF1ZXN0LT5SZXF1ZXN0TWVzc2FnZS5NZXNzYWdlLlNldFJlcXVlc3Q7Ci0Jc2V0LT5PaWQgPSBSTkRJU19PSURfR0VOX0NVUlJFTlRfUEFDS0VUX0ZJTFRFUjsKLQlzZXQtPkluZm9ybWF0aW9uQnVmZmVyTGVuZ3RoID0gc2l6ZW9mKHUzMik7Ci0Jc2V0LT5JbmZvcm1hdGlvbkJ1ZmZlck9mZnNldCA9IHNpemVvZihzdHJ1Y3Qgcm5kaXNfc2V0X3JlcXVlc3QpOworCXNldCA9ICZyZXF1ZXN0LT5yZXF1ZXN0X21zZy5tc2cuc2V0X3JlcTsKKwlzZXQtPm9pZCA9IFJORElTX09JRF9HRU5fQ1VSUkVOVF9QQUNLRVRfRklMVEVSOworCXNldC0+aW5mb19idWZsZW4gPSBzaXplb2YodTMyKTsKKwlzZXQtPmluZm9fYnVmX29mZnNldCA9IHNpemVvZihzdHJ1Y3Qgcm5kaXNfc2V0X3JlcXVlc3QpOwogCiAJbWVtY3B5KCh2b2lkICopKHVuc2lnbmVkIGxvbmcpc2V0ICsgc2l6ZW9mKHN0cnVjdCBybmRpc19zZXRfcmVxdWVzdCksCi0JICAgICAgICZOZXdGaWx0ZXIsIHNpemVvZih1MzIpKTsKKwkgICAgICAgJm5ld19maWx0ZXIsIHNpemVvZih1MzIpKTsKIAotCXJldCA9IFJuZGlzRmlsdGVyU2VuZFJlcXVlc3QoRGV2aWNlLCByZXF1ZXN0KTsKKwlyZXQgPSBybmRpc19maWx0ZXJfc2VuZF9yZXF1ZXN0KGRldiwgcmVxdWVzdCk7CiAJaWYgKHJldCAhPSAwKQogCQlnb3RvIENsZWFudXA7CiAKLQlyZXQgPSBvc2RfV2FpdEV2ZW50V2FpdEV4KHJlcXVlc3QtPldhaXRFdmVudCwgMjAwMC8qMnNlYyovKTsKKwlyZXQgPSBvc2Rfd2FpdGV2ZW50X3dhaXRleChyZXF1ZXN0LT53YWl0ZXZlbnQsIDIwMDAvKjJzZWMqLyk7CiAJaWYgKCFyZXQpIHsKIAkJcmV0ID0gLTE7CiAJCURQUklOVF9FUlIoTkVUVlNDLCAidGltZW91dCBiZWZvcmUgd2UgZ290IGEgc2V0IHJlc3BvbnNlLi4uIik7CkBAIC01ODQsMjcgKzU5NCwyNyBAQAogCX0gZWxzZSB7CiAJCWlmIChyZXQgPiAwKQogCQkJcmV0ID0gMDsKLQkJc2V0Q29tcGxldGUgPSAmcmVxdWVzdC0+UmVzcG9uc2VNZXNzYWdlLk1lc3NhZ2UuU2V0Q29tcGxldGU7Ci0JCXN0YXR1cyA9IHNldENvbXBsZXRlLT5TdGF0dXM7CisJCXNldF9jb21wbGV0ZSA9ICZyZXF1ZXN0LT5yZXNwb25zZV9tc2cubXNnLnNldF9jb21wbGV0ZTsKKwkJc3RhdHVzID0gc2V0X2NvbXBsZXRlLT5zdGF0dXM7CiAJfQogCiBDbGVhbnVwOgogCWlmIChyZXF1ZXN0KQotCQlQdXRSbmRpc1JlcXVlc3QoRGV2aWNlLCByZXF1ZXN0KTsKKwkJcHV0X3JuZGlzX3JlcXVlc3QoZGV2LCByZXF1ZXN0KTsKIEV4aXQ6CiAJcmV0dXJuIHJldDsKIH0KIAotaW50IFJuZGlzRmlsdGVySW5pdChzdHJ1Y3QgbmV0dnNjX2RyaXZlciAqRHJpdmVyKQoraW50IHJuZGlzX2ZpbHRlcl9pbml0KHN0cnVjdCBuZXR2c2NfZHJpdmVyICpkcnYpCiB7CiAJRFBSSU5UX0RCRyhORVRWU0MsICJzaXplb2Yoc3RydWN0IHJuZGlzX2ZpbHRlcl9wYWNrZXQpID09ICV6ZCIsCiAJCSAgIHNpemVvZihzdHJ1Y3Qgcm5kaXNfZmlsdGVyX3BhY2tldCkpOwogCi0JRHJpdmVyLT5SZXF1ZXN0RXh0U2l6ZSA9IHNpemVvZihzdHJ1Y3Qgcm5kaXNfZmlsdGVyX3BhY2tldCk7CisJZHJ2LT5yZXFfZXh0X3NpemUgPSBzaXplb2Yoc3RydWN0IHJuZGlzX2ZpbHRlcl9wYWNrZXQpOwogCiAJLyogRHJpdmVyLT5Db250ZXh0ID0gcm5kaXNEcml2ZXI7ICovCiAKLQltZW1zZXQoJmdSbmRpc0ZpbHRlciwgMCwgc2l6ZW9mKHN0cnVjdCBybmRpc19maWx0ZXJfZHJpdmVyX29iamVjdCkpOworCW1lbXNldCgmcm5kaXNfZmlsdGVyLCAwLCBzaXplb2Yoc3RydWN0IHJuZGlzX2ZpbHRlcl9kcml2ZXJfb2JqZWN0KSk7CiAKIAkvKnJuZGlzRHJpdmVyLT5Ecml2ZXIgPSBEcml2ZXI7CiAKQEAgLTYxMiwzOCArNjIyLDM4IEBACiAJcm5kaXNEcml2ZXItPk9uTGlua1N0YXR1c0NoYW5nZWQgPSBEcml2ZXItPk9uTGlua1N0YXR1c0NoYW5nZWQ7Ki8KIAogCS8qIFNhdmUgdGhlIG9yaWdpbmFsIGRpc3BhdGNoIGhhbmRsZXJzIGJlZm9yZSB3ZSBvdmVycmlkZSBpdCAqLwotCWdSbmRpc0ZpbHRlci5Jbm5lckRyaXZlci5CYXNlLk9uRGV2aWNlQWRkID0gRHJpdmVyLT5CYXNlLk9uRGV2aWNlQWRkOwotCWdSbmRpc0ZpbHRlci5Jbm5lckRyaXZlci5CYXNlLk9uRGV2aWNlUmVtb3ZlID0KLQkJCQkJRHJpdmVyLT5CYXNlLk9uRGV2aWNlUmVtb3ZlOwotCWdSbmRpc0ZpbHRlci5Jbm5lckRyaXZlci5CYXNlLk9uQ2xlYW51cCA9IERyaXZlci0+QmFzZS5PbkNsZWFudXA7CisJcm5kaXNfZmlsdGVyLmlubmVyX2Rydi5iYXNlLk9uRGV2aWNlQWRkID0gZHJ2LT5iYXNlLk9uRGV2aWNlQWRkOworCXJuZGlzX2ZpbHRlci5pbm5lcl9kcnYuYmFzZS5PbkRldmljZVJlbW92ZSA9CisJCQkJCWRydi0+YmFzZS5PbkRldmljZVJlbW92ZTsKKwlybmRpc19maWx0ZXIuaW5uZXJfZHJ2LmJhc2UuT25DbGVhbnVwID0gZHJ2LT5iYXNlLk9uQ2xlYW51cDsKIAogCS8qIEFTU0VSVChEcml2ZXItPk9uU2VuZCk7ICovCiAJLyogQVNTRVJUKERyaXZlci0+T25SZWNlaXZlQ2FsbGJhY2spOyAqLwotCWdSbmRpc0ZpbHRlci5Jbm5lckRyaXZlci5PblNlbmQgPSBEcml2ZXItPk9uU2VuZDsKLQlnUm5kaXNGaWx0ZXIuSW5uZXJEcml2ZXIuT25SZWNlaXZlQ2FsbGJhY2sgPSBEcml2ZXItPk9uUmVjZWl2ZUNhbGxiYWNrOwotCWdSbmRpc0ZpbHRlci5Jbm5lckRyaXZlci5PbkxpbmtTdGF0dXNDaGFuZ2VkID0KLQkJCQkJRHJpdmVyLT5PbkxpbmtTdGF0dXNDaGFuZ2VkOworCXJuZGlzX2ZpbHRlci5pbm5lcl9kcnYuc2VuZCA9IGRydi0+c2VuZDsKKwlybmRpc19maWx0ZXIuaW5uZXJfZHJ2LnJlY3ZfY2IgPSBkcnYtPnJlY3ZfY2I7CisJcm5kaXNfZmlsdGVyLmlubmVyX2Rydi5saW5rX3N0YXR1c19jaGFuZ2UgPQorCQkJCQlkcnYtPmxpbmtfc3RhdHVzX2NoYW5nZTsKIAogCS8qIE92ZXJyaWRlICovCi0JRHJpdmVyLT5CYXNlLk9uRGV2aWNlQWRkID0gUm5kaXNGaWx0ZXJPbkRldmljZUFkZDsKLQlEcml2ZXItPkJhc2UuT25EZXZpY2VSZW1vdmUgPSBSbmRpc0ZpbHRlck9uRGV2aWNlUmVtb3ZlOwotCURyaXZlci0+QmFzZS5PbkNsZWFudXAgPSBSbmRpc0ZpbHRlck9uQ2xlYW51cDsKLQlEcml2ZXItPk9uU2VuZCA9IFJuZGlzRmlsdGVyT25TZW5kOworCWRydi0+YmFzZS5PbkRldmljZUFkZCA9IHJuZGlzX2ZpbHRlX2RldmljZV9hZGQ7CisJZHJ2LT5iYXNlLk9uRGV2aWNlUmVtb3ZlID0gcm5kaXNfZmlsdGVyX2RldmljZV9yZW1vdmU7CisJZHJ2LT5iYXNlLk9uQ2xlYW51cCA9IHJuZGlzX2ZpbHRlcl9jbGVhbnVwOworCWRydi0+c2VuZCA9IHJuZGlzX2ZpbHRlcl9zZW5kOwogCS8qIERyaXZlci0+UXVlcnlMaW5rU3RhdHVzID0gUm5kaXNGaWx0ZXJRdWVyeURldmljZUxpbmtTdGF0dXM7ICovCi0JRHJpdmVyLT5PblJlY2VpdmVDYWxsYmFjayA9IFJuZGlzRmlsdGVyT25SZWNlaXZlOworCWRydi0+cmVjdl9jYiA9IHJuZGlzX2ZpbHRlcl9yZWNlaXZlOwogCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgUm5kaXNGaWx0ZXJJbml0RGV2aWNlKHN0cnVjdCBybmRpc19kZXZpY2UgKkRldmljZSkKK3N0YXRpYyBpbnQgcm5kaXNfZmlsdGVyX2luaXRfZGV2aWNlKHN0cnVjdCBybmRpc19kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3Qgcm5kaXNfcmVxdWVzdCAqcmVxdWVzdDsKIAlzdHJ1Y3Qgcm5kaXNfaW5pdGlhbGl6ZV9yZXF1ZXN0ICppbml0OwotCXN0cnVjdCBybmRpc19pbml0aWFsaXplX2NvbXBsZXRlICppbml0Q29tcGxldGU7CisJc3RydWN0IHJuZGlzX2luaXRpYWxpemVfY29tcGxldGUgKmluaXRfY29tcGxldGU7CiAJdTMyIHN0YXR1czsKIAlpbnQgcmV0OwogCi0JcmVxdWVzdCA9IEdldFJuZGlzUmVxdWVzdChEZXZpY2UsIFJFTU9URV9ORElTX0lOSVRJQUxJWkVfTVNHLAorCXJlcXVlc3QgPSBnZXRfcm5kaXNfcmVxdWVzdChkZXYsIFJFTU9URV9ORElTX0lOSVRJQUxJWkVfTVNHLAogCQkJUk5ESVNfTUVTU0FHRV9TSVpFKHN0cnVjdCBybmRpc19pbml0aWFsaXplX3JlcXVlc3QpKTsKIAlpZiAoIXJlcXVlc3QpIHsKIAkJcmV0ID0gLTE7CkBAIC02NTEsMTA1ICs2NjEsMTA1IEBACiAJfQogCiAJLyogU2V0dXAgdGhlIHJuZGlzIHNldCAqLwotCWluaXQgPSAmcmVxdWVzdC0+UmVxdWVzdE1lc3NhZ2UuTWVzc2FnZS5Jbml0aWFsaXplUmVxdWVzdDsKLQlpbml0LT5NYWpvclZlcnNpb24gPSBSTkRJU19NQUpPUl9WRVJTSU9OOwotCWluaXQtPk1pbm9yVmVyc2lvbiA9IFJORElTX01JTk9SX1ZFUlNJT047CisJaW5pdCA9ICZyZXF1ZXN0LT5yZXF1ZXN0X21zZy5tc2cuaW5pdF9yZXE7CisJaW5pdC0+bWFqb3JfdmVyID0gUk5ESVNfTUFKT1JfVkVSU0lPTjsKKwlpbml0LT5taW5vcl92ZXIgPSBSTkRJU19NSU5PUl9WRVJTSU9OOwogCS8qIEZJWE1FOiBVc2UgMTUzNiAtIHJvdW5kZWQgZXRoZXJuZXQgZnJhbWUgc2l6ZSAqLwotCWluaXQtPk1heFRyYW5zZmVyU2l6ZSA9IDIwNDg7CisJaW5pdC0+bWF4X3hmZXJfc2l6ZSA9IDIwNDg7CiAKLQlEZXZpY2UtPlN0YXRlID0gUk5ESVNfREVWX0lOSVRJQUxJWklORzsKKwlkZXYtPnN0YXRlID0gUk5ESVNfREVWX0lOSVRJQUxJWklORzsKIAotCXJldCA9IFJuZGlzRmlsdGVyU2VuZFJlcXVlc3QoRGV2aWNlLCByZXF1ZXN0KTsKKwlyZXQgPSBybmRpc19maWx0ZXJfc2VuZF9yZXF1ZXN0KGRldiwgcmVxdWVzdCk7CiAJaWYgKHJldCAhPSAwKSB7Ci0JCURldmljZS0+U3RhdGUgPSBSTkRJU19ERVZfVU5JTklUSUFMSVpFRDsKKwkJZGV2LT5zdGF0ZSA9IFJORElTX0RFVl9VTklOSVRJQUxJWkVEOwogCQlnb3RvIENsZWFudXA7CiAJfQogCi0Jb3NkX1dhaXRFdmVudFdhaXQocmVxdWVzdC0+V2FpdEV2ZW50KTsKKwlvc2Rfd2FpdGV2ZW50X3dhaXQocmVxdWVzdC0+d2FpdGV2ZW50KTsKIAotCWluaXRDb21wbGV0ZSA9ICZyZXF1ZXN0LT5SZXNwb25zZU1lc3NhZ2UuTWVzc2FnZS5Jbml0aWFsaXplQ29tcGxldGU7Ci0Jc3RhdHVzID0gaW5pdENvbXBsZXRlLT5TdGF0dXM7CisJaW5pdF9jb21wbGV0ZSA9ICZyZXF1ZXN0LT5yZXNwb25zZV9tc2cubXNnLmluaXRfY29tcGxldGU7CisJc3RhdHVzID0gaW5pdF9jb21wbGV0ZS0+c3RhdHVzOwogCWlmIChzdGF0dXMgPT0gUk5ESVNfU1RBVFVTX1NVQ0NFU1MpIHsKLQkJRGV2aWNlLT5TdGF0ZSA9IFJORElTX0RFVl9JTklUSUFMSVpFRDsKKwkJZGV2LT5zdGF0ZSA9IFJORElTX0RFVl9JTklUSUFMSVpFRDsKIAkJcmV0ID0gMDsKIAl9IGVsc2UgewotCQlEZXZpY2UtPlN0YXRlID0gUk5ESVNfREVWX1VOSU5JVElBTElaRUQ7CisJCWRldi0+c3RhdGUgPSBSTkRJU19ERVZfVU5JTklUSUFMSVpFRDsKIAkJcmV0ID0gLTE7CiAJfQogCiBDbGVhbnVwOgogCWlmIChyZXF1ZXN0KQotCQlQdXRSbmRpc1JlcXVlc3QoRGV2aWNlLCByZXF1ZXN0KTsKKwkJcHV0X3JuZGlzX3JlcXVlc3QoZGV2LCByZXF1ZXN0KTsKIAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyB2b2lkIFJuZGlzRmlsdGVySGFsdERldmljZShzdHJ1Y3Qgcm5kaXNfZGV2aWNlICpEZXZpY2UpCitzdGF0aWMgdm9pZCBybmRpc19maWx0ZXJfaGFsdF9kZXZpY2Uoc3RydWN0IHJuZGlzX2RldmljZSAqZGV2KQogewogCXN0cnVjdCBybmRpc19yZXF1ZXN0ICpyZXF1ZXN0OwogCXN0cnVjdCBybmRpc19oYWx0X3JlcXVlc3QgKmhhbHQ7CiAKIAkvKiBBdHRlbXB0IHRvIGRvIGEgcm5kaXMgZGV2aWNlIGhhbHQgKi8KLQlyZXF1ZXN0ID0gR2V0Um5kaXNSZXF1ZXN0KERldmljZSwgUkVNT1RFX05ESVNfSEFMVF9NU0csCisJcmVxdWVzdCA9IGdldF9ybmRpc19yZXF1ZXN0KGRldiwgUkVNT1RFX05ESVNfSEFMVF9NU0csCiAJCQkJUk5ESVNfTUVTU0FHRV9TSVpFKHN0cnVjdCBybmRpc19oYWx0X3JlcXVlc3QpKTsKIAlpZiAoIXJlcXVlc3QpCiAJCWdvdG8gQ2xlYW51cDsKIAogCS8qIFNldHVwIHRoZSBybmRpcyBzZXQgKi8KLQloYWx0ID0gJnJlcXVlc3QtPlJlcXVlc3RNZXNzYWdlLk1lc3NhZ2UuSGFsdFJlcXVlc3Q7Ci0JaGFsdC0+UmVxdWVzdElkID0gYXRvbWljX2luY19yZXR1cm4oJkRldmljZS0+TmV3UmVxdWVzdElkKTsKKwloYWx0ID0gJnJlcXVlc3QtPnJlcXVlc3RfbXNnLm1zZy5oYWx0X3JlcTsKKwloYWx0LT5yZXFfaWQgPSBhdG9taWNfaW5jX3JldHVybigmZGV2LT5uZXdfcmVxX2lkKTsKIAogCS8qIElnbm9yZSByZXR1cm4gc2luY2UgdGhpcyBtc2cgaXMgb3B0aW9uYWwuICovCi0JUm5kaXNGaWx0ZXJTZW5kUmVxdWVzdChEZXZpY2UsIHJlcXVlc3QpOworCXJuZGlzX2ZpbHRlcl9zZW5kX3JlcXVlc3QoZGV2LCByZXF1ZXN0KTsKIAotCURldmljZS0+U3RhdGUgPSBSTkRJU19ERVZfVU5JTklUSUFMSVpFRDsKKwlkZXYtPnN0YXRlID0gUk5ESVNfREVWX1VOSU5JVElBTElaRUQ7CiAKIENsZWFudXA6CiAJaWYgKHJlcXVlc3QpCi0JCVB1dFJuZGlzUmVxdWVzdChEZXZpY2UsIHJlcXVlc3QpOworCQlwdXRfcm5kaXNfcmVxdWVzdChkZXYsIHJlcXVlc3QpOwogCXJldHVybjsKIH0KIAotc3RhdGljIGludCBSbmRpc0ZpbHRlck9wZW5EZXZpY2Uoc3RydWN0IHJuZGlzX2RldmljZSAqRGV2aWNlKQorc3RhdGljIGludCBybmRpc19maWx0ZXJfb3Blbl9kZXZpY2Uoc3RydWN0IHJuZGlzX2RldmljZSAqZGV2KQogewogCWludCByZXQ7CiAKLQlpZiAoRGV2aWNlLT5TdGF0ZSAhPSBSTkRJU19ERVZfSU5JVElBTElaRUQpCisJaWYgKGRldi0+c3RhdGUgIT0gUk5ESVNfREVWX0lOSVRJQUxJWkVEKQogCQlyZXR1cm4gMDsKIAotCXJldCA9IFJuZGlzRmlsdGVyU2V0UGFja2V0RmlsdGVyKERldmljZSwKKwlyZXQgPSBybmRpc19maWx0ZXJfc2V0X3BhY2tldF9maWx0ZXIoZGV2LAogCQkJCQkgTkRJU19QQUNLRVRfVFlQRV9CUk9BRENBU1QgfAogCQkJCQkgTkRJU19QQUNLRVRfVFlQRV9BTExfTVVMVElDQVNUIHwKIAkJCQkJIE5ESVNfUEFDS0VUX1RZUEVfRElSRUNURUQpOwogCWlmIChyZXQgPT0gMCkKLQkJRGV2aWNlLT5TdGF0ZSA9IFJORElTX0RFVl9EQVRBSU5JVElBTElaRUQ7CisJCWRldi0+c3RhdGUgPSBSTkRJU19ERVZfREFUQUlOSVRJQUxJWkVEOwogCiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBSbmRpc0ZpbHRlckNsb3NlRGV2aWNlKHN0cnVjdCBybmRpc19kZXZpY2UgKkRldmljZSkKK3N0YXRpYyBpbnQgcm5kaXNfZmlsdGVyX2Nsb3NlX2RldmljZShzdHJ1Y3Qgcm5kaXNfZGV2aWNlICpkZXYpCiB7CiAJaW50IHJldDsKIAotCWlmIChEZXZpY2UtPlN0YXRlICE9IFJORElTX0RFVl9EQVRBSU5JVElBTElaRUQpCisJaWYgKGRldi0+c3RhdGUgIT0gUk5ESVNfREVWX0RBVEFJTklUSUFMSVpFRCkKIAkJcmV0dXJuIDA7CiAKLQlyZXQgPSBSbmRpc0ZpbHRlclNldFBhY2tldEZpbHRlcihEZXZpY2UsIDApOworCXJldCA9IHJuZGlzX2ZpbHRlcl9zZXRfcGFja2V0X2ZpbHRlcihkZXYsIDApOwogCWlmIChyZXQgPT0gMCkKLQkJRGV2aWNlLT5TdGF0ZSA9IFJORElTX0RFVl9JTklUSUFMSVpFRDsKKwkJZGV2LT5zdGF0ZSA9IFJORElTX0RFVl9JTklUSUFMSVpFRDsKIAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgUm5kaXNGaWx0ZXJPbkRldmljZUFkZChzdHJ1Y3QgaHZfZGV2aWNlICpEZXZpY2UsCi0JCQkJICB2b2lkICpBZGRpdGlvbmFsSW5mbykKK3N0YXRpYyBpbnQgcm5kaXNfZmlsdGVfZGV2aWNlX2FkZChzdHJ1Y3QgaHZfZGV2aWNlICpkZXYsCisJCQkJICB2b2lkICphZGRpdGlvbmFsX2luZm8pCiB7CiAJaW50IHJldDsKIAlzdHJ1Y3QgbmV0dnNjX2RldmljZSAqbmV0RGV2aWNlOwogCXN0cnVjdCBybmRpc19kZXZpY2UgKnJuZGlzRGV2aWNlOwotCXN0cnVjdCBuZXR2c2NfZGV2aWNlX2luZm8gKmRldmljZUluZm8gPSBBZGRpdGlvbmFsSW5mbzsKKwlzdHJ1Y3QgbmV0dnNjX2RldmljZV9pbmZvICpkZXZpY2VJbmZvID0gYWRkaXRpb25hbF9pbmZvOwogCi0Jcm5kaXNEZXZpY2UgPSBHZXRSbmRpc0RldmljZSgpOworCXJuZGlzRGV2aWNlID0gZ2V0X3JuZGlzX2RldmljZSgpOwogCWlmICghcm5kaXNEZXZpY2UpCiAJCXJldHVybiAtMTsKIApAQCAtNzYwLDcgKzc3MCw3IEBACiAJICogTk9URSEgT25jZSB0aGUgY2hhbm5lbCBpcyBjcmVhdGVkLCB3ZSBtYXkgZ2V0IGEgcmVjZWl2ZSBjYWxsYmFjawogCSAqIChSbmRpc0ZpbHRlck9uUmVjZWl2ZSgpKSBiZWZvcmUgdGhpcyBjYWxsIGlzIGNvbXBsZXRlZAogCSAqLwotCXJldCA9IGdSbmRpc0ZpbHRlci5Jbm5lckRyaXZlci5CYXNlLk9uRGV2aWNlQWRkKERldmljZSwgQWRkaXRpb25hbEluZm8pOworCXJldCA9IHJuZGlzX2ZpbHRlci5pbm5lcl9kcnYuYmFzZS5PbkRldmljZUFkZChkZXYsIGFkZGl0aW9uYWxfaW5mbyk7CiAJaWYgKHJldCAhPSAwKSB7CiAJCWtmcmVlKHJuZGlzRGV2aWNlKTsKIAkJcmV0dXJuIHJldDsKQEAgLTc2OCwxNSArNzc4LDE1IEBACiAKIAogCS8qIEluaXRpYWxpemUgdGhlIHJuZGlzIGRldmljZSAqLwotCW5ldERldmljZSA9IERldmljZS0+RXh0ZW5zaW9uOworCW5ldERldmljZSA9IGRldi0+RXh0ZW5zaW9uOwogCS8qIEFTU0VSVChuZXREZXZpY2UpOyAqLwogCS8qIEFTU0VSVChuZXREZXZpY2UtPkRldmljZSk7ICovCiAKLQluZXREZXZpY2UtPkV4dGVuc2lvbiA9IHJuZGlzRGV2aWNlOwotCXJuZGlzRGV2aWNlLT5OZXREZXZpY2UgPSBuZXREZXZpY2U7CisJbmV0RGV2aWNlLT5leHRlbnNpb24gPSBybmRpc0RldmljZTsKKwlybmRpc0RldmljZS0+bmV0X2RldiA9IG5ldERldmljZTsKIAogCS8qIFNlbmQgdGhlIHJuZGlzIGluaXRpYWxpemF0aW9uIG1lc3NhZ2UgKi8KLQlyZXQgPSBSbmRpc0ZpbHRlckluaXREZXZpY2Uocm5kaXNEZXZpY2UpOworCXJldCA9IHJuZGlzX2ZpbHRlcl9pbml0X2RldmljZShybmRpc0RldmljZSk7CiAJaWYgKHJldCAhPSAwKSB7CiAJCS8qCiAJCSAqIFRPRE86IElmIHJuZGlzIGluaXQgZmFpbGVkLCB3ZSB3aWxsIG5lZWQgdG8gc2h1dCBkb3duIHRoZQpAQCAtNzg1LDcgKzc5NSw3IEBACiAJfQogCiAJLyogR2V0IHRoZSBtYWMgYWRkcmVzcyAqLwotCXJldCA9IFJuZGlzRmlsdGVyUXVlcnlEZXZpY2VNYWMocm5kaXNEZXZpY2UpOworCXJldCA9IHJuZGlzX2ZpbHRlcl9xdWVyeV9kZXZpY2VfbWFjKHJuZGlzRGV2aWNlKTsKIAlpZiAocmV0ICE9IDApIHsKIAkJLyoKIAkJICogVE9ETzogc2h1dGRvd24gcm5kaXMgZGV2aWNlIGFuZCB0aGUgY2hhbm5lbApAQCAtNzkzLDYyICs4MDMsNjIgQEAKIAl9CiAKIAlEUFJJTlRfSU5GTyhORVRWU0MsICJEZXZpY2UgMHglcCBtYWMgYWRkciAlcE0iLAotCQkgICAgcm5kaXNEZXZpY2UsIHJuZGlzRGV2aWNlLT5Id01hY0FkZHIpOworCQkgICAgcm5kaXNEZXZpY2UsIHJuZGlzRGV2aWNlLT5od19tYWNfYWRyKTsKIAotCW1lbWNweShkZXZpY2VJbmZvLT5NYWNBZGRyLCBybmRpc0RldmljZS0+SHdNYWNBZGRyLCBFVEhfQUxFTik7CisJbWVtY3B5KGRldmljZUluZm8tPm1hY19hZHIsIHJuZGlzRGV2aWNlLT5od19tYWNfYWRyLCBFVEhfQUxFTik7CiAKLQlSbmRpc0ZpbHRlclF1ZXJ5RGV2aWNlTGlua1N0YXR1cyhybmRpc0RldmljZSk7CisJcm5kaXNfZmlsdGVyX3F1ZXJ5X2RldmljZV9saW5rX3N0YXR1cyhybmRpc0RldmljZSk7CiAKLQlkZXZpY2VJbmZvLT5MaW5rU3RhdGUgPSBybmRpc0RldmljZS0+TGlua1N0YXR1czsKKwlkZXZpY2VJbmZvLT5saW5rX3N0YXRlID0gcm5kaXNEZXZpY2UtPmxpbmtfc3RhdDsKIAlEUFJJTlRfSU5GTyhORVRWU0MsICJEZXZpY2UgMHglcCBsaW5rIHN0YXRlICVzIiwgcm5kaXNEZXZpY2UsCi0JCSAgICAoKGRldmljZUluZm8tPkxpbmtTdGF0ZSkgPyAoImRvd24iKSA6ICgidXAiKSkpOworCQkgICAgKChkZXZpY2VJbmZvLT5saW5rX3N0YXRlKSA/ICgiZG93biIpIDogKCJ1cCIpKSk7CiAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IFJuZGlzRmlsdGVyT25EZXZpY2VSZW1vdmUoc3RydWN0IGh2X2RldmljZSAqRGV2aWNlKQorc3RhdGljIGludCBybmRpc19maWx0ZXJfZGV2aWNlX3JlbW92ZShzdHJ1Y3QgaHZfZGV2aWNlICpkZXYpCiB7Ci0Jc3RydWN0IG5ldHZzY19kZXZpY2UgKm5ldERldmljZSA9IERldmljZS0+RXh0ZW5zaW9uOwotCXN0cnVjdCBybmRpc19kZXZpY2UgKnJuZGlzRGV2aWNlID0gbmV0RGV2aWNlLT5FeHRlbnNpb247CisJc3RydWN0IG5ldHZzY19kZXZpY2UgKm5ldF9kZXYgPSBkZXYtPkV4dGVuc2lvbjsKKwlzdHJ1Y3Qgcm5kaXNfZGV2aWNlICpybmRpc19kZXYgPSBuZXRfZGV2LT5leHRlbnNpb247CiAKIAkvKiBIYWx0IGFuZCByZWxlYXNlIHRoZSBybmRpcyBkZXZpY2UgKi8KLQlSbmRpc0ZpbHRlckhhbHREZXZpY2Uocm5kaXNEZXZpY2UpOworCXJuZGlzX2ZpbHRlcl9oYWx0X2RldmljZShybmRpc19kZXYpOwogCi0Ja2ZyZWUocm5kaXNEZXZpY2UpOwotCW5ldERldmljZS0+RXh0ZW5zaW9uID0gTlVMTDsKKwlrZnJlZShybmRpc19kZXYpOworCW5ldF9kZXYtPmV4dGVuc2lvbiA9IE5VTEw7CiAKIAkvKiBQYXNzIGNvbnRyb2wgdG8gaW5uZXIgZHJpdmVyIHRvIHJlbW92ZSB0aGUgZGV2aWNlICovCi0JZ1JuZGlzRmlsdGVyLklubmVyRHJpdmVyLkJhc2UuT25EZXZpY2VSZW1vdmUoRGV2aWNlKTsKKwlybmRpc19maWx0ZXIuaW5uZXJfZHJ2LmJhc2UuT25EZXZpY2VSZW1vdmUoZGV2KTsKIAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBSbmRpc0ZpbHRlck9uQ2xlYW51cChzdHJ1Y3QgaHZfZHJpdmVyICpEcml2ZXIpCitzdGF0aWMgdm9pZCBybmRpc19maWx0ZXJfY2xlYW51cChzdHJ1Y3QgaHZfZHJpdmVyICpkcnYpCiB7CiB9CiAKLWludCBSbmRpc0ZpbHRlck9uT3BlbihzdHJ1Y3QgaHZfZGV2aWNlICpEZXZpY2UpCitpbnQgcm5kaXNfZmlsdGVyX29wZW4oc3RydWN0IGh2X2RldmljZSAqZGV2KQogewotCXN0cnVjdCBuZXR2c2NfZGV2aWNlICpuZXREZXZpY2UgPSBEZXZpY2UtPkV4dGVuc2lvbjsKKwlzdHJ1Y3QgbmV0dnNjX2RldmljZSAqbmV0RGV2aWNlID0gZGV2LT5FeHRlbnNpb247CiAKIAlpZiAoIW5ldERldmljZSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlyZXR1cm4gUm5kaXNGaWx0ZXJPcGVuRGV2aWNlKG5ldERldmljZS0+RXh0ZW5zaW9uKTsKKwlyZXR1cm4gcm5kaXNfZmlsdGVyX29wZW5fZGV2aWNlKG5ldERldmljZS0+ZXh0ZW5zaW9uKTsKIH0KIAotaW50IFJuZGlzRmlsdGVyT25DbG9zZShzdHJ1Y3QgaHZfZGV2aWNlICpEZXZpY2UpCitpbnQgcm5kaXNfZmlsdGVyX2Nsb3NlKHN0cnVjdCBodl9kZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3QgbmV0dnNjX2RldmljZSAqbmV0RGV2aWNlID0gRGV2aWNlLT5FeHRlbnNpb247CisJc3RydWN0IG5ldHZzY19kZXZpY2UgKm5ldERldmljZSA9IGRldi0+RXh0ZW5zaW9uOwogCiAJaWYgKCFuZXREZXZpY2UpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JcmV0dXJuIFJuZGlzRmlsdGVyQ2xvc2VEZXZpY2UobmV0RGV2aWNlLT5FeHRlbnNpb24pOworCXJldHVybiBybmRpc19maWx0ZXJfY2xvc2VfZGV2aWNlKG5ldERldmljZS0+ZXh0ZW5zaW9uKTsKIH0KIAotc3RhdGljIGludCBSbmRpc0ZpbHRlck9uU2VuZChzdHJ1Y3QgaHZfZGV2aWNlICpEZXZpY2UsCi0JCQkgICAgIHN0cnVjdCBodl9uZXR2c2NfcGFja2V0ICpQYWNrZXQpCitzdGF0aWMgaW50IHJuZGlzX2ZpbHRlcl9zZW5kKHN0cnVjdCBodl9kZXZpY2UgKmRldiwKKwkJCSAgICAgc3RydWN0IGh2X25ldHZzY19wYWNrZXQgKnBrdCkKIHsKIAlpbnQgcmV0OwogCXN0cnVjdCBybmRpc19maWx0ZXJfcGFja2V0ICpmaWx0ZXJQYWNrZXQ7CkBAIC04NTcsNjIgKzg2Nyw2MiBAQAogCXUzMiBybmRpc01lc3NhZ2VTaXplOwogCiAJLyogQWRkIHRoZSBybmRpcyBoZWFkZXIgKi8KLQlmaWx0ZXJQYWNrZXQgPSAoc3RydWN0IHJuZGlzX2ZpbHRlcl9wYWNrZXQgKilQYWNrZXQtPkV4dGVuc2lvbjsKKwlmaWx0ZXJQYWNrZXQgPSAoc3RydWN0IHJuZGlzX2ZpbHRlcl9wYWNrZXQgKilwa3QtPmV4dGVuc2lvbjsKIAkvKiBBU1NFUlQoZmlsdGVyUGFja2V0KTsgKi8KIAogCW1lbXNldChmaWx0ZXJQYWNrZXQsIDAsIHNpemVvZihzdHJ1Y3Qgcm5kaXNfZmlsdGVyX3BhY2tldCkpOwogCi0Jcm5kaXNNZXNzYWdlID0gJmZpbHRlclBhY2tldC0+TWVzc2FnZTsKKwlybmRpc01lc3NhZ2UgPSAmZmlsdGVyUGFja2V0LT5tc2c7CiAJcm5kaXNNZXNzYWdlU2l6ZSA9IFJORElTX01FU1NBR0VfU0laRShzdHJ1Y3Qgcm5kaXNfcGFja2V0KTsKIAotCXJuZGlzTWVzc2FnZS0+TmRpc01lc3NhZ2VUeXBlID0gUkVNT1RFX05ESVNfUEFDS0VUX01TRzsKLQlybmRpc01lc3NhZ2UtPk1lc3NhZ2VMZW5ndGggPSBQYWNrZXQtPlRvdGFsRGF0YUJ1ZmZlckxlbmd0aCArCisJcm5kaXNNZXNzYWdlLT5uZGlzX21zZ190eXBlID0gUkVNT1RFX05ESVNfUEFDS0VUX01TRzsKKwlybmRpc01lc3NhZ2UtPm1zZ19sZW4gPSBwa3QtPnRvdGFsX2RhdGFfYnVmbGVuICsKIAkJCQkgICAgICBybmRpc01lc3NhZ2VTaXplOwogCi0Jcm5kaXNQYWNrZXQgPSAmcm5kaXNNZXNzYWdlLT5NZXNzYWdlLlBhY2tldDsKLQlybmRpc1BhY2tldC0+RGF0YU9mZnNldCA9IHNpemVvZihzdHJ1Y3Qgcm5kaXNfcGFja2V0KTsKLQlybmRpc1BhY2tldC0+RGF0YUxlbmd0aCA9IFBhY2tldC0+VG90YWxEYXRhQnVmZmVyTGVuZ3RoOworCXJuZGlzUGFja2V0ID0gJnJuZGlzTWVzc2FnZS0+bXNnLnBrdDsKKwlybmRpc1BhY2tldC0+ZGF0YV9vZmZzZXQgPSBzaXplb2Yoc3RydWN0IHJuZGlzX3BhY2tldCk7CisJcm5kaXNQYWNrZXQtPmRhdGFfbGVuID0gcGt0LT50b3RhbF9kYXRhX2J1ZmxlbjsKIAotCVBhY2tldC0+SXNEYXRhUGFja2V0ID0gdHJ1ZTsKLQlQYWNrZXQtPlBhZ2VCdWZmZXJzWzBdLlBmbiA9IHZpcnRfdG9fcGh5cyhybmRpc01lc3NhZ2UpID4+IFBBR0VfU0hJRlQ7Ci0JUGFja2V0LT5QYWdlQnVmZmVyc1swXS5PZmZzZXQgPQorCXBrdC0+aXNfZGF0YV9wa3QgPSB0cnVlOworCXBrdC0+cGFnZV9idWZbMF0uUGZuID0gdmlydF90b19waHlzKHJuZGlzTWVzc2FnZSkgPj4gUEFHRV9TSElGVDsKKwlwa3QtPnBhZ2VfYnVmWzBdLk9mZnNldCA9CiAJCQkodW5zaWduZWQgbG9uZylybmRpc01lc3NhZ2UgJiAoUEFHRV9TSVpFLTEpOwotCVBhY2tldC0+UGFnZUJ1ZmZlcnNbMF0uTGVuZ3RoID0gcm5kaXNNZXNzYWdlU2l6ZTsKKwlwa3QtPnBhZ2VfYnVmWzBdLkxlbmd0aCA9IHJuZGlzTWVzc2FnZVNpemU7CiAKIAkvKiBTYXZlIHRoZSBwYWNrZXQgc2VuZCBjb21wbGV0aW9uIGFuZCBjb250ZXh0ICovCi0JZmlsdGVyUGFja2V0LT5PbkNvbXBsZXRpb24gPSBQYWNrZXQtPkNvbXBsZXRpb24uU2VuZC5PblNlbmRDb21wbGV0aW9uOwotCWZpbHRlclBhY2tldC0+Q29tcGxldGlvbkNvbnRleHQgPQotCQkJCVBhY2tldC0+Q29tcGxldGlvbi5TZW5kLlNlbmRDb21wbGV0aW9uQ29udGV4dDsKKwlmaWx0ZXJQYWNrZXQtPmNvbXBsZXRpb24gPSBwa3QtPmNvbXBsZXRpb24uc2VuZC5zZW5kX2NvbXBsZXRpb247CisJZmlsdGVyUGFja2V0LT5jb21wbGV0aW9uX2N0eCA9CisJCQkJcGt0LT5jb21wbGV0aW9uLnNlbmQuc2VuZF9jb21wbGV0aW9uX2N0eDsKIAogCS8qIFVzZSBvdXJzICovCi0JUGFja2V0LT5Db21wbGV0aW9uLlNlbmQuT25TZW5kQ29tcGxldGlvbiA9IFJuZGlzRmlsdGVyT25TZW5kQ29tcGxldGlvbjsKLQlQYWNrZXQtPkNvbXBsZXRpb24uU2VuZC5TZW5kQ29tcGxldGlvbkNvbnRleHQgPSBmaWx0ZXJQYWNrZXQ7CisJcGt0LT5jb21wbGV0aW9uLnNlbmQuc2VuZF9jb21wbGV0aW9uID0gcm5kaXNfZmlsdGVyX3NlbmRfY29tcGxldGlvbjsKKwlwa3QtPmNvbXBsZXRpb24uc2VuZC5zZW5kX2NvbXBsZXRpb25fY3R4ID0gZmlsdGVyUGFja2V0OwogCi0JcmV0ID0gZ1JuZGlzRmlsdGVyLklubmVyRHJpdmVyLk9uU2VuZChEZXZpY2UsIFBhY2tldCk7CisJcmV0ID0gcm5kaXNfZmlsdGVyLmlubmVyX2Rydi5zZW5kKGRldiwgcGt0KTsKIAlpZiAocmV0ICE9IDApIHsKIAkJLyoKIAkJICogUmVzZXQgdGhlIGNvbXBsZXRpb24gdG8gb3JpZ2luYWxzIHRvIGFsbG93IHJldHJpZXMgZnJvbQogCQkgKiBhYm92ZQogCQkgKi8KLQkJUGFja2V0LT5Db21wbGV0aW9uLlNlbmQuT25TZW5kQ29tcGxldGlvbiA9Ci0JCQkJZmlsdGVyUGFja2V0LT5PbkNvbXBsZXRpb247Ci0JCVBhY2tldC0+Q29tcGxldGlvbi5TZW5kLlNlbmRDb21wbGV0aW9uQ29udGV4dCA9Ci0JCQkJZmlsdGVyUGFja2V0LT5Db21wbGV0aW9uQ29udGV4dDsKKwkJcGt0LT5jb21wbGV0aW9uLnNlbmQuc2VuZF9jb21wbGV0aW9uID0KKwkJCQlmaWx0ZXJQYWNrZXQtPmNvbXBsZXRpb247CisJCXBrdC0+Y29tcGxldGlvbi5zZW5kLnNlbmRfY29tcGxldGlvbl9jdHggPQorCQkJCWZpbHRlclBhY2tldC0+Y29tcGxldGlvbl9jdHg7CiAJfQogCiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHZvaWQgUm5kaXNGaWx0ZXJPblNlbmRDb21wbGV0aW9uKHZvaWQgKkNvbnRleHQpCitzdGF0aWMgdm9pZCBybmRpc19maWx0ZXJfc2VuZF9jb21wbGV0aW9uKHZvaWQgKmN0eCkKIHsKLQlzdHJ1Y3Qgcm5kaXNfZmlsdGVyX3BhY2tldCAqZmlsdGVyUGFja2V0ID0gQ29udGV4dDsKKwlzdHJ1Y3Qgcm5kaXNfZmlsdGVyX3BhY2tldCAqZmlsdGVyUGFja2V0ID0gY3R4OwogCiAJLyogUGFzcyBpdCBiYWNrIHRvIHRoZSBvcmlnaW5hbCBoYW5kbGVyICovCi0JZmlsdGVyUGFja2V0LT5PbkNvbXBsZXRpb24oZmlsdGVyUGFja2V0LT5Db21wbGV0aW9uQ29udGV4dCk7CisJZmlsdGVyUGFja2V0LT5jb21wbGV0aW9uKGZpbHRlclBhY2tldC0+Y29tcGxldGlvbl9jdHgpOwogfQogCiAKLXN0YXRpYyB2b2lkIFJuZGlzRmlsdGVyT25TZW5kUmVxdWVzdENvbXBsZXRpb24odm9pZCAqQ29udGV4dCkKK3N0YXRpYyB2b2lkIHJuZGlzX2ZpbHRlcl9zZW5kX3JlcXVlc3RfY29tcGxldGlvbih2b2lkICpjdHgpCiB7CiAJLyogTm9vcCAqLwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2h2L3JuZGlzX2ZpbHRlci5oIGIvZHJpdmVycy9zdGFnaW5nL2h2L3JuZGlzX2ZpbHRlci5oCmluZGV4IDc2NGI5YmYuLjRkYTE4ZjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9odi9ybmRpc19maWx0ZXIuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaHYvcm5kaXNfZmlsdGVyLmgKQEAgLTUwLDYgKzUwLDYgQEAKIAogLyogSW50ZXJmYWNlICovCiAKLWV4dGVybiBpbnQgUm5kaXNGaWx0ZXJJbml0KHN0cnVjdCBuZXR2c2NfZHJpdmVyICpkcml2ZXIpOworZXh0ZXJuIGludCBybmRpc19maWx0ZXJfaW5pdChzdHJ1Y3QgbmV0dnNjX2RyaXZlciAqZHJpdmVyKTsKIAogI2VuZGlmIC8qIF9STkRJU0ZJTFRFUl9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2h2L3N0b3J2c2MuYyBiL2RyaXZlcnMvc3RhZ2luZy9odi9zdG9ydnNjLmMKaW5kZXggMTllODdmNi4uOTI5NTExMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2h2L3N0b3J2c2MuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaHYvc3RvcnZzYy5jCkBAIC0zNCw0MyArMzQsNDMgQEAKIHN0cnVjdCBzdG9ydnNjX3JlcXVlc3RfZXh0ZW5zaW9uIHsKIAkvKiBMSVNUX0VOVFJZIExpc3RFbnRyeTsgKi8KIAotCXN0cnVjdCBodl9zdG9ydnNjX3JlcXVlc3QgKlJlcXVlc3Q7Ci0Jc3RydWN0IGh2X2RldmljZSAqRGV2aWNlOworCXN0cnVjdCBodl9zdG9ydnNjX3JlcXVlc3QgKnJlcXVlc3Q7CisJc3RydWN0IGh2X2RldmljZSAqZGV2aWNlOwogCiAJLyogU3luY2hyb25pemUgdGhlIHJlcXVlc3QvcmVzcG9uc2UgaWYgbmVlZGVkICovCi0Jc3RydWN0IG9zZF93YWl0ZXZlbnQgKldhaXRFdmVudDsKKwlzdHJ1Y3Qgb3NkX3dhaXRldmVudCAqd2FpdF9ldmVudDsKIAotCXN0cnVjdCB2c3Rvcl9wYWNrZXQgVlN0b3JQYWNrZXQ7CisJc3RydWN0IHZzdG9yX3BhY2tldCB2c3Rvcl9wYWNrZXQ7CiB9OwogCiAvKiBBIHN0b3J2c2MgZGV2aWNlIGlzIGEgZGV2aWNlIG9iamVjdCB0aGF0IGNvbnRhaW5zIGEgdm1idXMgY2hhbm5lbCAqLwogc3RydWN0IHN0b3J2c2NfZGV2aWNlIHsKLQlzdHJ1Y3QgaHZfZGV2aWNlICpEZXZpY2U7CisJc3RydWN0IGh2X2RldmljZSAqZGV2aWNlOwogCiAJLyogMCBpbmRpY2F0ZXMgdGhlIGRldmljZSBpcyBiZWluZyBkZXN0cm95ZWQgKi8KLQlhdG9taWNfdCBSZWZDb3VudDsKKwlhdG9taWNfdCByZWZfY291bnQ7CiAKLQlhdG9taWNfdCBOdW1PdXRzdGFuZGluZ1JlcXVlc3RzOworCWF0b21pY190IG51bV9vdXRzdGFuZGluZ19yZXE7CiAKIAkvKgogCSAqIEVhY2ggdW5pcXVlIFBvcnQvUGF0aC9UYXJnZXQgcmVwcmVzZW50cyAxIGNoYW5uZWwgaWUgc2NzaQogCSAqIGNvbnRyb2xsZXIuIEluIHJlYWxpdHksIHRoZSBwYXRoaWQsIHRhcmdldGlkIGlzIGFsd2F5cyAwCiAJICogYW5kIHRoZSBwb3J0IGlzIHNldCBieSB1cwogCSAqLwotCXVuc2lnbmVkIGludCBQb3J0TnVtYmVyOwotCXVuc2lnbmVkIGNoYXIgUGF0aElkOwotCXVuc2lnbmVkIGNoYXIgVGFyZ2V0SWQ7CisJdW5zaWduZWQgaW50IHBvcnRfbnVtYmVyOworCXVuc2lnbmVkIGNoYXIgcGF0aF9pZDsKKwl1bnNpZ25lZCBjaGFyIHRhcmdldF9pZDsKIAogCS8qIExJU1RfRU5UUlkgT3V0c3RhbmRpbmdSZXF1ZXN0TGlzdDsgKi8KIAkvKiBIQU5ETEUgT3V0c3RhbmRpbmdSZXF1ZXN0TG9jazsgKi8KIAogCS8qIFVzZWQgZm9yIHZzYy92c3AgY2hhbm5lbCByZXNldCBwcm9jZXNzICovCi0Jc3RydWN0IHN0b3J2c2NfcmVxdWVzdF9leHRlbnNpb24gSW5pdFJlcXVlc3Q7Ci0Jc3RydWN0IHN0b3J2c2NfcmVxdWVzdF9leHRlbnNpb24gUmVzZXRSZXF1ZXN0OworCXN0cnVjdCBzdG9ydnNjX3JlcXVlc3RfZXh0ZW5zaW9uIGluaXRfcmVxdWVzdDsKKwlzdHJ1Y3Qgc3RvcnZzY19yZXF1ZXN0X2V4dGVuc2lvbiByZXNldF9yZXF1ZXN0OwogfTsKIAogCi1zdGF0aWMgY29uc3QgY2hhciAqZ0RyaXZlck5hbWUgPSAic3RvcnZzYyI7CitzdGF0aWMgY29uc3QgY2hhciAqZ19kcml2ZXJfbmFtZSA9ICJzdG9ydnNjIjsKIAogLyoge2JhNjE2M2Q5LTA0YTEtNGQyOS1iNjA1LTcyZTJmZmIxZGM3Zn0gKi8KIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaHZfZ3VpZCBnU3RvclZzY0RldmljZVR5cGUgPSB7CkBAIC04MSwxMzEgKzgxLDEzMyBAQAogfTsKIAogCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBzdG9ydnNjX2RldmljZSAqQWxsb2NTdG9yRGV2aWNlKHN0cnVjdCBodl9kZXZpY2UgKkRldmljZSkKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHN0b3J2c2NfZGV2aWNlICphbGxvY19zdG9yX2RldmljZShzdHJ1Y3QgaHZfZGV2aWNlICpkZXZpY2UpCiB7Ci0Jc3RydWN0IHN0b3J2c2NfZGV2aWNlICpzdG9yRGV2aWNlOworCXN0cnVjdCBzdG9ydnNjX2RldmljZSAqc3Rvcl9kZXZpY2U7CiAKLQlzdG9yRGV2aWNlID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHN0b3J2c2NfZGV2aWNlKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFzdG9yRGV2aWNlKQorCXN0b3JfZGV2aWNlID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHN0b3J2c2NfZGV2aWNlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzdG9yX2RldmljZSkKIAkJcmV0dXJuIE5VTEw7CiAKIAkvKiBTZXQgdG8gMiB0byBhbGxvdyBib3RoIGluYm91bmQgYW5kIG91dGJvdW5kIHRyYWZmaWNzICovCi0JLyogKGllIEdldFN0b3JEZXZpY2UoKSBhbmQgTXVzdEdldFN0b3JEZXZpY2UoKSkgdG8gcHJvY2VlZC4gKi8KLQlhdG9taWNfY21weGNoZygmc3RvckRldmljZS0+UmVmQ291bnQsIDAsIDIpOworCS8qIChpZSBnZXRfc3Rvcl9kZXZpY2UoKSBhbmQgbXVzdF9nZXRfc3Rvcl9kZXZpY2UoKSkgdG8gcHJvY2VlZC4gKi8KKwlhdG9taWNfY21weGNoZygmc3Rvcl9kZXZpY2UtPnJlZl9jb3VudCwgMCwgMik7CiAKLQlzdG9yRGV2aWNlLT5EZXZpY2UgPSBEZXZpY2U7Ci0JRGV2aWNlLT5FeHRlbnNpb24gPSBzdG9yRGV2aWNlOworCXN0b3JfZGV2aWNlLT5kZXZpY2UgPSBkZXZpY2U7CisJZGV2aWNlLT5FeHRlbnNpb24gPSBzdG9yX2RldmljZTsKIAotCXJldHVybiBzdG9yRGV2aWNlOworCXJldHVybiBzdG9yX2RldmljZTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIEZyZWVTdG9yRGV2aWNlKHN0cnVjdCBzdG9ydnNjX2RldmljZSAqRGV2aWNlKQorc3RhdGljIGlubGluZSB2b2lkIGZyZWVfc3Rvcl9kZXZpY2Uoc3RydWN0IHN0b3J2c2NfZGV2aWNlICpkZXZpY2UpCiB7Ci0JLyogQVNTRVJUKGF0b21pY19yZWFkKCZEZXZpY2UtPlJlZkNvdW50KSA9PSAwKTsgKi8KLQlrZnJlZShEZXZpY2UpOworCS8qIEFTU0VSVChhdG9taWNfcmVhZCgmZGV2aWNlLT5yZWZfY291bnQpID09IDApOyAqLworCWtmcmVlKGRldmljZSk7CiB9CiAKIC8qIEdldCB0aGUgc3RvcmRldmljZSBvYmplY3QgaWZmIGV4aXN0cyBhbmQgaXRzIHJlZmNvdW50ID4gMSAqLwotc3RhdGljIGlubGluZSBzdHJ1Y3Qgc3RvcnZzY19kZXZpY2UgKkdldFN0b3JEZXZpY2Uoc3RydWN0IGh2X2RldmljZSAqRGV2aWNlKQorc3RhdGljIGlubGluZSBzdHJ1Y3Qgc3RvcnZzY19kZXZpY2UgKmdldF9zdG9yX2RldmljZShzdHJ1Y3QgaHZfZGV2aWNlICpkZXZpY2UpCiB7Ci0Jc3RydWN0IHN0b3J2c2NfZGV2aWNlICpzdG9yRGV2aWNlOworCXN0cnVjdCBzdG9ydnNjX2RldmljZSAqc3Rvcl9kZXZpY2U7CiAKLQlzdG9yRGV2aWNlID0gKHN0cnVjdCBzdG9ydnNjX2RldmljZSAqKURldmljZS0+RXh0ZW5zaW9uOwotCWlmIChzdG9yRGV2aWNlICYmIGF0b21pY19yZWFkKCZzdG9yRGV2aWNlLT5SZWZDb3VudCkgPiAxKQotCQlhdG9taWNfaW5jKCZzdG9yRGV2aWNlLT5SZWZDb3VudCk7CisJc3Rvcl9kZXZpY2UgPSAoc3RydWN0IHN0b3J2c2NfZGV2aWNlICopZGV2aWNlLT5FeHRlbnNpb247CisJaWYgKHN0b3JfZGV2aWNlICYmIGF0b21pY19yZWFkKCZzdG9yX2RldmljZS0+cmVmX2NvdW50KSA+IDEpCisJCWF0b21pY19pbmMoJnN0b3JfZGV2aWNlLT5yZWZfY291bnQpOwogCWVsc2UKLQkJc3RvckRldmljZSA9IE5VTEw7CisJCXN0b3JfZGV2aWNlID0gTlVMTDsKIAotCXJldHVybiBzdG9yRGV2aWNlOworCXJldHVybiBzdG9yX2RldmljZTsKIH0KIAogLyogR2V0IHRoZSBzdG9yZGV2aWNlIG9iamVjdCBpZmYgZXhpc3RzIGFuZCBpdHMgcmVmY291bnQgPiAwICovCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBzdG9ydnNjX2RldmljZSAqTXVzdEdldFN0b3JEZXZpY2Uoc3RydWN0IGh2X2RldmljZSAqRGV2aWNlKQorc3RhdGljIGlubGluZSBzdHJ1Y3Qgc3RvcnZzY19kZXZpY2UgKm11c3RfZ2V0X3N0b3JfZGV2aWNlKAorCQkJCQlzdHJ1Y3QgaHZfZGV2aWNlICpkZXZpY2UpCiB7Ci0Jc3RydWN0IHN0b3J2c2NfZGV2aWNlICpzdG9yRGV2aWNlOworCXN0cnVjdCBzdG9ydnNjX2RldmljZSAqc3Rvcl9kZXZpY2U7CiAKLQlzdG9yRGV2aWNlID0gKHN0cnVjdCBzdG9ydnNjX2RldmljZSAqKURldmljZS0+RXh0ZW5zaW9uOwotCWlmIChzdG9yRGV2aWNlICYmIGF0b21pY19yZWFkKCZzdG9yRGV2aWNlLT5SZWZDb3VudCkpCi0JCWF0b21pY19pbmMoJnN0b3JEZXZpY2UtPlJlZkNvdW50KTsKKwlzdG9yX2RldmljZSA9IChzdHJ1Y3Qgc3RvcnZzY19kZXZpY2UgKilkZXZpY2UtPkV4dGVuc2lvbjsKKwlpZiAoc3Rvcl9kZXZpY2UgJiYgYXRvbWljX3JlYWQoJnN0b3JfZGV2aWNlLT5yZWZfY291bnQpKQorCQlhdG9taWNfaW5jKCZzdG9yX2RldmljZS0+cmVmX2NvdW50KTsKIAllbHNlCi0JCXN0b3JEZXZpY2UgPSBOVUxMOworCQlzdG9yX2RldmljZSA9IE5VTEw7CiAKLQlyZXR1cm4gc3RvckRldmljZTsKKwlyZXR1cm4gc3Rvcl9kZXZpY2U7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBQdXRTdG9yRGV2aWNlKHN0cnVjdCBodl9kZXZpY2UgKkRldmljZSkKK3N0YXRpYyBpbmxpbmUgdm9pZCBwdXRfc3Rvcl9kZXZpY2Uoc3RydWN0IGh2X2RldmljZSAqZGV2aWNlKQogewotCXN0cnVjdCBzdG9ydnNjX2RldmljZSAqc3RvckRldmljZTsKKwlzdHJ1Y3Qgc3RvcnZzY19kZXZpY2UgKnN0b3JfZGV2aWNlOwogCi0Jc3RvckRldmljZSA9IChzdHJ1Y3Qgc3RvcnZzY19kZXZpY2UgKilEZXZpY2UtPkV4dGVuc2lvbjsKLQkvKiBBU1NFUlQoc3RvckRldmljZSk7ICovCisJc3Rvcl9kZXZpY2UgPSAoc3RydWN0IHN0b3J2c2NfZGV2aWNlICopZGV2aWNlLT5FeHRlbnNpb247CisJLyogQVNTRVJUKHN0b3JfZGV2aWNlKTsgKi8KIAotCWF0b21pY19kZWMoJnN0b3JEZXZpY2UtPlJlZkNvdW50KTsKLQkvKiBBU1NFUlQoYXRvbWljX3JlYWQoJnN0b3JEZXZpY2UtPlJlZkNvdW50KSk7ICovCisJYXRvbWljX2RlYygmc3Rvcl9kZXZpY2UtPnJlZl9jb3VudCk7CisJLyogQVNTRVJUKGF0b21pY19yZWFkKCZzdG9yX2RldmljZS0+cmVmX2NvdW50KSk7ICovCiB9CiAKLS8qIERyb3AgcmVmIGNvdW50IHRvIDEgdG8gZWZmZWN0aXZlbHkgZGlzYWJsZSBHZXRTdG9yRGV2aWNlKCkgKi8KLXN0YXRpYyBpbmxpbmUgc3RydWN0IHN0b3J2c2NfZGV2aWNlICpSZWxlYXNlU3RvckRldmljZShzdHJ1Y3QgaHZfZGV2aWNlICpEZXZpY2UpCisvKiBEcm9wIHJlZiBjb3VudCB0byAxIHRvIGVmZmVjdGl2ZWx5IGRpc2FibGUgZ2V0X3N0b3JfZGV2aWNlKCkgKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IHN0b3J2c2NfZGV2aWNlICpyZWxlYXNlX3N0b3JfZGV2aWNlKAorCQkJCQlzdHJ1Y3QgaHZfZGV2aWNlICpkZXZpY2UpCiB7Ci0Jc3RydWN0IHN0b3J2c2NfZGV2aWNlICpzdG9yRGV2aWNlOworCXN0cnVjdCBzdG9ydnNjX2RldmljZSAqc3Rvcl9kZXZpY2U7CiAKLQlzdG9yRGV2aWNlID0gKHN0cnVjdCBzdG9ydnNjX2RldmljZSAqKURldmljZS0+RXh0ZW5zaW9uOwotCS8qIEFTU0VSVChzdG9yRGV2aWNlKTsgKi8KKwlzdG9yX2RldmljZSA9IChzdHJ1Y3Qgc3RvcnZzY19kZXZpY2UgKilkZXZpY2UtPkV4dGVuc2lvbjsKKwkvKiBBU1NFUlQoc3Rvcl9kZXZpY2UpOyAqLwogCiAJLyogQnVzeSB3YWl0IHVudGlsIHRoZSByZWYgZHJvcCB0byAyLCB0aGVuIHNldCBpdCB0byAxICovCi0Jd2hpbGUgKGF0b21pY19jbXB4Y2hnKCZzdG9yRGV2aWNlLT5SZWZDb3VudCwgMiwgMSkgIT0gMikKKwl3aGlsZSAoYXRvbWljX2NtcHhjaGcoJnN0b3JfZGV2aWNlLT5yZWZfY291bnQsIDIsIDEpICE9IDIpCiAJCXVkZWxheSgxMDApOwogCi0JcmV0dXJuIHN0b3JEZXZpY2U7CisJcmV0dXJuIHN0b3JfZGV2aWNlOwogfQogCi0vKiBEcm9wIHJlZiBjb3VudCB0byAwLiBObyBvbmUgY2FuIHVzZSBTdG9yRGV2aWNlIG9iamVjdC4gKi8KLXN0YXRpYyBpbmxpbmUgc3RydWN0IHN0b3J2c2NfZGV2aWNlICpGaW5hbFJlbGVhc2VTdG9yRGV2aWNlKAotCQkJc3RydWN0IGh2X2RldmljZSAqRGV2aWNlKQorLyogRHJvcCByZWYgY291bnQgdG8gMC4gTm8gb25lIGNhbiB1c2Ugc3Rvcl9kZXZpY2Ugb2JqZWN0LiAqLworc3RhdGljIGlubGluZSBzdHJ1Y3Qgc3RvcnZzY19kZXZpY2UgKmZpbmFsX3JlbGVhc2Vfc3Rvcl9kZXZpY2UoCisJCQlzdHJ1Y3QgaHZfZGV2aWNlICpkZXZpY2UpCiB7Ci0Jc3RydWN0IHN0b3J2c2NfZGV2aWNlICpzdG9yRGV2aWNlOworCXN0cnVjdCBzdG9ydnNjX2RldmljZSAqc3Rvcl9kZXZpY2U7CiAKLQlzdG9yRGV2aWNlID0gKHN0cnVjdCBzdG9ydnNjX2RldmljZSAqKURldmljZS0+RXh0ZW5zaW9uOwotCS8qIEFTU0VSVChzdG9yRGV2aWNlKTsgKi8KKwlzdG9yX2RldmljZSA9IChzdHJ1Y3Qgc3RvcnZzY19kZXZpY2UgKilkZXZpY2UtPkV4dGVuc2lvbjsKKwkvKiBBU1NFUlQoc3Rvcl9kZXZpY2UpOyAqLwogCiAJLyogQnVzeSB3YWl0IHVudGlsIHRoZSByZWYgZHJvcCB0byAxLCB0aGVuIHNldCBpdCB0byAwICovCi0Jd2hpbGUgKGF0b21pY19jbXB4Y2hnKCZzdG9yRGV2aWNlLT5SZWZDb3VudCwgMSwgMCkgIT0gMSkKKwl3aGlsZSAoYXRvbWljX2NtcHhjaGcoJnN0b3JfZGV2aWNlLT5yZWZfY291bnQsIDEsIDApICE9IDEpCiAJCXVkZWxheSgxMDApOwogCi0JRGV2aWNlLT5FeHRlbnNpb24gPSBOVUxMOwotCXJldHVybiBzdG9yRGV2aWNlOworCWRldmljZS0+RXh0ZW5zaW9uID0gTlVMTDsKKwlyZXR1cm4gc3Rvcl9kZXZpY2U7CiB9CiAKLXN0YXRpYyBpbnQgU3RvclZzY0NoYW5uZWxJbml0KHN0cnVjdCBodl9kZXZpY2UgKkRldmljZSkKK3N0YXRpYyBpbnQgc3Rvcl92c2NfY2hhbm5lbF9pbml0KHN0cnVjdCBodl9kZXZpY2UgKmRldmljZSkKIHsKLQlzdHJ1Y3Qgc3RvcnZzY19kZXZpY2UgKnN0b3JEZXZpY2U7CisJc3RydWN0IHN0b3J2c2NfZGV2aWNlICpzdG9yX2RldmljZTsKIAlzdHJ1Y3Qgc3RvcnZzY19yZXF1ZXN0X2V4dGVuc2lvbiAqcmVxdWVzdDsKLQlzdHJ1Y3QgdnN0b3JfcGFja2V0ICp2c3RvclBhY2tldDsKKwlzdHJ1Y3QgdnN0b3JfcGFja2V0ICp2c3Rvcl9wYWNrZXQ7CiAJaW50IHJldDsKIAotCXN0b3JEZXZpY2UgPSBHZXRTdG9yRGV2aWNlKERldmljZSk7Ci0JaWYgKCFzdG9yRGV2aWNlKSB7CisJc3Rvcl9kZXZpY2UgPSBnZXRfc3Rvcl9kZXZpY2UoZGV2aWNlKTsKKwlpZiAoIXN0b3JfZGV2aWNlKSB7CiAJCURQUklOVF9FUlIoU1RPUlZTQywgInVuYWJsZSB0byBnZXQgc3RvciBkZXZpY2UuLi4iCiAJCQkgICAiZGV2aWNlIGJlaW5nIGRlc3Ryb3llZD8iKTsKIAkJcmV0dXJuIC0xOwogCX0KIAotCXJlcXVlc3QgPSAmc3RvckRldmljZS0+SW5pdFJlcXVlc3Q7Ci0JdnN0b3JQYWNrZXQgPSAmcmVxdWVzdC0+VlN0b3JQYWNrZXQ7CisJcmVxdWVzdCA9ICZzdG9yX2RldmljZS0+aW5pdF9yZXF1ZXN0OworCXZzdG9yX3BhY2tldCA9ICZyZXF1ZXN0LT52c3Rvcl9wYWNrZXQ7CiAKIAkvKgogCSAqIE5vdywgaW5pdGlhdGUgdGhlIHZzYy92c3AgaW5pdGlhbGl6YXRpb24gcHJvdG9jb2wgb24gdGhlIG9wZW4KIAkgKiBjaGFubmVsCiAJICovCiAJbWVtc2V0KHJlcXVlc3QsIDAsIHNpemVvZihzdHJ1Y3Qgc3RvcnZzY19yZXF1ZXN0X2V4dGVuc2lvbikpOwotCXJlcXVlc3QtPldhaXRFdmVudCA9IG9zZF9XYWl0RXZlbnRDcmVhdGUoKTsKLQlpZiAoIXJlcXVlc3QtPldhaXRFdmVudCkgeworCXJlcXVlc3QtPndhaXRfZXZlbnQgPSBvc2Rfd2FpdGV2ZW50X2NyZWF0ZSgpOworCWlmICghcmVxdWVzdC0+d2FpdF9ldmVudCkgewogCQlyZXQgPSAtRU5PTUVNOwogCQlnb3RvIG5vbWVtOwogCX0KIAotCXZzdG9yUGFja2V0LT5PcGVyYXRpb24gPSBWU3Rvck9wZXJhdGlvbkJlZ2luSW5pdGlhbGl6YXRpb247Ci0JdnN0b3JQYWNrZXQtPkZsYWdzID0gUkVRVUVTVF9DT01QTEVUSU9OX0ZMQUc7CisJdnN0b3JfcGFja2V0LT5vcGVyYXRpb24gPSBWU1RPUl9PUEVSQVRJT05fQkVHSU5fSU5JVElBTElaQVRJT047CisJdnN0b3JfcGFja2V0LT5mbGFncyA9IFJFUVVFU1RfQ09NUExFVElPTl9GTEFHOwogCiAJLypTcGlubG9ja0FjcXVpcmUoZ0RyaXZlckV4dC5wYWNrZXRMaXN0TG9jayk7CiAJSU5TRVJUX1RBSUxfTElTVCgmZ0RyaXZlckV4dC5wYWNrZXRMaXN0LCAmcGFja2V0LT5saXN0RW50cnkuZW50cnkpOwpAQCAtMjEzLDcgKzIxNSw3IEBACiAKIAlEUFJJTlRfSU5GTyhTVE9SVlNDLCAiQkVHSU5fSU5JVElBTElaQVRJT05fT1BFUkFUSU9OLi4uIik7CiAKLQlyZXQgPSB2bWJ1c19zZW5kcGFja2V0KERldmljZS0+Y2hhbm5lbCwgdnN0b3JQYWNrZXQsCisJcmV0ID0gdm1idXNfc2VuZHBhY2tldChkZXZpY2UtPmNoYW5uZWwsIHZzdG9yX3BhY2tldCwKIAkJCSAgICAgICBzaXplb2Yoc3RydWN0IHZzdG9yX3BhY2tldCksCiAJCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpcmVxdWVzdCwKIAkJCSAgICAgICBWbWJ1c1BhY2tldFR5cGVEYXRhSW5CYW5kLApAQCAtMjI0LDI3ICsyMjYsMjcgQEAKIAkJZ290byBDbGVhbnVwOwogCX0KIAotCW9zZF9XYWl0RXZlbnRXYWl0KHJlcXVlc3QtPldhaXRFdmVudCk7CisJb3NkX3dhaXRldmVudF93YWl0KHJlcXVlc3QtPndhaXRfZXZlbnQpOwogCi0JaWYgKHZzdG9yUGFja2V0LT5PcGVyYXRpb24gIT0gVlN0b3JPcGVyYXRpb25Db21wbGV0ZUlvIHx8Ci0JICAgIHZzdG9yUGFja2V0LT5TdGF0dXMgIT0gMCkgeworCWlmICh2c3Rvcl9wYWNrZXQtPm9wZXJhdGlvbiAhPSBWU1RPUl9PUEVSQVRJT05fQ09NUExFVEVfSU8gfHwKKwkgICAgdnN0b3JfcGFja2V0LT5zdGF0dXMgIT0gMCkgewogCQlEUFJJTlRfRVJSKFNUT1JWU0MsICJCRUdJTl9JTklUSUFMSVpBVElPTl9PUEVSQVRJT04gZmFpbGVkICIKIAkJCSAgICIob3AgJWQgc3RhdHVzIDB4JXgpIiwKLQkJCSAgIHZzdG9yUGFja2V0LT5PcGVyYXRpb24sIHZzdG9yUGFja2V0LT5TdGF0dXMpOworCQkJICAgdnN0b3JfcGFja2V0LT5vcGVyYXRpb24sIHZzdG9yX3BhY2tldC0+c3RhdHVzKTsKIAkJZ290byBDbGVhbnVwOwogCX0KIAogCURQUklOVF9JTkZPKFNUT1JWU0MsICJRVUVSWV9QUk9UT0NPTF9WRVJTSU9OX09QRVJBVElPTi4uLiIpOwogCiAJLyogcmV1c2UgdGhlIHBhY2tldCBmb3IgdmVyc2lvbiByYW5nZSBzdXBwb3J0ZWQgKi8KLQltZW1zZXQodnN0b3JQYWNrZXQsIDAsIHNpemVvZihzdHJ1Y3QgdnN0b3JfcGFja2V0KSk7Ci0JdnN0b3JQYWNrZXQtPk9wZXJhdGlvbiA9IFZTdG9yT3BlcmF0aW9uUXVlcnlQcm90b2NvbFZlcnNpb247Ci0JdnN0b3JQYWNrZXQtPkZsYWdzID0gUkVRVUVTVF9DT01QTEVUSU9OX0ZMQUc7CisJbWVtc2V0KHZzdG9yX3BhY2tldCwgMCwgc2l6ZW9mKHN0cnVjdCB2c3Rvcl9wYWNrZXQpKTsKKwl2c3Rvcl9wYWNrZXQtPm9wZXJhdGlvbiA9IFZTVE9SX09QRVJBVElPTl9RVUVSWV9QUk9UT0NPTF9WRVJTSU9OOworCXZzdG9yX3BhY2tldC0+ZmxhZ3MgPSBSRVFVRVNUX0NPTVBMRVRJT05fRkxBRzsKIAotCXZzdG9yUGFja2V0LT5WZXJzaW9uLk1ham9yTWlub3IgPSBWTVNUT1JfUFJPVE9DT0xfVkVSU0lPTl9DVVJSRU5UOwotCUZJTExfVk1TVE9SX1JFVklTSU9OKHZzdG9yUGFja2V0LT5WZXJzaW9uLlJldmlzaW9uKTsKKwl2c3Rvcl9wYWNrZXQtPnZlcnNpb24ubWFqb3JfbWlub3IgPSBWTVNUT1JfUFJPVE9DT0xfVkVSU0lPTl9DVVJSRU5UOworCUZJTExfVk1TVE9SX1JFVklTSU9OKHZzdG9yX3BhY2tldC0+dmVyc2lvbi5yZXZpc2lvbik7CiAKLQlyZXQgPSB2bWJ1c19zZW5kcGFja2V0KERldmljZS0+Y2hhbm5lbCwgdnN0b3JQYWNrZXQsCisJcmV0ID0gdm1idXNfc2VuZHBhY2tldChkZXZpY2UtPmNoYW5uZWwsIHZzdG9yX3BhY2tldCwKIAkJCSAgICAgICBzaXplb2Yoc3RydWN0IHZzdG9yX3BhY2tldCksCiAJCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpcmVxdWVzdCwKIAkJCSAgICAgICBWbWJ1c1BhY2tldFR5cGVEYXRhSW5CYW5kLApAQCAtMjU1LDI3ICsyNTcsMjcgQEAKIAkJZ290byBDbGVhbnVwOwogCX0KIAotCW9zZF9XYWl0RXZlbnRXYWl0KHJlcXVlc3QtPldhaXRFdmVudCk7CisJb3NkX3dhaXRldmVudF93YWl0KHJlcXVlc3QtPndhaXRfZXZlbnQpOwogCiAJLyogVE9ETzogQ2hlY2sgcmV0dXJuZWQgdmVyc2lvbiAqLwotCWlmICh2c3RvclBhY2tldC0+T3BlcmF0aW9uICE9IFZTdG9yT3BlcmF0aW9uQ29tcGxldGVJbyB8fAotCSAgICB2c3RvclBhY2tldC0+U3RhdHVzICE9IDApIHsKKwlpZiAodnN0b3JfcGFja2V0LT5vcGVyYXRpb24gIT0gVlNUT1JfT1BFUkFUSU9OX0NPTVBMRVRFX0lPIHx8CisJICAgIHZzdG9yX3BhY2tldC0+c3RhdHVzICE9IDApIHsKIAkJRFBSSU5UX0VSUihTVE9SVlNDLCAiUVVFUllfUFJPVE9DT0xfVkVSU0lPTl9PUEVSQVRJT04gZmFpbGVkICIKIAkJCSAgICIob3AgJWQgc3RhdHVzIDB4JXgpIiwKLQkJCSAgIHZzdG9yUGFja2V0LT5PcGVyYXRpb24sIHZzdG9yUGFja2V0LT5TdGF0dXMpOworCQkJICAgdnN0b3JfcGFja2V0LT5vcGVyYXRpb24sIHZzdG9yX3BhY2tldC0+c3RhdHVzKTsKIAkJZ290byBDbGVhbnVwOwogCX0KIAogCS8qIFF1ZXJ5IGNoYW5uZWwgcHJvcGVydGllcyAqLwogCURQUklOVF9JTkZPKFNUT1JWU0MsICJRVUVSWV9QUk9QRVJUSUVTX09QRVJBVElPTi4uLiIpOwogCi0JbWVtc2V0KHZzdG9yUGFja2V0LCAwLCBzaXplb2Yoc3RydWN0IHZzdG9yX3BhY2tldCkpOwotCXZzdG9yUGFja2V0LT5PcGVyYXRpb24gPSBWU3Rvck9wZXJhdGlvblF1ZXJ5UHJvcGVydGllczsKLQl2c3RvclBhY2tldC0+RmxhZ3MgPSBSRVFVRVNUX0NPTVBMRVRJT05fRkxBRzsKLQl2c3RvclBhY2tldC0+U3RvcmFnZUNoYW5uZWxQcm9wZXJ0aWVzLlBvcnROdW1iZXIgPQotCQkJCQlzdG9yRGV2aWNlLT5Qb3J0TnVtYmVyOworCW1lbXNldCh2c3Rvcl9wYWNrZXQsIDAsIHNpemVvZihzdHJ1Y3QgdnN0b3JfcGFja2V0KSk7CisJdnN0b3JfcGFja2V0LT5vcGVyYXRpb24gPSBWU1RPUl9PUEVSQVRJT05fUVVFUllfUFJPUEVSVElFUzsKKwl2c3Rvcl9wYWNrZXQtPmZsYWdzID0gUkVRVUVTVF9DT01QTEVUSU9OX0ZMQUc7CisJdnN0b3JfcGFja2V0LT5zdG9yYWdlX2NoYW5uZWxfcHJvcGVydGllcy5wb3J0X251bWJlciA9CisJCQkJCXN0b3JfZGV2aWNlLT5wb3J0X251bWJlcjsKIAotCXJldCA9IHZtYnVzX3NlbmRwYWNrZXQoRGV2aWNlLT5jaGFubmVsLCB2c3RvclBhY2tldCwKKwlyZXQgPSB2bWJ1c19zZW5kcGFja2V0KGRldmljZS0+Y2hhbm5lbCwgdnN0b3JfcGFja2V0LAogCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgdnN0b3JfcGFja2V0KSwKIAkJCSAgICAgICAodW5zaWduZWQgbG9uZylyZXF1ZXN0LAogCQkJICAgICAgIFZtYnVzUGFja2V0VHlwZURhdGFJbkJhbmQsCkBAIC0yODcsMzEgKzI4OSwzMiBAQAogCQlnb3RvIENsZWFudXA7CiAJfQogCi0Jb3NkX1dhaXRFdmVudFdhaXQocmVxdWVzdC0+V2FpdEV2ZW50KTsKKwlvc2Rfd2FpdGV2ZW50X3dhaXQocmVxdWVzdC0+d2FpdF9ldmVudCk7CiAKIAkvKiBUT0RPOiBDaGVjayByZXR1cm5lZCB2ZXJzaW9uICovCi0JaWYgKHZzdG9yUGFja2V0LT5PcGVyYXRpb24gIT0gVlN0b3JPcGVyYXRpb25Db21wbGV0ZUlvIHx8Ci0JICAgIHZzdG9yUGFja2V0LT5TdGF0dXMgIT0gMCkgeworCWlmICh2c3Rvcl9wYWNrZXQtPm9wZXJhdGlvbiAhPSBWU1RPUl9PUEVSQVRJT05fQ09NUExFVEVfSU8gfHwKKwkgICAgdnN0b3JfcGFja2V0LT5zdGF0dXMgIT0gMCkgewogCQlEUFJJTlRfRVJSKFNUT1JWU0MsICJRVUVSWV9QUk9QRVJUSUVTX09QRVJBVElPTiBmYWlsZWQgIgogCQkJICAgIihvcCAlZCBzdGF0dXMgMHgleCkiLAotCQkJICAgdnN0b3JQYWNrZXQtPk9wZXJhdGlvbiwgdnN0b3JQYWNrZXQtPlN0YXR1cyk7CisJCQkgICB2c3Rvcl9wYWNrZXQtPm9wZXJhdGlvbiwgdnN0b3JfcGFja2V0LT5zdGF0dXMpOwogCQlnb3RvIENsZWFudXA7CiAJfQogCi0Jc3RvckRldmljZS0+UGF0aElkID0gdnN0b3JQYWNrZXQtPlN0b3JhZ2VDaGFubmVsUHJvcGVydGllcy5QYXRoSWQ7Ci0Jc3RvckRldmljZS0+VGFyZ2V0SWQgPSB2c3RvclBhY2tldC0+U3RvcmFnZUNoYW5uZWxQcm9wZXJ0aWVzLlRhcmdldElkOworCXN0b3JfZGV2aWNlLT5wYXRoX2lkID0gdnN0b3JfcGFja2V0LT5zdG9yYWdlX2NoYW5uZWxfcHJvcGVydGllcy5wYXRoX2lkOworCXN0b3JfZGV2aWNlLT50YXJnZXRfaWQKKwkJPSB2c3Rvcl9wYWNrZXQtPnN0b3JhZ2VfY2hhbm5lbF9wcm9wZXJ0aWVzLnRhcmdldF9pZDsKIAogCURQUklOVF9EQkcoU1RPUlZTQywgImNoYW5uZWwgZmxhZyAweCV4LCBtYXggeGZlciBsZW4gMHgleCIsCi0JCSAgIHZzdG9yUGFja2V0LT5TdG9yYWdlQ2hhbm5lbFByb3BlcnRpZXMuRmxhZ3MsCi0JCSAgIHZzdG9yUGFja2V0LT5TdG9yYWdlQ2hhbm5lbFByb3BlcnRpZXMuTWF4VHJhbnNmZXJCeXRlcyk7CisJCSAgIHZzdG9yX3BhY2tldC0+c3RvcmFnZV9jaGFubmVsX3Byb3BlcnRpZXMuZmxhZ3MsCisJCSAgIHZzdG9yX3BhY2tldC0+c3RvcmFnZV9jaGFubmVsX3Byb3BlcnRpZXMubWF4X3RyYW5zZmVyX2J5dGVzKTsKIAogCURQUklOVF9JTkZPKFNUT1JWU0MsICJFTkRfSU5JVElBTElaQVRJT05fT1BFUkFUSU9OLi4uIik7CiAKLQltZW1zZXQodnN0b3JQYWNrZXQsIDAsIHNpemVvZihzdHJ1Y3QgdnN0b3JfcGFja2V0KSk7Ci0JdnN0b3JQYWNrZXQtPk9wZXJhdGlvbiA9IFZTdG9yT3BlcmF0aW9uRW5kSW5pdGlhbGl6YXRpb247Ci0JdnN0b3JQYWNrZXQtPkZsYWdzID0gUkVRVUVTVF9DT01QTEVUSU9OX0ZMQUc7CisJbWVtc2V0KHZzdG9yX3BhY2tldCwgMCwgc2l6ZW9mKHN0cnVjdCB2c3Rvcl9wYWNrZXQpKTsKKwl2c3Rvcl9wYWNrZXQtPm9wZXJhdGlvbiA9IFZTVE9SX09QRVJBVElPTl9FTkRfSU5JVElBTElaQVRJT047CisJdnN0b3JfcGFja2V0LT5mbGFncyA9IFJFUVVFU1RfQ09NUExFVElPTl9GTEFHOwogCi0JcmV0ID0gdm1idXNfc2VuZHBhY2tldChEZXZpY2UtPmNoYW5uZWwsIHZzdG9yUGFja2V0LAorCXJldCA9IHZtYnVzX3NlbmRwYWNrZXQoZGV2aWNlLT5jaGFubmVsLCB2c3Rvcl9wYWNrZXQsCiAJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCB2c3Rvcl9wYWNrZXQpLAogCQkJICAgICAgICh1bnNpZ25lZCBsb25nKXJlcXVlc3QsCiAJCQkgICAgICAgVm1idXNQYWNrZXRUeXBlRGF0YUluQmFuZCwKQEAgLTMyMywxMjUgKzMyNiwxMjUgQEAKIAkJZ290byBDbGVhbnVwOwogCX0KIAotCW9zZF9XYWl0RXZlbnRXYWl0KHJlcXVlc3QtPldhaXRFdmVudCk7CisJb3NkX3dhaXRldmVudF93YWl0KHJlcXVlc3QtPndhaXRfZXZlbnQpOwogCi0JaWYgKHZzdG9yUGFja2V0LT5PcGVyYXRpb24gIT0gVlN0b3JPcGVyYXRpb25Db21wbGV0ZUlvIHx8Ci0JICAgIHZzdG9yUGFja2V0LT5TdGF0dXMgIT0gMCkgeworCWlmICh2c3Rvcl9wYWNrZXQtPm9wZXJhdGlvbiAhPSBWU1RPUl9PUEVSQVRJT05fQ09NUExFVEVfSU8gfHwKKwkgICAgdnN0b3JfcGFja2V0LT5zdGF0dXMgIT0gMCkgewogCQlEUFJJTlRfRVJSKFNUT1JWU0MsICJFTkRfSU5JVElBTElaQVRJT05fT1BFUkFUSU9OIGZhaWxlZCAiCiAJCQkgICAiKG9wICVkIHN0YXR1cyAweCV4KSIsCi0JCQkgICB2c3RvclBhY2tldC0+T3BlcmF0aW9uLCB2c3RvclBhY2tldC0+U3RhdHVzKTsKKwkJCSAgIHZzdG9yX3BhY2tldC0+b3BlcmF0aW9uLCB2c3Rvcl9wYWNrZXQtPnN0YXR1cyk7CiAJCWdvdG8gQ2xlYW51cDsKIAl9CiAKIAlEUFJJTlRfSU5GTyhTVE9SVlNDLCAiKioqKiBzdG9yYWdlIGNoYW5uZWwgdXAgYW5kIHJ1bm5pbmchISAqKioqIik7CiAKIENsZWFudXA6Ci0Ja2ZyZWUocmVxdWVzdC0+V2FpdEV2ZW50KTsKLQlyZXF1ZXN0LT5XYWl0RXZlbnQgPSBOVUxMOworCWtmcmVlKHJlcXVlc3QtPndhaXRfZXZlbnQpOworCXJlcXVlc3QtPndhaXRfZXZlbnQgPSBOVUxMOwogbm9tZW06Ci0JUHV0U3RvckRldmljZShEZXZpY2UpOworCXB1dF9zdG9yX2RldmljZShkZXZpY2UpOwogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyB2b2lkIFN0b3JWc2NPbklPQ29tcGxldGlvbihzdHJ1Y3QgaHZfZGV2aWNlICpEZXZpY2UsCi0JCQkJICBzdHJ1Y3QgdnN0b3JfcGFja2V0ICpWU3RvclBhY2tldCwKLQkJCQkgIHN0cnVjdCBzdG9ydnNjX3JlcXVlc3RfZXh0ZW5zaW9uICpSZXF1ZXN0RXh0KQorc3RhdGljIHZvaWQgc3Rvcl92c2Nfb25faW9fY29tcGxldGlvbihzdHJ1Y3QgaHZfZGV2aWNlICpkZXZpY2UsCisJCQkJICBzdHJ1Y3QgdnN0b3JfcGFja2V0ICp2c3Rvcl9wYWNrZXQsCisJCQkJICBzdHJ1Y3Qgc3RvcnZzY19yZXF1ZXN0X2V4dGVuc2lvbiAqcmVxdWVzdF9leHQpCiB7CiAJc3RydWN0IGh2X3N0b3J2c2NfcmVxdWVzdCAqcmVxdWVzdDsKLQlzdHJ1Y3Qgc3RvcnZzY19kZXZpY2UgKnN0b3JEZXZpY2U7CisJc3RydWN0IHN0b3J2c2NfZGV2aWNlICpzdG9yX2RldmljZTsKIAotCXN0b3JEZXZpY2UgPSBNdXN0R2V0U3RvckRldmljZShEZXZpY2UpOwotCWlmICghc3RvckRldmljZSkgeworCXN0b3JfZGV2aWNlID0gbXVzdF9nZXRfc3Rvcl9kZXZpY2UoZGV2aWNlKTsKKwlpZiAoIXN0b3JfZGV2aWNlKSB7CiAJCURQUklOVF9FUlIoU1RPUlZTQywgInVuYWJsZSB0byBnZXQgc3RvciBkZXZpY2UuLi4iCiAJCQkgICAiZGV2aWNlIGJlaW5nIGRlc3Ryb3llZD8iKTsKIAkJcmV0dXJuOwogCX0KIAogCURQUklOVF9EQkcoU1RPUlZTQywgIklPX0NPTVBMRVRFX09QRVJBVElPTiAtIHJlcXVlc3QgZXh0ZW5zaW9uICVwICIKLQkJICAgImNvbXBsZXRlZCBieXRlcyB4ZmVyICV1IiwgUmVxdWVzdEV4dCwKLQkJICAgVlN0b3JQYWNrZXQtPlZtU3JiLkRhdGFUcmFuc2Zlckxlbmd0aCk7CisJCSAgICJjb21wbGV0ZWQgYnl0ZXMgeGZlciAldSIsIHJlcXVlc3RfZXh0LAorCQkgICB2c3Rvcl9wYWNrZXQtPnZtX3NyYi5kYXRhX3RyYW5zZmVyX2xlbmd0aCk7CiAKLQkvKiBBU1NFUlQoUmVxdWVzdEV4dCAhPSBOVUxMKTsgKi8KLQkvKiBBU1NFUlQoUmVxdWVzdEV4dC0+UmVxdWVzdCAhPSBOVUxMKTsgKi8KKwkvKiBBU1NFUlQocmVxdWVzdF9leHQgIT0gTlVMTCk7ICovCisJLyogQVNTRVJUKHJlcXVlc3RfZXh0LT5yZXF1ZXN0ICE9IE5VTEwpOyAqLwogCi0JcmVxdWVzdCA9IFJlcXVlc3RFeHQtPlJlcXVlc3Q7CisJcmVxdWVzdCA9IHJlcXVlc3RfZXh0LT5yZXF1ZXN0OwogCiAJLyogQVNTRVJUKHJlcXVlc3QtPk9uSU9Db21wbGV0aW9uICE9IE5VTEwpOyAqLwogCiAJLyogQ29weSBvdmVyIHRoZSBzdGF0dXMuLi5ldGMgKi8KLQlyZXF1ZXN0LT5TdGF0dXMgPSBWU3RvclBhY2tldC0+Vm1TcmIuU2NzaVN0YXR1czsKKwlyZXF1ZXN0LT5zdGF0dXMgPSB2c3Rvcl9wYWNrZXQtPnZtX3NyYi5zY3NpX3N0YXR1czsKIAotCWlmIChyZXF1ZXN0LT5TdGF0dXMgIT0gMCB8fCBWU3RvclBhY2tldC0+Vm1TcmIuU3JiU3RhdHVzICE9IDEpIHsKKwlpZiAocmVxdWVzdC0+c3RhdHVzICE9IDAgfHwgdnN0b3JfcGFja2V0LT52bV9zcmIuc3JiX3N0YXR1cyAhPSAxKSB7CiAJCURQUklOVF9XQVJOKFNUT1JWU0MsCiAJCQkgICAgImNtZCAweCV4IHNjc2kgc3RhdHVzIDB4JXggc3JiIHN0YXR1cyAweCV4XG4iLAotCQkJICAgIHJlcXVlc3QtPkNkYlswXSwgVlN0b3JQYWNrZXQtPlZtU3JiLlNjc2lTdGF0dXMsCi0JCQkgICAgVlN0b3JQYWNrZXQtPlZtU3JiLlNyYlN0YXR1cyk7CisJCQkgICAgcmVxdWVzdC0+Y2RiWzBdLCB2c3Rvcl9wYWNrZXQtPnZtX3NyYi5zY3NpX3N0YXR1cywKKwkJCSAgICB2c3Rvcl9wYWNrZXQtPnZtX3NyYi5zcmJfc3RhdHVzKTsKIAl9CiAKLQlpZiAoKHJlcXVlc3QtPlN0YXR1cyAmIDB4RkYpID09IDB4MDIpIHsKKwlpZiAoKHJlcXVlc3QtPnN0YXR1cyAmIDB4RkYpID09IDB4MDIpIHsKIAkJLyogQ0hFQ0tfQ09ORElUSU9OICovCi0JCWlmIChWU3RvclBhY2tldC0+Vm1TcmIuU3JiU3RhdHVzICYgMHg4MCkgeworCQlpZiAodnN0b3JfcGFja2V0LT52bV9zcmIuc3JiX3N0YXR1cyAmIDB4ODApIHsKIAkJCS8qIGF1dG9zZW5zZSBkYXRhIGF2YWlsYWJsZSAqLwogCQkJRFBSSU5UX1dBUk4oU1RPUlZTQywgInN0b3J2c2MgcGt0ICVwIGF1dG9zZW5zZSBkYXRhICIKLQkJCQkgICAgInZhbGlkIC0gbGVuICVkXG4iLCBSZXF1ZXN0RXh0LAotCQkJCSAgICBWU3RvclBhY2tldC0+Vm1TcmIuU2Vuc2VJbmZvTGVuZ3RoKTsKKwkJCQkgICAgInZhbGlkIC0gbGVuICVkXG4iLCByZXF1ZXN0X2V4dCwKKwkJCQkgICAgdnN0b3JfcGFja2V0LT52bV9zcmIuc2Vuc2VfaW5mb19sZW5ndGgpOwogCi0JCQkvKiBBU1NFUlQoVlN0b3JQYWNrZXQtPlZtU3JiLlNlbnNlSW5mb0xlbmd0aCA8PSAqLworCQkJLyogQVNTRVJUKHZzdG9yX3BhY2tldC0+dm1fc3JiLnNlbnNlX2luZm9fbGVuZ3RoIDw9ICovCiAJCQkvKiAJcmVxdWVzdC0+U2Vuc2VCdWZmZXJTaXplKTsgKi8KLQkJCW1lbWNweShyZXF1ZXN0LT5TZW5zZUJ1ZmZlciwKLQkJCSAgICAgICBWU3RvclBhY2tldC0+Vm1TcmIuU2Vuc2VEYXRhLAotCQkJICAgICAgIFZTdG9yUGFja2V0LT5WbVNyYi5TZW5zZUluZm9MZW5ndGgpOworCQkJbWVtY3B5KHJlcXVlc3QtPnNlbnNlX2J1ZmZlciwKKwkJCSAgICAgICB2c3Rvcl9wYWNrZXQtPnZtX3NyYi5zZW5zZV9kYXRhLAorCQkJICAgICAgIHZzdG9yX3BhY2tldC0+dm1fc3JiLnNlbnNlX2luZm9fbGVuZ3RoKTsKIAotCQkJcmVxdWVzdC0+U2Vuc2VCdWZmZXJTaXplID0KLQkJCQkJVlN0b3JQYWNrZXQtPlZtU3JiLlNlbnNlSW5mb0xlbmd0aDsKKwkJCXJlcXVlc3QtPnNlbnNlX2J1ZmZlcl9zaXplID0KKwkJCQkJdnN0b3JfcGFja2V0LT52bV9zcmIuc2Vuc2VfaW5mb19sZW5ndGg7CiAJCX0KIAl9CiAKIAkvKiBUT0RPOiAqLwotCXJlcXVlc3QtPkJ5dGVzWGZlciA9IFZTdG9yUGFja2V0LT5WbVNyYi5EYXRhVHJhbnNmZXJMZW5ndGg7CisJcmVxdWVzdC0+Ynl0ZXNfeGZlciA9IHZzdG9yX3BhY2tldC0+dm1fc3JiLmRhdGFfdHJhbnNmZXJfbGVuZ3RoOwogCi0JcmVxdWVzdC0+T25JT0NvbXBsZXRpb24ocmVxdWVzdCk7CisJcmVxdWVzdC0+b25faW9fY29tcGxldGlvbihyZXF1ZXN0KTsKIAotCWF0b21pY19kZWMoJnN0b3JEZXZpY2UtPk51bU91dHN0YW5kaW5nUmVxdWVzdHMpOworCWF0b21pY19kZWMoJnN0b3JfZGV2aWNlLT5udW1fb3V0c3RhbmRpbmdfcmVxKTsKIAotCVB1dFN0b3JEZXZpY2UoRGV2aWNlKTsKKwlwdXRfc3Rvcl9kZXZpY2UoZGV2aWNlKTsKIH0KIAotc3RhdGljIHZvaWQgU3RvclZzY09uUmVjZWl2ZShzdHJ1Y3QgaHZfZGV2aWNlICpEZXZpY2UsCi0JCQkgICAgIHN0cnVjdCB2c3Rvcl9wYWNrZXQgKlZTdG9yUGFja2V0LAotCQkJICAgICBzdHJ1Y3Qgc3RvcnZzY19yZXF1ZXN0X2V4dGVuc2lvbiAqUmVxdWVzdEV4dCkKK3N0YXRpYyB2b2lkIHN0b3JfdnNjX29uX3JlY2VpdmUoc3RydWN0IGh2X2RldmljZSAqZGV2aWNlLAorCQkJICAgICBzdHJ1Y3QgdnN0b3JfcGFja2V0ICp2c3Rvcl9wYWNrZXQsCisJCQkgICAgIHN0cnVjdCBzdG9ydnNjX3JlcXVlc3RfZXh0ZW5zaW9uICpyZXF1ZXN0X2V4dCkKIHsKLQlzd2l0Y2ggKFZTdG9yUGFja2V0LT5PcGVyYXRpb24pIHsKLQljYXNlIFZTdG9yT3BlcmF0aW9uQ29tcGxldGVJbzoKKwlzd2l0Y2ggKHZzdG9yX3BhY2tldC0+b3BlcmF0aW9uKSB7CisJY2FzZSBWU1RPUl9PUEVSQVRJT05fQ09NUExFVEVfSU86CiAJCURQUklOVF9EQkcoU1RPUlZTQywgIklPX0NPTVBMRVRFX09QRVJBVElPTiIpOwotCQlTdG9yVnNjT25JT0NvbXBsZXRpb24oRGV2aWNlLCBWU3RvclBhY2tldCwgUmVxdWVzdEV4dCk7CisJCXN0b3JfdnNjX29uX2lvX2NvbXBsZXRpb24oZGV2aWNlLCB2c3Rvcl9wYWNrZXQsIHJlcXVlc3RfZXh0KTsKIAkJYnJlYWs7Ci0JY2FzZSBWU3Rvck9wZXJhdGlvblJlbW92ZURldmljZToKKwljYXNlIFZTVE9SX09QRVJBVElPTl9SRU1PVkVfREVWSUNFOgogCQlEUFJJTlRfSU5GTyhTVE9SVlNDLCAiUkVNT1ZFX0RFVklDRV9PUEVSQVRJT04iKTsKIAkJLyogVE9ETzogKi8KIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgogCQlEUFJJTlRfSU5GTyhTVE9SVlNDLCAiVW5rbm93biBvcGVyYXRpb24gcmVjZWl2ZWQgLSAlZCIsCi0JCQkgICAgVlN0b3JQYWNrZXQtPk9wZXJhdGlvbik7CisJCQkgICAgdnN0b3JfcGFja2V0LT5vcGVyYXRpb24pOwogCQlicmVhazsKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIFN0b3JWc2NPbkNoYW5uZWxDYWxsYmFjayh2b2lkICpjb250ZXh0KQorc3RhdGljIHZvaWQgc3Rvcl92c2Nfb25fY2hhbm5lbF9jYWxsYmFjayh2b2lkICpjb250ZXh0KQogewogCXN0cnVjdCBodl9kZXZpY2UgKmRldmljZSA9IChzdHJ1Y3QgaHZfZGV2aWNlICopY29udGV4dDsKLQlzdHJ1Y3Qgc3RvcnZzY19kZXZpY2UgKnN0b3JEZXZpY2U7Ci0JdTMyIGJ5dGVzUmVjdmQ7Ci0JdTY0IHJlcXVlc3RJZDsKKwlzdHJ1Y3Qgc3RvcnZzY19kZXZpY2UgKnN0b3JfZGV2aWNlOworCXUzMiBieXRlc19yZWN2ZDsKKwl1NjQgcmVxdWVzdF9pZDsKIAl1bnNpZ25lZCBjaGFyIHBhY2tldFtBTElHTl9VUChzaXplb2Yoc3RydWN0IHZzdG9yX3BhY2tldCksIDgpXTsKIAlzdHJ1Y3Qgc3RvcnZzY19yZXF1ZXN0X2V4dGVuc2lvbiAqcmVxdWVzdDsKIAlpbnQgcmV0OwogCiAJLyogQVNTRVJUKGRldmljZSk7ICovCiAKLQlzdG9yRGV2aWNlID0gTXVzdEdldFN0b3JEZXZpY2UoZGV2aWNlKTsKLQlpZiAoIXN0b3JEZXZpY2UpIHsKKwlzdG9yX2RldmljZSA9IG11c3RfZ2V0X3N0b3JfZGV2aWNlKGRldmljZSk7CisJaWYgKCFzdG9yX2RldmljZSkgewogCQlEUFJJTlRfRVJSKFNUT1JWU0MsICJ1bmFibGUgdG8gZ2V0IHN0b3IgZGV2aWNlLi4uIgogCQkJICAgImRldmljZSBiZWluZyBkZXN0cm95ZWQ/Iik7CiAJCXJldHVybjsKQEAgLTQ1MCwzMiArNDUzLDMzIEBACiAJZG8gewogCQlyZXQgPSB2bWJ1c19yZWN2cGFja2V0KGRldmljZS0+Y2hhbm5lbCwgcGFja2V0LAogCQkJCSAgICAgICBBTElHTl9VUChzaXplb2Yoc3RydWN0IHZzdG9yX3BhY2tldCksIDgpLAotCQkJCSAgICAgICAmYnl0ZXNSZWN2ZCwgJnJlcXVlc3RJZCk7Ci0JCWlmIChyZXQgPT0gMCAmJiBieXRlc1JlY3ZkID4gMCkgeworCQkJCSAgICAgICAmYnl0ZXNfcmVjdmQsICZyZXF1ZXN0X2lkKTsKKwkJaWYgKHJldCA9PSAwICYmIGJ5dGVzX3JlY3ZkID4gMCkgewogCQkJRFBSSU5UX0RCRyhTVE9SVlNDLCAicmVjZWl2ZSAlZCBieXRlcyAtIHRpZCAlbGx4IiwKLQkJCQkgICBieXRlc1JlY3ZkLCByZXF1ZXN0SWQpOworCQkJCSAgIGJ5dGVzX3JlY3ZkLCByZXF1ZXN0X2lkKTsKIAotCQkJLyogQVNTRVJUKGJ5dGVzUmVjdmQgPT0gc2l6ZW9mKHN0cnVjdCB2c3Rvcl9wYWNrZXQpKTsgKi8KKwkJCS8qIEFTU0VSVChieXRlc19yZWN2ZCA9PQorCQkJCQlzaXplb2Yoc3RydWN0IHZzdG9yX3BhY2tldCkpOyAqLwogCiAJCQlyZXF1ZXN0ID0gKHN0cnVjdCBzdG9ydnNjX3JlcXVlc3RfZXh0ZW5zaW9uICopCi0JCQkJCSh1bnNpZ25lZCBsb25nKXJlcXVlc3RJZDsKKwkJCQkJKHVuc2lnbmVkIGxvbmcpcmVxdWVzdF9pZDsKIAkJCS8qIEFTU0VSVChyZXF1ZXN0KTtjICovCiAKLQkJCS8qIGlmICh2c3RvclBhY2tldC5GbGFncyAmIFNZTlRIRVRJQ19GTEFHKSAqLwotCQkJaWYgKChyZXF1ZXN0ID09ICZzdG9yRGV2aWNlLT5Jbml0UmVxdWVzdCkgfHwKLQkJCSAgICAocmVxdWVzdCA9PSAmc3RvckRldmljZS0+UmVzZXRSZXF1ZXN0KSkgeworCQkJLyogaWYgKHZzdG9yX3BhY2tldC5GbGFncyAmIFNZTlRIRVRJQ19GTEFHKSAqLworCQkJaWYgKChyZXF1ZXN0ID09ICZzdG9yX2RldmljZS0+aW5pdF9yZXF1ZXN0KSB8fAorCQkJICAgIChyZXF1ZXN0ID09ICZzdG9yX2RldmljZS0+cmVzZXRfcmVxdWVzdCkpIHsKIAkJCQkvKiBEUFJJTlRfSU5GTyhTVE9SVlNDLAogCQkJCSAqICAgICAgICAgICAgICJyZXNldCBjb21wbGV0aW9uIC0gb3BlcmF0aW9uICIKIAkJCQkgKiAgICAgICAgICAgICAiJXUgc3RhdHVzICV1IiwKLQkJCQkgKiAgICAgICAgICAgICB2c3RvclBhY2tldC5PcGVyYXRpb24sCi0JCQkJICogICAgICAgICAgICAgdnN0b3JQYWNrZXQuU3RhdHVzKTsgKi8KKwkJCQkgKiAgICAgICAgICAgICB2c3Rvcl9wYWNrZXQuT3BlcmF0aW9uLAorCQkJCSAqICAgICAgICAgICAgIHZzdG9yX3BhY2tldC5TdGF0dXMpOyAqLwogCi0JCQkJbWVtY3B5KCZyZXF1ZXN0LT5WU3RvclBhY2tldCwgcGFja2V0LAorCQkJCW1lbWNweSgmcmVxdWVzdC0+dnN0b3JfcGFja2V0LCBwYWNrZXQsCiAJCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgdnN0b3JfcGFja2V0KSk7CiAKLQkJCQlvc2RfV2FpdEV2ZW50U2V0KHJlcXVlc3QtPldhaXRFdmVudCk7CisJCQkJb3NkX3dhaXRldmVudF9zZXQocmVxdWVzdC0+d2FpdF9ldmVudCk7CiAJCQl9IGVsc2UgewotCQkJCVN0b3JWc2NPblJlY2VpdmUoZGV2aWNlLAorCQkJCXN0b3JfdnNjX29uX3JlY2VpdmUoZGV2aWNlLAogCQkJCQkJKHN0cnVjdCB2c3Rvcl9wYWNrZXQgKilwYWNrZXQsCiAJCQkJCQlyZXF1ZXN0KTsKIAkJCX0KQEAgLTQ4NSw1MiArNDg5LDU1IEBACiAJCX0KIAl9IHdoaWxlICgxKTsKIAotCVB1dFN0b3JEZXZpY2UoZGV2aWNlKTsKKwlwdXRfc3Rvcl9kZXZpY2UoZGV2aWNlKTsKIAlyZXR1cm47CiB9CiAKLXN0YXRpYyBpbnQgU3RvclZzY0Nvbm5lY3RUb1ZzcChzdHJ1Y3QgaHZfZGV2aWNlICpEZXZpY2UpCitzdGF0aWMgaW50IHN0b3JfdnNjX2Nvbm5lY3RfdG9fdnNwKHN0cnVjdCBodl9kZXZpY2UgKmRldmljZSkKIHsKIAlzdHJ1Y3Qgdm1zdG9yYWdlX2NoYW5uZWxfcHJvcGVydGllcyBwcm9wczsKLQlzdHJ1Y3Qgc3RvcnZzY19kcml2ZXJfb2JqZWN0ICpzdG9yRHJpdmVyOworCXN0cnVjdCBzdG9ydnNjX2RyaXZlcl9vYmplY3QgKnN0b3JfZHJpdmVyOwogCWludCByZXQ7CiAKLQlzdG9yRHJpdmVyID0gKHN0cnVjdCBzdG9ydnNjX2RyaXZlcl9vYmplY3QgKilEZXZpY2UtPkRyaXZlcjsKKwlzdG9yX2RyaXZlciA9IChzdHJ1Y3Qgc3RvcnZzY19kcml2ZXJfb2JqZWN0ICopZGV2aWNlLT5Ecml2ZXI7CiAJbWVtc2V0KCZwcm9wcywgMCwgc2l6ZW9mKHN0cnVjdCB2bXN0b3JhZ2VfY2hhbm5lbF9wcm9wZXJ0aWVzKSk7CiAKIAkvKiBPcGVuIHRoZSBjaGFubmVsICovCi0JcmV0ID0gdm1idXNfb3BlbihEZXZpY2UtPmNoYW5uZWwsCi0JCQkgc3RvckRyaXZlci0+UmluZ0J1ZmZlclNpemUsIHN0b3JEcml2ZXItPlJpbmdCdWZmZXJTaXplLAorCXJldCA9IHZtYnVzX29wZW4oZGV2aWNlLT5jaGFubmVsLAorCQkJIHN0b3JfZHJpdmVyLT5yaW5nX2J1ZmZlcl9zaXplLAorCQkJIHN0b3JfZHJpdmVyLT5yaW5nX2J1ZmZlcl9zaXplLAogCQkJICh2b2lkICopJnByb3BzLAogCQkJIHNpemVvZihzdHJ1Y3Qgdm1zdG9yYWdlX2NoYW5uZWxfcHJvcGVydGllcyksCi0JCQkgU3RvclZzY09uQ2hhbm5lbENhbGxiYWNrLCBEZXZpY2UpOworCQkJIHN0b3JfdnNjX29uX2NoYW5uZWxfY2FsbGJhY2ssIGRldmljZSk7CiAKIAlEUFJJTlRfREJHKFNUT1JWU0MsICJzdG9yYWdlIHByb3BzOiBwYXRoIGlkICVkLCB0Z3QgaWQgJWQsIG1heCB4ZmVyICVkIiwKLQkJICAgcHJvcHMuUGF0aElkLCBwcm9wcy5UYXJnZXRJZCwgcHJvcHMuTWF4VHJhbnNmZXJCeXRlcyk7CisJCSAgIHByb3BzLnBhdGhfaWQsIHByb3BzLnRhcmdldF9pZCwgcHJvcHMubWF4X3RyYW5zZmVyX2J5dGVzKTsKIAogCWlmIChyZXQgIT0gMCkgewogCQlEUFJJTlRfRVJSKFNUT1JWU0MsICJ1bmFibGUgdG8gb3BlbiBjaGFubmVsOiAlZCIsIHJldCk7CiAJCXJldHVybiAtMTsKIAl9CiAKLQlyZXQgPSBTdG9yVnNjQ2hhbm5lbEluaXQoRGV2aWNlKTsKKwlyZXQgPSBzdG9yX3ZzY19jaGFubmVsX2luaXQoZGV2aWNlKTsKIAogCXJldHVybiByZXQ7CiB9CiAKIC8qCi0gKiBTdG9yVnNjT25EZXZpY2VBZGQgLSBDYWxsYmFjayB3aGVuIHRoZSBkZXZpY2UgYmVsb25naW5nIHRvIHRoaXMgZHJpdmVyIGlzIGFkZGVkCisgKiBzdG9yX3ZzY19vbl9kZXZpY2VfYWRkIC0gQ2FsbGJhY2sgd2hlbiB0aGUgZGV2aWNlIGJlbG9uZ2luZyB0byB0aGlzIGRyaXZlcgorICogaXMgYWRkZWQKICAqLwotc3RhdGljIGludCBTdG9yVnNjT25EZXZpY2VBZGQoc3RydWN0IGh2X2RldmljZSAqRGV2aWNlLCB2b2lkICpBZGRpdGlvbmFsSW5mbykKK3N0YXRpYyBpbnQgc3Rvcl92c2Nfb25fZGV2aWNlX2FkZChzdHJ1Y3QgaHZfZGV2aWNlICpkZXZpY2UsCisJCQkJCXZvaWQgKmFkZGl0aW9uYWxfaW5mbykKIHsKLQlzdHJ1Y3Qgc3RvcnZzY19kZXZpY2UgKnN0b3JEZXZpY2U7CisJc3RydWN0IHN0b3J2c2NfZGV2aWNlICpzdG9yX2RldmljZTsKIAkvKiBzdHJ1Y3Qgdm1zdG9yYWdlX2NoYW5uZWxfcHJvcGVydGllcyAqcHJvcHM7ICovCi0Jc3RydWN0IHN0b3J2c2NfZGV2aWNlX2luZm8gKmRldmljZUluZm87CisJc3RydWN0IHN0b3J2c2NfZGV2aWNlX2luZm8gKmRldmljZV9pbmZvOwogCWludCByZXQgPSAwOwogCi0JZGV2aWNlSW5mbyA9IChzdHJ1Y3Qgc3RvcnZzY19kZXZpY2VfaW5mbyAqKUFkZGl0aW9uYWxJbmZvOwotCXN0b3JEZXZpY2UgPSBBbGxvY1N0b3JEZXZpY2UoRGV2aWNlKTsKLQlpZiAoIXN0b3JEZXZpY2UpIHsKKwlkZXZpY2VfaW5mbyA9IChzdHJ1Y3Qgc3RvcnZzY19kZXZpY2VfaW5mbyAqKWFkZGl0aW9uYWxfaW5mbzsKKwlzdG9yX2RldmljZSA9IGFsbG9jX3N0b3JfZGV2aWNlKGRldmljZSk7CisJaWYgKCFzdG9yX2RldmljZSkgewogCQlyZXQgPSAtMTsKIAkJZ290byBDbGVhbnVwOwogCX0KQEAgLTU1MCwxMDMgKzU1NywxMDMgQEAKIAlzdG9yQ2hhbm5lbC0+UGF0aElkID0gcHJvcHMtPlBhdGhJZDsKIAlzdG9yQ2hhbm5lbC0+VGFyZ2V0SWQgPSBwcm9wcy0+VGFyZ2V0SWQ7ICovCiAKLQlzdG9yRGV2aWNlLT5Qb3J0TnVtYmVyID0gZGV2aWNlSW5mby0+UG9ydE51bWJlcjsKKwlzdG9yX2RldmljZS0+cG9ydF9udW1iZXIgPSBkZXZpY2VfaW5mby0+cG9ydF9udW1iZXI7CiAJLyogU2VuZCBpdCBiYWNrIHVwICovCi0JcmV0ID0gU3RvclZzY0Nvbm5lY3RUb1ZzcChEZXZpY2UpOworCXJldCA9IHN0b3JfdnNjX2Nvbm5lY3RfdG9fdnNwKGRldmljZSk7CiAKLQkvKiBkZXZpY2VJbmZvLT5Qb3J0TnVtYmVyID0gc3RvckRldmljZS0+UG9ydE51bWJlcjsgKi8KLQlkZXZpY2VJbmZvLT5QYXRoSWQgPSBzdG9yRGV2aWNlLT5QYXRoSWQ7Ci0JZGV2aWNlSW5mby0+VGFyZ2V0SWQgPSBzdG9yRGV2aWNlLT5UYXJnZXRJZDsKKwkvKiBkZXZpY2VfaW5mby0+UG9ydE51bWJlciA9IHN0b3JfZGV2aWNlLT5Qb3J0TnVtYmVyOyAqLworCWRldmljZV9pbmZvLT5wYXRoX2lkID0gc3Rvcl9kZXZpY2UtPnBhdGhfaWQ7CisJZGV2aWNlX2luZm8tPnRhcmdldF9pZCA9IHN0b3JfZGV2aWNlLT50YXJnZXRfaWQ7CiAKIAlEUFJJTlRfREJHKFNUT1JWU0MsICJhc3NpZ25lZCBwb3J0ICV1LCBwYXRoICV1IHRhcmdldCAldVxuIiwKLQkJICAgc3RvckRldmljZS0+UG9ydE51bWJlciwgc3RvckRldmljZS0+UGF0aElkLAotCQkgICBzdG9yRGV2aWNlLT5UYXJnZXRJZCk7CisJCSAgIHN0b3JfZGV2aWNlLT5wb3J0X251bWJlciwgc3Rvcl9kZXZpY2UtPnBhdGhfaWQsCisJCSAgIHN0b3JfZGV2aWNlLT50YXJnZXRfaWQpOwogCiBDbGVhbnVwOgogCXJldHVybiByZXQ7CiB9CiAKIC8qCi0gKiBTdG9yVnNjT25EZXZpY2VSZW1vdmUgLSBDYWxsYmFjayB3aGVuIHRoZSBvdXIgZGV2aWNlIGlzIGJlaW5nIHJlbW92ZWQKKyAqIHN0b3JfdnNjX29uX2RldmljZV9yZW1vdmUgLSBDYWxsYmFjayB3aGVuIHRoZSBvdXIgZGV2aWNlIGlzIGJlaW5nIHJlbW92ZWQKICAqLwotc3RhdGljIGludCBTdG9yVnNjT25EZXZpY2VSZW1vdmUoc3RydWN0IGh2X2RldmljZSAqRGV2aWNlKQorc3RhdGljIGludCBzdG9yX3ZzY19vbl9kZXZpY2VfcmVtb3ZlKHN0cnVjdCBodl9kZXZpY2UgKmRldmljZSkKIHsKLQlzdHJ1Y3Qgc3RvcnZzY19kZXZpY2UgKnN0b3JEZXZpY2U7CisJc3RydWN0IHN0b3J2c2NfZGV2aWNlICpzdG9yX2RldmljZTsKIAogCURQUklOVF9JTkZPKFNUT1JWU0MsICJkaXNhYmxpbmcgc3RvcmFnZSBkZXZpY2UgKCVwKS4uLiIsCi0JCSAgICBEZXZpY2UtPkV4dGVuc2lvbik7CisJCSAgICBkZXZpY2UtPkV4dGVuc2lvbik7CiAKLQlzdG9yRGV2aWNlID0gUmVsZWFzZVN0b3JEZXZpY2UoRGV2aWNlKTsKKwlzdG9yX2RldmljZSA9IHJlbGVhc2Vfc3Rvcl9kZXZpY2UoZGV2aWNlKTsKIAogCS8qCiAJICogQXQgdGhpcyBwb2ludCwgYWxsIG91dGJvdW5kIHRyYWZmaWMgc2hvdWxkIGJlIGRpc2FibGUuIFdlCiAJICogb25seSBhbGxvdyBpbmJvdW5kIHRyYWZmaWMgKHJlc3BvbnNlcykgdG8gcHJvY2VlZCBzbyB0aGF0CiAJICogb3V0c3RhbmRpbmcgcmVxdWVzdHMgY2FuIGJlIGNvbXBsZXRlZC4KIAkgKi8KLQl3aGlsZSAoYXRvbWljX3JlYWQoJnN0b3JEZXZpY2UtPk51bU91dHN0YW5kaW5nUmVxdWVzdHMpKSB7CisJd2hpbGUgKGF0b21pY19yZWFkKCZzdG9yX2RldmljZS0+bnVtX291dHN0YW5kaW5nX3JlcSkpIHsKIAkJRFBSSU5UX0lORk8oU1RPUlZTQywgIndhaXRpbmcgZm9yICVkIHJlcXVlc3RzIHRvIGNvbXBsZXRlLi4uIiwKLQkJCSAgICBhdG9taWNfcmVhZCgmc3RvckRldmljZS0+TnVtT3V0c3RhbmRpbmdSZXF1ZXN0cykpOworCQkJICAgIGF0b21pY19yZWFkKCZzdG9yX2RldmljZS0+bnVtX291dHN0YW5kaW5nX3JlcSkpOwogCQl1ZGVsYXkoMTAwKTsKIAl9CiAKIAlEUFJJTlRfSU5GTyhTVE9SVlNDLCAicmVtb3Zpbmcgc3RvcmFnZSBkZXZpY2UgKCVwKS4uLiIsCi0JCSAgICBEZXZpY2UtPkV4dGVuc2lvbik7CisJCSAgICBkZXZpY2UtPkV4dGVuc2lvbik7CiAKLQlzdG9yRGV2aWNlID0gRmluYWxSZWxlYXNlU3RvckRldmljZShEZXZpY2UpOworCXN0b3JfZGV2aWNlID0gZmluYWxfcmVsZWFzZV9zdG9yX2RldmljZShkZXZpY2UpOwogCi0JRFBSSU5UX0lORk8oU1RPUlZTQywgInN0b3JhZ2UgZGV2aWNlICglcCkgc2FmZSB0byByZW1vdmUiLCBzdG9yRGV2aWNlKTsKKwlEUFJJTlRfSU5GTyhTVE9SVlNDLCAic3RvcmFnZSBkZXZpY2UgKCVwKSBzYWZlIHRvIHJlbW92ZSIsIHN0b3JfZGV2aWNlKTsKIAogCS8qIENsb3NlIHRoZSBjaGFubmVsICovCi0Jdm1idXNfY2xvc2UoRGV2aWNlLT5jaGFubmVsKTsKKwl2bWJ1c19jbG9zZShkZXZpY2UtPmNoYW5uZWwpOwogCi0JRnJlZVN0b3JEZXZpY2Uoc3RvckRldmljZSk7CisJZnJlZV9zdG9yX2RldmljZShzdG9yX2RldmljZSk7CiAJcmV0dXJuIDA7CiB9CiAKLWludCBTdG9yVnNjT25Ib3N0UmVzZXQoc3RydWN0IGh2X2RldmljZSAqRGV2aWNlKQoraW50IHN0b3JfdnNjX29uX2hvc3RfcmVzZXQoc3RydWN0IGh2X2RldmljZSAqZGV2aWNlKQogewotCXN0cnVjdCBzdG9ydnNjX2RldmljZSAqc3RvckRldmljZTsKKwlzdHJ1Y3Qgc3RvcnZzY19kZXZpY2UgKnN0b3JfZGV2aWNlOwogCXN0cnVjdCBzdG9ydnNjX3JlcXVlc3RfZXh0ZW5zaW9uICpyZXF1ZXN0OwotCXN0cnVjdCB2c3Rvcl9wYWNrZXQgKnZzdG9yUGFja2V0OworCXN0cnVjdCB2c3Rvcl9wYWNrZXQgKnZzdG9yX3BhY2tldDsKIAlpbnQgcmV0OwogCiAJRFBSSU5UX0lORk8oU1RPUlZTQywgInJlc2V0dGluZyBob3N0IGFkYXB0ZXIuLi4iKTsKIAotCXN0b3JEZXZpY2UgPSBHZXRTdG9yRGV2aWNlKERldmljZSk7Ci0JaWYgKCFzdG9yRGV2aWNlKSB7CisJc3Rvcl9kZXZpY2UgPSBnZXRfc3Rvcl9kZXZpY2UoZGV2aWNlKTsKKwlpZiAoIXN0b3JfZGV2aWNlKSB7CiAJCURQUklOVF9FUlIoU1RPUlZTQywgInVuYWJsZSB0byBnZXQgc3RvciBkZXZpY2UuLi4iCiAJCQkgICAiZGV2aWNlIGJlaW5nIGRlc3Ryb3llZD8iKTsKIAkJcmV0dXJuIC0xOwogCX0KIAotCXJlcXVlc3QgPSAmc3RvckRldmljZS0+UmVzZXRSZXF1ZXN0OwotCXZzdG9yUGFja2V0ID0gJnJlcXVlc3QtPlZTdG9yUGFja2V0OworCXJlcXVlc3QgPSAmc3Rvcl9kZXZpY2UtPnJlc2V0X3JlcXVlc3Q7CisJdnN0b3JfcGFja2V0ID0gJnJlcXVlc3QtPnZzdG9yX3BhY2tldDsKIAotCXJlcXVlc3QtPldhaXRFdmVudCA9IG9zZF9XYWl0RXZlbnRDcmVhdGUoKTsKLQlpZiAoIXJlcXVlc3QtPldhaXRFdmVudCkgeworCXJlcXVlc3QtPndhaXRfZXZlbnQgPSBvc2Rfd2FpdGV2ZW50X2NyZWF0ZSgpOworCWlmICghcmVxdWVzdC0+d2FpdF9ldmVudCkgewogCQlyZXQgPSAtRU5PTUVNOwogCQlnb3RvIENsZWFudXA7CiAJfQogCi0JdnN0b3JQYWNrZXQtPk9wZXJhdGlvbiA9IFZTdG9yT3BlcmF0aW9uUmVzZXRCdXM7Ci0JdnN0b3JQYWNrZXQtPkZsYWdzID0gUkVRVUVTVF9DT01QTEVUSU9OX0ZMQUc7Ci0JdnN0b3JQYWNrZXQtPlZtU3JiLlBhdGhJZCA9IHN0b3JEZXZpY2UtPlBhdGhJZDsKKwl2c3Rvcl9wYWNrZXQtPm9wZXJhdGlvbiA9IFZTVE9SX09QRVJBVElPTl9SRVNFVF9CVVM7CisJdnN0b3JfcGFja2V0LT5mbGFncyA9IFJFUVVFU1RfQ09NUExFVElPTl9GTEFHOworCXZzdG9yX3BhY2tldC0+dm1fc3JiLnBhdGhfaWQgPSBzdG9yX2RldmljZS0+cGF0aF9pZDsKIAotCXJldCA9IHZtYnVzX3NlbmRwYWNrZXQoRGV2aWNlLT5jaGFubmVsLCB2c3RvclBhY2tldCwKKwlyZXQgPSB2bWJ1c19zZW5kcGFja2V0KGRldmljZS0+Y2hhbm5lbCwgdnN0b3JfcGFja2V0LAogCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgdnN0b3JfcGFja2V0KSwKLQkJCSAgICAgICAodW5zaWduZWQgbG9uZykmc3RvckRldmljZS0+UmVzZXRSZXF1ZXN0LAorCQkJICAgICAgICh1bnNpZ25lZCBsb25nKSZzdG9yX2RldmljZS0+cmVzZXRfcmVxdWVzdCwKIAkJCSAgICAgICBWbWJ1c1BhY2tldFR5cGVEYXRhSW5CYW5kLAogCQkJICAgICAgIFZNQlVTX0RBVEFfUEFDS0VUX0ZMQUdfQ09NUExFVElPTl9SRVFVRVNURUQpOwogCWlmIChyZXQgIT0gMCkgewogCQlEUFJJTlRfRVJSKFNUT1JWU0MsICJVbmFibGUgdG8gc2VuZCByZXNldCBwYWNrZXQgJXAgcmV0ICVkIiwKLQkJCSAgIHZzdG9yUGFja2V0LCByZXQpOworCQkJICAgdnN0b3JfcGFja2V0LCByZXQpOwogCQlnb3RvIENsZWFudXA7CiAJfQogCiAJLyogRklYTUU6IEFkZCBhIHRpbWVvdXQgKi8KLQlvc2RfV2FpdEV2ZW50V2FpdChyZXF1ZXN0LT5XYWl0RXZlbnQpOworCW9zZF93YWl0ZXZlbnRfd2FpdChyZXF1ZXN0LT53YWl0X2V2ZW50KTsKIAotCWtmcmVlKHJlcXVlc3QtPldhaXRFdmVudCk7CisJa2ZyZWUocmVxdWVzdC0+d2FpdF9ldmVudCk7CiAJRFBSSU5UX0lORk8oU1RPUlZTQywgImhvc3QgYWRhcHRlciByZXNldCBjb21wbGV0ZWQiKTsKIAogCS8qCkBAIC02NTUsMTE4ICs2NjIsMTE4IEBACiAJICovCiAKIENsZWFudXA6Ci0JUHV0U3RvckRldmljZShEZXZpY2UpOworCXB1dF9zdG9yX2RldmljZShkZXZpY2UpOwogCXJldHVybiByZXQ7CiB9CiAKIC8qCi0gKiBTdG9yVnNjT25JT1JlcXVlc3QgLSBDYWxsYmFjayB0byBpbml0aWF0ZSBhbiBJL08gcmVxdWVzdAorICogc3Rvcl92c2Nfb25faW9fcmVxdWVzdCAtIENhbGxiYWNrIHRvIGluaXRpYXRlIGFuIEkvTyByZXF1ZXN0CiAgKi8KLXN0YXRpYyBpbnQgU3RvclZzY09uSU9SZXF1ZXN0KHN0cnVjdCBodl9kZXZpY2UgKkRldmljZSwKLQkJCSAgICAgIHN0cnVjdCBodl9zdG9ydnNjX3JlcXVlc3QgKlJlcXVlc3QpCitzdGF0aWMgaW50IHN0b3JfdnNjX29uX2lvX3JlcXVlc3Qoc3RydWN0IGh2X2RldmljZSAqZGV2aWNlLAorCQkJICAgICAgc3RydWN0IGh2X3N0b3J2c2NfcmVxdWVzdCAqcmVxdWVzdCkKIHsKLQlzdHJ1Y3Qgc3RvcnZzY19kZXZpY2UgKnN0b3JEZXZpY2U7Ci0Jc3RydWN0IHN0b3J2c2NfcmVxdWVzdF9leHRlbnNpb24gKnJlcXVlc3RFeHRlbnNpb247Ci0Jc3RydWN0IHZzdG9yX3BhY2tldCAqdnN0b3JQYWNrZXQ7CisJc3RydWN0IHN0b3J2c2NfZGV2aWNlICpzdG9yX2RldmljZTsKKwlzdHJ1Y3Qgc3RvcnZzY19yZXF1ZXN0X2V4dGVuc2lvbiAqcmVxdWVzdF9leHRlbnNpb247CisJc3RydWN0IHZzdG9yX3BhY2tldCAqdnN0b3JfcGFja2V0OwogCWludCByZXQgPSAwOwogCi0JcmVxdWVzdEV4dGVuc2lvbiA9Ci0JCShzdHJ1Y3Qgc3RvcnZzY19yZXF1ZXN0X2V4dGVuc2lvbiAqKVJlcXVlc3QtPkV4dGVuc2lvbjsKLQl2c3RvclBhY2tldCA9ICZyZXF1ZXN0RXh0ZW5zaW9uLT5WU3RvclBhY2tldDsKLQlzdG9yRGV2aWNlID0gR2V0U3RvckRldmljZShEZXZpY2UpOworCXJlcXVlc3RfZXh0ZW5zaW9uID0KKwkJKHN0cnVjdCBzdG9ydnNjX3JlcXVlc3RfZXh0ZW5zaW9uICopcmVxdWVzdC0+ZXh0ZW5zaW9uOworCXZzdG9yX3BhY2tldCA9ICZyZXF1ZXN0X2V4dGVuc2lvbi0+dnN0b3JfcGFja2V0OworCXN0b3JfZGV2aWNlID0gZ2V0X3N0b3JfZGV2aWNlKGRldmljZSk7CiAKIAlEUFJJTlRfREJHKFNUT1JWU0MsICJlbnRlciAtIERldmljZSAlcCwgRGV2aWNlRXh0ICVwLCBSZXF1ZXN0ICVwLCAiCi0JCSAgICJFeHRlbnNpb24gJXAiLCBEZXZpY2UsIHN0b3JEZXZpY2UsIFJlcXVlc3QsCi0JCSAgIHJlcXVlc3RFeHRlbnNpb24pOworCQkgICAiRXh0ZW5zaW9uICVwIiwgZGV2aWNlLCBzdG9yX2RldmljZSwgcmVxdWVzdCwKKwkJICAgcmVxdWVzdF9leHRlbnNpb24pOwogCiAJRFBSSU5UX0RCRyhTVE9SVlNDLCAicmVxICVwIGxlbiAlZCBidXMgJWQsIHRhcmdldCAlZCwgbHVuICVkIGNkYmxlbiAlZCIsCi0JCSAgIFJlcXVlc3QsIFJlcXVlc3QtPkRhdGFCdWZmZXIuTGVuZ3RoLCBSZXF1ZXN0LT5CdXMsCi0JCSAgIFJlcXVlc3QtPlRhcmdldElkLCBSZXF1ZXN0LT5MdW5JZCwgUmVxdWVzdC0+Q2RiTGVuKTsKKwkJICAgcmVxdWVzdCwgcmVxdWVzdC0+ZGF0YV9idWZmZXIuTGVuZ3RoLCByZXF1ZXN0LT5idXMsCisJCSAgIHJlcXVlc3QtPnRhcmdldF9pZCwgcmVxdWVzdC0+bHVuX2lkLCByZXF1ZXN0LT5jZGJfbGVuKTsKIAotCWlmICghc3RvckRldmljZSkgeworCWlmICghc3Rvcl9kZXZpY2UpIHsKIAkJRFBSSU5UX0VSUihTVE9SVlNDLCAidW5hYmxlIHRvIGdldCBzdG9yIGRldmljZS4uLiIKIAkJCSAgICJkZXZpY2UgYmVpbmcgZGVzdHJveWVkPyIpOwogCQlyZXR1cm4gLTI7CiAJfQogCi0JLyogcHJpbnRfaGV4X2R1bXBfYnl0ZXMoIiIsIERVTVBfUFJFRklYX05PTkUsIFJlcXVlc3QtPkNkYiwKLQkgKgkJCVJlcXVlc3QtPkNkYkxlbik7ICovCisJLyogcHJpbnRfaGV4X2R1bXBfYnl0ZXMoIiIsIERVTVBfUFJFRklYX05PTkUsIHJlcXVlc3QtPkNkYiwKKwkgKgkJCXJlcXVlc3QtPkNkYkxlbik7ICovCiAKLQlyZXF1ZXN0RXh0ZW5zaW9uLT5SZXF1ZXN0ID0gUmVxdWVzdDsKLQlyZXF1ZXN0RXh0ZW5zaW9uLT5EZXZpY2UgID0gRGV2aWNlOworCXJlcXVlc3RfZXh0ZW5zaW9uLT5yZXF1ZXN0ID0gcmVxdWVzdDsKKwlyZXF1ZXN0X2V4dGVuc2lvbi0+ZGV2aWNlICA9IGRldmljZTsKIAotCW1lbXNldCh2c3RvclBhY2tldCwgMCAsIHNpemVvZihzdHJ1Y3QgdnN0b3JfcGFja2V0KSk7CisJbWVtc2V0KHZzdG9yX3BhY2tldCwgMCAsIHNpemVvZihzdHJ1Y3QgdnN0b3JfcGFja2V0KSk7CiAKLQl2c3RvclBhY2tldC0+RmxhZ3MgfD0gUkVRVUVTVF9DT01QTEVUSU9OX0ZMQUc7CisJdnN0b3JfcGFja2V0LT5mbGFncyB8PSBSRVFVRVNUX0NPTVBMRVRJT05fRkxBRzsKIAotCXZzdG9yUGFja2V0LT5WbVNyYi5MZW5ndGggPSBzaXplb2Yoc3RydWN0IHZtc2NzaV9yZXF1ZXN0KTsKKwl2c3Rvcl9wYWNrZXQtPnZtX3NyYi5sZW5ndGggPSBzaXplb2Yoc3RydWN0IHZtc2NzaV9yZXF1ZXN0KTsKIAotCXZzdG9yUGFja2V0LT5WbVNyYi5Qb3J0TnVtYmVyID0gUmVxdWVzdC0+SG9zdDsKLQl2c3RvclBhY2tldC0+Vm1TcmIuUGF0aElkID0gUmVxdWVzdC0+QnVzOwotCXZzdG9yUGFja2V0LT5WbVNyYi5UYXJnZXRJZCA9IFJlcXVlc3QtPlRhcmdldElkOwotCXZzdG9yUGFja2V0LT5WbVNyYi5MdW4gPSBSZXF1ZXN0LT5MdW5JZDsKKwl2c3Rvcl9wYWNrZXQtPnZtX3NyYi5wb3J0X251bWJlciA9IHJlcXVlc3QtPmhvc3Q7CisJdnN0b3JfcGFja2V0LT52bV9zcmIucGF0aF9pZCA9IHJlcXVlc3QtPmJ1czsKKwl2c3Rvcl9wYWNrZXQtPnZtX3NyYi50YXJnZXRfaWQgPSByZXF1ZXN0LT50YXJnZXRfaWQ7CisJdnN0b3JfcGFja2V0LT52bV9zcmIubHVuID0gcmVxdWVzdC0+bHVuX2lkOwogCi0JdnN0b3JQYWNrZXQtPlZtU3JiLlNlbnNlSW5mb0xlbmd0aCA9IFNFTlNFX0JVRkZFUl9TSVpFOworCXZzdG9yX3BhY2tldC0+dm1fc3JiLnNlbnNlX2luZm9fbGVuZ3RoID0gU0VOU0VfQlVGRkVSX1NJWkU7CiAKIAkvKiBDb3B5IG92ZXIgdGhlIHNjc2kgY29tbWFuZCBkZXNjcmlwdG9yIGJsb2NrICovCi0JdnN0b3JQYWNrZXQtPlZtU3JiLkNkYkxlbmd0aCA9IFJlcXVlc3QtPkNkYkxlbjsKLQltZW1jcHkoJnZzdG9yUGFja2V0LT5WbVNyYi5DZGIsIFJlcXVlc3QtPkNkYiwgUmVxdWVzdC0+Q2RiTGVuKTsKKwl2c3Rvcl9wYWNrZXQtPnZtX3NyYi5jZGJfbGVuZ3RoID0gcmVxdWVzdC0+Y2RiX2xlbjsKKwltZW1jcHkoJnZzdG9yX3BhY2tldC0+dm1fc3JiLmNkYiwgcmVxdWVzdC0+Y2RiLCByZXF1ZXN0LT5jZGJfbGVuKTsKIAotCXZzdG9yUGFja2V0LT5WbVNyYi5EYXRhSW4gPSBSZXF1ZXN0LT5UeXBlOwotCXZzdG9yUGFja2V0LT5WbVNyYi5EYXRhVHJhbnNmZXJMZW5ndGggPSBSZXF1ZXN0LT5EYXRhQnVmZmVyLkxlbmd0aDsKKwl2c3Rvcl9wYWNrZXQtPnZtX3NyYi5kYXRhX2luID0gcmVxdWVzdC0+dHlwZTsKKwl2c3Rvcl9wYWNrZXQtPnZtX3NyYi5kYXRhX3RyYW5zZmVyX2xlbmd0aCA9IHJlcXVlc3QtPmRhdGFfYnVmZmVyLkxlbmd0aDsKIAotCXZzdG9yUGFja2V0LT5PcGVyYXRpb24gPSBWU3Rvck9wZXJhdGlvbkV4ZWN1dGVTUkI7CisJdnN0b3JfcGFja2V0LT5vcGVyYXRpb24gPSBWU1RPUl9PUEVSQVRJT05fRVhFQ1VURV9TUkI7CiAKIAlEUFJJTlRfREJHKFNUT1JWU0MsICJzcmIgLSBsZW4gJWQgcG9ydCAlZCwgcGF0aCAlZCwgdGFyZ2V0ICVkLCAiCiAJCSAgICJsdW4gJWQgc2Vuc2VsZW4gJWQgY2RibGVuICVkIiwKLQkJICAgdnN0b3JQYWNrZXQtPlZtU3JiLkxlbmd0aCwKLQkJICAgdnN0b3JQYWNrZXQtPlZtU3JiLlBvcnROdW1iZXIsCi0JCSAgIHZzdG9yUGFja2V0LT5WbVNyYi5QYXRoSWQsCi0JCSAgIHZzdG9yUGFja2V0LT5WbVNyYi5UYXJnZXRJZCwKLQkJICAgdnN0b3JQYWNrZXQtPlZtU3JiLkx1biwKLQkJICAgdnN0b3JQYWNrZXQtPlZtU3JiLlNlbnNlSW5mb0xlbmd0aCwKLQkJICAgdnN0b3JQYWNrZXQtPlZtU3JiLkNkYkxlbmd0aCk7CisJCSAgIHZzdG9yX3BhY2tldC0+dm1fc3JiLmxlbmd0aCwKKwkJICAgdnN0b3JfcGFja2V0LT52bV9zcmIucG9ydF9udW1iZXIsCisJCSAgIHZzdG9yX3BhY2tldC0+dm1fc3JiLnBhdGhfaWQsCisJCSAgIHZzdG9yX3BhY2tldC0+dm1fc3JiLnRhcmdldF9pZCwKKwkJICAgdnN0b3JfcGFja2V0LT52bV9zcmIubHVuLAorCQkgICB2c3Rvcl9wYWNrZXQtPnZtX3NyYi5zZW5zZV9pbmZvX2xlbmd0aCwKKwkJICAgdnN0b3JfcGFja2V0LT52bV9zcmIuY2RiX2xlbmd0aCk7CiAKLQlpZiAocmVxdWVzdEV4dGVuc2lvbi0+UmVxdWVzdC0+RGF0YUJ1ZmZlci5MZW5ndGgpIHsKLQkJcmV0ID0gdm1idXNfc2VuZHBhY2tldF9tdWx0aXBhZ2VidWZmZXIoRGV2aWNlLT5jaGFubmVsLAotCQkJCSZyZXF1ZXN0RXh0ZW5zaW9uLT5SZXF1ZXN0LT5EYXRhQnVmZmVyLAotCQkJCXZzdG9yUGFja2V0LAorCWlmIChyZXF1ZXN0X2V4dGVuc2lvbi0+cmVxdWVzdC0+ZGF0YV9idWZmZXIuTGVuZ3RoKSB7CisJCXJldCA9IHZtYnVzX3NlbmRwYWNrZXRfbXVsdGlwYWdlYnVmZmVyKGRldmljZS0+Y2hhbm5lbCwKKwkJCQkmcmVxdWVzdF9leHRlbnNpb24tPnJlcXVlc3QtPmRhdGFfYnVmZmVyLAorCQkJCXZzdG9yX3BhY2tldCwKIAkJCQlzaXplb2Yoc3RydWN0IHZzdG9yX3BhY2tldCksCi0JCQkJKHVuc2lnbmVkIGxvbmcpcmVxdWVzdEV4dGVuc2lvbik7CisJCQkJKHVuc2lnbmVkIGxvbmcpcmVxdWVzdF9leHRlbnNpb24pOwogCX0gZWxzZSB7Ci0JCXJldCA9IHZtYnVzX3NlbmRwYWNrZXQoRGV2aWNlLT5jaGFubmVsLCB2c3RvclBhY2tldCwKKwkJcmV0ID0gdm1idXNfc2VuZHBhY2tldChkZXZpY2UtPmNoYW5uZWwsIHZzdG9yX3BhY2tldCwKIAkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCB2c3Rvcl9wYWNrZXQpLAotCQkJCSAgICAgICAodW5zaWduZWQgbG9uZylyZXF1ZXN0RXh0ZW5zaW9uLAorCQkJCSAgICAgICAodW5zaWduZWQgbG9uZylyZXF1ZXN0X2V4dGVuc2lvbiwKIAkJCQkgICAgICAgVm1idXNQYWNrZXRUeXBlRGF0YUluQmFuZCwKIAkJCQkgICAgICAgVk1CVVNfREFUQV9QQUNLRVRfRkxBR19DT01QTEVUSU9OX1JFUVVFU1RFRCk7CiAJfQogCiAJaWYgKHJldCAhPSAwKSB7CiAJCURQUklOVF9EQkcoU1RPUlZTQywgIlVuYWJsZSB0byBzZW5kIHBhY2tldCAlcCByZXQgJWQiLAotCQkJICAgdnN0b3JQYWNrZXQsIHJldCk7CisJCQkgICB2c3Rvcl9wYWNrZXQsIHJldCk7CiAJfQogCi0JYXRvbWljX2luYygmc3RvckRldmljZS0+TnVtT3V0c3RhbmRpbmdSZXF1ZXN0cyk7CisJYXRvbWljX2luYygmc3Rvcl9kZXZpY2UtPm51bV9vdXRzdGFuZGluZ19yZXEpOwogCi0JUHV0U3RvckRldmljZShEZXZpY2UpOworCXB1dF9zdG9yX2RldmljZShkZXZpY2UpOwogCXJldHVybiByZXQ7CiB9CiAKIC8qCi0gKiBTdG9yVnNjT25DbGVhbnVwIC0gUGVyZm9ybSBhbnkgY2xlYW51cCB3aGVuIHRoZSBkcml2ZXIgaXMgcmVtb3ZlZAorICogc3Rvcl92c2Nfb25fY2xlYW51cCAtIFBlcmZvcm0gYW55IGNsZWFudXAgd2hlbiB0aGUgZHJpdmVyIGlzIHJlbW92ZWQKICAqLwotc3RhdGljIHZvaWQgU3RvclZzY09uQ2xlYW51cChzdHJ1Y3QgaHZfZHJpdmVyICpEcml2ZXIpCitzdGF0aWMgdm9pZCBzdG9yX3ZzY19vbl9jbGVhbnVwKHN0cnVjdCBodl9kcml2ZXIgKmRyaXZlcikKIHsKIH0KIAogLyoKLSAqIFN0b3JWc2NJbml0aWFsaXplIC0gTWFpbiBlbnRyeSBwb2ludAorICogc3Rvcl92c2NfaW5pdGlhbGl6ZSAtIE1haW4gZW50cnkgcG9pbnQKICAqLwotaW50IFN0b3JWc2NJbml0aWFsaXplKHN0cnVjdCBodl9kcml2ZXIgKkRyaXZlcikKK2ludCBzdG9yX3ZzY19pbml0aWFsaXplKHN0cnVjdCBodl9kcml2ZXIgKmRyaXZlcikKIHsKLQlzdHJ1Y3Qgc3RvcnZzY19kcml2ZXJfb2JqZWN0ICpzdG9yRHJpdmVyOworCXN0cnVjdCBzdG9ydnNjX2RyaXZlcl9vYmplY3QgKnN0b3JfZHJpdmVyOwogCi0Jc3RvckRyaXZlciA9IChzdHJ1Y3Qgc3RvcnZzY19kcml2ZXJfb2JqZWN0ICopRHJpdmVyOworCXN0b3JfZHJpdmVyID0gKHN0cnVjdCBzdG9ydnNjX2RyaXZlcl9vYmplY3QgKilkcml2ZXI7CiAKIAlEUFJJTlRfREJHKFNUT1JWU0MsICJzaXplb2YoU1RPUlZTQ19SRVFVRVNUKT0lemQgIgogCQkgICAic2l6ZW9mKHN0cnVjdCBzdG9ydnNjX3JlcXVlc3RfZXh0ZW5zaW9uKT0lemQgIgpAQCAtNzc4LDEzICs3ODUsMTQgQEAKIAkJICAgc2l6ZW9mKHN0cnVjdCB2bXNjc2lfcmVxdWVzdCkpOwogCiAJLyogTWFrZSBzdXJlIHdlIGFyZSBhdCBsZWFzdCAyIHBhZ2VzIHNpbmNlIDEgcGFnZSBpcyB1c2VkIGZvciBjb250cm9sICovCi0JLyogQVNTRVJUKHN0b3JEcml2ZXItPlJpbmdCdWZmZXJTaXplID49IChQQUdFX1NJWkUgPDwgMSkpOyAqLworCS8qIEFTU0VSVChzdG9yX2RyaXZlci0+UmluZ0J1ZmZlclNpemUgPj0gKFBBR0VfU0laRSA8PCAxKSk7ICovCiAKLQlEcml2ZXItPm5hbWUgPSBnRHJpdmVyTmFtZTsKLQltZW1jcHkoJkRyaXZlci0+ZGV2aWNlVHlwZSwgJmdTdG9yVnNjRGV2aWNlVHlwZSwKKwlkcml2ZXItPm5hbWUgPSBnX2RyaXZlcl9uYW1lOworCW1lbWNweSgmZHJpdmVyLT5kZXZpY2VUeXBlLCAmZ1N0b3JWc2NEZXZpY2VUeXBlLAogCSAgICAgICBzaXplb2Yoc3RydWN0IGh2X2d1aWQpKTsKIAotCXN0b3JEcml2ZXItPlJlcXVlc3RFeHRTaXplID0gc2l6ZW9mKHN0cnVjdCBzdG9ydnNjX3JlcXVlc3RfZXh0ZW5zaW9uKTsKKwlzdG9yX2RyaXZlci0+cmVxdWVzdF9leHRfc2l6ZSA9CisJCQlzaXplb2Yoc3RydWN0IHN0b3J2c2NfcmVxdWVzdF9leHRlbnNpb24pOwogCiAJLyoKIAkgKiBEaXZpZGUgdGhlIHJpbmcgYnVmZmVyIGRhdGEgc2l6ZSAod2hpY2ggaXMgMSBwYWdlIGxlc3MKQEAgLTc5MiwyMiArODAwLDIyIEBACiAJICogdGhlIHJpbmcgYnVmZmVyIGluZGljZXMpIGJ5IHRoZSBtYXggcmVxdWVzdCBzaXplICh3aGljaCBpcwogCSAqIHZtYnVzX2NoYW5uZWxfcGFja2V0X211bHRpcGFnZV9idWZmZXIgKyBzdHJ1Y3QgdnN0b3JfcGFja2V0ICsgdTY0KQogCSAqLwotCXN0b3JEcml2ZXItPk1heE91dHN0YW5kaW5nUmVxdWVzdHNQZXJDaGFubmVsID0KLQkJKChzdG9yRHJpdmVyLT5SaW5nQnVmZmVyU2l6ZSAtIFBBR0VfU0laRSkgLworCXN0b3JfZHJpdmVyLT5tYXhfb3V0c3RhbmRpbmdfcmVxX3Blcl9jaGFubmVsID0KKwkJKChzdG9yX2RyaXZlci0+cmluZ19idWZmZXJfc2l6ZSAtIFBBR0VfU0laRSkgLwogCQkgIEFMSUdOX1VQKE1BWF9NVUxUSVBBR0VfQlVGRkVSX1BBQ0tFVCArCiAJCQkgICBzaXplb2Yoc3RydWN0IHZzdG9yX3BhY2tldCkgKyBzaXplb2YodTY0KSwKIAkJCSAgIHNpemVvZih1NjQpKSk7CiAKIAlEUFJJTlRfSU5GTyhTVE9SVlNDLCAibWF4IGlvICV1LCBjdXJyZW50bHkgJXVcbiIsCi0JCSAgICBzdG9yRHJpdmVyLT5NYXhPdXRzdGFuZGluZ1JlcXVlc3RzUGVyQ2hhbm5lbCwKKwkJICAgIHN0b3JfZHJpdmVyLT5tYXhfb3V0c3RhbmRpbmdfcmVxX3Blcl9jaGFubmVsLAogCQkgICAgU1RPUlZTQ19NQVhfSU9fUkVRVUVTVFMpOwogCiAJLyogU2V0dXAgdGhlIGRpc3BhdGNoIHRhYmxlICovCi0Jc3RvckRyaXZlci0+QmFzZS5PbkRldmljZUFkZAk9IFN0b3JWc2NPbkRldmljZUFkZDsKLQlzdG9yRHJpdmVyLT5CYXNlLk9uRGV2aWNlUmVtb3ZlCT0gU3RvclZzY09uRGV2aWNlUmVtb3ZlOwotCXN0b3JEcml2ZXItPkJhc2UuT25DbGVhbnVwCT0gU3RvclZzY09uQ2xlYW51cDsKKwlzdG9yX2RyaXZlci0+YmFzZS5PbkRldmljZUFkZAk9IHN0b3JfdnNjX29uX2RldmljZV9hZGQ7CisJc3Rvcl9kcml2ZXItPmJhc2UuT25EZXZpY2VSZW1vdmUJPSBzdG9yX3ZzY19vbl9kZXZpY2VfcmVtb3ZlOworCXN0b3JfZHJpdmVyLT5iYXNlLk9uQ2xlYW51cAk9IHN0b3JfdnNjX29uX2NsZWFudXA7CiAKLQlzdG9yRHJpdmVyLT5PbklPUmVxdWVzdAkJPSBTdG9yVnNjT25JT1JlcXVlc3Q7CisJc3Rvcl9kcml2ZXItPm9uX2lvX3JlcXVlc3QJPSBzdG9yX3ZzY19vbl9pb19yZXF1ZXN0OwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaHYvc3RvcnZzY19hcGkuaCBiL2RyaXZlcnMvc3RhZ2luZy9odi9zdG9ydnNjX2FwaS5oCmluZGV4IDg1MDVhMWMuLmZiZjU3NTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9odi9zdG9ydnNjX2FwaS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9odi9zdG9ydnNjX2FwaS5oCkBAIC01Myw1OCArNTMsNTggQEAKIH07CiAKIHN0cnVjdCBodl9zdG9ydnNjX3JlcXVlc3QgewotCWVudW0gc3RvcnZzY19yZXF1ZXN0X3R5cGUgVHlwZTsKLQl1MzIgSG9zdDsKLQl1MzIgQnVzOwotCXUzMiBUYXJnZXRJZDsKLQl1MzIgTHVuSWQ7Ci0JdTggKkNkYjsKLQl1MzIgQ2RiTGVuOwotCXUzMiBTdGF0dXM7Ci0JdTMyIEJ5dGVzWGZlcjsKKwllbnVtIHN0b3J2c2NfcmVxdWVzdF90eXBlIHR5cGU7CisJdTMyIGhvc3Q7CisJdTMyIGJ1czsKKwl1MzIgdGFyZ2V0X2lkOworCXUzMiBsdW5faWQ7CisJdTggKmNkYjsKKwl1MzIgY2RiX2xlbjsKKwl1MzIgc3RhdHVzOworCXUzMiBieXRlc194ZmVyOwogCi0JdW5zaWduZWQgY2hhciAqU2Vuc2VCdWZmZXI7Ci0JdTMyIFNlbnNlQnVmZmVyU2l6ZTsKKwl1bnNpZ25lZCBjaGFyICpzZW5zZV9idWZmZXI7CisJdTMyIHNlbnNlX2J1ZmZlcl9zaXplOwogCi0Jdm9pZCAqQ29udGV4dDsKKwl2b2lkICpjb250ZXh0OwogCi0Jdm9pZCAoKk9uSU9Db21wbGV0aW9uKShzdHJ1Y3QgaHZfc3RvcnZzY19yZXF1ZXN0ICpSZXF1ZXN0KTsKKwl2b2lkICgqb25faW9fY29tcGxldGlvbikoc3RydWN0IGh2X3N0b3J2c2NfcmVxdWVzdCAqcmVxdWVzdCk7CiAKIAkvKiBUaGlzIHBvaW50cyB0byB0aGUgbWVtb3J5IGFmdGVyIERhdGFCdWZmZXIgKi8KLQl2b2lkICpFeHRlbnNpb247CisJdm9pZCAqZXh0ZW5zaW9uOwogCi0Jc3RydWN0IGh2X211bHRpcGFnZV9idWZmZXIgRGF0YUJ1ZmZlcjsKKwlzdHJ1Y3QgaHZfbXVsdGlwYWdlX2J1ZmZlciBkYXRhX2J1ZmZlcjsKIH07CiAKIC8qIFJlcHJlc2VudHMgdGhlIGJsb2NrIHZzYyBkcml2ZXIgKi8KIHN0cnVjdCBzdG9ydnNjX2RyaXZlcl9vYmplY3QgewogCS8qIE11c3QgYmUgdGhlIGZpcnN0IGZpZWxkICovCiAJLyogV2hpY2ggaXMgYSBidWcgRklYTUUhICovCi0Jc3RydWN0IGh2X2RyaXZlciBCYXNlOworCXN0cnVjdCBodl9kcml2ZXIgYmFzZTsKIAogCS8qIFNldCBieSBjYWxsZXIgKGluIGJ5dGVzKSAqLwotCXUzMiBSaW5nQnVmZmVyU2l6ZTsKKwl1MzIgcmluZ19idWZmZXJfc2l6ZTsKIAogCS8qIEFsbG9jYXRlIHRoaXMgbXVjaCBwcml2YXRlIGV4dGVuc2lvbiBmb3IgZWFjaCBJL08gcmVxdWVzdCAqLwotCXUzMiBSZXF1ZXN0RXh0U2l6ZTsKKwl1MzIgcmVxdWVzdF9leHRfc2l6ZTsKIAogCS8qIE1heGltdW0gIyBvZiByZXF1ZXN0cyBpbiBmbGlnaHQgcGVyIGNoYW5uZWwvZGV2aWNlICovCi0JdTMyIE1heE91dHN0YW5kaW5nUmVxdWVzdHNQZXJDaGFubmVsOworCXUzMiBtYXhfb3V0c3RhbmRpbmdfcmVxX3Blcl9jaGFubmVsOwogCiAJLyogU3BlY2lmaWMgdG8gdGhpcyBkcml2ZXIgKi8KLQlpbnQgKCpPbklPUmVxdWVzdCkoc3RydWN0IGh2X2RldmljZSAqRGV2aWNlLAotCQkJICAgc3RydWN0IGh2X3N0b3J2c2NfcmVxdWVzdCAqUmVxdWVzdCk7CisJaW50ICgqb25faW9fcmVxdWVzdCkoc3RydWN0IGh2X2RldmljZSAqZGV2aWNlLAorCQkJICAgc3RydWN0IGh2X3N0b3J2c2NfcmVxdWVzdCAqcmVxdWVzdCk7CiB9OwogCiBzdHJ1Y3Qgc3RvcnZzY19kZXZpY2VfaW5mbyB7Ci0JdW5zaWduZWQgaW50IFBvcnROdW1iZXI7Ci0JdW5zaWduZWQgY2hhciBQYXRoSWQ7Ci0JdW5zaWduZWQgY2hhciBUYXJnZXRJZDsKKwl1bnNpZ25lZCBpbnQgcG9ydF9udW1iZXI7CisJdW5zaWduZWQgY2hhciBwYXRoX2lkOworCXVuc2lnbmVkIGNoYXIgdGFyZ2V0X2lkOwogfTsKIAogLyogSW50ZXJmYWNlICovCi1pbnQgU3RvclZzY0luaXRpYWxpemUoc3RydWN0IGh2X2RyaXZlciAqZHJpdmVyKTsKLWludCBTdG9yVnNjT25Ib3N0UmVzZXQoc3RydWN0IGh2X2RldmljZSAqRGV2aWNlKTsKLWludCBCbGtWc2NJbml0aWFsaXplKHN0cnVjdCBodl9kcml2ZXIgKmRyaXZlcik7CitpbnQgc3Rvcl92c2NfaW5pdGlhbGl6ZShzdHJ1Y3QgaHZfZHJpdmVyICpkcml2ZXIpOworaW50IHN0b3JfdnNjX29uX2hvc3RfcmVzZXQoc3RydWN0IGh2X2RldmljZSAqZGV2aWNlKTsKK2ludCBibGtfdnNjX2luaXRpYWxpemUoc3RydWN0IGh2X2RyaXZlciAqZHJpdmVyKTsKIAogI2VuZGlmIC8qIF9TVE9SVlNDX0FQSV9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2h2L3N0b3J2c2NfZHJ2LmMgYi9kcml2ZXJzL3N0YWdpbmcvaHYvc3RvcnZzY19kcnYuYwppbmRleCA2ZjhkNjdkLi4xN2YxYjM0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaHYvc3RvcnZzY19kcnYuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaHYvc3RvcnZzY19kcnYuYwpAQCAtMTQwLDI4ICsxNDAsMjggQEAKIAlzdHJ1Y3Qgc3RvcnZzY19kcml2ZXJfb2JqZWN0ICpzdG9ydnNjX2Rydl9vYmogPSAmZ19zdG9ydnNjX2Rydi5kcnZfb2JqOwogCXN0cnVjdCBkcml2ZXJfY29udGV4dCAqZHJ2X2N0eCA9ICZnX3N0b3J2c2NfZHJ2LmRydl9jdHg7CiAKLQlzdG9ydnNjX2Rydl9vYmotPlJpbmdCdWZmZXJTaXplID0gc3RvcnZzY19yaW5nYnVmZmVyX3NpemU7CisJc3RvcnZzY19kcnZfb2JqLT5yaW5nX2J1ZmZlcl9zaXplID0gc3RvcnZzY19yaW5nYnVmZmVyX3NpemU7CiAKIAkvKiBDYWxsYmFjayB0byBjbGllbnQgZHJpdmVyIHRvIGNvbXBsZXRlIHRoZSBpbml0aWFsaXphdGlvbiAqLwotCWRydl9pbml0KCZzdG9ydnNjX2Rydl9vYmotPkJhc2UpOworCWRydl9pbml0KCZzdG9ydnNjX2Rydl9vYmotPmJhc2UpOwogCiAJRFBSSU5UX0lORk8oU1RPUlZTQ19EUlYsCiAJCSAgICAicmVxdWVzdCBleHRlbnNpb24gc2l6ZSAldSwgbWF4IG91dHN0YW5kaW5nIHJlcXMgJXUiLAotCQkgICAgc3RvcnZzY19kcnZfb2JqLT5SZXF1ZXN0RXh0U2l6ZSwKLQkJICAgIHN0b3J2c2NfZHJ2X29iai0+TWF4T3V0c3RhbmRpbmdSZXF1ZXN0c1BlckNoYW5uZWwpOworCQkgICAgc3RvcnZzY19kcnZfb2JqLT5yZXF1ZXN0X2V4dF9zaXplLAorCQkgICAgc3RvcnZzY19kcnZfb2JqLT5tYXhfb3V0c3RhbmRpbmdfcmVxX3Blcl9jaGFubmVsKTsKIAotCWlmIChzdG9ydnNjX2Rydl9vYmotPk1heE91dHN0YW5kaW5nUmVxdWVzdHNQZXJDaGFubmVsIDwKKwlpZiAoc3RvcnZzY19kcnZfb2JqLT5tYXhfb3V0c3RhbmRpbmdfcmVxX3Blcl9jaGFubmVsIDwKIAkgICAgU1RPUlZTQ19NQVhfSU9fUkVRVUVTVFMpIHsKIAkJRFBSSU5UX0VSUihTVE9SVlNDX0RSViwKIAkJCSAgICJUaGUgbnVtYmVyIG9mIG91dHN0YW5kaW5nIGlvIHJlcXVlc3RzICglZCkgIgogCQkJICAgImlzIGxhcmdlciB0aGFuIHRoYXQgc3VwcG9ydGVkICglZCkgaW50ZXJuYWxseS4iLAogCQkJICAgU1RPUlZTQ19NQVhfSU9fUkVRVUVTVFMsCi0JCQkgICBzdG9ydnNjX2Rydl9vYmotPk1heE91dHN0YW5kaW5nUmVxdWVzdHNQZXJDaGFubmVsKTsKKwkJCSAgIHN0b3J2c2NfZHJ2X29iai0+bWF4X291dHN0YW5kaW5nX3JlcV9wZXJfY2hhbm5lbCk7CiAJCXJldHVybiAtMTsKIAl9CiAKLQlkcnZfY3R4LT5kcml2ZXIubmFtZSA9IHN0b3J2c2NfZHJ2X29iai0+QmFzZS5uYW1lOwotCW1lbWNweSgmZHJ2X2N0eC0+Y2xhc3NfaWQsICZzdG9ydnNjX2Rydl9vYmotPkJhc2UuZGV2aWNlVHlwZSwKKwlkcnZfY3R4LT5kcml2ZXIubmFtZSA9IHN0b3J2c2NfZHJ2X29iai0+YmFzZS5uYW1lOworCW1lbWNweSgmZHJ2X2N0eC0+Y2xhc3NfaWQsICZzdG9ydnNjX2Rydl9vYmotPmJhc2UuZGV2aWNlVHlwZSwKIAkgICAgICAgc2l6ZW9mKHN0cnVjdCBodl9ndWlkKSk7CiAKIAlkcnZfY3R4LT5wcm9iZSA9IHN0b3J2c2NfcHJvYmU7CkBAIC0yMDYsOCArMjA2LDggQEAKIAkJZGV2aWNlX3VucmVnaXN0ZXIoY3VycmVudF9kZXYpOwogCX0KIAotCWlmIChzdG9ydnNjX2Rydl9vYmotPkJhc2UuT25DbGVhbnVwKQotCQlzdG9ydnNjX2Rydl9vYmotPkJhc2UuT25DbGVhbnVwKCZzdG9ydnNjX2Rydl9vYmotPkJhc2UpOworCWlmIChzdG9ydnNjX2Rydl9vYmotPmJhc2UuT25DbGVhbnVwKQorCQlzdG9ydnNjX2Rydl9vYmotPmJhc2UuT25DbGVhbnVwKCZzdG9ydnNjX2Rydl9vYmotPmJhc2UpOwogCiAJdm1idXNfY2hpbGRfZHJpdmVyX3VucmVnaXN0ZXIoZHJ2X2N0eCk7CiAJcmV0dXJuOwpAQCAtMjMxLDcgKzIzMSw3IEBACiAJc3RydWN0IGhvc3RfZGV2aWNlX2NvbnRleHQgKmhvc3RfZGV2aWNlX2N0eDsKIAlzdHJ1Y3Qgc3RvcnZzY19kZXZpY2VfaW5mbyBkZXZpY2VfaW5mbzsKIAotCWlmICghc3RvcnZzY19kcnZfb2JqLT5CYXNlLk9uRGV2aWNlQWRkKQorCWlmICghc3RvcnZzY19kcnZfb2JqLT5iYXNlLk9uRGV2aWNlQWRkKQogCQlyZXR1cm4gLTE7CiAKIAlob3N0ID0gc2NzaV9ob3N0X2FsbG9jKCZzY3NpX2RyaXZlciwKQEAgLTI1Miw3ICsyNTIsNyBAQAogCWhvc3RfZGV2aWNlX2N0eC0+cmVxdWVzdF9wb29sID0KIAkJCQlrbWVtX2NhY2hlX2NyZWF0ZShkZXZfbmFtZSgmZGV2aWNlX2N0eC0+ZGV2aWNlKSwKIAkJCQkJc2l6ZW9mKHN0cnVjdCBzdG9ydnNjX2NtZF9yZXF1ZXN0KSArCi0JCQkJCXN0b3J2c2NfZHJ2X29iai0+UmVxdWVzdEV4dFNpemUsIDAsCisJCQkJCXN0b3J2c2NfZHJ2X29iai0+cmVxdWVzdF9leHRfc2l6ZSwgMCwKIAkJCQkJU0xBQl9IV0NBQ0hFX0FMSUdOLCBOVUxMKTsKIAogCWlmICghaG9zdF9kZXZpY2VfY3R4LT5yZXF1ZXN0X3Bvb2wpIHsKQEAgLTI2MCw5ICsyNjAsOSBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKLQlkZXZpY2VfaW5mby5Qb3J0TnVtYmVyID0gaG9zdC0+aG9zdF9ubzsKKwlkZXZpY2VfaW5mby5wb3J0X251bWJlciA9IGhvc3QtPmhvc3Rfbm87CiAJLyogQ2FsbCB0byB0aGUgdnNjIGRyaXZlciB0byBhZGQgdGhlIGRldmljZSAqLwotCXJldCA9IHN0b3J2c2NfZHJ2X29iai0+QmFzZS5PbkRldmljZUFkZChkZXZpY2Vfb2JqLAorCXJldCA9IHN0b3J2c2NfZHJ2X29iai0+YmFzZS5PbkRldmljZUFkZChkZXZpY2Vfb2JqLAogCQkJCQkJKHZvaWQgKikmZGV2aWNlX2luZm8pOwogCWlmIChyZXQgIT0gMCkgewogCQlEUFJJTlRfRVJSKFNUT1JWU0NfRFJWLCAidW5hYmxlIHRvIGFkZCBzY3NpIHZzYyBkZXZpY2UiKTsKQEAgLTI3Miw4ICsyNzIsOCBAQAogCX0KIAogCS8qIGhvc3RfZGV2aWNlX2N0eC0+cG9ydCA9IGRldmljZV9pbmZvLlBvcnROdW1iZXI7ICovCi0JaG9zdF9kZXZpY2VfY3R4LT5wYXRoID0gZGV2aWNlX2luZm8uUGF0aElkOwotCWhvc3RfZGV2aWNlX2N0eC0+dGFyZ2V0ID0gZGV2aWNlX2luZm8uVGFyZ2V0SWQ7CisJaG9zdF9kZXZpY2VfY3R4LT5wYXRoID0gZGV2aWNlX2luZm8ucGF0aF9pZDsKKwlob3N0X2RldmljZV9jdHgtPnRhcmdldCA9IGRldmljZV9pbmZvLnRhcmdldF9pZDsKIAogCS8qIG1heCAjIG9mIGRldmljZXMgcGVyIHRhcmdldCAqLwogCWhvc3QtPm1heF9sdW4gPSBTVE9SVlNDX01BWF9MVU5TX1BFUl9UQVJHRVQ7CkBAIC0yODcsNyArMjg3LDcgQEAKIAlpZiAocmV0ICE9IDApIHsKIAkJRFBSSU5UX0VSUihTVE9SVlNDX0RSViwgInVuYWJsZSB0byBhZGQgc2NzaSBob3N0IGRldmljZSIpOwogCi0JCXN0b3J2c2NfZHJ2X29iai0+QmFzZS5PbkRldmljZVJlbW92ZShkZXZpY2Vfb2JqKTsKKwkJc3RvcnZzY19kcnZfb2JqLT5iYXNlLk9uRGV2aWNlUmVtb3ZlKGRldmljZV9vYmopOwogCiAJCWttZW1fY2FjaGVfZGVzdHJveShob3N0X2RldmljZV9jdHgtPnJlcXVlc3RfcG9vbCk7CiAJCXNjc2lfaG9zdF9wdXQoaG9zdCk7CkBAIC0zMTcsMTQgKzMxNywxNCBAQAogCQkJKHN0cnVjdCBob3N0X2RldmljZV9jb250ZXh0ICopaG9zdC0+aG9zdGRhdGE7CiAKIAotCWlmICghc3RvcnZzY19kcnZfb2JqLT5CYXNlLk9uRGV2aWNlUmVtb3ZlKQorCWlmICghc3RvcnZzY19kcnZfb2JqLT5iYXNlLk9uRGV2aWNlUmVtb3ZlKQogCQlyZXR1cm4gLTE7CiAKIAkvKgogCSAqIENhbGwgdG8gdGhlIHZzYyBkcml2ZXIgdG8gbGV0IGl0IGtub3cgdGhhdCB0aGUgZGV2aWNlIGlzIGJlaW5nCiAJICogcmVtb3ZlZAogCSAqLwotCXJldCA9IHN0b3J2c2NfZHJ2X29iai0+QmFzZS5PbkRldmljZVJlbW92ZShkZXZpY2Vfb2JqKTsKKwlyZXQgPSBzdG9ydnNjX2Rydl9vYmotPmJhc2UuT25EZXZpY2VSZW1vdmUoZGV2aWNlX29iaik7CiAJaWYgKHJldCAhPSAwKSB7CiAJCS8qIFRPRE86ICovCiAJCURQUklOVF9FUlIoU1RPUlZTQywgInVuYWJsZSB0byByZW1vdmUgdnNjIGRldmljZSAocmV0ICVkKSIsCkBAIC0zNTAsNyArMzUwLDcgQEAKIHN0YXRpYyB2b2lkIHN0b3J2c2NfY29tbW1hbmRfY29tcGxldGlvbihzdHJ1Y3QgaHZfc3RvcnZzY19yZXF1ZXN0ICpyZXF1ZXN0KQogewogCXN0cnVjdCBzdG9ydnNjX2NtZF9yZXF1ZXN0ICpjbWRfcmVxdWVzdCA9Ci0JCShzdHJ1Y3Qgc3RvcnZzY19jbWRfcmVxdWVzdCAqKXJlcXVlc3QtPkNvbnRleHQ7CisJCShzdHJ1Y3Qgc3RvcnZzY19jbWRfcmVxdWVzdCAqKXJlcXVlc3QtPmNvbnRleHQ7CiAJc3RydWN0IHNjc2lfY21uZCAqc2NtbmQgPSBjbWRfcmVxdWVzdC0+Y21kOwogCXN0cnVjdCBob3N0X2RldmljZV9jb250ZXh0ICpob3N0X2RldmljZV9jdHggPQogCQkoc3RydWN0IGhvc3RfZGV2aWNlX2NvbnRleHQgKilzY21uZC0+ZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YTsKQEAgLTM3NSwxNiArMzc1LDE3IEBACiAJCQkJICAgICAgY21kX3JlcXVlc3QtPmJvdW5jZV9zZ2xfY291bnQpOwogCX0KIAotCXNjbW5kLT5yZXN1bHQgPSByZXF1ZXN0LT5TdGF0dXM7CisJc2NtbmQtPnJlc3VsdCA9IHJlcXVlc3QtPnN0YXR1czsKIAogCWlmIChzY21uZC0+cmVzdWx0KSB7CiAJCWlmIChzY3NpX25vcm1hbGl6ZV9zZW5zZShzY21uZC0+c2Vuc2VfYnVmZmVyLAotCQkJCQkgcmVxdWVzdC0+U2Vuc2VCdWZmZXJTaXplLCAmc2Vuc2VfaGRyKSkKKwkJCQlyZXF1ZXN0LT5zZW5zZV9idWZmZXJfc2l6ZSwgJnNlbnNlX2hkcikpCiAJCQlzY3NpX3ByaW50X3NlbnNlX2hkcigic3RvcnZzYyIsICZzZW5zZV9oZHIpOwogCX0KIAotCS8qIEFTU0VSVChyZXF1ZXN0LT5CeXRlc1hmZXIgPD0gcmVxdWVzdC0+RGF0YUJ1ZmZlci5MZW5ndGgpOyAqLwotCXNjc2lfc2V0X3Jlc2lkKHNjbW5kLCByZXF1ZXN0LT5EYXRhQnVmZmVyLkxlbmd0aCAtIHJlcXVlc3QtPkJ5dGVzWGZlcik7CisJLyogQVNTRVJUKHJlcXVlc3QtPkJ5dGVzWGZlciA8PSByZXF1ZXN0LT5kYXRhX2J1ZmZlci5MZW5ndGgpOyAqLworCXNjc2lfc2V0X3Jlc2lkKHNjbW5kLAorCQlyZXF1ZXN0LT5kYXRhX2J1ZmZlci5MZW5ndGggLSByZXF1ZXN0LT5ieXRlc194ZmVyKTsKIAogCXNjc2lfZG9uZV9mbiA9IHNjbW5kLT5zY3NpX2RvbmU7CiAKQEAgLTY1Nyw0MiArNjU4LDQyIEBACiAKIAlyZXF1ZXN0ID0gJmNtZF9yZXF1ZXN0LT5yZXF1ZXN0OwogCi0JcmVxdWVzdC0+RXh0ZW5zaW9uID0KKwlyZXF1ZXN0LT5leHRlbnNpb24gPQogCQkodm9pZCAqKSgodW5zaWduZWQgbG9uZyljbWRfcmVxdWVzdCArIHJlcXVlc3Rfc2l6ZSk7CiAJRFBSSU5UX0RCRyhTVE9SVlNDX0RSViwgInJlcSAlcCBzaXplICVkIGV4dCAlZCIsIHJlcXVlc3QsIHJlcXVlc3Rfc2l6ZSwKLQkJICAgc3RvcnZzY19kcnZfb2JqLT5SZXF1ZXN0RXh0U2l6ZSk7CisJCSAgIHN0b3J2c2NfZHJ2X29iai0+cmVxdWVzdF9leHRfc2l6ZSk7CiAKIAkvKiBCdWlsZCB0aGUgU1JCICovCiAJc3dpdGNoIChzY21uZC0+c2NfZGF0YV9kaXJlY3Rpb24pIHsKIAljYXNlIERNQV9UT19ERVZJQ0U6Ci0JCXJlcXVlc3QtPlR5cGUgPSBXUklURV9UWVBFOworCQlyZXF1ZXN0LT50eXBlID0gV1JJVEVfVFlQRTsKIAkJYnJlYWs7CiAJY2FzZSBETUFfRlJPTV9ERVZJQ0U6Ci0JCXJlcXVlc3QtPlR5cGUgPSBSRUFEX1RZUEU7CisJCXJlcXVlc3QtPnR5cGUgPSBSRUFEX1RZUEU7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCXJlcXVlc3QtPlR5cGUgPSBVTktOT1dOX1RZUEU7CisJCXJlcXVlc3QtPnR5cGUgPSBVTktOT1dOX1RZUEU7CiAJCWJyZWFrOwogCX0KIAotCXJlcXVlc3QtPk9uSU9Db21wbGV0aW9uID0gc3RvcnZzY19jb21tbWFuZF9jb21wbGV0aW9uOwotCXJlcXVlc3QtPkNvbnRleHQgPSBjbWRfcmVxdWVzdDsvKiBzY21uZDsgKi8KKwlyZXF1ZXN0LT5vbl9pb19jb21wbGV0aW9uID0gc3RvcnZzY19jb21tbWFuZF9jb21wbGV0aW9uOworCXJlcXVlc3QtPmNvbnRleHQgPSBjbWRfcmVxdWVzdDsvKiBzY21uZDsgKi8KIAogCS8qIHJlcXVlc3QtPlBvcnRJZCA9IHNjbW5kLT5kZXZpY2UtPmNoYW5uZWw7ICovCi0JcmVxdWVzdC0+SG9zdCA9IGhvc3RfZGV2aWNlX2N0eC0+cG9ydDsKLQlyZXF1ZXN0LT5CdXMgPSBzY21uZC0+ZGV2aWNlLT5jaGFubmVsOwotCXJlcXVlc3QtPlRhcmdldElkID0gc2NtbmQtPmRldmljZS0+aWQ7Ci0JcmVxdWVzdC0+THVuSWQgPSBzY21uZC0+ZGV2aWNlLT5sdW47CisJcmVxdWVzdC0+aG9zdCA9IGhvc3RfZGV2aWNlX2N0eC0+cG9ydDsKKwlyZXF1ZXN0LT5idXMgPSBzY21uZC0+ZGV2aWNlLT5jaGFubmVsOworCXJlcXVlc3QtPnRhcmdldF9pZCA9IHNjbW5kLT5kZXZpY2UtPmlkOworCXJlcXVlc3QtPmx1bl9pZCA9IHNjbW5kLT5kZXZpY2UtPmx1bjsKIAogCS8qIEFTU0VSVChzY21uZC0+Y21kX2xlbiA8PSAxNik7ICovCi0JcmVxdWVzdC0+Q2RiTGVuID0gc2NtbmQtPmNtZF9sZW47Ci0JcmVxdWVzdC0+Q2RiID0gc2NtbmQtPmNtbmQ7CisJcmVxdWVzdC0+Y2RiX2xlbiA9IHNjbW5kLT5jbWRfbGVuOworCXJlcXVlc3QtPmNkYiA9IHNjbW5kLT5jbW5kOwogCi0JcmVxdWVzdC0+U2Vuc2VCdWZmZXIgPSBzY21uZC0+c2Vuc2VfYnVmZmVyOwotCXJlcXVlc3QtPlNlbnNlQnVmZmVyU2l6ZSA9IFNDU0lfU0VOU0VfQlVGRkVSU0laRTsKKwlyZXF1ZXN0LT5zZW5zZV9idWZmZXIgPSBzY21uZC0+c2Vuc2VfYnVmZmVyOworCXJlcXVlc3QtPnNlbnNlX2J1ZmZlcl9zaXplID0gU0NTSV9TRU5TRV9CVUZGRVJTSVpFOwogCiAKLQlyZXF1ZXN0LT5EYXRhQnVmZmVyLkxlbmd0aCA9IHNjc2lfYnVmZmxlbihzY21uZCk7CisJcmVxdWVzdC0+ZGF0YV9idWZmZXIuTGVuZ3RoID0gc2NzaV9idWZmbGVuKHNjbW5kKTsKIAlpZiAoc2NzaV9zZ19jb3VudChzY21uZCkpIHsKIAkJc2dsID0gKHN0cnVjdCBzY2F0dGVybGlzdCAqKXNjc2lfc2dsaXN0KHNjbW5kKTsKIAkJc2dfY291bnQgPSBzY3NpX3NnX2NvdW50KHNjbW5kKTsKQEAgLTczMywyNSArNzM0LDI1IEBACiAJCQlzZ19jb3VudCA9IGNtZF9yZXF1ZXN0LT5ib3VuY2Vfc2dsX2NvdW50OwogCQl9CiAKLQkJcmVxdWVzdC0+RGF0YUJ1ZmZlci5PZmZzZXQgPSBzZ2xbMF0ub2Zmc2V0OworCQlyZXF1ZXN0LT5kYXRhX2J1ZmZlci5PZmZzZXQgPSBzZ2xbMF0ub2Zmc2V0OwogCiAJCWZvciAoaSA9IDA7IGkgPCBzZ19jb3VudDsgaSsrKSB7CiAJCQlEUFJJTlRfREJHKFNUT1JWU0NfRFJWLCAic2dsWyVkXSBsZW4gJWQgb2Zmc2V0ICVkXG4iLAogCQkJCSAgIGksIHNnbFtpXS5sZW5ndGgsIHNnbFtpXS5vZmZzZXQpOwotCQkJcmVxdWVzdC0+RGF0YUJ1ZmZlci5QZm5BcnJheVtpXSA9CisJCQlyZXF1ZXN0LT5kYXRhX2J1ZmZlci5QZm5BcnJheVtpXSA9CiAJCQkJcGFnZV90b19wZm4oc2dfcGFnZSgoJnNnbFtpXSkpKTsKIAkJfQogCX0gZWxzZSBpZiAoc2NzaV9zZ2xpc3Qoc2NtbmQpKSB7CiAJCS8qIEFTU0VSVChzY3NpX2J1ZmZsZW4oc2NtbmQpIDw9IFBBR0VfU0laRSk7ICovCi0JCXJlcXVlc3QtPkRhdGFCdWZmZXIuT2Zmc2V0ID0KKwkJcmVxdWVzdC0+ZGF0YV9idWZmZXIuT2Zmc2V0ID0KIAkJCXZpcnRfdG9fcGh5cyhzY3NpX3NnbGlzdChzY21uZCkpICYgKFBBR0VfU0laRS0xKTsKLQkJcmVxdWVzdC0+RGF0YUJ1ZmZlci5QZm5BcnJheVswXSA9CisJCXJlcXVlc3QtPmRhdGFfYnVmZmVyLlBmbkFycmF5WzBdID0KIAkJCXZpcnRfdG9fcGh5cyhzY3NpX3NnbGlzdChzY21uZCkpID4+IFBBR0VfU0hJRlQ7CiAJfQogCiByZXRyeV9yZXF1ZXN0OgogCS8qIEludm9rZXMgdGhlIHZzYyB0byBzdGFydCBhbiBJTyAqLwotCXJldCA9IHN0b3J2c2NfZHJ2X29iai0+T25JT1JlcXVlc3QoJmRldmljZV9jdHgtPmRldmljZV9vYmosCisJcmV0ID0gc3RvcnZzY19kcnZfb2JqLT5vbl9pb19yZXF1ZXN0KCZkZXZpY2VfY3R4LT5kZXZpY2Vfb2JqLAogCQkJCQkgICAmY21kX3JlcXVlc3QtPnJlcXVlc3QpOwogCWlmIChyZXQgPT0gLTEpIHsKIAkJLyogbm8gbW9yZSBzcGFjZSAqLwpAQCAtODQ0LDcgKzg0NSw3IEBACiAJCSAgICBzY21uZC0+ZGV2aWNlLCAmZGV2aWNlX2N0eC0+ZGV2aWNlX29iaik7CiAKIAkvKiBJbnZva2VzIHRoZSB2c2MgdG8gcmVzZXQgdGhlIGhvc3QvYnVzICovCi0JcmV0ID0gU3RvclZzY09uSG9zdFJlc2V0KCZkZXZpY2VfY3R4LT5kZXZpY2Vfb2JqKTsKKwlyZXQgPSBzdG9yX3ZzY19vbl9ob3N0X3Jlc2V0KCZkZXZpY2VfY3R4LT5kZXZpY2Vfb2JqKTsKIAlpZiAocmV0ICE9IDApCiAJCXJldHVybiByZXQ7CiAKQEAgLTkzOSw3ICs5NDAsNyBAQAogCWludCByZXQ7CiAKIAlEUFJJTlRfSU5GTyhTVE9SVlNDX0RSViwgIlN0b3J2c2MgaW5pdGlhbGl6aW5nLi4uLiIpOwotCXJldCA9IHN0b3J2c2NfZHJ2X2luaXQoU3RvclZzY0luaXRpYWxpemUpOworCXJldCA9IHN0b3J2c2NfZHJ2X2luaXQoc3Rvcl92c2NfaW5pdGlhbGl6ZSk7CiAJcmV0dXJuIHJldDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2h2L3ZtYnVzLmMgYi9kcml2ZXJzL3N0YWdpbmcvaHYvdm1idXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQ0OWRhZi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaHYvdm1idXMuYworKysgL2Rldi9udWxsCkBAIC0xLDI3NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCBNaWNyb3NvZnQgQ29ycG9yYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCi0gKiB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKLSAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUKLSAqIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBLgotICoKLSAqIEF1dGhvcnM6Ci0gKiAgIEhhaXlhbmcgWmhhbmcgPGhhaXlhbmd6QG1pY3Jvc29mdC5jb20+Ci0gKiAgIEhhbmsgSmFuc3NlbiAgPGhqYW5zc2VuQG1pY3Jvc29mdC5jb20+Ci0gKgotICovCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvbW0uaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSAib3NkLmgiCi0jaW5jbHVkZSAibG9nZ2luZy5oIgotI2luY2x1ZGUgInZlcnNpb25faW5mby5oIgotI2luY2x1ZGUgInZtYnVzX3ByaXZhdGUuaCIKLQotc3RhdGljIGNvbnN0IGNoYXIgKmdEcml2ZXJOYW1lID0gInZtYnVzIjsKLQotLyoKLSAqIFdpbmRvd3Mgdm1idXMgZG9lcyBub3QgZGVmaW5lZCB0aGlzLgotICogV2UgZGVmaW5lZCB0aGlzIHRvIGJlIGNvbnNpc3RlbnQgd2l0aCBvdGhlciBkZXZpY2VzCi0gKi8KLS8qIHtjNTI5NTgxNi1mNjNhLTRkNWYtOGQxYS00ZGFmOTk5Y2ExODV9ICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IGh2X2d1aWQgZ1ZtYnVzRGV2aWNlVHlwZSA9IHsKLQkuZGF0YSA9IHsKLQkJMHgxNiwgMHg1OCwgMHgyOSwgMHhjNSwgMHgzYSwgMHhmNiwgMHg1ZiwgMHg0ZCwKLQkJMHg4ZCwgMHgxYSwgMHg0ZCwgMHhhZiwgMHg5OSwgMHg5YywgMHhhMSwgMHg4NQotCX0KLX07Ci0KLS8qIHthYzM3NjBmYy05YWRmLTQwYWEtOTQyNy1hNzBlZDZkZTk1YzV9ICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IGh2X2d1aWQgZ1ZtYnVzRGV2aWNlSWQgPSB7Ci0JLmRhdGEgPSB7Ci0JCTB4ZmMsIDB4NjAsIDB4MzcsIDB4YWMsIDB4ZGYsIDB4OWEsIDB4YWEsIDB4NDAsCi0JCTB4OTQsIDB4MjcsIDB4YTcsIDB4MGUsIDB4ZDYsIDB4ZGUsIDB4OTUsIDB4YzUKLQl9Ci19OwotCi1zdGF0aWMgc3RydWN0IGh2X2RyaXZlciAqZ0RyaXZlcjsgLyogdm1idXMgZHJpdmVyIG9iamVjdCAqLwotc3RhdGljIHN0cnVjdCBodl9kZXZpY2UgKmdEZXZpY2U7IC8qIHZtYnVzIHJvb3QgZGV2aWNlICovCi0KLS8qCi0gKiBWbWJ1c0dldENoYW5uZWxPZmZlcnMgLSBSZXRyaWV2ZSB0aGUgY2hhbm5lbCBvZmZlcnMgZnJvbSB0aGUgcGFyZW50IHBhcnRpdGlvbgotICovCi1zdGF0aWMgdm9pZCBWbWJ1c0dldENoYW5uZWxPZmZlcnModm9pZCkKLXsKLQl2bWJ1c19yZXF1ZXN0X29mZmVycygpOwotfQotCi0vKgotICogVm1idXNDcmVhdGVDaGlsZERldmljZSAtIENyZWF0ZXMgdGhlIGNoaWxkIGRldmljZSBvbiB0aGUgYnVzIHRoYXQgcmVwcmVzZW50cyB0aGUgY2hhbm5lbCBvZmZlcgotICovCi1zdHJ1Y3QgaHZfZGV2aWNlICpWbWJ1c0NoaWxkRGV2aWNlQ3JlYXRlKHN0cnVjdCBodl9ndWlkICpEZXZpY2VUeXBlLAotCQkJCQkgc3RydWN0IGh2X2d1aWQgKkRldmljZUluc3RhbmNlLAotCQkJCQkgc3RydWN0IHZtYnVzX2NoYW5uZWwgKmNoYW5uZWwpCi17Ci0Jc3RydWN0IHZtYnVzX2RyaXZlciAqdm1idXNEcml2ZXIgPSAoc3RydWN0IHZtYnVzX2RyaXZlciAqKWdEcml2ZXI7Ci0KLQlyZXR1cm4gdm1idXNEcml2ZXItPk9uQ2hpbGREZXZpY2VDcmVhdGUoRGV2aWNlVHlwZSwgRGV2aWNlSW5zdGFuY2UsCi0JCQkJCQljaGFubmVsKTsKLX0KLQotLyoKLSAqIFZtYnVzQ2hpbGREZXZpY2VBZGQgLSBSZWdpc3RlcnMgdGhlIGNoaWxkIGRldmljZSB3aXRoIHRoZSB2bWJ1cwotICovCi1pbnQgVm1idXNDaGlsZERldmljZUFkZChzdHJ1Y3QgaHZfZGV2aWNlICpDaGlsZERldmljZSkKLXsKLQlzdHJ1Y3Qgdm1idXNfZHJpdmVyICp2bWJ1c0RyaXZlciA9IChzdHJ1Y3Qgdm1idXNfZHJpdmVyICopZ0RyaXZlcjsKLQotCXJldHVybiB2bWJ1c0RyaXZlci0+T25DaGlsZERldmljZUFkZChnRGV2aWNlLCBDaGlsZERldmljZSk7Ci19Ci0KLS8qCi0gKiBWbWJ1c0NoaWxkRGV2aWNlUmVtb3ZlIFVucmVnaXN0ZXJzIHRoZSBjaGlsZCBkZXZpY2UgZnJvbSB0aGUgdm1idXMKLSAqLwotdm9pZCBWbWJ1c0NoaWxkRGV2aWNlUmVtb3ZlKHN0cnVjdCBodl9kZXZpY2UgKkNoaWxkRGV2aWNlKQotewotCXN0cnVjdCB2bWJ1c19kcml2ZXIgKnZtYnVzRHJpdmVyID0gKHN0cnVjdCB2bWJ1c19kcml2ZXIgKilnRHJpdmVyOwotCi0Jdm1idXNEcml2ZXItPk9uQ2hpbGREZXZpY2VSZW1vdmUoQ2hpbGREZXZpY2UpOwotfQotCi0vKgotICogVm1idXNPbkRldmljZUFkZCAtIENhbGxiYWNrIHdoZW4gdGhlIHJvb3QgYnVzIGRldmljZSBpcyBhZGRlZAotICovCi1zdGF0aWMgaW50IFZtYnVzT25EZXZpY2VBZGQoc3RydWN0IGh2X2RldmljZSAqZGV2LCB2b2lkICpBZGRpdGlvbmFsSW5mbykKLXsKLQl1MzIgKmlycXZlY3RvciA9IEFkZGl0aW9uYWxJbmZvOwotCWludCByZXQ7Ci0KLQlnRGV2aWNlID0gZGV2OwotCi0JbWVtY3B5KCZnRGV2aWNlLT5kZXZpY2VUeXBlLCAmZ1ZtYnVzRGV2aWNlVHlwZSwgc2l6ZW9mKHN0cnVjdCBodl9ndWlkKSk7Ci0JbWVtY3B5KCZnRGV2aWNlLT5kZXZpY2VJbnN0YW5jZSwgJmdWbWJ1c0RldmljZUlkLAotCSAgICAgICBzaXplb2Yoc3RydWN0IGh2X2d1aWQpKTsKLQotCS8qIHN0cmNweShkZXYtPm5hbWUsICJ2bWJ1cyIpOyAqLwotCS8qIFN5bklDIHNldHVwLi4uICovCi0Jb25fZWFjaF9jcHUoSHZTeW5pY0luaXQsICh2b2lkICopaXJxdmVjdG9yLCAxKTsKLQotCS8qIENvbm5lY3QgdG8gVk1CdXMgaW4gdGhlIHJvb3QgcGFydGl0aW9uICovCi0JcmV0ID0gVm1idXNDb25uZWN0KCk7Ci0KLQkvKiBWbWJ1c1NlbmRFdmVudChkZXZpY2UtPmxvY2FsUG9ydElkKzEpOyAqLwotCXJldHVybiByZXQ7Ci19Ci0KLS8qCi0gKiBWbWJ1c09uRGV2aWNlUmVtb3ZlIC0gQ2FsbGJhY2sgd2hlbiB0aGUgcm9vdCBidXMgZGV2aWNlIGlzIHJlbW92ZWQKLSAqLwotc3RhdGljIGludCBWbWJ1c09uRGV2aWNlUmVtb3ZlKHN0cnVjdCBodl9kZXZpY2UgKmRldikKLXsKLQlpbnQgcmV0ID0gMDsKLQotCXZtYnVzX3JlbGVhc2VfdW5hdHRhY2hlZF9jaGFubmVscygpOwotCVZtYnVzRGlzY29ubmVjdCgpOwotCW9uX2VhY2hfY3B1KEh2U3luaWNDbGVhbnVwLCBOVUxMLCAxKTsKLQlyZXR1cm4gcmV0OwotfQotCi0vKgotICogVm1idXNPbkNsZWFudXAgLSBQZXJmb3JtIGFueSBjbGVhbnVwIHdoZW4gdGhlIGRyaXZlciBpcyByZW1vdmVkCi0gKi8KLXN0YXRpYyB2b2lkIFZtYnVzT25DbGVhbnVwKHN0cnVjdCBodl9kcml2ZXIgKmRydikKLXsKLQkvKiBzdHJ1Y3Qgdm1idXNfZHJpdmVyICpkcml2ZXIgPSAoc3RydWN0IHZtYnVzX2RyaXZlciAqKWRydjsgKi8KLQotCUh2Q2xlYW51cCgpOwotfQotCi0vKgotICogVm1idXNPbk1zZ0RQQyAtIERQQyByb3V0aW5lIHRvIGhhbmRsZSBtZXNzYWdlcyBmcm9tIHRoZSBoeXBlcnZpc2lvcgotICovCi1zdGF0aWMgdm9pZCBWbWJ1c09uTXNnRFBDKHN0cnVjdCBodl9kcml2ZXIgKmRydikKLXsKLQlpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwotCXZvaWQgKnBhZ2VfYWRkciA9IGdIdkNvbnRleHQuc3luSUNNZXNzYWdlUGFnZVtjcHVdOwotCXN0cnVjdCBodl9tZXNzYWdlICptc2cgPSAoc3RydWN0IGh2X21lc3NhZ2UgKilwYWdlX2FkZHIgKwotCQkJCSAgVk1CVVNfTUVTU0FHRV9TSU5UOwotCXN0cnVjdCBodl9tZXNzYWdlICpjb3BpZWQ7Ci0KLQl3aGlsZSAoMSkgewotCQlpZiAobXNnLT5IZWFkZXIuTWVzc2FnZVR5cGUgPT0gSHZNZXNzYWdlVHlwZU5vbmUpIHsKLQkJCS8qIG5vIG1zZyAqLwotCQkJYnJlYWs7Ci0JCX0gZWxzZSB7Ci0JCQljb3BpZWQgPSBrbWVtZHVwKG1zZywgc2l6ZW9mKCpjb3BpZWQpLCBHRlBfQVRPTUlDKTsKLQkJCWlmIChjb3BpZWQgPT0gTlVMTCkKLQkJCQljb250aW51ZTsKLQotCQkJb3NkX3NjaGVkdWxlX2NhbGxiYWNrKGdWbWJ1c0Nvbm5lY3Rpb24uV29ya1F1ZXVlLAotCQkJCQkgICAgICB2bWJ1c19vbm1lc3NhZ2UsCi0JCQkJCSAgICAgICh2b2lkICopY29waWVkKTsKLQkJfQotCi0JCW1zZy0+SGVhZGVyLk1lc3NhZ2VUeXBlID0gSHZNZXNzYWdlVHlwZU5vbmU7Ci0KLQkJLyoKLQkJICogTWFrZSBzdXJlIHRoZSB3cml0ZSB0byBNZXNzYWdlVHlwZSAoaWUgc2V0IHRvCi0JCSAqIEh2TWVzc2FnZVR5cGVOb25lKSBoYXBwZW5zIGJlZm9yZSB3ZSByZWFkIHRoZQotCQkgKiBNZXNzYWdlUGVuZGluZyBhbmQgRU9NaW5nLiBPdGhlcndpc2UsIHRoZSBFT01pbmcKLQkJICogd2lsbCBub3QgZGVsaXZlciBhbnkgbW9yZSBtZXNzYWdlcyBzaW5jZSB0aGVyZSBpcwotCQkgKiBubyBlbXB0eSBzbG90Ci0JCSAqLwotCQltYigpOwotCi0JCWlmIChtc2ctPkhlYWRlci5NZXNzYWdlRmxhZ3MuTWVzc2FnZVBlbmRpbmcpIHsKLQkJCS8qCi0JCQkgKiBUaGlzIHdpbGwgY2F1c2UgbWVzc2FnZSBxdWV1ZSByZXNjYW4gdG8KLQkJCSAqIHBvc3NpYmx5IGRlbGl2ZXIgYW5vdGhlciBtc2cgZnJvbSB0aGUKLQkJCSAqIGh5cGVydmlzb3IKLQkJCSAqLwotCQkJd3Jtc3JsKEhWX1g2NF9NU1JfRU9NLCAwKTsKLQkJfQotCX0KLX0KLQotLyoKLSAqIFZtYnVzT25FdmVudERQQyAtIERQQyByb3V0aW5lIHRvIGhhbmRsZSBldmVudHMgZnJvbSB0aGUgaHlwZXJ2aXNpb3IKLSAqLwotc3RhdGljIHZvaWQgVm1idXNPbkV2ZW50RFBDKHN0cnVjdCBodl9kcml2ZXIgKmRydikKLXsKLQkvKiBUT0RPOiBQcm9jZXNzIGFueSBldmVudHMgKi8KLQlWbWJ1c09uRXZlbnRzKCk7Ci19Ci0KLS8qCi0gKiBWbWJ1c09uSVNSIC0gSVNSIHJvdXRpbmUKLSAqLwotc3RhdGljIGludCBWbWJ1c09uSVNSKHN0cnVjdCBodl9kcml2ZXIgKmRydikKLXsKLQlpbnQgcmV0ID0gMDsKLQlpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwotCXZvaWQgKnBhZ2VfYWRkcjsKLQlzdHJ1Y3QgaHZfbWVzc2FnZSAqbXNnOwotCXVuaW9uIGh2X3N5bmljX2V2ZW50X2ZsYWdzICpldmVudDsKLQotCXBhZ2VfYWRkciA9IGdIdkNvbnRleHQuc3luSUNNZXNzYWdlUGFnZVtjcHVdOwotCW1zZyA9IChzdHJ1Y3QgaHZfbWVzc2FnZSAqKXBhZ2VfYWRkciArIFZNQlVTX01FU1NBR0VfU0lOVDsKLQotCS8qIENoZWNrIGlmIHRoZXJlIGFyZSBhY3R1YWwgbXNncyB0byBiZSBwcm9jZXNzICovCi0JaWYgKG1zZy0+SGVhZGVyLk1lc3NhZ2VUeXBlICE9IEh2TWVzc2FnZVR5cGVOb25lKSB7Ci0JCURQUklOVF9EQkcoVk1CVVMsICJyZWNlaXZlZCBtc2cgdHlwZSAlZCBzaXplICVkIiwKLQkJCQltc2ctPkhlYWRlci5NZXNzYWdlVHlwZSwKLQkJCQltc2ctPkhlYWRlci5QYXlsb2FkU2l6ZSk7Ci0JCXJldCB8PSAweDE7Ci0JfQotCi0JLyogVE9ETzogQ2hlY2sgaWYgdGhlcmUgYXJlIGV2ZW50cyB0byBiZSBwcm9jZXNzICovCi0JcGFnZV9hZGRyID0gZ0h2Q29udGV4dC5zeW5JQ0V2ZW50UGFnZVtjcHVdOwotCWV2ZW50ID0gKHVuaW9uIGh2X3N5bmljX2V2ZW50X2ZsYWdzICopcGFnZV9hZGRyICsgVk1CVVNfTUVTU0FHRV9TSU5UOwotCi0JLyogU2luY2Ugd2UgYXJlIGEgY2hpbGQsIHdlIG9ubHkgbmVlZCB0byBjaGVjayBiaXQgMCAqLwotCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoMCwgKHVuc2lnbmVkIGxvbmcgKikgJmV2ZW50LT5GbGFnczMyWzBdKSkgewotCQlEUFJJTlRfREJHKFZNQlVTLCAicmVjZWl2ZWQgZXZlbnQgJWQiLCBldmVudC0+RmxhZ3MzMlswXSk7Ci0JCXJldCB8PSAweDI7Ci0JfQotCi0JcmV0dXJuIHJldDsKLX0KLQotLyoKLSAqIFZtYnVzSW5pdGlhbGl6ZSAtIE1haW4gZW50cnkgcG9pbnQKLSAqLwotaW50IFZtYnVzSW5pdGlhbGl6ZShzdHJ1Y3QgaHZfZHJpdmVyICpkcnYpCi17Ci0Jc3RydWN0IHZtYnVzX2RyaXZlciAqZHJpdmVyID0gKHN0cnVjdCB2bWJ1c19kcml2ZXIgKilkcnY7Ci0JaW50IHJldDsKLQotCURQUklOVF9JTkZPKFZNQlVTLCAiKysrKysrKyBIViBEcml2ZXIgdmVyc2lvbiA9ICVzICsrKysrKysiLAotCQkgICAgSFZfRFJWX1ZFUlNJT04pOwotCURQUklOVF9JTkZPKFZNQlVTLCAiKysrKysrKyBWbWJ1cyBzdXBwb3J0ZWQgdmVyc2lvbiA9ICVkICsrKysrKysiLAotCQkJVk1CVVNfUkVWSVNJT05fTlVNQkVSKTsKLQlEUFJJTlRfSU5GTyhWTUJVUywgIisrKysrKysgVm1idXMgdXNpbmcgU0lOVCAlZCArKysrKysrIiwKLQkJCVZNQlVTX01FU1NBR0VfU0lOVCk7Ci0JRFBSSU5UX0RCRyhWTUJVUywgInNpemVvZih2bWJ1c19jaGFubmVsX3BhY2tldF9wYWdlX2J1ZmZlcik9JXpkLCAiCi0JCQkic2l6ZW9mKFZNQlVTX0NIQU5ORUxfUEFDS0VUX01VTElUUEFHRV9CVUZGRVIpPSV6ZCIsCi0JCQlzaXplb2Yoc3RydWN0IHZtYnVzX2NoYW5uZWxfcGFja2V0X3BhZ2VfYnVmZmVyKSwKLQkJCXNpemVvZihzdHJ1Y3Qgdm1idXNfY2hhbm5lbF9wYWNrZXRfbXVsdGlwYWdlX2J1ZmZlcikpOwotCi0JZHJ2LT5uYW1lID0gZ0RyaXZlck5hbWU7Ci0JbWVtY3B5KCZkcnYtPmRldmljZVR5cGUsICZnVm1idXNEZXZpY2VUeXBlLCBzaXplb2Yoc3RydWN0IGh2X2d1aWQpKTsKLQotCS8qIFNldHVwIGRpc3BhdGNoIHRhYmxlICovCi0JZHJpdmVyLT5CYXNlLk9uRGV2aWNlQWRkCT0gVm1idXNPbkRldmljZUFkZDsKLQlkcml2ZXItPkJhc2UuT25EZXZpY2VSZW1vdmUJPSBWbWJ1c09uRGV2aWNlUmVtb3ZlOwotCWRyaXZlci0+QmFzZS5PbkNsZWFudXAJCT0gVm1idXNPbkNsZWFudXA7Ci0JZHJpdmVyLT5PbklzcgkJCT0gVm1idXNPbklTUjsKLQlkcml2ZXItPk9uTXNnRHBjCQk9IFZtYnVzT25Nc2dEUEM7Ci0JZHJpdmVyLT5PbkV2ZW50RHBjCQk9IFZtYnVzT25FdmVudERQQzsKLQlkcml2ZXItPkdldENoYW5uZWxPZmZlcnMJPSBWbWJ1c0dldENoYW5uZWxPZmZlcnM7Ci0KLQkvKiBIeXBlcnZpc29yIGluaXRpYWxpemF0aW9uLi4uc2V0dXAgaHlwZXJjYWxsIHBhZ2UuLmV0YyAqLwotCXJldCA9IEh2SW5pdCgpOwotCWlmIChyZXQgIT0gMCkKLQkJRFBSSU5UX0VSUihWTUJVUywgIlVuYWJsZSB0byBpbml0aWFsaXplIHRoZSBoeXBlcnZpc29yIC0gMHgleCIsCi0JCQkJcmV0KTsKLQlnRHJpdmVyID0gZHJ2OwotCi0JcmV0dXJuIHJldDsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9odi92bWJ1c19hcGkuaCBiL2RyaXZlcnMvc3RhZ2luZy9odi92bWJ1c19hcGkuaAppbmRleCAyYWY0MmU1Li4yZGEzZjUyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaHYvdm1idXNfYXBpLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2h2L3ZtYnVzX2FwaS5oCkBAIC0xMTUsMjggKzExNSw0IEBACiAJdm9pZCAqRXh0ZW5zaW9uOwogfTsKIAotLyogVm1idXMgZHJpdmVyIG9iamVjdCAqLwotc3RydWN0IHZtYnVzX2RyaXZlciB7Ci0JLyogISEgTXVzdCBiZSB0aGUgMXN0IGZpZWxkICEhICovCi0JLyogRklYTUUgaWYgXiwgdGhlbiBzb21lb25lIGlzIGRvaW5nIHNvbXRoaW5nIHN0dXBpZCAqLwotCXN0cnVjdCBodl9kcml2ZXIgQmFzZTsKLQotCS8qIFNldCBieSB0aGUgY2FsbGVyICovCi0Jc3RydWN0IGh2X2RldmljZSAqICgqT25DaGlsZERldmljZUNyZWF0ZSkoc3RydWN0IGh2X2d1aWQgKkRldmljZVR5cGUsCi0JCQkJCQlzdHJ1Y3QgaHZfZ3VpZCAqRGV2aWNlSW5zdGFuY2UsCi0JCQkJCQlzdHJ1Y3Qgdm1idXNfY2hhbm5lbCAqY2hhbm5lbCk7Ci0Jdm9pZCAoKk9uQ2hpbGREZXZpY2VEZXN0cm95KShzdHJ1Y3QgaHZfZGV2aWNlICpkZXZpY2UpOwotCWludCAoKk9uQ2hpbGREZXZpY2VBZGQpKHN0cnVjdCBodl9kZXZpY2UgKlJvb3REZXZpY2UsCi0JCQkJc3RydWN0IGh2X2RldmljZSAqQ2hpbGREZXZpY2UpOwotCXZvaWQgKCpPbkNoaWxkRGV2aWNlUmVtb3ZlKShzdHJ1Y3QgaHZfZGV2aWNlICpkZXZpY2UpOwotCi0JLyogU2V0IGJ5IHRoZSBjYWxsZWUgKi8KLQlpbnQgKCpPbklzcikoc3RydWN0IGh2X2RyaXZlciAqZHJpdmVyKTsKLQl2b2lkICgqT25Nc2dEcGMpKHN0cnVjdCBodl9kcml2ZXIgKmRyaXZlcik7Ci0Jdm9pZCAoKk9uRXZlbnREcGMpKHN0cnVjdCBodl9kcml2ZXIgKmRyaXZlcik7Ci0Jdm9pZCAoKkdldENoYW5uZWxPZmZlcnMpKHZvaWQpOwotfTsKLQotaW50IFZtYnVzSW5pdGlhbGl6ZShzdHJ1Y3QgaHZfZHJpdmVyICpkcnYpOwotCiAjZW5kaWYgLyogX1ZNQlVTX0FQSV9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2h2L3ZtYnVzX2Rydi5jIGIvZHJpdmVycy9zdGFnaW5nL2h2L3ZtYnVzX2Rydi5jCmluZGV4IDBkOWYzYTQuLjg0ZmRiNjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9odi92bWJ1c19kcnYuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaHYvdm1idXNfZHJ2LmMKQEAgLTMzLDYgKzMzLDcgQEAKICNpbmNsdWRlICJsb2dnaW5nLmgiCiAjaW5jbHVkZSAidm1idXMuaCIKICNpbmNsdWRlICJjaGFubmVsLmgiCisjaW5jbHVkZSAidm1idXNfcHJpdmF0ZS5oIgogCiAKIC8qIEZJWE1FISBXZSBuZWVkIHRvIGRvIHRoaXMgZHluYW1pY2FsbHkgZm9yIFBJQyBhbmQgQVBJQyBzeXN0ZW0gKi8KQEAgLTQ2LDcgKzQ3LDcgQEAKIAkvKiBUaGUgZHJpdmVyIGZpZWxkIGlzIG5vdCB1c2VkIGluIGhlcmUuIEluc3RlYWQsIHRoZSBidXMgZmllbGQgaXMgKi8KIAkvKiB1c2VkIHRvIHJlcHJlc2VudCB0aGUgZHJpdmVyICovCiAJc3RydWN0IGRyaXZlcl9jb250ZXh0IGRydl9jdHg7Ci0Jc3RydWN0IHZtYnVzX2RyaXZlciBkcnZfb2JqOworCXN0cnVjdCBodl9kcml2ZXIgZHJ2X29iajsKIAogCXN0cnVjdCBidXNfdHlwZSBidXM7CiAJc3RydWN0IHRhc2tsZXRfc3RydWN0IG1zZ19kcGM7CkBAIC02OSwxMyArNzAsNiBAQAogc3RhdGljIHZvaWQgdm1idXNfZGV2aWNlX3JlbGVhc2Uoc3RydWN0IGRldmljZSAqZGV2aWNlKTsKIHN0YXRpYyB2b2lkIHZtYnVzX2J1c19yZWxlYXNlKHN0cnVjdCBkZXZpY2UgKmRldmljZSk7CiAKLXN0YXRpYyBzdHJ1Y3QgaHZfZGV2aWNlICp2bWJ1c19jaGlsZF9kZXZpY2VfY3JlYXRlKHN0cnVjdCBodl9ndWlkICp0eXBlLAotCQkJCQkJICAgc3RydWN0IGh2X2d1aWQgKmluc3RhbmNlLAotCQkJCQkJICAgc3RydWN0IHZtYnVzX2NoYW5uZWwgKmNoYW5uZWwpOwotc3RhdGljIHZvaWQgdm1idXNfY2hpbGRfZGV2aWNlX2Rlc3Ryb3koc3RydWN0IGh2X2RldmljZSAqZGV2aWNlX29iaik7Ci1zdGF0aWMgaW50IHZtYnVzX2NoaWxkX2RldmljZV9yZWdpc3RlcihzdHJ1Y3QgaHZfZGV2aWNlICpyb290X2RldmljZV9vYmosCi0JCQkJICAgICAgIHN0cnVjdCBodl9kZXZpY2UgKmNoaWxkX2RldmljZV9vYmopOwotc3RhdGljIHZvaWQgdm1idXNfY2hpbGRfZGV2aWNlX3VucmVnaXN0ZXIoc3RydWN0IGh2X2RldmljZSAqY2hpbGRfZGV2aWNlX29iaik7CiBzdGF0aWMgc3NpemVfdCB2bWJ1c19zaG93X2RldmljZV9hdHRyKHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJCQkgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2X2F0dHIsCiAJCQkJICAgICAgY2hhciAqYnVmKTsKQEAgLTEyOSw2ICsxMjMsMTgyIEBACiAJLmJ1cy5kZXZfYXR0cnMgPQl2bWJ1c19kZXZpY2VfYXR0cnMsCiB9OwogCitzdGF0aWMgY29uc3QgY2hhciAqZ0RyaXZlck5hbWUgPSAiaHlwZXJ2IjsKKworLyoKKyAqIFdpbmRvd3Mgdm1idXMgZG9lcyBub3QgZGVmaW5lZCB0aGlzLgorICogV2UgZGVmaW5lZCB0aGlzIHRvIGJlIGNvbnNpc3RlbnQgd2l0aCBvdGhlciBkZXZpY2VzCisgKi8KKy8qIHtjNTI5NTgxNi1mNjNhLTRkNWYtOGQxYS00ZGFmOTk5Y2ExODV9ICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGh2X2d1aWQgZ1ZtYnVzRGV2aWNlVHlwZSA9IHsKKwkuZGF0YSA9IHsKKwkJMHgxNiwgMHg1OCwgMHgyOSwgMHhjNSwgMHgzYSwgMHhmNiwgMHg1ZiwgMHg0ZCwKKwkJMHg4ZCwgMHgxYSwgMHg0ZCwgMHhhZiwgMHg5OSwgMHg5YywgMHhhMSwgMHg4NQorCX0KK307CisKKy8qIHthYzM3NjBmYy05YWRmLTQwYWEtOTQyNy1hNzBlZDZkZTk1YzV9ICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGh2X2d1aWQgZ1ZtYnVzRGV2aWNlSWQgPSB7CisJLmRhdGEgPSB7CisJCTB4ZmMsIDB4NjAsIDB4MzcsIDB4YWMsIDB4ZGYsIDB4OWEsIDB4YWEsIDB4NDAsCisJCTB4OTQsIDB4MjcsIDB4YTcsIDB4MGUsIDB4ZDYsIDB4ZGUsIDB4OTUsIDB4YzUKKwl9Cit9OworCitzdGF0aWMgc3RydWN0IGh2X2RldmljZSAqZ0RldmljZTsgLyogdm1idXMgcm9vdCBkZXZpY2UgKi8KKworLyoKKyAqIFZtYnVzQ2hpbGREZXZpY2VBZGQgLSBSZWdpc3RlcnMgdGhlIGNoaWxkIGRldmljZSB3aXRoIHRoZSB2bWJ1cworICovCitpbnQgVm1idXNDaGlsZERldmljZUFkZChzdHJ1Y3QgaHZfZGV2aWNlICpDaGlsZERldmljZSkKK3sKKwlyZXR1cm4gdm1idXNfY2hpbGRfZGV2aWNlX3JlZ2lzdGVyKGdEZXZpY2UsIENoaWxkRGV2aWNlKTsKK30KKworLyoKKyAqIFZtYnVzT25EZXZpY2VBZGQgLSBDYWxsYmFjayB3aGVuIHRoZSByb290IGJ1cyBkZXZpY2UgaXMgYWRkZWQKKyAqLworc3RhdGljIGludCBWbWJ1c09uRGV2aWNlQWRkKHN0cnVjdCBodl9kZXZpY2UgKmRldiwgdm9pZCAqQWRkaXRpb25hbEluZm8pCit7CisJdTMyICppcnF2ZWN0b3IgPSBBZGRpdGlvbmFsSW5mbzsKKwlpbnQgcmV0OworCisJZ0RldmljZSA9IGRldjsKKworCW1lbWNweSgmZ0RldmljZS0+ZGV2aWNlVHlwZSwgJmdWbWJ1c0RldmljZVR5cGUsIHNpemVvZihzdHJ1Y3QgaHZfZ3VpZCkpOworCW1lbWNweSgmZ0RldmljZS0+ZGV2aWNlSW5zdGFuY2UsICZnVm1idXNEZXZpY2VJZCwKKwkgICAgICAgc2l6ZW9mKHN0cnVjdCBodl9ndWlkKSk7CisKKwkvKiBzdHJjcHkoZGV2LT5uYW1lLCAidm1idXMiKTsgKi8KKwkvKiBTeW5JQyBzZXR1cC4uLiAqLworCW9uX2VhY2hfY3B1KGh2X3N5bmljX2luaXQsICh2b2lkICopaXJxdmVjdG9yLCAxKTsKKworCS8qIENvbm5lY3QgdG8gVk1CdXMgaW4gdGhlIHJvb3QgcGFydGl0aW9uICovCisJcmV0ID0gVm1idXNDb25uZWN0KCk7CisKKwkvKiBWbWJ1c1NlbmRFdmVudChkZXZpY2UtPmxvY2FsUG9ydElkKzEpOyAqLworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBWbWJ1c09uRGV2aWNlUmVtb3ZlIC0gQ2FsbGJhY2sgd2hlbiB0aGUgcm9vdCBidXMgZGV2aWNlIGlzIHJlbW92ZWQKKyAqLworc3RhdGljIGludCBWbWJ1c09uRGV2aWNlUmVtb3ZlKHN0cnVjdCBodl9kZXZpY2UgKmRldikKK3sKKwlpbnQgcmV0ID0gMDsKKworCXZtYnVzX3JlbGVhc2VfdW5hdHRhY2hlZF9jaGFubmVscygpOworCVZtYnVzRGlzY29ubmVjdCgpOworCW9uX2VhY2hfY3B1KGh2X3N5bmljX2NsZWFudXAsIE5VTEwsIDEpOworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBWbWJ1c09uQ2xlYW51cCAtIFBlcmZvcm0gYW55IGNsZWFudXAgd2hlbiB0aGUgZHJpdmVyIGlzIHJlbW92ZWQKKyAqLworc3RhdGljIHZvaWQgVm1idXNPbkNsZWFudXAoc3RydWN0IGh2X2RyaXZlciAqZHJ2KQoreworCS8qIHN0cnVjdCB2bWJ1c19kcml2ZXIgKmRyaXZlciA9IChzdHJ1Y3Qgdm1idXNfZHJpdmVyICopZHJ2OyAqLworCisJaHZfY2xlYW51cCgpOworfQorCitzdHJ1Y3Qgb25tZXNzYWdlX3dvcmtfY29udGV4dCB7CisJc3RydWN0IHdvcmtfc3RydWN0IHdvcms7CisJc3RydWN0IGh2X21lc3NhZ2UgbXNnOworfTsKKworc3RhdGljIHZvaWQgdm1idXNfb25tZXNzYWdlX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBvbm1lc3NhZ2Vfd29ya19jb250ZXh0ICpjdHg7CisKKwljdHggPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IG9ubWVzc2FnZV93b3JrX2NvbnRleHQsCisJCQkgICB3b3JrKTsKKwl2bWJ1c19vbm1lc3NhZ2UoJmN0eC0+bXNnKTsKKwlrZnJlZShjdHgpOworfQorCisvKgorICogdm1idXNfb25fbXNnX2RwYyAtIERQQyByb3V0aW5lIHRvIGhhbmRsZSBtZXNzYWdlcyBmcm9tIHRoZSBoeXBlcnZpc2lvcgorICovCitzdGF0aWMgdm9pZCB2bWJ1c19vbl9tc2dfZHBjKHN0cnVjdCBodl9kcml2ZXIgKmRydikKK3sKKwlpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOworCXZvaWQgKnBhZ2VfYWRkciA9IGh2X2NvbnRleHQuc3luaWNfbWVzc2FnZV9wYWdlW2NwdV07CisJc3RydWN0IGh2X21lc3NhZ2UgKm1zZyA9IChzdHJ1Y3QgaHZfbWVzc2FnZSAqKXBhZ2VfYWRkciArCisJCQkJICBWTUJVU19NRVNTQUdFX1NJTlQ7CisJc3RydWN0IG9ubWVzc2FnZV93b3JrX2NvbnRleHQgKmN0eDsKKworCXdoaWxlICgxKSB7CisJCWlmIChtc2ctPmhlYWRlci5tZXNzYWdlX3R5cGUgPT0gSFZNU0dfTk9ORSkgeworCQkJLyogbm8gbXNnICovCisJCQlicmVhazsKKwkJfSBlbHNlIHsKKwkJCWN0eCA9IGttYWxsb2Moc2l6ZW9mKCpjdHgpLCBHRlBfQVRPTUlDKTsKKwkJCWlmIChjdHggPT0gTlVMTCkKKwkJCQljb250aW51ZTsKKwkJCUlOSVRfV09SSygmY3R4LT53b3JrLCB2bWJ1c19vbm1lc3NhZ2Vfd29yayk7CisJCQltZW1jcHkoJmN0eC0+bXNnLCBtc2csIHNpemVvZigqbXNnKSk7CisJCQlxdWV1ZV93b3JrKGdWbWJ1c0Nvbm5lY3Rpb24uV29ya1F1ZXVlLCAmY3R4LT53b3JrKTsKKwkJfQorCisJCW1zZy0+aGVhZGVyLm1lc3NhZ2VfdHlwZSA9IEhWTVNHX05PTkU7CisKKwkJLyoKKwkJICogTWFrZSBzdXJlIHRoZSB3cml0ZSB0byBNZXNzYWdlVHlwZSAoaWUgc2V0IHRvCisJCSAqIEhWTVNHX05PTkUpIGhhcHBlbnMgYmVmb3JlIHdlIHJlYWQgdGhlCisJCSAqIE1lc3NhZ2VQZW5kaW5nIGFuZCBFT01pbmcuIE90aGVyd2lzZSwgdGhlIEVPTWluZworCQkgKiB3aWxsIG5vdCBkZWxpdmVyIGFueSBtb3JlIG1lc3NhZ2VzIHNpbmNlIHRoZXJlIGlzCisJCSAqIG5vIGVtcHR5IHNsb3QKKwkJICovCisJCW1iKCk7CisKKwkJaWYgKG1zZy0+aGVhZGVyLm1lc3NhZ2VfZmxhZ3MubXNnX3BlbmRpbmcpIHsKKwkJCS8qCisJCQkgKiBUaGlzIHdpbGwgY2F1c2UgbWVzc2FnZSBxdWV1ZSByZXNjYW4gdG8KKwkJCSAqIHBvc3NpYmx5IGRlbGl2ZXIgYW5vdGhlciBtc2cgZnJvbSB0aGUKKwkJCSAqIGh5cGVydmlzb3IKKwkJCSAqLworCQkJd3Jtc3JsKEhWX1g2NF9NU1JfRU9NLCAwKTsKKwkJfQorCX0KK30KKworLyoKKyAqIHZtYnVzX29uX2lzciAtIElTUiByb3V0aW5lCisgKi8KK3N0YXRpYyBpbnQgdm1idXNfb25faXNyKHN0cnVjdCBodl9kcml2ZXIgKmRydikKK3sKKwlpbnQgcmV0ID0gMDsKKwlpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOworCXZvaWQgKnBhZ2VfYWRkcjsKKwlzdHJ1Y3QgaHZfbWVzc2FnZSAqbXNnOworCXVuaW9uIGh2X3N5bmljX2V2ZW50X2ZsYWdzICpldmVudDsKKworCXBhZ2VfYWRkciA9IGh2X2NvbnRleHQuc3luaWNfbWVzc2FnZV9wYWdlW2NwdV07CisJbXNnID0gKHN0cnVjdCBodl9tZXNzYWdlICopcGFnZV9hZGRyICsgVk1CVVNfTUVTU0FHRV9TSU5UOworCisJLyogQ2hlY2sgaWYgdGhlcmUgYXJlIGFjdHVhbCBtc2dzIHRvIGJlIHByb2Nlc3MgKi8KKwlpZiAobXNnLT5oZWFkZXIubWVzc2FnZV90eXBlICE9IEhWTVNHX05PTkUpIHsKKwkJRFBSSU5UX0RCRyhWTUJVUywgInJlY2VpdmVkIG1zZyB0eXBlICVkIHNpemUgJWQiLAorCQkJCW1zZy0+aGVhZGVyLm1lc3NhZ2VfdHlwZSwKKwkJCQltc2ctPmhlYWRlci5wYXlsb2FkX3NpemUpOworCQlyZXQgfD0gMHgxOworCX0KKworCS8qIFRPRE86IENoZWNrIGlmIHRoZXJlIGFyZSBldmVudHMgdG8gYmUgcHJvY2VzcyAqLworCXBhZ2VfYWRkciA9IGh2X2NvbnRleHQuc3luaWNfZXZlbnRfcGFnZVtjcHVdOworCWV2ZW50ID0gKHVuaW9uIGh2X3N5bmljX2V2ZW50X2ZsYWdzICopcGFnZV9hZGRyICsgVk1CVVNfTUVTU0FHRV9TSU5UOworCisJLyogU2luY2Ugd2UgYXJlIGEgY2hpbGQsIHdlIG9ubHkgbmVlZCB0byBjaGVjayBiaXQgMCAqLworCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoMCwgKHVuc2lnbmVkIGxvbmcgKikgJmV2ZW50LT5mbGFnczMyWzBdKSkgeworCQlEUFJJTlRfREJHKFZNQlVTLCAicmVjZWl2ZWQgZXZlbnQgJWQiLCBldmVudC0+ZmxhZ3MzMlswXSk7CisJCXJldCB8PSAweDI7CisJfQorCisJcmV0dXJuIHJldDsKK30KKwogc3RhdGljIHZvaWQgZ2V0X2NoYW5uZWxfaW5mbyhzdHJ1Y3QgaHZfZGV2aWNlICpkZXZpY2UsCiAJCQkgICAgIHN0cnVjdCBodl9kZXZpY2VfaW5mbyAqaW5mbykKIHsKQEAgLTEzOSwzNSArMzA5LDM4IEBACiAKIAl2bWJ1c19nZXRfZGVidWdfaW5mbyhkZXZpY2UtPmNoYW5uZWwsICZkZWJ1Z19pbmZvKTsKIAotCWluZm8tPkNoYW5uZWxJZCA9IGRlYnVnX2luZm8uUmVsSWQ7Ci0JaW5mby0+Q2hhbm5lbFN0YXRlID0gZGVidWdfaW5mby5TdGF0ZTsKLQltZW1jcHkoJmluZm8tPkNoYW5uZWxUeXBlLCAmZGVidWdfaW5mby5JbnRlcmZhY2VUeXBlLAorCWluZm8tPkNoYW5uZWxJZCA9IGRlYnVnX2luZm8ucmVsaWQ7CisJaW5mby0+Q2hhbm5lbFN0YXRlID0gZGVidWdfaW5mby5zdGF0ZTsKKwltZW1jcHkoJmluZm8tPkNoYW5uZWxUeXBlLCAmZGVidWdfaW5mby5pbnRlcmZhY2V0eXBlLAogCSAgICAgICBzaXplb2Yoc3RydWN0IGh2X2d1aWQpKTsKLQltZW1jcHkoJmluZm8tPkNoYW5uZWxJbnN0YW5jZSwgJmRlYnVnX2luZm8uSW50ZXJmYWNlSW5zdGFuY2UsCisJbWVtY3B5KCZpbmZvLT5DaGFubmVsSW5zdGFuY2UsICZkZWJ1Z19pbmZvLmludGVyZmFjZV9pbnN0YW5jZSwKIAkgICAgICAgc2l6ZW9mKHN0cnVjdCBodl9ndWlkKSk7CiAKLQlpbmZvLT5Nb25pdG9ySWQgPSBkZWJ1Z19pbmZvLk1vbml0b3JJZDsKKwlpbmZvLT5Nb25pdG9ySWQgPSBkZWJ1Z19pbmZvLm1vbml0b3JpZDsKIAotCWluZm8tPlNlcnZlck1vbml0b3JQZW5kaW5nID0gZGVidWdfaW5mby5TZXJ2ZXJNb25pdG9yUGVuZGluZzsKLQlpbmZvLT5TZXJ2ZXJNb25pdG9yTGF0ZW5jeSA9IGRlYnVnX2luZm8uU2VydmVyTW9uaXRvckxhdGVuY3k7Ci0JaW5mby0+U2VydmVyTW9uaXRvckNvbm5lY3Rpb25JZCA9IGRlYnVnX2luZm8uU2VydmVyTW9uaXRvckNvbm5lY3Rpb25JZDsKKwlpbmZvLT5TZXJ2ZXJNb25pdG9yUGVuZGluZyA9IGRlYnVnX2luZm8uc2VydmVybW9uaXRvcl9wZW5kaW5nOworCWluZm8tPlNlcnZlck1vbml0b3JMYXRlbmN5ID0gZGVidWdfaW5mby5zZXJ2ZXJtb25pdG9yX2xhdGVuY3k7CisJaW5mby0+U2VydmVyTW9uaXRvckNvbm5lY3Rpb25JZCA9IGRlYnVnX2luZm8uc2VydmVybW9uaXRvcl9jb25uZWN0aW9uaWQ7CiAKLQlpbmZvLT5DbGllbnRNb25pdG9yUGVuZGluZyA9IGRlYnVnX2luZm8uQ2xpZW50TW9uaXRvclBlbmRpbmc7Ci0JaW5mby0+Q2xpZW50TW9uaXRvckxhdGVuY3kgPSBkZWJ1Z19pbmZvLkNsaWVudE1vbml0b3JMYXRlbmN5OwotCWluZm8tPkNsaWVudE1vbml0b3JDb25uZWN0aW9uSWQgPSBkZWJ1Z19pbmZvLkNsaWVudE1vbml0b3JDb25uZWN0aW9uSWQ7CisJaW5mby0+Q2xpZW50TW9uaXRvclBlbmRpbmcgPSBkZWJ1Z19pbmZvLmNsaWVudG1vbml0b3JfcGVuZGluZzsKKwlpbmZvLT5DbGllbnRNb25pdG9yTGF0ZW5jeSA9IGRlYnVnX2luZm8uY2xpZW50bW9uaXRvcl9sYXRlbmN5OworCWluZm8tPkNsaWVudE1vbml0b3JDb25uZWN0aW9uSWQgPSBkZWJ1Z19pbmZvLmNsaWVudG1vbml0b3JfY29ubmVjdGlvbmlkOwogCi0JaW5mby0+SW5ib3VuZC5JbnRlcnJ1cHRNYXNrID0gZGVidWdfaW5mby5JbmJvdW5kLkN1cnJlbnRJbnRlcnJ1cHRNYXNrOwotCWluZm8tPkluYm91bmQuUmVhZEluZGV4ID0gZGVidWdfaW5mby5JbmJvdW5kLkN1cnJlbnRSZWFkSW5kZXg7Ci0JaW5mby0+SW5ib3VuZC5Xcml0ZUluZGV4ID0gZGVidWdfaW5mby5JbmJvdW5kLkN1cnJlbnRXcml0ZUluZGV4OwotCWluZm8tPkluYm91bmQuQnl0ZXNBdmFpbFRvUmVhZCA9IGRlYnVnX2luZm8uSW5ib3VuZC5CeXRlc0F2YWlsVG9SZWFkOwotCWluZm8tPkluYm91bmQuQnl0ZXNBdmFpbFRvV3JpdGUgPSBkZWJ1Z19pbmZvLkluYm91bmQuQnl0ZXNBdmFpbFRvV3JpdGU7CisJaW5mby0+SW5ib3VuZC5JbnRlcnJ1cHRNYXNrID0gZGVidWdfaW5mby5pbmJvdW5kLmN1cnJlbnRfaW50ZXJydXB0X21hc2s7CisJaW5mby0+SW5ib3VuZC5SZWFkSW5kZXggPSBkZWJ1Z19pbmZvLmluYm91bmQuY3VycmVudF9yZWFkX2luZGV4OworCWluZm8tPkluYm91bmQuV3JpdGVJbmRleCA9IGRlYnVnX2luZm8uaW5ib3VuZC5jdXJyZW50X3dyaXRlX2luZGV4OworCWluZm8tPkluYm91bmQuQnl0ZXNBdmFpbFRvUmVhZCA9IGRlYnVnX2luZm8uaW5ib3VuZC5ieXRlc19hdmFpbF90b3JlYWQ7CisJaW5mby0+SW5ib3VuZC5CeXRlc0F2YWlsVG9Xcml0ZSA9CisJCWRlYnVnX2luZm8uaW5ib3VuZC5ieXRlc19hdmFpbF90b3dyaXRlOwogCi0JaW5mby0+T3V0Ym91bmQuSW50ZXJydXB0TWFzayA9IGRlYnVnX2luZm8uT3V0Ym91bmQuQ3VycmVudEludGVycnVwdE1hc2s7Ci0JaW5mby0+T3V0Ym91bmQuUmVhZEluZGV4ID0gZGVidWdfaW5mby5PdXRib3VuZC5DdXJyZW50UmVhZEluZGV4OwotCWluZm8tPk91dGJvdW5kLldyaXRlSW5kZXggPSBkZWJ1Z19pbmZvLk91dGJvdW5kLkN1cnJlbnRXcml0ZUluZGV4OwotCWluZm8tPk91dGJvdW5kLkJ5dGVzQXZhaWxUb1JlYWQgPSBkZWJ1Z19pbmZvLk91dGJvdW5kLkJ5dGVzQXZhaWxUb1JlYWQ7CisJaW5mby0+T3V0Ym91bmQuSW50ZXJydXB0TWFzayA9CisJCWRlYnVnX2luZm8ub3V0Ym91bmQuY3VycmVudF9pbnRlcnJ1cHRfbWFzazsKKwlpbmZvLT5PdXRib3VuZC5SZWFkSW5kZXggPSBkZWJ1Z19pbmZvLm91dGJvdW5kLmN1cnJlbnRfcmVhZF9pbmRleDsKKwlpbmZvLT5PdXRib3VuZC5Xcml0ZUluZGV4ID0gZGVidWdfaW5mby5vdXRib3VuZC5jdXJyZW50X3dyaXRlX2luZGV4OworCWluZm8tPk91dGJvdW5kLkJ5dGVzQXZhaWxUb1JlYWQgPQorCQlkZWJ1Z19pbmZvLm91dGJvdW5kLmJ5dGVzX2F2YWlsX3RvcmVhZDsKIAlpbmZvLT5PdXRib3VuZC5CeXRlc0F2YWlsVG9Xcml0ZSA9Ci0JCWRlYnVnX2luZm8uT3V0Ym91bmQuQnl0ZXNBdmFpbFRvV3JpdGU7CisJCWRlYnVnX2luZm8ub3V0Ym91bmQuYnl0ZXNfYXZhaWxfdG93cml0ZTsKIH0KIAogLyoKQEAgLTI4Niw0NCArNDU5LDU1IEBACiAgKgktIHNldHVwIHRoZSB2bWJ1cyByb290IGRldmljZQogICoJLSByZXRyaWV2ZSB0aGUgY2hhbm5lbCBvZmZlcnMKICAqLwotc3RhdGljIGludCB2bWJ1c19idXNfaW5pdChpbnQgKCpkcnZfaW5pdCkoc3RydWN0IGh2X2RyaXZlciAqZHJ2KSkKK3N0YXRpYyBpbnQgdm1idXNfYnVzX2luaXQodm9pZCkKIHsKIAlzdHJ1Y3Qgdm1idXNfZHJpdmVyX2NvbnRleHQgKnZtYnVzX2Rydl9jdHggPSAmZ192bWJ1c19kcnY7Ci0Jc3RydWN0IHZtYnVzX2RyaXZlciAqdm1idXNfZHJ2X29iaiA9ICZnX3ZtYnVzX2Rydi5kcnZfb2JqOworCXN0cnVjdCBodl9kcml2ZXIgKmRyaXZlciA9ICZnX3ZtYnVzX2Rydi5kcnZfb2JqOwogCXN0cnVjdCB2bV9kZXZpY2UgKmRldl9jdHggPSAmZ192bWJ1c19kcnYuZGV2aWNlX2N0eDsKIAlpbnQgcmV0OwogCXVuc2lnbmVkIGludCB2ZWN0b3I7CiAKLQkvKgotCSAqIFNldCB0aGlzIHVwIHRvIGFsbG93IGxvd2VyIGxheWVyIHRvIGNhbGxiYWNrIHRvIGFkZC9yZW1vdmUgY2hpbGQKLQkgKiBkZXZpY2VzIG9uIHRoZSBidXMKLQkgKi8KLQl2bWJ1c19kcnZfb2JqLT5PbkNoaWxkRGV2aWNlQ3JlYXRlID0gdm1idXNfY2hpbGRfZGV2aWNlX2NyZWF0ZTsKLQl2bWJ1c19kcnZfb2JqLT5PbkNoaWxkRGV2aWNlRGVzdHJveSA9IHZtYnVzX2NoaWxkX2RldmljZV9kZXN0cm95OwotCXZtYnVzX2Rydl9vYmotPk9uQ2hpbGREZXZpY2VBZGQgPSB2bWJ1c19jaGlsZF9kZXZpY2VfcmVnaXN0ZXI7Ci0Jdm1idXNfZHJ2X29iai0+T25DaGlsZERldmljZVJlbW92ZSA9IHZtYnVzX2NoaWxkX2RldmljZV91bnJlZ2lzdGVyOworCURQUklOVF9JTkZPKFZNQlVTLCAiKysrKysrKyBIViBEcml2ZXIgdmVyc2lvbiA9ICVzICsrKysrKysiLAorCQkgICAgSFZfRFJWX1ZFUlNJT04pOworCURQUklOVF9JTkZPKFZNQlVTLCAiKysrKysrKyBWbWJ1cyBzdXBwb3J0ZWQgdmVyc2lvbiA9ICVkICsrKysrKysiLAorCQkJVk1CVVNfUkVWSVNJT05fTlVNQkVSKTsKKwlEUFJJTlRfSU5GTyhWTUJVUywgIisrKysrKysgVm1idXMgdXNpbmcgU0lOVCAlZCArKysrKysrIiwKKwkJCVZNQlVTX01FU1NBR0VfU0lOVCk7CisJRFBSSU5UX0RCRyhWTUJVUywgInNpemVvZih2bWJ1c19jaGFubmVsX3BhY2tldF9wYWdlX2J1ZmZlcik9JXpkLCAiCisJCQkic2l6ZW9mKFZNQlVTX0NIQU5ORUxfUEFDS0VUX01VTElUUEFHRV9CVUZGRVIpPSV6ZCIsCisJCQlzaXplb2Yoc3RydWN0IHZtYnVzX2NoYW5uZWxfcGFja2V0X3BhZ2VfYnVmZmVyKSwKKwkJCXNpemVvZihzdHJ1Y3Qgdm1idXNfY2hhbm5lbF9wYWNrZXRfbXVsdGlwYWdlX2J1ZmZlcikpOwogCi0JLyogQ2FsbCB0byBidXMgZHJpdmVyIHRvIGluaXRpYWxpemUgKi8KLQlyZXQgPSBkcnZfaW5pdCgmdm1idXNfZHJ2X29iai0+QmFzZSk7CisJZHJpdmVyLT5uYW1lID0gZ0RyaXZlck5hbWU7CisJbWVtY3B5KCZkcml2ZXItPmRldmljZVR5cGUsICZnVm1idXNEZXZpY2VUeXBlLCBzaXplb2Yoc3RydWN0IGh2X2d1aWQpKTsKKworCS8qIFNldHVwIGRpc3BhdGNoIHRhYmxlICovCisJZHJpdmVyLT5PbkRldmljZUFkZAk9IFZtYnVzT25EZXZpY2VBZGQ7CisJZHJpdmVyLT5PbkRldmljZVJlbW92ZQk9IFZtYnVzT25EZXZpY2VSZW1vdmU7CisJZHJpdmVyLT5PbkNsZWFudXAJPSBWbWJ1c09uQ2xlYW51cDsKKworCS8qIEh5cGVydmlzb3IgaW5pdGlhbGl6YXRpb24uLi5zZXR1cCBoeXBlcmNhbGwgcGFnZS4uZXRjICovCisJcmV0ID0gaHZfaW5pdCgpOwogCWlmIChyZXQgIT0gMCkgewotCQlEUFJJTlRfRVJSKFZNQlVTX0RSViwgIlVuYWJsZSB0byBpbml0aWFsaXplIHZtYnVzICglZCkiLCByZXQpOworCQlEUFJJTlRfRVJSKFZNQlVTLCAiVW5hYmxlIHRvIGluaXRpYWxpemUgdGhlIGh5cGVydmlzb3IgLSAweCV4IiwKKwkJCQlyZXQpOwogCQlnb3RvIGNsZWFudXA7CiAJfQogCiAJLyogU2FuaXR5IGNoZWNrcyAqLwotCWlmICghdm1idXNfZHJ2X29iai0+QmFzZS5PbkRldmljZUFkZCkgeworCWlmICghZHJpdmVyLT5PbkRldmljZUFkZCkgewogCQlEUFJJTlRfRVJSKFZNQlVTX0RSViwgIk9uRGV2aWNlQWRkKCkgcm91dGluZSBub3Qgc2V0Iik7CiAJCXJldCA9IC0xOwogCQlnb3RvIGNsZWFudXA7CiAJfQogCi0Jdm1idXNfZHJ2X2N0eC0+YnVzLm5hbWUgPSB2bWJ1c19kcnZfb2JqLT5CYXNlLm5hbWU7CisJdm1idXNfZHJ2X2N0eC0+YnVzLm5hbWUgPSBkcml2ZXItPm5hbWU7CiAKIAkvKiBJbml0aWFsaXplIHRoZSBidXMgY29udGV4dCAqLwogCXRhc2tsZXRfaW5pdCgmdm1idXNfZHJ2X2N0eC0+bXNnX2RwYywgdm1idXNfbXNnX2RwYywKLQkJICAgICAodW5zaWduZWQgbG9uZyl2bWJ1c19kcnZfb2JqKTsKKwkJICAgICAodW5zaWduZWQgbG9uZylkcml2ZXIpOwogCXRhc2tsZXRfaW5pdCgmdm1idXNfZHJ2X2N0eC0+ZXZlbnRfZHBjLCB2bWJ1c19ldmVudF9kcGMsCi0JCSAgICAgKHVuc2lnbmVkIGxvbmcpdm1idXNfZHJ2X29iaik7CisJCSAgICAgKHVuc2lnbmVkIGxvbmcpZHJpdmVyKTsKIAogCS8qIE5vdywgcmVnaXN0ZXIgdGhlIGJ1cyBkcml2ZXIgd2l0aCBMRE0gKi8KIAlyZXQgPSBidXNfcmVnaXN0ZXIoJnZtYnVzX2Rydl9jdHgtPmJ1cyk7CkBAIC0zMzQsNyArNTE4LDcgQEAKIAogCS8qIEdldCB0aGUgaW50ZXJydXB0IHJlc291cmNlICovCiAJcmV0ID0gcmVxdWVzdF9pcnEodm1idXNfaXJxLCB2bWJ1c19pc3IsIElSUUZfU0FNUExFX1JBTkRPTSwKLQkJCSAgdm1idXNfZHJ2X29iai0+QmFzZS5uYW1lLCBOVUxMKTsKKwkJCSAgZHJpdmVyLT5uYW1lLCBOVUxMKTsKIAogCWlmIChyZXQgIT0gMCkgewogCQlEUFJJTlRfRVJSKFZNQlVTX0RSViwgIkVSUk9SIC0gVW5hYmxlIHRvIHJlcXVlc3QgSVJRICVkIiwKQEAgLTM1Miw3ICs1MzYsNyBAQAogCS8qIENhbGwgdG8gYnVzIGRyaXZlciB0byBhZGQgdGhlIHJvb3QgZGV2aWNlICovCiAJbWVtc2V0KGRldl9jdHgsIDAsIHNpemVvZihzdHJ1Y3Qgdm1fZGV2aWNlKSk7CiAKLQlyZXQgPSB2bWJ1c19kcnZfb2JqLT5CYXNlLk9uRGV2aWNlQWRkKCZkZXZfY3R4LT5kZXZpY2Vfb2JqLCAmdmVjdG9yKTsKKwlyZXQgPSBkcml2ZXItPk9uRGV2aWNlQWRkKCZkZXZfY3R4LT5kZXZpY2Vfb2JqLCAmdmVjdG9yKTsKIAlpZiAocmV0ICE9IDApIHsKIAkJRFBSSU5UX0VSUihWTUJVU19EUlYsCiAJCQkgICAiRVJST1IgLSBVbmFibGUgdG8gYWRkIHZtYnVzIHJvb3QgZGV2aWNlIik7CkBAIC0zOTIsOSArNTc2LDcgQEAKIAkJZ290byBjbGVhbnVwOwogCX0KIAotCi0Jdm1idXNfZHJ2X29iai0+R2V0Q2hhbm5lbE9mZmVycygpOwotCisJdm1idXNfcmVxdWVzdF9vZmZlcnMoKTsKIAl3YWl0X2Zvcl9jb21wbGV0aW9uKCZodl9jaGFubmVsX3JlYWR5KTsKIAogY2xlYW51cDoKQEAgLTQwOCwxNyArNTkwLDE3IEBACiAgKi8KIHN0YXRpYyB2b2lkIHZtYnVzX2J1c19leGl0KHZvaWQpCiB7Ci0Jc3RydWN0IHZtYnVzX2RyaXZlciAqdm1idXNfZHJ2X29iaiA9ICZnX3ZtYnVzX2Rydi5kcnZfb2JqOworCXN0cnVjdCBodl9kcml2ZXIgKmRyaXZlciA9ICZnX3ZtYnVzX2Rydi5kcnZfb2JqOwogCXN0cnVjdCB2bWJ1c19kcml2ZXJfY29udGV4dCAqdm1idXNfZHJ2X2N0eCA9ICZnX3ZtYnVzX2RydjsKIAogCXN0cnVjdCB2bV9kZXZpY2UgKmRldl9jdHggPSAmZ192bWJ1c19kcnYuZGV2aWNlX2N0eDsKIAogCS8qIFJlbW92ZSB0aGUgcm9vdCBkZXZpY2UgKi8KLQlpZiAodm1idXNfZHJ2X29iai0+QmFzZS5PbkRldmljZVJlbW92ZSkKLQkJdm1idXNfZHJ2X29iai0+QmFzZS5PbkRldmljZVJlbW92ZSgmZGV2X2N0eC0+ZGV2aWNlX29iaik7CisJaWYgKGRyaXZlci0+T25EZXZpY2VSZW1vdmUpCisJCWRyaXZlci0+T25EZXZpY2VSZW1vdmUoJmRldl9jdHgtPmRldmljZV9vYmopOwogCi0JaWYgKHZtYnVzX2Rydl9vYmotPkJhc2UuT25DbGVhbnVwKQotCQl2bWJ1c19kcnZfb2JqLT5CYXNlLk9uQ2xlYW51cCgmdm1idXNfZHJ2X29iai0+QmFzZSk7CisJaWYgKGRyaXZlci0+T25DbGVhbnVwKQorCQlkcml2ZXItPk9uQ2xlYW51cChkcml2ZXIpOwogCiAJLyogVW5yZWdpc3RlciB0aGUgcm9vdCBidXMgZGV2aWNlICovCiAJZGV2aWNlX3VucmVnaXN0ZXIoJmRldl9jdHgtPmRldmljZSk7CkBAIC00NDYsNyArNjI4LDYgQEAKICAqLwogaW50IHZtYnVzX2NoaWxkX2RyaXZlcl9yZWdpc3RlcihzdHJ1Y3QgZHJpdmVyX2NvbnRleHQgKmRyaXZlcl9jdHgpCiB7Ci0Jc3RydWN0IHZtYnVzX2RyaXZlciAqdm1idXNfZHJ2X29iaiA9ICZnX3ZtYnVzX2Rydi5kcnZfb2JqOwogCWludCByZXQ7CiAKIAlEUFJJTlRfSU5GTyhWTUJVU19EUlYsICJjaGlsZCBkcml2ZXIgKCVwKSByZWdpc3RlcmluZyAtIG5hbWUgJXMiLApAQCAtNDU3LDcgKzYzOCw3IEBACiAKIAlyZXQgPSBkcml2ZXJfcmVnaXN0ZXIoJmRyaXZlcl9jdHgtPmRyaXZlcik7CiAKLQl2bWJ1c19kcnZfb2JqLT5HZXRDaGFubmVsT2ZmZXJzKCk7CisJdm1idXNfcmVxdWVzdF9vZmZlcnMoKTsKIAogCXJldHVybiByZXQ7CiB9CkBAIC00ODksOSArNjcwLDkgQEAKICAqIHZtYnVzX2NoaWxkX2RldmljZV9jcmVhdGUgLSBDcmVhdGVzIGFuZCByZWdpc3RlcnMgYSBuZXcgY2hpbGQgZGV2aWNlCiAgKiBvbiB0aGUgdm1idXMuCiAgKi8KLXN0YXRpYyBzdHJ1Y3QgaHZfZGV2aWNlICp2bWJ1c19jaGlsZF9kZXZpY2VfY3JlYXRlKHN0cnVjdCBodl9ndWlkICp0eXBlLAotCQkJCQkJICAgc3RydWN0IGh2X2d1aWQgKmluc3RhbmNlLAotCQkJCQkJICAgc3RydWN0IHZtYnVzX2NoYW5uZWwgKmNoYW5uZWwpCitzdHJ1Y3QgaHZfZGV2aWNlICp2bWJ1c19jaGlsZF9kZXZpY2VfY3JlYXRlKHN0cnVjdCBodl9ndWlkICp0eXBlLAorCQkJCQkgICAgc3RydWN0IGh2X2d1aWQgKmluc3RhbmNlLAorCQkJCQkgICAgc3RydWN0IHZtYnVzX2NoYW5uZWwgKmNoYW5uZWwpCiB7CiAJc3RydWN0IHZtX2RldmljZSAqY2hpbGRfZGV2aWNlX2N0eDsKIAlzdHJ1Y3QgaHZfZGV2aWNlICpjaGlsZF9kZXZpY2Vfb2JqOwpAQCAtNTM4LDggKzcxOSw4IEBACiAvKgogICogdm1idXNfY2hpbGRfZGV2aWNlX3JlZ2lzdGVyIC0gUmVnaXN0ZXIgdGhlIGNoaWxkIGRldmljZSBvbiB0aGUgc3BlY2lmaWVkIGJ1cwogICovCi1zdGF0aWMgaW50IHZtYnVzX2NoaWxkX2RldmljZV9yZWdpc3RlcihzdHJ1Y3QgaHZfZGV2aWNlICpyb290X2RldmljZV9vYmosCi0JCQkJICAgICAgIHN0cnVjdCBodl9kZXZpY2UgKmNoaWxkX2RldmljZV9vYmopCitpbnQgdm1idXNfY2hpbGRfZGV2aWNlX3JlZ2lzdGVyKHN0cnVjdCBodl9kZXZpY2UgKnJvb3RfZGV2aWNlX29iaiwKKwkJCQlzdHJ1Y3QgaHZfZGV2aWNlICpjaGlsZF9kZXZpY2Vfb2JqKQogewogCWludCByZXQgPSAwOwogCXN0cnVjdCB2bV9kZXZpY2UgKnJvb3RfZGV2aWNlX2N0eCA9CkBAIC01ODMsNyArNzY0LDcgQEAKICAqIHZtYnVzX2NoaWxkX2RldmljZV91bnJlZ2lzdGVyIC0gUmVtb3ZlIHRoZSBzcGVjaWZpZWQgY2hpbGQgZGV2aWNlCiAgKiBmcm9tIHRoZSB2bWJ1cy4KICAqLwotc3RhdGljIHZvaWQgdm1idXNfY2hpbGRfZGV2aWNlX3VucmVnaXN0ZXIoc3RydWN0IGh2X2RldmljZSAqZGV2aWNlX29iaikKK3ZvaWQgdm1idXNfY2hpbGRfZGV2aWNlX3VucmVnaXN0ZXIoc3RydWN0IGh2X2RldmljZSAqZGV2aWNlX29iaikKIHsKIAlzdHJ1Y3Qgdm1fZGV2aWNlICpkZXZpY2VfY3R4ID0gdG9fdm1fZGV2aWNlKGRldmljZV9vYmopOwogCkBAIC02MDEsMTMgKzc4Miw2IEBACiB9CiAKIC8qCi0gKiB2bWJ1c19jaGlsZF9kZXZpY2VfZGVzdHJveSAtIERlc3Ryb3kgdGhlIHNwZWNpZmllZCBjaGlsZCBkZXZpY2Ugb24gdGhlIHZtYnVzLgotICovCi1zdGF0aWMgdm9pZCB2bWJ1c19jaGlsZF9kZXZpY2VfZGVzdHJveShzdHJ1Y3QgaHZfZGV2aWNlICpkZXZpY2Vfb2JqKQotewotfQotCi0vKgogICogdm1idXNfdWV2ZW50IC0gYWRkIHVldmVudCBmb3Igb3VyIGRldmljZQogICoKICAqIFRoaXMgcm91dGluZSBpcyBpbnZva2VkIHdoZW4gYSBkZXZpY2UgaXMgYWRkZWQgb3IgcmVtb3ZlZCBvbiB0aGUgdm1idXMgdG8KQEAgLTcwMSw3ICs4NzUsNyBAQAogCQlzdHJ1Y3Qgdm1idXNfZHJpdmVyX2NvbnRleHQgKnZtYnVzX2Rydl9jdHggPQogCQkJKHN0cnVjdCB2bWJ1c19kcml2ZXJfY29udGV4dCAqKWRyaXZlcl9jdHg7CiAKLQkJZGV2aWNlX2N0eC0+ZGV2aWNlX29iai5Ecml2ZXIgPSAmdm1idXNfZHJ2X2N0eC0+ZHJ2X29iai5CYXNlOworCQlkZXZpY2VfY3R4LT5kZXZpY2Vfb2JqLkRyaXZlciA9ICZ2bWJ1c19kcnZfY3R4LT5kcnZfb2JqOwogCQlEUFJJTlRfSU5GTyhWTUJVU19EUlYsCiAJCQkgICAgImRldmljZSBvYmplY3QgKCVwKSBzZXQgdG8gZHJpdmVyIG9iamVjdCAoJXApIiwKIAkJCSAgICAmZGV2aWNlX2N0eC0+ZGV2aWNlX29iaiwKQEAgLTg0OSw3ICsxMDIzLDYgQEAKIHsKIAlzdHJ1Y3Qgdm1fZGV2aWNlICpkZXZpY2VfY3R4ID0gZGV2aWNlX3RvX3ZtX2RldmljZShkZXZpY2UpOwogCi0JLyogdm1idXNfY2hpbGRfZGV2aWNlX2Rlc3Ryb3koJmRldmljZV9jdHgtPmRldmljZV9vYmopOyAqLwogCWtmcmVlKGRldmljZV9jdHgpOwogCiAJLyogISFETyBOT1QgUkVGRVJFTkNFIGRldmljZV9jdHggYW55bW9yZSBhdCB0aGlzIHBvaW50ISEgKi8KQEAgLTg2MCwzNiArMTAzMywyOCBAQAogICovCiBzdGF0aWMgdm9pZCB2bWJ1c19tc2dfZHBjKHVuc2lnbmVkIGxvbmcgZGF0YSkKIHsKLQlzdHJ1Y3Qgdm1idXNfZHJpdmVyICp2bWJ1c19kcnZfb2JqID0gKHN0cnVjdCB2bWJ1c19kcml2ZXIgKilkYXRhOwotCi0JLyogQVNTRVJUKHZtYnVzX2Rydl9vYmotPk9uTXNnRHBjICE9IE5VTEwpOyAqLworCXN0cnVjdCBodl9kcml2ZXIgKmRyaXZlciA9IChzdHJ1Y3QgaHZfZHJpdmVyICopZGF0YTsKIAogCS8qIENhbGwgdG8gYnVzIGRyaXZlciB0byBoYW5kbGUgaW50ZXJydXB0ICovCi0Jdm1idXNfZHJ2X29iai0+T25Nc2dEcGMoJnZtYnVzX2Rydl9vYmotPkJhc2UpOworCXZtYnVzX29uX21zZ19kcGMoZHJpdmVyKTsKIH0KIAogLyoKLSAqIHZtYnVzX21zZ19kcGMgLSBUYXNrbGV0IHJvdXRpbmUgdG8gaGFuZGxlIGh5cGVydmlzb3IgZXZlbnRzCisgKiB2bWJ1c19ldmVudF9kcGMgLSBUYXNrbGV0IHJvdXRpbmUgdG8gaGFuZGxlIGh5cGVydmlzb3IgZXZlbnRzCiAgKi8KIHN0YXRpYyB2b2lkIHZtYnVzX2V2ZW50X2RwYyh1bnNpZ25lZCBsb25nIGRhdGEpCiB7Ci0Jc3RydWN0IHZtYnVzX2RyaXZlciAqdm1idXNfZHJ2X29iaiA9IChzdHJ1Y3Qgdm1idXNfZHJpdmVyICopZGF0YTsKLQotCS8qIEFTU0VSVCh2bWJ1c19kcnZfb2JqLT5PbkV2ZW50RHBjICE9IE5VTEwpOyAqLwotCiAJLyogQ2FsbCB0byBidXMgZHJpdmVyIHRvIGhhbmRsZSBpbnRlcnJ1cHQgKi8KLQl2bWJ1c19kcnZfb2JqLT5PbkV2ZW50RHBjKCZ2bWJ1c19kcnZfb2JqLT5CYXNlKTsKKwlWbWJ1c09uRXZlbnRzKCk7CiB9CiAKIHN0YXRpYyBpcnFyZXR1cm5fdCB2bWJ1c19pc3IoaW50IGlycSwgdm9pZCAqZGV2X2lkKQogewotCXN0cnVjdCB2bWJ1c19kcml2ZXIgKnZtYnVzX2RyaXZlcl9vYmogPSAmZ192bWJ1c19kcnYuZHJ2X29iajsKKwlzdHJ1Y3QgaHZfZHJpdmVyICpkcml2ZXIgPSAmZ192bWJ1c19kcnYuZHJ2X29iajsKIAlpbnQgcmV0OwogCi0JLyogQVNTRVJUKHZtYnVzX2RyaXZlcl9vYmotPk9uSXNyICE9IE5VTEwpOyAqLwotCiAJLyogQ2FsbCB0byBidXMgZHJpdmVyIHRvIGhhbmRsZSBpbnRlcnJ1cHQgKi8KLQlyZXQgPSB2bWJ1c19kcml2ZXJfb2JqLT5Pbklzcigmdm1idXNfZHJpdmVyX29iai0+QmFzZSk7CisJcmV0ID0gdm1idXNfb25faXNyKGRyaXZlcik7CiAKIAkvKiBTY2hlZHVsZXMgYSBkcGMgaWYgbmVjZXNzYXJ5ICovCiAJaWYgKHJldCA+IDApIHsKQEAgLTkyOCw3ICsxMDkzLDcgQEAKIAlpZiAoIWRtaV9jaGVja19zeXN0ZW0obWljcm9zb2Z0X2h2X2RtaV90YWJsZSkpCiAJCXJldHVybiAtRU5PREVWOwogCi0JcmV0dXJuIHZtYnVzX2J1c19pbml0KFZtYnVzSW5pdGlhbGl6ZSk7CisJcmV0dXJuIHZtYnVzX2J1c19pbml0KCk7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCB2bWJ1c19leGl0KHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaHYvdm1idXNfcHJpdmF0ZS5oIGIvZHJpdmVycy9zdGFnaW5nL2h2L3ZtYnVzX3ByaXZhdGUuaAppbmRleCAwOWVhZWM5Li4wN2Y2ZDIyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaHYvdm1idXNfcHJpdmF0ZS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9odi92bWJ1c19wcml2YXRlLmgKQEAgLTEwMiwxMyArMTAyLDE0IEBACiAKIC8qIEdlbmVyYWwgdm1idXMgaW50ZXJmYWNlICovCiAKLXN0cnVjdCBodl9kZXZpY2UgKlZtYnVzQ2hpbGREZXZpY2VDcmVhdGUoc3RydWN0IGh2X2d1aWQgKmRldmljZVR5cGUsCitzdHJ1Y3QgaHZfZGV2aWNlICp2bWJ1c19jaGlsZF9kZXZpY2VfY3JlYXRlKHN0cnVjdCBodl9ndWlkICpkZXZpY2VUeXBlLAogCQkJCQkgc3RydWN0IGh2X2d1aWQgKmRldmljZUluc3RhbmNlLAogCQkJCQkgc3RydWN0IHZtYnVzX2NoYW5uZWwgKmNoYW5uZWwpOwogCiBpbnQgVm1idXNDaGlsZERldmljZUFkZChzdHJ1Y3QgaHZfZGV2aWNlICpEZXZpY2UpOwotCi12b2lkIFZtYnVzQ2hpbGREZXZpY2VSZW1vdmUoc3RydWN0IGh2X2RldmljZSAqRGV2aWNlKTsKK2ludCB2bWJ1c19jaGlsZF9kZXZpY2VfcmVnaXN0ZXIoc3RydWN0IGh2X2RldmljZSAqcm9vdF9kZXZpY2Vfb2JqLAorCQkJCXN0cnVjdCBodl9kZXZpY2UgKmNoaWxkX2RldmljZV9vYmopOwordm9pZCB2bWJ1c19jaGlsZF9kZXZpY2VfdW5yZWdpc3RlcihzdHJ1Y3QgaHZfZGV2aWNlICpkZXZpY2Vfb2JqKTsKIAogLyogc3RhdGljIHZvaWQgKi8KIC8qIFZtYnVzQ2hpbGREZXZpY2VEZXN0cm95KCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2h2L3ZzdG9yYWdlLmggYi9kcml2ZXJzL3N0YWdpbmcvaHYvdnN0b3JhZ2UuaAppbmRleCA0ZWE1OTdkLi5hZThiZTg0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaHYvdnN0b3JhZ2UuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaHYvdnN0b3JhZ2UuaApAQCAtMjcsMTUgKzI3LDE3IEBACiAKICNkZWZpbmUgUkVWSVNJT05fU1RSSU5HKFJFVklTSU9OXykgI1JFVklTSU9OXwogI2RlZmluZSBGSUxMX1ZNU1RPUl9SRVZJU0lPTihSRVNVTFRfTFZBTFVFXykJCQkJXAotewkJCQkJCQkJCVwKLQljaGFyICpyZXZpc2lvblN0cmluZyA9IFJFVklTSU9OX1NUUklORygkUmV2aXNpb24gOiA2ICQpICsgMTE7CVwKLQlSRVNVTFRfTFZBTFVFXyA9IDA7CQkJCQkJXAotCXdoaWxlICgqcmV2aXNpb25TdHJpbmcgPj0gJzAnICYmICpyZXZpc2lvblN0cmluZyA8PSAnOScpIHsJXAotCQlSRVNVTFRfTFZBTFVFXyAqPSAxMDsJCQkJCVwKLQkJUkVTVUxUX0xWQUxVRV8gKz0gKnJldmlzaW9uU3RyaW5nIC0gJzAnOwkJXAotCQlyZXZpc2lvblN0cmluZysrOwkJCQkJXAotCX0JCQkJCQkJCVwKLX0KKwlkbyB7CQkJCQkJCQlcCisJCWNoYXIgKnJldmlzaW9uX3N0cmluZwkJCQkJXAorCQkJPSBSRVZJU0lPTl9TVFJJTkcoJFJldiA6IDYgJCkgKyA2OwkJXAorCQlSRVNVTFRfTFZBTFVFXyA9IDA7CQkJCQlcCisJCXdoaWxlICgqcmV2aXNpb25fc3RyaW5nID49ICcwJwkJCQlcCisJCQkmJiAqcmV2aXNpb25fc3RyaW5nIDw9ICc5JykgewkJCVwKKwkJCVJFU1VMVF9MVkFMVUVfICo9IDEwOwkJCQlcCisJCQlSRVNVTFRfTFZBTFVFXyArPSAqcmV2aXNpb25fc3RyaW5nIC0gJzAnOwlcCisJCQlyZXZpc2lvbl9zdHJpbmcrKzsJCQkJXAorCQl9CQkJCQkJCVwKKwl9IHdoaWxlICgwKQogCiAvKiBNYWpvci9taW5vciBtYWNyb3MuICBNaW5vciB2ZXJzaW9uIGlzIGluIExTQiwgbWVhbmluZyB0aGF0IGVhcmxpZXIgZmxhdCAqLwogLyogdmVyc2lvbiBudW1iZXJzIHdpbGwgYmUgaW50ZXJwcmV0ZWQgYXMgIjAueCIgKGkuZS4sIDEgYmVjb21lcyAwLjEpLiAqLwpAQCAtNjUsMTcgKzY3LDE3IEBACiAKIC8qICBQYWNrZXQgc3RydWN0dXJlIGRlc2NyaWJpbmcgdmlydHVhbCBzdG9yYWdlIHJlcXVlc3RzLiAqLwogZW51bSB2c3Rvcl9wYWNrZXRfb3BlcmF0aW9uIHsKLQlWU3Rvck9wZXJhdGlvbkNvbXBsZXRlSW8gICAgICAgICAgICA9IDEsCi0JVlN0b3JPcGVyYXRpb25SZW1vdmVEZXZpY2UgICAgICAgICAgPSAyLAotCVZTdG9yT3BlcmF0aW9uRXhlY3V0ZVNSQiAgICAgICAgICAgID0gMywKLQlWU3Rvck9wZXJhdGlvblJlc2V0THVuICAgICAgICAgICAgICA9IDQsCi0JVlN0b3JPcGVyYXRpb25SZXNldEFkYXB0ZXIgICAgICAgICAgPSA1LAotCVZTdG9yT3BlcmF0aW9uUmVzZXRCdXMgICAgICAgICAgICAgID0gNiwKLQlWU3Rvck9wZXJhdGlvbkJlZ2luSW5pdGlhbGl6YXRpb24gICA9IDcsCi0JVlN0b3JPcGVyYXRpb25FbmRJbml0aWFsaXphdGlvbiAgICAgPSA4LAotCVZTdG9yT3BlcmF0aW9uUXVlcnlQcm90b2NvbFZlcnNpb24gID0gOSwKLQlWU3Rvck9wZXJhdGlvblF1ZXJ5UHJvcGVydGllcyAgICAgICA9IDEwLAotCVZTdG9yT3BlcmF0aW9uTWF4aW11bSAgICAgICAgICAgICAgID0gMTAKKwlWU1RPUl9PUEVSQVRJT05fQ09NUExFVEVfSU8JCT0gMSwKKwlWU1RPUl9PUEVSQVRJT05fUkVNT1ZFX0RFVklDRQkJPSAyLAorCVZTVE9SX09QRVJBVElPTl9FWEVDVVRFX1NSQgkJPSAzLAorCVZTVE9SX09QRVJBVElPTl9SRVNFVF9MVU4JCT0gNCwKKwlWU1RPUl9PUEVSQVRJT05fUkVTRVRfQURBUFRFUgkJPSA1LAorCVZTVE9SX09QRVJBVElPTl9SRVNFVF9CVVMJCT0gNiwKKwlWU1RPUl9PUEVSQVRJT05fQkVHSU5fSU5JVElBTElaQVRJT04JPSA3LAorCVZTVE9SX09QRVJBVElPTl9FTkRfSU5JVElBTElaQVRJT04JPSA4LAorCVZTVE9SX09QRVJBVElPTl9RVUVSWV9QUk9UT0NPTF9WRVJTSU9OCT0gOSwKKwlWU1RPUl9PUEVSQVRJT05fUVVFUllfUFJPUEVSVElFUwk9IDEwLAorCVZTVE9SX09QRVJBVElPTl9NQVhJTVVNCQkJPSAxMAogfTsKIAogLyoKQEAgLTg5LDMxICs5MSwyOSBAQAogI2RlZmluZSBTRU5TRV9CVUZGRVJfU0laRQkJCTB4MTIKICNlbmRpZgogCi0jZGVmaW5lIE1BWF9EQVRBX0JVRkZFUl9MRU5HVEhfV0lUSF9QQURESU5HCTB4MTQKKyNkZWZpbmUgTUFYX0RBVEFfQlVGX0xFTl9XSVRIX1BBRERJTkcJCTB4MTQKIAogc3RydWN0IHZtc2NzaV9yZXF1ZXN0IHsKLQl1bnNpZ25lZCBzaG9ydCBMZW5ndGg7Ci0JdW5zaWduZWQgY2hhciBTcmJTdGF0dXM7Ci0JdW5zaWduZWQgY2hhciBTY3NpU3RhdHVzOworCXVuc2lnbmVkIHNob3J0IGxlbmd0aDsKKwl1bnNpZ25lZCBjaGFyIHNyYl9zdGF0dXM7CisJdW5zaWduZWQgY2hhciBzY3NpX3N0YXR1czsKIAotCXVuc2lnbmVkIGNoYXIgUG9ydE51bWJlcjsKLQl1bnNpZ25lZCBjaGFyIFBhdGhJZDsKLQl1bnNpZ25lZCBjaGFyIFRhcmdldElkOwotCXVuc2lnbmVkIGNoYXIgTHVuOworCXVuc2lnbmVkIGNoYXIgcG9ydF9udW1iZXI7CisJdW5zaWduZWQgY2hhciBwYXRoX2lkOworCXVuc2lnbmVkIGNoYXIgdGFyZ2V0X2lkOworCXVuc2lnbmVkIGNoYXIgbHVuOwogCi0JdW5zaWduZWQgY2hhciBDZGJMZW5ndGg7Ci0JdW5zaWduZWQgY2hhciBTZW5zZUluZm9MZW5ndGg7Ci0JdW5zaWduZWQgY2hhciBEYXRhSW47Ci0JdW5zaWduZWQgY2hhciBSZXNlcnZlZDsKKwl1bnNpZ25lZCBjaGFyIGNkYl9sZW5ndGg7CisJdW5zaWduZWQgY2hhciBzZW5zZV9pbmZvX2xlbmd0aDsKKwl1bnNpZ25lZCBjaGFyIGRhdGFfaW47CisJdW5zaWduZWQgY2hhciByZXNlcnZlZDsKIAotCXVuc2lnbmVkIGludCBEYXRhVHJhbnNmZXJMZW5ndGg7CisJdW5zaWduZWQgaW50IGRhdGFfdHJhbnNmZXJfbGVuZ3RoOwogCiAJdW5pb24gewotCXVuc2lnbmVkIGNoYXIgQ2RiW0NEQjE2R0VORVJJQ19MRU5HVEhdOwotCi0JdW5zaWduZWQgY2hhciBTZW5zZURhdGFbU0VOU0VfQlVGRkVSX1NJWkVdOwotCi0JdW5zaWduZWQgY2hhciBSZXNlcnZlZEFycmF5W01BWF9EQVRBX0JVRkZFUl9MRU5HVEhfV0lUSF9QQURESU5HXTsKKwkJdW5zaWduZWQgY2hhciBjZGJbQ0RCMTZHRU5FUklDX0xFTkdUSF07CisJCXVuc2lnbmVkIGNoYXIgc2Vuc2VfZGF0YVtTRU5TRV9CVUZGRVJfU0laRV07CisJCXVuc2lnbmVkIGNoYXIgcmVzZXJ2ZWRfYXJyYXlbTUFYX0RBVEFfQlVGX0xFTl9XSVRIX1BBRERJTkddOwogCX07CiB9IF9fYXR0cmlidXRlKChwYWNrZWQpKTsKIApAQCAtMTIzLDI0ICsxMjMsMjQgQEAKICAqIHByb3BlcnRpZXMgb2YgdGhlIGNoYW5uZWwuCiAgKi8KIHN0cnVjdCB2bXN0b3JhZ2VfY2hhbm5lbF9wcm9wZXJ0aWVzIHsKLQl1bnNpZ25lZCBzaG9ydCBQcm90b2NvbFZlcnNpb247Ci0JdW5zaWduZWQgY2hhciAgUGF0aElkOwotCXVuc2lnbmVkIGNoYXIgIFRhcmdldElkOworCXVuc2lnbmVkIHNob3J0IHByb3RvY29sX3ZlcnNpb247CisJdW5zaWduZWQgY2hhciBwYXRoX2lkOworCXVuc2lnbmVkIGNoYXIgdGFyZ2V0X2lkOwogCiAJLyogTm90ZTogcG9ydCBudW1iZXIgaXMgb25seSByZWFsbHkga25vd24gb24gdGhlIGNsaWVudCBzaWRlICovCi0JdW5zaWduZWQgaW50ICBQb3J0TnVtYmVyOwotCXVuc2lnbmVkIGludCAgRmxhZ3M7Ci0JdW5zaWduZWQgaW50ICBNYXhUcmFuc2ZlckJ5dGVzOworCXVuc2lnbmVkIGludCBwb3J0X251bWJlcjsKKwl1bnNpZ25lZCBpbnQgZmxhZ3M7CisJdW5zaWduZWQgaW50IG1heF90cmFuc2Zlcl9ieXRlczsKIAogCS8qICBUaGlzIGlkIGlzIHVuaXF1ZSBmb3IgZWFjaCBjaGFubmVsIGFuZCB3aWxsIGNvcnJlc3BvbmQgd2l0aCAqLwogCS8qICB2ZW5kb3Igc3BlY2lmaWMgZGF0YSBpbiB0aGUgaW5xdWlyeWRhdGEgKi8KLQl1bnNpZ25lZCBsb25nIGxvbmcgVW5pcXVlSWQ7CisJdW5zaWduZWQgbG9uZyBsb25nIHVuaXF1ZV9pZDsKIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CiAKIC8qICBUaGlzIHN0cnVjdHVyZSBpcyBzZW50IGR1cmluZyB0aGUgc3RvcmFnZSBwcm90b2NvbCBuZWdvdGlhdGlvbnMuICovCiBzdHJ1Y3Qgdm1zdG9yYWdlX3Byb3RvY29sX3ZlcnNpb24gewogCS8qIE1ham9yIChNU1cpIGFuZCBtaW5vciAoTFNXKSB2ZXJzaW9uIG51bWJlcnMuICovCi0JdW5zaWduZWQgc2hvcnQgTWFqb3JNaW5vcjsKKwl1bnNpZ25lZCBzaG9ydCBtYWpvcl9taW5vcjsKIAogCS8qCiAJICogUmV2aXNpb24gbnVtYmVyIGlzIGF1dG8taW5jcmVtZW50ZWQgd2hlbmV2ZXIgdGhpcyBmaWxlIGlzIGNoYW5nZWQKQEAgLTE0OCw3ICsxNDgsNyBAQAogCSAqIGRlZmluaXRlbHkgaW5kaWNhdGUgaW5jb21wYXRpYmlsaXR5LS1idXQgaXQgZG9lcyBpbmRpY2F0ZSBtaXNtYXRjaGVkCiAJICogYnVpbGRzLgogCSAqLwotCXVuc2lnbmVkIHNob3J0IFJldmlzaW9uOworCXVuc2lnbmVkIHNob3J0IHJldmlzaW9uOwogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIAogLyogQ2hhbm5lbCBQcm9wZXJ0eSBGbGFncyAqLwpAQCAtMTU3LDEzICsxNTcsMTMgQEAKIAogc3RydWN0IHZzdG9yX3BhY2tldCB7CiAJLyogUmVxdWVzdGVkIG9wZXJhdGlvbiB0eXBlICovCi0JZW51bSB2c3Rvcl9wYWNrZXRfb3BlcmF0aW9uIE9wZXJhdGlvbjsKKwllbnVtIHZzdG9yX3BhY2tldF9vcGVyYXRpb24gb3BlcmF0aW9uOwogCiAJLyogIEZsYWdzIC0gc2VlIGJlbG93IGZvciB2YWx1ZXMgKi8KLQl1bnNpZ25lZCBpbnQgICAgIEZsYWdzOworCXVuc2lnbmVkIGludCBmbGFnczsKIAogCS8qIFN0YXR1cyBvZiB0aGUgcmVxdWVzdCByZXR1cm5lZCBmcm9tIHRoZSBzZXJ2ZXIgc2lkZS4gKi8KLQl1bnNpZ25lZCBpbnQgICAgIFN0YXR1czsKKwl1bnNpZ25lZCBpbnQgc3RhdHVzOwogCiAJLyogRGF0YSBwYXlsb2FkIGFyZWEgKi8KIAl1bmlvbiB7CkBAIC0xNzEsMTMgKzE3MSwxMyBAQAogCQkgKiBTdHJ1Y3R1cmUgdXNlZCB0byBmb3J3YXJkIFNDU0kgY29tbWFuZHMgZnJvbSB0aGUKIAkJICogY2xpZW50IHRvIHRoZSBzZXJ2ZXIuCiAJCSAqLwotCQlzdHJ1Y3Qgdm1zY3NpX3JlcXVlc3QgVm1TcmI7CisJCXN0cnVjdCB2bXNjc2lfcmVxdWVzdCB2bV9zcmI7CiAKIAkJLyogU3RydWN0dXJlIHVzZWQgdG8gcXVlcnkgY2hhbm5lbCBwcm9wZXJ0aWVzLiAqLwotCQlzdHJ1Y3Qgdm1zdG9yYWdlX2NoYW5uZWxfcHJvcGVydGllcyBTdG9yYWdlQ2hhbm5lbFByb3BlcnRpZXM7CisJCXN0cnVjdCB2bXN0b3JhZ2VfY2hhbm5lbF9wcm9wZXJ0aWVzIHN0b3JhZ2VfY2hhbm5lbF9wcm9wZXJ0aWVzOwogCiAJCS8qIFVzZWQgZHVyaW5nIHZlcnNpb24gbmVnb3RpYXRpb25zLiAqLwotCQlzdHJ1Y3Qgdm1zdG9yYWdlX3Byb3RvY29sX3ZlcnNpb24gVmVyc2lvbjsKKwkJc3RydWN0IHZtc3RvcmFnZV9wcm90b2NvbF92ZXJzaW9uIHZlcnNpb247CiAJfTsKIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vRG9jdW1lbnRhdGlvbi9zeXNmcy1idXMtaWlvIGIvZHJpdmVycy9zdGFnaW5nL2lpby9Eb2N1bWVudGF0aW9uL3N5c2ZzLWJ1cy1paW8KaW5kZXggZmRiMDE3YS4uMmRkZTk3ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9Eb2N1bWVudGF0aW9uL3N5c2ZzLWJ1cy1paW8KKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9Eb2N1bWVudGF0aW9uL3N5c2ZzLWJ1cy1paW8KQEAgLTEsMTEgKzEsMTIgQEAKLVdoYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9kZXZpY2Vbbl0KK1doYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9kZXZpY2VYCiBLZXJuZWxWZXJzaW9uOgkyLjYuMzUKIENvbnRhY3Q6CWxpbnV4LWlpb0B2Z2VyLmtlcm5lbC5vcmcKIERlc2NyaXB0aW9uOgogCQlIYXJkd2FyZSBjaGlwIG9yIGRldmljZSBhY2Nlc3NlZCBieSBvbiBjb21tdW5pY2F0aW9uIHBvcnQuCi0JCUNvcnJlc3BvbmRzIHRvIGEgZ3JvdXBpbmcgb2Ygc2Vuc29yIGNoYW5uZWxzLgorCQlDb3JyZXNwb25kcyB0byBhIGdyb3VwaW5nIG9mIHNlbnNvciBjaGFubmVscy4gWCBpcyB0aGUgSUlPCisJCWluZGV4IG9mIHRoZSBkZXZpY2UuCiAKLVdoYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy90cmlnZ2VyW25dCitXaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvdHJpZ2dlclgKIEtlcm5lbFZlcnNpb246CTIuNi4zNQogQ29udGFjdDoJbGludXgtaWlvQHZnZXIua2VybmVsLm9yZwogRGVzY3JpcHRpb246CkBAIC0xMywyNSArMTQsMjYgQEAKIAkJTWF5IGJlIHByb3ZpZGVkIGJ5IGEgZGV2aWNlIGRyaXZlciB0aGF0IGFsc28gaGFzIGFuIElJTyBkZXZpY2UKIAkJYmFzZWQgb24gaGFyZHdhcmUgZ2VuZXJhdGVkIGV2ZW50cyAoZS5nLiBkYXRhIHJlYWR5KSBvcgogCQlwcm92aWRlZCBieSBhIHNlcGFyYXRlIGRyaXZlciBmb3Igb3RoZXIgaGFyZHdhcmUgKGUuZy4KLQkJcGVyaW9kaWMgdGltZXIsIGdwaW8gb3IgaGlnaCByZXNvbHV0aW9uIHRpbWVyKS4KKwkJcGVyaW9kaWMgdGltZXIsIEdQSU8gb3IgaGlnaCByZXNvbHV0aW9uIHRpbWVyKS4KIAkJQ29udGFpbnMgdHJpZ2dlciB0eXBlIHNwZWNpZmljIGVsZW1lbnRzLiBUaGVzZSBkbyBub3QKIAkJZ2VuZXJhbGl6ZSB3ZWxsIGFuZCBoZW5jZSBhcmUgbm90IGRvY3VtZW50ZWQgaW4gdGhpcyBmaWxlLgorCQlYIGlzIHRoZSBJSU8gaW5kZXggb2YgdGhlIHRyaWdnZXIuCiAKLVdoYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9kZXZpY2Vbbl06YnVmZmVyCitXaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvZGV2aWNlWDpidWZmZXIKIEtlcm5lbFZlcnNpb246CTIuNi4zNQogQ29udGFjdDoJbGludXgtaWlvQHZnZXIua2VybmVsLm9yZwogRGVzY3JpcHRpb246Ci0JCUxpbmsgdG8gL3N5cy9jbGFzcy9paW8vZGV2aWNlW25dL2RldmljZVtuXTpidWZmZXIuIG4gaW5kaWNhdGVzCisJCUxpbmsgdG8gL3N5cy9jbGFzcy9paW8vZGV2aWNlWC9kZXZpY2VYOmJ1ZmZlci4gWCBpbmRpY2F0ZXMKIAkJdGhlIGRldmljZSB3aXRoIHdoaWNoIHRoaXMgYnVmZmVyIGJ1ZmZlciBpcyBhc3NvY2lhdGVkLgogCi1XaGF0OgkJL3N5cy8uLi4vZGV2aWNlW25dL25hbWUKK1doYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9kZXZpY2VYL25hbWUKIEtlcm5lbFZlcnNpb246CTIuNi4zNQogQ29udGFjdDoJbGludXgtaWlvQHZnZXIua2VybmVsLm9yZwogRGVzY3JpcHRpb246Ci0JCURlc2NyaXB0aW9uIG9mIHRoZSBwaHlzaWNhbCBjaGlwIC8gZGV2aWNlLiBUeXBpY2FsbHkgYSBwYXJ0Ci0JCW51bWJlci4KKwkJRGVzY3JpcHRpb24gb2YgdGhlIHBoeXNpY2FsIGNoaXAgLyBkZXZpY2UgZm9yIGRldmljZSBYLgorCQlUeXBpY2FsbHkgYSBwYXJ0IG51bWJlci4KIAotV2hhdDoJCS9zeXMvLi4uL2RldmljZVtuXS9zYW1wbGluZ19mcmVxdWVuY3kKK1doYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9kZXZpY2VYL3NhbXBsaW5nX2ZyZXF1ZW5jeQogS2VybmVsVmVyc2lvbjoJMi42LjM1CiBDb250YWN0OglsaW51eC1paW9Admdlci5rZXJuZWwub3JnCiBEZXNjcmlwdGlvbjoKQEAgLTQ0LDkwICs0Niw0OSBAQAogCQlyZWxldmFudCBkaXJlY3Rvcmllcy4gIElmIGl0IGVmZmVjdHMgYWxsIG9mIHRoZSBhYm92ZQogCQl0aGVuIGl0IGlzIHRvIGJlIGZvdW5kIGluIHRoZSBiYXNlIGRldmljZSBkaXJlY3RvcnkgYXMgaGVyZS4KIAotV2hhdDoJCS9zeXMvLi4uL2RldmljZVtuXS9zYW1wbGluZ19mcmVxdWVuY3lfYXZhaWxhYmxlCitXaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvZGV2aWNlWC9zYW1wbGluZ19mcmVxdWVuY3lfYXZhaWxhYmxlCiBLZXJuZWxWZXJzaW9uOgkyLjYuMzUKIENvbnRhY3Q6CWxpbnV4LWlpb0B2Z2VyLmtlcm5lbC5vcmcKIERlc2NyaXB0aW9uOgogCQlXaGVuIHRoZSBpbnRlcm5hbCBzYW1wbGluZyBjbG9jayBjYW4gb25seSB0YWtlIGEgc21hbGwKLQkJZGlzY3JldGUgc2V0IG9mIHZhbHVlcywgdGhpcyBmaWxlIGxpc3RzIHRob3NlIGF2YWlsYWxlLgorCQlkaXNjcmV0ZSBzZXQgb2YgdmFsdWVzLCB0aGlzIGZpbGUgbGlzdHMgdGhvc2UgYXZhaWxhYmxlLgogCi1XaGF0OgkJL3N5cy8uLi4vZGV2aWNlW25dL2luW21dW19uYW1lXV9yYXcKK1doYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9kZXZpY2VYL2luWV9yYXcKK1doYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9kZXZpY2VYL2luWV9zdXBwbHlfcmF3CiBLZXJuZWxWZXJzaW9uOgkyLjYuMzUKIENvbnRhY3Q6CWxpbnV4LWlpb0B2Z2VyLmtlcm5lbC5vcmcKIERlc2NyaXB0aW9uOgogCQlSYXcgKHVuc2NhbGVkIG5vIGJpYXMgcmVtb3ZhbCBldGMpIHZvbHRhZ2UgbWVhc3VyZW1lbnQgZnJvbQotCQljaGFubmVsIG0uIG5hbWUgaXMgdXNlZCBpbiBzcGVjaWFsIGNhc2VzIHdoZXJlIHRoaXMgZG9lcwotCQlub3QgY29ycmVzcG9uZCB0byBleHRlcm5hbGx5IGF2YWlsYWJsZSBpbnB1dCAoZS5nLiBzdXBwbHkKLQkJdm9sdGFnZSBtb25pdG9yaW5nIGluIHdoaWNoIGNhc2UgdGhlIGZpbGUgaXMgaW5fc3VwcGx5X3JhdykuCi0JCUlmIHRoZSBkZXZpY2Ugc3VwcG9ydHMgZXZlbnRzIG9uIHRoaXMgY2hhbm5lbCB0aGVuIG0gbXVzdCBiZQotCQlzcGVjaWZpZWQgKGV2ZW4gb24gbmFtZWQgY2hhbm5lbHMpIHNvIGFzIHRvIGFsbG93IHRoZSBzb3VyY2UKLQkJb2YgZXZlbnQgY29kZXMgdG8gYmUgaWRlbnRpZmllZC4KKwkJY2hhbm5lbCBZLiBJbiBzcGVjaWFsIGNhc2VzIHdoZXJlIHRoZSBjaGFubmVsIGRvZXMgbm90CisJCWNvcnJlc3BvbmQgdG8gZXh0ZXJuYWxseSBhdmFpbGFibGUgaW5wdXQgb25lIG9mIHRoZSBuYW1lZAorCQl2ZXJzaW9ucyBtYXkgYmUgdXNlZC4gVGhlIG51bWJlciBtdXN0IGFsd2F5cyBiZSBzcGVjaWZpZWQgYW5kCisJCXVuaXF1ZSB0byBhbGxvdyBhc3NvY2lhdGlvbiB3aXRoIGV2ZW50IGNvZGVzLgogCi1XaGF0OgkJL3N5cy8uLi4vZGV2aWNlW25dL2luW21dW19uYW1lXV9vZmZzZXQKLUtlcm5lbFZlcnNpb246CTIuNi4zNQotQ29udGFjdDoJbGludXgtaWlvQHZnZXIua2VybmVsLm9yZwotRGVzY3JpcHRpb246Ci0JCUlmIGtub3duIGZvciBhIGRldmljZSwgb2Zmc2V0IHRvIGJlIGFkZGVkIHRvIGluW21dX3JhdyBwcmlvcgotCQl0byBzY2FsaW5nIGJ5IGluW19uYW1lXVttXV9zY2FsZSBpbiBvcmRlciB0byBvYnRhaW4gdm9sdGFnZSBpbgotCQltaWxsaXZvbHRzLiAgTm90IHByZXNlbnQgaWYgdGhlIG9mZnNldCBpcyBhbHdheXMgMCBvciB1bmtub3duLgotCQlJZiBtIGlzIG5vdCBwcmVzZW50LCB0aGVuIHZvbHRhZ2Ugb2Zmc2V0IGFwcGxpZXMgdG8gYWxsIGluCi0JCWNoYW5uZWxzLiBNYXkgYmUgd3JpdGFibGUgaWYgYSB2YXJpYWJsZSBvZmZzZXQgaXMgY29udHJvbGxlZAotCQlieSB0aGUgZGV2aWNlLiBOb3RlIHRoYXQgdGhpcyBpcyBkaWZmZXJlbnQgdG8gY2FsaWJiaWFzIHdoaWNoCi0JCWlzIGZvciBkZXZpY2VzIHRoYXQgYXBwbHkgb2Zmc2V0cyB0byBjb21wZW5zYXRlIGZvciB2YXJpYXRpb24KLQkJYmV0d2VlbiBkaWZmZXJlbnQgaW5zdGFuY2VzIG9mIHRoZSBwYXJ0LCB0eXBpY2FsbHkgYWRqdXN0ZWQgYnkKLQkJdXNpbmcgc29tZSBoYXJkd2FyZSBzdXBwb3J0ZWQgY2FsaWJyYXRpb24gcHJvY2VkdXJlLgotCi1XaGF0OgkJL3N5cy8uLi4vZGV2aWNlW25dL2luW21dW19uYW1lXV9vZmZzZXRfYXZhaWxhYmxlCi1LZXJuZWxWZXJzaW9uOgkyLjYuMzUKLUNvbnRhY3Q6CWxpbnV4LWlpb0B2Z2VyLmtlcm5lbC5vcmcKLURlc2NyaXB0aW9uOgotCQlJZiBhIHNtYWxsIG51bWJlciBvZiBkaXNjcmV0ZSBvZmZzZXQgdmFsdWVzIGFyZSBhdmFpbGFibGUsIHRoaXMKLQkJd2lsbCBiZSBhIHNwYWNlIHNlcGFyYXRlZCBsaXN0LiAgSWYgdGhlc2UgYXJlIGluZGVwZW5kYW50IChidXQKLQkJb3B0aW9ucyB0aGUgc2FtZSkgZm9yIGluZGl2aWR1YWwgb2Zmc2V0cyB0aGVuIG0gc2hvdWxkIG5vdCBiZQotCQlwcmVzZW50LgotCi1XaGF0OgkJL3N5cy8uLi4vZGV2aWNlW25dL2luW21dW19uYW1lXV9vZmZzZXRfW21pbnxtYXhdCi1LZXJuZWxWZXJzaW9uOgkyLjYuMzUKLUNvbnRhY3Q6CWxpbnV4LWlpb0B2Z2VyLmtlcm5lbC5vcmcKLURlc2NyaXB0aW9uOgotCQlJZiBhIG1vcmUgb3IgbGVzcyBjb250aW51b3VzIHJhbmdlIG9mIHZvbHRhZ2Ugb2Zmc2V0cyBhcmUKLQkJc3VwcG9ydGVkIHRoZW4gdGhlc2Ugc3BlY2lmeSB0aGUgbWluaW11bSBhbmQgbWF4aW11bS4gIElmIHNoYXJlZAotCQlieSBhbGwgaW4gY2hhbm5lbHMgdGhlbiBtIGlzIG5vdCBwcmVzZW50LgotCi1XaGF0OgkJL3N5cy8uLi4vZGV2aWNlW25dL2luW21dW19uYW1lXV9jYWxpYmJpYXMKLUtlcm5lbFZlcnNpb246CTIuNi4zNQotQ29udGFjdDoJbGludXgtaWlvQHZnZXIua2VybmVsLm9yZwotRGVzY3JpcHRpb246Ci0JCUhhcmR3YXJlIGFwcGxpZWQgY2FsaWJyYXRpb24gb2Zmc2V0LiAoYXNzdW1lZCB0byBmaXggcHJvZHVjdGlvbgotCQlpbmFjY3VyYWNpZXMpCi0KLVdoYXQJCS9zeXMvLi4uL2RldmljZVtuXS9pblttXVtfbmFtZV1fY2FsaWJzY2FsZQotS2VybmVsVmVyc2lvbjoJMi42LjM1Ci1Db250YWN0OglsaW51eC1paW9Admdlci5rZXJuZWwub3JnCi1EZXNjcmlwdGlvbjoKLQkJSGFyZHdhcmUgYXBwbGllZCBjYWxpYnJhdGlvbiBzY2FsZSBmYWN0b3IuIChhc3N1bWVkIHRvIGZpeAotCQlwcm9kdWN0aW9uIGluYWNjdXJhY2llcykKLQotV2hhdDoJCS9zeXMvLi4uL2RldmljZVtuXS9pblttXVtfbmFtZV1fc2NhbGUKLUtlcm5lbFZlcnNpb246CTIuNi4zNQotQ29udGFjdDoJbGludXgtaWlvQHZnZXIua2VybmVsLm9yZwotRGVzY3JpcHRpb246Ci0JCUlmIGtub3duIGZvciBhIGRldmljZSwgc2NhbGUgdG8gYmUgYXBwbGllZCB0byB2b2x0W21dX3JhdyBwb3N0Ci0JCWFkZGl0aW9uIG9mIGluW19uYW1lXVttXV9vZmZzZXQgaW4gb3JkZXIgdG8gb2J0YWluIHRoZSBtZWFzdXJlZAotCQl2b2x0YWdlIGluIG1pbGxpdm9sdHMuICBJZiBzaGFyZWQgYWNyb3NzIGFsbCBpbiBjaGFubmVscyB0aGVuCi0JCW0gaXMgbm90IHByZXNlbnQuCi0KLVdoYXQ6CQkvc3lzLy4uLi9kZXZpY2Vbbl0vaW5bbV0taW5bb11fcmF3CitXaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvZGV2aWNlWC9pblktaW5aX3JhdwogS2VybmVsVmVyc2lvbjoJMi42LjM1CiBDb250YWN0OglsaW51eC1paW9Admdlci5rZXJuZWwub3JnCiBEZXNjcmlwdGlvbjoKIAkJUmF3ICh1bnNjYWxlZCkgZGlmZmVyZW50aWFsIHZvbHRhZ2UgbWVhc3VyZW1lbnQgZXF1aXZhbGVudCB0bwotCQljaGFubmVsIG0gLSBjaGFubmVsIG8gd2hlcmUgdGhlc2UgY2hhbm5lbCBudW1iZXJzIGFwcGx5IHRvIHRoZQorCQljaGFubmVsIFkgLSBjaGFubmVsIFogd2hlcmUgdGhlc2UgY2hhbm5lbCBudW1iZXJzIGFwcGx5IHRvIHRoZQogCQlwaHlzaWNhbGx5IGVxdWl2YWxlbnQgaW5wdXRzIHdoZW4gbm9uIGRpZmZlcmVudGlhbCByZWFkaW5ncyBhcmUKIAkJc2VwYXJhdGVseSBhdmFpbGFibGUuIEluIGRpZmZlcmVudGlhbCBvbmx5IHBhcnRzLCB0aGVuIGFsbCB0aGF0Ci0JCWlzIHJlcXVpcmVkIGlzIGEgY29uc2lzdGVudCBsYWJlbGxpbmcuCisJCWlzIHJlcXVpcmVkIGlzIGEgY29uc2lzdGVudCBsYWJlbGluZy4KIAotV2hhdDoJCS9zeXMvLi4uL2RldmljZVtuXS9hY2NlbFtfeHxfeXxfel1bbV1fcmF3CitXaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvZGV2aWNlWC90ZW1wX3JhdworV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2RldmljZVgvdGVtcF94X3JhdworV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2RldmljZVgvdGVtcF95X3JhdworV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2RldmljZVgvdGVtcF96X3JhdworS2VybmVsVmVyc2lvbjoJMi42LjM1CitDb250YWN0OglsaW51eC1paW9Admdlci5rZXJuZWwub3JnCitEZXNjcmlwdGlvbjoKKwkJUmF3ICh1bnNjYWxlZCBubyBiaWFzIHJlbW92YWwgZXRjKSB0ZW1wZXJhdHVyZSBtZWFzdXJlbWVudC4KKwkJSXQgYW4gYXhpcyBpcyBzcGVjaWZpZWQgaXQgZ2VuZXJhbGx5IG1lYW5zIHRoYXQgdGhlIHRlbXBlcmF0dXJlCisJCXNlbnNvciBpcyBhc3NvY2lhdGVkIHdpdGggb25lIHBhcnQgb2YgYSBjb21wb3VuZCBkZXZpY2UgKGUuZy4KKwkJYSBneXJvc2NvcGUgYXhpcykuCisKK1doYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9kZXZpY2VYL2FjY2VsX3hfcmF3CitXaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvZGV2aWNlWC9hY2NlbF95X3JhdworV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2RldmljZVgvYWNjZWxfel9yYXcKIEtlcm5lbFZlcnNpb246CTIuNi4zNQogQ29udGFjdDoJbGludXgtaWlvQHZnZXIua2VybmVsLm9yZwogRGVzY3JpcHRpb246CkBAIC0xMzUsMjkgKzk2LDMyIEBACiAJCWJ1dCBzaG91bGQgbWF0Y2ggb3RoZXIgc3VjaCBhc3NpZ25tZW50cyBvbiBkZXZpY2UpCiAJCWNoYW5uZWwgbSAobm90IHByZXNlbnQgaWYgb25seSBvbmUgYWNjZWxlcm9tZXRlciBjaGFubmVsIGF0CiAJCXRoaXMgb3JpZW50YXRpb24pLiBIYXMgYWxsIG9mIHRoZSBlcXVpdmFsZW50IHBhcmFtZXRlcnMgYXMgcGVyCi0JCWluW21dLiBVbml0cyBhZnRlciBhcHBsaWNhdGlvbiBvZiBzY2FsZSBhbmQgb2Zmc2V0IGFyZSBtL3NeMi4KKwkJaW5ZLiBVbml0cyBhZnRlciBhcHBsaWNhdGlvbiBvZiBzY2FsZSBhbmQgb2Zmc2V0IGFyZSBtL3NeMi4KIAotV2hhdDoJCS9zeXMvLi4uL2RldmljZVtuXS9neXJvW194fF95fF96XVttXV9yYXcKK1doYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9kZXZpY2VYL2d5cm9feF9yYXcKK1doYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9kZXZpY2VYL2d5cm9feV9yYXcKK1doYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9kZXZpY2VYL2d5cm9fel9yYXcKIEtlcm5lbFZlcnNpb246CTIuNi4zNQogQ29udGFjdDoJbGludXgtaWlvQHZnZXIua2VybmVsLm9yZwogRGVzY3JpcHRpb246CiAJCUFuZ3VsYXIgdmVsb2NpdHkgYWJvdXQgYXhpcyB4LCB5IG9yIHogKG1heSBiZSBhcmJpdHJhcmlseQotCQlhc3NpZ25lZCkgY2hhbm5lbCBtIChub3QgcHJlc2VudCBpZiBvbmx5IG9uZSBneXJvc2NvcGUgYXQKLQkJdGhpcyBvcmllbnRhdGlvbikuCi0JCURhdGEgY29udmVydGVkIGJ5IGFwcGxpY2F0aW9uIG9mIG9mZnNldCB0aGVuIHNjYWxlIHRvCisJCWFzc2lnbmVkKSBEYXRhIGNvbnZlcnRlZCBieSBhcHBsaWNhdGlvbiBvZiBvZmZzZXQgdGhlbiBzY2FsZSB0bwogCQlyYWRpYW5zIHBlciBzZWNvbmQuIEhhcyBhbGwgdGhlIGVxdWl2YWxlbnQgcGFyYW1ldGVycyBhcwotCQlwZXIgaW5bbV0uCisJCXBlciBpblkuCiAKLVdoYXQ6CQkvc3lzLy4uLi9kZXZpY2Vbbl0vaW5jbGlbX3h8X3l8X3pdW21dX3JhdworV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2RldmljZVgvaW5jbGlfeF9yYXcKK1doYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9kZXZpY2VYL2luY2xpX3lfcmF3CitXaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvZGV2aWNlWC9pbmNsaV96X3JhdwogS2VybmVsVmVyc2lvbjoJMi42LjM1CiBDb250YWN0OglsaW51eC1paW9Admdlci5rZXJuZWwub3JnCiBEZXNjcmlwdGlvbjoKLQkJSW5jbGluYXRpb24gcmF3IHJlYWRpbmcgYWJvdXQgYXhpcyB4LCB5IG9yIHogKG1heSBiZSBhcmJpdGFyaWx5Ci0JCWFzc2lnbmVkKSBjaGFubmVsIG0gKG5vdCBwcmVzZW50IGlmIG9ubHkgb25lIGluY2xpbm9tZXRlciBhdAotCQl0aGlzIG9yaWVudGF0aW9uKS4gIERhdGEgY29udmVydGVkIGJ5IGFwcGxpY2F0aW9uIG9mIG9mZnNldAorCQlJbmNsaW5hdGlvbiByYXcgcmVhZGluZyBhYm91dCBheGlzIHgsIHkgb3IgeiAobWF5IGJlCisJCWFyYml0cmFyaWx5IGFzc2lnbmVkKS4gRGF0YSBjb252ZXJ0ZWQgYnkgYXBwbGljYXRpb24gb2Ygb2Zmc2V0CiAJCWFuZCBzY2FsZSB0byBEZWdyZWVzLgogCi1XaGF0OgkJL3N5cy8uLi4vZGV2aWNlW25dL21hZ25bX3h8X3l8X3pdW21dX3JhdworV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2RldmljZVgvbWFnbl94X3JhdworV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2RldmljZVgvbWFnbl95X3JhdworV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2RldmljZVgvbWFnbl96X3JhdwogS2VybmVsVmVyc2lvbjoJMi42LjM1CiBDb250YWN0OglsaW51eC1paW9Admdlci5rZXJuZWwub3JnCiBEZXNjcmlwdGlvbjoKQEAgLTE2NSwzNyArMTI5LDE1MCBAQAogCQlhc3NpZ25lZCkgY2hhbm5lbCBtIChub3QgcHJlc2VudCBpZiBvbmx5IG9uZSBtYWduZXRvbWV0ZXIKIAkJYXQgdGhpcyBvcmllbnRhdGlvbikuICBEYXRhIGNvbnZlcnRlZCBieSBhcHBsaWNhdGlvbiBvZgogCQlvZmZzZXQgdGhlbiBzY2FsZSB0byBHYXVzcy4gSGFzIGFsbCB0aGUgZXF1aXZhbGVudCBtb2RpZmllcnMKLQkJYXMgcGVyIGluW21dLgorCQlhcyBwZXIgaW5ZLgogCi1XaGF0OgkJL3N5cy8uLi4vZGV2aWNlW25dL2RldmljZVtuXTpldmVudFttXQorV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2RldmljZVgvYWNjZWxfeF9wZWFrX3JhdworV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2RldmljZVgvYWNjZWxfeV9wZWFrX3JhdworV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2RldmljZVgvYWNjZWxfel9wZWFrX3JhdworS2VybmVsVmVyc2lvbjoJMi42LjM2CitDb250YWN0OglsaW51eC1paW9Admdlci5rZXJuZWwub3JnCitEZXNjcmlwdGlvbjoKKwkJU29tZSBkZXZpY2VzIHByb3ZpZGUgYSBzdG9yZSBvZiB0aGUgaGlnaGVzdCB2YWx1ZSBzZWVuIHNpbmNlCisJCXNvbWUgcmVzZXQgY29uZGl0aW9uLiAgVGhlc2UgYXR0cmlidXRlcyBhbGxvdyBhY2Nlc3MgdG8gdGhpcworCQlhbmQgYXJlIG90aGVyd2lzZSB0aGUgZGlyZWN0IGVxdWl2YWxlbnQgb2YgdGhlCisJCTx0eXBlPllbX25hbWVdX3JhdyBhdHRyaWJ1dGVzLgorCitXaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvZGV2aWNlWC9hY2NlbF94eXpfc3F1YXJlZF9wZWFrX3JhdworS2VybmVsVmVyc2lvbjoJMi42LjM2CitDb250YWN0OglsaW51eC1paW9Admdlci5rZXJuZWwub3JnCitEZXNjcmlwdGlvbjoKKwkJQSBjb21wdXRlZCBwZWFrIHZhbHVlIGJhc2VkIG9uIHRoZSBzdW0gc3F1YXJlZCBtYWduaXR1ZGUgb2YKKwkJdGhlIHVuZGVybHlpbmcgdmFsdWUgaW4gdGhlIHNwZWNpZmllZCBkaXJlY3Rpb25zLgorCitXaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvZGV2aWNlWC9hY2NlbF9vZmZzZXQKK1doYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9kZXZpY2VYL3RlbXBfb2Zmc2V0CiBLZXJuZWxWZXJzaW9uOgkyLjYuMzUKIENvbnRhY3Q6CWxpbnV4LWlpb0B2Z2VyLmtlcm5lbC5vcmcKIERlc2NyaXB0aW9uOgotCQlDb25maWd1cmF0aW9uIG9mIHdoaWNoIGhhcmR3YXJlIGdlbmVyYXRlZCBldmVudHMgYXJlIHBhc3NlZCB1cCB0bwotCQl1c2Vyc3BhY2UuIFNvbWUgb2YgdGhlc2UgYXJlIGEgYml0IGNvbXBsZXggdG8gZ2VuZXJhbGl6ZSBzbyB0aGlzCi0JCXNlY3Rpb24gaXMgYSB3b3JrIGluIHByb2dyZXNzLgorCQlJZiBrbm93biBmb3IgYSBkZXZpY2UsIG9mZnNldCB0byBiZSBhZGRlZCB0byA8dHlwZT5bWV1fcmF3IHByaW9yCisJCXRvIHNjYWxpbmcgYnkgPHR5cGU+W1ldX3NjYWxlIGluIG9yZGVyIHRvIG9idGFpbiB2YWx1ZSBpbiB0aGUKKwkJPHR5cGU+IHVuaXRzIGFzIHNwZWNpZmllZCBpbiA8dHlwZT5beV1fcmF3IGRvY3VtZW50YXRpb24uCisJCU5vdCBwcmVzZW50IGlmIHRoZSBvZmZzZXQgaXMgYWx3YXlzIDAgb3IgdW5rbm93bi4gSWYgWSBpcyBub3QKKwkJcHJlc2VudCwgdGhlbiB0aGUgb2Zmc2V0IGFwcGxpZXMgdG8gYWxsIGluIGNoYW5uZWxzIG9mIDx0eXBlPi4KKwkJTWF5IGJlIHdyaXRhYmxlIGlmIGEgdmFyaWFibGUgb2Zmc2V0IGNhbiBiZSBhcHBsaWVkIG9uIHRoZQorCQlkZXZpY2UuIE5vdGUgdGhhdCB0aGlzIGlzIGRpZmZlcmVudCB0byBjYWxpYmJpYXMgd2hpY2gKKwkJaXMgZm9yIGRldmljZXMgKG9yIGRyaXZlcnMpIHRoYXQgYXBwbHkgb2Zmc2V0cyB0byBjb21wZW5zYXRlCisJCWZvciB2YXJpYXRpb24gYmV0d2VlbiBkaWZmZXJlbnQgaW5zdGFuY2VzIG9mIHRoZSBwYXJ0LCB0eXBpY2FsbHkKKwkJYWRqdXN0ZWQgYnkgdXNpbmcgc29tZSBoYXJkd2FyZSBzdXBwb3J0ZWQgY2FsaWJyYXRpb24gcHJvY2VkdXJlLgogCi1XaGF0OgkJL3N5cy8uLi4vZGV2aWNlW25dOmV2ZW50W21dL2RldgorV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2RldmljZVgvaW5ZX3NjYWxlCitXaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvZGV2aWNlWC9pbllfc3VwcGx5X3NjYWxlCitXaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvZGV2aWNlWC9pbl9zY2FsZQorV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2RldmljZVgvYWNjZWxfc2NhbGUKK1doYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9kZXZpY2VYL2FjY2VsX3BlYWtfc2NhbGUKK1doYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9kZXZpY2VYL2d5cm9fc2NhbGUKK1doYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9kZXZpY2VYL21hZ25fc2NhbGUKK1doYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9kZXZpY2VYL21hZ25feF9zY2FsZQorV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2RldmljZVgvbWFnbl95X3NjYWxlCitXaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvZGV2aWNlWC9tYWduX3pfc2NhbGUKIEtlcm5lbFZlcnNpb246CTIuNi4zNQogQ29udGFjdDoJbGludXgtaWlvQHZnZXIua2VybmVsLm9yZwogRGVzY3JpcHRpb246Ci0JCW1ham9yOm1pbm9yIGNoYXJhY3RlciBkZXZpY2UgbnVtYmVycyBmb3IgdGhlIGV2ZW50IGxpbmUuCisJCUlmIGtub3duIGZvciBhIGRldmljZSwgc2NhbGUgdG8gYmUgYXBwbGllZCB0byA8dHlwZT5ZW19uYW1lXV9yYXcKKwkJcG9zdCBhZGRpdGlvbiBvZiA8dHlwZT5bWV1bX25hbWVdX29mZnNldCBpbiBvcmRlciB0byBvYnRhaW4gdGhlCisJCW1lYXN1cmVkIHZhbHVlIGluIDx0eXBlPiB1bml0cyBhcyBzcGVjaWZpZWQgaW4KKwkJPHR5cGU+W1ldW19uYW1lXV9yYXcgZG9jdW1lbnRhdGlvbi4uICBJZiBzaGFyZWQgYWNyb3NzIGFsbCBpbgorCQljaGFubmVscyB0aGVuIFkgaXMgbm90IHByZXNlbnQgYW5kIHRoZSB2YWx1ZSBpcyBjYWxsZWQKKwkJPHR5cGU+W1ldW19uYW1lXV9zY2FsZS4gVGhlIHBlYWsgbW9kaWZpZXIgbWVhbnMgdGhpcyB2YWx1ZQorCQlpcyBhcHBsaWVkIHRvIDx0eXBlPllbX25hbWVdX3BlYWtfcmF3IHZhbHVlcy4KIAotVGFraW5nIGFjY2VsX3gwIGFzIGFuIGV4YW1wbGUKK1doYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9kZXZpY2VYL2FjY2VsX3hfY2FsaWJiaWFzCitXaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvZGV2aWNlWC9hY2NlbF95X2NhbGliYmlhcworV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2RldmljZVgvYWNjZWxfel9jYWxpYmJpYXMKK1doYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9kZXZpY2VYL2d5cm9feF9jYWxpYmJpYXMKK1doYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9kZXZpY2VYL2d5cm9feV9jYWxpYmJpYXMKK1doYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9kZXZpY2VYL2d5cm9fel9jYWxpYmJpYXMKK0tlcm5lbFZlcnNpb246CTIuNi4zNQorQ29udGFjdDoJbGludXgtaWlvQHZnZXIua2VybmVsLm9yZworRGVzY3JpcHRpb246CisJCUhhcmR3YXJlIGFwcGxpZWQgY2FsaWJyYXRpb24gb2Zmc2V0LiAoYXNzdW1lZCB0byBmaXggcHJvZHVjdGlvbgorCQlpbmFjY3VyYWNpZXMpLiBJZiBzaGFyZWQgYWNyb3NzIGFsbCBjaGFubmVscywgPHR5cGU+X2NhbGliYmlhcworCQlpcyB1c2VkLgogCi1XaGF0OgkJL3N5cy8uLi4vZGV2aWNlW25dOmV2ZW50W21dL2FjY2VsX3gwX3RocmVzaFtfcmlzaW5nfF9mYWxsaW5nXV9lbgorV2hhdAkJL3N5cy9idXMvaWlvL2RldmljZXMvZGV2aWNlWC9pbllfY2FsaWJzY2FsZQorV2hhdAkJL3N5cy9idXMvaWlvL2RldmljZXMvZGV2aWNlWC9pbllfc3VwcGx5X2NhbGlic2NhbGUKK1doYXQJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2RldmljZVgvaW5fY2FsaWJzY2FsZQorV2hhdAkJL3N5cy9idXMvaWlvL2RldmljZXMvZGV2aWNlWC9hY2NlbF94X2NhbGlic2NhbGUKK1doYXQJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2RldmljZVgvYWNjZWxfeV9jYWxpYnNjYWxlCitXaGF0CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9kZXZpY2VYL2FjY2VsX3pfY2FsaWJzY2FsZQorV2hhdAkJL3N5cy9idXMvaWlvL2RldmljZXMvZGV2aWNlWC9neXJvX3hfY2FsaWJzY2FsZQorV2hhdAkJL3N5cy9idXMvaWlvL2RldmljZXMvZGV2aWNlWC9neXJvX3lfY2FsaWJzY2FsZQorV2hhdAkJL3N5cy9idXMvaWlvL2RldmljZXMvZGV2aWNlWC9neXJvX3pfY2FsaWJzY2FsZQorS2VybmVsVmVyc2lvbjoJMi42LjM1CitDb250YWN0OglsaW51eC1paW9Admdlci5rZXJuZWwub3JnCitEZXNjcmlwdGlvbjoKKwkJSGFyZHdhcmUgYXBwbGllZCBjYWxpYnJhdGlvbiBzY2FsZSBmYWN0b3IuIChhc3N1bWVkIHRvIGZpeAorCQlwcm9kdWN0aW9uIGluYWNjdXJhY2llcykuICBJZiBzaGFyZWQgYWNyb3NzIGFsbCBjaGFubmVscywKKwkJPHR5cGU+X2NhbGlic2NhbGUgaXMgdXNlZC4KKworV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2RldmljZVgvYWNjZWxfc2NhbGVfYXZhaWxhYmxlCitLZXJuZWxWZXJzaW9uOgkyLjYzNQorQ29udGFjdDoJbGludXgtaWlvQHZnZXIua2VybmVsLm9yZworRGVzY3JpcHRpb246CisJCUlmIGEgZGlzY3JldGUgc2V0IG9mIHNjYWxlIHZhbHVlcyBhcmUgYXZhaWxhYmxlLCB0aGV5CisJCWFyZSBsaXN0ZWQgaW4gdGhpcyBhdHRyaWJ1dGUuCisKK1doYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9kZXZpY2VYL2RldmljZVg6ZXZlbnRZCitLZXJuZWxWZXJzaW9uOgkyLjYuMzUKK0NvbnRhY3Q6CWxpbnV4LWlpb0B2Z2VyLmtlcm5lbC5vcmcKK0Rlc2NyaXB0aW9uOgorCQlDb25maWd1cmF0aW9uIG9mIHdoaWNoIGhhcmR3YXJlIGdlbmVyYXRlZCBldmVudHMgYXJlIHBhc3NlZCB1cAorCQl0byB1c2VyLXNwYWNlLgorCitXaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvZGV2aWNlWDpldmVudC9kZXYKK1doYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9kZXZpY2VYOmV2ZW50WS9kZXYKK0tlcm5lbFZlcnNpb246CTIuNi4zNQorQ29udGFjdDoJbGludXgtaWlvQHZnZXIua2VybmVsLm9yZworRGVzY3JpcHRpb246CisJCW1ham9yOm1pbm9yIGNoYXJhY3RlciBkZXZpY2UgbnVtYmVycyBmb3IgdGhlIGV2ZW50IGxpbmUgWSBvZgorCQlkZXZpY2UgWC4KKworV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL2FjY2VsX3hfdGhyZXNoX3Jpc2luZ19lbgorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL2FjY2VsX3hfdGhyZXNoX2ZhbGxpbmdfZW4KK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9hY2NlbF95X3RocmVzaF9yaXNpbmdfZW4KK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9hY2NlbF95X3RocmVzaF9mYWxsaW5nX2VuCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvYWNjZWxfel90aHJlc2hfcmlzaW5nX2VuCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvYWNjZWxfel90aHJlc2hfZmFsbGluZ19lbgorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL2d5cm9feF90aHJlc2hfcmlzaW5nX2VuCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvZ3lyb194X3RocmVzaF9mYWxsaW5nX2VuCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvZ3lyb195X3RocmVzaF9yaXNpbmdfZW4KK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9neXJvX3lfdGhyZXNoX2ZhbGxpbmdfZW4KK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9neXJvX3pfdGhyZXNoX3Jpc2luZ19lbgorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL2d5cm9fel90aHJlc2hfZmFsbGluZ19lbgorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL21hZ25feF90aHJlc2hfcmlzaW5nX2VuCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvbWFnbl94X3RocmVzaF9mYWxsaW5nX2VuCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvbWFnbl95X3RocmVzaF9yaXNpbmdfZW4KK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9tYWduX3lfdGhyZXNoX2ZhbGxpbmdfZW4KK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9tYWduX3pfdGhyZXNoX3Jpc2luZ19lbgorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL21hZ25fel90aHJlc2hfZmFsbGluZ19lbgorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL2luWl9zdXBwbHlfdGhyZXNoX3Jpc2luZ19lbgorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL2luWl9zdXBwbHlfdGhyZXNoX2ZhbGxpbmdfZW4KK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9pblpfdGhyZXNoX3Jpc2luZ19lbgorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL2luWl90aHJlc2hfZmFsbGluZ19lbgorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL3RlbXBfdGhyZXNoX3Jpc2luZ19lbgorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL3RlbXBfdGhyZXNoX2ZhbGxpbmdfZW4KIEtlcm5lbFZlcnNpb246CTIuNi4zNwogQ29udGFjdDoJbGludXgtaWlvQHZnZXIua2VybmVsLm9yZwogRGVzY3JpcHRpb246Ci0JCUV2ZW50IGdlbmVyYXRlZCB3aGVuIGFjY2VsX3gwIHBhc3NlcyBhIHRocmVzaG9sZCBpbiB0aGUgc3BlY2ZpZWQKKwkJRXZlbnQgZ2VuZXJhdGVkIHdoZW4gY2hhbm5lbCBwYXNzZXMgYSB0aHJlc2hvbGQgaW4gdGhlIHNwZWNpZmllZAogCQkoX3Jpc2luZ3xfZmFsbGluZykgZGlyZWN0aW9uLiBJZiB0aGUgZGlyZWN0aW9uIGlzIG5vdCBzcGVjaWZpZWQsCiAJCXRoZW4gZWl0aGVyIHRoZSBkZXZpY2Ugd2lsbCByZXBvcnQgYW4gZXZlbnQgd2hpY2ggZXZlciBkaXJlY3Rpb24KIAkJYSBzaW5nbGUgdGhyZXNob2xkIHZhbHVlIGlzIGNhbGxlZCBpbiAoZS5nLgotCQlhY2NlbF94MF88cmF3fGlucHV0Pl90aHJlc2hfdmFsdWUpIG9yCi0JCWFjY2VsX3gwXzxyYXd8aW5wdXQ+X3RocmVzaF9yaXNpbmdfdmFsdWUgYW5kCi0JCWFjY2VsX3gwXzxyYXd8aW5wdXQ+X3RocmVzaF9mYWxsaW5nX3ZhbHVlIG1heSB0YWtlIGRpZmZlcmVudAotCQl2YWx1ZXMsIGJ1dCB0aGUgZGV2aWNlIGNhbiBvbmx5IGVuYWJsZSBib3RoIHRocmVzaG9sZHMgb3IKLQkJbmVpdGhlci4KKwkJPHR5cGU+W1pdW19uYW1lXV88cmF3fGlucHV0Pl90aHJlc2hfdmFsdWUpIG9yCisJCTx0eXBlPltaXVtfbmFtZV1fPHJhd3xpbnB1dD5fdGhyZXNoX3Jpc2luZ192YWx1ZSBhbmQKKwkJPHR5cGU+W1pdW19uYW1lXV88cmF3fGlucHV0Pl90aHJlc2hfZmFsbGluZ192YWx1ZSBtYXkgdGFrZQorCQlkaWZmZXJlbnQgdmFsdWVzLCBidXQgdGhlIGRldmljZSBjYW4gb25seSBlbmFibGUgYm90aCB0aHJlc2hvbGRzCisJCW9yIG5laXRoZXIuCiAJCU5vdGUgdGhlIGRyaXZlciB3aWxsIGFzc3VtZSB0aGUgbGFzdCBwIGV2ZW50cyByZXF1ZXN0ZWQgYXJlCiAJCXRvIGJlIGVuYWJsZWQgd2hlcmUgcCBpcyBob3dldmVyIG1hbnkgaXQgc3VwcG9ydHMgKHdoaWNoIG1heQogCQl2YXJ5IGRlcGVuZGluZyBvbiB0aGUgZXhhY3Qgc2V0IHJlcXVlc3RlZC4gU28gaWYgeW91IHdhbnQgdG8gYmUKQEAgLTIwNSwxODYgKzI4MiwzMzggQEAKIAkJYSBnaXZlbiBldmVudCB0eXBlIGlzIGVuYWJsZWQgYSBmdXR1cmUgcG9pbnQgKGFuZCBub3QgdGhvc2UgZm9yCiAJCXdoYXRldmVyIGV2ZW50IHdhcyBwcmV2aW91c2x5IGVuYWJsZWQpLgogCi1XaGF0OgkJL3N5cy8uLi4vYWNjZWxfeDBfPHJhd3xpbnB1dD5fdGhyZXNoW19yaXNpbmd8X2ZhbGxpbmddX3ZhbHVlCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvYWNjZWxfeF9yb2NfcmlzaW5nX2VuCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvYWNjZWxfeF9yb2NfZmFsbGluZ19lbgorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL2FjY2VsX3lfcm9jX3Jpc2luZ19lbgorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL2FjY2VsX3lfcm9jX2ZhbGxpbmdfZW4KK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9hY2NlbF96X3JvY19yaXNpbmdfZW4KK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9hY2NlbF96X3JvY19mYWxsaW5nX2VuCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvZ3lyb194X3JvY19yaXNpbmdfZW4KK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9neXJvX3hfcm9jX2ZhbGxpbmdfZW4KK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9neXJvX3lfcm9jX3Jpc2luZ19lbgorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL2d5cm9feV9yb2NfZmFsbGluZ19lbgorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL2d5cm9fel9yb2NfcmlzaW5nX2VuCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvZ3lyb196X3JvY19mYWxsaW5nX2VuCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvbWFnbl94X3JvY19yaXNpbmdfZW4KK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9tYWduX3hfcm9jX2ZhbGxpbmdfZW4KK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9tYWduX3lfcm9jX3Jpc2luZ19lbgorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL21hZ25feV9yb2NfZmFsbGluZ19lbgorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL21hZ25fel9yb2NfcmlzaW5nX2VuCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvbWFnbl96X3JvY19mYWxsaW5nX2VuCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvaW5aX3N1cHBseV9yb2NfcmlzaW5nX2VuCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvaW5aX3N1cHBseV9yb2NfZmFsbGluZ19lbgorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL2luWl9yb2NfcmlzaW5nX2VuCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvaW5aX3JvY19mYWxsaW5nX2VuCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvdGVtcF9yb2NfcmlzaW5nX2VuCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvdGVtcF9yb2NfZmFsbGluZ19lbgorS2VybmVsVmVyc2lvbjoJMi42LjM3CitDb250YWN0OglsaW51eC1paW9Admdlci5rZXJuZWwub3JnCitEZXNjcmlwdGlvbjoKKwkJRXZlbnQgZ2VuZXJhdGVkIHdoZW4gY2hhbm5lbCBwYXNzZXMgYSB0aHJlc2hvbGQgb24gdGhlIHJhdGUgb2YKKwkJY2hhbmdlICgxc3QgZGlmZmVyZW50aWFsKSBpbiB0aGUgc3BlY2lmaWVkIChfcmlzaW5nfF9mYWxsaW5nKQorCQlkaXJlY3Rpb24uIElmIHRoZSBkaXJlY3Rpb24gaXMgbm90IHNwZWNpZmllZCwgdGhlbiBlaXRoZXIgdGhlCisJCWRldmljZSB3aWxsIHJlcG9ydCBhbiBldmVudCB3aGljaCBldmVyIGRpcmVjdGlvbiBhIHNpbmdsZQorCQl0aHJlc2hvbGQgdmFsdWUgaXMgY2FsbGVkIGluIChlLmcuCisJCTx0eXBlPltaXVtfbmFtZV1fPHJhd3xpbnB1dD5fcm9jX3ZhbHVlKSBvcgorCQk8dHlwZT5bWl1bX25hbWVdXzxyYXd8aW5wdXQ+X3JvY19yaXNpbmdfdmFsdWUgYW5kCisJCTx0eXBlPltaXVtfbmFtZV1fPHJhd3xpbnB1dD5fcm9jX2ZhbGxpbmdfdmFsdWUgbWF5IHRha2UKKwkJZGlmZmVyZW50IHZhbHVlcywgYnV0IHRoZSBkZXZpY2UgY2FuIG9ubHkgZW5hYmxlIGJvdGggcmF0ZSBvZgorCQljaGFuZ2UgdGhyZXNob2xkcyBvciBuZWl0aGVyLgorCQlOb3RlIHRoZSBkcml2ZXIgd2lsbCBhc3N1bWUgdGhlIGxhc3QgcCBldmVudHMgcmVxdWVzdGVkIGFyZQorCQl0byBiZSBlbmFibGVkIHdoZXJlIHAgaXMgaG93ZXZlciBtYW55IGl0IHN1cHBvcnRzICh3aGljaCBtYXkKKwkJdmFyeSBkZXBlbmRpbmcgb24gdGhlIGV4YWN0IHNldCByZXF1ZXN0ZWQuIFNvIGlmIHlvdSB3YW50IHRvIGJlCisJCXN1cmUgeW91IGhhdmUgc2V0IHdoYXQgeW91IHRoaW5rIHlvdSBoYXZlLCBjaGVjayB0aGUgY29udGVudHMgb2YKKwkJdGhlc2UgYXR0cmlidXRlcyBhZnRlciBldmVyeXRoaW5nIGlzIGNvbmZpZ3VyZWQuIERyaXZlcnMgbWF5CisJCWhhdmUgdG8gYnVmZmVyIGFueSBwYXJhbWV0ZXJzIHNvIHRoYXQgdGhleSBhcmUgY29uc2lzdGVudCB3aGVuCisJCWEgZ2l2ZW4gZXZlbnQgdHlwZSBpcyBlbmFibGVkIGEgZnV0dXJlIHBvaW50IChhbmQgbm90IHRob3NlIGZvcgorCQl3aGF0ZXZlciBldmVudCB3YXMgcHJldmlvdXNseSBlbmFibGVkKS4KKworV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL2FjY2VsX3hfcmF3X3RocmVzaF9yaXNpbmdfdmFsdWUKK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9hY2NlbF94X3Jhd190aHJlc2hfZmFsbGluZ192YWx1ZQorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL2FjY2VsX3lfcmF3X3RocmVzaF9yaXNpbmdfdmFsdWUKK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9hY2NlbF95X3Jhd190aHJlc2hfZmFsbGluZ192YWx1ZQorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL2FjY2VsX3pfcmF3X3RocmVzaF9yaXNpbmdfdmFsdWUKK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9hY2NlbF96X3Jhd190aHJlc2hfZmFsbGluZ192YWx1ZQorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL2d5cm9feF9yYXdfdGhyZXNoX3Jpc2luZ192YWx1ZQorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL2d5cm9feF9yYXdfdGhyZXNoX2ZhbGxpbmdfdmFsdWUKK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9neXJvX3lfcmF3X3RocmVzaF9yaXNpbmdfdmFsdWUKK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9neXJvX3lfcmF3X3RocmVzaF9mYWxsaW5nX3ZhbHVlCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvZ3lyb196X3Jhd190aHJlc2hfcmlzaW5nX3ZhbHVlCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvZ3lyb196X3Jhd190aHJlc2hfZmFsbGluZ192YWx1ZQorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL21hZ25feF9yYXdfdGhyZXNoX3Jpc2luZ192YWx1ZQorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL21hZ25feF9yYXdfdGhyZXNoX2ZhbGxpbmdfdmFsdWUKK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9tYWduX3lfcmF3X3RocmVzaF9yaXNpbmdfdmFsdWUKK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9tYWduX3lfcmF3X3RocmVzaF9mYWxsaW5nX3ZhbHVlCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvbWFnbl96X3Jhd190aHJlc2hfcmlzaW5nX3ZhbHVlCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvbWFnbl96X3Jhd190aHJlc2hfZmFsbGluZ192YWx1ZQorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL2luWl9zdXBwbHlfcmF3X3RocmVzaF9yaXNpbmdfdmFsdWUKK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9pblpfc3VwcGx5X3Jhd190aHJlc2hfZmFsbGluZ192YWx1ZQorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL2luWl9yYXdfdGhyZXNoX2ZhbGxpbmdfdmFsdWUKK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9pblpfcmF3X3RocmVzaF9mYWxsaW5nX3ZhbHVlCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvdGVtcF9yYXdfdGhyZXNoX2ZhbGxpbmdfdmFsdWUKK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS90ZW1wX3Jhd190aHJlc2hfZmFsbGluZ192YWx1ZQogS2VybmVsVmVyc2lvbjoJMi42LjM3CiBDb250YWN0OglsaW51eC1paW9Admdlci5rZXJuZWwub3JnCiBEZXNjcmlwdGlvbjoKIAkJU3BlY2lmaWVzIHRoZSB2YWx1ZSBvZiB0aHJlc2hvbGQgdGhhdCB0aGUgZGV2aWNlIGlzIGNvbXBhcmluZwogCQlhZ2FpbnN0IGZvciB0aGUgZXZlbnRzIGVuYWJsZWQgYnkKLQkJYWNjZWxfeDBfPHJhd3xpbnB1dD5fdGhyZXNoW19yaXNpbmd8ZmFsbGluZ11fZW4uCi0JCUlmIHNlcGVyYXRlIGV4aXN0IGZvciB0aGUgdHdvIGRpcmVjdGlvbnMsIGJ1dCBkaXJlY3Rpb24gaXMKLQkJbm90IHNwZWNpZmllZCBmb3IgdGhpcyBhdHRyaWJ1dGUsIHRoZW4gYSBzaW5nbGUgdGhyZXNob2xkIHZhbHVlCi0JCWFwcGxpZXMgdG8gYm90aCBkaXJlY3Rpb25zLgorCQk8dHlwZT5aW19uYW1lXV90aHJlc2hbX3Jpc2luZ3xmYWxsaW5nXV9lbi4KKwkJSWYgc2VwYXJhdGUgYXR0cmlidXRlcyAgZXhpc3QgZm9yIHRoZSB0d28gZGlyZWN0aW9ucywgYnV0CisJCWRpcmVjdGlvbiBpcyBub3Qgc3BlY2lmaWVkIGZvciB0aGlzIGF0dHJpYnV0ZSwgdGhlbiBhIHNpbmdsZQorCQl0aHJlc2hvbGQgdmFsdWUgYXBwbGllcyB0byBib3RoIGRpcmVjdGlvbnMuCiAJCVRoZSByYXcgb3IgaW5wdXQgZWxlbWVudCBvZiB0aGUgbmFtZSBpbmRpY2F0ZXMgd2hldGhlciB0aGUKIAkJdmFsdWUgaXMgaW4gcmF3IGRldmljZSB1bml0cyBvciBpbiBwcm9jZXNzZWQgdW5pdHMgKGFzIF9yYXcKIAkJYW5kIF9pbnB1dCBkbyBvbiBzeXNmcyBkaXJlY3QgY2hhbm5lbCByZWFkIGF0dHJpYnV0ZXMpLgogCi1XaGF0OgkJL3N5cy8uLi4vYWNjZWxfeDBfdGhyZXNoW19yaXNpbmd8X2ZhbGxpbmddX21lYW5wZXJpb2QKK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9hY2NlbF94X3Jhd19yb2NfcmlzaW5nX3ZhbHVlCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvYWNjZWxfeF9yYXdfcm9jX2ZhbGxpbmdfdmFsdWUKK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9hY2NlbF95X3Jhd19yb2NfcmlzaW5nX3ZhbHVlCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvYWNjZWxfeV9yYXdfcm9jX2ZhbGxpbmdfdmFsdWUKK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9hY2NlbF96X3Jhd19yb2NfcmlzaW5nX3ZhbHVlCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvYWNjZWxfel9yYXdfcm9jX2ZhbGxpbmdfdmFsdWUKK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9neXJvX3hfcmF3X3JvY19yaXNpbmdfdmFsdWUKK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9neXJvX3hfcmF3X3JvY19mYWxsaW5nX3ZhbHVlCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvZ3lyb195X3Jhd19yb2NfcmlzaW5nX3ZhbHVlCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvZ3lyb195X3Jhd19yb2NfZmFsbGluZ192YWx1ZQorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL2d5cm9fel9yYXdfcm9jX3Jpc2luZ192YWx1ZQorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL2d5cm9fel9yYXdfcm9jX2ZhbGxpbmdfdmFsdWUKK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9tYWduX3hfcmF3X3JvY19yaXNpbmdfdmFsdWUKK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9tYWduX3hfcmF3X3JvY19mYWxsaW5nX3ZhbHVlCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvbWFnbl95X3Jhd19yb2NfcmlzaW5nX3ZhbHVlCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvbWFnbl95X3Jhd19yb2NfZmFsbGluZ192YWx1ZQorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL21hZ25fel9yYXdfcm9jX3Jpc2luZ192YWx1ZQorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL21hZ25fel9yYXdfcm9jX2ZhbGxpbmdfdmFsdWUKK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9pblpfc3VwcGx5X3Jhd19yb2NfcmlzaW5nX3ZhbHVlCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvaW5aX3N1cHBseV9yYXdfcm9jX2ZhbGxpbmdfdmFsdWUKK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9pblpfcmF3X3JvY19mYWxsaW5nX3ZhbHVlCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvaW5aX3Jhd19yb2NfZmFsbGluZ192YWx1ZQorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL3RlbXBfcmF3X3JvY19mYWxsaW5nX3ZhbHVlCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvdGVtcF9yYXdfcm9jX2ZhbGxpbmdfdmFsdWUKIEtlcm5lbFZlcnNpb246CTIuNi4zNwogQ29udGFjdDoJbGludXgtaWlvQHZnZXIua2VybmVsLm9yZwogRGVzY3JpcHRpb246Ci0JCVBlcmlvZCBvZiB0aW1lIChpbiBzZWNvbmRzKSBvdmVyIHdoaWNoIHRoZSByYXcgY2hhbm5lbCB2YWx1ZQotCQlpcyBhdmVyYWdlZCBiZWZvcmUgYmVpbmcgY29tcGFyZWQgd2l0aCB0aGUgdGhyZXNob2xkIHNldCBpbgotCQlhY2NlbF94MF90aHJlc2hbX3Jpc2luZ3xfZmFsbGluZ11fbWVhbnBlcmlvZC4gIElmIGRpcmVjdGlvbiBpcwotCQlub3Qgc3BlY2lmaWVkIHRoZW4gdGhpcyBtZWFuIHBlcmlvZCBhcHBsaWVzIHRvIGJvdGggZGlyZWN0aW9ucy4KKwkJU3BlY2lmaWVzIHRoZSB2YWx1ZSBvZiByYXRlIG9mIGNoYW5nZSB0aHJlc2hvbGQgdGhhdCB0aGUKKwkJZGV2aWNlIGlzIGNvbXBhcmluZyBhZ2FpbnN0IGZvciB0aGUgZXZlbnRzIGVuYWJsZWQgYnkKKwkJPHR5cGU+W1pdW19uYW1lXV9yb2NbX3Jpc2luZ3xmYWxsaW5nXV9lbi4KKwkJSWYgc2VwYXJhdGUgYXR0cmlidXRlcyBleGlzdCBmb3IgdGhlIHR3byBkaXJlY3Rpb25zLAorCQlidXQgZGlyZWN0aW9uIGlzIG5vdCBzcGVjaWZpZWQgZm9yIHRoaXMgYXR0cmlidXRlLAorCQl0aGVuIGEgc2luZ2xlIHRocmVzaG9sZCB2YWx1ZSBhcHBsaWVzIHRvIGJvdGggZGlyZWN0aW9ucy4KKwkJVGhlIHJhdyBvciBpbnB1dCBlbGVtZW50IG9mIHRoZSBuYW1lIGluZGljYXRlcyB3aGV0aGVyIHRoZQorCQl2YWx1ZSBpcyBpbiByYXcgZGV2aWNlIHVuaXRzIG9yIGluIHByb2Nlc3NlZCB1bml0cyAoYXMgX3JhdworCQlhbmQgX2lucHV0IGRvIG9uIHN5c2ZzIGRpcmVjdCBjaGFubmVsIHJlYWQgYXR0cmlidXRlcykuCiAKLVdoYXQ6CQkvc3lzLy4uLi9hY2NlbF94MF90aHJlc2hbX3Jpc2luZ3xfZmFsbGluZ11fcGVyaW9kCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvYWNjZWxfeF90aHJlc2hfcmlzaW5nX3BlcmlvZAorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL2FjY2VsX3hfdGhyZXNoX2ZhbGxpbmdfcGVyaW9kCitoYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9hY2NlbF94X3JvY19yaXNpbmdfcGVyaW9kCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvYWNjZWxfeF9yb2NfZmFsbGluZ19wZXJpb2QKK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9hY2NlbF95X3RocmVzaF9yaXNpbmdfcGVyaW9kCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvYWNjZWxfeV90aHJlc2hfZmFsbGluZ19wZXJpb2QKK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9hY2NlbF95X3JvY19yaXNpbmdfcGVyaW9kCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvYWNjZWxfeV9yb2NfZmFsbGluZ19wZXJpb2QKK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9hY2NlbF96X3RocmVzaF9yaXNpbmdfcGVyaW9kCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvYWNjZWxfel90aHJlc2hfZmFsbGluZ19wZXJpb2QKK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9hY2NlbF96X3JvY19yaXNpbmdfcGVyaW9kCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvYWNjZWxfel9yb2NfZmFsbGluZ19wZXJpb2QKK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9neXJvX3hfdGhyZXNoX3Jpc2luZ19wZXJpb2QKK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9neXJvX3hfdGhyZXNoX2ZhbGxpbmdfcGVyaW9kCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvZ3lyb194X3JvY19yaXNpbmdfcGVyaW9kCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvZ3lyb194X3JvY19mYWxsaW5nX3BlcmlvZAorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL2d5cm9feV90aHJlc2hfcmlzaW5nX3BlcmlvZAorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL2d5cm9feV90aHJlc2hfZmFsbGluZ19wZXJpb2QKK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9neXJvX3lfcm9jX3Jpc2luZ19wZXJpb2QKK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9neXJvX3lfcm9jX2ZhbGxpbmdfcGVyaW9kCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvZ3lyb196X3RocmVzaF9yaXNpbmdfcGVyaW9kCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvZ3lyb196X3RocmVzaF9mYWxsaW5nX3BlcmlvZAorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL2d5cm9fel9yb2NfcmlzaW5nX3BlcmlvZAorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL2d5cm9fel9yb2NfZmFsbGluZ19wZXJpb2QKK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9tYWduX3hfdGhyZXNoX3Jpc2luZ19wZXJpb2QKK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9tYWduX3hfdGhyZXNoX2ZhbGxpbmdfcGVyaW9kCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvbWFnbl94X3JvY19yaXNpbmdfcGVyaW9kCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvbWFnbl94X3JvY19mYWxsaW5nX3BlcmlvZAorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL21hZ25feV90aHJlc2hfcmlzaW5nX3BlcmlvZAorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL21hZ25feV90aHJlc2hfZmFsbGluZ19wZXJpb2QKK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9tYWduX3lfcm9jX3Jpc2luZ19wZXJpb2QKK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9tYWduX3lfcm9jX2ZhbGxpbmdfcGVyaW9kCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvbWFnbl96X3RocmVzaF9yaXNpbmdfcGVyaW9kCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvbWFnbl96X3RocmVzaF9mYWxsaW5nX3BlcmlvZAorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL21hZ25fel9yb2NfcmlzaW5nX3BlcmlvZAorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL21hZ25fel9yb2NfZmFsbGluZ19wZXJpb2QKK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9pblpfc3VwcGx5X3RocmVzaF9yaXNpbmdfcGVyaW9kCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvaW5aX3N1cHBseV90aHJlc2hfZmFsbGluZ19wZXJpb2QKK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9pbnpfc3VwcGx5X3JvY19yaXNpbmdfcGVyaW9kCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvaW5aX3N1cHBseV9yb2NfZmFsbGluZ19wZXJpb2QKK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9pblpfdGhyZXNoX3Jpc2luZ19wZXJpb2QKK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9pblpfdGhyZXNoX2ZhbGxpbmdfcGVyaW9kCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvaW5aX3JvY19yaXNpbmdfcGVyaW9kCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvaW5aX3JvY19mYWxsaW5nX3BlcmlvZAorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL3RlbXBfdGhyZXNoX3Jpc2luZ19wZXJpb2QKK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS90ZW1wX3RocmVzaF9mYWxsaW5nX3BlcmlvZAorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL3RlbXBfcm9jX3Jpc2luZ19wZXJpb2QKK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS90ZW1wX3JvY19mYWxsaW5nX3BlcmlvZAorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL2FjY2VsX3gmeSZ6X21hZ19mYWxsaW5nX3BlcmlvZAogS2VybmVsVmVyc2lvbjoJMi42LjM3CiBDb250YWN0OglsaW51eC1paW9Admdlci5rZXJuZWwub3JnCiBEZXNjcmlwdGlvbjoKLQkJUGVyaW9kIG9mIHRpbWUgKGluIHNlY29uZHMpIGZvciB3aGljaCB0aGUgdGhyZXNob2xkIG11c3QgYmUKLQkJcGFzc2VkIGJlZm9yZSBhbiBldmVudCBpcyBnZW5lcmF0ZWQuIElmIGRpcmVjdGlvbiBpcyBub3QKKwkJUGVyaW9kIG9mIHRpbWUgKGluIHNlY29uZHMpIGZvciB3aGljaCB0aGUgY29uZGl0aW9uIG11c3QgYmUKKwkJbWV0IGJlZm9yZSBhbiBldmVudCBpcyBnZW5lcmF0ZWQuIElmIGRpcmVjdGlvbiBpcyBub3QKIAkJc3BlY2lmaWVkIHRoZW4gdGhpcyBwZXJpb2QgYXBwbGllcyB0byBib3RoIGRpcmVjdGlvbnMuCiAKLVdoYXQ6CQkvc3lzLy4uLi9kZXZpY2Vbbl06ZXZlbnRbbV0vYWNjZWxfeDBfbWFnW19yaXNpbmd8X2ZhbGxpbmddX2VuCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvYWNjZWxfbWFnX2VuCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvYWNjZWxfbWFnX3Jpc2luZ19lbgorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL2FjY2VsX21hZ19mYWxsaW5nX2VuCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvYWNjZWxfeF9tYWdfZW4KK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9hY2NlbF94X21hZ19yaXNpbmdfZW4KK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9hY2NlbF94X21hZ19mYWxsaW5nX2VuCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvYWNjZWxfeV9tYWdfZW4KK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9hY2NlbF95X21hZ19yaXNpbmdfZW4KK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9hY2NlbF95X21hZ19mYWxsaW5nX2VuCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvYWNjZWxfel9tYWdfZW4KK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9hY2NlbF96X21hZ19yaXNpbmdfZW4KK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9hY2NlbF96X21hZ19mYWxsaW5nX2VuCitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvYWNjZWxfeCZ5JnpfbWFnX3Jpc2luZ19lbgorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL2FjY2VsX3gmeSZ6X21hZ19mYWxsaW5nX2VuCiBLZXJuZWxWZXJzaW9uOgkyLjYuMzcKIENvbnRhY3Q6CWxpbnV4LWlpb0B2Z2VyLmtlcm5lbC5vcmcKIERlc2NyaXB0aW9uOgotCQlTaW1pbGFyIHRvIGFjY2VsX3gwX3RocmVzaFtfcmlzaW5nfF9mYWxsaW5nXV9lbiwgYnV0IGhlcmUgdGhlCisJCVNpbWlsYXIgdG8gYWNjZWxfeF90aHJlc2hbX3Jpc2luZ3xfZmFsbGluZ11fZW4sIGJ1dCBoZXJlIHRoZQogCQltYWduaXR1ZGUgb2YgdGhlIGNoYW5uZWwgaXMgY29tcGFyZWQgdG8gdGhlIHRocmVzaG9sZCwgbm90IGl0cwogCQlzaWduZWQgdmFsdWUuCiAKLVdoYXQ6CQkvc3lzLy4uLi9hY2NlbF94MF88cmF3fGlucHV0Pl9tYWdbX3Jpc2luZ3xfZmFsbGluZ11fdmFsdWUKK1doYXQ6CQkvc3lzLy4uLi9hY2NlbF9yYXdfbWFnX3ZhbHVlCitXaGF0OgkJL3N5cy8uLi4vYWNjZWxfeF9yYXdfbWFnX3Jpc2luZ192YWx1ZQorV2hhdDoJCS9zeXMvLi4uL2FjY2VsX3lfcmF3X21hZ19yaXNpbmdfdmFsdWUKK1doYXQ6CQkvc3lzLy4uLi9hY2NlbF96X3Jhd19tYWdfcmlzaW5nX3ZhbHVlCiBLZXJuZWxWZXJzaW9uOgkyLjYuMzcKIENvbnRhY3Q6CWxpbnV4LWlpb0B2Z2VyLmtlcm5lbC5vcmcKIERlc2NyaXB0aW9uOgotCQlUaGUgdmFsdWUgdG8gd2hpY2ggdGhlIG1hZ25pdHVkZSBvZiB0aGUgY2hhbm5lbCBpcyBjb21wYXJlZC4KKwkJVGhlIHZhbHVlIHRvIHdoaWNoIHRoZSBtYWduaXR1ZGUgb2YgdGhlIGNoYW5uZWwgaXMgY29tcGFyZWQuIElmCisJCW51bWJlciBvciBkaXJlY3Rpb24gaXMgbm90IHNwZWNpZmllZCwgYXBwbGllcyB0byBhbGwgY2hhbm5lbHMgb2YKKwkJdGhpcyB0eXBlLgogCi1XaGF0OgkJL3N5cy8uLi4vYWNjZWxfeDBfbWFnW19yaXNpbmd8X2ZhbGxpbmddX21lYW5wZXJpb2QKLUtlcm5lbFZlcnNpb246CTIuNi4zNwotQ29udGFjdDoJbGludXgtaWlvQHZnZXIua2VybmVsLm9yZwotRGVzY3JpcHRpb246Ci0JCVBlcmlvZCBvZiB0aW1lIChpbiBzZWNvbmRzKSBvdmVyIHdoaWNoIHRoZSB2YWx1ZSBvZiB0aGUgY2hhbm5lbAotCQlpcyBhdmVyYWdlZCBiZWZvcmUgYmVpbmcgY29tcGFyZWQgdG8gdGhlIHRocmVzaG9sZAotCi1XaGF0OgkJL3N5cy8uLi4vYWNjZWxfeDBfbWFnW19yaXNpbmd8X2ZhbGxpbmddX3BlcmlvZAotS2VybmVsVmVyc2lvbjoJMi42LjM3Ci1Db250YWN0OglsaW51eC1paW9Admdlci5rZXJuZWwub3JnCi1EZXNjcmlwdGlvbjoKLQkJUGVyaW9kIG9mIHRpbWUgKGluIHNlY29uZHMpIGZvciB3aGljaCB0aGUgY29uZGl0aW9uIG11c3QgYmUgdHJ1ZQotCQliZWZvcmUgYW4gZXZlbnQgb2NjdXJzLgotCi1XaGF0OgkJL3N5cy8uLi4vZGV2aWNlW25dOmV2ZW50W21dL2FjY2VsX3gwX3JvY1tfcmlzaW5nfF9mYWxsaW5nXV9lbgotS2VybmVsVmVyc2lvbjoJMi42LjM3Ci1Db250YWN0OglsaW51eC1paW9Admdlci5rZXJuZWwub3JnCi1EZXNjcmlwdGlvbjoKLQkJU2ltaWxhciB0byBhY2NlbF94MF90aHJlc2hbX3Jpc2luZ3xfZmFsbGluZ11fZW4sIGJ1dCBoZXJlIHRoZQotCQlmaXJzdCBkaWZmZXJlbnRpYWwgaXMgY29tcGFyZWQgd2l0aCB0aGUgdGhyZXNob2xkLgotCi1XaGF0OgkJL3N5cy8uLi4vYWNjZWxfeDBfPHJhd3xpbnB1dD5fcm9jW19yaXNpbmd8X2ZhbGxpbmddX3ZhbHVlCi1LZXJuZWxWZXJzaW9uOgkyLjYuMzcKLUNvbnRhY3Q6CWxpbnV4LWlpb0B2Z2VyLmtlcm5lbC5vcmcKLURlc2NyaXB0aW9uOgotCQlUaGUgdmFsdWUgdG8gd2hpY2ggdGhlIGZpcnN0IGRpZmZlcmVudGlhbCBvZiB0aGUgY2hhbm5lbCBpcwotCQljb21wYXJlZC4KLQotV2hhdDoJCS9zeXMvLi4uL2FjY2VsX3gwX3JvY1tfcmlzaW5nfF9mYWxsaW5nXV9tZWFucGVyaW9kCi1LZXJuZWxWZXJzaW9uOgkyLjYuMzcKLUNvbnRhY3Q6CWxpbnV4LWlpb0B2Z2VyLmtlcm5lbC5vcmcKLURlc2NyaXB0aW9uOgotCQlQZXJpb2Qgb2YgdGltZSAoaW4gc2Vjb25kcykgb3ZlciB3aGljaCB0aGUgdmFsdWUgb2YgdGhlIGNoYW5uZWwKLQkJaXMgYXZlcmFnZWQgYmVmb3JlIGJlaW5nIGNvbXBhcmVkIHRvIHRoZSB0aHJlc2hvbGQKLQotV2hhdDoJCS9zeXMvLi4uL2FjY2VsX3gwX3JvY1tfcmlzaW5nfF9mYWxsaW5nXV9wZXJpb2QKLUtlcm5lbFZlcnNpb246CTIuNi4zNwotQ29udGFjdDoJbGludXgtaWlvQHZnZXIua2VybmVsLm9yZwotRGVzY3JpcHRpb246Ci0JCVBlcmlvZCBvZiB0aW1lIChpbiBzZWNvbmRzKSBmb3Igd2hpY2ggdGhlIGNvbmRpdGlvbiBtdXN0IGJlIHRydWUKLQkJYmVmb3JlIGFuIGV2ZW50IG9jY3Vycy4KLQotV2hhdDoJCS9zeXMvLi4uL2RldmljZVtuXS9kZXZpY2Vbbl06YnVmZmVyOmV2ZW50L2RldgorV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2RldmljZVg6YnVmZmVyOmV2ZW50L2RldgogS2VybmVsVmVyc2lvbjoJMi42LjM1CiBDb250YWN0OglsaW51eC1paW9Admdlci5rZXJuZWwub3JnCiBEZXNjcmlwdGlvbjoKLQkJQnVmZmVyIGZvciBkZXZpY2UgbiBldmVudCBjaGFyYWN0ZXIgZGV2aWNlIG1ham9yOm1pbm9yIG51bWJlcnMuCisJCUJ1ZmZlciBmb3IgZGV2aWNlIFggZXZlbnQgY2hhcmFjdGVyIGRldmljZSBtYWpvcjptaW5vciBudW1iZXJzLgogCi1XaGF0OgkJL3N5cy8uLi4vZGV2aWNlW25dL2RldmljZVtuXTpidWZmZXI6YWNjZXNzL2RldgorV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2RldmljZVg6YnVmZmVyOmFjY2Vzcy9kZXYKIEtlcm5lbFZlcnNpb246CTIuNi4zNQogQ29udGFjdDoJbGludXgtaWlvQHZnZXIua2VybmVsLm9yZwogRGVzY3JpcHRpb246Ci0JCUJ1ZmZlciBmb3IgZGV2aWNlIG4gYWNjZXNzIGNoYXJhY3RlciBkZXZpY2UgbyBtYWpvcjptaW5vciBudW1iZXJzLgorCQlCdWZmZXIgZm9yIGRldmljZSBYIGFjY2VzcyBjaGFyYWN0ZXIgZGV2aWNlIG1ham9yOm1pbm9yIG51bWJlcnMuCiAKLVdoYXQ6CQkvc3lzLy4uLi9kZXZpY2Vbbl06YnVmZmVyL3RyaWdnZXIKK1doYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9kZXZpY2VYOmJ1ZmZlci90cmlnZ2VyCiBLZXJuZWxWZXJzaW9uOgkyLjYuMzUKIENvbnRhY3Q6CWxpbnV4LWlpb0B2Z2VyLmtlcm5lbC5vcmcKIERlc2NyaXB0aW9uOgogCQlUaGUgbmFtZSBvZiB0aGUgdHJpZ2dlciBzb3VyY2UgYmVpbmcgdXNlZCwgYXMgcGVyIHN0cmluZyBnaXZlbgotCQlpbiAvc3lzL2NsYXNzL2lpby90cmlnZ2VyW25dL25hbWUuCisJCWluIC9zeXMvY2xhc3MvaWlvL3RyaWdnZXJZL25hbWUuCiAKLVdoYXQ6CQkvc3lzLy4uLi9kZXZpY2Vbbl06YnVmZmVyL2xlbmd0aAorV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2RldmljZVg6YnVmZmVyL2xlbmd0aAogS2VybmVsVmVyc2lvbjoJMi42LjM1CiBDb250YWN0OglsaW51eC1paW9Admdlci5rZXJuZWwub3JnCiBEZXNjcmlwdGlvbjoKIAkJTnVtYmVyIG9mIHNjYW5zIGNvbnRhaW5lZCBieSB0aGUgYnVmZmVyLgogCi1XaGF0OgkJL3N5cy8uLi4vZGV2aWNlW25dOmJ1ZmZlci9ieXRlc19wZXJfZGF0dW0KK1doYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9kZXZpY2VYOmJ1ZmZlci9ieXRlc19wZXJfZGF0dW0KIEtlcm5lbFZlcnNpb246CTIuNi4zNwogQ29udGFjdDoJbGludXgtaWlvQHZnZXIua2VybmVsLm9yZwogRGVzY3JpcHRpb246CiAJCUJ5dGVzIHBlciBzY2FuLiAgRHVlIHRvIGFsaWdubWVudCBmdW4sIHRoZSBzY2FuIG1heSBiZSBsYXJnZXIKIAkJdGhhbiBpbXBsaWVkIGRpcmVjdGx5IGJ5IHRoZSBzY2FuX2VsZW1lbnQgcGFyYW1ldGVycy4KIAotV2hhdDoJCS9zeXMvLi4uL2RldmljZVtuXTpidWZmZXIvZW5hYmxlCitXaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvZGV2aWNlWDpidWZmZXIvZW5hYmxlCiBLZXJuZWxWZXJzaW9uOgkyLjYuMzUKIENvbnRhY3Q6CWxpbnV4LWlpb0B2Z2VyLmtlcm5lbC5vcmcKIERlc2NyaXB0aW9uOgogCQlBY3R1YWxseSBzdGFydCB0aGUgYnVmZmVyIGNhcHR1cmUgdXAuICBXaWxsIHN0YXJ0IHRyaWdnZXIKIAkJaWYgZmlyc3QgZGV2aWNlIGFuZCBhcHByb3ByaWF0ZS4KIAotV2hhdDoJCS9zeXMvLi4uL2RldmljZVtuXTpidWZmZXIvYWxpZ25tZW50Ci1LZXJuZWxWZXJzaW9uOgkyLjYuMzUKLUNvbnRhY3Q6CWxpbnV4LWlpb0B2Z2VyLmtlcm5lbC5vcmcKLURlc2NyaXB0aW9uOgotCQlNaW5pbXVtIGRhdGEgYWxpZ25tZW50LiAgU2NhbiBlbGVtZW50cyBsYXJnZXIgdGhhbiB0aGlzIGFyZQotCQlhbGlnbmVkIHRvIHRoZSBuZWFyZXN0IHBvd2VyIG9mIDIgdGltZXMgdGhpcy4gIChtYXkgbm90IGJlCi0JCXRydWUgaW4gd2VpcmQgaGFyZHdhcmUgYnVmZmVycyB0aGF0IHBhY2sgZGF0YSB3ZWxsKQotCi1XaGF0OgkJL3N5cy8uLi4vZGV2aWNlW25dL2J1ZmZlci9zY2FuX2VsZW1lbnRzCitXaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvZGV2aWNlWDpidWZmZXIvc2Nhbl9lbGVtZW50cwogS2VybmVsVmVyc2lvbjoJMi42LjM3CiBDb250YWN0OglsaW51eC1paW9Admdlci5rZXJuZWwub3JnCiBEZXNjcmlwdGlvbjoKIAkJRGlyZWN0b3J5IGNvbnRhaW5pbmcgaW50ZXJmYWNlcyBmb3IgZWxlbWVudHMgdGhhdCB3aWxsIGJlCiAJCWNhcHR1cmVkIGZvciBhIHNpbmdsZSB0cmlnZ2VyZWQgc2FtcGxlIHNldCBpbiB0aGUgYnVmZmVyLgogCi1XaGF0OgkJL3N5cy8uLi4vZGV2aWNlW25dL2J1ZmZlci9zY2FuX2VsZW1lbnRzL2FjY2VsX3gwX2VuCitXaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvZGV2aWNlWDpidWZmZXIvc2Nhbl9lbGVtZW50cy9hY2NlbF94X2VuCitXaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvZGV2aWNlWDpidWZmZXIvc2Nhbl9lbGVtZW50cy9hY2NlbF95X2VuCitXaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvZGV2aWNlWDpidWZmZXIvc2Nhbl9lbGVtZW50cy9hY2NlbF96X2VuCitXaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvZGV2aWNlWDpidWZmZXIvc2Nhbl9lbGVtZW50cy9neXJvX3hfZW4KK1doYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9kZXZpY2VYOmJ1ZmZlci9zY2FuX2VsZW1lbnRzL2d5cm9feV9lbgorV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2RldmljZVg6YnVmZmVyL3NjYW5fZWxlbWVudHMvZ3lyb196X2VuCitXaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvZGV2aWNlWDpidWZmZXIvc2Nhbl9lbGVtZW50cy9tYWduX3hfZW4KK1doYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9kZXZpY2VYOmJ1ZmZlci9zY2FuX2VsZW1lbnRzL21hZ25feV9lbgorV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2RldmljZVg6YnVmZmVyL3NjYW5fZWxlbWVudHMvbWFnbl96X2VuCitXaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvZGV2aWNlWDpidWZmZXIvc2Nhbl9lbGVtZW50cy90aW1lc3RhbXBfZW4KK1doYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9kZXZpY2VYOmJ1ZmZlci9zY2FuX2VsZW1lbnRzL2luWV9zdXBwbHlfZW4KK1doYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9kZXZpY2VYOmJ1ZmZlci9zY2FuX2VsZW1lbnRzL2luWV9lbgorV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2RldmljZVg6YnVmZmVyL3NjYW5fZWxlbWVudHMvaW5ZLWluWl9lbgorV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2RldmljZVg6YnVmZmVyL3NjYW5fZWxlbWVudHMvaW5jbGlfeF9lbgorV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2RldmljZVg6YnVmZmVyL3NjYW5fZWxlbWVudHMvaW5jbGlfeV9lbgogS2VybmVsVmVyc2lvbjoJMi42LjM3CiBDb250YWN0OglsaW51eC1paW9Admdlci5rZXJuZWwub3JnCiBEZXNjcmlwdGlvbjoKIAkJU2NhbiBlbGVtZW50IGNvbnRyb2wgZm9yIHRyaWdnZXJlZCBkYXRhIGNhcHR1cmUuCiAKLVdoYXQ6CQkvc3lzLy4uLi9kZXZpY2Vbbl0vYnVmZmVyL3NjYW5fZWxlbWVudHMvYWNjZWxbX3gwXV90eXBlCitXaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvZGV2aWNlWDpidWZmZXIvc2Nhbl9lbGVtZW50cy9hY2NlbF90eXBlCitXaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvZGV2aWNlWDpidWZmZXIvc2Nhbl9lbGVtZW50cy9neXJvX3R5cGUKK1doYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9kZXZpY2VYOmJ1ZmZlci9zY2FuX2VsZW1lbnRzL21hZ25fdHlwZQorV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2RldmljZVg6YnVmZmVyL3NjYW5fZWxlbWVudHMvaW5jbGlfdHlwZQorV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2RldmljZVg6YnVmZmVyL3NjYW5fZWxlbWVudHMvaW5ZX3R5cGUKK1doYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9kZXZpY2VYOmJ1ZmZlci9zY2FuX2VsZW1lbnRzL2luLWluX3R5cGUKK1doYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmJ1ZmZlci9zY2FuX2VsZW1lbnRzL2luWV9zdXBwbHlfdHlwZQorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6YnVmZmVyL3NjYW5fZWxlbWVudHMvdGltZXN0YW1wX3R5cGUKIEtlcm5lbFZlcnNpb246CTIuNi4zNwogQ29udGFjdDoJbGludXgtaWlvQHZnZXIua2VybmVsLm9yZwogRGVzY3JpcHRpb246CiAJCURlc2NyaXB0aW9uIG9mIHRoZSBzY2FuIGVsZW1lbnQgZGF0YSBzdG9yYWdlIHdpdGhpbiB0aGUgYnVmZmVyCi0JCWFuZCBoZW5jZSB0aGUgZm9ybSBpbiB3aGljaCBpdCBpcyByZWFkIGZyb20gdXNlcnNwYWNlLgotCQlGb3JtIGlzIFtzfHVdYml0cy9zdG9yYWdlYml0cy4gIHMgb3IgdSBzcGVjaWZpZXMgaWYgc2lnbmVkCi0JCSgyJ3MgY29tcGxlbWVudCkgb3IgdW5zaWduZWQuIGJpdHMgaXMgdGhlIG51bWJlciBvZiBiaXRzIG9mCi0JCWRhdGEgYW5kIHN0b3JhZ2ViaXRzIGlzIHRoZSBzcGFjZSAoYWZ0ZXIgcGFkZGluZykgdGhhdCBpdAotCQlvY2N1cGllcyBpbiB0aGUgYnVmZmVyLiAgTm90ZSB0aGF0IHNvbWUgZGV2aWNlcyB3aWxsIGhhdmUKLQkJYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBpbiB0aGUgdW51c2VkIGJpdHMgc28gdG8gZ2V0IGEgY2xlYW4KLQkJdmFsdWUsIHRoZSBiaXRzIHZhbHVlIG11c3QgYmUgdXNlZCB0byBtYXNrIHRoZSBidWZmZXIgb3V0cHV0Ci0JCXZhbHVlIGFwcHJvcHJpYXRlbHkuICBUaGUgc3RvcmFnZWJpdHMgdmFsdWUgYWxzbyBzcGVjaWZpZXMgdGhlCi0JCWRhdGEgYWxpZ25tZW50LiAgU28gczQ4LzY0IHdpbGwgYmUgYSBzaWduZWQgNDggYml0IGludGVnZXIKLQkJc3RvcmVkIGluIGEgNjQgYml0IGxvY2F0aW9uIGFsaWduZWQgdG8gYSBhNjQgYml0IGJvdW5kYXJ5LgorCQlhbmQgaGVuY2UgdGhlIGZvcm0gaW4gd2hpY2ggaXQgaXMgcmVhZCBmcm9tIHVzZXItc3BhY2UuCisJCUZvcm0gaXMgW3N8dV1iaXRzL3N0b3JhZ2ViaXRzWz4+c2hpZnRdLiAgcyBvciB1IHNwZWNpZmllcyBpZgorCQlzaWduZWQgKDIncyBjb21wbGVtZW50KSBvciB1bnNpZ25lZC4gYml0cyBpcyB0aGUgbnVtYmVyIG9mIGJpdHMKKwkJb2YgZGF0YSBhbmQgc3RvcmFnZWJpdHMgaXMgdGhlIHNwYWNlIChhZnRlciBwYWRkaW5nKSB0aGF0IGl0CisJCW9jY3VwaWVzIGluIHRoZSBidWZmZXIuIHNoaWZ0IGlmIHNwZWNpZmllZCwgaXMgdGhlIHNoaWZ0IHRoYXQKKwkJbmVlZHMgdG8gYmUgYXBwbGllZCBwcmlvciB0byBtYXNraW5nIG91dCB1bnVzZWQgYml0cy4gU29tZQorCQlkZXZpY2VzIHB1dCB0aGVpciBkYXRhIGluIHRoZSBtaWRkbGUgb2YgdGhlIHRyYW5zZmVycmVkIGVsZW1lbnRzCisJCXdpdGggYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvbiBib3RoIHNpZGVzLiAgTm90ZSB0aGF0IHNvbWUKKwkJZGV2aWNlcyB3aWxsIGhhdmUgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBpbiB0aGUgdW51c2VkIGJpdHMKKwkJc28gdG8gZ2V0IGEgY2xlYW4gdmFsdWUsIHRoZSBiaXRzIHZhbHVlIG11c3QgYmUgdXNlZCB0byBtYXNrCisJCXRoZSBidWZmZXIgb3V0cHV0IHZhbHVlIGFwcHJvcHJpYXRlbHkuICBUaGUgc3RvcmFnZWJpdHMgdmFsdWUKKwkJYWxzbyBzcGVjaWZpZXMgdGhlIGRhdGEgYWxpZ25tZW50LiAgU28gczQ4LzY0Pj4yIHdpbGwgYmUgYQorCQlzaWduZWQgNDggYml0IGludGVnZXIgc3RvcmVkIGluIGEgNjQgYml0IGxvY2F0aW9uIGFsaWduZWQgdG8KKwkJYSBhNjQgYml0IGJvdW5kYXJ5LiBUbyBvYnRhaW4gdGhlIGNsZWFuIHZhbHVlLCBzaGlmdCByaWdodCAyCisJCWFuZCBhcHBseSBhIG1hc2sgdG8gemVybyB0aGUgdG9wIDE2IGJpdHMgb2YgdGhlIHJlc3VsdC4KIAkJRm9yIG90aGVyIHN0b3JhZ2UgY29tYmluYXRpb25zIHRoaXMgYXR0cmlidXRlIHdpbGwgYmUgZXh0ZW5kZWQKIAkJYXBwcm9wcmlhdGVseS4KIAotV2hhdDoJCS9zeXMvLi4uL2RldmljZVtuXS9idWZmZXIvc2Nhbl9lbGVtZW50cy9hY2NlbFtfeDBdX2luZGV4CitXaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpidWZmZXIvc2Nhbl9lbGVtZW50cy9hY2NlbF90eXBlX2F2YWlsYWJsZQorS2VybmVsVmVyc2lvbjoJMi42LjM3CitDb250YWN0OglsaW51eC1paW9Admdlci5rZXJuZWwub3JnCitEZXNjcmlwdGlvbjoKKwkJSWYgdGhlIHR5cGUgcGFyYW1ldGVyIGNhbiB0YWtlIG9uZSBvZiBhIHNtYWxsIHNldCBvZiB2YWx1ZXMsCisJCXRoaXMgYXR0cmlidXRlIGxpc3RzIHRoZW0uCisKK1doYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9kZXZpY2VYOmJ1ZmZlci9zY2FuX2VsZW1lbnRzL2luWV9pbmRleAorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6YnVmZmVyL3NjYW5fZWxlbWVudHMvaW5ZX3N1cHBseV9pbmRleAorV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2RldmljZVg6YnVmZmVyL3NjYW5fZWxlbWVudHMvYWNjZWxfeF9pbmRleAorV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2RldmljZVg6YnVmZmVyL3NjYW5fZWxlbWVudHMvYWNjZWxfeV9pbmRleAorV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2RldmljZVg6YnVmZmVyL3NjYW5fZWxlbWVudHMvYWNjZWxfel9pbmRleAorV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2RldmljZVg6YnVmZmVyL3NjYW5fZWxlbWVudHMvZ3lyb194X2luZGV4CitXaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvZGV2aWNlWDpidWZmZXIvc2Nhbl9lbGVtZW50cy9neXJvX3lfaW5kZXgKK1doYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9kZXZpY2VYOmJ1ZmZlci9zY2FuX2VsZW1lbnRzL2d5cm9fel9pbmRleAorV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2RldmljZVg6YnVmZmVyL3NjYW5fZWxlbWVudHMvbWFnbl94X2luZGV4CitXaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvZGV2aWNlWDpidWZmZXIvc2Nhbl9lbGVtZW50cy9tYWduX3lfaW5kZXgKK1doYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9kZXZpY2VYOmJ1ZmZlci9zY2FuX2VsZW1lbnRzL21hZ25fel9pbmRleAorV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2RldmljZVg6YnVmZmVyL3NjYW5fZWxlbWVudHMvaW5jbGlfeF9pbmRleAorV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2RldmljZVg6YnVmZmVyL3NjYW5fZWxlbWVudHMvaW5jbGlfeV9pbmRleAorV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6YnVmZmVyL3NjYW5fZWxlbWVudHMvdGltZXN0YW1wX2luZGV4CiBLZXJuZWxWZXJzaW9uOgkyLjYuMzcKIENvbnRhY3Q6CWxpbnV4LWlpb0B2Z2VyLmtlcm5lbC5vcmcKIERlc2NyaXB0aW9uOgogCQlBIHNpbmdsZSBwb3NpdGl2ZSBpbnRlZ2VyIHNwZWNpZnlpbmcgdGhlIHBvc2l0aW9uIG9mIHRoaXMKLQkJc2NhbiBlbGVtZW50IGluIHRoZSBidWZmZXIuIE5vdGUgdGhlc2UgYXJlIG5vdCBkZXBlbmRhbnQgb24KLQkJd2hhdCBpcyBlbmFibGVkIGFuZCBtYXkgbm90IGJlIGNvbnRpZ3VvdXMuIFRodXMgZm9yIHVzZXJzcGFjZQorCQlzY2FuIGVsZW1lbnQgaW4gdGhlIGJ1ZmZlci4gTm90ZSB0aGVzZSBhcmUgbm90IGRlcGVuZGVudCBvbgorCQl3aGF0IGlzIGVuYWJsZWQgYW5kIG1heSBub3QgYmUgY29udGlndW91cy4gVGh1cyBmb3IgdXNlci1zcGFjZQogCQl0byBlc3RhYmxpc2ggdGhlIGZ1bGwgbGF5b3V0IHRoZXNlIG11c3QgYmUgdXNlZCBpbiBjb25qdW5jdGlvbgogCQl3aXRoIGFsbCBfZW4gYXR0cmlidXRlcyB0byBlc3RhYmxpc2ggd2hpY2ggY2hhbm5lbHMgYXJlIHByZXNlbnQsCiAJCWFuZCB0aGUgcmVsZXZhbnQgX3R5cGUgYXR0cmlidXRlcyB0byBlc3RhYmxpc2ggdGhlIGRhdGEgc3RvcmFnZQogCQlmb3JtYXQuCi0KLVdoYXQ6CQkvc3lzLy4uLi9kZXZpY2Vbbl0vYnVmZmVyL3NjYW5fZWxlbWVudHMvYWNjZWxbX3gwXV9zaGlmdAotS2VybmVsVmVyc2lvbjoJMi42LjM3Ci1Db250YWN0OglsaW51eC1paW9Admdlci5rZXJuZWwub3JnCi1EZXNjcmlwdGlvbjoKLQkJQSBiaXQgc2hpZnQgKHRvIHJpZ2h0KSB0aGF0IG11c3QgYmUgYXBwbGllZCBwcmlvciB0bwotCQlleHRyYWN0aW5nIHRoZSBiaXRzIHNwZWNpZmllZCBieSBhY2NlbFtfeDBdX3ByZWNpc2lvbi4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vRG9jdW1lbnRhdGlvbi9zeXNmcy1idXMtaWlvLWRkcyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vRG9jdW1lbnRhdGlvbi9zeXNmcy1idXMtaWlvLWRkcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZmRkNTQ3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9Eb2N1bWVudGF0aW9uL3N5c2ZzLWJ1cy1paW8tZGRzCkBAIC0wLDAgKzEsOTMgQEAKKworV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzLy4uLi9kZHNYX2ZyZXFZCitLZXJuZWxWZXJzaW9uOgkyLjYuMzcKK0NvbnRhY3Q6CWxpbnV4LWlpb0B2Z2VyLmtlcm5lbC5vcmcKK0Rlc2NyaXB0aW9uOgorCQlTdG9yZXMgZnJlcXVlbmN5IGludG8gdHVuaW5nIHdvcmQgWS4KKwkJVGhlcmUgd2lsbCBiZSBtb3JlIHRoYW4gb25lIGRkc1hfZnJlcVkgZmlsZSwgd2hpY2ggYWxsb3dzIGZvcgorCQlwaW4gY29udHJvbGxlZCBGU0sgRnJlcXVlbmN5IFNoaWZ0IEtleWluZworCQkoZGRzWF9waW5jb250cm9sX2ZyZXFfZW4gaXMgYWN0aXZlKSBvciB0aGUgdXNlciBjYW4gY29udHJvbAorCQl0aGUgZGVzaXJlZCBhY3RpdmUgdHVuaW5nIHdvcmQgYnkgd3JpdGluZyBZIHRvIHRoZQorCQlkZHNYX2ZyZXFzeW1ib2wgZmlsZS4KKworV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzLy4uLi9kZHNYX2ZyZXFZX3NjYWxlCitLZXJuZWxWZXJzaW9uOgkyLjYuMzcKK0NvbnRhY3Q6CWxpbnV4LWlpb0B2Z2VyLmtlcm5lbC5vcmcKK0Rlc2NyaXB0aW9uOgorCQlTY2FsZSB0byBiZSBhcHBsaWVkIHRvIGRkc1hfZnJlcVkgaW4gb3JkZXIgdG8gb2J0YWluIHRoZQorCQlkZXNpcmVkIHZhbHVlIGluIEh6LiBJZiBzaGFyZWQgYWNyb3NzIGFsbCBmcmVxdWVuY3kgcmVnaXN0ZXJzCisJCVkgaXMgbm90IHByZXNlbnQuIEl0IGlzIGFsc28gcG9zc2libGUgWCBpcyBub3QgcHJlc2VudCBpZgorCQlzaGFyZWQgYWNyb3NzIGFsbCBjaGFubmVscy4KKworV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzLy4uLi9kZHNYX2ZyZXFzeW1ib2wKK0tlcm5lbFZlcnNpb246CTIuNi4zNworQ29udGFjdDoJbGludXgtaWlvQHZnZXIua2VybmVsLm9yZworRGVzY3JpcHRpb246CisJCVNwZWNpZmllcyB0aGUgYWN0aXZlIG91dHB1dCBmcmVxdWVuY3kgdHVuaW5nIHdvcmQuIFRoZSB2YWx1ZQorCQljb3JyZXNwb25kcyB0byB0aGUgWSBpbiBkZHNYX2ZyZXFZLiBUbyBleGl0IHRoaXMgbW9kZSB0aGUgdXNlcgorCQljYW4gd3JpdGUgZGRzWF9waW5jb250cm9sX2ZyZXFfZW4gb3IgZGRzWF9vdXRfZW5hYmxlIGZpbGUuCisKK1doYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy8uLi4vZGRzWF9waGFzZVkKK0tlcm5lbFZlcnNpb246CTIuNi4zNworQ29udGFjdDoJbGludXgtaWlvQHZnZXIua2VybmVsLm9yZworRGVzY3JpcHRpb246CisJCVN0b3JlcyBwaGFzZSBpbnRvIFkuCisJCVRoZXJlIHdpbGwgYmUgbW9yZSB0aGFuIG9uZSBkZHNYX3BoYXNlWSBmaWxlLCB3aGljaCBhbGxvd3MgZm9yCisJCXBpbiBjb250cm9sbGVkIFBTSyBQaGFzZSBTaGlmdCBLZXlpbmcKKwkJKGRkc1hfcGluY29udHJvbF9waGFzZV9lbiBpcyBhY3RpdmUpIG9yIHRoZSB1c2VyIGNhbgorCQljb250cm9sIHRoZSBkZXNpcmVkIHBoYXNlIFkgd2hpY2ggaXMgYWRkZWQgdG8gdGhlIHBoYXNlCisJCWFjY3VtdWxhdG9yIG91dHB1dCBieSB3cml0aW5nIFkgdG8gdGhlIGVuX3BoYXNlIGZpbGUuCisKK1doYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy8uLi4vZGRzWF9waGFzZVlfc2NhbGUKK0tlcm5lbFZlcnNpb246CTIuNi4zNworQ29udGFjdDoJbGludXgtaWlvQHZnZXIua2VybmVsLm9yZworRGVzY3JpcHRpb246CisJCVNjYWxlIHRvIGJlIGFwcGxpZWQgdG8gZGRzWF9waGFzZVkgaW4gb3JkZXIgdG8gb2J0YWluIHRoZQorCQlkZXNpcmVkIHZhbHVlIGluIHJhZC4gSWYgc2hhcmVkIGFjcm9zcyBhbGwgcGhhc2UgcmVnaXN0ZXJzCisJCVkgaXMgbm90IHByZXNlbnQuIEl0IGlzIGFsc28gcG9zc2libGUgWCBpcyBub3QgcHJlc2VudCBpZgorCQlzaGFyZWQgYWNyb3NzIGFsbCBjaGFubmVscy4KKworV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzLy4uLi9kZHNYX3BoYXNlc3ltYm9sCitLZXJuZWxWZXJzaW9uOgkyLjYuMzcKK0NvbnRhY3Q6CWxpbnV4LWlpb0B2Z2VyLmtlcm5lbC5vcmcKK0Rlc2NyaXB0aW9uOgorCQlTcGVjaWZpZXMgdGhlIGFjdGl2ZSBwaGFzZSBZIHdoaWNoIGlzIGFkZGVkIHRvIHRoZSBwaGFzZQorCQlhY2N1bXVsYXRvciBvdXRwdXQuIFRoZSB2YWx1ZSBjb3JyZXNwb25kcyB0byB0aGUgWSBpbgorCQlkZHNYX3BoYXNlWS4gVG8gZXhpdCB0aGlzIG1vZGUgdGhlIHVzZXIgY2FuIHdyaXRlCisJCWRkc1hfcGluY29udHJvbF9waGFzZV9lbiBvciBkaXNhYmxlIGZpbGUuCisKK1doYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy8uLi4vZGRzWF9waW5jb250cm9sX2VuCitXaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvLi4uL2Rkc1hfcGluY29udHJvbF9mcmVxX2VuCitXaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvLi4uL2Rkc1hfcGluY29udHJvbF9waGFzZV9lbgorS2VybmVsVmVyc2lvbjoJMi42LjM3CitDb250YWN0OglsaW51eC1paW9Admdlci5rZXJuZWwub3JnCitEZXNjcmlwdGlvbjoKKwkJZGRzWF9waW5jb250cm9sX2VuOiBCb3RoLCB0aGUgYWN0aXZlIGZyZXF1ZW5jeSBhbmQgcGhhc2UgaXMKKwkJY29udHJvbGxlZCBieSB0aGUgcmVzcGVjdGl2ZSBwaGFzZSBhbmQgZnJlcXVlbmN5IGNvbnRyb2wgaW5wdXRzLgorCQlJbiBjYXNlIHRoZSBkZXZpY2UgaW4gcXVlc3Rpb24gYWxsb3dzIHRvIGluZGVwZW5kZW50IGNvbnRyb2xzLAorCQl0aGVuIHRoZXJlIGFyZSBkZWRpY2F0ZWQgZmlsZXMgKGRkc1hfcGluY29udHJvbF9mcmVxX2VuLAorCQlkZHNYX3BpbmNvbnRyb2xfcGhhc2VfZW4pLgorCitXaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvLi4uL2Rkc1hfb3V0X2VuYWJsZQorV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzLy4uLi9kZHNYX291dFlfZW5hYmxlCitLZXJuZWxWZXJzaW9uOgkyLjYuMzcKK0NvbnRhY3Q6CWxpbnV4LWlpb0B2Z2VyLmtlcm5lbC5vcmcKK0Rlc2NyaXB0aW9uOgorCQlkZHNYX291dFlfZW5hYmxlIGNvbnRyb2xzIHNpZ25hbCBnZW5lcmF0aW9uIG9uIG91dHB1dCBZIG9mCisJCWNoYW5uZWwgWC4gWSBtYXkgYmUgc3VwcHJlc3NlZCBpZiBhbGwgY2hhbm5lbHMgYXJlCisJCWNvbnRyb2xsZWQgdG9nZXRoZXIuCisKK1doYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy8uLi4vZGRzWF9vdXRZX3dhdmV0eXBlCitLZXJuZWxWZXJzaW9uOgkyLjYuMzcKK0NvbnRhY3Q6CWxpbnV4LWlpb0B2Z2VyLmtlcm5lbC5vcmcKK0Rlc2NyaXB0aW9uOgorCQlTcGVjaWZpZXMgdGhlIG91dHB1dCB3YXZlZm9ybS4KKwkJKHNpbmUsIHRyaWFuZ2xlLCByYW1wLCBzcXVhcmUsIC4uLikKKwkJRm9yIGEgbGlzdCBvZiBhdmFpbGFibGUgb3V0cHV0IHdhdmVmb3JtIG9wdGlvbnMgcmVhZAorCQlhdmFpbGFibGVfb3V0cHV0X21vZGVzLgorCitXaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvLi4uL2Rkc1hfb3V0WV93YXZldHlwZV9hdmFpbGFibGUKK0tlcm5lbFZlcnNpb246CTIuNi4zNworQ29udGFjdDoJbGludXgtaWlvQHZnZXIua2VybmVsLm9yZworRGVzY3JpcHRpb246CisJCUxpc3RzIGFsbCBhdmFpbGFibGUgb3V0cHV0IHdhdmVmb3JtIG9wdGlvbnMuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL0tjb25maWcgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL0tjb25maWcKaW5kZXggZWQ0ODgxNS4uZTJhYzA3ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9LY29uZmlnCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vS2NvbmZpZwpAQCAtNDIsMTEgKzQyLDE1IEBACiAKIHNvdXJjZSAiZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9LY29uZmlnIgogc291cmNlICJkcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9LY29uZmlnIgorc291cmNlICJkcml2ZXJzL3N0YWdpbmcvaWlvL2FkZGFjL0tjb25maWciCitzb3VyY2UgImRyaXZlcnMvc3RhZ2luZy9paW8vZGFjL0tjb25maWciCitzb3VyY2UgImRyaXZlcnMvc3RhZ2luZy9paW8vZGRzL0tjb25maWciCiBzb3VyY2UgImRyaXZlcnMvc3RhZ2luZy9paW8vZ3lyby9LY29uZmlnIgogc291cmNlICJkcml2ZXJzL3N0YWdpbmcvaWlvL2ltdS9LY29uZmlnIgogc291cmNlICJkcml2ZXJzL3N0YWdpbmcvaWlvL2xpZ2h0L0tjb25maWciCiBzb3VyY2UgImRyaXZlcnMvc3RhZ2luZy9paW8vbWFnbmV0b21ldGVyL0tjb25maWciCi0KK3NvdXJjZSAiZHJpdmVycy9zdGFnaW5nL2lpby9tZXRlci9LY29uZmlnIgorc291cmNlICJkcml2ZXJzL3N0YWdpbmcvaWlvL3Jlc29sdmVyL0tjb25maWciCiBzb3VyY2UgImRyaXZlcnMvc3RhZ2luZy9paW8vdHJpZ2dlci9LY29uZmlnIgogCiBlbmRpZiAjIElJTwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9NYWtlZmlsZSBiL2RyaXZlcnMvc3RhZ2luZy9paW8vTWFrZWZpbGUKaW5kZXggZTkwOTY3NC4uZjliNWZiMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL01ha2VmaWxlCkBAIC0xMSw4ICsxMSwxMyBAQAogCiBvYmoteSArPSBhY2NlbC8KIG9iai15ICs9IGFkYy8KK29iai15ICs9IGFkZGFjLworb2JqLXkgKz0gZGFjLworb2JqLXkgKz0gZGRzLwogb2JqLXkgKz0gZ3lyby8KIG9iai15ICs9IGltdS8KIG9iai15ICs9IGxpZ2h0Lwotb2JqLXkgKz0gdHJpZ2dlci8KIG9iai15ICs9IG1hZ25ldG9tZXRlci8KK29iai15ICs9IG1ldGVyLworb2JqLXkgKz0gcmVzb2x2ZXIvCitvYmoteSArPSB0cmlnZ2VyLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9UT0RPIGIvZHJpdmVycy9zdGFnaW5nL2lpby9UT0RPCmluZGV4IDg5OGNiYTEuLmQxYWQzNWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vVE9ETworKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL1RPRE8KQEAgLTYxLDYgKzYxLDEwIEBACiBmaWxlcy4gKGF2b2lkZWQgYXQgdGhlIG1vbWVudCB0byBrZWVwIHRoZSBkcml2ZXIgc2V0CiBjb250YWluZWQgaW4gc3RhZ2luZykuCiAKK0FESSBEcml2ZXJzOgorQ0MgdGhlIGRldmljZS1kcml2ZXJzLWRldmVsQGJsYWNrZmluLnVjbGludXgub3JnIG1haWxpbmcgbGlzdCB3aGVuCitlLW1haWxpbmcgdGhlIG5vcm1hbCBJSU8gbGlzdCAoc2VlIGJlbG93KS4KKwogRG9jdW1lbnRhdGlvbgogMSkgTG90cyBvZiBjbGVhbnVwIGFuZCBleHBhbnNpb24uCiAyKSBTb21lIGRldmljZSByZXF1aXJlIGluZHZpZHVhbCBkb2NzLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9LY29uZmlnIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9LY29uZmlnCmluZGV4IDU5MjZjMDMuLmEzNGYxZDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvS2NvbmZpZworKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL0tjb25maWcKQEAgLTMsNiArMywzMyBAQAogIwogY29tbWVudCAiQWNjZWxlcm9tZXRlcnMiCiAKK2NvbmZpZyBBRElTMTYyMDEKKwl0cmlzdGF0ZSAiQW5hbG9nIERldmljZXMgQURJUzE2MjAxIER1YWwtQXhpcyBEaWdpdGFsIEluY2xpbm9tZXRlciBhbmQgQWNjZWxlcm9tZXRlciIKKwlkZXBlbmRzIG9uIFNQSQorCXNlbGVjdCBJSU9fVFJJR0dFUiBpZiBJSU9fUklOR19CVUZGRVIKKwlzZWxlY3QgSUlPX1NXX1JJTkcgaWYgSUlPX1JJTkdfQlVGRkVSCisJaGVscAorCSAgU2F5IHllcyBoZXJlIHRvIGJ1aWxkIHN1cHBvcnQgZm9yIEFuYWxvZyBEZXZpY2VzIGFkaXMxNjIwMSBkdWFsLWF4aXMKKwkgIGRpZ2l0YWwgaW5jbGlub21ldGVyIGFuZCBhY2NlbGVyb21ldGVyLgorCitjb25maWcgQURJUzE2MjAzCisJdHJpc3RhdGUgIkFuYWxvZyBEZXZpY2VzIEFESVMxNjIwMyBQcm9ncmFtbWFibGUgMzYwIERlZ3JlZXMgSW5jbGlub21ldGVyIgorCWRlcGVuZHMgb24gU1BJCisJc2VsZWN0IElJT19UUklHR0VSIGlmIElJT19SSU5HX0JVRkZFUgorCXNlbGVjdCBJSU9fU1dfUklORyBpZiBJSU9fUklOR19CVUZGRVIKKwloZWxwCisJICBTYXkgeWVzIGhlcmUgdG8gYnVpbGQgc3VwcG9ydCBmb3IgQW5hbG9nIERldmljZXMgYWRpczE2MjAzIFByb2dyYW1tYWJsZQorCSAgMzYwIERlZ3JlZXMgSW5jbGlub21ldGVyLgorCitjb25maWcgQURJUzE2MjA0CisJdHJpc3RhdGUgIkFuYWxvZyBEZXZpY2VzIEFESVMxNjIwNCBQcm9ncmFtbWFibGUgSGlnaC1nIERpZ2l0YWwgSW1wYWN0IFNlbnNvciBhbmQgUmVjb3JkZXIiCisJZGVwZW5kcyBvbiBTUEkKKwlzZWxlY3QgSUlPX1RSSUdHRVIgaWYgSUlPX1JJTkdfQlVGRkVSCisJc2VsZWN0IElJT19TV19SSU5HIGlmIElJT19SSU5HX0JVRkZFUgorCWhlbHAKKwkgIFNheSB5ZXMgaGVyZSB0byBidWlsZCBzdXBwb3J0IGZvciBBbmFsb2cgRGV2aWNlcyBhZGlzMTYyMDQgUHJvZ3JhbW1hYmxlCisJICBIaWdoLWcgRGlnaXRhbCBJbXBhY3QgU2Vuc29yIGFuZCBSZWNvcmRlci4KKwogY29uZmlnIEFESVMxNjIwOQogCXRyaXN0YXRlICJBbmFsb2cgRGV2aWNlcyBBRElTMTYyMDkgRHVhbC1BeGlzIERpZ2l0YWwgSW5jbGlub21ldGVyIGFuZCBBY2NlbGVyb21ldGVyIgogCWRlcGVuZHMgb24gU1BJCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL01ha2VmaWxlIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9NYWtlZmlsZQppbmRleCBmZjg0NzAzLi4xYjJhNmQzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvTWFrZWZpbGUKQEAgLTIsNiArMiwxOCBAQAogIyBNYWtlZmlsZSBmb3IgaW5kdXN0cmlhbCBJL08gYWNjZWxlcm9tZXRlciBkcml2ZXJzCiAjCiAKK2FkaXMxNjIwMS15ICAgICAgICAgICAgIDo9IGFkaXMxNjIwMV9jb3JlLm8KK2FkaXMxNjIwMS0kKENPTkZJR19JSU9fUklOR19CVUZGRVIpICs9IGFkaXMxNjIwMV9yaW5nLm8gYWRpczE2MjAxX3RyaWdnZXIubworb2JqLSQoQ09ORklHX0FESVMxNjIwMSkgKz0gYWRpczE2MjAxLm8KKworYWRpczE2MjAzLXkgICAgICAgICAgICAgOj0gYWRpczE2MjAzX2NvcmUubworYWRpczE2MjAzLSQoQ09ORklHX0lJT19SSU5HX0JVRkZFUikgKz0gYWRpczE2MjAzX3JpbmcubyBhZGlzMTYyMDNfdHJpZ2dlci5vCitvYmotJChDT05GSUdfQURJUzE2MjAzKSArPSBhZGlzMTYyMDMubworCithZGlzMTYyMDQteSAgICAgICAgICAgICA6PSBhZGlzMTYyMDRfY29yZS5vCithZGlzMTYyMDQtJChDT05GSUdfSUlPX1JJTkdfQlVGRkVSKSArPSBhZGlzMTYyMDRfcmluZy5vIGFkaXMxNjIwNF90cmlnZ2VyLm8KK29iai0kKENPTkZJR19BRElTMTYyMDQpICs9IGFkaXMxNjIwNC5vCisKIGFkaXMxNjIwOS15ICAgICAgICAgICAgIDo9IGFkaXMxNjIwOV9jb3JlLm8KIGFkaXMxNjIwOS0kKENPTkZJR19JSU9fUklOR19CVUZGRVIpICs9IGFkaXMxNjIwOV9yaW5nLm8gYWRpczE2MjA5X3RyaWdnZXIubwogb2JqLSQoQ09ORklHX0FESVMxNjIwOSkgKz0gYWRpczE2MjA5Lm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWNjZWwuaCBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWNjZWwuaAppbmRleCBmNWY2MWIyLi41MDY1MWY4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FjY2VsLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hY2NlbC5oCkBAIC02NSwzICs2NSwyMyBAQAogI2RlZmluZSBJSU9fREVWX0FUVFJfQUNDRUxfWihfc2hvdywgX2FkZHIpCQkJXAogCUlJT19ERVZJQ0VfQVRUUihhY2NlbF96X3JhdywgU19JUlVHTywgX3Nob3csIE5VTEwsIF9hZGRyKQogCisjZGVmaW5lIElJT19ERVZfQVRUUl9BQ0NFTF9YWShfc2hvdywgX2FkZHIpCQkJXAorCUlJT19ERVZJQ0VfQVRUUihhY2NlbF94eSwgU19JUlVHTywgX3Nob3csIE5VTEwsIF9hZGRyKQorCisjZGVmaW5lIElJT19ERVZfQVRUUl9BQ0NFTF9QRUFLKF9zaG93LCBfYWRkcikJCQlcCisJSUlPX0RFVklDRV9BVFRSKGFjY2VsX3BlYWssIFNfSVJVR08sIF9zaG93LCBOVUxMLCBfYWRkcikKKworI2RlZmluZSBJSU9fREVWX0FUVFJfQUNDRUxfWFBFQUsoX3Nob3csIF9hZGRyKQkJCVwKKwlJSU9fREVWSUNFX0FUVFIoYWNjZWxfeHBlYWssIFNfSVJVR08sIF9zaG93LCBOVUxMLCBfYWRkcikKKworI2RlZmluZSBJSU9fREVWX0FUVFJfQUNDRUxfWVBFQUsoX3Nob3csIF9hZGRyKQkJCVwKKwlJSU9fREVWSUNFX0FUVFIoYWNjZWxfeXBlYWssIFNfSVJVR08sIF9zaG93LCBOVUxMLCBfYWRkcikKKworI2RlZmluZSBJSU9fREVWX0FUVFJfQUNDRUxfWlBFQUsoX3Nob3csIF9hZGRyKQkJCVwKKwlJSU9fREVWSUNFX0FUVFIoYWNjZWxfenBlYWssIFNfSVJVR08sIF9zaG93LCBOVUxMLCBfYWRkcikKKworI2RlZmluZSBJSU9fREVWX0FUVFJfQUNDRUxfWFlQRUFLKF9zaG93LCBfYWRkcikJCVwKKwlJSU9fREVWSUNFX0FUVFIoYWNjZWxfeHlwZWFrLCBTX0lSVUdPLCBfc2hvdywgTlVMTCwgX2FkZHIpCisKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX0FDQ0VMX1hZWlBFQUsoX3Nob3csIF9hZGRyKQkJXAorCUlJT19ERVZJQ0VfQVRUUihhY2NlbF94eXpwZWFrLCBTX0lSVUdPLCBfc2hvdywgTlVMTCwgX2FkZHIpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FkaXMxNjIwMS5oIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyMDEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOWJmMjJjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyMDEuaApAQCAtMCwwICsxLDE1MCBAQAorI2lmbmRlZiBTUElfQURJUzE2MjAxX0hfCisjZGVmaW5lIFNQSV9BRElTMTYyMDFfSF8KKworI2RlZmluZSBBRElTMTYyMDFfU1RBUlRVUF9ERUxBWQkyMjAgLyogbXMgKi8KKworI2RlZmluZSBBRElTMTYyMDFfUkVBRF9SRUcoYSkgICAgYQorI2RlZmluZSBBRElTMTYyMDFfV1JJVEVfUkVHKGEpICgoYSkgfCAweDgwKQorCisjZGVmaW5lIEFESVMxNjIwMV9GTEFTSF9DTlQgICAgICAweDAwIC8qIEZsYXNoIG1lbW9yeSB3cml0ZSBjb3VudCAqLworI2RlZmluZSBBRElTMTYyMDFfU1VQUExZX09VVCAgICAgMHgwMiAvKiBPdXRwdXQsIHBvd2VyIHN1cHBseSAqLworI2RlZmluZSBBRElTMTYyMDFfWEFDQ0xfT1VUICAgICAgMHgwNCAvKiBPdXRwdXQsIHgtYXhpcyBhY2NlbGVyb21ldGVyICovCisjZGVmaW5lIEFESVMxNjIwMV9ZQUNDTF9PVVQgICAgICAweDA2IC8qIE91dHB1dCwgeS1heGlzIGFjY2VsZXJvbWV0ZXIgKi8KKyNkZWZpbmUgQURJUzE2MjAxX0FVWF9BREMgICAgICAgIDB4MDggLyogT3V0cHV0LCBhdXhpbGlhcnkgQURDIGlucHV0ICovCisjZGVmaW5lIEFESVMxNjIwMV9URU1QX09VVCAgICAgICAweDBBIC8qIE91dHB1dCwgdGVtcGVyYXR1cmUgKi8KKyNkZWZpbmUgQURJUzE2MjAxX1hJTkNMX09VVCAgICAgIDB4MEMgLyogT3V0cHV0LCB4LWF4aXMgaW5jbGluYXRpb24gKi8KKyNkZWZpbmUgQURJUzE2MjAxX1lJTkNMX09VVCAgICAgIDB4MEUgLyogT3V0cHV0LCB5LWF4aXMgaW5jbGluYXRpb24gKi8KKyNkZWZpbmUgQURJUzE2MjAxX1hBQ0NMX09GRlMgICAgIDB4MTAgLyogQ2FsaWJyYXRpb24sIHgtYXhpcyBhY2NlbGVyYXRpb24gb2Zmc2V0ICovCisjZGVmaW5lIEFESVMxNjIwMV9ZQUNDTF9PRkZTICAgICAweDEyIC8qIENhbGlicmF0aW9uLCB5LWF4aXMgYWNjZWxlcmF0aW9uIG9mZnNldCAqLworI2RlZmluZSBBRElTMTYyMDFfWEFDQ0xfU0NBTEUgICAgMHgxNCAvKiB4LWF4aXMgYWNjZWxlcmF0aW9uIHNjYWxlIGZhY3RvciAqLworI2RlZmluZSBBRElTMTYyMDFfWUFDQ0xfU0NBTEUgICAgMHgxNiAvKiB5LWF4aXMgYWNjZWxlcmF0aW9uIHNjYWxlIGZhY3RvciAqLworI2RlZmluZSBBRElTMTYyMDFfWElOQ0xfT0ZGUyAgICAgMHgxOCAvKiBDYWxpYnJhdGlvbiwgeC1heGlzIGluY2xpbmF0aW9uIG9mZnNldCAqLworI2RlZmluZSBBRElTMTYyMDFfWUlOQ0xfT0ZGUyAgICAgMHgxQSAvKiBDYWxpYnJhdGlvbiwgeS1heGlzIGluY2xpbmF0aW9uIG9mZnNldCAqLworI2RlZmluZSBBRElTMTYyMDFfWElOQ0xfU0NBTEUgICAgMHgxQyAvKiB4LWF4aXMgaW5jbGluYXRpb24gc2NhbGUgZmFjdG9yICovCisjZGVmaW5lIEFESVMxNjIwMV9ZSU5DTF9TQ0FMRSAgICAweDFFIC8qIHktYXhpcyBpbmNsaW5hdGlvbiBzY2FsZSBmYWN0b3IgKi8KKyNkZWZpbmUgQURJUzE2MjAxX0FMTV9NQUcxICAgICAgIDB4MjAgLyogQWxhcm0gMSBhbXBsaXR1ZGUgdGhyZXNob2xkICovCisjZGVmaW5lIEFESVMxNjIwMV9BTE1fTUFHMiAgICAgICAweDIyIC8qIEFsYXJtIDIgYW1wbGl0dWRlIHRocmVzaG9sZCAqLworI2RlZmluZSBBRElTMTYyMDFfQUxNX1NNUEwxICAgICAgMHgyNCAvKiBBbGFybSAxLCBzYW1wbGUgcGVyaW9kICovCisjZGVmaW5lIEFESVMxNjIwMV9BTE1fU01QTDIgICAgICAweDI2IC8qIEFsYXJtIDIsIHNhbXBsZSBwZXJpb2QgKi8KKyNkZWZpbmUgQURJUzE2MjAxX0FMTV9DVFJMICAgICAgIDB4MjggLyogQWxhcm0gY29udHJvbCAqLworI2RlZmluZSBBRElTMTYyMDFfQVVYX0RBQyAgICAgICAgMHgzMCAvKiBBdXhpbGlhcnkgREFDIGRhdGEgKi8KKyNkZWZpbmUgQURJUzE2MjAxX0dQSU9fQ1RSTCAgICAgIDB4MzIgLyogR2VuZXJhbC1wdXJwb3NlIGRpZ2l0YWwgaW5wdXQvb3V0cHV0IGNvbnRyb2wgKi8KKyNkZWZpbmUgQURJUzE2MjAxX01TQ19DVFJMICAgICAgIDB4MzQgLyogTWlzY2VsbGFuZW91cyBjb250cm9sICovCisjZGVmaW5lIEFESVMxNjIwMV9TTVBMX1BSRCAgICAgICAweDM2IC8qIEludGVybmFsIHNhbXBsZSBwZXJpb2QgKHJhdGUpIGNvbnRyb2wgKi8KKyNkZWZpbmUgQURJUzE2MjAxX0FWR19DTlQgICAgICAgIDB4MzggLyogT3BlcmF0aW9uLCBmaWx0ZXIgY29uZmlndXJhdGlvbiAqLworI2RlZmluZSBBRElTMTYyMDFfU0xQX0NOVCAgICAgICAgMHgzQSAvKiBPcGVyYXRpb24sIHNsZWVwIG1vZGUgY29udHJvbCAqLworI2RlZmluZSBBRElTMTYyMDFfRElBR19TVEFUICAgICAgMHgzQyAvKiBEaWFnbm9zdGljcywgc3lzdGVtIHN0YXR1cyByZWdpc3RlciAqLworI2RlZmluZSBBRElTMTYyMDFfR0xPQl9DTUQgICAgICAgMHgzRSAvKiBPcGVyYXRpb24sIHN5c3RlbSBjb21tYW5kIHJlZ2lzdGVyICovCisKKyNkZWZpbmUgQURJUzE2MjAxX09VVFBVVFMgICAgICAgIDcKKworLyogTVNDX0NUUkwgKi8KKyNkZWZpbmUgQURJUzE2MjAxX01TQ19DVFJMX1NFTEZfVEVTVF9FTgkgICAgICAgICgxIDw8IDgpICAvKiBTZWxmLXRlc3QgZW5hYmxlICovCisjZGVmaW5lIEFESVMxNjIwMV9NU0NfQ1RSTF9EQVRBX1JEWV9FTgkgICAgICAgICgxIDw8IDIpICAvKiBEYXRhLXJlYWR5IGVuYWJsZTogMSA9IGVuYWJsZWQsIDAgPSBkaXNhYmxlZCAqLworI2RlZmluZSBBRElTMTYyMDFfTVNDX0NUUkxfQUNUSVZFX0hJR0gJICAgICAgICAoMSA8PCAxKSAgLyogRGF0YS1yZWFkeSBwb2xhcml0eTogMSA9IGFjdGl2ZSBoaWdoLCAwID0gYWN0aXZlIGxvdyAqLworI2RlZmluZSBBRElTMTYyMDFfTVNDX0NUUkxfREFUQV9SRFlfRElPMQkoMSA8PCAwKSAgLyogRGF0YS1yZWFkeSBsaW5lIHNlbGVjdGlvbjogMSA9IERJTzEsIDAgPSBESU8wICovCisKKy8qIERJQUdfU1RBVCAqLworI2RlZmluZSBBRElTMTYyMDFfRElBR19TVEFUX0FMQVJNMiAgICAgICAgKDE8PDkpIC8qIEFsYXJtIDIgc3RhdHVzOiAxID0gYWxhcm0gYWN0aXZlLCAwID0gYWxhcm0gaW5hY3RpdmUgKi8KKyNkZWZpbmUgQURJUzE2MjAxX0RJQUdfU1RBVF9BTEFSTTEgICAgICAgICgxPDw4KSAvKiBBbGFybSAxIHN0YXR1czogMSA9IGFsYXJtIGFjdGl2ZSwgMCA9IGFsYXJtIGluYWN0aXZlICovCisjZGVmaW5lIEFESVMxNjIwMV9ESUFHX1NUQVRfU1BJX0ZBSUwJICAoMTw8MykgLyogU1BJIGNvbW11bmljYXRpb25zIGZhaWx1cmUgKi8KKyNkZWZpbmUgQURJUzE2MjAxX0RJQUdfU1RBVF9GTEFTSF9VUFQJICAoMTw8MikgLyogRmxhc2ggdXBkYXRlIGZhaWx1cmUgKi8KKyNkZWZpbmUgQURJUzE2MjAxX0RJQUdfU1RBVF9QT1dFUl9ISUdICSAgKDE8PDEpIC8qIFBvd2VyIHN1cHBseSBhYm92ZSAzLjYyNSBWICovCisjZGVmaW5lIEFESVMxNjIwMV9ESUFHX1NUQVRfUE9XRVJfTE9XCSAgKDE8PDApIC8qIFBvd2VyIHN1cHBseSBiZWxvdyAzLjE1IFYgKi8KKworLyogR0xPQl9DTUQgKi8KKyNkZWZpbmUgQURJUzE2MjAxX0dMT0JfQ01EX1NXX1JFU0VUCSgxPDw3KQorI2RlZmluZSBBRElTMTYyMDFfR0xPQl9DTURfRkFDVE9SWV9DQUwJKDE8PDEpCisKKyNkZWZpbmUgQURJUzE2MjAxX01BWF9UWCAxNAorI2RlZmluZSBBRElTMTYyMDFfTUFYX1JYIDE0CisKKyNkZWZpbmUgQURJUzE2MjAxX0VSUk9SX0FDVElWRSAgICAgICAgICAoMTw8MTQpCisKKy8qKgorICogc3RydWN0IGFkaXMxNjIwMV9zdGF0ZSAtIGRldmljZSBpbnN0YW5jZSBzcGVjaWZpYyBkYXRhCisgKiBAdXM6CQkJYWN0dWFsIHNwaV9kZXZpY2UKKyAqIEB3b3JrX3RyaWdnZXJfdG9fcmluZzogYmggZm9yIHRyaWdnZXJlZCBldmVudCBoYW5kbGluZworICogQGludGVyOgkJdXNlZCB0byBjaGVjayBpZiBuZXcgaW50ZXJydXB0IGhhcyBiZWVuIHRyaWdnZXJlZAorICogQGxhc3RfdGltZXN0YW1wOglwYXNzaW5nIHRpbWVzdGFtcCBmcm9tIHRoIHRvIGJoIG9mIGludGVycnVwdCBoYW5kbGVyCisgKiBAaW5kaW9fZGV2OgkJaW5kdXN0cmlhbCBJL08gZGV2aWNlIHN0cnVjdHVyZQorICogQHRyaWc6CQlkYXRhIHJlYWR5IHRyaWdnZXIgcmVnaXN0ZXJlZCB3aXRoIGlpbworICogQHR4OgkJCXRyYW5zbWl0IGJ1ZmZlcgorICogQHJ4OgkJCXJlY2lldmUgYnVmZmVyCisgKiBAYnVmX2xvY2s6CQltdXRleCB0byBwcm90ZWN0IHR4IGFuZCByeAorICoqLworc3RydWN0IGFkaXMxNjIwMV9zdGF0ZSB7CisJc3RydWN0IHNwaV9kZXZpY2UJCSp1czsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QJCXdvcmtfdHJpZ2dlcl90b19yaW5nOworCXM2NAkJCQlsYXN0X3RpbWVzdGFtcDsKKwlzdHJ1Y3QgaWlvX2RldgkJCSppbmRpb19kZXY7CisJc3RydWN0IGlpb190cmlnZ2VyCQkqdHJpZzsKKwl1OAkJCQkqdHg7CisJdTgJCQkJKnJ4OworCXN0cnVjdCBtdXRleAkJCWJ1Zl9sb2NrOworfTsKKworaW50IGFkaXMxNjIwMV9zZXRfaXJxKHN0cnVjdCBkZXZpY2UgKmRldiwgYm9vbCBlbmFibGUpOworCisjaWZkZWYgQ09ORklHX0lJT19SSU5HX0JVRkZFUgorZW51bSBhZGlzMTYyMDFfc2NhbiB7CisJQURJUzE2MjAxX1NDQU5fU1VQUExZLAorCUFESVMxNjIwMV9TQ0FOX0FDQ19YLAorCUFESVMxNjIwMV9TQ0FOX0FDQ19ZLAorCUFESVMxNjIwMV9TQ0FOX0FVWF9BREMsCisJQURJUzE2MjAxX1NDQU5fVEVNUCwKKwlBRElTMTYyMDFfU0NBTl9JTkNMSV9YLAorCUFESVMxNjIwMV9TQ0FOX0lOQ0xJX1ksCit9OworCit2b2lkIGFkaXMxNjIwMV9yZW1vdmVfdHJpZ2dlcihzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KTsKK2ludCBhZGlzMTYyMDFfcHJvYmVfdHJpZ2dlcihzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KTsKKworc3NpemVfdCBhZGlzMTYyMDFfcmVhZF9kYXRhX2Zyb21fcmluZyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJICAgICAgY2hhciAqYnVmKTsKKworaW50IGFkaXMxNjIwMV9jb25maWd1cmVfcmluZyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KTsKK3ZvaWQgYWRpczE2MjAxX3VuY29uZmlndXJlX3Jpbmcoc3RydWN0IGlpb19kZXYgKmluZGlvX2Rldik7CisKK2ludCBhZGlzMTYyMDFfaW5pdGlhbGl6ZV9yaW5nKHN0cnVjdCBpaW9fcmluZ19idWZmZXIgKnJpbmcpOwordm9pZCBhZGlzMTYyMDFfdW5pbml0aWFsaXplX3Jpbmcoc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqcmluZyk7CisjZWxzZSAvKiBDT05GSUdfSUlPX1JJTkdfQlVGRkVSICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhZGlzMTYyMDFfcmVtb3ZlX3RyaWdnZXIoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKK3sKK30KKworc3RhdGljIGlubGluZSBpbnQgYWRpczE2MjAxX3Byb2JlX3RyaWdnZXIoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBzc2l6ZV90CithZGlzMTYyMDFfcmVhZF9kYXRhX2Zyb21fcmluZyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgICAgIGNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhZGlzMTYyMDFfY29uZmlndXJlX3Jpbmcoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGFkaXMxNjIwMV91bmNvbmZpZ3VyZV9yaW5nKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCit7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGFkaXMxNjIwMV9pbml0aWFsaXplX3Jpbmcoc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqcmluZykKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGFkaXMxNjIwMV91bmluaXRpYWxpemVfcmluZyhzdHJ1Y3QgaWlvX3JpbmdfYnVmZmVyICpyaW5nKQoreworfQorCisjZW5kaWYgLyogQ09ORklHX0lJT19SSU5HX0JVRkZFUiAqLworI2VuZGlmIC8qIFNQSV9BRElTMTYyMDFfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjAxX2NvcmUuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjAxX2NvcmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OWI3ODVhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyMDFfY29yZS5jCkBAIC0wLDAgKzEsNjU5IEBACisvKgorICogQURJUzE2MjAxIFByb2dyYW1tYWJsZSBEaWdpdGFsIFZpYnJhdGlvbiBTZW5zb3IgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IDIwMTAgQW5hbG9nIERldmljZXMgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorCisjaW5jbHVkZSAiLi4vaWlvLmgiCisjaW5jbHVkZSAiLi4vc3lzZnMuaCIKKyNpbmNsdWRlICJhY2NlbC5oIgorI2luY2x1ZGUgImluY2xpbm9tZXRlci5oIgorI2luY2x1ZGUgIi4uL2d5cm8vZ3lyby5oIgorI2luY2x1ZGUgIi4uL2FkYy9hZGMuaCIKKworI2luY2x1ZGUgImFkaXMxNjIwMS5oIgorCisjZGVmaW5lIERSSVZFUl9OQU1FCQkiYWRpczE2MjAxIgorCitzdGF0aWMgaW50IGFkaXMxNjIwMV9jaGVja19zdGF0dXMoc3RydWN0IGRldmljZSAqZGV2KTsKKworLyoqCisgKiBhZGlzMTYyMDFfc3BpX3dyaXRlX3JlZ184KCkgLSB3cml0ZSBzaW5nbGUgYnl0ZSB0byBhIHJlZ2lzdGVyCisgKiBAZGV2OiBkZXZpY2UgYXNzb2NpYXRlZCB3aXRoIGNoaWxkIG9mIGFjdHVhbCBkZXZpY2UgKGlpb19kZXYgb3IgaWlvX3RyaWcpCisgKiBAcmVnX2FkZHJlc3M6IHRoZSBhZGRyZXNzIG9mIHRoZSByZWdpc3RlciB0byBiZSB3cml0dGVuCisgKiBAdmFsOiB0aGUgdmFsdWUgdG8gd3JpdGUKKyAqKi8KK3N0YXRpYyBpbnQgYWRpczE2MjAxX3NwaV93cml0ZV9yZWdfOChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXU4IHJlZ19hZGRyZXNzLAorCQl1OCB2YWwpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkaXMxNjIwMV9zdGF0ZSAqc3QgPSBpaW9fZGV2X2dldF9kZXZkYXRhKGluZGlvX2Rldik7CisKKwltdXRleF9sb2NrKCZzdC0+YnVmX2xvY2spOworCXN0LT50eFswXSA9IEFESVMxNjIwMV9XUklURV9SRUcocmVnX2FkZHJlc3MpOworCXN0LT50eFsxXSA9IHZhbDsKKworCXJldCA9IHNwaV93cml0ZShzdC0+dXMsIHN0LT50eCwgMik7CisJbXV0ZXhfdW5sb2NrKCZzdC0+YnVmX2xvY2spOworCisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBhZGlzMTYyMDFfc3BpX3dyaXRlX3JlZ18xNigpIC0gd3JpdGUgMiBieXRlcyB0byBhIHBhaXIgb2YgcmVnaXN0ZXJzCisgKiBAZGV2OiBkZXZpY2UgYXNzb2NpYXRlZCB3aXRoIGNoaWxkIG9mIGFjdHVhbCBkZXZpY2UgKGlpb19kZXYgb3IgaWlvX3RyaWcpCisgKiBAcmVnX2FkZHJlc3M6IHRoZSBhZGRyZXNzIG9mIHRoZSBsb3dlciBvZiB0aGUgdHdvIHJlZ2lzdGVycy4gU2Vjb25kIHJlZ2lzdGVyCisgKiAgICAgICAgICAgICAgIGlzIGFzc3VtZWQgdG8gaGF2ZSBhZGRyZXNzIG9uZSBncmVhdGVyLgorICogQHZhbDogdmFsdWUgdG8gYmUgd3JpdHRlbgorICoqLworc3RhdGljIGludCBhZGlzMTYyMDFfc3BpX3dyaXRlX3JlZ18xNihzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXU4IGxvd2VyX3JlZ19hZGRyZXNzLAorCQl1MTYgdmFsdWUpCit7CisJaW50IHJldDsKKwlzdHJ1Y3Qgc3BpX21lc3NhZ2UgbXNnOworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWRpczE2MjAxX3N0YXRlICpzdCA9IGlpb19kZXZfZ2V0X2RldmRhdGEoaW5kaW9fZGV2KTsKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyIHhmZXJzW10gPSB7CisJCXsKKwkJCS50eF9idWYgPSBzdC0+dHgsCisJCQkuYml0c19wZXJfd29yZCA9IDgsCisJCQkubGVuID0gMiwKKwkJCS5jc19jaGFuZ2UgPSAxLAorCQl9LCB7CisJCQkudHhfYnVmID0gc3QtPnR4ICsgMiwKKwkJCS5iaXRzX3Blcl93b3JkID0gOCwKKwkJCS5sZW4gPSAyLAorCQkJLmNzX2NoYW5nZSA9IDEsCisJCX0sCisJfTsKKworCW11dGV4X2xvY2soJnN0LT5idWZfbG9jayk7CisJc3QtPnR4WzBdID0gQURJUzE2MjAxX1dSSVRFX1JFRyhsb3dlcl9yZWdfYWRkcmVzcyk7CisJc3QtPnR4WzFdID0gdmFsdWUgJiAweEZGOworCXN0LT50eFsyXSA9IEFESVMxNjIwMV9XUklURV9SRUcobG93ZXJfcmVnX2FkZHJlc3MgKyAxKTsKKwlzdC0+dHhbM10gPSAodmFsdWUgPj4gOCkgJiAweEZGOworCisJc3BpX21lc3NhZ2VfaW5pdCgmbXNnKTsKKwlzcGlfbWVzc2FnZV9hZGRfdGFpbCgmeGZlcnNbMF0sICZtc2cpOworCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZ4ZmVyc1sxXSwgJm1zZyk7CisJcmV0ID0gc3BpX3N5bmMoc3QtPnVzLCAmbXNnKTsKKwltdXRleF91bmxvY2soJnN0LT5idWZfbG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIGFkaXMxNjIwMV9zcGlfcmVhZF9yZWdfMTYoKSAtIHJlYWQgMiBieXRlcyBmcm9tIGEgMTYtYml0IHJlZ2lzdGVyCisgKiBAZGV2OiBkZXZpY2UgYXNzb2NpYXRlZCB3aXRoIGNoaWxkIG9mIGFjdHVhbCBkZXZpY2UgKGlpb19kZXYgb3IgaWlvX3RyaWcpCisgKiBAcmVnX2FkZHJlc3M6IHRoZSBhZGRyZXNzIG9mIHRoZSBsb3dlciBvZiB0aGUgdHdvIHJlZ2lzdGVycy4gU2Vjb25kIHJlZ2lzdGVyCisgKiAgICAgICAgICAgICAgIGlzIGFzc3VtZWQgdG8gaGF2ZSBhZGRyZXNzIG9uZSBncmVhdGVyLgorICogQHZhbDogc29tZXdoZXJlIHRvIHBhc3MgYmFjayB0aGUgdmFsdWUgcmVhZAorICoqLworc3RhdGljIGludCBhZGlzMTYyMDFfc3BpX3JlYWRfcmVnXzE2KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJdTggbG93ZXJfcmVnX2FkZHJlc3MsCisJCXUxNiAqdmFsKQoreworCXN0cnVjdCBzcGlfbWVzc2FnZSBtc2c7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZGlzMTYyMDFfc3RhdGUgKnN0ID0gaWlvX2Rldl9nZXRfZGV2ZGF0YShpbmRpb19kZXYpOworCWludCByZXQ7CisJc3RydWN0IHNwaV90cmFuc2ZlciB4ZmVyc1tdID0geworCQl7CisJCQkudHhfYnVmID0gc3QtPnR4LAorCQkJLmJpdHNfcGVyX3dvcmQgPSA4LAorCQkJLmxlbiA9IDIsCisJCQkuY3NfY2hhbmdlID0gMSwKKwkJCS5kZWxheV91c2VjcyA9IDIwLAorCQl9LCB7CisJCQkucnhfYnVmID0gc3QtPnJ4LAorCQkJLmJpdHNfcGVyX3dvcmQgPSA4LAorCQkJLmxlbiA9IDIsCisJCQkuY3NfY2hhbmdlID0gMSwKKwkJCS5kZWxheV91c2VjcyA9IDIwLAorCQl9LAorCX07CisKKwltdXRleF9sb2NrKCZzdC0+YnVmX2xvY2spOworCXN0LT50eFswXSA9IEFESVMxNjIwMV9SRUFEX1JFRyhsb3dlcl9yZWdfYWRkcmVzcyk7CisJc3QtPnR4WzFdID0gMDsKKworCXNwaV9tZXNzYWdlX2luaXQoJm1zZyk7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnhmZXJzWzBdLCAmbXNnKTsKKwlzcGlfbWVzc2FnZV9hZGRfdGFpbCgmeGZlcnNbMV0sICZtc2cpOworCXJldCA9IHNwaV9zeW5jKHN0LT51cywgJm1zZyk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZzdC0+dXMtPmRldiwgInByb2JsZW0gd2hlbiByZWFkaW5nIDE2IGJpdCByZWdpc3RlciAweCUwMlgiLAorCQkJCWxvd2VyX3JlZ19hZGRyZXNzKTsKKwkJZ290byBlcnJvcl9yZXQ7CisJfQorCSp2YWwgPSAoc3QtPnJ4WzBdIDw8IDgpIHwgc3QtPnJ4WzFdOworCitlcnJvcl9yZXQ6CisJbXV0ZXhfdW5sb2NrKCZzdC0+YnVmX2xvY2spOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkaXMxNjIwMV9yZWFkXzEyYml0X3Vuc2lnbmVkKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlpbnQgcmV0OworCXUxNiB2YWwgPSAwOworCXN0cnVjdCBpaW9fZGV2X2F0dHIgKnRoaXNfYXR0ciA9IHRvX2lpb19kZXZfYXR0cihhdHRyKTsKKworCXJldCA9IGFkaXMxNjIwMV9zcGlfcmVhZF9yZWdfMTYoZGV2LCB0aGlzX2F0dHItPmFkZHJlc3MsICZ2YWwpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlpZiAodmFsICYgQURJUzE2MjAxX0VSUk9SX0FDVElWRSkgeworCQlyZXQgPSBhZGlzMTYyMDFfY2hlY2tfc3RhdHVzKGRldik7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCB2YWwgJiAweDBGRkYpOworfQorCitzdGF0aWMgc3NpemVfdCBhZGlzMTYyMDFfcmVhZF90ZW1wKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3NpemVfdCByZXQ7CisJdTE2IHZhbDsKKworCS8qIFRha2UgdGhlIGlpb19kZXYgc3RhdHVzIGxvY2sgKi8KKwltdXRleF9sb2NrKCZpbmRpb19kZXYtPm1sb2NrKTsKKworCXJldCA9IGFkaXMxNjIwMV9zcGlfcmVhZF9yZWdfMTYoZGV2LCBBRElTMTYyMDFfVEVNUF9PVVQsICh1MTYgKikmdmFsKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3JldDsKKworCWlmICh2YWwgJiBBRElTMTYyMDFfRVJST1JfQUNUSVZFKSB7CisJCXJldCA9IGFkaXMxNjIwMV9jaGVja19zdGF0dXMoZGV2KTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJyb3JfcmV0OworCX0KKworCXZhbCAmPSAweEZGRjsKKwlyZXQgPSBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCB2YWwpOworCitlcnJvcl9yZXQ6CisJbXV0ZXhfdW5sb2NrKCZpbmRpb19kZXYtPm1sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3NpemVfdCBhZGlzMTYyMDFfcmVhZF85Yml0X3NpZ25lZChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBpaW9fZGV2X2F0dHIgKnRoaXNfYXR0ciA9IHRvX2lpb19kZXZfYXR0cihhdHRyKTsKKwlzMTYgdmFsID0gMDsKKwlzc2l6ZV90IHJldDsKKworCW11dGV4X2xvY2soJmluZGlvX2Rldi0+bWxvY2spOworCisJcmV0ID0gYWRpczE2MjAxX3NwaV9yZWFkX3JlZ18xNihkZXYsIHRoaXNfYXR0ci0+YWRkcmVzcywgKHUxNiAqKSZ2YWwpOworCWlmICghcmV0KSB7CisJCWlmICh2YWwgJiBBRElTMTYyMDFfRVJST1JfQUNUSVZFKSB7CisJCQlyZXQgPSBhZGlzMTYyMDFfY2hlY2tfc3RhdHVzKGRldik7CisJCQlpZiAocmV0KQorCQkJCWdvdG8gZXJyb3JfcmV0OworCQl9CisJCXZhbCA9ICgoczE2KSh2YWwgPDwgNykgPj4gNyk7CisJCXJldCA9IHNwcmludGYoYnVmLCAiJWRcbiIsIHZhbCk7CisJfQorCitlcnJvcl9yZXQ6CisJbXV0ZXhfdW5sb2NrKCZpbmRpb19kZXYtPm1sb2NrKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkaXMxNjIwMV9yZWFkXzEyYml0X3NpZ25lZChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBpaW9fZGV2X2F0dHIgKnRoaXNfYXR0ciA9IHRvX2lpb19kZXZfYXR0cihhdHRyKTsKKwlzMTYgdmFsID0gMDsKKwlzc2l6ZV90IHJldDsKKworCW11dGV4X2xvY2soJmluZGlvX2Rldi0+bWxvY2spOworCisJcmV0ID0gYWRpczE2MjAxX3NwaV9yZWFkX3JlZ18xNihkZXYsIHRoaXNfYXR0ci0+YWRkcmVzcywgKHUxNiAqKSZ2YWwpOworCWlmICghcmV0KSB7CisJCWlmICh2YWwgJiBBRElTMTYyMDFfRVJST1JfQUNUSVZFKSB7CisJCQlyZXQgPSBhZGlzMTYyMDFfY2hlY2tfc3RhdHVzKGRldik7CisJCQlpZiAocmV0KQorCQkJCWdvdG8gZXJyb3JfcmV0OworCQl9CisKKwkJdmFsID0gKChzMTYpKHZhbCA8PCA0KSA+PiA0KTsKKwkJcmV0ID0gc3ByaW50ZihidWYsICIlZFxuIiwgdmFsKTsKKwl9CisKK2Vycm9yX3JldDoKKwltdXRleF91bmxvY2soJmluZGlvX2Rldi0+bWxvY2spOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QgYWRpczE2MjAxX3JlYWRfMTRiaXRfc2lnbmVkKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGlpb19kZXZfYXR0ciAqdGhpc19hdHRyID0gdG9faWlvX2Rldl9hdHRyKGF0dHIpOworCXMxNiB2YWwgPSAwOworCXNzaXplX3QgcmV0OworCisJbXV0ZXhfbG9jaygmaW5kaW9fZGV2LT5tbG9jayk7CisKKwlyZXQgPSBhZGlzMTYyMDFfc3BpX3JlYWRfcmVnXzE2KGRldiwgdGhpc19hdHRyLT5hZGRyZXNzLCAodTE2ICopJnZhbCk7CisJaWYgKCFyZXQpIHsKKwkJaWYgKHZhbCAmIEFESVMxNjIwMV9FUlJPUl9BQ1RJVkUpIHsKKwkJCXJldCA9IGFkaXMxNjIwMV9jaGVja19zdGF0dXMoZGV2KTsKKwkJCWlmIChyZXQpCisJCQkJZ290byBlcnJvcl9yZXQ7CisJCX0KKworCQl2YWwgPSAoKHMxNikodmFsIDw8IDIpID4+IDIpOworCQlyZXQgPSBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCB2YWwpOworCX0KKworZXJyb3JfcmV0OgorCW11dGV4X3VubG9jaygmaW5kaW9fZGV2LT5tbG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3NpemVfdCBhZGlzMTYyMDFfd3JpdGVfMTZiaXQoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgbGVuKQoreworCXN0cnVjdCBpaW9fZGV2X2F0dHIgKnRoaXNfYXR0ciA9IHRvX2lpb19kZXZfYXR0cihhdHRyKTsKKwlpbnQgcmV0OworCWxvbmcgdmFsOworCisJcmV0ID0gc3RyaWN0X3N0cnRvbChidWYsIDEwLCAmdmFsKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3JldDsKKwlyZXQgPSBhZGlzMTYyMDFfc3BpX3dyaXRlX3JlZ18xNihkZXYsIHRoaXNfYXR0ci0+YWRkcmVzcywgdmFsKTsKKworZXJyb3JfcmV0OgorCXJldHVybiByZXQgPyByZXQgOiBsZW47Cit9CisKK3N0YXRpYyBpbnQgYWRpczE2MjAxX3Jlc2V0KHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlpbnQgcmV0OworCXJldCA9IGFkaXMxNjIwMV9zcGlfd3JpdGVfcmVnXzgoZGV2LAorCQkJQURJUzE2MjAxX0dMT0JfQ01ELAorCQkJQURJUzE2MjAxX0dMT0JfQ01EX1NXX1JFU0VUKTsKKwlpZiAocmV0KQorCQlkZXZfZXJyKGRldiwgInByb2JsZW0gcmVzZXR0aW5nIGRldmljZSIpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QgYWRpczE2MjAxX3dyaXRlX3Jlc2V0KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbikKK3sKKwlpZiAobGVuIDwgMSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJc3dpdGNoIChidWZbMF0pIHsKKwljYXNlICcxJzoKKwljYXNlICd5JzoKKwljYXNlICdZJzoKKwkJcmV0dXJuIGFkaXMxNjIwMV9yZXNldChkZXYpOworCX0KKwlyZXR1cm4gLUVJTlZBTDsKK30KKworaW50IGFkaXMxNjIwMV9zZXRfaXJxKHN0cnVjdCBkZXZpY2UgKmRldiwgYm9vbCBlbmFibGUpCit7CisJaW50IHJldCA9IDA7CisJdTE2IG1zYzsKKworCXJldCA9IGFkaXMxNjIwMV9zcGlfcmVhZF9yZWdfMTYoZGV2LCBBRElTMTYyMDFfTVNDX0NUUkwsICZtc2MpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfcmV0OworCisJbXNjIHw9IEFESVMxNjIwMV9NU0NfQ1RSTF9BQ1RJVkVfSElHSDsKKwltc2MgJj0gfkFESVMxNjIwMV9NU0NfQ1RSTF9EQVRBX1JEWV9ESU8xOworCWlmIChlbmFibGUpCisJCW1zYyB8PSBBRElTMTYyMDFfTVNDX0NUUkxfREFUQV9SRFlfRU47CisJZWxzZQorCQltc2MgJj0gfkFESVMxNjIwMV9NU0NfQ1RSTF9EQVRBX1JEWV9FTjsKKworCXJldCA9IGFkaXMxNjIwMV9zcGlfd3JpdGVfcmVnXzE2KGRldiwgQURJUzE2MjAxX01TQ19DVFJMLCBtc2MpOworCitlcnJvcl9yZXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhZGlzMTYyMDFfY2hlY2tfc3RhdHVzKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwl1MTYgc3RhdHVzOworCWludCByZXQ7CisKKwlyZXQgPSBhZGlzMTYyMDFfc3BpX3JlYWRfcmVnXzE2KGRldiwgQURJUzE2MjAxX0RJQUdfU1RBVCwgJnN0YXR1cyk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycihkZXYsICJSZWFkaW5nIHN0YXR1cyBmYWlsZWRcbiIpOworCQlnb3RvIGVycm9yX3JldDsKKwl9CisJcmV0ID0gc3RhdHVzICYgMHhGOworCWlmIChyZXQpCisJCXJldCA9IC1FRkFVTFQ7CisKKwlpZiAoc3RhdHVzICYgQURJUzE2MjAxX0RJQUdfU1RBVF9TUElfRkFJTCkKKwkJZGV2X2VycihkZXYsICJTUEkgZmFpbHVyZVxuIik7CisJaWYgKHN0YXR1cyAmIEFESVMxNjIwMV9ESUFHX1NUQVRfRkxBU0hfVVBUKQorCQlkZXZfZXJyKGRldiwgIkZsYXNoIHVwZGF0ZSBmYWlsZWRcbiIpOworCWlmIChzdGF0dXMgJiBBRElTMTYyMDFfRElBR19TVEFUX1BPV0VSX0hJR0gpCisJCWRldl9lcnIoZGV2LCAiUG93ZXIgc3VwcGx5IGFib3ZlIDMuNjI1VlxuIik7CisJaWYgKHN0YXR1cyAmIEFESVMxNjIwMV9ESUFHX1NUQVRfUE9XRVJfTE9XKQorCQlkZXZfZXJyKGRldiwgIlBvd2VyIHN1cHBseSBiZWxvdyAzLjE1VlxuIik7CisKK2Vycm9yX3JldDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFkaXMxNjIwMV9zZWxmX3Rlc3Qoc3RydWN0IGRldmljZSAqZGV2KQoreworCWludCByZXQ7CisJcmV0ID0gYWRpczE2MjAxX3NwaV93cml0ZV9yZWdfMTYoZGV2LAorCQkJQURJUzE2MjAxX01TQ19DVFJMLAorCQkJQURJUzE2MjAxX01TQ19DVFJMX1NFTEZfVEVTVF9FTik7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKGRldiwgInByb2JsZW0gc3RhcnRpbmcgc2VsZiB0ZXN0Iik7CisJCWdvdG8gZXJyX3JldDsKKwl9CisKKwlyZXQgPSBhZGlzMTYyMDFfY2hlY2tfc3RhdHVzKGRldik7CisKK2Vycl9yZXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhZGlzMTYyMDFfaW5pdGlhbF9zZXR1cChzdHJ1Y3QgYWRpczE2MjAxX3N0YXRlICpzdCkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZzdC0+aW5kaW9fZGV2LT5kZXY7CisKKwkvKiBEaXNhYmxlIElSUSAqLworCXJldCA9IGFkaXMxNjIwMV9zZXRfaXJxKGRldiwgZmFsc2UpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihkZXYsICJkaXNhYmxlIGlycSBmYWlsZWQiKTsKKwkJZ290byBlcnJfcmV0OworCX0KKworCS8qIERvIHNlbGYgdGVzdCAqLworCXJldCA9IGFkaXMxNjIwMV9zZWxmX3Rlc3QoZGV2KTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoZGV2LCAic2VsZiB0ZXN0IGZhaWx1cmUiKTsKKwkJZ290byBlcnJfcmV0OworCX0KKworCS8qIFJlYWQgc3RhdHVzIHJlZ2lzdGVyIHRvIGNoZWNrIHRoZSByZXN1bHQgKi8KKwlyZXQgPSBhZGlzMTYyMDFfY2hlY2tfc3RhdHVzKGRldik7CisJaWYgKHJldCkgeworCQlhZGlzMTYyMDFfcmVzZXQoZGV2KTsKKwkJZGV2X2VycihkZXYsICJkZXZpY2Ugbm90IHBsYXlpbmcgYmFsbCAtPiByZXNldCIpOworCQltc2xlZXAoQURJUzE2MjAxX1NUQVJUVVBfREVMQVkpOworCQlyZXQgPSBhZGlzMTYyMDFfY2hlY2tfc3RhdHVzKGRldik7CisJCWlmIChyZXQpIHsKKwkJCWRldl9lcnIoZGV2LCAiZ2l2aW5nIHVwIik7CisJCQlnb3RvIGVycl9yZXQ7CisJCX0KKwl9CisKKwlwcmludGsoS0VSTl9JTkZPIERSSVZFUl9OQU1FICI6IGF0IENTJWQgKGlycSAlZClcbiIsCisJCQlzdC0+dXMtPmNoaXBfc2VsZWN0LCBzdC0+dXMtPmlycSk7CisKK2Vycl9yZXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIElJT19ERVZfQVRUUl9JTl9OQU1FRF9SQVcoMCwgc3VwcGx5LCBhZGlzMTYyMDFfcmVhZF8xMmJpdF91bnNpZ25lZCwKKwkJQURJUzE2MjAxX1NVUFBMWV9PVVQpOworc3RhdGljIElJT19DT05TVF9BVFRSKGluMF9zdXBwbHlfc2NhbGUsICIwLjAwMTIyIik7CitzdGF0aWMgSUlPX0RFVl9BVFRSX0lOX1JBVygxLCBhZGlzMTYyMDFfcmVhZF8xMmJpdF91bnNpZ25lZCwKKwkJQURJUzE2MjAxX0FVWF9BREMpOworc3RhdGljIElJT19DT05TVF9BVFRSKGluMV9zY2FsZSwgIjAuMDAwNjEiKTsKKworc3RhdGljIElJT19ERVZfQVRUUl9BQ0NFTF9YKGFkaXMxNjIwMV9yZWFkXzE0Yml0X3NpZ25lZCwKKwkJQURJUzE2MjAxX1hBQ0NMX09VVCk7CitzdGF0aWMgSUlPX0RFVl9BVFRSX0FDQ0VMX1koYWRpczE2MjAxX3JlYWRfMTRiaXRfc2lnbmVkLAorCQlBRElTMTYyMDFfWUFDQ0xfT1VUKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfQUNDRUxfWF9PRkZTRVQoU19JV1VTUiB8IFNfSVJVR08sCisJCWFkaXMxNjIwMV9yZWFkXzEyYml0X3NpZ25lZCwKKwkJYWRpczE2MjAxX3dyaXRlXzE2Yml0LAorCQlBRElTMTYyMDFfWEFDQ0xfT0ZGUyk7CitzdGF0aWMgSUlPX0RFVl9BVFRSX0FDQ0VMX1lfT0ZGU0VUKFNfSVdVU1IgfCBTX0lSVUdPLAorCQlhZGlzMTYyMDFfcmVhZF8xMmJpdF9zaWduZWQsCisJCWFkaXMxNjIwMV93cml0ZV8xNmJpdCwKKwkJQURJUzE2MjAxX1lBQ0NMX09GRlMpOworc3RhdGljIElJT19DT05TVF9BVFRSKGFjY2VsX3NjYWxlLCAiMC40NjI1Iik7CisKK3N0YXRpYyBJSU9fREVWX0FUVFJfSU5DTElfWChhZGlzMTYyMDFfcmVhZF8xNGJpdF9zaWduZWQsCisJCUFESVMxNjIwMV9YSU5DTF9PVVQpOworc3RhdGljIElJT19ERVZfQVRUUl9JTkNMSV9ZKGFkaXMxNjIwMV9yZWFkXzE0Yml0X3NpZ25lZCwKKwkJQURJUzE2MjAxX1lJTkNMX09VVCk7CitzdGF0aWMgSUlPX0RFVl9BVFRSX0lOQ0xJX1hfT0ZGU0VUKFNfSVdVU1IgfCBTX0lSVUdPLAorCQlhZGlzMTYyMDFfcmVhZF85Yml0X3NpZ25lZCwKKwkJYWRpczE2MjAxX3dyaXRlXzE2Yml0LAorCQlBRElTMTYyMDFfWEFDQ0xfT0ZGUyk7CitzdGF0aWMgSUlPX0RFVl9BVFRSX0lOQ0xJX1lfT0ZGU0VUKFNfSVdVU1IgfCBTX0lSVUdPLAorCQlhZGlzMTYyMDFfcmVhZF85Yml0X3NpZ25lZCwKKwkJYWRpczE2MjAxX3dyaXRlXzE2Yml0LAorCQlBRElTMTYyMDFfWUFDQ0xfT0ZGUyk7CitzdGF0aWMgSUlPX0NPTlNUX0FUVFIoaW5jbGlfc2NhbGUsICIwLjEiKTsKKworc3RhdGljIElJT19ERVZfQVRUUl9URU1QX1JBVyhhZGlzMTYyMDFfcmVhZF90ZW1wKTsKK3N0YXRpYyBJSU9fQ09OU1RfQVRUUih0ZW1wX29mZnNldCwgIjI1Iik7CitzdGF0aWMgSUlPX0NPTlNUX0FUVFIodGVtcF9zY2FsZSwgIi0wLjQ3Iik7CisKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIocmVzZXQsIFNfSVdVU1IsIE5VTEwsIGFkaXMxNjIwMV93cml0ZV9yZXNldCwgMCk7CisKK3N0YXRpYyBJSU9fQ09OU1RfQVRUUihuYW1lLCAiYWRpczE2MjAxIik7CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICphZGlzMTYyMDFfZXZlbnRfYXR0cmlidXRlc1tdID0geworCU5VTEwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGFkaXMxNjIwMV9ldmVudF9hdHRyaWJ1dGVfZ3JvdXAgPSB7CisJLmF0dHJzID0gYWRpczE2MjAxX2V2ZW50X2F0dHJpYnV0ZXMsCit9OworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqYWRpczE2MjAxX2F0dHJpYnV0ZXNbXSA9IHsKKwkmaWlvX2Rldl9hdHRyX2luMF9zdXBwbHlfcmF3LmRldl9hdHRyLmF0dHIsCisJJmlpb19jb25zdF9hdHRyX2luMF9zdXBwbHlfc2NhbGUuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX3RlbXBfcmF3LmRldl9hdHRyLmF0dHIsCisJJmlpb19jb25zdF9hdHRyX3RlbXBfb2Zmc2V0LmRldl9hdHRyLmF0dHIsCisJJmlpb19jb25zdF9hdHRyX3RlbXBfc2NhbGUuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX3Jlc2V0LmRldl9hdHRyLmF0dHIsCisJJmlpb19jb25zdF9hdHRyX25hbWUuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2luMV9yYXcuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2NvbnN0X2F0dHJfaW4xX3NjYWxlLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9hY2NlbF94X3Jhdy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfYWNjZWxfeV9yYXcuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2FjY2VsX3hfb2Zmc2V0LmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9hY2NlbF95X29mZnNldC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fY29uc3RfYXR0cl9hY2NlbF9zY2FsZS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfaW5jbGlfeF9yYXcuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2luY2xpX3lfcmF3LmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9pbmNsaV94X29mZnNldC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfaW5jbGlfeV9vZmZzZXQuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2NvbnN0X2F0dHJfaW5jbGlfc2NhbGUuZGV2X2F0dHIuYXR0ciwKKwlOVUxMCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBhZGlzMTYyMDFfYXR0cmlidXRlX2dyb3VwID0geworCS5hdHRycyA9IGFkaXMxNjIwMV9hdHRyaWJ1dGVzLAorfTsKKworc3RhdGljIGludCBfX2RldmluaXQgYWRpczE2MjAxX3Byb2JlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJaW50IHJldCwgcmVnZG9uZSA9IDA7CisJc3RydWN0IGFkaXMxNjIwMV9zdGF0ZSAqc3QgPSBremFsbG9jKHNpemVvZiAqc3QsIEdGUF9LRVJORUwpOworCWlmICghc3QpIHsKKwkJcmV0ID0gIC1FTk9NRU07CisJCWdvdG8gZXJyb3JfcmV0OworCX0KKwkvKiB0aGlzIGlzIG9ubHkgdXNlZCBmb3IgcmVtb3ZhbCBwdXJwb3NlcyAqLworCXNwaV9zZXRfZHJ2ZGF0YShzcGksIHN0KTsKKworCS8qIEFsbG9jYXRlIHRoZSBjb21tcyBidWZmZXJzICovCisJc3QtPnJ4ID0ga3phbGxvYyhzaXplb2YoKnN0LT5yeCkqQURJUzE2MjAxX01BWF9SWCwgR0ZQX0tFUk5FTCk7CisJaWYgKHN0LT5yeCA9PSBOVUxMKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3JfZnJlZV9zdDsKKwl9CisJc3QtPnR4ID0ga3phbGxvYyhzaXplb2YoKnN0LT50eCkqQURJUzE2MjAxX01BWF9UWCwgR0ZQX0tFUk5FTCk7CisJaWYgKHN0LT50eCA9PSBOVUxMKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3JfZnJlZV9yeDsKKwl9CisJc3QtPnVzID0gc3BpOworCW11dGV4X2luaXQoJnN0LT5idWZfbG9jayk7CisJLyogc2V0dXAgdGhlIGluZHVzdHJpYWxpbyBkcml2ZXIgYWxsb2NhdGVkIGVsZW1lbnRzICovCisJc3QtPmluZGlvX2RldiA9IGlpb19hbGxvY2F0ZV9kZXZpY2UoKTsKKwlpZiAoc3QtPmluZGlvX2RldiA9PSBOVUxMKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3JfZnJlZV90eDsKKwl9CisKKwlzdC0+aW5kaW9fZGV2LT5kZXYucGFyZW50ID0gJnNwaS0+ZGV2OworCXN0LT5pbmRpb19kZXYtPm51bV9pbnRlcnJ1cHRfbGluZXMgPSAxOworCXN0LT5pbmRpb19kZXYtPmV2ZW50X2F0dHJzID0gJmFkaXMxNjIwMV9ldmVudF9hdHRyaWJ1dGVfZ3JvdXA7CisJc3QtPmluZGlvX2Rldi0+YXR0cnMgPSAmYWRpczE2MjAxX2F0dHJpYnV0ZV9ncm91cDsKKwlzdC0+aW5kaW9fZGV2LT5kZXZfZGF0YSA9ICh2b2lkICopKHN0KTsKKwlzdC0+aW5kaW9fZGV2LT5kcml2ZXJfbW9kdWxlID0gVEhJU19NT0RVTEU7CisJc3QtPmluZGlvX2Rldi0+bW9kZXMgPSBJTkRJT19ESVJFQ1RfTU9ERTsKKworCXJldCA9IGFkaXMxNjIwMV9jb25maWd1cmVfcmluZyhzdC0+aW5kaW9fZGV2KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX2ZyZWVfZGV2OworCisJcmV0ID0gaWlvX2RldmljZV9yZWdpc3RlcihzdC0+aW5kaW9fZGV2KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3VucmVnX3JpbmdfZnVuY3M7CisJcmVnZG9uZSA9IDE7CisKKwlyZXQgPSBhZGlzMTYyMDFfaW5pdGlhbGl6ZV9yaW5nKHN0LT5pbmRpb19kZXYtPnJpbmcpOworCWlmIChyZXQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJmYWlsZWQgdG8gaW5pdGlhbGl6ZSB0aGUgcmluZ1xuIik7CisJCWdvdG8gZXJyb3JfdW5yZWdfcmluZ19mdW5jczsKKwl9CisKKwlpZiAoc3BpLT5pcnEpIHsKKwkJcmV0ID0gaWlvX3JlZ2lzdGVyX2ludGVycnVwdF9saW5lKHNwaS0+aXJxLAorCQkJCXN0LT5pbmRpb19kZXYsCisJCQkJMCwKKwkJCQlJUlFGX1RSSUdHRVJfUklTSU5HLAorCQkJCSJhZGlzMTYyMDEiKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJyb3JfdW5pbml0aWFsaXplX3Jpbmc7CisKKwkJcmV0ID0gYWRpczE2MjAxX3Byb2JlX3RyaWdnZXIoc3QtPmluZGlvX2Rldik7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycm9yX3VucmVnaXN0ZXJfbGluZTsKKwl9CisKKwkvKiBHZXQgdGhlIGRldmljZSBpbnRvIGEgc2FuZSBpbml0aWFsIHN0YXRlICovCisJcmV0ID0gYWRpczE2MjAxX2luaXRpYWxfc2V0dXAoc3QpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfcmVtb3ZlX3RyaWdnZXI7CisJcmV0dXJuIDA7CisKK2Vycm9yX3JlbW92ZV90cmlnZ2VyOgorCWFkaXMxNjIwMV9yZW1vdmVfdHJpZ2dlcihzdC0+aW5kaW9fZGV2KTsKK2Vycm9yX3VucmVnaXN0ZXJfbGluZToKKwlpZiAoc3BpLT5pcnEpCisJCWlpb191bnJlZ2lzdGVyX2ludGVycnVwdF9saW5lKHN0LT5pbmRpb19kZXYsIDApOworZXJyb3JfdW5pbml0aWFsaXplX3Jpbmc6CisJYWRpczE2MjAxX3VuaW5pdGlhbGl6ZV9yaW5nKHN0LT5pbmRpb19kZXYtPnJpbmcpOworZXJyb3JfdW5yZWdfcmluZ19mdW5jczoKKwlhZGlzMTYyMDFfdW5jb25maWd1cmVfcmluZyhzdC0+aW5kaW9fZGV2KTsKK2Vycm9yX2ZyZWVfZGV2OgorCWlmIChyZWdkb25lKQorCQlpaW9fZGV2aWNlX3VucmVnaXN0ZXIoc3QtPmluZGlvX2Rldik7CisJZWxzZQorCQlpaW9fZnJlZV9kZXZpY2Uoc3QtPmluZGlvX2Rldik7CitlcnJvcl9mcmVlX3R4OgorCWtmcmVlKHN0LT50eCk7CitlcnJvcl9mcmVlX3J4OgorCWtmcmVlKHN0LT5yeCk7CitlcnJvcl9mcmVlX3N0OgorCWtmcmVlKHN0KTsKK2Vycm9yX3JldDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFkaXMxNjIwMV9yZW1vdmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlzdHJ1Y3QgYWRpczE2MjAxX3N0YXRlICpzdCA9IHNwaV9nZXRfZHJ2ZGF0YShzcGkpOworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBzdC0+aW5kaW9fZGV2OworCisJZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKKworCWFkaXMxNjIwMV9yZW1vdmVfdHJpZ2dlcihpbmRpb19kZXYpOworCWlmIChzcGktPmlycSkKKwkJaWlvX3VucmVnaXN0ZXJfaW50ZXJydXB0X2xpbmUoaW5kaW9fZGV2LCAwKTsKKworCWFkaXMxNjIwMV91bmluaXRpYWxpemVfcmluZyhpbmRpb19kZXYtPnJpbmcpOworCWlpb19kZXZpY2VfdW5yZWdpc3RlcihpbmRpb19kZXYpOworCWFkaXMxNjIwMV91bmNvbmZpZ3VyZV9yaW5nKGluZGlvX2Rldik7CisJa2ZyZWUoc3QtPnR4KTsKKwlrZnJlZShzdC0+cngpOworCWtmcmVlKHN0KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNwaV9kcml2ZXIgYWRpczE2MjAxX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJhZGlzMTYyMDEiLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwl9LAorCS5wcm9iZSA9IGFkaXMxNjIwMV9wcm9iZSwKKwkucmVtb3ZlID0gX19kZXZleGl0X3AoYWRpczE2MjAxX3JlbW92ZSksCit9OworCitzdGF0aWMgX19pbml0IGludCBhZGlzMTYyMDFfaW5pdCh2b2lkKQoreworCXJldHVybiBzcGlfcmVnaXN0ZXJfZHJpdmVyKCZhZGlzMTYyMDFfZHJpdmVyKTsKK30KK21vZHVsZV9pbml0KGFkaXMxNjIwMV9pbml0KTsKKworc3RhdGljIF9fZXhpdCB2b2lkIGFkaXMxNjIwMV9leGl0KHZvaWQpCit7CisJc3BpX3VucmVnaXN0ZXJfZHJpdmVyKCZhZGlzMTYyMDFfZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KGFkaXMxNjIwMV9leGl0KTsKKworTU9EVUxFX0FVVEhPUigiQmFycnkgU29uZyA8MjFjbmJhb0BnbWFpbC5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkFuYWxvZyBEZXZpY2VzIEFESVMxNjIwMSBQcm9ncmFtbWFibGUgRGlnaXRhbCBWaWJyYXRpb24gU2Vuc29yIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyMDFfcmluZy5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyMDFfcmluZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2ODcwYTIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FkaXMxNjIwMV9yaW5nLmMKQEAgLTAsMCArMSwyMTggQEAKKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorCisjaW5jbHVkZSAiLi4vaWlvLmgiCisjaW5jbHVkZSAiLi4vc3lzZnMuaCIKKyNpbmNsdWRlICIuLi9yaW5nX3N3LmgiCisjaW5jbHVkZSAiYWNjZWwuaCIKKyNpbmNsdWRlICIuLi90cmlnZ2VyLmgiCisjaW5jbHVkZSAiYWRpczE2MjAxLmgiCisKK3N0YXRpYyBJSU9fU0NBTl9FTF9DKGluX3N1cHBseSwgQURJUzE2MjAxX1NDQU5fU1VQUExZLCBBRElTMTYyMDFfU1VQUExZX09VVCwgTlVMTCk7CitzdGF0aWMgSUlPX0NPTlNUX0FUVFJfU0NBTl9FTF9UWVBFKGluX3N1cHBseSwgdSwgMTIsIDE2KTsKK3N0YXRpYyBJSU9fU0NBTl9FTF9DKGFjY2VsX3gsIEFESVMxNjIwMV9TQ0FOX0FDQ19YLCBBRElTMTYyMDFfWEFDQ0xfT1VULCBOVUxMKTsKK3N0YXRpYyBJSU9fU0NBTl9FTF9DKGFjY2VsX3ksIEFESVMxNjIwMV9TQ0FOX0FDQ19ZLCBBRElTMTYyMDFfWUFDQ0xfT1VULCBOVUxMKTsKK3N0YXRpYyBJSU9fQ09OU1RfQVRUUl9TQ0FOX0VMX1RZUEUoYWNjZWwsIHMsIDE0LCAxNik7CitzdGF0aWMgSUlPX1NDQU5fRUxfQyhpbjAsIEFESVMxNjIwMV9TQ0FOX0FVWF9BREMsIEFESVMxNjIwMV9BVVhfQURDLCBOVUxMKTsKK3N0YXRpYyBJSU9fQ09OU1RfQVRUUl9TQ0FOX0VMX1RZUEUoaW4wLCB1LCAxMiwgMTYpOworc3RhdGljIElJT19TQ0FOX0VMX0ModGVtcCwgQURJUzE2MjAxX1NDQU5fVEVNUCwgQURJUzE2MjAxX1RFTVBfT1VULCBOVUxMKTsKK3N0YXRpYyBJSU9fQ09OU1RfQVRUUl9TQ0FOX0VMX1RZUEUodGVtcCwgdSwgMTIsIDE2KTsKK3N0YXRpYyBJSU9fU0NBTl9FTF9DKGluY2xpX3gsIEFESVMxNjIwMV9TQ0FOX0lOQ0xJX1gsCisJCSAgICAgQURJUzE2MjAxX1hJTkNMX09VVCwgTlVMTCk7CitzdGF0aWMgSUlPX1NDQU5fRUxfQyhpbmNsaV95LCBBRElTMTYyMDFfU0NBTl9JTkNMSV9ZLAorCQkgICAgIEFESVMxNjIwMV9ZSU5DTF9PVVQsIE5VTEwpOworc3RhdGljIElJT19DT05TVF9BVFRSX1NDQU5fRUxfVFlQRShpbmNsaSwgcywgMTQsIDE2KTsKK3N0YXRpYyBJSU9fU0NBTl9FTF9USU1FU1RBTVAoNyk7CitzdGF0aWMgSUlPX0NPTlNUX0FUVFJfU0NBTl9FTF9UWVBFKHRpbWVzdGFtcCwgcywgNjQsIDY0KTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmFkaXMxNjIwMV9zY2FuX2VsX2F0dHJzW10gPSB7CisJJmlpb19zY2FuX2VsX2luX3N1cHBseS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fY29uc3RfYXR0cl9pbl9zdXBwbHlfaW5kZXguZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2NvbnN0X2F0dHJfaW5fc3VwcGx5X3R5cGUuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX3NjYW5fZWxfYWNjZWxfeC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fY29uc3RfYXR0cl9hY2NlbF94X2luZGV4LmRldl9hdHRyLmF0dHIsCisJJmlpb19zY2FuX2VsX2FjY2VsX3kuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2NvbnN0X2F0dHJfYWNjZWxfeV9pbmRleC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fY29uc3RfYXR0cl9hY2NlbF90eXBlLmRldl9hdHRyLmF0dHIsCisJJmlpb19zY2FuX2VsX2luMC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fY29uc3RfYXR0cl9pbjBfaW5kZXguZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2NvbnN0X2F0dHJfaW4wX3R5cGUuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX3NjYW5fZWxfdGVtcC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fY29uc3RfYXR0cl90ZW1wX2luZGV4LmRldl9hdHRyLmF0dHIsCisJJmlpb19jb25zdF9hdHRyX3RlbXBfdHlwZS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fc2Nhbl9lbF9pbmNsaV94LmRldl9hdHRyLmF0dHIsCisJJmlpb19jb25zdF9hdHRyX2luY2xpX3hfaW5kZXguZGV2X2F0dHIuYXR0ciwKKwkmaWlvX3NjYW5fZWxfaW5jbGlfeS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fY29uc3RfYXR0cl9pbmNsaV95X2luZGV4LmRldl9hdHRyLmF0dHIsCisJJmlpb19jb25zdF9hdHRyX2luY2xpX3R5cGUuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX3NjYW5fZWxfdGltZXN0YW1wLmRldl9hdHRyLmF0dHIsCisJJmlpb19jb25zdF9hdHRyX3RpbWVzdGFtcF9pbmRleC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fY29uc3RfYXR0cl90aW1lc3RhbXBfdHlwZS5kZXZfYXR0ci5hdHRyLAorCU5VTEwsCit9OworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBhZGlzMTYyMDFfc2Nhbl9lbF9ncm91cCA9IHsKKwkuYXR0cnMgPSBhZGlzMTYyMDFfc2Nhbl9lbF9hdHRycywKKwkubmFtZSA9ICJzY2FuX2VsZW1lbnRzIiwKK307CisKKy8qKgorICogYWRpczE2MjAxX3BvbGxfZnVuY190aCgpIHRvcCBoYWxmIGludGVycnVwdCBoYW5kbGVyIGNhbGxlZCBieSB0cmlnZ2VyCisgKiBAcHJpdmF0ZV9kYXRhOglpaW9fZGV2CisgKiovCitzdGF0aWMgdm9pZCBhZGlzMTYyMDFfcG9sbF9mdW5jX3RoKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsIHM2NCB0aW1lKQoreworCXN0cnVjdCBhZGlzMTYyMDFfc3RhdGUgKnN0ID0gaWlvX2Rldl9nZXRfZGV2ZGF0YShpbmRpb19kZXYpOworCXN0LT5sYXN0X3RpbWVzdGFtcCA9IHRpbWU7CisJc2NoZWR1bGVfd29yaygmc3QtPndvcmtfdHJpZ2dlcl90b19yaW5nKTsKK30KKworLyoqCisgKiBhZGlzMTYyMDFfcmVhZF9yaW5nX2RhdGEoKSByZWFkIGRhdGEgcmVnaXN0ZXJzIHdoaWNoIHdpbGwgYmUgcGxhY2VkIGludG8gcmluZworICogQGRldjogZGV2aWNlIGFzc29jaWF0ZWQgd2l0aCBjaGlsZCBvZiBhY3R1YWwgZGV2aWNlIChpaW9fZGV2IG9yIGlpb190cmlnKQorICogQHJ4OiBzb21ld2hlcmUgdG8gcGFzcyBiYWNrIHRoZSB2YWx1ZSByZWFkCisgKiovCitzdGF0aWMgaW50IGFkaXMxNjIwMV9yZWFkX3JpbmdfZGF0YShzdHJ1Y3QgZGV2aWNlICpkZXYsIHU4ICpyeCkKK3sKKwlzdHJ1Y3Qgc3BpX21lc3NhZ2UgbXNnOworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWRpczE2MjAxX3N0YXRlICpzdCA9IGlpb19kZXZfZ2V0X2RldmRhdGEoaW5kaW9fZGV2KTsKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyIHhmZXJzW0FESVMxNjIwMV9PVVRQVVRTICsgMV07CisJaW50IHJldDsKKwlpbnQgaTsKKworCW11dGV4X2xvY2soJnN0LT5idWZfbG9jayk7CisKKwlzcGlfbWVzc2FnZV9pbml0KCZtc2cpOworCisJbWVtc2V0KHhmZXJzLCAwLCBzaXplb2YoeGZlcnMpKTsKKwlmb3IgKGkgPSAwOyBpIDw9IEFESVMxNjIwMV9PVVRQVVRTOyBpKyspIHsKKwkJeGZlcnNbaV0uYml0c19wZXJfd29yZCA9IDg7CisJCXhmZXJzW2ldLmNzX2NoYW5nZSA9IDE7CisJCXhmZXJzW2ldLmxlbiA9IDI7CisJCXhmZXJzW2ldLmRlbGF5X3VzZWNzID0gMjA7CisJCXhmZXJzW2ldLnR4X2J1ZiA9IHN0LT50eCArIDIgKiBpOworCQlzdC0+dHhbMiAqIGldID0gQURJUzE2MjAxX1JFQURfUkVHKEFESVMxNjIwMV9TVVBQTFlfT1VUICsgMiAqIGkpOworCQlzdC0+dHhbMiAqIGkgKyAxXSA9IDA7CisJCWlmIChpID49IDEpCisJCQl4ZmVyc1tpXS5yeF9idWYgPSByeCArIDIgKiAoaSAtIDEpOworCQlzcGlfbWVzc2FnZV9hZGRfdGFpbCgmeGZlcnNbaV0sICZtc2cpOworCX0KKworCXJldCA9IHNwaV9zeW5jKHN0LT51cywgJm1zZyk7CisJaWYgKHJldCkKKwkJZGV2X2Vycigmc3QtPnVzLT5kZXYsICJwcm9ibGVtIHdoZW4gYnVyc3QgcmVhZGluZyIpOworCisJbXV0ZXhfdW5sb2NrKCZzdC0+YnVmX2xvY2spOworCisJcmV0dXJuIHJldDsKK30KKworLyogV2hpbHN0IHRoaXMgbWFrZXMgYSBsb3Qgb2YgY2FsbHMgdG8gaWlvX3N3X3JpbmcgZnVuY3Rpb25zIC0gaXQgaXMgdG8gZGV2aWNlCisgKiBzcGVjaWZpYyB0byBiZSByb2xsZWQgaW50byB0aGUgY29yZS4KKyAqLworc3RhdGljIHZvaWQgYWRpczE2MjAxX3RyaWdnZXJfYmhfdG9fcmluZyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmtfcykKK3sKKwlzdHJ1Y3QgYWRpczE2MjAxX3N0YXRlICpzdAorCQk9IGNvbnRhaW5lcl9vZih3b3JrX3MsIHN0cnVjdCBhZGlzMTYyMDFfc3RhdGUsCisJCQkgICAgICAgd29ya190cmlnZ2VyX3RvX3JpbmcpOworCXN0cnVjdCBpaW9fcmluZ19idWZmZXIgKnJpbmcgPSBzdC0+aW5kaW9fZGV2LT5yaW5nOworCisJaW50IGkgPSAwOworCXMxNiAqZGF0YTsKKwlzaXplX3QgZGF0YXNpemUgPSByaW5nLT5hY2Nlc3MuZ2V0X2J5dGVzX3Blcl9kYXR1bShyaW5nKTsKKworCWRhdGEgPSBrbWFsbG9jKGRhdGFzaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAoZGF0YSA9PSBOVUxMKSB7CisJCWRldl9lcnIoJnN0LT51cy0+ZGV2LCAibWVtb3J5IGFsbG9jIGZhaWxlZCBpbiByaW5nIGJoIik7CisJCXJldHVybjsKKwl9CisKKwlpZiAocmluZy0+c2Nhbl9jb3VudCkKKwkJaWYgKGFkaXMxNjIwMV9yZWFkX3JpbmdfZGF0YSgmc3QtPmluZGlvX2Rldi0+ZGV2LCBzdC0+cngpID49IDApCisJCQlmb3IgKDsgaSA8IHJpbmctPnNjYW5fY291bnQ7IGkrKykKKwkJCQlkYXRhW2ldID0gYmUxNl90b19jcHVwKAorCQkJCQkoX19iZTE2ICopJihzdC0+cnhbaSoyXSkpOworCisJLyogR3VhcmFudGVlZCB0byBiZSBhbGlnbmVkIHdpdGggOCBieXRlIGJvdW5kYXJ5ICovCisJaWYgKHJpbmctPnNjYW5fdGltZXN0YW1wKQorCQkqKChzNjQgKikoZGF0YSArICgoaSArIDMpLzQpKjQpKSA9IHN0LT5sYXN0X3RpbWVzdGFtcDsKKworCXJpbmctPmFjY2Vzcy5zdG9yZV90byhyaW5nLAorCQkJICAgICAgKHU4ICopZGF0YSwKKwkJCSAgICAgIHN0LT5sYXN0X3RpbWVzdGFtcCk7CisKKwlpaW9fdHJpZ2dlcl9ub3RpZnlfZG9uZShzdC0+aW5kaW9fZGV2LT50cmlnKTsKKwlrZnJlZShkYXRhKTsKKworCXJldHVybjsKK30KKwordm9pZCBhZGlzMTYyMDFfdW5jb25maWd1cmVfcmluZyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQoreworCWtmcmVlKGluZGlvX2Rldi0+cG9sbGZ1bmMpOworCWlpb19zd19yYl9mcmVlKGluZGlvX2Rldi0+cmluZyk7Cit9CisKK2ludCBhZGlzMTYyMDFfY29uZmlndXJlX3Jpbmcoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgYWRpczE2MjAxX3N0YXRlICpzdCA9IGluZGlvX2Rldi0+ZGV2X2RhdGE7CisJc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqcmluZzsKKwlJTklUX1dPUksoJnN0LT53b3JrX3RyaWdnZXJfdG9fcmluZywgYWRpczE2MjAxX3RyaWdnZXJfYmhfdG9fcmluZyk7CisKKwlyaW5nID0gaWlvX3N3X3JiX2FsbG9jYXRlKGluZGlvX2Rldik7CisJaWYgKCFyaW5nKSB7CisJCXJldCA9IC1FTk9NRU07CisJCXJldHVybiByZXQ7CisJfQorCWluZGlvX2Rldi0+cmluZyA9IHJpbmc7CisJLyogRWZmZWN0aXZlbHkgc2VsZWN0IHRoZSByaW5nIGJ1ZmZlciBpbXBsZW1lbnRhdGlvbiAqLworCWlpb19yaW5nX3N3X3JlZ2lzdGVyX2Z1bmNzKCZyaW5nLT5hY2Nlc3MpOworCXJpbmctPmJwZSA9IDI7CisJcmluZy0+c2Nhbl9lbF9hdHRycyA9ICZhZGlzMTYyMDFfc2Nhbl9lbF9ncm91cDsKKwlyaW5nLT5zY2FuX3RpbWVzdGFtcCA9IHRydWU7CisJcmluZy0+cHJlZW5hYmxlID0gJmlpb19zd19yaW5nX3ByZWVuYWJsZTsKKwlyaW5nLT5wb3N0ZW5hYmxlID0gJmlpb190cmlnZ2VyZWRfcmluZ19wb3N0ZW5hYmxlOworCXJpbmctPnByZWRpc2FibGUgPSAmaWlvX3RyaWdnZXJlZF9yaW5nX3ByZWRpc2FibGU7CisJcmluZy0+b3duZXIgPSBUSElTX01PRFVMRTsKKworCS8qIFNldCBkZWZhdWx0IHNjYW4gbW9kZSAqLworCWlpb19zY2FuX21hc2tfc2V0KHJpbmcsIGlpb19zY2FuX2VsX2luX3N1cHBseS5udW1iZXIpOworCWlpb19zY2FuX21hc2tfc2V0KHJpbmcsIGlpb19zY2FuX2VsX2FjY2VsX3gubnVtYmVyKTsKKwlpaW9fc2Nhbl9tYXNrX3NldChyaW5nLCBpaW9fc2Nhbl9lbF9hY2NlbF95Lm51bWJlcik7CisJaWlvX3NjYW5fbWFza19zZXQocmluZywgaWlvX3NjYW5fZWxfdGVtcC5udW1iZXIpOworCWlpb19zY2FuX21hc2tfc2V0KHJpbmcsIGlpb19zY2FuX2VsX2luMC5udW1iZXIpOworCWlpb19zY2FuX21hc2tfc2V0KHJpbmcsIGlpb19zY2FuX2VsX2luY2xpX3gubnVtYmVyKTsKKwlpaW9fc2Nhbl9tYXNrX3NldChyaW5nLCBpaW9fc2Nhbl9lbF9pbmNsaV95Lm51bWJlcik7CisKKwlyZXQgPSBpaW9fYWxsb2NfcG9sbGZ1bmMoaW5kaW9fZGV2LCBOVUxMLCAmYWRpczE2MjAxX3BvbGxfZnVuY190aCk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9paW9fc3dfcmJfZnJlZTsKKworCWluZGlvX2Rldi0+bW9kZXMgfD0gSU5ESU9fUklOR19UUklHR0VSRUQ7CisJcmV0dXJuIDA7CisKK2Vycm9yX2lpb19zd19yYl9mcmVlOgorCWlpb19zd19yYl9mcmVlKGluZGlvX2Rldi0+cmluZyk7CisJcmV0dXJuIHJldDsKK30KKworaW50IGFkaXMxNjIwMV9pbml0aWFsaXplX3Jpbmcoc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqcmluZykKK3sKKwlyZXR1cm4gaWlvX3JpbmdfYnVmZmVyX3JlZ2lzdGVyKHJpbmcsIDApOworfQorCit2b2lkIGFkaXMxNjIwMV91bmluaXRpYWxpemVfcmluZyhzdHJ1Y3QgaWlvX3JpbmdfYnVmZmVyICpyaW5nKQoreworCWlpb19yaW5nX2J1ZmZlcl91bnJlZ2lzdGVyKHJpbmcpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyMDFfdHJpZ2dlci5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyMDFfdHJpZ2dlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhOWNlYTE5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyMDFfdHJpZ2dlci5jCkBAIC0wLDAgKzEsMTIyIEBACisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNmcy5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CisKKyNpbmNsdWRlICIuLi9paW8uaCIKKyNpbmNsdWRlICIuLi9zeXNmcy5oIgorI2luY2x1ZGUgIi4uL3RyaWdnZXIuaCIKKyNpbmNsdWRlICJhZGlzMTYyMDEuaCIKKworLyoqCisgKiBhZGlzMTYyMDFfZGF0YV9yZHlfdHJpZ19wb2xsKCkgdGhlIGV2ZW50IGhhbmRsZXIgZm9yIHRoZSBkYXRhIHJkeSB0cmlnCisgKiovCitzdGF0aWMgaW50IGFkaXMxNjIwMV9kYXRhX3JkeV90cmlnX3BvbGwoc3RydWN0IGlpb19kZXYgKmRldl9pbmZvLAorCQkJCSAgICAgICBpbnQgaW5kZXgsCisJCQkJICAgICAgIHM2NCB0aW1lc3RhbXAsCisJCQkJICAgICAgIGludCBub190ZXN0KQoreworCXN0cnVjdCBhZGlzMTYyMDFfc3RhdGUgKnN0ID0gaWlvX2Rldl9nZXRfZGV2ZGF0YShkZXZfaW5mbyk7CisJc3RydWN0IGlpb190cmlnZ2VyICp0cmlnID0gc3QtPnRyaWc7CisKKwlpaW9fdHJpZ2dlcl9wb2xsKHRyaWcsIHRpbWVzdGFtcCk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK0lJT19FVkVOVF9TSChkYXRhX3JkeV90cmlnLCAmYWRpczE2MjAxX2RhdGFfcmR5X3RyaWdfcG9sbCk7CisKK3N0YXRpYyBERVZJQ0VfQVRUUihuYW1lLCBTX0lSVUdPLCBpaW9fdHJpZ2dlcl9yZWFkX25hbWUsIE5VTEwpOworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqYWRpczE2MjAxX3RyaWdnZXJfYXR0cnNbXSA9IHsKKwkmZGV2X2F0dHJfbmFtZS5hdHRyLAorCU5VTEwsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBhZGlzMTYyMDFfdHJpZ2dlcl9hdHRyX2dyb3VwID0geworCS5hdHRycyA9IGFkaXMxNjIwMV90cmlnZ2VyX2F0dHJzLAorfTsKKworLyoqCisgKiBhZGlzMTYyMDFfZGF0YV9yZHlfdHJpZ2dlcl9zZXRfc3RhdGUoKSBzZXQgZGF0YXJkeSBpbnRlcnJ1cHQgc3RhdGUKKyAqKi8KK3N0YXRpYyBpbnQgYWRpczE2MjAxX2RhdGFfcmR5X3RyaWdnZXJfc2V0X3N0YXRlKHN0cnVjdCBpaW9fdHJpZ2dlciAqdHJpZywKKwkJCQkJCWJvb2wgc3RhdGUpCit7CisJc3RydWN0IGFkaXMxNjIwMV9zdGF0ZSAqc3QgPSB0cmlnLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IHN0LT5pbmRpb19kZXY7CisJaW50IHJldCA9IDA7CisKKwlkZXZfZGJnKCZpbmRpb19kZXYtPmRldiwgIiVzICglZClcbiIsIF9fZnVuY19fLCBzdGF0ZSk7CisJcmV0ID0gYWRpczE2MjAxX3NldF9pcnEoJnN0LT5pbmRpb19kZXYtPmRldiwgc3RhdGUpOworCWlmIChzdGF0ZSA9PSBmYWxzZSkgeworCQlpaW9fcmVtb3ZlX2V2ZW50X2Zyb21fbGlzdCgmaWlvX2V2ZW50X2RhdGFfcmR5X3RyaWcsCisJCQkJCSAgICZpbmRpb19kZXYtPmludGVycnVwdHNbMF0KKwkJCQkJICAgLT5ldl9saXN0KTsKKwkJZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKKwl9IGVsc2UgeworCQlpaW9fYWRkX2V2ZW50X3RvX2xpc3QoJmlpb19ldmVudF9kYXRhX3JkeV90cmlnLAorCQkJCSAgICAgICZpbmRpb19kZXYtPmludGVycnVwdHNbMF0tPmV2X2xpc3QpOworCX0KKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIGFkaXMxNjIwMV90cmlnX3RyeV9yZWVuKCkgdHJ5IHJlbmFibGluZyBpcnEgZm9yIGRhdGEgcmR5IHRyaWdnZXIKKyAqIEB0cmlnOgl0aGUgZGF0YXJkeSB0cmlnZ2VyCisgKiovCitzdGF0aWMgaW50IGFkaXMxNjIwMV90cmlnX3RyeV9yZWVuKHN0cnVjdCBpaW9fdHJpZ2dlciAqdHJpZykKK3sKKwlzdHJ1Y3QgYWRpczE2MjAxX3N0YXRlICpzdCA9IHRyaWctPnByaXZhdGVfZGF0YTsKKwllbmFibGVfaXJxKHN0LT51cy0+aXJxKTsKKwlyZXR1cm4gMDsKK30KKworaW50IGFkaXMxNjIwMV9wcm9iZV90cmlnZ2VyKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgYWRpczE2MjAxX3N0YXRlICpzdCA9IGluZGlvX2Rldi0+ZGV2X2RhdGE7CisKKwlzdC0+dHJpZyA9IGlpb19hbGxvY2F0ZV90cmlnZ2VyKCk7CisJc3QtPnRyaWctPm5hbWUgPSBrYXNwcmludGYoR0ZQX0tFUk5FTCwKKwkJCQkiYWRpczE2MjAxLWRldiVkIiwKKwkJCQlpbmRpb19kZXYtPmlkKTsKKwlpZiAoIXN0LT50cmlnLT5uYW1lKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3JfZnJlZV90cmlnOworCX0KKwlzdC0+dHJpZy0+ZGV2LnBhcmVudCA9ICZzdC0+dXMtPmRldjsKKwlzdC0+dHJpZy0+b3duZXIgPSBUSElTX01PRFVMRTsKKwlzdC0+dHJpZy0+cHJpdmF0ZV9kYXRhID0gc3Q7CisJc3QtPnRyaWctPnNldF90cmlnZ2VyX3N0YXRlID0gJmFkaXMxNjIwMV9kYXRhX3JkeV90cmlnZ2VyX3NldF9zdGF0ZTsKKwlzdC0+dHJpZy0+dHJ5X3JlZW5hYmxlID0gJmFkaXMxNjIwMV90cmlnX3RyeV9yZWVuOworCXN0LT50cmlnLT5jb250cm9sX2F0dHJzID0gJmFkaXMxNjIwMV90cmlnZ2VyX2F0dHJfZ3JvdXA7CisJcmV0ID0gaWlvX3RyaWdnZXJfcmVnaXN0ZXIoc3QtPnRyaWcpOworCisJLyogc2VsZWN0IGRlZmF1bHQgdHJpZ2dlciAqLworCWluZGlvX2Rldi0+dHJpZyA9IHN0LT50cmlnOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfZnJlZV90cmlnX25hbWU7CisKKwlyZXR1cm4gMDsKKworZXJyb3JfZnJlZV90cmlnX25hbWU6CisJa2ZyZWUoc3QtPnRyaWctPm5hbWUpOworZXJyb3JfZnJlZV90cmlnOgorCWlpb19mcmVlX3RyaWdnZXIoc3QtPnRyaWcpOworCisJcmV0dXJuIHJldDsKK30KKwordm9pZCBhZGlzMTYyMDFfcmVtb3ZlX3RyaWdnZXIoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKK3sKKwlzdHJ1Y3QgYWRpczE2MjAxX3N0YXRlICpzdGF0ZSA9IGluZGlvX2Rldi0+ZGV2X2RhdGE7CisKKwlpaW9fdHJpZ2dlcl91bnJlZ2lzdGVyKHN0YXRlLT50cmlnKTsKKwlrZnJlZShzdGF0ZS0+dHJpZy0+bmFtZSk7CisJaWlvX2ZyZWVfdHJpZ2dlcihzdGF0ZS0+dHJpZyk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FkaXMxNjIwMy5oIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyMDMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzkzMjNlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyMDMuaApAQCAtMCwwICsxLDE0MyBAQAorI2lmbmRlZiBTUElfQURJUzE2MjAzX0hfCisjZGVmaW5lIFNQSV9BRElTMTYyMDNfSF8KKworI2RlZmluZSBBRElTMTYyMDNfU1RBUlRVUF9ERUxBWQkyMjAgLyogbXMgKi8KKworI2RlZmluZSBBRElTMTYyMDNfUkVBRF9SRUcoYSkgICAgYQorI2RlZmluZSBBRElTMTYyMDNfV1JJVEVfUkVHKGEpICgoYSkgfCAweDgwKQorCisjZGVmaW5lIEFESVMxNjIwM19GTEFTSF9DTlQgICAgICAweDAwIC8qIEZsYXNoIG1lbW9yeSB3cml0ZSBjb3VudCAqLworI2RlZmluZSBBRElTMTYyMDNfU1VQUExZX09VVCAgICAgMHgwMiAvKiBPdXRwdXQsIHBvd2VyIHN1cHBseSAqLworI2RlZmluZSBBRElTMTYyMDNfQVVYX0FEQyAgICAgICAgMHgwOCAvKiBPdXRwdXQsIGF1eGlsaWFyeSBBREMgaW5wdXQgKi8KKyNkZWZpbmUgQURJUzE2MjAzX1RFTVBfT1VUICAgICAgIDB4MEEgLyogT3V0cHV0LCB0ZW1wZXJhdHVyZSAqLworI2RlZmluZSBBRElTMTYyMDNfWElOQ0xfT1VUICAgICAgMHgwQyAvKiBPdXRwdXQsIHgtYXhpcyBpbmNsaW5hdGlvbiAqLworI2RlZmluZSBBRElTMTYyMDNfWUlOQ0xfT1VUICAgICAgMHgwRSAvKiBPdXRwdXQsIHktYXhpcyBpbmNsaW5hdGlvbiAqLworI2RlZmluZSBBRElTMTYyMDNfSU5DTF9OVUxMICAgICAgMHgxOCAvKiBJbmNsaW5lIG51bGwgY2FsaWJyYXRpb24gKi8KKyNkZWZpbmUgQURJUzE2MjAzX0FMTV9NQUcxICAgICAgIDB4MjAgLyogQWxhcm0gMSBhbXBsaXR1ZGUgdGhyZXNob2xkICovCisjZGVmaW5lIEFESVMxNjIwM19BTE1fTUFHMiAgICAgICAweDIyIC8qIEFsYXJtIDIgYW1wbGl0dWRlIHRocmVzaG9sZCAqLworI2RlZmluZSBBRElTMTYyMDNfQUxNX1NNUEwxICAgICAgMHgyNCAvKiBBbGFybSAxLCBzYW1wbGUgcGVyaW9kICovCisjZGVmaW5lIEFESVMxNjIwM19BTE1fU01QTDIgICAgICAweDI2IC8qIEFsYXJtIDIsIHNhbXBsZSBwZXJpb2QgKi8KKyNkZWZpbmUgQURJUzE2MjAzX0FMTV9DVFJMICAgICAgIDB4MjggLyogQWxhcm0gY29udHJvbCAqLworI2RlZmluZSBBRElTMTYyMDNfQVVYX0RBQyAgICAgICAgMHgzMCAvKiBBdXhpbGlhcnkgREFDIGRhdGEgKi8KKyNkZWZpbmUgQURJUzE2MjAzX0dQSU9fQ1RSTCAgICAgIDB4MzIgLyogR2VuZXJhbC1wdXJwb3NlIGRpZ2l0YWwgaW5wdXQvb3V0cHV0IGNvbnRyb2wgKi8KKyNkZWZpbmUgQURJUzE2MjAzX01TQ19DVFJMICAgICAgIDB4MzQgLyogTWlzY2VsbGFuZW91cyBjb250cm9sICovCisjZGVmaW5lIEFESVMxNjIwM19TTVBMX1BSRCAgICAgICAweDM2IC8qIEludGVybmFsIHNhbXBsZSBwZXJpb2QgKHJhdGUpIGNvbnRyb2wgKi8KKyNkZWZpbmUgQURJUzE2MjAzX0FWR19DTlQgICAgICAgIDB4MzggLyogT3BlcmF0aW9uLCBmaWx0ZXIgY29uZmlndXJhdGlvbiAqLworI2RlZmluZSBBRElTMTYyMDNfU0xQX0NOVCAgICAgICAgMHgzQSAvKiBPcGVyYXRpb24sIHNsZWVwIG1vZGUgY29udHJvbCAqLworI2RlZmluZSBBRElTMTYyMDNfRElBR19TVEFUICAgICAgMHgzQyAvKiBEaWFnbm9zdGljcywgc3lzdGVtIHN0YXR1cyByZWdpc3RlciAqLworI2RlZmluZSBBRElTMTYyMDNfR0xPQl9DTUQgICAgICAgMHgzRSAvKiBPcGVyYXRpb24sIHN5c3RlbSBjb21tYW5kIHJlZ2lzdGVyICovCisKKyNkZWZpbmUgQURJUzE2MjAzX09VVFBVVFMgICAgICAgIDUKKworLyogTVNDX0NUUkwgKi8KKyNkZWZpbmUgQURJUzE2MjAzX01TQ19DVFJMX1BXUlVQX1NFTEZfVEVTVAkoMSA8PCAxMCkgLyogU2VsZi10ZXN0IGF0IHBvd2VyLW9uOiAxID0gZGlzYWJsZWQsIDAgPSBlbmFibGVkICovCisjZGVmaW5lIEFESVMxNjIwM19NU0NfQ1RSTF9SRVZFUlNFX1JPVF9FTgkoMSA8PCA5KSAgLyogUmV2ZXJzZXMgcm90YXRpb24gb2YgYm90aCBpbmNsaW5hdGlvbiBvdXRwdXRzICovCisjZGVmaW5lIEFESVMxNjIwM19NU0NfQ1RSTF9TRUxGX1RFU1RfRU4JICAgICAgICAoMSA8PCA4KSAgLyogU2VsZi10ZXN0IGVuYWJsZSAqLworI2RlZmluZSBBRElTMTYyMDNfTVNDX0NUUkxfREFUQV9SRFlfRU4JICAgICAgICAoMSA8PCAyKSAgLyogRGF0YS1yZWFkeSBlbmFibGU6IDEgPSBlbmFibGVkLCAwID0gZGlzYWJsZWQgKi8KKyNkZWZpbmUgQURJUzE2MjAzX01TQ19DVFJMX0FDVElWRV9ISUdICSAgICAgICAgKDEgPDwgMSkgIC8qIERhdGEtcmVhZHkgcG9sYXJpdHk6IDEgPSBhY3RpdmUgaGlnaCwgMCA9IGFjdGl2ZSBsb3cgKi8KKyNkZWZpbmUgQURJUzE2MjAzX01TQ19DVFJMX0RBVEFfUkRZX0RJTzEJKDEgPDwgMCkgIC8qIERhdGEtcmVhZHkgbGluZSBzZWxlY3Rpb246IDEgPSBESU8xLCAwID0gRElPMCAqLworCisvKiBESUFHX1NUQVQgKi8KKyNkZWZpbmUgQURJUzE2MjAzX0RJQUdfU1RBVF9BTEFSTTIgICAgICAgICgxPDw5KSAvKiBBbGFybSAyIHN0YXR1czogMSA9IGFsYXJtIGFjdGl2ZSwgMCA9IGFsYXJtIGluYWN0aXZlICovCisjZGVmaW5lIEFESVMxNjIwM19ESUFHX1NUQVRfQUxBUk0xICAgICAgICAoMTw8OCkgLyogQWxhcm0gMSBzdGF0dXM6IDEgPSBhbGFybSBhY3RpdmUsIDAgPSBhbGFybSBpbmFjdGl2ZSAqLworI2RlZmluZSBBRElTMTYyMDNfRElBR19TVEFUX1NFTEZURVNUX0ZBSUwgKDE8PDUpIC8qIFNlbGYtdGVzdCBkaWFnbm9zdGljIGVycm9yIGZsYWcgKi8KKyNkZWZpbmUgQURJUzE2MjAzX0RJQUdfU1RBVF9TUElfRkFJTAkgICgxPDwzKSAvKiBTUEkgY29tbXVuaWNhdGlvbnMgZmFpbHVyZSAqLworI2RlZmluZSBBRElTMTYyMDNfRElBR19TVEFUX0ZMQVNIX1VQVAkgICgxPDwyKSAvKiBGbGFzaCB1cGRhdGUgZmFpbHVyZSAqLworI2RlZmluZSBBRElTMTYyMDNfRElBR19TVEFUX1BPV0VSX0hJR0gJICAoMTw8MSkgLyogUG93ZXIgc3VwcGx5IGFib3ZlIDMuNjI1IFYgKi8KKyNkZWZpbmUgQURJUzE2MjAzX0RJQUdfU1RBVF9QT1dFUl9MT1cJICAoMTw8MCkgLyogUG93ZXIgc3VwcGx5IGJlbG93IDMuMTUgViAqLworCisvKiBHTE9CX0NNRCAqLworI2RlZmluZSBBRElTMTYyMDNfR0xPQl9DTURfU1dfUkVTRVQJKDE8PDcpCisjZGVmaW5lIEFESVMxNjIwM19HTE9CX0NNRF9DTEVBUl9TVEFUCSgxPDw0KQorI2RlZmluZSBBRElTMTYyMDNfR0xPQl9DTURfRkFDVE9SWV9DQUwJKDE8PDEpCisKKyNkZWZpbmUgQURJUzE2MjAzX01BWF9UWCAxMgorI2RlZmluZSBBRElTMTYyMDNfTUFYX1JYIDEwCisKKyNkZWZpbmUgQURJUzE2MjAzX0VSUk9SX0FDVElWRSAgICAgICAgICAoMTw8MTQpCisKKy8qKgorICogc3RydWN0IGFkaXMxNjIwM19zdGF0ZSAtIGRldmljZSBpbnN0YW5jZSBzcGVjaWZpYyBkYXRhCisgKiBAdXM6CQkJYWN0dWFsIHNwaV9kZXZpY2UKKyAqIEB3b3JrX3RyaWdnZXJfdG9fcmluZzogYmggZm9yIHRyaWdnZXJlZCBldmVudCBoYW5kbGluZworICogQGludGVyOgkJdXNlZCB0byBjaGVjayBpZiBuZXcgaW50ZXJydXB0IGhhcyBiZWVuIHRyaWdnZXJlZAorICogQGxhc3RfdGltZXN0YW1wOglwYXNzaW5nIHRpbWVzdGFtcCBmcm9tIHRoIHRvIGJoIG9mIGludGVycnVwdCBoYW5kbGVyCisgKiBAaW5kaW9fZGV2OgkJaW5kdXN0cmlhbCBJL08gZGV2aWNlIHN0cnVjdHVyZQorICogQHRyaWc6CQlkYXRhIHJlYWR5IHRyaWdnZXIgcmVnaXN0ZXJlZCB3aXRoIGlpbworICogQHR4OgkJCXRyYW5zbWl0IGJ1ZmZlcgorICogQHJ4OgkJCXJlY2lldmUgYnVmZmVyCisgKiBAYnVmX2xvY2s6CQltdXRleCB0byBwcm90ZWN0IHR4IGFuZCByeAorICoqLworc3RydWN0IGFkaXMxNjIwM19zdGF0ZSB7CisJc3RydWN0IHNwaV9kZXZpY2UJCSp1czsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QJCXdvcmtfdHJpZ2dlcl90b19yaW5nOworCXM2NAkJCQlsYXN0X3RpbWVzdGFtcDsKKwlzdHJ1Y3QgaWlvX2RldgkJCSppbmRpb19kZXY7CisJc3RydWN0IGlpb190cmlnZ2VyCQkqdHJpZzsKKwl1OAkJCQkqdHg7CisJdTgJCQkJKnJ4OworCXN0cnVjdCBtdXRleAkJCWJ1Zl9sb2NrOworfTsKKworaW50IGFkaXMxNjIwM19zZXRfaXJxKHN0cnVjdCBkZXZpY2UgKmRldiwgYm9vbCBlbmFibGUpOworCisjaWZkZWYgQ09ORklHX0lJT19SSU5HX0JVRkZFUgorZW51bSBhZGlzMTYyMDNfc2NhbiB7CisJQURJUzE2MjAzX1NDQU5fU1VQUExZLAorCUFESVMxNjIwM19TQ0FOX0FVWF9BREMsCisJQURJUzE2MjAzX1NDQU5fVEVNUCwKKwlBRElTMTYyMDNfU0NBTl9JTkNMSV9YLAorCUFESVMxNjIwM19TQ0FOX0lOQ0xJX1ksCit9OworCit2b2lkIGFkaXMxNjIwM19yZW1vdmVfdHJpZ2dlcihzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KTsKK2ludCBhZGlzMTYyMDNfcHJvYmVfdHJpZ2dlcihzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KTsKKworc3NpemVfdCBhZGlzMTYyMDNfcmVhZF9kYXRhX2Zyb21fcmluZyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJICAgICAgY2hhciAqYnVmKTsKKworaW50IGFkaXMxNjIwM19jb25maWd1cmVfcmluZyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KTsKK3ZvaWQgYWRpczE2MjAzX3VuY29uZmlndXJlX3Jpbmcoc3RydWN0IGlpb19kZXYgKmluZGlvX2Rldik7CisKK2ludCBhZGlzMTYyMDNfaW5pdGlhbGl6ZV9yaW5nKHN0cnVjdCBpaW9fcmluZ19idWZmZXIgKnJpbmcpOwordm9pZCBhZGlzMTYyMDNfdW5pbml0aWFsaXplX3Jpbmcoc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqcmluZyk7CisjZWxzZSAvKiBDT05GSUdfSUlPX1JJTkdfQlVGRkVSICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhZGlzMTYyMDNfcmVtb3ZlX3RyaWdnZXIoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKK3sKK30KKworc3RhdGljIGlubGluZSBpbnQgYWRpczE2MjAzX3Byb2JlX3RyaWdnZXIoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBzc2l6ZV90CithZGlzMTYyMDNfcmVhZF9kYXRhX2Zyb21fcmluZyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgICAgIGNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhZGlzMTYyMDNfY29uZmlndXJlX3Jpbmcoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGFkaXMxNjIwM191bmNvbmZpZ3VyZV9yaW5nKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCit7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGFkaXMxNjIwM19pbml0aWFsaXplX3Jpbmcoc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqcmluZykKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGFkaXMxNjIwM191bmluaXRpYWxpemVfcmluZyhzdHJ1Y3QgaWlvX3JpbmdfYnVmZmVyICpyaW5nKQoreworfQorCisjZW5kaWYgLyogQ09ORklHX0lJT19SSU5HX0JVRkZFUiAqLworI2VuZGlmIC8qIFNQSV9BRElTMTYyMDNfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjAzX2NvcmUuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjAzX2NvcmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTdmMTkwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyMDNfY29yZS5jCkBAIC0wLDAgKzEsNTY4IEBACisvKgorICogQURJUzE2MjAzIFByb2dyYW1tYWJsZSBEaWdpdGFsIFZpYnJhdGlvbiBTZW5zb3IgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IDIwMTAgQW5hbG9nIERldmljZXMgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorCisjaW5jbHVkZSAiLi4vaWlvLmgiCisjaW5jbHVkZSAiLi4vc3lzZnMuaCIKKyNpbmNsdWRlICJhY2NlbC5oIgorI2luY2x1ZGUgImluY2xpbm9tZXRlci5oIgorI2luY2x1ZGUgIi4uL2d5cm8vZ3lyby5oIgorI2luY2x1ZGUgIi4uL2FkYy9hZGMuaCIKKworI2luY2x1ZGUgImFkaXMxNjIwMy5oIgorCisjZGVmaW5lIERSSVZFUl9OQU1FCQkiYWRpczE2MjAzIgorCitzdGF0aWMgaW50IGFkaXMxNjIwM19jaGVja19zdGF0dXMoc3RydWN0IGRldmljZSAqZGV2KTsKKworLyoqCisgKiBhZGlzMTYyMDNfc3BpX3dyaXRlX3JlZ184KCkgLSB3cml0ZSBzaW5nbGUgYnl0ZSB0byBhIHJlZ2lzdGVyCisgKiBAZGV2OiBkZXZpY2UgYXNzb2NpYXRlZCB3aXRoIGNoaWxkIG9mIGFjdHVhbCBkZXZpY2UgKGlpb19kZXYgb3IgaWlvX3RyaWcpCisgKiBAcmVnX2FkZHJlc3M6IHRoZSBhZGRyZXNzIG9mIHRoZSByZWdpc3RlciB0byBiZSB3cml0dGVuCisgKiBAdmFsOiB0aGUgdmFsdWUgdG8gd3JpdGUKKyAqKi8KK3N0YXRpYyBpbnQgYWRpczE2MjAzX3NwaV93cml0ZV9yZWdfOChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXU4IHJlZ19hZGRyZXNzLAorCQl1OCB2YWwpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkaXMxNjIwM19zdGF0ZSAqc3QgPSBpaW9fZGV2X2dldF9kZXZkYXRhKGluZGlvX2Rldik7CisKKwltdXRleF9sb2NrKCZzdC0+YnVmX2xvY2spOworCXN0LT50eFswXSA9IEFESVMxNjIwM19XUklURV9SRUcocmVnX2FkZHJlc3MpOworCXN0LT50eFsxXSA9IHZhbDsKKworCXJldCA9IHNwaV93cml0ZShzdC0+dXMsIHN0LT50eCwgMik7CisJbXV0ZXhfdW5sb2NrKCZzdC0+YnVmX2xvY2spOworCisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBhZGlzMTYyMDNfc3BpX3dyaXRlX3JlZ18xNigpIC0gd3JpdGUgMiBieXRlcyB0byBhIHBhaXIgb2YgcmVnaXN0ZXJzCisgKiBAZGV2OiBkZXZpY2UgYXNzb2NpYXRlZCB3aXRoIGNoaWxkIG9mIGFjdHVhbCBkZXZpY2UgKGlpb19kZXYgb3IgaWlvX3RyaWcpCisgKiBAcmVnX2FkZHJlc3M6IHRoZSBhZGRyZXNzIG9mIHRoZSBsb3dlciBvZiB0aGUgdHdvIHJlZ2lzdGVycy4gU2Vjb25kIHJlZ2lzdGVyCisgKiAgICAgICAgICAgICAgIGlzIGFzc3VtZWQgdG8gaGF2ZSBhZGRyZXNzIG9uZSBncmVhdGVyLgorICogQHZhbDogdmFsdWUgdG8gYmUgd3JpdHRlbgorICoqLworc3RhdGljIGludCBhZGlzMTYyMDNfc3BpX3dyaXRlX3JlZ18xNihzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXU4IGxvd2VyX3JlZ19hZGRyZXNzLAorCQl1MTYgdmFsdWUpCit7CisJaW50IHJldDsKKwlzdHJ1Y3Qgc3BpX21lc3NhZ2UgbXNnOworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWRpczE2MjAzX3N0YXRlICpzdCA9IGlpb19kZXZfZ2V0X2RldmRhdGEoaW5kaW9fZGV2KTsKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyIHhmZXJzW10gPSB7CisJCXsKKwkJCS50eF9idWYgPSBzdC0+dHgsCisJCQkuYml0c19wZXJfd29yZCA9IDgsCisJCQkubGVuID0gMiwKKwkJCS5jc19jaGFuZ2UgPSAxLAorCQl9LCB7CisJCQkudHhfYnVmID0gc3QtPnR4ICsgMiwKKwkJCS5iaXRzX3Blcl93b3JkID0gOCwKKwkJCS5sZW4gPSAyLAorCQkJLmNzX2NoYW5nZSA9IDEsCisJCX0sCisJfTsKKworCW11dGV4X2xvY2soJnN0LT5idWZfbG9jayk7CisJc3QtPnR4WzBdID0gQURJUzE2MjAzX1dSSVRFX1JFRyhsb3dlcl9yZWdfYWRkcmVzcyk7CisJc3QtPnR4WzFdID0gdmFsdWUgJiAweEZGOworCXN0LT50eFsyXSA9IEFESVMxNjIwM19XUklURV9SRUcobG93ZXJfcmVnX2FkZHJlc3MgKyAxKTsKKwlzdC0+dHhbM10gPSAodmFsdWUgPj4gOCkgJiAweEZGOworCisJc3BpX21lc3NhZ2VfaW5pdCgmbXNnKTsKKwlzcGlfbWVzc2FnZV9hZGRfdGFpbCgmeGZlcnNbMF0sICZtc2cpOworCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZ4ZmVyc1sxXSwgJm1zZyk7CisJcmV0ID0gc3BpX3N5bmMoc3QtPnVzLCAmbXNnKTsKKwltdXRleF91bmxvY2soJnN0LT5idWZfbG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIGFkaXMxNjIwM19zcGlfcmVhZF9yZWdfMTYoKSAtIHJlYWQgMiBieXRlcyBmcm9tIGEgMTYtYml0IHJlZ2lzdGVyCisgKiBAZGV2OiBkZXZpY2UgYXNzb2NpYXRlZCB3aXRoIGNoaWxkIG9mIGFjdHVhbCBkZXZpY2UgKGlpb19kZXYgb3IgaWlvX3RyaWcpCisgKiBAcmVnX2FkZHJlc3M6IHRoZSBhZGRyZXNzIG9mIHRoZSBsb3dlciBvZiB0aGUgdHdvIHJlZ2lzdGVycy4gU2Vjb25kIHJlZ2lzdGVyCisgKiAgICAgICAgICAgICAgIGlzIGFzc3VtZWQgdG8gaGF2ZSBhZGRyZXNzIG9uZSBncmVhdGVyLgorICogQHZhbDogc29tZXdoZXJlIHRvIHBhc3MgYmFjayB0aGUgdmFsdWUgcmVhZAorICoqLworc3RhdGljIGludCBhZGlzMTYyMDNfc3BpX3JlYWRfcmVnXzE2KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJdTggbG93ZXJfcmVnX2FkZHJlc3MsCisJCXUxNiAqdmFsKQoreworCXN0cnVjdCBzcGlfbWVzc2FnZSBtc2c7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZGlzMTYyMDNfc3RhdGUgKnN0ID0gaWlvX2Rldl9nZXRfZGV2ZGF0YShpbmRpb19kZXYpOworCWludCByZXQ7CisJc3RydWN0IHNwaV90cmFuc2ZlciB4ZmVyc1tdID0geworCQl7CisJCQkudHhfYnVmID0gc3QtPnR4LAorCQkJLmJpdHNfcGVyX3dvcmQgPSA4LAorCQkJLmxlbiA9IDIsCisJCQkuY3NfY2hhbmdlID0gMSwKKwkJCS5kZWxheV91c2VjcyA9IDIwLAorCQl9LCB7CisJCQkucnhfYnVmID0gc3QtPnJ4LAorCQkJLmJpdHNfcGVyX3dvcmQgPSA4LAorCQkJLmxlbiA9IDIsCisJCQkuY3NfY2hhbmdlID0gMSwKKwkJCS5kZWxheV91c2VjcyA9IDIwLAorCQl9LAorCX07CisKKwltdXRleF9sb2NrKCZzdC0+YnVmX2xvY2spOworCXN0LT50eFswXSA9IEFESVMxNjIwM19SRUFEX1JFRyhsb3dlcl9yZWdfYWRkcmVzcyk7CisJc3QtPnR4WzFdID0gMDsKKworCXNwaV9tZXNzYWdlX2luaXQoJm1zZyk7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnhmZXJzWzBdLCAmbXNnKTsKKwlzcGlfbWVzc2FnZV9hZGRfdGFpbCgmeGZlcnNbMV0sICZtc2cpOworCXJldCA9IHNwaV9zeW5jKHN0LT51cywgJm1zZyk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZzdC0+dXMtPmRldiwgInByb2JsZW0gd2hlbiByZWFkaW5nIDE2IGJpdCByZWdpc3RlciAweCUwMlgiLAorCQkJCWxvd2VyX3JlZ19hZGRyZXNzKTsKKwkJZ290byBlcnJvcl9yZXQ7CisJfQorCSp2YWwgPSAoc3QtPnJ4WzBdIDw8IDgpIHwgc3QtPnJ4WzFdOworCitlcnJvcl9yZXQ6CisJbXV0ZXhfdW5sb2NrKCZzdC0+YnVmX2xvY2spOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkaXMxNjIwM19yZWFkXzEyYml0X3Vuc2lnbmVkKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlpbnQgcmV0OworCXUxNiB2YWwgPSAwOworCXN0cnVjdCBpaW9fZGV2X2F0dHIgKnRoaXNfYXR0ciA9IHRvX2lpb19kZXZfYXR0cihhdHRyKTsKKworCXJldCA9IGFkaXMxNjIwM19zcGlfcmVhZF9yZWdfMTYoZGV2LCB0aGlzX2F0dHItPmFkZHJlc3MsICZ2YWwpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlpZiAodmFsICYgQURJUzE2MjAzX0VSUk9SX0FDVElWRSkKKwkJYWRpczE2MjAzX2NoZWNrX3N0YXR1cyhkZXYpOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIHZhbCAmIDB4MEZGRik7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkaXMxNjIwM19yZWFkX3RlbXAoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzc2l6ZV90IHJldDsKKwl1MTYgdmFsOworCisJLyogVGFrZSB0aGUgaWlvX2RldiBzdGF0dXMgbG9jayAqLworCW11dGV4X2xvY2soJmluZGlvX2Rldi0+bWxvY2spOworCisJcmV0ID0gYWRpczE2MjAzX3NwaV9yZWFkX3JlZ18xNihkZXYsIEFESVMxNjIwM19URU1QX09VVCwgKHUxNiAqKSZ2YWwpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfcmV0OworCisJaWYgKHZhbCAmIEFESVMxNjIwM19FUlJPUl9BQ1RJVkUpCisJCWFkaXMxNjIwM19jaGVja19zdGF0dXMoZGV2KTsKKworCXZhbCAmPSAweEZGRjsKKwlyZXQgPSBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCB2YWwpOworCitlcnJvcl9yZXQ6CisJbXV0ZXhfdW5sb2NrKCZpbmRpb19kZXYtPm1sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3NpemVfdCBhZGlzMTYyMDNfcmVhZF8xNGJpdF9zaWduZWQoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgaWlvX2Rldl9hdHRyICp0aGlzX2F0dHIgPSB0b19paW9fZGV2X2F0dHIoYXR0cik7CisJczE2IHZhbCA9IDA7CisJc3NpemVfdCByZXQ7CisKKwltdXRleF9sb2NrKCZpbmRpb19kZXYtPm1sb2NrKTsKKworCXJldCA9IGFkaXMxNjIwM19zcGlfcmVhZF9yZWdfMTYoZGV2LCB0aGlzX2F0dHItPmFkZHJlc3MsICh1MTYgKikmdmFsKTsKKwlpZiAoIXJldCkgeworCQlpZiAodmFsICYgQURJUzE2MjAzX0VSUk9SX0FDVElWRSkKKwkJCWFkaXMxNjIwM19jaGVja19zdGF0dXMoZGV2KTsKKworCQl2YWwgPSAoKHMxNikodmFsIDw8IDIpID4+IDIpOworCQlyZXQgPSBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCB2YWwpOworCX0KKworCW11dGV4X3VubG9jaygmaW5kaW9fZGV2LT5tbG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3NpemVfdCBhZGlzMTYyMDNfd3JpdGVfMTZiaXQoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgbGVuKQoreworCXN0cnVjdCBpaW9fZGV2X2F0dHIgKnRoaXNfYXR0ciA9IHRvX2lpb19kZXZfYXR0cihhdHRyKTsKKwlpbnQgcmV0OworCWxvbmcgdmFsOworCisJcmV0ID0gc3RyaWN0X3N0cnRvbChidWYsIDEwLCAmdmFsKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3JldDsKKwlyZXQgPSBhZGlzMTYyMDNfc3BpX3dyaXRlX3JlZ18xNihkZXYsIHRoaXNfYXR0ci0+YWRkcmVzcywgdmFsKTsKKworZXJyb3JfcmV0OgorCXJldHVybiByZXQgPyByZXQgOiBsZW47Cit9CisKK3N0YXRpYyBpbnQgYWRpczE2MjAzX3Jlc2V0KHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlpbnQgcmV0OworCXJldCA9IGFkaXMxNjIwM19zcGlfd3JpdGVfcmVnXzgoZGV2LAorCQkJQURJUzE2MjAzX0dMT0JfQ01ELAorCQkJQURJUzE2MjAzX0dMT0JfQ01EX1NXX1JFU0VUKTsKKwlpZiAocmV0KQorCQlkZXZfZXJyKGRldiwgInByb2JsZW0gcmVzZXR0aW5nIGRldmljZSIpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QgYWRpczE2MjAzX3dyaXRlX3Jlc2V0KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbikKK3sKKwlpZiAobGVuIDwgMSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJc3dpdGNoIChidWZbMF0pIHsKKwljYXNlICcxJzoKKwljYXNlICd5JzoKKwljYXNlICdZJzoKKwkJcmV0dXJuIGFkaXMxNjIwM19yZXNldChkZXYpOworCX0KKwlyZXR1cm4gLUVJTlZBTDsKK30KKworaW50IGFkaXMxNjIwM19zZXRfaXJxKHN0cnVjdCBkZXZpY2UgKmRldiwgYm9vbCBlbmFibGUpCit7CisJaW50IHJldCA9IDA7CisJdTE2IG1zYzsKKworCXJldCA9IGFkaXMxNjIwM19zcGlfcmVhZF9yZWdfMTYoZGV2LCBBRElTMTYyMDNfTVNDX0NUUkwsICZtc2MpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfcmV0OworCisJbXNjIHw9IEFESVMxNjIwM19NU0NfQ1RSTF9BQ1RJVkVfSElHSDsKKwltc2MgJj0gfkFESVMxNjIwM19NU0NfQ1RSTF9EQVRBX1JEWV9ESU8xOworCWlmIChlbmFibGUpCisJCW1zYyB8PSBBRElTMTYyMDNfTVNDX0NUUkxfREFUQV9SRFlfRU47CisJZWxzZQorCQltc2MgJj0gfkFESVMxNjIwM19NU0NfQ1RSTF9EQVRBX1JEWV9FTjsKKworCXJldCA9IGFkaXMxNjIwM19zcGlfd3JpdGVfcmVnXzE2KGRldiwgQURJUzE2MjAzX01TQ19DVFJMLCBtc2MpOworCitlcnJvcl9yZXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhZGlzMTYyMDNfY2hlY2tfc3RhdHVzKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwl1MTYgc3RhdHVzOworCWludCByZXQ7CisKKwlyZXQgPSBhZGlzMTYyMDNfc3BpX3JlYWRfcmVnXzE2KGRldiwgQURJUzE2MjAzX0RJQUdfU1RBVCwgJnN0YXR1cyk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycihkZXYsICJSZWFkaW5nIHN0YXR1cyBmYWlsZWRcbiIpOworCQlnb3RvIGVycm9yX3JldDsKKwl9CisJcmV0ID0gc3RhdHVzICYgMHgxRjsKKworCWlmIChzdGF0dXMgJiBBRElTMTYyMDNfRElBR19TVEFUX1NFTEZURVNUX0ZBSUwpCisJCWRldl9lcnIoZGV2LCAiU2VsZiB0ZXN0IGZhaWx1cmVcbiIpOworCWlmIChzdGF0dXMgJiBBRElTMTYyMDNfRElBR19TVEFUX1NQSV9GQUlMKQorCQlkZXZfZXJyKGRldiwgIlNQSSBmYWlsdXJlXG4iKTsKKwlpZiAoc3RhdHVzICYgQURJUzE2MjAzX0RJQUdfU1RBVF9GTEFTSF9VUFQpCisJCWRldl9lcnIoZGV2LCAiRmxhc2ggdXBkYXRlIGZhaWxlZFxuIik7CisJaWYgKHN0YXR1cyAmIEFESVMxNjIwM19ESUFHX1NUQVRfUE9XRVJfSElHSCkKKwkJZGV2X2VycihkZXYsICJQb3dlciBzdXBwbHkgYWJvdmUgMy42MjVWXG4iKTsKKwlpZiAoc3RhdHVzICYgQURJUzE2MjAzX0RJQUdfU1RBVF9QT1dFUl9MT1cpCisJCWRldl9lcnIoZGV2LCAiUG93ZXIgc3VwcGx5IGJlbG93IDMuMTVWXG4iKTsKKworZXJyb3JfcmV0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYWRpczE2MjAzX3NlbGZfdGVzdChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJaW50IHJldDsKKwlyZXQgPSBhZGlzMTYyMDNfc3BpX3dyaXRlX3JlZ18xNihkZXYsCisJCQlBRElTMTYyMDNfTVNDX0NUUkwsCisJCQlBRElTMTYyMDNfTVNDX0NUUkxfU0VMRl9URVNUX0VOKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoZGV2LCAicHJvYmxlbSBzdGFydGluZyBzZWxmIHRlc3QiKTsKKwkJZ290byBlcnJfcmV0OworCX0KKworCWFkaXMxNjIwM19jaGVja19zdGF0dXMoZGV2KTsKKworZXJyX3JldDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFkaXMxNjIwM19pbml0aWFsX3NldHVwKHN0cnVjdCBhZGlzMTYyMDNfc3RhdGUgKnN0KQoreworCWludCByZXQ7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJnN0LT5pbmRpb19kZXYtPmRldjsKKworCS8qIERpc2FibGUgSVJRICovCisJcmV0ID0gYWRpczE2MjAzX3NldF9pcnEoZGV2LCBmYWxzZSk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKGRldiwgImRpc2FibGUgaXJxIGZhaWxlZCIpOworCQlnb3RvIGVycl9yZXQ7CisJfQorCisJLyogRG8gc2VsZiB0ZXN0ICovCisJcmV0ID0gYWRpczE2MjAzX3NlbGZfdGVzdChkZXYpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihkZXYsICJzZWxmIHRlc3QgZmFpbHVyZSIpOworCQlnb3RvIGVycl9yZXQ7CisJfQorCisJLyogUmVhZCBzdGF0dXMgcmVnaXN0ZXIgdG8gY2hlY2sgdGhlIHJlc3VsdCAqLworCXJldCA9IGFkaXMxNjIwM19jaGVja19zdGF0dXMoZGV2KTsKKwlpZiAocmV0KSB7CisJCWFkaXMxNjIwM19yZXNldChkZXYpOworCQlkZXZfZXJyKGRldiwgImRldmljZSBub3QgcGxheWluZyBiYWxsIC0+IHJlc2V0Iik7CisJCW1zbGVlcChBRElTMTYyMDNfU1RBUlRVUF9ERUxBWSk7CisJCXJldCA9IGFkaXMxNjIwM19jaGVja19zdGF0dXMoZGV2KTsKKwkJaWYgKHJldCkgeworCQkJZGV2X2VycihkZXYsICJnaXZpbmcgdXAiKTsKKwkJCWdvdG8gZXJyX3JldDsKKwkJfQorCX0KKworCXByaW50ayhLRVJOX0lORk8gRFJJVkVSX05BTUUgIjogYXQgQ1MlZCAoaXJxICVkKVxuIiwKKwkJCXN0LT51cy0+Y2hpcF9zZWxlY3QsIHN0LT51cy0+aXJxKTsKKworZXJyX3JldDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgSUlPX0RFVl9BVFRSX0lOX05BTUVEX1JBVygwLCBzdXBwbHksIGFkaXMxNjIwM19yZWFkXzEyYml0X3Vuc2lnbmVkLAorCQlBRElTMTYyMDNfU1VQUExZX09VVCk7CitzdGF0aWMgSUlPX0NPTlNUX0FUVFIoaW4wX3N1cHBseV9zY2FsZSwgIjAuMDAxMjIiKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfSU5fUkFXKDEsIGFkaXMxNjIwM19yZWFkXzEyYml0X3Vuc2lnbmVkLAorCQlBRElTMTYyMDNfQVVYX0FEQyk7CitzdGF0aWMgSUlPX0NPTlNUX0FUVFIoaW4xX3NjYWxlLCAiMC4wMDA2MSIpOworCitzdGF0aWMgSUlPX0RFVl9BVFRSX0lOQ0xJX1goYWRpczE2MjAzX3JlYWRfMTRiaXRfc2lnbmVkLAorCQlBRElTMTYyMDNfWElOQ0xfT1VUKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfSU5DTElfWShhZGlzMTYyMDNfcmVhZF8xNGJpdF9zaWduZWQsCisJCUFESVMxNjIwM19ZSU5DTF9PVVQpOworc3RhdGljIElJT19ERVZfQVRUUl9JTkNMSV9YX09GRlNFVChTX0lXVVNSIHwgU19JUlVHTywKKwkJYWRpczE2MjAzX3JlYWRfMTRiaXRfc2lnbmVkLAorCQlhZGlzMTYyMDNfd3JpdGVfMTZiaXQsCisJCUFESVMxNjIwM19JTkNMX05VTEwpOworc3RhdGljIElJT19DT05TVF9BVFRSKGluY2xpX3NjYWxlLCAiMC4wMjUiKTsKKworc3RhdGljIElJT19ERVZfQVRUUl9URU1QX1JBVyhhZGlzMTYyMDNfcmVhZF90ZW1wKTsKK3N0YXRpYyBJSU9fQ09OU1RfQVRUUih0ZW1wX29mZnNldCwgIjI1Iik7CitzdGF0aWMgSUlPX0NPTlNUX0FUVFIodGVtcF9zY2FsZSwgIi0wLjQ3Iik7CisKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIocmVzZXQsIFNfSVdVU1IsIE5VTEwsIGFkaXMxNjIwM193cml0ZV9yZXNldCwgMCk7CisKK3N0YXRpYyBJSU9fQ09OU1RfQVRUUihuYW1lLCAiYWRpczE2MjAzIik7CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICphZGlzMTYyMDNfZXZlbnRfYXR0cmlidXRlc1tdID0geworCU5VTEwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGFkaXMxNjIwM19ldmVudF9hdHRyaWJ1dGVfZ3JvdXAgPSB7CisJLmF0dHJzID0gYWRpczE2MjAzX2V2ZW50X2F0dHJpYnV0ZXMsCit9OworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqYWRpczE2MjAzX2F0dHJpYnV0ZXNbXSA9IHsKKwkmaWlvX2Rldl9hdHRyX2luMF9zdXBwbHlfcmF3LmRldl9hdHRyLmF0dHIsCisJJmlpb19jb25zdF9hdHRyX2luMF9zdXBwbHlfc2NhbGUuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX3RlbXBfcmF3LmRldl9hdHRyLmF0dHIsCisJJmlpb19jb25zdF9hdHRyX3RlbXBfb2Zmc2V0LmRldl9hdHRyLmF0dHIsCisJJmlpb19jb25zdF9hdHRyX3RlbXBfc2NhbGUuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX3Jlc2V0LmRldl9hdHRyLmF0dHIsCisJJmlpb19jb25zdF9hdHRyX25hbWUuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2luMV9yYXcuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2NvbnN0X2F0dHJfaW4xX3NjYWxlLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9pbmNsaV94X3Jhdy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfaW5jbGlfeV9yYXcuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2luY2xpX3hfb2Zmc2V0LmRldl9hdHRyLmF0dHIsCisJJmlpb19jb25zdF9hdHRyX2luY2xpX3NjYWxlLmRldl9hdHRyLmF0dHIsCisJTlVMTAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgYWRpczE2MjAzX2F0dHJpYnV0ZV9ncm91cCA9IHsKKwkuYXR0cnMgPSBhZGlzMTYyMDNfYXR0cmlidXRlcywKK307CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGFkaXMxNjIwM19wcm9iZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCWludCByZXQsIHJlZ2RvbmUgPSAwOworCXN0cnVjdCBhZGlzMTYyMDNfc3RhdGUgKnN0ID0ga3phbGxvYyhzaXplb2YgKnN0LCBHRlBfS0VSTkVMKTsKKwlpZiAoIXN0KSB7CisJCXJldCA9ICAtRU5PTUVNOworCQlnb3RvIGVycm9yX3JldDsKKwl9CisJLyogdGhpcyBpcyBvbmx5IHVzZWQgZm9yIHJlbW92YWwgcHVycG9zZXMgKi8KKwlzcGlfc2V0X2RydmRhdGEoc3BpLCBzdCk7CisKKwkvKiBBbGxvY2F0ZSB0aGUgY29tbXMgYnVmZmVycyAqLworCXN0LT5yeCA9IGt6YWxsb2Moc2l6ZW9mKCpzdC0+cngpKkFESVMxNjIwM19NQVhfUlgsIEdGUF9LRVJORUwpOworCWlmIChzdC0+cnggPT0gTlVMTCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycm9yX2ZyZWVfc3Q7CisJfQorCXN0LT50eCA9IGt6YWxsb2Moc2l6ZW9mKCpzdC0+dHgpKkFESVMxNjIwM19NQVhfVFgsIEdGUF9LRVJORUwpOworCWlmIChzdC0+dHggPT0gTlVMTCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycm9yX2ZyZWVfcng7CisJfQorCXN0LT51cyA9IHNwaTsKKwltdXRleF9pbml0KCZzdC0+YnVmX2xvY2spOworCS8qIHNldHVwIHRoZSBpbmR1c3RyaWFsaW8gZHJpdmVyIGFsbG9jYXRlZCBlbGVtZW50cyAqLworCXN0LT5pbmRpb19kZXYgPSBpaW9fYWxsb2NhdGVfZGV2aWNlKCk7CisJaWYgKHN0LT5pbmRpb19kZXYgPT0gTlVMTCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycm9yX2ZyZWVfdHg7CisJfQorCisJc3QtPmluZGlvX2Rldi0+ZGV2LnBhcmVudCA9ICZzcGktPmRldjsKKwlzdC0+aW5kaW9fZGV2LT5udW1faW50ZXJydXB0X2xpbmVzID0gMTsKKwlzdC0+aW5kaW9fZGV2LT5ldmVudF9hdHRycyA9ICZhZGlzMTYyMDNfZXZlbnRfYXR0cmlidXRlX2dyb3VwOworCXN0LT5pbmRpb19kZXYtPmF0dHJzID0gJmFkaXMxNjIwM19hdHRyaWJ1dGVfZ3JvdXA7CisJc3QtPmluZGlvX2Rldi0+ZGV2X2RhdGEgPSAodm9pZCAqKShzdCk7CisJc3QtPmluZGlvX2Rldi0+ZHJpdmVyX21vZHVsZSA9IFRISVNfTU9EVUxFOworCXN0LT5pbmRpb19kZXYtPm1vZGVzID0gSU5ESU9fRElSRUNUX01PREU7CisKKwlyZXQgPSBhZGlzMTYyMDNfY29uZmlndXJlX3Jpbmcoc3QtPmluZGlvX2Rldik7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9mcmVlX2RldjsKKworCXJldCA9IGlpb19kZXZpY2VfcmVnaXN0ZXIoc3QtPmluZGlvX2Rldik7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl91bnJlZ19yaW5nX2Z1bmNzOworCXJlZ2RvbmUgPSAxOworCisJcmV0ID0gYWRpczE2MjAzX2luaXRpYWxpemVfcmluZyhzdC0+aW5kaW9fZGV2LT5yaW5nKTsKKwlpZiAocmV0KSB7CisJCXByaW50ayhLRVJOX0VSUiAiZmFpbGVkIHRvIGluaXRpYWxpemUgdGhlIHJpbmdcbiIpOworCQlnb3RvIGVycm9yX3VucmVnX3JpbmdfZnVuY3M7CisJfQorCisJaWYgKHNwaS0+aXJxKSB7CisJCXJldCA9IGlpb19yZWdpc3Rlcl9pbnRlcnJ1cHRfbGluZShzcGktPmlycSwKKwkJCQlzdC0+aW5kaW9fZGV2LAorCQkJCTAsCisJCQkJSVJRRl9UUklHR0VSX1JJU0lORywKKwkJCQkiYWRpczE2MjAzIik7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycm9yX3VuaW5pdGlhbGl6ZV9yaW5nOworCisJCXJldCA9IGFkaXMxNjIwM19wcm9iZV90cmlnZ2VyKHN0LT5pbmRpb19kZXYpOworCQlpZiAocmV0KQorCQkJZ290byBlcnJvcl91bnJlZ2lzdGVyX2xpbmU7CisJfQorCisJLyogR2V0IHRoZSBkZXZpY2UgaW50byBhIHNhbmUgaW5pdGlhbCBzdGF0ZSAqLworCXJldCA9IGFkaXMxNjIwM19pbml0aWFsX3NldHVwKHN0KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3JlbW92ZV90cmlnZ2VyOworCXJldHVybiAwOworCitlcnJvcl9yZW1vdmVfdHJpZ2dlcjoKKwlhZGlzMTYyMDNfcmVtb3ZlX3RyaWdnZXIoc3QtPmluZGlvX2Rldik7CitlcnJvcl91bnJlZ2lzdGVyX2xpbmU6CisJaWYgKHNwaS0+aXJxKQorCQlpaW9fdW5yZWdpc3Rlcl9pbnRlcnJ1cHRfbGluZShzdC0+aW5kaW9fZGV2LCAwKTsKK2Vycm9yX3VuaW5pdGlhbGl6ZV9yaW5nOgorCWFkaXMxNjIwM191bmluaXRpYWxpemVfcmluZyhzdC0+aW5kaW9fZGV2LT5yaW5nKTsKK2Vycm9yX3VucmVnX3JpbmdfZnVuY3M6CisJYWRpczE2MjAzX3VuY29uZmlndXJlX3Jpbmcoc3QtPmluZGlvX2Rldik7CitlcnJvcl9mcmVlX2RldjoKKwlpZiAocmVnZG9uZSkKKwkJaWlvX2RldmljZV91bnJlZ2lzdGVyKHN0LT5pbmRpb19kZXYpOworCWVsc2UKKwkJaWlvX2ZyZWVfZGV2aWNlKHN0LT5pbmRpb19kZXYpOworZXJyb3JfZnJlZV90eDoKKwlrZnJlZShzdC0+dHgpOworZXJyb3JfZnJlZV9yeDoKKwlrZnJlZShzdC0+cngpOworZXJyb3JfZnJlZV9zdDoKKwlrZnJlZShzdCk7CitlcnJvcl9yZXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhZGlzMTYyMDNfcmVtb3ZlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJc3RydWN0IGFkaXMxNjIwM19zdGF0ZSAqc3QgPSBzcGlfZ2V0X2RydmRhdGEoc3BpKTsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gc3QtPmluZGlvX2RldjsKKworCWZsdXNoX3NjaGVkdWxlZF93b3JrKCk7CisKKwlhZGlzMTYyMDNfcmVtb3ZlX3RyaWdnZXIoaW5kaW9fZGV2KTsKKwlpZiAoc3BpLT5pcnEpCisJCWlpb191bnJlZ2lzdGVyX2ludGVycnVwdF9saW5lKGluZGlvX2RldiwgMCk7CisKKwlhZGlzMTYyMDNfdW5pbml0aWFsaXplX3JpbmcoaW5kaW9fZGV2LT5yaW5nKTsKKwlpaW9fZGV2aWNlX3VucmVnaXN0ZXIoaW5kaW9fZGV2KTsKKwlhZGlzMTYyMDNfdW5jb25maWd1cmVfcmluZyhpbmRpb19kZXYpOworCWtmcmVlKHN0LT50eCk7CisJa2ZyZWUoc3QtPnJ4KTsKKwlrZnJlZShzdCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzcGlfZHJpdmVyIGFkaXMxNjIwM19kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAiYWRpczE2MjAzIiwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJfSwKKwkucHJvYmUgPSBhZGlzMTYyMDNfcHJvYmUsCisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKGFkaXMxNjIwM19yZW1vdmUpLAorfTsKKworc3RhdGljIF9faW5pdCBpbnQgYWRpczE2MjAzX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gc3BpX3JlZ2lzdGVyX2RyaXZlcigmYWRpczE2MjAzX2RyaXZlcik7Cit9Cittb2R1bGVfaW5pdChhZGlzMTYyMDNfaW5pdCk7CisKK3N0YXRpYyBfX2V4aXQgdm9pZCBhZGlzMTYyMDNfZXhpdCh2b2lkKQoreworCXNwaV91bnJlZ2lzdGVyX2RyaXZlcigmYWRpczE2MjAzX2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdChhZGlzMTYyMDNfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIkJhcnJ5IFNvbmcgPDIxY25iYW9AZ21haWwuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJBbmFsb2cgRGV2aWNlcyBBRElTMTYyMDMgUHJvZ3JhbW1hYmxlIERpZ2l0YWwgVmlicmF0aW9uIFNlbnNvciBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjAzX3JpbmcuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjAzX3JpbmcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDc3NGY3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyMDNfcmluZy5jCkBAIC0wLDAgKzEsMjExIEBACisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNmcy5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKworI2luY2x1ZGUgIi4uL2lpby5oIgorI2luY2x1ZGUgIi4uL3N5c2ZzLmgiCisjaW5jbHVkZSAiLi4vcmluZ19zdy5oIgorI2luY2x1ZGUgImFjY2VsLmgiCisjaW5jbHVkZSAiLi4vdHJpZ2dlci5oIgorI2luY2x1ZGUgImFkaXMxNjIwMy5oIgorCitzdGF0aWMgSUlPX1NDQU5fRUxfQyhpbl9zdXBwbHksIEFESVMxNjIwM19TQ0FOX1NVUFBMWSwgQURJUzE2MjAzX1NVUFBMWV9PVVQsIE5VTEwpOworc3RhdGljIElJT19DT05TVF9BVFRSX1NDQU5fRUxfVFlQRShpbl9zdXBwbHksIHUsIDEyLCAxNik7CitzdGF0aWMgSUlPX1NDQU5fRUxfQyhpbjAsIEFESVMxNjIwM19TQ0FOX0FVWF9BREMsIEFESVMxNjIwM19BVVhfQURDLCBOVUxMKTsKK3N0YXRpYyBJSU9fQ09OU1RfQVRUUl9TQ0FOX0VMX1RZUEUoaW4wLCB1LCAxMiwgMTYpOworc3RhdGljIElJT19TQ0FOX0VMX0ModGVtcCwgQURJUzE2MjAzX1NDQU5fVEVNUCwgQURJUzE2MjAzX1RFTVBfT1VULCBOVUxMKTsKK3N0YXRpYyBJSU9fQ09OU1RfQVRUUl9TQ0FOX0VMX1RZUEUodGVtcCwgdSwgMTIsIDE2KTsKK3N0YXRpYyBJSU9fU0NBTl9FTF9DKGluY2xpX3gsIEFESVMxNjIwM19TQ0FOX0lOQ0xJX1gsCisJCSAgICAgQURJUzE2MjAzX1hJTkNMX09VVCwgTlVMTCk7CitzdGF0aWMgSUlPX1NDQU5fRUxfQyhpbmNsaV95LCBBRElTMTYyMDNfU0NBTl9JTkNMSV9ZLAorCQkgICAgIEFESVMxNjIwM19ZSU5DTF9PVVQsIE5VTEwpOworc3RhdGljIElJT19DT05TVF9BVFRSX1NDQU5fRUxfVFlQRShpbmNsaSwgcywgMTQsIDE2KTsKK3N0YXRpYyBJSU9fU0NBTl9FTF9USU1FU1RBTVAoNSk7CitzdGF0aWMgSUlPX0NPTlNUX0FUVFJfU0NBTl9FTF9UWVBFKHRpbWVzdGFtcCwgcywgNjQsIDY0KTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmFkaXMxNjIwM19zY2FuX2VsX2F0dHJzW10gPSB7CisJJmlpb19zY2FuX2VsX2luX3N1cHBseS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fY29uc3RfYXR0cl9pbl9zdXBwbHlfaW5kZXguZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2NvbnN0X2F0dHJfaW5fc3VwcGx5X3R5cGUuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX3NjYW5fZWxfaW4wLmRldl9hdHRyLmF0dHIsCisJJmlpb19jb25zdF9hdHRyX2luMF9pbmRleC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fY29uc3RfYXR0cl9pbjBfdHlwZS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fc2Nhbl9lbF90ZW1wLmRldl9hdHRyLmF0dHIsCisJJmlpb19jb25zdF9hdHRyX3RlbXBfaW5kZXguZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2NvbnN0X2F0dHJfdGVtcF90eXBlLmRldl9hdHRyLmF0dHIsCisJJmlpb19zY2FuX2VsX2luY2xpX3guZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2NvbnN0X2F0dHJfaW5jbGlfeF9pbmRleC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fc2Nhbl9lbF9pbmNsaV95LmRldl9hdHRyLmF0dHIsCisJJmlpb19jb25zdF9hdHRyX2luY2xpX3lfaW5kZXguZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2NvbnN0X2F0dHJfaW5jbGlfdHlwZS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fc2Nhbl9lbF90aW1lc3RhbXAuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2NvbnN0X2F0dHJfdGltZXN0YW1wX2luZGV4LmRldl9hdHRyLmF0dHIsCisJJmlpb19jb25zdF9hdHRyX3RpbWVzdGFtcF90eXBlLmRldl9hdHRyLmF0dHIsCisJTlVMTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGFkaXMxNjIwM19zY2FuX2VsX2dyb3VwID0geworCS5hdHRycyA9IGFkaXMxNjIwM19zY2FuX2VsX2F0dHJzLAorCS5uYW1lID0gInNjYW5fZWxlbWVudHMiLAorfTsKKworLyoqCisgKiBhZGlzMTYyMDNfcG9sbF9mdW5jX3RoKCkgdG9wIGhhbGYgaW50ZXJydXB0IGhhbmRsZXIgY2FsbGVkIGJ5IHRyaWdnZXIKKyAqIEBwcml2YXRlX2RhdGE6CWlpb19kZXYKKyAqKi8KK3N0YXRpYyB2b2lkIGFkaXMxNjIwM19wb2xsX2Z1bmNfdGgoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiwgczY0IHRpbWVzdGFtcCkKK3sKKwlzdHJ1Y3QgYWRpczE2MjAzX3N0YXRlICpzdCA9IGlpb19kZXZfZ2V0X2RldmRhdGEoaW5kaW9fZGV2KTsKKwlzdC0+bGFzdF90aW1lc3RhbXAgPSB0aW1lc3RhbXA7CisJc2NoZWR1bGVfd29yaygmc3QtPndvcmtfdHJpZ2dlcl90b19yaW5nKTsKK30KKworLyoqCisgKiBhZGlzMTYyMDNfcmVhZF9yaW5nX2RhdGEoKSByZWFkIGRhdGEgcmVnaXN0ZXJzIHdoaWNoIHdpbGwgYmUgcGxhY2VkIGludG8gcmluZworICogQGRldjogZGV2aWNlIGFzc29jaWF0ZWQgd2l0aCBjaGlsZCBvZiBhY3R1YWwgZGV2aWNlIChpaW9fZGV2IG9yIGlpb190cmlnKQorICogQHJ4OiBzb21ld2hlcmUgdG8gcGFzcyBiYWNrIHRoZSB2YWx1ZSByZWFkCisgKiovCitzdGF0aWMgaW50IGFkaXMxNjIwM19yZWFkX3JpbmdfZGF0YShzdHJ1Y3QgZGV2aWNlICpkZXYsIHU4ICpyeCkKK3sKKwlzdHJ1Y3Qgc3BpX21lc3NhZ2UgbXNnOworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWRpczE2MjAzX3N0YXRlICpzdCA9IGlpb19kZXZfZ2V0X2RldmRhdGEoaW5kaW9fZGV2KTsKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyIHhmZXJzW0FESVMxNjIwM19PVVRQVVRTICsgMV07CisJaW50IHJldDsKKwlpbnQgaTsKKworCW11dGV4X2xvY2soJnN0LT5idWZfbG9jayk7CisKKwlzcGlfbWVzc2FnZV9pbml0KCZtc2cpOworCisJbWVtc2V0KHhmZXJzLCAwLCBzaXplb2YoeGZlcnMpKTsKKwlmb3IgKGkgPSAwOyBpIDw9IEFESVMxNjIwM19PVVRQVVRTOyBpKyspIHsKKwkJeGZlcnNbaV0uYml0c19wZXJfd29yZCA9IDg7CisJCXhmZXJzW2ldLmNzX2NoYW5nZSA9IDE7CisJCXhmZXJzW2ldLmxlbiA9IDI7CisJCXhmZXJzW2ldLmRlbGF5X3VzZWNzID0gMjA7CisJCXhmZXJzW2ldLnR4X2J1ZiA9IHN0LT50eCArIDIgKiBpOworCQlpZiAoaSA8IDEpIC8qIFNVUFBMWV9PVVQ6IDB4MDIsIEFVWF9BREM6IDB4MDggKi8KKwkJCXN0LT50eFsyICogaV0gPSBBRElTMTYyMDNfUkVBRF9SRUcoQURJUzE2MjAzX1NVUFBMWV9PVVQgKyAyICogaSk7CisJCWVsc2UKKwkJCXN0LT50eFsyICogaV0gPSBBRElTMTYyMDNfUkVBRF9SRUcoQURJUzE2MjAzX1NVUFBMWV9PVVQgKyAyICogaSArIDYpOworCQlzdC0+dHhbMiAqIGkgKyAxXSA9IDA7CisJCWlmIChpID49IDEpCisJCQl4ZmVyc1tpXS5yeF9idWYgPSByeCArIDIgKiAoaSAtIDEpOworCQlzcGlfbWVzc2FnZV9hZGRfdGFpbCgmeGZlcnNbaV0sICZtc2cpOworCX0KKworCXJldCA9IHNwaV9zeW5jKHN0LT51cywgJm1zZyk7CisJaWYgKHJldCkKKwkJZGV2X2Vycigmc3QtPnVzLT5kZXYsICJwcm9ibGVtIHdoZW4gYnVyc3QgcmVhZGluZyIpOworCisJbXV0ZXhfdW5sb2NrKCZzdC0+YnVmX2xvY2spOworCisJcmV0dXJuIHJldDsKK30KKworLyogV2hpbHN0IHRoaXMgbWFrZXMgYSBsb3Qgb2YgY2FsbHMgdG8gaWlvX3N3X3JpbmcgZnVuY3Rpb25zIC0gaXQgaXMgdG8gZGV2aWNlCisgKiBzcGVjaWZpYyB0byBiZSByb2xsZWQgaW50byB0aGUgY29yZS4KKyAqLworc3RhdGljIHZvaWQgYWRpczE2MjAzX3RyaWdnZXJfYmhfdG9fcmluZyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmtfcykKK3sKKwlzdHJ1Y3QgYWRpczE2MjAzX3N0YXRlICpzdAorCQk9IGNvbnRhaW5lcl9vZih3b3JrX3MsIHN0cnVjdCBhZGlzMTYyMDNfc3RhdGUsCisJCQkgICAgICAgd29ya190cmlnZ2VyX3RvX3JpbmcpOworCXN0cnVjdCBpaW9fcmluZ19idWZmZXIgKnJpbmcgPSBzdC0+aW5kaW9fZGV2LT5yaW5nOworCisJaW50IGkgPSAwOworCXMxNiAqZGF0YTsKKwlzaXplX3QgZGF0YXNpemUgPSByaW5nLT5hY2Nlc3MuZ2V0X2J5dGVzX3Blcl9kYXR1bShyaW5nKTsKKworCWRhdGEgPSBrbWFsbG9jKGRhdGFzaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAoZGF0YSA9PSBOVUxMKSB7CisJCWRldl9lcnIoJnN0LT51cy0+ZGV2LCAibWVtb3J5IGFsbG9jIGZhaWxlZCBpbiByaW5nIGJoIik7CisJCXJldHVybjsKKwl9CisKKwlpZiAocmluZy0+c2Nhbl9jb3VudCkKKwkJaWYgKGFkaXMxNjIwM19yZWFkX3JpbmdfZGF0YSgmc3QtPmluZGlvX2Rldi0+ZGV2LCBzdC0+cngpID49IDApCisJCQlmb3IgKDsgaSA8IHJpbmctPnNjYW5fY291bnQ7IGkrKykKKwkJCQlkYXRhW2ldID0gYmUxNl90b19jcHVwKAorCQkJCQkoX19iZTE2ICopJihzdC0+cnhbaSoyXSkpOworCisJLyogR3VhcmFudGVlZCB0byBiZSBhbGlnbmVkIHdpdGggOCBieXRlIGJvdW5kYXJ5ICovCisJaWYgKHJpbmctPnNjYW5fdGltZXN0YW1wKQorCQkqKChzNjQgKikoZGF0YSArICgoaSArIDMpLzQpKjQpKSA9IHN0LT5sYXN0X3RpbWVzdGFtcDsKKworCXJpbmctPmFjY2Vzcy5zdG9yZV90byhyaW5nLAorCQkJICAgICAgKHU4ICopZGF0YSwKKwkJCSAgICAgIHN0LT5sYXN0X3RpbWVzdGFtcCk7CisKKwlpaW9fdHJpZ2dlcl9ub3RpZnlfZG9uZShzdC0+aW5kaW9fZGV2LT50cmlnKTsKKwlrZnJlZShkYXRhKTsKKworCXJldHVybjsKK30KKwordm9pZCBhZGlzMTYyMDNfdW5jb25maWd1cmVfcmluZyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQoreworCWtmcmVlKGluZGlvX2Rldi0+cG9sbGZ1bmMpOworCWlpb19zd19yYl9mcmVlKGluZGlvX2Rldi0+cmluZyk7Cit9CisKK2ludCBhZGlzMTYyMDNfY29uZmlndXJlX3Jpbmcoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgYWRpczE2MjAzX3N0YXRlICpzdCA9IGluZGlvX2Rldi0+ZGV2X2RhdGE7CisJc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqcmluZzsKKwlJTklUX1dPUksoJnN0LT53b3JrX3RyaWdnZXJfdG9fcmluZywgYWRpczE2MjAzX3RyaWdnZXJfYmhfdG9fcmluZyk7CisKKwlyaW5nID0gaWlvX3N3X3JiX2FsbG9jYXRlKGluZGlvX2Rldik7CisJaWYgKCFyaW5nKSB7CisJCXJldCA9IC1FTk9NRU07CisJCXJldHVybiByZXQ7CisJfQorCWluZGlvX2Rldi0+cmluZyA9IHJpbmc7CisJLyogRWZmZWN0aXZlbHkgc2VsZWN0IHRoZSByaW5nIGJ1ZmZlciBpbXBsZW1lbnRhdGlvbiAqLworCWlpb19yaW5nX3N3X3JlZ2lzdGVyX2Z1bmNzKCZyaW5nLT5hY2Nlc3MpOworCXJpbmctPmJwZSA9IDI7CisJcmluZy0+c2Nhbl9lbF9hdHRycyA9ICZhZGlzMTYyMDNfc2Nhbl9lbF9ncm91cDsKKwlyaW5nLT5zY2FuX3RpbWVzdGFtcCA9IHRydWU7CisJcmluZy0+cHJlZW5hYmxlID0gJmlpb19zd19yaW5nX3ByZWVuYWJsZTsKKwlyaW5nLT5wb3N0ZW5hYmxlID0gJmlpb190cmlnZ2VyZWRfcmluZ19wb3N0ZW5hYmxlOworCXJpbmctPnByZWRpc2FibGUgPSAmaWlvX3RyaWdnZXJlZF9yaW5nX3ByZWRpc2FibGU7CisJcmluZy0+b3duZXIgPSBUSElTX01PRFVMRTsKKworCS8qIFNldCBkZWZhdWx0IHNjYW4gbW9kZSAqLworCWlpb19zY2FuX21hc2tfc2V0KHJpbmcsIGlpb19zY2FuX2VsX2luX3N1cHBseS5udW1iZXIpOworCWlpb19zY2FuX21hc2tfc2V0KHJpbmcsIGlpb19zY2FuX2VsX3RlbXAubnVtYmVyKTsKKwlpaW9fc2Nhbl9tYXNrX3NldChyaW5nLCBpaW9fc2Nhbl9lbF9pbjAubnVtYmVyKTsKKwlpaW9fc2Nhbl9tYXNrX3NldChyaW5nLCBpaW9fc2Nhbl9lbF9pbmNsaV94Lm51bWJlcik7CisJaWlvX3NjYW5fbWFza19zZXQocmluZywgaWlvX3NjYW5fZWxfaW5jbGlfeS5udW1iZXIpOworCisJcmV0ID0gaWlvX2FsbG9jX3BvbGxmdW5jKGluZGlvX2RldiwgTlVMTCwgJmFkaXMxNjIwM19wb2xsX2Z1bmNfdGgpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfaWlvX3N3X3JiX2ZyZWU7CisKKwlpbmRpb19kZXYtPm1vZGVzIHw9IElORElPX1JJTkdfVFJJR0dFUkVEOworCXJldHVybiAwOworCitlcnJvcl9paW9fc3dfcmJfZnJlZToKKwlpaW9fc3dfcmJfZnJlZShpbmRpb19kZXYtPnJpbmcpOworCXJldHVybiByZXQ7Cit9CisKK2ludCBhZGlzMTYyMDNfaW5pdGlhbGl6ZV9yaW5nKHN0cnVjdCBpaW9fcmluZ19idWZmZXIgKnJpbmcpCit7CisJcmV0dXJuIGlpb19yaW5nX2J1ZmZlcl9yZWdpc3RlcihyaW5nLCAwKTsKK30KKwordm9pZCBhZGlzMTYyMDNfdW5pbml0aWFsaXplX3Jpbmcoc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqcmluZykKK3sKKwlpaW9fcmluZ19idWZmZXJfdW5yZWdpc3RlcihyaW5nKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjAzX3RyaWdnZXIuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjAzX3RyaWdnZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MGJlNTFjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyMDNfdHJpZ2dlci5jCkBAIC0wLDAgKzEsMTIyIEBACisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNmcy5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CisKKyNpbmNsdWRlICIuLi9paW8uaCIKKyNpbmNsdWRlICIuLi9zeXNmcy5oIgorI2luY2x1ZGUgIi4uL3RyaWdnZXIuaCIKKyNpbmNsdWRlICJhZGlzMTYyMDMuaCIKKworLyoqCisgKiBhZGlzMTYyMDNfZGF0YV9yZHlfdHJpZ19wb2xsKCkgdGhlIGV2ZW50IGhhbmRsZXIgZm9yIHRoZSBkYXRhIHJkeSB0cmlnCisgKiovCitzdGF0aWMgaW50IGFkaXMxNjIwM19kYXRhX3JkeV90cmlnX3BvbGwoc3RydWN0IGlpb19kZXYgKmRldl9pbmZvLAorCQkJCSAgICAgICBpbnQgaW5kZXgsCisJCQkJICAgICAgIHM2NCB0aW1lc3RhbXAsCisJCQkJICAgICAgIGludCBub190ZXN0KQoreworCXN0cnVjdCBhZGlzMTYyMDNfc3RhdGUgKnN0ID0gaWlvX2Rldl9nZXRfZGV2ZGF0YShkZXZfaW5mbyk7CisJc3RydWN0IGlpb190cmlnZ2VyICp0cmlnID0gc3QtPnRyaWc7CisKKwlpaW9fdHJpZ2dlcl9wb2xsKHRyaWcsIHRpbWVzdGFtcCk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK0lJT19FVkVOVF9TSChkYXRhX3JkeV90cmlnLCAmYWRpczE2MjAzX2RhdGFfcmR5X3RyaWdfcG9sbCk7CisKK3N0YXRpYyBERVZJQ0VfQVRUUihuYW1lLCBTX0lSVUdPLCBpaW9fdHJpZ2dlcl9yZWFkX25hbWUsIE5VTEwpOworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqYWRpczE2MjAzX3RyaWdnZXJfYXR0cnNbXSA9IHsKKwkmZGV2X2F0dHJfbmFtZS5hdHRyLAorCU5VTEwsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBhZGlzMTYyMDNfdHJpZ2dlcl9hdHRyX2dyb3VwID0geworCS5hdHRycyA9IGFkaXMxNjIwM190cmlnZ2VyX2F0dHJzLAorfTsKKworLyoqCisgKiBhZGlzMTYyMDNfZGF0YV9yZHlfdHJpZ2dlcl9zZXRfc3RhdGUoKSBzZXQgZGF0YXJkeSBpbnRlcnJ1cHQgc3RhdGUKKyAqKi8KK3N0YXRpYyBpbnQgYWRpczE2MjAzX2RhdGFfcmR5X3RyaWdnZXJfc2V0X3N0YXRlKHN0cnVjdCBpaW9fdHJpZ2dlciAqdHJpZywKKwkJCQkJCWJvb2wgc3RhdGUpCit7CisJc3RydWN0IGFkaXMxNjIwM19zdGF0ZSAqc3QgPSB0cmlnLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IHN0LT5pbmRpb19kZXY7CisJaW50IHJldCA9IDA7CisKKwlkZXZfZGJnKCZpbmRpb19kZXYtPmRldiwgIiVzICglZClcbiIsIF9fZnVuY19fLCBzdGF0ZSk7CisJcmV0ID0gYWRpczE2MjAzX3NldF9pcnEoJnN0LT5pbmRpb19kZXYtPmRldiwgc3RhdGUpOworCWlmIChzdGF0ZSA9PSBmYWxzZSkgeworCQlpaW9fcmVtb3ZlX2V2ZW50X2Zyb21fbGlzdCgmaWlvX2V2ZW50X2RhdGFfcmR5X3RyaWcsCisJCQkJCSAgICZpbmRpb19kZXYtPmludGVycnVwdHNbMF0KKwkJCQkJICAgLT5ldl9saXN0KTsKKwkJZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKKwl9IGVsc2UgeworCQlpaW9fYWRkX2V2ZW50X3RvX2xpc3QoJmlpb19ldmVudF9kYXRhX3JkeV90cmlnLAorCQkJCSAgICAgICZpbmRpb19kZXYtPmludGVycnVwdHNbMF0tPmV2X2xpc3QpOworCX0KKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIGFkaXMxNjIwM190cmlnX3RyeV9yZWVuKCkgdHJ5IHJlbmFibGluZyBpcnEgZm9yIGRhdGEgcmR5IHRyaWdnZXIKKyAqIEB0cmlnOgl0aGUgZGF0YXJkeSB0cmlnZ2VyCisgKiovCitzdGF0aWMgaW50IGFkaXMxNjIwM190cmlnX3RyeV9yZWVuKHN0cnVjdCBpaW9fdHJpZ2dlciAqdHJpZykKK3sKKwlzdHJ1Y3QgYWRpczE2MjAzX3N0YXRlICpzdCA9IHRyaWctPnByaXZhdGVfZGF0YTsKKwllbmFibGVfaXJxKHN0LT51cy0+aXJxKTsKKwlyZXR1cm4gMDsKK30KKworaW50IGFkaXMxNjIwM19wcm9iZV90cmlnZ2VyKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgYWRpczE2MjAzX3N0YXRlICpzdCA9IGluZGlvX2Rldi0+ZGV2X2RhdGE7CisKKwlzdC0+dHJpZyA9IGlpb19hbGxvY2F0ZV90cmlnZ2VyKCk7CisJc3QtPnRyaWctPm5hbWUgPSBrYXNwcmludGYoR0ZQX0tFUk5FTCwKKwkJCQkiYWRpczE2MjAzLWRldiVkIiwKKwkJCQlpbmRpb19kZXYtPmlkKTsKKwlpZiAoIXN0LT50cmlnLT5uYW1lKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3JfZnJlZV90cmlnOworCX0KKwlzdC0+dHJpZy0+ZGV2LnBhcmVudCA9ICZzdC0+dXMtPmRldjsKKwlzdC0+dHJpZy0+b3duZXIgPSBUSElTX01PRFVMRTsKKwlzdC0+dHJpZy0+cHJpdmF0ZV9kYXRhID0gc3Q7CisJc3QtPnRyaWctPnNldF90cmlnZ2VyX3N0YXRlID0gJmFkaXMxNjIwM19kYXRhX3JkeV90cmlnZ2VyX3NldF9zdGF0ZTsKKwlzdC0+dHJpZy0+dHJ5X3JlZW5hYmxlID0gJmFkaXMxNjIwM190cmlnX3RyeV9yZWVuOworCXN0LT50cmlnLT5jb250cm9sX2F0dHJzID0gJmFkaXMxNjIwM190cmlnZ2VyX2F0dHJfZ3JvdXA7CisJcmV0ID0gaWlvX3RyaWdnZXJfcmVnaXN0ZXIoc3QtPnRyaWcpOworCisJLyogc2VsZWN0IGRlZmF1bHQgdHJpZ2dlciAqLworCWluZGlvX2Rldi0+dHJpZyA9IHN0LT50cmlnOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfZnJlZV90cmlnX25hbWU7CisKKwlyZXR1cm4gMDsKKworZXJyb3JfZnJlZV90cmlnX25hbWU6CisJa2ZyZWUoc3QtPnRyaWctPm5hbWUpOworZXJyb3JfZnJlZV90cmlnOgorCWlpb19mcmVlX3RyaWdnZXIoc3QtPnRyaWcpOworCisJcmV0dXJuIHJldDsKK30KKwordm9pZCBhZGlzMTYyMDNfcmVtb3ZlX3RyaWdnZXIoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKK3sKKwlzdHJ1Y3QgYWRpczE2MjAzX3N0YXRlICpzdGF0ZSA9IGluZGlvX2Rldi0+ZGV2X2RhdGE7CisKKwlpaW9fdHJpZ2dlcl91bnJlZ2lzdGVyKHN0YXRlLT50cmlnKTsKKwlrZnJlZShzdGF0ZS0+dHJpZy0+bmFtZSk7CisJaWlvX2ZyZWVfdHJpZ2dlcihzdGF0ZS0+dHJpZyk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FkaXMxNjIwNC5oIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyMDQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOWVkN2NiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyMDQuaApAQCAtMCwwICsxLDE1MSBAQAorI2lmbmRlZiBTUElfQURJUzE2MjA0X0hfCisjZGVmaW5lIFNQSV9BRElTMTYyMDRfSF8KKworI2RlZmluZSBBRElTMTYyMDRfU1RBUlRVUF9ERUxBWQkyMjAgLyogbXMgKi8KKworI2RlZmluZSBBRElTMTYyMDRfUkVBRF9SRUcoYSkgICAgYQorI2RlZmluZSBBRElTMTYyMDRfV1JJVEVfUkVHKGEpICgoYSkgfCAweDgwKQorCisjZGVmaW5lIEFESVMxNjIwNF9GTEFTSF9DTlQgICAgICAweDAwIC8qIEZsYXNoIG1lbW9yeSB3cml0ZSBjb3VudCAqLworI2RlZmluZSBBRElTMTYyMDRfU1VQUExZX09VVCAgICAgMHgwMiAvKiBPdXRwdXQsIHBvd2VyIHN1cHBseSAqLworI2RlZmluZSBBRElTMTYyMDRfWEFDQ0xfT1VUICAgICAgMHgwNCAvKiBPdXRwdXQsIHgtYXhpcyBhY2NlbGVyb21ldGVyICovCisjZGVmaW5lIEFESVMxNjIwNF9ZQUNDTF9PVVQgICAgICAweDA2IC8qIE91dHB1dCwgeS1heGlzIGFjY2VsZXJvbWV0ZXIgKi8KKyNkZWZpbmUgQURJUzE2MjA0X0FVWF9BREMgICAgICAgIDB4MDggLyogT3V0cHV0LCBhdXhpbGlhcnkgQURDIGlucHV0ICovCisjZGVmaW5lIEFESVMxNjIwNF9URU1QX09VVCAgICAgICAweDBBIC8qIE91dHB1dCwgdGVtcGVyYXR1cmUgKi8KKyNkZWZpbmUgQURJUzE2MjA0X1hfUEVBS19PVVQgICAgIDB4MEMgLyogVHdvcyBjb21wbGVtZW50ICovCisjZGVmaW5lIEFESVMxNjIwNF9ZX1BFQUtfT1VUICAgICAweDBFIC8qIFR3b3MgY29tcGxlbWVudCAqLworI2RlZmluZSBBRElTMTYyMDRfWEFDQ0xfTlVMTCAgICAgMHgxMCAvKiBDYWxpYnJhdGlvbiwgeC1heGlzIGFjY2VsZXJhdGlvbiBvZmZzZXQgbnVsbCAqLworI2RlZmluZSBBRElTMTYyMDRfWUFDQ0xfTlVMTCAgICAgMHgxMiAvKiBDYWxpYnJhdGlvbiwgeS1heGlzIGFjY2VsZXJhdGlvbiBvZmZzZXQgbnVsbCAqLworI2RlZmluZSBBRElTMTYyMDRfWEFDQ0xfU0NBTEUgICAgMHgxNCAvKiBYLWF4aXMgc2NhbGUgZmFjdG9yIGNhbGlicmF0aW9uIHJlZ2lzdGVyICovCisjZGVmaW5lIEFESVMxNjIwNF9ZQUNDTF9TQ0FMRSAgICAweDE2IC8qIFktYXhpcyBzY2FsZSBmYWN0b3IgY2FsaWJyYXRpb24gcmVnaXN0ZXIgKi8KKyNkZWZpbmUgQURJUzE2MjA0X1hZX1JTU19PVVQgICAgIDB4MTggLyogWFkgY29tYmluZWQgYWNjZWxlcmF0aW9uIChSU1MpICovCisjZGVmaW5lIEFESVMxNjIwNF9YWV9QRUFLX09VVCAgICAweDFBIC8qIFBlYWssIFhZIGNvbWJpbmVkIG91dHB1dCAoUlNTKSAqLworI2RlZmluZSBBRElTMTYyMDRfQ0FQX0JVRl8xICAgICAgMHgxQyAvKiBDYXB0dXJlIGJ1ZmZlciBvdXRwdXQgcmVnaXN0ZXIgMSAqLworI2RlZmluZSBBRElTMTYyMDRfQ0FQX0JVRl8yICAgICAgMHgxRSAvKiBDYXB0dXJlIGJ1ZmZlciBvdXRwdXQgcmVnaXN0ZXIgMiAqLworI2RlZmluZSBBRElTMTYyMDRfQUxNX01BRzEgICAgICAgMHgyMCAvKiBBbGFybSAxIGFtcGxpdHVkZSB0aHJlc2hvbGQgKi8KKyNkZWZpbmUgQURJUzE2MjA0X0FMTV9NQUcyICAgICAgIDB4MjIgLyogQWxhcm0gMiBhbXBsaXR1ZGUgdGhyZXNob2xkICovCisjZGVmaW5lIEFESVMxNjIwNF9BTE1fQ1RSTCAgICAgICAweDI4IC8qIEFsYXJtIGNvbnRyb2wgKi8KKyNkZWZpbmUgQURJUzE2MjA0X0NBUFRfUE5UUiAgICAgIDB4MkEgLyogQ2FwdHVyZSByZWdpc3RlciBhZGRyZXNzIHBvaW50ZXIgKi8KKyNkZWZpbmUgQURJUzE2MjA0X0FVWF9EQUMgICAgICAgIDB4MzAgLyogQXV4aWxpYXJ5IERBQyBkYXRhICovCisjZGVmaW5lIEFESVMxNjIwNF9HUElPX0NUUkwgICAgICAweDMyIC8qIEdlbmVyYWwtcHVycG9zZSBkaWdpdGFsIGlucHV0L291dHB1dCBjb250cm9sICovCisjZGVmaW5lIEFESVMxNjIwNF9NU0NfQ1RSTCAgICAgICAweDM0IC8qIE1pc2NlbGxhbmVvdXMgY29udHJvbCAqLworI2RlZmluZSBBRElTMTYyMDRfU01QTF9QUkQgICAgICAgMHgzNiAvKiBJbnRlcm5hbCBzYW1wbGUgcGVyaW9kIChyYXRlKSBjb250cm9sICovCisjZGVmaW5lIEFESVMxNjIwNF9BVkdfQ05UICAgICAgICAweDM4IC8qIE9wZXJhdGlvbiwgZmlsdGVyIGNvbmZpZ3VyYXRpb24gKi8KKyNkZWZpbmUgQURJUzE2MjA0X1NMUF9DTlQgICAgICAgIDB4M0EgLyogT3BlcmF0aW9uLCBzbGVlcCBtb2RlIGNvbnRyb2wgKi8KKyNkZWZpbmUgQURJUzE2MjA0X0RJQUdfU1RBVCAgICAgIDB4M0MgLyogRGlhZ25vc3RpY3MsIHN5c3RlbSBzdGF0dXMgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgQURJUzE2MjA0X0dMT0JfQ01EICAgICAgIDB4M0UgLyogT3BlcmF0aW9uLCBzeXN0ZW0gY29tbWFuZCByZWdpc3RlciAqLworCisjZGVmaW5lIEFESVMxNjIwNF9PVVRQVVRTICAgICAgICA1CisKKy8qIE1TQ19DVFJMICovCisjZGVmaW5lIEFESVMxNjIwNF9NU0NfQ1RSTF9QV1JVUF9TRUxGX1RFU1QJKDEgPDwgMTApIC8qIFNlbGYtdGVzdCBhdCBwb3dlci1vbjogMSA9IGRpc2FibGVkLCAwID0gZW5hYmxlZCAqLworI2RlZmluZSBBRElTMTYyMDRfTVNDX0NUUkxfU0VMRl9URVNUX0VOCSAgICAgICAgKDEgPDwgOCkgIC8qIFNlbGYtdGVzdCBlbmFibGUgKi8KKyNkZWZpbmUgQURJUzE2MjA0X01TQ19DVFJMX0RBVEFfUkRZX0VOCSAgICAgICAgKDEgPDwgMikgIC8qIERhdGEtcmVhZHkgZW5hYmxlOiAxID0gZW5hYmxlZCwgMCA9IGRpc2FibGVkICovCisjZGVmaW5lIEFESVMxNjIwNF9NU0NfQ1RSTF9BQ1RJVkVfSElHSAkgICAgICAgICgxIDw8IDEpICAvKiBEYXRhLXJlYWR5IHBvbGFyaXR5OiAxID0gYWN0aXZlIGhpZ2gsIDAgPSBhY3RpdmUgbG93ICovCisjZGVmaW5lIEFESVMxNjIwNF9NU0NfQ1RSTF9EQVRBX1JEWV9ESU8yCSgxIDw8IDApICAvKiBEYXRhLXJlYWR5IGxpbmUgc2VsZWN0aW9uOiAxID0gRElPMiwgMCA9IERJTzEgKi8KKworLyogRElBR19TVEFUICovCisjZGVmaW5lIEFESVMxNjIwNF9ESUFHX1NUQVRfQUxBUk0yICAgICAgICAoMTw8OSkgLyogQWxhcm0gMiBzdGF0dXM6IDEgPSBhbGFybSBhY3RpdmUsIDAgPSBhbGFybSBpbmFjdGl2ZSAqLworI2RlZmluZSBBRElTMTYyMDRfRElBR19TVEFUX0FMQVJNMSAgICAgICAgKDE8PDgpIC8qIEFsYXJtIDEgc3RhdHVzOiAxID0gYWxhcm0gYWN0aXZlLCAwID0gYWxhcm0gaW5hY3RpdmUgKi8KKyNkZWZpbmUgQURJUzE2MjA0X0RJQUdfU1RBVF9TRUxGVEVTVF9GQUlMICgxPDw1KSAvKiBTZWxmLXRlc3QgZGlhZ25vc3RpYyBlcnJvciBmbGFnOiAxID0gZXJyb3IgY29uZGl0aW9uLAorCQkJCQkJMCA9IG5vcm1hbCBvcGVyYXRpb24gKi8KKyNkZWZpbmUgQURJUzE2MjA0X0RJQUdfU1RBVF9TUElfRkFJTAkgICgxPDwzKSAvKiBTUEkgY29tbXVuaWNhdGlvbnMgZmFpbHVyZSAqLworI2RlZmluZSBBRElTMTYyMDRfRElBR19TVEFUX0ZMQVNIX1VQVAkgICgxPDwyKSAvKiBGbGFzaCB1cGRhdGUgZmFpbHVyZSAqLworI2RlZmluZSBBRElTMTYyMDRfRElBR19TVEFUX1BPV0VSX0hJR0gJICAoMTw8MSkgLyogUG93ZXIgc3VwcGx5IGFib3ZlIDMuNjI1IFYgKi8KKyNkZWZpbmUgQURJUzE2MjA0X0RJQUdfU1RBVF9QT1dFUl9MT1cJICAoMTw8MCkgLyogUG93ZXIgc3VwcGx5IGJlbG93IDIuOTc1IFYgKi8KKworLyogR0xPQl9DTUQgKi8KKyNkZWZpbmUgQURJUzE2MjA0X0dMT0JfQ01EX1NXX1JFU0VUCSgxPDw3KQorI2RlZmluZSBBRElTMTYyMDRfR0xPQl9DTURfQ0xFQVJfU1RBVAkoMTw8NCkKKyNkZWZpbmUgQURJUzE2MjA0X0dMT0JfQ01EX0ZBQ1RPUllfQ0FMCSgxPDwxKQorCisjZGVmaW5lIEFESVMxNjIwNF9NQVhfVFggMjQKKyNkZWZpbmUgQURJUzE2MjA0X01BWF9SWCAyNAorCisjZGVmaW5lIEFESVMxNjIwNF9FUlJPUl9BQ1RJVkUgICAgICAgICAgKDE8PDE0KQorCisvKioKKyAqIHN0cnVjdCBhZGlzMTYyMDRfc3RhdGUgLSBkZXZpY2UgaW5zdGFuY2Ugc3BlY2lmaWMgZGF0YQorICogQHVzOgkJCWFjdHVhbCBzcGlfZGV2aWNlCisgKiBAd29ya190cmlnZ2VyX3RvX3Jpbmc6IGJoIGZvciB0cmlnZ2VyZWQgZXZlbnQgaGFuZGxpbmcKKyAqIEBpbnRlcjoJCXVzZWQgdG8gY2hlY2sgaWYgbmV3IGludGVycnVwdCBoYXMgYmVlbiB0cmlnZ2VyZWQKKyAqIEBsYXN0X3RpbWVzdGFtcDoJcGFzc2luZyB0aW1lc3RhbXAgZnJvbSB0aCB0byBiaCBvZiBpbnRlcnJ1cHQgaGFuZGxlcgorICogQGluZGlvX2RldjoJCWluZHVzdHJpYWwgSS9PIGRldmljZSBzdHJ1Y3R1cmUKKyAqIEB0cmlnOgkJZGF0YSByZWFkeSB0cmlnZ2VyIHJlZ2lzdGVyZWQgd2l0aCBpaW8KKyAqIEB0eDoJCQl0cmFuc21pdCBidWZmZXIKKyAqIEByeDoJCQlyZWNpZXZlIGJ1ZmZlcgorICogQGJ1Zl9sb2NrOgkJbXV0ZXggdG8gcHJvdGVjdCB0eCBhbmQgcngKKyAqKi8KK3N0cnVjdCBhZGlzMTYyMDRfc3RhdGUgeworCXN0cnVjdCBzcGlfZGV2aWNlCQkqdXM7CisJc3RydWN0IHdvcmtfc3RydWN0CQl3b3JrX3RyaWdnZXJfdG9fcmluZzsKKwlzNjQJCQkJbGFzdF90aW1lc3RhbXA7CisJc3RydWN0IGlpb19kZXYJCQkqaW5kaW9fZGV2OworCXN0cnVjdCBpaW9fdHJpZ2dlcgkJKnRyaWc7CisJdTgJCQkJKnR4OworCXU4CQkJCSpyeDsKKwlzdHJ1Y3QgbXV0ZXgJCQlidWZfbG9jazsKK307CisKK2ludCBhZGlzMTYyMDRfc2V0X2lycShzdHJ1Y3QgZGV2aWNlICpkZXYsIGJvb2wgZW5hYmxlKTsKKworI2lmZGVmIENPTkZJR19JSU9fUklOR19CVUZGRVIKK2VudW0gYWRpczE2MjA0X3NjYW4geworCUFESVMxNjIwNF9TQ0FOX1NVUFBMWSwKKwlBRElTMTYyMDRfU0NBTl9BQ0NfWCwKKwlBRElTMTYyMDRfU0NBTl9BQ0NfWSwKKwlBRElTMTYyMDRfU0NBTl9BVVhfQURDLAorCUFESVMxNjIwNF9TQ0FOX1RFTVAsCit9OworCit2b2lkIGFkaXMxNjIwNF9yZW1vdmVfdHJpZ2dlcihzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KTsKK2ludCBhZGlzMTYyMDRfcHJvYmVfdHJpZ2dlcihzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KTsKKworc3NpemVfdCBhZGlzMTYyMDRfcmVhZF9kYXRhX2Zyb21fcmluZyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJICAgICAgY2hhciAqYnVmKTsKKworaW50IGFkaXMxNjIwNF9jb25maWd1cmVfcmluZyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KTsKK3ZvaWQgYWRpczE2MjA0X3VuY29uZmlndXJlX3Jpbmcoc3RydWN0IGlpb19kZXYgKmluZGlvX2Rldik7CisKK2ludCBhZGlzMTYyMDRfaW5pdGlhbGl6ZV9yaW5nKHN0cnVjdCBpaW9fcmluZ19idWZmZXIgKnJpbmcpOwordm9pZCBhZGlzMTYyMDRfdW5pbml0aWFsaXplX3Jpbmcoc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqcmluZyk7CisjZWxzZSAvKiBDT05GSUdfSUlPX1JJTkdfQlVGRkVSICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhZGlzMTYyMDRfcmVtb3ZlX3RyaWdnZXIoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKK3sKK30KKworc3RhdGljIGlubGluZSBpbnQgYWRpczE2MjA0X3Byb2JlX3RyaWdnZXIoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBzc2l6ZV90CithZGlzMTYyMDRfcmVhZF9kYXRhX2Zyb21fcmluZyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgICAgIGNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhZGlzMTYyMDRfY29uZmlndXJlX3Jpbmcoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGFkaXMxNjIwNF91bmNvbmZpZ3VyZV9yaW5nKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCit7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGFkaXMxNjIwNF9pbml0aWFsaXplX3Jpbmcoc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqcmluZykKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGFkaXMxNjIwNF91bmluaXRpYWxpemVfcmluZyhzdHJ1Y3QgaWlvX3JpbmdfYnVmZmVyICpyaW5nKQoreworfQorCisjZW5kaWYgLyogQ09ORklHX0lJT19SSU5HX0JVRkZFUiAqLworI2VuZGlmIC8qIFNQSV9BRElTMTYyMDRfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjA0X2NvcmUuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjA0X2NvcmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzE1ZTQwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyMDRfY29yZS5jCkBAIC0wLDAgKzEsNjEzIEBACisvKgorICogQURJUzE2MjA0IFByb2dyYW1tYWJsZSBIaWdoLWcgRGlnaXRhbCBJbXBhY3QgU2Vuc29yIGFuZCBSZWNvcmRlcgorICoKKyAqIENvcHlyaWdodCAyMDEwIEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNmcy5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKworI2luY2x1ZGUgIi4uL2lpby5oIgorI2luY2x1ZGUgIi4uL3N5c2ZzLmgiCisjaW5jbHVkZSAiYWNjZWwuaCIKKyNpbmNsdWRlICIuLi9neXJvL2d5cm8uaCIKKyNpbmNsdWRlICIuLi9hZGMvYWRjLmgiCisKKyNpbmNsdWRlICJhZGlzMTYyMDQuaCIKKworI2RlZmluZSBEUklWRVJfTkFNRQkJImFkaXMxNjIwNCIKKworc3RhdGljIGludCBhZGlzMTYyMDRfY2hlY2tfc3RhdHVzKHN0cnVjdCBkZXZpY2UgKmRldik7CisKKy8qKgorICogYWRpczE2MjA0X3NwaV93cml0ZV9yZWdfOCgpIC0gd3JpdGUgc2luZ2xlIGJ5dGUgdG8gYSByZWdpc3RlcgorICogQGRldjogZGV2aWNlIGFzc29jaWF0ZWQgd2l0aCBjaGlsZCBvZiBhY3R1YWwgZGV2aWNlIChpaW9fZGV2IG9yIGlpb190cmlnKQorICogQHJlZ19hZGRyZXNzOiB0aGUgYWRkcmVzcyBvZiB0aGUgcmVnaXN0ZXIgdG8gYmUgd3JpdHRlbgorICogQHZhbDogdGhlIHZhbHVlIHRvIHdyaXRlCisgKiovCitzdGF0aWMgaW50IGFkaXMxNjIwNF9zcGlfd3JpdGVfcmVnXzgoc3RydWN0IGRldmljZSAqZGV2LAorCQl1OCByZWdfYWRkcmVzcywKKwkJdTggdmFsKQoreworCWludCByZXQ7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZGlzMTYyMDRfc3RhdGUgKnN0ID0gaWlvX2Rldl9nZXRfZGV2ZGF0YShpbmRpb19kZXYpOworCisJbXV0ZXhfbG9jaygmc3QtPmJ1Zl9sb2NrKTsKKwlzdC0+dHhbMF0gPSBBRElTMTYyMDRfV1JJVEVfUkVHKHJlZ19hZGRyZXNzKTsKKwlzdC0+dHhbMV0gPSB2YWw7CisKKwlyZXQgPSBzcGlfd3JpdGUoc3QtPnVzLCBzdC0+dHgsIDIpOworCW11dGV4X3VubG9jaygmc3QtPmJ1Zl9sb2NrKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogYWRpczE2MjA0X3NwaV93cml0ZV9yZWdfMTYoKSAtIHdyaXRlIDIgYnl0ZXMgdG8gYSBwYWlyIG9mIHJlZ2lzdGVycworICogQGRldjogZGV2aWNlIGFzc29jaWF0ZWQgd2l0aCBjaGlsZCBvZiBhY3R1YWwgZGV2aWNlIChpaW9fZGV2IG9yIGlpb190cmlnKQorICogQHJlZ19hZGRyZXNzOiB0aGUgYWRkcmVzcyBvZiB0aGUgbG93ZXIgb2YgdGhlIHR3byByZWdpc3RlcnMuIFNlY29uZCByZWdpc3RlcgorICogICAgICAgICAgICAgICBpcyBhc3N1bWVkIHRvIGhhdmUgYWRkcmVzcyBvbmUgZ3JlYXRlci4KKyAqIEB2YWw6IHZhbHVlIHRvIGJlIHdyaXR0ZW4KKyAqKi8KK3N0YXRpYyBpbnQgYWRpczE2MjA0X3NwaV93cml0ZV9yZWdfMTYoc3RydWN0IGRldmljZSAqZGV2LAorCQl1OCBsb3dlcl9yZWdfYWRkcmVzcywKKwkJdTE2IHZhbHVlKQoreworCWludCByZXQ7CisJc3RydWN0IHNwaV9tZXNzYWdlIG1zZzsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkaXMxNjIwNF9zdGF0ZSAqc3QgPSBpaW9fZGV2X2dldF9kZXZkYXRhKGluZGlvX2Rldik7CisJc3RydWN0IHNwaV90cmFuc2ZlciB4ZmVyc1tdID0geworCQl7CisJCQkudHhfYnVmID0gc3QtPnR4LAorCQkJLmJpdHNfcGVyX3dvcmQgPSA4LAorCQkJLmxlbiA9IDIsCisJCQkuY3NfY2hhbmdlID0gMSwKKwkJfSwgeworCQkJLnR4X2J1ZiA9IHN0LT50eCArIDIsCisJCQkuYml0c19wZXJfd29yZCA9IDgsCisJCQkubGVuID0gMiwKKwkJCS5jc19jaGFuZ2UgPSAxLAorCQl9LAorCX07CisKKwltdXRleF9sb2NrKCZzdC0+YnVmX2xvY2spOworCXN0LT50eFswXSA9IEFESVMxNjIwNF9XUklURV9SRUcobG93ZXJfcmVnX2FkZHJlc3MpOworCXN0LT50eFsxXSA9IHZhbHVlICYgMHhGRjsKKwlzdC0+dHhbMl0gPSBBRElTMTYyMDRfV1JJVEVfUkVHKGxvd2VyX3JlZ19hZGRyZXNzICsgMSk7CisJc3QtPnR4WzNdID0gKHZhbHVlID4+IDgpICYgMHhGRjsKKworCXNwaV9tZXNzYWdlX2luaXQoJm1zZyk7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnhmZXJzWzBdLCAmbXNnKTsKKwlzcGlfbWVzc2FnZV9hZGRfdGFpbCgmeGZlcnNbMV0sICZtc2cpOworCXJldCA9IHNwaV9zeW5jKHN0LT51cywgJm1zZyk7CisJbXV0ZXhfdW5sb2NrKCZzdC0+YnVmX2xvY2spOworCisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBhZGlzMTYyMDRfc3BpX3JlYWRfcmVnXzE2KCkgLSByZWFkIDIgYnl0ZXMgZnJvbSBhIDE2LWJpdCByZWdpc3RlcgorICogQGRldjogZGV2aWNlIGFzc29jaWF0ZWQgd2l0aCBjaGlsZCBvZiBhY3R1YWwgZGV2aWNlIChpaW9fZGV2IG9yIGlpb190cmlnKQorICogQHJlZ19hZGRyZXNzOiB0aGUgYWRkcmVzcyBvZiB0aGUgbG93ZXIgb2YgdGhlIHR3byByZWdpc3RlcnMuIFNlY29uZCByZWdpc3RlcgorICogICAgICAgICAgICAgICBpcyBhc3N1bWVkIHRvIGhhdmUgYWRkcmVzcyBvbmUgZ3JlYXRlci4KKyAqIEB2YWw6IHNvbWV3aGVyZSB0byBwYXNzIGJhY2sgdGhlIHZhbHVlIHJlYWQKKyAqKi8KK3N0YXRpYyBpbnQgYWRpczE2MjA0X3NwaV9yZWFkX3JlZ18xNihzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXU4IGxvd2VyX3JlZ19hZGRyZXNzLAorCQl1MTYgKnZhbCkKK3sKKwlzdHJ1Y3Qgc3BpX21lc3NhZ2UgbXNnOworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWRpczE2MjA0X3N0YXRlICpzdCA9IGlpb19kZXZfZ2V0X2RldmRhdGEoaW5kaW9fZGV2KTsKKwlpbnQgcmV0OworCXN0cnVjdCBzcGlfdHJhbnNmZXIgeGZlcnNbXSA9IHsKKwkJeworCQkJLnR4X2J1ZiA9IHN0LT50eCwKKwkJCS5iaXRzX3Blcl93b3JkID0gOCwKKwkJCS5sZW4gPSAyLAorCQkJLmNzX2NoYW5nZSA9IDEsCisJCQkuZGVsYXlfdXNlY3MgPSAyMCwKKwkJfSwgeworCQkJLnJ4X2J1ZiA9IHN0LT5yeCwKKwkJCS5iaXRzX3Blcl93b3JkID0gOCwKKwkJCS5sZW4gPSAyLAorCQkJLmNzX2NoYW5nZSA9IDEsCisJCQkuZGVsYXlfdXNlY3MgPSAyMCwKKwkJfSwKKwl9OworCisJbXV0ZXhfbG9jaygmc3QtPmJ1Zl9sb2NrKTsKKwlzdC0+dHhbMF0gPSBBRElTMTYyMDRfUkVBRF9SRUcobG93ZXJfcmVnX2FkZHJlc3MpOworCXN0LT50eFsxXSA9IDA7CisKKwlzcGlfbWVzc2FnZV9pbml0KCZtc2cpOworCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZ4ZmVyc1swXSwgJm1zZyk7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnhmZXJzWzFdLCAmbXNnKTsKKwlyZXQgPSBzcGlfc3luYyhzdC0+dXMsICZtc2cpOworCWlmIChyZXQpIHsKKwkJZGV2X2Vycigmc3QtPnVzLT5kZXYsICJwcm9ibGVtIHdoZW4gcmVhZGluZyAxNiBiaXQgcmVnaXN0ZXIgMHglMDJYIiwKKwkJCQlsb3dlcl9yZWdfYWRkcmVzcyk7CisJCWdvdG8gZXJyb3JfcmV0OworCX0KKwkqdmFsID0gKHN0LT5yeFswXSA8PCA4KSB8IHN0LT5yeFsxXTsKKworZXJyb3JfcmV0OgorCW11dGV4X3VubG9jaygmc3QtPmJ1Zl9sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3NpemVfdCBhZGlzMTYyMDRfcmVhZF8xMmJpdF91bnNpZ25lZChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJaW50IHJldDsKKwl1MTYgdmFsID0gMDsKKwlzdHJ1Y3QgaWlvX2Rldl9hdHRyICp0aGlzX2F0dHIgPSB0b19paW9fZGV2X2F0dHIoYXR0cik7CisKKwlyZXQgPSBhZGlzMTYyMDRfc3BpX3JlYWRfcmVnXzE2KGRldiwgdGhpc19hdHRyLT5hZGRyZXNzLCAmdmFsKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJaWYgKHZhbCAmIEFESVMxNjIwNF9FUlJPUl9BQ1RJVkUpCisJCWFkaXMxNjIwNF9jaGVja19zdGF0dXMoZGV2KTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCB2YWwgJiAweDBGRkYpOworfQorCitzdGF0aWMgc3NpemVfdCBhZGlzMTYyMDRfcmVhZF90ZW1wKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3NpemVfdCByZXQ7CisJdTE2IHZhbDsKKworCS8qIFRha2UgdGhlIGlpb19kZXYgc3RhdHVzIGxvY2sgKi8KKwltdXRleF9sb2NrKCZpbmRpb19kZXYtPm1sb2NrKTsKKworCXJldCA9IGFkaXMxNjIwNF9zcGlfcmVhZF9yZWdfMTYoZGV2LCBBRElTMTYyMDRfVEVNUF9PVVQsICh1MTYgKikmdmFsKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3JldDsKKworCWlmICh2YWwgJiBBRElTMTYyMDRfRVJST1JfQUNUSVZFKQorCQlhZGlzMTYyMDRfY2hlY2tfc3RhdHVzKGRldik7CisKKwl2YWwgJj0gMHhGRkY7CisJcmV0ID0gc3ByaW50ZihidWYsICIlZFxuIiwgdmFsKTsKKworZXJyb3JfcmV0OgorCW11dGV4X3VubG9jaygmaW5kaW9fZGV2LT5tbG9jayk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QgYWRpczE2MjA0X3JlYWRfMTJiaXRfc2lnbmVkKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGlpb19kZXZfYXR0ciAqdGhpc19hdHRyID0gdG9faWlvX2Rldl9hdHRyKGF0dHIpOworCXMxNiB2YWwgPSAwOworCXNzaXplX3QgcmV0OworCisJbXV0ZXhfbG9jaygmaW5kaW9fZGV2LT5tbG9jayk7CisKKwlyZXQgPSBhZGlzMTYyMDRfc3BpX3JlYWRfcmVnXzE2KGRldiwgdGhpc19hdHRyLT5hZGRyZXNzLCAodTE2ICopJnZhbCk7CisJaWYgKCFyZXQpIHsKKwkJaWYgKHZhbCAmIEFESVMxNjIwNF9FUlJPUl9BQ1RJVkUpCisJCQlhZGlzMTYyMDRfY2hlY2tfc3RhdHVzKGRldik7CisKKwkJdmFsID0gKChzMTYpKHZhbCA8PCA0KSA+PiA0KTsKKwkJcmV0ID0gc3ByaW50ZihidWYsICIlZFxuIiwgdmFsKTsKKwl9CisKKwltdXRleF91bmxvY2soJmluZGlvX2Rldi0+bWxvY2spOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QgYWRpczE2MjA0X3JlYWRfMTRiaXRfc2lnbmVkKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGlpb19kZXZfYXR0ciAqdGhpc19hdHRyID0gdG9faWlvX2Rldl9hdHRyKGF0dHIpOworCXMxNiB2YWwgPSAwOworCXNzaXplX3QgcmV0OworCisJbXV0ZXhfbG9jaygmaW5kaW9fZGV2LT5tbG9jayk7CisKKwlyZXQgPSBhZGlzMTYyMDRfc3BpX3JlYWRfcmVnXzE2KGRldiwgdGhpc19hdHRyLT5hZGRyZXNzLCAodTE2ICopJnZhbCk7CisJaWYgKCFyZXQpIHsKKwkJaWYgKHZhbCAmIEFESVMxNjIwNF9FUlJPUl9BQ1RJVkUpCisJCQlhZGlzMTYyMDRfY2hlY2tfc3RhdHVzKGRldik7CisKKwkJdmFsID0gKChzMTYpKHZhbCA8PCAyKSA+PiAyKTsKKwkJcmV0ID0gc3ByaW50ZihidWYsICIlZFxuIiwgdmFsKTsKKwl9CisKKwltdXRleF91bmxvY2soJmluZGlvX2Rldi0+bWxvY2spOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QgYWRpczE2MjA0X3dyaXRlXzE2Yml0KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWlvX2Rldl9hdHRyICp0aGlzX2F0dHIgPSB0b19paW9fZGV2X2F0dHIoYXR0cik7CisJaW50IHJldDsKKwlsb25nIHZhbDsKKworCXJldCA9IHN0cmljdF9zdHJ0b2woYnVmLCAxMCwgJnZhbCk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9yZXQ7CisJcmV0ID0gYWRpczE2MjA0X3NwaV93cml0ZV9yZWdfMTYoZGV2LCB0aGlzX2F0dHItPmFkZHJlc3MsIHZhbCk7CisKK2Vycm9yX3JldDoKKwlyZXR1cm4gcmV0ID8gcmV0IDogbGVuOworfQorCitzdGF0aWMgaW50IGFkaXMxNjIwNF9yZXNldChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJaW50IHJldDsKKwlyZXQgPSBhZGlzMTYyMDRfc3BpX3dyaXRlX3JlZ184KGRldiwKKwkJCUFESVMxNjIwNF9HTE9CX0NNRCwKKwkJCUFESVMxNjIwNF9HTE9CX0NNRF9TV19SRVNFVCk7CisJaWYgKHJldCkKKwkJZGV2X2VycihkZXYsICJwcm9ibGVtIHJlc2V0dGluZyBkZXZpY2UiKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkaXMxNjIwNF93cml0ZV9yZXNldChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBsZW4pCit7CisJaWYgKGxlbiA8IDEpCisJCXJldHVybiAtRUlOVkFMOworCXN3aXRjaCAoYnVmWzBdKSB7CisJY2FzZSAnMSc6CisJY2FzZSAneSc6CisJY2FzZSAnWSc6CisJCXJldHVybiBhZGlzMTYyMDRfcmVzZXQoZGV2KTsKKwl9CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK2ludCBhZGlzMTYyMDRfc2V0X2lycShzdHJ1Y3QgZGV2aWNlICpkZXYsIGJvb2wgZW5hYmxlKQoreworCWludCByZXQgPSAwOworCXUxNiBtc2M7CisKKwlyZXQgPSBhZGlzMTYyMDRfc3BpX3JlYWRfcmVnXzE2KGRldiwgQURJUzE2MjA0X01TQ19DVFJMLCAmbXNjKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3JldDsKKworCW1zYyB8PSBBRElTMTYyMDRfTVNDX0NUUkxfQUNUSVZFX0hJR0g7CisJbXNjICY9IH5BRElTMTYyMDRfTVNDX0NUUkxfREFUQV9SRFlfRElPMjsKKwlpZiAoZW5hYmxlKQorCQltc2MgfD0gQURJUzE2MjA0X01TQ19DVFJMX0RBVEFfUkRZX0VOOworCWVsc2UKKwkJbXNjICY9IH5BRElTMTYyMDRfTVNDX0NUUkxfREFUQV9SRFlfRU47CisKKwlyZXQgPSBhZGlzMTYyMDRfc3BpX3dyaXRlX3JlZ18xNihkZXYsIEFESVMxNjIwNF9NU0NfQ1RSTCwgbXNjKTsKKworZXJyb3JfcmV0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYWRpczE2MjA0X2NoZWNrX3N0YXR1cyhzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJdTE2IHN0YXR1czsKKwlpbnQgcmV0OworCisJcmV0ID0gYWRpczE2MjA0X3NwaV9yZWFkX3JlZ18xNihkZXYsIEFESVMxNjIwNF9ESUFHX1NUQVQsICZzdGF0dXMpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoZGV2LCAiUmVhZGluZyBzdGF0dXMgZmFpbGVkXG4iKTsKKwkJZ290byBlcnJvcl9yZXQ7CisJfQorCXJldCA9IHN0YXR1cyAmIDB4MUY7CisKKwlpZiAoc3RhdHVzICYgQURJUzE2MjA0X0RJQUdfU1RBVF9TRUxGVEVTVF9GQUlMKQorCQlkZXZfZXJyKGRldiwgIlNlbGYgdGVzdCBmYWlsdXJlXG4iKTsKKwlpZiAoc3RhdHVzICYgQURJUzE2MjA0X0RJQUdfU1RBVF9TUElfRkFJTCkKKwkJZGV2X2VycihkZXYsICJTUEkgZmFpbHVyZVxuIik7CisJaWYgKHN0YXR1cyAmIEFESVMxNjIwNF9ESUFHX1NUQVRfRkxBU0hfVVBUKQorCQlkZXZfZXJyKGRldiwgIkZsYXNoIHVwZGF0ZSBmYWlsZWRcbiIpOworCWlmIChzdGF0dXMgJiBBRElTMTYyMDRfRElBR19TVEFUX1BPV0VSX0hJR0gpCisJCWRldl9lcnIoZGV2LCAiUG93ZXIgc3VwcGx5IGFib3ZlIDMuNjI1VlxuIik7CisJaWYgKHN0YXR1cyAmIEFESVMxNjIwNF9ESUFHX1NUQVRfUE9XRVJfTE9XKQorCQlkZXZfZXJyKGRldiwgIlBvd2VyIHN1cHBseSBiZWxvdyAyLjk3NVZcbiIpOworCitlcnJvcl9yZXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhZGlzMTYyMDRfc2VsZl90ZXN0KHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlpbnQgcmV0OworCXJldCA9IGFkaXMxNjIwNF9zcGlfd3JpdGVfcmVnXzE2KGRldiwKKwkJCUFESVMxNjIwNF9NU0NfQ1RSTCwKKwkJCUFESVMxNjIwNF9NU0NfQ1RSTF9TRUxGX1RFU1RfRU4pOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihkZXYsICJwcm9ibGVtIHN0YXJ0aW5nIHNlbGYgdGVzdCIpOworCQlnb3RvIGVycl9yZXQ7CisJfQorCisJYWRpczE2MjA0X2NoZWNrX3N0YXR1cyhkZXYpOworCitlcnJfcmV0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYWRpczE2MjA0X2luaXRpYWxfc2V0dXAoc3RydWN0IGFkaXMxNjIwNF9zdGF0ZSAqc3QpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmc3QtPmluZGlvX2Rldi0+ZGV2OworCisJLyogRGlzYWJsZSBJUlEgKi8KKwlyZXQgPSBhZGlzMTYyMDRfc2V0X2lycShkZXYsIGZhbHNlKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoZGV2LCAiZGlzYWJsZSBpcnEgZmFpbGVkIik7CisJCWdvdG8gZXJyX3JldDsKKwl9CisKKwkvKiBEbyBzZWxmIHRlc3QgKi8KKwlyZXQgPSBhZGlzMTYyMDRfc2VsZl90ZXN0KGRldik7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKGRldiwgInNlbGYgdGVzdCBmYWlsdXJlIik7CisJCWdvdG8gZXJyX3JldDsKKwl9CisKKwkvKiBSZWFkIHN0YXR1cyByZWdpc3RlciB0byBjaGVjayB0aGUgcmVzdWx0ICovCisJcmV0ID0gYWRpczE2MjA0X2NoZWNrX3N0YXR1cyhkZXYpOworCWlmIChyZXQpIHsKKwkJYWRpczE2MjA0X3Jlc2V0KGRldik7CisJCWRldl9lcnIoZGV2LCAiZGV2aWNlIG5vdCBwbGF5aW5nIGJhbGwgLT4gcmVzZXQiKTsKKwkJbXNsZWVwKEFESVMxNjIwNF9TVEFSVFVQX0RFTEFZKTsKKwkJcmV0ID0gYWRpczE2MjA0X2NoZWNrX3N0YXR1cyhkZXYpOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKGRldiwgImdpdmluZyB1cCIpOworCQkJZ290byBlcnJfcmV0OworCQl9CisJfQorCisJcHJpbnRrKEtFUk5fSU5GTyBEUklWRVJfTkFNRSAiOiBhdCBDUyVkIChpcnEgJWQpXG4iLAorCQkJc3QtPnVzLT5jaGlwX3NlbGVjdCwgc3QtPnVzLT5pcnEpOworCitlcnJfcmV0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBJSU9fREVWX0FUVFJfSU5fTkFNRURfUkFXKDAsIHN1cHBseSwgYWRpczE2MjA0X3JlYWRfMTJiaXRfdW5zaWduZWQsCisJCUFESVMxNjIwNF9TVVBQTFlfT1VUKTsKK3N0YXRpYyBJSU9fQ09OU1RfQVRUUihpbjBfc3VwcGx5X3NjYWxlLCAiMC4wMDEyMiIpOworc3RhdGljIElJT19ERVZfQVRUUl9JTl9SQVcoMSwgYWRpczE2MjA0X3JlYWRfMTJiaXRfdW5zaWduZWQsCisJCUFESVMxNjIwNF9BVVhfQURDKTsKK3N0YXRpYyBJSU9fQ09OU1RfQVRUUihpbjFfc2NhbGUsICIwLjAwMDYxIik7CisKK3N0YXRpYyBJSU9fREVWX0FUVFJfQUNDRUxfWChhZGlzMTYyMDRfcmVhZF8xNGJpdF9zaWduZWQsCisJCUFESVMxNjIwNF9YQUNDTF9PVVQpOworc3RhdGljIElJT19ERVZfQVRUUl9BQ0NFTF9ZKGFkaXMxNjIwNF9yZWFkXzE0Yml0X3NpZ25lZCwKKwkJQURJUzE2MjA0X1lBQ0NMX09VVCk7CitzdGF0aWMgSUlPX0RFVl9BVFRSX0FDQ0VMX1hZKGFkaXMxNjIwNF9yZWFkXzE0Yml0X3NpZ25lZCwKKwkJQURJUzE2MjA0X1hZX1JTU19PVVQpOworc3RhdGljIElJT19ERVZfQVRUUl9BQ0NFTF9YUEVBSyhhZGlzMTYyMDRfcmVhZF8xNGJpdF9zaWduZWQsCisJCUFESVMxNjIwNF9YX1BFQUtfT1VUKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfQUNDRUxfWVBFQUsoYWRpczE2MjA0X3JlYWRfMTRiaXRfc2lnbmVkLAorCQlBRElTMTYyMDRfWV9QRUFLX09VVCk7CitzdGF0aWMgSUlPX0RFVl9BVFRSX0FDQ0VMX1hZUEVBSyhhZGlzMTYyMDRfcmVhZF8xNGJpdF9zaWduZWQsCisJCUFESVMxNjIwNF9YWV9QRUFLX09VVCk7CitzdGF0aWMgSUlPX0RFVl9BVFRSX0FDQ0VMX1hfT0ZGU0VUKFNfSVdVU1IgfCBTX0lSVUdPLAorCQlhZGlzMTYyMDRfcmVhZF8xMmJpdF9zaWduZWQsCisJCWFkaXMxNjIwNF93cml0ZV8xNmJpdCwKKwkJQURJUzE2MjA0X1hBQ0NMX05VTEwpOworc3RhdGljIElJT19ERVZfQVRUUl9BQ0NFTF9ZX09GRlNFVChTX0lXVVNSIHwgU19JUlVHTywKKwkJYWRpczE2MjA0X3JlYWRfMTJiaXRfc2lnbmVkLAorCQlhZGlzMTYyMDRfd3JpdGVfMTZiaXQsCisJCUFESVMxNjIwNF9ZQUNDTF9OVUxMKTsKK3N0YXRpYyBJSU9fQ09OU1RfQVRUUihhY2NlbF94X3NjYWxlLCAiMC4wMTcxMjUiKTsKK3N0YXRpYyBJSU9fQ09OU1RfQVRUUihhY2NlbF95X3NjYWxlLCAiMC4wMDg0MDciKTsKK3N0YXRpYyBJSU9fQ09OU1RfQVRUUihhY2NlbF94eV9zY2FsZSwgIjAuMDE3MTI1Iik7CisKK3N0YXRpYyBJSU9fREVWX0FUVFJfVEVNUF9SQVcoYWRpczE2MjA0X3JlYWRfdGVtcCk7CitzdGF0aWMgSUlPX0NPTlNUX0FUVFIodGVtcF9vZmZzZXQsICIyNSIpOworc3RhdGljIElJT19DT05TVF9BVFRSKHRlbXBfc2NhbGUsICItMC40NyIpOworCitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKHJlc2V0LCBTX0lXVVNSLCBOVUxMLCBhZGlzMTYyMDRfd3JpdGVfcmVzZXQsIDApOworCitzdGF0aWMgSUlPX0NPTlNUX0FUVFIobmFtZSwgImFkaXMxNjIwNCIpOworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqYWRpczE2MjA0X2V2ZW50X2F0dHJpYnV0ZXNbXSA9IHsKKwlOVUxMCit9OworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBhZGlzMTYyMDRfZXZlbnRfYXR0cmlidXRlX2dyb3VwID0geworCS5hdHRycyA9IGFkaXMxNjIwNF9ldmVudF9hdHRyaWJ1dGVzLAorfTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmFkaXMxNjIwNF9hdHRyaWJ1dGVzW10gPSB7CisJJmlpb19kZXZfYXR0cl9pbjBfc3VwcGx5X3Jhdy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fY29uc3RfYXR0cl9pbjBfc3VwcGx5X3NjYWxlLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl90ZW1wX3Jhdy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fY29uc3RfYXR0cl90ZW1wX29mZnNldC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fY29uc3RfYXR0cl90ZW1wX3NjYWxlLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9yZXNldC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fY29uc3RfYXR0cl9uYW1lLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9pbjFfcmF3LmRldl9hdHRyLmF0dHIsCisJJmlpb19jb25zdF9hdHRyX2luMV9zY2FsZS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfYWNjZWxfeF9yYXcuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2FjY2VsX3lfcmF3LmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9hY2NlbF94eS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfYWNjZWxfeHBlYWsuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2FjY2VsX3lwZWFrLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9hY2NlbF94eXBlYWsuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2FjY2VsX3hfb2Zmc2V0LmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9hY2NlbF95X29mZnNldC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fY29uc3RfYXR0cl9hY2NlbF94X3NjYWxlLmRldl9hdHRyLmF0dHIsCisJJmlpb19jb25zdF9hdHRyX2FjY2VsX3lfc2NhbGUuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2NvbnN0X2F0dHJfYWNjZWxfeHlfc2NhbGUuZGV2X2F0dHIuYXR0ciwKKwlOVUxMCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBhZGlzMTYyMDRfYXR0cmlidXRlX2dyb3VwID0geworCS5hdHRycyA9IGFkaXMxNjIwNF9hdHRyaWJ1dGVzLAorfTsKKworc3RhdGljIGludCBfX2RldmluaXQgYWRpczE2MjA0X3Byb2JlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJaW50IHJldCwgcmVnZG9uZSA9IDA7CisJc3RydWN0IGFkaXMxNjIwNF9zdGF0ZSAqc3QgPSBremFsbG9jKHNpemVvZiAqc3QsIEdGUF9LRVJORUwpOworCWlmICghc3QpIHsKKwkJcmV0ID0gIC1FTk9NRU07CisJCWdvdG8gZXJyb3JfcmV0OworCX0KKwkvKiB0aGlzIGlzIG9ubHkgdXNlZCBmb3IgcmVtb3ZhbCBwdXJwb3NlcyAqLworCXNwaV9zZXRfZHJ2ZGF0YShzcGksIHN0KTsKKworCS8qIEFsbG9jYXRlIHRoZSBjb21tcyBidWZmZXJzICovCisJc3QtPnJ4ID0ga3phbGxvYyhzaXplb2YoKnN0LT5yeCkqQURJUzE2MjA0X01BWF9SWCwgR0ZQX0tFUk5FTCk7CisJaWYgKHN0LT5yeCA9PSBOVUxMKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3JfZnJlZV9zdDsKKwl9CisJc3QtPnR4ID0ga3phbGxvYyhzaXplb2YoKnN0LT50eCkqQURJUzE2MjA0X01BWF9UWCwgR0ZQX0tFUk5FTCk7CisJaWYgKHN0LT50eCA9PSBOVUxMKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3JfZnJlZV9yeDsKKwl9CisJc3QtPnVzID0gc3BpOworCW11dGV4X2luaXQoJnN0LT5idWZfbG9jayk7CisJLyogc2V0dXAgdGhlIGluZHVzdHJpYWxpbyBkcml2ZXIgYWxsb2NhdGVkIGVsZW1lbnRzICovCisJc3QtPmluZGlvX2RldiA9IGlpb19hbGxvY2F0ZV9kZXZpY2UoKTsKKwlpZiAoc3QtPmluZGlvX2RldiA9PSBOVUxMKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3JfZnJlZV90eDsKKwl9CisKKwlzdC0+aW5kaW9fZGV2LT5kZXYucGFyZW50ID0gJnNwaS0+ZGV2OworCXN0LT5pbmRpb19kZXYtPm51bV9pbnRlcnJ1cHRfbGluZXMgPSAxOworCXN0LT5pbmRpb19kZXYtPmV2ZW50X2F0dHJzID0gJmFkaXMxNjIwNF9ldmVudF9hdHRyaWJ1dGVfZ3JvdXA7CisJc3QtPmluZGlvX2Rldi0+YXR0cnMgPSAmYWRpczE2MjA0X2F0dHJpYnV0ZV9ncm91cDsKKwlzdC0+aW5kaW9fZGV2LT5kZXZfZGF0YSA9ICh2b2lkICopKHN0KTsKKwlzdC0+aW5kaW9fZGV2LT5kcml2ZXJfbW9kdWxlID0gVEhJU19NT0RVTEU7CisJc3QtPmluZGlvX2Rldi0+bW9kZXMgPSBJTkRJT19ESVJFQ1RfTU9ERTsKKworCXJldCA9IGFkaXMxNjIwNF9jb25maWd1cmVfcmluZyhzdC0+aW5kaW9fZGV2KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX2ZyZWVfZGV2OworCisJcmV0ID0gaWlvX2RldmljZV9yZWdpc3RlcihzdC0+aW5kaW9fZGV2KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3VucmVnX3JpbmdfZnVuY3M7CisJcmVnZG9uZSA9IDE7CisKKwlyZXQgPSBhZGlzMTYyMDRfaW5pdGlhbGl6ZV9yaW5nKHN0LT5pbmRpb19kZXYtPnJpbmcpOworCWlmIChyZXQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJmYWlsZWQgdG8gaW5pdGlhbGl6ZSB0aGUgcmluZ1xuIik7CisJCWdvdG8gZXJyb3JfdW5yZWdfcmluZ19mdW5jczsKKwl9CisKKwlpZiAoc3BpLT5pcnEpIHsKKwkJcmV0ID0gaWlvX3JlZ2lzdGVyX2ludGVycnVwdF9saW5lKHNwaS0+aXJxLAorCQkJCXN0LT5pbmRpb19kZXYsCisJCQkJMCwKKwkJCQlJUlFGX1RSSUdHRVJfUklTSU5HLAorCQkJCSJhZGlzMTYyMDQiKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJyb3JfdW5pbml0aWFsaXplX3Jpbmc7CisKKwkJcmV0ID0gYWRpczE2MjA0X3Byb2JlX3RyaWdnZXIoc3QtPmluZGlvX2Rldik7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycm9yX3VucmVnaXN0ZXJfbGluZTsKKwl9CisKKwkvKiBHZXQgdGhlIGRldmljZSBpbnRvIGEgc2FuZSBpbml0aWFsIHN0YXRlICovCisJcmV0ID0gYWRpczE2MjA0X2luaXRpYWxfc2V0dXAoc3QpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfcmVtb3ZlX3RyaWdnZXI7CisJcmV0dXJuIDA7CisKK2Vycm9yX3JlbW92ZV90cmlnZ2VyOgorCWFkaXMxNjIwNF9yZW1vdmVfdHJpZ2dlcihzdC0+aW5kaW9fZGV2KTsKK2Vycm9yX3VucmVnaXN0ZXJfbGluZToKKwlpZiAoc3BpLT5pcnEpCisJCWlpb191bnJlZ2lzdGVyX2ludGVycnVwdF9saW5lKHN0LT5pbmRpb19kZXYsIDApOworZXJyb3JfdW5pbml0aWFsaXplX3Jpbmc6CisJYWRpczE2MjA0X3VuaW5pdGlhbGl6ZV9yaW5nKHN0LT5pbmRpb19kZXYtPnJpbmcpOworZXJyb3JfdW5yZWdfcmluZ19mdW5jczoKKwlhZGlzMTYyMDRfdW5jb25maWd1cmVfcmluZyhzdC0+aW5kaW9fZGV2KTsKK2Vycm9yX2ZyZWVfZGV2OgorCWlmIChyZWdkb25lKQorCQlpaW9fZGV2aWNlX3VucmVnaXN0ZXIoc3QtPmluZGlvX2Rldik7CisJZWxzZQorCQlpaW9fZnJlZV9kZXZpY2Uoc3QtPmluZGlvX2Rldik7CitlcnJvcl9mcmVlX3R4OgorCWtmcmVlKHN0LT50eCk7CitlcnJvcl9mcmVlX3J4OgorCWtmcmVlKHN0LT5yeCk7CitlcnJvcl9mcmVlX3N0OgorCWtmcmVlKHN0KTsKK2Vycm9yX3JldDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFkaXMxNjIwNF9yZW1vdmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlzdHJ1Y3QgYWRpczE2MjA0X3N0YXRlICpzdCA9IHNwaV9nZXRfZHJ2ZGF0YShzcGkpOworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBzdC0+aW5kaW9fZGV2OworCisJZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKKworCWFkaXMxNjIwNF9yZW1vdmVfdHJpZ2dlcihpbmRpb19kZXYpOworCWlmIChzcGktPmlycSkKKwkJaWlvX3VucmVnaXN0ZXJfaW50ZXJydXB0X2xpbmUoaW5kaW9fZGV2LCAwKTsKKworCWFkaXMxNjIwNF91bmluaXRpYWxpemVfcmluZyhpbmRpb19kZXYtPnJpbmcpOworCWlpb19kZXZpY2VfdW5yZWdpc3RlcihpbmRpb19kZXYpOworCWFkaXMxNjIwNF91bmNvbmZpZ3VyZV9yaW5nKGluZGlvX2Rldik7CisJa2ZyZWUoc3QtPnR4KTsKKwlrZnJlZShzdC0+cngpOworCWtmcmVlKHN0KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNwaV9kcml2ZXIgYWRpczE2MjA0X2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJhZGlzMTYyMDQiLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwl9LAorCS5wcm9iZSA9IGFkaXMxNjIwNF9wcm9iZSwKKwkucmVtb3ZlID0gX19kZXZleGl0X3AoYWRpczE2MjA0X3JlbW92ZSksCit9OworCitzdGF0aWMgX19pbml0IGludCBhZGlzMTYyMDRfaW5pdCh2b2lkKQoreworCXJldHVybiBzcGlfcmVnaXN0ZXJfZHJpdmVyKCZhZGlzMTYyMDRfZHJpdmVyKTsKK30KK21vZHVsZV9pbml0KGFkaXMxNjIwNF9pbml0KTsKKworc3RhdGljIF9fZXhpdCB2b2lkIGFkaXMxNjIwNF9leGl0KHZvaWQpCit7CisJc3BpX3VucmVnaXN0ZXJfZHJpdmVyKCZhZGlzMTYyMDRfZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KGFkaXMxNjIwNF9leGl0KTsKKworTU9EVUxFX0FVVEhPUigiQmFycnkgU29uZyA8MjFjbmJhb0BnbWFpbC5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkFuYWxvZyBEZXZpY2VzIEFESVMxNjIwNCBQcm9ncmFtbWFibGUgSGlnaC1nIERpZ2l0YWwgSW1wYWN0IFNlbnNvciBhbmQgUmVjb3JkZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjA0X3JpbmcuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjA0X3JpbmcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjBiMTYwZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjA0X3JpbmcuYwpAQCAtMCwwICsxLDIwNiBAQAorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisKKyNpbmNsdWRlICIuLi9paW8uaCIKKyNpbmNsdWRlICIuLi9zeXNmcy5oIgorI2luY2x1ZGUgIi4uL3Jpbmdfc3cuaCIKKyNpbmNsdWRlICJhY2NlbC5oIgorI2luY2x1ZGUgIi4uL3RyaWdnZXIuaCIKKyNpbmNsdWRlICJhZGlzMTYyMDQuaCIKKworc3RhdGljIElJT19TQ0FOX0VMX0MoaW5fc3VwcGx5LCBBRElTMTYyMDRfU0NBTl9TVVBQTFksIEFESVMxNjIwNF9TVVBQTFlfT1VULCBOVUxMKTsKK3N0YXRpYyBJSU9fQ09OU1RfQVRUUl9TQ0FOX0VMX1RZUEUoaW5fc3VwcGx5LCB1LCAxMiwgMTYpOworc3RhdGljIElJT19TQ0FOX0VMX0MoYWNjZWxfeCwgQURJUzE2MjA0X1NDQU5fQUNDX1gsIEFESVMxNjIwNF9YQUNDTF9PVVQsIE5VTEwpOworc3RhdGljIElJT19TQ0FOX0VMX0MoYWNjZWxfeSwgQURJUzE2MjA0X1NDQU5fQUNDX1ksIEFESVMxNjIwNF9ZQUNDTF9PVVQsIE5VTEwpOworc3RhdGljIElJT19DT05TVF9BVFRSX1NDQU5fRUxfVFlQRShhY2NlbCwgcywgMTQsIDE2KTsKK3N0YXRpYyBJSU9fU0NBTl9FTF9DKGluMCwgQURJUzE2MjA0X1NDQU5fQVVYX0FEQywgQURJUzE2MjA0X0FVWF9BREMsIE5VTEwpOworc3RhdGljIElJT19DT05TVF9BVFRSX1NDQU5fRUxfVFlQRShpbjAsIHUsIDEyLCAxNik7CitzdGF0aWMgSUlPX1NDQU5fRUxfQyh0ZW1wLCBBRElTMTYyMDRfU0NBTl9URU1QLCBBRElTMTYyMDRfVEVNUF9PVVQsIE5VTEwpOworc3RhdGljIElJT19DT05TVF9BVFRSX1NDQU5fRUxfVFlQRSh0ZW1wLCB1LCAxMiwgMTYpOworc3RhdGljIElJT19TQ0FOX0VMX1RJTUVTVEFNUCg1KTsKK3N0YXRpYyBJSU9fQ09OU1RfQVRUUl9TQ0FOX0VMX1RZUEUodGltZXN0YW1wLCBzLCA2NCwgNjQpOworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqYWRpczE2MjA0X3NjYW5fZWxfYXR0cnNbXSA9IHsKKwkmaWlvX3NjYW5fZWxfaW5fc3VwcGx5LmRldl9hdHRyLmF0dHIsCisJJmlpb19jb25zdF9hdHRyX2luX3N1cHBseV9pbmRleC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fY29uc3RfYXR0cl9pbl9zdXBwbHlfdHlwZS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fc2Nhbl9lbF9hY2NlbF94LmRldl9hdHRyLmF0dHIsCisJJmlpb19jb25zdF9hdHRyX2FjY2VsX3hfaW5kZXguZGV2X2F0dHIuYXR0ciwKKwkmaWlvX3NjYW5fZWxfYWNjZWxfeS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fY29uc3RfYXR0cl9hY2NlbF95X2luZGV4LmRldl9hdHRyLmF0dHIsCisJJmlpb19jb25zdF9hdHRyX2FjY2VsX3R5cGUuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX3NjYW5fZWxfaW4wLmRldl9hdHRyLmF0dHIsCisJJmlpb19jb25zdF9hdHRyX2luMF9pbmRleC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fY29uc3RfYXR0cl9pbjBfdHlwZS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fc2Nhbl9lbF90ZW1wLmRldl9hdHRyLmF0dHIsCisJJmlpb19jb25zdF9hdHRyX3RlbXBfaW5kZXguZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2NvbnN0X2F0dHJfdGVtcF90eXBlLmRldl9hdHRyLmF0dHIsCisJJmlpb19zY2FuX2VsX3RpbWVzdGFtcC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fY29uc3RfYXR0cl90aW1lc3RhbXBfaW5kZXguZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2NvbnN0X2F0dHJfdGltZXN0YW1wX3R5cGUuZGV2X2F0dHIuYXR0ciwKKwlOVUxMLAorfTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgYWRpczE2MjA0X3NjYW5fZWxfZ3JvdXAgPSB7CisJLmF0dHJzID0gYWRpczE2MjA0X3NjYW5fZWxfYXR0cnMsCisJLm5hbWUgPSAic2Nhbl9lbGVtZW50cyIsCit9OworCisvKioKKyAqIGFkaXMxNjIwNF9wb2xsX2Z1bmNfdGgoKSB0b3AgaGFsZiBpbnRlcnJ1cHQgaGFuZGxlciBjYWxsZWQgYnkgdHJpZ2dlcgorICogQHByaXZhdGVfZGF0YToJaWlvX2RldgorICoqLworc3RhdGljIHZvaWQgYWRpczE2MjA0X3BvbGxfZnVuY190aChzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2LCBzNjQgdGltZXN0YW1wKQoreworCXN0cnVjdCBhZGlzMTYyMDRfc3RhdGUgKnN0ID0gaWlvX2Rldl9nZXRfZGV2ZGF0YShpbmRpb19kZXYpOworCXN0LT5sYXN0X3RpbWVzdGFtcCA9IHRpbWVzdGFtcDsKKwlzY2hlZHVsZV93b3JrKCZzdC0+d29ya190cmlnZ2VyX3RvX3JpbmcpOworfQorCisvKioKKyAqIGFkaXMxNjIwNF9yZWFkX3JpbmdfZGF0YSgpIHJlYWQgZGF0YSByZWdpc3RlcnMgd2hpY2ggd2lsbCBiZSBwbGFjZWQgaW50byByaW5nCisgKiBAZGV2OiBkZXZpY2UgYXNzb2NpYXRlZCB3aXRoIGNoaWxkIG9mIGFjdHVhbCBkZXZpY2UgKGlpb19kZXYgb3IgaWlvX3RyaWcpCisgKiBAcng6IHNvbWV3aGVyZSB0byBwYXNzIGJhY2sgdGhlIHZhbHVlIHJlYWQKKyAqKi8KK3N0YXRpYyBpbnQgYWRpczE2MjA0X3JlYWRfcmluZ19kYXRhKHN0cnVjdCBkZXZpY2UgKmRldiwgdTggKnJ4KQoreworCXN0cnVjdCBzcGlfbWVzc2FnZSBtc2c7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZGlzMTYyMDRfc3RhdGUgKnN0ID0gaWlvX2Rldl9nZXRfZGV2ZGF0YShpbmRpb19kZXYpOworCXN0cnVjdCBzcGlfdHJhbnNmZXIgeGZlcnNbQURJUzE2MjA0X09VVFBVVFMgKyAxXTsKKwlpbnQgcmV0OworCWludCBpOworCisJbXV0ZXhfbG9jaygmc3QtPmJ1Zl9sb2NrKTsKKworCXNwaV9tZXNzYWdlX2luaXQoJm1zZyk7CisKKwltZW1zZXQoeGZlcnMsIDAsIHNpemVvZih4ZmVycykpOworCWZvciAoaSA9IDA7IGkgPD0gQURJUzE2MjA0X09VVFBVVFM7IGkrKykgeworCQl4ZmVyc1tpXS5iaXRzX3Blcl93b3JkID0gODsKKwkJeGZlcnNbaV0uY3NfY2hhbmdlID0gMTsKKwkJeGZlcnNbaV0ubGVuID0gMjsKKwkJeGZlcnNbaV0uZGVsYXlfdXNlY3MgPSAyMDsKKwkJeGZlcnNbaV0udHhfYnVmID0gc3QtPnR4ICsgMiAqIGk7CisJCXN0LT50eFsyICogaV0gPSBBRElTMTYyMDRfUkVBRF9SRUcoQURJUzE2MjA0X1NVUFBMWV9PVVQgKyAyICogaSk7CisJCXN0LT50eFsyICogaSArIDFdID0gMDsKKwkJaWYgKGkgPj0gMSkKKwkJCXhmZXJzW2ldLnJ4X2J1ZiA9IHJ4ICsgMiAqIChpIC0gMSk7CisJCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZ4ZmVyc1tpXSwgJm1zZyk7CisJfQorCisJcmV0ID0gc3BpX3N5bmMoc3QtPnVzLCAmbXNnKTsKKwlpZiAocmV0KQorCQlkZXZfZXJyKCZzdC0+dXMtPmRldiwgInByb2JsZW0gd2hlbiBidXJzdCByZWFkaW5nIik7CisKKwltdXRleF91bmxvY2soJnN0LT5idWZfbG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKiBXaGlsc3QgdGhpcyBtYWtlcyBhIGxvdCBvZiBjYWxscyB0byBpaW9fc3dfcmluZyBmdW5jdGlvbnMgLSBpdCBpcyB0byBkZXZpY2UKKyAqIHNwZWNpZmljIHRvIGJlIHJvbGxlZCBpbnRvIHRoZSBjb3JlLgorICovCitzdGF0aWMgdm9pZCBhZGlzMTYyMDRfdHJpZ2dlcl9iaF90b19yaW5nKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29ya19zKQoreworCXN0cnVjdCBhZGlzMTYyMDRfc3RhdGUgKnN0CisJCT0gY29udGFpbmVyX29mKHdvcmtfcywgc3RydWN0IGFkaXMxNjIwNF9zdGF0ZSwKKwkJCSAgICAgICB3b3JrX3RyaWdnZXJfdG9fcmluZyk7CisJc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqcmluZyA9IHN0LT5pbmRpb19kZXYtPnJpbmc7CisKKwlpbnQgaSA9IDA7CisJczE2ICpkYXRhOworCXNpemVfdCBkYXRhc2l6ZSA9IHJpbmctPmFjY2Vzcy5nZXRfYnl0ZXNfcGVyX2RhdHVtKHJpbmcpOworCisJZGF0YSA9IGttYWxsb2MoZGF0YXNpemUsIEdGUF9LRVJORUwpOworCWlmIChkYXRhID09IE5VTEwpIHsKKwkJZGV2X2Vycigmc3QtPnVzLT5kZXYsICJtZW1vcnkgYWxsb2MgZmFpbGVkIGluIHJpbmcgYmgiKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChyaW5nLT5zY2FuX2NvdW50KQorCQlpZiAoYWRpczE2MjA0X3JlYWRfcmluZ19kYXRhKCZzdC0+aW5kaW9fZGV2LT5kZXYsIHN0LT5yeCkgPj0gMCkKKwkJCWZvciAoOyBpIDwgcmluZy0+c2Nhbl9jb3VudDsgaSsrKQorCQkJCWRhdGFbaV0gPSBiZTE2X3RvX2NwdXAoCisJCQkJCShfX2JlMTYgKikmKHN0LT5yeFtpKjJdKSk7CisKKwkvKiBHdWFyYW50ZWVkIHRvIGJlIGFsaWduZWQgd2l0aCA4IGJ5dGUgYm91bmRhcnkgKi8KKwlpZiAocmluZy0+c2Nhbl90aW1lc3RhbXApCisJCSooKHM2NCAqKShkYXRhICsgKChpICsgMykvNCkqNCkpID0gc3QtPmxhc3RfdGltZXN0YW1wOworCisJcmluZy0+YWNjZXNzLnN0b3JlX3RvKHJpbmcsCisJCQkgICAgICAodTggKilkYXRhLAorCQkJICAgICAgc3QtPmxhc3RfdGltZXN0YW1wKTsKKworCWlpb190cmlnZ2VyX25vdGlmeV9kb25lKHN0LT5pbmRpb19kZXYtPnRyaWcpOworCWtmcmVlKGRhdGEpOworCisJcmV0dXJuOworfQorCit2b2lkIGFkaXMxNjIwNF91bmNvbmZpZ3VyZV9yaW5nKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCit7CisJa2ZyZWUoaW5kaW9fZGV2LT5wb2xsZnVuYyk7CisJaWlvX3N3X3JiX2ZyZWUoaW5kaW9fZGV2LT5yaW5nKTsKK30KKworaW50IGFkaXMxNjIwNF9jb25maWd1cmVfcmluZyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQoreworCWludCByZXQgPSAwOworCXN0cnVjdCBhZGlzMTYyMDRfc3RhdGUgKnN0ID0gaW5kaW9fZGV2LT5kZXZfZGF0YTsKKwlzdHJ1Y3QgaWlvX3JpbmdfYnVmZmVyICpyaW5nOworCUlOSVRfV09SSygmc3QtPndvcmtfdHJpZ2dlcl90b19yaW5nLCBhZGlzMTYyMDRfdHJpZ2dlcl9iaF90b19yaW5nKTsKKworCXJpbmcgPSBpaW9fc3dfcmJfYWxsb2NhdGUoaW5kaW9fZGV2KTsKKwlpZiAoIXJpbmcpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJcmV0dXJuIHJldDsKKwl9CisJaW5kaW9fZGV2LT5yaW5nID0gcmluZzsKKwkvKiBFZmZlY3RpdmVseSBzZWxlY3QgdGhlIHJpbmcgYnVmZmVyIGltcGxlbWVudGF0aW9uICovCisJaWlvX3Jpbmdfc3dfcmVnaXN0ZXJfZnVuY3MoJnJpbmctPmFjY2Vzcyk7CisJcmluZy0+YnBlID0gMjsKKwlyaW5nLT5zY2FuX2VsX2F0dHJzID0gJmFkaXMxNjIwNF9zY2FuX2VsX2dyb3VwOworCXJpbmctPnNjYW5fdGltZXN0YW1wID0gdHJ1ZTsKKwlyaW5nLT5wcmVlbmFibGUgPSAmaWlvX3N3X3JpbmdfcHJlZW5hYmxlOworCXJpbmctPnBvc3RlbmFibGUgPSAmaWlvX3RyaWdnZXJlZF9yaW5nX3Bvc3RlbmFibGU7CisJcmluZy0+cHJlZGlzYWJsZSA9ICZpaW9fdHJpZ2dlcmVkX3JpbmdfcHJlZGlzYWJsZTsKKwlyaW5nLT5vd25lciA9IFRISVNfTU9EVUxFOworCisJLyogU2V0IGRlZmF1bHQgc2NhbiBtb2RlICovCisJaWlvX3NjYW5fbWFza19zZXQocmluZywgaWlvX3NjYW5fZWxfaW5fc3VwcGx5Lm51bWJlcik7CisJaWlvX3NjYW5fbWFza19zZXQocmluZywgaWlvX3NjYW5fZWxfYWNjZWxfeC5udW1iZXIpOworCWlpb19zY2FuX21hc2tfc2V0KHJpbmcsIGlpb19zY2FuX2VsX2FjY2VsX3kubnVtYmVyKTsKKwlpaW9fc2Nhbl9tYXNrX3NldChyaW5nLCBpaW9fc2Nhbl9lbF90ZW1wLm51bWJlcik7CisJaWlvX3NjYW5fbWFza19zZXQocmluZywgaWlvX3NjYW5fZWxfaW4wLm51bWJlcik7CisKKwlyZXQgPSBpaW9fYWxsb2NfcG9sbGZ1bmMoaW5kaW9fZGV2LCBOVUxMLCAmYWRpczE2MjA0X3BvbGxfZnVuY190aCk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9paW9fc3dfcmJfZnJlZTsKKworCWluZGlvX2Rldi0+bW9kZXMgfD0gSU5ESU9fUklOR19UUklHR0VSRUQ7CisJcmV0dXJuIDA7CisKK2Vycm9yX2lpb19zd19yYl9mcmVlOgorCWlpb19zd19yYl9mcmVlKGluZGlvX2Rldi0+cmluZyk7CisJcmV0dXJuIHJldDsKK30KKworaW50IGFkaXMxNjIwNF9pbml0aWFsaXplX3Jpbmcoc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqcmluZykKK3sKKwlyZXR1cm4gaWlvX3JpbmdfYnVmZmVyX3JlZ2lzdGVyKHJpbmcsIDApOworfQorCit2b2lkIGFkaXMxNjIwNF91bmluaXRpYWxpemVfcmluZyhzdHJ1Y3QgaWlvX3JpbmdfYnVmZmVyICpyaW5nKQoreworCWlpb19yaW5nX2J1ZmZlcl91bnJlZ2lzdGVyKHJpbmcpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyMDRfdHJpZ2dlci5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyMDRfdHJpZ2dlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlOWRiOTAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FkaXMxNjIwNF90cmlnZ2VyLmMKQEAgLTAsMCArMSwxMjIgQEAKKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKworI2luY2x1ZGUgIi4uL2lpby5oIgorI2luY2x1ZGUgIi4uL3N5c2ZzLmgiCisjaW5jbHVkZSAiLi4vdHJpZ2dlci5oIgorI2luY2x1ZGUgImFkaXMxNjIwNC5oIgorCisvKioKKyAqIGFkaXMxNjIwNF9kYXRhX3JkeV90cmlnX3BvbGwoKSB0aGUgZXZlbnQgaGFuZGxlciBmb3IgdGhlIGRhdGEgcmR5IHRyaWcKKyAqKi8KK3N0YXRpYyBpbnQgYWRpczE2MjA0X2RhdGFfcmR5X3RyaWdfcG9sbChzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8sCisJCQkJICAgICAgIGludCBpbmRleCwKKwkJCQkgICAgICAgczY0IHRpbWVzdGFtcCwKKwkJCQkgICAgICAgaW50IG5vX3Rlc3QpCit7CisJc3RydWN0IGFkaXMxNjIwNF9zdGF0ZSAqc3QgPSBpaW9fZGV2X2dldF9kZXZkYXRhKGRldl9pbmZvKTsKKwlzdHJ1Y3QgaWlvX3RyaWdnZXIgKnRyaWcgPSBzdC0+dHJpZzsKKworCWlpb190cmlnZ2VyX3BvbGwodHJpZywgdGltZXN0YW1wKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworSUlPX0VWRU5UX1NIKGRhdGFfcmR5X3RyaWcsICZhZGlzMTYyMDRfZGF0YV9yZHlfdHJpZ19wb2xsKTsKKworc3RhdGljIERFVklDRV9BVFRSKG5hbWUsIFNfSVJVR08sIGlpb190cmlnZ2VyX3JlYWRfbmFtZSwgTlVMTCk7CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICphZGlzMTYyMDRfdHJpZ2dlcl9hdHRyc1tdID0geworCSZkZXZfYXR0cl9uYW1lLmF0dHIsCisJTlVMTCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGFkaXMxNjIwNF90cmlnZ2VyX2F0dHJfZ3JvdXAgPSB7CisJLmF0dHJzID0gYWRpczE2MjA0X3RyaWdnZXJfYXR0cnMsCit9OworCisvKioKKyAqIGFkaXMxNjIwNF9kYXRhX3JkeV90cmlnZ2VyX3NldF9zdGF0ZSgpIHNldCBkYXRhcmR5IGludGVycnVwdCBzdGF0ZQorICoqLworc3RhdGljIGludCBhZGlzMTYyMDRfZGF0YV9yZHlfdHJpZ2dlcl9zZXRfc3RhdGUoc3RydWN0IGlpb190cmlnZ2VyICp0cmlnLAorCQkJCQkJYm9vbCBzdGF0ZSkKK3sKKwlzdHJ1Y3QgYWRpczE2MjA0X3N0YXRlICpzdCA9IHRyaWctPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gc3QtPmluZGlvX2RldjsKKwlpbnQgcmV0ID0gMDsKKworCWRldl9kYmcoJmluZGlvX2Rldi0+ZGV2LCAiJXMgKCVkKVxuIiwgX19mdW5jX18sIHN0YXRlKTsKKwlyZXQgPSBhZGlzMTYyMDRfc2V0X2lycSgmc3QtPmluZGlvX2Rldi0+ZGV2LCBzdGF0ZSk7CisJaWYgKHN0YXRlID09IGZhbHNlKSB7CisJCWlpb19yZW1vdmVfZXZlbnRfZnJvbV9saXN0KCZpaW9fZXZlbnRfZGF0YV9yZHlfdHJpZywKKwkJCQkJICAgJmluZGlvX2Rldi0+aW50ZXJydXB0c1swXQorCQkJCQkgICAtPmV2X2xpc3QpOworCQlmbHVzaF9zY2hlZHVsZWRfd29yaygpOworCX0gZWxzZSB7CisJCWlpb19hZGRfZXZlbnRfdG9fbGlzdCgmaWlvX2V2ZW50X2RhdGFfcmR5X3RyaWcsCisJCQkJICAgICAgJmluZGlvX2Rldi0+aW50ZXJydXB0c1swXS0+ZXZfbGlzdCk7CisJfQorCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogYWRpczE2MjA0X3RyaWdfdHJ5X3JlZW4oKSB0cnkgcmVuYWJsaW5nIGlycSBmb3IgZGF0YSByZHkgdHJpZ2dlcgorICogQHRyaWc6CXRoZSBkYXRhcmR5IHRyaWdnZXIKKyAqKi8KK3N0YXRpYyBpbnQgYWRpczE2MjA0X3RyaWdfdHJ5X3JlZW4oc3RydWN0IGlpb190cmlnZ2VyICp0cmlnKQoreworCXN0cnVjdCBhZGlzMTYyMDRfc3RhdGUgKnN0ID0gdHJpZy0+cHJpdmF0ZV9kYXRhOworCWVuYWJsZV9pcnEoc3QtPnVzLT5pcnEpOworCXJldHVybiAwOworfQorCitpbnQgYWRpczE2MjA0X3Byb2JlX3RyaWdnZXIoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBhZGlzMTYyMDRfc3RhdGUgKnN0ID0gaW5kaW9fZGV2LT5kZXZfZGF0YTsKKworCXN0LT50cmlnID0gaWlvX2FsbG9jYXRlX3RyaWdnZXIoKTsKKwlzdC0+dHJpZy0+bmFtZSA9IGthc3ByaW50ZihHRlBfS0VSTkVMLAorCQkJCSJhZGlzMTYyMDQtZGV2JWQiLAorCQkJCWluZGlvX2Rldi0+aWQpOworCWlmICghc3QtPnRyaWctPm5hbWUpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJvcl9mcmVlX3RyaWc7CisJfQorCXN0LT50cmlnLT5kZXYucGFyZW50ID0gJnN0LT51cy0+ZGV2OworCXN0LT50cmlnLT5vd25lciA9IFRISVNfTU9EVUxFOworCXN0LT50cmlnLT5wcml2YXRlX2RhdGEgPSBzdDsKKwlzdC0+dHJpZy0+c2V0X3RyaWdnZXJfc3RhdGUgPSAmYWRpczE2MjA0X2RhdGFfcmR5X3RyaWdnZXJfc2V0X3N0YXRlOworCXN0LT50cmlnLT50cnlfcmVlbmFibGUgPSAmYWRpczE2MjA0X3RyaWdfdHJ5X3JlZW47CisJc3QtPnRyaWctPmNvbnRyb2xfYXR0cnMgPSAmYWRpczE2MjA0X3RyaWdnZXJfYXR0cl9ncm91cDsKKwlyZXQgPSBpaW9fdHJpZ2dlcl9yZWdpc3RlcihzdC0+dHJpZyk7CisKKwkvKiBzZWxlY3QgZGVmYXVsdCB0cmlnZ2VyICovCisJaW5kaW9fZGV2LT50cmlnID0gc3QtPnRyaWc7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9mcmVlX3RyaWdfbmFtZTsKKworCXJldHVybiAwOworCitlcnJvcl9mcmVlX3RyaWdfbmFtZToKKwlrZnJlZShzdC0+dHJpZy0+bmFtZSk7CitlcnJvcl9mcmVlX3RyaWc6CisJaWlvX2ZyZWVfdHJpZ2dlcihzdC0+dHJpZyk7CisKKwlyZXR1cm4gcmV0OworfQorCit2b2lkIGFkaXMxNjIwNF9yZW1vdmVfdHJpZ2dlcihzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQoreworCXN0cnVjdCBhZGlzMTYyMDRfc3RhdGUgKnN0YXRlID0gaW5kaW9fZGV2LT5kZXZfZGF0YTsKKworCWlpb190cmlnZ2VyX3VucmVnaXN0ZXIoc3RhdGUtPnRyaWcpOworCWtmcmVlKHN0YXRlLT50cmlnLT5uYW1lKTsKKwlpaW9fZnJlZV90cmlnZ2VyKHN0YXRlLT50cmlnKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjA5X3JpbmcuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjA5X3JpbmcuYwppbmRleCAwMzMxMzVjLi44ZWJhMGFmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FkaXMxNjIwOV9yaW5nLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyMDlfcmluZy5jCkBAIC0xMDUsNyArMTA1LDcgQEAKIAkJeGZlcnNbaV0uYml0c19wZXJfd29yZCA9IDg7CiAJCXhmZXJzW2ldLmNzX2NoYW5nZSA9IDE7CiAJCXhmZXJzW2ldLmxlbiA9IDI7Ci0JCXhmZXJzW2ldLmRlbGF5X3VzZWNzID0gMjA7CisJCXhmZXJzW2ldLmRlbGF5X3VzZWNzID0gMzA7CiAJCXhmZXJzW2ldLnR4X2J1ZiA9IHN0LT50eCArIDIgKiBpOwogCQlzdC0+dHhbMiAqIGldCiAJCQk9IEFESVMxNjIwOV9SRUFEX1JFRyhBRElTMTYyMDlfU1VQUExZX09VVCArIDIgKiBpKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvbGlzM2wwMmRxX3JpbmcuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvbGlzM2wwMmRxX3JpbmcuYwppbmRleCAzMzBkNWQ2Li4xZmQwODhhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2xpczNsMDJkcV9yaW5nLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9saXMzbDAyZHFfcmluZy5jCkBAIC01MTcsNyArNTE3LDcgQEAKIAogCXJldCA9IGlpb19hbGxvY19wb2xsZnVuYyhpbmRpb19kZXYsIE5VTEwsICZsaXMzbDAyZHFfcG9sbF9mdW5jX3RoKTsKIAlpZiAocmV0KQotCQlnb3RvIGVycm9yX2lpb19zd19yYl9mcmVlOzsKKwkJZ290byBlcnJvcl9paW9fc3dfcmJfZnJlZTsKIAlpbmRpb19kZXYtPm1vZGVzIHw9IElORElPX1JJTkdfVFJJR0dFUkVEOwogCXJldHVybiAwOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9LY29uZmlnIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvS2NvbmZpZwppbmRleCBhY2I2NzY3Li44Njg2OWNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9LY29uZmlnCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRjL0tjb25maWcKQEAgLTI3LDYgKzI3LDQxIEBACiAJICBTYXkgeWVzIGhlcmUgdG8gaW5jbHVkZSByaW5nIGJ1ZmZlciBzdXBwb3J0IGluIHRoZSBNQVgxMzYzCiAJICBBREMgZHJpdmVyLgogCitjb25maWcgQUQ3MTUwCisJdHJpc3RhdGUgIkFuYWxvZyBEZXZpY2VzIGFkNzE1MC8xLzYgY2FwYWNpdGl2ZSBzZW5zb3IgZHJpdmVyIgorCWRlcGVuZHMgb24gSTJDCisJaGVscAorCSAgU2F5IHllcyBoZXJlIHRvIGJ1aWxkIHN1cHBvcnQgZm9yIEFuYWxvZyBEZXZpY2VzIGNhcGFjaXRpdmUgc2Vuc29ycy4KKwkgIChhZDcxNTAsIGFkNzE1MSwgYWQ3MTU2KSBQcm92aWRlcyBkaXJlY3QgYWNjZXNzIHZpYSBzeXNmcy4KKworY29uZmlnIEFENzE1MgorCXRyaXN0YXRlICJBbmFsb2cgRGV2aWNlcyBhZDcxNTIvMyBjYXBhY2l0aXZlIHNlbnNvciBkcml2ZXIiCisJZGVwZW5kcyBvbiBJMkMKKwloZWxwCisJICBTYXkgeWVzIGhlcmUgdG8gYnVpbGQgc3VwcG9ydCBmb3IgQW5hbG9nIERldmljZXMgY2FwYWNpdGl2ZSBzZW5zb3JzLgorCSAgKGFkNzE1MiwgYWQ3MTUzKSBQcm92aWRlcyBkaXJlY3QgYWNjZXNzIHZpYSBzeXNmcy4KKworY29uZmlnIEFENzI5MQorCXRyaXN0YXRlICJBbmFsb2cgRGV2aWNlcyBBRDcyOTEgdGVtcGVyYXR1cmUgc2Vuc29yIGRyaXZlciIKKwlkZXBlbmRzIG9uIEkyQworCWhlbHAKKwkgIFNheSB5ZXMgaGVyZSB0byBidWlsZCBzdXBwb3J0IGZvciBBbmFsb2cgRGV2aWNlcyBBRDcyOTEKKwkgIHRlbXBlcmF0dXJlIHNlbnNvcnMuCisKK2NvbmZpZyBBRDcyOTgKKwl0cmlzdGF0ZSAiQW5hbG9nIERldmljZXMgQUQ3Mjk4IHRlbXBlcmF0dXJlIHNlbnNvciBhbmQgQURDIGRyaXZlciIKKwlkZXBlbmRzIG9uIFNQSQorCWhlbHAKKwkgIFNheSB5ZXMgaGVyZSB0byBidWlsZCBzdXBwb3J0IGZvciBBbmFsb2cgRGV2aWNlcyBBRDcyOTgKKwkgIHRlbXBlcmF0dXJlIHNlbnNvcnMgYW5kIEFEQy4KKworY29uZmlnIEFENzMxNAorCXRyaXN0YXRlICJBbmFsb2cgRGV2aWNlcyBBRDczMTQgdGVtcGVyYXR1cmUgc2Vuc29yIGRyaXZlciIKKwlkZXBlbmRzIG9uIFNQSQorCWhlbHAKKwkgIFNheSB5ZXMgaGVyZSB0byBidWlsZCBzdXBwb3J0IGZvciBBbmFsb2cgRGV2aWNlcyBBRDczMTQKKwkgIHRlbXBlcmF0dXJlIHNlbnNvcnMuCisKIGNvbmZpZyBBRDc5OVgKIAl0cmlzdGF0ZSAiQW5hbG9nIERldmljZXMgQUQ3OTl4IEFEQyBkcml2ZXIiCiAJZGVwZW5kcyBvbiBJMkMKQEAgLTUwLDkgKzg1LDkgQEAKIGNvbmZpZyBBRDc0NzYKIAl0cmlzdGF0ZSAiQW5hbG9nIERldmljZXMgQUQ3NDc1LzYvNy84IEFENzQ2Ni83LzggYW5kIEFENzQ5NSBBREMgZHJpdmVyIgogCWRlcGVuZHMgb24gU1BJCi0Jc2VsZWN0IElJT19SSU5HX0JVRkZFUgkKKwlzZWxlY3QgSUlPX1JJTkdfQlVGRkVSCiAJc2VsZWN0IElJT19TV19SSU5HCi0Jc2VsZWN0IElJT19UUklHR0VSIAkKKwlzZWxlY3QgSUlPX1RSSUdHRVIKIAloZWxwCiAJICBTYXkgeWVzIGhlcmUgdG8gYnVpbGQgc3VwcG9ydCBmb3IgQW5hbG9nIERldmljZXMKIAkgIEFENzQ3NSwgQUQ3NDc2LCBBRDc0NzcsIEFENzQ3OCwgQUQ3NDY2LCBBRDc0NjcsIEFENzQ2OCwgQUQ3NDk1CkBAIC02MSwzICs5Niw1NSBAQAogCiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKIAkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBhZDc0NzYuCisKK2NvbmZpZyBBRDc4ODcKKwl0cmlzdGF0ZSAiQW5hbG9nIERldmljZXMgQUQ3ODg3IEFEQyBkcml2ZXIiCisJZGVwZW5kcyBvbiBTUEkKKwlzZWxlY3QgSUlPX1JJTkdfQlVGRkVSCisJc2VsZWN0IElJT19TV19SSU5HCisJc2VsZWN0IElJT19UUklHR0VSCisJaGVscAorCSAgU2F5IHllcyBoZXJlIHRvIGJ1aWxkIHN1cHBvcnQgZm9yIEFuYWxvZyBEZXZpY2VzCisJICBBRDc4ODcgU1BJIGFuYWxvZyB0byBkaWdpdGFsIGNvbnZlcnRvciAoQURDKS4KKwkgIElmIHVuc3VyZSwgc2F5IE4gKGJ1dCBpdCdzIHNhZmUgdG8gc2F5ICJZIikuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGFkNzg4Ny4KKworY29uZmlnIEFENzc0NQorCXRyaXN0YXRlICJBbmFsb2cgRGV2aWNlcyBBRDc3NDUsIEFENzc0NiBBRDc3NDcgY2FwYWNpdGl2ZSBzZW5zb3IgZHJpdmVyIgorCWRlcGVuZHMgb24gSTJDCisJaGVscAorCSAgU2F5IHllcyBoZXJlIHRvIGJ1aWxkIHN1cHBvcnQgZm9yIEFuYWxvZyBEZXZpY2VzIGNhcGFjaXRpdmUgc2Vuc29ycy4KKwkgIChBRDc3NDUsIEFENzc0NiwgQUQ3NzQ3KSBQcm92aWRlcyBkaXJlY3QgYWNjZXNzIHZpYSBzeXNmcy4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgYWQ3NzQ1LgorCitjb25maWcgQUQ3ODE2CisJdHJpc3RhdGUgIkFuYWxvZyBEZXZpY2VzIEFENzgxNi83LzggdGVtcGVyYXR1cmUgc2Vuc29yIGFuZCBBREMgZHJpdmVyIgorCWRlcGVuZHMgb24gU1BJCisJaGVscAorCSAgU2F5IHllcyBoZXJlIHRvIGJ1aWxkIHN1cHBvcnQgZm9yIEFuYWxvZyBEZXZpY2VzIEFENzgxNi83LzgKKwkgIHRlbXBlcmF0dXJlIHNlbnNvcnMgYW5kIEFEQy4KKworY29uZmlnIEFEVDc1CisJdHJpc3RhdGUgIkFuYWxvZyBEZXZpY2VzIEFEVDc1IHRlbXBlcmF0dXJlIHNlbnNvciBkcml2ZXIiCisJZGVwZW5kcyBvbiBJMkMKKwloZWxwCisJICBTYXkgeWVzIGhlcmUgdG8gYnVpbGQgc3VwcG9ydCBmb3IgQW5hbG9nIERldmljZXMgQURUNzUKKwkgIHRlbXBlcmF0dXJlIHNlbnNvcnMuCisKK2NvbmZpZyBBRFQ3MzEwCisJdHJpc3RhdGUgIkFuYWxvZyBEZXZpY2VzIEFEVDczMTAgdGVtcGVyYXR1cmUgc2Vuc29yIGRyaXZlciIKKwlkZXBlbmRzIG9uIFNQSQorCWhlbHAKKwkgIFNheSB5ZXMgaGVyZSB0byBidWlsZCBzdXBwb3J0IGZvciBBbmFsb2cgRGV2aWNlcyBBRFQ3MzEwCisJICB0ZW1wZXJhdHVyZSBzZW5zb3JzLgorCitjb25maWcgQURUNzQxMAorCXRyaXN0YXRlICJBbmFsb2cgRGV2aWNlcyBBRFQ3NDEwIHRlbXBlcmF0dXJlIHNlbnNvciBkcml2ZXIiCisJZGVwZW5kcyBvbiBJMkMKKwloZWxwCisJICBTYXkgeWVzIGhlcmUgdG8gYnVpbGQgc3VwcG9ydCBmb3IgQW5hbG9nIERldmljZXMgQURUNzQxMAorCSAgdGVtcGVyYXR1cmUgc2Vuc29ycy4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRjL01ha2VmaWxlIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvTWFrZWZpbGUKaW5kZXggYjYyYzMxOWIuLjZmMjMxYTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRjL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRjL01ha2VmaWxlCkBAIC0xNCwzICsxNCwxOCBAQAogYWQ3NDc2LXkgOj0gYWQ3NDc2X2NvcmUubwogYWQ3NDc2LSQoQ09ORklHX0lJT19SSU5HX0JVRkZFUikgKz0gYWQ3NDc2X3Jpbmcubwogb2JqLSQoQ09ORklHX0FENzQ3NikgKz0gYWQ3NDc2Lm8KKworYWQ3ODg3LXkgOj0gYWQ3ODg3X2NvcmUubworYWQ3ODg3LSQoQ09ORklHX0lJT19SSU5HX0JVRkZFUikgKz0gYWQ3ODg3X3Jpbmcubworb2JqLSQoQ09ORklHX0FENzg4NykgKz0gYWQ3ODg3Lm8KKworb2JqLSQoQ09ORklHX0FENzE1MCkgKz0gYWQ3MTUwLm8KK29iai0kKENPTkZJR19BRDcxNTIpICs9IGFkNzE1Mi5vCitvYmotJChDT05GSUdfQUQ3MjkxKSArPSBhZDcyOTEubworb2JqLSQoQ09ORklHX0FENzI5OCkgKz0gYWQ3Mjk4Lm8KK29iai0kKENPTkZJR19BRDczMTQpICs9IGFkNzMxNC5vCitvYmotJChDT05GSUdfQUQ3NzQ1KSArPSBhZDc3NDUubworb2JqLSQoQ09ORklHX0FENzgxNikgKz0gYWQ3ODE2Lm8KK29iai0kKENPTkZJR19BRFQ3NSkgKz0gYWR0NzUubworb2JqLSQoQ09ORklHX0FEVDczMTApICs9IGFkdDczMTAubworb2JqLSQoQ09ORklHX0FEVDc0MTApICs9IGFkdDc0MTAubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvYWQ3MTUwLmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9hZDcxNTAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTU1NzY2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvYWQ3MTUwLmMKQEAgLTAsMCArMSw4NzcgQEAKKy8qCisgKiBBRDcxNTAgY2FwYWNpdGl2ZSBzZW5zb3IgZHJpdmVyIHN1cHBvcnRpbmcgQUQ3MTUwLzEvNgorICoKKyAqIENvcHlyaWdodCAyMDEwIEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvcnRjLmg+CisKKyNpbmNsdWRlICIuLi9paW8uaCIKKyNpbmNsdWRlICIuLi9zeXNmcy5oIgorCisvKgorICogQUQ3MTUwIHJlZ2lzdGVycyBkZWZpbml0aW9uCisgKi8KKworI2RlZmluZSBBRDcxNTBfU1RBVFVTICAgICAgICAgICAgICAwCisjZGVmaW5lIEFENzE1MF9TVEFUVVNfT1VUMSAgICAgICAgICgxIDw8IDMpCisjZGVmaW5lIEFENzE1MF9TVEFUVVNfT1VUMiAgICAgICAgICgxIDw8IDUpCisjZGVmaW5lIEFENzE1MF9DSDFfREFUQV9ISUdIICAgICAgIDEKKyNkZWZpbmUgQUQ3MTUwX0NIMV9EQVRBX0xPVyAgICAgICAgMgorI2RlZmluZSBBRDcxNTBfQ0gyX0RBVEFfSElHSCAgICAgICAzCisjZGVmaW5lIEFENzE1MF9DSDJfREFUQV9MT1cgICAgICAgIDQKKyNkZWZpbmUgQUQ3MTUwX0NIMV9BVkdfSElHSCAgICAgICAgNQorI2RlZmluZSBBRDcxNTBfQ0gxX0FWR19MT1cgICAgICAgICA2CisjZGVmaW5lIEFENzE1MF9DSDJfQVZHX0hJR0ggICAgICAgIDcKKyNkZWZpbmUgQUQ3MTUwX0NIMl9BVkdfTE9XICAgICAgICAgOAorI2RlZmluZSBBRDcxNTBfQ0gxX1NFTlNJVElWSVRZICAgICA5CisjZGVmaW5lIEFENzE1MF9DSDFfVEhSX0hPTERfSCAgICAgIDkKKyNkZWZpbmUgQUQ3MTUwX0NIMV9USU1FT1VUICAgICAgICAgMTAKKyNkZWZpbmUgQUQ3MTUwX0NIMV9USFJfSE9MRF9MICAgICAgMTAKKyNkZWZpbmUgQUQ3MTUwX0NIMV9TRVRVUCAgICAgICAgICAgMTEKKyNkZWZpbmUgQUQ3MTUwX0NIMl9TRU5TSVRJVklUWSAgICAgMTIKKyNkZWZpbmUgQUQ3MTUwX0NIMl9USFJfSE9MRF9IICAgICAgMTIKKyNkZWZpbmUgQUQ3MTUwX0NIMl9USU1FT1VUICAgICAgICAgMTMKKyNkZWZpbmUgQUQ3MTUwX0NIMl9USFJfSE9MRF9MICAgICAgMTMKKyNkZWZpbmUgQUQ3MTUwX0NIMl9TRVRVUCAgICAgICAgICAgMTQKKyNkZWZpbmUgQUQ3MTUwX0NGRyAgICAgICAgICAgICAgICAgMTUKKyNkZWZpbmUgQUQ3MTUwX0NGR19GSVggICAgICAgICAgICAgKDEgPDwgNykKKyNkZWZpbmUgQUQ3MTUwX1BEX1RJTUVSICAgICAgICAgICAgMTYKKyNkZWZpbmUgQUQ3MTUwX0NIMV9DQVBEQUMgICAgICAgICAgMTcKKyNkZWZpbmUgQUQ3MTUwX0NIMl9DQVBEQUMgICAgICAgICAgMTgKKyNkZWZpbmUgQUQ3MTUwX1NOMyAgICAgICAgICAgICAgICAgMTkKKyNkZWZpbmUgQUQ3MTUwX1NOMiAgICAgICAgICAgICAgICAgMjAKKyNkZWZpbmUgQUQ3MTUwX1NOMSAgICAgICAgICAgICAgICAgMjEKKyNkZWZpbmUgQUQ3MTUwX1NOMCAgICAgICAgICAgICAgICAgMjIKKyNkZWZpbmUgQUQ3MTUwX0lEICAgICAgICAgICAgICAgICAgMjMKKworI2RlZmluZSBBRDcxNTBfTUFYX0NPTlZfTU9ERSAgICAgICA0CisKKy8qCisgKiBzdHJ1Y3QgYWQ3MTUwX2NoaXBfaW5mbyAtIGNoaXAgc3BlY2lmYyBpbmZvcm1hdGlvbgorICovCisKK3N0cnVjdCBhZDcxNTBfY2hpcF9pbmZvIHsKKwljb25zdCBjaGFyICpuYW1lOworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQ7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldjsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgdGhyZXNoX3dvcms7CisJYm9vbCBpbnRlcjsKKwlzNjQgbGFzdF90aW1lc3RhbXA7CisJdTE2IGNoMV90aHJlc2hvbGQ7ICAgICAvKiBDaDEgVGhyZXNob2xkIChpbiBmaXhlZCB0aHJlc2hvbGQgbW9kZSkgKi8KKwl1OCAgY2gxX3NlbnNpdGl2aXR5OyAgIC8qIENoMSBTZW5zaXRpdml0eSAoaW4gYWRhcHRpdmUgdGhyZXNob2xkIG1vZGUpICovCisJdTggIGNoMV90aW1lb3V0OyAgICAgICAvKiBDaDEgVGltZW91dCAoaW4gYWRhcHRpdmUgdGhyZXNob2xkIG1vZGUpICovCisJdTggIGNoMV9zZXR1cDsKKwl1MTYgY2gyX3RocmVzaG9sZDsgICAgIC8qIENoMiBUaHJlc2hvbGQgKGluIGZpeGVkIHRocmVzaG9sZCBtb2RlKSAqLworCXU4ICBjaDJfc2Vuc2l0aXZpdHk7ICAgLyogQ2gxIFNlbnNpdGl2aXR5IChpbiBhZGFwdGl2ZSB0aHJlc2hvbGQgbW9kZSkgKi8KKwl1OCAgY2gyX3RpbWVvdXQ7ICAgICAgIC8qIENoMSBUaW1lb3V0IChpbiBhZGFwdGl2ZSB0aHJlc2hvbGQgbW9kZSkgKi8KKwl1OCAgY2gyX3NldHVwOworCXU4ICBwb3dlcmRvd25fdGltZXI7CisJY2hhciB0aHJlc2hvbGRfbW9kZVsxMF07IC8qIGFkYXB0aXZlL2ZpeGVkIHRocmVzaG9sZCBtb2RlICovCisJaW50IG9sZF9zdGF0ZTsKKwljaGFyICpjb252ZXJzaW9uX21vZGU7Cit9OworCitzdHJ1Y3QgYWQ3MTUwX2NvbnZlcnNpb25fbW9kZSB7CisJY2hhciAqbmFtZTsKKwl1OCByZWdfY2ZnOworfTsKKworc3RydWN0IGFkNzE1MF9jb252ZXJzaW9uX21vZGUgYWQ3MTUwX2NvbnZfbW9kZV90YWJsZVtBRDcxNTBfTUFYX0NPTlZfTU9ERV0gPSB7CisJeyAiaWRsZSIsIDAgfSwKKwl7ICJjb250aW51b3VzLWNvbnZlcnNpb24iLCAxIH0sCisJeyAic2luZ2xlLWNvbnZlcnNpb24iLCAyIH0sCisJeyAicG93ZXItZG93biIsIDMgfSwKK307CisKKy8qCisgKiBhZDcxNTAgcmVnaXN0ZXIgYWNjZXNzIGJ5IEkyQworICovCisKK3N0YXRpYyBpbnQgYWQ3MTUwX2kyY19yZWFkKHN0cnVjdCBhZDcxNTBfY2hpcF9pbmZvICpjaGlwLCB1OCByZWcsIHU4ICpkYXRhLCBpbnQgbGVuKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSBjaGlwLT5jbGllbnQ7CisJaW50IHJldCA9IDA7CisKKwlyZXQgPSBpMmNfbWFzdGVyX3NlbmQoY2xpZW50LCAmcmVnLCAxKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIkkyQyB3cml0ZSBlcnJvclxuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gaTJjX21hc3Rlcl9yZWN2KGNsaWVudCwgZGF0YSwgbGVuKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIkkyQyByZWFkIGVycm9yXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFkNzE1MF9pMmNfd3JpdGUoc3RydWN0IGFkNzE1MF9jaGlwX2luZm8gKmNoaXAsIHU4IHJlZywgdTggZGF0YSkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gY2hpcC0+Y2xpZW50OworCWludCByZXQgPSAwOworCisJdTggdHhbMl0gPSB7CisJCXJlZywKKwkJZGF0YSwKKwl9OworCisJcmV0ID0gaTJjX21hc3Rlcl9zZW5kKGNsaWVudCwgdHgsIDIpOworCWlmIChyZXQgPCAwKQorCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIkkyQyB3cml0ZSBlcnJvclxuIik7CisKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogc3lzZnMgbm9kZXMKKyAqLworCisjZGVmaW5lIElJT19ERVZfQVRUUl9BVkFJTF9DT05WRVJTSU9OX01PREVTKF9zaG93KQkJCQlcCisJSUlPX0RFVklDRV9BVFRSKGF2YWlsYWJsZV9jb252ZXJzaW9uX21vZGVzLCBTX0lSVUdPLCBfc2hvdywgTlVMTCwgMCkKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX0NPTlZFUlNJT05fTU9ERShfbW9kZSwgX3Nob3csIF9zdG9yZSkgICAgICAgICAgICAgIFwKKwlJSU9fREVWSUNFX0FUVFIoY29udmVyc2lvbl9tb2RlLCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgMCkKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX0FWQUlMX1RIUkVTSE9MRF9NT0RFUyhfc2hvdykJCQkJXAorCUlJT19ERVZJQ0VfQVRUUihhdmFpbGFibGVfdGhyZXNob2xkX21vZGVzLCBTX0lSVUdPLCBfc2hvdywgTlVMTCwgMCkKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX1RIUkVTSE9MRF9NT0RFKF9tb2RlLCBfc2hvdywgX3N0b3JlKQkJXAorCUlJT19ERVZJQ0VfQVRUUih0aHJlc2hvbGRfbW9kZSwgX21vZGUsIF9zaG93LCBfc3RvcmUsIDApCisjZGVmaW5lIElJT19ERVZfQVRUUl9DSDFfVEhSRVNIT0xEKF9tb2RlLCBfc2hvdywgX3N0b3JlKSAgICAgICAgICAgICAgXAorCUlJT19ERVZJQ0VfQVRUUihjaDFfdGhyZXNob2xkLCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgMCkKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX0NIMl9USFJFU0hPTEQoX21vZGUsIF9zaG93LCBfc3RvcmUpICAgICAgICAgICAgICBcCisJSUlPX0RFVklDRV9BVFRSKGNoMl90aHJlc2hvbGQsIF9tb2RlLCBfc2hvdywgX3N0b3JlLCAwKQorI2RlZmluZSBJSU9fREVWX0FUVFJfQ0gxX1NFTlNJVElWSVRZKF9tb2RlLCBfc2hvdywgX3N0b3JlKQkJXAorCUlJT19ERVZJQ0VfQVRUUihjaDFfc2Vuc2l0aXZpdHksIF9tb2RlLCBfc2hvdywgX3N0b3JlLCAwKQorI2RlZmluZSBJSU9fREVWX0FUVFJfQ0gyX1NFTlNJVElWSVRZKF9tb2RlLCBfc2hvdywgX3N0b3JlKQkJXAorCUlJT19ERVZJQ0VfQVRUUihjaDJfc2Vuc2l0aXZpdHksIF9tb2RlLCBfc2hvdywgX3N0b3JlLCAwKQorI2RlZmluZSBJSU9fREVWX0FUVFJfQ0gxX1RJTUVPVVQoX21vZGUsIF9zaG93LCBfc3RvcmUpCQlcCisJSUlPX0RFVklDRV9BVFRSKGNoMV90aW1lb3V0LCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgMCkKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX0NIMl9USU1FT1VUKF9tb2RlLCBfc2hvdywgX3N0b3JlKQkJXAorCUlJT19ERVZJQ0VfQVRUUihjaDJfdGltZW91dCwgX21vZGUsIF9zaG93LCBfc3RvcmUsIDApCisjZGVmaW5lIElJT19ERVZfQVRUUl9DSDFfVkFMVUUoX3Nob3cpCQlcCisJSUlPX0RFVklDRV9BVFRSKGNoMV92YWx1ZSwgU19JUlVHTywgX3Nob3csIE5VTEwsIDApCisjZGVmaW5lIElJT19ERVZfQVRUUl9DSDJfVkFMVUUoX3Nob3cpCQlcCisJSUlPX0RFVklDRV9BVFRSKGNoMl92YWx1ZSwgU19JUlVHTywgX3Nob3csIE5VTEwsIDApCisjZGVmaW5lIElJT19ERVZfQVRUUl9DSDFfU0VUVVAoX21vZGUsIF9zaG93LCBfc3RvcmUpCQlcCisJSUlPX0RFVklDRV9BVFRSKGNoMV9zZXR1cCwgX21vZGUsIF9zaG93LCBfc3RvcmUsIDApCisjZGVmaW5lIElJT19ERVZfQVRUUl9DSDJfU0VUVVAoX21vZGUsIF9zaG93LCBfc3RvcmUpICAgICAgICAgICAgICBcCisJSUlPX0RFVklDRV9BVFRSKGNoMl9zZXR1cCwgX21vZGUsIF9zaG93LCBfc3RvcmUsIDApCisjZGVmaW5lIElJT19ERVZfQVRUUl9QT1dFUkRPV05fVElNRVIoX21vZGUsIF9zaG93LCBfc3RvcmUpICAgICAgICAgICAgICBcCisJSUlPX0RFVklDRV9BVFRSKHBvd2VyZG93bl90aW1lciwgX21vZGUsIF9zaG93LCBfc3RvcmUsIDApCisKK3N0YXRpYyBzc2l6ZV90IGFkNzE1MF9zaG93X2NvbnZlcnNpb25fbW9kZXMoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCWludCBpOworCWludCBsZW4gPSAwOworCisJZm9yIChpID0gMDsgaSA8IEFENzE1MF9NQVhfQ09OVl9NT0RFOyBpKyspCisJCWxlbiArPSBzcHJpbnRmKGJ1ZiArIGxlbiwgIiVzXG4iLCBhZDcxNTBfY29udl9tb2RlX3RhYmxlW2ldLm5hbWUpOworCisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIElJT19ERVZfQVRUUl9BVkFJTF9DT05WRVJTSU9OX01PREVTKGFkNzE1MF9zaG93X2NvbnZlcnNpb25fbW9kZXMpOworCitzdGF0aWMgc3NpemVfdCBhZDcxNTBfc2hvd19jb252ZXJzaW9uX21vZGUoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDcxNTBfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXNcbiIsIGNoaXAtPmNvbnZlcnNpb25fbW9kZSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkNzE1MF9zdG9yZV9jb252ZXJzaW9uX21vZGUoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgbGVuKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDcxNTBfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCXU4IGNmZzsKKwlpbnQgaTsKKworCWFkNzE1MF9pMmNfcmVhZChjaGlwLCBBRDcxNTBfQ0ZHLCAmY2ZnLCAxKTsKKworCWZvciAoaSA9IDA7IGkgPCBBRDcxNTBfTUFYX0NPTlZfTU9ERTsgaSsrKSB7CisJCWlmIChzdHJuY21wKGJ1ZiwgYWQ3MTUwX2NvbnZfbW9kZV90YWJsZVtpXS5uYW1lLAorCQkJCXN0cmxlbihhZDcxNTBfY29udl9tb2RlX3RhYmxlW2ldLm5hbWUpIC0gMSkgPT0gMCkgeworCQkJY2hpcC0+Y29udmVyc2lvbl9tb2RlID0gYWQ3MTUwX2NvbnZfbW9kZV90YWJsZVtpXS5uYW1lOworCQkJY2ZnIHw9IDB4MTggfCBhZDcxNTBfY29udl9tb2RlX3RhYmxlW2ldLnJlZ19jZmc7CisJCQlhZDcxNTBfaTJjX3dyaXRlKGNoaXAsIEFENzE1MF9DRkcsIGNmZyk7CisJCQlyZXR1cm4gbGVuOworCQl9CisJfQorCisJZGV2X2VycihkZXYsICJub3Qgc3VwcG9ydGVkIGNvbnZlcnNpb24gbW9kZVxuIik7CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIElJT19ERVZfQVRUUl9DT05WRVJTSU9OX01PREUoU19JUlVHTyB8IFNfSVdVU1IsCisJCWFkNzE1MF9zaG93X2NvbnZlcnNpb25fbW9kZSwKKwkJYWQ3MTUwX3N0b3JlX2NvbnZlcnNpb25fbW9kZSk7CisKK3N0YXRpYyBzc2l6ZV90IGFkNzE1MF9zaG93X3RocmVzaG9sZF9tb2RlcyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiYWRhcHRpdmVcbmZpeGVkXG4iKTsKK30KKworc3RhdGljIElJT19ERVZfQVRUUl9BVkFJTF9USFJFU0hPTERfTU9ERVMoYWQ3MTUwX3Nob3dfdGhyZXNob2xkX21vZGVzKTsKKworc3RhdGljIHNzaXplX3QgYWQ3MTUwX3Nob3dfY2gxX3ZhbHVlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ3MTUwX2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKwl1OCBkYXRhWzJdOworCisJYWQ3MTUwX2kyY19yZWFkKGNoaXAsIEFENzE1MF9DSDFfREFUQV9ISUdILCBkYXRhLCAyKTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgKChpbnQpIGRhdGFbMF0gPDwgOCkgfCBkYXRhWzFdKTsKK30KKworc3RhdGljIElJT19ERVZfQVRUUl9DSDFfVkFMVUUoYWQ3MTUwX3Nob3dfY2gxX3ZhbHVlKTsKKworc3RhdGljIHNzaXplX3QgYWQ3MTUwX3Nob3dfY2gyX3ZhbHVlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ3MTUwX2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKwl1OCBkYXRhWzJdOworCisJYWQ3MTUwX2kyY19yZWFkKGNoaXAsIEFENzE1MF9DSDJfREFUQV9ISUdILCBkYXRhLCAyKTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgKChpbnQpIGRhdGFbMF0gPDwgOCkgfCBkYXRhWzFdKTsKK30KKworc3RhdGljIElJT19ERVZfQVRUUl9DSDJfVkFMVUUoYWQ3MTUwX3Nob3dfY2gyX3ZhbHVlKTsKKworc3RhdGljIHNzaXplX3QgYWQ3MTUwX3Nob3dfdGhyZXNob2xkX21vZGUoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDcxNTBfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXNcbiIsIGNoaXAtPnRocmVzaG9sZF9tb2RlKTsKK30KKworc3RhdGljIHNzaXplX3QgYWQ3MTUwX3N0b3JlX3RocmVzaG9sZF9tb2RlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ3MTUwX2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKwl1OCBjZmc7CisKKwlhZDcxNTBfaTJjX3JlYWQoY2hpcCwgQUQ3MTUwX0NGRywgJmNmZywgMSk7CisKKwlpZiAoc3RybmNtcChidWYsICJmaXhlZCIsIDUpID09IDApIHsKKwkJc3RyY3B5KGNoaXAtPnRocmVzaG9sZF9tb2RlLCAiZml4ZWQiKTsKKwkJY2ZnIHw9IEFENzE1MF9DRkdfRklYOworCQlhZDcxNTBfaTJjX3dyaXRlKGNoaXAsIEFENzE1MF9DRkcsIGNmZyk7CisKKwkJcmV0dXJuIGxlbjsKKwl9IGVsc2UgaWYgKHN0cm5jbXAoYnVmLCAiYWRhcHRpdmUiLCA4KSA9PSAwKSB7CisJCXN0cmNweShjaGlwLT50aHJlc2hvbGRfbW9kZSwgImFkYXB0aXZlIik7CisJCWNmZyAmPSB+QUQ3MTUwX0NGR19GSVg7CisJCWFkNzE1MF9pMmNfd3JpdGUoY2hpcCwgQUQ3MTUwX0NGRywgY2ZnKTsKKworCQlyZXR1cm4gbGVuOworCX0KKworCWRldl9lcnIoZGV2LCAibm90IHN1cHBvcnRlZCB0aHJlc2hvbGQgbW9kZVxuIik7CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBJSU9fREVWX0FUVFJfVEhSRVNIT0xEX01PREUoU19JUlVHTyB8IFNfSVdVU1IsCisJCWFkNzE1MF9zaG93X3RocmVzaG9sZF9tb2RlLAorCQlhZDcxNTBfc3RvcmVfdGhyZXNob2xkX21vZGUpOworCitzdGF0aWMgc3NpemVfdCBhZDcxNTBfc2hvd19jaDFfdGhyZXNob2xkKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ3MTUwX2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBjaGlwLT5jaDFfdGhyZXNob2xkKTsKK30KKworc3RhdGljIHNzaXplX3QgYWQ3MTUwX3N0b3JlX2NoMV90aHJlc2hvbGQoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgbGVuKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDcxNTBfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZGF0YTsKKwlpbnQgcmV0OworCisJcmV0ID0gc3RyaWN0X3N0cnRvdWwoYnVmLCAxMCwgJmRhdGEpOworCisJaWYgKCghcmV0KSAmJiAoZGF0YSA8IDB4MTAwMDApKSB7CisJCWFkNzE1MF9pMmNfd3JpdGUoY2hpcCwgQUQ3MTUwX0NIMV9USFJfSE9MRF9ILCBkYXRhID4+IDgpOworCQlhZDcxNTBfaTJjX3dyaXRlKGNoaXAsIEFENzE1MF9DSDFfVEhSX0hPTERfTCwgZGF0YSk7CisJCWNoaXAtPmNoMV90aHJlc2hvbGQgPSBkYXRhOworCQlyZXR1cm4gbGVuOworCX0KKworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgSUlPX0RFVl9BVFRSX0NIMV9USFJFU0hPTEQoU19JUlVHTyB8IFNfSVdVU1IsCisJCWFkNzE1MF9zaG93X2NoMV90aHJlc2hvbGQsCisJCWFkNzE1MF9zdG9yZV9jaDFfdGhyZXNob2xkKTsKKworc3RhdGljIHNzaXplX3QgYWQ3MTUwX3Nob3dfY2gyX3RocmVzaG9sZChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkNzE1MF9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgY2hpcC0+Y2gyX3RocmVzaG9sZCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkNzE1MF9zdG9yZV9jaDJfdGhyZXNob2xkKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ3MTUwX2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGRhdGE7CisJaW50IHJldDsKKworCXJldCA9IHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMTAsICZkYXRhKTsKKworCWlmICgoIXJldCkgJiYgKGRhdGEgPCAweDEwMDAwKSkgeworCQlhZDcxNTBfaTJjX3dyaXRlKGNoaXAsIEFENzE1MF9DSDJfVEhSX0hPTERfSCwgZGF0YSA+PiA4KTsKKwkJYWQ3MTUwX2kyY193cml0ZShjaGlwLCBBRDcxNTBfQ0gyX1RIUl9IT0xEX0wsIGRhdGEpOworCQljaGlwLT5jaDJfdGhyZXNob2xkID0gZGF0YTsKKwkJcmV0dXJuIGxlbjsKKwl9CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIElJT19ERVZfQVRUUl9DSDJfVEhSRVNIT0xEKFNfSVJVR08gfCBTX0lXVVNSLAorCQlhZDcxNTBfc2hvd19jaDJfdGhyZXNob2xkLAorCQlhZDcxNTBfc3RvcmVfY2gyX3RocmVzaG9sZCk7CisKK3N0YXRpYyBzc2l6ZV90IGFkNzE1MF9zaG93X2NoMV9zZW5zaXRpdml0eShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkNzE1MF9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgY2hpcC0+Y2gxX3NlbnNpdGl2aXR5KTsKK30KKworc3RhdGljIHNzaXplX3QgYWQ3MTUwX3N0b3JlX2NoMV9zZW5zaXRpdml0eShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBsZW4pCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkNzE1MF9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisJdW5zaWduZWQgbG9uZyBkYXRhOworCWludCByZXQ7CisKKwlyZXQgPSBzdHJpY3Rfc3RydG91bChidWYsIDEwLCAmZGF0YSk7CisKKwlpZiAoKCFyZXQpICYmIChkYXRhIDwgMHgxMDApKSB7CisJCWFkNzE1MF9pMmNfd3JpdGUoY2hpcCwgQUQ3MTUwX0NIMV9TRU5TSVRJVklUWSwgZGF0YSk7CisJCWNoaXAtPmNoMV9zZW5zaXRpdml0eSA9IGRhdGE7CisJCXJldHVybiBsZW47CisJfQorCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBJSU9fREVWX0FUVFJfQ0gxX1NFTlNJVElWSVRZKFNfSVJVR08gfCBTX0lXVVNSLAorCQlhZDcxNTBfc2hvd19jaDFfc2Vuc2l0aXZpdHksCisJCWFkNzE1MF9zdG9yZV9jaDFfc2Vuc2l0aXZpdHkpOworCitzdGF0aWMgc3NpemVfdCBhZDcxNTBfc2hvd19jaDJfc2Vuc2l0aXZpdHkoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDcxNTBfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIGNoaXAtPmNoMl9zZW5zaXRpdml0eSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkNzE1MF9zdG9yZV9jaDJfc2Vuc2l0aXZpdHkoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgbGVuKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDcxNTBfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZGF0YTsKKwlpbnQgcmV0OworCisJcmV0ID0gc3RyaWN0X3N0cnRvdWwoYnVmLCAxMCwgJmRhdGEpOworCisJaWYgKCghcmV0KSAmJiAoZGF0YSA8IDB4MTAwKSkgeworCQlhZDcxNTBfaTJjX3dyaXRlKGNoaXAsIEFENzE1MF9DSDJfU0VOU0lUSVZJVFksIGRhdGEpOworCQljaGlwLT5jaDJfc2Vuc2l0aXZpdHkgPSBkYXRhOworCQlyZXR1cm4gbGVuOworCX0KKworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgSUlPX0RFVl9BVFRSX0NIMl9TRU5TSVRJVklUWShTX0lSVUdPIHwgU19JV1VTUiwKKwkJYWQ3MTUwX3Nob3dfY2gyX3NlbnNpdGl2aXR5LAorCQlhZDcxNTBfc3RvcmVfY2gyX3NlbnNpdGl2aXR5KTsKKworc3RhdGljIHNzaXplX3QgYWQ3MTUwX3Nob3dfY2gxX3RpbWVvdXQoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDcxNTBfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIGNoaXAtPmNoMV90aW1lb3V0KTsKK30KKworc3RhdGljIHNzaXplX3QgYWQ3MTUwX3N0b3JlX2NoMV90aW1lb3V0KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ3MTUwX2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGRhdGE7CisJaW50IHJldDsKKworCXJldCA9IHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMTAsICZkYXRhKTsKKworCWlmICgoIXJldCkgJiYgKGRhdGEgPCAweDEwMCkpIHsKKwkJYWQ3MTUwX2kyY193cml0ZShjaGlwLCBBRDcxNTBfQ0gxX1RJTUVPVVQsIGRhdGEpOworCQljaGlwLT5jaDFfdGltZW91dCA9IGRhdGE7CisJCXJldHVybiBsZW47CisJfQorCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBJSU9fREVWX0FUVFJfQ0gxX1RJTUVPVVQoU19JUlVHTyB8IFNfSVdVU1IsCisJCWFkNzE1MF9zaG93X2NoMV90aW1lb3V0LAorCQlhZDcxNTBfc3RvcmVfY2gxX3RpbWVvdXQpOworCitzdGF0aWMgc3NpemVfdCBhZDcxNTBfc2hvd19jaDJfdGltZW91dChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkNzE1MF9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgY2hpcC0+Y2gyX3RpbWVvdXQpOworfQorCitzdGF0aWMgc3NpemVfdCBhZDcxNTBfc3RvcmVfY2gyX3RpbWVvdXQoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgbGVuKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDcxNTBfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZGF0YTsKKwlpbnQgcmV0OworCisJcmV0ID0gc3RyaWN0X3N0cnRvdWwoYnVmLCAxMCwgJmRhdGEpOworCisJaWYgKCghcmV0KSAmJiAoZGF0YSA8IDB4MTAwKSkgeworCQlhZDcxNTBfaTJjX3dyaXRlKGNoaXAsIEFENzE1MF9DSDJfVElNRU9VVCwgZGF0YSk7CisJCWNoaXAtPmNoMl90aW1lb3V0ID0gZGF0YTsKKwkJcmV0dXJuIGxlbjsKKwl9CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIElJT19ERVZfQVRUUl9DSDJfVElNRU9VVChTX0lSVUdPIHwgU19JV1VTUiwKKwkJYWQ3MTUwX3Nob3dfY2gyX3RpbWVvdXQsCisJCWFkNzE1MF9zdG9yZV9jaDJfdGltZW91dCk7CisKK3N0YXRpYyBzc2l6ZV90IGFkNzE1MF9zaG93X2NoMV9zZXR1cChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkNzE1MF9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIweCUwMnhcbiIsIGNoaXAtPmNoMV9zZXR1cCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkNzE1MF9zdG9yZV9jaDFfc2V0dXAoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgbGVuKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDcxNTBfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZGF0YTsKKwlpbnQgcmV0OworCisJcmV0ID0gc3RyaWN0X3N0cnRvdWwoYnVmLCAxMCwgJmRhdGEpOworCisJaWYgKCghcmV0KSAmJiAoZGF0YSA8IDB4MTAwKSkgeworCQlhZDcxNTBfaTJjX3dyaXRlKGNoaXAsIEFENzE1MF9DSDFfU0VUVVAsIGRhdGEpOworCQljaGlwLT5jaDFfc2V0dXAgPSBkYXRhOworCQlyZXR1cm4gbGVuOworCX0KKworCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBJSU9fREVWX0FUVFJfQ0gxX1NFVFVQKFNfSVJVR08gfCBTX0lXVVNSLAorCQlhZDcxNTBfc2hvd19jaDFfc2V0dXAsCisJCWFkNzE1MF9zdG9yZV9jaDFfc2V0dXApOworCitzdGF0aWMgc3NpemVfdCBhZDcxNTBfc2hvd19jaDJfc2V0dXAoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDcxNTBfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiMHglMDJ4XG4iLCBjaGlwLT5jaDJfc2V0dXApOworfQorCitzdGF0aWMgc3NpemVfdCBhZDcxNTBfc3RvcmVfY2gyX3NldHVwKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ3MTUwX2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGRhdGE7CisJaW50IHJldDsKKworCXJldCA9IHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMTAsICZkYXRhKTsKKworCWlmICgoIXJldCkgJiYgKGRhdGEgPCAweDEwMCkpIHsKKwkJYWQ3MTUwX2kyY193cml0ZShjaGlwLCBBRDcxNTBfQ0gyX1NFVFVQLCBkYXRhKTsKKwkJY2hpcC0+Y2gyX3NldHVwID0gZGF0YTsKKwkJcmV0dXJuIGxlbjsKKwl9CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIElJT19ERVZfQVRUUl9DSDJfU0VUVVAoU19JUlVHTyB8IFNfSVdVU1IsCisJCWFkNzE1MF9zaG93X2NoMl9zZXR1cCwKKwkJYWQ3MTUwX3N0b3JlX2NoMl9zZXR1cCk7CisKK3N0YXRpYyBzc2l6ZV90IGFkNzE1MF9zaG93X25hbWUoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDcxNTBfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVzXG4iLCBjaGlwLT5uYW1lKTsKK30KKworc3RhdGljIElJT19ERVZJQ0VfQVRUUihuYW1lLCBTX0lSVUdPLCBhZDcxNTBfc2hvd19uYW1lLCBOVUxMLCAwKTsKKworc3RhdGljIHNzaXplX3QgYWQ3MTUwX3Nob3dfcG93ZXJkb3duX3RpbWVyKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ3MTUwX2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIjB4JTAyeFxuIiwgY2hpcC0+cG93ZXJkb3duX3RpbWVyKTsKK30KKworc3RhdGljIHNzaXplX3QgYWQ3MTUwX3N0b3JlX3Bvd2VyZG93bl90aW1lcihzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBsZW4pCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkNzE1MF9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisJdW5zaWduZWQgbG9uZyBkYXRhOworCWludCByZXQ7CisKKwlyZXQgPSBzdHJpY3Rfc3RydG91bChidWYsIDEwLCAmZGF0YSk7CisKKwlpZiAoKCFyZXQpICYmIChkYXRhIDwgMHg0MCkpIHsKKwkJY2hpcC0+cG93ZXJkb3duX3RpbWVyID0gZGF0YTsKKwkJcmV0dXJuIGxlbjsKKwl9CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIElJT19ERVZfQVRUUl9QT1dFUkRPV05fVElNRVIoU19JUlVHTyB8IFNfSVdVU1IsCisJCWFkNzE1MF9zaG93X3Bvd2VyZG93bl90aW1lciwKKwkJYWQ3MTUwX3N0b3JlX3Bvd2VyZG93bl90aW1lcik7CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICphZDcxNTBfYXR0cmlidXRlc1tdID0geworCSZpaW9fZGV2X2F0dHJfYXZhaWxhYmxlX3RocmVzaG9sZF9tb2Rlcy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfdGhyZXNob2xkX21vZGUuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2NoMV90aHJlc2hvbGQuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2NoMl90aHJlc2hvbGQuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2NoMV90aW1lb3V0LmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9jaDJfdGltZW91dC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfY2gxX3NldHVwLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9jaDJfc2V0dXAuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2NoMV9zZW5zaXRpdml0eS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfY2gyX3NlbnNpdGl2aXR5LmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9wb3dlcmRvd25fdGltZXIuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2NoMV92YWx1ZS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfY2gyX3ZhbHVlLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9uYW1lLmRldl9hdHRyLmF0dHIsCisJTlVMTCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGFkNzE1MF9hdHRyaWJ1dGVfZ3JvdXAgPSB7CisJLmF0dHJzID0gYWQ3MTUwX2F0dHJpYnV0ZXMsCit9OworCisvKgorICogdGhyZXNob2xkIGV2ZW50cworICovCisKKyNkZWZpbmUgSUlPX0VWRU5UX0NPREVfQ0gxX0hJR0ggICAgSUlPX0JVRkZFUl9FVkVOVF9DT0RFKDApCisjZGVmaW5lIElJT19FVkVOVF9DT0RFX0NIMV9MT1cgICAgIElJT19CVUZGRVJfRVZFTlRfQ09ERSgxKQorI2RlZmluZSBJSU9fRVZFTlRfQ09ERV9DSDJfSElHSCAgICBJSU9fQlVGRkVSX0VWRU5UX0NPREUoMikKKyNkZWZpbmUgSUlPX0VWRU5UX0NPREVfQ0gyX0xPVyAgICAgSUlPX0JVRkZFUl9FVkVOVF9DT0RFKDMpCisKKyNkZWZpbmUgSUlPX0VWRU5UX0FUVFJfQ0gxX0hJR0hfU0goX2V2bGlzdCwgX3Nob3csIF9zdG9yZSwgX21hc2spCVwKKwlJSU9fRVZFTlRfQVRUUl9TSChjaDFfaGlnaCwgX2V2bGlzdCwgX3Nob3csIF9zdG9yZSwgX21hc2spCisKKyNkZWZpbmUgSUlPX0VWRU5UX0FUVFJfQ0gyX0hJR0hfU0goX2V2bGlzdCwgX3Nob3csIF9zdG9yZSwgX21hc2spCVwKKwlJSU9fRVZFTlRfQVRUUl9TSChjaDJfaGlnaCwgX2V2bGlzdCwgX3Nob3csIF9zdG9yZSwgX21hc2spCisKKyNkZWZpbmUgSUlPX0VWRU5UX0FUVFJfQ0gxX0xPV19TSChfZXZsaXN0LCBfc2hvdywgX3N0b3JlLCBfbWFzaykJXAorCUlJT19FVkVOVF9BVFRSX1NIKGNoMV9sb3csIF9ldmxpc3QsIF9zaG93LCBfc3RvcmUsIF9tYXNrKQorCisjZGVmaW5lIElJT19FVkVOVF9BVFRSX0NIMl9MT1dfU0goX2V2bGlzdCwgX3Nob3csIF9zdG9yZSwgX21hc2spCVwKKwlJSU9fRVZFTlRfQVRUUl9TSChjaDJfbG93LCBfZXZsaXN0LCBfc2hvdywgX3N0b3JlLCBfbWFzaykKKworc3RhdGljIHZvaWQgYWQ3MTUwX2ludGVycnVwdF9oYW5kbGVyX2JoKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29ya19zKQoreworCXN0cnVjdCBhZDcxNTBfY2hpcF9pbmZvICpjaGlwID0KKwkJY29udGFpbmVyX29mKHdvcmtfcywgc3RydWN0IGFkNzE1MF9jaGlwX2luZm8sIHRocmVzaF93b3JrKTsKKwl1OCBpbnRfc3RhdHVzOworCisJZW5hYmxlX2lycShjaGlwLT5jbGllbnQtPmlycSk7CisKKwlhZDcxNTBfaTJjX3JlYWQoY2hpcCwgQUQ3MTUwX1NUQVRVUywgJmludF9zdGF0dXMsIDEpOworCisJaWYgKChpbnRfc3RhdHVzICYgQUQ3MTUwX1NUQVRVU19PVVQxKSAmJiAhKGNoaXAtPm9sZF9zdGF0ZSAmIEFENzE1MF9TVEFUVVNfT1VUMSkpCisJCWlpb19wdXNoX2V2ZW50KGNoaXAtPmluZGlvX2RldiwgMCwKKwkJCQlJSU9fRVZFTlRfQ09ERV9DSDFfSElHSCwKKwkJCQljaGlwLT5sYXN0X3RpbWVzdGFtcCk7CisJZWxzZSBpZiAoKCEoaW50X3N0YXR1cyAmIEFENzE1MF9TVEFUVVNfT1VUMSkpICYmIChjaGlwLT5vbGRfc3RhdGUgJiBBRDcxNTBfU1RBVFVTX09VVDEpKQorCQlpaW9fcHVzaF9ldmVudChjaGlwLT5pbmRpb19kZXYsIDAsCisJCQkJSUlPX0VWRU5UX0NPREVfQ0gxX0xPVywKKwkJCQljaGlwLT5sYXN0X3RpbWVzdGFtcCk7CisKKwlpZiAoKGludF9zdGF0dXMgJiBBRDcxNTBfU1RBVFVTX09VVDIpICYmICEoY2hpcC0+b2xkX3N0YXRlICYgQUQ3MTUwX1NUQVRVU19PVVQyKSkKKwkJaWlvX3B1c2hfZXZlbnQoY2hpcC0+aW5kaW9fZGV2LCAwLAorCQkJCUlJT19FVkVOVF9DT0RFX0NIMl9ISUdILAorCQkJCWNoaXAtPmxhc3RfdGltZXN0YW1wKTsKKwllbHNlIGlmICgoIShpbnRfc3RhdHVzICYgQUQ3MTUwX1NUQVRVU19PVVQyKSkgJiYgKGNoaXAtPm9sZF9zdGF0ZSAmIEFENzE1MF9TVEFUVVNfT1VUMikpCisJCWlpb19wdXNoX2V2ZW50KGNoaXAtPmluZGlvX2RldiwgMCwKKwkJCQlJSU9fRVZFTlRfQ09ERV9DSDJfTE9XLAorCQkJCWNoaXAtPmxhc3RfdGltZXN0YW1wKTsKK30KKworc3RhdGljIGludCBhZDcxNTBfaW50ZXJydXB0X2hhbmRsZXJfdGgoc3RydWN0IGlpb19kZXYgKmRldl9pbmZvLAorCQlpbnQgaW5kZXgsCisJCXM2NCB0aW1lc3RhbXAsCisJCWludCBub190ZXN0KQoreworCXN0cnVjdCBhZDcxNTBfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCisJY2hpcC0+bGFzdF90aW1lc3RhbXAgPSB0aW1lc3RhbXA7CisJc2NoZWR1bGVfd29yaygmY2hpcC0+dGhyZXNoX3dvcmspOworCisJcmV0dXJuIDA7Cit9CisKK0lJT19FVkVOVF9TSCh0aHJlc2hvbGQsICZhZDcxNTBfaW50ZXJydXB0X2hhbmRsZXJfdGgpOworCitzdGF0aWMgc3NpemVfdCBhZDcxNTBfcXVlcnlfb3V0X21vZGUoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCS8qCisJICogQUQ3MTUwIHByb3ZpZGVzIHR3byBsb2dpYyBvdXRwdXQgY2hhbm5lbHMsIHdoaWNoIGNhbiBiZSB1c2VkIGFzIGludGVycnVwdAorCSAqIGJ1dCB0aGUgcGlucyBhcmUgbm90IGNvbmZpZ3VyYWJsZQorCSAqLworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIjFcbiIpOworfQorCitzdGF0aWMgc3NpemVfdCBhZDcxNTBfc2V0X291dF9tb2RlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlyZXR1cm4gbGVuOworfQorCitJSU9fRVZFTlRfQVRUUl9DSDFfSElHSF9TSChpaW9fZXZlbnRfdGhyZXNob2xkLCBhZDcxNTBfcXVlcnlfb3V0X21vZGUsIGFkNzE1MF9zZXRfb3V0X21vZGUsIDApOworSUlPX0VWRU5UX0FUVFJfQ0gyX0hJR0hfU0goaWlvX2V2ZW50X3RocmVzaG9sZCwgYWQ3MTUwX3F1ZXJ5X291dF9tb2RlLCBhZDcxNTBfc2V0X291dF9tb2RlLCAwKTsKK0lJT19FVkVOVF9BVFRSX0NIMV9MT1dfU0goaWlvX2V2ZW50X3RocmVzaG9sZCwgYWQ3MTUwX3F1ZXJ5X291dF9tb2RlLCBhZDcxNTBfc2V0X291dF9tb2RlLCAwKTsKK0lJT19FVkVOVF9BVFRSX0NIMl9MT1dfU0goaWlvX2V2ZW50X3RocmVzaG9sZCwgYWQ3MTUwX3F1ZXJ5X291dF9tb2RlLCBhZDcxNTBfc2V0X291dF9tb2RlLCAwKTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmFkNzE1MF9ldmVudF9hdHRyaWJ1dGVzW10gPSB7CisJJmlpb19ldmVudF9hdHRyX2NoMV9oaWdoLmRldl9hdHRyLmF0dHIsCisJJmlpb19ldmVudF9hdHRyX2NoMl9oaWdoLmRldl9hdHRyLmF0dHIsCisJJmlpb19ldmVudF9hdHRyX2NoMV9sb3cuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2V2ZW50X2F0dHJfY2gyX2xvdy5kZXZfYXR0ci5hdHRyLAorCU5VTEwsCit9OworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBhZDcxNTBfZXZlbnRfYXR0cmlidXRlX2dyb3VwID0geworCS5hdHRycyA9IGFkNzE1MF9ldmVudF9hdHRyaWJ1dGVzLAorfTsKKworLyoKKyAqIGRldmljZSBwcm9iZSBhbmQgcmVtb3ZlCisgKi8KKworc3RhdGljIGludCBfX2RldmluaXQgYWQ3MTUwX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJCWNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKK3sKKwlpbnQgcmV0ID0gMCwgcmVnZG9uZSA9IDA7CisJc3RydWN0IGFkNzE1MF9jaGlwX2luZm8gKmNoaXAgPSBremFsbG9jKHNpemVvZigqY2hpcCksIEdGUF9LRVJORUwpOworCWlmIChjaGlwID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJvcl9yZXQ7CisJfQorCisJLyogdGhpcyBpcyBvbmx5IHVzZWQgZm9yIGRldmljZSByZW1vdmFsIHB1cnBvc2VzICovCisJaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgY2hpcCk7CisKKwljaGlwLT5jbGllbnQgPSBjbGllbnQ7CisJY2hpcC0+bmFtZSA9IGlkLT5uYW1lOworCisJY2hpcC0+aW5kaW9fZGV2ID0gaWlvX2FsbG9jYXRlX2RldmljZSgpOworCWlmIChjaGlwLT5pbmRpb19kZXYgPT0gTlVMTCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycm9yX2ZyZWVfY2hpcDsKKwl9CisKKwkvKiBFY2hpcGFiaWxpc2ggdGhhdCB0aGUgaWlvX2RldiBpcyBhIGNoaWxkIG9mIHRoZSBpMmMgZGV2aWNlICovCisJY2hpcC0+aW5kaW9fZGV2LT5kZXYucGFyZW50ID0gJmNsaWVudC0+ZGV2OworCWNoaXAtPmluZGlvX2Rldi0+YXR0cnMgPSAmYWQ3MTUwX2F0dHJpYnV0ZV9ncm91cDsKKwljaGlwLT5pbmRpb19kZXYtPmV2ZW50X2F0dHJzID0gJmFkNzE1MF9ldmVudF9hdHRyaWJ1dGVfZ3JvdXA7CisJY2hpcC0+aW5kaW9fZGV2LT5kZXZfZGF0YSA9ICh2b2lkICopKGNoaXApOworCWNoaXAtPmluZGlvX2Rldi0+ZHJpdmVyX21vZHVsZSA9IFRISVNfTU9EVUxFOworCWNoaXAtPmluZGlvX2Rldi0+bnVtX2ludGVycnVwdF9saW5lcyA9IDE7CisJY2hpcC0+aW5kaW9fZGV2LT5tb2RlcyA9IElORElPX0RJUkVDVF9NT0RFOworCisJcmV0ID0gaWlvX2RldmljZV9yZWdpc3RlcihjaGlwLT5pbmRpb19kZXYpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfZnJlZV9kZXY7CisJcmVnZG9uZSA9IDE7CisKKwlpZiAoY2xpZW50LT5pcnEgJiYgZ3Bpb19pc192YWxpZChpcnFfdG9fZ3BpbyhjbGllbnQtPmlycSkpID4gMCkgeworCQlyZXQgPSBpaW9fcmVnaXN0ZXJfaW50ZXJydXB0X2xpbmUoY2xpZW50LT5pcnEsCisJCQkJY2hpcC0+aW5kaW9fZGV2LAorCQkJCTAsCisJCQkJSVJRRl9UUklHR0VSX1JJU0lORyB8IElSUUZfVFJJR0dFUl9GQUxMSU5HLAorCQkJCSJhZDcxNTAiKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJyb3JfZnJlZV9kZXY7CisKKwkJaWlvX2FkZF9ldmVudF90b19saXN0KGlpb19ldmVudF9hdHRyX2NoMl9sb3cubGlzdGVsLAorCQkJCSZjaGlwLT5pbmRpb19kZXYtPmludGVycnVwdHNbMF0tPmV2X2xpc3QpOworCisJCUlOSVRfV09SSygmY2hpcC0+dGhyZXNoX3dvcmssIGFkNzE1MF9pbnRlcnJ1cHRfaGFuZGxlcl9iaCk7CisJfQorCisJZGV2X2VycigmY2xpZW50LT5kZXYsICIlcyBjYXBhY2l0aXZlIHNlbnNvciByZWdpc3RlcmVkLCBpcnE6ICVkXG4iLCBpZC0+bmFtZSwgY2xpZW50LT5pcnEpOworCisJcmV0dXJuIDA7CisKK2Vycm9yX2ZyZWVfZGV2OgorCWlmIChyZWdkb25lKQorCQlpaW9fZGV2aWNlX3VucmVnaXN0ZXIoY2hpcC0+aW5kaW9fZGV2KTsKKwllbHNlCisJCWlpb19mcmVlX2RldmljZShjaGlwLT5pbmRpb19kZXYpOworZXJyb3JfZnJlZV9jaGlwOgorCWtmcmVlKGNoaXApOworZXJyb3JfcmV0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IGFkNzE1MF9yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlzdHJ1Y3QgYWQ3MTUwX2NoaXBfaW5mbyAqY2hpcCA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBjaGlwLT5pbmRpb19kZXY7CisKKwlpZiAoY2xpZW50LT5pcnEgJiYgZ3Bpb19pc192YWxpZChpcnFfdG9fZ3BpbyhjbGllbnQtPmlycSkpID4gMCkKKwkJaWlvX3VucmVnaXN0ZXJfaW50ZXJydXB0X2xpbmUoaW5kaW9fZGV2LCAwKTsKKwlpaW9fZGV2aWNlX3VucmVnaXN0ZXIoaW5kaW9fZGV2KTsKKwlrZnJlZShjaGlwKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgYWQ3MTUwX2lkW10gPSB7CisJeyAiYWQ3MTUwIiwgMCB9LAorCXsgImFkNzE1MSIsIDAgfSwKKwl7ICJhZDcxNTYiLCAwIH0sCisJe30KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCBhZDcxNTBfaWQpOworCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgYWQ3MTUwX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJhZDcxNTAiLAorCX0sCisJLnByb2JlID0gYWQ3MTUwX3Byb2JlLAorCS5yZW1vdmUgPSBfX2RldmV4aXRfcChhZDcxNTBfcmVtb3ZlKSwKKwkuaWRfdGFibGUgPSBhZDcxNTBfaWQsCit9OworCitzdGF0aWMgX19pbml0IGludCBhZDcxNTBfaW5pdCh2b2lkKQoreworCXJldHVybiBpMmNfYWRkX2RyaXZlcigmYWQ3MTUwX2RyaXZlcik7Cit9CisKK3N0YXRpYyBfX2V4aXQgdm9pZCBhZDcxNTBfZXhpdCh2b2lkKQoreworCWkyY19kZWxfZHJpdmVyKCZhZDcxNTBfZHJpdmVyKTsKK30KKworTU9EVUxFX0FVVEhPUigiQmFycnkgU29uZyA8MjFjbmJhb0BnbWFpbC5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkFuYWxvZyBEZXZpY2VzIGFkNzE1MC8xLzYgY2FwYWNpdGl2ZSBzZW5zb3IgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CisKK21vZHVsZV9pbml0KGFkNzE1MF9pbml0KTsKK21vZHVsZV9leGl0KGFkNzE1MF9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRjL2FkNzE1Mi5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvYWQ3MTUyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmE3Zjg0MDYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9hZDcxNTIuYwpAQCAtMCwwICsxLDYxMCBAQAorLyoKKyAqIEFENzE1MiBjYXBhY2l0aXZlIHNlbnNvciBkcml2ZXIgc3VwcG9ydGluZyBBRDcxNTIvMworICoKKyAqIENvcHlyaWdodCAyMDEwIEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvcnRjLmg+CisKKyNpbmNsdWRlICIuLi9paW8uaCIKKyNpbmNsdWRlICIuLi9zeXNmcy5oIgorCisvKgorICogQUQ3MTUyIHJlZ2lzdGVycyBkZWZpbml0aW9uCisgKi8KKworI2RlZmluZSBBRDcxNTJfU1RBVFVTICAgICAgICAgICAgICAwCisjZGVmaW5lIEFENzE1Ml9TVEFUVVNfUkRZMSAgICAgICAgICgxIDw8IDApCisjZGVmaW5lIEFENzE1Ml9TVEFUVVNfUkRZMiAgICAgICAgICgxIDw8IDEpCisjZGVmaW5lIEFENzE1Ml9DSDFfREFUQV9ISUdIICAgICAgIDEKKyNkZWZpbmUgQUQ3MTUyX0NIMV9EQVRBX0xPVyAgICAgICAgMgorI2RlZmluZSBBRDcxNTJfQ0gyX0RBVEFfSElHSCAgICAgICAzCisjZGVmaW5lIEFENzE1Ml9DSDJfREFUQV9MT1cgICAgICAgIDQKKyNkZWZpbmUgQUQ3MTUyX0NIMV9PRkZTX0hJR0ggICAgICAgNQorI2RlZmluZSBBRDcxNTJfQ0gxX09GRlNfTE9XICAgICAgICA2CisjZGVmaW5lIEFENzE1Ml9DSDJfT0ZGU19ISUdIICAgICAgIDcKKyNkZWZpbmUgQUQ3MTUyX0NIMl9PRkZTX0xPVyAgICAgICAgOAorI2RlZmluZSBBRDcxNTJfQ0gxX0dBSU5fSElHSCAgICAgICA5CisjZGVmaW5lIEFENzE1Ml9DSDFfR0FJTl9MT1cgICAgICAgIDEwCisjZGVmaW5lIEFENzE1Ml9DSDFfU0VUVVAgICAgICAgICAgIDExCisjZGVmaW5lIEFENzE1Ml9DSDJfR0FJTl9ISUdIICAgICAgIDEyCisjZGVmaW5lIEFENzE1Ml9DSDJfR0FJTl9MT1cgICAgICAgIDEzCisjZGVmaW5lIEFENzE1Ml9DSDJfU0VUVVAgICAgICAgICAgIDE0CisjZGVmaW5lIEFENzE1Ml9DRkcgICAgICAgICAgICAgICAgIDE1CisjZGVmaW5lIEFENzE1Ml9SRVNFVkVSRCAgICAgICAgICAgIDE2CisjZGVmaW5lIEFENzE1Ml9DQVBEQUNfUE9TICAgICAgICAgIDE3CisjZGVmaW5lIEFENzE1Ml9DQVBEQUNfTkVHICAgICAgICAgIDE4CisjZGVmaW5lIEFENzE1Ml9DRkcyICAgICAgICAgICAgICAgIDI2CisKKyNkZWZpbmUgQUQ3MTUyX01BWF9DT05WX01PREUgICAgICAgNgorCisvKgorICogc3RydWN0IGFkNzE1Ml9jaGlwX2luZm8gLSBjaGlwIHNwZWNpZmMgaW5mb3JtYXRpb24KKyAqLworCitzdHJ1Y3QgYWQ3MTUyX2NoaXBfaW5mbyB7CisJY29uc3QgY2hhciAqbmFtZTsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50OworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXY7CisJdTE2IGNoMV9vZmZzZXQ7ICAgICAvKiBDaGFubmVsIDEgb2Zmc2V0IGNhbGlicmF0aW9uIGNvZWZmaWNpZW50ICovCisJdTE2IGNoMV9nYWluOyAgICAgICAvKiBDaGFubmVsIDEgZ2FpbiBjb2VmZmljaWVudCAqLworCXU4ICBjaDFfc2V0dXA7CisJdTE2IGNoMl9vZmZzZXQ7ICAgICAvKiBDaGFubmVsIDIgb2Zmc2V0IGNhbGlicmF0aW9uIGNvZWZmaWNpZW50ICovCisJdTE2IGNoMl9nYWluOyAgICAgICAvKiBDaGFubmVsIDEgZ2FpbiBjb2VmZmljaWVudCAqLworCXU4ICBjaDJfc2V0dXA7CisJdTggIGZpbHRlcl9yYXRlX3NldHVwOyAvKiBDYXBhY2l0aXZlIGNoYW5uZWwgZGlnaXRhbCBmaWx0ZXIgc2V0dXA7IGNvbnZlcnNpb24gdGltZS91cGRhdGUgcmF0ZSBzZXR1cCBwZXIgY2hhbm5lbCAqLworCWNoYXIgKmNvbnZlcnNpb25fbW9kZTsKK307CisKK3N0cnVjdCBhZDcxNTJfY29udmVyc2lvbl9tb2RlIHsKKwljaGFyICpuYW1lOworCXU4IHJlZ19jZmc7Cit9OworCitzdHJ1Y3QgYWQ3MTUyX2NvbnZlcnNpb25fbW9kZSBhZDcxNTJfY29udl9tb2RlX3RhYmxlW0FENzE1Ml9NQVhfQ09OVl9NT0RFXSA9IHsKKwl7ICJpZGxlIiwgMCB9LAorCXsgImNvbnRpbnVvdXMtY29udmVyc2lvbiIsIDEgfSwKKwl7ICJzaW5nbGUtY29udmVyc2lvbiIsIDIgfSwKKwl7ICJwb3dlci1kb3duIiwgMyB9LAorCXsgIm9mZnNldC1jYWxpYnJhdGlvbiIsIDUgfSwKKwl7ICJnYWluLWNhbGlicmF0aW9uIiwgNiB9LAorfTsKKworLyoKKyAqIGFkNzE1MiByZWdpc3RlciBhY2Nlc3MgYnkgSTJDCisgKi8KKworc3RhdGljIGludCBhZDcxNTJfaTJjX3JlYWQoc3RydWN0IGFkNzE1Ml9jaGlwX2luZm8gKmNoaXAsIHU4IHJlZywgdTggKmRhdGEsIGludCBsZW4pCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IGNoaXAtPmNsaWVudDsKKwlpbnQgcmV0OworCisJcmV0ID0gaTJjX21hc3Rlcl9zZW5kKGNsaWVudCwgJnJlZywgMSk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJJMkMgd3JpdGUgZXJyb3JcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldCA9IGkyY19tYXN0ZXJfcmVjdihjbGllbnQsIGRhdGEsIGxlbik7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJJMkMgcmVhZCBlcnJvclxuIik7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhZDcxNTJfaTJjX3dyaXRlKHN0cnVjdCBhZDcxNTJfY2hpcF9pbmZvICpjaGlwLCB1OCByZWcsIHU4IGRhdGEpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IGNoaXAtPmNsaWVudDsKKwlpbnQgcmV0OworCisJdTggdHhbMl0gPSB7CisJCXJlZywKKwkJZGF0YSwKKwl9OworCisJcmV0ID0gaTJjX21hc3Rlcl9zZW5kKGNsaWVudCwgdHgsIDIpOworCWlmIChyZXQgPCAwKQorCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIkkyQyB3cml0ZSBlcnJvclxuIik7CisKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogc3lzZnMgbm9kZXMKKyAqLworCisjZGVmaW5lIElJT19ERVZfQVRUUl9BVkFJTF9DT05WRVJTSU9OX01PREVTKF9zaG93KQkJCQlcCisJSUlPX0RFVklDRV9BVFRSKGF2YWlsYWJsZV9jb252ZXJzaW9uX21vZGVzLCBTX0lSVUdPLCBfc2hvdywgTlVMTCwgMCkKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX0NPTlZFUlNJT05fTU9ERShfbW9kZSwgX3Nob3csIF9zdG9yZSkgICAgICAgICAgICAgIFwKKwlJSU9fREVWSUNFX0FUVFIoY29udmVyc2lvbl9tb2RlLCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgMCkKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX0NIMV9PRkZTRVQoX21vZGUsIF9zaG93LCBfc3RvcmUpCQlcCisJSUlPX0RFVklDRV9BVFRSKGNoMV9vZmZzZXQsIF9tb2RlLCBfc2hvdywgX3N0b3JlLCAwKQorI2RlZmluZSBJSU9fREVWX0FUVFJfQ0gyX09GRlNFVChfbW9kZSwgX3Nob3csIF9zdG9yZSkJCVwKKwlJSU9fREVWSUNFX0FUVFIoY2gyX29mZnNldCwgX21vZGUsIF9zaG93LCBfc3RvcmUsIDApCisjZGVmaW5lIElJT19ERVZfQVRUUl9DSDFfR0FJTihfbW9kZSwgX3Nob3csIF9zdG9yZSkJCVwKKwlJSU9fREVWSUNFX0FUVFIoY2gxX2dhaW4sIF9tb2RlLCBfc2hvdywgX3N0b3JlLCAwKQorI2RlZmluZSBJSU9fREVWX0FUVFJfQ0gyX0dBSU4oX21vZGUsIF9zaG93LCBfc3RvcmUpCQlcCisJSUlPX0RFVklDRV9BVFRSKGNoMl9nYWluLCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgMCkKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX0NIMV9WQUxVRShfc2hvdykJCVwKKwlJSU9fREVWSUNFX0FUVFIoY2gxX3ZhbHVlLCBTX0lSVUdPLCBfc2hvdywgTlVMTCwgMCkKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX0NIMl9WQUxVRShfc2hvdykJCVwKKwlJSU9fREVWSUNFX0FUVFIoY2gyX3ZhbHVlLCBTX0lSVUdPLCBfc2hvdywgTlVMTCwgMCkKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX0NIMV9TRVRVUChfbW9kZSwgX3Nob3csIF9zdG9yZSkJCVwKKwlJSU9fREVWSUNFX0FUVFIoY2gxX3NldHVwLCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgMCkKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX0NIMl9TRVRVUChfbW9kZSwgX3Nob3csIF9zdG9yZSkgICAgICAgICAgICAgIFwKKwlJSU9fREVWSUNFX0FUVFIoY2gyX3NldHVwLCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgMCkKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX0ZJTFRFUl9SQVRFX1NFVFVQKF9tb2RlLCBfc2hvdywgX3N0b3JlKSAgICAgICAgICAgICAgXAorCUlJT19ERVZJQ0VfQVRUUihmaWx0ZXJfcmF0ZV9zZXR1cCwgX21vZGUsIF9zaG93LCBfc3RvcmUsIDApCisKK3N0YXRpYyBzc2l6ZV90IGFkNzE1Ml9zaG93X2NvbnZlcnNpb25fbW9kZXMoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCWludCBpOworCWludCBsZW4gPSAwOworCisJZm9yIChpID0gMDsgaSA8IEFENzE1Ml9NQVhfQ09OVl9NT0RFOyBpKyspCisJCWxlbiArPSBzcHJpbnRmKGJ1ZiArIGxlbiwgIiVzICIsIGFkNzE1Ml9jb252X21vZGVfdGFibGVbaV0ubmFtZSk7CisKKwlsZW4gKz0gc3ByaW50ZihidWYgKyBsZW4sICJcbiIpOworCisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIElJT19ERVZfQVRUUl9BVkFJTF9DT05WRVJTSU9OX01PREVTKGFkNzE1Ml9zaG93X2NvbnZlcnNpb25fbW9kZXMpOworCitzdGF0aWMgc3NpemVfdCBhZDcxNTJfc2hvd19jaDFfdmFsdWUoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDcxNTJfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCXU4IGRhdGFbMl07CisKKwlhZDcxNTJfaTJjX3JlYWQoY2hpcCwgQUQ3MTUyX0NIMV9EQVRBX0hJR0gsIGRhdGEsIDIpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCAoKGludClkYXRhWzBdIDw8IDgpIHwgZGF0YVsxXSk7Cit9CisKK3N0YXRpYyBJSU9fREVWX0FUVFJfQ0gxX1ZBTFVFKGFkNzE1Ml9zaG93X2NoMV92YWx1ZSk7CisKK3N0YXRpYyBzc2l6ZV90IGFkNzE1Ml9zaG93X2NoMl92YWx1ZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkNzE1Ml9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisJdTggZGF0YVsyXTsKKworCWFkNzE1Ml9pMmNfcmVhZChjaGlwLCBBRDcxNTJfQ0gyX0RBVEFfSElHSCwgZGF0YSwgMik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsICgoaW50KWRhdGFbMF0gPDwgOCkgfCBkYXRhWzFdKTsKK30KKworc3RhdGljIElJT19ERVZfQVRUUl9DSDJfVkFMVUUoYWQ3MTUyX3Nob3dfY2gyX3ZhbHVlKTsKKworc3RhdGljIHNzaXplX3QgYWQ3MTUyX3Nob3dfY29udmVyc2lvbl9tb2RlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ3MTUyX2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVzXG4iLCBjaGlwLT5jb252ZXJzaW9uX21vZGUpOworfQorCitzdGF0aWMgc3NpemVfdCBhZDcxNTJfc3RvcmVfY29udmVyc2lvbl9tb2RlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ3MTUyX2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKwl1OCBjZmc7CisJaW50IGk7CisKKwlhZDcxNTJfaTJjX3JlYWQoY2hpcCwgQUQ3MTUyX0NGRywgJmNmZywgMSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQUQ3MTUyX01BWF9DT05WX01PREU7IGkrKykKKwkJaWYgKHN0cm5jbXAoYnVmLCBhZDcxNTJfY29udl9tb2RlX3RhYmxlW2ldLm5hbWUsCisJCQkJc3RybGVuKGFkNzE1Ml9jb252X21vZGVfdGFibGVbaV0ubmFtZSkgLSAxKSA9PSAwKSB7CisJCQljaGlwLT5jb252ZXJzaW9uX21vZGUgPSBhZDcxNTJfY29udl9tb2RlX3RhYmxlW2ldLm5hbWU7CisJCQljZmcgfD0gMHgxOCB8IGFkNzE1Ml9jb252X21vZGVfdGFibGVbaV0ucmVnX2NmZzsKKwkJCWFkNzE1Ml9pMmNfd3JpdGUoY2hpcCwgQUQ3MTUyX0NGRywgY2ZnKTsKKwkJCXJldHVybiBsZW47CisJCX0KKworCWRldl9lcnIoZGV2LCAibm90IHN1cHBvcnRlZCBjb252ZXJzaW9uIG1vZGVcbiIpOworCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBJSU9fREVWX0FUVFJfQ09OVkVSU0lPTl9NT0RFKFNfSVJVR08gfCBTX0lXVVNSLAorCQlhZDcxNTJfc2hvd19jb252ZXJzaW9uX21vZGUsCisJCWFkNzE1Ml9zdG9yZV9jb252ZXJzaW9uX21vZGUpOworCitzdGF0aWMgc3NpemVfdCBhZDcxNTJfc2hvd19jaDFfb2Zmc2V0KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ3MTUyX2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBjaGlwLT5jaDFfb2Zmc2V0KTsKK30KKworc3RhdGljIHNzaXplX3QgYWQ3MTUyX3N0b3JlX2NoMV9vZmZzZXQoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgbGVuKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDcxNTJfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZGF0YTsKKwlpbnQgcmV0OworCisJcmV0ID0gc3RyaWN0X3N0cnRvdWwoYnVmLCAxMCwgJmRhdGEpOworCisJaWYgKCghcmV0KSAmJiAoZGF0YSA8IDB4MTAwMDApKSB7CisJCWFkNzE1Ml9pMmNfd3JpdGUoY2hpcCwgQUQ3MTUyX0NIMV9PRkZTX0hJR0gsIGRhdGEgPj4gOCk7CisJCWFkNzE1Ml9pMmNfd3JpdGUoY2hpcCwgQUQ3MTUyX0NIMV9PRkZTX0xPVywgZGF0YSk7CisJCWNoaXAtPmNoMV9vZmZzZXQgPSBkYXRhOworCQlyZXR1cm4gbGVuOworCX0KKworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgSUlPX0RFVl9BVFRSX0NIMV9PRkZTRVQoU19JUlVHTyB8IFNfSVdVU1IsCisJCWFkNzE1Ml9zaG93X2NoMV9vZmZzZXQsCisJCWFkNzE1Ml9zdG9yZV9jaDFfb2Zmc2V0KTsKKworc3RhdGljIHNzaXplX3QgYWQ3MTUyX3Nob3dfY2gyX29mZnNldChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkNzE1Ml9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgY2hpcC0+Y2gyX29mZnNldCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkNzE1Ml9zdG9yZV9jaDJfb2Zmc2V0KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ3MTUyX2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGRhdGE7CisJaW50IHJldDsKKworCXJldCA9IHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMTAsICZkYXRhKTsKKworCWlmICgoIXJldCkgJiYgKGRhdGEgPCAweDEwMDAwKSkgeworCQlhZDcxNTJfaTJjX3dyaXRlKGNoaXAsIEFENzE1Ml9DSDJfT0ZGU19ISUdILCBkYXRhID4+IDgpOworCQlhZDcxNTJfaTJjX3dyaXRlKGNoaXAsIEFENzE1Ml9DSDJfT0ZGU19MT1csIGRhdGEpOworCQljaGlwLT5jaDJfb2Zmc2V0ID0gZGF0YTsKKwkJcmV0dXJuIGxlbjsKKwl9CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIElJT19ERVZfQVRUUl9DSDJfT0ZGU0VUKFNfSVJVR08gfCBTX0lXVVNSLAorCQlhZDcxNTJfc2hvd19jaDJfb2Zmc2V0LAorCQlhZDcxNTJfc3RvcmVfY2gyX29mZnNldCk7CisKK3N0YXRpYyBzc2l6ZV90IGFkNzE1Ml9zaG93X2NoMV9nYWluKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ3MTUyX2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBjaGlwLT5jaDFfZ2Fpbik7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkNzE1Ml9zdG9yZV9jaDFfZ2FpbihzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBsZW4pCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkNzE1Ml9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisJdW5zaWduZWQgbG9uZyBkYXRhOworCWludCByZXQ7CisKKwlyZXQgPSBzdHJpY3Rfc3RydG91bChidWYsIDEwLCAmZGF0YSk7CisKKwlpZiAoKCFyZXQpICYmIChkYXRhIDwgMHgxMDAwMCkpIHsKKwkJYWQ3MTUyX2kyY193cml0ZShjaGlwLCBBRDcxNTJfQ0gxX0dBSU5fSElHSCwgZGF0YSA+PiA4KTsKKwkJYWQ3MTUyX2kyY193cml0ZShjaGlwLCBBRDcxNTJfQ0gxX0dBSU5fTE9XLCBkYXRhKTsKKwkJY2hpcC0+Y2gxX2dhaW4gPSBkYXRhOworCQlyZXR1cm4gbGVuOworCX0KKworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgSUlPX0RFVl9BVFRSX0NIMV9HQUlOKFNfSVJVR08gfCBTX0lXVVNSLAorCQlhZDcxNTJfc2hvd19jaDFfZ2FpbiwKKwkJYWQ3MTUyX3N0b3JlX2NoMV9nYWluKTsKKworc3RhdGljIHNzaXplX3QgYWQ3MTUyX3Nob3dfY2gyX2dhaW4oc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDcxNTJfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIGNoaXAtPmNoMl9nYWluKTsKK30KKworc3RhdGljIHNzaXplX3QgYWQ3MTUyX3N0b3JlX2NoMl9nYWluKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ3MTUyX2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGRhdGE7CisJaW50IHJldDsKKworCXJldCA9IHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMTAsICZkYXRhKTsKKworCWlmICgoIXJldCkgJiYgKGRhdGEgPCAweDEwMDAwKSkgeworCQlhZDcxNTJfaTJjX3dyaXRlKGNoaXAsIEFENzE1Ml9DSDJfR0FJTl9ISUdILCBkYXRhID4+IDgpOworCQlhZDcxNTJfaTJjX3dyaXRlKGNoaXAsIEFENzE1Ml9DSDJfR0FJTl9MT1csIGRhdGEpOworCQljaGlwLT5jaDJfZ2FpbiA9IGRhdGE7CisJCXJldHVybiBsZW47CisJfQorCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBJSU9fREVWX0FUVFJfQ0gyX0dBSU4oU19JUlVHTyB8IFNfSVdVU1IsCisJCWFkNzE1Ml9zaG93X2NoMl9nYWluLAorCQlhZDcxNTJfc3RvcmVfY2gyX2dhaW4pOworCitzdGF0aWMgc3NpemVfdCBhZDcxNTJfc2hvd19jaDFfc2V0dXAoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDcxNTJfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiMHglMDJ4XG4iLCBjaGlwLT5jaDFfc2V0dXApOworfQorCitzdGF0aWMgc3NpemVfdCBhZDcxNTJfc3RvcmVfY2gxX3NldHVwKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ3MTUyX2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGRhdGE7CisJaW50IHJldDsKKworCXJldCA9IHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMTAsICZkYXRhKTsKKworCWlmICgoIXJldCkgJiYgKGRhdGEgPCAweDEwMCkpIHsKKwkJYWQ3MTUyX2kyY193cml0ZShjaGlwLCBBRDcxNTJfQ0gxX1NFVFVQLCBkYXRhKTsKKwkJY2hpcC0+Y2gxX3NldHVwID0gZGF0YTsKKwkJcmV0dXJuIGxlbjsKKwl9CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIElJT19ERVZfQVRUUl9DSDFfU0VUVVAoU19JUlVHTyB8IFNfSVdVU1IsCisJCWFkNzE1Ml9zaG93X2NoMV9zZXR1cCwKKwkJYWQ3MTUyX3N0b3JlX2NoMV9zZXR1cCk7CisKK3N0YXRpYyBzc2l6ZV90IGFkNzE1Ml9zaG93X2NoMl9zZXR1cChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkNzE1Ml9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIweCUwMnhcbiIsIGNoaXAtPmNoMl9zZXR1cCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkNzE1Ml9zdG9yZV9jaDJfc2V0dXAoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgbGVuKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDcxNTJfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZGF0YTsKKwlpbnQgcmV0OworCisJcmV0ID0gc3RyaWN0X3N0cnRvdWwoYnVmLCAxMCwgJmRhdGEpOworCisJaWYgKCghcmV0KSAmJiAoZGF0YSA8IDB4MTAwKSkgeworCQlhZDcxNTJfaTJjX3dyaXRlKGNoaXAsIEFENzE1Ml9DSDJfU0VUVVAsIGRhdGEpOworCQljaGlwLT5jaDJfc2V0dXAgPSBkYXRhOworCQlyZXR1cm4gbGVuOworCX0KKworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgSUlPX0RFVl9BVFRSX0NIMl9TRVRVUChTX0lSVUdPIHwgU19JV1VTUiwKKwkJYWQ3MTUyX3Nob3dfY2gyX3NldHVwLAorCQlhZDcxNTJfc3RvcmVfY2gyX3NldHVwKTsKKworc3RhdGljIHNzaXplX3QgYWQ3MTUyX3Nob3dfZmlsdGVyX3JhdGVfc2V0dXAoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDcxNTJfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiMHglMDJ4XG4iLCBjaGlwLT5maWx0ZXJfcmF0ZV9zZXR1cCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkNzE1Ml9zdG9yZV9maWx0ZXJfcmF0ZV9zZXR1cChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBsZW4pCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkNzE1Ml9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisJdW5zaWduZWQgbG9uZyBkYXRhOworCWludCByZXQ7CisKKwlyZXQgPSBzdHJpY3Rfc3RydG91bChidWYsIDEwLCAmZGF0YSk7CisKKwlpZiAoKCFyZXQpICYmIChkYXRhIDwgMHgxMDApKSB7CisJCWFkNzE1Ml9pMmNfd3JpdGUoY2hpcCwgQUQ3MTUyX0NGRzIsIGRhdGEpOworCQljaGlwLT5maWx0ZXJfcmF0ZV9zZXR1cCA9IGRhdGE7CisJCXJldHVybiBsZW47CisJfQorCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBJSU9fREVWX0FUVFJfRklMVEVSX1JBVEVfU0VUVVAoU19JUlVHTyB8IFNfSVdVU1IsCisJCWFkNzE1Ml9zaG93X2ZpbHRlcl9yYXRlX3NldHVwLAorCQlhZDcxNTJfc3RvcmVfZmlsdGVyX3JhdGVfc2V0dXApOworCitzdGF0aWMgc3NpemVfdCBhZDcxNTJfc2hvd19uYW1lKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ3MTUyX2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlc1xuIiwgY2hpcC0+bmFtZSk7Cit9CisKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIobmFtZSwgU19JUlVHTywgYWQ3MTUyX3Nob3dfbmFtZSwgTlVMTCwgMCk7CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICphZDcxNTJfYXR0cmlidXRlc1tdID0geworCSZpaW9fZGV2X2F0dHJfYXZhaWxhYmxlX2NvbnZlcnNpb25fbW9kZXMuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2NvbnZlcnNpb25fbW9kZS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfY2gxX2dhaW4uZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2NoMl9nYWluLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9jaDFfb2Zmc2V0LmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9jaDJfb2Zmc2V0LmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9jaDFfdmFsdWUuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2NoMl92YWx1ZS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfY2gxX3NldHVwLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9jaDJfc2V0dXAuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2ZpbHRlcl9yYXRlX3NldHVwLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9uYW1lLmRldl9hdHRyLmF0dHIsCisJTlVMTCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGFkNzE1Ml9hdHRyaWJ1dGVfZ3JvdXAgPSB7CisJLmF0dHJzID0gYWQ3MTUyX2F0dHJpYnV0ZXMsCit9OworCisvKgorICogZGV2aWNlIHByb2JlIGFuZCByZW1vdmUKKyAqLworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBhZDcxNTJfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKKwkJY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQoreworCWludCByZXQgPSAwOworCXN0cnVjdCBhZDcxNTJfY2hpcF9pbmZvICpjaGlwID0ga3phbGxvYyhzaXplb2YoKmNoaXApLCBHRlBfS0VSTkVMKTsKKwlpZiAoY2hpcCA9PSBOVUxMKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3JfcmV0OworCX0KKworCS8qIHRoaXMgaXMgb25seSB1c2VkIGZvciBkZXZpY2UgcmVtb3ZhbCBwdXJwb3NlcyAqLworCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIGNoaXApOworCisJY2hpcC0+Y2xpZW50ID0gY2xpZW50OworCWNoaXAtPm5hbWUgPSBpZC0+bmFtZTsKKworCWNoaXAtPmluZGlvX2RldiA9IGlpb19hbGxvY2F0ZV9kZXZpY2UoKTsKKwlpZiAoY2hpcC0+aW5kaW9fZGV2ID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJvcl9mcmVlX2NoaXA7CisJfQorCisJLyogRWNoaXBhYmlsaXNoIHRoYXQgdGhlIGlpb19kZXYgaXMgYSBjaGlsZCBvZiB0aGUgaTJjIGRldmljZSAqLworCWNoaXAtPmluZGlvX2Rldi0+ZGV2LnBhcmVudCA9ICZjbGllbnQtPmRldjsKKwljaGlwLT5pbmRpb19kZXYtPmF0dHJzID0gJmFkNzE1Ml9hdHRyaWJ1dGVfZ3JvdXA7CisJY2hpcC0+aW5kaW9fZGV2LT5kZXZfZGF0YSA9ICh2b2lkICopKGNoaXApOworCWNoaXAtPmluZGlvX2Rldi0+ZHJpdmVyX21vZHVsZSA9IFRISVNfTU9EVUxFOworCWNoaXAtPmluZGlvX2Rldi0+bW9kZXMgPSBJTkRJT19ESVJFQ1RfTU9ERTsKKworCXJldCA9IGlpb19kZXZpY2VfcmVnaXN0ZXIoY2hpcC0+aW5kaW9fZGV2KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX2ZyZWVfZGV2OworCisJZGV2X2VycigmY2xpZW50LT5kZXYsICIlcyBjYXBhY2l0aXZlIHNlbnNvciByZWdpc3RlcmVkXG4iLCBpZC0+bmFtZSk7CisKKwlyZXR1cm4gMDsKKworZXJyb3JfZnJlZV9kZXY6CisJaWlvX2ZyZWVfZGV2aWNlKGNoaXAtPmluZGlvX2Rldik7CitlcnJvcl9mcmVlX2NoaXA6CisJa2ZyZWUoY2hpcCk7CitlcnJvcl9yZXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgYWQ3MTUyX3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXN0cnVjdCBhZDcxNTJfY2hpcF9pbmZvICpjaGlwID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGNoaXAtPmluZGlvX2RldjsKKworCWlmIChjbGllbnQtPmlycSAmJiBncGlvX2lzX3ZhbGlkKGlycV90b19ncGlvKGNsaWVudC0+aXJxKSkgPiAwKQorCQlpaW9fdW5yZWdpc3Rlcl9pbnRlcnJ1cHRfbGluZShpbmRpb19kZXYsIDApOworCWlpb19kZXZpY2VfdW5yZWdpc3RlcihpbmRpb19kZXYpOworCWtmcmVlKGNoaXApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCBhZDcxNTJfaWRbXSA9IHsKKwl7ICJhZDcxNTIiLCAwIH0sCisJeyAiYWQ3MTUzIiwgMCB9LAorCXt9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgYWQ3MTUyX2lkKTsKKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGFkNzE1Ml9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAiYWQ3MTUyIiwKKwl9LAorCS5wcm9iZSA9IGFkNzE1Ml9wcm9iZSwKKwkucmVtb3ZlID0gX19kZXZleGl0X3AoYWQ3MTUyX3JlbW92ZSksCisJLmlkX3RhYmxlID0gYWQ3MTUyX2lkLAorfTsKKworc3RhdGljIF9faW5pdCBpbnQgYWQ3MTUyX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gaTJjX2FkZF9kcml2ZXIoJmFkNzE1Ml9kcml2ZXIpOworfQorCitzdGF0aWMgX19leGl0IHZvaWQgYWQ3MTUyX2V4aXQodm9pZCkKK3sKKwlpMmNfZGVsX2RyaXZlcigmYWQ3MTUyX2RyaXZlcik7Cit9CisKK01PRFVMRV9BVVRIT1IoIkJhcnJ5IFNvbmcgPDIxY25iYW9AZ21haWwuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJBbmFsb2cgRGV2aWNlcyBhZDcxNTIvMyBjYXBhY2l0aXZlIHNlbnNvciBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKKworbW9kdWxlX2luaXQoYWQ3MTUyX2luaXQpOworbW9kdWxlX2V4aXQoYWQ3MTUyX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvYWQ3MjkxLmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9hZDcyOTEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDA0MWE3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvYWQ3MjkxLmMKQEAgLTAsMCArMSwxMDM5IEBACisvKgorICogQUQ3MjkxIGRpZ2l0YWwgdGVtcGVyYXR1cmUgc2Vuc29yIGRyaXZlciBzdXBwb3J0aW5nIEFENzI5MQorICoKKyAqIENvcHlyaWdodCAyMDEwIEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvcnRjLmg+CisKKyNpbmNsdWRlICIuLi9paW8uaCIKKyNpbmNsdWRlICIuLi9zeXNmcy5oIgorCisvKgorICogQUQ3MjkxIHJlZ2lzdGVycyBkZWZpbml0aW9uCisgKi8KKyNkZWZpbmUgQUQ3MjkxX0NPTU1BTkQJCQkwCisjZGVmaW5lIEFENzI5MV9WT0xUQUdFCQkJMQorI2RlZmluZSBBRDcyOTFfVF9TRU5TRQkJCTIKKyNkZWZpbmUgQUQ3MjkxX1RfQVZFUkFHRQkJMworI2RlZmluZSBBRDcyOTFfVk9MVEFHRV9MSU1JVF9CQVNFCTQKKyNkZWZpbmUgQUQ3MjkxX1ZPTFRBR0VfTElNSVRfQ09VTlQJOAorI2RlZmluZSBBRDcyOTFfVF9TRU5TRV9ISUdICQkweDFjCisjZGVmaW5lIEFENzI5MV9UX1NFTlNFX0xPVwkJMHgxZAorI2RlZmluZSBBRDcyOTFfVF9TRU5TRV9IWVNUCQkweDFlCisjZGVmaW5lIEFENzI5MV9WT0xUQUdFX0FMRVJUX1NUQVRVUwkweDFmCisjZGVmaW5lIEFENzI5MV9UX0FMRVJUX1NUQVRVUwkJMHgyMAorCisvKgorICogQUQ3MjkxIGNvbW1hbmQKKyAqLworI2RlZmluZSBBRDcyOTFfQVVUT0NZQ0xFCQkweDEKKyNkZWZpbmUgQUQ3MjkxX1JFU0VUCQkJMHgyCisjZGVmaW5lIEFENzI5MV9BTEFSVF9DTEVBUgkJMHg0CisjZGVmaW5lIEFENzI5MV9BTEFSVF9QT0xBUklUWQkJMHg4CisjZGVmaW5lIEFENzI5MV9FWFRfUkVGCQkJMHgxMAorI2RlZmluZSBBRDcyOTFfTk9JU0VfREVMQVkJCTB4MjAKKyNkZWZpbmUgQUQ3MjkxX1RfU0VOU0VfTUFTSwkJMHg0MAorI2RlZmluZSBBRDcyOTFfVk9MVEFHRV9NQVNLCQkweGZmMDAKKyNkZWZpbmUgQUQ3MjkxX1ZPTFRBR0VfT0ZGU0VUCQkweDgKKworLyoKKyAqIEFENzI5MSB2YWx1ZSBtYXNrcworICovCisjZGVmaW5lIEFENzI5MV9DSEFOTkVMX01BU0sJCTB4ZjAwMAorI2RlZmluZSBBRDcyOTFfVkFMVUVfTUFTSwkJMHhmZmYKKyNkZWZpbmUgQUQ3MjkxX1RfVkFMVUVfU0lHTgkJMHg0MDAKKyNkZWZpbmUgQUQ3MjkxX1RfVkFMVUVfRkxPQVRfT0ZGU0VUCTIKKyNkZWZpbmUgQUQ3MjkxX1RfVkFMVUVfRkxPQVRfTUFTSwkweDIKKworLyoKKyAqIHN0cnVjdCBhZDcyOTFfY2hpcF9pbmZvIC0gY2hpcCBzcGVjaWZjIGluZm9ybWF0aW9uCisgKi8KKworc3RydWN0IGFkNzI5MV9jaGlwX2luZm8geworCWNvbnN0IGNoYXIgKm5hbWU7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudDsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2OworCXN0cnVjdCB3b3JrX3N0cnVjdCB0aHJlc2hfd29yazsKKwlzNjQgbGFzdF90aW1lc3RhbXA7CisJdTE2IGNvbW1hbmQ7CisJdTggIGNoYW5uZWxzOwkvKiBBY3RpdmUgdm9sdGFnZSBjaGFubmVscyAqLworfTsKKworLyoKKyAqIHN0cnVjdCBhZDcyOTFfY2hpcF9pbmZvIC0gY2hpcCBzcGVjaWZjIGluZm9ybWF0aW9uCisgKi8KKworc3RydWN0IGFkNzI5MV9saW1pdF9yZWdzIHsKKwl1MTYJZGF0YV9oaWdoOworCXUxNglkYXRhX2xvdzsKKwl1MTYJaHlzdGVyZXNpczsKK307CisKKy8qCisgKiBhZDcyOTEgcmVnaXN0ZXIgYWNjZXNzIGJ5IEkyQworICovCitzdGF0aWMgaW50IGFkNzI5MV9pMmNfcmVhZChzdHJ1Y3QgYWQ3MjkxX2NoaXBfaW5mbyAqY2hpcCwgdTggcmVnLCB1MTYgKmRhdGEpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IGNoaXAtPmNsaWVudDsKKwlpbnQgcmV0ID0gMDsKKworCXJldCA9IGkyY19zbWJ1c19yZWFkX3dvcmRfZGF0YShjbGllbnQsIHJlZyk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJJMkMgcmVhZCBlcnJvclxuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJKmRhdGEgPSBzd2FiMTYoKHUxNilyZXQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWQ3MjkxX2kyY193cml0ZShzdHJ1Y3QgYWQ3MjkxX2NoaXBfaW5mbyAqY2hpcCwgdTggcmVnLCB1MTYgZGF0YSkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gY2hpcC0+Y2xpZW50OworCWludCByZXQgPSAwOworCisJcmV0ID0gaTJjX3NtYnVzX3dyaXRlX3dvcmRfZGF0YShjbGllbnQsIHJlZywgc3dhYjE2KGRhdGEpKTsKKwlpZiAocmV0IDwgMCkKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJJMkMgd3JpdGUgZXJyb3JcbiIpOworCisJcmV0dXJuIHJldDsKK30KKworLyogUmV0dXJucyBuZWdhdGl2ZSBlcnJubywgb3IgZWxzZSB0aGUgbnVtYmVyIG9mIHdvcmRzIHJlYWQuICovCitzdGF0aWMgaW50IGFkNzI5MV9pMmNfcmVhZF9kYXRhKHN0cnVjdCBhZDcyOTFfY2hpcF9pbmZvICpjaGlwLCB1OCByZWcsIHUxNiAqZGF0YSkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gY2hpcC0+Y2xpZW50OworCXU4IGNvbW1hbmRzWzRdOworCWludCByZXQgPSAwOworCWludCBpLCBjb3VudDsKKworCWlmIChyZWcgPT0gQUQ3MjkxX1RfU0VOU0UgfHwgcmVnID09IEFENzI5MV9UX0FWRVJBR0UpCisJCWNvdW50ID0gMjsKKwllbHNlIGlmIChyZWcgPT0gQUQ3MjkxX1ZPTFRBR0UpIHsKKwkJaWYgKCFjaGlwLT5jaGFubmVscykgeworCQkJZGV2X2VycigmY2xpZW50LT5kZXYsICJObyB2b2x0YWdlIGNoYW5uZWwgaXMgc2VsZWN0ZWQuXG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWNvdW50ID0gMiArIGNoaXAtPmNoYW5uZWxzICogMjsKKwl9IGVsc2UgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIkkyQyB3cm9uZyBkYXRhIHJlZ2lzdGVyXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJY29tbWFuZHNbMF0gPSAwOworCWNvbW1hbmRzWzFdID0gKGNoaXAtPmNvbW1hbmQgPj4gOCkgJiAweGZmOworCWNvbW1hbmRzWzJdID0gY2hpcC0+Y29tbWFuZCAmIDB4ZmY7CisJY29tbWFuZHNbM10gPSByZWc7CisKKwlyZXQgPSBpMmNfbWFzdGVyX3NlbmQoY2xpZW50LCBjb21tYW5kcywgNCk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJJMkMgbWFzdGVyIHNlbmQgZXJyb3JcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldCA9IGkyY19tYXN0ZXJfcmVjdihjbGllbnQsICh1OCAqKWRhdGEsIGNvdW50KTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIkkyQyBtYXN0ZXIgcmVjZWl2ZSBlcnJvclxuIik7CisJCXJldHVybiByZXQ7CisJfQorCXJldCA+Pj0gMjsKKworCWZvciAoaSA9IDA7IGkgPCByZXQ7IGkrKykKKwkJZGF0YVtpXSA9IHN3YWIxNihkYXRhW2ldKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkNzI5MV9zaG93X21vZGUoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDcyOTFfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCisJaWYgKGNoaXAtPmNvbW1hbmQgJiBBRDcyOTFfQVVUT0NZQ0xFKQorCQlyZXR1cm4gc3ByaW50ZihidWYsICJhdXRvY3ljbGVcbiIpOworCWVsc2UKKwkJcmV0dXJuIHNwcmludGYoYnVmLCAiY29tbWFuZFxuIik7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkNzI5MV9zdG9yZV9tb2RlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ3MjkxX2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKwl1MTYgY29tbWFuZDsKKwlpbnQgcmV0OworCisJY29tbWFuZCA9IGNoaXAtPmNvbW1hbmQgJiAofkFENzI5MV9BVVRPQ1lDTEUpOworCWlmIChzdHJjbXAoYnVmLCAiYXV0b2N5Y2xlIikpCisJCWNvbW1hbmQgfD0gQUQ3MjkxX0FVVE9DWUNMRTsKKworCXJldCA9IGFkNzI5MV9pMmNfd3JpdGUoY2hpcCwgQUQ3MjkxX0NPTU1BTkQsIGNvbW1hbmQpOworCWlmIChyZXQpCisJCXJldHVybiAtRUlPOworCisJY2hpcC0+Y29tbWFuZCA9IGNvbW1hbmQ7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKG1vZGUsIFNfSVJVR08gfCBTX0lXVVNSLAorCQlhZDcyOTFfc2hvd19tb2RlLAorCQlhZDcyOTFfc3RvcmVfbW9kZSwKKwkJMCk7CisKK3N0YXRpYyBzc2l6ZV90IGFkNzI5MV9zaG93X2F2YWlsYWJsZV9tb2RlcyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiY29tbWFuZFxuYXV0b2N5Y2xlXG4iKTsKK30KKworc3RhdGljIElJT19ERVZJQ0VfQVRUUihhdmFpbGFibGVfbW9kZXMsIFNfSVJVR08sIGFkNzI5MV9zaG93X2F2YWlsYWJsZV9tb2RlcywgTlVMTCwgMCk7CisKK3N0YXRpYyBzc2l6ZV90IGFkNzI5MV9zdG9yZV9yZXNldChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBsZW4pCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkNzI5MV9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisJdTE2IGNvbW1hbmQ7CisJaW50IHJldDsKKworCWNvbW1hbmQgPSBjaGlwLT5jb21tYW5kIHwgQUQ3MjkxX1JFU0VUOworCisJcmV0ID0gYWQ3MjkxX2kyY193cml0ZShjaGlwLCBBRDcyOTFfQ09NTUFORCwgY29tbWFuZCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIC1FSU87CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKHJlc2V0LCBTX0lXVVNSLAorCQlOVUxMLAorCQlhZDcyOTFfc3RvcmVfcmVzZXQsCisJCTApOworCitzdGF0aWMgc3NpemVfdCBhZDcyOTFfc2hvd19leHRfcmVmKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ3MjkxX2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCAhIShjaGlwLT5jb21tYW5kICYgQUQ3MjkxX0VYVF9SRUYpKTsKK30KKworc3RhdGljIHNzaXplX3QgYWQ3MjkxX3N0b3JlX2V4dF9yZWYoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgbGVuKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDcyOTFfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCXUxNiBjb21tYW5kOworCWludCByZXQ7CisKKwljb21tYW5kID0gY2hpcC0+Y29tbWFuZCAmICh+QUQ3MjkxX0VYVF9SRUYpOworCWlmIChzdHJjbXAoYnVmLCAiMSIpKQorCQljb21tYW5kIHw9IEFENzI5MV9FWFRfUkVGOworCisJcmV0ID0gYWQ3MjkxX2kyY193cml0ZShjaGlwLCBBRDcyOTFfQ09NTUFORCwgY29tbWFuZCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIC1FSU87CisKKwljaGlwLT5jb21tYW5kID0gY29tbWFuZDsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIoZXh0X3JlZiwgU19JUlVHTyB8IFNfSVdVU1IsCisJCWFkNzI5MV9zaG93X2V4dF9yZWYsCisJCWFkNzI5MV9zdG9yZV9leHRfcmVmLAorCQkwKTsKKworc3RhdGljIHNzaXplX3QgYWQ3MjkxX3Nob3dfbm9pc2VfZGVsYXkoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDcyOTFfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsICEhKGNoaXAtPmNvbW1hbmQgJiBBRDcyOTFfTk9JU0VfREVMQVkpKTsKK30KKworc3RhdGljIHNzaXplX3QgYWQ3MjkxX3N0b3JlX25vaXNlX2RlbGF5KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ3MjkxX2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKwl1MTYgY29tbWFuZDsKKwlpbnQgcmV0OworCisJY29tbWFuZCA9IGNoaXAtPmNvbW1hbmQgJiAofkFENzI5MV9OT0lTRV9ERUxBWSk7CisJaWYgKHN0cmNtcChidWYsICIxIikpCisJCWNvbW1hbmQgfD0gQUQ3MjkxX05PSVNFX0RFTEFZOworCisJcmV0ID0gYWQ3MjkxX2kyY193cml0ZShjaGlwLCBBRDcyOTFfQ09NTUFORCwgY29tbWFuZCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIC1FSU87CisKKwljaGlwLT5jb21tYW5kID0gY29tbWFuZDsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIobm9pc2VfZGVsYXksIFNfSVJVR08gfCBTX0lXVVNSLAorCQlhZDcyOTFfc2hvd19ub2lzZV9kZWxheSwKKwkJYWQ3MjkxX3N0b3JlX25vaXNlX2RlbGF5LAorCQkwKTsKKworc3RhdGljIHNzaXplX3QgYWQ3MjkxX3Nob3dfdF9zZW5zZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkNzI5MV9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisJdTE2IGRhdGE7CisJY2hhciBzaWduID0gJyAnOworCWludCByZXQ7CisKKwlyZXQgPSBhZDcyOTFfaTJjX3JlYWRfZGF0YShjaGlwLCBBRDcyOTFfVF9TRU5TRSwgJmRhdGEpOworCWlmIChyZXQpCisJCXJldHVybiAtRUlPOworCisJaWYgKGRhdGEgJiBBRDcyOTFfVF9WQUxVRV9TSUdOKSB7CisJCS8qIGNvbnZlcnQgc3VwcGxlbWVudCB0byBwb3NpdGl2ZSB2YWx1ZSAqLworCQlkYXRhID0gKEFENzI5MV9UX1ZBTFVFX1NJR04gPDwgMSkgLSBkYXRhOworCQlzaWduID0gJy0nOworCX0KKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVjJWQuJS4yZFxuIiwgc2lnbiwKKwkJKGRhdGEgPj4gQUQ3MjkxX1RfVkFMVUVfRkxPQVRfT0ZGU0VUKSwKKwkJKGRhdGEgJiBBRDcyOTFfVF9WQUxVRV9GTE9BVF9NQVNLKSAqIDI1KTsKK30KKworc3RhdGljIElJT19ERVZJQ0VfQVRUUih0X3NlbnNlLCBTX0lSVUdPLCBhZDcyOTFfc2hvd190X3NlbnNlLCBOVUxMLCAwKTsKKworc3RhdGljIHNzaXplX3QgYWQ3MjkxX3Nob3dfdF9hdmVyYWdlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ3MjkxX2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKwl1MTYgZGF0YTsKKwljaGFyIHNpZ24gPSAnICc7CisJaW50IHJldDsKKworCXJldCA9IGFkNzI5MV9pMmNfcmVhZF9kYXRhKGNoaXAsIEFENzI5MV9UX0FWRVJBR0UsICZkYXRhKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gLUVJTzsKKworCWlmIChkYXRhICYgQUQ3MjkxX1RfVkFMVUVfU0lHTikgeworCQkvKiBjb252ZXJ0IHN1cHBsZW1lbnQgdG8gcG9zaXRpdmUgdmFsdWUgKi8KKwkJZGF0YSA9IChBRDcyOTFfVF9WQUxVRV9TSUdOIDw8IDEpIC0gZGF0YTsKKwkJc2lnbiA9ICctJzsKKwl9CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlYyVkLiUuMmRcbiIsIHNpZ24sCisJCShkYXRhID4+IEFENzI5MV9UX1ZBTFVFX0ZMT0FUX09GRlNFVCksCisJCShkYXRhICYgQUQ3MjkxX1RfVkFMVUVfRkxPQVRfTUFTSykgKiAyNSk7Cit9CisKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIodF9hdmVyYWdlLCBTX0lSVUdPLCBhZDcyOTFfc2hvd190X2F2ZXJhZ2UsIE5VTEwsIDApOworCitzdGF0aWMgc3NpemVfdCBhZDcyOTFfc2hvd192b2x0YWdlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ3MjkxX2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKwl1MTYgZGF0YVtBRDcyOTFfVk9MVEFHRV9MSU1JVF9DT1VOVF07CisJaW50IGksIHNpemUsIHJldDsKKworCXJldCA9IGFkNzI5MV9pMmNfcmVhZF9kYXRhKGNoaXAsIEFENzI5MV9WT0xUQUdFLCBkYXRhKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gLUVJTzsKKworCWZvciAoaSA9IDA7IGkgPCBBRDcyOTFfVk9MVEFHRV9MSU1JVF9DT1VOVDsgaSsrKSB7CisJCWlmIChjaGlwLT5jb21tYW5kICYgKEFENzI5MV9UX1NFTlNFX01BU0sgPDwgaSkpIHsKKwkJCXJldCA9IHNwcmludGYoYnVmLCAiY2hhbm5lbFslZF09JWRcbiIsIGksCisJCQkJCWRhdGFbaV0gJiBBRDcyOTFfVkFMVUVfTUFTSyk7CisJCQlpZiAocmV0IDwgMCkKKwkJCQlicmVhazsKKwkJCWJ1ZiArPSByZXQ7CisJCQlzaXplICs9IHJldDsKKwkJfQorCX0KKworCXJldHVybiBzaXplOworfQorCitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKHZvbHRhZ2UsIFNfSVJVR08sIGFkNzI5MV9zaG93X3ZvbHRhZ2UsIE5VTEwsIDApOworCitzdGF0aWMgc3NpemVfdCBhZDcyOTFfc2hvd19jaGFubmVsX21hc2soc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDcyOTFfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiMHgleFxuIiwgKGNoaXAtPmNvbW1hbmQgJiBBRDcyOTFfVk9MVEFHRV9NQVNLKSA+PgorCQkJQUQ3MjkxX1ZPTFRBR0VfT0ZGU0VUKTsKK30KKworc3RhdGljIHNzaXplX3QgYWQ3MjkxX3N0b3JlX2NoYW5uZWxfbWFzayhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBsZW4pCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkNzI5MV9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisJdTE2IGNvbW1hbmQ7CisJdW5zaWduZWQgbG9uZyBkYXRhOworCWludCBpLCByZXQ7CisKKwlyZXQgPSBzdHJpY3Rfc3RydG91bChidWYsIDE2LCAmZGF0YSk7CisJaWYgKHJldCB8fCBkYXRhID4gMHhmZikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwljb21tYW5kID0gY2hpcC0+Y29tbWFuZCAmICh+QUQ3MjkxX1ZPTFRBR0VfTUFTSyk7CisJY29tbWFuZCB8PSBkYXRhIDw8IEFENzI5MV9WT0xUQUdFX09GRlNFVDsKKworCXJldCA9IGFkNzI5MV9pMmNfd3JpdGUoY2hpcCwgQUQ3MjkxX0NPTU1BTkQsIGNvbW1hbmQpOworCWlmIChyZXQpCisJCXJldHVybiAtRUlPOworCisJY2hpcC0+Y29tbWFuZCA9IGNvbW1hbmQ7CisKKwlmb3IgKGkgPSAwLCBjaGlwLT5jaGFubmVscyA9IDA7IGkgPCBBRDcyOTFfVk9MVEFHRV9MSU1JVF9DT1VOVDsgaSsrKSB7CisJCWlmIChjaGlwLT5jb21tYW5kICYgKEFENzI5MV9UX1NFTlNFX01BU0sgPDwgaSkpCisJCQljaGlwLT5jaGFubmVscysrOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIoY2hhbm5lbF9tYXNrLCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJYWQ3MjkxX3Nob3dfY2hhbm5lbF9tYXNrLAorCQlhZDcyOTFfc3RvcmVfY2hhbm5lbF9tYXNrLAorCQkwKTsKKworc3RhdGljIHNzaXplX3QgYWQ3MjkxX3Nob3dfbmFtZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkNzI5MV9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXNcbiIsIGNoaXAtPm5hbWUpOworfQorCitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKG5hbWUsIFNfSVJVR08sIGFkNzI5MV9zaG93X25hbWUsIE5VTEwsIDApOworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqYWQ3MjkxX2F0dHJpYnV0ZXNbXSA9IHsKKwkmaWlvX2Rldl9hdHRyX2F2YWlsYWJsZV9tb2Rlcy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfbW9kZS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfcmVzZXQuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2V4dF9yZWYuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX25vaXNlX2RlbGF5LmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl90X3NlbnNlLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl90X2F2ZXJhZ2UuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX3ZvbHRhZ2UuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2NoYW5uZWxfbWFzay5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfbmFtZS5kZXZfYXR0ci5hdHRyLAorCU5VTEwsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBhZDcyOTFfYXR0cmlidXRlX2dyb3VwID0geworCS5hdHRycyA9IGFkNzI5MV9hdHRyaWJ1dGVzLAorfTsKKworLyoKKyAqIHRlbXBlcmF0dXJlIGJvdW5kIGV2ZW50cworICovCisKKyNkZWZpbmUgSUlPX0VWRU5UX0NPREVfQUQ3MjkxX1RfU0VOU0VfSElHSCAgSUlPX0JVRkZFUl9FVkVOVF9DT0RFKDApCisjZGVmaW5lIElJT19FVkVOVF9DT0RFX0FENzI5MV9UX1NFTlNFX0xPVyAgIElJT19CVUZGRVJfRVZFTlRfQ09ERSgxKQorI2RlZmluZSBJSU9fRVZFTlRfQ09ERV9BRDcyOTFfVF9BVkdfSElHSCAgICBJSU9fQlVGRkVSX0VWRU5UX0NPREUoMikKKyNkZWZpbmUgSUlPX0VWRU5UX0NPREVfQUQ3MjkxX1RfQVZHX0xPVyAgICAgSUlPX0JVRkZFUl9FVkVOVF9DT0RFKDMpCisjZGVmaW5lIElJT19FVkVOVF9DT0RFX0FENzI5MV9WT0xUQUdFX0JBU0UgIElJT19CVUZGRVJfRVZFTlRfQ09ERSg0KQorCitzdGF0aWMgdm9pZCBhZDcyOTFfaW50ZXJydXB0X2JoKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29ya19zKQoreworCXN0cnVjdCBhZDcyOTFfY2hpcF9pbmZvICpjaGlwID0KKwkJY29udGFpbmVyX29mKHdvcmtfcywgc3RydWN0IGFkNzI5MV9jaGlwX2luZm8sIHRocmVzaF93b3JrKTsKKwl1MTYgdF9zdGF0dXMsIHZfc3RhdHVzOworCXUxNiBjb21tYW5kOworCWludCBpOworCisJaWYgKGFkNzI5MV9pMmNfcmVhZChjaGlwLCBBRDcyOTFfVF9BTEVSVF9TVEFUVVMsICZ0X3N0YXR1cykpCisJCXJldHVybjsKKworCWlmIChhZDcyOTFfaTJjX3JlYWQoY2hpcCwgQUQ3MjkxX1ZPTFRBR0VfQUxFUlRfU1RBVFVTLCAmdl9zdGF0dXMpKQorCQlyZXR1cm47CisKKwlpZiAoISh0X3N0YXR1cyB8fCB2X3N0YXR1cykpCisJCXJldHVybjsKKworCWNvbW1hbmQgPSBjaGlwLT5jb21tYW5kIHwgQUQ3MjkxX0FMQVJUX0NMRUFSOworCWFkNzI5MV9pMmNfd3JpdGUoY2hpcCwgQUQ3MjkxX0NPTU1BTkQsIGNvbW1hbmQpOworCisJY29tbWFuZCA9IGNoaXAtPmNvbW1hbmQgJiB+QUQ3MjkxX0FMQVJUX0NMRUFSOworCWFkNzI5MV9pMmNfd3JpdGUoY2hpcCwgQUQ3MjkxX0NPTU1BTkQsIGNvbW1hbmQpOworCisJZW5hYmxlX2lycShjaGlwLT5jbGllbnQtPmlycSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCWlmICh0X3N0YXR1cyAmICgxIDw8IGkpKQorCQkJaWlvX3B1c2hfZXZlbnQoY2hpcC0+aW5kaW9fZGV2LCAwLAorCQkJCUlJT19FVkVOVF9DT0RFX0FENzI5MV9UX1NFTlNFX0hJR0ggKyBpLAorCQkJCWNoaXAtPmxhc3RfdGltZXN0YW1wKTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgQUQ3MjkxX1ZPTFRBR0VfTElNSVRfQ09VTlQqMjsgaSsrKSB7CisJCWlmICh2X3N0YXR1cyAmICgxIDw8IGkpKQorCQkJaWlvX3B1c2hfZXZlbnQoY2hpcC0+aW5kaW9fZGV2LCAwLAorCQkJCUlJT19FVkVOVF9DT0RFX0FENzI5MV9WT0xUQUdFX0JBU0UgKyBpLAorCQkJCWNoaXAtPmxhc3RfdGltZXN0YW1wKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgYWQ3MjkxX2ludGVycnVwdChzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8sCisJCWludCBpbmRleCwKKwkJczY0IHRpbWVzdGFtcCwKKwkJaW50IG5vX3Rlc3QpCit7CisJc3RydWN0IGFkNzI5MV9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisKKwljaGlwLT5sYXN0X3RpbWVzdGFtcCA9IHRpbWVzdGFtcDsKKwlzY2hlZHVsZV93b3JrKCZjaGlwLT50aHJlc2hfd29yayk7CisKKwlyZXR1cm4gMDsKK30KKworSUlPX0VWRU5UX1NIKGFkNzI5MSwgJmFkNzI5MV9pbnRlcnJ1cHQpOworCitzdGF0aWMgaW5saW5lIHNzaXplX3QgYWQ3MjkxX3Nob3dfdF9ib3VuZChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQl1OCBib3VuZF9yZWcsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ3MjkxX2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKwl1MTYgZGF0YTsKKwljaGFyIHNpZ24gPSAnICc7CisJaW50IHJldDsKKworCXJldCA9IGFkNzI5MV9pMmNfcmVhZChjaGlwLCBib3VuZF9yZWcsICZkYXRhKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gLUVJTzsKKworCWRhdGEgJj0gQUQ3MjkxX1ZBTFVFX01BU0s7CisJaWYgKGRhdGEgJiBBRDcyOTFfVF9WQUxVRV9TSUdOKSB7CisJCS8qIGNvbnZlcnQgc3VwcGxlbWVudCB0byBwb3NpdGl2ZSB2YWx1ZSAqLworCQlkYXRhID0gKEFENzI5MV9UX1ZBTFVFX1NJR04gPDwgMSkgLSBkYXRhOworCQlzaWduID0gJy0nOworCX0KKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVjJWQuJS4yZFxuIiwgc2lnbiwKKwkJCWRhdGEgPj4gQUQ3MjkxX1RfVkFMVUVfRkxPQVRfT0ZGU0VULAorCQkJKGRhdGEgJiBBRDcyOTFfVF9WQUxVRV9GTE9BVF9NQVNLKSAqIDI1KTsKK30KKworc3RhdGljIGlubGluZSBzc2l6ZV90IGFkNzI5MV9zZXRfdF9ib3VuZChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQl1OCBib3VuZF9yZWcsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ3MjkxX2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKwlsb25nIHRtcDEsIHRtcDI7CisJdTE2IGRhdGE7CisJY2hhciAqcG9zOworCWludCByZXQ7CisKKwlwb3MgPSBzdHJjaHIoYnVmLCAnLicpOworCisJcmV0ID0gc3RyaWN0X3N0cnRvbChidWYsIDEwLCAmdG1wMSk7CisKKwlpZiAocmV0IHx8IHRtcDEgPiAxMjcgfHwgdG1wMSA8IC0xMjgpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHBvcykgeworCQlsZW4gPSBzdHJsZW4ocG9zKTsKKwkJaWYgKGxlbiA+IEFENzI5MV9UX1ZBTFVFX0ZMT0FUX09GRlNFVCkKKwkJCWxlbiA9IEFENzI5MV9UX1ZBTFVFX0ZMT0FUX09GRlNFVDsKKwkJcG9zW2xlbl0gPSAwOworCQlyZXQgPSBzdHJpY3Rfc3RydG9sKHBvcywgMTAsICZ0bXAyKTsKKworCQlpZiAoIXJldCkKKwkJCXRtcDIgPSAodG1wMiAvIDI1KSAqIDI1OworCX0KKworCWlmICh0bXAxIDwgMCkKKwkJZGF0YSA9ICh1MTYpKC10bXAxKTsKKwllbHNlCisJCWRhdGEgPSAodTE2KXRtcDE7CisJZGF0YSA9IChkYXRhIDw8IEFENzI5MV9UX1ZBTFVFX0ZMT0FUX09GRlNFVCkgfAorCQkodG1wMiAmIEFENzI5MV9UX1ZBTFVFX0ZMT0FUX01BU0spOworCWlmICh0bXAxIDwgMCkKKwkJLyogY29udmVydCBwb3NpdGl2ZSB2YWx1ZSB0byBzdXBwbHltZW50ICovCisJCWRhdGEgPSAoQUQ3MjkxX1RfVkFMVUVfU0lHTiA8PCAxKSAtIGRhdGE7CisKKwlyZXQgPSBhZDcyOTFfaTJjX3dyaXRlKGNoaXAsIGJvdW5kX3JlZywgZGF0YSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIC1FSU87CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3NpemVfdCBhZDcyOTFfc2hvd190X3NlbnNlX2hpZ2goc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXJldHVybiBhZDcyOTFfc2hvd190X2JvdW5kKGRldiwgYXR0ciwKKwkJCUFENzI5MV9UX1NFTlNFX0hJR0gsIGJ1Zik7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3NpemVfdCBhZDcyOTFfc2V0X3Rfc2Vuc2VfaGlnaChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBsZW4pCit7CisJcmV0dXJuIGFkNzI5MV9zZXRfdF9ib3VuZChkZXYsIGF0dHIsCisJCQlBRDcyOTFfVF9TRU5TRV9ISUdILCBidWYsIGxlbik7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkNzI5MV9zaG93X3Rfc2Vuc2VfbG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gYWQ3MjkxX3Nob3dfdF9ib3VuZChkZXYsIGF0dHIsCisJCQlBRDcyOTFfVF9TRU5TRV9MT1csIGJ1Zik7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3NpemVfdCBhZDcyOTFfc2V0X3Rfc2Vuc2VfbG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlyZXR1cm4gYWQ3MjkxX3NldF90X2JvdW5kKGRldiwgYXR0ciwKKwkJCUFENzI5MV9UX1NFTlNFX0xPVywgYnVmLCBsZW4pOworfQorCitzdGF0aWMgc3NpemVfdCBhZDcyOTFfc2hvd190X3NlbnNlX2h5c3Qoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXJldHVybiBhZDcyOTFfc2hvd190X2JvdW5kKGRldiwgYXR0ciwKKwkJCUFENzI5MV9UX1NFTlNFX0hZU1QsIGJ1Zik7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3NpemVfdCBhZDcyOTFfc2V0X3Rfc2Vuc2VfaHlzdChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBsZW4pCit7CisJcmV0dXJuIGFkNzI5MV9zZXRfdF9ib3VuZChkZXYsIGF0dHIsCisJCQlBRDcyOTFfVF9TRU5TRV9IWVNULCBidWYsIGxlbik7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3NpemVfdCBhZDcyOTFfc2hvd192X2JvdW5kKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCXU4IGJvdW5kX3JlZywKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDcyOTFfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCXUxNiBkYXRhOworCWludCByZXQ7CisKKwlpZiAoYm91bmRfcmVnIDwgQUQ3MjkxX1ZPTFRBR0VfTElNSVRfQkFTRSB8fAorCQlib3VuZF9yZWcgPj0gQUQ3MjkxX1ZPTFRBR0VfTElNSVRfQkFTRSArCisJCUFENzI5MV9WT0xUQUdFX0xJTUlUX0NPVU5UKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldCA9IGFkNzI5MV9pMmNfcmVhZChjaGlwLCBib3VuZF9yZWcsICZkYXRhKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gLUVJTzsKKworCWRhdGEgJj0gQUQ3MjkxX1ZBTFVFX01BU0s7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgZGF0YSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3NpemVfdCBhZDcyOTFfc2V0X3ZfYm91bmQoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJdTggYm91bmRfcmVnLAorCQljb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBsZW4pCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkNzI5MV9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisJdW5zaWduZWQgbG9uZyB2YWx1ZTsKKwl1MTYgZGF0YTsKKwlpbnQgcmV0OworCisJaWYgKGJvdW5kX3JlZyA8IEFENzI5MV9WT0xUQUdFX0xJTUlUX0JBU0UgfHwKKwkJYm91bmRfcmVnID49IEFENzI5MV9WT0xUQUdFX0xJTUlUX0JBU0UgKworCQlBRDcyOTFfVk9MVEFHRV9MSU1JVF9DT1VOVCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXQgPSBzdHJpY3Rfc3RydG91bChidWYsIDEwLCAmdmFsdWUpOworCisJaWYgKHJldCB8fCB2YWx1ZSA+PSA0MDk2KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWRhdGEgPSAodTE2KXZhbHVlOworCXJldCA9IGFkNzI5MV9pMmNfd3JpdGUoY2hpcCwgYm91bmRfcmVnLCBkYXRhKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gLUVJTzsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYWQ3MjkxX2dldF92b2x0YWdlX2xpbWl0X3JlZ3MoY29uc3QgY2hhciAqY2hhbm5lbCkKK3sKKwlpbnQgaW5kZXg7CisKKwlpZiAoc3RybGVuKGNoYW5uZWwpIDwgMyAmJiBjaGFubmVsWzBdICE9ICd2JykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpbmRleCA9IGNoYW5uZWxbMV0gLSAnMCc7CisJaWYgKGluZGV4ID49IEFENzI5MV9WT0xUQUdFX0xJTUlUX0NPVU5UKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiBpbmRleDsKK30KKworc3RhdGljIHNzaXplX3QgYWQ3MjkxX3Nob3dfdm9sdGFnZV9oaWdoKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlpbnQgcmVnczsKKworCXJlZ3MgPSBhZDcyOTFfZ2V0X3ZvbHRhZ2VfbGltaXRfcmVncyhhdHRyLT5hdHRyLm5hbWUpOworCisJaWYgKHJlZ3MgPCAwKQorCQlyZXR1cm4gcmVnczsKKworCXJldHVybiBhZDcyOTFfc2hvd190X2JvdW5kKGRldiwgYXR0ciwgcmVncywgYnVmKTsKK30KKworc3RhdGljIGlubGluZSBzc2l6ZV90IGFkNzI5MV9zZXRfdm9sdGFnZV9oaWdoKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlpbnQgcmVnczsKKworCXJlZ3MgPSBhZDcyOTFfZ2V0X3ZvbHRhZ2VfbGltaXRfcmVncyhhdHRyLT5hdHRyLm5hbWUpOworCisJaWYgKHJlZ3MgPCAwKQorCQlyZXR1cm4gcmVnczsKKworCXJldHVybiBhZDcyOTFfc2V0X3RfYm91bmQoZGV2LCBhdHRyLCByZWdzLCBidWYsIGxlbik7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkNzI5MV9zaG93X3ZvbHRhZ2VfbG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlpbnQgcmVnczsKKworCXJlZ3MgPSBhZDcyOTFfZ2V0X3ZvbHRhZ2VfbGltaXRfcmVncyhhdHRyLT5hdHRyLm5hbWUpOworCisJaWYgKHJlZ3MgPCAwKQorCQlyZXR1cm4gcmVnczsKKworCXJldHVybiBhZDcyOTFfc2hvd190X2JvdW5kKGRldiwgYXR0ciwgcmVncysxLCBidWYpOworfQorCitzdGF0aWMgaW5saW5lIHNzaXplX3QgYWQ3MjkxX3NldF92b2x0YWdlX2xvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBsZW4pCit7CisJaW50IHJlZ3M7CisKKwlyZWdzID0gYWQ3MjkxX2dldF92b2x0YWdlX2xpbWl0X3JlZ3MoYXR0ci0+YXR0ci5uYW1lKTsKKworCWlmIChyZWdzIDwgMCkKKwkJcmV0dXJuIHJlZ3M7CisKKwlyZXR1cm4gYWQ3MjkxX3NldF90X2JvdW5kKGRldiwgYXR0ciwgcmVncysxLCBidWYsIGxlbik7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkNzI5MV9zaG93X3ZvbHRhZ2VfaHlzdChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJaW50IHJlZ3M7CisKKwlyZWdzID0gYWQ3MjkxX2dldF92b2x0YWdlX2xpbWl0X3JlZ3MoYXR0ci0+YXR0ci5uYW1lKTsKKworCWlmIChyZWdzIDwgMCkKKwkJcmV0dXJuIHJlZ3M7CisKKwlyZXR1cm4gYWQ3MjkxX3Nob3dfdF9ib3VuZChkZXYsIGF0dHIsIHJlZ3MrMiwgYnVmKTsKK30KKworc3RhdGljIGlubGluZSBzc2l6ZV90IGFkNzI5MV9zZXRfdm9sdGFnZV9oeXN0KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlpbnQgcmVnczsKKworCXJlZ3MgPSBhZDcyOTFfZ2V0X3ZvbHRhZ2VfbGltaXRfcmVncyhhdHRyLT5hdHRyLm5hbWUpOworCisJaWYgKHJlZ3MgPCAwKQorCQlyZXR1cm4gcmVnczsKKworCXJldHVybiBhZDcyOTFfc2V0X3RfYm91bmQoZGV2LCBhdHRyLCByZWdzKzIsIGJ1ZiwgbGVuKTsKK30KKworSUlPX0VWRU5UX0FUVFJfU0godF9zZW5zZV9oaWdoLCBpaW9fZXZlbnRfYWQ3MjkxLAorCQlhZDcyOTFfc2hvd190X3NlbnNlX2hpZ2gsIGFkNzI5MV9zZXRfdF9zZW5zZV9oaWdoLCAwKTsKK0lJT19FVkVOVF9BVFRSX1NIKHRfc2Vuc2VfbG93LCBpaW9fZXZlbnRfYWQ3MjkxLAorCQlhZDcyOTFfc2hvd190X3NlbnNlX2xvdywgYWQ3MjkxX3NldF90X3NlbnNlX2xvdywgMCk7CitJSU9fRVZFTlRfQVRUUl9TSCh0X3NlbnNlX2h5c3QsIGlpb19ldmVudF9hZDcyOTEsCisJCWFkNzI5MV9zaG93X3Rfc2Vuc2VfaHlzdCwgYWQ3MjkxX3NldF90X3NlbnNlX2h5c3QsIDApOworCitJSU9fRVZFTlRfQVRUUl9TSCh2MF9oaWdoLCBpaW9fZXZlbnRfYWQ3MjkxLAorCQlhZDcyOTFfc2hvd192b2x0YWdlX2hpZ2gsIGFkNzI5MV9zZXRfdm9sdGFnZV9oaWdoLCAwKTsKK0lJT19FVkVOVF9BVFRSX1NIKHYwX2xvdywgaWlvX2V2ZW50X2FkNzI5MSwKKwkJYWQ3MjkxX3Nob3dfdm9sdGFnZV9sb3csIGFkNzI5MV9zZXRfdm9sdGFnZV9sb3csIDApOworSUlPX0VWRU5UX0FUVFJfU0godjBfaHlzdCwgaWlvX2V2ZW50X2FkNzI5MSwKKwkJYWQ3MjkxX3Nob3dfdm9sdGFnZV9oeXN0LCBhZDcyOTFfc2V0X3ZvbHRhZ2VfaHlzdCwgMCk7CitJSU9fRVZFTlRfQVRUUl9TSCh2MV9oaWdoLCBpaW9fZXZlbnRfYWQ3MjkxLAorCQlhZDcyOTFfc2hvd192b2x0YWdlX2hpZ2gsIGFkNzI5MV9zZXRfdm9sdGFnZV9oaWdoLCAwKTsKK0lJT19FVkVOVF9BVFRSX1NIKHYxX2xvdywgaWlvX2V2ZW50X2FkNzI5MSwKKwkJYWQ3MjkxX3Nob3dfdm9sdGFnZV9sb3csIGFkNzI5MV9zZXRfdm9sdGFnZV9sb3csIDApOworSUlPX0VWRU5UX0FUVFJfU0godjFfaHlzdCwgaWlvX2V2ZW50X2FkNzI5MSwKKwkJYWQ3MjkxX3Nob3dfdm9sdGFnZV9oeXN0LCBhZDcyOTFfc2V0X3ZvbHRhZ2VfaHlzdCwgMCk7CitJSU9fRVZFTlRfQVRUUl9TSCh2Ml9oaWdoLCBpaW9fZXZlbnRfYWQ3MjkxLAorCQlhZDcyOTFfc2hvd192b2x0YWdlX2hpZ2gsIGFkNzI5MV9zZXRfdm9sdGFnZV9oaWdoLCAwKTsKK0lJT19FVkVOVF9BVFRSX1NIKHYyX2xvdywgaWlvX2V2ZW50X2FkNzI5MSwKKwkJYWQ3MjkxX3Nob3dfdm9sdGFnZV9sb3csIGFkNzI5MV9zZXRfdm9sdGFnZV9sb3csIDApOworSUlPX0VWRU5UX0FUVFJfU0godjJfaHlzdCwgaWlvX2V2ZW50X2FkNzI5MSwKKwkJYWQ3MjkxX3Nob3dfdm9sdGFnZV9oeXN0LCBhZDcyOTFfc2V0X3ZvbHRhZ2VfaHlzdCwgMCk7CitJSU9fRVZFTlRfQVRUUl9TSCh2M19oaWdoLCBpaW9fZXZlbnRfYWQ3MjkxLAorCQlhZDcyOTFfc2hvd192b2x0YWdlX2hpZ2gsIGFkNzI5MV9zZXRfdm9sdGFnZV9oaWdoLCAwKTsKK0lJT19FVkVOVF9BVFRSX1NIKHYzX2xvdywgaWlvX2V2ZW50X2FkNzI5MSwKKwkJYWQ3MjkxX3Nob3dfdm9sdGFnZV9sb3csIGFkNzI5MV9zZXRfdm9sdGFnZV9sb3csIDApOworSUlPX0VWRU5UX0FUVFJfU0godjNfaHlzdCwgaWlvX2V2ZW50X2FkNzI5MSwKKwkJYWQ3MjkxX3Nob3dfdm9sdGFnZV9oeXN0LCBhZDcyOTFfc2V0X3ZvbHRhZ2VfaHlzdCwgMCk7CitJSU9fRVZFTlRfQVRUUl9TSCh2NF9oaWdoLCBpaW9fZXZlbnRfYWQ3MjkxLAorCQlhZDcyOTFfc2hvd192b2x0YWdlX2hpZ2gsIGFkNzI5MV9zZXRfdm9sdGFnZV9oaWdoLCAwKTsKK0lJT19FVkVOVF9BVFRSX1NIKHY0X2xvdywgaWlvX2V2ZW50X2FkNzI5MSwKKwkJYWQ3MjkxX3Nob3dfdm9sdGFnZV9sb3csIGFkNzI5MV9zZXRfdm9sdGFnZV9sb3csIDApOworSUlPX0VWRU5UX0FUVFJfU0godjRfaHlzdCwgaWlvX2V2ZW50X2FkNzI5MSwKKwkJYWQ3MjkxX3Nob3dfdm9sdGFnZV9oeXN0LCBhZDcyOTFfc2V0X3ZvbHRhZ2VfaHlzdCwgMCk7CitJSU9fRVZFTlRfQVRUUl9TSCh2NV9oaWdoLCBpaW9fZXZlbnRfYWQ3MjkxLAorCQlhZDcyOTFfc2hvd192b2x0YWdlX2hpZ2gsIGFkNzI5MV9zZXRfdm9sdGFnZV9oaWdoLCAwKTsKK0lJT19FVkVOVF9BVFRSX1NIKHY1X2xvdywgaWlvX2V2ZW50X2FkNzI5MSwKKwkJYWQ3MjkxX3Nob3dfdm9sdGFnZV9sb3csIGFkNzI5MV9zZXRfdm9sdGFnZV9sb3csIDApOworSUlPX0VWRU5UX0FUVFJfU0godjVfaHlzdCwgaWlvX2V2ZW50X2FkNzI5MSwKKwkJYWQ3MjkxX3Nob3dfdm9sdGFnZV9oeXN0LCBhZDcyOTFfc2V0X3ZvbHRhZ2VfaHlzdCwgMCk7CitJSU9fRVZFTlRfQVRUUl9TSCh2Nl9oaWdoLCBpaW9fZXZlbnRfYWQ3MjkxLAorCQlhZDcyOTFfc2hvd192b2x0YWdlX2hpZ2gsIGFkNzI5MV9zZXRfdm9sdGFnZV9oaWdoLCAwKTsKK0lJT19FVkVOVF9BVFRSX1NIKHY2X2xvdywgaWlvX2V2ZW50X2FkNzI5MSwKKwkJYWQ3MjkxX3Nob3dfdm9sdGFnZV9sb3csIGFkNzI5MV9zZXRfdm9sdGFnZV9sb3csIDApOworSUlPX0VWRU5UX0FUVFJfU0godjZfaHlzdCwgaWlvX2V2ZW50X2FkNzI5MSwKKwkJYWQ3MjkxX3Nob3dfdm9sdGFnZV9oeXN0LCBhZDcyOTFfc2V0X3ZvbHRhZ2VfaHlzdCwgMCk7CitJSU9fRVZFTlRfQVRUUl9TSCh2N19oaWdoLCBpaW9fZXZlbnRfYWQ3MjkxLAorCQlhZDcyOTFfc2hvd192b2x0YWdlX2hpZ2gsIGFkNzI5MV9zZXRfdm9sdGFnZV9oaWdoLCAwKTsKK0lJT19FVkVOVF9BVFRSX1NIKHY3X2xvdywgaWlvX2V2ZW50X2FkNzI5MSwKKwkJYWQ3MjkxX3Nob3dfdm9sdGFnZV9sb3csIGFkNzI5MV9zZXRfdm9sdGFnZV9sb3csIDApOworSUlPX0VWRU5UX0FUVFJfU0godjdfaHlzdCwgaWlvX2V2ZW50X2FkNzI5MSwKKwkJYWQ3MjkxX3Nob3dfdm9sdGFnZV9oeXN0LCBhZDcyOTFfc2V0X3ZvbHRhZ2VfaHlzdCwgMCk7CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICphZDcyOTFfZXZlbnRfYXR0cmlidXRlc1tdID0geworCSZpaW9fZXZlbnRfYXR0cl90X3NlbnNlX2hpZ2guZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2V2ZW50X2F0dHJfdF9zZW5zZV9sb3cuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2V2ZW50X2F0dHJfdF9zZW5zZV9oeXN0LmRldl9hdHRyLmF0dHIsCisJJmlpb19ldmVudF9hdHRyX3YwX2hpZ2guZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2V2ZW50X2F0dHJfdjBfbG93LmRldl9hdHRyLmF0dHIsCisJJmlpb19ldmVudF9hdHRyX3YwX2h5c3QuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2V2ZW50X2F0dHJfdjFfaGlnaC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZXZlbnRfYXR0cl92MV9sb3cuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2V2ZW50X2F0dHJfdjFfaHlzdC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZXZlbnRfYXR0cl92Ml9oaWdoLmRldl9hdHRyLmF0dHIsCisJJmlpb19ldmVudF9hdHRyX3YyX2xvdy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZXZlbnRfYXR0cl92Ml9oeXN0LmRldl9hdHRyLmF0dHIsCisJJmlpb19ldmVudF9hdHRyX3YzX2hpZ2guZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2V2ZW50X2F0dHJfdjNfbG93LmRldl9hdHRyLmF0dHIsCisJJmlpb19ldmVudF9hdHRyX3YzX2h5c3QuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2V2ZW50X2F0dHJfdjRfaGlnaC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZXZlbnRfYXR0cl92NF9sb3cuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2V2ZW50X2F0dHJfdjRfaHlzdC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZXZlbnRfYXR0cl92NV9oaWdoLmRldl9hdHRyLmF0dHIsCisJJmlpb19ldmVudF9hdHRyX3Y1X2xvdy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZXZlbnRfYXR0cl92NV9oeXN0LmRldl9hdHRyLmF0dHIsCisJJmlpb19ldmVudF9hdHRyX3Y2X2hpZ2guZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2V2ZW50X2F0dHJfdjZfbG93LmRldl9hdHRyLmF0dHIsCisJJmlpb19ldmVudF9hdHRyX3Y2X2h5c3QuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2V2ZW50X2F0dHJfdjdfaGlnaC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZXZlbnRfYXR0cl92N19sb3cuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2V2ZW50X2F0dHJfdjdfaHlzdC5kZXZfYXR0ci5hdHRyLAorCU5VTEwsCit9OworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBhZDcyOTFfZXZlbnRfYXR0cmlidXRlX2dyb3VwID0geworCS5hdHRycyA9IGFkNzI5MV9ldmVudF9hdHRyaWJ1dGVzLAorfTsKKworLyoKKyAqIGRldmljZSBwcm9iZSBhbmQgcmVtb3ZlCisgKi8KKworc3RhdGljIGludCBfX2RldmluaXQgYWQ3MjkxX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJCWNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3QgYWQ3MjkxX2NoaXBfaW5mbyAqY2hpcDsKKwlpbnQgcmV0ID0gMDsKKworCWNoaXAgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYWQ3MjkxX2NoaXBfaW5mbyksIEdGUF9LRVJORUwpOworCisJaWYgKGNoaXAgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkvKiB0aGlzIGlzIG9ubHkgdXNlZCBmb3IgZGV2aWNlIHJlbW92YWwgcHVycG9zZXMgKi8KKwlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBjaGlwKTsKKworCWNoaXAtPmNsaWVudCA9IGNsaWVudDsKKwljaGlwLT5uYW1lID0gaWQtPm5hbWU7CisJY2hpcC0+Y29tbWFuZCA9IEFENzI5MV9OT0lTRV9ERUxBWSB8IEFENzI5MV9UX1NFTlNFX01BU0s7CisKKwljaGlwLT5pbmRpb19kZXYgPSBpaW9fYWxsb2NhdGVfZGV2aWNlKCk7CisJaWYgKGNoaXAtPmluZGlvX2RldiA9PSBOVUxMKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3JfZnJlZV9jaGlwOworCX0KKworCWNoaXAtPmluZGlvX2Rldi0+ZGV2LnBhcmVudCA9ICZjbGllbnQtPmRldjsKKwljaGlwLT5pbmRpb19kZXYtPmF0dHJzID0gJmFkNzI5MV9hdHRyaWJ1dGVfZ3JvdXA7CisJY2hpcC0+aW5kaW9fZGV2LT5ldmVudF9hdHRycyA9ICZhZDcyOTFfZXZlbnRfYXR0cmlidXRlX2dyb3VwOworCWNoaXAtPmluZGlvX2Rldi0+ZGV2X2RhdGEgPSAodm9pZCAqKWNoaXA7CisJY2hpcC0+aW5kaW9fZGV2LT5kcml2ZXJfbW9kdWxlID0gVEhJU19NT0RVTEU7CisJY2hpcC0+aW5kaW9fZGV2LT5udW1faW50ZXJydXB0X2xpbmVzID0gMTsKKwljaGlwLT5pbmRpb19kZXYtPm1vZGVzID0gSU5ESU9fRElSRUNUX01PREU7CisKKwlyZXQgPSBpaW9fZGV2aWNlX3JlZ2lzdGVyKGNoaXAtPmluZGlvX2Rldik7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9mcmVlX2RldjsKKworCWlmIChjbGllbnQtPmlycSA+IDApIHsKKwkJcmV0ID0gaWlvX3JlZ2lzdGVyX2ludGVycnVwdF9saW5lKGNsaWVudC0+aXJxLAorCQkJCWNoaXAtPmluZGlvX2RldiwKKwkJCQkwLAorCQkJCUlSUUZfVFJJR0dFUl9MT1csCisJCQkJY2hpcC0+bmFtZSk7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycm9yX3VucmVnX2RldjsKKworCQkvKgorCQkgKiBUaGUgZXZlbnQgaGFuZGxlciBsaXN0IGVsZW1lbnQgcmVmZXIgdG8gaWlvX2V2ZW50X2FkNzI5MS4KKwkJICogQWxsIGV2ZW50IGF0dHJpYnV0ZXMgYmluZCB0byB0aGUgc2FtZSBldmVudCBoYW5kbGVyLgorCQkgKiBTbywgb25seSByZWdpc3RlciBldmVudCBoYW5kbGVyIG9uY2UuCisJCSAqLworCQlpaW9fYWRkX2V2ZW50X3RvX2xpc3QoJmlpb19ldmVudF9hZDcyOTEsCisJCQkJJmNoaXAtPmluZGlvX2Rldi0+aW50ZXJydXB0c1swXS0+ZXZfbGlzdCk7CisKKwkJSU5JVF9XT1JLKCZjaGlwLT50aHJlc2hfd29yaywgYWQ3MjkxX2ludGVycnVwdF9iaCk7CisKKwkJLyogc2V0IGlycSBwb2xhcml0eSBsb3cgbGV2ZWwgKi8KKwkJY2hpcC0+Y29tbWFuZCB8PSBBRDcyOTFfQUxBUlRfUE9MQVJJVFk7CisJfQorCisJcmV0ID0gYWQ3MjkxX2kyY193cml0ZShjaGlwLCBBRDcyOTFfQ09NTUFORCwgY2hpcC0+Y29tbWFuZCk7CisJaWYgKHJldCkgeworCQlyZXQgPSAtRUlPOworCQlnb3RvIGVycm9yX3VucmVnX2lycTsKKwl9CisKKwlkZXZfaW5mbygmY2xpZW50LT5kZXYsICIlcyB0ZW1wZXJhdHVyZSBzZW5zb3IgcmVnaXN0ZXJlZC5cbiIsCisJCQkgaWQtPm5hbWUpOworCisJcmV0dXJuIDA7CisKK2Vycm9yX3VucmVnX2lycToKKwlpaW9fdW5yZWdpc3Rlcl9pbnRlcnJ1cHRfbGluZShjaGlwLT5pbmRpb19kZXYsIDApOworZXJyb3JfdW5yZWdfZGV2OgorCWlpb19kZXZpY2VfdW5yZWdpc3RlcihjaGlwLT5pbmRpb19kZXYpOworZXJyb3JfZnJlZV9kZXY6CisJaWlvX2ZyZWVfZGV2aWNlKGNoaXAtPmluZGlvX2Rldik7CitlcnJvcl9mcmVlX2NoaXA6CisJa2ZyZWUoY2hpcCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBhZDcyOTFfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJc3RydWN0IGFkNzI5MV9jaGlwX2luZm8gKmNoaXAgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gY2hpcC0+aW5kaW9fZGV2OworCisJaWYgKGNsaWVudC0+aXJxKQorCQlpaW9fdW5yZWdpc3Rlcl9pbnRlcnJ1cHRfbGluZShpbmRpb19kZXYsIDApOworCWlpb19kZXZpY2VfdW5yZWdpc3RlcihpbmRpb19kZXYpOworCWlpb19mcmVlX2RldmljZShjaGlwLT5pbmRpb19kZXYpOworCWtmcmVlKGNoaXApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCBhZDcyOTFfaWRbXSA9IHsKKwl7ICJhZDcyOTEiLCAwIH0sCisJe30KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCBhZDcyOTFfaWQpOworCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgYWQ3MjkxX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJhZDcyOTEiLAorCX0sCisJLnByb2JlID0gYWQ3MjkxX3Byb2JlLAorCS5yZW1vdmUgPSBfX2RldmV4aXRfcChhZDcyOTFfcmVtb3ZlKSwKKwkuaWRfdGFibGUgPSBhZDcyOTFfaWQsCit9OworCitzdGF0aWMgX19pbml0IGludCBhZDcyOTFfaW5pdCh2b2lkKQoreworCXJldHVybiBpMmNfYWRkX2RyaXZlcigmYWQ3MjkxX2RyaXZlcik7Cit9CisKK3N0YXRpYyBfX2V4aXQgdm9pZCBhZDcyOTFfZXhpdCh2b2lkKQoreworCWkyY19kZWxfZHJpdmVyKCZhZDcyOTFfZHJpdmVyKTsKK30KKworTU9EVUxFX0FVVEhPUigiU29uaWMgWmhhbmcgPHNvbmljLnpoYW5nQGFuYWxvZy5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkFuYWxvZyBEZXZpY2VzIEFENzI5MSBkaWdpdGFsIgorCQkJIiB0ZW1wZXJhdHVyZSBzZW5zb3IgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CisKK21vZHVsZV9pbml0KGFkNzI5MV9pbml0KTsKK21vZHVsZV9leGl0KGFkNzI5MV9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRjL2FkNzI5OC5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvYWQ3Mjk4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWEwODBjOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRjL2FkNzI5OC5jCkBAIC0wLDAgKzEsNTAxIEBACisvKgorICogQUQ3Mjk4IGRpZ2l0YWwgdGVtcGVyYXR1cmUgc2Vuc29yIGRyaXZlciBzdXBwb3J0aW5nIEFENzI5OAorICoKKyAqIENvcHlyaWdodCAyMDEwIEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorI2luY2x1ZGUgPGxpbnV4L3J0Yy5oPgorCisjaW5jbHVkZSAiLi4vaWlvLmgiCisjaW5jbHVkZSAiLi4vc3lzZnMuaCIKKworLyoKKyAqIEFENzI5OCBjb21tYW5kCisgKi8KKyNkZWZpbmUgQUQ3Mjk4X1BECQkJMHgxCisjZGVmaW5lIEFENzI5OF9UX0FWR19NQVNLCQkweDIKKyNkZWZpbmUgQUQ3Mjk4X0VYVF9SRUYJCQkweDQKKyNkZWZpbmUgQUQ3Mjk4X1RfU0VOU0VfTUFTSwkJMHgyMAorI2RlZmluZSBBRDcyOThfVk9MVEFHRV9NQVNLCQkweDNmYzAKKyNkZWZpbmUgQUQ3Mjk4X1ZPTFRBR0VfT0ZGU0VUCQkweDYKKyNkZWZpbmUgQUQ3Mjk4X1ZPTFRBR0VfTElNSVRfQ09VTlQJOAorI2RlZmluZSBBRDcyOThfUkVQRUFUCQkJMHg0MAorI2RlZmluZSBBRDcyOThfV1JJVEUJCQkweDgwCisKKy8qCisgKiBBRDcyOTggdmFsdWUgbWFza3MKKyAqLworI2RlZmluZSBBRDcyOThfQ0hBTk5FTF9NQVNLCQkweGYwMDAKKyNkZWZpbmUgQUQ3Mjk4X1ZBTFVFX01BU0sJCTB4ZmZmCisjZGVmaW5lIEFENzI5OF9UX1ZBTFVFX1NJR04JCTB4NDAwCisjZGVmaW5lIEFENzI5OF9UX1ZBTFVFX0ZMT0FUX09GRlNFVAkyCisjZGVmaW5lIEFENzI5OF9UX1ZBTFVFX0ZMT0FUX01BU0sJMHgyCisKKy8qCisgKiBzdHJ1Y3QgYWQ3Mjk4X2NoaXBfaW5mbyAtIGNoaXAgc3BlY2lmYyBpbmZvcm1hdGlvbgorICovCisKK3N0cnVjdCBhZDcyOThfY2hpcF9pbmZvIHsKKwljb25zdCBjaGFyICpuYW1lOworCXN0cnVjdCBzcGlfZGV2aWNlICpzcGlfZGV2OworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXY7CisJdTE2IGNvbW1hbmQ7CisJdTE2IGJ1c3lfcGluOworCXU4ICBjaGFubmVsczsJLyogQWN0aXZlIHZvbHRhZ2UgY2hhbm5lbHMgKi8KK307CisKKy8qCisgKiBhZDcyOTggcmVnaXN0ZXIgYWNjZXNzIGJ5IFNQSQorICovCitzdGF0aWMgaW50IGFkNzI5OF9zcGlfd3JpdGUoc3RydWN0IGFkNzI5OF9jaGlwX2luZm8gKmNoaXAsIHUxNiBkYXRhKQoreworCXN0cnVjdCBzcGlfZGV2aWNlICpzcGlfZGV2ID0gY2hpcC0+c3BpX2RldjsKKwlpbnQgcmV0ID0gMDsKKworCWRhdGEgfD0gQUQ3Mjk4X1dSSVRFOworCWRhdGEgPSBjcHVfdG9fYmUxNihkYXRhKTsKKwlyZXQgPSBzcGlfd3JpdGUoc3BpX2RldiwgKHU4ICopJmRhdGEsIHNpemVvZihkYXRhKSk7CisJaWYgKHJldCA8IDApCisJCWRldl9lcnIoJnNwaV9kZXYtPmRldiwgIlNQSSB3cml0ZSBlcnJvclxuIik7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFkNzI5OF9zcGlfcmVhZChzdHJ1Y3QgYWQ3Mjk4X2NoaXBfaW5mbyAqY2hpcCwgdTE2IG1hc2ssIHUxNiAqZGF0YSkKK3sKKwlzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpX2RldiA9IGNoaXAtPnNwaV9kZXY7CisJaW50IHJldCA9IDA7CisJdTggY291bnQgPSBjaGlwLT5jaGFubmVsczsKKwl1MTYgY29tbWFuZDsKKwlpbnQgaTsKKworCWlmIChtYXNrICYgQUQ3Mjk4X1RfU0VOU0VfTUFTSykgeworCQljb21tYW5kID0gY2hpcC0+Y29tbWFuZCAmIH4oQUQ3Mjk4X1RfQVZHX01BU0sgfCBBRDcyOThfVk9MVEFHRV9NQVNLKTsKKwkJY29tbWFuZCB8PSBBRDcyOThfVF9TRU5TRV9NQVNLOworCQljb3VudCA9IDE7CisJfSBlbHNlIGlmIChtYXNrICYgQUQ3Mjk4X1RfQVZHX01BU0spIHsKKwkJY29tbWFuZCA9IGNoaXAtPmNvbW1hbmQgJiB+QUQ3Mjk4X1ZPTFRBR0VfTUFTSzsKKwkJY29tbWFuZCB8PSBBRDcyOThfVF9TRU5TRV9NQVNLIHwgQUQ3Mjk4X1RfQVZHX01BU0s7CisJCWNvdW50ID0gMjsKKwl9IGVsc2UgaWYgKG1hc2sgJiBBRDcyOThfVk9MVEFHRV9NQVNLKSB7CisJCWNvbW1hbmQgPSBjaGlwLT5jb21tYW5kICYgfihBRDcyOThfVF9BVkdfTUFTSyB8IEFENzI5OF9UX1NFTlNFX01BU0spOworCQljb3VudCA9IGNoaXAtPmNoYW5uZWxzOworCX0KKworCXJldCA9IGFkNzI5OF9zcGlfd3JpdGUoY2hpcCwgY2hpcC0+Y29tbWFuZCk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2Vycigmc3BpX2Rldi0+ZGV2LCAiU1BJIHdyaXRlIGNvbW1hbmQgZXJyb3JcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldCA9IHNwaV9yZWFkKHNwaV9kZXYsICh1OCAqKSZjb21tYW5kLCBzaXplb2YoY29tbWFuZCkpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoJnNwaV9kZXYtPmRldiwgIlNQSSByZWFkIGVycm9yXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlpID0gMTAwMDA7CisJd2hpbGUgKGkgJiYgZ3Bpb19nZXRfdmFsdWUoY2hpcC0+YnVzeV9waW4pKSB7CisJCWNwdV9yZWxheCgpOworCQlpLS07CisJfQorCWlmICghaSkgeworCQlkZXZfZXJyKCZzcGlfZGV2LT5kZXYsICJBbHdheXMgaW4gYnVzeSBjb252ZXJ0aW9uLlxuIik7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKwkJcmV0ID0gc3BpX3JlYWQoc3BpX2RldiwgKHU4ICopJmRhdGFbaV0sIHNpemVvZihkYXRhW2ldKSk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlkZXZfZXJyKCZzcGlfZGV2LT5kZXYsICJTUEkgcmVhZCBlcnJvclxuIik7CisJCQlyZXR1cm4gcmV0OworCQl9CisJCSpkYXRhID0gYmUxNl90b19jcHUoZGF0YVtpXSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkNzI5OF9zaG93X21vZGUoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDcyOThfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCisJaWYgKGNoaXAtPmNvbW1hbmQgJiBBRDcyOThfUkVQRUFUKQorCQlyZXR1cm4gc3ByaW50ZihidWYsICJyZXBlYXRcbiIpOworCWVsc2UKKwkJcmV0dXJuIHNwcmludGYoYnVmLCAibm9ybWFsXG4iKTsKK30KKworc3RhdGljIHNzaXplX3QgYWQ3Mjk4X3N0b3JlX21vZGUoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgbGVuKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDcyOThfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCisJaWYgKHN0cmNtcChidWYsICJyZXBlYXQiKSkKKwkJY2hpcC0+Y29tbWFuZCB8PSBBRDcyOThfUkVQRUFUOworCWVsc2UKKwkJY2hpcC0+Y29tbWFuZCAmPSAofkFENzI5OF9SRVBFQVQpOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIobW9kZSwgU19JUlVHTyB8IFNfSVdVU1IsCisJCWFkNzI5OF9zaG93X21vZGUsCisJCWFkNzI5OF9zdG9yZV9tb2RlLAorCQkwKTsKKworc3RhdGljIHNzaXplX3QgYWQ3Mjk4X3Nob3dfYXZhaWxhYmxlX21vZGVzKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gc3ByaW50ZihidWYsICJub3JtYWxcbnJlcGVhdFxuIik7Cit9CisKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIoYXZhaWxhYmxlX21vZGVzLCBTX0lSVUdPLCBhZDcyOThfc2hvd19hdmFpbGFibGVfbW9kZXMsIE5VTEwsIDApOworCitzdGF0aWMgc3NpemVfdCBhZDcyOThfc3RvcmVfcmVzZXQoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgbGVuKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDcyOThfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCXUxNiBjb21tYW5kOworCWludCByZXQ7CisKKwljb21tYW5kID0gY2hpcC0+Y29tbWFuZCAmIH5BRDcyOThfUEQ7CisKKwlyZXQgPSBhZDcyOThfc3BpX3dyaXRlKGNoaXAsIGNvbW1hbmQpOworCWlmIChyZXQpCisJCXJldHVybiAtRUlPOworCisJY29tbWFuZCA9IGNoaXAtPmNvbW1hbmQgfCBBRDcyOThfUEQ7CisKKwlyZXQgPSBhZDcyOThfc3BpX3dyaXRlKGNoaXAsIGNvbW1hbmQpOworCWlmIChyZXQpCisJCXJldHVybiAtRUlPOworCisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIElJT19ERVZJQ0VfQVRUUihyZXNldCwgU19JV1VTUiwKKwkJTlVMTCwKKwkJYWQ3Mjk4X3N0b3JlX3Jlc2V0LAorCQkwKTsKKworc3RhdGljIHNzaXplX3QgYWQ3Mjk4X3Nob3dfZXh0X3JlZihzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkNzI5OF9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgISEoY2hpcC0+Y29tbWFuZCAmIEFENzI5OF9FWFRfUkVGKSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkNzI5OF9zdG9yZV9leHRfcmVmKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ3Mjk4X2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKwl1MTYgY29tbWFuZDsKKwlpbnQgcmV0OworCisJY29tbWFuZCA9IGNoaXAtPmNvbW1hbmQgJiAofkFENzI5OF9FWFRfUkVGKTsKKwlpZiAoc3RyY21wKGJ1ZiwgIjEiKSkKKwkJY29tbWFuZCB8PSBBRDcyOThfRVhUX1JFRjsKKworCXJldCA9IGFkNzI5OF9zcGlfd3JpdGUoY2hpcCwgY29tbWFuZCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIC1FSU87CisKKwljaGlwLT5jb21tYW5kID0gY29tbWFuZDsKKworCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIoZXh0X3JlZiwgU19JUlVHTyB8IFNfSVdVU1IsCisJCWFkNzI5OF9zaG93X2V4dF9yZWYsCisJCWFkNzI5OF9zdG9yZV9leHRfcmVmLAorCQkwKTsKKworc3RhdGljIHNzaXplX3QgYWQ3Mjk4X3Nob3dfdF9zZW5zZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkNzI5OF9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisJdTE2IGRhdGE7CisJY2hhciBzaWduID0gJyAnOworCWludCByZXQ7CisKKwlyZXQgPSBhZDcyOThfc3BpX3JlYWQoY2hpcCwgQUQ3Mjk4X1RfU0VOU0VfTUFTSywgJmRhdGEpOworCWlmIChyZXQpCisJCXJldHVybiAtRUlPOworCisJaWYgKGRhdGEgJiBBRDcyOThfVF9WQUxVRV9TSUdOKSB7CisJCS8qIGNvbnZlcnQgc3VwcGxlbWVudCB0byBwb3NpdGl2ZSB2YWx1ZSAqLworCQlkYXRhID0gKEFENzI5OF9UX1ZBTFVFX1NJR04gPDwgMSkgLSBkYXRhOworCQlzaWduID0gJy0nOworCX0KKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVjJWQuJS4yZFxuIiwgc2lnbiwKKwkJKGRhdGEgPj4gQUQ3Mjk4X1RfVkFMVUVfRkxPQVRfT0ZGU0VUKSwKKwkJKGRhdGEgJiBBRDcyOThfVF9WQUxVRV9GTE9BVF9NQVNLKSAqIDI1KTsKK30KKworc3RhdGljIElJT19ERVZJQ0VfQVRUUih0X3NlbnNlLCBTX0lSVUdPLCBhZDcyOThfc2hvd190X3NlbnNlLCBOVUxMLCAwKTsKKworc3RhdGljIHNzaXplX3QgYWQ3Mjk4X3Nob3dfdF9hdmVyYWdlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ3Mjk4X2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKwl1MTYgZGF0YVsyXTsKKwljaGFyIHNpZ24gPSAnICc7CisJaW50IHJldDsKKworCXJldCA9IGFkNzI5OF9zcGlfcmVhZChjaGlwLCBBRDcyOThfVF9BVkdfTUFTSywgZGF0YSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIC1FSU87CisKKwlpZiAoZGF0YVsxXSAmIEFENzI5OF9UX1ZBTFVFX1NJR04pIHsKKwkJLyogY29udmVydCBzdXBwbGVtZW50IHRvIHBvc2l0aXZlIHZhbHVlICovCisJCWRhdGFbMV0gPSAoQUQ3Mjk4X1RfVkFMVUVfU0lHTiA8PCAxKSAtIGRhdGFbMV07CisJCXNpZ24gPSAnLSc7CisJfQorCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWMlZC4lLjJkXG4iLCBzaWduLAorCQkoZGF0YVsxXSA+PiBBRDcyOThfVF9WQUxVRV9GTE9BVF9PRkZTRVQpLAorCQkoZGF0YVsxXSAmIEFENzI5OF9UX1ZBTFVFX0ZMT0FUX01BU0spICogMjUpOworfQorCitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKHRfYXZlcmFnZSwgU19JUlVHTywgYWQ3Mjk4X3Nob3dfdF9hdmVyYWdlLCBOVUxMLCAwKTsKKworc3RhdGljIHNzaXplX3QgYWQ3Mjk4X3Nob3dfdm9sdGFnZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkNzI5OF9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisJdTE2IGRhdGFbQUQ3Mjk4X1ZPTFRBR0VfTElNSVRfQ09VTlRdOworCWludCBpLCBzaXplLCByZXQ7CisKKwlyZXQgPSBhZDcyOThfc3BpX3JlYWQoY2hpcCwgQUQ3Mjk4X1ZPTFRBR0VfTUFTSywgZGF0YSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIC1FSU87CisKKwlmb3IgKGkgPSAwOyBpIDwgQUQ3Mjk4X1ZPTFRBR0VfTElNSVRfQ09VTlQ7IGkrKykgeworCQlpZiAoY2hpcC0+Y29tbWFuZCAmIChBRDcyOThfVF9TRU5TRV9NQVNLIDw8IGkpKSB7CisJCQlyZXQgPSBzcHJpbnRmKGJ1ZiwgImNoYW5uZWxbJWRdPSVkXG4iLCBpLAorCQkJCQlkYXRhW2ldICYgQUQ3Mjk4X1ZBTFVFX01BU0spOworCQkJaWYgKHJldCA8IDApCisJCQkJYnJlYWs7CisJCQlidWYgKz0gcmV0OworCQkJc2l6ZSArPSByZXQ7CisJCX0KKwl9CisKKwlyZXR1cm4gc2l6ZTsKK30KKworc3RhdGljIElJT19ERVZJQ0VfQVRUUih2b2x0YWdlLCBTX0lSVUdPLCBhZDcyOThfc2hvd192b2x0YWdlLCBOVUxMLCAwKTsKKworc3RhdGljIHNzaXplX3QgYWQ3Mjk4X3Nob3dfY2hhbm5lbF9tYXNrKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ3Mjk4X2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIjB4JXhcbiIsIChjaGlwLT5jb21tYW5kICYgQUQ3Mjk4X1ZPTFRBR0VfTUFTSykgPj4KKwkJCUFENzI5OF9WT0xUQUdFX09GRlNFVCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkNzI5OF9zdG9yZV9jaGFubmVsX21hc2soc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgbGVuKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDcyOThfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZGF0YTsKKwlpbnQgaSwgcmV0OworCisJcmV0ID0gc3RyaWN0X3N0cnRvdWwoYnVmLCAxNiwgJmRhdGEpOworCWlmIChyZXQgfHwgZGF0YSA+IDB4ZmYpCisJCXJldHVybiAtRUlOVkFMOworCisJY2hpcC0+Y29tbWFuZCAmPSAofkFENzI5OF9WT0xUQUdFX01BU0spOworCWNoaXAtPmNvbW1hbmQgfD0gZGF0YSA8PCBBRDcyOThfVk9MVEFHRV9PRkZTRVQ7CisKKwlmb3IgKGkgPSAwLCBjaGlwLT5jaGFubmVscyA9IDA7IGkgPCBBRDcyOThfVk9MVEFHRV9MSU1JVF9DT1VOVDsgaSsrKSB7CisJCWlmIChjaGlwLT5jb21tYW5kICYgKEFENzI5OF9UX1NFTlNFX01BU0sgPDwgaSkpCisJCQljaGlwLT5jaGFubmVscysrOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIoY2hhbm5lbF9tYXNrLCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJYWQ3Mjk4X3Nob3dfY2hhbm5lbF9tYXNrLAorCQlhZDcyOThfc3RvcmVfY2hhbm5lbF9tYXNrLAorCQkwKTsKKworc3RhdGljIHNzaXplX3QgYWQ3Mjk4X3Nob3dfbmFtZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkNzI5OF9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXNcbiIsIGNoaXAtPm5hbWUpOworfQorCitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKG5hbWUsIFNfSVJVR08sIGFkNzI5OF9zaG93X25hbWUsIE5VTEwsIDApOworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqYWQ3Mjk4X2F0dHJpYnV0ZXNbXSA9IHsKKwkmaWlvX2Rldl9hdHRyX2F2YWlsYWJsZV9tb2Rlcy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfbW9kZS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfcmVzZXQuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2V4dF9yZWYuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX3Rfc2Vuc2UuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX3RfYXZlcmFnZS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfdm9sdGFnZS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfY2hhbm5lbF9tYXNrLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9uYW1lLmRldl9hdHRyLmF0dHIsCisJTlVMTCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGFkNzI5OF9hdHRyaWJ1dGVfZ3JvdXAgPSB7CisJLmF0dHJzID0gYWQ3Mjk4X2F0dHJpYnV0ZXMsCit9OworCisvKgorICogZGV2aWNlIHByb2JlIGFuZCByZW1vdmUKKyAqLworc3RhdGljIGludCBfX2RldmluaXQgYWQ3Mjk4X3Byb2JlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGlfZGV2KQoreworCXN0cnVjdCBhZDcyOThfY2hpcF9pbmZvICpjaGlwOworCXVuc2lnbmVkIHNob3J0ICpwaW5zID0gc3BpX2Rldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJaW50IHJldCA9IDA7CisKKwljaGlwID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGFkNzI5OF9jaGlwX2luZm8pLCBHRlBfS0VSTkVMKTsKKworCWlmIChjaGlwID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJLyogdGhpcyBpcyBvbmx5IHVzZWQgZm9yIGRldmljZSByZW1vdmFsIHB1cnBvc2VzICovCisJZGV2X3NldF9kcnZkYXRhKCZzcGlfZGV2LT5kZXYsIGNoaXApOworCisJY2hpcC0+c3BpX2RldiA9IHNwaV9kZXY7CisJY2hpcC0+bmFtZSA9IHNwaV9kZXYtPm1vZGFsaWFzOworCWNoaXAtPmJ1c3lfcGluID0gcGluc1swXTsKKworCXJldCA9IGdwaW9fcmVxdWVzdChjaGlwLT5idXN5X3BpbiwgY2hpcC0+bmFtZSk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZzcGlfZGV2LT5kZXYsICJGYWlsIHRvIHJlcXVlc3QgYnVzeSBncGlvIFBJTiAlZC5cbiIsCisJCQljaGlwLT5idXN5X3Bpbik7CisJCWdvdG8gZXJyb3JfZnJlZV9jaGlwOworCX0KKwlncGlvX2RpcmVjdGlvbl9pbnB1dChjaGlwLT5idXN5X3Bpbik7CisKKwljaGlwLT5pbmRpb19kZXYgPSBpaW9fYWxsb2NhdGVfZGV2aWNlKCk7CisJaWYgKGNoaXAtPmluZGlvX2RldiA9PSBOVUxMKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3JfZnJlZV9ncGlvOworCX0KKworCWNoaXAtPmluZGlvX2Rldi0+ZGV2LnBhcmVudCA9ICZzcGlfZGV2LT5kZXY7CisJY2hpcC0+aW5kaW9fZGV2LT5hdHRycyA9ICZhZDcyOThfYXR0cmlidXRlX2dyb3VwOworCWNoaXAtPmluZGlvX2Rldi0+ZGV2X2RhdGEgPSAodm9pZCAqKWNoaXA7CisJY2hpcC0+aW5kaW9fZGV2LT5kcml2ZXJfbW9kdWxlID0gVEhJU19NT0RVTEU7CisJY2hpcC0+aW5kaW9fZGV2LT5tb2RlcyA9IElORElPX0RJUkVDVF9NT0RFOworCisJcmV0ID0gaWlvX2RldmljZV9yZWdpc3RlcihjaGlwLT5pbmRpb19kZXYpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfZnJlZV9kZXY7CisKKwlkZXZfaW5mbygmc3BpX2Rldi0+ZGV2LCAiJXMgdGVtcGVyYXR1cmUgc2Vuc29yIGFuZCBBREMgcmVnaXN0ZXJlZC5cbiIsCisJCQkgY2hpcC0+bmFtZSk7CisKKwlyZXR1cm4gMDsKKworZXJyb3JfZnJlZV9kZXY6CisJaWlvX2ZyZWVfZGV2aWNlKGNoaXAtPmluZGlvX2Rldik7CitlcnJvcl9mcmVlX2dwaW86CisJZ3Bpb19mcmVlKGNoaXAtPmJ1c3lfcGluKTsKK2Vycm9yX2ZyZWVfY2hpcDoKKwlrZnJlZShjaGlwKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IGFkNzI5OF9yZW1vdmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaV9kZXYpCit7CisJc3RydWN0IGFkNzI5OF9jaGlwX2luZm8gKmNoaXAgPSBkZXZfZ2V0X2RydmRhdGEoJnNwaV9kZXYtPmRldik7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGNoaXAtPmluZGlvX2RldjsKKworCWRldl9zZXRfZHJ2ZGF0YSgmc3BpX2Rldi0+ZGV2LCBOVUxMKTsKKwlpaW9fZGV2aWNlX3VucmVnaXN0ZXIoaW5kaW9fZGV2KTsKKwlpaW9fZnJlZV9kZXZpY2UoY2hpcC0+aW5kaW9fZGV2KTsKKwlncGlvX2ZyZWUoY2hpcC0+YnVzeV9waW4pOworCWtmcmVlKGNoaXApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc3BpX2RldmljZV9pZCBhZDcyOThfaWRbXSA9IHsKKwl7ICJhZDcyOTgiLCAwIH0sCisJe30KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUoc3BpLCBhZDcyOThfaWQpOworCitzdGF0aWMgc3RydWN0IHNwaV9kcml2ZXIgYWQ3Mjk4X2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJhZDcyOTgiLAorCQkuYnVzID0gJnNwaV9idXNfdHlwZSwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJfSwKKwkucHJvYmUgPSBhZDcyOThfcHJvYmUsCisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKGFkNzI5OF9yZW1vdmUpLAorCS5pZF90YWJsZSA9IGFkNzI5OF9pZCwKK307CisKK3N0YXRpYyBfX2luaXQgaW50IGFkNzI5OF9pbml0KHZvaWQpCit7CisJcmV0dXJuIHNwaV9yZWdpc3Rlcl9kcml2ZXIoJmFkNzI5OF9kcml2ZXIpOworfQorCitzdGF0aWMgX19leGl0IHZvaWQgYWQ3Mjk4X2V4aXQodm9pZCkKK3sKKwlzcGlfdW5yZWdpc3Rlcl9kcml2ZXIoJmFkNzI5OF9kcml2ZXIpOworfQorCitNT0RVTEVfQVVUSE9SKCJTb25pYyBaaGFuZyA8c29uaWMuemhhbmdAYW5hbG9nLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiQW5hbG9nIERldmljZXMgQUQ3Mjk4IGRpZ2l0YWwiCisJCQkiIHRlbXBlcmF0dXJlIHNlbnNvciBhbmQgQURDIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOworCittb2R1bGVfaW5pdChhZDcyOThfaW5pdCk7Cittb2R1bGVfZXhpdChhZDcyOThfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9hZDczMTQuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRjL2FkNzMxNC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjMTdiMWYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9hZDczMTQuYwpAQCAtMCwwICsxLDMwOCBAQAorLyoKKyAqIEFENzMxNCBkaWdpdGFsIHRlbXBlcmF0dXJlIHNlbnNvciBkcml2ZXIgZm9yIEFENzMxNCwgQURUNzMwMSBhbmQgQURUNzMwMgorICoKKyAqIENvcHlyaWdodCAyMDEwIEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorI2luY2x1ZGUgPGxpbnV4L3J0Yy5oPgorCisjaW5jbHVkZSAiLi4vaWlvLmgiCisjaW5jbHVkZSAiLi4vc3lzZnMuaCIKKworLyoKKyAqIEFENzMxNCBwb3dlciBtb2RlCisgKi8KKyNkZWZpbmUgQUQ3MzE0X1BECQkweDIwMDAKKworLyoKKyAqIEFENzMxNCB0ZW1wZXJhdHVyZSBtYXNrcworICovCisjZGVmaW5lIEFENzMxNF9URU1QX1NJR04JCTB4MjAwCisjZGVmaW5lIEFENzMxNF9URU1QX01BU0sJCTB4N0ZFMAorI2RlZmluZSBBRDczMTRfVEVNUF9PRkZTRVQJCTUKKyNkZWZpbmUgQUQ3MzE0X1RFTVBfRkxPQVRfT0ZGU0VUCTIKKyNkZWZpbmUgQUQ3MzE0X1RFTVBfRkxPQVRfTUFTSwkJMHgzCisKKy8qCisgKiBBRFQ3MzAxIGFuZCBBRFQ3MzAyIHRlbXBlcmF0dXJlIG1hc2tzCisgKi8KKyNkZWZpbmUgQURUNzMwMV9URU1QX1NJR04JCTB4MjAwMAorI2RlZmluZSBBRFQ3MzAxX1RFTVBfTUFTSwkJMHgyRkZGCisjZGVmaW5lIEFEVDczMDFfVEVNUF9GTE9BVF9PRkZTRVQJNQorI2RlZmluZSBBRFQ3MzAxX1RFTVBfRkxPQVRfTUFTSwkJMHgxRgorCisvKgorICogc3RydWN0IGFkNzMxNF9jaGlwX2luZm8gLSBjaGlwIHNwZWNpZmMgaW5mb3JtYXRpb24KKyAqLworCitzdHJ1Y3QgYWQ3MzE0X2NoaXBfaW5mbyB7CisJY29uc3QgY2hhciAqbmFtZTsKKwlzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpX2RldjsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2OworCXM2NCBsYXN0X3RpbWVzdGFtcDsKKwl1OCAgbW9kZTsKK307CisKKy8qCisgKiBhZDczMTQgcmVnaXN0ZXIgYWNjZXNzIGJ5IFNQSQorICovCisKK3N0YXRpYyBpbnQgYWQ3MzE0X3NwaV9yZWFkKHN0cnVjdCBhZDczMTRfY2hpcF9pbmZvICpjaGlwLCB1MTYgKmRhdGEpCit7CisJc3RydWN0IHNwaV9kZXZpY2UgKnNwaV9kZXYgPSBjaGlwLT5zcGlfZGV2OworCWludCByZXQgPSAwOworCXUxNiB2YWx1ZTsKKworCXJldCA9IHNwaV9yZWFkKHNwaV9kZXYsICh1OCAqKSZ2YWx1ZSwgc2l6ZW9mKHZhbHVlKSk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2Vycigmc3BpX2Rldi0+ZGV2LCAiU1BJIHJlYWQgZXJyb3JcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCSpkYXRhID0gYmUxNl90b19jcHUoKHUxNil2YWx1ZSk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFkNzMxNF9zcGlfd3JpdGUoc3RydWN0IGFkNzMxNF9jaGlwX2luZm8gKmNoaXAsIHUxNiBkYXRhKQoreworCXN0cnVjdCBzcGlfZGV2aWNlICpzcGlfZGV2ID0gY2hpcC0+c3BpX2RldjsKKwlpbnQgcmV0ID0gMDsKKwl1MTYgdmFsdWUgPSBjcHVfdG9fYmUxNihkYXRhKTsKKworCXJldCA9IHNwaV93cml0ZShzcGlfZGV2LCAodTggKikmdmFsdWUsIHNpemVvZih2YWx1ZSkpOworCWlmIChyZXQgPCAwKQorCQlkZXZfZXJyKCZzcGlfZGV2LT5kZXYsICJTUEkgd3JpdGUgZXJyb3JcbiIpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QgYWQ3MzE0X3Nob3dfbW9kZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkNzMxNF9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisKKwlpZiAoY2hpcC0+bW9kZSkKKwkJcmV0dXJuIHNwcmludGYoYnVmLCAicG93ZXItc2F2ZVxuIik7CisJZWxzZQorCQlyZXR1cm4gc3ByaW50ZihidWYsICJmdWxsXG4iKTsKK30KKworc3RhdGljIHNzaXplX3QgYWQ3MzE0X3N0b3JlX21vZGUoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgbGVuKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDczMTRfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCXUxNiBtb2RlID0gMDsKKwlpbnQgcmV0OworCisJaWYgKCFzdHJjbXAoYnVmLCAiZnVsbCIpKQorCQltb2RlID0gQUQ3MzE0X1BEOworCisJcmV0ID0gYWQ3MzE0X3NwaV93cml0ZShjaGlwLCBtb2RlKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gLUVJTzsKKworCWNoaXAtPm1vZGUgPSBtb2RlOworCisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIElJT19ERVZJQ0VfQVRUUihtb2RlLCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJYWQ3MzE0X3Nob3dfbW9kZSwKKwkJYWQ3MzE0X3N0b3JlX21vZGUsCisJCTApOworCitzdGF0aWMgc3NpemVfdCBhZDczMTRfc2hvd19hdmFpbGFibGVfbW9kZXMoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXJldHVybiBzcHJpbnRmKGJ1ZiwgImZ1bGxcbnBvd2VyLXNhdmVcbiIpOworfQorCitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKGF2YWlsYWJsZV9tb2RlcywgU19JUlVHTywgYWQ3MzE0X3Nob3dfYXZhaWxhYmxlX21vZGVzLCBOVUxMLCAwKTsKKworc3RhdGljIHNzaXplX3QgYWQ3MzE0X3Nob3dfdGVtcGVyYXR1cmUoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDczMTRfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCXUxNiBkYXRhOworCWNoYXIgc2lnbiA9ICcgJzsKKwlpbnQgcmV0OworCisJaWYgKGNoaXAtPm1vZGUpIHsKKwkJcmV0ID0gYWQ3MzE0X3NwaV93cml0ZShjaGlwLCAwKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiAtRUlPOworCX0KKworCXJldCA9IGFkNzMxNF9zcGlfcmVhZChjaGlwLCAmZGF0YSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIC1FSU87CisKKwlpZiAoY2hpcC0+bW9kZSkKKwkJYWQ3MzE0X3NwaV93cml0ZShjaGlwLCBjaGlwLT5tb2RlKTsKKworCWlmIChzdHJjbXAoY2hpcC0+bmFtZSwgImFkNzMxNCIpKSB7CisJCWRhdGEgPSAoZGF0YSAmIEFENzMxNF9URU1QX01BU0spID4+CisJCQlBRDczMTRfVEVNUF9PRkZTRVQ7CisJCWlmIChkYXRhICYgQUQ3MzE0X1RFTVBfU0lHTikgeworCQkJZGF0YSA9IChBRDczMTRfVEVNUF9TSUdOIDw8IDEpIC0gZGF0YTsKKwkJCXNpZ24gPSAnLSc7CisJCX0KKworCQlyZXR1cm4gc3ByaW50ZihidWYsICIlYyVkLiUuMmRcbiIsIHNpZ24sCisJCQkJZGF0YSA+PiBBRDczMTRfVEVNUF9GTE9BVF9PRkZTRVQsCisJCQkJKGRhdGEgJiBBRDczMTRfVEVNUF9GTE9BVF9NQVNLKSAqIDI1KTsKKwl9IGVsc2UgeworCQlkYXRhICY9IEFEVDczMDFfVEVNUF9NQVNLOworCQlpZiAoZGF0YSAmIEFEVDczMDFfVEVNUF9TSUdOKSB7CisJCQlkYXRhID0gKEFEVDczMDFfVEVNUF9TSUdOIDw8IDEpIC0gZGF0YTsKKwkJCXNpZ24gPSAnLSc7CisJCX0KKworCQlyZXR1cm4gc3ByaW50ZihidWYsICIlYyVkLiUuNWRcbiIsIHNpZ24sCisJCQkJZGF0YSA+PiBBRFQ3MzAxX1RFTVBfRkxPQVRfT0ZGU0VULAorCQkJCShkYXRhICYgQURUNzMwMV9URU1QX0ZMT0FUX01BU0spICogMzEyNSk7CisJfQorfQorCitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKHRlbXBlcmF0dXJlLCBTX0lSVUdPLCBhZDczMTRfc2hvd190ZW1wZXJhdHVyZSwgTlVMTCwgMCk7CisKK3N0YXRpYyBzc2l6ZV90IGFkNzMxNF9zaG93X25hbWUoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDczMTRfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVzXG4iLCBjaGlwLT5uYW1lKTsKK30KKworc3RhdGljIElJT19ERVZJQ0VfQVRUUihuYW1lLCBTX0lSVUdPLCBhZDczMTRfc2hvd19uYW1lLCBOVUxMLCAwKTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmFkNzMxNF9hdHRyaWJ1dGVzW10gPSB7CisJJmlpb19kZXZfYXR0cl9hdmFpbGFibGVfbW9kZXMuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX21vZGUuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX3RlbXBlcmF0dXJlLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9uYW1lLmRldl9hdHRyLmF0dHIsCisJTlVMTCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGFkNzMxNF9hdHRyaWJ1dGVfZ3JvdXAgPSB7CisJLmF0dHJzID0gYWQ3MzE0X2F0dHJpYnV0ZXMsCit9OworCisvKgorICogZGV2aWNlIHByb2JlIGFuZCByZW1vdmUKKyAqLworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBhZDczMTRfcHJvYmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaV9kZXYpCit7CisJc3RydWN0IGFkNzMxNF9jaGlwX2luZm8gKmNoaXA7CisJaW50IHJldCA9IDA7CisKKwljaGlwID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGFkNzMxNF9jaGlwX2luZm8pLCBHRlBfS0VSTkVMKTsKKworCWlmIChjaGlwID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJLyogdGhpcyBpcyBvbmx5IHVzZWQgZm9yIGRldmljZSByZW1vdmFsIHB1cnBvc2VzICovCisJZGV2X3NldF9kcnZkYXRhKCZzcGlfZGV2LT5kZXYsIGNoaXApOworCisJY2hpcC0+c3BpX2RldiA9IHNwaV9kZXY7CisJY2hpcC0+bmFtZSA9IHNwaV9kZXYtPm1vZGFsaWFzOworCisJY2hpcC0+aW5kaW9fZGV2ID0gaWlvX2FsbG9jYXRlX2RldmljZSgpOworCWlmIChjaGlwLT5pbmRpb19kZXYgPT0gTlVMTCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycm9yX2ZyZWVfY2hpcDsKKwl9CisKKwljaGlwLT5pbmRpb19kZXYtPmRldi5wYXJlbnQgPSAmc3BpX2Rldi0+ZGV2OworCWNoaXAtPmluZGlvX2Rldi0+YXR0cnMgPSAmYWQ3MzE0X2F0dHJpYnV0ZV9ncm91cDsKKwljaGlwLT5pbmRpb19kZXYtPmRldl9kYXRhID0gKHZvaWQgKiljaGlwOworCWNoaXAtPmluZGlvX2Rldi0+ZHJpdmVyX21vZHVsZSA9IFRISVNfTU9EVUxFOworCisJcmV0ID0gaWlvX2RldmljZV9yZWdpc3RlcihjaGlwLT5pbmRpb19kZXYpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfZnJlZV9kZXY7CisKKwlkZXZfaW5mbygmc3BpX2Rldi0+ZGV2LCAiJXMgdGVtcGVyYXR1cmUgc2Vuc29yIHJlZ2lzdGVyZWQuXG4iLAorCQkJIGNoaXAtPm5hbWUpOworCisJcmV0dXJuIDA7CitlcnJvcl9mcmVlX2RldjoKKwlpaW9fZnJlZV9kZXZpY2UoY2hpcC0+aW5kaW9fZGV2KTsKK2Vycm9yX2ZyZWVfY2hpcDoKKwlrZnJlZShjaGlwKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IGFkNzMxNF9yZW1vdmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaV9kZXYpCit7CisJc3RydWN0IGFkNzMxNF9jaGlwX2luZm8gKmNoaXAgPSBkZXZfZ2V0X2RydmRhdGEoJnNwaV9kZXYtPmRldik7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGNoaXAtPmluZGlvX2RldjsKKworCWRldl9zZXRfZHJ2ZGF0YSgmc3BpX2Rldi0+ZGV2LCBOVUxMKTsKKwlpZiAoc3BpX2Rldi0+aXJxKQorCQlpaW9fdW5yZWdpc3Rlcl9pbnRlcnJ1cHRfbGluZShpbmRpb19kZXYsIDApOworCWlpb19kZXZpY2VfdW5yZWdpc3RlcihpbmRpb19kZXYpOworCWlpb19mcmVlX2RldmljZShjaGlwLT5pbmRpb19kZXYpOworCWtmcmVlKGNoaXApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc3BpX2RldmljZV9pZCBhZDczMTRfaWRbXSA9IHsKKwl7ICJhZHQ3MzAxIiwgMCB9LAorCXsgImFkdDczMDIiLCAwIH0sCisJeyAiYWQ3MzE0IiwgMCB9LAorCXt9Cit9OworCitzdGF0aWMgc3RydWN0IHNwaV9kcml2ZXIgYWQ3MzE0X2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJhZDczMTQiLAorCQkuYnVzID0gJnNwaV9idXNfdHlwZSwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJfSwKKwkucHJvYmUgPSBhZDczMTRfcHJvYmUsCisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKGFkNzMxNF9yZW1vdmUpLAorCS5pZF90YWJsZSA9IGFkNzMxNF9pZCwKK307CisKK3N0YXRpYyBfX2luaXQgaW50IGFkNzMxNF9pbml0KHZvaWQpCit7CisJcmV0dXJuIHNwaV9yZWdpc3Rlcl9kcml2ZXIoJmFkNzMxNF9kcml2ZXIpOworfQorCitzdGF0aWMgX19leGl0IHZvaWQgYWQ3MzE0X2V4aXQodm9pZCkKK3sKKwlzcGlfdW5yZWdpc3Rlcl9kcml2ZXIoJmFkNzMxNF9kcml2ZXIpOworfQorCitNT0RVTEVfQVVUSE9SKCJTb25pYyBaaGFuZyA8c29uaWMuemhhbmdAYW5hbG9nLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiQW5hbG9nIERldmljZXMgQUQ3MzE0LCBBRFQ3MzAxIGFuZCBBRFQ3MzAyIGRpZ2l0YWwiCisJCQkiIHRlbXBlcmF0dXJlIHNlbnNvciBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKKworbW9kdWxlX2luaXQoYWQ3MzE0X2luaXQpOworbW9kdWxlX2V4aXQoYWQ3MzE0X2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvYWQ3NzQ1LmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9hZDc3NDUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjdlZjg0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvYWQ3NzQ1LmMKQEAgLTAsMCArMSw3MzQgQEAKKy8qCisgKiBBRDc3NFggY2FwYWNpdGl2ZSBzZW5zb3IgZHJpdmVyIHN1cHBvcnRpbmcgQUQ3NzQ1LzYvNworICoKKyAqIENvcHlyaWdodCAyMDEwIEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvcnRjLmg+CisKKyNpbmNsdWRlICIuLi9paW8uaCIKKyNpbmNsdWRlICIuLi9zeXNmcy5oIgorCisvKgorICogQUQ3NzRYIHJlZ2lzdGVycyBkZWZpbml0aW9uCisgKi8KKworI2RlZmluZSBBRDc3NFhfU1RBVFVTCQkwCisjZGVmaW5lIEFENzc0WF9TVEFUVVNfUkRZCSgxIDw8IDIpCisjZGVmaW5lIEFENzc0WF9TVEFUVVNfUkRZVlQJKDEgPDwgMSkKKyNkZWZpbmUgQUQ3NzRYX1NUQVRVU19SRFlDQVAJKDEgPDwgMCkKKyNkZWZpbmUgQUQ3NzRYX0NBUF9EQVRBX0hJR0gJMQorI2RlZmluZSBBRDc3NFhfQ0FQX0RBVEFfTUlECTIKKyNkZWZpbmUgQUQ3NzRYX0NBUF9EQVRBX0xPVwkzCisjZGVmaW5lIEFENzc0WF9WVF9EQVRBX0hJR0gJNAorI2RlZmluZSBBRDc3NFhfVlRfREFUQV9NSUQJNQorI2RlZmluZSBBRDc3NFhfVlRfREFUQV9MT1cJNgorI2RlZmluZSBBRDc3NFhfQ0FQX1NFVFVQCTcKKyNkZWZpbmUgQUQ3NzRYX1ZUX1NFVFVQCQk4CisjZGVmaW5lIEFENzc0WF9FWEVDX1NFVFVQCTkKKyNkZWZpbmUgQUQ3NzRYX0NGRwkJMTAKKyNkZWZpbmUgQUQ3NzRYX0NBUERBQ0EJCTExCisjZGVmaW5lIEFENzc0WF9DQVBEQUNCCQkxMgorI2RlZmluZSBBRDc3NFhfQ0FQREFDX0VOCSgxIDw8IDcpCisjZGVmaW5lIEFENzc0WF9DQVBfT0ZGSAkJMTMKKyNkZWZpbmUgQUQ3NzRYX0NBUF9PRkZMCQkxNAorI2RlZmluZSBBRDc3NFhfQ0FQX0dBSU5ICTE1CisjZGVmaW5lIEFENzc0WF9DQVBfR0FJTkwJMTYKKyNkZWZpbmUgQUQ3NzRYX1ZPTFRfR0FJTkgJMTcKKyNkZWZpbmUgQUQ3NzRYX1ZPTFRfR0FJTkwJMTgKKworI2RlZmluZSBBRDc3NFhfTUFYX0NPTlZfTU9ERQk2CisKKy8qCisgKiBzdHJ1Y3QgYWQ3NzR4X2NoaXBfaW5mbyAtIGNoaXAgc3BlY2lmYyBpbmZvcm1hdGlvbgorICovCisKK3N0cnVjdCBhZDc3NHhfY2hpcF9pbmZvIHsKKwljb25zdCBjaGFyICpuYW1lOworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQ7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldjsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgdGhyZXNoX3dvcms7CisJYm9vbCBpbnRlcjsKKwlzNjQgbGFzdF90aW1lc3RhbXA7CisJdTE2IGNhcF9vZmZzOyAgICAgICAgICAgICAgICAgICAvKiBDYXBhY2l0aXZlIG9mZnNldCAqLworCXUxNiBjYXBfZ2FpbjsgICAgICAgICAgICAgICAgICAgLyogQ2FwYWNpdGl2ZSBnYWluIGNhbGlicmF0aW9uICovCisJdTE2IHZvbHRfZ2FpbjsgICAgICAgICAgICAgICAgICAvKiBWb2x0YWdlIGdhaW4gY2FsaWJyYXRpb24gKi8KKwl1OCAgY2FwX3NldHVwOworCXU4ICB2dF9zZXR1cDsKKwl1OCAgZXhlY19zZXR1cDsKKworCWNoYXIgKmNvbnZlcnNpb25fbW9kZTsKK307CisKK3N0cnVjdCBhZDc3NHhfY29udmVyc2lvbl9tb2RlIHsKKwljaGFyICpuYW1lOworCXU4IHJlZ19jZmc7Cit9OworCitzdHJ1Y3QgYWQ3NzR4X2NvbnZlcnNpb25fbW9kZSBhZDc3NHhfY29udl9tb2RlX3RhYmxlW0FENzc0WF9NQVhfQ09OVl9NT0RFXSA9IHsKKwl7ICJpZGxlIiwgMCB9LAorCXsgImNvbnRpbnVvdXMtY29udmVyc2lvbiIsIDEgfSwKKwl7ICJzaW5nbGUtY29udmVyc2lvbiIsIDIgfSwKKwl7ICJwb3dlci1kb3duIiwgMyB9LAorCXsgIm9mZnNldC1jYWxpYnJhdGlvbiIsIDUgfSwKKwl7ICJnYWluLWNhbGlicmF0aW9uIiwgNiB9LAorfTsKKworLyoKKyAqIGFkNzc0eCByZWdpc3RlciBhY2Nlc3MgYnkgSTJDCisgKi8KKworc3RhdGljIGludCBhZDc3NHhfaTJjX3JlYWQoc3RydWN0IGFkNzc0eF9jaGlwX2luZm8gKmNoaXAsIHU4IHJlZywgdTggKmRhdGEsIGludCBsZW4pCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IGNoaXAtPmNsaWVudDsKKwlpbnQgcmV0OworCisJcmV0ID0gaTJjX21hc3Rlcl9zZW5kKGNsaWVudCwgJnJlZywgMSk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJJMkMgd3JpdGUgZXJyb3JcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldCA9IGkyY19tYXN0ZXJfcmVjdihjbGllbnQsIGRhdGEsIGxlbik7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJJMkMgcmVhZCBlcnJvclxuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhZDc3NHhfaTJjX3dyaXRlKHN0cnVjdCBhZDc3NHhfY2hpcF9pbmZvICpjaGlwLCB1OCByZWcsIHU4IGRhdGEpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IGNoaXAtPmNsaWVudDsKKwlpbnQgcmV0OworCisJdTggdHhbMl0gPSB7CisJCXJlZywKKwkJZGF0YSwKKwl9OworCisJcmV0ID0gaTJjX21hc3Rlcl9zZW5kKGNsaWVudCwgdHgsIDIpOworCWlmIChyZXQgPCAwKQorCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIkkyQyB3cml0ZSBlcnJvclxuIik7CisKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogc3lzZnMgbm9kZXMKKyAqLworCisjZGVmaW5lIElJT19ERVZfQVRUUl9BVkFJTF9DT05WRVJTSU9OX01PREVTKF9zaG93KQkJCQlcCisJSUlPX0RFVklDRV9BVFRSKGF2YWlsYWJsZV9jb252ZXJzaW9uX21vZGVzLCBTX0lSVUdPLCBfc2hvdywgTlVMTCwgMCkKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX0NPTlZFUlNJT05fTU9ERShfbW9kZSwgX3Nob3csIF9zdG9yZSkgICAgICAgICAgICAgIFwKKwlJSU9fREVWSUNFX0FUVFIoY29udmVyc2lvbl9tb2RlLCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgMCkKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX0NBUF9TRVRVUChfbW9kZSwgX3Nob3csIF9zdG9yZSkJCVwKKwlJSU9fREVWSUNFX0FUVFIoY2FwX3NldHVwLCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgMCkKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX1ZUX1NFVFVQKF9tb2RlLCBfc2hvdywgX3N0b3JlKSAgICAgICAgICAgICAgXAorCUlJT19ERVZJQ0VfQVRUUihpbjBfc2V0dXAsIF9tb2RlLCBfc2hvdywgX3N0b3JlLCAwKQorI2RlZmluZSBJSU9fREVWX0FUVFJfRVhFQ19TRVRVUChfbW9kZSwgX3Nob3csIF9zdG9yZSkgICAgICAgICAgICAgIFwKKwlJSU9fREVWSUNFX0FUVFIoZXhlY19zZXR1cCwgX21vZGUsIF9zaG93LCBfc3RvcmUsIDApCisjZGVmaW5lIElJT19ERVZfQVRUUl9WT0xUX0dBSU4oX21vZGUsIF9zaG93LCBfc3RvcmUpCQlcCisJSUlPX0RFVklDRV9BVFRSKGluMF9nYWluLCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgMCkKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX0NBUF9PRkZTKF9tb2RlLCBfc2hvdywgX3N0b3JlKQkJXAorCUlJT19ERVZJQ0VfQVRUUihjYXBfb2ZmcywgX21vZGUsIF9zaG93LCBfc3RvcmUsIDApCisjZGVmaW5lIElJT19ERVZfQVRUUl9DQVBfR0FJTihfbW9kZSwgX3Nob3csIF9zdG9yZSkJCVwKKwlJSU9fREVWSUNFX0FUVFIoY2FwX2dhaW4sIF9tb2RlLCBfc2hvdywgX3N0b3JlLCAwKQorI2RlZmluZSBJSU9fREVWX0FUVFJfQ0FQX0RBVEEoX3Nob3cpCQlcCisJSUlPX0RFVklDRV9BVFRSKGNhcDBfcmF3LCBTX0lSVUdPLCBfc2hvdywgTlVMTCwgMCkKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX1ZUX0RBVEEoX3Nob3cpCQlcCisJSUlPX0RFVklDRV9BVFRSKGluMF9yYXcsIFNfSVJVR08sIF9zaG93LCBOVUxMLCAwKQorCitzdGF0aWMgc3NpemVfdCBhZDc3NHhfc2hvd19jb252ZXJzaW9uX21vZGVzKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlpbnQgaTsKKwlpbnQgbGVuID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBBRDc3NFhfTUFYX0NPTlZfTU9ERTsgaSsrKQorCQlsZW4gKz0gc3ByaW50ZihidWYgKyBsZW4sICIlcyAiLCBhZDc3NHhfY29udl9tb2RlX3RhYmxlW2ldLm5hbWUpOworCisJbGVuICs9IHNwcmludGYoYnVmICsgbGVuLCAiXG4iKTsKKworCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBJSU9fREVWX0FUVFJfQVZBSUxfQ09OVkVSU0lPTl9NT0RFUyhhZDc3NHhfc2hvd19jb252ZXJzaW9uX21vZGVzKTsKKworc3RhdGljIHNzaXplX3QgYWQ3NzR4X3Nob3dfY29udmVyc2lvbl9tb2RlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ3NzR4X2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVzXG4iLCBjaGlwLT5jb252ZXJzaW9uX21vZGUpOworfQorCitzdGF0aWMgc3NpemVfdCBhZDc3NHhfc3RvcmVfY29udmVyc2lvbl9tb2RlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ3NzR4X2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKwl1OCBjZmc7CisJaW50IGk7CisKKwlhZDc3NHhfaTJjX3JlYWQoY2hpcCwgQUQ3NzRYX0NGRywgJmNmZywgMSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQUQ3NzRYX01BWF9DT05WX01PREU7IGkrKykgeworCQlpZiAoc3RybmNtcChidWYsIGFkNzc0eF9jb252X21vZGVfdGFibGVbaV0ubmFtZSwKKwkJCQlzdHJsZW4oYWQ3NzR4X2NvbnZfbW9kZV90YWJsZVtpXS5uYW1lKSAtIDEpID09IDApIHsKKwkJCWNoaXAtPmNvbnZlcnNpb25fbW9kZSA9IGFkNzc0eF9jb252X21vZGVfdGFibGVbaV0ubmFtZTsKKwkJCWNmZyB8PSAweDE4IHwgYWQ3NzR4X2NvbnZfbW9kZV90YWJsZVtpXS5yZWdfY2ZnOworCQkJYWQ3NzR4X2kyY193cml0ZShjaGlwLCBBRDc3NFhfQ0ZHLCBjZmcpOworCQkJcmV0dXJuIGxlbjsKKwkJfQorCX0KKworCWRldl9lcnIoZGV2LCAibm90IHN1cHBvcnRlZCBjb252ZXJzaW9uIG1vZGVcbiIpOworCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBJSU9fREVWX0FUVFJfQ09OVkVSU0lPTl9NT0RFKFNfSVJVR08gfCBTX0lXVVNSLAorCQlhZDc3NHhfc2hvd19jb252ZXJzaW9uX21vZGUsCisJCWFkNzc0eF9zdG9yZV9jb252ZXJzaW9uX21vZGUpOworCitzdGF0aWMgc3NpemVfdCBhZDc3NHhfc2hvd19kYWNfdmFsdWUoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDc3NHhfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCXN0cnVjdCBpaW9fZGV2X2F0dHIgKnRoaXNfYXR0ciA9IHRvX2lpb19kZXZfYXR0cihhdHRyKTsKKwl1OCBkYXRhOworCisJYWQ3NzR4X2kyY19yZWFkKGNoaXAsIHRoaXNfYXR0ci0+YWRkcmVzcywgJmRhdGEsIDEpOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJTAyeFxuIiwgZGF0YSAmIDB4N0YpOworfQorCitzdGF0aWMgc3NpemVfdCBhZDc3NHhfc3RvcmVfZGFjX3ZhbHVlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ3NzR4X2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKwlzdHJ1Y3QgaWlvX2Rldl9hdHRyICp0aGlzX2F0dHIgPSB0b19paW9fZGV2X2F0dHIoYXR0cik7CisJdW5zaWduZWQgbG9uZyBkYXRhOworCWludCByZXQ7CisKKwlyZXQgPSBzdHJpY3Rfc3RydG91bChidWYsIDEwLCAmZGF0YSk7CisKKwlpZiAoIXJldCkgeworCQlhZDc3NHhfaTJjX3dyaXRlKGNoaXAsIHRoaXNfYXR0ci0+YWRkcmVzcywKKwkJCShkYXRhID8gQUQ3NzRYX0NBUERBQ19FTiA6IDApIHwgKGRhdGEgJiAweDdGKSk7CisJCXJldHVybiBsZW47CisJfQorCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIoY2FwZGFjMF9yYXcsIFNfSVJVR08gfCBTX0lXVVNSLAorCQkJYWQ3NzR4X3Nob3dfZGFjX3ZhbHVlLAorCQkJYWQ3NzR4X3N0b3JlX2RhY192YWx1ZSwKKwkJCUFENzc0WF9DQVBEQUNBKTsKKworc3RhdGljIElJT19ERVZJQ0VfQVRUUihjYXBkYWMxX3JhdywgU19JUlVHTyB8IFNfSVdVU1IsCisJCQlhZDc3NHhfc2hvd19kYWNfdmFsdWUsCisJCQlhZDc3NHhfc3RvcmVfZGFjX3ZhbHVlLAorCQkJQUQ3NzRYX0NBUERBQ0IpOworCitzdGF0aWMgc3NpemVfdCBhZDc3NHhfc2hvd19jYXBfc2V0dXAoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDc3NHhfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiMHglMDJ4XG4iLCBjaGlwLT5jYXBfc2V0dXApOworfQorCitzdGF0aWMgc3NpemVfdCBhZDc3NHhfc3RvcmVfY2FwX3NldHVwKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ3NzR4X2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGRhdGE7CisJaW50IHJldDsKKworCXJldCA9IHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMTAsICZkYXRhKTsKKworCWlmICgoIXJldCkgJiYgKGRhdGEgPCAweDEwMCkpIHsKKwkJYWQ3NzR4X2kyY193cml0ZShjaGlwLCBBRDc3NFhfQ0FQX1NFVFVQLCBkYXRhKTsKKwkJY2hpcC0+Y2FwX3NldHVwID0gZGF0YTsKKwkJcmV0dXJuIGxlbjsKKwl9CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIElJT19ERVZfQVRUUl9DQVBfU0VUVVAoU19JUlVHTyB8IFNfSVdVU1IsCisJCWFkNzc0eF9zaG93X2NhcF9zZXR1cCwKKwkJYWQ3NzR4X3N0b3JlX2NhcF9zZXR1cCk7CisKK3N0YXRpYyBzc2l6ZV90IGFkNzc0eF9zaG93X3Z0X3NldHVwKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ3NzR4X2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIjB4JTAyeFxuIiwgY2hpcC0+dnRfc2V0dXApOworfQorCitzdGF0aWMgc3NpemVfdCBhZDc3NHhfc3RvcmVfdnRfc2V0dXAoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgbGVuKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDc3NHhfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZGF0YTsKKwlpbnQgcmV0OworCisJcmV0ID0gc3RyaWN0X3N0cnRvdWwoYnVmLCAxMCwgJmRhdGEpOworCisJaWYgKCghcmV0KSAmJiAoZGF0YSA8IDB4MTAwKSkgeworCQlhZDc3NHhfaTJjX3dyaXRlKGNoaXAsIEFENzc0WF9WVF9TRVRVUCwgZGF0YSk7CisJCWNoaXAtPnZ0X3NldHVwID0gZGF0YTsKKwkJcmV0dXJuIGxlbjsKKwl9CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIElJT19ERVZfQVRUUl9WVF9TRVRVUChTX0lSVUdPIHwgU19JV1VTUiwKKwkJYWQ3NzR4X3Nob3dfdnRfc2V0dXAsCisJCWFkNzc0eF9zdG9yZV92dF9zZXR1cCk7CisKK3N0YXRpYyBzc2l6ZV90IGFkNzc0eF9zaG93X2V4ZWNfc2V0dXAoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDc3NHhfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiMHglMDJ4XG4iLCBjaGlwLT5leGVjX3NldHVwKTsKK30KKworc3RhdGljIHNzaXplX3QgYWQ3NzR4X3N0b3JlX2V4ZWNfc2V0dXAoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgbGVuKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDc3NHhfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZGF0YTsKKwlpbnQgcmV0OworCisJcmV0ID0gc3RyaWN0X3N0cnRvdWwoYnVmLCAxMCwgJmRhdGEpOworCisJaWYgKCghcmV0KSAmJiAoZGF0YSA8IDB4MTAwKSkgeworCQlhZDc3NHhfaTJjX3dyaXRlKGNoaXAsIEFENzc0WF9FWEVDX1NFVFVQLCBkYXRhKTsKKwkJY2hpcC0+ZXhlY19zZXR1cCA9IGRhdGE7CisJCXJldHVybiBsZW47CisJfQorCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBJSU9fREVWX0FUVFJfRVhFQ19TRVRVUChTX0lSVUdPIHwgU19JV1VTUiwKKwkJYWQ3NzR4X3Nob3dfZXhlY19zZXR1cCwKKwkJYWQ3NzR4X3N0b3JlX2V4ZWNfc2V0dXApOworCitzdGF0aWMgc3NpemVfdCBhZDc3NHhfc2hvd192b2x0X2dhaW4oc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDc3NHhfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIGNoaXAtPnZvbHRfZ2Fpbik7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkNzc0eF9zdG9yZV92b2x0X2dhaW4oc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgbGVuKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDc3NHhfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZGF0YTsKKwlpbnQgcmV0OworCisJcmV0ID0gc3RyaWN0X3N0cnRvdWwoYnVmLCAxMCwgJmRhdGEpOworCisJaWYgKCghcmV0KSAmJiAoZGF0YSA8IDB4MTAwMDApKSB7CisJCWFkNzc0eF9pMmNfd3JpdGUoY2hpcCwgQUQ3NzRYX1ZPTFRfR0FJTkgsIGRhdGEgPj4gOCk7CisJCWFkNzc0eF9pMmNfd3JpdGUoY2hpcCwgQUQ3NzRYX1ZPTFRfR0FJTkwsIGRhdGEpOworCQljaGlwLT52b2x0X2dhaW4gPSBkYXRhOworCQlyZXR1cm4gbGVuOworCX0KKworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgSUlPX0RFVl9BVFRSX1ZPTFRfR0FJTihTX0lSVUdPIHwgU19JV1VTUiwKKwkJYWQ3NzR4X3Nob3dfdm9sdF9nYWluLAorCQlhZDc3NHhfc3RvcmVfdm9sdF9nYWluKTsKKworc3RhdGljIHNzaXplX3QgYWQ3NzR4X3Nob3dfY2FwX2RhdGEoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDc3NHhfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZGF0YTsKKwljaGFyIHRtcFszXTsKKworCWFkNzc0eF9pMmNfcmVhZChjaGlwLCBBRDc3NFhfQ0FQX0RBVEFfSElHSCwgdG1wLCAzKTsKKwlkYXRhID0gKChpbnQpdG1wWzBdIDw8IDE2KSB8ICgoaW50KXRtcFsxXSA8PCA4KSB8IChpbnQpdG1wWzJdOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWxkXG4iLCBkYXRhKTsKK30KKworc3RhdGljIElJT19ERVZfQVRUUl9DQVBfREFUQShhZDc3NHhfc2hvd19jYXBfZGF0YSk7CisKK3N0YXRpYyBzc2l6ZV90IGFkNzc0eF9zaG93X3Z0X2RhdGEoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDc3NHhfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZGF0YTsKKwljaGFyIHRtcFszXTsKKworCWFkNzc0eF9pMmNfcmVhZChjaGlwLCBBRDc3NFhfVlRfREFUQV9ISUdILCB0bXAsIDMpOworCWRhdGEgPSAoKGludCl0bXBbMF0gPDwgMTYpIHwgKChpbnQpdG1wWzFdIDw8IDgpIHwgKGludCl0bXBbMl07CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlbGRcbiIsIGRhdGEpOworfQorCitzdGF0aWMgSUlPX0RFVl9BVFRSX1ZUX0RBVEEoYWQ3NzR4X3Nob3dfdnRfZGF0YSk7CisKK3N0YXRpYyBzc2l6ZV90IGFkNzc0eF9zaG93X2NhcF9vZmZzKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ3NzR4X2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBjaGlwLT5jYXBfb2Zmcyk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkNzc0eF9zdG9yZV9jYXBfb2ZmcyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBsZW4pCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkNzc0eF9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisJdW5zaWduZWQgbG9uZyBkYXRhOworCWludCByZXQ7CisKKwlyZXQgPSBzdHJpY3Rfc3RydG91bChidWYsIDEwLCAmZGF0YSk7CisKKwlpZiAoKCFyZXQpICYmIChkYXRhIDwgMHgxMDAwMCkpIHsKKwkJYWQ3NzR4X2kyY193cml0ZShjaGlwLCBBRDc3NFhfQ0FQX09GRkgsIGRhdGEgPj4gOCk7CisJCWFkNzc0eF9pMmNfd3JpdGUoY2hpcCwgQUQ3NzRYX0NBUF9PRkZMLCBkYXRhKTsKKwkJY2hpcC0+Y2FwX29mZnMgPSBkYXRhOworCQlyZXR1cm4gbGVuOworCX0KKworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgSUlPX0RFVl9BVFRSX0NBUF9PRkZTKFNfSVJVR08gfCBTX0lXVVNSLAorCQlhZDc3NHhfc2hvd19jYXBfb2ZmcywKKwkJYWQ3NzR4X3N0b3JlX2NhcF9vZmZzKTsKKworc3RhdGljIHNzaXplX3QgYWQ3NzR4X3Nob3dfY2FwX2dhaW4oc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDc3NHhfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIGNoaXAtPmNhcF9nYWluKTsKK30KKworc3RhdGljIHNzaXplX3QgYWQ3NzR4X3N0b3JlX2NhcF9nYWluKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ3NzR4X2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGRhdGE7CisJaW50IHJldDsKKworCXJldCA9IHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMTAsICZkYXRhKTsKKworCWlmICgoIXJldCkgJiYgKGRhdGEgPCAweDEwMDAwKSkgeworCQlhZDc3NHhfaTJjX3dyaXRlKGNoaXAsIEFENzc0WF9DQVBfR0FJTkgsIGRhdGEgPj4gOCk7CisJCWFkNzc0eF9pMmNfd3JpdGUoY2hpcCwgQUQ3NzRYX0NBUF9HQUlOTCwgZGF0YSk7CisJCWNoaXAtPmNhcF9nYWluID0gZGF0YTsKKwkJcmV0dXJuIGxlbjsKKwl9CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIElJT19ERVZfQVRUUl9DQVBfR0FJTihTX0lSVUdPIHwgU19JV1VTUiwKKwkJYWQ3NzR4X3Nob3dfY2FwX2dhaW4sCisJCWFkNzc0eF9zdG9yZV9jYXBfZ2Fpbik7CisKK3N0YXRpYyBzc2l6ZV90IGFkNzc0eF9zaG93X25hbWUoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDc3NHhfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVzXG4iLCBjaGlwLT5uYW1lKTsKK30KKworc3RhdGljIElJT19ERVZJQ0VfQVRUUihuYW1lLCBTX0lSVUdPLCBhZDc3NHhfc2hvd19uYW1lLCBOVUxMLCAwKTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmFkNzc0eF9hdHRyaWJ1dGVzW10gPSB7CisJJmlpb19kZXZfYXR0cl9hdmFpbGFibGVfY29udmVyc2lvbl9tb2Rlcy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfY29udmVyc2lvbl9tb2RlLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9jYXBfc2V0dXAuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2luMF9zZXR1cC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfZXhlY19zZXR1cC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfY2FwX29mZnMuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2NhcF9nYWluLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9pbjBfZ2Fpbi5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfaW4wX3Jhdy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfY2FwMF9yYXcuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2NhcGRhYzBfcmF3LmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9jYXBkYWMxX3Jhdy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfbmFtZS5kZXZfYXR0ci5hdHRyLAorCU5VTEwsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBhZDc3NHhfYXR0cmlidXRlX2dyb3VwID0geworCS5hdHRycyA9IGFkNzc0eF9hdHRyaWJ1dGVzLAorfTsKKworLyoKKyAqIGRhdGEgcmVhZHkgZXZlbnRzCisgKi8KKworI2RlZmluZSBJSU9fRVZFTlRfQ09ERV9DQVBfUkRZICAgICBJSU9fQlVGRkVSX0VWRU5UX0NPREUoMCkKKyNkZWZpbmUgSUlPX0VWRU5UX0NPREVfVlRfUkRZICAgICAgSUlPX0JVRkZFUl9FVkVOVF9DT0RFKDEpCisKKyNkZWZpbmUgSUlPX0VWRU5UX0FUVFJfQ0FQX1JEWV9TSChfZXZsaXN0LCBfc2hvdywgX3N0b3JlLCBfbWFzaykJXAorCUlJT19FVkVOVF9BVFRSX1NIKGNhcF9yZHksIF9ldmxpc3QsIF9zaG93LCBfc3RvcmUsIF9tYXNrKQorCisjZGVmaW5lIElJT19FVkVOVF9BVFRSX1ZUX1JEWV9TSChfZXZsaXN0LCBfc2hvdywgX3N0b3JlLCBfbWFzaykJXAorCUlJT19FVkVOVF9BVFRSX1NIKHZ0X3JkeSwgX2V2bGlzdCwgX3Nob3csIF9zdG9yZSwgX21hc2spCisKK3N0YXRpYyB2b2lkIGFkNzc0eF9pbnRlcnJ1cHRfaGFuZGxlcl9iaChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmtfcykKK3sKKwlzdHJ1Y3QgYWQ3NzR4X2NoaXBfaW5mbyAqY2hpcCA9CisJCWNvbnRhaW5lcl9vZih3b3JrX3MsIHN0cnVjdCBhZDc3NHhfY2hpcF9pbmZvLCB0aHJlc2hfd29yayk7CisJdTggaW50X3N0YXR1czsKKworCWVuYWJsZV9pcnEoY2hpcC0+Y2xpZW50LT5pcnEpOworCisJYWQ3NzR4X2kyY19yZWFkKGNoaXAsIEFENzc0WF9TVEFUVVMsICZpbnRfc3RhdHVzLCAxKTsKKworCWlmIChpbnRfc3RhdHVzICYgQUQ3NzRYX1NUQVRVU19SRFlDQVApCisJCWlpb19wdXNoX2V2ZW50KGNoaXAtPmluZGlvX2RldiwgMCwKKwkJCQlJSU9fRVZFTlRfQ09ERV9DQVBfUkRZLAorCQkJCWNoaXAtPmxhc3RfdGltZXN0YW1wKTsKKworCWlmIChpbnRfc3RhdHVzICYgQUQ3NzRYX1NUQVRVU19SRFlWVCkKKwkJaWlvX3B1c2hfZXZlbnQoY2hpcC0+aW5kaW9fZGV2LCAwLAorCQkJCUlJT19FVkVOVF9DT0RFX1ZUX1JEWSwKKwkJCQljaGlwLT5sYXN0X3RpbWVzdGFtcCk7Cit9CisKK3N0YXRpYyBpbnQgYWQ3NzR4X2ludGVycnVwdF9oYW5kbGVyX3RoKHN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbywKKwkJaW50IGluZGV4LAorCQlzNjQgdGltZXN0YW1wLAorCQlpbnQgbm9fdGVzdCkKK3sKKwlzdHJ1Y3QgYWQ3NzR4X2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKworCWNoaXAtPmxhc3RfdGltZXN0YW1wID0gdGltZXN0YW1wOworCXNjaGVkdWxlX3dvcmsoJmNoaXAtPnRocmVzaF93b3JrKTsKKworCXJldHVybiAwOworfQorCitJSU9fRVZFTlRfU0goZGF0YV9yZHksICZhZDc3NHhfaW50ZXJydXB0X2hhbmRsZXJfdGgpOworCitzdGF0aWMgc3NpemVfdCBhZDc3NHhfcXVlcnlfb3V0X21vZGUoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCS8qCisJICogQUQ3NzRYIHByb3ZpZGVzIG9uZSAvUkRZIHBpbiwgd2hpY2ggY2FuIGJlIHVzZWQgYXMgaW50ZXJydXB0CisJICogYnV0IHRoZSBwaW4gaXMgbm90IGNvbmZpZ3VyYWJsZQorCSAqLworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIjFcbiIpOworfQorCitzdGF0aWMgc3NpemVfdCBhZDc3NHhfc2V0X291dF9tb2RlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlyZXR1cm4gbGVuOworfQorCitJSU9fRVZFTlRfQVRUUl9DQVBfUkRZX1NIKGlpb19ldmVudF9kYXRhX3JkeSwgYWQ3NzR4X3F1ZXJ5X291dF9tb2RlLCBhZDc3NHhfc2V0X291dF9tb2RlLCAwKTsKK0lJT19FVkVOVF9BVFRSX1ZUX1JEWV9TSChpaW9fZXZlbnRfZGF0YV9yZHksIGFkNzc0eF9xdWVyeV9vdXRfbW9kZSwgYWQ3NzR4X3NldF9vdXRfbW9kZSwgMCk7CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICphZDc3NHhfZXZlbnRfYXR0cmlidXRlc1tdID0geworCSZpaW9fZXZlbnRfYXR0cl9jYXBfcmR5LmRldl9hdHRyLmF0dHIsCisJJmlpb19ldmVudF9hdHRyX3Z0X3JkeS5kZXZfYXR0ci5hdHRyLAorCU5VTEwsCit9OworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBhZDc3NHhfZXZlbnRfYXR0cmlidXRlX2dyb3VwID0geworCS5hdHRycyA9IGFkNzc0eF9ldmVudF9hdHRyaWJ1dGVzLAorfTsKKworLyoKKyAqIGRldmljZSBwcm9iZSBhbmQgcmVtb3ZlCisgKi8KKworc3RhdGljIGludCBfX2RldmluaXQgYWQ3NzR4X3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJCWNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKK3sKKwlpbnQgcmV0ID0gMCwgcmVnZG9uZSA9IDA7CisJc3RydWN0IGFkNzc0eF9jaGlwX2luZm8gKmNoaXAgPSBremFsbG9jKHNpemVvZigqY2hpcCksIEdGUF9LRVJORUwpOworCWlmIChjaGlwID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJvcl9yZXQ7CisJfQorCisJLyogdGhpcyBpcyBvbmx5IHVzZWQgZm9yIGRldmljZSByZW1vdmFsIHB1cnBvc2VzICovCisJaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgY2hpcCk7CisKKwljaGlwLT5jbGllbnQgPSBjbGllbnQ7CisJY2hpcC0+bmFtZSA9IGlkLT5uYW1lOworCisJY2hpcC0+aW5kaW9fZGV2ID0gaWlvX2FsbG9jYXRlX2RldmljZSgpOworCWlmIChjaGlwLT5pbmRpb19kZXYgPT0gTlVMTCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycm9yX2ZyZWVfY2hpcDsKKwl9CisKKwkvKiBFc3RhYmxpc2ggdGhhdCB0aGUgaWlvX2RldiBpcyBhIGNoaWxkIG9mIHRoZSBpMmMgZGV2aWNlICovCisJY2hpcC0+aW5kaW9fZGV2LT5kZXYucGFyZW50ID0gJmNsaWVudC0+ZGV2OworCWNoaXAtPmluZGlvX2Rldi0+YXR0cnMgPSAmYWQ3NzR4X2F0dHJpYnV0ZV9ncm91cDsKKwljaGlwLT5pbmRpb19kZXYtPmV2ZW50X2F0dHJzID0gJmFkNzc0eF9ldmVudF9hdHRyaWJ1dGVfZ3JvdXA7CisJY2hpcC0+aW5kaW9fZGV2LT5kZXZfZGF0YSA9ICh2b2lkICopKGNoaXApOworCWNoaXAtPmluZGlvX2Rldi0+ZHJpdmVyX21vZHVsZSA9IFRISVNfTU9EVUxFOworCWNoaXAtPmluZGlvX2Rldi0+bnVtX2ludGVycnVwdF9saW5lcyA9IDE7CisJY2hpcC0+aW5kaW9fZGV2LT5tb2RlcyA9IElORElPX0RJUkVDVF9NT0RFOworCisJcmV0ID0gaWlvX2RldmljZV9yZWdpc3RlcihjaGlwLT5pbmRpb19kZXYpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfZnJlZV9kZXY7CisJcmVnZG9uZSA9IDE7CisKKwlpZiAoY2xpZW50LT5pcnEpIHsKKwkJcmV0ID0gaWlvX3JlZ2lzdGVyX2ludGVycnVwdF9saW5lKGNsaWVudC0+aXJxLAorCQkJCWNoaXAtPmluZGlvX2RldiwKKwkJCQkwLAorCQkJCUlSUUZfVFJJR0dFUl9GQUxMSU5HLAorCQkJCSJhZDc3NHgiKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJyb3JfZnJlZV9kZXY7CisKKwkJaWlvX2FkZF9ldmVudF90b19saXN0KGlpb19ldmVudF9hdHRyX2NhcF9yZHkubGlzdGVsLAorCQkJCSZjaGlwLT5pbmRpb19kZXYtPmludGVycnVwdHNbMF0tPmV2X2xpc3QpOworCisJCUlOSVRfV09SSygmY2hpcC0+dGhyZXNoX3dvcmssIGFkNzc0eF9pbnRlcnJ1cHRfaGFuZGxlcl9iaCk7CisJfQorCisJZGV2X2VycigmY2xpZW50LT5kZXYsICIlcyBjYXBhY2l0aXZlIHNlbnNvciByZWdpc3RlcmVkLCBpcnE6ICVkXG4iLCBpZC0+bmFtZSwgY2xpZW50LT5pcnEpOworCisJcmV0dXJuIDA7CisKK2Vycm9yX2ZyZWVfZGV2OgorCWlmIChyZWdkb25lKQorCQlpaW9fZGV2aWNlX3VucmVnaXN0ZXIoY2hpcC0+aW5kaW9fZGV2KTsKKwllbHNlCisJCWlpb19mcmVlX2RldmljZShjaGlwLT5pbmRpb19kZXYpOworZXJyb3JfZnJlZV9jaGlwOgorCWtmcmVlKGNoaXApOworZXJyb3JfcmV0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IGFkNzc0eF9yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlzdHJ1Y3QgYWQ3NzR4X2NoaXBfaW5mbyAqY2hpcCA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBjaGlwLT5pbmRpb19kZXY7CisKKwlpZiAoY2xpZW50LT5pcnEpCisJCWlpb191bnJlZ2lzdGVyX2ludGVycnVwdF9saW5lKGluZGlvX2RldiwgMCk7CisJaWlvX2RldmljZV91bnJlZ2lzdGVyKGluZGlvX2Rldik7CisJa2ZyZWUoY2hpcCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIGFkNzc0eF9pZFtdID0geworCXsgImFkNzc0NSIsIDAgfSwKKwl7ICJhZDc3NDYiLCAwIH0sCisJeyAiYWQ3NzQ3IiwgMCB9LAorCXt9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgYWQ3NzR4X2lkKTsKKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGFkNzc0eF9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAiYWQ3NzR4IiwKKwl9LAorCS5wcm9iZSA9IGFkNzc0eF9wcm9iZSwKKwkucmVtb3ZlID0gX19kZXZleGl0X3AoYWQ3NzR4X3JlbW92ZSksCisJLmlkX3RhYmxlID0gYWQ3NzR4X2lkLAorfTsKKworc3RhdGljIF9faW5pdCBpbnQgYWQ3NzR4X2luaXQodm9pZCkKK3sKKwlyZXR1cm4gaTJjX2FkZF9kcml2ZXIoJmFkNzc0eF9kcml2ZXIpOworfQorCitzdGF0aWMgX19leGl0IHZvaWQgYWQ3NzR4X2V4aXQodm9pZCkKK3sKKwlpMmNfZGVsX2RyaXZlcigmYWQ3NzR4X2RyaXZlcik7Cit9CisKK01PRFVMRV9BVVRIT1IoIkJhcnJ5IFNvbmcgPDIxY25iYW9AZ21haWwuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJBbmFsb2cgRGV2aWNlcyBhZDc3NDUvNi83IGNhcGFjaXRpdmUgc2Vuc29yIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOworCittb2R1bGVfaW5pdChhZDc3NHhfaW5pdCk7Cittb2R1bGVfZXhpdChhZDc3NHhfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9hZDc4MTYuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRjL2FkNzgxNi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkNzQxNWEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9hZDc4MTYuYwpAQCAtMCwwICsxLDUzNSBAQAorLyoKKyAqIEFENzgxNiBkaWdpdGFsIHRlbXBlcmF0dXJlIHNlbnNvciBkcml2ZXIgc3VwcG9ydGluZyBBRDc4MTYvNy84CisgKgorICogQ29weXJpZ2h0IDIwMTAgQW5hbG9nIERldmljZXMgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNmcy5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CisjaW5jbHVkZSA8bGludXgvcnRjLmg+CisKKyNpbmNsdWRlICIuLi9paW8uaCIKKyNpbmNsdWRlICIuLi9zeXNmcy5oIgorCisvKgorICogQUQ3ODE2IGNvbmZpZyBtYXNrcworICovCisjZGVmaW5lIEFENzgxNl9GVUxMCQkJMHgxCisjZGVmaW5lIEFENzgxNl9QRAkJCTB4MgorI2RlZmluZSBBRDc4MTZfQ1NfTUFTSwkJCTB4NworI2RlZmluZSBBRDc4MTZfQ1NfTUFYCQkJMHg0CisKKy8qCisgKiBBRDc4MTYgdGVtcGVyYXR1cmUgbWFza3MKKyAqLworI2RlZmluZSBBRDc4MTZfVkFMVUVfT0ZGU0VUCQk2CisjZGVmaW5lIEFENzgxNl9CT1VORF9WQUxVRV9CQVNFCQkweDgKKyNkZWZpbmUgQUQ3ODE2X0JPVU5EX1ZBTFVFX01JTgkJLTk1CisjZGVmaW5lIEFENzgxNl9CT1VORF9WQUxVRV9NQVgJCTE1MgorI2RlZmluZSBBRDc4MTZfVEVNUF9GTE9BVF9PRkZTRVQJMgorI2RlZmluZSBBRDc4MTZfVEVNUF9GTE9BVF9NQVNLCQkweDMKKworCisvKgorICogc3RydWN0IGFkNzgxNl9jaGlwX2luZm8gLSBjaGlwIHNwZWNpZmMgaW5mb3JtYXRpb24KKyAqLworCitzdHJ1Y3QgYWQ3ODE2X2NoaXBfaW5mbyB7CisJY29uc3QgY2hhciAqbmFtZTsKKwlzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpX2RldjsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2OworCXN0cnVjdCB3b3JrX3N0cnVjdCB0aHJlc2hfd29yazsKKwlzNjQgbGFzdF90aW1lc3RhbXA7CisJdTE2IHJkd3JfcGluOworCXUxNiBjb252ZXJ0X3BpbjsKKwl1MTYgYnVzeV9waW47CisJdTggIG90aV9kYXRhW0FENzgxNl9DU19NQVgrMV07CisJdTggIGNoYW5uZWxfaWQ7CS8qIDAgYWx3YXlzIGJlIHRlbXBlcmF0dXJlICovCisJdTggIG1vZGU7Cit9OworCisvKgorICogYWQ3ODE2IGRhdGEgYWNjZXNzIGJ5IFNQSQorICovCitzdGF0aWMgaW50IGFkNzgxNl9zcGlfcmVhZChzdHJ1Y3QgYWQ3ODE2X2NoaXBfaW5mbyAqY2hpcCwgdTE2ICpkYXRhKQoreworCXN0cnVjdCBzcGlfZGV2aWNlICpzcGlfZGV2ID0gY2hpcC0+c3BpX2RldjsKKwlpbnQgcmV0ID0gMDsKKworCWdwaW9fc2V0X3ZhbHVlKGNoaXAtPnJkd3JfcGluLCAxKTsKKwlncGlvX3NldF92YWx1ZShjaGlwLT5yZHdyX3BpbiwgMCk7CisJcmV0ID0gc3BpX3dyaXRlKHNwaV9kZXYsICZjaGlwLT5jaGFubmVsX2lkLCBzaXplb2YoY2hpcC0+Y2hhbm5lbF9pZCkpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoJnNwaV9kZXYtPmRldiwgIlNQSSBjaGFubmVsIHNldHRpbmcgZXJyb3JcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKwlncGlvX3NldF92YWx1ZShjaGlwLT5yZHdyX3BpbiwgMSk7CisKKworCWlmIChjaGlwLT5tb2RlID09IEFENzgxNl9QRCkgeyAvKiBvcGVyYXRpbmcgbW9kZSAyICovCisJCWdwaW9fc2V0X3ZhbHVlKGNoaXAtPmNvbnZlcnRfcGluLCAxKTsKKwkJZ3Bpb19zZXRfdmFsdWUoY2hpcC0+Y29udmVydF9waW4sIDApOworCX0gZWxzZSB7IC8qIG9wZXJhdGluZyBtb2RlIDEgKi8KKwkJZ3Bpb19zZXRfdmFsdWUoY2hpcC0+Y29udmVydF9waW4sIDApOworCQlncGlvX3NldF92YWx1ZShjaGlwLT5jb252ZXJ0X3BpbiwgMSk7CisJfQorCisJd2hpbGUgKGdwaW9fZ2V0X3ZhbHVlKGNoaXAtPmJ1c3lfcGluKSkKKwkJY3B1X3JlbGF4KCk7CisKKwlncGlvX3NldF92YWx1ZShjaGlwLT5yZHdyX3BpbiwgMCk7CisJZ3Bpb19zZXRfdmFsdWUoY2hpcC0+cmR3cl9waW4sIDEpOworCXJldCA9IHNwaV9yZWFkKHNwaV9kZXYsICh1OCAqKWRhdGEsIHNpemVvZigqZGF0YSkpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoJnNwaV9kZXYtPmRldiwgIlNQSSBkYXRhIHJlYWQgZXJyb3JcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCSpkYXRhID0gYmUxNl90b19jcHUoKmRhdGEpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhZDc4MTZfc3BpX3dyaXRlKHN0cnVjdCBhZDc4MTZfY2hpcF9pbmZvICpjaGlwLCB1OCBkYXRhKQoreworCXN0cnVjdCBzcGlfZGV2aWNlICpzcGlfZGV2ID0gY2hpcC0+c3BpX2RldjsKKwlpbnQgcmV0ID0gMDsKKworCWdwaW9fc2V0X3ZhbHVlKGNoaXAtPnJkd3JfcGluLCAxKTsKKwlncGlvX3NldF92YWx1ZShjaGlwLT5yZHdyX3BpbiwgMCk7CisJcmV0ID0gc3BpX3dyaXRlKHNwaV9kZXYsICZkYXRhLCBzaXplb2YoZGF0YSkpOworCWlmIChyZXQgPCAwKQorCQlkZXZfZXJyKCZzcGlfZGV2LT5kZXYsICJTUEkgb3RpIGRhdGEgd3JpdGUgZXJyb3JcbiIpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QgYWQ3ODE2X3Nob3dfbW9kZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkNzgxNl9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisKKwlpZiAoY2hpcC0+bW9kZSkKKwkJcmV0dXJuIHNwcmludGYoYnVmLCAicG93ZXItc2F2ZVxuIik7CisJZWxzZQorCQlyZXR1cm4gc3ByaW50ZihidWYsICJmdWxsXG4iKTsKK30KKworc3RhdGljIHNzaXplX3QgYWQ3ODE2X3N0b3JlX21vZGUoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgbGVuKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDc4MTZfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCisJaWYgKHN0cmNtcChidWYsICJmdWxsIikpIHsKKwkJZ3Bpb19zZXRfdmFsdWUoY2hpcC0+cmR3cl9waW4sIDEpOworCQljaGlwLT5tb2RlID0gQUQ3ODE2X0ZVTEw7CisJfSBlbHNlIHsKKwkJZ3Bpb19zZXRfdmFsdWUoY2hpcC0+cmR3cl9waW4sIDApOworCQljaGlwLT5tb2RlID0gQUQ3ODE2X1BEOworCX0KKworCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIobW9kZSwgU19JUlVHTyB8IFNfSVdVU1IsCisJCWFkNzgxNl9zaG93X21vZGUsCisJCWFkNzgxNl9zdG9yZV9tb2RlLAorCQkwKTsKKworc3RhdGljIHNzaXplX3QgYWQ3ODE2X3Nob3dfYXZhaWxhYmxlX21vZGVzKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gc3ByaW50ZihidWYsICJmdWxsXG5wb3dlci1zYXZlXG4iKTsKK30KKworc3RhdGljIElJT19ERVZJQ0VfQVRUUihhdmFpbGFibGVfbW9kZXMsIFNfSVJVR08sIGFkNzgxNl9zaG93X2F2YWlsYWJsZV9tb2RlcywgTlVMTCwgMCk7CisKK3N0YXRpYyBzc2l6ZV90IGFkNzgxNl9zaG93X2NoYW5uZWwoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDc4MTZfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIGNoaXAtPmNoYW5uZWxfaWQpOworfQorCitzdGF0aWMgc3NpemVfdCBhZDc4MTZfc3RvcmVfY2hhbm5lbChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBsZW4pCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkNzgxNl9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisJdW5zaWduZWQgbG9uZyBkYXRhOworCWludCByZXQ7CisKKwlyZXQgPSBzdHJpY3Rfc3RydG91bChidWYsIDEwLCAmZGF0YSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoZGF0YSA+IEFENzgxNl9DU19NQVggJiYgZGF0YSAhPSBBRDc4MTZfQ1NfTUFTSykgeworCQlkZXZfZXJyKCZjaGlwLT5zcGlfZGV2LT5kZXYsICJJbnZhbGlkIGNoYW5uZWwgaWQgJWx1IGZvciAlcy5cbiIsCisJCQlkYXRhLCBjaGlwLT5uYW1lKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfSBlbHNlIGlmIChzdHJjbXAoY2hpcC0+bmFtZSwgImFkNzgxOCIpID09IDAgJiYgZGF0YSA+IDEpIHsKKwkJZGV2X2VycigmY2hpcC0+c3BpX2Rldi0+ZGV2LAorCQkJIkludmFsaWQgY2hhbm5lbCBpZCAlbHUgZm9yIGFkNzgxOC5cbiIsIGRhdGEpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9IGVsc2UgaWYgKHN0cmNtcChjaGlwLT5uYW1lLCAiYWQ3ODE2IikgPT0gMCAmJiBkYXRhID4gMCkgeworCQlkZXZfZXJyKCZjaGlwLT5zcGlfZGV2LT5kZXYsCisJCQkiSW52YWxpZCBjaGFubmVsIGlkICVsdSBmb3IgYWQ3ODE2LlxuIiwgZGF0YSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWNoaXAtPmNoYW5uZWxfaWQgPSBkYXRhOworCisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIElJT19ERVZJQ0VfQVRUUihjaGFubmVsLCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJYWQ3ODE2X3Nob3dfY2hhbm5lbCwKKwkJYWQ3ODE2X3N0b3JlX2NoYW5uZWwsCisJCTApOworCisKK3N0YXRpYyBzc2l6ZV90IGFkNzgxNl9zaG93X3ZhbHVlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ3ODE2X2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKwl1MTYgZGF0YTsKKwlzOCB2YWx1ZTsKKwlpbnQgcmV0OworCisJcmV0ID0gYWQ3ODE2X3NwaV9yZWFkKGNoaXAsICZkYXRhKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gLUVJTzsKKworCWRhdGEgPj49IEFENzgxNl9WQUxVRV9PRkZTRVQ7CisKKwlpZiAoY2hpcC0+Y2hhbm5lbF9pZCA9PSAwKSB7CisJCXZhbHVlID0gKHM4KSgoZGF0YSA+PiBBRDc4MTZfVEVNUF9GTE9BVF9PRkZTRVQpIC0gMTAzKTsKKwkJZGF0YSAmPSBBRDc4MTZfVEVNUF9GTE9BVF9NQVNLOworCQlpZiAodmFsdWUgPCAwKQorCQkJZGF0YSA9ICgxIDw8IEFENzgxNl9URU1QX0ZMT0FUX09GRlNFVCkgLSBkYXRhOworCQlyZXR1cm4gc3ByaW50ZihidWYsICIlZC4lLjJkXG4iLCB2YWx1ZSwgZGF0YSAqIDI1KTsKKwl9IGVsc2UKKwkJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIGRhdGEpOworfQorCitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKHZhbHVlLCBTX0lSVUdPLCBhZDc4MTZfc2hvd192YWx1ZSwgTlVMTCwgMCk7CisKK3N0YXRpYyBzc2l6ZV90IGFkNzgxNl9zaG93X25hbWUoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDc4MTZfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVzXG4iLCBjaGlwLT5uYW1lKTsKK30KKworc3RhdGljIElJT19ERVZJQ0VfQVRUUihuYW1lLCBTX0lSVUdPLCBhZDc4MTZfc2hvd19uYW1lLCBOVUxMLCAwKTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmFkNzgxNl9hdHRyaWJ1dGVzW10gPSB7CisJJmlpb19kZXZfYXR0cl9hdmFpbGFibGVfbW9kZXMuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX21vZGUuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2NoYW5uZWwuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX3ZhbHVlLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9uYW1lLmRldl9hdHRyLmF0dHIsCisJTlVMTCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGFkNzgxNl9hdHRyaWJ1dGVfZ3JvdXAgPSB7CisJLmF0dHJzID0gYWQ3ODE2X2F0dHJpYnV0ZXMsCit9OworCisvKgorICogdGVtcGVyYXR1cmUgYm91bmQgZXZlbnRzCisgKi8KKworI2RlZmluZSBJSU9fRVZFTlRfQ09ERV9BRDc4MTZfT1RJICAgIElJT19CVUZGRVJfRVZFTlRfQ09ERSgwKQorCitzdGF0aWMgdm9pZCBhZDc4MTZfaW50ZXJydXB0X2JoKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29ya19zKQoreworCXN0cnVjdCBhZDc4MTZfY2hpcF9pbmZvICpjaGlwID0KKwkJY29udGFpbmVyX29mKHdvcmtfcywgc3RydWN0IGFkNzgxNl9jaGlwX2luZm8sIHRocmVzaF93b3JrKTsKKworCWVuYWJsZV9pcnEoY2hpcC0+c3BpX2Rldi0+aXJxKTsKKworCWlpb19wdXNoX2V2ZW50KGNoaXAtPmluZGlvX2RldiwgMCwKKwkJCUlJT19FVkVOVF9DT0RFX0FENzgxNl9PVEksCisJCQljaGlwLT5sYXN0X3RpbWVzdGFtcCk7Cit9CisKK3N0YXRpYyBpbnQgYWQ3ODE2X2ludGVycnVwdChzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8sCisJCWludCBpbmRleCwKKwkJczY0IHRpbWVzdGFtcCwKKwkJaW50IG5vX3Rlc3QpCit7CisJc3RydWN0IGFkNzgxNl9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisKKwljaGlwLT5sYXN0X3RpbWVzdGFtcCA9IHRpbWVzdGFtcDsKKwlzY2hlZHVsZV93b3JrKCZjaGlwLT50aHJlc2hfd29yayk7CisKKwlyZXR1cm4gMDsKK30KKworSUlPX0VWRU5UX1NIKGFkNzgxNiwgJmFkNzgxNl9pbnRlcnJ1cHQpOworCitzdGF0aWMgc3NpemVfdCBhZDc4MTZfc2hvd19vdGkoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDc4MTZfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCWludCB2YWx1ZTsKKworCWlmIChjaGlwLT5jaGFubmVsX2lkID4gQUQ3ODE2X0NTX01BWCkgeworCQlkZXZfZXJyKGRldiwgIkludmFsaWQgb3RpIGNoYW5uZWwgaWQgJWQuXG4iLCBjaGlwLT5jaGFubmVsX2lkKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfSBlbHNlIGlmIChjaGlwLT5jaGFubmVsX2lkID09IDApIHsKKwkJdmFsdWUgPSBBRDc4MTZfQk9VTkRfVkFMVUVfTUlOICsKKwkJCShjaGlwLT5vdGlfZGF0YVtjaGlwLT5jaGFubmVsX2lkXSAtCisJCQlBRDc4MTZfQk9VTkRfVkFMVUVfQkFTRSk7CisJCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCB2YWx1ZSk7CisJfSBlbHNlCisJCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCBjaGlwLT5vdGlfZGF0YVtjaGlwLT5jaGFubmVsX2lkXSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3NpemVfdCBhZDc4MTZfc2V0X290aShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBsZW4pCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkNzgxNl9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisJbG9uZyB2YWx1ZTsKKwl1OCBkYXRhOworCWludCByZXQ7CisKKwlyZXQgPSBzdHJpY3Rfc3RydG9sKGJ1ZiwgMTAsICZ2YWx1ZSk7CisKKwlpZiAoY2hpcC0+Y2hhbm5lbF9pZCA+IEFENzgxNl9DU19NQVgpIHsKKwkJZGV2X2VycihkZXYsICJJbnZhbGlkIG90aSBjaGFubmVsIGlkICVkLlxuIiwgY2hpcC0+Y2hhbm5lbF9pZCk7CisJCXJldHVybiAtRUlOVkFMOworCX0gZWxzZSBpZiAoY2hpcC0+Y2hhbm5lbF9pZCA9PSAwKSB7CisJCWlmIChyZXQgfHwgdmFsdWUgPCBBRDc4MTZfQk9VTkRfVkFMVUVfTUlOIHx8CisJCQl2YWx1ZSA+IEFENzgxNl9CT1VORF9WQUxVRV9NQVgpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlkYXRhID0gKHU4KSh2YWx1ZSAtIEFENzgxNl9CT1VORF9WQUxVRV9NSU4gKworCQkJQUQ3ODE2X0JPVU5EX1ZBTFVFX0JBU0UpOworCX0gZWxzZSB7CisJCWlmIChyZXQgfHwgdmFsdWUgPCBBRDc4MTZfQk9VTkRfVkFMVUVfQkFTRSB8fCB2YWx1ZSA+IDI1NSkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWRhdGEgPSAodTgpdmFsdWU7CisJfQorCisJcmV0ID0gYWQ3ODE2X3NwaV93cml0ZShjaGlwLCBkYXRhKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gLUVJTzsKKworCWNoaXAtPm90aV9kYXRhW2NoaXAtPmNoYW5uZWxfaWRdID0gZGF0YTsKKworCXJldHVybiBsZW47Cit9CisKK0lJT19FVkVOVF9BVFRSX1NIKG90aSwgaWlvX2V2ZW50X2FkNzgxNiwKKwkJYWQ3ODE2X3Nob3dfb3RpLCBhZDc4MTZfc2V0X290aSwgMCk7CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICphZDc4MTZfZXZlbnRfYXR0cmlidXRlc1tdID0geworCSZpaW9fZXZlbnRfYXR0cl9vdGkuZGV2X2F0dHIuYXR0ciwKKwlOVUxMLAorfTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgYWQ3ODE2X2V2ZW50X2F0dHJpYnV0ZV9ncm91cCA9IHsKKwkuYXR0cnMgPSBhZDc4MTZfZXZlbnRfYXR0cmlidXRlcywKK307CisKKy8qCisgKiBkZXZpY2UgcHJvYmUgYW5kIHJlbW92ZQorICovCisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGFkNzgxNl9wcm9iZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpX2RldikKK3sKKwlzdHJ1Y3QgYWQ3ODE2X2NoaXBfaW5mbyAqY2hpcDsKKwl1bnNpZ25lZCBzaG9ydCAqcGlucyA9IHNwaV9kZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCWludCByZXQgPSAwOworCWludCBpOworCisJaWYgKCFwaW5zKSB7CisJCWRldl9lcnIoJnNwaV9kZXYtPmRldiwgIk5vIG5lY2Vzc2FyeSBHUElPIHBsYXRmb3JtIGRhdGEuXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJY2hpcCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBhZDc4MTZfY2hpcF9pbmZvKSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoY2hpcCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qIHRoaXMgaXMgb25seSB1c2VkIGZvciBkZXZpY2UgcmVtb3ZhbCBwdXJwb3NlcyAqLworCWRldl9zZXRfZHJ2ZGF0YSgmc3BpX2Rldi0+ZGV2LCBjaGlwKTsKKworCWNoaXAtPnNwaV9kZXYgPSBzcGlfZGV2OworCWNoaXAtPm5hbWUgPSBzcGlfZGV2LT5tb2RhbGlhczsKKwlmb3IgKGkgPSAwOyBpIDw9IEFENzgxNl9DU19NQVg7IGkrKykKKwkJY2hpcC0+b3RpX2RhdGFbaV0gPSAyMDM7CisJY2hpcC0+cmR3cl9waW4gPSBwaW5zWzBdOworCWNoaXAtPmNvbnZlcnRfcGluID0gcGluc1sxXTsKKwljaGlwLT5idXN5X3BpbiA9IHBpbnNbMl07CisKKwlyZXQgPSBncGlvX3JlcXVlc3QoY2hpcC0+cmR3cl9waW4sIGNoaXAtPm5hbWUpOworCWlmIChyZXQpIHsKKwkJZGV2X2Vycigmc3BpX2Rldi0+ZGV2LCAiRmFpbCB0byByZXF1ZXN0IHJkd3IgZ3BpbyBQSU4gJWQuXG4iLAorCQkJY2hpcC0+cmR3cl9waW4pOworCQlnb3RvIGVycm9yX2ZyZWVfY2hpcDsKKwl9CisJZ3Bpb19kaXJlY3Rpb25faW5wdXQoY2hpcC0+cmR3cl9waW4pOworCXJldCA9IGdwaW9fcmVxdWVzdChjaGlwLT5jb252ZXJ0X3BpbiwgY2hpcC0+bmFtZSk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZzcGlfZGV2LT5kZXYsICJGYWlsIHRvIHJlcXVlc3QgY29udmVydCBncGlvIFBJTiAlZC5cbiIsCisJCQljaGlwLT5jb252ZXJ0X3Bpbik7CisJCWdvdG8gZXJyb3JfZnJlZV9ncGlvX3Jkd3I7CisJfQorCWdwaW9fZGlyZWN0aW9uX2lucHV0KGNoaXAtPmNvbnZlcnRfcGluKTsKKwlyZXQgPSBncGlvX3JlcXVlc3QoY2hpcC0+YnVzeV9waW4sIGNoaXAtPm5hbWUpOworCWlmIChyZXQpIHsKKwkJZGV2X2Vycigmc3BpX2Rldi0+ZGV2LCAiRmFpbCB0byByZXF1ZXN0IGJ1c3kgZ3BpbyBQSU4gJWQuXG4iLAorCQkJY2hpcC0+YnVzeV9waW4pOworCQlnb3RvIGVycm9yX2ZyZWVfZ3Bpb19jb252ZXJ0OworCX0KKwlncGlvX2RpcmVjdGlvbl9pbnB1dChjaGlwLT5idXN5X3Bpbik7CisKKwljaGlwLT5pbmRpb19kZXYgPSBpaW9fYWxsb2NhdGVfZGV2aWNlKCk7CisJaWYgKGNoaXAtPmluZGlvX2RldiA9PSBOVUxMKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3JfZnJlZV9ncGlvOworCX0KKworCWNoaXAtPmluZGlvX2Rldi0+ZGV2LnBhcmVudCA9ICZzcGlfZGV2LT5kZXY7CisJY2hpcC0+aW5kaW9fZGV2LT5hdHRycyA9ICZhZDc4MTZfYXR0cmlidXRlX2dyb3VwOworCWNoaXAtPmluZGlvX2Rldi0+ZXZlbnRfYXR0cnMgPSAmYWQ3ODE2X2V2ZW50X2F0dHJpYnV0ZV9ncm91cDsKKwljaGlwLT5pbmRpb19kZXYtPmRldl9kYXRhID0gKHZvaWQgKiljaGlwOworCWNoaXAtPmluZGlvX2Rldi0+ZHJpdmVyX21vZHVsZSA9IFRISVNfTU9EVUxFOworCWNoaXAtPmluZGlvX2Rldi0+bnVtX2ludGVycnVwdF9saW5lcyA9IDE7CisJY2hpcC0+aW5kaW9fZGV2LT5tb2RlcyA9IElORElPX0RJUkVDVF9NT0RFOworCisJcmV0ID0gaWlvX2RldmljZV9yZWdpc3RlcihjaGlwLT5pbmRpb19kZXYpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfZnJlZV9kZXY7CisKKwlpZiAoc3BpX2Rldi0+aXJxKSB7CisJCS8qIE9ubHkgbG93IHRyaWdnZXIgaXMgc3VwcG9ydGVkIGluIGFkNzgxNi83LzggKi8KKwkJcmV0ID0gaWlvX3JlZ2lzdGVyX2ludGVycnVwdF9saW5lKHNwaV9kZXYtPmlycSwKKwkJCQljaGlwLT5pbmRpb19kZXYsCisJCQkJMCwKKwkJCQlJUlFGX1RSSUdHRVJfTE9XLAorCQkJCWNoaXAtPm5hbWUpOworCQlpZiAocmV0KQorCQkJZ290byBlcnJvcl91bnJlZ19kZXY7CisKKwkJLyoKKwkJICogVGhlIGV2ZW50IGhhbmRsZXIgbGlzdCBlbGVtZW50IHJlZmVyIHRvIGlpb19ldmVudF9hZDc4MTYuCisJCSAqIEFsbCBldmVudCBhdHRyaWJ1dGVzIGJpbmQgdG8gdGhlIHNhbWUgZXZlbnQgaGFuZGxlci4KKwkJICogU28sIG9ubHkgcmVnaXN0ZXIgZXZlbnQgaGFuZGxlciBvbmNlLgorCQkgKi8KKwkJaWlvX2FkZF9ldmVudF90b19saXN0KCZpaW9fZXZlbnRfYWQ3ODE2LAorCQkJCSZjaGlwLT5pbmRpb19kZXYtPmludGVycnVwdHNbMF0tPmV2X2xpc3QpOworCisJCUlOSVRfV09SSygmY2hpcC0+dGhyZXNoX3dvcmssIGFkNzgxNl9pbnRlcnJ1cHRfYmgpOworCX0KKworCWRldl9pbmZvKCZzcGlfZGV2LT5kZXYsICIlcyB0ZW1wZXJhdHVyZSBzZW5zb3IgYW5kIEFEQyByZWdpc3RlcmVkLlxuIiwKKwkJCSBjaGlwLT5uYW1lKTsKKworCXJldHVybiAwOworCitlcnJvcl91bnJlZ19kZXY6CisJaWlvX2RldmljZV91bnJlZ2lzdGVyKGNoaXAtPmluZGlvX2Rldik7CitlcnJvcl9mcmVlX2RldjoKKwlpaW9fZnJlZV9kZXZpY2UoY2hpcC0+aW5kaW9fZGV2KTsKK2Vycm9yX2ZyZWVfZ3BpbzoKKwlncGlvX2ZyZWUoY2hpcC0+YnVzeV9waW4pOworZXJyb3JfZnJlZV9ncGlvX2NvbnZlcnQ6CisJZ3Bpb19mcmVlKGNoaXAtPmNvbnZlcnRfcGluKTsKK2Vycm9yX2ZyZWVfZ3Bpb19yZHdyOgorCWdwaW9fZnJlZShjaGlwLT5yZHdyX3Bpbik7CitlcnJvcl9mcmVlX2NoaXA6CisJa2ZyZWUoY2hpcCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBhZDc4MTZfcmVtb3ZlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGlfZGV2KQoreworCXN0cnVjdCBhZDc4MTZfY2hpcF9pbmZvICpjaGlwID0gZGV2X2dldF9kcnZkYXRhKCZzcGlfZGV2LT5kZXYpOworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBjaGlwLT5pbmRpb19kZXY7CisKKwlkZXZfc2V0X2RydmRhdGEoJnNwaV9kZXYtPmRldiwgTlVMTCk7CisJaWYgKHNwaV9kZXYtPmlycSkKKwkJaWlvX3VucmVnaXN0ZXJfaW50ZXJydXB0X2xpbmUoaW5kaW9fZGV2LCAwKTsKKwlpaW9fZGV2aWNlX3VucmVnaXN0ZXIoaW5kaW9fZGV2KTsKKwlpaW9fZnJlZV9kZXZpY2UoY2hpcC0+aW5kaW9fZGV2KTsKKwlncGlvX2ZyZWUoY2hpcC0+YnVzeV9waW4pOworCWdwaW9fZnJlZShjaGlwLT5jb252ZXJ0X3Bpbik7CisJZ3Bpb19mcmVlKGNoaXAtPnJkd3JfcGluKTsKKwlrZnJlZShjaGlwKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHNwaV9kZXZpY2VfaWQgYWQ3ODE2X2lkW10gPSB7CisJeyAiYWQ3ODE2IiwgMCB9LAorCXsgImFkNzgxNyIsIDAgfSwKKwl7ICJhZDc4MTgiLCAwIH0sCisJe30KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUoc3BpLCBhZDc4MTZfaWQpOworCitzdGF0aWMgc3RydWN0IHNwaV9kcml2ZXIgYWQ3ODE2X2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJhZDc4MTYiLAorCQkuYnVzID0gJnNwaV9idXNfdHlwZSwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJfSwKKwkucHJvYmUgPSBhZDc4MTZfcHJvYmUsCisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKGFkNzgxNl9yZW1vdmUpLAorCS5pZF90YWJsZSA9IGFkNzgxNl9pZCwKK307CisKK3N0YXRpYyBfX2luaXQgaW50IGFkNzgxNl9pbml0KHZvaWQpCit7CisJcmV0dXJuIHNwaV9yZWdpc3Rlcl9kcml2ZXIoJmFkNzgxNl9kcml2ZXIpOworfQorCitzdGF0aWMgX19leGl0IHZvaWQgYWQ3ODE2X2V4aXQodm9pZCkKK3sKKwlzcGlfdW5yZWdpc3Rlcl9kcml2ZXIoJmFkNzgxNl9kcml2ZXIpOworfQorCitNT0RVTEVfQVVUSE9SKCJTb25pYyBaaGFuZyA8c29uaWMuemhhbmdAYW5hbG9nLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiQW5hbG9nIERldmljZXMgQUQ3ODE2LzcvOCBkaWdpdGFsIgorCQkJIiB0ZW1wZXJhdHVyZSBzZW5zb3IgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CisKK21vZHVsZV9pbml0KGFkNzgxNl9pbml0KTsKK21vZHVsZV9leGl0KGFkNzgxNl9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRjL2FkNzg4Ny5oIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvYWQ3ODg3LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGMyYTIxOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRjL2FkNzg4Ny5oCkBAIC0wLDAgKzEsMTA1IEBACisvKgorICogQUQ3ODg3IFNQSSBBREMgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IDIwMTAgQW5hbG9nIERldmljZXMgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KKyAqLworI2lmbmRlZiBJSU9fQURDX0FENzg4N19IXworI2RlZmluZSBJSU9fQURDX0FENzg4N19IXworCisjZGVmaW5lIEFENzg4N19SRUZfRElTCQkoMSA8PCA1KSAvKiBvbi1jaGlwIHJlZmVyZW5jZSBkaXNhYmxlICovCisjZGVmaW5lIEFENzg4N19EVUFMCQkoMSA8PCA0KSAvKiBkdWFsLWNoYW5uZWwgbW9kZSAqLworI2RlZmluZSBBRDc4ODdfQ0hfQUlOMQkJKDEgPDwgMykgLyogY29udmVydCBvbiBjaGFubmVsIDEsIERVQUw9MSAqLworI2RlZmluZSBBRDc4ODdfQ0hfQUlOMAkJKDAgPDwgMykgLyogY29udmVydCBvbiBjaGFubmVsIDAsIERVQUw9MCwxICovCisjZGVmaW5lIEFENzg4N19QTV9NT0RFMQkJKDApCSAvKiBDUyBiYXNlZCBzaHV0ZG93biAqLworI2RlZmluZSBBRDc4ODdfUE1fTU9ERTIJCSgxKQkgLyogZnVsbCBvbiAqLworI2RlZmluZSBBRDc4ODdfUE1fTU9ERTMJCSgyKQkgLyogYXV0byBzaHV0ZG93biBhZnRlciBjb252ZXJzaW9uICovCisjZGVmaW5lIEFENzg4N19QTV9NT0RFNAkJKDMpCSAvKiBzdGFuZGJ5IG1vZGUgKi8KKworZW51bSBhZDc4ODdfY2hhbm5lbHMgeworCUFENzg4N19DSDAsCisJQUQ3ODg3X0NIMF9DSDEsCisJQUQ3ODg3X0NIMSwKK307CisKKyNkZWZpbmUgUkVTX01BU0soYml0cykJKCgxIDw8IChiaXRzKSkgLSAxKSAvKiBUT0RPOiBtb3ZlIHRoaXMgaW50byBhIGNvbW1vbiBoZWFkZXIgKi8KKworLyoKKyAqIFRPRE86IHN0cnVjdCBhZDc4ODdfcGxhdGZvcm1fZGF0YSBuZWVkcyB0byBnbyBpbnRvIGluY2x1ZGUvbGludXgvaWlvCisgKi8KKworc3RydWN0IGFkNzg4N19wbGF0Zm9ybV9kYXRhIHsKKwkvKiBFeHRlcm5hbCBWcmVmIHZvbHRhZ2UgYXBwbGllZCAqLworCXUxNgkJCQl2cmVmX212OworCS8qCisJICogQUQ3ODg3OgorCSAqIEluIHNpbmdsZSBjaGFubmVsIG1vZGUgZW5fZHVhbCA9IGZsYXNlLCBBSU4xL1ZyZWYgcGlucyBhc3N1bWVzIGl0cworCSAqIFZyZWYgZnVuY3Rpb24uIEluIGR1YWwgY2hhbm5lbCBtb2RlIGVuX2R1YWwgPSB0cnVlLCBBSU4xIGJlY29tZXMgdGhlCisJICogc2Vjb25kIGlucHV0IGNoYW5uZWwsIGFuZCBWcmVmIGlzIGludGVybmFsbHkgY29ubmVjdGVkIHRvIFZkZC4KKwkgKi8KKwlib29sCQkJCWVuX2R1YWw7CisJLyoKKwkgKiBBRDc4ODc6CisJICogdXNlX29uY2hpcF9yZWYgPSB0cnVlLCB0aGUgVnJlZiBpcyBpbnRlcm5hbGx5IGNvbm5lY3RlZCB0byB0aGUgMi41MDBWCisJICogVm9sdGFnZSByZWZlcmVuY2UuIElmIHVzZV9vbmNoaXBfcmVmID0gZmFsc2UsIHRoZSByZWZlcmVuY2Ugdm9sdGFnZQorCSAqIGlzIHN1cHBsaWVkIGJ5IEFJTjEvVnJlZgorCSAqLworCWJvb2wJCQkJdXNlX29uY2hpcF9yZWY7Cit9OworCitzdHJ1Y3QgYWQ3ODg3X2NoaXBfaW5mbyB7CisJdTgJCQkJYml0czsJCS8qIG51bWJlciBvZiBBREMgYml0cyAqLworCXU4CQkJCXN0b3JhZ2ViaXRzOwkvKiBudW1iZXIgb2YgYml0cyByZWFkIGZyb20gdGhlIEFEQyAqLworCXU4CQkJCWxlZnRfc2hpZnQ7CS8qIG51bWJlciBvZiBiaXRzIHRoZSBzYW1wbGUgbXVzdCBiZSBzaGlmdGVkICovCisJY2hhcgkJCQlzaWduOwkJLyogW3NdaWduZWQgb3IgW3VdbnNpZ25lZCAqLworCXUxNgkJCQlpbnRfdnJlZl9tdjsJLyogaW50ZXJuYWwgcmVmZXJlbmNlIHZvbHRhZ2UgKi8KK307CisKK3N0cnVjdCBhZDc4ODdfc3RhdGUgeworCXN0cnVjdCBpaW9fZGV2CQkJKmluZGlvX2RldjsKKwlzdHJ1Y3Qgc3BpX2RldmljZQkJKnNwaTsKKwljb25zdCBzdHJ1Y3QgYWQ3ODg3X2NoaXBfaW5mbwkqY2hpcF9pbmZvOworCXN0cnVjdCByZWd1bGF0b3IJCSpyZWc7CisJc3RydWN0IHdvcmtfc3RydWN0CQlwb2xsX3dvcms7CisJYXRvbWljX3QJCQlwcm90ZWN0X3Jpbmc7CisJdTE2CQkJCWludF92cmVmX212OworCWJvb2wJCQkJZW5fZHVhbDsKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyCQl4ZmVyWzRdOworCXN0cnVjdCBzcGlfbWVzc2FnZQkJbXNnWzNdOworCXN0cnVjdCBzcGlfbWVzc2FnZQkJKnJpbmdfbXNnOworCXVuc2lnbmVkIGNoYXIJCQl0eF9jbWRfYnVmWzhdOworCisJLyoKKwkgKiBETUEgKHRodXMgY2FjaGUgY29oZXJlbmN5IG1haW50ZW5hbmNlKSByZXF1aXJlcyB0aGUKKwkgKiB0cmFuc2ZlciBidWZmZXJzIHRvIGxpdmUgaW4gdGhlaXIgb3duIGNhY2hlIGxpbmVzLgorCSAqLworCisJdW5zaWduZWQgY2hhcgkJCWRhdGFbNF0gX19fX2NhY2hlbGluZV9hbGlnbmVkOworfTsKKworZW51bSBhZDc4ODdfc3VwcG9ydGVkX2RldmljZV9pZHMgeworCUlEX0FENzg4NworfTsKKworI2lmZGVmIENPTkZJR19JSU9fUklOR19CVUZGRVIKK2ludCBhZDc4ODdfc2Nhbl9mcm9tX3Jpbmcoc3RydWN0IGFkNzg4N19zdGF0ZSAqc3QsIGxvbmcgbWFzayk7CitpbnQgYWQ3ODg3X3JlZ2lzdGVyX3JpbmdfZnVuY3NfYW5kX2luaXQoc3RydWN0IGlpb19kZXYgKmluZGlvX2Rldik7Cit2b2lkIGFkNzg4N19yaW5nX2NsZWFudXAoc3RydWN0IGlpb19kZXYgKmluZGlvX2Rldik7CisjZWxzZSAvKiBDT05GSUdfSUlPX1JJTkdfQlVGRkVSICovCitzdGF0aWMgaW5saW5lIGludCBhZDc4ODdfc2Nhbl9mcm9tX3Jpbmcoc3RydWN0IGFkNzg4N19zdGF0ZSAqc3QsIGxvbmcgbWFzaykKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQKK2FkNzg4N19yZWdpc3Rlcl9yaW5nX2Z1bmNzX2FuZF9pbml0KHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhZDc4ODdfcmluZ19jbGVhbnVwKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCit7Cit9CisjZW5kaWYgLyogQ09ORklHX0lJT19SSU5HX0JVRkZFUiAqLworI2VuZGlmIC8qIElJT19BRENfQUQ3ODg3X0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9hZDc4ODdfY29yZS5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvYWQ3ODg3X2NvcmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODU5MDg5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvYWQ3ODg3X2NvcmUuYwpAQCAtMCwwICsxLDMwNSBAQAorLyoKKyAqIEFENzg4NyBTUEkgQURDIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAyMDEwIEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNmcy5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CisjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL2NvbnN1bWVyLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisKKyNpbmNsdWRlICIuLi9paW8uaCIKKyNpbmNsdWRlICIuLi9zeXNmcy5oIgorI2luY2x1ZGUgIi4uL3JpbmdfZ2VuZXJpYy5oIgorI2luY2x1ZGUgImFkYy5oIgorCisjaW5jbHVkZSAiYWQ3ODg3LmgiCisKK3N0YXRpYyBpbnQgYWQ3ODg3X3NjYW5fZGlyZWN0KHN0cnVjdCBhZDc4ODdfc3RhdGUgKnN0LCB1bnNpZ25lZCBjaCkKK3sKKwlpbnQgcmV0ID0gc3BpX3N5bmMoc3QtPnNwaSwgJnN0LT5tc2dbY2hdKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIChzdC0+ZGF0YVsoY2ggKiAyKV0gPDwgOCkgfCBzdC0+ZGF0YVsoY2ggKiAyKSArIDFdOworfQorCitzdGF0aWMgc3NpemVfdCBhZDc4ODdfc2NhbihzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICAgY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDc4ODdfc3RhdGUgKnN0ID0gZGV2X2luZm8tPmRldl9kYXRhOworCXN0cnVjdCBpaW9fZGV2X2F0dHIgKnRoaXNfYXR0ciA9IHRvX2lpb19kZXZfYXR0cihhdHRyKTsKKwlpbnQgcmV0OworCisJbXV0ZXhfbG9jaygmZGV2X2luZm8tPm1sb2NrKTsKKwlpZiAoaWlvX3JpbmdfZW5hYmxlZChkZXZfaW5mbykpCisJCXJldCA9IGFkNzg4N19zY2FuX2Zyb21fcmluZyhzdCwgMSA8PCB0aGlzX2F0dHItPmFkZHJlc3MpOworCWVsc2UKKwkJcmV0ID0gYWQ3ODg3X3NjYW5fZGlyZWN0KHN0LCB0aGlzX2F0dHItPmFkZHJlc3MpOworCW11dGV4X3VubG9jaygmZGV2X2luZm8tPm1sb2NrKTsKKworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIChyZXQgPj4gc3QtPmNoaXBfaW5mby0+bGVmdF9zaGlmdCkgJgorCQkgICAgICAgUkVTX01BU0soc3QtPmNoaXBfaW5mby0+Yml0cykpOworfQorc3RhdGljIElJT19ERVZfQVRUUl9JTl9SQVcoMCwgYWQ3ODg3X3NjYW4sIDApOworc3RhdGljIElJT19ERVZfQVRUUl9JTl9SQVcoMSwgYWQ3ODg3X3NjYW4sIDEpOworCitzdGF0aWMgc3NpemVfdCBhZDc4ODdfc2hvd19zY2FsZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJY2hhciAqYnVmKQoreworCS8qIERyaXZlciBjdXJyZW50bHkgb25seSBzdXBwb3J0IGludGVybmFsIHZyZWYgKi8KKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ3ODg3X3N0YXRlICpzdCA9IGlpb19kZXZfZ2V0X2RldmRhdGEoZGV2X2luZm8pOworCS8qIENvcnJlc3BvbmRzIHRvIFZyZWYgLyAyXihiaXRzKSAqLworCXVuc2lnbmVkIGludCBzY2FsZV91diA9IChzdC0+aW50X3ZyZWZfbXYgKiAxMDAwKSA+PiBzdC0+Y2hpcF9pbmZvLT5iaXRzOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWQuJWRcbiIsIHNjYWxlX3V2IC8gMTAwMCwgc2NhbGVfdXYgJSAxMDAwKTsKK30KK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIoaW5fc2NhbGUsIFNfSVJVR08sIGFkNzg4N19zaG93X3NjYWxlLCBOVUxMLCAwKTsKKworc3RhdGljIHNzaXplX3QgYWQ3ODg3X3Nob3dfbmFtZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCSBjaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkNzg4N19zdGF0ZSAqc3QgPSBpaW9fZGV2X2dldF9kZXZkYXRhKGRldl9pbmZvKTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVzXG4iLCBzcGlfZ2V0X2RldmljZV9pZChzdC0+c3BpKS0+bmFtZSk7Cit9CitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKG5hbWUsIFNfSVJVR08sIGFkNzg4N19zaG93X25hbWUsIE5VTEwsIDApOworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqYWQ3ODg3X2F0dHJpYnV0ZXNbXSA9IHsKKwkmaWlvX2Rldl9hdHRyX2luMF9yYXcuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2luMV9yYXcuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2luX3NjYWxlLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9uYW1lLmRldl9hdHRyLmF0dHIsCisJTlVMTCwKK307CisKK3N0YXRpYyBtb2RlX3QgYWQ3ODg3X2F0dHJfaXNfdmlzaWJsZShzdHJ1Y3Qga29iamVjdCAqa29iaiwKKwkJCQkgICAgIHN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIsIGludCBuKQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGNvbnRhaW5lcl9vZihrb2JqLCBzdHJ1Y3QgZGV2aWNlLCBrb2JqKTsKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ3ODg3X3N0YXRlICpzdCA9IGlpb19kZXZfZ2V0X2RldmRhdGEoZGV2X2luZm8pOworCisJbW9kZV90IG1vZGUgPSBhdHRyLT5tb2RlOworCisJaWYgKChhdHRyID09ICZpaW9fZGV2X2F0dHJfaW4xX3Jhdy5kZXZfYXR0ci5hdHRyKSAmJiAhc3QtPmVuX2R1YWwpCisJCQltb2RlID0gMDsKKworCXJldHVybiBtb2RlOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBhZDc4ODdfYXR0cmlidXRlX2dyb3VwID0geworCS5hdHRycyA9IGFkNzg4N19hdHRyaWJ1dGVzLAorCS5pc192aXNpYmxlID0gYWQ3ODg3X2F0dHJfaXNfdmlzaWJsZSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYWQ3ODg3X2NoaXBfaW5mbyBhZDc4ODdfY2hpcF9pbmZvX3RibFtdID0geworCS8qCisJICogTW9yZSBkZXZpY2VzIGFkZGVkIGluIGZ1dHVyZQorCSAqLworCVtJRF9BRDc4ODddID0geworCQkuYml0cyA9IDEyLAorCQkuc3RvcmFnZWJpdHMgPSAxNiwKKwkJLmxlZnRfc2hpZnQgPSAwLAorCQkuc2lnbiA9IElJT19TQ0FOX0VMX1RZUEVfVU5TSUdORUQsCisJCS5pbnRfdnJlZl9tdiA9IDI1MDAsCisJfSwKK307CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGFkNzg4N19wcm9iZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCXN0cnVjdCBhZDc4ODdfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBzcGktPmRldi5wbGF0Zm9ybV9kYXRhOworCXN0cnVjdCBhZDc4ODdfc3RhdGUgKnN0OworCWludCByZXQsIHZvbHRhZ2VfdXYgPSAwOworCisJc3QgPSBremFsbG9jKHNpemVvZigqc3QpLCBHRlBfS0VSTkVMKTsKKwlpZiAoc3QgPT0gTlVMTCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycm9yX3JldDsKKwl9CisKKwlzdC0+cmVnID0gcmVndWxhdG9yX2dldCgmc3BpLT5kZXYsICJ2Y2MiKTsKKwlpZiAoIUlTX0VSUihzdC0+cmVnKSkgeworCQlyZXQgPSByZWd1bGF0b3JfZW5hYmxlKHN0LT5yZWcpOworCQlpZiAocmV0KQorCQkJZ290byBlcnJvcl9wdXRfcmVnOworCisJCXZvbHRhZ2VfdXYgPSByZWd1bGF0b3JfZ2V0X3ZvbHRhZ2Uoc3QtPnJlZyk7CisJfQorCisJc3QtPmNoaXBfaW5mbyA9CisJCSZhZDc4ODdfY2hpcF9pbmZvX3RibFtzcGlfZ2V0X2RldmljZV9pZChzcGkpLT5kcml2ZXJfZGF0YV07CisKKwlzcGlfc2V0X2RydmRhdGEoc3BpLCBzdCk7CisKKwlhdG9taWNfc2V0KCZzdC0+cHJvdGVjdF9yaW5nLCAwKTsKKwlzdC0+c3BpID0gc3BpOworCisJc3QtPmluZGlvX2RldiA9IGlpb19hbGxvY2F0ZV9kZXZpY2UoKTsKKwlpZiAoc3QtPmluZGlvX2RldiA9PSBOVUxMKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3JfZGlzYWJsZV9yZWc7CisJfQorCisJLyogRXN0YWJpbGlzaCB0aGF0IHRoZSBpaW9fZGV2IGlzIGEgY2hpbGQgb2YgdGhlIHNwaSBkZXZpY2UgKi8KKwlzdC0+aW5kaW9fZGV2LT5kZXYucGFyZW50ID0gJnNwaS0+ZGV2OworCXN0LT5pbmRpb19kZXYtPmF0dHJzID0gJmFkNzg4N19hdHRyaWJ1dGVfZ3JvdXA7CisJc3QtPmluZGlvX2Rldi0+ZGV2X2RhdGEgPSAodm9pZCAqKShzdCk7CisJc3QtPmluZGlvX2Rldi0+ZHJpdmVyX21vZHVsZSA9IFRISVNfTU9EVUxFOworCXN0LT5pbmRpb19kZXYtPm1vZGVzID0gSU5ESU9fRElSRUNUX01PREU7CisKKwkvKiBTZXR1cCBkZWZhdWx0IG1lc3NhZ2UgKi8KKworCXN0LT50eF9jbWRfYnVmWzBdID0gQUQ3ODg3X0NIX0FJTjAgfCBBRDc4ODdfUE1fTU9ERTQgfAorCQkJICAgICgocGRhdGEgJiYgcGRhdGEtPnVzZV9vbmNoaXBfcmVmKSA/CisJCQkgICAgMCA6IEFENzg4N19SRUZfRElTKTsKKworCXN0LT54ZmVyWzBdLnJ4X2J1ZiA9ICZzdC0+ZGF0YVswXTsKKwlzdC0+eGZlclswXS50eF9idWYgPSAmc3QtPnR4X2NtZF9idWZbMF07CisJc3QtPnhmZXJbMF0ubGVuID0gMjsKKworCXNwaV9tZXNzYWdlX2luaXQoJnN0LT5tc2dbQUQ3ODg3X0NIMF0pOworCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZzdC0+eGZlclswXSwgJnN0LT5tc2dbQUQ3ODg3X0NIMF0pOworCisJaWYgKHBkYXRhICYmIHBkYXRhLT5lbl9kdWFsKSB7CisJCXN0LT50eF9jbWRfYnVmWzBdIHw9IEFENzg4N19EVUFMIHwgQUQ3ODg3X1JFRl9ESVM7CisKKwkJc3QtPnR4X2NtZF9idWZbMl0gPSBBRDc4ODdfQ0hfQUlOMSB8IEFENzg4N19EVUFMIHwKKwkJCQkgICAgQUQ3ODg3X1JFRl9ESVMgfCBBRDc4ODdfUE1fTU9ERTQ7CisJCXN0LT50eF9jbWRfYnVmWzRdID0gQUQ3ODg3X0NIX0FJTjAgfCBBRDc4ODdfRFVBTCB8CisJCQkJICAgIEFENzg4N19SRUZfRElTIHwgQUQ3ODg3X1BNX01PREU0OworCQlzdC0+dHhfY21kX2J1Zls2XSA9IEFENzg4N19DSF9BSU4xIHwgQUQ3ODg3X0RVQUwgfAorCQkJCSAgICBBRDc4ODdfUkVGX0RJUyB8IEFENzg4N19QTV9NT0RFNDsKKworCQlzdC0+eGZlclsxXS5yeF9idWYgPSAmc3QtPmRhdGFbMF07CisJCXN0LT54ZmVyWzFdLnR4X2J1ZiA9ICZzdC0+dHhfY21kX2J1ZlsyXTsKKwkJc3QtPnhmZXJbMV0ubGVuID0gMjsKKworCQlzdC0+eGZlclsyXS5yeF9idWYgPSAmc3QtPmRhdGFbMl07CisJCXN0LT54ZmVyWzJdLnR4X2J1ZiA9ICZzdC0+dHhfY21kX2J1Zls0XTsKKwkJc3QtPnhmZXJbMl0ubGVuID0gMjsKKworCQlzcGlfbWVzc2FnZV9pbml0KCZzdC0+bXNnW0FENzg4N19DSDBfQ0gxXSk7CisJCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZzdC0+eGZlclsxXSwgJnN0LT5tc2dbQUQ3ODg3X0NIMF9DSDFdKTsKKwkJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnN0LT54ZmVyWzJdLCAmc3QtPm1zZ1tBRDc4ODdfQ0gwX0NIMV0pOworCisJCXN0LT54ZmVyWzNdLnJ4X2J1ZiA9ICZzdC0+ZGF0YVswXTsKKwkJc3QtPnhmZXJbM10udHhfYnVmID0gJnN0LT50eF9jbWRfYnVmWzZdOworCQlzdC0+eGZlclszXS5sZW4gPSAyOworCisJCXNwaV9tZXNzYWdlX2luaXQoJnN0LT5tc2dbQUQ3ODg3X0NIMV0pOworCQlzcGlfbWVzc2FnZV9hZGRfdGFpbCgmc3QtPnhmZXJbM10sICZzdC0+bXNnW0FENzg4N19DSDFdKTsKKworCQlzdC0+ZW5fZHVhbCA9IHRydWU7CisKKwkJaWYgKHBkYXRhICYmIHBkYXRhLT52cmVmX212KQorCQkJc3QtPmludF92cmVmX212ID0gcGRhdGEtPnZyZWZfbXY7CisJCWVsc2UgaWYgKHZvbHRhZ2VfdXYpCisJCQlzdC0+aW50X3ZyZWZfbXYgPSB2b2x0YWdlX3V2IC8gMTAwMDsKKwkJZWxzZQorCQkJZGV2X3dhcm4oJnNwaS0+ZGV2LCAicmVmZXJlbmNlIHZvbHRhZ2UgdW5zcGVjaWZpZWRcbiIpOworCisJfSBlbHNlIHsKKwkJaWYgKHBkYXRhICYmIHBkYXRhLT52cmVmX212KQorCQkJc3QtPmludF92cmVmX212ID0gcGRhdGEtPnZyZWZfbXY7CisJCWVsc2UgaWYgKHBkYXRhICYmIHBkYXRhLT51c2Vfb25jaGlwX3JlZikKKwkJCXN0LT5pbnRfdnJlZl9tdiA9IHN0LT5jaGlwX2luZm8tPmludF92cmVmX212OworCQllbHNlCisJCQlkZXZfd2Fybigmc3BpLT5kZXYsICJyZWZlcmVuY2Ugdm9sdGFnZSB1bnNwZWNpZmllZFxuIik7CisJfQorCisKKwlyZXQgPSBhZDc4ODdfcmVnaXN0ZXJfcmluZ19mdW5jc19hbmRfaW5pdChzdC0+aW5kaW9fZGV2KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX2ZyZWVfZGV2aWNlOworCisJcmV0ID0gaWlvX2RldmljZV9yZWdpc3RlcihzdC0+aW5kaW9fZGV2KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX2ZyZWVfZGV2aWNlOworCisJcmV0ID0gaWlvX3JpbmdfYnVmZmVyX3JlZ2lzdGVyKHN0LT5pbmRpb19kZXYtPnJpbmcsIDApOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfY2xlYW51cF9yaW5nOworCXJldHVybiAwOworCitlcnJvcl9jbGVhbnVwX3Jpbmc6CisJYWQ3ODg3X3JpbmdfY2xlYW51cChzdC0+aW5kaW9fZGV2KTsKKwlpaW9fZGV2aWNlX3VucmVnaXN0ZXIoc3QtPmluZGlvX2Rldik7CitlcnJvcl9mcmVlX2RldmljZToKKwlpaW9fZnJlZV9kZXZpY2Uoc3QtPmluZGlvX2Rldik7CitlcnJvcl9kaXNhYmxlX3JlZzoKKwlpZiAoIUlTX0VSUihzdC0+cmVnKSkKKwkJcmVndWxhdG9yX2Rpc2FibGUoc3QtPnJlZyk7CitlcnJvcl9wdXRfcmVnOgorCWlmICghSVNfRVJSKHN0LT5yZWcpKQorCQlyZWd1bGF0b3JfcHV0KHN0LT5yZWcpOworCWtmcmVlKHN0KTsKK2Vycm9yX3JldDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFkNzg4N19yZW1vdmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlzdHJ1Y3QgYWQ3ODg3X3N0YXRlICpzdCA9IHNwaV9nZXRfZHJ2ZGF0YShzcGkpOworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBzdC0+aW5kaW9fZGV2OworCWlpb19yaW5nX2J1ZmZlcl91bnJlZ2lzdGVyKGluZGlvX2Rldi0+cmluZyk7CisJYWQ3ODg3X3JpbmdfY2xlYW51cChpbmRpb19kZXYpOworCWlpb19kZXZpY2VfdW5yZWdpc3RlcihpbmRpb19kZXYpOworCWlmICghSVNfRVJSKHN0LT5yZWcpKSB7CisJCXJlZ3VsYXRvcl9kaXNhYmxlKHN0LT5yZWcpOworCQlyZWd1bGF0b3JfcHV0KHN0LT5yZWcpOworCX0KKwlrZnJlZShzdCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc3BpX2RldmljZV9pZCBhZDc4ODdfaWRbXSA9IHsKKwl7ImFkNzg4NyIsIElEX0FENzg4N30sCisJe30KK307CisKK3N0YXRpYyBzdHJ1Y3Qgc3BpX2RyaXZlciBhZDc4ODdfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lCT0gImFkNzg4NyIsCisJCS5idXMJPSAmc3BpX2J1c190eXBlLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwl9LAorCS5wcm9iZQkJPSBhZDc4ODdfcHJvYmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChhZDc4ODdfcmVtb3ZlKSwKKwkuaWRfdGFibGUJPSBhZDc4ODdfaWQsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBhZDc4ODdfaW5pdCh2b2lkKQoreworCXJldHVybiBzcGlfcmVnaXN0ZXJfZHJpdmVyKCZhZDc4ODdfZHJpdmVyKTsKK30KK21vZHVsZV9pbml0KGFkNzg4N19pbml0KTsKKworc3RhdGljIHZvaWQgX19leGl0IGFkNzg4N19leGl0KHZvaWQpCit7CisJc3BpX3VucmVnaXN0ZXJfZHJpdmVyKCZhZDc4ODdfZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KGFkNzg4N19leGl0KTsKKworTU9EVUxFX0FVVEhPUigiTWljaGFlbCBIZW5uZXJpY2ggPGhlbm5lcmljaEBibGFja2Zpbi51Y2xpbnV4Lm9yZz4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiQW5hbG9nIERldmljZXMgQUQ3ODg3IEFEQyIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOworTU9EVUxFX0FMSUFTKCJzcGk6YWQ3ODg3Iik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9hZDc4ODdfcmluZy5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvYWQ3ODg3X3JpbmcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjljYjFmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvYWQ3ODg3X3JpbmcuYwpAQCAtMCwwICsxLDI2NiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDEwIEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAwOCBKb25hdGhhbiBDYW1lcm9uCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgorICoKKyAqIGFkNzg4N19yaW5nLmMKKyAqLworCisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNmcy5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CisKKyNpbmNsdWRlICIuLi9paW8uaCIKKyNpbmNsdWRlICIuLi9yaW5nX2dlbmVyaWMuaCIKKyNpbmNsdWRlICIuLi9yaW5nX3N3LmgiCisjaW5jbHVkZSAiLi4vdHJpZ2dlci5oIgorI2luY2x1ZGUgIi4uL3N5c2ZzLmgiCisKKyNpbmNsdWRlICJhZDc4ODcuaCIKKworc3RhdGljIElJT19TQ0FOX0VMX0MoaW4wLCAwLCAwLCBOVUxMKTsKK3N0YXRpYyBJSU9fU0NBTl9FTF9DKGluMSwgMSwgMCwgTlVMTCk7CisKK3N0YXRpYyBzc2l6ZV90IGFkNzg4N19zaG93X3R5cGUoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX3JpbmdfYnVmZmVyICpyaW5nID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IHJpbmctPmluZGlvX2RldjsKKwlzdHJ1Y3QgYWQ3ODg3X3N0YXRlICpzdCA9IGluZGlvX2Rldi0+ZGV2X2RhdGE7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlYyVkLyVkPj4lZFxuIiwgc3QtPmNoaXBfaW5mby0+c2lnbiwKKwkJICAgICAgIHN0LT5jaGlwX2luZm8tPmJpdHMsIHN0LT5jaGlwX2luZm8tPnN0b3JhZ2ViaXRzLAorCQkgICAgICAgc3QtPmNoaXBfaW5mby0+bGVmdF9zaGlmdCk7Cit9CitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKGluX3R5cGUsIFNfSVJVR08sIGFkNzg4N19zaG93X3R5cGUsIE5VTEwsIDApOworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqYWQ3ODg3X3NjYW5fZWxfYXR0cnNbXSA9IHsKKwkmaWlvX3NjYW5fZWxfaW4wLmRldl9hdHRyLmF0dHIsCisJJmlpb19jb25zdF9hdHRyX2luMF9pbmRleC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fc2Nhbl9lbF9pbjEuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2NvbnN0X2F0dHJfaW4xX2luZGV4LmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9pbl90eXBlLmRldl9hdHRyLmF0dHIsCisJTlVMTCwKK307CisKK3N0YXRpYyBtb2RlX3QgYWQ3ODg3X3NjYW5fZWxfYXR0cl9pc192aXNpYmxlKHN0cnVjdCBrb2JqZWN0ICprb2JqLAorCQkJCSAgICAgc3RydWN0IGF0dHJpYnV0ZSAqYXR0ciwgaW50IG4pCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBkZXZpY2UsIGtvYmopOworCXN0cnVjdCBpaW9fcmluZ19idWZmZXIgKnJpbmcgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gcmluZy0+aW5kaW9fZGV2OworCXN0cnVjdCBhZDc4ODdfc3RhdGUgKnN0ID0gaW5kaW9fZGV2LT5kZXZfZGF0YTsKKworCW1vZGVfdCBtb2RlID0gYXR0ci0+bW9kZTsKKworCWlmICgoYXR0ciA9PSAmaWlvX3NjYW5fZWxfaW4xLmRldl9hdHRyLmF0dHIpIHx8CisJCShhdHRyID09ICZpaW9fY29uc3RfYXR0cl9pbjFfaW5kZXguZGV2X2F0dHIuYXR0cikpCisJCWlmICghc3QtPmVuX2R1YWwpCisJCQltb2RlID0gMDsKKworCXJldHVybiBtb2RlOworfQorCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBhZDc4ODdfc2Nhbl9lbF9ncm91cCA9IHsKKwkubmFtZSA9ICJzY2FuX2VsZW1lbnRzIiwKKwkuYXR0cnMgPSBhZDc4ODdfc2Nhbl9lbF9hdHRycywKKwkuaXNfdmlzaWJsZSA9IGFkNzg4N19zY2FuX2VsX2F0dHJfaXNfdmlzaWJsZSwKK307CisKK2ludCBhZDc4ODdfc2Nhbl9mcm9tX3Jpbmcoc3RydWN0IGFkNzg4N19zdGF0ZSAqc3QsIGxvbmcgbWFzaykKK3sKKwlzdHJ1Y3QgaWlvX3JpbmdfYnVmZmVyICpyaW5nID0gc3QtPmluZGlvX2Rldi0+cmluZzsKKwlpbnQgY291bnQgPSAwLCByZXQ7CisJdTE2ICpyaW5nX2RhdGE7CisKKwlpZiAoIShyaW5nLT5zY2FuX21hc2sgJiBtYXNrKSkgeworCQlyZXQgPSAtRUJVU1k7CisJCWdvdG8gZXJyb3JfcmV0OworCX0KKworCXJpbmdfZGF0YSA9IGttYWxsb2MocmluZy0+YWNjZXNzLmdldF9ieXRlc19wZXJfZGF0dW0ocmluZyksIEdGUF9LRVJORUwpOworCWlmIChyaW5nX2RhdGEgPT0gTlVMTCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycm9yX3JldDsKKwl9CisJcmV0ID0gcmluZy0+YWNjZXNzLnJlYWRfbGFzdChyaW5nLCAodTggKikgcmluZ19kYXRhKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX2ZyZWVfcmluZ19kYXRhOworCisJLyogZm9yIHNpbmdsZSBjaGFubmVsIHNjYW4gdGhlIHJlc3VsdCBpcyBzdG9yZWQgd2l0aCB6ZXJvIG9mZnNldCAqLworCWlmICgocmluZy0+c2Nhbl9tYXNrID09ICgoMSA8PCAxKSB8ICgxIDw8IDApKSkgJiYgKG1hc2sgPT0gKDEgPDwgMSkpKQorCQljb3VudCA9IDE7CisKKwlyZXQgPSBiZTE2X3RvX2NwdShyaW5nX2RhdGFbY291bnRdKTsKKworZXJyb3JfZnJlZV9yaW5nX2RhdGE6CisJa2ZyZWUocmluZ19kYXRhKTsKK2Vycm9yX3JldDoKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIGFkNzg4N19yaW5nX3ByZWVuYWJsZSgpIHNldHVwIHRoZSBwYXJhbWV0ZXJzIG9mIHRoZSByaW5nIGJlZm9yZSBlbmFibGluZworICoKKyAqIFRoZSBjb21wbGV4IG5hdHVyZSBvZiB0aGUgc2V0dGluZyBvZiB0aGUgbnViZXIgb2YgYnl0ZXMgcGVyIGRhdHVtIGlzIGR1ZQorICogdG8gdGhpcyBkcml2ZXIgY3VycmVudGx5IGVuc3VyaW5nIHRoYXQgdGhlIHRpbWVzdGFtcCBpcyBzdG9yZWQgYXQgYW4gOAorICogYnl0ZSBib3VuZGFyeS4KKyAqKi8KK3N0YXRpYyBpbnQgYWQ3ODg3X3JpbmdfcHJlZW5hYmxlKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCit7CisJc3RydWN0IGFkNzg4N19zdGF0ZSAqc3QgPSBpbmRpb19kZXYtPmRldl9kYXRhOworCXN0cnVjdCBpaW9fcmluZ19idWZmZXIgKnJpbmcgPSBpbmRpb19kZXYtPnJpbmc7CisJc2l6ZV90IGRfc2l6ZTsKKworCWlmIChpbmRpb19kZXYtPnJpbmctPmFjY2Vzcy5zZXRfYnl0ZXNfcGVyX2RhdHVtKSB7CisJCWRfc2l6ZSA9IHN0LT5jaGlwX2luZm8tPnN0b3JhZ2ViaXRzIC8gOCArIHNpemVvZihzNjQpOworCQlpZiAoZF9zaXplICUgOCkKKwkJCWRfc2l6ZSArPSA4IC0gKGRfc2l6ZSAlIDgpOworCQlpbmRpb19kZXYtPnJpbmctPmFjY2Vzcy5zZXRfYnl0ZXNfcGVyX2RhdHVtKGluZGlvX2Rldi0+cmluZywKKwkJCQkJCQkgICAgZF9zaXplKTsKKwl9CisKKwlzd2l0Y2ggKHJpbmctPnNjYW5fbWFzaykgeworCWNhc2UgKDEgPDwgMCk6CisJCXN0LT5yaW5nX21zZyA9ICZzdC0+bXNnW0FENzg4N19DSDBdOworCQlicmVhazsKKwljYXNlICgxIDw8IDEpOgorCQlzdC0+cmluZ19tc2cgPSAmc3QtPm1zZ1tBRDc4ODdfQ0gxXTsKKwkJLyogRHVtbXkgcmVhZDogcHVzaCBDSDEgc2V0dGluZyBkb3duIHRvIGhhcmR3YXJlICovCisJCXNwaV9zeW5jKHN0LT5zcGksIHN0LT5yaW5nX21zZyk7CisJCWJyZWFrOworCWNhc2UgKCgxIDw8IDEpIHwgKDEgPDwgMCkpOgorCQlzdC0+cmluZ19tc2cgPSAmc3QtPm1zZ1tBRDc4ODdfQ0gwX0NIMV07CisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFkNzg4N19yaW5nX3Bvc3RkaXNhYmxlKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCit7CisJc3RydWN0IGFkNzg4N19zdGF0ZSAqc3QgPSBpbmRpb19kZXYtPmRldl9kYXRhOworCisJLyogZHVtbXkgcmVhZDogcmVzdG9yZSBkZWZhdWx0IENIMCBzZXR0aW4gKi8KKwlyZXR1cm4gc3BpX3N5bmMoc3QtPnNwaSwgJnN0LT5tc2dbQUQ3ODg3X0NIMF0pOworfQorCisvKioKKyAqIGFkNzg4N19wb2xsX2Z1bmNfdGgoKSB0aCBvZiB0cmlnZ2VyIGxhdW5jaGVkIHBvbGxpbmcgdG8gcmluZyBidWZmZXIKKyAqCisgKiBBcyBzYW1wbGluZyBvbmx5IG9jY3VycyBvbiBzcGkgY29tbXMgb2NjdXJpbmcsIGxlYXZlIHRpbWVzdGFtcGluZyB1bnRpbAorICogdGhlbi4gIFNvbWUgdHJpZ2dlcnMgd2lsbCBnZW5lcmF0ZSB0aGVpciBvd24gdGltZSBzdGFtcC4gIEN1cnJlbnRseQorICogdGhlcmUgaXMgbm8gd2F5IG9mIG5vdGlmeWluZyB0aGVtIHdoZW4gbm8gb25lIGNhcmVzLgorICoqLworc3RhdGljIHZvaWQgYWQ3ODg3X3BvbGxfZnVuY190aChzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2LCBzNjQgdGltZSkKK3sKKwlzdHJ1Y3QgYWQ3ODg3X3N0YXRlICpzdCA9IGluZGlvX2Rldi0+ZGV2X2RhdGE7CisKKwlzY2hlZHVsZV93b3JrKCZzdC0+cG9sbF93b3JrKTsKKwlyZXR1cm47Cit9CisvKioKKyAqIGFkNzg4N19wb2xsX2JoX3RvX3JpbmcoKSBiaCBvZiB0cmlnZ2VyIGxhdW5jaGVkIHBvbGxpbmcgdG8gcmluZyBidWZmZXIKKyAqIEB3b3JrX3M6CXRoZSB3b3JrIHN0cnVjdCB0aHJvdWdoIHdoaWNoIHRoaXMgd2FzIHNjaGVkdWxlZAorICoKKyAqIEN1cnJlbnRseSB0aGVyZSBpcyBubyBvcHRpb24gaW4gdGhpcyBkcml2ZXIgdG8gZGlzYWJsZSB0aGUgc2F2aW5nIG9mCisgKiB0aW1lc3RhbXBzIHdpdGhpbiB0aGUgcmluZy4KKyAqIEkgdGhpbmsgdGhlIG9uZSBjb3B5IG9mIHRoaXMgYXQgYSB0aW1lIHdhcyB0byBhdm9pZCBwcm9ibGVtcyBpZiB0aGUKKyAqIHRyaWdnZXIgd2FzIHNldCBmYXIgdG9vIGhpZ2ggYW5kIHRoZSByZWFkcyB0aGVuIGxvY2tlZCB1cCB0aGUgY29tcHV0ZXIuCisgKiovCitzdGF0aWMgdm9pZCBhZDc4ODdfcG9sbF9iaF90b19yaW5nKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29ya19zKQoreworCXN0cnVjdCBhZDc4ODdfc3RhdGUgKnN0ID0gY29udGFpbmVyX29mKHdvcmtfcywgc3RydWN0IGFkNzg4N19zdGF0ZSwKKwkJCQkJCSAgcG9sbF93b3JrKTsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gc3QtPmluZGlvX2RldjsKKwlzdHJ1Y3QgaWlvX3N3X3JpbmdfYnVmZmVyICpzd19yaW5nID0gaWlvX3RvX3N3X3JpbmcoaW5kaW9fZGV2LT5yaW5nKTsKKwlzdHJ1Y3QgaWlvX3JpbmdfYnVmZmVyICpyaW5nID0gaW5kaW9fZGV2LT5yaW5nOworCXM2NCB0aW1lX25zOworCV9fdTggKmJ1ZjsKKwlpbnQgYl9zZW50OworCXNpemVfdCBkX3NpemU7CisKKwl1bnNpZ25lZCBpbnQgYnl0ZXMgPSByaW5nLT5zY2FuX2NvdW50ICogc3QtPmNoaXBfaW5mby0+c3RvcmFnZWJpdHMgLyA4OworCisJLyogRW5zdXJlIHRoZSB0aW1lc3RhbXAgaXMgOCBieXRlIGFsaWduZWQgKi8KKwlkX3NpemUgPSBieXRlcyArIHNpemVvZihzNjQpOworCWlmIChkX3NpemUgJSBzaXplb2YoczY0KSkKKwkJZF9zaXplICs9IHNpemVvZihzNjQpIC0gKGRfc2l6ZSAlIHNpemVvZihzNjQpKTsKKworCS8qIEVuc3VyZSBvbmx5IG9uZSBjb3B5IG9mIHRoaXMgZnVuY3Rpb24gcnVubmluZyBhdCBhIHRpbWUgKi8KKwlpZiAoYXRvbWljX2luY19yZXR1cm4oJnN0LT5wcm90ZWN0X3JpbmcpID4gMSkKKwkJcmV0dXJuOworCisJYnVmID0ga3phbGxvYyhkX3NpemUsIEdGUF9LRVJORUwpOworCWlmIChidWYgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJYl9zZW50ID0gc3BpX3N5bmMoc3QtPnNwaSwgc3QtPnJpbmdfbXNnKTsKKwlpZiAoYl9zZW50KQorCQlnb3RvIGRvbmU7CisKKwl0aW1lX25zID0gaWlvX2dldF90aW1lX25zKCk7CisKKwltZW1jcHkoYnVmLCBzdC0+ZGF0YSwgYnl0ZXMpOworCW1lbWNweShidWYgKyBkX3NpemUgLSBzaXplb2YoczY0KSwgJnRpbWVfbnMsIHNpemVvZih0aW1lX25zKSk7CisKKwlpbmRpb19kZXYtPnJpbmctPmFjY2Vzcy5zdG9yZV90bygmc3dfcmluZy0+YnVmLCBidWYsIHRpbWVfbnMpOworZG9uZToKKwlrZnJlZShidWYpOworCWF0b21pY19kZWMoJnN0LT5wcm90ZWN0X3JpbmcpOworfQorCitpbnQgYWQ3ODg3X3JlZ2lzdGVyX3JpbmdfZnVuY3NfYW5kX2luaXQoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKK3sKKwlzdHJ1Y3QgYWQ3ODg3X3N0YXRlICpzdCA9IGluZGlvX2Rldi0+ZGV2X2RhdGE7CisJaW50IHJldDsKKworCWluZGlvX2Rldi0+cmluZyA9IGlpb19zd19yYl9hbGxvY2F0ZShpbmRpb19kZXYpOworCWlmICghaW5kaW9fZGV2LT5yaW5nKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3JfcmV0OworCX0KKwkvKiBFZmZlY3RpdmVseSBzZWxlY3QgdGhlIHJpbmcgYnVmZmVyIGltcGxlbWVudGF0aW9uICovCisJaWlvX3Jpbmdfc3dfcmVnaXN0ZXJfZnVuY3MoJmluZGlvX2Rldi0+cmluZy0+YWNjZXNzKTsKKwlyZXQgPSBpaW9fYWxsb2NfcG9sbGZ1bmMoaW5kaW9fZGV2LCBOVUxMLCAmYWQ3ODg3X3BvbGxfZnVuY190aCk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9kZWFsbG9jYXRlX3N3X3JiOworCisJLyogUmluZyBidWZmZXIgZnVuY3Rpb25zIC0gaGVyZSB0cmlnZ2VyIHNldHVwIHJlbGF0ZWQgKi8KKworCWluZGlvX2Rldi0+cmluZy0+cHJlZW5hYmxlID0gJmFkNzg4N19yaW5nX3ByZWVuYWJsZTsKKwlpbmRpb19kZXYtPnJpbmctPnBvc3RlbmFibGUgPSAmaWlvX3RyaWdnZXJlZF9yaW5nX3Bvc3RlbmFibGU7CisJaW5kaW9fZGV2LT5yaW5nLT5wcmVkaXNhYmxlID0gJmlpb190cmlnZ2VyZWRfcmluZ19wcmVkaXNhYmxlOworCWluZGlvX2Rldi0+cmluZy0+cG9zdGRpc2FibGUgPSAmYWQ3ODg3X3JpbmdfcG9zdGRpc2FibGU7CisJaW5kaW9fZGV2LT5yaW5nLT5zY2FuX2VsX2F0dHJzID0gJmFkNzg4N19zY2FuX2VsX2dyb3VwOworCisJSU5JVF9XT1JLKCZzdC0+cG9sbF93b3JrLCAmYWQ3ODg3X3BvbGxfYmhfdG9fcmluZyk7CisKKwkvKiBGbGFnIHRoYXQgcG9sbGVkIHJpbmcgYnVmZmVyaW5nIGlzIHBvc3NpYmxlICovCisJaW5kaW9fZGV2LT5tb2RlcyB8PSBJTkRJT19SSU5HX1RSSUdHRVJFRDsKKwlyZXR1cm4gMDsKK2Vycm9yX2RlYWxsb2NhdGVfc3dfcmI6CisJaWlvX3N3X3JiX2ZyZWUoaW5kaW9fZGV2LT5yaW5nKTsKK2Vycm9yX3JldDoKKwlyZXR1cm4gcmV0OworfQorCit2b2lkIGFkNzg4N19yaW5nX2NsZWFudXAoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKK3sKKwkvKiBlbnN1cmUgdGhhdCB0aGUgdHJpZ2dlciBoYXMgYmVlbiBkZXRhY2hlZCAqLworCWlmIChpbmRpb19kZXYtPnRyaWcpIHsKKwkJaWlvX3B1dF90cmlnZ2VyKGluZGlvX2Rldi0+dHJpZyk7CisJCWlpb190cmlnZ2VyX2RldHRhY2hfcG9sbF9mdW5jKGluZGlvX2Rldi0+dHJpZywKKwkJCQkJICAgICAgaW5kaW9fZGV2LT5wb2xsZnVuYyk7CisJfQorCWtmcmVlKGluZGlvX2Rldi0+cG9sbGZ1bmMpOworCWlpb19zd19yYl9mcmVlKGluZGlvX2Rldi0+cmluZyk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9hZHQ3MzEwLmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9hZHQ3MzEwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzcxYTQwOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRjL2FkdDczMTAuYwpAQCAtMCwwICsxLDk1MiBAQAorLyoKKyAqIEFEVDczMTAgZGlnaXRhbCB0ZW1wZXJhdHVyZSBzZW5zb3IgZHJpdmVyIHN1cHBvcnRpbmcgQURUNzMxMAorICoKKyAqIENvcHlyaWdodCAyMDEwIEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorI2luY2x1ZGUgPGxpbnV4L3J0Yy5oPgorCisjaW5jbHVkZSAiLi4vaWlvLmgiCisjaW5jbHVkZSAiLi4vc3lzZnMuaCIKKworLyoKKyAqIEFEVDczMTAgcmVnaXN0ZXJzIGRlZmluaXRpb24KKyAqLworCisjZGVmaW5lIEFEVDczMTBfU1RBVFVTCQkJMAorI2RlZmluZSBBRFQ3MzEwX0NPTkZJRwkJCTEKKyNkZWZpbmUgQURUNzMxMF9URU1QRVJBVFVSRQkJMgorI2RlZmluZSBBRFQ3MzEwX0lECQkJMworI2RlZmluZSBBRFQ3MzEwX1RfQ1JJVAkJCTQKKyNkZWZpbmUgQURUNzMxMF9UX0hZU1QJCQk1CisjZGVmaW5lIEFEVDczMTBfVF9BTEFSTV9ISUdICQk2CisjZGVmaW5lIEFEVDczMTBfVF9BTEFSTV9MT1cJCTcKKworLyoKKyAqIEFEVDczMTAgc3RhdHVzCisgKi8KKyNkZWZpbmUgQURUNzMxMF9TVEFUX1RfTE9XCQkweDEwCisjZGVmaW5lIEFEVDczMTBfU1RBVF9UX0hJR0gJCTB4MjAKKyNkZWZpbmUgQURUNzMxMF9TVEFUX1RfQ1JJVAkJMHg0MAorI2RlZmluZSBBRFQ3MzEwX1NUQVRfTk9UX1JEWQkJMHg4MAorCisvKgorICogQURUNzMxMCBjb25maWcKKyAqLworI2RlZmluZSBBRFQ3MzEwX0ZBVUxUX1FVRVVFX01BU0sJMHgzCisjZGVmaW5lIEFEVDczMTBfQ1RfUE9MQVJJVFkJCTB4NAorI2RlZmluZSBBRFQ3MzEwX0lOVF9QT0xBUklUWQkJMHg4CisjZGVmaW5lIEFEVDczMTBfRVZFTlRfTU9ERQkJMHgxMAorI2RlZmluZSBBRFQ3MzEwX01PREVfTUFTSwkJMHg2MAorI2RlZmluZSBBRFQ3MzEwX09ORVNIT1QJCQkweDIwCisjZGVmaW5lIEFEVDczMTBfU1BTCQkJMHg0MAorI2RlZmluZSBBRFQ3MzEwX1BECQkJMHg2MAorI2RlZmluZSBBRFQ3MzEwX1JFU09MVVRJT04JCTB4ODAKKworLyoKKyAqIEFEVDczMTAgbWFza3MKKyAqLworI2RlZmluZSBBRFQ3MzEwX1QxNl9WQUxVRV9TSUdOCQkJMHg4MDAwCisjZGVmaW5lIEFEVDczMTBfVDE2X1ZBTFVFX0ZMT0FUX09GRlNFVAkJNworI2RlZmluZSBBRFQ3MzEwX1QxNl9WQUxVRV9GTE9BVF9NQVNLCQkweDdGCisjZGVmaW5lIEFEVDczMTBfVDEzX1ZBTFVFX1NJR04JCQkweDEwMDAKKyNkZWZpbmUgQURUNzMxMF9UMTNfVkFMVUVfT0ZGU0VUCQkzCisjZGVmaW5lIEFEVDczMTBfVDEzX1ZBTFVFX0ZMT0FUX09GRlNFVAkJNAorI2RlZmluZSBBRFQ3MzEwX1QxM19WQUxVRV9GTE9BVF9NQVNLCQkweEYKKyNkZWZpbmUgQURUNzMxMF9UX0hZU1RfTUFTSwkJCTB4RgorI2RlZmluZSBBRFQ3MzEwX0RFVklDRV9JRF9NQVNLCQkJMHg3CisjZGVmaW5lIEFEVDczMTBfTUFOVUZBQ1RPUllfSURfTUFTSwkJMHhGOAorI2RlZmluZSBBRFQ3MzEwX01BTlVGQUNUT1JZX0lEX09GRlNFVAkJMworCisKKyNkZWZpbmUgQURUNzMxMF9DTURfUkVHX01BU0sJCQkweDI4CisjZGVmaW5lIEFEVDczMTBfQ01EX1JFR19PRkZTRVQJCQkzCisjZGVmaW5lIEFEVDczMTBfQ01EX1JFQUQJCQkweDQwCisjZGVmaW5lIEFEVDczMTBfQ01EX0NPTl9SRUFECQkJMHg0CisKKyNkZWZpbmUgQURUNzMxMF9JUlFTCQkJCTIKKworLyoKKyAqIHN0cnVjdCBhZHQ3MzEwX2NoaXBfaW5mbyAtIGNoaXAgc3BlY2lmYyBpbmZvcm1hdGlvbgorICovCisKK3N0cnVjdCBhZHQ3MzEwX2NoaXBfaW5mbyB7CisJY29uc3QgY2hhciAqbmFtZTsKKwlzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpX2RldjsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2OworCXN0cnVjdCB3b3JrX3N0cnVjdCB0aHJlc2hfd29yazsKKwlzNjQgbGFzdF90aW1lc3RhbXA7CisJdTggIGNvbmZpZzsKK307CisKKy8qCisgKiBhZHQ3MzEwIHJlZ2lzdGVyIGFjY2VzcyBieSBTUEkKKyAqLworCitzdGF0aWMgaW50IGFkdDczMTBfc3BpX3JlYWRfd29yZChzdHJ1Y3QgYWR0NzMxMF9jaGlwX2luZm8gKmNoaXAsIHU4IHJlZywgdTE2ICpkYXRhKQoreworCXN0cnVjdCBzcGlfZGV2aWNlICpzcGlfZGV2ID0gY2hpcC0+c3BpX2RldjsKKwl1OCBjb21tYW5kID0gKHJlZyA8PCBBRFQ3MzEwX0NNRF9SRUdfT0ZGU0VUKSAmIEFEVDczMTBfQ01EX1JFR19NQVNLOworCWludCByZXQgPSAwOworCisJY29tbWFuZCB8PSBBRFQ3MzEwX0NNRF9SRUFEOworCXJldCA9IHNwaV93cml0ZShzcGlfZGV2LCAmY29tbWFuZCwgc2l6ZW9mKGNvbW1hbmQpKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKCZzcGlfZGV2LT5kZXYsICJTUEkgd3JpdGUgY29tbWFuZCBlcnJvclxuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gc3BpX3JlYWQoc3BpX2RldiwgKHU4ICopZGF0YSwgc2l6ZW9mKCpkYXRhKSk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2Vycigmc3BpX2Rldi0+ZGV2LCAiU1BJIHJlYWQgd29yZCBlcnJvclxuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJKmRhdGEgPSBiZTE2X3RvX2NwdSgqZGF0YSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhZHQ3MzEwX3NwaV93cml0ZV93b3JkKHN0cnVjdCBhZHQ3MzEwX2NoaXBfaW5mbyAqY2hpcCwgdTggcmVnLCB1MTYgZGF0YSkKK3sKKwlzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpX2RldiA9IGNoaXAtPnNwaV9kZXY7CisJdTggYnVmWzNdOworCWludCByZXQgPSAwOworCisJYnVmWzBdID0gKHJlZyA8PCBBRFQ3MzEwX0NNRF9SRUdfT0ZGU0VUKSAmIEFEVDczMTBfQ01EX1JFR19NQVNLOworCWJ1ZlsxXSA9ICh1OCkoZGF0YSA+PiA4KTsKKwlidWZbMl0gPSAodTgpKGRhdGEgJiAweEZGKTsKKworCXJldCA9IHNwaV93cml0ZShzcGlfZGV2LCBidWYsIDMpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoJnNwaV9kZXYtPmRldiwgIlNQSSB3cml0ZSB3b3JkIGVycm9yXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFkdDczMTBfc3BpX3JlYWRfYnl0ZShzdHJ1Y3QgYWR0NzMxMF9jaGlwX2luZm8gKmNoaXAsIHU4IHJlZywgdTggKmRhdGEpCit7CisJc3RydWN0IHNwaV9kZXZpY2UgKnNwaV9kZXYgPSBjaGlwLT5zcGlfZGV2OworCXU4IGNvbW1hbmQgPSAocmVnIDw8IEFEVDczMTBfQ01EX1JFR19PRkZTRVQpICYgQURUNzMxMF9DTURfUkVHX01BU0s7CisJaW50IHJldCA9IDA7CisKKwljb21tYW5kIHw9IEFEVDczMTBfQ01EX1JFQUQ7CisJcmV0ID0gc3BpX3dyaXRlKHNwaV9kZXYsICZjb21tYW5kLCBzaXplb2YoY29tbWFuZCkpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoJnNwaV9kZXYtPmRldiwgIlNQSSB3cml0ZSBjb21tYW5kIGVycm9yXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXQgPSBzcGlfcmVhZChzcGlfZGV2LCBkYXRhLCBzaXplb2YoKmRhdGEpKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKCZzcGlfZGV2LT5kZXYsICJTUEkgcmVhZCBieXRlIGVycm9yXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhZHQ3MzEwX3NwaV93cml0ZV9ieXRlKHN0cnVjdCBhZHQ3MzEwX2NoaXBfaW5mbyAqY2hpcCwgdTggcmVnLCB1OCBkYXRhKQoreworCXN0cnVjdCBzcGlfZGV2aWNlICpzcGlfZGV2ID0gY2hpcC0+c3BpX2RldjsKKwl1OCBidWZbMl07CisJaW50IHJldCA9IDA7CisKKwlidWZbMF0gPSAocmVnIDw8IEFEVDczMTBfQ01EX1JFR19PRkZTRVQpICYgQURUNzMxMF9DTURfUkVHX01BU0s7CisJYnVmWzFdID0gZGF0YTsKKworCXJldCA9IHNwaV93cml0ZShzcGlfZGV2LCBidWYsIDIpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoJnNwaV9kZXYtPmRldiwgIlNQSSB3cml0ZSBieXRlIGVycm9yXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3NpemVfdCBhZHQ3MzEwX3Nob3dfbW9kZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkdDczMTBfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCXU4IGNvbmZpZzsKKworCWNvbmZpZyA9IGNoaXAtPmNvbmZpZyAmIEFEVDczMTBfTU9ERV9NQVNLOworCisJc3dpdGNoIChjb25maWcpIHsKKwljYXNlIEFEVDczMTBfUEQ6CisJCXJldHVybiBzcHJpbnRmKGJ1ZiwgInBvd2VyLWRvd25cbiIpOworCWNhc2UgQURUNzMxMF9PTkVTSE9UOgorCQlyZXR1cm4gc3ByaW50ZihidWYsICJvbmUtc2hvdFxuIik7CisJY2FzZSBBRFQ3MzEwX1NQUzoKKwkJcmV0dXJuIHNwcmludGYoYnVmLCAic3BzXG4iKTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gc3ByaW50ZihidWYsICJmdWxsXG4iKTsKKwl9Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkdDczMTBfc3RvcmVfbW9kZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBsZW4pCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkdDczMTBfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCXUxNiBjb25maWc7CisJaW50IHJldDsKKworCXJldCA9IGFkdDczMTBfc3BpX3JlYWRfYnl0ZShjaGlwLCBBRFQ3MzEwX0NPTkZJRywgJmNoaXAtPmNvbmZpZyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIC1FSU87CisKKwljb25maWcgPSBjaGlwLT5jb25maWcgJiAofkFEVDczMTBfTU9ERV9NQVNLKTsKKwlpZiAoc3RyY21wKGJ1ZiwgInBvd2VyLWRvd24iKSkKKwkJY29uZmlnIHw9IEFEVDczMTBfUEQ7CisJZWxzZSBpZiAoc3RyY21wKGJ1ZiwgIm9uZS1zaG90IikpCisJCWNvbmZpZyB8PSBBRFQ3MzEwX09ORVNIT1Q7CisJZWxzZSBpZiAoc3RyY21wKGJ1ZiwgInNwcyIpKQorCQljb25maWcgfD0gQURUNzMxMF9TUFM7CisKKwlyZXQgPSBhZHQ3MzEwX3NwaV93cml0ZV9ieXRlKGNoaXAsIEFEVDczMTBfQ09ORklHLCBjb25maWcpOworCWlmIChyZXQpCisJCXJldHVybiAtRUlPOworCisJY2hpcC0+Y29uZmlnID0gY29uZmlnOworCisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIElJT19ERVZJQ0VfQVRUUihtb2RlLCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJYWR0NzMxMF9zaG93X21vZGUsCisJCWFkdDczMTBfc3RvcmVfbW9kZSwKKwkJMCk7CisKK3N0YXRpYyBzc2l6ZV90IGFkdDczMTBfc2hvd19hdmFpbGFibGVfbW9kZXMoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXJldHVybiBzcHJpbnRmKGJ1ZiwgImZ1bGxcbm9uZS1zaG90XG5zcHNcbnBvd2VyLWRvd25cbiIpOworfQorCitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKGF2YWlsYWJsZV9tb2RlcywgU19JUlVHTywgYWR0NzMxMF9zaG93X2F2YWlsYWJsZV9tb2RlcywgTlVMTCwgMCk7CisKK3N0YXRpYyBzc2l6ZV90IGFkdDczMTBfc2hvd19yZXNvbHV0aW9uKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWR0NzMxMF9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisJaW50IHJldDsKKwlpbnQgYml0czsKKworCXJldCA9IGFkdDczMTBfc3BpX3JlYWRfYnl0ZShjaGlwLCBBRFQ3MzEwX0NPTkZJRywgJmNoaXAtPmNvbmZpZyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIC1FSU87CisKKwlpZiAoY2hpcC0+Y29uZmlnICYgQURUNzMxMF9SRVNPTFVUSU9OKQorCQliaXRzID0gMTY7CisJZWxzZQorCQliaXRzID0gMTM7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZCBiaXRzXG4iLCBiaXRzKTsKK30KKworc3RhdGljIHNzaXplX3QgYWR0NzMxMF9zdG9yZV9yZXNvbHV0aW9uKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWR0NzMxMF9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisJdW5zaWduZWQgbG9uZyBkYXRhOworCXUxNiBjb25maWc7CisJaW50IHJldDsKKworCXJldCA9IHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMTAsICZkYXRhKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldCA9IGFkdDczMTBfc3BpX3JlYWRfYnl0ZShjaGlwLCBBRFQ3MzEwX0NPTkZJRywgJmNoaXAtPmNvbmZpZyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIC1FSU87CisKKwljb25maWcgPSBjaGlwLT5jb25maWcgJiAofkFEVDczMTBfUkVTT0xVVElPTik7CisJaWYgKGRhdGEpCisJCWNvbmZpZyB8PSBBRFQ3MzEwX1JFU09MVVRJT047CisKKwlyZXQgPSBhZHQ3MzEwX3NwaV93cml0ZV9ieXRlKGNoaXAsIEFEVDczMTBfQ09ORklHLCBjb25maWcpOworCWlmIChyZXQpCisJCXJldHVybiAtRUlPOworCisJY2hpcC0+Y29uZmlnID0gY29uZmlnOworCisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIElJT19ERVZJQ0VfQVRUUihyZXNvbHV0aW9uLCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJYWR0NzMxMF9zaG93X3Jlc29sdXRpb24sCisJCWFkdDczMTBfc3RvcmVfcmVzb2x1dGlvbiwKKwkJMCk7CisKK3N0YXRpYyBzc2l6ZV90IGFkdDczMTBfc2hvd19pZChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkdDczMTBfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCXU4IGlkOworCWludCByZXQ7CisKKwlyZXQgPSBhZHQ3MzEwX3NwaV9yZWFkX2J5dGUoY2hpcCwgQURUNzMxMF9JRCwgJmlkKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gLUVJTzsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgImRldmljZSBpZDogMHgleFxubWFudWZhY3RvcnkgaWQ6IDB4JXhcbiIsCisJCQlpZCAmIEFEVDczMTBfREVWSUNFX0lEX01BU0ssCisJCQkoaWQgJiBBRFQ3MzEwX01BTlVGQUNUT1JZX0lEX01BU0spID4+IEFEVDczMTBfTUFOVUZBQ1RPUllfSURfT0ZGU0VUKTsKK30KKworc3RhdGljIElJT19ERVZJQ0VfQVRUUihpZCwgU19JUlVHTyB8IFNfSVdVU1IsCisJCWFkdDczMTBfc2hvd19pZCwKKwkJTlVMTCwKKwkJMCk7CisKK3N0YXRpYyBzc2l6ZV90IGFkdDczMTBfY29udmVydF90ZW1wZXJhdHVyZShzdHJ1Y3QgYWR0NzMxMF9jaGlwX2luZm8gKmNoaXAsCisJCXUxNiBkYXRhLCBjaGFyICpidWYpCit7CisJY2hhciBzaWduID0gJyAnOworCisJaWYgKGNoaXAtPmNvbmZpZyAmIEFEVDczMTBfUkVTT0xVVElPTikgeworCQlpZiAoZGF0YSAmIEFEVDczMTBfVDE2X1ZBTFVFX1NJR04pIHsKKwkJCS8qIGNvbnZlcnQgc3VwcGxlbWVudCB0byBwb3NpdGl2ZSB2YWx1ZSAqLworCQkJZGF0YSA9ICh1MTYpKChBRFQ3MzEwX1QxNl9WQUxVRV9TSUdOIDw8IDEpIC0gKHUzMilkYXRhKTsKKwkJCXNpZ24gPSAnLSc7CisJCX0KKwkJcmV0dXJuIHNwcmludGYoYnVmLCAiJWMlZC4lLjdkXG4iLCBzaWduLAorCQkJCShkYXRhID4+IEFEVDczMTBfVDE2X1ZBTFVFX0ZMT0FUX09GRlNFVCksCisJCQkJKGRhdGEgJiBBRFQ3MzEwX1QxNl9WQUxVRV9GTE9BVF9NQVNLKSAqIDc4MTI1KTsKKwl9IGVsc2UgeworCQlpZiAoZGF0YSAmIEFEVDczMTBfVDEzX1ZBTFVFX1NJR04pIHsKKwkJCS8qIGNvbnZlcnQgc3VwcGxlbWVudCB0byBwb3NpdGl2ZSB2YWx1ZSAqLworCQkJZGF0YSA+Pj0gQURUNzMxMF9UMTNfVkFMVUVfT0ZGU0VUOworCQkJZGF0YSA9IChBRFQ3MzEwX1QxM19WQUxVRV9TSUdOIDw8IDEpIC0gZGF0YTsKKwkJCXNpZ24gPSAnLSc7CisJCX0KKwkJcmV0dXJuIHNwcmludGYoYnVmLCAiJWMlZC4lLjRkXG4iLCBzaWduLAorCQkJCShkYXRhID4+IEFEVDczMTBfVDEzX1ZBTFVFX0ZMT0FUX09GRlNFVCksCisJCQkJKGRhdGEgJiBBRFQ3MzEwX1QxM19WQUxVRV9GTE9BVF9NQVNLKSAqIDYyNSk7CisJfQorfQorCitzdGF0aWMgc3NpemVfdCBhZHQ3MzEwX3Nob3dfdmFsdWUoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZHQ3MzEwX2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKwl1OCBzdGF0dXM7CisJdTE2IGRhdGE7CisJaW50IHJldCwgaSA9IDA7CisKKwlkbyB7CisJCXJldCA9IGFkdDczMTBfc3BpX3JlYWRfYnl0ZShjaGlwLCBBRFQ3MzEwX1NUQVRVUywgJnN0YXR1cyk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gLUVJTzsKKwkJaSsrOworCQlpZiAoaSA9PSAxMDAwMCkKKwkJCXJldHVybiAtRUlPOworCX0gd2hpbGUgKHN0YXR1cyAmIEFEVDczMTBfU1RBVF9OT1RfUkRZKTsKKworCXJldCA9IGFkdDczMTBfc3BpX3JlYWRfd29yZChjaGlwLCBBRFQ3MzEwX1RFTVBFUkFUVVJFLCAmZGF0YSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIC1FSU87CisKKwlyZXR1cm4gYWR0NzMxMF9jb252ZXJ0X3RlbXBlcmF0dXJlKGNoaXAsIGRhdGEsIGJ1Zik7Cit9CisKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIodmFsdWUsIFNfSVJVR08sIGFkdDczMTBfc2hvd192YWx1ZSwgTlVMTCwgMCk7CisKK3N0YXRpYyBzc2l6ZV90IGFkdDczMTBfc2hvd19uYW1lKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWR0NzMxMF9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXNcbiIsIGNoaXAtPm5hbWUpOworfQorCitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKG5hbWUsIFNfSVJVR08sIGFkdDczMTBfc2hvd19uYW1lLCBOVUxMLCAwKTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmFkdDczMTBfYXR0cmlidXRlc1tdID0geworCSZpaW9fZGV2X2F0dHJfYXZhaWxhYmxlX21vZGVzLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9tb2RlLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9yZXNvbHV0aW9uLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9pZC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfdmFsdWUuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX25hbWUuZGV2X2F0dHIuYXR0ciwKKwlOVUxMLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgYWR0NzMxMF9hdHRyaWJ1dGVfZ3JvdXAgPSB7CisJLmF0dHJzID0gYWR0NzMxMF9hdHRyaWJ1dGVzLAorfTsKKworLyoKKyAqIHRlbXBlcmF0dXJlIGJvdW5kIGV2ZW50cworICovCisKKyNkZWZpbmUgSUlPX0VWRU5UX0NPREVfQURUNzMxMF9BQk9WRV9BTEFSTSAgICBJSU9fQlVGRkVSX0VWRU5UX0NPREUoMCkKKyNkZWZpbmUgSUlPX0VWRU5UX0NPREVfQURUNzMxMF9CRUxMT1dfQUxBUk0gICBJSU9fQlVGRkVSX0VWRU5UX0NPREUoMSkKKyNkZWZpbmUgSUlPX0VWRU5UX0NPREVfQURUNzMxMF9BQk9WRV9DUklUICAgICBJSU9fQlVGRkVSX0VWRU5UX0NPREUoMikKKworc3RhdGljIHZvaWQgYWR0NzMxMF9pbnRlcnJ1cHRfYmgoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrX3MpCit7CisJc3RydWN0IGFkdDczMTBfY2hpcF9pbmZvICpjaGlwID0KKwkJY29udGFpbmVyX29mKHdvcmtfcywgc3RydWN0IGFkdDczMTBfY2hpcF9pbmZvLCB0aHJlc2hfd29yayk7CisJdTggc3RhdHVzOworCisJaWYgKGFkdDczMTBfc3BpX3JlYWRfYnl0ZShjaGlwLCBBRFQ3MzEwX1NUQVRVUywgJnN0YXR1cykpCisJCXJldHVybjsKKworCWlmIChzdGF0dXMgJiBBRFQ3MzEwX1NUQVRfVF9ISUdIKQorCQlpaW9fcHVzaF9ldmVudChjaGlwLT5pbmRpb19kZXYsIDAsCisJCQlJSU9fRVZFTlRfQ09ERV9BRFQ3MzEwX0FCT1ZFX0FMQVJNLAorCQkJY2hpcC0+bGFzdF90aW1lc3RhbXApOworCWlmIChzdGF0dXMgJiBBRFQ3MzEwX1NUQVRfVF9MT1cpCisJCWlpb19wdXNoX2V2ZW50KGNoaXAtPmluZGlvX2RldiwgMCwKKwkJCUlJT19FVkVOVF9DT0RFX0FEVDczMTBfQkVMTE9XX0FMQVJNLAorCQkJY2hpcC0+bGFzdF90aW1lc3RhbXApOworCWlmIChzdGF0dXMgJiBBRFQ3MzEwX1NUQVRfVF9DUklUKQorCQlpaW9fcHVzaF9ldmVudChjaGlwLT5pbmRpb19kZXYsIDAsCisJCQlJSU9fRVZFTlRfQ09ERV9BRFQ3MzEwX0FCT1ZFX0NSSVQsCisJCQljaGlwLT5sYXN0X3RpbWVzdGFtcCk7Cit9CisKK3N0YXRpYyBpbnQgYWR0NzMxMF9pbnRlcnJ1cHQoc3RydWN0IGlpb19kZXYgKmRldl9pbmZvLAorCQlpbnQgaW5kZXgsCisJCXM2NCB0aW1lc3RhbXAsCisJCWludCBub190ZXN0KQoreworCXN0cnVjdCBhZHQ3MzEwX2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKworCWNoaXAtPmxhc3RfdGltZXN0YW1wID0gdGltZXN0YW1wOworCXNjaGVkdWxlX3dvcmsoJmNoaXAtPnRocmVzaF93b3JrKTsKKworCXJldHVybiAwOworfQorCitJSU9fRVZFTlRfU0goYWR0NzMxMCwgJmFkdDczMTBfaW50ZXJydXB0KTsKK0lJT19FVkVOVF9TSChhZHQ3MzEwX2N0LCAmYWR0NzMxMF9pbnRlcnJ1cHQpOworCitzdGF0aWMgc3NpemVfdCBhZHQ3MzEwX3Nob3dfZXZlbnRfbW9kZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkdDczMTBfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCWludCByZXQ7CisKKwlyZXQgPSBhZHQ3MzEwX3NwaV9yZWFkX2J5dGUoY2hpcCwgQURUNzMxMF9DT05GSUcsICZjaGlwLT5jb25maWcpOworCWlmIChyZXQpCisJCXJldHVybiAtRUlPOworCisJaWYgKGNoaXAtPmNvbmZpZyAmIEFEVDczMTBfRVZFTlRfTU9ERSkKKwkJcmV0dXJuIHNwcmludGYoYnVmLCAiaW50ZXJydXB0XG4iKTsKKwllbHNlCisJCXJldHVybiBzcHJpbnRmKGJ1ZiwgImNvbXBhcmF0b3JcbiIpOworfQorCitzdGF0aWMgc3NpemVfdCBhZHQ3MzEwX3NldF9ldmVudF9tb2RlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWR0NzMxMF9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisJdTE2IGNvbmZpZzsKKwlpbnQgcmV0OworCisJcmV0ID0gYWR0NzMxMF9zcGlfcmVhZF9ieXRlKGNoaXAsIEFEVDczMTBfQ09ORklHLCAmY2hpcC0+Y29uZmlnKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gLUVJTzsKKworCWNvbmZpZyA9IGNoaXAtPmNvbmZpZyAmPSB+QURUNzMxMF9FVkVOVF9NT0RFOworCWlmIChzdHJjbXAoYnVmLCAiY29tcGFyYXRvciIpICE9IDApCisJCWNvbmZpZyB8PSBBRFQ3MzEwX0VWRU5UX01PREU7CisKKwlyZXQgPSBhZHQ3MzEwX3NwaV93cml0ZV9ieXRlKGNoaXAsIEFEVDczMTBfQ09ORklHLCBjb25maWcpOworCWlmIChyZXQpCisJCXJldHVybiAtRUlPOworCisJY2hpcC0+Y29uZmlnID0gY29uZmlnOworCisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIHNzaXplX3QgYWR0NzMxMF9zaG93X2F2YWlsYWJsZV9ldmVudF9tb2RlcyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiY29tcGFyYXRvclxuaW50ZXJydXB0XG4iKTsKK30KKworc3RhdGljIHNzaXplX3QgYWR0NzMxMF9zaG93X2ZhdWx0X3F1ZXVlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWR0NzMxMF9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisJaW50IHJldDsKKworCXJldCA9IGFkdDczMTBfc3BpX3JlYWRfYnl0ZShjaGlwLCBBRFQ3MzEwX0NPTkZJRywgJmNoaXAtPmNvbmZpZyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIC1FSU87CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgY2hpcC0+Y29uZmlnICYgQURUNzMxMF9GQVVMVF9RVUVVRV9NQVNLKTsKK30KKworc3RhdGljIHNzaXplX3QgYWR0NzMxMF9zZXRfZmF1bHRfcXVldWUoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgbGVuKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZHQ3MzEwX2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGRhdGE7CisJaW50IHJldDsKKwl1OCBjb25maWc7CisKKwlyZXQgPSBzdHJpY3Rfc3RydG91bChidWYsIDEwLCAmZGF0YSk7CisJaWYgKHJldCB8fCBkYXRhID4gMykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXQgPSBhZHQ3MzEwX3NwaV9yZWFkX2J5dGUoY2hpcCwgQURUNzMxMF9DT05GSUcsICZjaGlwLT5jb25maWcpOworCWlmIChyZXQpCisJCXJldHVybiAtRUlPOworCisJY29uZmlnID0gY2hpcC0+Y29uZmlnICYgfkFEVDczMTBfRkFVTFRfUVVFVUVfTUFTSzsKKwljb25maWcgfD0gZGF0YTsKKwlyZXQgPSBhZHQ3MzEwX3NwaV93cml0ZV9ieXRlKGNoaXAsIEFEVDczMTBfQ09ORklHLCBjb25maWcpOworCWlmIChyZXQpCisJCXJldHVybiAtRUlPOworCisJY2hpcC0+Y29uZmlnID0gY29uZmlnOworCisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIGlubGluZSBzc2l6ZV90IGFkdDczMTBfc2hvd190X2JvdW5kKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCXU4IGJvdW5kX3JlZywKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZHQ3MzEwX2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKwl1MTYgZGF0YTsKKwlpbnQgcmV0OworCisJcmV0ID0gYWR0NzMxMF9zcGlfcmVhZF93b3JkKGNoaXAsIGJvdW5kX3JlZywgJmRhdGEpOworCWlmIChyZXQpCisJCXJldHVybiAtRUlPOworCisJcmV0dXJuIGFkdDczMTBfY29udmVydF90ZW1wZXJhdHVyZShjaGlwLCBkYXRhLCBidWYpOworfQorCitzdGF0aWMgaW5saW5lIHNzaXplX3QgYWR0NzMxMF9zZXRfdF9ib3VuZChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQl1OCBib3VuZF9yZWcsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWR0NzMxMF9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisJbG9uZyB0bXAxLCB0bXAyOworCXUxNiBkYXRhOworCWNoYXIgKnBvczsKKwlpbnQgcmV0OworCisJcG9zID0gc3RyY2hyKGJ1ZiwgJy4nKTsKKworCXJldCA9IHN0cmljdF9zdHJ0b2woYnVmLCAxMCwgJnRtcDEpOworCisJaWYgKHJldCB8fCB0bXAxID4gMTI3IHx8IHRtcDEgPCAtMTI4KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChwb3MpIHsKKwkJbGVuID0gc3RybGVuKHBvcyk7CisKKwkJaWYgKGNoaXAtPmNvbmZpZyAmIEFEVDczMTBfUkVTT0xVVElPTikgeworCQkJaWYgKGxlbiA+IEFEVDczMTBfVDE2X1ZBTFVFX0ZMT0FUX09GRlNFVCkKKwkJCQlsZW4gPSBBRFQ3MzEwX1QxNl9WQUxVRV9GTE9BVF9PRkZTRVQ7CisJCQlwb3NbbGVuXSA9IDA7CisJCQlyZXQgPSBzdHJpY3Rfc3RydG9sKHBvcywgMTAsICZ0bXAyKTsKKworCQkJaWYgKCFyZXQpCisJCQkJdG1wMiA9ICh0bXAyIC8gNzgxMjUpICogNzgxMjU7CisJCX0gZWxzZSB7CisJCQlpZiAobGVuID4gQURUNzMxMF9UMTNfVkFMVUVfRkxPQVRfT0ZGU0VUKQorCQkJCWxlbiA9IEFEVDczMTBfVDEzX1ZBTFVFX0ZMT0FUX09GRlNFVDsKKwkJCXBvc1tsZW5dID0gMDsKKwkJCXJldCA9IHN0cmljdF9zdHJ0b2wocG9zLCAxMCwgJnRtcDIpOworCisJCQlpZiAoIXJldCkKKwkJCQl0bXAyID0gKHRtcDIgLyA2MjUpICogNjI1OworCQl9CisJfQorCisJaWYgKHRtcDEgPCAwKQorCQlkYXRhID0gKHUxNikoLXRtcDEpOworCWVsc2UKKwkJZGF0YSA9ICh1MTYpdG1wMTsKKworCWlmIChjaGlwLT5jb25maWcgJiBBRFQ3MzEwX1JFU09MVVRJT04pIHsKKwkJZGF0YSA9IChkYXRhIDw8IEFEVDczMTBfVDE2X1ZBTFVFX0ZMT0FUX09GRlNFVCkgfAorCQkJKHRtcDIgJiBBRFQ3MzEwX1QxNl9WQUxVRV9GTE9BVF9NQVNLKTsKKworCQlpZiAodG1wMSA8IDApCisJCQkvKiBjb252ZXJ0IHBvc2l0aXZlIHZhbHVlIHRvIHN1cHBseW1lbnQgKi8KKwkJCWRhdGEgPSAodTE2KSgoQURUNzMxMF9UMTZfVkFMVUVfU0lHTiA8PCAxKSAtICh1MzIpZGF0YSk7CisJfSBlbHNlIHsKKwkJZGF0YSA9IChkYXRhIDw8IEFEVDczMTBfVDEzX1ZBTFVFX0ZMT0FUX09GRlNFVCkgfAorCQkJKHRtcDIgJiBBRFQ3MzEwX1QxM19WQUxVRV9GTE9BVF9NQVNLKTsKKworCQlpZiAodG1wMSA8IDApCisJCQkvKiBjb252ZXJ0IHBvc2l0aXZlIHZhbHVlIHRvIHN1cHBseW1lbnQgKi8KKwkJCWRhdGEgPSAoQURUNzMxMF9UMTNfVkFMVUVfU0lHTiA8PCAxKSAtIGRhdGE7CisJCWRhdGEgPDw9IEFEVDczMTBfVDEzX1ZBTFVFX09GRlNFVDsKKwl9CisKKwlyZXQgPSBhZHQ3MzEwX3NwaV93cml0ZV93b3JkKGNoaXAsIGJvdW5kX3JlZywgZGF0YSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIC1FSU87CisKKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgc3NpemVfdCBhZHQ3MzEwX3Nob3dfdF9hbGFybV9oaWdoKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gYWR0NzMxMF9zaG93X3RfYm91bmQoZGV2LCBhdHRyLAorCQkJQURUNzMxMF9UX0FMQVJNX0hJR0gsIGJ1Zik7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3NpemVfdCBhZHQ3MzEwX3NldF90X2FsYXJtX2hpZ2goc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgbGVuKQoreworCXJldHVybiBhZHQ3MzEwX3NldF90X2JvdW5kKGRldiwgYXR0ciwKKwkJCUFEVDczMTBfVF9BTEFSTV9ISUdILCBidWYsIGxlbik7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkdDczMTBfc2hvd190X2FsYXJtX2xvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJcmV0dXJuIGFkdDczMTBfc2hvd190X2JvdW5kKGRldiwgYXR0ciwKKwkJCUFEVDczMTBfVF9BTEFSTV9MT1csIGJ1Zik7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3NpemVfdCBhZHQ3MzEwX3NldF90X2FsYXJtX2xvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBsZW4pCit7CisJcmV0dXJuIGFkdDczMTBfc2V0X3RfYm91bmQoZGV2LCBhdHRyLAorCQkJQURUNzMxMF9UX0FMQVJNX0xPVywgYnVmLCBsZW4pOworfQorCitzdGF0aWMgc3NpemVfdCBhZHQ3MzEwX3Nob3dfdF9jcml0KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gYWR0NzMxMF9zaG93X3RfYm91bmQoZGV2LCBhdHRyLAorCQkJQURUNzMxMF9UX0NSSVQsIGJ1Zik7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3NpemVfdCBhZHQ3MzEwX3NldF90X2NyaXQoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgbGVuKQoreworCXJldHVybiBhZHQ3MzEwX3NldF90X2JvdW5kKGRldiwgYXR0ciwKKwkJCUFEVDczMTBfVF9DUklULCBidWYsIGxlbik7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkdDczMTBfc2hvd190X2h5c3Qoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZHQ3MzEwX2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKwlpbnQgcmV0OworCXU4IHRfaHlzdDsKKworCXJldCA9IGFkdDczMTBfc3BpX3JlYWRfYnl0ZShjaGlwLCBBRFQ3MzEwX1RfSFlTVCwgJnRfaHlzdCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIC1FSU87CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgdF9oeXN0ICYgQURUNzMxMF9UX0hZU1RfTUFTSyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3NpemVfdCBhZHQ3MzEwX3NldF90X2h5c3Qoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgbGVuKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZHQ3MzEwX2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKwlpbnQgcmV0OworCXVuc2lnbmVkIGxvbmcgZGF0YTsKKwl1OCB0X2h5c3Q7CisKKwlyZXQgPSBzdHJpY3Rfc3RydG9sKGJ1ZiwgMTAsICZkYXRhKTsKKworCWlmIChyZXQgfHwgZGF0YSA+IEFEVDczMTBfVF9IWVNUX01BU0spCisJCXJldHVybiAtRUlOVkFMOworCisJdF9oeXN0ID0gKHU4KWRhdGE7CisKKwlyZXQgPSBhZHQ3MzEwX3NwaV93cml0ZV9ieXRlKGNoaXAsIEFEVDczMTBfVF9IWVNULCB0X2h5c3QpOworCWlmIChyZXQpCisJCXJldHVybiAtRUlPOworCisJcmV0dXJuIGxlbjsKK30KKworSUlPX0VWRU5UX0FUVFJfU0goZXZlbnRfbW9kZSwgaWlvX2V2ZW50X2FkdDczMTAsCisJCWFkdDczMTBfc2hvd19ldmVudF9tb2RlLCBhZHQ3MzEwX3NldF9ldmVudF9tb2RlLCAwKTsKK0lJT19FVkVOVF9BVFRSX1NIKGF2YWlsYWJsZV9ldmVudF9tb2RlcywgaWlvX2V2ZW50X2FkdDczMTAsCisJCWFkdDczMTBfc2hvd19hdmFpbGFibGVfZXZlbnRfbW9kZXMsIE5VTEwsIDApOworSUlPX0VWRU5UX0FUVFJfU0goZmF1bHRfcXVldWUsIGlpb19ldmVudF9hZHQ3MzEwLAorCQlhZHQ3MzEwX3Nob3dfZmF1bHRfcXVldWUsIGFkdDczMTBfc2V0X2ZhdWx0X3F1ZXVlLCAwKTsKK0lJT19FVkVOVF9BVFRSX1NIKHRfYWxhcm1faGlnaCwgaWlvX2V2ZW50X2FkdDczMTAsCisJCWFkdDczMTBfc2hvd190X2FsYXJtX2hpZ2gsIGFkdDczMTBfc2V0X3RfYWxhcm1faGlnaCwgMCk7CitJSU9fRVZFTlRfQVRUUl9TSCh0X2FsYXJtX2xvdywgaWlvX2V2ZW50X2FkdDczMTAsCisJCWFkdDczMTBfc2hvd190X2FsYXJtX2xvdywgYWR0NzMxMF9zZXRfdF9hbGFybV9sb3csIDApOworSUlPX0VWRU5UX0FUVFJfU0godF9jcml0LCBpaW9fZXZlbnRfYWR0NzMxMF9jdCwKKwkJYWR0NzMxMF9zaG93X3RfY3JpdCwgYWR0NzMxMF9zZXRfdF9jcml0LCAwKTsKK0lJT19FVkVOVF9BVFRSX1NIKHRfaHlzdCwgaWlvX2V2ZW50X2FkdDczMTAsCisJCWFkdDczMTBfc2hvd190X2h5c3QsIGFkdDczMTBfc2V0X3RfaHlzdCwgMCk7CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICphZHQ3MzEwX2V2ZW50X2ludF9hdHRyaWJ1dGVzW10gPSB7CisJJmlpb19ldmVudF9hdHRyX2V2ZW50X21vZGUuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2V2ZW50X2F0dHJfYXZhaWxhYmxlX2V2ZW50X21vZGVzLmRldl9hdHRyLmF0dHIsCisJJmlpb19ldmVudF9hdHRyX2ZhdWx0X3F1ZXVlLmRldl9hdHRyLmF0dHIsCisJJmlpb19ldmVudF9hdHRyX3RfYWxhcm1faGlnaC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZXZlbnRfYXR0cl90X2FsYXJtX2xvdy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZXZlbnRfYXR0cl90X2h5c3QuZGV2X2F0dHIuYXR0ciwKKwlOVUxMLAorfTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmFkdDczMTBfZXZlbnRfY3RfYXR0cmlidXRlc1tdID0geworCSZpaW9fZXZlbnRfYXR0cl9ldmVudF9tb2RlLmRldl9hdHRyLmF0dHIsCisJJmlpb19ldmVudF9hdHRyX2F2YWlsYWJsZV9ldmVudF9tb2Rlcy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZXZlbnRfYXR0cl9mYXVsdF9xdWV1ZS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZXZlbnRfYXR0cl90X2NyaXQuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2V2ZW50X2F0dHJfdF9oeXN0LmRldl9hdHRyLmF0dHIsCisJTlVMTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGFkdDczMTBfZXZlbnRfYXR0cmlidXRlX2dyb3VwW0FEVDczMTBfSVJRU10gPSB7CisJeworCQkuYXR0cnMgPSBhZHQ3MzEwX2V2ZW50X2ludF9hdHRyaWJ1dGVzLAorCX0sCisJeworCQkuYXR0cnMgPSBhZHQ3MzEwX2V2ZW50X2N0X2F0dHJpYnV0ZXMsCisJfQorfTsKKworLyoKKyAqIGRldmljZSBwcm9iZSBhbmQgcmVtb3ZlCisgKi8KKworc3RhdGljIGludCBfX2RldmluaXQgYWR0NzMxMF9wcm9iZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpX2RldikKK3sKKwlzdHJ1Y3QgYWR0NzMxMF9jaGlwX2luZm8gKmNoaXA7CisJaW50IHJldCA9IDA7CisJdW5zaWduZWQgbG9uZyAqYWR0NzMxMF9wbGF0Zm9ybV9kYXRhID0gc3BpX2Rldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJdW5zaWduZWQgbG9uZyBpcnFfZmxhZ3M7CisKKwljaGlwID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGFkdDczMTBfY2hpcF9pbmZvKSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoY2hpcCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qIHRoaXMgaXMgb25seSB1c2VkIGZvciBkZXZpY2UgcmVtb3ZhbCBwdXJwb3NlcyAqLworCWRldl9zZXRfZHJ2ZGF0YSgmc3BpX2Rldi0+ZGV2LCBjaGlwKTsKKworCWNoaXAtPnNwaV9kZXYgPSBzcGlfZGV2OworCWNoaXAtPm5hbWUgPSBzcGlfZGV2LT5tb2RhbGlhczsKKworCWNoaXAtPmluZGlvX2RldiA9IGlpb19hbGxvY2F0ZV9kZXZpY2UoKTsKKwlpZiAoY2hpcC0+aW5kaW9fZGV2ID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJvcl9mcmVlX2NoaXA7CisJfQorCisJY2hpcC0+aW5kaW9fZGV2LT5kZXYucGFyZW50ID0gJnNwaV9kZXYtPmRldjsKKwljaGlwLT5pbmRpb19kZXYtPmF0dHJzID0gJmFkdDczMTBfYXR0cmlidXRlX2dyb3VwOworCWNoaXAtPmluZGlvX2Rldi0+ZXZlbnRfYXR0cnMgPSBhZHQ3MzEwX2V2ZW50X2F0dHJpYnV0ZV9ncm91cDsKKwljaGlwLT5pbmRpb19kZXYtPmRldl9kYXRhID0gKHZvaWQgKiljaGlwOworCWNoaXAtPmluZGlvX2Rldi0+ZHJpdmVyX21vZHVsZSA9IFRISVNfTU9EVUxFOworCWNoaXAtPmluZGlvX2Rldi0+bnVtX2ludGVycnVwdF9saW5lcyA9IEFEVDczMTBfSVJRUzsKKwljaGlwLT5pbmRpb19kZXYtPm1vZGVzID0gSU5ESU9fRElSRUNUX01PREU7CisKKwlyZXQgPSBpaW9fZGV2aWNlX3JlZ2lzdGVyKGNoaXAtPmluZGlvX2Rldik7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9mcmVlX2RldjsKKworCS8qIENUIGNyaXRjYWwgdGVtcGVyYXR1cmUgZXZlbnQuIGxpbmUgMCAqLworCWlmIChzcGlfZGV2LT5pcnEpIHsKKwkJaWYgKGFkdDczMTBfcGxhdGZvcm1fZGF0YVsyXSkKKwkJCWlycV9mbGFncyA9IGFkdDczMTBfcGxhdGZvcm1fZGF0YVsyXTsKKwkJZWxzZQorCQkJaXJxX2ZsYWdzID0gSVJRRl9UUklHR0VSX0xPVzsKKwkJcmV0ID0gaWlvX3JlZ2lzdGVyX2ludGVycnVwdF9saW5lKHNwaV9kZXYtPmlycSwKKwkJCQljaGlwLT5pbmRpb19kZXYsCisJCQkJMCwKKwkJCQlpcnFfZmxhZ3MsCisJCQkJY2hpcC0+bmFtZSk7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycm9yX3VucmVnX2RldjsKKworCQkvKgorCQkgKiBUaGUgZXZlbnQgaGFuZGxlciBsaXN0IGVsZW1lbnQgcmVmZXIgdG8gaWlvX2V2ZW50X2FkdDczMTAuCisJCSAqIEFsbCBldmVudCBhdHRyaWJ1dGVzIGJpbmQgdG8gdGhlIHNhbWUgZXZlbnQgaGFuZGxlci4KKwkJICogT25lIGV2ZW50IGhhbmRsZXIgY2FuIG9ubHkgYmUgYWRkZWQgdG8gb25lIGV2ZW50IGxpc3QuCisJCSAqLworCQlpaW9fYWRkX2V2ZW50X3RvX2xpc3QoJmlpb19ldmVudF9hZHQ3MzEwLAorCQkJCSZjaGlwLT5pbmRpb19kZXYtPmludGVycnVwdHNbMF0tPmV2X2xpc3QpOworCX0KKworCS8qIElOVCBib3VuZCB0ZW1wZXJhdHVyZSBhbGFybSBldmVudC4gbGluZSAxICovCisJaWYgKGFkdDczMTBfcGxhdGZvcm1fZGF0YVswXSkgeworCQlyZXQgPSBpaW9fcmVnaXN0ZXJfaW50ZXJydXB0X2xpbmUoYWR0NzMxMF9wbGF0Zm9ybV9kYXRhWzBdLAorCQkJCWNoaXAtPmluZGlvX2RldiwKKwkJCQkxLAorCQkJCWFkdDczMTBfcGxhdGZvcm1fZGF0YVsxXSwKKwkJCQljaGlwLT5uYW1lKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJyb3JfdW5yZWdfY3RfaXJxOworCisJCS8qCisJCSAqIFRoZSBldmVudCBoYW5kbGVyIGxpc3QgZWxlbWVudCByZWZlciB0byBpaW9fZXZlbnRfYWR0NzMxMC4KKwkJICogQWxsIGV2ZW50IGF0dHJpYnV0ZXMgYmluZCB0byB0aGUgc2FtZSBldmVudCBoYW5kbGVyLgorCQkgKiBPbmUgZXZlbnQgaGFuZGxlciBjYW4gb25seSBiZSBhZGRlZCB0byBvbmUgZXZlbnQgbGlzdC4KKwkJICovCisJCWlpb19hZGRfZXZlbnRfdG9fbGlzdCgmaWlvX2V2ZW50X2FkdDczMTBfY3QsCisJCQkJJmNoaXAtPmluZGlvX2Rldi0+aW50ZXJydXB0c1sxXS0+ZXZfbGlzdCk7CisJfQorCisJaWYgKHNwaV9kZXYtPmlycSAmJiBhZHQ3MzEwX3BsYXRmb3JtX2RhdGFbMF0pIHsKKwkJSU5JVF9XT1JLKCZjaGlwLT50aHJlc2hfd29yaywgYWR0NzMxMF9pbnRlcnJ1cHRfYmgpOworCisJCXJldCA9IGFkdDczMTBfc3BpX3JlYWRfYnl0ZShjaGlwLCBBRFQ3MzEwX0NPTkZJRywgJmNoaXAtPmNvbmZpZyk7CisJCWlmIChyZXQpIHsKKwkJCXJldCA9IC1FSU87CisJCQlnb3RvIGVycm9yX3VucmVnX2ludF9pcnE7CisJCX0KKworCQkvKiBzZXQgaXJxIHBvbGFyaXR5IGxvdyBsZXZlbCAqLworCQljaGlwLT5jb25maWcgJj0gfkFEVDczMTBfQ1RfUE9MQVJJVFk7CisKKwkJaWYgKGFkdDczMTBfcGxhdGZvcm1fZGF0YVsxXSAmIElSUUZfVFJJR0dFUl9ISUdIKQorCQkJY2hpcC0+Y29uZmlnIHw9IEFEVDczMTBfSU5UX1BPTEFSSVRZOworCQllbHNlCisJCQljaGlwLT5jb25maWcgJj0gfkFEVDczMTBfSU5UX1BPTEFSSVRZOworCisJCXJldCA9IGFkdDczMTBfc3BpX3dyaXRlX2J5dGUoY2hpcCwgQURUNzMxMF9DT05GSUcsIGNoaXAtPmNvbmZpZyk7CisJCWlmIChyZXQpIHsKKwkJCXJldCA9IC1FSU87CisJCQlnb3RvIGVycm9yX3VucmVnX2ludF9pcnE7CisJCX0KKwl9CisKKwlkZXZfaW5mbygmc3BpX2Rldi0+ZGV2LCAiJXMgdGVtcGVyYXR1cmUgc2Vuc29yIHJlZ2lzdGVyZWQuXG4iLAorCQkJY2hpcC0+bmFtZSk7CisKKwlyZXR1cm4gMDsKKworZXJyb3JfdW5yZWdfaW50X2lycToKKwlpaW9fdW5yZWdpc3Rlcl9pbnRlcnJ1cHRfbGluZShjaGlwLT5pbmRpb19kZXYsIDEpOworZXJyb3JfdW5yZWdfY3RfaXJxOgorCWlpb191bnJlZ2lzdGVyX2ludGVycnVwdF9saW5lKGNoaXAtPmluZGlvX2RldiwgMCk7CitlcnJvcl91bnJlZ19kZXY6CisJaWlvX2RldmljZV91bnJlZ2lzdGVyKGNoaXAtPmluZGlvX2Rldik7CitlcnJvcl9mcmVlX2RldjoKKwlpaW9fZnJlZV9kZXZpY2UoY2hpcC0+aW5kaW9fZGV2KTsKK2Vycm9yX2ZyZWVfY2hpcDoKKwlrZnJlZShjaGlwKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IGFkdDczMTBfcmVtb3ZlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGlfZGV2KQoreworCXN0cnVjdCBhZHQ3MzEwX2NoaXBfaW5mbyAqY2hpcCA9IGRldl9nZXRfZHJ2ZGF0YSgmc3BpX2Rldi0+ZGV2KTsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gY2hpcC0+aW5kaW9fZGV2OworCXVuc2lnbmVkIGxvbmcgKmFkdDczMTBfcGxhdGZvcm1fZGF0YSA9IHNwaV9kZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCisJZGV2X3NldF9kcnZkYXRhKCZzcGlfZGV2LT5kZXYsIE5VTEwpOworCWlmIChhZHQ3MzEwX3BsYXRmb3JtX2RhdGFbMF0pCisJCWlpb191bnJlZ2lzdGVyX2ludGVycnVwdF9saW5lKGluZGlvX2RldiwgMSk7CisJaWYgKHNwaV9kZXYtPmlycSkKKwkJaWlvX3VucmVnaXN0ZXJfaW50ZXJydXB0X2xpbmUoaW5kaW9fZGV2LCAwKTsKKwlpaW9fZGV2aWNlX3VucmVnaXN0ZXIoaW5kaW9fZGV2KTsKKwlpaW9fZnJlZV9kZXZpY2UoY2hpcC0+aW5kaW9fZGV2KTsKKwlrZnJlZShjaGlwKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHNwaV9kZXZpY2VfaWQgYWR0NzMxMF9pZFtdID0geworCXsgImFkdDczMTAiLCAwIH0sCisJe30KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUoc3BpLCBhZHQ3MzEwX2lkKTsKKworc3RhdGljIHN0cnVjdCBzcGlfZHJpdmVyIGFkdDczMTBfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gImFkdDczMTAiLAorCQkuYnVzID0gJnNwaV9idXNfdHlwZSwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJfSwKKwkucHJvYmUgPSBhZHQ3MzEwX3Byb2JlLAorCS5yZW1vdmUgPSBfX2RldmV4aXRfcChhZHQ3MzEwX3JlbW92ZSksCisJLmlkX3RhYmxlID0gYWR0NzMxMF9pZCwKK307CisKK3N0YXRpYyBfX2luaXQgaW50IGFkdDczMTBfaW5pdCh2b2lkKQoreworCXJldHVybiBzcGlfcmVnaXN0ZXJfZHJpdmVyKCZhZHQ3MzEwX2RyaXZlcik7Cit9CisKK3N0YXRpYyBfX2V4aXQgdm9pZCBhZHQ3MzEwX2V4aXQodm9pZCkKK3sKKwlzcGlfdW5yZWdpc3Rlcl9kcml2ZXIoJmFkdDczMTBfZHJpdmVyKTsKK30KKworTU9EVUxFX0FVVEhPUigiU29uaWMgWmhhbmcgPHNvbmljLnpoYW5nQGFuYWxvZy5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkFuYWxvZyBEZXZpY2VzIEFEVDczMTAgZGlnaXRhbCIKKwkJCSIgdGVtcGVyYXR1cmUgc2Vuc29yIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOworCittb2R1bGVfaW5pdChhZHQ3MzEwX2luaXQpOworbW9kdWxlX2V4aXQoYWR0NzMxMF9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRjL2FkdDc0MTAuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRjL2FkdDc0MTAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzQ1ZjI3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvYWR0NzQxMC5jCkBAIC0wLDAgKzEsOTE1IEBACisvKgorICogQURUNzQxMCBkaWdpdGFsIHRlbXBlcmF0dXJlIHNlbnNvciBkcml2ZXIgc3VwcG9ydGluZyBBRFQ3NDEwCisgKgorICogQ29weXJpZ2h0IDIwMTAgQW5hbG9nIERldmljZXMgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNmcy5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9ydGMuaD4KKworI2luY2x1ZGUgIi4uL2lpby5oIgorI2luY2x1ZGUgIi4uL3N5c2ZzLmgiCisKKy8qCisgKiBBRFQ3NDEwIHJlZ2lzdGVycyBkZWZpbml0aW9uCisgKi8KKworI2RlZmluZSBBRFQ3NDEwX1RFTVBFUkFUVVJFCQkwCisjZGVmaW5lIEFEVDc0MTBfU1RBVFVTCQkJMgorI2RlZmluZSBBRFQ3NDEwX0NPTkZJRwkJCTMKKyNkZWZpbmUgQURUNzQxMF9UX0FMQVJNX0hJR0gJCTQKKyNkZWZpbmUgQURUNzQxMF9UX0FMQVJNX0xPVwkJNgorI2RlZmluZSBBRFQ3NDEwX1RfQ1JJVAkJCTgKKyNkZWZpbmUgQURUNzQxMF9UX0hZU1QJCQkweEEKKyNkZWZpbmUgQURUNzQxMF9JRAkJCTB4QgorI2RlZmluZSBBRFQ3NDEwX1JFU0VUCQkJMHgyRgorCisvKgorICogQURUNzQxMCBzdGF0dXMKKyAqLworI2RlZmluZSBBRFQ3NDEwX1NUQVRfVF9MT1cJCTB4MTAKKyNkZWZpbmUgQURUNzQxMF9TVEFUX1RfSElHSAkJMHgyMAorI2RlZmluZSBBRFQ3NDEwX1NUQVRfVF9DUklUCQkweDQwCisjZGVmaW5lIEFEVDc0MTBfU1RBVF9OT1RfUkRZCQkweDgwCisKKy8qCisgKiBBRFQ3NDEwIGNvbmZpZworICovCisjZGVmaW5lIEFEVDc0MTBfRkFVTFRfUVVFVUVfTUFTSwkweDMKKyNkZWZpbmUgQURUNzQxMF9DVF9QT0xBUklUWQkJMHg0CisjZGVmaW5lIEFEVDc0MTBfSU5UX1BPTEFSSVRZCQkweDgKKyNkZWZpbmUgQURUNzQxMF9FVkVOVF9NT0RFCQkweDEwCisjZGVmaW5lIEFEVDc0MTBfTU9ERV9NQVNLCQkweDYwCisjZGVmaW5lIEFEVDc0MTBfT05FU0hPVAkJCTB4MjAKKyNkZWZpbmUgQURUNzQxMF9TUFMJCQkweDQwCisjZGVmaW5lIEFEVDc0MTBfUEQJCQkweDYwCisjZGVmaW5lIEFEVDc0MTBfUkVTT0xVVElPTgkJMHg4MAorCisvKgorICogQURUNzQxMCBtYXNrcworICovCisjZGVmaW5lIEFEVDc0MTBfVDE2X1ZBTFVFX1NJR04JCQkweDgwMDAKKyNkZWZpbmUgQURUNzQxMF9UMTZfVkFMVUVfRkxPQVRfT0ZGU0VUCQk3CisjZGVmaW5lIEFEVDc0MTBfVDE2X1ZBTFVFX0ZMT0FUX01BU0sJCTB4N0YKKyNkZWZpbmUgQURUNzQxMF9UMTNfVkFMVUVfU0lHTgkJCTB4MTAwMAorI2RlZmluZSBBRFQ3NDEwX1QxM19WQUxVRV9PRkZTRVQJCTMKKyNkZWZpbmUgQURUNzQxMF9UMTNfVkFMVUVfRkxPQVRfT0ZGU0VUCQk0CisjZGVmaW5lIEFEVDc0MTBfVDEzX1ZBTFVFX0ZMT0FUX01BU0sJCTB4RgorI2RlZmluZSBBRFQ3NDEwX1RfSFlTVF9NQVNLCQkJMHhGCisjZGVmaW5lIEFEVDc0MTBfREVWSUNFX0lEX01BU0sJCQkweEYKKyNkZWZpbmUgQURUNzQxMF9NQU5VRkFDVE9SWV9JRF9NQVNLCQkweEYwCisjZGVmaW5lIEFEVDc0MTBfTUFOVUZBQ1RPUllfSURfT0ZGU0VUCQk0CisKKyNkZWZpbmUgQURUNzQxMF9JUlFTCQkJCTIKKworLyoKKyAqIHN0cnVjdCBhZHQ3NDEwX2NoaXBfaW5mbyAtIGNoaXAgc3BlY2lmYyBpbmZvcm1hdGlvbgorICovCisKK3N0cnVjdCBhZHQ3NDEwX2NoaXBfaW5mbyB7CisJY29uc3QgY2hhciAqbmFtZTsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50OworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXY7CisJc3RydWN0IHdvcmtfc3RydWN0IHRocmVzaF93b3JrOworCXM2NCBsYXN0X3RpbWVzdGFtcDsKKwl1OCAgY29uZmlnOworfTsKKworLyoKKyAqIGFkdDc0MTAgcmVnaXN0ZXIgYWNjZXNzIGJ5IEkyQworICovCisKK3N0YXRpYyBpbnQgYWR0NzQxMF9pMmNfcmVhZF93b3JkKHN0cnVjdCBhZHQ3NDEwX2NoaXBfaW5mbyAqY2hpcCwgdTggcmVnLCB1MTYgKmRhdGEpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IGNoaXAtPmNsaWVudDsKKwlpbnQgcmV0ID0gMDsKKworCXJldCA9IGkyY19zbWJ1c19yZWFkX3dvcmRfZGF0YShjbGllbnQsIHJlZyk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJJMkMgcmVhZCBlcnJvclxuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJKmRhdGEgPSBzd2FiMTYoKHUxNilyZXQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWR0NzQxMF9pMmNfd3JpdGVfd29yZChzdHJ1Y3QgYWR0NzQxMF9jaGlwX2luZm8gKmNoaXAsIHU4IHJlZywgdTE2IGRhdGEpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IGNoaXAtPmNsaWVudDsKKwlpbnQgcmV0ID0gMDsKKworCXJldCA9IGkyY19zbWJ1c193cml0ZV93b3JkX2RhdGEoY2xpZW50LCByZWcsIHN3YWIxNihkYXRhKSk7CisJaWYgKHJldCA8IDApCisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiSTJDIHdyaXRlIGVycm9yXG4iKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYWR0NzQxMF9pMmNfcmVhZF9ieXRlKHN0cnVjdCBhZHQ3NDEwX2NoaXBfaW5mbyAqY2hpcCwgdTggcmVnLCB1OCAqZGF0YSkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gY2hpcC0+Y2xpZW50OworCWludCByZXQgPSAwOworCisJcmV0ID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgcmVnKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIkkyQyByZWFkIGVycm9yXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwkqZGF0YSA9ICh1OClyZXQ7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhZHQ3NDEwX2kyY193cml0ZV9ieXRlKHN0cnVjdCBhZHQ3NDEwX2NoaXBfaW5mbyAqY2hpcCwgdTggcmVnLCB1OCBkYXRhKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSBjaGlwLT5jbGllbnQ7CisJaW50IHJldCA9IDA7CisKKwlyZXQgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgcmVnLCBkYXRhKTsKKwlpZiAocmV0IDwgMCkKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJJMkMgd3JpdGUgZXJyb3JcbiIpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QgYWR0NzQxMF9zaG93X21vZGUoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZHQ3NDEwX2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKwl1OCBjb25maWc7CisKKwljb25maWcgPSBjaGlwLT5jb25maWcgJiBBRFQ3NDEwX01PREVfTUFTSzsKKworCXN3aXRjaCAoY29uZmlnKSB7CisJY2FzZSBBRFQ3NDEwX1BEOgorCQlyZXR1cm4gc3ByaW50ZihidWYsICJwb3dlci1kb3duXG4iKTsKKwljYXNlIEFEVDc0MTBfT05FU0hPVDoKKwkJcmV0dXJuIHNwcmludGYoYnVmLCAib25lLXNob3RcbiIpOworCWNhc2UgQURUNzQxMF9TUFM6CisJCXJldHVybiBzcHJpbnRmKGJ1ZiwgInNwc1xuIik7CisJZGVmYXVsdDoKKwkJcmV0dXJuIHNwcmludGYoYnVmLCAiZnVsbFxuIik7CisJfQorfQorCitzdGF0aWMgc3NpemVfdCBhZHQ3NDEwX3N0b3JlX21vZGUoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgbGVuKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZHQ3NDEwX2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKwl1MTYgY29uZmlnOworCWludCByZXQ7CisKKwlyZXQgPSBhZHQ3NDEwX2kyY19yZWFkX2J5dGUoY2hpcCwgQURUNzQxMF9DT05GSUcsICZjaGlwLT5jb25maWcpOworCWlmIChyZXQpCisJCXJldHVybiAtRUlPOworCisJY29uZmlnID0gY2hpcC0+Y29uZmlnICYgKH5BRFQ3NDEwX01PREVfTUFTSyk7CisJaWYgKHN0cmNtcChidWYsICJwb3dlci1kb3duIikpCisJCWNvbmZpZyB8PSBBRFQ3NDEwX1BEOworCWVsc2UgaWYgKHN0cmNtcChidWYsICJvbmUtc2hvdCIpKQorCQljb25maWcgfD0gQURUNzQxMF9PTkVTSE9UOworCWVsc2UgaWYgKHN0cmNtcChidWYsICJzcHMiKSkKKwkJY29uZmlnIHw9IEFEVDc0MTBfU1BTOworCisJcmV0ID0gYWR0NzQxMF9pMmNfd3JpdGVfYnl0ZShjaGlwLCBBRFQ3NDEwX0NPTkZJRywgY29uZmlnKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gLUVJTzsKKworCWNoaXAtPmNvbmZpZyA9IGNvbmZpZzsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIobW9kZSwgU19JUlVHTyB8IFNfSVdVU1IsCisJCWFkdDc0MTBfc2hvd19tb2RlLAorCQlhZHQ3NDEwX3N0b3JlX21vZGUsCisJCTApOworCitzdGF0aWMgc3NpemVfdCBhZHQ3NDEwX3Nob3dfYXZhaWxhYmxlX21vZGVzKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gc3ByaW50ZihidWYsICJmdWxsXG5vbmUtc2hvdFxuc3BzXG5wb3dlci1kb3duXG4iKTsKK30KKworc3RhdGljIElJT19ERVZJQ0VfQVRUUihhdmFpbGFibGVfbW9kZXMsIFNfSVJVR08sIGFkdDc0MTBfc2hvd19hdmFpbGFibGVfbW9kZXMsIE5VTEwsIDApOworCitzdGF0aWMgc3NpemVfdCBhZHQ3NDEwX3Nob3dfcmVzb2x1dGlvbihzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkdDc0MTBfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCWludCByZXQ7CisJaW50IGJpdHM7CisKKwlyZXQgPSBhZHQ3NDEwX2kyY19yZWFkX2J5dGUoY2hpcCwgQURUNzQxMF9DT05GSUcsICZjaGlwLT5jb25maWcpOworCWlmIChyZXQpCisJCXJldHVybiAtRUlPOworCisJaWYgKGNoaXAtPmNvbmZpZyAmIEFEVDc0MTBfUkVTT0xVVElPTikKKwkJYml0cyA9IDE2OworCWVsc2UKKwkJYml0cyA9IDEzOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWQgYml0c1xuIiwgYml0cyk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkdDc0MTBfc3RvcmVfcmVzb2x1dGlvbihzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBsZW4pCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkdDc0MTBfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZGF0YTsKKwl1MTYgY29uZmlnOworCWludCByZXQ7CisKKwlyZXQgPSBzdHJpY3Rfc3RydG91bChidWYsIDEwLCAmZGF0YSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXQgPSBhZHQ3NDEwX2kyY19yZWFkX2J5dGUoY2hpcCwgQURUNzQxMF9DT05GSUcsICZjaGlwLT5jb25maWcpOworCWlmIChyZXQpCisJCXJldHVybiAtRUlPOworCisJY29uZmlnID0gY2hpcC0+Y29uZmlnICYgKH5BRFQ3NDEwX1JFU09MVVRJT04pOworCWlmIChkYXRhKQorCQljb25maWcgfD0gQURUNzQxMF9SRVNPTFVUSU9OOworCisJcmV0ID0gYWR0NzQxMF9pMmNfd3JpdGVfYnl0ZShjaGlwLCBBRFQ3NDEwX0NPTkZJRywgY29uZmlnKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gLUVJTzsKKworCWNoaXAtPmNvbmZpZyA9IGNvbmZpZzsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIocmVzb2x1dGlvbiwgU19JUlVHTyB8IFNfSVdVU1IsCisJCWFkdDc0MTBfc2hvd19yZXNvbHV0aW9uLAorCQlhZHQ3NDEwX3N0b3JlX3Jlc29sdXRpb24sCisJCTApOworCitzdGF0aWMgc3NpemVfdCBhZHQ3NDEwX3Nob3dfaWQoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZHQ3NDEwX2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKwl1OCBpZDsKKwlpbnQgcmV0OworCisJcmV0ID0gYWR0NzQxMF9pMmNfcmVhZF9ieXRlKGNoaXAsIEFEVDc0MTBfSUQsICZpZCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIC1FSU87CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICJkZXZpY2UgaWQ6IDB4JXhcbm1hbnVmYWN0b3J5IGlkOiAweCV4XG4iLAorCQkJaWQgJiBBRFQ3NDEwX0RFVklDRV9JRF9NQVNLLAorCQkJKGlkICYgQURUNzQxMF9NQU5VRkFDVE9SWV9JRF9NQVNLKSA+PiBBRFQ3NDEwX01BTlVGQUNUT1JZX0lEX09GRlNFVCk7Cit9CisKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIoaWQsIFNfSVJVR08gfCBTX0lXVVNSLAorCQlhZHQ3NDEwX3Nob3dfaWQsCisJCU5VTEwsCisJCTApOworCitzdGF0aWMgc3NpemVfdCBhZHQ3NDEwX2NvbnZlcnRfdGVtcGVyYXR1cmUoc3RydWN0IGFkdDc0MTBfY2hpcF9pbmZvICpjaGlwLAorCQl1MTYgZGF0YSwgY2hhciAqYnVmKQoreworCWNoYXIgc2lnbiA9ICcgJzsKKworCWlmIChjaGlwLT5jb25maWcgJiBBRFQ3NDEwX1JFU09MVVRJT04pIHsKKwkJaWYgKGRhdGEgJiBBRFQ3NDEwX1QxNl9WQUxVRV9TSUdOKSB7CisJCQkvKiBjb252ZXJ0IHN1cHBsZW1lbnQgdG8gcG9zaXRpdmUgdmFsdWUgKi8KKwkJCWRhdGEgPSAodTE2KSgoQURUNzQxMF9UMTZfVkFMVUVfU0lHTiA8PCAxKSAtICh1MzIpZGF0YSk7CisJCQlzaWduID0gJy0nOworCQl9CisJCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVjJWQuJS43ZFxuIiwgc2lnbiwKKwkJCQkoZGF0YSA+PiBBRFQ3NDEwX1QxNl9WQUxVRV9GTE9BVF9PRkZTRVQpLAorCQkJCShkYXRhICYgQURUNzQxMF9UMTZfVkFMVUVfRkxPQVRfTUFTSykgKiA3ODEyNSk7CisJfSBlbHNlIHsKKwkJaWYgKGRhdGEgJiBBRFQ3NDEwX1QxM19WQUxVRV9TSUdOKSB7CisJCQkvKiBjb252ZXJ0IHN1cHBsZW1lbnQgdG8gcG9zaXRpdmUgdmFsdWUgKi8KKwkJCWRhdGEgPj49IEFEVDc0MTBfVDEzX1ZBTFVFX09GRlNFVDsKKwkJCWRhdGEgPSAoQURUNzQxMF9UMTNfVkFMVUVfU0lHTiA8PCAxKSAtIGRhdGE7CisJCQlzaWduID0gJy0nOworCQl9CisJCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVjJWQuJS40ZFxuIiwgc2lnbiwKKwkJCQkoZGF0YSA+PiBBRFQ3NDEwX1QxM19WQUxVRV9GTE9BVF9PRkZTRVQpLAorCQkJCShkYXRhICYgQURUNzQxMF9UMTNfVkFMVUVfRkxPQVRfTUFTSykgKiA2MjUpOworCX0KK30KKworc3RhdGljIHNzaXplX3QgYWR0NzQxMF9zaG93X3ZhbHVlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWR0NzQxMF9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisJdTggc3RhdHVzOworCXUxNiBkYXRhOworCWludCByZXQsIGkgPSAwOworCisJZG8geworCQlyZXQgPSBhZHQ3NDEwX2kyY19yZWFkX2J5dGUoY2hpcCwgQURUNzQxMF9TVEFUVVMsICZzdGF0dXMpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIC1FSU87CisJCWkrKzsKKwkJaWYgKGkgPT0gMTAwMDApCisJCQlyZXR1cm4gLUVJTzsKKwl9IHdoaWxlIChzdGF0dXMgJiBBRFQ3NDEwX1NUQVRfTk9UX1JEWSk7CisKKwlyZXQgPSBhZHQ3NDEwX2kyY19yZWFkX3dvcmQoY2hpcCwgQURUNzQxMF9URU1QRVJBVFVSRSwgJmRhdGEpOworCWlmIChyZXQpCisJCXJldHVybiAtRUlPOworCisJcmV0dXJuIGFkdDc0MTBfY29udmVydF90ZW1wZXJhdHVyZShjaGlwLCBkYXRhLCBidWYpOworfQorCitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKHZhbHVlLCBTX0lSVUdPLCBhZHQ3NDEwX3Nob3dfdmFsdWUsIE5VTEwsIDApOworCitzdGF0aWMgc3NpemVfdCBhZHQ3NDEwX3Nob3dfbmFtZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkdDc0MTBfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVzXG4iLCBjaGlwLT5uYW1lKTsKK30KKworc3RhdGljIElJT19ERVZJQ0VfQVRUUihuYW1lLCBTX0lSVUdPLCBhZHQ3NDEwX3Nob3dfbmFtZSwgTlVMTCwgMCk7CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICphZHQ3NDEwX2F0dHJpYnV0ZXNbXSA9IHsKKwkmaWlvX2Rldl9hdHRyX2F2YWlsYWJsZV9tb2Rlcy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfbW9kZS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfcmVzb2x1dGlvbi5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfaWQuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX3ZhbHVlLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9uYW1lLmRldl9hdHRyLmF0dHIsCisJTlVMTCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGFkdDc0MTBfYXR0cmlidXRlX2dyb3VwID0geworCS5hdHRycyA9IGFkdDc0MTBfYXR0cmlidXRlcywKK307CisKKy8qCisgKiB0ZW1wZXJhdHVyZSBib3VuZCBldmVudHMKKyAqLworCisjZGVmaW5lIElJT19FVkVOVF9DT0RFX0FEVDc0MTBfQUJPVkVfQUxBUk0gICAgSUlPX0JVRkZFUl9FVkVOVF9DT0RFKDApCisjZGVmaW5lIElJT19FVkVOVF9DT0RFX0FEVDc0MTBfQkVMTE9XX0FMQVJNICAgSUlPX0JVRkZFUl9FVkVOVF9DT0RFKDEpCisjZGVmaW5lIElJT19FVkVOVF9DT0RFX0FEVDc0MTBfQUJPVkVfQ1JJVCAgICAgSUlPX0JVRkZFUl9FVkVOVF9DT0RFKDIpCisKK3N0YXRpYyB2b2lkIGFkdDc0MTBfaW50ZXJydXB0X2JoKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29ya19zKQoreworCXN0cnVjdCBhZHQ3NDEwX2NoaXBfaW5mbyAqY2hpcCA9CisJCWNvbnRhaW5lcl9vZih3b3JrX3MsIHN0cnVjdCBhZHQ3NDEwX2NoaXBfaW5mbywgdGhyZXNoX3dvcmspOworCXU4IHN0YXR1czsKKworCWlmIChhZHQ3NDEwX2kyY19yZWFkX2J5dGUoY2hpcCwgQURUNzQxMF9TVEFUVVMsICZzdGF0dXMpKQorCQlyZXR1cm47CisKKwllbmFibGVfaXJxKGNoaXAtPmNsaWVudC0+aXJxKTsKKworCWlmIChzdGF0dXMgJiBBRFQ3NDEwX1NUQVRfVF9ISUdIKQorCQlpaW9fcHVzaF9ldmVudChjaGlwLT5pbmRpb19kZXYsIDAsCisJCQlJSU9fRVZFTlRfQ09ERV9BRFQ3NDEwX0FCT1ZFX0FMQVJNLAorCQkJY2hpcC0+bGFzdF90aW1lc3RhbXApOworCWlmIChzdGF0dXMgJiBBRFQ3NDEwX1NUQVRfVF9MT1cpCisJCWlpb19wdXNoX2V2ZW50KGNoaXAtPmluZGlvX2RldiwgMCwKKwkJCUlJT19FVkVOVF9DT0RFX0FEVDc0MTBfQkVMTE9XX0FMQVJNLAorCQkJY2hpcC0+bGFzdF90aW1lc3RhbXApOworCWlmIChzdGF0dXMgJiBBRFQ3NDEwX1NUQVRfVF9DUklUKQorCQlpaW9fcHVzaF9ldmVudChjaGlwLT5pbmRpb19kZXYsIDAsCisJCQlJSU9fRVZFTlRfQ09ERV9BRFQ3NDEwX0FCT1ZFX0NSSVQsCisJCQljaGlwLT5sYXN0X3RpbWVzdGFtcCk7Cit9CisKK3N0YXRpYyBpbnQgYWR0NzQxMF9pbnRlcnJ1cHQoc3RydWN0IGlpb19kZXYgKmRldl9pbmZvLAorCQlpbnQgaW5kZXgsCisJCXM2NCB0aW1lc3RhbXAsCisJCWludCBub190ZXN0KQoreworCXN0cnVjdCBhZHQ3NDEwX2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKworCWNoaXAtPmxhc3RfdGltZXN0YW1wID0gdGltZXN0YW1wOworCXNjaGVkdWxlX3dvcmsoJmNoaXAtPnRocmVzaF93b3JrKTsKKworCXJldHVybiAwOworfQorCitJSU9fRVZFTlRfU0goYWR0NzQxMCwgJmFkdDc0MTBfaW50ZXJydXB0KTsKK0lJT19FVkVOVF9TSChhZHQ3NDEwX2N0LCAmYWR0NzQxMF9pbnRlcnJ1cHQpOworCitzdGF0aWMgc3NpemVfdCBhZHQ3NDEwX3Nob3dfZXZlbnRfbW9kZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkdDc0MTBfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCWludCByZXQ7CisKKwlyZXQgPSBhZHQ3NDEwX2kyY19yZWFkX2J5dGUoY2hpcCwgQURUNzQxMF9DT05GSUcsICZjaGlwLT5jb25maWcpOworCWlmIChyZXQpCisJCXJldHVybiAtRUlPOworCisJaWYgKGNoaXAtPmNvbmZpZyAmIEFEVDc0MTBfRVZFTlRfTU9ERSkKKwkJcmV0dXJuIHNwcmludGYoYnVmLCAiaW50ZXJydXB0XG4iKTsKKwllbHNlCisJCXJldHVybiBzcHJpbnRmKGJ1ZiwgImNvbXBhcmF0b3JcbiIpOworfQorCitzdGF0aWMgc3NpemVfdCBhZHQ3NDEwX3NldF9ldmVudF9tb2RlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWR0NzQxMF9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisJdTE2IGNvbmZpZzsKKwlpbnQgcmV0OworCisJcmV0ID0gYWR0NzQxMF9pMmNfcmVhZF9ieXRlKGNoaXAsIEFEVDc0MTBfQ09ORklHLCAmY2hpcC0+Y29uZmlnKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gLUVJTzsKKworCWNvbmZpZyA9IGNoaXAtPmNvbmZpZyAmPSB+QURUNzQxMF9FVkVOVF9NT0RFOworCWlmIChzdHJjbXAoYnVmLCAiY29tcGFyYXRvciIpICE9IDApCisJCWNvbmZpZyB8PSBBRFQ3NDEwX0VWRU5UX01PREU7CisKKwlyZXQgPSBhZHQ3NDEwX2kyY193cml0ZV9ieXRlKGNoaXAsIEFEVDc0MTBfQ09ORklHLCBjb25maWcpOworCWlmIChyZXQpCisJCXJldHVybiAtRUlPOworCisJY2hpcC0+Y29uZmlnID0gY29uZmlnOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QgYWR0NzQxMF9zaG93X2F2YWlsYWJsZV9ldmVudF9tb2RlcyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiY29tcGFyYXRvclxuaW50ZXJydXB0XG4iKTsKK30KKworc3RhdGljIHNzaXplX3QgYWR0NzQxMF9zaG93X2ZhdWx0X3F1ZXVlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWR0NzQxMF9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisJaW50IHJldDsKKworCXJldCA9IGFkdDc0MTBfaTJjX3JlYWRfYnl0ZShjaGlwLCBBRFQ3NDEwX0NPTkZJRywgJmNoaXAtPmNvbmZpZyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIC1FSU87CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgY2hpcC0+Y29uZmlnICYgQURUNzQxMF9GQVVMVF9RVUVVRV9NQVNLKTsKK30KKworc3RhdGljIHNzaXplX3QgYWR0NzQxMF9zZXRfZmF1bHRfcXVldWUoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgbGVuKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZHQ3NDEwX2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGRhdGE7CisJaW50IHJldDsKKwl1OCBjb25maWc7CisKKwlyZXQgPSBzdHJpY3Rfc3RydG91bChidWYsIDEwLCAmZGF0YSk7CisJaWYgKHJldCB8fCBkYXRhID4gMykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXQgPSBhZHQ3NDEwX2kyY19yZWFkX2J5dGUoY2hpcCwgQURUNzQxMF9DT05GSUcsICZjaGlwLT5jb25maWcpOworCWlmIChyZXQpCisJCXJldHVybiAtRUlPOworCisJY29uZmlnID0gY2hpcC0+Y29uZmlnICYgfkFEVDc0MTBfRkFVTFRfUVVFVUVfTUFTSzsKKwljb25maWcgfD0gZGF0YTsKKwlyZXQgPSBhZHQ3NDEwX2kyY193cml0ZV9ieXRlKGNoaXAsIEFEVDc0MTBfQ09ORklHLCBjb25maWcpOworCWlmIChyZXQpCisJCXJldHVybiAtRUlPOworCisJY2hpcC0+Y29uZmlnID0gY29uZmlnOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlubGluZSBzc2l6ZV90IGFkdDc0MTBfc2hvd190X2JvdW5kKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCXU4IGJvdW5kX3JlZywKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZHQ3NDEwX2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKwl1MTYgZGF0YTsKKwlpbnQgcmV0OworCisJcmV0ID0gYWR0NzQxMF9pMmNfcmVhZF93b3JkKGNoaXAsIGJvdW5kX3JlZywgJmRhdGEpOworCWlmIChyZXQpCisJCXJldHVybiAtRUlPOworCisJcmV0dXJuIGFkdDc0MTBfY29udmVydF90ZW1wZXJhdHVyZShjaGlwLCBkYXRhLCBidWYpOworfQorCitzdGF0aWMgaW5saW5lIHNzaXplX3QgYWR0NzQxMF9zZXRfdF9ib3VuZChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQl1OCBib3VuZF9yZWcsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWR0NzQxMF9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisJbG9uZyB0bXAxLCB0bXAyOworCXUxNiBkYXRhOworCWNoYXIgKnBvczsKKwlpbnQgcmV0OworCisJcG9zID0gc3RyY2hyKGJ1ZiwgJy4nKTsKKworCXJldCA9IHN0cmljdF9zdHJ0b2woYnVmLCAxMCwgJnRtcDEpOworCisJaWYgKHJldCB8fCB0bXAxID4gMTI3IHx8IHRtcDEgPCAtMTI4KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChwb3MpIHsKKwkJbGVuID0gc3RybGVuKHBvcyk7CisKKwkJaWYgKGNoaXAtPmNvbmZpZyAmIEFEVDc0MTBfUkVTT0xVVElPTikgeworCQkJaWYgKGxlbiA+IEFEVDc0MTBfVDE2X1ZBTFVFX0ZMT0FUX09GRlNFVCkKKwkJCQlsZW4gPSBBRFQ3NDEwX1QxNl9WQUxVRV9GTE9BVF9PRkZTRVQ7CisJCQlwb3NbbGVuXSA9IDA7CisJCQlyZXQgPSBzdHJpY3Rfc3RydG9sKHBvcywgMTAsICZ0bXAyKTsKKworCQkJaWYgKCFyZXQpCisJCQkJdG1wMiA9ICh0bXAyIC8gNzgxMjUpICogNzgxMjU7CisJCX0gZWxzZSB7CisJCQlpZiAobGVuID4gQURUNzQxMF9UMTNfVkFMVUVfRkxPQVRfT0ZGU0VUKQorCQkJCWxlbiA9IEFEVDc0MTBfVDEzX1ZBTFVFX0ZMT0FUX09GRlNFVDsKKwkJCXBvc1tsZW5dID0gMDsKKwkJCXJldCA9IHN0cmljdF9zdHJ0b2wocG9zLCAxMCwgJnRtcDIpOworCisJCQlpZiAoIXJldCkKKwkJCQl0bXAyID0gKHRtcDIgLyA2MjUpICogNjI1OworCQl9CisJfQorCisJaWYgKHRtcDEgPCAwKQorCQlkYXRhID0gKHUxNikoLXRtcDEpOworCWVsc2UKKwkJZGF0YSA9ICh1MTYpdG1wMTsKKworCWlmIChjaGlwLT5jb25maWcgJiBBRFQ3NDEwX1JFU09MVVRJT04pIHsKKwkJZGF0YSA9IChkYXRhIDw8IEFEVDc0MTBfVDE2X1ZBTFVFX0ZMT0FUX09GRlNFVCkgfAorCQkJKHRtcDIgJiBBRFQ3NDEwX1QxNl9WQUxVRV9GTE9BVF9NQVNLKTsKKworCQlpZiAodG1wMSA8IDApCisJCQkvKiBjb252ZXJ0IHBvc2l0aXZlIHZhbHVlIHRvIHN1cHBseW1lbnQgKi8KKwkJCWRhdGEgPSAodTE2KSgoQURUNzQxMF9UMTZfVkFMVUVfU0lHTiA8PCAxKSAtICh1MzIpZGF0YSk7CisJfSBlbHNlIHsKKwkJZGF0YSA9IChkYXRhIDw8IEFEVDc0MTBfVDEzX1ZBTFVFX0ZMT0FUX09GRlNFVCkgfAorCQkJKHRtcDIgJiBBRFQ3NDEwX1QxM19WQUxVRV9GTE9BVF9NQVNLKTsKKworCQlpZiAodG1wMSA8IDApCisJCQkvKiBjb252ZXJ0IHBvc2l0aXZlIHZhbHVlIHRvIHN1cHBseW1lbnQgKi8KKwkJCWRhdGEgPSAoQURUNzQxMF9UMTNfVkFMVUVfU0lHTiA8PCAxKSAtIGRhdGE7CisJCWRhdGEgPDw9IEFEVDc0MTBfVDEzX1ZBTFVFX09GRlNFVDsKKwl9CisKKwlyZXQgPSBhZHQ3NDEwX2kyY193cml0ZV93b3JkKGNoaXAsIGJvdW5kX3JlZywgZGF0YSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIC1FSU87CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3NpemVfdCBhZHQ3NDEwX3Nob3dfdF9hbGFybV9oaWdoKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gYWR0NzQxMF9zaG93X3RfYm91bmQoZGV2LCBhdHRyLAorCQkJQURUNzQxMF9UX0FMQVJNX0hJR0gsIGJ1Zik7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3NpemVfdCBhZHQ3NDEwX3NldF90X2FsYXJtX2hpZ2goc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgbGVuKQoreworCXJldHVybiBhZHQ3NDEwX3NldF90X2JvdW5kKGRldiwgYXR0ciwKKwkJCUFEVDc0MTBfVF9BTEFSTV9ISUdILCBidWYsIGxlbik7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkdDc0MTBfc2hvd190X2FsYXJtX2xvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJcmV0dXJuIGFkdDc0MTBfc2hvd190X2JvdW5kKGRldiwgYXR0ciwKKwkJCUFEVDc0MTBfVF9BTEFSTV9MT1csIGJ1Zik7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3NpemVfdCBhZHQ3NDEwX3NldF90X2FsYXJtX2xvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBsZW4pCit7CisJcmV0dXJuIGFkdDc0MTBfc2V0X3RfYm91bmQoZGV2LCBhdHRyLAorCQkJQURUNzQxMF9UX0FMQVJNX0xPVywgYnVmLCBsZW4pOworfQorCitzdGF0aWMgc3NpemVfdCBhZHQ3NDEwX3Nob3dfdF9jcml0KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gYWR0NzQxMF9zaG93X3RfYm91bmQoZGV2LCBhdHRyLAorCQkJQURUNzQxMF9UX0NSSVQsIGJ1Zik7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3NpemVfdCBhZHQ3NDEwX3NldF90X2NyaXQoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgbGVuKQoreworCXJldHVybiBhZHQ3NDEwX3NldF90X2JvdW5kKGRldiwgYXR0ciwKKwkJCUFEVDc0MTBfVF9DUklULCBidWYsIGxlbik7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkdDc0MTBfc2hvd190X2h5c3Qoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZHQ3NDEwX2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKwlpbnQgcmV0OworCXU4IHRfaHlzdDsKKworCXJldCA9IGFkdDc0MTBfaTJjX3JlYWRfYnl0ZShjaGlwLCBBRFQ3NDEwX1RfSFlTVCwgJnRfaHlzdCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIC1FSU87CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgdF9oeXN0ICYgQURUNzQxMF9UX0hZU1RfTUFTSyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3NpemVfdCBhZHQ3NDEwX3NldF90X2h5c3Qoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgbGVuKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZHQ3NDEwX2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKwlpbnQgcmV0OworCXVuc2lnbmVkIGxvbmcgZGF0YTsKKwl1OCB0X2h5c3Q7CisKKwlyZXQgPSBzdHJpY3Rfc3RydG9sKGJ1ZiwgMTAsICZkYXRhKTsKKworCWlmIChyZXQgfHwgZGF0YSA+IEFEVDc0MTBfVF9IWVNUX01BU0spCisJCXJldHVybiAtRUlOVkFMOworCisJdF9oeXN0ID0gKHU4KWRhdGE7CisKKwlyZXQgPSBhZHQ3NDEwX2kyY193cml0ZV9ieXRlKGNoaXAsIEFEVDc0MTBfVF9IWVNULCB0X2h5c3QpOworCWlmIChyZXQpCisJCXJldHVybiAtRUlPOworCisJcmV0dXJuIHJldDsKK30KKworSUlPX0VWRU5UX0FUVFJfU0goZXZlbnRfbW9kZSwgaWlvX2V2ZW50X2FkdDc0MTAsCisJCWFkdDc0MTBfc2hvd19ldmVudF9tb2RlLCBhZHQ3NDEwX3NldF9ldmVudF9tb2RlLCAwKTsKK0lJT19FVkVOVF9BVFRSX1NIKGF2YWlsYWJsZV9ldmVudF9tb2RlcywgaWlvX2V2ZW50X2FkdDc0MTAsCisJCWFkdDc0MTBfc2hvd19hdmFpbGFibGVfZXZlbnRfbW9kZXMsIE5VTEwsIDApOworSUlPX0VWRU5UX0FUVFJfU0goZmF1bHRfcXVldWUsIGlpb19ldmVudF9hZHQ3NDEwLAorCQlhZHQ3NDEwX3Nob3dfZmF1bHRfcXVldWUsIGFkdDc0MTBfc2V0X2ZhdWx0X3F1ZXVlLCAwKTsKK0lJT19FVkVOVF9BVFRSX1NIKHRfYWxhcm1faGlnaCwgaWlvX2V2ZW50X2FkdDc0MTAsCisJCWFkdDc0MTBfc2hvd190X2FsYXJtX2hpZ2gsIGFkdDc0MTBfc2V0X3RfYWxhcm1faGlnaCwgMCk7CitJSU9fRVZFTlRfQVRUUl9TSCh0X2FsYXJtX2xvdywgaWlvX2V2ZW50X2FkdDc0MTAsCisJCWFkdDc0MTBfc2hvd190X2FsYXJtX2xvdywgYWR0NzQxMF9zZXRfdF9hbGFybV9sb3csIDApOworSUlPX0VWRU5UX0FUVFJfU0godF9jcml0LCBpaW9fZXZlbnRfYWR0NzQxMF9jdCwKKwkJYWR0NzQxMF9zaG93X3RfY3JpdCwgYWR0NzQxMF9zZXRfdF9jcml0LCAwKTsKK0lJT19FVkVOVF9BVFRSX1NIKHRfaHlzdCwgaWlvX2V2ZW50X2FkdDc0MTAsCisJCWFkdDc0MTBfc2hvd190X2h5c3QsIGFkdDc0MTBfc2V0X3RfaHlzdCwgMCk7CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICphZHQ3NDEwX2V2ZW50X2ludF9hdHRyaWJ1dGVzW10gPSB7CisJJmlpb19ldmVudF9hdHRyX2V2ZW50X21vZGUuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2V2ZW50X2F0dHJfYXZhaWxhYmxlX2V2ZW50X21vZGVzLmRldl9hdHRyLmF0dHIsCisJJmlpb19ldmVudF9hdHRyX2ZhdWx0X3F1ZXVlLmRldl9hdHRyLmF0dHIsCisJJmlpb19ldmVudF9hdHRyX3RfYWxhcm1faGlnaC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZXZlbnRfYXR0cl90X2FsYXJtX2xvdy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZXZlbnRfYXR0cl90X2h5c3QuZGV2X2F0dHIuYXR0ciwKKwlOVUxMLAorfTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmFkdDc0MTBfZXZlbnRfY3RfYXR0cmlidXRlc1tdID0geworCSZpaW9fZXZlbnRfYXR0cl9ldmVudF9tb2RlLmRldl9hdHRyLmF0dHIsCisJJmlpb19ldmVudF9hdHRyX2F2YWlsYWJsZV9ldmVudF9tb2Rlcy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZXZlbnRfYXR0cl9mYXVsdF9xdWV1ZS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZXZlbnRfYXR0cl90X2NyaXQuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2V2ZW50X2F0dHJfdF9oeXN0LmRldl9hdHRyLmF0dHIsCisJTlVMTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGFkdDc0MTBfZXZlbnRfYXR0cmlidXRlX2dyb3VwW0FEVDc0MTBfSVJRU10gPSB7CisJeworCQkuYXR0cnMgPSBhZHQ3NDEwX2V2ZW50X2ludF9hdHRyaWJ1dGVzLAorCX0sCisJeworCQkuYXR0cnMgPSBhZHQ3NDEwX2V2ZW50X2N0X2F0dHJpYnV0ZXMsCisJfQorfTsKKworLyoKKyAqIGRldmljZSBwcm9iZSBhbmQgcmVtb3ZlCisgKi8KKworc3RhdGljIGludCBfX2RldmluaXQgYWR0NzQxMF9wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAorCQljb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IGFkdDc0MTBfY2hpcF9pbmZvICpjaGlwOworCWludCByZXQgPSAwOworCXVuc2lnbmVkIGxvbmcgKmFkdDc0MTBfcGxhdGZvcm1fZGF0YSA9IGNsaWVudC0+ZGV2LnBsYXRmb3JtX2RhdGE7CisKKwljaGlwID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGFkdDc0MTBfY2hpcF9pbmZvKSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoY2hpcCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qIHRoaXMgaXMgb25seSB1c2VkIGZvciBkZXZpY2UgcmVtb3ZhbCBwdXJwb3NlcyAqLworCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIGNoaXApOworCisJY2hpcC0+Y2xpZW50ID0gY2xpZW50OworCWNoaXAtPm5hbWUgPSBpZC0+bmFtZTsKKworCWNoaXAtPmluZGlvX2RldiA9IGlpb19hbGxvY2F0ZV9kZXZpY2UoKTsKKwlpZiAoY2hpcC0+aW5kaW9fZGV2ID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJvcl9mcmVlX2NoaXA7CisJfQorCisJY2hpcC0+aW5kaW9fZGV2LT5kZXYucGFyZW50ID0gJmNsaWVudC0+ZGV2OworCWNoaXAtPmluZGlvX2Rldi0+YXR0cnMgPSAmYWR0NzQxMF9hdHRyaWJ1dGVfZ3JvdXA7CisJY2hpcC0+aW5kaW9fZGV2LT5ldmVudF9hdHRycyA9IGFkdDc0MTBfZXZlbnRfYXR0cmlidXRlX2dyb3VwOworCWNoaXAtPmluZGlvX2Rldi0+ZGV2X2RhdGEgPSAodm9pZCAqKWNoaXA7CisJY2hpcC0+aW5kaW9fZGV2LT5kcml2ZXJfbW9kdWxlID0gVEhJU19NT0RVTEU7CisJY2hpcC0+aW5kaW9fZGV2LT5udW1faW50ZXJydXB0X2xpbmVzID0gQURUNzQxMF9JUlFTOworCWNoaXAtPmluZGlvX2Rldi0+bW9kZXMgPSBJTkRJT19ESVJFQ1RfTU9ERTsKKworCXJldCA9IGlpb19kZXZpY2VfcmVnaXN0ZXIoY2hpcC0+aW5kaW9fZGV2KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX2ZyZWVfZGV2OworCisJLyogQ1QgY3JpdGNhbCB0ZW1wZXJhdHVyZSBldmVudC4gbGluZSAwICovCisJaWYgKGNsaWVudC0+aXJxKSB7CisJCXJldCA9IGlpb19yZWdpc3Rlcl9pbnRlcnJ1cHRfbGluZShjbGllbnQtPmlycSwKKwkJCQljaGlwLT5pbmRpb19kZXYsCisJCQkJMCwKKwkJCQlJUlFGX1RSSUdHRVJfTE9XLAorCQkJCWNoaXAtPm5hbWUpOworCQlpZiAocmV0KQorCQkJZ290byBlcnJvcl91bnJlZ19kZXY7CisKKwkJLyoKKwkJICogVGhlIGV2ZW50IGhhbmRsZXIgbGlzdCBlbGVtZW50IHJlZmVyIHRvIGlpb19ldmVudF9hZHQ3NDEwLgorCQkgKiBBbGwgZXZlbnQgYXR0cmlidXRlcyBiaW5kIHRvIHRoZSBzYW1lIGV2ZW50IGhhbmRsZXIuCisJCSAqIE9uZSBldmVudCBoYW5kbGVyIGNhbiBvbmx5IGJlIGFkZGVkIHRvIG9uZSBldmVudCBsaXN0LgorCQkgKi8KKwkJaWlvX2FkZF9ldmVudF90b19saXN0KCZpaW9fZXZlbnRfYWR0NzQxMCwKKwkJCQkmY2hpcC0+aW5kaW9fZGV2LT5pbnRlcnJ1cHRzWzBdLT5ldl9saXN0KTsKKwl9CisKKwkvKiBJTlQgYm91bmQgdGVtcGVyYXR1cmUgYWxhcm0gZXZlbnQuIGxpbmUgMSAqLworCWlmIChhZHQ3NDEwX3BsYXRmb3JtX2RhdGFbMF0pIHsKKwkJcmV0ID0gaWlvX3JlZ2lzdGVyX2ludGVycnVwdF9saW5lKGFkdDc0MTBfcGxhdGZvcm1fZGF0YVswXSwKKwkJCQljaGlwLT5pbmRpb19kZXYsCisJCQkJMSwKKwkJCQlhZHQ3NDEwX3BsYXRmb3JtX2RhdGFbMV0sCisJCQkJY2hpcC0+bmFtZSk7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycm9yX3VucmVnX2N0X2lycTsKKworCQkvKgorCQkgKiBUaGUgZXZlbnQgaGFuZGxlciBsaXN0IGVsZW1lbnQgcmVmZXIgdG8gaWlvX2V2ZW50X2FkdDc0MTAuCisJCSAqIEFsbCBldmVudCBhdHRyaWJ1dGVzIGJpbmQgdG8gdGhlIHNhbWUgZXZlbnQgaGFuZGxlci4KKwkJICogT25lIGV2ZW50IGhhbmRsZXIgY2FuIG9ubHkgYmUgYWRkZWQgdG8gb25lIGV2ZW50IGxpc3QuCisJCSAqLworCQlpaW9fYWRkX2V2ZW50X3RvX2xpc3QoJmlpb19ldmVudF9hZHQ3NDEwX2N0LAorCQkJCSZjaGlwLT5pbmRpb19kZXYtPmludGVycnVwdHNbMV0tPmV2X2xpc3QpOworCX0KKworCWlmIChjbGllbnQtPmlycSAmJiBhZHQ3NDEwX3BsYXRmb3JtX2RhdGFbMF0pIHsKKwkJSU5JVF9XT1JLKCZjaGlwLT50aHJlc2hfd29yaywgYWR0NzQxMF9pbnRlcnJ1cHRfYmgpOworCisJCXJldCA9IGFkdDc0MTBfaTJjX3JlYWRfYnl0ZShjaGlwLCBBRFQ3NDEwX0NPTkZJRywgJmNoaXAtPmNvbmZpZyk7CisJCWlmIChyZXQpIHsKKwkJCXJldCA9IC1FSU87CisJCQlnb3RvIGVycm9yX3VucmVnX2ludF9pcnE7CisJCX0KKworCQkvKiBzZXQgaXJxIHBvbGFyaXR5IGxvdyBsZXZlbCAqLworCQljaGlwLT5jb25maWcgJj0gfkFEVDc0MTBfQ1RfUE9MQVJJVFk7CisKKwkJaWYgKGFkdDc0MTBfcGxhdGZvcm1fZGF0YVsxXSAmIElSUUZfVFJJR0dFUl9ISUdIKQorCQkJY2hpcC0+Y29uZmlnIHw9IEFEVDc0MTBfSU5UX1BPTEFSSVRZOworCQllbHNlCisJCQljaGlwLT5jb25maWcgJj0gfkFEVDc0MTBfSU5UX1BPTEFSSVRZOworCisJCXJldCA9IGFkdDc0MTBfaTJjX3dyaXRlX2J5dGUoY2hpcCwgQURUNzQxMF9DT05GSUcsIGNoaXAtPmNvbmZpZyk7CisJCWlmIChyZXQpIHsKKwkJCXJldCA9IC1FSU87CisJCQlnb3RvIGVycm9yX3VucmVnX2ludF9pcnE7CisJCX0KKwl9CisKKwlkZXZfaW5mbygmY2xpZW50LT5kZXYsICIlcyB0ZW1wZXJhdHVyZSBzZW5zb3IgcmVnaXN0ZXJlZC5cbiIsCisJCQkgaWQtPm5hbWUpOworCisJcmV0dXJuIDA7CisKK2Vycm9yX3VucmVnX2ludF9pcnE6CisJaWlvX3VucmVnaXN0ZXJfaW50ZXJydXB0X2xpbmUoY2hpcC0+aW5kaW9fZGV2LCAxKTsKK2Vycm9yX3VucmVnX2N0X2lycToKKwlpaW9fdW5yZWdpc3Rlcl9pbnRlcnJ1cHRfbGluZShjaGlwLT5pbmRpb19kZXYsIDApOworZXJyb3JfdW5yZWdfZGV2OgorCWlpb19kZXZpY2VfdW5yZWdpc3RlcihjaGlwLT5pbmRpb19kZXYpOworZXJyb3JfZnJlZV9kZXY6CisJaWlvX2ZyZWVfZGV2aWNlKGNoaXAtPmluZGlvX2Rldik7CitlcnJvcl9mcmVlX2NoaXA6CisJa2ZyZWUoY2hpcCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBhZHQ3NDEwX3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXN0cnVjdCBhZHQ3NDEwX2NoaXBfaW5mbyAqY2hpcCA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBjaGlwLT5pbmRpb19kZXY7CisJdW5zaWduZWQgbG9uZyAqYWR0NzQxMF9wbGF0Zm9ybV9kYXRhID0gY2xpZW50LT5kZXYucGxhdGZvcm1fZGF0YTsKKworCWlmIChhZHQ3NDEwX3BsYXRmb3JtX2RhdGFbMF0pCisJCWlpb191bnJlZ2lzdGVyX2ludGVycnVwdF9saW5lKGluZGlvX2RldiwgMSk7CisJaWYgKGNsaWVudC0+aXJxKQorCQlpaW9fdW5yZWdpc3Rlcl9pbnRlcnJ1cHRfbGluZShpbmRpb19kZXYsIDApOworCWlpb19kZXZpY2VfdW5yZWdpc3RlcihpbmRpb19kZXYpOworCWlpb19mcmVlX2RldmljZShjaGlwLT5pbmRpb19kZXYpOworCWtmcmVlKGNoaXApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCBhZHQ3NDEwX2lkW10gPSB7CisJeyAiYWR0NzQxMCIsIDAgfSwKKwl7fQorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIGFkdDc0MTBfaWQpOworCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgYWR0NzQxMF9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAiYWR0NzQxMCIsCisJfSwKKwkucHJvYmUgPSBhZHQ3NDEwX3Byb2JlLAorCS5yZW1vdmUgPSBfX2RldmV4aXRfcChhZHQ3NDEwX3JlbW92ZSksCisJLmlkX3RhYmxlID0gYWR0NzQxMF9pZCwKK307CisKK3N0YXRpYyBfX2luaXQgaW50IGFkdDc0MTBfaW5pdCh2b2lkKQoreworCXJldHVybiBpMmNfYWRkX2RyaXZlcigmYWR0NzQxMF9kcml2ZXIpOworfQorCitzdGF0aWMgX19leGl0IHZvaWQgYWR0NzQxMF9leGl0KHZvaWQpCit7CisJaTJjX2RlbF9kcml2ZXIoJmFkdDc0MTBfZHJpdmVyKTsKK30KKworTU9EVUxFX0FVVEhPUigiU29uaWMgWmhhbmcgPHNvbmljLnpoYW5nQGFuYWxvZy5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkFuYWxvZyBEZXZpY2VzIEFEVDc0MTAgZGlnaXRhbCIKKwkJCSIgdGVtcGVyYXR1cmUgc2Vuc29yIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOworCittb2R1bGVfaW5pdChhZHQ3NDEwX2luaXQpOworbW9kdWxlX2V4aXQoYWR0NzQxMF9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRjL2FkdDc1LmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9hZHQ3NS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmZjRkMzEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9hZHQ3NS5jCkBAIC0wLDAgKzEsNzMyIEBACisvKgorICogQURUNzUgZGlnaXRhbCB0ZW1wZXJhdHVyZSBzZW5zb3IgZHJpdmVyIHN1cHBvcnRpbmcgQURUNzUKKyAqCisgKiBDb3B5cmlnaHQgMjAxMCBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L3J0Yy5oPgorCisjaW5jbHVkZSAiLi4vaWlvLmgiCisjaW5jbHVkZSAiLi4vc3lzZnMuaCIKKworLyoKKyAqIEFEVDc1IHJlZ2lzdGVycyBkZWZpbml0aW9uCisgKi8KKworI2RlZmluZSBBRFQ3NV9URU1QRVJBVFVSRQkJMAorI2RlZmluZSBBRFQ3NV9DT05GSUcJCQkxCisjZGVmaW5lIEFEVDc1X1RfSFlTVAkJCTIKKyNkZWZpbmUgQURUNzVfVF9PUwkJCTMKKyNkZWZpbmUgQURUNzVfT05FU0hPVAkJCTQKKworLyoKKyAqIEFEVDc1IGNvbmZpZworICovCisjZGVmaW5lIEFEVDc1X1BECQkJMHgxCisjZGVmaW5lIEFEVDc1X09TX0lOVAkJCTB4MgorI2RlZmluZSBBRFQ3NV9PU19QT0xBUklUWQkJMHg0CisjZGVmaW5lIEFEVDc1X0ZBVUxUX1FVRVVFX01BU0sJCTB4MTgKKyNkZWZpbmUgQURUNzVfRkFVTFRfUVVFVUVfT0ZGU0VUCTMKKyNkZWZpbmUgQURUNzVfU01CVVNfQUxBUlQJCTB4OAorCisvKgorICogQURUNzUgbWFza3MKKyAqLworI2RlZmluZSBBRFQ3NV9WQUxVRV9TSUdOCQkweDgwMAorI2RlZmluZSBBRFQ3NV9WQUxVRV9PRkZTRVQJCTQKKyNkZWZpbmUgQURUNzVfVkFMVUVfRkxPQVRfT0ZGU0VUCTQKKyNkZWZpbmUgQURUNzVfVkFMVUVfRkxPQVRfTUFTSwkJMHhGCisKKworLyoKKyAqIHN0cnVjdCBhZHQ3NV9jaGlwX2luZm8gLSBjaGlwIHNwZWNpZmMgaW5mb3JtYXRpb24KKyAqLworCitzdHJ1Y3QgYWR0NzVfY2hpcF9pbmZvIHsKKwljb25zdCBjaGFyICpuYW1lOworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQ7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldjsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgdGhyZXNoX3dvcms7CisJczY0IGxhc3RfdGltZXN0YW1wOworCXU4ICBjb25maWc7Cit9OworCisvKgorICogYWR0NzUgcmVnaXN0ZXIgYWNjZXNzIGJ5IEkyQworICovCisKK3N0YXRpYyBpbnQgYWR0NzVfaTJjX3JlYWQoc3RydWN0IGFkdDc1X2NoaXBfaW5mbyAqY2hpcCwgdTggcmVnLCB1OCAqZGF0YSkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gY2hpcC0+Y2xpZW50OworCWludCByZXQgPSAwLCBsZW47CisKKwlyZXQgPSBpMmNfc21idXNfd3JpdGVfYnl0ZShjbGllbnQsIHJlZyk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJJMkMgcmVhZCByZWdpc3RlciBhZGRyZXNzIGVycm9yXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlpZiAocmVnID09IEFEVDc1X0NPTkZJRyB8fCByZWcgPT0gQURUNzVfT05FU0hPVCkKKwkJbGVuID0gMTsKKwllbHNlCisJCWxlbiA9IDI7CisKKwlyZXQgPSBpMmNfbWFzdGVyX3JlY3YoY2xpZW50LCBkYXRhLCBsZW4pOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiSTJDIHJlYWQgZXJyb3JcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYWR0NzVfaTJjX3dyaXRlKHN0cnVjdCBhZHQ3NV9jaGlwX2luZm8gKmNoaXAsIHU4IHJlZywgdTggZGF0YSkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gY2hpcC0+Y2xpZW50OworCWludCByZXQgPSAwOworCisJaWYgKHJlZyA9PSBBRFQ3NV9DT05GSUcgfHwgcmVnID09IEFEVDc1X09ORVNIT1QpCisJCXJldCA9IGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCByZWcsIGRhdGEpOworCWVsc2UKKwkJcmV0ID0gaTJjX3NtYnVzX3dyaXRlX3dvcmRfZGF0YShjbGllbnQsIHJlZywgZGF0YSk7CisKKwlpZiAocmV0IDwgMCkKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJJMkMgd3JpdGUgZXJyb3JcbiIpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QgYWR0NzVfc2hvd19tb2RlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWR0NzVfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCisJaWYgKGNoaXAtPmNvbmZpZyAmIEFEVDc1X1BEKQorCQlyZXR1cm4gc3ByaW50ZihidWYsICJwb3dlci1zYXZlXG4iKTsKKwllbHNlCisJCXJldHVybiBzcHJpbnRmKGJ1ZiwgImZ1bGxcbiIpOworfQorCitzdGF0aWMgc3NpemVfdCBhZHQ3NV9zdG9yZV9tb2RlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWR0NzVfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCWludCByZXQ7CisJdTggY29uZmlnOworCisJcmV0ID0gYWR0NzVfaTJjX3JlYWQoY2hpcCwgQURUNzVfQ09ORklHLCAmY2hpcC0+Y29uZmlnKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gLUVJTzsKKworCWNvbmZpZyA9IGNoaXAtPmNvbmZpZyAmIH5BRFQ3NV9QRDsKKwlpZiAoIXN0cmNtcChidWYsICJmdWxsIikpCisJCWNvbmZpZyB8PSBBRFQ3NV9QRDsKKworCXJldCA9IGFkdDc1X2kyY193cml0ZShjaGlwLCBBRFQ3NV9DT05GSUcsIGNvbmZpZyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIC1FSU87CisKKwljaGlwLT5jb25maWcgPSBjb25maWc7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKG1vZGUsIFNfSVJVR08gfCBTX0lXVVNSLAorCQlhZHQ3NV9zaG93X21vZGUsCisJCWFkdDc1X3N0b3JlX21vZGUsCisJCTApOworCitzdGF0aWMgc3NpemVfdCBhZHQ3NV9zaG93X2F2YWlsYWJsZV9tb2RlcyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiZnVsbFxucG93ZXItZG93blxuIik7Cit9CisKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIoYXZhaWxhYmxlX21vZGVzLCBTX0lSVUdPLCBhZHQ3NV9zaG93X2F2YWlsYWJsZV9tb2RlcywgTlVMTCwgMCk7CisKK3N0YXRpYyBzc2l6ZV90IGFkdDc1X3Nob3dfb25lc2hvdChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkdDc1X2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCAhIShjaGlwLT5jb25maWcgJiBBRFQ3NV9PTkVTSE9UKSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkdDc1X3N0b3JlX29uZXNob3Qoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgbGVuKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZHQ3NV9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisJdW5zaWduZWQgbG9uZyBkYXRhID0gMDsKKwlpbnQgcmV0OworCXU4IGNvbmZpZzsKKworCXJldCA9IHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMTAsICZkYXRhKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCisJcmV0ID0gYWR0NzVfaTJjX3JlYWQoY2hpcCwgQURUNzVfQ09ORklHLCAmY2hpcC0+Y29uZmlnKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gLUVJTzsKKworCWNvbmZpZyA9IGNoaXAtPmNvbmZpZyAmIH5BRFQ3NV9PTkVTSE9UOworCWlmIChkYXRhKQorCQljb25maWcgfD0gQURUNzVfT05FU0hPVDsKKworCXJldCA9IGFkdDc1X2kyY193cml0ZShjaGlwLCBBRFQ3NV9DT05GSUcsIGNvbmZpZyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIC1FSU87CisKKwljaGlwLT5jb25maWcgPSBjb25maWc7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKG9uZXNob3QsIFNfSVJVR08gfCBTX0lXVVNSLAorCQlhZHQ3NV9zaG93X29uZXNob3QsCisJCWFkdDc1X3N0b3JlX29uZXNob3QsCisJCTApOworCitzdGF0aWMgc3NpemVfdCBhZHQ3NV9zaG93X3ZhbHVlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWR0NzVfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCXUxNiBkYXRhOworCWNoYXIgc2lnbiA9ICcgJzsKKwlpbnQgcmV0OworCisJaWYgKGNoaXAtPmNvbmZpZyAmIEFEVDc1X1BEKSB7CisJCWRldl9lcnIoZGV2LCAiQ2FuJ3QgcmVhZCB2YWx1ZSBpbiBwb3dlci1kb3duIG1vZGUuXG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJaWYgKGNoaXAtPmNvbmZpZyAmIEFEVDc1X09ORVNIT1QpIHsKKwkJLyogd3JpdGUgdG8gYWN0aXZlIGNvbnZlcnRlciAqLworCQlyZXQgPSBpMmNfc21idXNfd3JpdGVfYnl0ZShjaGlwLT5jbGllbnQsIEFEVDc1X09ORVNIT1QpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIC1FSU87CisJfQorCisJcmV0ID0gYWR0NzVfaTJjX3JlYWQoY2hpcCwgQURUNzVfVEVNUEVSQVRVUkUsICh1OCAqKSZkYXRhKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gLUVJTzsKKworCWRhdGEgPSBzd2FiMTYoZGF0YSkgPj4gQURUNzVfVkFMVUVfT0ZGU0VUOworCWlmIChkYXRhICYgQURUNzVfVkFMVUVfU0lHTikgeworCQkvKiBjb252ZXJ0IHN1cHBsZW1lbnQgdG8gcG9zaXRpdmUgdmFsdWUgKi8KKwkJZGF0YSA9IChBRFQ3NV9WQUxVRV9TSUdOIDw8IDEpIC0gZGF0YTsKKwkJc2lnbiA9ICctJzsKKwl9CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlYyVkLiUuNGRcbiIsIHNpZ24sCisJCShkYXRhID4+IEFEVDc1X1ZBTFVFX0ZMT0FUX09GRlNFVCksCisJCShkYXRhICYgQURUNzVfVkFMVUVfRkxPQVRfTUFTSykgKiA2MjUpOworfQorCitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKHZhbHVlLCBTX0lSVUdPLCBhZHQ3NV9zaG93X3ZhbHVlLCBOVUxMLCAwKTsKKworc3RhdGljIHNzaXplX3QgYWR0NzVfc2hvd19uYW1lKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWR0NzVfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVzXG4iLCBjaGlwLT5uYW1lKTsKK30KKworc3RhdGljIElJT19ERVZJQ0VfQVRUUihuYW1lLCBTX0lSVUdPLCBhZHQ3NV9zaG93X25hbWUsIE5VTEwsIDApOworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqYWR0NzVfYXR0cmlidXRlc1tdID0geworCSZpaW9fZGV2X2F0dHJfYXZhaWxhYmxlX21vZGVzLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9tb2RlLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9vbmVzaG90LmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl92YWx1ZS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfbmFtZS5kZXZfYXR0ci5hdHRyLAorCU5VTEwsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBhZHQ3NV9hdHRyaWJ1dGVfZ3JvdXAgPSB7CisJLmF0dHJzID0gYWR0NzVfYXR0cmlidXRlcywKK307CisKKy8qCisgKiB0ZW1wZXJhdHVyZSBib3VuZCBldmVudHMKKyAqLworCisjZGVmaW5lIElJT19FVkVOVF9DT0RFX0FEVDc1X09USSAgICBJSU9fQlVGRkVSX0VWRU5UX0NPREUoMCkKKworc3RhdGljIHZvaWQgYWR0NzVfaW50ZXJydXB0X2JoKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29ya19zKQoreworCXN0cnVjdCBhZHQ3NV9jaGlwX2luZm8gKmNoaXAgPQorCQljb250YWluZXJfb2Yod29ya19zLCBzdHJ1Y3QgYWR0NzVfY2hpcF9pbmZvLCB0aHJlc2hfd29yayk7CisKKwllbmFibGVfaXJxKGNoaXAtPmNsaWVudC0+aXJxKTsKKworCWlpb19wdXNoX2V2ZW50KGNoaXAtPmluZGlvX2RldiwgMCwKKwkJCUlJT19FVkVOVF9DT0RFX0FEVDc1X09USSwKKwkJCWNoaXAtPmxhc3RfdGltZXN0YW1wKTsKK30KKworc3RhdGljIGludCBhZHQ3NV9pbnRlcnJ1cHQoc3RydWN0IGlpb19kZXYgKmRldl9pbmZvLAorCQlpbnQgaW5kZXgsCisJCXM2NCB0aW1lc3RhbXAsCisJCWludCBub190ZXN0KQoreworCXN0cnVjdCBhZHQ3NV9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisKKwljaGlwLT5sYXN0X3RpbWVzdGFtcCA9IHRpbWVzdGFtcDsKKwlzY2hlZHVsZV93b3JrKCZjaGlwLT50aHJlc2hfd29yayk7CisKKwlyZXR1cm4gMDsKK30KKworSUlPX0VWRU5UX1NIKGFkdDc1LCAmYWR0NzVfaW50ZXJydXB0KTsKKworc3RhdGljIHNzaXplX3QgYWR0NzVfc2hvd19vdGlfbW9kZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkdDc1X2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKwlpbnQgcmV0OworCisJLyogcmV0cml2ZSBBTEFSVCBzdGF0dXMgKi8KKwlyZXQgPSBhZHQ3NV9pMmNfcmVhZChjaGlwLCBBRFQ3NV9DT05GSUcsICZjaGlwLT5jb25maWcpOworCWlmIChyZXQpCisJCXJldHVybiAtRUlPOworCisJaWYgKGNoaXAtPmNvbmZpZyAmIEFEVDc1X09TX0lOVCkKKwkJcmV0dXJuIHNwcmludGYoYnVmLCAiaW50ZXJydXB0XG4iKTsKKwllbHNlCisJCXJldHVybiBzcHJpbnRmKGJ1ZiwgImNvbXBhcmF0b3JcbiIpOworfQorCitzdGF0aWMgc3NpemVfdCBhZHQ3NV9zZXRfb3RpX21vZGUoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgbGVuKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZHQ3NV9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisJaW50IHJldDsKKwl1OCBjb25maWc7CisKKwkvKiByZXRyaXZlIEFMQVJUIHN0YXR1cyAqLworCXJldCA9IGFkdDc1X2kyY19yZWFkKGNoaXAsIEFEVDc1X0NPTkZJRywgJmNoaXAtPmNvbmZpZyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIC1FSU87CisKKwljb25maWcgPSBjaGlwLT5jb25maWcgJiB+QURUNzVfT1NfSU5UOworCWlmIChzdHJjbXAoYnVmLCAiY29tcGFyYXRvciIpICE9IDApCisJCWNvbmZpZyB8PSBBRFQ3NV9PU19JTlQ7CisKKwlyZXQgPSBhZHQ3NV9pMmNfd3JpdGUoY2hpcCwgQURUNzVfQ09ORklHLCBjb25maWcpOworCWlmIChyZXQpCisJCXJldHVybiAtRUlPOworCisJY2hpcC0+Y29uZmlnID0gY29uZmlnOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QgYWR0NzVfc2hvd19hdmFpbGFibGVfb3RpX21vZGVzKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gc3ByaW50ZihidWYsICJjb21wYXJhdG9yXG5pbnRlcnJ1cHRcbiIpOworfQorCitzdGF0aWMgc3NpemVfdCBhZHQ3NV9zaG93X3NtYnVzX2FsYXJ0KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWR0NzVfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCWludCByZXQ7CisKKwkvKiByZXRyaXZlIEFMQVJUIHN0YXR1cyAqLworCXJldCA9IGFkdDc1X2kyY19yZWFkKGNoaXAsIEFEVDc1X0NPTkZJRywgJmNoaXAtPmNvbmZpZyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIC1FSU87CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgISEoY2hpcC0+Y29uZmlnICYgQURUNzVfU01CVVNfQUxBUlQpKTsKK30KKworc3RhdGljIHNzaXplX3QgYWR0NzVfc2V0X3NtYnVzX2FsYXJ0KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWR0NzVfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZGF0YSA9IDA7CisJaW50IHJldDsKKwl1OCBjb25maWc7CisKKwlyZXQgPSBzdHJpY3Rfc3RydG91bChidWYsIDEwLCAmZGF0YSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiByZXRyaXZlIEFMQVJUIHN0YXR1cyAqLworCXJldCA9IGFkdDc1X2kyY19yZWFkKGNoaXAsIEFEVDc1X0NPTkZJRywgJmNoaXAtPmNvbmZpZyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIC1FSU87CisKKwljb25maWcgPSBjaGlwLT5jb25maWcgJiB+QURUNzVfU01CVVNfQUxBUlQ7CisJaWYgKGRhdGEpCisJCWNvbmZpZyB8PSBBRFQ3NV9TTUJVU19BTEFSVDsKKworCXJldCA9IGFkdDc1X2kyY193cml0ZShjaGlwLCBBRFQ3NV9DT05GSUcsIGNvbmZpZyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIC1FSU87CisKKwljaGlwLT5jb25maWcgPSBjb25maWc7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3NpemVfdCBhZHQ3NV9zaG93X2ZhdWx0X3F1ZXVlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWR0NzVfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCWludCByZXQ7CisKKwkvKiByZXRyaXZlIEFMQVJUIHN0YXR1cyAqLworCXJldCA9IGFkdDc1X2kyY19yZWFkKGNoaXAsIEFEVDc1X0NPTkZJRywgJmNoaXAtPmNvbmZpZyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIC1FSU87CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgKGNoaXAtPmNvbmZpZyAmIEFEVDc1X0ZBVUxUX1FVRVVFX01BU0spID4+CisJCQkJQURUNzVfRkFVTFRfUVVFVUVfT0ZGU0VUKTsKK30KKworc3RhdGljIHNzaXplX3QgYWR0NzVfc2V0X2ZhdWx0X3F1ZXVlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWR0NzVfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZGF0YTsKKwlpbnQgcmV0OworCXU4IGNvbmZpZzsKKworCXJldCA9IHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMTAsICZkYXRhKTsKKwlpZiAocmV0IHx8IGRhdGEgPiAzKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIHJldHJpdmUgQUxBUlQgc3RhdHVzICovCisJcmV0ID0gYWR0NzVfaTJjX3JlYWQoY2hpcCwgQURUNzVfQ09ORklHLCAmY2hpcC0+Y29uZmlnKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gLUVJTzsKKworCWNvbmZpZyA9IGNoaXAtPmNvbmZpZyAmIH5BRFQ3NV9GQVVMVF9RVUVVRV9NQVNLOworCWNvbmZpZyB8PSAoZGF0YSA8PCBBRFQ3NV9GQVVMVF9RVUVVRV9PRkZTRVQpOworCXJldCA9IGFkdDc1X2kyY193cml0ZShjaGlwLCBBRFQ3NV9DT05GSUcsIGNvbmZpZyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIC1FSU87CisKKwljaGlwLT5jb25maWcgPSBjb25maWc7CisKKwlyZXR1cm4gcmV0OworfQorc3RhdGljIGlubGluZSBzc2l6ZV90IGFkdDc1X3Nob3dfdF9ib3VuZChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQl1OCBib3VuZF9yZWcsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWR0NzVfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCXUxNiBkYXRhOworCWNoYXIgc2lnbiA9ICcgJzsKKwlpbnQgcmV0OworCisJcmV0ID0gYWR0NzVfaTJjX3JlYWQoY2hpcCwgYm91bmRfcmVnLCAodTggKikmZGF0YSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIC1FSU87CisKKwlkYXRhID0gc3dhYjE2KGRhdGEpID4+IEFEVDc1X1ZBTFVFX09GRlNFVDsKKwlpZiAoZGF0YSAmIEFEVDc1X1ZBTFVFX1NJR04pIHsKKwkJLyogY29udmVydCBzdXBwbGVtZW50IHRvIHBvc2l0aXZlIHZhbHVlICovCisJCWRhdGEgPSAoQURUNzVfVkFMVUVfU0lHTiA8PCAxKSAtIGRhdGE7CisJCXNpZ24gPSAnLSc7CisJfQorCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWMlZC4lLjRkXG4iLCBzaWduLAorCQkoZGF0YSA+PiBBRFQ3NV9WQUxVRV9GTE9BVF9PRkZTRVQpLAorCQkoZGF0YSAmIEFEVDc1X1ZBTFVFX0ZMT0FUX01BU0spICogNjI1KTsKK30KKworc3RhdGljIGlubGluZSBzc2l6ZV90IGFkdDc1X3NldF90X2JvdW5kKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCXU4IGJvdW5kX3JlZywKKwkJY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgbGVuKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZHQ3NV9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisJbG9uZyB0bXAxLCB0bXAyOworCXUxNiBkYXRhOworCWNoYXIgKnBvczsKKwlpbnQgcmV0OworCisJcG9zID0gc3RyY2hyKGJ1ZiwgJy4nKTsKKworCXJldCA9IHN0cmljdF9zdHJ0b2woYnVmLCAxMCwgJnRtcDEpOworCisJaWYgKHJldCB8fCB0bXAxID4gMTI3IHx8IHRtcDEgPCAtMTI4KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChwb3MpIHsKKwkJbGVuID0gc3RybGVuKHBvcyk7CisJCWlmIChsZW4gPiBBRFQ3NV9WQUxVRV9GTE9BVF9PRkZTRVQpCisJCQlsZW4gPSBBRFQ3NV9WQUxVRV9GTE9BVF9PRkZTRVQ7CisJCXBvc1tsZW5dID0gMDsKKwkJcmV0ID0gc3RyaWN0X3N0cnRvbChwb3MsIDEwLCAmdG1wMik7CisKKwkJaWYgKCFyZXQpCisJCQl0bXAyID0gKHRtcDIgLyA2MjUpICogNjI1OworCX0KKworCWlmICh0bXAxIDwgMCkKKwkJZGF0YSA9ICh1MTYpKC10bXAxKTsKKwllbHNlCisJCWRhdGEgPSAodTE2KXRtcDE7CisJZGF0YSA9IChkYXRhIDw8IEFEVDc1X1ZBTFVFX0ZMT0FUX09GRlNFVCkgfCAodG1wMiAmIEFEVDc1X1ZBTFVFX0ZMT0FUX01BU0spOworCWlmICh0bXAxIDwgMCkKKwkJLyogY29udmVydCBwb3NpdGl2ZSB2YWx1ZSB0byBzdXBwbHltZW50ICovCisJCWRhdGEgPSAoQURUNzVfVkFMVUVfU0lHTiA8PCAxKSAtIGRhdGE7CisJZGF0YSA8PD0gQURUNzVfVkFMVUVfT0ZGU0VUOworCWRhdGEgPSBzd2FiMTYoZGF0YSk7CisKKwlyZXQgPSBhZHQ3NV9pMmNfd3JpdGUoY2hpcCwgYm91bmRfcmVnLCAodTgpZGF0YSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIC1FSU87CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3NpemVfdCBhZHQ3NV9zaG93X3Rfb3Moc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXJldHVybiBhZHQ3NV9zaG93X3RfYm91bmQoZGV2LCBhdHRyLAorCQkJQURUNzVfVF9PUywgYnVmKTsKK30KKworc3RhdGljIGlubGluZSBzc2l6ZV90IGFkdDc1X3NldF90X29zKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlyZXR1cm4gYWR0NzVfc2V0X3RfYm91bmQoZGV2LCBhdHRyLAorCQkJQURUNzVfVF9PUywgYnVmLCBsZW4pOworfQorCitzdGF0aWMgc3NpemVfdCBhZHQ3NV9zaG93X3RfaHlzdChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJcmV0dXJuIGFkdDc1X3Nob3dfdF9ib3VuZChkZXYsIGF0dHIsCisJCQlBRFQ3NV9UX0hZU1QsIGJ1Zik7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3NpemVfdCBhZHQ3NV9zZXRfdF9oeXN0KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlyZXR1cm4gYWR0NzVfc2V0X3RfYm91bmQoZGV2LCBhdHRyLAorCQkJQURUNzVfVF9IWVNULCBidWYsIGxlbik7Cit9CisKK0lJT19FVkVOVF9BVFRSX1NIKG90aV9tb2RlLCBpaW9fZXZlbnRfYWR0NzUsCisJCWFkdDc1X3Nob3dfb3RpX21vZGUsIGFkdDc1X3NldF9vdGlfbW9kZSwgMCk7CitJSU9fRVZFTlRfQVRUUl9TSChhdmFpbGFibGVfb3RpX21vZGVzLCBpaW9fZXZlbnRfYWR0NzUsCisJCWFkdDc1X3Nob3dfYXZhaWxhYmxlX290aV9tb2RlcywgTlVMTCwgMCk7CitJSU9fRVZFTlRfQVRUUl9TSChzbWJ1c19hbGFydCwgaWlvX2V2ZW50X2FkdDc1LAorCQlhZHQ3NV9zaG93X3NtYnVzX2FsYXJ0LCBhZHQ3NV9zZXRfc21idXNfYWxhcnQsIDApOworSUlPX0VWRU5UX0FUVFJfU0goZmF1bHRfcXVldWUsIGlpb19ldmVudF9hZHQ3NSwKKwkJYWR0NzVfc2hvd19mYXVsdF9xdWV1ZSwgYWR0NzVfc2V0X2ZhdWx0X3F1ZXVlLCAwKTsKK0lJT19FVkVOVF9BVFRSX1NIKHRfb3MsIGlpb19ldmVudF9hZHQ3NSwKKwkJYWR0NzVfc2hvd190X29zLCBhZHQ3NV9zZXRfdF9vcywgMCk7CitJSU9fRVZFTlRfQVRUUl9TSCh0X2h5c3QsIGlpb19ldmVudF9hZHQ3NSwKKwkJYWR0NzVfc2hvd190X2h5c3QsIGFkdDc1X3NldF90X2h5c3QsIDApOworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqYWR0NzVfZXZlbnRfYXR0cmlidXRlc1tdID0geworCSZpaW9fZXZlbnRfYXR0cl9vdGlfbW9kZS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZXZlbnRfYXR0cl9hdmFpbGFibGVfb3RpX21vZGVzLmRldl9hdHRyLmF0dHIsCisJJmlpb19ldmVudF9hdHRyX3NtYnVzX2FsYXJ0LmRldl9hdHRyLmF0dHIsCisJJmlpb19ldmVudF9hdHRyX2ZhdWx0X3F1ZXVlLmRldl9hdHRyLmF0dHIsCisJJmlpb19ldmVudF9hdHRyX3Rfb3MuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2V2ZW50X2F0dHJfdF9oeXN0LmRldl9hdHRyLmF0dHIsCisJTlVMTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGFkdDc1X2V2ZW50X2F0dHJpYnV0ZV9ncm91cCA9IHsKKwkuYXR0cnMgPSBhZHQ3NV9ldmVudF9hdHRyaWJ1dGVzLAorfTsKKworLyoKKyAqIGRldmljZSBwcm9iZSBhbmQgcmVtb3ZlCisgKi8KKworc3RhdGljIGludCBfX2RldmluaXQgYWR0NzVfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKKwkJY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQoreworCXN0cnVjdCBhZHQ3NV9jaGlwX2luZm8gKmNoaXA7CisJaW50IHJldCA9IDA7CisKKwljaGlwID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGFkdDc1X2NoaXBfaW5mbyksIEdGUF9LRVJORUwpOworCisJaWYgKGNoaXAgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkvKiB0aGlzIGlzIG9ubHkgdXNlZCBmb3IgZGV2aWNlIHJlbW92YWwgcHVycG9zZXMgKi8KKwlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBjaGlwKTsKKworCWNoaXAtPmNsaWVudCA9IGNsaWVudDsKKwljaGlwLT5uYW1lID0gaWQtPm5hbWU7CisKKwljaGlwLT5pbmRpb19kZXYgPSBpaW9fYWxsb2NhdGVfZGV2aWNlKCk7CisJaWYgKGNoaXAtPmluZGlvX2RldiA9PSBOVUxMKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3JfZnJlZV9jaGlwOworCX0KKworCWNoaXAtPmluZGlvX2Rldi0+ZGV2LnBhcmVudCA9ICZjbGllbnQtPmRldjsKKwljaGlwLT5pbmRpb19kZXYtPmF0dHJzID0gJmFkdDc1X2F0dHJpYnV0ZV9ncm91cDsKKwljaGlwLT5pbmRpb19kZXYtPmV2ZW50X2F0dHJzID0gJmFkdDc1X2V2ZW50X2F0dHJpYnV0ZV9ncm91cDsKKwljaGlwLT5pbmRpb19kZXYtPmRldl9kYXRhID0gKHZvaWQgKiljaGlwOworCWNoaXAtPmluZGlvX2Rldi0+ZHJpdmVyX21vZHVsZSA9IFRISVNfTU9EVUxFOworCWNoaXAtPmluZGlvX2Rldi0+bnVtX2ludGVycnVwdF9saW5lcyA9IDE7CisJY2hpcC0+aW5kaW9fZGV2LT5tb2RlcyA9IElORElPX0RJUkVDVF9NT0RFOworCisJcmV0ID0gaWlvX2RldmljZV9yZWdpc3RlcihjaGlwLT5pbmRpb19kZXYpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfZnJlZV9kZXY7CisKKwlpZiAoY2xpZW50LT5pcnEgPiAwKSB7CisJCXJldCA9IGlpb19yZWdpc3Rlcl9pbnRlcnJ1cHRfbGluZShjbGllbnQtPmlycSwKKwkJCQljaGlwLT5pbmRpb19kZXYsCisJCQkJMCwKKwkJCQlJUlFGX1RSSUdHRVJfTE9XLAorCQkJCWNoaXAtPm5hbWUpOworCQlpZiAocmV0KQorCQkJZ290byBlcnJvcl91bnJlZ19kZXY7CisKKwkJLyoKKwkJICogVGhlIGV2ZW50IGhhbmRsZXIgbGlzdCBlbGVtZW50IHJlZmVyIHRvIGlpb19ldmVudF9hZHQ3NS4KKwkJICogQWxsIGV2ZW50IGF0dHJpYnV0ZXMgYmluZCB0byB0aGUgc2FtZSBldmVudCBoYW5kbGVyLgorCQkgKiBTbywgb25seSByZWdpc3RlciBldmVudCBoYW5kbGVyIG9uY2UuCisJCSAqLworCQlpaW9fYWRkX2V2ZW50X3RvX2xpc3QoJmlpb19ldmVudF9hZHQ3NSwKKwkJCQkmY2hpcC0+aW5kaW9fZGV2LT5pbnRlcnJ1cHRzWzBdLT5ldl9saXN0KTsKKworCQlJTklUX1dPUksoJmNoaXAtPnRocmVzaF93b3JrLCBhZHQ3NV9pbnRlcnJ1cHRfYmgpOworCisJCXJldCA9IGFkdDc1X2kyY19yZWFkKGNoaXAsIEFEVDc1X0NPTkZJRywgJmNoaXAtPmNvbmZpZyk7CisJCWlmIChyZXQpIHsKKwkJCXJldCA9IC1FSU87CisJCQlnb3RvIGVycm9yX3VucmVnX2lycTsKKwkJfQorCisJCS8qIHNldCBpcnEgcG9sYXJpdHkgbG93IGxldmVsICovCisJCWNoaXAtPmNvbmZpZyAmPSB+QURUNzVfT1NfUE9MQVJJVFk7CisKKwkJcmV0ID0gYWR0NzVfaTJjX3dyaXRlKGNoaXAsIEFEVDc1X0NPTkZJRywgY2hpcC0+Y29uZmlnKTsKKwkJaWYgKHJldCkgeworCQkJcmV0ID0gLUVJTzsKKwkJCWdvdG8gZXJyb3JfdW5yZWdfaXJxOworCQl9CisJfQorCisJZGV2X2luZm8oJmNsaWVudC0+ZGV2LCAiJXMgdGVtcGVyYXR1cmUgc2Vuc29yIHJlZ2lzdGVyZWQuXG4iLAorCQkJIGlkLT5uYW1lKTsKKworCXJldHVybiAwOworZXJyb3JfdW5yZWdfaXJxOgorCWlpb191bnJlZ2lzdGVyX2ludGVycnVwdF9saW5lKGNoaXAtPmluZGlvX2RldiwgMCk7CitlcnJvcl91bnJlZ19kZXY6CisJaWlvX2RldmljZV91bnJlZ2lzdGVyKGNoaXAtPmluZGlvX2Rldik7CitlcnJvcl9mcmVlX2RldjoKKwlpaW9fZnJlZV9kZXZpY2UoY2hpcC0+aW5kaW9fZGV2KTsKK2Vycm9yX2ZyZWVfY2hpcDoKKwlrZnJlZShjaGlwKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IGFkdDc1X3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXN0cnVjdCBhZHQ3NV9jaGlwX2luZm8gKmNoaXAgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gY2hpcC0+aW5kaW9fZGV2OworCisJaWYgKGNsaWVudC0+aXJxKQorCQlpaW9fdW5yZWdpc3Rlcl9pbnRlcnJ1cHRfbGluZShpbmRpb19kZXYsIDApOworCWlpb19kZXZpY2VfdW5yZWdpc3RlcihpbmRpb19kZXYpOworCWlpb19mcmVlX2RldmljZShjaGlwLT5pbmRpb19kZXYpOworCWtmcmVlKGNoaXApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCBhZHQ3NV9pZFtdID0geworCXsgImFkdDc1IiwgMCB9LAorCXt9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgYWR0NzVfaWQpOworCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgYWR0NzVfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gImFkdDc1IiwKKwl9LAorCS5wcm9iZSA9IGFkdDc1X3Byb2JlLAorCS5yZW1vdmUgPSBfX2RldmV4aXRfcChhZHQ3NV9yZW1vdmUpLAorCS5pZF90YWJsZSA9IGFkdDc1X2lkLAorfTsKKworc3RhdGljIF9faW5pdCBpbnQgYWR0NzVfaW5pdCh2b2lkKQoreworCXJldHVybiBpMmNfYWRkX2RyaXZlcigmYWR0NzVfZHJpdmVyKTsKK30KKworc3RhdGljIF9fZXhpdCB2b2lkIGFkdDc1X2V4aXQodm9pZCkKK3sKKwlpMmNfZGVsX2RyaXZlcigmYWR0NzVfZHJpdmVyKTsKK30KKworTU9EVUxFX0FVVEhPUigiU29uaWMgWmhhbmcgPHNvbmljLnpoYW5nQGFuYWxvZy5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkFuYWxvZyBEZXZpY2VzIEFEVDc1IGRpZ2l0YWwiCisJCQkiIHRlbXBlcmF0dXJlIHNlbnNvciBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKKworbW9kdWxlX2luaXQoYWR0NzVfaW5pdCk7Cittb2R1bGVfZXhpdChhZHQ3NV9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRkYWMvS2NvbmZpZyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRkYWMvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODQ3YmFmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hZGRhYy9LY29uZmlnCkBAIC0wLDAgKzEsMjUgQEAKKyMKKyMgQUREQUMgZHJpdmVycworIworY29tbWVudCAiQW5hbG9nIGRpZ2l0YWwgYmktZGlyZWN0aW9uIGNvbnZlcnRvcnMiCisKK2NvbmZpZyBBRFQ3MzE2CisJdHJpc3RhdGUgIkFuYWxvZyBEZXZpY2VzIEFEVDczMTYvNy84IEFEVDc1MTYvNy85IHRlbXBlcmF0dXJlIHNlbnNvciwgQURDIGFuZCBEQUMgZHJpdmVyIgorCWhlbHAKKwkgIFNheSB5ZXMgaGVyZSB0byBidWlsZCBzdXBwb3J0IGZvciBBbmFsb2cgRGV2aWNlcyBBRFQ3MzE2LCBBRFQ3MzE3LCBBRFQ3MzE4CisJICBhbmQgQURUNzUxNiwgQURUNzUxNywgQURUNzUxOSB0ZW1wZXJhdHVyZSBzZW5zb3JzLCBBREMgYW5kIERBQy4KKworY29uZmlnIEFEVDczMTZfU1BJCisJdHJpc3RhdGUgInN1cHBvcnQgU1BJIGJ1cyBjb25uZWN0aW9uIgorCWRlcGVuZHMgb24gU1BJICYmIEFEVDczMTYKKwlkZWZhdWx0IHkKKwloZWxwCisJICBTYXkgeWVzIGhlcmUgdG8gYnVpbGQgU1BJIGJ1cyBzdXBwb3J0IGZvciBBbmFsb2cgRGV2aWNlcyBBRFQ3MzE2LzcvOAorCSAgYW5kIEFEVDc1MTYvNy85LgorCitjb25maWcgQURUNzMxNl9JMkMKKwl0cmlzdGF0ZSAic3VwcG9ydCBJMkMgYnVzIGNvbm5lY3Rpb24iCisJZGVwZW5kcyBvbiBJMkMgJiYgQURUNzMxNgorCWhlbHAKKwkgIFNheSB5ZXMgaGVyZSB0byBidWlsZCBJMkMgYnVzIHN1cHBvcnQgZm9yIEFuYWxvZyBEZXZpY2VzIEFEVDczMTYvNy84CisJICBhbmQgQURUNzUxNi83LzkuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkZGFjL01ha2VmaWxlIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hZGRhYy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Yzc2ODYxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hZGRhYy9NYWtlZmlsZQpAQCAtMCwwICsxLDcgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIGluZHVzdHJpYWwgSS9PIEFEREFDIGRyaXZlcnMKKyMKKworb2JqLSQoQ09ORklHX0FEVDczMTYpICs9IGFkdDczMTYubworb2JqLSQoQ09ORklHX0FEVDczMTZfU1BJKSArPSBhZHQ3MzE2LXNwaS5vCitvYmotJChDT05GSUdfQURUNzMxNl9JMkMpICs9IGFkdDczMTYtaTJjLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRkYWMvYWR0NzMxNi1pMmMuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRkYWMvYWR0NzMxNi1pMmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MmQxZWEzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hZGRhYy9hZHQ3MzE2LWkyYy5jCkBAIC0wLDAgKzEsMTcwIEBACisvKgorICogSTJDIGJ1cyBkcml2ZXIgZm9yIEFEVDczMTYvNy84IEFEVDc1MTYvNy85IGRpZ2l0YWwgdGVtcGVyYXR1cmUKKyAqIHNlbnNvciwgQURDIGFuZCBEQUMKKyAqCisgKiBDb3B5cmlnaHQgMjAxMCBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKworI2luY2x1ZGUgImFkdDczMTYuaCIKKworLyoKKyAqIGFkdDczMTYgcmVnaXN0ZXIgYWNjZXNzIGJ5IEkyQworICovCitzdGF0aWMgaW50IGFkdDczMTZfaTJjX3JlYWQodm9pZCAqY2xpZW50LCB1OCByZWcsIHU4ICpkYXRhKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbCA9IGNsaWVudDsKKwlpbnQgcmV0ID0gMDsKKworCXJldCA9IGkyY19zbWJ1c193cml0ZV9ieXRlKGNsLCByZWcpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoJmNsLT5kZXYsICJJMkMgZmFpbCB0byBzZWxlY3QgcmVnXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXQgPSBpMmNfc21idXNfcmVhZF9ieXRlKGNsaWVudCk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycigmY2wtPmRldiwgIkkyQyByZWFkIGVycm9yXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhZHQ3MzE2X2kyY193cml0ZSh2b2lkICpjbGllbnQsIHU4IHJlZywgdTggZGF0YSkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2wgPSBjbGllbnQ7CisJaW50IHJldCA9IDA7CisKKwlyZXQgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsLCByZWcsIGRhdGEpOworCWlmIChyZXQgPCAwKQorCQlkZXZfZXJyKCZjbC0+ZGV2LCAiSTJDIHdyaXRlIGVycm9yXG4iKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYWR0NzMxNl9pMmNfbXVsdGlfcmVhZCh2b2lkICpjbGllbnQsIHU4IHJlZywgdTggY291bnQsIHU4ICpkYXRhKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbCA9IGNsaWVudDsKKwlpbnQgaSwgcmV0ID0gMDsKKworCWlmIChjb3VudCA+IEFEVDczMTZfUkVHX01BWF9BRERSKQorCQljb3VudCA9IEFEVDczMTZfUkVHX01BWF9BRERSOworCisJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKwkJcmV0ID0gYWR0NzMxNl9pMmNfcmVhZChjbCwgcmVnLCAmZGF0YVtpXSk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlkZXZfZXJyKCZjbC0+ZGV2LCAiSTJDIG11bHRpIHJlYWQgZXJyb3JcbiIpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFkdDczMTZfaTJjX211bHRpX3dyaXRlKHZvaWQgKmNsaWVudCwgdTggcmVnLCB1OCBjb3VudCwgdTggKmRhdGEpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsID0gY2xpZW50OworCWludCBpLCByZXQgPSAwOworCisJaWYgKGNvdW50ID4gQURUNzMxNl9SRUdfTUFYX0FERFIpCisJCWNvdW50ID0gQURUNzMxNl9SRUdfTUFYX0FERFI7CisKKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworCQlyZXQgPSBhZHQ3MzE2X2kyY193cml0ZShjbCwgcmVnLCBkYXRhW2ldKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWRldl9lcnIoJmNsLT5kZXYsICJJMkMgbXVsdGkgd3JpdGUgZXJyb3JcbiIpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCisvKgorICogZGV2aWNlIHByb2JlIGFuZCByZW1vdmUKKyAqLworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBhZHQ3MzE2X2kyY19wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAorCQljb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IGFkdDczMTZfYnVzIGJ1cyA9IHsKKwkJLmNsaWVudCA9IGNsaWVudCwKKwkJLmlycSA9IGNsaWVudC0+aXJxLAorCQkuaXJxX2ZsYWdzID0gSVJRRl9UUklHR0VSX0xPVywKKwkJLnJlYWQgPSBhZHQ3MzE2X2kyY19yZWFkLAorCQkud3JpdGUgPSBhZHQ3MzE2X2kyY193cml0ZSwKKwkJLm11bHRpX3JlYWQgPSBhZHQ3MzE2X2kyY19tdWx0aV9yZWFkLAorCQkubXVsdGlfd3JpdGUgPSBhZHQ3MzE2X2kyY19tdWx0aV93cml0ZSwKKwl9OworCisJcmV0dXJuIGFkdDczMTZfcHJvYmUoJmNsaWVudC0+ZGV2LCAmYnVzLCBpZC0+bmFtZSk7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IGFkdDczMTZfaTJjX3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXJldHVybiBhZHQ3MzE2X3JlbW92ZSgmY2xpZW50LT5kZXYpOzsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIGFkdDczMTZfaTJjX2lkW10gPSB7CisJeyAiYWR0NzMxNiIsIDAgfSwKKwl7ICJhZHQ3MzE3IiwgMCB9LAorCXsgImFkdDczMTgiLCAwIH0sCisJeyAiYWR0NzUxNiIsIDAgfSwKKwl7ICJhZHQ3NTE3IiwgMCB9LAorCXsgImFkdDc1MTkiLCAwIH0sCisJeyB9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgYWR0NzMxNl9pMmNfaWQpOworCisjaWZkZWYgQ09ORklHX1BNCitzdGF0aWMgaW50IGFkdDczMTZfaTJjX3N1c3BlbmQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgcG1fbWVzc2FnZV90IG1lc3NhZ2UpCit7CisJcmV0dXJuIGFkdDczMTZfZGlzYWJsZSgmY2xpZW50LT5kZXYpOworfQorCitzdGF0aWMgaW50IGFkdDczMTZfaTJjX3Jlc3VtZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXJldHVybiBhZHQ3MzE2X2VuYWJsZSgmY2xpZW50LT5kZXYpOworfQorI2Vsc2UKKyMgZGVmaW5lIGFkdDczMTZfaTJjX3N1c3BlbmQgTlVMTAorIyBkZWZpbmUgYWR0NzMxNl9pMmNfcmVzdW1lICBOVUxMCisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGFkdDczMTZfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gImFkdDczMTYiLAorCQkub3duZXIgID0gVEhJU19NT0RVTEUsCisJfSwKKwkucHJvYmUgPSBhZHQ3MzE2X2kyY19wcm9iZSwKKwkucmVtb3ZlID0gX19kZXZleGl0X3AoYWR0NzMxNl9pMmNfcmVtb3ZlKSwKKwkuc3VzcGVuZCA9IGFkdDczMTZfaTJjX3N1c3BlbmQsCisJLnJlc3VtZSA9IGFkdDczMTZfaTJjX3Jlc3VtZSwKKwkuaWRfdGFibGUgPSBhZHQ3MzE2X2kyY19pZCwKK307CisKK3N0YXRpYyBfX2luaXQgaW50IGFkdDczMTZfaTJjX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gaTJjX2FkZF9kcml2ZXIoJmFkdDczMTZfZHJpdmVyKTsKK30KKworc3RhdGljIF9fZXhpdCB2b2lkIGFkdDczMTZfaTJjX2V4aXQodm9pZCkKK3sKKwlpMmNfZGVsX2RyaXZlcigmYWR0NzMxNl9kcml2ZXIpOworfQorCitNT0RVTEVfQVVUSE9SKCJTb25pYyBaaGFuZyA8c29uaWMuemhhbmdAYW5hbG9nLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiSTJDIGJ1cyBkcml2ZXIgZm9yIEFuYWxvZyBEZXZpY2VzIEFEVDczMTYvNy85IGFuZCIKKwkJCSJBRFQ3NTE2LzcvOCBkaWdpdGFsIHRlbXBlcmF0dXJlIHNlbnNvciwgQURDIGFuZCBEQUMiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKKworbW9kdWxlX2luaXQoYWR0NzMxNl9pMmNfaW5pdCk7Cittb2R1bGVfZXhpdChhZHQ3MzE2X2kyY19leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRkYWMvYWR0NzMxNi1zcGkuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRkYWMvYWR0NzMxNi1zcGkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjlkNGQwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hZGRhYy9hZHQ3MzE2LXNwaS5jCkBAIC0wLDAgKzEsMTgwIEBACisvKgorICogQVBJIGJ1cyBkcml2ZXIgZm9yIEFEVDczMTYvNy84IEFEVDc1MTYvNy85IGRpZ2l0YWwgdGVtcGVyYXR1cmUKKyAqIHNlbnNvciwgQURDIGFuZCBEQUMKKyAqCisgKiBDb3B5cmlnaHQgMjAxMCBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CisKKyNpbmNsdWRlICJhZHQ3MzE2LmgiCisKKyNkZWZpbmUgQURUNzMxNl9TUElfTUFYX0ZSRVFfSFoJCTUwMDAwMDAKKyNkZWZpbmUgQURUNzMxNl9TUElfQ01EX1JFQUQJCTB4OTEKKyNkZWZpbmUgQURUNzMxNl9TUElfQ01EX1dSSVRFCQkweDkwCisKKy8qCisgKiBhZHQ3MzE2IHJlZ2lzdGVyIGFjY2VzcyBieSBTUEkKKyAqLworCitzdGF0aWMgaW50IGFkdDczMTZfc3BpX211bHRpX3JlYWQodm9pZCAqY2xpZW50LCB1OCByZWcsIHU4IGNvdW50LCB1OCAqZGF0YSkKK3sKKwlzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpX2RldiA9IGNsaWVudDsKKwl1OCBjbWRbMl07CisJaW50IHJldCA9IDA7CisKKwlpZiAoY291bnQgPiBBRFQ3MzE2X1JFR19NQVhfQUREUikKKwkJY291bnQgPSBBRFQ3MzE2X1JFR19NQVhfQUREUjsKKworCWNtZFswXSA9IEFEVDczMTZfU1BJX0NNRF9XUklURTsKKwljbWRbMV0gPSByZWc7CisKKwlyZXQgPSBzcGlfd3JpdGUoc3BpX2RldiwgY21kLCAyKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKCZzcGlfZGV2LT5kZXYsICJTUEkgZmFpbCB0byBzZWxlY3QgcmVnXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwljbWRbMF0gPSBBRFQ3MzE2X1NQSV9DTURfUkVBRDsKKworCXJldCA9IHNwaV93cml0ZV90aGVuX3JlYWQoc3BpX2RldiwgY21kLCAxLCBkYXRhLCBjb3VudCk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2Vycigmc3BpX2Rldi0+ZGV2LCAiU1BJIHJlYWQgZGF0YSBlcnJvclxuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWR0NzMxNl9zcGlfbXVsdGlfd3JpdGUodm9pZCAqY2xpZW50LCB1OCByZWcsIHU4IGNvdW50LCB1OCAqZGF0YSkKK3sKKwlzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpX2RldiA9IGNsaWVudDsKKwl1OCBidWZbQURUNzMxNl9SRUdfTUFYX0FERFIgKyAyXTsKKwlpbnQgaSwgcmV0ID0gMDsKKworCWlmIChjb3VudCA+IEFEVDczMTZfUkVHX01BWF9BRERSKQorCQljb3VudCA9IEFEVDczMTZfUkVHX01BWF9BRERSOworCisJYnVmWzBdID0gQURUNzMxNl9TUElfQ01EX1dSSVRFOworCWJ1ZlsxXSA9IHJlZzsKKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykKKwkJYnVmW2kgKyAyXSA9IGRhdGFbaV07CisKKwlyZXQgPSBzcGlfd3JpdGUoc3BpX2RldiwgYnVmLCBjb3VudCArIDIpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoJnNwaV9kZXYtPmRldiwgIlNQSSB3cml0ZSBlcnJvclxuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhZHQ3MzE2X3NwaV9yZWFkKHZvaWQgKmNsaWVudCwgdTggcmVnLCB1OCAqZGF0YSkKK3sKKwlyZXR1cm4gYWR0NzMxNl9zcGlfbXVsdGlfcmVhZChjbGllbnQsIHJlZywgMSwgZGF0YSk7Cit9CisKK3N0YXRpYyBpbnQgYWR0NzMxNl9zcGlfd3JpdGUodm9pZCAqY2xpZW50LCB1OCByZWcsIHU4IHZhbCkKK3sKKwlyZXR1cm4gYWR0NzMxNl9zcGlfbXVsdGlfd3JpdGUoY2xpZW50LCByZWcsIDEsICZ2YWwpOworfQorCisvKgorICogZGV2aWNlIHByb2JlIGFuZCByZW1vdmUKKyAqLworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBhZHQ3MzE2X3NwaV9wcm9iZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpX2RldikKK3sKKwlzdHJ1Y3QgYWR0NzMxNl9idXMgYnVzID0geworCQkuY2xpZW50ID0gc3BpX2RldiwKKwkJLmlycSA9IHNwaV9kZXYtPmlycSwKKwkJLmlycV9mbGFncyA9IElSUUZfVFJJR0dFUl9MT1csCisJCS5yZWFkID0gYWR0NzMxNl9zcGlfcmVhZCwKKwkJLndyaXRlID0gYWR0NzMxNl9zcGlfd3JpdGUsCisJCS5tdWx0aV9yZWFkID0gYWR0NzMxNl9zcGlfbXVsdGlfcmVhZCwKKwkJLm11bHRpX3dyaXRlID0gYWR0NzMxNl9zcGlfbXVsdGlfd3JpdGUsCisJfTsKKworCS8qIGRvbid0IGV4Y2VlZCBtYXggc3BlY2lmaWVkIFNQSSBDTEsgZnJlcXVlbmN5ICovCisJaWYgKHNwaV9kZXYtPm1heF9zcGVlZF9oeiA+IEFEVDczMTZfU1BJX01BWF9GUkVRX0haKSB7CisJCWRldl9lcnIoJnNwaV9kZXYtPmRldiwgIlNQSSBDTEsgJWQgSHo/XG4iLAorCQkJc3BpX2Rldi0+bWF4X3NwZWVkX2h6KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogc3dpdGNoIGZyb20gZGVmYXVsdCBJMkMgcHJvdG9jb2wgdG8gU1BJIHByb3RvY29sICovCisJYWR0NzMxNl9zcGlfd3JpdGUoc3BpX2RldiwgMCwgMCk7CisJYWR0NzMxNl9zcGlfd3JpdGUoc3BpX2RldiwgMCwgMCk7CisJYWR0NzMxNl9zcGlfd3JpdGUoc3BpX2RldiwgMCwgMCk7CisKKwlyZXR1cm4gYWR0NzMxNl9wcm9iZSgmc3BpX2Rldi0+ZGV2LCAmYnVzLCBzcGlfZGV2LT5tb2RhbGlhcyk7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IGFkdDczMTZfc3BpX3JlbW92ZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpX2RldikKK3sKKwlyZXR1cm4gYWR0NzMxNl9yZW1vdmUoJnNwaV9kZXYtPmRldik7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc3BpX2RldmljZV9pZCBhZHQ3MzE2X3NwaV9pZFtdID0geworCXsgImFkdDczMTYiLCAwIH0sCisJeyAiYWR0NzMxNyIsIDAgfSwKKwl7ICJhZHQ3MzE4IiwgMCB9LAorCXsgImFkdDc1MTYiLCAwIH0sCisJeyAiYWR0NzUxNyIsIDAgfSwKKwl7ICJhZHQ3NTE5IiwgMCB9LAorCXsgfQorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShzcGksIGFkdDczMTZfc3BpX2lkKTsKKworI2lmZGVmIENPTkZJR19QTQorc3RhdGljIGludCBhZHQ3MzE2X3NwaV9zdXNwZW5kKHN0cnVjdCBzcGlfZGV2aWNlICpzcGlfZGV2LCBwbV9tZXNzYWdlX3QgbWVzc2FnZSkKK3sKKwlyZXR1cm4gYWR0NzMxNl9kaXNhYmxlKCZzcGlfZGV2LT5kZXYpOworfQorCitzdGF0aWMgaW50IGFkdDczMTZfc3BpX3Jlc3VtZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpX2RldikKK3sKKwlyZXR1cm4gYWR0NzMxNl9lbmFibGUoJnNwaV9kZXYtPmRldik7Cit9CisjZWxzZQorIyBkZWZpbmUgYWR0NzMxNl9zcGlfc3VzcGVuZCBOVUxMCisjIGRlZmluZSBhZHQ3MzE2X3NwaV9yZXN1bWUgIE5VTEwKKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IHNwaV9kcml2ZXIgYWR0NzMxNl9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAiYWR0NzMxNiIsCisJCS5idXMgPSAmc3BpX2J1c190eXBlLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwl9LAorCS5wcm9iZSA9IGFkdDczMTZfc3BpX3Byb2JlLAorCS5yZW1vdmUgPSBfX2RldmV4aXRfcChhZHQ3MzE2X3NwaV9yZW1vdmUpLAorCS5zdXNwZW5kID0gYWR0NzMxNl9zcGlfc3VzcGVuZCwKKwkucmVzdW1lID0gYWR0NzMxNl9zcGlfcmVzdW1lLAorCS5pZF90YWJsZSA9IGFkdDczMTZfc3BpX2lkLAorfTsKKworc3RhdGljIF9faW5pdCBpbnQgYWR0NzMxNl9zcGlfaW5pdCh2b2lkKQoreworCXJldHVybiBzcGlfcmVnaXN0ZXJfZHJpdmVyKCZhZHQ3MzE2X2RyaXZlcik7Cit9CisKK3N0YXRpYyBfX2V4aXQgdm9pZCBhZHQ3MzE2X3NwaV9leGl0KHZvaWQpCit7CisJc3BpX3VucmVnaXN0ZXJfZHJpdmVyKCZhZHQ3MzE2X2RyaXZlcik7Cit9CisKK01PRFVMRV9BVVRIT1IoIlNvbmljIFpoYW5nIDxzb25pYy56aGFuZ0BhbmFsb2cuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJTUEkgYnVzIGRyaXZlciBmb3IgQW5hbG9nIERldmljZXMgQURUNzMxNi83LzggYW5kIgorCQkJIkFEVDc1MTYvNy85IGRpZ2l0YWwgdGVtcGVyYXR1cmUgc2Vuc29yLCBBREMgYW5kIERBQyIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOworCittb2R1bGVfaW5pdChhZHQ3MzE2X3NwaV9pbml0KTsKK21vZHVsZV9leGl0KGFkdDczMTZfc3BpX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9hZGRhYy9hZHQ3MzE2LmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkZGFjL2FkdDczMTYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMWI1YjEzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hZGRhYy9hZHQ3MzE2LmMKQEAgLTAsMCArMSwyNDAyIEBACisvKgorICogQURUNzMxNiBkaWdpdGFsIHRlbXBlcmF0dXJlIHNlbnNvciBkcml2ZXIgc3VwcG9ydGluZyBBRFQ3MzE2LzcvOCBBRFQ3NTE2LzcvOQorICoKKyAqCisgKiBDb3B5cmlnaHQgMjAxMCBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L3J0Yy5oPgorCisjaW5jbHVkZSAiLi4vaWlvLmgiCisjaW5jbHVkZSAiLi4vc3lzZnMuaCIKKyNpbmNsdWRlICJhZHQ3MzE2LmgiCisKKy8qCisgKiBBRFQ3MzE2IHJlZ2lzdGVycyBkZWZpbml0aW9uCisgKi8KKyNkZWZpbmUgQURUNzMxNl9JTlRfU1RBVDEJCTB4MAorI2RlZmluZSBBRFQ3MzE2X0lOVF9TVEFUMgkJMHgxCisjZGVmaW5lIEFEVDczMTZfTFNCX0lOX1RFTVBfVkRECQkweDMKKyNkZWZpbmUgQURUNzMxNl9MU0JfSU5fVEVNUF9NQVNLCTB4MworI2RlZmluZSBBRFQ3MzE2X0xTQl9WRERfTUFTSwkJMHhDCisjZGVmaW5lIEFEVDczMTZfTFNCX1ZERF9PRkZTRVQJCTIKKyNkZWZpbmUgQURUNzMxNl9MU0JfRVhfVEVNUF9BSU4JCTB4NAorI2RlZmluZSBBRFQ3MzE2X0xTQl9FWF9URU1QX01BU0sJMHgzCisjZGVmaW5lIEFEVDc1MTZfTFNCX0FJTl9TSElGVAkJMgorI2RlZmluZSBBRFQ3MzE2X0FEX01TQl9EQVRBX0JBU0UgICAgICAgIDB4NgorI2RlZmluZSBBRFQ3MzE2X0FEX01TQl9EQVRBX1JFR1MgICAgICAgIDMKKyNkZWZpbmUgQURUNzUxNl9BRF9NU0JfREFUQV9SRUdTICAgICAgICA2CisjZGVmaW5lIEFEVDczMTZfTVNCX1ZERAkJCTB4NgorI2RlZmluZSBBRFQ3MzE2X01TQl9JTl9URU1QCQkweDcKKyNkZWZpbmUgQURUNzMxNl9NU0JfRVhfVEVNUAkJMHg4CisjZGVmaW5lIEFEVDc1MTZfTVNCX0FJTjEJCTB4OAorI2RlZmluZSBBRFQ3NTE2X01TQl9BSU4yCQkweDkKKyNkZWZpbmUgQURUNzUxNl9NU0JfQUlOMwkJMHhBCisjZGVmaW5lIEFEVDc1MTZfTVNCX0FJTjQJCTB4QgorI2RlZmluZSBBRFQ3MzE2X0RBX0RBVEFfQkFTRQkJMHgxMAorI2RlZmluZSBBRFQ3MzE2X0RBX01TQl9EQVRBX1JFR1MJNAorI2RlZmluZSBBRFQ3MzE2X0xTQl9EQUNfQQkJMHgxMAorI2RlZmluZSBBRFQ3MzE2X01TQl9EQUNfQQkJMHgxMQorI2RlZmluZSBBRFQ3MzE2X0xTQl9EQUNfQgkJMHgxMgorI2RlZmluZSBBRFQ3MzE2X01TQl9EQUNfQgkJMHgxMworI2RlZmluZSBBRFQ3MzE2X0xTQl9EQUNfQwkJMHgxNAorI2RlZmluZSBBRFQ3MzE2X01TQl9EQUNfQwkJMHgxNQorI2RlZmluZSBBRFQ3MzE2X0xTQl9EQUNfRAkJMHgxNgorI2RlZmluZSBBRFQ3MzE2X01TQl9EQUNfRAkJMHgxNworI2RlZmluZSBBRFQ3MzE2X0NPTkZJRzEJCQkweDE4CisjZGVmaW5lIEFEVDczMTZfQ09ORklHMgkJCTB4MTkKKyNkZWZpbmUgQURUNzMxNl9DT05GSUczCQkJMHgxQQorI2RlZmluZSBBRFQ3MzE2X0xEQUNfQ09ORklHCQkweDFCCisjZGVmaW5lIEFEVDczMTZfREFDX0NPTkZJRwkJMHgxQworI2RlZmluZSBBRFQ3MzE2X0lOVF9NQVNLMQkJMHgxRAorI2RlZmluZSBBRFQ3MzE2X0lOVF9NQVNLMgkJMHgxRQorI2RlZmluZSBBRFQ3MzE2X0lOX1RFTVBfT0ZGU0VUCQkweDFGCisjZGVmaW5lIEFEVDczMTZfRVhfVEVNUF9PRkZTRVQJCTB4MjAKKyNkZWZpbmUgQURUNzMxNl9JTl9BTkFMT0dfVEVNUF9PRkZTRVQJMHgyMQorI2RlZmluZSBBRFQ3MzE2X0VYX0FOQUxPR19URU1QX09GRlNFVAkweDIyCisjZGVmaW5lIEFEVDczMTZfVkREX0hJR0gJCTB4MjMKKyNkZWZpbmUgQURUNzMxNl9WRERfTE9XCQkJMHgyNAorI2RlZmluZSBBRFQ3MzE2X0lOX1RFTVBfSElHSAkJMHgyNQorI2RlZmluZSBBRFQ3MzE2X0lOX1RFTVBfTE9XCQkweDI2CisjZGVmaW5lIEFEVDczMTZfRVhfVEVNUF9ISUdICQkweDI3CisjZGVmaW5lIEFEVDczMTZfRVhfVEVNUF9MT1cJCTB4MjgKKyNkZWZpbmUgQURUNzUxNl9BSU4yX0hJR0gJCTB4MkIKKyNkZWZpbmUgQURUNzUxNl9BSU4yX0xPVwkJMHgyQworI2RlZmluZSBBRFQ3NTE2X0FJTjNfSElHSAkJMHgyRAorI2RlZmluZSBBRFQ3NTE2X0FJTjNfTE9XCQkweDJFCisjZGVmaW5lIEFEVDc1MTZfQUlONF9ISUdICQkweDJGCisjZGVmaW5lIEFEVDc1MTZfQUlONF9MT1cJCTB4MzAKKyNkZWZpbmUgQURUNzMxNl9ERVZJQ0VfSUQJCTB4NEQKKyNkZWZpbmUgQURUNzMxNl9NQU5VRkFDVFVSRV9JRAkJMHg0RQorI2RlZmluZSBBRFQ3MzE2X0RFVklDRV9SRVYJCTB4NEYKKyNkZWZpbmUgQURUNzMxNl9TUElfTE9DS19TVEFUCQkweDdGCisKKy8qCisgKiBBRFQ3MzE2IGNvbmZpZzEKKyAqLworI2RlZmluZSBBRFQ3MzE2X0VOCQkJMHgxCisjZGVmaW5lIEFEVDc1MTZfU0VMX0VYX1RFTVAJCTB4NAorI2RlZmluZSBBRFQ3NTE2X1NFTF9BSU4xXzJfRVhfVEVNUF9NQVNLCTB4NgorI2RlZmluZSBBRFQ3NTE2X1NFTF9BSU4zCQkweDgKKyNkZWZpbmUgQURUNzMxNl9JTlRfRU4JCQkweDIwCisjZGVmaW5lIEFEVDczMTZfSU5UX1BPTEFSSVRZCQkweDQwCisjZGVmaW5lIEFEVDczMTZfUEQJCQkweDgwCisKKy8qCisgKiBBRFQ3MzE2IGNvbmZpZzIKKyAqLworI2RlZmluZSBBRFQ3MzE2X0FEX1NJTkdMRV9DSF9NQVNLCTB4MworI2RlZmluZSBBRFQ3NTE2X0FEX1NJTkdMRV9DSF9NQVNLCTB4NworI2RlZmluZSBBRFQ3MzE2X0FEX1NJTkdMRV9DSF9WREQJMAorI2RlZmluZSBBRFQ3MzE2X0FEX1NJTkdMRV9DSF9JTgkJMQorI2RlZmluZSBBRFQ3MzE2X0FEX1NJTkdMRV9DSF9FWAkJMgorI2RlZmluZSBBRFQ3NTE2X0FEX1NJTkdMRV9DSF9BSU4xCTIKKyNkZWZpbmUgQURUNzUxNl9BRF9TSU5HTEVfQ0hfQUlOMgkzCisjZGVmaW5lIEFEVDc1MTZfQURfU0lOR0xFX0NIX0FJTjMJNAorI2RlZmluZSBBRFQ3NTE2X0FEX1NJTkdMRV9DSF9BSU40CTUKKyNkZWZpbmUgQURUNzMxNl9BRF9TSU5HTEVfQ0hfTU9ERQkweDEwCisjZGVmaW5lIEFEVDczMTZfRElTQUJMRV9BVkVSQUdJTkcJMHgyMAorI2RlZmluZSBBRFQ3MzE2X0VOX1NNQlVTX1RJTUVPVVQJMHg0MAorI2RlZmluZSBBRFQ3MzE2X1JFU0VUCQkJMHg4MAorCisvKgorICogQURUNzMxNiBjb25maWczCisgKi8KKyNkZWZpbmUgQURUNzMxNl9BRENMS18yMl81CQkweDEKKyNkZWZpbmUgQURUNzMxNl9EQV9ISUdIX1JFU09MVVRJT04JMHgyCisjZGVmaW5lIEFEVDczMTZfREFfRU5fVklBX0RBQ19MRENBCTB4NAorI2RlZmluZSBBRFQ3NTE2X0FJTl9JTl9WUkVGCQkweDEwCisjZGVmaW5lIEFEVDczMTZfRU5fSU5fVEVNUF9QUk9QX0RBQ0EJMHgyMAorI2RlZmluZSBBRFQ3MzE2X0VOX0VYX1RFTVBfUFJPUF9EQUNCCTB4NDAKKworLyoKKyAqIEFEVDczMTYgREFDIGNvbmZpZworICovCisjZGVmaW5lIEFEVDczMTZfREFfMlZSRUZfQ0hfTUFTSwkweEYKKyNkZWZpbmUgQURUNzMxNl9EQV9FTl9NT0RFX01BU0sJCTB4MzAKKyNkZWZpbmUgQURUNzMxNl9EQV9FTl9NT0RFX1NJTkdMRQkweDAwCisjZGVmaW5lIEFEVDczMTZfREFfRU5fTU9ERV9BQl9DRAkweDEwCisjZGVmaW5lIEFEVDczMTZfREFfRU5fTU9ERV9BQkNECQkweDIwCisjZGVmaW5lIEFEVDczMTZfREFfRU5fTU9ERV9MREFDCQkweDMwCisjZGVmaW5lIEFEVDczMTZfVlJFRl9CWVBBU1NfREFDX0FCCTB4NDAKKyNkZWZpbmUgQURUNzMxNl9WUkVGX0JZUEFTU19EQUNfQ0QJMHg4MAorCisvKgorICogQURUNzMxNiBMREFDIGNvbmZpZworICovCisjZGVmaW5lIEFEVDczMTZfTERBQ19FTl9EQV9NQVNLCQkweEYKKyNkZWZpbmUgQURUNzMxNl9EQUNfSU5fVlJFRgkJMHgxMAorI2RlZmluZSBBRFQ3NTE2X0RBQ19BQl9JTl9WUkVGCQkweDEwCisjZGVmaW5lIEFEVDc1MTZfREFDX0NEX0lOX1ZSRUYJCTB4MjAKKyNkZWZpbmUgQURUNzUxNl9EQUNfSU5fVlJFRl9PRkZTRVQJNAorI2RlZmluZSBBRFQ3NTE2X0RBQ19JTl9WUkVGX01BU0sJMHgzMAorCisvKgorICogQURUNzMxNiBJTlRfTUFTSzIKKyAqLworI2RlZmluZSBBRFQ3MzE2X0lOVF9NQVNLMl9WREQJCTB4MTAKKworLyoKKyAqIEFEVDczMTYgdmFsdWUgbWFza3MKKyAqLworI2RlZmluZSBBRFQ3MzE2X1ZBTFVFX01BU0sJCTB4ZmZmCisjZGVmaW5lIEFEVDczMTZfVF9WQUxVRV9TSUdOCQkweDQwMAorI2RlZmluZSBBRFQ3MzE2X1RfVkFMVUVfRkxPQVRfT0ZGU0VUCTIKKyNkZWZpbmUgQURUNzMxNl9UX1ZBTFVFX0ZMT0FUX01BU0sJMHgyCisKKy8qCisgKiBDaGlwIElECisgKi8KKyNkZWZpbmUgSURfQURUNzMxNgkJMHgxCisjZGVmaW5lIElEX0FEVDczMTcJCTB4MgorI2RlZmluZSBJRF9BRFQ3MzE4CQkweDMKKyNkZWZpbmUgSURfQURUNzUxNgkJMHgxMQorI2RlZmluZSBJRF9BRFQ3NTE3CQkweDEyCisjZGVmaW5lIElEX0FEVDc1MTkJCTB4MTQKKworI2RlZmluZSBJRF9GQU1JTFlfTUFTSwkJMHhGMAorI2RlZmluZSBJRF9BRFQ3M1hYCQkweDAKKyNkZWZpbmUgSURfQURUNzVYWAkJMHgxMAorCisvKgorICogc3RydWN0IGFkdDczMTZfY2hpcF9pbmZvIC0gY2hpcCBzcGVjaWZjIGluZm9ybWF0aW9uCisgKi8KKworc3RydWN0IGFkdDczMTZfY2hpcF9pbmZvIHsKKwljb25zdCBjaGFyCQkqbmFtZTsKKwlzdHJ1Y3QgaWlvX2RldgkJKmluZGlvX2RldjsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QJdGhyZXNoX3dvcms7CisJczY0CQkJbGFzdF90aW1lc3RhbXA7CisJc3RydWN0IGFkdDczMTZfYnVzCWJ1czsKKwl1MTYJCQlsZGFjX3BpbjsKKwl1MTYJCQlpbnRfbWFzazsJLyogMHgyZiAqLworCXU4CQkJY29uZmlnMTsKKwl1OAkJCWNvbmZpZzI7CisJdTgJCQljb25maWczOworCXU4CQkJZGFjX2NvbmZpZzsJLyogREFDIGNvbmZpZyAqLworCXU4CQkJbGRhY19jb25maWc7CS8qIExEQUMgY29uZmlnICovCisJdTgJCQlkYWNfYml0czsJLyogOCwgMTAsIDEyICovCisJdTgJCQlpZDsJCS8qIGNoaXAgaWQgKi8KK307CisKKy8qCisgKiBMb2dpYyBpbnRlcnJ1cHQgbWFzayBmb3IgdXNlciBhcHBsaWNhdGlvbiB0byBlbmFibGUKKyAqIGludGVycnVwdHMuCisgKi8KKyNkZWZpbmUgQURUNzMxNl9JTl9URU1QX0hJR0hfSU5UX01BU0sJMHgxCisjZGVmaW5lIEFEVDczMTZfSU5fVEVNUF9MT1dfSU5UX01BU0sJMHgyCisjZGVmaW5lIEFEVDczMTZfRVhfVEVNUF9ISUdIX0lOVF9NQVNLCTB4NAorI2RlZmluZSBBRFQ3MzE2X0VYX1RFTVBfTE9XX0lOVF9NQVNLCTB4OAorI2RlZmluZSBBRFQ3MzE2X0VYX1RFTVBfRkFVTFRfSU5UX01BU0sJMHgxMAorI2RlZmluZSBBRFQ3NTE2X0FJTjFfSU5UX01BU0sJCTB4NAorI2RlZmluZSBBRFQ3NTE2X0FJTjJfSU5UX01BU0sJCTB4MjAKKyNkZWZpbmUgQURUNzUxNl9BSU4zX0lOVF9NQVNLCQkweDQwCisjZGVmaW5lIEFEVDc1MTZfQUlONF9JTlRfTUFTSwkJMHg4MAorI2RlZmluZSBBRFQ3MzE2X1ZERF9JTlRfTUFTSwkJMHgxMDAKKyNkZWZpbmUgQURUNzMxNl9URU1QX0lOVF9NQVNLCQkweDFGCisjZGVmaW5lIEFEVDc1MTZfQUlOX0lOVF9NQVNLCQkweEUwCisjZGVmaW5lIEFEVDczMTZfVEVNUF9BSU5fSU5UX01BU0sJXAorCShBRFQ3MzE2X1RFTVBfSU5UX01BU0sgfCBBRFQ3MzE2X1RFTVBfSU5UX01BU0spCisKKy8qCisgKiBzdHJ1Y3QgYWR0NzMxNl9jaGlwX2luZm8gLSBjaGlwIHNwZWNpZmMgaW5mb3JtYXRpb24KKyAqLworCitzdHJ1Y3QgYWR0NzMxNl9saW1pdF9yZWdzIHsKKwl1MTYJZGF0YV9oaWdoOworCXUxNglkYXRhX2xvdzsKK307CisKK3N0YXRpYyBzc2l6ZV90IGFkdDczMTZfc2hvd19lbmFibGVkKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWR0NzMxNl9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgISEoY2hpcC0+Y29uZmlnMSAmIEFEVDczMTZfRU4pKTsKK30KKworc3RhdGljIHNzaXplX3QgX2FkdDczMTZfc3RvcmVfZW5hYmxlZChzdHJ1Y3QgYWR0NzMxNl9jaGlwX2luZm8gKmNoaXAsCisJCWludCBlbmFibGUpCit7CisJdTggY29uZmlnMTsKKwlpbnQgcmV0OworCisJaWYgKGVuYWJsZSkKKwkJY29uZmlnMSA9IGNoaXAtPmNvbmZpZzEgfCBBRFQ3MzE2X0VOOworCWVsc2UKKwkJY29uZmlnMSA9IGNoaXAtPmNvbmZpZzEgJiB+QURUNzMxNl9FTjsKKworCXJldCA9IGNoaXAtPmJ1cy53cml0ZShjaGlwLT5idXMuY2xpZW50LCBBRFQ3MzE2X0NPTkZJRzEsIGNvbmZpZzEpOworCWlmIChyZXQpCisJCXJldHVybiAtRUlPOworCisJY2hpcC0+Y29uZmlnMSA9IGNvbmZpZzE7CisKKwlyZXR1cm4gcmV0OworCit9CisKK3N0YXRpYyBzc2l6ZV90IGFkdDczMTZfc3RvcmVfZW5hYmxlZChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBsZW4pCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkdDczMTZfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCWludCBlbmFibGU7CisKKwlpZiAoIW1lbWNtcChidWYsICIxIiwgMSkpCisJCWVuYWJsZSA9IDE7CisJZWxzZQorCQllbmFibGUgPSAwOworCisJaWYgKF9hZHQ3MzE2X3N0b3JlX2VuYWJsZWQoY2hpcCwgZW5hYmxlKSA8IDApCisJCXJldHVybiAtRUlPOworCWVsc2UKKwkJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIElJT19ERVZJQ0VfQVRUUihlbmFibGVkLCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJYWR0NzMxNl9zaG93X2VuYWJsZWQsCisJCWFkdDczMTZfc3RvcmVfZW5hYmxlZCwKKwkJMCk7CisKK3N0YXRpYyBzc2l6ZV90IGFkdDczMTZfc2hvd19zZWxlY3RfZXhfdGVtcChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkdDczMTZfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCisJaWYgKChjaGlwLT5pZCAmIElEX0ZBTUlMWV9NQVNLKSAhPSBJRF9BRFQ3NVhYKQorCQlyZXR1cm4gLUVQRVJNOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsICEhKGNoaXAtPmNvbmZpZzEgJiBBRFQ3NTE2X1NFTF9FWF9URU1QKSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkdDczMTZfc3RvcmVfc2VsZWN0X2V4X3RlbXAoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgbGVuKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZHQ3MzE2X2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKwl1OCBjb25maWcxOworCWludCByZXQ7CisKKwlpZiAoKGNoaXAtPmlkICYgSURfRkFNSUxZX01BU0spICE9IElEX0FEVDc1WFgpCisJCXJldHVybiAtRVBFUk07CisKKwljb25maWcxID0gY2hpcC0+Y29uZmlnMSAmICh+QURUNzUxNl9TRUxfRVhfVEVNUCk7CisJaWYgKCFtZW1jbXAoYnVmLCAiMSIsIDEpKQorCQljb25maWcxIHw9IEFEVDc1MTZfU0VMX0VYX1RFTVA7CisKKwlyZXQgPSBjaGlwLT5idXMud3JpdGUoY2hpcC0+YnVzLmNsaWVudCwgQURUNzMxNl9DT05GSUcxLCBjb25maWcxKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gLUVJTzsKKworCWNoaXAtPmNvbmZpZzEgPSBjb25maWcxOworCisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIElJT19ERVZJQ0VfQVRUUihzZWxlY3RfZXhfdGVtcCwgU19JUlVHTyB8IFNfSVdVU1IsCisJCWFkdDczMTZfc2hvd19zZWxlY3RfZXhfdGVtcCwKKwkJYWR0NzMxNl9zdG9yZV9zZWxlY3RfZXhfdGVtcCwKKwkJMCk7CisKK3N0YXRpYyBzc2l6ZV90IGFkdDczMTZfc2hvd19tb2RlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWR0NzMxNl9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisKKwlpZiAoY2hpcC0+Y29uZmlnMiAmIEFEVDczMTZfQURfU0lOR0xFX0NIX01PREUpCisJCXJldHVybiBzcHJpbnRmKGJ1ZiwgInNpbmdsZV9jaGFubmVsXG4iKTsKKwllbHNlCisJCXJldHVybiBzcHJpbnRmKGJ1ZiwgInJvdW5kX3JvYmluXG4iKTsKK30KKworc3RhdGljIHNzaXplX3QgYWR0NzMxNl9zdG9yZV9tb2RlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWR0NzMxNl9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisJdTggY29uZmlnMjsKKwlpbnQgcmV0OworCisJY29uZmlnMiA9IGNoaXAtPmNvbmZpZzIgJiAofkFEVDczMTZfQURfU0lOR0xFX0NIX01PREUpOworCWlmICghbWVtY21wKGJ1ZiwgInNpbmdsZV9jaGFubmVsIiwgMTQpKQorCQljb25maWcyIHw9IEFEVDczMTZfQURfU0lOR0xFX0NIX01PREU7CisKKwlyZXQgPSBjaGlwLT5idXMud3JpdGUoY2hpcC0+YnVzLmNsaWVudCwgQURUNzMxNl9DT05GSUcyLCBjb25maWcyKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gLUVJTzsKKworCWNoaXAtPmNvbmZpZzIgPSBjb25maWcyOworCisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIElJT19ERVZJQ0VfQVRUUihtb2RlLCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJYWR0NzMxNl9zaG93X21vZGUsCisJCWFkdDczMTZfc3RvcmVfbW9kZSwKKwkJMCk7CisKK3N0YXRpYyBzc2l6ZV90IGFkdDczMTZfc2hvd19hbGxfbW9kZXMoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXJldHVybiBzcHJpbnRmKGJ1ZiwgInNpbmdsZV9jaGFubmVsXG5yb3VuZF9yb2JpblxuIik7Cit9CisKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIoYWxsX21vZGVzLCBTX0lSVUdPLCBhZHQ3MzE2X3Nob3dfYWxsX21vZGVzLCBOVUxMLCAwKTsKKworc3RhdGljIHNzaXplX3QgYWR0NzMxNl9zaG93X2FkX2NoYW5uZWwoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZHQ3MzE2X2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKworCWlmICghKGNoaXAtPmNvbmZpZzIgJiBBRFQ3MzE2X0FEX1NJTkdMRV9DSF9NT0RFKSkKKwkJcmV0dXJuIC1FUEVSTTsKKworCXN3aXRjaCAoY2hpcC0+Y29uZmlnMiAmIEFEVDc1MTZfQURfU0lOR0xFX0NIX01BU0spIHsKKwljYXNlIEFEVDczMTZfQURfU0lOR0xFX0NIX1ZERDoKKwkJcmV0dXJuIHNwcmludGYoYnVmLCAiMCAtIFZERFxuIik7CisJY2FzZSBBRFQ3MzE2X0FEX1NJTkdMRV9DSF9JTjoKKwkJcmV0dXJuIHNwcmludGYoYnVmLCAiMSAtIEludGVybmFsIFRlbXBlcmF0dXJlXG4iKTsKKwljYXNlIEFEVDczMTZfQURfU0lOR0xFX0NIX0VYOgorCQlpZiAoKChjaGlwLT5pZCAmIElEX0ZBTUlMWV9NQVNLKSA9PSBJRF9BRFQ3NVhYKSAmJgorCQkJKGNoaXAtPmNvbmZpZzEgJiBBRFQ3NTE2X1NFTF9BSU4xXzJfRVhfVEVNUF9NQVNLKSA9PSAwKQorCQkJcmV0dXJuIHNwcmludGYoYnVmLCAiMiAtIEFJTjFcbiIpOworCQllbHNlCisJCQlyZXR1cm4gc3ByaW50ZihidWYsICIyIC0gRXh0ZXJuYWwgVGVtcGVyYXR1cmVcbiIpOworCWNhc2UgQURUNzUxNl9BRF9TSU5HTEVfQ0hfQUlOMjoKKwkJaWYgKChjaGlwLT5jb25maWcxICYgQURUNzUxNl9TRUxfQUlOMV8yX0VYX1RFTVBfTUFTSykgPT0gMCkKKwkJCXJldHVybiBzcHJpbnRmKGJ1ZiwgIjMgLSBBSU4yXG4iKTsKKwkJZWxzZQorCQkJcmV0dXJuIHNwcmludGYoYnVmLCAiTi9BXG4iKTsKKwljYXNlIEFEVDc1MTZfQURfU0lOR0xFX0NIX0FJTjM6CisJCWlmIChjaGlwLT5jb25maWcxICYgQURUNzUxNl9TRUxfQUlOMykKKwkJCXJldHVybiBzcHJpbnRmKGJ1ZiwgIjQgLSBBSU4zXG4iKTsKKwkJZWxzZQorCQkJcmV0dXJuIHNwcmludGYoYnVmLCAiTi9BXG4iKTsKKwljYXNlIEFEVDc1MTZfQURfU0lOR0xFX0NIX0FJTjQ6CisJCXJldHVybiBzcHJpbnRmKGJ1ZiwgIjUgLSBBSU40XG4iKTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gc3ByaW50ZihidWYsICJOL0FcbiIpOworCX07Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkdDczMTZfc3RvcmVfYWRfY2hhbm5lbChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBsZW4pCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkdDczMTZfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCXU4IGNvbmZpZzI7CisJdW5zaWduZWQgbG9uZyBkYXRhID0gMDsKKwlpbnQgcmV0OworCisJaWYgKCEoY2hpcC0+Y29uZmlnMiAmIEFEVDczMTZfQURfU0lOR0xFX0NIX01PREUpKQorCQlyZXR1cm4gLUVQRVJNOworCisJcmV0ID0gc3RyaWN0X3N0cnRvdWwoYnVmLCAxMCwgJmRhdGEpOworCWlmIChyZXQpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKChjaGlwLT5pZCAmIElEX0ZBTUlMWV9NQVNLKSA9PSBJRF9BRFQ3NVhYKSB7CisJCWlmIChkYXRhID4gNSkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWNvbmZpZzIgPSBjaGlwLT5jb25maWcyICYgKH5BRFQ3NTE2X0FEX1NJTkdMRV9DSF9NQVNLKTsKKwl9IGVsc2UgeworCQlpZiAoZGF0YSA+IDIpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQljb25maWcyID0gY2hpcC0+Y29uZmlnMiAmICh+QURUNzMxNl9BRF9TSU5HTEVfQ0hfTUFTSyk7CisJfQorCisKKwljb25maWcyIHw9IGRhdGE7CisKKwlyZXQgPSBjaGlwLT5idXMud3JpdGUoY2hpcC0+YnVzLmNsaWVudCwgQURUNzMxNl9DT05GSUcyLCBjb25maWcyKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gLUVJTzsKKworCWNoaXAtPmNvbmZpZzIgPSBjb25maWcyOworCisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIElJT19ERVZJQ0VfQVRUUihhZF9jaGFubmVsLCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJYWR0NzMxNl9zaG93X2FkX2NoYW5uZWwsCisJCWFkdDczMTZfc3RvcmVfYWRfY2hhbm5lbCwKKwkJMCk7CisKK3N0YXRpYyBzc2l6ZV90IGFkdDczMTZfc2hvd19hbGxfYWRfY2hhbm5lbHMoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZHQ3MzE2X2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKworCWlmICghKGNoaXAtPmNvbmZpZzIgJiBBRFQ3MzE2X0FEX1NJTkdMRV9DSF9NT0RFKSkKKwkJcmV0dXJuIC1FUEVSTTsKKworCWlmICgoY2hpcC0+aWQgJiBJRF9GQU1JTFlfTUFTSykgPT0gSURfQURUNzVYWCkKKwkJcmV0dXJuIHNwcmludGYoYnVmLCAiMCAtIFZERFxuMSAtIEludGVybmFsIFRlbXBlcmF0dXJlXG4iCisJCQkJIjIgLSBFeHRlcm5hbCBUZW1wZXJhdHVyZSBvciBBSU4yXG4iCisJCQkJIjMgLSBBSU4yXG40IC0gQUlOM1xuNSAtIEFJTjRcbiIpOworCWVsc2UKKwkJcmV0dXJuIHNwcmludGYoYnVmLCAiMCAtIFZERFxuMSAtIEludGVybmFsIFRlbXBlcmF0dXJlXG4iCisJCQkJIjIgLSBFeHRlcm5hbCBUZW1wZXJhdHVyZVxuIik7Cit9CisKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIoYWxsX2FkX2NoYW5uZWxzLCBTX0lSVUdPLAorCQlhZHQ3MzE2X3Nob3dfYWxsX2FkX2NoYW5uZWxzLCBOVUxMLCAwKTsKKworc3RhdGljIHNzaXplX3QgYWR0NzMxNl9zaG93X2Rpc2FibGVfYXZlcmFnaW5nKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWR0NzMxNl9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwKKwkJISEoY2hpcC0+Y29uZmlnMiAmIEFEVDczMTZfRElTQUJMRV9BVkVSQUdJTkcpKTsKK30KKworc3RhdGljIHNzaXplX3QgYWR0NzMxNl9zdG9yZV9kaXNhYmxlX2F2ZXJhZ2luZyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBsZW4pCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkdDczMTZfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCXU4IGNvbmZpZzI7CisJaW50IHJldDsKKworCWNvbmZpZzIgPSBjaGlwLT5jb25maWcyICYgKH5BRFQ3MzE2X0RJU0FCTEVfQVZFUkFHSU5HKTsKKwlpZiAoIW1lbWNtcChidWYsICIxIiwgMSkpCisJCWNvbmZpZzIgfD0gQURUNzMxNl9ESVNBQkxFX0FWRVJBR0lORzsKKworCXJldCA9IGNoaXAtPmJ1cy53cml0ZShjaGlwLT5idXMuY2xpZW50LCBBRFQ3MzE2X0NPTkZJRzIsIGNvbmZpZzIpOworCWlmIChyZXQpCisJCXJldHVybiAtRUlPOworCisJY2hpcC0+Y29uZmlnMiA9IGNvbmZpZzI7CisKKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKGRpc2FibGVfYXZlcmFnaW5nLCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJYWR0NzMxNl9zaG93X2Rpc2FibGVfYXZlcmFnaW5nLAorCQlhZHQ3MzE2X3N0b3JlX2Rpc2FibGVfYXZlcmFnaW5nLAorCQkwKTsKKworc3RhdGljIHNzaXplX3QgYWR0NzMxNl9zaG93X2VuYWJsZV9zbWJ1c190aW1lb3V0KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWR0NzMxNl9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwKKwkJISEoY2hpcC0+Y29uZmlnMiAmIEFEVDczMTZfRU5fU01CVVNfVElNRU9VVCkpOworfQorCitzdGF0aWMgc3NpemVfdCBhZHQ3MzE2X3N0b3JlX2VuYWJsZV9zbWJ1c190aW1lb3V0KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWR0NzMxNl9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisJdTggY29uZmlnMjsKKwlpbnQgcmV0OworCisJY29uZmlnMiA9IGNoaXAtPmNvbmZpZzIgJiAofkFEVDczMTZfRU5fU01CVVNfVElNRU9VVCk7CisJaWYgKCFtZW1jbXAoYnVmLCAiMSIsIDEpKQorCQljb25maWcyIHw9IEFEVDczMTZfRU5fU01CVVNfVElNRU9VVDsKKworCXJldCA9IGNoaXAtPmJ1cy53cml0ZShjaGlwLT5idXMuY2xpZW50LCBBRFQ3MzE2X0NPTkZJRzIsIGNvbmZpZzIpOworCWlmIChyZXQpCisJCXJldHVybiAtRUlPOworCisJY2hpcC0+Y29uZmlnMiA9IGNvbmZpZzI7CisKKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKGVuYWJsZV9zbWJ1c190aW1lb3V0LCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJYWR0NzMxNl9zaG93X2VuYWJsZV9zbWJ1c190aW1lb3V0LAorCQlhZHQ3MzE2X3N0b3JlX2VuYWJsZV9zbWJ1c190aW1lb3V0LAorCQkwKTsKKworCitzdGF0aWMgc3NpemVfdCBhZHQ3MzE2X3N0b3JlX3Jlc2V0KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWR0NzMxNl9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisJdTggY29uZmlnMjsKKwlpbnQgcmV0OworCisJY29uZmlnMiA9IGNoaXAtPmNvbmZpZzIgfCBBRFQ3MzE2X1JFU0VUOworCisJcmV0ID0gY2hpcC0+YnVzLndyaXRlKGNoaXAtPmJ1cy5jbGllbnQsIEFEVDczMTZfQ09ORklHMiwgY29uZmlnMik7CisJaWYgKHJldCkKKwkJcmV0dXJuIC1FSU87CisKKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKHJlc2V0LCBTX0lXVVNSLAorCQlOVUxMLAorCQlhZHQ3MzE2X3N0b3JlX3Jlc2V0LAorCQkwKTsKKworc3RhdGljIHNzaXplX3QgYWR0NzMxNl9zaG93X3Bvd2VyZG93bihzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkdDczMTZfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsICEhKGNoaXAtPmNvbmZpZzEgJiBBRFQ3MzE2X1BEKSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkdDczMTZfc3RvcmVfcG93ZXJkb3duKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWR0NzMxNl9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisJdTggY29uZmlnMTsKKwlpbnQgcmV0OworCisJY29uZmlnMSA9IGNoaXAtPmNvbmZpZzEgJiAofkFEVDczMTZfUEQpOworCWlmICghbWVtY21wKGJ1ZiwgIjEiLCAxKSkKKwkJY29uZmlnMSB8PSBBRFQ3MzE2X1BEOworCisJcmV0ID0gY2hpcC0+YnVzLndyaXRlKGNoaXAtPmJ1cy5jbGllbnQsIEFEVDczMTZfQ09ORklHMSwgY29uZmlnMSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIC1FSU87CisKKwljaGlwLT5jb25maWcxID0gY29uZmlnMTsKKworCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIocG93ZXJkb3duLCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJYWR0NzMxNl9zaG93X3Bvd2VyZG93biwKKwkJYWR0NzMxNl9zdG9yZV9wb3dlcmRvd24sCisJCTApOworCitzdGF0aWMgc3NpemVfdCBhZHQ3MzE2X3Nob3dfZmFzdF9hZF9jbG9jayhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkdDczMTZfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsICEhKGNoaXAtPmNvbmZpZzMgJiBBRFQ3MzE2X0FEQ0xLXzIyXzUpKTsKK30KKworc3RhdGljIHNzaXplX3QgYWR0NzMxNl9zdG9yZV9mYXN0X2FkX2Nsb2NrKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWR0NzMxNl9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisJdTggY29uZmlnMzsKKwlpbnQgcmV0OworCisJY29uZmlnMyA9IGNoaXAtPmNvbmZpZzMgJiAofkFEVDczMTZfQURDTEtfMjJfNSk7CisJaWYgKCFtZW1jbXAoYnVmLCAiMSIsIDEpKQorCQljb25maWczIHw9IEFEVDczMTZfQURDTEtfMjJfNTsKKworCXJldCA9IGNoaXAtPmJ1cy53cml0ZShjaGlwLT5idXMuY2xpZW50LCBBRFQ3MzE2X0NPTkZJRzMsIGNvbmZpZzMpOworCWlmIChyZXQpCisJCXJldHVybiAtRUlPOworCisJY2hpcC0+Y29uZmlnMyA9IGNvbmZpZzM7CisKKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKGZhc3RfYWRfY2xvY2ssIFNfSVJVR08gfCBTX0lXVVNSLAorCQlhZHQ3MzE2X3Nob3dfZmFzdF9hZF9jbG9jaywKKwkJYWR0NzMxNl9zdG9yZV9mYXN0X2FkX2Nsb2NrLAorCQkwKTsKKworc3RhdGljIHNzaXplX3QgYWR0NzMxNl9zaG93X2RhX2hpZ2hfcmVzb2x1dGlvbihzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkdDczMTZfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCisJaWYgKGNoaXAtPmNvbmZpZzMgJiBBRFQ3MzE2X0RBX0hJR0hfUkVTT0xVVElPTikgeworCQlpZiAoY2hpcC0+aWQgPT0gSURfQURUNzMxNiB8fCBjaGlwLT5pZCA9PSBJRF9BRFQ3NTE2KQorCQkJcmV0dXJuIHNwcmludGYoYnVmLCAiMSAoMTIgYml0cylcbiIpOworCQllbHNlIGlmIChjaGlwLT5pZCA9PSBJRF9BRFQ3MzE3IHx8IGNoaXAtPmlkID09IElEX0FEVDc1MTcpCisJCQlyZXR1cm4gc3ByaW50ZihidWYsICIxICgxMCBiaXRzKVxuIik7CisJfQorCisJcmV0dXJuIHNwcmludGYoYnVmLCAiMCAoOCBiaXRzKVxuIik7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkdDczMTZfc3RvcmVfZGFfaGlnaF9yZXNvbHV0aW9uKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWR0NzMxNl9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisJdTggY29uZmlnMzsKKwlpbnQgcmV0OworCisJY2hpcC0+ZGFjX2JpdHMgPSA4OworCisJaWYgKCFtZW1jbXAoYnVmLCAiMSIsIDEpKSB7CisJCWNvbmZpZzMgPSBjaGlwLT5jb25maWczIHwgQURUNzMxNl9EQV9ISUdIX1JFU09MVVRJT047CisJCWlmIChjaGlwLT5pZCA9PSBJRF9BRFQ3MzE2IHx8IGNoaXAtPmlkID09IElEX0FEVDc1MTYpCisJCQljaGlwLT5kYWNfYml0cyA9IDEyOworCQllbHNlIGlmIChjaGlwLT5pZCA9PSBJRF9BRFQ3MzE3IHx8IGNoaXAtPmlkID09IElEX0FEVDc1MTcpCisJCQljaGlwLT5kYWNfYml0cyA9IDEwOworCX0gZWxzZQorCQljb25maWczID0gY2hpcC0+Y29uZmlnMyAmICh+QURUNzMxNl9EQV9ISUdIX1JFU09MVVRJT04pOworCisJcmV0ID0gY2hpcC0+YnVzLndyaXRlKGNoaXAtPmJ1cy5jbGllbnQsIEFEVDczMTZfQ09ORklHMywgY29uZmlnMyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIC1FSU87CisKKwljaGlwLT5jb25maWczID0gY29uZmlnMzsKKworCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIoZGFfaGlnaF9yZXNvbHV0aW9uLCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJYWR0NzMxNl9zaG93X2RhX2hpZ2hfcmVzb2x1dGlvbiwKKwkJYWR0NzMxNl9zdG9yZV9kYV9oaWdoX3Jlc29sdXRpb24sCisJCTApOworCitzdGF0aWMgc3NpemVfdCBhZHQ3MzE2X3Nob3dfQUlOX2ludGVybmFsX1ZyZWYoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZHQ3MzE2X2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKworCWlmICgoY2hpcC0+aWQgJiBJRF9GQU1JTFlfTUFTSykgIT0gSURfQURUNzVYWCkKKwkJcmV0dXJuIC1FUEVSTTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLAorCQkhIShjaGlwLT5jb25maWczICYgQURUNzUxNl9BSU5fSU5fVlJFRikpOworfQorCitzdGF0aWMgc3NpemVfdCBhZHQ3MzE2X3N0b3JlX0FJTl9pbnRlcm5hbF9WcmVmKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWR0NzMxNl9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisJdTggY29uZmlnMzsKKwlpbnQgcmV0OworCisJaWYgKChjaGlwLT5pZCAmIElEX0ZBTUlMWV9NQVNLKSAhPSBJRF9BRFQ3NVhYKQorCQlyZXR1cm4gLUVQRVJNOworCisJaWYgKG1lbWNtcChidWYsICIxIiwgMSkpCisJCWNvbmZpZzMgPSBjaGlwLT5jb25maWczICYgKH5BRFQ3NTE2X0FJTl9JTl9WUkVGKTsKKwllbHNlCisJCWNvbmZpZzMgPSBjaGlwLT5jb25maWczIHwgQURUNzUxNl9BSU5fSU5fVlJFRjsKKworCXJldCA9IGNoaXAtPmJ1cy53cml0ZShjaGlwLT5idXMuY2xpZW50LCBBRFQ3MzE2X0NPTkZJRzMsIGNvbmZpZzMpOworCWlmIChyZXQpCisJCXJldHVybiAtRUlPOworCisJY2hpcC0+Y29uZmlnMyA9IGNvbmZpZzM7CisKKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKEFJTl9pbnRlcm5hbF9WcmVmLCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJYWR0NzMxNl9zaG93X0FJTl9pbnRlcm5hbF9WcmVmLAorCQlhZHQ3MzE2X3N0b3JlX0FJTl9pbnRlcm5hbF9WcmVmLAorCQkwKTsKKworCitzdGF0aWMgc3NpemVfdCBhZHQ3MzE2X3Nob3dfZW5hYmxlX3Byb3BfREFDQShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkdDczMTZfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsCisJCSEhKGNoaXAtPmNvbmZpZzMgJiBBRFQ3MzE2X0VOX0lOX1RFTVBfUFJPUF9EQUNBKSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkdDczMTZfc3RvcmVfZW5hYmxlX3Byb3BfREFDQShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBsZW4pCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkdDczMTZfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCXU4IGNvbmZpZzM7CisJaW50IHJldDsKKworCWNvbmZpZzMgPSBjaGlwLT5jb25maWczICYgKH5BRFQ3MzE2X0VOX0lOX1RFTVBfUFJPUF9EQUNBKTsKKwlpZiAoIW1lbWNtcChidWYsICIxIiwgMSkpCisJCWNvbmZpZzMgfD0gQURUNzMxNl9FTl9JTl9URU1QX1BST1BfREFDQTsKKworCXJldCA9IGNoaXAtPmJ1cy53cml0ZShjaGlwLT5idXMuY2xpZW50LCBBRFQ3MzE2X0NPTkZJRzMsIGNvbmZpZzMpOworCWlmIChyZXQpCisJCXJldHVybiAtRUlPOworCisJY2hpcC0+Y29uZmlnMyA9IGNvbmZpZzM7CisKKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKGVuYWJsZV9wcm9wb3J0aW9uX0RBQ0EsIFNfSVJVR08gfCBTX0lXVVNSLAorCQlhZHQ3MzE2X3Nob3dfZW5hYmxlX3Byb3BfREFDQSwKKwkJYWR0NzMxNl9zdG9yZV9lbmFibGVfcHJvcF9EQUNBLAorCQkwKTsKKworc3RhdGljIHNzaXplX3QgYWR0NzMxNl9zaG93X2VuYWJsZV9wcm9wX0RBQ0Ioc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZHQ3MzE2X2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLAorCQkhIShjaGlwLT5jb25maWczICYgQURUNzMxNl9FTl9FWF9URU1QX1BST1BfREFDQikpOworfQorCitzdGF0aWMgc3NpemVfdCBhZHQ3MzE2X3N0b3JlX2VuYWJsZV9wcm9wX0RBQ0Ioc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgbGVuKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZHQ3MzE2X2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKwl1OCBjb25maWczOworCWludCByZXQ7CisKKwljb25maWczID0gY2hpcC0+Y29uZmlnMyAmICh+QURUNzMxNl9FTl9FWF9URU1QX1BST1BfREFDQik7CisJaWYgKCFtZW1jbXAoYnVmLCAiMSIsIDEpKQorCQljb25maWczIHw9IEFEVDczMTZfRU5fRVhfVEVNUF9QUk9QX0RBQ0I7CisKKwlyZXQgPSBjaGlwLT5idXMud3JpdGUoY2hpcC0+YnVzLmNsaWVudCwgQURUNzMxNl9DT05GSUczLCBjb25maWczKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gLUVJTzsKKworCWNoaXAtPmNvbmZpZzMgPSBjb25maWczOworCisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIElJT19ERVZJQ0VfQVRUUihlbmFibGVfcHJvcG9ydGlvbl9EQUNCLCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJYWR0NzMxNl9zaG93X2VuYWJsZV9wcm9wX0RBQ0IsCisJCWFkdDczMTZfc3RvcmVfZW5hYmxlX3Byb3BfREFDQiwKKwkJMCk7CisKK3N0YXRpYyBzc2l6ZV90IGFkdDczMTZfc2hvd19EQUNfMlZyZWZfY2hfbWFzayhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkdDczMTZfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiMHgleFxuIiwKKwkJY2hpcC0+ZGFjX2NvbmZpZyAmIEFEVDczMTZfREFfMlZSRUZfQ0hfTUFTSyk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkdDczMTZfc3RvcmVfREFDXzJWcmVmX2NoX21hc2soc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgbGVuKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZHQ3MzE2X2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKwl1OCBkYWNfY29uZmlnOworCXVuc2lnbmVkIGxvbmcgZGF0YSA9IDA7CisJaW50IHJldDsKKworCXJldCA9IHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMTYsICZkYXRhKTsKKwlpZiAocmV0IHx8IGRhdGEgPiBBRFQ3MzE2X0RBXzJWUkVGX0NIX01BU0spCisJCXJldHVybiAtRUlOVkFMOworCisJZGFjX2NvbmZpZyA9IGNoaXAtPmRhY19jb25maWcgJiAofkFEVDczMTZfREFfMlZSRUZfQ0hfTUFTSyk7CisJZGFjX2NvbmZpZyB8PSBkYXRhOworCisJcmV0ID0gY2hpcC0+YnVzLndyaXRlKGNoaXAtPmJ1cy5jbGllbnQsIEFEVDczMTZfREFDX0NPTkZJRywgZGFjX2NvbmZpZyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIC1FSU87CisKKwljaGlwLT5kYWNfY29uZmlnID0gZGFjX2NvbmZpZzsKKworCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIoREFDXzJWcmVmX2NoYW5uZWxzX21hc2ssIFNfSVJVR08gfCBTX0lXVVNSLAorCQlhZHQ3MzE2X3Nob3dfREFDXzJWcmVmX2NoX21hc2ssCisJCWFkdDczMTZfc3RvcmVfREFDXzJWcmVmX2NoX21hc2ssCisJCTApOworCitzdGF0aWMgc3NpemVfdCBhZHQ3MzE2X3Nob3dfREFDX3VwZGF0ZV9tb2RlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWR0NzMxNl9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisKKwlpZiAoIShjaGlwLT5jb25maWczICYgQURUNzMxNl9EQV9FTl9WSUFfREFDX0xEQ0EpKQorCQlyZXR1cm4gc3ByaW50ZihidWYsICJtYW51YWxcbiIpOworCWVsc2UgeworCQlzd2l0Y2ggKGNoaXAtPmRhY19jb25maWcgJiBBRFQ3MzE2X0RBX0VOX01PREVfTUFTSykgeworCQljYXNlIEFEVDczMTZfREFfRU5fTU9ERV9TSU5HTEU6CisJCQlyZXR1cm4gc3ByaW50ZihidWYsICIwIC0gYXV0byBhdCBhbnkgTVNCIERBQyB3cml0aW5nXG4iKTsKKwkJY2FzZSBBRFQ3MzE2X0RBX0VOX01PREVfQUJfQ0Q6CisJCQlyZXR1cm4gc3ByaW50ZihidWYsICIxIC0gYXV0byBhdCBNU0IgREFDIEFCIGFuZCBDRCB3cml0aW5nXG4iKTsKKwkJY2FzZSBBRFQ3MzE2X0RBX0VOX01PREVfQUJDRDoKKwkJCXJldHVybiBzcHJpbnRmKGJ1ZiwgIjIgLSBhdXRvIGF0IE1TQiBEQUMgQUJDRCB3cml0aW5nXG4iKTsKKwkJZGVmYXVsdDogLyogQURUNzMxNl9EQV9FTl9NT0RFX0xEQUMgKi8KKwkJCXJldHVybiBzcHJpbnRmKGJ1ZiwgIjMgLSBtYW51YWxcbiIpOworCQl9OworCX0KK30KKworc3RhdGljIHNzaXplX3QgYWR0NzMxNl9zdG9yZV9EQUNfdXBkYXRlX21vZGUoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgbGVuKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZHQ3MzE2X2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKwl1OCBkYWNfY29uZmlnOworCXVuc2lnbmVkIGxvbmcgZGF0YTsKKwlpbnQgcmV0OworCisJaWYgKCEoY2hpcC0+Y29uZmlnMyAmIEFEVDczMTZfREFfRU5fVklBX0RBQ19MRENBKSkKKwkJcmV0dXJuIC1FUEVSTTsKKworCXJldCA9IHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMTAsICZkYXRhKTsKKwlpZiAocmV0IHx8IGRhdGEgPiBBRFQ3MzE2X0RBX0VOX01PREVfTUFTSykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlkYWNfY29uZmlnID0gY2hpcC0+ZGFjX2NvbmZpZyAmICh+QURUNzMxNl9EQV9FTl9NT0RFX01BU0spOworCWRhY19jb25maWcgfD0gZGF0YTsKKworCXJldCA9IGNoaXAtPmJ1cy53cml0ZShjaGlwLT5idXMuY2xpZW50LCBBRFQ3MzE2X0RBQ19DT05GSUcsIGRhY19jb25maWcpOworCWlmIChyZXQpCisJCXJldHVybiAtRUlPOworCisJY2hpcC0+ZGFjX2NvbmZpZyA9IGRhY19jb25maWc7CisKKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKERBQ191cGRhdGVfbW9kZSwgU19JUlVHTyB8IFNfSVdVU1IsCisJCWFkdDczMTZfc2hvd19EQUNfdXBkYXRlX21vZGUsCisJCWFkdDczMTZfc3RvcmVfREFDX3VwZGF0ZV9tb2RlLAorCQkwKTsKKworc3RhdGljIHNzaXplX3QgYWR0NzMxNl9zaG93X2FsbF9EQUNfdXBkYXRlX21vZGVzKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWR0NzMxNl9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisKKwlpZiAoY2hpcC0+Y29uZmlnMyAmIEFEVDczMTZfREFfRU5fVklBX0RBQ19MRENBKQorCQlyZXR1cm4gc3ByaW50ZihidWYsICIwIC0gYXV0byBhdCBhbnkgTVNCIERBQyB3cml0aW5nXG4iCisJCQkJIjEgLSBhdXRvIGF0IE1TQiBEQUMgQUIgYW5kIENEIHdyaXRpbmdcbiIKKwkJCQkiMiAtIGF1dG8gYXQgTVNCIERBQyBBQkNEIHdyaXRpbmdcbiIKKwkJCQkiMyAtIG1hbnVhbFxuIik7CisJZWxzZQorCQlyZXR1cm4gc3ByaW50ZihidWYsICJtYW51YWxcbiIpOworfQorCitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKGFsbF9EQUNfdXBkYXRlX21vZGVzLCBTX0lSVUdPLAorCQlhZHQ3MzE2X3Nob3dfYWxsX0RBQ191cGRhdGVfbW9kZXMsIE5VTEwsIDApOworCisKK3N0YXRpYyBzc2l6ZV90IGFkdDczMTZfc3RvcmVfdXBkYXRlX0RBQyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBsZW4pCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkdDczMTZfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCXU4IGxkYWNfY29uZmlnOworCXVuc2lnbmVkIGxvbmcgZGF0YTsKKwlpbnQgcmV0OworCisJaWYgKGNoaXAtPmNvbmZpZzMgJiBBRFQ3MzE2X0RBX0VOX1ZJQV9EQUNfTERDQSkgeworCQlpZiAoKGNoaXAtPmRhY19jb25maWcgJiBBRFQ3MzE2X0RBX0VOX01PREVfTUFTSykgIT0KKwkJCUFEVDczMTZfREFfRU5fTU9ERV9MREFDKQorCQkJcmV0dXJuIC1FUEVSTTsKKworCQlyZXQgPSBzdHJpY3Rfc3RydG91bChidWYsIDE2LCAmZGF0YSk7CisJCWlmIChyZXQgfHwgZGF0YSA+IEFEVDczMTZfTERBQ19FTl9EQV9NQVNLKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJbGRhY19jb25maWcgPSBjaGlwLT5sZGFjX2NvbmZpZyAmICh+QURUNzMxNl9MREFDX0VOX0RBX01BU0spOworCQlsZGFjX2NvbmZpZyB8PSBkYXRhOworCisJCXJldCA9IGNoaXAtPmJ1cy53cml0ZShjaGlwLT5idXMuY2xpZW50LCBBRFQ3MzE2X0xEQUNfQ09ORklHLAorCQkJbGRhY19jb25maWcpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIC1FSU87CisJfSBlbHNlIHsKKwkJZ3Bpb19zZXRfdmFsdWUoY2hpcC0+bGRhY19waW4sIDApOworCQlncGlvX3NldF92YWx1ZShjaGlwLT5sZGFjX3BpbiwgMSk7CisJfQorCisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIElJT19ERVZJQ0VfQVRUUih1cGRhdGVfREFDLCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJTlVMTCwKKwkJYWR0NzMxNl9zdG9yZV91cGRhdGVfREFDLAorCQkwKTsKKworc3RhdGljIHNzaXplX3QgYWR0NzMxNl9zaG93X0RBX0FCX1ZyZWZfYnlwYXNzKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWR0NzMxNl9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisKKwlpZiAoKGNoaXAtPmlkICYgSURfRkFNSUxZX01BU0spID09IElEX0FEVDc1WFgpCisJCXJldHVybiAtRVBFUk07CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwKKwkJISEoY2hpcC0+ZGFjX2NvbmZpZyAmIEFEVDczMTZfVlJFRl9CWVBBU1NfREFDX0FCKSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkdDczMTZfc3RvcmVfREFfQUJfVnJlZl9ieXBhc3Moc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgbGVuKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZHQ3MzE2X2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKwl1OCBkYWNfY29uZmlnOworCWludCByZXQ7CisKKwlpZiAoKGNoaXAtPmlkICYgSURfRkFNSUxZX01BU0spID09IElEX0FEVDc1WFgpCisJCXJldHVybiAtRVBFUk07CisKKwlkYWNfY29uZmlnID0gY2hpcC0+ZGFjX2NvbmZpZyAmICh+QURUNzMxNl9WUkVGX0JZUEFTU19EQUNfQUIpOworCWlmICghbWVtY21wKGJ1ZiwgIjEiLCAxKSkKKwkJZGFjX2NvbmZpZyB8PSBBRFQ3MzE2X1ZSRUZfQllQQVNTX0RBQ19BQjsKKworCXJldCA9IGNoaXAtPmJ1cy53cml0ZShjaGlwLT5idXMuY2xpZW50LCBBRFQ3MzE2X0RBQ19DT05GSUcsIGRhY19jb25maWcpOworCWlmIChyZXQpCisJCXJldHVybiAtRUlPOworCisJY2hpcC0+ZGFjX2NvbmZpZyA9IGRhY19jb25maWc7CisKKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKERBX0FCX1ZyZWZfYnlwYXNzLCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJYWR0NzMxNl9zaG93X0RBX0FCX1ZyZWZfYnlwYXNzLAorCQlhZHQ3MzE2X3N0b3JlX0RBX0FCX1ZyZWZfYnlwYXNzLAorCQkwKTsKKworc3RhdGljIHNzaXplX3QgYWR0NzMxNl9zaG93X0RBX0NEX1ZyZWZfYnlwYXNzKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWR0NzMxNl9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisKKwlpZiAoKGNoaXAtPmlkICYgSURfRkFNSUxZX01BU0spID09IElEX0FEVDc1WFgpCisJCXJldHVybiAtRVBFUk07CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwKKwkJISEoY2hpcC0+ZGFjX2NvbmZpZyAmIEFEVDczMTZfVlJFRl9CWVBBU1NfREFDX0NEKSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkdDczMTZfc3RvcmVfREFfQ0RfVnJlZl9ieXBhc3Moc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgbGVuKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZHQ3MzE2X2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKwl1OCBkYWNfY29uZmlnOworCWludCByZXQ7CisKKwlpZiAoKGNoaXAtPmlkICYgSURfRkFNSUxZX01BU0spID09IElEX0FEVDc1WFgpCisJCXJldHVybiAtRVBFUk07CisKKwlkYWNfY29uZmlnID0gY2hpcC0+ZGFjX2NvbmZpZyAmICh+QURUNzMxNl9WUkVGX0JZUEFTU19EQUNfQ0QpOworCWlmICghbWVtY21wKGJ1ZiwgIjEiLCAxKSkKKwkJZGFjX2NvbmZpZyB8PSBBRFQ3MzE2X1ZSRUZfQllQQVNTX0RBQ19DRDsKKworCXJldCA9IGNoaXAtPmJ1cy53cml0ZShjaGlwLT5idXMuY2xpZW50LCBBRFQ3MzE2X0RBQ19DT05GSUcsIGRhY19jb25maWcpOworCWlmIChyZXQpCisJCXJldHVybiAtRUlPOworCisJY2hpcC0+ZGFjX2NvbmZpZyA9IGRhY19jb25maWc7CisKKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKERBX0NEX1ZyZWZfYnlwYXNzLCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJYWR0NzMxNl9zaG93X0RBX0NEX1ZyZWZfYnlwYXNzLAorCQlhZHQ3MzE2X3N0b3JlX0RBX0NEX1ZyZWZfYnlwYXNzLAorCQkwKTsKKworc3RhdGljIHNzaXplX3QgYWR0NzMxNl9zaG93X0RBQ19pbnRlcm5hbF9WcmVmKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWR0NzMxNl9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisKKwlpZiAoKGNoaXAtPmlkICYgSURfRkFNSUxZX01BU0spID09IElEX0FEVDc1WFgpCisJCXJldHVybiBzcHJpbnRmKGJ1ZiwgIjB4JXhcbiIsCisJCQkoY2hpcC0+ZGFjX2NvbmZpZyAmIEFEVDc1MTZfREFDX0lOX1ZSRUZfTUFTSykgPj4KKwkJCUFEVDc1MTZfREFDX0lOX1ZSRUZfT0ZGU0VUKTsKKwllbHNlCisJCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLAorCQkJISEoY2hpcC0+ZGFjX2NvbmZpZyAmIEFEVDczMTZfREFDX0lOX1ZSRUYpKTsKK30KKworc3RhdGljIHNzaXplX3QgYWR0NzMxNl9zdG9yZV9EQUNfaW50ZXJuYWxfVnJlZihzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBsZW4pCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkdDczMTZfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCXU4IGxkYWNfY29uZmlnOworCXVuc2lnbmVkIGxvbmcgZGF0YTsKKwlpbnQgcmV0OworCisJaWYgKChjaGlwLT5pZCAmIElEX0ZBTUlMWV9NQVNLKSA9PSBJRF9BRFQ3NVhYKSB7CisJCXJldCA9IHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMTYsICZkYXRhKTsKKwkJaWYgKHJldCB8fCBkYXRhID4gMykKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWxkYWNfY29uZmlnID0gY2hpcC0+bGRhY19jb25maWcgJiAofkFEVDc1MTZfREFDX0lOX1ZSRUZfTUFTSyk7CisJCWlmIChkYXRhICYgMHgxKQorCQkJbGRhY19jb25maWcgfD0gQURUNzUxNl9EQUNfQUJfSU5fVlJFRjsKKwkJZWxzZSBpZiAoZGF0YSAmIDB4MikKKwkJCWxkYWNfY29uZmlnIHw9IEFEVDc1MTZfREFDX0NEX0lOX1ZSRUY7CisJfSBlbHNlIHsKKwkJcmV0ID0gc3RyaWN0X3N0cnRvdWwoYnVmLCAxNiwgJmRhdGEpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJbGRhY19jb25maWcgPSBjaGlwLT5sZGFjX2NvbmZpZyAmICh+QURUNzMxNl9EQUNfSU5fVlJFRik7CisJCWlmIChkYXRhKQorCQkJbGRhY19jb25maWcgPSBjaGlwLT5sZGFjX2NvbmZpZyB8IEFEVDczMTZfREFDX0lOX1ZSRUY7CisJfQorCisJcmV0ID0gY2hpcC0+YnVzLndyaXRlKGNoaXAtPmJ1cy5jbGllbnQsIEFEVDczMTZfTERBQ19DT05GSUcsIGxkYWNfY29uZmlnKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gLUVJTzsKKworCWNoaXAtPmxkYWNfY29uZmlnID0gbGRhY19jb25maWc7CisKKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKERBQ19pbnRlcm5hbF9WcmVmLCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJYWR0NzMxNl9zaG93X0RBQ19pbnRlcm5hbF9WcmVmLAorCQlhZHQ3MzE2X3N0b3JlX0RBQ19pbnRlcm5hbF9WcmVmLAorCQkwKTsKKworc3RhdGljIHNzaXplX3QgYWR0NzMxNl9zaG93X2FkKHN0cnVjdCBhZHQ3MzE2X2NoaXBfaW5mbyAqY2hpcCwKKwkJaW50IGNoYW5uZWwsIGNoYXIgKmJ1ZikKK3sKKwl1MTYgZGF0YTsKKwl1OCBtc2IsIGxzYjsKKwljaGFyIHNpZ24gPSAnICc7CisJaW50IHJldDsKKworCWlmICgoY2hpcC0+Y29uZmlnMiAmIEFEVDczMTZfQURfU0lOR0xFX0NIX01PREUpICYmCisJCWNoYW5uZWwgIT0gKGNoaXAtPmNvbmZpZzIgJiBBRFQ3NTE2X0FEX1NJTkdMRV9DSF9NQVNLKSkKKwkJcmV0dXJuIC1FUEVSTTsKKworCXN3aXRjaCAoY2hhbm5lbCkgeworCWNhc2UgQURUNzMxNl9BRF9TSU5HTEVfQ0hfSU46CisJCXJldCA9IGNoaXAtPmJ1cy5yZWFkKGNoaXAtPmJ1cy5jbGllbnQsCisJCQlBRFQ3MzE2X0xTQl9JTl9URU1QX1ZERCwgJmxzYik7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gLUVJTzsKKworCQlyZXQgPSBjaGlwLT5idXMucmVhZChjaGlwLT5idXMuY2xpZW50LAorCQkJQURUNzMxNl9BRF9NU0JfREFUQV9CQVNFICsgY2hhbm5lbCwgJm1zYik7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gLUVJTzsKKworCQlkYXRhID0gbXNiIDw8IEFEVDczMTZfVF9WQUxVRV9GTE9BVF9PRkZTRVQ7CisJCWRhdGEgfD0gbHNiICYgQURUNzMxNl9MU0JfSU5fVEVNUF9NQVNLOworCQlicmVhazsKKwljYXNlIEFEVDczMTZfQURfU0lOR0xFX0NIX1ZERDoKKwkJcmV0ID0gY2hpcC0+YnVzLnJlYWQoY2hpcC0+YnVzLmNsaWVudCwKKwkJCUFEVDczMTZfTFNCX0lOX1RFTVBfVkRELCAmbHNiKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiAtRUlPOworCisJCXJldCA9IGNoaXAtPmJ1cy5yZWFkKGNoaXAtPmJ1cy5jbGllbnQsCisKKwkJCUFEVDczMTZfQURfTVNCX0RBVEFfQkFTRSArIGNoYW5uZWwsICZtc2IpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIC1FSU87CisKKwkJZGF0YSA9IG1zYiA8PCBBRFQ3MzE2X1RfVkFMVUVfRkxPQVRfT0ZGU0VUOworCQlkYXRhIHw9IChsc2IgJiBBRFQ3MzE2X0xTQl9WRERfTUFTSykgPj4gQURUNzMxNl9MU0JfVkREX09GRlNFVDsKKwkJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIGRhdGEpOworCWRlZmF1bHQ6IC8qIGV4X3RlbXAgYW5kIGFpbiAqLworCQlyZXQgPSBjaGlwLT5idXMucmVhZChjaGlwLT5idXMuY2xpZW50LAorCQkJQURUNzMxNl9MU0JfRVhfVEVNUF9BSU4sICZsc2IpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIC1FSU87CisKKwkJcmV0ID0gY2hpcC0+YnVzLnJlYWQoY2hpcC0+YnVzLmNsaWVudCwKKwkJCUFEVDczMTZfQURfTVNCX0RBVEFfQkFTRSArIGNoYW5uZWwsICZtc2IpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIC1FSU87CisKKwkJZGF0YSA9IG1zYiA8PCBBRFQ3MzE2X1RfVkFMVUVfRkxPQVRfT0ZGU0VUOworCQlkYXRhIHw9IGxzYiAmIChBRFQ3MzE2X0xTQl9FWF9URU1QX01BU0sgPDwKKwkJCShBRFQ3NTE2X0xTQl9BSU5fU0hJRlQgKiAoY2hhbm5lbCAtCisJCQkoQURUNzMxNl9NU0JfRVhfVEVNUCAtIEFEVDczMTZfQURfTVNCX0RBVEFfQkFTRSkpKSk7CisKKwkJaWYgKChjaGlwLT5pZCAmIElEX0ZBTUlMWV9NQVNLKSA9PSBJRF9BRFQ3NVhYKQorCQkJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIGRhdGEpOworCQllbHNlCisJCQlicmVhazsKKwl9OworCisJaWYgKGRhdGEgJiBBRFQ3MzE2X1RfVkFMVUVfU0lHTikgeworCQkvKiBjb252ZXJ0IHN1cHBsZW1lbnQgdG8gcG9zaXRpdmUgdmFsdWUgKi8KKwkJZGF0YSA9IChBRFQ3MzE2X1RfVkFMVUVfU0lHTiA8PCAxKSAtIGRhdGE7CisJCXNpZ24gPSAnLSc7CisJfQorCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWMlZC4lLjJkXG4iLCBzaWduLAorCQkoZGF0YSA+PiBBRFQ3MzE2X1RfVkFMVUVfRkxPQVRfT0ZGU0VUKSwKKwkJKGRhdGEgJiBBRFQ3MzE2X1RfVkFMVUVfRkxPQVRfTUFTSykgKiAyNSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkdDczMTZfc2hvd19WREQoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZHQ3MzE2X2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKworCXJldHVybiBhZHQ3MzE2X3Nob3dfYWQoY2hpcCwgQURUNzMxNl9BRF9TSU5HTEVfQ0hfVkRELCBidWYpOworfQorc3RhdGljIElJT19ERVZJQ0VfQVRUUihWREQsIFNfSVJVR08sIGFkdDczMTZfc2hvd19WREQsIE5VTEwsIDApOworCitzdGF0aWMgc3NpemVfdCBhZHQ3MzE2X3Nob3dfaW5fdGVtcChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkdDczMTZfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCisJcmV0dXJuIGFkdDczMTZfc2hvd19hZChjaGlwLCBBRFQ3MzE2X0FEX1NJTkdMRV9DSF9JTiwgYnVmKTsKK30KKworc3RhdGljIElJT19ERVZJQ0VfQVRUUihpbl90ZW1wLCBTX0lSVUdPLCBhZHQ3MzE2X3Nob3dfaW5fdGVtcCwgTlVMTCwgMCk7CisKK3N0YXRpYyBzc2l6ZV90IGFkdDczMTZfc2hvd19leF90ZW1wX0FJTjEoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZHQ3MzE2X2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKworCXJldHVybiBhZHQ3MzE2X3Nob3dfYWQoY2hpcCwgQURUNzMxNl9BRF9TSU5HTEVfQ0hfRVgsIGJ1Zik7Cit9CisKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIoZXhfdGVtcF9BSU4xLCBTX0lSVUdPLCBhZHQ3MzE2X3Nob3dfZXhfdGVtcF9BSU4xLCBOVUxMLCAwKTsKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIoZXhfdGVtcCwgU19JUlVHTywgYWR0NzMxNl9zaG93X2V4X3RlbXBfQUlOMSwgTlVMTCwgMCk7CisKK3N0YXRpYyBzc2l6ZV90IGFkdDczMTZfc2hvd19BSU4yKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWR0NzMxNl9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisKKwlyZXR1cm4gYWR0NzMxNl9zaG93X2FkKGNoaXAsIEFEVDc1MTZfQURfU0lOR0xFX0NIX0FJTjIsIGJ1Zik7Cit9CitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKEFJTjIsIFNfSVJVR08sIGFkdDczMTZfc2hvd19BSU4yLCBOVUxMLCAwKTsKKworc3RhdGljIHNzaXplX3QgYWR0NzMxNl9zaG93X0FJTjMoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZHQ3MzE2X2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKworCXJldHVybiBhZHQ3MzE2X3Nob3dfYWQoY2hpcCwgQURUNzUxNl9BRF9TSU5HTEVfQ0hfQUlOMywgYnVmKTsKK30KK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIoQUlOMywgU19JUlVHTywgYWR0NzMxNl9zaG93X0FJTjMsIE5VTEwsIDApOworCitzdGF0aWMgc3NpemVfdCBhZHQ3MzE2X3Nob3dfQUlONChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkdDczMTZfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCisJcmV0dXJuIGFkdDczMTZfc2hvd19hZChjaGlwLCBBRFQ3NTE2X0FEX1NJTkdMRV9DSF9BSU40LCBidWYpOworfQorc3RhdGljIElJT19ERVZJQ0VfQVRUUihBSU40LCBTX0lSVUdPLCBhZHQ3MzE2X3Nob3dfQUlONCwgTlVMTCwgMCk7CisKK3N0YXRpYyBzc2l6ZV90IGFkdDczMTZfc2hvd190ZW1wX29mZnNldChzdHJ1Y3QgYWR0NzMxNl9jaGlwX2luZm8gKmNoaXAsCisJCWludCBvZmZzZXRfYWRkciwgY2hhciAqYnVmKQoreworCWludCBkYXRhOworCXU4IHZhbDsKKwlpbnQgcmV0OworCisJcmV0ID0gY2hpcC0+YnVzLnJlYWQoY2hpcC0+YnVzLmNsaWVudCwgb2Zmc2V0X2FkZHIsICZ2YWwpOworCWlmIChyZXQpCisJCXJldHVybiAtRUlPOworCisJZGF0YSA9IChpbnQpdmFsOworCWlmICh2YWwgJiAweDgwKQorCQlkYXRhIC09IDI1NjsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBkYXRhKTsKK30KKworc3RhdGljIHNzaXplX3QgYWR0NzMxNl9zdG9yZV90ZW1wX29mZnNldChzdHJ1Y3QgYWR0NzMxNl9jaGlwX2luZm8gKmNoaXAsCisJCWludCBvZmZzZXRfYWRkciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgbGVuKQoreworCWxvbmcgZGF0YTsKKwl1OCB2YWw7CisJaW50IHJldDsKKworCXJldCA9IHN0cmljdF9zdHJ0b2woYnVmLCAxMCwgJmRhdGEpOworCWlmIChyZXQgfHwgZGF0YSA+IDEyNyB8fCBkYXRhIDwgLTEyOCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoZGF0YSA8IDApCisJCWRhdGEgKz0gMjU2OworCisJdmFsID0gKHU4KWRhdGE7CisKKwlyZXQgPSBjaGlwLT5idXMud3JpdGUoY2hpcC0+YnVzLmNsaWVudCwgb2Zmc2V0X2FkZHIsIHZhbCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIC1FSU87CisKKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgc3NpemVfdCBhZHQ3MzE2X3Nob3dfaW5fdGVtcF9vZmZzZXQoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZHQ3MzE2X2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKworCXJldHVybiBhZHQ3MzE2X3Nob3dfdGVtcF9vZmZzZXQoY2hpcCwgQURUNzMxNl9JTl9URU1QX09GRlNFVCwgYnVmKTsKK30KKworc3RhdGljIHNzaXplX3QgYWR0NzMxNl9zdG9yZV9pbl90ZW1wX29mZnNldChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBsZW4pCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkdDczMTZfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCisJcmV0dXJuIGFkdDczMTZfc3RvcmVfdGVtcF9vZmZzZXQoY2hpcCwgQURUNzMxNl9JTl9URU1QX09GRlNFVCwgYnVmLCBsZW4pOworfQorCitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKGluX3RlbXBfb2Zmc2V0LCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJYWR0NzMxNl9zaG93X2luX3RlbXBfb2Zmc2V0LAorCQlhZHQ3MzE2X3N0b3JlX2luX3RlbXBfb2Zmc2V0LCAwKTsKKworc3RhdGljIHNzaXplX3QgYWR0NzMxNl9zaG93X2V4X3RlbXBfb2Zmc2V0KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWR0NzMxNl9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisKKwlyZXR1cm4gYWR0NzMxNl9zaG93X3RlbXBfb2Zmc2V0KGNoaXAsIEFEVDczMTZfRVhfVEVNUF9PRkZTRVQsIGJ1Zik7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkdDczMTZfc3RvcmVfZXhfdGVtcF9vZmZzZXQoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgbGVuKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZHQ3MzE2X2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKworCXJldHVybiBhZHQ3MzE2X3N0b3JlX3RlbXBfb2Zmc2V0KGNoaXAsIEFEVDczMTZfRVhfVEVNUF9PRkZTRVQsIGJ1ZiwgbGVuKTsKK30KKworc3RhdGljIElJT19ERVZJQ0VfQVRUUihleF90ZW1wX29mZnNldCwgU19JUlVHTyB8IFNfSVdVU1IsCisJCWFkdDczMTZfc2hvd19leF90ZW1wX29mZnNldCwKKwkJYWR0NzMxNl9zdG9yZV9leF90ZW1wX29mZnNldCwgMCk7CisKK3N0YXRpYyBzc2l6ZV90IGFkdDczMTZfc2hvd19pbl9hbmFsb2dfdGVtcF9vZmZzZXQoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZHQ3MzE2X2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKworCXJldHVybiBhZHQ3MzE2X3Nob3dfdGVtcF9vZmZzZXQoY2hpcCwKKwkJCUFEVDczMTZfSU5fQU5BTE9HX1RFTVBfT0ZGU0VULCBidWYpOworfQorCitzdGF0aWMgc3NpemVfdCBhZHQ3MzE2X3N0b3JlX2luX2FuYWxvZ190ZW1wX29mZnNldChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBsZW4pCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkdDczMTZfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCisJcmV0dXJuIGFkdDczMTZfc3RvcmVfdGVtcF9vZmZzZXQoY2hpcCwKKwkJCUFEVDczMTZfSU5fQU5BTE9HX1RFTVBfT0ZGU0VULCBidWYsIGxlbik7Cit9CisKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIoaW5fYW5hbG9nX3RlbXBfb2Zmc2V0LCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJYWR0NzMxNl9zaG93X2luX2FuYWxvZ190ZW1wX29mZnNldCwKKwkJYWR0NzMxNl9zdG9yZV9pbl9hbmFsb2dfdGVtcF9vZmZzZXQsIDApOworCitzdGF0aWMgc3NpemVfdCBhZHQ3MzE2X3Nob3dfZXhfYW5hbG9nX3RlbXBfb2Zmc2V0KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWR0NzMxNl9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisKKwlyZXR1cm4gYWR0NzMxNl9zaG93X3RlbXBfb2Zmc2V0KGNoaXAsCisJCQlBRFQ3MzE2X0VYX0FOQUxPR19URU1QX09GRlNFVCwgYnVmKTsKK30KKworc3RhdGljIHNzaXplX3QgYWR0NzMxNl9zdG9yZV9leF9hbmFsb2dfdGVtcF9vZmZzZXQoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgbGVuKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZHQ3MzE2X2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKworCXJldHVybiBhZHQ3MzE2X3N0b3JlX3RlbXBfb2Zmc2V0KGNoaXAsCisJCQlBRFQ3MzE2X0VYX0FOQUxPR19URU1QX09GRlNFVCwgYnVmLCBsZW4pOworfQorCitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKGV4X2FuYWxvZ190ZW1wX29mZnNldCwgU19JUlVHTyB8IFNfSVdVU1IsCisJCWFkdDczMTZfc2hvd19leF9hbmFsb2dfdGVtcF9vZmZzZXQsCisJCWFkdDczMTZfc3RvcmVfZXhfYW5hbG9nX3RlbXBfb2Zmc2V0LCAwKTsKKworc3RhdGljIHNzaXplX3QgYWR0NzMxNl9zaG93X0RBQyhzdHJ1Y3QgYWR0NzMxNl9jaGlwX2luZm8gKmNoaXAsCisJCWludCBjaGFubmVsLCBjaGFyICpidWYpCit7CisJdTE2IGRhdGE7CisJdTggbXNiLCBsc2IsIG9mZnNldDsKKwlpbnQgcmV0OworCisJaWYgKGNoYW5uZWwgPj0gQURUNzMxNl9EQV9NU0JfREFUQV9SRUdTIHx8CisJCShjaGFubmVsID09IDAgJiYKKwkJKGNoaXAtPmNvbmZpZzMgJiBBRFQ3MzE2X0VOX0lOX1RFTVBfUFJPUF9EQUNBKSkgfHwKKwkJKGNoYW5uZWwgPT0gMSAmJgorCQkoY2hpcC0+Y29uZmlnMyAmIEFEVDczMTZfRU5fRVhfVEVNUF9QUk9QX0RBQ0IpKSkKKwkJcmV0dXJuIC1FUEVSTTsKKworCW9mZnNldCA9IGNoaXAtPmRhY19iaXRzIC0gODsKKworCWlmIChjaGlwLT5kYWNfYml0cyA+IDgpIHsKKwkJcmV0ID0gY2hpcC0+YnVzLnJlYWQoY2hpcC0+YnVzLmNsaWVudCwKKwkJCUFEVDczMTZfREFfREFUQV9CQVNFICsgY2hhbm5lbCAqIDIsICZsc2IpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIC1FSU87CisJfQorCisJcmV0ID0gY2hpcC0+YnVzLnJlYWQoY2hpcC0+YnVzLmNsaWVudCwKKwkJQURUNzMxNl9EQV9EQVRBX0JBU0UgKyAxICsgY2hhbm5lbCAqIDIsICZtc2IpOworCWlmIChyZXQpCisJCXJldHVybiAtRUlPOworCisJZGF0YSA9IChtc2IgPDwgb2Zmc2V0KSArIChsc2IgJiAoKDEgPDwgb2Zmc2V0KSAtIDEpKTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBkYXRhKTsKK30KKworc3RhdGljIHNzaXplX3QgYWR0NzMxNl9zdG9yZV9EQUMoc3RydWN0IGFkdDczMTZfY2hpcF9pbmZvICpjaGlwLAorCQlpbnQgY2hhbm5lbCwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgbGVuKQoreworCXU4IG1zYiwgbHNiLCBvZmZzZXQ7CisJdW5zaWduZWQgbG9uZyBkYXRhOworCWludCByZXQ7CisKKwlpZiAoY2hhbm5lbCA+PSBBRFQ3MzE2X0RBX01TQl9EQVRBX1JFR1MgfHwKKwkJKGNoYW5uZWwgPT0gMCAmJgorCQkoY2hpcC0+Y29uZmlnMyAmIEFEVDczMTZfRU5fSU5fVEVNUF9QUk9QX0RBQ0EpKSB8fAorCQkoY2hhbm5lbCA9PSAxICYmCisJCShjaGlwLT5jb25maWczICYgQURUNzMxNl9FTl9FWF9URU1QX1BST1BfREFDQikpKQorCQlyZXR1cm4gLUVQRVJNOworCisJb2Zmc2V0ID0gY2hpcC0+ZGFjX2JpdHMgLSA4OworCisJcmV0ID0gc3RyaWN0X3N0cnRvdWwoYnVmLCAxMCwgJmRhdGEpOworCWlmIChyZXQgfHwgZGF0YSA+PSAoMSA8PCBjaGlwLT5kYWNfYml0cykpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGNoaXAtPmRhY19iaXRzID4gOCkgeworCQlsc2IgPSBkYXRhICYgKDEgPDwgb2Zmc2V0KTsKKwkJcmV0ID0gY2hpcC0+YnVzLndyaXRlKGNoaXAtPmJ1cy5jbGllbnQsCisJCQlBRFQ3MzE2X0RBX0RBVEFfQkFTRSArIGNoYW5uZWwgKiAyLCBsc2IpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIC1FSU87CisJfQorCisJbXNiID0gZGF0YSA+PiBvZmZzZXQ7CisJcmV0ID0gY2hpcC0+YnVzLndyaXRlKGNoaXAtPmJ1cy5jbGllbnQsCisJCUFEVDczMTZfREFfREFUQV9CQVNFICsgMSArIGNoYW5uZWwgKiAyLCBtc2IpOworCWlmIChyZXQpCisJCXJldHVybiAtRUlPOworCisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIHNzaXplX3QgYWR0NzMxNl9zaG93X0RBQ19BKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWR0NzMxNl9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisKKwlyZXR1cm4gYWR0NzMxNl9zaG93X0RBQyhjaGlwLCAwLCBidWYpOworfQorCitzdGF0aWMgc3NpemVfdCBhZHQ3MzE2X3N0b3JlX0RBQ19BKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWR0NzMxNl9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisKKwlyZXR1cm4gYWR0NzMxNl9zdG9yZV9EQUMoY2hpcCwgMCwgYnVmLCBsZW4pOworfQorCitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKERBQ19BLCBTX0lSVUdPIHwgU19JV1VTUiwgYWR0NzMxNl9zaG93X0RBQ19BLAorCQlhZHQ3MzE2X3N0b3JlX0RBQ19BLCAwKTsKKworc3RhdGljIHNzaXplX3QgYWR0NzMxNl9zaG93X0RBQ19CKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWR0NzMxNl9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisKKwlyZXR1cm4gYWR0NzMxNl9zaG93X0RBQyhjaGlwLCAxLCBidWYpOworfQorCitzdGF0aWMgc3NpemVfdCBhZHQ3MzE2X3N0b3JlX0RBQ19CKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWR0NzMxNl9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisKKwlyZXR1cm4gYWR0NzMxNl9zdG9yZV9EQUMoY2hpcCwgMSwgYnVmLCBsZW4pOworfQorCitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKERBQ19CLCBTX0lSVUdPIHwgU19JV1VTUiwgYWR0NzMxNl9zaG93X0RBQ19CLAorCQlhZHQ3MzE2X3N0b3JlX0RBQ19CLCAwKTsKKworc3RhdGljIHNzaXplX3QgYWR0NzMxNl9zaG93X0RBQ19DKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWR0NzMxNl9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisKKwlyZXR1cm4gYWR0NzMxNl9zaG93X0RBQyhjaGlwLCAyLCBidWYpOworfQorCitzdGF0aWMgc3NpemVfdCBhZHQ3MzE2X3N0b3JlX0RBQ19DKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWR0NzMxNl9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisKKwlyZXR1cm4gYWR0NzMxNl9zdG9yZV9EQUMoY2hpcCwgMiwgYnVmLCBsZW4pOworfQorCitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKERBQ19DLCBTX0lSVUdPIHwgU19JV1VTUiwgYWR0NzMxNl9zaG93X0RBQ19DLAorCQlhZHQ3MzE2X3N0b3JlX0RBQ19DLCAwKTsKKworc3RhdGljIHNzaXplX3QgYWR0NzMxNl9zaG93X0RBQ19EKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWR0NzMxNl9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisKKwlyZXR1cm4gYWR0NzMxNl9zaG93X0RBQyhjaGlwLCAzLCBidWYpOworfQorCitzdGF0aWMgc3NpemVfdCBhZHQ3MzE2X3N0b3JlX0RBQ19EKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWR0NzMxNl9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisKKwlyZXR1cm4gYWR0NzMxNl9zdG9yZV9EQUMoY2hpcCwgMywgYnVmLCBsZW4pOworfQorCitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKERBQ19ELCBTX0lSVUdPIHwgU19JV1VTUiwgYWR0NzMxNl9zaG93X0RBQ19ELAorCQlhZHQ3MzE2X3N0b3JlX0RBQ19ELCAwKTsKKworc3RhdGljIHNzaXplX3QgYWR0NzMxNl9zaG93X2RldmljZV9pZChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkdDczMTZfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCXU4IGlkOworCWludCByZXQ7CisKKwlyZXQgPSBjaGlwLT5idXMucmVhZChjaGlwLT5idXMuY2xpZW50LCBBRFQ3MzE2X0RFVklDRV9JRCwgJmlkKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gLUVJTzsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBpZCk7Cit9CisKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIoZGV2aWNlX2lkLCBTX0lSVUdPLCBhZHQ3MzE2X3Nob3dfZGV2aWNlX2lkLCBOVUxMLCAwKTsKKworc3RhdGljIHNzaXplX3QgYWR0NzMxNl9zaG93X21hbnVmYWN0b3Jlcl9pZChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkdDczMTZfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCXU4IGlkOworCWludCByZXQ7CisKKwlyZXQgPSBjaGlwLT5idXMucmVhZChjaGlwLT5idXMuY2xpZW50LCBBRFQ3MzE2X01BTlVGQUNUVVJFX0lELCAmaWQpOworCWlmIChyZXQpCisJCXJldHVybiAtRUlPOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIGlkKTsKK30KKworc3RhdGljIElJT19ERVZJQ0VfQVRUUihtYW51ZmFjdG9yZXJfaWQsIFNfSVJVR08sCisJCWFkdDczMTZfc2hvd19tYW51ZmFjdG9yZXJfaWQsIE5VTEwsIDApOworCitzdGF0aWMgc3NpemVfdCBhZHQ3MzE2X3Nob3dfZGV2aWNlX3JldihzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkdDczMTZfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCXU4IHJldjsKKwlpbnQgcmV0OworCisJcmV0ID0gY2hpcC0+YnVzLnJlYWQoY2hpcC0+YnVzLmNsaWVudCwgQURUNzMxNl9ERVZJQ0VfUkVWLCAmcmV2KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gLUVJTzsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCByZXYpOworfQorCitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKGRldmljZV9yZXYsIFNfSVJVR08sIGFkdDczMTZfc2hvd19kZXZpY2VfcmV2LCBOVUxMLCAwKTsKKworc3RhdGljIHNzaXplX3QgYWR0NzMxNl9zaG93X2J1c190eXBlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWR0NzMxNl9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisJdTggc3RhdDsKKwlpbnQgcmV0OworCisJcmV0ID0gY2hpcC0+YnVzLnJlYWQoY2hpcC0+YnVzLmNsaWVudCwgQURUNzMxNl9TUElfTE9DS19TVEFULCAmc3RhdCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIC1FSU87CisKKwlpZiAoc3RhdCkKKwkJcmV0dXJuIHNwcmludGYoYnVmLCAic3BpXG4iKTsKKwllbHNlCisJCXJldHVybiBzcHJpbnRmKGJ1ZiwgImkyY1xuIik7Cit9CisKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIoYnVzX3R5cGUsIFNfSVJVR08sIGFkdDczMTZfc2hvd19idXNfdHlwZSwgTlVMTCwgMCk7CisKK3N0YXRpYyBzc2l6ZV90IGFkdDczMTZfc2hvd19uYW1lKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWR0NzMxNl9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlc1xuIiwgY2hpcC0+bmFtZSk7Cit9CisKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIobmFtZSwgU19JUlVHTywgYWR0NzMxNl9zaG93X25hbWUsIE5VTEwsIDApOworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqYWR0NzMxNl9hdHRyaWJ1dGVzW10gPSB7CisJJmlpb19kZXZfYXR0cl9hbGxfbW9kZXMuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX21vZGUuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX3Jlc2V0LmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9lbmFibGVkLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9hZF9jaGFubmVsLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9hbGxfYWRfY2hhbm5lbHMuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2Rpc2FibGVfYXZlcmFnaW5nLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9lbmFibGVfc21idXNfdGltZW91dC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfcG93ZXJkb3duLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9mYXN0X2FkX2Nsb2NrLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9kYV9oaWdoX3Jlc29sdXRpb24uZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2VuYWJsZV9wcm9wb3J0aW9uX0RBQ0EuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2VuYWJsZV9wcm9wb3J0aW9uX0RBQ0IuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX0RBQ18yVnJlZl9jaGFubmVsc19tYXNrLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9EQUNfdXBkYXRlX21vZGUuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2FsbF9EQUNfdXBkYXRlX21vZGVzLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl91cGRhdGVfREFDLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9EQV9BQl9WcmVmX2J5cGFzcy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfREFfQ0RfVnJlZl9ieXBhc3MuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX0RBQ19pbnRlcm5hbF9WcmVmLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9WREQuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2luX3RlbXAuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2V4X3RlbXAuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2luX3RlbXBfb2Zmc2V0LmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9leF90ZW1wX29mZnNldC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfaW5fYW5hbG9nX3RlbXBfb2Zmc2V0LmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9leF9hbmFsb2dfdGVtcF9vZmZzZXQuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX0RBQ19BLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9EQUNfQi5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfREFDX0MuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX0RBQ19ELmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9kZXZpY2VfaWQuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX21hbnVmYWN0b3Jlcl9pZC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfZGV2aWNlX3Jldi5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfYnVzX3R5cGUuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX25hbWUuZGV2X2F0dHIuYXR0ciwKKwlOVUxMLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgYWR0NzMxNl9hdHRyaWJ1dGVfZ3JvdXAgPSB7CisJLmF0dHJzID0gYWR0NzMxNl9hdHRyaWJ1dGVzLAorfTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmFkdDc1MTZfYXR0cmlidXRlc1tdID0geworCSZpaW9fZGV2X2F0dHJfYWxsX21vZGVzLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9tb2RlLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9zZWxlY3RfZXhfdGVtcC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfcmVzZXQuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2VuYWJsZWQuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2FkX2NoYW5uZWwuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2FsbF9hZF9jaGFubmVscy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfZGlzYWJsZV9hdmVyYWdpbmcuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2VuYWJsZV9zbWJ1c190aW1lb3V0LmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9wb3dlcmRvd24uZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2Zhc3RfYWRfY2xvY2suZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX0FJTl9pbnRlcm5hbF9WcmVmLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9kYV9oaWdoX3Jlc29sdXRpb24uZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2VuYWJsZV9wcm9wb3J0aW9uX0RBQ0EuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2VuYWJsZV9wcm9wb3J0aW9uX0RBQ0IuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX0RBQ18yVnJlZl9jaGFubmVsc19tYXNrLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9EQUNfdXBkYXRlX21vZGUuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2FsbF9EQUNfdXBkYXRlX21vZGVzLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl91cGRhdGVfREFDLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9EQV9BQl9WcmVmX2J5cGFzcy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfREFfQ0RfVnJlZl9ieXBhc3MuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX0RBQ19pbnRlcm5hbF9WcmVmLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9WREQuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2luX3RlbXAuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2V4X3RlbXBfQUlOMS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfQUlOMi5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfQUlOMy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfQUlONC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfaW5fdGVtcF9vZmZzZXQuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2V4X3RlbXBfb2Zmc2V0LmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9pbl9hbmFsb2dfdGVtcF9vZmZzZXQuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2V4X2FuYWxvZ190ZW1wX29mZnNldC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfREFDX0EuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX0RBQ19CLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9EQUNfQy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfREFDX0QuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2RldmljZV9pZC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfbWFudWZhY3RvcmVyX2lkLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9kZXZpY2VfcmV2LmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9idXNfdHlwZS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfbmFtZS5kZXZfYXR0ci5hdHRyLAorCU5VTEwsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBhZHQ3NTE2X2F0dHJpYnV0ZV9ncm91cCA9IHsKKwkuYXR0cnMgPSBhZHQ3NTE2X2F0dHJpYnV0ZXMsCit9OworCisKKy8qCisgKiB0ZW1wZXJhdHVyZSBib3VuZCBldmVudHMKKyAqLworCisjZGVmaW5lIElJT19FVkVOVF9DT0RFX0FEVDczMTZfSU5fVEVNUF9ISUdIICAgSUlPX0JVRkZFUl9FVkVOVF9DT0RFKDApCisjZGVmaW5lIElJT19FVkVOVF9DT0RFX0FEVDczMTZfSU5fVEVNUF9MT1cgICAgSUlPX0JVRkZFUl9FVkVOVF9DT0RFKDEpCisjZGVmaW5lIElJT19FVkVOVF9DT0RFX0FEVDczMTZfRVhfVEVNUF9ISUdIICAgSUlPX0JVRkZFUl9FVkVOVF9DT0RFKDIpCisjZGVmaW5lIElJT19FVkVOVF9DT0RFX0FEVDczMTZfRVhfVEVNUF9MT1cgICAgSUlPX0JVRkZFUl9FVkVOVF9DT0RFKDMpCisjZGVmaW5lIElJT19FVkVOVF9DT0RFX0FEVDczMTZfRVhfVEVNUF9GQVVMVCAgSUlPX0JVRkZFUl9FVkVOVF9DT0RFKDQpCisjZGVmaW5lIElJT19FVkVOVF9DT0RFX0FEVDc1MTZfQUlOMSAgICAgICAgICAgSUlPX0JVRkZFUl9FVkVOVF9DT0RFKDUpCisjZGVmaW5lIElJT19FVkVOVF9DT0RFX0FEVDc1MTZfQUlOMiAgICAgICAgICAgSUlPX0JVRkZFUl9FVkVOVF9DT0RFKDYpCisjZGVmaW5lIElJT19FVkVOVF9DT0RFX0FEVDc1MTZfQUlOMyAgICAgICAgICAgSUlPX0JVRkZFUl9FVkVOVF9DT0RFKDcpCisjZGVmaW5lIElJT19FVkVOVF9DT0RFX0FEVDc1MTZfQUlONCAgICAgICAgICAgSUlPX0JVRkZFUl9FVkVOVF9DT0RFKDgpCisjZGVmaW5lIElJT19FVkVOVF9DT0RFX0FEVDczMTZfVkREICAgICAgICAgICAgSUlPX0JVRkZFUl9FVkVOVF9DT0RFKDkpCisKK3N0YXRpYyB2b2lkIGFkdDczMTZfaW50ZXJydXB0X2JoKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29ya19zKQoreworCXN0cnVjdCBhZHQ3MzE2X2NoaXBfaW5mbyAqY2hpcCA9CisJCWNvbnRhaW5lcl9vZih3b3JrX3MsIHN0cnVjdCBhZHQ3MzE2X2NoaXBfaW5mbywgdGhyZXNoX3dvcmspOworCXU4IHN0YXQxLCBzdGF0MjsKKwlpbnQgaSwgcmV0LCBjb3VudDsKKworCXJldCA9IGNoaXAtPmJ1cy5yZWFkKGNoaXAtPmJ1cy5jbGllbnQsIEFEVDczMTZfSU5UX1NUQVQxLCAmc3RhdDEpOworCWlmICghcmV0KSB7CisJCWlmICgoY2hpcC0+aWQgJiBJRF9GQU1JTFlfTUFTSykgPT0gSURfQURUNzVYWCkKKwkJCWNvdW50ID0gODsKKwkJZWxzZQorCQkJY291bnQgPSA1OworCisJCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisJCQlpZiAoc3RhdDEgJiAoMSA8PCBpKSkKKwkJCQlpaW9fcHVzaF9ldmVudChjaGlwLT5pbmRpb19kZXYsIDAsCisJCQkJCUlJT19FVkVOVF9DT0RFX0FEVDczMTZfSU5fVEVNUF9ISUdIICsgaSwKKwkJCQkJY2hpcC0+bGFzdF90aW1lc3RhbXApOworCQl9CisJfQorCisJcmV0ID0gY2hpcC0+YnVzLnJlYWQoY2hpcC0+YnVzLmNsaWVudCwgQURUNzMxNl9JTlRfU1RBVDIsICZzdGF0Mik7CisJaWYgKCFyZXQpIHsKKwkJaWYgKHN0YXQyICYgQURUNzMxNl9JTlRfTUFTSzJfVkREKQorCQkJaWlvX3B1c2hfZXZlbnQoY2hpcC0+aW5kaW9fZGV2LCAwLAorCQkJCUlJT19FVkVOVF9DT0RFX0FEVDczMTZfVkRELAorCQkJCWNoaXAtPmxhc3RfdGltZXN0YW1wKTsKKwl9CisKKwllbmFibGVfaXJxKGNoaXAtPmJ1cy5pcnEpOworfQorCitzdGF0aWMgaW50IGFkdDczMTZfaW50ZXJydXB0KHN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbywKKwkJaW50IGluZGV4LAorCQlzNjQgdGltZXN0YW1wLAorCQlpbnQgbm9fdGVzdCkKK3sKKwlzdHJ1Y3QgYWR0NzMxNl9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisKKwljaGlwLT5sYXN0X3RpbWVzdGFtcCA9IHRpbWVzdGFtcDsKKwlzY2hlZHVsZV93b3JrKCZjaGlwLT50aHJlc2hfd29yayk7CisKKwlyZXR1cm4gMDsKK30KKworSUlPX0VWRU5UX1NIKGFkdDczMTYsICZhZHQ3MzE2X2ludGVycnVwdCk7CisKKy8qCisgKiBTaG93IG1hc2sgb2YgZW5hYmxlZCBpbnRlcnJ1cHRzIGluIEhleC4KKyAqLworc3RhdGljIHNzaXplX3QgYWR0NzMxNl9zaG93X2ludF9tYXNrKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWR0NzMxNl9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIweCV4XG4iLCBjaGlwLT5pbnRfbWFzayk7Cit9CisKKy8qCisgKiBTZXQgMSB0byB0aGUgbWFzayBpbiBIZXggdG8gZW5hYmxlZCBpbnRlcnJ1cHRzLgorICovCitzdGF0aWMgc3NpemVfdCBhZHQ3MzE2X3NldF9pbnRfbWFzayhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBsZW4pCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkdDczMTZfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZGF0YTsKKwlpbnQgcmV0OworCXU4IG1hc2s7CisKKwlyZXQgPSBzdHJpY3Rfc3RydG91bChidWYsIDE2LCAmZGF0YSk7CisJaWYgKHJldCB8fCBkYXRhID49IEFEVDczMTZfVkREX0lOVF9NQVNLICsgMSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoZGF0YSAmIEFEVDczMTZfVkREX0lOVF9NQVNLKQorCQltYXNrID0gMDsJCQkvKiBlbmFibGUgdmRkIGludCAqLworCWVsc2UKKwkJbWFzayA9IEFEVDczMTZfSU5UX01BU0syX1ZERDsJLyogZGlzYWJsZSB2ZGQgaW50ICovCisKKwlyZXQgPSBjaGlwLT5idXMud3JpdGUoY2hpcC0+YnVzLmNsaWVudCwgQURUNzMxNl9JTlRfTUFTSzIsIG1hc2spOworCWlmICghcmV0KSB7CisJCWNoaXAtPmludF9tYXNrICY9IH5BRFQ3MzE2X1ZERF9JTlRfTUFTSzsKKwkJY2hpcC0+aW50X21hc2sgfD0gZGF0YSAmIEFEVDczMTZfVkREX0lOVF9NQVNLOworCX0KKworCWlmIChkYXRhICYgQURUNzMxNl9URU1QX0FJTl9JTlRfTUFTSykgeworCQlpZiAoKGNoaXAtPmlkICYgSURfRkFNSUxZX01BU0spID09IElEX0FEVDczWFgpCisJCQkvKiBtYXNrIGluIHJlZyBpcyBvcHBvc2l0ZSwgc2V0IDEgdG8gZGlzYWJsZSAqLworCQkJbWFzayA9ICh+ZGF0YSkgJiBBRFQ3MzE2X1RFTVBfSU5UX01BU0s7CisJCWVsc2UKKwkJCS8qIG1hc2sgaW4gcmVnIGlzIG9wcG9zaXRlLCBzZXQgMSB0byBkaXNhYmxlICovCisJCQltYXNrID0gKH5kYXRhKSAmIEFEVDczMTZfVEVNUF9BSU5fSU5UX01BU0s7CisJfQorCXJldCA9IGNoaXAtPmJ1cy53cml0ZShjaGlwLT5idXMuY2xpZW50LCBBRFQ3MzE2X0lOVF9NQVNLMSwgbWFzayk7CisKKwljaGlwLT5pbnRfbWFzayA9IG1hc2s7CisKKwlyZXR1cm4gbGVuOworfQorc3RhdGljIGlubGluZSBzc2l6ZV90IGFkdDczMTZfc2hvd19hZF9ib3VuZChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQl1OCBib3VuZF9yZWcsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWR0NzMxNl9jaGlwX2luZm8gKmNoaXAgPSBkZXZfaW5mby0+ZGV2X2RhdGE7CisJdTggdmFsOworCWludCBkYXRhOworCWludCByZXQ7CisKKwlpZiAoKGNoaXAtPmlkICYgSURfRkFNSUxZX01BU0spID09IElEX0FEVDczWFggJiYKKwkJYm91bmRfcmVnID4gQURUNzMxNl9FWF9URU1QX0xPVykKKwkJcmV0dXJuIC1FUEVSTTsKKworCXJldCA9IGNoaXAtPmJ1cy5yZWFkKGNoaXAtPmJ1cy5jbGllbnQsIGJvdW5kX3JlZywgJnZhbCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIC1FSU87CisKKwlkYXRhID0gKGludCl2YWw7CisKKwlpZiAoISgoY2hpcC0+aWQgJiBJRF9GQU1JTFlfTUFTSykgPT0gSURfQURUNzVYWCAmJgorCQkoY2hpcC0+Y29uZmlnMSAmIEFEVDc1MTZfU0VMX0FJTjFfMl9FWF9URU1QX01BU0spID09IDApKSB7CisJCWlmIChkYXRhICYgMHg4MCkKKwkJCWRhdGEgLT0gMjU2OworCX0KKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBkYXRhKTsKK30KKworc3RhdGljIGlubGluZSBzc2l6ZV90IGFkdDczMTZfc2V0X2FkX2JvdW5kKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCXU4IGJvdW5kX3JlZywKKwkJY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgbGVuKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZHQ3MzE2X2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKwlsb25nIGRhdGE7CisJdTggdmFsOworCWludCByZXQ7CisKKwlpZiAoKGNoaXAtPmlkICYgSURfRkFNSUxZX01BU0spID09IElEX0FEVDczWFggJiYKKwkJYm91bmRfcmVnID4gQURUNzMxNl9FWF9URU1QX0xPVykKKwkJcmV0dXJuIC1FUEVSTTsKKworCXJldCA9IHN0cmljdF9zdHJ0b2woYnVmLCAxMCwgJmRhdGEpOworCWlmIChyZXQpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKChjaGlwLT5pZCAmIElEX0ZBTUlMWV9NQVNLKSA9PSBJRF9BRFQ3NVhYICYmCisJCShjaGlwLT5jb25maWcxICYgQURUNzUxNl9TRUxfQUlOMV8yX0VYX1RFTVBfTUFTSykgPT0gMCkgeworCQlpZiAoZGF0YSA+IDI1NSB8fCBkYXRhIDwgMCkKKwkJCXJldHVybiAtRUlOVkFMOworCX0gZWxzZSB7CisJCWlmIChkYXRhID4gMTI3IHx8IGRhdGEgPCAtMTI4KQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJaWYgKGRhdGEgPCAwKQorCQkJZGF0YSArPSAyNTY7CisJfQorCisJdmFsID0gKHU4KWRhdGE7CisKKwlyZXQgPSBjaGlwLT5idXMud3JpdGUoY2hpcC0+YnVzLmNsaWVudCwgYm91bmRfcmVnLCB2YWwpOworCWlmIChyZXQpCisJCXJldHVybiAtRUlPOworCisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIHNzaXplX3QgYWR0NzMxNl9zaG93X2luX3RlbXBfaGlnaChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJcmV0dXJuIGFkdDczMTZfc2hvd19hZF9ib3VuZChkZXYsIGF0dHIsCisJCQlBRFQ3MzE2X0lOX1RFTVBfSElHSCwgYnVmKTsKK30KKworc3RhdGljIGlubGluZSBzc2l6ZV90IGFkdDczMTZfc2V0X2luX3RlbXBfaGlnaChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBsZW4pCit7CisJcmV0dXJuIGFkdDczMTZfc2V0X2FkX2JvdW5kKGRldiwgYXR0ciwKKwkJCUFEVDczMTZfSU5fVEVNUF9ISUdILCBidWYsIGxlbik7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkdDczMTZfc2hvd19pbl90ZW1wX2xvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJcmV0dXJuIGFkdDczMTZfc2hvd19hZF9ib3VuZChkZXYsIGF0dHIsCisJCQlBRFQ3MzE2X0lOX1RFTVBfTE9XLCBidWYpOworfQorCitzdGF0aWMgaW5saW5lIHNzaXplX3QgYWR0NzMxNl9zZXRfaW5fdGVtcF9sb3coc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgbGVuKQoreworCXJldHVybiBhZHQ3MzE2X3NldF9hZF9ib3VuZChkZXYsIGF0dHIsCisJCQlBRFQ3MzE2X0lOX1RFTVBfTE9XLCBidWYsIGxlbik7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkdDczMTZfc2hvd19leF90ZW1wX2FpbjFfaGlnaChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJcmV0dXJuIGFkdDczMTZfc2hvd19hZF9ib3VuZChkZXYsIGF0dHIsCisJCQlBRFQ3MzE2X0VYX1RFTVBfSElHSCwgYnVmKTsKK30KKworc3RhdGljIGlubGluZSBzc2l6ZV90IGFkdDczMTZfc2V0X2V4X3RlbXBfYWluMV9oaWdoKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlyZXR1cm4gYWR0NzMxNl9zZXRfYWRfYm91bmQoZGV2LCBhdHRyLAorCQkJQURUNzMxNl9FWF9URU1QX0hJR0gsIGJ1ZiwgbGVuKTsKK30KKworc3RhdGljIHNzaXplX3QgYWR0NzMxNl9zaG93X2V4X3RlbXBfYWluMV9sb3coc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXJldHVybiBhZHQ3MzE2X3Nob3dfYWRfYm91bmQoZGV2LCBhdHRyLAorCQkJQURUNzMxNl9FWF9URU1QX0xPVywgYnVmKTsKK30KKworc3RhdGljIGlubGluZSBzc2l6ZV90IGFkdDczMTZfc2V0X2V4X3RlbXBfYWluMV9sb3coc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgbGVuKQoreworCXJldHVybiBhZHQ3MzE2X3NldF9hZF9ib3VuZChkZXYsIGF0dHIsCisJCQlBRFQ3MzE2X0VYX1RFTVBfTE9XLCBidWYsIGxlbik7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkdDczMTZfc2hvd19haW4yX2hpZ2goc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXJldHVybiBhZHQ3MzE2X3Nob3dfYWRfYm91bmQoZGV2LCBhdHRyLAorCQkJQURUNzUxNl9BSU4yX0hJR0gsIGJ1Zik7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3NpemVfdCBhZHQ3MzE2X3NldF9haW4yX2hpZ2goc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgbGVuKQoreworCXJldHVybiBhZHQ3MzE2X3NldF9hZF9ib3VuZChkZXYsIGF0dHIsCisJCQlBRFQ3NTE2X0FJTjJfSElHSCwgYnVmLCBsZW4pOworfQorCitzdGF0aWMgc3NpemVfdCBhZHQ3MzE2X3Nob3dfYWluMl9sb3coc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXJldHVybiBhZHQ3MzE2X3Nob3dfYWRfYm91bmQoZGV2LCBhdHRyLAorCQkJQURUNzUxNl9BSU4yX0xPVywgYnVmKTsKK30KKworc3RhdGljIGlubGluZSBzc2l6ZV90IGFkdDczMTZfc2V0X2FpbjJfbG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlyZXR1cm4gYWR0NzMxNl9zZXRfYWRfYm91bmQoZGV2LCBhdHRyLAorCQkJQURUNzUxNl9BSU4yX0xPVywgYnVmLCBsZW4pOworfQorCitzdGF0aWMgc3NpemVfdCBhZHQ3MzE2X3Nob3dfYWluM19oaWdoKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gYWR0NzMxNl9zaG93X2FkX2JvdW5kKGRldiwgYXR0ciwKKwkJCUFEVDc1MTZfQUlOM19ISUdILCBidWYpOworfQorCitzdGF0aWMgaW5saW5lIHNzaXplX3QgYWR0NzMxNl9zZXRfYWluM19oaWdoKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlyZXR1cm4gYWR0NzMxNl9zZXRfYWRfYm91bmQoZGV2LCBhdHRyLAorCQkJQURUNzUxNl9BSU4zX0hJR0gsIGJ1ZiwgbGVuKTsKK30KKworc3RhdGljIHNzaXplX3QgYWR0NzMxNl9zaG93X2FpbjNfbG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gYWR0NzMxNl9zaG93X2FkX2JvdW5kKGRldiwgYXR0ciwKKwkJCUFEVDc1MTZfQUlOM19MT1csIGJ1Zik7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3NpemVfdCBhZHQ3MzE2X3NldF9haW4zX2xvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBsZW4pCit7CisJcmV0dXJuIGFkdDczMTZfc2V0X2FkX2JvdW5kKGRldiwgYXR0ciwKKwkJCUFEVDc1MTZfQUlOM19MT1csIGJ1ZiwgbGVuKTsKK30KKworc3RhdGljIHNzaXplX3QgYWR0NzMxNl9zaG93X2FpbjRfaGlnaChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJcmV0dXJuIGFkdDczMTZfc2hvd19hZF9ib3VuZChkZXYsIGF0dHIsCisJCQlBRFQ3NTE2X0FJTjRfSElHSCwgYnVmKTsKK30KKworc3RhdGljIGlubGluZSBzc2l6ZV90IGFkdDczMTZfc2V0X2FpbjRfaGlnaChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBsZW4pCit7CisJcmV0dXJuIGFkdDczMTZfc2V0X2FkX2JvdW5kKGRldiwgYXR0ciwKKwkJCUFEVDc1MTZfQUlONF9ISUdILCBidWYsIGxlbik7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkdDczMTZfc2hvd19haW40X2xvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJcmV0dXJuIGFkdDczMTZfc2hvd19hZF9ib3VuZChkZXYsIGF0dHIsCisJCQlBRFQ3NTE2X0FJTjRfTE9XLCBidWYpOworfQorCitzdGF0aWMgaW5saW5lIHNzaXplX3QgYWR0NzMxNl9zZXRfYWluNF9sb3coc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgbGVuKQoreworCXJldHVybiBhZHQ3MzE2X3NldF9hZF9ib3VuZChkZXYsIGF0dHIsCisJCQlBRFQ3NTE2X0FJTjRfTE9XLCBidWYsIGxlbik7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkdDczMTZfc2hvd19pbnRfZW5hYmxlZChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkdDczMTZfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsICEhKGNoaXAtPmNvbmZpZzEgJiBBRFQ3MzE2X0lOVF9FTikpOworfQorCitzdGF0aWMgc3NpemVfdCBhZHQ3MzE2X3NldF9pbnRfZW5hYmxlZChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBsZW4pCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkdDczMTZfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCXU4IGNvbmZpZzE7CisJaW50IHJldDsKKworCWNvbmZpZzEgPSBjaGlwLT5jb25maWcxICYgKH5BRFQ3MzE2X0lOVF9FTik7CisJaWYgKCFtZW1jbXAoYnVmLCAiMSIsIDEpKQorCQljb25maWcxIHw9IEFEVDczMTZfSU5UX0VOOworCisJcmV0ID0gY2hpcC0+YnVzLndyaXRlKGNoaXAtPmJ1cy5jbGllbnQsIEFEVDczMTZfQ09ORklHMSwgY29uZmlnMSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIC1FSU87CisKKwljaGlwLT5jb25maWcxID0gY29uZmlnMTsKKworCXJldHVybiBsZW47Cit9CisKKworSUlPX0VWRU5UX0FUVFJfU0goaW50X21hc2ssIGlpb19ldmVudF9hZHQ3MzE2LAorCQlhZHQ3MzE2X3Nob3dfaW50X21hc2ssIGFkdDczMTZfc2V0X2ludF9tYXNrLCAwKTsKK0lJT19FVkVOVF9BVFRSX1NIKGluX3RlbXBfaGlnaCwgaWlvX2V2ZW50X2FkdDczMTYsCisJCWFkdDczMTZfc2hvd19pbl90ZW1wX2hpZ2gsIGFkdDczMTZfc2V0X2luX3RlbXBfaGlnaCwgMCk7CitJSU9fRVZFTlRfQVRUUl9TSChpbl90ZW1wX2xvdywgaWlvX2V2ZW50X2FkdDczMTYsCisJCWFkdDczMTZfc2hvd19pbl90ZW1wX2xvdywgYWR0NzMxNl9zZXRfaW5fdGVtcF9sb3csIDApOworSUlPX0VWRU5UX0FUVFJfU0goZXhfdGVtcF9oaWdoLCBpaW9fZXZlbnRfYWR0NzMxNiwKKwkJYWR0NzMxNl9zaG93X2V4X3RlbXBfYWluMV9oaWdoLAorCQlhZHQ3MzE2X3NldF9leF90ZW1wX2FpbjFfaGlnaCwgMCk7CitJSU9fRVZFTlRfQVRUUl9TSChleF90ZW1wX2xvdywgaWlvX2V2ZW50X2FkdDczMTYsCisJCWFkdDczMTZfc2hvd19leF90ZW1wX2FpbjFfbG93LAorCQlhZHQ3MzE2X3NldF9leF90ZW1wX2FpbjFfbG93LCAwKTsKK0lJT19FVkVOVF9BVFRSX1NIKGV4X3RlbXBfYWluMV9oaWdoLCBpaW9fZXZlbnRfYWR0NzMxNiwKKwkJYWR0NzMxNl9zaG93X2V4X3RlbXBfYWluMV9oaWdoLAorCQlhZHQ3MzE2X3NldF9leF90ZW1wX2FpbjFfaGlnaCwgMCk7CitJSU9fRVZFTlRfQVRUUl9TSChleF90ZW1wX2FpbjFfbG93LCBpaW9fZXZlbnRfYWR0NzMxNiwKKwkJYWR0NzMxNl9zaG93X2V4X3RlbXBfYWluMV9sb3csCisJCWFkdDczMTZfc2V0X2V4X3RlbXBfYWluMV9sb3csIDApOworSUlPX0VWRU5UX0FUVFJfU0goYWluMl9oaWdoLCBpaW9fZXZlbnRfYWR0NzMxNiwKKwkJYWR0NzMxNl9zaG93X2FpbjJfaGlnaCwgYWR0NzMxNl9zZXRfYWluMl9oaWdoLCAwKTsKK0lJT19FVkVOVF9BVFRSX1NIKGFpbjJfbG93LCBpaW9fZXZlbnRfYWR0NzMxNiwKKwkJYWR0NzMxNl9zaG93X2FpbjJfbG93LCBhZHQ3MzE2X3NldF9haW4yX2xvdywgMCk7CitJSU9fRVZFTlRfQVRUUl9TSChhaW4zX2hpZ2gsIGlpb19ldmVudF9hZHQ3MzE2LAorCQlhZHQ3MzE2X3Nob3dfYWluM19oaWdoLCBhZHQ3MzE2X3NldF9haW4zX2hpZ2gsIDApOworSUlPX0VWRU5UX0FUVFJfU0goYWluM19sb3csIGlpb19ldmVudF9hZHQ3MzE2LAorCQlhZHQ3MzE2X3Nob3dfYWluM19sb3csIGFkdDczMTZfc2V0X2FpbjNfbG93LCAwKTsKK0lJT19FVkVOVF9BVFRSX1NIKGFpbjRfaGlnaCwgaWlvX2V2ZW50X2FkdDczMTYsCisJCWFkdDczMTZfc2hvd19haW40X2hpZ2gsIGFkdDczMTZfc2V0X2FpbjRfaGlnaCwgMCk7CitJSU9fRVZFTlRfQVRUUl9TSChhaW40X2xvdywgaWlvX2V2ZW50X2FkdDczMTYsCisJCWFkdDczMTZfc2hvd19haW40X2xvdywgYWR0NzMxNl9zZXRfYWluNF9sb3csIDApOworSUlPX0VWRU5UX0FUVFJfU0goaW50X2VuYWJsZWQsIGlpb19ldmVudF9hZHQ3MzE2LAorCQlhZHQ3MzE2X3Nob3dfaW50X2VuYWJsZWQsIGFkdDczMTZfc2V0X2ludF9lbmFibGVkLCAwKTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmFkdDczMTZfZXZlbnRfYXR0cmlidXRlc1tdID0geworCSZpaW9fZXZlbnRfYXR0cl9pbnRfbWFzay5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZXZlbnRfYXR0cl9pbl90ZW1wX2hpZ2guZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2V2ZW50X2F0dHJfaW5fdGVtcF9sb3cuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2V2ZW50X2F0dHJfZXhfdGVtcF9oaWdoLmRldl9hdHRyLmF0dHIsCisJJmlpb19ldmVudF9hdHRyX2V4X3RlbXBfbG93LmRldl9hdHRyLmF0dHIsCisJJmlpb19ldmVudF9hdHRyX2ludF9lbmFibGVkLmRldl9hdHRyLmF0dHIsCisJTlVMTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGFkdDczMTZfZXZlbnRfYXR0cmlidXRlX2dyb3VwID0geworCS5hdHRycyA9IGFkdDczMTZfZXZlbnRfYXR0cmlidXRlcywKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICphZHQ3NTE2X2V2ZW50X2F0dHJpYnV0ZXNbXSA9IHsKKwkmaWlvX2V2ZW50X2F0dHJfaW50X21hc2suZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2V2ZW50X2F0dHJfaW5fdGVtcF9oaWdoLmRldl9hdHRyLmF0dHIsCisJJmlpb19ldmVudF9hdHRyX2luX3RlbXBfbG93LmRldl9hdHRyLmF0dHIsCisJJmlpb19ldmVudF9hdHRyX2V4X3RlbXBfYWluMV9oaWdoLmRldl9hdHRyLmF0dHIsCisJJmlpb19ldmVudF9hdHRyX2V4X3RlbXBfYWluMV9sb3cuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2V2ZW50X2F0dHJfYWluMl9oaWdoLmRldl9hdHRyLmF0dHIsCisJJmlpb19ldmVudF9hdHRyX2FpbjJfbG93LmRldl9hdHRyLmF0dHIsCisJJmlpb19ldmVudF9hdHRyX2FpbjNfaGlnaC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZXZlbnRfYXR0cl9haW4zX2xvdy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZXZlbnRfYXR0cl9haW40X2hpZ2guZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2V2ZW50X2F0dHJfYWluNF9sb3cuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2V2ZW50X2F0dHJfaW50X2VuYWJsZWQuZGV2X2F0dHIuYXR0ciwKKwlOVUxMLAorfTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgYWR0NzUxNl9ldmVudF9hdHRyaWJ1dGVfZ3JvdXAgPSB7CisJLmF0dHJzID0gYWR0NzUxNl9ldmVudF9hdHRyaWJ1dGVzLAorfTsKKworI2lmZGVmIENPTkZJR19QTQoraW50IGFkdDczMTZfZGlzYWJsZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkdDczMTZfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCisJcmV0dXJuIF9hZHQ3MzE2X3N0b3JlX2VuYWJsZWQoY2hpcCwgMCk7Cit9CitFWFBPUlRfU1lNQk9MKGFkdDczMTZfZGlzYWJsZSk7CisKK2ludCBhZHQ3MzE2X2VuYWJsZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkdDczMTZfY2hpcF9pbmZvICpjaGlwID0gZGV2X2luZm8tPmRldl9kYXRhOworCisJcmV0dXJuIF9hZHQ3MzE2X3N0b3JlX2VuYWJsZWQoY2hpcCwgMSk7Cit9CitFWFBPUlRfU1lNQk9MKGFkdDczMTZfZW5hYmxlKTsKKyNlbmRpZgorCisvKgorICogZGV2aWNlIHByb2JlIGFuZCByZW1vdmUKKyAqLworaW50IF9fZGV2aW5pdCBhZHQ3MzE2X3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGFkdDczMTZfYnVzICpidXMsCisJCWNvbnN0IGNoYXIgKm5hbWUpCit7CisJc3RydWN0IGFkdDczMTZfY2hpcF9pbmZvICpjaGlwOworCXVuc2lnbmVkIHNob3J0ICphZHQ3MzE2X3BsYXRmb3JtX2RhdGEgPSBkZXYtPnBsYXRmb3JtX2RhdGE7CisJaW50IHJldCA9IDA7CisKKwljaGlwID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGFkdDczMTZfY2hpcF9pbmZvKSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoY2hpcCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qIHRoaXMgaXMgb25seSB1c2VkIGZvciBkZXZpY2UgcmVtb3ZhbCBwdXJwb3NlcyAqLworCWRldl9zZXRfZHJ2ZGF0YShkZXYsIGNoaXApOworCisJY2hpcC0+YnVzID0gKmJ1czsKKwljaGlwLT5uYW1lID0gbmFtZTsKKworCWlmIChuYW1lWzRdID09ICczJykKKwkJY2hpcC0+aWQgPSBJRF9BRFQ3MzE2ICsgKG5hbWVbNl0gLSAnNicpOworCWVsc2UgaWYgKG5hbWVbNF0gPT0gJzUnKQorCQljaGlwLT5pZCA9IElEX0FEVDc1MTYgKyAobmFtZVs2XSAtICc2Jyk7CisJZWxzZQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWNoaXAtPmxkYWNfcGluID0gYWR0NzMxNl9wbGF0Zm9ybV9kYXRhWzFdOworCWlmIChjaGlwLT5sZGFjX3BpbikgeworCQljaGlwLT5jb25maWczIHw9IEFEVDczMTZfREFfRU5fVklBX0RBQ19MRENBOworCQlpZiAoKGNoaXAtPmlkICYgSURfRkFNSUxZX01BU0spID09IElEX0FEVDc1WFgpCisJCQljaGlwLT5jb25maWcxIHw9IEFEVDc1MTZfU0VMX0FJTjM7CisJfQorCWNoaXAtPmludF9tYXNrID0gQURUNzMxNl9URU1QX0lOVF9NQVNLIHwgQURUNzMxNl9WRERfSU5UX01BU0s7CisJaWYgKChjaGlwLT5pZCAmIElEX0ZBTUlMWV9NQVNLKSA9PSBJRF9BRFQ3NVhYKQorCQljaGlwLT5pbnRfbWFzayB8PSBBRFQ3NTE2X0FJTl9JTlRfTUFTSzsKKworCWNoaXAtPmluZGlvX2RldiA9IGlpb19hbGxvY2F0ZV9kZXZpY2UoKTsKKwlpZiAoY2hpcC0+aW5kaW9fZGV2ID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJvcl9mcmVlX2NoaXA7CisJfQorCisJY2hpcC0+aW5kaW9fZGV2LT5kZXYucGFyZW50ID0gZGV2OworCWlmICgoY2hpcC0+aWQgJiBJRF9GQU1JTFlfTUFTSykgPT0gSURfQURUNzVYWCkgeworCQljaGlwLT5pbmRpb19kZXYtPmF0dHJzID0gJmFkdDc1MTZfYXR0cmlidXRlX2dyb3VwOworCQljaGlwLT5pbmRpb19kZXYtPmV2ZW50X2F0dHJzID0gJmFkdDc1MTZfZXZlbnRfYXR0cmlidXRlX2dyb3VwOworCX0gZWxzZSB7CisJCWNoaXAtPmluZGlvX2Rldi0+YXR0cnMgPSAmYWR0NzMxNl9hdHRyaWJ1dGVfZ3JvdXA7CisJCWNoaXAtPmluZGlvX2Rldi0+ZXZlbnRfYXR0cnMgPSAmYWR0NzMxNl9ldmVudF9hdHRyaWJ1dGVfZ3JvdXA7CisJfQorCWNoaXAtPmluZGlvX2Rldi0+ZGV2X2RhdGEgPSAodm9pZCAqKWNoaXA7CisJY2hpcC0+aW5kaW9fZGV2LT5kcml2ZXJfbW9kdWxlID0gVEhJU19NT0RVTEU7CisJY2hpcC0+aW5kaW9fZGV2LT5udW1faW50ZXJydXB0X2xpbmVzID0gMTsKKwljaGlwLT5pbmRpb19kZXYtPm1vZGVzID0gSU5ESU9fRElSRUNUX01PREU7CisKKwlyZXQgPSBpaW9fZGV2aWNlX3JlZ2lzdGVyKGNoaXAtPmluZGlvX2Rldik7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9mcmVlX2RldjsKKworCWlmIChjaGlwLT5idXMuaXJxID4gMCkgeworCQlpZiAoYWR0NzMxNl9wbGF0Zm9ybV9kYXRhWzBdKQorCQkJY2hpcC0+YnVzLmlycV9mbGFncyA9IGFkdDczMTZfcGxhdGZvcm1fZGF0YVswXTsKKworCQlyZXQgPSBpaW9fcmVnaXN0ZXJfaW50ZXJydXB0X2xpbmUoY2hpcC0+YnVzLmlycSwKKwkJCQljaGlwLT5pbmRpb19kZXYsCisJCQkJMCwKKwkJCQljaGlwLT5idXMuaXJxX2ZsYWdzLAorCQkJCWNoaXAtPm5hbWUpOworCQlpZiAocmV0KQorCQkJZ290byBlcnJvcl91bnJlZ19kZXY7CisKKwkJLyoKKwkJICogVGhlIGV2ZW50IGhhbmRsZXIgbGlzdCBlbGVtZW50IHJlZmVyIHRvIGlpb19ldmVudF9hZHQ3MzE2LgorCQkgKiBBbGwgZXZlbnQgYXR0cmlidXRlcyBiaW5kIHRvIHRoZSBzYW1lIGV2ZW50IGhhbmRsZXIuCisJCSAqIFNvLCBvbmx5IHJlZ2lzdGVyIGV2ZW50IGhhbmRsZXIgb25jZS4KKwkJICovCisJCWlpb19hZGRfZXZlbnRfdG9fbGlzdCgmaWlvX2V2ZW50X2FkdDczMTYsCisJCQkJJmNoaXAtPmluZGlvX2Rldi0+aW50ZXJydXB0c1swXS0+ZXZfbGlzdCk7CisKKwkJSU5JVF9XT1JLKCZjaGlwLT50aHJlc2hfd29yaywgYWR0NzMxNl9pbnRlcnJ1cHRfYmgpOworCisJCWlmIChjaGlwLT5idXMuaXJxX2ZsYWdzICYgSVJRRl9UUklHR0VSX0hJR0gpCisJCQljaGlwLT5jb25maWcxIHw9IEFEVDczMTZfSU5UX1BPTEFSSVRZOworCX0KKworCXJldCA9IGNoaXAtPmJ1cy53cml0ZShjaGlwLT5idXMuY2xpZW50LCBBRFQ3MzE2X0NPTkZJRzEsIGNoaXAtPmNvbmZpZzEpOworCWlmIChyZXQpIHsKKwkJcmV0ID0gLUVJTzsKKwkJZ290byBlcnJvcl91bnJlZ19pcnE7CisJfQorCisJcmV0ID0gY2hpcC0+YnVzLndyaXRlKGNoaXAtPmJ1cy5jbGllbnQsIEFEVDczMTZfQ09ORklHMywgY2hpcC0+Y29uZmlnMyk7CisJaWYgKHJldCkgeworCQlyZXQgPSAtRUlPOworCQlnb3RvIGVycm9yX3VucmVnX2lycTsKKwl9CisKKwlkZXZfaW5mbyhkZXYsICIlcyB0ZW1wZXJhdHVyZSBzZW5zb3IsIEFEQyBhbmQgREFDIHJlZ2lzdGVyZWQuXG4iLAorCQkJY2hpcC0+bmFtZSk7CisKKwlyZXR1cm4gMDsKKworZXJyb3JfdW5yZWdfaXJxOgorCWlpb191bnJlZ2lzdGVyX2ludGVycnVwdF9saW5lKGNoaXAtPmluZGlvX2RldiwgMCk7CitlcnJvcl91bnJlZ19kZXY6CisJaWlvX2RldmljZV91bnJlZ2lzdGVyKGNoaXAtPmluZGlvX2Rldik7CitlcnJvcl9mcmVlX2RldjoKKwlpaW9fZnJlZV9kZXZpY2UoY2hpcC0+aW5kaW9fZGV2KTsKK2Vycm9yX2ZyZWVfY2hpcDoKKwlrZnJlZShjaGlwKTsKKworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MKGFkdDczMTZfcHJvYmUpOworCitpbnQgX19kZXZleGl0IGFkdDczMTZfcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZHQ3MzE2X2NoaXBfaW5mbyAqY2hpcCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gY2hpcC0+aW5kaW9fZGV2OworCisJZGV2X3NldF9kcnZkYXRhKGRldiwgTlVMTCk7CisJaWYgKGNoaXAtPmJ1cy5pcnEpCisJCWlpb191bnJlZ2lzdGVyX2ludGVycnVwdF9saW5lKGluZGlvX2RldiwgMCk7CisJaWlvX2RldmljZV91bnJlZ2lzdGVyKGluZGlvX2Rldik7CisJaWlvX2ZyZWVfZGV2aWNlKGNoaXAtPmluZGlvX2Rldik7CisJa2ZyZWUoY2hpcCk7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woYWR0NzMxNl9yZW1vdmUpOworCitNT0RVTEVfQVVUSE9SKCJTb25pYyBaaGFuZyA8c29uaWMuemhhbmdAYW5hbG9nLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiQW5hbG9nIERldmljZXMgQURUNzMxNi83LzggYW5kIEFEVDc1MTYvNy85IGRpZ2l0YWwiCisJCQkiIHRlbXBlcmF0dXJlIHNlbnNvciwgQURDIGFuZCBEQUMgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkZGFjL2FkdDczMTYuaCBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRkYWMvYWR0NzMxNi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzNGJkNjcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkZGFjL2FkdDczMTYuaApAQCAtMCwwICsxLDMzIEBACisvKgorICogQURUNzMxNiBkaWdpdGFsIHRlbXBlcmF0dXJlIHNlbnNvciBkcml2ZXIgc3VwcG9ydGluZyBBRFQ3MzE2LzcvOCBBRFQ3NTE2LzcvOQorICoKKyAqIENvcHlyaWdodCAyMDEwIEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCisgKi8KKworI2lmbmRlZiBfQURUNzMxNl9IXworI2RlZmluZSBfQURUNzMxNl9IXworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworI2RlZmluZSBBRFQ3MzE2X1JFR19NQVhfQUREUgkJMHgzRgorCitzdHJ1Y3QgYWR0NzMxNl9idXMgeworCXZvaWQgKmNsaWVudDsKKwlpbnQgaXJxOworCWludCBpcnFfZmxhZ3M7CisJaW50ICgqcmVhZCkgKHZvaWQgKmNsaWVudCwgdTggcmVnLCB1OCAqZGF0YSk7CisJaW50ICgqd3JpdGUpICh2b2lkICpjbGllbnQsIHU4IHJlZywgdTggdmFsKTsKKwlpbnQgKCptdWx0aV9yZWFkKSAodm9pZCAqY2xpZW50LCB1OCBmaXJzdF9yZWcsIHU4IGNvdW50LCB1OCAqZGF0YSk7CisJaW50ICgqbXVsdGlfd3JpdGUpICh2b2lkICpjbGllbnQsIHU4IGZpcnN0X3JlZywgdTggY291bnQsIHU4ICpkYXRhKTsKK307CisKKyNpZmRlZiBDT05GSUdfUE0KK2ludCBhZHQ3MzE2X2Rpc2FibGUoc3RydWN0IGRldmljZSAqZGV2KTsKK2ludCBhZHQ3MzE2X2VuYWJsZShzdHJ1Y3QgZGV2aWNlICpkZXYpOworI2VuZGlmCitpbnQgYWR0NzMxNl9wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBhZHQ3MzE2X2J1cyAqYnVzLCBjb25zdCBjaGFyICpuYW1lKTsKK2ludCBhZHQ3MzE2X3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpkZXYpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vZGFjL0tjb25maWcgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2RhYy9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxOTFiZDIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2RhYy9LY29uZmlnCkBAIC0wLDAgKzEsMjEgQEAKKyMKKyMgREFDIGRyaXZlcnMKKyMKK2NvbW1lbnQgIkRpZ2l0YWwgdG8gYW5hbG9nIGNvbnZlcnRvcnMiCisKK2NvbmZpZyBBRDU2MjRSX1NQSQorCXRyaXN0YXRlICJBbmFsb2cgRGV2aWNlcyBBRDU2MjQvNDQvNjRSIERBQyBzcGkgZHJpdmVyIgorCWRlcGVuZHMgb24gU1BJCisJaGVscAorCSAgU2F5IHllcyBoZXJlIHRvIGJ1aWxkIHN1cHBvcnQgZm9yIEFuYWxvZyBEZXZpY2VzIEFENTYyNFIsIEFENTY0NFIgYW5kCisJICBBRDU2NjRSIGNvbnZlcnRvcnMgKERBQykuIFRoaXMgZHJpdmVyIHVzZXMgdGhlIGNvbW1vbiBTUEkgaW50ZXJmYWNlLgorCitjb25maWcgQUQ1NDQ2CisJdHJpc3RhdGUgIkFuYWxvZyBEZXZpY2VzIEFENTQ0NC82LCBBRDU2MjAvNDAvNjAgYW5kIEFENTU0MUEvMTJBIERBQyBTUEkgZHJpdmVyIgorCWRlcGVuZHMgb24gU1BJCisJaGVscAorCSAgU2F5IHllcyBoZXJlIHRvIGJ1aWxkIHN1cHBvcnQgZm9yIEFuYWxvZyBEZXZpY2VzIEFENTQ0NCwgQUQ1NDQ2LAorCSAgQUQ1NjIwLCBBRDU2NDAsIEFENTY2MCBhbmQgQUQ1NTQxQSwgQUQ1NTEyQSBEQUNzLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBhZDU0NDYuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2RhYy9NYWtlZmlsZSBiL2RyaXZlcnMvc3RhZ2luZy9paW8vZGFjL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjZjMzMWIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2RhYy9NYWtlZmlsZQpAQCAtMCwwICsxLDYgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIGluZHVzdHJpYWwgSS9PIERBQyBkcml2ZXJzCisjCisKK29iai0kKENPTkZJR19BRDU2MjRSX1NQSSkgKz0gYWQ1NjI0cl9zcGkubworb2JqLSQoQ09ORklHX0FENTQ0NikgKz0gYWQ1NDQ2Lm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vZGFjL2FkNTQ0Ni5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9kYWMvYWQ1NDQ2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTMzODdjZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vZGFjL2FkNTQ0Ni5jCkBAIC0wLDAgKzEsMzIzIEBACisvKgorICogQUQ1NDQ2IFNQSSBEQUMgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IDIwMTAgQW5hbG9nIERldmljZXMgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvY29uc3VtZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKworI2luY2x1ZGUgIi4uL2lpby5oIgorI2luY2x1ZGUgIi4uL3N5c2ZzLmgiCisjaW5jbHVkZSAiZGFjLmgiCisKKyNpbmNsdWRlICJhZDU0NDYuaCIKKworc3RhdGljIHZvaWQgYWQ1NDQ2X3N0b3JlX3NhbXBsZShzdHJ1Y3QgYWQ1NDQ2X3N0YXRlICpzdCwgdW5zaWduZWQgdmFsKQoreworCXN0LT5kYXRhLmQxNiA9IGNwdV90b19iZTE2KEFENTQ0Nl9MT0FEIHwKKwkJCQkJKHZhbCA8PCBzdC0+Y2hpcF9pbmZvLT5sZWZ0X3NoaWZ0KSk7Cit9CisKK3N0YXRpYyB2b2lkIGFkNTU0Ml9zdG9yZV9zYW1wbGUoc3RydWN0IGFkNTQ0Nl9zdGF0ZSAqc3QsIHVuc2lnbmVkIHZhbCkKK3sKKwlzdC0+ZGF0YS5kMTYgPSBjcHVfdG9fYmUxNih2YWwgPDwgc3QtPmNoaXBfaW5mby0+bGVmdF9zaGlmdCk7Cit9CisKK3N0YXRpYyB2b2lkIGFkNTYyMF9zdG9yZV9zYW1wbGUoc3RydWN0IGFkNTQ0Nl9zdGF0ZSAqc3QsIHVuc2lnbmVkIHZhbCkKK3sKKwlzdC0+ZGF0YS5kMTYgPSBjcHVfdG9fYmUxNihBRDU2MjBfTE9BRCB8CisJCQkJCSh2YWwgPDwgc3QtPmNoaXBfaW5mby0+bGVmdF9zaGlmdCkpOworfQorCitzdGF0aWMgdm9pZCBhZDU2NjBfc3RvcmVfc2FtcGxlKHN0cnVjdCBhZDU0NDZfc3RhdGUgKnN0LCB1bnNpZ25lZCB2YWwpCit7CisJdmFsIHw9IEFENTY2MF9MT0FEOworCXN0LT5kYXRhLmQyNFswXSA9ICh2YWwgPj4gMTYpICYgMHhGRjsKKwlzdC0+ZGF0YS5kMjRbMV0gPSAodmFsID4+IDgpICYgMHhGRjsKKwlzdC0+ZGF0YS5kMjRbMl0gPSB2YWwgJiAweEZGOworfQorCitzdGF0aWMgc3NpemVfdCBhZDU0NDZfd3JpdGUoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgbGVuKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDU0NDZfc3RhdGUgKnN0ID0gZGV2X2luZm8tPmRldl9kYXRhOworCWludCByZXQ7CisJbG9uZyB2YWw7CisKKwlyZXQgPSBzdHJpY3Rfc3RydG9sKGJ1ZiwgMTAsICZ2YWwpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfcmV0OworCisJaWYgKHZhbCA+IFJFU19NQVNLKHN0LT5jaGlwX2luZm8tPmJpdHMpKSB7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZXJyb3JfcmV0OworCX0KKworCW11dGV4X2xvY2soJmRldl9pbmZvLT5tbG9jayk7CisJc3QtPmNoaXBfaW5mby0+c3RvcmVfc2FtcGxlKHN0LCB2YWwpOworCXJldCA9IHNwaV9zeW5jKHN0LT5zcGksICZzdC0+bXNnKTsKKwltdXRleF91bmxvY2soJmRldl9pbmZvLT5tbG9jayk7CisKK2Vycm9yX3JldDoKKwlyZXR1cm4gcmV0ID8gcmV0IDogbGVuOworfQorCitzdGF0aWMgSUlPX0RFVl9BVFRSX09VVF9SQVcoMCwgYWQ1NDQ2X3dyaXRlLCAwKTsKKworc3RhdGljIHNzaXplX3QgYWQ1NDQ2X3Nob3dfc2NhbGUoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ1NDQ2X3N0YXRlICpzdCA9IGlpb19kZXZfZ2V0X2RldmRhdGEoZGV2X2luZm8pOworCS8qIENvcnJlc3BvbmRzIHRvIFZyZWYgLyAyXihiaXRzKSAqLworCXVuc2lnbmVkIGludCBzY2FsZV91diA9IChzdC0+dnJlZl9tdiAqIDEwMDApID4+IHN0LT5jaGlwX2luZm8tPmJpdHM7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZC4lZFxuIiwgc2NhbGVfdXYgLyAxMDAwLCBzY2FsZV91diAlIDEwMDApOworfQorc3RhdGljIElJT19ERVZJQ0VfQVRUUihvdXRfc2NhbGUsIFNfSVJVR08sIGFkNTQ0Nl9zaG93X3NjYWxlLCBOVUxMLCAwKTsKKworc3RhdGljIHNzaXplX3QgYWQ1NDQ2X3Nob3dfbmFtZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCSBjaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkNTQ0Nl9zdGF0ZSAqc3QgPSBpaW9fZGV2X2dldF9kZXZkYXRhKGRldl9pbmZvKTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVzXG4iLCBzcGlfZ2V0X2RldmljZV9pZChzdC0+c3BpKS0+bmFtZSk7Cit9CitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKG5hbWUsIFNfSVJVR08sIGFkNTQ0Nl9zaG93X25hbWUsIE5VTEwsIDApOworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqYWQ1NDQ2X2F0dHJpYnV0ZXNbXSA9IHsKKwkmaWlvX2Rldl9hdHRyX291dDBfcmF3LmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9vdXRfc2NhbGUuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX25hbWUuZGV2X2F0dHIuYXR0ciwKKwlOVUxMLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgYWQ1NDQ2X2F0dHJpYnV0ZV9ncm91cCA9IHsKKwkuYXR0cnMgPSBhZDU0NDZfYXR0cmlidXRlcywKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYWQ1NDQ2X2NoaXBfaW5mbyBhZDU0NDZfY2hpcF9pbmZvX3RibFtdID0geworCVtJRF9BRDU0NDRdID0geworCQkuYml0cyA9IDEyLAorCQkuc3RvcmFnZWJpdHMgPSAxNiwKKwkJLmxlZnRfc2hpZnQgPSAyLAorCQkuc3RvcmVfc2FtcGxlID0gYWQ1NDQ2X3N0b3JlX3NhbXBsZSwKKwl9LAorCVtJRF9BRDU0NDZdID0geworCQkuYml0cyA9IDE0LAorCQkuc3RvcmFnZWJpdHMgPSAxNiwKKwkJLmxlZnRfc2hpZnQgPSAwLAorCQkuc3RvcmVfc2FtcGxlID0gYWQ1NDQ2X3N0b3JlX3NhbXBsZSwKKwl9LAorCVtJRF9BRDU1NDJBXSA9IHsKKwkJLmJpdHMgPSAxNiwKKwkJLnN0b3JhZ2ViaXRzID0gMTYsCisJCS5sZWZ0X3NoaWZ0ID0gMCwKKwkJLnN0b3JlX3NhbXBsZSA9IGFkNTU0Ml9zdG9yZV9zYW1wbGUsCisJfSwKKwlbSURfQUQ1NTEyQV0gPSB7CisJCS5iaXRzID0gMTIsCisJCS5zdG9yYWdlYml0cyA9IDE2LAorCQkubGVmdF9zaGlmdCA9IDQsCisJCS5zdG9yZV9zYW1wbGUgPSBhZDU1NDJfc3RvcmVfc2FtcGxlLAorCX0sCisJW0lEX0FENTYyMF8yNTAwXSA9IHsKKwkJLmJpdHMgPSAxMiwKKwkJLnN0b3JhZ2ViaXRzID0gMTYsCisJCS5sZWZ0X3NoaWZ0ID0gMiwKKwkJLmludF92cmVmX212ID0gMjUwMCwKKwkJLnN0b3JlX3NhbXBsZSA9IGFkNTYyMF9zdG9yZV9zYW1wbGUsCisJfSwKKwlbSURfQUQ1NjIwXzEyNTBdID0geworCQkuYml0cyA9IDEyLAorCQkuc3RvcmFnZWJpdHMgPSAxNiwKKwkJLmxlZnRfc2hpZnQgPSAyLAorCQkuaW50X3ZyZWZfbXYgPSAxMjUwLAorCQkuc3RvcmVfc2FtcGxlID0gYWQ1NjIwX3N0b3JlX3NhbXBsZSwKKwl9LAorCVtJRF9BRDU2NDBfMjUwMF0gPSB7CisJCS5iaXRzID0gMTQsCisJCS5zdG9yYWdlYml0cyA9IDE2LAorCQkubGVmdF9zaGlmdCA9IDAsCisJCS5pbnRfdnJlZl9tdiA9IDI1MDAsCisJCS5zdG9yZV9zYW1wbGUgPSBhZDU2MjBfc3RvcmVfc2FtcGxlLAorCX0sCisJW0lEX0FENTY0MF8xMjUwXSA9IHsKKwkJLmJpdHMgPSAxNCwKKwkJLnN0b3JhZ2ViaXRzID0gMTYsCisJCS5sZWZ0X3NoaWZ0ID0gMCwKKwkJLmludF92cmVmX212ID0gMTI1MCwKKwkJLnN0b3JlX3NhbXBsZSA9IGFkNTYyMF9zdG9yZV9zYW1wbGUsCisJfSwKKwlbSURfQUQ1NjYwXzI1MDBdID0geworCQkuYml0cyA9IDE2LAorCQkuc3RvcmFnZWJpdHMgPSAyNCwKKwkJLmxlZnRfc2hpZnQgPSAwLAorCQkuaW50X3ZyZWZfbXYgPSAyNTAwLAorCQkuc3RvcmVfc2FtcGxlID0gYWQ1NjYwX3N0b3JlX3NhbXBsZSwKKwl9LAorCVtJRF9BRDU2NjBfMTI1MF0gPSB7CisJCS5iaXRzID0gMTYsCisJCS5zdG9yYWdlYml0cyA9IDI0LAorCQkubGVmdF9zaGlmdCA9IDAsCisJCS5pbnRfdnJlZl9tdiA9IDEyNTAsCisJCS5zdG9yZV9zYW1wbGUgPSBhZDU2NjBfc3RvcmVfc2FtcGxlLAorCX0sCit9OworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBhZDU0NDZfcHJvYmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlzdHJ1Y3QgYWQ1NDQ2X3N0YXRlICpzdDsKKwlpbnQgcmV0LCB2b2x0YWdlX3V2ID0gMDsKKworCXN0ID0ga3phbGxvYyhzaXplb2YoKnN0KSwgR0ZQX0tFUk5FTCk7CisJaWYgKHN0ID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJvcl9yZXQ7CisJfQorCisJc3QtPnJlZyA9IHJlZ3VsYXRvcl9nZXQoJnNwaS0+ZGV2LCAidmNjIik7CisJaWYgKCFJU19FUlIoc3QtPnJlZykpIHsKKwkJcmV0ID0gcmVndWxhdG9yX2VuYWJsZShzdC0+cmVnKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJyb3JfcHV0X3JlZzsKKworCQl2b2x0YWdlX3V2ID0gcmVndWxhdG9yX2dldF92b2x0YWdlKHN0LT5yZWcpOworCX0KKworCXN0LT5jaGlwX2luZm8gPQorCQkmYWQ1NDQ2X2NoaXBfaW5mb190Ymxbc3BpX2dldF9kZXZpY2VfaWQoc3BpKS0+ZHJpdmVyX2RhdGFdOworCisJc3BpX3NldF9kcnZkYXRhKHNwaSwgc3QpOworCisJc3QtPnNwaSA9IHNwaTsKKworCXN0LT5pbmRpb19kZXYgPSBpaW9fYWxsb2NhdGVfZGV2aWNlKCk7CisJaWYgKHN0LT5pbmRpb19kZXYgPT0gTlVMTCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycm9yX2Rpc2FibGVfcmVnOworCX0KKworCS8qIEVzdGFiaWxpc2ggdGhhdCB0aGUgaWlvX2RldiBpcyBhIGNoaWxkIG9mIHRoZSBzcGkgZGV2aWNlICovCisJc3QtPmluZGlvX2Rldi0+ZGV2LnBhcmVudCA9ICZzcGktPmRldjsKKwlzdC0+aW5kaW9fZGV2LT5hdHRycyA9ICZhZDU0NDZfYXR0cmlidXRlX2dyb3VwOworCXN0LT5pbmRpb19kZXYtPmRldl9kYXRhID0gKHZvaWQgKikoc3QpOworCXN0LT5pbmRpb19kZXYtPmRyaXZlcl9tb2R1bGUgPSBUSElTX01PRFVMRTsKKwlzdC0+aW5kaW9fZGV2LT5tb2RlcyA9IElORElPX0RJUkVDVF9NT0RFOworCisJLyogU2V0dXAgZGVmYXVsdCBtZXNzYWdlICovCisKKwlzdC0+eGZlci50eF9idWYgPSAmc3QtPmRhdGE7CisJc3QtPnhmZXIubGVuID0gc3QtPmNoaXBfaW5mby0+c3RvcmFnZWJpdHMgLyA4OworCisJc3BpX21lc3NhZ2VfaW5pdCgmc3QtPm1zZyk7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnN0LT54ZmVyLCAmc3QtPm1zZyk7CisKKwlzd2l0Y2ggKHNwaV9nZXRfZGV2aWNlX2lkKHNwaSktPmRyaXZlcl9kYXRhKSB7CisJCWNhc2UgSURfQUQ1NjIwXzI1MDA6CisJCWNhc2UgSURfQUQ1NjIwXzEyNTA6CisJCWNhc2UgSURfQUQ1NjQwXzI1MDA6CisJCWNhc2UgSURfQUQ1NjQwXzEyNTA6CisJCWNhc2UgSURfQUQ1NjYwXzI1MDA6CisJCWNhc2UgSURfQUQ1NjYwXzEyNTA6CisJCQlzdC0+dnJlZl9tdiA9IHN0LT5jaGlwX2luZm8tPmludF92cmVmX212OworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlpZiAodm9sdGFnZV91dikKKwkJCQlzdC0+dnJlZl9tdiA9IHZvbHRhZ2VfdXYgLyAxMDAwOworCQkJZWxzZQorCQkJCWRldl93YXJuKCZzcGktPmRldiwKKwkJCQkJICJyZWZlcmVuY2Ugdm9sdGFnZSB1bnNwZWNpZmllZFxuIik7CisJfQorCisJcmV0ID0gaWlvX2RldmljZV9yZWdpc3RlcihzdC0+aW5kaW9fZGV2KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX2ZyZWVfZGV2aWNlOworCisJcmV0dXJuIDA7CisKK2Vycm9yX2ZyZWVfZGV2aWNlOgorCWlpb19mcmVlX2RldmljZShzdC0+aW5kaW9fZGV2KTsKK2Vycm9yX2Rpc2FibGVfcmVnOgorCWlmICghSVNfRVJSKHN0LT5yZWcpKQorCQlyZWd1bGF0b3JfZGlzYWJsZShzdC0+cmVnKTsKK2Vycm9yX3B1dF9yZWc6CisJaWYgKCFJU19FUlIoc3QtPnJlZykpCisJCXJlZ3VsYXRvcl9wdXQoc3QtPnJlZyk7CisJa2ZyZWUoc3QpOworZXJyb3JfcmV0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYWQ1NDQ2X3JlbW92ZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCXN0cnVjdCBhZDU0NDZfc3RhdGUgKnN0ID0gc3BpX2dldF9kcnZkYXRhKHNwaSk7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IHN0LT5pbmRpb19kZXY7CisKKwlpaW9fZGV2aWNlX3VucmVnaXN0ZXIoaW5kaW9fZGV2KTsKKwlpZiAoIUlTX0VSUihzdC0+cmVnKSkgeworCQlyZWd1bGF0b3JfZGlzYWJsZShzdC0+cmVnKTsKKwkJcmVndWxhdG9yX3B1dChzdC0+cmVnKTsKKwl9CisJa2ZyZWUoc3QpOworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHNwaV9kZXZpY2VfaWQgYWQ1NDQ2X2lkW10gPSB7CisJeyJhZDU0NDQiLCBJRF9BRDU0NDR9LAorCXsiYWQ1NDQ2IiwgSURfQUQ1NDQ2fSwKKwl7ImFkNTU0MmEiLCBJRF9BRDU1NDJBfSwKKwl7ImFkNTUxMmEiLCBJRF9BRDU1MTJBfSwKKwl7ImFkNTYyMC0yNTAwIiwgSURfQUQ1NjIwXzI1MDB9LCAvKiBBRDU2MjAvNDAvNjA6ICovCisJeyJhZDU2MjAtMTI1MCIsIElEX0FENTYyMF8xMjUwfSwgLyogcGFydCBudW1iZXJzIG1heSBsb29rIGRpZmZlcmVudGx5ICovCisJeyJhZDU2NDAtMjUwMCIsIElEX0FENTY0MF8yNTAwfSwKKwl7ImFkNTY0MC0xMjUwIiwgSURfQUQ1NjQwXzEyNTB9LAorCXsiYWQ1NjYwLTI1MDAiLCBJRF9BRDU2NjBfMjUwMH0sCisJeyJhZDU2NjAtMTI1MCIsIElEX0FENTY2MF8xMjUwfSwKKwl7fQorfTsKKworc3RhdGljIHN0cnVjdCBzcGlfZHJpdmVyIGFkNTQ0Nl9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUJPSAiYWQ1NDQ2IiwKKwkJLmJ1cwk9ICZzcGlfYnVzX3R5cGUsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCX0sCisJLnByb2JlCQk9IGFkNTQ0Nl9wcm9iZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKGFkNTQ0Nl9yZW1vdmUpLAorCS5pZF90YWJsZQk9IGFkNTQ0Nl9pZCwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGFkNTQ0Nl9pbml0KHZvaWQpCit7CisJcmV0dXJuIHNwaV9yZWdpc3Rlcl9kcml2ZXIoJmFkNTQ0Nl9kcml2ZXIpOworfQorbW9kdWxlX2luaXQoYWQ1NDQ2X2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgYWQ1NDQ2X2V4aXQodm9pZCkKK3sKKwlzcGlfdW5yZWdpc3Rlcl9kcml2ZXIoJmFkNTQ0Nl9kcml2ZXIpOworfQorbW9kdWxlX2V4aXQoYWQ1NDQ2X2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJNaWNoYWVsIEhlbm5lcmljaCA8aGVubmVyaWNoQGJsYWNrZmluLnVjbGludXgub3JnPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJBbmFsb2cgRGV2aWNlcyBBRDU0NDQvQUQ1NDQ2IERBQyIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOworTU9EVUxFX0FMSUFTKCJzcGk6YWQ1NDQ2Iik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2RhYy9hZDU0NDYuaCBiL2RyaXZlcnMvc3RhZ2luZy9paW8vZGFjL2FkNTQ0Ni5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwMjU0MmUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2RhYy9hZDU0NDYuaApAQCAtMCwwICsxLDk2IEBACisvKgorICogQUQ1NDQ2IFNQSSBEQUMgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IDIwMTAgQW5hbG9nIERldmljZXMgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KKyAqLworI2lmbmRlZiBJSU9fREFDX0FENTQ0Nl9IXworI2RlZmluZSBJSU9fREFDX0FENTQ0Nl9IXworCisvKiBEQUMgQ29udHJvbCBCaXRzICovCisKKyNkZWZpbmUgQUQ1NDQ2X0xPQUQJCSgweDAgPDwgMTQpIC8qIExvYWQgYW5kIHVwZGF0ZSAqLworI2RlZmluZSBBRDU0NDZfU0RPX0RJUwkJKDB4MSA8PCAxNCkgLyogRGlzYWJsZSBTRE8gKi8KKyNkZWZpbmUgQUQ1NDQ2X05PUAkJKDB4MiA8PCAxNCkgLyogTm8gb3BlcmF0aW9uICovCisjZGVmaW5lIEFENTQ0Nl9DTEtfUklTSU5HCSgweDMgPDwgMTQpIC8qIENsb2NrIGRhdGEgb24gcmlzaW5nIGVkZ2UgKi8KKworI2RlZmluZSBBRDU2MjBfTE9BRAkJKDB4MCA8PCAxNCkgLyogTG9hZCBhbmQgdXBkYXRlIE5vcm0gT3BlcmF0aW9uKi8KKyNkZWZpbmUgQUQ1NjIwX1BXUkRXTl8xawkoMHgxIDw8IDE0KSAvKiBQb3dlci1kb3duOiAxa09obSB0byBHTkQgKi8KKyNkZWZpbmUgQUQ1NjIwX1BXUkRXTl8xMDBrCSgweDIgPDwgMTQpIC8qIFBvd2VyLWRvd246IDEwMGtPaG0gdG8gR05EICovCisjZGVmaW5lIEFENTYyMF9QV1JEV05fVFJJU1RBVEUJKDB4MyA8PCAxNCkgLyogUG93ZXItZG93bjogVGhyZWUtc3RhdGUgKi8KKworI2RlZmluZSBBRDU2NjBfTE9BRAkJKDB4MCA8PCAxNikgLyogTG9hZCBhbmQgdXBkYXRlIE5vcm0gT3BlcmF0aW9uKi8KKyNkZWZpbmUgQUQ1NjYwX1BXUkRXTl8xawkoMHgxIDw8IDE2KSAvKiBQb3dlci1kb3duOiAxa09obSB0byBHTkQgKi8KKyNkZWZpbmUgQUQ1NjYwX1BXUkRXTl8xMDBrCSgweDIgPDwgMTYpIC8qIFBvd2VyLWRvd246IDEwMGtPaG0gdG8gR05EICovCisjZGVmaW5lIEFENTY2MF9QV1JEV05fVFJJU1RBVEUJKDB4MyA8PCAxNikgLyogUG93ZXItZG93bjogVGhyZWUtc3RhdGUgKi8KKworI2RlZmluZSBSRVNfTUFTSyhiaXRzKQkoKDEgPDwgKGJpdHMpKSAtIDEpCisKKy8qKgorICogc3RydWN0IGFkNTQ0Nl9zdGF0ZSAtIGRyaXZlciBpbnN0YW5jZSBzcGVjaWZpYyBkYXRhCisgKiBAaW5kaW9fZGV2OgkJdGhlIGluZHVzdHJpYWwgSS9PIGRldmljZQorICogQHNwaToJCXNwaV9kZXZpY2UKKyAqIEBjaGlwX2luZm86CQljaGlwIG1vZGVsIHNwZWNpZmljIGNvbnN0YW50cywgYXZhaWxhYmxlIG1vZGVzIGV0YworICogQHJlZzoJCXN1cHBseSByZWd1bGF0b3IKKyAqIEBwb2xsX3dvcms6CQlib3R0b20gaGFsZiBvZiBwb2xsaW5nIGludGVycnVwdCBoYW5kbGVyCisgKiBAdnJlZl9tdjoJCWFjdHVhbCByZWZlcmVuY2Ugdm9sdGFnZSB1c2VkCisgKiBAeGZlcjoJCWRlZmF1bHQgc3BpIHRyYW5zZmVyCisgKiBAbXNnOgkJZGVmYXVsdCBzcGkgbWVzc2FnZQorICogQGRhdGE6CQlzcGkgdHJhbnNtaXQgYnVmZmVyCisgKi8KKworc3RydWN0IGFkNTQ0Nl9zdGF0ZSB7CisJc3RydWN0IGlpb19kZXYJCQkqaW5kaW9fZGV2OworCXN0cnVjdCBzcGlfZGV2aWNlCQkqc3BpOworCWNvbnN0IHN0cnVjdCBhZDU0NDZfY2hpcF9pbmZvCSpjaGlwX2luZm87CisJc3RydWN0IHJlZ3VsYXRvcgkJKnJlZzsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QJCXBvbGxfd29yazsKKwl1bnNpZ25lZCBzaG9ydAkJCXZyZWZfbXY7CisJc3RydWN0IHNwaV90cmFuc2ZlcgkJeGZlcjsKKwlzdHJ1Y3Qgc3BpX21lc3NhZ2UJCW1zZzsKKwl1bmlvbiB7CisJCXVuc2lnbmVkIHNob3J0CQlkMTY7CisJCXVuc2lnbmVkIGNoYXIJCWQyNFszXTsKKwl9IGRhdGE7Cit9OworCisvKioKKyAqIHN0cnVjdCBhZDU0NDZfY2hpcF9pbmZvIC0gY2hpcCBzcGVjaWZpYyBpbmZvcm1hdGlvbgorICogQGJpdHM6CQlhY2N1cmFjeSBvZiB0aGUgREFDIGluIGJpdHMKKyAqIEBzdG9yYWdlYml0czoJbnVtYmVyIG9mIGJpdHMgd3JpdHRlbiB0byB0aGUgREFDCisgKiBAbGVmdF9zaGlmdDoJCW51bWJlciBvZiBiaXRzIHRoZSBkYXR1bSBtdXN0IGJlIHNoaWZ0ZWQKKyAqIEBpbnRfdnJlZl9tdjoJQUQ1NjIwLzQwLzYwOiB0aGUgaW50ZXJuYWwgcmVmZXJlbmNlIHZvbHRhZ2UKKyAqIEBzdG9yZV9zYW1wbGU6CWNoaXAgc3BlY2lmaWMgaGVscGVyIGZ1bmN0aW9uIHRvIHN0b3JlIHRoZSBkYXR1bQorICovCisKK3N0cnVjdCBhZDU0NDZfY2hpcF9pbmZvIHsKKwl1OAkJCQliaXRzOworCXU4CQkJCXN0b3JhZ2ViaXRzOworCXU4CQkJCWxlZnRfc2hpZnQ7CisJdTE2CQkJCWludF92cmVmX212OworCXZvaWQgKCpzdG9yZV9zYW1wbGUpCQkoc3RydWN0IGFkNTQ0Nl9zdGF0ZSAqc3QsIHVuc2lnbmVkIHZhbCk7Cit9OworCisvKioKKyAqIGFkNTQ0Nl9zdXBwb3J0ZWRfZGV2aWNlX2lkczoKKyAqIFRoZSBBRDU2MjAvNDAvNjAgcGFydHMgYXJlIGF2YWlsYWJsZSBpbiBkaWZmZXJlbnQgZml4ZWQgaW50ZXJuYWwgcmVmZXJlbmNlCisgKiB2b2x0YWdlIG9wdGlvbnMuIFRoZSBhY3R1YWwgcGFydCBudW1iZXJzIG1heSBsb29rIGRpZmZlcmVudGx5CisgKiAoYW5kIGEgYml0IGNyeXB0aWMpLCBob3dldmVyIHRoaXMgc3R5bGUgaXMgdXNlZCB0byBtYWtlIGNsZWFyIHdoaWNoCisgKiBwYXJ0cyBhcmUgc3VwcG9ydGVkIGhlcmUuCisgKi8KKworZW51bSBhZDU0NDZfc3VwcG9ydGVkX2RldmljZV9pZHMgeworCUlEX0FENTQ0NCwKKwlJRF9BRDU0NDYsCisJSURfQUQ1NTQyQSwKKwlJRF9BRDU1MTJBLAorCUlEX0FENTYyMF8yNTAwLAorCUlEX0FENTYyMF8xMjUwLAorCUlEX0FENTY0MF8yNTAwLAorCUlEX0FENTY0MF8xMjUwLAorCUlEX0FENTY2MF8yNTAwLAorCUlEX0FENTY2MF8xMjUwLAorfTsKKworI2VuZGlmIC8qIElJT19EQUNfQUQ1NDQ2X0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2RhYy9hZDU2MjRyLmggYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2RhYy9hZDU2MjRyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2U1MThiZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vZGFjL2FkNTYyNHIuaApAQCAtMCwwICsxLDIxIEBACisjaWZuZGVmIFNQSV9BRDU2MjRSX0hfCisjZGVmaW5lIFNQSV9BRDU2MjRSX0hfCisKKyNkZWZpbmUgQUQ1NjI0Ul9EQUNfQ0hBTk5FTFMJNAorCisjZGVmaW5lIEFENTYyNFJfQUREUl9EQUMwCTB4MAorI2RlZmluZSBBRDU2MjRSX0FERFJfREFDMQkweDEKKyNkZWZpbmUgQUQ1NjI0Ul9BRERSX0RBQzIJMHgyCisjZGVmaW5lIEFENTYyNFJfQUREUl9EQUMzCTB4MworI2RlZmluZSBBRDU2MjRSX0FERFJfQUxMX0RBQwkweDcKKworI2RlZmluZSBBRDU2MjRSX0NNRF9XUklURV9JTlBVVF9OICAgICAgICAgICAgIDB4MAorI2RlZmluZSBBRDU2MjRSX0NNRF9VUERBVEVfREFDX04gICAgICAgICAgICAgIDB4MQorI2RlZmluZSBBRDU2MjRSX0NNRF9XUklURV9JTlBVVF9OX1VQREFURV9BTEwgIDB4MgorI2RlZmluZSBBRDU2MjRSX0NNRF9XUklURV9JTlBVVF9OX1VQREFURV9OICAgIDB4MworI2RlZmluZSBBRDU2MjRSX0NNRF9QT1dFUkRPV05fREFDICAgICAgICAgICAgIDB4NAorI2RlZmluZSBBRDU2MjRSX0NNRF9SRVNFVCAgICAgICAgICAgICAgICAgICAgIDB4NQorI2RlZmluZSBBRDU2MjRSX0NNRF9MREFDX1NFVFVQICAgICAgICAgICAgICAgIDB4NgorI2RlZmluZSBBRDU2MjRSX0NNRF9JTlRFUk5BTF9SRUZFUl9TRVRVUCAgICAgIDB4NworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vZGFjL2FkNTYyNHJfc3BpLmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2RhYy9hZDU2MjRyX3NwaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiMWM2ZGQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2RhYy9hZDU2MjRyX3NwaS5jCkBAIC0wLDAgKzEsMzAwIEBACisvKgorICogQUQ1NjI0UiwgQUQ1NjQ0UiwgQUQ1NjY0UiBEaWdpdGFsIHRvIGFuYWxvZyBjb252ZXJ0b3JzIHNwaSBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgMjAxMCBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKworI2luY2x1ZGUgIi4uL2lpby5oIgorI2luY2x1ZGUgIi4uL3N5c2ZzLmgiCisjaW5jbHVkZSAiZGFjLmgiCisjaW5jbHVkZSAiYWQ1NjI0ci5oIgorCisvKioKKyAqIHN0cnVjdCBhZDU2MjRyX3N0YXRlIC0gZGV2aWNlIHJlbGF0ZWQgc3RvcmFnZQorICogQGluZGlvX2RldjoJYXNzb2NpYXRlZCBpbmR1c3RyaWFsIElPIGRldmljZQorICogQHVzOgkJc3BpIGRldmljZQorICoqLworc3RydWN0IGFkNTYyNHJfc3RhdGUgeworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXY7CisJc3RydWN0IHNwaV9kZXZpY2UgKnVzOworCWludCBkYXRhX2xlbjsKKwlpbnQgbGRhY19tb2RlOworCWludCBkYWNfcG93ZXJfbW9kZVtBRDU2MjRSX0RBQ19DSEFOTkVMU107CisJaW50IGludGVybmFsX3JlZjsKK307CisKK3N0YXRpYyBpbnQgYWQ1NjI0cl9zcGlfd3JpdGUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwKKwkJCSAgICAgdTggY21kLCB1OCBhZGRyLCB1MTYgdmFsLCB1OCBsZW4pCit7CisJdTMyIGRhdGE7CisJdTggbXNnWzNdOworCisJLyoKKwkgKiBUaGUgaW5wdXQgc2hpZnQgcmVnaXN0ZXIgaXMgMjQgYml0cyB3aWRlLiBUaGUgZmlyc3QgdHdvIGJpdHMgYXJlIGRvbid0IGNhcmUgYml0cy4KKwkgKiBUaGUgbmV4dCB0aHJlZSBhcmUgdGhlIGNvbW1hbmQgYml0cywgQzIgdG8gQzAsIGZvbGxvd2VkIGJ5IHRoZSAzLWJpdCBEQUMgYWRkcmVzcywKKwkgKiBBMiB0byBBMCwgYW5kIHRoZW4gdGhlIDE2LSwgMTQtLCAxMi1iaXQgZGF0YS13b3JkLiBUaGUgZGF0YS13b3JkIGNvbXByaXNlcyB0aGUgMTYtLAorCSAqIDE0LSwgMTItYml0IGlucHV0IGNvZGUgZm9sbG93ZWQgYnkgMCwgMiwgb3IgNCBkb24ndCBjYXJlIGJpdHMsIGZvciB0aGUgQUQ1NjY0UiwKKwkgKiBBRDU2NDRSLCBhbmQgQUQ1NjI0UiwgcmVzcGVjdGl2ZWx5LgorCSAqLworCWRhdGEgPSAoMCA8PCAyMikgfCAoY21kIDw8IDE5KSB8IChhZGRyIDw8IDE2KSB8ICh2YWwgPDwgKDE2IC0gbGVuKSk7CisJbXNnWzBdID0gZGF0YSA+PiAxNjsKKwltc2dbMV0gPSBkYXRhID4+IDg7CisJbXNnWzJdID0gZGF0YTsKKworCXJldHVybiBzcGlfd3JpdGUoc3BpLCBtc2csIDMpOworfQorCitzdGF0aWMgc3NpemVfdCBhZDU2MjRyX3dyaXRlX2RhYyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCSBjb25zdCBjaGFyICpidWYsIHNpemVfdCBsZW4pCit7CisJbG9uZyByZWFkaW47CisJaW50IHJldDsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkNTYyNHJfc3RhdGUgKnN0ID0gaW5kaW9fZGV2LT5kZXZfZGF0YTsKKwlzdHJ1Y3QgaWlvX2Rldl9hdHRyICp0aGlzX2F0dHIgPSB0b19paW9fZGV2X2F0dHIoYXR0cik7CisKKwlyZXQgPSBzdHJpY3Rfc3RydG9sKGJ1ZiwgMTAsICZyZWFkaW4pOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBhZDU2MjRyX3NwaV93cml0ZShzdC0+dXMsIEFENTYyNFJfQ01EX1dSSVRFX0lOUFVUX05fVVBEQVRFX04sCisJCQkJdGhpc19hdHRyLT5hZGRyZXNzLCByZWFkaW4sIHN0LT5kYXRhX2xlbik7CisJcmV0dXJuIHJldCA/IHJldCA6IGxlbjsKK30KKworc3RhdGljIHNzaXplX3QgYWQ1NjI0cl9yZWFkX2xkYWNfbW9kZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkNTYyNHJfc3RhdGUgKnN0ID0gaW5kaW9fZGV2LT5kZXZfZGF0YTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV4XG4iLCBzdC0+bGRhY19tb2RlKTsKK30KKworc3RhdGljIHNzaXplX3QgYWQ1NjI0cl93cml0ZV9sZGFjX21vZGUoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkgICAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgbGVuKQoreworCWxvbmcgcmVhZGluOworCWludCByZXQ7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDU2MjRyX3N0YXRlICpzdCA9IGluZGlvX2Rldi0+ZGV2X2RhdGE7CisKKwlyZXQgPSBzdHJpY3Rfc3RydG9sKGJ1ZiwgMTYsICZyZWFkaW4pOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBhZDU2MjRyX3NwaV93cml0ZShzdC0+dXMsIEFENTYyNFJfQ01EX0xEQUNfU0VUVVAsIDAsCisJCQkJcmVhZGluICYgMHhGLCAxNik7CisJc3QtPmxkYWNfbW9kZSA9IHJlYWRpbiAmIDB4RjsKKworCXJldHVybiByZXQgPyByZXQgOiBsZW47Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkNTYyNHJfcmVhZF9kYWNfcG93ZXJfbW9kZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJCSAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCQkgICBjaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDU2MjRyX3N0YXRlICpzdCA9IGluZGlvX2Rldi0+ZGV2X2RhdGE7CisJc3RydWN0IGlpb19kZXZfYXR0ciAqdGhpc19hdHRyID0gdG9faWlvX2Rldl9hdHRyKGF0dHIpOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHN0LT5kYWNfcG93ZXJfbW9kZVt0aGlzX2F0dHItPmFkZHJlc3NdKTsKK30KKworc3RhdGljIHNzaXplX3QgYWQ1NjI0cl93cml0ZV9kYWNfcG93ZXJfbW9kZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJCSAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkJICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbikKK3sKKwlsb25nIHJlYWRpbjsKKwlpbnQgcmV0OworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ1NjI0cl9zdGF0ZSAqc3QgPSBpbmRpb19kZXYtPmRldl9kYXRhOworCXN0cnVjdCBpaW9fZGV2X2F0dHIgKnRoaXNfYXR0ciA9IHRvX2lpb19kZXZfYXR0cihhdHRyKTsKKworCXJldCA9IHN0cmljdF9zdHJ0b2woYnVmLCAxMCwgJnJlYWRpbik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IGFkNTYyNHJfc3BpX3dyaXRlKHN0LT51cywgQUQ1NjI0Ul9DTURfUE9XRVJET1dOX0RBQywgMCwKKwkJCQkoKHJlYWRpbiAmIDB4MykgPDwgNCkgfAorCQkJCSgxIDw8IHRoaXNfYXR0ci0+YWRkcmVzcyksIDE2KTsKKworCXN0LT5kYWNfcG93ZXJfbW9kZVt0aGlzX2F0dHItPmFkZHJlc3NdID0gcmVhZGluICYgMHgzOworCisJcmV0dXJuIHJldCA/IHJldCA6IGxlbjsKK30KKworc3RhdGljIHNzaXplX3QgYWQ1NjI0cl9yZWFkX2ludGVybmFsX3JlZl9tb2RlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkJICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJCSAgICAgIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkNTYyNHJfc3RhdGUgKnN0ID0gaW5kaW9fZGV2LT5kZXZfZGF0YTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBzdC0+aW50ZXJuYWxfcmVmKTsKK30KKworc3RhdGljIHNzaXplX3QgYWQ1NjI0cl93cml0ZV9pbnRlcm5hbF9yZWZfbW9kZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJCSAgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkJICAgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbikKK3sKKwlsb25nIHJlYWRpbjsKKwlpbnQgcmV0OworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ1NjI0cl9zdGF0ZSAqc3QgPSBpbmRpb19kZXYtPmRldl9kYXRhOworCisJcmV0ID0gc3RyaWN0X3N0cnRvbChidWYsIDEwLCAmcmVhZGluKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gYWQ1NjI0cl9zcGlfd3JpdGUoc3QtPnVzLCBBRDU2MjRSX0NNRF9JTlRFUk5BTF9SRUZFUl9TRVRVUCwgMCwKKwkJCQkhIXJlYWRpbiwgMTYpOworCisJc3QtPmludGVybmFsX3JlZiA9ICEhcmVhZGluOworCisJcmV0dXJuIHJldCA/IHJldCA6IGxlbjsKK30KKworc3RhdGljIElJT19ERVZfQVRUUl9PVVRfUkFXKDAsIGFkNTYyNHJfd3JpdGVfZGFjLCBBRDU2MjRSX0FERFJfREFDMCk7CitzdGF0aWMgSUlPX0RFVl9BVFRSX09VVF9SQVcoMSwgYWQ1NjI0cl93cml0ZV9kYWMsIEFENTYyNFJfQUREUl9EQUMxKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfT1VUX1JBVygyLCBhZDU2MjRyX3dyaXRlX2RhYywgQUQ1NjI0Ul9BRERSX0RBQzIpOworc3RhdGljIElJT19ERVZfQVRUUl9PVVRfUkFXKDMsIGFkNTYyNHJfd3JpdGVfZGFjLCBBRDU2MjRSX0FERFJfREFDMyk7CisKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIobGRhY19tb2RlLCBTX0lSVUdPIHwgU19JV1VTUiwgYWQ1NjI0cl9yZWFkX2xkYWNfbW9kZSwKKwkJICAgICAgIGFkNTYyNHJfd3JpdGVfbGRhY19tb2RlLCAwKTsKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIoaW50ZXJuYWxfcmVmLCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJICAgICAgIGFkNTYyNHJfcmVhZF9pbnRlcm5hbF9yZWZfbW9kZSwKKwkJICAgICAgIGFkNTYyNHJfd3JpdGVfaW50ZXJuYWxfcmVmX21vZGUsIDApOworCisjZGVmaW5lIElJT19ERVZfQVRUUl9EQUNfUE9XRVJfTU9ERShfbnVtLCBfc2hvdywgX3N0b3JlLCBfYWRkcikJCQlcCisJSUlPX0RFVklDRV9BVFRSKGRhY19wb3dlcl9tb2RlXyMjX251bSwgU19JUlVHTyB8IFNfSVdVU1IsIF9zaG93LCBfc3RvcmUsIF9hZGRyKQorCitzdGF0aWMgSUlPX0RFVl9BVFRSX0RBQ19QT1dFUl9NT0RFKDAsIGFkNTYyNHJfcmVhZF9kYWNfcG93ZXJfbW9kZSwKKwkJCQkgICBhZDU2MjRyX3dyaXRlX2RhY19wb3dlcl9tb2RlLCAwKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfREFDX1BPV0VSX01PREUoMSwgYWQ1NjI0cl9yZWFkX2RhY19wb3dlcl9tb2RlLAorCQkJCSAgIGFkNTYyNHJfd3JpdGVfZGFjX3Bvd2VyX21vZGUsIDEpOworc3RhdGljIElJT19ERVZfQVRUUl9EQUNfUE9XRVJfTU9ERSgyLCBhZDU2MjRyX3JlYWRfZGFjX3Bvd2VyX21vZGUsCisJCQkJICAgYWQ1NjI0cl93cml0ZV9kYWNfcG93ZXJfbW9kZSwgMik7CitzdGF0aWMgSUlPX0RFVl9BVFRSX0RBQ19QT1dFUl9NT0RFKDMsIGFkNTYyNHJfcmVhZF9kYWNfcG93ZXJfbW9kZSwKKwkJCQkgICBhZDU2MjRyX3dyaXRlX2RhY19wb3dlcl9tb2RlLCAzKTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmFkNTYyNHJfYXR0cmlidXRlc1tdID0geworCSZpaW9fZGV2X2F0dHJfb3V0MF9yYXcuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX291dDFfcmF3LmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9vdXQyX3Jhdy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfb3V0M19yYXcuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2RhY19wb3dlcl9tb2RlXzAuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2RhY19wb3dlcl9tb2RlXzEuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2RhY19wb3dlcl9tb2RlXzIuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2RhY19wb3dlcl9tb2RlXzMuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2xkYWNfbW9kZS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfaW50ZXJuYWxfcmVmLmRldl9hdHRyLmF0dHIsCisJTlVMTCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGFkNTYyNHJfYXR0cmlidXRlX2dyb3VwID0geworCS5hdHRycyA9IGFkNTYyNHJfYXR0cmlidXRlcywKK307CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGFkNTYyNHJfcHJvYmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlzdHJ1Y3QgYWQ1NjI0cl9zdGF0ZSAqc3Q7CisJaW50IHJldCA9IDA7CisKKwlzdCA9IGt6YWxsb2Moc2l6ZW9mKCpzdCksIEdGUF9LRVJORUwpOworCWlmIChzdCA9PSBOVUxMKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3JfcmV0OworCX0KKwlzcGlfc2V0X2RydmRhdGEoc3BpLCBzdCk7CisKKwlzdC0+ZGF0YV9sZW4gPSBzcGlfZ2V0X2RldmljZV9pZChzcGkpLT5kcml2ZXJfZGF0YTsKKworCXN0LT51cyA9IHNwaTsKKwlzdC0+aW5kaW9fZGV2ID0gaWlvX2FsbG9jYXRlX2RldmljZSgpOworCWlmIChzdC0+aW5kaW9fZGV2ID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJvcl9mcmVlX3N0OworCX0KKwlzdC0+aW5kaW9fZGV2LT5kZXYucGFyZW50ID0gJnNwaS0+ZGV2OworCXN0LT5pbmRpb19kZXYtPm51bV9pbnRlcnJ1cHRfbGluZXMgPSAwOworCXN0LT5pbmRpb19kZXYtPmV2ZW50X2F0dHJzID0gTlVMTDsKKworCXN0LT5pbmRpb19kZXYtPmF0dHJzID0gJmFkNTYyNHJfYXR0cmlidXRlX2dyb3VwOworCXN0LT5pbmRpb19kZXYtPmRldl9kYXRhID0gKHZvaWQgKikoc3QpOworCXN0LT5pbmRpb19kZXYtPmRyaXZlcl9tb2R1bGUgPSBUSElTX01PRFVMRTsKKwlzdC0+aW5kaW9fZGV2LT5tb2RlcyA9IElORElPX0RJUkVDVF9NT0RFOworCisJcmV0ID0gaWlvX2RldmljZV9yZWdpc3RlcihzdC0+aW5kaW9fZGV2KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX2ZyZWVfZGV2OworCisJc3BpLT5tb2RlID0gU1BJX01PREVfMDsKKwlzcGlfc2V0dXAoc3BpKTsKKworCXJldHVybiAwOworCitlcnJvcl9mcmVlX2RldjoKKwlpaW9fZnJlZV9kZXZpY2Uoc3QtPmluZGlvX2Rldik7CitlcnJvcl9mcmVlX3N0OgorCWtmcmVlKHN0KTsKK2Vycm9yX3JldDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBhZDU2MjRyX3JlbW92ZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCXN0cnVjdCBhZDU2MjRyX3N0YXRlICpzdCA9IHNwaV9nZXRfZHJ2ZGF0YShzcGkpOworCisJaWlvX2RldmljZV91bnJlZ2lzdGVyKHN0LT5pbmRpb19kZXYpOworCWtmcmVlKHN0KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHNwaV9kZXZpY2VfaWQgYWQ1NjI0cl9pZFtdID0geworCXsiYWQ1NjI0ciIsIDEyfSwKKwl7ImFkNTY0NHIiLCAxNH0sCisJeyJhZDU2NjRyIiwgMTZ9LAorCXt9Cit9OworCitzdGF0aWMgc3RydWN0IHNwaV9kcml2ZXIgYWQ1NjI0cl9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJICAgLm5hbWUgPSAiYWQ1NjI0ciIsCisJCSAgIC5vd25lciA9IFRISVNfTU9EVUxFLAorCQkgICB9LAorCS5wcm9iZSA9IGFkNTYyNHJfcHJvYmUsCisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKGFkNTYyNHJfcmVtb3ZlKSwKKwkuaWRfdGFibGUgPSBhZDU2MjRyX2lkLAorfTsKKworc3RhdGljIF9faW5pdCBpbnQgYWQ1NjI0cl9zcGlfaW5pdCh2b2lkKQoreworCXJldHVybiBzcGlfcmVnaXN0ZXJfZHJpdmVyKCZhZDU2MjRyX2RyaXZlcik7Cit9Cittb2R1bGVfaW5pdChhZDU2MjRyX3NwaV9pbml0KTsKKworc3RhdGljIF9fZXhpdCB2b2lkIGFkNTYyNHJfc3BpX2V4aXQodm9pZCkKK3sKKwlzcGlfdW5yZWdpc3Rlcl9kcml2ZXIoJmFkNTYyNHJfZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KGFkNTYyNHJfc3BpX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJCYXJyeSBTb25nIDwyMWNuYmFvQGdtYWlsLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiQW5hbG9nIERldmljZXMgQUQ1NjI0LzQ0LzY0UiBEQUMgc3BpIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9kYWMvZGFjLmggYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2RhYy9kYWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDgyZjM1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9kYWMvZGFjLmgKQEAgLTAsMCArMSw2IEBACisvKgorICogZGFjLmggLSBzeXNmcyBhdHRyaWJ1dGVzIGFzc29jaWF0ZWQgd2l0aCBEQUNzCisgKi8KKworI2RlZmluZSBJSU9fREVWX0FUVFJfT1VUX1JBVyhfbnVtLCBfc3RvcmUsIF9hZGRyKQkJCQlcCisJSUlPX0RFVklDRV9BVFRSKG91dCMjX251bSMjX3JhdywgU19JV1VTUiwgTlVMTCwgX3N0b3JlLCBfYWRkcikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vZGRzL0tjb25maWcgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2Rkcy9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwNDdkYTYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2Rkcy9LY29uZmlnCkBAIC0wLDAgKzEsNTYgQEAKKyMKKyMgRGlyZWN0IERpZ2l0YWwgU3ludGhlc2lzIGRyaXZlcnMKKyMKK2NvbW1lbnQgIkRpcmVjdCBEaWdpdGFsIFN5bnRoZXNpcyIKKworY29uZmlnIEFENTkzMAorCXRyaXN0YXRlICJBbmFsb2cgRGV2aWNlcyBhZDU5MzAvNTkzMiBkcml2ZXIiCisJZGVwZW5kcyBvbiBTUEkKKwloZWxwCisJICBTYXkgeWVzIGhlcmUgdG8gYnVpbGQgc3VwcG9ydCBmb3IgQW5hbG9nIERldmljZXMgRERTIGNoaXAKKwkgIGFkNTkzMC9hZDU5MzIsIHByb3ZpZGVzIGRpcmVjdCBhY2Nlc3MgdmlhIHN5c2ZzLgorCitjb25maWcgQUQ5ODMyCisJdHJpc3RhdGUgIkFuYWxvZyBEZXZpY2VzIGFkOTgzMi81IGRyaXZlciIKKwlkZXBlbmRzIG9uIFNQSQorCWhlbHAKKwkgIFNheSB5ZXMgaGVyZSB0byBidWlsZCBzdXBwb3J0IGZvciBBbmFsb2cgRGV2aWNlcyBERFMgY2hpcAorCSAgYWQ5ODMyIGFuZCBhZDk4MzUsIHByb3ZpZGVzIGRpcmVjdCBhY2Nlc3MgdmlhIHN5c2ZzLgorCitjb25maWcgQUQ5ODM0CisJdHJpc3RhdGUgIkFuYWxvZyBEZXZpY2VzIGFkOTgzMy80LyBkcml2ZXIiCisJZGVwZW5kcyBvbiBTUEkKKwloZWxwCisJICBTYXkgeWVzIGhlcmUgdG8gYnVpbGQgc3VwcG9ydCBmb3IgQW5hbG9nIERldmljZXMgRERTIGNoaXAKKwkgIEFEOTgzMyBhbmQgQUQ5ODM0LCBwcm92aWRlcyBkaXJlY3QgYWNjZXNzIHZpYSBzeXNmcy4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgYWQ5ODM0LgorCitjb25maWcgQUQ5ODUwCisJdHJpc3RhdGUgIkFuYWxvZyBEZXZpY2VzIGFkOTg1MC8xIGRyaXZlciIKKwlkZXBlbmRzIG9uIFNQSQorCWhlbHAKKwkgIFNheSB5ZXMgaGVyZSB0byBidWlsZCBzdXBwb3J0IGZvciBBbmFsb2cgRGV2aWNlcyBERFMgY2hpcAorCSAgYWQ5ODUwLzEsIHByb3ZpZGVzIGRpcmVjdCBhY2Nlc3MgdmlhIHN5c2ZzLgorCitjb25maWcgQUQ5ODUyCisJdHJpc3RhdGUgIkFuYWxvZyBEZXZpY2VzIGFkOTg1Mi80IGRyaXZlciIKKwlkZXBlbmRzIG9uIFNQSQorCWhlbHAKKwkgIFNheSB5ZXMgaGVyZSB0byBidWlsZCBzdXBwb3J0IGZvciBBbmFsb2cgRGV2aWNlcyBERFMgY2hpcAorCSAgYWQ5ODUyLzQsIHByb3ZpZGVzIGRpcmVjdCBhY2Nlc3MgdmlhIHN5c2ZzLgorCitjb25maWcgQUQ5OTEwCisJdHJpc3RhdGUgIkFuYWxvZyBEZXZpY2VzIGFkOTkxMCBkcml2ZXIiCisJZGVwZW5kcyBvbiBTUEkKKwloZWxwCisJICBTYXkgeWVzIGhlcmUgdG8gYnVpbGQgc3VwcG9ydCBmb3IgQW5hbG9nIERldmljZXMgRERTIGNoaXAKKwkgIGFkOTkxMCwgcHJvdmlkZXMgZGlyZWN0IGFjY2VzcyB2aWEgc3lzZnMuCisKK2NvbmZpZyBBRDk5NTEKKwl0cmlzdGF0ZSAiQW5hbG9nIERldmljZXMgYWQ5OTUxIGRyaXZlciIKKwlkZXBlbmRzIG9uIFNQSQorCWhlbHAKKwkgIFNheSB5ZXMgaGVyZSB0byBidWlsZCBzdXBwb3J0IGZvciBBbmFsb2cgRGV2aWNlcyBERFMgY2hpcAorCSAgYWQ5OTUxLCBwcm92aWRlcyBkaXJlY3QgYWNjZXNzIHZpYSBzeXNmcy4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vZGRzL01ha2VmaWxlIGIvZHJpdmVycy9zdGFnaW5nL2lpby9kZHMvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQ3NzQ2MQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vZGRzL01ha2VmaWxlCkBAIC0wLDAgKzEsMTEgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIERpcmVjdCBEaWdpdGFsIFN5bnRoZXNpcyBkcml2ZXJzCisjCisKK29iai0kKENPTkZJR19BRDU5MzApICs9IGFkNTkzMC5vCitvYmotJChDT05GSUdfQUQ5ODMyKSArPSBhZDk4MzIubworb2JqLSQoQ09ORklHX0FEOTgzNCkgKz0gYWQ5ODM0Lm8KK29iai0kKENPTkZJR19BRDk4NTApICs9IGFkOTg1MC5vCitvYmotJChDT05GSUdfQUQ5ODUyKSArPSBhZDk4NTIubworb2JqLSQoQ09ORklHX0FEOTkxMCkgKz0gYWQ5OTEwLm8KK29iai0kKENPTkZJR19BRDk5NTEpICs9IGFkOTk1MS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2Rkcy9hZDU5MzAuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vZGRzL2FkNTkzMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4MDAzOWMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2Rkcy9hZDU5MzAuYwpAQCAtMCwwICsxLDE3MCBAQAorLyoKKyAqIERyaXZlciBmb3IgQURJIERpcmVjdCBEaWdpdGFsIFN5bnRoZXNpcyBhZDU5MzAKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMCBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKi8KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNmcy5oPgorCisjaW5jbHVkZSAiLi4vaWlvLmgiCisjaW5jbHVkZSAiLi4vc3lzZnMuaCIKKworI2RlZmluZSBEUlZfTkFNRSAiYWQ1OTMwIgorCisjZGVmaW5lIHZhbHVlX21hc2sgKHUxNikweGYwMDAKKyNkZWZpbmUgYWRkcl9zaGlmdCAxMgorCisvKiBSZWdpc3RlciBmb3JtYXQ6IDQgYml0cyBhZGRyICsgMTIgYml0cyB2YWx1ZSAqLworc3RydWN0IGFkNTkwM19jb25maWcgeworCXUxNiBjb250cm9sOworCXUxNiBpbmNudW07CisJdTE2IGZycWRlbHRbMl07CisJdTE2IGluY2l0dmw7CisJdTE2IGJ1cml0dmw7CisJdTE2IHN0cnRmcnFbMl07Cit9OworCitzdHJ1Y3QgYWQ1OTMwX3N0YXRlIHsKKwlzdHJ1Y3QgbXV0ZXggbG9jazsKKwlzdHJ1Y3QgaWlvX2RldiAqaWRldjsKKwlzdHJ1Y3Qgc3BpX2RldmljZSAqc2RldjsKK307CisKK3N0YXRpYyBzc2l6ZV90IGFkNTkzMF9zZXRfcGFyYW1ldGVyKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJCQkJc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3Qgc3BpX21lc3NhZ2UgbXNnOworCXN0cnVjdCBzcGlfdHJhbnNmZXIgeGZlcjsKKwlpbnQgcmV0OworCXN0cnVjdCBhZDU5MDNfY29uZmlnICpjb25maWcgPSAoc3RydWN0IGFkNTkwM19jb25maWcgKilidWY7CisJc3RydWN0IGlpb19kZXYgKmlkZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ1OTMwX3N0YXRlICpzdCA9IGlkZXYtPmRldl9kYXRhOworCisJY29uZmlnLT5jb250cm9sID0gKGNvbmZpZy0+Y29udHJvbCAmIH52YWx1ZV9tYXNrKTsKKwljb25maWctPmluY251bSA9IChjb25maWctPmNvbnRyb2wgJiB+dmFsdWVfbWFzaykgfCAoMSA8PCBhZGRyX3NoaWZ0KTsKKwljb25maWctPmZycWRlbHRbMF0gPSAoY29uZmlnLT5jb250cm9sICYgfnZhbHVlX21hc2spIHwgKDIgPDwgYWRkcl9zaGlmdCk7CisJY29uZmlnLT5mcnFkZWx0WzFdID0gKGNvbmZpZy0+Y29udHJvbCAmIH52YWx1ZV9tYXNrKSB8IDMgPDwgYWRkcl9zaGlmdDsKKwljb25maWctPmluY2l0dmwgPSAoY29uZmlnLT5jb250cm9sICYgfnZhbHVlX21hc2spIHwgNCA8PCBhZGRyX3NoaWZ0OworCWNvbmZpZy0+YnVyaXR2bCA9IChjb25maWctPmNvbnRyb2wgJiB+dmFsdWVfbWFzaykgfCA4IDw8IGFkZHJfc2hpZnQ7CisJY29uZmlnLT5zdHJ0ZnJxWzBdID0gKGNvbmZpZy0+Y29udHJvbCAmIH52YWx1ZV9tYXNrKSB8IDB4YyA8PCBhZGRyX3NoaWZ0OworCWNvbmZpZy0+c3RydGZycVsxXSA9IChjb25maWctPmNvbnRyb2wgJiB+dmFsdWVfbWFzaykgfCAweGQgPDwgYWRkcl9zaGlmdDsKKworCXhmZXIubGVuID0gbGVuOworCXhmZXIudHhfYnVmID0gY29uZmlnOworCW11dGV4X2xvY2soJnN0LT5sb2NrKTsKKworCXNwaV9tZXNzYWdlX2luaXQoJm1zZyk7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnhmZXIsICZtc2cpOworCXJldCA9IHNwaV9zeW5jKHN0LT5zZGV2LCAmbXNnKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3JldDsKK2Vycm9yX3JldDoKKwltdXRleF91bmxvY2soJnN0LT5sb2NrKTsKKworCXJldHVybiByZXQgPyByZXQgOiBsZW47Cit9CisKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIoZGRzLCBTX0lXVVNSLCBOVUxMLCBhZDU5MzBfc2V0X3BhcmFtZXRlciwgMCk7CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICphZDU5MzBfYXR0cmlidXRlc1tdID0geworCSZpaW9fZGV2X2F0dHJfZGRzLmRldl9hdHRyLmF0dHIsCisJTlVMTCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGFkNTkzMF9hdHRyaWJ1dGVfZ3JvdXAgPSB7CisJLm5hbWUgPSBEUlZfTkFNRSwKKwkuYXR0cnMgPSBhZDU5MzBfYXR0cmlidXRlcywKK307CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGFkNTkzMF9wcm9iZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCXN0cnVjdCBhZDU5MzBfc3RhdGUgKnN0OworCWludCByZXQgPSAwOworCisJc3QgPSBremFsbG9jKHNpemVvZigqc3QpLCBHRlBfS0VSTkVMKTsKKwlpZiAoc3QgPT0gTlVMTCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycm9yX3JldDsKKwl9CisJc3BpX3NldF9kcnZkYXRhKHNwaSwgc3QpOworCisJbXV0ZXhfaW5pdCgmc3QtPmxvY2spOworCXN0LT5zZGV2ID0gc3BpOworCisJc3QtPmlkZXYgPSBpaW9fYWxsb2NhdGVfZGV2aWNlKCk7CisJaWYgKHN0LT5pZGV2ID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJvcl9mcmVlX3N0OworCX0KKwlzdC0+aWRldi0+ZGV2LnBhcmVudCA9ICZzcGktPmRldjsKKwlzdC0+aWRldi0+bnVtX2ludGVycnVwdF9saW5lcyA9IDA7CisJc3QtPmlkZXYtPmV2ZW50X2F0dHJzID0gTlVMTDsKKworCXN0LT5pZGV2LT5hdHRycyA9ICZhZDU5MzBfYXR0cmlidXRlX2dyb3VwOworCXN0LT5pZGV2LT5kZXZfZGF0YSA9ICh2b2lkICopKHN0KTsKKwlzdC0+aWRldi0+ZHJpdmVyX21vZHVsZSA9IFRISVNfTU9EVUxFOworCXN0LT5pZGV2LT5tb2RlcyA9IElORElPX0RJUkVDVF9NT0RFOworCisJcmV0ID0gaWlvX2RldmljZV9yZWdpc3RlcihzdC0+aWRldik7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9mcmVlX2RldjsKKwlzcGktPm1heF9zcGVlZF9oeiA9IDIwMDAwMDA7CisJc3BpLT5tb2RlID0gU1BJX01PREVfMzsKKwlzcGktPmJpdHNfcGVyX3dvcmQgPSAxNjsKKwlzcGlfc2V0dXAoc3BpKTsKKworCXJldHVybiAwOworCitlcnJvcl9mcmVlX2RldjoKKwlpaW9fZnJlZV9kZXZpY2Uoc3QtPmlkZXYpOworZXJyb3JfZnJlZV9zdDoKKwlrZnJlZShzdCk7CitlcnJvcl9yZXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgYWQ1OTMwX3JlbW92ZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCXN0cnVjdCBhZDU5MzBfc3RhdGUgKnN0ID0gc3BpX2dldF9kcnZkYXRhKHNwaSk7CisKKwlpaW9fZGV2aWNlX3VucmVnaXN0ZXIoc3QtPmlkZXYpOworCWtmcmVlKHN0KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNwaV9kcml2ZXIgYWQ1OTMwX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9IERSVl9OQU1FLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwl9LAorCS5wcm9iZSA9IGFkNTkzMF9wcm9iZSwKKwkucmVtb3ZlID0gX19kZXZleGl0X3AoYWQ1OTMwX3JlbW92ZSksCit9OworCitzdGF0aWMgX19pbml0IGludCBhZDU5MzBfc3BpX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gc3BpX3JlZ2lzdGVyX2RyaXZlcigmYWQ1OTMwX2RyaXZlcik7Cit9Cittb2R1bGVfaW5pdChhZDU5MzBfc3BpX2luaXQpOworCitzdGF0aWMgX19leGl0IHZvaWQgYWQ1OTMwX3NwaV9leGl0KHZvaWQpCit7CisJc3BpX3VucmVnaXN0ZXJfZHJpdmVyKCZhZDU5MzBfZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KGFkNTkzMF9zcGlfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIkNsaWZmIENhaSIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJBbmFsb2cgRGV2aWNlcyBhZDU5MzAgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2Rkcy9hZDk4MzIuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vZGRzL2FkOTgzMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5MTE4OTMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2Rkcy9hZDk4MzIuYwpAQCAtMCwwICsxLDI2NCBAQAorLyoKKyAqIERyaXZlciBmb3IgQURJIERpcmVjdCBEaWdpdGFsIFN5bnRoZXNpcyBhZDk4MzIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgQW5hbG9nIERldmljZXMgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICovCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KKworI2luY2x1ZGUgIi4uL2lpby5oIgorI2luY2x1ZGUgIi4uL3N5c2ZzLmgiCisKKyNkZWZpbmUgRFJWX05BTUUgImFkOTgzMiIKKworI2RlZmluZSB2YWx1ZV9tYXNrICh1MTYpMHhmMDAwCisjZGVmaW5lIGNtZF9zaGlmdCAxMgorI2RlZmluZSBhZGRfc2hpZnQgOAorI2RlZmluZSBBRDk4MzJfU1lOQyAoMSA8PCAxMykKKyNkZWZpbmUgQUQ5ODMyX1NFTFNSQyAoMSA8PCAxMikKKyNkZWZpbmUgQUQ5ODMyX1NMRUVQICgxIDw8IDEzKQorI2RlZmluZSBBRDk4MzJfUkVTRVQgKDEgPDwgMTIpCisjZGVmaW5lIEFEOTgzMl9DTFIgKDEgPDwgMTEpCisKKyNkZWZpbmUgQUREX0ZSRVEwTEwgMHgwCisjZGVmaW5lIEFERF9GUkVRMEhMIDB4MQorI2RlZmluZSBBRERfRlJFUTBMTSAweDIKKyNkZWZpbmUgQUREX0ZSRVEwSE0gMHgzCisjZGVmaW5lIEFERF9GUkVRMUxMIDB4NAorI2RlZmluZSBBRERfRlJFUTFITCAweDUKKyNkZWZpbmUgQUREX0ZSRVExTE0gMHg2CisjZGVmaW5lIEFERF9GUkVRMUhNIDB4NworI2RlZmluZSBBRERfUEhBU0UwTCAweDgKKyNkZWZpbmUgQUREX1BIQVNFMEggMHg5CisjZGVmaW5lIEFERF9QSEFTRTFMIDB4YQorI2RlZmluZSBBRERfUEhBU0UxSCAweGIKKyNkZWZpbmUgQUREX1BIQVNFMkwgMHhjCisjZGVmaW5lIEFERF9QSEFTRTJIIDB4ZAorI2RlZmluZSBBRERfUEhBU0UzTCAweGUKKyNkZWZpbmUgQUREX1BIQVNFM0ggMHhmCisKKyNkZWZpbmUgQ01EX1BIQThCSVRTVyAweDEKKyNkZWZpbmUgQ01EX1BIQTE2QklUU1cgMHgwCisjZGVmaW5lIENNRF9GUkU4QklUU1cgMHgzCisjZGVmaW5lIENNRF9GUkUxNkJJVFNXIDB4MgorI2RlZmluZSBDTURfU0VMQklUU0NUTCAweDYKKworc3RydWN0IGFkOTgzMl9zZXR0aW5nIHsKKwl1MTYgZnJlcTBbNF07CisJdTE2IGZyZXExWzRdOworCXUxNiBwaGFzZTBbMl07CisJdTE2IHBoYXNlMVsyXTsKKwl1MTYgcGhhc2UyWzJdOworCXUxNiBwaGFzZTNbMl07Cit9OworCitzdHJ1Y3QgYWQ5ODMyX3N0YXRlIHsKKwlzdHJ1Y3QgbXV0ZXggbG9jazsKKwlzdHJ1Y3QgaWlvX2RldiAqaWRldjsKKwlzdHJ1Y3Qgc3BpX2RldmljZSAqc2RldjsKK307CisKK3N0YXRpYyBzc2l6ZV90IGFkOTgzMl9zZXRfcGFyYW1ldGVyKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJCQkJc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3Qgc3BpX21lc3NhZ2UgbXNnOworCXN0cnVjdCBzcGlfdHJhbnNmZXIgeGZlcjsKKwlpbnQgcmV0OworCXN0cnVjdCBhZDk4MzJfc2V0dGluZyBjb25maWc7CisJc3RydWN0IGlpb19kZXYgKmlkZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ5ODMyX3N0YXRlICpzdCA9IGlkZXYtPmRldl9kYXRhOworCisJY29uZmlnLmZyZXEwWzBdID0gKENNRF9GUkU4QklUU1cgPDwgYWRkX3NoaWZ0IHwgQUREX0ZSRVEwTEwgPDwgYWRkX3NoaWZ0IHwgYnVmWzBdKTsKKwljb25maWcuZnJlcTBbMV0gPSAoQ01EX0ZSRTE2QklUU1cgPDwgYWRkX3NoaWZ0IHwgQUREX0ZSRVEwSEwgPDwgYWRkX3NoaWZ0IHwgYnVmWzFdKTsKKwljb25maWcuZnJlcTBbMl0gPSAoQ01EX0ZSRThCSVRTVyA8PCBhZGRfc2hpZnQgfCBBRERfRlJFUTBMTSA8PCBhZGRfc2hpZnQgfCBidWZbMl0pOworCWNvbmZpZy5mcmVxMFszXSA9IChDTURfRlJFMTZCSVRTVyA8PCBhZGRfc2hpZnQgfCBBRERfRlJFUTBITSA8PCBhZGRfc2hpZnQgfCBidWZbM10pOworCWNvbmZpZy5mcmVxMVswXSA9IChDTURfRlJFOEJJVFNXIDw8IGFkZF9zaGlmdCB8IEFERF9GUkVRMUxMIDw8IGFkZF9zaGlmdCB8IGJ1Zls0XSk7CisJY29uZmlnLmZyZXExWzFdID0gKENNRF9GUkUxNkJJVFNXIDw8IGFkZF9zaGlmdCB8IEFERF9GUkVRMUhMIDw8IGFkZF9zaGlmdCB8IGJ1Zls1XSk7CisJY29uZmlnLmZyZXExWzJdID0gKENNRF9GUkU4QklUU1cgPDwgYWRkX3NoaWZ0IHwgQUREX0ZSRVExTE0gPDwgYWRkX3NoaWZ0IHwgYnVmWzZdKTsKKwljb25maWcuZnJlcTFbM10gPSAoQ01EX0ZSRTE2QklUU1cgPDwgYWRkX3NoaWZ0IHwgQUREX0ZSRVExSE0gPDwgYWRkX3NoaWZ0IHwgYnVmWzddKTsKKworCWNvbmZpZy5waGFzZTBbMF0gPSAoQ01EX1BIQThCSVRTVyA8PCBhZGRfc2hpZnQgfCBBRERfUEhBU0UwTCA8PCBhZGRfc2hpZnQgfCBidWZbOV0pOworCWNvbmZpZy5waGFzZTBbMV0gPSAoQ01EX1BIQTE2QklUU1cgPDwgYWRkX3NoaWZ0IHwgQUREX1BIQVNFMEggPDwgYWRkX3NoaWZ0IHwgYnVmWzEwXSk7CisJY29uZmlnLnBoYXNlMVswXSA9IChDTURfUEhBOEJJVFNXIDw8IGFkZF9zaGlmdCB8IEFERF9QSEFTRTFMIDw8IGFkZF9zaGlmdCB8IGJ1ZlsxMV0pOworCWNvbmZpZy5waGFzZTFbMV0gPSAoQ01EX1BIQTE2QklUU1cgPDwgYWRkX3NoaWZ0IHwgQUREX1BIQVNFMUggPDwgYWRkX3NoaWZ0IHwgYnVmWzEyXSk7CisJY29uZmlnLnBoYXNlMlswXSA9IChDTURfUEhBOEJJVFNXIDw8IGFkZF9zaGlmdCB8IEFERF9QSEFTRTJMIDw8IGFkZF9zaGlmdCB8IGJ1ZlsxM10pOworCWNvbmZpZy5waGFzZTJbMV0gPSAoQ01EX1BIQTE2QklUU1cgPDwgYWRkX3NoaWZ0IHwgQUREX1BIQVNFMkggPDwgYWRkX3NoaWZ0IHwgYnVmWzE0XSk7CisJY29uZmlnLnBoYXNlM1swXSA9IChDTURfUEhBOEJJVFNXIDw8IGFkZF9zaGlmdCB8IEFERF9QSEFTRTNMIDw8IGFkZF9zaGlmdCB8IGJ1ZlsxNV0pOworCWNvbmZpZy5waGFzZTNbMV0gPSAoQ01EX1BIQTE2QklUU1cgPDwgYWRkX3NoaWZ0IHwgQUREX1BIQVNFM0ggPDwgYWRkX3NoaWZ0IHwgYnVmWzE2XSk7CisKKwl4ZmVyLmxlbiA9IDIgKiBsZW47CisJeGZlci50eF9idWYgPSAmY29uZmlnOworCW11dGV4X2xvY2soJnN0LT5sb2NrKTsKKworCXNwaV9tZXNzYWdlX2luaXQoJm1zZyk7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnhmZXIsICZtc2cpOworCXJldCA9IHNwaV9zeW5jKHN0LT5zZGV2LCAmbXNnKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3JldDsKK2Vycm9yX3JldDoKKwltdXRleF91bmxvY2soJnN0LT5sb2NrKTsKKworCXJldHVybiByZXQgPyByZXQgOiBsZW47Cit9CisKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIoZGRzLCBTX0lXVVNSLCBOVUxMLCBhZDk4MzJfc2V0X3BhcmFtZXRlciwgMCk7CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICphZDk4MzJfYXR0cmlidXRlc1tdID0geworCSZpaW9fZGV2X2F0dHJfZGRzLmRldl9hdHRyLmF0dHIsCisJTlVMTCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGFkOTgzMl9hdHRyaWJ1dGVfZ3JvdXAgPSB7CisJLm5hbWUgPSBEUlZfTkFNRSwKKwkuYXR0cnMgPSBhZDk4MzJfYXR0cmlidXRlcywKK307CisKK3N0YXRpYyB2b2lkIGFkOTgzMl9pbml0KHN0cnVjdCBhZDk4MzJfc3RhdGUgKnN0KQoreworCXN0cnVjdCBzcGlfbWVzc2FnZSBtc2c7CisJc3RydWN0IHNwaV90cmFuc2ZlciB4ZmVyOworCWludCByZXQ7CisJdTE2IGNvbmZpZyA9IDA7CisKKwljb25maWcgPSAweDMgPDwgMTQgfCBBRDk4MzJfU0xFRVAgfCBBRDk4MzJfUkVTRVQgfCBBRDk4MzJfQ0xSOworCisJbXV0ZXhfbG9jaygmc3QtPmxvY2spOworCisJeGZlci5sZW4gPSAyOworCXhmZXIudHhfYnVmID0gJmNvbmZpZzsKKworCXNwaV9tZXNzYWdlX2luaXQoJm1zZyk7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnhmZXIsICZtc2cpOworCXJldCA9IHNwaV9zeW5jKHN0LT5zZGV2LCAmbXNnKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3JldDsKKworCWNvbmZpZyA9IDB4MiA8PCAxNCB8IEFEOTgzMl9TWU5DIHwgQUQ5ODMyX1NFTFNSQzsKKwl4ZmVyLmxlbiA9IDI7CisJeGZlci50eF9idWYgPSAmY29uZmlnOworCisJc3BpX21lc3NhZ2VfaW5pdCgmbXNnKTsKKwlzcGlfbWVzc2FnZV9hZGRfdGFpbCgmeGZlciwgJm1zZyk7CisJcmV0ID0gc3BpX3N5bmMoc3QtPnNkZXYsICZtc2cpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfcmV0OworCisJY29uZmlnID0gQ01EX1NFTEJJVFNDVEwgPDwgY21kX3NoaWZ0OworCXhmZXIubGVuID0gMjsKKwl4ZmVyLnR4X2J1ZiA9ICZjb25maWc7CisKKwlzcGlfbWVzc2FnZV9pbml0KCZtc2cpOworCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZ4ZmVyLCAmbXNnKTsKKwlyZXQgPSBzcGlfc3luYyhzdC0+c2RldiwgJm1zZyk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9yZXQ7CisKKwljb25maWcgPSAweDMgPDwgMTQ7CisKKwl4ZmVyLmxlbiA9IDI7CisJeGZlci50eF9idWYgPSAmY29uZmlnOworCisJc3BpX21lc3NhZ2VfaW5pdCgmbXNnKTsKKwlzcGlfbWVzc2FnZV9hZGRfdGFpbCgmeGZlciwgJm1zZyk7CisJcmV0ID0gc3BpX3N5bmMoc3QtPnNkZXYsICZtc2cpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfcmV0OworZXJyb3JfcmV0OgorCW11dGV4X3VubG9jaygmc3QtPmxvY2spOworCisKKworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBhZDk4MzJfcHJvYmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlzdHJ1Y3QgYWQ5ODMyX3N0YXRlICpzdDsKKwlpbnQgcmV0ID0gMDsKKworCXN0ID0ga3phbGxvYyhzaXplb2YoKnN0KSwgR0ZQX0tFUk5FTCk7CisJaWYgKHN0ID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJvcl9yZXQ7CisJfQorCXNwaV9zZXRfZHJ2ZGF0YShzcGksIHN0KTsKKworCW11dGV4X2luaXQoJnN0LT5sb2NrKTsKKwlzdC0+c2RldiA9IHNwaTsKKworCXN0LT5pZGV2ID0gaWlvX2FsbG9jYXRlX2RldmljZSgpOworCWlmIChzdC0+aWRldiA9PSBOVUxMKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3JfZnJlZV9zdDsKKwl9CisJc3QtPmlkZXYtPmRldi5wYXJlbnQgPSAmc3BpLT5kZXY7CisJc3QtPmlkZXYtPm51bV9pbnRlcnJ1cHRfbGluZXMgPSAwOworCXN0LT5pZGV2LT5ldmVudF9hdHRycyA9IE5VTEw7CisKKwlzdC0+aWRldi0+YXR0cnMgPSAmYWQ5ODMyX2F0dHJpYnV0ZV9ncm91cDsKKwlzdC0+aWRldi0+ZGV2X2RhdGEgPSAodm9pZCAqKShzdCk7CisJc3QtPmlkZXYtPmRyaXZlcl9tb2R1bGUgPSBUSElTX01PRFVMRTsKKwlzdC0+aWRldi0+bW9kZXMgPSBJTkRJT19ESVJFQ1RfTU9ERTsKKworCXJldCA9IGlpb19kZXZpY2VfcmVnaXN0ZXIoc3QtPmlkZXYpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfZnJlZV9kZXY7CisJc3BpLT5tYXhfc3BlZWRfaHogPSAyMDAwMDAwOworCXNwaS0+bW9kZSA9IFNQSV9NT0RFXzM7CisJc3BpLT5iaXRzX3Blcl93b3JkID0gMTY7CisJc3BpX3NldHVwKHNwaSk7CisJYWQ5ODMyX2luaXQoc3QpOworCXJldHVybiAwOworCitlcnJvcl9mcmVlX2RldjoKKwlpaW9fZnJlZV9kZXZpY2Uoc3QtPmlkZXYpOworZXJyb3JfZnJlZV9zdDoKKwlrZnJlZShzdCk7CitlcnJvcl9yZXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgYWQ5ODMyX3JlbW92ZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCXN0cnVjdCBhZDk4MzJfc3RhdGUgKnN0ID0gc3BpX2dldF9kcnZkYXRhKHNwaSk7CisKKwlpaW9fZGV2aWNlX3VucmVnaXN0ZXIoc3QtPmlkZXYpOworCWtmcmVlKHN0KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNwaV9kcml2ZXIgYWQ5ODMyX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9IERSVl9OQU1FLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwl9LAorCS5wcm9iZSA9IGFkOTgzMl9wcm9iZSwKKwkucmVtb3ZlID0gX19kZXZleGl0X3AoYWQ5ODMyX3JlbW92ZSksCit9OworCitzdGF0aWMgX19pbml0IGludCBhZDk4MzJfc3BpX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gc3BpX3JlZ2lzdGVyX2RyaXZlcigmYWQ5ODMyX2RyaXZlcik7Cit9Cittb2R1bGVfaW5pdChhZDk4MzJfc3BpX2luaXQpOworCitzdGF0aWMgX19leGl0IHZvaWQgYWQ5ODMyX3NwaV9leGl0KHZvaWQpCit7CisJc3BpX3VucmVnaXN0ZXJfZHJpdmVyKCZhZDk4MzJfZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KGFkOTgzMl9zcGlfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIkNsaWZmIENhaSIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJBbmFsb2cgRGV2aWNlcyBhZDk4MzIgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2Rkcy9hZDk4MzQuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vZGRzL2FkOTgzNC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViMWE2ODEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2Rkcy9hZDk4MzQuYwpAQCAtMCwwICsxLDQ3NyBAQAorLyoKKyAqIEFEOTgzNCBTUEkgREFDIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAyMDEwIEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNmcy5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CisjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL2NvbnN1bWVyLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8YXNtL2RpdjY0Lmg+CisKKyNpbmNsdWRlICIuLi9paW8uaCIKKyNpbmNsdWRlICIuLi9zeXNmcy5oIgorI2luY2x1ZGUgImRkcy5oIgorCisjaW5jbHVkZSAiYWQ5ODM0LmgiCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgYWQ5ODM0X2NhbGNfZnJlcXJlZyh1bnNpZ25lZCBsb25nIG1jbGssIHVuc2lnbmVkIGxvbmcgZm91dCkKK3sKKwl1bnNpZ25lZCBsb25nIGxvbmcgZnJlcXJlZyA9ICh1NjQpIGZvdXQgKiAodTY0KSAoMSA8PCBBRDk4MzRfRlJFUV9CSVRTKTsKKwlkb19kaXYoZnJlcXJlZywgbWNsayk7CisJcmV0dXJuIGZyZXFyZWc7Cit9CisKK3N0YXRpYyBpbnQgYWQ5ODM0X3dyaXRlX2ZyZXF1ZW5jeShzdHJ1Y3QgYWQ5ODM0X3N0YXRlICpzdCwKKwkJCQkgIHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBmb3V0KQoreworCXVuc2lnbmVkIGxvbmcgcmVndmFsOworCisJaWYgKGZvdXQgPiAoc3QtPm1jbGsgLyAyKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZWd2YWwgPSBhZDk4MzRfY2FsY19mcmVxcmVnKHN0LT5tY2xrLCBmb3V0KTsKKworCXN0LT5mcmVxX2RhdGFbMF0gPSBjcHVfdG9fYmUxNihhZGRyIHwgKHJlZ3ZhbCAmCisJCQkJICAgICAgIFJFU19NQVNLKEFEOTgzNF9GUkVRX0JJVFMgLyAyKSkpOworCXN0LT5mcmVxX2RhdGFbMV0gPSBjcHVfdG9fYmUxNihhZGRyIHwgKChyZWd2YWwgPj4KKwkJCQkgICAgICAgKEFEOTgzNF9GUkVRX0JJVFMgLyAyKSkgJgorCQkJCSAgICAgICBSRVNfTUFTSyhBRDk4MzRfRlJFUV9CSVRTIC8gMikpKTsKKworCXJldHVybiBzcGlfc3luYyhzdC0+c3BpLCAmc3QtPmZyZXFfbXNnKTs7Cit9CisKK3N0YXRpYyBpbnQgYWQ5ODM0X3dyaXRlX3BoYXNlKHN0cnVjdCBhZDk4MzRfc3RhdGUgKnN0LAorCQkJCSAgdW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIHBoYXNlKQoreworCWlmIChwaGFzZSA+ICgxIDw8IEFEOTgzNF9QSEFTRV9CSVRTKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJc3QtPmRhdGEgPSBjcHVfdG9fYmUxNihhZGRyIHwgcGhhc2UpOworCisJcmV0dXJuIHNwaV9zeW5jKHN0LT5zcGksICZzdC0+bXNnKTsKK30KKworc3RhdGljIHNzaXplX3QgYWQ5ODM0X3dyaXRlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ5ODM0X3N0YXRlICpzdCA9IGRldl9pbmZvLT5kZXZfZGF0YTsKKwlzdHJ1Y3QgaWlvX2Rldl9hdHRyICp0aGlzX2F0dHIgPSB0b19paW9fZGV2X2F0dHIoYXR0cik7CisJaW50IHJldDsKKwlsb25nIHZhbDsKKworCXJldCA9IHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMTAsICZ2YWwpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfcmV0OworCisJbXV0ZXhfbG9jaygmZGV2X2luZm8tPm1sb2NrKTsKKwlzd2l0Y2ggKHRoaXNfYXR0ci0+YWRkcmVzcykgeworCWNhc2UgQUQ5ODM0X1JFR19GUkVRMDoKKwljYXNlIEFEOTgzNF9SRUdfRlJFUTE6CisJCXJldCA9IGFkOTgzNF93cml0ZV9mcmVxdWVuY3koc3QsIHRoaXNfYXR0ci0+YWRkcmVzcywgdmFsKTsKKwkJYnJlYWs7CisJY2FzZSBBRDk4MzRfUkVHX1BIQVNFMDoKKwljYXNlIEFEOTgzNF9SRUdfUEhBU0UxOgorCQlyZXQgPSBhZDk4MzRfd3JpdGVfcGhhc2Uoc3QsIHRoaXNfYXR0ci0+YWRkcmVzcywgdmFsKTsKKwkJYnJlYWs7CisJY2FzZSBBRDk4MzRfT1BCSVRFTjoKKwkJaWYgKHN0LT5jb250cm9sICYgQUQ5ODM0X01PREUpIHsKKwkJCXJldCA9IC1FSU5WQUw7ICAvKiBBRDk4NDMgcmVzZXJ2ZWQgbW9kZSAqLworCQkJYnJlYWs7CisJCX0KKworCQlpZiAodmFsKQorCQkJc3QtPmNvbnRyb2wgfD0gQUQ5ODM0X09QQklURU47CisJCWVsc2UKKwkJCXN0LT5jb250cm9sICY9IH5BRDk4MzRfT1BCSVRFTjsKKworCQlzdC0+ZGF0YSA9IGNwdV90b19iZTE2KEFEOTgzNF9SRUdfQ01EIHwgc3QtPmNvbnRyb2wpOworCQlyZXQgPSBzcGlfc3luYyhzdC0+c3BpLCAmc3QtPm1zZyk7CisJCWJyZWFrOworCWNhc2UgQUQ5ODM0X1BJTl9TVzoKKwkJaWYgKHZhbCkKKwkJCXN0LT5jb250cm9sIHw9IEFEOTgzNF9QSU5fU1c7CisJCWVsc2UKKwkJCXN0LT5jb250cm9sICY9IH5BRDk4MzRfUElOX1NXOworCQlzdC0+ZGF0YSA9IGNwdV90b19iZTE2KEFEOTgzNF9SRUdfQ01EIHwgc3QtPmNvbnRyb2wpOworCQlyZXQgPSBzcGlfc3luYyhzdC0+c3BpLCAmc3QtPm1zZyk7CisJCWJyZWFrOworCWNhc2UgQUQ5ODM0X0ZTRUw6CisJY2FzZSBBRDk4MzRfUFNFTDoKKwkJaWYgKHZhbCA9PSAwKQorCQkJc3QtPmNvbnRyb2wgJj0gfih0aGlzX2F0dHItPmFkZHJlc3MgfCBBRDk4MzRfUElOX1NXKTsKKwkJZWxzZSBpZiAodmFsID09IDEpIHsKKwkJCXN0LT5jb250cm9sIHw9IHRoaXNfYXR0ci0+YWRkcmVzczsKKwkJCXN0LT5jb250cm9sICY9IH5BRDk4MzRfUElOX1NXOworCQl9IGVsc2UgeworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWJyZWFrOworCQl9CisJCXN0LT5kYXRhID0gY3B1X3RvX2JlMTYoQUQ5ODM0X1JFR19DTUQgfCBzdC0+Y29udHJvbCk7CisJCXJldCA9IHNwaV9zeW5jKHN0LT5zcGksICZzdC0+bXNnKTsKKwkJYnJlYWs7CisJY2FzZSBBRDk4MzRfUkVTRVQ6CisJCWlmICh2YWwpCisJCQlzdC0+Y29udHJvbCAmPSB+QUQ5ODM0X1JFU0VUOworCQllbHNlCisJCQlzdC0+Y29udHJvbCB8PSBBRDk4MzRfUkVTRVQ7CisKKwkJc3QtPmRhdGEgPSBjcHVfdG9fYmUxNihBRDk4MzRfUkVHX0NNRCB8IHN0LT5jb250cm9sKTsKKwkJcmV0ID0gc3BpX3N5bmMoc3QtPnNwaSwgJnN0LT5tc2cpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXQgPSAtRU5PREVWOworCX0KKwltdXRleF91bmxvY2soJmRldl9pbmZvLT5tbG9jayk7CisKK2Vycm9yX3JldDoKKwlyZXR1cm4gcmV0ID8gcmV0IDogbGVuOworfQorCitzdGF0aWMgc3NpemVfdCBhZDk4MzRfc3RvcmVfd2F2ZXR5cGUoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkgY29uc3QgY2hhciAqYnVmLAorCQkJCSBzaXplX3QgbGVuKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDk4MzRfc3RhdGUgKnN0ID0gZGV2X2luZm8tPmRldl9kYXRhOworCXN0cnVjdCBpaW9fZGV2X2F0dHIgKnRoaXNfYXR0ciA9IHRvX2lpb19kZXZfYXR0cihhdHRyKTsKKwlpbnQgcmV0ID0gMDsKKwlib29sIGlzX2FkOTgzMyA9IHN0LT5kZXZpZCA9PSBJRF9BRDk4MzM7CisKKwltdXRleF9sb2NrKCZkZXZfaW5mby0+bWxvY2spOworCisJc3dpdGNoICh0aGlzX2F0dHItPmFkZHJlc3MpIHsKKwljYXNlIDA6CisJCWlmIChzeXNmc19zdHJlcShidWYsICJzaW5lIikpIHsKKwkJCXN0LT5jb250cm9sICY9IH5BRDk4MzRfTU9ERTsKKwkJCWlmIChpc19hZDk4MzMpCisJCQkJc3QtPmNvbnRyb2wgJj0gfkFEOTgzNF9PUEJJVEVOOworCQl9IGVsc2UgaWYgKHN5c2ZzX3N0cmVxKGJ1ZiwgInRyaWFuZ2xlIikpIHsKKwkJCWlmIChpc19hZDk4MzMpIHsKKwkJCQlzdC0+Y29udHJvbCAmPSB+QUQ5ODM0X09QQklURU47CisJCQkJc3QtPmNvbnRyb2wgfD0gQUQ5ODM0X01PREU7CisJCQl9IGVsc2UgaWYgKHN0LT5jb250cm9sICYgQUQ5ODM0X09QQklURU4pIHsKKwkJCQlyZXQgPSAtRUlOVkFMOwkvKiBBRDk4NDMgcmVzZXJ2ZWQgbW9kZSAqLworCQkJfSBlbHNlIHsKKwkJCQlzdC0+Y29udHJvbCB8PSBBRDk4MzRfTU9ERTsKKwkJCX0KKwkJfSBlbHNlIGlmIChpc19hZDk4MzMgJiYgc3lzZnNfc3RyZXEoYnVmLCAic3F1YXJlIikpIHsKKwkJCXN0LT5jb250cm9sICY9IH5BRDk4MzRfTU9ERTsKKwkJCXN0LT5jb250cm9sIHw9IEFEOTgzNF9PUEJJVEVOOworCQl9IGVsc2UgeworCQkJcmV0ID0gLUVJTlZBTDsKKwkJfQorCisJCWJyZWFrOworCWNhc2UgMToKKwkJaWYgKHN5c2ZzX3N0cmVxKGJ1ZiwgInNxdWFyZSIpICYmCisJCQkhKHN0LT5jb250cm9sICYgQUQ5ODM0X01PREUpKSB7CisJCQlzdC0+Y29udHJvbCAmPSB+QUQ5ODM0X01PREU7CisJCQlzdC0+Y29udHJvbCB8PSBBRDk4MzRfT1BCSVRFTjsKKwkJfSBlbHNlIHsKKwkJCXJldCA9IC1FSU5WQUw7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0ID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJfQorCisJaWYgKCFyZXQpIHsKKwkJc3QtPmRhdGEgPSBjcHVfdG9fYmUxNihBRDk4MzRfUkVHX0NNRCB8IHN0LT5jb250cm9sKTsKKwkJcmV0ID0gc3BpX3N5bmMoc3QtPnNwaSwgJnN0LT5tc2cpOworCX0KKwltdXRleF91bmxvY2soJmRldl9pbmZvLT5tbG9jayk7CisKKwlyZXR1cm4gcmV0ID8gcmV0IDogbGVuOworfQorCitzdGF0aWMgc3NpemVfdCBhZDk4MzRfc2hvd19uYW1lKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ5ODM0X3N0YXRlICpzdCA9IGlpb19kZXZfZ2V0X2RldmRhdGEoZGV2X2luZm8pOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXNcbiIsIHNwaV9nZXRfZGV2aWNlX2lkKHN0LT5zcGkpLT5uYW1lKTsKK30KK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIobmFtZSwgU19JUlVHTywgYWQ5ODM0X3Nob3dfbmFtZSwgTlVMTCwgMCk7CisKK3N0YXRpYyBzc2l6ZV90IGFkOTgzNF9zaG93X291dDBfd2F2ZXR5cGVfYXZhaWxhYmxlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCQkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDk4MzRfc3RhdGUgKnN0ID0gaWlvX2Rldl9nZXRfZGV2ZGF0YShkZXZfaW5mbyk7CisJY2hhciAqc3RyOworCisJaWYgKHN0LT5kZXZpZCA9PSBJRF9BRDk4MzMpCisJCXN0ciA9ICJzaW5lIHRyaWFuZ2xlIHNxdWFyZSI7CisJZWxzZSBpZiAoc3QtPmNvbnRyb2wgJiBBRDk4MzRfT1BCSVRFTikKKwkJc3RyID0gInNpbmUiOworCWVsc2UKKwkJc3RyID0gInNpbmUgdHJpYW5nbGUiOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXNcbiIsIHN0cik7Cit9CisKKworc3RhdGljIElJT19ERVZJQ0VfQVRUUihkZHMwX291dDBfd2F2ZXR5cGVfYXZhaWxhYmxlLCBTX0lSVUdPLAorCQkgICAgICAgYWQ5ODM0X3Nob3dfb3V0MF93YXZldHlwZV9hdmFpbGFibGUsIE5VTEwsIDApOworCitzdGF0aWMgc3NpemVfdCBhZDk4MzRfc2hvd19vdXQxX3dhdmV0eXBlX2F2YWlsYWJsZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ5ODM0X3N0YXRlICpzdCA9IGlpb19kZXZfZ2V0X2RldmRhdGEoZGV2X2luZm8pOworCWNoYXIgKnN0cjsKKworCWlmIChzdC0+Y29udHJvbCAmIEFEOTgzNF9NT0RFKQorCQlzdHIgPSAiIjsKKwllbHNlCisJCXN0ciA9ICJzcXVhcmUiOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXNcbiIsIHN0cik7Cit9CisKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIoZGRzMF9vdXQxX3dhdmV0eXBlX2F2YWlsYWJsZSwgU19JUlVHTywKKwkJICAgICAgIGFkOTgzNF9zaG93X291dDFfd2F2ZXR5cGVfYXZhaWxhYmxlLCBOVUxMLCAwKTsKKworLyoqCisgKiBzZWUgZGRzLmggZm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24KKyAqLworCitzdGF0aWMgSUlPX0RFVl9BVFRSX0ZSRVEoMCwgMCwgU19JV1VTUiwgTlVMTCwgYWQ5ODM0X3dyaXRlLCBBRDk4MzRfUkVHX0ZSRVEwKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfRlJFUSgwLCAxLCBTX0lXVVNSLCBOVUxMLCBhZDk4MzRfd3JpdGUsIEFEOTgzNF9SRUdfRlJFUTEpOworc3RhdGljIElJT19ERVZfQVRUUl9GUkVRU1lNQk9MKDAsIFNfSVdVU1IsIE5VTEwsIGFkOTgzNF93cml0ZSwgQUQ5ODM0X0ZTRUwpOworc3RhdGljIElJT19DT05TVF9BVFRSX0ZSRVFfU0NBTEUoMCwgIjEiKTsgLyogMUh6ICovCisKK3N0YXRpYyBJSU9fREVWX0FUVFJfUEhBU0UoMCwgMCwgU19JV1VTUiwgTlVMTCwgYWQ5ODM0X3dyaXRlLCBBRDk4MzRfUkVHX1BIQVNFMCk7CitzdGF0aWMgSUlPX0RFVl9BVFRSX1BIQVNFKDAsIDEsIFNfSVdVU1IsIE5VTEwsIGFkOTgzNF93cml0ZSwgQUQ5ODM0X1JFR19QSEFTRTEpOworc3RhdGljIElJT19ERVZfQVRUUl9QSEFTRVNZTUJPTCgwLCBTX0lXVVNSLCBOVUxMLCBhZDk4MzRfd3JpdGUsIEFEOTgzNF9QU0VMKTsKK3N0YXRpYyBJSU9fQ09OU1RfQVRUUl9QSEFTRV9TQ0FMRSgwLCAiMC4wMDE1MzM5ODA4Iik7IC8qIDJQSS8yXjEyIHJhZCovCisKK3N0YXRpYyBJSU9fREVWX0FUVFJfUElOQ09OVFJPTF9FTigwLCBTX0lXVVNSLCBOVUxMLAorCWFkOTgzNF93cml0ZSwgQUQ5ODM0X1BJTl9TVyk7CitzdGF0aWMgSUlPX0RFVl9BVFRSX09VVF9FTkFCTEUoMCwgU19JV1VTUiwgTlVMTCwgYWQ5ODM0X3dyaXRlLCBBRDk4MzRfUkVTRVQpOworc3RhdGljIElJT19ERVZfQVRUUl9PVVRZX0VOQUJMRSgwLCAxLCBTX0lXVVNSLCBOVUxMLAorCWFkOTgzNF93cml0ZSwgQUQ5ODM0X09QQklURU4pOworc3RhdGljIElJT19ERVZfQVRUUl9PVVRfV0FWRVRZUEUoMCwgMCwgYWQ5ODM0X3N0b3JlX3dhdmV0eXBlLCAwKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfT1VUX1dBVkVUWVBFKDAsIDEsIGFkOTgzNF9zdG9yZV93YXZldHlwZSwgMSk7CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICphZDk4MzRfYXR0cmlidXRlc1tdID0geworCSZpaW9fZGV2X2F0dHJfZGRzMF9mcmVxMC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfZGRzMF9mcmVxMS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fY29uc3RfYXR0cl9kZHMwX2ZyZXFfc2NhbGUuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2RkczBfcGhhc2UwLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9kZHMwX3BoYXNlMS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fY29uc3RfYXR0cl9kZHMwX3BoYXNlX3NjYWxlLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9kZHMwX3BpbmNvbnRyb2xfZW4uZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2RkczBfZnJlcXN5bWJvbC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfZGRzMF9waGFzZXN5bWJvbC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfZGRzMF9vdXRfZW5hYmxlLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9kZHMwX291dDFfZW5hYmxlLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9kZHMwX291dDBfd2F2ZXR5cGUuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2RkczBfb3V0MV93YXZldHlwZS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfZGRzMF9vdXQwX3dhdmV0eXBlX2F2YWlsYWJsZS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfZGRzMF9vdXQxX3dhdmV0eXBlX2F2YWlsYWJsZS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfbmFtZS5kZXZfYXR0ci5hdHRyLAorCU5VTEwsCit9OworCitzdGF0aWMgbW9kZV90IGFkOTgzNF9hdHRyX2lzX3Zpc2libGUoc3RydWN0IGtvYmplY3QgKmtvYmosCisJCQkJICAgICBzdHJ1Y3QgYXR0cmlidXRlICphdHRyLCBpbnQgbikKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBjb250YWluZXJfb2Yoa29iaiwgc3RydWN0IGRldmljZSwga29iaik7CisJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkOTgzNF9zdGF0ZSAqc3QgPSBpaW9fZGV2X2dldF9kZXZkYXRhKGRldl9pbmZvKTsKKworCW1vZGVfdCBtb2RlID0gYXR0ci0+bW9kZTsKKworCWlmIChzdC0+ZGV2aWQgPT0gSURfQUQ5ODM0KQorCQlyZXR1cm4gbW9kZTsKKworCWlmICgoYXR0ciA9PSAmaWlvX2Rldl9hdHRyX2RkczBfb3V0MV9lbmFibGUuZGV2X2F0dHIuYXR0cikgfHwKKwkJKGF0dHIgPT0gJmlpb19kZXZfYXR0cl9kZHMwX291dDFfd2F2ZXR5cGUuZGV2X2F0dHIuYXR0cikgfHwKKwkJKGF0dHIgPT0KKwkJJmlpb19kZXZfYXR0cl9kZHMwX291dDFfd2F2ZXR5cGVfYXZhaWxhYmxlLmRldl9hdHRyLmF0dHIpKQorCQltb2RlID0gMDsKKworCXJldHVybiBtb2RlOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBhZDk4MzRfYXR0cmlidXRlX2dyb3VwID0geworCS5hdHRycyA9IGFkOTgzNF9hdHRyaWJ1dGVzLAorCS5pc192aXNpYmxlID0gYWQ5ODM0X2F0dHJfaXNfdmlzaWJsZSwKK307CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGFkOTgzNF9wcm9iZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCXN0cnVjdCBhZDk4MzRfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBzcGktPmRldi5wbGF0Zm9ybV9kYXRhOworCXN0cnVjdCBhZDk4MzRfc3RhdGUgKnN0OworCWludCByZXQ7CisKKwlpZiAoIXBkYXRhKSB7CisJCWRldl9kYmcoJnNwaS0+ZGV2LCAibm8gcGxhdGZvcm0gZGF0YT9cbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlzdCA9IGt6YWxsb2Moc2l6ZW9mKCpzdCksIEdGUF9LRVJORUwpOworCWlmIChzdCA9PSBOVUxMKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3JfcmV0OworCX0KKworCXN0LT5yZWcgPSByZWd1bGF0b3JfZ2V0KCZzcGktPmRldiwgInZjYyIpOworCWlmICghSVNfRVJSKHN0LT5yZWcpKSB7CisJCXJldCA9IHJlZ3VsYXRvcl9lbmFibGUoc3QtPnJlZyk7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycm9yX3B1dF9yZWc7CisJfQorCisJc3QtPm1jbGsgPSBwZGF0YS0+bWNsazsKKworCXNwaV9zZXRfZHJ2ZGF0YShzcGksIHN0KTsKKworCXN0LT5zcGkgPSBzcGk7CisJc3QtPmRldmlkID0gc3BpX2dldF9kZXZpY2VfaWQoc3BpKS0+ZHJpdmVyX2RhdGE7CisKKwlzdC0+aW5kaW9fZGV2ID0gaWlvX2FsbG9jYXRlX2RldmljZSgpOworCWlmIChzdC0+aW5kaW9fZGV2ID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJvcl9kaXNhYmxlX3JlZzsKKwl9CisKKwlzdC0+aW5kaW9fZGV2LT5kZXYucGFyZW50ID0gJnNwaS0+ZGV2OworCXN0LT5pbmRpb19kZXYtPmF0dHJzID0gJmFkOTgzNF9hdHRyaWJ1dGVfZ3JvdXA7CisJc3QtPmluZGlvX2Rldi0+ZGV2X2RhdGEgPSAodm9pZCAqKSBzdDsKKwlzdC0+aW5kaW9fZGV2LT5kcml2ZXJfbW9kdWxlID0gVEhJU19NT0RVTEU7CisJc3QtPmluZGlvX2Rldi0+bW9kZXMgPSBJTkRJT19ESVJFQ1RfTU9ERTsKKworCS8qIFNldHVwIGRlZmF1bHQgbWVzc2FnZXMgKi8KKworCXN0LT54ZmVyLnR4X2J1ZiA9ICZzdC0+ZGF0YTsKKwlzdC0+eGZlci5sZW4gPSAyOworCisJc3BpX21lc3NhZ2VfaW5pdCgmc3QtPm1zZyk7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnN0LT54ZmVyLCAmc3QtPm1zZyk7CisKKwlzdC0+ZnJlcV94ZmVyWzBdLnR4X2J1ZiA9ICZzdC0+ZnJlcV9kYXRhWzBdOworCXN0LT5mcmVxX3hmZXJbMF0ubGVuID0gMjsKKwlzdC0+ZnJlcV94ZmVyWzBdLmNzX2NoYW5nZSA9IDE7CisJc3QtPmZyZXFfeGZlclsxXS50eF9idWYgPSAmc3QtPmZyZXFfZGF0YVsxXTsKKwlzdC0+ZnJlcV94ZmVyWzFdLmxlbiA9IDI7CisKKwlzcGlfbWVzc2FnZV9pbml0KCZzdC0+ZnJlcV9tc2cpOworCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZzdC0+ZnJlcV94ZmVyWzBdLCAmc3QtPmZyZXFfbXNnKTsKKwlzcGlfbWVzc2FnZV9hZGRfdGFpbCgmc3QtPmZyZXFfeGZlclsxXSwgJnN0LT5mcmVxX21zZyk7CisKKwlzdC0+Y29udHJvbCA9IEFEOTgzNF9CMjggfCBBRDk4MzRfUkVTRVQ7CisKKwlpZiAoIXBkYXRhLT5lbl9kaXYyKQorCQlzdC0+Y29udHJvbCB8PSBBRDk4MzRfRElWMjsKKworCWlmICghcGRhdGEtPmVuX3NpZ25iaXRfbXNiX291dCAmJiAoc3QtPmRldmlkID09IElEX0FEOTgzNCkpCisJCXN0LT5jb250cm9sIHw9IEFEOTgzNF9TSUdOX1BJQjsKKworCXN0LT5kYXRhID0gY3B1X3RvX2JlMTYoQUQ5ODM0X1JFR19DTUQgfCBzdC0+Y29udHJvbCk7CisJcmV0ID0gc3BpX3N5bmMoc3QtPnNwaSwgJnN0LT5tc2cpOworCWlmIChyZXQpIHsKKwkJZGV2X2Vycigmc3BpLT5kZXYsICJkZXZpY2UgaW5pdCBmYWlsZWRcbiIpOworCQlnb3RvIGVycm9yX2ZyZWVfZGV2aWNlOworCX0KKworCXJldCA9IGFkOTgzNF93cml0ZV9mcmVxdWVuY3koc3QsIEFEOTgzNF9SRUdfRlJFUTAsIHBkYXRhLT5mcmVxMCk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9mcmVlX2RldmljZTsKKworCXJldCA9IGFkOTgzNF93cml0ZV9mcmVxdWVuY3koc3QsIEFEOTgzNF9SRUdfRlJFUTEsIHBkYXRhLT5mcmVxMSk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9mcmVlX2RldmljZTsKKworCXJldCA9IGFkOTgzNF93cml0ZV9waGFzZShzdCwgQUQ5ODM0X1JFR19QSEFTRTAsIHBkYXRhLT5waGFzZTApOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfZnJlZV9kZXZpY2U7CisKKwlyZXQgPSBhZDk4MzRfd3JpdGVfcGhhc2Uoc3QsIEFEOTgzNF9SRUdfUEhBU0UxLCBwZGF0YS0+cGhhc2UxKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX2ZyZWVfZGV2aWNlOworCisJcmV0ID0gaWlvX2RldmljZV9yZWdpc3RlcihzdC0+aW5kaW9fZGV2KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX2ZyZWVfZGV2aWNlOworCisJcmV0dXJuIDA7CisKK2Vycm9yX2ZyZWVfZGV2aWNlOgorCWlpb19mcmVlX2RldmljZShzdC0+aW5kaW9fZGV2KTsKK2Vycm9yX2Rpc2FibGVfcmVnOgorCWlmICghSVNfRVJSKHN0LT5yZWcpKQorCQlyZWd1bGF0b3JfZGlzYWJsZShzdC0+cmVnKTsKK2Vycm9yX3B1dF9yZWc6CisJaWYgKCFJU19FUlIoc3QtPnJlZykpCisJCXJlZ3VsYXRvcl9wdXQoc3QtPnJlZyk7CisJa2ZyZWUoc3QpOworZXJyb3JfcmV0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IGFkOTgzNF9yZW1vdmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlzdHJ1Y3QgYWQ5ODM0X3N0YXRlICpzdCA9IHNwaV9nZXRfZHJ2ZGF0YShzcGkpOworCisJaWlvX2RldmljZV91bnJlZ2lzdGVyKHN0LT5pbmRpb19kZXYpOworCWlmICghSVNfRVJSKHN0LT5yZWcpKSB7CisJCXJlZ3VsYXRvcl9kaXNhYmxlKHN0LT5yZWcpOworCQlyZWd1bGF0b3JfcHV0KHN0LT5yZWcpOworCX0KKwlrZnJlZShzdCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc3BpX2RldmljZV9pZCBhZDk4MzRfaWRbXSA9IHsKKwl7ImFkOTgzMyIsIElEX0FEOTgzM30sCisJeyJhZDk4MzQiLCBJRF9BRDk4MzR9LAorCXt9Cit9OworCitzdGF0aWMgc3RydWN0IHNwaV9kcml2ZXIgYWQ5ODM0X2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZQk9ICJhZDk4MzQiLAorCQkuYnVzCT0gJnNwaV9idXNfdHlwZSwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJfSwKKwkucHJvYmUJCT0gYWQ5ODM0X3Byb2JlLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AoYWQ5ODM0X3JlbW92ZSksCisJLmlkX3RhYmxlCT0gYWQ5ODM0X2lkLAorfTsKKworc3RhdGljIGludCBfX2luaXQgYWQ5ODM0X2luaXQodm9pZCkKK3sKKwlyZXR1cm4gc3BpX3JlZ2lzdGVyX2RyaXZlcigmYWQ5ODM0X2RyaXZlcik7Cit9Cittb2R1bGVfaW5pdChhZDk4MzRfaW5pdCk7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBhZDk4MzRfZXhpdCh2b2lkKQoreworCXNwaV91bnJlZ2lzdGVyX2RyaXZlcigmYWQ5ODM0X2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdChhZDk4MzRfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIk1pY2hhZWwgSGVubmVyaWNoIDxoZW5uZXJpY2hAYmxhY2tmaW4udWNsaW51eC5vcmc+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkFuYWxvZyBEZXZpY2VzIEFEOTgzMy9BRDk4MzQgRERTIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CitNT0RVTEVfQUxJQVMoInNwaTphZDk4MzQiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vZGRzL2FkOTgzNC5oIGIvZHJpdmVycy9zdGFnaW5nL2lpby9kZHMvYWQ5ODM0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGZjM2I4OAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vZGRzL2FkOTgzNC5oCkBAIC0wLDAgKzEsMTEyIEBACisvKgorICogQUQ5ODM0IFNQSSBERFMgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IDIwMTAgQW5hbG9nIERldmljZXMgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KKyAqLworI2lmbmRlZiBJSU9fRERTX0FEOTgzNF9IXworI2RlZmluZSBJSU9fRERTX0FEOTgzNF9IXworCisvKiBSZWdpc3RlcnMgKi8KKworI2RlZmluZSBBRDk4MzRfUkVHX0NNRAkJKDAgPDwgMTQpCisjZGVmaW5lIEFEOTgzNF9SRUdfRlJFUTAJKDEgPDwgMTQpCisjZGVmaW5lIEFEOTgzNF9SRUdfRlJFUTEJKDIgPDwgMTQpCisjZGVmaW5lIEFEOTgzNF9SRUdfUEhBU0UwCSg2IDw8IDEzKQorI2RlZmluZSBBRDk4MzRfUkVHX1BIQVNFMQkoNyA8PCAxMykKKworLyogQ29tbWFuZCBDb250cm9sIEJpdHMgKi8KKworI2RlZmluZSBBRDk4MzRfQjI4CQkoMSA8PCAxMykKKyNkZWZpbmUgQUQ5ODM0X0hMQgkJKDEgPDwgMTIpCisjZGVmaW5lIEFEOTgzNF9GU0VMCQkoMSA8PCAxMSkKKyNkZWZpbmUgQUQ5ODM0X1BTRUwJCSgxIDw8IDEwKQorI2RlZmluZSBBRDk4MzRfUElOX1NXCQkoMSA8PCA5KQorI2RlZmluZSBBRDk4MzRfUkVTRVQJCSgxIDw8IDgpCisjZGVmaW5lIEFEOTgzNF9TTEVFUDEJCSgxIDw8IDcpCisjZGVmaW5lIEFEOTgzNF9TTEVFUDEyCQkoMSA8PCA2KQorI2RlZmluZSBBRDk4MzRfT1BCSVRFTgkJKDEgPDwgNSkKKyNkZWZpbmUgQUQ5ODM0X1NJR05fUElCCQkoMSA8PCA0KQorI2RlZmluZSBBRDk4MzRfRElWMgkJKDEgPDwgMykKKyNkZWZpbmUgQUQ5ODM0X01PREUJCSgxIDw8IDEpCisKKyNkZWZpbmUgQUQ5ODM0X0ZSRVFfQklUUwkyOAorI2RlZmluZSBBRDk4MzRfUEhBU0VfQklUUwkxMgorCisjZGVmaW5lIFJFU19NQVNLKGJpdHMpCSgoMSA8PCAoYml0cykpIC0gMSkKKworLyoqCisgKiBzdHJ1Y3QgYWQ5ODM0X3N0YXRlIC0gZHJpdmVyIGluc3RhbmNlIHNwZWNpZmljIGRhdGEKKyAqIEBpbmRpb19kZXY6CQl0aGUgaW5kdXN0cmlhbCBJL08gZGV2aWNlCisgKiBAc3BpOgkJc3BpX2RldmljZQorICogQHJlZzoJCXN1cHBseSByZWd1bGF0b3IKKyAqIEBtY2xrOgkJZXh0ZXJuYWwgbWFzdGVyIGNsb2NrCisgKiBAY29udHJvbDoJCWNhY2hlZCBjb250cm9sIHdvcmQKKyAqIEB4ZmVyOgkJZGVmYXVsdCBzcGkgdHJhbnNmZXIKKyAqIEBtc2c6CQlkZWZhdWx0IHNwaSBtZXNzYWdlCisgKiBAZnJlcV94ZmVyOgkJdHVuaW5nIHdvcmQgc3BpIHRyYW5zZmVyCisgKiBAZnJlcV9tc2c6CQl0dW5pbmcgd29yZCBzcGkgbWVzc2FnZQorICogQGRhdGE6CQlzcGkgdHJhbnNtaXQgYnVmZmVyCisgKiBAZnJlcV9kYXRhOgkJdHVuaW5nIHdvcmQgc3BpIHRyYW5zbWl0IGJ1ZmZlcgorICovCisKK3N0cnVjdCBhZDk4MzRfc3RhdGUgeworCXN0cnVjdCBpaW9fZGV2CQkJKmluZGlvX2RldjsKKwlzdHJ1Y3Qgc3BpX2RldmljZQkJKnNwaTsKKwlzdHJ1Y3QgcmVndWxhdG9yCQkqcmVnOworCXVuc2lnbmVkIGludAkJCW1jbGs7CisJdW5zaWduZWQgc2hvcnQJCQljb250cm9sOworCXVuc2lnbmVkIHNob3J0CQkJZGV2aWQ7CisJc3RydWN0IHNwaV90cmFuc2ZlcgkJeGZlcjsKKwlzdHJ1Y3Qgc3BpX21lc3NhZ2UJCW1zZzsKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyCQlmcmVxX3hmZXJbMl07CisJc3RydWN0IHNwaV9tZXNzYWdlCQlmcmVxX21zZzsKKworCS8qCisJICogRE1BICh0aHVzIGNhY2hlIGNvaGVyZW5jeSBtYWludGVuYW5jZSkgcmVxdWlyZXMgdGhlCisJICogdHJhbnNmZXIgYnVmZmVycyB0byBsaXZlIGluIHRoZWlyIG93biBjYWNoZSBsaW5lcy4KKwkgKi8KKwl1bnNpZ25lZCBzaG9ydAkJCWRhdGEgX19fX2NhY2hlbGluZV9hbGlnbmVkOworCXVuc2lnbmVkIHNob3J0CQkJZnJlcV9kYXRhWzJdIDsKK307CisKKworLyoKKyAqIFRPRE86IHN0cnVjdCBhZDc4ODdfcGxhdGZvcm1fZGF0YSBuZWVkcyB0byBnbyBpbnRvIGluY2x1ZGUvbGludXgvaWlvCisgKi8KKworLyoqCisgKiBzdHJ1Y3QgYWQ5ODM0X3BsYXRmb3JtX2RhdGEgLSBwbGF0Zm9ybSBzcGVjaWZpYyBpbmZvcm1hdGlvbgorICogQG1jbGs6CQltYXN0ZXIgY2xvY2sgaW4gSHoKKyAqIEBmcmVxMDoJCXBvd2VyIHVwIGZyZXEwIHR1bmluZyB3b3JkIGluIEh6CisgKiBAZnJlcTE6CQlwb3dlciB1cCBmcmVxMSB0dW5pbmcgd29yZCBpbiBIegorICogQHBoYXNlMDoJCXBvd2VyIHVwIHBoYXNlMCB2YWx1ZSBbMC4uNDA5NV0gY29ycmVsYXRlcyB3aXRoIDAuLjJQSQorICogQHBoYXNlMToJCXBvd2VyIHVwIHBoYXNlMSB2YWx1ZSBbMC4uNDA5NV0gY29ycmVsYXRlcyB3aXRoIDAuLjJQSQorICogQGVuX2RpdjI6CQlkaWdpdGFsIG91dHB1dC8yIGlzIHBhc3NlZCB0byB0aGUgU0lHTiBCSVQgT1VUIHBpbgorICogQGVuX3NpZ25iaXRfbXNiX291dDoJdGhlIE1TQiAob3IgTVNCLzIpIG9mIHRoZSBEQUMgZGF0YSBpcyBjb25uZWN0ZWQgdG8gdGhlCisgKgkJCVNJR04gQklUIE9VVCBwaW4uIGVuX2RpdjIgY29udHJvbHMgd2hldGhlciBpdCBpcyB0aGUgTVNCCisgKgkJCW9yIE1TQi8yIHRoYXQgaXMgb3V0cHV0LiBpZiBlbl9zaWduYml0X21zYl9vdXQ9ZmFsc2UsCisgKgkJCXRoZSBvbi1ib2FyZCBjb21wYXJhdG9yIGlzIGNvbm5lY3RlZCB0byBTSUdOIEJJVCBPVVQKKyAqLworCitzdHJ1Y3QgYWQ5ODM0X3BsYXRmb3JtX2RhdGEgeworCXVuc2lnbmVkIGludAkJbWNsazsKKwl1bnNpZ25lZCBpbnQJCWZyZXEwOworCXVuc2lnbmVkIGludAkJZnJlcTE7CisJdW5zaWduZWQgc2hvcnQJCXBoYXNlMDsKKwl1bnNpZ25lZCBzaG9ydAkJcGhhc2UxOworCWJvb2wJCQllbl9kaXYyOworCWJvb2wJCQllbl9zaWduYml0X21zYl9vdXQ7Cit9OworCisvKioKKyAqIGFkOTgzNF9zdXBwb3J0ZWRfZGV2aWNlX2lkczoKKyAqLworCitlbnVtIGFkOTgzNF9zdXBwb3J0ZWRfZGV2aWNlX2lkcyB7CisJSURfQUQ5ODMzLAorCUlEX0FEOTgzNCwKK307CisKKyNlbmRpZiAvKiBJSU9fRERTX0FEOTgzNF9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9kZHMvYWQ5ODUwLmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2Rkcy9hZDk4NTAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjU5YmZlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9kZHMvYWQ5ODUwLmMKQEAgLTAsMCArMSwxNTYgQEAKKy8qCisgKiBEcml2ZXIgZm9yIEFESSBEaXJlY3QgRGlnaXRhbCBTeW50aGVzaXMgYWQ5ODUwCisgKgorICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTAgQW5hbG9nIERldmljZXMgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICovCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KKworI2luY2x1ZGUgIi4uL2lpby5oIgorI2luY2x1ZGUgIi4uL3N5c2ZzLmgiCisKKyNkZWZpbmUgRFJWX05BTUUgImFkOTg1MCIKKworI2RlZmluZSB2YWx1ZV9tYXNrICh1MTYpMHhmMDAwCisjZGVmaW5lIGFkZHJfc2hpZnQgMTIKKworLyogUmVnaXN0ZXIgZm9ybWF0OiA0IGJpdHMgYWRkciArIDEyIGJpdHMgdmFsdWUgKi8KK3N0cnVjdCBhZDk4NTBfY29uZmlnIHsKKwl1OCBjb250cm9sWzVdOworfTsKKworc3RydWN0IGFkOTg1MF9zdGF0ZSB7CisJc3RydWN0IG11dGV4IGxvY2s7CisJc3RydWN0IGlpb19kZXYgKmlkZXY7CisJc3RydWN0IHNwaV9kZXZpY2UgKnNkZXY7Cit9OworCitzdGF0aWMgc3NpemVfdCBhZDk4NTBfc2V0X3BhcmFtZXRlcihzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCQljb25zdCBjaGFyICpidWYsCisJCQkJCXNpemVfdCBsZW4pCit7CisJc3RydWN0IHNwaV9tZXNzYWdlIG1zZzsKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyIHhmZXI7CisJaW50IHJldDsKKwlzdHJ1Y3QgYWQ5ODUwX2NvbmZpZyAqY29uZmlnID0gKHN0cnVjdCBhZDk4NTBfY29uZmlnICopYnVmOworCXN0cnVjdCBpaW9fZGV2ICppZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkOTg1MF9zdGF0ZSAqc3QgPSBpZGV2LT5kZXZfZGF0YTsKKworCXhmZXIubGVuID0gbGVuOworCXhmZXIudHhfYnVmID0gY29uZmlnOworCW11dGV4X2xvY2soJnN0LT5sb2NrKTsKKworCXNwaV9tZXNzYWdlX2luaXQoJm1zZyk7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnhmZXIsICZtc2cpOworCXJldCA9IHNwaV9zeW5jKHN0LT5zZGV2LCAmbXNnKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3JldDsKK2Vycm9yX3JldDoKKwltdXRleF91bmxvY2soJnN0LT5sb2NrKTsKKworCXJldHVybiByZXQgPyByZXQgOiBsZW47Cit9CisKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIoZGRzLCBTX0lXVVNSLCBOVUxMLCBhZDk4NTBfc2V0X3BhcmFtZXRlciwgMCk7CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICphZDk4NTBfYXR0cmlidXRlc1tdID0geworCSZpaW9fZGV2X2F0dHJfZGRzLmRldl9hdHRyLmF0dHIsCisJTlVMTCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGFkOTg1MF9hdHRyaWJ1dGVfZ3JvdXAgPSB7CisJLm5hbWUgPSBEUlZfTkFNRSwKKwkuYXR0cnMgPSBhZDk4NTBfYXR0cmlidXRlcywKK307CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGFkOTg1MF9wcm9iZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCXN0cnVjdCBhZDk4NTBfc3RhdGUgKnN0OworCWludCByZXQgPSAwOworCisJc3QgPSBremFsbG9jKHNpemVvZigqc3QpLCBHRlBfS0VSTkVMKTsKKwlpZiAoc3QgPT0gTlVMTCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycm9yX3JldDsKKwl9CisJc3BpX3NldF9kcnZkYXRhKHNwaSwgc3QpOworCisJbXV0ZXhfaW5pdCgmc3QtPmxvY2spOworCXN0LT5zZGV2ID0gc3BpOworCisJc3QtPmlkZXYgPSBpaW9fYWxsb2NhdGVfZGV2aWNlKCk7CisJaWYgKHN0LT5pZGV2ID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJvcl9mcmVlX3N0OworCX0KKwlzdC0+aWRldi0+ZGV2LnBhcmVudCA9ICZzcGktPmRldjsKKwlzdC0+aWRldi0+bnVtX2ludGVycnVwdF9saW5lcyA9IDA7CisJc3QtPmlkZXYtPmV2ZW50X2F0dHJzID0gTlVMTDsKKworCXN0LT5pZGV2LT5hdHRycyA9ICZhZDk4NTBfYXR0cmlidXRlX2dyb3VwOworCXN0LT5pZGV2LT5kZXZfZGF0YSA9ICh2b2lkICopKHN0KTsKKwlzdC0+aWRldi0+ZHJpdmVyX21vZHVsZSA9IFRISVNfTU9EVUxFOworCXN0LT5pZGV2LT5tb2RlcyA9IElORElPX0RJUkVDVF9NT0RFOworCisJcmV0ID0gaWlvX2RldmljZV9yZWdpc3RlcihzdC0+aWRldik7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9mcmVlX2RldjsKKwlzcGktPm1heF9zcGVlZF9oeiA9IDIwMDAwMDA7CisJc3BpLT5tb2RlID0gU1BJX01PREVfMzsKKwlzcGktPmJpdHNfcGVyX3dvcmQgPSAxNjsKKwlzcGlfc2V0dXAoc3BpKTsKKworCXJldHVybiAwOworCitlcnJvcl9mcmVlX2RldjoKKwlpaW9fZnJlZV9kZXZpY2Uoc3QtPmlkZXYpOworZXJyb3JfZnJlZV9zdDoKKwlrZnJlZShzdCk7CitlcnJvcl9yZXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgYWQ5ODUwX3JlbW92ZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCXN0cnVjdCBhZDk4NTBfc3RhdGUgKnN0ID0gc3BpX2dldF9kcnZkYXRhKHNwaSk7CisKKwlpaW9fZGV2aWNlX3VucmVnaXN0ZXIoc3QtPmlkZXYpOworCWtmcmVlKHN0KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNwaV9kcml2ZXIgYWQ5ODUwX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9IERSVl9OQU1FLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwl9LAorCS5wcm9iZSA9IGFkOTg1MF9wcm9iZSwKKwkucmVtb3ZlID0gX19kZXZleGl0X3AoYWQ5ODUwX3JlbW92ZSksCit9OworCitzdGF0aWMgX19pbml0IGludCBhZDk4NTBfc3BpX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gc3BpX3JlZ2lzdGVyX2RyaXZlcigmYWQ5ODUwX2RyaXZlcik7Cit9Cittb2R1bGVfaW5pdChhZDk4NTBfc3BpX2luaXQpOworCitzdGF0aWMgX19leGl0IHZvaWQgYWQ5ODUwX3NwaV9leGl0KHZvaWQpCit7CisJc3BpX3VucmVnaXN0ZXJfZHJpdmVyKCZhZDk4NTBfZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KGFkOTg1MF9zcGlfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIkNsaWZmIENhaSIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJBbmFsb2cgRGV2aWNlcyBhZDk4NTAgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2Rkcy9hZDk4NTIuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vZGRzL2FkOTg1Mi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5NGZiNmEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2Rkcy9hZDk4NTIuYwpAQCAtMCwwICsxLDMwNSBAQAorLyoKKyAqIERyaXZlciBmb3IgQURJIERpcmVjdCBEaWdpdGFsIFN5bnRoZXNpcyBhZDk4NTIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgQW5hbG9nIERldmljZXMgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICovCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KKworI2luY2x1ZGUgIi4uL2lpby5oIgorI2luY2x1ZGUgIi4uL3N5c2ZzLmgiCisKKyNkZWZpbmUgRFJWX05BTUUgImFkOTg1MiIKKworI2RlZmluZSBhZGRyX3BoYWFkMSAweDAKKyNkZWZpbmUgYWRkcl9waGFhZDIgMHgxCisjZGVmaW5lIGFkZHJfZnJldHUxIDB4MgorI2RlZmluZSBhZGRyX2ZyZXR1MiAweDMKKyNkZWZpbmUgYWRkcl9kZWxmcmUgMHg0CisjZGVmaW5lIGFkZHJfdXBkY2xrIDB4NQorI2RlZmluZSBhZGRyX3JhbWNsayAweDYKKyNkZWZpbmUgYWRkcl9jb250cmwgMHg3CisjZGVmaW5lIGFkZHJfb3B0c2ttIDB4OAorI2RlZmluZSBhZGRyX29wdHNrciAweGEKKyNkZWZpbmUgYWRkcl9kYWNjdGwgMHhiCisKKyNkZWZpbmUgQ09NUFBECQkoMSA8PCA0KQorI2RlZmluZSBSRUZNVUxUMgkoMSA8PCAyKQorI2RlZmluZSBCWVBQTEwJCSgxIDw8IDUpCisjZGVmaW5lIFBMTFJBTkcJCSgxIDw8IDYpCisjZGVmaW5lIElFVVBDTEsJCSgxKQorI2RlZmluZSBPU0tFTgkJKDEgPDwgNSkKKworI2RlZmluZSByZWFkX2JpdAkoMSA8PCA3KQorCisvKiBSZWdpc3RlciBmb3JtYXQ6IDEgYnl0ZSBhZGRyICsgdmFsdWUgKi8KK3N0cnVjdCBhZDk4NTJfY29uZmlnIHsKKwl1OCBwaGFqc3QwWzNdOworCXU4IHBoYWpzdDFbM107CisJdTggZnJldHVuMVs2XTsKKwl1OCBmcmV0dW4yWzZdOworCXU4IGRsdGFmcmVbNl07CisJdTggdXBkdGNsa1s1XTsKKwl1OCByYW1wcmF0WzRdOworCXU4IGNvbnRyb2xbNV07CisJdTggb3V0cHNrbVszXTsKKwl1OCBvdXRwc2tyWzJdOworCXU4IGRhY2NudGxbM107Cit9OworCitzdHJ1Y3QgYWQ5ODUyX3N0YXRlIHsKKwlzdHJ1Y3QgbXV0ZXggbG9jazsKKwlzdHJ1Y3QgaWlvX2RldiAqaWRldjsKKwlzdHJ1Y3Qgc3BpX2RldmljZSAqc2RldjsKK307CisKK3N0YXRpYyBzc2l6ZV90IGFkOTg1Ml9zZXRfcGFyYW1ldGVyKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJCQkJc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3Qgc3BpX21lc3NhZ2UgbXNnOworCXN0cnVjdCBzcGlfdHJhbnNmZXIgeGZlcjsKKwlpbnQgcmV0OworCXN0cnVjdCBhZDk4NTJfY29uZmlnICpjb25maWcgPSAoc3RydWN0IGFkOTg1Ml9jb25maWcgKilidWY7CisJc3RydWN0IGlpb19kZXYgKmlkZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ5ODUyX3N0YXRlICpzdCA9IGlkZXYtPmRldl9kYXRhOworCisJeGZlci5sZW4gPSAzOworCXhmZXIudHhfYnVmID0gJmNvbmZpZy0+cGhhanN0MFswXTsKKwltdXRleF9sb2NrKCZzdC0+bG9jayk7CisKKwlzcGlfbWVzc2FnZV9pbml0KCZtc2cpOworCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZ4ZmVyLCAmbXNnKTsKKwlyZXQgPSBzcGlfc3luYyhzdC0+c2RldiwgJm1zZyk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9yZXQ7CisKKwl4ZmVyLmxlbiA9IDM7CisJeGZlci50eF9idWYgPSAmY29uZmlnLT5waGFqc3QxWzBdOworCisJc3BpX21lc3NhZ2VfaW5pdCgmbXNnKTsKKwlzcGlfbWVzc2FnZV9hZGRfdGFpbCgmeGZlciwgJm1zZyk7CisJcmV0ID0gc3BpX3N5bmMoc3QtPnNkZXYsICZtc2cpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfcmV0OworCisJeGZlci5sZW4gPSA2OworCXhmZXIudHhfYnVmID0gJmNvbmZpZy0+ZnJldHVuMVswXTsKKworCXNwaV9tZXNzYWdlX2luaXQoJm1zZyk7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnhmZXIsICZtc2cpOworCXJldCA9IHNwaV9zeW5jKHN0LT5zZGV2LCAmbXNnKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3JldDsKKworCXhmZXIubGVuID0gNjsKKwl4ZmVyLnR4X2J1ZiA9ICZjb25maWctPmZyZXR1bjJbMF07CisKKwlzcGlfbWVzc2FnZV9pbml0KCZtc2cpOworCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZ4ZmVyLCAmbXNnKTsKKwlyZXQgPSBzcGlfc3luYyhzdC0+c2RldiwgJm1zZyk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9yZXQ7CisKKwl4ZmVyLmxlbiA9IDY7CisJeGZlci50eF9idWYgPSAmY29uZmlnLT5kbHRhZnJlWzBdOworCisJc3BpX21lc3NhZ2VfaW5pdCgmbXNnKTsKKwlzcGlfbWVzc2FnZV9hZGRfdGFpbCgmeGZlciwgJm1zZyk7CisJcmV0ID0gc3BpX3N5bmMoc3QtPnNkZXYsICZtc2cpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfcmV0OworCisJeGZlci5sZW4gPSA1OworCXhmZXIudHhfYnVmID0gJmNvbmZpZy0+dXBkdGNsa1swXTsKKworCXNwaV9tZXNzYWdlX2luaXQoJm1zZyk7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnhmZXIsICZtc2cpOworCXJldCA9IHNwaV9zeW5jKHN0LT5zZGV2LCAmbXNnKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3JldDsKKworCXhmZXIubGVuID0gNDsKKwl4ZmVyLnR4X2J1ZiA9ICZjb25maWctPnJhbXByYXRbMF07CisKKwlzcGlfbWVzc2FnZV9pbml0KCZtc2cpOworCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZ4ZmVyLCAmbXNnKTsKKwlyZXQgPSBzcGlfc3luYyhzdC0+c2RldiwgJm1zZyk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9yZXQ7CisKKwl4ZmVyLmxlbiA9IDU7CisJeGZlci50eF9idWYgPSAmY29uZmlnLT5jb250cm9sWzBdOworCisJc3BpX21lc3NhZ2VfaW5pdCgmbXNnKTsKKwlzcGlfbWVzc2FnZV9hZGRfdGFpbCgmeGZlciwgJm1zZyk7CisJcmV0ID0gc3BpX3N5bmMoc3QtPnNkZXYsICZtc2cpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfcmV0OworCisJeGZlci5sZW4gPSAzOworCXhmZXIudHhfYnVmID0gJmNvbmZpZy0+b3V0cHNrbVswXTsKKworCXNwaV9tZXNzYWdlX2luaXQoJm1zZyk7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnhmZXIsICZtc2cpOworCXJldCA9IHNwaV9zeW5jKHN0LT5zZGV2LCAmbXNnKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3JldDsKKworCXhmZXIubGVuID0gMjsKKwl4ZmVyLnR4X2J1ZiA9ICZjb25maWctPm91dHBza3JbMF07CisKKwlzcGlfbWVzc2FnZV9pbml0KCZtc2cpOworCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZ4ZmVyLCAmbXNnKTsKKwlyZXQgPSBzcGlfc3luYyhzdC0+c2RldiwgJm1zZyk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9yZXQ7CisKKwl4ZmVyLmxlbiA9IDM7CisJeGZlci50eF9idWYgPSAmY29uZmlnLT5kYWNjbnRsWzBdOworCisJc3BpX21lc3NhZ2VfaW5pdCgmbXNnKTsKKwlzcGlfbWVzc2FnZV9hZGRfdGFpbCgmeGZlciwgJm1zZyk7CisJcmV0ID0gc3BpX3N5bmMoc3QtPnNkZXYsICZtc2cpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfcmV0OworZXJyb3JfcmV0OgorCW11dGV4X3VubG9jaygmc3QtPmxvY2spOworCisJcmV0dXJuIHJldCA/IHJldCA6IGxlbjsKK30KKworc3RhdGljIElJT19ERVZJQ0VfQVRUUihkZHMsIFNfSVdVU1IsIE5VTEwsIGFkOTg1Ml9zZXRfcGFyYW1ldGVyLCAwKTsKKworc3RhdGljIHZvaWQgYWQ5ODUyX2luaXQoc3RydWN0IGFkOTg1Ml9zdGF0ZSAqc3QpCit7CisJc3RydWN0IHNwaV9tZXNzYWdlIG1zZzsKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyIHhmZXI7CisJaW50IHJldDsKKwl1OCBjb25maWdbNV07CisKKwljb25maWdbMF0gPSBhZGRyX2NvbnRybDsKKwljb25maWdbMV0gPSBDT01QUEQ7CisJY29uZmlnWzJdID0gUkVGTVVMVDIgfCBCWVBQTEwgfCBQTExSQU5HOworCWNvbmZpZ1szXSA9IElFVVBDTEs7CisJY29uZmlnWzRdID0gT1NLRU47CisKKwltdXRleF9sb2NrKCZzdC0+bG9jayk7CisKKwl4ZmVyLmxlbiA9IDU7CisJeGZlci50eF9idWYgPSAmY29uZmlnOworCisJc3BpX21lc3NhZ2VfaW5pdCgmbXNnKTsKKwlzcGlfbWVzc2FnZV9hZGRfdGFpbCgmeGZlciwgJm1zZyk7CisJcmV0ID0gc3BpX3N5bmMoc3QtPnNkZXYsICZtc2cpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfcmV0OworCitlcnJvcl9yZXQ6CisJbXV0ZXhfdW5sb2NrKCZzdC0+bG9jayk7CisKKworCit9CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICphZDk4NTJfYXR0cmlidXRlc1tdID0geworCSZpaW9fZGV2X2F0dHJfZGRzLmRldl9hdHRyLmF0dHIsCisJTlVMTCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGFkOTg1Ml9hdHRyaWJ1dGVfZ3JvdXAgPSB7CisJLm5hbWUgPSBEUlZfTkFNRSwKKwkuYXR0cnMgPSBhZDk4NTJfYXR0cmlidXRlcywKK307CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGFkOTg1Ml9wcm9iZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCXN0cnVjdCBhZDk4NTJfc3RhdGUgKnN0OworCWludCByZXQgPSAwOworCisJc3QgPSBremFsbG9jKHNpemVvZigqc3QpLCBHRlBfS0VSTkVMKTsKKwlpZiAoc3QgPT0gTlVMTCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycm9yX3JldDsKKwl9CisJc3BpX3NldF9kcnZkYXRhKHNwaSwgc3QpOworCisJbXV0ZXhfaW5pdCgmc3QtPmxvY2spOworCXN0LT5zZGV2ID0gc3BpOworCisJc3QtPmlkZXYgPSBpaW9fYWxsb2NhdGVfZGV2aWNlKCk7CisJaWYgKHN0LT5pZGV2ID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJvcl9mcmVlX3N0OworCX0KKwlzdC0+aWRldi0+ZGV2LnBhcmVudCA9ICZzcGktPmRldjsKKwlzdC0+aWRldi0+bnVtX2ludGVycnVwdF9saW5lcyA9IDA7CisJc3QtPmlkZXYtPmV2ZW50X2F0dHJzID0gTlVMTDsKKworCXN0LT5pZGV2LT5hdHRycyA9ICZhZDk4NTJfYXR0cmlidXRlX2dyb3VwOworCXN0LT5pZGV2LT5kZXZfZGF0YSA9ICh2b2lkICopKHN0KTsKKwlzdC0+aWRldi0+ZHJpdmVyX21vZHVsZSA9IFRISVNfTU9EVUxFOworCXN0LT5pZGV2LT5tb2RlcyA9IElORElPX0RJUkVDVF9NT0RFOworCisJcmV0ID0gaWlvX2RldmljZV9yZWdpc3RlcihzdC0+aWRldik7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9mcmVlX2RldjsKKwlzcGktPm1heF9zcGVlZF9oeiA9IDIwMDAwMDA7CisJc3BpLT5tb2RlID0gU1BJX01PREVfMzsKKwlzcGktPmJpdHNfcGVyX3dvcmQgPSA4OworCXNwaV9zZXR1cChzcGkpOworCWFkOTg1Ml9pbml0KHN0KTsKKwlyZXR1cm4gMDsKKworZXJyb3JfZnJlZV9kZXY6CisJaWlvX2ZyZWVfZGV2aWNlKHN0LT5pZGV2KTsKK2Vycm9yX2ZyZWVfc3Q6CisJa2ZyZWUoc3QpOworZXJyb3JfcmV0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IGFkOTg1Ml9yZW1vdmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlzdHJ1Y3QgYWQ5ODUyX3N0YXRlICpzdCA9IHNwaV9nZXRfZHJ2ZGF0YShzcGkpOworCisJaWlvX2RldmljZV91bnJlZ2lzdGVyKHN0LT5pZGV2KTsKKwlrZnJlZShzdCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzcGlfZHJpdmVyIGFkOTg1Ml9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSBEUlZfTkFNRSwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJfSwKKwkucHJvYmUgPSBhZDk4NTJfcHJvYmUsCisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKGFkOTg1Ml9yZW1vdmUpLAorfTsKKworc3RhdGljIF9faW5pdCBpbnQgYWQ5ODUyX3NwaV9pbml0KHZvaWQpCit7CisJcmV0dXJuIHNwaV9yZWdpc3Rlcl9kcml2ZXIoJmFkOTg1Ml9kcml2ZXIpOworfQorbW9kdWxlX2luaXQoYWQ5ODUyX3NwaV9pbml0KTsKKworc3RhdGljIF9fZXhpdCB2b2lkIGFkOTg1Ml9zcGlfZXhpdCh2b2lkKQoreworCXNwaV91bnJlZ2lzdGVyX2RyaXZlcigmYWQ5ODUyX2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdChhZDk4NTJfc3BpX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJDbGlmZiBDYWkiKTsKK01PRFVMRV9ERVNDUklQVElPTigiQW5hbG9nIERldmljZXMgYWQ5ODUyIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9kZHMvYWQ5OTEwLmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2Rkcy9hZDk5MTAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOGZiNzVjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9kZHMvYWQ5OTEwLmMKQEAgLTAsMCArMSw0NDAgQEAKKy8qCisgKiBEcml2ZXIgZm9yIEFESSBEaXJlY3QgRGlnaXRhbCBTeW50aGVzaXMgYWQ5OTEwCisgKgorICogQ29weXJpZ2h0IChjKSAyMDEwIEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqLworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+CisKKyNpbmNsdWRlICIuLi9paW8uaCIKKyNpbmNsdWRlICIuLi9zeXNmcy5oIgorCisjZGVmaW5lIERSVl9OQU1FICJhZDk5MTAiCisKKyNkZWZpbmUgQ0ZSMSAweDAKKyNkZWZpbmUgQ0ZSMiAweDEKKyNkZWZpbmUgQ0ZSMyAweDIKKworI2RlZmluZSBBVVhEQUMgMHgzCisjZGVmaW5lIElPVVBEIDB4NAorI2RlZmluZSBGVFcgMHg3CisjZGVmaW5lIFBPVyAweDgKKyNkZWZpbmUgQVNGIDB4OQorI2RlZmluZSBNVUxUQyAweDBBCisjZGVmaW5lIERJR19SQU1QTCAweDBCCisjZGVmaW5lIERJR19SQU1QUyAweDBDCisjZGVmaW5lIERJR19SQU1QUiAweDBECisjZGVmaW5lIFNJTl9UT05FUDAgMHgwRQorI2RlZmluZSBTSU5fVE9ORVAxIDB4MEYKKyNkZWZpbmUgU0lOX1RPTkVQMiAweDEwCisjZGVmaW5lIFNJTl9UT05FUDMgMHgxMQorI2RlZmluZSBTSU5fVE9ORVA0IDB4MTIKKyNkZWZpbmUgU0lOX1RPTkVQNSAweDEzCisjZGVmaW5lIFNJTl9UT05FUDYgMHgxNAorI2RlZmluZSBTSU5fVE9ORVA3IDB4MTUKKworI2RlZmluZSBSQU1fRU5BQkxFCSgxIDw8IDcpCisKKyNkZWZpbmUgTUFOVUFMX09TSwkoMSA8PCA3KQorI2RlZmluZSBJTlZTSUMJCSgxIDw8IDYpCisjZGVmaW5lIEREU19TSU5FT1AJKDEpCisKKyNkZWZpbmUgQVVUT19PU0sJKDEpCisjZGVmaW5lIE9TS0VOCQkoMSA8PCAxKQorI2RlZmluZSBMT0FEX0FSUgkoMSA8PCAyKQorI2RlZmluZSBDTFJfUEhBCQkoMSA8PCAzKQorI2RlZmluZSBDTFJfRElHCQkoMSA8PCA0KQorI2RlZmluZSBBQ0xSX1BIQQkoMSA8PCA1KQorI2RlZmluZSBBQ0xSX0RJRwkoMSA8PCA2KQorI2RlZmluZSBMT0FEX0xSUgkoMSA8PCA3KQorCisjZGVmaW5lIExTQl9GU1QJCSgxKQorI2RlZmluZSBTRElPX0lQVAkoMSA8PCAxKQorI2RlZmluZSBFWFRfUFdECQkoMSA8PCAzKQorI2RlZmluZSBBREFDX1BXRAkoMSA8PCA0KQorI2RlZmluZSBSRUZDTEtfUFdECSgxIDw8IDUpCisjZGVmaW5lIERBQ19QV0QJCSgxIDw8IDYpCisjZGVmaW5lIERJR19QV0QJCSgxIDw8IDcpCisKKyNkZWZpbmUgRU5BX0FNUAkJKDEpCisjZGVmaW5lIFJFQURfRlRXCSgxKQorI2RlZmluZSBESUdSX0xPVwkoMSA8PCAxKQorI2RlZmluZSBESUdSX0hJR0gJKDEgPDwgMikKKyNkZWZpbmUgRElHUl9FTkEJKDEgPDwgMykKKyNkZWZpbmUgU1lOQ0NMS19FTkEJKDEgPDwgNikKKyNkZWZpbmUgSVRFUl9JT1VQRAkoMSA8PCA3KQorCisjZGVmaW5lIFRYX0VOQQkJKDEgPDwgMSkKKyNkZWZpbmUgUERDTEtfSU5WCSgxIDw8IDIpCisjZGVmaW5lIFBEQ0xLX0VOQgkoMSA8PCAzKQorCisjZGVmaW5lIFBBUkFfRU5BCSgxIDw8IDQpCisjZGVmaW5lIFNZTkNfRElTCSgxIDw8IDUpCisjZGVmaW5lIERBVEFfQVNTCSgxIDw8IDYpCisjZGVmaW5lIE1BVENIX0VOQQkoMSA8PCA3KQorCisjZGVmaW5lIFBMTF9FTkEJCSgxKQorI2RlZmluZSBQRkRfUlNUCQkoMSA8PCAyKQorI2RlZmluZSBSRUZDTEtfUlNUCSgxIDw8IDYpCisjZGVmaW5lIFJFRkNMS19CWVAJKDEgPDwgNykKKworLyogUmVnaXN0ZXIgZm9ybWF0OiAxIGJ5dGUgYWRkciArIHZhbHVlICovCitzdHJ1Y3QgYWQ5OTEwX2NvbmZpZyB7CisJdTggYXV4ZGFjWzVdOworCXU4IGlvdXBkWzVdOworCXU4IGZ0d1s1XTsKKwl1OCBwb3dbM107CisJdTggYXNmWzVdOworCXU4IG11bHRjWzVdOworCXU4IGRpZ19yYW1wbFs5XTsKKwl1OCBkaWdfcmFtcHNbOV07CisJdTggZGlnX3JhbXByWzVdOworCXU4IHNpbl90b25lcDBbOV07CisJdTggc2luX3RvbmVwMVs5XTsKKwl1OCBzaW5fdG9uZXAyWzldOworCXU4IHNpbl90b25lcDNbOV07CisJdTggc2luX3RvbmVwNFs5XTsKKwl1OCBzaW5fdG9uZXA1WzldOworCXU4IHNpbl90b25lcDZbOV07CisJdTggc2luX3RvbmVwN1s5XTsKK307CisKK3N0cnVjdCBhZDk5MTBfc3RhdGUgeworCXN0cnVjdCBtdXRleCBsb2NrOworCXN0cnVjdCBpaW9fZGV2ICppZGV2OworCXN0cnVjdCBzcGlfZGV2aWNlICpzZGV2OworfTsKKworc3RhdGljIHNzaXplX3QgYWQ5OTEwX3NldF9wYXJhbWV0ZXIoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkJY29uc3QgY2hhciAqYnVmLAorCQkJCQlzaXplX3QgbGVuKQoreworCXN0cnVjdCBzcGlfbWVzc2FnZSBtc2c7CisJc3RydWN0IHNwaV90cmFuc2ZlciB4ZmVyOworCWludCByZXQ7CisJc3RydWN0IGFkOTkxMF9jb25maWcgKmNvbmZpZyA9IChzdHJ1Y3QgYWQ5OTEwX2NvbmZpZyAqKWJ1ZjsKKwlzdHJ1Y3QgaWlvX2RldiAqaWRldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDk5MTBfc3RhdGUgKnN0ID0gaWRldi0+ZGV2X2RhdGE7CisKKwl4ZmVyLmxlbiA9IDU7CisJeGZlci50eF9idWYgPSAmY29uZmlnLT5hdXhkYWNbMF07CisJbXV0ZXhfbG9jaygmc3QtPmxvY2spOworCisJc3BpX21lc3NhZ2VfaW5pdCgmbXNnKTsKKwlzcGlfbWVzc2FnZV9hZGRfdGFpbCgmeGZlciwgJm1zZyk7CisJcmV0ID0gc3BpX3N5bmMoc3QtPnNkZXYsICZtc2cpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfcmV0OworCisJeGZlci5sZW4gPSA1OworCXhmZXIudHhfYnVmID0gJmNvbmZpZy0+aW91cGRbMF07CisKKwlzcGlfbWVzc2FnZV9pbml0KCZtc2cpOworCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZ4ZmVyLCAmbXNnKTsKKwlyZXQgPSBzcGlfc3luYyhzdC0+c2RldiwgJm1zZyk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9yZXQ7CisKKwl4ZmVyLmxlbiA9IDU7CisJeGZlci50eF9idWYgPSAmY29uZmlnLT5mdHdbMF07CisKKwlzcGlfbWVzc2FnZV9pbml0KCZtc2cpOworCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZ4ZmVyLCAmbXNnKTsKKwlyZXQgPSBzcGlfc3luYyhzdC0+c2RldiwgJm1zZyk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9yZXQ7CisKKwl4ZmVyLmxlbiA9IDM7CisJeGZlci50eF9idWYgPSAmY29uZmlnLT5wb3dbMF07CisKKwlzcGlfbWVzc2FnZV9pbml0KCZtc2cpOworCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZ4ZmVyLCAmbXNnKTsKKwlyZXQgPSBzcGlfc3luYyhzdC0+c2RldiwgJm1zZyk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9yZXQ7CisKKwl4ZmVyLmxlbiA9IDU7CisJeGZlci50eF9idWYgPSAmY29uZmlnLT5hc2ZbMF07CisKKwlzcGlfbWVzc2FnZV9pbml0KCZtc2cpOworCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZ4ZmVyLCAmbXNnKTsKKwlyZXQgPSBzcGlfc3luYyhzdC0+c2RldiwgJm1zZyk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9yZXQ7CisKKwl4ZmVyLmxlbiA9IDU7CisJeGZlci50eF9idWYgPSAmY29uZmlnLT5tdWx0Y1swXTsKKworCXNwaV9tZXNzYWdlX2luaXQoJm1zZyk7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnhmZXIsICZtc2cpOworCXJldCA9IHNwaV9zeW5jKHN0LT5zZGV2LCAmbXNnKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3JldDsKKworCXhmZXIubGVuID0gOTsKKwl4ZmVyLnR4X2J1ZiA9ICZjb25maWctPmRpZ19yYW1wbFswXTsKKworCXNwaV9tZXNzYWdlX2luaXQoJm1zZyk7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnhmZXIsICZtc2cpOworCXJldCA9IHNwaV9zeW5jKHN0LT5zZGV2LCAmbXNnKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3JldDsKKworCXhmZXIubGVuID0gOTsKKwl4ZmVyLnR4X2J1ZiA9ICZjb25maWctPmRpZ19yYW1wc1swXTsKKworCXNwaV9tZXNzYWdlX2luaXQoJm1zZyk7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnhmZXIsICZtc2cpOworCXJldCA9IHNwaV9zeW5jKHN0LT5zZGV2LCAmbXNnKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3JldDsKKworCXhmZXIubGVuID0gNTsKKwl4ZmVyLnR4X2J1ZiA9ICZjb25maWctPmRpZ19yYW1wclswXTsKKworCXNwaV9tZXNzYWdlX2luaXQoJm1zZyk7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnhmZXIsICZtc2cpOworCXJldCA9IHNwaV9zeW5jKHN0LT5zZGV2LCAmbXNnKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3JldDsKKworCXhmZXIubGVuID0gOTsKKwl4ZmVyLnR4X2J1ZiA9ICZjb25maWctPnNpbl90b25lcDBbMF07CisKKwlzcGlfbWVzc2FnZV9pbml0KCZtc2cpOworCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZ4ZmVyLCAmbXNnKTsKKwlyZXQgPSBzcGlfc3luYyhzdC0+c2RldiwgJm1zZyk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9yZXQ7CisKKwl4ZmVyLmxlbiA9IDk7CisJeGZlci50eF9idWYgPSAmY29uZmlnLT5zaW5fdG9uZXAxWzBdOworCisJc3BpX21lc3NhZ2VfaW5pdCgmbXNnKTsKKwlzcGlfbWVzc2FnZV9hZGRfdGFpbCgmeGZlciwgJm1zZyk7CisJcmV0ID0gc3BpX3N5bmMoc3QtPnNkZXYsICZtc2cpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfcmV0OworCisJeGZlci5sZW4gPSA5OworCXhmZXIudHhfYnVmID0gJmNvbmZpZy0+c2luX3RvbmVwMlswXTsKKworCXNwaV9tZXNzYWdlX2luaXQoJm1zZyk7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnhmZXIsICZtc2cpOworCXJldCA9IHNwaV9zeW5jKHN0LT5zZGV2LCAmbXNnKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3JldDsKKwl4ZmVyLmxlbiA9IDk7CisJeGZlci50eF9idWYgPSAmY29uZmlnLT5zaW5fdG9uZXAzWzBdOworCisJc3BpX21lc3NhZ2VfaW5pdCgmbXNnKTsKKwlzcGlfbWVzc2FnZV9hZGRfdGFpbCgmeGZlciwgJm1zZyk7CisJcmV0ID0gc3BpX3N5bmMoc3QtPnNkZXYsICZtc2cpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfcmV0OworCisJeGZlci5sZW4gPSA5OworCXhmZXIudHhfYnVmID0gJmNvbmZpZy0+c2luX3RvbmVwNFswXTsKKworCXNwaV9tZXNzYWdlX2luaXQoJm1zZyk7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnhmZXIsICZtc2cpOworCXJldCA9IHNwaV9zeW5jKHN0LT5zZGV2LCAmbXNnKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3JldDsKKworCXhmZXIubGVuID0gOTsKKwl4ZmVyLnR4X2J1ZiA9ICZjb25maWctPnNpbl90b25lcDVbMF07CisKKwlzcGlfbWVzc2FnZV9pbml0KCZtc2cpOworCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZ4ZmVyLCAmbXNnKTsKKwlyZXQgPSBzcGlfc3luYyhzdC0+c2RldiwgJm1zZyk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9yZXQ7CisKKwl4ZmVyLmxlbiA9IDk7CisJeGZlci50eF9idWYgPSAmY29uZmlnLT5zaW5fdG9uZXA2WzBdOworCisJc3BpX21lc3NhZ2VfaW5pdCgmbXNnKTsKKwlzcGlfbWVzc2FnZV9hZGRfdGFpbCgmeGZlciwgJm1zZyk7CisJcmV0ID0gc3BpX3N5bmMoc3QtPnNkZXYsICZtc2cpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfcmV0OworCisJeGZlci5sZW4gPSA5OworCXhmZXIudHhfYnVmID0gJmNvbmZpZy0+c2luX3RvbmVwN1swXTsKKworCXNwaV9tZXNzYWdlX2luaXQoJm1zZyk7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnhmZXIsICZtc2cpOworCXJldCA9IHNwaV9zeW5jKHN0LT5zZGV2LCAmbXNnKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3JldDsKK2Vycm9yX3JldDoKKwltdXRleF91bmxvY2soJnN0LT5sb2NrKTsKKworCXJldHVybiByZXQgPyByZXQgOiBsZW47Cit9CisKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIoZGRzLCBTX0lXVVNSLCBOVUxMLCBhZDk5MTBfc2V0X3BhcmFtZXRlciwgMCk7CisKK3N0YXRpYyB2b2lkIGFkOTkxMF9pbml0KHN0cnVjdCBhZDk5MTBfc3RhdGUgKnN0KQoreworCXN0cnVjdCBzcGlfbWVzc2FnZSBtc2c7CisJc3RydWN0IHNwaV90cmFuc2ZlciB4ZmVyOworCWludCByZXQ7CisJdTggY2ZyWzVdOworCisJY2ZyWzBdID0gQ0ZSMTsKKwljZnJbMV0gPSAwOworCWNmclsyXSA9IE1BTlVBTF9PU0sgfCBJTlZTSUMgfCBERFNfU0lORU9QOworCWNmclszXSA9IEFVVE9fT1NLIHwgT1NLRU4gfCBBQ0xSX1BIQSB8IEFDTFJfRElHIHwgTE9BRF9MUlI7CisJY2ZyWzRdID0gMDsKKworCW11dGV4X2xvY2soJnN0LT5sb2NrKTsKKworCXhmZXIubGVuID0gNTsKKwl4ZmVyLnR4X2J1ZiA9ICZjZnI7CisKKwlzcGlfbWVzc2FnZV9pbml0KCZtc2cpOworCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZ4ZmVyLCAmbXNnKTsKKwlyZXQgPSBzcGlfc3luYyhzdC0+c2RldiwgJm1zZyk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9yZXQ7CisKKwljZnJbMF0gPSBDRlIyOworCWNmclsxXSA9IEVOQV9BTVA7CisJY2ZyWzJdID0gUkVBRF9GVFcgfCBESUdSX0VOQSB8IElURVJfSU9VUEQ7CisJY2ZyWzNdID0gVFhfRU5BIHwgUERDTEtfSU5WIHwgUERDTEtfRU5COworCWNmcls0XSA9IFBBUkFfRU5BOworCisJeGZlci5sZW4gPSA1OworCXhmZXIudHhfYnVmID0gJmNmcjsKKworCXNwaV9tZXNzYWdlX2luaXQoJm1zZyk7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnhmZXIsICZtc2cpOworCXJldCA9IHNwaV9zeW5jKHN0LT5zZGV2LCAmbXNnKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3JldDsKKworCWNmclswXSA9IENGUjM7CisJY2ZyWzFdID0gUExMX0VOQTsKKwljZnJbMl0gPSAwOworCWNmclszXSA9IFJFRkNMS19SU1QgfCBSRUZDTEtfQllQOworCWNmcls0XSA9IDA7CisKKwl4ZmVyLmxlbiA9IDU7CisJeGZlci50eF9idWYgPSAmY2ZyOworCisJc3BpX21lc3NhZ2VfaW5pdCgmbXNnKTsKKwlzcGlfbWVzc2FnZV9hZGRfdGFpbCgmeGZlciwgJm1zZyk7CisJcmV0ID0gc3BpX3N5bmMoc3QtPnNkZXYsICZtc2cpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfcmV0OworCitlcnJvcl9yZXQ6CisJbXV0ZXhfdW5sb2NrKCZzdC0+bG9jayk7CisKKworCit9CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICphZDk5MTBfYXR0cmlidXRlc1tdID0geworCSZpaW9fZGV2X2F0dHJfZGRzLmRldl9hdHRyLmF0dHIsCisJTlVMTCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGFkOTkxMF9hdHRyaWJ1dGVfZ3JvdXAgPSB7CisJLm5hbWUgPSBEUlZfTkFNRSwKKwkuYXR0cnMgPSBhZDk5MTBfYXR0cmlidXRlcywKK307CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGFkOTkxMF9wcm9iZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCXN0cnVjdCBhZDk5MTBfc3RhdGUgKnN0OworCWludCByZXQgPSAwOworCisJc3QgPSBremFsbG9jKHNpemVvZigqc3QpLCBHRlBfS0VSTkVMKTsKKwlpZiAoc3QgPT0gTlVMTCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycm9yX3JldDsKKwl9CisJc3BpX3NldF9kcnZkYXRhKHNwaSwgc3QpOworCisJbXV0ZXhfaW5pdCgmc3QtPmxvY2spOworCXN0LT5zZGV2ID0gc3BpOworCisJc3QtPmlkZXYgPSBpaW9fYWxsb2NhdGVfZGV2aWNlKCk7CisJaWYgKHN0LT5pZGV2ID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJvcl9mcmVlX3N0OworCX0KKwlzdC0+aWRldi0+ZGV2LnBhcmVudCA9ICZzcGktPmRldjsKKwlzdC0+aWRldi0+bnVtX2ludGVycnVwdF9saW5lcyA9IDA7CisJc3QtPmlkZXYtPmV2ZW50X2F0dHJzID0gTlVMTDsKKworCXN0LT5pZGV2LT5hdHRycyA9ICZhZDk5MTBfYXR0cmlidXRlX2dyb3VwOworCXN0LT5pZGV2LT5kZXZfZGF0YSA9ICh2b2lkICopKHN0KTsKKwlzdC0+aWRldi0+ZHJpdmVyX21vZHVsZSA9IFRISVNfTU9EVUxFOworCXN0LT5pZGV2LT5tb2RlcyA9IElORElPX0RJUkVDVF9NT0RFOworCisJcmV0ID0gaWlvX2RldmljZV9yZWdpc3RlcihzdC0+aWRldik7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9mcmVlX2RldjsKKwlzcGktPm1heF9zcGVlZF9oeiA9IDIwMDAwMDA7CisJc3BpLT5tb2RlID0gU1BJX01PREVfMzsKKwlzcGktPmJpdHNfcGVyX3dvcmQgPSA4OworCXNwaV9zZXR1cChzcGkpOworCWFkOTkxMF9pbml0KHN0KTsKKwlyZXR1cm4gMDsKKworZXJyb3JfZnJlZV9kZXY6CisJaWlvX2ZyZWVfZGV2aWNlKHN0LT5pZGV2KTsKK2Vycm9yX2ZyZWVfc3Q6CisJa2ZyZWUoc3QpOworZXJyb3JfcmV0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IGFkOTkxMF9yZW1vdmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlzdHJ1Y3QgYWQ5OTEwX3N0YXRlICpzdCA9IHNwaV9nZXRfZHJ2ZGF0YShzcGkpOworCisJaWlvX2RldmljZV91bnJlZ2lzdGVyKHN0LT5pZGV2KTsKKwlrZnJlZShzdCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzcGlfZHJpdmVyIGFkOTkxMF9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSBEUlZfTkFNRSwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJfSwKKwkucHJvYmUgPSBhZDk5MTBfcHJvYmUsCisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKGFkOTkxMF9yZW1vdmUpLAorfTsKKworc3RhdGljIF9faW5pdCBpbnQgYWQ5OTEwX3NwaV9pbml0KHZvaWQpCit7CisJcmV0dXJuIHNwaV9yZWdpc3Rlcl9kcml2ZXIoJmFkOTkxMF9kcml2ZXIpOworfQorbW9kdWxlX2luaXQoYWQ5OTEwX3NwaV9pbml0KTsKKworc3RhdGljIF9fZXhpdCB2b2lkIGFkOTkxMF9zcGlfZXhpdCh2b2lkKQoreworCXNwaV91bnJlZ2lzdGVyX2RyaXZlcigmYWQ5OTEwX2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdChhZDk5MTBfc3BpX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJDbGlmZiBDYWkiKTsKK01PRFVMRV9ERVNDUklQVElPTigiQW5hbG9nIERldmljZXMgYWQ5OTEwIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9kZHMvYWQ5OTUxLmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2Rkcy9hZDk5NTEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41N2VkZGY2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9kZHMvYWQ5OTUxLmMKQEAgLTAsMCArMSwyNDkgQEAKKy8qCisgKiBEcml2ZXIgZm9yIEFESSBEaXJlY3QgRGlnaXRhbCBTeW50aGVzaXMgYWQ5OTUxCisgKgorICogQ29weXJpZ2h0IChjKSAyMDEwIEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqLworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+CisKKyNpbmNsdWRlICIuLi9paW8uaCIKKyNpbmNsdWRlICIuLi9zeXNmcy5oIgorCisjZGVmaW5lIERSVl9OQU1FICJhZDk5NTEiCisKKyNkZWZpbmUgQ0ZSMSAweDAKKyNkZWZpbmUgQ0ZSMiAweDEKKworI2RlZmluZSBBVVRPX09TSwkoMSkKKyNkZWZpbmUgT1NLRU4JCSgxIDw8IDEpCisjZGVmaW5lIExPQURfQVJSCSgxIDw8IDIpCisKKyNkZWZpbmUgQVVUT19TWU5DCSgxIDw8IDcpCisKKyNkZWZpbmUgTFNCX0ZTVAkJKDEpCisjZGVmaW5lIFNESU9fSVBUCSgxIDw8IDEpCisjZGVmaW5lIENMUl9QSEEJCSgxIDw8IDIpCisjZGVmaW5lIFNJTkVfT1BUCSgxIDw8IDQpCisjZGVmaW5lIEFDTFJfUEhBCSgxIDw8IDUpCisKKyNkZWZpbmUgVkNPX1JBTkdFCSgxIDw8IDIpCisKKyNkZWZpbmUgQ1JTX09QVAkJKDEgPDwgMSkKKyNkZWZpbmUgSE1BTlVfU1lOQwkoMSA8PCAyKQorI2RlZmluZSBIU1BEX1NZTkMJKDEgPDwgMykKKworLyogUmVnaXN0ZXIgZm9ybWF0OiAxIGJ5dGUgYWRkciArIHZhbHVlICovCitzdHJ1Y3QgYWQ5OTUxX2NvbmZpZyB7CisJdTggYXNmWzNdOworCXU4IGFyclsyXTsKKwl1OCBmdHcwWzVdOworCXU4IGZ0dzFbM107Cit9OworCitzdHJ1Y3QgYWQ5OTUxX3N0YXRlIHsKKwlzdHJ1Y3QgbXV0ZXggbG9jazsKKwlzdHJ1Y3QgaWlvX2RldiAqaWRldjsKKwlzdHJ1Y3Qgc3BpX2RldmljZSAqc2RldjsKK307CisKK3N0YXRpYyBzc2l6ZV90IGFkOTk1MV9zZXRfcGFyYW1ldGVyKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJCQkJc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3Qgc3BpX21lc3NhZ2UgbXNnOworCXN0cnVjdCBzcGlfdHJhbnNmZXIgeGZlcjsKKwlpbnQgcmV0OworCXN0cnVjdCBhZDk5NTFfY29uZmlnICpjb25maWcgPSAoc3RydWN0IGFkOTk1MV9jb25maWcgKilidWY7CisJc3RydWN0IGlpb19kZXYgKmlkZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ5OTUxX3N0YXRlICpzdCA9IGlkZXYtPmRldl9kYXRhOworCisJeGZlci5sZW4gPSAzOworCXhmZXIudHhfYnVmID0gJmNvbmZpZy0+YXNmWzBdOworCW11dGV4X2xvY2soJnN0LT5sb2NrKTsKKworCXNwaV9tZXNzYWdlX2luaXQoJm1zZyk7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnhmZXIsICZtc2cpOworCXJldCA9IHNwaV9zeW5jKHN0LT5zZGV2LCAmbXNnKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3JldDsKKworCXhmZXIubGVuID0gMjsKKwl4ZmVyLnR4X2J1ZiA9ICZjb25maWctPmFyclswXTsKKworCXNwaV9tZXNzYWdlX2luaXQoJm1zZyk7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnhmZXIsICZtc2cpOworCXJldCA9IHNwaV9zeW5jKHN0LT5zZGV2LCAmbXNnKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3JldDsKKworCXhmZXIubGVuID0gNTsKKwl4ZmVyLnR4X2J1ZiA9ICZjb25maWctPmZ0dzBbMF07CisKKwlzcGlfbWVzc2FnZV9pbml0KCZtc2cpOworCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZ4ZmVyLCAmbXNnKTsKKwlyZXQgPSBzcGlfc3luYyhzdC0+c2RldiwgJm1zZyk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9yZXQ7CisKKwl4ZmVyLmxlbiA9IDM7CisJeGZlci50eF9idWYgPSAmY29uZmlnLT5mdHcxWzBdOworCisJc3BpX21lc3NhZ2VfaW5pdCgmbXNnKTsKKwlzcGlfbWVzc2FnZV9hZGRfdGFpbCgmeGZlciwgJm1zZyk7CisJcmV0ID0gc3BpX3N5bmMoc3QtPnNkZXYsICZtc2cpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfcmV0OworZXJyb3JfcmV0OgorCW11dGV4X3VubG9jaygmc3QtPmxvY2spOworCisJcmV0dXJuIHJldCA/IHJldCA6IGxlbjsKK30KKworc3RhdGljIElJT19ERVZJQ0VfQVRUUihkZHMsIFNfSVdVU1IsIE5VTEwsIGFkOTk1MV9zZXRfcGFyYW1ldGVyLCAwKTsKKworc3RhdGljIHZvaWQgYWQ5OTUxX2luaXQoc3RydWN0IGFkOTk1MV9zdGF0ZSAqc3QpCit7CisJc3RydWN0IHNwaV9tZXNzYWdlIG1zZzsKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyIHhmZXI7CisJaW50IHJldDsKKwl1OCBjZnJbNV07CisKKwljZnJbMF0gPSBDRlIxOworCWNmclsxXSA9IDA7CisJY2ZyWzJdID0gTFNCX0ZTVCB8IENMUl9QSEEgfCBTSU5FX09QVCB8IEFDTFJfUEhBOworCWNmclszXSA9IEFVVE9fT1NLIHwgT1NLRU4gfCBMT0FEX0FSUjsKKwljZnJbNF0gPSAwOworCisJbXV0ZXhfbG9jaygmc3QtPmxvY2spOworCisJeGZlci5sZW4gPSA1OworCXhmZXIudHhfYnVmID0gJmNmcjsKKworCXNwaV9tZXNzYWdlX2luaXQoJm1zZyk7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnhmZXIsICZtc2cpOworCXJldCA9IHNwaV9zeW5jKHN0LT5zZGV2LCAmbXNnKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3JldDsKKworCWNmclswXSA9IENGUjI7CisJY2ZyWzFdID0gVkNPX1JBTkdFOworCWNmclsyXSA9IEhTUERfU1lOQzsKKwljZnJbM10gPSAwOworCisJeGZlci5sZW4gPSA0OworCXhmZXIudHhfYnVmID0gJmNmcjsKKworCXNwaV9tZXNzYWdlX2luaXQoJm1zZyk7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnhmZXIsICZtc2cpOworCXJldCA9IHNwaV9zeW5jKHN0LT5zZGV2LCAmbXNnKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3JldDsKKworZXJyb3JfcmV0OgorCW11dGV4X3VubG9jaygmc3QtPmxvY2spOworCisKKworfQorCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqYWQ5OTUxX2F0dHJpYnV0ZXNbXSA9IHsKKwkmaWlvX2Rldl9hdHRyX2Rkcy5kZXZfYXR0ci5hdHRyLAorCU5VTEwsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBhZDk5NTFfYXR0cmlidXRlX2dyb3VwID0geworCS5uYW1lID0gRFJWX05BTUUsCisJLmF0dHJzID0gYWQ5OTUxX2F0dHJpYnV0ZXMsCit9OworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBhZDk5NTFfcHJvYmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlzdHJ1Y3QgYWQ5OTUxX3N0YXRlICpzdDsKKwlpbnQgcmV0ID0gMDsKKworCXN0ID0ga3phbGxvYyhzaXplb2YoKnN0KSwgR0ZQX0tFUk5FTCk7CisJaWYgKHN0ID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJvcl9yZXQ7CisJfQorCXNwaV9zZXRfZHJ2ZGF0YShzcGksIHN0KTsKKworCW11dGV4X2luaXQoJnN0LT5sb2NrKTsKKwlzdC0+c2RldiA9IHNwaTsKKworCXN0LT5pZGV2ID0gaWlvX2FsbG9jYXRlX2RldmljZSgpOworCWlmIChzdC0+aWRldiA9PSBOVUxMKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3JfZnJlZV9zdDsKKwl9CisJc3QtPmlkZXYtPmRldi5wYXJlbnQgPSAmc3BpLT5kZXY7CisJc3QtPmlkZXYtPm51bV9pbnRlcnJ1cHRfbGluZXMgPSAwOworCXN0LT5pZGV2LT5ldmVudF9hdHRycyA9IE5VTEw7CisKKwlzdC0+aWRldi0+YXR0cnMgPSAmYWQ5OTUxX2F0dHJpYnV0ZV9ncm91cDsKKwlzdC0+aWRldi0+ZGV2X2RhdGEgPSAodm9pZCAqKShzdCk7CisJc3QtPmlkZXYtPmRyaXZlcl9tb2R1bGUgPSBUSElTX01PRFVMRTsKKwlzdC0+aWRldi0+bW9kZXMgPSBJTkRJT19ESVJFQ1RfTU9ERTsKKworCXJldCA9IGlpb19kZXZpY2VfcmVnaXN0ZXIoc3QtPmlkZXYpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfZnJlZV9kZXY7CisJc3BpLT5tYXhfc3BlZWRfaHogPSAyMDAwMDAwOworCXNwaS0+bW9kZSA9IFNQSV9NT0RFXzM7CisJc3BpLT5iaXRzX3Blcl93b3JkID0gODsKKwlzcGlfc2V0dXAoc3BpKTsKKwlhZDk5NTFfaW5pdChzdCk7CisJcmV0dXJuIDA7CisKK2Vycm9yX2ZyZWVfZGV2OgorCWlpb19mcmVlX2RldmljZShzdC0+aWRldik7CitlcnJvcl9mcmVlX3N0OgorCWtmcmVlKHN0KTsKK2Vycm9yX3JldDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBhZDk5NTFfcmVtb3ZlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJc3RydWN0IGFkOTk1MV9zdGF0ZSAqc3QgPSBzcGlfZ2V0X2RydmRhdGEoc3BpKTsKKworCWlpb19kZXZpY2VfdW5yZWdpc3RlcihzdC0+aWRldik7CisJa2ZyZWUoc3QpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3BpX2RyaXZlciBhZDk5NTFfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gRFJWX05BTUUsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCX0sCisJLnByb2JlID0gYWQ5OTUxX3Byb2JlLAorCS5yZW1vdmUgPSBfX2RldmV4aXRfcChhZDk5NTFfcmVtb3ZlKSwKK307CisKK3N0YXRpYyBfX2luaXQgaW50IGFkOTk1MV9zcGlfaW5pdCh2b2lkKQoreworCXJldHVybiBzcGlfcmVnaXN0ZXJfZHJpdmVyKCZhZDk5NTFfZHJpdmVyKTsKK30KK21vZHVsZV9pbml0KGFkOTk1MV9zcGlfaW5pdCk7CisKK3N0YXRpYyBfX2V4aXQgdm9pZCBhZDk5NTFfc3BpX2V4aXQodm9pZCkKK3sKKwlzcGlfdW5yZWdpc3Rlcl9kcml2ZXIoJmFkOTk1MV9kcml2ZXIpOworfQorbW9kdWxlX2V4aXQoYWQ5OTUxX3NwaV9leGl0KTsKKworTU9EVUxFX0FVVEhPUigiQ2xpZmYgQ2FpIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkFuYWxvZyBEZXZpY2VzIGFkOTk1MSBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vZGRzL2Rkcy5oIGIvZHJpdmVycy9zdGFnaW5nL2lpby9kZHMvZGRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDhhYzNhOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vZGRzL2Rkcy5oCkBAIC0wLDAgKzEsMTEwIEBACisvKgorICogZGRzLmggLSBzeXNmcyBhdHRyaWJ1dGVzIGFzc29jaWF0ZWQgd2l0aCBERFMgZGV2aWNlcworICoKKyAqIENvcHlyaWdodCAoYykgMjAxMCBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgorICovCisKKy8qKgorICogL3N5cy9idXMvaWlvL2RldmljZXMvLi4uL2Rkc1hfZnJlcVkKKyAqLworCisjZGVmaW5lIElJT19ERVZfQVRUUl9GUkVRKF9jaGFubmVsLCBfbnVtLCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpCVwKKwlJSU9fREVWSUNFX0FUVFIoZGRzIyNfY2hhbm5lbCMjX2ZyZXEjI19udW0sCQkJXAorCQkJX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKQorCisvKioKKyAqIC9zeXMvYnVzL2lpby9kZXZpY2VzLy4uLi9kZHNYX2ZyZXFZX3NjYWxlCisgKi8KKworI2RlZmluZSBJSU9fQ09OU1RfQVRUUl9GUkVRX1NDQUxFKF9jaGFubmVsLCBfc3RyaW5nKQkJCVwKKwlJSU9fQ09OU1RfQVRUUihkZHMjI19jaGFubmVsIyNfZnJlcV9zY2FsZSwgX3N0cmluZykKKworLyoqCisgKiAvc3lzL2J1cy9paW8vZGV2aWNlcy8uLi4vZGRzWF9mcmVxc3ltYm9sCisgKi8KKworI2RlZmluZSBJSU9fREVWX0FUVFJfRlJFUVNZTUJPTChfY2hhbm5lbCwgX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKQlcCisJSUlPX0RFVklDRV9BVFRSKGRkcyMjX2NoYW5uZWwjI19mcmVxc3ltYm9sLAkJCVwKKwkJCV9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcik7CisKKy8qKgorICogL3N5cy9idXMvaWlvL2RldmljZXMvLi4uL2Rkc1hfcGhhc2VZCisgKi8KKworI2RlZmluZSBJSU9fREVWX0FUVFJfUEhBU0UoX2NoYW5uZWwsIF9udW0sIF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikJXAorCUlJT19ERVZJQ0VfQVRUUihkZHMjI19jaGFubmVsIyNfcGhhc2UjI19udW0sCQkJXAorCQkJX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKQorCisvKioKKyAqIC9zeXMvYnVzL2lpby9kZXZpY2VzLy4uLi9kZHNYX3BoYXNlWV9zY2FsZQorICovCisKKyNkZWZpbmUgSUlPX0NPTlNUX0FUVFJfUEhBU0VfU0NBTEUoX2NoYW5uZWwsIF9zdHJpbmcpCQkJXAorCUlJT19DT05TVF9BVFRSKGRkcyMjX2NoYW5uZWwjI19waGFzZV9zY2FsZSwgX3N0cmluZykKKworLyoqCisgKiAvc3lzL2J1cy9paW8vZGV2aWNlcy8uLi4vZGRzWF9waGFzZXN5bWJvbAorICovCisKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX1BIQVNFU1lNQk9MKF9jaGFubmVsLCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpCVwKKwlJSU9fREVWSUNFX0FUVFIoZGRzIyNfY2hhbm5lbCMjX3BoYXNlc3ltYm9sLAkJCVwKKwkJCV9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcik7CisKKy8qKgorICogL3N5cy9idXMvaWlvL2RldmljZXMvLi4uL2Rkc1hfcGluY29udHJvbF9lbgorICovCisKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX1BJTkNPTlRST0xfRU4oX2NoYW5uZWwsIF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcilcCisJSUlPX0RFVklDRV9BVFRSKGRkcyMjX2NoYW5uZWwjI19waW5jb250cm9sX2VuLAkJCVwKKwkJCV9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcik7CisKKy8qKgorICogL3N5cy9idXMvaWlvL2RldmljZXMvLi4uL2Rkc1hfcGluY29udHJvbF9mcmVxX2VuCisgKi8KKworI2RlZmluZSBJSU9fREVWX0FUVFJfUElOQ09OVFJPTF9GUkVRX0VOKF9jaGFubmVsLCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpXAorCUlJT19ERVZJQ0VfQVRUUihkZHMjI19jaGFubmVsIyNfcGluY29udHJvbF9mcmVxX2VuLAkJXAorCQkJX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKTsKKworLyoqCisgKiAvc3lzL2J1cy9paW8vZGV2aWNlcy8uLi4vZGRzWF9waW5jb250cm9sX3BoYXNlX2VuCisgKi8KKworI2RlZmluZSBJSU9fREVWX0FUVFJfUElOQ09OVFJPTF9QSEFTRV9FTihfY2hhbm5lbCwgX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKVwKKwlJSU9fREVWSUNFX0FUVFIoZGRzIyNfY2hhbm5lbCMjX3BpbmNvbnRyb2xfcGhhc2VfZW4sCQlcCisJCQlfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpOworCisvKioKKyAqIC9zeXMvYnVzL2lpby9kZXZpY2VzLy4uLi9kZHNYX291dF9lbmFibGUKKyAqLworCisjZGVmaW5lIElJT19ERVZfQVRUUl9PVVRfRU5BQkxFKF9jaGFubmVsLCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpCVwKKwlJSU9fREVWSUNFX0FUVFIoZGRzIyNfY2hhbm5lbCMjX291dF9lbmFibGUsCQkJXAorCQkJX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKTsKKworLyoqCisgKiAvc3lzL2J1cy9paW8vZGV2aWNlcy8uLi4vZGRzWF9vdXRZX2VuYWJsZQorICovCisKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX09VVFlfRU5BQkxFKF9jaGFubmVsLCBfb3V0cHV0LAkJCVwKKwkJCV9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikJCQlcCisJSUlPX0RFVklDRV9BVFRSKGRkcyMjX2NoYW5uZWwjI19vdXQjI19vdXRwdXQjI19lbmFibGUsCQlcCisJCQlfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpOworCisvKioKKyAqIC9zeXMvYnVzL2lpby9kZXZpY2VzLy4uLi9kZHNYX291dFlfd2F2ZXR5cGUKKyAqLworCisjZGVmaW5lIElJT19ERVZfQVRUUl9PVVRfV0FWRVRZUEUoX2NoYW5uZWwsIF9vdXRwdXQsIF9zdG9yZSwgX2FkZHIpCVwKKwlJSU9fREVWSUNFX0FUVFIoZGRzIyNfY2hhbm5lbCMjX291dCMjX291dHB1dCMjX3dhdmV0eXBlLAlcCisJCQlTX0lXVVNSLCBOVUxMLCBfc3RvcmUsIF9hZGRyKTsKKworLyoqCisgKiAvc3lzL2J1cy9paW8vZGV2aWNlcy8uLi4vZGRzWF9vdXRZX3dhdmV0eXBlX2F2YWlsYWJsZQorICovCisKKyNkZWZpbmUgSUlPX0NPTlNUX0FUVFJfT1VUX1dBVkVUWVBFU19BVkFJTEFCTEUoX2NoYW5uZWwsIF9vdXRwdXQsIF9tb2RlcylcCisJSUlPX0NPTlNUX0FUVFIoZGRzIyNfY2hhbm5lbCMjX291dCMjX291dHB1dCMjX3dhdmV0eXBlX2F2YWlsYWJsZSxcCisJCQlfbW9kZXMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9neXJvL0tjb25maWcgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2d5cm8vS2NvbmZpZwppbmRleCBjNDA0MzYxLi4yMzZmMTVmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2d5cm8vS2NvbmZpZworKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2d5cm8vS2NvbmZpZwpAQCAtMywxMSArMyw0NSBAQAogIwogY29tbWVudCAiRGlnaXRhbCBneXJvc2NvcGUgc2Vuc29ycyIKIAorY29uZmlnIEFESVMxNjA2MAorCXRyaXN0YXRlICJBbmFsb2cgRGV2aWNlcyBBRElTMTYwNjAgWWF3IFJhdGUgR3lyb3Njb3BlIHdpdGggU1BJIGRyaXZlciIKKwlkZXBlbmRzIG9uIFNQSQorCWhlbHAKKwkgIFNheSB5ZXMgaGVyZSB0byBidWlsZCBzdXBwb3J0IGZvciBBbmFsb2cgRGV2aWNlcyBhZGlzMTYwNjAgd2lkZSBiYW5kd2lkdGgKKwkgIHlhdyByYXRlIGd5cm9zY29wZSB3aXRoIFNQSS4KKworY29uZmlnIEFESVMxNjA4MAorCXRyaXN0YXRlICJBbmFsb2cgRGV2aWNlcyBBRElTMTYwODAvMTAwIFlhdyBSYXRlIEd5cm9zY29wZSB3aXRoIFNQSSBkcml2ZXIiCisJZGVwZW5kcyBvbiBTUEkKKwloZWxwCisJICBTYXkgeWVzIGhlcmUgdG8gYnVpbGQgc3VwcG9ydCBmb3IgQW5hbG9nIERldmljZXMgYWRpczE2MDgwLzEwMCBZYXcgUmF0ZQorCSAgR3lyb3Njb3BlIHdpdGggU1BJLgorCitjb25maWcgQURJUzE2MTMwCisJdHJpc3RhdGUgIkFuYWxvZyBEZXZpY2VzIEFESVMxNjEzMCBIaWdoIFByZWNpc2lvbiBBbmd1bGFyIFJhdGUgU2Vuc29yIGRyaXZlciIKKwlkZXBlbmRzIG9uIFNQSQorCWhlbHAKKwkgIFNheSB5ZXMgaGVyZSB0byBidWlsZCBzdXBwb3J0IGZvciBBbmFsb2cgRGV2aWNlcyBBRElTMTYxMzAgSGlnaCBQcmVjaXNpb24KKwkgIEFuZ3VsYXIgUmF0ZSBTZW5zb3IgZHJpdmVyLgorCiBjb25maWcgQURJUzE2MjYwCi0JdHJpc3RhdGUgIkFuYWxvZyBEZXZpY2VzIEFESVMxNjI2MC81IERpZ2l0YWwgR3lyb3Njb3BlIFNlbnNvciBTUEkgZHJpdmVyIgorCXRyaXN0YXRlICJBbmFsb2cgRGV2aWNlcyBBRElTMTYyNjAgQURJUzE2MjY1IERpZ2l0YWwgR3lyb3Njb3BlIFNlbnNvciBTUEkgZHJpdmVyIgogCWRlcGVuZHMgb24gU1BJCiAJc2VsZWN0IElJT19UUklHR0VSIGlmIElJT19SSU5HX0JVRkZFUgogCXNlbGVjdCBJSU9fU1dfUklORyBpZiBJSU9fUklOR19CVUZGRVIKIAloZWxwCi0JICBTYXkgeWVzIGhlcmUgdG8gYnVpbGQgc3VwcG9ydCBmb3IgQW5hbG9nIERldmljZXMgYWRpczE2MjYwLzUKKwkgIFNheSB5ZXMgaGVyZSB0byBidWlsZCBzdXBwb3J0IGZvciBBbmFsb2cgRGV2aWNlcyBBRElTMTYyNjAgQURJUzE2MjY1CiAJICBwcm9ncmFtbWFibGUgZGlnaXRhbCBneXJvc2NvcGUgc2Vuc29yLgorCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBhZGlzMTYyNjAuCisKK2NvbmZpZyBBRElTMTYyNTEKKwl0cmlzdGF0ZSAiQW5hbG9nIERldmljZXMgQURJUzE2MjUxIERpZ2l0YWwgR3lyb3Njb3BlIFNlbnNvciBTUEkgZHJpdmVyIgorCWRlcGVuZHMgb24gU1BJCisJaGVscAorCSAgU2F5IHllcyBoZXJlIHRvIGJ1aWxkIHN1cHBvcnQgZm9yIEFuYWxvZyBEZXZpY2VzIGFkaXMxNjI2MSBwcm9ncmFtbWFibGUKKwkgIGRpZ2l0YWwgZ3lyb3Njb3BlIHNlbnNvci4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgYWRpczE2MjUxLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9neXJvL01ha2VmaWxlIGIvZHJpdmVycy9zdGFnaW5nL2lpby9neXJvL01ha2VmaWxlCmluZGV4IGI1ZjBkYzAuLjI3NjRjMTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vZ3lyby9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2d5cm8vTWFrZWZpbGUKQEAgLTIsNiArMiwxOCBAQAogIyBNYWtlZmlsZSBmb3IgZGlnaXRhbCBneXJvc2NvcGUgc2Vuc29yIGRyaXZlcnMKICMKIAorYWRpczE2MDYwLXkgICAgICAgICAgICAgOj0gYWRpczE2MDYwX2NvcmUubworb2JqLSQoQ09ORklHX0FESVMxNjA2MCkgKz0gYWRpczE2MDYwLm8KKworYWRpczE2MDgwLXkgICAgICAgICAgICAgOj0gYWRpczE2MDgwX2NvcmUubworb2JqLSQoQ09ORklHX0FESVMxNjA4MCkgKz0gYWRpczE2MDgwLm8KKworYWRpczE2MTMwLXkgICAgICAgICAgICAgOj0gYWRpczE2MTMwX2NvcmUubworb2JqLSQoQ09ORklHX0FESVMxNjEzMCkgKz0gYWRpczE2MTMwLm8KKwogYWRpczE2MjYwLXkgICAgICAgICAgICAgOj0gYWRpczE2MjYwX2NvcmUubwogYWRpczE2MjYwLSQoQ09ORklHX0lJT19SSU5HX0JVRkZFUikgKz0gYWRpczE2MjYwX3JpbmcubyBhZGlzMTYyNjBfdHJpZ2dlci5vCiBvYmotJChDT05GSUdfQURJUzE2MjYwKSArPSBhZGlzMTYyNjAubworCithZGlzMTYyNTEteSAgICAgICAgICAgICA6PSBhZGlzMTYyNTFfY29yZS5vCitvYmotJChDT05GSUdfQURJUzE2MjUxKSArPSBhZGlzMTYyNTEubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9neXJvL2FkaXMxNjA2MC5oIGIvZHJpdmVycy9zdGFnaW5nL2lpby9neXJvL2FkaXMxNjA2MC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjMDBlNTMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2d5cm8vYWRpczE2MDYwLmgKQEAgLTAsMCArMSwxMDEgQEAKKyNpZm5kZWYgU1BJX0FESVMxNjA2MF9IXworI2RlZmluZSBTUElfQURJUzE2MDYwX0hfCisKKyNkZWZpbmUgQURJUzE2MDYwX0dZUk8gICAgICAgMHgyMCAvKiBNZWFzdXJlIEFuZ3VsYXIgUmF0ZSAoR3lybykgKi8KKyNkZWZpbmUgQURJUzE2MDYwX1NVUFBMWV9PVVQgMHgxMCAvKiBNZWFzdXJlIFRlbXBlcmF0dXJlICovCisjZGVmaW5lIEFESVMxNjA2MF9BSU4yICAgICAgIDB4ODAgLyogTWVhc3VyZSBBSU4yICovCisjZGVmaW5lIEFESVMxNjA2MF9BSU4xICAgICAgIDB4NDAgLyogTWVhc3VyZSBBSU4xICovCisjZGVmaW5lIEFESVMxNjA2MF9URU1QX09VVCAgIDB4MjIgLyogU2V0IFBvc2l0aXZlIFNlbGYtVGVzdCBhbmQgT3V0cHV0IGZvciBBbmd1bGFyIFJhdGUgKi8KKyNkZWZpbmUgQURJUzE2MDYwX0FOR0xfT1VUICAgMHgyMSAvKiBTZXQgTmVnYXRpdmUgU2VsZi1UZXN0IGFuZCBPdXRwdXQgZm9yIEFuZ3VsYXIgUmF0ZSAqLworCisjZGVmaW5lIEFESVMxNjA2MF9NQVhfVFggICAgIDMKKyNkZWZpbmUgQURJUzE2MDYwX01BWF9SWCAgICAgMworCisvKioKKyAqIHN0cnVjdCBhZGlzMTYwNjBfc3RhdGUgLSBkZXZpY2UgaW5zdGFuY2Ugc3BlY2lmaWMgZGF0YQorICogQHVzX3c6CQkJYWN0dWFsIHNwaV9kZXZpY2UgdG8gd3JpdGUgZGF0YQorICogQHdvcmtfdHJpZ2dlcl90b19yaW5nOiBiaCBmb3IgdHJpZ2dlcmVkIGV2ZW50IGhhbmRsaW5nCisgKiBAaW50ZXI6CQl1c2VkIHRvIGNoZWNrIGlmIG5ldyBpbnRlcnJ1cHQgaGFzIGJlZW4gdHJpZ2dlcmVkCisgKiBAbGFzdF90aW1lc3RhbXA6CXBhc3NpbmcgdGltZXN0YW1wIGZyb20gdGggdG8gYmggb2YgaW50ZXJydXB0IGhhbmRsZXIKKyAqIEBpbmRpb19kZXY6CQlpbmR1c3RyaWFsIEkvTyBkZXZpY2Ugc3RydWN0dXJlCisgKiBAdHJpZzoJCWRhdGEgcmVhZHkgdHJpZ2dlciByZWdpc3RlcmVkIHdpdGggaWlvCisgKiBAdHg6CQkJdHJhbnNtaXQgYnVmZmVyCisgKiBAcng6CQkJcmVjaWV2ZSBidWZmZXIKKyAqIEBidWZfbG9jazoJCW11dGV4IHRvIHByb3RlY3QgdHggYW5kIHJ4CisgKiovCitzdHJ1Y3QgYWRpczE2MDYwX3N0YXRlIHsKKwlzdHJ1Y3Qgc3BpX2RldmljZQkJKnVzX3c7CisJc3RydWN0IHNwaV9kZXZpY2UJCSp1c19yOworCXN0cnVjdCB3b3JrX3N0cnVjdAkJd29ya190cmlnZ2VyX3RvX3Jpbmc7CisJczY0CQkJCWxhc3RfdGltZXN0YW1wOworCXN0cnVjdCBpaW9fZGV2CQkJKmluZGlvX2RldjsKKwlzdHJ1Y3QgaWlvX3RyaWdnZXIJCSp0cmlnOworCXU4CQkJCSp0eDsKKwl1OAkJCQkqcng7CisJc3RydWN0IG11dGV4CQkJYnVmX2xvY2s7Cit9OworCisjaWYgZGVmaW5lZChDT05GSUdfSUlPX1JJTkdfQlVGRkVSKSAmJiBkZWZpbmVkKFRISVNfSEFTX1JJTkdfQlVGRkVSX1NVUFBPUlQpCisvKiBBdCB0aGUgbW9tZW50IHRyaWdnZXJzIGFyZSBvbmx5IHVzZWQgZm9yIHJpbmcgYnVmZmVyCisgKiBmaWxsaW5nLiBUaGlzIG1heSBjaGFuZ2UhCisgKi8KKworZW51bSBhZGlzMTYwNjBfc2NhbiB7CisJQURJUzE2MDYwX1NDQU5fR1lSTywKKwlBRElTMTYwNjBfU0NBTl9URU1QLAorCUFESVMxNjA2MF9TQ0FOX0FEQ18xLAorCUFESVMxNjA2MF9TQ0FOX0FEQ18yLAorfTsKKwordm9pZCBhZGlzMTYwNjBfcmVtb3ZlX3RyaWdnZXIoc3RydWN0IGlpb19kZXYgKmluZGlvX2Rldik7CitpbnQgYWRpczE2MDYwX3Byb2JlX3RyaWdnZXIoc3RydWN0IGlpb19kZXYgKmluZGlvX2Rldik7CisKK3NzaXplX3QgYWRpczE2MDYwX3JlYWRfZGF0YV9mcm9tX3Jpbmcoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCSAgICAgIGNoYXIgKmJ1Zik7CisKKworaW50IGFkaXMxNjA2MF9jb25maWd1cmVfcmluZyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KTsKK3ZvaWQgYWRpczE2MDYwX3VuY29uZmlndXJlX3Jpbmcoc3RydWN0IGlpb19kZXYgKmluZGlvX2Rldik7CisKK2ludCBhZGlzMTYwNjBfaW5pdGlhbGl6ZV9yaW5nKHN0cnVjdCBpaW9fcmluZ19idWZmZXIgKnJpbmcpOwordm9pZCBhZGlzMTYwNjBfdW5pbml0aWFsaXplX3Jpbmcoc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqcmluZyk7CisjZWxzZSAvKiBDT05GSUdfSUlPX1JJTkdfQlVGRkVSICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhZGlzMTYwNjBfcmVtb3ZlX3RyaWdnZXIoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKK3sKK30KKworc3RhdGljIGlubGluZSBpbnQgYWRpczE2MDYwX3Byb2JlX3RyaWdnZXIoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBzc2l6ZV90CithZGlzMTYwNjBfcmVhZF9kYXRhX2Zyb21fcmluZyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgICAgIGNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhZGlzMTYwNjBfY29uZmlndXJlX3Jpbmcoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGFkaXMxNjA2MF91bmNvbmZpZ3VyZV9yaW5nKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCit7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGFkaXMxNjA2MF9pbml0aWFsaXplX3Jpbmcoc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqcmluZykKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGFkaXMxNjA2MF91bmluaXRpYWxpemVfcmluZyhzdHJ1Y3QgaWlvX3JpbmdfYnVmZmVyICpyaW5nKQoreworfQorCisjZW5kaWYgLyogQ09ORklHX0lJT19SSU5HX0JVRkZFUiAqLworI2VuZGlmIC8qIFNQSV9BRElTMTYwNjBfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vZ3lyby9hZGlzMTYwNjBfY29yZS5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9neXJvL2FkaXMxNjA2MF9jb3JlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmM0OGFjYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vZ3lyby9hZGlzMTYwNjBfY29yZS5jCkBAIC0wLDAgKzEsMzE5IEBACisvKgorICogQURJUzE2MDYwIFdpZGUgQmFuZHdpZHRoIFlhdyBSYXRlIEd5cm9zY29wZSB3aXRoIFNQSSBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgMjAxMCBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisKKyNpbmNsdWRlICIuLi9paW8uaCIKKyNpbmNsdWRlICIuLi9zeXNmcy5oIgorI2luY2x1ZGUgImd5cm8uaCIKKyNpbmNsdWRlICIuLi9hZGMvYWRjLmgiCisKKyNpbmNsdWRlICJhZGlzMTYwNjAuaCIKKworI2RlZmluZSBEUklWRVJfTkFNRQkJImFkaXMxNjA2MCIKKworc3RydWN0IGFkaXMxNjA2MF9zdGF0ZSAqYWRpczE2MDYwX3N0OworCitpbnQgYWRpczE2MDYwX3NwaV93cml0ZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXU4IHZhbCkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWRpczE2MDYwX3N0YXRlICpzdCA9IGlpb19kZXZfZ2V0X2RldmRhdGEoaW5kaW9fZGV2KTsKKworCW11dGV4X2xvY2soJnN0LT5idWZfbG9jayk7CisJc3QtPnR4WzBdID0gMDsKKwlzdC0+dHhbMV0gPSAwOworCXN0LT50eFsyXSA9IHZhbDsgLyogVGhlIGxhc3QgOCBiaXRzIGNsb2NrZWQgaW4gYXJlIGxhdGNoZWQgKi8KKworCXJldCA9IHNwaV93cml0ZShzdC0+dXNfdywgc3QtPnR4LCAzKTsKKwltdXRleF91bmxvY2soJnN0LT5idWZfbG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorCitpbnQgYWRpczE2MDYwX3NwaV9yZWFkKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJdTE2ICp2YWwpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkaXMxNjA2MF9zdGF0ZSAqc3QgPSBpaW9fZGV2X2dldF9kZXZkYXRhKGluZGlvX2Rldik7CisKKwltdXRleF9sb2NrKCZzdC0+YnVmX2xvY2spOworCisJcmV0ID0gc3BpX3JlYWQoc3QtPnVzX3IsIHN0LT5yeCwgMyk7CisKKwkvKiBUaGUgaW50ZXJuYWwgc3VjY2Vzc2l2ZSBhcHByb3hpbWF0aW9uIEFEQyBiZWdpbnMgdGhlIGNvbnZlcnNpb24gcHJvY2VzcworCSAqIG9uIHRoZSBmYWxsaW5nIGVkZ2Ugb2YgTVNFTDEgYW5kIHN0YXJ0cyB0byBwbGFjZSBkYXRhIE1TQiBmaXJzdCBvbiB0aGUKKwkgKiBET1VUIGxpbmUgYXQgdGhlIDZ0aCBmYWxsaW5nIGVkZ2Ugb2YgU0NMSworCSAqLworCWlmIChyZXQgPT0gMCkKKwkJKnZhbCA9ICgoc3QtPnJ4WzBdICYgMHgzKSA8PCAxMikgfCAoc3QtPnJ4WzFdIDw8IDQpIHwgKChzdC0+cnhbMl0gPj4gNCkgJiAweEYpOworCW11dGV4X3VubG9jaygmc3QtPmJ1Zl9sb2NrKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkaXMxNjA2MF9yZWFkKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJdTE2IHZhbDsKKwlzc2l6ZV90IHJldDsKKworCS8qIFRha2UgdGhlIGlpb19kZXYgc3RhdHVzIGxvY2sgKi8KKwltdXRleF9sb2NrKCZpbmRpb19kZXYtPm1sb2NrKTsKKwlyZXQgPSAgYWRpczE2MDYwX3NwaV9yZWFkKGRldiwgJnZhbCk7CisJbXV0ZXhfdW5sb2NrKCZpbmRpb19kZXYtPm1sb2NrKTsKKworCWlmIChyZXQgPT0gMCkKKwkJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHZhbCk7CisJZWxzZQorCQlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3NpemVfdCBhZGlzMTYwNjBfd3JpdGUoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgbGVuKQoreworCWludCByZXQ7CisJbG9uZyB2YWw7CisKKwlyZXQgPSBzdHJpY3Rfc3RydG9sKGJ1ZiwgMTYsICZ2YWwpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfcmV0OworCXJldCA9IGFkaXMxNjA2MF9zcGlfd3JpdGUoZGV2LCB2YWwpOworCitlcnJvcl9yZXQ6CisJcmV0dXJuIHJldCA/IHJldCA6IGxlbjsKK30KKworI2RlZmluZSBJSU9fREVWX0FUVFJfSU4oX3Nob3cpCQkJCVwKKwlJSU9fREVWSUNFX0FUVFIoaW4sIFNfSVJVR08sIF9zaG93LCBOVUxMLCAwKQorCisjZGVmaW5lIElJT19ERVZfQVRUUl9PVVQoX3N0b3JlKQkJCQlcCisJSUlPX0RFVklDRV9BVFRSKG91dCwgU19JUlVHTywgTlVMTCwgX3N0b3JlLCAwKQorCitzdGF0aWMgSUlPX0RFVl9BVFRSX0lOKGFkaXMxNjA2MF9yZWFkKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfT1VUKGFkaXMxNjA2MF93cml0ZSk7CisKK3N0YXRpYyBJSU9fQ09OU1RfQVRUUihuYW1lLCAiYWRpczE2MDYwIik7CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICphZGlzMTYwNjBfZXZlbnRfYXR0cmlidXRlc1tdID0geworCU5VTEwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGFkaXMxNjA2MF9ldmVudF9hdHRyaWJ1dGVfZ3JvdXAgPSB7CisJLmF0dHJzID0gYWRpczE2MDYwX2V2ZW50X2F0dHJpYnV0ZXMsCit9OworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqYWRpczE2MDYwX2F0dHJpYnV0ZXNbXSA9IHsKKwkmaWlvX2Rldl9hdHRyX2luLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9vdXQuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2NvbnN0X2F0dHJfbmFtZS5kZXZfYXR0ci5hdHRyLAorCU5VTEwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGFkaXMxNjA2MF9hdHRyaWJ1dGVfZ3JvdXAgPSB7CisJLmF0dHJzID0gYWRpczE2MDYwX2F0dHJpYnV0ZXMsCit9OworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBhZGlzMTYwNjBfcl9wcm9iZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCWludCByZXQsIHJlZ2RvbmUgPSAwOworCXN0cnVjdCBhZGlzMTYwNjBfc3RhdGUgKnN0ID0ga3phbGxvYyhzaXplb2YgKnN0LCBHRlBfS0VSTkVMKTsKKwlpZiAoIXN0KSB7CisJCXJldCA9ICAtRU5PTUVNOworCQlnb3RvIGVycm9yX3JldDsKKwl9CisJLyogdGhpcyBpcyBvbmx5IHVzZWQgZm9yIHJlbW92YWwgcHVycG9zZXMgKi8KKwlzcGlfc2V0X2RydmRhdGEoc3BpLCBzdCk7CisKKwkvKiBBbGxvY2F0ZSB0aGUgY29tbXMgYnVmZmVycyAqLworCXN0LT5yeCA9IGt6YWxsb2Moc2l6ZW9mKCpzdC0+cngpKkFESVMxNjA2MF9NQVhfUlgsIEdGUF9LRVJORUwpOworCWlmIChzdC0+cnggPT0gTlVMTCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycm9yX2ZyZWVfc3Q7CisJfQorCXN0LT50eCA9IGt6YWxsb2Moc2l6ZW9mKCpzdC0+dHgpKkFESVMxNjA2MF9NQVhfVFgsIEdGUF9LRVJORUwpOworCWlmIChzdC0+dHggPT0gTlVMTCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycm9yX2ZyZWVfcng7CisJfQorCXN0LT51c19yID0gc3BpOworCW11dGV4X2luaXQoJnN0LT5idWZfbG9jayk7CisJLyogc2V0dXAgdGhlIGluZHVzdHJpYWxpbyBkcml2ZXIgYWxsb2NhdGVkIGVsZW1lbnRzICovCisJc3QtPmluZGlvX2RldiA9IGlpb19hbGxvY2F0ZV9kZXZpY2UoKTsKKwlpZiAoc3QtPmluZGlvX2RldiA9PSBOVUxMKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3JfZnJlZV90eDsKKwl9CisKKwlzdC0+aW5kaW9fZGV2LT5kZXYucGFyZW50ID0gJnNwaS0+ZGV2OworCXN0LT5pbmRpb19kZXYtPm51bV9pbnRlcnJ1cHRfbGluZXMgPSAxOworCXN0LT5pbmRpb19kZXYtPmV2ZW50X2F0dHJzID0gJmFkaXMxNjA2MF9ldmVudF9hdHRyaWJ1dGVfZ3JvdXA7CisJc3QtPmluZGlvX2Rldi0+YXR0cnMgPSAmYWRpczE2MDYwX2F0dHJpYnV0ZV9ncm91cDsKKwlzdC0+aW5kaW9fZGV2LT5kZXZfZGF0YSA9ICh2b2lkICopKHN0KTsKKwlzdC0+aW5kaW9fZGV2LT5kcml2ZXJfbW9kdWxlID0gVEhJU19NT0RVTEU7CisJc3QtPmluZGlvX2Rldi0+bW9kZXMgPSBJTkRJT19ESVJFQ1RfTU9ERTsKKworCXJldCA9IGFkaXMxNjA2MF9jb25maWd1cmVfcmluZyhzdC0+aW5kaW9fZGV2KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX2ZyZWVfZGV2OworCisJcmV0ID0gaWlvX2RldmljZV9yZWdpc3RlcihzdC0+aW5kaW9fZGV2KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3VucmVnX3JpbmdfZnVuY3M7CisJcmVnZG9uZSA9IDE7CisKKwlyZXQgPSBhZGlzMTYwNjBfaW5pdGlhbGl6ZV9yaW5nKHN0LT5pbmRpb19kZXYtPnJpbmcpOworCWlmIChyZXQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJmYWlsZWQgdG8gaW5pdGlhbGl6ZSB0aGUgcmluZ1xuIik7CisJCWdvdG8gZXJyb3JfdW5yZWdfcmluZ19mdW5jczsKKwl9CisKKwlpZiAoc3BpLT5pcnEgJiYgZ3Bpb19pc192YWxpZChpcnFfdG9fZ3BpbyhzcGktPmlycSkpID4gMCkgeworCQlyZXQgPSBpaW9fcmVnaXN0ZXJfaW50ZXJydXB0X2xpbmUoc3BpLT5pcnEsCisJCQkJc3QtPmluZGlvX2RldiwKKwkJCQkwLAorCQkJCUlSUUZfVFJJR0dFUl9SSVNJTkcsCisJCQkJImFkaXMxNjA2MCIpOworCQlpZiAocmV0KQorCQkJZ290byBlcnJvcl91bmluaXRpYWxpemVfcmluZzsKKworCQlyZXQgPSBhZGlzMTYwNjBfcHJvYmVfdHJpZ2dlcihzdC0+aW5kaW9fZGV2KTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJyb3JfdW5yZWdpc3Rlcl9saW5lOworCX0KKworCWFkaXMxNjA2MF9zdCA9IHN0OworCXJldHVybiAwOworCitlcnJvcl91bnJlZ2lzdGVyX2xpbmU6CisJaWYgKHN0LT5pbmRpb19kZXYtPm1vZGVzICYgSU5ESU9fUklOR19UUklHR0VSRUQpCisJCWlpb191bnJlZ2lzdGVyX2ludGVycnVwdF9saW5lKHN0LT5pbmRpb19kZXYsIDApOworZXJyb3JfdW5pbml0aWFsaXplX3Jpbmc6CisJYWRpczE2MDYwX3VuaW5pdGlhbGl6ZV9yaW5nKHN0LT5pbmRpb19kZXYtPnJpbmcpOworZXJyb3JfdW5yZWdfcmluZ19mdW5jczoKKwlhZGlzMTYwNjBfdW5jb25maWd1cmVfcmluZyhzdC0+aW5kaW9fZGV2KTsKK2Vycm9yX2ZyZWVfZGV2OgorCWlmIChyZWdkb25lKQorCQlpaW9fZGV2aWNlX3VucmVnaXN0ZXIoc3QtPmluZGlvX2Rldik7CisJZWxzZQorCQlpaW9fZnJlZV9kZXZpY2Uoc3QtPmluZGlvX2Rldik7CitlcnJvcl9mcmVlX3R4OgorCWtmcmVlKHN0LT50eCk7CitlcnJvcl9mcmVlX3J4OgorCWtmcmVlKHN0LT5yeCk7CitlcnJvcl9mcmVlX3N0OgorCWtmcmVlKHN0KTsKK2Vycm9yX3JldDoKKwlyZXR1cm4gcmV0OworfQorCisvKiBmaXhtZSwgY29uZmlybSBvcmRlcmluZyBpbiB0aGlzIGZ1bmN0aW9uICovCitzdGF0aWMgaW50IGFkaXMxNjA2MF9yX3JlbW92ZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCXN0cnVjdCBhZGlzMTYwNjBfc3RhdGUgKnN0ID0gc3BpX2dldF9kcnZkYXRhKHNwaSk7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IHN0LT5pbmRpb19kZXY7CisKKwlmbHVzaF9zY2hlZHVsZWRfd29yaygpOworCisJYWRpczE2MDYwX3JlbW92ZV90cmlnZ2VyKGluZGlvX2Rldik7CisJaWYgKHNwaS0+aXJxICYmIGdwaW9faXNfdmFsaWQoaXJxX3RvX2dwaW8oc3BpLT5pcnEpKSA+IDApCisJCWlpb191bnJlZ2lzdGVyX2ludGVycnVwdF9saW5lKGluZGlvX2RldiwgMCk7CisKKwlhZGlzMTYwNjBfdW5pbml0aWFsaXplX3JpbmcoaW5kaW9fZGV2LT5yaW5nKTsKKwlhZGlzMTYwNjBfdW5jb25maWd1cmVfcmluZyhpbmRpb19kZXYpOworCWlpb19kZXZpY2VfdW5yZWdpc3RlcihpbmRpb19kZXYpOworCWtmcmVlKHN0LT50eCk7CisJa2ZyZWUoc3QtPnJ4KTsKKwlrZnJlZShzdCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgYWRpczE2MDYwX3dfcHJvYmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBhZGlzMTYwNjBfc3RhdGUgKnN0ID0gYWRpczE2MDYwX3N0OworCWlmICghc3QpIHsKKwkJcmV0ID0gIC1FTk9ERVY7CisJCWdvdG8gZXJyb3JfcmV0OworCX0KKwlzcGlfc2V0X2RydmRhdGEoc3BpLCBzdCk7CisJc3QtPnVzX3cgPSBzcGk7CisJcmV0dXJuIDA7CisKK2Vycm9yX3JldDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFkaXMxNjA2MF93X3JlbW92ZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNwaV9kcml2ZXIgYWRpczE2MDYwX3JfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gImFkaXMxNjA2MF9yIiwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJfSwKKwkucHJvYmUgPSBhZGlzMTYwNjBfcl9wcm9iZSwKKwkucmVtb3ZlID0gX19kZXZleGl0X3AoYWRpczE2MDYwX3JfcmVtb3ZlKSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc3BpX2RyaXZlciBhZGlzMTYwNjBfd19kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAiYWRpczE2MDYwX3ciLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwl9LAorCS5wcm9iZSA9IGFkaXMxNjA2MF93X3Byb2JlLAorCS5yZW1vdmUgPSBfX2RldmV4aXRfcChhZGlzMTYwNjBfd19yZW1vdmUpLAorfTsKKworc3RhdGljIF9faW5pdCBpbnQgYWRpczE2MDYwX2luaXQodm9pZCkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gc3BpX3JlZ2lzdGVyX2RyaXZlcigmYWRpczE2MDYwX3JfZHJpdmVyKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IHNwaV9yZWdpc3Rlcl9kcml2ZXIoJmFkaXMxNjA2MF93X2RyaXZlcik7CisJaWYgKHJldCA8IDApIHsKKwkJc3BpX3VucmVnaXN0ZXJfZHJpdmVyKCZhZGlzMTYwNjBfcl9kcml2ZXIpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiAwOworfQorbW9kdWxlX2luaXQoYWRpczE2MDYwX2luaXQpOworCitzdGF0aWMgX19leGl0IHZvaWQgYWRpczE2MDYwX2V4aXQodm9pZCkKK3sKKwlzcGlfdW5yZWdpc3Rlcl9kcml2ZXIoJmFkaXMxNjA2MF93X2RyaXZlcik7CisJc3BpX3VucmVnaXN0ZXJfZHJpdmVyKCZhZGlzMTYwNjBfcl9kcml2ZXIpOworfQorbW9kdWxlX2V4aXQoYWRpczE2MDYwX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJCYXJyeSBTb25nIDwyMWNuYmFvQGdtYWlsLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiQW5hbG9nIERldmljZXMgQURJUzE2MDYwIFlhdyBSYXRlIEd5cm9zY29wZSB3aXRoIFNQSSBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vZ3lyby9hZGlzMTYwODAuaCBiL2RyaXZlcnMvc3RhZ2luZy9paW8vZ3lyby9hZGlzMTYwODAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZmNiZTY3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9neXJvL2FkaXMxNjA4MC5oCkBAIC0wLDAgKzEsMTAyIEBACisjaWZuZGVmIFNQSV9BRElTMTYwODBfSF8KKyNkZWZpbmUgU1BJX0FESVMxNjA4MF9IXworCisjZGVmaW5lIEFESVMxNjA4MF9ESU5fQ09ERSAgIDQgLyogT3V0cHV0IGRhdGEgZm9ybWF0IHNldHRpbmcuIDA6IFR3b3MgY29tcGxlbWVudC4gMTogT2Zmc2V0IGJpbmFyeS4gKi8KKyNkZWZpbmUgQURJUzE2MDgwX0RJTl9HWVJPICAgKDAgPDwgMTApIC8qIEd5cm9zY29wZSBvdXRwdXQgKi8KKyNkZWZpbmUgQURJUzE2MDgwX0RJTl9URU1QICAgKDEgPDwgMTApIC8qIFRlbXBlcmF0dXJlIG91dHB1dCAqLworI2RlZmluZSBBRElTMTYwODBfRElOX0FJTjEgICAoMiA8PCAxMCkKKyNkZWZpbmUgQURJUzE2MDgwX0RJTl9BSU4yICAgKDMgPDwgMTApCisjZGVmaW5lIEFESVMxNjA4MF9ESU5fV1JJVEUgICgxIDw8IDE1KSAvKiAxOiBXcml0ZSBjb250ZW50cyBvbiBESU4gdG8gY29udHJvbCByZWdpc3Rlci4KKwkJCQkJKiAwOiBObyBjaGFuZ2VzIHRvIGNvbnRyb2wgcmVnaXN0ZXIuCisJCQkJCSovCisKKyNkZWZpbmUgQURJUzE2MDgwX01BWF9UWCAgICAgMgorI2RlZmluZSBBRElTMTYwODBfTUFYX1JYICAgICAyCisKKy8qKgorICogc3RydWN0IGFkaXMxNjA4MF9zdGF0ZSAtIGRldmljZSBpbnN0YW5jZSBzcGVjaWZpYyBkYXRhCisgKiBAdXM6CQkJYWN0dWFsIHNwaV9kZXZpY2UgdG8gd3JpdGUgZGF0YQorICogQHdvcmtfdHJpZ2dlcl90b19yaW5nOiBiaCBmb3IgdHJpZ2dlcmVkIGV2ZW50IGhhbmRsaW5nCisgKiBAaW50ZXI6CQl1c2VkIHRvIGNoZWNrIGlmIG5ldyBpbnRlcnJ1cHQgaGFzIGJlZW4gdHJpZ2dlcmVkCisgKiBAbGFzdF90aW1lc3RhbXA6CXBhc3NpbmcgdGltZXN0YW1wIGZyb20gdGggdG8gYmggb2YgaW50ZXJydXB0IGhhbmRsZXIKKyAqIEBpbmRpb19kZXY6CQlpbmR1c3RyaWFsIEkvTyBkZXZpY2Ugc3RydWN0dXJlCisgKiBAdHJpZzoJCWRhdGEgcmVhZHkgdHJpZ2dlciByZWdpc3RlcmVkIHdpdGggaWlvCisgKiBAdHg6CQkJdHJhbnNtaXQgYnVmZmVyCisgKiBAcng6CQkJcmVjaWV2ZSBidWZmZXIKKyAqIEBidWZfbG9jazoJCW11dGV4IHRvIHByb3RlY3QgdHggYW5kIHJ4CisgKiovCitzdHJ1Y3QgYWRpczE2MDgwX3N0YXRlIHsKKwlzdHJ1Y3Qgc3BpX2RldmljZQkJKnVzOworCXN0cnVjdCB3b3JrX3N0cnVjdAkJd29ya190cmlnZ2VyX3RvX3Jpbmc7CisJczY0CQkJCWxhc3RfdGltZXN0YW1wOworCXN0cnVjdCBpaW9fZGV2CQkJKmluZGlvX2RldjsKKwlzdHJ1Y3QgaWlvX3RyaWdnZXIJCSp0cmlnOworCXU4CQkJCSp0eDsKKwl1OAkJCQkqcng7CisJc3RydWN0IG11dGV4CQkJYnVmX2xvY2s7Cit9OworCisjaWYgZGVmaW5lZChDT05GSUdfSUlPX1JJTkdfQlVGRkVSKSAmJiBkZWZpbmVkKFRISVNfSEFTX1JJTkdfQlVGRkVSX1NVUFBPUlQpCisvKiBBdCB0aGUgbW9tZW50IHRyaWdnZXJzIGFyZSBvbmx5IHVzZWQgZm9yIHJpbmcgYnVmZmVyCisgKiBmaWxsaW5nLiBUaGlzIG1heSBjaGFuZ2UhCisgKi8KKworZW51bSBhZGlzMTYwODBfc2NhbiB7CisJQURJUzE2MDgwX1NDQU5fR1lSTywKKwlBRElTMTYwODBfU0NBTl9URU1QLAorCUFESVMxNjA4MF9TQ0FOX0FEQ18xLAorCUFESVMxNjA4MF9TQ0FOX0FEQ18yLAorfTsKKwordm9pZCBhZGlzMTYwODBfcmVtb3ZlX3RyaWdnZXIoc3RydWN0IGlpb19kZXYgKmluZGlvX2Rldik7CitpbnQgYWRpczE2MDgwX3Byb2JlX3RyaWdnZXIoc3RydWN0IGlpb19kZXYgKmluZGlvX2Rldik7CisKK3NzaXplX3QgYWRpczE2MDgwX3JlYWRfZGF0YV9mcm9tX3Jpbmcoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCSAgICAgIGNoYXIgKmJ1Zik7CisKKworaW50IGFkaXMxNjA4MF9jb25maWd1cmVfcmluZyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KTsKK3ZvaWQgYWRpczE2MDgwX3VuY29uZmlndXJlX3Jpbmcoc3RydWN0IGlpb19kZXYgKmluZGlvX2Rldik7CisKK2ludCBhZGlzMTYwODBfaW5pdGlhbGl6ZV9yaW5nKHN0cnVjdCBpaW9fcmluZ19idWZmZXIgKnJpbmcpOwordm9pZCBhZGlzMTYwODBfdW5pbml0aWFsaXplX3Jpbmcoc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqcmluZyk7CisjZWxzZSAvKiBDT05GSUdfSUlPX1JJTkdfQlVGRkVSICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhZGlzMTYwODBfcmVtb3ZlX3RyaWdnZXIoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKK3sKK30KKworc3RhdGljIGlubGluZSBpbnQgYWRpczE2MDgwX3Byb2JlX3RyaWdnZXIoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBzc2l6ZV90CithZGlzMTYwODBfcmVhZF9kYXRhX2Zyb21fcmluZyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgICAgIGNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhZGlzMTYwODBfY29uZmlndXJlX3Jpbmcoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGFkaXMxNjA4MF91bmNvbmZpZ3VyZV9yaW5nKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCit7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGFkaXMxNjA4MF9pbml0aWFsaXplX3Jpbmcoc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqcmluZykKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGFkaXMxNjA4MF91bmluaXRpYWxpemVfcmluZyhzdHJ1Y3QgaWlvX3JpbmdfYnVmZmVyICpyaW5nKQoreworfQorCisjZW5kaWYgLyogQ09ORklHX0lJT19SSU5HX0JVRkZFUiAqLworI2VuZGlmIC8qIFNQSV9BRElTMTYwODBfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vZ3lyby9hZGlzMTYwODBfY29yZS5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9neXJvL2FkaXMxNjA4MF9jb3JlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGVmYjc2OAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vZ3lyby9hZGlzMTYwODBfY29yZS5jCkBAIC0wLDAgKzEsMjcxIEBACisvKgorICogQURJUzE2MDgwLzEwMCBZYXcgUmF0ZSBHeXJvc2NvcGUgd2l0aCBTUEkgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IDIwMTAgQW5hbG9nIERldmljZXMgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorCisjaW5jbHVkZSAiLi4vaWlvLmgiCisjaW5jbHVkZSAiLi4vc3lzZnMuaCIKKyNpbmNsdWRlICJneXJvLmgiCisjaW5jbHVkZSAiLi4vYWRjL2FkYy5oIgorCisjaW5jbHVkZSAiYWRpczE2MDgwLmgiCisKKyNkZWZpbmUgRFJJVkVSX05BTUUJCSJhZGlzMTYwODAiCisKK3N0cnVjdCBhZGlzMTYwODBfc3RhdGUgKmFkaXMxNjA4MF9zdDsKKworaW50IGFkaXMxNjA4MF9zcGlfd3JpdGUoc3RydWN0IGRldmljZSAqZGV2LAorCQl1MTYgdmFsKQoreworCWludCByZXQ7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZGlzMTYwODBfc3RhdGUgKnN0ID0gaWlvX2Rldl9nZXRfZGV2ZGF0YShpbmRpb19kZXYpOworCisJbXV0ZXhfbG9jaygmc3QtPmJ1Zl9sb2NrKTsKKwlzdC0+dHhbMF0gPSB2YWwgPj4gODsKKwlzdC0+dHhbMV0gPSB2YWw7CisKKwlyZXQgPSBzcGlfd3JpdGUoc3QtPnVzLCBzdC0+dHgsIDIpOworCW11dGV4X3VubG9jaygmc3QtPmJ1Zl9sb2NrKTsKKworCXJldHVybiByZXQ7Cit9CisKK2ludCBhZGlzMTYwODBfc3BpX3JlYWQoc3RydWN0IGRldmljZSAqZGV2LAorCQl1MTYgKnZhbCkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWRpczE2MDgwX3N0YXRlICpzdCA9IGlpb19kZXZfZ2V0X2RldmRhdGEoaW5kaW9fZGV2KTsKKworCW11dGV4X2xvY2soJnN0LT5idWZfbG9jayk7CisKKwlyZXQgPSBzcGlfcmVhZChzdC0+dXMsIHN0LT5yeCwgMik7CisKKwlpZiAocmV0ID09IDApCisJCSp2YWwgPSAoKHN0LT5yeFswXSAmIDB4RikgPDwgOCkgfCBzdC0+cnhbMV07CisJbXV0ZXhfdW5sb2NrKCZzdC0+YnVmX2xvY2spOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QgYWRpczE2MDgwX3JlYWQoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwl1MTYgdmFsOworCXNzaXplX3QgcmV0OworCisJLyogVGFrZSB0aGUgaWlvX2RldiBzdGF0dXMgbG9jayAqLworCW11dGV4X2xvY2soJmluZGlvX2Rldi0+bWxvY2spOworCXJldCA9ICBhZGlzMTYwODBfc3BpX3JlYWQoZGV2LCAmdmFsKTsKKwltdXRleF91bmxvY2soJmluZGlvX2Rldi0+bWxvY2spOworCisJaWYgKHJldCA9PSAwKQorCQlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgdmFsKTsKKwllbHNlCisJCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkaXMxNjA4MF93cml0ZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBsZW4pCit7CisJaW50IHJldDsKKwlsb25nIHZhbDsKKworCXJldCA9IHN0cmljdF9zdHJ0b2woYnVmLCAxNiwgJnZhbCk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9yZXQ7CisJcmV0ID0gYWRpczE2MDgwX3NwaV93cml0ZShkZXYsIHZhbCk7CisKK2Vycm9yX3JldDoKKwlyZXR1cm4gcmV0ID8gcmV0IDogbGVuOworfQorCisjZGVmaW5lIElJT19ERVZfQVRUUl9JTihfc2hvdykJCQkJXAorCUlJT19ERVZJQ0VfQVRUUihpbiwgU19JUlVHTywgX3Nob3csIE5VTEwsIDApCisKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX09VVChfc3RvcmUpCQkJCVwKKwlJSU9fREVWSUNFX0FUVFIob3V0LCBTX0lSVUdPLCBOVUxMLCBfc3RvcmUsIDApCisKK3N0YXRpYyBJSU9fREVWX0FUVFJfSU4oYWRpczE2MDgwX3JlYWQpOworc3RhdGljIElJT19ERVZfQVRUUl9PVVQoYWRpczE2MDgwX3dyaXRlKTsKKworc3RhdGljIElJT19DT05TVF9BVFRSKG5hbWUsICJhZGlzMTYwODAiKTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmFkaXMxNjA4MF9ldmVudF9hdHRyaWJ1dGVzW10gPSB7CisJTlVMTAorfTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgYWRpczE2MDgwX2V2ZW50X2F0dHJpYnV0ZV9ncm91cCA9IHsKKwkuYXR0cnMgPSBhZGlzMTYwODBfZXZlbnRfYXR0cmlidXRlcywKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICphZGlzMTYwODBfYXR0cmlidXRlc1tdID0geworCSZpaW9fZGV2X2F0dHJfaW4uZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX291dC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fY29uc3RfYXR0cl9uYW1lLmRldl9hdHRyLmF0dHIsCisJTlVMTAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgYWRpczE2MDgwX2F0dHJpYnV0ZV9ncm91cCA9IHsKKwkuYXR0cnMgPSBhZGlzMTYwODBfYXR0cmlidXRlcywKK307CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGFkaXMxNjA4MF9wcm9iZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCWludCByZXQsIHJlZ2RvbmUgPSAwOworCXN0cnVjdCBhZGlzMTYwODBfc3RhdGUgKnN0ID0ga3phbGxvYyhzaXplb2YgKnN0LCBHRlBfS0VSTkVMKTsKKwlpZiAoIXN0KSB7CisJCXJldCA9ICAtRU5PTUVNOworCQlnb3RvIGVycm9yX3JldDsKKwl9CisJLyogdGhpcyBpcyBvbmx5IHVzZWQgZm9yIHJlbW92YWwgcHVycG9zZXMgKi8KKwlzcGlfc2V0X2RydmRhdGEoc3BpLCBzdCk7CisKKwkvKiBBbGxvY2F0ZSB0aGUgY29tbXMgYnVmZmVycyAqLworCXN0LT5yeCA9IGt6YWxsb2Moc2l6ZW9mKCpzdC0+cngpKkFESVMxNjA4MF9NQVhfUlgsIEdGUF9LRVJORUwpOworCWlmIChzdC0+cnggPT0gTlVMTCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycm9yX2ZyZWVfc3Q7CisJfQorCXN0LT50eCA9IGt6YWxsb2Moc2l6ZW9mKCpzdC0+dHgpKkFESVMxNjA4MF9NQVhfVFgsIEdGUF9LRVJORUwpOworCWlmIChzdC0+dHggPT0gTlVMTCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycm9yX2ZyZWVfcng7CisJfQorCXN0LT51cyA9IHNwaTsKKwltdXRleF9pbml0KCZzdC0+YnVmX2xvY2spOworCS8qIHNldHVwIHRoZSBpbmR1c3RyaWFsaW8gZHJpdmVyIGFsbG9jYXRlZCBlbGVtZW50cyAqLworCXN0LT5pbmRpb19kZXYgPSBpaW9fYWxsb2NhdGVfZGV2aWNlKCk7CisJaWYgKHN0LT5pbmRpb19kZXYgPT0gTlVMTCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycm9yX2ZyZWVfdHg7CisJfQorCisJc3QtPmluZGlvX2Rldi0+ZGV2LnBhcmVudCA9ICZzcGktPmRldjsKKwlzdC0+aW5kaW9fZGV2LT5udW1faW50ZXJydXB0X2xpbmVzID0gMTsKKwlzdC0+aW5kaW9fZGV2LT5ldmVudF9hdHRycyA9ICZhZGlzMTYwODBfZXZlbnRfYXR0cmlidXRlX2dyb3VwOworCXN0LT5pbmRpb19kZXYtPmF0dHJzID0gJmFkaXMxNjA4MF9hdHRyaWJ1dGVfZ3JvdXA7CisJc3QtPmluZGlvX2Rldi0+ZGV2X2RhdGEgPSAodm9pZCAqKShzdCk7CisJc3QtPmluZGlvX2Rldi0+ZHJpdmVyX21vZHVsZSA9IFRISVNfTU9EVUxFOworCXN0LT5pbmRpb19kZXYtPm1vZGVzID0gSU5ESU9fRElSRUNUX01PREU7CisKKwlyZXQgPSBhZGlzMTYwODBfY29uZmlndXJlX3Jpbmcoc3QtPmluZGlvX2Rldik7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9mcmVlX2RldjsKKworCXJldCA9IGlpb19kZXZpY2VfcmVnaXN0ZXIoc3QtPmluZGlvX2Rldik7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl91bnJlZ19yaW5nX2Z1bmNzOworCXJlZ2RvbmUgPSAxOworCisJcmV0ID0gYWRpczE2MDgwX2luaXRpYWxpemVfcmluZyhzdC0+aW5kaW9fZGV2LT5yaW5nKTsKKwlpZiAocmV0KSB7CisJCXByaW50ayhLRVJOX0VSUiAiZmFpbGVkIHRvIGluaXRpYWxpemUgdGhlIHJpbmdcbiIpOworCQlnb3RvIGVycm9yX3VucmVnX3JpbmdfZnVuY3M7CisJfQorCisJaWYgKHNwaS0+aXJxICYmIGdwaW9faXNfdmFsaWQoaXJxX3RvX2dwaW8oc3BpLT5pcnEpKSA+IDApIHsKKwkJcmV0ID0gaWlvX3JlZ2lzdGVyX2ludGVycnVwdF9saW5lKHNwaS0+aXJxLAorCQkJCXN0LT5pbmRpb19kZXYsCisJCQkJMCwKKwkJCQlJUlFGX1RSSUdHRVJfUklTSU5HLAorCQkJCSJhZGlzMTYwODAiKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJyb3JfdW5pbml0aWFsaXplX3Jpbmc7CisKKwkJcmV0ID0gYWRpczE2MDgwX3Byb2JlX3RyaWdnZXIoc3QtPmluZGlvX2Rldik7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycm9yX3VucmVnaXN0ZXJfbGluZTsKKwl9CisKKwlhZGlzMTYwODBfc3QgPSBzdDsKKwlyZXR1cm4gMDsKKworZXJyb3JfdW5yZWdpc3Rlcl9saW5lOgorCWlmIChzdC0+aW5kaW9fZGV2LT5tb2RlcyAmIElORElPX1JJTkdfVFJJR0dFUkVEKQorCQlpaW9fdW5yZWdpc3Rlcl9pbnRlcnJ1cHRfbGluZShzdC0+aW5kaW9fZGV2LCAwKTsKK2Vycm9yX3VuaW5pdGlhbGl6ZV9yaW5nOgorCWFkaXMxNjA4MF91bmluaXRpYWxpemVfcmluZyhzdC0+aW5kaW9fZGV2LT5yaW5nKTsKK2Vycm9yX3VucmVnX3JpbmdfZnVuY3M6CisJYWRpczE2MDgwX3VuY29uZmlndXJlX3Jpbmcoc3QtPmluZGlvX2Rldik7CitlcnJvcl9mcmVlX2RldjoKKwlpZiAocmVnZG9uZSkKKwkJaWlvX2RldmljZV91bnJlZ2lzdGVyKHN0LT5pbmRpb19kZXYpOworCWVsc2UKKwkJaWlvX2ZyZWVfZGV2aWNlKHN0LT5pbmRpb19kZXYpOworZXJyb3JfZnJlZV90eDoKKwlrZnJlZShzdC0+dHgpOworZXJyb3JfZnJlZV9yeDoKKwlrZnJlZShzdC0+cngpOworZXJyb3JfZnJlZV9zdDoKKwlrZnJlZShzdCk7CitlcnJvcl9yZXQ6CisJcmV0dXJuIHJldDsKK30KKworLyogZml4bWUsIGNvbmZpcm0gb3JkZXJpbmcgaW4gdGhpcyBmdW5jdGlvbiAqLworc3RhdGljIGludCBhZGlzMTYwODBfcmVtb3ZlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJc3RydWN0IGFkaXMxNjA4MF9zdGF0ZSAqc3QgPSBzcGlfZ2V0X2RydmRhdGEoc3BpKTsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gc3QtPmluZGlvX2RldjsKKworCWZsdXNoX3NjaGVkdWxlZF93b3JrKCk7CisKKwlhZGlzMTYwODBfcmVtb3ZlX3RyaWdnZXIoaW5kaW9fZGV2KTsKKwlpZiAoc3BpLT5pcnEgJiYgZ3Bpb19pc192YWxpZChpcnFfdG9fZ3BpbyhzcGktPmlycSkpID4gMCkKKwkJaWlvX3VucmVnaXN0ZXJfaW50ZXJydXB0X2xpbmUoaW5kaW9fZGV2LCAwKTsKKworCWFkaXMxNjA4MF91bmluaXRpYWxpemVfcmluZyhpbmRpb19kZXYtPnJpbmcpOworCWFkaXMxNjA4MF91bmNvbmZpZ3VyZV9yaW5nKGluZGlvX2Rldik7CisJaWlvX2RldmljZV91bnJlZ2lzdGVyKGluZGlvX2Rldik7CisJa2ZyZWUoc3QtPnR4KTsKKwlrZnJlZShzdC0+cngpOworCWtmcmVlKHN0KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNwaV9kcml2ZXIgYWRpczE2MDgwX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJhZGlzMTYwODAiLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwl9LAorCS5wcm9iZSA9IGFkaXMxNjA4MF9wcm9iZSwKKwkucmVtb3ZlID0gX19kZXZleGl0X3AoYWRpczE2MDgwX3JlbW92ZSksCit9OworCitzdGF0aWMgX19pbml0IGludCBhZGlzMTYwODBfaW5pdCh2b2lkKQoreworCXJldHVybiBzcGlfcmVnaXN0ZXJfZHJpdmVyKCZhZGlzMTYwODBfZHJpdmVyKTsKK30KK21vZHVsZV9pbml0KGFkaXMxNjA4MF9pbml0KTsKKworc3RhdGljIF9fZXhpdCB2b2lkIGFkaXMxNjA4MF9leGl0KHZvaWQpCit7CisJc3BpX3VucmVnaXN0ZXJfZHJpdmVyKCZhZGlzMTYwODBfZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KGFkaXMxNjA4MF9leGl0KTsKKworTU9EVUxFX0FVVEhPUigiQmFycnkgU29uZyA8MjFjbmJhb0BnbWFpbC5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkFuYWxvZyBEZXZpY2VzIEFESVMxNjA4MC8xMDAgWWF3IFJhdGUgR3lyb3Njb3BlIHdpdGggU1BJIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9neXJvL2FkaXMxNjEzMC5oIGIvZHJpdmVycy9zdGFnaW5nL2lpby9neXJvL2FkaXMxNjEzMC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiODBlZjYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2d5cm8vYWRpczE2MTMwLmgKQEAgLTAsMCArMSwxMDggQEAKKyNpZm5kZWYgU1BJX0FESVMxNjEzMF9IXworI2RlZmluZSBTUElfQURJUzE2MTMwX0hfCisKKyNkZWZpbmUgQURJUzE2MTMwX0NPTiAgICAgICAgIDB4MAorI2RlZmluZSBBRElTMTYxMzBfQ09OX1JEICAgICAgKDEgPDwgNikKKyNkZWZpbmUgQURJUzE2MTMwX0lPUCAgICAgICAgIDB4MQorI2RlZmluZSBBRElTMTYxMzBfSU9QX0FMTF9SRFkgKDEgPDwgMykgLyogMSA9IGRhdGEtcmVhZHkgc2lnbmFsIGxvdyB3aGVuIHVucmVhZCBkYXRhIG9uIGFsbCBjaGFubmVsczsgKi8KKyNkZWZpbmUgQURJUzE2MTMwX0lPUF9TWU5DICAgICgxIDw8IDApIC8qIDEgPSBzeW5jaHJvbml6YXRpb24gZW5hYmxlZCAqLworI2RlZmluZSBBRElTMTYxMzBfUkFURURBVEEgICAgMHg4IC8qIEd5cm9zY29wZSBvdXRwdXQsIHJhdGUgb2Ygcm90YXRpb24gKi8KKyNkZWZpbmUgQURJUzE2MTMwX1RFTVBEQVRBICAgIDB4QSAvKiBUZW1wZXJhdHVyZSBvdXRwdXQgKi8KKyNkZWZpbmUgQURJUzE2MTMwX1JBVEVDUyAgICAgIDB4MjggLyogR3lyb3Njb3BlIGNoYW5uZWwgc2V0dXAgKi8KKyNkZWZpbmUgQURJUzE2MTMwX1JBVEVDU19FTiAgICgxIDw8IDMpIC8qIDEgPSBjaGFubmVsIGVuYWJsZTsgKi8KKyNkZWZpbmUgQURJUzE2MTMwX1RFTVBDUyAgICAgIDB4MkEgLyogVGVtcGVyYXR1cmUgY2hhbm5lbCBzZXR1cCAqLworI2RlZmluZSBBRElTMTYxMzBfVEVNUENTX0VOICAgKDEgPDwgMykKKyNkZWZpbmUgQURJUzE2MTMwX1JBVEVDT05WICAgIDB4MzAKKyNkZWZpbmUgQURJUzE2MTMwX1RFTVBDT05WICAgIDB4MzIKKyNkZWZpbmUgQURJUzE2MTMwX01PREUgICAgICAgIDB4MzgKKyNkZWZpbmUgQURJUzE2MTMwX01PREVfMjRCSVQgICgxIDw8IDEpIC8qIDEgPSAyNC1iaXQgcmVzb2x1dGlvbjsgKi8KKworI2RlZmluZSBBRElTMTYxMzBfTUFYX1RYICAgICA0CisjZGVmaW5lIEFESVMxNjEzMF9NQVhfUlggICAgIDQKKworLyoqCisgKiBzdHJ1Y3QgYWRpczE2MTMwX3N0YXRlIC0gZGV2aWNlIGluc3RhbmNlIHNwZWNpZmljIGRhdGEKKyAqIEB1czoJCQlhY3R1YWwgc3BpX2RldmljZSB0byB3cml0ZSBkYXRhCisgKiBAd29ya190cmlnZ2VyX3RvX3Jpbmc6IGJoIGZvciB0cmlnZ2VyZWQgZXZlbnQgaGFuZGxpbmcKKyAqIEBpbnRlcjoJCXVzZWQgdG8gY2hlY2sgaWYgbmV3IGludGVycnVwdCBoYXMgYmVlbiB0cmlnZ2VyZWQKKyAqIEBsYXN0X3RpbWVzdGFtcDoJcGFzc2luZyB0aW1lc3RhbXAgZnJvbSB0aCB0byBiaCBvZiBpbnRlcnJ1cHQgaGFuZGxlcgorICogQGluZGlvX2RldjoJCWluZHVzdHJpYWwgSS9PIGRldmljZSBzdHJ1Y3R1cmUKKyAqIEB0cmlnOgkJZGF0YSByZWFkeSB0cmlnZ2VyIHJlZ2lzdGVyZWQgd2l0aCBpaW8KKyAqIEB0eDoJCQl0cmFuc21pdCBidWZmZXIKKyAqIEByeDoJCQlyZWNpZXZlIGJ1ZmZlcgorICogQGJ1Zl9sb2NrOgkJbXV0ZXggdG8gcHJvdGVjdCB0eCBhbmQgcngKKyAqKi8KK3N0cnVjdCBhZGlzMTYxMzBfc3RhdGUgeworCXN0cnVjdCBzcGlfZGV2aWNlCQkqdXM7CisJc3RydWN0IHdvcmtfc3RydWN0CQl3b3JrX3RyaWdnZXJfdG9fcmluZzsKKwlzNjQJCQkJbGFzdF90aW1lc3RhbXA7CisJc3RydWN0IGlpb19kZXYJCQkqaW5kaW9fZGV2OworCXN0cnVjdCBpaW9fdHJpZ2dlcgkJKnRyaWc7CisJdTgJCQkJKnR4OworCXU4CQkJCSpyeDsKKwl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGU7IC8qIDE6IDI0Yml0cyBtb2RlIDA6MTZiaXRzIG1vZGUgKi8KKwlzdHJ1Y3QgbXV0ZXgJCQlidWZfbG9jazsKK307CisKKyNpZiBkZWZpbmVkKENPTkZJR19JSU9fUklOR19CVUZGRVIpICYmIGRlZmluZWQoVEhJU19IQVNfUklOR19CVUZGRVJfU1VQUE9SVCkKKy8qIEF0IHRoZSBtb21lbnQgdHJpZ2dlcnMgYXJlIG9ubHkgdXNlZCBmb3IgcmluZyBidWZmZXIKKyAqIGZpbGxpbmcuIFRoaXMgbWF5IGNoYW5nZSEKKyAqLworCitlbnVtIGFkaXMxNjEzMF9zY2FuIHsKKwlBRElTMTYxMzBfU0NBTl9HWVJPLAorCUFESVMxNjEzMF9TQ0FOX1RFTVAsCit9OworCit2b2lkIGFkaXMxNjEzMF9yZW1vdmVfdHJpZ2dlcihzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KTsKK2ludCBhZGlzMTYxMzBfcHJvYmVfdHJpZ2dlcihzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KTsKKworc3NpemVfdCBhZGlzMTYxMzBfcmVhZF9kYXRhX2Zyb21fcmluZyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJICAgICAgY2hhciAqYnVmKTsKKworCitpbnQgYWRpczE2MTMwX2NvbmZpZ3VyZV9yaW5nKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpOwordm9pZCBhZGlzMTYxMzBfdW5jb25maWd1cmVfcmluZyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KTsKKworaW50IGFkaXMxNjEzMF9pbml0aWFsaXplX3Jpbmcoc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqcmluZyk7Cit2b2lkIGFkaXMxNjEzMF91bmluaXRpYWxpemVfcmluZyhzdHJ1Y3QgaWlvX3JpbmdfYnVmZmVyICpyaW5nKTsKKyNlbHNlIC8qIENPTkZJR19JSU9fUklOR19CVUZGRVIgKi8KKworc3RhdGljIGlubGluZSB2b2lkIGFkaXMxNjEzMF9yZW1vdmVfdHJpZ2dlcihzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQoreworfQorCitzdGF0aWMgaW5saW5lIGludCBhZGlzMTYxMzBfcHJvYmVfdHJpZ2dlcihzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHNzaXplX3QKK2FkaXMxNjEzMF9yZWFkX2RhdGFfZnJvbV9yaW5nKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCSAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJICAgICAgY2hhciAqYnVmKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFkaXMxNjEzMF9jb25maWd1cmVfcmluZyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYWRpczE2MTMwX3VuY29uZmlndXJlX3Jpbmcoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKK3sKK30KKworc3RhdGljIGlubGluZSBpbnQgYWRpczE2MTMwX2luaXRpYWxpemVfcmluZyhzdHJ1Y3QgaWlvX3JpbmdfYnVmZmVyICpyaW5nKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYWRpczE2MTMwX3VuaW5pdGlhbGl6ZV9yaW5nKHN0cnVjdCBpaW9fcmluZ19idWZmZXIgKnJpbmcpCit7Cit9CisKKyNlbmRpZiAvKiBDT05GSUdfSUlPX1JJTkdfQlVGRkVSICovCisjZW5kaWYgLyogU1BJX0FESVMxNjEzMF9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9neXJvL2FkaXMxNjEzMF9jb3JlLmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2d5cm8vYWRpczE2MTMwX2NvcmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OWZmYzdiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9neXJvL2FkaXMxNjEzMF9jb3JlLmMKQEAgLTAsMCArMSwzMTMgQEAKKy8qCisgKiBBRElTMTYxMzAgRGlnaXRhbCBPdXRwdXQsIEhpZ2ggUHJlY2lzaW9uIEFuZ3VsYXIgUmF0ZSBTZW5zb3IgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IDIwMTAgQW5hbG9nIERldmljZXMgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorCisjaW5jbHVkZSAiLi4vaWlvLmgiCisjaW5jbHVkZSAiLi4vc3lzZnMuaCIKKyNpbmNsdWRlICJneXJvLmgiCisjaW5jbHVkZSAiLi4vYWRjL2FkYy5oIgorCisjaW5jbHVkZSAiYWRpczE2MTMwLmgiCisKKyNkZWZpbmUgRFJJVkVSX05BTUUJCSJhZGlzMTYxMzAiCisKK3N0cnVjdCBhZGlzMTYxMzBfc3RhdGUgKmFkaXMxNjEzMF9zdDsKKworaW50IGFkaXMxNjEzMF9zcGlfd3JpdGUoc3RydWN0IGRldmljZSAqZGV2LCB1OCByZWdfYWRkciwKKwkJdTggdmFsKQoreworCWludCByZXQ7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZGlzMTYxMzBfc3RhdGUgKnN0ID0gaWlvX2Rldl9nZXRfZGV2ZGF0YShpbmRpb19kZXYpOworCisJbXV0ZXhfbG9jaygmc3QtPmJ1Zl9sb2NrKTsKKwlzdC0+dHhbMF0gPSByZWdfYWRkcjsKKwlzdC0+dHhbMV0gPSB2YWw7CisKKwlyZXQgPSBzcGlfd3JpdGUoc3QtPnVzLCBzdC0+dHgsIDIpOworCW11dGV4X3VubG9jaygmc3QtPmJ1Zl9sb2NrKTsKKworCXJldHVybiByZXQ7Cit9CisKK2ludCBhZGlzMTYxMzBfc3BpX3JlYWQoc3RydWN0IGRldmljZSAqZGV2LCB1OCByZWdfYWRkciwKKwkJdTMyICp2YWwpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkaXMxNjEzMF9zdGF0ZSAqc3QgPSBpaW9fZGV2X2dldF9kZXZkYXRhKGluZGlvX2Rldik7CisKKwltdXRleF9sb2NrKCZzdC0+YnVmX2xvY2spOworCisJc3QtPnR4WzBdID0gQURJUzE2MTMwX0NPTl9SRCB8IHJlZ19hZGRyOworCWlmIChzdC0+bW9kZSkKKwkJcmV0ID0gc3BpX3JlYWQoc3QtPnVzLCBzdC0+cngsIDQpOworCWVsc2UKKwkJcmV0ID0gc3BpX3JlYWQoc3QtPnVzLCBzdC0+cngsIDMpOworCisJaWYgKHJldCA9PSAwKSB7CisJCWlmIChzdC0+bW9kZSkKKwkJCSp2YWwgPSAoc3QtPnJ4WzFdIDw8IDE2KSB8IChzdC0+cnhbMl0gPDwgOCkgfCBzdC0+cnhbM107CisJCWVsc2UKKwkJCSp2YWwgPSAoc3QtPnJ4WzFdIDw8IDgpIHwgc3QtPnJ4WzJdOworCX0KKworCW11dGV4X3VubG9jaygmc3QtPmJ1Zl9sb2NrKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkaXMxNjEzMF9neXJvX3JlYWQoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwl1MzIgdmFsOworCXNzaXplX3QgcmV0OworCisJLyogVGFrZSB0aGUgaWlvX2RldiBzdGF0dXMgbG9jayAqLworCW11dGV4X2xvY2soJmluZGlvX2Rldi0+bWxvY2spOworCXJldCA9ICBhZGlzMTYxMzBfc3BpX3JlYWQoZGV2LCBBRElTMTYxMzBfUkFURURBVEEsICZ2YWwpOworCW11dGV4X3VubG9jaygmaW5kaW9fZGV2LT5tbG9jayk7CisKKwlpZiAocmV0ID09IDApCisJCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCB2YWwpOworCWVsc2UKKwkJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QgYWRpczE2MTMwX3RlbXBfcmVhZChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXUzMiB2YWw7CisJc3NpemVfdCByZXQ7CisKKwkvKiBUYWtlIHRoZSBpaW9fZGV2IHN0YXR1cyBsb2NrICovCisJbXV0ZXhfbG9jaygmaW5kaW9fZGV2LT5tbG9jayk7CisJcmV0ID0gIGFkaXMxNjEzMF9zcGlfcmVhZChkZXYsIEFESVMxNjEzMF9URU1QREFUQSwgJnZhbCk7CisJbXV0ZXhfdW5sb2NrKCZpbmRpb19kZXYtPm1sb2NrKTsKKworCWlmIChyZXQgPT0gMCkKKwkJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHZhbCk7CisJZWxzZQorCQlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3NpemVfdCBhZGlzMTYxMzBfYml0c21vZGVfcmVhZChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZGlzMTYxMzBfc3RhdGUgKnN0ID0gaWlvX2Rldl9nZXRfZGV2ZGF0YShpbmRpb19kZXYpOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHN0LT5tb2RlKTsKK30KKworc3RhdGljIHNzaXplX3QgYWRpczE2MTMwX2JpdHNtb2RlX3dyaXRlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlpbnQgcmV0OworCWxvbmcgdmFsOworCisJcmV0ID0gc3RyaWN0X3N0cnRvbChidWYsIDE2LCAmdmFsKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3JldDsKKwlyZXQgPSBhZGlzMTYxMzBfc3BpX3dyaXRlKGRldiwgQURJUzE2MTMwX01PREUsICEhdmFsKTsKKworZXJyb3JfcmV0OgorCXJldHVybiByZXQgPyByZXQgOiBsZW47Cit9CisKK3N0YXRpYyBJSU9fREVWX0FUVFJfVEVNUF9SQVcoYWRpczE2MTMwX3RlbXBfcmVhZCk7CisKK3N0YXRpYyBJSU9fQ09OU1RfQVRUUihuYW1lLCAiYWRpczE2MTMwIik7CisKK3N0YXRpYyBJSU9fREVWX0FUVFJfR1lSTyhhZGlzMTYxMzBfZ3lyb19yZWFkLAorCQlBRElTMTYxMzBfUkFURURBVEEpOworCisjZGVmaW5lIElJT19ERVZfQVRUUl9CSVRTX01PREUoX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKQlcCisJSUlPX0RFVklDRV9BVFRSKGJpdHNfbW9kZSwgX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKQorCitzdGF0aWMgSUlPX0RFVl9BVFRSX0JJVFNfTU9ERShTX0lXVVNSIHwgU19JUlVHTywgYWRpczE2MTMwX2JpdHNtb2RlX3JlYWQsIGFkaXMxNjEzMF9iaXRzbW9kZV93cml0ZSwKKwkJCUFESVMxNjEzMF9NT0RFKTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmFkaXMxNjEzMF9ldmVudF9hdHRyaWJ1dGVzW10gPSB7CisJTlVMTAorfTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgYWRpczE2MTMwX2V2ZW50X2F0dHJpYnV0ZV9ncm91cCA9IHsKKwkuYXR0cnMgPSBhZGlzMTYxMzBfZXZlbnRfYXR0cmlidXRlcywKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICphZGlzMTYxMzBfYXR0cmlidXRlc1tdID0geworCSZpaW9fZGV2X2F0dHJfdGVtcF9yYXcuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2NvbnN0X2F0dHJfbmFtZS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfZ3lyb19yYXcuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2JpdHNfbW9kZS5kZXZfYXR0ci5hdHRyLAorCU5VTEwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGFkaXMxNjEzMF9hdHRyaWJ1dGVfZ3JvdXAgPSB7CisJLmF0dHJzID0gYWRpczE2MTMwX2F0dHJpYnV0ZXMsCit9OworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBhZGlzMTYxMzBfcHJvYmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlpbnQgcmV0LCByZWdkb25lID0gMDsKKwlzdHJ1Y3QgYWRpczE2MTMwX3N0YXRlICpzdCA9IGt6YWxsb2Moc2l6ZW9mICpzdCwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzdCkgeworCQlyZXQgPSAgLUVOT01FTTsKKwkJZ290byBlcnJvcl9yZXQ7CisJfQorCS8qIHRoaXMgaXMgb25seSB1c2VkIGZvciByZW1vdmFsIHB1cnBvc2VzICovCisJc3BpX3NldF9kcnZkYXRhKHNwaSwgc3QpOworCisJLyogQWxsb2NhdGUgdGhlIGNvbW1zIGJ1ZmZlcnMgKi8KKwlzdC0+cnggPSBremFsbG9jKHNpemVvZigqc3QtPnJ4KSpBRElTMTYxMzBfTUFYX1JYLCBHRlBfS0VSTkVMKTsKKwlpZiAoc3QtPnJ4ID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJvcl9mcmVlX3N0OworCX0KKwlzdC0+dHggPSBremFsbG9jKHNpemVvZigqc3QtPnR4KSpBRElTMTYxMzBfTUFYX1RYLCBHRlBfS0VSTkVMKTsKKwlpZiAoc3QtPnR4ID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJvcl9mcmVlX3J4OworCX0KKwlzdC0+dXMgPSBzcGk7CisJbXV0ZXhfaW5pdCgmc3QtPmJ1Zl9sb2NrKTsKKwkvKiBzZXR1cCB0aGUgaW5kdXN0cmlhbGlvIGRyaXZlciBhbGxvY2F0ZWQgZWxlbWVudHMgKi8KKwlzdC0+aW5kaW9fZGV2ID0gaWlvX2FsbG9jYXRlX2RldmljZSgpOworCWlmIChzdC0+aW5kaW9fZGV2ID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJvcl9mcmVlX3R4OworCX0KKworCXN0LT5pbmRpb19kZXYtPmRldi5wYXJlbnQgPSAmc3BpLT5kZXY7CisJc3QtPmluZGlvX2Rldi0+bnVtX2ludGVycnVwdF9saW5lcyA9IDE7CisJc3QtPmluZGlvX2Rldi0+ZXZlbnRfYXR0cnMgPSAmYWRpczE2MTMwX2V2ZW50X2F0dHJpYnV0ZV9ncm91cDsKKwlzdC0+aW5kaW9fZGV2LT5hdHRycyA9ICZhZGlzMTYxMzBfYXR0cmlidXRlX2dyb3VwOworCXN0LT5pbmRpb19kZXYtPmRldl9kYXRhID0gKHZvaWQgKikoc3QpOworCXN0LT5pbmRpb19kZXYtPmRyaXZlcl9tb2R1bGUgPSBUSElTX01PRFVMRTsKKwlzdC0+aW5kaW9fZGV2LT5tb2RlcyA9IElORElPX0RJUkVDVF9NT0RFOworCXN0LT5tb2RlID0gMTsKKworCXJldCA9IGFkaXMxNjEzMF9jb25maWd1cmVfcmluZyhzdC0+aW5kaW9fZGV2KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX2ZyZWVfZGV2OworCisJcmV0ID0gaWlvX2RldmljZV9yZWdpc3RlcihzdC0+aW5kaW9fZGV2KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3VucmVnX3JpbmdfZnVuY3M7CisJcmVnZG9uZSA9IDE7CisKKwlyZXQgPSBhZGlzMTYxMzBfaW5pdGlhbGl6ZV9yaW5nKHN0LT5pbmRpb19kZXYtPnJpbmcpOworCWlmIChyZXQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJmYWlsZWQgdG8gaW5pdGlhbGl6ZSB0aGUgcmluZ1xuIik7CisJCWdvdG8gZXJyb3JfdW5yZWdfcmluZ19mdW5jczsKKwl9CisKKwlpZiAoc3BpLT5pcnEgJiYgZ3Bpb19pc192YWxpZChpcnFfdG9fZ3BpbyhzcGktPmlycSkpID4gMCkgeworCQlyZXQgPSBpaW9fcmVnaXN0ZXJfaW50ZXJydXB0X2xpbmUoc3BpLT5pcnEsCisJCQkJc3QtPmluZGlvX2RldiwKKwkJCQkwLAorCQkJCUlSUUZfVFJJR0dFUl9SSVNJTkcsCisJCQkJImFkaXMxNjEzMCIpOworCQlpZiAocmV0KQorCQkJZ290byBlcnJvcl91bmluaXRpYWxpemVfcmluZzsKKworCQlyZXQgPSBhZGlzMTYxMzBfcHJvYmVfdHJpZ2dlcihzdC0+aW5kaW9fZGV2KTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJyb3JfdW5yZWdpc3Rlcl9saW5lOworCX0KKworCWFkaXMxNjEzMF9zdCA9IHN0OworCXJldHVybiAwOworCitlcnJvcl91bnJlZ2lzdGVyX2xpbmU6CisJaWYgKHN0LT5pbmRpb19kZXYtPm1vZGVzICYgSU5ESU9fUklOR19UUklHR0VSRUQpCisJCWlpb191bnJlZ2lzdGVyX2ludGVycnVwdF9saW5lKHN0LT5pbmRpb19kZXYsIDApOworZXJyb3JfdW5pbml0aWFsaXplX3Jpbmc6CisJYWRpczE2MTMwX3VuaW5pdGlhbGl6ZV9yaW5nKHN0LT5pbmRpb19kZXYtPnJpbmcpOworZXJyb3JfdW5yZWdfcmluZ19mdW5jczoKKwlhZGlzMTYxMzBfdW5jb25maWd1cmVfcmluZyhzdC0+aW5kaW9fZGV2KTsKK2Vycm9yX2ZyZWVfZGV2OgorCWlmIChyZWdkb25lKQorCQlpaW9fZGV2aWNlX3VucmVnaXN0ZXIoc3QtPmluZGlvX2Rldik7CisJZWxzZQorCQlpaW9fZnJlZV9kZXZpY2Uoc3QtPmluZGlvX2Rldik7CitlcnJvcl9mcmVlX3R4OgorCWtmcmVlKHN0LT50eCk7CitlcnJvcl9mcmVlX3J4OgorCWtmcmVlKHN0LT5yeCk7CitlcnJvcl9mcmVlX3N0OgorCWtmcmVlKHN0KTsKK2Vycm9yX3JldDoKKwlyZXR1cm4gcmV0OworfQorCisvKiBmaXhtZSwgY29uZmlybSBvcmRlcmluZyBpbiB0aGlzIGZ1bmN0aW9uICovCitzdGF0aWMgaW50IGFkaXMxNjEzMF9yZW1vdmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlzdHJ1Y3QgYWRpczE2MTMwX3N0YXRlICpzdCA9IHNwaV9nZXRfZHJ2ZGF0YShzcGkpOworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBzdC0+aW5kaW9fZGV2OworCisJZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKKworCWFkaXMxNjEzMF9yZW1vdmVfdHJpZ2dlcihpbmRpb19kZXYpOworCWlmIChzcGktPmlycSAmJiBncGlvX2lzX3ZhbGlkKGlycV90b19ncGlvKHNwaS0+aXJxKSkgPiAwKQorCQlpaW9fdW5yZWdpc3Rlcl9pbnRlcnJ1cHRfbGluZShpbmRpb19kZXYsIDApOworCisJYWRpczE2MTMwX3VuaW5pdGlhbGl6ZV9yaW5nKGluZGlvX2Rldi0+cmluZyk7CisJYWRpczE2MTMwX3VuY29uZmlndXJlX3JpbmcoaW5kaW9fZGV2KTsKKwlpaW9fZGV2aWNlX3VucmVnaXN0ZXIoaW5kaW9fZGV2KTsKKwlrZnJlZShzdC0+dHgpOworCWtmcmVlKHN0LT5yeCk7CisJa2ZyZWUoc3QpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3BpX2RyaXZlciBhZGlzMTYxMzBfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gImFkaXMxNjEzMCIsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCX0sCisJLnByb2JlID0gYWRpczE2MTMwX3Byb2JlLAorCS5yZW1vdmUgPSBfX2RldmV4aXRfcChhZGlzMTYxMzBfcmVtb3ZlKSwKK307CisKK3N0YXRpYyBfX2luaXQgaW50IGFkaXMxNjEzMF9pbml0KHZvaWQpCit7CisJcmV0dXJuIHNwaV9yZWdpc3Rlcl9kcml2ZXIoJmFkaXMxNjEzMF9kcml2ZXIpOworfQorbW9kdWxlX2luaXQoYWRpczE2MTMwX2luaXQpOworCitzdGF0aWMgX19leGl0IHZvaWQgYWRpczE2MTMwX2V4aXQodm9pZCkKK3sKKwlzcGlfdW5yZWdpc3Rlcl9kcml2ZXIoJmFkaXMxNjEzMF9kcml2ZXIpOworfQorbW9kdWxlX2V4aXQoYWRpczE2MTMwX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJCYXJyeSBTb25nIDwyMWNuYmFvQGdtYWlsLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiQW5hbG9nIERldmljZXMgQURJUzE2MTMwIEhpZ2ggUHJlY2lzaW9uIEFuZ3VsYXIgUmF0ZSBTZW5zb3IgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2d5cm8vYWRpczE2MjUxLmggYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2d5cm8vYWRpczE2MjUxLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDIzODUyYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vZ3lyby9hZGlzMTYyNTEuaApAQCAtMCwwICsxLDE4NSBAQAorI2lmbmRlZiBTUElfQURJUzE2MjUxX0hfCisjZGVmaW5lIFNQSV9BRElTMTYyNTFfSF8KKworI2RlZmluZSBBRElTMTYyNTFfU1RBUlRVUF9ERUxBWQkyMjAgLyogbXMgKi8KKworI2RlZmluZSBBRElTMTYyNTFfUkVBRF9SRUcoYSkgICAgYQorI2RlZmluZSBBRElTMTYyNTFfV1JJVEVfUkVHKGEpICgoYSkgfCAweDgwKQorCisjZGVmaW5lIEFESVMxNjI1MV9FTkRVUkFOQ0UgIDB4MDAgLyogRmxhc2ggbWVtb3J5IHdyaXRlIGNvdW50ICovCisjZGVmaW5lIEFESVMxNjI1MV9TVVBQTFlfT1VUIDB4MDIgLyogUG93ZXIgc3VwcGx5IG1lYXN1cmVtZW50ICovCisjZGVmaW5lIEFESVMxNjI1MV9HWVJPX09VVCAgIDB4MDQgLyogWC1heGlzIGd5cm9zY29wZSBvdXRwdXQgKi8KKyNkZWZpbmUgQURJUzE2MjUxX0FVWF9BREMgICAgMHgwQSAvKiBhbmFsb2cgaW5wdXQgY2hhbm5lbCBtZWFzdXJlbWVudCAqLworI2RlZmluZSBBRElTMTYyNTFfVEVNUF9PVVQgICAweDBDIC8qIGludGVybmFsIHRlbXBlcmF0dXJlIG1lYXN1cmVtZW50ICovCisjZGVmaW5lIEFESVMxNjI1MV9BTkdMX09VVCAgIDB4MEUgLyogYW5nbGUgZGlzcGxhY2VtZW50ICovCisjZGVmaW5lIEFESVMxNjI1MV9HWVJPX09GRiAgIDB4MTQgLyogQ2FsaWJyYXRpb24sIG9mZnNldC9iaWFzIGFkanVzdG1lbnQgKi8KKyNkZWZpbmUgQURJUzE2MjUxX0dZUk9fU0NBTEUgMHgxNiAvKiBDYWxpYnJhdGlvbiwgc2NhbGUgYWRqdXN0bWVudCAqLworI2RlZmluZSBBRElTMTYyNTFfQUxNX01BRzEgICAweDIwIC8qIEFsYXJtIDEgbWFnbml0dWRlL3BvbGFyaXR5IHNldHRpbmcgKi8KKyNkZWZpbmUgQURJUzE2MjUxX0FMTV9NQUcyICAgMHgyMiAvKiBBbGFybSAyIG1hZ25pdHVkZS9wb2xhcml0eSBzZXR0aW5nICovCisjZGVmaW5lIEFESVMxNjI1MV9BTE1fU01QTDEgIDB4MjQgLyogQWxhcm0gMSBkeW5hbWljIHJhdGUgb2YgY2hhbmdlIHNldHRpbmcgKi8KKyNkZWZpbmUgQURJUzE2MjUxX0FMTV9TTVBMMiAgMHgyNiAvKiBBbGFybSAyIGR5bmFtaWMgcmF0ZSBvZiBjaGFuZ2Ugc2V0dGluZyAqLworI2RlZmluZSBBRElTMTYyNTFfQUxNX0NUUkwgICAweDI4IC8qIEFsYXJtIGNvbnRyb2wgKi8KKyNkZWZpbmUgQURJUzE2MjUxX0FVWF9EQUMgICAgMHgzMCAvKiBBdXhpbGlhcnkgREFDIGRhdGEgKi8KKyNkZWZpbmUgQURJUzE2MjUxX0dQSU9fQ1RSTCAgMHgzMiAvKiBDb250cm9sLCBkaWdpdGFsIEkvTyBsaW5lICovCisjZGVmaW5lIEFESVMxNjI1MV9NU0NfQ1RSTCAgIDB4MzQgLyogQ29udHJvbCwgZGF0YSByZWFkeSwgc2VsZi10ZXN0IHNldHRpbmdzICovCisjZGVmaW5lIEFESVMxNjI1MV9TTVBMX1BSRCAgIDB4MzYgLyogQ29udHJvbCwgaW50ZXJuYWwgc2FtcGxlIHJhdGUgKi8KKyNkZWZpbmUgQURJUzE2MjUxX1NFTlNfQVZHICAgMHgzOCAvKiBDb250cm9sLCBkeW5hbWljIHJhbmdlLCBmaWx0ZXJpbmcgKi8KKyNkZWZpbmUgQURJUzE2MjUxX1NMUF9DTlQgICAgMHgzQSAvKiBDb250cm9sLCBzbGVlcCBtb2RlIGluaXRpYXRpb24gKi8KKyNkZWZpbmUgQURJUzE2MjUxX0RJQUdfU1RBVCAgMHgzQyAvKiBEaWFnbm9zdGljLCBlcnJvciBmbGFncyAqLworI2RlZmluZSBBRElTMTYyNTFfR0xPQl9DTUQgICAweDNFIC8qIENvbnRyb2wsIGdsb2JhbCBjb21tYW5kcyAqLworCisjZGVmaW5lIEFESVMxNjI1MV9FUlJPUl9BQ1RJVkUJCQkoMTw8MTQpCisjZGVmaW5lIEFESVMxNjI1MV9ORVdfREFUQQkJCSgxPDwxNCkKKworLyogTVNDX0NUUkwgKi8KKyNkZWZpbmUgQURJUzE2MjUxX01TQ19DVFJMX0lOVF9TRUxGX1RFU1QJKDE8PDEwKSAvKiBJbnRlcm5hbCBzZWxmLXRlc3QgZW5hYmxlICovCisjZGVmaW5lIEFESVMxNjI1MV9NU0NfQ1RSTF9ORUdfU0VMRl9URVNUCSgxPDw5KQorI2RlZmluZSBBRElTMTYyNTFfTVNDX0NUUkxfUE9TX1NFTEZfVEVTVAkoMTw8OCkKKyNkZWZpbmUgQURJUzE2MjUxX01TQ19DVFJMX0RBVEFfUkRZX0VOCQkoMTw8MikKKyNkZWZpbmUgQURJUzE2MjUxX01TQ19DVFJMX0RBVEFfUkRZX1BPTF9ISUdICSgxPDwxKQorI2RlZmluZSBBRElTMTYyNTFfTVNDX0NUUkxfREFUQV9SRFlfRElPMgkoMTw8MCkKKworLyogU01QTF9QUkQgKi8KKyNkZWZpbmUgQURJUzE2MjUxX1NNUExfUFJEX1RJTUVfQkFTRQkoMTw8NykgLyogVGltZSBiYXNlICh0Qik6IDAgPSAxLjk1MyBtcywgMSA9IDYwLjU0IG1zICovCisjZGVmaW5lIEFESVMxNjI1MV9TTVBMX1BSRF9ESVZfTUFTSwkweDdGCisKKy8qIFNMUF9DTlQgKi8KKyNkZWZpbmUgQURJUzE2MjUxX1NMUF9DTlRfUE9XRVJfT0ZGICAgICAweDgwCisKKy8qIERJQUdfU1RBVCAqLworI2RlZmluZSBBRElTMTYyNTFfRElBR19TVEFUX0FMQVJNMgkoMTw8OSkKKyNkZWZpbmUgQURJUzE2MjUxX0RJQUdfU1RBVF9BTEFSTTEJKDE8PDgpCisjZGVmaW5lIEFESVMxNjI1MV9ESUFHX1NUQVRfU0VMRl9URVNUCSgxPDw1KQorI2RlZmluZSBBRElTMTYyNTFfRElBR19TVEFUX09WRVJGTE9XCSgxPDw0KQorI2RlZmluZSBBRElTMTYyNTFfRElBR19TVEFUX1NQSV9GQUlMCSgxPDwzKQorI2RlZmluZSBBRElTMTYyNTFfRElBR19TVEFUX0ZMQVNIX1VQVAkoMTw8MikKKyNkZWZpbmUgQURJUzE2MjUxX0RJQUdfU1RBVF9QT1dFUl9ISUdICSgxPDwxKQorI2RlZmluZSBBRElTMTYyNTFfRElBR19TVEFUX1BPV0VSX0xPVwkoMTw8MCkKKworI2RlZmluZSBBRElTMTYyNTFfRElBR19TVEFUX0VSUl9NQVNLIChBRElTMTYyNTFfRElBR19TVEFUX0FMQVJNMiB8IFwKKwkJCQkgICAgICBBRElTMTYyNTFfRElBR19TVEFUX0FMQVJNMSB8IFwKKwkJCQkgICAgICBBRElTMTYyNTFfRElBR19TVEFUX1NFTEZfVEVTVCB8IFwKKwkJCQkgICAgICBBRElTMTYyNTFfRElBR19TVEFUX09WRVJGTE9XIHwgXAorCQkJCSAgICAgIEFESVMxNjI1MV9ESUFHX1NUQVRfU1BJX0ZBSUwgfCBcCisJCQkJICAgICAgQURJUzE2MjUxX0RJQUdfU1RBVF9GTEFTSF9VUFQgfCBcCisJCQkJICAgICAgQURJUzE2MjUxX0RJQUdfU1RBVF9QT1dFUl9ISUdIIHwgXAorCQkJCSAgICAgIEFESVMxNjI1MV9ESUFHX1NUQVRfUE9XRVJfTE9XKQorCisvKiBHTE9CX0NNRCAqLworI2RlZmluZSBBRElTMTYyNTFfR0xPQl9DTURfU1dfUkVTRVQJKDE8PDcpCisjZGVmaW5lIEFESVMxNjI1MV9HTE9CX0NNRF9GTEFTSF9VUEQJKDE8PDMpCisjZGVmaW5lIEFESVMxNjI1MV9HTE9CX0NNRF9EQUNfTEFUQ0gJKDE8PDIpCisjZGVmaW5lIEFESVMxNjI1MV9HTE9CX0NNRF9GQUNfQ0FMSUIJKDE8PDEpCisjZGVmaW5lIEFESVMxNjI1MV9HTE9CX0NNRF9BVVRPX05VTEwJKDE8PDApCisKKyNkZWZpbmUgQURJUzE2MjUxX01BWF9UWCAyNAorI2RlZmluZSBBRElTMTYyNTFfTUFYX1JYIDI0CisKKyNkZWZpbmUgQURJUzE2MjUxX1NQSV9TTE9XCSh1MzIpKDMwMCAqIDEwMDApCisjZGVmaW5lIEFESVMxNjI1MV9TUElfQlVSU1QJKHUzMikoMTAwMCAqIDEwMDApCisjZGVmaW5lIEFESVMxNjI1MV9TUElfRkFTVAkodTMyKSgyMDAwICogMTAwMCkKKworLyoqCisgKiBzdHJ1Y3QgYWRpczE2MjUxX3N0YXRlIC0gZGV2aWNlIGluc3RhbmNlIHNwZWNpZmljIGRhdGEKKyAqIEB1czoJCQlhY3R1YWwgc3BpX2RldmljZQorICogQHdvcmtfdHJpZ2dlcl90b19yaW5nOiBiaCBmb3IgdHJpZ2dlcmVkIGV2ZW50IGhhbmRsaW5nCisgKiBAaW50ZXI6CQl1c2VkIHRvIGNoZWNrIGlmIG5ldyBpbnRlcnJ1cHQgaGFzIGJlZW4gdHJpZ2dlcmVkCisgKiBAbGFzdF90aW1lc3RhbXA6CXBhc3NpbmcgdGltZXN0YW1wIGZyb20gdGggdG8gYmggb2YgaW50ZXJydXB0IGhhbmRsZXIKKyAqIEBpbmRpb19kZXY6CQlpbmR1c3RyaWFsIEkvTyBkZXZpY2Ugc3RydWN0dXJlCisgKiBAdHJpZzoJCWRhdGEgcmVhZHkgdHJpZ2dlciByZWdpc3RlcmVkIHdpdGggaWlvCisgKiBAdHg6CQkJdHJhbnNtaXQgYnVmZmVyCisgKiBAcng6CQkJcmVjaWV2ZSBidWZmZXIKKyAqIEBidWZfbG9jazoJCW11dGV4IHRvIHByb3RlY3QgdHggYW5kIHJ4CisgKiovCitzdHJ1Y3QgYWRpczE2MjUxX3N0YXRlIHsKKwlzdHJ1Y3Qgc3BpX2RldmljZQkJKnVzOworCXN0cnVjdCB3b3JrX3N0cnVjdAkJd29ya190cmlnZ2VyX3RvX3Jpbmc7CisJczY0CQkJCWxhc3RfdGltZXN0YW1wOworCXN0cnVjdCBpaW9fZGV2CQkJKmluZGlvX2RldjsKKwlzdHJ1Y3QgaWlvX3RyaWdnZXIJCSp0cmlnOworCXU4CQkJCSp0eDsKKwl1OAkJCQkqcng7CisJc3RydWN0IG11dGV4CQkJYnVmX2xvY2s7Cit9OworCitpbnQgYWRpczE2MjUxX3NwaV93cml0ZV9yZWdfOChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgICAgICB1OCByZWdfYWRkcmVzcywKKwkJCSAgICAgIHU4IHZhbCk7CisKK2ludCBhZGlzMTYyNTFfc3BpX3JlYWRfYnVyc3Qoc3RydWN0IGRldmljZSAqZGV2LCB1OCAqcngpOworCitpbnQgYWRpczE2MjUxX3NwaV9yZWFkX3NlcXVlbmNlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgICAgICB1OCAqdHgsIHU4ICpyeCwgaW50IG51bSk7CisKK2ludCBhZGlzMTYyNTFfc2V0X2lycShzdHJ1Y3QgZGV2aWNlICpkZXYsIGJvb2wgZW5hYmxlKTsKKworaW50IGFkaXMxNjI1MV9yZXNldChzdHJ1Y3QgZGV2aWNlICpkZXYpOworCitpbnQgYWRpczE2MjUxX3N0b3BfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldik7CisKK2ludCBhZGlzMTYyNTFfY2hlY2tfc3RhdHVzKHN0cnVjdCBkZXZpY2UgKmRldik7CisKKyNpZiBkZWZpbmVkKENPTkZJR19JSU9fUklOR19CVUZGRVIpICYmIGRlZmluZWQoVEhJU19IQVNfUklOR19CVUZGRVJfU1VQUE9SVCkKKy8qIEF0IHRoZSBtb21lbnQgdHJpZ2dlcnMgYXJlIG9ubHkgdXNlZCBmb3IgcmluZyBidWZmZXIKKyAqIGZpbGxpbmcuIFRoaXMgbWF5IGNoYW5nZSEKKyAqLworCitlbnVtIGFkaXMxNjI1MV9zY2FuIHsKKwlBRElTMTYyNTFfU0NBTl9TVVBQTFksCisJQURJUzE2MjUxX1NDQU5fR1lSTywKKwlBRElTMTYyNTFfU0NBTl9URU1QLAorCUFESVMxNjI1MV9TQ0FOX0FEQ18wLAorfTsKKwordm9pZCBhZGlzMTYyNTFfcmVtb3ZlX3RyaWdnZXIoc3RydWN0IGlpb19kZXYgKmluZGlvX2Rldik7CitpbnQgYWRpczE2MjUxX3Byb2JlX3RyaWdnZXIoc3RydWN0IGlpb19kZXYgKmluZGlvX2Rldik7CisKK3NzaXplX3QgYWRpczE2MjUxX3JlYWRfZGF0YV9mcm9tX3Jpbmcoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCSAgICAgIGNoYXIgKmJ1Zik7CisKKworaW50IGFkaXMxNjI1MV9jb25maWd1cmVfcmluZyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KTsKK3ZvaWQgYWRpczE2MjUxX3VuY29uZmlndXJlX3Jpbmcoc3RydWN0IGlpb19kZXYgKmluZGlvX2Rldik7CisKK2ludCBhZGlzMTYyNTFfaW5pdGlhbGl6ZV9yaW5nKHN0cnVjdCBpaW9fcmluZ19idWZmZXIgKnJpbmcpOwordm9pZCBhZGlzMTYyNTFfdW5pbml0aWFsaXplX3Jpbmcoc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqcmluZyk7CisjZWxzZSAvKiBDT05GSUdfSUlPX1JJTkdfQlVGRkVSICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhZGlzMTYyNTFfcmVtb3ZlX3RyaWdnZXIoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKK3sKK30KKworc3RhdGljIGlubGluZSBpbnQgYWRpczE2MjUxX3Byb2JlX3RyaWdnZXIoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBzc2l6ZV90CithZGlzMTYyNTFfcmVhZF9kYXRhX2Zyb21fcmluZyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgICAgIGNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhZGlzMTYyNTFfY29uZmlndXJlX3Jpbmcoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGFkaXMxNjI1MV91bmNvbmZpZ3VyZV9yaW5nKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCit7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGFkaXMxNjI1MV9pbml0aWFsaXplX3Jpbmcoc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqcmluZykKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGFkaXMxNjI1MV91bmluaXRpYWxpemVfcmluZyhzdHJ1Y3QgaWlvX3JpbmdfYnVmZmVyICpyaW5nKQoreworfQorCisjZW5kaWYgLyogQ09ORklHX0lJT19SSU5HX0JVRkZFUiAqLworI2VuZGlmIC8qIFNQSV9BRElTMTYyNTFfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vZ3lyby9hZGlzMTYyNTFfY29yZS5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9neXJvL2FkaXMxNjI1MV9jb3JlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTBkNDAwZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vZ3lyby9hZGlzMTYyNTFfY29yZS5jCkBAIC0wLDAgKzEsNzc3IEBACisvKgorICogQURJUzE2MjUxIFByb2dyYW1tYWJsZSBEaWdpdGFsIEd5cm9zY29wZSBTZW5zb3IgRHJpdmVyCisgKgorICogQ29weXJpZ2h0IDIwMTAgQW5hbG9nIERldmljZXMgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorCisjaW5jbHVkZSAiLi4vaWlvLmgiCisjaW5jbHVkZSAiLi4vc3lzZnMuaCIKKyNpbmNsdWRlICJneXJvLmgiCisjaW5jbHVkZSAiLi4vYWRjL2FkYy5oIgorCisjaW5jbHVkZSAiYWRpczE2MjUxLmgiCisKKyNkZWZpbmUgRFJJVkVSX05BTUUJCSJhZGlzMTYyNTEiCisKKy8qIEF0IHRoZSBtb21lbnQgdGhlIHNwaSBmcmFtZXdvcmsgZG9lc24ndCBhbGxvdyBnbG9iYWwgc2V0dGluZyBvZiBjc19jaGFuZ2UuCisgKiBJdCdzIGluIHRoZSBsaWtlbHkgdG8gYmUgYWRkZWQgY29tbWVudCBhdCB0aGUgdG9wIG9mIHNwaS5oLgorICogVGhpcyBtZWFucyB0aGF0IHVzZSBjYW5ub3QgYmUgbWFkZSBvZiBzcGlfd3JpdGUgZXRjLgorICovCisKKy8qKgorICogYWRpczE2MjUxX3NwaV93cml0ZV9yZWdfOCgpIC0gd3JpdGUgc2luZ2xlIGJ5dGUgdG8gYSByZWdpc3RlcgorICogQGRldjogZGV2aWNlIGFzc29jaWF0ZWQgd2l0aCBjaGlsZCBvZiBhY3R1YWwgZGV2aWNlIChpaW9fZGV2IG9yIGlpb190cmlnKQorICogQHJlZ19hZGRyZXNzOiB0aGUgYWRkcmVzcyBvZiB0aGUgcmVnaXN0ZXIgdG8gYmUgd3JpdHRlbgorICogQHZhbDogdGhlIHZhbHVlIHRvIHdyaXRlCisgKiovCitpbnQgYWRpczE2MjUxX3NwaV93cml0ZV9yZWdfOChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXU4IHJlZ19hZGRyZXNzLAorCQl1OCB2YWwpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkaXMxNjI1MV9zdGF0ZSAqc3QgPSBpaW9fZGV2X2dldF9kZXZkYXRhKGluZGlvX2Rldik7CisKKwltdXRleF9sb2NrKCZzdC0+YnVmX2xvY2spOworCXN0LT50eFswXSA9IEFESVMxNjI1MV9XUklURV9SRUcocmVnX2FkZHJlc3MpOworCXN0LT50eFsxXSA9IHZhbDsKKworCXJldCA9IHNwaV93cml0ZShzdC0+dXMsIHN0LT50eCwgMik7CisJbXV0ZXhfdW5sb2NrKCZzdC0+YnVmX2xvY2spOworCisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBhZGlzMTYyNTFfc3BpX3dyaXRlX3JlZ18xNigpIC0gd3JpdGUgMiBieXRlcyB0byBhIHBhaXIgb2YgcmVnaXN0ZXJzCisgKiBAZGV2OiBkZXZpY2UgYXNzb2NpYXRlZCB3aXRoIGNoaWxkIG9mIGFjdHVhbCBkZXZpY2UgKGlpb19kZXYgb3IgaWlvX3RyaWcpCisgKiBAcmVnX2FkZHJlc3M6IHRoZSBhZGRyZXNzIG9mIHRoZSBsb3dlciBvZiB0aGUgdHdvIHJlZ2lzdGVycy4gU2Vjb25kIHJlZ2lzdGVyCisgKiAgICAgICAgICAgICAgIGlzIGFzc3VtZWQgdG8gaGF2ZSBhZGRyZXNzIG9uZSBncmVhdGVyLgorICogQHZhbDogdmFsdWUgdG8gYmUgd3JpdHRlbgorICoqLworc3RhdGljIGludCBhZGlzMTYyNTFfc3BpX3dyaXRlX3JlZ18xNihzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXU4IGxvd2VyX3JlZ19hZGRyZXNzLAorCQl1MTYgdmFsdWUpCit7CisJaW50IHJldDsKKwlzdHJ1Y3Qgc3BpX21lc3NhZ2UgbXNnOworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWRpczE2MjUxX3N0YXRlICpzdCA9IGlpb19kZXZfZ2V0X2RldmRhdGEoaW5kaW9fZGV2KTsKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyIHhmZXJzW10gPSB7CisJCXsKKwkJCS50eF9idWYgPSBzdC0+dHgsCisJCQkuYml0c19wZXJfd29yZCA9IDgsCisJCQkubGVuID0gMiwKKwkJCS5jc19jaGFuZ2UgPSAxLAorCQl9LCB7CisJCQkudHhfYnVmID0gc3QtPnR4ICsgMiwKKwkJCS5iaXRzX3Blcl93b3JkID0gOCwKKwkJCS5sZW4gPSAyLAorCQkJLmNzX2NoYW5nZSA9IDEsCisJCX0sCisJfTsKKworCW11dGV4X2xvY2soJnN0LT5idWZfbG9jayk7CisJc3QtPnR4WzBdID0gQURJUzE2MjUxX1dSSVRFX1JFRyhsb3dlcl9yZWdfYWRkcmVzcyk7CisJc3QtPnR4WzFdID0gdmFsdWUgJiAweEZGOworCXN0LT50eFsyXSA9IEFESVMxNjI1MV9XUklURV9SRUcobG93ZXJfcmVnX2FkZHJlc3MgKyAxKTsKKwlzdC0+dHhbM10gPSAodmFsdWUgPj4gOCkgJiAweEZGOworCisJc3BpX21lc3NhZ2VfaW5pdCgmbXNnKTsKKwlzcGlfbWVzc2FnZV9hZGRfdGFpbCgmeGZlcnNbMF0sICZtc2cpOworCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZ4ZmVyc1sxXSwgJm1zZyk7CisJcmV0ID0gc3BpX3N5bmMoc3QtPnVzLCAmbXNnKTsKKwltdXRleF91bmxvY2soJnN0LT5idWZfbG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIGFkaXMxNjI1MV9zcGlfcmVhZF9yZWdfMTYoKSAtIHJlYWQgMiBieXRlcyBmcm9tIGEgMTYtYml0IHJlZ2lzdGVyCisgKiBAZGV2OiBkZXZpY2UgYXNzb2NpYXRlZCB3aXRoIGNoaWxkIG9mIGFjdHVhbCBkZXZpY2UgKGlpb19kZXYgb3IgaWlvX3RyaWcpCisgKiBAcmVnX2FkZHJlc3M6IHRoZSBhZGRyZXNzIG9mIHRoZSBsb3dlciBvZiB0aGUgdHdvIHJlZ2lzdGVycy4gU2Vjb25kIHJlZ2lzdGVyCisgKiAgICAgICAgICAgICAgIGlzIGFzc3VtZWQgdG8gaGF2ZSBhZGRyZXNzIG9uZSBncmVhdGVyLgorICogQHZhbDogc29tZXdoZXJlIHRvIHBhc3MgYmFjayB0aGUgdmFsdWUgcmVhZAorICoqLworc3RhdGljIGludCBhZGlzMTYyNTFfc3BpX3JlYWRfcmVnXzE2KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJdTggbG93ZXJfcmVnX2FkZHJlc3MsCisJCXUxNiAqdmFsKQoreworCXN0cnVjdCBzcGlfbWVzc2FnZSBtc2c7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZGlzMTYyNTFfc3RhdGUgKnN0ID0gaWlvX2Rldl9nZXRfZGV2ZGF0YShpbmRpb19kZXYpOworCWludCByZXQ7CisJc3RydWN0IHNwaV90cmFuc2ZlciB4ZmVyc1tdID0geworCQl7CisJCQkudHhfYnVmID0gc3QtPnR4LAorCQkJLmJpdHNfcGVyX3dvcmQgPSA4LAorCQkJLmxlbiA9IDIsCisJCQkuY3NfY2hhbmdlID0gMSwKKwkJfSwgeworCQkJLnJ4X2J1ZiA9IHN0LT5yeCwKKwkJCS5iaXRzX3Blcl93b3JkID0gOCwKKwkJCS5sZW4gPSAyLAorCQkJLmNzX2NoYW5nZSA9IDEsCisJCX0sCisJfTsKKworCW11dGV4X2xvY2soJnN0LT5idWZfbG9jayk7CisJc3QtPnR4WzBdID0gQURJUzE2MjUxX1JFQURfUkVHKGxvd2VyX3JlZ19hZGRyZXNzKTsKKwlzdC0+dHhbMV0gPSAwOworCXN0LT50eFsyXSA9IDA7CisJc3QtPnR4WzNdID0gMDsKKworCXNwaV9tZXNzYWdlX2luaXQoJm1zZyk7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnhmZXJzWzBdLCAmbXNnKTsKKwlzcGlfbWVzc2FnZV9hZGRfdGFpbCgmeGZlcnNbMV0sICZtc2cpOworCXJldCA9IHNwaV9zeW5jKHN0LT51cywgJm1zZyk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZzdC0+dXMtPmRldiwgInByb2JsZW0gd2hlbiByZWFkaW5nIDE2IGJpdCByZWdpc3RlciAweCUwMlgiLAorCQkJCWxvd2VyX3JlZ19hZGRyZXNzKTsKKwkJZ290byBlcnJvcl9yZXQ7CisJfQorCSp2YWwgPSAoc3QtPnJ4WzBdIDw8IDgpIHwgc3QtPnJ4WzFdOworCitlcnJvcl9yZXQ6CisJbXV0ZXhfdW5sb2NrKCZzdC0+YnVmX2xvY2spOworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogYWRpczE2MjUxX3NwaV9yZWFkX2J1cnN0KCkgLSByZWFkIGFsbCBkYXRhIHJlZ2lzdGVycworICogQGRldjogZGV2aWNlIGFzc29jaWF0ZWQgd2l0aCBjaGlsZCBvZiBhY3R1YWwgZGV2aWNlIChpaW9fZGV2IG9yIGlpb190cmlnKQorICogQHJ4OiBzb21ld2hlcmUgdG8gcGFzcyBiYWNrIHRoZSB2YWx1ZSByZWFkIChtaW4gc2l6ZSBpcyAyNCBieXRlcykKKyAqKi8KK2ludCBhZGlzMTYyNTFfc3BpX3JlYWRfYnVyc3Qoc3RydWN0IGRldmljZSAqZGV2LCB1OCAqcngpCit7CisJc3RydWN0IHNwaV9tZXNzYWdlIG1zZzsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkaXMxNjI1MV9zdGF0ZSAqc3QgPSBpaW9fZGV2X2dldF9kZXZkYXRhKGluZGlvX2Rldik7CisJdTMyIG9sZF9zcGVlZF9oeiA9IHN0LT51cy0+bWF4X3NwZWVkX2h6OworCWludCByZXQ7CisKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyIHhmZXJzW10gPSB7CisJCXsKKwkJCS50eF9idWYgPSBzdC0+dHgsCisJCQkuYml0c19wZXJfd29yZCA9IDgsCisJCQkubGVuID0gMiwKKwkJCS5jc19jaGFuZ2UgPSAwLAorCQl9LCB7CisJCQkucnhfYnVmID0gcngsCisJCQkuYml0c19wZXJfd29yZCA9IDgsCisJCQkubGVuID0gMjQsCisJCQkuY3NfY2hhbmdlID0gMSwKKwkJfSwKKwl9OworCisJbXV0ZXhfbG9jaygmc3QtPmJ1Zl9sb2NrKTsKKwlzdC0+dHhbMF0gPSBBRElTMTYyNTFfUkVBRF9SRUcoQURJUzE2MjUxX0dMT0JfQ01EKTsKKwlzdC0+dHhbMV0gPSAwOworCisJc3BpX21lc3NhZ2VfaW5pdCgmbXNnKTsKKwlzcGlfbWVzc2FnZV9hZGRfdGFpbCgmeGZlcnNbMF0sICZtc2cpOworCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZ4ZmVyc1sxXSwgJm1zZyk7CisKKwlzdC0+dXMtPm1heF9zcGVlZF9oeiA9IG1pbihBRElTMTYyNTFfU1BJX0JVUlNULCBvbGRfc3BlZWRfaHopOworCXNwaV9zZXR1cChzdC0+dXMpOworCisJcmV0ID0gc3BpX3N5bmMoc3QtPnVzLCAmbXNnKTsKKwlpZiAocmV0KQorCQlkZXZfZXJyKCZzdC0+dXMtPmRldiwgInByb2JsZW0gd2hlbiBidXJzdCByZWFkaW5nIik7CisKKwlzdC0+dXMtPm1heF9zcGVlZF9oeiA9IG9sZF9zcGVlZF9oejsKKwlzcGlfc2V0dXAoc3QtPnVzKTsKKwltdXRleF91bmxvY2soJnN0LT5idWZfbG9jayk7CisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBhZGlzMTYyNTFfc3BpX3JlYWRfc2VxdWVuY2UoKSAtIHJlYWQgYSBzZXF1ZW5jZSBvZiAxNi1iaXQgcmVnaXN0ZXJzCisgKiBAZGV2OiBkZXZpY2UgYXNzb2NpYXRlZCB3aXRoIGNoaWxkIG9mIGFjdHVhbCBkZXZpY2UgKGlpb19kZXYgb3IgaWlvX3RyaWcpCisgKiBAdHg6IHJlZ2lzdGVyIGFkZHJlc3NlcyBpbiBieXRlcyAwLDIsNCw2Li4uIChtaW4gc2l6ZSBpcyAyKm51bSBieXRlcykKKyAqIEByeDogc29tZXdoZXJlIHRvIHBhc3MgYmFjayB0aGUgdmFsdWUgcmVhZCAobWluIHNpemUgaXMgMipudW0gYnl0ZXMpCisgKiovCitpbnQgYWRpczE2MjUxX3NwaV9yZWFkX3NlcXVlbmNlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJdTggKnR4LCB1OCAqcngsIGludCBudW0pCit7CisJc3RydWN0IHNwaV9tZXNzYWdlIG1zZzsKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp4ZmVyczsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkaXMxNjI1MV9zdGF0ZSAqc3QgPSBpaW9fZGV2X2dldF9kZXZkYXRhKGluZGlvX2Rldik7CisJaW50IHJldCwgaTsKKworCXhmZXJzID0ga3phbGxvYyhudW0gKyAxLCBHRlBfS0VSTkVMKTsKKwlpZiAoeGZlcnMgPT0gTlVMTCkgeworCQlkZXZfZXJyKCZzdC0+dXMtPmRldiwgIm1lbW9yeSBhbGxvYyBmYWlsZWQiKTsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJvcl9yZXQ7CisJfQorCisJLyogdHg6IHxhZGQxfGFkZHIyfGFkZHIzfC4uLnxhZGRyTiB8emVyb3wKKwkgKiByeDogfHplcm98cmVzMSB8cmVzMiB8Li4ufHJlc04tMXxyZXNOfCAqLworCXNwaV9tZXNzYWdlX2luaXQoJm1zZyk7CisJZm9yIChpID0gMDsgaSA8IG51bSArIDE7IGkrKykgeworCQlpZiAoaSA+IDApCisJCQl4ZmVyc1tpXS5yeF9idWYgPSBzdC0+cnggKyAyKihpIC0gMSk7CisJCWlmIChpIDwgbnVtKQorCQkJeGZlcnNbaV0udHhfYnVmID0gc3QtPnR4ICsgMippOworCQl4ZmVyc1tpXS5iaXRzX3Blcl93b3JkID0gODsKKwkJeGZlcnNbaV0ubGVuID0gMjsKKwkJeGZlcnNbaV0uY3NfY2hhbmdlID0gMTsKKwkJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnhmZXJzW2ldLCAmbXNnKTsKKwl9CisKKwltdXRleF9sb2NrKCZzdC0+YnVmX2xvY2spOworCisJcmV0ID0gc3BpX3N5bmMoc3QtPnVzLCAmbXNnKTsKKwlpZiAocmV0KQorCQlkZXZfZXJyKCZzdC0+dXMtPmRldiwgInByb2JsZW0gd2hlbiByZWFkaW5nIHNlcXVlbmNlIik7CisKKwltdXRleF91bmxvY2soJnN0LT5idWZfbG9jayk7CisJa2ZyZWUoeGZlcnMpOworCitlcnJvcl9yZXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QgYWRpczE2MjUxX3NwaV9yZWFkX3NpZ25lZChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYsCisJCXVuc2lnbmVkIGJpdHMpCit7CisJaW50IHJldDsKKwlzMTYgdmFsID0gMDsKKwl1bnNpZ25lZCBzaGlmdCA9IDE2IC0gYml0czsKKwlzdHJ1Y3QgaWlvX2Rldl9hdHRyICp0aGlzX2F0dHIgPSB0b19paW9fZGV2X2F0dHIoYXR0cik7CisKKwlyZXQgPSBhZGlzMTYyNTFfc3BpX3JlYWRfcmVnXzE2KGRldiwgdGhpc19hdHRyLT5hZGRyZXNzLCAodTE2ICopJnZhbCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWlmICh2YWwgJiBBRElTMTYyNTFfRVJST1JfQUNUSVZFKQorCQlhZGlzMTYyNTFfY2hlY2tfc3RhdHVzKGRldik7CisJdmFsID0gKChzMTYpKHZhbCA8PCBzaGlmdCkgPj4gc2hpZnQpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCB2YWwpOworfQorCitzdGF0aWMgc3NpemVfdCBhZGlzMTYyNTFfcmVhZF8xMmJpdF91bnNpZ25lZChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJaW50IHJldDsKKwl1MTYgdmFsID0gMDsKKwlzdHJ1Y3QgaWlvX2Rldl9hdHRyICp0aGlzX2F0dHIgPSB0b19paW9fZGV2X2F0dHIoYXR0cik7CisKKwlyZXQgPSBhZGlzMTYyNTFfc3BpX3JlYWRfcmVnXzE2KGRldiwgdGhpc19hdHRyLT5hZGRyZXNzLCAmdmFsKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJaWYgKHZhbCAmIEFESVMxNjI1MV9FUlJPUl9BQ1RJVkUpCisJCWFkaXMxNjI1MV9jaGVja19zdGF0dXMoZGV2KTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCB2YWwgJiAweDBGRkYpOworfQorCitzdGF0aWMgc3NpemVfdCBhZGlzMTYyNTFfcmVhZF8xNGJpdF9zaWduZWQoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzc2l6ZV90IHJldDsKKworCS8qIFRha2UgdGhlIGlpb19kZXYgc3RhdHVzIGxvY2sgKi8KKwltdXRleF9sb2NrKCZpbmRpb19kZXYtPm1sb2NrKTsKKwlyZXQgPSAgYWRpczE2MjUxX3NwaV9yZWFkX3NpZ25lZChkZXYsIGF0dHIsIGJ1ZiwgMTQpOworCW11dGV4X3VubG9jaygmaW5kaW9fZGV2LT5tbG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3NpemVfdCBhZGlzMTYyNTFfcmVhZF8xMmJpdF9zaWduZWQoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzc2l6ZV90IHJldDsKKworCS8qIFRha2UgdGhlIGlpb19kZXYgc3RhdHVzIGxvY2sgKi8KKwltdXRleF9sb2NrKCZpbmRpb19kZXYtPm1sb2NrKTsKKwlyZXQgPSAgYWRpczE2MjUxX3NwaV9yZWFkX3NpZ25lZChkZXYsIGF0dHIsIGJ1ZiwgMTIpOworCW11dGV4X3VubG9jaygmaW5kaW9fZGV2LT5tbG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3NpemVfdCBhZGlzMTYyNTFfd3JpdGVfMTZiaXQoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgbGVuKQoreworCXN0cnVjdCBpaW9fZGV2X2F0dHIgKnRoaXNfYXR0ciA9IHRvX2lpb19kZXZfYXR0cihhdHRyKTsKKwlpbnQgcmV0OworCWxvbmcgdmFsOworCisJcmV0ID0gc3RyaWN0X3N0cnRvbChidWYsIDEwLCAmdmFsKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3JldDsKKwlyZXQgPSBhZGlzMTYyNTFfc3BpX3dyaXRlX3JlZ18xNihkZXYsIHRoaXNfYXR0ci0+YWRkcmVzcywgdmFsKTsKKworZXJyb3JfcmV0OgorCXJldHVybiByZXQgPyByZXQgOiBsZW47Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkaXMxNjI1MV9yZWFkX2ZyZXF1ZW5jeShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJaW50IHJldCwgbGVuID0gMDsKKwl1MTYgdDsKKwlpbnQgc3BzOworCXJldCA9IGFkaXMxNjI1MV9zcGlfcmVhZF9yZWdfMTYoZGV2LAorCQkJQURJUzE2MjUxX1NNUExfUFJELAorCQkJJnQpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisJc3BzID0gICh0ICYgQURJUzE2MjUxX1NNUExfUFJEX1RJTUVfQkFTRSkgPyA4IDogMjU2OworCXNwcyAvPSAodCAmIEFESVMxNjI1MV9TTVBMX1BSRF9ESVZfTUFTSykgKyAxOworCWxlbiA9IHNwcmludGYoYnVmLCAiJWQgU1BTXG4iLCBzcHMpOworCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkaXMxNjI1MV93cml0ZV9mcmVxdWVuY3koc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgbGVuKQoreworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWRpczE2MjUxX3N0YXRlICpzdCA9IGlpb19kZXZfZ2V0X2RldmRhdGEoaW5kaW9fZGV2KTsKKwlsb25nIHZhbDsKKwlpbnQgcmV0OworCXU4IHQ7CisKKwlyZXQgPSBzdHJpY3Rfc3RydG9sKGJ1ZiwgMTAsICZ2YWwpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwltdXRleF9sb2NrKCZpbmRpb19kZXYtPm1sb2NrKTsKKworCXQgPSAoMjU2IC8gdmFsKTsKKwlpZiAodCA+IDApCisJCXQtLTsKKwl0ICY9IEFESVMxNjI1MV9TTVBMX1BSRF9ESVZfTUFTSzsKKwlpZiAoKHQgJiBBRElTMTYyNTFfU01QTF9QUkRfRElWX01BU0spID49IDB4MEEpCisJCXN0LT51cy0+bWF4X3NwZWVkX2h6ID0gQURJUzE2MjUxX1NQSV9TTE9XOworCWVsc2UKKwkJc3QtPnVzLT5tYXhfc3BlZWRfaHogPSBBRElTMTYyNTFfU1BJX0ZBU1Q7CisKKwlyZXQgPSBhZGlzMTYyNTFfc3BpX3dyaXRlX3JlZ184KGRldiwKKwkJCUFESVMxNjI1MV9TTVBMX1BSRCwKKwkJCXQpOworCisJbXV0ZXhfdW5sb2NrKCZpbmRpb19kZXYtPm1sb2NrKTsKKworCXJldHVybiByZXQgPyByZXQgOiBsZW47Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkaXMxNjI1MV93cml0ZV9yZXNldChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBsZW4pCit7CisJaWYgKGxlbiA8IDEpCisJCXJldHVybiAtMTsKKwlzd2l0Y2ggKGJ1ZlswXSkgeworCWNhc2UgJzEnOgorCWNhc2UgJ3knOgorCWNhc2UgJ1knOgorCQlyZXR1cm4gYWRpczE2MjUxX3Jlc2V0KGRldik7CisJfQorCXJldHVybiAtMTsKK30KKworCisKK2ludCBhZGlzMTYyNTFfc2V0X2lycShzdHJ1Y3QgZGV2aWNlICpkZXYsIGJvb2wgZW5hYmxlKQoreworCWludCByZXQ7CisJdTE2IG1zYzsKKwlyZXQgPSBhZGlzMTYyNTFfc3BpX3JlYWRfcmVnXzE2KGRldiwgQURJUzE2MjUxX01TQ19DVFJMLCAmbXNjKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3JldDsKKworCW1zYyB8PSBBRElTMTYyNTFfTVNDX0NUUkxfREFUQV9SRFlfUE9MX0hJR0g7CisJaWYgKGVuYWJsZSkKKwkJbXNjIHw9IEFESVMxNjI1MV9NU0NfQ1RSTF9EQVRBX1JEWV9FTjsKKwllbHNlCisJCW1zYyAmPSB+QURJUzE2MjUxX01TQ19DVFJMX0RBVEFfUkRZX0VOOworCisJcmV0ID0gYWRpczE2MjUxX3NwaV93cml0ZV9yZWdfMTYoZGV2LCBBRElTMTYyNTFfTVNDX0NUUkwsIG1zYyk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9yZXQ7CisKK2Vycm9yX3JldDoKKwlyZXR1cm4gcmV0OworfQorCitpbnQgYWRpczE2MjUxX3Jlc2V0KHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlpbnQgcmV0OworCXJldCA9IGFkaXMxNjI1MV9zcGlfd3JpdGVfcmVnXzgoZGV2LAorCQkJQURJUzE2MjUxX0dMT0JfQ01ELAorCQkJQURJUzE2MjUxX0dMT0JfQ01EX1NXX1JFU0VUKTsKKwlpZiAocmV0KQorCQlkZXZfZXJyKGRldiwgInByb2JsZW0gcmVzZXR0aW5nIGRldmljZSIpOworCisJcmV0dXJuIHJldDsKK30KKworLyogUG93ZXIgZG93biB0aGUgZGV2aWNlICovCitpbnQgYWRpczE2MjUxX3N0b3BfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlpbnQgcmV0OworCXUxNiB2YWwgPSBBRElTMTYyNTFfU0xQX0NOVF9QT1dFUl9PRkY7CisKKwlyZXQgPSBhZGlzMTYyNTFfc3BpX3dyaXRlX3JlZ18xNihkZXYsIEFESVMxNjI1MV9TTFBfQ05ULCB2YWwpOworCWlmIChyZXQpCisJCWRldl9lcnIoZGV2LCAicHJvYmxlbSB3aXRoIHR1cm5pbmcgZGV2aWNlIG9mZjogU0xQX0NOVCIpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhZGlzMTYyNTFfc2VsZl90ZXN0KHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gYWRpczE2MjUxX3NwaV93cml0ZV9yZWdfMTYoZGV2LAorCQkJQURJUzE2MjUxX01TQ19DVFJMLAorCQkJQURJUzE2MjUxX01TQ19DVFJMX0lOVF9TRUxGX1RFU1QpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihkZXYsICJwcm9ibGVtIHN0YXJ0aW5nIHNlbGYgdGVzdCIpOworCQlnb3RvIGVycl9yZXQ7CisJfQorCisJYWRpczE2MjUxX2NoZWNrX3N0YXR1cyhkZXYpOworCitlcnJfcmV0OgorCXJldHVybiByZXQ7Cit9CisKK2ludCBhZGlzMTYyNTFfY2hlY2tfc3RhdHVzKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwl1MTYgc3RhdHVzOworCWludCByZXQ7CisKKwlyZXQgPSBhZGlzMTYyNTFfc3BpX3JlYWRfcmVnXzE2KGRldiwgQURJUzE2MjUxX0RJQUdfU1RBVCwgJnN0YXR1cyk7CisKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKGRldiwgIlJlYWRpbmcgc3RhdHVzIGZhaWxlZFxuIik7CisJCWdvdG8gZXJyb3JfcmV0OworCX0KKworCWlmICghKHN0YXR1cyAmIEFESVMxNjI1MV9ESUFHX1NUQVRfRVJSX01BU0spKSB7CisJCXJldCA9IDA7CisJCWdvdG8gZXJyb3JfcmV0OworCX0KKworCXJldCA9IC1FRkFVTFQ7CisKKwlpZiAoc3RhdHVzICYgQURJUzE2MjUxX0RJQUdfU1RBVF9BTEFSTTIpCisJCWRldl9lcnIoZGV2LCAiQWxhcm0gMiBhY3RpdmVcbiIpOworCWlmIChzdGF0dXMgJiBBRElTMTYyNTFfRElBR19TVEFUX0FMQVJNMSkKKwkJZGV2X2VycihkZXYsICJBbGFybSAxIGFjdGl2ZVxuIik7CisJaWYgKHN0YXR1cyAmIEFESVMxNjI1MV9ESUFHX1NUQVRfU0VMRl9URVNUKQorCQlkZXZfZXJyKGRldiwgIlNlbGYgdGVzdCBlcnJvclxuIik7CisJaWYgKHN0YXR1cyAmIEFESVMxNjI1MV9ESUFHX1NUQVRfT1ZFUkZMT1cpCisJCWRldl9lcnIoZGV2LCAiU2Vuc29yIG92ZXJyYW5nZVxuIik7CisJaWYgKHN0YXR1cyAmIEFESVMxNjI1MV9ESUFHX1NUQVRfU1BJX0ZBSUwpCisJCWRldl9lcnIoZGV2LCAiU1BJIGZhaWx1cmVcbiIpOworCWlmIChzdGF0dXMgJiBBRElTMTYyNTFfRElBR19TVEFUX0ZMQVNIX1VQVCkKKwkJZGV2X2VycihkZXYsICJGbGFzaCB1cGRhdGUgZmFpbGVkXG4iKTsKKwlpZiAoc3RhdHVzICYgQURJUzE2MjUxX0RJQUdfU1RBVF9QT1dFUl9ISUdIKQorCQlkZXZfZXJyKGRldiwgIlBvd2VyIHN1cHBseSBhYm92ZSA1LjI1VlxuIik7CisJaWYgKHN0YXR1cyAmIEFESVMxNjI1MV9ESUFHX1NUQVRfUE9XRVJfTE9XKQorCQlkZXZfZXJyKGRldiwgIlBvd2VyIHN1cHBseSBiZWxvdyA0Ljc1VlxuIik7CisKK2Vycm9yX3JldDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFkaXMxNjI1MV9pbml0aWFsX3NldHVwKHN0cnVjdCBhZGlzMTYyNTFfc3RhdGUgKnN0KQoreworCWludCByZXQ7CisJdTE2IHNtcF9wcmQ7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJnN0LT5pbmRpb19kZXYtPmRldjsKKworCS8qIHVzZSBsb3cgc3BpIHNwZWVkIGZvciBpbml0ICovCisJc3QtPnVzLT5tYXhfc3BlZWRfaHogPSBBRElTMTYyNTFfU1BJX1NMT1c7CisJc3QtPnVzLT5tb2RlID0gU1BJX01PREVfMzsKKwlzcGlfc2V0dXAoc3QtPnVzKTsKKworCS8qIERpc2FibGUgSVJRICovCisJcmV0ID0gYWRpczE2MjUxX3NldF9pcnEoZGV2LCBmYWxzZSk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKGRldiwgImRpc2FibGUgaXJxIGZhaWxlZCIpOworCQlnb3RvIGVycl9yZXQ7CisJfQorCisJLyogRG8gc2VsZiB0ZXN0ICovCisKKwkvKiBSZWFkIHN0YXR1cyByZWdpc3RlciB0byBjaGVjayB0aGUgcmVzdWx0ICovCisJcmV0ID0gYWRpczE2MjUxX2NoZWNrX3N0YXR1cyhkZXYpOworCWlmIChyZXQpIHsKKwkJYWRpczE2MjUxX3Jlc2V0KGRldik7CisJCWRldl9lcnIoZGV2LCAiZGV2aWNlIG5vdCBwbGF5aW5nIGJhbGwgLT4gcmVzZXQiKTsKKwkJbXNsZWVwKEFESVMxNjI1MV9TVEFSVFVQX0RFTEFZKTsKKwkJcmV0ID0gYWRpczE2MjUxX2NoZWNrX3N0YXR1cyhkZXYpOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKGRldiwgImdpdmluZyB1cCIpOworCQkJZ290byBlcnJfcmV0OworCQl9CisJfQorCisJcHJpbnRrKEtFUk5fSU5GTyBEUklWRVJfTkFNRSAiOiBhdCBDUyVkIChpcnEgJWQpXG4iLAorCQkJc3QtPnVzLT5jaGlwX3NlbGVjdCwgc3QtPnVzLT5pcnEpOworCisJLyogdXNlIGhpZ2ggc3BpIHNwZWVkIGlmIHBvc3NpYmxlICovCisJcmV0ID0gYWRpczE2MjUxX3NwaV9yZWFkX3JlZ18xNihkZXYsIEFESVMxNjI1MV9TTVBMX1BSRCwgJnNtcF9wcmQpOworCWlmICghcmV0ICYmIChzbXBfcHJkICYgQURJUzE2MjUxX1NNUExfUFJEX0RJVl9NQVNLKSA8IDB4MEEpIHsKKwkJc3QtPnVzLT5tYXhfc3BlZWRfaHogPSBBRElTMTYyNTFfU1BJX1NMT1c7CisJCXNwaV9zZXR1cChzdC0+dXMpOworCX0KKworZXJyX3JldDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgSUlPX0RFVl9BVFRSX0lOX05BTUVEX1JBVygwLCBzdXBwbHksIGFkaXMxNjI1MV9yZWFkXzEyYml0X3NpZ25lZCwKKwkJQURJUzE2MjUxX1NVUFBMWV9PVVQpOworc3RhdGljIElJT19DT05TVF9BVFRSKGluMF9zdXBwbHlfc2NhbGUsICIwLjAwMTgzMTUiKTsKKworc3RhdGljIElJT19ERVZfQVRUUl9HWVJPKGFkaXMxNjI1MV9yZWFkXzE0Yml0X3NpZ25lZCwKKwkJQURJUzE2MjUxX0dZUk9fT1VUKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfR1lST19TQ0FMRShTX0lXVVNSIHwgU19JUlVHTywKKwkJYWRpczE2MjUxX3JlYWRfMTJiaXRfc2lnbmVkLAorCQlhZGlzMTYyNTFfd3JpdGVfMTZiaXQsCisJCUFESVMxNjI1MV9HWVJPX1NDQUxFKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfR1lST19PRkZTRVQoU19JV1VTUiB8IFNfSVJVR08sCisJCWFkaXMxNjI1MV9yZWFkXzEyYml0X3NpZ25lZCwKKwkJYWRpczE2MjUxX3dyaXRlXzE2Yml0LAorCQlBRElTMTYyNTFfR1lST19PRkYpOworCitzdGF0aWMgSUlPX0RFVl9BVFRSX1RFTVBfUkFXKGFkaXMxNjI1MV9yZWFkXzEyYml0X3NpZ25lZCk7CitzdGF0aWMgSUlPX0NPTlNUX0FUVFIodGVtcF9vZmZzZXQsICIyNSBLIik7CitzdGF0aWMgSUlPX0NPTlNUX0FUVFIodGVtcF9zY2FsZSwgIjAuMTQ1MyBLIik7CisKK3N0YXRpYyBJSU9fREVWX0FUVFJfSU5fTkFNRURfUkFXKDEsIGF1eCwgYWRpczE2MjUxX3JlYWRfMTJiaXRfdW5zaWduZWQsCisJCUFESVMxNjI1MV9BVVhfQURDKTsKK3N0YXRpYyBJSU9fQ09OU1RfQVRUUihpbjFfYXV4X3NjYWxlLCAiMC4wMDA2MTA1Iik7CisKK3N0YXRpYyBJSU9fREVWX0FUVFJfU0FNUF9GUkVRKFNfSVdVU1IgfCBTX0lSVUdPLAorCQlhZGlzMTYyNTFfcmVhZF9mcmVxdWVuY3ksCisJCWFkaXMxNjI1MV93cml0ZV9mcmVxdWVuY3kpOworc3RhdGljIElJT19ERVZfQVRUUl9BTkdMKGFkaXMxNjI1MV9yZWFkXzE0Yml0X3NpZ25lZCwKKwkJQURJUzE2MjUxX0FOR0xfT1VUKTsKKworc3RhdGljIElJT19ERVZfQVRUUl9SRVNFVChhZGlzMTYyNTFfd3JpdGVfcmVzZXQpOworCitzdGF0aWMgSUlPX0NPTlNUX0FUVFJfU0FNUF9GUkVRX0FWQUlMKCIwLjEyOSB+IDI1NiIpOworCitzdGF0aWMgSUlPX0NPTlNUX0FUVFIobmFtZSwgImFkaXMxNjI1MSIpOworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqYWRpczE2MjUxX2V2ZW50X2F0dHJpYnV0ZXNbXSA9IHsKKwlOVUxMCit9OworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBhZGlzMTYyNTFfZXZlbnRfYXR0cmlidXRlX2dyb3VwID0geworCS5hdHRycyA9IGFkaXMxNjI1MV9ldmVudF9hdHRyaWJ1dGVzLAorfTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmFkaXMxNjI1MV9hdHRyaWJ1dGVzW10gPSB7CisJJmlpb19kZXZfYXR0cl9pbjBfc3VwcGx5X3Jhdy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fY29uc3RfYXR0cl9pbjBfc3VwcGx5X3NjYWxlLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9neXJvX3Jhdy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfZ3lyb19zY2FsZS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfZ3lyb19vZmZzZXQuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2FuZ2xfcmF3LmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl90ZW1wX3Jhdy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fY29uc3RfYXR0cl90ZW1wX29mZnNldC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fY29uc3RfYXR0cl90ZW1wX3NjYWxlLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9pbjFfYXV4X3Jhdy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fY29uc3RfYXR0cl9pbjFfYXV4X3NjYWxlLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9zYW1wbGluZ19mcmVxdWVuY3kuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2NvbnN0X2F0dHJfc2FtcGxpbmdfZnJlcXVlbmN5X2F2YWlsYWJsZS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfcmVzZXQuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2NvbnN0X2F0dHJfbmFtZS5kZXZfYXR0ci5hdHRyLAorCU5VTEwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGFkaXMxNjI1MV9hdHRyaWJ1dGVfZ3JvdXAgPSB7CisJLmF0dHJzID0gYWRpczE2MjUxX2F0dHJpYnV0ZXMsCit9OworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBhZGlzMTYyNTFfcHJvYmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlpbnQgcmV0LCByZWdkb25lID0gMDsKKwlzdHJ1Y3QgYWRpczE2MjUxX3N0YXRlICpzdCA9IGt6YWxsb2Moc2l6ZW9mICpzdCwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzdCkgeworCQlyZXQgPSAgLUVOT01FTTsKKwkJZ290byBlcnJvcl9yZXQ7CisJfQorCS8qIHRoaXMgaXMgb25seSB1c2VkIGZvciByZW1vdmFsIHB1cnBvc2VzICovCisJc3BpX3NldF9kcnZkYXRhKHNwaSwgc3QpOworCisJLyogQWxsb2NhdGUgdGhlIGNvbW1zIGJ1ZmZlcnMgKi8KKwlzdC0+cnggPSBremFsbG9jKHNpemVvZigqc3QtPnJ4KSpBRElTMTYyNTFfTUFYX1JYLCBHRlBfS0VSTkVMKTsKKwlpZiAoc3QtPnJ4ID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJvcl9mcmVlX3N0OworCX0KKwlzdC0+dHggPSBremFsbG9jKHNpemVvZigqc3QtPnR4KSpBRElTMTYyNTFfTUFYX1RYLCBHRlBfS0VSTkVMKTsKKwlpZiAoc3QtPnR4ID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJvcl9mcmVlX3J4OworCX0KKwlzdC0+dXMgPSBzcGk7CisJbXV0ZXhfaW5pdCgmc3QtPmJ1Zl9sb2NrKTsKKwkvKiBzZXR1cCB0aGUgaW5kdXN0cmlhbGlvIGRyaXZlciBhbGxvY2F0ZWQgZWxlbWVudHMgKi8KKwlzdC0+aW5kaW9fZGV2ID0gaWlvX2FsbG9jYXRlX2RldmljZSgpOworCWlmIChzdC0+aW5kaW9fZGV2ID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJvcl9mcmVlX3R4OworCX0KKworCXN0LT5pbmRpb19kZXYtPmRldi5wYXJlbnQgPSAmc3BpLT5kZXY7CisJc3QtPmluZGlvX2Rldi0+bnVtX2ludGVycnVwdF9saW5lcyA9IDE7CisJc3QtPmluZGlvX2Rldi0+ZXZlbnRfYXR0cnMgPSAmYWRpczE2MjUxX2V2ZW50X2F0dHJpYnV0ZV9ncm91cDsKKwlzdC0+aW5kaW9fZGV2LT5hdHRycyA9ICZhZGlzMTYyNTFfYXR0cmlidXRlX2dyb3VwOworCXN0LT5pbmRpb19kZXYtPmRldl9kYXRhID0gKHZvaWQgKikoc3QpOworCXN0LT5pbmRpb19kZXYtPmRyaXZlcl9tb2R1bGUgPSBUSElTX01PRFVMRTsKKwlzdC0+aW5kaW9fZGV2LT5tb2RlcyA9IElORElPX0RJUkVDVF9NT0RFOworCisJcmV0ID0gYWRpczE2MjUxX2NvbmZpZ3VyZV9yaW5nKHN0LT5pbmRpb19kZXYpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfZnJlZV9kZXY7CisKKwlyZXQgPSBpaW9fZGV2aWNlX3JlZ2lzdGVyKHN0LT5pbmRpb19kZXYpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfdW5yZWdfcmluZ19mdW5jczsKKwlyZWdkb25lID0gMTsKKworCXJldCA9IGFkaXMxNjI1MV9pbml0aWFsaXplX3Jpbmcoc3QtPmluZGlvX2Rldi0+cmluZyk7CisJaWYgKHJldCkgeworCQlwcmludGsoS0VSTl9FUlIgImZhaWxlZCB0byBpbml0aWFsaXplIHRoZSByaW5nXG4iKTsKKwkJZ290byBlcnJvcl91bnJlZ19yaW5nX2Z1bmNzOworCX0KKworCWlmIChzcGktPmlycSAmJiBncGlvX2lzX3ZhbGlkKGlycV90b19ncGlvKHNwaS0+aXJxKSkgPiAwKSB7CisJCXJldCA9IGlpb19yZWdpc3Rlcl9pbnRlcnJ1cHRfbGluZShzcGktPmlycSwKKwkJCQlzdC0+aW5kaW9fZGV2LAorCQkJCTAsCisJCQkJSVJRRl9UUklHR0VSX1JJU0lORywKKwkJCQkiYWRpczE2MjUxIik7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycm9yX3VuaW5pdGlhbGl6ZV9yaW5nOworCisJCXJldCA9IGFkaXMxNjI1MV9wcm9iZV90cmlnZ2VyKHN0LT5pbmRpb19kZXYpOworCQlpZiAocmV0KQorCQkJZ290byBlcnJvcl91bnJlZ2lzdGVyX2xpbmU7CisJfQorCisJLyogR2V0IHRoZSBkZXZpY2UgaW50byBhIHNhbmUgaW5pdGlhbCBzdGF0ZSAqLworCXJldCA9IGFkaXMxNjI1MV9pbml0aWFsX3NldHVwKHN0KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3JlbW92ZV90cmlnZ2VyOworCXJldHVybiAwOworCitlcnJvcl9yZW1vdmVfdHJpZ2dlcjoKKwlpZiAoc3QtPmluZGlvX2Rldi0+bW9kZXMgJiBJTkRJT19SSU5HX1RSSUdHRVJFRCkKKwkJYWRpczE2MjUxX3JlbW92ZV90cmlnZ2VyKHN0LT5pbmRpb19kZXYpOworZXJyb3JfdW5yZWdpc3Rlcl9saW5lOgorCWlmIChzdC0+aW5kaW9fZGV2LT5tb2RlcyAmIElORElPX1JJTkdfVFJJR0dFUkVEKQorCQlpaW9fdW5yZWdpc3Rlcl9pbnRlcnJ1cHRfbGluZShzdC0+aW5kaW9fZGV2LCAwKTsKK2Vycm9yX3VuaW5pdGlhbGl6ZV9yaW5nOgorCWFkaXMxNjI1MV91bmluaXRpYWxpemVfcmluZyhzdC0+aW5kaW9fZGV2LT5yaW5nKTsKK2Vycm9yX3VucmVnX3JpbmdfZnVuY3M6CisJYWRpczE2MjUxX3VuY29uZmlndXJlX3Jpbmcoc3QtPmluZGlvX2Rldik7CitlcnJvcl9mcmVlX2RldjoKKwlpZiAocmVnZG9uZSkKKwkJaWlvX2RldmljZV91bnJlZ2lzdGVyKHN0LT5pbmRpb19kZXYpOworCWVsc2UKKwkJaWlvX2ZyZWVfZGV2aWNlKHN0LT5pbmRpb19kZXYpOworZXJyb3JfZnJlZV90eDoKKwlrZnJlZShzdC0+dHgpOworZXJyb3JfZnJlZV9yeDoKKwlrZnJlZShzdC0+cngpOworZXJyb3JfZnJlZV9zdDoKKwlrZnJlZShzdCk7CitlcnJvcl9yZXQ6CisJcmV0dXJuIHJldDsKK30KKworLyogZml4bWUsIGNvbmZpcm0gb3JkZXJpbmcgaW4gdGhpcyBmdW5jdGlvbiAqLworc3RhdGljIGludCBhZGlzMTYyNTFfcmVtb3ZlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgYWRpczE2MjUxX3N0YXRlICpzdCA9IHNwaV9nZXRfZHJ2ZGF0YShzcGkpOworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBzdC0+aW5kaW9fZGV2OworCisJcmV0ID0gYWRpczE2MjUxX3N0b3BfZGV2aWNlKCYoaW5kaW9fZGV2LT5kZXYpKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl9yZXQ7CisKKwlmbHVzaF9zY2hlZHVsZWRfd29yaygpOworCisJYWRpczE2MjUxX3JlbW92ZV90cmlnZ2VyKGluZGlvX2Rldik7CisJaWYgKHNwaS0+aXJxICYmIGdwaW9faXNfdmFsaWQoaXJxX3RvX2dwaW8oc3BpLT5pcnEpKSA+IDApCisJCWlpb191bnJlZ2lzdGVyX2ludGVycnVwdF9saW5lKGluZGlvX2RldiwgMCk7CisKKwlhZGlzMTYyNTFfdW5pbml0aWFsaXplX3JpbmcoaW5kaW9fZGV2LT5yaW5nKTsKKwlhZGlzMTYyNTFfdW5jb25maWd1cmVfcmluZyhpbmRpb19kZXYpOworCWlpb19kZXZpY2VfdW5yZWdpc3RlcihpbmRpb19kZXYpOworCWtmcmVlKHN0LT50eCk7CisJa2ZyZWUoc3QtPnJ4KTsKKwlrZnJlZShzdCk7CisKKwlyZXR1cm4gMDsKKworZXJyX3JldDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3RydWN0IHNwaV9kcml2ZXIgYWRpczE2MjUxX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJhZGlzMTYyNTEiLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwl9LAorCS5wcm9iZSA9IGFkaXMxNjI1MV9wcm9iZSwKKwkucmVtb3ZlID0gX19kZXZleGl0X3AoYWRpczE2MjUxX3JlbW92ZSksCit9OworCitzdGF0aWMgX19pbml0IGludCBhZGlzMTYyNTFfaW5pdCh2b2lkKQoreworCXJldHVybiBzcGlfcmVnaXN0ZXJfZHJpdmVyKCZhZGlzMTYyNTFfZHJpdmVyKTsKK30KK21vZHVsZV9pbml0KGFkaXMxNjI1MV9pbml0KTsKKworc3RhdGljIF9fZXhpdCB2b2lkIGFkaXMxNjI1MV9leGl0KHZvaWQpCit7CisJc3BpX3VucmVnaXN0ZXJfZHJpdmVyKCZhZGlzMTYyNTFfZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KGFkaXMxNjI1MV9leGl0KTsKKworTU9EVUxFX0FVVEhPUigiQmFycnkgU29uZyA8MjFjbmJhb0BnbWFpbC5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkFuYWxvZyBEZXZpY2VzIEFESVMxNjI1MSBEaWdpdGFsIEd5cm9zY29wZSBTZW5zb3IgU1BJIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9neXJvL2FkaXMxNjI2MC5oIGIvZHJpdmVycy9zdGFnaW5nL2lpby9neXJvL2FkaXMxNjI2MC5oCmluZGV4IDgxMjQ0MGEuLmMxZmQ0MzY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2d5cm8vYWRpczE2MjYwLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9neXJvL2FkaXMxNjI2MC5oCkBAIC0xLDUgKzEsNiBAQAogI2lmbmRlZiBTUElfQURJUzE2MjYwX0hfCiAjZGVmaW5lIFNQSV9BRElTMTYyNjBfSF8KKyNpbmNsdWRlICJhZGlzMTYyNjBfcGxhdGZvcm1fZGF0YS5oIgogCiAjZGVmaW5lIEFESVMxNjI2MF9TVEFSVFVQX0RFTEFZCTIyMCAvKiBtcyAqLwogCkBAIC05Miw2ICs5Myw3IEBACiAgKiBAdHg6CQkJdHJhbnNtaXQgYnVmZmVyCiAgKiBAcng6CQkJcmVjaWV2ZSBidWZmZXIKICAqIEBidWZfbG9jazoJCW11dGV4IHRvIHByb3RlY3QgdHggYW5kIHJ4CisgKiBAbmVnYXRlOgkJbmVnYXRlIHRoZSBzY2FsZSBwYXJhbWV0ZXIKICAqKi8KIHN0cnVjdCBhZGlzMTYyNjBfc3RhdGUgewogCXN0cnVjdCBzcGlfZGV2aWNlCQkqdXM7CkBAIC0xMDIsNiArMTA0LDcgQEAKIAl1OAkJCQkqdHg7CiAJdTgJCQkJKnJ4OwogCXN0cnVjdCBtdXRleAkJCWJ1Zl9sb2NrOworCXVuc2lnbmVkCQkJbmVnYXRlOjE7CiB9OwogCiBpbnQgYWRpczE2MjYwX3NldF9pcnEoc3RydWN0IGRldmljZSAqZGV2LCBib29sIGVuYWJsZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2d5cm8vYWRpczE2MjYwX2NvcmUuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vZ3lyby9hZGlzMTYyNjBfY29yZS5jCmluZGV4IDdkNzcxNmUuLjA0NWUyN2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vZ3lyby9hZGlzMTYyNjBfY29yZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vZ3lyby9hZGlzMTYyNjBfY29yZS5jCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIEFESVMxNjI2MCBQcm9ncmFtbWFibGUgRGlnaXRhbCBHeXJvc2NvcGUgU2Vuc29yIERyaXZlcgorICogQURJUzE2MjYwL0FESVMxNjI2NSBQcm9ncmFtbWFibGUgRGlnaXRhbCBHeXJvc2NvcGUgU2Vuc29yIERyaXZlcgogICoKICAqIENvcHlyaWdodCAyMDEwIEFuYWxvZyBEZXZpY2VzIEluYy4KICAqCkBAIC0xMzQsOCArMTM0LDYgQEAKIAltdXRleF9sb2NrKCZzdC0+YnVmX2xvY2spOwogCXN0LT50eFswXSA9IEFESVMxNjI2MF9SRUFEX1JFRyhsb3dlcl9yZWdfYWRkcmVzcyk7CiAJc3QtPnR4WzFdID0gMDsKLQlzdC0+dHhbMl0gPSAwOwotCXN0LT50eFszXSA9IDA7CiAKIAlzcGlfbWVzc2FnZV9pbml0KCZtc2cpOwogCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZ4ZmVyc1swXSwgJm1zZyk7CkBAIC0yOTMsNiArMjkxLDIyIEBACiAJcmV0dXJuIHJldCA/IHJldCA6IGxlbjsKIH0KIAorc3RhdGljIHNzaXplX3QgYWRpczE2MjYwX3JlYWRfZ3lyb19zY2FsZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZGlzMTYyNjBfc3RhdGUgKnN0ID0gaWlvX2Rldl9nZXRfZGV2ZGF0YShpbmRpb19kZXYpOworCXNzaXplX3QgcmV0ID0gMDsKKworCWlmIChzdC0+bmVnYXRlKQorCQlyZXQgPSBzcHJpbnRmKGJ1ZiwgIi0iKTsKKwkvKiBUYWtlIHRoZSBpaW9fZGV2IHN0YXR1cyBsb2NrICovCisJcmV0ICs9IHNwcmludGYoYnVmICsgcmV0LCAiJXNcbiIsICIwLjAwMTI3ODYyODIxIik7CisKKwlyZXR1cm4gcmV0OworfQorCiBzdGF0aWMgaW50IGFkaXMxNjI2MF9yZXNldChzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJaW50IHJldDsKQEAgLTQ0NywxOCArNDYxLDYgQEAKIAkJCQlBRElTMTYyNjBfU1VQUExZX09VVCk7CiBzdGF0aWMgSUlPX0NPTlNUX0FUVFJfSU5fTkFNRURfU0NBTEUoMCwgc3VwcGx5LCAiMC4wMDE4MzE1Iik7CiAKLXN0YXRpYyBJSU9fREVWX0FUVFJfR1lSTyhhZGlzMTYyNjBfcmVhZF8xNGJpdF9zaWduZWQsCi0JCUFESVMxNjI2MF9HWVJPX09VVCk7Ci1zdGF0aWMgSUlPX0NPTlNUX0FUVFJfR1lST19TQ0FMRSgiMC4wMDEyNzg2MjgyMSIpOwotc3RhdGljIElJT19ERVZfQVRUUl9HWVJPX0NBTElCU0NBTEUoU19JV1VTUiB8IFNfSVJVR08sCi0JCWFkaXMxNjI2MF9yZWFkXzE0Yml0X3NpZ25lZCwKLQkJYWRpczE2MjYwX3dyaXRlXzE2Yml0LAotCQlBRElTMTYyNjBfR1lST19TQ0FMRSk7Ci1zdGF0aWMgSUlPX0RFVl9BVFRSX0dZUk9fQ0FMSUJCSUFTKFNfSVdVU1IgfCBTX0lSVUdPLAotCQlhZGlzMTYyNjBfcmVhZF8xMmJpdF9zaWduZWQsCi0JCWFkaXMxNjI2MF93cml0ZV8xNmJpdCwKLQkJQURJUzE2MjYwX0dZUk9fT0ZGKTsKLQogc3RhdGljIElJT19ERVZfQVRUUl9URU1QX1JBVyhhZGlzMTYyNjBfcmVhZF8xMmJpdF91bnNpZ25lZCk7CiBzdGF0aWMgSUlPX0NPTlNUX0FUVFJfVEVNUF9PRkZTRVQoIjI1Iik7CiBzdGF0aWMgSUlPX0NPTlNUX0FUVFJfVEVNUF9TQ0FMRSgiMC4xNDUzIik7CkBAIC00NzAsOCArNDcyLDYgQEAKIHN0YXRpYyBJSU9fREVWX0FUVFJfU0FNUF9GUkVRKFNfSVdVU1IgfCBTX0lSVUdPLAogCQlhZGlzMTYyNjBfcmVhZF9mcmVxdWVuY3ksCiAJCWFkaXMxNjI2MF93cml0ZV9mcmVxdWVuY3kpOwotc3RhdGljIElJT19ERVZfQVRUUl9BTkdMKGFkaXMxNjI2MF9yZWFkXzE0Yml0X3NpZ25lZCwKLQkJQURJUzE2MjYwX0FOR0xfT1VUKTsKIAogc3RhdGljIElJT19ERVZJQ0VfQVRUUihyZXNldCwgU19JV1VTUiwgTlVMTCwgYWRpczE2MjYwX3dyaXRlX3Jlc2V0LCAwKTsKIApAQCAtNDg3LDM4ICs0ODcsNzAgQEAKIAkuYXR0cnMgPSBhZGlzMTYyNjBfZXZlbnRfYXR0cmlidXRlcywKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICphZGlzMTYyNjBfYXR0cmlidXRlc1tdID0gewotCSZpaW9fZGV2X2F0dHJfaW4wX3N1cHBseV9yYXcuZGV2X2F0dHIuYXR0ciwKLQkmaWlvX2NvbnN0X2F0dHJfaW4wX3N1cHBseV9zY2FsZS5kZXZfYXR0ci5hdHRyLAotCSZpaW9fZGV2X2F0dHJfZ3lyb19yYXcuZGV2X2F0dHIuYXR0ciwKLQkmaWlvX2NvbnN0X2F0dHJfZ3lyb19zY2FsZS5kZXZfYXR0ci5hdHRyLAotCSZpaW9fZGV2X2F0dHJfZ3lyb19jYWxpYnNjYWxlLmRldl9hdHRyLmF0dHIsCi0JJmlpb19kZXZfYXR0cl9neXJvX2NhbGliYmlhcy5kZXZfYXR0ci5hdHRyLAotCSZpaW9fZGV2X2F0dHJfYW5nbF9yYXcuZGV2X2F0dHIuYXR0ciwKLQkmaWlvX2Rldl9hdHRyX3RlbXBfcmF3LmRldl9hdHRyLmF0dHIsCi0JJmlpb19jb25zdF9hdHRyX3RlbXBfb2Zmc2V0LmRldl9hdHRyLmF0dHIsCi0JJmlpb19jb25zdF9hdHRyX3RlbXBfc2NhbGUuZGV2X2F0dHIuYXR0ciwKLQkmaWlvX2Rldl9hdHRyX2luMV9yYXcuZGV2X2F0dHIuYXR0ciwKLQkmaWlvX2NvbnN0X2F0dHJfaW4xX3NjYWxlLmRldl9hdHRyLmF0dHIsCi0JJmlpb19kZXZfYXR0cl9zYW1wbGluZ19mcmVxdWVuY3kuZGV2X2F0dHIuYXR0ciwKLQkmaWlvX2NvbnN0X2F0dHJfc2FtcGxpbmdfZnJlcXVlbmN5X2F2YWlsYWJsZS5kZXZfYXR0ci5hdHRyLAotCSZpaW9fZGV2X2F0dHJfcmVzZXQuZGV2X2F0dHIuYXR0ciwKLQkmaWlvX2NvbnN0X2F0dHJfbmFtZS5kZXZfYXR0ci5hdHRyLAotCU5VTEwKLX07CisjZGVmaW5lIEFESVMxNjI2MF9HWVJPX0FUVFJfU0VUKGF4aXMpCQkJCQlcCisJSUlPX0RFVl9BVFRSX0dZUk8jI2F4aXMoYWRpczE2MjYwX3JlYWRfMTRiaXRfc2lnbmVkLAkJXAorCQkJCUFESVMxNjI2MF9HWVJPX09VVCk7CQkJXAorCXN0YXRpYyBJSU9fREVWX0FUVFJfR1lSTyMjYXhpcyMjX1NDQUxFKFNfSVJVR08sCQkJXAorCQkJCQlhZGlzMTYyNjBfcmVhZF9neXJvX3NjYWxlLAlcCisJCQkJCU5VTEwsCQkJCVwKKwkJCQkJMCk7CQkJCVwKKwlzdGF0aWMgSUlPX0RFVl9BVFRSX0dZUk8jI2F4aXMjI19DQUxJQlNDQUxFKFNfSVJVR08gfCBTX0lXVVNSLAlcCisJCQkJCWFkaXMxNjI2MF9yZWFkXzEyYml0X3Vuc2lnbmVkLAlcCisJCQkJCWFkaXMxNjI2MF93cml0ZV8xNmJpdCwJCVwKKwkJCQkJQURJUzE2MjYwX0dZUk9fU0NBTEUpOwkJXAorCXN0YXRpYyBJSU9fREVWX0FUVFJfR1lSTyMjYXhpcyMjX0NBTElCQklBUyhTX0lXVVNSIHwgU19JUlVHTywJXAorCQkJCQlhZGlzMTYyNjBfcmVhZF8xMmJpdF9zaWduZWQsCVwKKwkJCQkJYWRpczE2MjYwX3dyaXRlXzE2Yml0LAkJXAorCQkJCQlBRElTMTYyNjBfR1lST19PRkYpOwkJXAorCXN0YXRpYyBJSU9fREVWX0FUVFJfQU5HTCMjYXhpcyhhZGlzMTYyNjBfcmVhZF8xNGJpdF9zaWduZWQsCVwKKwkJCQkgICAgICAgQURJUzE2MjYwX0FOR0xfT1VUKTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgYWRpczE2MjYwX2F0dHJpYnV0ZV9ncm91cCA9IHsKLQkuYXR0cnMgPSBhZGlzMTYyNjBfYXR0cmlidXRlcywKLX07CitzdGF0aWMgQURJUzE2MjYwX0dZUk9fQVRUUl9TRVQoKTsKK3N0YXRpYyBBRElTMTYyNjBfR1lST19BVFRSX1NFVChfWCk7CitzdGF0aWMgQURJUzE2MjYwX0dZUk9fQVRUUl9TRVQoX1kpOworc3RhdGljIEFESVMxNjI2MF9HWVJPX0FUVFJfU0VUKF9aKTsKKworI2RlZmluZSBBRElTMTYyNjBfQVRUUl9HUk9VUChheGlzKQkJCQkJXAorCXN0cnVjdCBhdHRyaWJ1dGUgKmFkaXMxNjI2MF9hdHRyaWJ1dGVzIyNheGlzW10gPSB7CQlcCisJCSZpaW9fZGV2X2F0dHJfaW4wX3N1cHBseV9yYXcuZGV2X2F0dHIuYXR0ciwJCVwKKwkJJmlpb19jb25zdF9hdHRyX2luMF9zdXBwbHlfc2NhbGUuZGV2X2F0dHIuYXR0ciwJCVwKKwkJJmlpb19kZXZfYXR0cl9neXJvIyNheGlzIyNfcmF3LmRldl9hdHRyLmF0dHIsCQlcCisJCSZpaW9fZGV2X2F0dHJfZ3lybyMjYXhpcyMjX3NjYWxlLmRldl9hdHRyLmF0dHIsCQlcCisJCSZpaW9fZGV2X2F0dHJfZ3lybyMjYXhpcyMjX2NhbGlic2NhbGUuZGV2X2F0dHIuYXR0ciwJXAorCQkmaWlvX2Rldl9hdHRyX2d5cm8jI2F4aXMjI19jYWxpYmJpYXMuZGV2X2F0dHIuYXR0ciwJXAorCQkmaWlvX2Rldl9hdHRyX2FuZ2wjI2F4aXMjI19yYXcuZGV2X2F0dHIuYXR0ciwJCVwKKwkJJmlpb19kZXZfYXR0cl90ZW1wX3Jhdy5kZXZfYXR0ci5hdHRyLAkJCVwKKwkJJmlpb19jb25zdF9hdHRyX3RlbXBfb2Zmc2V0LmRldl9hdHRyLmF0dHIsCQlcCisJCSZpaW9fY29uc3RfYXR0cl90ZW1wX3NjYWxlLmRldl9hdHRyLmF0dHIsCQlcCisJCSZpaW9fZGV2X2F0dHJfaW4xX3Jhdy5kZXZfYXR0ci5hdHRyLAkJCVwKKwkJJmlpb19jb25zdF9hdHRyX2luMV9zY2FsZS5kZXZfYXR0ci5hdHRyLAkJXAorCQkmaWlvX2Rldl9hdHRyX3NhbXBsaW5nX2ZyZXF1ZW5jeS5kZXZfYXR0ci5hdHRyLAkJXAorCQkmaWlvX2NvbnN0X2F0dHJfc2FtcGxpbmdfZnJlcXVlbmN5X2F2YWlsYWJsZS5kZXZfYXR0ci5hdHRyLCBcCisJCSZpaW9fZGV2X2F0dHJfcmVzZXQuZGV2X2F0dHIuYXR0ciwJCQlcCisJCSZpaW9fY29uc3RfYXR0cl9uYW1lLmRldl9hdHRyLmF0dHIsCQkJXAorCQlOVUxMCQkJCQkJCVwKKwl9OwkJCQkJCQkJXAorCXN0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGFkaXMxNjI2MF9hdHRyaWJ1dGVfZ3JvdXAjI2F4aXMgXAorCT0gewkJCQkJCQkJXAorCQkuYXR0cnMgPSBhZGlzMTYyNjBfYXR0cmlidXRlcyMjYXhpcywJCQlcCisJfTsKKworc3RhdGljIEFESVMxNjI2MF9BVFRSX0dST1VQKCk7CitzdGF0aWMgQURJUzE2MjYwX0FUVFJfR1JPVVAoX3gpOworc3RhdGljIEFESVMxNjI2MF9BVFRSX0dST1VQKF95KTsKK3N0YXRpYyBBRElTMTYyNjBfQVRUUl9HUk9VUChfeik7CiAKIHN0YXRpYyBpbnQgX19kZXZpbml0IGFkaXMxNjI2MF9wcm9iZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQogewogCWludCByZXQsIHJlZ2RvbmUgPSAwOworCXN0cnVjdCBhZGlzMTYyNjBfcGxhdGZvcm1fZGF0YSAqcGQgPSBzcGktPmRldi5wbGF0Zm9ybV9kYXRhOwogCXN0cnVjdCBhZGlzMTYyNjBfc3RhdGUgKnN0ID0ga3phbGxvYyhzaXplb2YgKnN0LCBHRlBfS0VSTkVMKTsKIAlpZiAoIXN0KSB7CiAJCXJldCA9ICAtRU5PTUVNOwogCQlnb3RvIGVycm9yX3JldDsKIAl9CisJaWYgKHBkKQorCQlzdC0+bmVnYXRlID0gcGQtPm5lZ2F0ZTsKIAkvKiB0aGlzIGlzIG9ubHkgdXNlZCBmb3IgcmVtb3ZhbCBwdXJwb3NlcyAqLwogCXNwaV9zZXRfZHJ2ZGF0YShzcGksIHN0KTsKIApAQCAtNTQ1LDcgKzU3NywyNCBAQAogCXN0LT5pbmRpb19kZXYtPmRldi5wYXJlbnQgPSAmc3BpLT5kZXY7CiAJc3QtPmluZGlvX2Rldi0+bnVtX2ludGVycnVwdF9saW5lcyA9IDE7CiAJc3QtPmluZGlvX2Rldi0+ZXZlbnRfYXR0cnMgPSAmYWRpczE2MjYwX2V2ZW50X2F0dHJpYnV0ZV9ncm91cDsKLQlzdC0+aW5kaW9fZGV2LT5hdHRycyA9ICZhZGlzMTYyNjBfYXR0cmlidXRlX2dyb3VwOworCWlmIChwZCAmJiBwZC0+ZGlyZWN0aW9uKQorCQlzd2l0Y2ggKHBkLT5kaXJlY3Rpb24pIHsKKwkJY2FzZSAneCc6CisJCQlzdC0+aW5kaW9fZGV2LT5hdHRycyA9ICZhZGlzMTYyNjBfYXR0cmlidXRlX2dyb3VwX3g7CisJCQlicmVhazsKKwkJY2FzZSAneSc6CisJCQlzdC0+aW5kaW9fZGV2LT5hdHRycyA9ICZhZGlzMTYyNjBfYXR0cmlidXRlX2dyb3VwX3k7CisJCQlicmVhazsKKwkJY2FzZSAneic6CisJCQlzdC0+aW5kaW9fZGV2LT5hdHRycyA9ICZhZGlzMTYyNjBfYXR0cmlidXRlX2dyb3VwX3o7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXN0LT5pbmRpb19kZXYtPmF0dHJzID0gJmFkaXMxNjI2MF9hdHRyaWJ1dGVfZ3JvdXA7CisJCQlicmVhazsKKwkJfQorCWVsc2UKKwkJc3QtPmluZGlvX2Rldi0+YXR0cnMgPSAmYWRpczE2MjYwX2F0dHJpYnV0ZV9ncm91cDsKKwogCXN0LT5pbmRpb19kZXYtPmRldl9kYXRhID0gKHZvaWQgKikoc3QpOwogCXN0LT5pbmRpb19kZXYtPmRyaXZlcl9tb2R1bGUgPSBUSElTX01PRFVMRTsKIAlzdC0+aW5kaW9fZGV2LT5tb2RlcyA9IElORElPX0RJUkVDVF9NT0RFOwpAQCAtNjM1LDYgKzY4NCwxOCBAQAogCXJldHVybiByZXQ7CiB9CiAKKy8qCisgKiBUaGVzZSBwYXJ0cyBkbyBub3QgbmVlZCB0byBiZSBkaWZmZXJlbnRpYXRlZCB1bnRpbCBzb21lb25lIGFkZHMKKyAqIHN1cHBvcnQgZm9yIHRoZSBvbiBjaGlwIGZpbHRlcmluZy4KKyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBzcGlfZGV2aWNlX2lkIGFkaXMxNjI2MF9pZFtdID0geworCXsiYWRpczE2MjYwIiwgMH0sCisJeyJhZGlzMTYyNjUiLCAwfSwKKwl7ImFkaXMxNjI1MCIsIDB9LAorCXsiYWRpczE2MjU1IiwgMH0sCisJe30KK307CisKIHN0YXRpYyBzdHJ1Y3Qgc3BpX2RyaXZlciBhZGlzMTYyNjBfZHJpdmVyID0gewogCS5kcml2ZXIgPSB7CiAJCS5uYW1lID0gImFkaXMxNjI2MCIsCkBAIC02NDIsNiArNzAzLDcgQEAKIAl9LAogCS5wcm9iZSA9IGFkaXMxNjI2MF9wcm9iZSwKIAkucmVtb3ZlID0gX19kZXZleGl0X3AoYWRpczE2MjYwX3JlbW92ZSksCisJLmlkX3RhYmxlID0gYWRpczE2MjYwX2lkLAogfTsKIAogc3RhdGljIF9faW5pdCBpbnQgYWRpczE2MjYwX2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vZ3lyby9hZGlzMTYyNjBfcGxhdGZvcm1fZGF0YS5oIGIvZHJpdmVycy9zdGFnaW5nL2lpby9neXJvL2FkaXMxNjI2MF9wbGF0Zm9ybV9kYXRhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTI4MDJlOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vZ3lyby9hZGlzMTYyNjBfcGxhdGZvcm1fZGF0YS5oCkBAIC0wLDAgKzEsMTkgQEAKKy8qCisgKiBBRElTMTYyNjAgUHJvZ3JhbW1hYmxlIERpZ2l0YWwgR3lyb3Njb3BlIFNlbnNvciBEcml2ZXIgUGxhdGZvcm0gRGF0YQorICoKKyAqIEJhc2VkIG9uIGFkaXMxNjI1NS5oIE1hdHRoaWEgQnJ1Z2dlciA8bV9icnVnZ2VyJndlYi5kZT4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMKKyAgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgorICovCisKKy8qKgorICogc3RydWN0IGFkaXMxNjI2MF9wbGF0Zm9ybV9kYXRhIC0gaW5zdGFuY2Ugc3BlY2lmaWMgZGF0YQorICogQGRpcmVjdGlvbjogeCB5IG9yIHoKKyAqIEBuZWdhdGU6IGZsYWcgdG8gaW5kaWNhdGUgdmFsdWUgc2hvdWxkIGJlIGludmVydGVkLgorICoqLworc3RydWN0IGFkaXMxNjI2MF9wbGF0Zm9ybV9kYXRhIHsKKwljaGFyIGRpcmVjdGlvbjsKKwl1bnNpZ25lZCBuZWdhdGU6MTsKK307CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2d5cm8vZ3lyby5oIGIvZHJpdmVycy9zdGFnaW5nL2lpby9neXJvL2d5cm8uaAppbmRleCA5OGI4MzdiLi5iNGVhNWJmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2d5cm8vZ3lyby5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vZ3lyby9neXJvLmgKQEAgLTcxLDMgKzcxLDEyIEBACiAKICNkZWZpbmUgSUlPX0RFVl9BVFRSX0FOR0woX3Nob3csIF9hZGRyKSAgICAgICAgICAgICAgICAgICAgICAgICBcCiAJSUlPX0RFVklDRV9BVFRSKGFuZ2xfcmF3LCBTX0lSVUdPLCBfc2hvdywgTlVMTCwgX2FkZHIpCisKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX0FOR0xfWChfc2hvdywgX2FkZHIpCQkJCVwKKwlJSU9fREVWSUNFX0FUVFIoYW5nbF94X3JhdywgU19JUlVHTywgX3Nob3csIE5VTEwsIF9hZGRyKQorCisjZGVmaW5lIElJT19ERVZfQVRUUl9BTkdMX1koX3Nob3csIF9hZGRyKQkJCQlcCisJSUlPX0RFVklDRV9BVFRSKGFuZ2xfeV9yYXcsIFNfSVJVR08sIF9zaG93LCBOVUxMLCBfYWRkcikKKworI2RlZmluZSBJSU9fREVWX0FUVFJfQU5HTF9aKF9zaG93LCBfYWRkcikJCQkJXAorCUlJT19ERVZJQ0VfQVRUUihhbmdsX3pfcmF3LCBTX0lSVUdPLCBfc2hvdywgTlVMTCwgX2FkZHIpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2ltdS9hZGlzMTYzNTBfY29yZS5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9pbXUvYWRpczE2MzUwX2NvcmUuYwppbmRleCA5N2MxZWM4Li5jZjcxNzZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2ltdS9hZGlzMTYzNTBfY29yZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vaW11L2FkaXMxNjM1MF9jb3JlLmMKQEAgLTU3MCw2ICs1NzAsNyBAQAogCSZpaW9fZGV2X2F0dHJfdGVtcF95X3Jhdy5kZXZfYXR0ci5hdHRyLAogCSZpaW9fZGV2X2F0dHJfdGVtcF96X3Jhdy5kZXZfYXR0ci5hdHRyLAogCSZpaW9fY29uc3RfYXR0cl90ZW1wX3NjYWxlLmRldl9hdHRyLmF0dHIsCisJJmlpb19jb25zdF9hdHRyX3RlbXBfb2Zmc2V0LmRldl9hdHRyLmF0dHIsCiAJJmlpb19kZXZfYXR0cl9pbjFfcmF3LmRldl9hdHRyLmF0dHIsCiAJJmlpb19jb25zdF9hdHRyX2luMV9zY2FsZS5kZXZfYXR0ci5hdHRyLAogCSZpaW9fZGV2X2F0dHJfc2FtcGxpbmdfZnJlcXVlbmN5LmRldl9hdHRyLmF0dHIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL21ldGVyL0tjb25maWcgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL21ldGVyL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTJlMzZlNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vbWV0ZXIvS2NvbmZpZwpAQCAtMCwwICsxLDYxIEBACisjCisjIElJTyBtZXRlciBkcml2ZXJzIGNvbmZpZ3VyYXRpb24KKyMKK2NvbW1lbnQgIkFjdGl2ZSBlbmVyZ3kgbWV0ZXJpbmcgSUMiCisKK2NvbmZpZyBBREU3NzUzCisJdHJpc3RhdGUgIkFuYWxvZyBEZXZpY2VzIEFERTc3NTMvNiBTaW5nbGUtUGhhc2UgTXVsdGlmdW5jdGlvbiBNZXRlcmluZyBJQyBEcml2ZXIiCisJZGVwZW5kcyBvbiBTUEkKKwloZWxwCisJICBTYXkgeWVzIGhlcmUgdG8gYnVpbGQgc3VwcG9ydCBmb3IgQW5hbG9nIERldmljZXMgQURFNzc1MyBTaW5nbGUtUGhhc2UgTXVsdGlmdW5jdGlvbgorCSAgTWV0ZXJpbmcgSUMgd2l0aCBkaS9kdCBTZW5zb3IgSW50ZXJmYWNlLgorCitjb25maWcgQURFNzc1NAorCXRyaXN0YXRlICJBbmFsb2cgRGV2aWNlcyBBREU3NzU0IFBvbHlwaGFzZSBNdWx0aWZ1bmN0aW9uIEVuZXJneSBNZXRlcmluZyBJQyBEcml2ZXIiCisJZGVwZW5kcyBvbiBTUEkKKwloZWxwCisJICBTYXkgeWVzIGhlcmUgdG8gYnVpbGQgc3VwcG9ydCBmb3IgQW5hbG9nIERldmljZXMgQURFNzc1NCBQb2x5cGhhc2UKKwkgIE11bHRpZnVuY3Rpb24gRW5lcmd5IE1ldGVyaW5nIElDIERyaXZlci4KKworY29uZmlnIEFERTc3NTgKKwl0cmlzdGF0ZSAiQW5hbG9nIERldmljZXMgQURFNzc1OCBQb2x5IFBoYXNlIE11bHRpZnVuY3Rpb24gRW5lcmd5IE1ldGVyaW5nIElDIERyaXZlciIKKwlkZXBlbmRzIG9uIFNQSQorCXNlbGVjdCBJSU9fVFJJR0dFUiBpZiBJSU9fUklOR19CVUZGRVIKKwlzZWxlY3QgSUlPX1NXX1JJTkcgaWYgSUlPX1JJTkdfQlVGRkVSCisJaGVscAorCSAgU2F5IHllcyBoZXJlIHRvIGJ1aWxkIHN1cHBvcnQgZm9yIEFuYWxvZyBEZXZpY2VzIEFERTc3NTggUG9seXBoYXNlCisJICBNdWx0aWZ1bmN0aW9uIEVuZXJneSBNZXRlcmluZyBJQyB3aXRoIFBlciBQaGFzZSBJbmZvcm1hdGlvbiBEcml2ZXIuCisKK2NvbmZpZyBBREU3NzU5CisJdHJpc3RhdGUgIkFuYWxvZyBEZXZpY2VzIEFERTc3NTkgQWN0aXZlIEVuZXJneSBNZXRlcmluZyBJQyBEcml2ZXIiCisJZGVwZW5kcyBvbiBTUEkKKwloZWxwCisJICBTYXkgeWVzIGhlcmUgdG8gYnVpbGQgc3VwcG9ydCBmb3IgQW5hbG9nIERldmljZXMgQURFNzc1OCBBY3RpdmUgRW5lcmd5CisJICBNZXRlcmluZyBJQyB3aXRoIGRpL2R0IFNlbnNvciBJbnRlcmZhY2UuCisKK2NvbmZpZyBBREU3ODU0CisJdHJpc3RhdGUgIkFuYWxvZyBEZXZpY2VzIEFERTc4NTQvNTgvNjgvNzggUG9seXBoYXNlIE11bHRpZnVuY3Rpb24gRW5lcmd5IE1ldGVyaW5nIElDIERyaXZlciIKKwlkZXBlbmRzIG9uIFNQSSB8fCBJMkMKKwloZWxwCisJICBTYXkgeWVzIGhlcmUgdG8gYnVpbGQgc3VwcG9ydCBmb3IgQW5hbG9nIERldmljZXMgQURFNzg1NC81OC82OC83OCBQb2x5cGhhc2UKKwkgIE11bHRpZnVuY3Rpb24gRW5lcmd5IE1ldGVyaW5nIElDIERyaXZlci4KKworY29uZmlnIEFERTc4NTRfSTJDCisJdHJpc3RhdGUgInN1cHBvcnQgSTJDIGJ1cyBjb25uZWN0aW9uIgorCWRlcGVuZHMgb24gQURFNzg1NCAmJiBJMkMKKwlkZWZhdWx0IHkKKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSBoYXZlIEFERTc4NTQvNTgvNjgvNzggaG9va2VkIHRvIGFuIEkyQyBidXMuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGFkZTc4NTQtaTJjLgorCitjb25maWcgQURFNzg1NF9TUEkKKwl0cmlzdGF0ZSAic3VwcG9ydCBTUEkgYnVzIGNvbm5lY3Rpb24iCisJZGVwZW5kcyBvbiBBREU3ODU0ICYmIFNQSQorCWRlZmF1bHQgeQorCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IGhhdmUgQURFNzg1NC81OC82OC83OCBob29rZWQgdG8gYSBTUEkgYnVzLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBhZGU3ODU0LXNwaS4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vbWV0ZXIvTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL21ldGVyL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjYzdkNTEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL21ldGVyL01ha2VmaWxlCkBAIC0wLDAgKzEsMTUgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIG1ldGVyaW5nIGljIGRyaXZlcnMKKyMKKworb2JqLSQoQ09ORklHX0FERTc3NTMpICs9IGFkZTc3NTMubworb2JqLSQoQ09ORklHX0FERTc3NTQpICs9IGFkZTc3NTQubworCithZGU3NzU4LXkgICAgICAgICAgICAgOj0gYWRlNzc1OF9jb3JlLm8KK2FkZTc3NTgtJChDT05GSUdfSUlPX1JJTkdfQlVGRkVSKSArPSBhZGU3NzU4X3JpbmcubyBhZGU3NzU4X3RyaWdnZXIubworb2JqLSQoQ09ORklHX0FERTc3NTgpICs9IGFkZTc3NTgubworCitvYmotJChDT05GSUdfQURFNzc1OSkgKz0gYWRlNzc1OS5vCitvYmotJChDT05GSUdfQURFNzg1NCkgKz0gYWRlNzg1NC5vCitvYmotJChDT05GSUdfQURFNzg1NF9JMkMpICs9IGFkZTc4NTQtaTJjLm8KK29iai0kKENPTkZJR19BREU3ODU0X1NQSSkgKz0gYWRlNzg1NC1zcGkubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9tZXRlci9hZGU3NzUzLmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL21ldGVyL2FkZTc3NTMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzJhZmJkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9tZXRlci9hZGU3NzUzLmMKQEAgLTAsMCArMSw3MzAgQEAKKy8qCisgKiBBREU3NzUzIFNpbmdsZS1QaGFzZSBNdWx0aWZ1bmN0aW9uIE1ldGVyaW5nIElDIHdpdGggZGkvZHQgU2Vuc29yIEludGVyZmFjZSBEcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgMjAxMCBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisKKyNpbmNsdWRlICIuLi9paW8uaCIKKyNpbmNsdWRlICIuLi9zeXNmcy5oIgorI2luY2x1ZGUgIm1ldGVyLmgiCisjaW5jbHVkZSAiYWRlNzc1My5oIgorCitpbnQgYWRlNzc1M19zcGlfd3JpdGVfcmVnXzgoc3RydWN0IGRldmljZSAqZGV2LAorCQl1OCByZWdfYWRkcmVzcywKKwkJdTggdmFsKQoreworCWludCByZXQ7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZGU3NzUzX3N0YXRlICpzdCA9IGlpb19kZXZfZ2V0X2RldmRhdGEoaW5kaW9fZGV2KTsKKworCW11dGV4X2xvY2soJnN0LT5idWZfbG9jayk7CisJc3QtPnR4WzBdID0gQURFNzc1M19XUklURV9SRUcocmVnX2FkZHJlc3MpOworCXN0LT50eFsxXSA9IHZhbDsKKworCXJldCA9IHNwaV93cml0ZShzdC0+dXMsIHN0LT50eCwgMik7CisJbXV0ZXhfdW5sb2NrKCZzdC0+YnVmX2xvY2spOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhZGU3NzUzX3NwaV93cml0ZV9yZWdfMTYoc3RydWN0IGRldmljZSAqZGV2LAorCQl1OCByZWdfYWRkcmVzcywKKwkJdTE2IHZhbHVlKQoreworCWludCByZXQ7CisJc3RydWN0IHNwaV9tZXNzYWdlIG1zZzsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkZTc3NTNfc3RhdGUgKnN0ID0gaWlvX2Rldl9nZXRfZGV2ZGF0YShpbmRpb19kZXYpOworCXN0cnVjdCBzcGlfdHJhbnNmZXIgeGZlcnNbXSA9IHsKKwkJeworCQkJLnR4X2J1ZiA9IHN0LT50eCwKKwkJCS5iaXRzX3Blcl93b3JkID0gOCwKKwkJCS5sZW4gPSAzLAorCQl9CisJfTsKKworCW11dGV4X2xvY2soJnN0LT5idWZfbG9jayk7CisJc3QtPnR4WzBdID0gQURFNzc1M19XUklURV9SRUcocmVnX2FkZHJlc3MpOworCXN0LT50eFsxXSA9ICh2YWx1ZSA+PiA4KSAmIDB4RkY7CisJc3QtPnR4WzJdID0gdmFsdWUgJiAweEZGOworCisJc3BpX21lc3NhZ2VfaW5pdCgmbXNnKTsKKwlzcGlfbWVzc2FnZV9hZGRfdGFpbCh4ZmVycywgJm1zZyk7CisJcmV0ID0gc3BpX3N5bmMoc3QtPnVzLCAmbXNnKTsKKwltdXRleF91bmxvY2soJnN0LT5idWZfbG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFkZTc3NTNfc3BpX3JlYWRfcmVnXzgoc3RydWN0IGRldmljZSAqZGV2LAorCQl1OCByZWdfYWRkcmVzcywKKwkJdTggKnZhbCkKK3sKKwlzdHJ1Y3Qgc3BpX21lc3NhZ2UgbXNnOworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWRlNzc1M19zdGF0ZSAqc3QgPSBpaW9fZGV2X2dldF9kZXZkYXRhKGluZGlvX2Rldik7CisJaW50IHJldDsKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyIHhmZXJzW10gPSB7CisJCXsKKwkJCS50eF9idWYgPSBzdC0+dHgsCisJCQkucnhfYnVmID0gc3QtPnJ4LAorCQkJLmJpdHNfcGVyX3dvcmQgPSA4LAorCQkJLmxlbiA9IDIsCisJCX0sCisJfTsKKworCW11dGV4X2xvY2soJnN0LT5idWZfbG9jayk7CisJc3QtPnR4WzBdID0gQURFNzc1M19SRUFEX1JFRyhyZWdfYWRkcmVzcyk7CisJc3QtPnR4WzFdID0gMDsKKworCXNwaV9tZXNzYWdlX2luaXQoJm1zZyk7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoeGZlcnMsICZtc2cpOworCXJldCA9IHNwaV9zeW5jKHN0LT51cywgJm1zZyk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZzdC0+dXMtPmRldiwgInByb2JsZW0gd2hlbiByZWFkaW5nIDggYml0IHJlZ2lzdGVyIDB4JTAyWCIsCisJCQkJcmVnX2FkZHJlc3MpOworCQlnb3RvIGVycm9yX3JldDsKKwl9CisJKnZhbCA9IHN0LT5yeFsxXTsKKworZXJyb3JfcmV0OgorCW11dGV4X3VubG9jaygmc3QtPmJ1Zl9sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFkZTc3NTNfc3BpX3JlYWRfcmVnXzE2KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJdTggcmVnX2FkZHJlc3MsCisJCXUxNiAqdmFsKQoreworCXN0cnVjdCBzcGlfbWVzc2FnZSBtc2c7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZGU3NzUzX3N0YXRlICpzdCA9IGlpb19kZXZfZ2V0X2RldmRhdGEoaW5kaW9fZGV2KTsKKwlpbnQgcmV0OworCXN0cnVjdCBzcGlfdHJhbnNmZXIgeGZlcnNbXSA9IHsKKwkJeworCQkJLnR4X2J1ZiA9IHN0LT50eCwKKwkJCS5yeF9idWYgPSBzdC0+cngsCisJCQkuYml0c19wZXJfd29yZCA9IDgsCisJCQkubGVuID0gMywKKwkJfSwKKwl9OworCisJbXV0ZXhfbG9jaygmc3QtPmJ1Zl9sb2NrKTsKKwlzdC0+dHhbMF0gPSBBREU3NzUzX1JFQURfUkVHKHJlZ19hZGRyZXNzKTsKKwlzdC0+dHhbMV0gPSAwOworCXN0LT50eFsyXSA9IDA7CisKKwlzcGlfbWVzc2FnZV9pbml0KCZtc2cpOworCXNwaV9tZXNzYWdlX2FkZF90YWlsKHhmZXJzLCAmbXNnKTsKKwlyZXQgPSBzcGlfc3luYyhzdC0+dXMsICZtc2cpOworCWlmIChyZXQpIHsKKwkJZGV2X2Vycigmc3QtPnVzLT5kZXYsICJwcm9ibGVtIHdoZW4gcmVhZGluZyAxNiBiaXQgcmVnaXN0ZXIgMHglMDJYIiwKKwkJCQlyZWdfYWRkcmVzcyk7CisJCWdvdG8gZXJyb3JfcmV0OworCX0KKwkqdmFsID0gKHN0LT5yeFsxXSA8PCA4KSB8IHN0LT5yeFsyXTsKKworZXJyb3JfcmV0OgorCW11dGV4X3VubG9jaygmc3QtPmJ1Zl9sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFkZTc3NTNfc3BpX3JlYWRfcmVnXzI0KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJdTggcmVnX2FkZHJlc3MsCisJCXUzMiAqdmFsKQoreworCXN0cnVjdCBzcGlfbWVzc2FnZSBtc2c7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZGU3NzUzX3N0YXRlICpzdCA9IGlpb19kZXZfZ2V0X2RldmRhdGEoaW5kaW9fZGV2KTsKKwlpbnQgcmV0OworCXN0cnVjdCBzcGlfdHJhbnNmZXIgeGZlcnNbXSA9IHsKKwkJeworCQkJLnR4X2J1ZiA9IHN0LT50eCwKKwkJCS5yeF9idWYgPSBzdC0+cngsCisJCQkuYml0c19wZXJfd29yZCA9IDgsCisJCQkubGVuID0gNCwKKwkJfSwKKwl9OworCisJbXV0ZXhfbG9jaygmc3QtPmJ1Zl9sb2NrKTsKKwlzdC0+dHhbMF0gPSBBREU3NzUzX1JFQURfUkVHKHJlZ19hZGRyZXNzKTsKKwlzdC0+dHhbMV0gPSAwOworCXN0LT50eFsyXSA9IDA7CisJc3QtPnR4WzNdID0gMDsKKworCXNwaV9tZXNzYWdlX2luaXQoJm1zZyk7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoeGZlcnMsICZtc2cpOworCXJldCA9IHNwaV9zeW5jKHN0LT51cywgJm1zZyk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZzdC0+dXMtPmRldiwgInByb2JsZW0gd2hlbiByZWFkaW5nIDI0IGJpdCByZWdpc3RlciAweCUwMlgiLAorCQkJCXJlZ19hZGRyZXNzKTsKKwkJZ290byBlcnJvcl9yZXQ7CisJfQorCSp2YWwgPSAoc3QtPnJ4WzFdIDw8IDE2KSB8IChzdC0+cnhbMl0gPDwgOCkgfCBzdC0+cnhbM107CisKK2Vycm9yX3JldDoKKwltdXRleF91bmxvY2soJnN0LT5idWZfbG9jayk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QgYWRlNzc1M19yZWFkXzhiaXQoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCWludCByZXQ7CisJdTggdmFsID0gMDsKKwlzdHJ1Y3QgaWlvX2Rldl9hdHRyICp0aGlzX2F0dHIgPSB0b19paW9fZGV2X2F0dHIoYXR0cik7CisKKwlyZXQgPSBhZGU3NzUzX3NwaV9yZWFkX3JlZ184KGRldiwgdGhpc19hdHRyLT5hZGRyZXNzLCAmdmFsKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIHZhbCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkZTc3NTNfcmVhZF8xNmJpdChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJaW50IHJldDsKKwl1MTYgdmFsID0gMDsKKwlzdHJ1Y3QgaWlvX2Rldl9hdHRyICp0aGlzX2F0dHIgPSB0b19paW9fZGV2X2F0dHIoYXR0cik7CisKKwlyZXQgPSBhZGU3NzUzX3NwaV9yZWFkX3JlZ18xNihkZXYsIHRoaXNfYXR0ci0+YWRkcmVzcywgJnZhbCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCB2YWwpOworfQorCitzdGF0aWMgc3NpemVfdCBhZGU3NzUzX3JlYWRfMjRiaXQoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCWludCByZXQ7CisJdTMyIHZhbCA9IDA7CisJc3RydWN0IGlpb19kZXZfYXR0ciAqdGhpc19hdHRyID0gdG9faWlvX2Rldl9hdHRyKGF0dHIpOworCisJcmV0ID0gYWRlNzc1M19zcGlfcmVhZF9yZWdfMjQoZGV2LCB0aGlzX2F0dHItPmFkZHJlc3MsICZ2YWwpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgdmFsICYgMHhGRkZGRkYpOworfQorCitzdGF0aWMgc3NpemVfdCBhZGU3NzUzX3dyaXRlXzhiaXQoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgbGVuKQoreworCXN0cnVjdCBpaW9fZGV2X2F0dHIgKnRoaXNfYXR0ciA9IHRvX2lpb19kZXZfYXR0cihhdHRyKTsKKwlpbnQgcmV0OworCWxvbmcgdmFsOworCisJcmV0ID0gc3RyaWN0X3N0cnRvbChidWYsIDEwLCAmdmFsKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3JldDsKKwlyZXQgPSBhZGU3NzUzX3NwaV93cml0ZV9yZWdfOChkZXYsIHRoaXNfYXR0ci0+YWRkcmVzcywgdmFsKTsKKworZXJyb3JfcmV0OgorCXJldHVybiByZXQgPyByZXQgOiBsZW47Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkZTc3NTNfd3JpdGVfMTZiaXQoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgbGVuKQoreworCXN0cnVjdCBpaW9fZGV2X2F0dHIgKnRoaXNfYXR0ciA9IHRvX2lpb19kZXZfYXR0cihhdHRyKTsKKwlpbnQgcmV0OworCWxvbmcgdmFsOworCisJcmV0ID0gc3RyaWN0X3N0cnRvbChidWYsIDEwLCAmdmFsKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3JldDsKKwlyZXQgPSBhZGU3NzUzX3NwaV93cml0ZV9yZWdfMTYoZGV2LCB0aGlzX2F0dHItPmFkZHJlc3MsIHZhbCk7CisKK2Vycm9yX3JldDoKKwlyZXR1cm4gcmV0ID8gcmV0IDogbGVuOworfQorCitzdGF0aWMgaW50IGFkZTc3NTNfcmVzZXQoc3RydWN0IGRldmljZSAqZGV2KQoreworCWludCByZXQ7CisJdTE2IHZhbDsKKwlhZGU3NzUzX3NwaV9yZWFkX3JlZ18xNihkZXYsCisJCQlBREU3NzUzX01PREUsCisJCQkmdmFsKTsKKwl2YWwgfD0gMSA8PCA2OyAvKiBTb2Z0d2FyZSBDaGlwIFJlc2V0ICovCisJcmV0ID0gYWRlNzc1M19zcGlfd3JpdGVfcmVnXzE2KGRldiwKKwkJCUFERTc3NTNfTU9ERSwKKwkJCXZhbCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3NpemVfdCBhZGU3NzUzX3dyaXRlX3Jlc2V0KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbikKK3sKKwlpZiAobGVuIDwgMSkKKwkJcmV0dXJuIC0xOworCXN3aXRjaCAoYnVmWzBdKSB7CisJY2FzZSAnMSc6CisJY2FzZSAneSc6CisJY2FzZSAnWSc6CisJCXJldHVybiBhZGU3NzUzX3Jlc2V0KGRldik7CisJfQorCXJldHVybiAtMTsKK30KKworc3RhdGljIElJT19ERVZfQVRUUl9BRU5FUkdZKGFkZTc3NTNfcmVhZF8yNGJpdCwgQURFNzc1M19BRU5FUkdZKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfTEFFTkVSR1koYWRlNzc1M19yZWFkXzI0Yml0LCBBREU3NzUzX0xBRU5FUkdZKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfVkFFTkVSR1koYWRlNzc1M19yZWFkXzI0Yml0LCBBREU3NzUzX1ZBRU5FUkdZKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfTFZBRU5FUkdZKGFkZTc3NTNfcmVhZF8yNGJpdCwgQURFNzc1M19MVkFFTkVSR1kpOworc3RhdGljIElJT19ERVZfQVRUUl9DRkRFTihTX0lXVVNSIHwgU19JUlVHTywKKwkJYWRlNzc1M19yZWFkXzE2Yml0LAorCQlhZGU3NzUzX3dyaXRlXzE2Yml0LAorCQlBREU3NzUzX0NGREVOKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfQ0ZOVU0oU19JV1VTUiB8IFNfSVJVR08sCisJCWFkZTc3NTNfcmVhZF84Yml0LAorCQlhZGU3NzUzX3dyaXRlXzhiaXQsCisJCUFERTc3NTNfQ0ZOVU0pOworc3RhdGljIElJT19ERVZfQVRUUl9DSEtTVU0oYWRlNzc1M19yZWFkXzhiaXQsIEFERTc3NTNfQ0hLU1VNKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfUEhDQUwoU19JV1VTUiB8IFNfSVJVR08sCisJCWFkZTc3NTNfcmVhZF8xNmJpdCwKKwkJYWRlNzc1M193cml0ZV8xNmJpdCwKKwkJQURFNzc1M19QSENBTCk7CitzdGF0aWMgSUlPX0RFVl9BVFRSX0FQT1MoU19JV1VTUiB8IFNfSVJVR08sCisJCWFkZTc3NTNfcmVhZF8xNmJpdCwKKwkJYWRlNzc1M193cml0ZV8xNmJpdCwKKwkJQURFNzc1M19BUE9TKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfU0FHQ1lDKFNfSVdVU1IgfCBTX0lSVUdPLAorCQlhZGU3NzUzX3JlYWRfOGJpdCwKKwkJYWRlNzc1M193cml0ZV84Yml0LAorCQlBREU3NzUzX1NBR0NZQyk7CitzdGF0aWMgSUlPX0RFVl9BVFRSX1NBR0xWTChTX0lXVVNSIHwgU19JUlVHTywKKwkJYWRlNzc1M19yZWFkXzhiaXQsCisJCWFkZTc3NTNfd3JpdGVfOGJpdCwKKwkJQURFNzc1M19TQUdMVkwpOworc3RhdGljIElJT19ERVZfQVRUUl9MSU5FQ1lDKFNfSVdVU1IgfCBTX0lSVUdPLAorCQlhZGU3NzUzX3JlYWRfOGJpdCwKKwkJYWRlNzc1M193cml0ZV84Yml0LAorCQlBREU3NzUzX0xJTkVDWUMpOworc3RhdGljIElJT19ERVZfQVRUUl9XRElWKFNfSVdVU1IgfCBTX0lSVUdPLAorCQlhZGU3NzUzX3JlYWRfOGJpdCwKKwkJYWRlNzc1M193cml0ZV84Yml0LAorCQlBREU3NzUzX1dESVYpOworc3RhdGljIElJT19ERVZfQVRUUl9JUk1TKFNfSVdVU1IgfCBTX0lSVUdPLAorCQlhZGU3NzUzX3JlYWRfMjRiaXQsCisJCU5VTEwsCisJCUFERTc3NTNfSVJNUyk7CitzdGF0aWMgSUlPX0RFVl9BVFRSX1ZSTVMoU19JUlVHTywKKwkJYWRlNzc1M19yZWFkXzI0Yml0LAorCQlOVUxMLAorCQlBREU3NzUzX1ZSTVMpOworc3RhdGljIElJT19ERVZfQVRUUl9JUk1TT1MoU19JV1VTUiB8IFNfSVJVR08sCisJCWFkZTc3NTNfcmVhZF8xNmJpdCwKKwkJYWRlNzc1M193cml0ZV8xNmJpdCwKKwkJQURFNzc1M19JUk1TT1MpOworc3RhdGljIElJT19ERVZfQVRUUl9WUk1TT1MoU19JV1VTUiB8IFNfSVJVR08sCisJCWFkZTc3NTNfcmVhZF8xNmJpdCwKKwkJYWRlNzc1M193cml0ZV8xNmJpdCwKKwkJQURFNzc1M19WUk1TT1MpOworc3RhdGljIElJT19ERVZfQVRUUl9XR0FJTihTX0lXVVNSIHwgU19JUlVHTywKKwkJYWRlNzc1M19yZWFkXzE2Yml0LAorCQlhZGU3NzUzX3dyaXRlXzE2Yml0LAorCQlBREU3NzUzX1dHQUlOKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfVkFHQUlOKFNfSVdVU1IgfCBTX0lSVUdPLAorCQlhZGU3NzUzX3JlYWRfMTZiaXQsCisJCWFkZTc3NTNfd3JpdGVfMTZiaXQsCisJCUFERTc3NTNfVkFHQUlOKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfUEdBX0dBSU4oU19JV1VTUiB8IFNfSVJVR08sCisJCWFkZTc3NTNfcmVhZF8xNmJpdCwKKwkJYWRlNzc1M193cml0ZV8xNmJpdCwKKwkJQURFNzc1M19HQUlOKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfSVBLTFZMKFNfSVdVU1IgfCBTX0lSVUdPLAorCQlhZGU3NzUzX3JlYWRfOGJpdCwKKwkJYWRlNzc1M193cml0ZV84Yml0LAorCQlBREU3NzUzX0lQS0xWTCk7CitzdGF0aWMgSUlPX0RFVl9BVFRSX1ZQS0xWTChTX0lXVVNSIHwgU19JUlVHTywKKwkJYWRlNzc1M19yZWFkXzhiaXQsCisJCWFkZTc3NTNfd3JpdGVfOGJpdCwKKwkJQURFNzc1M19WUEtMVkwpOworc3RhdGljIElJT19ERVZfQVRUUl9JUEVBSyhTX0lSVUdPLAorCQlhZGU3NzUzX3JlYWRfMjRiaXQsCisJCU5VTEwsCisJCUFERTc3NTNfSVBFQUspOworc3RhdGljIElJT19ERVZfQVRUUl9WUEVBSyhTX0lSVUdPLAorCQlhZGU3NzUzX3JlYWRfMjRiaXQsCisJCU5VTEwsCisJCUFERTc3NTNfVlBFQUspOworc3RhdGljIElJT19ERVZfQVRUUl9WUEVSSU9EKFNfSVJVR08sCisJCWFkZTc3NTNfcmVhZF8xNmJpdCwKKwkJTlVMTCwKKwkJQURFNzc1M19QRVJJT0QpOworc3RhdGljIElJT19ERVZfQVRUUl9DSF9PRkYoMSwgU19JV1VTUiB8IFNfSVJVR08sCisJCWFkZTc3NTNfcmVhZF84Yml0LAorCQlhZGU3NzUzX3dyaXRlXzhiaXQsCisJCUFERTc3NTNfQ0gxT1MpOworc3RhdGljIElJT19ERVZfQVRUUl9DSF9PRkYoMiwgU19JV1VTUiB8IFNfSVJVR08sCisJCWFkZTc3NTNfcmVhZF84Yml0LAorCQlhZGU3NzUzX3dyaXRlXzhiaXQsCisJCUFERTc3NTNfQ0gyT1MpOworCitzdGF0aWMgaW50IGFkZTc3NTNfc2V0X2lycShzdHJ1Y3QgZGV2aWNlICpkZXYsIGJvb2wgZW5hYmxlKQoreworCWludCByZXQ7CisJdTggaXJxZW47CisJcmV0ID0gYWRlNzc1M19zcGlfcmVhZF9yZWdfOChkZXYsIEFERTc3NTNfSVJRRU4sICZpcnFlbik7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9yZXQ7CisKKwlpZiAoZW5hYmxlKQorCQlpcnFlbiB8PSAxIDw8IDM7IC8qIEVuYWJsZXMgYW4gaW50ZXJydXB0IHdoZW4gYSBkYXRhIGlzCisJCQkJICAgIHByZXNlbnQgaW4gdGhlIHdhdmVmb3JtIHJlZ2lzdGVyICovCisJZWxzZQorCQlpcnFlbiAmPSB+KDEgPDwgMyk7CisKKwlyZXQgPSBhZGU3NzUzX3NwaV93cml0ZV9yZWdfOChkZXYsIEFERTc3NTNfSVJRRU4sIGlycWVuKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3JldDsKKworZXJyb3JfcmV0OgorCXJldHVybiByZXQ7Cit9CisKKy8qIFBvd2VyIGRvd24gdGhlIGRldmljZSAqLworaW50IGFkZTc3NTNfc3RvcF9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2KQoreworCWludCByZXQ7CisJdTE2IHZhbDsKKwlhZGU3NzUzX3NwaV9yZWFkX3JlZ18xNihkZXYsCisJCQlBREU3NzUzX01PREUsCisJCQkmdmFsKTsKKwl2YWwgfD0gMSA8PCA0OyAgLyogQUQgY29udmVydGVycyBjYW4gYmUgdHVybmVkIG9mZiAqLworCXJldCA9IGFkZTc3NTNfc3BpX3dyaXRlX3JlZ18xNihkZXYsCisJCQlBREU3NzUzX01PREUsCisJCQl2YWwpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhZGU3NzUzX2luaXRpYWxfc2V0dXAoc3RydWN0IGFkZTc3NTNfc3RhdGUgKnN0KQoreworCWludCByZXQ7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJnN0LT5pbmRpb19kZXYtPmRldjsKKworCS8qIHVzZSBsb3cgc3BpIHNwZWVkIGZvciBpbml0ICovCisJc3QtPnVzLT5tb2RlID0gU1BJX01PREVfMzsKKwlzcGlfc2V0dXAoc3QtPnVzKTsKKworCS8qIERpc2FibGUgSVJRICovCisJcmV0ID0gYWRlNzc1M19zZXRfaXJxKGRldiwgZmFsc2UpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihkZXYsICJkaXNhYmxlIGlycSBmYWlsZWQiKTsKKwkJZ290byBlcnJfcmV0OworCX0KKworCWFkZTc3NTNfcmVzZXQoZGV2KTsKKwltc2xlZXAoQURFNzc1M19TVEFSVFVQX0RFTEFZKTsKKworZXJyX3JldDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3NpemVfdCBhZGU3NzUzX3JlYWRfZnJlcXVlbmN5KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlpbnQgcmV0LCBsZW4gPSAwOworCXU4IHQ7CisJaW50IHNwczsKKwlyZXQgPSBhZGU3NzUzX3NwaV9yZWFkX3JlZ184KGRldiwKKwkJCUFERTc3NTNfTU9ERSwKKwkJCSZ0KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJdCA9ICh0ID4+IDExKSAmIDB4MzsKKwlzcHMgPSAyNzkwMCAvICgxICsgdCk7CisKKwlsZW4gPSBzcHJpbnRmKGJ1ZiwgIiVkIFNQU1xuIiwgc3BzKTsKKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgc3NpemVfdCBhZGU3NzUzX3dyaXRlX2ZyZXF1ZW5jeShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBsZW4pCit7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZGU3NzUzX3N0YXRlICpzdCA9IGlpb19kZXZfZ2V0X2RldmRhdGEoaW5kaW9fZGV2KTsKKwl1bnNpZ25lZCBsb25nIHZhbDsKKwlpbnQgcmV0OworCXUxNiByZWcsIHQ7CisKKwlyZXQgPSBzdHJpY3Rfc3RydG9sKGJ1ZiwgMTAsICZ2YWwpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwltdXRleF9sb2NrKCZpbmRpb19kZXYtPm1sb2NrKTsKKworCXQgPSAoMjc5MDAgLyB2YWwpOworCWlmICh0ID4gMCkKKwkJdC0tOworCisJaWYgKHQgPiAxKQorCQlzdC0+dXMtPm1heF9zcGVlZF9oeiA9IEFERTc3NTNfU1BJX1NMT1c7CisJZWxzZQorCQlzdC0+dXMtPm1heF9zcGVlZF9oeiA9IEFERTc3NTNfU1BJX0ZBU1Q7CisKKwlyZXQgPSBhZGU3NzUzX3NwaV9yZWFkX3JlZ18xNihkZXYsCisJCQlBREU3NzUzX01PREUsCisJCQkmcmVnKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKworCXJlZyAmPSB+KDMgPDwgMTEpOworCXJlZyB8PSB0IDw8IDExOworCisJcmV0ID0gYWRlNzc1M19zcGlfd3JpdGVfcmVnXzE2KGRldiwKKwkJCUFERTc3NTNfTU9ERSwKKwkJCXJlZyk7CisKK291dDoKKwltdXRleF91bmxvY2soJmluZGlvX2Rldi0+bWxvY2spOworCisJcmV0dXJuIHJldCA/IHJldCA6IGxlbjsKK30KK3N0YXRpYyBJSU9fREVWX0FUVFJfVEVNUF9SQVcoYWRlNzc1M19yZWFkXzhiaXQpOworc3RhdGljIElJT19DT05TVF9BVFRSKHRlbXBfb2Zmc2V0LCAiLTI1IEMiKTsKK3N0YXRpYyBJSU9fQ09OU1RfQVRUUih0ZW1wX3NjYWxlLCAiMC42NyBDIik7CisKK3N0YXRpYyBJSU9fREVWX0FUVFJfU0FNUF9GUkVRKFNfSVdVU1IgfCBTX0lSVUdPLAorCQlhZGU3NzUzX3JlYWRfZnJlcXVlbmN5LAorCQlhZGU3NzUzX3dyaXRlX2ZyZXF1ZW5jeSk7CisKK3N0YXRpYyBJSU9fREVWX0FUVFJfUkVTRVQoYWRlNzc1M193cml0ZV9yZXNldCk7CisKK3N0YXRpYyBJSU9fQ09OU1RfQVRUUl9TQU1QX0ZSRVFfQVZBSUwoIjI3OTAwIDE0MDAwIDcwMDAgMzUwMCIpOworCitzdGF0aWMgSUlPX0NPTlNUX0FUVFIobmFtZSwgImFkZTc3NTMiKTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmFkZTc3NTNfZXZlbnRfYXR0cmlidXRlc1tdID0geworCU5VTEwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGFkZTc3NTNfZXZlbnRfYXR0cmlidXRlX2dyb3VwID0geworCS5hdHRycyA9IGFkZTc3NTNfZXZlbnRfYXR0cmlidXRlcywKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICphZGU3NzUzX2F0dHJpYnV0ZXNbXSA9IHsKKwkmaWlvX2Rldl9hdHRyX3RlbXBfcmF3LmRldl9hdHRyLmF0dHIsCisJJmlpb19jb25zdF9hdHRyX3RlbXBfb2Zmc2V0LmRldl9hdHRyLmF0dHIsCisJJmlpb19jb25zdF9hdHRyX3RlbXBfc2NhbGUuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX3NhbXBsaW5nX2ZyZXF1ZW5jeS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fY29uc3RfYXR0cl9zYW1wbGluZ19mcmVxdWVuY3lfYXZhaWxhYmxlLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9yZXNldC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fY29uc3RfYXR0cl9uYW1lLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9waGNhbC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfY2ZkZW4uZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2FlbmVyZ3kuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2xhZW5lcmd5LmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl92YWVuZXJneS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfbHZhZW5lcmd5LmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9jZm51bS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfYXBvcy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfc2FnY3ljLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9zYWdsdmwuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2xpbmVjeWMuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2Noa3N1bS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfcGdhX2dhaW4uZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX3dnYWluLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9jaG9mZl8xLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9jaG9mZl8yLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl93ZGl2LmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9pcm1zLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl92cm1zLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9pcm1zb3MuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX3ZybXNvcy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfdmFnYWluLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9pcGtsdmwuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX3Zwa2x2bC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfaXBlYWsuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX3ZwZWFrLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl92cGVyaW9kLmRldl9hdHRyLmF0dHIsCisJTlVMTCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGFkZTc3NTNfYXR0cmlidXRlX2dyb3VwID0geworCS5hdHRycyA9IGFkZTc3NTNfYXR0cmlidXRlcywKK307CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGFkZTc3NTNfcHJvYmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlpbnQgcmV0LCByZWdkb25lID0gMDsKKwlzdHJ1Y3QgYWRlNzc1M19zdGF0ZSAqc3QgPSBremFsbG9jKHNpemVvZiAqc3QsIEdGUF9LRVJORUwpOworCWlmICghc3QpIHsKKwkJcmV0ID0gIC1FTk9NRU07CisJCWdvdG8gZXJyb3JfcmV0OworCX0KKwkvKiB0aGlzIGlzIG9ubHkgdXNlZCBmb3IgcmVtb3ZhbCBwdXJwb3NlcyAqLworCXNwaV9zZXRfZHJ2ZGF0YShzcGksIHN0KTsKKworCS8qIEFsbG9jYXRlIHRoZSBjb21tcyBidWZmZXJzICovCisJc3QtPnJ4ID0ga3phbGxvYyhzaXplb2YoKnN0LT5yeCkqQURFNzc1M19NQVhfUlgsIEdGUF9LRVJORUwpOworCWlmIChzdC0+cnggPT0gTlVMTCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycm9yX2ZyZWVfc3Q7CisJfQorCXN0LT50eCA9IGt6YWxsb2Moc2l6ZW9mKCpzdC0+dHgpKkFERTc3NTNfTUFYX1RYLCBHRlBfS0VSTkVMKTsKKwlpZiAoc3QtPnR4ID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJvcl9mcmVlX3J4OworCX0KKwlzdC0+dXMgPSBzcGk7CisJbXV0ZXhfaW5pdCgmc3QtPmJ1Zl9sb2NrKTsKKwkvKiBzZXR1cCB0aGUgaW5kdXN0cmlhbGlvIGRyaXZlciBhbGxvY2F0ZWQgZWxlbWVudHMgKi8KKwlzdC0+aW5kaW9fZGV2ID0gaWlvX2FsbG9jYXRlX2RldmljZSgpOworCWlmIChzdC0+aW5kaW9fZGV2ID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJvcl9mcmVlX3R4OworCX0KKworCXN0LT5pbmRpb19kZXYtPmRldi5wYXJlbnQgPSAmc3BpLT5kZXY7CisJc3QtPmluZGlvX2Rldi0+bnVtX2ludGVycnVwdF9saW5lcyA9IDE7CisJc3QtPmluZGlvX2Rldi0+ZXZlbnRfYXR0cnMgPSAmYWRlNzc1M19ldmVudF9hdHRyaWJ1dGVfZ3JvdXA7CisJc3QtPmluZGlvX2Rldi0+YXR0cnMgPSAmYWRlNzc1M19hdHRyaWJ1dGVfZ3JvdXA7CisJc3QtPmluZGlvX2Rldi0+ZGV2X2RhdGEgPSAodm9pZCAqKShzdCk7CisJc3QtPmluZGlvX2Rldi0+ZHJpdmVyX21vZHVsZSA9IFRISVNfTU9EVUxFOworCXN0LT5pbmRpb19kZXYtPm1vZGVzID0gSU5ESU9fRElSRUNUX01PREU7CisKKwlyZXQgPSBhZGU3NzUzX2NvbmZpZ3VyZV9yaW5nKHN0LT5pbmRpb19kZXYpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfZnJlZV9kZXY7CisKKwlyZXQgPSBpaW9fZGV2aWNlX3JlZ2lzdGVyKHN0LT5pbmRpb19kZXYpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfdW5yZWdfcmluZ19mdW5jczsKKwlyZWdkb25lID0gMTsKKworCXJldCA9IGFkZTc3NTNfaW5pdGlhbGl6ZV9yaW5nKHN0LT5pbmRpb19kZXYtPnJpbmcpOworCWlmIChyZXQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJmYWlsZWQgdG8gaW5pdGlhbGl6ZSB0aGUgcmluZ1xuIik7CisJCWdvdG8gZXJyb3JfdW5yZWdfcmluZ19mdW5jczsKKwl9CisKKwlpZiAoc3BpLT5pcnEpIHsKKwkJcmV0ID0gaWlvX3JlZ2lzdGVyX2ludGVycnVwdF9saW5lKHNwaS0+aXJxLAorCQkJCXN0LT5pbmRpb19kZXYsCisJCQkJMCwKKwkJCQlJUlFGX1RSSUdHRVJfRkFMTElORywKKwkJCQkiYWRlNzc1MyIpOworCQlpZiAocmV0KQorCQkJZ290byBlcnJvcl91bmluaXRpYWxpemVfcmluZzsKKworCQlyZXQgPSBhZGU3NzUzX3Byb2JlX3RyaWdnZXIoc3QtPmluZGlvX2Rldik7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycm9yX3VucmVnaXN0ZXJfbGluZTsKKwl9CisKKwkvKiBHZXQgdGhlIGRldmljZSBpbnRvIGEgc2FuZSBpbml0aWFsIHN0YXRlICovCisJcmV0ID0gYWRlNzc1M19pbml0aWFsX3NldHVwKHN0KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3JlbW92ZV90cmlnZ2VyOworCXJldHVybiAwOworCitlcnJvcl9yZW1vdmVfdHJpZ2dlcjoKKwlpZiAoc3QtPmluZGlvX2Rldi0+bW9kZXMgJiBJTkRJT19SSU5HX1RSSUdHRVJFRCkKKwkJYWRlNzc1M19yZW1vdmVfdHJpZ2dlcihzdC0+aW5kaW9fZGV2KTsKK2Vycm9yX3VucmVnaXN0ZXJfbGluZToKKwlpZiAoc3QtPmluZGlvX2Rldi0+bW9kZXMgJiBJTkRJT19SSU5HX1RSSUdHRVJFRCkKKwkJaWlvX3VucmVnaXN0ZXJfaW50ZXJydXB0X2xpbmUoc3QtPmluZGlvX2RldiwgMCk7CitlcnJvcl91bmluaXRpYWxpemVfcmluZzoKKwlhZGU3NzUzX3VuaW5pdGlhbGl6ZV9yaW5nKHN0LT5pbmRpb19kZXYtPnJpbmcpOworZXJyb3JfdW5yZWdfcmluZ19mdW5jczoKKwlhZGU3NzUzX3VuY29uZmlndXJlX3Jpbmcoc3QtPmluZGlvX2Rldik7CitlcnJvcl9mcmVlX2RldjoKKwlpZiAocmVnZG9uZSkKKwkJaWlvX2RldmljZV91bnJlZ2lzdGVyKHN0LT5pbmRpb19kZXYpOworCWVsc2UKKwkJaWlvX2ZyZWVfZGV2aWNlKHN0LT5pbmRpb19kZXYpOworZXJyb3JfZnJlZV90eDoKKwlrZnJlZShzdC0+dHgpOworZXJyb3JfZnJlZV9yeDoKKwlrZnJlZShzdC0+cngpOworZXJyb3JfZnJlZV9zdDoKKwlrZnJlZShzdCk7CitlcnJvcl9yZXQ6CisJcmV0dXJuIHJldDsKK30KKworLyogZml4bWUsIGNvbmZpcm0gb3JkZXJpbmcgaW4gdGhpcyBmdW5jdGlvbiAqLworc3RhdGljIGludCBhZGU3NzUzX3JlbW92ZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCWludCByZXQ7CisJc3RydWN0IGFkZTc3NTNfc3RhdGUgKnN0ID0gc3BpX2dldF9kcnZkYXRhKHNwaSk7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IHN0LT5pbmRpb19kZXY7CisKKwlyZXQgPSBhZGU3NzUzX3N0b3BfZGV2aWNlKCYoaW5kaW9fZGV2LT5kZXYpKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl9yZXQ7CisKKwlmbHVzaF9zY2hlZHVsZWRfd29yaygpOworCisJYWRlNzc1M19yZW1vdmVfdHJpZ2dlcihpbmRpb19kZXYpOworCWlmIChzcGktPmlycSAmJiBncGlvX2lzX3ZhbGlkKGlycV90b19ncGlvKHNwaS0+aXJxKSkgPiAwKQorCQlpaW9fdW5yZWdpc3Rlcl9pbnRlcnJ1cHRfbGluZShpbmRpb19kZXYsIDApOworCisJYWRlNzc1M191bmluaXRpYWxpemVfcmluZyhpbmRpb19kZXYtPnJpbmcpOworCWFkZTc3NTNfdW5jb25maWd1cmVfcmluZyhpbmRpb19kZXYpOworCWlpb19kZXZpY2VfdW5yZWdpc3RlcihpbmRpb19kZXYpOworCWtmcmVlKHN0LT50eCk7CisJa2ZyZWUoc3QtPnJ4KTsKKwlrZnJlZShzdCk7CisKKwlyZXR1cm4gMDsKKworZXJyX3JldDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3RydWN0IHNwaV9kcml2ZXIgYWRlNzc1M19kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAiYWRlNzc1MyIsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCX0sCisJLnByb2JlID0gYWRlNzc1M19wcm9iZSwKKwkucmVtb3ZlID0gX19kZXZleGl0X3AoYWRlNzc1M19yZW1vdmUpLAorfTsKKworc3RhdGljIF9faW5pdCBpbnQgYWRlNzc1M19pbml0KHZvaWQpCit7CisJcmV0dXJuIHNwaV9yZWdpc3Rlcl9kcml2ZXIoJmFkZTc3NTNfZHJpdmVyKTsKK30KK21vZHVsZV9pbml0KGFkZTc3NTNfaW5pdCk7CisKK3N0YXRpYyBfX2V4aXQgdm9pZCBhZGU3NzUzX2V4aXQodm9pZCkKK3sKKwlzcGlfdW5yZWdpc3Rlcl9kcml2ZXIoJmFkZTc3NTNfZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KGFkZTc3NTNfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIkJhcnJ5IFNvbmcgPDIxY25iYW9AZ21haWwuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJBbmFsb2cgRGV2aWNlcyBBREU3NzUzLzYgU2luZ2xlLVBoYXNlIE11bHRpZnVuY3Rpb24gTWV0ZXJpbmcgSUMgRHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL21ldGVyL2FkZTc3NTMuaCBiL2RyaXZlcnMvc3RhZ2luZy9paW8vbWV0ZXIvYWRlNzc1My5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzNzIyYjgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL21ldGVyL2FkZTc3NTMuaApAQCAtMCwwICsxLDE0MCBAQAorI2lmbmRlZiBfQURFNzc1M19ICisjZGVmaW5lIF9BREU3NzUzX0gKKworI2RlZmluZSBBREU3NzUzX1dBVkVGT1JNICAgMHgwMQorI2RlZmluZSBBREU3NzUzX0FFTkVSR1kgICAgMHgwMgorI2RlZmluZSBBREU3NzUzX1JBRU5FUkdZICAgMHgwMworI2RlZmluZSBBREU3NzUzX0xBRU5FUkdZICAgMHgwNAorI2RlZmluZSBBREU3NzUzX1ZBRU5FUkdZICAgMHgwNQorI2RlZmluZSBBREU3NzUzX1JWQUVORVJHWSAgMHgwNgorI2RlZmluZSBBREU3NzUzX0xWQUVORVJHWSAgMHgwNworI2RlZmluZSBBREU3NzUzX0xWQVJFTkVSR1kgMHgwOAorI2RlZmluZSBBREU3NzUzX01PREUgICAgICAgMHgwOQorI2RlZmluZSBBREU3NzUzX0lSUUVOICAgICAgMHgwQQorI2RlZmluZSBBREU3NzUzX1NUQVRVUyAgICAgMHgwQgorI2RlZmluZSBBREU3NzUzX1JTVFNUQVRVUyAgMHgwQworI2RlZmluZSBBREU3NzUzX0NIMU9TICAgICAgMHgwRAorI2RlZmluZSBBREU3NzUzX0NIMk9TICAgICAgMHgwRQorI2RlZmluZSBBREU3NzUzX0dBSU4gICAgICAgMHgwRgorI2RlZmluZSBBREU3NzUzX1BIQ0FMICAgICAgMHgxMAorI2RlZmluZSBBREU3NzUzX0FQT1MgICAgICAgMHgxMQorI2RlZmluZSBBREU3NzUzX1dHQUlOICAgICAgMHgxMgorI2RlZmluZSBBREU3NzUzX1dESVYgICAgICAgMHgxMworI2RlZmluZSBBREU3NzUzX0NGTlVNICAgICAgMHgxNAorI2RlZmluZSBBREU3NzUzX0NGREVOICAgICAgMHgxNQorI2RlZmluZSBBREU3NzUzX0lSTVMgICAgICAgMHgxNgorI2RlZmluZSBBREU3NzUzX1ZSTVMgICAgICAgMHgxNworI2RlZmluZSBBREU3NzUzX0lSTVNPUyAgICAgMHgxOAorI2RlZmluZSBBREU3NzUzX1ZSTVNPUyAgICAgMHgxOQorI2RlZmluZSBBREU3NzUzX1ZBR0FJTiAgICAgMHgxQQorI2RlZmluZSBBREU3NzUzX1ZBRElWICAgICAgMHgxQgorI2RlZmluZSBBREU3NzUzX0xJTkVDWUMgICAgMHgxQworI2RlZmluZSBBREU3NzUzX1pYVE9VVCAgICAgMHgxRAorI2RlZmluZSBBREU3NzUzX1NBR0NZQyAgICAgMHgxRQorI2RlZmluZSBBREU3NzUzX1NBR0xWTCAgICAgMHgxRgorI2RlZmluZSBBREU3NzUzX0lQS0xWTCAgICAgMHgyMAorI2RlZmluZSBBREU3NzUzX1ZQS0xWTCAgICAgMHgyMQorI2RlZmluZSBBREU3NzUzX0lQRUFLICAgICAgMHgyMgorI2RlZmluZSBBREU3NzUzX1JTVElQRUFLICAgMHgyMworI2RlZmluZSBBREU3NzUzX1ZQRUFLICAgICAgMHgyNAorI2RlZmluZSBBREU3NzUzX1JTVFZQRUFLICAgMHgyNQorI2RlZmluZSBBREU3NzUzX1RFTVAgICAgICAgMHgyNgorI2RlZmluZSBBREU3NzUzX1BFUklPRCAgICAgMHgyNworI2RlZmluZSBBREU3NzUzX1RNT0RFICAgICAgMHgzRAorI2RlZmluZSBBREU3NzUzX0NIS1NVTSAgICAgMHgzRQorI2RlZmluZSBBREU3NzUzX0RJRVJFViAgICAgMHgzRgorCisjZGVmaW5lIEFERTc3NTNfUkVBRF9SRUcoYSkgICAgYQorI2RlZmluZSBBREU3NzUzX1dSSVRFX1JFRyhhKSAoKGEpIHwgMHg4MCkKKworI2RlZmluZSBBREU3NzUzX01BWF9UWCAgICA0CisjZGVmaW5lIEFERTc3NTNfTUFYX1JYICAgIDQKKyNkZWZpbmUgQURFNzc1M19TVEFSVFVQX0RFTEFZIDEKKworI2RlZmluZSBBREU3NzUzX1NQSV9TTE9XCSh1MzIpKDMwMCAqIDEwMDApCisjZGVmaW5lIEFERTc3NTNfU1BJX0JVUlNUCSh1MzIpKDEwMDAgKiAxMDAwKQorI2RlZmluZSBBREU3NzUzX1NQSV9GQVNUCSh1MzIpKDIwMDAgKiAxMDAwKQorCisjZGVmaW5lIERSSVZFUl9OQU1FCQkiYWRlNzc1MyIKKworLyoqCisgKiBzdHJ1Y3QgYWRlNzc1M19zdGF0ZSAtIGRldmljZSBpbnN0YW5jZSBzcGVjaWZpYyBkYXRhCisgKiBAdXM6CQkJYWN0dWFsIHNwaV9kZXZpY2UKKyAqIEB3b3JrX3RyaWdnZXJfdG9fcmluZzogYmggZm9yIHRyaWdnZXJlZCBldmVudCBoYW5kbGluZworICogQGludGVyOgkJdXNlZCB0byBjaGVjayBpZiBuZXcgaW50ZXJydXB0IGhhcyBiZWVuIHRyaWdnZXJlZAorICogQGxhc3RfdGltZXN0YW1wOglwYXNzaW5nIHRpbWVzdGFtcCBmcm9tIHRoIHRvIGJoIG9mIGludGVycnVwdCBoYW5kbGVyCisgKiBAaW5kaW9fZGV2OgkJaW5kdXN0cmlhbCBJL08gZGV2aWNlIHN0cnVjdHVyZQorICogQHRyaWc6CQlkYXRhIHJlYWR5IHRyaWdnZXIgcmVnaXN0ZXJlZCB3aXRoIGlpbworICogQHR4OgkJCXRyYW5zbWl0IGJ1ZmZlcgorICogQHJ4OgkJCXJlY2lldmUgYnVmZmVyCisgKiBAYnVmX2xvY2s6CQltdXRleCB0byBwcm90ZWN0IHR4IGFuZCByeAorICoqLworc3RydWN0IGFkZTc3NTNfc3RhdGUgeworCXN0cnVjdCBzcGlfZGV2aWNlCQkqdXM7CisJc3RydWN0IHdvcmtfc3RydWN0CQl3b3JrX3RyaWdnZXJfdG9fcmluZzsKKwlzNjQJCQkJbGFzdF90aW1lc3RhbXA7CisJc3RydWN0IGlpb19kZXYJCQkqaW5kaW9fZGV2OworCXN0cnVjdCBpaW9fdHJpZ2dlcgkJKnRyaWc7CisJdTgJCQkJKnR4OworCXU4CQkJCSpyeDsKKwlzdHJ1Y3QgbXV0ZXgJCQlidWZfbG9jazsKK307CisjaWYgZGVmaW5lZChDT05GSUdfSUlPX1JJTkdfQlVGRkVSKSAmJiBkZWZpbmVkKFRISVNfSEFTX1JJTkdfQlVGRkVSX1NVUFBPUlQpCisvKiBBdCB0aGUgbW9tZW50IHRyaWdnZXJzIGFyZSBvbmx5IHVzZWQgZm9yIHJpbmcgYnVmZmVyCisgKiBmaWxsaW5nLiBUaGlzIG1heSBjaGFuZ2UhCisgKi8KKworZW51bSBhZGU3NzUzX3NjYW4geworCUFERTc3NTNfU0NBTl9BQ1RJVkVfUE9XRVIsCisJQURFNzc1M19TQ0FOX0NIMSwKKwlBREU3NzUzX1NDQU5fQ0gyLAorfTsKKwordm9pZCBhZGU3NzUzX3JlbW92ZV90cmlnZ2VyKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpOworaW50IGFkZTc3NTNfcHJvYmVfdHJpZ2dlcihzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KTsKKworc3NpemVfdCBhZGU3NzUzX3JlYWRfZGF0YV9mcm9tX3Jpbmcoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKTsKKworCitpbnQgYWRlNzc1M19jb25maWd1cmVfcmluZyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KTsKK3ZvaWQgYWRlNzc1M191bmNvbmZpZ3VyZV9yaW5nKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpOworCitpbnQgYWRlNzc1M19pbml0aWFsaXplX3Jpbmcoc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqcmluZyk7Cit2b2lkIGFkZTc3NTNfdW5pbml0aWFsaXplX3Jpbmcoc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqcmluZyk7CisjZWxzZSAvKiBDT05GSUdfSUlPX1JJTkdfQlVGRkVSICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhZGU3NzUzX3JlbW92ZV90cmlnZ2VyKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCit7Cit9CitzdGF0aWMgaW5saW5lIGludCBhZGU3NzUzX3Byb2JlX3RyaWdnZXIoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBzc2l6ZV90CithZGU3NzUzX3JlYWRfZGF0YV9mcm9tX3Jpbmcoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFkZTc3NTNfY29uZmlndXJlX3Jpbmcoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKK3sKKwlyZXR1cm4gMDsKK30KK3N0YXRpYyBpbmxpbmUgdm9pZCBhZGU3NzUzX3VuY29uZmlndXJlX3Jpbmcoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKK3sKK30KK3N0YXRpYyBpbmxpbmUgaW50IGFkZTc3NTNfaW5pdGlhbGl6ZV9yaW5nKHN0cnVjdCBpaW9fcmluZ19idWZmZXIgKnJpbmcpCit7CisJcmV0dXJuIDA7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgYWRlNzc1M191bmluaXRpYWxpemVfcmluZyhzdHJ1Y3QgaWlvX3JpbmdfYnVmZmVyICpyaW5nKQoreworfQorI2VuZGlmIC8qIENPTkZJR19JSU9fUklOR19CVUZGRVIgKi8KKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL21ldGVyL2FkZTc3NTQuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vbWV0ZXIvYWRlNzc1NC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzZGVkZmEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL21ldGVyL2FkZTc3NTQuYwpAQCAtMCwwICsxLDc1NiBAQAorLyoKKyAqIEFERTc3NTQgUG9seXBoYXNlIE11bHRpZnVuY3Rpb24gRW5lcmd5IE1ldGVyaW5nIElDIERyaXZlcgorICoKKyAqIENvcHlyaWdodCAyMDEwIEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNmcy5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKworI2luY2x1ZGUgIi4uL2lpby5oIgorI2luY2x1ZGUgIi4uL3N5c2ZzLmgiCisjaW5jbHVkZSAibWV0ZXIuaCIKKyNpbmNsdWRlICJhZGU3NzU0LmgiCisKK3N0YXRpYyBpbnQgYWRlNzc1NF9zcGlfd3JpdGVfcmVnXzgoc3RydWN0IGRldmljZSAqZGV2LAorCQl1OCByZWdfYWRkcmVzcywKKwkJdTggdmFsKQoreworCWludCByZXQ7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZGU3NzU0X3N0YXRlICpzdCA9IGlpb19kZXZfZ2V0X2RldmRhdGEoaW5kaW9fZGV2KTsKKworCW11dGV4X2xvY2soJnN0LT5idWZfbG9jayk7CisJc3QtPnR4WzBdID0gQURFNzc1NF9XUklURV9SRUcocmVnX2FkZHJlc3MpOworCXN0LT50eFsxXSA9IHZhbDsKKworCXJldCA9IHNwaV93cml0ZShzdC0+dXMsIHN0LT50eCwgMik7CisJbXV0ZXhfdW5sb2NrKCZzdC0+YnVmX2xvY2spOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhZGU3NzU0X3NwaV93cml0ZV9yZWdfMTYoc3RydWN0IGRldmljZSAqZGV2LAorCQl1OCByZWdfYWRkcmVzcywKKwkJdTE2IHZhbHVlKQoreworCWludCByZXQ7CisJc3RydWN0IHNwaV9tZXNzYWdlIG1zZzsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkZTc3NTRfc3RhdGUgKnN0ID0gaWlvX2Rldl9nZXRfZGV2ZGF0YShpbmRpb19kZXYpOworCXN0cnVjdCBzcGlfdHJhbnNmZXIgeGZlcnNbXSA9IHsKKwkJeworCQkJLnR4X2J1ZiA9IHN0LT50eCwKKwkJCS5iaXRzX3Blcl93b3JkID0gOCwKKwkJCS5sZW4gPSAzLAorCQl9CisJfTsKKworCW11dGV4X2xvY2soJnN0LT5idWZfbG9jayk7CisJc3QtPnR4WzBdID0gQURFNzc1NF9XUklURV9SRUcocmVnX2FkZHJlc3MpOworCXN0LT50eFsxXSA9ICh2YWx1ZSA+PiA4KSAmIDB4RkY7CisJc3QtPnR4WzJdID0gdmFsdWUgJiAweEZGOworCisJc3BpX21lc3NhZ2VfaW5pdCgmbXNnKTsKKwlzcGlfbWVzc2FnZV9hZGRfdGFpbCh4ZmVycywgJm1zZyk7CisJcmV0ID0gc3BpX3N5bmMoc3QtPnVzLCAmbXNnKTsKKwltdXRleF91bmxvY2soJnN0LT5idWZfbG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFkZTc3NTRfc3BpX3JlYWRfcmVnXzgoc3RydWN0IGRldmljZSAqZGV2LAorCQl1OCByZWdfYWRkcmVzcywKKwkJdTggKnZhbCkKK3sKKwlzdHJ1Y3Qgc3BpX21lc3NhZ2UgbXNnOworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWRlNzc1NF9zdGF0ZSAqc3QgPSBpaW9fZGV2X2dldF9kZXZkYXRhKGluZGlvX2Rldik7CisJaW50IHJldDsKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyIHhmZXJzW10gPSB7CisJCXsKKwkJCS50eF9idWYgPSBzdC0+dHgsCisJCQkucnhfYnVmID0gc3QtPnJ4LAorCQkJLmJpdHNfcGVyX3dvcmQgPSA4LAorCQkJLmxlbiA9IDIsCisJCX0sCisJfTsKKworCW11dGV4X2xvY2soJnN0LT5idWZfbG9jayk7CisJc3QtPnR4WzBdID0gQURFNzc1NF9SRUFEX1JFRyhyZWdfYWRkcmVzcyk7CisJc3QtPnR4WzFdID0gMDsKKworCXNwaV9tZXNzYWdlX2luaXQoJm1zZyk7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoeGZlcnMsICZtc2cpOworCXJldCA9IHNwaV9zeW5jKHN0LT51cywgJm1zZyk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZzdC0+dXMtPmRldiwgInByb2JsZW0gd2hlbiByZWFkaW5nIDggYml0IHJlZ2lzdGVyIDB4JTAyWCIsCisJCQkJcmVnX2FkZHJlc3MpOworCQlnb3RvIGVycm9yX3JldDsKKwl9CisJKnZhbCA9IHN0LT5yeFsxXTsKKworZXJyb3JfcmV0OgorCW11dGV4X3VubG9jaygmc3QtPmJ1Zl9sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFkZTc3NTRfc3BpX3JlYWRfcmVnXzE2KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJdTggcmVnX2FkZHJlc3MsCisJCXUxNiAqdmFsKQoreworCXN0cnVjdCBzcGlfbWVzc2FnZSBtc2c7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZGU3NzU0X3N0YXRlICpzdCA9IGlpb19kZXZfZ2V0X2RldmRhdGEoaW5kaW9fZGV2KTsKKwlpbnQgcmV0OworCXN0cnVjdCBzcGlfdHJhbnNmZXIgeGZlcnNbXSA9IHsKKwkJeworCQkJLnR4X2J1ZiA9IHN0LT50eCwKKwkJCS5yeF9idWYgPSBzdC0+cngsCisJCQkuYml0c19wZXJfd29yZCA9IDgsCisJCQkubGVuID0gMywKKwkJfSwKKwl9OworCisJbXV0ZXhfbG9jaygmc3QtPmJ1Zl9sb2NrKTsKKwlzdC0+dHhbMF0gPSBBREU3NzU0X1JFQURfUkVHKHJlZ19hZGRyZXNzKTsKKwlzdC0+dHhbMV0gPSAwOworCXN0LT50eFsyXSA9IDA7CisKKwlzcGlfbWVzc2FnZV9pbml0KCZtc2cpOworCXNwaV9tZXNzYWdlX2FkZF90YWlsKHhmZXJzLCAmbXNnKTsKKwlyZXQgPSBzcGlfc3luYyhzdC0+dXMsICZtc2cpOworCWlmIChyZXQpIHsKKwkJZGV2X2Vycigmc3QtPnVzLT5kZXYsICJwcm9ibGVtIHdoZW4gcmVhZGluZyAxNiBiaXQgcmVnaXN0ZXIgMHglMDJYIiwKKwkJCQlyZWdfYWRkcmVzcyk7CisJCWdvdG8gZXJyb3JfcmV0OworCX0KKwkqdmFsID0gKHN0LT5yeFsxXSA8PCA4KSB8IHN0LT5yeFsyXTsKKworZXJyb3JfcmV0OgorCW11dGV4X3VubG9jaygmc3QtPmJ1Zl9sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFkZTc3NTRfc3BpX3JlYWRfcmVnXzI0KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJdTggcmVnX2FkZHJlc3MsCisJCXUzMiAqdmFsKQoreworCXN0cnVjdCBzcGlfbWVzc2FnZSBtc2c7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZGU3NzU0X3N0YXRlICpzdCA9IGlpb19kZXZfZ2V0X2RldmRhdGEoaW5kaW9fZGV2KTsKKwlpbnQgcmV0OworCXN0cnVjdCBzcGlfdHJhbnNmZXIgeGZlcnNbXSA9IHsKKwkJeworCQkJLnR4X2J1ZiA9IHN0LT50eCwKKwkJCS5yeF9idWYgPSBzdC0+cngsCisJCQkuYml0c19wZXJfd29yZCA9IDgsCisJCQkubGVuID0gNCwKKwkJfSwKKwl9OworCisJbXV0ZXhfbG9jaygmc3QtPmJ1Zl9sb2NrKTsKKwlzdC0+dHhbMF0gPSBBREU3NzU0X1JFQURfUkVHKHJlZ19hZGRyZXNzKTsKKwlzdC0+dHhbMV0gPSAwOworCXN0LT50eFsyXSA9IDA7CisJc3QtPnR4WzNdID0gMDsKKworCXNwaV9tZXNzYWdlX2luaXQoJm1zZyk7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoeGZlcnMsICZtc2cpOworCXJldCA9IHNwaV9zeW5jKHN0LT51cywgJm1zZyk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZzdC0+dXMtPmRldiwgInByb2JsZW0gd2hlbiByZWFkaW5nIDI0IGJpdCByZWdpc3RlciAweCUwMlgiLAorCQkJCXJlZ19hZGRyZXNzKTsKKwkJZ290byBlcnJvcl9yZXQ7CisJfQorCSp2YWwgPSAoc3QtPnJ4WzFdIDw8IDE2KSB8IChzdC0+cnhbMl0gPDwgOCkgfCBzdC0+cnhbM107CisKK2Vycm9yX3JldDoKKwltdXRleF91bmxvY2soJnN0LT5idWZfbG9jayk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QgYWRlNzc1NF9yZWFkXzhiaXQoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCWludCByZXQ7CisJdTggdmFsID0gMDsKKwlzdHJ1Y3QgaWlvX2Rldl9hdHRyICp0aGlzX2F0dHIgPSB0b19paW9fZGV2X2F0dHIoYXR0cik7CisKKwlyZXQgPSBhZGU3NzU0X3NwaV9yZWFkX3JlZ184KGRldiwgdGhpc19hdHRyLT5hZGRyZXNzLCAmdmFsKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIHZhbCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkZTc3NTRfcmVhZF8xNmJpdChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJaW50IHJldDsKKwl1MTYgdmFsID0gMDsKKwlzdHJ1Y3QgaWlvX2Rldl9hdHRyICp0aGlzX2F0dHIgPSB0b19paW9fZGV2X2F0dHIoYXR0cik7CisKKwlyZXQgPSBhZGU3NzU0X3NwaV9yZWFkX3JlZ18xNihkZXYsIHRoaXNfYXR0ci0+YWRkcmVzcywgJnZhbCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCB2YWwpOworfQorCitzdGF0aWMgc3NpemVfdCBhZGU3NzU0X3JlYWRfMjRiaXQoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCWludCByZXQ7CisJdTMyIHZhbCA9IDA7CisJc3RydWN0IGlpb19kZXZfYXR0ciAqdGhpc19hdHRyID0gdG9faWlvX2Rldl9hdHRyKGF0dHIpOworCisJcmV0ID0gYWRlNzc1NF9zcGlfcmVhZF9yZWdfMjQoZGV2LCB0aGlzX2F0dHItPmFkZHJlc3MsICZ2YWwpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgdmFsICYgMHhGRkZGRkYpOworfQorCitzdGF0aWMgc3NpemVfdCBhZGU3NzU0X3dyaXRlXzhiaXQoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgbGVuKQoreworCXN0cnVjdCBpaW9fZGV2X2F0dHIgKnRoaXNfYXR0ciA9IHRvX2lpb19kZXZfYXR0cihhdHRyKTsKKwlpbnQgcmV0OworCWxvbmcgdmFsOworCisJcmV0ID0gc3RyaWN0X3N0cnRvbChidWYsIDEwLCAmdmFsKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3JldDsKKwlyZXQgPSBhZGU3NzU0X3NwaV93cml0ZV9yZWdfOChkZXYsIHRoaXNfYXR0ci0+YWRkcmVzcywgdmFsKTsKKworZXJyb3JfcmV0OgorCXJldHVybiByZXQgPyByZXQgOiBsZW47Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkZTc3NTRfd3JpdGVfMTZiaXQoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgbGVuKQoreworCXN0cnVjdCBpaW9fZGV2X2F0dHIgKnRoaXNfYXR0ciA9IHRvX2lpb19kZXZfYXR0cihhdHRyKTsKKwlpbnQgcmV0OworCWxvbmcgdmFsOworCisJcmV0ID0gc3RyaWN0X3N0cnRvbChidWYsIDEwLCAmdmFsKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3JldDsKKwlyZXQgPSBhZGU3NzU0X3NwaV93cml0ZV9yZWdfMTYoZGV2LCB0aGlzX2F0dHItPmFkZHJlc3MsIHZhbCk7CisKK2Vycm9yX3JldDoKKwlyZXR1cm4gcmV0ID8gcmV0IDogbGVuOworfQorCitzdGF0aWMgaW50IGFkZTc3NTRfcmVzZXQoc3RydWN0IGRldmljZSAqZGV2KQoreworCWludCByZXQ7CisJdTggdmFsOworCWFkZTc3NTRfc3BpX3JlYWRfcmVnXzgoZGV2LAorCQkJQURFNzc1NF9PUE1PREUsCisJCQkmdmFsKTsKKwl2YWwgfD0gMSA8PCA2OyAvKiBTb2Z0d2FyZSBDaGlwIFJlc2V0ICovCisJcmV0ID0gYWRlNzc1NF9zcGlfd3JpdGVfcmVnXzgoZGV2LAorCQkJQURFNzc1NF9PUE1PREUsCisJCQl2YWwpOworCisJcmV0dXJuIHJldDsKK30KKworCitzdGF0aWMgc3NpemVfdCBhZGU3NzU0X3dyaXRlX3Jlc2V0KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbikKK3sKKwlpZiAobGVuIDwgMSkKKwkJcmV0dXJuIC0xOworCXN3aXRjaCAoYnVmWzBdKSB7CisJY2FzZSAnMSc6CisJY2FzZSAneSc6CisJY2FzZSAnWSc6CisJCXJldHVybiBhZGU3NzU0X3Jlc2V0KGRldik7CisJfQorCXJldHVybiAtMTsKK30KKworc3RhdGljIElJT19ERVZfQVRUUl9BRU5FUkdZKGFkZTc3NTRfcmVhZF8yNGJpdCwgQURFNzc1NF9BRU5FUkdZKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfTEFFTkVSR1koYWRlNzc1NF9yZWFkXzI0Yml0LCBBREU3NzU0X0xBRU5FUkdZKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfVkFFTkVSR1koYWRlNzc1NF9yZWFkXzI0Yml0LCBBREU3NzU0X1ZBRU5FUkdZKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfTFZBRU5FUkdZKGFkZTc3NTRfcmVhZF8yNGJpdCwgQURFNzc1NF9MVkFFTkVSR1kpOworc3RhdGljIElJT19ERVZfQVRUUl9WUEVBSyhTX0lXVVNSIHwgU19JUlVHTywKKwkJYWRlNzc1NF9yZWFkXzhiaXQsCisJCWFkZTc3NTRfd3JpdGVfOGJpdCwKKwkJQURFNzc1NF9WUEVBSyk7CitzdGF0aWMgSUlPX0RFVl9BVFRSX0lQRUFLKFNfSVdVU1IgfCBTX0lSVUdPLAorCQlhZGU3NzU0X3JlYWRfOGJpdCwKKwkJYWRlNzc1NF93cml0ZV84Yml0LAorCQlBREU3NzU0X1ZQRUFLKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfQVBIQ0FMKFNfSVdVU1IgfCBTX0lSVUdPLAorCQlhZGU3NzU0X3JlYWRfOGJpdCwKKwkJYWRlNzc1NF93cml0ZV84Yml0LAorCQlBREU3NzU0X0FQSENBTCk7CitzdGF0aWMgSUlPX0RFVl9BVFRSX0JQSENBTChTX0lXVVNSIHwgU19JUlVHTywKKwkJYWRlNzc1NF9yZWFkXzhiaXQsCisJCWFkZTc3NTRfd3JpdGVfOGJpdCwKKwkJQURFNzc1NF9CUEhDQUwpOworc3RhdGljIElJT19ERVZfQVRUUl9DUEhDQUwoU19JV1VTUiB8IFNfSVJVR08sCisJCWFkZTc3NTRfcmVhZF84Yml0LAorCQlhZGU3NzU0X3dyaXRlXzhiaXQsCisJCUFERTc3NTRfQ1BIQ0FMKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfQUFQT1MoU19JV1VTUiB8IFNfSVJVR08sCisJCWFkZTc3NTRfcmVhZF8xNmJpdCwKKwkJYWRlNzc1NF93cml0ZV8xNmJpdCwKKwkJQURFNzc1NF9BQVBPUyk7CitzdGF0aWMgSUlPX0RFVl9BVFRSX0JBUE9TKFNfSVdVU1IgfCBTX0lSVUdPLAorCQlhZGU3NzU0X3JlYWRfMTZiaXQsCisJCWFkZTc3NTRfd3JpdGVfMTZiaXQsCisJCUFERTc3NTRfQkFQT1MpOworc3RhdGljIElJT19ERVZfQVRUUl9DQVBPUyhTX0lXVVNSIHwgU19JUlVHTywKKwkJYWRlNzc1NF9yZWFkXzE2Yml0LAorCQlhZGU3NzU0X3dyaXRlXzE2Yml0LAorCQlBREU3NzU0X0NBUE9TKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfV0RJVihTX0lXVVNSIHwgU19JUlVHTywKKwkJYWRlNzc1NF9yZWFkXzhiaXQsCisJCWFkZTc3NTRfd3JpdGVfOGJpdCwKKwkJQURFNzc1NF9XRElWKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfVkFESVYoU19JV1VTUiB8IFNfSVJVR08sCisJCWFkZTc3NTRfcmVhZF84Yml0LAorCQlhZGU3NzU0X3dyaXRlXzhiaXQsCisJCUFERTc3NTRfVkFESVYpOworc3RhdGljIElJT19ERVZfQVRUUl9DRk5VTShTX0lXVVNSIHwgU19JUlVHTywKKwkJYWRlNzc1NF9yZWFkXzE2Yml0LAorCQlhZGU3NzU0X3dyaXRlXzE2Yml0LAorCQlBREU3NzU0X0NGTlVNKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfQ0ZERU4oU19JV1VTUiB8IFNfSVJVR08sCisJCWFkZTc3NTRfcmVhZF8xNmJpdCwKKwkJYWRlNzc1NF93cml0ZV8xNmJpdCwKKwkJQURFNzc1NF9DRkRFTik7CitzdGF0aWMgSUlPX0RFVl9BVFRSX0FDVElWRV9QT1dFUl9BX0dBSU4oU19JV1VTUiB8IFNfSVJVR08sCisJCWFkZTc3NTRfcmVhZF8xNmJpdCwKKwkJYWRlNzc1NF93cml0ZV8xNmJpdCwKKwkJQURFNzc1NF9BQVBHQUlOKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfQUNUSVZFX1BPV0VSX0JfR0FJTihTX0lXVVNSIHwgU19JUlVHTywKKwkJYWRlNzc1NF9yZWFkXzE2Yml0LAorCQlhZGU3NzU0X3dyaXRlXzE2Yml0LAorCQlBREU3NzU0X0JBUEdBSU4pOworc3RhdGljIElJT19ERVZfQVRUUl9BQ1RJVkVfUE9XRVJfQ19HQUlOKFNfSVdVU1IgfCBTX0lSVUdPLAorCQlhZGU3NzU0X3JlYWRfMTZiaXQsCisJCWFkZTc3NTRfd3JpdGVfMTZiaXQsCisJCUFERTc3NTRfQ0FQR0FJTik7CitzdGF0aWMgSUlPX0RFVl9BVFRSX0FJUk1TKFNfSVJVR08sCisJCWFkZTc3NTRfcmVhZF8yNGJpdCwKKwkJTlVMTCwKKwkJQURFNzc1NF9BSVJNUyk7CitzdGF0aWMgSUlPX0RFVl9BVFRSX0JJUk1TKFNfSVJVR08sCisJCWFkZTc3NTRfcmVhZF8yNGJpdCwKKwkJTlVMTCwKKwkJQURFNzc1NF9CSVJNUyk7CitzdGF0aWMgSUlPX0RFVl9BVFRSX0NJUk1TKFNfSVJVR08sCisJCWFkZTc3NTRfcmVhZF8yNGJpdCwKKwkJTlVMTCwKKwkJQURFNzc1NF9DSVJNUyk7CitzdGF0aWMgSUlPX0RFVl9BVFRSX0FWUk1TKFNfSVJVR08sCisJCWFkZTc3NTRfcmVhZF8yNGJpdCwKKwkJTlVMTCwKKwkJQURFNzc1NF9BVlJNUyk7CitzdGF0aWMgSUlPX0RFVl9BVFRSX0JWUk1TKFNfSVJVR08sCisJCWFkZTc3NTRfcmVhZF8yNGJpdCwKKwkJTlVMTCwKKwkJQURFNzc1NF9CVlJNUyk7CitzdGF0aWMgSUlPX0RFVl9BVFRSX0NWUk1TKFNfSVJVR08sCisJCWFkZTc3NTRfcmVhZF8yNGJpdCwKKwkJTlVMTCwKKwkJQURFNzc1NF9DVlJNUyk7CitzdGF0aWMgSUlPX0RFVl9BVFRSX0FJUk1TT1MoU19JUlVHTywKKwkJYWRlNzc1NF9yZWFkXzE2Yml0LAorCQlhZGU3NzU0X3dyaXRlXzE2Yml0LAorCQlBREU3NzU0X0FJUk1TT1MpOworc3RhdGljIElJT19ERVZfQVRUUl9CSVJNU09TKFNfSVJVR08sCisJCWFkZTc3NTRfcmVhZF8xNmJpdCwKKwkJYWRlNzc1NF93cml0ZV8xNmJpdCwKKwkJQURFNzc1NF9CSVJNU09TKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfQ0lSTVNPUyhTX0lSVUdPLAorCQlhZGU3NzU0X3JlYWRfMTZiaXQsCisJCWFkZTc3NTRfd3JpdGVfMTZiaXQsCisJCUFERTc3NTRfQ0lSTVNPUyk7CitzdGF0aWMgSUlPX0RFVl9BVFRSX0FWUk1TT1MoU19JUlVHTywKKwkJYWRlNzc1NF9yZWFkXzE2Yml0LAorCQlhZGU3NzU0X3dyaXRlXzE2Yml0LAorCQlBREU3NzU0X0FWUk1TT1MpOworc3RhdGljIElJT19ERVZfQVRUUl9CVlJNU09TKFNfSVJVR08sCisJCWFkZTc3NTRfcmVhZF8xNmJpdCwKKwkJYWRlNzc1NF93cml0ZV8xNmJpdCwKKwkJQURFNzc1NF9CVlJNU09TKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfQ1ZSTVNPUyhTX0lSVUdPLAorCQlhZGU3NzU0X3JlYWRfMTZiaXQsCisJCWFkZTc3NTRfd3JpdGVfMTZiaXQsCisJCUFERTc3NTRfQ1ZSTVNPUyk7CisKK3N0YXRpYyBpbnQgYWRlNzc1NF9zZXRfaXJxKHN0cnVjdCBkZXZpY2UgKmRldiwgYm9vbCBlbmFibGUpCit7CisJaW50IHJldDsKKwl1MTYgaXJxZW47CisJcmV0ID0gYWRlNzc1NF9zcGlfcmVhZF9yZWdfMTYoZGV2LCBBREU3NzU0X0lSUUVOLCAmaXJxZW4pOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfcmV0OworCisJaWYgKGVuYWJsZSkKKwkJaXJxZW4gfD0gMSA8PCAxNDsgLyogRW5hYmxlcyBhbiBpbnRlcnJ1cHQgd2hlbiBhIGRhdGEgaXMKKwkJCQkgICAgIHByZXNlbnQgaW4gdGhlIHdhdmVmb3JtIHJlZ2lzdGVyICovCisJZWxzZQorCQlpcnFlbiAmPSB+KDEgPDwgMTQpOworCisJcmV0ID0gYWRlNzc1NF9zcGlfd3JpdGVfcmVnXzE2KGRldiwgQURFNzc1NF9JUlFFTiwgaXJxZW4pOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfcmV0OworCitlcnJvcl9yZXQ6CisJcmV0dXJuIHJldDsKK30KKworLyogUG93ZXIgZG93biB0aGUgZGV2aWNlICovCitzdGF0aWMgaW50IGFkZTc3NTRfc3RvcF9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2KQoreworCWludCByZXQ7CisJdTggdmFsOworCWFkZTc3NTRfc3BpX3JlYWRfcmVnXzgoZGV2LAorCQkJQURFNzc1NF9PUE1PREUsCisJCQkmdmFsKTsKKwl2YWwgfD0gNyA8PCAzOyAgLyogQURFNzc1NCBwb3dlcmVkIGRvd24gKi8KKwlyZXQgPSBhZGU3NzU0X3NwaV93cml0ZV9yZWdfOChkZXYsCisJCQlBREU3NzU0X09QTU9ERSwKKwkJCXZhbCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFkZTc3NTRfaW5pdGlhbF9zZXR1cChzdHJ1Y3QgYWRlNzc1NF9zdGF0ZSAqc3QpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmc3QtPmluZGlvX2Rldi0+ZGV2OworCisJLyogdXNlIGxvdyBzcGkgc3BlZWQgZm9yIGluaXQgKi8KKwlzdC0+dXMtPm1vZGUgPSBTUElfTU9ERV8zOworCXNwaV9zZXR1cChzdC0+dXMpOworCisJLyogRGlzYWJsZSBJUlEgKi8KKwlyZXQgPSBhZGU3NzU0X3NldF9pcnEoZGV2LCBmYWxzZSk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKGRldiwgImRpc2FibGUgaXJxIGZhaWxlZCIpOworCQlnb3RvIGVycl9yZXQ7CisJfQorCisJYWRlNzc1NF9yZXNldChkZXYpOworCW1zbGVlcChBREU3NzU0X1NUQVJUVVBfREVMQVkpOworCitlcnJfcmV0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkZTc3NTRfcmVhZF9mcmVxdWVuY3koc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCWludCByZXQsIGxlbiA9IDA7CisJdTggdDsKKwlpbnQgc3BzOworCXJldCA9IGFkZTc3NTRfc3BpX3JlYWRfcmVnXzgoZGV2LAorCQkJQURFNzc1NF9XQVZNT0RFLAorCQkJJnQpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwl0ID0gKHQgPj4gMykgJiAweDM7CisJc3BzID0gMjYwMDAgLyAoMSArIHQpOworCisJbGVuID0gc3ByaW50ZihidWYsICIlZCBTUFNcbiIsIHNwcyk7CisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIHNzaXplX3QgYWRlNzc1NF93cml0ZV9mcmVxdWVuY3koc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgbGVuKQoreworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWRlNzc1NF9zdGF0ZSAqc3QgPSBpaW9fZGV2X2dldF9kZXZkYXRhKGluZGlvX2Rldik7CisJdW5zaWduZWQgbG9uZyB2YWw7CisJaW50IHJldDsKKwl1OCByZWcsIHQ7CisKKwlyZXQgPSBzdHJpY3Rfc3RydG9sKGJ1ZiwgMTAsICZ2YWwpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwltdXRleF9sb2NrKCZpbmRpb19kZXYtPm1sb2NrKTsKKworCXQgPSAoMjYwMDAgLyB2YWwpOworCWlmICh0ID4gMCkKKwkJdC0tOworCisJaWYgKHQgPiAxKQorCQlzdC0+dXMtPm1heF9zcGVlZF9oeiA9IEFERTc3NTRfU1BJX1NMT1c7CisJZWxzZQorCQlzdC0+dXMtPm1heF9zcGVlZF9oeiA9IEFERTc3NTRfU1BJX0ZBU1Q7CisKKwlyZXQgPSBhZGU3NzU0X3NwaV9yZWFkX3JlZ184KGRldiwKKwkJCUFERTc3NTRfV0FWTU9ERSwKKwkJCSZyZWcpOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCisJcmVnICY9IH4oMyA8PCAzKTsKKwlyZWcgfD0gdCA8PCAzOworCisJcmV0ID0gYWRlNzc1NF9zcGlfd3JpdGVfcmVnXzgoZGV2LAorCQkJQURFNzc1NF9XQVZNT0RFLAorCQkJcmVnKTsKKworb3V0OgorCW11dGV4X3VubG9jaygmaW5kaW9fZGV2LT5tbG9jayk7CisKKwlyZXR1cm4gcmV0ID8gcmV0IDogbGVuOworfQorc3RhdGljIElJT19ERVZfQVRUUl9URU1QX1JBVyhhZGU3NzU0X3JlYWRfOGJpdCk7CitzdGF0aWMgSUlPX0NPTlNUX0FUVFIodGVtcF9vZmZzZXQsICIxMjkgQyIpOworc3RhdGljIElJT19DT05TVF9BVFRSKHRlbXBfc2NhbGUsICI0IEMiKTsKKworc3RhdGljIElJT19ERVZfQVRUUl9TQU1QX0ZSRVEoU19JV1VTUiB8IFNfSVJVR08sCisJCWFkZTc3NTRfcmVhZF9mcmVxdWVuY3ksCisJCWFkZTc3NTRfd3JpdGVfZnJlcXVlbmN5KTsKKworc3RhdGljIElJT19ERVZfQVRUUl9SRVNFVChhZGU3NzU0X3dyaXRlX3Jlc2V0KTsKKworc3RhdGljIElJT19DT05TVF9BVFRSX1NBTVBfRlJFUV9BVkFJTCgiMjYwMDAgMTMwMDAgNjUwMDAgMzMwMDAiKTsKKworc3RhdGljIElJT19DT05TVF9BVFRSKG5hbWUsICJhZGU3NzU0Iik7CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICphZGU3NzU0X2V2ZW50X2F0dHJpYnV0ZXNbXSA9IHsKKwlOVUxMCit9OworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBhZGU3NzU0X2V2ZW50X2F0dHJpYnV0ZV9ncm91cCA9IHsKKwkuYXR0cnMgPSBhZGU3NzU0X2V2ZW50X2F0dHJpYnV0ZXMsCit9OworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqYWRlNzc1NF9hdHRyaWJ1dGVzW10gPSB7CisJJmlpb19kZXZfYXR0cl90ZW1wX3Jhdy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fY29uc3RfYXR0cl90ZW1wX29mZnNldC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fY29uc3RfYXR0cl90ZW1wX3NjYWxlLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9zYW1wbGluZ19mcmVxdWVuY3kuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2NvbnN0X2F0dHJfc2FtcGxpbmdfZnJlcXVlbmN5X2F2YWlsYWJsZS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfcmVzZXQuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2NvbnN0X2F0dHJfbmFtZS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfYWVuZXJneS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfbGFlbmVyZ3kuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX3ZhZW5lcmd5LmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9sdmFlbmVyZ3kuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX3ZwZWFrLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9pcGVhay5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfYXBoY2FsLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9icGhjYWwuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2NwaGNhbC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfYWFwb3MuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2JhcG9zLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9jYXBvcy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfd2Rpdi5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfdmFkaXYuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2NmbnVtLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9jZmRlbi5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfYWN0aXZlX3Bvd2VyX2FfZ2Fpbi5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfYWN0aXZlX3Bvd2VyX2JfZ2Fpbi5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfYWN0aXZlX3Bvd2VyX2NfZ2Fpbi5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfYWlybXMuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2Jpcm1zLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9jaXJtcy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfYXZybXMuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2J2cm1zLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9jdnJtcy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfYWlybXNvcy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfYmlybXNvcy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfY2lybXNvcy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfYXZybXNvcy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfYnZybXNvcy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfY3ZybXNvcy5kZXZfYXR0ci5hdHRyLAorCU5VTEwsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBhZGU3NzU0X2F0dHJpYnV0ZV9ncm91cCA9IHsKKwkuYXR0cnMgPSBhZGU3NzU0X2F0dHJpYnV0ZXMsCit9OworCisKKworc3RhdGljIGludCBfX2RldmluaXQgYWRlNzc1NF9wcm9iZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCWludCByZXQsIHJlZ2RvbmUgPSAwOworCXN0cnVjdCBhZGU3NzU0X3N0YXRlICpzdCA9IGt6YWxsb2Moc2l6ZW9mICpzdCwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzdCkgeworCQlyZXQgPSAgLUVOT01FTTsKKwkJZ290byBlcnJvcl9yZXQ7CisJfQorCS8qIHRoaXMgaXMgb25seSB1c2VkIGZvciByZW1vdmFsIHB1cnBvc2VzICovCisJc3BpX3NldF9kcnZkYXRhKHNwaSwgc3QpOworCisJLyogQWxsb2NhdGUgdGhlIGNvbW1zIGJ1ZmZlcnMgKi8KKwlzdC0+cnggPSBremFsbG9jKHNpemVvZigqc3QtPnJ4KSpBREU3NzU0X01BWF9SWCwgR0ZQX0tFUk5FTCk7CisJaWYgKHN0LT5yeCA9PSBOVUxMKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3JfZnJlZV9zdDsKKwl9CisJc3QtPnR4ID0ga3phbGxvYyhzaXplb2YoKnN0LT50eCkqQURFNzc1NF9NQVhfVFgsIEdGUF9LRVJORUwpOworCWlmIChzdC0+dHggPT0gTlVMTCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycm9yX2ZyZWVfcng7CisJfQorCXN0LT51cyA9IHNwaTsKKwltdXRleF9pbml0KCZzdC0+YnVmX2xvY2spOworCS8qIHNldHVwIHRoZSBpbmR1c3RyaWFsaW8gZHJpdmVyIGFsbG9jYXRlZCBlbGVtZW50cyAqLworCXN0LT5pbmRpb19kZXYgPSBpaW9fYWxsb2NhdGVfZGV2aWNlKCk7CisJaWYgKHN0LT5pbmRpb19kZXYgPT0gTlVMTCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycm9yX2ZyZWVfdHg7CisJfQorCisJc3QtPmluZGlvX2Rldi0+ZGV2LnBhcmVudCA9ICZzcGktPmRldjsKKwlzdC0+aW5kaW9fZGV2LT5udW1faW50ZXJydXB0X2xpbmVzID0gMTsKKwlzdC0+aW5kaW9fZGV2LT5ldmVudF9hdHRycyA9ICZhZGU3NzU0X2V2ZW50X2F0dHJpYnV0ZV9ncm91cDsKKwlzdC0+aW5kaW9fZGV2LT5hdHRycyA9ICZhZGU3NzU0X2F0dHJpYnV0ZV9ncm91cDsKKwlzdC0+aW5kaW9fZGV2LT5kZXZfZGF0YSA9ICh2b2lkICopKHN0KTsKKwlzdC0+aW5kaW9fZGV2LT5kcml2ZXJfbW9kdWxlID0gVEhJU19NT0RVTEU7CisJc3QtPmluZGlvX2Rldi0+bW9kZXMgPSBJTkRJT19ESVJFQ1RfTU9ERTsKKworCXJldCA9IGFkZTc3NTRfY29uZmlndXJlX3Jpbmcoc3QtPmluZGlvX2Rldik7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9mcmVlX2RldjsKKworCXJldCA9IGlpb19kZXZpY2VfcmVnaXN0ZXIoc3QtPmluZGlvX2Rldik7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl91bnJlZ19yaW5nX2Z1bmNzOworCXJlZ2RvbmUgPSAxOworCisJcmV0ID0gYWRlNzc1NF9pbml0aWFsaXplX3Jpbmcoc3QtPmluZGlvX2Rldi0+cmluZyk7CisJaWYgKHJldCkgeworCQlwcmludGsoS0VSTl9FUlIgImZhaWxlZCB0byBpbml0aWFsaXplIHRoZSByaW5nXG4iKTsKKwkJZ290byBlcnJvcl91bnJlZ19yaW5nX2Z1bmNzOworCX0KKworCWlmIChzcGktPmlycSkgeworCQlyZXQgPSBpaW9fcmVnaXN0ZXJfaW50ZXJydXB0X2xpbmUoc3BpLT5pcnEsCisJCQkJc3QtPmluZGlvX2RldiwKKwkJCQkwLAorCQkJCUlSUUZfVFJJR0dFUl9GQUxMSU5HLAorCQkJCSJhZGU3NzU0Iik7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycm9yX3VuaW5pdGlhbGl6ZV9yaW5nOworCisJCXJldCA9IGFkZTc3NTRfcHJvYmVfdHJpZ2dlcihzdC0+aW5kaW9fZGV2KTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJyb3JfdW5yZWdpc3Rlcl9saW5lOworCX0KKworCS8qIEdldCB0aGUgZGV2aWNlIGludG8gYSBzYW5lIGluaXRpYWwgc3RhdGUgKi8KKwlyZXQgPSBhZGU3NzU0X2luaXRpYWxfc2V0dXAoc3QpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfcmVtb3ZlX3RyaWdnZXI7CisJcmV0dXJuIDA7CisKK2Vycm9yX3JlbW92ZV90cmlnZ2VyOgorCWlmIChzdC0+aW5kaW9fZGV2LT5tb2RlcyAmIElORElPX1JJTkdfVFJJR0dFUkVEKQorCQlhZGU3NzU0X3JlbW92ZV90cmlnZ2VyKHN0LT5pbmRpb19kZXYpOworZXJyb3JfdW5yZWdpc3Rlcl9saW5lOgorCWlmIChzdC0+aW5kaW9fZGV2LT5tb2RlcyAmIElORElPX1JJTkdfVFJJR0dFUkVEKQorCQlpaW9fdW5yZWdpc3Rlcl9pbnRlcnJ1cHRfbGluZShzdC0+aW5kaW9fZGV2LCAwKTsKK2Vycm9yX3VuaW5pdGlhbGl6ZV9yaW5nOgorCWFkZTc3NTRfdW5pbml0aWFsaXplX3Jpbmcoc3QtPmluZGlvX2Rldi0+cmluZyk7CitlcnJvcl91bnJlZ19yaW5nX2Z1bmNzOgorCWFkZTc3NTRfdW5jb25maWd1cmVfcmluZyhzdC0+aW5kaW9fZGV2KTsKK2Vycm9yX2ZyZWVfZGV2OgorCWlmIChyZWdkb25lKQorCQlpaW9fZGV2aWNlX3VucmVnaXN0ZXIoc3QtPmluZGlvX2Rldik7CisJZWxzZQorCQlpaW9fZnJlZV9kZXZpY2Uoc3QtPmluZGlvX2Rldik7CitlcnJvcl9mcmVlX3R4OgorCWtmcmVlKHN0LT50eCk7CitlcnJvcl9mcmVlX3J4OgorCWtmcmVlKHN0LT5yeCk7CitlcnJvcl9mcmVlX3N0OgorCWtmcmVlKHN0KTsKK2Vycm9yX3JldDoKKwlyZXR1cm4gcmV0OworfQorCisvKiBmaXhtZSwgY29uZmlybSBvcmRlcmluZyBpbiB0aGlzIGZ1bmN0aW9uICovCitzdGF0aWMgaW50IGFkZTc3NTRfcmVtb3ZlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgYWRlNzc1NF9zdGF0ZSAqc3QgPSBzcGlfZ2V0X2RydmRhdGEoc3BpKTsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gc3QtPmluZGlvX2RldjsKKworCXJldCA9IGFkZTc3NTRfc3RvcF9kZXZpY2UoJihpbmRpb19kZXYtPmRldikpOworCWlmIChyZXQpCisJCWdvdG8gZXJyX3JldDsKKworCWZsdXNoX3NjaGVkdWxlZF93b3JrKCk7CisKKwlhZGU3NzU0X3JlbW92ZV90cmlnZ2VyKGluZGlvX2Rldik7CisJaWYgKHNwaS0+aXJxKQorCQlpaW9fdW5yZWdpc3Rlcl9pbnRlcnJ1cHRfbGluZShpbmRpb19kZXYsIDApOworCisJYWRlNzc1NF91bmluaXRpYWxpemVfcmluZyhpbmRpb19kZXYtPnJpbmcpOworCWFkZTc3NTRfdW5jb25maWd1cmVfcmluZyhpbmRpb19kZXYpOworCWlpb19kZXZpY2VfdW5yZWdpc3RlcihpbmRpb19kZXYpOworCWtmcmVlKHN0LT50eCk7CisJa2ZyZWUoc3QtPnJ4KTsKKwlrZnJlZShzdCk7CisKKwlyZXR1cm4gMDsKKworZXJyX3JldDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3RydWN0IHNwaV9kcml2ZXIgYWRlNzc1NF9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAiYWRlNzc1NCIsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCX0sCisJLnByb2JlID0gYWRlNzc1NF9wcm9iZSwKKwkucmVtb3ZlID0gX19kZXZleGl0X3AoYWRlNzc1NF9yZW1vdmUpLAorfTsKKworc3RhdGljIF9faW5pdCBpbnQgYWRlNzc1NF9pbml0KHZvaWQpCit7CisJcmV0dXJuIHNwaV9yZWdpc3Rlcl9kcml2ZXIoJmFkZTc3NTRfZHJpdmVyKTsKK30KK21vZHVsZV9pbml0KGFkZTc3NTRfaW5pdCk7CisKK3N0YXRpYyBfX2V4aXQgdm9pZCBhZGU3NzU0X2V4aXQodm9pZCkKK3sKKwlzcGlfdW5yZWdpc3Rlcl9kcml2ZXIoJmFkZTc3NTRfZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KGFkZTc3NTRfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIkJhcnJ5IFNvbmcgPDIxY25iYW9AZ21haWwuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJBbmFsb2cgRGV2aWNlcyBBREU3NzU0IFBvbHlwaGFzZSBNdWx0aWZ1bmN0aW9uIEVuZXJneSBNZXRlcmluZyBJQyBEcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vbWV0ZXIvYWRlNzc1NC5oIGIvZHJpdmVycy9zdGFnaW5nL2lpby9tZXRlci9hZGU3NzU0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjZhM2U0YgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vbWV0ZXIvYWRlNzc1NC5oCkBAIC0wLDAgKzEsMTYxIEBACisjaWZuZGVmIF9BREU3NzU0X0gKKyNkZWZpbmUgX0FERTc3NTRfSAorCisjZGVmaW5lIEFERTc3NTRfQUVORVJHWSAgIDB4MDEKKyNkZWZpbmUgQURFNzc1NF9SQUVORVJHWSAgMHgwMgorI2RlZmluZSBBREU3NzU0X0xBRU5FUkdZICAweDAzCisjZGVmaW5lIEFERTc3NTRfVkFFTkVSR1kgIDB4MDQKKyNkZWZpbmUgQURFNzc1NF9SVkFFTkVSR1kgMHgwNQorI2RlZmluZSBBREU3NzU0X0xWQUVORVJHWSAweDA2CisjZGVmaW5lIEFERTc3NTRfUEVSSU9EICAgIDB4MDcKKyNkZWZpbmUgQURFNzc1NF9URU1QICAgICAgMHgwOAorI2RlZmluZSBBREU3NzU0X1dGT1JNICAgICAweDA5CisjZGVmaW5lIEFERTc3NTRfT1BNT0RFICAgIDB4MEEKKyNkZWZpbmUgQURFNzc1NF9NTU9ERSAgICAgMHgwQgorI2RlZmluZSBBREU3NzU0X1dBVk1PREUgICAweDBDCisjZGVmaW5lIEFERTc3NTRfV0FUTU9ERSAgIDB4MEQKKyNkZWZpbmUgQURFNzc1NF9WQU1PREUgICAgMHgwRQorI2RlZmluZSBBREU3NzU0X0lSUUVOICAgICAweDBGCisjZGVmaW5lIEFERTc3NTRfU1RBVFVTICAgIDB4MTAKKyNkZWZpbmUgQURFNzc1NF9SU1RBVFVTICAgMHgxMQorI2RlZmluZSBBREU3NzU0X1pYVE9VVCAgICAweDEyCisjZGVmaW5lIEFERTc3NTRfTElOQ1lDICAgIDB4MTMKKyNkZWZpbmUgQURFNzc1NF9TQUdDWUMgICAgMHgxNAorI2RlZmluZSBBREU3NzU0X1NBR0xWTCAgICAweDE1CisjZGVmaW5lIEFERTc3NTRfVlBFQUsgICAgIDB4MTYKKyNkZWZpbmUgQURFNzc1NF9JUEVBSyAgICAgMHgxNworI2RlZmluZSBBREU3NzU0X0dBSU4gICAgICAweDE4CisjZGVmaW5lIEFERTc3NTRfQVdHICAgICAgIDB4MTkKKyNkZWZpbmUgQURFNzc1NF9CV0cgICAgICAgMHgxQQorI2RlZmluZSBBREU3NzU0X0NXRyAgICAgICAweDFCCisjZGVmaW5lIEFERTc3NTRfQVZBRyAgICAgIDB4MUMKKyNkZWZpbmUgQURFNzc1NF9CVkFHICAgICAgMHgxRAorI2RlZmluZSBBREU3NzU0X0NWQUcgICAgICAweDFFCisjZGVmaW5lIEFERTc3NTRfQVBIQ0FMICAgIDB4MUYKKyNkZWZpbmUgQURFNzc1NF9CUEhDQUwgICAgMHgyMAorI2RlZmluZSBBREU3NzU0X0NQSENBTCAgICAweDIxCisjZGVmaW5lIEFERTc3NTRfQUFQT1MgICAgIDB4MjIKKyNkZWZpbmUgQURFNzc1NF9CQVBPUyAgICAgMHgyMworI2RlZmluZSBBREU3NzU0X0NBUE9TICAgICAweDI0CisjZGVmaW5lIEFERTc3NTRfQ0ZOVU0gICAgIDB4MjUKKyNkZWZpbmUgQURFNzc1NF9DRkRFTiAgICAgMHgyNgorI2RlZmluZSBBREU3NzU0X1dESVYgICAgICAweDI3CisjZGVmaW5lIEFERTc3NTRfVkFESVYgICAgIDB4MjgKKyNkZWZpbmUgQURFNzc1NF9BSVJNUyAgICAgMHgyOQorI2RlZmluZSBBREU3NzU0X0JJUk1TICAgICAweDJBCisjZGVmaW5lIEFERTc3NTRfQ0lSTVMgICAgIDB4MkIKKyNkZWZpbmUgQURFNzc1NF9BVlJNUyAgICAgMHgyQworI2RlZmluZSBBREU3NzU0X0JWUk1TICAgICAweDJECisjZGVmaW5lIEFERTc3NTRfQ1ZSTVMgICAgIDB4MkUKKyNkZWZpbmUgQURFNzc1NF9BSVJNU09TICAgMHgyRgorI2RlZmluZSBBREU3NzU0X0JJUk1TT1MgICAweDMwCisjZGVmaW5lIEFERTc3NTRfQ0lSTVNPUyAgIDB4MzEKKyNkZWZpbmUgQURFNzc1NF9BVlJNU09TICAgMHgzMgorI2RlZmluZSBBREU3NzU0X0JWUk1TT1MgICAweDMzCisjZGVmaW5lIEFERTc3NTRfQ1ZSTVNPUyAgIDB4MzQKKyNkZWZpbmUgQURFNzc1NF9BQVBHQUlOICAgMHgzNQorI2RlZmluZSBBREU3NzU0X0JBUEdBSU4gICAweDM2CisjZGVmaW5lIEFERTc3NTRfQ0FQR0FJTiAgIDB4MzcKKyNkZWZpbmUgQURFNzc1NF9BVkdBSU4gICAgMHgzOAorI2RlZmluZSBBREU3NzU0X0JWR0FJTiAgICAweDM5CisjZGVmaW5lIEFERTc3NTRfQ1ZHQUlOICAgIDB4M0EKKyNkZWZpbmUgQURFNzc1NF9DSEtTVU0gICAgMHgzRQorI2RlZmluZSBBREU3NzU0X1ZFUlNJT04gICAweDNGCisKKyNkZWZpbmUgQURFNzc1NF9SRUFEX1JFRyhhKSAgICBhCisjZGVmaW5lIEFERTc3NTRfV1JJVEVfUkVHKGEpICgoYSkgfCAweDgwKQorCisjZGVmaW5lIEFERTc3NTRfTUFYX1RYICAgIDQKKyNkZWZpbmUgQURFNzc1NF9NQVhfUlggICAgNAorI2RlZmluZSBBREU3NzU0X1NUQVJUVVBfREVMQVkgMQorCisjZGVmaW5lIEFERTc3NTRfU1BJX1NMT1cJKHUzMikoMzAwICogMTAwMCkKKyNkZWZpbmUgQURFNzc1NF9TUElfQlVSU1QJKHUzMikoMTAwMCAqIDEwMDApCisjZGVmaW5lIEFERTc3NTRfU1BJX0ZBU1QJKHUzMikoMjAwMCAqIDEwMDApCisKKyNkZWZpbmUgRFJJVkVSX05BTUUJCSJhZGU3NzU0IgorCisvKioKKyAqIHN0cnVjdCBhZGU3NzU0X3N0YXRlIC0gZGV2aWNlIGluc3RhbmNlIHNwZWNpZmljIGRhdGEKKyAqIEB1czoJCQlhY3R1YWwgc3BpX2RldmljZQorICogQHdvcmtfdHJpZ2dlcl90b19yaW5nOiBiaCBmb3IgdHJpZ2dlcmVkIGV2ZW50IGhhbmRsaW5nCisgKiBAaW50ZXI6CQl1c2VkIHRvIGNoZWNrIGlmIG5ldyBpbnRlcnJ1cHQgaGFzIGJlZW4gdHJpZ2dlcmVkCisgKiBAbGFzdF90aW1lc3RhbXA6CXBhc3NpbmcgdGltZXN0YW1wIGZyb20gdGggdG8gYmggb2YgaW50ZXJydXB0IGhhbmRsZXIKKyAqIEBpbmRpb19kZXY6CQlpbmR1c3RyaWFsIEkvTyBkZXZpY2Ugc3RydWN0dXJlCisgKiBAdHJpZzoJCWRhdGEgcmVhZHkgdHJpZ2dlciByZWdpc3RlcmVkIHdpdGggaWlvCisgKiBAdHg6CQkJdHJhbnNtaXQgYnVmZmVyCisgKiBAcng6CQkJcmVjaWV2ZSBidWZmZXIKKyAqIEBidWZfbG9jazoJCW11dGV4IHRvIHByb3RlY3QgdHggYW5kIHJ4CisgKiovCitzdHJ1Y3QgYWRlNzc1NF9zdGF0ZSB7CisJc3RydWN0IHNwaV9kZXZpY2UJCSp1czsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QJCXdvcmtfdHJpZ2dlcl90b19yaW5nOworCXM2NAkJCQlsYXN0X3RpbWVzdGFtcDsKKwlzdHJ1Y3QgaWlvX2RldgkJCSppbmRpb19kZXY7CisJc3RydWN0IGlpb190cmlnZ2VyCQkqdHJpZzsKKwl1OAkJCQkqdHg7CisJdTgJCQkJKnJ4OworCXN0cnVjdCBtdXRleAkJCWJ1Zl9sb2NrOworfTsKKyNpZiBkZWZpbmVkKENPTkZJR19JSU9fUklOR19CVUZGRVIpICYmIGRlZmluZWQoVEhJU19IQVNfUklOR19CVUZGRVJfU1VQUE9SVCkKKy8qIEF0IHRoZSBtb21lbnQgdHJpZ2dlcnMgYXJlIG9ubHkgdXNlZCBmb3IgcmluZyBidWZmZXIKKyAqIGZpbGxpbmcuIFRoaXMgbWF5IGNoYW5nZSEKKyAqLworCitlbnVtIGFkZTc3NTRfc2NhbiB7CisJQURFNzc1NF9TQ0FOX1BIQV9WLAorCUFERTc3NTRfU0NBTl9QSEJfViwKKwlBREU3NzU0X1NDQU5fUEhDX1YsCisJQURFNzc1NF9TQ0FOX1BIQV9JLAorCUFERTc3NTRfU0NBTl9QSEJfSSwKKwlBREU3NzU0X1NDQU5fUEhDX0ksCit9OworCit2b2lkIGFkZTc3NTRfcmVtb3ZlX3RyaWdnZXIoc3RydWN0IGlpb19kZXYgKmluZGlvX2Rldik7CitpbnQgYWRlNzc1NF9wcm9iZV90cmlnZ2VyKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpOworCitzc2l6ZV90IGFkZTc3NTRfcmVhZF9kYXRhX2Zyb21fcmluZyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJICAgICAgY2hhciAqYnVmKTsKKworCitpbnQgYWRlNzc1NF9jb25maWd1cmVfcmluZyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KTsKK3ZvaWQgYWRlNzc1NF91bmNvbmZpZ3VyZV9yaW5nKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpOworCitpbnQgYWRlNzc1NF9pbml0aWFsaXplX3Jpbmcoc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqcmluZyk7Cit2b2lkIGFkZTc3NTRfdW5pbml0aWFsaXplX3Jpbmcoc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqcmluZyk7CisjZWxzZSAvKiBDT05GSUdfSUlPX1JJTkdfQlVGRkVSICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhZGU3NzU0X3JlbW92ZV90cmlnZ2VyKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCit7Cit9CitzdGF0aWMgaW5saW5lIGludCBhZGU3NzU0X3Byb2JlX3RyaWdnZXIoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBzc2l6ZV90CithZGU3NzU0X3JlYWRfZGF0YV9mcm9tX3Jpbmcoc3RydWN0IGRldmljZSAqZGV2LAorCQkJICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICAgICBjaGFyICpidWYpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWRlNzc1NF9jb25maWd1cmVfcmluZyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQoreworCXJldHVybiAwOworfQorc3RhdGljIGlubGluZSB2b2lkIGFkZTc3NTRfdW5jb25maWd1cmVfcmluZyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQoreworfQorc3RhdGljIGlubGluZSBpbnQgYWRlNzc1NF9pbml0aWFsaXplX3Jpbmcoc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqcmluZykKK3sKKwlyZXR1cm4gMDsKK30KK3N0YXRpYyBpbmxpbmUgdm9pZCBhZGU3NzU0X3VuaW5pdGlhbGl6ZV9yaW5nKHN0cnVjdCBpaW9fcmluZ19idWZmZXIgKnJpbmcpCit7Cit9CisjZW5kaWYgLyogQ09ORklHX0lJT19SSU5HX0JVRkZFUiAqLworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vbWV0ZXIvYWRlNzc1OC5oIGIvZHJpdmVycy9zdGFnaW5nL2lpby9tZXRlci9hZGU3NzU4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGY1YmI3YgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vbWV0ZXIvYWRlNzc1OC5oCkBAIC0wLDAgKzEsMTcxIEBACisjaWZuZGVmIF9BREU3NzU4X0gKKyNkZWZpbmUgX0FERTc3NThfSAorCisjZGVmaW5lIEFERTc3NThfQVdBVFRIUiAgIDB4MDEKKyNkZWZpbmUgQURFNzc1OF9CV0FUVEhSICAgMHgwMgorI2RlZmluZSBBREU3NzU4X0NXQVRUSFIgICAweDAzCisjZGVmaW5lIEFERTc3NThfQVZBUkhSICAgIDB4MDQKKyNkZWZpbmUgQURFNzc1OF9CVkFSSFIgICAgMHgwNQorI2RlZmluZSBBREU3NzU4X0NWQVJIUiAgICAweDA2CisjZGVmaW5lIEFERTc3NThfQVZBSFIgICAgIDB4MDcKKyNkZWZpbmUgQURFNzc1OF9CVkFIUiAgICAgMHgwOAorI2RlZmluZSBBREU3NzU4X0NWQUhSICAgICAweDA5CisjZGVmaW5lIEFERTc3NThfQUlSTVMgICAgIDB4MEEKKyNkZWZpbmUgQURFNzc1OF9CSVJNUyAgICAgMHgwQgorI2RlZmluZSBBREU3NzU4X0NJUk1TICAgICAweDBDCisjZGVmaW5lIEFERTc3NThfQVZSTVMgICAgIDB4MEQKKyNkZWZpbmUgQURFNzc1OF9CVlJNUyAgICAgMHgwRQorI2RlZmluZSBBREU3NzU4X0NWUk1TICAgICAweDBGCisjZGVmaW5lIEFERTc3NThfRlJFUSAgICAgIDB4MTAKKyNkZWZpbmUgQURFNzc1OF9URU1QICAgICAgMHgxMQorI2RlZmluZSBBREU3NzU4X1dGT1JNICAgICAweDEyCisjZGVmaW5lIEFERTc3NThfT1BNT0RFICAgIDB4MTMKKyNkZWZpbmUgQURFNzc1OF9NTU9ERSAgICAgMHgxNAorI2RlZmluZSBBREU3NzU4X1dBVk1PREUgICAweDE1CisjZGVmaW5lIEFERTc3NThfQ09NUE1PREUgIDB4MTYKKyNkZWZpbmUgQURFNzc1OF9MQ1lDTU9ERSAgMHgxNworI2RlZmluZSBBREU3NzU4X01BU0sgICAgICAweDE4CisjZGVmaW5lIEFERTc3NThfU1RBVFVTICAgIDB4MTkKKyNkZWZpbmUgQURFNzc1OF9SU1RBVFVTICAgMHgxQQorI2RlZmluZSBBREU3NzU4X1pYVE9VVCAgICAweDFCCisjZGVmaW5lIEFERTc3NThfTElORUNZQyAgIDB4MUMKKyNkZWZpbmUgQURFNzc1OF9TQUdDWUMgICAgMHgxRAorI2RlZmluZSBBREU3NzU4X1NBR0xWTCAgICAweDFFCisjZGVmaW5lIEFERTc3NThfVlBJTlRMVkwgIDB4MUYKKyNkZWZpbmUgQURFNzc1OF9JUElOVExWTCAgMHgyMAorI2RlZmluZSBBREU3NzU4X1ZQRUFLICAgICAweDIxCisjZGVmaW5lIEFERTc3NThfSVBFQUsgICAgIDB4MjIKKyNkZWZpbmUgQURFNzc1OF9HQUlOICAgICAgMHgyMworI2RlZmluZSBBREU3NzU4X0FWUk1TR0FJTiAweDI0CisjZGVmaW5lIEFERTc3NThfQlZSTVNHQUlOIDB4MjUKKyNkZWZpbmUgQURFNzc1OF9DVlJNU0dBSU4gMHgyNgorI2RlZmluZSBBREU3NzU4X0FJR0FJTiAgICAweDI3CisjZGVmaW5lIEFERTc3NThfQklHQUlOICAgIDB4MjgKKyNkZWZpbmUgQURFNzc1OF9DSUdBSU4gICAgMHgyOQorI2RlZmluZSBBREU3NzU4X0FXRyAgICAgICAweDJBCisjZGVmaW5lIEFERTc3NThfQldHICAgICAgIDB4MkIKKyNkZWZpbmUgQURFNzc1OF9DV0cgICAgICAgMHgyQworI2RlZmluZSBBREU3NzU4X0FWQVJHICAgICAweDJECisjZGVmaW5lIEFERTc3NThfQlZBUkcgICAgIDB4MkUKKyNkZWZpbmUgQURFNzc1OF9DVkFSRyAgICAgMHgyRgorI2RlZmluZSBBREU3NzU4X0FWQUcgICAgICAweDMwCisjZGVmaW5lIEFERTc3NThfQlZBRyAgICAgIDB4MzEKKyNkZWZpbmUgQURFNzc1OF9DVkFHICAgICAgMHgzMgorI2RlZmluZSBBREU3NzU4X0FWUk1TT1MgICAweDMzCisjZGVmaW5lIEFERTc3NThfQlZSTVNPUyAgIDB4MzQKKyNkZWZpbmUgQURFNzc1OF9DVlJNU09TICAgMHgzNQorI2RlZmluZSBBREU3NzU4X0FJUk1TT1MgICAweDM2CisjZGVmaW5lIEFERTc3NThfQklSTVNPUyAgIDB4MzcKKyNkZWZpbmUgQURFNzc1OF9DSVJNU09TICAgMHgzOAorI2RlZmluZSBBREU3NzU4X0FXQUlUT1MgICAweDM5CisjZGVmaW5lIEFERTc3NThfQldBSVRPUyAgIDB4M0EKKyNkZWZpbmUgQURFNzc1OF9DV0FJVE9TICAgMHgzQgorI2RlZmluZSBBREU3NzU4X0FWQVJPUyAgICAweDNDCisjZGVmaW5lIEFERTc3NThfQlZBUk9TICAgIDB4M0QKKyNkZWZpbmUgQURFNzc1OF9DVkFST1MgICAgMHgzRQorI2RlZmluZSBBREU3NzU4X0FQSENBTCAgICAweDNGCisjZGVmaW5lIEFERTc3NThfQlBIQ0FMICAgIDB4NDAKKyNkZWZpbmUgQURFNzc1OF9DUEhDQUwgICAgMHg0MQorI2RlZmluZSBBREU3NzU4X1dESVYgICAgICAweDQyCisjZGVmaW5lIEFERTc3NThfVkFESVYgICAgIDB4NDQKKyNkZWZpbmUgQURFNzc1OF9WQVJESVYgICAgMHg0MworI2RlZmluZSBBREU3NzU4X0FQQ0ZOVU0gICAweDQ1CisjZGVmaW5lIEFERTc3NThfQVBDRkRFTiAgIDB4NDYKKyNkZWZpbmUgQURFNzc1OF9WQVJDRk5VTSAgMHg0NworI2RlZmluZSBBREU3NzU4X1ZBUkNGREVOICAweDQ4CisjZGVmaW5lIEFERTc3NThfQ0hLU1VNICAgIDB4N0UKKyNkZWZpbmUgQURFNzc1OF9WRVJTSU9OICAgMHg3RgorCisjZGVmaW5lIEFERTc3NThfUkVBRF9SRUcoYSkgICAgYQorI2RlZmluZSBBREU3NzU4X1dSSVRFX1JFRyhhKSAoKGEpIHwgMHg4MCkKKworI2RlZmluZSBBREU3NzU4X01BWF9UWCAgICA4CisjZGVmaW5lIEFERTc3NThfTUFYX1JYICAgIDQKKyNkZWZpbmUgQURFNzc1OF9TVEFSVFVQX0RFTEFZIDEKKworI2RlZmluZSBBREU3NzU4X1NQSV9TTE9XCSh1MzIpKDMwMCAqIDEwMDApCisjZGVmaW5lIEFERTc3NThfU1BJX0JVUlNUCSh1MzIpKDEwMDAgKiAxMDAwKQorI2RlZmluZSBBREU3NzU4X1NQSV9GQVNUCSh1MzIpKDIwMDAgKiAxMDAwKQorCisjZGVmaW5lIERSSVZFUl9OQU1FCQkiYWRlNzc1OCIKKworLyoqCisgKiBzdHJ1Y3QgYWRlNzc1OF9zdGF0ZSAtIGRldmljZSBpbnN0YW5jZSBzcGVjaWZpYyBkYXRhCisgKiBAdXM6CQkJYWN0dWFsIHNwaV9kZXZpY2UKKyAqIEB3b3JrX3RyaWdnZXJfdG9fcmluZzogYmggZm9yIHRyaWdnZXJlZCBldmVudCBoYW5kbGluZworICogQGludGVyOgkJdXNlZCB0byBjaGVjayBpZiBuZXcgaW50ZXJydXB0IGhhcyBiZWVuIHRyaWdnZXJlZAorICogQGxhc3RfdGltZXN0YW1wOglwYXNzaW5nIHRpbWVzdGFtcCBmcm9tIHRoIHRvIGJoIG9mIGludGVycnVwdCBoYW5kbGVyCisgKiBAaW5kaW9fZGV2OgkJaW5kdXN0cmlhbCBJL08gZGV2aWNlIHN0cnVjdHVyZQorICogQHRyaWc6CQlkYXRhIHJlYWR5IHRyaWdnZXIgcmVnaXN0ZXJlZCB3aXRoIGlpbworICogQHR4OgkJCXRyYW5zbWl0IGJ1ZmZlcgorICogQHJ4OgkJCXJlY2lldmUgYnVmZmVyCisgKiBAYnVmX2xvY2s6CQltdXRleCB0byBwcm90ZWN0IHR4IGFuZCByeAorICoqLworc3RydWN0IGFkZTc3NThfc3RhdGUgeworCXN0cnVjdCBzcGlfZGV2aWNlCQkqdXM7CisJc3RydWN0IHdvcmtfc3RydWN0CQl3b3JrX3RyaWdnZXJfdG9fcmluZzsKKwlzNjQJCQkJbGFzdF90aW1lc3RhbXA7CisJc3RydWN0IGlpb19kZXYJCQkqaW5kaW9fZGV2OworCXN0cnVjdCBpaW9fdHJpZ2dlcgkJKnRyaWc7CisJdTgJCQkJKnR4OworCXU4CQkJCSpyeDsKKwlzdHJ1Y3QgbXV0ZXgJCQlidWZfbG9jazsKK307CisjaWZkZWYgQ09ORklHX0lJT19SSU5HX0JVRkZFUgorLyogQXQgdGhlIG1vbWVudCB0cmlnZ2VycyBhcmUgb25seSB1c2VkIGZvciByaW5nIGJ1ZmZlcgorICogZmlsbGluZy4gVGhpcyBtYXkgY2hhbmdlIQorICovCisKK2VudW0gYWRlNzc1OF9zY2FuIHsKKwlBREU3NzU4X1NDQU5fV0ZPUk0sCit9OworCit2b2lkIGFkZTc3NThfcmVtb3ZlX3RyaWdnZXIoc3RydWN0IGlpb19kZXYgKmluZGlvX2Rldik7CitpbnQgYWRlNzc1OF9wcm9iZV90cmlnZ2VyKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpOworCitzc2l6ZV90IGFkZTc3NThfcmVhZF9kYXRhX2Zyb21fcmluZyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpOworCisKK2ludCBhZGU3NzU4X2NvbmZpZ3VyZV9yaW5nKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpOwordm9pZCBhZGU3NzU4X3VuY29uZmlndXJlX3Jpbmcoc3RydWN0IGlpb19kZXYgKmluZGlvX2Rldik7CisKK2ludCBhZGU3NzU4X2luaXRpYWxpemVfcmluZyhzdHJ1Y3QgaWlvX3JpbmdfYnVmZmVyICpyaW5nKTsKK3ZvaWQgYWRlNzc1OF91bmluaXRpYWxpemVfcmluZyhzdHJ1Y3QgaWlvX3JpbmdfYnVmZmVyICpyaW5nKTsKK2ludCBhZGU3NzU4X3NldF9pcnEoc3RydWN0IGRldmljZSAqZGV2LCBib29sIGVuYWJsZSk7CisjZWxzZSAvKiBDT05GSUdfSUlPX1JJTkdfQlVGRkVSICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhZGU3NzU4X3JlbW92ZV90cmlnZ2VyKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCit7Cit9CitzdGF0aWMgaW5saW5lIGludCBhZGU3NzU4X3Byb2JlX3RyaWdnZXIoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBzc2l6ZV90CithZGU3NzU4X3JlYWRfZGF0YV9mcm9tX3Jpbmcoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFkZTc3NThfY29uZmlndXJlX3Jpbmcoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKK3sKKwlyZXR1cm4gMDsKK30KK3N0YXRpYyBpbmxpbmUgdm9pZCBhZGU3NzU4X3VuY29uZmlndXJlX3Jpbmcoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKK3sKK30KK3N0YXRpYyBpbmxpbmUgaW50IGFkZTc3NThfaW5pdGlhbGl6ZV9yaW5nKHN0cnVjdCBpaW9fcmluZ19idWZmZXIgKnJpbmcpCit7CisJcmV0dXJuIDA7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgYWRlNzc1OF91bmluaXRpYWxpemVfcmluZyhzdHJ1Y3QgaWlvX3JpbmdfYnVmZmVyICpyaW5nKQoreworfQorI2VuZGlmIC8qIENPTkZJR19JSU9fUklOR19CVUZGRVIgKi8KKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL21ldGVyL2FkZTc3NThfY29yZS5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9tZXRlci9hZGU3NzU4X2NvcmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzYzNGNiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9tZXRlci9hZGU3NzU4X2NvcmUuYwpAQCAtMCwwICsxLDg2NiBAQAorLyoKKyAqIEFERTc3NTggUG9seXBoYXNlIE11bHRpZnVuY3Rpb24gRW5lcmd5IE1ldGVyaW5nIElDIERyaXZlcgorICoKKyAqIENvcHlyaWdodCAyMDEwIEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNmcy5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKworI2luY2x1ZGUgIi4uL2lpby5oIgorI2luY2x1ZGUgIi4uL3N5c2ZzLmgiCisjaW5jbHVkZSAibWV0ZXIuaCIKKyNpbmNsdWRlICJhZGU3NzU4LmgiCisKK2ludCBhZGU3NzU4X3NwaV93cml0ZV9yZWdfOChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXU4IHJlZ19hZGRyZXNzLAorCQl1OCB2YWwpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkZTc3NThfc3RhdGUgKnN0ID0gaWlvX2Rldl9nZXRfZGV2ZGF0YShpbmRpb19kZXYpOworCisJbXV0ZXhfbG9jaygmc3QtPmJ1Zl9sb2NrKTsKKwlzdC0+dHhbMF0gPSBBREU3NzU4X1dSSVRFX1JFRyhyZWdfYWRkcmVzcyk7CisJc3QtPnR4WzFdID0gdmFsOworCisJcmV0ID0gc3BpX3dyaXRlKHN0LT51cywgc3QtPnR4LCAyKTsKKwltdXRleF91bmxvY2soJnN0LT5idWZfbG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFkZTc3NThfc3BpX3dyaXRlX3JlZ18xNihzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXU4IHJlZ19hZGRyZXNzLAorCQl1MTYgdmFsdWUpCit7CisJaW50IHJldDsKKwlzdHJ1Y3Qgc3BpX21lc3NhZ2UgbXNnOworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWRlNzc1OF9zdGF0ZSAqc3QgPSBpaW9fZGV2X2dldF9kZXZkYXRhKGluZGlvX2Rldik7CisJc3RydWN0IHNwaV90cmFuc2ZlciB4ZmVyc1tdID0geworCQl7CisJCQkudHhfYnVmID0gc3QtPnR4LAorCQkJLmJpdHNfcGVyX3dvcmQgPSA4LAorCQkJLmxlbiA9IDMsCisJCX0KKwl9OworCisJbXV0ZXhfbG9jaygmc3QtPmJ1Zl9sb2NrKTsKKwlzdC0+dHhbMF0gPSBBREU3NzU4X1dSSVRFX1JFRyhyZWdfYWRkcmVzcyk7CisJc3QtPnR4WzFdID0gKHZhbHVlID4+IDgpICYgMHhGRjsKKwlzdC0+dHhbMl0gPSB2YWx1ZSAmIDB4RkY7CisKKwlzcGlfbWVzc2FnZV9pbml0KCZtc2cpOworCXNwaV9tZXNzYWdlX2FkZF90YWlsKHhmZXJzLCAmbXNnKTsKKwlyZXQgPSBzcGlfc3luYyhzdC0+dXMsICZtc2cpOworCW11dGV4X3VubG9jaygmc3QtPmJ1Zl9sb2NrKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYWRlNzc1OF9zcGlfd3JpdGVfcmVnXzI0KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJdTggcmVnX2FkZHJlc3MsCisJCXUzMiB2YWx1ZSkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBzcGlfbWVzc2FnZSBtc2c7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZGU3NzU4X3N0YXRlICpzdCA9IGlpb19kZXZfZ2V0X2RldmRhdGEoaW5kaW9fZGV2KTsKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyIHhmZXJzW10gPSB7CisJCXsKKwkJCS50eF9idWYgPSBzdC0+dHgsCisJCQkuYml0c19wZXJfd29yZCA9IDgsCisJCQkubGVuID0gNCwKKwkJfQorCX07CisKKwltdXRleF9sb2NrKCZzdC0+YnVmX2xvY2spOworCXN0LT50eFswXSA9IEFERTc3NThfV1JJVEVfUkVHKHJlZ19hZGRyZXNzKTsKKwlzdC0+dHhbMV0gPSAodmFsdWUgPj4gMTYpICYgMHhGRjsKKwlzdC0+dHhbMl0gPSAodmFsdWUgPj4gOCkgJiAweEZGOworCXN0LT50eFszXSA9IHZhbHVlICYgMHhGRjsKKworCXNwaV9tZXNzYWdlX2luaXQoJm1zZyk7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoeGZlcnMsICZtc2cpOworCXJldCA9IHNwaV9zeW5jKHN0LT51cywgJm1zZyk7CisJbXV0ZXhfdW5sb2NrKCZzdC0+YnVmX2xvY2spOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhZGU3NzU4X3NwaV9yZWFkX3JlZ184KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJdTggcmVnX2FkZHJlc3MsCisJCXU4ICp2YWwpCit7CisJc3RydWN0IHNwaV9tZXNzYWdlIG1zZzsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkZTc3NThfc3RhdGUgKnN0ID0gaWlvX2Rldl9nZXRfZGV2ZGF0YShpbmRpb19kZXYpOworCWludCByZXQ7CisJc3RydWN0IHNwaV90cmFuc2ZlciB4ZmVyc1tdID0geworCQl7CisJCQkudHhfYnVmID0gc3QtPnR4LAorCQkJLnJ4X2J1ZiA9IHN0LT5yeCwKKwkJCS5iaXRzX3Blcl93b3JkID0gOCwKKwkJCS5sZW4gPSAyLAorCQl9LAorCX07CisKKwltdXRleF9sb2NrKCZzdC0+YnVmX2xvY2spOworCXN0LT50eFswXSA9IEFERTc3NThfUkVBRF9SRUcocmVnX2FkZHJlc3MpOworCXN0LT50eFsxXSA9IDA7CisKKwlzcGlfbWVzc2FnZV9pbml0KCZtc2cpOworCXNwaV9tZXNzYWdlX2FkZF90YWlsKHhmZXJzLCAmbXNnKTsKKwlyZXQgPSBzcGlfc3luYyhzdC0+dXMsICZtc2cpOworCWlmIChyZXQpIHsKKwkJZGV2X2Vycigmc3QtPnVzLT5kZXYsICJwcm9ibGVtIHdoZW4gcmVhZGluZyA4IGJpdCByZWdpc3RlciAweCUwMlgiLAorCQkJCXJlZ19hZGRyZXNzKTsKKwkJZ290byBlcnJvcl9yZXQ7CisJfQorCSp2YWwgPSBzdC0+cnhbMV07CisKK2Vycm9yX3JldDoKKwltdXRleF91bmxvY2soJnN0LT5idWZfbG9jayk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhZGU3NzU4X3NwaV9yZWFkX3JlZ18xNihzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXU4IHJlZ19hZGRyZXNzLAorCQl1MTYgKnZhbCkKK3sKKwlzdHJ1Y3Qgc3BpX21lc3NhZ2UgbXNnOworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWRlNzc1OF9zdGF0ZSAqc3QgPSBpaW9fZGV2X2dldF9kZXZkYXRhKGluZGlvX2Rldik7CisJaW50IHJldDsKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyIHhmZXJzW10gPSB7CisJCXsKKwkJCS50eF9idWYgPSBzdC0+dHgsCisJCQkucnhfYnVmID0gc3QtPnJ4LAorCQkJLmJpdHNfcGVyX3dvcmQgPSA4LAorCQkJLmxlbiA9IDMsCisJCX0sCisJfTsKKworCW11dGV4X2xvY2soJnN0LT5idWZfbG9jayk7CisJc3QtPnR4WzBdID0gQURFNzc1OF9SRUFEX1JFRyhyZWdfYWRkcmVzcyk7CisJc3QtPnR4WzFdID0gMDsKKwlzdC0+dHhbMl0gPSAwOworCisJc3BpX21lc3NhZ2VfaW5pdCgmbXNnKTsKKwlzcGlfbWVzc2FnZV9hZGRfdGFpbCh4ZmVycywgJm1zZyk7CisJcmV0ID0gc3BpX3N5bmMoc3QtPnVzLCAmbXNnKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJnN0LT51cy0+ZGV2LCAicHJvYmxlbSB3aGVuIHJlYWRpbmcgMTYgYml0IHJlZ2lzdGVyIDB4JTAyWCIsCisJCQkJcmVnX2FkZHJlc3MpOworCQlnb3RvIGVycm9yX3JldDsKKwl9CisJKnZhbCA9IChzdC0+cnhbMV0gPDwgOCkgfCBzdC0+cnhbMl07CisKK2Vycm9yX3JldDoKKwltdXRleF91bmxvY2soJnN0LT5idWZfbG9jayk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhZGU3NzU4X3NwaV9yZWFkX3JlZ18yNChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXU4IHJlZ19hZGRyZXNzLAorCQl1MzIgKnZhbCkKK3sKKwlzdHJ1Y3Qgc3BpX21lc3NhZ2UgbXNnOworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWRlNzc1OF9zdGF0ZSAqc3QgPSBpaW9fZGV2X2dldF9kZXZkYXRhKGluZGlvX2Rldik7CisJaW50IHJldDsKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyIHhmZXJzW10gPSB7CisJCXsKKwkJCS50eF9idWYgPSBzdC0+dHgsCisJCQkucnhfYnVmID0gc3QtPnJ4LAorCQkJLmJpdHNfcGVyX3dvcmQgPSA4LAorCQkJLmxlbiA9IDQsCisJCX0sCisJfTsKKworCW11dGV4X2xvY2soJnN0LT5idWZfbG9jayk7CisJc3QtPnR4WzBdID0gQURFNzc1OF9SRUFEX1JFRyhyZWdfYWRkcmVzcyk7CisJc3QtPnR4WzFdID0gMDsKKwlzdC0+dHhbMl0gPSAwOworCXN0LT50eFszXSA9IDA7CisKKwlzcGlfbWVzc2FnZV9pbml0KCZtc2cpOworCXNwaV9tZXNzYWdlX2FkZF90YWlsKHhmZXJzLCAmbXNnKTsKKwlyZXQgPSBzcGlfc3luYyhzdC0+dXMsICZtc2cpOworCWlmIChyZXQpIHsKKwkJZGV2X2Vycigmc3QtPnVzLT5kZXYsICJwcm9ibGVtIHdoZW4gcmVhZGluZyAyNCBiaXQgcmVnaXN0ZXIgMHglMDJYIiwKKwkJCQlyZWdfYWRkcmVzcyk7CisJCWdvdG8gZXJyb3JfcmV0OworCX0KKwkqdmFsID0gKHN0LT5yeFsxXSA8PCAxNikgfCAoc3QtPnJ4WzJdIDw8IDgpIHwgc3QtPnJ4WzNdOworCitlcnJvcl9yZXQ6CisJbXV0ZXhfdW5sb2NrKCZzdC0+YnVmX2xvY2spOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkZTc3NThfcmVhZF84Yml0KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlpbnQgcmV0OworCXU4IHZhbCA9IDA7CisJc3RydWN0IGlpb19kZXZfYXR0ciAqdGhpc19hdHRyID0gdG9faWlvX2Rldl9hdHRyKGF0dHIpOworCisJcmV0ID0gYWRlNzc1OF9zcGlfcmVhZF9yZWdfOChkZXYsIHRoaXNfYXR0ci0+YWRkcmVzcywgJnZhbCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCB2YWwpOworfQorCitzdGF0aWMgc3NpemVfdCBhZGU3NzU4X3JlYWRfMTZiaXQoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCWludCByZXQ7CisJdTE2IHZhbCA9IDA7CisJc3RydWN0IGlpb19kZXZfYXR0ciAqdGhpc19hdHRyID0gdG9faWlvX2Rldl9hdHRyKGF0dHIpOworCisJcmV0ID0gYWRlNzc1OF9zcGlfcmVhZF9yZWdfMTYoZGV2LCB0aGlzX2F0dHItPmFkZHJlc3MsICZ2YWwpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgdmFsKTsKK30KKworc3RhdGljIHNzaXplX3QgYWRlNzc1OF9yZWFkXzI0Yml0KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlpbnQgcmV0OworCXUzMiB2YWwgPSAwOworCXN0cnVjdCBpaW9fZGV2X2F0dHIgKnRoaXNfYXR0ciA9IHRvX2lpb19kZXZfYXR0cihhdHRyKTsKKworCXJldCA9IGFkZTc3NThfc3BpX3JlYWRfcmVnXzI0KGRldiwgdGhpc19hdHRyLT5hZGRyZXNzLCAmdmFsKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIHZhbCAmIDB4RkZGRkZGKTsKK30KKworc3RhdGljIHNzaXplX3QgYWRlNzc1OF93cml0ZV84Yml0KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWlvX2Rldl9hdHRyICp0aGlzX2F0dHIgPSB0b19paW9fZGV2X2F0dHIoYXR0cik7CisJaW50IHJldDsKKwlsb25nIHZhbDsKKworCXJldCA9IHN0cmljdF9zdHJ0b2woYnVmLCAxMCwgJnZhbCk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9yZXQ7CisJcmV0ID0gYWRlNzc1OF9zcGlfd3JpdGVfcmVnXzgoZGV2LCB0aGlzX2F0dHItPmFkZHJlc3MsIHZhbCk7CisKK2Vycm9yX3JldDoKKwlyZXR1cm4gcmV0ID8gcmV0IDogbGVuOworfQorCitzdGF0aWMgc3NpemVfdCBhZGU3NzU4X3dyaXRlXzE2Yml0KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWlvX2Rldl9hdHRyICp0aGlzX2F0dHIgPSB0b19paW9fZGV2X2F0dHIoYXR0cik7CisJaW50IHJldDsKKwlsb25nIHZhbDsKKworCXJldCA9IHN0cmljdF9zdHJ0b2woYnVmLCAxMCwgJnZhbCk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9yZXQ7CisJcmV0ID0gYWRlNzc1OF9zcGlfd3JpdGVfcmVnXzE2KGRldiwgdGhpc19hdHRyLT5hZGRyZXNzLCB2YWwpOworCitlcnJvcl9yZXQ6CisJcmV0dXJuIHJldCA/IHJldCA6IGxlbjsKK30KKworaW50IGFkZTc3NThfcmVzZXQoc3RydWN0IGRldmljZSAqZGV2KQoreworCWludCByZXQ7CisJdTggdmFsOworCWFkZTc3NThfc3BpX3JlYWRfcmVnXzgoZGV2LAorCQkJQURFNzc1OF9PUE1PREUsCisJCQkmdmFsKTsKKwl2YWwgfD0gMSA8PCA2OyAvKiBTb2Z0d2FyZSBDaGlwIFJlc2V0ICovCisJcmV0ID0gYWRlNzc1OF9zcGlfd3JpdGVfcmVnXzgoZGV2LAorCQkJQURFNzc1OF9PUE1PREUsCisJCQl2YWwpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QgYWRlNzc1OF93cml0ZV9yZXNldChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBsZW4pCit7CisJaWYgKGxlbiA8IDEpCisJCXJldHVybiAtMTsKKwlzd2l0Y2ggKGJ1ZlswXSkgeworCWNhc2UgJzEnOgorCWNhc2UgJ3knOgorCWNhc2UgJ1knOgorCQlyZXR1cm4gYWRlNzc1OF9yZXNldChkZXYpOworCX0KKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBJSU9fREVWX0FUVFJfVlBFQUsoU19JV1VTUiB8IFNfSVJVR08sCisJCWFkZTc3NThfcmVhZF84Yml0LAorCQlhZGU3NzU4X3dyaXRlXzhiaXQsCisJCUFERTc3NThfVlBFQUspOworc3RhdGljIElJT19ERVZfQVRUUl9JUEVBSyhTX0lXVVNSIHwgU19JUlVHTywKKwkJYWRlNzc1OF9yZWFkXzhiaXQsCisJCWFkZTc3NThfd3JpdGVfOGJpdCwKKwkJQURFNzc1OF9WUEVBSyk7CitzdGF0aWMgSUlPX0RFVl9BVFRSX0FQSENBTChTX0lXVVNSIHwgU19JUlVHTywKKwkJYWRlNzc1OF9yZWFkXzhiaXQsCisJCWFkZTc3NThfd3JpdGVfOGJpdCwKKwkJQURFNzc1OF9BUEhDQUwpOworc3RhdGljIElJT19ERVZfQVRUUl9CUEhDQUwoU19JV1VTUiB8IFNfSVJVR08sCisJCWFkZTc3NThfcmVhZF84Yml0LAorCQlhZGU3NzU4X3dyaXRlXzhiaXQsCisJCUFERTc3NThfQlBIQ0FMKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfQ1BIQ0FMKFNfSVdVU1IgfCBTX0lSVUdPLAorCQlhZGU3NzU4X3JlYWRfOGJpdCwKKwkJYWRlNzc1OF93cml0ZV84Yml0LAorCQlBREU3NzU4X0NQSENBTCk7CitzdGF0aWMgSUlPX0RFVl9BVFRSX1dESVYoU19JV1VTUiB8IFNfSVJVR08sCisJCWFkZTc3NThfcmVhZF84Yml0LAorCQlhZGU3NzU4X3dyaXRlXzhiaXQsCisJCUFERTc3NThfV0RJVik7CitzdGF0aWMgSUlPX0RFVl9BVFRSX1ZBRElWKFNfSVdVU1IgfCBTX0lSVUdPLAorCQlhZGU3NzU4X3JlYWRfOGJpdCwKKwkJYWRlNzc1OF93cml0ZV84Yml0LAorCQlBREU3NzU4X1ZBRElWKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfQUlSTVMoU19JUlVHTywKKwkJYWRlNzc1OF9yZWFkXzI0Yml0LAorCQlOVUxMLAorCQlBREU3NzU4X0FJUk1TKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfQklSTVMoU19JUlVHTywKKwkJYWRlNzc1OF9yZWFkXzI0Yml0LAorCQlOVUxMLAorCQlBREU3NzU4X0JJUk1TKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfQ0lSTVMoU19JUlVHTywKKwkJYWRlNzc1OF9yZWFkXzI0Yml0LAorCQlOVUxMLAorCQlBREU3NzU4X0NJUk1TKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfQVZSTVMoU19JUlVHTywKKwkJYWRlNzc1OF9yZWFkXzI0Yml0LAorCQlOVUxMLAorCQlBREU3NzU4X0FWUk1TKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfQlZSTVMoU19JUlVHTywKKwkJYWRlNzc1OF9yZWFkXzI0Yml0LAorCQlOVUxMLAorCQlBREU3NzU4X0JWUk1TKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfQ1ZSTVMoU19JUlVHTywKKwkJYWRlNzc1OF9yZWFkXzI0Yml0LAorCQlOVUxMLAorCQlBREU3NzU4X0NWUk1TKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfQUlSTVNPUyhTX0lXVVNSIHwgU19JUlVHTywKKwkJYWRlNzc1OF9yZWFkXzE2Yml0LAorCQlhZGU3NzU4X3dyaXRlXzE2Yml0LAorCQlBREU3NzU4X0FJUk1TT1MpOworc3RhdGljIElJT19ERVZfQVRUUl9CSVJNU09TKFNfSVdVU1IgfCBTX0lSVUdPLAorCQlhZGU3NzU4X3JlYWRfMTZiaXQsCisJCWFkZTc3NThfd3JpdGVfMTZiaXQsCisJCUFERTc3NThfQklSTVNPUyk7CitzdGF0aWMgSUlPX0RFVl9BVFRSX0NJUk1TT1MoU19JV1VTUiB8IFNfSVJVR08sCisJCWFkZTc3NThfcmVhZF8xNmJpdCwKKwkJYWRlNzc1OF93cml0ZV8xNmJpdCwKKwkJQURFNzc1OF9DSVJNU09TKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfQVZSTVNPUyhTX0lXVVNSIHwgU19JUlVHTywKKwkJYWRlNzc1OF9yZWFkXzE2Yml0LAorCQlhZGU3NzU4X3dyaXRlXzE2Yml0LAorCQlBREU3NzU4X0FWUk1TT1MpOworc3RhdGljIElJT19ERVZfQVRUUl9CVlJNU09TKFNfSVdVU1IgfCBTX0lSVUdPLAorCQlhZGU3NzU4X3JlYWRfMTZiaXQsCisJCWFkZTc3NThfd3JpdGVfMTZiaXQsCisJCUFERTc3NThfQlZSTVNPUyk7CitzdGF0aWMgSUlPX0RFVl9BVFRSX0NWUk1TT1MoU19JV1VTUiB8IFNfSVJVR08sCisJCWFkZTc3NThfcmVhZF8xNmJpdCwKKwkJYWRlNzc1OF93cml0ZV8xNmJpdCwKKwkJQURFNzc1OF9DVlJNU09TKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfQUlHQUlOKFNfSVdVU1IgfCBTX0lSVUdPLAorCQlhZGU3NzU4X3JlYWRfMTZiaXQsCisJCWFkZTc3NThfd3JpdGVfMTZiaXQsCisJCUFERTc3NThfQUlHQUlOKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfQklHQUlOKFNfSVdVU1IgfCBTX0lSVUdPLAorCQlhZGU3NzU4X3JlYWRfMTZiaXQsCisJCWFkZTc3NThfd3JpdGVfMTZiaXQsCisJCUFERTc3NThfQklHQUlOKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfQ0lHQUlOKFNfSVdVU1IgfCBTX0lSVUdPLAorCQlhZGU3NzU4X3JlYWRfMTZiaXQsCisJCWFkZTc3NThfd3JpdGVfMTZiaXQsCisJCUFERTc3NThfQ0lHQUlOKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfQVZSTVNHQUlOKFNfSVdVU1IgfCBTX0lSVUdPLAorCQlhZGU3NzU4X3JlYWRfMTZiaXQsCisJCWFkZTc3NThfd3JpdGVfMTZiaXQsCisJCUFERTc3NThfQVZSTVNHQUlOKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfQlZSTVNHQUlOKFNfSVdVU1IgfCBTX0lSVUdPLAorCQlhZGU3NzU4X3JlYWRfMTZiaXQsCisJCWFkZTc3NThfd3JpdGVfMTZiaXQsCisJCUFERTc3NThfQlZSTVNHQUlOKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfQ1ZSTVNHQUlOKFNfSVdVU1IgfCBTX0lSVUdPLAorCQlhZGU3NzU4X3JlYWRfMTZiaXQsCisJCWFkZTc3NThfd3JpdGVfMTZiaXQsCisJCUFERTc3NThfQ1ZSTVNHQUlOKTsKKworaW50IGFkZTc3NThfc2V0X2lycShzdHJ1Y3QgZGV2aWNlICpkZXYsIGJvb2wgZW5hYmxlKQoreworCWludCByZXQ7CisJdTMyIGlycWVuOworCXJldCA9IGFkZTc3NThfc3BpX3JlYWRfcmVnXzI0KGRldiwgQURFNzc1OF9NQVNLLCAmaXJxZW4pOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfcmV0OworCisJaWYgKGVuYWJsZSkKKwkJaXJxZW4gfD0gMSA8PCAxNjsgLyogRW5hYmxlcyBhbiBpbnRlcnJ1cHQgd2hlbiBhIGRhdGEgaXMKKwkJCQkgICAgIHByZXNlbnQgaW4gdGhlIHdhdmVmb3JtIHJlZ2lzdGVyICovCisJZWxzZQorCQlpcnFlbiAmPSB+KDEgPDwgMTYpOworCisJcmV0ID0gYWRlNzc1OF9zcGlfd3JpdGVfcmVnXzI0KGRldiwgQURFNzc1OF9NQVNLLCBpcnFlbik7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9yZXQ7CisKK2Vycm9yX3JldDoKKwlyZXR1cm4gcmV0OworfQorCisvKiBQb3dlciBkb3duIHRoZSBkZXZpY2UgKi8KK3N0YXRpYyBpbnQgYWRlNzc1OF9zdG9wX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJaW50IHJldDsKKwl1OCB2YWw7CisJYWRlNzc1OF9zcGlfcmVhZF9yZWdfOChkZXYsCisJCQlBREU3NzU4X09QTU9ERSwKKwkJCSZ2YWwpOworCXZhbCB8PSA3IDw8IDM7ICAvKiBBREU3NzU4IHBvd2VyZWQgZG93biAqLworCXJldCA9IGFkZTc3NThfc3BpX3dyaXRlX3JlZ184KGRldiwKKwkJCUFERTc3NThfT1BNT0RFLAorCQkJdmFsKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYWRlNzc1OF9pbml0aWFsX3NldHVwKHN0cnVjdCBhZGU3NzU4X3N0YXRlICpzdCkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZzdC0+aW5kaW9fZGV2LT5kZXY7CisKKwkvKiB1c2UgbG93IHNwaSBzcGVlZCBmb3IgaW5pdCAqLworCXN0LT51cy0+bW9kZSA9IFNQSV9NT0RFXzM7CisJc3BpX3NldHVwKHN0LT51cyk7CisKKwkvKiBEaXNhYmxlIElSUSAqLworCXJldCA9IGFkZTc3NThfc2V0X2lycShkZXYsIGZhbHNlKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoZGV2LCAiZGlzYWJsZSBpcnEgZmFpbGVkIik7CisJCWdvdG8gZXJyX3JldDsKKwl9CisKKwlhZGU3NzU4X3Jlc2V0KGRldik7CisJbXNsZWVwKEFERTc3NThfU1RBUlRVUF9ERUxBWSk7CisKK2Vycl9yZXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QgYWRlNzc1OF9yZWFkX2ZyZXF1ZW5jeShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJaW50IHJldCwgbGVuID0gMDsKKwl1OCB0OworCWludCBzcHM7CisJcmV0ID0gYWRlNzc1OF9zcGlfcmVhZF9yZWdfOChkZXYsCisJCQlBREU3NzU4X1dBVk1PREUsCisJCQkmdCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXQgPSAodCA+PiA1KSAmIDB4MzsKKwlzcHMgPSAyNjA0MCAvICgxIDw8IHQpOworCisJbGVuID0gc3ByaW50ZihidWYsICIlZCBTUFNcbiIsIHNwcyk7CisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIHNzaXplX3QgYWRlNzc1OF93cml0ZV9mcmVxdWVuY3koc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgbGVuKQoreworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWRlNzc1OF9zdGF0ZSAqc3QgPSBpaW9fZGV2X2dldF9kZXZkYXRhKGluZGlvX2Rldik7CisJdW5zaWduZWQgbG9uZyB2YWw7CisJaW50IHJldDsKKwl1OCByZWcsIHQ7CisKKwlyZXQgPSBzdHJpY3Rfc3RydG9sKGJ1ZiwgMTAsICZ2YWwpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwltdXRleF9sb2NrKCZpbmRpb19kZXYtPm1sb2NrKTsKKworCXQgPSAoMjYwNDAgLyB2YWwpOworCWlmICh0ID4gMCkKKwkJdCA+Pj0gMTsKKworCWlmICh0ID4gMSkKKwkJc3QtPnVzLT5tYXhfc3BlZWRfaHogPSBBREU3NzU4X1NQSV9TTE9XOworCWVsc2UKKwkJc3QtPnVzLT5tYXhfc3BlZWRfaHogPSBBREU3NzU4X1NQSV9GQVNUOworCisJcmV0ID0gYWRlNzc1OF9zcGlfcmVhZF9yZWdfOChkZXYsCisJCQlBREU3NzU4X1dBVk1PREUsCisJCQkmcmVnKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKworCXJlZyAmPSB+KDUgPDwgMyk7CisJcmVnIHw9IHQgPDwgNTsKKworCXJldCA9IGFkZTc3NThfc3BpX3dyaXRlX3JlZ184KGRldiwKKwkJCUFERTc3NThfV0FWTU9ERSwKKwkJCXJlZyk7CisKK291dDoKKwltdXRleF91bmxvY2soJmluZGlvX2Rldi0+bWxvY2spOworCisJcmV0dXJuIHJldCA/IHJldCA6IGxlbjsKK30KKworc3RhdGljIHNzaXplX3QgYWRlNzc1OF9yZWFkX3dhdmVmb3JtX3R5cGUoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCWludCByZXQsIGxlbiA9IDA7CisJdTggdDsKKwlyZXQgPSBhZGU3NzU4X3NwaV9yZWFkX3JlZ184KGRldiwKKwkJCUFERTc3NThfV0FWTU9ERSwKKwkJCSZ0KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJdCA9ICh0ID4+IDIpICYgMHg3OworCisJbGVuID0gc3ByaW50ZihidWYsICIlZFxuIiwgdCk7CisKKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgc3NpemVfdCBhZGU3NzU4X3dyaXRlX3dhdmVmb3JtX3R5cGUoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgbGVuKQoreworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwl1bnNpZ25lZCBsb25nIHZhbDsKKwlpbnQgcmV0OworCXU4IHJlZzsKKworCXJldCA9IHN0cmljdF9zdHJ0b2woYnVmLCAxMCwgJnZhbCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWlmICh2YWwgPiA0KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW11dGV4X2xvY2soJmluZGlvX2Rldi0+bWxvY2spOworCisJcmV0ID0gYWRlNzc1OF9zcGlfcmVhZF9yZWdfOChkZXYsCisJCQlBREU3NzU4X1dBVk1PREUsCisJCQkmcmVnKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKworCXJlZyAmPSB+KDcgPDwgMik7CisJcmVnIHw9IHZhbCA8PCAyOworCisJcmV0ID0gYWRlNzc1OF9zcGlfd3JpdGVfcmVnXzgoZGV2LAorCQkJQURFNzc1OF9XQVZNT0RFLAorCQkJcmVnKTsKKworb3V0OgorCW11dGV4X3VubG9jaygmaW5kaW9fZGV2LT5tbG9jayk7CisKKwlyZXR1cm4gcmV0ID8gcmV0IDogbGVuOworfQorCitzdGF0aWMgSUlPX0RFVl9BVFRSX1RFTVBfUkFXKGFkZTc3NThfcmVhZF84Yml0KTsKK3N0YXRpYyBJSU9fQ09OU1RfQVRUUih0ZW1wX29mZnNldCwgIjEyOSBDIik7CitzdGF0aWMgSUlPX0NPTlNUX0FUVFIodGVtcF9zY2FsZSwgIjQgQyIpOworCitzdGF0aWMgSUlPX0RFVl9BVFRSX0FXQVRUSFIoYWRlNzc1OF9yZWFkXzE2Yml0LAorCQlBREU3NzU4X0FXQVRUSFIpOworc3RhdGljIElJT19ERVZfQVRUUl9CV0FUVEhSKGFkZTc3NThfcmVhZF8xNmJpdCwKKwkJQURFNzc1OF9CV0FUVEhSKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfQ1dBVFRIUihhZGU3NzU4X3JlYWRfMTZiaXQsCisJCUFERTc3NThfQ1dBVFRIUik7CitzdGF0aWMgSUlPX0RFVl9BVFRSX0FWQVJIUihhZGU3NzU4X3JlYWRfMTZiaXQsCisJCUFERTc3NThfQVZBUkhSKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfQlZBUkhSKGFkZTc3NThfcmVhZF8xNmJpdCwKKwkJQURFNzc1OF9CVkFSSFIpOworc3RhdGljIElJT19ERVZfQVRUUl9DVkFSSFIoYWRlNzc1OF9yZWFkXzE2Yml0LAorCQlBREU3NzU4X0NWQVJIUik7CitzdGF0aWMgSUlPX0RFVl9BVFRSX0FWQUhSKGFkZTc3NThfcmVhZF8xNmJpdCwKKwkJQURFNzc1OF9BVkFIUik7CitzdGF0aWMgSUlPX0RFVl9BVFRSX0JWQUhSKGFkZTc3NThfcmVhZF8xNmJpdCwKKwkJQURFNzc1OF9CVkFIUik7CitzdGF0aWMgSUlPX0RFVl9BVFRSX0NWQUhSKGFkZTc3NThfcmVhZF8xNmJpdCwKKwkJQURFNzc1OF9DVkFIUik7CisKK3N0YXRpYyBJSU9fREVWX0FUVFJfU0FNUF9GUkVRKFNfSVdVU1IgfCBTX0lSVUdPLAorCQlhZGU3NzU4X3JlYWRfZnJlcXVlbmN5LAorCQlhZGU3NzU4X3dyaXRlX2ZyZXF1ZW5jeSk7CisKKy8qKgorICogSUlPX0RFVl9BVFRSX1dBVkVGT1JNX1RZUEUgLSBzZXQgdGhlIHR5cGUgb2Ygd2F2ZWZvcm0uCisgKiBAX21vZGU6IHN5c2ZzIGZpbGUgbW9kZS9wZXJtaXNzaW9ucworICogQF9zaG93OiBvdXRwdXQgbWV0aG9kIGZvciB0aGUgYXR0cmlidXRlCisgKiBAX3N0b3JlOiBpbnB1dCBtZXRob2QgZm9yIHRoZSBhdHRyaWJ1dGUKKyAqKi8KKyNkZWZpbmUgSUlPX0RFVl9BVFRSX1dBVkVGT1JNX1RZUEUoX21vZGUsIF9zaG93LCBfc3RvcmUpCQkJXAorCUlJT19ERVZJQ0VfQVRUUih3YXZlZm9ybV90eXBlLCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgMCkKKworc3RhdGljIElJT19ERVZfQVRUUl9XQVZFRk9STV9UWVBFKFNfSVdVU1IgfCBTX0lSVUdPLAorCQlhZGU3NzU4X3JlYWRfd2F2ZWZvcm1fdHlwZSwKKwkJYWRlNzc1OF93cml0ZV93YXZlZm9ybV90eXBlKTsKKworc3RhdGljIElJT19ERVZfQVRUUl9SRVNFVChhZGU3NzU4X3dyaXRlX3Jlc2V0KTsKKworc3RhdGljIElJT19DT05TVF9BVFRSX1NBTVBfRlJFUV9BVkFJTCgiMjYwMDAgMTMwMDAgNjUwMDAgMzMwMDAiKTsKKworc3RhdGljIElJT19DT05TVF9BVFRSKG5hbWUsICJhZGU3NzU4Iik7CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICphZGU3NzU4X2V2ZW50X2F0dHJpYnV0ZXNbXSA9IHsKKwlOVUxMCit9OworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBhZGU3NzU4X2V2ZW50X2F0dHJpYnV0ZV9ncm91cCA9IHsKKwkuYXR0cnMgPSBhZGU3NzU4X2V2ZW50X2F0dHJpYnV0ZXMsCit9OworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqYWRlNzc1OF9hdHRyaWJ1dGVzW10gPSB7CisJJmlpb19kZXZfYXR0cl90ZW1wX3Jhdy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fY29uc3RfYXR0cl90ZW1wX29mZnNldC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fY29uc3RfYXR0cl90ZW1wX3NjYWxlLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9zYW1wbGluZ19mcmVxdWVuY3kuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX3dhdmVmb3JtX3R5cGUuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2NvbnN0X2F0dHJfc2FtcGxpbmdfZnJlcXVlbmN5X2F2YWlsYWJsZS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfcmVzZXQuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2NvbnN0X2F0dHJfbmFtZS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfYXdhdHRoci5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfYndhdHRoci5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfY3dhdHRoci5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfYXZhcmhyLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9idmFyaHIuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2N2YXJoci5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfYXZhaHIuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2J2YWhyLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9jdmFoci5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfdnBlYWsuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2lwZWFrLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9hcGhjYWwuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2JwaGNhbC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfY3BoY2FsLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl93ZGl2LmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl92YWRpdi5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfYWlybXMuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2Jpcm1zLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9jaXJtcy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfYXZybXMuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2J2cm1zLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9jdnJtcy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfYWlnYWluLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9iaWdhaW4uZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2NpZ2Fpbi5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfYXZybXNnYWluLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9idnJtc2dhaW4uZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2N2cm1zZ2Fpbi5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfYWlybXNvcy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfYmlybXNvcy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfY2lybXNvcy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfYXZybXNvcy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfYnZybXNvcy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfY3ZybXNvcy5kZXZfYXR0ci5hdHRyLAorCU5VTEwsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBhZGU3NzU4X2F0dHJpYnV0ZV9ncm91cCA9IHsKKwkuYXR0cnMgPSBhZGU3NzU4X2F0dHJpYnV0ZXMsCit9OworCisKKworc3RhdGljIGludCBfX2RldmluaXQgYWRlNzc1OF9wcm9iZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCWludCByZXQsIHJlZ2RvbmUgPSAwOworCXN0cnVjdCBhZGU3NzU4X3N0YXRlICpzdCA9IGt6YWxsb2Moc2l6ZW9mICpzdCwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzdCkgeworCQlyZXQgPSAgLUVOT01FTTsKKwkJZ290byBlcnJvcl9yZXQ7CisJfQorCS8qIHRoaXMgaXMgb25seSB1c2VkIGZvciByZW1vdmFsIHB1cnBvc2VzICovCisJc3BpX3NldF9kcnZkYXRhKHNwaSwgc3QpOworCisJLyogQWxsb2NhdGUgdGhlIGNvbW1zIGJ1ZmZlcnMgKi8KKwlzdC0+cnggPSBremFsbG9jKHNpemVvZigqc3QtPnJ4KSpBREU3NzU4X01BWF9SWCwgR0ZQX0tFUk5FTCk7CisJaWYgKHN0LT5yeCA9PSBOVUxMKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3JfZnJlZV9zdDsKKwl9CisJc3QtPnR4ID0ga3phbGxvYyhzaXplb2YoKnN0LT50eCkqQURFNzc1OF9NQVhfVFgsIEdGUF9LRVJORUwpOworCWlmIChzdC0+dHggPT0gTlVMTCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycm9yX2ZyZWVfcng7CisJfQorCXN0LT51cyA9IHNwaTsKKwltdXRleF9pbml0KCZzdC0+YnVmX2xvY2spOworCS8qIHNldHVwIHRoZSBpbmR1c3RyaWFsaW8gZHJpdmVyIGFsbG9jYXRlZCBlbGVtZW50cyAqLworCXN0LT5pbmRpb19kZXYgPSBpaW9fYWxsb2NhdGVfZGV2aWNlKCk7CisJaWYgKHN0LT5pbmRpb19kZXYgPT0gTlVMTCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycm9yX2ZyZWVfdHg7CisJfQorCisJc3QtPmluZGlvX2Rldi0+ZGV2LnBhcmVudCA9ICZzcGktPmRldjsKKwlzdC0+aW5kaW9fZGV2LT5udW1faW50ZXJydXB0X2xpbmVzID0gMTsKKwlzdC0+aW5kaW9fZGV2LT5ldmVudF9hdHRycyA9ICZhZGU3NzU4X2V2ZW50X2F0dHJpYnV0ZV9ncm91cDsKKwlzdC0+aW5kaW9fZGV2LT5hdHRycyA9ICZhZGU3NzU4X2F0dHJpYnV0ZV9ncm91cDsKKwlzdC0+aW5kaW9fZGV2LT5kZXZfZGF0YSA9ICh2b2lkICopKHN0KTsKKwlzdC0+aW5kaW9fZGV2LT5kcml2ZXJfbW9kdWxlID0gVEhJU19NT0RVTEU7CisJc3QtPmluZGlvX2Rldi0+bW9kZXMgPSBJTkRJT19ESVJFQ1RfTU9ERTsKKworCXJldCA9IGFkZTc3NThfY29uZmlndXJlX3Jpbmcoc3QtPmluZGlvX2Rldik7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9mcmVlX2RldjsKKworCXJldCA9IGlpb19kZXZpY2VfcmVnaXN0ZXIoc3QtPmluZGlvX2Rldik7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl91bnJlZ19yaW5nX2Z1bmNzOworCXJlZ2RvbmUgPSAxOworCisJcmV0ID0gYWRlNzc1OF9pbml0aWFsaXplX3Jpbmcoc3QtPmluZGlvX2Rldi0+cmluZyk7CisJaWYgKHJldCkgeworCQlwcmludGsoS0VSTl9FUlIgImZhaWxlZCB0byBpbml0aWFsaXplIHRoZSByaW5nXG4iKTsKKwkJZ290byBlcnJvcl91bnJlZ19yaW5nX2Z1bmNzOworCX0KKworCWlmIChzcGktPmlycSkgeworCQlyZXQgPSBpaW9fcmVnaXN0ZXJfaW50ZXJydXB0X2xpbmUoc3BpLT5pcnEsCisJCQkJc3QtPmluZGlvX2RldiwKKwkJCQkwLAorCQkJCUlSUUZfVFJJR0dFUl9GQUxMSU5HLAorCQkJCSJhZGU3NzU4Iik7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycm9yX3VuaW5pdGlhbGl6ZV9yaW5nOworCisJCXJldCA9IGFkZTc3NThfcHJvYmVfdHJpZ2dlcihzdC0+aW5kaW9fZGV2KTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJyb3JfdW5yZWdpc3Rlcl9saW5lOworCX0KKworCS8qIEdldCB0aGUgZGV2aWNlIGludG8gYSBzYW5lIGluaXRpYWwgc3RhdGUgKi8KKwlyZXQgPSBhZGU3NzU4X2luaXRpYWxfc2V0dXAoc3QpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfcmVtb3ZlX3RyaWdnZXI7CisJcmV0dXJuIDA7CisKK2Vycm9yX3JlbW92ZV90cmlnZ2VyOgorCWlmIChzdC0+aW5kaW9fZGV2LT5tb2RlcyAmIElORElPX1JJTkdfVFJJR0dFUkVEKQorCQlhZGU3NzU4X3JlbW92ZV90cmlnZ2VyKHN0LT5pbmRpb19kZXYpOworZXJyb3JfdW5yZWdpc3Rlcl9saW5lOgorCWlmIChzdC0+aW5kaW9fZGV2LT5tb2RlcyAmIElORElPX1JJTkdfVFJJR0dFUkVEKQorCQlpaW9fdW5yZWdpc3Rlcl9pbnRlcnJ1cHRfbGluZShzdC0+aW5kaW9fZGV2LCAwKTsKK2Vycm9yX3VuaW5pdGlhbGl6ZV9yaW5nOgorCWFkZTc3NThfdW5pbml0aWFsaXplX3Jpbmcoc3QtPmluZGlvX2Rldi0+cmluZyk7CitlcnJvcl91bnJlZ19yaW5nX2Z1bmNzOgorCWFkZTc3NThfdW5jb25maWd1cmVfcmluZyhzdC0+aW5kaW9fZGV2KTsKK2Vycm9yX2ZyZWVfZGV2OgorCWlmIChyZWdkb25lKQorCQlpaW9fZGV2aWNlX3VucmVnaXN0ZXIoc3QtPmluZGlvX2Rldik7CisJZWxzZQorCQlpaW9fZnJlZV9kZXZpY2Uoc3QtPmluZGlvX2Rldik7CitlcnJvcl9mcmVlX3R4OgorCWtmcmVlKHN0LT50eCk7CitlcnJvcl9mcmVlX3J4OgorCWtmcmVlKHN0LT5yeCk7CitlcnJvcl9mcmVlX3N0OgorCWtmcmVlKHN0KTsKK2Vycm9yX3JldDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFkZTc3NThfcmVtb3ZlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgYWRlNzc1OF9zdGF0ZSAqc3QgPSBzcGlfZ2V0X2RydmRhdGEoc3BpKTsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gc3QtPmluZGlvX2RldjsKKworCXJldCA9IGFkZTc3NThfc3RvcF9kZXZpY2UoJihpbmRpb19kZXYtPmRldikpOworCWlmIChyZXQpCisJCWdvdG8gZXJyX3JldDsKKworCWZsdXNoX3NjaGVkdWxlZF93b3JrKCk7CisKKwlhZGU3NzU4X3JlbW92ZV90cmlnZ2VyKGluZGlvX2Rldik7CisJaWYgKHNwaS0+aXJxICYmIGdwaW9faXNfdmFsaWQoaXJxX3RvX2dwaW8oc3BpLT5pcnEpKSA+IDApCisJCWlpb191bnJlZ2lzdGVyX2ludGVycnVwdF9saW5lKGluZGlvX2RldiwgMCk7CisKKwlhZGU3NzU4X3VuaW5pdGlhbGl6ZV9yaW5nKGluZGlvX2Rldi0+cmluZyk7CisJaWlvX2RldmljZV91bnJlZ2lzdGVyKGluZGlvX2Rldik7CisJYWRlNzc1OF91bmNvbmZpZ3VyZV9yaW5nKGluZGlvX2Rldik7CisJa2ZyZWUoc3QtPnR4KTsKKwlrZnJlZShzdC0+cngpOworCWtmcmVlKHN0KTsKKworCXJldHVybiAwOworCitlcnJfcmV0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3BpX2RyaXZlciBhZGU3NzU4X2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJhZGU3NzU4IiwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJfSwKKwkucHJvYmUgPSBhZGU3NzU4X3Byb2JlLAorCS5yZW1vdmUgPSBfX2RldmV4aXRfcChhZGU3NzU4X3JlbW92ZSksCit9OworCitzdGF0aWMgX19pbml0IGludCBhZGU3NzU4X2luaXQodm9pZCkKK3sKKwlyZXR1cm4gc3BpX3JlZ2lzdGVyX2RyaXZlcigmYWRlNzc1OF9kcml2ZXIpOworfQorbW9kdWxlX2luaXQoYWRlNzc1OF9pbml0KTsKKworc3RhdGljIF9fZXhpdCB2b2lkIGFkZTc3NThfZXhpdCh2b2lkKQoreworCXNwaV91bnJlZ2lzdGVyX2RyaXZlcigmYWRlNzc1OF9kcml2ZXIpOworfQorbW9kdWxlX2V4aXQoYWRlNzc1OF9leGl0KTsKKworTU9EVUxFX0FVVEhPUigiQmFycnkgU29uZyA8MjFjbmJhb0BnbWFpbC5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkFuYWxvZyBEZXZpY2VzIEFERTc3NTggUG9seXBoYXNlIE11bHRpZnVuY3Rpb24gRW5lcmd5IE1ldGVyaW5nIElDIERyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9tZXRlci9hZGU3NzU4X3JpbmcuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vbWV0ZXIvYWRlNzc1OF9yaW5nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjc0YjRhMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vbWV0ZXIvYWRlNzc1OF9yaW5nLmMKQEAgLTAsMCArMSwyMTIgQEAKKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorCisjaW5jbHVkZSAiLi4vaWlvLmgiCisjaW5jbHVkZSAiLi4vc3lzZnMuaCIKKyNpbmNsdWRlICIuLi9yaW5nX3N3LmgiCisjaW5jbHVkZSAiLi4vYWNjZWwvYWNjZWwuaCIKKyNpbmNsdWRlICIuLi90cmlnZ2VyLmgiCisjaW5jbHVkZSAiYWRlNzc1OC5oIgorCisvKioKKyAqIGNvbWJpbmVfOF90b18zMigpIHV0aWxpdHkgZnVuY3Rpb24gdG8gbXVuZ2UgdG8gdThzIGludG8gdTMyCisgKiovCitzdGF0aWMgaW5saW5lIHUzMiBjb21iaW5lXzhfdG9fMzIodTggbG93ZXIsIHU4IG1pZCwgdTggdXBwZXIpCit7CisJdTMyIF9sb3dlciA9IGxvd2VyOworCXUzMiBfbWlkID0gbWlkOworCXUzMiBfdXBwZXIgPSB1cHBlcjsKKworCXJldHVybiBfbG93ZXIgfCAoX21pZCA8PCA4KSB8IChfdXBwZXIgPDwgMTYpOworfQorCitzdGF0aWMgSUlPX1NDQU5fRUxfQyh3Zm9ybSwgQURFNzc1OF9TQ0FOX1dGT1JNLCBBREU3NzU4X1dGT1JNLCBOVUxMKTsKK3N0YXRpYyBJSU9fQ09OU1RfQVRUUl9TQ0FOX0VMX1RZUEUod2Zvcm0sIHMsIDI0LCAzMik7CitzdGF0aWMgSUlPX1NDQU5fRUxfVElNRVNUQU1QKDEpOworc3RhdGljIElJT19DT05TVF9BVFRSX1NDQU5fRUxfVFlQRSh0aW1lc3RhbXAsIHMsIDY0LCA2NCk7CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICphZGU3NzU4X3NjYW5fZWxfYXR0cnNbXSA9IHsKKwkmaWlvX3NjYW5fZWxfd2Zvcm0uZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2NvbnN0X2F0dHJfd2Zvcm1faW5kZXguZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2NvbnN0X2F0dHJfd2Zvcm1fdHlwZS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fc2Nhbl9lbF90aW1lc3RhbXAuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2NvbnN0X2F0dHJfdGltZXN0YW1wX2luZGV4LmRldl9hdHRyLmF0dHIsCisJJmlpb19jb25zdF9hdHRyX3RpbWVzdGFtcF90eXBlLmRldl9hdHRyLmF0dHIsCisJTlVMTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGFkZTc3NThfc2Nhbl9lbF9ncm91cCA9IHsKKwkuYXR0cnMgPSBhZGU3NzU4X3NjYW5fZWxfYXR0cnMsCisJLm5hbWUgPSAic2Nhbl9lbGVtZW50cyIsCit9OworCisvKioKKyAqIGFkZTc3NThfcG9sbF9mdW5jX3RoKCkgdG9wIGhhbGYgaW50ZXJydXB0IGhhbmRsZXIgY2FsbGVkIGJ5IHRyaWdnZXIKKyAqIEBwcml2YXRlX2RhdGE6CWlpb19kZXYKKyAqKi8KK3N0YXRpYyB2b2lkIGFkZTc3NThfcG9sbF9mdW5jX3RoKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsIHM2NCB0aW1lKQoreworCXN0cnVjdCBhZGU3NzU4X3N0YXRlICpzdCA9IGlpb19kZXZfZ2V0X2RldmRhdGEoaW5kaW9fZGV2KTsKKwlzdC0+bGFzdF90aW1lc3RhbXAgPSB0aW1lOworCXNjaGVkdWxlX3dvcmsoJnN0LT53b3JrX3RyaWdnZXJfdG9fcmluZyk7CisJLyogSW5kaWNhdGUgdGhhdCB0aGlzIGludGVycnVwdCBpcyBiZWluZyBoYW5kbGVkICovCisKKwkvKiBUZWNobmljYWxseSB0aGlzIGlzIHRyaWdnZXIgcmVsYXRlZCwgYnV0IHdpdGhvdXQgdGhpcworCSAqIGhhbmRsZXIgcnVubmluZyB0aGVyZSBpcyBjdXJyZW50bHkgbm8gd2F5IGZvciB0aGUgaW50ZXJydXB0CisJICogdG8gY2xlYXIuCisJICovCit9CisKKy8qKgorICogYWRlNzc1OF9zcGlfcmVhZF9idXJzdCgpIC0gcmVhZCBhbGwgZGF0YSByZWdpc3RlcnMKKyAqIEBkZXY6IGRldmljZSBhc3NvY2lhdGVkIHdpdGggY2hpbGQgb2YgYWN0dWFsIGRldmljZSAoaWlvX2RldiBvciBpaW9fdHJpZykKKyAqIEByeDogc29tZXdoZXJlIHRvIHBhc3MgYmFjayB0aGUgdmFsdWUgcmVhZCAobWluIHNpemUgaXMgMjQgYnl0ZXMpCisgKiovCitzdGF0aWMgaW50IGFkZTc3NThfc3BpX3JlYWRfYnVyc3Qoc3RydWN0IGRldmljZSAqZGV2LCB1OCAqcngpCit7CisJc3RydWN0IHNwaV9tZXNzYWdlIG1zZzsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkZTc3NThfc3RhdGUgKnN0ID0gaWlvX2Rldl9nZXRfZGV2ZGF0YShpbmRpb19kZXYpOworCWludCByZXQ7CisKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyIHhmZXJzW10gPSB7CisJCXsKKwkJCS50eF9idWYgPSBzdC0+dHgsCisJCQkucnhfYnVmID0gcngsCisJCQkuYml0c19wZXJfd29yZCA9IDgsCisJCQkubGVuID0gNCwKKwkJfSwgeworCQkJLnR4X2J1ZiA9IHN0LT50eCArIDQsCisJCQkucnhfYnVmID0gcngsCisJCQkuYml0c19wZXJfd29yZCA9IDgsCisJCQkubGVuID0gNCwKKwkJfSwKKwl9OworCisJbXV0ZXhfbG9jaygmc3QtPmJ1Zl9sb2NrKTsKKwlzdC0+dHhbMF0gPSBBREU3NzU4X1JFQURfUkVHKEFERTc3NThfUlNUQVRVUyk7CisJc3QtPnR4WzFdID0gMDsKKwlzdC0+dHhbMl0gPSAwOworCXN0LT50eFszXSA9IDA7CisJc3QtPnR4WzRdID0gQURFNzc1OF9SRUFEX1JFRyhBREU3NzU4X1dGT1JNKTsKKwlzdC0+dHhbNV0gPSAwOworCXN0LT50eFs2XSA9IDA7CisJc3QtPnR4WzddID0gMDsKKworCXNwaV9tZXNzYWdlX2luaXQoJm1zZyk7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnhmZXJzWzBdLCAmbXNnKTsKKwlzcGlfbWVzc2FnZV9hZGRfdGFpbCgmeGZlcnNbMV0sICZtc2cpOworCXJldCA9IHNwaV9zeW5jKHN0LT51cywgJm1zZyk7CisJaWYgKHJldCkKKwkJZGV2X2Vycigmc3QtPnVzLT5kZXYsICJwcm9ibGVtIHdoZW4gcmVhZGluZyBXRk9STSB2YWx1ZVxuIik7CisKKwltdXRleF91bmxvY2soJnN0LT5idWZfbG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKiBXaGlsc3QgdGhpcyBtYWtlcyBhIGxvdCBvZiBjYWxscyB0byBpaW9fc3dfcmluZyBmdW5jdGlvbnMgLSBpdCBpcyB0byBkZXZpY2UKKyAqIHNwZWNpZmljIHRvIGJlIHJvbGxlZCBpbnRvIHRoZSBjb3JlLgorICovCitzdGF0aWMgdm9pZCBhZGU3NzU4X3RyaWdnZXJfYmhfdG9fcmluZyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmtfcykKK3sKKwlzdHJ1Y3QgYWRlNzc1OF9zdGF0ZSAqc3QKKwkJPSBjb250YWluZXJfb2Yod29ya19zLCBzdHJ1Y3QgYWRlNzc1OF9zdGF0ZSwKKwkJCSAgICAgICB3b3JrX3RyaWdnZXJfdG9fcmluZyk7CisJc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqcmluZyA9IHN0LT5pbmRpb19kZXYtPnJpbmc7CisKKwlpbnQgaSA9IDA7CisJczMyICpkYXRhOworCXNpemVfdCBkYXRhc2l6ZSA9IHJpbmctPmFjY2Vzcy5nZXRfYnl0ZXNfcGVyX2RhdHVtKHJpbmcpOworCisJZGF0YSA9IGttYWxsb2MoZGF0YXNpemUsIEdGUF9LRVJORUwpOworCWlmIChkYXRhID09IE5VTEwpIHsKKwkJZGV2X2Vycigmc3QtPnVzLT5kZXYsICJtZW1vcnkgYWxsb2MgZmFpbGVkIGluIHJpbmcgYmgiKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChyaW5nLT5zY2FuX2NvdW50KQorCQlpZiAoYWRlNzc1OF9zcGlfcmVhZF9idXJzdCgmc3QtPmluZGlvX2Rldi0+ZGV2LCBzdC0+cngpID49IDApCisJCQlmb3IgKDsgaSA8IHJpbmctPnNjYW5fY291bnQ7IGkrKykKKwkJCQlkYXRhW2ldID0gY29tYmluZV84X3RvXzMyKHN0LT5yeFtpKjIrMl0sCisJCQkJCQlzdC0+cnhbaSoyKzFdLAorCQkJCQkJc3QtPnJ4W2kqMl0pOworCisJLyogR3VhcmFudGVlZCB0byBiZSBhbGlnbmVkIHdpdGggOCBieXRlIGJvdW5kYXJ5ICovCisJaWYgKHJpbmctPnNjYW5fdGltZXN0YW1wKQorCQkqKChzNjQgKikKKwkJKCgodTMyKWRhdGEgKyA0ICogcmluZy0+c2Nhbl9jb3VudCArIDQpICYgfjB4NykpID0KKwkJCXN0LT5sYXN0X3RpbWVzdGFtcDsKKworCXJpbmctPmFjY2Vzcy5zdG9yZV90byhyaW5nLAorCQkJICAgICAgKHU4ICopZGF0YSwKKwkJCSAgICAgIHN0LT5sYXN0X3RpbWVzdGFtcCk7CisKKwlpaW9fdHJpZ2dlcl9ub3RpZnlfZG9uZShzdC0+aW5kaW9fZGV2LT50cmlnKTsKKwlrZnJlZShkYXRhKTsKKworCXJldHVybjsKK30KKwordm9pZCBhZGU3NzU4X3VuY29uZmlndXJlX3Jpbmcoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKK3sKKwlrZnJlZShpbmRpb19kZXYtPnBvbGxmdW5jKTsKKwlpaW9fc3dfcmJfZnJlZShpbmRpb19kZXYtPnJpbmcpOworfQorCitpbnQgYWRlNzc1OF9jb25maWd1cmVfcmluZyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQoreworCWludCByZXQgPSAwOworCXN0cnVjdCBhZGU3NzU4X3N0YXRlICpzdCA9IGluZGlvX2Rldi0+ZGV2X2RhdGE7CisJc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqcmluZzsKKwlJTklUX1dPUksoJnN0LT53b3JrX3RyaWdnZXJfdG9fcmluZywgYWRlNzc1OF90cmlnZ2VyX2JoX3RvX3JpbmcpOworCisJcmluZyA9IGlpb19zd19yYl9hbGxvY2F0ZShpbmRpb19kZXYpOworCWlmICghcmluZykgeworCQlyZXQgPSAtRU5PTUVNOworCQlyZXR1cm4gcmV0OworCX0KKwlpbmRpb19kZXYtPnJpbmcgPSByaW5nOworCS8qIEVmZmVjdGl2ZWx5IHNlbGVjdCB0aGUgcmluZyBidWZmZXIgaW1wbGVtZW50YXRpb24gKi8KKwlpaW9fcmluZ19zd19yZWdpc3Rlcl9mdW5jcygmcmluZy0+YWNjZXNzKTsKKwlyaW5nLT5icGUgPSA0OworCXJpbmctPnNjYW5fZWxfYXR0cnMgPSAmYWRlNzc1OF9zY2FuX2VsX2dyb3VwOworCXJpbmctPnNjYW5fdGltZXN0YW1wID0gdHJ1ZTsKKwlyaW5nLT5wcmVlbmFibGUgPSAmaWlvX3N3X3JpbmdfcHJlZW5hYmxlOworCXJpbmctPnBvc3RlbmFibGUgPSAmaWlvX3RyaWdnZXJlZF9yaW5nX3Bvc3RlbmFibGU7CisJcmluZy0+cHJlZGlzYWJsZSA9ICZpaW9fdHJpZ2dlcmVkX3JpbmdfcHJlZGlzYWJsZTsKKwlyaW5nLT5vd25lciA9IFRISVNfTU9EVUxFOworCisJLyogU2V0IGRlZmF1bHQgc2NhbiBtb2RlICovCisJaWlvX3NjYW5fbWFza19zZXQocmluZywgaWlvX3NjYW5fZWxfd2Zvcm0ubnVtYmVyKTsKKworCXJldCA9IGlpb19hbGxvY19wb2xsZnVuYyhpbmRpb19kZXYsIE5VTEwsICZhZGU3NzU4X3BvbGxfZnVuY190aCk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9paW9fc3dfcmJfZnJlZTsKKworCWluZGlvX2Rldi0+bW9kZXMgfD0gSU5ESU9fUklOR19UUklHR0VSRUQ7CisJcmV0dXJuIDA7CisKK2Vycm9yX2lpb19zd19yYl9mcmVlOgorCWlpb19zd19yYl9mcmVlKGluZGlvX2Rldi0+cmluZyk7CisJcmV0dXJuIHJldDsKK30KKworaW50IGFkZTc3NThfaW5pdGlhbGl6ZV9yaW5nKHN0cnVjdCBpaW9fcmluZ19idWZmZXIgKnJpbmcpCit7CisJcmV0dXJuIGlpb19yaW5nX2J1ZmZlcl9yZWdpc3RlcihyaW5nLCAwKTsKK30KKwordm9pZCBhZGU3NzU4X3VuaW5pdGlhbGl6ZV9yaW5nKHN0cnVjdCBpaW9fcmluZ19idWZmZXIgKnJpbmcpCit7CisJaWlvX3JpbmdfYnVmZmVyX3VucmVnaXN0ZXIocmluZyk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL21ldGVyL2FkZTc3NThfdHJpZ2dlci5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9tZXRlci9hZGU3NzU4X3RyaWdnZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MGFiY2EwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9tZXRlci9hZGU3NzU4X3RyaWdnZXIuYwpAQCAtMCwwICsxLDEyNSBAQAorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorCisjaW5jbHVkZSAiLi4vaWlvLmgiCisjaW5jbHVkZSAiLi4vc3lzZnMuaCIKKyNpbmNsdWRlICIuLi90cmlnZ2VyLmgiCisjaW5jbHVkZSAiYWRlNzc1OC5oIgorCisvKioKKyAqIGFkZTc3NThfZGF0YV9yZHlfdHJpZ19wb2xsKCkgdGhlIGV2ZW50IGhhbmRsZXIgZm9yIHRoZSBkYXRhIHJkeSB0cmlnCisgKiovCitzdGF0aWMgaW50IGFkZTc3NThfZGF0YV9yZHlfdHJpZ19wb2xsKHN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbywKKwkJCQkgICAgICAgaW50IGluZGV4LAorCQkJCSAgICAgICBzNjQgdGltZXN0YW1wLAorCQkJCSAgICAgICBpbnQgbm9fdGVzdCkKK3sKKwlzdHJ1Y3QgYWRlNzc1OF9zdGF0ZSAqc3QgPSBpaW9fZGV2X2dldF9kZXZkYXRhKGRldl9pbmZvKTsKKwlzdHJ1Y3QgaWlvX3RyaWdnZXIgKnRyaWcgPSBzdC0+dHJpZzsKKworCWlpb190cmlnZ2VyX3BvbGwodHJpZywgdGltZXN0YW1wKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworSUlPX0VWRU5UX1NIKGRhdGFfcmR5X3RyaWcsICZhZGU3NzU4X2RhdGFfcmR5X3RyaWdfcG9sbCk7CisKK3N0YXRpYyBERVZJQ0VfQVRUUihuYW1lLCBTX0lSVUdPLCBpaW9fdHJpZ2dlcl9yZWFkX25hbWUsIE5VTEwpOworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqYWRlNzc1OF90cmlnZ2VyX2F0dHJzW10gPSB7CisJJmRldl9hdHRyX25hbWUuYXR0ciwKKwlOVUxMLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgYWRlNzc1OF90cmlnZ2VyX2F0dHJfZ3JvdXAgPSB7CisJLmF0dHJzID0gYWRlNzc1OF90cmlnZ2VyX2F0dHJzLAorfTsKKworLyoqCisgKiBhZGU3NzU4X2RhdGFfcmR5X3RyaWdnZXJfc2V0X3N0YXRlKCkgc2V0IGRhdGFyZHkgaW50ZXJydXB0IHN0YXRlCisgKiovCitzdGF0aWMgaW50IGFkZTc3NThfZGF0YV9yZHlfdHJpZ2dlcl9zZXRfc3RhdGUoc3RydWN0IGlpb190cmlnZ2VyICp0cmlnLAorCQkJCQkJYm9vbCBzdGF0ZSkKK3sKKwlzdHJ1Y3QgYWRlNzc1OF9zdGF0ZSAqc3QgPSB0cmlnLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IHN0LT5pbmRpb19kZXY7CisJaW50IHJldCA9IDA7CisKKwlkZXZfZGJnKCZpbmRpb19kZXYtPmRldiwgIiVzICglZClcbiIsIF9fZnVuY19fLCBzdGF0ZSk7CisJcmV0ID0gYWRlNzc1OF9zZXRfaXJxKCZzdC0+aW5kaW9fZGV2LT5kZXYsIHN0YXRlKTsKKwlpZiAoc3RhdGUgPT0gZmFsc2UpIHsKKwkJaWlvX3JlbW92ZV9ldmVudF9mcm9tX2xpc3QoJmlpb19ldmVudF9kYXRhX3JkeV90cmlnLAorCQkJCQkgICAmaW5kaW9fZGV2LT5pbnRlcnJ1cHRzWzBdCisJCQkJCSAgIC0+ZXZfbGlzdCk7CisJCS8qIHBvc3NpYmxlIHF1aXJrIHdpdGggaGFuZGxlciBjdXJyZW50bHkgd29ya2VkIGFyb3VuZAorCQkgICBieSBlbnN1cmluZyB0aGUgd29yayBxdWV1ZSBpcyBlbXB0eSAqLworCQlmbHVzaF9zY2hlZHVsZWRfd29yaygpOworCX0gZWxzZSB7CisJCWlpb19hZGRfZXZlbnRfdG9fbGlzdCgmaWlvX2V2ZW50X2RhdGFfcmR5X3RyaWcsCisJCQkJICAgICAgJmluZGlvX2Rldi0+aW50ZXJydXB0c1swXS0+ZXZfbGlzdCk7CisJfQorCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogYWRlNzc1OF90cmlnX3RyeV9yZWVuKCkgdHJ5IHJlbmFibGluZyBpcnEgZm9yIGRhdGEgcmR5IHRyaWdnZXIKKyAqIEB0cmlnOgl0aGUgZGF0YXJkeSB0cmlnZ2VyCisgKiovCitzdGF0aWMgaW50IGFkZTc3NThfdHJpZ190cnlfcmVlbihzdHJ1Y3QgaWlvX3RyaWdnZXIgKnRyaWcpCit7CisJc3RydWN0IGFkZTc3NThfc3RhdGUgKnN0ID0gdHJpZy0+cHJpdmF0ZV9kYXRhOworCWVuYWJsZV9pcnEoc3QtPnVzLT5pcnEpOworCS8qIGlycSByZWVuYWJsZWQgc28gc3VjY2VzcyEgKi8KKwlyZXR1cm4gMDsKK30KKworaW50IGFkZTc3NThfcHJvYmVfdHJpZ2dlcihzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQoreworCWludCByZXQ7CisJc3RydWN0IGFkZTc3NThfc3RhdGUgKnN0ID0gaW5kaW9fZGV2LT5kZXZfZGF0YTsKKworCXN0LT50cmlnID0gaWlvX2FsbG9jYXRlX3RyaWdnZXIoKTsKKwlzdC0+dHJpZy0+bmFtZSA9IGthc3ByaW50ZihHRlBfS0VSTkVMLAorCQkJCSJhZGU3NzU4LWRldiVkIiwKKwkJCQlpbmRpb19kZXYtPmlkKTsKKwlpZiAoIXN0LT50cmlnLT5uYW1lKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3JfZnJlZV90cmlnOworCX0KKwlzdC0+dHJpZy0+ZGV2LnBhcmVudCA9ICZzdC0+dXMtPmRldjsKKwlzdC0+dHJpZy0+b3duZXIgPSBUSElTX01PRFVMRTsKKwlzdC0+dHJpZy0+cHJpdmF0ZV9kYXRhID0gc3Q7CisJc3QtPnRyaWctPnNldF90cmlnZ2VyX3N0YXRlID0gJmFkZTc3NThfZGF0YV9yZHlfdHJpZ2dlcl9zZXRfc3RhdGU7CisJc3QtPnRyaWctPnRyeV9yZWVuYWJsZSA9ICZhZGU3NzU4X3RyaWdfdHJ5X3JlZW47CisJc3QtPnRyaWctPmNvbnRyb2xfYXR0cnMgPSAmYWRlNzc1OF90cmlnZ2VyX2F0dHJfZ3JvdXA7CisJcmV0ID0gaWlvX3RyaWdnZXJfcmVnaXN0ZXIoc3QtPnRyaWcpOworCisJLyogc2VsZWN0IGRlZmF1bHQgdHJpZ2dlciAqLworCWluZGlvX2Rldi0+dHJpZyA9IHN0LT50cmlnOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfZnJlZV90cmlnX25hbWU7CisKKwlyZXR1cm4gMDsKKworZXJyb3JfZnJlZV90cmlnX25hbWU6CisJa2ZyZWUoc3QtPnRyaWctPm5hbWUpOworZXJyb3JfZnJlZV90cmlnOgorCWlpb19mcmVlX3RyaWdnZXIoc3QtPnRyaWcpOworCisJcmV0dXJuIHJldDsKK30KKwordm9pZCBhZGU3NzU4X3JlbW92ZV90cmlnZ2VyKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCit7CisJc3RydWN0IGFkZTc3NThfc3RhdGUgKnN0YXRlID0gaW5kaW9fZGV2LT5kZXZfZGF0YTsKKworCWlpb190cmlnZ2VyX3VucmVnaXN0ZXIoc3RhdGUtPnRyaWcpOworCWtmcmVlKHN0YXRlLT50cmlnLT5uYW1lKTsKKwlpaW9fZnJlZV90cmlnZ2VyKHN0YXRlLT50cmlnKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vbWV0ZXIvYWRlNzc1OS5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9tZXRlci9hZGU3NzU5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmFmYzNjMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vbWV0ZXIvYWRlNzc1OS5jCkBAIC0wLDAgKzEsNjcwIEBACisvKgorICogQURFNzc1OSBBY3RpdmUgRW5lcmd5IE1ldGVyaW5nIElDIHdpdGggZGkvZHQgU2Vuc29yIEludGVyZmFjZSBEcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgMjAxMCBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisKKyNpbmNsdWRlICIuLi9paW8uaCIKKyNpbmNsdWRlICIuLi9zeXNmcy5oIgorI2luY2x1ZGUgIm1ldGVyLmgiCisjaW5jbHVkZSAiYWRlNzc1OS5oIgorCitpbnQgYWRlNzc1OV9zcGlfd3JpdGVfcmVnXzgoc3RydWN0IGRldmljZSAqZGV2LAorCQl1OCByZWdfYWRkcmVzcywKKwkJdTggdmFsKQoreworCWludCByZXQ7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZGU3NzU5X3N0YXRlICpzdCA9IGlpb19kZXZfZ2V0X2RldmRhdGEoaW5kaW9fZGV2KTsKKworCW11dGV4X2xvY2soJnN0LT5idWZfbG9jayk7CisJc3QtPnR4WzBdID0gQURFNzc1OV9XUklURV9SRUcocmVnX2FkZHJlc3MpOworCXN0LT50eFsxXSA9IHZhbDsKKworCXJldCA9IHNwaV93cml0ZShzdC0+dXMsIHN0LT50eCwgMik7CisJbXV0ZXhfdW5sb2NrKCZzdC0+YnVmX2xvY2spOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhZGU3NzU5X3NwaV93cml0ZV9yZWdfMTYoc3RydWN0IGRldmljZSAqZGV2LAorCQl1OCByZWdfYWRkcmVzcywKKwkJdTE2IHZhbHVlKQoreworCWludCByZXQ7CisJc3RydWN0IHNwaV9tZXNzYWdlIG1zZzsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkZTc3NTlfc3RhdGUgKnN0ID0gaWlvX2Rldl9nZXRfZGV2ZGF0YShpbmRpb19kZXYpOworCXN0cnVjdCBzcGlfdHJhbnNmZXIgeGZlcnNbXSA9IHsKKwkJeworCQkJLnR4X2J1ZiA9IHN0LT50eCwKKwkJCS5iaXRzX3Blcl93b3JkID0gOCwKKwkJCS5sZW4gPSAzLAorCQl9CisJfTsKKworCW11dGV4X2xvY2soJnN0LT5idWZfbG9jayk7CisJc3QtPnR4WzBdID0gQURFNzc1OV9XUklURV9SRUcocmVnX2FkZHJlc3MpOworCXN0LT50eFsxXSA9ICh2YWx1ZSA+PiA4KSAmIDB4RkY7CisJc3QtPnR4WzJdID0gdmFsdWUgJiAweEZGOworCisJc3BpX21lc3NhZ2VfaW5pdCgmbXNnKTsKKwlzcGlfbWVzc2FnZV9hZGRfdGFpbCh4ZmVycywgJm1zZyk7CisJcmV0ID0gc3BpX3N5bmMoc3QtPnVzLCAmbXNnKTsKKwltdXRleF91bmxvY2soJnN0LT5idWZfbG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFkZTc3NTlfc3BpX3JlYWRfcmVnXzgoc3RydWN0IGRldmljZSAqZGV2LAorCQl1OCByZWdfYWRkcmVzcywKKwkJdTggKnZhbCkKK3sKKwlzdHJ1Y3Qgc3BpX21lc3NhZ2UgbXNnOworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWRlNzc1OV9zdGF0ZSAqc3QgPSBpaW9fZGV2X2dldF9kZXZkYXRhKGluZGlvX2Rldik7CisJaW50IHJldDsKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyIHhmZXJzW10gPSB7CisJCXsKKwkJCS50eF9idWYgPSBzdC0+dHgsCisJCQkucnhfYnVmID0gc3QtPnJ4LAorCQkJLmJpdHNfcGVyX3dvcmQgPSA4LAorCQkJLmxlbiA9IDIsCisJCX0sCisJfTsKKworCW11dGV4X2xvY2soJnN0LT5idWZfbG9jayk7CisJc3QtPnR4WzBdID0gQURFNzc1OV9SRUFEX1JFRyhyZWdfYWRkcmVzcyk7CisJc3QtPnR4WzFdID0gMDsKKworCXNwaV9tZXNzYWdlX2luaXQoJm1zZyk7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoeGZlcnMsICZtc2cpOworCXJldCA9IHNwaV9zeW5jKHN0LT51cywgJm1zZyk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZzdC0+dXMtPmRldiwgInByb2JsZW0gd2hlbiByZWFkaW5nIDggYml0IHJlZ2lzdGVyIDB4JTAyWCIsCisJCQkJcmVnX2FkZHJlc3MpOworCQlnb3RvIGVycm9yX3JldDsKKwl9CisJKnZhbCA9IHN0LT5yeFsxXTsKKworZXJyb3JfcmV0OgorCW11dGV4X3VubG9jaygmc3QtPmJ1Zl9sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFkZTc3NTlfc3BpX3JlYWRfcmVnXzE2KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJdTggcmVnX2FkZHJlc3MsCisJCXUxNiAqdmFsKQoreworCXN0cnVjdCBzcGlfbWVzc2FnZSBtc2c7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZGU3NzU5X3N0YXRlICpzdCA9IGlpb19kZXZfZ2V0X2RldmRhdGEoaW5kaW9fZGV2KTsKKwlpbnQgcmV0OworCXN0cnVjdCBzcGlfdHJhbnNmZXIgeGZlcnNbXSA9IHsKKwkJeworCQkJLnR4X2J1ZiA9IHN0LT50eCwKKwkJCS5yeF9idWYgPSBzdC0+cngsCisJCQkuYml0c19wZXJfd29yZCA9IDgsCisJCQkubGVuID0gMywKKwkJfSwKKwl9OworCisJbXV0ZXhfbG9jaygmc3QtPmJ1Zl9sb2NrKTsKKwlzdC0+dHhbMF0gPSBBREU3NzU5X1JFQURfUkVHKHJlZ19hZGRyZXNzKTsKKwlzdC0+dHhbMV0gPSAwOworCXN0LT50eFsyXSA9IDA7CisKKwlzcGlfbWVzc2FnZV9pbml0KCZtc2cpOworCXNwaV9tZXNzYWdlX2FkZF90YWlsKHhmZXJzLCAmbXNnKTsKKwlyZXQgPSBzcGlfc3luYyhzdC0+dXMsICZtc2cpOworCWlmIChyZXQpIHsKKwkJZGV2X2Vycigmc3QtPnVzLT5kZXYsICJwcm9ibGVtIHdoZW4gcmVhZGluZyAxNiBiaXQgcmVnaXN0ZXIgMHglMDJYIiwKKwkJCQlyZWdfYWRkcmVzcyk7CisJCWdvdG8gZXJyb3JfcmV0OworCX0KKwkqdmFsID0gKHN0LT5yeFsxXSA8PCA4KSB8IHN0LT5yeFsyXTsKKworZXJyb3JfcmV0OgorCW11dGV4X3VubG9jaygmc3QtPmJ1Zl9sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFkZTc3NTlfc3BpX3JlYWRfcmVnXzQwKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJdTggcmVnX2FkZHJlc3MsCisJCXU2NCAqdmFsKQoreworCXN0cnVjdCBzcGlfbWVzc2FnZSBtc2c7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZGU3NzU5X3N0YXRlICpzdCA9IGlpb19kZXZfZ2V0X2RldmRhdGEoaW5kaW9fZGV2KTsKKwlpbnQgcmV0OworCXN0cnVjdCBzcGlfdHJhbnNmZXIgeGZlcnNbXSA9IHsKKwkJeworCQkJLnR4X2J1ZiA9IHN0LT50eCwKKwkJCS5yeF9idWYgPSBzdC0+cngsCisJCQkuYml0c19wZXJfd29yZCA9IDgsCisJCQkubGVuID0gNiwKKwkJfSwKKwl9OworCisJbXV0ZXhfbG9jaygmc3QtPmJ1Zl9sb2NrKTsKKwlzdC0+dHhbMF0gPSBBREU3NzU5X1JFQURfUkVHKHJlZ19hZGRyZXNzKTsKKwltZW1zZXQoJnN0LT50eFsxXSwgMCAsIDUpOworCisJc3BpX21lc3NhZ2VfaW5pdCgmbXNnKTsKKwlzcGlfbWVzc2FnZV9hZGRfdGFpbCh4ZmVycywgJm1zZyk7CisJcmV0ID0gc3BpX3N5bmMoc3QtPnVzLCAmbXNnKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJnN0LT51cy0+ZGV2LCAicHJvYmxlbSB3aGVuIHJlYWRpbmcgNDAgYml0IHJlZ2lzdGVyIDB4JTAyWCIsCisJCQkJcmVnX2FkZHJlc3MpOworCQlnb3RvIGVycm9yX3JldDsKKwl9CisJKnZhbCA9ICgodTY0KXN0LT5yeFsxXSA8PCAzMikgfCAoc3QtPnJ4WzJdIDw8IDI0KSB8CisJCShzdC0+cnhbM10gPDwgMTYpIHwgKHN0LT5yeFs0XSA8PCA4KSB8IHN0LT5yeFs1XTsKKworZXJyb3JfcmV0OgorCW11dGV4X3VubG9jaygmc3QtPmJ1Zl9sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3NpemVfdCBhZGU3NzU5X3JlYWRfOGJpdChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJaW50IHJldDsKKwl1OCB2YWwgPSAwOworCXN0cnVjdCBpaW9fZGV2X2F0dHIgKnRoaXNfYXR0ciA9IHRvX2lpb19kZXZfYXR0cihhdHRyKTsKKworCXJldCA9IGFkZTc3NTlfc3BpX3JlYWRfcmVnXzgoZGV2LCB0aGlzX2F0dHItPmFkZHJlc3MsICZ2YWwpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgdmFsKTsKK30KKworc3RhdGljIHNzaXplX3QgYWRlNzc1OV9yZWFkXzE2Yml0KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlpbnQgcmV0OworCXUxNiB2YWwgPSAwOworCXN0cnVjdCBpaW9fZGV2X2F0dHIgKnRoaXNfYXR0ciA9IHRvX2lpb19kZXZfYXR0cihhdHRyKTsKKworCXJldCA9IGFkZTc3NTlfc3BpX3JlYWRfcmVnXzE2KGRldiwgdGhpc19hdHRyLT5hZGRyZXNzLCAmdmFsKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIHZhbCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkZTc3NTlfcmVhZF80MGJpdChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJaW50IHJldDsKKwl1NjQgdmFsID0gMDsKKwlzdHJ1Y3QgaWlvX2Rldl9hdHRyICp0aGlzX2F0dHIgPSB0b19paW9fZGV2X2F0dHIoYXR0cik7CisKKwlyZXQgPSBhZGU3NzU5X3NwaV9yZWFkX3JlZ180MChkZXYsIHRoaXNfYXR0ci0+YWRkcmVzcywgJnZhbCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVsbHVcbiIsIHZhbCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkZTc3NTlfd3JpdGVfOGJpdChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBsZW4pCit7CisJc3RydWN0IGlpb19kZXZfYXR0ciAqdGhpc19hdHRyID0gdG9faWlvX2Rldl9hdHRyKGF0dHIpOworCWludCByZXQ7CisJbG9uZyB2YWw7CisKKwlyZXQgPSBzdHJpY3Rfc3RydG9sKGJ1ZiwgMTAsICZ2YWwpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfcmV0OworCXJldCA9IGFkZTc3NTlfc3BpX3dyaXRlX3JlZ184KGRldiwgdGhpc19hdHRyLT5hZGRyZXNzLCB2YWwpOworCitlcnJvcl9yZXQ6CisJcmV0dXJuIHJldCA/IHJldCA6IGxlbjsKK30KKworc3RhdGljIHNzaXplX3QgYWRlNzc1OV93cml0ZV8xNmJpdChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBsZW4pCit7CisJc3RydWN0IGlpb19kZXZfYXR0ciAqdGhpc19hdHRyID0gdG9faWlvX2Rldl9hdHRyKGF0dHIpOworCWludCByZXQ7CisJbG9uZyB2YWw7CisKKwlyZXQgPSBzdHJpY3Rfc3RydG9sKGJ1ZiwgMTAsICZ2YWwpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfcmV0OworCXJldCA9IGFkZTc3NTlfc3BpX3dyaXRlX3JlZ18xNihkZXYsIHRoaXNfYXR0ci0+YWRkcmVzcywgdmFsKTsKKworZXJyb3JfcmV0OgorCXJldHVybiByZXQgPyByZXQgOiBsZW47Cit9CisKK3N0YXRpYyBpbnQgYWRlNzc1OV9yZXNldChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJaW50IHJldDsKKwl1MTYgdmFsOworCWFkZTc3NTlfc3BpX3JlYWRfcmVnXzE2KGRldiwKKwkJCUFERTc3NTlfTU9ERSwKKwkJCSZ2YWwpOworCXZhbCB8PSAxIDw8IDY7IC8qIFNvZnR3YXJlIENoaXAgUmVzZXQgKi8KKwlyZXQgPSBhZGU3NzU5X3NwaV93cml0ZV9yZWdfMTYoZGV2LAorCQkJQURFNzc1OV9NT0RFLAorCQkJdmFsKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkZTc3NTlfd3JpdGVfcmVzZXQoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgbGVuKQoreworCWlmIChsZW4gPCAxKQorCQlyZXR1cm4gLTE7CisJc3dpdGNoIChidWZbMF0pIHsKKwljYXNlICcxJzoKKwljYXNlICd5JzoKKwljYXNlICdZJzoKKwkJcmV0dXJuIGFkZTc3NTlfcmVzZXQoZGV2KTsKKwl9CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgSUlPX0RFVl9BVFRSX0FFTkVSR1koYWRlNzc1OV9yZWFkXzQwYml0LCBBREU3NzU5X0FFTkVSR1kpOworc3RhdGljIElJT19ERVZfQVRUUl9DRkRFTihTX0lXVVNSIHwgU19JUlVHTywKKwkJYWRlNzc1OV9yZWFkXzE2Yml0LAorCQlhZGU3NzU5X3dyaXRlXzE2Yml0LAorCQlBREU3NzU5X0NGREVOKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfQ0ZOVU0oU19JV1VTUiB8IFNfSVJVR08sCisJCWFkZTc3NTlfcmVhZF84Yml0LAorCQlhZGU3NzU5X3dyaXRlXzhiaXQsCisJCUFERTc3NTlfQ0ZOVU0pOworc3RhdGljIElJT19ERVZfQVRUUl9DSEtTVU0oYWRlNzc1OV9yZWFkXzhiaXQsIEFERTc3NTlfQ0hLU1VNKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfUEhDQUwoU19JV1VTUiB8IFNfSVJVR08sCisJCWFkZTc3NTlfcmVhZF8xNmJpdCwKKwkJYWRlNzc1OV93cml0ZV8xNmJpdCwKKwkJQURFNzc1OV9QSENBTCk7CitzdGF0aWMgSUlPX0RFVl9BVFRSX0FQT1MoU19JV1VTUiB8IFNfSVJVR08sCisJCWFkZTc3NTlfcmVhZF8xNmJpdCwKKwkJYWRlNzc1OV93cml0ZV8xNmJpdCwKKwkJQURFNzc1OV9BUE9TKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfU0FHQ1lDKFNfSVdVU1IgfCBTX0lSVUdPLAorCQlhZGU3NzU5X3JlYWRfOGJpdCwKKwkJYWRlNzc1OV93cml0ZV84Yml0LAorCQlBREU3NzU5X1NBR0NZQyk7CitzdGF0aWMgSUlPX0RFVl9BVFRSX1NBR0xWTChTX0lXVVNSIHwgU19JUlVHTywKKwkJYWRlNzc1OV9yZWFkXzhiaXQsCisJCWFkZTc3NTlfd3JpdGVfOGJpdCwKKwkJQURFNzc1OV9TQUdMVkwpOworc3RhdGljIElJT19ERVZfQVRUUl9MSU5FQ1lDKFNfSVdVU1IgfCBTX0lSVUdPLAorCQlhZGU3NzU5X3JlYWRfOGJpdCwKKwkJYWRlNzc1OV93cml0ZV84Yml0LAorCQlBREU3NzU5X0xJTkVDWUMpOworc3RhdGljIElJT19ERVZfQVRUUl9MRU5FUkdZKGFkZTc3NTlfcmVhZF80MGJpdCwgQURFNzc1OV9MRU5FUkdZKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfUEdBX0dBSU4oU19JV1VTUiB8IFNfSVJVR08sCisJCWFkZTc3NTlfcmVhZF84Yml0LAorCQlhZGU3NzU5X3dyaXRlXzhiaXQsCisJCUFERTc3NTlfR0FJTik7CitzdGF0aWMgSUlPX0RFVl9BVFRSX0FDVElWRV9QT1dFUl9HQUlOKFNfSVdVU1IgfCBTX0lSVUdPLAorCQlhZGU3NzU5X3JlYWRfMTZiaXQsCisJCWFkZTc3NTlfd3JpdGVfMTZiaXQsCisJCUFERTc3NTlfQVBHQUlOKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfQ0hfT0ZGKDEsIFNfSVdVU1IgfCBTX0lSVUdPLAorCQlhZGU3NzU5X3JlYWRfOGJpdCwKKwkJYWRlNzc1OV93cml0ZV84Yml0LAorCQlBREU3NzU5X0NIMU9TKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfQ0hfT0ZGKDIsIFNfSVdVU1IgfCBTX0lSVUdPLAorCQlhZGU3NzU5X3JlYWRfOGJpdCwKKwkJYWRlNzc1OV93cml0ZV84Yml0LAorCQlBREU3NzU5X0NIMk9TKTsKKworc3RhdGljIGludCBhZGU3NzU5X3NldF9pcnEoc3RydWN0IGRldmljZSAqZGV2LCBib29sIGVuYWJsZSkKK3sKKwlpbnQgcmV0OworCXU4IGlycWVuOworCXJldCA9IGFkZTc3NTlfc3BpX3JlYWRfcmVnXzgoZGV2LCBBREU3NzU5X0lSUUVOLCAmaXJxZW4pOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfcmV0OworCisJaWYgKGVuYWJsZSkKKwkJaXJxZW4gfD0gMSA8PCAzOyAvKiBFbmFibGVzIGFuIGludGVycnVwdCB3aGVuIGEgZGF0YSBpcworCQkJCSAgICBwcmVzZW50IGluIHRoZSB3YXZlZm9ybSByZWdpc3RlciAqLworCWVsc2UKKwkJaXJxZW4gJj0gfigxIDw8IDMpOworCisJcmV0ID0gYWRlNzc1OV9zcGlfd3JpdGVfcmVnXzgoZGV2LCBBREU3NzU5X0lSUUVOLCBpcnFlbik7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9yZXQ7CisKK2Vycm9yX3JldDoKKwlyZXR1cm4gcmV0OworfQorCisvKiBQb3dlciBkb3duIHRoZSBkZXZpY2UgKi8KK2ludCBhZGU3NzU5X3N0b3BfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlpbnQgcmV0OworCXUxNiB2YWw7CisJYWRlNzc1OV9zcGlfcmVhZF9yZWdfMTYoZGV2LAorCQkJQURFNzc1OV9NT0RFLAorCQkJJnZhbCk7CisJdmFsIHw9IDEgPDwgNDsgIC8qIEFEIGNvbnZlcnRlcnMgY2FuIGJlIHR1cm5lZCBvZmYgKi8KKwlyZXQgPSBhZGU3NzU5X3NwaV93cml0ZV9yZWdfMTYoZGV2LAorCQkJQURFNzc1OV9NT0RFLAorCQkJdmFsKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYWRlNzc1OV9pbml0aWFsX3NldHVwKHN0cnVjdCBhZGU3NzU5X3N0YXRlICpzdCkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZzdC0+aW5kaW9fZGV2LT5kZXY7CisKKwkvKiB1c2UgbG93IHNwaSBzcGVlZCBmb3IgaW5pdCAqLworCXN0LT51cy0+bW9kZSA9IFNQSV9NT0RFXzM7CisJc3BpX3NldHVwKHN0LT51cyk7CisKKwkvKiBEaXNhYmxlIElSUSAqLworCXJldCA9IGFkZTc3NTlfc2V0X2lycShkZXYsIGZhbHNlKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoZGV2LCAiZGlzYWJsZSBpcnEgZmFpbGVkIik7CisJCWdvdG8gZXJyX3JldDsKKwl9CisKKwlhZGU3NzU5X3Jlc2V0KGRldik7CisJbXNsZWVwKEFERTc3NTlfU1RBUlRVUF9ERUxBWSk7CisKK2Vycl9yZXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QgYWRlNzc1OV9yZWFkX2ZyZXF1ZW5jeShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJaW50IHJldCwgbGVuID0gMDsKKwl1MTYgdDsKKwlpbnQgc3BzOworCXJldCA9IGFkZTc3NTlfc3BpX3JlYWRfcmVnXzE2KGRldiwKKwkJCUFERTc3NTlfTU9ERSwKKwkJCSZ0KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJdCA9ICh0ID4+IDMpICYgMHgzOworCXNwcyA9IDI3OTAwIC8gKDEgKyB0KTsKKworCWxlbiA9IHNwcmludGYoYnVmLCAiJWQgU1BTXG4iLCBzcHMpOworCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkZTc3NTlfd3JpdGVfZnJlcXVlbmN5KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkZTc3NTlfc3RhdGUgKnN0ID0gaWlvX2Rldl9nZXRfZGV2ZGF0YShpbmRpb19kZXYpOworCXVuc2lnbmVkIGxvbmcgdmFsOworCWludCByZXQ7CisJdTE2IHJlZywgdDsKKworCXJldCA9IHN0cmljdF9zdHJ0b2woYnVmLCAxMCwgJnZhbCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCW11dGV4X2xvY2soJmluZGlvX2Rldi0+bWxvY2spOworCisJdCA9ICgyNzkwMCAvIHZhbCk7CisJaWYgKHQgPiAwKQorCQl0LS07CisKKwlpZiAodCA+IDEpCisJCXN0LT51cy0+bWF4X3NwZWVkX2h6ID0gQURFNzc1OV9TUElfU0xPVzsKKwllbHNlCisJCXN0LT51cy0+bWF4X3NwZWVkX2h6ID0gQURFNzc1OV9TUElfRkFTVDsKKworCXJldCA9IGFkZTc3NTlfc3BpX3JlYWRfcmVnXzE2KGRldiwKKwkJCUFERTc3NTlfTU9ERSwKKwkJCSZyZWcpOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCisJcmVnICY9IH4oMyA8PCAxMyk7CisJcmVnIHw9IHQgPDwgMTM7CisKKwlyZXQgPSBhZGU3NzU5X3NwaV93cml0ZV9yZWdfMTYoZGV2LAorCQkJQURFNzc1OV9NT0RFLAorCQkJcmVnKTsKKworb3V0OgorCW11dGV4X3VubG9jaygmaW5kaW9fZGV2LT5tbG9jayk7CisKKwlyZXR1cm4gcmV0ID8gcmV0IDogbGVuOworfQorc3RhdGljIElJT19ERVZfQVRUUl9URU1QX1JBVyhhZGU3NzU5X3JlYWRfOGJpdCk7CitzdGF0aWMgSUlPX0NPTlNUX0FUVFIodGVtcF9vZmZzZXQsICI3MCBDIik7CitzdGF0aWMgSUlPX0NPTlNUX0FUVFIodGVtcF9zY2FsZSwgIjEgQyIpOworCitzdGF0aWMgSUlPX0RFVl9BVFRSX1NBTVBfRlJFUShTX0lXVVNSIHwgU19JUlVHTywKKwkJYWRlNzc1OV9yZWFkX2ZyZXF1ZW5jeSwKKwkJYWRlNzc1OV93cml0ZV9mcmVxdWVuY3kpOworCitzdGF0aWMgSUlPX0RFVl9BVFRSX1JFU0VUKGFkZTc3NTlfd3JpdGVfcmVzZXQpOworCitzdGF0aWMgSUlPX0NPTlNUX0FUVFJfU0FNUF9GUkVRX0FWQUlMKCIyNzkwMCAxNDAwMCA3MDAwIDM1MDAiKTsKKworc3RhdGljIElJT19DT05TVF9BVFRSKG5hbWUsICJhZGU3NzU5Iik7CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICphZGU3NzU5X2V2ZW50X2F0dHJpYnV0ZXNbXSA9IHsKKwlOVUxMCit9OworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBhZGU3NzU5X2V2ZW50X2F0dHJpYnV0ZV9ncm91cCA9IHsKKwkuYXR0cnMgPSBhZGU3NzU5X2V2ZW50X2F0dHJpYnV0ZXMsCit9OworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqYWRlNzc1OV9hdHRyaWJ1dGVzW10gPSB7CisJJmlpb19kZXZfYXR0cl90ZW1wX3Jhdy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fY29uc3RfYXR0cl90ZW1wX29mZnNldC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fY29uc3RfYXR0cl90ZW1wX3NjYWxlLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9zYW1wbGluZ19mcmVxdWVuY3kuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2NvbnN0X2F0dHJfc2FtcGxpbmdfZnJlcXVlbmN5X2F2YWlsYWJsZS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfcmVzZXQuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2NvbnN0X2F0dHJfbmFtZS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfcGhjYWwuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2NmZGVuLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9hZW5lcmd5LmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9jZm51bS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfYXBvcy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfc2FnY3ljLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9zYWdsdmwuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2xpbmVjeWMuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2xlbmVyZ3kuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2Noa3N1bS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfcGdhX2dhaW4uZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2FjdGl2ZV9wb3dlcl9nYWluLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9jaG9mZl8xLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9jaG9mZl8yLmRldl9hdHRyLmF0dHIsCisJTlVMTCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGFkZTc3NTlfYXR0cmlidXRlX2dyb3VwID0geworCS5hdHRycyA9IGFkZTc3NTlfYXR0cmlidXRlcywKK307CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGFkZTc3NTlfcHJvYmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlpbnQgcmV0LCByZWdkb25lID0gMDsKKwlzdHJ1Y3QgYWRlNzc1OV9zdGF0ZSAqc3QgPSBremFsbG9jKHNpemVvZiAqc3QsIEdGUF9LRVJORUwpOworCWlmICghc3QpIHsKKwkJcmV0ID0gIC1FTk9NRU07CisJCWdvdG8gZXJyb3JfcmV0OworCX0KKwkvKiB0aGlzIGlzIG9ubHkgdXNlZCBmb3IgcmVtb3ZhbCBwdXJwb3NlcyAqLworCXNwaV9zZXRfZHJ2ZGF0YShzcGksIHN0KTsKKworCS8qIEFsbG9jYXRlIHRoZSBjb21tcyBidWZmZXJzICovCisJc3QtPnJ4ID0ga3phbGxvYyhzaXplb2YoKnN0LT5yeCkqQURFNzc1OV9NQVhfUlgsIEdGUF9LRVJORUwpOworCWlmIChzdC0+cnggPT0gTlVMTCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycm9yX2ZyZWVfc3Q7CisJfQorCXN0LT50eCA9IGt6YWxsb2Moc2l6ZW9mKCpzdC0+dHgpKkFERTc3NTlfTUFYX1RYLCBHRlBfS0VSTkVMKTsKKwlpZiAoc3QtPnR4ID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJvcl9mcmVlX3J4OworCX0KKwlzdC0+dXMgPSBzcGk7CisJbXV0ZXhfaW5pdCgmc3QtPmJ1Zl9sb2NrKTsKKwkvKiBzZXR1cCB0aGUgaW5kdXN0cmlhbGlvIGRyaXZlciBhbGxvY2F0ZWQgZWxlbWVudHMgKi8KKwlzdC0+aW5kaW9fZGV2ID0gaWlvX2FsbG9jYXRlX2RldmljZSgpOworCWlmIChzdC0+aW5kaW9fZGV2ID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJvcl9mcmVlX3R4OworCX0KKworCXN0LT5pbmRpb19kZXYtPmRldi5wYXJlbnQgPSAmc3BpLT5kZXY7CisJc3QtPmluZGlvX2Rldi0+bnVtX2ludGVycnVwdF9saW5lcyA9IDE7CisJc3QtPmluZGlvX2Rldi0+ZXZlbnRfYXR0cnMgPSAmYWRlNzc1OV9ldmVudF9hdHRyaWJ1dGVfZ3JvdXA7CisJc3QtPmluZGlvX2Rldi0+YXR0cnMgPSAmYWRlNzc1OV9hdHRyaWJ1dGVfZ3JvdXA7CisJc3QtPmluZGlvX2Rldi0+ZGV2X2RhdGEgPSAodm9pZCAqKShzdCk7CisJc3QtPmluZGlvX2Rldi0+ZHJpdmVyX21vZHVsZSA9IFRISVNfTU9EVUxFOworCXN0LT5pbmRpb19kZXYtPm1vZGVzID0gSU5ESU9fRElSRUNUX01PREU7CisKKwlyZXQgPSBhZGU3NzU5X2NvbmZpZ3VyZV9yaW5nKHN0LT5pbmRpb19kZXYpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfZnJlZV9kZXY7CisKKwlyZXQgPSBpaW9fZGV2aWNlX3JlZ2lzdGVyKHN0LT5pbmRpb19kZXYpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfdW5yZWdfcmluZ19mdW5jczsKKwlyZWdkb25lID0gMTsKKworCXJldCA9IGFkZTc3NTlfaW5pdGlhbGl6ZV9yaW5nKHN0LT5pbmRpb19kZXYtPnJpbmcpOworCWlmIChyZXQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJmYWlsZWQgdG8gaW5pdGlhbGl6ZSB0aGUgcmluZ1xuIik7CisJCWdvdG8gZXJyb3JfdW5yZWdfcmluZ19mdW5jczsKKwl9CisKKwlpZiAoc3BpLT5pcnEpIHsKKwkJcmV0ID0gaWlvX3JlZ2lzdGVyX2ludGVycnVwdF9saW5lKHNwaS0+aXJxLAorCQkJCXN0LT5pbmRpb19kZXYsCisJCQkJMCwKKwkJCQlJUlFGX1RSSUdHRVJfRkFMTElORywKKwkJCQkiYWRlNzc1OSIpOworCQlpZiAocmV0KQorCQkJZ290byBlcnJvcl91bmluaXRpYWxpemVfcmluZzsKKworCQlyZXQgPSBhZGU3NzU5X3Byb2JlX3RyaWdnZXIoc3QtPmluZGlvX2Rldik7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycm9yX3VucmVnaXN0ZXJfbGluZTsKKwl9CisKKwkvKiBHZXQgdGhlIGRldmljZSBpbnRvIGEgc2FuZSBpbml0aWFsIHN0YXRlICovCisJcmV0ID0gYWRlNzc1OV9pbml0aWFsX3NldHVwKHN0KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3JlbW92ZV90cmlnZ2VyOworCXJldHVybiAwOworCitlcnJvcl9yZW1vdmVfdHJpZ2dlcjoKKwlpZiAoc3QtPmluZGlvX2Rldi0+bW9kZXMgJiBJTkRJT19SSU5HX1RSSUdHRVJFRCkKKwkJYWRlNzc1OV9yZW1vdmVfdHJpZ2dlcihzdC0+aW5kaW9fZGV2KTsKK2Vycm9yX3VucmVnaXN0ZXJfbGluZToKKwlpZiAoc3QtPmluZGlvX2Rldi0+bW9kZXMgJiBJTkRJT19SSU5HX1RSSUdHRVJFRCkKKwkJaWlvX3VucmVnaXN0ZXJfaW50ZXJydXB0X2xpbmUoc3QtPmluZGlvX2RldiwgMCk7CitlcnJvcl91bmluaXRpYWxpemVfcmluZzoKKwlhZGU3NzU5X3VuaW5pdGlhbGl6ZV9yaW5nKHN0LT5pbmRpb19kZXYtPnJpbmcpOworZXJyb3JfdW5yZWdfcmluZ19mdW5jczoKKwlhZGU3NzU5X3VuY29uZmlndXJlX3Jpbmcoc3QtPmluZGlvX2Rldik7CitlcnJvcl9mcmVlX2RldjoKKwlpZiAocmVnZG9uZSkKKwkJaWlvX2RldmljZV91bnJlZ2lzdGVyKHN0LT5pbmRpb19kZXYpOworCWVsc2UKKwkJaWlvX2ZyZWVfZGV2aWNlKHN0LT5pbmRpb19kZXYpOworZXJyb3JfZnJlZV90eDoKKwlrZnJlZShzdC0+dHgpOworZXJyb3JfZnJlZV9yeDoKKwlrZnJlZShzdC0+cngpOworZXJyb3JfZnJlZV9zdDoKKwlrZnJlZShzdCk7CitlcnJvcl9yZXQ6CisJcmV0dXJuIHJldDsKK30KKworLyogZml4bWUsIGNvbmZpcm0gb3JkZXJpbmcgaW4gdGhpcyBmdW5jdGlvbiAqLworc3RhdGljIGludCBhZGU3NzU5X3JlbW92ZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCWludCByZXQ7CisJc3RydWN0IGFkZTc3NTlfc3RhdGUgKnN0ID0gc3BpX2dldF9kcnZkYXRhKHNwaSk7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IHN0LT5pbmRpb19kZXY7CisKKwlyZXQgPSBhZGU3NzU5X3N0b3BfZGV2aWNlKCYoaW5kaW9fZGV2LT5kZXYpKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl9yZXQ7CisKKwlmbHVzaF9zY2hlZHVsZWRfd29yaygpOworCisJYWRlNzc1OV9yZW1vdmVfdHJpZ2dlcihpbmRpb19kZXYpOworCWlmIChzcGktPmlycSAmJiBncGlvX2lzX3ZhbGlkKGlycV90b19ncGlvKHNwaS0+aXJxKSkgPiAwKQorCQlpaW9fdW5yZWdpc3Rlcl9pbnRlcnJ1cHRfbGluZShpbmRpb19kZXYsIDApOworCisJYWRlNzc1OV91bmluaXRpYWxpemVfcmluZyhpbmRpb19kZXYtPnJpbmcpOworCWFkZTc3NTlfdW5jb25maWd1cmVfcmluZyhpbmRpb19kZXYpOworCWlpb19kZXZpY2VfdW5yZWdpc3RlcihpbmRpb19kZXYpOworCWtmcmVlKHN0LT50eCk7CisJa2ZyZWUoc3QtPnJ4KTsKKwlrZnJlZShzdCk7CisKKwlyZXR1cm4gMDsKKworZXJyX3JldDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3RydWN0IHNwaV9kcml2ZXIgYWRlNzc1OV9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAiYWRlNzc1OSIsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCX0sCisJLnByb2JlID0gYWRlNzc1OV9wcm9iZSwKKwkucmVtb3ZlID0gX19kZXZleGl0X3AoYWRlNzc1OV9yZW1vdmUpLAorfTsKKworc3RhdGljIF9faW5pdCBpbnQgYWRlNzc1OV9pbml0KHZvaWQpCit7CisJcmV0dXJuIHNwaV9yZWdpc3Rlcl9kcml2ZXIoJmFkZTc3NTlfZHJpdmVyKTsKK30KK21vZHVsZV9pbml0KGFkZTc3NTlfaW5pdCk7CisKK3N0YXRpYyBfX2V4aXQgdm9pZCBhZGU3NzU5X2V4aXQodm9pZCkKK3sKKwlzcGlfdW5yZWdpc3Rlcl9kcml2ZXIoJmFkZTc3NTlfZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KGFkZTc3NTlfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIkJhcnJ5IFNvbmcgPDIxY25iYW9AZ21haWwuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJBbmFsb2cgRGV2aWNlcyBBREU3NzU5IEFjdGl2ZSBFbmVyZ3kgTWV0ZXJpbmcgSUMgRHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL21ldGVyL2FkZTc3NTkuaCBiL2RyaXZlcnMvc3RhZ2luZy9paW8vbWV0ZXIvYWRlNzc1OS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxM2RlYTIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL21ldGVyL2FkZTc3NTkuaApAQCAtMCwwICsxLDEyMiBAQAorI2lmbmRlZiBfQURFNzc1OV9ICisjZGVmaW5lIF9BREU3NzU5X0gKKworI2RlZmluZSBBREU3NzU5X1dBVkVGT1JNICAweDAxCisjZGVmaW5lIEFERTc3NTlfQUVORVJHWSAgIDB4MDIKKyNkZWZpbmUgQURFNzc1OV9SU1RFTkVSR1kgMHgwMworI2RlZmluZSBBREU3NzU5X1NUQVRVUyAgICAweDA0CisjZGVmaW5lIEFERTc3NTlfUlNUU1RBVFVTIDB4MDUKKyNkZWZpbmUgQURFNzc1OV9NT0RFICAgICAgMHgwNgorI2RlZmluZSBBREU3NzU5X0NGREVOICAgICAweDA3CisjZGVmaW5lIEFERTc3NTlfQ0gxT1MgICAgIDB4MDgKKyNkZWZpbmUgQURFNzc1OV9DSDJPUyAgICAgMHgwOQorI2RlZmluZSBBREU3NzU5X0dBSU4gICAgICAweDBBCisjZGVmaW5lIEFERTc3NTlfQVBHQUlOICAgIDB4MEIKKyNkZWZpbmUgQURFNzc1OV9QSENBTCAgICAgMHgwQworI2RlZmluZSBBREU3NzU5X0FQT1MgICAgICAweDBECisjZGVmaW5lIEFERTc3NTlfWlhUT1VUICAgIDB4MEUKKyNkZWZpbmUgQURFNzc1OV9TQUdDWUMgICAgMHgwRgorI2RlZmluZSBBREU3NzU5X0lSUUVOICAgICAweDEwCisjZGVmaW5lIEFERTc3NTlfU0FHTFZMICAgIDB4MTEKKyNkZWZpbmUgQURFNzc1OV9URU1QICAgICAgMHgxMgorI2RlZmluZSBBREU3NzU5X0xJTkVDWUMgICAweDEzCisjZGVmaW5lIEFERTc3NTlfTEVORVJHWSAgIDB4MTQKKyNkZWZpbmUgQURFNzc1OV9DRk5VTSAgICAgMHgxNQorI2RlZmluZSBBREU3NzU5X0NIS1NVTSAgICAweDFFCisjZGVmaW5lIEFERTc3NTlfRElFUkVWICAgIDB4MUYKKworI2RlZmluZSBBREU3NzU5X1JFQURfUkVHKGEpICAgIGEKKyNkZWZpbmUgQURFNzc1OV9XUklURV9SRUcoYSkgKChhKSB8IDB4ODApCisKKyNkZWZpbmUgQURFNzc1OV9NQVhfVFggICAgNgorI2RlZmluZSBBREU3NzU5X01BWF9SWCAgICA2CisjZGVmaW5lIEFERTc3NTlfU1RBUlRVUF9ERUxBWSAxCisKKyNkZWZpbmUgQURFNzc1OV9TUElfU0xPVwkodTMyKSgzMDAgKiAxMDAwKQorI2RlZmluZSBBREU3NzU5X1NQSV9CVVJTVAkodTMyKSgxMDAwICogMTAwMCkKKyNkZWZpbmUgQURFNzc1OV9TUElfRkFTVAkodTMyKSgyMDAwICogMTAwMCkKKworI2RlZmluZSBEUklWRVJfTkFNRQkJImFkZTc3NTkiCisKKy8qKgorICogc3RydWN0IGFkZTc3NTlfc3RhdGUgLSBkZXZpY2UgaW5zdGFuY2Ugc3BlY2lmaWMgZGF0YQorICogQHVzOgkJCWFjdHVhbCBzcGlfZGV2aWNlCisgKiBAd29ya190cmlnZ2VyX3RvX3Jpbmc6IGJoIGZvciB0cmlnZ2VyZWQgZXZlbnQgaGFuZGxpbmcKKyAqIEBpbnRlcjoJCXVzZWQgdG8gY2hlY2sgaWYgbmV3IGludGVycnVwdCBoYXMgYmVlbiB0cmlnZ2VyZWQKKyAqIEBsYXN0X3RpbWVzdGFtcDoJcGFzc2luZyB0aW1lc3RhbXAgZnJvbSB0aCB0byBiaCBvZiBpbnRlcnJ1cHQgaGFuZGxlcgorICogQGluZGlvX2RldjoJCWluZHVzdHJpYWwgSS9PIGRldmljZSBzdHJ1Y3R1cmUKKyAqIEB0cmlnOgkJZGF0YSByZWFkeSB0cmlnZ2VyIHJlZ2lzdGVyZWQgd2l0aCBpaW8KKyAqIEB0eDoJCQl0cmFuc21pdCBidWZmZXIKKyAqIEByeDoJCQlyZWNpZXZlIGJ1ZmZlcgorICogQGJ1Zl9sb2NrOgkJbXV0ZXggdG8gcHJvdGVjdCB0eCBhbmQgcngKKyAqKi8KK3N0cnVjdCBhZGU3NzU5X3N0YXRlIHsKKwlzdHJ1Y3Qgc3BpX2RldmljZQkJKnVzOworCXN0cnVjdCB3b3JrX3N0cnVjdAkJd29ya190cmlnZ2VyX3RvX3Jpbmc7CisJczY0CQkJCWxhc3RfdGltZXN0YW1wOworCXN0cnVjdCBpaW9fZGV2CQkJKmluZGlvX2RldjsKKwlzdHJ1Y3QgaWlvX3RyaWdnZXIJCSp0cmlnOworCXU4CQkJCSp0eDsKKwl1OAkJCQkqcng7CisJc3RydWN0IG11dGV4CQkJYnVmX2xvY2s7Cit9OworI2lmIGRlZmluZWQoQ09ORklHX0lJT19SSU5HX0JVRkZFUikgJiYgZGVmaW5lZChUSElTX0hBU19SSU5HX0JVRkZFUl9TVVBQT1JUKQorLyogQXQgdGhlIG1vbWVudCB0cmlnZ2VycyBhcmUgb25seSB1c2VkIGZvciByaW5nIGJ1ZmZlcgorICogZmlsbGluZy4gVGhpcyBtYXkgY2hhbmdlIQorICovCisKK2VudW0gYWRlNzc1OV9zY2FuIHsKKwlBREU3NzU5X1NDQU5fQUNUSVZFX1BPV0VSLAorCUFERTc3NTlfU0NBTl9DSDFfQ0gyLAorCUFERTc3NTlfU0NBTl9DSDEsCisJQURFNzc1OV9TQ0FOX0NIMiwKK307CisKK3ZvaWQgYWRlNzc1OV9yZW1vdmVfdHJpZ2dlcihzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KTsKK2ludCBhZGU3NzU5X3Byb2JlX3RyaWdnZXIoc3RydWN0IGlpb19kZXYgKmluZGlvX2Rldik7CisKK3NzaXplX3QgYWRlNzc1OV9yZWFkX2RhdGFfZnJvbV9yaW5nKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1Zik7CisKKworaW50IGFkZTc3NTlfY29uZmlndXJlX3Jpbmcoc3RydWN0IGlpb19kZXYgKmluZGlvX2Rldik7Cit2b2lkIGFkZTc3NTlfdW5jb25maWd1cmVfcmluZyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KTsKKworaW50IGFkZTc3NTlfaW5pdGlhbGl6ZV9yaW5nKHN0cnVjdCBpaW9fcmluZ19idWZmZXIgKnJpbmcpOwordm9pZCBhZGU3NzU5X3VuaW5pdGlhbGl6ZV9yaW5nKHN0cnVjdCBpaW9fcmluZ19idWZmZXIgKnJpbmcpOworI2Vsc2UgLyogQ09ORklHX0lJT19SSU5HX0JVRkZFUiAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgYWRlNzc1OV9yZW1vdmVfdHJpZ2dlcihzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQoreworfQorc3RhdGljIGlubGluZSBpbnQgYWRlNzc1OV9wcm9iZV90cmlnZ2VyKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3NpemVfdAorYWRlNzc1OV9yZWFkX2RhdGFfZnJvbV9yaW5nKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhZGU3NzU5X2NvbmZpZ3VyZV9yaW5nKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCit7CisJcmV0dXJuIDA7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgYWRlNzc1OV91bmNvbmZpZ3VyZV9yaW5nKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCit7Cit9CitzdGF0aWMgaW5saW5lIGludCBhZGU3NzU5X2luaXRpYWxpemVfcmluZyhzdHJ1Y3QgaWlvX3JpbmdfYnVmZmVyICpyaW5nKQoreworCXJldHVybiAwOworfQorc3RhdGljIGlubGluZSB2b2lkIGFkZTc3NTlfdW5pbml0aWFsaXplX3Jpbmcoc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqcmluZykKK3sKK30KKyNlbmRpZiAvKiBDT05GSUdfSUlPX1JJTkdfQlVGRkVSICovCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9tZXRlci9hZGU3ODU0LWkyYy5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9tZXRlci9hZGU3ODU0LWkyYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1NzhlN2IKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL21ldGVyL2FkZTc4NTQtaTJjLmMKQEAgLTAsMCArMSwyNzIgQEAKKy8qCisgKiBBREU3ODU0LzU4LzY4Lzc4IFBvbHlwaGFzZSBNdWx0aWZ1bmN0aW9uIEVuZXJneSBNZXRlcmluZyBJQyBEcml2ZXIgKEkyQyBCdXMpCisgKgorICogQ29weXJpZ2h0IDIwMTAgQW5hbG9nIERldmljZXMgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorCisjaW5jbHVkZSAiLi4vaWlvLmgiCisjaW5jbHVkZSAiYWRlNzg1NC5oIgorCitzdGF0aWMgaW50IGFkZTc4NTRfaTJjX3dyaXRlX3JlZ184KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJdTE2IHJlZ19hZGRyZXNzLAorCQl1OCB2YWx1ZSkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWRlNzg1NF9zdGF0ZSAqc3QgPSBpaW9fZGV2X2dldF9kZXZkYXRhKGluZGlvX2Rldik7CisKKwltdXRleF9sb2NrKCZzdC0+YnVmX2xvY2spOworCXN0LT50eFswXSA9IChyZWdfYWRkcmVzcyA+PiA4KSAmIDB4RkY7CisJc3QtPnR4WzFdID0gcmVnX2FkZHJlc3MgJiAweEZGOworCXN0LT50eFsyXSA9IHZhbHVlOworCisJcmV0ID0gaTJjX21hc3Rlcl9zZW5kKHN0LT5pMmMsIHN0LT50eCwgMyk7CisJbXV0ZXhfdW5sb2NrKCZzdC0+YnVmX2xvY2spOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhZGU3ODU0X2kyY193cml0ZV9yZWdfMTYoc3RydWN0IGRldmljZSAqZGV2LAorCQl1MTYgcmVnX2FkZHJlc3MsCisJCXUxNiB2YWx1ZSkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWRlNzg1NF9zdGF0ZSAqc3QgPSBpaW9fZGV2X2dldF9kZXZkYXRhKGluZGlvX2Rldik7CisKKwltdXRleF9sb2NrKCZzdC0+YnVmX2xvY2spOworCXN0LT50eFswXSA9IChyZWdfYWRkcmVzcyA+PiA4KSAmIDB4RkY7CisJc3QtPnR4WzFdID0gcmVnX2FkZHJlc3MgJiAweEZGOworCXN0LT50eFsyXSA9ICh2YWx1ZSA+PiA4KSAmIDB4RkY7CisJc3QtPnR4WzNdID0gdmFsdWUgJiAweEZGOworCisJcmV0ID0gaTJjX21hc3Rlcl9zZW5kKHN0LT5pMmMsIHN0LT50eCwgNCk7CisJbXV0ZXhfdW5sb2NrKCZzdC0+YnVmX2xvY2spOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhZGU3ODU0X2kyY193cml0ZV9yZWdfMjQoc3RydWN0IGRldmljZSAqZGV2LAorCQl1MTYgcmVnX2FkZHJlc3MsCisJCXUzMiB2YWx1ZSkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWRlNzg1NF9zdGF0ZSAqc3QgPSBpaW9fZGV2X2dldF9kZXZkYXRhKGluZGlvX2Rldik7CisKKwltdXRleF9sb2NrKCZzdC0+YnVmX2xvY2spOworCXN0LT50eFswXSA9IChyZWdfYWRkcmVzcyA+PiA4KSAmIDB4RkY7CisJc3QtPnR4WzFdID0gcmVnX2FkZHJlc3MgJiAweEZGOworCXN0LT50eFsyXSA9ICh2YWx1ZSA+PiAxNikgJiAweEZGOworCXN0LT50eFszXSA9ICh2YWx1ZSA+PiA4KSAmIDB4RkY7CisJc3QtPnR4WzRdID0gdmFsdWUgJiAweEZGOworCisJcmV0ID0gaTJjX21hc3Rlcl9zZW5kKHN0LT5pMmMsIHN0LT50eCwgNSk7CisJbXV0ZXhfdW5sb2NrKCZzdC0+YnVmX2xvY2spOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhZGU3ODU0X2kyY193cml0ZV9yZWdfMzIoc3RydWN0IGRldmljZSAqZGV2LAorCQl1MTYgcmVnX2FkZHJlc3MsCisJCXUzMiB2YWx1ZSkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWRlNzg1NF9zdGF0ZSAqc3QgPSBpaW9fZGV2X2dldF9kZXZkYXRhKGluZGlvX2Rldik7CisKKwltdXRleF9sb2NrKCZzdC0+YnVmX2xvY2spOworCXN0LT50eFswXSA9IChyZWdfYWRkcmVzcyA+PiA4KSAmIDB4RkY7CisJc3QtPnR4WzFdID0gcmVnX2FkZHJlc3MgJiAweEZGOworCXN0LT50eFsyXSA9ICh2YWx1ZSA+PiAyNCkgJiAweEZGOworCXN0LT50eFszXSA9ICh2YWx1ZSA+PiAxNikgJiAweEZGOworCXN0LT50eFs0XSA9ICh2YWx1ZSA+PiA4KSAmIDB4RkY7CisJc3QtPnR4WzVdID0gdmFsdWUgJiAweEZGOworCisJcmV0ID0gaTJjX21hc3Rlcl9zZW5kKHN0LT5pMmMsIHN0LT50eCwgNik7CisJbXV0ZXhfdW5sb2NrKCZzdC0+YnVmX2xvY2spOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhZGU3ODU0X2kyY19yZWFkX3JlZ184KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJdTE2IHJlZ19hZGRyZXNzLAorCQl1OCAqdmFsKQoreworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWRlNzg1NF9zdGF0ZSAqc3QgPSBpaW9fZGV2X2dldF9kZXZkYXRhKGluZGlvX2Rldik7CisJaW50IHJldDsKKworCW11dGV4X2xvY2soJnN0LT5idWZfbG9jayk7CisJc3QtPnR4WzBdID0gKHJlZ19hZGRyZXNzID4+IDgpICYgMHhGRjsKKwlzdC0+dHhbMV0gPSByZWdfYWRkcmVzcyAmIDB4RkY7CisKKwlyZXQgPSBpMmNfbWFzdGVyX3NlbmQoc3QtPmkyYywgc3QtPnR4LCAyKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKworCXJldCA9IGkyY19tYXN0ZXJfcmVjdihzdC0+aTJjLCBzdC0+cngsIDEpOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCisJKnZhbCA9IHN0LT5yeFswXTsKK291dDoKKwltdXRleF91bmxvY2soJnN0LT5idWZfbG9jayk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhZGU3ODU0X2kyY19yZWFkX3JlZ18xNihzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXUxNiByZWdfYWRkcmVzcywKKwkJdTE2ICp2YWwpCit7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZGU3ODU0X3N0YXRlICpzdCA9IGlpb19kZXZfZ2V0X2RldmRhdGEoaW5kaW9fZGV2KTsKKwlpbnQgcmV0OworCisJbXV0ZXhfbG9jaygmc3QtPmJ1Zl9sb2NrKTsKKwlzdC0+dHhbMF0gPSAocmVnX2FkZHJlc3MgPj4gOCkgJiAweEZGOworCXN0LT50eFsxXSA9IHJlZ19hZGRyZXNzICYgMHhGRjsKKworCXJldCA9IGkyY19tYXN0ZXJfc2VuZChzdC0+aTJjLCBzdC0+dHgsIDIpOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCisJcmV0ID0gaTJjX21hc3Rlcl9yZWN2KHN0LT5pMmMsIHN0LT5yeCwgMik7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisKKwkqdmFsID0gKHN0LT5yeFswXSA8PCA4KSB8IHN0LT5yeFsxXTsKK291dDoKKwltdXRleF91bmxvY2soJnN0LT5idWZfbG9jayk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhZGU3ODU0X2kyY19yZWFkX3JlZ18yNChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXUxNiByZWdfYWRkcmVzcywKKwkJdTMyICp2YWwpCit7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZGU3ODU0X3N0YXRlICpzdCA9IGlpb19kZXZfZ2V0X2RldmRhdGEoaW5kaW9fZGV2KTsKKwlpbnQgcmV0OworCisJbXV0ZXhfbG9jaygmc3QtPmJ1Zl9sb2NrKTsKKwlzdC0+dHhbMF0gPSAocmVnX2FkZHJlc3MgPj4gOCkgJiAweEZGOworCXN0LT50eFsxXSA9IHJlZ19hZGRyZXNzICYgMHhGRjsKKworCXJldCA9IGkyY19tYXN0ZXJfc2VuZChzdC0+aTJjLCBzdC0+dHgsIDIpOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCisJcmV0ID0gaTJjX21hc3Rlcl9yZWN2KHN0LT5pMmMsIHN0LT5yeCwgMyk7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisKKwkqdmFsID0gKHN0LT5yeFswXSA8PCAxNikgfCAoc3QtPnJ4WzFdIDw8IDgpIHwgc3QtPnJ4WzJdOworb3V0OgorCW11dGV4X3VubG9jaygmc3QtPmJ1Zl9sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFkZTc4NTRfaTJjX3JlYWRfcmVnXzMyKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJdTE2IHJlZ19hZGRyZXNzLAorCQl1MzIgKnZhbCkKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkZTc4NTRfc3RhdGUgKnN0ID0gaWlvX2Rldl9nZXRfZGV2ZGF0YShpbmRpb19kZXYpOworCWludCByZXQ7CisKKwltdXRleF9sb2NrKCZzdC0+YnVmX2xvY2spOworCXN0LT50eFswXSA9IChyZWdfYWRkcmVzcyA+PiA4KSAmIDB4RkY7CisJc3QtPnR4WzFdID0gcmVnX2FkZHJlc3MgJiAweEZGOworCisJcmV0ID0gaTJjX21hc3Rlcl9zZW5kKHN0LT5pMmMsIHN0LT50eCwgMik7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisKKwlyZXQgPSBpMmNfbWFzdGVyX3JlY3Yoc3QtPmkyYywgc3QtPnJ4LCAzKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKworCSp2YWwgPSAoc3QtPnJ4WzBdIDw8IDI0KSB8IChzdC0+cnhbMV0gPDwgMTYpIHwgKHN0LT5yeFsyXSA8PCA4KSB8IHN0LT5yeFszXTsKK291dDoKKwltdXRleF91bmxvY2soJnN0LT5idWZfbG9jayk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgYWRlNzg1NF9pMmNfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKKwkJY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQoreworCWludCByZXQ7CisJc3RydWN0IGFkZTc4NTRfc3RhdGUgKnN0ID0ga3phbGxvYyhzaXplb2YgKnN0LCBHRlBfS0VSTkVMKTsKKwlpZiAoIXN0KSB7CisJCXJldCA9ICAtRU5PTUVNOworCQlyZXR1cm4gcmV0OworCX0KKworCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIHN0KTsKKwlzdC0+cmVhZF9yZWdfOCA9IGFkZTc4NTRfaTJjX3JlYWRfcmVnXzg7CisJc3QtPnJlYWRfcmVnXzE2ID0gYWRlNzg1NF9pMmNfcmVhZF9yZWdfMTY7CisJc3QtPnJlYWRfcmVnXzI0ID0gYWRlNzg1NF9pMmNfcmVhZF9yZWdfMjQ7CisJc3QtPnJlYWRfcmVnXzMyID0gYWRlNzg1NF9pMmNfcmVhZF9yZWdfMzI7CisJc3QtPndyaXRlX3JlZ184ID0gYWRlNzg1NF9pMmNfd3JpdGVfcmVnXzg7CisJc3QtPndyaXRlX3JlZ18xNiA9IGFkZTc4NTRfaTJjX3dyaXRlX3JlZ18xNjsKKwlzdC0+d3JpdGVfcmVnXzI0ID0gYWRlNzg1NF9pMmNfd3JpdGVfcmVnXzI0OworCXN0LT53cml0ZV9yZWdfMzIgPSBhZGU3ODU0X2kyY193cml0ZV9yZWdfMzI7CisJc3QtPmkyYyA9IGNsaWVudDsKKwlzdC0+aXJxID0gY2xpZW50LT5pcnE7CisKKwlyZXQgPSBhZGU3ODU0X3Byb2JlKHN0LCAmY2xpZW50LT5kZXYpOworCWlmIChyZXQpIHsKKwkJa2ZyZWUoc3QpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IGFkZTc4NTRfaTJjX3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXJldHVybiBhZGU3ODU0X3JlbW92ZShpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KSk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCBhZGU3ODU0X2lkW10gPSB7CisJeyAiYWRlNzg1NCIsIDAgfSwKKwl7ICJhZGU3ODU4IiwgMCB9LAorCXsgImFkZTc4NjgiLCAwIH0sCisJeyAiYWRlNzg3OCIsIDAgfSwKKwl7IH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgYWRlNzg1NF9pZCk7CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBhZGU3ODU0X2kyY19kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAiYWRlNzg1NCIsCisJfSwKKwkucHJvYmUgICAgPSBhZGU3ODU0X2kyY19wcm9iZSwKKwkucmVtb3ZlICAgPSBfX2RldmV4aXRfcChhZGU3ODU0X2kyY19yZW1vdmUpLAorCS5pZF90YWJsZSA9IGFkZTc4NTRfaWQsCit9OworCitzdGF0aWMgX19pbml0IGludCBhZGU3ODU0X2kyY19pbml0KHZvaWQpCit7CisJcmV0dXJuIGkyY19hZGRfZHJpdmVyKCZhZGU3ODU0X2kyY19kcml2ZXIpOworfQorbW9kdWxlX2luaXQoYWRlNzg1NF9pMmNfaW5pdCk7CisKK3N0YXRpYyBfX2V4aXQgdm9pZCBhZGU3ODU0X2kyY19leGl0KHZvaWQpCit7CisJaTJjX2RlbF9kcml2ZXIoJmFkZTc4NTRfaTJjX2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdChhZGU3ODU0X2kyY19leGl0KTsKKworCitNT0RVTEVfQVVUSE9SKCJCYXJyeSBTb25nIDwyMWNuYmFvQGdtYWlsLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiQW5hbG9nIERldmljZXMgQURFNzg1NC81OC82OC83OCBQb2x5cGhhc2UgTXVsdGlmdW5jdGlvbiBFbmVyZ3kgTWV0ZXJpbmcgSUMgSTJDIERyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9tZXRlci9hZGU3ODU0LXNwaS5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9tZXRlci9hZGU3ODU0LXNwaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlNTgxMDNlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9tZXRlci9hZGU3ODU0LXNwaS5jCkBAIC0wLDAgKzEsMzYwIEBACisvKgorICogQURFNzg1NC81OC82OC83OCBQb2x5cGhhc2UgTXVsdGlmdW5jdGlvbiBFbmVyZ3kgTWV0ZXJpbmcgSUMgRHJpdmVyIChTUEkgQnVzKQorICoKKyAqIENvcHlyaWdodCAyMDEwIEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisKKyNpbmNsdWRlICIuLi9paW8uaCIKKyNpbmNsdWRlICJhZGU3ODU0LmgiCisKK3N0YXRpYyBpbnQgYWRlNzg1NF9zcGlfd3JpdGVfcmVnXzgoc3RydWN0IGRldmljZSAqZGV2LAorCQl1MTYgcmVnX2FkZHJlc3MsCisJCXU4IHZhbHVlKQoreworCWludCByZXQ7CisJc3RydWN0IHNwaV9tZXNzYWdlIG1zZzsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkZTc4NTRfc3RhdGUgKnN0ID0gaWlvX2Rldl9nZXRfZGV2ZGF0YShpbmRpb19kZXYpOworCXN0cnVjdCBzcGlfdHJhbnNmZXIgeGZlcnNbXSA9IHsKKwkJeworCQkJLnR4X2J1ZiA9IHN0LT50eCwKKwkJCS5iaXRzX3Blcl93b3JkID0gOCwKKwkJCS5sZW4gPSA0LAorCQl9CisJfTsKKworCW11dGV4X2xvY2soJnN0LT5idWZfbG9jayk7CisJc3QtPnR4WzBdID0gQURFNzg1NF9XUklURV9SRUc7CisJc3QtPnR4WzFdID0gKHJlZ19hZGRyZXNzID4+IDgpICYgMHhGRjsKKwlzdC0+dHhbMl0gPSByZWdfYWRkcmVzcyAmIDB4RkY7CisJc3QtPnR4WzNdID0gdmFsdWUgJiAweEZGOworCisJc3BpX21lc3NhZ2VfaW5pdCgmbXNnKTsKKwlzcGlfbWVzc2FnZV9hZGRfdGFpbCh4ZmVycywgJm1zZyk7CisJcmV0ID0gc3BpX3N5bmMoc3QtPnNwaSwgJm1zZyk7CisJbXV0ZXhfdW5sb2NrKCZzdC0+YnVmX2xvY2spOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhZGU3ODU0X3NwaV93cml0ZV9yZWdfMTYoc3RydWN0IGRldmljZSAqZGV2LAorCQl1MTYgcmVnX2FkZHJlc3MsCisJCXUxNiB2YWx1ZSkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBzcGlfbWVzc2FnZSBtc2c7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZGU3ODU0X3N0YXRlICpzdCA9IGlpb19kZXZfZ2V0X2RldmRhdGEoaW5kaW9fZGV2KTsKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyIHhmZXJzW10gPSB7CisJCXsKKwkJCS50eF9idWYgPSBzdC0+dHgsCisJCQkuYml0c19wZXJfd29yZCA9IDgsCisJCQkubGVuID0gNSwKKwkJfQorCX07CisKKwltdXRleF9sb2NrKCZzdC0+YnVmX2xvY2spOworCXN0LT50eFswXSA9IEFERTc4NTRfV1JJVEVfUkVHOworCXN0LT50eFsxXSA9IChyZWdfYWRkcmVzcyA+PiA4KSAmIDB4RkY7CisJc3QtPnR4WzJdID0gcmVnX2FkZHJlc3MgJiAweEZGOworCXN0LT50eFszXSA9ICh2YWx1ZSA+PiA4KSAmIDB4RkY7CisJc3QtPnR4WzRdID0gdmFsdWUgJiAweEZGOworCisJc3BpX21lc3NhZ2VfaW5pdCgmbXNnKTsKKwlzcGlfbWVzc2FnZV9hZGRfdGFpbCh4ZmVycywgJm1zZyk7CisJcmV0ID0gc3BpX3N5bmMoc3QtPnNwaSwgJm1zZyk7CisJbXV0ZXhfdW5sb2NrKCZzdC0+YnVmX2xvY2spOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhZGU3ODU0X3NwaV93cml0ZV9yZWdfMjQoc3RydWN0IGRldmljZSAqZGV2LAorCQl1MTYgcmVnX2FkZHJlc3MsCisJCXUzMiB2YWx1ZSkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBzcGlfbWVzc2FnZSBtc2c7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZGU3ODU0X3N0YXRlICpzdCA9IGlpb19kZXZfZ2V0X2RldmRhdGEoaW5kaW9fZGV2KTsKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyIHhmZXJzW10gPSB7CisJCXsKKwkJCS50eF9idWYgPSBzdC0+dHgsCisJCQkuYml0c19wZXJfd29yZCA9IDgsCisJCQkubGVuID0gNiwKKwkJfQorCX07CisKKwltdXRleF9sb2NrKCZzdC0+YnVmX2xvY2spOworCXN0LT50eFswXSA9IEFERTc4NTRfV1JJVEVfUkVHOworCXN0LT50eFsxXSA9IChyZWdfYWRkcmVzcyA+PiA4KSAmIDB4RkY7CisJc3QtPnR4WzJdID0gcmVnX2FkZHJlc3MgJiAweEZGOworCXN0LT50eFszXSA9ICh2YWx1ZSA+PiAxNikgJiAweEZGOworCXN0LT50eFs0XSA9ICh2YWx1ZSA+PiA4KSAmIDB4RkY7CisJc3QtPnR4WzVdID0gdmFsdWUgJiAweEZGOworCisJc3BpX21lc3NhZ2VfaW5pdCgmbXNnKTsKKwlzcGlfbWVzc2FnZV9hZGRfdGFpbCh4ZmVycywgJm1zZyk7CisJcmV0ID0gc3BpX3N5bmMoc3QtPnNwaSwgJm1zZyk7CisJbXV0ZXhfdW5sb2NrKCZzdC0+YnVmX2xvY2spOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhZGU3ODU0X3NwaV93cml0ZV9yZWdfMzIoc3RydWN0IGRldmljZSAqZGV2LAorCQl1MTYgcmVnX2FkZHJlc3MsCisJCXUzMiB2YWx1ZSkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBzcGlfbWVzc2FnZSBtc2c7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZGU3ODU0X3N0YXRlICpzdCA9IGlpb19kZXZfZ2V0X2RldmRhdGEoaW5kaW9fZGV2KTsKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyIHhmZXJzW10gPSB7CisJCXsKKwkJCS50eF9idWYgPSBzdC0+dHgsCisJCQkuYml0c19wZXJfd29yZCA9IDgsCisJCQkubGVuID0gNywKKwkJfQorCX07CisKKwltdXRleF9sb2NrKCZzdC0+YnVmX2xvY2spOworCXN0LT50eFswXSA9IEFERTc4NTRfV1JJVEVfUkVHOworCXN0LT50eFsxXSA9IChyZWdfYWRkcmVzcyA+PiA4KSAmIDB4RkY7CisJc3QtPnR4WzJdID0gcmVnX2FkZHJlc3MgJiAweEZGOworCXN0LT50eFszXSA9ICh2YWx1ZSA+PiAyNCkgJiAweEZGOworCXN0LT50eFs0XSA9ICh2YWx1ZSA+PiAxNikgJiAweEZGOworCXN0LT50eFs1XSA9ICh2YWx1ZSA+PiA4KSAmIDB4RkY7CisJc3QtPnR4WzZdID0gdmFsdWUgJiAweEZGOworCisJc3BpX21lc3NhZ2VfaW5pdCgmbXNnKTsKKwlzcGlfbWVzc2FnZV9hZGRfdGFpbCh4ZmVycywgJm1zZyk7CisJcmV0ID0gc3BpX3N5bmMoc3QtPnNwaSwgJm1zZyk7CisJbXV0ZXhfdW5sb2NrKCZzdC0+YnVmX2xvY2spOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhZGU3ODU0X3NwaV9yZWFkX3JlZ184KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJdTE2IHJlZ19hZGRyZXNzLAorCQl1OCAqdmFsKQoreworCXN0cnVjdCBzcGlfbWVzc2FnZSBtc2c7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZGU3ODU0X3N0YXRlICpzdCA9IGlpb19kZXZfZ2V0X2RldmRhdGEoaW5kaW9fZGV2KTsKKwlpbnQgcmV0OworCXN0cnVjdCBzcGlfdHJhbnNmZXIgeGZlcnNbXSA9IHsKKwkJeworCQkJLnR4X2J1ZiA9IHN0LT50eCwKKwkJCS5iaXRzX3Blcl93b3JkID0gOCwKKwkJCS5sZW4gPSA0LAorCQl9LAorCX07CisKKwltdXRleF9sb2NrKCZzdC0+YnVmX2xvY2spOworCisJc3QtPnR4WzBdID0gQURFNzg1NF9SRUFEX1JFRzsKKwlzdC0+dHhbMV0gPSAocmVnX2FkZHJlc3MgPj4gOCkgJiAweEZGOworCXN0LT50eFsyXSA9IHJlZ19hZGRyZXNzICYgMHhGRjsKKwlzdC0+dHhbM10gPSAwOworCisJc3BpX21lc3NhZ2VfaW5pdCgmbXNnKTsKKwlzcGlfbWVzc2FnZV9hZGRfdGFpbCh4ZmVycywgJm1zZyk7CisJcmV0ID0gc3BpX3N5bmMoc3QtPnNwaSwgJm1zZyk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZzdC0+c3BpLT5kZXYsICJwcm9ibGVtIHdoZW4gcmVhZGluZyA4IGJpdCByZWdpc3RlciAweCUwMlgiLAorCQkJCXJlZ19hZGRyZXNzKTsKKwkJZ290byBlcnJvcl9yZXQ7CisJfQorCSp2YWwgPSBzdC0+cnhbM107CisKK2Vycm9yX3JldDoKKwltdXRleF91bmxvY2soJnN0LT5idWZfbG9jayk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhZGU3ODU0X3NwaV9yZWFkX3JlZ18xNihzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXUxNiByZWdfYWRkcmVzcywKKwkJdTE2ICp2YWwpCit7CisJc3RydWN0IHNwaV9tZXNzYWdlIG1zZzsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkZTc4NTRfc3RhdGUgKnN0ID0gaWlvX2Rldl9nZXRfZGV2ZGF0YShpbmRpb19kZXYpOworCWludCByZXQ7CisJc3RydWN0IHNwaV90cmFuc2ZlciB4ZmVyc1tdID0geworCQl7CisJCQkudHhfYnVmID0gc3QtPnR4LAorCQkJLmJpdHNfcGVyX3dvcmQgPSA4LAorCQkJLmxlbiA9IDUsCisJCX0sCisJfTsKKworCW11dGV4X2xvY2soJnN0LT5idWZfbG9jayk7CisJc3QtPnR4WzBdID0gQURFNzg1NF9SRUFEX1JFRzsKKwlzdC0+dHhbMV0gPSAocmVnX2FkZHJlc3MgPj4gOCkgJiAweEZGOworCXN0LT50eFsyXSA9IHJlZ19hZGRyZXNzICYgMHhGRjsKKwlzdC0+dHhbM10gPSAwOworCXN0LT50eFs0XSA9IDA7CisKKwlzcGlfbWVzc2FnZV9pbml0KCZtc2cpOworCXNwaV9tZXNzYWdlX2FkZF90YWlsKHhmZXJzLCAmbXNnKTsKKwlyZXQgPSBzcGlfc3luYyhzdC0+c3BpLCAmbXNnKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJnN0LT5zcGktPmRldiwgInByb2JsZW0gd2hlbiByZWFkaW5nIDE2IGJpdCByZWdpc3RlciAweCUwMlgiLAorCQkJCXJlZ19hZGRyZXNzKTsKKwkJZ290byBlcnJvcl9yZXQ7CisJfQorCSp2YWwgPSAoc3QtPnJ4WzNdIDw8IDgpIHwgc3QtPnJ4WzRdOworCitlcnJvcl9yZXQ6CisJbXV0ZXhfdW5sb2NrKCZzdC0+YnVmX2xvY2spOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYWRlNzg1NF9zcGlfcmVhZF9yZWdfMjQoc3RydWN0IGRldmljZSAqZGV2LAorCQl1MTYgcmVnX2FkZHJlc3MsCisJCXUzMiAqdmFsKQoreworCXN0cnVjdCBzcGlfbWVzc2FnZSBtc2c7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZGU3ODU0X3N0YXRlICpzdCA9IGlpb19kZXZfZ2V0X2RldmRhdGEoaW5kaW9fZGV2KTsKKwlpbnQgcmV0OworCXN0cnVjdCBzcGlfdHJhbnNmZXIgeGZlcnNbXSA9IHsKKwkJeworCQkJLnR4X2J1ZiA9IHN0LT50eCwKKwkJCS5iaXRzX3Blcl93b3JkID0gOCwKKwkJCS5sZW4gPSA2LAorCQl9LAorCX07CisKKwltdXRleF9sb2NrKCZzdC0+YnVmX2xvY2spOworCisJc3QtPnR4WzBdID0gQURFNzg1NF9SRUFEX1JFRzsKKwlzdC0+dHhbMV0gPSAocmVnX2FkZHJlc3MgPj4gOCkgJiAweEZGOworCXN0LT50eFsyXSA9IHJlZ19hZGRyZXNzICYgMHhGRjsKKwlzdC0+dHhbM10gPSAwOworCXN0LT50eFs0XSA9IDA7CisJc3QtPnR4WzVdID0gMDsKKworCXNwaV9tZXNzYWdlX2luaXQoJm1zZyk7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoeGZlcnMsICZtc2cpOworCXJldCA9IHNwaV9zeW5jKHN0LT5zcGksICZtc2cpOworCWlmIChyZXQpIHsKKwkJZGV2X2Vycigmc3QtPnNwaS0+ZGV2LCAicHJvYmxlbSB3aGVuIHJlYWRpbmcgMjQgYml0IHJlZ2lzdGVyIDB4JTAyWCIsCisJCQkJcmVnX2FkZHJlc3MpOworCQlnb3RvIGVycm9yX3JldDsKKwl9CisJKnZhbCA9IChzdC0+cnhbM10gPDwgMTYpIHwgKHN0LT5yeFs0XSA8PCA4KSB8IHN0LT5yeFs1XTsKKworZXJyb3JfcmV0OgorCW11dGV4X3VubG9jaygmc3QtPmJ1Zl9sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFkZTc4NTRfc3BpX3JlYWRfcmVnXzMyKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJdTE2IHJlZ19hZGRyZXNzLAorCQl1MzIgKnZhbCkKK3sKKwlzdHJ1Y3Qgc3BpX21lc3NhZ2UgbXNnOworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWRlNzg1NF9zdGF0ZSAqc3QgPSBpaW9fZGV2X2dldF9kZXZkYXRhKGluZGlvX2Rldik7CisJaW50IHJldDsKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyIHhmZXJzW10gPSB7CisJCXsKKwkJCS50eF9idWYgPSBzdC0+dHgsCisJCQkuYml0c19wZXJfd29yZCA9IDgsCisJCQkubGVuID0gNywKKwkJfSwKKwl9OworCisJbXV0ZXhfbG9jaygmc3QtPmJ1Zl9sb2NrKTsKKworCXN0LT50eFswXSA9IEFERTc4NTRfUkVBRF9SRUc7CisJc3QtPnR4WzFdID0gKHJlZ19hZGRyZXNzID4+IDgpICYgMHhGRjsKKwlzdC0+dHhbMl0gPSByZWdfYWRkcmVzcyAmIDB4RkY7CisJc3QtPnR4WzNdID0gMDsKKwlzdC0+dHhbNF0gPSAwOworCXN0LT50eFs1XSA9IDA7CisJc3QtPnR4WzZdID0gMDsKKworCXNwaV9tZXNzYWdlX2luaXQoJm1zZyk7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoeGZlcnMsICZtc2cpOworCXJldCA9IHNwaV9zeW5jKHN0LT5zcGksICZtc2cpOworCWlmIChyZXQpIHsKKwkJZGV2X2Vycigmc3QtPnNwaS0+ZGV2LCAicHJvYmxlbSB3aGVuIHJlYWRpbmcgMzIgYml0IHJlZ2lzdGVyIDB4JTAyWCIsCisJCQkJcmVnX2FkZHJlc3MpOworCQlnb3RvIGVycm9yX3JldDsKKwl9CisJKnZhbCA9IChzdC0+cnhbM10gPDwgMjQpIHwgKHN0LT5yeFs0XSA8PCAxNikgfCAoc3QtPnJ4WzVdIDw8IDgpIHwgc3QtPnJ4WzZdOworCitlcnJvcl9yZXQ6CisJbXV0ZXhfdW5sb2NrKCZzdC0+YnVmX2xvY2spOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGFkZTc4NTRfc3BpX3Byb2JlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgYWRlNzg1NF9zdGF0ZSAqc3QgPSBremFsbG9jKHNpemVvZiAqc3QsIEdGUF9LRVJORUwpOworCWlmICghc3QpIHsKKwkJcmV0ID0gIC1FTk9NRU07CisJCXJldHVybiByZXQ7CisJfQorCisJc3BpX3NldF9kcnZkYXRhKHNwaSwgc3QpOworCXN0LT5yZWFkX3JlZ184ID0gYWRlNzg1NF9zcGlfcmVhZF9yZWdfODsKKwlzdC0+cmVhZF9yZWdfMTYgPSBhZGU3ODU0X3NwaV9yZWFkX3JlZ18xNjsKKwlzdC0+cmVhZF9yZWdfMjQgPSBhZGU3ODU0X3NwaV9yZWFkX3JlZ18yNDsKKwlzdC0+cmVhZF9yZWdfMzIgPSBhZGU3ODU0X3NwaV9yZWFkX3JlZ18zMjsKKwlzdC0+d3JpdGVfcmVnXzggPSBhZGU3ODU0X3NwaV93cml0ZV9yZWdfODsKKwlzdC0+d3JpdGVfcmVnXzE2ID0gYWRlNzg1NF9zcGlfd3JpdGVfcmVnXzE2OworCXN0LT53cml0ZV9yZWdfMjQgPSBhZGU3ODU0X3NwaV93cml0ZV9yZWdfMjQ7CisJc3QtPndyaXRlX3JlZ18zMiA9IGFkZTc4NTRfc3BpX3dyaXRlX3JlZ18zMjsKKwlzdC0+aXJxID0gc3BpLT5pcnE7CisJc3QtPnNwaSA9IHNwaTsKKworCXJldCA9IGFkZTc4NTRfcHJvYmUoc3QsICZzcGktPmRldik7CisJaWYgKHJldCkgeworCQlrZnJlZShzdCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWRlNzg1NF9zcGlfcmVtb3ZlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJYWRlNzg1NF9yZW1vdmUoc3BpX2dldF9kcnZkYXRhKHNwaSkpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3BpX2RyaXZlciBhZGU3ODU0X2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJhZGU3ODU0IiwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJfSwKKwkucHJvYmUgPSBhZGU3ODU0X3NwaV9wcm9iZSwKKwkucmVtb3ZlID0gX19kZXZleGl0X3AoYWRlNzg1NF9zcGlfcmVtb3ZlKSwKK307CisKK3N0YXRpYyBfX2luaXQgaW50IGFkZTc4NTRfaW5pdCh2b2lkKQoreworCXJldHVybiBzcGlfcmVnaXN0ZXJfZHJpdmVyKCZhZGU3ODU0X2RyaXZlcik7Cit9Cittb2R1bGVfaW5pdChhZGU3ODU0X2luaXQpOworCitzdGF0aWMgX19leGl0IHZvaWQgYWRlNzg1NF9leGl0KHZvaWQpCit7CisJc3BpX3VucmVnaXN0ZXJfZHJpdmVyKCZhZGU3ODU0X2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdChhZGU3ODU0X2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJCYXJyeSBTb25nIDwyMWNuYmFvQGdtYWlsLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiQW5hbG9nIERldmljZXMgQURFNzg1NC81OC82OC83OCBQb2x5cGhhc2UgTXVsdGlmdW5jdGlvbiBFbmVyZ3kgTWV0ZXJpbmcgSUMgU1BJIERyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9tZXRlci9hZGU3ODU0LmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL21ldGVyL2FkZTc4NTQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTNkNTA0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9tZXRlci9hZGU3ODU0LmMKQEAgLTAsMCArMSw2ODAgQEAKKy8qCisgKiBBREU3ODU0LzU4LzY4Lzc4IFBvbHlwaGFzZSBNdWx0aWZ1bmN0aW9uIEVuZXJneSBNZXRlcmluZyBJQyBEcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgMjAxMCBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNmcy5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKworI2luY2x1ZGUgIi4uL2lpby5oIgorI2luY2x1ZGUgIi4uL3N5c2ZzLmgiCisjaW5jbHVkZSAibWV0ZXIuaCIKKyNpbmNsdWRlICJhZGU3ODU0LmgiCisKK3N0YXRpYyBzc2l6ZV90IGFkZTc4NTRfcmVhZF84Yml0KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlpbnQgcmV0OworCXU4IHZhbCA9IDA7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZGU3ODU0X3N0YXRlICpzdCA9IGlpb19kZXZfZ2V0X2RldmRhdGEoaW5kaW9fZGV2KTsKKwlzdHJ1Y3QgaWlvX2Rldl9hdHRyICp0aGlzX2F0dHIgPSB0b19paW9fZGV2X2F0dHIoYXR0cik7CisKKwlyZXQgPSBzdC0+cmVhZF9yZWdfOChkZXYsIHRoaXNfYXR0ci0+YWRkcmVzcywgJnZhbCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCB2YWwpOworfQorCitzdGF0aWMgc3NpemVfdCBhZGU3ODU0X3JlYWRfMTZiaXQoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCWludCByZXQ7CisJdTE2IHZhbCA9IDA7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZGU3ODU0X3N0YXRlICpzdCA9IGlpb19kZXZfZ2V0X2RldmRhdGEoaW5kaW9fZGV2KTsKKwlzdHJ1Y3QgaWlvX2Rldl9hdHRyICp0aGlzX2F0dHIgPSB0b19paW9fZGV2X2F0dHIoYXR0cik7CisKKwlyZXQgPSBzdC0+cmVhZF9yZWdfMTYoZGV2LCB0aGlzX2F0dHItPmFkZHJlc3MsICZ2YWwpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgdmFsKTsKK30KKworc3RhdGljIHNzaXplX3QgYWRlNzg1NF9yZWFkXzI0Yml0KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlpbnQgcmV0OworCXUzMiB2YWwgPSAwOworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWRlNzg1NF9zdGF0ZSAqc3QgPSBpaW9fZGV2X2dldF9kZXZkYXRhKGluZGlvX2Rldik7CisJc3RydWN0IGlpb19kZXZfYXR0ciAqdGhpc19hdHRyID0gdG9faWlvX2Rldl9hdHRyKGF0dHIpOworCisJcmV0ID0gc3QtPnJlYWRfcmVnXzI0KGRldiwgdGhpc19hdHRyLT5hZGRyZXNzLCAmdmFsKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIHZhbCAmIDB4RkZGRkZGKTsKK30KKworc3RhdGljIHNzaXplX3QgYWRlNzg1NF9yZWFkXzMyYml0KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlpbnQgcmV0OworCXUzMiB2YWwgPSAwOworCXN0cnVjdCBpaW9fZGV2X2F0dHIgKnRoaXNfYXR0ciA9IHRvX2lpb19kZXZfYXR0cihhdHRyKTsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkZTc4NTRfc3RhdGUgKnN0ID0gaWlvX2Rldl9nZXRfZGV2ZGF0YShpbmRpb19kZXYpOworCisJcmV0ID0gc3QtPnJlYWRfcmVnXzMyKGRldiwgdGhpc19hdHRyLT5hZGRyZXNzLCAmdmFsKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIHZhbCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkZTc4NTRfd3JpdGVfOGJpdChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBsZW4pCit7CisJc3RydWN0IGlpb19kZXZfYXR0ciAqdGhpc19hdHRyID0gdG9faWlvX2Rldl9hdHRyKGF0dHIpOworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWRlNzg1NF9zdGF0ZSAqc3QgPSBpaW9fZGV2X2dldF9kZXZkYXRhKGluZGlvX2Rldik7CisKKwlpbnQgcmV0OworCWxvbmcgdmFsOworCisJcmV0ID0gc3RyaWN0X3N0cnRvbChidWYsIDEwLCAmdmFsKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3JldDsKKwlyZXQgPSBzdC0+d3JpdGVfcmVnXzgoZGV2LCB0aGlzX2F0dHItPmFkZHJlc3MsIHZhbCk7CisKK2Vycm9yX3JldDoKKwlyZXR1cm4gcmV0ID8gcmV0IDogbGVuOworfQorCitzdGF0aWMgc3NpemVfdCBhZGU3ODU0X3dyaXRlXzE2Yml0KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWlvX2Rldl9hdHRyICp0aGlzX2F0dHIgPSB0b19paW9fZGV2X2F0dHIoYXR0cik7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZGU3ODU0X3N0YXRlICpzdCA9IGlpb19kZXZfZ2V0X2RldmRhdGEoaW5kaW9fZGV2KTsKKworCWludCByZXQ7CisJbG9uZyB2YWw7CisKKwlyZXQgPSBzdHJpY3Rfc3RydG9sKGJ1ZiwgMTAsICZ2YWwpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfcmV0OworCXJldCA9IHN0LT53cml0ZV9yZWdfMTYoZGV2LCB0aGlzX2F0dHItPmFkZHJlc3MsIHZhbCk7CisKK2Vycm9yX3JldDoKKwlyZXR1cm4gcmV0ID8gcmV0IDogbGVuOworfQorCitzdGF0aWMgc3NpemVfdCBhZGU3ODU0X3dyaXRlXzI0Yml0KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWlvX2Rldl9hdHRyICp0aGlzX2F0dHIgPSB0b19paW9fZGV2X2F0dHIoYXR0cik7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZGU3ODU0X3N0YXRlICpzdCA9IGlpb19kZXZfZ2V0X2RldmRhdGEoaW5kaW9fZGV2KTsKKworCWludCByZXQ7CisJbG9uZyB2YWw7CisKKwlyZXQgPSBzdHJpY3Rfc3RydG9sKGJ1ZiwgMTAsICZ2YWwpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfcmV0OworCXJldCA9IHN0LT53cml0ZV9yZWdfMjQoZGV2LCB0aGlzX2F0dHItPmFkZHJlc3MsIHZhbCk7CisKK2Vycm9yX3JldDoKKwlyZXR1cm4gcmV0ID8gcmV0IDogbGVuOworfQorCitzdGF0aWMgc3NpemVfdCBhZGU3ODU0X3dyaXRlXzMyYml0KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWlvX2Rldl9hdHRyICp0aGlzX2F0dHIgPSB0b19paW9fZGV2X2F0dHIoYXR0cik7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZGU3ODU0X3N0YXRlICpzdCA9IGlpb19kZXZfZ2V0X2RldmRhdGEoaW5kaW9fZGV2KTsKKworCWludCByZXQ7CisJbG9uZyB2YWw7CisKKwlyZXQgPSBzdHJpY3Rfc3RydG9sKGJ1ZiwgMTAsICZ2YWwpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfcmV0OworCXJldCA9IHN0LT53cml0ZV9yZWdfMzIoZGV2LCB0aGlzX2F0dHItPmFkZHJlc3MsIHZhbCk7CisKK2Vycm9yX3JldDoKKwlyZXR1cm4gcmV0ID8gcmV0IDogbGVuOworfQorCitzdGF0aWMgaW50IGFkZTc4NTRfcmVzZXQoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWRlNzg1NF9zdGF0ZSAqc3QgPSBpaW9fZGV2X2dldF9kZXZkYXRhKGluZGlvX2Rldik7CisKKwlpbnQgcmV0OworCXUxNiB2YWw7CisKKwlzdC0+cmVhZF9yZWdfMTYoZGV2LCBBREU3ODU0X0NPTkZJRywgJnZhbCk7CisJdmFsIHw9IDEgPDwgNzsgLyogU29mdHdhcmUgQ2hpcCBSZXNldCAqLworCXJldCA9IHN0LT53cml0ZV9yZWdfMTYoZGV2LCBBREU3ODU0X0NPTkZJRywgdmFsKTsKKworCXJldHVybiByZXQ7Cit9CisKKworc3RhdGljIHNzaXplX3QgYWRlNzg1NF93cml0ZV9yZXNldChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBsZW4pCit7CisJaWYgKGxlbiA8IDEpCisJCXJldHVybiAtMTsKKwlzd2l0Y2ggKGJ1ZlswXSkgeworCWNhc2UgJzEnOgorCWNhc2UgJ3knOgorCWNhc2UgJ1knOgorCQlyZXR1cm4gYWRlNzg1NF9yZXNldChkZXYpOworCX0KKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBJSU9fREVWX0FUVFJfQUlHQUlOKFNfSVdVU1IgfCBTX0lSVUdPLAorCQlhZGU3ODU0X3JlYWRfMjRiaXQsCisJCWFkZTc4NTRfd3JpdGVfMjRiaXQsCisJCUFERTc4NTRfQUlHQUlOKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfQklHQUlOKFNfSVdVU1IgfCBTX0lSVUdPLAorCQlhZGU3ODU0X3JlYWRfMjRiaXQsCisJCWFkZTc4NTRfd3JpdGVfMjRiaXQsCisJCUFERTc4NTRfQklHQUlOKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfQ0lHQUlOKFNfSVdVU1IgfCBTX0lSVUdPLAorCQlhZGU3ODU0X3JlYWRfMjRiaXQsCisJCWFkZTc4NTRfd3JpdGVfMjRiaXQsCisJCUFERTc4NTRfQ0lHQUlOKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfTklHQUlOKFNfSVdVU1IgfCBTX0lSVUdPLAorCQlhZGU3ODU0X3JlYWRfMjRiaXQsCisJCWFkZTc4NTRfd3JpdGVfMjRiaXQsCisJCUFERTc4NTRfTklHQUlOKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfQVZHQUlOKFNfSVdVU1IgfCBTX0lSVUdPLAorCQlhZGU3ODU0X3JlYWRfMjRiaXQsCisJCWFkZTc4NTRfd3JpdGVfMjRiaXQsCisJCUFERTc4NTRfQVZHQUlOKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfQlZHQUlOKFNfSVdVU1IgfCBTX0lSVUdPLAorCQlhZGU3ODU0X3JlYWRfMjRiaXQsCisJCWFkZTc4NTRfd3JpdGVfMjRiaXQsCisJCUFERTc4NTRfQlZHQUlOKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfQ1ZHQUlOKFNfSVdVU1IgfCBTX0lSVUdPLAorCQlhZGU3ODU0X3JlYWRfMjRiaXQsCisJCWFkZTc4NTRfd3JpdGVfMjRiaXQsCisJCUFERTc4NTRfQ1ZHQUlOKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfQVBQQVJFTlRfUE9XRVJfQV9HQUlOKFNfSVdVU1IgfCBTX0lSVUdPLAorCQlhZGU3ODU0X3JlYWRfMjRiaXQsCisJCWFkZTc4NTRfd3JpdGVfMjRiaXQsCisJCUFERTc4NTRfQVZBR0FJTik7CitzdGF0aWMgSUlPX0RFVl9BVFRSX0FQUEFSRU5UX1BPV0VSX0JfR0FJTihTX0lXVVNSIHwgU19JUlVHTywKKwkJYWRlNzg1NF9yZWFkXzI0Yml0LAorCQlhZGU3ODU0X3dyaXRlXzI0Yml0LAorCQlBREU3ODU0X0JWQUdBSU4pOworc3RhdGljIElJT19ERVZfQVRUUl9BUFBBUkVOVF9QT1dFUl9DX0dBSU4oU19JV1VTUiB8IFNfSVJVR08sCisJCWFkZTc4NTRfcmVhZF8yNGJpdCwKKwkJYWRlNzg1NF93cml0ZV8yNGJpdCwKKwkJQURFNzg1NF9DVkFHQUlOKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfQUNUSVZFX1BPV0VSX0FfT0ZGU0VUKFNfSVdVU1IgfCBTX0lSVUdPLAorCQlhZGU3ODU0X3JlYWRfMjRiaXQsCisJCWFkZTc4NTRfd3JpdGVfMjRiaXQsCisJCUFERTc4NTRfQVdBVFRPUyk7CitzdGF0aWMgSUlPX0RFVl9BVFRSX0FDVElWRV9QT1dFUl9CX09GRlNFVChTX0lXVVNSIHwgU19JUlVHTywKKwkJYWRlNzg1NF9yZWFkXzI0Yml0LAorCQlhZGU3ODU0X3dyaXRlXzI0Yml0LAorCQlBREU3ODU0X0JXQVRUT1MpOworc3RhdGljIElJT19ERVZfQVRUUl9BQ1RJVkVfUE9XRVJfQ19PRkZTRVQoU19JV1VTUiB8IFNfSVJVR08sCisJCWFkZTc4NTRfcmVhZF8yNGJpdCwKKwkJYWRlNzg1NF93cml0ZV8yNGJpdCwKKwkJQURFNzg1NF9DV0FUVE9TKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfUkVBQ1RJVkVfUE9XRVJfQV9HQUlOKFNfSVdVU1IgfCBTX0lSVUdPLAorCQlhZGU3ODU0X3JlYWRfMjRiaXQsCisJCWFkZTc4NTRfd3JpdGVfMjRiaXQsCisJCUFERTc4NTRfQVZBUkdBSU4pOworc3RhdGljIElJT19ERVZfQVRUUl9SRUFDVElWRV9QT1dFUl9CX0dBSU4oU19JV1VTUiB8IFNfSVJVR08sCisJCWFkZTc4NTRfcmVhZF8yNGJpdCwKKwkJYWRlNzg1NF93cml0ZV8yNGJpdCwKKwkJQURFNzg1NF9CVkFSR0FJTik7CitzdGF0aWMgSUlPX0RFVl9BVFRSX1JFQUNUSVZFX1BPV0VSX0NfR0FJTihTX0lXVVNSIHwgU19JUlVHTywKKwkJYWRlNzg1NF9yZWFkXzI0Yml0LAorCQlhZGU3ODU0X3dyaXRlXzI0Yml0LAorCQlBREU3ODU0X0NWQVJHQUlOKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfUkVBQ1RJVkVfUE9XRVJfQV9PRkZTRVQoU19JV1VTUiB8IFNfSVJVR08sCisJCWFkZTc4NTRfcmVhZF8yNGJpdCwKKwkJYWRlNzg1NF93cml0ZV8yNGJpdCwKKwkJQURFNzg1NF9BVkFST1MpOworc3RhdGljIElJT19ERVZfQVRUUl9SRUFDVElWRV9QT1dFUl9CX09GRlNFVChTX0lXVVNSIHwgU19JUlVHTywKKwkJYWRlNzg1NF9yZWFkXzI0Yml0LAorCQlhZGU3ODU0X3dyaXRlXzI0Yml0LAorCQlBREU3ODU0X0JWQVJPUyk7CitzdGF0aWMgSUlPX0RFVl9BVFRSX1JFQUNUSVZFX1BPV0VSX0NfT0ZGU0VUKFNfSVdVU1IgfCBTX0lSVUdPLAorCQlhZGU3ODU0X3JlYWRfMjRiaXQsCisJCWFkZTc4NTRfd3JpdGVfMjRiaXQsCisJCUFERTc4NTRfQ1ZBUk9TKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfVlBFQUsoU19JV1VTUiB8IFNfSVJVR08sCisJCWFkZTc4NTRfcmVhZF8zMmJpdCwKKwkJYWRlNzg1NF93cml0ZV8zMmJpdCwKKwkJQURFNzg1NF9WUEVBSyk7CitzdGF0aWMgSUlPX0RFVl9BVFRSX0lQRUFLKFNfSVdVU1IgfCBTX0lSVUdPLAorCQlhZGU3ODU0X3JlYWRfMzJiaXQsCisJCWFkZTc4NTRfd3JpdGVfMzJiaXQsCisJCUFERTc4NTRfVlBFQUspOworc3RhdGljIElJT19ERVZfQVRUUl9BUEhDQUwoU19JV1VTUiB8IFNfSVJVR08sCisJCWFkZTc4NTRfcmVhZF8xNmJpdCwKKwkJYWRlNzg1NF93cml0ZV8xNmJpdCwKKwkJQURFNzg1NF9BUEhDQUwpOworc3RhdGljIElJT19ERVZfQVRUUl9CUEhDQUwoU19JV1VTUiB8IFNfSVJVR08sCisJCWFkZTc4NTRfcmVhZF8xNmJpdCwKKwkJYWRlNzg1NF93cml0ZV8xNmJpdCwKKwkJQURFNzg1NF9CUEhDQUwpOworc3RhdGljIElJT19ERVZfQVRUUl9DUEhDQUwoU19JV1VTUiB8IFNfSVJVR08sCisJCWFkZTc4NTRfcmVhZF8xNmJpdCwKKwkJYWRlNzg1NF93cml0ZV8xNmJpdCwKKwkJQURFNzg1NF9DUEhDQUwpOworc3RhdGljIElJT19ERVZfQVRUUl9DRjFERU4oU19JV1VTUiB8IFNfSVJVR08sCisJCWFkZTc4NTRfcmVhZF8xNmJpdCwKKwkJYWRlNzg1NF93cml0ZV8xNmJpdCwKKwkJQURFNzg1NF9DRjFERU4pOworc3RhdGljIElJT19ERVZfQVRUUl9DRjJERU4oU19JV1VTUiB8IFNfSVJVR08sCisJCWFkZTc4NTRfcmVhZF8xNmJpdCwKKwkJYWRlNzg1NF93cml0ZV8xNmJpdCwKKwkJQURFNzg1NF9DRjJERU4pOworc3RhdGljIElJT19ERVZfQVRUUl9DRjNERU4oU19JV1VTUiB8IFNfSVJVR08sCisJCWFkZTc4NTRfcmVhZF8xNmJpdCwKKwkJYWRlNzg1NF93cml0ZV8xNmJpdCwKKwkJQURFNzg1NF9DRjNERU4pOworc3RhdGljIElJT19ERVZfQVRUUl9MSU5FQ1lDKFNfSVdVU1IgfCBTX0lSVUdPLAorCQlhZGU3ODU0X3JlYWRfMTZiaXQsCisJCWFkZTc4NTRfd3JpdGVfMTZiaXQsCisJCUFERTc4NTRfTElORUNZQyk7CitzdGF0aWMgSUlPX0RFVl9BVFRSX1NBR0NZQyhTX0lXVVNSIHwgU19JUlVHTywKKwkJYWRlNzg1NF9yZWFkXzhiaXQsCisJCWFkZTc4NTRfd3JpdGVfOGJpdCwKKwkJQURFNzg1NF9TQUdDWUMpOworc3RhdGljIElJT19ERVZfQVRUUl9DRkNZQyhTX0lXVVNSIHwgU19JUlVHTywKKwkJYWRlNzg1NF9yZWFkXzhiaXQsCisJCWFkZTc4NTRfd3JpdGVfOGJpdCwKKwkJQURFNzg1NF9DRkNZQyk7CitzdGF0aWMgSUlPX0RFVl9BVFRSX1BFQUtDWUMoU19JV1VTUiB8IFNfSVJVR08sCisJCWFkZTc4NTRfcmVhZF84Yml0LAorCQlhZGU3ODU0X3dyaXRlXzhiaXQsCisJCUFERTc4NTRfUEVBS0NZQyk7CitzdGF0aWMgSUlPX0RFVl9BVFRSX0NIS1NVTShhZGU3ODU0X3JlYWRfMjRiaXQsCisJCUFERTc4NTRfQ0hFQ0tTVU0pOworc3RhdGljIElJT19ERVZfQVRUUl9BTkdMRTAoYWRlNzg1NF9yZWFkXzI0Yml0LAorCQlBREU3ODU0X0FOR0xFMCk7CitzdGF0aWMgSUlPX0RFVl9BVFRSX0FOR0xFMShhZGU3ODU0X3JlYWRfMjRiaXQsCisJCUFERTc4NTRfQU5HTEUxKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfQU5HTEUyKGFkZTc4NTRfcmVhZF8yNGJpdCwKKwkJQURFNzg1NF9BTkdMRTIpOworc3RhdGljIElJT19ERVZfQVRUUl9BSVJNUyhTX0lSVUdPLAorCQlhZGU3ODU0X3JlYWRfMjRiaXQsCisJCU5VTEwsCisJCUFERTc4NTRfQUlSTVMpOworc3RhdGljIElJT19ERVZfQVRUUl9CSVJNUyhTX0lSVUdPLAorCQlhZGU3ODU0X3JlYWRfMjRiaXQsCisJCU5VTEwsCisJCUFERTc4NTRfQklSTVMpOworc3RhdGljIElJT19ERVZfQVRUUl9DSVJNUyhTX0lSVUdPLAorCQlhZGU3ODU0X3JlYWRfMjRiaXQsCisJCU5VTEwsCisJCUFERTc4NTRfQ0lSTVMpOworc3RhdGljIElJT19ERVZfQVRUUl9OSVJNUyhTX0lSVUdPLAorCQlhZGU3ODU0X3JlYWRfMjRiaXQsCisJCU5VTEwsCisJCUFERTc4NTRfTklSTVMpOworc3RhdGljIElJT19ERVZfQVRUUl9BVlJNUyhTX0lSVUdPLAorCQlhZGU3ODU0X3JlYWRfMjRiaXQsCisJCU5VTEwsCisJCUFERTc4NTRfQVZSTVMpOworc3RhdGljIElJT19ERVZfQVRUUl9CVlJNUyhTX0lSVUdPLAorCQlhZGU3ODU0X3JlYWRfMjRiaXQsCisJCU5VTEwsCisJCUFERTc4NTRfQlZSTVMpOworc3RhdGljIElJT19ERVZfQVRUUl9DVlJNUyhTX0lSVUdPLAorCQlhZGU3ODU0X3JlYWRfMjRiaXQsCisJCU5VTEwsCisJCUFERTc4NTRfQ1ZSTVMpOworc3RhdGljIElJT19ERVZfQVRUUl9BSVJNU09TKFNfSVJVR08sCisJCWFkZTc4NTRfcmVhZF8xNmJpdCwKKwkJYWRlNzg1NF93cml0ZV8xNmJpdCwKKwkJQURFNzg1NF9BSVJNU09TKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfQklSTVNPUyhTX0lSVUdPLAorCQlhZGU3ODU0X3JlYWRfMTZiaXQsCisJCWFkZTc4NTRfd3JpdGVfMTZiaXQsCisJCUFERTc4NTRfQklSTVNPUyk7CitzdGF0aWMgSUlPX0RFVl9BVFRSX0NJUk1TT1MoU19JUlVHTywKKwkJYWRlNzg1NF9yZWFkXzE2Yml0LAorCQlhZGU3ODU0X3dyaXRlXzE2Yml0LAorCQlBREU3ODU0X0NJUk1TT1MpOworc3RhdGljIElJT19ERVZfQVRUUl9BVlJNU09TKFNfSVJVR08sCisJCWFkZTc4NTRfcmVhZF8xNmJpdCwKKwkJYWRlNzg1NF93cml0ZV8xNmJpdCwKKwkJQURFNzg1NF9BVlJNU09TKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfQlZSTVNPUyhTX0lSVUdPLAorCQlhZGU3ODU0X3JlYWRfMTZiaXQsCisJCWFkZTc4NTRfd3JpdGVfMTZiaXQsCisJCUFERTc4NTRfQlZSTVNPUyk7CitzdGF0aWMgSUlPX0RFVl9BVFRSX0NWUk1TT1MoU19JUlVHTywKKwkJYWRlNzg1NF9yZWFkXzE2Yml0LAorCQlhZGU3ODU0X3dyaXRlXzE2Yml0LAorCQlBREU3ODU0X0NWUk1TT1MpOworc3RhdGljIElJT19ERVZfQVRUUl9WT0xUX0EoYWRlNzg1NF9yZWFkXzI0Yml0LAorCQlBREU3ODU0X1ZBV1YpOworc3RhdGljIElJT19ERVZfQVRUUl9WT0xUX0IoYWRlNzg1NF9yZWFkXzI0Yml0LAorCQlBREU3ODU0X1ZCV1YpOworc3RhdGljIElJT19ERVZfQVRUUl9WT0xUX0MoYWRlNzg1NF9yZWFkXzI0Yml0LAorCQlBREU3ODU0X1ZDV1YpOworc3RhdGljIElJT19ERVZfQVRUUl9DVVJSRU5UX0EoYWRlNzg1NF9yZWFkXzI0Yml0LAorCQlBREU3ODU0X0lBV1YpOworc3RhdGljIElJT19ERVZfQVRUUl9DVVJSRU5UX0IoYWRlNzg1NF9yZWFkXzI0Yml0LAorCQlBREU3ODU0X0lCV1YpOworc3RhdGljIElJT19ERVZfQVRUUl9DVVJSRU5UX0MoYWRlNzg1NF9yZWFkXzI0Yml0LAorCQlBREU3ODU0X0lDV1YpOworc3RhdGljIElJT19ERVZfQVRUUl9BV0FUVEhSKGFkZTc4NTRfcmVhZF8zMmJpdCwKKwkJQURFNzg1NF9BV0FUVEhSKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfQldBVFRIUihhZGU3ODU0X3JlYWRfMzJiaXQsCisJCUFERTc4NTRfQldBVFRIUik7CitzdGF0aWMgSUlPX0RFVl9BVFRSX0NXQVRUSFIoYWRlNzg1NF9yZWFkXzMyYml0LAorCQlBREU3ODU0X0NXQVRUSFIpOworc3RhdGljIElJT19ERVZfQVRUUl9BRldBVFRIUihhZGU3ODU0X3JlYWRfMzJiaXQsCisJCUFERTc4NTRfQUZXQVRUSFIpOworc3RhdGljIElJT19ERVZfQVRUUl9CRldBVFRIUihhZGU3ODU0X3JlYWRfMzJiaXQsCisJCUFERTc4NTRfQkZXQVRUSFIpOworc3RhdGljIElJT19ERVZfQVRUUl9DRldBVFRIUihhZGU3ODU0X3JlYWRfMzJiaXQsCisJCUFERTc4NTRfQ0ZXQVRUSFIpOworc3RhdGljIElJT19ERVZfQVRUUl9BVkFSSFIoYWRlNzg1NF9yZWFkXzMyYml0LAorCQlBREU3ODU0X0FWQVJIUik7CitzdGF0aWMgSUlPX0RFVl9BVFRSX0JWQVJIUihhZGU3ODU0X3JlYWRfMzJiaXQsCisJCUFERTc4NTRfQlZBUkhSKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfQ1ZBUkhSKGFkZTc4NTRfcmVhZF8zMmJpdCwKKwkJQURFNzg1NF9DVkFSSFIpOworc3RhdGljIElJT19ERVZfQVRUUl9BVkFIUihhZGU3ODU0X3JlYWRfMzJiaXQsCisJCUFERTc4NTRfQVZBSFIpOworc3RhdGljIElJT19ERVZfQVRUUl9CVkFIUihhZGU3ODU0X3JlYWRfMzJiaXQsCisJCUFERTc4NTRfQlZBSFIpOworc3RhdGljIElJT19ERVZfQVRUUl9DVkFIUihhZGU3ODU0X3JlYWRfMzJiaXQsCisJCUFERTc4NTRfQ1ZBSFIpOworCitzdGF0aWMgaW50IGFkZTc4NTRfc2V0X2lycShzdHJ1Y3QgZGV2aWNlICpkZXYsIGJvb2wgZW5hYmxlKQoreworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWRlNzg1NF9zdGF0ZSAqc3QgPSBpaW9fZGV2X2dldF9kZXZkYXRhKGluZGlvX2Rldik7CisKKwlpbnQgcmV0OworCXUzMiBpcnFlbjsKKworCXJldCA9IHN0LT5yZWFkX3JlZ18zMihkZXYsIEFERTc4NTRfTUFTSzAsICZpcnFlbik7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9yZXQ7CisKKwlpZiAoZW5hYmxlKQorCQlpcnFlbiB8PSAxIDw8IDE3OyAvKiAxOiBpbnRlcnJ1cHQgZW5hYmxlZCB3aGVuIGFsbCBwZXJpb2RpY2FsCisJCQkJICAgICAoYXQgOCBrSHogcmF0ZSkgRFNQIGNvbXB1dGF0aW9ucyBmaW5pc2guICovCisJZWxzZQorCQlpcnFlbiAmPSB+KDEgPDwgMTcpOworCisJcmV0ID0gc3QtPndyaXRlX3JlZ18zMihkZXYsIEFERTc4NTRfTUFTSzAsIGlycWVuKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3JldDsKKworZXJyb3JfcmV0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYWRlNzg1NF9pbml0aWFsX3NldHVwKHN0cnVjdCBhZGU3ODU0X3N0YXRlICpzdCkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZzdC0+aW5kaW9fZGV2LT5kZXY7CisKKwkvKiBEaXNhYmxlIElSUSAqLworCXJldCA9IGFkZTc4NTRfc2V0X2lycShkZXYsIGZhbHNlKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoZGV2LCAiZGlzYWJsZSBpcnEgZmFpbGVkIik7CisJCWdvdG8gZXJyX3JldDsKKwl9CisKKwlhZGU3ODU0X3Jlc2V0KGRldik7CisJbXNsZWVwKEFERTc4NTRfU1RBUlRVUF9ERUxBWSk7CisKK2Vycl9yZXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIElJT19ERVZfQVRUUl9SRVNFVChhZGU3ODU0X3dyaXRlX3Jlc2V0KTsKKworc3RhdGljIElJT19DT05TVF9BVFRSX1NBTVBfRlJFUV9BVkFJTCgiODAwMCIpOworCitzdGF0aWMgSUlPX0NPTlNUX0FUVFIobmFtZSwgImFkZTc4NTQiKTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmFkZTc4NTRfZXZlbnRfYXR0cmlidXRlc1tdID0geworCU5VTEwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGFkZTc4NTRfZXZlbnRfYXR0cmlidXRlX2dyb3VwID0geworCS5hdHRycyA9IGFkZTc4NTRfZXZlbnRfYXR0cmlidXRlcywKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICphZGU3ODU0X2F0dHJpYnV0ZXNbXSA9IHsKKwkmaWlvX2Rldl9hdHRyX2FpZ2Fpbi5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfYmlnYWluLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9jaWdhaW4uZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX25pZ2Fpbi5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfYXZnYWluLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9idmdhaW4uZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2N2Z2Fpbi5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfbGluZWN5Yy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfc2FnY3ljLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9jZmN5Yy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfcGVha2N5Yy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfY2hrc3VtLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9hcHBhcmVudF9wb3dlcl9hX2dhaW4uZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2FwcGFyZW50X3Bvd2VyX2JfZ2Fpbi5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfYXBwYXJlbnRfcG93ZXJfY19nYWluLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9hY3RpdmVfcG93ZXJfYV9vZmZzZXQuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2FjdGl2ZV9wb3dlcl9iX29mZnNldC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfYWN0aXZlX3Bvd2VyX2Nfb2Zmc2V0LmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9yZWFjdGl2ZV9wb3dlcl9hX2dhaW4uZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX3JlYWN0aXZlX3Bvd2VyX2JfZ2Fpbi5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfcmVhY3RpdmVfcG93ZXJfY19nYWluLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9yZWFjdGl2ZV9wb3dlcl9hX29mZnNldC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfcmVhY3RpdmVfcG93ZXJfYl9vZmZzZXQuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX3JlYWN0aXZlX3Bvd2VyX2Nfb2Zmc2V0LmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9hd2F0dGhyLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9id2F0dGhyLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9jd2F0dGhyLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9hZndhdHRoci5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfYmZ3YXR0aHIuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2Nmd2F0dGhyLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9hdmFyaHIuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2J2YXJoci5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfY3ZhcmhyLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9hbmdsZTAuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2FuZ2xlMS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfYW5nbGUyLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9hdmFoci5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfYnZhaHIuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2N2YWhyLmRldl9hdHRyLmF0dHIsCisJJmlpb19jb25zdF9hdHRyX3NhbXBsaW5nX2ZyZXF1ZW5jeV9hdmFpbGFibGUuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX3Jlc2V0LmRldl9hdHRyLmF0dHIsCisJJmlpb19jb25zdF9hdHRyX25hbWUuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX3ZwZWFrLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9pcGVhay5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfYXBoY2FsLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9icGhjYWwuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2NwaGNhbC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfY2YxZGVuLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9jZjJkZW4uZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2NmM2Rlbi5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfYWlybXMuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2Jpcm1zLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9jaXJtcy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfbmlybXMuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2F2cm1zLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9idnJtcy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfY3ZybXMuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2Fpcm1zb3MuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2Jpcm1zb3MuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2Npcm1zb3MuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2F2cm1zb3MuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2J2cm1zb3MuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2N2cm1zb3MuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX3ZvbHRfYS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfdm9sdF9iLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl92b2x0X2MuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2N1cnJlbnRfYS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfY3VycmVudF9iLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9jdXJyZW50X2MuZGV2X2F0dHIuYXR0ciwKKwlOVUxMLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgYWRlNzg1NF9hdHRyaWJ1dGVfZ3JvdXAgPSB7CisJLmF0dHJzID0gYWRlNzg1NF9hdHRyaWJ1dGVzLAorfTsKKworaW50IGFkZTc4NTRfcHJvYmUoc3RydWN0IGFkZTc4NTRfc3RhdGUgKnN0LCBzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJaW50IHJldCwgcmVnZG9uZSA9IDA7CisKKwkvKiBBbGxvY2F0ZSB0aGUgY29tbXMgYnVmZmVycyAqLworCXN0LT5yeCA9IGt6YWxsb2Moc2l6ZW9mKCpzdC0+cngpKkFERTc4NTRfTUFYX1JYLCBHRlBfS0VSTkVMKTsKKwlpZiAoc3QtPnJ4ID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJvcl9mcmVlX3N0OworCX0KKwlzdC0+dHggPSBremFsbG9jKHNpemVvZigqc3QtPnR4KSpBREU3ODU0X01BWF9UWCwgR0ZQX0tFUk5FTCk7CisJaWYgKHN0LT50eCA9PSBOVUxMKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3JfZnJlZV9yeDsKKwl9CisJbXV0ZXhfaW5pdCgmc3QtPmJ1Zl9sb2NrKTsKKwkvKiBzZXR1cCB0aGUgaW5kdXN0cmlhbGlvIGRyaXZlciBhbGxvY2F0ZWQgZWxlbWVudHMgKi8KKwlzdC0+aW5kaW9fZGV2ID0gaWlvX2FsbG9jYXRlX2RldmljZSgpOworCWlmIChzdC0+aW5kaW9fZGV2ID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJvcl9mcmVlX3R4OworCX0KKworCXN0LT5pbmRpb19kZXYtPmRldi5wYXJlbnQgPSBkZXY7CisJc3QtPmluZGlvX2Rldi0+bnVtX2ludGVycnVwdF9saW5lcyA9IDE7CisJc3QtPmluZGlvX2Rldi0+ZXZlbnRfYXR0cnMgPSAmYWRlNzg1NF9ldmVudF9hdHRyaWJ1dGVfZ3JvdXA7CisJc3QtPmluZGlvX2Rldi0+YXR0cnMgPSAmYWRlNzg1NF9hdHRyaWJ1dGVfZ3JvdXA7CisJc3QtPmluZGlvX2Rldi0+ZGV2X2RhdGEgPSAodm9pZCAqKShzdCk7CisJc3QtPmluZGlvX2Rldi0+ZHJpdmVyX21vZHVsZSA9IFRISVNfTU9EVUxFOworCXN0LT5pbmRpb19kZXYtPm1vZGVzID0gSU5ESU9fRElSRUNUX01PREU7CisKKwlyZXQgPSBhZGU3ODU0X2NvbmZpZ3VyZV9yaW5nKHN0LT5pbmRpb19kZXYpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfZnJlZV9kZXY7CisKKwlyZXQgPSBpaW9fZGV2aWNlX3JlZ2lzdGVyKHN0LT5pbmRpb19kZXYpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfdW5yZWdfcmluZ19mdW5jczsKKwlyZWdkb25lID0gMTsKKworCXJldCA9IGFkZTc4NTRfaW5pdGlhbGl6ZV9yaW5nKHN0LT5pbmRpb19kZXYtPnJpbmcpOworCWlmIChyZXQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJmYWlsZWQgdG8gaW5pdGlhbGl6ZSB0aGUgcmluZ1xuIik7CisJCWdvdG8gZXJyb3JfdW5yZWdfcmluZ19mdW5jczsKKwl9CisKKwlpZiAoc3QtPmlycSkgeworCQlyZXQgPSBpaW9fcmVnaXN0ZXJfaW50ZXJydXB0X2xpbmUoc3QtPmlycSwKKwkJCQlzdC0+aW5kaW9fZGV2LAorCQkJCTAsCisJCQkJSVJRRl9UUklHR0VSX0ZBTExJTkcsCisJCQkJImFkZTc4NTQiKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJyb3JfdW5pbml0aWFsaXplX3Jpbmc7CisKKwkJcmV0ID0gYWRlNzg1NF9wcm9iZV90cmlnZ2VyKHN0LT5pbmRpb19kZXYpOworCQlpZiAocmV0KQorCQkJZ290byBlcnJvcl91bnJlZ2lzdGVyX2xpbmU7CisJfQorCS8qIEdldCB0aGUgZGV2aWNlIGludG8gYSBzYW5lIGluaXRpYWwgc3RhdGUgKi8KKwlyZXQgPSBhZGU3ODU0X2luaXRpYWxfc2V0dXAoc3QpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfcmVtb3ZlX3RyaWdnZXI7CisKKwlyZXR1cm4gMDsKKworZXJyb3JfcmVtb3ZlX3RyaWdnZXI6CisJaWYgKHN0LT5pbmRpb19kZXYtPm1vZGVzICYgSU5ESU9fUklOR19UUklHR0VSRUQpCisJCWFkZTc4NTRfcmVtb3ZlX3RyaWdnZXIoc3QtPmluZGlvX2Rldik7CitlcnJvcl91bnJlZ2lzdGVyX2xpbmU6CisJaWYgKHN0LT5pbmRpb19kZXYtPm1vZGVzICYgSU5ESU9fUklOR19UUklHR0VSRUQpCisJCWlpb191bnJlZ2lzdGVyX2ludGVycnVwdF9saW5lKHN0LT5pbmRpb19kZXYsIDApOworZXJyb3JfdW5pbml0aWFsaXplX3Jpbmc6CisJYWRlNzg1NF91bmluaXRpYWxpemVfcmluZyhzdC0+aW5kaW9fZGV2LT5yaW5nKTsKK2Vycm9yX3VucmVnX3JpbmdfZnVuY3M6CisJYWRlNzg1NF91bmNvbmZpZ3VyZV9yaW5nKHN0LT5pbmRpb19kZXYpOworZXJyb3JfZnJlZV9kZXY6CisJaWYgKHJlZ2RvbmUpCisJCWlpb19kZXZpY2VfdW5yZWdpc3RlcihzdC0+aW5kaW9fZGV2KTsKKwllbHNlCisJCWlpb19mcmVlX2RldmljZShzdC0+aW5kaW9fZGV2KTsKK2Vycm9yX2ZyZWVfdHg6CisJa2ZyZWUoc3QtPnR4KTsKK2Vycm9yX2ZyZWVfcng6CisJa2ZyZWUoc3QtPnJ4KTsKK2Vycm9yX2ZyZWVfc3Q6CisJa2ZyZWUoc3QpOworCXJldHVybiByZXQ7CisKK30KK0VYUE9SVF9TWU1CT0woYWRlNzg1NF9wcm9iZSk7CisKK2ludCBhZGU3ODU0X3JlbW92ZShzdHJ1Y3QgYWRlNzg1NF9zdGF0ZSAqc3QpCit7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IHN0LT5pbmRpb19kZXY7CisKKwlmbHVzaF9zY2hlZHVsZWRfd29yaygpOworCisJYWRlNzg1NF9yZW1vdmVfdHJpZ2dlcihpbmRpb19kZXYpOworCWlmIChzdC0+aXJxKQorCQlpaW9fdW5yZWdpc3Rlcl9pbnRlcnJ1cHRfbGluZShpbmRpb19kZXYsIDApOworCisJYWRlNzg1NF91bmluaXRpYWxpemVfcmluZyhpbmRpb19kZXYtPnJpbmcpOworCWFkZTc4NTRfdW5jb25maWd1cmVfcmluZyhpbmRpb19kZXYpOworCWlpb19kZXZpY2VfdW5yZWdpc3RlcihpbmRpb19kZXYpOworCWtmcmVlKHN0LT50eCk7CisJa2ZyZWUoc3QtPnJ4KTsKKwlrZnJlZShzdCk7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woYWRlNzg1NF9yZW1vdmUpOworCitNT0RVTEVfQVVUSE9SKCJCYXJyeSBTb25nIDwyMWNuYmFvQGdtYWlsLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiQW5hbG9nIERldmljZXMgQURFNzg1NC81OC82OC83OCBQb2x5cGhhc2UgTXVsdGlmdW5jdGlvbiBFbmVyZ3kgTWV0ZXJpbmcgSUMgRHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL21ldGVyL2FkZTc4NTQuaCBiL2RyaXZlcnMvc3RhZ2luZy9paW8vbWV0ZXIvYWRlNzg1NC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3NjkwZTUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL21ldGVyL2FkZTc4NTQuaApAQCAtMCwwICsxLDI0NSBAQAorI2lmbmRlZiBfQURFNzg1NF9ICisjZGVmaW5lIF9BREU3ODU0X0gKKworI2RlZmluZSBBREU3ODU0X0FJR0FJTiAgICAweDQzODAKKyNkZWZpbmUgQURFNzg1NF9BVkdBSU4gICAgMHg0MzgxCisjZGVmaW5lIEFERTc4NTRfQklHQUlOICAgIDB4NDM4MgorI2RlZmluZSBBREU3ODU0X0JWR0FJTiAgICAweDQzODMKKyNkZWZpbmUgQURFNzg1NF9DSUdBSU4gICAgMHg0Mzg0CisjZGVmaW5lIEFERTc4NTRfQ1ZHQUlOICAgIDB4NDM4NQorI2RlZmluZSBBREU3ODU0X05JR0FJTiAgICAweDQzODYKKyNkZWZpbmUgQURFNzg1NF9BSVJNU09TICAgMHg0Mzg3CisjZGVmaW5lIEFERTc4NTRfQVZSTVNPUyAgIDB4NDM4OAorI2RlZmluZSBBREU3ODU0X0JJUk1TT1MgICAweDQzODkKKyNkZWZpbmUgQURFNzg1NF9CVlJNU09TICAgMHg0MzhBCisjZGVmaW5lIEFERTc4NTRfQ0lSTVNPUyAgIDB4NDM4QgorI2RlZmluZSBBREU3ODU0X0NWUk1TT1MgICAweDQzOEMKKyNkZWZpbmUgQURFNzg1NF9OSVJNU09TICAgMHg0MzhECisjZGVmaW5lIEFERTc4NTRfQVZBR0FJTiAgIDB4NDM4RQorI2RlZmluZSBBREU3ODU0X0JWQUdBSU4gICAweDQzOEYKKyNkZWZpbmUgQURFNzg1NF9DVkFHQUlOICAgMHg0MzkwCisjZGVmaW5lIEFERTc4NTRfQVdHQUlOICAgIDB4NDM5MQorI2RlZmluZSBBREU3ODU0X0FXQVRUT1MgICAweDQzOTIKKyNkZWZpbmUgQURFNzg1NF9CV0dBSU4gICAgMHg0MzkzCisjZGVmaW5lIEFERTc4NTRfQldBVFRPUyAgIDB4NDM5NAorI2RlZmluZSBBREU3ODU0X0NXR0FJTiAgICAweDQzOTUKKyNkZWZpbmUgQURFNzg1NF9DV0FUVE9TICAgMHg0Mzk2CisjZGVmaW5lIEFERTc4NTRfQVZBUkdBSU4gIDB4NDM5NworI2RlZmluZSBBREU3ODU0X0FWQVJPUyAgICAweDQzOTgKKyNkZWZpbmUgQURFNzg1NF9CVkFSR0FJTiAgMHg0Mzk5CisjZGVmaW5lIEFERTc4NTRfQlZBUk9TICAgIDB4NDM5QQorI2RlZmluZSBBREU3ODU0X0NWQVJHQUlOICAweDQzOUIKKyNkZWZpbmUgQURFNzg1NF9DVkFST1MgICAgMHg0MzlDCisjZGVmaW5lIEFERTc4NTRfQUZXR0FJTiAgIDB4NDM5RAorI2RlZmluZSBBREU3ODU0X0FGV0FUVE9TICAweDQzOUUKKyNkZWZpbmUgQURFNzg1NF9CRldHQUlOICAgMHg0MzlGCisjZGVmaW5lIEFERTc4NTRfQkZXQVRUT1MgIDB4NDNBMAorI2RlZmluZSBBREU3ODU0X0NGV0dBSU4gICAweDQzQTEKKyNkZWZpbmUgQURFNzg1NF9DRldBVFRPUyAgMHg0M0EyCisjZGVmaW5lIEFERTc4NTRfQUZWQVJHQUlOIDB4NDNBMworI2RlZmluZSBBREU3ODU0X0FGVkFST1MgICAweDQzQTQKKyNkZWZpbmUgQURFNzg1NF9CRlZBUkdBSU4gMHg0M0E1CisjZGVmaW5lIEFERTc4NTRfQkZWQVJPUyAgIDB4NDNBNgorI2RlZmluZSBBREU3ODU0X0NGVkFSR0FJTiAweDQzQTcKKyNkZWZpbmUgQURFNzg1NF9DRlZBUk9TICAgMHg0M0E4CisjZGVmaW5lIEFERTc4NTRfVkFUSFIxICAgIDB4NDNBOQorI2RlZmluZSBBREU3ODU0X1ZBVEhSMCAgICAweDQzQUEKKyNkZWZpbmUgQURFNzg1NF9XVEhSMSAgICAgMHg0M0FCCisjZGVmaW5lIEFERTc4NTRfV1RIUjAgICAgIDB4NDNBQworI2RlZmluZSBBREU3ODU0X1ZBUlRIUjEgICAweDQzQUQKKyNkZWZpbmUgQURFNzg1NF9WQVJUSFIwICAgMHg0M0FFCisjZGVmaW5lIEFERTc4NTRfUlNWICAgICAgIDB4NDNBRgorI2RlZmluZSBBREU3ODU0X1ZBTk9MT0FEICAweDQzQjAKKyNkZWZpbmUgQURFNzg1NF9BUE5PTE9BRCAgMHg0M0IxCisjZGVmaW5lIEFERTc4NTRfVkFSTk9MT0FEIDB4NDNCMgorI2RlZmluZSBBREU3ODU0X1ZMRVZFTCAgICAweDQzQjMKKyNkZWZpbmUgQURFNzg1NF9ESUNPRUZGICAgMHg0M0I1CisjZGVmaW5lIEFERTc4NTRfSFBGRElTICAgIDB4NDNCNgorI2RlZmluZSBBREU3ODU0X0lTVU1MVkwgICAweDQzQjgKKyNkZWZpbmUgQURFNzg1NF9JU1VNICAgICAgMHg0M0JGCisjZGVmaW5lIEFERTc4NTRfQUlSTVMgICAgIDB4NDNDMAorI2RlZmluZSBBREU3ODU0X0FWUk1TICAgICAweDQzQzEKKyNkZWZpbmUgQURFNzg1NF9CSVJNUyAgICAgMHg0M0MyCisjZGVmaW5lIEFERTc4NTRfQlZSTVMgICAgIDB4NDNDMworI2RlZmluZSBBREU3ODU0X0NJUk1TICAgICAweDQzQzQKKyNkZWZpbmUgQURFNzg1NF9DVlJNUyAgICAgMHg0M0M1CisjZGVmaW5lIEFERTc4NTRfTklSTVMgICAgIDB4NDNDNgorI2RlZmluZSBBREU3ODU0X1JVTiAgICAgICAweEUyMjgKKyNkZWZpbmUgQURFNzg1NF9BV0FUVEhSICAgMHhFNDAwCisjZGVmaW5lIEFERTc4NTRfQldBVFRIUiAgIDB4RTQwMQorI2RlZmluZSBBREU3ODU0X0NXQVRUSFIgICAweEU0MDIKKyNkZWZpbmUgQURFNzg1NF9BRldBVFRIUiAgMHhFNDAzCisjZGVmaW5lIEFERTc4NTRfQkZXQVRUSFIgIDB4RTQwNAorI2RlZmluZSBBREU3ODU0X0NGV0FUVEhSICAweEU0MDUKKyNkZWZpbmUgQURFNzg1NF9BVkFSSFIgICAgMHhFNDA2CisjZGVmaW5lIEFERTc4NTRfQlZBUkhSICAgIDB4RTQwNworI2RlZmluZSBBREU3ODU0X0NWQVJIUiAgICAweEU0MDgKKyNkZWZpbmUgQURFNzg1NF9BRlZBUkhSICAgMHhFNDA5CisjZGVmaW5lIEFERTc4NTRfQkZWQVJIUiAgIDB4RTQwQQorI2RlZmluZSBBREU3ODU0X0NGVkFSSFIgICAweEU0MEIKKyNkZWZpbmUgQURFNzg1NF9BVkFIUiAgICAgMHhFNDBDCisjZGVmaW5lIEFERTc4NTRfQlZBSFIgICAgIDB4RTQwRAorI2RlZmluZSBBREU3ODU0X0NWQUhSICAgICAweEU0MEUKKyNkZWZpbmUgQURFNzg1NF9JUEVBSyAgICAgMHhFNTAwCisjZGVmaW5lIEFERTc4NTRfVlBFQUsgICAgIDB4RTUwMQorI2RlZmluZSBBREU3ODU0X1NUQVRVUzAgICAweEU1MDIKKyNkZWZpbmUgQURFNzg1NF9TVEFUVVMxICAgMHhFNTAzCisjZGVmaW5lIEFERTc4NTRfT0lMVkwgICAgIDB4RTUwNworI2RlZmluZSBBREU3ODU0X09WTFZMICAgICAweEU1MDgKKyNkZWZpbmUgQURFNzg1NF9TQUdMVkwgICAgMHhFNTA5CisjZGVmaW5lIEFERTc4NTRfTUFTSzAgICAgIDB4RTUwQQorI2RlZmluZSBBREU3ODU0X01BU0sxICAgICAweEU1MEIKKyNkZWZpbmUgQURFNzg1NF9JQVdWICAgICAgMHhFNTBDCisjZGVmaW5lIEFERTc4NTRfSUJXViAgICAgIDB4RTUwRAorI2RlZmluZSBBREU3ODU0X0lDV1YgICAgICAweEU1MEUKKyNkZWZpbmUgQURFNzg1NF9WQVdWICAgICAgMHhFNTEwCisjZGVmaW5lIEFERTc4NTRfVkJXViAgICAgIDB4RTUxMQorI2RlZmluZSBBREU3ODU0X1ZDV1YgICAgICAweEU1MTIKKyNkZWZpbmUgQURFNzg1NF9BV0FUVCAgICAgMHhFNTEzCisjZGVmaW5lIEFERTc4NTRfQldBVFQgICAgIDB4RTUxNAorI2RlZmluZSBBREU3ODU0X0NXQVRUICAgICAweEU1MTUKKyNkZWZpbmUgQURFNzg1NF9BVkEgICAgICAgMHhFNTE5CisjZGVmaW5lIEFERTc4NTRfQlZBICAgICAgIDB4RTUxQQorI2RlZmluZSBBREU3ODU0X0NWQSAgICAgICAweEU1MUIKKyNkZWZpbmUgQURFNzg1NF9DSEVDS1NVTSAgMHhFNTFGCisjZGVmaW5lIEFERTc4NTRfVk5PTSAgICAgIDB4RTUyMAorI2RlZmluZSBBREU3ODU0X1BIU1RBVFVTICAweEU2MDAKKyNkZWZpbmUgQURFNzg1NF9BTkdMRTAgICAgMHhFNjAxCisjZGVmaW5lIEFERTc4NTRfQU5HTEUxICAgIDB4RTYwMgorI2RlZmluZSBBREU3ODU0X0FOR0xFMiAgICAweEU2MDMKKyNkZWZpbmUgQURFNzg1NF9QRVJJT0QgICAgMHhFNjA3CisjZGVmaW5lIEFERTc4NTRfUEhOT0xPQUQgIDB4RTYwOAorI2RlZmluZSBBREU3ODU0X0xJTkVDWUMgICAweEU2MEMKKyNkZWZpbmUgQURFNzg1NF9aWFRPVVQgICAgMHhFNjBECisjZGVmaW5lIEFERTc4NTRfQ09NUE1PREUgIDB4RTYwRQorI2RlZmluZSBBREU3ODU0X0dBSU4gICAgICAweEU2MEYKKyNkZWZpbmUgQURFNzg1NF9DRk1PREUgICAgMHhFNjEwCisjZGVmaW5lIEFERTc4NTRfQ0YxREVOICAgIDB4RTYxMQorI2RlZmluZSBBREU3ODU0X0NGMkRFTiAgICAweEU2MTIKKyNkZWZpbmUgQURFNzg1NF9DRjNERU4gICAgMHhFNjEzCisjZGVmaW5lIEFERTc4NTRfQVBIQ0FMICAgIDB4RTYxNAorI2RlZmluZSBBREU3ODU0X0JQSENBTCAgICAweEU2MTUKKyNkZWZpbmUgQURFNzg1NF9DUEhDQUwgICAgMHhFNjE2CisjZGVmaW5lIEFERTc4NTRfUEhTSUdOICAgIDB4RTYxNworI2RlZmluZSBBREU3ODU0X0NPTkZJRyAgICAweEU2MTgKKyNkZWZpbmUgQURFNzg1NF9NTU9ERSAgICAgMHhFNzAwCisjZGVmaW5lIEFERTc4NTRfQUNDTU9ERSAgIDB4RTcwMQorI2RlZmluZSBBREU3ODU0X0xDWUNNT0RFICAweEU3MDIKKyNkZWZpbmUgQURFNzg1NF9QRUFLQ1lDICAgMHhFNzAzCisjZGVmaW5lIEFERTc4NTRfU0FHQ1lDICAgIDB4RTcwNAorI2RlZmluZSBBREU3ODU0X0NGQ1lDICAgICAweEU3MDUKKyNkZWZpbmUgQURFNzg1NF9IU0RDX0NGRyAgMHhFNzA2CisjZGVmaW5lIEFERTc4NTRfQ09ORklHMiAgIDB4RUMwMQorCisjZGVmaW5lIEFERTc4NTRfUkVBRF9SRUcgICAweDEKKyNkZWZpbmUgQURFNzg1NF9XUklURV9SRUcgIDB4MAorCisjZGVmaW5lIEFERTc4NTRfTUFYX1RYICAgIDcKKyNkZWZpbmUgQURFNzg1NF9NQVhfUlggICAgNworI2RlZmluZSBBREU3ODU0X1NUQVJUVVBfREVMQVkgMQorCisjZGVmaW5lIEFERTc4NTRfU1BJX1NMT1cJKHUzMikoMzAwICogMTAwMCkKKyNkZWZpbmUgQURFNzg1NF9TUElfQlVSU1QJKHUzMikoMTAwMCAqIDEwMDApCisjZGVmaW5lIEFERTc4NTRfU1BJX0ZBU1QJKHUzMikoMjAwMCAqIDEwMDApCisKKyNkZWZpbmUgRFJJVkVSX05BTUUJCSJhZGU3ODU0IgorCisvKioKKyAqIHN0cnVjdCBhZGU3ODU0X3N0YXRlIC0gZGV2aWNlIGluc3RhbmNlIHNwZWNpZmljIGRhdGEKKyAqIEBzcGk6CQkJYWN0dWFsIHNwaV9kZXZpY2UKKyAqIEB3b3JrX3RyaWdnZXJfdG9fcmluZzogYmggZm9yIHRyaWdnZXJlZCBldmVudCBoYW5kbGluZworICogQGludGVyOgkJdXNlZCB0byBjaGVjayBpZiBuZXcgaW50ZXJydXB0IGhhcyBiZWVuIHRyaWdnZXJlZAorICogQGxhc3RfdGltZXN0YW1wOglwYXNzaW5nIHRpbWVzdGFtcCBmcm9tIHRoIHRvIGJoIG9mIGludGVycnVwdCBoYW5kbGVyCisgKiBAaW5kaW9fZGV2OgkJaW5kdXN0cmlhbCBJL08gZGV2aWNlIHN0cnVjdHVyZQorICogQHRyaWc6CQlkYXRhIHJlYWR5IHRyaWdnZXIgcmVnaXN0ZXJlZCB3aXRoIGlpbworICogQHR4OgkJCXRyYW5zbWl0IGJ1ZmZlcgorICogQHJ4OgkJCXJlY2lldmUgYnVmZmVyCisgKiBAYnVmX2xvY2s6CQltdXRleCB0byBwcm90ZWN0IHR4IGFuZCByeAorICoqLworc3RydWN0IGFkZTc4NTRfc3RhdGUgeworCXN0cnVjdCBzcGlfZGV2aWNlCQkqc3BpOworCXN0cnVjdCBpMmNfY2xpZW50ICAgICAgICAgICAgICAgKmkyYzsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QJCXdvcmtfdHJpZ2dlcl90b19yaW5nOworCXM2NAkJCQlsYXN0X3RpbWVzdGFtcDsKKwlzdHJ1Y3QgaWlvX2RldgkJCSppbmRpb19kZXY7CisJc3RydWN0IGlpb190cmlnZ2VyCQkqdHJpZzsKKwl1OAkJCQkqdHg7CisJdTgJCQkJKnJ4OworCWludAkJCQkoKnJlYWRfcmVnXzgpIChzdHJ1Y3QgZGV2aWNlICosIHUxNiwgdTggKik7CisJaW50CQkJCSgqcmVhZF9yZWdfMTYpIChzdHJ1Y3QgZGV2aWNlICosIHUxNiwgdTE2ICopOworCWludAkJCQkoKnJlYWRfcmVnXzI0KSAoc3RydWN0IGRldmljZSAqLCB1MTYsIHUzMiAqKTsKKwlpbnQJCQkJKCpyZWFkX3JlZ18zMikgKHN0cnVjdCBkZXZpY2UgKiwgdTE2LCB1MzIgKik7CisJaW50CQkJCSgqd3JpdGVfcmVnXzgpIChzdHJ1Y3QgZGV2aWNlICosIHUxNiwgdTgpOworCWludAkJCQkoKndyaXRlX3JlZ18xNikgKHN0cnVjdCBkZXZpY2UgKiwgdTE2LCB1MTYpOworCWludAkJCQkoKndyaXRlX3JlZ18yNCkgKHN0cnVjdCBkZXZpY2UgKiwgdTE2LCB1MzIpOworCWludAkJCQkoKndyaXRlX3JlZ18zMikgKHN0cnVjdCBkZXZpY2UgKiwgdTE2LCB1MzIpOworCWludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXJxOworCXN0cnVjdCBtdXRleAkJCWJ1Zl9sb2NrOworfTsKKworZXh0ZXJuIGludCBhZGU3ODU0X3Byb2JlKHN0cnVjdCBhZGU3ODU0X3N0YXRlICpzdCwgc3RydWN0IGRldmljZSAqZGV2KTsKK2V4dGVybiBpbnQgYWRlNzg1NF9yZW1vdmUoc3RydWN0IGFkZTc4NTRfc3RhdGUgKnN0KTsKKworI2lmIGRlZmluZWQoQ09ORklHX0lJT19SSU5HX0JVRkZFUikgJiYgZGVmaW5lZChUSElTX0hBU19SSU5HX0JVRkZFUl9TVVBQT1JUKQorLyogQXQgdGhlIG1vbWVudCB0cmlnZ2VycyBhcmUgb25seSB1c2VkIGZvciByaW5nIGJ1ZmZlcgorICogZmlsbGluZy4gVGhpcyBtYXkgY2hhbmdlIQorICovCisKK2VudW0gYWRlNzg1NF9zY2FuIHsKKwlBREU3ODU0X1NDQU5fUEhBX1YsCisJQURFNzg1NF9TQ0FOX1BIQl9WLAorCUFERTc4NTRfU0NBTl9QSENfViwKKwlBREU3ODU0X1NDQU5fUEhBX0ksCisJQURFNzg1NF9TQ0FOX1BIQl9JLAorCUFERTc4NTRfU0NBTl9QSENfSSwKK307CisKK3ZvaWQgYWRlNzg1NF9yZW1vdmVfdHJpZ2dlcihzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KTsKK2ludCBhZGU3ODU0X3Byb2JlX3RyaWdnZXIoc3RydWN0IGlpb19kZXYgKmluZGlvX2Rldik7CisKK3NzaXplX3QgYWRlNzg1NF9yZWFkX2RhdGFfZnJvbV9yaW5nKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkgICAgICBjaGFyICpidWYpOworCisKK2ludCBhZGU3ODU0X2NvbmZpZ3VyZV9yaW5nKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpOwordm9pZCBhZGU3ODU0X3VuY29uZmlndXJlX3Jpbmcoc3RydWN0IGlpb19kZXYgKmluZGlvX2Rldik7CisKK2ludCBhZGU3ODU0X2luaXRpYWxpemVfcmluZyhzdHJ1Y3QgaWlvX3JpbmdfYnVmZmVyICpyaW5nKTsKK3ZvaWQgYWRlNzg1NF91bmluaXRpYWxpemVfcmluZyhzdHJ1Y3QgaWlvX3JpbmdfYnVmZmVyICpyaW5nKTsKKyNlbHNlIC8qIENPTkZJR19JSU9fUklOR19CVUZGRVIgKi8KKworc3RhdGljIGlubGluZSB2b2lkIGFkZTc4NTRfcmVtb3ZlX3RyaWdnZXIoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKK3sKK30KK3N0YXRpYyBpbmxpbmUgaW50IGFkZTc4NTRfcHJvYmVfdHJpZ2dlcihzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHNzaXplX3QKK2FkZTc4NTRfcmVhZF9kYXRhX2Zyb21fcmluZyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgICAgIGNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgYWRlNzg1NF9jb25maWd1cmVfcmluZyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYWRlNzg1NF91bmNvbmZpZ3VyZV9yaW5nKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCit7Cit9CitzdGF0aWMgaW5saW5lIGludCBhZGU3ODU0X2luaXRpYWxpemVfcmluZyhzdHJ1Y3QgaWlvX3JpbmdfYnVmZmVyICpyaW5nKQoreworCXJldHVybiAwOworfQorc3RhdGljIGlubGluZSB2b2lkIGFkZTc4NTRfdW5pbml0aWFsaXplX3Jpbmcoc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqcmluZykKK3sKK30KKyNlbmRpZiAvKiBDT05GSUdfSUlPX1JJTkdfQlVGRkVSICovCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9tZXRlci9tZXRlci5oIGIvZHJpdmVycy9zdGFnaW5nL2lpby9tZXRlci9tZXRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0MmM1MGQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL21ldGVyL21ldGVyLmgKQEAgLTAsMCArMSwzOTYgQEAKKyNpbmNsdWRlICIuLi9zeXNmcy5oIgorCisvKiBtZXRlcmluZyBpYyB0eXBlcyBvZiBhdHRyaWJ1dGUgKi8KKworI2RlZmluZSBJSU9fREVWX0FUVFJfQ1VSUkVOVF9BX09GRlNFVChfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpCVwKKwlJSU9fREVWSUNFX0FUVFIoY3VycmVudF9hX29mZnNldCwgX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKQorCisjZGVmaW5lIElJT19ERVZfQVRUUl9DVVJSRU5UX0JfT0ZGU0VUKF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikJXAorCUlJT19ERVZJQ0VfQVRUUihjdXJyZW50X2Jfb2Zmc2V0LCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpCisKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX0NVUlJFTlRfQ19PRkZTRVQoX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKQlcCisJSUlPX0RFVklDRV9BVFRSKGN1cnJlbnRfY19vZmZzZXQsIF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikKKworI2RlZmluZSBJSU9fREVWX0FUVFJfVk9MVF9BX09GRlNFVChfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpICAgICAgXAorCUlJT19ERVZJQ0VfQVRUUih2b2x0X2Ffb2Zmc2V0LCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpCisKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX1ZPTFRfQl9PRkZTRVQoX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKSAgICAgIFwKKwlJSU9fREVWSUNFX0FUVFIodm9sdF9iX29mZnNldCwgX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKQorCisjZGVmaW5lIElJT19ERVZfQVRUUl9WT0xUX0NfT0ZGU0VUKF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikgICAgICBcCisJSUlPX0RFVklDRV9BVFRSKHZvbHRfY19vZmZzZXQsIF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikKKworI2RlZmluZSBJSU9fREVWX0FUVFJfUkVBQ1RJVkVfUE9XRVJfQV9PRkZTRVQoX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKSAgICAgICAgICAgICAgICBcCisJSUlPX0RFVklDRV9BVFRSKHJlYWN0aXZlX3Bvd2VyX2Ffb2Zmc2V0LCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpCisKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX1JFQUNUSVZFX1BPV0VSX0JfT0ZGU0VUKF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikgICAgICAgICAgICAgICAgXAorCUlJT19ERVZJQ0VfQVRUUihyZWFjdGl2ZV9wb3dlcl9iX29mZnNldCwgX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKQorCisjZGVmaW5lIElJT19ERVZfQVRUUl9SRUFDVElWRV9QT1dFUl9DX09GRlNFVChfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpICAgICAgICAgICAgICAgIFwKKwlJSU9fREVWSUNFX0FUVFIocmVhY3RpdmVfcG93ZXJfY19vZmZzZXQsIF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikKKworI2RlZmluZSBJSU9fREVWX0FUVFJfQUNUSVZFX1BPV0VSX0FfT0ZGU0VUKF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikgICAgICAgICAgICAgICAgXAorCUlJT19ERVZJQ0VfQVRUUihhY3RpdmVfcG93ZXJfYV9vZmZzZXQsIF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikKKworI2RlZmluZSBJSU9fREVWX0FUVFJfQUNUSVZFX1BPV0VSX0JfT0ZGU0VUKF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikgICAgICAgICAgICAgICAgXAorCUlJT19ERVZJQ0VfQVRUUihhY3RpdmVfcG93ZXJfYl9vZmZzZXQsIF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikKKworI2RlZmluZSBJSU9fREVWX0FUVFJfQUNUSVZFX1BPV0VSX0NfT0ZGU0VUKF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikgICAgICAgICAgICAgICAgXAorCUlJT19ERVZJQ0VfQVRUUihhY3RpdmVfcG93ZXJfY19vZmZzZXQsIF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikKKworI2RlZmluZSBJSU9fREVWX0FUVFJfQ1VSUkVOVF9BX0dBSU4oX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKQkJXAorCUlJT19ERVZJQ0VfQVRUUihjdXJyZW50X2FfZ2FpbiwgX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKQorCisjZGVmaW5lIElJT19ERVZfQVRUUl9DVVJSRU5UX0JfR0FJTihfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpCQlcCisJSUlPX0RFVklDRV9BVFRSKGN1cnJlbnRfYl9nYWluLCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpCisKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX0NVUlJFTlRfQ19HQUlOKF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikJCVwKKwlJSU9fREVWSUNFX0FUVFIoY3VycmVudF9jX2dhaW4sIF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikKKworI2RlZmluZSBJSU9fREVWX0FUVFJfQVBQQVJFTlRfUE9XRVJfQV9HQUlOKF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikgICAgICAgICAgICAgICAgXAorCUlJT19ERVZJQ0VfQVRUUihhcHBhcmVudF9wb3dlcl9hX2dhaW4sIF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikKKworI2RlZmluZSBJSU9fREVWX0FUVFJfQVBQQVJFTlRfUE9XRVJfQl9HQUlOKF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikgICAgICAgICAgICAgICAgXAorCUlJT19ERVZJQ0VfQVRUUihhcHBhcmVudF9wb3dlcl9iX2dhaW4sIF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikKKworI2RlZmluZSBJSU9fREVWX0FUVFJfQVBQQVJFTlRfUE9XRVJfQ19HQUlOKF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikgICAgICAgICAgICAgICAgXAorCUlJT19ERVZJQ0VfQVRUUihhcHBhcmVudF9wb3dlcl9jX2dhaW4sIF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikKKworI2RlZmluZSBJSU9fREVWX0FUVFJfQUNUSVZFX1BPV0VSX0dBSU4oX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKSAgICAgICAgICAgICAgICBcCisJSUlPX0RFVklDRV9BVFRSKGFjdGl2ZV9wb3dlcl9nYWluLCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpCisKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX0FDVElWRV9QT1dFUl9BX0dBSU4oX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKSAgICAgICAgICAgICAgICBcCisJSUlPX0RFVklDRV9BVFRSKGFjdGl2ZV9wb3dlcl9hX2dhaW4sIF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikKKworI2RlZmluZSBJSU9fREVWX0FUVFJfQUNUSVZFX1BPV0VSX0JfR0FJTihfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpICAgICAgICAgICAgICAgIFwKKwlJSU9fREVWSUNFX0FUVFIoYWN0aXZlX3Bvd2VyX2JfZ2FpbiwgX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKQorCisjZGVmaW5lIElJT19ERVZfQVRUUl9BQ1RJVkVfUE9XRVJfQ19HQUlOKF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikgICAgICAgICAgICAgICAgXAorCUlJT19ERVZJQ0VfQVRUUihhY3RpdmVfcG93ZXJfY19nYWluLCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpCisKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX1JFQUNUSVZFX1BPV0VSX0FfR0FJTihfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpICAgICAgICAgICAgICAgIFwKKwlJSU9fREVWSUNFX0FUVFIocmVhY3RpdmVfcG93ZXJfYV9nYWluLCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpCisKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX1JFQUNUSVZFX1BPV0VSX0JfR0FJTihfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpICAgICAgICAgICAgICAgIFwKKwlJSU9fREVWSUNFX0FUVFIocmVhY3RpdmVfcG93ZXJfYl9nYWluLCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpCisKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX1JFQUNUSVZFX1BPV0VSX0NfR0FJTihfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpICAgICAgICAgICAgICAgIFwKKwlJSU9fREVWSUNFX0FUVFIocmVhY3RpdmVfcG93ZXJfY19nYWluLCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpCisKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX0NVUlJFTlRfQShfc2hvdywgX2FkZHIpCQkJXAorCUlJT19ERVZJQ0VfQVRUUihjdXJyZW50X2EsIFNfSVJVR08sIF9zaG93LCBOVUxMLCBfYWRkcikKKworI2RlZmluZSBJSU9fREVWX0FUVFJfQ1VSUkVOVF9CKF9zaG93LCBfYWRkcikJCQlcCisJSUlPX0RFVklDRV9BVFRSKGN1cnJlbnRfYiwgU19JUlVHTywgX3Nob3csIE5VTEwsIF9hZGRyKQorCisjZGVmaW5lIElJT19ERVZfQVRUUl9DVVJSRU5UX0MoX3Nob3csIF9hZGRyKQkJCVwKKwlJSU9fREVWSUNFX0FUVFIoY3VycmVudF9jLCBTX0lSVUdPLCBfc2hvdywgTlVMTCwgX2FkZHIpCisKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX1ZPTFRfQShfc2hvdywgX2FkZHIpCQkJXAorCUlJT19ERVZJQ0VfQVRUUih2b2x0X2EsIFNfSVJVR08sIF9zaG93LCBOVUxMLCBfYWRkcikKKworI2RlZmluZSBJSU9fREVWX0FUVFJfVk9MVF9CKF9zaG93LCBfYWRkcikJCQlcCisJSUlPX0RFVklDRV9BVFRSKHZvbHRfYiwgU19JUlVHTywgX3Nob3csIE5VTEwsIF9hZGRyKQorCisjZGVmaW5lIElJT19ERVZfQVRUUl9WT0xUX0MoX3Nob3csIF9hZGRyKQkJCVwKKwlJSU9fREVWSUNFX0FUVFIodm9sdF9jLCBTX0lSVUdPLCBfc2hvdywgTlVMTCwgX2FkZHIpCisKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX0FFTkVSR1koX3Nob3csIF9hZGRyKQkJCVwKKwlJSU9fREVWSUNFX0FUVFIoYWVuZXJneSwgU19JUlVHTywgX3Nob3csIE5VTEwsIF9hZGRyKQorCisjZGVmaW5lIElJT19ERVZfQVRUUl9MRU5FUkdZKF9zaG93LCBfYWRkcikJCQlcCisJSUlPX0RFVklDRV9BVFRSKGxlbmVyZ3ksIFNfSVJVR08sIF9zaG93LCBOVUxMLCBfYWRkcikKKworI2RlZmluZSBJSU9fREVWX0FUVFJfUkFFTkVSR1koX3Nob3csIF9hZGRyKQkJCVwKKwlJSU9fREVWSUNFX0FUVFIocmFlbmVyZ3ksIFNfSVJVR08sIF9zaG93LCBOVUxMLCBfYWRkcikKKworI2RlZmluZSBJSU9fREVWX0FUVFJfTEFFTkVSR1koX3Nob3csIF9hZGRyKQkJCVwKKwlJSU9fREVWSUNFX0FUVFIobGFlbmVyZ3ksIFNfSVJVR08sIF9zaG93LCBOVUxMLCBfYWRkcikKKworI2RlZmluZSBJSU9fREVWX0FUVFJfVkFFTkVSR1koX3Nob3csIF9hZGRyKQkJCVwKKwlJSU9fREVWSUNFX0FUVFIodmFlbmVyZ3ksIFNfSVJVR08sIF9zaG93LCBOVUxMLCBfYWRkcikKKworI2RlZmluZSBJSU9fREVWX0FUVFJfTFZBRU5FUkdZKF9zaG93LCBfYWRkcikJCQlcCisJSUlPX0RFVklDRV9BVFRSKGx2YWVuZXJneSwgU19JUlVHTywgX3Nob3csIE5VTEwsIF9hZGRyKQorCisjZGVmaW5lIElJT19ERVZfQVRUUl9SVkFFTkVSR1koX3Nob3csIF9hZGRyKQkJCVwKKwlJSU9fREVWSUNFX0FUVFIocnZhZW5lcmd5LCBTX0lSVUdPLCBfc2hvdywgTlVMTCwgX2FkZHIpCisKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX0xWQVJFTkVSR1koX3Nob3csIF9hZGRyKQkJCVwKKwlJSU9fREVWSUNFX0FUVFIobHZhcmVuZXJneSwgU19JUlVHTywgX3Nob3csIE5VTEwsIF9hZGRyKQorCisjZGVmaW5lIElJT19ERVZfQVRUUl9DSEtTVU0oX3Nob3csIF9hZGRyKSAgICAgICAgICAgICAgICAgICAgICAgXAorCUlJT19ERVZJQ0VfQVRUUihjaGtzdW0sIFNfSVJVR08sIF9zaG93LCBOVUxMLCBfYWRkcikKKworI2RlZmluZSBJSU9fREVWX0FUVFJfQU5HTEUwKF9zaG93LCBfYWRkcikgICAgICAgICAgICAgICAgICAgICAgIFwKKwlJSU9fREVWSUNFX0FUVFIoYW5nbGUwLCBTX0lSVUdPLCBfc2hvdywgTlVMTCwgX2FkZHIpCisKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX0FOR0xFMShfc2hvdywgX2FkZHIpICAgICAgICAgICAgICAgICAgICAgICBcCisJSUlPX0RFVklDRV9BVFRSKGFuZ2xlMSwgU19JUlVHTywgX3Nob3csIE5VTEwsIF9hZGRyKQorCisjZGVmaW5lIElJT19ERVZfQVRUUl9BTkdMRTIoX3Nob3csIF9hZGRyKSAgICAgICAgICAgICAgICAgICAgICAgXAorCUlJT19ERVZJQ0VfQVRUUihhbmdsZTIsIFNfSVJVR08sIF9zaG93LCBOVUxMLCBfYWRkcikKKworI2RlZmluZSBJSU9fREVWX0FUVFJfQVdBVFRIUihfc2hvdywgX2FkZHIpCQkJXAorCUlJT19ERVZJQ0VfQVRUUihhd2F0dGhyLCBTX0lSVUdPLCBfc2hvdywgTlVMTCwgX2FkZHIpCisKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX0JXQVRUSFIoX3Nob3csIF9hZGRyKQkJCVwKKwlJSU9fREVWSUNFX0FUVFIoYndhdHRociwgU19JUlVHTywgX3Nob3csIE5VTEwsIF9hZGRyKQorCisjZGVmaW5lIElJT19ERVZfQVRUUl9DV0FUVEhSKF9zaG93LCBfYWRkcikJCQlcCisJSUlPX0RFVklDRV9BVFRSKGN3YXR0aHIsIFNfSVJVR08sIF9zaG93LCBOVUxMLCBfYWRkcikKKworI2RlZmluZSBJSU9fREVWX0FUVFJfQUZXQVRUSFIoX3Nob3csIF9hZGRyKQkJCVwKKwlJSU9fREVWSUNFX0FUVFIoYWZ3YXR0aHIsIFNfSVJVR08sIF9zaG93LCBOVUxMLCBfYWRkcikKKworI2RlZmluZSBJSU9fREVWX0FUVFJfQkZXQVRUSFIoX3Nob3csIF9hZGRyKQkJCVwKKwlJSU9fREVWSUNFX0FUVFIoYmZ3YXR0aHIsIFNfSVJVR08sIF9zaG93LCBOVUxMLCBfYWRkcikKKworI2RlZmluZSBJSU9fREVWX0FUVFJfQ0ZXQVRUSFIoX3Nob3csIF9hZGRyKQkJCVwKKwlJSU9fREVWSUNFX0FUVFIoY2Z3YXR0aHIsIFNfSVJVR08sIF9zaG93LCBOVUxMLCBfYWRkcikKKworI2RlZmluZSBJSU9fREVWX0FUVFJfQVZBUkhSKF9zaG93LCBfYWRkcikJCQlcCisJSUlPX0RFVklDRV9BVFRSKGF2YXJociwgU19JUlVHTywgX3Nob3csIE5VTEwsIF9hZGRyKQorCisjZGVmaW5lIElJT19ERVZfQVRUUl9CVkFSSFIoX3Nob3csIF9hZGRyKQkJCVwKKwlJSU9fREVWSUNFX0FUVFIoYnZhcmhyLCBTX0lSVUdPLCBfc2hvdywgTlVMTCwgX2FkZHIpCisKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX0NWQVJIUihfc2hvdywgX2FkZHIpCQkJXAorCUlJT19ERVZJQ0VfQVRUUihjdmFyaHIsIFNfSVJVR08sIF9zaG93LCBOVUxMLCBfYWRkcikKKworI2RlZmluZSBJSU9fREVWX0FUVFJfQVZBSFIoX3Nob3csIF9hZGRyKQkJCVwKKwlJSU9fREVWSUNFX0FUVFIoYXZhaHIsIFNfSVJVR08sIF9zaG93LCBOVUxMLCBfYWRkcikKKworI2RlZmluZSBJSU9fREVWX0FUVFJfQlZBSFIoX3Nob3csIF9hZGRyKQkJCVwKKwlJSU9fREVWSUNFX0FUVFIoYnZhaHIsIFNfSVJVR08sIF9zaG93LCBOVUxMLCBfYWRkcikKKworI2RlZmluZSBJSU9fREVWX0FUVFJfQ1ZBSFIoX3Nob3csIF9hZGRyKQkJCVwKKwlJSU9fREVWSUNFX0FUVFIoY3ZhaHIsIFNfSVJVR08sIF9zaG93LCBOVUxMLCBfYWRkcikKKworI2RlZmluZSBJSU9fREVWX0FUVFJfSU9TKF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikgICAgICAgICAgICAgICAgXAorCUlJT19ERVZJQ0VfQVRUUihpb3MsIF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikKKworI2RlZmluZSBJSU9fREVWX0FUVFJfVk9TKF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikgICAgICAgICAgICAgICAgXAorCUlJT19ERVZJQ0VfQVRUUih2b3MsIF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikKKworI2RlZmluZSBJSU9fREVWX0FUVFJfUEhDQUwoX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKSAgICAgICAgICAgICAgICBcCisJSUlPX0RFVklDRV9BVFRSKHBoY2FsLCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpCisKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX0FQSENBTChfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpICAgICAgICAgICAgICAgIFwKKwlJSU9fREVWSUNFX0FUVFIoYXBoY2FsLCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpCisKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX0JQSENBTChfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpICAgICAgICAgICAgICAgIFwKKwlJSU9fREVWSUNFX0FUVFIoYnBoY2FsLCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpCisKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX0NQSENBTChfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpICAgICAgICAgICAgICAgIFwKKwlJSU9fREVWSUNFX0FUVFIoY3BoY2FsLCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpCisKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX0FQT1MoX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKSAgICAgICAgICAgICAgICBcCisJSUlPX0RFVklDRV9BVFRSKGFwb3MsIF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikKKworI2RlZmluZSBJSU9fREVWX0FUVFJfQUFQT1MoX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKSAgICAgICAgICAgICAgICBcCisJSUlPX0RFVklDRV9BVFRSKGFhcG9zLCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpCisKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX0JBUE9TKF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikgICAgICAgICAgICAgICAgXAorCUlJT19ERVZJQ0VfQVRUUihiYXBvcywgX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKQorCisjZGVmaW5lIElJT19ERVZfQVRUUl9DQVBPUyhfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpICAgICAgICAgICAgICAgIFwKKwlJSU9fREVWSUNFX0FUVFIoY2Fwb3MsIF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikKKworI2RlZmluZSBJSU9fREVWX0FUVFJfQVZSTVNHQUlOKF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikgICAgICAgICAgICAgICAgXAorCUlJT19ERVZJQ0VfQVRUUihhdnJtc2dhaW4sIF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikKKworI2RlZmluZSBJSU9fREVWX0FUVFJfQlZSTVNHQUlOKF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikgICAgICAgICAgICAgICAgXAorCUlJT19ERVZJQ0VfQVRUUihidnJtc2dhaW4sIF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikKKworI2RlZmluZSBJSU9fREVWX0FUVFJfQ1ZSTVNHQUlOKF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikgICAgICAgICAgICAgICAgXAorCUlJT19ERVZJQ0VfQVRUUihjdnJtc2dhaW4sIF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikKKworI2RlZmluZSBJSU9fREVWX0FUVFJfQUlHQUlOKF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikgICAgICAgICAgICAgICAgXAorCUlJT19ERVZJQ0VfQVRUUihhaWdhaW4sIF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikKKworI2RlZmluZSBJSU9fREVWX0FUVFJfQklHQUlOKF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikgICAgICAgICAgICAgICAgXAorCUlJT19ERVZJQ0VfQVRUUihiaWdhaW4sIF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikKKworI2RlZmluZSBJSU9fREVWX0FUVFJfQ0lHQUlOKF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikgICAgICAgICAgICAgICAgXAorCUlJT19ERVZJQ0VfQVRUUihjaWdhaW4sIF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikKKworI2RlZmluZSBJSU9fREVWX0FUVFJfTklHQUlOKF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikgICAgICAgICAgICAgICAgXAorCUlJT19ERVZJQ0VfQVRUUihuaWdhaW4sIF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikKKworI2RlZmluZSBJSU9fREVWX0FUVFJfQVZHQUlOKF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikgICAgICAgICAgICAgICAgXAorCUlJT19ERVZJQ0VfQVRUUihhdmdhaW4sIF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikKKworI2RlZmluZSBJSU9fREVWX0FUVFJfQlZHQUlOKF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikgICAgICAgICAgICAgICAgXAorCUlJT19ERVZJQ0VfQVRUUihidmdhaW4sIF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikKKworI2RlZmluZSBJSU9fREVWX0FUVFJfQ1ZHQUlOKF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikgICAgICAgICAgICAgICAgXAorCUlJT19ERVZJQ0VfQVRUUihjdmdhaW4sIF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikKKworI2RlZmluZSBJSU9fREVWX0FUVFJfV0dBSU4oX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKSAgICAgICAgICAgICAgICBcCisJSUlPX0RFVklDRV9BVFRSKHdnYWluLCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpCisKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX1dESVYoX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKSAgICAgICAgICAgICAgICBcCisJSUlPX0RFVklDRV9BVFRSKHdkaXYsIF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikKKworI2RlZmluZSBJSU9fREVWX0FUVFJfQ0ZOVU0oX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKSAgICAgICAgICAgICAgICBcCisJSUlPX0RFVklDRV9BVFRSKGNmbnVtLCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpCisKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX0NGREVOKF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikgICAgICAgICAgICAgICAgXAorCUlJT19ERVZJQ0VfQVRUUihjZmRlbiwgX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKQorCisjZGVmaW5lIElJT19ERVZfQVRUUl9DRjFERU4oX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKSAgICAgICAgICAgICAgICBcCisJSUlPX0RFVklDRV9BVFRSKGNmMWRlbiwgX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKQorCisjZGVmaW5lIElJT19ERVZfQVRUUl9DRjJERU4oX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKSAgICAgICAgICAgICAgICBcCisJSUlPX0RFVklDRV9BVFRSKGNmMmRlbiwgX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKQorCisjZGVmaW5lIElJT19ERVZfQVRUUl9DRjNERU4oX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKSAgICAgICAgICAgICAgICBcCisJSUlPX0RFVklDRV9BVFRSKGNmM2RlbiwgX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKQorCisjZGVmaW5lIElJT19ERVZfQVRUUl9JUk1TKF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikgICAgICAgICAgICAgICAgXAorCUlJT19ERVZJQ0VfQVRUUihpcm1zLCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpCisKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX1ZSTVMoX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKSAgICAgICAgICAgICAgICBcCisJSUlPX0RFVklDRV9BVFRSKHZybXMsIF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikKKworI2RlZmluZSBJSU9fREVWX0FUVFJfQUlSTVMoX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKSAgICAgICAgICAgICAgICBcCisJSUlPX0RFVklDRV9BVFRSKGFpcm1zLCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpCisKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX0JJUk1TKF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikgICAgICAgICAgICAgICAgXAorCUlJT19ERVZJQ0VfQVRUUihiaXJtcywgX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKQorCisjZGVmaW5lIElJT19ERVZfQVRUUl9DSVJNUyhfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpICAgICAgICAgICAgICAgIFwKKwlJSU9fREVWSUNFX0FUVFIoY2lybXMsIF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikKKworI2RlZmluZSBJSU9fREVWX0FUVFJfTklSTVMoX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKSAgICAgICAgICAgICAgICBcCisJSUlPX0RFVklDRV9BVFRSKG5pcm1zLCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpCisKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX0FWUk1TKF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikgICAgICAgICAgICAgICAgXAorCUlJT19ERVZJQ0VfQVRUUihhdnJtcywgX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKQorCisjZGVmaW5lIElJT19ERVZfQVRUUl9CVlJNUyhfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpICAgICAgICAgICAgICAgIFwKKwlJSU9fREVWSUNFX0FUVFIoYnZybXMsIF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikKKworI2RlZmluZSBJSU9fREVWX0FUVFJfQ1ZSTVMoX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKSAgICAgICAgICAgICAgICBcCisJSUlPX0RFVklDRV9BVFRSKGN2cm1zLCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpCisKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX0lSTVNPUyhfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpICAgICAgICAgICAgICAgIFwKKwlJSU9fREVWSUNFX0FUVFIoaXJtc29zLCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpCisKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX1ZSTVNPUyhfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpICAgICAgICAgICAgICAgIFwKKwlJSU9fREVWSUNFX0FUVFIodnJtc29zLCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpCisKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX0FJUk1TT1MoX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKSAgICAgICAgICAgICAgICBcCisJSUlPX0RFVklDRV9BVFRSKGFpcm1zb3MsIF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikKKworI2RlZmluZSBJSU9fREVWX0FUVFJfQklSTVNPUyhfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpICAgICAgICAgICAgICAgIFwKKwlJSU9fREVWSUNFX0FUVFIoYmlybXNvcywgX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKQorCisjZGVmaW5lIElJT19ERVZfQVRUUl9DSVJNU09TKF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikgICAgICAgICAgICAgICAgXAorCUlJT19ERVZJQ0VfQVRUUihjaXJtc29zLCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpCisKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX0FWUk1TT1MoX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKSAgICAgICAgICAgICAgICBcCisJSUlPX0RFVklDRV9BVFRSKGF2cm1zb3MsIF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikKKworI2RlZmluZSBJSU9fREVWX0FUVFJfQlZSTVNPUyhfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpICAgICAgICAgICAgICAgIFwKKwlJSU9fREVWSUNFX0FUVFIoYnZybXNvcywgX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKQorCisjZGVmaW5lIElJT19ERVZfQVRUUl9DVlJNU09TKF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikgICAgICAgICAgICAgICAgXAorCUlJT19ERVZJQ0VfQVRUUihjdnJtc29zLCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpCisKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX1ZBR0FJTihfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpICAgICAgICAgICAgICAgIFwKKwlJSU9fREVWSUNFX0FUVFIodmFnYWluLCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpCisKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX1BHQV9HQUlOKF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikgICAgICAgICAgICAgICAgXAorCUlJT19ERVZJQ0VfQVRUUihwZ2FfZ2FpbiwgX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKQorCisjZGVmaW5lIElJT19ERVZfQVRUUl9WQURJVihfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpICAgICAgICAgICAgICAgIFwKKwlJSU9fREVWSUNFX0FUVFIodmFkaXYsIF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikKKworI2RlZmluZSBJSU9fREVWX0FUVFJfTElORUNZQyhfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpICAgICAgICAgICAgICAgIFwKKwlJSU9fREVWSUNFX0FUVFIobGluZWN5YywgX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKQorCisjZGVmaW5lIElJT19ERVZfQVRUUl9TQUdDWUMoX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKSAgICAgICAgICAgICAgICBcCisJSUlPX0RFVklDRV9BVFRSKHNhZ2N5YywgX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKQorCisjZGVmaW5lIElJT19ERVZfQVRUUl9DRkNZQyhfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpICAgICAgICAgICAgICAgIFwKKwlJSU9fREVWSUNFX0FUVFIoY2ZjeWMsIF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikKKworI2RlZmluZSBJSU9fREVWX0FUVFJfUEVBS0NZQyhfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpICAgICAgICAgICAgICAgIFwKKwlJSU9fREVWSUNFX0FUVFIocGVha2N5YywgX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKQorCisjZGVmaW5lIElJT19ERVZfQVRUUl9TQUdMVkwoX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKSAgICAgICAgICAgICAgICBcCisJSUlPX0RFVklDRV9BVFRSKHNhZ2x2bCwgX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKQorCisjZGVmaW5lIElJT19ERVZfQVRUUl9JUEtMVkwoX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKSAgICAgICAgICAgICAgICBcCisJSUlPX0RFVklDRV9BVFRSKGlwa2x2bCwgX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKQorCisjZGVmaW5lIElJT19ERVZfQVRUUl9WUEtMVkwoX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKSAgICAgICAgICAgICAgICBcCisJSUlPX0RFVklDRV9BVFRSKHZwa2x2bCwgX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKQorCisjZGVmaW5lIElJT19ERVZfQVRUUl9JUEVBSyhfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpCQkJXAorCUlJT19ERVZJQ0VfQVRUUihpcGVhaywgX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKQorCisjZGVmaW5lIElJT19ERVZfQVRUUl9SSVBFQUsoX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKQkJCVwKKwlJSU9fREVWSUNFX0FUVFIocmlwZWFrLCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpCisKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX1ZQRUFLKF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikJCQlcCisJSUlPX0RFVklDRV9BVFRSKHZwZWFrLCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpCisKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX1JWUEVBSyhfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpCQkJXAorCUlJT19ERVZJQ0VfQVRUUihydnBlYWssIF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikKKworI2RlZmluZSBJSU9fREVWX0FUVFJfVlBFUklPRChfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpCQkJXAorCUlJT19ERVZJQ0VfQVRUUih2cGVyaW9kLCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpCisKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX0NIX09GRihfbnVtLCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpCQkJXAorICBJSU9fREVWSUNFX0FUVFIoY2hvZmZfIyNfbnVtLCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpCisKKy8qIGFjdGl2ZSBlbmVyZ3kgcmVnaXN0ZXIsIEFFTkVSR1ksIGlzIG1vcmUgdGhhbiBoYWxmIGZ1bGwgKi8KKyNkZWZpbmUgSUlPX0VWRU5UX0FUVFJfQUVORVJHWV9IQUxGX0ZVTEwoX2V2bGlzdCwgX3Nob3csIF9zdG9yZSwgX21hc2spIFwKKwlJSU9fRVZFTlRfQVRUUl9TSChhZW5lcmd5X2hhbGZfZnVsbCwgX2V2bGlzdCwgX3Nob3csIF9zdG9yZSwgX21hc2spCisKKy8qIGEgU0FHIG9uIHRoZSBsaW5lIHZvbHRhZ2UgKi8KKyNkZWZpbmUgSUlPX0VWRU5UX0FUVFJfTElORV9WT0xUX1NBRyhfZXZsaXN0LCBfc2hvdywgX3N0b3JlLCBfbWFzaykgXAorCUlJT19FVkVOVF9BVFRSX1NIKGxpbmVfdm9sdF9zYWcsIF9ldmxpc3QsIF9zaG93LCBfc3RvcmUsIF9tYXNrKQorCisvKgorICogSW5kaWNhdGVzIHRoZSBlbmQgb2YgZW5lcmd5IGFjY3VtdWxhdGlvbiBvdmVyIGFuIGludGVnZXIgbnVtYmVyCisgKiBvZiBoYWxmIGxpbmUgY3ljbGVzCisgKi8KKyNkZWZpbmUgSUlPX0VWRU5UX0FUVFJfQ1lDRU5EKF9ldmxpc3QsIF9zaG93LCBfc3RvcmUsIF9tYXNrKSBcCisJSUlPX0VWRU5UX0FUVFJfU0goY3ljZW5kLCBfZXZsaXN0LCBfc2hvdywgX3N0b3JlLCBfbWFzaykKKworLyogb24gdGhlIHJpc2luZyBhbmQgZmFsbGluZyBlZGdlIG9mIHRoZSB0aGUgdm9sdGFnZSB3YXZlZm9ybSAqLworI2RlZmluZSBJSU9fRVZFTlRfQVRUUl9aRVJPX0NST1NTKF9ldmxpc3QsIF9zaG93LCBfc3RvcmUsIF9tYXNrKSBcCisJSUlPX0VWRU5UX0FUVFJfU0goemVyb19jcm9zcywgX2V2bGlzdCwgX3Nob3csIF9zdG9yZSwgX21hc2spCisKKy8qIHRoZSBhY3RpdmUgZW5lcmd5IHJlZ2lzdGVyIGhhcyBvdmVyZmxvd2VkICovCisjZGVmaW5lIElJT19FVkVOVF9BVFRSX0FFTkVSR1lfT1ZFUkZMT1coX2V2bGlzdCwgX3Nob3csIF9zdG9yZSwgX21hc2spIFwKKwlJSU9fRVZFTlRfQVRUUl9TSChhZW5lcmd5X292ZXJmbG93LCBfZXZsaXN0LCBfc2hvdywgX3N0b3JlLCBfbWFzaykKKworLyogdGhlIGFwcGFyZW50IGVuZXJneSByZWdpc3RlciBoYXMgb3ZlcmZsb3dlZCAqLworI2RlZmluZSBJSU9fRVZFTlRfQVRUUl9WQUVORVJHWV9PVkVSRkxPVyhfZXZsaXN0LCBfc2hvdywgX3N0b3JlLCBfbWFzaykgXAorCUlJT19FVkVOVF9BVFRSX1NIKHZhZW5lcmd5X292ZXJmbG93LCBfZXZsaXN0LCBfc2hvdywgX3N0b3JlLCBfbWFzaykKKworLyogdGhlIGFjdGl2ZSBlbmVyZ3kgcmVnaXN0ZXIsIFZBRU5FUkdZLCBpcyBtb3JlIHRoYW4gaGFsZiBmdWxsICovCisjZGVmaW5lIElJT19FVkVOVF9BVFRSX1ZBRU5FUkdZX0hBTEZfRlVMTChfZXZsaXN0LCBfc2hvdywgX3N0b3JlLCBfbWFzaykgXAorCUlJT19FVkVOVF9BVFRSX1NIKHZhZW5lcmd5X2hhbGZfZnVsbCwgX2V2bGlzdCwgX3Nob3csIF9zdG9yZSwgX21hc2spCisKKy8qIHRoZSBwb3dlciBoYXMgZ29uZSBmcm9tIG5lZ2F0aXZlIHRvIHBvc2l0aXZlICovCisjZGVmaW5lIElJT19FVkVOVF9BVFRSX1BQT1MoX2V2bGlzdCwgX3Nob3csIF9zdG9yZSwgX21hc2spIFwKKwlJSU9fRVZFTlRfQVRUUl9TSChwcG9zLCBfZXZsaXN0LCBfc2hvdywgX3N0b3JlLCBfbWFzaykKKworLyogdGhlIHBvd2VyIGhhcyBnb25lIGZyb20gcG9zaXRpdmUgdG8gbmVnYXRpdmUgKi8KKyNkZWZpbmUgSUlPX0VWRU5UX0FUVFJfUE5FRyhfZXZsaXN0LCBfc2hvdywgX3N0b3JlLCBfbWFzaykgXAorCUlJT19FVkVOVF9BVFRSX1NIKHBuZWcsIF9ldmxpc3QsIF9zaG93LCBfc3RvcmUsIF9tYXNrKQorCisvKiB3YXZlZm9ybSBzYW1wbGUgZnJvbSBDaGFubmVsIDEgaGFzIGV4Y2VlZGVkIHRoZSBJUEtMVkwgdmFsdWUgKi8KKyNkZWZpbmUgSUlPX0VWRU5UX0FUVFJfSVBLTFZMX0VYQyhfZXZsaXN0LCBfc2hvdywgX3N0b3JlLCBfbWFzaykgXAorCUlJT19FVkVOVF9BVFRSX1NIKGlwa2x2bF9leGMsIF9ldmxpc3QsIF9zaG93LCBfc3RvcmUsIF9tYXNrKQorCisvKiB3YXZlZm9ybSBzYW1wbGUgZnJvbSBDaGFubmVsIDIgaGFzIGV4Y2VlZGVkIHRoZSBWUEtMVkwgdmFsdWUgKi8KKyNkZWZpbmUgSUlPX0VWRU5UX0FUVFJfVlBLTFZMX0VYQyhfZXZsaXN0LCBfc2hvdywgX3N0b3JlLCBfbWFzaykgXAorCUlJT19FVkVOVF9BVFRSX1NIKHZwa2x2bF9leGMsIF9ldmxpc3QsIF9zaG93LCBfc3RvcmUsIF9tYXNrKQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL3Jlc29sdmVyL0tjb25maWcgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL3Jlc29sdmVyL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTRhMzYzNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vcmVzb2x2ZXIvS2NvbmZpZwpAQCAtMCwwICsxLDU0IEBACisjCisjIFJlc29sdmVyL1N5bmNocm8gZHJpdmVycworIworY29tbWVudCAiUmVzb2x2ZXIgdG8gZGlnaXRhbCBjb252ZXJ0ZXJzIgorCitjb25maWcgQUQyUzkwCisJdHJpc3RhdGUgIkFuYWxvZyBEZXZpY2VzIGFkMnM5MCBkcml2ZXIiCisJZGVwZW5kcyBvbiBTUEkKKwloZWxwCisJICBTYXkgeWVzIGhlcmUgdG8gYnVpbGQgc3VwcG9ydCBmb3IgQW5hbG9nIERldmljZXMgc3BpIHJlc29sdmVyCisJICB0byBkaWdpdGFsIGNvbnZlcnRlcnMsIGFkMnM5MCwgcHJvdmlkZXMgZGlyZWN0IGFjY2VzcyB2aWEgc3lzZnMuCisKK2NvbmZpZyBBRDJTMTIwWAorCXRyaXN0YXRlICJBbmFsb2cgRGV2aWNlcyBhZDJzMTIweCBkcml2ZXIiCisJZGVwZW5kcyBvbiBTUEkKKwloZWxwCisJICBTYXkgeWVzIGhlcmUgdG8gYnVpbGQgc3VwcG9ydCBmb3IgQW5hbG9nIERldmljZXMgc3BpIHJlc29sdmVyCisJICB0byBkaWdpdGFsIGNvbnZlcnRlcnMsIGFkMnMxMjAwIGFuZCBhZDJzMTIwNSwgcHJvdmlkZXMgZGlyZWN0IGFjY2VzcworCSAgdmlhIHN5c2ZzLgorCitjb25maWcgQUQyUzEyMTAKKwl0cmlzdGF0ZSAiQW5hbG9nIERldmljZXMgYWQyczEyMTAgZHJpdmVyIgorCWRlcGVuZHMgb24gU1BJCisJaGVscAorCSAgU2F5IHllcyBoZXJlIHRvIGJ1aWxkIHN1cHBvcnQgZm9yIEFuYWxvZyBEZXZpY2VzIHNwaSByZXNvbHZlcgorCSAgdG8gZGlnaXRhbCBjb252ZXJ0ZXJzLCBhZDJzMTIxMCwgcHJvdmlkZXMgZGlyZWN0IGFjY2VzcyB2aWEgc3lzZnMuCisKK2Nob2ljZQorCXByb21wdCAiUmVzb2x1dGlvbiBDb250cm9sIgorCWRlcGVuZHMgb24gQUQyUzEyMTAKKwlkZWZhdWx0IEFEMlMxMjEwX0dQSU9fTk9ORQorCWhlbHAKKwkgIEluIG5vcm1hbCBtb2RlLCB0aGUgcmVzb2x1dGlvbiBvZiB0aGUgZGlnaXRhbCBvdXRwdXQgaXMgc2VsZWN0ZWQKKwkgIHVzaW5nIHRoZSBSRVMwIGFuZCBSRVMxIGlucHV0IHBpbnMuIEluIGNvbmZpZ3VyYXRpb24gbW9kZSwgdGhlCisJICByZXNvbHV0aW9uIGlzIHNlbGVjdGVkIGJ5IHNldHRpbmcgdGhlIFJFUzAgYW5kIFJFUzEgYml0cyBpbiB0aGUKKwkgIGNvbnRyb2wgcmVnc2l0ZXIuIFdoZW4gc3dpdGNoaW5nIGJldHdlZW4gbm9ybWFsIG1vZGUgYW5kIGNvbmZpZ3VyYXRpb24KKwkgIG1vZGUsIHRoZXJlIGFyZSBzb21lIHNjaGVtZXMgdG8ga2VlcCB0aGVtIG1hdGNocy4KKworY29uZmlnIEFEMlMxMjEwX0dQSU9fSU5QVVQKKwlib29sICJyZWFkIHJlc29sdXRpb24gZnJvbSBncGlvIHBpbnMiCisJaGVscAorCSAgR1BJTyBwaW5zIGFyZSBzYW1wbGluZyBSRVMwIGFuZCBSRVMxIHBpbnMsIHJlYWQgdGhlIHJlc29sdXRpb24KKwkgIHNldHRpbmdzIGZyb20gdGhlIEdQSU8gcGlucy4KKworY29uZmlnIEFEMlMxMjEwX0dQSU9fT1VUUFVUCisJYm9vbCAic2V0IGdwaW8gcGlucyB0byBzZXQgcmVzb2x1dGlvbiIKKwloZWxwCisJICBSRVMwIGFuZCBSRVMxIHBpbnMgYXJlIGNvbnRyb2xsZWQgYnkgR1BJT3MsIHNldHRpbmcgR1BJTyBwaW5zIHRvCisJICBzZXQgdGhlIHJlc29sdXRpb24uCisKK2NvbmZpZyBBRDJTMTIxMF9HUElPX05PTkUKKwlib29sICJ0YWtlIHRoZSByZXNwb25zaWJpbGl0eSBieSB1c2VyIgorCitlbmRjaG9pY2UKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vcmVzb2x2ZXIvTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL3Jlc29sdmVyL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiODRhODkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL3Jlc29sdmVyL01ha2VmaWxlCkBAIC0wLDAgKzEsNyBAQAorIworIyBNYWtlZmlsZSBmb3IgUmVzb2x2ZXIvU3luY2hybyBkcml2ZXJzCisjCisKK29iai0kKENPTkZJR19BRDJTOTApICs9IGFkMnM5MC5vCitvYmotJChDT05GSUdfQUQyUzEyMFgpICs9IGFkMnMxMjB4Lm8KK29iai0kKENPTkZJR19BRDJTMTIxMCkgKz0gYWQyczEyMTAubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9yZXNvbHZlci9hZDJzMTIweC5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9yZXNvbHZlci9hZDJzMTIweC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmNDk3YTIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL3Jlc29sdmVyL2FkMnMxMjB4LmMKQEAgLTAsMCArMSwzMTAgQEAKKy8qCisgKiBhZDJzMTIweC5jIHNpbXBsZSBzdXBwb3J0IGZvciB0aGUgQURJIFJlc29sdmVyIHRvIERpZ2l0YWwgQ29udmVydGVyczogQUQyUzEyMDAvMTIwNQorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMC0yMDEwIEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqLworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisKKyNpbmNsdWRlICIuLi9paW8uaCIKKyNpbmNsdWRlICIuLi9zeXNmcy5oIgorCisjZGVmaW5lIERSVl9OQU1FICJhZDJzMTIweCIKKworLyogaW5wdXQgcGluIHNhbXBsZSBhbmQgcmR2ZWwgaXMgY29udHJvbGxlZCBieSBkcml2ZXIgKi8KKyNkZWZpbmUgQUQyUzEyMFhfUE4JMgorCisvKiBpbnB1dCBjbG9jayBvbiBzZXJpYWwgaW50ZXJmYWNlICovCisjZGVmaW5lIEFEMlMxMjBYX0haCTgxOTIwMDAKKy8qIGNsb2NrIHBlcmlvZCBpbiBuYW5vIHNlY29uZCAqLworI2RlZmluZSBBRDJTMTIwWF9UU0NMSwkoMTAwMDAwMDAwMC9BRDJTMTIwWF9IWikKKworc3RydWN0IGFkMnMxMjB4X3N0YXRlIHsKKwlzdHJ1Y3QgbXV0ZXggbG9jazsKKwlzdHJ1Y3QgaWlvX2RldiAqaWRldjsKKwlzdHJ1Y3Qgc3BpX2RldmljZSAqc2RldjsKKwl1bnNpZ25lZCBzaG9ydCBzYW1wbGU7CisJdW5zaWduZWQgc2hvcnQgcmR2ZWw7CisJdTggcnhbMl07CisJdTggdHhbMl07Cit9OworCitzdGF0aWMgc3NpemVfdCBhZDJzMTIweF9zaG93X3Bvc192ZWwoc3RydWN0IGRldmljZSAqZGV2LAorCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3Qgc3BpX21lc3NhZ2UgbXNnOworCXN0cnVjdCBzcGlfdHJhbnNmZXIgeGZlcjsKKwlpbnQgcmV0ID0gMDsKKwlzc2l6ZV90IGxlbiA9IDA7CisJdTE2IHBvczsKKwlzMTYgdmVsOworCXU4IHN0YXR1czsKKwlzdHJ1Y3QgaWlvX2RldiAqaWRldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDJzMTIweF9zdGF0ZSAqc3QgPSBpZGV2LT5kZXZfZGF0YTsKKworCXhmZXIubGVuID0gMTsKKwl4ZmVyLnR4X2J1ZiA9IHN0LT50eDsKKwl4ZmVyLnJ4X2J1ZiA9IHN0LT5yeDsKKwltdXRleF9sb2NrKCZzdC0+bG9jayk7CisKKwlncGlvX3NldF92YWx1ZShzdC0+c2FtcGxlLCAwKTsKKwkvKiBkZWxheSAoNiAqIEFEMlMxMjBYX1RTQ0xLICsgMjApIG5hbm8gc2Vjb25kcyAqLworCXVkZWxheSgxKTsKKwlncGlvX3NldF92YWx1ZShzdC0+c2FtcGxlLCAxKTsKKworCXNwaV9tZXNzYWdlX2luaXQoJm1zZyk7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnhmZXIsICZtc2cpOworCXJldCA9IHNwaV9zeW5jKHN0LT5zZGV2LCAmbXNnKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3JldDsKKwlzdGF0dXMgPSBzdC0+cnhbMV07CisJcG9zID0gKCgodTE2KShzdC0+cnhbMF0pKSA8PCA0KSB8ICgoc3QtPnJ4WzFdICYgMHhGMCkgPj4gNCk7CisJbGVuID0gc3ByaW50ZihidWYsICIlZCAlYyVjJWMlYyAiLCBwb3MsCisJCQkJKHN0YXR1cyAmIDB4OCkgPyAnUCcgOiAnVicsCisJCQkJKHN0YXR1cyAmIDB4NCkgPyAnZCcgOiAnXycsCisJCQkJKHN0YXR1cyAmIDB4MikgPyAnbCcgOiAnXycsCisJCQkJKHN0YXR1cyAmIDB4MSkgPyAnMScgOiAnMCcpOworCisJLyogZGVsYXkgMTggbnMgKi8KKwkvKiBuZGVsYXkoMTgpOyAqLworCisJZ3Bpb19zZXRfdmFsdWUoc3QtPnJkdmVsLCAwKTsKKwkvKiBuZGVsYXkoNSk7Ki8KKworCXNwaV9tZXNzYWdlX2luaXQoJm1zZyk7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnhmZXIsICZtc2cpOworCXJldCA9IHNwaV9zeW5jKHN0LT5zZGV2LCAmbXNnKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3JldDsKKwlzdGF0dXMgPSBzdC0+cnhbMV07CisJdmVsID0gKHN0LT5yeFswXSAmIDB4ODApID8gMHhmMDAwIDogMDsKKwl2ZWwgfD0gKCgoczE2KShzdC0+cnhbMF0pKSA8PCA0KSB8ICgoc3QtPnJ4WzFdICYgMHhGMCkgPj4gNCk7CisJbGVuICs9IHNwcmludGYoYnVmICsgbGVuLCAiJWQgJWMlYyVjJWNcbiIsIHZlbCwKKwkJCQkoc3RhdHVzICYgMHg4KSA/ICdQJyA6ICdWJywKKwkJCQkoc3RhdHVzICYgMHg0KSA/ICdkJyA6ICdfJywKKwkJCQkoc3RhdHVzICYgMHgyKSA/ICdsJyA6ICdfJywKKwkJCQkoc3RhdHVzICYgMHgxKSA/ICcxJyA6ICcwJyk7CitlcnJvcl9yZXQ6CisJZ3Bpb19zZXRfdmFsdWUoc3QtPnJkdmVsLCAxKTsKKwkvKiBkZWxheSAoMiAqIEFEMlMxMjBYX1RTQ0xLICsgMjApIG5zIGZvciBzYW1wbGUgcHVsc2UgKi8KKwl1ZGVsYXkoMSk7CisJbXV0ZXhfdW5sb2NrKCZzdC0+bG9jayk7CisKKwlyZXR1cm4gcmV0ID8gcmV0IDogbGVuOworfQorCitzdGF0aWMgc3NpemVfdCBhZDJzMTIweF9zaG93X3BvcyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBzcGlfbWVzc2FnZSBtc2c7CisJc3RydWN0IHNwaV90cmFuc2ZlciB4ZmVyOworCWludCByZXQgPSAwOworCXNzaXplX3QgbGVuID0gMDsKKwl1MTYgcG9zOworCXU4IHN0YXR1czsKKwlzdHJ1Y3QgaWlvX2RldiAqaWRldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDJzMTIweF9zdGF0ZSAqc3QgPSBpZGV2LT5kZXZfZGF0YTsKKworCXhmZXIubGVuID0gMTsKKwl4ZmVyLnR4X2J1ZiA9IHN0LT50eDsKKwl4ZmVyLnJ4X2J1ZiA9IHN0LT5yeDsKKwltdXRleF9sb2NrKCZzdC0+bG9jayk7CisKKwlncGlvX3NldF92YWx1ZShzdC0+c2FtcGxlLCAwKTsKKwkvKiBkZWxheSAoNiAqIEFEMlMxMjBYX1RTQ0xLICsgMjApIG5hbm8gc2Vjb25kcyAqLworCXVkZWxheSgxKTsKKwlncGlvX3NldF92YWx1ZShzdC0+c2FtcGxlLCAxKTsKKwlncGlvX3NldF92YWx1ZShzdC0+cmR2ZWwsIDEpOworCisJc3BpX21lc3NhZ2VfaW5pdCgmbXNnKTsKKwlzcGlfbWVzc2FnZV9hZGRfdGFpbCgmeGZlciwgJm1zZyk7CisJcmV0ID0gc3BpX3N5bmMoc3QtPnNkZXYsICZtc2cpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfcmV0OworCXN0YXR1cyA9IHN0LT5yeFsxXTsKKwlwb3MgPSAoKCh1MTYpKHN0LT5yeFswXSkpIDw8IDQpIHwgKChzdC0+cnhbMV0gJiAweEYwKSA+PiA0KTsKKwlsZW4gPSBzcHJpbnRmKGJ1ZiwgIiVkICVjJWMlYyVjICIsIHBvcywKKwkJCQkoc3RhdHVzICYgMHg4KSA/ICdQJyA6ICdWJywKKwkJCQkoc3RhdHVzICYgMHg0KSA/ICdkJyA6ICdfJywKKwkJCQkoc3RhdHVzICYgMHgyKSA/ICdsJyA6ICdfJywKKwkJCQkoc3RhdHVzICYgMHgxKSA/ICcxJyA6ICcwJyk7CitlcnJvcl9yZXQ6CisJLyogZGVsYXkgKDIgKiBBRDJTMTIwWF9UU0NMSyArIDIwKSBucyBmb3Igc2FtcGxlIHB1bHNlICovCisJdWRlbGF5KDEpOworCW11dGV4X3VubG9jaygmc3QtPmxvY2spOworCisJcmV0dXJuIHJldCA/IHJldCA6IGxlbjsKK30KKworc3RhdGljIHNzaXplX3QgYWQyczEyMHhfc2hvd192ZWwoc3RydWN0IGRldmljZSAqZGV2LAorCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3Qgc3BpX21lc3NhZ2UgbXNnOworCXN0cnVjdCBzcGlfdHJhbnNmZXIgeGZlcjsKKwlpbnQgcmV0ID0gMDsKKwlzc2l6ZV90IGxlbiA9IDA7CisJczE2IHZlbDsKKwl1OCBzdGF0dXM7CisJc3RydWN0IGlpb19kZXYgKmlkZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQyczEyMHhfc3RhdGUgKnN0ID0gaWRldi0+ZGV2X2RhdGE7CisKKwl4ZmVyLmxlbiA9IDE7CisJeGZlci50eF9idWYgPSBzdC0+dHg7CisJeGZlci5yeF9idWYgPSBzdC0+cng7CisJbXV0ZXhfbG9jaygmc3QtPmxvY2spOworCisJZ3Bpb19zZXRfdmFsdWUoc3QtPnNhbXBsZSwgMCk7CisJLyogZGVsYXkgKDYgKiBBRDJTMTIwWF9UU0NMSyArIDIwKSBuYW5vIHNlY29uZHMgKi8KKwl1ZGVsYXkoMSk7CisJZ3Bpb19zZXRfdmFsdWUoc3QtPnNhbXBsZSwgMSk7CisKKwlncGlvX3NldF92YWx1ZShzdC0+cmR2ZWwsIDApOworCS8qIG5kZWxheSg1KTsqLworCisJc3BpX21lc3NhZ2VfaW5pdCgmbXNnKTsKKwlzcGlfbWVzc2FnZV9hZGRfdGFpbCgmeGZlciwgJm1zZyk7CisJcmV0ID0gc3BpX3N5bmMoc3QtPnNkZXYsICZtc2cpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfcmV0OworCXN0YXR1cyA9IHN0LT5yeFsxXTsKKwl2ZWwgPSAoc3QtPnJ4WzBdICYgMHg4MCkgPyAweGYwMDAgOiAwOworCXZlbCB8PSAoKChzMTYpKHN0LT5yeFswXSkpIDw8IDQpIHwgKChzdC0+cnhbMV0gJiAweEYwKSA+PiA0KTsKKwlsZW4gKz0gc3ByaW50ZihidWYgKyBsZW4sICIlZCAlYyVjJWMlY1xuIiwgdmVsLAorCQkJCShzdGF0dXMgJiAweDgpID8gJ1AnIDogJ1YnLAorCQkJCShzdGF0dXMgJiAweDQpID8gJ2QnIDogJ18nLAorCQkJCShzdGF0dXMgJiAweDIpID8gJ2wnIDogJ18nLAorCQkJCShzdGF0dXMgJiAweDEpID8gJzEnIDogJzAnKTsKK2Vycm9yX3JldDoKKwlncGlvX3NldF92YWx1ZShzdC0+cmR2ZWwsIDEpOworCS8qIGRlbGF5ICgyICogQUQyUzEyMFhfVFNDTEsgKyAyMCkgbnMgZm9yIHNhbXBsZSBwdWxzZSAqLworCXVkZWxheSgxKTsKKwltdXRleF91bmxvY2soJnN0LT5sb2NrKTsKKworCXJldHVybiByZXQgPyByZXQgOiBsZW47Cit9CisKK3N0YXRpYyBJSU9fQ09OU1RfQVRUUihkZXNjcmlwdGlvbiwKKwkiMTItQml0IFIvRCBDb252ZXJ0ZXIgd2l0aCBSZWZlcmVuY2UgT3NjaWxsYXRvciIpOworc3RhdGljIElJT19ERVZJQ0VfQVRUUihwb3NfdmVsLCBTX0lSVUdPLCBhZDJzMTIweF9zaG93X3Bvc192ZWwsIE5VTEwsIDApOworc3RhdGljIElJT19ERVZJQ0VfQVRUUihwb3MsIFNfSVJVR08sIGFkMnMxMjB4X3Nob3dfcG9zLCBOVUxMLCAwKTsKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIodmVsLCBTX0lSVUdPLCBhZDJzMTIweF9zaG93X3ZlbCwgTlVMTCwgMCk7CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICphZDJzMTIweF9hdHRyaWJ1dGVzW10gPSB7CisJJmlpb19jb25zdF9hdHRyX2Rlc2NyaXB0aW9uLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9wb3NfdmVsLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9wb3MuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX3ZlbC5kZXZfYXR0ci5hdHRyLAorCU5VTEwsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBhZDJzMTIweF9hdHRyaWJ1dGVfZ3JvdXAgPSB7CisJLm5hbWUgPSBEUlZfTkFNRSwKKwkuYXR0cnMgPSBhZDJzMTIweF9hdHRyaWJ1dGVzLAorfTsKKworc3RhdGljIGludCBfX2RldmluaXQgYWQyczEyMHhfcHJvYmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlzdHJ1Y3QgYWQyczEyMHhfc3RhdGUgKnN0OworCWludCBwbiwgcmV0ID0gMDsKKwl1bnNpZ25lZCBzaG9ydCAqcGlucyA9IHNwaS0+ZGV2LnBsYXRmb3JtX2RhdGE7CisKKwlmb3IgKHBuID0gMDsgcG4gPCBBRDJTMTIwWF9QTjsgcG4rKykgeworCQlpZiAoZ3Bpb19yZXF1ZXN0KHBpbnNbcG5dLCBEUlZfTkFNRSkpIHsKKwkJCXByX2VycigiJXM6IHJlcXVlc3QgZ3BpbyBwaW4gJWQgZmFpbGVkXG4iLAorCQkJCQkJRFJWX05BTUUsIHBpbnNbcG5dKTsKKwkJCWdvdG8gZXJyb3JfcmV0OworCQl9CisJCWdwaW9fZGlyZWN0aW9uX291dHB1dChwaW5zW3BuXSwgMSk7CisJfQorCisJc3QgPSBremFsbG9jKHNpemVvZigqc3QpLCBHRlBfS0VSTkVMKTsKKwlpZiAoc3QgPT0gTlVMTCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycm9yX3JldDsKKwl9CisJc3BpX3NldF9kcnZkYXRhKHNwaSwgc3QpOworCisJbXV0ZXhfaW5pdCgmc3QtPmxvY2spOworCXN0LT5zZGV2ID0gc3BpOworCXN0LT5zYW1wbGUgPSBwaW5zWzBdOworCXN0LT5yZHZlbCA9IHBpbnNbMV07CisKKwlzdC0+aWRldiA9IGlpb19hbGxvY2F0ZV9kZXZpY2UoKTsKKwlpZiAoc3QtPmlkZXYgPT0gTlVMTCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycm9yX2ZyZWVfc3Q7CisJfQorCXN0LT5pZGV2LT5kZXYucGFyZW50ID0gJnNwaS0+ZGV2OworCXN0LT5pZGV2LT5udW1faW50ZXJydXB0X2xpbmVzID0gMDsKKwlzdC0+aWRldi0+ZXZlbnRfYXR0cnMgPSBOVUxMOworCisJc3QtPmlkZXYtPmF0dHJzID0gJmFkMnMxMjB4X2F0dHJpYnV0ZV9ncm91cDsKKwlzdC0+aWRldi0+ZGV2X2RhdGEgPSAodm9pZCAqKShzdCk7CisJc3QtPmlkZXYtPmRyaXZlcl9tb2R1bGUgPSBUSElTX01PRFVMRTsKKwlzdC0+aWRldi0+bW9kZXMgPSBJTkRJT19ESVJFQ1RfTU9ERTsKKworCXJldCA9IGlpb19kZXZpY2VfcmVnaXN0ZXIoc3QtPmlkZXYpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfZnJlZV9kZXY7CisKKwlzcGktPm1heF9zcGVlZF9oeiA9IEFEMlMxMjBYX0haOworCXNwaS0+bW9kZSA9IFNQSV9NT0RFXzM7CisJc3BpX3NldHVwKHNwaSk7CisKKwlyZXR1cm4gMDsKKworZXJyb3JfZnJlZV9kZXY6CisJaWlvX2ZyZWVfZGV2aWNlKHN0LT5pZGV2KTsKK2Vycm9yX2ZyZWVfc3Q6CisJa2ZyZWUoc3QpOworZXJyb3JfcmV0OgorCWZvciAoLS1wbjsgcG4gPj0gMDsgcG4tLSkKKwkJZ3Bpb19mcmVlKHBpbnNbcG5dKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBhZDJzMTIweF9yZW1vdmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlzdHJ1Y3QgYWQyczEyMHhfc3RhdGUgKnN0ID0gc3BpX2dldF9kcnZkYXRhKHNwaSk7CisKKwlpaW9fZGV2aWNlX3VucmVnaXN0ZXIoc3QtPmlkZXYpOworCWtmcmVlKHN0KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNwaV9kcml2ZXIgYWQyczEyMHhfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gRFJWX05BTUUsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCX0sCisJLnByb2JlID0gYWQyczEyMHhfcHJvYmUsCisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKGFkMnMxMjB4X3JlbW92ZSksCit9OworCitzdGF0aWMgX19pbml0IGludCBhZDJzMTIweF9zcGlfaW5pdCh2b2lkKQoreworCXJldHVybiBzcGlfcmVnaXN0ZXJfZHJpdmVyKCZhZDJzMTIweF9kcml2ZXIpOworfQorbW9kdWxlX2luaXQoYWQyczEyMHhfc3BpX2luaXQpOworCitzdGF0aWMgX19leGl0IHZvaWQgYWQyczEyMHhfc3BpX2V4aXQodm9pZCkKK3sKKwlzcGlfdW5yZWdpc3Rlcl9kcml2ZXIoJmFkMnMxMjB4X2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdChhZDJzMTIweF9zcGlfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIkdyYWZmIFlhbmcgPGdyYWZmLnlhbmdAZ21haWwuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJBbmFsb2cgRGV2aWNlcyBBRDJTMTIwMC8xMjA1IFJlc29sdmVyIHRvIERpZ2l0YWwgU1BJIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9yZXNvbHZlci9hZDJzMTIxMC5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9yZXNvbHZlci9hZDJzMTIxMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxMmY2NGMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL3Jlc29sdmVyL2FkMnMxMjEwLmMKQEAgLTAsMCArMSw4NzIgQEAKKy8qCisgKiBhZDJzMTIxMC5jIHN1cHBvcnQgZm9yIHRoZSBBREkgUmVzb2x2ZXIgdG8gRGlnaXRhbCBDb252ZXJ0ZXJzOiBBRDJTMTIxMAorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMC0yMDEwIEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqLworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisKKyNpbmNsdWRlICIuLi9paW8uaCIKKyNpbmNsdWRlICIuLi9zeXNmcy5oIgorCisjZGVmaW5lIERSVl9OQU1FICJhZDJzMTIxMCIKKworI2RlZmluZSBERUZfQ09OVFJPTAkJMHg3RQorCisjZGVmaW5lIE1TQl9JU19ISUdICQkweDgwCisjZGVmaW5lIE1TQl9JU19MT1cJCTB4N0YKKyNkZWZpbmUgUEhBU0VfTE9DS19SQU5HRV80NAkweDIwCisjZGVmaW5lIEVOQUJMRV9IWVNURVJFU0lTCTB4MTAKKyNkZWZpbmUgU0VUX0VOUkVTMQkJMHgwOAorI2RlZmluZSBTRVRfRU5SRVMwCQkweDA0CisjZGVmaW5lIFNFVF9SRVMxCQkweDAyCisjZGVmaW5lIFNFVF9SRVMwCQkweDAxCisKKyNkZWZpbmUgU0VUX0VOUkVTT0xVVElPTgkoU0VUX0VOUkVTMSB8IFNFVF9FTlJFUzApCisjZGVmaW5lIFNFVF9SRVNPTFVUSU9OCQkoU0VUX1JFUzEgfCBTRVRfUkVTMCkKKworI2RlZmluZSBSRUdfUE9TSVRJT04JCTB4ODAKKyNkZWZpbmUgUkVHX1ZFTE9DSVRZCQkweDgyCisjZGVmaW5lIFJFR19MT1NfVEhSRAkJMHg4OAorI2RlZmluZSBSRUdfRE9TX09WUl9USFJECTB4ODkKKyNkZWZpbmUgUkVHX0RPU19NSVNfVEhSRAkweDhBCisjZGVmaW5lIFJFR19ET1NfUlNUX01BWF9USFJECTB4OEIKKyNkZWZpbmUgUkVHX0RPU19SU1RfTUlOX1RIUkQJMHg4QworI2RlZmluZSBSRUdfTE9UX0hJR0hfVEhSRAkweDhECisjZGVmaW5lIFJFR19MT1RfTE9XX1RIUkQJMHg4RQorI2RlZmluZSBSRUdfRVhDSVRfRlJFUQkJMHg5MQorI2RlZmluZSBSRUdfQ09OVFJPTAkJMHg5MgorI2RlZmluZSBSRUdfU09GVF9SRVNFVAkJMHhGMAorI2RlZmluZSBSRUdfRkFVTFQJCTB4RkYKKworLyogcGluIFNBTVBMRSwgQTAsIEExLCBSRVMwLCBSRVMxLCBpcyBjb250cm9sbGVkIGJ5IGRyaXZlciAqLworI2RlZmluZSBBRDJTMTIxMF9TQUEJCTMKKyNpZiBkZWZpbmVkKENPTkZJR19BRDJTMTIxMF9HUElPX0lOUFVUKSB8fCBkZWZpbmVkKENPTkZJR19BRDJTMTIxMF9HUElPX09VVFBVVCkKKyMgZGVmaW5lIEFEMlMxMjEwX1JFUwkJMgorI2Vsc2UKKyMgZGVmaW5lIEFEMlMxMjEwX1JFUwkJMAorI2VuZGlmCisjZGVmaW5lIEFEMlMxMjEwX1BOCQkoQUQyUzEyMTBfU0FBICsgQUQyUzEyMTBfUkVTKQorCisjZGVmaW5lIEFEMlMxMjEwX01JTl9DTEtJTgk2MTQ0MDAwCisjZGVmaW5lIEFEMlMxMjEwX01BWF9DTEtJTgkxMDI0MDAwMAorI2RlZmluZSBBRDJTMTIxMF9NSU5fRVhDSVQJMjAwMAorI2RlZmluZSBBRDJTMTIxMF9NQVhfRVhDSVQJMjAwMDAKKyNkZWZpbmUgQUQyUzEyMTBfTUlOX0ZDVwkweDQKKyNkZWZpbmUgQUQyUzEyMTBfTUFYX0ZDVwkweDUwCisKKy8qIGRlZmF1bHQgaW5wdXQgY2xvY2sgb24gc2VyaWFsIGludGVyZmFjZSAqLworI2RlZmluZSBBRDJTMTIxMF9ERUZfQ0xLSU4JODE5MjAwMAorLyogY2xvY2sgcGVyaW9kIGluIG5hbm8gc2Vjb25kICovCisjZGVmaW5lIEFEMlMxMjEwX0RFRl9UQ0sJKDEwMDAwMDAwMDAvQUQyUzEyMTBfREVGX0NMS0lOKQorI2RlZmluZSBBRDJTMTIxMF9ERUZfRVhDSVQJMTAwMDAKKworZW51bSBhZDJzMTIxMF9tb2RlIHsKKwlNT0RfUE9TID0gMCwKKwlNT0RfVkVMLAorCU1PRF9SRVNFUlZFRCwKKwlNT0RfQ09ORklHLAorfTsKKworZW51bSBhZDJzMTIxMF9yZXMgeworCVJFU18xMCA9IDEwLAorCVJFU18xMiA9IDEyLAorCVJFU18xNCA9IDE0LAorCVJFU18xNiA9IDE2LAorfTsKKworc3RhdGljIHVuc2lnbmVkIGludCByZXNvbHV0aW9uX3ZhbHVlW10gPSB7CisJCVJFU18xMCwgUkVTXzEyLCBSRVNfMTQsIFJFU18xNn07CisKK3N0cnVjdCBhZDJzMTIxMF9zdGF0ZSB7CisJc3RydWN0IG11dGV4IGxvY2s7CisJc3RydWN0IGlpb19kZXYgKmlkZXY7CisJc3RydWN0IHNwaV9kZXZpY2UgKnNkZXY7CisJc3RydWN0IHNwaV90cmFuc2ZlciB4ZmVyOworCXVuc2lnbmVkIGludCBoeXN0ZXJlc2lzOworCXVuc2lnbmVkIGludCBvbGRfZGF0YTsKKwllbnVtIGFkMnMxMjEwX21vZGUgbW9kZTsKKwllbnVtIGFkMnMxMjEwX3JlcyByZXNvbHV0aW9uOworCXVuc2lnbmVkIGludCBmY2xraW47CisJdW5zaWduZWQgaW50IGZleGNpdDsKKwl1bnNpZ25lZCBzaG9ydCBzYW1wbGU7CisJdW5zaWduZWQgc2hvcnQgYTA7CisJdW5zaWduZWQgc2hvcnQgYTE7CisJdW5zaWduZWQgc2hvcnQgcmVzMDsKKwl1bnNpZ25lZCBzaG9ydCByZXMxOworCXU4IHJ4WzNdOworCXU4IHR4WzNdOworfTsKKworc3RhdGljIGlubGluZSB2b2lkIHN0YXJ0X3NhbXBsZShzdHJ1Y3QgYWQyczEyMTBfc3RhdGUgKnN0KQoreworCWdwaW9fc2V0X3ZhbHVlKHN0LT5zYW1wbGUsIDApOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc3RvcF9zYW1wbGUoc3RydWN0IGFkMnMxMjEwX3N0YXRlICpzdCkKK3sKKwlncGlvX3NldF92YWx1ZShzdC0+c2FtcGxlLCAxKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNldF9tb2RlKGVudW0gYWQyczEyMTBfbW9kZSBtb2RlLCBzdHJ1Y3QgYWQyczEyMTBfc3RhdGUgKnN0KQoreworCXN3aXRjaCAobW9kZSkgeworCWNhc2UgTU9EX1BPUzoKKwkJZ3Bpb19zZXRfdmFsdWUoc3QtPmEwLCAwKTsKKwkJZ3Bpb19zZXRfdmFsdWUoc3QtPmExLCAwKTsKKwkJYnJlYWs7CisJY2FzZSBNT0RfVkVMOgorCQlncGlvX3NldF92YWx1ZShzdC0+YTAsIDApOworCQlncGlvX3NldF92YWx1ZShzdC0+YTEsIDEpOworCQlicmVhazsKKwljYXNlIE1PRF9DT05GSUc6CisJCWdwaW9fc2V0X3ZhbHVlKHN0LT5hMCwgMSk7CisJCWdwaW9fc2V0X3ZhbHVlKHN0LT5hMSwgMSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCS8qIHNldCB0byByZXNlcnZlZCBtb2RlICovCisJCWdwaW9fc2V0X3ZhbHVlKHN0LT5hMCwgMSk7CisJCWdwaW9fc2V0X3ZhbHVlKHN0LT5hMSwgMCk7CisJfQorCXN0LT5tb2RlID0gbW9kZTsKK30KKworLyogd3JpdGUgMSBieXRlcyAoYWRkcmVzcyBvciBkYXRhKSB0byB0aGUgY2hpcCAqLworc3RhdGljIGludCBjb25maWdfd3JpdGUoc3RydWN0IGFkMnMxMjEwX3N0YXRlICpzdCwKKwkJCQkJdW5zaWduZWQgY2hhciBkYXRhKQoreworCXN0cnVjdCBzcGlfbWVzc2FnZSBtc2c7CisJaW50IHJldCA9IDA7CisKKwlzdC0+eGZlci5sZW4gPSAxOworCXNldF9tb2RlKE1PRF9DT05GSUcsIHN0KTsKKworCXNwaV9tZXNzYWdlX2luaXQoJm1zZyk7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnN0LT54ZmVyLCAmbXNnKTsKKwlzdC0+dHhbMF0gPSBkYXRhOworCXJldCA9IHNwaV9zeW5jKHN0LT5zZGV2LCAmbXNnKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCXN0LT5vbGRfZGF0YSA9IDE7CisJcmV0dXJuIHJldDsKK30KKworLyogcmVhZCB2YWx1ZSBmcm9tIG9uZSBvZiB0aGUgcmVnaXN0ZXJzICovCitzdGF0aWMgaW50IGNvbmZpZ19yZWFkKHN0cnVjdCBhZDJzMTIxMF9zdGF0ZSAqc3QsCisJCQkJdW5zaWduZWQgY2hhciBhZGRyZXNzLAorCQkJCQl1bnNpZ25lZCBjaGFyICpkYXRhKQoreworCXN0cnVjdCBzcGlfbWVzc2FnZSBtc2c7CisJaW50IHJldCA9IDA7CisKKwlzdC0+eGZlci5sZW4gPSAyOworCXNldF9tb2RlKE1PRF9DT05GSUcsIHN0KTsKKworCXNwaV9tZXNzYWdlX2luaXQoJm1zZyk7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnN0LT54ZmVyLCAmbXNnKTsKKwlzdC0+dHhbMF0gPSBhZGRyZXNzIHwgTVNCX0lTX0hJR0g7CisJc3QtPnR4WzFdID0gUkVHX0ZBVUxUOworCXJldCA9IHNwaV9zeW5jKHN0LT5zZGV2LCAmbXNnKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCSpkYXRhID0gc3QtPnJ4WzFdOworCXN0LT5vbGRfZGF0YSA9IDE7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHVwZGF0ZV9mcmVxdWVuY3lfY29udHJvbF93b3JkKHN0cnVjdCBhZDJzMTIxMF9zdGF0ZSAqc3QpCit7CisJdW5zaWduZWQgY2hhciBmY3c7CisJZmN3ID0gKHVuc2lnbmVkIGNoYXIpKHN0LT5mZXhjaXQgKiAoMSA8PCAxNSkgLyBzdC0+ZmNsa2luKTsKKwlpZiAoZmN3ID49IEFEMlMxMjEwX01JTl9GQ1cgJiYgZmN3IDw9IEFEMlMxMjEwX01BWF9GQ1cpIHsKKwkJY29uZmlnX3dyaXRlKHN0LCBSRUdfRVhDSVRfRlJFUSk7CisJCWNvbmZpZ193cml0ZShzdCwgZmN3KTsKKwl9IGVsc2UKKwkJcHJfZXJyKCJhZDJzMTIxMDogRkNXIG91dCBvZiByYW5nZVxuIik7Cit9CisKKyNpZiBkZWZpbmVkKENPTkZJR19BRDJTMTIxMF9HUElPX0lOUFVUKQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBjaGFyIHJlYWRfcmVzb2x1dGlvbl9waW4oc3RydWN0IGFkMnMxMjEwX3N0YXRlICpzdCkKK3sKKwl1bnNpZ25lZCBpbnQgZGF0YTsKKwlkYXRhID0gKGdwaW9fZ2V0X3ZhbHVlKHN0LT5yZXMwKSA8PCAxKSAgfAorCQkJZ3Bpb19nZXRfdmFsdWUoc3QtPnJlczEpOworCXJldHVybiByZXNvbHV0aW9uX3ZhbHVlW2RhdGFdOworfQorI2VsaWYgZGVmaW5lZChDT05GSUdfQUQyUzEyMTBfR1BJT19PVVRQVVQpCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X3Jlc29sdXRpb25fcGluKHN0cnVjdCBhZDJzMTIxMF9zdGF0ZSAqc3QpCit7CisJc3dpdGNoIChzdC0+cmVzb2x1dGlvbikgeworCWNhc2UgUkVTXzEwOgorCQlncGlvX3NldF92YWx1ZShzdC0+cmVzMCwgMCk7CisJCWdwaW9fc2V0X3ZhbHVlKHN0LT5yZXMxLCAwKTsKKwkJYnJlYWs7CisJY2FzZSBSRVNfMTI6CisJCWdwaW9fc2V0X3ZhbHVlKHN0LT5yZXMwLCAwKTsKKwkJZ3Bpb19zZXRfdmFsdWUoc3QtPnJlczEsIDEpOworCQlicmVhazsKKwljYXNlIFJFU18xNDoKKwkJZ3Bpb19zZXRfdmFsdWUoc3QtPnJlczAsIDEpOworCQlncGlvX3NldF92YWx1ZShzdC0+cmVzMSwgMCk7CisJCWJyZWFrOworCWNhc2UgUkVTXzE2OgorCQlncGlvX3NldF92YWx1ZShzdC0+cmVzMCwgMSk7CisJCWdwaW9fc2V0X3ZhbHVlKHN0LT5yZXMxLCAxKTsKKwkJYnJlYWs7CisJfQorfQorI2VuZGlmCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzb2Z0X3Jlc2V0KHN0cnVjdCBhZDJzMTIxMF9zdGF0ZSAqc3QpCit7CisJY29uZmlnX3dyaXRlKHN0LCBSRUdfU09GVF9SRVNFVCk7CisJY29uZmlnX3dyaXRlKHN0LCAweDApOworfQorCisKKy8qIHJldHVybiB0aGUgT0xEIERBVEEgc2luY2UgbGFzdCBzcGkgYnVzIHdyaXRlICovCitzdGF0aWMgc3NpemVfdCBhZDJzMTIxMF9zaG93X3JhdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICppZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkMnMxMjEwX3N0YXRlICpzdCA9IGlkZXYtPmRldl9kYXRhOworCWludCByZXQ7CisKKwltdXRleF9sb2NrKCZzdC0+bG9jayk7CisJaWYgKHN0LT5vbGRfZGF0YSkgeworCQlyZXQgPSBzcHJpbnRmKGJ1ZiwgIjB4JXhcbiIsIHN0LT5yeFswXSk7CisJCXN0LT5vbGRfZGF0YSA9IDA7CisJfSBlbHNlCisJCXJldCA9IDA7CisJbXV0ZXhfdW5sb2NrKCZzdC0+bG9jayk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QgYWQyczEyMTBfc3RvcmVfcmF3KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqaWRldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDJzMTIxMF9zdGF0ZSAqc3QgPSBpZGV2LT5kZXZfZGF0YTsKKwl1bnNpZ25lZCBsb25nIHVkYXRhOworCXVuc2lnbmVkIGNoYXIgZGF0YTsKKwlpbnQgcmV0OworCisJcmV0ID0gc3RyaWN0X3N0cnRvdWwoYnVmLCAxNiwgJnVkYXRhKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gLUVJTlZBTDsKKwlkYXRhID0gdWRhdGEgJiAweGZmOworCW11dGV4X2xvY2soJnN0LT5sb2NrKTsKKwljb25maWdfd3JpdGUoc3QsIGRhdGEpOworCW11dGV4X3VubG9jaygmc3QtPmxvY2spOworCXJldHVybiAxOworfQorCitzdGF0aWMgc3NpemVfdCBhZDJzMTIxMF9zdG9yZV9zb2Z0cmVzZXQoc3RydWN0IGRldmljZSAqZGV2LAorCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBsZW4pCit7CisJc3RydWN0IGlpb19kZXYgKmlkZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQyczEyMTBfc3RhdGUgKnN0ID0gaWRldi0+ZGV2X2RhdGE7CisJbXV0ZXhfbG9jaygmc3QtPmxvY2spOworCXNvZnRfcmVzZXQoc3QpOworCW11dGV4X3VubG9jaygmc3QtPmxvY2spOworCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkMnMxMjEwX3Nob3dfZmNsa2luKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmlkZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQyczEyMTBfc3RhdGUgKnN0ID0gaWRldi0+ZGV2X2RhdGE7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHN0LT5mY2xraW4pOworfQorCitzdGF0aWMgc3NpemVfdCBhZDJzMTIxMF9zdG9yZV9mY2xraW4oc3RydWN0IGRldmljZSAqZGV2LAorCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBsZW4pCit7CisJc3RydWN0IGlpb19kZXYgKmlkZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQyczEyMTBfc3RhdGUgKnN0ID0gaWRldi0+ZGV2X2RhdGE7CisJdW5zaWduZWQgbG9uZyBmY2xraW47CisJaW50IHJldDsKKworCXJldCA9IHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMTAsICZmY2xraW4pOworCWlmICghcmV0ICYmIGZjbGtpbiA+PSBBRDJTMTIxMF9NSU5fQ0xLSU4gJiYKKwkJCQlmY2xraW4gPD0gQUQyUzEyMTBfTUFYX0NMS0lOKSB7CisJCW11dGV4X2xvY2soJnN0LT5sb2NrKTsKKwkJc3QtPmZjbGtpbiA9IGZjbGtpbjsKKwl9IGVsc2UgeworCQlwcl9lcnIoImFkMnMxMjEwOiBmY2xraW4gb3V0IG9mIHJhbmdlXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXVwZGF0ZV9mcmVxdWVuY3lfY29udHJvbF93b3JkKHN0KTsKKwlzb2Z0X3Jlc2V0KHN0KTsKKwltdXRleF91bmxvY2soJnN0LT5sb2NrKTsKKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgc3NpemVfdCBhZDJzMTIxMF9zaG93X2ZleGNpdChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICppZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkMnMxMjEwX3N0YXRlICpzdCA9IGlkZXYtPmRldl9kYXRhOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBzdC0+ZmV4Y2l0KTsKK30KKworc3RhdGljIHNzaXplX3QgYWQyczEyMTBfc3RvcmVfZmV4Y2l0KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgbGVuKQoreworCXN0cnVjdCBpaW9fZGV2ICppZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkMnMxMjEwX3N0YXRlICpzdCA9IGlkZXYtPmRldl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmV4Y2l0OworCWludCByZXQ7CisKKwlyZXQgPSBzdHJpY3Rfc3RydG91bChidWYsIDEwLCAmZmV4Y2l0KTsKKwlpZiAoIXJldCAmJiBmZXhjaXQgPj0gQUQyUzEyMTBfTUlOX0VYQ0lUICYmCisJCQkJZmV4Y2l0IDw9IEFEMlMxMjEwX01BWF9FWENJVCkgeworCQltdXRleF9sb2NrKCZzdC0+bG9jayk7CisJCXN0LT5mZXhjaXQgPSBmZXhjaXQ7CisJfSBlbHNlIHsKKwkJcHJfZXJyKCJhZDJzMTIxMDogZXhjaXRhdGlvbiBmcmVxdWVuY3kgb3V0IG9mIHJhbmdlXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXVwZGF0ZV9mcmVxdWVuY3lfY29udHJvbF93b3JkKHN0KTsKKwlzb2Z0X3Jlc2V0KHN0KTsKKwltdXRleF91bmxvY2soJnN0LT5sb2NrKTsKKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgc3NpemVfdCBhZDJzMTIxMF9zaG93X2NvbnRyb2woc3RydWN0IGRldmljZSAqZGV2LAorCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqaWRldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDJzMTIxMF9zdGF0ZSAqc3QgPSBpZGV2LT5kZXZfZGF0YTsKKwl1bnNpZ25lZCBjaGFyIGRhdGE7CisJbXV0ZXhfbG9jaygmc3QtPmxvY2spOworCWNvbmZpZ19yZWFkKHN0LCBSRUdfQ09OVFJPTCwgJmRhdGEpOworCW11dGV4X3VubG9jaygmc3QtPmxvY2spOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIjB4JXhcbiIsIGRhdGEpOworfQorCitzdGF0aWMgc3NpemVfdCBhZDJzMTIxMF9zdG9yZV9jb250cm9sKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgbGVuKQoreworCXN0cnVjdCBpaW9fZGV2ICppZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkMnMxMjEwX3N0YXRlICpzdCA9IGlkZXYtPmRldl9kYXRhOworCXVuc2lnbmVkIGxvbmcgdWRhdGE7CisJdW5zaWduZWQgY2hhciBkYXRhOworCWludCByZXQ7CisKKwlyZXQgPSBzdHJpY3Rfc3RydG91bChidWYsIDE2LCAmdWRhdGEpOworCWlmIChyZXQpIHsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBlcnJvcl9yZXQ7CisJfQorCW11dGV4X2xvY2soJnN0LT5sb2NrKTsKKwljb25maWdfd3JpdGUoc3QsIFJFR19DT05UUk9MKTsKKwlkYXRhID0gdWRhdGEgJiBNU0JfSVNfTE9XOworCWNvbmZpZ193cml0ZShzdCwgZGF0YSk7CisJY29uZmlnX3JlYWQoc3QsIFJFR19DT05UUk9MLCAmZGF0YSk7CisJaWYgKGRhdGEgJiBNU0JfSVNfSElHSCkgeworCQlyZXQgPSAtRUlPOworCQlwcl9lcnIoImFkMnMxMjEwOiB3cml0ZSBjb250cm9sIHJlZ2lzdGVyIGZhaWxcbiIpOworCQlnb3RvIGVycm9yX3JldDsKKwl9CisJc3QtPnJlc29sdXRpb24gPSByZXNvbHV0aW9uX3ZhbHVlW2RhdGEgJiBTRVRfUkVTT0xVVElPTl07CisjaWYgZGVmaW5lZChDT05GSUdfQUQyUzEyMTBfR1BJT19JTlBVVCkKKwlkYXRhID0gcmVhZF9yZXNvbHV0aW9uX3BpbihzdCk7CisJaWYgKGRhdGEgIT0gc3QtPnJlc29sdXRpb24pCisJCXByX3dhcm5pbmcoImFkMnMxMjEwOiByZXNvbHV0aW9uIHNldHRpbmdzIG5vdCBtYXRjaFxuIik7CisjZWxpZiBkZWZpbmVkKENPTkZJR19BRDJTMTIxMF9HUElPX09VVFBVVCkKKwlzZXRfcmVzb2x1dGlvbl9waW4oc3QpOworI2VuZGlmCisJcmV0ID0gbGVuOworCWlmIChkYXRhICYgRU5BQkxFX0hZU1RFUkVTSVMpCisJCXN0LT5oeXN0ZXJlc2lzID0gMTsKKwllbHNlCisJCXN0LT5oeXN0ZXJlc2lzID0gMDsKK2Vycm9yX3JldDoKKwltdXRleF91bmxvY2soJnN0LT5sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3NpemVfdCBhZDJzMTIxMF9zaG93X3Jlc29sdXRpb24oc3RydWN0IGRldmljZSAqZGV2LAorCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqaWRldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDJzMTIxMF9zdGF0ZSAqc3QgPSBpZGV2LT5kZXZfZGF0YTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgc3QtPnJlc29sdXRpb24pOworfQorCitzdGF0aWMgc3NpemVfdCBhZDJzMTIxMF9zdG9yZV9yZXNvbHV0aW9uKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgbGVuKQoreworCXN0cnVjdCBpaW9fZGV2ICppZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkMnMxMjEwX3N0YXRlICpzdCA9IGlkZXYtPmRldl9kYXRhOworCXVuc2lnbmVkIGNoYXIgZGF0YTsKKwl1bnNpZ25lZCBsb25nIHVkYXRhOworCWludCByZXQ7CisKKwlyZXQgPSBzdHJpY3Rfc3RydG91bChidWYsIDEwLCAmdWRhdGEpOworCWlmIChyZXQgfHwgdWRhdGEgPCBSRVNfMTAgfHwgdWRhdGEgPiBSRVNfMTYpIHsKKwkJcHJfZXJyKCJhZDJzMTIxMDogcmVzb2x1dGlvbiBvdXQgb2YgcmFuZ2VcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJbXV0ZXhfbG9jaygmc3QtPmxvY2spOworCWNvbmZpZ19yZWFkKHN0LCBSRUdfQ09OVFJPTCwgJmRhdGEpOworCWRhdGEgJj0gflNFVF9SRVNPTFVUSU9OOworCWRhdGEgfD0gKHVkYXRhIC0gUkVTXzEwKSA+PiAxOworCWNvbmZpZ193cml0ZShzdCwgUkVHX0NPTlRST0wpOworCWNvbmZpZ193cml0ZShzdCwgZGF0YSAmIE1TQl9JU19MT1cpOworCWNvbmZpZ19yZWFkKHN0LCBSRUdfQ09OVFJPTCwgJmRhdGEpOworCWlmIChkYXRhICYgTVNCX0lTX0hJR0gpIHsKKwkJcmV0ID0gLUVJTzsKKwkJcHJfZXJyKCJhZDJzMTIxMDogc2V0dGluZyByZXNvbHV0aW9uIGZhaWxcbiIpOworCQlnb3RvIGVycm9yX3JldDsKKwl9CisJc3QtPnJlc29sdXRpb24gPSByZXNvbHV0aW9uX3ZhbHVlW2RhdGEgJiBTRVRfUkVTT0xVVElPTl07CisjaWYgZGVmaW5lZChDT05GSUdfQUQyUzEyMTBfR1BJT19JTlBVVCkKKwlkYXRhID0gcmVhZF9yZXNvbHV0aW9uX3BpbihzdCk7CisJaWYgKGRhdGEgIT0gc3QtPnJlc29sdXRpb24pCisJCXByX3dhcm5pbmcoImFkMnMxMjEwOiByZXNvbHV0aW9uIHNldHRpbmdzIG5vdCBtYXRjaFxuIik7CisjZWxpZiBkZWZpbmVkKENPTkZJR19BRDJTMTIxMF9HUElPX09VVFBVVCkKKwlzZXRfcmVzb2x1dGlvbl9waW4oc3QpOworI2VuZGlmCisJcmV0ID0gbGVuOworZXJyb3JfcmV0OgorCW11dGV4X3VubG9jaygmc3QtPmxvY2spOworCXJldHVybiByZXQ7Cit9CisvKiByZWFkIHRoZSBmYXVsdCByZWdpc3RlciBzaW5jZSBsYXN0IHNhbXBsZSAqLworc3RhdGljIHNzaXplX3QgYWQyczEyMTBfc2hvd19mYXVsdChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCWludCByZXQgPSAwOworCXNzaXplX3QgbGVuID0gMDsKKwl1bnNpZ25lZCBjaGFyIGRhdGE7CisJc3RydWN0IGlpb19kZXYgKmlkZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQyczEyMTBfc3RhdGUgKnN0ID0gaWRldi0+ZGV2X2RhdGE7CisKKwltdXRleF9sb2NrKCZzdC0+bG9jayk7CisJcmV0ID0gY29uZmlnX3JlYWQoc3QsIFJFR19GQVVMVCwgJmRhdGEpOworCisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9yZXQ7CisJbGVuID0gc3ByaW50ZihidWYsICIweCV4XG4iLCBkYXRhKTsKK2Vycm9yX3JldDoKKwltdXRleF91bmxvY2soJnN0LT5sb2NrKTsKKwlyZXR1cm4gcmV0ID8gcmV0IDogbGVuOworfQorCitzdGF0aWMgc3NpemVfdCBhZDJzMTIxMF9jbGVhcl9mYXVsdChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqaWRldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDJzMTIxMF9zdGF0ZSAqc3QgPSBpZGV2LT5kZXZfZGF0YTsKKwl1bnNpZ25lZCBjaGFyIGRhdGE7CisKKwltdXRleF9sb2NrKCZzdC0+bG9jayk7CisJc3RhcnRfc2FtcGxlKHN0KTsKKwkvKiBkZWxheSAoMiAqIHRjayArIDIwKSBuYW5vIHNlY29uZHMgKi8KKwl1ZGVsYXkoMSk7CisJc3RvcF9zYW1wbGUoc3QpOworCWNvbmZpZ19yZWFkKHN0LCBSRUdfRkFVTFQsICZkYXRhKTsKKwlzdGFydF9zYW1wbGUoc3QpOworCXN0b3Bfc2FtcGxlKHN0KTsKKwltdXRleF91bmxvY2soJnN0LT5sb2NrKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3NpemVfdCBhZDJzMTIxMF9zaG93X3JlZyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICppZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkMnMxMjEwX3N0YXRlICpzdCA9IGlkZXYtPmRldl9kYXRhOworCXVuc2lnbmVkIGNoYXIgZGF0YTsKKwlzdHJ1Y3QgaWlvX2Rldl9hdHRyICppYXR0ciA9IHRvX2lpb19kZXZfYXR0cihhdHRyKTsKKworCW11dGV4X2xvY2soJnN0LT5sb2NrKTsKKwljb25maWdfcmVhZChzdCwgaWF0dHItPmFkZHJlc3MsICZkYXRhKTsKKwltdXRleF91bmxvY2soJnN0LT5sb2NrKTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgZGF0YSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkMnMxMjEwX3N0b3JlX3JlZyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBsZW4pCit7CisJc3RydWN0IGlpb19kZXYgKmlkZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQyczEyMTBfc3RhdGUgKnN0ID0gaWRldi0+ZGV2X2RhdGE7CisJdW5zaWduZWQgbG9uZyBkYXRhOworCWludCByZXQ7CisJc3RydWN0IGlpb19kZXZfYXR0ciAqaWF0dHIgPSB0b19paW9fZGV2X2F0dHIoYXR0cik7CisKKwlyZXQgPSBzdHJpY3Rfc3RydG91bChidWYsIDEwLCAmZGF0YSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJbXV0ZXhfbG9jaygmc3QtPmxvY2spOworCWNvbmZpZ193cml0ZShzdCwgaWF0dHItPmFkZHJlc3MpOworCWNvbmZpZ193cml0ZShzdCwgZGF0YSAmIE1TQl9JU19MT1cpOworCW11dGV4X3VubG9jaygmc3QtPmxvY2spOworCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkMnMxMjEwX3Nob3dfcG9zKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IHNwaV9tZXNzYWdlIG1zZzsKKwlpbnQgcmV0ID0gMDsKKwlzc2l6ZV90IGxlbiA9IDA7CisJdTE2IHBvczsKKwlzdHJ1Y3QgaWlvX2RldiAqaWRldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDJzMTIxMF9zdGF0ZSAqc3QgPSBpZGV2LT5kZXZfZGF0YTsKKworCXN0LT54ZmVyLmxlbiA9IDI7CisJbXV0ZXhfbG9jaygmc3QtPmxvY2spOworCXN0YXJ0X3NhbXBsZShzdCk7CisJLyogZGVsYXkgKDYgKiB0Y2sgKyAyMCkgbmFubyBzZWNvbmRzICovCisJdWRlbGF5KDEpOworCisJc2V0X21vZGUoTU9EX1BPUywgc3QpOworCisJc3BpX21lc3NhZ2VfaW5pdCgmbXNnKTsKKwlzcGlfbWVzc2FnZV9hZGRfdGFpbCgmc3QtPnhmZXIsICZtc2cpOworCXJldCA9IHNwaV9zeW5jKHN0LT5zZGV2LCAmbXNnKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3JldDsKKwlwb3MgPSAoKCgodTE2KShzdC0+cnhbMF0pKSA8PCA4KSB8IChzdC0+cnhbMV0pKTsKKwlpZiAoc3QtPmh5c3RlcmVzaXMpCisJCXBvcyA+Pj0gMTYgLSBzdC0+cmVzb2x1dGlvbjsKKwlsZW4gPSBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBwb3MpOworZXJyb3JfcmV0OgorCXN0b3Bfc2FtcGxlKHN0KTsKKwkvKiBkZWxheSAoMiAqIHRjayArIDIwKSBuYW5vIHNlY29uZHMgKi8KKwl1ZGVsYXkoMSk7CisJbXV0ZXhfdW5sb2NrKCZzdC0+bG9jayk7CisKKwlyZXR1cm4gcmV0ID8gcmV0IDogbGVuOworfQorCitzdGF0aWMgc3NpemVfdCBhZDJzMTIxMF9zaG93X3ZlbChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBzcGlfbWVzc2FnZSBtc2c7CisJdW5zaWduZWQgc2hvcnQgbmVnYXRpdmU7CisJaW50IHJldCA9IDA7CisJc3NpemVfdCBsZW4gPSAwOworCXMxNiB2ZWw7CisJc3RydWN0IGlpb19kZXYgKmlkZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQyczEyMTBfc3RhdGUgKnN0ID0gaWRldi0+ZGV2X2RhdGE7CisKKwlzdC0+eGZlci5sZW4gPSAyOworCW11dGV4X2xvY2soJnN0LT5sb2NrKTsKKwlzdGFydF9zYW1wbGUoc3QpOworCS8qIGRlbGF5ICg2ICogdGNrICsgMjApIG5hbm8gc2Vjb25kcyAqLworCXVkZWxheSgxKTsKKworCXNldF9tb2RlKE1PRF9WRUwsIHN0KTsKKworCXNwaV9tZXNzYWdlX2luaXQoJm1zZyk7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnN0LT54ZmVyLCAmbXNnKTsKKwlyZXQgPSBzcGlfc3luYyhzdC0+c2RldiwgJm1zZyk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9yZXQ7CisJbmVnYXRpdmUgPSBzdC0+cnhbMF0gJiAweDgwOworCXZlbCA9ICgoKChzMTYpKHN0LT5yeFswXSkpIDw8IDgpIHwgKHN0LT5yeFsxXSkpOworCXZlbCA+Pj0gMTYgLSBzdC0+cmVzb2x1dGlvbjsKKwlpZiAobmVnYXRpdmUpIHsKKwkJbmVnYXRpdmUgPSAoMHhmZmZmID4+IHN0LT5yZXNvbHV0aW9uKSA8PCBzdC0+cmVzb2x1dGlvbjsKKwkJdmVsIHw9IG5lZ2F0aXZlOworCX0KKwlsZW4gPSBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCB2ZWwpOworZXJyb3JfcmV0OgorCXN0b3Bfc2FtcGxlKHN0KTsKKwkvKiBkZWxheSAoMiAqIHRjayArIDIwKSBuYW5vIHNlY29uZHMgKi8KKwl1ZGVsYXkoMSk7CisJbXV0ZXhfdW5sb2NrKCZzdC0+bG9jayk7CisKKwlyZXR1cm4gcmV0ID8gcmV0IDogbGVuOworfQorCitzdGF0aWMgc3NpemVfdCBhZDJzMTIxMF9zaG93X3Bvc192ZWwoc3RydWN0IGRldmljZSAqZGV2LAorCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3Qgc3BpX21lc3NhZ2UgbXNnOworCXVuc2lnbmVkIHNob3J0IG5lZ2F0aXZlOworCWludCByZXQgPSAwOworCXNzaXplX3QgbGVuID0gMDsKKwl1MTYgcG9zOworCXMxNiB2ZWw7CisJc3RydWN0IGlpb19kZXYgKmlkZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQyczEyMTBfc3RhdGUgKnN0ID0gaWRldi0+ZGV2X2RhdGE7CisKKwlzdC0+eGZlci5sZW4gPSAyOworCW11dGV4X2xvY2soJnN0LT5sb2NrKTsKKwlzdGFydF9zYW1wbGUoc3QpOworCS8qIGRlbGF5ICg2ICogdGNrICsgMjApIG5hbm8gc2Vjb25kcyAqLworCXVkZWxheSgxKTsKKworCXNldF9tb2RlKE1PRF9QT1MsIHN0KTsKKworCXNwaV9tZXNzYWdlX2luaXQoJm1zZyk7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnN0LT54ZmVyLCAmbXNnKTsKKwlyZXQgPSBzcGlfc3luYyhzdC0+c2RldiwgJm1zZyk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9yZXQ7CisJcG9zID0gKCgoKHUxNikoc3QtPnJ4WzBdKSkgPDwgOCkgfCAoc3QtPnJ4WzFdKSk7CisJaWYgKHN0LT5oeXN0ZXJlc2lzKQorCQlwb3MgPj49IDE2IC0gc3QtPnJlc29sdXRpb247CisJbGVuID0gc3ByaW50ZihidWYsICIlZCAiLCBwb3MpOworCisJc3QtPnhmZXIubGVuID0gMjsKKwlzZXRfbW9kZShNT0RfVkVMLCBzdCk7CisJc3BpX21lc3NhZ2VfaW5pdCgmbXNnKTsKKwlzcGlfbWVzc2FnZV9hZGRfdGFpbCgmc3QtPnhmZXIsICZtc2cpOworCXJldCA9IHNwaV9zeW5jKHN0LT5zZGV2LCAmbXNnKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3JldDsKKwluZWdhdGl2ZSA9IHN0LT5yeFswXSAmIDB4ODA7CisJdmVsID0gKCgoKHMxNikoc3QtPnJ4WzBdKSkgPDwgOCkgfCAoc3QtPnJ4WzFdKSk7CisJdmVsID4+PSAxNiAtIHN0LT5yZXNvbHV0aW9uOworCWlmIChuZWdhdGl2ZSkgeworCQluZWdhdGl2ZSA9ICgweGZmZmYgPj4gc3QtPnJlc29sdXRpb24pIDw8IHN0LT5yZXNvbHV0aW9uOworCQl2ZWwgfD0gbmVnYXRpdmU7CisJfQorCWxlbiArPSBzcHJpbnRmKGJ1ZiArIGxlbiwgIiVkXG4iLCB2ZWwpOworZXJyb3JfcmV0OgorCXN0b3Bfc2FtcGxlKHN0KTsKKwkvKiBkZWxheSAoMiAqIHRjayArIDIwKSBuYW5vIHNlY29uZHMgKi8KKwl1ZGVsYXkoMSk7CisJbXV0ZXhfdW5sb2NrKCZzdC0+bG9jayk7CisKKwlyZXR1cm4gcmV0ID8gcmV0IDogbGVuOworfQorCitzdGF0aWMgSUlPX0NPTlNUX0FUVFIoZGVzY3JpcHRpb24sCisJIlZhcmlhYmxlIFJlc29sdXRpb24sIDEwLUJpdCB0byAxNkJpdCBSL0RcblwKK0NvbnZlcnRlciB3aXRoIFJlZmVyZW5jZSBPc2NpbGxhdG9yIik7CitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKHJhd19pbywgU19JUlVHTyB8IFNfSVdVU1IsCisJCWFkMnMxMjEwX3Nob3dfcmF3LCBhZDJzMTIxMF9zdG9yZV9yYXcsIDApOworc3RhdGljIElJT19ERVZJQ0VfQVRUUihyZXNldCwgU19JV1VTUiwKKwkJTlVMTCwgYWQyczEyMTBfc3RvcmVfc29mdHJlc2V0LCAwKTsKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIoZmNsa2luLCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJYWQyczEyMTBfc2hvd19mY2xraW4sIGFkMnMxMjEwX3N0b3JlX2ZjbGtpbiwgMCk7CitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKGZleGNpdCwgU19JUlVHTyB8IFNfSVdVU1IsCisJCWFkMnMxMjEwX3Nob3dfZmV4Y2l0LAlhZDJzMTIxMF9zdG9yZV9mZXhjaXQsIDApOworc3RhdGljIElJT19ERVZJQ0VfQVRUUihjb250cm9sLCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJYWQyczEyMTBfc2hvd19jb250cm9sLCBhZDJzMTIxMF9zdG9yZV9jb250cm9sLCAwKTsKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIoYml0cywgU19JUlVHTyB8IFNfSVdVU1IsCisJCWFkMnMxMjEwX3Nob3dfcmVzb2x1dGlvbiwgYWQyczEyMTBfc3RvcmVfcmVzb2x1dGlvbiwgMCk7CitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKGZhdWx0LCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJYWQyczEyMTBfc2hvd19mYXVsdCwgYWQyczEyMTBfY2xlYXJfZmF1bHQsIDApOworc3RhdGljIElJT19ERVZJQ0VfQVRUUihwb3MsIFNfSVJVR08sCisJCWFkMnMxMjEwX3Nob3dfcG9zLCBOVUxMLCAwKTsKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIodmVsLCBTX0lSVUdPLAorCQlhZDJzMTIxMF9zaG93X3ZlbCwgTlVMTCwgMCk7CitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKHBvc192ZWwsIFNfSVJVR08sCisJCWFkMnMxMjEwX3Nob3dfcG9zX3ZlbCwgTlVMTCwgMCk7CitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKGxvc190aHJkLCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJYWQyczEyMTBfc2hvd19yZWcsIGFkMnMxMjEwX3N0b3JlX3JlZywgUkVHX0xPU19USFJEKTsKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIoZG9zX292cl90aHJkLCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJYWQyczEyMTBfc2hvd19yZWcsIGFkMnMxMjEwX3N0b3JlX3JlZywgUkVHX0RPU19PVlJfVEhSRCk7CitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKGRvc19taXNfdGhyZCwgU19JUlVHTyB8IFNfSVdVU1IsCisJCWFkMnMxMjEwX3Nob3dfcmVnLCBhZDJzMTIxMF9zdG9yZV9yZWcsIFJFR19ET1NfTUlTX1RIUkQpOworc3RhdGljIElJT19ERVZJQ0VfQVRUUihkb3NfcnN0X21heF90aHJkLCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJYWQyczEyMTBfc2hvd19yZWcsIGFkMnMxMjEwX3N0b3JlX3JlZywgUkVHX0RPU19SU1RfTUFYX1RIUkQpOworc3RhdGljIElJT19ERVZJQ0VfQVRUUihkb3NfcnN0X21pbl90aHJkLCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJYWQyczEyMTBfc2hvd19yZWcsIGFkMnMxMjEwX3N0b3JlX3JlZywgUkVHX0RPU19SU1RfTUlOX1RIUkQpOworc3RhdGljIElJT19ERVZJQ0VfQVRUUihsb3RfaGlnaF90aHJkLCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJYWQyczEyMTBfc2hvd19yZWcsIGFkMnMxMjEwX3N0b3JlX3JlZywgUkVHX0xPVF9ISUdIX1RIUkQpOworc3RhdGljIElJT19ERVZJQ0VfQVRUUihsb3RfbG93X3RocmQsIFNfSVJVR08gfCBTX0lXVVNSLAorCQlhZDJzMTIxMF9zaG93X3JlZywgYWQyczEyMTBfc3RvcmVfcmVnLCBSRUdfTE9UX0xPV19USFJEKTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmFkMnMxMjEwX2F0dHJpYnV0ZXNbXSA9IHsKKwkmaWlvX2NvbnN0X2F0dHJfZGVzY3JpcHRpb24uZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX3Jhd19pby5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfcmVzZXQuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2ZjbGtpbi5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfZmV4Y2l0LmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9jb250cm9sLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9iaXRzLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9mYXVsdC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfcG9zLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl92ZWwuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX3Bvc192ZWwuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2xvc190aHJkLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9kb3Nfb3ZyX3RocmQuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2Rvc19taXNfdGhyZC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfZG9zX3JzdF9tYXhfdGhyZC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfZG9zX3JzdF9taW5fdGhyZC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfbG90X2hpZ2hfdGhyZC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfbG90X2xvd190aHJkLmRldl9hdHRyLmF0dHIsCisJTlVMTCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGFkMnMxMjEwX2F0dHJpYnV0ZV9ncm91cCA9IHsKKwkubmFtZSA9IERSVl9OQU1FLAorCS5hdHRycyA9IGFkMnMxMjEwX2F0dHJpYnV0ZXMsCit9OworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBhZDJzMTIxMF9pbml0aWFsKHN0cnVjdCBhZDJzMTIxMF9zdGF0ZSAqc3QpCit7CisJdW5zaWduZWQgY2hhciBkYXRhOworCWludCByZXQ7CisKKwltdXRleF9sb2NrKCZzdC0+bG9jayk7CisjaWYgZGVmaW5lZChDT05GSUdfQUQyUzEyMTBfR1BJT19JTlBVVCkKKwlzdC0+cmVzb2x1dGlvbiA9IHJlYWRfcmVzb2x1dGlvbl9waW4oc3QpOworI2VsaWYgZGVmaW5lZChDT05GSUdfQUQyUzEyMTBfR1BJT19PVVRQVVQpCisJc2V0X3Jlc29sdXRpb25fcGluKHN0KTsKKyNlbmRpZgorCisJY29uZmlnX3dyaXRlKHN0LCBSRUdfQ09OVFJPTCk7CisJZGF0YSA9IERFRl9DT05UUk9MICYgfihTRVRfUkVTT0xVVElPTik7CisJZGF0YSB8PSAoc3QtPnJlc29sdXRpb24gLSBSRVNfMTApID4+IDE7CisJY29uZmlnX3dyaXRlKHN0LCBkYXRhKTsKKwlyZXQgPSBjb25maWdfcmVhZChzdCwgUkVHX0NPTlRST0wsICZkYXRhKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3JldDsKKworCWlmIChkYXRhICYgTVNCX0lTX0hJR0gpIHsKKwkJcmV0ID0gLUVJTzsKKwkJZ290byBlcnJvcl9yZXQ7CisJfQorCisJdXBkYXRlX2ZyZXF1ZW5jeV9jb250cm9sX3dvcmQoc3QpOworCXNvZnRfcmVzZXQoc3QpOworZXJyb3JfcmV0OgorCW11dGV4X3VubG9jaygmc3QtPmxvY2spOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGFkMnMxMjEwX3Byb2JlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJc3RydWN0IGFkMnMxMjEwX3N0YXRlICpzdDsKKwlpbnQgcG4sIHJldCA9IDA7CisJdW5zaWduZWQgc2hvcnQgKnBpbnMgPSBzcGktPmRldi5wbGF0Zm9ybV9kYXRhOworCisJZm9yIChwbiA9IDA7IHBuIDwgQUQyUzEyMTBfUE47IHBuKyspIHsKKwkJaWYgKGdwaW9fcmVxdWVzdChwaW5zW3BuXSwgRFJWX05BTUUpKSB7CisJCQlwcl9lcnIoIiVzOiByZXF1ZXN0IGdwaW8gcGluICVkIGZhaWxlZFxuIiwKKwkJCQkJCURSVl9OQU1FLCBwaW5zW3BuXSk7CisJCQlnb3RvIGVycm9yX3JldDsKKwkJfQorCQlpZiAocG4gPCBBRDJTMTIxMF9TQUEpCisJCQlncGlvX2RpcmVjdGlvbl9vdXRwdXQocGluc1twbl0sIDEpOworCQllbHNlIHsKKyNpZiBkZWZpbmVkKENPTkZJR19BRDJTMTIxMF9HUElPX0lOUFVUKQorCQkJZ3Bpb19kaXJlY3Rpb25faW5wdXQocGluc1twbl0pOworI2VsaWYgZGVmaW5lZChDT05GSUdfQUQyUzEyMTBfR1BJT19PVVRQVVQpCisJCQlncGlvX2RpcmVjdGlvbl9vdXRwdXQocGluc1twbl0sIDEpOworI2VuZGlmCisJCX0KKwl9CisKKwlzdCA9IGt6YWxsb2Moc2l6ZW9mKCpzdCksIEdGUF9LRVJORUwpOworCWlmIChzdCA9PSBOVUxMKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3JfcmV0OworCX0KKwlzcGlfc2V0X2RydmRhdGEoc3BpLCBzdCk7CisKKwltdXRleF9pbml0KCZzdC0+bG9jayk7CisJc3QtPnNkZXYgPSBzcGk7CisJc3QtPnhmZXIudHhfYnVmID0gc3QtPnR4OworCXN0LT54ZmVyLnJ4X2J1ZiA9IHN0LT5yeDsKKwlzdC0+aHlzdGVyZXNpcyA9IDE7CisJc3QtPm1vZGUgPSBNT0RfQ09ORklHOworCXN0LT5yZXNvbHV0aW9uID0gUkVTXzEyOworCXN0LT5mY2xraW4gPSBBRDJTMTIxMF9ERUZfQ0xLSU47CisJc3QtPmZleGNpdCA9IEFEMlMxMjEwX0RFRl9FWENJVDsKKwlzdC0+c2FtcGxlID0gcGluc1swXTsKKwlzdC0+YTAgPSBwaW5zWzFdOworCXN0LT5hMSA9IHBpbnNbMl07CisJc3QtPnJlczAgPSBwaW5zWzNdOworCXN0LT5yZXMxID0gcGluc1s0XTsKKworCXN0LT5pZGV2ID0gaWlvX2FsbG9jYXRlX2RldmljZSgpOworCWlmIChzdC0+aWRldiA9PSBOVUxMKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3JfZnJlZV9zdDsKKwl9CisJc3QtPmlkZXYtPmRldi5wYXJlbnQgPSAmc3BpLT5kZXY7CisJc3QtPmlkZXYtPm51bV9pbnRlcnJ1cHRfbGluZXMgPSAwOworCXN0LT5pZGV2LT5ldmVudF9hdHRycyA9IE5VTEw7CisKKwlzdC0+aWRldi0+YXR0cnMgPSAmYWQyczEyMTBfYXR0cmlidXRlX2dyb3VwOworCXN0LT5pZGV2LT5kZXZfZGF0YSA9ICh2b2lkICopKHN0KTsKKwlzdC0+aWRldi0+ZHJpdmVyX21vZHVsZSA9IFRISVNfTU9EVUxFOworCXN0LT5pZGV2LT5tb2RlcyA9IElORElPX0RJUkVDVF9NT0RFOworCisJcmV0ID0gaWlvX2RldmljZV9yZWdpc3RlcihzdC0+aWRldik7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9mcmVlX2RldjsKKworCWlmIChzcGktPm1heF9zcGVlZF9oeiAhPSBBRDJTMTIxMF9ERUZfQ0xLSU4pCisJCXN0LT5mY2xraW4gPSBzcGktPm1heF9zcGVlZF9oejsKKwlzcGktPm1vZGUgPSBTUElfTU9ERV8zOworCXNwaV9zZXR1cChzcGkpOworCisJYWQyczEyMTBfaW5pdGlhbChzdCk7CisJcmV0dXJuIDA7CisKK2Vycm9yX2ZyZWVfZGV2OgorCWlpb19mcmVlX2RldmljZShzdC0+aWRldik7CitlcnJvcl9mcmVlX3N0OgorCWtmcmVlKHN0KTsKK2Vycm9yX3JldDoKKwlmb3IgKC0tcG47IHBuID49IDA7IHBuLS0pCisJCWdwaW9fZnJlZShwaW5zW3BuXSk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgYWQyczEyMTBfcmVtb3ZlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJc3RydWN0IGFkMnMxMjEwX3N0YXRlICpzdCA9IHNwaV9nZXRfZHJ2ZGF0YShzcGkpOworCisJaWlvX2RldmljZV91bnJlZ2lzdGVyKHN0LT5pZGV2KTsKKwlrZnJlZShzdCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzcGlfZHJpdmVyIGFkMnMxMjEwX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9IERSVl9OQU1FLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwl9LAorCS5wcm9iZSA9IGFkMnMxMjEwX3Byb2JlLAorCS5yZW1vdmUgPSBfX2RldmV4aXRfcChhZDJzMTIxMF9yZW1vdmUpLAorfTsKKworc3RhdGljIF9faW5pdCBpbnQgYWQyczEyMTBfc3BpX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gc3BpX3JlZ2lzdGVyX2RyaXZlcigmYWQyczEyMTBfZHJpdmVyKTsKK30KK21vZHVsZV9pbml0KGFkMnMxMjEwX3NwaV9pbml0KTsKKworc3RhdGljIF9fZXhpdCB2b2lkIGFkMnMxMjEwX3NwaV9leGl0KHZvaWQpCit7CisJc3BpX3VucmVnaXN0ZXJfZHJpdmVyKCZhZDJzMTIxMF9kcml2ZXIpOworfQorbW9kdWxlX2V4aXQoYWQyczEyMTBfc3BpX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJHcmFmZiBZYW5nIDxncmFmZi55YW5nQGdtYWlsLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiQW5hbG9nIERldmljZXMgQUQyUzEyMTAgUmVzb2x2ZXIgdG8gRGlnaXRhbCBTUEkgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL3Jlc29sdmVyL2FkMnM5MC5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9yZXNvbHZlci9hZDJzOTAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTQzNTM1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9yZXNvbHZlci9hZDJzOTAuYwpAQCAtMCwwICsxLDE1OSBAQAorLyoKKyAqIGFkMnM5MC5jIHNpbXBsZSBzdXBwb3J0IGZvciB0aGUgQURJIFJlc29sdmVyIHRvIERpZ2l0YWwgQ29udmVydGVyczogQUQyUzkwCisgKgorICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTAgQW5hbG9nIERldmljZXMgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICovCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KKworI2luY2x1ZGUgIi4uL2lpby5oIgorI2luY2x1ZGUgIi4uL3N5c2ZzLmgiCisKKyNkZWZpbmUgRFJWX05BTUUgImFkMnM5MCIKKworc3RydWN0IGFkMnM5MF9zdGF0ZSB7CisJc3RydWN0IG11dGV4IGxvY2s7CisJc3RydWN0IGlpb19kZXYgKmlkZXY7CisJc3RydWN0IHNwaV9kZXZpY2UgKnNkZXY7CisJdTggcnhbMl07CisJdTggdHhbMl07Cit9OworCitzdGF0aWMgc3NpemVfdCBhZDJzOTBfc2hvd19hbmd1bGFyKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IHNwaV9tZXNzYWdlIG1zZzsKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyIHhmZXI7CisJaW50IHJldDsKKwlzc2l6ZV90IGxlbiA9IDA7CisJdTE2IHZhbDsKKwlzdHJ1Y3QgaWlvX2RldiAqaWRldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDJzOTBfc3RhdGUgKnN0ID0gaWRldi0+ZGV2X2RhdGE7CisKKwl4ZmVyLmxlbiA9IDE7CisJeGZlci50eF9idWYgPSBzdC0+dHg7CisJeGZlci5yeF9idWYgPSBzdC0+cng7CisJbXV0ZXhfbG9jaygmc3QtPmxvY2spOworCisJc3BpX21lc3NhZ2VfaW5pdCgmbXNnKTsKKwlzcGlfbWVzc2FnZV9hZGRfdGFpbCgmeGZlciwgJm1zZyk7CisJcmV0ID0gc3BpX3N5bmMoc3QtPnNkZXYsICZtc2cpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfcmV0OworCXZhbCA9ICgoKHUxNikoc3QtPnJ4WzBdKSkgPDwgNCkgfCAoKHN0LT5yeFsxXSAmIDB4RjApID4+IDQpOworCWxlbiA9IHNwcmludGYoYnVmLCAiJWRcbiIsIHZhbCk7CitlcnJvcl9yZXQ6CisJbXV0ZXhfdW5sb2NrKCZzdC0+bG9jayk7CisKKwlyZXR1cm4gcmV0ID8gcmV0IDogbGVuOworfQorCisjZGVmaW5lIElJT19ERVZfQVRUUl9TSU1QTEVfUkVTT0xWRVIoX3Nob3cpIFwKKwlJSU9fREVWSUNFX0FUVFIoYW5ndWxhciwgU19JUlVHTywgX3Nob3csIE5VTEwsIDApCisKK3N0YXRpYyBJSU9fQ09OU1RfQVRUUihkZXNjcmlwdGlvbiwKKwkiTG93IENvc3QsIENvbXBsZXRlIDEyLUJpdCBSZXNvbHZlci10by1EaWdpdGFsIENvbnZlcnRlciIpOworc3RhdGljIElJT19ERVZfQVRUUl9TSU1QTEVfUkVTT0xWRVIoYWQyczkwX3Nob3dfYW5ndWxhcik7CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICphZDJzOTBfYXR0cmlidXRlc1tdID0geworCSZpaW9fY29uc3RfYXR0cl9kZXNjcmlwdGlvbi5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfYW5ndWxhci5kZXZfYXR0ci5hdHRyLAorCU5VTEwsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBhZDJzOTBfYXR0cmlidXRlX2dyb3VwID0geworCS5uYW1lID0gRFJWX05BTUUsCisJLmF0dHJzID0gYWQyczkwX2F0dHJpYnV0ZXMsCit9OworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBhZDJzOTBfcHJvYmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlzdHJ1Y3QgYWQyczkwX3N0YXRlICpzdDsKKwlpbnQgcmV0ID0gMDsKKworCXN0ID0ga3phbGxvYyhzaXplb2YoKnN0KSwgR0ZQX0tFUk5FTCk7CisJaWYgKHN0ID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJvcl9yZXQ7CisJfQorCXNwaV9zZXRfZHJ2ZGF0YShzcGksIHN0KTsKKworCW11dGV4X2luaXQoJnN0LT5sb2NrKTsKKwlzdC0+c2RldiA9IHNwaTsKKworCXN0LT5pZGV2ID0gaWlvX2FsbG9jYXRlX2RldmljZSgpOworCWlmIChzdC0+aWRldiA9PSBOVUxMKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3JfZnJlZV9zdDsKKwl9CisJc3QtPmlkZXYtPmRldi5wYXJlbnQgPSAmc3BpLT5kZXY7CisJc3QtPmlkZXYtPm51bV9pbnRlcnJ1cHRfbGluZXMgPSAwOworCXN0LT5pZGV2LT5ldmVudF9hdHRycyA9IE5VTEw7CisKKwlzdC0+aWRldi0+YXR0cnMgPSAmYWQyczkwX2F0dHJpYnV0ZV9ncm91cDsKKwlzdC0+aWRldi0+ZGV2X2RhdGEgPSAodm9pZCAqKShzdCk7CisJc3QtPmlkZXYtPmRyaXZlcl9tb2R1bGUgPSBUSElTX01PRFVMRTsKKwlzdC0+aWRldi0+bW9kZXMgPSBJTkRJT19ESVJFQ1RfTU9ERTsKKworCXJldCA9IGlpb19kZXZpY2VfcmVnaXN0ZXIoc3QtPmlkZXYpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfZnJlZV9kZXY7CisKKwkvKiBuZWVkIDYwMG5zIGJldHdlZW4gQ1MgYW5kIHRoZSBmaXJzdCBmYWxsaW5nIGVkZ2Ugb2YgU0NMSyAqLworCXNwaS0+bWF4X3NwZWVkX2h6ID0gODMwMDAwOworCXNwaS0+bW9kZSA9IFNQSV9NT0RFXzM7CisJc3BpX3NldHVwKHNwaSk7CisKKwlyZXR1cm4gMDsKKworZXJyb3JfZnJlZV9kZXY6CisJaWlvX2ZyZWVfZGV2aWNlKHN0LT5pZGV2KTsKK2Vycm9yX2ZyZWVfc3Q6CisJa2ZyZWUoc3QpOworZXJyb3JfcmV0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IGFkMnM5MF9yZW1vdmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlzdHJ1Y3QgYWQyczkwX3N0YXRlICpzdCA9IHNwaV9nZXRfZHJ2ZGF0YShzcGkpOworCisJaWlvX2RldmljZV91bnJlZ2lzdGVyKHN0LT5pZGV2KTsKKwlrZnJlZShzdCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzcGlfZHJpdmVyIGFkMnM5MF9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSBEUlZfTkFNRSwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJfSwKKwkucHJvYmUgPSBhZDJzOTBfcHJvYmUsCisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKGFkMnM5MF9yZW1vdmUpLAorfTsKKworc3RhdGljIF9faW5pdCBpbnQgYWQyczkwX3NwaV9pbml0KHZvaWQpCit7CisJcmV0dXJuIHNwaV9yZWdpc3Rlcl9kcml2ZXIoJmFkMnM5MF9kcml2ZXIpOworfQorbW9kdWxlX2luaXQoYWQyczkwX3NwaV9pbml0KTsKKworc3RhdGljIF9fZXhpdCB2b2lkIGFkMnM5MF9zcGlfZXhpdCh2b2lkKQoreworCXNwaV91bnJlZ2lzdGVyX2RyaXZlcigmYWQyczkwX2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdChhZDJzOTBfc3BpX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJHcmFmZiBZYW5nIDxncmFmZi55YW5nQGdtYWlsLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiQW5hbG9nIERldmljZXMgQUQyUzkwIFJlc29sdmVyIHRvIERpZ2l0YWwgU1BJIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9zeXNmcy5oIGIvZHJpdmVycy9zdGFnaW5nL2lpby9zeXNmcy5oCmluZGV4IGVlOTFhOTUuLjI0Yjc0ZGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vc3lzZnMuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL3N5c2ZzLmgKQEAgLTEwOCw2ICsxMDgsMTIgQEAKIAlJSU9fREVWSUNFX0FUVFIobmFtZSwgU19JUlVHTywgX3Nob3csIE5VTEwsIDApCiAKIC8qKgorICogSUlPX0RFVl9BVFRSX1JFU0VUOiByZXNldHMgdGhlIGRldmljZQorICoqLworI2RlZmluZSBJSU9fREVWX0FUVFJfUkVTRVQoX3N0b3JlKQkJCVwKKwlJSU9fREVWSUNFX0FUVFIocmVzZXQsIFNfSVdVU1IsIE5VTEwsIF9zdG9yZSwgMCkKKworLyoqCiAgKiBJSU9fQ09OU1RfQVRUUl9OQU1FIC0gY29uc3RhbnQgaWRlbnRpZmllcgogICogQF9zdHJpbmc6IHRoZSBuYW1lCiAgKiovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaW50ZWxfc3N0L0tjb25maWcgYi9kcml2ZXJzL3N0YWdpbmcvaW50ZWxfc3N0L0tjb25maWcKaW5kZXggYjQ2YmQ5ZC4uODIzOTEwNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2ludGVsX3NzdC9LY29uZmlnCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9pbnRlbF9zc3QvS2NvbmZpZwpAQCAtOCw2ICs4LDcgQEAKIAogY29uZmlnIFNORF9JTlRFTE1JRAogCXRyaXN0YXRlICJJbnRlbCBNSUQgc291bmQgY2FyZCBkcml2ZXIiCisJZGVwZW5kcyBvbiBTT1VORCAmJiBTTkQKIAlzZWxlY3QgU05EX1BDTQogCXNlbGVjdCBTTkRfU0VRVUVOQ0VSCiAJc2VsZWN0IFNORF9KQUNLCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaW50ZWxfc3N0L2ludGVsX3NzdC5jIGIvZHJpdmVycy9zdGFnaW5nL2ludGVsX3NzdC9pbnRlbF9zc3QuYwppbmRleCAyNGQzOTI4Li5jZTRhOWY3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaW50ZWxfc3N0L2ludGVsX3NzdC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9pbnRlbF9zc3QvaW50ZWxfc3N0LmMKQEAgLTI5LDExICsyOSwxNCBAQAogICogIFRoaXMgZmlsZSBjb250YWlucyBhbGwgaW5pdCBmdW5jdGlvbnMKICAqLwogCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisKICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CiAjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUuaD4KICNpbmNsdWRlIDxhc20vbXJzdC5oPgogI2luY2x1ZGUgImludGVsX3NzdC5oIgogI2luY2x1ZGUgImludGVsX3NzdF9pb2N0bC5oIgpAQCAtMTY5LDE3ICsxNzIsMTcgQEAKIHsKIAlpbnQgaSwgcmV0ID0gMDsKIAotCXByX2RlYnVnKCJzc3Q6IFByb2JlIGZvciBESUQgJXhcbiIsIHBjaS0+ZGV2aWNlKTsKKwlwcl9kZWJ1ZygiUHJvYmUgZm9yIERJRCAleFxuIiwgcGNpLT5kZXZpY2UpOwogCW11dGV4X2xvY2soJmRydl9jdHhfbG9jayk7CiAJaWYgKHNzdF9kcnZfY3R4KSB7Ci0JCXByX2Vycigic3N0OiBPbmx5IG9uZSBzc3QgaGFuZGxlIGlzIHN1cHBvcnRlZFxuIik7CisJCXByX2VycigiT25seSBvbmUgc3N0IGhhbmRsZSBpcyBzdXBwb3J0ZWRcbiIpOwogCQltdXRleF91bmxvY2soJmRydl9jdHhfbG9jayk7CiAJCXJldHVybiAtRUJVU1k7CiAJfQogCiAJc3N0X2Rydl9jdHggPSBremFsbG9jKHNpemVvZigqc3N0X2Rydl9jdHgpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXNzdF9kcnZfY3R4KSB7Ci0JCXByX2Vycigic3N0OiBpbnRlbF9zc3QgbWFsbG9jIGZhaWxcbiIpOworCQlwcl9lcnIoIm1hbGxvYyBmYWlsXG4iKTsKIAkJbXV0ZXhfdW5sb2NrKCZkcnZfY3R4X2xvY2spOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CkBAIC0yMjYsNyArMjI5LDcgQEAKIAlzcGluX2xvY2tfaW5pdCgmc3N0X2Rydl9jdHgtPmxpc3Rfc3Bpbl9sb2NrKTsKIAogCXNzdF9kcnZfY3R4LT5tYXhfc3RyZWFtcyA9IHBjaV9pZC0+ZHJpdmVyX2RhdGE7Ci0JcHJfZGVidWcoInNzdDogR290IGRydiBkYXRhIG1heCBzdHJlYW0gJWRcbiIsCisJcHJfZGVidWcoIkdvdCBkcnYgZGF0YSBtYXggc3RyZWFtICVkXG4iLAogCQkJCXNzdF9kcnZfY3R4LT5tYXhfc3RyZWFtcyk7CiAJZm9yIChpID0gMTsgaSA8PSBzc3RfZHJ2X2N0eC0+bWF4X3N0cmVhbXM7IGkrKykgewogCQlzdHJ1Y3Qgc3RyZWFtX2luZm8gKnN0cmVhbSA9ICZzc3RfZHJ2X2N0eC0+c3RyZWFtc1tpXTsKQEAgLTI0MSwxOCArMjQ0LDE4IEBACiAJCQlzc3RfZHJ2X2N0eC0+bW1hcF9tZW0gPQogCQkJCWt6YWxsb2Moc3N0X2Rydl9jdHgtPm1tYXBfbGVuLCBHRlBfS0VSTkVMKTsKIAkJCWlmIChzc3RfZHJ2X2N0eC0+bW1hcF9tZW0pIHsKLQkJCQlwcl9kZWJ1Zygic3N0OiBHb3QgbWVtb3J5ICVwIHNpemUgMHgleFxuIiwKKwkJCQlwcl9kZWJ1ZygiR290IG1lbW9yeSAlcCBzaXplIDB4JXhcbiIsCiAJCQkJCXNzdF9kcnZfY3R4LT5tbWFwX21lbSwKIAkJCQkJc3N0X2Rydl9jdHgtPm1tYXBfbGVuKTsKIAkJCQlicmVhazsKIAkJCX0KIAkJCWlmIChzc3RfZHJ2X2N0eC0+bW1hcF9sZW4gPCAoU1NUX01NQVBfU1RFUCpQQUdFX1NJWkUpKSB7Ci0JCQkJcHJfZXJyKCJzc3Q6IG1lbSBhbGxvYyBmYWlsLi4uYWJvcnQhIVxuIik7CisJCQkJcHJfZXJyKCJtZW0gYWxsb2MgZmFpbC4uLmFib3J0ISFcbiIpOwogCQkJCXJldCA9IC1FTk9NRU07CiAJCQkJZ290byBmcmVlX3Byb2Nlc3NfcmVwbHlfd3E7CiAJCQl9CiAJCQlzc3RfZHJ2X2N0eC0+bW1hcF9sZW4gLT0gKFNTVF9NTUFQX1NURVAgKiBQQUdFX1NJWkUpOwotCQkJcHJfZGVidWcoInNzdDptZW0gYWxsb2MgZmFpbGVkLi4udHJ5aW5nICVkXG4iLAorCQkJcHJfZGVidWcoIm1lbSBhbGxvYyBmYWlsZWQuLi50cnlpbmcgJWRcbiIsCiAJCQkJCQlzc3RfZHJ2X2N0eC0+bW1hcF9sZW4pOwogCQl9CiAJfQpAQCAtMjYwLDcgKzI2Myw3IEBACiAJLyogSW5pdCB0aGUgZGV2aWNlICovCiAJcmV0ID0gcGNpX2VuYWJsZV9kZXZpY2UocGNpKTsKIAlpZiAocmV0KSB7Ci0JCXByX2Vycigic3N0OiBkZXZpY2UgY2FudCBiZSBlbmFibGVkXG4iKTsKKwkJcHJfZXJyKCJkZXZpY2UgY2FudCBiZSBlbmFibGVkXG4iKTsKIAkJZ290byBkb19mcmVlX21lbTsKIAl9CiAJc3N0X2Rydl9jdHgtPnBjaSA9IHBjaV9kZXZfZ2V0KHBjaSk7CkBAIC0yNzMsMjUgKzI3NiwyNSBAQAogCXNzdF9kcnZfY3R4LT5zaGltID0gcGNpX2lvcmVtYXBfYmFyKHBjaSwgMSk7CiAJaWYgKCFzc3RfZHJ2X2N0eC0+c2hpbSkKIAkJZ290byBkb19yZWxlYXNlX3JlZ2lvbnM7Ci0JcHJfZGVidWcoInNzdDogU1NUIFNoaW0gUHRyICVwXG4iLCBzc3RfZHJ2X2N0eC0+c2hpbSk7CisJcHJfZGVidWcoIlNTVCBTaGltIFB0ciAlcFxuIiwgc3N0X2Rydl9jdHgtPnNoaW0pOwogCiAJLyogU2hhcmVkIFNSQU0gKi8KIAlzc3RfZHJ2X2N0eC0+bWFpbGJveCA9IHBjaV9pb3JlbWFwX2JhcihwY2ksIDIpOwogCWlmICghc3N0X2Rydl9jdHgtPm1haWxib3gpCiAJCWdvdG8gZG9fdW5tYXBfc2hpbTsKLQlwcl9kZWJ1Zygic3N0OiBTUkFNIFB0ciAlcFxuIiwgc3N0X2Rydl9jdHgtPm1haWxib3gpOworCXByX2RlYnVnKCJTUkFNIFB0ciAlcFxuIiwgc3N0X2Rydl9jdHgtPm1haWxib3gpOwogCiAJLyogSVJBTSAqLwogCXNzdF9kcnZfY3R4LT5pcmFtID0gcGNpX2lvcmVtYXBfYmFyKHBjaSwgMyk7CiAJaWYgKCFzc3RfZHJ2X2N0eC0+aXJhbSkKIAkJZ290byBkb191bm1hcF9zcmFtOwotCXByX2RlYnVnKCJzc3Q6SVJBTSBQdHIgJXBcbiIsIHNzdF9kcnZfY3R4LT5pcmFtKTsKKwlwcl9kZWJ1ZygiSVJBTSBQdHIgJXBcbiIsIHNzdF9kcnZfY3R4LT5pcmFtKTsKIAogCS8qIERSQU0gKi8KIAlzc3RfZHJ2X2N0eC0+ZHJhbSA9IHBjaV9pb3JlbWFwX2JhcihwY2ksIDQpOwogCWlmICghc3N0X2Rydl9jdHgtPmRyYW0pCiAJCWdvdG8gZG9fdW5tYXBfaXJhbTsKLQlwcl9kZWJ1Zygic3N0OiBEUkFNIFB0ciAlcFxuIiwgc3N0X2Rydl9jdHgtPmRyYW0pOworCXByX2RlYnVnKCJEUkFNIFB0ciAlcFxuIiwgc3N0X2Rydl9jdHgtPmRyYW0pOwogCiAJbXV0ZXhfbG9jaygmc3N0X2Rydl9jdHgtPnNzdF9sb2NrKTsKIAlzc3RfZHJ2X2N0eC0+c3N0X3N0YXRlID0gU1NUX1VOX0lOSVQ7CkBAIC0zMDEsMjYgKzMwNCwzMSBAQAogCQlJUlFGX1NIQVJFRCwgU1NUX0RSVl9OQU1FLCBzc3RfZHJ2X2N0eCk7CiAJaWYgKHJldCkKIAkJZ290byBkb191bm1hcF9kcmFtOwotCXByX2RlYnVnKCJzc3Q6IFJlZ2lzdGVyZWQgSVJRIDB4JXhcbiIsIHBjaS0+aXJxKTsKKwlwcl9kZWJ1ZygiUmVnaXN0ZXJlZCBJUlEgMHgleFxuIiwgcGNpLT5pcnEpOworCisJLypSZWdpc3RlciBMUEUgQ29udHJvbCBhcyBtaXNjIGRyaXZlciovCisJcmV0ID0gbWlzY19yZWdpc3RlcigmbHBlX2N0cmwpOworCWlmIChyZXQpIHsKKwkJcHJfZXJyKCJjb3VsZG4ndCByZWdpc3RlciBjb250cm9sIGRldmljZVxuIik7CisJCWdvdG8gZG9fZnJlZV9pcnE7CisJfQogCiAJaWYgKHNzdF9kcnZfY3R4LT5wY2lfaWQgPT0gU1NUX01SU1RfUENJX0lEKSB7CiAJCXJldCA9IG1pc2NfcmVnaXN0ZXIoJmxwZV9kZXYpOwogCQlpZiAocmV0KSB7Ci0JCQlwcl9lcnIoInNzdDogY291bGRuJ3QgcmVnaXN0ZXIgTFBFIGRldmljZVxuIik7Ci0JCQlnb3RvIGRvX2ZyZWVfaXJxOwotCQl9Ci0KLQkJLypSZWdpc3RlciBMUEUgQ29udHJvbCBhcyBtaXNjIGRyaXZlciovCi0JCXJldCA9IG1pc2NfcmVnaXN0ZXIoJmxwZV9jdHJsKTsKLQkJaWYgKHJldCkgewotCQkJcHJfZXJyKCJzc3Q6IGNvdWxkbid0IHJlZ2lzdGVyIG1pc2MgZHJpdmVyXG4iKTsKLQkJCWdvdG8gZG9fZnJlZV9pcnE7Ci0JCX0KKyAJCQlwcl9lcnIoImNvdWxkbid0IHJlZ2lzdGVyIG1pc2MgZHJpdmVyXG4iKTsKKwkJCWdvdG8gZG9fZnJlZV9taXNjOworIAkJfQogCX0KIAlzc3RfZHJ2X2N0eC0+bHBlX3N0YWxsZWQgPSAwOwotCXByX2RlYnVnKCJzc3Q6IC4uLnN1Y2Nlc3NmdWxseSBkb25lISEhXG4iKTsKKwlwbV9ydW50aW1lX3NldF9hY3RpdmUoJnBjaS0+ZGV2KTsKKwlwbV9ydW50aW1lX2VuYWJsZSgmcGNpLT5kZXYpOworCXBtX3J1bnRpbWVfYWxsb3coJnBjaS0+ZGV2KTsKKwlwcl9kZWJ1ZygiLi4uc3VjY2Vzc2Z1bGx5IGRvbmUhISFcbiIpOwogCXJldHVybiByZXQ7CiAKK2RvX2ZyZWVfbWlzYzoKKwltaXNjX2RlcmVnaXN0ZXIoJmxwZV9jdHJsKTsKIGRvX2ZyZWVfaXJxOgogCWZyZWVfaXJxKHBjaS0+aXJxLCBzc3RfZHJ2X2N0eCk7CiBkb191bm1hcF9kcmFtOgpAQCAtMzQ3LDcgKzM1NSw3IEBACiAJZGVzdHJveV93b3JrcXVldWUoc3N0X2Rydl9jdHgtPm1hZF93cSk7CiBkb19mcmVlX2Rydl9jdHg6CiAJa2ZyZWUoc3N0X2Rydl9jdHgpOwotCXByX2Vycigic3N0OiBQcm9iZSBmYWlsZWQgd2l0aCAweCV4XG4iLCByZXQpOworCXByX2VycigiUHJvYmUgZmFpbGVkIHdpdGggMHgleFxuIiwgcmV0KTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0zNjUsMTAgKzM3Myw5IEBACiAJbXV0ZXhfbG9jaygmc3N0X2Rydl9jdHgtPnNzdF9sb2NrKTsKIAlzc3RfZHJ2X2N0eC0+c3N0X3N0YXRlID0gU1NUX1VOX0lOSVQ7CiAJbXV0ZXhfdW5sb2NrKCZzc3RfZHJ2X2N0eC0+c3N0X2xvY2spOwotCWlmIChzc3RfZHJ2X2N0eC0+cGNpX2lkID09IFNTVF9NUlNUX1BDSV9JRCkgeworCW1pc2NfZGVyZWdpc3RlcigmbHBlX2N0cmwpOworCWlmIChzc3RfZHJ2X2N0eC0+cGNpX2lkID09IFNTVF9NUlNUX1BDSV9JRCkKIAkJbWlzY19kZXJlZ2lzdGVyKCZscGVfZGV2KTsKLQkJbWlzY19kZXJlZ2lzdGVyKCZscGVfY3RybCk7Ci0JfQogCWZyZWVfaXJxKHBjaS0+aXJxLCBzc3RfZHJ2X2N0eCk7CiAJaW91bm1hcChzc3RfZHJ2X2N0eC0+ZHJhbSk7CiAJaW91bm1hcChzc3RfZHJ2X2N0eC0+aXJhbSk7CkBAIC00MDQsMTAgKzQxMSwxMiBAQAogewogCXVuaW9uIGNvbmZpZ19zdGF0dXNfcmVnIGNzcjsKIAotCXByX2RlYnVnKCJzc3Q6IGludGVsX3NzdF9zdXNwZW5kIGNhbGxlZFxuIik7CisJcHJfZGVidWcoImludGVsX3NzdF9zdXNwZW5kIGNhbGxlZFxuIik7CiAKLQlpZiAoc3N0X2Rydl9jdHgtPnBiX3N0cmVhbXMgIT0gMCB8fCBzc3RfZHJ2X2N0eC0+Y3Bfc3RyZWFtcyAhPSAwKQotCQlyZXR1cm4gLUVQRVJNOworCWlmIChzc3RfZHJ2X2N0eC0+c3RyZWFtX2NudCkgeworCQlwcl9lcnIoImFjdGl2ZSBzdHJlYW1zLG5vdCBhYmxlIHRvIHN1c3BlbmRcbiIpOworCQlyZXR1cm4gLUVCVVNZOworCX0KIAkvKkFzc2VydCBSRVNFVCBvbiBMUEUgUHJvY2Vzc29yKi8KIAljc3IuZnVsbCA9IHNzdF9zaGltX3JlYWQoc3N0X2Rydl9jdHgtPnNoaW0sIFNTVF9DU1IpOwogCWNzci5mdWxsID0gY3NyLmZ1bGwgfCAweDI7CkBAIC00MzQsMTcgKzQ0MywxNyBAQAogewogCWludCByZXQgPSAwOwogCi0JcHJfZGVidWcoInNzdDogaW50ZWxfc3N0X3Jlc3VtZSBjYWxsZWRcbiIpOworCXByX2RlYnVnKCJpbnRlbF9zc3RfcmVzdW1lIGNhbGxlZFxuIik7CiAJaWYgKHNzdF9kcnZfY3R4LT5zc3Rfc3RhdGUgIT0gU1NUX1NVU1BFTkRFRCkgewotCQlwcl9lcnIoInNzdDogU1NUIGlzIG5vdCBpbiBzdXNwZW5kZWQgc3RhdGVcbiIpOwotCQlyZXR1cm4gLUVQRVJNOworCQlwcl9lcnIoIlNTVCBpcyBub3QgaW4gc3VzcGVuZGVkIHN0YXRlXG4iKTsKKwkJcmV0dXJuIDA7CiAJfQogCXNzdF9kcnZfY3R4ID0gcGNpX2dldF9kcnZkYXRhKHBjaSk7CiAJcGNpX3NldF9wb3dlcl9zdGF0ZShwY2ksIFBDSV9EMCk7CiAJcGNpX3Jlc3RvcmVfc3RhdGUocGNpKTsKIAlyZXQgPSBwY2lfZW5hYmxlX2RldmljZShwY2kpOwogCWlmIChyZXQpCi0JCXByX2Vycigic3N0OiBkZXZpY2UgY2FudCBiZSBlbmFibGVkXG4iKTsKKwkJcHJfZXJyKCJkZXZpY2UgY2FudCBiZSBlbmFibGVkXG4iKTsKIAogCW11dGV4X2xvY2soJnNzdF9kcnZfY3R4LT5zc3RfbG9jayk7CiAJc3N0X2Rydl9jdHgtPnNzdF9zdGF0ZSA9IFNTVF9VTl9JTklUOwpAQCAtNDUyLDYgKzQ2MSwzNCBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IGludGVsX3NzdF9ydW50aW1lX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2ID0gdG9fcGNpX2RldihkZXYpOworCXByX2RlYnVnKCJydW50aW1lX3N1c3BlbmQgY2FsbGVkXG4iKTsKKwlyZXR1cm4gaW50ZWxfc3N0X3N1c3BlbmQocGNpX2RldiwgUE1TR19TVVNQRU5EKTsKK30KKworc3RhdGljIGludCBpbnRlbF9zc3RfcnVudGltZV9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2ID0gdG9fcGNpX2RldihkZXYpOworCXByX2RlYnVnKCJydW50aW1lX3Jlc3VtZSBjYWxsZWRcbiIpOworCXJldHVybiBpbnRlbF9zc3RfcmVzdW1lKHBjaV9kZXYpOworfQorCitzdGF0aWMgaW50IGludGVsX3NzdF9ydW50aW1lX2lkbGUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXByX2RlYnVnKCJydW50aW1lX2lkbGUgY2FsbGVkXG4iKTsKKwlpZiAoc3N0X2Rydl9jdHgtPnN0cmVhbV9jbnQgPT0gMCAmJiBzc3RfZHJ2X2N0eC0+YW1fY250ID09IDApCisJCXBtX3NjaGVkdWxlX3N1c3BlbmQoZGV2LCBTU1RfU1VTUEVORF9ERUxBWSk7CisJcmV0dXJuIC1FQlVTWTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBkZXZfcG1fb3BzIGludGVsX3NzdF9wbSA9IHsKKwkucnVudGltZV9zdXNwZW5kID0gaW50ZWxfc3N0X3J1bnRpbWVfc3VzcGVuZCwKKwkucnVudGltZV9yZXN1bWUgPSBpbnRlbF9zc3RfcnVudGltZV9yZXN1bWUsCisJLnJ1bnRpbWVfaWRsZSA9IGludGVsX3NzdF9ydW50aW1lX2lkbGUsCit9OworCiAvKiBQQ0kgUm91dGluZXMgKi8KIHN0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBpbnRlbF9zc3RfaWRzW10gPSB7CiAJeyBQQ0lfVkRFVklDRShJTlRFTCwgU1NUX01SU1RfUENJX0lEKSwgM30sCkBAIC00NjgsNiArNTA1LDkgQEAKICNpZmRlZiBDT05GSUdfUE0KIAkuc3VzcGVuZCA9IGludGVsX3NzdF9zdXNwZW5kLAogCS5yZXN1bWUgPSBpbnRlbF9zc3RfcmVzdW1lLAorCS5kcml2ZXIgPSB7CisJCS5wbSA9ICZpbnRlbF9zc3RfcG0sCisJfSwKICNlbmRpZgogfTsKIApAQCAtNDgyLDE0ICs1MjIsMTQgQEAKIHsKIAkvKiBJbml0IGFsbCB2YXJpYWJsZXMsIGRhdGEgc3RydWN0dXJlIGV0Yy4uLi4qLwogCWludCByZXQgPSAwOwotCXByX2RlYnVnKCJzc3Q6IElORk86ICoqKioqKioqIFNTVCBEUklWRVIgbG9hZGluZy4uIFZlcjogJXNcbiIsCisJcHJfZGVidWcoIklORk86ICoqKioqKioqIFNTVCBEUklWRVIgbG9hZGluZy4uIFZlcjogJXNcbiIsCiAJCQkJICAgICAgIFNTVF9EUklWRVJfVkVSU0lPTik7CiAKIAltdXRleF9pbml0KCZkcnZfY3R4X2xvY2spOwogCS8qIFJlZ2lzdGVyIHdpdGggUENJICovCiAJcmV0ID0gcGNpX3JlZ2lzdGVyX2RyaXZlcigmZHJpdmVyKTsKIAlpZiAocmV0KQotCQlwcl9lcnIoInNzdDogUENJIHJlZ2lzdGVyIGZhaWxlZFxuIik7CisJCXByX2VycigiUENJIHJlZ2lzdGVyIGZhaWxlZFxuIik7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtNTA0LDcgKzU0NCw3IEBACiB7CiAJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZkcml2ZXIpOwogCi0JcHJfZGVidWcoInNzdDogZHJpdmVyIHVubG9hZGVkXG4iKTsKKwlwcl9kZWJ1ZygiZHJpdmVyIHVubG9hZGVkXG4iKTsKIAlyZXR1cm47CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9pbnRlbF9zc3QvaW50ZWxfc3N0LmggYi9kcml2ZXJzL3N0YWdpbmcvaW50ZWxfc3N0L2ludGVsX3NzdC5oCmluZGV4IDFmMTlmMGQuLmNiMDNmZjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9pbnRlbF9zc3QvaW50ZWxfc3N0LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2ludGVsX3NzdC9pbnRlbF9zc3QuaApAQCAtMjksNiArMjksNyBAQAogICoJYW5kIG1pZGRsZXdhcmUuCiAgKiAgVGhpcyBmaWxlIGlzIHNoYXJlZCBiZXR3ZWVuIHRoZSBTU1QgYW5kIE1BRCBkcml2ZXJzCiAgKi8KKyNpbmNsdWRlICJpbnRlbF9zc3RfaW9jdGwuaCIKIAogI2RlZmluZSBTU1RfQ0FSRF9OQU1FUyAiaW50ZWxfbWlkX2NhcmQiCiAKQEAgLTEwNywxMCArMTA4LDE1IEBACiAJaW50ICgqcG93ZXJfZG93bl9wbWljKSAodm9pZCk7CiB9OwogCitzdHJ1Y3QgaW50ZWxfc3N0X3BjbV9jb250cm9sIHsKKwlpbnQgKCpvcGVuKSAoc3RydWN0IHNuZF9zc3RfcGFyYW1zICpzdHJfcGFyYW0pOworCWludCAoKmRldmljZV9jb250cm9sKSAoaW50IGNtZCwgdm9pZCAqYXJnKTsKKwlpbnQgKCpjbG9zZSkgKHVuc2lnbmVkIGludCBzdHJfaWQpOworfTsKIHN0cnVjdCBpbnRlbF9zc3RfY2FyZF9vcHMgewogCWNoYXIgKm1vZHVsZV9uYW1lOwogCXVuc2lnbmVkIGludCAgdmVuZG9yX2lkOwotCWludCAoKmNvbnRyb2xfc2V0KSAoaW50IGNvbnRyb2xfZWxlbWVudCwgdm9pZCAqdmFsdWUpOworCXN0cnVjdCBpbnRlbF9zc3RfcGNtX2NvbnRyb2wgKnBjbV9jb250cm9sOwogCXN0cnVjdCBzbmRfcG1pY19vcHMgKnNjYXJkX29wczsKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9pbnRlbF9zc3QvaW50ZWxfc3N0X2FwcF9pbnRlcmZhY2UuYyBiL2RyaXZlcnMvc3RhZ2luZy9pbnRlbF9zc3QvaW50ZWxfc3N0X2FwcF9pbnRlcmZhY2UuYwppbmRleCA5OTE0NDAwLi5hMzY3OTkxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaW50ZWxfc3N0L2ludGVsX3NzdF9hcHBfaW50ZXJmYWNlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2ludGVsX3NzdC9pbnRlbF9zc3RfYXBwX2ludGVyZmFjZS5jCkBAIC0yNywxMiArMjcsMTUgQEAKICAqICBVcHBlciBsYXllciBpbnRlcmZhY2VzIChNQUQgZHJpdmVyLCBNTUYpIHRvIFNTVCBkcml2ZXIKICAqLwogCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisKICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L3Vpby5oPgogI2luY2x1ZGUgPGxpbnV4L2Fpby5oPgogI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUuaD4KICNpbmNsdWRlIDxsaW51eC9pb2N0bC5oPgogI2lmZGVmIENPTkZJR19NUlNUX1JBUl9IQU5ETEVSCiAjaW5jbHVkZSA8bGludXgvcmFyX3JlZ2lzdGVyLmg+CkBAIC01OCwxNCArNjEsMTQgQEAKIHsKIAlpbnQgcmV0dmFsID0gMDsKIAlpZiAoc3N0X2Rydl9jdHgtPnBtaWNfc3RhdGUgIT0gU05EX01BRF9JTklUX0RPTkUpIHsKLQkJcHJfd2Fybigic3N0OiBTb3VuZCBjYXJkIG5vdCBhdmFpbGJsZVxuICIpOworCQlwcl93YXJuKCJTb3VuZCBjYXJkIG5vdCBhdmFpbGFibGVcbiIpOwogCQlyZXR1cm4gLUVJTzsKIAl9CiAJaWYgKHNzdF9kcnZfY3R4LT5zc3Rfc3RhdGUgPT0gU1NUX1NVU1BFTkRFRCkgewotCQlwcl9kZWJ1Zygic3N0OiBSZXN1bWluZyBmcm9tIFN1c3BlbmRlZCBzdGF0ZVxuIik7CisJCXByX2RlYnVnKCJSZXN1bWluZyBmcm9tIFN1c3BlbmRlZCBzdGF0ZVxuIik7CiAJCXJldHZhbCA9IGludGVsX3NzdF9yZXN1bWUoc3N0X2Rydl9jdHgtPnBjaSk7CiAJCWlmIChyZXR2YWwpIHsKLQkJCXByX2RlYnVnKCJzc3Q6IFJlc3VtZSBGYWlsZWQ9ICUjeCxhYm9ydFxuIiwgcmV0dmFsKTsKKwkJCXByX2RlYnVnKCJSZXN1bWUgRmFpbGVkPSAlI3gsYWJvcnRcbiIsIHJldHZhbCk7CiAJCQlyZXR1cm4gcmV0dmFsOwogCQl9CiAJfQpAQCAtOTcsMTUgKzEwMCwyMiBAQAogICovCiBpbnQgaW50ZWxfc3N0X29wZW4oc3RydWN0IGlub2RlICppX25vZGUsIHN0cnVjdCBmaWxlICpmaWxlX3B0cikKIHsKLQlpbnQgcmV0dmFsID0gaW50ZWxfc3N0X2NoZWNrX2RldmljZSgpOwotCWlmIChyZXR2YWwpCi0JCXJldHVybiByZXR2YWw7CisJdW5zaWduZWQgaW50IHJldHZhbDsKIAogCW11dGV4X2xvY2soJnNzdF9kcnZfY3R4LT5zdHJlYW1fbG9jayk7CisJcG1fcnVudGltZV9nZXRfc3luYygmc3N0X2Rydl9jdHgtPnBjaS0+ZGV2KTsKKwlyZXR2YWwgPSBpbnRlbF9zc3RfY2hlY2tfZGV2aWNlKCk7CisJaWYgKHJldHZhbCkgeworCQlwbV9ydW50aW1lX3B1dCgmc3N0X2Rydl9jdHgtPnBjaS0+ZGV2KTsKKwkJbXV0ZXhfdW5sb2NrKCZzc3RfZHJ2X2N0eC0+c3RyZWFtX2xvY2spOworCQlyZXR1cm4gcmV0dmFsOworCX0KKwogCWlmIChzc3RfZHJ2X2N0eC0+ZW5jb2RlZF9jbnQgPCBNQVhfRU5DX1NUUkVBTSkgewogCQlzdHJ1Y3QgaW9jdGxfcHZ0X2RhdGEgKmRhdGEgPQogCQkJa3phbGxvYyhzaXplb2Yoc3RydWN0IGlvY3RsX3B2dF9kYXRhKSwgR0ZQX0tFUk5FTCk7CiAJCWlmICghZGF0YSkgeworCQkJcG1fcnVudGltZV9wdXQoJnNzdF9kcnZfY3R4LT5wY2ktPmRldik7CiAJCQltdXRleF91bmxvY2soJnNzdF9kcnZfY3R4LT5zdHJlYW1fbG9jayk7CiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJfQpAQCAtMTE1LDkgKzEyNSwxMCBAQAogCQlkYXRhLT5wdnRfaWQgPSBzc3RfYXNzaWduX3B2dF9pZChzc3RfZHJ2X2N0eCk7CiAJCWRhdGEtPnN0cl9pZCA9IDA7CiAJCWZpbGVfcHRyLT5wcml2YXRlX2RhdGEgPSAodm9pZCAqKWRhdGE7Ci0JCXByX2RlYnVnKCJzc3Q6IHB2dF9pZCBoYW5kbGUgPSAlZCFcbiIsIGRhdGEtPnB2dF9pZCk7CisJCXByX2RlYnVnKCJwdnRfaWQgaGFuZGxlID0gJWQhXG4iLCBkYXRhLT5wdnRfaWQpOwogCX0gZWxzZSB7CiAJCXJldHZhbCA9IC1FVVNFUlM7CisJCXBtX3J1bnRpbWVfcHV0KCZzc3RfZHJ2X2N0eC0+cGNpLT5kZXYpOwogCQltdXRleF91bmxvY2soJnNzdF9kcnZfY3R4LT5zdHJlYW1fbG9jayk7CiAJfQogCXJldHVybiByZXR2YWw7CkBAIC0xMzYsMTggKzE0NywyNiBAQAogICovCiBpbnQgaW50ZWxfc3N0X29wZW5fY250cmwoc3RydWN0IGlub2RlICppX25vZGUsIHN0cnVjdCBmaWxlICpmaWxlX3B0cikKIHsKLQlpbnQgcmV0dmFsID0gaW50ZWxfc3N0X2NoZWNrX2RldmljZSgpOwotCWlmIChyZXR2YWwpCi0JCXJldHVybiByZXR2YWw7CisJdW5zaWduZWQgaW50IHJldHZhbDsKIAogCS8qIGF1ZGlvIG1hbmFnZXIgb3BlbiAqLwogCW11dGV4X2xvY2soJnNzdF9kcnZfY3R4LT5zdHJlYW1fbG9jayk7CisJcG1fcnVudGltZV9nZXRfc3luYygmc3N0X2Rydl9jdHgtPnBjaS0+ZGV2KTsKKwlyZXR2YWwgPSBpbnRlbF9zc3RfY2hlY2tfZGV2aWNlKCk7CisJaWYgKHJldHZhbCkgeworCQlwbV9ydW50aW1lX3B1dCgmc3N0X2Rydl9jdHgtPnBjaS0+ZGV2KTsKKwkJbXV0ZXhfdW5sb2NrKCZzc3RfZHJ2X2N0eC0+c3RyZWFtX2xvY2spOworCQlyZXR1cm4gcmV0dmFsOworCX0KKwogCWlmIChzc3RfZHJ2X2N0eC0+YW1fY250IDwgTUFYX0FNX0hBTkRMRVMpIHsKIAkJc3N0X2Rydl9jdHgtPmFtX2NudCsrOwotCQlwcl9kZWJ1Zygic3N0OiBBTSBoYW5kbGUgb3BlbmVkLi4uXG4iKTsKKwkJcHJfZGVidWcoIkFNIGhhbmRsZSBvcGVuZWQuLi5cbiIpOwogCQlmaWxlX3B0ci0+cHJpdmF0ZV9kYXRhID0gTlVMTDsKLQl9IGVsc2UKKwl9IGVsc2UgewogCQlyZXR2YWwgPSAtRUFDQ0VTOworCQlwbV9ydW50aW1lX3B1dCgmc3N0X2Rydl9jdHgtPnBjaS0+ZGV2KTsKKwl9CiAKIAltdXRleF91bmxvY2soJnNzdF9kcnZfY3R4LT5zdHJlYW1fbG9jayk7CiAJcmV0dXJuIHJldHZhbDsKQEAgLTE2NiwxMCArMTg1LDExIEBACiB7CiAJc3RydWN0IGlvY3RsX3B2dF9kYXRhICpkYXRhID0gZmlsZV9wdHItPnByaXZhdGVfZGF0YTsKIAotCXByX2RlYnVnKCJzc3Q6IFJlbGVhc2UgY2FsbGVkLCBjbG9zaW5nIGFwcCBoYW5kbGVcbiIpOworCXByX2RlYnVnKCJSZWxlYXNlIGNhbGxlZCwgY2xvc2luZyBhcHAgaGFuZGxlXG4iKTsKIAltdXRleF9sb2NrKCZzc3RfZHJ2X2N0eC0+c3RyZWFtX2xvY2spOwogCXNzdF9kcnZfY3R4LT5lbmNvZGVkX2NudC0tOwogCXNzdF9kcnZfY3R4LT5zdHJlYW1fY250LS07CisJcG1fcnVudGltZV9wdXQoJnNzdF9kcnZfY3R4LT5wY2ktPmRldik7CiAJbXV0ZXhfdW5sb2NrKCZzc3RfZHJ2X2N0eC0+c3RyZWFtX2xvY2spOwogCWZyZWVfc3RyZWFtX2NvbnRleHQoZGF0YS0+c3RyX2lkKTsKIAlrZnJlZShkYXRhKTsKQEAgLTE4MSw4ICsyMDEsOSBAQAogCS8qIGF1ZGlvIG1hbmFnZXIgY2xvc2UgKi8KIAltdXRleF9sb2NrKCZzc3RfZHJ2X2N0eC0+c3RyZWFtX2xvY2spOwogCXNzdF9kcnZfY3R4LT5hbV9jbnQtLTsKKwlwbV9ydW50aW1lX3B1dCgmc3N0X2Rydl9jdHgtPnBjaS0+ZGV2KTsKIAltdXRleF91bmxvY2soJnNzdF9kcnZfY3R4LT5zdHJlYW1fbG9jayk7Ci0JcHJfZGVidWcoInNzdDogQU0gaGFuZGxlIGNsb3NlZFxuIik7CisJcHJfZGVidWcoIkFNIGhhbmRsZSBjbG9zZWRcbiIpOwogCXJldHVybiAwOwogfQogCkBAIC0yMDgsNyArMjI5LDcgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlsZW5ndGggPSB2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQ7Ci0JcHJfZGVidWcoInNzdDogY2FsbGVkIGZvciBzdHJlYW0gJWQgbGVuZ3RoIDB4JXhcbiIsIHN0cl9pZCwgbGVuZ3RoKTsKKwlwcl9kZWJ1ZygiY2FsbGVkIGZvciBzdHJlYW0gJWQgbGVuZ3RoIDB4JXhcbiIsIHN0cl9pZCwgbGVuZ3RoKTsKIAogCWlmIChsZW5ndGggPiBzc3RfZHJ2X2N0eC0+bW1hcF9sZW4pCiAJCXJldHVybiAtRU5PTUVNOwpAQCAtMjMxLDcgKzI1Miw3IEBACiAJZWxzZQogCQlzc3RfZHJ2X2N0eC0+c3RyZWFtc1tzdHJfaWRdLm1tYXBwZWQgPSB0cnVlOwogCi0JcHJfZGVidWcoInNzdDogbW1hcCByZXQgMHgleFxuIiwgcmV0dmFsKTsKKwlwcl9kZWJ1ZygibW1hcCByZXQgMHgleFxuIiwgcmV0dmFsKTsKIAlyZXR1cm4gcmV0dmFsOwogfQogCkBAIC0yNDUsNyArMjY2LDcgQEAKIAlzdHJ1Y3Qgc25kX3NzdF9tbWFwX2J1ZmZfZW50cnkgKmJ1Zl9lbnRyeTsKIAlzdHJ1Y3Qgc25kX3NzdF9tbWFwX2J1ZmZfZW50cnkgKnRtcF9idWY7CiAKLQlwcl9kZWJ1Zygic3N0OmNhbGxlZCBmb3Igc3RyX2lkICVkXG4iLCBzdHJfaWQpOworCXByX2RlYnVnKCJjYWxsZWQgZm9yIHN0cl9pZCAlZFxuIiwgc3RyX2lkKTsKIAlyZXR2YWwgPSBzc3RfdmFsaWRhdGVfc3RyaWQoc3RyX2lkKTsKIAlpZiAocmV0dmFsKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTI3MCw3ICsyOTEsNyBAQAogCQlnb3RvIG91dF9mcmVlOwogCX0KIAotCXByX2RlYnVnKCJzc3Q6bmV3IGJ1ZmZlcnMgY291bnQgJWQgc3RhdHVzICVkXG4iLAorCXByX2RlYnVnKCJuZXcgYnVmZmVycyBjb3VudCAlZCBzdGF0dXMgJWRcbiIsCiAJCQltbWFwX2J1Zi0+ZW50cmllcywgc3RyZWFtLT5zdGF0dXMpOwogCWJ1Zl9lbnRyeSA9IHRtcF9idWY7CiAJZm9yIChpID0gMDsgaSA8IG1tYXBfYnVmLT5lbnRyaWVzOyBpKyspIHsKQEAgLTMwMCwxNCArMzIxLDE0IEBACiAJCXN0cmVhbS0+c3RhdHVzID0gU1RSRUFNX1JVTk5JTkc7CiAJCWlmIChzdHJlYW0tPm9wcyA9PSBTVFJFQU1fT1BTX1BMQVlCQUNLKSB7CiAJCQlpZiAoc3N0X3BsYXlfZnJhbWUoc3RyX2lkKSA8IDApIHsKLQkJCQlwcl93YXJuKCJzc3Q6IHBsYXkgZnJhbWVzIGZhaWxcbiIpOworCQkJCXByX3dhcm4oInBsYXkgZnJhbWVzIGZhaWxcbiIpOwogCQkJCW11dGV4X3VubG9jaygmc3RyZWFtLT5sb2NrKTsKIAkJCQlyZXR2YWwgPSAtRUlPOwogCQkJCWdvdG8gb3V0X2ZyZWU7CiAJCQl9CiAJCX0gZWxzZSBpZiAoc3RyZWFtLT5vcHMgPT0gU1RSRUFNX09QU19DQVBUVVJFKSB7CiAJCQlpZiAoc3N0X2NhcHR1cmVfZnJhbWUoc3RyX2lkKSA8IDApIHsKLQkJCQlwcl93YXJuKCJzc3Q6IGNhcHR1cmUgZnJhbWUgZmFpbFxuIik7CisJCQkJcHJfd2FybigiY2FwdHVyZSBmcmFtZSBmYWlsXG4iKTsKIAkJCQltdXRleF91bmxvY2soJnN0cmVhbS0+bG9jayk7CiAJCQkJcmV0dmFsID0gLUVJTzsKIAkJCQlnb3RvIG91dF9mcmVlOwpAQCAtMzI0LDcgKzM0NSw3IEBACiAKIAlpZiAocmV0dmFsID49IDApCiAJCXJldHZhbCA9IHN0cmVhbS0+Y3VtbV9ieXRlczsKLQlwcl9kZWJ1Zygic3N0OmVuZCBvZiBwbGF5L3JlYyBpb2N0bCBieXRlcyA9ICVkISFcbiIsIHJldHZhbCk7CisJcHJfZGVidWcoImVuZCBvZiBwbGF5L3JlYyBpb2N0bCBieXRlcyA9ICVkISFcbiIsIHJldHZhbCk7CiAKIG91dF9mcmVlOgogCWtmcmVlKHRtcF9idWYpOwpAQCAtMzQ5LDcgKzM3MCw3IEBACiAKIAlpZiAoc3RyZWFtLT5zdGF0dXMgPT0gU1RSRUFNX0lOSVQgJiYgc3RyZWFtLT5wcmV2ID09IFNUUkVBTV9VTl9JTklUKSB7CiAJCS8qIHN0cmVhbSBpcyBub3Qgc3RhcnRlZCB5ZXQgKi8KLQkJcHJfZGVidWcoInNzdDogU3RyZWFtIGlzbid0IGluIHN0YXJ0ZWQgc3RhdGUgJWQsIHByZXYgJWRcbiIsCisJCXByX2RlYnVnKCJTdHJlYW0gaXNuJ3QgaW4gc3RhcnRlZCBzdGF0ZSAlZCwgcHJldiAlZFxuIiwKIAkJCXN0cmVhbS0+c3RhdHVzLCBzdHJlYW0tPnByZXYpOwogCX0gZWxzZSBpZiAoKHN0cmVhbS0+c3RhdHVzID09IFNUUkVBTV9SVU5OSU5HIHx8CiAJCQlzdHJlYW0tPnN0YXR1cyA9PSBTVFJFQU1fUEFVU0VEKSAmJgpAQCAtMzU4LDEzICszNzksMTMgQEAKIAkJaWYgKHN0cmVhbS0+b3BzID09IFNUUkVBTV9PUFNfUExBWUJBQ0sgfHwKIAkJCQlzdHJlYW0tPm9wcyA9PSBTVFJFQU1fT1BTX1BMQVlCQUNLX0RSTSkgewogCQkJaWYgKHNzdF9wbGF5X2ZyYW1lKHN0cl9pZCkgPCAwKSB7Ci0JCQkJcHJfd2Fybigic3N0OiBwbGF5IGZyYW1lcyBmYWlsZWRcbiIpOworCQkJCXByX3dhcm4oInBsYXkgZnJhbWVzIGZhaWxlZFxuIik7CiAJCQkJbXV0ZXhfdW5sb2NrKCZzdHJlYW0tPmxvY2spOwogCQkJCXJldHVybiAtRUlPOwogCQkJfQogCQl9IGVsc2UgaWYgKHN0cmVhbS0+b3BzID09IFNUUkVBTV9PUFNfQ0FQVFVSRSkgewogCQkJaWYgKHNzdF9jYXB0dXJlX2ZyYW1lKHN0cl9pZCkgPCAwKSB7Ci0JCQkJcHJfd2Fybigic3N0OiBjYXB0dXJlIGZyYW1lcyBmYWlsZWRcbiAiKTsKKwkJCQlwcl93YXJuKCJjYXB0dXJlIGZyYW1lcyBmYWlsZWRcbiIpOwogCQkJCW11dGV4X3VubG9jaygmc3RyZWFtLT5sb2NrKTsKIAkJCQlyZXR1cm4gLUVJTzsKIAkJCX0KQEAgLTM3OSw3ICs0MDAsNyBAQAogCXJldHZhbCA9IHNzdF93YWl0X2ludGVycnVwdGlibGUoc3N0X2Rydl9jdHgsICZzdHJlYW0tPmRhdGFfYmxrKTsKIAlpZiAocmV0dmFsKSB7CiAJCXN0cmVhbS0+c3RhdHVzID0gU1RSRUFNX0lOSVQ7Ci0JCXByX2RlYnVnKCJzc3Q6IHdhaXQgcmV0dXJuZWQgZXJyb3IuLi5cbiIpOworCQlwcl9kZWJ1Zygid2FpdCByZXR1cm5lZCBlcnJvci4uLlxuIik7CiAJfQogCXJldHVybiByZXR2YWw7CiB9CkBAIC00NzcsNyArNDk4LDcgQEAKIAkJaWYgKCgodW5zaWduZWQgbG9uZylpb3ZlY1tpbmRleF0uaW92X2Jhc2UKIAkJCQkrIGlvdmVjW2luZGV4XS5pb3ZfbGVuKSA8CiAJCQkJKCh1bnNpZ25lZCBsb25nKWlvdmVjW2luZGV4XS5pb3ZfYmFzZSkpIHsKLQkJCXByX2RlYnVnKCJzc3Q6IEJ1ZmZlciBvdmVyZmxvd3MiKTsKKwkJCXByX2RlYnVnKCJCdWZmZXIgb3ZlcmZsb3dzXG4iKTsKIAkJCWtmcmVlKHN0cmVhbV9idWZzKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CkBAIC00OTAsNyArNTExLDcgQEAKIAkJfQogCiAJCWNvcGllZF9zaXplICs9IHNpemU7Ci0JCXByX2RlYnVnKCJzc3Q6IGNvcGllZF9zaXplIC0gJWx4XG4iLCBjb3BpZWRfc2l6ZSk7CisJCXByX2RlYnVnKCJjb3BpZWRfc2l6ZSAtICVseFxuIiwgY29waWVkX3NpemUpOwogCQlpZiAoKGNvcGllZF9zaXplID49IG1tYXBfbGVuKSB8fAogCQkJCShzdHJlYW0tPnNnX2luZGV4ID09IG5yX3NlZ3MpKSB7CiAJCQlhZGRfdG9fbGlzdCA9IDE7CkBAIC01MjAsNyArNTQxLDcgQEAKIAlpbnQgcmV0dmFsID0gMDsKIAogCS8qIGNvcHkgc2VudCBidWZmZXJzICovCi0JcHJfZGVidWcoInNzdDogY2FwdHVyZSBzdHJlYW0gY29weWluZyB0byB1c2VyIG5vdy4uLlxuIik7CisJcHJfZGVidWcoImNhcHR1cmUgc3RyZWFtIGNvcHlpbmcgdG8gdXNlciBub3cuLi5cbiIpOwogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShrYnVmcywgX2tidWZzLCAmc3RyZWFtLT5idWZzLCBub2RlKSB7CiAJCWlmIChrYnVmcy0+aW5fdXNlID09IHRydWUpIHsKIAkJCS8qIGNvcHkgdG8gdXNlciAqLwpAQCAtNTM4LDcgKzU1OSw3IEBACiAJCQl9CiAJCX0KIAl9Ci0JcHJfZGVidWcoInNzdDogZW5kIG9mIGNhcCBjb3B5XG4iKTsKKwlwcl9kZWJ1ZygiZW5kIG9mIGNhcCBjb3B5XG4iKTsKIAlyZXR1cm4gcmV0dmFsOwogfQogCkBAIC01OTAsNyArNjExLDcgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJc3RyZWFtID0gJnNzdF9kcnZfY3R4LT5zdHJlYW1zW3N0cl9pZF07CiAJaWYgKHN0cmVhbS0+bW1hcHBlZCA9PSB0cnVlKSB7Ci0JCXByX3dhcm4oInNzdDogdXNlciB3cml0ZSBhbmQgc3RyZWFtIGlzIG1hcHBlZCIpOworCQlwcl93YXJuKCJ1c2VyIHdyaXRlIGFuZCBzdHJlYW0gaXMgbWFwcGVkXG4iKTsKIAkJcmV0dXJuIC1FSU87CiAJfQogCWlmICghY291bnQpCkBAIC01OTgsNyArNjE5LDcgQEAKIAlzdHJlYW0tPmN1cnJfYnl0ZXMgPSAwOwogCXN0cmVhbS0+Y3VtbV9ieXRlcyA9IDA7CiAJLyogY29weSB1c2VyIGJ1ZiBkZXRhaWxzICovCi0JcHJfZGVidWcoInNzdDogbmV3IGJ1ZmZlcnMgJXAsIGNvcHkgc2l6ZSAlZCwgc3RhdHVzICVkXG4iICwKKwlwcl9kZWJ1ZygibmV3IGJ1ZmZlcnMgJXAsIGNvcHkgc2l6ZSAlZCwgc3RhdHVzICVkXG4iICwKIAkJCWJ1ZiwgKGludCkgY291bnQsIChpbnQpIHN0cmVhbS0+c3RhdHVzKTsKIAogCXN0cmVhbS0+YnVmX3R5cGUgPSBTU1RfQlVGX1VTRVJfU1RBVElDOwpAQCAtNjE4LDcgKzYzOSw3IEBACiAJc3RyZWFtLT5jdXJfcHRyID0gTlVMTDsKIAlpZiAocmV0dmFsID49IDApCiAJCXJldHZhbCA9IHN0cmVhbS0+Y3VtbV9ieXRlczsKLQlwcl9kZWJ1Zygic3N0OiBlbmQgb2YgcGxheS9yZWMgYnl0ZXMgPSAlZCEhXG4iLCByZXR2YWwpOworCXByX2RlYnVnKCJlbmQgb2YgcGxheS9yZWMgYnl0ZXMgPSAlZCEhXG4iLCByZXR2YWwpOwogCXJldHVybiByZXR2YWw7CiB9CiAKQEAgLTYzOSw3ICs2NjAsNyBAQAogCWludCBzdHJfaWQgPSBkYXRhLT5zdHJfaWQ7CiAJc3RydWN0IHN0cmVhbV9pbmZvICpzdHJlYW0gPSAmc3N0X2Rydl9jdHgtPnN0cmVhbXNbc3RyX2lkXTsKIAotCXByX2RlYnVnKCJzc3Q6IGNhbGxlZCBmb3IgJWRcbiIsIHN0cl9pZCk7CisJcHJfZGVidWcoImNhbGxlZCBmb3IgJWRcbiIsIHN0cl9pZCk7CiAJaWYgKHN0cmVhbS0+c3RhdHVzID09IFNUUkVBTV9VTl9JTklUIHx8CiAJCXN0cmVhbS0+c3RhdHVzID09IFNUUkVBTV9ERUNPREUpIHsKIAkJcmV0dXJuIC1FQkFEUlFDOwpAQCAtNjY1LDEyICs2ODYsMTIgQEAKIAlpbnQgc3RyX2lkID0gZGF0YS0+c3RyX2lkOwogCXN0cnVjdCBzdHJlYW1faW5mbyAqc3RyZWFtOwogCi0JcHJfZGVidWcoInNzdDogZW50cnkgLSAlbGRcbiIsIG5yX3NlZ3MpOworCXByX2RlYnVnKCJlbnRyeSAtICVsZFxuIiwgbnJfc2Vncyk7CiAKIAlpZiAoaXNfc3luY19raW9jYihraW9jYikgPT0gZmFsc2UpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JcHJfZGVidWcoInNzdDogY2FsbGVkIGZvciBzdHJfaWQgJWRcbiIsIHN0cl9pZCk7CisJcHJfZGVidWcoImNhbGxlZCBmb3Igc3RyX2lkICVkXG4iLCBzdHJfaWQpOwogCXJldHZhbCA9IHNzdF92YWxpZGF0ZV9zdHJpZChzdHJfaWQpOwogCWlmIChyZXR2YWwpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtNjgzLDcgKzcwNCw3IEBACiAJfQogCXN0cmVhbS0+Y3Vycl9ieXRlcyA9IDA7CiAJc3RyZWFtLT5jdW1tX2J5dGVzID0gMDsKLQlwcl9kZWJ1Zygic3N0OiBuZXcgc2VncyAlbGQsIG9mZnNldCAlZCwgc3RhdHVzICVkXG4iICwKKwlwcl9kZWJ1ZygibmV3IHNlZ3MgJWxkLCBvZmZzZXQgJWQsIHN0YXR1cyAlZFxuIiAsCiAJCQlucl9zZWdzLCAoaW50KSBvZmZzZXQsIChpbnQpIHN0cmVhbS0+c3RhdHVzKTsKIAlzdHJlYW0tPmJ1Zl90eXBlID0gU1NUX0JVRl9VU0VSX1NUQVRJQzsKIAlkbyB7CkBAIC02OTgsNyArNzE5LDcgQEAKIAlzdHJlYW0tPmN1cl9wdHIgPSBOVUxMOwogCWlmIChyZXR2YWwgPj0gMCkKIAkJcmV0dmFsID0gc3RyZWFtLT5jdW1tX2J5dGVzOwotCXByX2RlYnVnKCJzc3Q6IGVuZCBvZiBwbGF5L3JlYyBieXRlcyA9ICVkISFcbiIsIHJldHZhbCk7CisJcHJfZGVidWcoImVuZCBvZiBwbGF5L3JlYyBieXRlcyA9ICVkISFcbiIsIHJldHZhbCk7CiAJcmV0dXJuIHJldHZhbDsKIH0KIApAQCAtNzE5LDcgKzc0MCw3IEBACiAJaW50IHN0cl9pZCA9IGRhdGEtPnN0cl9pZDsKIAlzdHJ1Y3Qgc3RyZWFtX2luZm8gKnN0cmVhbSA9ICZzc3RfZHJ2X2N0eC0+c3RyZWFtc1tzdHJfaWRdOwogCi0JcHJfZGVidWcoInNzdDogY2FsbGVkIGZvciAlZFxuIiwgc3RyX2lkKTsKKwlwcl9kZWJ1ZygiY2FsbGVkIGZvciAlZFxuIiwgc3RyX2lkKTsKIAlpZiAoc3RyZWFtLT5zdGF0dXMgPT0gU1RSRUFNX1VOX0lOSVQgfHwKIAkJCXN0cmVhbS0+c3RhdHVzID09IFNUUkVBTV9ERUNPREUpCiAJCXJldHVybiAtRUJBRFJRQzsKQEAgLTc0NCwxNCArNzY1LDE0IEBACiAJaW50IHN0cl9pZCA9IGRhdGEtPnN0cl9pZDsKIAlzdHJ1Y3Qgc3RyZWFtX2luZm8gKnN0cmVhbTsKIAotCXByX2RlYnVnKCJzc3Q6IGVudHJ5IC0gJWxkXG4iLCBucl9zZWdzKTsKKwlwcl9kZWJ1ZygiZW50cnkgLSAlbGRcbiIsIG5yX3NlZ3MpOwogCiAJaWYgKGlzX3N5bmNfa2lvY2Ioa2lvY2IpID09IGZhbHNlKSB7Ci0JCXByX2RlYnVnKCJzc3Q6IGFpb19yZWFkIGZyb20gdXNlciBzcGFjZSBpcyBub3QgYWxsb3dlZFxuIik7CisJCXByX2RlYnVnKCJhaW9fcmVhZCBmcm9tIHVzZXIgc3BhY2UgaXMgbm90IGFsbG93ZWRcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlwcl9kZWJ1Zygic3N0OiBjYWxsZWQgZm9yIHN0cl9pZCAlZFxuIiwgc3RyX2lkKTsKKwlwcl9kZWJ1ZygiY2FsbGVkIGZvciBzdHJfaWQgJWRcbiIsIHN0cl9pZCk7CiAJcmV0dmFsID0gc3N0X3ZhbGlkYXRlX3N0cmlkKHN0cl9pZCk7CiAJaWYgKHJldHZhbCkKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC03NjQsNyArNzg1LDcgQEAKIAlzdHJlYW0tPmN1cnJfYnl0ZXMgPSAwOwogCXN0cmVhbS0+Y3VtbV9ieXRlcyA9IDA7CiAKLQlwcl9kZWJ1Zygic3N0OiBuZXcgc2VncyAlbGQsIG9mZnNldCAlZCwgc3RhdHVzICVkXG4iICwKKwlwcl9kZWJ1ZygibmV3IHNlZ3MgJWxkLCBvZmZzZXQgJWQsIHN0YXR1cyAlZFxuIiAsCiAJCQlucl9zZWdzLCAoaW50KSBvZmZzZXQsIChpbnQpIHN0cmVhbS0+c3RhdHVzKTsKIAlzdHJlYW0tPmJ1Zl90eXBlID0gU1NUX0JVRl9VU0VSX1NUQVRJQzsKIAlkbyB7CkBAIC03NzksMzQgKzgwMCwxNjkgQEAKIAlzdHJlYW0tPmN1cl9wdHIgPSBOVUxMOwogCWlmIChyZXR2YWwgPj0gMCkKIAkJcmV0dmFsID0gc3RyZWFtLT5jdW1tX2J5dGVzOwotCXByX2RlYnVnKCJzc3Q6IGVuZCBvZiBwbGF5L3JlYyBieXRlcyA9ICVkISFcbiIsIHJldHZhbCk7CisJcHJfZGVidWcoImVuZCBvZiBwbGF5L3JlYyBieXRlcyA9ICVkISFcbiIsIHJldHZhbCk7CiAJcmV0dXJuIHJldHZhbDsKIH0KIAogLyogc3N0X3ByaW50X3N0cmVhbV9wYXJhbXMgLSBwcmludHMgdGhlIHN0cmVhbSBwYXJhbWV0ZXJzIChkZWJ1ZyBmbikqLwogc3RhdGljIHZvaWQgc3N0X3ByaW50X3N0cmVhbV9wYXJhbXMoc3RydWN0IHNuZF9zc3RfZ2V0X3N0cmVhbV9wYXJhbXMgKmdldF9wcm0pCiB7Ci0JcHJfZGVidWcoInNzdDogY29kZWMgcGFyYW1zOnJlc3VsdCA9JWRcbiIsCisJcHJfZGVidWcoImNvZGVjIHBhcmFtczpyZXN1bHQgPSAlZFxuIiwKIAkJCQlnZXRfcHJtLT5jb2RlY19wYXJhbXMucmVzdWx0KTsKLQlwcl9kZWJ1Zygic3N0OiBjb2RlYyBwYXJhbXM6c3RyZWFtID0gJWRcbiIsCisJcHJfZGVidWcoImNvZGVjIHBhcmFtczpzdHJlYW0gPSAlZFxuIiwKIAkJCQlnZXRfcHJtLT5jb2RlY19wYXJhbXMuc3RyZWFtX2lkKTsKLQlwcl9kZWJ1Zygic3N0OiBjb2RlYyBwYXJhbXM6Y29kZWMgPSAlZFxuIiwKKwlwcl9kZWJ1ZygiY29kZWMgcGFyYW1zOmNvZGVjID0gJWRcbiIsCiAJCQkJZ2V0X3BybS0+Y29kZWNfcGFyYW1zLmNvZGVjKTsKLQlwcl9kZWJ1Zygic3N0OiBjb2RlYyBwYXJhbXM6b3BzID0gJWRcbiIsCisJcHJfZGVidWcoImNvZGVjIHBhcmFtczpvcHMgPSAlZFxuIiwKIAkJCQlnZXRfcHJtLT5jb2RlY19wYXJhbXMub3BzKTsKLQlwcl9kZWJ1Zygic3N0OiBjb2RlYyBwYXJhbXM6c3RyZWFtX3R5cGU9ICVkXG4iLAorCXByX2RlYnVnKCJjb2RlYyBwYXJhbXM6c3RyZWFtX3R5cGUgPSAlZFxuIiwKIAkJCQlnZXRfcHJtLT5jb2RlY19wYXJhbXMuc3RyZWFtX3R5cGUpOwotCXByX2RlYnVnKCJzc3Q6IHBjbXBhcmFtczpzZnJlcT0gJWRcbiIsCisJcHJfZGVidWcoInBjbXBhcmFtczpzZnJlcSA9ICVkXG4iLAogCQkJCWdldF9wcm0tPnBjbV9wYXJhbXMuc2ZyZXEpOwotCXByX2RlYnVnKCJzc3Q6IHBjbXBhcmFtczpudW1fY2hhbj0gJWRcbiIsCisJcHJfZGVidWcoInBjbXBhcmFtczpudW1fY2hhbiA9ICVkXG4iLAogCQkJCWdldF9wcm0tPnBjbV9wYXJhbXMubnVtX2NoYW4pOwotCXByX2RlYnVnKCJzc3Q6IHBjbXBhcmFtczpwY21fd2Rfc3o9ICVkXG4iLAorCXByX2RlYnVnKCJwY21wYXJhbXM6cGNtX3dkX3N6ID0gJWRcbiIsCiAJCQkJZ2V0X3BybS0+cGNtX3BhcmFtcy5wY21fd2Rfc3opOwogCXJldHVybjsKIH0KIAogLyoqCi0gKiBpbnRlbF9zc3RfaW9jdGwgLSByZWNpZXZlcyB0aGUgZGV2aWNlIGlvY3RsJ3MKKyAqIHNzdF9jcmVhdGVfYWxnb19pcGMgLSBjcmVhdGUgaXBjIG1zZyBmb3IgYWxnb3JpdGhtIHBhcmFtZXRlcnMKKyAqCisgKiBAYWxnb19wYXJhbXM6IEFsZ29yaXRobSBwYXJhbWV0ZXJzCisgKiBAbXNnOiBwb3N0IG1zZyBwb2ludGVyCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gY3JlYXRlIGlwYyBtc2cKKyAqLworaW50IHNzdF9jcmVhdGVfYWxnb19pcGMoc3RydWN0IHNuZF9wcHBfcGFyYW1zICphbGdvX3BhcmFtcywKKwkJCQkJc3RydWN0IGlwY19wb3N0ICoqbXNnKQoreworCWlmIChzc3RfY3JlYXRlX2xhcmdlX21zZyhtc2cpKQorCQlyZXR1cm4gLUVOT01FTTsKKwlzc3RfZmlsbF9oZWFkZXIoJigqbXNnKS0+aGVhZGVyLAorCQkJSVBDX0lBX0FMR19QQVJBTVMsIDEsIGFsZ29fcGFyYW1zLT5zdHJfaWQpOworCSgqbXNnKS0+aGVhZGVyLnBhcnQuZGF0YSA9IHNpemVvZih1MzIpICsKKwkJCXNpemVvZigqYWxnb19wYXJhbXMpICsgYWxnb19wYXJhbXMtPnNpemU7CisJbWVtY3B5KCgqbXNnKS0+bWFpbGJveF9kYXRhLCAmKCptc2cpLT5oZWFkZXIsIHNpemVvZih1MzIpKTsKKwltZW1jcHkoKCptc2cpLT5tYWlsYm94X2RhdGEgKyBzaXplb2YodTMyKSwKKwkJCQlhbGdvX3BhcmFtcywgc2l6ZW9mKCphbGdvX3BhcmFtcykpOworCXJldHVybiAwOworfQorCisvKioKKyAqIHNzdF9zZW5kX2FsZ29faXBjIC0gc2VuZCBpcGMgbXNnIGZvciBhbGdvcml0aG0gcGFyYW1ldGVycworICoKKyAqIEBtc2c6IHBvc3QgbXNnIHBvaW50ZXIKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBzZW5kIGlwYyBtc2cKKyAqLworaW50IHNzdF9zZW5kX2FsZ29faXBjKHN0cnVjdCBpcGNfcG9zdCAqKm1zZykKK3sKKwlzc3RfZHJ2X2N0eC0+cHBwX3BhcmFtc19ibGsuY29uZGl0aW9uID0gZmFsc2U7CisJc3N0X2Rydl9jdHgtPnBwcF9wYXJhbXNfYmxrLnJldF9jb2RlID0gMDsKKwlzc3RfZHJ2X2N0eC0+cHBwX3BhcmFtc19ibGsub24gPSB0cnVlOworCXNzdF9kcnZfY3R4LT5wcHBfcGFyYW1zX2Jsay5kYXRhID0gTlVMTDsKKwlzcGluX2xvY2soJnNzdF9kcnZfY3R4LT5saXN0X3NwaW5fbG9jayk7CisJbGlzdF9hZGRfdGFpbCgmKCptc2cpLT5ub2RlLCAmc3N0X2Rydl9jdHgtPmlwY19kaXNwYXRjaF9saXN0KTsKKwlzcGluX3VubG9jaygmc3N0X2Rydl9jdHgtPmxpc3Rfc3Bpbl9sb2NrKTsKKwlzc3RfcG9zdF9tZXNzYWdlKCZzc3RfZHJ2X2N0eC0+aXBjX3Bvc3RfbXNnX3dxKTsKKwlyZXR1cm4gc3N0X3dhaXRfaW50ZXJydXB0aWJsZV90aW1lb3V0KHNzdF9kcnZfY3R4LAorCQkJJnNzdF9kcnZfY3R4LT5wcHBfcGFyYW1zX2JsaywgU1NUX0JMT0NLX1RJTUVPVVQpOworfQorCisvKioKKyAqIGludGVsX3NzdF9pb2N0bF9kc3AgLSByZWNpZXZlcyB0aGUgZGV2aWNlIGlvY3RsJ3MKKyAqCisgKiBAY21kOklvY3RsIGNtZAorICogQGFyZzpkYXRhCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiBhIHVzZXIgc3BhY2UgY29tcG9uZW50CisgKiBzZW5kcyBhIERTUCBJb2N0bCB0byBTU1QgZHJpdmVyCisgKi8KK2xvbmcgaW50ZWxfc3N0X2lvY3RsX2RzcCh1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlpbnQgcmV0dmFsID0gMDsKKwlzdHJ1Y3Qgc25kX3BwcF9wYXJhbXMgYWxnb19wYXJhbXM7CisJc3RydWN0IHNuZF9wcHBfcGFyYW1zICphbGdvX3BhcmFtc19jb3BpZWQ7CisJc3RydWN0IGlwY19wb3N0ICptc2c7CisKKwlzd2l0Y2ggKF9JT0NfTlIoY21kKSkgeworCWNhc2UgX0lPQ19OUihTTkRSVl9TU1RfU0VUX0FMR08pOgorCQlpZiAoY29weV9mcm9tX3VzZXIoJmFsZ29fcGFyYW1zLCAodm9pZCBfX3VzZXIgKilhcmcsCisJCQkJCQkJc2l6ZW9mKGFsZ29fcGFyYW1zKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKGFsZ29fcGFyYW1zLnNpemUgPiBTU1RfTUFJTEJPWF9TSVpFKQorCQkJcmV0dXJuIC1FTVNHU0laRTsKKworCQlwcl9kZWJ1ZygiQWxnbyBJRCAlZCBTdHIgaWQgJWQgRW5hYmxlICVkIFNpemUgJWRcbiIsCisJCQlhbGdvX3BhcmFtcy5hbGdvX2lkLCBhbGdvX3BhcmFtcy5zdHJfaWQsCisJCQlhbGdvX3BhcmFtcy5lbmFibGUsIGFsZ29fcGFyYW1zLnNpemUpOworCQlyZXR2YWwgPSBzc3RfY3JlYXRlX2FsZ29faXBjKCZhbGdvX3BhcmFtcywgJm1zZyk7CisJCWlmIChyZXR2YWwpCisJCQlicmVhazsKKwkJYWxnb19wYXJhbXMucmVzZXJ2ZWQgPSAwOworCQlpZiAoY29weV9mcm9tX3VzZXIobXNnLT5tYWlsYm94X2RhdGEgKyBzaXplb2YoYWxnb19wYXJhbXMpLAorCQkJCWFsZ29fcGFyYW1zLnBhcmFtcywgYWxnb19wYXJhbXMuc2l6ZSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlyZXR2YWwgPSBzc3Rfc2VuZF9hbGdvX2lwYygmbXNnKTsKKwkJaWYgKHJldHZhbCkgeworCQkJcHJfZGVidWcoIkVycm9yIGluIHNzdF9zZXRfYWxnbyA9ICVkXG4iLCByZXR2YWwpOworCQkJcmV0dmFsID0gLUVJTzsKKwkJfQorCQlicmVhazsKKworCWNhc2UgX0lPQ19OUihTTkRSVl9TU1RfR0VUX0FMR08pOgorCQlpZiAoY29weV9mcm9tX3VzZXIoJmFsZ29fcGFyYW1zLCAodm9pZCBfX3VzZXIgKilhcmcsCisJCQkJCQkJc2l6ZW9mKGFsZ29fcGFyYW1zKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcHJfZGVidWcoIkFsZ28gSUQgJWQgU3RyIGlkICVkIEVuYWJsZSAlZCBTaXplICVkXG4iLAorCQkJYWxnb19wYXJhbXMuYWxnb19pZCwgYWxnb19wYXJhbXMuc3RyX2lkLAorCQkJYWxnb19wYXJhbXMuZW5hYmxlLCBhbGdvX3BhcmFtcy5zaXplKTsKKwkJcmV0dmFsID0gc3N0X2NyZWF0ZV9hbGdvX2lwYygmYWxnb19wYXJhbXMsICZtc2cpOworCQlpZiAocmV0dmFsKQorCQkJYnJlYWs7CisJCWFsZ29fcGFyYW1zLnJlc2VydmVkID0gMTsKKwkJcmV0dmFsID0gc3N0X3NlbmRfYWxnb19pcGMoJm1zZyk7CisJCWlmIChyZXR2YWwpIHsKKwkJCXByX2RlYnVnKCJFcnJvciBpbiBzc3RfZ2V0X2FsZ28gPSAlZFxuIiwgcmV0dmFsKTsKKwkJCXJldHZhbCA9IC1FSU87CisJCQlicmVhazsKKwkJfQorCQlhbGdvX3BhcmFtc19jb3BpZWQgPSAoc3RydWN0IHNuZF9wcHBfcGFyYW1zICopCisJCQkJCXNzdF9kcnZfY3R4LT5wcHBfcGFyYW1zX2Jsay5kYXRhOworCQlpZiAoYWxnb19wYXJhbXNfY29waWVkLT5zaXplID4gYWxnb19wYXJhbXMuc2l6ZSkgeworCQkJcHJfZGVidWcoIm1lbSBpbnN1ZmZpY2llbnQgdG8gY29weVxuIik7CisJCQlyZXR2YWwgPSAtRU1TR1NJWkU7CisJCQlnb3RvIGZyZWVfbWVtOworCQl9IGVsc2UgeworCQkJY2hhciBfX3VzZXIgKnRtcDsKKworCQkJaWYgKGNvcHlfdG9fdXNlcihhbGdvX3BhcmFtcy5wYXJhbXMsCisJCQkJCWFsZ29fcGFyYW1zX2NvcGllZC0+cGFyYW1zLAorCQkJCQlhbGdvX3BhcmFtc19jb3BpZWQtPnNpemUpKSB7CisJCQkJcmV0dmFsID0gLUVGQVVMVDsKKwkJCQlnb3RvIGZyZWVfbWVtOworCQkJfQorCQkJdG1wID0gKGNoYXIgX191c2VyICopYXJnICsgb2Zmc2V0b2YoCisJCQkJCXN0cnVjdCBzbmRfcHBwX3BhcmFtcywgc2l6ZSk7CisJCQlpZiAoY29weV90b191c2VyKHRtcCwgJmFsZ29fcGFyYW1zX2NvcGllZC0+c2l6ZSwKKwkJCQkJCSBzaXplb2YoX191MzIpKSkgeworCQkJCXJldHZhbCA9IC1FRkFVTFQ7CisJCQkJZ290byBmcmVlX21lbTsKKwkJCX0KKworCQl9CitmcmVlX21lbToKKwkJa2ZyZWUoYWxnb19wYXJhbXNfY29waWVkLT5wYXJhbXMpOworCQlrZnJlZShhbGdvX3BhcmFtc19jb3BpZWQpOworCQlicmVhazsKKwl9CisJcmV0dXJuIHJldHZhbDsKK30KKworLyoqCisgKiBpbnRlbF9zc3RfaW9jdGwgLSByZWNlaXZlcyB0aGUgZGV2aWNlIGlvY3RsJ3MKICAqIEBmaWxlX3B0cjpwb2ludGVyIHRvIGZpbGUKICAqIEBjbWQ6SW9jdGwgY21kCiAgKiBAYXJnOmRhdGEKQEAgLTgzMiw3ICs5ODgsNyBAQAogCiAJc3dpdGNoIChfSU9DX05SKGNtZCkpIHsKIAljYXNlIF9JT0NfTlIoU05EUlZfU1NUX1NUUkVBTV9QQVVTRSk6Ci0JCXByX2RlYnVnKCJzc3Q6IElPQ1RMX1BBVVNFIHJlY2lldmVkIGZvciAlZCFcbiIsIHN0cl9pZCk7CisJCXByX2RlYnVnKCJJT0NUTF9QQVVTRSByZWNlaXZlZCBmb3IgJWQhXG4iLCBzdHJfaWQpOwogCQlpZiAobWlub3IgIT0gU1RSRUFNX01PRFVMRSkgewogCQkJcmV0dmFsID0gLUVCQURSUUM7CiAJCQlicmVhazsKQEAgLTg0MSw3ICs5OTcsNyBAQAogCQlicmVhazsKIAogCWNhc2UgX0lPQ19OUihTTkRSVl9TU1RfU1RSRUFNX1JFU1VNRSk6Ci0JCXByX2RlYnVnKCJzc3Q6IFNORFJWX1NTVF9JT0NUTF9SRVNVTUUgcmVjaWV2ZWQhXG4iKTsKKwkJcHJfZGVidWcoIlNORFJWX1NTVF9JT0NUTF9SRVNVTUUgcmVjZWl2ZWQhXG4iKTsKIAkJaWYgKG1pbm9yICE9IFNUUkVBTV9NT0RVTEUpIHsKIAkJCXJldHZhbCA9IC1FQkFEUlFDOwogCQkJYnJlYWs7CkBAIC04NTIsNyArMTAwOCw3IEBACiAJY2FzZSBfSU9DX05SKFNORFJWX1NTVF9TVFJFQU1fU0VUX1BBUkFNUyk6IHsKIAkJc3RydWN0IHNuZF9zc3RfcGFyYW1zIHN0cl9wYXJhbTsKIAotCQlwcl9kZWJ1Zygic3N0OiBJT0NUTF9TRVRfUEFSQU1TIHJlY2lldmVkIVxuIik7CisJCXByX2RlYnVnKCJJT0NUTF9TRVRfUEFSQU1TIHJlY2VpdmVkIVxuIik7CiAJCWlmIChtaW5vciAhPSBTVFJFQU1fTU9EVUxFKSB7CiAJCQlyZXR2YWwgPSAtRUJBRFJRQzsKIAkJCWJyZWFrOwpAQCAtODg0LDcgKzEwNDAsNyBAQAogCQkJCQlyZXR2YWwgPSAtRUlOVkFMOwogCQkJfQogCQl9IGVsc2UgewotCQkJcHJfZGVidWcoInNzdDogU0VUX1NUUkVBTV9QQVJBTVMgcmVjaWV2ZWQhXG4iKTsKKwkJCXByX2RlYnVnKCJTRVRfU1RSRUFNX1BBUkFNUyByZWNlaXZlZCFcbiIpOwogCQkJLyogYWxsb2NhdGVkIHNldCBwYXJhbXMgb25seSAqLwogCQkJcmV0dmFsID0gc3N0X3NldF9zdHJlYW1fcGFyYW0oc3RyX2lkLCAmc3RyX3BhcmFtKTsKIAkJCS8qIEJsb2NrIHRoZSBjYWxsIGZvciByZXBseSAqLwpAQCAtOTA3LDE0ICsxMDYzLDE0IEBACiAKIAkJaWYgKGNvcHlfZnJvbV91c2VyKCZzZXRfdm9sLCAodm9pZCBfX3VzZXIgKilhcmcsCiAJCQkJc2l6ZW9mKHNldF92b2wpKSkgewotCQkJcHJfZGVidWcoInNzdDogY29weSBmYWlsZWRcbiIpOworCQkJcHJfZGVidWcoImNvcHkgZmFpbGVkXG4iKTsKIAkJCXJldHZhbCA9IC1FRkFVTFQ7CiAJCQlicmVhazsKIAkJfQotCQlwcl9kZWJ1Zygic3N0OiBTRVRfVk9MVU1FIHJlY2lldmVkIGZvciAlZCFcbiIsCisJCXByX2RlYnVnKCJTRVRfVk9MVU1FIHJlY2lldmVkIGZvciAlZCFcbiIsCiAJCQkJc2V0X3ZvbC5zdHJlYW1faWQpOwogCQlpZiAobWlub3IgPT0gU1RSRUFNX01PRFVMRSAmJiBzZXRfdm9sLnN0cmVhbV9pZCA9PSAwKSB7Ci0JCQlwcl9kZWJ1Zygic3N0OiBpbnZhbGlkIG9wZXJhdGlvbiFcbiIpOworCQkJcHJfZGVidWcoImludmFsaWQgb3BlcmF0aW9uIVxuIik7CiAJCQlyZXR2YWwgPSAtRVBFUk07CiAJCQlicmVhazsKIAkJfQpAQCAtOTI5LDEwICsxMDg1LDEwIEBACiAJCQlyZXR2YWwgPSAtRUZBVUxUOwogCQkJYnJlYWs7CiAJCX0KLQkJcHJfZGVidWcoInNzdDogSU9DVExfR0VUX1ZPTFVNRSByZWNpZXZlZCBmb3Igc3RyZWFtID0gJWQhXG4iLAorCQlwcl9kZWJ1ZygiSU9DVExfR0VUX1ZPTFVNRSByZWNpZXZlZCBmb3Igc3RyZWFtID0gJWQhXG4iLAogCQkJCWdldF92b2wuc3RyZWFtX2lkKTsKIAkJaWYgKG1pbm9yID09IFNUUkVBTV9NT0RVTEUgJiYgZ2V0X3ZvbC5zdHJlYW1faWQgPT0gMCkgewotCQkJcHJfZGVidWcoInNzdDogaW52YWxpZCBvcGVyYXRpb24hXG4iKTsKKwkJCXByX2RlYnVnKCJpbnZhbGlkIG9wZXJhdGlvbiFcbiIpOwogCQkJcmV0dmFsID0gLUVQRVJNOwogCQkJYnJlYWs7CiAJCX0KQEAgLTk0MSw3ICsxMDk3LDcgQEAKIAkJCXJldHZhbCA9IC1FSU87CiAJCQlicmVhazsKIAkJfQotCQlwcl9kZWJ1Zygic3N0OiBpZDolZFxuLCB2b2w6JWQsIHJhbXBfZHVyOiVkLCByYW1wX3R5cGU6JWRcbiIsCisJCXByX2RlYnVnKCJpZDolZFxuLCB2b2w6JWQsIHJhbXBfZHVyOiVkLCByYW1wX3R5cGU6JWRcbiIsCiAJCQkJZ2V0X3ZvbC5zdHJlYW1faWQsIGdldF92b2wudm9sdW1lLAogCQkJCWdldF92b2wucmFtcF9kdXJhdGlvbiwgZ2V0X3ZvbC5yYW1wX3R5cGUpOwogCQlpZiAoY29weV90b191c2VyKChzdHJ1Y3Qgc25kX3NzdF92b2wgX191c2VyICopYXJnLApAQCAtOTYxLDcgKzExMTcsNyBAQAogCQkJcmV0dmFsID0gLUVGQVVMVDsKIAkJCWJyZWFrOwogCQl9Ci0JCXByX2RlYnVnKCJzc3Q6IFNORFJWX1NTVF9TRVRfVk9MVU1FIHJlY2lldmVkIGZvciAlZCFcbiIsCisJCXByX2RlYnVnKCJTTkRSVl9TU1RfU0VUX1ZPTFVNRSByZWNpZXZlZCBmb3IgJWQhXG4iLAogCQkJc2V0X211dGUuc3RyZWFtX2lkKTsKIAkJaWYgKG1pbm9yID09IFNUUkVBTV9NT0RVTEUgJiYgc2V0X211dGUuc3RyZWFtX2lkID09IDApIHsKIAkJCXJldHZhbCA9IC1FUEVSTTsKQEAgLTk3Myw3ICsxMTI5LDcgQEAKIAljYXNlIF9JT0NfTlIoU05EUlZfU1NUX1NUUkVBTV9HRVRfUEFSQU1TKTogewogCQlzdHJ1Y3Qgc25kX3NzdF9nZXRfc3RyZWFtX3BhcmFtcyBnZXRfcGFyYW1zOwogCi0JCXByX2RlYnVnKCJzc3Q6IElPQ1RMX0dFVF9QQVJBTVMgcmVjaWV2ZWQhXG4iKTsKKwkJcHJfZGVidWcoIklPQ1RMX0dFVF9QQVJBTVMgcmVjZWl2ZWQhXG4iKTsKIAkJaWYgKG1pbm9yICE9IDApIHsKIAkJCXJldHZhbCA9IC1FQkFEUlFDOwogCQkJYnJlYWs7CkBAIC05OTcsNyArMTE1Myw3IEBACiAJY2FzZSBfSU9DX05SKFNORFJWX1NTVF9NTUFQX0NBUFRVUkUpOiB7CiAJCXN0cnVjdCBzbmRfc3N0X21tYXBfYnVmZnMgbW1hcF9idWY7CiAKLQkJcHJfZGVidWcoInNzdDogU05EUlZfU1NUX01NQVBfUExBWS9DQVBUVVJFIHJlY2lldmVkIVxuIik7CisJCXByX2RlYnVnKCJTTkRSVl9TU1RfTU1BUF9QTEFZL0NBUFRVUkUgcmVjaWV2ZWQhXG4iKTsKIAkJaWYgKG1pbm9yICE9IFNUUkVBTV9NT0RVTEUpIHsKIAkJCXJldHZhbCA9IC1FQkFEUlFDOwogCQkJYnJlYWs7CkBAIC0xMDExLDcgKzExNjcsNyBAQAogCQlicmVhazsKIAl9CiAJY2FzZSBfSU9DX05SKFNORFJWX1NTVF9TVFJFQU1fRFJPUCk6Ci0JCXByX2RlYnVnKCJzc3Q6IFNORFJWX1NTVF9JT0NUTF9EUk9QIHJlY2lldmVkIVxuIik7CisJCXByX2RlYnVnKCJTTkRSVl9TU1RfSU9DVExfRFJPUCByZWNlaXZlZCFcbiIpOwogCQlpZiAobWlub3IgIT0gU1RSRUFNX01PRFVMRSkgewogCQkJcmV0dmFsID0gLUVJTlZBTDsKIAkJCWJyZWFrOwpAQCAtMTAyMyw3ICsxMTc5LDcgQEAKIAkJc3RydWN0IHNuZF9zc3RfdHN0YW1wIHRzdGFtcCA9IHswfTsKIAkJdW5zaWduZWQgbG9uZyBsb25nIHRpbWUsIGZyZXEsIG1vZDsKIAotCQlwcl9kZWJ1Zygic3N0OiBTTkRSVl9TU1RfU1RSRUFNX0dFVF9UU1RBTVAgcmVjaWV2ZWQhXG4iKTsKKwkJcHJfZGVidWcoIlNORFJWX1NTVF9TVFJFQU1fR0VUX1RTVEFNUCByZWNlaXZlZCFcbiIpOwogCQlpZiAobWlub3IgIT0gU1RSRUFNX01PRFVMRSkgewogCQkJcmV0dmFsID0gLUVCQURSUUM7CiAJCQlicmVhazsKQEAgLTEwNDQsNyArMTIwMCw3IEBACiAJY2FzZSBfSU9DX05SKFNORFJWX1NTVF9TVFJFQU1fU1RBUlQpOnsKIAkJc3RydWN0IHN0cmVhbV9pbmZvICpzdHJlYW07CiAKLQkJcHJfZGVidWcoInNzdDogU05EUlZfU1NUX1NUUkVBTV9TVEFSVCByZWNpZXZlZCFcbiIpOworCQlwcl9kZWJ1ZygiU05EUlZfU1NUX1NUUkVBTV9TVEFSVCByZWNlaXZlZCFcbiIpOwogCQlpZiAobWlub3IgIT0gU1RSRUFNX01PRFVMRSkgewogCQkJcmV0dmFsID0gLUVJTlZBTDsKIAkJCWJyZWFrOwpAQCAtMTA4Myw3ICsxMjM5LDcgQEAKIAljYXNlIF9JT0NfTlIoU05EUlZfU1NUX1NFVF9UQVJHRVRfREVWSUNFKTogewogCQlzdHJ1Y3Qgc25kX3NzdF90YXJnZXRfZGV2aWNlIHRhcmdldF9kZXZpY2U7CiAKLQkJcHJfZGVidWcoInNzdDogU0VUX1RBUkdFVF9ERVZJQ0UgcmVjaWV2ZWQhXG4iKTsKKwkJcHJfZGVidWcoIlNFVF9UQVJHRVRfREVWSUNFIHJlY2lldmVkIVxuIik7CiAJCWlmIChjb3B5X2Zyb21fdXNlcigmdGFyZ2V0X2RldmljZSwgKHZvaWQgX191c2VyICopYXJnLAogCQkJCXNpemVvZih0YXJnZXRfZGV2aWNlKSkpIHsKIAkJCXJldHZhbCA9IC1FRkFVTFQ7CkBAIC0xMTAwLDcgKzEyNTYsNyBAQAogCWNhc2UgX0lPQ19OUihTTkRSVl9TU1RfRFJJVkVSX0lORk8pOiB7CiAJCXN0cnVjdCBzbmRfc3N0X2RyaXZlcl9pbmZvIGluZm87CiAKLQkJcHJfZGVidWcoInNzdDogU05EUlZfU1NUX0RSSVZFUl9JTkZPIHJlY2l2ZWRcbiIpOworCQlwcl9kZWJ1ZygiU05EUlZfU1NUX0RSSVZFUl9JTkZPIHJlY2l2ZWRcbiIpOwogCQlpbmZvLnZlcnNpb24gPSBTU1RfVkVSU0lPTl9OVU07CiAJCS8qIGhhcmQgY29kaW5nLCBzaHVkIGdldCBzdW1ob3cgbGF0ZXIgKi8KIAkJaW5mby5hY3RpdmVfcGNtX3N0cmVhbXMgPSBzc3RfZHJ2X2N0eC0+c3RyZWFtX2NudCAtCkBAIC0xMTIyLDcgKzEyNzgsNyBAQAogCQlzdHJ1Y3Qgc25kX3NzdF9idWZmX2VudHJ5ICppYnVmX3RtcCwgKm9idWZfdG1wOwogCQljaGFyIF9fdXNlciAqZGVzdDsKIAotCQlwcl9kZWJ1Zygic3N0OiBTTkRSVl9TU1RfU1RSRUFNX0RFQ09ERSByZWNpdmVkXG4iKTsKKwkJcHJfZGVidWcoIlNORFJWX1NTVF9TVFJFQU1fREVDT0RFIHJlY2VpdmVkXG4iKTsKIAkJaWYgKG1pbm9yICE9IFNUUkVBTV9NT0RVTEUpIHsKIAkJCXJldHZhbCA9IC1FQkFEUlFDOwogCQkJYnJlYWs7CkBAIC0xMTk3LDcgKzEzNTMsNyBAQAogCX0KIAogCWNhc2UgX0lPQ19OUihTTkRSVl9TU1RfU1RSRUFNX0RSQUlOKToKLQkJcHJfZGVidWcoInNzdDogU05EUlZfU1NUX1NUUkVBTV9EUkFJTiByZWNpdmVkXG4iKTsKKwkJcHJfZGVidWcoIlNORFJWX1NTVF9TVFJFQU1fRFJBSU4gcmVjZWl2ZWRcbiIpOwogCQlpZiAobWlub3IgIT0gU1RSRUFNX01PRFVMRSkgewogCQkJcmV0dmFsID0gLUVJTlZBTDsKIAkJCWJyZWFrOwpAQCAtMTIwOSw3ICsxMzY1LDcgQEAKIAkJdW5zaWduZWQgbG9uZyBsb25nIF9fdXNlciAqYnl0ZXMgPSAodW5zaWduZWQgbG9uZyBsb25nIF9fdXNlciAqKWFyZzsKIAkJc3RydWN0IHNuZF9zc3RfdHN0YW1wIHRzdGFtcCA9IHswfTsKIAotCQlwcl9kZWJ1Zygic3N0OiBTVFJFQU1fQllURVNfREVDT0RFRCByZWNpZXZlZCFcbiIpOworCQlwcl9kZWJ1ZygiU1RSRUFNX0JZVEVTX0RFQ09ERUQgcmVjZWl2ZWQhXG4iKTsKIAkJaWYgKG1pbm9yICE9IFNUUkVBTV9NT0RVTEUpIHsKIAkJCXJldHZhbCA9IC1FSU5WQUw7CiAJCQlicmVhazsKQEAgLTEyMjUsNyArMTM4MSw3IEBACiAJY2FzZSBfSU9DX05SKFNORFJWX1NTVF9GV19JTkZPKTogewogCQlzdHJ1Y3Qgc25kX3NzdF9md19pbmZvICpmd19pbmZvOwogCi0JCXByX2RlYnVnKCJzc3Q6IFNORFJWX1NTVF9GV19JTkZPIHJlY2l2ZWRcbiIpOworCQlwcl9kZWJ1ZygiU05EUlZfU1NUX0ZXX0lORk8gcmVjZWl2ZWRcbiIpOwogCiAJCWZ3X2luZm8gPSBremFsbG9jKHNpemVvZigqZndfaW5mbyksIEdGUF9BVE9NSUMpOwogCQlpZiAoIWZ3X2luZm8pIHsKQEAgLTEyNDgsMTAgKzE0MDQsMTggQEAKIAkJa2ZyZWUoZndfaW5mbyk7CiAJCWJyZWFrOwogCX0KKwljYXNlIF9JT0NfTlIoU05EUlZfU1NUX0dFVF9BTEdPKToKKwljYXNlIF9JT0NfTlIoU05EUlZfU1NUX1NFVF9BTEdPKToKKwkJaWYgKG1pbm9yICE9IEFNX01PRFVMRSkgeworCQkJcmV0dmFsID0gLUVCQURSUUM7CisJCQlicmVhazsKKwkJfQorCQlyZXR2YWwgPSBpbnRlbF9zc3RfaW9jdGxfZHNwKGNtZCwgYXJnKTsKKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcmV0dmFsID0gLUVJTlZBTDsKIAl9Ci0JcHJfZGVidWcoInNzdDogaW50ZWxfc3N0X2lvY3RsOmNvbXBsZXRlIHJldCBjb2RlID0gJWRcbiIsIHJldHZhbCk7CisJcHJfZGVidWcoImludGVsX3NzdF9pb2N0bDpjb21wbGV0ZSByZXQgY29kZSA9ICVkXG4iLCByZXR2YWwpOwogCXJldHVybiByZXR2YWw7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9pbnRlbF9zc3QvaW50ZWxfc3N0X2NvbW1vbi5oIGIvZHJpdmVycy9zdGFnaW5nL2ludGVsX3NzdC9pbnRlbF9zc3RfY29tbW9uLmgKaW5kZXggYmYwZWFkNy4uMGE2MGU4NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2ludGVsX3NzdC9pbnRlbF9zc3RfY29tbW9uLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2ludGVsX3NzdC9pbnRlbF9zc3RfY29tbW9uLmgKQEAgLTI4LDE1ICsyOCwxNSBAQAogICogIENvbW1vbiBwcml2YXRlIGRlY2xhcmF0aW9ucyBmb3IgU1NUCiAgKi8KIAotI2RlZmluZSBTU1RfRFJJVkVSX1ZFUlNJT04gIjEuMi4wNSIKLSNkZWZpbmUgU1NUX1ZFUlNJT05fTlVNIDB4MTIwNQorI2RlZmluZSBTU1RfRFJJVkVSX1ZFUlNJT04gIjEuMi4wOSIKKyNkZWZpbmUgU1NUX1ZFUlNJT05fTlVNIDB4MTIwOQogCiAvKiBkcml2ZXIgbmFtZXMgKi8KICNkZWZpbmUgU1NUX0RSVl9OQU1FICJpbnRlbF9zc3RfZHJpdmVyIgotI2RlZmluZSBTU1RfRldfRklMRU5BTUVfTVJTVCAiZndfc3N0XzA4MGEuYmluIgotI2RlZmluZSBTU1RfRldfRklMRU5BTUVfTUZMRCAiZndfc3N0XzA4MmYuYmluIgogI2RlZmluZSBTU1RfTVJTVF9QQ0lfSUQgMHgwODBBCiAjZGVmaW5lIFNTVF9NRkxEX1BDSV9JRCAweDA4MkYKKyNkZWZpbmUgUENJX0lEX0xFTkdUSCA0CisjZGVmaW5lIFNTVF9TVVNQRU5EX0RFTEFZIDIwMDAKIAogZW51bSBzc3Rfc3RhdGVzIHsKIAlTU1RfRldfTE9BREVEID0gMSwKQEAgLTM5Miw3ICszOTIsNyBAQAogCiAJc3RydWN0IHN0cmVhbV9pbmZvCXN0cmVhbXNbTUFYX05VTV9TVFJFQU1TXTsKIAlzdHJ1Y3Qgc3RyZWFtX2FsbG9jX2Jsb2NrIGFsbG9jX2Jsb2NrW01BWF9BQ1RJVkVfU1RSRUFNXTsKLQlzdHJ1Y3Qgc3N0X2Jsb2NrCXRndF9kZXZfYmxrLCBmd19pbmZvX2JsaywKKwlzdHJ1Y3Qgc3N0X2Jsb2NrCXRndF9kZXZfYmxrLCBmd19pbmZvX2JsaywgcHBwX3BhcmFtc19ibGssCiAJCQkJdm9sX2luZm9fYmxrLCBtdXRlX2luZm9fYmxrLCBoc19pbmZvX2JsazsKIAlzdHJ1Y3QgbXV0ZXgJCWxpc3RfbG9jazsvKiBtdXRleCBmb3IgSVBDIGxpc3QgbG9ja2luZyAqLwogCXNwaW5sb2NrX3QJbGlzdF9zcGluX2xvY2s7IC8qIG11dGV4IGZvciBJUEMgbGlzdCBsb2NraW5nICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaW50ZWxfc3N0L2ludGVsX3NzdF9kcnZfaW50ZXJmYWNlLmMgYi9kcml2ZXJzL3N0YWdpbmcvaW50ZWxfc3N0L2ludGVsX3NzdF9kcnZfaW50ZXJmYWNlLmMKaW5kZXggNjY5ZTI5OC4uZWE4ZTI1MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2ludGVsX3NzdC9pbnRlbF9zc3RfZHJ2X2ludGVyZmFjZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9pbnRlbF9zc3QvaW50ZWxfc3N0X2Rydl9pbnRlcmZhY2UuYwpAQCAtMjYsMTAgKzI2LDEzIEBACiAgKiAgVXBwZXIgbGF5ZXIgaW50ZXJmYWNlcyAoTUFEIGRyaXZlciwgTU1GKSB0byBTU1QgZHJpdmVyCiAgKi8KIAorI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CisjaW5jbHVkZSA8bGludXgvcG1fcnVudGltZS5oPgogI2luY2x1ZGUgImludGVsX3NzdC5oIgogI2luY2x1ZGUgImludGVsX3NzdF9pb2N0bC5oIgogI2luY2x1ZGUgImludGVsX3NzdF9md19pcGMuaCIKQEAgLTQ1LDE3ICs0OCwxOCBAQAogewogCWludCByZXR2YWw7CiAJY29uc3Qgc3RydWN0IGZpcm13YXJlICpmd19zc3Q7Ci0JY29uc3QgY2hhciAqbmFtZTsKKwljaGFyIG5hbWVbMjBdOworCiAJaWYgKHNzdF9kcnZfY3R4LT5zc3Rfc3RhdGUgIT0gU1NUX1VOX0lOSVQpCiAJCXJldHVybiAtRVBFUk07Ci0JaWYgKHNzdF9kcnZfY3R4LT5wY2lfaWQgPT0gU1NUX01SU1RfUENJX0lEKQotCQluYW1lID0gU1NUX0ZXX0ZJTEVOQU1FX01SU1Q7Ci0JZWxzZQotCQluYW1lID0gU1NUX0ZXX0ZJTEVOQU1FX01GTEQ7Ci0JcHJfZGVidWcoInNzdDogRG93bmxvYWRpbmcgJXMgRlcgbm93Li4uXG4iLCBuYW1lKTsKKworCXNucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwgIiVzJTA0eCVzIiwgImZ3X3NzdF8iLAorCQkJCQlzc3RfZHJ2X2N0eC0+cGNpX2lkLCAiLmJpbiIpOworCisJcHJfZGVidWcoIkRvd25sb2FkaW5nICVzIEZXIG5vdy4uLlxuIiwgbmFtZSk7CiAJcmV0dmFsID0gcmVxdWVzdF9maXJtd2FyZSgmZndfc3N0LCBuYW1lLCAmc3N0X2Rydl9jdHgtPnBjaS0+ZGV2KTsKIAlpZiAocmV0dmFsKSB7Ci0JCXByX2Vycigic3N0OiByZXF1ZXN0IGZ3IGZhaWxlZCAlZFxuIiwgcmV0dmFsKTsKKwkJcHJfZXJyKCJyZXF1ZXN0IGZ3IGZhaWxlZCAlZFxuIiwgcmV0dmFsKTsKIAkJcmV0dXJuIHJldHZhbDsKIAl9CiAJc3N0X2Rydl9jdHgtPmFsbG9jX2Jsb2NrWzBdLnNzdF9pZCA9IEZXX0RXTkxfSUQ7CkBAIC02Niw3ICs3MCw3IEBACiAKIAlyZXR2YWwgPSBzc3Rfd2FpdF90aW1lb3V0KHNzdF9kcnZfY3R4LCAmc3N0X2Rydl9jdHgtPmFsbG9jX2Jsb2NrWzBdKTsKIAlpZiAocmV0dmFsKQotCQlwcl9lcnIoInNzdDogZncgZG93bmxvYWQgZmFpbGVkICVkXG4iICwgcmV0dmFsKTsKKwkJcHJfZXJyKCJmdyBkb3dubG9hZCBmYWlsZWQgJWRcbiIgLCByZXR2YWwpOwogZW5kX3Jlc3RvcmU6CiAJcmVsZWFzZV9maXJtd2FyZShmd19zc3QpOwogCXNzdF9kcnZfY3R4LT5hbGxvY19ibG9ja1swXS5zc3RfaWQgPSBCTE9DS19VTklOSVQ7CkBAIC05MCw3ICs5NCw3IEBACiAKIAkJcmV0cnktLTsKIAl9Ci0JcHJfZGVidWcoInNzdDogaW4gU3RhbGxlZCBTdGF0ZVxuIik7CisJcHJfZGVidWcoImluIFN0YWxsZWQgU3RhdGVcbiIpOwogCXJldHVybiByZXR2YWw7CiB9CiAKQEAgLTEzOCwyMyArMTQyLDIzIEBACiAJcmV0dmFsID0gc3N0X2FsbG9jX3N0cmVhbSgoY2hhciAqKSAmc3RyX3BhcmFtLT5zcGFyYW1zLCBzdHJfcGFyYW0tPm9wcywKIAkJCQlzdHJfcGFyYW0tPmNvZGVjLCBzdHJfcGFyYW0tPmRldmljZV90eXBlKTsKIAlpZiAocmV0dmFsIDwgMCkgewotCQlwcl9lcnIoInNzdDogc3N0X2FsbG9jX3N0cmVhbSBmYWlsZWQgJWRcbiIsIHJldHZhbCk7CisJCXByX2Vycigic3N0X2FsbG9jX3N0cmVhbSBmYWlsZWQgJWRcbiIsIHJldHZhbCk7CiAJCXJldHVybiByZXR2YWw7CiAJfQotCXByX2RlYnVnKCJzc3Q6IFN0cmVhbSBhbGxvY2F0ZWQgJWRcbiIsIHJldHZhbCk7CisJcHJfZGVidWcoIlN0cmVhbSBhbGxvY2F0ZWQgJWRcbiIsIHJldHZhbCk7CiAJc3RyX2lkID0gcmV0dmFsOwogCXN0cl9pbmZvID0gJnNzdF9kcnZfY3R4LT5zdHJlYW1zW3N0cl9pZF07CiAJLyogQmxvY2sgdGhlIGNhbGwgZm9yIHJlcGx5ICovCiAJcmV0dmFsID0gc3N0X3dhaXRfaW50ZXJydXB0aWJsZV90aW1lb3V0KHNzdF9kcnZfY3R4LAogCQkJJnN0cl9pbmZvLT5jdHJsX2JsaywgU1NUX0JMT0NLX1RJTUVPVVQpOwogCWlmICgocmV0dmFsICE9IDApIHx8IChzdHJfaW5mby0+Y3RybF9ibGsucmV0X2NvZGUgIT0gMCkpIHsKLQkJcHJfZGVidWcoInNzdDogRlcgYWxsb2MgZmFpbGVkIHJldHZhbCAlZCwgcmV0X2NvZGUgJWRcbiIsCisJCXByX2RlYnVnKCJGVyBhbGxvYyBmYWlsZWQgcmV0dmFsICVkLCByZXRfY29kZSAlZFxuIiwKIAkJCQlyZXR2YWwsIHN0cl9pbmZvLT5jdHJsX2Jsay5yZXRfY29kZSk7CiAJCXN0cl9pZCA9IC1zdHJfaW5mby0+Y3RybF9ibGsucmV0X2NvZGU7IC8qcmV0dXJuIGVycm9yKi8KIAkJKmxpYl9kbmxkID0gc3RyX2luZm8tPmN0cmxfYmxrLmRhdGE7CiAJCXNzdF9jbGVhbl9zdHJlYW0oc3RyX2luZm8pOwogCX0gZWxzZQotCQlwcl9kZWJ1Zygic3N0OiBGVyBTdHJlYW0gYWxsb2NhdGVkIHN1Y2Vzc1xuIik7CisJCXByX2RlYnVnKCJGVyBTdHJlYW0gYWxsb2NhdGVkIHN1Y2Nlc3NcbiIpOwogCXJldHVybiBzdHJfaWQ7IC8qd2lsbCByZXQgZWl0aGVyIGVycm9yIChpbiBhYm92ZSBpZikgb3IgY29ycmVjdCBzdHIgaWQqLwogfQogCkBAIC0xNzEsOSArMTc1LDkgQEAKIAljYXNlIFNTVF9DT0RFQ19UWVBFX01QMzoKIAkJcmV0dXJuIHN0cl9wYXJhbS0+c3BhcmFtcy51Yy5tcDNfcGFyYW1zLnNmcmVxOwogCWNhc2UgU1NUX0NPREVDX1RZUEVfQUFDOgotCQlyZXR1cm4gc3RyX3BhcmFtLT5zcGFyYW1zLnVjLmFhY19wYXJhbXMuc2ZyZXE7OworCQlyZXR1cm4gc3RyX3BhcmFtLT5zcGFyYW1zLnVjLmFhY19wYXJhbXMuc2ZyZXE7CiAJY2FzZSBTU1RfQ09ERUNfVFlQRV9XTUE5OgotCQlyZXR1cm4gc3RyX3BhcmFtLT5zcGFyYW1zLnVjLndtYV9wYXJhbXMuc2ZyZXE7OworCQlyZXR1cm4gc3RyX3BhcmFtLT5zcGFyYW1zLnVjLndtYV9wYXJhbXMuc2ZyZXE7CiAJZGVmYXVsdDoKIAkJcmV0dXJuIDA7CiAJfQpAQCAtMTk2LDE0ICsyMDAsMTQgQEAKIAkJLyogY29kZWMgZG93bmxvYWQgaXMgcmVxdWlyZWQgKi8KIAkJc3RydWN0IHNuZF9zc3RfYWxsb2NfcmVzcG9uc2UgKnJlc3BvbnNlOwogCi0JCXByX2RlYnVnKCJzc3Q6IENvZGVjIGlzIHJlcXVpcmVkLi4uLiB0cnlpbmcgdGhhdFxuIik7CisJCXByX2RlYnVnKCJDb2RlYyBpcyByZXF1aXJlZC4uLi4gdHJ5aW5nIHRoYXRcbiIpOwogCQlpZiAobGliX2RubGQgPT0gTlVMTCkgewotCQkJcHJfZXJyKCJzc3Q6IGxpYiBkb3dubG9hZCBudWxsISEhIGFib3J0XG4iKTsKKwkJCXByX2VycigibGliIGRvd25sb2FkIG51bGwhISEgYWJvcnRcbiIpOwogCQkJcmV0dXJuIC1FSU87CiAJCX0KIAkJaSA9IHNzdF9nZXRfYmxvY2tfc3RyZWFtKHNzdF9kcnZfY3R4KTsKIAkJcmVzcG9uc2UgPSBzc3RfZHJ2X2N0eC0+YWxsb2NfYmxvY2tbaV0ub3BzX2Jsb2NrLmRhdGE7Ci0JCXByX2RlYnVnKCJzc3Q6IGFsbG9jIGJsb2NrIGFsbG9jYXRlZCA9ICVkXG4iLCBpKTsKKwkJcHJfZGVidWcoImFsbG9jIGJsb2NrIGFsbG9jYXRlZCA9ICVkXG4iLCBpKTsKIAkJaWYgKGkgPCAwKSB7CiAJCQlrZnJlZShsaWJfZG5sZCk7CiAJCQlyZXR1cm4gLUVOT01FTTsKQEAgLTIxMywxNSArMjE3LDE1IEBACiAKIAkJc3N0X2Rydl9jdHgtPmFsbG9jX2Jsb2NrW2ldLnNzdF9pZCA9IEJMT0NLX1VOSU5JVDsKIAkJaWYgKCFyZXR2YWwpIHsKLQkJCXByX2RlYnVnKCJzc3Q6IGNvZGVjIHdhcyBkb3dubG9hZGVkIHN1Y2VzZnVsbHlcbiIpOworCQkJcHJfZGVidWcoImNvZGVjIHdhcyBkb3dubG9hZGVkIHN1Y2Nlc3NmdWxseVxuIik7CiAKIAkJCXJldHZhbCA9IHNzdF9nZXRfc3RyZWFtX2FsbG9jYXRlZChzdHJfcGFyYW0sICZsaWJfZG5sZCk7CiAJCQlpZiAocmV0dmFsIDw9IDApCiAJCQkJZ290byBlcnI7CiAKLQkJCXByX2RlYnVnKCJzc3Q6IEFsbG9jIGRvbmUgc3RyZWFtIGlkICVkXG4iLCByZXR2YWwpOworCQkJcHJfZGVidWcoIkFsbG9jIGRvbmUgc3RyZWFtIGlkICVkXG4iLCByZXR2YWwpOwogCQl9IGVsc2UgewotCQkJcHJfZGVidWcoInNzdDogY29kZWMgZG93bmxvYWQgZmFpbGVkXG4iKTsKKwkJCXByX2RlYnVnKCJjb2RlYyBkb3dubG9hZCBmYWlsZWRcbiIpOwogCQkJcmV0dmFsID0gLUVJTzsKIAkJCWdvdG8gZXJyOwogCQl9CkBAIC0yNzksOTcgKzI4MywxMzggQEAKIAkJcmV0dmFsID0gc3N0X3N0YXJ0X3N0cmVhbShtYWRfb3BzLT5zdHJlYW1faWQpOwogCQlicmVhazsKIAljYXNlIFNTVF9TTkRfU1RSRUFNX1BST0NFU1M6Ci0JCXByX2RlYnVnKCJzc3Q6IHBsYXkvY2FwdCBmcmFtZXMuLi5cbiIpOworCQlwcl9kZWJ1ZygicGxheS9jYXB0IGZyYW1lcy4uLlxuIik7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCXByX2Vycigic3N0OiAgd3JvbmcgY29udHJvbF9vcHMgcmVwb3J0ZWRcbiIpOworCQlwcl9lcnIoIiB3cm9uZyBjb250cm9sX29wcyByZXBvcnRlZFxuIik7CiAJfQogCXJldHVybjsKIH0KLS8qCi0gKiBzc3RfY29udHJvbF9zZXQgLSBTZXQgQ29udHJvbCBwYXJhbXMKLSAqCi0gKiBAY29udHJvbF9saXN0OiBsaXN0IG9mIGNvbnRyb2xzIHRvIGJlIHNldAotICoKLSAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IE1JRCBzb3VuZCBjYXJkIGRyaXZlciB0byBzZXQKLSAqIFNTVC9Tb3VuZCBjYXJkIGNvbnRyb2xzLiBUaGlzIGlzIHJlZ2lzdGVyZWQgd2l0aCBNSUQgZHJpdmVyCi0gKi8KLWludCBzc3RfY29udHJvbF9zZXQoaW50IGNvbnRyb2xfZWxlbWVudCwgdm9pZCAqdmFsdWUpCisKK3ZvaWQgc2VuZF9pbnRpYWxfcnhfdGltZXNsb3Qodm9pZCkKIHsKLQlpbnQgcmV0dmFsID0gMCwgc3RyX2lkID0gMDsKLQlzdHJ1Y3Qgc3RyZWFtX2luZm8gKnN0cmVhbTsKKwlpZiAoc3N0X2Rydl9jdHgtPnBjaV9pZCA9PSBTU1RfTVJTVF9QQ0lfSUQgJiYKKwkJCXNzdF9kcnZfY3R4LT5yeF90aW1lX3Nsb3Rfc3RhdHVzICE9IFJYX1RJTUVTTE9UX1VOSU5JVAorCQkJJiYgc3N0X2Rydl9jdHgtPnBtaWNfdmVuZG9yICE9IFNORF9OQykKKwkJc3N0X2VuYWJsZV9yeF90aW1lc2xvdChzc3RfZHJ2X2N0eC0+cnhfdGltZV9zbG90X3N0YXR1cyk7Cit9CisKKy8qCisgKiBzc3Rfb3Blbl9wY21fc3RyZWFtIC0gT3BlbiBQQ00gaW50ZXJmYWNlCisgKgorICogQHN0cl9wYXJhbTogcGFyYW1ldGVycyBvZiBwY20gc3RyZWFtCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgTUlEIHNvdW5kIGNhcmQgZHJpdmVyIHRvIG9wZW4KKyAqIGEgbmV3IHBjbSBpbnRlcmZhY2UKKyAqLworaW50IHNzdF9vcGVuX3BjbV9zdHJlYW0oc3RydWN0IHNuZF9zc3RfcGFyYW1zICpzdHJfcGFyYW0pCit7CisJc3RydWN0IHN0cmVhbV9pbmZvICpzdHJfaW5mbzsKKwlpbnQgcmV0dmFsOworCisJcG1fcnVudGltZV9nZXRfc3luYygmc3N0X2Rydl9jdHgtPnBjaS0+ZGV2KTsKIAogCWlmIChzc3RfZHJ2X2N0eC0+c3N0X3N0YXRlID09IFNTVF9TVVNQRU5ERUQpIHsKLQkJLypMUEUgaXMgc3VzcGVuZGVkLCByZXN1bWUgaXQgYmVmb3JlIHByb2NlZGluZyovCi0JCXByX2RlYnVnKCJzc3Q6IFJlc3VtaW5nIGZyb20gU3VzcGVuZGVkIHN0YXRlXG4iKTsKKwkJLyogTFBFIGlzIHN1c3BlbmRlZCwgcmVzdW1lIGl0IGJlZm9yZSBwcm9jZWRpbmcqLworCQlwcl9kZWJ1ZygiUmVzdW1pbmcgZnJvbSBTdXNwZW5kZWQgc3RhdGVcbiIpOwogCQlyZXR2YWwgPSBpbnRlbF9zc3RfcmVzdW1lKHNzdF9kcnZfY3R4LT5wY2kpOwogCQlpZiAocmV0dmFsKSB7Ci0JCQlwcl9lcnIoInNzdDogUmVzdW1lIEZhaWxlZCA9ICUjeCwgYWJvcnRcbiIsIHJldHZhbCk7CisJCQlwcl9lcnIoIlJlc3VtZSBGYWlsZWQgPSAlI3gsIGFib3J0XG4iLCByZXR2YWwpOworCQkJcG1fcnVudGltZV9wdXQoJnNzdF9kcnZfY3R4LT5wY2ktPmRldik7CiAJCQlyZXR1cm4gcmV0dmFsOwogCQl9CiAJfQogCWlmIChzc3RfZHJ2X2N0eC0+c3N0X3N0YXRlID09IFNTVF9VTl9JTklUKSB7CiAJCS8qIEZXIGlzIG5vdCBkb3dubG9hZGVkICovCi0JCXByX2RlYnVnKCJzc3Q6IERTUCBEb3dubG9hZGluZyBGVyBub3cuLi5cbiIpOworCQlwcl9kZWJ1ZygiRFNQIERvd25sb2FkaW5nIEZXIG5vdy4uLlxuIik7CiAJCXJldHZhbCA9IHNzdF9kb3dubG9hZF9mdygpOwogCQlpZiAocmV0dmFsKSB7Ci0JCQlwcl9lcnIoInNzdDogRlcgZG93bmxvYWQgZmFpbCAleCwgYWJvcnRcbiIsIHJldHZhbCk7CisJCQlwcl9lcnIoIkZXIGRvd25sb2FkIGZhaWwgJXgsIGFib3J0XG4iLCByZXR2YWwpOworCQkJcG1fcnVudGltZV9wdXQoJnNzdF9kcnZfY3R4LT5wY2ktPmRldik7CiAJCQlyZXR1cm4gcmV0dmFsOwogCQl9Ci0JCWlmIChzc3RfZHJ2X2N0eC0+cGNpX2lkID09IFNTVF9NUlNUX1BDSV9JRCAmJgotCQkJc3N0X2Rydl9jdHgtPnJ4X3RpbWVfc2xvdF9zdGF0dXMgIT0gUlhfVElNRVNMT1RfVU5JTklUCi0JCQkJJiYgc3N0X2Rydl9jdHgtPnBtaWNfdmVuZG9yICE9IFNORF9OQykKLQkJCXNzdF9lbmFibGVfcnhfdGltZXNsb3QoCi0JCQkJCXNzdF9kcnZfY3R4LT5yeF90aW1lX3Nsb3Rfc3RhdHVzKTsKKwkJc2VuZF9pbnRpYWxfcnhfdGltZXNsb3QoKTsKIAl9CiAKLQlzd2l0Y2ggKGNvbnRyb2xfZWxlbWVudCkgewotCWNhc2UgU1NUX1NORF9BTExPQzogewotCQlzdHJ1Y3Qgc25kX3NzdF9wYXJhbXMgKnN0cl9wYXJhbTsKLQkJc3RydWN0IHN0cmVhbV9pbmZvICpzdHJfaW5mbzsKKwlpZiAoIXN0cl9wYXJhbSkgeworCQlwbV9ydW50aW1lX3B1dCgmc3N0X2Rydl9jdHgtPnBjaS0+ZGV2KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQogCi0JCXN0cl9wYXJhbSA9IChzdHJ1Y3Qgc25kX3NzdF9wYXJhbXMgKil2YWx1ZTsKLQkJQlVHX09OKCFzdHJfcGFyYW0pOwotCQlyZXR2YWwgPSBzc3RfZ2V0X3N0cmVhbShzdHJfcGFyYW0pOwotCQlpZiAocmV0dmFsID49IDApCi0JCQlzc3RfZHJ2X2N0eC0+c3RyZWFtX2NudCsrOworCXJldHZhbCA9IHNzdF9nZXRfc3RyZWFtKHN0cl9wYXJhbSk7CisJaWYgKHJldHZhbCA+IDApIHsKKwkJc3N0X2Rydl9jdHgtPnN0cmVhbV9jbnQrKzsKIAkJc3RyX2luZm8gPSAmc3N0X2Rydl9jdHgtPnN0cmVhbXNbcmV0dmFsXTsKIAkJc3RyX2luZm8tPnNyYyA9IE1BRF9EUlY7Ci0JCWJyZWFrOwotCX0KKwl9IGVsc2UKKwkJcG1fcnVudGltZV9wdXQoJnNzdF9kcnZfY3R4LT5wY2ktPmRldik7CiAKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKgorICogc3N0X2Nsb3NlX3BjbV9zdHJlYW0gLSBDbG9zZSBQQ00gaW50ZXJmYWNlCisgKgorICogQHN0cl9pZDogc3RyZWFtIGlkIHRvIGJlIGNsb3NlZAorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IE1JRCBzb3VuZCBjYXJkIGRyaXZlciB0byBjbG9zZQorICogYW4gZXhpc3RpbmcgcGNtIGludGVyZmFjZQorICovCitpbnQgc3N0X2Nsb3NlX3BjbV9zdHJlYW0odW5zaWduZWQgaW50IHN0cl9pZCkKK3sKKwlzdHJ1Y3Qgc3RyZWFtX2luZm8gKnN0cmVhbTsKKworCXByX2RlYnVnKCJzc3Q6IHN0cmVhbSBmcmVlIGNhbGxlZFxuIik7CisJaWYgKHNzdF92YWxpZGF0ZV9zdHJpZChzdHJfaWQpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlzdHJlYW0gPSAmc3N0X2Rydl9jdHgtPnN0cmVhbXNbc3RyX2lkXTsKKwlmcmVlX3N0cmVhbV9jb250ZXh0KHN0cl9pZCk7CisJc3RyZWFtLT5wY21fc3Vic3RyZWFtID0gTlVMTDsKKwlzdHJlYW0tPnN0YXR1cyA9IFNUUkVBTV9VTl9JTklUOworCXN0cmVhbS0+cGVyaW9kX2VsYXBzZWQgPSBOVUxMOworCXNzdF9kcnZfY3R4LT5zdHJlYW1fY250LS07CisJcHJfZGVidWcoInNzdDogd2lsbCBjYWxsIHJ1bnRpbWUgcHV0IG5vd1xuIik7CisJcG1fcnVudGltZV9wdXQoJnNzdF9kcnZfY3R4LT5wY2ktPmRldik7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBzc3RfZGV2aWNlX2NvbnRyb2wgLSBTZXQgQ29udHJvbCBwYXJhbXMKKyAqCisgKiBAY21kOiBjb250cm9sIGNtZCB0byBiZSBzZXQKKyAqIEBhcmc6IGNvbW1hbmQgYXJndW1lbnQKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBNSUQgc291bmQgY2FyZCBkcml2ZXIgdG8gc2V0CisgKiBTU1QvU291bmQgY2FyZCBjb250cm9scyBmb3IgYW4gb3BlbmVkIHN0cmVhbS4KKyAqIFRoaXMgaXMgcmVnaXN0ZXJlZCB3aXRoIE1JRCBkcml2ZXIKKyAqLworaW50IHNzdF9kZXZpY2VfY29udHJvbChpbnQgY21kLCB2b2lkICphcmcpCit7CisJaW50IHJldHZhbCA9IDAsIHN0cl9pZCA9IDA7CisKKwlzd2l0Y2ggKGNtZCkgewogCWNhc2UgU1NUX1NORF9QQVVTRToKIAljYXNlIFNTVF9TTkRfUkVTVU1FOgogCWNhc2UgU1NUX1NORF9EUk9QOgogCWNhc2UgU1NUX1NORF9TVEFSVDoKLQkJc3N0X2Rydl9jdHgtPm1hZF9vcHMuY29udHJvbF9vcCA9IGNvbnRyb2xfZWxlbWVudDsKLQkJc3N0X2Rydl9jdHgtPm1hZF9vcHMuc3RyZWFtX2lkID0gKihpbnQgKil2YWx1ZTsKKwkJc3N0X2Rydl9jdHgtPm1hZF9vcHMuY29udHJvbF9vcCA9IGNtZDsKKwkJc3N0X2Rydl9jdHgtPm1hZF9vcHMuc3RyZWFtX2lkID0gKihpbnQgKilhcmc7CiAJCXF1ZXVlX3dvcmsoc3N0X2Rydl9jdHgtPm1hZF93cSwgJnNzdF9kcnZfY3R4LT5tYWRfb3BzLndxKTsKIAkJYnJlYWs7CiAKLQljYXNlIFNTVF9TTkRfRlJFRToKLQkJc3RyX2lkID0gKihpbnQgKil2YWx1ZTsKLQkJc3RyZWFtID0gJnNzdF9kcnZfY3R4LT5zdHJlYW1zW3N0cl9pZF07Ci0JCWZyZWVfc3RyZWFtX2NvbnRleHQoc3RyX2lkKTsKLQkJc3RyZWFtLT5wY21fc3Vic3RyZWFtID0gTlVMTDsKLQkJc3RyZWFtLT5zdGF0dXMgPSBTVFJFQU1fVU5fSU5JVDsKLQkJc3RyZWFtLT5wZXJpb2RfZWxhcHNlZCA9IE5VTEw7Ci0JCXNzdF9kcnZfY3R4LT5zdHJlYW1fY250LS07Ci0JCWJyZWFrOwotCiAJY2FzZSBTU1RfU05EX1NUUkVBTV9JTklUOiB7CiAJCXN0cnVjdCBwY21fc3RyZWFtX2luZm8gKnN0cl9pbmZvOwogCQlzdHJ1Y3Qgc3RyZWFtX2luZm8gKnN0cmVhbTsKIAotCQlwcl9kZWJ1Zygic3N0OiBzdHJlYW0gaW5pdCBjYWxsZWRcbiIpOwotCQlzdHJfaW5mbyA9IChzdHJ1Y3QgcGNtX3N0cmVhbV9pbmZvICopdmFsdWU7CisJCXByX2RlYnVnKCJzdHJlYW0gaW5pdCBjYWxsZWRcbiIpOworCQlzdHJfaW5mbyA9IChzdHJ1Y3QgcGNtX3N0cmVhbV9pbmZvICopYXJnOwogCQlzdHJfaWQgPSBzdHJfaW5mby0+c3RyX2lkOwogCQlyZXR2YWwgPSBzc3RfdmFsaWRhdGVfc3RyaWQoc3RyX2lkKTsKIAkJaWYgKHJldHZhbCkKIAkJCWJyZWFrOwogCiAJCXN0cmVhbSA9ICZzc3RfZHJ2X2N0eC0+c3RyZWFtc1tzdHJfaWRdOwotCQlwcl9kZWJ1Zygic3N0OiBzZXR0aW5nIHRoZSBwZXJpb2QgcHRyc1xuIik7CisJCXByX2RlYnVnKCJzZXR0aW5nIHRoZSBwZXJpb2QgcHRyc1xuIik7CiAJCXN0cmVhbS0+cGNtX3N1YnN0cmVhbSA9IHN0cl9pbmZvLT5tYWRfc3Vic3RyZWFtOwogCQlzdHJlYW0tPnBlcmlvZF9lbGFwc2VkID0gc3RyX2luZm8tPnBlcmlvZF9lbGFwc2VkOwogCQlzdHJlYW0tPnNmcmVxID0gc3RyX2luZm8tPnNmcmVxOwpAQCAtMzg0LDcgKzQyOSw3IEBACiAJCXN0cnVjdCBzdHJlYW1faW5mbyAqc3RyZWFtOwogCiAKLQkJc3RyZWFtX2luZm8gPSAoc3RydWN0IHBjbV9zdHJlYW1faW5mbyAqKXZhbHVlOworCQlzdHJlYW1faW5mbyA9IChzdHJ1Y3QgcGNtX3N0cmVhbV9pbmZvICopYXJnOwogCQlzdHJfaWQgPSBzdHJlYW1faW5mby0+c3RyX2lkOwogCQlyZXR2YWwgPSBzc3RfdmFsaWRhdGVfc3RyaWQoc3RyX2lkKTsKIAkJaWYgKHJldHZhbCkKQEAgLTM5OCwyNiArNDQzLDI2IEBACiAJCQkrKHN0cl9pZCAqIHNpemVvZihmd190c3RhbXApKSksCiAJCQlzaXplb2YoZndfdHN0YW1wKSk7CiAKLQkJcHJfZGVidWcoInNzdDogUG9pbnRlciBRdWVyeSBvbiBzdHJpZCA9ICVkIG9wcyAlZFxuIiwKKwkJcHJfZGVidWcoIlBvaW50ZXIgUXVlcnkgb24gc3RyaWQgPSAlZCBvcHMgJWRcbiIsCiAJCQkJCQlzdHJfaWQsIHN0cmVhbS0+b3BzKTsKIAogCQlpZiAoc3RyZWFtLT5vcHMgPT0gU1RSRUFNX09QU19QTEFZQkFDSykKIAkJCXN0cmVhbV9pbmZvLT5idWZmZXJfcHRyID0gZndfdHN0YW1wLnNhbXBsZXNfcmVuZGVyZWQ7CiAJCWVsc2UKIAkJCXN0cmVhbV9pbmZvLT5idWZmZXJfcHRyID0gZndfdHN0YW1wLnNhbXBsZXNfcHJvY2Vzc2VkOwotCQlwcl9kZWJ1Zygic3N0OiBTYW1wbGVzIHJlbmRlcmVkID0gJWxsdSwgYnVmZmVyIHB0ciAlbGx1XG4iLAorCQlwcl9kZWJ1ZygiU2FtcGxlcyByZW5kZXJlZCA9ICVsbHUsIGJ1ZmZlciBwdHIgJWxsdVxuIiwKIAkJCWZ3X3RzdGFtcC5zYW1wbGVzX3JlbmRlcmVkLCBzdHJlYW1faW5mby0+YnVmZmVyX3B0cik7CiAJCWJyZWFrOwogCX0KIAljYXNlIFNTVF9FTkFCTEVfUlhfVElNRV9TTE9UOiB7Ci0JCWludCBzdGF0dXMgPSAqKGludCAqKXZhbHVlOworCQlpbnQgc3RhdHVzID0gKihpbnQgKilhcmc7CiAJCXNzdF9kcnZfY3R4LT5yeF90aW1lX3Nsb3Rfc3RhdHVzID0gc3RhdHVzIDsKIAkJc3N0X2VuYWJsZV9yeF90aW1lc2xvdChzdGF0dXMpOwogCQlicmVhazsKIAl9CiAJZGVmYXVsdDoKIAkJLyogSWxsZWdhbCBjYXNlICovCi0JCXByX3dhcm4oInNzdDogaWxsZWdhbCByZXFcbiIpOworCQlwcl93YXJuKCJpbGxlZ2FsIHJlcVxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtNDI1LDggKzQ3MCwxNCBAQAogfQogCiAKK3N0cnVjdCBpbnRlbF9zc3RfcGNtX2NvbnRyb2wgcGNtX29wcyA9IHsKKwkub3BlbiA9IHNzdF9vcGVuX3BjbV9zdHJlYW0sCisJLmRldmljZV9jb250cm9sID0gc3N0X2RldmljZV9jb250cm9sLAorCS5jbG9zZSA9IHNzdF9jbG9zZV9wY21fc3RyZWFtLAorfTsKKwogc3RydWN0IGludGVsX3NzdF9jYXJkX29wcyBzc3RfcG1pY19vcHMgPSB7Ci0JLmNvbnRyb2xfc2V0ID0gc3N0X2NvbnRyb2xfc2V0LAorCS5wY21fY29udHJvbCA9ICZwY21fb3BzLAogfTsKIAogLyoKQEAgLTQzOSwxMiArNDkwLDEyIEBACiBpbnQgcmVnaXN0ZXJfc3N0X2NhcmQoc3RydWN0IGludGVsX3NzdF9jYXJkX29wcyAqY2FyZCkKIHsKIAlpZiAoIXNzdF9kcnZfY3R4KSB7Ci0JCXByX2Vycigic3N0OiBObyBTU1QgZHJpdmVyIHJlZ2lzdGVyIGNhcmQgcmVqZWN0XG4iKTsKKwkJcHJfZXJyKCJObyBTU1QgZHJpdmVyIHJlZ2lzdGVyIGNhcmQgcmVqZWN0XG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCiAJaWYgKCFjYXJkIHx8ICFjYXJkLT5tb2R1bGVfbmFtZSkgewotCQlwcl9lcnIoInNzdDogTnVsbCBQb2ludGVyIFBhc3NlZFxuIik7CisJCXByX2VycigiTnVsbCBQb2ludGVyIFBhc3NlZFxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAlpZiAoc3N0X2Rydl9jdHgtPnBtaWNfc3RhdGUgPT0gU05EX01BRF9VTl9JTklUKSB7CkBAIC00NTYsMTcgKzUwNywxNyBAQAogCQkJc3N0X3BtaWNfb3BzLm1vZHVsZV9uYW1lID0gY2FyZC0+bW9kdWxlX25hbWU7CiAJCQlzc3RfZHJ2X2N0eC0+cG1pY19zdGF0ZSA9IFNORF9NQURfSU5JVF9ET05FOwogCQkJc3N0X2Rydl9jdHgtPnJ4X3RpbWVfc2xvdF9zdGF0dXMgPSAwOyAvKmRlZmF1bHQgQU1JQyovCi0JCQljYXJkLT5jb250cm9sX3NldCA9IHNzdF9wbWljX29wcy5jb250cm9sX3NldDsKKwkJCWNhcmQtPnBjbV9jb250cm9sID0gc3N0X3BtaWNfb3BzLnBjbV9jb250cm9sOwogCQkJc3N0X2Rydl9jdHgtPnNjYXJkX29wcy0+Y2FyZF9zdGF0dXMgPSBTTkRfQ0FSRF9VTl9JTklUOwogCQkJcmV0dXJuIDA7CiAJCX0gZWxzZSB7Ci0JCQlwcl9lcnIoInNzdDogc3RyY21wIGZhaWwgJXNcbiIsIGNhcmQtPm1vZHVsZV9uYW1lKTsKKwkJCXByX2Vycigic3RyY21wIGZhaWwgJXNcbiIsIGNhcmQtPm1vZHVsZV9uYW1lKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAKIAl9IGVsc2UgewogCQkvKiBhbHJlYWR5IHJlZ2lzdGVyZWQgYSBkcml2ZXIgKi8KLQkJcHJfZXJyKCJzc3Q6IFJlcGVhdCBmb3IgcmVnaXN0ZXJhdGlvbi4uZGVuaWVkXG4iKTsKKwkJcHJfZXJyKCJSZXBlYXQgZm9yIHJlZ2lzdHJhdGlvbi4uZGVuaWVkXG4iKTsKIAkJcmV0dXJuIC1FQkFEUlFDOwogCX0KIAlyZXR1cm4gMDsKQEAgLTQ4MiwxMSArNTMzLDExIEBACiAgKi8KIHZvaWQgdW5yZWdpc3Rlcl9zc3RfY2FyZChzdHJ1Y3QgaW50ZWxfc3N0X2NhcmRfb3BzICpjYXJkKQogewotCWlmIChzc3RfcG1pY19vcHMuY29udHJvbF9zZXQgPT0gY2FyZC0+Y29udHJvbF9zZXQpIHsKKwlpZiAoc3N0X3BtaWNfb3BzLnBjbV9jb250cm9sID09IGNhcmQtPnBjbV9jb250cm9sKSB7CiAJCS8qIHVucmVnICovCiAJCXNzdF9wbWljX29wcy5tb2R1bGVfbmFtZSA9ICIiOwogCQlzc3RfZHJ2X2N0eC0+cG1pY19zdGF0ZSA9IFNORF9NQURfVU5fSU5JVDsKLQkJcHJfZGVidWcoInNzdDogVW5yZWdpc3RlcmVkICVzXG4iLCBjYXJkLT5tb2R1bGVfbmFtZSk7CisJCXByX2RlYnVnKCJVbnJlZ2lzdGVyZWQgJXNcbiIsIGNhcmQtPm1vZHVsZV9uYW1lKTsKIAl9CiAJcmV0dXJuOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2ludGVsX3NzdC9pbnRlbF9zc3RfZHNwLmMgYi9kcml2ZXJzL3N0YWdpbmcvaW50ZWxfc3N0L2ludGVsX3NzdF9kc3AuYwppbmRleCBkODBhNmVlLi42ZTVjOTE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaW50ZWxfc3N0L2ludGVsX3NzdF9kc3AuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaW50ZWxfc3N0L2ludGVsX3NzdF9kc3AuYwpAQCAtMjksNiArMjksOSBAQAogICogIFRoaXMgZmlsZSBjb250YWlucyBhbGwgZHNwIGNvbnRyb2xsaW5nIGZ1bmN0aW9ucyBsaWtlIGZpcm13YXJlIGRvd25sb2FkLAogICogc2V0dGluZy9yZXNldHRpbmcgZHNwIGNvcmVzLCBldGMKICAqLworCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisKICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CkBAIC00Nyw4ICs1MCw5IEBACiB7CiAJdW5pb24gY29uZmlnX3N0YXR1c19yZWcgY3NyOwogCi0JcHJfZGVidWcoInNzdDogUmVzZXR0aW5nIHRoZSBEU1AgaW4gbXJzdFxuIik7Ci0JY3NyLmZ1bGwgPSAweDNhMjsKKwlwcl9kZWJ1ZygiUmVzZXR0aW5nIHRoZSBEU1AgaW4gbXJzdFxuIik7CisJY3NyLmZ1bGwgPSBzc3Rfc2hpbV9yZWFkKHNzdF9kcnZfY3R4LT5zaGltLCBTU1RfQ1NSKTsKKwljc3IuZnVsbCB8PSAweDM4MjsKIAlzc3Rfc2hpbV93cml0ZShzc3RfZHJ2X2N0eC0+c2hpbSwgU1NUX0NTUiwgY3NyLmZ1bGwpOwogCWNzci5mdWxsID0gc3N0X3NoaW1fcmVhZChzc3RfZHJ2X2N0eC0+c2hpbSwgU1NUX0NTUik7CiAJY3NyLnBhcnQuc3RyYl9jbnRyX3JzdCA9IDA7CkBAIC02OCw3ICs3Miw3IEBACiB7CiAJdW5pb24gY29uZmlnX3N0YXR1c19yZWcgY3NyOwogCi0JcHJfZGVidWcoInNzdDogUmVzZXR0aW5nIHRoZSBEU1AgaW4gbWVkZmllbGRcbiIpOworCXByX2RlYnVnKCJSZXNldHRpbmcgdGhlIERTUCBpbiBtZWRmaWVsZFxuIik7CiAJY3NyLmZ1bGwgPSAweDA0ODMwM0UyOwogCXNzdF9zaGltX3dyaXRlKHNzdF9kcnZfY3R4LT5zaGltLCBTU1RfQ1NSLCBjc3IuZnVsbCk7CiAKQEAgLTkwLDcgKzk0LDcgQEAKIAljc3IucGFydC5ydW5fc3RhbGwgPSAwOwogCWNzci5wYXJ0LnNzdF9yZXNldCA9IDA7CiAJY3NyLnBhcnQuc3RyYl9jbnRyX3JzdCA9IDE7Ci0JcHJfZGVidWcoInNzdDogU2V0dGluZyBTU1QgdG8gZXhlY3V0ZV9tcnN0IDB4JXhcbiIsIGNzci5mdWxsKTsKKwlwcl9kZWJ1ZygiU2V0dGluZyBTU1QgdG8gZXhlY3V0ZV9tcnN0IDB4JXhcbiIsIGNzci5mdWxsKTsKIAlzc3Rfc2hpbV93cml0ZShzc3RfZHJ2X2N0eC0+c2hpbSwgU1NUX0NTUiwgY3NyLmZ1bGwpOwogCiAJcmV0dXJuIDA7CkBAIC0xMTEsNyArMTE1LDcgQEAKIAlzc3Rfc2hpbV93cml0ZShzc3RfZHJ2X2N0eC0+c2hpbSwgU1NUX0NTUiwgY3NyLmZ1bGwpOwogCWNzci5mdWxsID0gMHgwNDgzMDA2MTsKIAlzc3Rfc2hpbV93cml0ZShzc3RfZHJ2X2N0eC0+c2hpbSwgU1NUX0NTUiwgY3NyLmZ1bGwpOwotCXByX2RlYnVnKCJzc3Q6IFN0YXJ0aW5nIHRoZSBEU1BfbWVkZmxkXG4iKTsKKwlwcl9kZWJ1ZygiU3RhcnRpbmcgdGhlIERTUF9tZWRmbGRcbiIpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xMzAsMTYgKzEzNCwxNiBAQAogCXUzMiBjb3VudDsKIAl2b2lkIF9faW9tZW0gKnJhbTsKIAotCXByX2RlYnVnKCJzc3Q6IG1vZHVsZSBzaWduICVzIHNpemUgJXggYmxvY2tzICV4IHR5cGUgJXhcbiIsCisJcHJfZGVidWcoIm1vZHVsZSBzaWduICVzIHNpemUgJXggYmxvY2tzICV4IHR5cGUgJXhcbiIsCiAJCQltb2R1bGUtPnNpZ25hdHVyZSwgbW9kdWxlLT5tb2Rfc2l6ZSwKIAkJCW1vZHVsZS0+YmxvY2tzLCBtb2R1bGUtPnR5cGUpOwotCXByX2RlYnVnKCJzc3Q6IG1vZHVsZSBlbnRyeXBvaW50IDB4JXhcbiIsIG1vZHVsZS0+ZW50cnlfcG9pbnQpOworCXByX2RlYnVnKCJtb2R1bGUgZW50cnlwb2ludCAweCV4XG4iLCBtb2R1bGUtPmVudHJ5X3BvaW50KTsKIAogCWJsb2NrID0gKHZvaWQgKiltb2R1bGUgKyBzaXplb2YoKm1vZHVsZSk7CiAKIAlmb3IgKGNvdW50ID0gMDsgY291bnQgPCBtb2R1bGUtPmJsb2NrczsgY291bnQrKykgewogCQlpZiAoYmxvY2stPnNpemUgPD0gMCkgewotCQkJcHJfZXJyKCJzc3Q6IGJsb2NrIHNpemUgaW52YWxpZFxuIik7CisJCQlwcl9lcnIoImJsb2NrIHNpemUgaW52YWxpZFxuIik7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCQlzd2l0Y2ggKGJsb2NrLT50eXBlKSB7CkBAIC0xNTAsNyArMTU0LDcgQEAKIAkJCXJhbSA9IHNzdF9kcnZfY3R4LT5kcmFtOwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6Ci0JCQlwcl9lcnIoInNzdDogd3JvbmcgcmFtIHR5cGUweCV4IGluIGJsb2NrMHgleFxuIiwKKwkJCXByX2Vycigid3JvbmcgcmFtIHR5cGUweCV4IGluIGJsb2NrMHgleFxuIiwKIAkJCQkJYmxvY2stPnR5cGUsIGNvdW50KTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CkBAIC0xODQsMTAgKzE4OCwxMCBAQAogCWlmICgoc3RybmNtcChoZWFkZXItPnNpZ25hdHVyZSwgU1NUX0ZXX1NJR04sIDQpICE9IDApIHx8CiAJCQkoc3N0X2Z3LT5zaXplICE9IGhlYWRlci0+ZmlsZV9zaXplICsgc2l6ZW9mKCpoZWFkZXIpKSkgewogCQkvKiBJbnZhbGlkIEZXIHNpZ25hdHVyZSAqLwotCQlwcl9lcnIoInNzdDogSW52YWxpZEZXIHNpZ24vZmlsZXNpemUgbWlzbWF0Y2hcbiIpOworCQlwcl9lcnIoIkludmFsaWQgRlcgc2lnbi9maWxlc2l6ZSBtaXNtYXRjaFxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KLQlwcl9kZWJ1Zygic3N0OiBoZWFkZXIgc2lnbj0lcyBzaXplPSV4IG1vZHVsZXM9JXggZm10PSV4IHNpemU9JXhcbiIsCisJcHJfZGVidWcoImhlYWRlciBzaWduPSVzIHNpemU9JXggbW9kdWxlcz0leCBmbXQ9JXggc2l6ZT0leFxuIiwKIAkJCWhlYWRlci0+c2lnbmF0dXJlLCBoZWFkZXItPmZpbGVfc2l6ZSwgaGVhZGVyLT5tb2R1bGVzLAogCQkJaGVhZGVyLT5maWxlX2Zvcm1hdCwgc2l6ZW9mKCpoZWFkZXIpKTsKIAltb2R1bGUgPSAodm9pZCAqKXNzdF9mdy0+ZGF0YSArIHNpemVvZigqaGVhZGVyKTsKQEAgLTIxNCw3ICsyMTgsNyBAQAogewogCWludCByZXRfdmFsOwogCi0JcHJfZGVidWcoInNzdDogbG9hZF9mdyBjYWxsZWRcbiIpOworCXByX2RlYnVnKCJsb2FkX2Z3IGNhbGxlZFxuIik7CiAJQlVHX09OKCFmdyk7CiAKIAlpZiAoc3N0X2Rydl9jdHgtPnBjaV9pZCA9PSBTU1RfTVJTVF9QQ0lfSUQpCkBAIC0yMzksNyArMjQzLDcgQEAKIAlpZiAocmV0X3ZhbCkKIAkJcmV0dXJuIHJldF92YWw7CiAKLQlwcl9kZWJ1Zygic3N0OiBmdyBsb2FkZWQgc3VjY2Vzc2Z1bCEhIVxuIik7CisJcHJfZGVidWcoImZ3IGxvYWRlZCBzdWNjZXNzZnVsISEhXG4iKTsKIAlyZXR1cm4gcmV0X3ZhbDsKIH0KIApAQCAtMjYxLDcgKzI2NSw3IEBACiAKIAlwdnRfaWQgPSBzc3RfYXNzaWduX3B2dF9pZChzc3RfZHJ2X2N0eCk7CiAJaSA9IHNzdF9nZXRfYmxvY2tfc3RyZWFtKHNzdF9kcnZfY3R4KTsKLQlwcl9kZWJ1Zygic3N0OiBhbGxvYyBibG9jayBhbGxvY2F0ZWQgPSAlZCwgcHZ0X2lkICVkXG4iLCBpLCBwdnRfaWQpOworCXByX2RlYnVnKCJhbGxvYyBibG9jayBhbGxvY2F0ZWQgPSAlZCwgcHZ0X2lkICVkXG4iLCBpLCBwdnRfaWQpOwogCWlmIChpIDwgMCkgewogCQlrZnJlZShtc2cpOwogCQlyZXR1cm4gLUVOT01FTTsKQEAgLTI4MSwxMSArMjg1LDExIEBACiAJaWYgKHJldHZhbCkgewogCQkvKiBlcnJvciAqLwogCQlzc3RfZHJ2X2N0eC0+YWxsb2NfYmxvY2tbaV0uc3N0X2lkID0gQkxPQ0tfVU5JTklUOwotCQlwcl9lcnIoInNzdDogUHJlcCBjb2RlYyBkb3dubG9hZGVkIGZhaWxlZCAlZFxuIiwKKwkJcHJfZXJyKCJQcmVwIGNvZGVjIGRvd25sb2FkZWQgZmFpbGVkICVkXG4iLAogCQkJCXJldHZhbCk7CiAJCXJldHVybiAtRUlPOwogCX0KLQlwcl9kZWJ1Zygic3N0OiBGVyByZXNwb25kZWQsIHJlYWR5IGZvciBkb3dubG9hZCBub3cuLi5cbiIpOworCXByX2RlYnVnKCJGVyByZXNwb25kZWQsIHJlYWR5IGZvciBkb3dubG9hZCBub3cuLi5cbiIpOwogCS8qIGRvd25sb2FkaW5nIG9uIHN1Y2Nlc3MgKi8KIAltdXRleF9sb2NrKCZzc3RfZHJ2X2N0eC0+c3N0X2xvY2spOwogCXNzdF9kcnZfY3R4LT5zc3Rfc3RhdGUgPSBTU1RfRldfTE9BREVEOwpAQCAtMzI1LDcgKzMyOSw3IEBACiAJbGlzdF9hZGRfdGFpbCgmbXNnLT5ub2RlLCAmc3N0X2Rydl9jdHgtPmlwY19kaXNwYXRjaF9saXN0KTsKIAlzcGluX3VubG9jaygmc3N0X2Rydl9jdHgtPmxpc3Rfc3Bpbl9sb2NrKTsKIAlzc3RfcG9zdF9tZXNzYWdlKCZzc3RfZHJ2X2N0eC0+aXBjX3Bvc3RfbXNnX3dxKTsKLQlwcl9kZWJ1Zygic3N0OiBXYWl0aW5nIGZvciBGVyByZXNwb25zZSBEb3dubG9hZCBjb21wbGV0ZVxuIik7CisJcHJfZGVidWcoIldhaXRpbmcgZm9yIEZXIHJlc3BvbnNlIERvd25sb2FkIGNvbXBsZXRlXG4iKTsKIAlzc3RfZHJ2X2N0eC0+YWxsb2NfYmxvY2tbaV0ub3BzX2Jsb2NrLmNvbmRpdGlvbiA9IGZhbHNlOwogCXJldHZhbCA9IHNzdF93YWl0X3RpbWVvdXQoc3N0X2Rydl9jdHgsICZzc3RfZHJ2X2N0eC0+YWxsb2NfYmxvY2tbaV0pOwogCWlmIChyZXR2YWwpIHsKQEAgLTMzNyw3ICszNDEsNyBAQAogCQlyZXR1cm4gLUVJTzsKIAl9CiAKLQlwcl9kZWJ1Zygic3N0OiBGVyBzdWNlc3Mgb24gRG93bmxvYWQgY29tcGxldGVcbiIpOworCXByX2RlYnVnKCJGVyBzdWNjZXNzIG9uIERvd25sb2FkIGNvbXBsZXRlXG4iKTsKIAlzc3RfZHJ2X2N0eC0+YWxsb2NfYmxvY2tbaV0uc3N0X2lkID0gQkxPQ0tfVU5JTklUOwogCW11dGV4X2xvY2soJnNzdF9kcnZfY3R4LT5zc3RfbG9jayk7CiAJc3N0X2Rydl9jdHgtPnNzdF9zdGF0ZSA9IFNTVF9GV19SVU5OSU5HOwpAQCAtMzYwLDE0ICszNjQsMTQgQEAKIAogCWhlYWRlciA9IChzdHJ1Y3QgZndfaGVhZGVyICopZndfbGliLT5kYXRhOwogCWlmIChoZWFkZXItPm1vZHVsZXMgIT0gMSkgewotCQlwcl9lcnIoInNzdDogTW9kdWxlIG5vIG1pc21hdGNoIGZvdW5kXG4gIik7CisJCXByX2VycigiTW9kdWxlIG5vIG1pc21hdGNoIGZvdW5kXG4iKTsKIAkJZXJyID0gLUVJTlZBTDsKIAkJZ290byBleGl0OwogCX0KIAltb2R1bGUgPSAodm9pZCAqKWZ3X2xpYi0+ZGF0YSArIHNpemVvZigqaGVhZGVyKTsKIAkqZW50cnlfcG9pbnQgPSBtb2R1bGUtPmVudHJ5X3BvaW50OwotCXByX2RlYnVnKCJzc3Q6IE1vZHVsZSBlbnRyeSBwb2ludCAweCV4XG4iLCAqZW50cnlfcG9pbnQpOwotCXByX2RlYnVnKCJzc3Q6IE1vZHVsZSBTaWduICVzLCBTaXplIDB4JXgsIEJsb2NrcyAweCV4IFR5cGUgMHgleFxuIiwKKwlwcl9kZWJ1ZygiTW9kdWxlIGVudHJ5IHBvaW50IDB4JXhcbiIsICplbnRyeV9wb2ludCk7CisJcHJfZGVidWcoIk1vZHVsZSBTaWduICVzLCBTaXplIDB4JXgsIEJsb2NrcyAweCV4IFR5cGUgMHgleFxuIiwKIAkJCW1vZHVsZS0+c2lnbmF0dXJlLCBtb2R1bGUtPm1vZF9zaXplLAogCQkJbW9kdWxlLT5ibG9ja3MsIG1vZHVsZS0+dHlwZSk7CiAKQEAgLTM4MSwyMCArMzg1LDIwIEBACiAJCQlkc2l6ZSArPSBibG9jay0+c2l6ZTsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgotCQkJcHJfZXJyKCJzc3Q6IEludmFsaWQgYmxvY2sgdHlwZSBmb3IgMHgleFxuIiwgbl9ibGspOworCQkJcHJfZXJyKCJJbnZhbGlkIGJsb2NrIHR5cGUgZm9yIDB4JXhcbiIsIG5fYmxrKTsKIAkJCWVyciA9IC1FSU5WQUw7CiAJCQlnb3RvIGV4aXQ7CiAJCX0KIAkJYmxvY2sgPSAodm9pZCAqKWJsb2NrICsgc2l6ZW9mKCpibG9jaykgKyBibG9jay0+c2l6ZTsKIAl9CiAJaWYgKGlzaXplID4gc2xvdC0+aXJhbV9zaXplIHx8IGRzaXplID4gc2xvdC0+ZHJhbV9zaXplKSB7Ci0JCXByX2Vycigic3N0OiBsaWJyYXJ5IGV4Y2VlZHMgc2l6ZSBhbGxvY2F0ZWRcbiIpOworCQlwcl9lcnIoImxpYnJhcnkgZXhjZWVkcyBzaXplIGFsbG9jYXRlZFxuIik7CiAJCWVyciA9IC1FSU5WQUw7CiAJCWdvdG8gZXhpdDsKIAl9IGVsc2UKLQkJcHJfZGVidWcoInNzdDogTGlicmFyeSBpcyBzYWZlIGZvciBkb3dubG9hZC4uLlxuIik7CisJCXByX2RlYnVnKCJMaWJyYXJ5IGlzIHNhZmUgZm9yIGRvd25sb2FkLi4uXG4iKTsKIAotCXByX2RlYnVnKCJzc3Q6IGlyYW0gMHgleCwgZHJhbSAweCV4LCBpcmFtIDB4JXgsIGRyYW0gMHgleFxuIiwKKwlwcl9kZWJ1ZygiaXJhbSAweCV4LCBkcmFtIDB4JXgsIGlyYW0gMHgleCwgZHJhbSAweCV4XG4iLAogCQkJaXNpemUsIGRzaXplLCBzbG90LT5pcmFtX3NpemUsIHNsb3QtPmRyYW1fc2l6ZSk7CiBleGl0OgogCXJldHVybiBlcnI7CkBAIC00MTQsMTUgKzQxOCwxNSBAQAogCiAJbWVtc2V0KGJ1ZiwgMCwgc2l6ZW9mKGJ1ZikpOwogCi0JcHJfZGVidWcoInNzdDogTGliIFR5cGUgMHgleCwgU2xvdCAweCV4LCBvcHMgMHgleFxuIiwKKwlwcl9kZWJ1ZygiTGliIFR5cGUgMHgleCwgU2xvdCAweCV4LCBvcHMgMHgleFxuIiwKIAkJCWxpYi0+bGliX2luZm8ubGliX3R5cGUsIGxpYi0+c2xvdF9pbmZvLnNsb3RfbnVtLCBvcHMpOwotCXByX2RlYnVnKCJzc3Q6IFZlcnNpb24gMHgleCwgbmFtZSAlcywgY2FwcyAweCV4IG1lZGlhIHR5cGUgMHgleFxuIiwKKwlwcl9kZWJ1ZygiVmVyc2lvbiAweCV4LCBuYW1lICVzLCBjYXBzIDB4JXggbWVkaWEgdHlwZSAweCV4XG4iLAogCQlsaWItPmxpYl9pbmZvLmxpYl92ZXJzaW9uLCBsaWItPmxpYl9pbmZvLmxpYl9uYW1lLAogCQlsaWItPmxpYl9pbmZvLmxpYl9jYXBzLCBsaWItPmxpYl9pbmZvLm1lZGlhX3R5cGUpOwogCi0JcHJfZGVidWcoInNzdDogSVJBTSBTaXplIDB4JXgsIG9mZnNldCAweCV4XG4iLAorCXByX2RlYnVnKCJJUkFNIFNpemUgMHgleCwgb2Zmc2V0IDB4JXhcbiIsCiAJCWxpYi0+c2xvdF9pbmZvLmlyYW1fc2l6ZSwgbGliLT5zbG90X2luZm8uaXJhbV9vZmZzZXQpOwotCXByX2RlYnVnKCJzc3Q6IERSQU0gU2l6ZSAweCV4LCBvZmZzZXQgMHgleFxuIiwKKwlwcl9kZWJ1ZygiRFJBTSBTaXplIDB4JXgsIG9mZnNldCAweCV4XG4iLAogCQlsaWItPnNsb3RfaW5mby5kcmFtX3NpemUsIGxpYi0+c2xvdF9pbmZvLmRyYW1fb2Zmc2V0KTsKIAogCXN3aXRjaCAobGliLT5saWJfaW5mby5saWJfdHlwZSkgewpAQCAtNDQyLDcgKzQ0Niw3IEBACiAJCXR5cGUgPSAid21hOV8iOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlwcl9lcnIoInNzdDogSW52YWxpZCBjb2RlYyB0eXBlXG4iKTsKKwkJcHJfZXJyKCJJbnZhbGlkIGNvZGVjIHR5cGVcbiIpOwogCQllcnJvciA9IC1FSU5WQUw7CiAJCWdvdG8gd2FrZTsKIAl9CkBAIC00NTgsMTEgKzQ2MiwxMSBAQAogCQkJbGliLT5zbG90X2luZm8uc2xvdF9udW0pOwogCWxlbiArPSBzbnByaW50ZihidWYgKyBsZW4sIHNpemVvZihidWYpIC0gbGVuLCAiLmJpbiIpOwogCi0JcHJfZGVidWcoInNzdDogUmVxdWVzdGluZyAlc1xuIiwgYnVmKTsKKwlwcl9kZWJ1ZygiUmVxdWVzdGluZyAlc1xuIiwgYnVmKTsKIAogCWVycm9yID0gcmVxdWVzdF9maXJtd2FyZSgmZndfbGliLCBidWYsICZzc3RfZHJ2X2N0eC0+cGNpLT5kZXYpOwogCWlmIChlcnJvcikgewotCQlwcl9lcnIoInNzdDogbGlicmFyeSBsb2FkIGZhaWxlZCAlZFxuIiwgZXJyb3IpOworCQlwcl9lcnIoImxpYnJhcnkgbG9hZCBmYWlsZWQgJWRcbiIsIGVycm9yKTsKIAkJZ290byB3YWtlOwogCX0KIAllcnJvciA9IHNzdF92YWxpZGF0ZV9saWJyYXJ5KGZ3X2xpYiwgJmxpYi0+c2xvdF9pbmZvLCAmZW50cnlfcG9pbnQpOwpAQCAtNDc2LDcgKzQ4MCw3IEBACiAJCWdvdG8gd2FrZV9mcmVlOwogCiAJLyogbGliIGlzIGRvd25sb2FkZWQgYW5kIGluaXQgc2VuZCBhbGxvYyBhZ2FpbiAqLwotCXByX2RlYnVnKCJzc3Q6IExpYnJhcnkgaXMgZG93bmxvYWRlZCBub3cuLi5cbiIpOworCXByX2RlYnVnKCJMaWJyYXJ5IGlzIGRvd25sb2FkZWQgbm93Li4uXG4iKTsKIHdha2VfZnJlZToKIAkvKiBzc3Rfd2FrZV91cF9hbGxvY19ibG9jayhzc3RfZHJ2X2N0eCwgcHZ0X2lkLCBlcnJvciwgTlVMTCk7ICovCiAJcmVsZWFzZV9maXJtd2FyZShmd19saWIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2ludGVsX3NzdC9pbnRlbF9zc3RfZndfaXBjLmggYi9kcml2ZXJzL3N0YWdpbmcvaW50ZWxfc3N0L2ludGVsX3NzdF9md19pcGMuaAppbmRleCA5ZDNjMzY4Li44ZGYzMTNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaW50ZWxfc3N0L2ludGVsX3NzdF9md19pcGMuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaW50ZWxfc3N0L2ludGVsX3NzdF9md19pcGMuaApAQCAtMzEsNiArMzEsNyBAQAogKi8KIAogI2RlZmluZSBNQVhfTlVNX1NUUkVBTVNfTVJTVCAzCisjZGVmaW5lIE1BWF9OVU1fU1RSRUFNU19NRkxEIDYKICNkZWZpbmUgTUFYX05VTV9TVFJFQU1TIDYKICNkZWZpbmUgTUFYX0RCR19SV19CWVRFUyA4MAogI2RlZmluZSBNQVhfTlVNX1NDQVRURVJfQlVGRkVSUyA4CkBAIC02Nyw2ICs2OCw4IEBACiAjZGVmaW5lIElQQ19JQV9DQVBUX1ZPSUNFIDB4MTcKICNkZWZpbmUgSVBDX0lBX0RFQ09ERV9GUkFNRVMgMHgxOAogCisjZGVmaW5lIElQQ19JQV9BTEdfUEFSQU1TIDB4MUEKKwogLyogSTJMIFN0cmVhbSBjb25maWcvY29udHJvbCBtc2dzICovCiAjZGVmaW5lIElQQ19JQV9BTExPQ19TVFJFQU0gMHgyMCAvKiBBbGxvY2F0ZSBhIHN0cmVhbSBJRCAqLwogI2RlZmluZSBJUENfSUFfRlJFRV9TVFJFQU0gMHgyMSAvKiBGcmVlIHRoZSBzdHJlYW0gSUQgKi8KQEAgLTE0MSw3MyArMTQ0LDg3IEBACiAJLyogRXJyb3IgY29kZSxyZXNwb25zZSB0byBtc2dJZDogRGVzY3JpcHRpb24gKi8KIAkvKiBDb21tb24gZXJyb3IgY29kZXMgKi8KIAlTU1RfU1VDQ0VTUyA9IDAsCS8qIFN1Y2Nlc3MgKi8KLQlTU1RfRVJSX0lOVkFMSURfU1RSRUFNX0lELCAvKiBJbnZhbGlkIHN0cmVhbSBJRCAqLwotCVNTVF9FUlJfSU5WQUxJRF9NU0dfSUQsCS8qIEludmFsaWQgbWVzc2FnZSBJRCAqLwotCVNTVF9FUlJfSU5WQUxJRF9TVFJFQU1fT1AsIC8qIEludmFsaWQgc3RyZWFtIG9wZXJhdGlvbiByZXF1ZXN0ICovCi0JU1NUX0VSUl9JTlZBTElEX1BBUkFNUywJLyogSW52YWxpZCBwYXJhbXMgKi8KLQlTU1RfRVJSX0lOVkFMSURfQ09ERUMsCS8qIEludmFsaWQgY29kZWMgdHlwZSAqLwotCVNTVF9FUlJfSU5WQUxJRF9NRURJQV9UWVBFLCAvKiBJbnZhbGlkIG1lZGlhIHR5cGUgKi8KLQlTU1RfRVJSX1NUUkVBTV9FUlIsICAvKiBBTlk6IFN0cmVhbSBjb250cm9sIG9yIGNvbmZpZyBvcgotCQkJCQlwcm9jZXNzaW5nIGVycm9yICovCisJU1NUX0VSUl9JTlZBTElEX1NUUkVBTV9JRCA9IDEsCisJU1NUX0VSUl9JTlZBTElEX01TR19JRCA9IDIsCisJU1NUX0VSUl9JTlZBTElEX1NUUkVBTV9PUCA9IDMsCisJU1NUX0VSUl9JTlZBTElEX1BBUkFNUyA9IDQsCisJU1NUX0VSUl9JTlZBTElEX0NPREVDID0gNSwKKwlTU1RfRVJSX0lOVkFMSURfTUVESUFfVFlQRSA9IDYsCisJU1NUX0VSUl9TVFJFQU1fRVJSID0gNywKIAogCS8qIElQQyBzcGVjaWZpYyBlcnJvciBjb2RlcyAqLwotCVNTVF9JUENfRVJSX0NBTExfQkFDS19OT1RfUkVHRCwgLyogQ2FsbCBiYWNrIGZvciBtc2cgbm90IHJlZ2QgKi8KLQlTU1RfSVBDX0VSUl9TVFJFQU1fTk9UX0FMTE9DQVRFRCwgLyogU3RyZWFtIGlzIG5vdCBhbGxvY2F0ZWQgICovCi0JU1NUX0lQQ19FUlJfU1RSRUFNX0FMTE9DX0ZBSUxFRCwgLyogQUxMT0M6U3RyZWFtIGFsbG9jIGZhaWxlZCAqLwotCVNTVF9JUENfRVJSX0dFVF9TVFJFQU1fRkFJTEVELCAvKiBBTExPQzpHZXQgc3RyZWFtIGlkIGZhaWxlZCovCi0JU1NUX0VSUl9NT0RfTk9UX0FWQUlMLCAvKiBTRVQvR0VUOiBNb2QoQUVDL0FHQy9BTEMpIG5vdCBhdmFpbGFibGUgKi8KLQlTU1RfRVJSX01PRF9ETkxEX1JRRCwgLyogU0VUL0dFVDogTW9kKEFFQy9BR0MvQUxDKSBkb3dubG9hZCByZXF1aXJlZCAqLwotCVNTVF9FUlJfU1RSRUFNX1NUT1BQRUQsCQkvKiBBTlk6IFN0cmVhbSBpcyBpbiBzdG9wcGVkIHN0YXRlICovCi0JU1NUX0VSUl9TVFJFQU1fSU5fVVNFLCAvKiBBTlk6IFN0cmVhbSBpcyBhbHJlYWR5IGluIHVzZSAqLworCVNTVF9JUENfRVJSX0NBTExfQkFDS19OT1RfUkVHRCA9IDgsCisJU1NUX0lQQ19FUlJfU1RSRUFNX05PVF9BTExPQ0FURUQgPSA5LAorCVNTVF9JUENfRVJSX1NUUkVBTV9BTExPQ19GQUlMRUQgPSAxMCwKKwlTU1RfSVBDX0VSUl9HRVRfU1RSRUFNX0ZBSUxFRCA9IDExLAorCVNTVF9FUlJfTU9EX05PVF9BVkFJTCA9IDEyLAorCVNTVF9FUlJfTU9EX0ROTERfUlFEID0gMTMsCisJU1NUX0VSUl9TVFJFQU1fU1RPUFBFRCA9IDE0LAorCVNTVF9FUlJfU1RSRUFNX0lOX1VTRSA9IDE1LAogCiAJLyogQ2FwdHVyZSBzcGVjaWZpYyBlcnJvciBjb2RlcyAqLwotCVNTVF9DQVBfRVJSX0lOQ01QTFRFX0NBUFRVUkVfTVNHLC8qIEFOWTpJbmNvbXBsZXRlIG1lc3NhZ2UgKi8KLQlTU1RfQ0FQX0VSUl9DQVBUVVJFX0ZBSUwsIC8qIEFOWTpDYXB0dXJlIG9wIGZhaWxlZCAqLwotCVNTVF9DQVBfRVJSX0dFVF9ERFJfTkVXX1NHTElTVCwKLQlTU1RfQ0FQX0VSUl9VTkRFUl9SVU4sCS8qIGxhY2sgb2YgaW5wdXQgZGF0YSAqLwotCVNTVF9DQVBfRVJSX09WRVJGTE9XLAkvKiBsYWNrIG9mIG91dHB1dCBzcGFjZSAqLworCVNTVF9DQVBfRVJSX0lOQ01QTFRFX0NBUFRVUkVfTVNHID0gMTYsCisJU1NUX0NBUF9FUlJfQ0FQVFVSRV9GQUlMID0gMTcsCisJU1NUX0NBUF9FUlJfR0VUX0REUl9ORVdfU0dMSVNUID0gMTgsCisJU1NUX0NBUF9FUlJfVU5ERVJfUlVOID0gMTksCisJU1NUX0NBUF9FUlJfT1ZFUkZMT1cgPSAyMCwKIAogCS8qIFBsYXliYWNrIHNwZWNpZmljIGVycm9yIGNvZGVzKi8KLQlTU1RfUEJfRVJSX0lOQ01QTFRFX1BMQVlfTVNHLCAvKiBBTlk6IEluY29tcGxldGUgbWVzc2FnZSAqLwotCVNTVF9QQl9FUlJfUExBWV9GQUlMLCAvKiBBTlk6IFBsYXliYWNrIG9wZXJhdGlvbiBmYWlsZWQgKi8KLQlTU1RfUEJfRVJSX0dFVF9ERFJfTkVXX1NHTElTVCwKKwlTU1RfUEJfRVJSX0lOQ01QTFRFX1BMQVlfTVNHID0gMjEsCisJU1NUX1BCX0VSUl9QTEFZX0ZBSUwgPSAyMiwKKwlTU1RfUEJfRVJSX0dFVF9ERFJfTkVXX1NHTElTVCA9IDIzLAogCiAJLyogQ29kZWMgbWFuYWdlciBzcGVjaWZpYyBlcnJvciBjb2RlcyAqLwotCVNTVF9MSUJfRVJSX0xJQl9ETkxEX1JFUVVJUkVELCAvKiBBTExPQzogQ29kZWMgZG93bmxvYWQgcmVxdWlyZWQgKi8KLQlTU1RfTElCX0VSUl9MSUJfTk9UX1NVUFBPUlRFRCwgLyogTGlicmFyeSBpcyBub3Qgc3VwcG9ydGVkICovCisJU1NUX0xJQl9FUlJfTElCX0ROTERfUkVRVUlSRUQgPSAyNCwKKwlTU1RfTElCX0VSUl9MSUJfTk9UX1NVUFBPUlRFRCA9IDI1LAogCiAJLyogTGlicmFyeSBtYW5hZ2VyIHNwZWNpZmljIGVycm9yIGNvZGVzICovCi0JU1NUX1NDQ19FUlJfUFJFUF9ETkxEX0ZBSUxFRCwgLyogRmFpbGVkIHRvIHByZXBhcmUgZm9yIGNvZGVjIGRvd25sb2FkICovCi0JU1NUX1NDQ19FUlJfTElCX0ROTERfUkVTX0ZBSUxFRCwgLyogTGliIGRvd25sb2FkIHJlc3VtZSBmYWlsZWQgKi8KKwlTU1RfU0NDX0VSUl9QUkVQX0ROTERfRkFJTEVEID0gMjYsCisJU1NUX1NDQ19FUlJfTElCX0ROTERfUkVTX0ZBSUxFRCA9IDI3LAogCS8qIFNjaGVkdWxlciBzcGVjaWZpYyBlcnJvciBjb2RlcyAqLwotCVNTVF9TQ0hfRVJSX0ZBSUwsIC8qIFJFUE9SVDogKi8KKwlTU1RfU0NIX0VSUl9GQUlMID0gMjgsCiAKIAkvKiBETUEgc3BlY2lmaWMgZXJyb3IgY29kZXMgKi8KLQlTU1RfRE1BX0VSUl9OT19DSE5MX0FWQUlMQUJMRSwgLyogRE1BIENoIG5vdCBhdmFpbGFibGUgKi8KLQlTU1RfRE1BX0VSUl9JTlZBTElEX0lOUFVUX1BBUkFNUywgLyogSW52YWxpZCBpbnB1dCBwYXJhbXMgKi8KLQlTU1RfRE1BX0VSUl9DSE5MX0FMUkVBRFlfU1VTUEVOREVELCAvKiBDaCBpcyBzdXNwZW5kZWQgKi8KLQlTU1RfRE1BX0VSUl9DSE5MX0FMUkVBRFlfU1RBUlRFRCwgLyogQ2ggYWxyZWFkeSBzdGFydGVkICovCi0JU1NUX0RNQV9FUlJfQ0hOTF9OT1RfRU5BQkxFRCwgLyogQ2ggbm90IGVuYWJsZWQgKi8KLQlTU1RfRE1BX0VSUl9UUkFOU0ZFUl9GQUlMRUQsIC8qIFRyYW5zZmVyIGZhaWxlZCAqLwotCVNTVF9TU1BfRVJSX0FMUkVBRFlfRU5BQkxFRCwgLyogUkVQT1JUOiBTU1AgYWxyZWFkeSBlbmFibGVkICovCi0JU1NUX1NTUF9FUlJfQUxSRUFEWV9ESVNBQkxFRCwgLyogUkVQT1JUOiBTU1AgYWxyZWFkeSBkaXNhYmxlZCAqLwotCVNTVF9TU1BfRVJSX05PVF9JTklUSUFMSVpFRCwKKwlTU1RfRE1BX0VSUl9OT19DSE5MX0FWQUlMQUJMRSA9IDI5LAorCVNTVF9ETUFfRVJSX0lOVkFMSURfSU5QVVRfUEFSQU1TID0gMzAsCisJU1NUX0RNQV9FUlJfQ0hOTF9BTFJFQURZX1NVU1BFTkRFRCA9IDMxLAorCVNTVF9ETUFfRVJSX0NITkxfQUxSRUFEWV9TVEFSVEVEID0gMzIsCisJU1NUX0RNQV9FUlJfQ0hOTF9OT1RfRU5BQkxFRCA9IDMzLAorCVNTVF9ETUFfRVJSX1RSQU5TRkVSX0ZBSUxFRCA9IDM0LAorCisJU1NUX1NTUF9FUlJfQUxSRUFEWV9FTkFCTEVEID0gMzUsCisJU1NUX1NTUF9FUlJfQUxSRUFEWV9ESVNBQkxFRCA9IDM2LAorCVNTVF9TU1BfRVJSX05PVF9JTklUSUFMSVpFRCA9IDM3LAorCVNTVF9TU1BfRVJSX1NSQU1fTk9fRE1BX0RBVEEgPSAzOCwKIAogCS8qIE90aGVyIGVycm9yIGNvZGVzICovCi0JU1NUX0VSUl9NT0RfSU5JVF9GQUlMLAkvKiBGaXJtd2FyZSBNb2R1bGUgaW5pdCBmYWlsZWQgKi8KKwlTU1RfRVJSX01PRF9JTklUX0ZBSUwgPSAzOSwKIAogCS8qIEZXIGluaXQgZXJyb3IgY29kZXMgKi8KLQlTU1RfUkRSX0VSUl9JT19ERVZfU0VMX05PVF9BTExPV0VELAotCVNTVF9SRFJfRVJSX1JPVVRFX0FMUkVBRFlfU1RBUlRFRCwKLQlTU1RfUkRSX1BSRVBfQ09ERUNfRE5MRF9GQUlMRUQsCisJU1NUX1JEUl9FUlJfSU9fREVWX1NFTF9OT1RfQUxMT1dFRCA9IDQwLAorCVNTVF9SRFJfRVJSX1JPVVRFX0FMUkVBRFlfU1RBUlRFRCA9IDQxLAorCVNTVF9SRFJfRVJSX0lPX0RFVl9TRUxfRkFJTEVEID0gNDIsCisJU1NUX1JEUl9QUkVQX0NPREVDX0ROTERfRkFJTEVEID0gNDMsCiAKIAkvKiBNZW1vcnkgZGVidWcgZXJyb3IgY29kZXMgKi8KLQlTU1RfRVJSX0RCR19NRU1fUkVBRF9GQUlMLAotCVNTVF9FUlJfREJHX01FTV9XUklURV9GQUlMLAorCVNTVF9FUlJfREJHX01FTV9SRUFEX0ZBSUwgPSA0NCwKKwlTU1RfRVJSX0RCR19NRU1fV1JJVEVfRkFJTCA9IDQ1LAorCVNTVF9FUlJfSU5TVUZGSUNJRU5UX0lOUFVUX1NHX0xJU1QgPSA0NiwKKwlTU1RfRVJSX0lOU1VGRklDSUVOVF9PVVRQVVRfU0dfTElTVCA9IDQ3LAogCi0JLyogRGVjb2RlIGVycm9yIGNvZGVzICovCi0JU1NUX0VSUl9ERUNfTkVFRF9JTlBVVF9CVUYsCisJU1NUX0VSUl9CVUZGRVJfTk9UX0FWQUlMQUJMRSA9IDQ4LAorCVNTVF9FUlJfQlVGRkVSX05PVF9BTExPQ0FURUQgPSA0OSwKKwlTU1RfRVJSX0lOVkFMSURfUkVHSU9OX1RZUEUgPSA1MCwKKwlTU1RfRVJSX05VTExfUFRSID0gNTEsCisJU1NUX0VSUl9JTlZBTElEX0JVRkZFUl9TSVpFID0gNTIsCisJU1NUX0VSUl9JTlZBTElEX0JVRkZFUl9JTkRFWCA9IDUzLAogCisJLypJSVBDIHNwZWNpZmljIGVycm9yIGNvZGVzICovCisJU1NUX0lJUENfUVVFVUVfRlVMTCA9IDU0LAorCVNTVF9JSVBDX0VSUl9NU0dfU05EX0ZBSUxFRCA9IDU1LAorCVNTVF9QQl9FUlJfVU5ERVJSVU5fT0NDVVJFRCA9IDU2LAorCVNTVF9SRFJfSU5TVUZGSUNJRU5UX01JWEVSX0JVRkZFUiA9IDU3LAorCVNTVF9JTlZBTElEX1RJTUVfU0xPVFMgPSA1OCwKIH07CiAKIGVudW0gZGJnX21lbV9kYXRhX3R5cGUgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2ludGVsX3NzdC9pbnRlbF9zc3RfaW9jdGwuaCBiL2RyaXZlcnMvc3RhZ2luZy9pbnRlbF9zc3QvaW50ZWxfc3N0X2lvY3RsLmgKaW5kZXggMDNiOTMxNi4uYmViYzM5NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2ludGVsX3NzdC9pbnRlbF9zc3RfaW9jdGwuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaW50ZWxfc3N0L2ludGVsX3NzdF9pb2N0bC5oCkBAIC0xOTAsMjEgKzE5MCwxNSBAQAogCV9fdTMyIHJlc2VydmVkOwkvKiBObyBwcmUtcHJvY2Vzc2luZyBkZWZpbmVkIHlldCAqLwogfTsKIAotc3RydWN0IHNuZF9wYXJhbXNfYmxvY2sgewotCV9fdTMyIHR5cGU7CQkvKlR5cGUgb2YgdGhlIHBhcmFtZXRlciovCi0JX191MzIgc2l6ZTsJCS8qc2l6ZSBvZiB0aGUgcGFyYW1ldGVycyBpbiB0aGUgYmxvY2sqLwotCV9fdTggcGFyYW1zWzBdOwkvKlBhcmFtZXRlcnMgb2YgdGhlIGFsZ29yaXRobSovCi19OwotCiAvKiBQcmUgYW5kIHBvc3QgcHJvY2Vzc2luZyBwYXJhbXMgc3RydWN0dXJlICovCiBzdHJ1Y3Qgc25kX3BwcF9wYXJhbXMgewotCWVudW0gc3N0X2FsZ29fdHlwZXMJYWxnb19pZDsvKiBQb3N0L1ByZSBwcm9jZXNzaW5nIGFsZ29yaXRobSBJRCAgKi8KKwlfX3U4CQkJYWxnb19pZDsvKiBQb3N0L1ByZSBwcm9jZXNzaW5nIGFsZ29yaXRobSBJRCAgKi8KIAlfX3U4CQkJc3RyX2lkOwkvKk9ubHkgNSBiaXRzIHVzZWQgMCAtIDMxIGFyZSB2YWxpZCovCiAJX191OAkJCWVuYWJsZTsJLyogMD0gZGlzYWJsZSwgMT0gZW5hYmxlKi8KIAlfX3U4CQkJcmVzZXJ2ZWQ7CiAJX191MzIJCQlzaXplOwkvKlNpemUgb2YgcGFyYW1ldGVycyBmb3IgYWxsIGJsb2NrcyovCi0Jc3RydWN0IHNuZF9wYXJhbXNfYmxvY2sJcGFyYW1zWzBdOwotfTsKKwl2b2lkCQkJKnBhcmFtczsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwogCiBzdHJ1Y3Qgc25kX3NzdF9wb3N0cHJvY19pbmZvIHsKIAlfX3UzMiBzcmNfbWluOwkJLyogU3VwcG9ydGVkIFNSQyBNaW4gc2FtcGxpbmcgZnJlcSAqLwpAQCAtNDMxLDUgKzQyNSw4IEBACiAjZGVmaW5lIFNORFJWX1NTVF9GV19JTkZPCV9JT1IoJ0wnLCAweDIwLCAgc3RydWN0IHNuZF9zc3RfZndfaW5mbyAqKQogI2RlZmluZSBTTkRSVl9TU1RfU0VUX1RBUkdFVF9ERVZJQ0UgX0lPVygnTCcsIDB4MjEsIFwKIAkJCQkJc3RydWN0IHNuZF9zc3RfdGFyZ2V0X2RldmljZSAqKQorLypEU1AgSW9jdGxzIG9uIC9kZXYvaW50ZWxfc3N0X2N0cmwgb25seSovCisjZGVmaW5lIFNORFJWX1NTVF9TRVRfQUxHTwlfSU9XKCdMJywgMHgzMCwgIHN0cnVjdCBzbmRfcHBwX3BhcmFtcyAqKQorI2RlZmluZSBTTkRSVl9TU1RfR0VUX0FMR08JX0lPV1IoJ0wnLCAweDMxLCAgc3RydWN0IHNuZF9wcHBfcGFyYW1zICopCiAKICNlbmRpZiAvKiBfX0lOVEVMX1NTVF9JT0NUTF9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9pbnRlbF9zc3QvaW50ZWxfc3N0X2lwYy5jIGIvZHJpdmVycy9zdGFnaW5nL2ludGVsX3NzdC9pbnRlbF9zc3RfaXBjLmMKaW5kZXggMzljNjdmYS4uMDc0MmRkZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2ludGVsX3NzdC9pbnRlbF9zc3RfaXBjLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2ludGVsX3NzdC9pbnRlbF9zc3RfaXBjLmMKQEAgLTI2LDYgKzI2LDggQEAKICAqICBUaGlzIGZpbGUgZGVmaW5lcyBhbGwgaXBjIGZ1bmN0aW9ucwogICovCiAKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKwogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KQEAgLTc1LDE2ICs3NywxNiBAQAogCS8qVG8gY2hlY2sgaWYgTFBFIGlzIGluIHN0YWxsZWQgc3RhdGUuKi8KIAlyZXR2YWwgPSBzc3Rfc3RhbGxlZCgpOwogCWlmIChyZXR2YWwgPCAwKSB7Ci0JCXByX2Vycigic3N0OiBpbiBzdGFsbGVkIHN0YXRlXG4iKTsKKwkJcHJfZXJyKCJpbiBzdGFsbGVkIHN0YXRlXG4iKTsKIAkJcmV0dXJuOwogCX0KLQlwcl9kZWJ1Zygic3N0OiBwb3N0IG1lc3NhZ2UgY2FsbGVkXG4iKTsKKwlwcl9kZWJ1ZygicG9zdCBtZXNzYWdlIGNhbGxlZFxuIik7CiAJc3Bpbl9sb2NrKCZzc3RfZHJ2X2N0eC0+bGlzdF9zcGluX2xvY2spOwogCiAJLyogY2hlY2sgbGlzdCAqLwogCWlmIChsaXN0X2VtcHR5KCZzc3RfZHJ2X2N0eC0+aXBjX2Rpc3BhdGNoX2xpc3QpKSB7CiAJCS8qIGxpc3QgaXMgZW1wdHksIG1hc2sgaW1yICovCi0JCXByX2RlYnVnKCJzc3Q6IEVtcHR5IG1zZyBxdWV1ZS4uLiBtYXNraW5nXG4iKTsKKwkJcHJfZGVidWcoIkVtcHR5IG1zZyBxdWV1ZS4uLiBtYXNraW5nXG4iKTsKIAkJaW1yLmZ1bGwgPSByZWFkbChzc3RfZHJ2X2N0eC0+c2hpbSArIFNTVF9JTVJYKTsKIAkJaW1yLnBhcnQuZG9uZV9pbnRlcnJ1cHQgPSAxOwogCQkvKiBkdW1teSByZWdpc3RlciBmb3Igc2hpbSB3b3JrYXJvdW5kICovCkBAIC05Nyw3ICs5OSw3IEBACiAJaGVhZGVyLmZ1bGwgPSBzc3Rfc2hpbV9yZWFkKHNzdF9kcnZfY3R4LT5zaGltLCBTU1RfSVBDWCk7CiAJaWYgKGhlYWRlci5wYXJ0LmJ1c3kpIHsKIAkJLyogYnVzeSwgdW5tYXNrICovCi0JCXByX2RlYnVnKCJzc3Q6IEJ1c3kgbm90IGZyZWUuLi4gdW5tYXNraW5nXG4iKTsKKwkJcHJfZGVidWcoIkJ1c3kgbm90IGZyZWUuLi4gdW5tYXNraW5nXG4iKTsKIAkJaW1yLmZ1bGwgPSByZWFkbChzc3RfZHJ2X2N0eC0+c2hpbSArIFNTVF9JTVJYKTsKIAkJaW1yLnBhcnQuZG9uZV9pbnRlcnJ1cHQgPSAwOwogCQkvKiBkdW1teSByZWdpc3RlciBmb3Igc2hpbSB3b3JrYXJvdW5kICovCkBAIC0xMDksOCArMTExLDggQEAKIAltc2cgPSBsaXN0X2VudHJ5KHNzdF9kcnZfY3R4LT5pcGNfZGlzcGF0Y2hfbGlzdC5uZXh0LAogCQkJc3RydWN0IGlwY19wb3N0LCBub2RlKTsKIAlsaXN0X2RlbCgmbXNnLT5ub2RlKTsKLQlwcl9kZWJ1Zygic3N0OiBQb3N0IG1lc3NhZ2U6IGhlYWRlciA9ICV4XG4iLCBtc2ctPmhlYWRlci5mdWxsKTsKLQlwcl9kZWJ1Zygic3N0OiBzaXplOiA9ICV4XG4iLCBtc2ctPmhlYWRlci5wYXJ0LmRhdGEpOworCXByX2RlYnVnKCJQb3N0IG1lc3NhZ2U6IGhlYWRlciA9ICV4XG4iLCBtc2ctPmhlYWRlci5mdWxsKTsKKwlwcl9kZWJ1Zygic2l6ZTogPSAleFxuIiwgbXNnLT5oZWFkZXIucGFydC5kYXRhKTsKIAlpZiAobXNnLT5oZWFkZXIucGFydC5sYXJnZSkKIAkJbWVtY3B5X3RvaW8oc3N0X2Rydl9jdHgtPm1haWxib3ggKyBTU1RfTUFJTEJPWF9TRU5ELAogCQkJbXNnLT5tYWlsYm94X2RhdGEsIG1zZy0+aGVhZGVyLnBhcnQuZGF0YSk7CkBAIC0xNjYsMTMgKzE2OCwxMyBAQAogCQkoc3RydWN0IGlwY19oZWFkZXJfZndfaW5pdCAqKW1zZy0+bWFpbGJveDsKIAlpbnQgcmV0dmFsID0gMDsKIAotCXByX2RlYnVnKCJzc3Q6ICoqKiBGVyBJbml0IG1zZyBjYW1lKioqXG4iKTsKKwlwcl9kZWJ1ZygiKioqIEZXIEluaXQgbXNnIGNhbWUqKipcbiIpOwogCWlmIChpbml0LT5yZXN1bHQpIHsKIAkJbXV0ZXhfbG9jaygmc3N0X2Rydl9jdHgtPnNzdF9sb2NrKTsKIAkJc3N0X2Rydl9jdHgtPnNzdF9zdGF0ZSA9IFNTVF9FUlJPUjsKIAkJbXV0ZXhfdW5sb2NrKCZzc3RfZHJ2X2N0eC0+c3N0X2xvY2spOwotCQlwcl9kZWJ1Zygic3N0OiBGVyBJbml0IGZhaWxlZCwgRXJyb3IgJXhcbiIsIGluaXQtPnJlc3VsdCk7Ci0JCXByX2Vycigic3N0OiBGVyBJbml0IGZhaWxlZCwgRXJyb3IgJXhcbiIsIGluaXQtPnJlc3VsdCk7CisJCXByX2RlYnVnKCJGVyBJbml0IGZhaWxlZCwgRXJyb3IgJXhcbiIsIGluaXQtPnJlc3VsdCk7CisJCXByX2VycigiRlcgSW5pdCBmYWlsZWQsIEVycm9yICV4XG4iLCBpbml0LT5yZXN1bHQpOwogCQlyZXR2YWwgPSAtaW5pdC0+cmVzdWx0OwogCQlyZXR1cm4gcmV0dmFsOwogCX0KQEAgLTE4MCwxMiArMTgyLDEzIEBACiAJCXNzdF9zZW5kX3NvdW5kX2NhcmRfdHlwZSgpOwogCW11dGV4X2xvY2soJnNzdF9kcnZfY3R4LT5zc3RfbG9jayk7CiAJc3N0X2Rydl9jdHgtPnNzdF9zdGF0ZSA9IFNTVF9GV19SVU5OSU5HOworCXNzdF9kcnZfY3R4LT5scGVfc3RhbGxlZCA9IDA7CiAJbXV0ZXhfdW5sb2NrKCZzc3RfZHJ2X2N0eC0+c3N0X2xvY2spOwotCXByX2RlYnVnKCJzc3Q6IEZXIFZlcnNpb24gJXguJXhcbiIsCisJcHJfZGVidWcoIkZXIFZlcnNpb24gJXguJXhcbiIsCiAJCQlpbml0LT5md192ZXJzaW9uLm1ham9yLCBpbml0LT5md192ZXJzaW9uLm1pbm9yKTsKLQlwcl9kZWJ1Zygic3N0OiBCdWlsZCBObyAleCBUeXBlICV4XG4iLAorCXByX2RlYnVnKCJCdWlsZCBObyAleCBUeXBlICV4XG4iLAogCQkJaW5pdC0+ZndfdmVyc2lvbi5idWlsZCwgaW5pdC0+ZndfdmVyc2lvbi50eXBlKTsKLQlwcl9kZWJ1Zygic3N0OiAgQnVpbGQgZGF0ZSAlcyBUaW1lICVzXG4iLAorCXByX2RlYnVnKCIgQnVpbGQgZGF0ZSAlcyBUaW1lICVzXG4iLAogCQkJaW5pdC0+YnVpbGRfaW5mby5kYXRlLCBpbml0LT5idWlsZF9pbmZvLnRpbWUpOwogCXNzdF93YWtlX3VwX2FsbG9jX2Jsb2NrKHNzdF9kcnZfY3R4LCBGV19EV05MX0lELCByZXR2YWwsIE5VTEwpOwogCXJldHVybiByZXR2YWw7CkBAIC0yMDQsMTkgKzIwNywxOSBAQAogCQkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBzc3RfaXBjX21zZ193cSwgd3EpOwogCWludCBzdHJfaWQgPSBtc2ctPmhlYWRlci5wYXJ0LnN0cl9pZDsKIAotCXByX2RlYnVnKCJzc3Q6IElQQyBwcm9jZXNzIGZvciAleFxuIiwgbXNnLT5oZWFkZXIuZnVsbCk7CisJcHJfZGVidWcoIklQQyBwcm9jZXNzIGZvciAleFxuIiwgbXNnLT5oZWFkZXIuZnVsbCk7CiAKIAkvKiBiYXNlZCBvbiBtc2cgaW4gbGlzdCBjYWxsIHJlc3BlY3RpdmUgaGFuZGxlciAqLwogCXN3aXRjaCAobXNnLT5oZWFkZXIucGFydC5tc2dfaWQpIHsKIAljYXNlIElQQ19TU1RfQlVGX1VOREVSX1JVTjoKIAljYXNlIElQQ19TU1RfQlVGX09WRVJfUlVOOgogCQlpZiAoc3N0X3ZhbGlkYXRlX3N0cmlkKHN0cl9pZCkpIHsKLQkJCXByX2Vycigic3N0OiAgc3RyZWFtIGlkICVkIGludmFsaWRcbiIsIHN0cl9pZCk7CisJCQlwcl9lcnIoInN0cmVhbSBpZCAlZCBpbnZhbGlkXG4iLCBzdHJfaWQpOwogCQkJYnJlYWs7CiAJCX0KLQkJcHJfZXJyKCJzc3Q6IEJ1ZmZlciB1bmRlci9vdmVycnVuIGZvciVkXG4iLAorCQlwcl9lcnIoIkJ1ZmZlciB1bmRlci9vdmVycnVuIGZvciAlZFxuIiwKIAkJCQltc2ctPmhlYWRlci5wYXJ0LnN0cl9pZCk7Ci0JCXByX2Vycigic3N0OiBHb3QgVW5kZXJydW4gJiBub3QgdG8gc2VuZCBkYXRhLi4uaWdub3JlXG4iKTsKKwkJcHJfZXJyKCJHb3QgVW5kZXJydW4gJiBub3QgdG8gc2VuZCBkYXRhLi4uaWdub3JlXG4iKTsKIAkJYnJlYWs7CiAKIAljYXNlIElQQ19TU1RfR0VUX1BMQVlfRlJBTUVTOgpAQCAtMjI0LDM1ICsyMjcsMzUgQEAKIAkJCXN0cnVjdCBzdHJlYW1faW5mbyAqc3RyZWFtIDsKIAogCQkJaWYgKHNzdF92YWxpZGF0ZV9zdHJpZChzdHJfaWQpKSB7Ci0JCQkJcHJfZXJyKCJzc3Q6IHN0cmlkICVkIGludmFsaWRcbiIsIHN0cl9pZCk7CisJCQkJcHJfZXJyKCJzdHJpZCAlZCBpbnZhbGlkXG4iLCBzdHJfaWQpOwogCQkJCWJyZWFrOwogCQkJfQogCQkJLyogY2FsbCBzc3RfcGxheV9mcmFtZSAqLwogCQkJc3RyZWFtID0gJnNzdF9kcnZfY3R4LT5zdHJlYW1zW3N0cl9pZF07Ci0JCQlwcl9kZWJ1Zygic3N0OiBzc3RfcGxheV9mcmFtZXMgZm9yICVkXG4iLAorCQkJcHJfZGVidWcoInNzdF9wbGF5X2ZyYW1lcyBmb3IgJWRcbiIsCiAJCQkJCW1zZy0+aGVhZGVyLnBhcnQuc3RyX2lkKTsKIAkJCW11dGV4X2xvY2soJnNzdF9kcnZfY3R4LT5zdHJlYW1zW3N0cl9pZF0ubG9jayk7CiAJCQlzc3RfcGxheV9mcmFtZShtc2ctPmhlYWRlci5wYXJ0LnN0cl9pZCk7CiAJCQltdXRleF91bmxvY2soJnNzdF9kcnZfY3R4LT5zdHJlYW1zW3N0cl9pZF0ubG9jayk7CiAJCQlicmVhazsKIAkJfSBlbHNlCi0JCQlwcl9lcnIoInNzdDogc3N0X3BsYXlfZnJhbWVzIGZvciBQZW53ZWxsISFcbiIpOworCQkJcHJfZXJyKCJzc3RfcGxheV9mcmFtZXMgZm9yIFBlbndlbGwhIVxuIik7CiAKIAljYXNlIElQQ19TU1RfR0VUX0NBUFRfRlJBTUVTOgogCQlpZiAoc3N0X2Rydl9jdHgtPnBjaV9pZCA9PSBTU1RfTVJTVF9QQ0lfSUQpIHsKIAkJCXN0cnVjdCBzdHJlYW1faW5mbyAqc3RyZWFtOwogCQkJLyogY2FsbCBzc3RfY2FwdHVyZV9mcmFtZSAqLwogCQkJaWYgKHNzdF92YWxpZGF0ZV9zdHJpZChzdHJfaWQpKSB7Ci0JCQkJcHJfZXJyKCJzc3Q6IHN0ciBpZCAlZCBpbnZhbGlkXG4iLCBzdHJfaWQpOworCQkJCXByX2Vycigic3RyIGlkICVkIGludmFsaWRcbiIsIHN0cl9pZCk7CiAJCQkJYnJlYWs7CiAJCQl9CiAJCQlzdHJlYW0gPSAmc3N0X2Rydl9jdHgtPnN0cmVhbXNbc3RyX2lkXTsKLQkJCXByX2RlYnVnKCJzc3Q6IHNzdF9jYXB0dXJlX2ZyYW1lcyBmb3IgJWRcbiIsCisJCQlwcl9kZWJ1Zygic3N0X2NhcHR1cmVfZnJhbWVzIGZvciAlZFxuIiwKIAkJCQkJbXNnLT5oZWFkZXIucGFydC5zdHJfaWQpOwogCQkJbXV0ZXhfbG9jaygmc3RyZWFtLT5sb2NrKTsKIAkJCWlmIChzdHJlYW0tPm1tYXBwZWQgPT0gZmFsc2UgJiYKIAkJCQkJc3RyZWFtLT5zcmMgPT0gU1NUX0RSVikgewotCQkJCXByX2RlYnVnKCJzc3Q6IHdha2luZyB1cCBibG9jayBmb3IgY29weS5cbiIpOworCQkJCXByX2RlYnVnKCJ3YWtpbmcgdXAgYmxvY2sgZm9yIGNvcHkuXG4iKTsKIAkJCQlzdHJlYW0tPmRhdGFfYmxrLnJldF9jb2RlID0gMDsKIAkJCQlzdHJlYW0tPmRhdGFfYmxrLmNvbmRpdGlvbiA9IHRydWU7CiAJCQkJc3RyZWFtLT5kYXRhX2Jsay5vbiA9IGZhbHNlOwpAQCAtMjYxLDExICsyNjQsMTEgQEAKIAkJCQlzc3RfY2FwdHVyZV9mcmFtZShtc2ctPmhlYWRlci5wYXJ0LnN0cl9pZCk7CiAJCQltdXRleF91bmxvY2soJnN0cmVhbS0+bG9jayk7CiAJCX0gZWxzZQotCQkJcHJfZXJyKCJzc3Q6IHNzdF9wbGF5X2ZyYW1lcyBmb3IgUGVud2VsbCEhXG4iKTsKKwkJCXByX2Vycigic3N0X3BsYXlfZnJhbWVzIGZvciBQZW53ZWxsISFcbiIpOwogCQlicmVhazsKIAogCWNhc2UgSVBDX0lBX1BSSU5UX1NUUklORzoKLQkJcHJfZGVidWcoInNzdDogYmVlbiBhc2tlZCB0byBwcmludCBzb21ldGhpbmcgYnkgZndcbiIpOworCQlwcl9kZWJ1ZygiYmVlbiBhc2tlZCB0byBwcmludCBzb21ldGhpbmcgYnkgZndcbiIpOwogCQkvKiBUQkQgKi8KIAkJYnJlYWs7CiAKQEAgLTI3NywxMiArMjgwLDEyIEBACiAKIAljYXNlIElQQ19TU1RfU1RSRUFNX1BST0NFU1NfRkFUQUxfRVJSOgogCQlpZiAoc3N0X3ZhbGlkYXRlX3N0cmlkKHN0cl9pZCkpIHsKLQkJCXByX2Vycigic3N0OiBzdHJlYW0gaWQgJWQgaW52YWxpZFxuIiwgc3RyX2lkKTsKKwkJCXByX2Vycigic3RyZWFtIGlkICVkIGludmFsaWRcbiIsIHN0cl9pZCk7CiAJCQlicmVhazsKIAkJfQotCQlwcl9lcnIoInNzdDogY29kZWMgZmF0YWwgZXJyb3IgJXggc3RyZWFtICVkLi4uXG4iLAorCQlwcl9lcnIoImNvZGVjIGZhdGFsIGVycm9yICV4IHN0cmVhbSAlZC4uLlxuIiwKIAkJCQltc2ctPmhlYWRlci5mdWxsLCBtc2ctPmhlYWRlci5wYXJ0LnN0cl9pZCk7Ci0JCXByX2Vycigic3N0OiBEcm9wcGluZyB0aGUgc3RyZWFtXG4iKTsKKwkJcHJfZXJyKCJEcm9wcGluZyB0aGUgc3RyZWFtXG4iKTsKIAkJc3N0X2Ryb3Bfc3RyZWFtKG1zZy0+aGVhZGVyLnBhcnQuc3RyX2lkKTsKIAkJYnJlYWs7CiAJY2FzZSBJUENfSUFfTFBFX0dFVFRJTkdfU1RBTExFRDoKQEAgLTI5Myw3ICsyOTYsNyBAQAogCQlicmVhazsKIAlkZWZhdWx0OgogCQkvKiBJbGxlZ2FsIGNhc2UgKi8KLQkJcHJfZXJyKCJzc3Q6IFVuaGFuZGxlZCBtc2cgJXggaGVhZGVyICV4XG4iLAorCQlwcl9lcnIoIlVuaGFuZGxlZCBtc2cgJXggaGVhZGVyICV4XG4iLAogCQltc2ctPmhlYWRlci5wYXJ0Lm1zZ19pZCwgbXNnLT5oZWFkZXIuZnVsbCk7CiAJfQogCXNzdF9jbGVhcl9pbnRlcnJ1cHQoKTsKQEAgLTMyMiw3ICszMjUsNyBAQAogCQlpZiAoIW1zZy0+aGVhZGVyLnBhcnQuZGF0YSkgewogCQkJc3N0X2Rydl9jdHgtPnRndF9kZXZfYmxrLnJldF9jb2RlID0gMDsKIAkJfSBlbHNlIHsKLQkJCXByX2Vycigic3N0OiAgTXNnICV4IHJlcGx5IGVycm9yICV4XG4iLAorCQkJcHJfZXJyKCIgTXNnICV4IHJlcGx5IGVycm9yICV4XG4iLAogCQkJbXNnLT5oZWFkZXIucGFydC5tc2dfaWQsIG1zZy0+aGVhZGVyLnBhcnQuZGF0YSk7CiAJCQlzc3RfZHJ2X2N0eC0+dGd0X2Rldl9ibGsucmV0X2NvZGUgPQogCQkJCQktbXNnLT5oZWFkZXIucGFydC5kYXRhOwpAQCAtMzMzLDYgKzMzNiw1NSBAQAogCQkJCXdha2VfdXAoJnNzdF9kcnZfY3R4LT53YWl0X3F1ZXVlKTsKIAkJfQogCQlicmVhazsKKwljYXNlIElQQ19JQV9BTEdfUEFSQU1TOiB7CisJCXByX2RlYnVnKCJzc3Q6SVBDX0FMR19QQVJBTVMgcmVzcG9uc2UgJXhcbiIsIG1zZy0+aGVhZGVyLmZ1bGwpOworCQlwcl9kZWJ1Zygic3N0OiBkYXRhIHZhbHVlICV4XG4iLCBtc2ctPmhlYWRlci5wYXJ0LmRhdGEpOworCQlwcl9kZWJ1Zygic3N0OiBsYXJnZSB2YWx1ZSAleFxuIiwgbXNnLT5oZWFkZXIucGFydC5sYXJnZSk7CisKKwkJaWYgKCFtc2ctPmhlYWRlci5wYXJ0LmxhcmdlKSB7CisJCQlpZiAoIW1zZy0+aGVhZGVyLnBhcnQuZGF0YSkgeworCQkJCXByX2RlYnVnKCJzc3Q6IGFsZyBzZXQgc3VjY2Vzc1xuIik7CisJCQkJc3N0X2Rydl9jdHgtPnBwcF9wYXJhbXNfYmxrLnJldF9jb2RlID0gMDsKKwkJCX0gZWxzZSB7CisJCQkJcHJfZGVidWcoInNzdDogYWxnIHNldCBmYWlsZWRcbiIpOworCQkJCXNzdF9kcnZfY3R4LT5wcHBfcGFyYW1zX2Jsay5yZXRfY29kZSA9CisJCQkJCQkJLW1zZy0+aGVhZGVyLnBhcnQuZGF0YTsKKwkJCX0KKworCQl9IGVsc2UgaWYgKG1zZy0+aGVhZGVyLnBhcnQuZGF0YSkgeworCQkJc3RydWN0IHNuZF9wcHBfcGFyYW1zICptYWlsYm94X3BhcmFtcywgKmdldF9wYXJhbXM7CisJCQljaGFyICpwYXJhbXM7CisKKwkJCXByX2RlYnVnKCJzc3Q6IGFsZyBnZXQgc3VjY2Vzc1xuIik7CisJCQltYWlsYm94X3BhcmFtcyA9IChzdHJ1Y3Qgc25kX3BwcF9wYXJhbXMgKiltc2ctPm1haWxib3g7CisJCQlnZXRfcGFyYW1zID0ga3phbGxvYyhzaXplb2YoKmdldF9wYXJhbXMpLCBHRlBfS0VSTkVMKTsKKwkJCWlmIChnZXRfcGFyYW1zID09IE5VTEwpIHsKKwkJCQlwcl9lcnIoInNzdDogb3V0IG9mIG1lbW9yeSBmb3IgQUxHIFBBUkFNUyIpOworCQkJCWJyZWFrOworCQkJfQorCQkJbWVtY3B5X2Zyb21pbyhnZXRfcGFyYW1zLCBtYWlsYm94X3BhcmFtcywKKwkJCQkJCQlzaXplb2YoKmdldF9wYXJhbXMpKTsKKwkJCWdldF9wYXJhbXMtPnBhcmFtcyA9IGt6YWxsb2MobWFpbGJveF9wYXJhbXMtPnNpemUsCisJCQkJCQkJR0ZQX0tFUk5FTCk7CisJCQlpZiAoZ2V0X3BhcmFtcy0+cGFyYW1zID09IE5VTEwpIHsKKwkJCQlrZnJlZShnZXRfcGFyYW1zKTsKKwkJCQlwcl9lcnIoInNzdDogb3V0IG9mIG1lbW9yeSBmb3IgQUxHIFBBUkFNUyBibG9jayIpOworCQkJCWJyZWFrOworCQkJfQorCQkJcGFyYW1zID0gbXNnLT5tYWlsYm94OworCQkJcGFyYW1zID0gcGFyYW1zICsgc2l6ZW9mKCptYWlsYm94X3BhcmFtcykgLSBzaXplb2YodTMyKTsKKwkJCW1lbWNweV9mcm9taW8oZ2V0X3BhcmFtcy0+cGFyYW1zLCBwYXJhbXMsCisJCQkJCQkJZ2V0X3BhcmFtcy0+c2l6ZSk7CisJCQlzc3RfZHJ2X2N0eC0+cHBwX3BhcmFtc19ibGsucmV0X2NvZGUgPSAwOworCQkJc3N0X2Rydl9jdHgtPnBwcF9wYXJhbXNfYmxrLmRhdGEgPSBnZXRfcGFyYW1zOworCQl9CisKKwkJaWYgKHNzdF9kcnZfY3R4LT5wcHBfcGFyYW1zX2Jsay5vbiA9PSB0cnVlKSB7CisJCQlzc3RfZHJ2X2N0eC0+cHBwX3BhcmFtc19ibGsuY29uZGl0aW9uID0gdHJ1ZTsKKwkJCXdha2VfdXAoJnNzdF9kcnZfY3R4LT53YWl0X3F1ZXVlKTsKKwkJfQorCQlicmVhazsKKwl9CiAJY2FzZSBJUENfSUFfR0VUX0ZXX0lORk86IHsKIAkJc3RydWN0IHNuZF9zc3RfZndfaW5mbyAqZndfaW5mbyA9CiAJCQkoc3RydWN0IHNuZF9zc3RfZndfaW5mbyAqKW1zZy0+bWFpbGJveDsKQEAgLTM0MCw3ICszOTIsNyBAQAogCQkJaW50IG1ham9yID0gZndfaW5mby0+ZndfdmVyc2lvbi5tYWpvcjsKIAkJCWludCBtaW5vciA9IGZ3X2luZm8tPmZ3X3ZlcnNpb24ubWlub3I7CiAJCQlpbnQgYnVpbGQgPSBmd19pbmZvLT5md192ZXJzaW9uLmJ1aWxkOwotCQkJcHJfZGVidWcoInNzdDogTXNnIHN1Y2NlZGRlZCAleFxuIiwKKwkJCXByX2RlYnVnKCJNc2cgc3VjY2VlZGVkICV4XG4iLAogCQkJCSAgICAgICBtc2ctPmhlYWRlci5wYXJ0Lm1zZ19pZCk7CiAJCQlwcl9kZWJ1ZygiSU5GTzogKioqRlcqKiogPSAlMDJkLiUwMmQuJTAyZFxuIiwKIAkJCQkJbWFqb3IsIG1pbm9yLCBidWlsZCk7CkBAIC0zNDksMTMgKzQwMSwxMyBAQAogCQkJCXNpemVvZihzdHJ1Y3Qgc25kX3NzdF9md19pbmZvKSk7CiAJCQlzc3RfZHJ2X2N0eC0+ZndfaW5mb19ibGsucmV0X2NvZGUgPSAwOwogCQl9IGVsc2UgewotCQkJcHJfZXJyKCJzc3Q6ICBNc2cgJXggcmVwbHkgZXJyb3IgJXhcbiIsCisJCQlwcl9lcnIoIiBNc2cgJXggcmVwbHkgZXJyb3IgJXhcbiIsCiAJCQltc2ctPmhlYWRlci5wYXJ0Lm1zZ19pZCwgbXNnLT5oZWFkZXIucGFydC5kYXRhKTsKIAkJCXNzdF9kcnZfY3R4LT5md19pbmZvX2Jsay5yZXRfY29kZSA9CiAJCQkJCS1tc2ctPmhlYWRlci5wYXJ0LmRhdGE7CiAJCX0KIAkJaWYgKHNzdF9kcnZfY3R4LT5md19pbmZvX2Jsay5vbiA9PSB0cnVlKSB7Ci0JCQlwcl9kZWJ1Zygic3N0OiBNZW1jb3B5IHN1Y2NlZGRlZFxuIik7CisJCQlwcl9kZWJ1ZygiTWVtY29weSBzdWNjZWVkZWRcbiIpOwogCQkJc3N0X2Rydl9jdHgtPmZ3X2luZm9fYmxrLm9uID0gZmFsc2U7CiAJCQlzc3RfZHJ2X2N0eC0+ZndfaW5mb19ibGsuY29uZGl0aW9uID0gdHJ1ZTsKIAkJCXdha2VfdXAoJnNzdF9kcnZfY3R4LT53YWl0X3F1ZXVlKTsKQEAgLTM2NCwxMSArNDE2LDExIEBACiAJfQogCWNhc2UgSVBDX0lBX1NFVF9TVFJFQU1fTVVURToKIAkJaWYgKCFtc2ctPmhlYWRlci5wYXJ0LmRhdGEpIHsKLQkJCXByX2RlYnVnKCJzc3Q6IE1zZyBzdWNjZWRkZWQgJXhcbiIsCisJCQlwcl9kZWJ1ZygiTXNnIHN1Y2NlZWRlZCAleFxuIiwKIAkJCQkgICAgICAgbXNnLT5oZWFkZXIucGFydC5tc2dfaWQpOwogCQkJc3N0X2Rydl9jdHgtPm11dGVfaW5mb19ibGsucmV0X2NvZGUgPSAwOwogCQl9IGVsc2UgewotCQkJcHJfZXJyKCJzc3Q6ICBNc2cgJXggcmVwbHkgZXJyb3IgJXhcbiIsCisJCQlwcl9lcnIoIiBNc2cgJXggcmVwbHkgZXJyb3IgJXhcbiIsCiAJCQltc2ctPmhlYWRlci5wYXJ0Lm1zZ19pZCwgbXNnLT5oZWFkZXIucGFydC5kYXRhKTsKIAkJCXNzdF9kcnZfY3R4LT5tdXRlX2luZm9fYmxrLnJldF9jb2RlID0KIAkJCQkJLW1zZy0+aGVhZGVyLnBhcnQuZGF0YTsKQEAgLTM4MiwxMSArNDM0LDExIEBACiAJCWJyZWFrOwogCWNhc2UgSVBDX0lBX1NFVF9TVFJFQU1fVk9MOgogCQlpZiAoIW1zZy0+aGVhZGVyLnBhcnQuZGF0YSkgewotCQkJcHJfZGVidWcoInNzdDogTXNnIHN1Y2NlZGRlZCAleFxuIiwKKwkJCXByX2RlYnVnKCJNc2cgc3VjY2VlZGVkICV4XG4iLAogCQkJCSAgICAgICBtc2ctPmhlYWRlci5wYXJ0Lm1zZ19pZCk7CiAJCQlzc3RfZHJ2X2N0eC0+dm9sX2luZm9fYmxrLnJldF9jb2RlID0gMDsKIAkJfSBlbHNlIHsKLQkJCXByX2Vycigic3N0OiAgTXNnICV4IHJlcGx5IGVycm9yICV4XG4iLAorCQkJcHJfZXJyKCIgTXNnICV4IHJlcGx5IGVycm9yICV4XG4iLAogCQkJCQltc2ctPmhlYWRlci5wYXJ0Lm1zZ19pZCwKIAkJCW1zZy0+aGVhZGVyLnBhcnQuZGF0YSk7CiAJCQlzc3RfZHJ2X2N0eC0+dm9sX2luZm9fYmxrLnJldF9jb2RlID0KQEAgLTQwMiwxNSArNDU0LDE1IEBACiAJCWJyZWFrOwogCWNhc2UgSVBDX0lBX0dFVF9TVFJFQU1fVk9MOgogCQlpZiAobXNnLT5oZWFkZXIucGFydC5sYXJnZSkgewotCQkJcHJfZGVidWcoInNzdDogTGFyZ2UgTXNnIFJlY2VpdmVkIFN1Y2Nlc3NmdWxseVxuIik7Ci0JCQlwcl9kZWJ1Zygic3N0OiBNc2cgc3VjY2VkZGVkICV4XG4iLAorCQkJcHJfZGVidWcoIkxhcmdlIE1zZyBSZWNlaXZlZCBTdWNjZXNzZnVsbHlcbiIpOworCQkJcHJfZGVidWcoIk1zZyBzdWNjZWVkZWQgJXhcbiIsCiAJCQkJICAgICAgIG1zZy0+aGVhZGVyLnBhcnQubXNnX2lkKTsKIAkJCW1lbWNweV9mcm9taW8oc3N0X2Rydl9jdHgtPnZvbF9pbmZvX2Jsay5kYXRhLAogCQkJCSh2b2lkICopIG1zZy0+bWFpbGJveCwKIAkJCQlzaXplb2Yoc3RydWN0IHNuZF9zc3Rfdm9sKSk7CiAJCQlzc3RfZHJ2X2N0eC0+dm9sX2luZm9fYmxrLnJldF9jb2RlID0gMDsKIAkJfSBlbHNlIHsKLQkJCXByX2Vycigic3N0OiBNc2cgJXggcmVwbHkgZXJyb3IgJXhcbiIsCisJCQlwcl9lcnIoIk1zZyAleCByZXBseSBlcnJvciAleFxuIiwKIAkJCW1zZy0+aGVhZGVyLnBhcnQubXNnX2lkLCBtc2ctPmhlYWRlci5wYXJ0LmRhdGEpOwogCQkJc3N0X2Rydl9jdHgtPnZvbF9pbmZvX2Jsay5yZXRfY29kZSA9CiAJCQkJCS1tc2ctPmhlYWRlci5wYXJ0LmRhdGE7CkBAIC00MjQsMTggKzQ3NiwxOCBAQAogCiAJY2FzZSBJUENfSUFfR0VUX1NUUkVBTV9QQVJBTVM6CiAJCWlmIChzc3RfdmFsaWRhdGVfc3RyaWQoc3RyX2lkKSkgewotCQkJcHJfZXJyKCJzc3Q6IHN0cmVhbSBpZCAlZCBpbnZhbGlkXG4iLCBzdHJfaWQpOworCQkJcHJfZXJyKCJzdHJlYW0gaWQgJWQgaW52YWxpZFxuIiwgc3RyX2lkKTsKIAkJCWJyZWFrOwogCQl9CiAJCXN0cl9pbmZvID0gJnNzdF9kcnZfY3R4LT5zdHJlYW1zW3N0cl9pZF07CiAJCWlmIChtc2ctPmhlYWRlci5wYXJ0LmxhcmdlKSB7Ci0JCQlwcl9kZWJ1Zygic3N0OiBHZXQgc3RyZWFtIGxhcmdlIHN1Y2Nlc3NcbiIpOworCQkJcHJfZGVidWcoIkdldCBzdHJlYW0gbGFyZ2Ugc3VjY2Vzc1xuIik7CiAJCQltZW1jcHlfZnJvbWlvKHN0cl9pbmZvLT5jdHJsX2Jsay5kYXRhLAogCQkJCSgodm9pZCAqKShtc2ctPm1haWxib3gpKSwKIAkJCQlzaXplb2Yoc3RydWN0IHNuZF9zc3RfZndfZ2V0X3N0cmVhbV9wYXJhbXMpKTsKIAkJCXN0cl9pbmZvLT5jdHJsX2Jsay5yZXRfY29kZSA9IDA7CiAJCX0gZWxzZSB7Ci0JCQlwcl9lcnIoInNzdDogTXNnICV4IHJlcGx5IGVycm9yICV4XG4iLAorCQkJcHJfZXJyKCJNc2cgJXggcmVwbHkgZXJyb3IgJXhcbiIsCiAJCQkJbXNnLT5oZWFkZXIucGFydC5tc2dfaWQsIG1zZy0+aGVhZGVyLnBhcnQuZGF0YSk7CiAJCQlzdHJfaW5mby0+Y3RybF9ibGsucmV0X2NvZGUgPSAtbXNnLT5oZWFkZXIucGFydC5kYXRhOwogCQl9CkBAIC00NDcsMTkgKzQ5OSwxOSBAQAogCQlicmVhazsKIAljYXNlIElQQ19JQV9ERUNPREVfRlJBTUVTOgogCQlpZiAoc3N0X3ZhbGlkYXRlX3N0cmlkKHN0cl9pZCkpIHsKLQkJCXByX2Vycigic3N0OiBzdHJlYW0gaWQgJWQgaW52YWxpZFxuIiwgc3RyX2lkKTsKKwkJCXByX2Vycigic3RyZWFtIGlkICVkIGludmFsaWRcbiIsIHN0cl9pZCk7CiAJCQlicmVhazsKIAkJfQogCQlzdHJfaW5mbyA9ICZzc3RfZHJ2X2N0eC0+c3RyZWFtc1tzdHJfaWRdOwogCQlpZiAobXNnLT5oZWFkZXIucGFydC5sYXJnZSkgewotCQkJcHJfZGVidWcoInNzdDogTXNnIHN1Y2NlZGRlZCAleFxuIiwKKwkJCXByX2RlYnVnKCJNc2cgc3VjY2VlZGVkICV4XG4iLAogCQkJCSAgICAgICBtc2ctPmhlYWRlci5wYXJ0Lm1zZ19pZCk7CiAJCQltZW1jcHlfZnJvbWlvKHN0cl9pbmZvLT5kYXRhX2Jsay5kYXRhLAogCQkJCQkoKHZvaWQgKikobXNnLT5tYWlsYm94KSksCiAJCQkJCXNpemVvZihzdHJ1Y3Qgc25kX3NzdF9kZWNvZGVfaW5mbykpOwogCQkJc3RyX2luZm8tPmRhdGFfYmxrLnJldF9jb2RlID0gMDsKIAkJfSBlbHNlIHsKLQkJCXByX2Vycigic3N0OiBNc2cgJXggcmVwbHkgZXJyb3IgJXhcbiIsCisJCQlwcl9lcnIoIk1zZyAleCByZXBseSBlcnJvciAleFxuIiwKIAkJCQltc2ctPmhlYWRlci5wYXJ0Lm1zZ19pZCwgbXNnLT5oZWFkZXIucGFydC5kYXRhKTsKIAkJCXN0cl9pbmZvLT5kYXRhX2Jsay5yZXRfY29kZSA9IC1tc2ctPmhlYWRlci5wYXJ0LmRhdGE7CiAJCX0KQEAgLTQ3MSwxNyArNTIzLDE3IEBACiAJCWJyZWFrOwogCWNhc2UgSVBDX0lBX0RSQUlOX1NUUkVBTToKIAkJaWYgKHNzdF92YWxpZGF0ZV9zdHJpZChzdHJfaWQpKSB7Ci0JCQlwcl9lcnIoInNzdDogc3RyZWFtIGlkICVkIGludmFsaWRcbiIsIHN0cl9pZCk7CisJCQlwcl9lcnIoInN0cmVhbSBpZCAlZCBpbnZhbGlkXG4iLCBzdHJfaWQpOwogCQkJYnJlYWs7CiAJCX0KIAkJc3RyX2luZm8gPSAmc3N0X2Rydl9jdHgtPnN0cmVhbXNbc3RyX2lkXTsKIAkJaWYgKCFtc2ctPmhlYWRlci5wYXJ0LmRhdGEpIHsKLQkJCXByX2RlYnVnKCJzc3Q6IE1zZyBzdWNjZWRkZWQgJXhcbiIsCisJCQlwcl9kZWJ1ZygiTXNnIHN1Y2NlZWRlZCAleFxuIiwKIAkJCQkJbXNnLT5oZWFkZXIucGFydC5tc2dfaWQpOwogCQkJc3RyX2luZm8tPmN0cmxfYmxrLnJldF9jb2RlID0gMDsKIAogCQl9IGVsc2UgewotCQkJcHJfZXJyKCJzc3Q6ICBNc2cgJXggcmVwbHkgZXJyb3IgJXhcbiIsCisJCQlwcl9lcnIoIiBNc2cgJXggcmVwbHkgZXJyb3IgJXhcbiIsCiAJCQkJbXNnLT5oZWFkZXIucGFydC5tc2dfaWQsIG1zZy0+aGVhZGVyLnBhcnQuZGF0YSk7CiAJCQlzdHJfaW5mby0+Y3RybF9ibGsucmV0X2NvZGUgPSAtbXNnLT5oZWFkZXIucGFydC5kYXRhOwogCkBAIC00OTYsNyArNTQ4LDcgQEAKIAogCWNhc2UgSVBDX0lBX0RST1BfU1RSRUFNOgogCQlpZiAoc3N0X3ZhbGlkYXRlX3N0cmlkKHN0cl9pZCkpIHsKLQkJCXByX2Vycigic3N0OiBzdHIgaWQgJWQgaW52YWxpZFxuIiwgc3RyX2lkKTsKKwkJCXByX2Vycigic3RyIGlkICVkIGludmFsaWRcbiIsIHN0cl9pZCk7CiAJCQlicmVhazsKIAkJfQogCQlzdHJfaW5mbyA9ICZzc3RfZHJ2X2N0eC0+c3RyZWFtc1tzdHJfaWRdOwpAQCAtNTA0LDEyICs1NTYsMTIgQEAKIAkJCXN0cnVjdCBzbmRfc3N0X2Ryb3BfcmVzcG9uc2UgKmRyb3BfcmVzcCA9CiAJCQkJKHN0cnVjdCBzbmRfc3N0X2Ryb3BfcmVzcG9uc2UgKiltc2ctPm1haWxib3g7CiAKLQkJCXByX2RlYnVnKCJzc3Q6IERyb3AgcmV0IGJ5dGVzICV4XG4iLCBkcm9wX3Jlc3AtPmJ5dGVzKTsKKwkJCXByX2RlYnVnKCJEcm9wIHJldCBieXRlcyAleFxuIiwgZHJvcF9yZXNwLT5ieXRlcyk7CiAKIAkJCXN0cl9pbmZvLT5jdXJyX2J5dGVzID0gZHJvcF9yZXNwLT5ieXRlczsKIAkJCXN0cl9pbmZvLT5jdHJsX2Jsay5yZXRfY29kZSA9ICAwOwogCQl9IGVsc2UgewotCQkJcHJfZXJyKCJzc3Q6ICBNc2cgJXggcmVwbHkgZXJyb3IgJXhcbiIsCisJCQlwcl9lcnIoIiBNc2cgJXggcmVwbHkgZXJyb3IgJXhcbiIsCiAJCQkJbXNnLT5oZWFkZXIucGFydC5tc2dfaWQsIG1zZy0+aGVhZGVyLnBhcnQuZGF0YSk7CiAJCQlzdHJfaW5mby0+Y3RybF9ibGsucmV0X2NvZGUgPSAtbXNnLT5oZWFkZXIucGFydC5kYXRhOwogCQl9CkBAIC01MjEsMTAgKzU3MywxMCBAQAogCQlicmVhazsKIAljYXNlIElQQ19JQV9FTkFCTEVfUlhfVElNRV9TTE9UOgogCQlpZiAoIW1zZy0+aGVhZGVyLnBhcnQuZGF0YSkgewotCQkJcHJfZGVidWcoInNzdDogUlhfVElNRV9TTE9UIHN1Y2Nlc3NcbiIpOworCQkJcHJfZGVidWcoIlJYX1RJTUVfU0xPVCBzdWNjZXNzXG4iKTsKIAkJCXNzdF9kcnZfY3R4LT5oc19pbmZvX2Jsay5yZXRfY29kZSA9IDA7CiAJCX0gZWxzZSB7Ci0JCQlwcl9lcnIoInNzdDogIE1zZyAleCByZXBseSBlcnJvciAleFxuIiwKKwkJCXByX2VycigiIE1zZyAleCByZXBseSBlcnJvciAleFxuIiwKIAkJCQltc2ctPmhlYWRlci5wYXJ0Lm1zZ19pZCwKIAkJCQltc2ctPmhlYWRlci5wYXJ0LmRhdGEpOwogCQkJc3N0X2Rydl9jdHgtPmhzX2luZm9fYmxrLnJldF9jb2RlID0KQEAgLTU0MSwxNyArNTkzLDE3IEBACiAJY2FzZSBJUENfSUFfU0VUX1NUUkVBTV9QQVJBTVM6CiAJCXN0cl9pbmZvID0gJnNzdF9kcnZfY3R4LT5zdHJlYW1zW3N0cl9pZF07CiAJCWlmICghbXNnLT5oZWFkZXIucGFydC5kYXRhKSB7Ci0JCQlwcl9kZWJ1Zygic3N0OiBNc2cgc3VjY2VkZGVkICV4XG4iLAorCQkJcHJfZGVidWcoIk1zZyBzdWNjZWVkZWQgJXhcbiIsCiAJCQkJCW1zZy0+aGVhZGVyLnBhcnQubXNnX2lkKTsKIAkJCXN0cl9pbmZvLT5jdHJsX2Jsay5yZXRfY29kZSA9IDA7CiAJCX0gZWxzZSB7Ci0JCQlwcl9lcnIoInNzdDogIE1zZyAleCByZXBseSBlcnJvciAleFxuIiwKKwkJCXByX2VycigiIE1zZyAleCByZXBseSBlcnJvciAleFxuIiwKIAkJCQkJbXNnLT5oZWFkZXIucGFydC5tc2dfaWQsCiAJCQkJCW1zZy0+aGVhZGVyLnBhcnQuZGF0YSk7CiAJCQlzdHJfaW5mby0+Y3RybF9ibGsucmV0X2NvZGUgPSAtbXNnLT5oZWFkZXIucGFydC5kYXRhOwogCQl9CiAJCWlmIChzc3RfdmFsaWRhdGVfc3RyaWQoc3RyX2lkKSkgewotCQkJcHJfZXJyKCJzc3Q6ICBzdHJlYW0gaWQgJWQgaW52YWxpZFxuIiwgc3RyX2lkKTsKKwkJCXByX2VycigiIHN0cmVhbSBpZCAlZCBpbnZhbGlkXG4iLCBzdHJfaWQpOwogCQkJYnJlYWs7CiAJCX0KIApAQCAtNTY0LDkgKzYxNiw5IEBACiAKIAljYXNlIElQQ19JQV9GUkVFX1NUUkVBTToKIAkJaWYgKCFtc2ctPmhlYWRlci5wYXJ0LmRhdGEpIHsKLQkJCXByX2RlYnVnKCJzc3Q6IFN0cmVhbSAlZCBmcmVlZFxuIiwgc3RyX2lkKTsKKwkJCXByX2RlYnVnKCJTdHJlYW0gJWQgZnJlZWRcbiIsIHN0cl9pZCk7CiAJCX0gZWxzZSB7Ci0JCQlwcl9lcnIoInNzdDogRnJlZSBmb3IgJWQgcmV0IGVycm9yICV4XG4iLAorCQkJcHJfZXJyKCJGcmVlIGZvciAlZCByZXQgZXJyb3IgJXhcbiIsCiAJCQkJICAgICAgIHN0cl9pZCwgbXNnLT5oZWFkZXIucGFydC5kYXRhKTsKIAkJfQogCQlicmVhazsKQEAgLTU3NSw3ICs2MjcsNyBAQAogCQlzdHJ1Y3Qgc25kX3NzdF9hbGxvY19yZXNwb25zZSAqcmVzcCA9CiAJCQkJKHN0cnVjdCBzbmRfc3N0X2FsbG9jX3Jlc3BvbnNlICopbXNnLT5tYWlsYm94OwogCQlpZiAocmVzcC0+c3RyX3R5cGUucmVzdWx0KQotCQkJcHJfZXJyKCJzc3Q6IGVycm9yIGFsbG9jIHN0cmVhbSA9ICV4XG4iLAorCQkJcHJfZXJyKCJlcnJvciBhbGxvYyBzdHJlYW0gPSAleFxuIiwKIAkJCQkgICAgICAgcmVzcC0+c3RyX3R5cGUucmVzdWx0KTsKIAkJc3N0X2FsbG9jX3N0cmVhbV9yZXNwb25zZShzdHJfaWQsIHJlc3ApOwogCQlicmVhazsKQEAgLTU4NCwyMSArNjM2LDIxIEBACiAJY2FzZSBJUENfSUFfUExBWV9GUkFNRVM6CiAJY2FzZSBJUENfSUFfQ0FQVF9GUkFNRVM6CiAJCWlmIChzc3RfdmFsaWRhdGVfc3RyaWQoc3RyX2lkKSkgewotCQkJcHJfZXJyKCJzc3Q6IHN0cmVhbSBpZCAlZCBpbnZhbGlkXG4iICwgc3RyX2lkKTsKKwkJCXByX2Vycigic3RyZWFtIGlkICVkIGludmFsaWRcbiIsIHN0cl9pZCk7CiAJCQlicmVhazsKIAkJfQotCQlwcl9kZWJ1Zygic3N0OiBBY2sgZm9yIHBsYXkvY2FwdCBmcmFtZXMgcmVjaXZlZFxuIik7CisJCXByX2RlYnVnKCJBY2sgZm9yIHBsYXkvY2FwdCBmcmFtZXMgcmVjZWl2ZWRcbiIpOwogCQlicmVhazsKIAogCWNhc2UgSVBDX0lBX1BSRVBfTElCX0ROTEQ6IHsKIAkJc3RydWN0IHNuZF9zc3Rfc3RyX3R5cGUgKnN0cl90eXBlID0KIAkJCShzdHJ1Y3Qgc25kX3NzdF9zdHJfdHlwZSAqKW1zZy0+bWFpbGJveDsKLQkJcHJfZGVidWcoInNzdDogUHJlcCBMaWIgZG93bmxvYWQgJXhcbiIsCisJCXByX2RlYnVnKCJQcmVwIExpYiBkb3dubG9hZCAleFxuIiwKIAkJCQltc2ctPmhlYWRlci5wYXJ0Lm1zZ19pZCk7CiAJCWlmIChzdHJfdHlwZS0+cmVzdWx0KQotCQkJcHJfZXJyKCJzc3Q6IFByZXAgbGliIGRvd25sb2FkICV4XG4iLCBzdHJfdHlwZS0+cmVzdWx0KTsKKwkJCXByX2VycigiUHJlcCBsaWIgZG93bmxvYWQgJXhcbiIsIHN0cl90eXBlLT5yZXN1bHQpOwogCQllbHNlCi0JCQlwcl9kZWJ1Zygic3N0OiBDYW4gZG93bmxvYWQgY29kZWMgbm93Li4uXG4iKTsKKwkJCXByX2RlYnVnKCJDYW4gZG93bmxvYWQgY29kZWMgbm93Li4uXG4iKTsKIAkJc3N0X3dha2VfdXBfYWxsb2NfYmxvY2soc3N0X2Rydl9jdHgsIHN0cl9pZCwKIAkJCQlzdHJfdHlwZS0+cmVzdWx0LCBOVUxMKTsKIAkJYnJlYWs7CkBAIC02MDksMTIgKzY2MSwxMiBAQAogCQkJKHN0cnVjdCBzbmRfc3N0X2xpYl9kb3dubG9hZF9pbmZvICopbXNnLT5tYWlsYm94OwogCQlpbnQgcmV0dmFsID0gcmVzcC0+cmVzdWx0OwogCi0JCXByX2RlYnVnKCJzc3Q6IExpYiBkb3dubG9hZGVkICV4XG4iLCBtc2ctPmhlYWRlci5wYXJ0Lm1zZ19pZCk7CisJCXByX2RlYnVnKCJMaWIgZG93bmxvYWRlZCAleFxuIiwgbXNnLT5oZWFkZXIucGFydC5tc2dfaWQpOwogCQlpZiAocmVzcC0+cmVzdWx0KSB7Ci0JCQlwcl9lcnIoInNzdDogZXJyIGluIGxpYiBkbG9hZCAleFxuIiwgcmVzcC0+cmVzdWx0KTsKKwkJCXByX2VycigiZXJyIGluIGxpYiBkbG9hZCAleFxuIiwgcmVzcC0+cmVzdWx0KTsKIAkJfSBlbHNlIHsKLQkJCXByX2RlYnVnKCJzc3Q6IENvZGVjIGRvd25sb2FkIGNvbXBsZXRlLi4uXG4iKTsKLQkJCXByX2RlYnVnKCJzc3Q6IGNvZGVjIFR5cGUgJWQgVmVyICVkIEJ1aWx0ICVzOiAlc1xuIiwKKwkJCXByX2RlYnVnKCJDb2RlYyBkb3dubG9hZCBjb21wbGV0ZS4uLlxuIik7CisJCQlwcl9kZWJ1ZygiY29kZWMgVHlwZSAlZCBWZXIgJWQgQnVpbHQgJXM6ICVzXG4iLAogCQkJCXJlc3AtPmRsb2FkX2xpYi5saWJfaW5mby5saWJfdHlwZSwKIAkJCQlyZXNwLT5kbG9hZF9saWIubGliX2luZm8ubGliX3ZlcnNpb24sCiAJCQkJcmVzcC0+ZGxvYWRfbGliLmxpYl9pbmZvLmJfZGF0ZSwKQEAgLTYzOSwxNyArNjkxLDE3IEBACiAJY2FzZSBJUENfSUFfR0VUX0ZXX0JVSUxEX0lORjogewogCQlzdHJ1Y3Qgc3N0X2Z3X2J1aWxkX2luZm8gKmJ1aWxkID0KIAkJCShzdHJ1Y3Qgc3N0X2Z3X2J1aWxkX2luZm8gKiltc2ctPm1haWxib3g7Ci0JCXByX2RlYnVnKCJzc3Q6IEJ1aWxkIGRhdGU6JXNUaW1lOiVzIiwgYnVpbGQtPmRhdGUsIGJ1aWxkLT50aW1lKTsKKwkJcHJfZGVidWcoIkJ1aWxkIGRhdGU6JXNUaW1lOiVzIiwgYnVpbGQtPmRhdGUsIGJ1aWxkLT50aW1lKTsKIAkJYnJlYWs7CiAJfQogCWNhc2UgSVBDX0lBX1NFVF9QTUlDX1RZUEU6CiAJCWJyZWFrOwogCWNhc2UgSVBDX0lBX1NUQVJUX1NUUkVBTToKLQkJcHJfZGVidWcoInNzdDogcmVwbHkgZm9yIFNUQVJUIFNUUkVBTSAleFxuIiwgbXNnLT5oZWFkZXIuZnVsbCk7CisJCXByX2RlYnVnKCJyZXBseSBmb3IgU1RBUlQgU1RSRUFNICV4XG4iLCBtc2ctPmhlYWRlci5mdWxsKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJLyogSWxsZWdhbCBjYXNlICovCi0JCXByX2Vycigic3N0OiBwcm9jZXNzIHJlcGx5OmRlZmF1bHQgPSAleFxuIiwgbXNnLT5oZWFkZXIuZnVsbCk7CisJCXByX2VycigicHJvY2VzcyByZXBseTpkZWZhdWx0ID0gJXhcbiIsIG1zZy0+aGVhZGVyLmZ1bGwpOwogCX0KIAlzc3RfY2xlYXJfaW50ZXJydXB0KCk7CiAJcmV0dXJuOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2ludGVsX3NzdC9pbnRlbF9zc3RfcHZ0LmMgYi9kcml2ZXJzL3N0YWdpbmcvaW50ZWxfc3N0L2ludGVsX3NzdF9wdnQuYwppbmRleCA2NDg3ZTE5Li4wMWY4YzNiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaW50ZWxfc3N0L2ludGVsX3NzdF9wdnQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaW50ZWxfc3N0L2ludGVsX3NzdF9wdnQuYwpAQCAtMjksNiArMjksOCBAQAogICogIFRoaXMgZmlsZSBjb250YWlucyBhbGwgcHJpdmF0ZSBmdW5jdGlvbnMKICAqLwogCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisKICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CkBAIC02MCw3ICs2Miw3IEBACiAJCX0KIAl9CiAJaWYgKGkgPT0gTUFYX0FDVElWRV9TVFJFQU0pIHsKLQkJcHJfZXJyKCJzc3Q6IG1heCBhbGxvY19zdHJlYW0gcmVhY2hlZCIpOworCQlwcl9lcnIoIm1heCBhbGxvY19zdHJlYW0gcmVhY2hlZFxuIik7CiAJCWkgPSAtRUJVU1k7IC8qIGFjdGl2ZSBzdHJlYW0gbGltaXQgcmVhY2hlZCAqLwogCX0KIAlyZXR1cm4gaTsKQEAgLTg0LDE0ICs4NiwxNCBAQAogCQkJCWJsb2NrLT5jb25kaXRpb24pKSB7CiAJCS8qIGV2ZW50IHdha2UgKi8KIAkJaWYgKGJsb2NrLT5yZXRfY29kZSA8IDApIHsKLQkJCXByX2Vycigic3N0OiBzdHJlYW0gZmFpbGVkICVkXG4iLCBibG9jay0+cmV0X2NvZGUpOworCQkJcHJfZXJyKCJzdHJlYW0gZmFpbGVkICVkXG4iLCBibG9jay0+cmV0X2NvZGUpOwogCQkJcmV0dmFsID0gLUVCVVNZOwogCQl9IGVsc2UgewotCQkJcHJfZGVidWcoInNzdDogZXZlbnQgdXBcbiIpOworCQkJcHJfZGVidWcoImV2ZW50IHVwXG4iKTsKIAkJCXJldHZhbCA9IDA7CiAJCX0KIAl9IGVsc2UgewotCQlwcl9lcnIoInNzdDogc2lnbmFsIGludGVycnVwdGVkXG4iKTsKKwkJcHJfZXJyKCJzaWduYWwgaW50ZXJydXB0ZWRcbiIpOwogCQlyZXR2YWwgPSAtRUlOVFI7CiAJfQogCXJldHVybiByZXR2YWw7CkBAIC0xMTUsMTggKzExNywxOCBAQAogewogCWludCByZXR2YWwgPSAwOwogCi0JcHJfZGVidWcoInNzdDogc3N0X3dhaXRfaW50ZXJydXB0aWJsZV90aW1lb3V0IC0gd2FpdGluZy4uLi5cbiIpOworCXByX2RlYnVnKCJzc3Rfd2FpdF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQgLSB3YWl0aW5nLi4uLlxuIik7CiAJaWYgKHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KHNzdF9kcnZfY3R4LT53YWl0X3F1ZXVlLAogCQkJCQkJYmxvY2stPmNvbmRpdGlvbiwKIAkJCQkJCW1zZWNzX3RvX2ppZmZpZXModGltZW91dCkpKSB7CiAJCWlmIChibG9jay0+cmV0X2NvZGUgPCAwKQotCQkJcHJfZXJyKCJzc3Q6IHN0cmVhbSBmYWlsZWQgJWRcbiIsIGJsb2NrLT5yZXRfY29kZSk7CisJCQlwcl9lcnIoInN0cmVhbSBmYWlsZWQgJWRcbiIsIGJsb2NrLT5yZXRfY29kZSk7CiAJCWVsc2UKLQkJCXByX2RlYnVnKCJzc3Q6IGV2ZW50IHVwXG4iKTsKKwkJCXByX2RlYnVnKCJldmVudCB1cFxuIik7CiAJCXJldHZhbCA9IGJsb2NrLT5yZXRfY29kZTsKIAl9IGVsc2UgewogCQlibG9jay0+b24gPSBmYWxzZTsKLQkJcHJfZXJyKCJzc3Q6IHRpbWVvdXQgb2NjdXJlZC4uLlxuIik7CisJCXByX2VycigidGltZW91dCBvY2N1cnJlZC4uLlxuIik7CiAJCS8qc2V0dGluZyBmaXJtd2FyZSBzdGF0ZSBhcyB1bmluaXQgc28gdGhhdCB0aGUKIAkJZmlybXdhcmUgd2lsbCBnZXQgcmUtZG93bmxvYWRlZCBvbiBuZXh0IHJlcXVlc3QKIAkJdGhpcyBpcyBiZWNhdXNlIGZpcm1hcmUgbm90IHJlc3BvbmRpbmcgZm9yIDUgc2VjCkBAIC0xNTYsMTggKzE1OCwxOCBAQAogCS8qIE5PVEU6CiAJT2JzZXJ2ZWQgdGhhdCBGVyBwcm9jZXNzZXMgdGhlIGFsbG9jIG1zZyBhbmQgcmVwbGllcyBldmVuCiAJYmVmb3JlIHRoZSBhbGxvYyB0aHJlYWQgaGFzIGZpbmlzaGVkIGV4ZWN1dGlvbiAqLwotCXByX2RlYnVnKCJzc3Q6IHdhaXRpbmcgZm9yICV4LCBjb25kaXRpb24gJXhcbiIsCisJcHJfZGVidWcoIndhaXRpbmcgZm9yICV4LCBjb25kaXRpb24gJXhcbiIsCiAJCSAgICAgICBibG9jay0+c3N0X2lkLCBibG9jay0+b3BzX2Jsb2NrLmNvbmRpdGlvbik7CiAJaWYgKHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KHNzdF9kcnZfY3R4LT53YWl0X3F1ZXVlLAogCQkJCWJsb2NrLT5vcHNfYmxvY2suY29uZGl0aW9uLAogCQkJCW1zZWNzX3RvX2ppZmZpZXMoU1NUX0JMT0NLX1RJTUVPVVQpKSkgewogCQkvKiBldmVudCB3YWtlICovCi0JCXByX2RlYnVnKCJzc3Q6IEV2ZW50IHdha2UgJXhcbiIsIGJsb2NrLT5vcHNfYmxvY2suY29uZGl0aW9uKTsKLQkJcHJfZGVidWcoInNzdDogbWVzc2FnZSByZXQ6ICVkXG4iLCBibG9jay0+b3BzX2Jsb2NrLnJldF9jb2RlKTsKKwkJcHJfZGVidWcoIkV2ZW50IHdha2UgJXhcbiIsIGJsb2NrLT5vcHNfYmxvY2suY29uZGl0aW9uKTsKKwkJcHJfZGVidWcoIm1lc3NhZ2UgcmV0OiAlZFxuIiwgYmxvY2stPm9wc19ibG9jay5yZXRfY29kZSk7CiAJCXJldHZhbCA9IGJsb2NrLT5vcHNfYmxvY2sucmV0X2NvZGU7CiAJfSBlbHNlIHsKIAkJYmxvY2stPm9wc19ibG9jay5vbiA9IGZhbHNlOwotCQlwcl9lcnIoInNzdDogV2FpdCB0aW1lZC1vdXQgJXhcbiIsIGJsb2NrLT5vcHNfYmxvY2suY29uZGl0aW9uKTsKKwkJcHJfZXJyKCJXYWl0IHRpbWVkLW91dCAleFxuIiwgYmxvY2stPm9wc19ibG9jay5jb25kaXRpb24pOwogCQkvKiBzZXR0aWduIGZpcm13YXJlIHN0YXRlIGFzIHVuaW5pdCBzbyB0aGF0IHRoZQogCQlmaXJtd2FyZSB3aWxsIGdldCByZWRvd25sb2FkZWQgb24gbmV4dCByZXF1ZXN0CiAJCXRoaXMgaXMgYmVjYXVzZSBmaXJtYXJlIG5vdCByZXNwb25kaW5nIGZvciA1IHNlYwpAQCAtMTkyLDE0ICsxOTQsMTQgQEAKIAogCW1zZyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBpcGNfcG9zdCksIEdGUF9BVE9NSUMpOwogCWlmICghbXNnKSB7Ci0JCXByX2Vycigic3N0OiBremFsbG9jIG1zZyBmYWlsZWRcbiIpOworCQlwcl9lcnIoImt6YWxsb2MgbXNnIGZhaWxlZFxuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAogCW1zZy0+bWFpbGJveF9kYXRhID0ga3phbGxvYyhTU1RfTUFJTEJPWF9TSVpFLCBHRlBfQVRPTUlDKTsKIAlpZiAoIW1zZy0+bWFpbGJveF9kYXRhKSB7CiAJCWtmcmVlKG1zZyk7Ci0JCXByX2Vycigic3N0OiBremFsbG9jIG1haWxib3hfZGF0YSBmYWlsZWQiKTsKKwkJcHJfZXJyKCJremFsbG9jIG1haWxib3hfZGF0YSBmYWlsZWQiKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfTsKIAkqYXJnID0gbXNnOwpAQCAtMjE5LDcgKzIyMSw3IEBACiAKIAltc2cgPSBremFsbG9jKHNpemVvZigqbXNnKSwgR0ZQX0FUT01JQyk7CiAJaWYgKCFtc2cpIHsKLQkJcHJfZXJyKCJzc3Q6IGt6YWxsb2MgbXNnIGZhaWxlZFxuIik7CisJCXByX2Vycigia3phbGxvYyBtc2cgZmFpbGVkXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCW1zZy0+bWFpbGJveF9kYXRhID0gTlVMTDsKQEAgLTI5MCwxMCArMjkyLDEwIEBACiAJc3RydWN0IGlwY19wb3N0ICptc2cgPSBOVUxMOwogCiAJaWYgKHNzdF9jcmVhdGVfc2hvcnRfbXNnKCZtc2cpKSB7Ci0JCXByX2Vycigic3N0OiBtZW0gYWxsb2NhdGlvbiBmYWlsZWRcbiIpOworCQlwcl9lcnIoIm1lbSBhbGxvY2F0aW9uIGZhaWxlZFxuIik7CiAJCQlyZXR1cm4gLUVOT01FTTsKIAl9Ci0JcHJfZGVidWcoInNzdDogaXBjIG1lc3NhZ2Ugc2VuZGluZzogRU5BQkxFX1JYX1RJTUVfU0xPVFxuIik7CisJcHJfZGVidWcoImlwYyBtZXNzYWdlIHNlbmRpbmc6IEVOQUJMRV9SWF9USU1FX1NMT1RcbiIpOwogCXNzdF9maWxsX2hlYWRlcigmbXNnLT5oZWFkZXIsIElQQ19JQV9FTkFCTEVfUlhfVElNRV9TTE9ULCAwLCAwKTsKIAltc2ctPmhlYWRlci5wYXJ0LmRhdGEgPSBzdGF0dXM7CiAJc3N0X2Rydl9jdHgtPmhzX2luZm9fYmxrLmNvbmRpdGlvbiA9IGZhbHNlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2ludGVsX3NzdC9pbnRlbF9zc3Rfc3RyZWFtLmMgYi9kcml2ZXJzL3N0YWdpbmcvaW50ZWxfc3N0L2ludGVsX3NzdF9zdHJlYW0uYwppbmRleCBiMmM0YjcwLi43OTVlNDJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaW50ZWxfc3N0L2ludGVsX3NzdF9zdHJlYW0uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaW50ZWxfc3N0L2ludGVsX3NzdF9zdHJlYW0uYwpAQCAtMjYsNiArMjYsOCBAQAogICogIFRoaXMgZmlsZSBjb250YWlucyB0aGUgc3RyZWFtIG9wZXJhdGlvbnMgb2YgU1NUIGRyaXZlcgogICovCiAKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKwogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KQEAgLTQ1LDggKzQ3LDggQEAKICAqLwogaW50IHNzdF9jaGVja19kZXZpY2VfdHlwZSh1MzIgZGV2aWNlLCB1MzIgbnVtX2NoYW4sIHUzMiAqcGNtX3Nsb3QpCiB7Ci0JaWYgKGRldmljZSA+PSBNQVhfTlVNX1NUUkVBTVMpIHsKLQkJcHJfZGVidWcoInNzdDogZGV2aWNlIHR5cGUgaW52YWxpZCAlZFxuIiwgZGV2aWNlKTsKKwlpZiAoZGV2aWNlID4gTUFYX05VTV9TVFJFQU1TX01GTEQpIHsKKwkJcHJfZGVidWcoImRldmljZSB0eXBlIGludmFsaWQgJWRcbiIsIGRldmljZSk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAlpZiAoc3N0X2Rydl9jdHgtPnN0cmVhbXNbZGV2aWNlXS5zdGF0dXMgPT0gU1RSRUFNX1VOX0lOSVQpIHsKQEAgLTcxLDE1ICs3MywxNSBAQAogCQllbHNlIGlmIChkZXZpY2UgPT0gU05EX1NTVF9ERVZJQ0VfQ0FQVFVSRSAmJiBudW1fY2hhbiA9PSA0KQogCQkJKnBjbV9zbG90ID0gMHgwRjsKIAkJZWxzZSB7Ci0JCQlwcl9kZWJ1Zygic3N0OiBObyBjb25kaXRpb24gc2F0aXNmaWVkLi4gcmV0IGVyclxuIik7CisJCQlwcl9kZWJ1ZygiTm8gY29uZGl0aW9uIHNhdGlzZmllZC4uIHJldCBlcnJcbiIpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIAl9IGVsc2UgewotCQlwcl9kZWJ1Zygic3N0OiB0aGlzIHN0cmVhbSBzdGF0ZSBpcyBub3QgdW5pLWluaXQsIGlzICVkXG4iLAorCQlwcl9kZWJ1ZygidGhpcyBzdHJlYW0gc3RhdGUgaXMgbm90IHVuaS1pbml0LCBpcyAlZFxuIiwKIAkJCQlzc3RfZHJ2X2N0eC0+c3RyZWFtc1tkZXZpY2VdLnN0YXR1cyk7CiAJCXJldHVybiAtRUJBRFJRQzsKIAl9Ci0JcHJfZGVidWcoInNzdDogcmV0dXJuaW5nIHNsb3QgJXhcbiIsICpwY21fc2xvdCk7CisJcHJfZGVidWcoInJldHVybmluZyBzbG90ICV4XG4iLCAqcGNtX3Nsb3QpOwogCXJldHVybiAwOwogfQogLyoqCkBAIC05Niw3ICs5OCw3IEBACiAJCWlmIChzc3RfZHJ2X2N0eC0+c3RyZWFtc1tpXS5zdGF0dXMgPT0gU1RSRUFNX1VOX0lOSVQpCiAJCQlyZXR1cm4gaTsKIAl9Ci0JcHJfZGVidWcoInNzdDogRGlkbnQgZmluZCBlbXB0eSBzdHJlYW0gZm9yIG1yc3RcbiIpOworCXByX2RlYnVnKCJEaWRudCBmaW5kIGVtcHR5IHN0cmVhbSBmb3IgbXJzdFxuIik7CiAJcmV0dXJuIC1FQlVTWTsKIH0KIApAQCAtMzA1LDcgKzMwNyw3IEBACiAJCWlmIChzdHJfaW5mby0+cHJldiA9PSBTVFJFQU1fVU5fSU5JVCkKIAkJCXJldHVybiAtRUJBRFJRQzsKIAkJaWYgKHN0cl9pbmZvLT5jdHJsX2Jsay5vbiA9PSB0cnVlKSB7Ci0JCQlwcl9lcnIoIlNTVCBFUlI6IGNvbnRyb2wgcGF0aCBpcyBpbiB1c2VcbiAiKTsKKwkJCXByX2VycigiU1NUIEVSUjogY29udHJvbCBwYXRoIGlzIGluIHVzZVxuIik7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCQlpZiAoc3N0X2NyZWF0ZV9zaG9ydF9tc2coJm1zZykpCkBAIC0zMzMsNyArMzM1LDcgQEAKIAkJfQogCX0gZWxzZSB7CiAJCXJldHZhbCA9IC1FQkFEUlFDOwotCQlwcl9lcnIoIlNTVCBFUlI6QkFEUVJDIGZvciBzdHJlYW1cbiAiKTsKKwkJcHJfZXJyKCJTU1QgRVJSOiBCQURRUkMgZm9yIHN0cmVhbVxuIik7CiAJfQogCiAJcmV0dXJuIHJldHZhbDsKQEAgLTQ2OCw3ICs0NzAsNyBAQAogCQl9CiAJfSBlbHNlIHsKIAkJcmV0dmFsID0gLUVCQURSUUM7Ci0JCXByX2VycigiU1NUIEVSUjpCQURRUkMgZm9yIHN0cmVhbVxuIik7CisJCXByX2VycigiU1NUIEVSUjogQkFEUVJDIGZvciBzdHJlYW1cbiIpOwogCX0KIAlyZXR1cm4gcmV0dmFsOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2ludGVsX3NzdC9pbnRlbF9zc3Rfc3RyZWFtX2VuY29kZWQuYyBiL2RyaXZlcnMvc3RhZ2luZy9pbnRlbF9zc3QvaW50ZWxfc3N0X3N0cmVhbV9lbmNvZGVkLmMKaW5kZXggNWM0NTU2MC4uODU3ODliYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2ludGVsX3NzdC9pbnRlbF9zc3Rfc3RyZWFtX2VuY29kZWQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaW50ZWxfc3N0L2ludGVsX3NzdF9zdHJlYW1fZW5jb2RlZC5jCkBAIC0yNiwxMyArMjYsMTUgQEAKICAqICBUaGlzIGZpbGUgY29udGFpbnMgdGhlIHN0cmVhbSBvcGVyYXRpb25zIG9mIFNTVCBkcml2ZXIKICAqLwogCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisKICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9zeXNjYWxscy5oPgogI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC9yYXJfcmVnaXN0ZXIuaD4KICNpZmRlZiBDT05GSUdfTVJTVF9SQVJfSEFORExFUgotI2luY2x1ZGUgIi4uLy4uLy4uL2RyaXZlcnMvc3RhZ2luZy9tZW1yYXIvbWVtcmFyLmgiCisjaW5jbHVkZSA8bGludXgvcmFyX3JlZ2lzdGVyLmg+CisjaW5jbHVkZSAiLi4vbWVtcmFyL21lbXJhci5oIgogI2VuZGlmCiAjaW5jbHVkZSAiaW50ZWxfc3N0X2lvY3RsLmgiCiAjaW5jbHVkZSAiaW50ZWxfc3N0LmgiCkBAIC01Myw3ICs1NSw3IEBACiAJc3RydWN0IHN0cmVhbV9pbmZvICpzdHJfaW5mbzsKIAlzdHJ1Y3Qgc25kX3NzdF9md19nZXRfc3RyZWFtX3BhcmFtcyAqZndfcGFyYW1zOwogCi0JcHJfZGVidWcoInNzdDogZ2V0X3N0cmVhbSBmb3IgJWRcbiIsIHN0cl9pZCk7CisJcHJfZGVidWcoImdldF9zdHJlYW0gZm9yICVkXG4iLCBzdHJfaWQpOwogCXJldHZhbCA9IHNzdF92YWxpZGF0ZV9zdHJpZChzdHJfaWQpOwogCWlmIChyZXR2YWwpCiAJCXJldHVybiByZXR2YWw7CkBAIC02MSwxNiArNjMsMTYgQEAKIAlzdHJfaW5mbyA9ICZzc3RfZHJ2X2N0eC0+c3RyZWFtc1tzdHJfaWRdOwogCWlmIChzdHJfaW5mby0+c3RhdHVzICE9IFNUUkVBTV9VTl9JTklUKSB7CiAJCWlmIChzdHJfaW5mby0+Y3RybF9ibGsub24gPT0gdHJ1ZSkgewotCQkJcHJfZXJyKCJzc3Q6IGNvbnRyb2wgcGF0aCBpbiB1c2VcbiIpOworCQkJcHJfZXJyKCJjb250cm9sIHBhdGggaW4gdXNlXG4iKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAJCWlmIChzc3RfY3JlYXRlX3Nob3J0X21zZygmbXNnKSkgewotCQkJcHJfZXJyKCJzc3Q6IG1lc3NhZ2UgY3JlYXRpb24gZmFpbGVkXG4iKTsKKwkJCXByX2VycigibWVzc2FnZSBjcmVhdGlvbiBmYWlsZWRcbiIpOwogCQkJcmV0dXJuIC1FTk9NRU07CiAJCX0KIAkJZndfcGFyYW1zID0ga3phbGxvYyhzaXplb2YoKmZ3X3BhcmFtcyksIEdGUF9BVE9NSUMpOwogCQlpZiAoIWZ3X3BhcmFtcykgewotCQkJcHJfZXJyKCJzc3Q6IG1lbSBhbGxjb2F0aW9uIGZhaWxlZFxuICIpOworCQkJcHJfZXJyKCJtZW0gYWxsb2NhdGlvbiBmYWlsZWRcbiIpOwogCQkJa2ZyZWUobXNnKTsKIAkJCXJldHVybiAtRU5PTUVNOwogCQl9CkBAIC0xMDQsNyArMTA2LDcgQEAKIAkJZ2V0X3BhcmFtcy0+Y29kZWNfcGFyYW1zLnN0cmVhbV90eXBlID0gc3RyX2luZm8tPnN0cl90eXBlOwogCQlrZnJlZShmd19wYXJhbXMpOwogCX0gZWxzZSB7Ci0JCXByX2RlYnVnKCJzc3Q6IFN0cmVhbSBpcyBub3QgaW4gdGhlIGluaXQgc3RhdGVcbiIpOworCQlwcl9kZWJ1ZygiU3RyZWFtIGlzIG5vdCBpbiB0aGUgaW5pdCBzdGF0ZVxuIik7CiAJfQogCXJldHVybiByZXR2YWw7CiB9CkBAIC0xMjUsMTcgKzEyNywxNyBAQAogCiAJQlVHX09OKCFzdHJfcGFyYW0pOwogCWlmIChzc3RfZHJ2X2N0eC0+c3RyZWFtc1tzdHJfaWRdLm9wcyAhPSBzdHJfcGFyYW0tPm9wcykgewotCQlwcl9lcnIoInNzdDogSW52YWxpZCBvcGVyYXRpb25cbiIpOworCQlwcl9lcnIoIkludmFsaWQgb3BlcmF0aW9uXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCXJldHZhbCA9IHNzdF92YWxpZGF0ZV9zdHJpZChzdHJfaWQpOwogCWlmIChyZXR2YWwpCiAJCXJldHVybiByZXR2YWw7Ci0JcHJfZGVidWcoInNzdDogc2V0X3N0cmVhbSBmb3IgJWRcbiIsIHN0cl9pZCk7CisJcHJfZGVidWcoInNldF9zdHJlYW0gZm9yICVkXG4iLCBzdHJfaWQpOwogCXN0cl9pbmZvID0gICZzc3RfZHJ2X2N0eC0+c3RyZWFtc1tzdHJfaWRdOwogCWlmIChzc3RfZHJ2X2N0eC0+c3RyZWFtc1tzdHJfaWRdLnN0YXR1cyA9PSBTVFJFQU1fSU5JVCkgewogCQlpZiAoc3RyX2luZm8tPmN0cmxfYmxrLm9uID09IHRydWUpIHsKLQkJCXByX2Vycigic3N0OiBjb250cm9sIHBhdGggaW4gdXNlXG4iKTsKKwkJCXByX2VycigiY29udHJvbCBwYXRoIGluIHVzZVxuIik7CiAJCQlyZXR1cm4gLUVBR0FJTjsKIAkJfQogCQlpZiAoc3N0X2NyZWF0ZV9sYXJnZV9tc2coJm1zZykpCkBAIC0xNjMsNyArMTY1LDcgQEAKIAkJfQogCX0gZWxzZSB7CiAJCXJldHZhbCA9IC1FQkFEUlFDOwotCQlwcl9lcnIoInNzdDogQkFEUVJDIGZvciBzdHJlYW1cbiIpOworCQlwcl9lcnIoIkJBRFFSQyBmb3Igc3RyZWFtXG4iKTsKIAl9CiAJcmV0dXJuIHJldHZhbDsKIH0KQEAgLTE4Myw3ICsxODUsNyBAQAogCXN0cnVjdCBzbmRfc3N0X3ZvbCAqZndfZ2V0X3ZvbDsKIAlpbnQgc3RyX2lkID0gZ2V0X3ZvbC0+c3RyZWFtX2lkOwogCi0JcHJfZGVidWcoInNzdDogZ2V0IHZvbCBjYWxsZWRcbiIpOworCXByX2RlYnVnKCJnZXQgdm9sIGNhbGxlZFxuIik7CiAKIAlpZiAoc3N0X2NyZWF0ZV9zaG9ydF9tc2coJm1zZykpCiAJCXJldHVybiAtRU5PTUVNOwpAQCAtMTk1LDcgKzE5Nyw3IEBACiAJc3N0X2Rydl9jdHgtPnZvbF9pbmZvX2Jsay5vbiA9IHRydWU7CiAJZndfZ2V0X3ZvbCA9IGt6YWxsb2Moc2l6ZW9mKCpmd19nZXRfdm9sKSwgR0ZQX0FUT01JQyk7CiAJaWYgKCFmd19nZXRfdm9sKSB7Ci0JCXByX2Vycigic3N0OiBtZW0gYWxsb2NhdGlvbiBmYWlsZWRcbiIpOworCQlwcl9lcnIoIm1lbSBhbGxvY2F0aW9uIGZhaWxlZFxuIik7CiAJCWtmcmVlKG1zZyk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KQEAgLTIwOSwxMCArMjExLDEwIEBACiAJaWYgKHJldHZhbCkKIAkJcmV0dmFsID0gLUVJTzsKIAllbHNlIHsKLQkJcHJfZGVidWcoInNzdDogc3RyZWFtIGlkICVkXG4iLCBmd19nZXRfdm9sLT5zdHJlYW1faWQpOwotCQlwcl9kZWJ1Zygic3N0OiB2b2x1bWUgJWRcbiIsIGZ3X2dldF92b2wtPnZvbHVtZSk7Ci0JCXByX2RlYnVnKCJzc3Q6IHJhbXAgZHVyYXRpb24gJWRcbiIsIGZ3X2dldF92b2wtPnJhbXBfZHVyYXRpb24pOwotCQlwcl9kZWJ1Zygic3N0OiByYW1wX3R5cGUgJWRcbiIsIGZ3X2dldF92b2wtPnJhbXBfdHlwZSk7CisJCXByX2RlYnVnKCJzdHJlYW0gaWQgJWRcbiIsIGZ3X2dldF92b2wtPnN0cmVhbV9pZCk7CisJCXByX2RlYnVnKCJ2b2x1bWUgJWRcbiIsIGZ3X2dldF92b2wtPnZvbHVtZSk7CisJCXByX2RlYnVnKCJyYW1wIGR1cmF0aW9uICVkXG4iLCBmd19nZXRfdm9sLT5yYW1wX2R1cmF0aW9uKTsKKwkJcHJfZGVidWcoInJhbXBfdHlwZSAlZFxuIiwgZndfZ2V0X3ZvbC0+cmFtcF90eXBlKTsKIAkJbWVtY3B5KGdldF92b2wsIGZ3X2dldF92b2wsIHNpemVvZigqZndfZ2V0X3ZvbCkpOwogCX0KIAlyZXR1cm4gcmV0dmFsOwpAQCAtMjMxLDEwICsyMzMsMTAgQEAKIAlpbnQgcmV0dmFsID0gMDsKIAlzdHJ1Y3QgaXBjX3Bvc3QgKm1zZyA9IE5VTEw7CiAKLQlwcl9kZWJ1Zygic3N0OiBzZXQgdm9sIGNhbGxlZFxuIik7CisJcHJfZGVidWcoInNldCB2b2wgY2FsbGVkXG4iKTsKIAogCWlmIChzc3RfY3JlYXRlX2xhcmdlX21zZygmbXNnKSkgewotCQlwcl9lcnIoInNzdDogbWVzc2FnZSBjcmVhdGlvbiBmYWlsZWRcbiIpOworCQlwcl9lcnIoIm1lc3NhZ2UgY3JlYXRpb24gZmFpbGVkXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCXNzdF9maWxsX2hlYWRlcigmbXNnLT5oZWFkZXIsIElQQ19JQV9TRVRfU1RSRUFNX1ZPTCwgMSwKQEAgLTI1NCw3ICsyNTYsNyBAQAogCXJldHZhbCA9IHNzdF93YWl0X2ludGVycnVwdGlibGVfdGltZW91dChzc3RfZHJ2X2N0eCwKIAkJCSZzc3RfZHJ2X2N0eC0+dm9sX2luZm9fYmxrLCBTU1RfQkxPQ0tfVElNRU9VVCk7CiAJaWYgKHJldHZhbCkgewotCQlwcl9lcnIoInNzdDogZXJyb3IgaW4gc2V0X3ZvbCA9ICVkXG4iLCByZXR2YWwpOworCQlwcl9lcnIoImVycm9yIGluIHNldF92b2wgPSAlZFxuIiwgcmV0dmFsKTsKIAkJcmV0dmFsID0gLUVJTzsKIAl9CiAJcmV0dXJuIHJldHZhbDsKQEAgLTI3MywxMCArMjc1LDEwIEBACiAJaW50IHJldHZhbCA9IDA7CiAJc3RydWN0IGlwY19wb3N0ICptc2cgPSBOVUxMOwogCi0JcHJfZGVidWcoInNzdDogc2V0IG11dGUgY2FsbGVkXG4iKTsKKwlwcl9kZWJ1Zygic2V0IG11dGUgY2FsbGVkXG4iKTsKIAogCWlmIChzc3RfY3JlYXRlX2xhcmdlX21zZygmbXNnKSkgewotCQlwcl9lcnIoInNzdDogbWVzc2FnZSBjcmVhdGlvbiBmYWlsZWRcbiIpOworCQlwcl9lcnIoIm1lc3NhZ2UgY3JlYXRpb24gZmFpbGVkXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCXNzdF9maWxsX2hlYWRlcigmbXNnLT5oZWFkZXIsIElQQ19JQV9TRVRfU1RSRUFNX01VVEUsIDEsCkBAIC0yOTcsNyArMjk5LDcgQEAKIAlyZXR2YWwgPSBzc3Rfd2FpdF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoc3N0X2Rydl9jdHgsCiAJCQkmc3N0X2Rydl9jdHgtPm11dGVfaW5mb19ibGssIFNTVF9CTE9DS19USU1FT1VUKTsKIAlpZiAocmV0dmFsKSB7Ci0JCXByX2Vycigic3N0OiBlcnJvciBpbiBzZXRfbXV0ZSA9ICVkXG4iLCByZXR2YWwpOworCQlwcl9lcnIoImVycm9yIGluIHNldF9tdXRlID0gJWRcbiIsIHJldHZhbCk7CiAJCXJldHZhbCA9IC1FSU87CiAJfQogCXJldHVybiByZXR2YWw7CkBAIC0zNTgsMjAgKzM2MCwyMCBAQAogCQlzbG90LT5kZXZpY2VfdHlwZSA9PSBTTkRfU1NUX0RFVklDRV9QQ00pIHsKIAkJCXJldHZhbCA9IHNzdF9hY3RpdmF0ZV90YXJnZXQoc2xvdCk7CiAJCQlpZiAocmV0dmFsKQotCQkJCXByX2Vycigic3N0OiBTU1RfQWN0aXZhdGVfdGFyZ2V0X2ZhaWxcbiIpOworCQkJCXByX2VycigiU1NUX0FjdGl2YXRlX3RhcmdldF9mYWlsXG4iKTsKIAkJCWVsc2UKLQkJCQlwcl9lcnIoInNzdDogU1NUX0FjdGl2YXRlX3RhcmdldF9wYXNzXG4iKTsKKwkJCQlwcl9lcnIoIlNTVF9BY3RpdmF0ZV90YXJnZXRfcGFzc1xuIik7CiAJCXJldHVybiByZXR2YWw7CiAJfSBlbHNlIGlmIChzbG90LT5hY3Rpb24gPT0gU05EX1NTVF9QT1JUX1BSRVBBUkUgJiYKIAkJCXNsb3QtPmRldmljZV90eXBlID09IFNORF9TU1RfREVWSUNFX1BDTSkgewogCQkJCXJldHZhbCA9IHNzdF9wcmVwYXJlX3RhcmdldChzbG90KTsKIAkJCWlmIChyZXR2YWwpCi0JCQkJcHJfZXJyKCJzc3Q6IFNTVF9wcmVwYXJlX3RhcmdldF9mYWlsXG4iKTsKKwkJCQlwcl9lcnIoIlNTVF9wcmVwYXJlX3RhcmdldF9mYWlsXG4iKTsKIAkJCWVsc2UKLQkJCQlwcl9lcnIoInNzdDogU1NUX3ByZXBhcmVfdGFyZ2V0X3Bhc3NcbiIpOworCQkJCXByX2VycigiU1NUX3ByZXBhcmVfdGFyZ2V0X3Bhc3NcbiIpOwogCQkJcmV0dXJuIHJldHZhbDsKIAl9IGVsc2UgewotCQlwcl9lcnIoInNzdDogc2xvdF9hY3Rpb24gOiAlZCwgZGV2aWNlX3R5cGU6ICVkXG4iLAorCQlwcl9lcnIoInNsb3RfYWN0aW9uIDogJWQsIGRldmljZV90eXBlOiAlZFxuIiwKIAkJCQlzbG90LT5hY3Rpb24sIHNsb3QtPmRldmljZV90eXBlKTsKIAkJcmV0dXJuIHJldHZhbDsKIAl9CkBAIC0zODMsNyArMzg1LDcgQEAKIAlzdHJ1Y3QgaXBjX3Bvc3QgKm1zZzsKIAogCWlmIChzc3RfY3JlYXRlX2xhcmdlX21zZygmbXNnKSkgewotCQlwcl9lcnIoInNzdDogbWVzc2FnZSBjcmVhdGlvbiBmYWlsZWRcbiIpOworCQlwcl9lcnIoIm1lc3NhZ2UgY3JlYXRpb24gZmFpbGVkXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCXNzdF9maWxsX2hlYWRlcigmbXNnLT5oZWFkZXIsIElQQ19JQV9UQVJHRVRfREVWX1NFTEVDVCwgMSwgMCk7CkBAIC0zOTksMTEgKzQwMSwxMSBAQAogCWxpc3RfYWRkX3RhaWwoJm1zZy0+bm9kZSwgJnNzdF9kcnZfY3R4LT5pcGNfZGlzcGF0Y2hfbGlzdCk7CiAJc3Bpbl91bmxvY2soJnNzdF9kcnZfY3R4LT5saXN0X3NwaW5fbG9jayk7CiAJc3N0X3Bvc3RfbWVzc2FnZSgmc3N0X2Rydl9jdHgtPmlwY19wb3N0X21zZ193cSk7Ci0JcHJfZGVidWcoInNzdDogbWVzc2FnZSBzZW50LSB3YWl0aW5nXG4iKTsKKwlwcl9kZWJ1ZygibWVzc2FnZSBzZW50LSB3YWl0aW5nXG4iKTsKIAlyZXR2YWwgPSBzc3Rfd2FpdF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoc3N0X2Rydl9jdHgsCiAJCQkmc3N0X2Rydl9jdHgtPnRndF9kZXZfYmxrLCBUQVJHRVRfREVWX0JMT0NLX1RJTUVPVVQpOwogCWlmIChyZXR2YWwpCi0JCXByX2Vycigic3N0OiB0YXJnZXQgZGV2aWNlIGlwYyBmYWlsZWQgPSAweCV4XG4iLCByZXR2YWwpOworCQlwcl9lcnIoInRhcmdldCBkZXZpY2UgaXBjIGZhaWxlZCA9IDB4JXhcbiIsIHJldHZhbCk7CiAJcmV0dXJuIHJldHZhbDsKIAogfQpAQCAtNDM5LDcgKzQ0MSw3IEBACiAJCQkJCWdvdG8gZXJyOwogCQkJfSBlbHNlIHsKIGVycjoKLQkJCQlwcl9lcnIoInNzdDogaS9wIHBhcmFtcyBpbmNvcnJlY3RcbiIpOworCQkJCXByX2VycigiaS9wIHBhcmFtcyBpbmNvcnJlY3RcbiIpOwogCQkJCXJldHVybiAtRUlOVkFMOwogCQkJfQogCQl9CkBAIC00NjAsMTUgKzQ2MiwxNSBAQAogewogCWludCByZXR2YWwsIGksIHByZXBhcmVfY291bnQgPSAwOwogCi0JcHJfZGVidWcoInNzdDogVGFyZ2V0IERldmljZSBTZWxlY3RcbiIpOworCXByX2RlYnVnKCJUYXJnZXQgRGV2aWNlIFNlbGVjdFxuIik7CiAKIAlpZiAodGFyZ2V0LT5kZXZpY2Vfcm91dGUgPCAwIHx8IHRhcmdldC0+ZGV2aWNlX3JvdXRlID4gMikgewotCQlwcl9lcnIoInNzdDogZGV2aWNlIHJvdXRlIGlzIGludmFsaWRcbiIpOworCQlwcl9lcnIoImRldmljZSByb3V0ZSBpcyBpbnZhbGlkXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJaWYgKHRhcmdldC0+ZGV2aWNlX3JvdXRlICE9IDApIHsKLQkJcHJfZXJyKCJzc3Q6IFVuc3VwcG9ydGVkIGNvbmZpZ1xuIik7CisJCXByX2VycigiVW5zdXBwb3J0ZWQgY29uZmlnXG4iKTsKIAkJcmV0dXJuIC1FSU87CiAJfQogCXJldHZhbCA9IHNzdF90YXJnZXRfZGV2aWNlX3ZhbGlkYXRlKHRhcmdldCk7CkBAIC00ODAsMTggKzQ4MiwxOCBAQAogCQlyZXR1cm4gcmV0dmFsOwogCWZvciAoaSA9IDA7IGkgPCBTU1RfTUFYX1RBUkdFVF9ERVZJQ0VTOyBpKyspIHsKIAkJaWYgKHRhcmdldC0+ZGV2aWNlc1tpXS5hY3Rpb24gPT0gU05EX1NTVF9QT1JUX0FDVElWQVRFKSB7Ci0JCQlwcl9kZWJ1Zygic3N0OiBhY3RpdmF0ZSBjYWxsZWQgaW4gJWRcbiIsIGkpOworCQkJcHJfZGVidWcoImFjdGl2YXRlIGNhbGxlZCBpbiAlZFxuIiwgaSk7CiAJCQlyZXR2YWwgPSBzc3RfcGFyc2VfdGFyZ2V0KCZ0YXJnZXQtPmRldmljZXNbaV0pOwogCQkJaWYgKHJldHZhbCkKIAkJCQlyZXR1cm4gcmV0dmFsOwogCQl9IGVsc2UgaWYgKHRhcmdldC0+ZGV2aWNlc1tpXS5hY3Rpb24gPT0gU05EX1NTVF9QT1JUX1BSRVBBUkUpIHsKLQkJCXByX2RlYnVnKCJzc3Q6IFBSRVBBUkUgaW4gJWQsIEZvcndhZGluZ1xuIiwgaSk7CisJCQlwcl9kZWJ1ZygiUFJFUEFSRSBpbiAlZCwgRm9yd2FyZGluZ1xuIiwgaSk7CiAJCQlyZXR2YWwgPSBzc3RfcGFyc2VfdGFyZ2V0KCZ0YXJnZXQtPmRldmljZXNbaV0pOwogCQkJaWYgKHJldHZhbCkgewotCQkJCXByX2Vycigic3N0OiBQYXJzZSBUYXJnZXQgZmFpbCAlZCIsIHJldHZhbCk7CisJCQkJcHJfZXJyKCJQYXJzZSBUYXJnZXQgZmFpbCAlZFxuIiwgcmV0dmFsKTsKIAkJCQlyZXR1cm4gcmV0dmFsOwogCQkJfQotCQkJcHJfZGVidWcoInNzdDogUGFyc2UgVGFyZ2V0IHN1Y2Nlc3NmdWwgJWQiLCByZXR2YWwpOworCQkJcHJfZGVidWcoIlBhcnNlIFRhcmdldCBzdWNjZXNzZnVsICVkXG4iLCByZXR2YWwpOwogCQkJaWYgKHRhcmdldC0+ZGV2aWNlc1tpXS5kZXZpY2VfdHlwZSA9PQogCQkJCQkJU05EX1NTVF9ERVZJQ0VfUENNKQogCQkJCXByZXBhcmVfY291bnQrKzsKQEAgLTUxMiwxMSArNTE0LDExIEBACiAJcmFyX3N0YXR1cyA9IHJhcl9oYW5kbGVfdG9fYnVzKGJ1ZmZlcnMsIGNvdW50KTsKIAogCWlmIChjb3VudCAhPSByYXJfc3RhdHVzKSB7Ci0JCXByX2Vycigic3N0OiBUaGUgcmFyIENBTEwgRmFpbGVkIik7CisJCXByX2VycigiVGhlIHJhciBDQUxMIEZhaWxlZCIpOwogCQlyZXR2YWwgPSAtRUlPOwogCX0KIAlpZiAoYnVmZmVycy0+aW5mby50eXBlICE9IFJBUl9UWVBFX0FVRElPKSB7Ci0JCXByX2Vycigic3N0OiBJbnZhbGlkIFJBUiB0eXBlXG4iKTsKKwkJcHJfZXJyKCJJbnZhbGlkIFJBUiB0eXBlXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCXJldHVybiByZXR2YWw7CkBAIC01MzksMTAgKzU0MSwxMCBAQAogCQlpZiAoa2J1ZnMtPmluX3VzZSA9PSBmYWxzZSkgewogI2lmZGVmIENPTkZJR19NUlNUX1JBUl9IQU5ETEVSCiAJCQlpZiAoc3RyZWFtLT5vcHMgPT0gU1RSRUFNX09QU19QTEFZQkFDS19EUk0pIHsKLQkJCQlwcl9kZWJ1Zygic3N0OiBEUk0gcGxheWJhY2sgaGFuZGxpbmdcbiIpOworCQkJCXByX2RlYnVnKCJEUk0gcGxheWJhY2sgaGFuZGxpbmdcbiIpOwogCQkJCXJhcl9idWZmZXJzLmluZm8uaGFuZGxlID0gKF9fdTMyKWtidWZzLT5hZGRyOwogCQkJCXJhcl9idWZmZXJzLmluZm8uc2l6ZSA9IGtidWZzLT5zaXplOwotCQkJCXByX2RlYnVnKCJzc3Q6IHJhciBoYW5kbGUgMHgleCBzaXplPTB4JXgiLAorCQkJCXByX2RlYnVnKCJyYXIgaGFuZGxlIDB4JXggc2l6ZT0weCV4XG4iLAogCQkJCQlyYXJfYnVmZmVycy5pbmZvLmhhbmRsZSwKIAkJCQkJcmFyX2J1ZmZlcnMuaW5mby5zaXplKTsKIAkJCQlyZXR2YWwgPSAgc3N0X2dldF9SQVIoJnJhcl9idWZmZXJzLCAxKTsKQEAgLTU1Miw3ICs1NTQsNyBAQAogCQkJCXNnX2xpc3QtPmFkZHJbaV0uYWRkciA9IHJhcl9idWZmZXJzLmJ1c19hZGRyZXNzOwogCQkJCS8qIHJhcl9idWZmZXJzLmluZm8uc2l6ZTsgKi8KIAkJCQlzZ19saXN0LT5hZGRyW2ldLnNpemUgPSAoX191MzIpa2J1ZnMtPnNpemU7Ci0JCQkJcHJfZGVidWcoInNzdDogcGh5YWRkclslZF0gMHgleCBTaXplOjB4JXhcbiIKKwkJCQlwcl9kZWJ1ZygicGh5YWRkclslZF0gMHgleCBTaXplOjB4JXhcbiIKIAkJCQkJLCBpLCBzZ19saXN0LT5hZGRyW2ldLmFkZHIsCiAJCQkJCXNnX2xpc3QtPmFkZHJbaV0uc2l6ZSk7CiAJCQl9CkBAIC01NjIsNyArNTY0LDcgQEAKIAkJCQkJdmlydF90b19waHlzKCh2b2lkICopCiAJCQkJCQlrYnVmcy0+YWRkciArIGtidWZzLT5vZmZzZXQpOwogCQkJCXNnX2xpc3QtPmFkZHJbaV0uc2l6ZSA9IGtidWZzLT5zaXplOwotCQkJCXByX2RlYnVnKCJzc3Q6IHBoeWFkZHJbJWRdOjB4JXggU2l6ZToweCV4XG4iCisJCQkJcHJfZGVidWcoInBoeWFkZHJbJWRdOjB4JXggU2l6ZToweCV4XG4iCiAJCQkJLCBpICwgc2dfbGlzdC0+YWRkcltpXS5hZGRyLCBrYnVmcy0+c2l6ZSk7CiAJCQl9CiAJCQlzdHJlYW0tPmN1cnJfYnl0ZXMgKz0gc2dfbGlzdC0+YWRkcltpXS5zaXplOwpAQCAtNTc0LDcgKzU3Niw3IEBACiAJfQogCiAJc2dfbGlzdC0+bnVtX2VudHJpZXMgPSBpOwotCXByX2RlYnVnKCJzc3Q6c2cgbGlzdCBlbnRyaWVzID0gJWRcbiIsIHNnX2xpc3QtPm51bV9lbnRyaWVzKTsKKwlwcl9kZWJ1Zygic2cgbGlzdCBlbnRyaWVzID0gJWRcbiIsIHNnX2xpc3QtPm51bV9lbnRyaWVzKTsKIAlyZXR1cm4gaTsKIH0KIApAQCAtNTk1LDcgKzU5Nyw3IEBACiAJc3RydWN0IHNzdF9zdHJlYW1fYnVmcyAqa2J1ZnMgPSBOVUxMLCAqX2tidWZzOwogCXN0cnVjdCBzdHJlYW1faW5mbyAqc3RyZWFtOwogCi0JcHJfZGVidWcoInNzdDogcGxheSBmcmFtZSBmb3IgJWRcbiIsIHN0cl9pZCk7CisJcHJfZGVidWcoInBsYXkgZnJhbWUgZm9yICVkXG4iLCBzdHJfaWQpOwogCXJldHZhbCA9IHNzdF92YWxpZGF0ZV9zdHJpZChzdHJfaWQpOwogCWlmIChyZXR2YWwpCiAJCXJldHVybiByZXR2YWw7CkBAIC02MTUsMTQgKzYxNywxNCBAQAogCXN0cmVhbS0+Y3Vycl9ieXRlcyA9IDA7CiAJaWYgKGxpc3RfZW1wdHkoJnN0cmVhbS0+YnVmcykpIHsKIAkJLyogbm8gdXNlciBidWZmZXIgYXZhaWxhYmxlICovCi0JCXByX2RlYnVnKCJzc3Q6IE51bGwgYnVmZmVyIHN0cmVhbSBzdGF0dXMgJWRcbiIsIHN0cmVhbS0+c3RhdHVzKTsKKwkJcHJfZGVidWcoIk51bGwgYnVmZmVyIHN0cmVhbSBzdGF0dXMgJWRcbiIsIHN0cmVhbS0+c3RhdHVzKTsKIAkJc3RyZWFtLT5wcmV2ID0gc3RyZWFtLT5zdGF0dXM7CiAJCXN0cmVhbS0+c3RhdHVzID0gU1RSRUFNX0lOSVQ7Ci0JCXByX2RlYnVnKCJzc3Q6bmV3IHN0cmVhbSBzdGF0dXMgPSAlZFxuIiwgc3RyZWFtLT5zdGF0dXMpOworCQlwcl9kZWJ1ZygibmV3IHN0cmVhbSBzdGF0dXMgPSAlZFxuIiwgc3RyZWFtLT5zdGF0dXMpOwogCQlpZiAoc3RyZWFtLT5uZWVkX2RyYWluaW5nID09IHRydWUpIHsKLQkJCXByX2RlYnVnKCJzc3Q6ZHJhaW5pbmcgc3RyZWFtXG4iKTsKKwkJCXByX2RlYnVnKCJkcmFpbmluZyBzdHJlYW1cbiIpOwogCQkJaWYgKHNzdF9jcmVhdGVfc2hvcnRfbXNnKCZtc2cpKSB7Ci0JCQkJcHJfZXJyKCJzc3Q6IG1lbSBhbGxvYyBmYWlsZWRcbiIpOworCQkJCXByX2VycigibWVtIGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKIAkJCQlyZXR1cm4gLUVOT01FTTsKIAkJCX0KIAkJCXNzdF9maWxsX2hlYWRlcigmbXNnLT5oZWFkZXIsIElQQ19JQV9EUkFJTl9TVFJFQU0sCkBAIC02MzMsNyArNjM1LDcgQEAKIAkJCXNwaW5fdW5sb2NrKCZzc3RfZHJ2X2N0eC0+bGlzdF9zcGluX2xvY2spOwogCQkJc3N0X3Bvc3RfbWVzc2FnZSgmc3N0X2Rydl9jdHgtPmlwY19wb3N0X21zZ193cSk7CiAJCX0gZWxzZSBpZiAoc3RyZWFtLT5kYXRhX2Jsay5vbiA9PSB0cnVlKSB7Ci0JCQlwcl9kZWJ1Zygic3N0OnVzZXIgbGlzdCBlbXB0eS4uIHdha2VcbiIpOworCQkJcHJfZGVidWcoInVzZXIgbGlzdCBlbXB0eS4uIHdha2VcbiIpOwogCQkJLyogdW5ibG9jayAqLwogCQkJc3RyZWFtLT5kYXRhX2Jsay5yZXRfY29kZSA9IDA7CiAJCQlzdHJlYW0tPmRhdGFfYmxrLmNvbmRpdGlvbiA9IHRydWU7CkBAIC02NzgsNyArNjgwLDcgQEAKIAlzdHJ1Y3Qgc3RyZWFtX2luZm8gKnN0cmVhbTsKIAogCi0JcHJfZGVidWcoInNzdDpjYXB0dXJlIGZyYW1lIGZvciAlZFxuIiwgc3RyX2lkKTsKKwlwcl9kZWJ1ZygiY2FwdHVyZSBmcmFtZSBmb3IgJWRcbiIsIHN0cl9pZCk7CiAJcmV0dmFsID0gc3N0X3ZhbGlkYXRlX3N0cmlkKHN0cl9pZCk7CiAJaWYgKHJldHZhbCkKIAkJcmV0dXJuIHJldHZhbDsKQEAgLTY4OCwxOSArNjkwLDE5IEBACiAJCWlmIChrYnVmcy0+aW5fdXNlID09IHRydWUpIHsKIAkJCWxpc3RfZGVsKCZrYnVmcy0+bm9kZSk7CiAJCQlrZnJlZShrYnVmcyk7Ci0JCQlwcl9kZWJ1Zygic3N0OmRlbCBub2RlXG4iKTsKKwkJCXByX2RlYnVnKCJkZWwgbm9kZVxuIik7CiAJCX0KIAl9CiAJaWYgKGxpc3RfZW1wdHkoJnN0cmVhbS0+YnVmcykpIHsKIAkJLyogbm8gdXNlciBidWZmZXIgYXZhaWxhYmxlICovCi0JCXByX2RlYnVnKCJzc3Q6TnVsbCBidWZmZXIhISEhc3RyZWFtIHN0YXR1cyAlZFxuIiwKKwkJcHJfZGVidWcoIk51bGwgYnVmZmVyISEhIXN0cmVhbSBzdGF0dXMgJWRcbiIsCiAJCQkgICAgICAgc3RyZWFtLT5zdGF0dXMpOwogCQlzdHJlYW0tPnByZXYgPSBzdHJlYW0tPnN0YXR1czsKIAkJc3RyZWFtLT5zdGF0dXMgPSBTVFJFQU1fSU5JVDsKLQkJcHJfZGVidWcoInNzdDpuZXcgc3RyZWFtIHN0YXR1cyA9ICVkXG4iLAorCQlwcl9kZWJ1ZygibmV3IHN0cmVhbSBzdGF0dXMgPSAlZFxuIiwKIAkJCSAgICAgICBzdHJlYW0tPnN0YXR1cyk7CiAJCWlmIChzdHJlYW0tPmRhdGFfYmxrLm9uID09IHRydWUpIHsKLQkJCXByX2RlYnVnKCJzc3Q6dXNlciBsaXN0IGVtcHR5Li4gd2FrZVxuIik7CisJCQlwcl9kZWJ1ZygidXNlciBsaXN0IGVtcHR5Li4gd2FrZVxuIik7CiAJCQkvKiB1bmJsb2NrICovCiAJCQlzdHJlYW0tPmRhdGFfYmxrLnJldF9jb2RlID0gMDsKIAkJCXN0cmVhbS0+ZGF0YV9ibGsuY29uZGl0aW9uID0gdHJ1ZTsKQEAgLTczMSw3ICs3MzMsNyBAQAogCXN0cmVhbS0+Y3VtbV9ieXRlcyArPSBzdHJlYW0tPmN1cnJfYnl0ZXM7CiAJc3RyZWFtLT5jdXJyX2J5dGVzID0gMDsKIAotICAgIHByX2RlYnVnKCJzc3Q6Q3VtIGJ5dGVzICA9ICVkXG4iLCBzdHJlYW0tPmN1bW1fYnl0ZXMpOworICAgIHByX2RlYnVnKCJDdW0gYnl0ZXMgID0gJWRcbiIsIHN0cmVhbS0+Y3VtbV9ieXRlcyk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTc0Myw3ICs3NDUsNyBAQAogCQlpZiAoYnVmcy0+YnVmZl9lbnRyeVtpXS5zaXplIDwgbWluX3ZhbCkKIAkJCW1pbl92YWwgPSBidWZzLT5idWZmX2VudHJ5W2ldLnNpemU7CiAJfQotCXByX2RlYnVnKCJzc3Q6bWluX3ZhbCA9ICVkXG4iLCBtaW5fdmFsKTsKKwlwcl9kZWJ1ZygibWluX3ZhbCA9ICVkXG4iLCBtaW5fdmFsKTsKIAlyZXR1cm4gbWluX3ZhbDsKIH0KIApAQCAtNzU0LDcgKzc1Niw3IEBACiAJCWlmIChidWZzLT5idWZmX2VudHJ5W2ldLnNpemUgPiBtYXhfdmFsKQogCQkJbWF4X3ZhbCA9IGJ1ZnMtPmJ1ZmZfZW50cnlbaV0uc2l6ZTsKIAl9Ci0JcHJfZGVidWcoInNzdDptYXhfdmFsID0gJWRcbiIsIG1heF92YWwpOworCXByX2RlYnVnKCJtYXhfdmFsID0gJWRcbiIsIG1heF92YWwpOwogCXJldHVybiBtYXhfdmFsOwogfQogCkBAIC03NzMsNyArNzc1LDcgQEAKIAkJCWlmIChkYnVmcy0+aWJ1ZnMtPmVudHJpZXMgPT0gZGJ1ZnMtPm9idWZzLT5lbnRyaWVzKQogCQkJCXJldHVybiAwOwogCQkJZWxzZSB7Ci0JCQkJcHJfZXJyKCJzc3Q6IFJBUiBlbnRyaWVzIGRvbnQgbWF0Y2hcbiIpOworCQkJCXByX2VycigiUkFSIGVudHJpZXMgZG9udCBtYXRjaFxuIik7CiAJCQkJIHJldHVybiAtRUlOVkFMOwogCQkJfQogCQl9IGVsc2UKQEAgLTc4MywyNiArNzg1LDI2IEBACiAJfQogI2VuZGlmCiAJaWYgKCFzdHJfaW5mby0+ZGVjb2RlX2lidWYpIHsKLQkJcHJfZGVidWcoInNzdDpubyBpL3AgYnVmZmVycywgdHJ5aW5nIGZ1bGwgc2l6ZVxuIik7CisJCXByX2RlYnVnKCJubyBpL3AgYnVmZmVycywgdHJ5aW5nIGZ1bGwgc2l6ZVxuIik7CiAJCXN0cl9pbmZvLT5kZWNvZGVfaXNpemUgPSBjdW1faW5wdXRfZ2l2ZW47CiAJCXN0cl9pbmZvLT5kZWNvZGVfaWJ1ZiA9IGt6YWxsb2Moc3RyX2luZm8tPmRlY29kZV9pc2l6ZSwKIAkJCQkJCUdGUF9LRVJORUwpOwogCQlzdHJfaW5mby0+aWRlY29kZV9hbGxvYyA9IHN0cl9pbmZvLT5kZWNvZGVfaXNpemU7CiAJfQogCWlmICghc3RyX2luZm8tPmRlY29kZV9pYnVmKSB7Ci0JCXByX2RlYnVnKCJzc3Q6YnVmZiBhbGxvYyBmYWlsZWQsIHRyeSBtYXggc2l6ZVxuIik7CisJCXByX2RlYnVnKCJidWZmIGFsbG9jIGZhaWxlZCwgdHJ5IG1heCBzaXplXG4iKTsKIAkJc3RyX2luZm8tPmRlY29kZV9pc2l6ZSA9IGNhbGN1bGF0ZV9tYXhfc2l6ZShkYnVmcy0+aWJ1ZnMpOwogCQlzdHJfaW5mby0+ZGVjb2RlX2lidWYgPSBremFsbG9jKAogCQkJCXN0cl9pbmZvLT5kZWNvZGVfaXNpemUsIEdGUF9LRVJORUwpOwogCQlzdHJfaW5mby0+aWRlY29kZV9hbGxvYyA9IHN0cl9pbmZvLT5kZWNvZGVfaXNpemU7CiAJfQogCWlmICghc3RyX2luZm8tPmRlY29kZV9pYnVmKSB7Ci0JCXByX2RlYnVnKCJzc3Q6YnVmZiBhbGxvYyBmYWlsZWQsIHRyeSBtaW4gc2l6ZVxuIik7CisJCXByX2RlYnVnKCJidWZmIGFsbG9jIGZhaWxlZCwgdHJ5IG1pbiBzaXplXG4iKTsKIAkJc3RyX2luZm8tPmRlY29kZV9pc2l6ZSA9IGNhbGN1bGF0ZV9taW5fc2l6ZShkYnVmcy0+aWJ1ZnMpOwogCQlzdHJfaW5mby0+ZGVjb2RlX2lidWYgPSBremFsbG9jKHN0cl9pbmZvLT5kZWNvZGVfaXNpemUsCiAJCQkJCQlHRlBfS0VSTkVMKTsKIAkJaWYgKCFzdHJfaW5mby0+ZGVjb2RlX2lidWYpIHsKLQkJCXByX2Vycigic3N0OiBtZW0gYWxsb2NhdGlvbiBmYWlsZWRcbiIpOworCQkJcHJfZXJyKCJtZW0gYWxsb2NhdGlvbiBmYWlsZWRcbiIpOwogCQkJcmV0dXJuIC1FTk9NRU07CiAJCX0KIAkJc3RyX2luZm8tPmlkZWNvZGVfYWxsb2MgPSBzdHJfaW5mby0+ZGVjb2RlX2lzaXplOwpAQCAtODIwLDcgKzgyMiw3IEBACiAJc3RydWN0IGlwY19wb3N0ICptc2cgPSBOVUxMOwogCWludCByZXR2YWwgPSAwOwogCi0JcHJfZGVidWcoIlNTVCBEQkdzc3Rfc2V0X211dGU6Y2FsbGVkXG4iKTsKKwlwcl9kZWJ1ZygiU1NUIERCRzpzc3Rfc2V0X211dGU6Y2FsbGVkXG4iKTsKIAogCWlmIChzdHJfaW5mby0+ZGVjb2RlX2lidWZfdHlwZSA9PSBTU1RfQlVGX1JBUikgewogI2lmZGVmIENPTkZJR19NUlNUX1JBUl9IQU5ETEVSCkBAIC04NTcsNyArODU5LDcgQEAKIAlkZWNfaW5mby0+aW5wdXRfYnl0ZXNfY29uc3VtZWQgPSAwOwogCWRlY19pbmZvLT5vdXRwdXRfYnl0ZXNfcHJvZHVjZWQgPSAwOwogCWlmIChzc3RfY3JlYXRlX2xhcmdlX21zZygmbXNnKSkgewotCQlwcl9lcnIoInNzdDogbWVzc2FnZSBjcmVhdGlvbiBmYWlsZWRcbiIpOworCQlwcl9lcnIoIm1lc3NhZ2UgY3JlYXRpb24gZmFpbGVkXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCkBAIC04NzgsMTMgKzg4MCwxMyBAQAogCXJldHVybiByZXR2YWw7CiB9CiAKKyNpZmRlZiBDT05GSUdfTVJTVF9SQVJfSEFORExFUgogc3RhdGljIGludCBzc3RfcHJlcGFyZV9pbnB1dF9idWZmZXJzX3JhcihzdHJ1Y3Qgc3RyZWFtX2luZm8gKnN0cl9pbmZvLAogCQkJc3RydWN0IHNuZF9zc3RfZGJ1ZnMgKmRidWZzLAogCQkJaW50ICppbnB1dF9pbmRleCwgaW50ICppbl9jb3BpZWQsCiAJCQlpbnQgKmlucHV0X2luZGV4X3ZhbGlkX3NpemUsIGludCAqbmV3X2VudHJ5X2ZsYWcpCiB7CiAJaW50IHJldHZhbCA9IDA7Ci0jaWZkZWYgQ09ORklHX01SU1RfUkFSX0hBTkRMRVIKIAlpbnQgaTsKIAogCWlmIChzdHJfaW5mby0+b3BzID09IFNUUkVBTV9PUFNfUExBWUJBQ0tfRFJNKSB7CkBAIC04OTQsNyArODk2LDcgQEAKIAkJCQlkYnVmcy0+aWJ1ZnMtPmJ1ZmZfZW50cnlbaV0uYnVmZmVyLAogCQkJCXNpemVvZihfX3UzMikpOwogCQlpZiAocmV0dmFsKSB7Ci0JCQlwcl9lcnIoInNzdDpjcHkgZnJvbSB1c2VyIGZhaWxcbiIpOworCQkJcHJfZXJyKCJjcHkgZnJvbSB1c2VyIGZhaWxcbiIpOwogCQkJcmV0dXJuIC1FQUdBSU47CiAJCX0KIAkJcmFyX2J1ZmZlcnMuaW5mby50eXBlID0gZGJ1ZnMtPmlidWZzLT50eXBlOwpAQCAtOTE5LDkgKzkyMSwxMCBAQAogCQlzdHJfaW5mby0+ZGVjb2RlX2lidWZfdHlwZSA9IGRidWZzLT5pYnVmcy0+dHlwZTsKIAkJKmluX2NvcGllZCA9IHN0cl9pbmZvLT5kZWNvZGVfaXNpemU7CiAJfQotI2VuZGlmCiAJcmV0dXJuIHJldHZhbDsKIH0KKyNlbmRpZgorCiAvKlRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBwcmVwYXJlIHRoZSBrZXJuZWwgaW5wdXQgYnVmZmVycyB3aXRoIGNvbnRlbnRzCiBiZWZvcmUgc2VuZGluZyBmb3IgZGVjb2RlKi8KIHN0YXRpYyBpbnQgc3N0X3ByZXBhcmVfaW5wdXRfYnVmZmVycyhzdHJ1Y3Qgc3RyZWFtX2luZm8gKnN0cl9pbmZvLApAQCAtOTMxLDcgKzkzNCw3IEBACiB7CiAJaW50IGksIGNweV9zaXplLCByZXR2YWwgPSAwOwogCi0JcHJfZGVidWcoInNzdDppbnB1dF9pbmRleCA9ICVkLCBpbnB1dCBlbnRyaWVzID0gJWRcbiIsCisJcHJfZGVidWcoImlucHV0X2luZGV4ID0gJWQsIGlucHV0IGVudHJpZXMgPSAlZFxuIiwKIAkJCSAqaW5wdXRfaW5kZXgsIGRidWZzLT5pYnVmcy0+ZW50cmllcyk7CiAJZm9yIChpID0gKmlucHV0X2luZGV4OyBpIDwgZGJ1ZnMtPmlidWZzLT5lbnRyaWVzOyBpKyspIHsKICNpZmRlZiBDT05GSUdfTVJTVF9SQVJfSEFORExFUgpAQCAtOTM5LDcgKzk0Miw3IEBACiAJCQlkYnVmcywgaW5wdXRfaW5kZXgsIGluX2NvcGllZCwKIAkJCQlpbnB1dF9pbmRleF92YWxpZF9zaXplLCBuZXdfZW50cnlfZmxhZyk7CiAJCWlmIChyZXR2YWwpIHsKLQkJCXByX2Vycigic3N0OiBJbiBwcmVwYXJlIGlucHV0IGJ1ZmZlcnMgZm9yIFJBUlxuIik7CisJCQlwcl9lcnIoIkluIHByZXBhcmUgaW5wdXQgYnVmZmVycyBmb3IgUkFSXG4iKTsKIAkJCXJldHVybiAtRUlPOwogCQl9CiAjZW5kaWYKQEAgLTk0NywxMCArOTUwLDEwIEBACiAJCWlmICgqaW5wdXRfaW5kZXhfdmFsaWRfc2l6ZSA9PSAwKQogCQkJKmlucHV0X2luZGV4X3ZhbGlkX3NpemUgPQogCQkJCWRidWZzLT5pYnVmcy0+YnVmZl9lbnRyeVtpXS5zaXplOwotCQlwcl9kZWJ1Zygic3N0Omlub3V0IGFkZHIgPSAlcCwgc2l6ZSA9ICVkXG4iLAorCQlwcl9kZWJ1ZygiaW5vdXQgYWRkciA9ICVwLCBzaXplID0gJWRcbiIsCiAJCQlkYnVmcy0+aWJ1ZnMtPmJ1ZmZfZW50cnlbaV0uYnVmZmVyLAogCQkJKmlucHV0X2luZGV4X3ZhbGlkX3NpemUpOwotCQlwcl9kZWJ1Zygic3N0OmRlY29kZV9pc2l6ZSA9ICVkLCBpbl9jb3BpZWQgJWRcbiIsCisJCXByX2RlYnVnKCJkZWNvZGVfaXNpemUgPSAlZCwgaW5fY29waWVkICVkXG4iLAogCQkJc3RyX2luZm8tPmRlY29kZV9pc2l6ZSwgKmluX2NvcGllZCk7CiAJCWlmICgqaW5wdXRfaW5kZXhfdmFsaWRfc2l6ZSA8PQogCQkJCQkoc3RyX2luZm8tPmRlY29kZV9pc2l6ZSAtICppbl9jb3BpZWQpKQpAQCAtOTU4LDEyICs5NjEsMTIgQEAKIAkJZWxzZQogCQkJY3B5X3NpemUgPSBzdHJfaW5mby0+ZGVjb2RlX2lzaXplIC0gKmluX2NvcGllZDsKIAotCQlwcl9kZWJ1Zygic3N0OmNweSBzaXplID0gJWRcbiIsIGNweV9zaXplKTsKKwkJcHJfZGVidWcoImNweSBzaXplID0gJWRcbiIsIGNweV9zaXplKTsKIAkJaWYgKCFkYnVmcy0+aWJ1ZnMtPmJ1ZmZfZW50cnlbaV0uYnVmZmVyKSB7Ci0JCQlwcl9lcnIoInNzdDogaS9wIGJ1ZmZlciBpcyBudWxsXG4iKTsKKwkJCXByX2VycigiaS9wIGJ1ZmZlciBpcyBudWxsXG4iKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9Ci0JCXByX2RlYnVnKCJzc3Q6VHJ5IGNvcHkgVG8gJXAsIEZyb20gJXAsIHNpemUgJWRcbiIsCisJCXByX2RlYnVnKCJUcnkgY29weSBUbyAlcCwgRnJvbSAlcCwgc2l6ZSAlZFxuIiwKIAkJCQlzdHJfaW5mby0+ZGVjb2RlX2lidWYgKyAqaW5fY29waWVkLAogCQkJCWRidWZzLT5pYnVmcy0+YnVmZl9lbnRyeVtpXS5idWZmZXIsIGNweV9zaXplKTsKIApAQCAtOTcyLDIyICs5NzUsMjIgQEAKIAkJCQkodm9pZCAqKSBkYnVmcy0+aWJ1ZnMtPmJ1ZmZfZW50cnlbaV0uYnVmZmVyLAogCQkJCWNweV9zaXplKTsKIAkJaWYgKHJldHZhbCkgewotCQkJcHJfZXJyKCJzc3Q6IGNvcHkgZnJvbSB1c2VyIGZhaWxlZFxuIik7CisJCQlwcl9lcnIoImNvcHkgZnJvbSB1c2VyIGZhaWxlZFxuIik7CiAJCQlyZXR1cm4gLUVJTzsKIAkJfQogCQkqaW5fY29waWVkICs9IGNweV9zaXplOwogCQkqaW5wdXRfaW5kZXhfdmFsaWRfc2l6ZSAtPSBjcHlfc2l6ZTsKLQkJcHJfZGVidWcoInNzdDppbiBidWZmIHNpemUgPSAlZCwgaW5fY29waWVkID0gJWRcbiIsCisJCXByX2RlYnVnKCJpbiBidWZmIHNpemUgPSAlZCwgaW5fY29waWVkID0gJWRcbiIsCiAJCQkqaW5wdXRfaW5kZXhfdmFsaWRfc2l6ZSwgKmluX2NvcGllZCk7CiAJCWlmICgqaW5wdXRfaW5kZXhfdmFsaWRfc2l6ZSAhPSAwKSB7Ci0JCQlwcl9kZWJ1Zygic3N0Om1vcmUgaW5wdXQgYnVmZmVycyBsZWZ0XG4iKTsKKwkJCXByX2RlYnVnKCJtb3JlIGlucHV0IGJ1ZmZlcnMgbGVmdFxuIik7CiAJCQlkYnVmcy0+aWJ1ZnMtPmJ1ZmZfZW50cnlbaV0uYnVmZmVyICs9IGNweV9zaXplOwogCQkJYnJlYWs7CiAJCX0KIAkJaWYgKCppbl9jb3BpZWQgPT0gc3RyX2luZm8tPmRlY29kZV9pc2l6ZSAmJgogCQkJKmlucHV0X2luZGV4X3ZhbGlkX3NpemUgPT0gMCAmJgogCQkJKGkrMSkgPD0gZGJ1ZnMtPmlidWZzLT5lbnRyaWVzKSB7Ci0JCQlwcl9kZWJ1Zygic3N0OmFsbCBpbnB1dCBidWZmZXJzIGNvcGllZFxuIik7CisJCQlwcl9kZWJ1ZygiYWxsIGlucHV0IGJ1ZmZlcnMgY29waWVkXG4iKTsKIAkJCSpuZXdfZW50cnlfZmxhZyA9IHRydWU7CiAJCQkqaW5wdXRfaW5kZXggPSBpICsgMTsKIAkJCWJyZWFrOwpAQCAtMTAwNSwyMyArMTAwOCwyMyBAQAogCiB7CiAJaW50IGksIGNweV9zaXplLCByZXR2YWwgPSAwOwotCXByX2RlYnVnKCJzc3Q6b3V0cHV0X2luZGV4ID0gJWQsIG91dHB1dCBlbnRyaWVzID0gJWRcbiIsCisJcHJfZGVidWcoIm91dHB1dF9pbmRleCA9ICVkLCBvdXRwdXQgZW50cmllcyA9ICVkXG4iLAogCQkJCSpvdXRwdXRfaW5kZXgsCiAJCQkJZGJ1ZnMtPm9idWZzLT5lbnRyaWVzKTsKIAlmb3IgKGkgPSAqb3V0cHV0X2luZGV4OyBpIDwgZGJ1ZnMtPm9idWZzLT5lbnRyaWVzOyBpKyspIHsKIAkJKm91dHB1dF9pbmRleCA9IGk7Ci0JCXByX2RlYnVnKCJzc3Q6b3V0cHV0IGFkZHIgPSAlcCwgc2l6ZSA9ICVkXG4iLAorCQlwcl9kZWJ1Zygib3V0cHV0IGFkZHIgPSAlcCwgc2l6ZSA9ICVkXG4iLAogCQkJZGJ1ZnMtPm9idWZzLT5idWZmX2VudHJ5W2ldLmJ1ZmZlciwKIAkJCWRidWZzLT5vYnVmcy0+YnVmZl9lbnRyeVtpXS5zaXplKTsKLQkJcHJfZGVidWcoInNzdDpvdXRwdXRfc2l6ZSA9ICVkLCBvdXRfY29waWVkID0gJWRcbiIsCisJCXByX2RlYnVnKCJvdXRwdXRfc2l6ZSA9ICVkLCBvdXRfY29waWVkID0gJWRcbiIsCiAJCQkJb3V0cHV0X3NpemUsICpvdXRfY29waWVkKTsKIAkJaWYgKGRidWZzLT5vYnVmcy0+YnVmZl9lbnRyeVtpXS5zaXplIDwKIAkJCQkob3V0cHV0X3NpemUgLSAqb3V0X2NvcGllZCkpCiAJCQljcHlfc2l6ZSA9IGRidWZzLT5vYnVmcy0+YnVmZl9lbnRyeVtpXS5zaXplOwogCQllbHNlCiAJCQljcHlfc2l6ZSA9IG91dHB1dF9zaXplIC0gKm91dF9jb3BpZWQ7Ci0JCXByX2RlYnVnKCJzc3Q6Y3B5IHNpemUgPSAlZFxuIiwgY3B5X3NpemUpOwotCQlwcl9kZWJ1Zygic3N0OlRyeSBjb3B5IFRvOiAlcCwgRnJvbSAlcCwgc2l6ZSAlZFxuIiwKKwkJcHJfZGVidWcoImNweSBzaXplID0gJWRcbiIsIGNweV9zaXplKTsKKwkJcHJfZGVidWcoIlRyeSBjb3B5IFRvOiAlcCwgRnJvbSAlcCwgc2l6ZSAlZFxuIiwKIAkJCQlkYnVmcy0+b2J1ZnMtPmJ1ZmZfZW50cnlbaV0uYnVmZmVyLAogCQkJCXNzdF9kcnZfY3R4LT5tbWFwX21lbSArICpvdXRfY29waWVkLAogCQkJCWNweV9zaXplKTsKQEAgLTEwMjksMTMgKzEwMzIsMTMgQEAKIAkJCQkJc3N0X2Rydl9jdHgtPm1tYXBfbWVtICsgKm91dF9jb3BpZWQsCiAJCQkJCWNweV9zaXplKTsKIAkJaWYgKHJldHZhbCkgewotCQkJcHJfZXJyKCJzc3Q6IGNvcHkgdG8gdXNlciBmYWlsZWRcbiIpOworCQkJcHJfZXJyKCJjb3B5IHRvIHVzZXIgZmFpbGVkXG4iKTsKIAkJCXJldHVybiAtRUlPOwogCQl9IGVsc2UKLQkJCXByX2RlYnVnKCJzc3Q6Y29weSB0byB1c2VyIHBhc3NlZFxuIik7CisJCQlwcl9kZWJ1ZygiY29weSB0byB1c2VyIHBhc3NlZFxuIik7CiAJCSpvdXRfY29waWVkICs9IGNweV9zaXplOwogCQlkYnVmcy0+b2J1ZnMtPmJ1ZmZfZW50cnlbaV0uc2l6ZSAtPSBjcHlfc2l6ZTsKLQkJcHJfZGVidWcoInNzdDpvL3AgYnVmZiBzaXplICVkLCBvdXRfY29waWVkICVkXG4iLAorCQlwcl9kZWJ1Zygiby9wIGJ1ZmYgc2l6ZSAlZCwgb3V0X2NvcGllZCAlZFxuIiwKIAkJCWRidWZzLT5vYnVmcy0+YnVmZl9lbnRyeVtpXS5zaXplLCAqb3V0X2NvcGllZCk7CiAJCWlmIChkYnVmcy0+b2J1ZnMtPmJ1ZmZfZW50cnlbaV0uc2l6ZSAhPSAwKSB7CiAJCQkqb3V0cHV0X2luZGV4ID0gaTsKQEAgLTEwNzMsNyArMTA3Niw3IEBACiAJdW5zaWduZWQgbG9uZyBsb25nIGlucHV0X2J5dGVzLCBvdXRwdXRfYnl0ZXM7CiAKIAlzc3RfZHJ2X2N0eC0+c2NhcmRfb3BzLT5wb3dlcl9kb3duX3BtaWMoKTsKLQlwcl9kZWJ1Zygic3N0OiBQb3dlcmluZ19kb3duX1BNSUMuLi5cbiIpOworCXByX2RlYnVnKCJQb3dlcmluZ19kb3duX1BNSUMuLi5cbiIpOwogCiAJcmV0dmFsID0gc3N0X3ZhbGlkYXRlX3N0cmlkKHN0cl9pZCk7CiAJaWYgKHJldHZhbCkKQEAgLTEwODEsNyArMTA4NCw3IEBACiAKIAlzdHJfaW5mbyA9ICZzc3RfZHJ2X2N0eC0+c3RyZWFtc1tzdHJfaWRdOwogCWlmIChzdHJfaW5mby0+c3RhdHVzICE9IFNUUkVBTV9JTklUKSB7Ci0JCXByX2Vycigic3N0OiBpbnZhbGlkIHN0cmVhbSBzdGF0ZSA9ICVkXG4iLAorCQlwcl9lcnIoImludmFsaWQgc3RyZWFtIHN0YXRlID0gJWRcbiIsCiAJCQkgICAgICAgc3RyX2luZm8tPnN0YXR1cyk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KQEAgLTEwOTgsNyArMTEwMSw3IEBACiAJcmV0dmFsID0gIHNzdF9hbGxvY2F0ZV9kZWNvZGVfYnVmKHN0cl9pbmZvLCBkYnVmcywKIAkJCQljdW1faW5wdXRfZ2l2ZW4sIGN1bV9vdXRwdXRfZ2l2ZW4pOwogCWlmIChyZXR2YWwpIHsKLQkJcHJfZXJyKCJzc3Q6IG1lbSBhbGxvY2F0aW9uIGZhaWxlZCwgYWJvcnQhISFcbiIpOworCQlwcl9lcnIoIm1lbSBhbGxvY2F0aW9uIGZhaWxlZCwgYWJvcnQhISFcbiIpOwogCQlyZXR2YWwgPSAtRU5PTUVNOwogCQlnb3RvIGZpbmlzaDsKIAl9CkBAIC0xMTE0LDcgKzExMTcsNyBAQAogCQkJZGJ1ZnMsICZpbnB1dF9pbmRleCwgJmluX2NvcGllZCwKIAkJCSZpbnB1dF9pbmRleF92YWxpZF9zaXplLCAmbmV3X2VudHJ5X2ZsYWcpOwogCQlpZiAocmV0dmFsKSB7Ci0JCQlwcl9lcnIoInNzdDogcHJlcGFyZSBpbiBidWZmZXJzIGZhaWxlZFxuIik7CisJCQlwcl9lcnIoInByZXBhcmUgaW4gYnVmZmVycyBmYWlsZWRcbiIpOwogCQkJZ290byBmaW5pc2g7CiAJCX0KIApAQCAtMTE0NSw4ICsxMTQ4LDggQEAKIAkJCQlzdHJfaW5mby0+ZGVjb2RlX29zaXplID0gZGJ1ZnMtPm9idWZzLT4KIAkJCQkJYnVmZl9lbnRyeVtvdXRwdXRfaW5kZXhdLnNpemU7CiAJCQkJc3RyX2luZm8tPmRlY29kZV9vYnVmX3R5cGUgPSBkYnVmcy0+b2J1ZnMtPnR5cGU7Ci0JCQkJcHJfZGVidWcoInNzdDpEUk0gaGFuZGxpbmdcbiIpOwotCQkJCXByX2RlYnVnKCJvL3BfYWRkPTB4JWx1IFNpemU9MHgleCIsCisJCQkJcHJfZGVidWcoIkRSTSBoYW5kbGluZ1xuIik7CisJCQkJcHJfZGVidWcoIm8vcF9hZGQ9MHglbHUgU2l6ZT0weCV4XG4iLAogCQkJCQkodW5zaWduZWQgbG9uZykgc3RyX2luZm8tPmRlY29kZV9vYnVmLAogCQkJCQlzdHJfaW5mby0+ZGVjb2RlX29zaXplKTsKIAkJCX0gZWxzZSB7CkBAIC0xMTYwLDcgKzExNjMsNyBAQAogCQlpZiAoc3RyX2luZm8tPm9wcyAhPSBTVFJFQU1fT1BTX1BMQVlCQUNLX0RSTSkgewogCQkJaWYgKHN0cl9pbmZvLT5kZWNvZGVfaXNpemUgPiBpbl9jb3BpZWQpIHsKIAkJCQlzdHJfaW5mby0+ZGVjb2RlX2lzaXplID0gaW5fY29waWVkOwotCQkJCXByX2RlYnVnKCJzc3Q6aS9wIHNpemUgPSAlZFxuIiwKKwkJCQlwcl9kZWJ1ZygiaS9wIHNpemUgPSAlZFxuIiwKIAkJCQkJCXN0cl9pbmZvLT5kZWNvZGVfaXNpemUpOwogCQkJfQogCQl9CkBAIC0xMTY4LDIwICsxMTcxLDE5IEBACiAKIAkJcmV0dmFsID0gc3N0X3NlbmRfZGVjb2RlX21lc3Moc3RyX2lkLCBzdHJfaW5mbywgJmRlY19pbmZvKTsKIAkJaWYgKHJldHZhbCB8fCBkZWNfaW5mby5pbnB1dF9ieXRlc19jb25zdW1lZCA9PSAwKSB7Ci0JCQlwcl9lcnIoCi0JCQkJIlNTVCBFUlI6IG1lc3MgZmFpbGVkIG9yIG5vIGlucHV0IGNvbnN1bWVkXG4iKTsKKwkJCXByX2VycigiU1NUIEVSUjogbWVzcyBmYWlsZWQgb3Igbm8gaW5wdXQgY29uc3VtZWRcbiIpOwogCQkJZ290byBmaW5pc2g7CiAJCX0KIAkJaW5wdXRfYnl0ZXMgPSBkZWNfaW5mby5pbnB1dF9ieXRlc19jb25zdW1lZDsKIAkJb3V0cHV0X2J5dGVzID0gZGVjX2luZm8ub3V0cHV0X2J5dGVzX3Byb2R1Y2VkOwogCi0JCXByX2RlYnVnKCJzc3Q6aW5fY29waWVkPSVkLCBjb249JWxsZCwgcHJvZD0lbGxkXG4iLAorCQlwcl9kZWJ1ZygiaW5fY29waWVkPSVkLCBjb249JWxsZCwgcHJvZD0lbGxkXG4iLAogCQkJaW5fY29waWVkLCBpbnB1dF9ieXRlcywgb3V0cHV0X2J5dGVzKTsKIAkJaWYgKGRidWZzLT5vYnVmcy0+dHlwZSA9PSBTU1RfQlVGX1JBUikgewogCQkJb3V0cHV0X2luZGV4ICs9IDE7CiAJCQlpZiAob3V0cHV0X2luZGV4ID09IGRidWZzLT5vYnVmcy0+ZW50cmllcykgewogCQkJCWNvcHlfaW5fZG9uZSA9IHRydWU7Ci0JCQkJcHJfZGVidWcoInNzdDphbGwgaS9wIGNweSBkb25lXG4iKTsKKwkJCQlwcl9kZWJ1ZygiYWxsIGkvcCBjcHkgZG9uZVxuIik7CiAJCQl9CiAJCQl0b3RhbF9vdXRwdXQgKz0gb3V0cHV0X2J5dGVzOwogCQl9IGVsc2UgewpAQCAtMTE5MCwxNCArMTE5MiwxNCBAQAogCQkJcmV0dmFsID0gc3N0X3ByZXBhcmVfb3V0cHV0X2J1ZmZlcnMoc3RyX2luZm8sIGRidWZzLAogCQkJCSZvdXRwdXRfaW5kZXgsIG91dHB1dF9zaXplLCAmb3V0X2NvcGllZCk7CiAJCQlpZiAocmV0dmFsKSB7Ci0JCQkJcHJfZXJyKCJzc3Q6cHJlcCBvdXQgYnVmZiBmYWlsXG4iKTsKKwkJCQlwcl9lcnIoInByZXAgb3V0IGJ1ZmYgZmFpbFxuIik7CiAJCQkJZ290byBmaW5pc2g7CiAJCQl9CiAJCQlpZiAoc3RyX2luZm8tPm9wcyAhPSBTVFJFQU1fT1BTX1BMQVlCQUNLX0RSTSkgewogCQkJCWlmIChpbl9jb3BpZWQgIT0gaW5wdXRfYnl0ZXMpIHsKIAkJCQkJaW50IGJ5dGVzX2xlZnQgPSBpbl9jb3BpZWQgLQogCQkJCQkJCQlpbnB1dF9ieXRlczsKLQkJCQkJcHJfZGVidWcoInNzdDpieXRlcyAlZFxuIiwKKwkJCQkJcHJfZGVidWcoImJ5dGVzICVkXG4iLAogCQkJCQkJCWJ5dGVzX2xlZnQpOwogCQkJCQlpZiAobmV3X2VudHJ5X2ZsYWcgPT0gdHJ1ZSkKIAkJCQkJCWlucHV0X2luZGV4LS07CkBAIC0xMjM3LDcgKzEyMzksNyBAQAogCQkJdG90YWxfb3V0cHV0ICs9IG91dF9jb3BpZWQ7CiAJCQlpZiAoc3RyX2luZm8tPmRlY29kZV9vc2l6ZSAhPSBvdXRfY29waWVkKSB7CiAJCQkJc3RyX2luZm8tPmRlY29kZV9vc2l6ZSAtPSBvdXRfY29waWVkOwotCQkJCXByX2RlYnVnKCJzc3Q6b3V0cHV0IHNpemUgbW9kaWZpZWQgPSAlZFxuIiwKKwkJCQlwcl9kZWJ1Zygib3V0cHV0IHNpemUgbW9kaWZpZWQgPSAlZFxuIiwKIAkJCQkJCXN0cl9pbmZvLT5kZWNvZGVfb3NpemUpOwogCQkJfQogCQl9CkBAIC0xMjUxLDE2ICsxMjUzLDE2IEBACiAJCX0gZWxzZSB7CiAJCQlpZiAodG90YWxfb3V0cHV0ID09IGN1bV9vdXRwdXRfZ2l2ZW4pIHsKIAkJCQljb3B5X291dF9kb25lID0gdHJ1ZTsKLQkJCQlwcl9kZWJ1Zygic3N0OmFsbCBvL3AgY3B5IGRvbmVcbiIpOworCQkJCXByX2RlYnVnKCJhbGwgby9wIGNweSBkb25lXG4iKTsKIAkJCX0KIAogCQkJaWYgKHRvdGFsX2lucHV0ID09IGN1bV9pbnB1dF9naXZlbikgewogCQkJCWNvcHlfaW5fZG9uZSA9IHRydWU7Ci0JCQkJcHJfZGVidWcoInNzdDphbGwgaS9wIGNweSBkb25lXG4iKTsKKwkJCQlwcl9kZWJ1ZygiYWxsIGkvcCBjcHkgZG9uZVxuIik7CiAJCQl9CiAJCX0KIAotCQlwcl9kZWJ1Zygic3N0OmNvcHlfb3V0ID0gJWQsIGNvcHlfaW4gPSAlZFxuIiwKKwkJcHJfZGVidWcoImNvcHlfb3V0ID0gJWQsIGNvcHlfaW4gPSAlZFxuIiwKIAkJCQljb3B5X291dF9kb25lLCBjb3B5X2luX2RvbmUpOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2ludGVsX3NzdC9pbnRlbG1pZC5jIGIvZHJpdmVycy9zdGFnaW5nL2ludGVsX3NzdC9pbnRlbG1pZC5jCmluZGV4IDRjMDI2NGMuLmZiMjI5MjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9pbnRlbF9zc3QvaW50ZWxtaWQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaW50ZWxfc3N0L2ludGVsbWlkLmMKQEAgLTI0LDYgKzI0LDkgQEAKICAqIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CiAgKiBBTFNBIGRyaXZlciBmb3IgSW50ZWwgTUlEIHNvdW5kIGNhcmQgY2hpcHNldAogICovCisKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKwogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgpAQCAtMTAxLDEyICsxMDQsMTAgQEAKIHN0YXRpYyBpbnQgc25kX2ludGVsbWFkX3BjbV90cmlnZ2VyKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAogCQkJCQlpbnQgY21kKQogewotCWludCByZXRfdmFsID0gMDsKKwlpbnQgcmV0X3ZhbCA9IDAsIHN0cl9pZDsKIAlzdHJ1Y3Qgc25kX2ludGVsbWFkICppbnRlbG1hZGRhdGE7CiAJc3RydWN0IG1hZF9zdHJlYW1fcHZ0ICpzdHJlYW07Ci0JLypzdHJ1Y3Qgc3RyZWFtX2J1ZmZlciBidWZmZXJfdG9fc3N0OyovCi0KLQorCXN0cnVjdCBpbnRlbF9zc3RfcGNtX2NvbnRyb2wgKnNzdF9vcHM7CiAKIAlXQVJOX09OKCFzdWJzdHJlYW0pOwogCkBAIC0xMTUsMzggKzExNiwzNSBAQAogCiAJV0FSTl9PTighaW50ZWxtYWRkYXRhLT5zc3RkcnZfb3BzKTsKIAlXQVJOX09OKCFpbnRlbG1hZGRhdGEtPnNzdGRydl9vcHMtPnNjYXJkX29wcyk7CisJc3N0X29wcyAgPSBpbnRlbG1hZGRhdGEtPnNzdGRydl9vcHMtPnBjbV9jb250cm9sOworCXN0cl9pZCA9IHN0cmVhbS0+c3RyZWFtX2luZm8uc3RyX2lkOwogCiAJc3dpdGNoIChjbWQpIHsKIAljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUQVJUOgotCQlwcl9kZWJ1Zygic3N0OiBUcmlnZ2VyIFN0YXJ0XG4iKTsKLQkJcmV0X3ZhbCA9IGludGVsbWFkZGF0YS0+c3N0ZHJ2X29wcy0+Y29udHJvbF9zZXQoU1NUX1NORF9TVEFSVCwKLQkJCQkmc3RyZWFtLT5zdHJlYW1faW5mby5zdHJfaWQpOworCQlwcl9kZWJ1ZygiVHJpZ2dlciBTdGFydFxuIik7CisJCXJldF92YWwgPSBzc3Rfb3BzLT5kZXZpY2VfY29udHJvbChTU1RfU05EX1NUQVJULCAmc3RyX2lkKTsKIAkJaWYgKHJldF92YWwpCiAJCQlyZXR1cm4gcmV0X3ZhbDsKIAkJc3RyZWFtLT5zdHJlYW1fc3RhdHVzID0gUlVOTklORzsKIAkJc3RyZWFtLT5zdWJzdHJlYW0gPSBzdWJzdHJlYW07Ci0JCXN0cmVhbS0+c3RyZWFtX3N0YXR1cyA9IFJVTk5JTkc7CiAJCWJyZWFrOwogCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RPUDoKLQkJcHJfZGVidWcoInNzdDogaW4gc3RvcFxuIik7Ci0JCXJldF92YWwgPSBpbnRlbG1hZGRhdGEtPnNzdGRydl9vcHMtPmNvbnRyb2xfc2V0KFNTVF9TTkRfRFJPUCwKLQkJCQkmc3RyZWFtLT5zdHJlYW1faW5mby5zdHJfaWQpOworCQlwcl9kZWJ1ZygiaW4gc3RvcFxuIik7CisJCXJldF92YWwgPSBzc3Rfb3BzLT5kZXZpY2VfY29udHJvbChTU1RfU05EX0RST1AsICZzdHJfaWQpOwogCQlpZiAocmV0X3ZhbCkKIAkJCXJldHVybiByZXRfdmFsOwogCQlzdHJlYW0tPnN0cmVhbV9zdGF0dXMgPSBEUk9QUEVEOwogCQlicmVhazsKIAljYXNlIFNORFJWX1BDTV9UUklHR0VSX1BBVVNFX1BVU0g6Ci0JCXByX2RlYnVnKCJzc3Q6IGluIHBhdXNlXG4iKTsKLQkJcmV0X3ZhbCA9IGludGVsbWFkZGF0YS0+c3N0ZHJ2X29wcy0+Y29udHJvbF9zZXQoU1NUX1NORF9QQVVTRSwKLQkJCQkmc3RyZWFtLT5zdHJlYW1faW5mby5zdHJfaWQpOworCQlwcl9kZWJ1ZygiaW4gcGF1c2VcbiIpOworCQlyZXRfdmFsID0gc3N0X29wcy0+ZGV2aWNlX2NvbnRyb2woU1NUX1NORF9QQVVTRSwgJnN0cl9pZCk7CiAJCWlmIChyZXRfdmFsKQogCQkJcmV0dXJuIHJldF92YWw7CiAJCXN0cmVhbS0+c3RyZWFtX3N0YXR1cyA9IFBBVVNFRDsKIAkJYnJlYWs7CiAJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9QQVVTRV9SRUxFQVNFOgotCQlwcl9kZWJ1Zygic3N0OiBpbiBwYXVzZSByZWxlYXNlXG4iKTsKLQkJcmV0X3ZhbCA9IGludGVsbWFkZGF0YS0+c3N0ZHJ2X29wcy0+Y29udHJvbF9zZXQoU1NUX1NORF9SRVNVTUUsCi0JCQkJCQkmc3RyZWFtLT5zdHJlYW1faW5mby5zdHJfaWQpOworCQlwcl9kZWJ1ZygiaW4gcGF1c2UgcmVsZWFzZVxuIik7CisJCXJldF92YWwgPSBzc3Rfb3BzLT5kZXZpY2VfY29udHJvbChTU1RfU05EX1JFU1VNRSwgJnN0cl9pZCk7CiAJCWlmIChyZXRfdmFsKQogCQkJcmV0dXJuIHJldF92YWw7CiAJCXN0cmVhbS0+c3RyZWFtX3N0YXR1cyA9IFJVTk5JTkc7CkBAIC0xNzAsMTkgKzE2OCwxOSBAQAogCWludCByZXRfdmFsID0gMDsKIAlzdHJ1Y3Qgc25kX2ludGVsbWFkICppbnRlbG1hZGRhdGE7CiAKLQlwcl9kZWJ1Zygic3N0OiBwY21fcHJlcGFyZSBjYWxsZWRcbiIpOworCXByX2RlYnVnKCJwY21fcHJlcGFyZSBjYWxsZWRcbiIpOwogCiAJV0FSTl9PTighc3Vic3RyZWFtKTsKIAlzdHJlYW0gPSBzdWJzdHJlYW0tPnJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKIAlpbnRlbG1hZGRhdGEgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7Ci0JcHJfZGVidWcoInNzdDogcGIgY250ID0gJWQgY2FwIGNudCA9ICVkXG4iLFwKKwlwcl9kZWJ1ZygicGIgY250ID0gJWQgY2FwIGNudCA9ICVkXG4iLFwKIAkJaW50ZWxtYWRkYXRhLT5wbGF5YmFja19jbnQsCiAJCWludGVsbWFkZGF0YS0+Y2FwdHVyZV9jbnQpOwogCiAJaWYgKHN0cmVhbS0+c3RyZWFtX2luZm8uc3RyX2lkKSB7Ci0JCXByX2RlYnVnKCJzc3Q6IFByZXBhcmUgY2FsbGVkIGZvciBhbHJlYWR5IHNldCBzdHJlYW1cbiIpOwotCQlyZXRfdmFsID0gaW50ZWxtYWRkYXRhLT5zc3RkcnZfb3BzLT5jb250cm9sX3NldChTU1RfU05EX0RST1AsCi0JCQkJCSZzdHJlYW0tPnN0cmVhbV9pbmZvLnN0cl9pZCk7CisJCXByX2RlYnVnKCJQcmVwYXJlIGNhbGxlZCBmb3IgYWxyZWFkeSBzZXQgc3RyZWFtXG4iKTsKKwkJcmV0X3ZhbCA9IGludGVsbWFkZGF0YS0+c3N0ZHJ2X29wcy0+cGNtX2NvbnRyb2wtPmRldmljZV9jb250cm9sKAorCQkJCVNTVF9TTkRfRFJPUCwgJnN0cmVhbS0+c3RyZWFtX2luZm8uc3RyX2lkKTsKIAkJcmV0dXJuIHJldF92YWw7CiAJfQogCkBAIC0xOTcsNyArMTk1LDcgQEAKIAkvKiByZXR1cm4gYmFjayB0aGUgc3RyZWFtIGlkICovCiAJc25wcmludGYoc3Vic3RyZWFtLT5wY20tPmlkLCBzaXplb2Yoc3Vic3RyZWFtLT5wY20tPmlkKSwKIAkJCSIlZCIsIHN0cmVhbS0+c3RyZWFtX2luZm8uc3RyX2lkKTsKLQlwcl9kZWJ1Zygic3N0OiBzdHJlYW0gaWQgdG8gdXNlciA9ICVzXG4iLAorCXByX2RlYnVnKCJzdHJlYW0gaWQgdG8gdXNlciA9ICVzXG4iLAogCQkJc3Vic3RyZWFtLT5wY20tPmlkKTsKIAogCXJldF92YWwgPSBzbmRfaW50ZWxtYWRfaW5pdF9zdHJlYW0oc3Vic3RyZWFtKTsKQEAgLTIxMiw3ICsyMTAsNyBAQAogewogCWludCByZXRfdmFsOwogCi0JcHJfZGVidWcoInNzdDogc25kX2ludGVsbWFkX2h3X3BhcmFtcyBjYWxsZWRcbiIpOworCXByX2RlYnVnKCJzbmRfaW50ZWxtYWRfaHdfcGFyYW1zIGNhbGxlZFxuIik7CiAJcmV0X3ZhbCA9IHNuZF9wY21fbGliX21hbGxvY19wYWdlcyhzdWJzdHJlYW0sCiAJCQlwYXJhbXNfYnVmZmVyX2J5dGVzKGh3X3BhcmFtcykpOwogCW1lbXNldChzdWJzdHJlYW0tPnJ1bnRpbWUtPmRtYV9hcmVhLCAwLApAQCAtMjIzLDcgKzIyMSw3IEBACiAKIHN0YXRpYyBpbnQgc25kX2ludGVsbWFkX2h3X2ZyZWUoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCiB7Ci0JcHJfZGVidWcoInNzdDogc25kX2ludGVsbWFkX2h3X2ZyZWUgY2FsbGVkXG4iKTsKKwlwcl9kZWJ1Zygic25kX2ludGVsbWFkX2h3X2ZyZWUgY2FsbGVkXG4iKTsKIAlyZXR1cm4gc25kX3BjbV9saWJfZnJlZV9wYWdlcyhzdWJzdHJlYW0pOwogfQogCkBAIC0yNTAsMTUgKzI0OCwxNSBAQAogCWlmIChzdHJlYW0tPnN0cmVhbV9zdGF0dXMgPT0gSU5JVCkKIAkJcmV0dXJuIDA7CiAKLQlyZXRfdmFsID0gaW50ZWxtYWRkYXRhLT5zc3RkcnZfb3BzLT5jb250cm9sX3NldChTU1RfU05EX0JVRkZFUl9QT0lOVEVSLAotCQkJCSZzdHJlYW0tPnN0cmVhbV9pbmZvKTsKKwlyZXRfdmFsID0gaW50ZWxtYWRkYXRhLT5zc3RkcnZfb3BzLT5wY21fY29udHJvbC0+ZGV2aWNlX2NvbnRyb2woCisJCQlTU1RfU05EX0JVRkZFUl9QT0lOVEVSLCAmc3RyZWFtLT5zdHJlYW1faW5mbyk7CiAJaWYgKHJldF92YWwpIHsKLQkJcHJfZXJyKCJzc3Q6IGVycm9yIGNvZGUgPSAweCV4XG4iLCByZXRfdmFsKTsKKwkJcHJfZXJyKCJlcnJvciBjb2RlID0gMHgleFxuIiwgcmV0X3ZhbCk7CiAJCXJldHVybiByZXRfdmFsOwogCX0KLQlwcl9kZWJ1Zygic3N0OiBzYW1wbGVzIHJlcG9ydGVkIG91dCAweCVsbHhcbiIsCisJcHJfZGVidWcoInNhbXBsZXMgcmVwb3J0ZWQgb3V0IDB4JWxseFxuIiwKIAkJCXN0cmVhbS0+c3RyZWFtX2luZm8uYnVmZmVyX3B0cik7Ci0JcHJfZGVidWcoInNzdDogRnJhbWUgYml0czo6ICVkIHBlcmlvZF9jb3VudCA6OiAlZFxuIiwKKwlwcl9kZWJ1ZygiRnJhbWUgYml0czo6ICVkIHBlcmlvZF9jb3VudCA6OiAlZFxuIiwKIAkJCShpbnQpc3Vic3RyZWFtLT5ydW50aW1lLT5mcmFtZV9iaXRzLAogCQkJKGludClzdWJzdHJlYW0tPnJ1bnRpbWUtPnBlcmlvZF9zaXplKTsKIApAQCAtMjc3LDI2ICsyNzUsMjYgQEAKIHsKIAlzdHJ1Y3Qgc25kX2ludGVsbWFkICppbnRlbG1hZGRhdGE7CiAJc3RydWN0IG1hZF9zdHJlYW1fcHZ0ICpzdHJlYW07Ci0JaW50IHJldF92YWwgPSAwOworCWludCByZXRfdmFsID0gMCwgc3RyX2lkOwogCiAJV0FSTl9PTighc3Vic3RyZWFtKTsKIAogCXN0cmVhbSA9IHN1YnN0cmVhbS0+cnVudGltZS0+cHJpdmF0ZV9kYXRhOworCXN0cl9pZCA9IHN0cmVhbS0+c3RyZWFtX2luZm8uc3RyX2lkOwogCi0JcHJfZGVidWcoInNzdDogc25kX2ludGVsbWFkX2Nsb3NlIGNhbGxlZFxuIik7CisJcHJfZGVidWcoInNzdDogc25kX2ludGVsbWFkX2Nsb3NlIGNhbGxlZCBmb3IgJWRcbiIsIHN0cl9pZCk7CiAJaW50ZWxtYWRkYXRhID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOwogCi0JcHJfZGVidWcoInNzdDogc3RyIGlkID0gJWRcbiIsIHN0cmVhbS0+c3RyZWFtX2luZm8uc3RyX2lkKTsKKwlwcl9kZWJ1Zygic3RyIGlkID0gJWRcbiIsIHN0cmVhbS0+c3RyZWFtX2luZm8uc3RyX2lkKTsKIAlpZiAoc3RyZWFtLT5zdHJlYW1faW5mby5zdHJfaWQpIHsKIAkJLyogU1NUIEFQSSB0byBhY3R1YWxseSBzdG9wL2ZyZWUgdGhlIHN0cmVhbSAqLwotCQlyZXRfdmFsID0gaW50ZWxtYWRkYXRhLT5zc3RkcnZfb3BzLT5jb250cm9sX3NldChTU1RfU05EX0ZSRUUsCi0JCQkJJnN0cmVhbS0+c3RyZWFtX2luZm8uc3RyX2lkKTsKKwkJcmV0X3ZhbCA9IGludGVsbWFkZGF0YS0+c3N0ZHJ2X29wcy0+cGNtX2NvbnRyb2wtPmNsb3NlKHN0cl9pZCk7CiAJCWlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKQogCQkJaW50ZWxtYWRkYXRhLT5wbGF5YmFja19jbnQtLTsKIAkJZWxzZQogCQkJaW50ZWxtYWRkYXRhLT5jYXB0dXJlX2NudC0tOwogCX0KLQlwcl9kZWJ1Zygic3N0OiBzbmRfaW50ZWxtYWRfY2xvc2UgOiBwYiBjbnQgPSAlZCBjYXAgY250ID0gJWRcbiIsCisJcHJfZGVidWcoInNuZF9pbnRlbG1hZF9jbG9zZSA6IHBiIGNudCA9ICVkIGNhcCBjbnQgPSAlZFxuIiwKIAkJaW50ZWxtYWRkYXRhLT5wbGF5YmFja19jbnQsIGludGVsbWFkZGF0YS0+Y2FwdHVyZV9jbnQpOwogCWtmcmVlKHN1YnN0cmVhbS0+cnVudGltZS0+cHJpdmF0ZV9kYXRhKTsKIAlyZXR1cm4gcmV0X3ZhbDsKQEAgLTMxOSw3ICszMTcsNyBAQAogCiAJV0FSTl9PTighc3Vic3RyZWFtKTsKIAotCXByX2RlYnVnKCJzc3Q6IHNuZF9pbnRlbG1hZF9vcGVuIGNhbGxlZFxuIik7CisJcHJfZGVidWcoInNuZF9pbnRlbG1hZF9vcGVuIGNhbGxlZFxuIik7CiAKIAlpbnRlbG1hZGRhdGEgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CiAJcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKQEAgLTQ1NiwxNyArNDU0LDE3IEBACiB7CiAKIAlpZiAoIWphY2spIHsKLQkJcHJfZGVidWcoInNzdDogTUFEIGVycm9yIGphY2sgZW1wdHlcbiIpOworCQlwcl9kZWJ1ZygiTUFEIGVycm9yIGphY2sgZW1wdHlcbiIpOwogCiAJfSBlbHNlIHsKLQkJcHJfZGVidWcoInNzdDogTUFEIHNlbmQgamFjayByZXBvcnQgZm9yID0gJWQhISFcbiIsIHN0YXR1cyk7Ci0JCXByX2RlYnVnKCJzc3Q6IE1BRCBzZW5kIGphY2sgcmVwb3J0ICVkXG4iLCBqYWNrLT50eXBlKTsKKwkJcHJfZGVidWcoIk1BRCBzZW5kIGphY2sgcmVwb3J0IGZvciA9ICVkISEhXG4iLCBzdGF0dXMpOworCQlwcl9kZWJ1ZygiTUFEIHNlbmQgamFjayByZXBvcnQgJWRcbiIsIGphY2stPnR5cGUpOwogCQlzbmRfamFja19yZXBvcnQoamFjaywgc3RhdHVzKTsKIAogCQkvKmJ1dHRvbiBwcmVzc2VkIGFuZCByZWxlYXNlZCAqLwogCQlpZiAoYnV0dG9ucHJlc3NldmVudCkKIAkJCXNuZF9qYWNrX3JlcG9ydChqYWNrLCAwKTsKLQkJcHJfZGVidWcoInNzdDogTUFEIHNlbmRpbmcgamFjayByZXBvcnQgRG9uZSAhISFcbiIpOworCQlwcl9kZWJ1ZygiTUFEIHNlbmRpbmcgamFjayByZXBvcnQgRG9uZSAhISFcbiIpOwogCX0KIAogCkBAIC00OTAsNyArNDg4LDcgQEAKIAlpZiAoaW50c3RzICYgMHg0KSB7CiAKIAkJaWYgKCEoaW50ZWxtaWRfYXVkaW9faW50ZXJydXB0X2VuYWJsZSkpIHsKLQkJCXByX2RlYnVnKCJzc3Q6IEF1ZGlvIGludGVycnVwdCBlbmFibGVcbiIpOworCQkJcHJfZGVidWcoIkF1ZGlvIGludGVycnVwdCBlbmFibGVcbiIpOwogCQkJc3N0X3NjX3JlZ19hY2Nlc3Moc2NfYWNjZXNzLCBQTUlDX1JFQURfTU9ESUZZLCAzKTsKIAogCQkJc3N0X3NjX3JlZ19hY2Nlc3Moc2NfYWNjZXNzX3dyaXRlLCBQTUlDX1dSSVRFLCAxKTsKQEAgLTUwMCw3ICs0OTgsNyBAQAogCiAJCX0KIAkJLyogc2VuZCBoZWFkcGhvbmUgZGV0ZWN0ICovCi0JCXByX2RlYnVnKCJzc3Q6IE1BRCBoZWFkcGhvbmUgJWRcbiIsIGludHN0cyAmIDB4NCk7CisJCXByX2RlYnVnKCJNQUQgaGVhZHBob25lICVkXG4iLCBpbnRzdHMgJiAweDQpOwogCQlqYWNrID0gJmludGVsbWFkZGF0YS0+amFja1swXS5qYWNrOwogCQlwcmVzZW50ID0gIShpbnRlbG1hZGRhdGEtPmphY2tbMF0uamFja19zdGF0dXMpOwogCQlpbnRlbG1hZGRhdGEtPmphY2tbMF0uamFja19zdGF0dXMgPSBwcmVzZW50OwpAQCAtNTEwLDcgKzUwOCw3IEBACiAKIAlpZiAoaW50c3RzICYgMHgyKSB7CiAJCS8qIHNlbmQgc2hvcnQgcHVzaCAqLwotCQlwcl9kZWJ1Zygic3N0OiBNQUQgc2hvcnQgcHVzaCAlZFxuIiwgaW50c3RzICYgMHgyKTsKKwkJcHJfZGVidWcoIk1BRCBzaG9ydCBwdXNoICVkXG4iLCBpbnRzdHMgJiAweDIpOwogCQlqYWNrID0gJmludGVsbWFkZGF0YS0+amFja1syXS5qYWNrOwogCQlwcmVzZW50ID0gMTsKIAkJamFja19ldmVudF9mbGFnID0gMTsKQEAgLTUxOCw3ICs1MTYsNyBAQAogCX0KIAlpZiAoaW50c3RzICYgMHgxKSB7CiAJCS8qIHNlbmQgbG9uZyBwdXNoICovCi0JCXByX2RlYnVnKCJzc3Q6IE1BRCBsb25nIHB1c2ggJWRcbiIsIGludHN0cyAmIDB4MSk7CisJCXByX2RlYnVnKCJNQUQgbG9uZyBwdXNoICVkXG4iLCBpbnRzdHMgJiAweDEpOwogCQlqYWNrID0gJmludGVsbWFkZGF0YS0+amFja1szXS5qYWNrOwogCQlwcmVzZW50ID0gMTsKIAkJamFja19ldmVudF9mbGFnID0gMTsKQEAgLTUyNiw3ICs1MjQsNyBAQAogCX0KIAlpZiAoaW50c3RzICYgMHg4KSB7CiAJCWlmICghKGludGVsbWlkX2F1ZGlvX2ludGVycnVwdF9lbmFibGUpKSB7Ci0JCQlwcl9kZWJ1Zygic3N0OiBBdWRpbyBpbnRlcnJ1cHQgZW5hYmxlXG4iKTsKKwkJCXByX2RlYnVnKCJBdWRpbyBpbnRlcnJ1cHQgZW5hYmxlXG4iKTsKIAkJCXNzdF9zY19yZWdfYWNjZXNzKHNjX2FjY2VzcywgUE1JQ19SRUFEX01PRElGWSwgMyk7CiAKIAkJCXNzdF9zY19yZWdfYWNjZXNzKHNjX2FjY2Vzc193cml0ZSwgUE1JQ19XUklURSwgMSk7CkBAIC01MzUsNyArNTMzLDcgQEAKIAkJCWludGVsbWFkZGF0YS0+amFja1sxXS5qYWNrX3N0YXR1cyA9IDA7CiAJCX0KIAkJLyogc2VuZCBoZWFkc2V0IGRldGVjdCAqLwotCQlwcl9kZWJ1Zygic3N0OiBNQUQgaGVhZHNldCA9ICVkXG4iLCBpbnRzdHMgJiAweDgpOworCQlwcl9kZWJ1ZygiTUFEIGhlYWRzZXQgPSAlZFxuIiwgaW50c3RzICYgMHg4KTsKIAkJamFjayA9ICZpbnRlbG1hZGRhdGEtPmphY2tbMV0uamFjazsKIAkJcHJlc2VudCA9ICEoaW50ZWxtYWRkYXRhLT5qYWNrWzFdLmphY2tfc3RhdHVzKTsKIAkJaW50ZWxtYWRkYXRhLT5qYWNrWzFdLmphY2tfc3RhdHVzID0gcHJlc2VudDsKQEAgLTU1OCwxMCArNTU2LDEwIEBACiAKIAlzY2FyZF9vcHMgPSBpbnRlbG1hZGRhdGEtPnNzdGRydl9vcHMtPnNjYXJkX29wczsKIAotCXByX2RlYnVnKCJzc3Q6IHByZXZpb3VzIHZhbHVlOiAleFxuIiwgaW50ZWxtYWRkYXRhLT5qYWNrX3ByZXZfc3RhdGUpOworCXByX2RlYnVnKCJwcmV2aW91cyB2YWx1ZTogJXhcbiIsIGludGVsbWFkZGF0YS0+amFja19wcmV2X3N0YXRlKTsKIAogCWlmICghKGludGVsbWlkX2F1ZGlvX2ludGVycnVwdF9lbmFibGUpKSB7Ci0JCXByX2RlYnVnKCJzc3Q6IEF1ZGlvIGludGVycnVwdCBlbmFibGVcbiIpOworCQlwcl9kZWJ1ZygiQXVkaW8gaW50ZXJydXB0IGVuYWJsZVxuIik7CiAJCWludGVsbWFkZGF0YS0+amFja19wcmV2X3N0YXRlID0gMHhDMDsKIAkJaW50ZWxtaWRfYXVkaW9faW50ZXJydXB0X2VuYWJsZSA9IDE7CiAJfQpAQCAtNTcyLDEyICs1NzAsMTIgQEAKIAkJCXNjX2FjY2Vzc19yZWFkLnJlZ19hZGRyID0gMHgyMDE7CiAJCQlzc3Rfc2NfcmVnX2FjY2Vzcygmc2NfYWNjZXNzX3JlYWQsIFBNSUNfUkVBRCwgMSk7CiAJCQl2YWx1ZSA9IChzY19hY2Nlc3NfcmVhZC52YWx1ZSk7Ci0JCQlwcl9kZWJ1Zygic3N0OiB2YWx1ZSByZXR1cm5lZCA9IDB4JXhcbiIsIHZhbHVlKTsKKwkJCXByX2RlYnVnKCJ2YWx1ZSByZXR1cm5lZCA9IDB4JXhcbiIsIHZhbHVlKTsKIAkJfQogCiAJCWlmIChqYWNrX3ByZXZfc3RhdGUgPT0gMHhjMCAmJiB2YWx1ZSA9PSAweDQwKSB7CiAJCQkvKmhlYWRzZXQgZGV0ZWN0ZWQuICovCi0JCQlwcl9kZWJ1Zygic3N0OiBNQUQgaGVhZHNldCBpbnNlcnRlZFxuIik7CisJCQlwcl9kZWJ1ZygiTUFEIGhlYWRzZXQgaW5zZXJ0ZWRcbiIpOwogCQkJamFjayA9ICZpbnRlbG1hZGRhdGEtPmphY2tbMV0uamFjazsKIAkJCXByZXNlbnQgPSAxOwogCQkJamFja19ldmVudF9mbGFnID0gMTsKQEAgLTU4Nyw3ICs1ODUsNyBAQAogCiAJCWlmIChqYWNrX3ByZXZfc3RhdGUgPT0gMHhjMCAmJiB2YWx1ZSA9PSAweDAwKSB7CiAJCQkvKiBoZWFkcGhvbmUgIGRldGVjdGVkLiAqLwotCQkJcHJfZGVidWcoInNzdDogTUFEIGhlYWRwaG9uZSBpbnNlcnRlZFxuIik7CisJCQlwcl9kZWJ1ZygiTUFEIGhlYWRwaG9uZSBpbnNlcnRlZFxuIik7CiAJCQlqYWNrID0gJmludGVsbWFkZGF0YS0+amFja1swXS5qYWNrOwogCQkJcHJlc2VudCA9IDE7CiAJCQlqYWNrX2V2ZW50X2ZsYWcgPSAxOwpAQCAtNTk2LDkgKzU5NCw5IEBACiAKIAkJaWYgKGphY2tfcHJldl9zdGF0ZSA9PSAweDQwICYmIHZhbHVlID09IDB4YzApIHsKIAkJCS8qaGVhZHNldCAgcmVtb3ZlZCovCi0JCQlwcl9kZWJ1Zygic3N0OiBKYWNrIGhlYWRzZXQgc3RhdHVzICVkXG4iLAorCQkJcHJfZGVidWcoIkphY2sgaGVhZHNldCBzdGF0dXMgJWRcbiIsCiAJCQkJaW50ZWxtYWRkYXRhLT5qYWNrWzFdLmphY2tfc3RhdHVzKTsKLQkJCXByX2RlYnVnKCJzc3Q6IE1BRCBoZWFkc2V0IHJlbW92ZWRcbiIpOworCQkJcHJfZGVidWcoIk1BRCBoZWFkc2V0IHJlbW92ZWRcbiIpOwogCQkJamFjayA9ICZpbnRlbG1hZGRhdGEtPmphY2tbMV0uamFjazsKIAkJCXByZXNlbnQgPSAwOwogCQkJamFja19ldmVudF9mbGFnID0gMTsKQEAgLTYwNyw5ICs2MDUsOSBAQAogCiAJCWlmIChqYWNrX3ByZXZfc3RhdGUgPT0gMHgwMCAmJiB2YWx1ZSA9PSAweGMwKSB7CiAJCQkvKiBoZWFkcGhvbmUgIGRldGVjdGVkLiAqLwotCQkJcHJfZGVidWcoInNzdDogSmFjayBoZWFkcGhvbmUgc3RhdHVzICVkXG4iLAorCQkJcHJfZGVidWcoIkphY2sgaGVhZHBob25lIHN0YXR1cyAlZFxuIiwKIAkJCQkJaW50ZWxtYWRkYXRhLT5qYWNrWzBdLmphY2tfc3RhdHVzKTsKLQkJCXByX2RlYnVnKCJzc3Q6IGhlYWRwaG9uZSByZW1vdmVkXG4iKTsKKwkJCXByX2RlYnVnKCJoZWFkcGhvbmUgcmVtb3ZlZFxuIik7CiAJCQlqYWNrID0gJmludGVsbWFkZGF0YS0+amFja1swXS5qYWNrOwogCQkJcHJlc2VudCA9IDA7CiAJCQlqYWNrX2V2ZW50X2ZsYWcgPSAxOwpAQCAtNjE4LDcgKzYxNiw3IEBACiAJCWlmIChqYWNrX3ByZXZfc3RhdGUgPT0gMHg0MCAmJiB2YWx1ZSA9PSAweDAwKSB7CiAJCQkvKmJ1dHRvbiBwcmVzc2VkKi8KIAkJCWRvX2dldHRpbWVvZmRheSgmaW50ZWxtYWRkYXRhLT5qYWNrWzFdLmJ1dHRvbnByZXNzZWQpOwotCQkJcHJfZGVidWcoInNzdDogTUFEIGJ1dHRvbiBwcmVzcyBkZXRlY3RlZCBuIik7CisJCQlwcl9kZWJ1ZygiTUFEIGJ1dHRvbiBwcmVzcyBkZXRlY3RlZFxuIik7CiAJCX0KIAogCkBAIC02MjgsMTkgKzYyNiwxOSBAQAogCQkJCWRvX2dldHRpbWVvZmRheSgKIAkJCQkJJmludGVsbWFkZGF0YS0+amFja1sxXS5idXR0b25yZWxlYXNlZCk7CiAJCQkJLypidXR0b24gcHJlc3NlZCAqLwotCQkJCXByX2RlYnVnKCJzc3Q6IEJ1dHRvbiBSZWxlYXNlZCBkZXRlY3RlZFxuIik7CisJCQkJcHJfZGVidWcoIkJ1dHRvbiBSZWxlYXNlZCBkZXRlY3RlZFxuIik7CiAJCQkJdGltZWRpZmYgPSBpbnRlbG1hZGRhdGEtPmphY2tbMV0uCiAJCQkJCWJ1dHRvbnJlbGVhc2VkLnR2X3NlYyAtIGludGVsbWFkZGF0YS0+CiAJCQkJCWphY2tbMV0uYnV0dG9ucHJlc3NlZC50dl9zZWM7CiAJCQkJYnV0dG9ucHJlc3NmbGFnID0gMTsKIAkJCQlpZiAodGltZWRpZmYgPiAxKSB7Ci0JCQkJCXByX2RlYnVnKCJzc3Q6IGxvbmcgcHJlc3MgZGV0ZWN0ZWRcbiIpOworCQkJCQlwcl9kZWJ1ZygibG9uZyBwcmVzcyBkZXRlY3RlZFxuIik7CiAJCQkJCS8qIHNlbmQgaGVhZHBob25lIGRldGVjdC91bmRldGVjdCAqLwogCQkJCQlqYWNrID0gJmludGVsbWFkZGF0YS0+amFja1szXS5qYWNrOwogCQkJCQlwcmVzZW50ID0gMTsKIAkJCQkJamFja19ldmVudF9mbGFnID0gMTsKIAkJCQl9IGVsc2UgewotCQkJCQlwcl9kZWJ1Zygic3N0OiBzaG9ydCBwcmVzcyBkZXRlY3RlZFxuIik7CisJCQkJCXByX2RlYnVnKCJzaG9ydCBwcmVzcyBkZXRlY3RlZFxuIik7CiAJCQkJCS8qIHNlbmQgaGVhZHBob25lIGRldGVjdC91bmRldGVjdCAqLwogCQkJCQlqYWNrID0gJmludGVsbWFkZGF0YS0+amFja1syXS5qYWNrOwogCQkJCQlwcmVzZW50ID0gMTsKQEAgLTY2NywyNCArNjY1LDI0IEBACiAJCXNjX2FjY2Vzc19yZWFkLnJlZ19hZGRyID0gMHgxMzI7CiAJCXNzdF9zY19yZWdfYWNjZXNzKCZzY19hY2Nlc3NfcmVhZCwgUE1JQ19SRUFELCAxKTsKIAkJdmFsdWUgPSAoc2NfYWNjZXNzX3JlYWQudmFsdWUpOwotCQlwcl9kZWJ1Zygic3N0OiB2YWx1ZSByZXR1cm5lZCA9IDB4JXhcbiIsIHZhbHVlKTsKKwkJcHJfZGVidWcoInZhbHVlIHJldHVybmVkID0gMHgleFxuIiwgdmFsdWUpOwogCX0KIAlpZiAoaW50c3RzICYgMHgxKSB7Ci0JCXByX2RlYnVnKCJzc3Q6IGhlYWRzZXQgZGV0ZWN0ZWRcbiIpOworCQlwcl9kZWJ1ZygiaGVhZHNldCBkZXRlY3RlZFxuIik7CiAJCS8qIHNlbmQgaGVhZHNldCBkZXRlY3QvdW5kZXRlY3QgKi8KIAkJamFjayA9ICZpbnRlbG1hZGRhdGEtPmphY2tbMV0uamFjazsKIAkJcHJlc2VudCA9ICh2YWx1ZSA9PSAweDEpID8gMSA6IDA7CiAJCWphY2tfZXZlbnRfZmxhZyA9IDE7CiAJfQogCWlmIChpbnRzdHMgJiAweDIpIHsKLQkJcHJfZGVidWcoInNzdDogaGVhZHBob25lIGRldGVjdGVkXG4iKTsKKwkJcHJfZGVidWcoImhlYWRwaG9uZSBkZXRlY3RlZFxuIik7CiAJCS8qIHNlbmQgaGVhZHBob25lIGRldGVjdC91bmRldGVjdCAqLwogCQlqYWNrID0gJmludGVsbWFkZGF0YS0+amFja1swXS5qYWNrOwogCQlwcmVzZW50ID0gKHZhbHVlID09IDB4MikgPyAxIDogMDsKIAkJamFja19ldmVudF9mbGFnID0gMTsKIAl9CiAJaWYgKGludHN0cyAmIDB4NCkgewotCQlwcl9kZWJ1Zygic3N0OiBzaG9ydCBwdXNoIGRldGVjdGVkXG4iKTsKKwkJcHJfZGVidWcoInNob3J0IHB1c2ggZGV0ZWN0ZWRcbiIpOwogCQkvKiBzZW5kIHNob3J0IHB1c2ggKi8KIAkJamFjayA9ICZpbnRlbG1hZGRhdGEtPmphY2tbMl0uamFjazsKIAkJcHJlc2VudCA9IDE7CkBAIC02OTIsNyArNjkwLDcgQEAKIAkJYnV0dG9ucHJlc3NmbGFnID0gMTsKIAl9CiAJaWYgKGludHN0cyAmIDB4OCkgewotCQlwcl9kZWJ1Zygic3N0OiBsb25nIHB1c2ggZGV0ZWN0ZWRcbiIpOworCQlwcl9kZWJ1ZygibG9uZyBwdXNoIGRldGVjdGVkXG4iKTsKIAkJLyogc2VuZCBsb25nIHB1c2ggKi8KIAkJamFjayA9ICZpbnRlbG1hZGRhdGEtPmphY2tbM10uamFjazsKIAkJcHJlc2VudCA9IDE7CkBAIC03MzgsMTIgKzczNiwxMiBAQAogCXUzMiByZWdiYXNlID0gQVVESU5UX0JBU0UsIHJlZ3NpemUgPSA4OwogCWNoYXIgKmRydl9uYW1lOwogCi0JcHJfZGVidWcoInNzdDogaXJxIHJlZyBkb25lLCByZWdiYXNlIDB4JXgsIHJlZ3NpemUgMHgleFxuIiwKKwlwcl9kZWJ1ZygiaXJxIHJlZyBkb25lLCByZWdiYXNlIDB4JXgsIHJlZ3NpemUgMHgleFxuIiwKIAkJCQkJcmVnYmFzZSwgcmVnc2l6ZSk7CiAJaW50ZWxtYWRkYXRhLT5pbnRfYmFzZSA9IGlvcmVtYXBfbm9jYWNoZShyZWdiYXNlLCByZWdzaXplKTsKIAlpZiAoIWludGVsbWFkZGF0YS0+aW50X2Jhc2UpCi0JCXByX2Vycigic3N0OiBNYXBwaW5nIG9mIGNhY2hlIGZhaWxlZFxuIik7Ci0JcHJfZGVidWcoInNzdDogaXJxID0gMHgleFxuIiwgaW50ZWxtYWRkYXRhLT5pcnEpOworCQlwcl9lcnIoIk1hcHBpbmcgb2YgY2FjaGUgZmFpbGVkXG4iKTsKKwlwcl9kZWJ1ZygiaXJxID0gMHgleFxuIiwgaW50ZWxtYWRkYXRhLT5pcnEpOwogCWlmIChpbnRlbG1hZGRhdGEtPmNwdV9pZCA9PSBDUFVfQ0hJUF9QRU5XRUxMKQogCQlkcnZfbmFtZSA9IERSSVZFUl9OQU1FX01GTEQ7CiAJZWxzZQpAQCAtNzUzLDcgKzc1MSw3IEBACiAJCQkJSVJRRl9TSEFSRUQsIGRydl9uYW1lLAogCQkJCWludGVsbWFkZGF0YSk7CiAJaWYgKHJldF92YWwpCi0JCXByX2Vycigic3N0OiBjYW5ub3QgcmVnaXN0ZXIgSVJRXG4iKTsKKwkJcHJfZXJyKCJjYW5ub3QgcmVnaXN0ZXIgSVJRXG4iKTsKIAlyZXR1cm4gcmV0X3ZhbDsKIH0KIApAQCAtNzc1LDEwICs3NzMsMTAgQEAKIAkJaWYgKHJldF92YWwpCiAJCQlyZXR1cm4gcmV0X3ZhbDsKIAkJc3N0X2NhcmRfdmVuZG9yX2lkID0gKHZlbmRvcl9hZGRyLnZhbHVlICYgKE1BU0syfE1BU0sxfE1BU0swKSk7Ci0JCXByX2RlYnVnKCJzc3Q6IG9yZ2luYWwgbiBleHRyYXRlZCB2ZW5kb3IgaWQgPSAweCV4ICVkXG4iLAorCQlwcl9kZWJ1Zygib3JnaW5hbCBuIGV4dHJhdGVkIHZlbmRvciBpZCA9IDB4JXggJWRcbiIsCiAJCQkJdmVuZG9yX2FkZHIudmFsdWUsIHNzdF9jYXJkX3ZlbmRvcl9pZCk7CiAJCWlmIChzc3RfY2FyZF92ZW5kb3JfaWQgPCAwIHx8IHNzdF9jYXJkX3ZlbmRvcl9pZCA+IDIpIHsKLQkJCXByX2Vycigic3N0OiB2ZW5kb3IgY2FyZCBub3Qgc3VwcG9ydGVkISFcbiIpOworCQkJcHJfZXJyKCJ2ZW5kb3IgY2FyZCBub3Qgc3VwcG9ydGVkISFcbiIpOwogCQkJcmV0dXJuIC1FSU87CiAJCX0KIAl9IGVsc2UKQEAgLTgwMSw3ICs3OTksNyBAQAogCS8qIHJlZ2lzdGVyaW5nIHdpdGggU1NUIGRyaXZlciB0byBnZXQgYWNjZXNzIHRvIFNTVCBBUElzIHRvIHVzZSAqLwogCXJldF92YWwgPSByZWdpc3Rlcl9zc3RfY2FyZChpbnRlbG1hZGRhdGEtPnNzdGRydl9vcHMpOwogCWlmIChyZXRfdmFsKSB7Ci0JCXByX2Vycigic3N0OiBzc3QgY2FyZCByZWdpc3RyYXRpb24gZmFpbGVkXG4iKTsKKwkJcHJfZXJyKCJzc3QgY2FyZCByZWdpc3RyYXRpb24gZmFpbGVkXG4iKTsKIAkJcmV0dXJuIHJldF92YWw7CiAJfQogCkBAIC04MzIsNyArODMwLDcgQEAKIAljaGFyIG5hbWVbMzJdID0gSU5URUxfTUFEOwogCXN0cnVjdCBzbmRfcGNtX29wcyAqcGJfb3BzID0gTlVMTCwgKmNhcF9vcHMgPSBOVUxMOwogCi0JcHJfZGVidWcoInNzdDogY2FsbGVkIGZvciBwYiAlZCwgY3AgJWQsIGlkeCAlZFxuIiwgcGIsIGNhcCwgaW5kZXgpOworCXByX2RlYnVnKCJjYWxsZWQgZm9yIHBiICVkLCBjcCAlZCwgaWR4ICVkXG4iLCBwYiwgY2FwLCBpbmRleCk7CiAJcmV0X3ZhbCA9IHNuZF9wY21fbmV3KGNhcmQsIG5hbWUsIGluZGV4LCBwYiwgY2FwLCAmcGNtKTsKIAlpZiAocmV0X3ZhbCkKIAkJcmV0dXJuIHJldF92YWw7CkBAIC04NzgsNyArODc2LDcgQEAKIAogCVdBUk5fT04oIWNhcmQpOwogCVdBUk5fT04oIWludGVsbWFkZGF0YSk7Ci0JcHJfZGVidWcoInNzdDogc25kX2ludGVsbWFkX3BjbSBjYWxsZWRcbiIpOworCXByX2RlYnVnKCJzbmRfaW50ZWxtYWRfcGNtIGNhbGxlZFxuIik7CiAJcmV0X3ZhbCA9IHNuZF9pbnRlbG1hZF9wY21fbmV3KGNhcmQsIGludGVsbWFkZGF0YSwgMSwgMSwgMCk7CiAJaWYgKGludGVsbWFkZGF0YS0+Y3B1X2lkID09IENQVV9DSElQX0xJTkNST0ZUKQogCQlyZXR1cm4gcmV0X3ZhbDsKQEAgLTkwMyw3ICs5MDEsNyBAQAogCXN0cnVjdCBzbmRfamFjayAqamFjazsKIAlpbnQgcmV0dmFsOwogCi0JcHJfZGVidWcoInNzdDogc25kX2ludGVsbWFkX2phY2sgY2FsbGVkXG4iKTsKKwlwcl9kZWJ1Zygic25kX2ludGVsbWFkX2phY2sgY2FsbGVkXG4iKTsKIAlqYWNrID0gJmludGVsbWFkZGF0YS0+amFja1swXS5qYWNrOwogCXJldHZhbCA9IHNuZF9qYWNrX25ldyhpbnRlbG1hZGRhdGEtPmNhcmQsICJIZWFkcGhvbmUiLAogCQkJCVNORF9KQUNLX0hFQURQSE9ORSwgJmphY2spOwpAQCAtOTgyLDkgKzk4MCw5IEBACiAJCXJldF92YWwgPSBzbmRfY3RsX2FkZChjYXJkLAogCQkJCXNuZF9jdGxfbmV3MSgmY29udHJvbHNbaWR4XSwKIAkJCQlpbnRlbG1hZGRhdGEpKTsKLQkJcHJfZGVidWcoInNzdDogbWl4ZXJbaWR4XT0lZCBhZGRlZFxuIiwgaWR4KTsKKwkJcHJfZGVidWcoIm1peGVyW2lkeF09JWQgYWRkZWRcbiIsIGlkeCk7CiAJCWlmIChyZXRfdmFsKSB7Ci0JCQlwcl9lcnIoInNzdDogaW4gYWRkaW5nIG9mIGNvbnRyb2wgaW5kZXggPSAlZFxuIiwgaWR4KTsKKwkJCXByX2VycigiaW4gYWRkaW5nIG9mIGNvbnRyb2wgaW5kZXggPSAlZFxuIiwgaWR4KTsKIAkJCWJyZWFrOwogCQl9CiAJfQpAQCAtOTk5LDcgKzk5Nyw3IEBACiAKIAlpbnRlbG1hZGRhdGEgPSBkZXZpY2UtPmRldmljZV9kYXRhOwogCi0JcHJfZGVidWcoInNzdDogc25kX2ludGVsbWFkX2Rldl9mcmVlIGNhbGxlZFxuIik7CisJcHJfZGVidWcoInNuZF9pbnRlbG1hZF9kZXZfZnJlZSBjYWxsZWRcbiIpOwogCXNuZF9jYXJkX2ZyZWUoaW50ZWxtYWRkYXRhLT5jYXJkKTsKIAkvKmdlbmxfdW5yZWdpc3Rlcl9mYW1pbHkoJmF1ZGlvX2V2ZW50X2dlbmxfZmFtaWx5KTsqLwogCXVucmVnaXN0ZXJfc3N0X2NhcmQoaW50ZWxtYWRkYXRhLT5zc3RkcnZfb3BzKTsKQEAgLTEwNDAsMjMgKzEwMzgsMjMgQEAKIAljb25zdCBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlX2lkICppZCA9IHBsYXRmb3JtX2dldF9kZXZpY2VfaWQocGRldik7CiAJdW5zaWduZWQgaW50IGNwdV9pZCA9ICh1bnNpZ25lZCBpbnQpaWQtPmRyaXZlcl9kYXRhOwogCi0JcHJfZGVidWcoInNzdDogcHJvYmUgZm9yICVzIGNwdV9pZCAlZFxuIiwgcGRldi0+bmFtZSwgY3B1X2lkKTsKKwlwcl9kZWJ1ZygicHJvYmUgZm9yICVzIGNwdV9pZCAlZFxuIiwgcGRldi0+bmFtZSwgY3B1X2lkKTsKIAlpZiAoIXN0cmNtcChwZGV2LT5uYW1lLCBEUklWRVJfTkFNRV9NUlNUKSkKLQkJcHJfZGVidWcoInNzdDogZGV0ZWN0ZWQgTVJTVFxuIik7CisJCXByX2RlYnVnKCJkZXRlY3RlZCBNUlNUXG4iKTsKIAllbHNlIGlmICghc3RyY21wKHBkZXYtPm5hbWUsIERSSVZFUl9OQU1FX01GTEQpKQotCQlwcl9kZWJ1Zygic3N0OiBkZXRlY3RlZCBNRkxEXG4iKTsKKwkJcHJfZGVidWcoImRldGVjdGVkIE1GTERcbiIpOwogCWVsc2UgewotCQlwcl9lcnIoInNzdDogZGV0ZWN0ZWQgdW5rbm93biBkZXZpY2UgYWJvcnQhIVxuIik7CisJCXByX2VycigiZGV0ZWN0ZWQgdW5rbm93biBkZXZpY2UgYWJvcnQhIVxuIik7CiAJCXJldHVybiAtRUlPOwogCX0KIAlpZiAoKGNwdV9pZCA8IENQVV9DSElQX0xJTkNST0ZUKSB8fCAoY3B1X2lkID4gQ1BVX0NISVBfUEVOV0VMTCkpIHsKLQkJcHJfZXJyKCJzc3Q6IGRldGVjdGVkIHVua25vd24gY3B1X2lkIGFib3J0ISFcbiIpOworCQlwcl9lcnIoImRldGVjdGVkIHVua25vd24gY3B1X2lkIGFib3J0ISFcbiIpOwogCQlyZXR1cm4gLUVJTzsKIAl9CiAJLyogYWxsb2NhdGUgbWVtb3J5IGZvciBzYXZpbmcgaW50ZXJuYWwgY29udGV4dCBhbmQgd29ya2luZyAqLwogCWludGVsbWFkZGF0YSA9IGt6YWxsb2Moc2l6ZW9mKCppbnRlbG1hZGRhdGEpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWludGVsbWFkZGF0YSkgewotCQlwcl9kZWJ1Zygic3N0OiBtZW0gYWxsb2N0biBmYWlsXG4iKTsKKwkJcHJfZGVidWcoIm1lbSBhbGxvY3RuIGZhaWxcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKQEAgLTEwNjQsNyArMTA2Miw3IEBACiAJaW50ZWxtYWRkYXRhLT5zc3RkcnZfb3BzID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGludGVsX3NzdF9jYXJkX29wcyksCiAJCQkJCUdGUF9LRVJORUwpOwogCWlmICghaW50ZWxtYWRkYXRhLT5zc3RkcnZfb3BzKSB7Ci0JCXByX2Vycigic3N0OiBtZW0gYWxsb2NhdGlvbiBmb3Igb3BzIGZhaWxcbiIpOworCQlwcl9lcnIoIm1lbSBhbGxvY2F0aW9uIGZvciBvcHMgZmFpbFxuIik7CiAJCWtmcmVlKGludGVsbWFkZGF0YSk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KQEAgLTEwNzMsNyArMTA3MSw3IEBACiAJLyogY3JlYXRlIGEgY2FyZCBpbnN0YW5jZSB3aXRoIEFMU0EgZnJhbWV3b3JrICovCiAJcmV0X3ZhbCA9IHNuZF9jYXJkX2NyZWF0ZShjYXJkX2luZGV4LCBjYXJkX2lkLCBUSElTX01PRFVMRSwgMCwgJmNhcmQpOwogCWlmIChyZXRfdmFsKSB7Ci0JCXByX2Vycigic3N0OiBzbmRfY2FyZF9jcmVhdGUgZmFpbFxuIik7CisJCXByX2Vycigic25kX2NhcmRfY3JlYXRlIGZhaWxcbiIpOwogCQlnb3RvIGZyZWVfYWxsb2NzOwogCX0KIApAQCAtMTA5Miw3ICsxMDkwLDcgQEAKIAkvKiByZWdpc3RlcmluZyB3aXRoIExQRSBkcml2ZXIgdG8gZ2V0IGFjY2VzcyB0byBTU1QgQVBJcyB0byB1c2UgKi8KIAlyZXRfdmFsID0gc25kX2ludGVsbWFkX3NzdF9yZWdpc3RlcihpbnRlbG1hZGRhdGEpOwogCWlmIChyZXRfdmFsKSB7Ci0JCXByX2Vycigic3N0OiBzbmRfaW50ZWxtYWRfc3N0X3JlZ2lzdGVyIGZhaWxlZFxuIik7CisJCXByX2Vycigic25kX2ludGVsbWFkX3NzdF9yZWdpc3RlciBmYWlsZWRcbiIpOwogCQlnb3RvIGZyZWVfYWxsb2NzOwogCX0KIApAQCAtMTEwMCwxOSArMTA5OCwxOSBAQAogCiAJcmV0X3ZhbCA9IHNuZF9pbnRlbG1hZF9wY20oY2FyZCwgaW50ZWxtYWRkYXRhKTsKIAlpZiAocmV0X3ZhbCkgewotCQlwcl9lcnIoInNzdDogc25kX2ludGVsbWFkX3BjbSBmYWlsZWRcbiIpOworCQlwcl9lcnIoInNuZF9pbnRlbG1hZF9wY20gZmFpbGVkXG4iKTsKIAkJZ290byBmcmVlX2FsbG9jczsKIAl9CiAKIAlyZXRfdmFsID0gc25kX2ludGVsbWFkX21peGVyKGludGVsbWFkZGF0YSk7CiAJaWYgKHJldF92YWwpIHsKLQkJcHJfZXJyKCJzc3Q6IHNuZF9pbnRlbG1hZF9taXhlciBmYWlsZWRcbiIpOworCQlwcl9lcnIoInNuZF9pbnRlbG1hZF9taXhlciBmYWlsZWRcbiIpOwogCQlnb3RvIGZyZWVfYWxsb2NzOwogCX0KIAogCXJldF92YWwgPSBzbmRfaW50ZWxtYWRfamFjayhpbnRlbG1hZGRhdGEpOwogCWlmIChyZXRfdmFsKSB7Ci0JCXByX2Vycigic3N0OiBzbmRfaW50ZWxtYWRfamFjayBmYWlsZWRcbiIpOworCQlwcl9lcnIoInNuZF9pbnRlbG1hZF9qYWNrIGZhaWxlZFxuIik7CiAJCWdvdG8gZnJlZV9hbGxvY3M7CiAJfQogCkBAIC0xMTI2LDMxICsxMTI0LDMxIEBACiAKIAlyZXRfdmFsID0gc25kX2ludGVsbWFkX3JlZ2lzdGVyX2lycShpbnRlbG1hZGRhdGEpOwogCWlmIChyZXRfdmFsKSB7Ci0JCXByX2Vycigic3N0OiBzbmRfaW50ZWxtYWRfcmVnaXN0ZXJfaXJxIGZhaWxcbiIpOworCQlwcl9lcnIoInNuZF9pbnRlbG1hZF9yZWdpc3Rlcl9pcnEgZmFpbFxuIik7CiAJCWdvdG8gZnJlZV9hbGxvY3M7CiAJfQogCiAJLyogaW50ZXJuYWwgZnVuY3Rpb24gY2FsbCB0byByZWdpc3RlciBkZXZpY2Ugd2l0aCBBTFNBICovCiAJcmV0X3ZhbCA9IHNuZF9pbnRlbG1hZF9jcmVhdGUoaW50ZWxtYWRkYXRhLCBjYXJkKTsKIAlpZiAocmV0X3ZhbCkgewotCQlwcl9lcnIoInNzdDogc25kX2ludGVsbWFkX2NyZWF0ZSBmYWlsZWRcbiIpOworCQlwcl9lcnIoInNuZF9pbnRlbG1hZF9jcmVhdGUgZmFpbGVkXG4iKTsKIAkJZ290byBmcmVlX2FsbG9jczsKIAl9CiAJY2FyZC0+cHJpdmF0ZV9kYXRhID0gJmludGVsbWFkZGF0YTsKIAlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsICZwZGV2LT5kZXYpOwogCXJldF92YWwgPSBzbmRfY2FyZF9yZWdpc3RlcihjYXJkKTsKIAlpZiAocmV0X3ZhbCkgewotCQlwcl9lcnIoInNzdDogc25kX2NhcmRfcmVnaXN0ZXIgZmFpbGVkXG4iKTsKKwkJcHJfZXJyKCJzbmRfY2FyZF9yZWdpc3RlciBmYWlsZWRcbiIpOwogCQlnb3RvIGZyZWVfYWxsb2NzOwogCX0KIAotCXByX2RlYnVnKCJzc3Q6c25kX2ludGVsbWFkX3Byb2JlIGNvbXBsZXRlXG4iKTsKKwlwcl9kZWJ1Zygic25kX2ludGVsbWFkX3Byb2JlIGNvbXBsZXRlXG4iKTsKIAlyZXR1cm4gcmV0X3ZhbDsKIAogZnJlZV9tYWRfamFja193cToKIAlkZXN0cm95X3dvcmtxdWV1ZShpbnRlbG1hZGRhdGEtPm1hZF9qYWNrX3dxKTsKIGZyZWVfYWxsb2NzOgotCXByX2Vycigic3N0OiBwcm9iZSBmYWlsZWRcbiIpOworCXByX2VycigicHJvYmUgZmFpbGVkXG4iKTsKIAlzbmRfY2FyZF9mcmVlKGNhcmQpOwogCWtmcmVlKGludGVsbWFkZGF0YS0+c3N0ZHJ2X29wcyk7CiAJa2ZyZWUoaW50ZWxtYWRkYXRhKTsKQEAgLTEyMDAsNyArMTE5OCw3IEBACiAgKi8KIHN0YXRpYyBpbnQgX19pbml0IGFsc2FfY2FyZF9pbnRlbG1hZF9pbml0KHZvaWQpCiB7Ci0JcHJfZGVidWcoInNzdDogbWFkX2luaXQgY2FsbGVkXG4iKTsKKwlwcl9kZWJ1ZygibWFkX2luaXQgY2FsbGVkXG4iKTsKIAlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZzbmRfaW50ZWxtYWRfZHJpdmVyKTsKIH0KIApAQCAtMTIxMSw3ICsxMjA5LDcgQEAKICAqLwogc3RhdGljIHZvaWQgX19leGl0IGFsc2FfY2FyZF9pbnRlbG1hZF9leGl0KHZvaWQpCiB7Ci0JcHJfZGVidWcoInNzdDptYWRfZXhpdCBjYWxsZWRcbiIpOworCXByX2RlYnVnKCJtYWRfZXhpdCBjYWxsZWRcbiIpOwogCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3Rlcigmc25kX2ludGVsbWFkX2RyaXZlcik7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9pbnRlbF9zc3QvaW50ZWxtaWQuaCBiL2RyaXZlcnMvc3RhZ2luZy9pbnRlbF9zc3QvaW50ZWxtaWQuaAppbmRleCA4MWU3NDQ4Li4wY2UxMDMxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaW50ZWxfc3N0L2ludGVsbWlkLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2ludGVsX3NzdC9pbnRlbG1pZC5oCkBAIC0xNzgsOSArMTc4LDQgQEAKIGV4dGVybiBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbmRfaW50ZWxtYWRfY29udHJvbHNfbWZsZFtdOwogZXh0ZXJuIHN0cnVjdCBzbmRfcG1pY19vcHMgKmludGVsbWFkX3ZlbmRvcl9vcHNbXTsKIAotLyogVGhpcyBpcyBhbiBlbmFibGVyIGhvb2sgYXMgdGhlIHBsYXRmb3JtIGRldGVjdGlvbiBsb2dpYyBpc24ndCB5ZXQKLSAgIHByZXNlbnQgYW5kIGRlcGVuZHMgb24gc29tZSBmaXJtd2FyZSBhbmQgRE1JIHN1cHBvcnQgdG8gZGV0ZWN0IEFBVkEKLSAgIGRldmljZXMuIEl0IHdpbGwgdmFuaXNoIG9uY2UgdGhlIEFBVkEgcGxhdGZvcm0gc3VwcG9ydCBpcyBtZXJnZWQgKi8KLSNkZWZpbmUgaXNfYWF2YSgpCTAKLQogI2VuZGlmIC8qIF9fSU5URUxNSURfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2ludGVsX3NzdC9pbnRlbG1pZF9jdHJsLmMgYi9kcml2ZXJzL3N0YWdpbmcvaW50ZWxfc3N0L2ludGVsbWlkX2N0cmwuYwppbmRleCAwM2I0ZWNlLi42OWFmMDcwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaW50ZWxfc3N0L2ludGVsbWlkX2N0cmwuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaW50ZWxfc3N0L2ludGVsbWlkX2N0cmwuYwpAQCAtMjQsNiArMjQsOSBAQAogICogfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KICAqICBBTFNBIGRyaXZlciBoYW5kbGluZyBtaXhlciBjb250cm9scyBmb3IgSW50ZWwgTUFEIGNoaXBzZXQKICAqLworCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisKICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvY29udHJvbC5oPgogI2luY2x1ZGUgImphY2suaCIKQEAgLTIxNiw3ICsyMTksNyBAQAogCXN0cnVjdCBzbmRfaW50ZWxtYWQgKmludGVsbWFkZGF0YTsKIAlzdHJ1Y3Qgc25kX3BtaWNfb3BzICpzY2FyZF9vcHM7CiAKLQlwcl9kZWJ1Zygic3N0OiBzbmRfaW50ZWxtYWRfdm9sdW1lX2dldCBjYWxsZWRcbiIpOworCXByX2RlYnVnKCJzbmRfaW50ZWxtYWRfdm9sdW1lX2dldCBjYWxsZWRcbiIpOwogCiAJV0FSTl9PTighdXZhbCk7CiAJV0FSTl9PTigha2NvbnRyb2wpOwpAQCAtMjczLDcgKzI3Niw3IEBACiAJc3RydWN0IHNuZF9pbnRlbG1hZCAqaW50ZWxtYWRkYXRhOwogCXN0cnVjdCBzbmRfcG1pY19vcHMgKnNjYXJkX29wczsKIAotCXByX2RlYnVnKCJzc3Q6IE11dGVfZ2V0IGNhbGxlZFxuIik7CisJcHJfZGVidWcoIk11dGVfZ2V0IGNhbGxlZFxuIik7CiAKIAlXQVJOX09OKCF1dmFsKTsKIAlXQVJOX09OKCFrY29udHJvbCk7CkBAIC0zMzIsNyArMzM1LDcgQEAKIAlzdHJ1Y3Qgc25kX2ludGVsbWFkICppbnRlbG1hZGRhdGE7CiAJc3RydWN0IHNuZF9wbWljX29wcyAqc2NhcmRfb3BzOwogCi0JcHJfZGVidWcoInNzdDogdm9sdW1lIHNldCBjYWxsZWQ6JWxkICVsZFxuIiwKKwlwcl9kZWJ1Zygidm9sdW1lIHNldCBjYWxsZWQ6JWxkICVsZFxuIiwKIAkJCXV2YWwtPnZhbHVlLmludGVnZXIudmFsdWVbMF0sCiAJCQl1dmFsLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzFdKTsKIApAQCAtMzg3LDcgKzM5MCw3IEBACiAJc3RydWN0IHNuZF9pbnRlbG1hZCAqaW50ZWxtYWRkYXRhOwogCXN0cnVjdCBzbmRfcG1pY19vcHMgKnNjYXJkX29wczsKIAotCXByX2RlYnVnKCJzc3Q6IHNuZF9pbnRlbG1hZF9tdXRlX3NldCBjYWxsZWRcbiIpOworCXByX2RlYnVnKCJzbmRfaW50ZWxtYWRfbXV0ZV9zZXQgY2FsbGVkXG4iKTsKIAogCVdBUk5fT04oIXV2YWwpOwogCVdBUk5fT04oIWtjb250cm9sKTsKQEAgLTQ1NSw3ICs0NTgsNyBAQAogewogCXN0cnVjdCBzbmRfaW50ZWxtYWQgKmludGVsbWFkZGF0YTsKIAlzdHJ1Y3Qgc25kX3BtaWNfb3BzICpzY2FyZF9vcHM7Ci0JcHJfZGVidWcoInNzdDogZGV2aWNlX2dldCBjYWxsZWRcbiIpOworCXByX2RlYnVnKCJkZXZpY2VfZ2V0IGNhbGxlZFxuIik7CiAKIAlXQVJOX09OKCF1dmFsKTsKIAlXQVJOX09OKCFrY29udHJvbCk7CkBAIC00OTEsOCArNDk0LDkgQEAKIAlzdHJ1Y3Qgc25kX2ludGVsbWFkICppbnRlbG1hZGRhdGE7CiAJc3RydWN0IHNuZF9wbWljX29wcyAqc2NhcmRfb3BzOwogCWludCByZXRfdmFsID0gMCwgdmVuZG9yLCBzdGF0dXM7CisJc3RydWN0IGludGVsX3NzdF9wY21fY29udHJvbCAqcGNtX2NvbnRyb2w7CiAKLQlwcl9kZWJ1Zygic3N0OiBzbmRfaW50ZWxtYWRfZGV2aWNlX3NldCBjYWxsZWRcbiIpOworCXByX2RlYnVnKCJzbmRfaW50ZWxtYWRfZGV2aWNlX3NldCBjYWxsZWRcbiIpOwogCiAJV0FSTl9PTighdXZhbCk7CiAJV0FSTl9PTigha2NvbnRyb2wpOwpAQCAtNTE4LDE1ICs1MjIsMTMgQEAKIAljYXNlIElOUFVUX1NFTDoKIAkJdmVuZG9yID0gaW50ZWxtYWRkYXRhLT5zc3RkcnZfb3BzLT52ZW5kb3JfaWQ7CiAJCWlmICgodmVuZG9yID09IFNORF9NWCkgfHwgKHZlbmRvciA9PSBTTkRfRlMpKSB7Ci0JCQlpZiAodXZhbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID09IEhTX01JQykgeworCQkJcGNtX2NvbnRyb2wgPSBpbnRlbG1hZGRhdGEtPnNzdGRydl9vcHMtPnBjbV9jb250cm9sOworCQkJaWYgKHV2YWwtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9PSBIU19NSUMpCiAJCQkJc3RhdHVzID0gMTsKLQkJCQlpbnRlbG1hZGRhdGEtPnNzdGRydl9vcHMtPgotCQkJCWNvbnRyb2xfc2V0KFNTVF9FTkFCTEVfUlhfVElNRV9TTE9ULCAmc3RhdHVzKTsKLQkJCX0gZWxzZSB7CisJCQllbHNlCiAJCQkJc3RhdHVzID0gMDsKLQkJCQlpbnRlbG1hZGRhdGEtPnNzdGRydl9vcHMtPgotCQkJCWNvbnRyb2xfc2V0KFNTVF9FTkFCTEVfUlhfVElNRV9TTE9ULCAmc3RhdHVzKTsKLQkJCX0KKwkJCXBjbV9jb250cm9sLT5kZXZpY2VfY29udHJvbCgKKwkJCQkJU1NUX0VOQUJMRV9SWF9USU1FX1NMT1QsICZzdGF0dXMpOwogCQl9CiAJCXJldF92YWwgPSBzY2FyZF9vcHMtPnNldF9pbnB1dF9kZXYoCiAJCQkJdXZhbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9pbnRlbF9zc3QvaW50ZWxtaWRfbXNpY19jb250cm9sLmMgYi9kcml2ZXJzL3N0YWdpbmcvaW50ZWxfc3N0L2ludGVsbWlkX21zaWNfY29udHJvbC5jCmluZGV4IDRkMTc1NWUuLmRhMDkzZWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9pbnRlbF9zc3QvaW50ZWxtaWRfbXNpY19jb250cm9sLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2ludGVsX3NzdC9pbnRlbG1pZF9tc2ljX2NvbnRyb2wuYwpAQCAtMjQsNiArMjQsOCBAQAogICogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBjb250cm9sIG9wZXJhdGlvbnMgb2YgbXNpYyB2ZW5kb3JzCiAgKi8KIAorI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvZmlsZS5oPgogI2luY2x1ZGUgImludGVsX3NzdC5oIgpAQCAtODMsNyArODUsNyBAQAogCXNuZF9tc2ljX29wcy5jYXBfb24gPSAwOwogCXNuZF9tc2ljX29wcy5pbnB1dF9kZXZfaWQgPSBETUlDOyAvKmRlZiBkZXYqLwogCXNuZF9tc2ljX29wcy5vdXRwdXRfZGV2X2lkID0gU1RFUkVPX0hFQURQSE9ORTsKLQlwcl9kZWJ1Zygic3N0OiBtc2ljIGluaXQgY29tcGxldGUhIVxuIik7CisJcHJfZGVidWcoIm1zaWMgaW5pdCBjb21wbGV0ZSEhXG4iKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTczLDcgKzE3NSw3IEBACiAJCQlyZXR1cm4gcmV0dmFsOwogCX0KIAotCXByX2RlYnVnKCJzc3Q6IHBvd2VyaW5nIHVwIHBiLi4uLiBEZXZpY2UgJWRcbiIsIGRldmljZSk7CisJcHJfZGVidWcoInBvd2VyaW5nIHVwIHBiLi4uLiBEZXZpY2UgJWRcbiIsIGRldmljZSk7CiAJc3N0X3NjX3JlZ19hY2Nlc3Moc2NfYWNjZXNzMSwgUE1JQ19XUklURSwgNCk7CiAJc3dpdGNoIChkZXZpY2UpIHsKIAljYXNlIFNORF9TU1RfREVWSUNFX0hFQURTRVQ6CkBAIC0yMDUsNyArMjA3LDcgQEAKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgotCQlwcl93YXJuKCJzc3Q6IFdyb25nIERldmljZSAlZCwgc2VsZWN0ZWQgJWRcbiIsCisJCXByX3dhcm4oIldyb25nIERldmljZSAlZCwgc2VsZWN0ZWQgJWRcbiIsCiAJCQkgICAgICAgZGV2aWNlLCBzbmRfbXNpY19vcHMub3V0cHV0X2Rldl9pZCk7CiAJfQogCXJldHVybiBzc3Rfc2NfcmVnX2FjY2VzcyhzY19hY2Nlc3NfcGNtMiwgUE1JQ19SRUFEX01PRElGWSwgMSk7CkBAIC0yNjgsNyArMjcwLDcgQEAKIAkJCXJldHVybiByZXR2YWw7CiAJfQogCi0JcHJfZGVidWcoInNzdDogcG93ZXJpbmcgdXAgY3AuLi4uJWRcbiIsIHNuZF9tc2ljX29wcy5pbnB1dF9kZXZfaWQpOworCXByX2RlYnVnKCJwb3dlcmluZyB1cCBjcC4uLi4lZFxuIiwgc25kX21zaWNfb3BzLmlucHV0X2Rldl9pZCk7CiAJc3N0X3NjX3JlZ19hY2Nlc3Moc2NfYWNjZXNzMiwgUE1JQ19SRUFEX01PRElGWSwgMSk7CiAJc25kX21zaWNfb3BzLmNhcF9vbiA9IDE7CiAJaWYgKHNuZF9tc2ljX29wcy5pbnB1dF9kZXZfaWQgPT0gQU1JQykKQEAgLTI4Myw3ICsyODUsNyBAQAogewogCWludCByZXR2YWwgPSAwOwogCi0JcHJfZGVidWcoInNzdDogcG93ZXJpbmcgZG4gbXNpY1xuIik7CisJcHJfZGVidWcoInBvd2VyaW5nIGRuIG1zaWNcbiIpOwogCXNuZF9tc2ljX29wcy5wYl9vbiA9IDA7CiAJc25kX21zaWNfb3BzLmNhcF9vbiA9IDA7CiAJcmV0dXJuIHJldHZhbDsKQEAgLTI5Myw3ICsyOTUsNyBAQAogewogCWludCByZXR2YWwgPSAwOwogCi0JcHJfZGVidWcoInNzdDogcG93ZXJpbmcgZG4gcGIuLi4uXG4iKTsKKwlwcl9kZWJ1ZygicG93ZXJpbmcgZG4gcGIuLi4uXG4iKTsKIAlzbmRfbXNpY19vcHMucGJfb24gPSAwOwogCXJldHVybiByZXR2YWw7CiB9CkBAIC0zMDIsNyArMzA0LDcgQEAKIHsKIAlpbnQgcmV0dmFsID0gMDsKIAotCXByX2RlYnVnKCJzc3Q6IHBvd2VyaW5nIGRuIGNwLi4uLlxuIik7CisJcHJfZGVidWcoInBvd2VyaW5nIGRuIGNwLi4uLlxuIik7CiAJc25kX21zaWNfb3BzLmNhcF9vbiA9IDA7CiAJcmV0dXJuIHJldHZhbDsKIH0KQEAgLTMxMSw3ICszMTMsNyBAQAogewogCWludCByZXR2YWwgPSAwOwogCi0JcHJfZGVidWcoInNzdDogbXNpYyBzZXQgc2VsZWN0ZWQgb3V0cHV0OiVkXG4iLCB2YWx1ZSk7CisJcHJfZGVidWcoIm1zaWMgc2V0IHNlbGVjdGVkIG91dHB1dDolZFxuIiwgdmFsdWUpOwogCXNuZF9tc2ljX29wcy5vdXRwdXRfZGV2X2lkID0gdmFsdWU7CiAJaWYgKHNuZF9tc2ljX29wcy5wYl9vbikKIAkJbXNpY19wb3dlcl91cF9wYihTTkRfU1NUX0RFVklDRV9IRUFEU0VUKTsKQEAgLTMzMCwxNSArMzMyLDE1IEBACiAJfTsKIAlpbnQgcmV0dmFsID0gMDsKIAotCXByX2RlYnVnKCJzc3Q6IG1zaWNfc2V0X3NlbGVjdGVkX2lucHV0X2RldjolZFxuIiwgdmFsdWUpOworCXByX2RlYnVnKCJtc2ljX3NldF9zZWxlY3RlZF9pbnB1dF9kZXY6JWRcbiIsIHZhbHVlKTsKIAlzbmRfbXNpY19vcHMuaW5wdXRfZGV2X2lkID0gdmFsdWU7CiAJc3dpdGNoICh2YWx1ZSkgewogCWNhc2UgQU1JQzoKLQkJcHJfZGVidWcoInNzdDogU2VsZWN0aW5nIEFNSUMxXG4iKTsKKwkJcHJfZGVidWcoIlNlbGVjdGluZyBBTUlDMVxuIik7CiAJCXJldHZhbCA9IHNzdF9zY19yZWdfYWNjZXNzKHNjX2FjY2Vzc19hbWljLCBQTUlDX1dSSVRFLCAxKTsKIAkJYnJlYWs7CiAJY2FzZSBETUlDOgotCQlwcl9kZWJ1Zygic3N0OiBTZWxlY3RpbmcgRE1JQzFcbiIpOworCQlwcl9kZWJ1ZygiU2VsZWN0aW5nIERNSUMxXG4iKTsKIAkJcmV0dmFsID0gc3N0X3NjX3JlZ19hY2Nlc3Moc2NfYWNjZXNzX2RtaWMsIFBNSUNfV1JJVEUsIDEpOwogCQlicmVhazsKIAlkZWZhdWx0OgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2ludGVsX3NzdC9pbnRlbG1pZF9wdnQuYyBiL2RyaXZlcnMvc3RhZ2luZy9pbnRlbF9zc3QvaW50ZWxtaWRfcHZ0LmMKaW5kZXggOWVkOTQ3NS4uM2JhOWRhZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2ludGVsX3NzdC9pbnRlbG1pZF9wdnQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaW50ZWxfc3N0L2ludGVsbWlkX3B2dC5jCkBAIC0yMyw2ICsyMyw5IEBACiAgKiB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgogICogQUxTQSBkcml2ZXIgZm9yIEludGVsIE1JRCBzb3VuZCBjYXJkIGNoaXBzZXQgLSBob2xkaW5nIHByaXZhdGUgZnVuY3Rpb25zCiAgKi8KKworI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxhc20vaW50ZWxfc2N1X2lwYy5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KQEAgLTUwLDcgKzUzLDcgQEAKIAogCWlmIChzdHJlYW0tPnN0cmVhbV9zdGF0dXMgIT0gUlVOTklORykKIAkJcmV0dXJuOwotCXByX2RlYnVnKCJzc3Q6IGNhbGxpbmcgcGVyaW9kIGVsYXBzZWRcbiIpOworCXByX2RlYnVnKCJjYWxsaW5nIHBlcmlvZCBlbGFwc2VkXG4iKTsKIAlzbmRfcGNtX3BlcmlvZF9lbGFwc2VkKHN1YnN0cmVhbSk7CiAJcmV0dXJuOwogfQpAQCAtNzYsOCArNzksOCBAQAogCXBhcmFtLnVjLnBjbV9wYXJhbXMucGVyaW9kX2NvdW50ID0gc3Vic3RyZWFtLT5ydW50aW1lLT5wZXJpb2Rfc2l6ZTsKIAlwYXJhbS51Yy5wY21fcGFyYW1zLnJpbmdfYnVmZmVyX2FkZHIgPQogCQkJCXZpcnRfdG9fcGh5cyhzdWJzdHJlYW0tPnJ1bnRpbWUtPmRtYV9hcmVhKTsKLQlwcl9kZWJ1Zygic3N0OiBwZXJpb2RfY250ID0gJWRcbiIsIHBhcmFtLnVjLnBjbV9wYXJhbXMucGVyaW9kX2NvdW50KTsKLQlwcl9kZWJ1Zygic3N0OiBzZnJlcT0gJWQsIHdkX3N6ID0gJWRcbiIsCisJcHJfZGVidWcoInBlcmlvZF9jbnQgPSAlZFxuIiwgcGFyYW0udWMucGNtX3BhcmFtcy5wZXJpb2RfY291bnQpOworCXByX2RlYnVnKCJzZnJlcT0gJWQsIHdkX3N6ID0gJWRcbiIsCiAJCSBwYXJhbS51Yy5wY21fcGFyYW1zLnNmcmVxLCBwYXJhbS51Yy5wY21fcGFyYW1zLnBjbV93ZF9zeik7CiAKIAlzdHJfcGFyYW1zLnNwYXJhbXMgPSBwYXJhbTsKQEAgLTg1LDI0ICs4OCwyMiBAQAogCiAJaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spIHsKIAkJc3RyX3BhcmFtcy5vcHMgPSBTVFJFQU1fT1BTX1BMQVlCQUNLOwotCQlwcl9kZWJ1Zygic3N0OiBQbGF5YmNrIHN0cmVhbSxEZXZpY2UgJWRcbiIsIHN0cmVhbS0+ZGV2aWNlKTsKKwkJcHJfZGVidWcoIlBsYXliY2sgc3RyZWFtLERldmljZSAlZFxuIiwgc3RyZWFtLT5kZXZpY2UpOwogCX0gZWxzZSB7CiAJCXN0cl9wYXJhbXMub3BzID0gU1RSRUFNX09QU19DQVBUVVJFOwogCQlzdHJlYW0tPmRldmljZSA9IFNORF9TU1RfREVWSUNFX0NBUFRVUkU7Ci0JCXByX2RlYnVnKCJzc3Q6IENhcHR1cmUgc3RyZWFtLERldmljZSAlZFxuIiwgc3RyZWFtLT5kZXZpY2UpOworCQlwcl9kZWJ1ZygiQ2FwdHVyZSBzdHJlYW0sRGV2aWNlICVkXG4iLCBzdHJlYW0tPmRldmljZSk7CiAJfQogCXN0cl9wYXJhbXMuZGV2aWNlX3R5cGUgPSBzdHJlYW0tPmRldmljZTsKLQlyZXRfdmFsID0gaW50ZWxtYWRkYXRhLT5zc3RkcnZfb3BzLT5jb250cm9sX3NldChTU1RfU05EX0FMTE9DLAotCQkJCQkmc3RyX3BhcmFtcyk7Ci0JcHJfZGVidWcoInNzdDogU1NUX1NORF9QTEFZL0NBUFRVUkUgcmV0X3ZhbCA9ICV4XG4iLAotCQkJcmV0X3ZhbCk7CisJcmV0X3ZhbCA9IGludGVsbWFkZGF0YS0+c3N0ZHJ2X29wcy0+cGNtX2NvbnRyb2wtPm9wZW4oJnN0cl9wYXJhbXMpOworCXByX2RlYnVnKCJzc3Q6IFNTVF9TTkRfUExBWS9DQVBUVVJFIHJldF92YWwgPSAleFxuIiwgcmV0X3ZhbCk7CiAJaWYgKHJldF92YWwgPCAwKQogCQlyZXR1cm4gcmV0X3ZhbDsKIAogCXN0cmVhbS0+c3RyZWFtX2luZm8uc3RyX2lkID0gcmV0X3ZhbDsKIAlzdHJlYW0tPnN0cmVhbV9zdGF0dXMgPSBJTklUOwogCXN0cmVhbS0+c3RyZWFtX2luZm8uYnVmZmVyX3B0ciA9IDA7Ci0JcHJfZGVidWcoInNzdDogc3RyIGlkIDogICVkXG4iLCBzdHJlYW0tPnN0cmVhbV9pbmZvLnN0cl9pZCk7CisJcHJfZGVidWcoInN0ciBpZCA6ICAlZFxuIiwgc3RyZWFtLT5zdHJlYW1faW5mby5zdHJfaWQpOwogCiAJcmV0dXJuIHJldF92YWw7CiB9CkBAIC0xMTMsMTUgKzExNCwxNSBAQAogCXN0cnVjdCBzbmRfaW50ZWxtYWQgKmludGVsbWFkZGF0YSA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKIAlpbnQgcmV0X3ZhbDsKIAotCXByX2RlYnVnKCJzc3Q6IHNldHRpbmcgYnVmZmVyIHB0ciBwYXJhbVxuIik7CisJcHJfZGVidWcoInNldHRpbmcgYnVmZmVyIHB0ciBwYXJhbVxuIik7CiAJc3RyZWFtLT5zdHJlYW1faW5mby5wZXJpb2RfZWxhcHNlZCA9IHBlcmlvZF9lbGFwc2VkOwogCXN0cmVhbS0+c3RyZWFtX2luZm8ubWFkX3N1YnN0cmVhbSA9IHN1YnN0cmVhbTsKIAlzdHJlYW0tPnN0cmVhbV9pbmZvLmJ1ZmZlcl9wdHIgPSAwOwogCXN0cmVhbS0+c3RyZWFtX2luZm8uc2ZyZXEgPSBzdWJzdHJlYW0tPnJ1bnRpbWUtPnJhdGU7Ci0JcmV0X3ZhbCA9IGludGVsbWFkZGF0YS0+c3N0ZHJ2X29wcy0+Y29udHJvbF9zZXQoU1NUX1NORF9TVFJFQU1fSU5JVCwKLQkJCQkJJnN0cmVhbS0+c3RyZWFtX2luZm8pOworCXJldF92YWwgPSBpbnRlbG1hZGRhdGEtPnNzdGRydl9vcHMtPnBjbV9jb250cm9sLT5kZXZpY2VfY29udHJvbCgKKwkJCVNTVF9TTkRfU1RSRUFNX0lOSVQsICZzdHJlYW0tPnN0cmVhbV9pbmZvKTsKIAlpZiAocmV0X3ZhbCkKLQkJcHJfZXJyKCJzc3Q6IGNvbnRyb2xfc2V0IHJldCBlcnJvciAlZFxuIiwgcmV0X3ZhbCk7CisJCXByX2VycigiY29udHJvbF9zZXQgcmV0IGVycm9yICVkXG4iLCByZXRfdmFsKTsKIAlyZXR1cm4gcmV0X3ZhbDsKIAogfQpAQCAtMTQ1LDMwICsxNDYsMjkgQEAKIAkJZm9yIChpID0gMDsgaSA8IG51bV92YWw7IGkrKykgewogCQkJcmV0dmFsID0gaW50ZWxfc2N1X2lwY19pb3dyaXRlOChzY19hY2Nlc3NbaV0ucmVnX2FkZHIsCiAJCQkJCQkJc2NfYWNjZXNzW2ldLnZhbHVlKTsKLQkJCWlmIChyZXR2YWwpIHsKLQkJCQlwcl9lcnIoInNzdDogSVBDIHdyaXRlIGZhaWxlZCEhISAlZFxuIiwgcmV0dmFsKTsKLQkJCQlyZXR1cm4gcmV0dmFsOwotCQkJfQorCQkJaWYgKHJldHZhbCkKKwkJCQlnb3RvIGVycjsKIAkJfQogCX0gZWxzZSBpZiAodHlwZSA9PSBQTUlDX1JFQUQpIHsKIAkJZm9yIChpID0gMDsgaSA8IG51bV92YWw7IGkrKykgewogCQkJcmV0dmFsID0gaW50ZWxfc2N1X2lwY19pb3JlYWQ4KHNjX2FjY2Vzc1tpXS5yZWdfYWRkciwKIAkJCQkJCQkmKHNjX2FjY2Vzc1tpXS52YWx1ZSkpOwotCQkJaWYgKHJldHZhbCkgewotCQkJCXByX2Vycigic3N0OiBJUEMgcmVhZCBmYWlsZWQhISEhISVkXG4iLCByZXR2YWwpOwotCQkJCXJldHVybiByZXR2YWw7Ci0JCQl9CisJCQlpZiAocmV0dmFsKQorCQkJCWdvdG8gZXJyOwogCQl9CiAJfSBlbHNlIHsKIAkJZm9yIChpID0gMDsgaSA8IG51bV92YWw7IGkrKykgewogCQkJcmV0dmFsID0gaW50ZWxfc2N1X2lwY191cGRhdGVfcmVnaXN0ZXIoCiAJCQkJc2NfYWNjZXNzW2ldLnJlZ19hZGRyLCBzY19hY2Nlc3NbaV0udmFsdWUsCiAJCQkJc2NfYWNjZXNzW2ldLm1hc2spOwotCQkJaWYgKHJldHZhbCkgewotCQkJCXByX2Vycigic3N0OiBJUEMgTW9kaWZ5IGZhaWxlZCEhISVkXG4iLCByZXR2YWwpOwotCQkJCXJldHVybiByZXR2YWw7Ci0JCQl9CisJCQlpZiAocmV0dmFsKQorCQkJCWdvdG8gZXJyOwogCQl9CiAJfQotCXJldHVybiByZXR2YWw7CisJcmV0dXJuIDA7CitlcnI6CisJcHJfZXJyKCJJUEMgZmFpbGVkIGZvciBjbWQgJWQsICVkXG4iLCByZXR2YWwsIHR5cGUpOworCXByX2VycigicmVnOjB4JTJ4IGFkZHI6MHglMnhcbiIsCisJCXNjX2FjY2Vzc1tpXS5yZWdfYWRkciwgc2NfYWNjZXNzW2ldLnZhbHVlKTsKKyAJcmV0dXJuIHJldHZhbDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9pbnRlbF9zc3QvaW50ZWxtaWRfdjBfY29udHJvbC5jIGIvZHJpdmVycy9zdGFnaW5nL2ludGVsX3NzdC9pbnRlbG1pZF92MF9jb250cm9sLmMKaW5kZXggZjU4NmQ2Mi4uNzg1OTIyNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2ludGVsX3NzdC9pbnRlbG1pZF92MF9jb250cm9sLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2ludGVsX3NzdC9pbnRlbG1pZF92MF9jb250cm9sLmMKQEAgLTI2LDYgKzI2LDggQEAKICAqICBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGNvbnRyb2wgb3BlcmF0aW9ucyBvZiB2ZW5kb3IgMQogICovCiAKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKwogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KICNpbmNsdWRlICJpbnRlbF9zc3QuaCIKQEAgLTE1MSw3ICsxNTMsNyBAQAogCWlmIChyZXR2YWwpCiAJCXJldHVybiByZXR2YWw7CiAKLQlwcl9kZWJ1Zygic3N0OiBpbiBmcyBwb3dlciB1cCBwYlxuIik7CisJcHJfZGVidWcoImluIGZzIHBvd2VyIHVwIHBiXG4iKTsKIAlyZXR1cm4gZnNfZW5hYmxlX2F1ZGlvZGFjKFVOTVVURSk7CiB9CiAKQEAgLTE3Myw3ICsxNzUsNyBAQAogCWlmIChyZXR2YWwpCiAJCXJldHVybiByZXR2YWw7CiAKLQlwcl9kZWJ1Zygic3N0OiBpbiBmc2wgcG93ZXIgZG93biBwYlxuIik7CisJcHJfZGVidWcoImluIGZzbCBwb3dlciBkb3duIHBiXG4iKTsKIAlyZXR1cm4gZnNfZW5hYmxlX2F1ZGlvZGFjKFVOTVVURSk7CiB9CiAKQEAgLTM4MCw3ICszODIsNyBAQAogCQlzc3Rfc2NfcmVnX2FjY2VzcyhzY19hY2Nlc3MsIFBNSUNfUkVBRF9NT0RJRlksIDIpOwogCiAJfQotCXByX2RlYnVnKCJzc3Q6IHNmcmVxOiVkLFJlZ2lzdGVyIHZhbHVlID0gJXhcbiIsIHNmcmVxLCBjb25maWcxKTsKKwlwcl9kZWJ1Zygic2ZyZXE6JWQsUmVnaXN0ZXIgdmFsdWUgPSAleFxuIiwgc2ZyZXEsIGNvbmZpZzEpOwogCiAJaWYgKHdvcmRfc2l6ZSA9PSAyNCkgewogCQlzY19hY2Nlc3NbMF0ucmVnX2FkZHIgID0gQVVESU9QT1JUMTsKQEAgLTQzOCwxOCArNDQwLDE4IEBACiAKIAlzd2l0Y2ggKHZhbHVlKSB7CiAJY2FzZSBBTUlDOgotCQlwcl9kZWJ1Zygic3N0OiBTZWxlY3RpbmcgYW1pYyBub3Qgc3VwcG9ydGVkIGluIG1vbm8gY2ZnXG4iKTsKKwkJcHJfZGVidWcoIlNlbGVjdGluZyBhbWljIG5vdCBzdXBwb3J0ZWQgaW4gbW9ubyBjZmdcbiIpOwogCQlyZXR1cm4gc3N0X3NjX3JlZ19hY2Nlc3Moc2NfYWNjZXNzX21pYywgUE1JQ19SRUFEX01PRElGWSwgMik7CiAJCWJyZWFrOwogCiAJY2FzZSBIU19NSUM6Ci0JCXByX2RlYnVnKCJzc3Q6IFNlbGVjdGluZyBoc21pY1xuIik7CisJCXByX2RlYnVnKCJTZWxlY3RpbmcgaHNtaWNcbiIpOwogCQlyZXR1cm4gc3N0X3NjX3JlZ19hY2Nlc3Moc2NfYWNjZXNzX2hzbWljLAogCQkJCVBNSUNfUkVBRF9NT0RJRlksIDIpOwogCQlicmVhazsKIAogCWNhc2UgRE1JQzoKLQkJcHJfZGVidWcoInNzdDogU2VsZWN0aW5nIGRtaWNcbiIpOworCQlwcl9kZWJ1ZygiU2VsZWN0aW5nIGRtaWNcbiIpOwogCQlyZXR1cm4gc3N0X3NjX3JlZ19hY2Nlc3Moc2NfYWNjZXNzX2RtaWMsIFBNSUNfUkVBRF9NT0RJRlksIDIpOwogCQlicmVhazsKIApAQCAtNTA1LDcgKzUwNyw3IEBACiAJCXJldHVybiByZXR2YWw7CiAKIAotCXByX2RlYnVnKCJzc3Q6IGRldl9pZDoweCV4IHZhbHVlOjB4JXhcbiIsIGRldl9pZCwgdmFsdWUpOworCXByX2RlYnVnKCJkZXZfaWQ6MHgleCB2YWx1ZToweCV4XG4iLCBkZXZfaWQsIHZhbHVlKTsKIAlzd2l0Y2ggKGRldl9pZCkgewogCWNhc2UgUE1JQ19TTkRfRE1JQ19NVVRFOgogCQlzY19hY2Nlc3NbMF0ucmVnX2FkZHIgPSBNSUNDVFJMOwpAQCAtNjA2LDcgKzYwOCw3IEBACiAKIAlzd2l0Y2ggKGRldl9pZCkgewogCWNhc2UgUE1JQ19TTkRfTEVGVF9QQl9WT0w6Ci0JCXByX2RlYnVnKCJzc3Q6IFBNSUNfU05EX0xFRlRfUEJfVk9MOiVkXG4iLCB2YWx1ZSk7CisJCXByX2RlYnVnKCJQTUlDX1NORF9MRUZUX1BCX1ZPTDolZFxuIiwgdmFsdWUpOwogCQlzY19hY2Nlc3NbMF0udmFsdWUgPSBzY19hY2Nlc3NbMV0udmFsdWUgPSB2YWx1ZTsKIAkJc2NfYWNjZXNzWzBdLnJlZ19hZGRyID0gQVVEMTY7CiAJCXNjX2FjY2Vzc1sxXS5yZWdfYWRkciA9IEFVRDE1OwpAQCAtNjE2LDcgKzYxOCw3IEBACiAJCWJyZWFrOwogCiAJY2FzZSBQTUlDX1NORF9SSUdIVF9QQl9WT0w6Ci0JCXByX2RlYnVnKCJzc3Q6IFBNSUNfU05EX1JJR0hUX1BCX1ZPTDolZFxuIiwgdmFsdWUpOworCQlwcl9kZWJ1ZygiUE1JQ19TTkRfUklHSFRfUEJfVk9MOiVkXG4iLCB2YWx1ZSk7CiAJCXNjX2FjY2Vzc1swXS52YWx1ZSA9IHNjX2FjY2Vzc1sxXS52YWx1ZSA9IHZhbHVlOwogCQlzY19hY2Nlc3NbMF0ucmVnX2FkZHIgPSBBVUQxNzsKIAkJc2NfYWNjZXNzWzFdLnJlZ19hZGRyID0gQVVEMTU7CkBAIC02MjksNyArNjMxLDcgQEAKIAkJcmVnX251bSA9IDI7CiAJCWJyZWFrOwogCWNhc2UgUE1JQ19TTkRfQ0FQVFVSRV9WT0w6Ci0JCXByX2RlYnVnKCJzc3Q6IFBNSUNfU05EX0NBUFRVUkVfVk9MOiVkXG4iLCB2YWx1ZSk7CisJCXByX2RlYnVnKCJQTUlDX1NORF9DQVBUVVJFX1ZPTDolZFxuIiwgdmFsdWUpOwogCQlzY19hY2Nlc3NbMF0ucmVnX2FkZHIgPSBNSUNMSUNUUkwxOwogCQlzY19hY2Nlc3NbMV0ucmVnX2FkZHIgPSBNSUNMSUNUUkwyOwogCQlzY19hY2Nlc3NbMl0ucmVnX2FkZHIgPSBETUlDQ1RSTDE7CkBAIC03MjYsMTcgKzcyOCwxNyBAQAogCiAJc3dpdGNoIChkZXZfaWQpIHsKIAljYXNlIFBNSUNfU05EX0NBUFRVUkVfVk9MOgotCQlwcl9kZWJ1Zygic3N0OiBQTUlDX1NORF9DQVBUVVJFX1ZPTFxuIik7CisJCXByX2RlYnVnKCJQTUlDX1NORF9DQVBUVVJFX1ZPTFxuIik7CiAJCXNjX2FjY2Vzcy5yZWdfYWRkciA9IE1JQ0xJQ1RSTDE7CiAJCW1hc2sgPSAoTUFTSzV8TUFTSzR8TUFTSzN8TUFTSzJ8TUFTSzF8TUFTSzApOwogCQlicmVhazsKIAljYXNlIFBNSUNfU05EX0xFRlRfUEJfVk9MOgotCQlwcl9kZWJ1Zygic3N0OiBQTUlDX1NORF9MRUZUX1BCX1ZPTFxuIik7CisJCXByX2RlYnVnKCJQTUlDX1NORF9MRUZUX1BCX1ZPTFxuIik7CiAJCXNjX2FjY2Vzcy5yZWdfYWRkciA9IEFVRDE2OwogCQltYXNrID0gKE1BU0s1fE1BU0s0fE1BU0szfE1BU0syfE1BU0sxfE1BU0swKTsKIAkJYnJlYWs7CiAJY2FzZSBQTUlDX1NORF9SSUdIVF9QQl9WT0w6Ci0JCXByX2RlYnVnKCJzc3Q6IFBNSUNfU05EX1JUX1BCX1ZPTFxuIik7CisJCXByX2RlYnVnKCJQTUlDX1NORF9SVF9QQl9WT0xcbiIpOwogCQlzY19hY2Nlc3MucmVnX2FkZHIgPSBBVUQxNzsKIAkJbWFzayA9IChNQVNLNXxNQVNLNHxNQVNLM3xNQVNLMnxNQVNLMXxNQVNLMCk7CiAJCWJyZWFrOwpAQCAtNzQ1LDkgKzc0Nyw5IEBACiAJfQogCiAJcmV0dmFsID0gc3N0X3NjX3JlZ19hY2Nlc3MoJnNjX2FjY2VzcywgUE1JQ19SRUFELCAxKTsKLQlwcl9kZWJ1Zygic3N0OiB2YWx1ZSByZWFkID0gMHgleFxuIiwgc2NfYWNjZXNzLnZhbHVlKTsKKwlwcl9kZWJ1ZygidmFsdWUgcmVhZCA9IDB4JXhcbiIsIHNjX2FjY2Vzcy52YWx1ZSk7CiAJKnZhbHVlID0gKGludCkgKHNjX2FjY2Vzcy52YWx1ZSAmIG1hc2spOwotCXByX2RlYnVnKCJzc3Q6IHZhbHVlIHJldHVybmVkID0gMHgleFxuIiwgKnZhbHVlKTsKKwlwcl9kZWJ1ZygidmFsdWUgcmV0dXJuZWQgPSAweCV4XG4iLCAqdmFsdWUpOwogCXJldHVybiByZXR2YWw7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9pbnRlbF9zc3QvaW50ZWxtaWRfdjFfY29udHJvbC5jIGIvZHJpdmVycy9zdGFnaW5nL2ludGVsX3NzdC9pbnRlbG1pZF92MV9jb250cm9sLmMKaW5kZXggOWRlODZiMi4uNDc4Y2ZlYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2ludGVsX3NzdC9pbnRlbG1pZF92MV9jb250cm9sLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2ludGVsX3NzdC9pbnRlbG1pZF92MV9jb250cm9sLmMKQEAgLTI1LDYgKzI1LDggQEAKICAqICBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGNvbnRyb2wgb3BlcmF0aW9ucyBvZiB2ZW5kb3IgMgogICovCiAKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKwogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KICNpbmNsdWRlIDxhc20vbXJzdC5oPgpAQCAtMTMyLDU2ICsxMzQsNiBAQAogCXJldHVybiBzc3Rfc2NfcmVnX2FjY2VzcyhzY19hY2Nlc3MsIFBNSUNfV1JJVEUsIDQ3KTsKIH0KIAotc3RhdGljIGludCBteF9pbml0X2NhcHR1cmVfY2FyZCh2b2lkKQotewotCXN0cnVjdCBzY19yZWdfYWNjZXNzIHNjX2FjY2Vzc1tdID0gewotCQl7MHgyMDYsIDB4NWEsIDB4MH0sCi0JCXsweDIwNywgMHhiZSwgMHgwfSwKLQkJezB4MjA4LCAweDkwLCAweDB9LAotCQl7MHgyMDksIDB4MzIsIDB4MH0sCi0JCXsweDIwZSwgMHgyMiwgMHgwfSwKLQkJezB4MjEwLCAweDg0LCAweDB9LAotCQl7MHgyMjMsIDB4MjAsIDB4MH0sCi0JCXsweDIyNiwgMHhDMCwgMHgwfSwKLQl9OwotCi0JaW50IHJldHZhbCA9IDA7Ci0KLQlyZXR2YWwgPSBzc3Rfc2NfcmVnX2FjY2VzcyhzY19hY2Nlc3MsIFBNSUNfV1JJVEUsIDgpOwotCWlmICgwICE9IHJldHZhbCkgewotCQkvKiBwbWljIGNvbW11bmljYXRpb24gZmFpbHMgKi8KLQkJcHJfZGVidWcoInNzdDogcG1pYyBjb21tbiBmYWlsZWRcbiIpOwotCQlyZXR1cm4gcmV0dmFsOwotCX0KLQotCXByX2RlYnVnKCJzc3Q6IENhcHR1cmUgY29uZmlndXJhdGlvbiBjb21wbGV0ZSEhXG4iKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBteF9pbml0X3BsYXliYWNrX2NhcmQodm9pZCkKLXsKLQlzdHJ1Y3Qgc2NfcmVnX2FjY2VzcyBzY19hY2Nlc3NbXSA9IHsKLQkJezB4MjA2LCAweDAwLCAweDB9LAotCQl7MHgyMDcsIDB4MDAsIDB4MH0sCi0JCXsweDIwOCwgMHgwMCwgMHgwfSwKLQkJezB4MjA5LCAweDUxLCAweDB9LAotCQl7MHgyMGUsIDB4NTEsIDB4MH0sCi0JCXsweDIxMCwgMHgyMSwgMHgwfSwKLQkJezB4MjIzLCAweDAxLCAweDB9LAotCX07Ci0JaW50IHJldHZhbCA9IDA7Ci0KLQlyZXR2YWwgPSBzc3Rfc2NfcmVnX2FjY2VzcyhzY19hY2Nlc3MsIFBNSUNfV1JJVEUsIDkpOwotCWlmICgwICE9IHJldHZhbCkgewotCQkvKiBwbWljIGNvbW11bmljYXRpb24gZmFpbHMgKi8KLQkJcHJfZGVidWcoInNzdDogcG1pYyBjb21tbiBmYWlsZWRcbiIpOwotCQlyZXR1cm4gcmV0dmFsOwotCX0KLQotCXByX2RlYnVnKCJzc3Q6IFBsYXliYWNrIGNvbmZpZ3VyYXRpb24gY29tcGxldGUhIVxuIik7Ci0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyBpbnQgbXhfZW5hYmxlX2F1ZGlvZGFjKGludCB2YWx1ZSkKIHsKIAlzdHJ1Y3Qgc2NfcmVnX2FjY2VzcyBzY19hY2Nlc3NbM107CkBAIC0yMDQsNyArMTU2LDcgQEAKIAlyZXR2YWwgPSBzc3Rfc2NfcmVnX2FjY2VzcyhzY19hY2Nlc3MsIFBNSUNfUkVBRF9NT0RJRlksIDIpOwogCWlmIChyZXR2YWwpCiAJCXJldHVybiByZXR2YWw7Ci0JcHJfZGVidWcoInNzdDogbXV0ZSBzdGF0dXMgPSAlZCIsIHNuZF9wbWljX29wc19teC5tdXRlX3N0YXR1cyk7CisJcHJfZGVidWcoIm11dGUgc3RhdHVzID0gJWRcbiIsIHNuZF9wbWljX29wc19teC5tdXRlX3N0YXR1cyk7CiAJaWYgKHNuZF9wbWljX29wc19teC5tdXRlX3N0YXR1cyA9PSBNVVRFIHx8CiAJCQkJc25kX3BtaWNfb3BzX214Lm1hc3Rlcl9tdXRlID09IE1VVEUpCiAJCXJldHVybiByZXR2YWw7CkBAIC00MTIsNyArMzY0LDcgQEAKIAkJaWYgKHJldHZhbCkKIAkJCXJldHVybiByZXR2YWw7CiAJfQotCXByX2RlYnVnKCJzc3Q6IFNTVCBEQkcgbXhfc2V0X3BjbV92b2ljZV9wYXJhbXMgY2FsbGVkXG4iKTsKKwlwcl9kZWJ1ZygiU1NUIERCRzpteF9zZXRfcGNtX3ZvaWNlX3BhcmFtcyBjYWxsZWRcbiIpOwogCXJldHVybiBzc3Rfc2NfcmVnX2FjY2VzcyhzY19hY2Nlc3MsIFBNSUNfV1JJVEUsIDQ0KTsKIH0KIApAQCAtNTI5LDcgKzQ4MSw3IEBACiAJCQlyZXR1cm4gcmV0dmFsOwogCX0KIAotCXByX2RlYnVnKCJzc3Q6IG14X3NldF9zZWxlY3RlZF9vdXRwdXRfZGV2IGRldl9pZDoweCV4XG4iLCBkZXZfaWQpOworCXByX2RlYnVnKCJteF9zZXRfc2VsZWN0ZWRfb3V0cHV0X2RldiBkZXZfaWQ6MHgleFxuIiwgZGV2X2lkKTsKIAlzbmRfcG1pY19vcHNfbXgub3V0cHV0X2Rldl9pZCA9IGRldl9pZDsKIAlzd2l0Y2ggKGRldl9pZCkgewogCWNhc2UgU1RFUkVPX0hFQURQSE9ORToKQEAgLTU0OSw3ICs1MDEsNyBAQAogCQludW1fcmVnID0gMTsKIAkJYnJlYWs7CiAJY2FzZSBSRUNFSVZFUjoKLQkJcHJfZGVidWcoInNzdDogUkVDRUlWRVIgS29za2kgc2VsZWN0ZWRcbiIpOworCQlwcl9kZWJ1ZygiUkVDRUlWRVIgS29za2kgc2VsZWN0ZWRcbiIpOwogCiAJCS8qIGNvbmZpZ3VyYXRpb24gLSBBUyBlbmFibGUsIHJlY2VpdmVyIGVuYWJsZSAqLwogCQlzY19hY2Nlc3NbMF0ucmVnX2FkZHIgPSAweEZGOwpAQCAtNTU5LDcgKzUxMSw3IEBACiAJCW51bV9yZWcgPSAxOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlwcl9lcnIoInNzdDogTm90IGEgdmFsaWQgb3V0cHV0IGRldlxuIik7CisJCXByX2VycigiTm90IGEgdmFsaWQgb3V0cHV0IGRldlxuIik7CiAJCXJldHVybiAwOwogCX0KIAlyZXR1cm4gc3N0X3NjX3JlZ19hY2Nlc3Moc2NfYWNjZXNzLCBQTUlDX1dSSVRFLCBudW1fcmVnKTsKQEAgLTU5OCw3ICs1NTAsNyBAQAogCQkJcmV0dXJuIHJldHZhbDsKIAl9CiAJc25kX3BtaWNfb3BzX214LmlucHV0X2Rldl9pZCA9IGRldl9pZDsKLQlwcl9kZWJ1Zygic3N0OiBteF9zZXRfc2VsZWN0ZWRfaW5wdXRfZGV2IGRldl9pZDoweCV4XG4iLCBkZXZfaWQpOworCXByX2RlYnVnKCJteF9zZXRfc2VsZWN0ZWRfaW5wdXRfZGV2IGRldl9pZDoweCV4XG4iLCBkZXZfaWQpOwogCiAJc3dpdGNoIChkZXZfaWQpIHsKIAljYXNlIEFNSUM6CkBAIC02NDYsNyArNTk4LDcgQEAKIAl9CiAKIAotCXByX2RlYnVnKCJzc3Q6IHNldF9tdXRlIGRldl9pZDoweCV4ICwgdmFsdWU6JWRcbiIsIGRldl9pZCwgdmFsdWUpOworCXByX2RlYnVnKCJzZXRfbXV0ZSBkZXZfaWQ6MHgleCAsIHZhbHVlOiVkXG4iLCBkZXZfaWQsIHZhbHVlKTsKIAogCXN3aXRjaCAoZGV2X2lkKSB7CiAJY2FzZSBQTUlDX1NORF9ETUlDX01VVEU6CkBAIC03NjAsNyArNzEyLDcgQEAKIAkJaWYgKHJldHZhbCkKIAkJCXJldHVybiByZXR2YWw7CiAJfQotCXByX2RlYnVnKCJzc3Q6IHNldF92b2wgZGV2X2lkOjB4JXggLHZhbHVlOiVkXG4iLCBkZXZfaWQsIHZhbHVlKTsKKwlwcl9kZWJ1Zygic2V0X3ZvbCBkZXZfaWQ6MHgleCAsdmFsdWU6JWRcbiIsIGRldl9pZCwgdmFsdWUpOwogCXN3aXRjaCAoZGV2X2lkKSB7CiAJY2FzZSBQTUlDX1NORF9SRUNFSVZFUl9WT0w6CiAJCXJldHVybiAwOwpAQCAtODc1LDcgKzgyNyw3IEBACiAJaWYgKHJldHZhbCkKIAkJcmV0dXJuIHJldHZhbDsKIAkqdmFsdWUgPSAtKHNjX2FjY2Vzcy52YWx1ZSAmIG1hc2spOwotCXByX2RlYnVnKCJzc3Q6IGdldCB2b2x1bWUgdmFsdWUgZXh0cmFjdGVkICVkXG4iLCAqdmFsdWUpOworCXByX2RlYnVnKCJnZXQgdm9sdW1lIHZhbHVlIGV4dHJhY3RlZCAlZFxuIiwgKnZhbHVlKTsKIAlyZXR1cm4gcmV0dmFsOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaW50ZWxfc3N0L2ludGVsbWlkX3YyX2NvbnRyb2wuYyBiL2RyaXZlcnMvc3RhZ2luZy9pbnRlbF9zc3QvaW50ZWxtaWRfdjJfY29udHJvbC5jCmluZGV4IDNhN2RlNzYuLmUzOGU4OWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9pbnRlbF9zc3QvaW50ZWxtaWRfdjJfY29udHJvbC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9pbnRlbF9zc3QvaW50ZWxtaWRfdjJfY29udHJvbC5jCkBAIC0yNiw2ICsyNiw4IEBACiAgKiAgVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBjb250cm9sIG9wZXJhdGlvbnMgb2YgdmVuZG9yIDMKICAqLwogCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisKICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9maWxlLmg+CiAjaW5jbHVkZSAiaW50ZWxfc3N0LmgiCkBAIC0xMjAsNyArMTIyLDcgQEAKIAlzbmRfcG1pY19vcHNfbmMubWFzdGVyX211dGUgPSBVTk1VVEU7CiAJc25kX3BtaWNfb3BzX25jLm11dGVfc3RhdHVzID0gVU5NVVRFOwogCXNzdF9zY19yZWdfYWNjZXNzKHNjX2FjY2VzcywgUE1JQ19XUklURSwgMjYpOwotCXByX2RlYnVnKCJzc3Q6IGluaXQgY29tcGxldGUhIVxuIik7CisJcHJfZGVidWcoImluaXQgY29tcGxldGUhIVxuIik7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE2OSw3ICsxNzEsNyBAQAogCW5jX2VuYWJsZV9hdWRpb2RhYyhNVVRFKTsKIAltc2xlZXAoMzApOwogCi0JcHJfZGVidWcoInNzdDogcG93ZXJpbmcgdXAgcGIuLi4uXG4iKTsKKwlwcl9kZWJ1ZygicG93ZXJpbmcgdXAgcGIuLi4uXG4iKTsKIAogCXNjX2FjY2Vzc1swXS5yZWdfYWRkciA9IFZBVURJT0NOVDsKIAlzY19hY2Nlc3NbMF0udmFsdWUgPSAweDI3OwpAQCAtMjIyLDcgKzIyNCw3IEBACiAJCXJldHVybiByZXR2YWw7CiAKIAotCXByX2RlYnVnKCJzc3Q6IHBvd2VyaW5nIHVwIGNwLi4uLlxuIik7CisJcHJfZGVidWcoInBvd2VyaW5nIHVwIGNwLi4uLlxuIik7CiAKIAlpZiAocG9ydCA9PSAweEZGKQogCQlyZXR1cm4gMDsKQEAgLTI3NSw3ICsyNzcsNyBAQAogCW5jX2VuYWJsZV9hdWRpb2RhYyhNVVRFKTsKIAogCi0JcHJfZGVidWcoInNzdDogcG93ZXJpbmcgZG4gbmNfcG93ZXJfZG93biAuLi4uXG4iKTsKKwlwcl9kZWJ1ZygicG93ZXJpbmcgZG4gbmNfcG93ZXJfZG93biAuLi4uXG4iKTsKIAogCW1zbGVlcCgzMCk7CiAKQEAgLTMyNCw3ICszMjYsNyBAQAogCWlmIChyZXR2YWwpCiAJCXJldHVybiByZXR2YWw7CiAKLQlwcl9kZWJ1Zygic3N0OiBwb3dlcmluZyBkbiBwYi4uLi5cbiIpOworCXByX2RlYnVnKCJwb3dlcmluZyBkbiBwYi4uLi5cbiIpOwogCiAJbmNfZW5hYmxlX2F1ZGlvZGFjKE1VVEUpOwogCkBAIC0zNzAsNyArMzcyLDcgQEAKIAlpZiAocmV0dmFsKQogCQlyZXR1cm4gcmV0dmFsOwogCi0JcHJfZGVidWcoInNzdDogcG93ZXJpbmcgZG4gY3AuLi4uXG4iKTsKKwlwcl9kZWJ1ZygicG93ZXJpbmcgZG4gY3AuLi4uXG4iKTsKIAlyZXR1cm4gc3N0X3NjX3JlZ19hY2Nlc3Moc2NfYWNjZXNzLCBQTUlDX1JFQURfTU9ESUZZLCAxKTsKIH0KIApAQCAtNDAwLDcgKzQwMiw3IEBACiAJCXJldHVybiByZXR2YWw7CiAKIAlzc3Rfc2NfcmVnX2FjY2VzcyhzY19hY2Nlc3MsIFBNSUNfV1JJVEUsIDE0KTsKLQlwcl9kZWJ1Zygic3N0OiBWb2ljZSBwYXJhbWV0ZXJzIHNldCBzdWNjZXNzZnVsbHkhIVxuIik7CisJcHJfZGVidWcoIlZvaWNlIHBhcmFtZXRlcnMgc2V0IHN1Y2Nlc3NmdWxseSEhXG4iKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNDUxLDIwICs0NTMsMjAgQEAKIAogCQlzY19hY2Nlc3MudmFsdWUgPSAweDA3OwogCQlzY19hY2Nlc3MucmVnX2FkZHIgPSBSTVVURTsKLQkJcHJfZGVidWcoInNzdDogUklHSFRfSFBfTVVURSB2YWx1ZSVkXG4iLCBzY19hY2Nlc3MudmFsdWUpOworCQlwcl9kZWJ1ZygiUklHSFRfSFBfTVVURSB2YWx1ZSVkXG4iLCBzY19hY2Nlc3MudmFsdWUpOwogCQlzY19hY2Nlc3MubWFzayA9IE1BU0syOwogCQlzc3Rfc2NfcmVnX2FjY2Vzcygmc2NfYWNjZXNzLCBQTUlDX1JFQURfTU9ESUZZLCAxKTsKIAl9IGVsc2UgewogCQlzY19hY2Nlc3MudmFsdWUgPSAweDAwOwogCQlzY19hY2Nlc3MucmVnX2FkZHIgPSBSTVVURTsKLQkJcHJfZGVidWcoInNzdDogUklHSFRfSFBfTVVURSB2YWx1ZSAlZFxuIiwgc2NfYWNjZXNzLnZhbHVlKTsKKwkJcHJfZGVidWcoIlJJR0hUX0hQX01VVEUgdmFsdWUgJWRcbiIsIHNjX2FjY2Vzcy52YWx1ZSk7CiAJCXNjX2FjY2Vzcy5tYXNrID0gTUFTSzI7CiAJCXNzdF9zY19yZWdfYWNjZXNzKCZzY19hY2Nlc3MsIFBNSUNfUkVBRF9NT0RJRlksIDEpOwogCiAKIAl9CiAKLQlwcl9kZWJ1Zygic3N0OiB3b3JkX3NpemUgPSAlZFxuIiwgd29yZF9zaXplKTsKKwlwcl9kZWJ1Zygid29yZF9zaXplID0gJWRcbiIsIHdvcmRfc2l6ZSk7CiAKIAlpZiAod29yZF9zaXplID09IDI0KSB7CiAJCXNjX2FjY2Vzcy5yZWdfYWRkciA9IEFVRElPUE9SVDI7CkBAIC00NzcsNyArNDc5LDcgQEAKIAl9CiAJc3N0X3NjX3JlZ19hY2Nlc3MoJnNjX2FjY2VzcywgUE1JQ19SRUFEX01PRElGWSwgMSk7CiAKLQlwcl9kZWJ1Zygic3N0OiB3b3JkX3NpemUgPSAlZFxuIiwgd29yZF9zaXplKTsKKwlwcl9kZWJ1Zygid29yZF9zaXplID0gJWRcbiIsIHdvcmRfc2l6ZSk7CiAJc2NfYWNjZXNzLnJlZ19hZGRyID0gQVVESU9QT1JUMTsKIAlzY19hY2Nlc3MubWFzayA9IE1BU0s1fE1BU0s0fE1BU0sxfE1BU0swOwogCWlmICh3b3JkX3NpemUgPT0gMTYpCkBAIC01MDgsNyArNTEwLDcgQEAKIAkJcmV0dmFsID0gbmNfaW5pdF9jYXJkKCk7CiAJaWYgKHJldHZhbCkKIAkJcmV0dXJuIHJldHZhbDsKLQlwcl9kZWJ1Zygic3N0OiBuYyBzZXQgc2VsZWN0ZWQgb3V0cHV0OiVkXG4iLCB2YWx1ZSk7CisJcHJfZGVidWcoIm5jIHNldCBzZWxlY3RlZCBvdXRwdXQ6JWRcbiIsIHZhbHVlKTsKIAlzd2l0Y2ggKHZhbHVlKSB7CiAJY2FzZSBTVEVSRU9fSEVBRFBIT05FOgogCQlyZXR2YWwgPSBzc3Rfc2NfcmVnX2FjY2VzcyhzY19hY2Nlc3NfSFAsIFBNSUNfV1JJVEUsIDIpOwpAQCAtNTE3LDcgKzUxOSw3IEBACiAJCXJldHZhbCA9IHNzdF9zY19yZWdfYWNjZXNzKHNjX2FjY2Vzc19JUywgUE1JQ19XUklURSwgMik7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCXByX2Vycigic3N0OiByY3ZkIGlsbGVnYWwgcmVxdWVzdDogJWRcbiIsIHZhbHVlKTsKKwkJcHJfZXJyKCJyY3ZkIGlsbGVnYWwgcmVxdWVzdDogJWRcbiIsIHZhbHVlKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCXJldHVybiByZXR2YWw7CkBAIC01NDEsNyArNTQzLDcgQEAKIAl9OwogCiAJc3N0X3NjX3JlZ19hY2Nlc3Moc2NfYWNjZXNzLCBQTUlDX1dSSVRFLCAxMik7Ci0JcHJfZGVidWcoInNzdDogQXVkaW8gSW5pdCBzdWNjZXNzZnVsbHkhIVxuIik7CisJcHJfZGVidWcoIkF1ZGlvIEluaXQgc3VjY2Vzc2Z1bGx5ISFcbiIpOwogCiAJLypzZXQgb3V0cHV0IGRldmljZSAqLwogCW5jX3NldF9zZWxlY3RlZF9vdXRwdXRfZGV2KHNuZF9wbWljX29wc19uYy5vdXRwdXRfZGV2X2lkKTsKQEAgLTU0OSwxMyArNTUxLDEzIEBACiAJaWYgKHNuZF9wbWljX29wc19uYy5udW1fY2hhbm5lbCA9PSAxKSB7CiAJCXNjX2FjY2VzLnZhbHVlID0gMHgwNzsKIAkJc2NfYWNjZXMucmVnX2FkZHIgPSBSTVVURTsKLQkJcHJfZGVidWcoInNzdDogUklHSFRfSFBfTVVURSB2YWx1ZSVkXG4iLCBzY19hY2Nlcy52YWx1ZSk7CisJCXByX2RlYnVnKCJSSUdIVF9IUF9NVVRFIHZhbHVlJWRcbiIsIHNjX2FjY2VzLnZhbHVlKTsKIAkJc2NfYWNjZXMubWFzayA9IE1BU0syOwogCQlzc3Rfc2NfcmVnX2FjY2Vzcygmc2NfYWNjZXMsIFBNSUNfUkVBRF9NT0RJRlksIDEpOwogCX0gZWxzZSB7CiAJCXNjX2FjY2VzLnZhbHVlID0gMHgwMDsKIAkJc2NfYWNjZXMucmVnX2FkZHIgPSBSTVVURTsKLQkJcHJfZGVidWcoInNzdDogUklHSFRfSFBfTVVURSB2YWx1ZSVkXG4iLCBzY19hY2Nlcy52YWx1ZSk7CisJCXByX2RlYnVnKCJSSUdIVF9IUF9NVVRFIHZhbHVlJWRcbiIsIHNjX2FjY2VzLnZhbHVlKTsKIAkJc2NfYWNjZXMubWFzayA9IE1BU0syOwogCQlzc3Rfc2NfcmVnX2FjY2Vzcygmc2NfYWNjZXMsIFBNSUNfUkVBRF9NT0RJRlksIDEpOwogCX0KQEAgLTYyOSwxMSArNjMxLDExIEBACiAJaWYgKHJldHZhbCkKIAkJcmV0dXJuIHJldHZhbDsKIAotCXByX2RlYnVnKCJzc3Q6IHNldCBkZXZpY2UgaWQ6OiVkLCB2YWx1ZSAlZFxuIiwgZGV2X2lkLCB2YWx1ZSk7CisJcHJfZGVidWcoInNldCBkZXZpY2UgaWQ6OiVkLCB2YWx1ZSAlZFxuIiwgZGV2X2lkLCB2YWx1ZSk7CiAKIAlzd2l0Y2ggKGRldl9pZCkgewogCWNhc2UgUE1JQ19TTkRfTVVURV9BTEw6Ci0JCXByX2RlYnVnKCJzc3Q6IFBNSUNfU05EX01VVEVfQUxMIHZhbHVlICVkXG4iLCB2YWx1ZSk7CisJCXByX2RlYnVnKCJQTUlDX1NORF9NVVRFX0FMTCB2YWx1ZSAlZFxuIiwgdmFsdWUpOwogCQlzbmRfcG1pY19vcHNfbmMubXV0ZV9zdGF0dXMgPSB2YWx1ZTsKIAkJc25kX3BtaWNfb3BzX25jLm1hc3Rlcl9tdXRlID0gdmFsdWU7CiAJCWlmICh2YWx1ZSA9PSBVTk1VVEUpIHsKQEAgLTY2OSw3ICs2NzEsNyBAQAogCQl9CiAJCWJyZWFrOwogCWNhc2UgUE1JQ19TTkRfSFBfTUlDX01VVEU6Ci0JCXByX2RlYnVnKCJzc3Q6IFBNSUNfU05EX0hQTUlDX01VVEUgdmFsdWUgJWRcbiIsIHZhbHVlKTsKKwkJcHJfZGVidWcoIlBNSUNfU05EX0hQTUlDX01VVEUgdmFsdWUgJWRcbiIsIHZhbHVlKTsKIAkJaWYgKHZhbHVlID09IFVOTVVURSkgewogCQkJLyogdW5tdXRlIHRoZSBzeXN0ZW0sIHNldCB0aGUgNnRoIGJpdCB0byBvbmUgKi8KIAkJCXNjX2FjY2Vzc1swXS52YWx1ZSA9IDB4MDA7CkBAIC02ODIsNyArNjg0LDcgQEAKIAkJcmV0dmFsID0gc3N0X3NjX3JlZ19hY2Nlc3Moc2NfYWNjZXNzLCBQTUlDX1JFQURfTU9ESUZZLCAxKTsKIAkJYnJlYWs7CiAJY2FzZSBQTUlDX1NORF9BTUlDX01VVEU6Ci0JCXByX2RlYnVnKCJzc3Q6IFBNSUNfU05EX0FNSUNfTVVURSB2YWx1ZSAlZFxuIiwgdmFsdWUpOworCQlwcl9kZWJ1ZygiUE1JQ19TTkRfQU1JQ19NVVRFIHZhbHVlICVkXG4iLCB2YWx1ZSk7CiAJCWlmICh2YWx1ZSA9PSBVTk1VVEUpIHsKIAkJCS8qIHVubXV0ZSB0aGUgc3lzdGVtLCBzZXQgdGhlIDZ0aCBiaXQgdG8gb25lICovCiAJCQlzY19hY2Nlc3NbMF0udmFsdWUgPSAweDAwOwpAQCAtNjk2LDcgKzY5OCw3IEBACiAJCWJyZWFrOwogCiAJY2FzZSBQTUlDX1NORF9ETUlDX01VVEU6Ci0JCXByX2RlYnVnKCJzc3Q6IElOUFVUX01VVEVfRE1JQyB2YWx1ZSVkXG4iLCB2YWx1ZSk7CisJCXByX2RlYnVnKCJJTlBVVF9NVVRFX0RNSUMgdmFsdWUlZFxuIiwgdmFsdWUpOwogCQlpZiAodmFsdWUgPT0gVU5NVVRFKSB7CiAJCQkvKiB1bm11dGUgdGhlIHN5c3RlbSwgc2V0IHRoZSA2dGggYml0IHRvIG9uZSAqLwogCQkJc2NfYWNjZXNzWzFdLnZhbHVlID0gMHgwMDsKQEAgLTcyNCwxMyArNzI2LDEzIEBACiAKIAkJaWYgKGRldl9pZCA9PSBQTUlDX1NORF9MRUZUX0hQX01VVEUpIHsKIAkJCXNjX2FjY2Vzc1swXS5yZWdfYWRkciA9IExNVVRFOwotCQkJcHJfZGVidWcoInNzdDogTEVGVF9IUF9NVVRFIHZhbHVlICVkXG4iLAorCQkJcHJfZGVidWcoIkxFRlRfSFBfTVVURSB2YWx1ZSAlZFxuIiwKIAkJCQkJc2NfYWNjZXNzWzBdLnZhbHVlKTsKIAkJfSBlbHNlIHsKIAkJCWlmIChzbmRfcG1pY19vcHNfbmMubnVtX2NoYW5uZWwgPT0gMSkKIAkJCQlzY19hY2Nlc3NbMF0udmFsdWUgPSAweDA0OwogCQkJc2NfYWNjZXNzWzBdLnJlZ19hZGRyID0gUk1VVEU7Ci0JCQlwcl9kZWJ1Zygic3N0OiBSSUdIVF9IUF9NVVRFIHZhbHVlICVkXG4iLAorCQkJcHJfZGVidWcoIlJJR0hUX0hQX01VVEUgdmFsdWUgJWRcbiIsCiAJCQkJCXNjX2FjY2Vzc1swXS52YWx1ZSk7CiAJCX0KIAkJc2NfYWNjZXNzWzBdLm1hc2sgPSBNQVNLMjsKQEAgLTc0Myw3ICs3NDUsNyBAQAogCQllbHNlCiAJCQlzY19hY2Nlc3NbMF0udmFsdWUgPSAweDAzOwogCQlzY19hY2Nlc3NbMF0ucmVnX2FkZHIgPSBMTVVURTsKLQkJcHJfZGVidWcoInNzdDogU1BFQUtFUl9NVVRFICVkXG4iLCBzY19hY2Nlc3NbMF0udmFsdWUpOworCQlwcl9kZWJ1ZygiU1BFQUtFUl9NVVRFICVkXG4iLCBzY19hY2Nlc3NbMF0udmFsdWUpOwogCQlzY19hY2Nlc3NbMF0ubWFzayA9IE1BU0sxOwogCQlyZXR2YWwgPSBzc3Rfc2NfcmVnX2FjY2VzcyhzY19hY2Nlc3MsIFBNSUNfUkVBRF9NT0RJRlksIDEpOwogCQlicmVhazsKQEAgLTc2NCwxMCArNzY2LDEwIEBACiAJaWYgKHJldHZhbCkKIAkJcmV0dXJuIHJldHZhbDsKIAotCXByX2RlYnVnKCJzc3Q6IHNldCB2b2x1bWU6JWRcbiIsIGRldl9pZCk7CisJcHJfZGVidWcoInNldCB2b2x1bWU6JWRcbiIsIGRldl9pZCk7CiAJc3dpdGNoIChkZXZfaWQpIHsKIAljYXNlIFBNSUNfU05EX0NBUFRVUkVfVk9MOgotCQlwcl9kZWJ1Zygic3N0OiBQTUlDX1NORF9DQVBUVVJFX1ZPTDp2YWx1ZTo6JWRcbiIsIHZhbHVlKTsKKwkJcHJfZGVidWcoIlBNSUNfU05EX0NBUFRVUkVfVk9MOnZhbHVlOjolZFxuIiwgdmFsdWUpOwogCQlzY19hY2Nlc3NbMF0udmFsdWUgPSBzY19hY2Nlc3NbMV0udmFsdWUgPQogCQkJCQlzY19hY2Nlc3NbMl0udmFsdWUgPSAtdmFsdWU7CiAJCXNjX2FjY2Vzc1swXS5tYXNrID0gc2NfYWNjZXNzWzFdLm1hc2sgPSBzY19hY2Nlc3NbMl0ubWFzayA9CkBAIC03NzksNyArNzgxLDcgQEAKIAkJYnJlYWs7CiAKIAljYXNlIFBNSUNfU05EX0xFRlRfUEJfVk9MOgotCQlwcl9kZWJ1Zygic3N0OiBQTUlDX1NORF9MRUZUX0hQX1ZPTCAlZFxuIiwgdmFsdWUpOworCQlwcl9kZWJ1ZygiUE1JQ19TTkRfTEVGVF9IUF9WT0wgJWRcbiIsIHZhbHVlKTsKIAkJc2NfYWNjZXNzWzBdLnZhbHVlID0gLXZhbHVlOwogCQlzY19hY2Nlc3NbMF0ucmVnX2FkZHIgID0gQVVESU9MVk9MOwogCQlzY19hY2Nlc3NbMF0ubWFzayA9CkBAIC03ODgsNyArNzkwLDcgQEAKIAkJYnJlYWs7CiAKIAljYXNlIFBNSUNfU05EX1JJR0hUX1BCX1ZPTDoKLQkJcHJfZGVidWcoInNzdDogUE1JQ19TTkRfUklHSFRfSFBfVk9MIHZhbHVlICVkXG4iLCB2YWx1ZSk7CisJCXByX2RlYnVnKCJQTUlDX1NORF9SSUdIVF9IUF9WT0wgdmFsdWUgJWRcbiIsIHZhbHVlKTsKIAkJaWYgKHNuZF9wbWljX29wc19uYy5udW1fY2hhbm5lbCA9PSAxKSB7CiAJCQlzY19hY2Nlc3NbMF0udmFsdWUgPSAweDA0OwogCQkgICAgc2NfYWNjZXNzWzBdLnJlZ19hZGRyID0gUk1VVEU7CkBAIC04MjEsMTEgKzgyMywxMSBAQAogCQlyZXR1cm4gcmV0dmFsOwogCXNuZF9wbWljX29wc19uYy5pbnB1dF9kZXZfaWQgPSB2YWx1ZTsKIAotCXByX2RlYnVnKCJzc3Q6IG5jIHNldCBzZWxlY3RlZCBpbnB1dDolZFxuIiwgdmFsdWUpOworCXByX2RlYnVnKCJuYyBzZXQgc2VsZWN0ZWQgaW5wdXQ6JWRcbiIsIHZhbHVlKTsKIAogCXN3aXRjaCAodmFsdWUpIHsKIAljYXNlIEFNSUM6Ci0JCXByX2RlYnVnKCJzc3Q6IFNlbGVjdGluZyBBTUlDXG4iKTsKKwkJcHJfZGVidWcoIlNlbGVjdGluZyBBTUlDXG4iKTsKIAkJc2NfYWNjZXNzWzBdLnJlZ19hZGRyID0gMHgxMDc7CiAJCXNjX2FjY2Vzc1swXS52YWx1ZSA9IDB4NDA7CiAJCXNjX2FjY2Vzc1swXS5tYXNrID0gIE1BU0s2fE1BU0s0fE1BU0szfE1BU0sxfE1BU0swOwpAQCAtODQyLDcgKzg0NCw3IEBACiAJCWJyZWFrOwogCiAJY2FzZSBIU19NSUM6Ci0JCXByX2RlYnVnKCJzc3Q6IFNlbGVjdGluZyBIU19NSUNcbiIpOworCQlwcl9kZWJ1ZygiU2VsZWN0aW5nIEhTX01JQ1xuIik7CiAJCXNjX2FjY2Vzc1swXS5yZWdfYWRkciA9IDB4MTA3OwogCQlzY19hY2Nlc3NbMF0ubWFzayA9ICBNQVNLNnxNQVNLNHxNQVNLM3xNQVNLMXxNQVNLMDsKIAkJc2NfYWNjZXNzWzBdLnZhbHVlID0gMHgxMDsKQEAgLTg1OSw3ICs4NjEsNyBAQAogCQlicmVhazsKIAogCWNhc2UgRE1JQzoKLQkJcHJfZGVidWcoInNzdDogRE1JQ1xuIik7CisJCXByX2RlYnVnKCJETUlDXG4iKTsKIAkJc2NfYWNjZXNzWzBdLnJlZ19hZGRyID0gMHgxMDc7CiAJCXNjX2FjY2Vzc1swXS5tYXNrID0gTUFTSzZ8TUFTSzR8TUFTSzN8TUFTSzF8TUFTSzA7CiAJCXNjX2FjY2Vzc1swXS52YWx1ZSA9IDB4MEI7CkBAIC04NzEsNyArODczLDcgQEAKIAkJc2NfYWNjZXNzWzJdLm1hc2sgPSBNQVNLNjsKIAkJc2NfYWNjZXNzWzNdLnJlZ19hZGRyID0gMHgxMDk7CiAJCXNjX2FjY2Vzc1szXS5tYXNrID0gTUFTSzY7Ci0JCXNjX2FjY2Vzc1szXS52YWx1ZSA9IDB4NDA7CisJCXNjX2FjY2Vzc1szXS52YWx1ZSA9IDB4MDA7CiAJCW51bV92YWwgPSA0OwogCQlicmVhazsKIAlkZWZhdWx0OgpAQCAtODkwLDIzICs4OTIsMjMgQEAKIAlpZiAocmV0dmFsKQogCQlyZXR1cm4gcmV0dmFsOwogCi0JcHJfZGVidWcoInNzdDogZ2V0IG11dGU6OiVkXG4iLCBkZXZfaWQpOworCXByX2RlYnVnKCJnZXQgbXV0ZTo6JWRcbiIsIGRldl9pZCk7CiAKIAlzd2l0Y2ggKGRldl9pZCkgewogCWNhc2UgUE1JQ19TTkRfQU1JQ19NVVRFOgotCQlwcl9kZWJ1Zygic3N0OiBQTUlDX1NORF9JTlBVVF9NVVRFX01JQzFcbiIpOworCQlwcl9kZWJ1ZygiUE1JQ19TTkRfSU5QVVRfTVVURV9NSUMxXG4iKTsKIAkJc2NfYWNjZXNzLnJlZ19hZGRyID0gTElMU0VMOwogCQltYXNrID0gTUFTSzY7CiAJCWJyZWFrOwogCWNhc2UgUE1JQ19TTkRfSFBfTUlDX01VVEU6Ci0JCXByX2RlYnVnKCJzc3Q6IFBNSUNfU05EX0lOUFVUX01VVEVfTUlDMlxuIik7CisJCXByX2RlYnVnKCJQTUlDX1NORF9JTlBVVF9NVVRFX01JQzJcbiIpOwogCQlzY19hY2Nlc3MucmVnX2FkZHIgPSBMSVJTRUw7CiAJCW1hc2sgPSBNQVNLNjsKIAkJYnJlYWs7CiAJY2FzZSBQTUlDX1NORF9MRUZUX0hQX01VVEU6CiAJY2FzZSBQTUlDX1NORF9SSUdIVF9IUF9NVVRFOgogCQltYXNrID0gTUFTSzI7Ci0JCXByX2RlYnVnKCJzc3Q6IFBNSUNfU05fTEVGVC9SSUdIVF9IUF9NVVRFXG4iKTsKKwkJcHJfZGVidWcoIlBNSUNfU05fTEVGVC9SSUdIVF9IUF9NVVRFXG4iKTsKIAkJaWYgKGRldl9pZCA9PSBQTUlDX1NORF9SSUdIVF9IUF9NVVRFKQogCQkJc2NfYWNjZXNzLnJlZ19hZGRyID0gUk1VVEU7CiAJCWVsc2UKQEAgLTkxNCwxMiArOTE2LDEyIEBACiAJCWJyZWFrOwogCiAJY2FzZSBQTUlDX1NORF9MRUZUX1NQRUFLRVJfTVVURToKLQkJcHJfZGVidWcoInNzdDogUE1JQ19NT05PX0VBUlBJRUNFX01VVEVcbiIpOworCQlwcl9kZWJ1ZygiUE1JQ19NT05PX0VBUlBJRUNFX01VVEVcbiIpOwogCQlzY19hY2Nlc3MucmVnX2FkZHIgPSBSTVVURTsKIAkJbWFzayA9IE1BU0sxOwogCQlicmVhazsKIAljYXNlIFBNSUNfU05EX0RNSUNfTVVURToKLQkJcHJfZGVidWcoInNzdDogUE1JQ19TTkRfSU5QVVRfTVVURV9ETUlDXG4iKTsKKwkJcHJfZGVidWcoIlBNSUNfU05EX0lOUFVUX01VVEVfRE1JQ1xuIik7CiAJCXNjX2FjY2Vzcy5yZWdfYWRkciA9IDB4MTA1OwogCQltYXNrID0gTUFTSzY7CiAJCWJyZWFrOwpAQCAtOTI4LDE2ICs5MzAsMTYgQEAKIAogCX0KIAlyZXR2YWwgPSBzc3Rfc2NfcmVnX2FjY2Vzcygmc2NfYWNjZXNzLCBQTUlDX1JFQUQsIDEpOwotCXByX2RlYnVnKCJzc3Q6IHJlZyB2YWx1ZSA9ICVkXG4iLCBzY19hY2Nlc3MudmFsdWUpOworCXByX2RlYnVnKCJyZWcgdmFsdWUgPSAlZFxuIiwgc2NfYWNjZXNzLnZhbHVlKTsKIAlpZiAocmV0dmFsKQogCQlyZXR1cm4gcmV0dmFsOwogCSp2YWx1ZSA9IChzY19hY2Nlc3MudmFsdWUpICYgbWFzazsKLQlwcl9kZWJ1Zygic3N0OiBtYXNrZWQgdmFsdWUgPSAlZFxuIiwgKnZhbHVlKTsKKwlwcl9kZWJ1ZygibWFza2VkIHZhbHVlID0gJWRcbiIsICp2YWx1ZSk7CiAJaWYgKCp2YWx1ZSkKIAkJKnZhbHVlID0gMDsKIAllbHNlCiAJCSp2YWx1ZSA9IDE7Ci0JcHJfZGVidWcoInNzdDogdmFsdWUgcmV0dXJuZWQgPSAweCV4XG4iLCAqdmFsdWUpOworCXByX2RlYnVnKCJ2YWx1ZSByZXR1cm5lZCA9IDB4JXhcbiIsICp2YWx1ZSk7CiAJcmV0dXJuIHJldHZhbDsKIH0KIApAQCAtOTUzLDE5ICs5NTUsMTkgQEAKIAogCXN3aXRjaCAoZGV2X2lkKSB7CiAJY2FzZSBQTUlDX1NORF9DQVBUVVJFX1ZPTDoKLQkJcHJfZGVidWcoInNzdDogUE1JQ19TTkRfSU5QVVRfQ0FQVFVSRV9WT0xcbiIpOworCQlwcl9kZWJ1ZygiUE1JQ19TTkRfSU5QVVRfQ0FQVFVSRV9WT0xcbiIpOwogCQlzY19hY2Nlc3MucmVnX2FkZHIgPSAgTElMU0VMOwogCQltYXNrID0gKE1BU0swfE1BU0sxfE1BU0syfE1BU0szfE1BU0s0fE1BU0s1KTsKIAkJYnJlYWs7CiAKIAljYXNlIFBNSUNfU05EX1JJR0hUX1BCX1ZPTDoKLQkJcHJfZGVidWcoInNzdDogR0VUX1ZPTFVNRV9QTUlDX0xFRlRfSFBfVk9MXG4iKTsKKwkJcHJfZGVidWcoIkdFVF9WT0xVTUVfUE1JQ19MRUZUX0hQX1ZPTFxuIik7CiAJCXNjX2FjY2Vzcy5yZWdfYWRkciA9IEFVRElPTFZPTDsKIAkJbWFzayA9IChNQVNLMHxNQVNLMXxNQVNLMnxNQVNLM3xNQVNLNHxNQVNLNXxNQVNLNik7CiAJCWJyZWFrOwogCiAJY2FzZSBQTUlDX1NORF9MRUZUX1BCX1ZPTDoKLQkJcHJfZGVidWcoInNzdDogR0VUX1ZPTFVNRV9QTUlDX1JJR0hUX0hQX1ZPTFxuIik7CisJCXByX2RlYnVnKCJHRVRfVk9MVU1FX1BNSUNfUklHSFRfSFBfVk9MXG4iKTsKIAkJc2NfYWNjZXNzLnJlZ19hZGRyID0gQVVESU9SVk9MOwogCQltYXNrID0gKE1BU0swfE1BU0sxfE1BU0syfE1BU0szfE1BU0s0fE1BU0s1fE1BU0s2KTsKIAkJYnJlYWs7CkBAIC05NzUsOSArOTc3LDkgQEAKIAogCX0KIAlyZXR2YWwgPSBzc3Rfc2NfcmVnX2FjY2Vzcygmc2NfYWNjZXNzLCBQTUlDX1JFQUQsIDEpOwotCXByX2RlYnVnKCJzc3Q6IHZhbHVlIHJlYWQgPSAweCV4XG4iLCBzY19hY2Nlc3MudmFsdWUpOworCXByX2RlYnVnKCJ2YWx1ZSByZWFkID0gMHgleFxuIiwgc2NfYWNjZXNzLnZhbHVlKTsKIAkqdmFsdWUgPSAtKChzY19hY2Nlc3MudmFsdWUpICYgbWFzayk7Ci0JcHJfZGVidWcoInNzdDogZ2V0IHZvbCB2YWx1ZSByZXR1cm5lZCA9ICVkXG4iLCAqdmFsdWUpOworCXByX2RlYnVnKCJnZXQgdm9sIHZhbHVlIHJldHVybmVkID0gJWRcbiIsICp2YWx1ZSk7CiAJcmV0dXJuIHJldHZhbDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2tldWNyL2luaXQuYyBiL2RyaXZlcnMvc3RhZ2luZy9rZXVjci9pbml0LmMKaW5kZXggOTc4YmY4Ny4uNTE1ZTQ0OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2tldWNyL2luaXQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcva2V1Y3IvaW5pdC5jCkBAIC0xMSw0MyArMTEsMzcgQEAKICNpbmNsdWRlICJ0cmFuc3BvcnQuaCIKICNpbmNsdWRlICJpbml0LmgiCiAKLUJZVEUJCUlzU1NGRENDb21wbGlhbmNlOwotQllURQkJSXNYRENvbXBsaWFuY2U7Ci1leHRlcm4gRFdPUkQgTWVkaWFDaGFuZ2U7Ci1leHRlcm4gaW50CUNoZWNrX0RfTWVkaWFGbXQoc3RydWN0IHVzX2RhdGEgKik7CitCWVRFIElzU1NGRENDb21wbGlhbmNlOworQllURSBJc1hEQ29tcGxpYW5jZTsKIAotLy8tLS0tLSBFTkVfSW5pdE1lZGlhKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyoKKyAqIEVORV9Jbml0TWVkaWEoKToKKyAqLwogaW50IEVORV9Jbml0TWVkaWEoc3RydWN0IHVzX2RhdGEgKnVzKQogewogCWludAlyZXN1bHQ7CiAJQllURQlNaXNjUmVnMDMgPSAwOwogCi0JcHJpbnRrKCItLS0gSW5pdCBNZWRpYSAtLS1cbiIpOworCXByaW50ayhLRVJOX0lORk8gIi0tLSBJbml0IE1lZGlhIC0tLVxuIik7CiAJcmVzdWx0ID0gRU5FX1JlYWRfQllURSh1cywgUkVHX0NBUkRfU1RBVFVTLCAmTWlzY1JlZzAzKTsKLQlpZiAocmVzdWx0ICE9IFVTQl9TVE9SX1hGRVJfR09PRCkKLQl7Ci0JCXByaW50aygiUmVhZCByZWdpc3RlciBmYWlsICEhXG4iKTsKKwlpZiAocmVzdWx0ICE9IFVTQl9TVE9SX1hGRVJfR09PRCkgeworCQlwcmludGsoS0VSTl9FUlIgIlJlYWQgcmVnaXN0ZXIgZmFpbCAhIVxuIik7CiAJCXJldHVybiBVU0JfU1RPUl9UUkFOU1BPUlRfRVJST1I7CiAJfQotCXByaW50aygiTWlzY1JlZzAzID0gJXhcbiIsIE1pc2NSZWcwMyk7CisJcHJpbnRrKEtFUk5fSU5GTyAiTWlzY1JlZzAzID0gJXhcbiIsIE1pc2NSZWcwMyk7CiAKLQlpZiAoTWlzY1JlZzAzICYgMHgwMSkKLQl7Ci0JCWlmICghdXMtPlNEX1N0YXR1cy5SZWFkeSkKLQkJeworCWlmIChNaXNjUmVnMDMgJiAweDAxKSB7CisJCWlmICghdXMtPlNEX1N0YXR1cy5SZWFkeSkgewogCQkJcmVzdWx0ID0gRU5FX1NESW5pdCh1cyk7CiAJCQlpZiAocmVzdWx0ICE9IFVTQl9TVE9SX1hGRVJfR09PRCkKIAkJCQlyZXR1cm4gVVNCX1NUT1JfVFJBTlNQT1JUX0VSUk9SOwogCQl9CiAJfQogCi0JaWYgKE1pc2NSZWcwMyAmIDB4MDIpCi0JewotCQlpZiAoIXVzLT5TTV9TdGF0dXMuUmVhZHkgJiYgIXVzLT5NU19TdGF0dXMuUmVhZHkpCi0JCXsKKwlpZiAoTWlzY1JlZzAzICYgMHgwMikgeworCQlpZiAoIXVzLT5TTV9TdGF0dXMuUmVhZHkgJiYgIXVzLT5NU19TdGF0dXMuUmVhZHkpIHsKIAkJCXJlc3VsdCA9IEVORV9TTUluaXQodXMpOwotCQkJaWYgKHJlc3VsdCAhPSBVU0JfU1RPUl9YRkVSX0dPT0QpCi0JCQl7CisJCQlpZiAocmVzdWx0ICE9IFVTQl9TVE9SX1hGRVJfR09PRCkgewogCQkJCXJlc3VsdCA9IEVORV9NU0luaXQodXMpOwogCQkJCWlmIChyZXN1bHQgIT0gVVNCX1NUT1JfWEZFUl9HT09EKQogCQkJCQlyZXR1cm4gVVNCX1NUT1JfVFJBTlNQT1JUX0VSUk9SOwpAQCAtNTgsNyArNTIsOSBAQAogCXJldHVybiByZXN1bHQ7CiB9CiAKLS8vLS0tLS0gRU5FX1JlYWRfQllURSgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qCisgKiBFTkVfUmVhZF9CWVRFKCkgOgorICovCiBpbnQgRU5FX1JlYWRfQllURShzdHJ1Y3QgdXNfZGF0YSAqdXMsIFdPUkQgaW5kZXgsIHZvaWQgKmJ1ZikKIHsKIAlzdHJ1Y3QgYnVsa19jYl93cmFwICpiY2IgPSAoc3RydWN0IGJ1bGtfY2Jfd3JhcCAqKSB1cy0+aW9idWY7CkBAIC03NiwxOSArNzIsMjAgQEAKIAlyZXR1cm4gcmVzdWx0OwogfQogCi0vLy0tLS0tIEVORV9TREluaXQoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qCisgKiBFTkVfU0RJbml0KCk6CisgKi8KIGludCBFTkVfU0RJbml0KHN0cnVjdCB1c19kYXRhICp1cykKIHsKIAlzdHJ1Y3QgYnVsa19jYl93cmFwICpiY2IgPSAoc3RydWN0IGJ1bGtfY2Jfd3JhcCAqKSB1cy0+aW9idWY7CiAJaW50CXJlc3VsdDsKIAlCWVRFCWJ1ZlsweDIwMF07CiAKLQlwcmludGsoInRyYW5zcG9ydCAtLS0gRU5FX1NESW5pdFxuIik7Ci0JLy8gU0QgSW5pdCBQYXJ0LTEKKwlwcmludGsoS0VSTl9JTkZPICJ0cmFuc3BvcnQgLS0tIEVORV9TREluaXRcbiIpOworCS8qIFNEIEluaXQgUGFydC0xICovCiAJcmVzdWx0ID0gRU5FX0xvYWRCaW5Db2RlKHVzLCBTRF9JTklUMV9QQVRURVJOKTsKLQlpZiAocmVzdWx0ICE9IFVTQl9TVE9SX1hGRVJfR09PRCkKLQl7Ci0JCXByaW50aygiTG9hZCBTRCBJbml0IENvZGUgUGFydC0xIEZhaWwgISFcbiIpOworCWlmIChyZXN1bHQgIT0gVVNCX1NUT1JfWEZFUl9HT09EKSB7CisJCXByaW50ayhLRVJOX0VSUiAiTG9hZCBTRCBJbml0IENvZGUgUGFydC0xIEZhaWwgISFcbiIpOwogCQlyZXR1cm4gVVNCX1NUT1JfVFJBTlNQT1JUX0VSUk9SOwogCX0KIApAQCAtOTgsMTcgKzk1LDE1IEBACiAJYmNiLT5DREJbMF0gPSAweEYyOwogCiAJcmVzdWx0ID0gRU5FX1NlbmRTY3NpQ21kKHVzLCBGRElSX1JFQUQsIE5VTEwsIDApOwotCWlmIChyZXN1bHQgIT0gVVNCX1NUT1JfWEZFUl9HT09EKQotCXsKLQkJcHJpbnRrKCJFeGVjdGlvbiBTRCBJbml0IENvZGUgRmFpbCAhIVxuIik7CisJaWYgKHJlc3VsdCAhPSBVU0JfU1RPUl9YRkVSX0dPT0QpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJFeGVjdGlvbiBTRCBJbml0IENvZGUgRmFpbCAhIVxuIik7CiAJCXJldHVybiBVU0JfU1RPUl9UUkFOU1BPUlRfRVJST1I7CiAJfQogCi0JLy8gU0QgSW5pdCBQYXJ0LTIKKwkvKiBTRCBJbml0IFBhcnQtMiAqLwogCXJlc3VsdCA9IEVORV9Mb2FkQmluQ29kZSh1cywgU0RfSU5JVDJfUEFUVEVSTik7Ci0JaWYgKHJlc3VsdCAhPSBVU0JfU1RPUl9YRkVSX0dPT0QpCi0JewotCQlwcmludGsoIkxvYWQgU0QgSW5pdCBDb2RlIFBhcnQtMiBGYWlsICEhXG4iKTsKKwlpZiAocmVzdWx0ICE9IFVTQl9TVE9SX1hGRVJfR09PRCkgeworCQlwcmludGsoS0VSTl9FUlIgIkxvYWQgU0QgSW5pdCBDb2RlIFBhcnQtMiBGYWlsICEhXG4iKTsKIAkJcmV0dXJuIFVTQl9TVE9SX1RSQU5TUE9SVF9FUlJPUjsKIAl9CiAKQEAgLTExOSw0NSArMTE0LDQxIEBACiAJYmNiLT5DREJbMF0JCQk9IDB4RjE7CiAKIAlyZXN1bHQgPSBFTkVfU2VuZFNjc2lDbWQodXMsIEZESVJfUkVBRCwgJmJ1ZiwgMCk7Ci0JaWYgKHJlc3VsdCAhPSBVU0JfU1RPUl9YRkVSX0dPT0QpCi0JewotCQlwcmludGsoIkV4ZWN0aW9uIFNEIEluaXQgQ29kZSBGYWlsICEhXG4iKTsKKwlpZiAocmVzdWx0ICE9IFVTQl9TVE9SX1hGRVJfR09PRCkgeworCQlwcmludGsoS0VSTl9FUlIgIkV4ZWN0aW9uIFNEIEluaXQgQ29kZSBGYWlsICEhXG4iKTsKIAkJcmV0dXJuIFVTQl9TVE9SX1RSQU5TUE9SVF9FUlJPUjsKIAl9CiAKIAl1cy0+U0RfU3RhdHVzID0gICooUFNEX1NUQVRVUykmYnVmWzBdOwotCWlmICh1cy0+U0RfU3RhdHVzLkluc2VydCAmJiB1cy0+U0RfU3RhdHVzLlJlYWR5KQotCXsKKwlpZiAodXMtPlNEX1N0YXR1cy5JbnNlcnQgJiYgdXMtPlNEX1N0YXR1cy5SZWFkeSkgewogCQlFTkVfUmVhZFNEUmVnKHVzLCAoUEJZVEUpJmJ1Zik7Ci0JCXByaW50aygiSW5zZXJ0ICAgICA9ICV4XG4iLCB1cy0+U0RfU3RhdHVzLkluc2VydCk7Ci0JCXByaW50aygiUmVhZHkgICAgICA9ICV4XG4iLCB1cy0+U0RfU3RhdHVzLlJlYWR5KTsKLQkJcHJpbnRrKCJJc01NQyAgICAgID0gJXhcbiIsIHVzLT5TRF9TdGF0dXMuSXNNTUMpOwotCQlwcmludGsoIkhpQ2FwYWNpdHkgPSAleFxuIiwgdXMtPlNEX1N0YXR1cy5IaUNhcGFjaXR5KTsKLQkJcHJpbnRrKCJIaVNwZWVkICAgID0gJXhcbiIsIHVzLT5TRF9TdGF0dXMuSGlTcGVlZCk7Ci0JCXByaW50aygiV3RQICAgICAgICA9ICV4XG4iLCB1cy0+U0RfU3RhdHVzLld0UCk7Ci0JfQotCWVsc2UKLQl7Ci0JCXByaW50aygiU0QgQ2FyZCBOb3QgUmVhZHkgLS0tICV4XG4iLCBidWZbMF0pOworCQlwcmludGsoS0VSTl9JTkZPICJJbnNlcnQgICAgID0gJXhcbiIsIHVzLT5TRF9TdGF0dXMuSW5zZXJ0KTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiUmVhZHkgICAgICA9ICV4XG4iLCB1cy0+U0RfU3RhdHVzLlJlYWR5KTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiSXNNTUMgICAgICA9ICV4XG4iLCB1cy0+U0RfU3RhdHVzLklzTU1DKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiSGlDYXBhY2l0eSA9ICV4XG4iLCB1cy0+U0RfU3RhdHVzLkhpQ2FwYWNpdHkpOworCQlwcmludGsoS0VSTl9JTkZPICJIaVNwZWVkICAgID0gJXhcbiIsIHVzLT5TRF9TdGF0dXMuSGlTcGVlZCk7CisJCXByaW50ayhLRVJOX0lORk8gIld0UCAgICAgICAgPSAleFxuIiwgdXMtPlNEX1N0YXR1cy5XdFApOworCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX0VSUiAiU0QgQ2FyZCBOb3QgUmVhZHkgLS0tICV4XG4iLCBidWZbMF0pOwogCQlyZXR1cm4gVVNCX1NUT1JfVFJBTlNQT1JUX0VSUk9SOwogCX0KIAlyZXR1cm4gVVNCX1NUT1JfVFJBTlNQT1JUX0dPT0Q7CiB9CiAKLS8vLS0tLS0gRU5FX01TSW5pdCgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qCisgKiBFTkVfTVNJbml0KCk6CisgKi8KIGludCBFTkVfTVNJbml0KHN0cnVjdCB1c19kYXRhICp1cykKIHsKIAlzdHJ1Y3QgYnVsa19jYl93cmFwICpiY2IgPSAoc3RydWN0IGJ1bGtfY2Jfd3JhcCAqKSB1cy0+aW9idWY7CiAJaW50CXJlc3VsdDsKIAlCWVRFCWJ1ZlsweDIwMF07CiAJV09SRAlNU1BfQmxvY2tTaXplLCBNU1BfVXNlckFyZWFCbG9ja3M7Ci0JCiAKLQlwcmludGsoInRyYW5zcG9ydCAtLS0gRU5FX01TSW5pdFxuIik7CisJcHJpbnRrKEtFUk5fSU5GTyAidHJhbnNwb3J0IC0tLSBFTkVfTVNJbml0XG4iKTsKIAlyZXN1bHQgPSBFTkVfTG9hZEJpbkNvZGUodXMsIE1TX0lOSVRfUEFUVEVSTik7Ci0JaWYgKHJlc3VsdCAhPSBVU0JfU1RPUl9YRkVSX0dPT0QpCi0JewotCQlwcmludGsoIkxvYWQgTVMgSW5pdCBDb2RlIEZhaWwgISFcbiIpOworCWlmIChyZXN1bHQgIT0gVVNCX1NUT1JfWEZFUl9HT09EKSB7CisJCXByaW50ayhLRVJOX0VSUiAiTG9hZCBNUyBJbml0IENvZGUgRmFpbCAhIVxuIik7CiAJCXJldHVybiBVU0JfU1RPUl9UUkFOU1BPUlRfRVJST1I7CiAJfQogCkBAIC0xNjksNTMgKzE2MCw0OSBAQAogCWJjYi0+Q0RCWzFdCQkJPSAweDAxOwogCiAJcmVzdWx0ID0gRU5FX1NlbmRTY3NpQ21kKHVzLCBGRElSX1JFQUQsICZidWYsIDApOwotCWlmIChyZXN1bHQgIT0gVVNCX1NUT1JfWEZFUl9HT09EKQotCXsKLQkJcHJpbnRrKCJFeGVjdGlvbiBNUyBJbml0IENvZGUgRmFpbCAhIVxuIik7CisJaWYgKHJlc3VsdCAhPSBVU0JfU1RPUl9YRkVSX0dPT0QpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJFeGVjdGlvbiBNUyBJbml0IENvZGUgRmFpbCAhIVxuIik7CiAJCXJldHVybiBVU0JfU1RPUl9UUkFOU1BPUlRfRVJST1I7CiAJfQogCiAJdXMtPk1TX1N0YXR1cyA9ICooUE1TX1NUQVRVUykmYnVmWzBdOwogCi0JaWYgKHVzLT5NU19TdGF0dXMuSW5zZXJ0ICYmIHVzLT5NU19TdGF0dXMuUmVhZHkpCi0JewotCQlwcmludGsoIkluc2VydCAgICAgPSAleFxuIiwgdXMtPk1TX1N0YXR1cy5JbnNlcnQpOwotCQlwcmludGsoIlJlYWR5ICAgICAgPSAleFxuIiwgdXMtPk1TX1N0YXR1cy5SZWFkeSk7Ci0JCXByaW50aygiSXNNU1BybyAgICA9ICV4XG4iLCB1cy0+TVNfU3RhdHVzLklzTVNQcm8pOwotCQlwcmludGsoIklzTVNQSEcgICAgPSAleFxuIiwgdXMtPk1TX1N0YXR1cy5Jc01TUEhHKTsKLQkJcHJpbnRrKCJXdFAgICAgICAgID0gJXhcbiIsIHVzLT5NU19TdGF0dXMuV3RQKTsKLQkJaWYgKHVzLT5NU19TdGF0dXMuSXNNU1BybykKLQkJewotCQkJTVNQX0Jsb2NrU2l6ZSAgICAgID0gKGJ1Zls2XSA8PDgpIHwgYnVmWzddOwotCQkJTVNQX1VzZXJBcmVhQmxvY2tzID0gKGJ1ZlsxMF08PDgpIHwgYnVmWzExXTsKKwlpZiAodXMtPk1TX1N0YXR1cy5JbnNlcnQgJiYgdXMtPk1TX1N0YXR1cy5SZWFkeSkgeworCQlwcmludGsoS0VSTl9JTkZPICJJbnNlcnQgICAgID0gJXhcbiIsIHVzLT5NU19TdGF0dXMuSW5zZXJ0KTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiUmVhZHkgICAgICA9ICV4XG4iLCB1cy0+TVNfU3RhdHVzLlJlYWR5KTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiSXNNU1BybyAgICA9ICV4XG4iLCB1cy0+TVNfU3RhdHVzLklzTVNQcm8pOworCQlwcmludGsoS0VSTl9JTkZPICJJc01TUEhHICAgID0gJXhcbiIsIHVzLT5NU19TdGF0dXMuSXNNU1BIRyk7CisJCXByaW50ayhLRVJOX0lORk8gIld0UCAgICAgICAgPSAleFxuIiwgdXMtPk1TX1N0YXR1cy5XdFApOworCQlpZiAodXMtPk1TX1N0YXR1cy5Jc01TUHJvKSB7CisJCQlNU1BfQmxvY2tTaXplICAgICAgPSAoYnVmWzZdIDw8IDgpIHwgYnVmWzddOworCQkJTVNQX1VzZXJBcmVhQmxvY2tzID0gKGJ1ZlsxMF0gPDwgOCkgfCBidWZbMTFdOwogCQkJdXMtPk1TUF9Ub3RhbEJsb2NrID0gTVNQX0Jsb2NrU2l6ZSAqIE1TUF9Vc2VyQXJlYUJsb2NrczsKLQkJfQotCQllbHNlCisJCX0gZWxzZSB7CiAJCQlNU19DYXJkSW5pdCh1cyk7Ci0JCXByaW50aygiTVMgSW5pdCBDb2RlIE9LICEhXG4iKTsKLQl9Ci0JZWxzZQotCXsKLQkJcHJpbnRrKCJNUyBDYXJkIE5vdCBSZWFkeSAtLS0gJXhcbiIsIGJ1ZlswXSk7CisJCX0KKwkJcHJpbnRrKEtFUk5fSU5GTyAiTVMgSW5pdCBDb2RlIE9LICEhXG4iKTsKKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9JTkZPICJNUyBDYXJkIE5vdCBSZWFkeSAtLS0gJXhcbiIsIGJ1ZlswXSk7CiAJCXJldHVybiBVU0JfU1RPUl9UUkFOU1BPUlRfRVJST1I7CiAJfQogCiAJcmV0dXJuIFVTQl9TVE9SX1RSQU5TUE9SVF9HT09EOwogfQogCi0vLy0tLS0tIEVORV9TTUluaXQoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKgorICpFTkVfU01Jbml0KCkKKyAqLwogaW50IEVORV9TTUluaXQoc3RydWN0IHVzX2RhdGEgKnVzKQogewogCXN0cnVjdCBidWxrX2NiX3dyYXAgKmJjYiA9IChzdHJ1Y3QgYnVsa19jYl93cmFwICopIHVzLT5pb2J1ZjsKIAlpbnQJcmVzdWx0OwogCUJZVEUJYnVmWzB4MjAwXTsKIAotCXByaW50aygidHJhbnNwb3J0IC0tLSBFTkVfU01Jbml0XG4iKTsKKwlwcmludGsoS0VSTl9JTkZPICJ0cmFuc3BvcnQgLS0tIEVORV9TTUluaXRcbiIpOwogCiAJcmVzdWx0ID0gRU5FX0xvYWRCaW5Db2RlKHVzLCBTTV9JTklUX1BBVFRFUk4pOwotCWlmIChyZXN1bHQgIT0gVVNCX1NUT1JfWEZFUl9HT09EKQotCXsKLQkJcHJpbnRrKCJMb2FkIFNNIEluaXQgQ29kZSBGYWlsICEhXG4iKTsKKwlpZiAocmVzdWx0ICE9IFVTQl9TVE9SX1hGRVJfR09PRCkgeworCQlwcmludGsoS0VSTl9JTkZPICJMb2FkIFNNIEluaXQgQ29kZSBGYWlsICEhXG4iKTsKIAkJcmV0dXJuIFVTQl9TVE9SX1RSQU5TUE9SVF9FUlJPUjsKIAl9CiAKQEAgLTIyNyw5ICsyMTQsOSBAQAogCWJjYi0+Q0RCWzFdCQkJPSAweDAxOwogCiAJcmVzdWx0ID0gRU5FX1NlbmRTY3NpQ21kKHVzLCBGRElSX1JFQUQsICZidWYsIDApOwotCWlmIChyZXN1bHQgIT0gVVNCX1NUT1JfWEZFUl9HT09EKQotCXsKLQkJcHJpbnRrKCJFeGVjdGlvbiBTTSBJbml0IENvZGUgRmFpbCAhISByZXN1bHQgPSAleFxuIiwgcmVzdWx0KTsKKwlpZiAocmVzdWx0ICE9IFVTQl9TVE9SX1hGRVJfR09PRCkgeworCQlwcmludGsoS0VSTl9FUlIKKwkJICAgICAgICJFeGVjdGlvbiBTTSBJbml0IENvZGUgRmFpbCAhISByZXN1bHQgPSAleFxuIiwgcmVzdWx0KTsKIAkJcmV0dXJuIFVTQl9TVE9SX1RSQU5TUE9SVF9FUlJPUjsKIAl9CiAKQEAgLTIzOCwzMiArMjI1LDMxIEBACiAJdXMtPlNNX0RldmljZUlEID0gYnVmWzFdOwogCXVzLT5TTV9DYXJkSUQgICA9IGJ1ZlsyXTsKIAotCWlmICh1cy0+U01fU3RhdHVzLkluc2VydCAmJiB1cy0+U01fU3RhdHVzLlJlYWR5KQotCXsKLQkJcHJpbnRrKCJJbnNlcnQgICAgID0gJXhcbiIsIHVzLT5TTV9TdGF0dXMuSW5zZXJ0KTsKLQkJcHJpbnRrKCJSZWFkeSAgICAgID0gJXhcbiIsIHVzLT5TTV9TdGF0dXMuUmVhZHkpOwotCQlwcmludGsoIld0UCAgICAgICAgPSAleFxuIiwgdXMtPlNNX1N0YXR1cy5XdFApOwotCQlwcmludGsoIkRldmljZUlEICAgPSAleFxuIiwgdXMtPlNNX0RldmljZUlEKTsKLQkJcHJpbnRrKCJDYXJkSUQgICAgID0gJXhcbiIsIHVzLT5TTV9DYXJkSUQpOworCWlmICh1cy0+U01fU3RhdHVzLkluc2VydCAmJiB1cy0+U01fU3RhdHVzLlJlYWR5KSB7CisJCXByaW50ayhLRVJOX0lORk8gIkluc2VydCAgICAgPSAleFxuIiwgdXMtPlNNX1N0YXR1cy5JbnNlcnQpOworCQlwcmludGsoS0VSTl9JTkZPICJSZWFkeSAgICAgID0gJXhcbiIsIHVzLT5TTV9TdGF0dXMuUmVhZHkpOworCQlwcmludGsoS0VSTl9JTkZPICJXdFAgICAgICAgID0gJXhcbiIsIHVzLT5TTV9TdGF0dXMuV3RQKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiRGV2aWNlSUQgICA9ICV4XG4iLCB1cy0+U01fRGV2aWNlSUQpOworCQlwcmludGsoS0VSTl9JTkZPICJDYXJkSUQgICAgID0gJXhcbiIsIHVzLT5TTV9DYXJkSUQpOwogCQlNZWRpYUNoYW5nZSA9IDE7CiAJCUNoZWNrX0RfTWVkaWFGbXQodXMpOwotCX0KLQllbHNlCi0JewotCQlwcmludGsoIlNNIENhcmQgTm90IFJlYWR5IC0tLSAleFxuIiwgYnVmWzBdKTsKKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9FUlIgIlNNIENhcmQgTm90IFJlYWR5IC0tLSAleFxuIiwgYnVmWzBdKTsKIAkJcmV0dXJuIFVTQl9TVE9SX1RSQU5TUE9SVF9FUlJPUjsKIAl9CiAKIAlyZXR1cm4gVVNCX1NUT1JfVFJBTlNQT1JUX0dPT0Q7CiB9CiAKLS8vLS0tLS0gRU5FX1JlYWRTRFJlZygpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qCisgKiBFTkVfUmVhZFNEUmVnKCkKKyAqLwogaW50IEVORV9SZWFkU0RSZWcoc3RydWN0IHVzX2RhdGEgKnVzLCB1OCAqUmRCdWYpCiB7CiAJV09SRAl0bXByZWc7CiAJRFdPUkQJcmVnNGI7Ci0JCi0JLy9wcmludGsoInRyYW5zcG9ydCAtLS0gRU5FX1JlYWRTRFJlZ1xuIik7CisKKwkvKiBwcmludGsoS0VSTl9JTkZPICJ0cmFuc3BvcnQgLS0tIEVORV9SZWFkU0RSZWdcbiIpOyAqLwogCXJlZzRiID0gKihQRFdPUkQpJlJkQnVmWzB4MThdOwogCXVzLT5TRF9SRUFEX0JMX0xFTiA9IChCWVRFKSgocmVnNGIgPj4gOCkgJiAweDBmKTsKIApAQCAtMjc3LDc0ICsyNjMsNzUgQEAKIAlpZiAodXMtPlNEX1N0YXR1cy5IaUNhcGFjaXR5ICYmIHVzLT5TRF9TdGF0dXMuSXNNTUMpCiAJCXVzLT5IQ19DX1NJWkUgPSAqKFBEV09SRCkoJlJkQnVmWzB4MTAwXSk7CiAKLQlpZiAodXMtPlNEX1JFQURfQkxfTEVOID4gU0RfQkxPQ0tfTEVOKQotCXsKLQkJdXMtPlNEX0Jsb2NrX011bHQgPSAxIDw8ICh1cy0+U0RfUkVBRF9CTF9MRU4gLSBTRF9CTE9DS19MRU4pOwkJdXMtPlNEX1JFQURfQkxfTEVOID0gU0RfQkxPQ0tfTEVOOwotCX0KLQllbHNlCi0JewkJdXMtPlNEX0Jsb2NrX011bHQgPSAxOworCWlmICh1cy0+U0RfUkVBRF9CTF9MRU4gPiBTRF9CTE9DS19MRU4pIHsKKwkJdXMtPlNEX0Jsb2NrX011bHQgPQorCQkJMSA8PCAodXMtPlNEX1JFQURfQkxfTEVOIC0gU0RfQkxPQ0tfTEVOKTsKKwkJdXMtPlNEX1JFQURfQkxfTEVOID0gU0RfQkxPQ0tfTEVOOworCX0gZWxzZSB7CisJCXVzLT5TRF9CbG9ja19NdWx0ID0gMTsKIAl9CiAJcmV0dXJuIFVTQl9TVE9SX1RSQU5TUE9SVF9HT09EOwogfQogCi0vLy0tLS0tIEVORV9Mb2FkQmluQ29kZSgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyoKKyAqIEVORV9Mb2FkQmluQ29kZSgpCisgKi8KIGludCBFTkVfTG9hZEJpbkNvZGUoc3RydWN0IHVzX2RhdGEgKnVzLCBCWVRFIGZsYWcpCiB7CiAJc3RydWN0IGJ1bGtfY2Jfd3JhcCAqYmNiID0gKHN0cnVjdCBidWxrX2NiX3dyYXAgKikgdXMtPmlvYnVmOwogCWludCByZXN1bHQ7Ci0JLy92b2lkICpidWY7CisJLyogdm9pZCAqYnVmOyAqLwogCVBCWVRFIGJ1ZjsKIAotCS8vcHJpbnRrKCJ0cmFuc3BvcnQgLS0tIEVORV9Mb2FkQmluQ29kZVxuIik7CisJLyogcHJpbnRrKEtFUk5fSU5GTyAidHJhbnNwb3J0IC0tLSBFTkVfTG9hZEJpbkNvZGVcbiIpOyAqLwogCWlmICh1cy0+QklOX0ZMQUcgPT0gZmxhZykKIAkJcmV0dXJuIFVTQl9TVE9SX1RSQU5TUE9SVF9HT09EOwogCiAJYnVmID0ga21hbGxvYygweDgwMCwgR0ZQX0tFUk5FTCk7CiAJaWYgKGJ1ZiA9PSBOVUxMKQogCQlyZXR1cm4gVVNCX1NUT1JfVFJBTlNQT1JUX0VSUk9SOwotCXN3aXRjaCAoIGZsYWcgKQotCXsKLQkJLy8gRm9yIFNECi0JCWNhc2UgU0RfSU5JVDFfUEFUVEVSTjoKLQkJCXByaW50aygiU0RfSU5JVDFfUEFUVEVSTlxuIik7Ci0JCQltZW1jcHkoYnVmLCBTRF9Jbml0MSwgMHg4MDApOworCXN3aXRjaCAoZmxhZykgeworCS8qIEZvciBTRCAqLworCWNhc2UgU0RfSU5JVDFfUEFUVEVSTjoKKwkJcHJpbnRrKEtFUk5fSU5GTyAiU0RfSU5JVDFfUEFUVEVSTlxuIik7CisJCW1lbWNweShidWYsIFNEX0luaXQxLCAweDgwMCk7CiAJCWJyZWFrOwotCQljYXNlIFNEX0lOSVQyX1BBVFRFUk46Ci0JCQlwcmludGsoIlNEX0lOSVQyX1BBVFRFUk5cbiIpOwotCQkJbWVtY3B5KGJ1ZiwgU0RfSW5pdDIsIDB4ODAwKTsKKwljYXNlIFNEX0lOSVQyX1BBVFRFUk46CisJCXByaW50ayhLRVJOX0lORk8gIlNEX0lOSVQyX1BBVFRFUk5cbiIpOworCQltZW1jcHkoYnVmLCBTRF9Jbml0MiwgMHg4MDApOwogCQlicmVhazsKLQkJY2FzZSBTRF9SV19QQVRURVJOOgotCQkJcHJpbnRrKCJTRF9SV19QQVRURVJOXG4iKTsKLQkJCW1lbWNweShidWYsIFNEX1Jkd3IsIDB4ODAwKTsKKwljYXNlIFNEX1JXX1BBVFRFUk46CisJCXByaW50ayhLRVJOX0lORk8gIlNEX1JXX1BBVFRFUk5cbiIpOworCQltZW1jcHkoYnVmLCBTRF9SZHdyLCAweDgwMCk7CiAJCWJyZWFrOwotCQkvLyBGb3IgTVMKLQkJY2FzZSBNU19JTklUX1BBVFRFUk46Ci0JCQlwcmludGsoIk1TX0lOSVRfUEFUVEVSTlxuIik7Ci0JCQltZW1jcHkoYnVmLCBNU19Jbml0LCAweDgwMCk7CisJLyogRm9yIE1TICovCisJY2FzZSBNU19JTklUX1BBVFRFUk46CisJCXByaW50ayhLRVJOX0lORk8gIk1TX0lOSVRfUEFUVEVSTlxuIik7CisJCW1lbWNweShidWYsIE1TX0luaXQsIDB4ODAwKTsKIAkJYnJlYWs7Ci0JCWNhc2UgTVNQX1JXX1BBVFRFUk46Ci0JCQlwcmludGsoIk1TUF9SV19QQVRURVJOXG4iKTsKLQkJCW1lbWNweShidWYsIE1TUF9SZHdyLCAweDgwMCk7CisJY2FzZSBNU1BfUldfUEFUVEVSTjoKKwkJcHJpbnRrKEtFUk5fSU5GTyAiTVNQX1JXX1BBVFRFUk5cbiIpOworCQltZW1jcHkoYnVmLCBNU1BfUmR3ciwgMHg4MDApOwogCQlicmVhazsKLQkJY2FzZSBNU19SV19QQVRURVJOOgotCQkJcHJpbnRrKCJNU19SV19QQVRURVJOXG4iKTsKLQkJCW1lbWNweShidWYsIE1TX1Jkd3IsIDB4ODAwKTsKKwljYXNlIE1TX1JXX1BBVFRFUk46CisJCXByaW50ayhLRVJOX0lORk8gIk1TX1JXX1BBVFRFUk5cbiIpOworCQltZW1jcHkoYnVmLCBNU19SZHdyLCAweDgwMCk7CiAJCWJyZWFrOwotCQkvLyBGb3IgU1MKLQkJY2FzZSBTTV9JTklUX1BBVFRFUk46Ci0JCQlwcmludGsoIlNNX0lOSVRfUEFUVEVSTlxuIik7Ci0JCQltZW1jcHkoYnVmLCBTTV9Jbml0LCAweDgwMCk7CisJLyogRm9yIFNTICovCisJY2FzZSBTTV9JTklUX1BBVFRFUk46CisJCXByaW50ayhLRVJOX0lORk8gIlNNX0lOSVRfUEFUVEVSTlxuIik7CisJCW1lbWNweShidWYsIFNNX0luaXQsIDB4ODAwKTsKIAkJYnJlYWs7Ci0JCWNhc2UgU01fUldfUEFUVEVSTjoKLQkJCXByaW50aygiU01fUldfUEFUVEVSTlxuIik7Ci0JCQltZW1jcHkoYnVmLCBTTV9SZHdyLCAweDgwMCk7CisJY2FzZSBTTV9SV19QQVRURVJOOgorCQlwcmludGsoS0VSTl9JTkZPICJTTV9SV19QQVRURVJOXG4iKTsKKwkJbWVtY3B5KGJ1ZiwgU01fUmR3ciwgMHg4MDApOwogCQlicmVhazsKIAl9CiAKIAltZW1zZXQoYmNiLCAwLCBzaXplb2Yoc3RydWN0IGJ1bGtfY2Jfd3JhcCkpOwogCWJjYi0+U2lnbmF0dXJlID0gY3B1X3RvX2xlMzIoVVNfQlVMS19DQl9TSUdOKTsKIAliY2ItPkRhdGFUcmFuc2Zlckxlbmd0aCA9IDB4ODAwOwotCWJjYi0+RmxhZ3MgPTB4MDA7CisJYmNiLT5GbGFncyA9IDB4MDA7CiAJYmNiLT5DREJbMF0gPSAweEVGOwogCiAJcmVzdWx0ID0gRU5FX1NlbmRTY3NpQ21kKHVzLCBGRElSX1dSSVRFLCBidWYsIDApOwpAQCAtMzU0LDU0ICszNDEsNjMgQEAKIAlyZXR1cm4gcmVzdWx0OwogfQogCi0vLy0tLS0tIEVORV9TZW5kU2NzaUNtZCgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyoKKyAqIEVORV9TZW5kU2NzaUNtZCgpOgorICovCiBpbnQgRU5FX1NlbmRTY3NpQ21kKHN0cnVjdCB1c19kYXRhICp1cywgQllURSBmRGlyLCB2b2lkICpidWYsIGludCB1c2Vfc2cpCiB7CiAJc3RydWN0IGJ1bGtfY2Jfd3JhcCAqYmNiID0gKHN0cnVjdCBidWxrX2NiX3dyYXAgKikgdXMtPmlvYnVmOwogCXN0cnVjdCBidWxrX2NzX3dyYXAgKmJjcyA9IChzdHJ1Y3QgYnVsa19jc193cmFwICopIHVzLT5pb2J1ZjsKIAogCWludCByZXN1bHQ7Ci0JdW5zaWduZWQgaW50IHRyYW5zZmVyX2xlbmd0aD1iY2ItPkRhdGFUcmFuc2Zlckxlbmd0aCwgY3N3bGVuPTAsIHBhcnRpYWw9MDsKKwl1bnNpZ25lZCBpbnQgdHJhbnNmZXJfbGVuZ3RoID0gYmNiLT5EYXRhVHJhbnNmZXJMZW5ndGgsCisJCSAgICAgY3N3bGVuID0gMCwgcGFydGlhbCA9IDA7CiAJdW5zaWduZWQgaW50IHJlc2lkdWU7CiAKLQkvL3ByaW50aygidHJhbnNwb3J0IC0tLSBFTkVfU2VuZFNjc2lDbWRcbiIpOwotCS8vIHNlbmQgY21kIHRvIG91dCBlbmRwb2ludAotCXJlc3VsdCA9IHVzYl9zdG9yX2J1bGtfdHJhbnNmZXJfYnVmKHVzLCB1cy0+c2VuZF9idWxrX3BpcGUsIGJjYiwgVVNfQlVMS19DQl9XUkFQX0xFTiwgTlVMTCk7Ci0JaWYgKHJlc3VsdCAhPSBVU0JfU1RPUl9YRkVSX0dPT0QpCi0JewotCQlwcmludGsoInNlbmQgY21kIHRvIG91dCBlbmRwb2ludCBmYWlsIC0tLVxuIik7CisJLyogcHJpbnRrKEtFUk5fSU5GTyAidHJhbnNwb3J0IC0tLSBFTkVfU2VuZFNjc2lDbWRcbiIpOyAqLworCS8qIHNlbmQgY21kIHRvIG91dCBlbmRwb2ludCAqLworCXJlc3VsdCA9IHVzYl9zdG9yX2J1bGtfdHJhbnNmZXJfYnVmKHVzLCB1cy0+c2VuZF9idWxrX3BpcGUsCisJCQkJCSAgICBiY2IsIFVTX0JVTEtfQ0JfV1JBUF9MRU4sIE5VTEwpOworCWlmIChyZXN1bHQgIT0gVVNCX1NUT1JfWEZFUl9HT09EKSB7CisJCXByaW50ayhLRVJOX0VSUiAic2VuZCBjbWQgdG8gb3V0IGVuZHBvaW50IGZhaWwgLS0tXG4iKTsKIAkJcmV0dXJuIFVTQl9TVE9SX1RSQU5TUE9SVF9FUlJPUjsKIAl9CiAKLQlpZiAoYnVmKQotCXsKLQkJdW5zaWduZWQgaW50IHBpcGUgPSBmRGlyID09IEZESVJfUkVBRCA/IHVzLT5yZWN2X2J1bGtfcGlwZSA6IHVzLT5zZW5kX2J1bGtfcGlwZTsKLQkJLy8gQnVsaworCWlmIChidWYpIHsKKwkJdW5zaWduZWQgaW50IHBpcGUgPSBmRGlyOworCisJCWlmIChmRGlyID09IEZESVJfUkVBRCkKKwkJCXBpcGUgPSB1cy0+cmVjdl9idWxrX3BpcGU7CisJCWVsc2UKKwkJCXBpcGUgPSB1cy0+c2VuZF9idWxrX3BpcGU7CisKKwkJLyogQnVsayAqLwogCQlpZiAodXNlX3NnKQogCQkJcmVzdWx0ID0gdXNiX3N0b3JfYnVsa19zcmIodXMsIHBpcGUsIHVzLT5zcmIpOwogCQllbHNlCi0JCQlyZXN1bHQgPSB1c2Jfc3Rvcl9idWxrX3RyYW5zZmVyX3NnKHVzLCBwaXBlLCBidWYsIHRyYW5zZmVyX2xlbmd0aCwgMCwgJnBhcnRpYWwpOwotCQlpZiAocmVzdWx0ICE9IFVTQl9TVE9SX1hGRVJfR09PRCkKLQkJewotCQkJcHJpbnRrKCJkYXRhIHRyYW5zZmVyIGZhaWwgLS0tXG4iKTsKKwkJCXJlc3VsdCA9IHVzYl9zdG9yX2J1bGtfdHJhbnNmZXJfc2codXMsIHBpcGUsIGJ1ZiwKKwkJCQkJCXRyYW5zZmVyX2xlbmd0aCwgMCwgJnBhcnRpYWwpOworCQlpZiAocmVzdWx0ICE9IFVTQl9TVE9SX1hGRVJfR09PRCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJkYXRhIHRyYW5zZmVyIGZhaWwgLS0tXG4iKTsKIAkJCXJldHVybiBVU0JfU1RPUl9UUkFOU1BPUlRfRVJST1I7CiAJCX0KIAl9CiAKLQkvLyBHZXQgQ1NXIGZvciBkZXZpY2Ugc3RhdHVzCi0JcmVzdWx0ID0gdXNiX3N0b3JfYnVsa190cmFuc2Zlcl9idWYodXMsIHVzLT5yZWN2X2J1bGtfcGlwZSwgYmNzLCBVU19CVUxLX0NTX1dSQVBfTEVOLCAmY3N3bGVuKTsKKwkvKiBHZXQgQ1NXIGZvciBkZXZpY2Ugc3RhdHVzICovCisJcmVzdWx0ID0gdXNiX3N0b3JfYnVsa190cmFuc2Zlcl9idWYodXMsIHVzLT5yZWN2X2J1bGtfcGlwZSwgYmNzLAorCQkJCQkJVVNfQlVMS19DU19XUkFQX0xFTiwgJmNzd2xlbik7CiAKLQlpZiAocmVzdWx0ID09IFVTQl9TVE9SX1hGRVJfU0hPUlQgJiYgY3N3bGVuID09IDApCi0JewotCQlwcmludGsoIlJlY2VpdmVkIDAtbGVuZ3RoIENTVzsgcmV0cnlpbmcuLi5cbiIpOwotCQlyZXN1bHQgPSB1c2Jfc3Rvcl9idWxrX3RyYW5zZmVyX2J1Zih1cywgdXMtPnJlY3ZfYnVsa19waXBlLCBiY3MsIFVTX0JVTEtfQ1NfV1JBUF9MRU4sICZjc3dsZW4pOworCWlmIChyZXN1bHQgPT0gVVNCX1NUT1JfWEZFUl9TSE9SVCAmJiBjc3dsZW4gPT0gMCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJSZWNlaXZlZCAwLWxlbmd0aCBDU1c7IHJldHJ5aW5nLi4uXG4iKTsKKwkJcmVzdWx0ID0gdXNiX3N0b3JfYnVsa190cmFuc2Zlcl9idWYodXMsIHVzLT5yZWN2X2J1bGtfcGlwZSwKKwkJCQkJYmNzLCBVU19CVUxLX0NTX1dSQVBfTEVOLCAmY3N3bGVuKTsKIAl9CiAKLQlpZiAocmVzdWx0ID09IFVTQl9TVE9SX1hGRVJfU1RBTExFRCkKLQl7CisJaWYgKHJlc3VsdCA9PSBVU0JfU1RPUl9YRkVSX1NUQUxMRUQpIHsKIAkJLyogZ2V0IHRoZSBzdGF0dXMgYWdhaW4gKi8KLQkJcHJpbnRrKCJBdHRlbXB0aW5nIHRvIGdldCBDU1cgKDJuZCB0cnkpLi4uXG4iKTsKLQkJcmVzdWx0ID0gdXNiX3N0b3JfYnVsa190cmFuc2Zlcl9idWYodXMsIHVzLT5yZWN2X2J1bGtfcGlwZSwgYmNzLCBVU19CVUxLX0NTX1dSQVBfTEVOLCBOVUxMKTsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiQXR0ZW1wdGluZyB0byBnZXQgQ1NXICgybmQgdHJ5KS4uLlxuIik7CisJCXJlc3VsdCA9IHVzYl9zdG9yX2J1bGtfdHJhbnNmZXJfYnVmKHVzLCB1cy0+cmVjdl9idWxrX3BpcGUsCisJCQkJCQliY3MsIFVTX0JVTEtfQ1NfV1JBUF9MRU4sIE5VTEwpOwogCX0KIAogCWlmIChyZXN1bHQgIT0gVVNCX1NUT1JfWEZFUl9HT09EKQpAQCAtNDEwLDEyICs0MDYsMTQgQEAKIAkvKiBjaGVjayBidWxrIHN0YXR1cyAqLwogCXJlc2lkdWUgPSBsZTMyX3RvX2NwdShiY3MtPlJlc2lkdWUpOwogCi0JLyogdHJ5IHRvIGNvbXB1dGUgdGhlIGFjdHVhbCByZXNpZHVlLCBiYXNlZCBvbiBob3cgbXVjaCBkYXRhCi0JICogd2FzIHJlYWxseSB0cmFuc2ZlcnJlZCBhbmQgd2hhdCB0aGUgZGV2aWNlIHRlbGxzIHVzICovCi0JaWYgKHJlc2lkdWUgJiYgISh1cy0+ZmZsYWdzICYgVVNfRkxfSUdOT1JFX1JFU0lEVUUpKQotCXsKKwkvKgorCSAqIHRyeSB0byBjb21wdXRlIHRoZSBhY3R1YWwgcmVzaWR1ZSwgYmFzZWQgb24gaG93IG11Y2ggZGF0YQorCSAqIHdhcyByZWFsbHkgdHJhbnNmZXJyZWQgYW5kIHdoYXQgdGhlIGRldmljZSB0ZWxscyB1cworCSAqLworCWlmIChyZXNpZHVlICYmICEodXMtPmZmbGFncyAmIFVTX0ZMX0lHTk9SRV9SRVNJRFVFKSkgewogCQlyZXNpZHVlID0gbWluKHJlc2lkdWUsIHRyYW5zZmVyX2xlbmd0aCk7Ci0JCXNjc2lfc2V0X3Jlc2lkKHVzLT5zcmIsIG1heChzY3NpX2dldF9yZXNpZCh1cy0+c3JiKSwgKGludCkgcmVzaWR1ZSkpOworCQlzY3NpX3NldF9yZXNpZCh1cy0+c3JiLCBtYXgoc2NzaV9nZXRfcmVzaWQodXMtPnNyYiksCisJCQkJCQkJKGludCkgcmVzaWR1ZSkpOwogCX0KIAogCWlmIChiY3MtPlN0YXR1cyAhPSBVU19CVUxLX1NUQVRfT0spCkBAIC00MjQsMzUgKzQyMiw0MCBAQAogCXJldHVybiBVU0JfU1RPUl9UUkFOU1BPUlRfR09PRDsKIH0KIAotLy8tLS0tLSBFTkVfUmVhZF9EYXRhKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKgorICogRU5FX1JlYWRfRGF0YSgpCisgKi8KIGludCBFTkVfUmVhZF9EYXRhKHN0cnVjdCB1c19kYXRhICp1cywgdm9pZCAqYnVmLCB1bnNpZ25lZCBpbnQgbGVuZ3RoKQogewogCXN0cnVjdCBidWxrX2NiX3dyYXAgKmJjYiA9IChzdHJ1Y3QgYnVsa19jYl93cmFwICopIHVzLT5pb2J1ZjsKIAlzdHJ1Y3QgYnVsa19jc193cmFwICpiY3MgPSAoc3RydWN0IGJ1bGtfY3Nfd3JhcCAqKSB1cy0+aW9idWY7CiAJaW50IHJlc3VsdDsKIAotCS8vcHJpbnRrKCJ0cmFuc3BvcnQgLS0tIEVORV9SZWFkX0RhdGFcbiIpOwotCS8vIHNldCB1cCB0aGUgY29tbWFuZCB3cmFwcGVyCisJLyogcHJpbnRrKEtFUk5fSU5GTyAidHJhbnNwb3J0IC0tLSBFTkVfUmVhZF9EYXRhXG4iKTsgKi8KKwkvKiBzZXQgdXAgdGhlIGNvbW1hbmQgd3JhcHBlciAqLwogCW1lbXNldChiY2IsIDAsIHNpemVvZihzdHJ1Y3QgYnVsa19jYl93cmFwKSk7CiAJYmNiLT5TaWduYXR1cmUgPSBjcHVfdG9fbGUzMihVU19CVUxLX0NCX1NJR04pOwogCWJjYi0+RGF0YVRyYW5zZmVyTGVuZ3RoID0gbGVuZ3RoOwotCWJjYi0+RmxhZ3MgPTB4ODA7CisJYmNiLT5GbGFncyA9IDB4ODA7CiAJYmNiLT5DREJbMF0gPSAweEVEOwogCWJjYi0+Q0RCWzJdID0gMHhGRjsKIAliY2ItPkNEQlszXSA9IDB4ODE7CiAKLQkvLyBzZW5kIGNtZCB0byBvdXQgZW5kcG9pbnQKLQlyZXN1bHQgPSB1c2Jfc3Rvcl9idWxrX3RyYW5zZmVyX2J1Zih1cywgdXMtPnNlbmRfYnVsa19waXBlLCBiY2IsIFVTX0JVTEtfQ0JfV1JBUF9MRU4sIE5VTEwpOworCS8qIHNlbmQgY21kIHRvIG91dCBlbmRwb2ludCAqLworCXJlc3VsdCA9IHVzYl9zdG9yX2J1bGtfdHJhbnNmZXJfYnVmKHVzLCB1cy0+c2VuZF9idWxrX3BpcGUsIGJjYiwKKwkJCQkJCVVTX0JVTEtfQ0JfV1JBUF9MRU4sIE5VTEwpOwogCWlmIChyZXN1bHQgIT0gVVNCX1NUT1JfWEZFUl9HT09EKQogCQlyZXR1cm4gVVNCX1NUT1JfVFJBTlNQT1JUX0VSUk9SOwogCi0JLy8gUi9XIGRhdGEKLQlyZXN1bHQgPSB1c2Jfc3Rvcl9idWxrX3RyYW5zZmVyX2J1Zih1cywgdXMtPnJlY3ZfYnVsa19waXBlLCBidWYsIGxlbmd0aCwgTlVMTCk7CisJLyogUi9XIGRhdGEgKi8KKwlyZXN1bHQgPSB1c2Jfc3Rvcl9idWxrX3RyYW5zZmVyX2J1Zih1cywgdXMtPnJlY3ZfYnVsa19waXBlLAorCQkJCQkJYnVmLCBsZW5ndGgsIE5VTEwpOwogCWlmIChyZXN1bHQgIT0gVVNCX1NUT1JfWEZFUl9HT09EKQogCQlyZXR1cm4gVVNCX1NUT1JfVFJBTlNQT1JUX0VSUk9SOwogCi0JLy8gR2V0IENTVyBmb3IgZGV2aWNlIHN0YXR1cwotCXJlc3VsdCA9IHVzYl9zdG9yX2J1bGtfdHJhbnNmZXJfYnVmKHVzLCB1cy0+cmVjdl9idWxrX3BpcGUsIGJjcywgVVNfQlVMS19DU19XUkFQX0xFTiwgTlVMTCk7CisJLyogR2V0IENTVyBmb3IgZGV2aWNlIHN0YXR1cyAqLworCXJlc3VsdCA9IHVzYl9zdG9yX2J1bGtfdHJhbnNmZXJfYnVmKHVzLCB1cy0+cmVjdl9idWxrX3BpcGUsIGJjcywKKwkJCQkJCVVTX0JVTEtfQ1NfV1JBUF9MRU4sIE5VTEwpOwogCWlmIChyZXN1bHQgIT0gVVNCX1NUT1JfWEZFUl9HT09EKQogCQlyZXR1cm4gVVNCX1NUT1JfVFJBTlNQT1JUX0VSUk9SOwogCWlmIChiY3MtPlN0YXR1cyAhPSBVU19CVUxLX1NUQVRfT0spCkBAIC00NjEsMzUgKzQ2NCw0MCBAQAogCXJldHVybiBVU0JfU1RPUl9UUkFOU1BPUlRfR09PRDsKIH0KIAotLy8tLS0tLSBFTkVfV3JpdGVfRGF0YSgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyoKKyAqIEVORV9Xcml0ZV9EYXRhKCk6CisgKi8KIGludCBFTkVfV3JpdGVfRGF0YShzdHJ1Y3QgdXNfZGF0YSAqdXMsIHZvaWQgKmJ1ZiwgdW5zaWduZWQgaW50IGxlbmd0aCkKIHsKIAlzdHJ1Y3QgYnVsa19jYl93cmFwICpiY2IgPSAoc3RydWN0IGJ1bGtfY2Jfd3JhcCAqKSB1cy0+aW9idWY7CiAJc3RydWN0IGJ1bGtfY3Nfd3JhcCAqYmNzID0gKHN0cnVjdCBidWxrX2NzX3dyYXAgKikgdXMtPmlvYnVmOwogCWludCByZXN1bHQ7CiAKLQkvL3ByaW50aygidHJhbnNwb3J0IC0tLSBFTkVfV3JpdGVfRGF0YVxuIik7Ci0JLy8gc2V0IHVwIHRoZSBjb21tYW5kIHdyYXBwZXIKKwkvKiBwcmludGsoInRyYW5zcG9ydCAtLS0gRU5FX1dyaXRlX0RhdGFcbiIpOyAqLworCS8qIHNldCB1cCB0aGUgY29tbWFuZCB3cmFwcGVyICovCiAJbWVtc2V0KGJjYiwgMCwgc2l6ZW9mKHN0cnVjdCBidWxrX2NiX3dyYXApKTsKIAliY2ItPlNpZ25hdHVyZSA9IGNwdV90b19sZTMyKFVTX0JVTEtfQ0JfU0lHTik7CiAJYmNiLT5EYXRhVHJhbnNmZXJMZW5ndGggPSBsZW5ndGg7Ci0JYmNiLT5GbGFncyA9MHgwMDsKKwliY2ItPkZsYWdzID0gMHgwMDsKIAliY2ItPkNEQlswXSA9IDB4RUU7CiAJYmNiLT5DREJbMl0gPSAweEZGOwogCWJjYi0+Q0RCWzNdID0gMHg4MTsKIAotCS8vIHNlbmQgY21kIHRvIG91dCBlbmRwb2ludAotCXJlc3VsdCA9IHVzYl9zdG9yX2J1bGtfdHJhbnNmZXJfYnVmKHVzLCB1cy0+c2VuZF9idWxrX3BpcGUsIGJjYiwgVVNfQlVMS19DQl9XUkFQX0xFTiwgTlVMTCk7CisJLyogc2VuZCBjbWQgdG8gb3V0IGVuZHBvaW50ICovCisJcmVzdWx0ID0gdXNiX3N0b3JfYnVsa190cmFuc2Zlcl9idWYodXMsIHVzLT5zZW5kX2J1bGtfcGlwZSwgYmNiLAorCQkJCQkJVVNfQlVMS19DQl9XUkFQX0xFTiwgTlVMTCk7CiAJaWYgKHJlc3VsdCAhPSBVU0JfU1RPUl9YRkVSX0dPT0QpCiAJCXJldHVybiBVU0JfU1RPUl9UUkFOU1BPUlRfRVJST1I7CiAKLQkvLyBSL1cgZGF0YQotCXJlc3VsdCA9IHVzYl9zdG9yX2J1bGtfdHJhbnNmZXJfYnVmKHVzLCB1cy0+c2VuZF9idWxrX3BpcGUsIGJ1ZiwgbGVuZ3RoLCBOVUxMKTsKKwkvKiBSL1cgZGF0YSAqLworCXJlc3VsdCA9IHVzYl9zdG9yX2J1bGtfdHJhbnNmZXJfYnVmKHVzLCB1cy0+c2VuZF9idWxrX3BpcGUsCisJCQkJCQlidWYsIGxlbmd0aCwgTlVMTCk7CiAJaWYgKHJlc3VsdCAhPSBVU0JfU1RPUl9YRkVSX0dPT0QpCiAJCXJldHVybiBVU0JfU1RPUl9UUkFOU1BPUlRfRVJST1I7CiAKLQkvLyBHZXQgQ1NXIGZvciBkZXZpY2Ugc3RhdHVzCi0JcmVzdWx0ID0gdXNiX3N0b3JfYnVsa190cmFuc2Zlcl9idWYodXMsIHVzLT5yZWN2X2J1bGtfcGlwZSwgYmNzLCBVU19CVUxLX0NTX1dSQVBfTEVOLCBOVUxMKTsKKwkvKiBHZXQgQ1NXIGZvciBkZXZpY2Ugc3RhdHVzICovCisJcmVzdWx0ID0gdXNiX3N0b3JfYnVsa190cmFuc2Zlcl9idWYodXMsIHVzLT5yZWN2X2J1bGtfcGlwZSwgYmNzLAorCQkJCQkJVVNfQlVMS19DU19XUkFQX0xFTiwgTlVMTCk7CiAJaWYgKHJlc3VsdCAhPSBVU0JfU1RPUl9YRkVSX0dPT0QpCiAJCXJldHVybiBVU0JfU1RPUl9UUkFOU1BPUlRfRVJST1I7CiAJaWYgKGJjcy0+U3RhdHVzICE9IFVTX0JVTEtfU1RBVF9PSykKQEAgLTQ5OCw0MiArNTA2LDUyIEBACiAJcmV0dXJuIFVTQl9TVE9SX1RSQU5TUE9SVF9HT09EOwogfQogCi0vLy0tLS0tIHVzYl9zdG9yX3ByaW50X2NtZCgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyoKKyAqIHVzYl9zdG9yX3ByaW50X2NtZCgpOgorICovCiB2b2lkIHVzYl9zdG9yX3ByaW50X2NtZChzdHJ1Y3Qgc2NzaV9jbW5kICpzcmIpCiB7CiAJUEJZVEUJQ2RiID0gc3JiLT5jbW5kOwogCURXT1JECWNtZCA9IENkYlswXTsKLQlEV09SRAlibiAgPQkoKENkYlsyXTw8MjQpICYgMHhmZjAwMDAwMCkgfCAoKENkYlszXTw8MTYpICYgMHgwMGZmMDAwMCkgfAotCQkJKChDZGJbNF08PCA4KSAmIDB4MDAwMGZmMDApIHwgKChDZGJbNV08PCAwKSAmIDB4MDAwMDAwZmYpOwotCVdPUkQJYmxlbiA9ICgoQ2RiWzddPDwgOCkgJiAweGZmMDApIHwgKChDZGJbOF08PCAwKSAmIDB4MDBmZik7CisJRFdPUkQJYm4gID0JKChDZGJbMl0gPDwgMjQpICYgMHhmZjAwMDAwMCkgfAorCQkJKChDZGJbM10gPDwgMTYpICYgMHgwMGZmMDAwMCkgfAorCQkJKChDZGJbNF0gPDwgOCkgJiAweDAwMDBmZjAwKSB8CisJCQkoKENkYls1XSA8PCAwKSAmIDB4MDAwMDAwZmYpOworCVdPUkQJYmxlbiA9ICgoQ2RiWzddIDw8IDgpICYgMHhmZjAwKSB8ICgoQ2RiWzhdIDw8IDApICYgMHgwMGZmKTsKIAogCXN3aXRjaCAoY21kKSB7CiAJY2FzZSBURVNUX1VOSVRfUkVBRFk6Ci0JCS8vcHJpbnRrKCJzY3NpIGNtZCAlWCAtLS0gU0NTSU9QX1RFU1RfVU5JVF9SRUFEWVxuIiwgY21kKTsKKwkJLyogcHJpbnRrKEtFUk5fSU5GTworCQkJICJzY3NpIGNtZCAlWCAtLS0gU0NTSU9QX1RFU1RfVU5JVF9SRUFEWVxuIiwgY21kKTsgKi8KIAkJYnJlYWs7CiAJY2FzZSBJTlFVSVJZOgotCQlwcmludGsoInNjc2kgY21kICVYIC0tLSBTQ1NJT1BfSU5RVUlSWVxuIiwgY21kKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAic2NzaSBjbWQgJVggLS0tIFNDU0lPUF9JTlFVSVJZXG4iLCBjbWQpOwogCQlicmVhazsKIAljYXNlIE1PREVfU0VOU0U6Ci0JCXByaW50aygic2NzaSBjbWQgJVggLS0tIFNDU0lPUF9NT0RFX1NFTlNFXG4iLCBjbWQpOworCQlwcmludGsoS0VSTl9JTkZPICJzY3NpIGNtZCAlWCAtLS0gU0NTSU9QX01PREVfU0VOU0VcbiIsIGNtZCk7CiAJCWJyZWFrOwogCWNhc2UgU1RBUlRfU1RPUDoKLQkJcHJpbnRrKCJzY3NpIGNtZCAlWCAtLS0gU0NTSU9QX1NUQVJUX1NUT1BcbiIsIGNtZCk7CisJCXByaW50ayhLRVJOX0lORk8gInNjc2kgY21kICVYIC0tLSBTQ1NJT1BfU1RBUlRfU1RPUFxuIiwgY21kKTsKIAkJYnJlYWs7CiAJY2FzZSBSRUFEX0NBUEFDSVRZOgotCQlwcmludGsoInNjc2kgY21kICVYIC0tLSBTQ1NJT1BfUkVBRF9DQVBBQ0lUWVxuIiwgY21kKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAic2NzaSBjbWQgJVggLS0tIFNDU0lPUF9SRUFEX0NBUEFDSVRZXG4iLCBjbWQpOwogCQlicmVhazsKIAljYXNlIFJFQURfMTA6Ci0JCS8vcHJpbnRrKCJzY3NpIGNtZCAlWCAtLS0gU0NTSU9QX1JFQUQsIGJuID0gJVgsIGJsZW4gPSAlWFxuIiwgY21kLCBibiwgYmxlbik7CisJCS8qICBwcmludGsoS0VSTl9JTkZPCisJCQkgICAic2NzaSBjbWQgJVggLS0tIFNDU0lPUF9SRUFELGJuID0gJVgsIGJsZW4gPSAlWFxuIgorCQkJICAgLGNtZCwgYm4sIGJsZW4pOyAqLwogCQlicmVhazsKIAljYXNlIFdSSVRFXzEwOgotCQkvL3ByaW50aygic2NzaSBjbWQgJVggLS0tIFNDU0lPUF9XUklURSwgYm4gPSAlWCwgYmxlbiA9ICVYXG4iLCBjbWQsIGJuLCBibGVuKTsKKwkJLyogcHJpbnRrKEtFUk5fSU5GTworCQkJICAic2NzaSBjbWQgJVggLS0tIFNDU0lPUF9XUklURSwKKwkJCSAgYm4gPSAlWCwgYmxlbiA9ICVYXG4iICwgY21kLCBibiwgYmxlbik7ICovCiAJCWJyZWFrOwogCWNhc2UgQUxMT1dfTUVESVVNX1JFTU9WQUw6Ci0JCXByaW50aygic2NzaSBjbWQgJVggLS0tIFNDU0lPUF9BTExPV19NRURJVU1fUkVNT1ZBTFxuIiwgY21kKTsKKwkJcHJpbnRrKEtFUk5fSU5GTworCQkJInNjc2kgY21kICVYIC0tLSBTQ1NJT1BfQUxMT1dfTUVESVVNX1JFTU9WQUxcbiIsIGNtZCk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCXByaW50aygic2NzaSBjbWQgJVggLS0tIE90aGVyIGNtZFxuIiwgY21kKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAic2NzaSBjbWQgJVggLS0tIE90aGVyIGNtZFxuIiwgY21kKTsKIAkJYnJlYWs7CiAJfQogCWJuID0gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9rZXVjci9pbml0LmggYi9kcml2ZXJzL3N0YWdpbmcva2V1Y3IvaW5pdC5oCmluZGV4IGNkMTk5ZmMuLjUyMjMxMzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9rZXVjci9pbml0LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2tldWNyL2luaXQuaApAQCAtMSw1ICsxLDggQEAKICNpbmNsdWRlICJjb21tb24uaCIKIAorZXh0ZXJuIERXT1JEIE1lZGlhQ2hhbmdlOworZXh0ZXJuIGludCBDaGVja19EX01lZGlhRm10KHN0cnVjdCB1c19kYXRhICopOworCiBCWVRFIFNEX0luaXQxW10gPSB7CiAweDkwLCAweEZGLCAweDA5LCAweEUwLCAweDMwLCAweEUxLCAweDA2LCAweDkwLAogMHhGRiwgMHgyMywgMHg3NCwgMHg4MCwgMHhGMCwgMHg5MCwgMHhGRiwgMHgwOSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9rZXVjci9tcy5jIGIvZHJpdmVycy9zdGFnaW5nL2tldWNyL21zLmMKaW5kZXggOWEzZmRiNC4uNDUyZWE4ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2tldWNyL21zLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2tldWNyL21zLmMKQEAgLTM0Nyw3ICszNDcsNyBAQAogCUJZVEUgICAgICAgICAgICAgICAgICAgICAqUGFnZUJ1ZmZlcjsKIAlNU19MaWJUeXBlRXh0ZGF0ICAgICAgICAgRXh0cmFEYXRhOwogCi0JaWYgKChQYWdlQnVmZmVyID0gKEJZVEUgKilrbWFsbG9jKE1TX0JZVEVTX1BFUl9QQUdFLCBHRlBfS0VSTkVMKSk9PU5VTEwpCisJaWYgKChQYWdlQnVmZmVyID0ga21hbGxvYyhNU19CWVRFU19QRVJfUEFHRSwgR0ZQX0tFUk5FTCkpPT1OVUxMKQogCQlyZXR1cm4gKERXT1JEKS0xOwogCiAJcmVzdWx0ID0gKERXT1JEKS0xOwpAQCAtNDgwLDggKzQ4MCw4IEBACiAJRFdPUkQgIGk7CiAKIAotCXVzLT5NU19MaWIuUGh5MkxvZ01hcCA9IChXT1JEICopa21hbGxvYyh1cy0+TVNfTGliLk51bWJlck9mUGh5QmxvY2sgKiBzaXplb2YoV09SRCksIEdGUF9LRVJORUwpOwotCXVzLT5NU19MaWIuTG9nMlBoeU1hcCA9IChXT1JEICopa21hbGxvYyh1cy0+TVNfTGliLk51bWJlck9mTG9nQmxvY2sgKiBzaXplb2YoV09SRCksIEdGUF9LRVJORUwpOworCXVzLT5NU19MaWIuUGh5MkxvZ01hcCA9IGttYWxsb2ModXMtPk1TX0xpYi5OdW1iZXJPZlBoeUJsb2NrICogc2l6ZW9mKFdPUkQpLCBHRlBfS0VSTkVMKTsKKwl1cy0+TVNfTGliLkxvZzJQaHlNYXAgPSBrbWFsbG9jKHVzLT5NU19MaWIuTnVtYmVyT2ZMb2dCbG9jayAqIHNpemVvZihXT1JEKSwgR0ZQX0tFUk5FTCk7CiAKIAlpZiAoKHVzLT5NU19MaWIuUGh5MkxvZ01hcCA9PSBOVUxMKSB8fCAodXMtPk1TX0xpYi5Mb2cyUGh5TWFwID09IE5VTEwpKQogCXsKQEAgLTYxMCw4ICs2MTAsOCBAQAogewogCXVzLT5NU19MaWIud3J0YmxrID0gKFdPUkQpLTE7CiAKLQl1cy0+TVNfTGliLmJsa3BhZyA9IChCWVRFICopa21hbGxvYyh1cy0+TVNfTGliLlBhZ2VzUGVyQmxvY2sgKiB1cy0+TVNfTGliLkJ5dGVzUGVyU2VjdG9yLCBHRlBfS0VSTkVMKTsKLQl1cy0+TVNfTGliLmJsa2V4dCA9IChNU19MaWJUeXBlRXh0ZGF0ICopa21hbGxvYyh1cy0+TVNfTGliLlBhZ2VzUGVyQmxvY2sgKiBzaXplb2YoTVNfTGliVHlwZUV4dGRhdCksIEdGUF9LRVJORUwpOworCXVzLT5NU19MaWIuYmxrcGFnID0ga21hbGxvYyh1cy0+TVNfTGliLlBhZ2VzUGVyQmxvY2sgKiB1cy0+TVNfTGliLkJ5dGVzUGVyU2VjdG9yLCBHRlBfS0VSTkVMKTsKKwl1cy0+TVNfTGliLmJsa2V4dCA9IGttYWxsb2ModXMtPk1TX0xpYi5QYWdlc1BlckJsb2NrICogc2l6ZW9mKE1TX0xpYlR5cGVFeHRkYXQpLCBHRlBfS0VSTkVMKTsKIAogCWlmICgodXMtPk1TX0xpYi5ibGtwYWcgPT0gTlVMTCkgfHwgKHVzLT5NU19MaWIuYmxrZXh0ID09IE5VTEwpKQogCXsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9rZXVjci9zbWlsbWFpbi5jIGIvZHJpdmVycy9zdGFnaW5nL2tldWNyL3NtaWxtYWluLmMKaW5kZXggYmRmYmY3Ni4uMmNiZTlmOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2tldWNyL3NtaWxtYWluLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2tldWNyL3NtaWxtYWluLmMKQEAgLTE1Myw5ICsxNTMsOSBAQAogCVdPUkQgbGVuLCBibjsKIAogCS8vaWYgKENoZWNrX0RfTWVkaWFQb3dlcigpKSAgICAgICAgOyCmYiA2MjUwIGRvbid0IGNhcmUKLQkvLyAgICByZXR1cm4oRXJyQ29kZSk7ICAgICAgICAgICAgIDsKKwkvLyAgICByZXR1cm4oRXJyQ29kZSk7CiAJLy9pZiAoQ2hlY2tfRF9NZWRpYUZtdChmZG9FeHQpKSAgICA7Ci0JLy8gICAgcmV0dXJuKEVyckNvZGUpOyAgICAgICAgICAgICA7CisJLy8gICAgcmV0dXJuKEVyckNvZGUpOwogCWlmIChDb252X0RfTWVkaWFBZGRyKHVzLCBzdGFydCkpCiAJCXJldHVybihFcnJDb2RlKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2tldWNyL3NtaWxzdWIuYyBiL2RyaXZlcnMvc3RhZ2luZy9rZXVjci9zbWlsc3ViLmMKaW5kZXggMWI1MjUzNS4uY2UxMGNmMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2tldWNyL3NtaWxzdWIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcva2V1Y3Ivc21pbHN1Yi5jCkBAIC03NjMsOCArNzYzLDggQEAKIAliY2ItPkNEQls3XQkJCT0gKEJZVEUpYWRkcjsKIAliY2ItPkNEQls2XQkJCT0gKEJZVEUpKGFkZHIvMHgwMTAwKTsKIAliY2ItPkNEQls1XQkJCT0gTWVkaWEuWm9uZS8yOwotCWJjYi0+Q0RCWzhdCQkJPSAqKHJlZHVuZGFudCtSRURUX0FERFIxSCk7OwotCWJjYi0+Q0RCWzldCQkJPSAqKHJlZHVuZGFudCtSRURUX0FERFIxTCk7OworCWJjYi0+Q0RCWzhdCQkJPSAqKHJlZHVuZGFudCtSRURUX0FERFIxSCk7CisJYmNiLT5DREJbOV0JCQk9ICoocmVkdW5kYW50K1JFRFRfQUREUjFMKTsKIAogCXJlc3VsdCA9IEVORV9TZW5kU2NzaUNtZCh1cywgRkRJUl9XUklURSwgYnVmLCAwKTsKIAlpZiAocmVzdWx0ICE9IFVTQl9TVE9SX1hGRVJfR09PRCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9saW5lNi9jYXB0dXJlLmMgYi9kcml2ZXJzL3N0YWdpbmcvbGluZTYvY2FwdHVyZS5jCmluZGV4IDFlM2JiMTQuLjk2NDcxNTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9saW5lNi9jYXB0dXJlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2xpbmU2L2NhcHR1cmUuYwpAQCAtMTQ3LDcgKzE0Nyw3IEBACiAJY29uc3QgaW50IGJ5dGVzX3Blcl9mcmFtZSA9IGxpbmU2cGNtLT5wcm9wZXJ0aWVzLT5ieXRlc19wZXJfZnJhbWU7CiAJaW50IGZyYW1lcyA9IGZzaXplIC8gYnl0ZXNfcGVyX2ZyYW1lOwogCi0JaWYgKHJ1bnRpbWUgPT0gMCkKKwlpZiAocnVudGltZSA9PSBOVUxMKQogCQlyZXR1cm47CiAKIAlpZiAobGluZTZwY20tPnBvc19pbl9kb25lICsgZnJhbWVzID4gcnVudGltZS0+YnVmZmVyX3NpemUpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9saW5lNi9taWRpLmMgYi9kcml2ZXJzL3N0YWdpbmcvbGluZTYvbWlkaS5jCmluZGV4IGFiNjdlODguLmU1NTRhMmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9saW5lNi9taWRpLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2xpbmU2L21pZGkuYwpAQCAtMTI3LDcgKzEyNyw3IEBACiAKIAl1cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9BVE9NSUMpOwogCi0JaWYgKHVyYiA9PSAwKSB7CisJaWYgKHVyYiA9PSBOVUxMKSB7CiAJCWRldl9lcnIobGluZTYtPmlmY2RldiwgIk91dCBvZiBtZW1vcnlcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CkBAIC0xMzcsNyArMTM3LDcgQEAKIAogCXRyYW5zZmVyX2J1ZmZlciA9IGttYWxsb2MobGVuZ3RoLCBHRlBfQVRPTUlDKTsKIAotCWlmICh0cmFuc2Zlcl9idWZmZXIgPT0gMCkgeworCWlmICh0cmFuc2Zlcl9idWZmZXIgPT0gTlVMTCkgewogCQl1c2JfZnJlZV91cmIodXJiKTsKIAkJZGV2X2VycihsaW5lNi0+aWZjZGV2LCAiT3V0IG9mIG1lbW9yeVxuIik7CiAJCXJldHVybiAtRU5PTUVNOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2xpbmU2L3BsYXliYWNrLmMgYi9kcml2ZXJzL3N0YWdpbmcvbGluZTYvcGxheWJhY2suYwppbmRleCAyOTk0MGZkLi4xMGM1NDM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbGluZTYvcGxheWJhY2suYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbGluZTYvcGxheWJhY2suYwpAQCAtMjQ2LDcgKzI0Niw3IEBACiAKIAljaGFuZ2Vfdm9sdW1lKHVyYl9vdXQsIGxpbmU2cGNtLT52b2x1bWVfcGxheWJhY2ssIGJ5dGVzX3Blcl9mcmFtZSk7CiAKLQlpZiAobGluZTZwY20tPnByZXZfZmJ1ZiAhPSAwKSB7CisJaWYgKGxpbmU2cGNtLT5wcmV2X2ZidWYgIT0gTlVMTCkgewogI2lmZGVmIENPTkZJR19MSU5FNl9VU0JfSU1QVUxTRV9SRVNQT05TRQogCQlpZiAobGluZTZwY20tPmZsYWdzICYgTUFTS19QQ01fSU1QVUxTRSkgewogCQkJY3JlYXRlX2ltcHVsc2VfdGVzdF9zaWduYWwobGluZTZwY20sIHVyYl9vdXQsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVtcmFyL21lbXJhci5oIGIvZHJpdmVycy9zdGFnaW5nL21lbXJhci9tZW1yYXIuaAppbmRleCAwYjczNWI4Li4wZmViNzNiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbWVtcmFyL21lbXJhci5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZW1yYXIvbWVtcmFyLmgKQEAgLTk1LDYgKzk1LDcgQEAKIAlkbWFfYWRkcl90IGJ1c19hZGRyZXNzOwogfTsKIAorI2lmIGRlZmluZWQoQ09ORklHX01SU1RfUkFSX0hBTkRMRVIpCiAvKioKICAqIHJhcl9yZXNlcnZlKCkgLSByZXNlcnZlIFJBUiBidWZmZXJzCiAgKiBAYnVmZmVyczoJYXJyYXkgb2YgUkFSX2J1ZmZlcnMgd2hlcmUgdHlwZSBhbmQgc2l6ZSBvZiBidWZmZXJzIHRvCkBAIC0xNDksNyArMTUwLDI1IEBACiBleHRlcm4gc2l6ZV90IHJhcl9oYW5kbGVfdG9fYnVzKHN0cnVjdCBSQVJfYnVmZmVyICpidWZmZXJzLAogCQkJCXNpemVfdCBjb3VudCk7CiAKKyNlbHNlCiAKK2V4dGVybiBpbmxpbmUgc2l6ZV90IHJhcl9yZXNlcnZlKHN0cnVjdCBSQVJfYnVmZmVyICpidWZmZXJzLCBzaXplX3QgY291bnQpCit7CisJcmV0dXJuIDA7Cit9CisKK2V4dGVybiBpbmxpbmUgc2l6ZV90IHJhcl9yZWxlYXNlKHN0cnVjdCBSQVJfYnVmZmVyICpidWZmZXJzLCBzaXplX3QgY291bnQpCit7CisJcmV0dXJuIDA7Cit9CisKK2V4dGVybiBpbmxpbmUgc2l6ZV90IHJhcl9oYW5kbGVfdG9fYnVzKHN0cnVjdCBSQVJfYnVmZmVyICpidWZmZXJzLAorCQkJCXNpemVfdCBjb3VudCkKK3sKKwlyZXR1cm4gMDsKK30KKworI2VuZGlmICAvKiBNUlNUX1JBUl9IQU5ETEVSICovCiAjZW5kaWYgIC8qIF9fS0VSTkVMX18gKi8KIAogI2VuZGlmICAvKiBfTUVNUkFSX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tc20vTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvbXNtL01ha2VmaWxlCmluZGV4IGJiMzYwNmYuLjA3YTg5ZWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9tc20vTWFrZWZpbGUKKysrIGIvZHJpdmVycy9zdGFnaW5nL21zbS9NYWtlZmlsZQpAQCAtNDEsMTEgKzQxLDExIEBACiBvYmotJChDT05GSUdfRkJfTVNNX0xDREMpICs9IGxjZGMubwogCiAjIE1EREkKLW1zbV9tZGRpLW9ianMgOj0gbWRkaS5vIG1kZGlob3N0Lm8gbWRkaWhvc3RpLm8KK21zbV9tZGRpLXkgOj0gbWRkaS5vIG1kZGlob3N0Lm8gbWRkaWhvc3RpLm8KIG9iai0kKENPTkZJR19GQl9NU01fTURESSkgKz0gbXNtX21kZGkubwogCiAjIEV4dGVybmFsIE1EREkKLW1zbV9tZGRpX2V4dC1vYmpzIDo9IG1kZGlob3N0X2UubyBtZGRpX2V4dC5vCittc21fbWRkaV9leHQteSA6PSBtZGRpaG9zdF9lLm8gbWRkaV9leHQubwogb2JqLSQoQ09ORklHX0ZCX01TTV9FWFRNRERJKSArPSBtc21fbWRkaV9leHQubwogCiAjIFRWRW5jCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbXNtL2xjZGNfdG9zaGliYV93dmdhX3B0LmMgYi9kcml2ZXJzL3N0YWdpbmcvbXNtL2xjZGNfdG9zaGliYV93dmdhX3B0LmMKaW5kZXggODY0ZDdjMS4uZWRiYTc4YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL21zbS9sY2RjX3Rvc2hpYmFfd3ZnYV9wdC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tc20vbGNkY190b3NoaWJhX3d2Z2FfcHQuYwpAQCAtNzcsNyArNzcsNyBAQAogCiAJLyogZm9sbG93ZWQgYnkgcGFyYW1ldGVyIGJ5dGVzICovCiAJaWYgKG51bSkgewotCQlicCA9IChjaGFyICopJmRhdGE7OworCQlicCA9IChjaGFyICopJmRhdGE7CiAJCWJwICs9IChudW0gLSAxKTsKIAkJd2hpbGUgKG51bSkgewogCQkJdG9zaGliYV9zcGlfd3JpdGVfYnl0ZSgxLCAqYnApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21zbS90dmVuYy5jIGIvZHJpdmVycy9zdGFnaW5nL21zbS90dmVuYy5jCmluZGV4IGY0MWM1YWMuLjRmYmI3N2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9tc20vdHZlbmMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbXNtL3R2ZW5jLmMKQEAgLTI3OSwxMiArMjc5LDEzIEBACiAKIAlpZiAoSVNfRVJSKHR2ZW5jX2NsaykpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJlcnJvcjogY2FuJ3QgZ2V0IHR2ZW5jX2NsayFcbiIpOwotCQlyZXR1cm4gSVNfRVJSKHR2ZW5jX2Nsayk7CisJCXJldHVybiBQVFJfRVJSKHR2ZW5jX2Nsayk7CiAJfQogCiAJaWYgKElTX0VSUih0dmRhY19jbGspKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiZXJyb3I6IGNhbid0IGdldCB0dmRhY19jbGshXG4iKTsKLQkJcmV0dXJuIElTX0VSUih0dmRhY19jbGspOworCQljbGtfcHV0KHR2ZW5jX2Nsayk7CisJCXJldHVybiBQVFJfRVJSKHR2ZGFjX2Nsayk7CiAJfQogCiAvLwlwbV9xb3NfYWRkX3JlcXVpcmVtZW50KFBNX1FPU19TWVNURU1fQlVTX0ZSRVEgLCAidHZlbmMiLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3BoaXNvbi9waGlzb24uYyBiL2RyaXZlcnMvc3RhZ2luZy9waGlzb24vcGhpc29uLmMKaW5kZXggNjc3MTUyMC4uNjgzNjU3YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3BoaXNvbi9waGlzb24uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcGhpc29uL3BoaXNvbi5jCkBAIC02OSw3ICs2OSw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkIHBoaXNvbl9wY2lfdGJsW10gPSB7CitzdGF0aWMgREVGSU5FX1BDSV9ERVZJQ0VfVEFCTEUocGhpc29uX3BjaV90YmwpID0gewogCXsgUENJX1ZFTkRPUl9JRF9QSElTT04sIFBDSV9ERVZJQ0VfSURfUFM1MDAwLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELAogCSAgUENJX0NMQVNTX1NUT1JBR0VfSURFIDw8IDgsIDB4ZmZmZjAwLCAwIH0sCiAJeyAwLCB9LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3BvaG1lbGZzL2NyeXB0by5jIGIvZHJpdmVycy9zdGFnaW5nL3BvaG1lbGZzL2NyeXB0by5jCmluZGV4IDJmZGIzZTAuLjY1NDA4NjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9wb2htZWxmcy9jcnlwdG8uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcG9obWVsZnMvY3J5cHRvLmMKQEAgLTEzMCwxMCArMTMwLDggQEAKIAogdm9pZCBwb2htZWxmc19jcnlwdG9fZW5naW5lX2V4aXQoc3RydWN0IHBvaG1lbGZzX2NyeXB0b19lbmdpbmUgKmUpCiB7Ci0JaWYgKGUtPmhhc2gpCi0JCWNyeXB0b19mcmVlX2hhc2goZS0+aGFzaCk7Ci0JaWYgKGUtPmNpcGhlcikKLQkJY3J5cHRvX2ZyZWVfYWJsa2NpcGhlcihlLT5jaXBoZXIpOworCWNyeXB0b19mcmVlX2hhc2goZS0+aGFzaCk7CisJY3J5cHRvX2ZyZWVfYWJsa2NpcGhlcihlLT5jaXBoZXIpOwogCWtmcmVlKGUtPmRhdGEpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NoaXAvbWFjX3BjaS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jaGlwL21hY19wY2kuaAppbmRleCA5ZjI1ZWYwLi5iODg2OGE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NoaXAvbWFjX3BjaS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY2hpcC9tYWNfcGNpLmgKQEAgLTMwLDcgKzMwLDggQEAKICAgICBBYnN0cmFjdDoKIAogICAgIFJldmlzaW9uIEhpc3Rvcnk6Ci0gICAgV2hvICAgICAgICAgIFdoZW4gICAgICAgICAgV2hhdAorICAgIFdobyAgICAgICAgICAJV2hlbiAgICAgICAgICAgIFdoYXQKKyAgICBKdXN0aW4gUC4gTWF0dG9jawkxMS8wNy8yMDEwCUZpeCBzb21lIHR5cG9zCiAgICAgLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICovCiAKQEAgLTQ1LDcgKzQ2LDcgQEAKIAogLyogKi8KIC8qIERldmljZSBJRCAmIFZlbmRvciBJRCByZWxhdGVkIGRlZmluaXRpb25zLCAqLwotLyogTk9URTogeW91IHNob3VsZCBub3QgYWRkIHRoZSBuZXcgVmVuZG9ySUQvRGV2aWNlSUQgaGVyZSB1bmxlc3MgeW91IG5vdCBzdXJlIGl0IGJlbG9uZ3MgdG8gd2hhdCBjaGlwLiAqLworLyogTk9URTogeW91IHNob3VsZCBub3QgYWRkIHRoZSBuZXcgVmVuZG9ySUQvRGV2aWNlSUQgaGVyZSB1bmxlc3MgeW91IGtub3cgZm9yIHN1cmUgd2hhdCBjaGlwIGl0IGJlbG9uZ3MgdG9vLiAqLwogLyogKi8KICNkZWZpbmUgTklDX1BDSV9WRU5ET1JfSUQJCTB4MTgxNAogI2RlZmluZSBQQ0lCVVNfSU5URUxfVkVORE9SCTB4ODA4NgpAQCAtODMsNyArODQsNyBAQAogCXUzMiBTRFB0cjE7CiAJLypXb3JkMyAqLwogCXUzMiByc3YyOjI0OwotCXUzMiBXSVY6MTsJCS8qIFdpcmVsZXNzIEluZm8gVmFsaWQuIDEgaWYgRHJpdmVyIGFscmVhZHkgZmlsbCBXSSwgIG8gaWYgRE1BIG5lZWRzIHRvIGNvcHkgV0kgdG8gY29ycmVjdHBvc2l0aW9uICovCisJdTMyIFdJVjoxOwkJLyogV2lyZWxlc3MgSW5mbyBWYWxpZC4gMSBpZiBEcml2ZXIgYWxyZWFkeSBmaWxsIFdJLCAgbyBpZiBETUEgbmVlZHMgdG8gY29weSBXSSB0byBjb3JyZWN0IHBvc2l0aW9uICovCiAJdTMyIFFTRUw6MjsJCS8qIHNlbGVjdCBvbi1jaGlwIEZJRk8gSUQgZm9yIDJuZC1zdGFnZSBvdXRwdXQgc2NoZWR1bGVyLjA6TUdNVCwgMTpIQ0NBIDI6RURDQSAqLwogCXUzMiByc3Y6MjsKIAl1MzIgVENPOjE7CQkvKiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jaGlwL21hY191c2IuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY2hpcC9tYWNfdXNiLmgKaW5kZXggZWQwYzBiNC4uZTgxNThmYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jaGlwL21hY191c2IuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NoaXAvbWFjX3VzYi5oCkBAIC0zMCw3ICszMCw4IEBACiAgICAgQWJzdHJhY3Q6CiAKICAgICBSZXZpc2lvbiBIaXN0b3J5OgotICAgIFdobyAgICAgICAgICBXaGVuICAgICAgICAgIFdoYXQKKyAgICBXaG8gICAgICAgICAgCVdoZW4gICAgICAgICAgICBXaGF0CisgICAgSnVzdGluIFAuIE1hdHRvY2sJMTEvMDcvMjAxMAlGaXggYSB0eXBvCiAgICAgLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICovCiAKQEAgLTkzLDcgKzk0LDcgQEAKIAkvKiBXb3JkIDAgKi8KIAl1MzIgVVNCRE1BVHhQa3RMZW46MTY7CS8qdXNlZCBPTkxZIGluIFVTQiBidWxrIEFnZ3JlZ2F0aW9uLCAgVG90YWwgYnl0ZSBjb3VudHMgb2YgYWxsIHN1Yi1mcmFtZS4gKi8KIAl1MzIgcnN2Ojg7Ci0JdTMyIFdJVjoxOwkJLyogV2lyZWxlc3MgSW5mbyBWYWxpZC4gMSBpZiBEcml2ZXIgYWxyZWFkeSBmaWxsIFdJLCAgbyBpZiBETUEgbmVlZHMgdG8gY29weSBXSSB0byBjb3JyZWN0cG9zaXRpb24gKi8KKwl1MzIgV0lWOjE7CQkvKiBXaXJlbGVzcyBJbmZvIFZhbGlkLiAxIGlmIERyaXZlciBhbHJlYWR5IGZpbGwgV0ksICBvIGlmIERNQSBuZWVkcyB0byBjb3B5IFdJIHRvIGNvcnJlY3QgcG9zaXRpb24gKi8KIAl1MzIgUVNFTDoyOwkJLyogc2VsZWN0IG9uLWNoaXAgRklGTyBJRCBmb3IgMm5kLXN0YWdlIG91dHB1dCBzY2hlZHVsZXIuMDpNR01ULCAxOkhDQ0EgMjpFRENBICovCiAJdTMyIFN3VXNlTGFzdFJvdW5kOjE7CS8qIFNvZnR3YXJlIHVzZS4gKi8KIAl1MzIgcnN2MjoyOwkJLyogU29mdHdhcmUgdXNlLiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jaGlwL3J0bXBfbWFjLmggYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NoaXAvcnRtcF9tYWMuaAppbmRleCBlOGY3MTcyLi4zZDFlNDkxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NoaXAvcnRtcF9tYWMuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NoaXAvcnRtcF9tYWMuaApAQCAtMzIsNiArMzIsNyBAQAogCiAJUmV2aXNpb24gSGlzdG9yeToKIAlXaG8JCQlXaGVuCQkgIFdoYXQKKwlKdXN0aW4gUC4gTWF0dG9jawkxMS8wNy8yMDEwCSAgRml4IGEgY29tbWVudHMsIGFuZCB0eXBvcwogCS0tLS0tLS0tCS0tLS0tLS0tLS0JICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqLwogCkBAIC00Myw3ICs0NCw3IEBACiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KIAogLyogdGhlIGZpcnN0IDI0LWJ5dGUgaW4gVFhEIGlzIGNhbGxlZCBUWElORk8gYW5kIHdpbGwgYmUgRE1BZWQgdG8gTUFDIGJsb2NrIHRocm91Z2ggVFhGSUZPLiAqLwotLyogTUFDIGJsb2NrIHVzZSB0aGlzIFRYSU5GTyB0byBjb250cm9sIHRoZSB0cmFuc21pc3Npb24gYmVoYXZpb3Igb2YgdGhpcyBmcmFtZS4gKi8KKy8qIE1BQyBibG9jayB1c2VzIHRoaXMgVFhJTkZPIHRvIGNvbnRyb2wgdGhlIHRyYW5zbWlzc2lvbiBiZWhhdmlvciBvZiB0aGlzIGZyYW1lLiAqLwogI2RlZmluZSBGSUZPX01HTVQgICAgICAgICAgICAgICAgIDAKICNkZWZpbmUgRklGT19IQ0NBICAgICAgICAgICAgICAgICAxCiAjZGVmaW5lIEZJRk9fRURDQSAgICAgICAgICAgICAgICAgMgpAQCAtNDU4LDggKzQ1OSw4IEBACiAvKiAqLwogdHlwZWRlZiB1bmlvbiBfUkZfQ1NSX0NGRzBfU1RSVUMgewogCXN0cnVjdCB7Ci0JCXUzMiBSZWdJZEFuZENvbnRlbnQ6MjQ7CS8qIFJlZ2lzdGVyICAgICB2YWx1ZSB0byBwcm9ncmFtIGludG8gQkJQICovCi0JCXUzMiBiaXR3aWR0aDo1OwkvKiBTZWxlY3RlZCAgICAgQkJQICAgICByZWdpc3RlciAqLworCQl1MzIgUmVnSWRBbmRDb250ZW50OjI0OwkvKiBSZWdpc3RlciB2YWx1ZSB0byBwcm9ncmFtIGludG8gQkJQICovCisJCXUzMiBiaXR3aWR0aDo1OwkvKiBTZWxlY3RlZCBCQlAgcmVnaXN0ZXIgKi8KIAkJdTMyIFN0YW5kYnlNb2RlOjE7CS8qIDA6IGhpZ2ggd2hlbiBzdGFuZCBieSAxOiBsb3cgd2hlbiBzdGFuZGJ5ICovCiAJCXUzMiBTZWw6MTsJLyogMDpSRl9MRTAgYWN0aXZhdGUgIDE6UkZfTEUxIGFjdGl2YXRlICovCiAJCXUzMiBCdXN5OjE7CS8qIDA6IGlkbGUgMTogOGJ1c3kgKi8KQEAgLTQ2OSw3ICs0NzAsNyBAQAogI2RlZmluZSBSRl9DU1JfQ0ZHMQkJCTB4MTAyNAogdHlwZWRlZiB1bmlvbiBfUkZfQ1NSX0NGRzFfU1RSVUMgewogCXN0cnVjdCB7Ci0JCXUzMiBSZWdJZEFuZENvbnRlbnQ6MjQ7CS8qIFJlZ2lzdGVyICAgICB2YWx1ZSB0byBwcm9ncmFtIGludG8gQkJQICovCisJCXUzMiBSZWdJZEFuZENvbnRlbnQ6MjQ7CS8qIFJlZ2lzdGVyIHZhbHVlIHRvIHByb2dyYW0gaW50byBCQlAgKi8KIAkJdTMyIFJGR2FwOjU7CS8qIEdhcCBiZXR3ZWVuIEJCX0NPTlRST0xfUkYgYW5kIFJGX0xFLiAwOiAzIHN5c3RlbSBjbG9jayBjeWNsZSAoMzcuNXVzZWMpIDE6IDUgc3lzdGVtIGNsb2NrIGN5Y2xlICg2Mi41dXNlYykgKi8KIAkJdTMyIHJzdjo3OwkvKiAwOiBpZGxlIDE6IDhidXN5ICovCiAJfSBmaWVsZDsKQEAgLTQ3OCw3ICs0NzksNyBAQAogI2RlZmluZSBSRl9DU1JfQ0ZHMgkJCTB4MTAyOAkvKiAqLwogdHlwZWRlZiB1bmlvbiBfUkZfQ1NSX0NGRzJfU1RSVUMgewogCXN0cnVjdCB7Ci0JCXUzMiBSZWdJZEFuZENvbnRlbnQ6MjQ7CS8qIFJlZ2lzdGVyICAgICB2YWx1ZSB0byBwcm9ncmFtIGludG8gQkJQICovCisJCXUzMiBSZWdJZEFuZENvbnRlbnQ6MjQ7CS8qIFJlZ2lzdGVyIHZhbHVlIHRvIHByb2dyYW0gaW50byBCQlAgKi8KIAkJdTMyIHJzdjo4OwkvKiAwOiBpZGxlIDE6IDhidXN5ICovCiAJfSBmaWVsZDsKIAl1MzIgd29yZDsKQEAgLTQ5MCw3ICs0OTEsNyBAQAogCQl1MzIgT2ZmUGVyaW9kOjg7CS8qIGJsaW5raW5nIG9mZiBwZXJpb2QgdW5pdCAxbXMgKi8KIAkJdTMyIFNsb3dCbGlua1BlcmlvZDo2OwkvKiBzbG93IGJsaW5raW5nIHBlcmlvZC4gdW5pdDoxbXMgKi8KIAkJdTMyIHJzdjoyOwotCQl1MzIgUkxlZE1vZGU6MjsJLyogcmVkIExlZCBNb2RlICAgIDA6IG9mZjE6IGJsaW5raW5nIHVwb24gVFgyOiBwZXJpb2RpYyBzbG93IGJsaW5raW5nMzogYWx3YXlzIG9uICovCisJCXUzMiBSTGVkTW9kZToyOwkvKiByZWQgTGVkIE1vZGUgMDogb2ZmMTogYmxpbmtpbmcgdXBvbiBUWDI6IHBlcmlvZGljIHNsb3cgYmxpbmtpbmczOiBhbHdheXMgb24gKi8KIAkJdTMyIEdMZWRNb2RlOjI7CS8qIGdyZWVuIExlZCBNb2RlICovCiAJCXUzMiBZTGVkTW9kZToyOwkvKiB5ZWxsb3cgTGVkIE1vZGUgKi8KIAkJdTMyIExlZFBvbGFyOjE7CS8qIExlZCBQb2xhcml0eS4gIDA6IGFjdGl2ZSBsb3cxOiBhY3RpdmUgaGlnaCAqLwpAQCAtNjIxLDkgKzYyMiw5IEBACiAjZGVmaW5lIFRYX1JUWV9DRkcJMHgxMzRjCiB0eXBlZGVmIHVuaW9uIFBBQ0tFRCBfVFhfUlRZX0NGR19TVFJVQyB7CiAJc3RydWN0IHsKLQkJdTMyIFNob3J0UnR5TGltaXQ6ODsJLyogIHNob3J0IHJldHJ5IGxpbWl0ICovCi0JCXUzMiBMb25nUnR5TGltaXQ6ODsJLypsb25nIHJldHJ5IGxpbWl0ICovCi0JCXUzMiBMb25nUnR5VGhyZToxMjsJLyogTG9uZyByZXRyeSB0aHJlc2hvb2xkICovCisJCXUzMiBTaG9ydFJ0eUxpbWl0Ojg7CS8qIHNob3J0IHJldHJ5IGxpbWl0ICovCisJCXUzMiBMb25nUnR5TGltaXQ6ODsJLyogbG9uZyByZXRyeSBsaW1pdCAqLworCQl1MzIgTG9uZ1J0eVRocmU6MTI7CS8qIExvbmcgcmV0cnkgdGhyZXNob2xkICovCiAJCXUzMiBOb25BZ2dSdHlNb2RlOjE7CS8qIE5vbi1BZ2dyZWdhdGUgTVBEVSByZXRyeSBtb2RlLiAgMDpleHBpcmVkIGJ5IHJldHJ5IGxpbWl0LCAxOiBleHBpcmVkIGJ5IG1wZHUgbGlmZSB0aW1lciAqLwogCQl1MzIgQWdnUnR5TW9kZToxOwkvKiBBZ2dyZWdhdGUgTVBEVSByZXRyeSBtb2RlLiAgMDpleHBpcmVkIGJ5IHJldHJ5IGxpbWl0LCAxOiBleHBpcmVkIGJ5IG1wZHUgbGlmZSB0aW1lciAqLwogCQl1MzIgVHhhdXRvRkJFbmFibGU6MTsJLyogVHggcmV0cnkgUEhZIHJhdGUgYXV0byBmYWxsYmFjayBlbmFibGUgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY2hpcC9ydG1wX3BoeS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jaGlwL3J0bXBfcGh5LmgKaW5kZXggOWY5MjRlYS4uOTg0NTRkZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jaGlwL3J0bXBfcGh5LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jaGlwL3J0bXBfcGh5LmgKQEAgLTI0Nyw3ICsyNDcsNyBAQAogCQkJfQkJCQkJCVwKIAkJfQkJCQkJCQlcCiAJCWlmIChCYnBDc3IuZmllbGQuQnVzeSA9PSBCVVNZKSB7CQkJXAotCQkJREJHUFJJTlRfRVJSKCgiQkJQKHZpYU1DVT0lZCkgcmVhZCBSJWQgZmFpbFxuIiwgKF9iVmlhTUNVKSwgX2JicElEKSk7CVwKKwkJCURCR1BSSU5UX0VSUigiQkJQKHZpYU1DVT0lZCkgcmVhZCBSJWQgZmFpbFxuIiwgKF9iVmlhTUNVKSwgX2JicElEKTsJXAogCQkJKihfcFYpID0gKF9wQWQpLT5CYnBXcml0ZUxhdGNoW19iYnBJRF07ICAgICAgICAgICAgICAgXAogCQkJaWYgKChfYlZpYU1DVSkgPT0gVFJVRSkgewkJCVwKIAkJCQlSVE1QX0lPX1JFQUQzMihfcEFkLCBfcmVnSUQsICZCYnBDc3Iud29yZCk7CQkJCVwKQEAgLTMzNiwxMSArMzM2LDExIEBACiAJCQl9CQkJCQkJXAogCQl9CQkJCQkJCVwKIAl9IGVsc2UgewkJCQkJCQlcCi0JCURCR1BSSU5UX0VSUigoIiAsIGJydDMweHhCYW5NY3VDbWQgPSAlZCwgUmVhZCBCQlAgJWQgXG4iLCAoX0EpLT5icnQzMHh4QmFuTWN1Q21kLCAoX0kpKSk7CVwKKwkJREJHUFJJTlRfRVJSKCIgLCBicnQzMHh4QmFuTWN1Q21kID0gJWQsIFJlYWQgQkJQICVkIFxuIiwgKF9BKS0+YnJ0MzB4eEJhbk1jdUNtZCwgKF9JKSk7CVwKIAkJKihfcFYpID0gKF9BKS0+QmJwV3JpdGVMYXRjaFtfSV07CQkJXAogCX0JCQkJCQkJCVwKIAlpZiAoKEJicENzci5maWVsZC5CdXN5ID09IEJVU1kpIHx8ICgoX0EpLT5iUENJY2xrT2ZmID09IFRSVUUpKSB7IFwKLQkJREJHUFJJTlRfRVJSKCgiQkJQIHJlYWQgUiVkPTB4JXggZmFpbFxuIiwgX0ksIEJicENzci53b3JkKSk7IFwKKwkJREJHUFJJTlRfRVJSKCJCQlAgcmVhZCBSJWQ9MHgleCBmYWlsXG4iLCBfSSwgQmJwQ3NyLndvcmQpOyBcCiAJCSooX3BWKSA9IChfQSktPkJicFdyaXRlTGF0Y2hbX0ldOwkJCVwKIAl9CQkJCQkJCQlcCiB9CkBAIC0zNzgsNyArMzc4LDcgQEAKIAkJCWJyZWFrOwkJCQkJCVwKIAkJfQkJCQkJCQlcCiAJCWlmIChfYnVzeUNudCA9PSBNQVhfQlVTWV9DT1VOVCkgewkJCVwKLQkJCURCR1BSSU5UX0VSUigoIkJCUCB3cml0ZSBSJWQgZmFpbFxuIiwgX2JicElEKSk7CVwKKwkJCURCR1BSSU5UX0VSUigiQkJQIHdyaXRlIFIlZCBmYWlsXG4iLCBfYmJwSUQpOwlcCiAJCQlpZiAoKF9iVmlhTUNVKSA9PSBUUlVFKSB7CQkJXAogCQkJCVJUTVBfSU9fUkVBRDMyKF9wQWQsIEgyTV9CQlBfQUdFTlQsICZCYnBDc3Iud29yZCk7CVwKIAkJCQlCYnBDc3IuZmllbGQuQnVzeSA9IDA7CQkJXApAQCAtNDU5LDE1ICs0NTksMTUgQEAKIAkJCQlicmVhazsJCQkJCQkJCQkJCQkJCQlcCiAJCQl9CQkJCQkJCQkJCQkJCQkJCQlcCiAJCX0gZWxzZSB7CQkJCQkJXAotCQkJREJHUFJJTlRfRVJSKCgiICBicnQzMHh4QmFuTWN1Q21kID0gJWQuIFdyaXRlIEJCUCAlZCBcbiIsICAoX0EpLT5icnQzMHh4QmFuTWN1Q21kLCAoX0kpKSk7CVwKKwkJCURCR1BSSU5UX0VSUigiICBicnQzMHh4QmFuTWN1Q21kID0gJWQuIFdyaXRlIEJCUCAlZCBcbiIsICAoX0EpLT5icnQzMHh4QmFuTWN1Q21kLCAoX0kpKTsJXAogCQl9CQkJCQkJCQkJCQkJCQkJCQlcCiAJCWlmICgoQnVzeUNudCA9PSBNQVhfQlVTWV9DT1VOVCkgfHwgKChfQSktPmJQQ0ljbGtPZmYgPT0gVFJVRSkpIHsgXAogCQkJaWYgKEJ1c3lDbnQgPT0gTUFYX0JVU1lfQ09VTlQpCQkJCVwKIAkJCQkoX0EpLT5BY2Nlc3NCQlBGYWlsQ291bnQrKzsJCQkJCVwKLQkJCURCR1BSSU5UX0VSUigoIkJCUCB3cml0ZSBSJWQ9MHgleCBmYWlsLiBCdXN5Q250PSAlZC5iUENJY2xrT2ZmID0gJWQuIFxuIiwgX0ksIEJicENzci53b3JkLCBCdXN5Q250LCAoX0EpLT5iUENJY2xrT2ZmKSk7CVwKKwkJCURCR1BSSU5UX0VSUigiQkJQIHdyaXRlIFIlZD0weCV4IGZhaWwuIEJ1c3lDbnQ9ICVkLmJQQ0ljbGtPZmYgPSAlZC4gXG4iLCBfSSwgQmJwQ3NyLndvcmQsIEJ1c3lDbnQsIChfQSktPmJQQ0ljbGtPZmYpOwlcCiAJCX0JCQkJCQkJCQkJCQkJCQkJCVwKIAl9IGVsc2UgewkJCQkJCQlcCi0JCURCR1BSSU5UX0VSUigoIioqKioqKiBCQlBfV3JpdGVfTGF0Y2ggQnVmZmVyIGV4Y2VlZHMgbWF4IGJvdW5kcnkgKioqKioqIFxuIikpOwlcCisJCURCR1BSSU5UX0VSUigiKioqKioqIEJCUF9Xcml0ZV9MYXRjaCBCdWZmZXIgZXhjZWVkcyBtYXggYm91bmRyeSAqKioqKiogXG4iKTsJXAogCX0JCQkJCQkJCQkJCQkJCQkJCQlcCiB9CiAjZW5kaWYgLyogUlRNUF9NQUNfUENJIC8vICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NoaXBzL3J0MzA5MC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jaGlwcy9ydDMwOTAuYwppbmRleCBjMjkzM2M2Li4zMzQ3MjBlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NoaXBzL3J0MzA5MC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY2hpcHMvcnQzMDkwLmMKQEAgLTI4LDEwICsyOCwxMSBAQAogCXJ0MzA5MC5jCiAKIAlBYnN0cmFjdDoKLQlTcGVjaWZpYyBmdW5jaXRvbnMgYW5kIHZhcmlhYmxlcyBmb3IgUlQzMDcwCisJU3BlY2lmaWMgZnVuY3Rpb25zIGFuZCB2YXJpYWJsZXMgZm9yIFJUMzA3MAogCiAJUmV2aXNpb24gSGlzdG9yeToKLQlXaG8gICAgICAgICBXaGVuICAgICAgICAgIFdoYXQKKwlXaG8gICAgICAgICAJCVdoZW4gICAgICAgICAgICBXaGF0CisJSnVzdGluIFAuIE1hdHRvY2sJMTEvMDcvMjAxMAlGaXggYSB0eXBvCiAJLS0tLS0tLS0gICAgLS0tLS0tLS0tLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqLwogCkBAIC01MSw3ICs1Miw4IEBACiAJaWYgKElTX1JUMzA5MChwQWQpKSB7CiAJCS8qIEluaXQgUkYgY2FsaWJyYXRpb24gKi8KIAkJLyogRHJpdmVyIHNob3VsZCB0b2dnbGUgUkYgUjMwIGJpdDcgYmVmb3JlIGluaXQgUkYgcmVnaXN0ZXJzICovCi0JCXUzMiBSZlJlZyA9IDAsIGRhdGE7CisJCXU4IFJmUmVnOworCQl1MzIgZGF0YTsKIAogCQlSVDMweHhSZWFkUkZSZWdpc3RlcihwQWQsIFJGX1IzMCwgKHU4ICopJlJmUmVnKTsKIAkJUmZSZWcgfD0gMHg4MDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY2hpcHMvcnQzMHh4LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NoaXBzL3J0MzB4eC5jCmluZGV4IDQzNjdhMTkuLjM1NGRlYmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY2hpcHMvcnQzMHh4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jaGlwcy9ydDMweHguYwpAQCAtMjgsMTAgKzI4LDExIEBACiAJcnQzMHh4LmMKIAogCUFic3RyYWN0OgotCVNwZWNpZmljIGZ1bmNpdG9ucyBhbmQgdmFyaWFibGVzIGZvciBSVDMweHguCisJU3BlY2lmaWMgZnVuY3Rpb25zIGFuZCB2YXJpYWJsZXMgZm9yIFJUMzB4eC4KIAogCVJldmlzaW9uIEhpc3Rvcnk6Ci0JV2hvICAgICAgICAgV2hlbiAgICAgICAgICBXaGF0CisJV2hvICAgICAgICAgCQlXaGVuICAgICAgICAgICAgV2hhdAorCUp1c3RpbiBQLiBNYXR0b2NrCTExLzA3LzIwMTAJRml4IHNvbWUgdHlwb3MKIAktLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICovCiAKQEAgLTUzLDcgKzU0LDcgQEAKIAksCiAJe1JGX1IwNiwgMHgwMn0KIAksCi0Je1JGX1IwNywgMHg3MH0KKwl7UkZfUjA3LCAweDYwfQogCSwKIAl7UkZfUjA5LCAweDBGfQogCSwKQEAgLTg5LDcgKzkwLDcgQEAKIAogdTggTlVNX1JGX1JFR19QQVJNUyA9IChzaXplb2YoUlQzMHh4X1JGUmVnVGFibGUpIC8gc2l6ZW9mKHN0cnVjdCBydF9yZWdfcGFpcikpOwogCi0vKiBBbnRlbm5hIGRpdmVzaXR5IHVzZSBHUElPMyBhbmQgRUVTSyBwaW4gZm9yIGNvbnRyb2wgKi8KKy8qIEFudGVubmEgZGl2ZXJzaXR5IHVzZSBHUElPMyBhbmQgRUVTSyBwaW4gZm9yIGNvbnRyb2wgKi8KIC8qIEFudGVubmEgYW5kIEVFUFJPTSBhY2Nlc3MgYXJlIGJvdGggdXNpbmcgRUVTSyBwaW4sICovCiAvKiBUaGVyZWZvciB3ZSBzaG91bGQgYXZvaWQgYWNjZXNzaW5nIEVFU0sgYXQgdGhlIHNhbWUgdGltZSAqLwogLyogVGhlbiByZXN0b3JlIGFudGVubmEgYWZ0ZXIgRUVQUk9NIGFjY2VzcyAqLwpAQCAtMjQzLDcgKzI0NCw3IEBACiAJCQkJYnJlYWs7CiAJCQl9CiAKLQkJCS8qIHByZXZlbnQgaW5maW5pdGUgbG9vcCBjYXVzZSBkcml2ZXIgaGFuZy4gKi8KKwkJCS8qIHByZXZlbnQgaW5maW5pdGUgbG9vcDsgY2F1c2VzIGRyaXZlciBoYW5nLiAqLwogCQkJaWYgKGxvb3BjbnQrKyA+IDEwMCkgewogCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAogCQkJCQkgKCJSVE1QRmlsdGVyQ2FsaWJyYXRpb24gLSBjYW4ndCBmaW5kIGEgdmFsaWQgdmFsdWUsIGxvb3BjbnQ9JWQgc3RvcCBjYWxpYnJhdGluZyIsCkBAIC00NDEsNyArNDQyLDcgQEAKIAogCQkvKiBWQ09fSUMsIFJGIFI3IHJlZ2lzdGVyIEJpdCA0ICYgQml0IDUgdG8gMSAqLwogCQlSVDMweHhSZWFkUkZSZWdpc3RlcihwQWQsIFJGX1IwNywgJlJGVmFsdWUpOwotCQlSRlZhbHVlIHw9IDB4MzA7CisJCVJGVmFsdWUgfD0gMHgyMDsKIAkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjA3LCBSRlZhbHVlKTsKIAogCQkvKiBJZG9oLCBSRiBSOSByZWdpc3RlciBCaXQgMSwgQml0IDIgJiBCaXQgMyB0byAxICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9iYV9hY3Rpb24uYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2JhX2FjdGlvbi5jCmluZGV4IDhlZWY4MmQuLmIwNDZjMmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2JhX2FjdGlvbi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2JhX2FjdGlvbi5jCkBAIC03OTksOCArNzk5LDggQEAKIAkJCS8qIGZvcmNlIHNlbmQgc3BlY2lmaWVkIFRJRCBEZWxCQSAqLwogCQkJc3RydWN0IHJ0X21sbWVfZGVsYmFfcmVxIERlbGJhUmVxOwogCQkJc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSA9Ci0JCQkgICAgKHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKilrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtKSwKLQkJCQkJCQlNRU1fQUxMT0NfRkxBRyk7CisJCQkJa21hbGxvYyhzaXplb2Yoc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSksCisJCQkJCU1FTV9BTExPQ19GTEFHKTsKIAkJCWlmIChFbGVtICE9IE5VTEwpIHsKIAkJCQlOZGlzWmVyb01lbW9yeSgmRGVsYmFSZXEsIHNpemVvZihEZWxiYVJlcSkpOwogCQkJCU5kaXNaZXJvTWVtb3J5KEVsZW0sIHNpemVvZihzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtKSk7CkBAIC04MzksOCArODM5LDggQEAKIAkgICAgJiYgKHBCQUVudHJ5LT5PUklfQkFfU3RhdHVzID09IE9yaWdpbmF0b3JfRG9uZSkpIHsKIAkJc3RydWN0IHJ0X21sbWVfZGVsYmFfcmVxIERlbGJhUmVxOwogCQlzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtID0KLQkJICAgIChzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICopa21hbGxvYyhzaXplb2Yoc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSksCi0JCQkJCQlNRU1fQUxMT0NfRkxBRyk7CisJCQlrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtKSwKKwkJCQlNRU1fQUxMT0NfRkxBRyk7CiAJCWlmIChFbGVtICE9IE5VTEwpIHsKIAkJCU5kaXNaZXJvTWVtb3J5KCZEZWxiYVJlcSwgc2l6ZW9mKERlbGJhUmVxKSk7CiAJCQlOZGlzWmVyb01lbW9yeShFbGVtLCBzaXplb2Yoc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSkpOwpAQCAtOTA4LDggKzkwOCw4IEBACiAJCS8qICovCiAJCWlmIChiUGFzc2l2ZSA9PSBGQUxTRSkgewogCQkJc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSA9Ci0JCQkgICAgKHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKilrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtKSwKLQkJCQkJCQlNRU1fQUxMT0NfRkxBRyk7CisJCQkJa21hbGxvYyhzaXplb2Yoc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSksCisJCQkJCU1FTV9BTExPQ19GTEFHKTsKIAkJCWlmIChFbGVtICE9IE5VTEwpIHsKIAkJCQlOZGlzWmVyb01lbW9yeSgmRGVsYmFSZXEsIHNpemVvZihEZWxiYVJlcSkpOwogCQkJCU5kaXNaZXJvTWVtb3J5KEVsZW0sIHNpemVvZihzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtKSk7CkBAIC0xMjcwLDEzICsxMjcwLDEzIEBACiAKIAkvKiBGaXJzdCBjaGVjayB0aGUgc2l6ZSwgaXQgTVVTVCBub3QgZXhjZWVkIHRoZSBtbG1lIHF1ZXVlIHNpemUgKi8KIAlpZiAoTXNnTGVuID4gTUdNVF9ETUFfQlVGRkVSX1NJWkUpIHsKLQkJREJHUFJJTlRfRVJSKCgiQ250bEVucXVldWVGb3JSZWN2OiBmcmFtZSB0b28gbGFyZ2UsIHNpemUgPSAlbGQgXG4iLCBNc2dMZW4pKTsKKwkJREJHUFJJTlRfRVJSKCJDbnRsRW5xdWV1ZUZvclJlY3Y6IGZyYW1lIHRvbyBsYXJnZSwgc2l6ZSA9ICVsZCBcbiIsIE1zZ0xlbik7CiAJCXJldHVybiBGQUxTRTsKIAl9IGVsc2UgaWYgKE1zZ0xlbiAhPSBzaXplb2Yoc3RydWN0IHJ0X2ZyYW1lX2JhX3JlcSkpIHsKLQkJREJHUFJJTlRfRVJSKCgiQ250bEVucXVldWVGb3JSZWN2OiBCbG9ja0FjayBSZXF1ZXN0IGZyYW1lIGxlbmd0aCBzaXplID0gJWxkIGluY29ycmVjdFxuIiwgTXNnTGVuKSk7CisJCURCR1BSSU5UX0VSUigiQ250bEVucXVldWVGb3JSZWN2OiBCbG9ja0FjayBSZXF1ZXN0IGZyYW1lIGxlbmd0aCBzaXplID0gJWxkIGluY29ycmVjdFxuIiwgTXNnTGVuKTsKIAkJcmV0dXJuIEZBTFNFOwogCX0gZWxzZSBpZiAoTXNnTGVuICE9IHNpemVvZihzdHJ1Y3QgcnRfZnJhbWVfYmFfcmVxKSkgewotCQlEQkdQUklOVF9FUlIoKCJDbnRsRW5xdWV1ZUZvclJlY3Y6IEJsb2NrQWNrIFJlcXVlc3QgZnJhbWUgbGVuZ3RoIHNpemUgPSAlbGQgaW5jb3JyZWN0XG4iLCBNc2dMZW4pKTsKKwkJREJHUFJJTlRfRVJSKCJDbnRsRW5xdWV1ZUZvclJlY3Y6IEJsb2NrQWNrIFJlcXVlc3QgZnJhbWUgbGVuZ3RoIHNpemUgPSAlbGQgaW5jb3JyZWN0XG4iLCBNc2dMZW4pOwogCQlyZXR1cm4gRkFMU0U7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9jbW1fZGF0YS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vY21tX2RhdGEuYwppbmRleCA5M2E1MzQ3Li4yMjA0YzJiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9jbW1fZGF0YS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2NtbV9kYXRhLmMKQEAgLTEzNjYsNyArMTM2Niw3IEBACiAJLyogUjY2IHNob3VsZCBub3QgYmUgMCAqLwogCWlmIChwQWQtPkJicFR1bmluZy5SNjZDdXJyZW50VmFsdWUgPT0gMCkgewogCQlwQWQtPkJicFR1bmluZy5SNjZDdXJyZW50VmFsdWUgPSAweDM4OwotCQlEQkdQUklOVF9FUlIoKCJSVE1QUmVzdW1lTXNkdVRyYW5zbWlzc2lvbiwgUjY2Q3VycmVudFZhbHVlPTAuLi5cbiIpKTsKKwkJREJHUFJJTlRfRVJSKCJSVE1QUmVzdW1lTXNkdVRyYW5zbWlzc2lvbiwgUjY2Q3VycmVudFZhbHVlPTAuLi5cbiIpOwogCX0KIAogCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY2LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vY21tX2RhdGFfcGNpLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9jbW1fZGF0YV9wY2kuYwppbmRleCA0M2Q3M2EwLi43YWY1OWZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9jbW1fZGF0YV9wY2kuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9jbW1fZGF0YV9wY2kuYwpAQCAtMTM3LDcgKzEzNyw3IEBACiAKIAlwVHhELT5TRFB0cjAgPSBCdWZCYXNlUGFMb3c7CiAJcFR4RC0+U0RMZW4wID0gVFhJTkZPX1NJWkUgKyBUWFdJX1NJWkUgKyBod0hlYWRlckxlbjsJLyogaW5jbHVkZSBwYWRkaW5nICovCi0JcFR4RC0+U0RQdHIxID0gUENJX01BUF9TSU5HTEUocEFkLCBwVHhCbGssIDAsIDEsIFBDSV9ETUFfVE9ERVZJQ0UpOzsKKwlwVHhELT5TRFB0cjEgPSBQQ0lfTUFQX1NJTkdMRShwQWQsIHBUeEJsaywgMCwgMSwgUENJX0RNQV9UT0RFVklDRSk7CiAJcFR4RC0+U0RMZW4xID0gcFR4QmxrLT5TcmNCdWZMZW47CiAJcFR4RC0+TGFzdFNlYzAgPSAwOwogCXBUeEQtPkxhc3RTZWMxID0gKGJJc0xhc3QpID8gMSA6IDA7CkBAIC0yMTUsNyArMjE1LDcgQEAKIAogCXBUeEQtPlNEUHRyMCA9IEJ1ZkJhc2VQYUxvdzsKIAlwVHhELT5TRExlbjAgPSBmaXJzdERNQUxlbjsJLyogaW5jbHVkZSBwYWRkaW5nICovCi0JcFR4RC0+U0RQdHIxID0gUENJX01BUF9TSU5HTEUocEFkLCBwVHhCbGssIDAsIDEsIFBDSV9ETUFfVE9ERVZJQ0UpOzsKKwlwVHhELT5TRFB0cjEgPSBQQ0lfTUFQX1NJTkdMRShwQWQsIHBUeEJsaywgMCwgMSwgUENJX0RNQV9UT0RFVklDRSk7CiAJcFR4RC0+U0RMZW4xID0gcFR4QmxrLT5TcmNCdWZMZW47CiAJcFR4RC0+TGFzdFNlYzAgPSAwOwogCXBUeEQtPkxhc3RTZWMxID0gKGJJc0xhc3QpID8gMSA6IDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9jbW1fbWFjX3BjaS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vY21tX21hY19wY2kuYwppbmRleCBlMjZiYTQ5Li44NTBmMGZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9jbW1fbWFjX3BjaS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2NtbV9tYWNfcGNpLmMKQEAgLTg5LDcgKzg5LDcgQEAKIAogCQkJaWYgKHBBZC0+VHhEZXNjUmluZ1tudW1dLkFsbG9jVmEgPT0gTlVMTCkgewogCQkJCUVycm9yVmFsdWUgPSBFUlJMT0dfT1VUX09GX1NIQVJFRF9NRU1PUlk7Ci0JCQkJREJHUFJJTlRfRVJSKCgiRmFpbGVkIHRvIGFsbG9jYXRlIGEgYmlnIGJ1ZmZlclxuIikpOworCQkJCURCR1BSSU5UX0VSUigiRmFpbGVkIHRvIGFsbG9jYXRlIGEgYmlnIGJ1ZmZlclxuIik7CiAJCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfUkVTT1VSQ0VTOwogCQkJCWJyZWFrOwogCQkJfQpAQCAtMTIxLDcgKzEyMSw3IEBACiAKIAkJCWlmIChwQWQtPlR4QnVmU3BhY2VbbnVtXS5BbGxvY1ZhID09IE5VTEwpIHsKIAkJCQlFcnJvclZhbHVlID0gRVJSTE9HX09VVF9PRl9TSEFSRURfTUVNT1JZOwotCQkJCURCR1BSSU5UX0VSUigoIkZhaWxlZCB0byBhbGxvY2F0ZSBhIGJpZyBidWZmZXJcbiIpKTsKKwkJCQlEQkdQUklOVF9FUlIoIkZhaWxlZCB0byBhbGxvY2F0ZSBhIGJpZyBidWZmZXJcbiIpOwogCQkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1JFU09VUkNFUzsKIAkJCQlicmVhazsKIAkJCX0KQEAgLTE5Nyw3ICsxOTcsNyBAQAogCiAJCWlmIChwQWQtPk1nbXREZXNjUmluZy5BbGxvY1ZhID09IE5VTEwpIHsKIAkJCUVycm9yVmFsdWUgPSBFUlJMT0dfT1VUX09GX1NIQVJFRF9NRU1PUlk7Ci0JCQlEQkdQUklOVF9FUlIoKCJGYWlsZWQgdG8gYWxsb2NhdGUgYSBiaWcgYnVmZmVyXG4iKSk7CisJCQlEQkdQUklOVF9FUlIoIkZhaWxlZCB0byBhbGxvY2F0ZSBhIGJpZyBidWZmZXJcbiIpOwogCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfUkVTT1VSQ0VTOwogCQkJYnJlYWs7CiAJCX0KQEAgLTI1MSw3ICsyNTEsNyBAQAogCiAJCWlmIChwQWQtPlJ4RGVzY1JpbmcuQWxsb2NWYSA9PSBOVUxMKSB7CiAJCQlFcnJvclZhbHVlID0gRVJSTE9HX09VVF9PRl9TSEFSRURfTUVNT1JZOwotCQkJREJHUFJJTlRfRVJSKCgiRmFpbGVkIHRvIGFsbG9jYXRlIGEgYmlnIGJ1ZmZlclxuIikpOworCQkJREJHUFJJTlRfRVJSKCJGYWlsZWQgdG8gYWxsb2NhdGUgYSBiaWcgYnVmZmVyXG4iKTsKIAkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1JFU09VUkNFUzsKIAkJCWJyZWFrOwogCQl9CkBAIC0zMDQsNyArMzA0LDcgQEAKIAkJCS8qIEVycm9yIGhhbmRsaW5nICovCiAJCQlpZiAocERtYUJ1Zi0+QWxsb2NWYSA9PSBOVUxMKSB7CiAJCQkJRXJyb3JWYWx1ZSA9IEVSUkxPR19PVVRfT0ZfU0hBUkVEX01FTU9SWTsKLQkJCQlEQkdQUklOVF9FUlIoKCJGYWlsZWQgdG8gYWxsb2NhdGUgUnhSaW5nJ3MgMXN0IGJ1ZmZlclxuIikpOworCQkJCURCR1BSSU5UX0VSUigiRmFpbGVkIHRvIGFsbG9jYXRlIFJ4UmluZydzIDFzdCBidWZmZXJcbiIpOwogCQkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1JFU09VUkNFUzsKIAkJCQlicmVhazsKIAkJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2NtbV9tYWNfdXNiLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9jbW1fbWFjX3VzYi5jCmluZGV4IDcyNzMxY2IuLjY0YTY1YTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2NtbV9tYWNfdXNiLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vY21tX21hY191c2IuYwpAQCAtMjM2LDcgKzIzNiw3IEBACiAJCW9zX2FsbG9jX21lbShwQWQsICh1OCAqKikgKCZwQWQtPk1nbXREZXNjUmluZy5BbGxvY1ZhKSwKIAkJCSAgICAgcEFkLT5NZ210RGVzY1JpbmcuQWxsb2NTaXplKTsKIAkJaWYgKHBBZC0+TWdtdERlc2NSaW5nLkFsbG9jVmEgPT0gTlVMTCkgewotCQkJREJHUFJJTlRfRVJSKCgiRmFpbGVkIHRvIGFsbG9jYXRlIGEgYmlnIGJ1ZmZlciBmb3IgTWdtdERlc2NSaW5nIVxuIikpOworCQkJREJHUFJJTlRfRVJSKCJGYWlsZWQgdG8gYWxsb2NhdGUgYSBiaWcgYnVmZmVyIGZvciBNZ210RGVzY1JpbmchXG4iKTsKIAkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1JFU09VUkNFUzsKIAkJCWdvdG8gb3V0MTsKIAkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vY21tX3dwYS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vY21tX3dwYS5jCmluZGV4IGUzN2I2NGIuLjAwNDBmNDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2NtbV93cGEuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9jbW1fd3BhLmMKQEAgLTI3OTQsNyArMjc5NCw3IEBACiAKIAkvKiBDaGVjayBsZW5ndGggKi8KIAlpZiAoKGxlbiA8PSAwKSB8fCAocEVpZC0+TGVuICE9IGxlbikpIHsKLQkJREJHUFJJTlRfRVJSKCgiJXMgOiBUaGUgbGVuZ3RoIGlzIGludmFsaWRcbiIsIF9fZnVuY19fKSk7CisJCURCR1BSSU5UX0VSUigiJXMgOiBUaGUgbGVuZ3RoIGlzIGludmFsaWRcbiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQogCS8qIENoZWNrIFdQQSBvciBXUEEyICovCkBAIC0yODAzLDE0ICsyODAzLDEzIEBACiAJCXUxNiB1Y291bnQ7CiAKIAkJaWYgKGxlbiA8IHNpemVvZihzdHJ1Y3QgcnRfcnNuaWUpKSB7Ci0JCQlEQkdQUklOVF9FUlIoKCIlcyA6IFRoZSBsZW5ndGggaXMgdG9vIHNob3J0IGZvciBXUEFcbiIsCi0JCQkJICAgICAgX19mdW5jX18pKTsKKwkJCURCR1BSSU5UX0VSUigiJXMgOiBUaGUgbGVuZ3RoIGlzIHRvbyBzaG9ydCBmb3IgV1BBXG4iLCBfX2Z1bmNfXyk7CiAJCQlyZXR1cm4gTlVMTDsKIAkJfQogCQkvKiBHZXQgdGhlIGNvdW50IG9mIHBhaXJ3aXNlIGNpcGhlciAqLwogCQl1Y291bnQgPSBjcHUybGUxNihwUnNuaWUtPnVjb3VudCk7CiAJCWlmICh1Y291bnQgPiAyKSB7Ci0JCQlEQkdQUklOVF9FUlIoKCIlcyA6IFRoZSBjb3VudCglZCkgb2YgcGFpcndpc2UgY2lwaGVyIGlzIGludmxhaWRcbiIsIF9fZnVuY19fLCB1Y291bnQpKTsKKwkJCURCR1BSSU5UX0VSUigiJXMgOiBUaGUgY291bnQoJWQpIG9mIHBhaXJ3aXNlIGNpcGhlciBpcyBpbnZsYWlkXG4iLCBfX2Z1bmNfXywgdWNvdW50KTsKIAkJCXJldHVybiBOVUxMOwogCQl9CiAJCS8qIEdldCB0aGUgZ3JvdXAgY2lwaGVyICovCkBAIC0yODM2LDE0ICsyODM1LDEzIEBACiAJCWlzV1BBMiA9IFRSVUU7CiAKIAkJaWYgKGxlbiA8IHNpemVvZihzdHJ1Y3QgcnRfcnNuaWUyKSkgewotCQkJREJHUFJJTlRfRVJSKCgiJXMgOiBUaGUgbGVuZ3RoIGlzIHRvbyBzaG9ydCBmb3IgV1BBMlxuIiwKLQkJCQkgICAgICBfX2Z1bmNfXykpOworCQkJREJHUFJJTlRfRVJSKCIlcyA6IFRoZSBsZW5ndGggaXMgdG9vIHNob3J0IGZvciBXUEEyXG4iLCBfX2Z1bmNfXyk7CiAJCQlyZXR1cm4gTlVMTDsKIAkJfQogCQkvKiBHZXQgdGhlIGNvdW50IG9mIHBhaXJ3aXNlIGNpcGhlciAqLwogCQl1Y291bnQgPSBjcHUybGUxNihwUnNuaWUtPnVjb3VudCk7CiAJCWlmICh1Y291bnQgPiAyKSB7Ci0JCQlEQkdQUklOVF9FUlIoKCIlcyA6IFRoZSBjb3VudCglZCkgb2YgcGFpcndpc2UgY2lwaGVyIGlzIGludmxhaWRcbiIsIF9fZnVuY19fLCB1Y291bnQpKTsKKwkJCURCR1BSSU5UX0VSUigiJXMgOiBUaGUgY291bnQoJWQpIG9mIHBhaXJ3aXNlIGNpcGhlciBpcyBpbnZsYWlkXG4iLCBfX2Z1bmNfXywgdWNvdW50KTsKIAkJCXJldHVybiBOVUxMOwogCQl9CiAJCS8qIEdldCB0aGUgZ3JvdXAgY2lwaGVyICovCkBAIC0yODYzLDcgKzI4NjEsNyBAQAogCQlvZmZzZXQgPSBzaXplb2Yoc3RydWN0IHJ0X3JzbmllMikgKyAoNCAqICh1Y291bnQgLSAxKSk7CiAKIAl9IGVsc2UgewotCQlEQkdQUklOVF9FUlIoKCIlcyA6IFVua25vd24gSUUgKCVkKVxuIiwgX19mdW5jX18sIHBFaWQtPkVpZCkpOworCQlEQkdQUklOVF9FUlIoIiVzIDogVW5rbm93biBJRSAoJWQpXG4iLCBfX2Z1bmNfXywgcEVpZC0+RWlkKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQogCkBAIC0yODcyLDggKzI4NzAsNyBAQAogCWxlbiAtPSBvZmZzZXQ7CiAKIAlpZiAobGVuIDwgc2l6ZW9mKHN0cnVjdCBydF9yc25pZV9hdXRoKSkgewotCQlEQkdQUklOVF9FUlIoKCIlcyA6IFRoZSBsZW5ndGggb2YgUlNOSUUgaXMgdG9vIHNob3J0XG4iLAotCQkJICAgICAgX19mdW5jX18pKTsKKwkJREJHUFJJTlRfRVJSKCIlcyA6IFRoZSBsZW5ndGggb2YgUlNOSUUgaXMgdG9vIHNob3J0XG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybiBOVUxMOwogCX0KIAkvKiBwb2ludGVyIHRvIEFLTSBjb3VudCAqLwpAQCAtMjg4Miw4ICsyODc5LDcgQEAKIAkvKiBHZXQgdGhlIGNvdW50IG9mIHBhaXJ3aXNlIGNpcGhlciAqLwogCWFjb3VudCA9IGNwdTJsZTE2KHBBa20tPmFjb3VudCk7CiAJaWYgKGFjb3VudCA+IDIpIHsKLQkJREJHUFJJTlRfRVJSKCgiJXMgOiBUaGUgY291bnQoJWQpIG9mIEFLTSBpcyBpbnZsYWlkXG4iLAotCQkJICAgICAgX19mdW5jX18sIGFjb3VudCkpOworCQlEQkdQUklOVF9FUlIoIiVzIDogVGhlIGNvdW50KCVkKSBvZiBBS00gaXMgaW52bGFpZFxuIiwgX19mdW5jX18sIGFjb3VudCk7CiAJCXJldHVybiBOVUxMOwogCX0KIAkvKiBHZXQgdGhlIEFLTSBzdWl0ZSAqLwpAQCAtMjkxMCw3ICsyOTA2LDcgQEAKIAkJCXJldHVybiBwQnVmOwogCQl9CiAJfSBlbHNlIHsKLQkJREJHUFJJTlRfRVJSKCgiJXMgOiBpdCBjYW4ndCBnZXQgYW55IG1vcmUgaW5mb3JtYXRpb24gYmV5b25kIEFLTSBcbiIsIF9fZnVuY19fKSk7CisJCURCR1BSSU5UX0VSUigiJXMgOiBpdCBjYW4ndCBnZXQgYW55IG1vcmUgaW5mb3JtYXRpb24gYmV5b25kIEFLTSBcbiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9lZV9lZnVzZS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vZWVfZWZ1c2UuYwppbmRleCAwMzQxMmY1Li5mZWQwYmE0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9lZV9lZnVzZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2VlX2VmdXNlLmMKQEAgLTI2NCw3ICsyNjQsNyBAQAogCQlpZiAoaSA9PSBFRlVTRV9VU0FHRV9NQVBfRU5EKQogCQkJZWZ1c2VmcmVlbnVtID0gMDsKIAl9Ci0JcHJpbnRrKCJlZnVzZUZyZWVOdW1iZXIgaXMgJWRcbiIsIGVmdXNlZnJlZW51bSk7CisJcHJpbnRrKEtFUk5fREVCVUcgImVmdXNlRnJlZU51bWJlciBpcyAlZFxuIiwgZWZ1c2VmcmVlbnVtKTsKIAlyZXR1cm4gVFJVRTsKIH0KIApAQCAtMjc0LDE2ICsyNzQsMjMgQEAKIAlpbnQgaSA9IDA7CiAJaWYgKCFwQWQtPmJVc2VFZnVzZSkKIAkJcmV0dXJuIEZBTFNFOworCisJcHJpbnRrKEtFUk5fREVCVUcgIkJsb2NrIDA6ICIpOworCiAJZm9yIChpID0gMDsgaSA8IEVGVVNFX1VTQUdFX01BUF9FTkQgLyAyOyBpKyspIHsKIAkJSW5CdWZbMF0gPSAyICogaTsKIAkJSW5CdWZbMV0gPSAyOwogCQlJbkJ1ZlsyXSA9IDB4MDsKIAogCQllRnVzZVJlYWRQaHlzaWNhbChwQWQsICZJbkJ1ZlswXSwgNCwgJkluQnVmWzJdLCAyKTsKLQkJaWYgKGkgJSA0ID09IDApCi0JCQlwcmludGsoIlxuQmxvY2sgJXg6IiwgaSAvIDgpOwotCQlwcmludGsoIiUwNHggIiwgSW5CdWZbMl0pOworCQlpZiAoaSAmJiBpICUgNCA9PSAwKSB7CisJCQlwcmludGsoS0VSTl9DT05UICJcbiIpOworCQkJcHJpbnRrKEtFUk5fREVCVUcgIkJsb2NrICV4OiIsIGkgLyA4KTsKKwkJfQorCQlwcmludGsoS0VSTl9DT05UICIlMDR4ICIsIEluQnVmWzJdKTsKIAl9CisJcHJpbnRrKEtFUk5fQ09OVCAiXG4iKTsKKwogCXJldHVybiBUUlVFOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9tbG1lLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9tbG1lLmMKaW5kZXggNzMwMGM2ZS4uZDljM2ZkNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vbWxtZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL21sbWUuYwpAQCAtNTUwLDcgKzU1MCw3IEBACiAJCQlFbGVtLT5Nc2dMZW4gPSAwOwogCiAJCX0gZWxzZSB7Ci0JCQlEQkdQUklOVF9FUlIoKCJNbG1lSGFuZGxlcjogTWxtZVF1ZXVlIGVtcHR5XG4iKSk7CisJCQlEQkdQUklOVF9FUlIoIk1sbWVIYW5kbGVyOiBNbG1lUXVldWUgZW1wdHlcbiIpOwogCQl9CiAJfQogCkBAIC00Njk4LDggKzQ2OTgsNyBAQAogCiAJLyogRmlyc3QgY2hlY2sgdGhlIHNpemUsIGl0IE1VU1Qgbm90IGV4Y2VlZCB0aGUgbWxtZSBxdWV1ZSBzaXplICovCiAJaWYgKE1zZ0xlbiA+IE1HTVRfRE1BX0JVRkZFUl9TSVpFKSB7Ci0JCURCR1BSSU5UX0VSUigoIk1sbWVFbnF1ZXVlOiBtc2cgdG9vIGxhcmdlLCBzaXplID0gJWxkIFxuIiwKLQkJCSAgICAgIE1zZ0xlbikpOworCQlEQkdQUklOVF9FUlIoIk1sbWVFbnF1ZXVlOiBtc2cgdG9vIGxhcmdlLCBzaXplID0gJWxkIFxuIiwgTXNnTGVuKTsKIAkJcmV0dXJuIEZBTFNFOwogCX0KIApAQCAtNDc2MiwxMiArNDc2MSwxMiBAQAogCWlmIChSVE1QX1RFU1RfRkxBRwogCSAgICAocEFkLAogCSAgICAgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkgewotCQlEQkdQUklOVF9FUlIoKCJNbG1lRW5xdWV1ZUZvclJlY3Y6IGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTU1xuIikpOworCQlEQkdQUklOVF9FUlIoIk1sbWVFbnF1ZXVlRm9yUmVjdjogZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTXG4iKTsKIAkJcmV0dXJuIEZBTFNFOwogCX0KIAkvKiBGaXJzdCBjaGVjayB0aGUgc2l6ZSwgaXQgTVVTVCBub3QgZXhjZWVkIHRoZSBtbG1lIHF1ZXVlIHNpemUgKi8KIAlpZiAoTXNnTGVuID4gTUdNVF9ETUFfQlVGRkVSX1NJWkUpIHsKLQkJREJHUFJJTlRfRVJSKCgiTWxtZUVucXVldWVGb3JSZWN2OiBmcmFtZSB0b28gbGFyZ2UsIHNpemUgPSAlbGQgXG4iLCBNc2dMZW4pKTsKKwkJREJHUFJJTlRfRVJSKCJNbG1lRW5xdWV1ZUZvclJlY3Y6IGZyYW1lIHRvbyBsYXJnZSwgc2l6ZSA9ICVsZCBcbiIsIE1zZ0xlbik7CiAJCXJldHVybiBGQUxTRTsKIAl9CiAKQEAgLTQ3NzcsNyArNDc3Niw3IEBACiAKIAl7CiAJCWlmICghTXNnVHlwZVN1YnN0KHBBZCwgcEZyYW1lLCAmTWFjaGluZSwgJk1zZ1R5cGUpKSB7Ci0JCQlEQkdQUklOVF9FUlIoKCJNbG1lRW5xdWV1ZUZvclJlY3Y6IHVuLXJlY29uZ25pemVkIG1nbXQtPnN1YnR5cGU9JWRcbiIsIHBGcmFtZS0+SGRyLkZDLlN1YlR5cGUpKTsKKwkJCURCR1BSSU5UX0VSUigiTWxtZUVucXVldWVGb3JSZWN2OiB1bi1yZWNvbmduaXplZCBtZ210LT5zdWJ0eXBlPSVkXG4iLCBwRnJhbWUtPkhkci5GQy5TdWJUeXBlKTsKIAkJCXJldHVybiBGQUxTRTsKIAkJfQogCX0KQEAgLTQ4NjcsNyArNDg2Niw3IEBACiAJCQlFbGVtLT5Nc2dMZW4gPSAwOwogCiAJCX0gZWxzZSB7Ci0JCQlEQkdQUklOVF9FUlIoKCJNbG1lUmVzdGFydFN0YXRlTWFjaGluZTogTWxtZVF1ZXVlIGVtcHR5XG4iKSk7CisJCQlEQkdQUklOVF9FUlIoIk1sbWVSZXN0YXJ0U3RhdGVNYWNoaW5lOiBNbG1lUXVldWUgZW1wdHlcbiIpOwogCQl9CiAJfQogI2VuZGlmIC8qIFJUTVBfTUFDX1BDSSAvLyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vcnRfcmYuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL3J0X3JmLmMKaW5kZXggNTE5MTIxZC4uMjg5NTQ0NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vcnRfcmYuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9ydF9yZi5jCkBAIC0xMzEsOCArMTMxLDcgQEAKIAkJfQogCX0KIAlpZiAocmZjc3IuZmllbGQuUkZfQ1NSX0tJQ0sgPT0gQlVTWSkgewotCQlEQkdQUklOVF9FUlIoKCJSRiByZWFkIFIlZD0weCV4IGZhaWwsIGlbJWRdLCBrWyVkXVxuIiwgcmVnSUQsCi0JCQkgICAgICByZmNzci53b3JkLCBpLCBrKSk7CisJCURCR1BSSU5UX0VSUigiUkYgcmVhZCBSJWQ9MHgleCBmYWlsLCBpWyVkXSwga1slZF1cbiIsIHJlZ0lELCByZmNzci53b3JkLCBpLCBrKTsKIAkJcmV0dXJuIFNUQVRVU19VTlNVQ0NFU1NGVUw7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9ydG1wX2luaXQuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL3J0bXBfaW5pdC5jCmluZGV4IDM2MjhlODUuLmQzNTlhMTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL3J0bXBfaW5pdC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL3J0bXBfaW5pdC5jCkBAIC0xNjksMTQgKzE2OSwxNCBAQAogCQlwQmVhY29uQnVmID0ga21hbGxvYyhNQVhfQkVBQ09OX1NJWkUsIE1FTV9BTExPQ19GTEFHKTsKIAkJaWYgKHBCZWFjb25CdWYgPT0gTlVMTCkgewogCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfRkFJTFVSRTsKLQkJCURCR1BSSU5UX0VSUigoIkZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgLSBCZWFjb25CdWYhXG4iKSk7CisJCQlEQkdQUklOVF9FUlIoIkZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgLSBCZWFjb25CdWYhXG4iKTsKIAkJCWJyZWFrOwogCQl9CiAJCU5kaXNaZXJvTWVtb3J5KHBCZWFjb25CdWYsIE1BWF9CRUFDT05fU0laRSk7CiAKIAkJU3RhdHVzID0gQWRhcHRlckJsb2NrQWxsb2NhdGVNZW1vcnkoaGFuZGxlLCAodm9pZCAqKikgJiBwQWQpOwogCQlpZiAoU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpIHsKLQkJCURCR1BSSU5UX0VSUigoIkZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgLSBBREFQVEVSXG4iKSk7CisJCQlEQkdQUklOVF9FUlIoIkZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgLSBBREFQVEVSXG4iKTsKIAkJCWJyZWFrOwogCQl9CiAJCXBBZC0+QmVhY29uQnVmID0gcEJlYWNvbkJ1ZjsKQEAgLTc4NSw4ICs3ODUsNyBAQAogCQkgIFZlcnNpb24uZmllbGQuVmVyc2lvbiwgVmVyc2lvbi5maWVsZC5GYWVSZWxlYXNlTnVtYmVyKSk7CiAKIAlpZiAoVmVyc2lvbi5maWVsZC5WZXJzaW9uID4gVkFMSURfRUVQUk9NX1ZFUlNJT04pIHsKLQkJREJHUFJJTlRfRVJSKCgiRTJQUk9NOiBXUk9ORyBWRVJTSU9OIDB4JXgsIHNob3VsZCBiZSAlZFxuIiwKLQkJCSAgICAgIFZlcnNpb24uZmllbGQuVmVyc2lvbiwgVkFMSURfRUVQUk9NX1ZFUlNJT04pKTsKKwkJREJHUFJJTlRfRVJSKCJFMlBST006IFdST05HIFZFUlNJT04gMHgleCwgc2hvdWxkIGJlICVkXG4iLCBWZXJzaW9uLmZpZWxkLlZlcnNpb24sIFZBTElEX0VFUFJPTV9WRVJTSU9OKTsKIAkJLypwQWQtPlN5c3RlbUVycm9yQml0bWFwIHw9IDB4MDAwMDAwMDE7CiAKIAkJICAgLy8gaGFyZC1jb2RlIGRlZmF1bHQgdmFsdWUgd2hlbiBubyBwcm9wZXIgRTJQUk9NIGluc3RhbGxlZApAQCAtMjkxMSw3ICsyOTEwLDcgQEAKIAkJCVJUTVBfT1NfQWRkX1RpbWVyKCZwVGltZXItPlRpbWVyT2JqLCBWYWx1ZSk7CiAJCX0KIAl9IGVsc2UgewotCQlEQkdQUklOVF9FUlIoKCJSVE1QU2V0VGltZXIgZmFpbGVkLCBUaW1lciBoYXNuJ3QgYmVlbiBpbml0aWFsaXplIVxuIikpOworCQlEQkdQUklOVF9FUlIoIlJUTVBTZXRUaW1lciBmYWlsZWQsIFRpbWVyIGhhc24ndCBiZWVuIGluaXRpYWxpemUhXG4iKTsKIAl9CiB9CiAKQEAgLTI5NDcsNyArMjk0Niw3IEBACiAJCQlSVE1QX09TX01vZF9UaW1lcigmcFRpbWVyLT5UaW1lck9iaiwgVmFsdWUpOwogCQl9CiAJfSBlbHNlIHsKLQkJREJHUFJJTlRfRVJSKCgiUlRNUE1vZFRpbWVyIGZhaWxlZCwgVGltZXIgaGFzbid0IGJlZW4gaW5pdGlhbGl6ZSFcbiIpKTsKKwkJREJHUFJJTlRfRVJSKCJSVE1QTW9kVGltZXIgZmFpbGVkLCBUaW1lciBoYXNuJ3QgYmVlbiBpbml0aWFsaXplIVxuIik7CiAJfQogfQogCkBAIC0yOTg5LDcgKzI5ODgsNyBAQAogCQlSdG1wVGltZXJRUmVtb3ZlKHBUaW1lci0+cEFkLCBwVGltZXIpOwogI2VuZGlmIC8qIFJUTVBfVElNRVJfVEFTS19TVVBQT1JUIC8vICovCiAJfSBlbHNlIHsKLQkJREJHUFJJTlRfRVJSKCgiUlRNUENhbmNlbFRpbWVyIGZhaWxlZCwgVGltZXIgaGFzbid0IGJlZW4gaW5pdGlhbGl6ZSFcbiIpKTsKKwkJREJHUFJJTlRfRVJSKCJSVE1QQ2FuY2VsVGltZXIgZmFpbGVkLCBUaW1lciBoYXNuJ3QgYmVlbiBpbml0aWFsaXplIVxuIik7CiAJfQogfQogCkBAIC0zMjUxLDggKzMyNTAsNyBAQAogCS8qIExvYWQgODA1MSBmaXJtd2FyZSAqLwogCVN0YXR1cyA9IE5JQ0xvYWRGaXJtd2FyZShwQWQpOwogCWlmIChTdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykgewotCQlEQkdQUklOVF9FUlIoKCJOSUNMb2FkRmlybXdhcmUgZmFpbGVkLCBTdGF0dXNbPTB4JTA4eF1cbiIsCi0JCQkgICAgICBTdGF0dXMpKTsKKwkJREJHUFJJTlRfRVJSKCJOSUNMb2FkRmlybXdhcmUgZmFpbGVkLCBTdGF0dXNbPTB4JTA4eF1cbiIsIFN0YXR1cyk7CiAJCWdvdG8gZXJyMTsKIAl9CiAKQEAgLTMyNjgsOCArMzI2Niw3IEBACiAKIAlTdGF0dXMgPSBSVE1QQWxsb2NUeFJ4UmluZ01lbW9yeShwQWQpOwogCWlmIChTdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykgewotCQlEQkdQUklOVF9FUlIoKCJSVE1QQWxsb2NETUFNZW1vcnkgZmFpbGVkLCBTdGF0dXNbPTB4JTA4eF1cbiIsCi0JCQkgICAgICBTdGF0dXMpKTsKKwkJREJHUFJJTlRfRVJSKCJSVE1QQWxsb2NETUFNZW1vcnkgZmFpbGVkLCBTdGF0dXNbPTB4JTA4eF1cbiIsIFN0YXR1cyk7CiAJCWdvdG8gZXJyMTsKIAl9CiAKQEAgLTMyODQsNyArMzI4MSw3IEBACiAKIAlTdGF0dXMgPSBNbG1lSW5pdChwQWQpOwogCWlmIChTdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykgewotCQlEQkdQUklOVF9FUlIoKCJNbG1lSW5pdCBmYWlsZWQsIFN0YXR1c1s9MHglMDh4XVxuIiwgU3RhdHVzKSk7CisJCURCR1BSSU5UX0VSUigiTWxtZUluaXQgZmFpbGVkLCBTdGF0dXNbPTB4JTA4eF1cbiIsIFN0YXR1cyk7CiAJCWdvdG8gZXJyMjsKIAl9CiAJLyogSW5pdGlhbGl6ZSBwQWQtPlN0YUNmZywgcEFkLT5BcENmZywgcEFkLT5Db21tb25DZmcgdG8gbWFudWZhY3R1cmUgZGVmYXVsdCAqLwpAQCAtMzMwOSw4ICszMzA2LDcgQEAKIAkvKiAqLwogCVN0YXR1cyA9IE5JQ0luaXRpYWxpemVBZGFwdGVyKHBBZCwgVFJVRSk7CiAJaWYgKFN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKSB7Ci0JCURCR1BSSU5UX0VSUigoIk5JQ0luaXRpYWxpemVBZGFwdGVyIGZhaWxlZCwgU3RhdHVzWz0weCUwOHhdXG4iLAotCQkJICAgICAgU3RhdHVzKSk7CisJCURCR1BSSU5UX0VSUigiTklDSW5pdGlhbGl6ZUFkYXB0ZXIgZmFpbGVkLCBTdGF0dXNbPTB4JTA4eF1cbiIsIFN0YXR1cyk7CiAJCWlmIChTdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKIAkJCWdvdG8gZXJyMzsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9ydG1wX21jdS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vcnRtcF9tY3UuYwppbmRleCA4NDRkNGI5Li44MGZhNDE2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9ydG1wX21jdS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL3J0bXBfbWN1LmMKQEAgLTI2Nyw3ICsyNjcsNyBAQAogCQl9IHdoaWxlIChpKysgPCAxMDApOwogCiAJCWlmIChpID4gMTAwKSB7Ci0JCQlEQkdQUklOVF9FUlIoKCJIMk1fTUFJTEJPWCBzdGlsbCBob2xkIGJ5IE1DVS4gY29tbWFuZCBmYWlsXG4iKSk7CisJCQlEQkdQUklOVF9FUlIoIkgyTV9NQUlMQk9YIHN0aWxsIGhvbGQgYnkgTUNVLiBjb21tYW5kIGZhaWxcbiIpOwogCQkJcmV0dXJuIEZBTFNFOwogCQl9CiAKQEAgLTI5Niw3ICsyOTYsNyBAQAogI2lmZGVmIFJUTVBfTUFDX1BDSQogI2VuZGlmIC8qIFJUTVBfTUFDX1BDSSAvLyAqLwogCQkJewotCQkJCURCR1BSSU5UX0VSUigoIkgyTV9NQUlMQk9YIHN0aWxsIGhvbGQgYnkgTUNVLiBjb21tYW5kIGZhaWxcbiIpKTsKKwkJCQlEQkdQUklOVF9FUlIoIkgyTV9NQUlMQk9YIHN0aWxsIGhvbGQgYnkgTUNVLiBjb21tYW5kIGZhaWxcbiIpOwogCQkJfQogCQkJcmV0dXJuIEZBTFNFOwogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9zcGVjdHJ1bS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vc3BlY3RydW0uYwppbmRleCAyZDVmODQ3Li4xZGZiODAyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9zcGVjdHJ1bS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL3NwZWN0cnVtLmMKQEAgLTE4MzcsNyArMTgzNyw3IEBACiAJCQl9CiAKIAkJCWlmIChpbmRleCA+PSBwQWQtPkNoYW5uZWxMaXN0TnVtKSB7Ci0JCQkJREJHUFJJTlRfRVJSKCgiJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiZQZWVyQ2hTd0FubkFjdGlvbihjYW4gbm90IGZpbmQgTmV3IENoYW5uZWw9JWQgaW4gQ2hhbm5lbExpc3RbJWRdXG4iLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsLCBwQWQtPkNoYW5uZWxMaXN0TnVtKSk7CisJCQkJREJHUFJJTlRfRVJSKCImJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJlBlZXJDaFN3QW5uQWN0aW9uKGNhbiBub3QgZmluZCBOZXcgQ2hhbm5lbD0lZCBpbiBDaGFubmVsTGlzdFslZF1cbiIsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwsIHBBZC0+Q2hhbm5lbExpc3ROdW0pOwogCQkJfQogCQl9CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9tbG1lLmggYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL21sbWUuaAppbmRleCAwMTQxNGMzLi5jZDFlZTNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL21sbWUuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL21sbWUuaApAQCAtMzIsOCArMzIsOSBAQAogCVJldmlzaW9uIEhpc3Rvcnk6CiAJV2hvCQkJV2hlbgkJCVdoYXQKIAktLS0tLS0tLQktLS0tLS0tLS0tCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQlKb2huIENoYW5nCTIwMDMtMDgtMjgJCUNyZWF0ZWQKLQlKb2huIENoYW5nICAyMDA0LTA5LTA2ICAgICAgbW9kaWZpZWQgZm9yIFJUMjYwMAorCUpvaG4gQ2hhbmcJCTIwMDMtMDgtMjgJCUNyZWF0ZWQKKwlKb2huIENoYW5nICAJCTIwMDQtMDktMDYgICAgICAJbW9kaWZpZWQgZm9yIFJUMjYwMAorCUp1c3RpbiBQLiBNYXR0b2NrCTExLzA3LzIwMTAJCUZpeCB0eXBvcyBpbiBjb21tZW50cwogCiAqLwogI2lmbmRlZiBfX01MTUVfSF9fCkBAIC00MSw3ICs0Miw3IEBACiAKICNpbmNsdWRlICJydG1wX2RvdDExLmgiCiAKLS8qIG1heGltdW0gc3VwcG9ydGVkIGNhcGFiaWxpdHkgaW5mb3JtYXRpb24gLSAqLworLyogbWF4aW11bSBzdXBwb3J0ZWQgY2FwYWJpbGl0eSBpbmZvcm1hdGlvbiAqLwogLyogRVNTLCBJQlNTLCBQcml2YWN5LCBTaG9ydCBQcmVhbWJsZSwgU3BlY3RydW0gbWdtdCwgU2hvcnQgU2xvdCAqLwogI2RlZmluZSBTVVBQT1JURURfQ0FQQUJJTElUWV9JTkZPICAgMHgwNTMzCiAKQEAgLTc3LDcgKzc4LDcgQEAKICNkZWZpbmUgQ1dfTUFYX0lOX0JJVFMgICAgICAgICAgICAgIDEwCS8qIGFjdHVhbCBDd01heCA9IDJeQ1dfTUFYX0lOX0JJVFMgLSAxICovCiAKIC8qIE5vdGU6IFJTU0lfVE9fREJNX09GRlNFVCBoYXMgYmVlbiBjaGFuZ2VkIHRvIHZhcmlhYmxlIGZvciBuZXcgUkYgKDIwMDQtMDcyMCkuICovCi0vKiBTSG91bGQgbm90IHJlZmVyIHRvIHRoaXMgY29uc3RhbnQgYW55bW9yZSAqLworLyogU2hvdWxkIG5vdCByZWZlciB0byB0aGlzIGNvbnN0YW50IGFueW1vcmUgKi8KIC8qI2RlZmluZSBSU1NJX1RPX0RCTV9PRkZTRVQgICAgICAgICAgMTIwIC8vIGZvciBSVDI1MzAgUlNTSS0xMTUgPSBkQm0gKi8KICNkZWZpbmUgUlNTSV9GT1JfTUlEX1RYX1BPV0VSICAgICAgIC01NQkvKiAtNTUgZGIgaXMgY29uc2lkZXJlZCBtaWQtZGlzdGFuY2UgKi8KICNkZWZpbmUgUlNTSV9GT1JfTE9XX1RYX1BPV0VSICAgICAgIC00NQkvKiAtNDUgZGIgaXMgY29uc2lkZXJlZCB2ZXJ5IHNob3J0IGRpc3RhbmNlIGFuZCAqLwpAQCAtMTIzLDcgKzEyNCw3IEBACiAjZGVmaW5lIFRJRF9NQUNfSEFTSF9JTkRFWChBZGRyLCBUSUQpICAgICAgKFRJRF9NQUNfSEFTSChBZGRyLCBUSUQpICUgSEFTSF9UQUJMRV9TSVpFKQogCiAvKiBMRUQgQ29udHJvbCAqLwotLyogYXNzb2lhdGlvbiBPTi4gb25lIExFRCBPTi4gYW5vdGhlciBibGlua2luZyB3aGVuIFRYLCBPRkYgd2hlbiBpZGxlICovCisvKiBhc3NvY2lhdGlvbiBPTi4gb25lIExFRCBPTi4gYW5vdGhlciBibGlua2luZyB3aGVuIFRYLCBPRkYgd2hlbiBpZGxlICovCiAvKiBubyBhc3NvY2lhdGlvbiwgYm90aCBMRUQgb2ZmICovCiAjZGVmaW5lIEFTSUNfTEVEX0FDVF9PTihwQWQpICAgICAgICBSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfQ1NSMTQsIDB4MDAwMzFlNDYpCiAjZGVmaW5lIEFTSUNfTEVEX0FDVF9PRkYocEFkKSAgICAgICBSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfQ1NSMTQsIDB4MDAwMDFlNDYpCkBAIC0yODQsOCArMjg1LDggQEAKIAogLyogODAyLjExbiBkcmFmdDMgcmVsYXRlZCBzdHJ1Y3R1cmUgZGVmaW5pdGlvbnMuICovCiAvKiA3LjMuMi42MCAqLwotI2RlZmluZSBkb3QxMU9CU1NTY2FuUGFzc2l2ZUR3ZWxsCQkJCQkJCTIwCS8qIGluIFRVLiBtaW4gYW1vdW50IG9mIHRpbWUgdGhhdCB0aGUgU1RBIGNvbnRpbm91c2x5IHNjYW5zIGVhY2ggY2hhbm5lbCB3aGVuIHBlcmZvcm1pbmcgYW4gYWN0aXZlIE9CU1Mgc2Nhbi4gKi8KLSNkZWZpbmUgZG90MTFPQlNTU2NhbkFjdGl2ZUR3ZWxsCQkJCQkJCTEwCS8qIGluIFRVLm1pbiBhbW91bnQgb2YgdGltZSB0aGF0IHRoZSBTVEEgY29udGlub3VzbHkgc2NhbnMgZWFjaCBjaGFubmVsIHdoZW4gcGVyZm9ybWluZyBhbiBwYXNzaXZlIE9CU1Mgc2Nhbi4gKi8KKyNkZWZpbmUgZG90MTFPQlNTU2NhblBhc3NpdmVEd2VsbAkJCQkJCQkyMAkvKiBpbiBUVS4gbWluIGFtb3VudCBvZiB0aW1lIHRoYXQgdGhlIFNUQSBjb250aW51b3VzbHkgc2NhbnMgZWFjaCBjaGFubmVsIHdoZW4gcGVyZm9ybWluZyBhbiBhY3RpdmUgT0JTUyBzY2FuLiAqLworI2RlZmluZSBkb3QxMU9CU1NTY2FuQWN0aXZlRHdlbGwJCQkJCQkJMTAJLyogaW4gVFUubWluIGFtb3VudCBvZiB0aW1lIHRoYXQgdGhlIFNUQSBjb250aW51b3VzbHkgc2NhbnMgZWFjaCBjaGFubmVsIHdoZW4gcGVyZm9ybWluZyBhbiBwYXNzaXZlIE9CU1Mgc2Nhbi4gKi8KICNkZWZpbmUgZG90MTFCU1NXaWR0aFRyaWdnZXJTY2FuSW50ZXJ2YWwJCQkJCTMwMAkvKiBpbiBzZWMuIG1heCBpbnRlcnZhbCBiZXR3ZWVuIHNjYW4gb3BlcmF0aW9ucyB0byBiZSBwZXJmb3JtZWQgdG8gZGV0ZWN0IEJTUyBjaGFubmVsIHdpZHRoIHRyaWdnZXIgZXZlbnRzLiAqLwogI2RlZmluZSBkb3QxMU9CU1NTY2FuUGFzc2l2ZVRvdGFsUGVyQ2hhbm5lbAkJCQkJMjAwCS8qIGluIFRVLiBtaW4gdG90YWwgYW1vdW50IG9mIHRpbWUgdGhhdCB0aGUgU1RBIHNjYW5zIGVhY2ggY2hhbm5lbCB3aGVuIHBlcmZvcm1pbmcgYSBwYXNzaXZlIE9CU1Mgc2Nhbi4gKi8KICNkZWZpbmUgZG90MTFPQlNTU2NhbkFjdGl2ZVRvdGFsUGVyQ2hhbm5lbAkJCQkJMjAJLyppbiBUVS4gbWluIHRvdGFsIGFtb3VudCBvZiB0aW1lIHRoYXQgdGhlIFNUQSBzY2FucyBlYWNoIGNoYW5uZWwgd2hlbiBwZXJmb3JtaW5nIGEgYWN0aXZlIE9CU1Mgc2NhbiAqLwpAQCAtMzI1LDcgKzMyNiw3IEBACiB9OwogCiAvKiAyMC80MCB0cmlnZ2VyIGV2ZW50IHRhYmxlICovCi0vKiBJZiBvbmUgRXZlbnQgQSBkZWxldGUgb3IgY3JlYXRlZCwgb3IgaWYgRXZlbnQgQiBpcyBkZXRlY3RlZCBvciBub3QgZGV0ZWN0ZWQsIFNUQSBzaG91bGQgc2VuZCAyMDQwQlNTQ29leGlzdGVuY2UgdG8gQVAuICovCisvKiBJZiBvbmUgRXZlbnQgKEEpIGlzIGRlbGV0ZWQgb3IgY3JlYXRlZCwgb3IgaWYgRXZlbnQgKEIpIGlzIGRldGVjdGVkIG9yIG5vdCBkZXRlY3RlZCwgU1RBIHNob3VsZCBzZW5kIDIwNDBCU1NDb2V4aXN0ZW5jZSB0byBBUC4gKi8KICNkZWZpbmUgTUFYX1RSSUdHRVJfRVZFTlQJCTY0CiBzdHJ1Y3QgcnRfdHJpZ2dlcl9ldmVudF90YWIgewogCXU4IEV2ZW50QU5vOwpAQCAtMzU3LDE0ICszNTgsMTQgQEAKIAl1OCBDaExpc3RbMF07CiB9OwogCi0vKiBUaGUgc3RydWN0dXJlIGZvciBjaGFubmVsIHN3aXRjaCBhbm5vdWNlbWVudCBJRS4gVGhpcyBpcyBpbiA4MDIuMTFuIEQzLjAzICovCisvKiBUaGUgc3RydWN0dXJlIGZvciBjaGFubmVsIHN3aXRjaCBhbm5vdW5jZW1lbnQgSUUuIFRoaXMgaXMgaW4gODAyLjExbiBEMy4wMyAqLwogc3RydWN0IFBBQ0tFRCBydF9jaGFfc3dpdGNoX2Fubm91bmNlX2llIHsKIAl1OCBTd2l0Y2hNb2RlOwkvKmNoYW5uZWwgc3dpdGNoIG1vZGUgKi8KIAl1OCBOZXdDaGFubmVsOwkvKiAqLwogCXU4IFN3aXRjaENvdW50OwkvKiAqLwogfTsKIAotLyogVGhlIHN0cnVjdHVyZSBmb3IgY2hhbm5lbCBzd2l0Y2ggYW5ub3VjZW1lbnQgSUUuIFRoaXMgaXMgaW4gODAyLjExbiBEMy4wMyAqLworLyogVGhlIHN0cnVjdHVyZSBmb3IgY2hhbm5lbCBzd2l0Y2ggYW5ub3VuY2VtZW50IElFLiBUaGlzIGlzIGluIDgwMi4xMW4gRDMuMDMgKi8KIHN0cnVjdCBQQUNLRUQgcnRfc2VjX2NoYV9vZmZzZXRfaWUgewogCXU4IFNlY29uZGFyeUNoYW5uZWxPZmZzZXQ7CS8qIDE6IFNlY29uZGFyeSBhYm92ZSwgMzogU2Vjb25kYXJ5IGJlbG93LCAwOiBubyBTZWNvbmRhcnkgKi8KIH07CkBAIC0zNzcsNyArMzc4LDcgQEAKIAl1OCBNQ1NTZXRbMTZdOwogfTsKIAotLypUaGlzIHN0cnVjdHVyZSBzdWJzdHJhY3RzIHJhbGluayBzdXBwb3J0cyBmcm9tIGFsbCA4MDIuMTFuLXJlbGF0ZWQgZmVhdHVyZXMuICovCisvKlRoaXMgc3RydWN0dXJlIHN1YnRyYWN0cyByYWxpbmsgc3VwcG9ydHMgZnJvbSBhbGwgODAyLjExbi1yZWxhdGVkIGZlYXR1cmVzLiAqLwogLypGZWF0dXJlcyBub3QgbGlzdGVkIGhlcmUgYnV0IGNvbnRhaW5lZCBpbiA4MDIuMTFuIHNwZWMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gcnQyODYwLiAqLwogc3RydWN0IHJ0X2h0X2NhcGFiaWxpdHkgewogCXUxNiBDaGFubmVsV2lkdGg6MTsKQEAgLTM4NywxNCArMzg4LDE0IEBACiAJdTE2IFNob3J0R0lmb3I0MDoxOwkvKmZvcjQwTUh6ICovCiAJdTE2IFR4U1RCQzoxOwogCXUxNiBSeFNUQkM6MjsJLyogMiBiaXRzICovCi0JdTE2IEFtc2R1RW5hYmxlOjE7CS8qIEVuYWJsZSB0byB0cmFuc21pdCBBLU1TRFUuIFN1Z2dlc3QgZGlzYWJsZS4gV2Ugc2hvdWxkIHVzZSBBLU1QRFUgdG8gZ2FpbiBiZXN0IGJlbmlmaXQgb2YgODAyLjExbiAqLworCXUxNiBBbXNkdUVuYWJsZToxOwkvKiBFbmFibGUgdG8gdHJhbnNtaXQgQS1NU0RVLiBTdWdnZXN0IGRpc2FibGUuIFdlIHNob3VsZCB1c2UgQS1NUERVIHRvIGdhaW4gYmVzdCBiZW5lZml0IG9mIDgwMi4xMW4gKi8KIAl1MTYgQW1zZHVTaXplOjE7CS8qIE1heCByZWNlaXZpbmcgQS1NU0RVIHNpemUgKi8KIAl1MTYgcnN2OjU7CiAKIAkvKlN1YnN0cmFjdCBmcm9tIEFkZGlvbnQgSFQgSU5GTyBJRSAqLwogCXU4IE1heFJBbXBkdUZhY3RvcjoyOwogCXU4IE1wZHVEZW5zaXR5OjM7Ci0JdTggRXh0Q2hhbk9mZnNldDoyOwkvKiBQbGVhc2Ugbm90IHRoZSBkaWZmZXJlbmNlIHdpdGggZm9sbG93aW5nICAgICB1OCAgIE5ld0V4dENoYW5uZWxPZmZzZXQ7IGZyb20gODAyLjExbiAqLworCXU4IEV4dENoYW5PZmZzZXQ6MjsJLyogUGxlYXNlIG5vdGUgdGhlIGRpZmZlcmVuY2Ugd2l0aCBmb2xsb3dpbmcgICAgIHU4ICAgTmV3RXh0Q2hhbm5lbE9mZnNldDsgZnJvbSA4MDIuMTFuICovCiAJdTggUmVjb21XaWR0aDoxOwogCiAJdTE2IE9wZXJhaW9uTW9kZToyOwpAQCAtNDgxLDcgKzQ4Miw3IEBACiAJdTE2IEFNU0RVU3VwcG9ydGVkOjE7CS8qIDA6IG5vdCBwZXJtaXR0ZWQgICAgICAgICAgICAgMTogcGVybWl0dGVkICovCiAJdTE2IEJBUG9saWN5OjE7CS8qIDE6IGltbWVkaWF0ZWx5IEJBICAgIDA6ZGVsYXllZCBCQSAqLwogCXUxNiBUSUQ6NDsJCS8qIHZhbHVlIG9mIFRDIG9zIFRTICovCi0JdTE2IEJ1ZlNpemU6MTA7CS8qIG51bWJlciBvZiBidWZmZSBvZiBzaXplIDIzMDQgb2N0ZXRzciAqLworCXUxNiBCdWZTaXplOjEwOwkvKiBudW1iZXIgb2YgYnVmZmVyIG9mIHNpemUgMjMwNCBvY3RldHNyICovCiB9OwogCiAvKiAyLWJ5dGUgQkEgU3RhcnRpbmcgU2VxIENPTlRST0wgZmllbGQgKi8KQEAgLTU1MSw3ICs1NTIsNyBAQAogCUJBU0VRX0NPTlRST0wgQkFTdGFydGluZ1NlcTsKIH07CiAKLS8qIENvbXByZXNzZWQgZm9ybWF0IGlzIG1hbmRhbnRvcnkgaW4gSFQgU1RBICovCisvKiBDb21wcmVzc2VkIGZvcm1hdCBpcyBtYW5kYXRvcnkgaW4gSFQgU1RBICovCiBzdHJ1Y3QgUEFDS0VEIHJ0X2ZyYW1lX210YmEgewogCXN0cnVjdCBydF9mcmFtZV9jb250cm9sIEZDOwogCXUxNiBEdXJhdGlvbjsKQEAgLTY0Nyw3ICs2NDgsNyBAQAogCXU4IGJpdG1hc2tbOF07CiB9OwogCi0vKiBSYWRpbyBNZWFzdWVtZW50IFJlcXVlc3QgRnJhbWUgRm9ybWF0ICovCisvKiBSYWRpbyBNZWFzdXJlbWVudCBSZXF1ZXN0IEZyYW1lIEZvcm1hdCAqLwogc3RydWN0IFBBQ0tFRCBydF9mcmFtZV9ybV9yZXFfYWN0aW9uIHsKIAlzdHJ1Y3QgcnRfaGVhZGVyXzgwMl8xMSBIZHI7CiAJdTggQ2F0ZWdvcnk7CkBAIC03MDksNyArNzEwLDcgQEAKIAl1OCBDd21pbls0XTsKIAl1OCBDd21heFs0XTsKIAl1MTYgVHhvcFs0XTsJCS8qIGluIHVuaXQgb2YgMzItdXMgKi8KLQlCT09MRUFOIGJBQ01bNF07CS8qIDE6IEFkbWlzc2lvbiBDb250cm9sIG9mIEFDX0JLIGlzIG1hbmRhdHRvcnkgKi8KKwlCT09MRUFOIGJBQ01bNF07CS8qIDE6IEFkbWlzc2lvbiBDb250cm9sIG9mIEFDX0JLIGlzIG1hbmRhdG9yeSAqLwogfTsKIAogLyogUUJTUyBMT0FEIGluZm9ybWF0aW9uIGZyb20gUUFQJ3MgQkVBQ09OL1Byb2JlUnNwICovCkBAIC03NTcsNyArNzU4LDcgQEAKIHN0cnVjdCBydF9ic3NfZW50cnkgewogCXU4IEJzc2lkW01BQ19BRERSX0xFTl07CiAJdTggQ2hhbm5lbDsKLQl1OCBDZW50cmFsQ2hhbm5lbDsJLypTdG9yZSB0aGUgd2lkZS1iYW5kIGNlbnRyYWwgY2hhbm5lbCBmb3IgNDBNSHouICAudXNlZCBpbiA0ME1IeiBBUC4gT3IgdGhpcyBpcyB0aGUgc2FtZSBhcyBDaGFubmVsLiAqLworCXU4IENlbnRyYWxDaGFubmVsOwkvKlN0b3JlIHRoZSB3aWRlLWJhbmQgY2VudHJhbCBjaGFubmVsIGZvciA0ME1Iei4gdXNlZCBpbiA0ME1IeiBBUC4gT3IgdGhpcyBpcyB0aGUgc2FtZSBhcyBDaGFubmVsLiAqLwogCXU4IEJzc1R5cGU7CiAJdTE2IEF0aW1XaW47CiAJdTE2IEJlYWNvblBlcmlvZDsKQEAgLTg1NSw3ICs4NTYsNyBAQAogCVNUQVRFX01BQ0hJTkVfRlVOQyAqVHJhbnNGdW5jOwogfTsKIAotLyogTUxNRSBBVVggZGF0YSBzdHJ1Y3R1cmUgdGhhdCBob2xkIHRlbXBvcmFybGl5IHNldHRpbmdzIGR1cmluZyBhIGNvbm5lY3Rpb24gYXR0ZW1wdC4gKi8KKy8qIE1MTUUgQVVYIGRhdGEgc3RydWN0dXJlIHRoYXQgaG9sZHMgdGVtcG9yYXJsaXkgc2V0dGluZ3MgZHVyaW5nIGEgY29ubmVjdGlvbiBhdHRlbXB0LiAqLwogLyogT25jZSB0aGlzIGF0dGVtcCBzdWNjZWVkcywgYWxsIHNldHRpbmdzIHdpbGwgYmUgY29weSB0byBwQWQtPlN0YUFjdGl2ZS4gKi8KIC8qIEEgY29ubmVjdGlvbiBhdHRlbXB0ICh1c2VyIHNldCBPSUQsIHJvYW1pbmcsIENDWCBmYXN0IHJvYW1pbmcsLi4pIGNvbnNpc3RzIG9mICovCiAvKiBzZXZlcmFsIHN0ZXBzIChKT0lOLCBBVVRILCBBU1NPQyBvciBSRUFTU09DKSBhbmQgbWF5IGZhaWwgYXQgYW55IHN0ZXAuIFdlIHB1cnBvc2VseSAqLwpAQCAtOTk2LDcgKzk5Nyw3IEBACiAjZGVmaW5lIE1BQ19UQUJMRV9BU1NPQ19USU1FT1VUCQkJNQkvKiB1bml0OiBzZWMgKi8KICNkZWZpbmUgTUFDX1RBQkxFX0ZVTEwoVGFiKQkJCQkoKFRhYikuc2l6ZSA9PSBNQVhfTEVOX09GX01BQ19UQUJMRSkKIAotLyogQVAgc2hhbGwgZHJvcCB0aGUgc3RhIGlmIGNvbnRpbmUgVHggZmFpbCBjb3VudCByZWFjaCBpdC4gKi8KKy8qIEFQIHNoYWxsIGRyb3AgdGhlIHN0YSBpZiBjb250aW51ZSBUeCBmYWlsIGNvdW50IHJlYWNoIGl0LiAqLwogI2RlZmluZSBNQUNfRU5UUllfTElGRV9DSEVDS19DTlQJCTIwCS8qIHBhY2tldCBjbnQuICovCiAKIC8qIFZhbHVlIGRvbWFpbiBvZiBwTWFjRW50cnktPlNzdCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9vaWQuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvb2lkLmgKaW5kZXggMTcwNGMyNy4uNWEyNWYwZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9vaWQuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL29pZC5oCkBAIC0zMiw3ICszMiw4IEBACiAJUmV2aXNpb24gSGlzdG9yeToKIAlXaG8JCQlXaGVuCQkJV2hhdAogCS0tLS0tLS0tCS0tLS0tLS0tLS0JCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQlOYW1lCQlEYXRlCQkJTW9kaWZpY2F0aW9uIGxvZ3MKKwlOYW1lCQkJRGF0ZQkJCU1vZGlmaWNhdGlvbiBsb2dzCisJSnVzdGluIFAuIE1hdHRvY2sgCTExLzA3LzIwMTAJRml4IHR5cG9zIGluIGNvbW1lbnRzCiAqLwogI2lmbmRlZiBfT0lEX0hfCiAjZGVmaW5lIF9PSURfSF8KQEAgLTc4LDcgKzc5LDcgQEAKICNkZWZpbmUgTkRJU184MDJfMTFfTEVOR1RIX1JBVEVTICAgICAgICA4CiAjZGVmaW5lIE5ESVNfODAyXzExX0xFTkdUSF9SQVRFU19FWCAgICAgMTYKICNkZWZpbmUgTUFDX0FERFJfTEVOR1RIICAgICAgICAgICAgICAgICA2Ci0vKiNkZWZpbmUgTUFYX05VTV9PRl9DSFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDkgLy8gMTQgY2hhbm5lbHMgQDIuNEcgKyAgMTJAVU5JSSArIDQgQE1NQUMgKyAxMSBASGlwZXJMQU4yICsgNyBASmFwYW4gKyAxIGFzIE5VTEwgdGVybWluYXRpb25jICovCisvKiNkZWZpbmUgTUFYX05VTV9PRl9DSFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDkgLy8gMTQgY2hhbm5lbHMgQDIuNEcgKyAgMTJAVU5JSSArIDQgQE1NQUMgKyAxMSBASGlwZXJMQU4yICsgNyBASmFwYW4gKyAxIGFzIE5VTEwgdGVybWluYXRpb24gKi8KICNkZWZpbmUgTUFYX05VTV9PRl9DSFMJCQkJNTQJLyogMTQgY2hhbm5lbHMgQDIuNEcgKyAgMTJAVU5JSShsb3dlci9taWRkbGUpICsgMTZASGlwZXJMQU4yICsgMTFAVU5JSSh1cHBlcikgKyAwIEBKYXBhbiArIDEgYXMgTlVMTCB0ZXJtaW5hdGlvbiAqLwogI2RlZmluZSBNQVhfTlVNQkVSX09GX0VWRU5UCQkJCTEwCS8qIGVudHJ5ICMgaW4gRVZFTlQgdGFibGUgKi8KICNkZWZpbmUgTUFYX05VTUJFUl9PRl9NQUMJCQkJMzIJLyogaWYgTUFYX01CU1NJRF9OVU0gaXMgOCwgdGhpcyB2YWx1ZSBjYW4ndCBiZSBsYXJnZXIgdGhhbiAyMTEgKi8KQEAgLTg3LDcgKzg4LDcgQEAKICNkZWZpbmUgTUFYX05VTUJFUl9PRl9ETFNfRU5UUlkJCQk0CiAKICNkZWZpbmUgUlRfUVVFUllfU0lHTkFMX0NPTlRFWFQJCQkJMHgwNDAyCi0jZGVmaW5lIFJUX1NFVF9JQVBQX1BJRCAgICAgICAgICAgICAgICAgCTB4MDQwNAorI2RlZmluZSBSVF9TRVRfSUFQUF9QSUQJCQkJMHgwNDA0CiAjZGVmaW5lIFJUX1NFVF9BUERfUElECQkJCQkJMHgwNDA1CiAjZGVmaW5lIFJUX1NFVF9ERUxfTUFDX0VOVFJZCQkJCTB4MDQwNgogI2RlZmluZSBSVF9RVUVSWV9FVkVOVF9UQUJMRQkJCTB4MDQwNwpAQCAtNjEwLDcgKzYxMSw3IEBACiAKIHN0cnVjdCBydF84MDJfMTFfZXZlbnRfdGFibGUgewogCXVuc2lnbmVkIGxvbmcgTnVtOwotCXVuc2lnbmVkIGxvbmcgUnN2OwkJLyogdG8gYWxpZ24gTG9nW10gYXQgTEFSR0VfSU5FR0VSIGJvdW5kYXJ5ICovCisJdW5zaWduZWQgbG9uZyBSc3Y7CQkvKiB0byBhbGlnbiBMb2dbXSBhdCBMQVJHRV9JTlRFR0VSIGJvdW5kYXJ5ICovCiAJc3RydWN0IHJ0XzgwMl8xMV9ldmVudF9sb2cgTG9nW01BWF9OVU1CRVJfT0ZfRVZFTlRdOwogfTsKIApAQCAtNzIxLDkgKzcyMiw5IEBACiAjZGVmaW5lCUFVVEhfRkFJTAkJCQkweDQJLyogT3BlbiBhdXRoZW50aWNhdGlvbiBmYWlsICovCiAjZGVmaW5lCUFVVEhfRkFJTF9LRVlTCQkJMHg1CS8qIFNoYXJlZCBhdXRoZW50aWNhdGlvbiBmYWlsICovCiAjZGVmaW5lCUFTU09DX0ZBSUwJCQkJMHg2CS8qIEFzc29jaWF0aW9uIGZhaWxlZCAqLwotI2RlZmluZQlFQVBfTUlDX0ZBSUxVUkUJCQkweDcJLyogRGVhdXRoZW5jYXRpb24gYmVjYXVzZSBNSUMgZmFpbHVyZSAqLwotI2RlZmluZQlFQVBfNFdBWV9USU1FT1VUCQkweDgJLyogRGVhdXRoZW5jYXRpb24gb24gNC13YXkgaGFuZHNoYWtlIHRpbWVvdXQgKi8KLSNkZWZpbmUJRUFQX0dST1VQX0tFWV9USU1FT1VUCTB4OQkvKiBEZWF1dGhlbmNhdGlvbiBvbiBncm91cCBrZXkgaGFuZHNoYWtlIHRpbWVvdXQgKi8KKyNkZWZpbmUJRUFQX01JQ19GQUlMVVJFCQkJMHg3CS8qIERlYXV0aGVudGljYXRpb24gYmVjYXVzZSBNSUMgZmFpbHVyZSAqLworI2RlZmluZQlFQVBfNFdBWV9USU1FT1VUCQkweDgJLyogRGVhdXRoZW50aWNhdGlvbiBvbiA0LXdheSBoYW5kc2hha2UgdGltZW91dCAqLworI2RlZmluZQlFQVBfR1JPVVBfS0VZX1RJTUVPVVQJMHg5CS8qIERlYXV0aGVudGljYXRpb24gb24gZ3JvdXAga2V5IGhhbmRzaGFrZSB0aW1lb3V0ICovCiAjZGVmaW5lCUVBUF9TVUNDRVNTCQkJCTB4YQkvKiBFQVAgc3VjY2VlZCAqLwogI2RlZmluZQlERVRFQ1RfUkFEQVJfU0lHTkFMCQkweGIJLyogUmFkYXIgc2lnbmFsIG9jY3VyIGluIGN1cnJlbnQgY2hhbm5lbCAqLwogI2RlZmluZSBFWFRSQV9JTkZPX01BWAkJCTB4YgkvKiBJbmRpY2F0ZSBMYXN0IE9JRCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9wY2lfbWFpbl9kZXYuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcGNpX21haW5fZGV2LmMKaW5kZXggMzIxZmFjZC4uMjVmYmIxOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9wY2lfbWFpbl9kZXYuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3BjaV9tYWluX2Rldi5jCkBAIC0zMSw3ICszMSw4IEBACiAgICAgQ3JlYXRlIGFuZCByZWdpc3RlciBuZXR3b3JrIGludGVyZmFjZSBmb3IgUENJIGJhc2VkIGNoaXBzZXRzIGluIExpbnV4IHBsYXRmb3JtLgogCiAgICAgUmV2aXNpb24gSGlzdG9yeToKLSAgICBXaG8gICAgICAgICBXaGVuICAgICAgICAgICAgV2hhdAorICAgIFdobyAgICAgICAgIAlXaGVuICAgICAgICAgICAgV2hhdAorICAgIEp1c3RpbiBQLiBNYXR0b2NrCTExLzA3LzIwMTAJRml4IHR5cG9zIGluIHNvbWUgY29tbWVudHMKICAgICAtLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKi8KIApAQCAtNDAsOCArNDEsOCBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KIAogLyogRm9sbG93aW5nIGluZm9ybWF0aW9uIHdpbGwgYmUgc2hvdyB3aGVuIHlvdSBydW4gJ21vZGluZm8nICovCi0vKiAqKiogSWYgeW91IGhhdmUgYSBzb2x1dGlvbiBmb3IgdGhlIGJ1ZyBpbiBjdXJyZW50IHZlcnNpb24gb2YgZHJpdmVyLCBwbGVhc2UgbWFpbCB0byBtZS4gKi8KLS8qIE90aGVyd2lzZSBwb3N0IHRvIGZvcnVtIGluIHJhbGlua3RlY2gncyB3ZWIgc2l0ZSh3d3cucmFsaW5rdGVjaC5jb20pIGFuZCBsZXQgYWxsIHVzZXJzIGhlbHAgeW91LiAqKiogKi8KKy8qIElmIHlvdSBoYXZlIGEgc29sdXRpb24gZm9yIGEgYnVnIGluIGN1cnJlbnQgdmVyc2lvbiBvZiBkcml2ZXIsIHBsZWFzZSBlLW1haWwgbWUuICovCisvKiBPdGhlcndpc2UgcG9zdCB0byBmb3J1bSBpbiByYWxpbmt0ZWNoJ3Mgd2ViIHNpdGUod3d3LnJhbGlua3RlY2guY29tKSBhbmQgbGV0IGFsbCB1c2VycyBoZWxwIHlvdS4gKi8KIE1PRFVMRV9BVVRIT1IoIkpldHQgQ2hlbiA8amV0dF9jaGVuQHJhbGlua3RlY2guY29tPiIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJSVDI4NjAvUlQzMDkwIFdpcmVsZXNzIExhbiBMaW51eCBEcml2ZXIiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKQEAgLTUwLDkgKzUxLDYgQEAKIC8qICovCiAvKiBGdW5jdGlvbiBkZWNsYXJhdGlvbnMgKi8KIC8qICovCi1leHRlcm4gaW50IHJ0Mjh4eF9jbG9zZShJTiBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2Rldik7Ci1leHRlcm4gaW50IHJ0Mjh4eF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2KTsKLQogc3RhdGljIHZvaWQgX19kZXZleGl0IHJ0Mjg2MF9yZW1vdmVfb25lKHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2KTsKIHN0YXRpYyBpbnQgX19kZXZpbml0IHJ0Mjg2MF9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldiwKIAkJCQkgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpOwpAQCAtMjA1LDcgKzIwMyw3IEBACiAKIAkvKiBpbml0aWFsaXplIGRldmljZSBiZWZvcmUgaXQncyB1c2VkIGJ5IGEgZHJpdmVyICovCiAJaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBjaV9kZXYpKSB7Ci0JCXByaW50aygicGNpIGVuYWJsZSBmYWlsIVxuIik7CisJCXByaW50ayhLRVJOX0VSUiAicnQyODYwOiBwY2kgZW5hYmxlIGZhaWwhXG4iKTsKIAkJcmV0dXJuIDA7CiAJfQogCkBAIC01OTksNyArNTk3LDcgQEAKIAkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLAogCQkJICAgICAoIiBBVVhfQ1RSTCA9IDB4JTMyeFxuIiwgTWFjVmFsdWUpKTsKIAotCQkvKiBmb3IgUlQzMHh4IEYgYW5kIGFmdGVyLCBQQ0llIGluZnRlcmZhY2UsIGFuZCBmb3IgcG93ZXIgc29sdXRpb24gMyAqLworCQkvKiBmb3IgUlQzMHh4IEYgYW5kIGFmdGVyLCBQQ0llIGludGVyZmFjZSwgYW5kIGZvciBwb3dlciBzb2x1dGlvbiAzICovCiAJCWlmICgoSVNfVkVSU0lPTl9BRlRFUl9GKHBBZCkpCiAJCSAgICAmJiAocEFkLT5TdGFDZmcuUFNDb250cm9sLmZpZWxkLnJ0MzB4eFBvd2VyTW9kZSA+PSAyKQogCQkgICAgJiYgKHBBZC0+U3RhQ2ZnLlBTQ29udHJvbC5maWVsZC5ydDMweHhQb3dlck1vZGUgPD0gMykpIHsKQEAgLTkwMiw3ICs5MDAsNyBAQAogCQkJCSAgQ29uZmlndXJhdGlvbik7CiAJCWlmICgoQ29uZmlndXJhdGlvbiAhPSAwKSAmJiAoQ29uZmlndXJhdGlvbiAhPSAweEZGRkYpKSB7CiAJCQlDb25maWd1cmF0aW9uICY9IDB4ZmVmYzsKLQkJCS8qIElmIGNhbGwgZnJvbSBpbnRlcmZhY2UgZG93biwgcmVzdG9yZSB0byBvcmdpbmlhbCBzZXR0aW5nLiAqLworCQkJLyogSWYgY2FsbCBmcm9tIGludGVyZmFjZSBkb3duLCByZXN0b3JlIHRvIG9yaWdpbmFsIHNldHRpbmcuICovCiAJCQlpZiAoTGV2ZWwgPT0gUkVTVE9SRV9DTE9TRSkKIAkJCQlDb25maWd1cmF0aW9uIHw9IHBBZC0+SG9zdExua0N0cmxDb25maWd1cmF0aW9uOwogCQkJZWxzZQpAQCAtOTI0LDcgKzkyMiw3IEBACiAJCQkJICBDb25maWd1cmF0aW9uKTsKIAkJaWYgKChDb25maWd1cmF0aW9uICE9IDApICYmIChDb25maWd1cmF0aW9uICE9IDB4RkZGRikpIHsKIAkJCUNvbmZpZ3VyYXRpb24gJj0gMHhmZWZjOwotCQkJLyogSWYgY2FsbCBmcm9tIGludGVyZmFjZSBkb3duLCByZXN0b3JlIHRvIG9yZ2luaWFsIHNldHRpbmcuICovCisJCQkvKiBJZiBjYWxsIGZyb20gaW50ZXJmYWNlIGRvd24sIHJlc3RvcmUgdG8gb3JpZ2luYWwgc2V0dGluZy4gKi8KIAkJCWlmIChMZXZlbCA9PSBSRVNUT1JFX0NMT1NFKQogCQkJCUNvbmZpZ3VyYXRpb24gfD0gcEFkLT5STG5rQ3RybENvbmZpZ3VyYXRpb247CiAJCQllbHNlCkBAIC0xMTA2LDEyICsxMTA0LDEyIEBACiAJCWlmIChwb3MgIT0gMCkKIAkJCXBBZC0+SG9zdExua0N0cmxPZmZzZXQgPSBwb3MgKyBQQ0lfRVhQX0xOS0NUTDsKIAotCQkvKiBJZiBjb25maWd1cmFyZWQgdG8gdHVybiBvbiBMMS4gKi8KKwkJLyogSWYgY29uZmlndXJlZCB0byB0dXJuIG9uIEwxLiAqLwogCQlIb3N0Q29uZmlndXJhdGlvbiA9IDA7CiAJCWlmIChwQWQtPlN0YUNmZy5QU0NvbnRyb2wuZmllbGQucnQzMHh4Rm9yY2VBU1BNVGVzdCA9PSAxKSB7CiAJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJFbnRlcixQU00gOiBGb3JjZSBBU1BNXG4iKSk7CiAKLQkJCS8qIFNraXAgbm9uLWV4aXN0IGRlaWNlIHJpZ2h0IGF3YXkgKi8KKwkJCS8qIFNraXAgbm9uLWV4aXN0IGRldmljZSByaWdodCBhd2F5ICovCiAJCQlpZiAoKHBBZC0+SG9zdExua0N0cmxPZmZzZXQgIT0gMCkpIHsKIAkJCQlQQ0lfUkVHX1JFQURfV09SRChwT2JqLT5wYXJlbnRfcGNpX2RldiwKIAkJCQkJCSAgcEFkLT5Ib3N0TG5rQ3RybE9mZnNldCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnRfbGludXguYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnRfbGludXguYwppbmRleCBhYmZlZWExLi43Mjg4NjRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0X2xpbnV4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydF9saW51eC5jCkBAIC0zMjEsNyArMzIxLDcgQEAKIAogCVJUTVBfU0VUX1BBQ0tFVF9TT1VSQ0UoT1NQS1RfVE9fUlRQS1QocGt0KSwgUEtUU1JDX05ESVMpOwogCi0JcHJpbnRrKCIjIyNDbG9uZSMjI1xuIik7CisJcHJpbnRrKEtFUk5fREVCVUcgIiMjI0Nsb25lIyMjXG4iKTsKIAogCXJldHVybiBORElTX1NUQVRVU19TVUNDRVNTOwogfQpAQCAtMzQzLDkgKzM0Myw4IEBACiAJCQkJCSAgIFJUTVBfUEtUX1RBSUxfUEFERElORyk7CiAJaWYgKHBQYWNrZXQgPT0gTlVMTCkgewogCQkqcHBQYWNrZXQgPSBOVUxMOwotI2lmZGVmIERFQlVHCi0JCXByaW50aygiUlRNUEFsbG9jYXRlTmRpc1BhY2tldCBGYWlsXG4iKTsKLSNlbmRpZgorCQlwcl9kZXZlbCgiUlRNUEFsbG9jYXRlTmRpc1BhY2tldCBGYWlsXG4iKTsKKwogCQlyZXR1cm4gTkRJU19TVEFUVVNfRkFJTFVSRTsKIAl9CiAJLyogMi4gY2xvbmUgdGhlIGZyYW1lIGNvbnRlbnQgKi8KQEAgLTYwMSwxNSArNjAwLDE1IEBACiAJCXJldHVybjsKIAogCXB0ID0gcFNyY0J1ZlZBOwotCXByaW50aygiJXM6ICVwLCBsZW4gPSAlZFxuIiwgc3RyLCBwU3JjQnVmVkEsIFNyY0J1Zkxlbik7CisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAlcCwgbGVuID0gJWRcbiIsIHN0ciwgcFNyY0J1ZlZBLCBTcmNCdWZMZW4pOwogCWZvciAoeCA9IDA7IHggPCBTcmNCdWZMZW47IHgrKykgewogCQlpZiAoeCAlIDE2ID09IDApCi0JCQlwcmludGsoIjB4JTA0eCA6ICIsIHgpOwotCQlwcmludGsoIiUwMnggIiwgKCh1bnNpZ25lZCBjaGFyKXB0W3hdKSk7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiMHglMDR4IDogIiwgeCk7CisJCXByaW50ayhLRVJOX0RFQlVHICIlMDJ4ICIsICgodW5zaWduZWQgY2hhcilwdFt4XSkpOwogCQlpZiAoeCAlIDE2ID09IDE1KQotCQkJcHJpbnRrKCJcbiIpOworCQkJcHJpbnRrKEtFUk5fREVCVUcgIlxuIik7CiAJfQotCXByaW50aygiXG4iKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiXG4iKTsKIH0KIAogLyoKQEAgLTc2NywxMyArNzY2LDEzIEBACiAJCS8qIFFPUyAqLwogCQlpZiAocFJ4QmxrLT5wSGVhZGVyLT5GQy5TdWJUeXBlICYgMHgwOCkgewogCQkJaGVhZGVyX2xlbiArPSAyOwotCQkJLyogRGF0YSBza2lwIFFPUyBjb250b3JsIGZpZWxkICovCisJCQkvKiBEYXRhIHNraXAgUU9TIGNvbnRyb2wgZmllbGQgKi8KIAkJCXBSeEJsay0+RGF0YVNpemUgLT0gMjsKIAkJfQogCQkvKiBPcmRlciBiaXQ6IEEtUmFsaW5rIG9yIEhUQysgKi8KIAkJaWYgKHBSeEJsay0+cEhlYWRlci0+RkMuT3JkZXIpIHsKIAkJCWhlYWRlcl9sZW4gKz0gNDsKLQkJCS8qIERhdGEgc2tpcCBIVEMgY29udG9ybCBmaWVsZCAqLworCQkJLyogRGF0YSBza2lwIEhUQyBjb250cm9sIGZpZWxkICovCiAJCQlwUnhCbGstPkRhdGFTaXplIC09IDQ7CiAJCX0KIAkJLyogQ29weSBIZWFkZXIgKi8KQEAgLTg1NCw3ICs4NTMsNyBAQAogCQkJCQkJCQkJIFJTU0kxLAogCQkJCQkJCQkJIFJTU0lfMSksCiAJCQkJICAgIENvbnZlcnRUb1Jzc2kocEFkLCBwUnhCbGstPnBSeFdJLT5SU1NJMiwKLQkJCQkJCSAgUlNTSV8yKSk7OworCQkJCQkJICBSU1NJXzIpKTsKIAogCXBoLT5zaWduYWwuZGlkID0gRElEbXNnX2xueGluZF93bGFuc25pZmZybV9zaWduYWw7CiAJcGgtPnNpZ25hbC5zdGF0dXMgPSAwOwpAQCAtOTI2LDcgKzkyNSw3IEBACiAJCSAgICByZXF1ZXN0X2lycShfcE9iai0+cGNpX2Rldi0+aXJxLCBydDI4NjBfaW50ZXJydXB0LCBTQV9TSElSUSwKIAkJCQkobmV0X2RldiktPm5hbWUsIChuZXRfZGV2KSk7CiAJCWlmIChyZXR2YWwgIT0gMCkKLQkJCXByaW50aygiUlQyODYwOiByZXF1ZXN0X2lycSAgRVJST1IoJWQpXG4iLCByZXR2YWwpOworCQkJcHJpbnRrKEtFUk5fRVJSICJydDI4NjA6IHJlcXVlc3RfaXJxICBFUlJPUiglZClcbiIsIHJldHZhbCk7CiAJfQogCiAJcmV0dXJuIHJldHZhbDsKQEAgLTEwMjIsNyArMTAyMSw3IEBACiAJfQogI2Vsc2UKIAlDSEVDS19QSURfTEVHQUxJVFkocFRhc2stPnRhc2tQSUQpIHsKLQkJcHJpbnRrKCJUZXJtaW5hdGUgdGhlIHRhc2soJXMpIHdpdGggcGlkKCVkKSFcbiIsCisJCXByaW50ayhLRVJOX0lORk8gIlRlcm1pbmF0ZSB0aGUgdGFzayglcykgd2l0aCBwaWQoJWQpIVxuIiwKIAkJICAgICAgIHBUYXNrLT50YXNrTmFtZSwgR0VUX1BJRF9OVU1CRVIocFRhc2stPnRhc2tQSUQpKTsKIAkJbWIoKTsKIAkJcFRhc2stPnRhc2tfa2lsbGVkID0gMTsKQEAgLTExNzUsNyArMTE3NCw3IEBACiAJbmV0X2RldiA9IHBOZXREZXY7CiAJR0VUX1BBRF9GUk9NX05FVF9ERVYocEFkLCBuZXRfZGV2KTsKIAotCS8qIHdvcmstYXJvdW5kIGZvciB0aGUgU3VTRSBkdWUgdG8gaXQgaGFzIGl0J3Mgb3duIGludGVyZmFjZSBuYW1lIG1hbmFnZW1lbnQgc3lzdGVtLiAqLworCS8qIHdvcmstYXJvdW5kIGZvciBTdVNFLCBkdWUgdG8gdGhlbSBoYXZpbmcgdGhlaXIgb3duIGludGVyZmFjZSBuYW1lIG1hbmFnZW1lbnQgc3lzdGVtLiAqLwogCXsKIAkJTmRpc1plcm9NZW1vcnkocEFkLT5TdGFDZmcuZGV2X25hbWUsIDE2KTsKIAkJTmRpc01vdmVNZW1vcnkocEFkLT5TdGFDZmcuZGV2X25hbWUsIG5ldF9kZXYtPm5hbWUsCkBAIC0xMzAwLDcgKzEyOTksNyBAQAogCWludCByZXQsIHJ0bmxfbG9ja2VkID0gRkFMU0U7CiAKIAlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSdG1wT1NOZXREZXZBdHRhY2goKS0tLT5cbiIpKTsKLQkvKiBJZiB3ZSBuZWVkIGhvb2sgc29tZSBjYWxsYmFjayBmdW5jdGlvbiB0byB0aGUgbmV0IGRldmljZSBzdHJ1Y3RydWUsIG5vdyBkbyBpdC4gKi8KKwkvKiBJZiB3ZSBuZWVkIGhvb2sgc29tZSBjYWxsYmFjayBmdW5jdGlvbiB0byB0aGUgbmV0IGRldmljZSBzdHJ1Y3R1cmUsIG5vdyBkbyBpdC4gKi8KIAlpZiAocERldk9wSG9vaykgewogCQlzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQgPSBOVUxMOwogCkBAIC0xMzUxLDEwICsxMzUwLDEwIEBACiAJCXJldHVybiBOVUxMOwogCX0KIAotCS8qIGZpbmQgYSBhdmFpbGFibGUgaW50ZXJmYWNlIG5hbWUsIG1heCAzMiBpbnRlcmZhY2VzICovCisJLyogZmluZCBhbiBhdmFpbGFibGUgaW50ZXJmYWNlIG5hbWUsIG1heCAzMiBpbnRlcmZhY2VzICovCiAJc3RhdHVzID0gUnRtcE9TTmV0RGV2UmVxdWVzdE5hbWUocEFkLCBwTmV0RGV2LCBwTmFtZVByZWZpeCwgZGV2TnVtKTsKIAlpZiAoc3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpIHsKLQkJLyogZXJyb3IhIG5vIGFueSBhdmFpbGFibGUgcmEgbmFtZSBjYW4gYmUgdXNlZCEgKi8KKwkJLyogZXJyb3IhIG5vIGF2YWlsYWJsZSByYSBuYW1lIGNhbiBiZSB1c2VkISAqLwogCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKIAkJCSAoIkFzc2lnbiBpbnRlcmZhY2UgbmFtZSAoJXMgd2l0aCBzdWZmaXggMH4zMikgZmFpbGVkLi4uXG4iLAogCQkJICBwTmFtZVByZWZpeCkpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydF9saW51eC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydF9saW51eC5oCmluZGV4IDVhY2VkZjEuLjkyZmY1NDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnRfbGludXguaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0X2xpbnV4LmgKQEAgLTMwLDcgKzMwLDggQEAKICAgICBBYnN0cmFjdDoKIAogICAgIFJldmlzaW9uIEhpc3Rvcnk6Ci0gICAgV2hvICAgICAgICAgIFdoZW4gICAgICAgICAgV2hhdAorICAgIFdobyAgICAgICAgICAJV2hlbiAgICAgICAgIAlXaGF0CisgICAgSnVzdGluIFAuIE1hdHRvY2sJMTEvMDcvMjAxMCAJRml4IHR5cG8gaW4gYSBjb21tZW50CiAgICAgLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKi8KIApAQCAtNDIyLDExICs0MjMsNyBAQAogCiAjZGVmaW5lIERCR1BSSU5UKExldmVsLCBGbXQpICAgIERCR1BSSU5UX1JBVyhMZXZlbCwgRm10KQogCi0jZGVmaW5lIERCR1BSSU5UX0VSUihGbXQpICAgICAgICAgICBcCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgcHJpbnRrKCJFUlJPUiEgIik7ICAgICAgICAgIFwKLSAgICBwcmludGsgRm10OyAgICAgICAgICAgICAgICAgIFwKLX0KKyNkZWZpbmUgREJHUFJJTlRfRVJSKGZtdCwgYXJncy4uLikgcHJpbnRrKEtFUk5fRVJSIGZtdCwgIyNhcmdzKQogCiAjZGVmaW5lIERCR1BSSU5UX1MoU3RhdHVzLCBGbXQpCQlcCiB7CQkJCQkJCQkJXApAQCAtNzI2LDcgKzcyMyw3IEBACiAjZGVmaW5lIFJUTVBfR0VUX1BBQ0tFVF9NT1JFREFUQShfcCkJCQkJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzddKQogCiAvKiAqLwotLyogICAgICBTZXBjaWZpYyBQYWtjZXQgVHlwZSBkZWZpbml0aW9uICovCisvKiAgICAgIFNwZWNpZmljIFBhY2tldCBUeXBlIGRlZmluaXRpb24gKi8KIC8qICovCiAjZGVmaW5lIFJUTVBfUEFDS0VUX1NQRUNJRklDX0NCX09GRlNFVAkxMQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0X21haW5fZGV2LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0X21haW5fZGV2LmMKaW5kZXggYWQ2MGNlYS4uNzAxNTYxZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydF9tYWluX2Rldi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnRfbWFpbl9kZXYuYwpAQCAtMzEsNyArMzEsOCBAQAogICAgIENyZWF0ZSBhbmQgcmVnaXN0ZXIgbmV0d29yayBpbnRlcmZhY2UuCiAKICAgICBSZXZpc2lvbiBIaXN0b3J5OgotICAgIFdobyAgICAgICAgIFdoZW4gICAgICAgICAgICBXaGF0CisgICAgV2hvICAgICAgICAgCVdoZW4gICAgICAgICAgICBXaGF0CisgICAgSnVzdGluIFAuIE1hdHRvY2sJMTEvMDcvMjAxMAlGaXggdHlwb3MgaW4gY29tbWVudHMKICAgICAtLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKi8KIApAQCAtMTAxLDggKzEwMiw4IEBACiAJCSAgICAoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkpIHsKIAkJCXN0cnVjdCBydF9tbG1lX2Rpc2Fzc29jX3JlcSBEaXNSZXE7CiAJCQlzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpNc2dFbGVtID0KLQkJCSAgICAoc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqKWttYWxsb2Moc2l6ZW9mKHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0pLAotCQkJCQkJCU1FTV9BTExPQ19GTEFHKTsKKwkJCQlrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtKSwKKwkJCQkJTUVNX0FMTE9DX0ZMQUcpOwogCiAJCQlpZiAoTXNnRWxlbSkgewogCQkJCUNPUFlfTUFDX0FERFIoRGlzUmVxLkFkZHIsCkBAIC0yMzQsNyArMjM1LDcgQEAKIAkJUlRNUFBDSWVMaW5rQ3RybFZhbHVlUmVzdG9yZShwQWQsIFJFU1RPUkVfQ0xPU0UpOwogI2VuZGlmIC8qIFJUTVBfTUFDX1BDSSAvLyAqLwogCi0JCS8qIElmIGRpcnZlciBkb2Vzbid0IHdha2UgdXAgZmlybXdhcmUgaGVyZSwgKi8KKwkJLyogSWYgZHJpdmVyIGRvZXNuJ3Qgd2FrZSB1cCBmaXJtd2FyZSBoZXJlLCAqLwogCQkvKiBOSUNMb2FkRmlybXdhcmUgd2lsbCBoYW5nIGZvcmV2ZXIgd2hlbiBpbnRlcmZhY2UgaXMgdXAgYWdhaW4uICovCiAJCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0RPWkUpKSB7CiAJCQlBc2ljRm9yY2VXYWtldXAocEFkLCBUUlVFKTsKQEAgLTMxMCw4ICszMTEsOCBAQAogCQkJUlRNUF9BU0lDX0lOVEVSUlVQVF9ESVNBQkxFKHBBZCk7CiAJCX0KIAkJLyogUmVjZWl2ZSBwYWNrZXRzIHRvIGNsZWFyIERNQSBpbmRleCBhZnRlciBkaXNhYmxlIGludGVycnVwdC4gKi8KLQkJLypSVE1QSGFuZGxlUnhEb25lSW50ZXJydXB0KHBBZCk7ICovCi0JCS8qIHB1dCB0byByYWRpbyBvZmYgdG8gc2F2ZSBwb3dlciB3aGVuIGRyaXZlciB1bmxvYWQuICBBZnRlciByYWRpb29mZiwgY2FuJ3Qgd3JpdGUgL3JlYWQgcmVnaXN0ZXIuICBTbyBuZWVkIHRvIGZpbmlzaCBhbGwgKi8KKwkJLyogUlRNUEhhbmRsZVJ4RG9uZUludGVycnVwdChwQWQpOyAqLworCQkvKiBwdXQgcmFkaW8gb2ZmIHRvIHNhdmUgcG93ZXIgd2hlbiBkcml2ZXIgdW5sb2Fkcy4gIEFmdGVyIHJhZGlvb2ZmLCBjYW4ndCB3cml0ZS9yZWFkIHJlZ2lzdGVyLCBzbyBuZWVkIHRvIGZpbmlzaCBhbGwuICovCiAJCS8qIHJlZ2lzdGVyIGFjY2VzcyBiZWZvcmUgUmFkaW8gb2ZmLiAqLwogCiAJCWJyYyA9IFJUMjh4eFBjaUFzaWNSYWRpb09mZihwQWQsIFJUTVBfSEFMVCwgMCk7CkBAIC00MjAsNyArNDIxLDcgQEAKIAl7CiAJCXUzMiByZWcgPSAwOwogCQlSVE1QX0lPX1JFQUQzMihwQWQsIDB4MTMwMCwgJnJlZyk7CS8qIGNsZWFyIGdhcmJhZ2UgaW50ZXJydXB0cyAqLwotCQlwcmludGsoIjB4MTMwMCA9ICUwOHhcbiIsIHJlZyk7CisJCXByaW50ayhLRVJOX0RFQlVHICIweDEzMDAgPSAlMDh4XG4iLCByZWcpOwogCX0KIAogCXsKQEAgLTcyNCw3ICs3MjUsOCBAQAogaW50IEFkYXB0ZXJCbG9ja0FsbG9jYXRlTWVtb3J5KHZvaWQgKmhhbmRsZSwgdm9pZCAqKiBwcEFkKQogewogCi0JKnBwQWQgPSAodm9pZCAqKXZtYWxsb2Moc2l6ZW9mKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIpKTsJLypwY2lfYWxsb2NfY29uc2lzdGVudChwY2lfZGV2LCBzaXplb2Yoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciksIHBoeV9hZGRyKTsgKi8KKwkqcHBBZCA9IHZtYWxsb2Moc2l6ZW9mKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIpKTsKKwkvKiBwY2lfYWxsb2NfY29uc2lzdGVudChwY2lfZGV2LCBzaXplb2Yoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciksIHBoeV9hZGRyKTsgKi8KIAogCWlmICgqcHBBZCkgewogCQlOZGlzWmVyb01lbW9yeSgqcHBBZCwgc2l6ZW9mKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIpKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnRfcGNpX3JidXMuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnRfcGNpX3JidXMuYwppbmRleCAzMDA0YmU2Li5lNWZiNjdjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0X3BjaV9yYnVzLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydF9wY2lfcmJ1cy5jCkBAIC0zMSw3ICszMSw4IEBACiAgICAgQ3JlYXRlIGFuZCByZWdpc3RlciBuZXR3b3JrIGludGVyZmFjZS4KIAogICAgIFJldmlzaW9uIEhpc3Rvcnk6Ci0gICAgV2hvICAgICAgICAgV2hlbiAgICAgICAgICAgIFdoYXQKKyAgICBXaG8gICAgICAgICAJV2hlbiAgICAgICAgICAgIFdoYXQKKyAgICBKdXN0aW4gUC4gTWF0dG9jawkxMS8wNy8yMDEwCUZpeCBhIHR5cG8KICAgICAtLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKi8KIApAQCAtMzU2LDcgKzM1Nyw3IEBACiAKIAlSVE1QSGFuZGxlTWdtdFJpbmdEbWFEb25lSW50ZXJydXB0KHBBZCk7CiAKLQkvKiBpZiB5b3UgdXNlIFJUTVBfU0VNX0xPQ0ssIHNvbWV0aW1lcyBrZXJuZWwgd2lsbCBoYW5nIHVwLCBubyBhbnkgKi8KKwkvKiBpZiB5b3UgdXNlIFJUTVBfU0VNX0xPQ0ssIHNvbWV0aW1lcyBrZXJuZWwgd2lsbCBoYW5nIHVwLCB3aXRob3V0IGFueSAqLwogCS8qIGJ1ZyByZXBvcnQgb3V0cHV0ICovCiAJUlRNUF9JTlRfTE9DSygmcEFkLT5pcnFfbG9jaywgZmxhZ3MpOwogCS8qCkBAIC03ODcsNyArNzg4LDcgQEAKIH0KIAogLyoKLSAqIGludmFpbGQgb3Igd3JpdGViYWNrIGNhY2hlCisgKiBpbnZhbGlkIG9yIHdyaXRlYmFjayBjYWNoZQogICogYW5kIGNvbnZlcnQgdmlydHVhbCBhZGRyZXNzIHRvIHBoeXNpY2FsIGFkZHJlc3MKICAqLwogZG1hX2FkZHJfdCBsaW51eF9wY2lfbWFwX3NpbmdsZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHZvaWQgKnB0ciwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnRfdXNiLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0X3VzYi5jCmluZGV4IGJjZmMwZjUuLmViMDM3ZDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnRfdXNiLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydF91c2IuYwpAQCAtMzIsNyArMzIsOCBAQAogCVJldmlzaW9uIEhpc3Rvcnk6CiAJV2hvCQkJV2hlbgkJV2hhdAogCS0tLS0tLS0tCS0tLS0tLS0tLS0JLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCU5hbWUJCURhdGUJCU1vZGlmaWNhdGlvbiBsb2dzCisJTmFtZQkJCURhdGUJCU1vZGlmaWNhdGlvbiBsb2dzCisJSnVzdGluIFAuIE1hdHRvY2sJMTEvMDcvMjAxMAlGaXggc29tZSB0eXBvcy4KIAogKi8KIApAQCAtNDAsMjUgKzQxLDI1IEBACiAKIHZvaWQgZHVtcF91cmIoc3RydWN0IHVyYiAqcHVyYikKIHsKLQlwcmludGsoInVyYiAgICAgICAgICAgICAgICAgIDoweCUwOGx4XG4iLCAodW5zaWduZWQgbG9uZylwdXJiKTsKLQlwcmludGsoIlx0ZGV2ICAgICAgICAgICAgICAgICAgIDoweCUwOGx4XG4iLCAodW5zaWduZWQgbG9uZylwdXJiLT5kZXYpOwotCXByaW50aygiXHRcdGRldi0+c3RhdGUgICAgICAgICAgOjB4JWRcbiIsIHB1cmItPmRldi0+c3RhdGUpOwotCXByaW50aygiXHRwaXBlICAgICAgICAgICAgICAgICAgOjB4JTA4eFxuIiwgcHVyYi0+cGlwZSk7Ci0JcHJpbnRrKCJcdHN0YXR1cyAgICAgICAgICAgICAgICA6JWRcbiIsIHB1cmItPnN0YXR1cyk7Ci0JcHJpbnRrKCJcdHRyYW5zZmVyX2ZsYWdzICAgICAgICA6MHglMDh4XG4iLCBwdXJiLT50cmFuc2Zlcl9mbGFncyk7Ci0JcHJpbnRrKCJcdHRyYW5zZmVyX2J1ZmZlciAgICAgICA6MHglMDhseFxuIiwKKwlwcmludGsoS0VSTl9ERUJVRyAidXJiICAgICAgICAgICAgICAgICAgOjB4JTA4bHhcbiIsICh1bnNpZ25lZCBsb25nKXB1cmIpOworCXByaW50ayhLRVJOX0RFQlVHICJcdGRldiAgICAgICAgICAgICAgICAgICA6MHglMDhseFxuIiwgKHVuc2lnbmVkIGxvbmcpcHVyYi0+ZGV2KTsKKwlwcmludGsoS0VSTl9ERUJVRyAiXHRcdGRldi0+c3RhdGUgICAgICAgICAgOjB4JWRcbiIsIHB1cmItPmRldi0+c3RhdGUpOworCXByaW50ayhLRVJOX0RFQlVHICJcdHBpcGUgICAgICAgICAgICAgICAgICA6MHglMDh4XG4iLCBwdXJiLT5waXBlKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiXHRzdGF0dXMgICAgICAgICAgICAgICAgOiVkXG4iLCBwdXJiLT5zdGF0dXMpOworCXByaW50ayhLRVJOX0RFQlVHICJcdHRyYW5zZmVyX2ZsYWdzICAgICAgICA6MHglMDh4XG4iLCBwdXJiLT50cmFuc2Zlcl9mbGFncyk7CisJcHJpbnRrKEtFUk5fREVCVUcgIlx0dHJhbnNmZXJfYnVmZmVyICAgICAgIDoweCUwOGx4XG4iLAogCSAgICAgICAodW5zaWduZWQgbG9uZylwdXJiLT50cmFuc2Zlcl9idWZmZXIpOwotCXByaW50aygiXHR0cmFuc2Zlcl9idWZmZXJfbGVuZ3RoOiVkXG4iLCBwdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoKTsKLQlwcmludGsoIlx0YWN0dWFsX2xlbmd0aCAgICAgICAgIDolZFxuIiwgcHVyYi0+YWN0dWFsX2xlbmd0aCk7Ci0JcHJpbnRrKCJcdHNldHVwX3BhY2tldCAgICAgICAgICA6MHglMDhseFxuIiwKKwlwcmludGsoS0VSTl9ERUJVRyAiXHR0cmFuc2Zlcl9idWZmZXJfbGVuZ3RoOiVkXG4iLCBwdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiXHRhY3R1YWxfbGVuZ3RoICAgICAgICAgOiVkXG4iLCBwdXJiLT5hY3R1YWxfbGVuZ3RoKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiXHRzZXR1cF9wYWNrZXQgICAgICAgICAgOjB4JTA4bHhcbiIsCiAJICAgICAgICh1bnNpZ25lZCBsb25nKXB1cmItPnNldHVwX3BhY2tldCk7Ci0JcHJpbnRrKCJcdHN0YXJ0X2ZyYW1lICAgICAgICAgICA6JWRcbiIsIHB1cmItPnN0YXJ0X2ZyYW1lKTsKLQlwcmludGsoIlx0bnVtYmVyX29mX3BhY2tldHMgICAgIDolZFxuIiwgcHVyYi0+bnVtYmVyX29mX3BhY2tldHMpOwotCXByaW50aygiXHRpbnRlcnZhbCAgICAgICAgICAgICAgOiVkXG4iLCBwdXJiLT5pbnRlcnZhbCk7Ci0JcHJpbnRrKCJcdGVycm9yX2NvdW50ICAgICAgICAgICA6JWRcbiIsIHB1cmItPmVycm9yX2NvdW50KTsKLQlwcmludGsoIlx0Y29udGV4dCAgICAgICAgICAgICAgIDoweCUwOGx4XG4iLAorCXByaW50ayhLRVJOX0RFQlVHICJcdHN0YXJ0X2ZyYW1lICAgICAgICAgICA6JWRcbiIsIHB1cmItPnN0YXJ0X2ZyYW1lKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiXHRudW1iZXJfb2ZfcGFja2V0cyAgICAgOiVkXG4iLCBwdXJiLT5udW1iZXJfb2ZfcGFja2V0cyk7CisJcHJpbnRrKEtFUk5fREVCVUcgIlx0aW50ZXJ2YWwgICAgICAgICAgICAgIDolZFxuIiwgcHVyYi0+aW50ZXJ2YWwpOworCXByaW50ayhLRVJOX0RFQlVHICJcdGVycm9yX2NvdW50ICAgICAgICAgICA6JWRcbiIsIHB1cmItPmVycm9yX2NvdW50KTsKKwlwcmludGsoS0VSTl9ERUJVRyAiXHRjb250ZXh0ICAgICAgICAgICAgICAgOjB4JTA4bHhcbiIsCiAJICAgICAgICh1bnNpZ25lZCBsb25nKXB1cmItPmNvbnRleHQpOwotCXByaW50aygiXHRjb21wbGV0ZSAgICAgICAgICAgICAgOjB4JTA4bHhcblxuIiwKKwlwcmludGsoS0VSTl9ERUJVRyAiXHRjb21wbGV0ZSAgICAgICAgICAgICAgOjB4JTA4bHhcblxuIiwKIAkgICAgICAgKHVuc2lnbmVkIGxvbmcpcHVyYi0+Y29tcGxldGUpOwogfQogCkBAIC0yNzksNyArMjgwLDcgQEAKIAkgICAgJiYgIVJUVVNCX1RFU1RfQlVMS19GTEFHKHBBZCwKIAkJCQkgICAgIChmUlRVU0JfQlVMS19PVVRfREFUQV9GUkFHIDw8CiAJCQkJICAgICAgQnVsa091dFBpcGVJZCkpKSB7Ci0JCS8qIEluZGljYXRlIFRoZXJlIGlzIGRhdGEgYXZhbGlhYmxlICovCisJCS8qIEluZGljYXRlIFRoZXJlIGlzIGRhdGEgYXZhaWxhYmxlICovCiAJCVJUVVNCX1NFVF9CVUxLX0ZMQUcocEFkLAogCQkJCSAgICAoZlJUVVNCX0JVTEtfT1VUX0RBVEFfTk9STUFMIDw8CiAJCQkJICAgICBCdWxrT3V0UGlwZUlkKSk7CkBAIC0zMzUsNyArMzM2LDcgQEAKIAl9CiAKIAkvKiBBbHdheXMgY2FsbCBCdWxrIHJvdXRpbmUsIGV2ZW4gcmVzZXQgYnVsay4gKi8KLQkvKiBUaGUgcHJvdGVjdGlvb24gb2YgcmVzdCBidWxrIHNob3VsZCBiZSBpbiBCdWxrT3V0IHJvdXRpbmUgKi8KKwkvKiBUaGUgcHJvdGVjdGlvbiBvZiByZXN0IGJ1bGsgc2hvdWxkIGJlIGluIEJ1bGtPdXQgcm91dGluZSAqLwogCVJUVVNCS2lja0J1bGtPdXQocEFkKTsKIH0KIApAQCAtMzgzLDcgKzM4NCw3IEBACiAJUlRNUF9TRU1fVU5MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrW3BSVFNDb250ZXh0LT5CdWxrT3V0UGlwZUlkXSk7CiAKIAkvKiBBbHdheXMgY2FsbCBCdWxrIHJvdXRpbmUsIGV2ZW4gcmVzZXQgYnVsay4gKi8KLQkvKiBUaGUgcHJvdGVjdGlvb24gb2YgcmVzdCBidWxrIHNob3VsZCBiZSBpbiBCdWxrT3V0IHJvdXRpbmUgKi8KKwkvKiBUaGUgcHJvdGVjdGlvbiBvZiByZXN0IGJ1bGsgc2hvdWxkIGJlIGluIEJ1bGtPdXQgcm91dGluZSAqLwogCVJUVVNCS2lja0J1bGtPdXQocEFkKTsKIAogfQpAQCAtNDI3LDcgKzQyOCw3IEBACiAJUlRNUF9TRU1fVU5MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrWzBdKTsKIAogCS8qIEFsd2F5cyBjYWxsIEJ1bGsgcm91dGluZSwgZXZlbiByZXNldCBidWxrLiAqLwotCS8qIFRoZSBwcm90ZWN0aW9vbiBvZiByZXN0IGJ1bGsgc2hvdWxkIGJlIGluIEJ1bGtPdXQgcm91dGluZSAqLworCS8qIFRoZSBwcm90ZWN0aW9uIG9mIHJlc3QgYnVsayBzaG91bGQgYmUgaW4gQnVsa091dCByb3V0aW5lICovCiAJUlRVU0JLaWNrQnVsa091dChwQWQpOwogCiB9CkBAIC01NzUsNyArNTc2LDcgQEAKIAkJfSBlbHNlIHsKIAogCQkJLyogQWx3YXlzIGNhbGwgQnVsayByb3V0aW5lLCBldmVuIHJlc2V0IGJ1bGsuICovCi0JCQkvKiBUaGUgcHJvdGVjdGlvb24gb2YgcmVzdCBidWxrIHNob3VsZCBiZSBpbiBCdWxrT3V0IHJvdXRpbmUgKi8KKwkJCS8qIFRoZSBwcm90ZWN0aW9uIG9mIHJlc3QgYnVsayBzaG91bGQgYmUgaW4gQnVsa091dCByb3V0aW5lICovCiAJCQlpZiAocEFkLT5NZ210UmluZy5UeFN3RnJlZUlkeCA8CiAJCQkgICAgTUdNVF9SSU5HX1NJWkUKIAkJCSAgICAvKiBwTUxNRUNvbnRleHQtPmJXYWl0aW5nQnVsa091dCA9PSBUUlVFICovKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0bXAuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnRtcC5oCmluZGV4IGNhNTRlNTMuLjcwZGFhYTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnRtcC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnRtcC5oCkBAIC0zMSwxMSArMzEsMTIgQEAKICAgICBNaW5pcG9ydCBnZW5lcmljIHBvcnRpb24gaGVhZGVyIGZpbGUKIAogICAgIFJldmlzaW9uIEhpc3Rvcnk6Ci0gICAgV2hvICAgICAgICAgV2hlbiAgICAgICAgICBXaGF0CisgICAgV2hvICAgICAgICAgCVdoZW4gICAgICAgICAgCVdoYXQKICAgICAtLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBQYXVsIExpbiAgICAyMDAyLTA4LTAxICAgIGNyZWF0ZWQKLSAgICBKYW1lcyBUYW4gICAyMDAyLTA5LTA2ICAgIG1vZGlmaWVkIChSZXZpc2UgTlRDUmVnVGFibGUpCi0gICAgSm9obiBDaGFuZyAgMjAwNC0wOS0wNiAgICBtb2RpZmllZCBmb3IgUlQyNjAwCisgICAgUGF1bCBMaW4gICAgCTIwMDItMDgtMDEgICAgCWNyZWF0ZWQKKyAgICBKYW1lcyBUYW4gICAJMjAwMi0wOS0wNiAgICAJbW9kaWZpZWQgKFJldmlzZSBOVENSZWdUYWJsZSkKKyAgICBKb2huIENoYW5nICAJMjAwNC0wOS0wNiAgICAJbW9kaWZpZWQgZm9yIFJUMjYwMAorICAgIEp1c3RpbiBQLiBNYXR0b2NrCTExLzA3LzIwMTAJRml4IHNvbWUgdHlwb3MKICovCiAjaWZuZGVmIF9fUlRNUF9IX18KICNkZWZpbmUgX19SVE1QX0hfXwpAQCAtMzM3LDcgKzMzOCw3IEBACiAjZGVmaW5lIExFQVBfT04oX3ApICAgICAgICAgICAgICAgICAoKChfcCktPlN0YUNmZy5MZWFwQXV0aE1vZGUpID09IENJU0NPX0F1dGhNb2RlTEVBUCkKICNkZWZpbmUgTEVBUF9DQ0tNX09OKF9wKSAgICAgICAgICAgICgoKChfcCktPlN0YUNmZy5MZWFwQXV0aE1vZGUpID09IENJU0NPX0F1dGhNb2RlTEVBUCkgJiYgKChfcCktPlN0YUNmZy5MZWFwQXV0aEluZm8uQ0NLTSA9PSBUUlVFKSkKIAotLyogaWYgb3JnaW5hbCBFdGhlcm5ldCBmcmFtZSBjb250YWlucyBubyBMTEMvU05BUCwgdGhlbiBhbiBleHRyYSBMTEMvU05BUCBlbmNhcCBpcyByZXF1aXJlZCAqLworLyogaWYgb3JpZ2luYWwgRXRoZXJuZXQgZnJhbWUgY29udGFpbnMgbm8gTExDL1NOQVAsIHRoZW4gYW4gZXh0cmEgTExDL1NOQVAgZW5jYXAgaXMgcmVxdWlyZWQgKi8KICNkZWZpbmUgRVhUUkFfTExDU05BUF9FTkNBUF9GUk9NX1BLVF9TVEFSVChfcEJ1ZlZBLCBfcEV4dHJhTGxjU25hcEVuY2FwKQkJXAogewkJCQkJCQkJCQkJCQkJCQlcCiAJaWYgKCgoKihfcEJ1ZlZBICsgMTIpIDw8IDgpICsgKihfcEJ1ZlZBICsgMTMpKSA+IDE1MDApIHsJXApAQCAtNDY2LDcgKzQ2Nyw3IEBACiAvKiBDb250cm9sIGJsb2NrIChEZXNjcmlwdG9yKSBmb3IgYWxsIHJpbmcgZGVzY3JpcHRvciBETUEgb3BlcmF0aW9uLCBidWZmZXIgbXVzdCBiZSAqLwogLyogY29udGlndW91cyBwaHlzaWNhbCBtZW1vcnkuIGNoYXIgc3RvcmVkIHRoZSBiaW5kaW5nIFJ4IHBhY2tldCBkZXNjcmlwdG9yICovCiAvKiB3aGljaCB3b24ndCBiZSByZWxlYXNlZCwgZHJpdmVyIGhhcyB0byB3YWl0IHVudGlsIHVwcGVyIGxheWVyIHJldHVybiB0aGUgcGFja2V0ICovCi0vKiBiZWZvcmUgZ2l2ZWluZyB1cCB0aGlzIHJ4IHJpbmcgZGVzY3JpcHRvciB0byBBU0lDLiBORElTX0JVRkZFUiBpcyBhc3NvY2FpdGVkIHBhaXIgKi8KKy8qIGJlZm9yZSBnaXZpbmcgdXAgdGhpcyByeCByaW5nIGRlc2NyaXB0b3IgdG8gQVNJQy4gTkRJU19CVUZGRVIgaXMgYXNzb2NpYXRlZCBwYWlyICovCiAvKiB0byBkZXNjcmliZSB0aGUgcGFja2V0IGJ1ZmZlci4gRm9yIFR4LCBjaGFyIHN0b3JlZCB0aGUgdHggcGFja2V0IGRlc2NyaXB0b3IgKi8KIC8qIHdoaWNoIGRyaXZlciBzaG91bGQgQUNLIHVwcGVyIGxheWVyIHdoZW4gdGhlIHR4IGlzIHBoeXNpY2FsbHkgZG9uZSBvciBmYWlsZWQuICovCiAvKiAqLwpAQCAtNjAyLDcgKzYwMyw3IEBACiB9OwogCiBzdHJ1Y3QgcnRfY291bnRlcl9kcnMgewotCS8qIHRvIHJlY29yZCB0aGUgZWFjaCBUWCByYXRlJ3MgcXVhbGl0eS4gMCBpcyBiZXN0LCB0aGUgYmlnZ2VyIHRoZSB3b3JzZS4gKi8KKwkvKiByZWNvcmQgZWFjaCBUWCByYXRlJ3MgcXVhbGl0eS4gMCBpcyBiZXN0LCB0aGUgYmlnZ2VyIHRoZSB3b3JzZS4gKi8KIAl1MTYgVHhRdWFsaXR5W01BWF9TVEVQX09GX1RYX1JBVEVfU1dJVENIXTsKIAl1OCBQRVJbTUFYX1NURVBfT0ZfVFhfUkFURV9TV0lUQ0hdOwogCXU4IFR4UmF0ZVVwUGVuYWx0eTsJLyogZXh0cmEgIyBvZiBzZWNvbmQgcGVuYWx0eSBkdWUgdG8gbGFzdCB1bnN0YWJsZSBjb25kaXRpb24gKi8KQEAgLTcxOSw3ICs3MjAsNyBAQAogLyogUGFja2V0IGluZm9ybWF0aW9uIGZvciBOZGlzUXVlcnlQYWNrZXQgKi8KIC8qICovCiBzdHJ1Y3QgcnRfcGFja2V0X2luZm8gewotCXUzMiBQaHlzaWNhbEJ1ZmZlckNvdW50OwkvKiBQaHlzaWNhbCBicmVha3Mgb2YgYnVmZmVyIGRlc2NyaXBvciBjaGFpbmVkICovCisJdTMyIFBoeXNpY2FsQnVmZmVyQ291bnQ7CS8qIFBoeXNpY2FsIGJyZWFrcyBvZiBidWZmZXIgZGVzY3JpcHRvciBjaGFpbmVkICovCiAJdTMyIEJ1ZmZlckNvdW50OwkvKiBOdW1iZXIgb2YgQnVmZmVyIGRlc2NyaXB0b3IgY2hhaW5lZCAqLwogCXUzMiBUb3RhbFBhY2tldExlbmd0aDsJLyogU2VsZiBleHBsYWluZWQgKi8KIAljaGFyICpwRmlyc3RCdWZmZXI7CS8qIFBvaW50ZXIgdG8gZmlyc3QgYnVmZmVyIGRlc2NyaXB0b3IgKi8KQEAgLTg0Niw4ICs4NDcsOCBAQAogLyogUG93ZXIgc2F2ZSBtZXRob2QgY29udHJvbCAqLwogdHlwZWRlZiB1bmlvbiBfUFNfQ09OVFJPTCB7CiAJc3RydWN0IHsKLQkJdW5zaWduZWQgbG9uZyBFbmFibGVQU2luSWRsZToxOwkvKiBFbmFibGUgcmFkaW8gb2ZmIHdoZW4gbm90IGNvbm5lY3QgdG8gQVAuIHJhZGlvIG9uIG9ubHkgd2hlbiBzaXRlc3VydmV5LCAqLwotCQl1bnNpZ25lZCBsb25nIEVuYWJsZU5ld1BTOjE7CS8qIEVuYWJsZSBuZXcgIENoaXAgcG93ZXIgc2F2ZSBmdWNudGlvbiAuIE5ldyBtZXRob2QgY2FuIG9ubHkgYmUgYXBwbGllZCBpbiBjaGlwIHZlcnNpb24gYWZ0ZXIgMjg3Mi4gYW5kIFBDSWUuICovCisJCXVuc2lnbmVkIGxvbmcgRW5hYmxlUFNpbklkbGU6MTsJLyogRW5hYmxlIHJhZGlvIG9mZiB3aGVuIG5vdCBjb25uZWN0ZWQgdG8gQVAuIHJhZGlvIG9uIG9ubHkgd2hlbiBzaXRlc3VydmV5LCAqLworCQl1bnNpZ25lZCBsb25nIEVuYWJsZU5ld1BTOjE7CS8qIEVuYWJsZSBuZXcgIENoaXAgcG93ZXIgc2F2ZSBmdW5jdGlvbiAuIE5ldyBtZXRob2QgY2FuIG9ubHkgYmUgYXBwbGllZCBpbiBjaGlwIHZlcnNpb24gYWZ0ZXIgMjg3Mi4gYW5kIFBDSWUuICovCiAJCXVuc2lnbmVkIGxvbmcgcnQzMHh4UG93ZXJNb2RlOjI7CS8qIFBvd2VyIExldmVsIE1vZGUgZm9yIHJ0MzB4eCBjaGlwICovCiAJCXVuc2lnbmVkIGxvbmcgcnQzMHh4Rm9sbG93SG9zdEFTUE06MTsJLyogQ2FyZCBGb2xsb3dzIEhvc3QncyBzZXR0aW5nIGZvciBydDMweHggY2hpcC4gKi8KIAkJdW5zaWduZWQgbG9uZyBydDMweHhGb3JjZUFTUE1UZXN0OjE7CS8qIEZvcmNlIGVuYWJsZSBMMSBmb3IgcnQzMHh4IGNoaXAuIFRoaXMgaGFzIGhpZ2hlciBwcmlvcml0eSB0aGFuIHJ0MzB4eEZvbGxvd0hvc3RBU1BNIE1vZGUuICovCkBAIC0xMTE3LDggKzExMTgsOCBAQAogCXVuc2lnbmVkIGxvbmcgVGltSUVMb2NhdGlvbkluQmVhY29uW0hXX0JFQUNPTl9NQVhfQ09VTlRdOwogCXVuc2lnbmVkIGxvbmcgQ2FwYWJpbGl0eUluZm9Mb2NhdGlvbkluQmVhY29uW0hXX0JFQUNPTl9NQVhfQ09VTlRdOwogCUJPT0xFQU4gRW5hYmxlQmVhY29uOwkvKiB0cmlnZ2VyIHRvIGVuYWJsZSBiZWFjb24gdHJhbnNtaXNzaW9uLiAqLwotCXU4IEJlYWNvbkJpdE1hcDsJLyogTk9URTogSWYgdGhlIE1BWF9NQlNTSURfTlVNIGlzIGxhcmdlciB0aGFuIDgsIHRoaXMgcGFyYW1ldGVyIG5lZWQgdG8gY2hhbmdlLiAqLwotCXU4IER0aW1CaXRPbjsJLyogTk9URTogSWYgdGhlIE1BWF9NQlNTSURfTlVNIGlzIGxhcmdlciB0aGFuIDgsIHRoaXMgcGFyYW1ldGVyIG5lZWQgdG8gY2hhbmdlLiAqLworCXU4IEJlYWNvbkJpdE1hcDsJLyogTk9URTogSWYgdGhlIE1BWF9NQlNTSURfTlVNIGlzIGxhcmdlciB0aGFuIDgsIHRoaXMgcGFyYW1ldGVyIG5lZWRzIHRvIGNoYW5nZS4gKi8KKwl1OCBEdGltQml0T247CS8qIE5PVEU6IElmIHRoZSBNQVhfTUJTU0lEX05VTSBpcyBsYXJnZXIgdGhhbiA4LCB0aGlzIHBhcmFtZXRlciBuZWVkcyB0byBjaGFuZ2UuICovCiB9OwogI2VuZGlmIC8qIFJUTVBfTUFDX1VTQiAvLyAqLwogCkBAIC0xMjExLDcgKzEyMTIsNyBAQAogCS8qQk9PTEVBTiAgICAgICAgICAgICAgIGJBdXRvVHhSYXRlU3dpdGNoOyAqLwogCXU4IE1pblR4UmF0ZTsJLyogUkFURV8xLCBSQVRFXzIsIFJBVEVfNV81LCBSQVRFXzExICovCiAJdTggUnRzUmF0ZTsJCS8qIFJBVEVfeHh4ICovCi0JSFRUUkFOU01JVF9TRVRUSU5HIE1sbWVUcmFuc21pdDsJLyogTUdNVCBmcmFtZSBQSFkgcmF0ZSBzZXR0aW5nIHdoZW4gb3BlcmF0aW4gYXQgSHQgcmF0ZS4gKi8KKwlIVFRSQU5TTUlUX1NFVFRJTkcgTWxtZVRyYW5zbWl0OwkvKiBNR01UIGZyYW1lIFBIWSByYXRlIHNldHRpbmcgd2hlbiBvcGVyYXRpb24gYXQgSHQgcmF0ZS4gKi8KIAl1OCBNbG1lUmF0ZTsJCS8qIFJBVEVfeHh4LCB1c2VkIHRvIHNlbmQgTUxNRSBmcmFtZXMgKi8KIAl1OCBCYXNpY01sbWVSYXRlOwkvKiBEZWZhdWx0IFJhdGUgZm9yIHNlbmRpbmcgTUxNRSBmcmFtZXMgKi8KIApAQCAtMTI2NCw3ICsxMjY1LDcgQEAKIAlzdHJ1Y3QgcnRfaHRfY2FwYWJpbGl0eV9pZSBIdENhcGFiaWxpdHk7CiAJc3RydWN0IHJ0X2FkZF9odF9pbmZvX2llIEFkZEhUSW5mbzsJLyogVXNlZnVsIGFzIEFQLiAqLwogCS8qVGhpcyBJRSBpcyB1c2VkIHdpdGggY2hhbm5lbCBzd2l0Y2ggYW5ub3VuY2VtZW50IGVsZW1lbnQgd2hlbiBjaGFuZ2luZyB0byBhIG5ldyA0ME1Iei4gKi8KLQkvKlRoaXMgSUUgaXMgaW5jbHVkZWQgaW4gY2hhbm5lbCBzd2l0Y2ggYW1tb3VuY2VtZW50IGZyYW1lcyA3LjQuMS41LCBiZWFjb25zLCBwcm9iZSBSc3AuICovCisJLypUaGlzIElFIGlzIGluY2x1ZGVkIGluIGNoYW5uZWwgc3dpdGNoIGFubm91bmNlbWVudCBmcmFtZXMgNy40LjEuNSwgYmVhY29ucywgcHJvYmUgUnNwLiAqLwogCXN0cnVjdCBydF9uZXdfZXh0X2NoYW5faWUgTmV3RXh0Q2hhbk9mZnNldDsJLyo3LjMuMi4yMEEsIDEgaWYgZXh0ZW5zaW9uIGNoYW5uZWwgaXMgYWJvdmUgdGhlIGNvbnRyb2wgY2hhbm5lbCwgMyBpZiBiZWxvdywgMCBpZiBub3QgcHJlc2VudCAqLwogCiAJQk9PTEVBTiBiSFRQcm90ZWN0OwpAQCAtMTMyOSw3ICsxMzMwLDcgQEAKIAkvKiBHUk9VUCAxIC0gKi8KIAkvKiAgIFVzZXIgY29uZmlndXJhdGlvbiBsb2FkZWQgZnJvbSBSZWdpc3RyeSwgRTJQUk9NIG9yIE9JRF94eHguIFRoZXNlIHNldHRpbmdzIGRlc2NyaWJlICovCiAJLyogICB0aGUgdXNlciBpbnRlbmRlZCBjb25maWd1cmF0aW9uLCBidXQgbm90IG5lY2Vzc2FyeSBmdWxseSBlcXVhbCB0byB0aGUgZmluYWwgKi8KLQkvKiAgIHNldHRpbmdzIGluIEFDVElWRSBCU1MgYWZ0ZXIgbmVnb3RpYXRpb24vY29tcHJvbWl6ZSB3aXRoIHRoZSBCU1MgaG9sZGVyIChlaXRoZXIgKi8KKwkvKiAgIHNldHRpbmdzIGluIEFDVElWRSBCU1MgYWZ0ZXIgbmVnb3RpYXRpb24vY29tcHJvbWlzZSB3aXRoIHRoZSBCU1MgaG9sZGVyIChlaXRoZXIgKi8KIAkvKiAgIEFQIG9yIElCU1MgaG9sZGVyKS4gKi8KIAkvKiAgIE9uY2UgaW5pdGlhbGl6ZWQsIHVzZXIgY29uZmlndXJhdGlvbiBjYW4gb25seSBiZSBjaGFuZ2VkIHZpYSBPSURfeHh4ICovCiAJdTggQnNzVHlwZTsJCS8qIEJTU19JTkZSQSBvciBCU1NfQURIT0MgKi8KQEAgLTEzODYsMTIgKzEzODcsMTIgQEAKIAogCS8qIEZvciBXUEEgY291bnRlcm1lYXN1cmVzICovCiAJdW5zaWduZWQgbG9uZyBMYXN0TWljRXJyb3JUaW1lOwkvKiByZWNvcmQgbGFzdCBNSUMgZXJyb3IgdGltZSAqLwotCXVuc2lnbmVkIGxvbmcgTWljRXJyQ250OwkvKiBTaG91bGQgYmUgMCwgMSwgMiwgdGhlbiByZXNldCB0byB6ZXJvIChhZnRlciBkaXNhc3NvaWNpYXRpb24pLiAqLworCXVuc2lnbmVkIGxvbmcgTWljRXJyQ250OwkvKiBTaG91bGQgYmUgMCwgMSwgMiwgdGhlbiByZXNldCB0byB6ZXJvIChhZnRlciBkaXNhc3NvY2lhdGlvbikuICovCiAJQk9PTEVBTiBiQmxvY2tBc3NvYzsJLyogQmxvY2sgYXNzb2NpYXRlIGF0dGVtcHQgZm9yIDYwIHNlY29uZHMgYWZ0ZXIgY291bnRlciBtZWFzdXJlIG9jY3VycmVkLiAqLwogCS8qIEZvciBXUEEtUFNLIHN1cHBsaWNhbnQgc3RhdGUgKi8KIAlXUEFfU1RBVEUgV3BhU3RhdGU7CS8qIERlZmF1bHQgaXMgU1NfTk9UVVNFIGFuZCBoYW5kbGVkIGJ5IG1pY3Jvc29mdCA4MDIuMXggKi8KIAl1OCBSZXBsYXlDb3VudGVyWzhdOwotCXU4IEFOb25jZVszMl07CS8qIEFOb25jZSBmb3IgV1BBLVBTSyBmcm9tIGF1cmhlbnRpY2F0b3IgKi8KKwl1OCBBTm9uY2VbMzJdOwkvKiBBTm9uY2UgZm9yIFdQQS1QU0sgZnJvbSBhdWhlbnRpY2F0b3IgKi8KIAl1OCBTTm9uY2VbMzJdOwkvKiBTTm9uY2UgZm9yIFdQQS1QU0sgKi8KIAogCXU4IExhc3RTTlIwOwkJLyogbGFzdCByZWNlaXZlZCBCRUFDT04ncyBTTlIgKi8KQEAgLTE0MjMsNyArMTQyNCw3IEBACiAJdTggUlNOSUVfTGVuOwogCXU4IFJTTl9JRVtNQVhfTEVOX09GX1JTTklFXTsJLyogVGhlIGNvbnRlbnQgc2F2ZWQgaGVyZSBzaG91bGQgYmUgbGl0dGxlLWVuZGlhbiBmb3JtYXQuICovCiAKLQl1bnNpZ25lZCBsb25nIENMQnVzeUJ5dGVzOwkvKiBTYXZlIHRoZSB0b3RhbCBieXRlcyByZWNlaXZlZCBkdXJuaW5nIGNoYW5uZWwgbG9hZCBzY2FuIHRpbWUgKi8KKwl1bnNpZ25lZCBsb25nIENMQnVzeUJ5dGVzOwkvKiBTYXZlIHRoZSB0b3RhbCBieXRlcyByZWNlaXZlZCBkdXJpbmcgY2hhbm5lbCBsb2FkIHNjYW4gdGltZSAqLwogCXUxNiBSUElEZW5zaXR5WzhdOwkvKiBBcnJheSBmb3IgUlBJIGRlbnNpdHkgY29sbGVjdGlvbiAqLwogCiAJdTggUk1SZXFDbnQ7CQkvKiBOdW1iZXIgb2YgbWVhc3VyZW1lbnQgcmVxdWVzdCBzYXZlZC4gKi8KQEAgLTE0ODksOSArMTQ5MCw5IEBACiAJQk9PTEVBTiBiRm9yY2VUeEJ1cnN0OwkvKiAxOiBmb3JjZSBlbmJsZSBUWCBQQUNLRVQgQlVSU1QsIDA6IGRpc2FibGUgKi8KIH07CiAKLS8qIFRoaXMgZGF0YSBzdHJ1Y3R1cmUga2VlcCB0aGUgY3VycmVudCBhY3RpdmUgQlNTL0lCU1MncyBjb25maWd1cmF0aW9uIHRoYXQgdGhpcyBTVEEgKi8KKy8qIFRoaXMgZGF0YSBzdHJ1Y3R1cmUga2VlcHMgdGhlIGN1cnJlbnQgYWN0aXZlIEJTUy9JQlNTJ3MgY29uZmlndXJhdGlvbiB0aGF0IHRoaXMgU1RBICovCiAvKiBoYWQgYWdyZWVkIHVwb24gam9pbmluZyB0aGUgbmV0d29yay4gV2hpY2ggbWVhbnMgdGhlc2UgcGFyYW1ldGVycyBhcmUgdXN1YWxseSBkZWNpZGVkICovCi0vKiBieSB0aGUgQlNTL0lCU1MgY3JlYXRvciBpbnN0ZWFkIG9mIHVzZXIgY29uZmlndXJhdGlvbi4gRGF0YSBpbiB0aGlzIGRhdGEgc3RydWN0dXJyZSAqLworLyogYnkgdGhlIEJTUy9JQlNTIGNyZWF0b3IgaW5zdGVhZCBvZiB1c2VyIGNvbmZpZ3VyYXRpb24uIERhdGEgaW4gdGhpcyBkYXRhIHN0cnVjdHVyZSAqLwogLyogaXMgdmFsaWQgb25seSB3aGVuIGVpdGhlciBBREhPQ19PTihwQWQpIG9yIElORlJBX09OKHBBZCkgaXMgVFJVRS4gKi8KIC8qIE5vcm1hbGx5LCBhZnRlciBTQ0FOIG9yIGZhaWxlZCByb2FtaW5nIGF0dGVtcHRzLCB3ZSBuZWVkIHRvIHJlY292ZXIgYmFjayB0byAqLwogLyogdGhlIGN1cnJlbnQgYWN0aXZlIHNldHRpbmdzLiAqLwpAQCAtMTUxOSw3ICsxNTIwLDcgQEAKIAkvKkNob29zZSAxIGZyb20gVmFsaWRBc1dEUyBhbmQgVmFsaWRBc0NMSSAgdG8gdmFsaWRpemUuICovCiAJQk9PTEVBTiBWYWxpZEFzQ0xJOwkvKiBTdGEgbW9kZSwgc2V0IHRoaXMgVFJVRSBhZnRlciBMaW5rdXAsdG9vLiAqLwogCUJPT0xFQU4gVmFsaWRBc1dEUzsJLyogVGhpcyBpcyBXRFMgRW50cnkuIG9ubHkgZm9yIEFQIG1vZGUuICovCi0JQk9PTEVBTiBWYWxpZEFzQXBDbGk7CS8qVGhpcyBpcyBhIEFQLUNsaWVudCBlbnRyeSwgb25seSBmb3IgQVAgbW9kZSB3aGljaCBlbmFibGUgQVAtQ2xpZW50IGZ1bmN0aW9ucy4gKi8KKwlCT09MRUFOIFZhbGlkQXNBcENsaTsJLyogVGhpcyBpcyBhIEFQLUNsaWVudCBlbnRyeSwgb25seSBmb3IgQVAgbW9kZSB3aGljaCBlbmFibGUgQVAtQ2xpZW50IGZ1bmN0aW9ucy4gKi8KIAlCT09MRUFOIFZhbGlkQXNNZXNoOwogCUJPT0xFQU4gVmFsaWRBc0RsczsJLyogVGhpcyBpcyBETFMgRW50cnkuIG9ubHkgZm9yIFNUQSBtb2RlLiAqLwogCUJPT0xFQU4gaXNDYWNoZWQ7CkBAIC0xNTI3LDcgKzE1MjgsNyBAQAogCiAJdTggRW5xdWV1ZUVhcG9sU3RhcnRUaW1lclJ1bm5pbmc7CS8qIEVucXVldWUgRUFQb0wtU3RhcnQgZm9yIHRyaWdnZXJpbmcgRUFQIFNNICovCiAJLypqYW4gZm9yIHdwYSAqLwotCS8qIHJlY29yZCB3aGljaCBlbnRyeSByZXZva2UgTUlDIEZhaWx1cmUgLCBpZiBpdCBsZWF2ZXMgdGhlIEJTUyBpdHNlbGYsIEFQIHdvbid0IHVwZGF0ZSBhTUlDRmFpbFRpbWUgTUlCICovCisJLyogcmVjb3JkIHdoaWNoIGVudHJ5IHJldm9rZSBNSUMgRmFpbHVyZSwgaWYgaXQgbGVhdmVzIHRoZSBCU1MgaXRzZWxmLCBBUCB3b24ndCB1cGRhdGUgYU1JQ0ZhaWxUaW1lIE1JQiAqLwogCXU4IENNVGltZXJSdW5uaW5nOwogCXU4IGFwaWR4OwkJLyogTUJTUyBudW1iZXIgKi8KIAl1OCBSU05JRV9MZW47CkBAIC0xNzIyLDcgKzE3MjMsNyBAQAogCXVuc2lnbmVkIGxvbmcgUnQzeHhSYWxpbmtMaW5rQ3RybDsJLyogVVNlZCBmb3IgMzA5MEYgY2hpcCAqLwogCXUxNiBEZXZpY2VJRDsJLyogUmVhZCBmcm9tIFBDSSBjb25maWcgKi8KIAl1bnNpZ25lZCBsb25nIEFjY2Vzc0JCUEZhaWxDb3VudDsKLQlCT09MRUFOIGJQQ0ljbGtPZmY7CS8qIGZsYWcgdGhhdCBpbmRpY2F0ZSBpZiB0aGUgUElDRSBwb3dlciBzdGF0dXMgaW4gQ29uZmlndXJhdGlvbiBTUGFjZS4uICovCisJQk9PTEVBTiBiUENJY2xrT2ZmOwkvKiBmbGFnIHRoYXQgaW5kaWNhdGVzIGlmIHRoZSBQSUNFIHBvd2VyIHN0YXR1cyBpbiBDb25maWd1cmF0aW9uIFNwYWNlLi4gKi8KIAlCT09MRUFOIGJQQ0ljbGtPZmZEaXNhYmxlVHg7CS8qICovCiAKIAlCT09MRUFOIGJydDMweHhCYW5NY3VDbWQ7CS8qd2hlbiA9IDB4ZmYgbWVhbnMgYWxsIGNvbW1hbmRzIGFyZSBvayB0byBzZXQgLiAqLwpAQCAtMTg3MSw5ICsxODcyLDkgQEAKIAkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAJdTggUmZJY1R5cGU7CQkvKiBSRklDX3h4eCAqLwogCXVuc2lnbmVkIGxvbmcgUmZGcmVxT2Zmc2V0OwkvKiBGcmVxdWVuY3kgb2Zmc2V0IGZvciBjaGFubmVsIHN3aXRjaGluZyAqLwotCXN0cnVjdCBydF9ydG1wX3JmX3JlZ3MgTGF0Y2hSZlJlZ3M7CS8qIGxhdGNoIHRoIGxhdGVzdCBSRiBwcm9ncmFtbWluZyB2YWx1ZSBzaW5jZSBSRiBJQyBkb2Vzbid0IHN1cHBvcnQgUkVBRCAqLworCXN0cnVjdCBydF9ydG1wX3JmX3JlZ3MgTGF0Y2hSZlJlZ3M7CS8qIGxhdGNoIHRoZSBsYXRlc3QgUkYgcHJvZ3JhbW1pbmcgdmFsdWUgc2luY2UgUkYgSUMgZG9lc24ndCBzdXBwb3J0IFJFQUQgKi8KIAotCUVFUFJPTV9BTlRFTk5BX1NUUlVDIEFudGVubmE7CS8qIFNpbmNlIEFOdGVubmEgZGVmaW5pdGlvbiBpcyBkaWZmZXJlbnQgZm9yIGEgJiBnLiBXZSBuZWVkIHRvIHNhdmUgaXQgZm9yIGZ1dHVyZSByZWZlcmVuY2UuICovCisJRUVQUk9NX0FOVEVOTkFfU1RSVUMgQW50ZW5uYTsJLyogU2luY2UgQW50ZW5uYSBkZWZpbml0aW9uIGlzIGRpZmZlcmVudCBmb3IgYSAmIGcuIFdlIG5lZWQgdG8gc2F2ZSBpdCBmb3IgZnV0dXJlIHJlZmVyZW5jZS4gKi8KIAlFRVBST01fTklDX0NPTkZJRzJfU1RSVUMgTmljQ29uZmlnMjsKIAogCS8qIFRoaXMgc29mdCBSeCBBbnRlbm5hIERpdmVyc2l0eSBtZWNoYW5pc20gaXMgdXNlZCBvbmx5IHdoZW4gdXNlciBzZXQgKi8KQEAgLTE5OTAsNyArMTk5MSw3IEBACiAJc3RydWN0IHJ0X2NvbW1vbl9jb25maWcgQ29tbW9uQ2ZnOwogCXN0cnVjdCBydF9tbG1lIE1sbWU7CiAKLQkvKiBBUCBuZWVkcyB0aG9zZSB2YWlhYmxlcyBmb3Igc2l0ZSBzdXJ2ZXkgZmVhdHVyZS4gKi8KKwkvKiBBUCBuZWVkcyB0aG9zZSB2YXJpYWJsZXMgZm9yIHNpdGUgc3VydmV5IGZlYXR1cmUuICovCiAJc3RydWN0IHJ0X21sbWVfYXV4IE1sbWVBdXg7CS8qIHRlbXBvcmFyeSBzZXR0aW5ncyB1c2VkIGR1cmluZyBNTE1FIHN0YXRlIG1hY2hpbmUgKi8KIAlzdHJ1Y3QgcnRfYnNzX3RhYmxlIFNjYW5UYWI7CS8qIHN0b3JlIHRoZSBsYXRlc3QgU0NBTiByZXN1bHQgKi8KIApAQCAtMjAxMiw3ICsyMDEzLDcgQEAKIAkvKiB2YXJpb3VzIENvdW50ZXJzICovCiAJc3RydWN0IHJ0X2NvdW50ZXJfODAyXzMgQ291bnRlcnM4MDIzOwkvKiA4MDIuMyBjb3VudGVycyAqLwogCXN0cnVjdCBydF9jb3VudGVyXzgwMl8xMSBXbGFuQ291bnRlcnM7CS8qIDgwMi4xMSBNSUIgY291bnRlcnMgKi8KLQlzdHJ1Y3QgcnRfY291bnRlcl9yYWxpbmsgUmFsaW5rQ291bnRlcnM7CS8qIFJhbGluayBwcm9wcmlldHkgY291bnRlcnMgKi8KKwlzdHJ1Y3QgcnRfY291bnRlcl9yYWxpbmsgUmFsaW5rQ291bnRlcnM7CS8qIFJhbGluayBwcm9wcmlldGFyeSBjb3VudGVycyAqLwogCXN0cnVjdCBydF9jb3VudGVyX2RycyBEcnNDb3VudGVyczsJLyogY291bnRlcnMgZm9yIER5bmFtaWMgVFggUmF0ZSBTd2l0Y2hpbmcgKi8KIAlzdHJ1Y3QgcnRfcHJpdmF0ZSBQcml2YXRlSW5mbzsJLyogUHJpdmF0ZSBpbmZvcm1hdGlvbiAmIGNvdW50ZXJzICovCiAKQEAgLTIwMjQsNyArMjAyNSw3IEBACiAJdTE2IFNlcXVlbmNlOwogCiAJLyogQ29udHJvbCBkaXNjb25uZWN0IC8gY29ubmVjdCBldmVudCBnZW5lcmF0aW9uICovCi0JLyorKytEaWRuJ3QgdXNlZCBhbnltb3JlICovCisJLyorKytOb3QgdXNlZCBhbnltb3JlICovCiAJdW5zaWduZWQgbG9uZyBMaW5rRG93blRpbWU7CiAJLyotLS0gKi8KIAl1bnNpZ25lZCBsb25nIExhc3RSeFJhdGU7CkBAIC0yMDM2LDcgKzIwMzcsNyBAQAogCXVuc2lnbmVkIGxvbmcgRXh0cmFJbmZvOwkvKiBFeHRyYSBpbmZvcm1hdGlvbiBmb3IgZGlzcGxheWluZyBzdGF0dXMgKi8KIAl1bnNpZ25lZCBsb25nIFN5c3RlbUVycm9yQml0bWFwOwkvKiBiMDogRTJQUk9NIHZlcnNpb24gZXJyb3IgKi8KIAotCS8qKysrRGlkbid0IHVzZWQgYW55bW9yZSAqLworCS8qKysrTm90IHVzZWQgYW55bW9yZSAqLwogCXVuc2lnbmVkIGxvbmcgTWFjSWNWZXJzaW9uOwkvKiBNQUMvQkJQIHNlcmlhbCBpbnRlcmZhY2UgaXNzdWUgc29sdmVkIGFmdGVyIHZlci5EICovCiAJLyotLS0gKi8KIApAQCAtMjA4OSw3ICsyMDkwLDcgQEAKIAl1bnNpZ25lZCBsb25nIEJ1bGtPdXRSZXE7CiAJdW5zaWduZWQgbG9uZyBCdWxrT3V0Q29tcGxldGU7CiAJdW5zaWduZWQgbG9uZyBCdWxrT3V0Q29tcGxldGVPdGhlcjsKLQl1bnNpZ25lZCBsb25nIEJ1bGtPdXRDb21wbGV0ZUNhbmNlbDsJLyogc2VlbXMgbm90IHVzZSBub3c/ICovCisJdW5zaWduZWQgbG9uZyBCdWxrT3V0Q29tcGxldGVDYW5jZWw7CS8qIHNlZW1zIG5vdCB1c2VkIG5vdz8gKi8KIAl1bnNpZ25lZCBsb25nIEJ1bGtJblJlcTsKIAl1bnNpZ25lZCBsb25nIEJ1bGtJbkNvbXBsZXRlOwogCXVuc2lnbmVkIGxvbmcgQnVsa0luQ29tcGxldGVGYWlsOwpAQCAtMjE5Niw5ICsyMTk3LDkgQEAKIHN0cnVjdCBydF90eF9ibGsgewogCXU4IFF1ZUlkeDsKIAl1OCBUeEZyYW1lVHlwZTsJLyogSW5kaWNhdGUgdGhlIFRyYW5zbWlzc2lvbiB0eXBlIG9mIHRoZSBhbGwgZnJhbWVzIGluIG9uZSBiYXRjaCAqLwotCXU4IFRvdGFsRnJhbWVOdW07CS8qIFRvdGFsIGZyYW1lIG51bWJlciB3YW50IHRvIHNlbmQtb3V0IGluIG9uZSBiYXRjaCAqLworCXU4IFRvdGFsRnJhbWVOdW07CS8qIFRvdGFsIGZyYW1lIG51bWJlciB0aGF0IHdhbnRzIHRvIHNlbmQtb3V0IGluIG9uZSBiYXRjaCAqLwogCXUxNiBUb3RhbEZyYWdOdW07CS8qIFRvdGFsIGZyYW1lIGZyYWdtZW50cyByZXF1aXJlZCBpbiBvbmUgYmF0Y2ggKi8KLQl1MTYgVG90YWxGcmFtZUxlbjsJLyogVG90YWwgbGVuZ3RoIG9mIGFsbCBmcmFtZXMgd2FudCB0byBzZW5kLW91dCBpbiBvbmUgYmF0Y2ggKi8KKwl1MTYgVG90YWxGcmFtZUxlbjsJLyogVG90YWwgbGVuZ3RoIG9mIGFsbCBmcmFtZXMgdGhhdCB3YW50cyB0byBzZW5kLW91dCBpbiBvbmUgYmF0Y2ggKi8KIAogCXN0cnVjdCBydF9xdWV1ZV9oZWFkZXIgVHhQYWNrZXRMaXN0OwogCXN0cnVjdCBydF9tYWNfdGFibGVfZW50cnkgKnBNYWNFbnRyeTsJLyogTlVMTDogcGFja2V0IHdpdGggODAyLjExIFJBIGZpZWxkIGlzIG11bHRpY2FzdC9icm9hZGNhc3QgYWRkcmVzcyAqLwpAQCAtMjIwNyw3ICsyMjA4LDcgQEAKIAkvKiBGb2xsb3dpbmcgc3RydWN0dXJlIHVzZWQgZm9yIHRoZSBjaGFyYWN0ZXJpc3RpY3Mgb2YgYSBzcGVjaWZpYyBwYWNrZXQuICovCiAJdm9pZCAqcFBhY2tldDsKIAl1OCAqcFNyY0J1ZkhlYWRlcjsJLyogUmVmZXJlbmNlIHRvIHRoZSBoZWFkIG9mIHNrX2J1ZmYtPmRhdGEgKi8KLQl1OCAqcFNyY0J1ZkRhdGE7CS8qIFJlZmVyZW5jZSB0byB0aGUgc2tfYnVmZi0+ZGF0YSwgd2lsbCBjaGFuZ2VkIGRlcGVuZHMgb24gaGFubGRpbmcgcHJvZ3Jlc3NzICovCisJdTggKnBTcmNCdWZEYXRhOwkvKiBSZWZlcmVuY2UgdG8gdGhlIHNrX2J1ZmYtPmRhdGEsIHdpbGwgY2hhbmdlIGRlcGVuZGluZyBvbiB0aGUgaGFuZGxpbmcgcHJvZ3Jlc3NzICovCiAJdTMyIFNyY0J1ZkxlbjsJCS8qIExlbmd0aCBvZiBwYWNrZXQgcGF5bG9hZCB3aGljaCBub3QgaW5jbHVkaW5nIExheWVyIDIgaGVhZGVyICovCiAJdTggKnBFeHRyYUxsY1NuYXBFbmNhcDsJLyogTlVMTCBtZWFucyBubyBleHRyYSBMTEMvU05BUCBpcyByZXF1aXJlZCAqLwogCXU4IEhlYWRlckJ1ZlsxMjhdOwkvKiBUZW1wQnVmZmVyIGZvciBUWF9JTkZPICsgVFhfV0kgKyA4MDIuMTEgSGVhZGVyICsgcGFkZGluZyArIEFNU0RVIFN1YkhlYWRlciArIExMQy9TTkFQICovCkBAIC0yMjE5LDcgKzIyMjAsNyBAQAogCXU4IGFwaWR4OwkJLyogVGhlIGludGVyZmFjZSBhc3NvY2lhdGVkIHRvIHRoaXMgcGFja2V0ICovCiAJdTggV2NpZDsJCS8qIFRoZSBNQUMgZW50cnkgYXNzb2NpYXRlZCB0byB0aGlzIHBhY2tldCAqLwogCXU4IFVzZXJQcmlvcml0eTsJLyogcHJpb3JpdHkgY2xhc3Mgb2YgcGFja2V0ICovCi0JdTggRnJhbWVHYXA7CQkvKiB3aGF0IGtpbmQgb2YgSUZTIHRoaXMgcGFja2V0IHVzZSAqLworCXU4IEZyYW1lR2FwOwkJLyogd2hhdCBraW5kIG9mIElGUyBkb2VzIHRoaXMgcGFja2V0IHVzZSAqLwogCXU4IE1wZHVSZXFOdW07CS8qIG51bWJlciBvZiBmcmFnbWVudHMgb2YgdGhpcyBmcmFtZSAqLwogCXU4IFR4UmF0ZTsJCS8qIFRPRE86IE9ic29sZXRlZD8gU2hvdWxkIGNoYW5nZSB0byBNQ1M/ICovCiAJdTggQ2lwaGVyQWxnOwkvKiBjaXBoZXIgYWxvZ3JpdGhtICovCkBAIC0yOTc4LDcgKzI5NzksNyBAQAogCiB2b2lkIEl0ZXJhdGVPbkJzc1RhYihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOwogCi12b2lkIEl0ZXJhdGVPbkJzc1RhYjIoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTs7Cit2b2lkIEl0ZXJhdGVPbkJzc1RhYjIoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTsKIAogdm9pZCBKb2luUGFybUZpbGwoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAogCQkgIHN0cnVjdCBydF9tbG1lX2pvaW5fcmVxICpKb2luUmVxLCB1bnNpZ25lZCBsb25nIEJzc0lkeCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0bXBfZGVmLmggYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0bXBfZGVmLmgKaW5kZXggOWM1NGJhYy4uNmFjNjE3ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydG1wX2RlZi5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnRtcF9kZWYuaApAQCAtMzEsMTAgKzMxLDExIEBACiAgICAgTWluaXBvcnQgcmVsYXRlZCBkZWZpbml0aW9uIGhlYWRlcgogCiAgICAgUmV2aXNpb24gSGlzdG9yeToKLSAgICBXaG8gICAgICAgICBXaGVuICAgICAgICAgIFdoYXQKKyAgICBXaG8gICAgICAgIAkgCVdoZW4gICAgICAgICAgCVdoYXQKICAgICAtLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBQYXVsIExpbiAgICAwOC0wMS0yMDAyICAgIGNyZWF0ZWQKLSAgICBKb2huIENoYW5nICAwOC0wNS0yMDAzICAgIGFkZCBkZWZpbml0aW9uIGZvciAxMWcgJiBvdGhlciBkcmFmdHMKKyAgICBQYXVsIExpbiAgICAJMDgtMDEtMjAwMiAgICAJY3JlYXRlZAorICAgIEpvaG4gQ2hhbmcgIAkwOC0wNS0yMDAzICAgIAlhZGQgZGVmaW5pdGlvbiBmb3IgMTFnICYgb3RoZXIgZHJhZnRzCisgICAgSnVzdGluIFAuIE1hdHRvY2sJMTEvMDcvMjAxMAlGaXggc29tZSB0eXBvcwogKi8KICNpZm5kZWYgX19SVE1QX0RFRl9IX18KICNkZWZpbmUgX19SVE1QX0RFRl9IX18KQEAgLTExMSwxMSArMTEyLDExIEBACiAJV01NIE5vdGU6IElmIG1lbW9yeSBvZiB5b3VyIHN5c3RlbSBpcyBub3QgbXVjaCwgcGxlYXNlIHJlZHVjZSB0aGUgZGVmaW5pdGlvbjsKIAlvciB3aGVuIHlvdSBkbyBXTU0gdGVzdCwgdGhlIHF1ZXVlIGZvciBsb3cgcHJpb3JpdHkgQUMgd2lsbCBiZSBmdWxsLCBpLmUuCiAJVFhfUklOR19TSVpFICsgTUFYX1BBQ0tFVFNfSU5fUVVFVUUgcGFja2V0cyBmb3IgdGhlIEFDIHdpbGwgYmUgYnVmZmVyZWQgaW4KLQlXTEFOLCBtYXliZSBubyBhbnkgcGFja2V0IGJ1ZmZlciBjYW4gYmUgZ290IGluIEV0aGVybmV0IGRyaXZlci4KKwlXTEFOLCBtYXliZSBubyBwYWNrZXQgYnVmZmVycyBjYW4gZ2V0IGludG8gdGhlIEV0aGVybmV0IGRyaXZlci4KIAotCVNvbWV0aW1lcyBubyBwYWNrZXQgYnVmZmVyIGNhbiBiZSBnb3QgaW4gRXRoZXJuZXQgZHJpdmVyLCB0aGUgc3lzdGVtIHdpbGwKKwlTb21ldGltZXMgbm8gcGFja2V0IGJ1ZmZlciBjYW4gYmUgZ2V0IGludG8gdGhlIEV0aGVybmV0IGRyaXZlciwgdGhlIHN5c3RlbSB3aWxsCiAJc2VuZCBmbG93IGNvbnRyb2wgcGFja2V0IHRvIHRoZSBzZW5kZXIgdG8gc2xvdyBkb3duIGl0cyBzZW5kaW5nIHJhdGUuCi0JU28gbm8gV01NIGNhbiBiZSBzYXcgaW4gdGhlIGFpci4KKwlTbyBubyBXTU0gY2FuIGJlIHNlZW4gaW4gdGhlIGFpci4KICovCiAKIC8qCkBAIC0xMjUsNyArMTI2LDcgQEAKIAlBbmQgaW4gcnRfbWFpbl9lbmQuYywgY2xDb25maWcuY2xOdW0gPSBSWF9SSU5HX1NJWkUgKiAzOyBpcyBjaGFuZ2VkIHRvCiAJY2xDb25maWcuY2xOdW0gPSBSWF9SSU5HX1NJWkUgKiA0OwogKi8KLS8qIFRPRE86IEZvciBWeFdvcmtzIHRoZSBzaXplIGlzIDI1Ni4gU2hhbGwgd2UgY2FobmdlIHRoZSB2YWx1ZSBhcyAyNTYgZm9yIGFsbCBPUz8/Pz8/ICovCisvKiBUT0RPOiBGb3IgVnhXb3JrcyB0aGUgc2l6ZSBpcyAyNTYuIFNoYWxsIHdlIGNoYW5nZSB0aGUgdmFsdWUgYXMgMjU2IGZvciBhbGwgT1M/ICovCiAjZGVmaW5lIE1BWF9QQUNLRVRTX0lOX1FVRVVFCQkJCSg1MTIpCS8qKDUxMikgICAgLy8gdG8gcGFzcyBXTU0gQTUtV1BBUFNLICovCiAKICNkZWZpbmUgTUFYX1BBQ0tFVFNfSU5fTUNBU1RfUFNfUVVFVUUJCTMyCkBAIC0xNzEsNyArMTcyLDcgQEAKICNkZWZpbmUgZlJUTVBfQURBUFRFUl9TQ0FOXzIwNDAgCQkJMHgwNDAwMDAwMAogI2RlZmluZQlmUlRNUF9BREFQVEVSX1JBRElPX01FQVNVUkVNRU5UCQkweDA4MDAwMDAwCiAKLSNkZWZpbmUgZlJUTVBfQURBUFRFUl9TVEFSVF9VUCAgICAgICAgIAkJMHgxMDAwMDAwMAkvKkRldml2ZSBhbHJlYWR5IGluaXRpYWxpemVkIGFuZCBlbmFibGVkIFR4L1J4LiAqLworI2RlZmluZSBmUlRNUF9BREFQVEVSX1NUQVJUX1VQICAgICAgICAgCQkweDEwMDAwMDAwCS8qRGV2aWNlIGFscmVhZHkgaW5pdGlhbGl6ZWQgYW5kIGVuYWJsZWQgVHgvUnguICovCiAjZGVmaW5lIGZSVE1QX0FEQVBURVJfTUVESUFfU1RBVEVfQ0hBTkdFICAgIDB4MjAwMDAwMDAKICNkZWZpbmUgZlJUTVBfQURBUFRFUl9JRExFX1JBRElPX09GRiAgICAgICAgMHg0MDAwMDAwMAogCkBAIC0yMDUsOCArMjA2LDggQEAKICNkZWZpbmUgZlJUTVBfUFNfU0VUX1BDSV9DTEtfT0ZGX0NPTU1BTkQgICAgICAgICAgMHgwMDAwMDAwMgogLyogSW5kaWNhdGUgZHJpdmVyIHNob3VsZCBkaXNhYmxlIGtpY2sgb2ZmIGhhcmR3YXJlIHRvIHNlbmQgcGFja2V0cyBmcm9tIG5vdy4gKi8KICNkZWZpbmUgZlJUTVBfUFNfRElTQUJMRV9UWCAgICAgICAgIDB4MDAwMDAwMDQKLS8qIEluZGljYXRlIGRyaXZlciBzaG91bGQgSU1NRURJQVRFTFkgZm8gdG8gc2xlZXAgYWZ0ZXIgcmVjZWl2aW5nIEFQJ3MgYmVhY29uIGluIHdoaWNoICBkb2Vzbid0IGluZGljYXRlIHVuaWNhdGUgbm9yIG11bHRpY2FzdCBwYWNrZXRzIGZvciBtZSAqLwotLyouIFRoaXMgZmxhZyBpcyB1c2VkIE9OTFkgaW4gUlRNUEhhbmRsZVJ4RG9uZUludGVycnVwdCByb3V0aW5lLiAqLworLyogSW5kaWNhdGUgZHJpdmVyIHNob3VsZCBJTU1FRElBVEVMWSBnbyB0byBzbGVlcCBhZnRlciByZWNlaXZpbmcgQVAncyBiZWFjb24gaW4gd2hpY2ggZG9lc24ndCBpbmRpY2F0ZSB1bmljYXRlIG5vciBtdWx0aWNhc3QgcGFja2V0cyBmb3IgbWUgKi8KKy8qIFRoaXMgZmxhZyBpcyB1c2VkIE9OTFkgaW4gUlRNUEhhbmRsZVJ4RG9uZUludGVycnVwdCByb3V0aW5lLiAqLwogI2RlZmluZSBmUlRNUF9QU19HT19UT19TTEVFUF9OT1cgICAgICAgICAweDAwMDAwMDA4CiAjZGVmaW5lIGZSVE1QX1BTX1RPR0dMRV9MMQkJMHgwMDAwMDAxMAkvKiBVc2UgVG9nZ2xlIEwxIG1lY2hhbmlzbSBmb3IgcnQyOHh4IFBDSWUgKi8KIApAQCAtMzAzLDcgKzMwNCw3IEBACiAKIC8qIFdEUyBkZWZpbml0aW9uICovCiAjZGVmaW5lCU1BWF9XRFNfRU5UUlkgICAgICAgICAgICAgICA0Ci0jZGVmaW5lIFdEU19QQUlSV0lTRV9LRVlfT0ZGU0VUICAgICA2MAkvKiBXRFMgbGlua3MgdXNlcyBwYWlyd2lzZSBrZXkjNjAgfiA2MyBpbiBBU0lDIHBhaXJ3aXNlIGtleSB0YWJsZSAqLworI2RlZmluZSBXRFNfUEFJUldJU0VfS0VZX09GRlNFVCAgICAgNjAJLyogV0RTIGxpbmtzIHVzZSBwYWlyd2lzZSBrZXkjNjAgfiA2MyBpbiBBU0lDIHBhaXJ3aXNlIGtleSB0YWJsZSAqLwogCiAjZGVmaW5lCVdEU19ESVNBQkxFX01PREUgICAgICAgICAgICAwCiAjZGVmaW5lCVdEU19SRVNUUklDVF9NT0RFICAgICAgICAgICAxCkBAIC01NTksNyArNTYwLDcgQEAKICNkZWZpbmUgSUVfQUREX0hUMiAgICAgICAgICAgICAgICAgICAgICAgIDUzCS8qIDgwMi4xMW4gZDEuIEFERElUSU9OQUwgSFQgQ0FQQUJJTElUWS4gRUxFTUVOVCBJRCBUQkQgKi8KIAogLyogRm9yIDgwMi4xMW4gRDMuMDMgKi8KLS8qI2RlZmluZSBJRV9ORVdfRVhUX0NIQV9PRkZTRVQgICAgICAgICAgICAgNjIgICAgLy8gODAyLjExbiBkMS4gTmV3IGV4dGVuc2lvbiBjaGFubmVsIG9mZnNldCBlbGVtZXQgKi8KKy8qI2RlZmluZSBJRV9ORVdfRVhUX0NIQV9PRkZTRVQgICAgICAgICAgICAgNjIgICAgLy8gODAyLjExbiBkMS4gTmV3IGV4dGVuc2lvbiBjaGFubmVsIG9mZnNldCBlbGVtZW50ICovCiAjZGVmaW5lIElFX1NFQ09OREFSWV9DSF9PRkZTRVQJCTYyCS8qIDgwMi4xMW4gRDMuMDMgICAgICAgIFNlY29uZGFyeSBDaGFubmVsIE9mZnNldCBlbGVtZW50ICovCiAjZGVmaW5lIElFX1dBUEkJCQkJCQkJNjgJLyogV0FQSSBpbmZvcm1hdGlvbiBlbGVtZW50ICovCiAjZGVmaW5lIElFXzIwNDBfQlNTX0NPRVhJU1QgICAgICAgICAgICAgICA3MgkvKiA4MDIuMTFuIEQzLjAuMyAqLwpAQCAtNjc4LDcgKzY3OSw3IEBACiAKICNkZWZpbmUgQUNUX01BQ0hJTkVfQkFTRSAgICAgICAgICAgICAgMAogCi0vKlRob3NlIFBFRVJfeHhfQ0FURSBudW1iZXIgaXMgYmFzZWQgb24gcmVhbCBDYXRlZ2FyeSB2YWx1ZSBpbiBJRUVFIHNwZWMuIFBsZWFzZSBkb24nZXMgbW9kaWZ5IGl0IGJ5IHlvdXIgc2VsZi4gKi8KKy8qVGhvc2UgUEVFUl94eF9DQVRFIG51bWJlciBpcyBiYXNlZCBvbiByZWFsIENhdGVnYXJ5IHZhbHVlIGluIElFRUUgc3BlYy4gUGxlYXNlIGRvIG5vdCBtb2RpZnkgaXQgYnkgeW91ciBzZWxmLiAqLwogLypDYXRlZ29yeSAqLwogI2RlZmluZSBNVDJfUEVFUl9TUEVDVFJVTV9DQVRFICAgICAgICAgICAgICAwCiAjZGVmaW5lIE1UMl9QRUVSX1FPU19DQVRFICAgICAgICAgICAgICAxCkBAIC03NDgsNyArNzQ5LDcgQEAKIAogI2RlZmluZSBBQ1RfRlVOQ19TSVpFICAgICAgICAgICAgICAgICAoTUFYX0FDVF9TVEFURSAqIE1BWF9BQ1RfTVNHKQogLyogKi8KLS8qIFNUQSdzIEFVVEhFTlRJQ0FUSU9OIHN0YXRlIG1hY2hpbmU6IHN0YXRlcywgZXZ2ZW50cywgdG90YWwgZnVuY3Rpb24gIyAqLworLyogU1RBJ3MgQVVUSEVOVElDQVRJT04gc3RhdGUgbWFjaGluZTogc3RhdGVzLCBldmVudHMsIHRvdGFsIGZ1bmN0aW9uICMgKi8KIC8qICovCiAjZGVmaW5lIEFVVEhfUkVRX0lETEUgICAgICAgICAgICAgICAgICAgMAogI2RlZmluZSBBVVRIX1dBSVRfU0VRMiAgICAgICAgICAgICAgICAgIDEKQEAgLTk0OCw3ICs5NDksNyBAQAogI2RlZmluZSBCTE9DS19BQ0sgICAgICAgICAgICAgICAgICAgMHg2MAkvKiBiNjo1ID0gMTEgKi8KIAogLyogKi8KLS8qIHJ0bXBfZGF0YS5jIHVzZSB0aGVzZSBkZWZpbml0aW9uICovCisvKiBydG1wX2RhdGEuYyB1c2VzIHRoaXMgZGVmaW5pdGlvbiAqLwogLyogKi8KICNkZWZpbmUgTEVOR1RIXzgwMl8xMSAgICAgICAgICAgICAgIDI0CiAjZGVmaW5lIExFTkdUSF84MDJfMTFfQU5EX0ggICAgICAgICAzMApAQCAtMTI4OCw3ICsxMjg5LDcgQEAKICNkZWZpbmUgSVdfU1RBX0xJTktET1dOX0VWRU5UX0ZMQUcJCQkJCTB4MDIxMAogI2RlZmluZSBJV19TQ0FOX0NPTVBMRVRFRF9FVkVOVF9GTEFHCQkJCTB4MDIxMQogI2RlZmluZSBJV19TQ0FOX0VOUVVFVUVfRkFJTF9FVkVOVF9GTEFHCQkJCTB4MDIxMgotLyogaWYgYWRkIG5ldyBzeXN0ZW0gZXZlbnQgZmxhZywgcGxlYXNlIHVwYWR0ZSB0aGUgSVdfU1lTX0VWRU5UX0ZMQUdfRU5EICovCisvKiBpZiBhZGQgbmV3IHN5c3RlbSBldmVudCBmbGFnLCBwbGVhc2UgdXBkYXRlIHRoZSBJV19TWVNfRVZFTlRfRkxBR19FTkQgKi8KICNkZWZpbmUJSVdfU1lTX0VWRU5UX0ZMQUdfRU5EICAgICAgICAgICAgICAgICAgICAgICAweDAyMTIKICNkZWZpbmUJSVdfU1lTX0VWRU5UX1RZUEVfTlVNCQkJCQkJKElXX1NZU19FVkVOVF9GTEFHX0VORCAtIElXX1NZU19FVkVOVF9GTEFHX1NUQVJUICsgMSkKIC8qIEZvciBzeXN0ZW0gZXZlbnQgLSBlbmQgKi8KQEAgLTEzMDUsNyArMTMwNiw3IEBACiAjZGVmaW5lIElXX1NQT09GX0RFQVVUSF9FVkVOVF9GTEFHCQkJCQkweDAzMDcKICNkZWZpbmUgSVdfU1BPT0ZfVU5LTk9XTl9NR01UX0VWRU5UX0ZMQUcJCQkweDAzMDgKICNkZWZpbmUgSVdfUkVQTEFZX0FUVEFDS19FVkVOVF9GTEFHCQkJCQkweDAzMDkKLS8qIGlmIGFkZCBuZXcgc3Bvb2YgYXR0YWNrIGV2ZW50IGZsYWcsIHBsZWFzZSB1cGFkdGUgdGhlIElXX1NQT09GX0VWRU5UX0ZMQUdfRU5EICovCisvKiBpZiBhZGQgbmV3IHNwb29mIGF0dGFjayBldmVudCBmbGFnLCBwbGVhc2UgdXBkYXRlIHRoZSBJV19TUE9PRl9FVkVOVF9GTEFHX0VORCAqLwogI2RlZmluZQlJV19TUE9PRl9FVkVOVF9GTEFHX0VORCAgICAgICAgICAgICAgICAgICAgIDB4MDMwOQogI2RlZmluZQlJV19TUE9PRl9FVkVOVF9UWVBFX05VTQkJCQkJCShJV19TUE9PRl9FVkVOVF9GTEFHX0VORCAtIElXX1NQT09GX0VWRU5UX0ZMQUdfU1RBUlQgKyAxKQogLyogRm9yIHNwb29mIGF0dGFjayBldmVudCAtIGVuZCAqLwpAQCAtMTMxOSw3ICsxMzIwLDcgQEAKICNkZWZpbmUgSVdfRkxPT0RfRElTQVNTT0NfRVZFTlRfRkxBRwkJCQkweDA0MDQKICNkZWZpbmUgSVdfRkxPT0RfREVBVVRIX0VWRU5UX0ZMQUcJCQkJCTB4MDQwNQogI2RlZmluZSBJV19GTE9PRF9FQVBfUkVRX0VWRU5UX0ZMQUcJCQkJCTB4MDQwNgotLyogaWYgYWRkIG5ldyBmbG9vZGluZyBhdHRhY2sgZXZlbnQgZmxhZywgcGxlYXNlIHVwYWR0ZSB0aGUgSVdfRkxPT0RfRVZFTlRfRkxBR19FTkQgKi8KKy8qIGlmIGFkZCBuZXcgZmxvb2RpbmcgYXR0YWNrIGV2ZW50IGZsYWcsIHBsZWFzZSB1cGRhdGUgdGhlIElXX0ZMT09EX0VWRU5UX0ZMQUdfRU5EICovCiAjZGVmaW5lCUlXX0ZMT09EX0VWRU5UX0ZMQUdfRU5EICAgICAgICAgICAgICAgICAgIAkweDA0MDYKICNkZWZpbmUJSVdfRkxPT0RfRVZFTlRfVFlQRV9OVU0JCQkJCQkoSVdfRkxPT0RfRVZFTlRfRkxBR19FTkQgLSBJV19GTE9PRF9FVkVOVF9GTEFHX1NUQVJUICsgMSkKIC8qIEZvciBmbG9vZGluZyBhdHRhY2sgLSBlbmQgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnRtcF90aW1lci5oIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydG1wX3RpbWVyLmgKaW5kZXggMjhiOGFjNi4uMTViNjI4NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydG1wX3RpbWVyLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydG1wX3RpbWVyLmgKQEAgLTI4LDEzICsyOCwxNCBAQAogCXJ0bXBfdGltZXIuaAogCiAgICAgQWJzdHJhY3Q6Ci0JUmFsaW5rIFdpcmVsZXNzIERyaXZlciB0aW1lciByZWxhdGVkIGRhdGEgc3RydWN0dXJlcyBhbmQgZGVsY2FyYXRpb25zCisJUmFsaW5rIFdpcmVsZXNzIERyaXZlciB0aW1lciByZWxhdGVkIGRhdGEgc3RydWN0dXJlcyBhbmQgZGVjbGFyYXRpb25zIAogCiAgICAgUmV2aXNpb24gSGlzdG9yeToKLQlXaG8gICAgICAgICAgIFdoZW4gICAgICAgICAgICAgICAgV2hhdAorCVdobyAgICAgICAgICAJCVdoZW4gICAgICAgICAgICAgICAgIFdoYXQKIAktLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCU5hbWUgICAgICAgICAgRGF0ZSAgICAgICAgICAgICAgICAgTW9kaWZpY2F0aW9uIGxvZ3MKLQlTaGlhbmcgVHUgICAgQXVnLTI4LTIwMDgJaW5pdCB2ZXJzaW9uCisJTmFtZSAgICAgICAgICAJCURhdGUgICAgICAgICAgICAgICAgIE1vZGlmaWNhdGlvbiBsb2dzCisJU2hpYW5nIFR1ICAgIAkJQXVnLTI4LTIwMDggCSAgICAgaW5pdCB2ZXJzaW9uCisJSnVzdGluIFAuIE1hdHRvY2sJMTEvMDcvMjAxMAkgICAgIEZpeCBhIHR5cG8KIAogKi8KIApAQCAtNTEsOCArNTIsOCBAQAogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLSBUaW1lciBSZWxhdGVkIE1BUkNPIC0tLS0tLS0tLS0tLS0tLSovCiAvKiBJbiBzb21lIG9zIG9yIGNoaXBzZXQsIHdlIGhhdmUgYSBsb3Qgb2YgdGltZXIgZnVuY3Rpb25zIGFuZCB3aWxsIHJlYWQvd3JpdGUgcmVnaXN0ZXIsICovCi0vKiAgIGl0J3Mgbm90IGFsbG93ZWQgaW4gTGludXggVVNCIHN1Yi1zeXN0ZW0gdG8gZG8gaXQgKCBiZWNhdXNlIG9mIHNsZWVwIGlzc3VlIHdoZW4gKi8KLS8qICBzdWJtaXQgdG8gY3RybCBwaXBlKS4gU28gd2UgbmVlZCBhIHdyYXBwZXIgZnVuY3Rpb24gdG8gdGFrZSBjYXJlIGl0LiAqLworLyogaXQncyBub3QgYWxsb3dlZCBpbiBMaW51eCBVU0Igc3ViLXN5c3RlbSB0byBkbyBpdCAoIGJlY2F1c2Ugb2Ygc2xlZXAgaXNzdWUgd2hlbiAqLworLyogc3VibWl0IHRvIGN0cmwgcGlwZSkuIFNvIHdlIG5lZWQgYSB3cmFwcGVyIGZ1bmN0aW9uIHRvIHRha2UgY2FyZSBpdC4gKi8KIAogI2lmZGVmIFJUTVBfVElNRVJfVEFTS19TVVBQT1JUCiB0eXBlZGVmIHZvaWQoKlJUTVBfVElNRVJfVEFTS19IQU5ETEUpICh2b2lkICpTeXN0ZW1TcGVjaWZpYzEsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3NwZWN0cnVtLmggYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3NwZWN0cnVtLmgKaW5kZXggNjQ4ZmQ2My4uNGMzMjViYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9zcGVjdHJ1bS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvc3BlY3RydW0uaApAQCAtMzcsNyArMzcsNyBAQAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAJRGVzY3JpcHRpb246CiAJCVByZXBhcmUgTWVhc3VyZW1lbnQgcmVxdWVzdCBhY3Rpb24gZnJhbWUgYW5kIGVucXVldWUgaXQgaW50bwotCQltYW5hZ2VtZW50IHF1ZXVlIHdhaXRpbmcgZm9yIHRyYW5zbWl0aW9uLgorCQltYW5hZ2VtZW50IHF1ZXVlIHdhaXRpbmcgZm9yIHRyYW5zbWlzc2lvbi4KIAogCVBhcmFtZXRyczoKIAkJMS4gdGhlIGRlc3RpbmF0aW9uIG1hYyBhZGRyZXNzIG9mIHRoZSBmcmFtZS4KQEAgLTYwLDcgKzYwLDcgQEAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCURlc2NyaXB0aW9uOgogCQlQcmVwYXJlIE1lYXN1cmVtZW50IHJlcG9ydCBhY3Rpb24gZnJhbWUgYW5kIGVucXVldWUgaXQgaW50bwotCQltYW5hZ2VtZW50IHF1ZXVlIHdhaXRpbmcgZm9yIHRyYW5zbWl0aW9uLgorCQltYW5hZ2VtZW50IHF1ZXVlIHdhaXRpbmcgZm9yIHRyYW5zbWlzc2lvbi4KIAogCVBhcmFtZXRyczoKIAkJMS4gdGhlIGRlc3RpbmF0aW9uIG1hYyBhZGRyZXNzIG9mIHRoZSBmcmFtZS4KQEAgLTgwLDcgKzgwLDcgQEAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCURlc2NyaXB0aW9uOgogCQlQcmVwYXJlIFRQQyBSZXF1ZXN0IGFjdGlvbiBmcmFtZSBhbmQgZW5xdWV1ZSBpdCBpbnRvCi0JCW1hbmFnZW1lbnQgcXVldWUgd2FpdGluZyBmb3IgdHJhbnNtaXRpb24uCisJCW1hbmFnZW1lbnQgcXVldWUgd2FpdGluZyBmb3IgdHJhbnNtaXNzaW9uLgogCiAJUGFyYW1ldHJzOgogCQkxLiB0aGUgZGVzdGluYXRpb24gbWFjIGFkZHJlc3Mgb2YgdGhlIGZyYW1lLgpAQCAtOTQsNyArOTQsNyBAQAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAJRGVzY3JpcHRpb246CiAJCVByZXBhcmUgVFBDIFJlcG9ydCBhY3Rpb24gZnJhbWUgYW5kIGVucXVldWUgaXQgaW50bwotCQltYW5hZ2VtZW50IHF1ZXVlIHdhaXRpbmcgZm9yIHRyYW5zbWl0aW9uLgorCQltYW5hZ2VtZW50IHF1ZXVlIHdhaXRpbmcgZm9yIHRyYW5zbWlzc2lvbi4KIAogCVBhcmFtZXRyczoKIAkJMS4gdGhlIGRlc3RpbmF0aW9uIG1hYyBhZGRyZXNzIG9mIHRoZSBmcmFtZS4KQEAgLTExMCw3ICsxMTAsNyBAQAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAJRGVzY3JpcHRpb246CiAJCVByZXBhcmUgQ2hhbm5lbCBTd2l0Y2ggQW5ub3VuY2VtZW50IGFjdGlvbiBmcmFtZSBhbmQgZW5xdWV1ZSBpdCBpbnRvCi0JCW1hbmFnZW1lbnQgcXVldWUgd2FpdGluZyBmb3IgdHJhbnNtaXRpb24uCisJCW1hbmFnZW1lbnQgcXVldWUgd2FpdGluZyBmb3IgdHJhbnNtaXNzaW9uLgogCiAJUGFyYW1ldHJzOgogCQkxLiB0aGUgZGVzdGluYXRpb24gbWFjIGFkZHJlc3Mgb2YgdGhlIGZyYW1lLgpAQCAtMTI2LDcgKzEyNiw3IEBACiAvKgogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAJRGVzY3JpcHRpb246Ci0JCVNwZWN0cnVuIGFjdGlvbiBmcmFtZXMgSGFuZGxlciBzdWNoIGFzIGNoYW5uZWwgc3dpdGNoIGFubm91Y2VtZW50LAorCQlTcGVjdHJ1biBhY3Rpb24gZnJhbWVzIEhhbmRsZXIgc3VjaCBhcyBjaGFubmVsIHN3aXRjaCBhbm5vdW5jZW1lbnQsCiAJCW1lYXN1cmVtZW50IHJlcG9ydCwgbWVhc3VyZW1lbnQgcmVxdWVzdCBhY3Rpb25zIGZyYW1lcy4KIAogCVBhcmFtZXRyczoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvc3RhL2Fzc29jLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3N0YS9hc3NvYy5jCmluZGV4IGI3ZWZiMGIuLjU5ZTkzMWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvc3RhL2Fzc29jLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9zdGEvYXNzb2MuYwpAQCAtMzIsNyArMzIsOCBAQAogCVJldmlzaW9uIEhpc3Rvcnk6CiAJV2hvCQkJV2hlbgkJCVdoYXQKIAktLS0tLS0tLQktLS0tLS0tLS0tCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JSm9obgkJMjAwNC05LTMJCXBvcnRpbmcgZnJvbSBSVDI1MDAKKwlKb2huCQkJMjAwNC05LTMJCXBvcnRpbmcgZnJvbSBSVDI1MDAKKwlKdXN0aW4gUC4gTWF0dG9jawkxMS8wNy8yMDEwCQlGaXggdHlwb3MKICovCiAjaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCiAKQEAgLTI3NywxMCArMjc4LDEwIEBACiAJdTE2IFZhckllc09mZnNldDsKIAl1MTYgU3RhdHVzOwogCi0JLyogQmxvY2sgYWxsIGF1dGhlbnRpY2F0aW9uIHJlcXVlc3QgZHVybmluZyBXUEEgYmxvY2sgcGVyaW9kICovCisJLyogQmxvY2sgYWxsIGF1dGhlbnRpY2F0aW9uIHJlcXVlc3QgZHVyaW5nIFdQQSBibG9jayBwZXJpb2QgKi8KIAlpZiAocEFkLT5TdGFDZmcuYkJsb2NrQXNzb2MgPT0gVFJVRSkgewogCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKLQkJCSAoIkFTU09DIC0gQmxvY2sgQXNzb2MgcmVxdWVzdCBkdXJuaW5nIFdQQSBibG9jayBwZXJpb2QhXG4iKSk7CisJCQkgKCJBU1NPQyAtIEJsb2NrIEFzc29jIHJlcXVlc3QgZHVyaW5nIFdQQSBibG9jayBwZXJpb2QhXG4iKSk7CiAJCXBBZC0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlID0gQVNTT0NfSURMRTsKIAkJU3RhdHVzID0gTUxNRV9TVEFURV9NQUNISU5FX1JFSkVDVDsKIAkJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX0FTU09DX0NPTkYsIDIsCkBAIC02MDUsMTAgKzYwNiwxMCBAQAogCXU4ICpwT3V0QnVmZmVyID0gTlVMTDsKIAl1MTYgU3RhdHVzOwogCi0JLyogQmxvY2sgYWxsIGF1dGhlbnRpY2F0aW9uIHJlcXVlc3QgZHVybmluZyBXUEEgYmxvY2sgcGVyaW9kICovCisJLyogQmxvY2sgYWxsIGF1dGhlbnRpY2F0aW9uIHJlcXVlc3QgZHVyaW5nIFdQQSBibG9jayBwZXJpb2QgKi8KIAlpZiAocEFkLT5TdGFDZmcuYkJsb2NrQXNzb2MgPT0gVFJVRSkgewogCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKLQkJCSAoIkFTU09DIC0gQmxvY2sgUmVBc3NvYyByZXF1ZXN0IGR1cm5pbmcgV1BBIGJsb2NrIHBlcmlvZCFcbiIpKTsKKwkJCSAoIkFTU09DIC0gQmxvY2sgUmVBc3NvYyByZXF1ZXN0IGR1cmluZyBXUEEgYmxvY2sgcGVyaW9kIVxuIikpOwogCQlwQWQtPk1sbWUuQXNzb2NNYWNoaW5lLkN1cnJTdGF0ZSA9IEFTU09DX0lETEU7CiAJCVN0YXR1cyA9IE1MTUVfU1RBVEVfTUFDSElORV9SRUpFQ1Q7CiAJCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9SRUFTU09DX0NPTkYsIDIsCkBAIC0xMDAxLDcgKzEwMDIsNyBAQAogCXBBZC0+TWxtZUF1eC5DYXBhYmlsaXR5SW5mbyA9CiAJICAgIENhcGFiaWxpdHlJbmZvICYgU1VQUE9SVEVEX0NBUEFCSUxJVFlfSU5GTzsKIAotCS8qIFNvbWUgSFQgQVAgbWlnaHQgbG9zdCBXTU0gSUUuIFdlIGFkZCBXTU0gb3Vyc2VsdmVzLiBiZWFjdWFzZSBIVCByZXF1aXJlcyBRb1Mgb24uICovCisJLyogU29tZSBIVCBBUCBtaWdodCBsb3N0IFdNTSBJRS4gV2UgYWRkIFdNTSBvdXJzZWx2ZXMuIGJlY2F1c2UgSFQgcmVxdWlyZXMgUW9TIG9uLiAqLwogCWlmICgoSHRDYXBhYmlsaXR5TGVuID4gMCkgJiYgKHBFZGNhUGFybS0+YlZhbGlkID09IEZBTFNFKSkgewogCQlwRWRjYVBhcm0tPmJWYWxpZCA9IFRSVUU7CiAJCXBFZGNhUGFybS0+QWlmc25bMF0gPSAzOwpAQCAtMTA1NCw3ICsxMDU1LDcgQEAKIAkvKiBTZXQgTmV3IFdQQSBpbmZvcm1hdGlvbiAqLwogCUlkeCA9IEJzc1RhYmxlU2VhcmNoKCZwQWQtPlNjYW5UYWIsIHBBZGRyMiwgcEFkLT5NbG1lQXV4LkNoYW5uZWwpOwogCWlmIChJZHggPT0gQlNTX05PVF9GT1VORCkgewotCQlEQkdQUklOVF9FUlIoKCJBU1NPQyAtIENhbid0IGZpbmQgQlNTIGFmdGVyIHJlY2VpdmluZyBBc3NvYyByZXNwb25zZVxuIikpOworCQlEQkdQUklOVF9FUlIoIkFTU09DIC0gQ2FuJ3QgZmluZCBCU1MgYWZ0ZXIgcmVjZWl2aW5nIEFzc29jIHJlc3BvbnNlXG4iKTsKIAl9IGVsc2UgewogCQkvKiBJbml0IHZhcmlhYmxlICovCiAJCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uUlNOSUVfTGVuID0gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvc3RhL2F1dGguYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvc3RhL2F1dGguYwppbmRleCA0MDRiZDIyLi4yM2VhMDBiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3N0YS9hdXRoLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9zdGEvYXV0aC5jCkBAIC0zMiw3ICszMiw4IEBACiAJUmV2aXNpb24gSGlzdG9yeToKIAlXaG8JCQlXaGVuCQkJV2hhdAogCS0tLS0tLS0tCS0tLS0tLS0tLS0JCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQlKb2huCQkyMDA0LTktMwkJcG9ydGluZyBmcm9tIFJUMjUwMAorCUpvaG4JCQkyMDA0LTktMwkJcG9ydGluZyBmcm9tIFJUMjUwMAorCUp1c3RpbiBQLiBNYXR0b2NrCTExLzA3LzIwMTAJCUZpeCB0eXBvcwogKi8KICNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKIApAQCAtNDU1LDEwICs0NTYsMTAgQEAKIAl1OCAqcE91dEJ1ZmZlciA9IE5VTEw7CiAJdW5zaWduZWQgbG9uZyBGcmFtZUxlbiA9IDAsIHRtcCA9IDA7CiAKLQkvKiBCbG9jayBhbGwgYXV0aGVudGljYXRpb24gcmVxdWVzdCBkdXJuaW5nIFdQQSBibG9jayBwZXJpb2QgKi8KKwkvKiBCbG9jayBhbGwgYXV0aGVudGljYXRpb24gcmVxdWVzdCBkdXJpbmcgV1BBIGJsb2NrIHBlcmlvZCAqLwogCWlmIChwQWQtPlN0YUNmZy5iQmxvY2tBc3NvYyA9PSBUUlVFKSB7CiAJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAotCQkJICgiJXMgLSBCbG9jayBBdXRoIHJlcXVlc3QgZHVybmluZyBXUEEgYmxvY2sgcGVyaW9kIVxuIiwKKwkJCSAoIiVzIC0gQmxvY2sgQXV0aCByZXF1ZXN0IGR1cmluZyBXUEEgYmxvY2sgcGVyaW9kIVxuIiwKIAkJCSAgcFNNTmFtZSkpOwogCQlwQWQtPk1sbWUuQXV0aE1hY2hpbmUuQ3VyclN0YXRlID0gQVVUSF9SRVFfSURMRTsKIAkJU3RhdHVzID0gTUxNRV9TVEFURV9NQUNISU5FX1JFSkVDVDsKQEAgLTUwOCw4ICs1MDksNyBAQAogCQlSVE1QU2V0VGltZXIocEF1dGhUaW1lciwgVGltZW91dCk7CiAJCXJldHVybiBUUlVFOwogCX0gZWxzZSB7Ci0JCURCR1BSSU5UX0VSUigoIiVzIC0gTWxtZUF1dGhSZXFBY3Rpb24oKSBzYW5pdHkgY2hlY2sgZmFpbGVkXG4iLAotCQkJICAgICAgcFNNTmFtZSkpOworCQlEQkdQUklOVF9FUlIoIiVzIC0gTWxtZUF1dGhSZXFBY3Rpb24oKSBzYW5pdHkgY2hlY2sgZmFpbGVkXG4iLCBwU01OYW1lKTsKIAkJcmV0dXJuIEZBTFNFOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9zdGEvY29ubmVjdC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9zdGEvY29ubmVjdC5jCmluZGV4IGMzODA1NTEuLjQ5OTYyNTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvc3RhL2Nvbm5lY3QuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3N0YS9jb25uZWN0LmMKQEAgLTMyLDcgKzMyLDggQEAKIAlSZXZpc2lvbiBIaXN0b3J5OgogCVdobwkJCVdoZW4JCQlXaGF0CiAJLS0tLS0tLS0JLS0tLS0tLS0tLQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCUpvaG4JCQkyMDA0LTA4LTA4CQkJTWFqb3IgbW9kaWZpY2F0aW9uIGZyb20gUlQyNTYwCisJSm9obgkJCTIwMDQtMDgtMDgJCU1ham9yIG1vZGlmaWNhdGlvbiBmcm9tIFJUMjU2MAorCUp1c3RpbiBQLiBNYXR0b2NrCTExLzA3LzIwMTAJCUZpeCB0eXBvcwogKi8KICNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKIApAQCAtNjQsNyArNjUsNyBAQAogCiAvKiBUaGUgZm9sbG93aW5nIE1BQ1JPIGlzIGNhbGxlZCBhZnRlciAxLiBzdGFydGluZyBhbiBuZXcgSUJTUywgMi4gc3VjY2Vzc2Z1bGx5IEpPSU4gYW4gSUJTUywgKi8KIC8qIG9yIDMuIHN1Y2Nlc3NmdWxseSBBU1NPQ0lBVEUgdG8gYSBCU1MsIDQuIHN1Y2Nlc3NmdWxseSBSRV9BU1NPQ0lBVEUgdG8gYSBCU1MgKi8KLS8qIEFsbCBzZXR0aW5ncyBzdWNjZXNzZnVseSBuZWdvdGlhdGVkIGZ1cmluZyBNTE1FIHN0YXRlIG1hY2hpbmVzIGJlY29tZSBmaW5hbCBzZXR0aW5ncyAqLworLyogQWxsIHNldHRpbmdzIHN1Y2Nlc3NmdWx5IG5lZ290aWF0ZWQgZmlyaW5nIE1MTUUgc3RhdGUgbWFjaGluZXMgYmVjb21lIGZpbmFsIHNldHRpbmdzICovCiAvKiBhbmQgYXJlIGNvcGllZCB0byBwQWQtPlN0YUFjdGl2ZSAqLwogI2RlZmluZSBDT1BZX1NFVFRJTkdTX0ZST01fTUxNRV9BVVhfVE9fQUNUSVZFX0NGRyhfcEFkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCkBAIC0yMTQsOCArMjE1LDcgQEAKIAkJYnJlYWs7CiAjZW5kaWYgLyogUlRNUF9NQUNfVVNCIC8vICovCiAJZGVmYXVsdDoKLQkJREJHUFJJTlRfRVJSKCgiRVJST1IhIENOVEwgLSBJbGxlZ2FsIG1lc3NhZ2UgdHlwZSg9JWxkKSIsCi0JCQkgICAgICBFbGVtLT5Nc2dUeXBlKSk7CisJCURCR1BSSU5UX0VSUigiRVJST1IhIENOVEwgLSBJbGxlZ2FsIG1lc3NhZ2UgdHlwZSg9JWxkKSIsIEVsZW0tPk1zZ1R5cGUpOwogCQlicmVhazsKIAl9CiB9CkBAIC01NTMsNyArNTUzLDcgQEAKIAlOZGlzTW92ZU1lbW9yeSgmcEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIuQnNzRW50cnlbMF0sCiAJCSAgICAgICAmcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0Jzc0lkeF0sIHNpemVvZihzdHJ1Y3QgcnRfYnNzX2VudHJ5KSk7CiAKLQkvKiBBZGQgU1NJRCBpbnRvIE1sbWVBdXggZm9yIHNpdGUgc3VyZXkgam9pbmluZyBoaWRkZW4gU1NJRCAqLworCS8qIEFkZCBTU0lEIGludG8gTWxtZUF1eCBmb3Igc2l0ZSBzdXJ2ZXkgam9pbmluZyBoaWRkZW4gU1NJRCAqLwogCXBBZC0+TWxtZUF1eC5Tc2lkTGVuID0gcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0Jzc0lkeF0uU3NpZExlbjsKIAlOZGlzTW92ZU1lbW9yeShwQWQtPk1sbWVBdXguU3NpZCwgcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0Jzc0lkeF0uU3NpZCwKIAkJICAgICAgIHBBZC0+TWxtZUF1eC5Tc2lkTGVuKTsKQEAgLTY2Niw3ICs2NjYsNyBAQAogfQogCiAvKiBSb2FtaW5nIGlzIHRoZSBvbmx5IGV4dGVybmFsIHJlcXVlc3QgdHJpZ2dlcmluZyBDTlRMIHN0YXRlIG1hY2hpbmUgKi8KLS8qIGRlc3BpdGUgb2Ygb3RoZXIgIlNFVCBPSUQiIG9wZXJhdGlvbi4gQWxsICJTRVQgT0lEIiByZWxhdGVkIG9lcmF0aW9ucyAqLworLyogZGVzcGl0ZSBvZiBvdGhlciAiU0VUIE9JRCIgb3BlcmF0aW9uLiBBbGwgIlNFVCBPSUQiIHJlbGF0ZWQgb3BlcmF0aW9ucyAqLwogLyogaGFwcGVuIGluIHNlcXVlbmNlLCBiZWNhdXNlIG5vIG90aGVyIFNFVCBPSUQgd2lsbCBiZSBzZW50IHRvIHRoaXMgZGV2aWNlICovCiAvKiB1bnRpbCB0aGUgdGhlIHByZXZpb3VzIFNFVCBvcGVyYXRpb24gaXMgY29tcGxldGUgKHN1Y2Nlc3NmdWwgbyBmYWlsZWQpLiAqLwogLyogU28sIGhvdyBkbyB3ZSBxdWFyYW50ZWUgdGhpcyBST0FNSU5HIHJlcXVlc3Qgd29uJ3QgY29ycnVwdCBvdGhlciAiU0VUIE9JRCI/ICovCkBAIC0xMjI0LDcgKzEyMjQsNyBAQAogCS8qIENoYW5nZSB0byBBUCBjaGFubmVsICovCiAJaWYgKChwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCA+IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpCiAJICAgICYmIChwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5DaGFubmVsV2lkdGggPT0gQldfNDApKSB7Ci0JCS8qIE11c3QgdXNpbmcgNDBNSHouICovCisJCS8qIE11c3QgdXNlIDQwTUh6LiAqLwogCQlwQWQtPkNvbW1vbkNmZy5CQlBDdXJyZW50QlcgPSBCV180MDsKIAkJQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCwgRkFMU0UpOwogCQlBc2ljTG9ja0NoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCk7CkBAIC0xMjU5LDcgKzEyNTksNyBAQAogCX0gZWxzZSBpZiAoKHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsIDwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkKIAkJICAgJiYgKHBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLkNoYW5uZWxXaWR0aCA9PQogCQkgICAgICAgQldfNDApKSB7Ci0JCS8qIE11c3QgdXNpbmcgNDBNSHouICovCisJCS8qIE11c3QgdXNlIDQwTUh6LiAqLwogCQlwQWQtPkNvbW1vbkNmZy5CQlBDdXJyZW50QlcgPSBCV180MDsKIAkJQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCwgRkFMU0UpOwogCQlBc2ljTG9ja0NoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCk7CkBAIC0xMzQzLDEyICsxMzQzLDEyIEBACiAJQXNpY1NldFNsb3RUaW1lKHBBZCwgVFJVRSk7CiAJQXNpY1NldEVkY2FQYXJtKHBBZCwgJnBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0pOwogCi0JLyogQ2FsbCB0aGlzIGZvciBSVFMgcHJvdGVjdGlvbmZvciBsZWdhY3kgcmF0ZSwgd2Ugd2lsbCBhbHdheXMgZW5hYmxlIFJUUyB0aHJlc2hvbGQsIGJ1dCBub3JtYWxseSBpdCB3aWxsIG5vdCBoaXQgKi8KKwkvKiBDYWxsIHRoaXMgZm9yIFJUUyBwcm90ZWN0aW9uIGZvciBsZWdhY3kgcmF0ZSwgd2Ugd2lsbCBhbHdheXMgZW5hYmxlIFJUUyB0aHJlc2hvbGQsIGJ1dCBub3JtYWxseSBpdCB3aWxsIG5vdCBoaXQgKi8KIAlBc2ljVXBkYXRlUHJvdGVjdChwQWQsIDAsIChPRkRNU0VUUFJPVEVDVCB8IENDS1NFVFBST1RFQ1QpLCBUUlVFLAogCQkJICBGQUxTRSk7CiAKIAlpZiAoKHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uYkh0RW5hYmxlID09IFRSVUUpKSB7Ci0JCS8qIFVwZGF0ZSBIVCBwcm90ZWN0aW9uZm9yIGJhc2VkIG9uIEFQJ3Mgb3BlcmF0aW5nIG1vZGUuICovCisJCS8qIFVwZGF0ZSBIVCBwcm90ZWN0aW9uIGZvciBiYXNlZCBvbiBBUCdzIG9wZXJhdGluZyBtb2RlLiAqLwogCQlpZiAocEFkLT5NbG1lQXV4LkFkZEh0SW5mby5BZGRIdEluZm8yLk5vbkdmUHJlc2VudCA9PSAxKSB7CiAJCQlBc2ljVXBkYXRlUHJvdGVjdChwQWQsCiAJCQkJCSAgcEFkLT5NbG1lQXV4LkFkZEh0SW5mby5BZGRIdEluZm8yLgpAQCAtMTUzMCw3ICsxNTMwLDcgQEAKIAkJLyogQWRkIEJTU0lEIHRvIFdDSUQgc2VhcmNoIHRhYmxlICovCiAJCUFzaWNVcGRhdGVSeFdDSURUYWJsZShwQWQsIEJTU0lEX1dDSUQsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKIAotCQkvKiBJZiBXRVAgaXMgZW5hYmxlZCwgYWRkIHBhaWV3aXNlIGFuZCBzaGFyZWQga2V5ICovCisJCS8qIElmIFdFUCBpcyBlbmFibGVkLCBhZGQgcGFpcndpc2UgYW5kIHNoYXJlZCBrZXkgKi8KIAkJaWYgKCgocEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQKSAmJgogCQkgICAgIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMVdFUEVuYWJsZWQpICYmCiAJCSAgICAgKHBBZC0+U3RhQ2ZnLlBvcnRTZWN1cmVkID09IFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEKSkgfHwKQEAgLTE2ODEsOSArMTY4MSw5IEBACiAJcEFkLT5NbG1lLlBlcmlvZGljUm91bmQgPSAwOwogCXBBZC0+TWxtZS5PbmVTZWNQZXJpb2RpY1JvdW5kID0gMDsKIAlwQWQtPmJDb25maWdDaGFuZ2VkID0gRkFMU0U7CS8qIFJlc2V0IGNvbmZpZyBmbGFnICovCi0JcEFkLT5FeHRyYUluZm8gPSBHRU5FUkFMX0xJTktfVVA7CS8qIFVwZGF0ZSBleHRyYSBpbmZvcm1hdGlvbiB0byBsaW5rIGlzIHVwICovCisJcEFkLT5FeHRyYUluZm8gPSBHRU5FUkFMX0xJTktfVVA7CS8qIFVwZGF0ZSBleHRyYSBpbmZvcm1hdGlvbiBhZnRlciBsaW5rIGlzIHVwICovCiAKLQkvKiBTZXQgYXNpYyBhdXRvIGZhbGwgYmFjayAqLworCS8qIFNldCBiYXNpYyBhdXRvIGZhbGwgYmFjayAqLwogCXsKIAkJdTggKnBUYWJsZTsKIAkJdTggVGFibGVTaXplID0gMDsKQEAgLTE4NTQsOCArMTg1NCw4IEBACiAJTm90ZToKIAkJV2UgbmVlZCBtb3JlIGluZm9ybWF0aW9uIHRvIGtub3cgaXQncyB0aGlzIHJlcXVzdCBmcm9tIEFQLgogCQlJZiB5ZXMhIHdlIG5lZWQgdG8gZG8gZXh0cmEgaGFuZGxpbmcsIGZvciBleGFtcGxlLCByZW1vdmUgdGhlIFdQQSBrZXkuCi0JCU90aGVyd2lzZSBvbiA0LXdheSBoYW5kc2hha2luZyB3aWxsIGZhaWVkLCBzaW5jZSB0aGUgV1BBIGtleSBkaWRuJ3QgYmUKLQkJcmVtb3ZlIHdoaWxlIGF1dG8gcmVjb25uZWN0LgorCQlPdGhlcndpc2Ugb24gNC13YXkgaGFuZHNoYWtpbmcgd2lsbCBmYWlsLCBzaW5jZSB0aGUgV1BBIGtleSBkaWRuJ3QgZ2V0CisJCXJlbW92ZWQgd2hpbGUgYXV0byByZWNvbm5lY3QuCiAJCURpc2Nvbm5lY3QgcmVxdWVzdCBmcm9tIEFQLCBpdCBtZWFucyB3ZSB3aWxsIHN0YXJ0IGFmcmVzaCA0LXdheSBoYW5kc2hha2luZwogCQlvbiBXUEEgbW9kZS4KIApAQCAtMTg3MCw5ICsxODcwLDkgQEAKIAkJcmV0dXJuOwogCiAJUlRNUF9DTEVBUl9QU0ZMQUcocEFkLCBmUlRNUF9QU19HT19UT19TTEVFUF9OT1cpOwotCS8qQ29tbWVudCB0aGUgY29kZXMsIGJlYXN1ZSB0aGUgbGluZSAyMjkxIGNhbGwgdGhlIHNhbWUgZnVuY3Rpb24uICovCi0JLypSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZS5Qc1BvbGxUaW1lciwgICAgICAgICAgICAgICAmQ2FuY2VsbGVkKTsgKi8KLQkvKiBOb3QgYWxsb3cgZ28gdG8gc2xlZXAgd2l0aGluIGxpbmtkb3duIGZ1bmN0aW9uLiAqLworCS8qIENvbW1lbnQgdGhlIGNvZGVzLCBiZWNhdXNlIHRoZSBsaW5lIDIyOTEgY2FsbCB0aGUgc2FtZSBmdW5jdGlvbi4gKi8KKwkvKiBSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZS5Qc1BvbGxUaW1lciwgJkNhbmNlbGxlZCk7ICovCisJLyogTm90IGFsbG93ZWQgZ28gdG8gc2xlZXAgd2l0aGluIHRoZSBsaW5rZG93biBmdW5jdGlvbi4gKi8KIAlSVE1QX0NMRUFSX1BTRkxBRyhwQWQsIGZSVE1QX1BTX0NBTl9HT19TTEVFUCk7CiAKIAlpZiAocEFkLT5Db21tb25DZmcuYldpcmVsZXNzRXZlbnQpIHsKQEAgLTE5NzAsNyArMTk3MCw3IEBACiAJLyogU2V0IExFRCAqLwogCVJUTVBTZXRMRUQocEFkLCBMRURfTElOS19ET1dOKTsKIAlwQWQtPkxlZEluZGljYXRvclN0cmVuZ3RoID0gMHhGMDsKLQlSVE1QU2V0U2lnbmFsTEVEKHBBZCwgLTEwMCk7CS8qIEZvcmNlIHNpZ25hbCBzdHJlbmd0aCBMZWQgdG8gYmUgdHVybmVkIG9mZiwgZmlybXdhcmUgaXMgbm90IGRvbmUgaXQuICovCisJUlRNUFNldFNpZ25hbExFRChwQWQsIC0xMDApOwkvKiBGb3JjZSBzaWduYWwgc3RyZW5ndGggTGVkIHRvIGJlIHR1cm5lZCBvZmYsIGZpcm13YXJlIGhhcyBub3QgZG9uZSBpdC4gKi8KIAogCUFzaWNEaXNhYmxlU3luYyhwQWQpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3N0YS9ydG1wX2RhdGEuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvc3RhL3J0bXBfZGF0YS5jCmluZGV4IDIzODc5YjcuLmU4MmM2YjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvc3RhL3J0bXBfZGF0YS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvc3RhL3J0bXBfZGF0YS5jCkBAIC0zMSw3ICszMSw4IEBACiAJRGF0YSBwYXRoIHN1YnJvdXRpbmVzCiAKIAlSZXZpc2lvbiBIaXN0b3J5OgotCVdobyAJCVdoZW4JCQlXaGF0CisJV2hvIAkgIAkJV2hlbgkJV2hhdAorCUp1c3RpbiBQLiBNYXR0b2NrCTExLzA3LzIwMTAJRml4IHR5cG9zCiAJLS0tLS0tLS0JLS0tLS0tLS0tLQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKi8KICNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKQEAgLTI1Nyw4ICsyNTgsOCBAQAogCQkgICAgJiYgKHBBZC0+Q29tbW9uQ2ZnLmJEaXNhYmxlUmVvcmRlcmluZyA9PSAwKSkgewogCQkJSW5kaWNhdGVfQU1QRFVfUGFja2V0KHBBZCwgcFJ4QmxrLCBGcm9tV2hpY2hCU1NJRCk7CiAJCX0gZWxzZSB7Ci0JCQkvKiBEZXRlcm1pbiB0aGUgZGVzdGluYXRpb24gb2YgdGhlIEVBUCBmcmFtZSAqLwotCQkJLyogIHRvIFdQQSBzdGF0ZSBtYWNoaW5lIG9yIHVwcGVyIGxheWVyICovCisJCQkvKiBEZXRlcm1pbmUgdGhlIGRlc3RpbmF0aW9uIG9mIHRoZSBFQVAgZnJhbWUgKi8KKwkJCS8qIHRvIFdQQSBzdGF0ZSBtYWNoaW5lIG9yIHVwcGVyIGxheWVyICovCiAJCQlTVEFSeEVBUE9MRnJhbWVJbmRpY2F0ZShwQWQsIHBFbnRyeSwgcFJ4QmxrLAogCQkJCQkJRnJvbVdoaWNoQlNTSUQpOwogCQl9CkBAIC02NDQsNyArNjQ1LDcgQEAKIAogCQkvKiBGaXJzdCBjaGVjayB0aGUgc2l6ZSwgaXQgTVVTVCBub3QgZXhjZWVkIHRoZSBtbG1lIHF1ZXVlIHNpemUgKi8KIAkJaWYgKHBSeFdJLT5NUERVdG90YWxCeXRlQ291bnQgPiBNR01UX0RNQV9CVUZGRVJfU0laRSkgewotCQkJREJHUFJJTlRfRVJSKCgiU1RBSGFuZGxlUnhNZ210RnJhbWU6IGZyYW1lIHRvbyBsYXJnZSwgc2l6ZSA9ICVkIFxuIiwgcFJ4V0ktPk1QRFV0b3RhbEJ5dGVDb3VudCkpOworCQkJREJHUFJJTlRfRVJSKCJTVEFIYW5kbGVSeE1nbXRGcmFtZTogZnJhbWUgdG9vIGxhcmdlLCBzaXplID0gJWQgXG4iLCBwUnhXSS0+TVBEVXRvdGFsQnl0ZUNvdW50KTsKIAkJCWJyZWFrOwogCQl9CiAKQEAgLTg1Myw3ICs4NTQsNyBAQAogCU5PTkUKIAogTm90ZToKLQlUaGlzIGZ1bmN0aW9uIGRvIGVhcmx5IGNoZWNraW5nIGFuZCBjbGFzc2lmaWNhdGlvbiBmb3Igc2VuZC1vdXQgcGFja2V0LgorCVRoaXMgZnVuY3Rpb24gZG9lcyBlYXJseSBjaGVja2luZyBhbmQgY2xhc3NpZmljYXRpb24gZm9yIHNlbmQtb3V0IHBhY2tldC4KIAlZb3Ugb25seSBjYW4gcHV0IE9TLWRlcGVuZWQgJiBTVEEgcmVsYXRlZCBjb2RlIGluIGhlcmUuCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCkBAIC05NDMsNyArOTQ0LDcgQEAKIAkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCiAJCQkgKCJTVEFTZW5kUGFja2V0IC0tPiBwU3JjQnVmVkEgPT0gTlVMTCAhU3JjQnVmTGVuPSV4XG4iLAogCQkJICBTcmNCdWZMZW4pKTsKLQkJLyogUmVzb3VyZWNlIGlzIGxvdywgc3lzdGVtIGRpZCBub3QgYWxsb2NhdGUgdmlydHVhbCBhZGRyZXNzICovCisJCS8qIFJlc291cmNlIGlzIGxvdywgc3lzdGVtIGRpZCBub3QgYWxsb2NhdGUgdmlydHVhbCBhZGRyZXNzICovCiAJCS8qIHJldHVybiBORElTX1NUQVRVU19GQUlMVVJFIGRpcmVjdGx5IHRvIHVwcGVyIGxheWVyICovCiAJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKIAkJcmV0dXJuIE5ESVNfU1RBVFVTX0ZBSUxVUkU7CkBAIC05NzksNyArOTgwLDcgQEAKIAkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCiAJCQkoIlNUQVNlbmRQYWNrZXQtPkNhbm5vdCBmaW5kIHBFbnRyeSglcE0pIGluIE1hY1RhYiFcbiIsCiAJCQkJcFNyY0J1ZlZBKSk7Ci0JCS8qIFJlc291cmVjZSBpcyBsb3csIHN5c3RlbSBkaWQgbm90IGFsbG9jYXRlIHZpcnR1YWwgYWRkcmVzcyAqLworCQkvKiBSZXNvdXJjZSBpcyBsb3csIHN5c3RlbSBkaWQgbm90IGFsbG9jYXRlIHZpcnR1YWwgYWRkcmVzcyAqLwogCQkvKiByZXR1cm4gTkRJU19TVEFUVVNfRkFJTFVSRSBkaXJlY3RseSB0byB1cHBlciBsYXllciAqLwogCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CiAJCXJldHVybiBORElTX1NUQVRVU19GQUlMVVJFOwpAQCAtMTA1Nyw5ICsxMDU4LDkgQEAKIAogCS8qIFNURVAgMi4gQ2hlY2sgdGhlIHJlcXVpcmVtZW50IG9mIFJUUzogKi8KIAkvKiAgICAgICAgIElmIG11bHRpcGxlIGZyYWdtZW50IHJlcXVpcmVkLCBSVFMgaXMgcmVxdWlyZWQgb25seSBmb3IgdGhlIGZpcnN0IGZyYWdtZW50ICovCi0JLyogICAgICAgICBpZiB0aGUgZnJhZ21lbnQgc2l6ZSBsYXJnZSB0aGFuIFJUUyB0aHJlc2hvbGQgKi8KKwkvKiAgICAgICAgIGlmIHRoZSBmcmFnbWVudCBzaXplIGlzIGxhcmdlciB0aGFuIFJUUyB0aHJlc2hvbGQgKi8KIAkvKiAgICAgRm9yIFJUMjh4eCwgTGV0IEFTSUMgc2VuZCBSVFMvQ1RTICovCi0vKiAgICAgIFJUTVBfU0VUX1BBQ0tFVF9SVFMocFBhY2tldCwgMCk7ICovCisJLyogICAgICBSVE1QX1NFVF9QQUNLRVRfUlRTKHBQYWNrZXQsIDApOyAqLwogCWlmIChOdW1iZXJPZkZyYWcgPiAxKQogCQlSVFNSZXF1aXJlZCA9CiAJCSAgICAocEFkLT5Db21tb25DZmcuRnJhZ21lbnRUaHJlc2hvbGQgPgpAQCAtMTE3MSw4ICsxMTcyLDggQEAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAogCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0JCVRoaXMgc3Vicm91dGluZSB3aWxsIHNjYW4gdGhyb3VnaCByZWxlYXRpdmUgcmluZyBkZXNjcmlwdG9yIHRvIGZpbmQKLQkJb3V0IGF2YWxpYWJsZSBmcmVlIHJpbmcgZGVzY3JpcHRvciBhbmQgY29tcGFyZSB3aXRoIHJlcXVlc3Qgc2l6ZS4KKwkJVGhpcyBzdWJyb3V0aW5lIHdpbGwgc2NhbiB0aHJvdWdoIHJlbGF0aXZlIHJpbmcgZGVzY3JpcHRvciB0byBmaW5kCisJCW91dCBhdmFpbGFibGUgZnJlZSByaW5nIGRlc2NyaXB0b3IgYW5kIGNvbXBhcmUgd2l0aCByZXF1ZXN0IHNpemUuCiAKIAlBcmd1bWVudHM6CiAJCXBBZCBQb2ludGVyIHRvIG91ciBhZGFwdGVyCkBAIC0xNTg4LDcgKzE1ODksNyBAQAogCQlwSGVhZGVyQnVmUHRyICs9IDI7CiAJCXBUeEJsay0+TXBkdUhlYWRlckxlbiArPSAyOwogCX0KLQkvKiBwYWRkaW5nIGF0IGZyb250IG9mIExMQyBoZWFkZXIuIExMQyBoZWFkZXIgc2hvdWxkIGF0IDQtYnl0ZXMgYWxpZ21lbnQuICovCisJLyogcGFkZGluZyBhdCBmcm9udCBvZiBMTEMgaGVhZGVyLiBMTEMgaGVhZGVyIHNob3VsZCBhdCA0LWJ5dGVzIGFsaWdubWVudC4gKi8KIAlwVHhCbGstPkhkclBhZExlbiA9ICh1bnNpZ25lZCBsb25nKXBIZWFkZXJCdWZQdHI7CiAJcEhlYWRlckJ1ZlB0ciA9ICh1OCAqKVJPVU5EX1VQKHBIZWFkZXJCdWZQdHIsIDQpOwogCXBUeEJsay0+SGRyUGFkTGVuID0gKHVuc2lnbmVkIGxvbmcpKHBIZWFkZXJCdWZQdHIgLSBwVHhCbGstPkhkclBhZExlbik7CkBAIC0yMDE0LDcgKzIwMTUsNyBAQAogCQlwSGVhZGVyQnVmUHRyICs9IDI7CiAJCXBUeEJsay0+TXBkdUhlYWRlckxlbiArPSAyOwogCX0KLQkvKiBUaGUgcmVtYWluaW5nIGNvbnRlbnQgb2YgTVBEVSBoZWFkZXIgc2hvdWxkIGxvY2F0ZSBhdCA0LW9jdGV0cyBhbGlnbWVudCAqLworCS8qIFRoZSByZW1haW5pbmcgY29udGVudCBvZiBNUERVIGhlYWRlciBzaG91bGQgbG9jYXRlIGF0IDQtb2N0ZXRzIGFsaWdubWVudCAqLwogCXBUeEJsay0+SGRyUGFkTGVuID0gKHVuc2lnbmVkIGxvbmcpcEhlYWRlckJ1ZlB0cjsKIAlwSGVhZGVyQnVmUHRyID0gKHU4ICopUk9VTkRfVVAocEhlYWRlckJ1ZlB0ciwgNCk7CiAJcFR4QmxrLT5IZHJQYWRMZW4gPSAodW5zaWduZWQgbG9uZykocEhlYWRlckJ1ZlB0ciAtIHBUeEJsay0+SGRyUGFkTGVuKTsKQEAgLTIxMTQsNyArMjExNSw3IEBACiAJCQkgICAgU1RBX0J1aWxkX0FSYWxpbmtfRnJhbWVfSGVhZGVyKHBBZCwgcFR4QmxrKTsKIAogCQkJLyogSXQncyBvayB3cml0ZSB0aGUgVHhXSSBoZXJlLCBiZWNhdXNlIHRoZSBUeFdJLT5NUERVdG90YWxCeXRlQ291bnQgKi8KLQkJCS8qICAgICAgd2lsbCBiZSB1cGRhdGVkIGFmdGVyIGZpbmFsIGZyYW1lIHdhcyBoYW5kbGVkLiAqLworCQkJLyogd2lsbCBiZSB1cGRhdGVkIGFmdGVyIGZpbmFsIGZyYW1lIHdhcyBoYW5kbGVkLiAqLwogCQkJUlRNUFdyaXRlVHhXSV9EYXRhKHBBZCwKIAkJCQkJICAgKHN0cnVjdCBydF90eHdpICopICgmcFR4QmxrLT4KIAkJCQkJCQkgIEhlYWRlckJ1ZgpAQCAtMjI5MSw4ICsyMjkyLDggQEAKIAkJCQkgICAgICBwVHhCbGstPnBFeHRyYUxsY1NuYXBFbmNhcCwgcFR4QmxrLT5wS2V5LAogCQkJCSAgICAgIDApOwogCi0JCS8qIE5PVEU6IERPTidUIHJlZmVyIHRoZSBza2ItPmxlbiBkaXJlY3RseSBhZnRlciBmb2xsb3dpbmcgY29weS4gQmVjYXN1ZSB0aGUgbGVuZ3RoIGlzIG5vdCBhZGp1c3QgKi8KLQkJLyogICAgICAgICAgICAgICAgICAgICAgdG8gY29ycmVjdCBsZW5naHQsIHJlZmVyIHRvIHBUeEJsay0+U3JjQnVmTGVuIGZvciB0aGUgcGFja2V0IGxlbmd0aCBpbiBmb2xsb3dpbmcgcHJvZ3Jlc3MuICovCisJCS8qIE5PVEU6IERPTidUIHJlZmVyIHRoZSBza2ItPmxlbiBkaXJlY3RseSBhZnRlciBmb2xsb3dpbmcgY29weS4gQmVjYXVzZSB0aGUgbGVuZ3RoIGlzIG5vdCBhZGp1c3RlZCAqLworCQkvKiAgICAgICAgICAgICAgICAgICAgICB0byBjb3JyZWN0IGxlbmd0aCwgcmVmZXIgdG8gcFR4QmxrLT5TcmNCdWZMZW4gZm9yIHRoZSBwYWNrZXQgbGVuZ3RoIGluIGZvbGxvd2luZyBwcm9ncmVzcy4gKi8KIAkJTmRpc01vdmVNZW1vcnkocFR4QmxrLT5wU3JjQnVmRGF0YSArIHBUeEJsay0+U3JjQnVmTGVuLAogCQkJICAgICAgICZwQWQtPlByaXZhdGVJbmZvLlR4Lk1JQ1swXSwgOCk7CiAJCS8qc2tiX3B1dCgoUlRQS1RfVE9fT1NQS1QocFR4QmxrLT5wUGFja2V0KSktPnRhaWwsIDgpOyAqLwpAQCAtMjMwMSw3ICsyMzAyLDcgQEAKIAkJcFR4QmxrLT5DaXBoZXJBbGcgPSBDSVBIRVJfVEtJUF9OT19NSUM7CiAJfQogCS8qICovCi0JLyogY2FsY3VhdGUgdGhlIG92ZXJoZWFkIGJ5dGVzIHRoYXQgZW5jcnlwdGlvbiBhbGdvcml0aG0gbWF5IGFkZC4gVGhpcyAqLworCS8qIGNhbGN1bGF0ZSB0aGUgb3ZlcmhlYWQgYnl0ZXMgdGhhdCBlbmNyeXB0aW9uIGFsZ29yaXRobSBtYXkgYWRkLiBUaGlzICovCiAJLyogYWZmZWN0cyB0aGUgY2FsY3VsYXRlIG9mICJkdXJhdGlvbiIgZmllbGQgKi8KIAkvKiAqLwogCWlmICgocFR4QmxrLT5DaXBoZXJBbGcgPT0gQ0lQSEVSX1dFUDY0KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9zdGEvc2FuaXR5LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3N0YS9zYW5pdHkuYwppbmRleCA4ZjlmZDE5Li4wYzMyNjA0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3N0YS9zYW5pdHkuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3N0YS9zYW5pdHkuYwpAQCAtMzIsNyArMzIsOCBAQAogCVJldmlzaW9uIEhpc3Rvcnk6CiAJV2hvCQkJV2hlbgkJCVdoYXQKIAktLS0tLS0tLQktLS0tLS0tLS0tCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JSm9obiBDaGFuZyAgMjAwNC0wOS0wMSAgICAgIGFkZCBXTU0gc3VwcG9ydAorCUpvaG4gQ2hhbmcgIAkJMjAwNC0wOS0wMSAgICAgIGFkZCBXTU0gc3VwcG9ydAorCUp1c3RpbiBQLiBNYXR0b2NrCTExLzA3LzIwMTAJRml4IHR5cG9zCiAqLwogI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgogCkBAIC0xMTgsNyArMTE5LDcgQEAKIAlOZGlzTW92ZU1lbW9yeShwQWlkLCAmcEZyYW1lLT5PY3RldFs0XSwgMik7CiAJTGVuZ3RoICs9IDI7CiAKLQkvKiBBaWQgYWxyZWFkeSBzd2FwZWQgYnl0ZSBvcmRlciBpbiBSVE1QRnJhbWVFbmRpYW5DaGFuZ2UoKSBmb3IgYmlnIGVuZGlhbiBwbGF0Zm9ybSAqLworCS8qIEFpZCBhbHJlYWR5IHN3YXBwZWQgYnl0ZSBvcmRlciBpbiBSVE1QRnJhbWVFbmRpYW5DaGFuZ2UoKSBmb3IgYmlnIGVuZGlhbiBwbGF0Zm9ybSAqLwogCSpwQWlkID0gKCpwQWlkKSAmIDB4M2ZmZjsJLyogQUlEIGlzIGxvdyAxNC1iaXQgKi8KIAogCS8qIC0tIGdldCBzdXBwb3J0ZWQgcmF0ZXMgZnJvbSBwYXlsb2FkIGFuZCBhZHZhbmNlIHRoZSBwb2ludGVyICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3N0YS9zeW5jLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3N0YS9zeW5jLmMKaW5kZXggNzQ3ZDNjNi4uNzA1NGJhMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9zdGEvc3luYy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvc3RhL3N5bmMuYwpAQCAtMzIsOCArMzIsOSBAQAogCVJldmlzaW9uIEhpc3Rvcnk6CiAJV2hvCQkJV2hlbgkJCVdoYXQKIAktLS0tLS0tLQktLS0tLS0tLS0tCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JSm9obiBDaGFuZwkyMDA0LTA5LTAxICAgICAgbW9kaWZpZWQgZm9yIHJ0MjU2MS8yNjYxCi0JSmFuIExlZQkJMjAwNi0wOC0wMSAgICAgIG1vZGlmaWVkIGZvciBydDI4NjAgZm9yIDgwMi4xMW4KKwlKb2huIENoYW5nCQkyMDA0LTA5LTAxICAgICAgCW1vZGlmaWVkIGZvciBydDI1NjEvMjY2MQorCUphbiBMZWUJCQkyMDA2LTA4LTAxICAgICAgCW1vZGlmaWVkIGZvciBydDI4NjAgZm9yIDgwMi4xMW4KKwlKdXN0aW4gUC4gTWF0dG9jawkxMS8wNy8yMDEwCQlGaXggdHlwb3MKICovCiAjaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCiAKQEAgLTIzMyw5ICsyMzQsOSBAQAogCQlSVE1QU3VzcGVuZE1zZHVUcmFuc21pc3Npb24ocEFkKTsKIAogCQkvKiAqLwotCQkvKiBUbyBwcmV2ZW50IGRhdGEgbG9zdC4gKi8KLQkJLyogU2VuZCBhbiBOVUxMIGRhdGEgd2l0aCB0dXJuZWQgUFNNIGJpdCBvbiB0byBjdXJyZW50IGFzc29jaWF0ZWQgQVAgYmVmb3JlIFNDQU4gcHJvZ3Jlc3MuICovCi0JCS8qIEFuZCBzaG91bGQgc2VuZCBhbiBOVUxMIGRhdGEgd2l0aCB0dXJuZWQgUFNNIGJpdCBvZmYgdG8gQVAsIHdoZW4gc2NhbiBwcm9ncmVzcyBkb25lICovCisJCS8qIFRvIHByZXZlbnQgZGF0YSBsb3NzLiAqLworCQkvKiBTZW5kIGEgTlVMTCBkYXRhIHdpdGggdHVybmVkIFBTTSBiaXQgb24gdG8gY3VycmVudCBhc3NvY2lhdGVkIEFQIGJlZm9yZSBTQ0FOIHByb2dyZXNzLiAqLworCQkvKiBBbmQgc2hvdWxkIHNlbmQgYSBOVUxMIGRhdGEgd2l0aCB0dXJuZWQgUFNNIGJpdCBvZmYgdG8gQVAsIHdoZW4gc2NhbiBwcm9ncmVzcyBkb25lICovCiAJCS8qICovCiAJCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCkKIAkJICAgICYmIChJTkZSQV9PTihwQWQpKSkgewpAQCAtMjgzLDcgKzI4NCw3IEBACiAJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNZTkMgLSBCQlAgUjQgdG8gMjBNSHoubFxuIikpOwogCQlTY2FuTmV4dENoYW5uZWwocEFkKTsKIAl9IGVsc2UgewotCQlEQkdQUklOVF9FUlIoKCJTWU5DIC0gTWxtZVNjYW5SZXFBY3Rpb24oKSBzYW5pdHkgY2hlY2sgZmFpbFxuIikpOworCQlEQkdQUklOVF9FUlIoIlNZTkMgLSBNbG1lU2NhblJlcUFjdGlvbigpIHNhbml0eSBjaGVjayBmYWlsXG4iKTsKIAkJcEFkLT5NbG1lLlN5bmNNYWNoaW5lLkN1cnJTdGF0ZSA9IFNZTkNfSURMRTsKIAkJU3RhdHVzID0gTUxNRV9JTlZBTElEX0ZPUk1BVDsKIAkJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX1NDQU5fQ09ORiwgMiwKQEAgLTUzNSw3ICs1MzYsNyBAQAogCQlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfU1RBUlRfQ09ORiwgMiwKIAkJCSAgICAmU3RhdHVzKTsKIAl9IGVsc2UgewotCQlEQkdQUklOVF9FUlIoKCJTWU5DIC0gTWxtZVN0YXJ0UmVxQWN0aW9uKCkgc2FuaXR5IGNoZWNrIGZhaWwuXG4iKSk7CisJCURCR1BSSU5UX0VSUigiU1lOQyAtIE1sbWVTdGFydFJlcUFjdGlvbigpIHNhbml0eSBjaGVjayBmYWlsLlxuIik7CiAJCXBBZC0+TWxtZS5TeW5jTWFjaGluZS5DdXJyU3RhdGUgPSBTWU5DX0lETEU7CiAJCVN0YXR1cyA9IE1MTUVfSU5WQUxJRF9GT1JNQVQ7CiAJCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9TVEFSVF9DT05GLCAyLApAQCAtNzUwLDkgKzc1MSw5IEBACiAKIAkJLyogQkVBQ09OIGZyb20gZGVzaXJlZCBCU1MvSUJTUyBmb3VuZC4gV2Ugc2hvdWxkIGJlIGFibGUgdG8gZGVjaWRlIG1vc3QgKi8KIAkJLyogQlNTIHBhcmFtZXRlcnMgaGVyZS4gKi8KLQkJLyogUS4gQnV0IHdoYXQgaGFwcGVuIGlmIHRoaXMgSk9JTiBkb2Vzbid0IGNvbmNsdWRlIGEgc3VjY2Vzc2Z1bCBBU1NPQ0lBVEVJT04/ICovCi0JCS8qICAgIERvIHdlIG5lZWQgdG8gcmVjZW92ZXIgYmFjayBhbGwgcGFyYW1ldGVycyBiZWxvbmdpbmcgdG8gcHJldmlvdXMgQlNTPyAqLwotCQkvKiBBLiBTaG91bGQgYmUgbm90LiBUaGVyZSdzIG5vIGJhY2stZG9vciByZWNvdmVyIHRvIHByZXZpb3VzIEFQLiBJdCBzdGlsbCBuZWVkICovCisJCS8qIFEuIEJ1dCB3aGF0IGhhcHBlbiBpZiB0aGlzIEpPSU4gZG9lc24ndCBjb25jbHVkZSBhIHN1Y2Nlc3NmdWwgQVNTT0NJQVRJT04/ICovCisJCS8qICAgIERvIHdlIG5lZWQgdG8gcmVjb3ZlciBiYWNrIGFsbCBwYXJhbWV0ZXJzIGJlbG9uZ2luZyB0byBwcmV2aW91cyBCU1M/ICovCisJCS8qIEEuIFNob3VsZCBiZSBub3QuIFRoZXJlJ3Mgbm8gYmFjay1kb29yIHJlY292ZXIgdG8gcHJldmlvdXMgQVAuIEl0IHN0aWxsIG5lZWRzICovCiAJCS8qICAgIGEgbmV3IEpPSU4tQVVUSC1BU1NPQyBzZXF1ZW5jZS4gKi8KIAkJaWYgKE1BQ19BRERSX0VRVUFMKHBBZC0+TWxtZUF1eC5Cc3NpZCwgQnNzaWQpKSB7CiAJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKQEAgLTg3Niw3ICs4NzcsNyBAQAogCQkJcEFkLT5NbG1lQXV4LkNmcE1heER1cmF0aW9uID0gQ2YuQ2ZwTWF4RHVyYXRpb247CiAJCQlwQWQtPk1sbWVBdXguQVBSYWxpbmtJZSA9IFJhbGlua0llOwogCi0JCQkvKiBDb3B5IEFQJ3Mgc3VwcG9ydGVkIHJhdGUgdG8gTWxtZUF1eCBmb3IgY3JlYXRpbmcgYXNzb2ljYXRpb24gcmVxdWVzdCAqLworCQkJLyogQ29weSBBUCdzIHN1cHBvcnRlZCByYXRlIHRvIE1sbWVBdXggZm9yIGNyZWF0aW5nIGFzc29jaWF0aW9uIHJlcXVlc3QgKi8KIAkJCS8qIEFsc28gZmlsdGVyIG91dCBub3Qgc3VwcG9ydGVkIHJhdGUgKi8KIAkJCXBBZC0+TWxtZUF1eC5TdXBSYXRlTGVuID0gU3VwUmF0ZUxlbjsKIAkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+TWxtZUF1eC5TdXBSYXRlLCBTdXBSYXRlLApAQCAtMTIwNyw3ICsxMjA4LDcgQEAKIAkJCX0KIAogCQkJaWYgKGluZGV4ID49IHBBZC0+Q2hhbm5lbExpc3ROdW0pIHsKLQkJCQlEQkdQUklOVF9FUlIoKCJQZWVyQmVhY29uKGNhbiBub3QgZmluZCBOZXcgQ2hhbm5lbD0lZCBpbiBDaGFubmVsTGlzdFslZF1cbiIsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwsIHBBZC0+Q2hhbm5lbExpc3ROdW0pKTsKKwkJCQlEQkdQUklOVF9FUlIoIlBlZXJCZWFjb24oY2FuIG5vdCBmaW5kIE5ldyBDaGFubmVsPSVkIGluIENoYW5uZWxMaXN0WyVkXVxuIiwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCwgcEFkLT5DaGFubmVsTGlzdE51bSk7CiAJCQl9CiAJCX0KIAkJLyogaWYgdGhlIHNzaWQgbWF0Y2hlZCAmIGJzc2lkIHVubWF0Y2hlZCwgd2Ugc2hvdWxkIHNlbGVjdCB0aGUgYnNzaWQgd2l0aCBsYXJnZSB2YWx1ZS4gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvc3RhL3dwYS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9zdGEvd3BhLmMKaW5kZXggNjliOGEyNC4uZmYzNDgzMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9zdGEvd3BhLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9zdGEvd3BhLmMKQEAgLTMzLDcgKzMzLDggQEAKIAlXaG8JCQlXaGVuCQkJV2hhdAogCS0tLS0tLS0tCS0tLS0tLS0tLS0JCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAlKYW4JTGVlCQkwMy0wNy0yMgkJSW5pdGlhbAotCVBhdWwgTGluCTAzLTExLTI4CQlNb2RpZnkgZm9yIHN1cHBsaWNhbnQKKwlQYXVsIExpbgkJMDMtMTEtMjgJCU1vZGlmeSBmb3Igc3VwcGxpY2FudAorCUp1c3RpbiBQLiBNYXR0b2NrCTExLzA3LzIwMTAJCUZpeCB0eXBvcwogKi8KICNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKIApAQCAtODYsNyArODcsNyBAQAogCQkJLyogVmlvbGF0ZSBNSUMgZXJyb3IgY291bnRzLCBNSUMgY291bnRlcm1lYXN1cmVzIGtpY2tzIGluICovCiAJCQlwQWQtPlN0YUNmZy5NaWNFcnJDbnQrKzsKIAkJCS8qIFdlIHNoYWxsIGJsb2NrIGFsbCByZWNlcHRpb24gKi8KLQkJCS8qIFdlIHNoYWxsIGNsZWFuIGFsbCBUeCByaW5nIGFuZCBkaXNhc3NvaWNhdGUgZnJvbSBBUCBhZnRlciBuZXh0IEVBUE9MIGZyYW1lICovCisJCQkvKiBXZSBzaGFsbCBjbGVhbiBhbGwgVHggcmluZyBhbmQgZGlzYXNzb2NpYXRlIGZyb20gQVAgYWZ0ZXIgbmV4dCBFQVBPTCBmcmFtZSAqLwogCQkJLyogKi8KIAkJCS8qIE5vIG5lY2Vzc2FyeSB0byBjbGVhbiBhbGwgVHggcmluZywgb24gUlRNUEhhcmRUcmFuc21pdCB3aWxsIHN0b3Agc2VuZGluZyBub24tODAyLjFYIEVBUE9MIHBhY2tldHMgKi8KIAkJCS8qIGlmIHBBZC0+U3RhQ2ZnLk1pY0VyckNudCBncmVhdGVyIHRoYW4gMi4gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvc3RhX2lvY3RsLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3N0YV9pb2N0bC5jCmluZGV4IGUwOTVhNDQuLjU3MTdlMTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvc3RhX2lvY3RsLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9zdGFfaW9jdGwuYwpAQCAtMzEsMTAgKzMxLDExIEBACiAgICAgSU9DVEwgcmVsYXRlZCBzdWJyb3V0aW5lcwogCiAgICAgUmV2aXNpb24gSGlzdG9yeToKLSAgICBXaG8gICAgICAgICBXaGVuICAgICAgICAgIFdoYXQKKyAgICAJV2hvICAgICAgICAJCSBXaGVuICAgICAgICAgIFdoYXQKICAgICAtLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBSb3J5IENoZW4gICAwMS0wMy0yMDAzICAgIGNyZWF0ZWQKLQlSb3J5IENoZW4gICAwMi0xNC0yMDA1ICAgIG1vZGlmeSB0byBzdXBwb3J0IFJUNjEKKyAgIAlSb3J5IENoZW4gICAJCTAxLTAzLTIwMDMgICAgCWNyZWF0ZWQKKwlSb3J5IENoZW4gICAJCTAyLTE0LTIwMDUgICAgCW1vZGlmeSB0byBzdXBwb3J0IFJUNjEKKwlKdXN0aW4gUC4gTWF0dG9jawkxMS8wNy8yMDEwCUZpeCB0eXBvcwogKi8KIAogI2luY2x1ZGUJInJ0X2NvbmZpZy5oIgpAQCAtODUxLDcgKzg1Miw3IEBACiAKIAkJLyoKIAkJICAgUHJvdG9jb2w6Ci0JCSAgIGl0IHdpbGwgc2hvdyBzY2FubmVkIEFQJ3MgV2lyZWxlc3NNb2RlIC4KKwkJICAgaXQgd2lsbCBzaG93IHNjYW5uZWQgQVAncyBXaXJlbGVzc01vZGUuCiAJCSAgIGl0IG1pZ2h0IGJlCiAJCSAgIDgwMi4xMWEKIAkJICAgODAyLjExYS9uCkBAIC04NzUsMTMgKzg3NiwxMyBAQAogCQkJCQlzdHJjcHkoaXdlLnUubmFtZSwgIjgwMi4xMWEiKTsKIAkJCX0gZWxzZSB7CiAJCQkJLyoKLQkJCQkgICBpZiBvbmUgb2Ygbm9uIEIgbW9kZSByYXRlIGlzIHNldCBzdXBwb3J0ZWQgcmF0ZSAuIGl0IG1lYW4gRyBvbmx5LgorCQkJCSAgIGlmIG9uZSBvZiBub24gQiBtb2RlIHJhdGUgaXMgc2V0IHN1cHBvcnRlZCByYXRlLCBpdCBtZWFucyBHIG9ubHkuCiAJCQkJICovCiAJCQkJZm9yIChyYXRlQ250ID0gMDsKIAkJCQkgICAgIHJhdGVDbnQgPCBwQnNzRW50cnktPlN1cFJhdGVMZW47CiAJCQkJICAgICByYXRlQ250KyspIHsKIAkJCQkJLyoKLQkJCQkJICAgNk1icHMoMTQwKSA5TWJwcygxNDYpIGFuZCA+PTEyTWJwcygxNTIpIGFyZSBzdXBwb3J0ZWQgcmF0ZSAsIGl0IG1lYW4gRyBvbmx5LgorCQkJCQkgICA2TWJwcygxNDApIDlNYnBzKDE0NikgYW5kID49MTJNYnBzKDE1MikgYXJlIHN1cHBvcnRlZCByYXRlLCBpdCBtZWFucyBHIG9ubHkuCiAJCQkJCSAqLwogCQkJCQlpZiAocEJzc0VudHJ5LT5TdXBSYXRlW3JhdGVDbnRdID09IDE0MAogCQkJCQkgICAgfHwgcEJzc0VudHJ5LT5TdXBSYXRlW3JhdGVDbnRdID09CkBAIC0xNDE3LDcgKzE0MTgsNyBAQAogCQlpZiAoKGluZGV4ID49IDApICYmIChpbmRleCA8IDQpKSB7CiAJCQlwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCA9IGluZGV4OwogCQl9IGVsc2UKLQkJCS8qIERvbid0IGNvbXBsYWluIGlmIG9ubHkgY2hhbmdlIHRoZSBtb2RlICovCisJCQkvKiBEb24ndCBjb21wbGFpbiBpZiB0aGUgbW9kZSBpcyBvbmx5IGNoYW5nZWQgKi8KIAkJaWYgKCEoZXJxLT5mbGFncyAmIElXX0VOQ09ERV9NT0RFKSkKIAkJCXJldHVybiAtRUlOVkFMOwogCX0KQEAgLTI3MzIsOCArMjczMyw4IEBACiAJCQl9CiAJCQlpZiAoSU5GUkFfT04ocEFkYXB0ZXIpKSB7CiAJCQkJLypCT09MRUFOIENhbmNlbGxlZDsgKi8KLQkJCQkvKiBTZXQgdGhlIEF1dG9SZWNvbm5lY3RTc2lkIHRvIHByZXZlbnQgaXQgcmVjb25uZWN0IHRvIG9sZCBTU0lEICovCi0JCQkJLyogU2luY2UgY2FsbGluZyB0aGlzIGluZGljYXRlIHVzZXIgZG9uJ3Qgd2FudCB0byBjb25uZWN0IHRvIHRoYXQgU1NJRCBhbnltb3JlLiAqLworCQkJCS8qIFNldCB0aGUgQXV0b1JlY29ubmVjdFNzaWQgdG8gcHJldmVudCBpdCBmcm9tIHJlY29ubmVjdGluZyB0byB0aGUgb2xkIFNTSUQgKi8KKwkJCQkvKiBTaW5jZSBjYWxsaW5nIHRoaXMgaW5kaWNhdGVzIHVzZXJzIGRvbid0IHdhbnQgdG8gY29ubmVjdCB0byB0aGF0IFNTSUQgYW55bW9yZS4gKi8KIAkJCQlwQWRhcHRlci0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZExlbiA9IDMyOwogCQkJCU5kaXNaZXJvTWVtb3J5KHBBZGFwdGVyLT5NbG1lQXV4LgogCQkJCQkgICAgICAgQXV0b1JlY29ubmVjdFNzaWQsCkBAIC0yNzY2LDggKzI3NjcsOCBAQAogCQkJCUxpbmtEb3duKHBBZGFwdGVyLCBGQUxTRSk7CiAJCQl9CiAJCQlpZiAoQURIT0NfT04ocEFkYXB0ZXIpKSB7Ci0JCQkJLyogU2V0IHRoZSBBdXRvUmVjb25uZWN0U3NpZCB0byBwcmV2ZW50IGl0IHJlY29ubmVjdCB0byBvbGQgU1NJRCAqLwotCQkJCS8qIFNpbmNlIGNhbGxpbmcgdGhpcyBpbmRpY2F0ZSB1c2VyIGRvbid0IHdhbnQgdG8gY29ubmVjdCB0byB0aGF0IFNTSUQgYW55bW9yZS4gKi8KKwkJCQkvKiBTZXQgdGhlIEF1dG9SZWNvbm5lY3RTc2lkIHRvIHByZXZlbnQgaXQgZnJvbSByZWNvbm5lY3RpbmcgdG8gdGhlIG9sZCBTU0lEICovCisJCQkJLyogU2luY2UgY2FsbGluZyB0aGlzIGluZGljYXRlcyB1c2VycyBkb24ndCB3YW50IHRvIGNvbm5lY3QgdG8gdGhhdCBTU0lEIGFueW1vcmUuICovCiAJCQkJcEFkYXB0ZXItPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWRMZW4gPSAzMjsKIAkJCQlOZGlzWmVyb01lbW9yeShwQWRhcHRlci0+TWxtZUF1eC4KIAkJCQkJICAgICAgIEF1dG9SZWNvbm5lY3RTc2lkLApAQCAtMjg4NCw3ICsyODg1LDcgQEAKIAkJfQogCQkvKiBFbmFibGUgUnggd2l0aCBwcm9taXNjdW91cyByZWNlcHRpb24gKi8KIAkJUlRNUF9JT19XUklURTMyKHBBZGFwdGVyLCBSWF9GSUxUUl9DRkcsIDB4Myk7Ci0JCS8qIEFTSUMgc3VwcG9yc3RzIHNuaWZmZXIgZnVuY3Rpb24gd2l0aCByZXBsYWNpbmcgUlNTSSB3aXRoIHRpbWVzdGFtcC4gKi8KKwkJLyogQVNJQyBzdXBwb3J0cyBzbmlmZmVyIGZ1bmN0aW9uIHdpdGggcmVwbGFjaW5nIFJTU0kgd2l0aCB0aW1lc3RhbXAuICovCiAJCS8qUlRNUF9JT19SRUFEMzIocEFkYXB0ZXIsIE1BQ19TWVNfQ1RSTCwgJlZhbHVlKTsgKi8KIAkJLypWYWx1ZSB8PSAoMHg4MCk7ICovCiAJCS8qUlRNUF9JT19XUklURTMyKHBBZGFwdGVyLCBNQUNfU1lTX0NUUkwsIFZhbHVlKTsgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvdXNiX21haW5fZGV2LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3VzYl9tYWluX2Rldi5jCmluZGV4IGNkMTVkYWEuLmVlNjhkNTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvdXNiX21haW5fZGV2LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC91c2JfbWFpbl9kZXYuYwpAQCAtMjcsOCArMjcsOCBAQAogI2luY2x1ZGUgInJ0X2NvbmZpZy5oIgogCiAvKiBGb2xsb3dpbmcgaW5mb3JtYXRpb24gd2lsbCBiZSBzaG93IHdoZW4geW91IHJ1biAnbW9kaW5mbycgKi8KLS8qICoqKiBJZiB5b3UgaGF2ZSBhIHNvbHV0aW9uIGZvciB0aGUgYnVnIGluIGN1cnJlbnQgdmVyc2lvbiBvZiBkcml2ZXIsIHBsZWFzZSBtYWlsIHRvIG1lLiAqLwotLyogT3RoZXJ3aXNlIHBvc3QgdG8gZm9ydW0gaW4gcmFsaW5rdGVjaCdzIHdlYiBzaXRlKHd3dy5yYWxpbmt0ZWNoLmNvbSkgYW5kIGxldCBhbGwgdXNlcnMgaGVscCB5b3UuICoqKiAqLworLyogSWYgeW91IGhhdmUgYSBzb2x1dGlvbiBmb3IgdGhlIGJ1ZyBpbiBjdXJyZW50IHZlcnNpb24gb2YgZHJpdmVyLCBwbGVhc2UgZS1tYWlsIG1lLiAqLworLyogT3RoZXJ3aXNlIHBvc3QgdG8gdGhlIGZvcnVtIGF0IHJhbGlua3RlY2gncyB3ZWIgc2l0ZSh3d3cucmFsaW5rdGVjaC5jb20pIGFuZCBsZXQgYWxsIHVzZXJzIGhlbHAgeW91LiAqLwogTU9EVUxFX0FVVEhPUigiUGF1bCBMaW4gPHBhdWxfbGluQHJhbGlua3RlY2guY29tPiIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJSVDI4NzAvUlQzMDcwIFdpcmVsZXNzIExhbiBMaW51eCBEcml2ZXIiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKQEAgLTIzMyw3ICsyMzMsNyBAQAogCWZvciAoaSA9IDA7IGkgPCBydHVzYl91c2JfaWRfbGVuOyBpKyspIHsKIAkJaWYgKGRldl9wLT5kZXNjcmlwdG9yLmlkVmVuZG9yID09IHJ0dXNiX3VzYl9pZFtpXS5pZFZlbmRvciAmJgogCQkgICAgZGV2X3AtPmRlc2NyaXB0b3IuaWRQcm9kdWN0ID09IHJ0dXNiX3VzYl9pZFtpXS5pZFByb2R1Y3QpIHsKLQkJCXByaW50aygicnQyODcwOiBpZFZlbmRvciA9IDB4JXgsIGlkUHJvZHVjdCA9IDB4JXhcbiIsCisJCQlwcmludGsoS0VSTl9JTkZPICJydDI4NzA6IGlkVmVuZG9yID0gMHgleCwgaWRQcm9kdWN0ID0gMHgleFxuIiwKIAkJCSAgICAgICBkZXZfcC0+ZGVzY3JpcHRvci5pZFZlbmRvciwKIAkJCSAgICAgICBkZXZfcC0+ZGVzY3JpcHRvci5pZFByb2R1Y3QpOwogCQkJYnJlYWs7CkBAIC0yNDEsNyArMjQxLDcgQEAKIAl9CiAKIAlpZiAoaSA9PSBydHVzYl91c2JfaWRfbGVuKSB7Ci0JCXByaW50aygicnQyODcwOiBFcnJvciEgRGV2aWNlIERlc2NyaXB0b3Igbm90IG1hdGNoaW5nIVxuIik7CisJCXByaW50ayhLRVJOX0VSUiAicnQyODcwOiBFcnJvciEgRGV2aWNlIERlc2NyaXB0b3Igbm90IG1hdGNoaW5nIVxuIik7CiAJCXJldHVybiBGQUxTRTsKIAl9CiAKQEAgLTMyMyw3ICszMjMsNyBAQAogCiAJaWYgKCEocEFkLT5CdWxrSW5FcEFkZHIgJiYgcEFkLT5CdWxrT3V0RXBBZGRyWzBdKSkgewogCQlwcmludGsKLQkJICAgICgiJXM6IENvdWxkIG5vdCBmaW5kIGJvdGggYnVsay1pbiBhbmQgYnVsay1vdXQgZW5kcG9pbnRzXG4iLAorCQkgICAgKEtFUk5fRVJSICIlczogQ291bGQgbm90IGZpbmQgYm90aCBidWxrLWluIGFuZCBidWxrLW91dCBlbmRwb2ludHNcbiIsCiAJCSAgICAgX19GVU5DVElPTl9fKTsKIAkJcmV0dXJuIEZBTFNFOwogCX0KQEAgLTQyMyw3ICs0MjMsNyBAQAogLyogSW5pdCBkcml2ZXIgbW9kdWxlICovCiBpbnQgX19pbml0IHJ0dXNiX2luaXQodm9pZCkKIHsKLQlwcmludGsoInJ0dXNiIGluaXQgLS0tPlxuIik7CisJcHJpbnRrKEtFUk5fREVCVUcgInJ0dXNiIGluaXQgLS0tPlxuIik7CiAJcmV0dXJuIHVzYl9yZWdpc3RlcigmcnR1c2JfZHJpdmVyKTsKIH0KIApAQCAtNDMxLDcgKzQzMSw3IEBACiB2b2lkIF9fZXhpdCBydHVzYl9leGl0KHZvaWQpCiB7CiAJdXNiX2RlcmVnaXN0ZXIoJnJ0dXNiX2RyaXZlcik7Ci0JcHJpbnRrKCI8LS0tIHJ0dXNiIGV4aXRcbiIpOworCXByaW50ayhLRVJOX0RFQlVHICI8LS0tIHJ0dXNiIGV4aXRcbiIpOwogfQogCiBtb2R1bGVfaW5pdChydHVzYl9pbml0KTsKQEAgLTgxNCw3ICs4MTQsNyBAQAogCQkgIGRldi0+YnVzLT5idXNfbmFtZSwgZGV2LT5kZXZwYXRoKSk7CiAJaWYgKCFwQWQpIHsKIAkJdXNiX3B1dF9kZXYoZGV2KTsKLQkJcHJpbnRrKCJydHVzYl9kaXNjb25uZWN0OiBwQWQgPT0gTlVMTCFcbiIpOworCQlwcmludGsoS0VSTl9FUlIgInJ0dXNiX2Rpc2Nvbm5lY3Q6IHBBZCA9PSBOVUxMIVxuIik7CiAJCXJldHVybjsKIAl9CiAJUlRNUF9TRVRfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCk7CkBAIC04ODQsOCArODg0LDggQEAKIAlpZiAobmV0X2RldiA9PSBOVUxMKQogCQlnb3RvIGVycl9vdXRfZnJlZV9yYWRldjsKIAotCS8qIEhlcmUgYXJlIHRoZSBuZXRfZGV2aWNlIHN0cnVjdHVyZSB3aXRoIHVzYiBzcGVjaWZpYyBwYXJhbWV0ZXJzLiAqLwotCS8qIGZvciBzdXBwb3J0aW5nIE5ldHdvcmsgTWFuYWdlci4KKwkvKiBIZXJlIGFyZSB0aGUgbmV0X2RldmljZSBzdHJ1Y3R1cmUgd2l0aCB1c2Igc3BlY2lmaWMgcGFyYW1ldGVycy4gCisJICogZm9yIHN1cHBvcnRpbmcgTmV0d29yayBNYW5hZ2VyLgogCSAqIFNldCB0aGUgc3lzZnMgcGh5c2ljYWwgZGV2aWNlIHJlZmVyZW5jZSBmb3IgdGhlIG5ldHdvcmsgbG9naWNhbCBkZXZpY2UgaWYgc2V0IHByaW9yIHRvIHJlZ2lzdHJhdGlvbiB3aWxsCiAJICogY2F1c2UgYSBzeW1saW5rIGR1cmluZyBpbml0aWFsaXphdGlvbi4KIAkgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvd3BhLmggYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3dwYS5oCmluZGV4IDYxOTlhZTYuLjExNmZjMmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvd3BhLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC93cGEuaApAQCAtMzIsMTMgKzMyLDE0IEBACiAJUmV2aXNpb24gSGlzdG9yeToKIAlXaG8JCQlXaGVuCQkJV2hhdAogCS0tLS0tLS0tCS0tLS0tLS0tLS0JCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQlOYW1lCQlEYXRlCQkJTW9kaWZpY2F0aW9uIGxvZ3MKKwlOYW1lCQkJRGF0ZQkJCU1vZGlmaWNhdGlvbiBsb2dzCisJSnVzdGluIFAuIE1hdHRvY2sJMTEvMDcvMjAxMAkJRml4IGEgdHlwbwogKi8KIAogI2lmbmRlZglfX1dQQV9IX18KICNkZWZpbmUJX19XUEFfSF9fCiAKLS8qIEVBUE9MIEtleSBkZXNjcmlwdGVyIGZyYW1lIGZvcm1hdCByZWxhdGVkIGxlbmd0aCAqLworLyogRUFQT0wgS2V5IGRlc2NyaXB0b3IgZnJhbWUgZm9ybWF0IHJlbGF0ZWQgbGVuZ3RoICovCiAjZGVmaW5lIExFTl9LRVlfREVTQ19OT05DRQkJCTMyCiAjZGVmaW5lIExFTl9LRVlfREVTQ19JVgkJCQkxNgogI2RlZmluZSBMRU5fS0VZX0RFU0NfUlNDCQkJOApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL2llZWU4MDIxMS9pZWVlODAyMTFfdHguYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9pZWVlODAyMTEvaWVlZTgwMjExX3R4LmMKaW5kZXggZGQ4YTIyMS4uYjI2YjVhOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL2llZWU4MDIxMS9pZWVlODAyMTFfdHguYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvaWVlZTgwMjExL2llZWU4MDIxMV90eC5jCkBAIC04MjIsNyArODIyLDcgQEAKIAkJewogCQkJdHhiLT5xdWV1ZV9pbmRleCA9IFVQMkFDKHNrYi0+cHJpb3JpdHkpOwogCQl9IGVsc2UgewotCQkJdHhiLT5xdWV1ZV9pbmRleCA9IFdNRV9BQ19CSzs7CisJCQl0eGItPnF1ZXVlX2luZGV4ID0gV01FX0FDX0JLOwogCQl9CiAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3I4MTkyRV9jb3JlLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcjgxOTJFX2NvcmUuYwppbmRleCBiMTc4NmRjLi5mYWM0ZWVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcjgxOTJFX2NvcmUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcjgxOTJFX2NvcmUuYwpAQCAtODksNyArODksNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgLy8gCUNPTVBfSU5UUiAgICAgICB8CiAJCQkJQ09NUF9FUlIgOyAvL2Fsd2F5cyBvcGVuIGVyciBmbGFncyBvbgogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgcnRsODE5Ml9wY2lfaWRfdGJsW10gX19kZXZpbml0ZGF0YSA9IHsKK3N0YXRpYyBERUZJTkVfUENJX0RFVklDRV9UQUJMRShydGw4MTkyX3BjaV9pZF90YmwpID0gewogI2lmZGVmIFJUTDgxOTBQCiAJLyogUmVhbHRlayAqLwogCS8qIERsaW5rICovCkBAIC0yMjgzLDkgKzIyODMsNyBAQAogCQkJCUlNUl9UWEZPVlcgfCBJTVJfQmNuSW50IHwgSU1SX1RCRE9LIHwgSU1SX1RCREVSKTsKIAogCXByaXYtPkFjbUNvbnRyb2wgPSAwOwotCXByaXYtPnBGaXJtd2FyZSA9IChydF9maXJtd2FyZSopdm1hbGxvYyhzaXplb2YocnRfZmlybXdhcmUpKTsKLQlpZiAocHJpdi0+cEZpcm13YXJlKQotCW1lbXNldChwcml2LT5wRmlybXdhcmUsIDAsIHNpemVvZihydF9maXJtd2FyZSkpOworCXByaXYtPnBGaXJtd2FyZSA9IHZ6YWxsb2Moc2l6ZW9mKHJ0X2Zpcm13YXJlKSk7CiAKIAkvKiByeCByZWxhdGVkIHF1ZXVlICovCiAgICAgICAgIHNrYl9xdWV1ZV9oZWFkX2luaXQoJnByaXYtPnJ4X3F1ZXVlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9yODE5eEVfcGh5LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcjgxOXhFX3BoeS5jCmluZGV4IGQ4M2JjYmMuLjUwY2QwZTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9yODE5eEVfcGh5LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3I4MTl4RV9waHkuYwpAQCAtMjU5Niw3ICsyNTk2LDcgQEAKIAkJCWJyZWFrOwogCX0KIAotCXJldHVybiByZXQ7OworCXJldHVybiByZXQ7CiAKIH0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9NYWtlZmlsZSBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9NYWtlZmlsZQppbmRleCAyMDZkOTI0Li5lZWZjNjU3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L01ha2VmaWxlCkBAIC05LDcgKzksNiBAQAogI2NjZmxhZ3MteSArPSAtRFVTQl9UWF9EUklWRVJfQUdHUkVHQVRJT05fRU5BQkxFCiAjY2NmbGFncy15ICs9IC1EVVNCX1JYX0FHR1JFR0FUSU9OX1NVUFBPUlQKIGNjZmxhZ3MteSArPSAtRFVTRV9PTkVfUElQRQotY2NmbGFncy15ICs9IC1ERU5BQkxFX0RPVDExRAogY2NmbGFncy15ICs9IC1JZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMQogCiByODE5MnVfdXNiLXkgOj0gcjgxOTJVX2NvcmUubyByODE4MF85M2N4Ni5vIHI4MTkyVV93eC5vCQlcCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvZG90MTFkLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvZG90MTFkLmgKaW5kZXggZDk5Y2MwMy4uOTJlN2EwMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2RvdDExZC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9kb3QxMWQuaApAQCAtMSw3ICsxLDYgQEAKICNpZm5kZWYgX19JTkNfRE9UMTFEX0gKICNkZWZpbmUgX19JTkNfRE9UMTFEX0gKIAotI2lmZGVmIEVOQUJMRV9ET1QxMUQKICNpbmNsdWRlICJpZWVlODAyMTEvaWVlZTgwMjExLmgiCiAKIApAQCAtOTgsNSArOTcsNCBAQAogCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICpkZXYsCiAJdTggY2hhbm5lbAogKTsKLSNlbmRpZiAvKiBFTkFCTEVfRE9UMTFEICovCiAjZW5kaWYgLyogI2lmbmRlZiBfX0lOQ19ET1QxMURfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9NYWtlZmlsZSBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvTWFrZWZpbGUKaW5kZXggNDU3MDRmOC4uMDc3NWM1NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL01ha2VmaWxlCkBAIC0yMCw3ICsyMCw2IEBACiBlbmRpZgogI2NjZmxhZ3MteSA6PSAtREpPSE5fTk9DUFkKICNmbGFncyB0byBlbmFibGUgb3IgZGlzYmxlIDgwMjExRCBmZWF0dXJlCi1jY2ZsYWdzLXkgKz0gLURFTkFCTEVfRE9UMTFECiBpZWVlODAyMTEtcnNsLW9ianMgOj0gaWVlZTgwMjExX3J4Lm8gXAogCQkgICAgICBpZWVlODAyMTFfc29mdG1hYy5vIFwKIAkJICAgICAgaWVlZTgwMjExX3R4Lm8gXApAQCAtNzUsNyArNzQsNiBAQAogQ0ZMQUdTICs9IC1ETU9EVkVSU0lPTlMgLURFWFBPUlRfU1lNVEFCIC1pbmNsdWRlICQoS1NSQykvaW5jbHVkZS9saW51eC9tb2R2ZXJzaW9ucy5oCiAjS2VybmVsIDIuNC4yMAogI0NGTEFHUyArPSAtRF9fTk9fVkVSU0lPTl9fIC1ERVhQT1JUX1NZTVRBQgotI0NGTEFHUyArPSAtREVOQUJMRV9ET1QxMUQKIFNNUCA6PSAkKHNoZWxsICQoQ0MpICQoTU9EQ0ZMQUdTKSAtRSAtZE0gJChDT05GSUdfRklMRSkgfCBcCiAgICBncmVwIENPTkZJR19TTVAgfCBhd2sgJ3twcmludCAkJDN9JykKIGlmbmVxICgkKFNNUCksMSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvZG90MTFkLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2RvdDExZC5jCmluZGV4IGI5MWNiZmMuLmNlNjNmYzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvZG90MTFkLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9kb3QxMWQuYwpAQCAtMSw0ICsxLDMgQEAKLSNpZmRlZiBFTkFCTEVfRE9UMTFECiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLwlGaWxlOgogLy8JCURvdDExZC5jCkBAIC0yMjAsNCArMjE5LDMgQEAKIEVYUE9SVF9TWU1CT0woSXNMZWdhbENoYW5uZWwpOwogRVhQT1JUX1NZTUJPTChUb0xlZ2FsQ2hhbm5lbCk7CiAKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9kb3QxMWQuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvZG90MTFkLmgKaW5kZXggMTViN2E0Yi4uNTRmMmI0YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9kb3QxMWQuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2RvdDExZC5oCkBAIC0xLDEwICsxLDggQEAKICNpZm5kZWYgX19JTkNfRE9UMTFEX0gKICNkZWZpbmUgX19JTkNfRE9UMTFEX0gKIAotI2lmZGVmIEVOQUJMRV9ET1QxMUQKICNpbmNsdWRlICJpZWVlODAyMTEuaCIKIAotLy8jZGVmaW5lIEVOQUJMRV9ET1QxMUQKIAogLy8jZGVmaW5lIERPVDExRF9NQVhfQ0hOTF9OVU0gODMKIApAQCAtOTgsNSArOTYsNCBAQAogCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICogZGV2LAogCXU4IGNoYW5uZWwKICk7Ci0jZW5kaWYgLy9FTkFCTEVfRE9UMTFECiAjZW5kaWYgLy8gI2lmbmRlZiBfX0lOQ19ET1QxMURfSApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9pZWVlODAyMTEuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvaWVlZTgwMjExLmgKaW5kZXggZTEyMTZiNy4uYzBiODQ0ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9pZWVlODAyMTEuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2llZWU4MDIxMS5oCkBAIC0xNTcyLDEwICsxNTcyLDggQEAKICNpZmRlZiBUSE9NQVNfVFVSQk8KIAl1OCBUdXJib19FbmFibGU7Ly9lbmFibGUgdHVyYm8gbW9kZSwgYWRkZWQgYnkgdGhvbWFzCiAjZW5kaWYKLSNpZmRlZiBFTkFCTEVfRE9UMTFECiAJdTE2IENvdW50cnlJZUxlbjsKIAl1OCBDb3VudHJ5SWVCdWZbTUFYX0lFX0xFTl07Ci0jZW5kaWYKIAkvLyBIVCBSZWxhdGVkLCBieSBhbXksIDIwMDguMDQuMjkKIAlCU1NfSFQJYnNzaHQ7CiAJLy8gQWRkIHRvIGhhbmRsZSBicm9hZGNvbSBBUCBtYW5hZ2VtZW50IGZyYW1lIENDSyByYXRlLgpAQCAtMTc2OSw3ICsxNzY3LDYgQEAKICNkZWZpbmUgUkZfQ0hBTkdFX0JZX0lQUyBCSVQyOAogI2RlZmluZSBSRl9DSEFOR0VfQllfSU5JVAkwCS8vIERvIG5vdCBjaGFuZ2UgdGhlIFJGT2ZmIHJlYXNvbi4gRGVmaW5lZCBieSBCcnVjZSwgMjAwOC0wMS0xNy4KIAotI2lmZGVmIEVOQUJMRV9ET1QxMUQKIHR5cGVkZWYgZW51bQogewogCUNPVU5UUllfQ09ERV9GQ0MgPSAwLApAQCAtMTc4NCw3ICsxNzgxLDYgQEAKIAlDT1VOVFJZX0NPREVfTUlDLAogCUNPVU5UUllfQ09ERV9HTE9CQUxfRE9NQUlOCiB9Y291bnRyeV9jb2RlX3R5cGVfdDsKLSNlbmRpZgogCiAjZGVmaW5lIFJUX01BWF9MRF9TTE9UX05VTQkxMAogdHlwZWRlZiBzdHJ1Y3QgX1JUX0xJTktfREVURUNUX1R7CkBAIC0xOTcwLDEyICsxOTY2LDggQEAKIAogCS8qIG1hcCBvZiBhbGxvd2VkIGNoYW5uZWxzLiAwIGlzIGR1bW15ICovCiAJLy8gRklYTUU6IHJlbWViZXIgdG8gZGVmYXVsdCB0byBhIGJhc2ljIGNoYW5uZWwgcGxhbiBkZXBlbmRpbmcgb2YgdGhlIFBIWSB0eXBlCi0jaWZkZWYgRU5BQkxFX0RPVDExRAogCXZvaWQqIHBEb3QxMWRJbmZvOwogCWJvb2wgYkdsb2JhbERvbWFpbjsKLSNlbHNlCi0JaW50IGNoYW5uZWxfbWFwW01BWF9DSEFOTkVMX05VTUJFUisxXTsKLSNlbmRpZgogCWludCByYXRlOyAgICAgICAvKiBjdXJyZW50IHJhdGUgKi8KIAlpbnQgYmFzaWNfcmF0ZTsKIAkvL0ZJWE1FOiBwbGVhY2UgY2FsbGJhY2ssIHNlZSBpZiByZWR1bmRhbnQgd2l0aCBzb2Z0bWFjX2ZlYXR1cmVzCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2llZWU4MDIxMV9yeC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9pZWVlODAyMTFfcnguYwppbmRleCBjOGNhOWQ4Li4xZWE4ZGEzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2llZWU4MDIxMV9yeC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvaWVlZTgwMjExX3J4LmMKQEAgLTQ0LDkgKzQ0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgogCiAjaW5jbHVkZSAiaWVlZTgwMjExLmgiCi0jaWZkZWYgRU5BQkxFX0RPVDExRAogI2luY2x1ZGUgImRvdDExZC5oIgotI2VuZGlmCiBzdGF0aWMgaW5saW5lIHZvaWQgaWVlZTgwMjExX21vbml0b3Jfcngoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCiAJCQkJCXN0cnVjdCBza19idWZmICpza2IsCiAJCQkJCXN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHMgKnJ4X3N0YXRzKQpAQCAtMTU5OSw3ICsxNTk3LDYgQEAKIH0KICNlbmRpZgogCi0jaWZkZWYgRU5BQkxFX0RPVDExRAogc3RhdGljIGlubGluZSB2b2lkIGllZWU4MDIxMV9leHRyYWN0X2NvdW50cnlfaWUoCiAJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCiAJc3RydWN0IGllZWU4MDIxMV9pbmZvX2VsZW1lbnQgKmluZm9fZWxlbWVudCwKQEAgLTE2MzIsNyArMTYyOSw2IEBACiAJfQogCiB9Ci0jZW5kaWYKIAogaW50IGllZWU4MDIxMV9wYXJzZV9pbmZvX3BhcmFtKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAogCQlzdHJ1Y3QgaWVlZTgwMjExX2luZm9fZWxlbWVudCAqaW5mb19lbGVtZW50LApAQCAtMjA4NiwxNCArMjA4MiwxMiBAQAogCQkJICAgICAgICJRb1MgRXJyb3IgbmVlZCB0byBwYXJzZSBRT1NfUEFSQU1FVEVSIElFXG4iKTsKIAkJCWJyZWFrOwogCi0jaWZkZWYgRU5BQkxFX0RPVDExRAogCQljYXNlIE1GSUVfVFlQRV9DT1VOVFJZOgogCQkJSUVFRTgwMjExX0RFQlVHX1NDQU4oIk1GSUVfVFlQRV9DT1VOVFJZOiAlZCBieXRlc1xuIiwKIAkJCQkJICAgICBpbmZvX2VsZW1lbnQtPmxlbik7CiAJCQkvL3ByaW50aygiPT09PT0+UmVjZWl2ZSA8JXM+IENvdW50cnkgSUVcbiIsbmV0d29yay0+c3NpZCk7CiAJCQlpZWVlODAyMTFfZXh0cmFjdF9jb3VudHJ5X2llKGllZWUsIGluZm9fZWxlbWVudCwgbmV0d29yaywgbmV0d29yay0+YnNzaWQpOy8vYWRkcjIgaXMgc2FtZSBhcyBhZGRyMyB3aGVuIGZyb20gYW4gQVAKIAkJCWJyZWFrOwotI2VuZGlmCiAvKiBUT0RPICovCiAJCWRlZmF1bHQ6CiAJCQlJRUVFODAyMTFfREVCVUdfTUdNVApAQCAtMjIyOSwxMCArMjIyMyw4IEBACiAjaWZkZWYgVEhPTUFTX1RVUkJPCiAJbmV0d29yay0+VHVyYm9fRW5hYmxlID0gMDsKICNlbmRpZgotI2lmZGVmIEVOQUJMRV9ET1QxMUQKIAluZXR3b3JrLT5Db3VudHJ5SWVMZW4gPSAwOwogCW1lbXNldChuZXR3b3JrLT5Db3VudHJ5SWVCdWYsIDAsIE1BWF9JRV9MRU4pOwotI2VuZGlmCiAvL0luaXRpYWxpemUgSFQgcGFyYW1ldGVycwogCS8vaWVlZTgwMjExX2h0X2luaXRpYWxpemUoJm5ldHdvcmstPmJzc2h0KTsKIAlIVEluaXRpYWxpemVCc3NEZXNjKCZuZXR3b3JrLT5ic3NodCk7CkBAIC0yMzk5LDEwICsyMzkxLDggQEAKIAlkc3QtPlR1cmJvX0VuYWJsZSA9IHNyYy0+VHVyYm9fRW5hYmxlOwogI2VuZGlmCiAKLSNpZmRlZiBFTkFCTEVfRE9UMTFECiAJZHN0LT5Db3VudHJ5SWVMZW4gPSBzcmMtPkNvdW50cnlJZUxlbjsKIAltZW1jcHkoZHN0LT5Db3VudHJ5SWVCdWYsIHNyYy0+Q291bnRyeUllQnVmLCBzcmMtPkNvdW50cnlJZUxlbik7Ci0jZW5kaWYKIAogCS8vYWRkZWQgYnkgYW15IGZvciBMRUFQCiAJZHN0LT5iV2l0aEFpcm9uZXRJRSA9IHNyYy0+YldpdGhBaXJvbmV0SUU7CkBAIC0yNDcwLDcgKzI0NjAsNiBAQAogCQlyZXR1cm47CiAJfQogCi0jaWZkZWYgRU5BQkxFX0RPVDExRAogCS8vIEZvciBBc3VzIEVlZVBjIHJlcXVlc3QsCiAJLy8gKDEpIGlmIHdpcmVsZXNzIGFkYXB0ZXIgcmVjZWl2ZSBnZXQgYW55IDgwMi4xMWQgY291bnRyeSBjb2RlIGluIEFQIGJlYWNvbiwKIAkvLwkgICB3aXJlbGVzcyBhZGFwdGVyIHNob3VsZCBmb2xsb3cgdGhlIGNvdW50cnkgY29kZS4KQEAgLTI1MjcsNyArMjUxNiw2IEBACiAJCQl9CiAJCX0KIAl9Ci0jZW5kaWYKIAogCS8qIFRoZSBuZXR3b3JrIHBhcnNlZCBjb3JyZWN0bHkgLS0gc28gbm93IHdlIHNjYW4gb3VyIGtub3duIG5ldHdvcmtzCiAJICogdG8gc2VlIGlmIHdlIGNhbiBmaW5kIGl0IGluIG91ciBsaXN0LgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9pZWVlODAyMTFfc29mdG1hYy5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9pZWVlODAyMTFfc29mdG1hYy5jCmluZGV4IGJjOGM0MjUuLjIwZjhjMzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvaWVlZTgwMjExX3NvZnRtYWMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2llZWU4MDIxMV9zb2Z0bWFjLmMKQEAgLTIxLDkgKzIxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+Ci0jaWZkZWYgRU5BQkxFX0RPVDExRAogI2luY2x1ZGUgImRvdDExZC5oIgotI2VuZGlmCiAKIHU4IHJzbl9hdXRoZW5fY2lwaGVyX3N1aXRlWzE2XVs0XSA9IHsKIAl7MHgwMCwweDBGLDB4QUMsMHgwMH0sIC8vVXNlIGdyb3VwIGtleSwgLy9SZXNlcnZlZApAQCAtNDMwLDEwICs0MjgsOCBAQAogdm9pZCBpZWVlODAyMTFfc29mdG1hY19zY2FuX3N5bmNybyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKIHsKIAlzaG9ydCBjaCA9IDA7Ci0jaWZkZWYgRU5BQkxFX0RPVDExRAogCXU4IGNoYW5uZWxfbWFwW01BWF9DSEFOTkVMX05VTUJFUisxXTsKIAltZW1jcHkoY2hhbm5lbF9tYXAsIEdFVF9ET1QxMURfSU5GTyhpZWVlKS0+Y2hhbm5lbF9tYXAsIE1BWF9DSEFOTkVMX05VTUJFUisxKTsKLSNlbmRpZgogCWRvd24oJmllZWUtPnNjYW5fc2VtKTsKIAogCXdoaWxlKDEpCkBAIC00NDMsMTEgKzQzOSw3IEBACiAJCQljaCsrOwogCQkJaWYgKGNoID4gTUFYX0NIQU5ORUxfTlVNQkVSKQogCQkJCWdvdG8gb3V0OyAvKiBzY2FuIGNvbXBsZXRlZCAqLwotI2lmZGVmIEVOQUJMRV9ET1QxMUQKIAkJfXdoaWxlKCFjaGFubmVsX21hcFtjaF0pOwotI2Vsc2UKLQkJfXdoaWxlKCFpZWVlLT5jaGFubmVsX21hcFtjaF0pOwotI2VuZGlmCiAKIAkJLyogdGhpcyBmdW5jdGlvbiBjYW4gYmUgY2FsbGVkIGluIHR3byBzaXR1YXRpb25zCiAJCSAqIDEtIFdlIGhhdmUgc3dpdGNoZWQgdG8gYWQtaG9jIG1vZGUgYW5kIHdlIGFyZQpAQCAtNDcxLDkgKzQ2Myw3IEBACiAJCWlmIChpZWVlLT5zdGF0ZSA9PSBJRUVFODAyMTFfTElOS0VEKQogCQkJZ290byBvdXQ7CiAJCWllZWUtPnNldF9jaGFuKGllZWUtPmRldiwgY2gpOwotI2lmZGVmIEVOQUJMRV9ET1QxMUQKIAkJaWYoY2hhbm5lbF9tYXBbY2hdID09IDEpCi0jZW5kaWYKIAkJaWVlZTgwMjExX3NlbmRfcHJvYmVfcmVxdWVzdHMoaWVlZSk7CiAKIAkJLyogdGhpcyBwcmV2ZW50IGV4Y2Vzc2l2ZSB0aW1lIHdhaXQgd2hlbiB3ZQpAQCAtNDk2LDEwICs0ODYsOCBAQAogCX0KIAllbHNlewogCWllZWUtPnN5bmNfc2Nhbl9odXJyeXVwID0gMDsKLSNpZmRlZiBFTkFCTEVfRE9UMTFECiAJaWYoSVNfRE9UMTFEX0VOQUJMRShpZWVlKSkKIAkJRE9UMTFEX1NjYW5Db21wbGV0ZShpZWVlKTsKLSNlbmRpZgogCXVwKCZpZWVlLT5zY2FuX3NlbSk7CiB9CiB9CkBAIC01MTAsMTAgKzQ5OCw4IEBACiAJc3RydWN0IGRlbGF5ZWRfd29yayAqZHdvcmsgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGRlbGF5ZWRfd29yaywgd29yayk7CiAJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUgPSBjb250YWluZXJfb2YoZHdvcmssIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlLCBzb2Z0bWFjX3NjYW5fd3EpOwogCXN0YXRpYyBzaG9ydCB3YXRjaGRvZyA9IDA7Ci0jaWZkZWYgRU5BQkxFX0RPVDExRAogCXU4IGNoYW5uZWxfbWFwW01BWF9DSEFOTkVMX05VTUJFUisxXTsKIAltZW1jcHkoY2hhbm5lbF9tYXAsIEdFVF9ET1QxMURfSU5GTyhpZWVlKS0+Y2hhbm5lbF9tYXAsIE1BWF9DSEFOTkVMX05VTUJFUisxKTsKLSNlbmRpZgogCWlmKCFpZWVlLT5pZWVlX3VwKQogCQlyZXR1cm47CiAJZG93bigmaWVlZS0+c2Nhbl9zZW0pOwpAQCAtNTIzLDI1ICs1MDksMTYgQEAKIAkJaWYgKHdhdGNoZG9nKysgPiBNQVhfQ0hBTk5FTF9OVU1CRVIpCiAJCXsKIAkJLy9pZiBjdXJyZW50IGNoYW5uZWwgaXMgbm90IGluIGNoYW5uZWwgbWFwLCBzZXQgdG8gZGVmYXVsdCBjaGFubmVsLgotCQkjaWZkZWYgRU5BQkxFX0RPVDExRAotCQkJaWYgKCFjaGFubmVsX21hcFtpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbF0pOwotCQkjZWxzZQotCQkJaWYgKCFpZWVlLT5jaGFubmVsX21hcFtpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbF0pOwotCQkjZW5kaWYKKwkJCWlmICghY2hhbm5lbF9tYXBbaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWxdKSB7CiAJCQkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWwgPSA2OwogCQkJCWdvdG8gb3V0OyAvKiBubyBnb29kIGNoYW5zICovCisJCQl9CiAJCX0KLSNpZmRlZiBFTkFCTEVfRE9UMTFECiAJfXdoaWxlKCFjaGFubmVsX21hcFtpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbF0pOwotI2Vsc2UKLQl9d2hpbGUoIWllZWUtPmNoYW5uZWxfbWFwW2llZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsXSk7Ci0jZW5kaWYKIAlpZiAoaWVlZS0+c2Nhbm5pbmcgPT0gMCApCiAJCWdvdG8gb3V0OwogCWllZWUtPnNldF9jaGFuKGllZWUtPmRldiwgaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWwpOwotI2lmZGVmIEVOQUJMRV9ET1QxMUQKIAlpZihjaGFubmVsX21hcFtpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbF0gPT0gMSkKLSNlbmRpZgogCWllZWU4MDIxMV9zZW5kX3Byb2JlX3JlcXVlc3RzKGllZWUpOwogCiAKQEAgLTU1MCwxMCArNTI3LDggQEAKIAl1cCgmaWVlZS0+c2Nhbl9zZW0pOwogCXJldHVybjsKIG91dDoKLSNpZmRlZiBFTkFCTEVfRE9UMTFECiAJaWYoSVNfRE9UMTFEX0VOQUJMRShpZWVlKSkKIAkJRE9UMTFEX1NjYW5Db21wbGV0ZShpZWVlKTsKLSNlbmRpZgogCWllZWUtPmFjdHNjYW5uaW5nID0gZmFsc2U7CiAJd2F0Y2hkb2cgPSAwOwogCWllZWUtPnNjYW5uaW5nID0gMDsKQEAgLTYzNSw3ICs2MTAsNiBAQAogLyogY2FsbGVkIHdpdGggaWVlZS0+bG9jayBoZWxkICovCiB2b2lkIGllZWU4MDIxMV9zdGFydF9zY2FuKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQogewotI2lmZGVmIEVOQUJMRV9ET1QxMUQKIAlpZihJU19ET1QxMURfRU5BQkxFKGllZWUpICkKIAl7CiAJCWlmKElTX0NPVU5UUllfSUVfVkFMSUQoaWVlZSkpCkBAIC02NDMsNyArNjE3LDYgQEAKIAkJCVJFU0VUX0NJRV9XQVRDSERPRyhpZWVlKTsKIAkJfQogCX0KLSNlbmRpZgogCWlmIChpZWVlLT5zb2Z0bWFjX2ZlYXR1cmVzICYgSUVFRV9TT0ZUTUFDX1NDQU4pewogCQlpZiAoaWVlZS0+c2Nhbm5pbmcgPT0gMCl7CiAJCQlpZWVlLT5zY2FubmluZyA9IDE7CkBAIC02NTcsNyArNjMwLDYgQEAKIC8qIGNhbGxlZCB3aXRoIHd4X3NlbSBoZWxkICovCiB2b2lkIGllZWU4MDIxMV9zdGFydF9zY2FuX3N5bmNybyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKIHsKLSNpZmRlZiBFTkFCTEVfRE9UMTFECiAJaWYoSVNfRE9UMTFEX0VOQUJMRShpZWVlKSApCiAJewogCQlpZihJU19DT1VOVFJZX0lFX1ZBTElEKGllZWUpKQpAQCAtNjY1LDcgKzYzNyw2IEBACiAJCQlSRVNFVF9DSUVfV0FUQ0hET0coaWVlZSk7CiAJCX0KIAl9Ci0jZW5kaWYKIAlpZWVlLT5zeW5jX3NjYW5faHVycnl1cCA9IDA7CiAJaWYgKGllZWUtPnNvZnRtYWNfZmVhdHVyZXMgJiBJRUVFX1NPRlRNQUNfU0NBTikKIAkJaWVlZTgwMjExX3NvZnRtYWNfc2Nhbl9zeW5jcm8oaWVlZSk7CkBAIC0yMzkwLDExICsyMzYxLDkgQEAKIAlpZWVlODAyMTFfc29mdG1hY19jaGVja19hbGxfbmV0cyhpZWVlKTsKIAogCi0jaWZkZWYgRU5BQkxFX0RPVDExRCAvL2lmIGNyZWF0aW5nIGFuIGFkLWhvYywgc2V0IGl0cyBjaGFubmVsIHRvIDEwIHRlbXBvcmFyaWx5LS10aGlzIGlzIHRoZSByZXF1aXJlbWVudCBmb3IgQVNVUywgbm90IDExRCwgc28gZGlzYWJsZSAxMWQuCiAvLwlpZigoSVNfRE9UMTFEX0VOQUJMRShpZWVlKSkgJiYgKGllZWUtPnN0YXRlID09IElFRUU4MDIxMV9OT0xJTkspKQogCWlmIChpZWVlLT5zdGF0ZSA9PSBJRUVFODAyMTFfTk9MSU5LKQogCQlpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbCA9IDY7Ci0jZW5kaWYKIAkvKiBpZiBub3QgdGhlbiB0aGUgc3RhdGUgaXMgbm90IGxpbmtlZC4gTWF5YmUgdGhlIHVzZXIgc3dpdGhjZWQgdG8KIAkgKiBhZC1ob2MgbW9kZSBqdXN0IGFmdGVyIGJlaW5nIGluIG1vbml0b3IgbW9kZSwgb3IganVzdCBhZnRlcgogCSAqIGJlaW5nIHZlcnkgZmV3IHRpbWUgaW4gbWFuYWdlZCBtb2RlIChzbyB0aGUgY2FyZCBoYXZlIGhhZCBubwpAQCAtMjQ4Myw3ICsyNDUyLDYgQEAKIHZvaWQgaWVlZTgwMjExX3N0YXJ0X2JzcyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotI2lmZGVmIEVOQUJMRV9ET1QxMUQKIAkvLwogCS8vIFJlZjogODAyLjExZCAxMS4xLjMuMwogCS8vIFNUQSBzaGFsbCBub3Qgc3RhcnQgYSBCU1MgdW5sZXNzIHByb3Blcmx5IGZvcm1lZCBCZWFjb24gZnJhbWUgaW5jbHVkaW5nIGEgQ291bnRyeSBJRS4KQEAgLTI0OTUsNyArMjQ2Myw2IEBACiAJCQlyZXR1cm47CiAJCX0KIAl9Ci0jZW5kaWYKIAkvKiBjaGVjayBpZiB3ZSBoYXZlIGFscmVhZHkgZm91bmQgdGhlIG5ldCB3ZQogCSAqIGFyZSBpbnRlcmVzdGVkIGluIChpZiBhbnkpLgogCSAqIGlmIG5vdCAod2UgYXJlIGRpc2Fzc29jaWF0ZWQgYW5kIHdlIGFyZSBub3QKQEAgLTI1MzAsMTAgKzI0OTcsOCBAQAogCiAJaWYgKGllZWUtPmRhdGFfaGFyZF9zdG9wKQogCQkJaWVlZS0+ZGF0YV9oYXJkX3N0b3AoaWVlZS0+ZGV2KTsKLSNpZmRlZiBFTkFCTEVfRE9UMTFECiAJaWYoSVNfRE9UMTFEX0VOQUJMRShpZWVlKSkKIAkJRG90MTFkX1Jlc2V0KGllZWUpOwotI2VuZGlmCiAJaWVlZS0+c3RhdGUgPSBJRUVFODAyMTFfTk9MSU5LOwogCWllZWUtPmlzX3NldF9rZXkgPSBmYWxzZTsKIAlpZWVlLT5saW5rX2NoYW5nZShpZWVlLT5kZXYpOwpAQCAtMjY2OSwxMSArMjYzNCw3IEBACiAJCQljaCsrOwogCQkJaWYgKGNoID4gTUFYX0NIQU5ORUxfTlVNQkVSKQogCQkJCXJldHVybjsgLyogbm8gY2hhbm5lbCBmb3VuZCAqLwotI2lmZGVmIEVOQUJMRV9ET1QxMUQKIAkJfXdoaWxlKCFHRVRfRE9UMTFEX0lORk8oaWVlZSktPmNoYW5uZWxfbWFwW2NoXSk7Ci0jZWxzZQotCQl9d2hpbGUoIWllZWUtPmNoYW5uZWxfbWFwW2NoXSk7Ci0jZW5kaWYKIAkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWwgPSBjaDsKIAl9CiAKQEAgLTI3MjEsMTEgKzI2ODIsOSBAQAogCWZvcihpID0gMDsgaSA8IDU7IGkrKykgewogCSAgaWVlZS0+c2VxX2N0cmxbaV0gPSAwOwogCX0KLSNpZmRlZiBFTkFCTEVfRE9UMTFECiAJaWVlZS0+cERvdDExZEluZm8gPSBremFsbG9jKHNpemVvZihSVF9ET1QxMURfSU5GTyksIEdGUF9BVE9NSUMpOwogCWlmICghaWVlZS0+cERvdDExZEluZm8pCiAJCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfRVJSLCAiY2FuJ3QgYWxsb2MgbWVtb3J5IGZvciBET1QxMURcbiIpOwotI2VuZGlmCiAJLy9hZGRlZCBmb3IgIEFQIHJvYW1pbmcKIAlpZWVlLT5MaW5rRGV0ZWN0SW5mby5TbG90TnVtID0gMjsKIAlpZWVlLT5MaW5rRGV0ZWN0SW5mby5OdW1SZWN2QmNuSW5QZXJpb2Q9MDsKQEAgLTI3OTYsMTMgKzI3NTUsMTEgQEAKIHZvaWQgaWVlZTgwMjExX3NvZnRtYWNfZnJlZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKIHsKIAlkb3duKCZpZWVlLT53eF9zZW0pOwotI2lmZGVmIEVOQUJMRV9ET1QxMUQKIAlpZihOVUxMICE9IGllZWUtPnBEb3QxMWRJbmZvKQogCXsKIAkJa2ZyZWUoaWVlZS0+cERvdDExZEluZm8pOwogCQlpZWVlLT5wRG90MTFkSW5mbyA9IE5VTEw7CiAJfQotI2VuZGlmCiAJZGVsX3RpbWVyX3N5bmMoJmllZWUtPmFzc29jaWF0ZV90aW1lcik7CiAKIAljYW5jZWxfZGVsYXllZF93b3JrKCZpZWVlLT5hc3NvY2lhdGVfcmV0cnlfd3EpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9pZWVlODAyMTFfc29mdG1hY193eC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9pZWVlODAyMTFfc29mdG1hY193eC5jCmluZGV4IGYzMzVjMjUuLmNiNWEzYzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvaWVlZTgwMjExX3NvZnRtYWNfd3guYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2llZWU4MDIxMV9zb2Z0bWFjX3d4LmMKQEAgLTE1LDkgKzE1LDcgQEAKIAogCiAjaW5jbHVkZSAiaWVlZTgwMjExLmgiCi0jaWZkZWYgRU5BQkxFX0RPVDExRAogI2luY2x1ZGUgImRvdDExZC5oIgotI2VuZGlmCiAvKiBGSVhNRTogYWRkIEEgZnJlcXMgKi8KIAogY29uc3QgbG9uZyBpZWVlODAyMTFfd2xhbl9mcmVxdWVuY2llc1tdID0gewpAQCAtNjMsMTIgKzYxLDEwIEBACiAKIAl9ZWxzZSB7IC8qIFNldCB0aGUgY2hhbm5lbCAqLwogCi0jaWZkZWYgRU5BQkxFX0RPVDExRAogCQlpZiAoIShHRVRfRE9UMTFEX0lORk8oaWVlZSktPmNoYW5uZWxfbWFwKVtmd3JxLT5tXSkgewogCQkJcmV0ID0gLUVJTlZBTDsKIAkJCWdvdG8gb3V0OwogCQl9Ci0jZW5kaWYKIAkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWwgPSBmd3JxLT5tOwogCQlpZWVlLT5zZXRfY2hhbihpZWVlLT5kZXYsIGllZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9pZWVlODAyMTFfdHguYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvaWVlZTgwMjExX3R4LmMKaW5kZXggODFhYTJlZC4uZWM3ODQ1ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9pZWVlODAyMTFfdHguYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2llZWU4MDIxMV90eC5jCkBAIC03NTQsNyArNzU0LDcgQEAKIAkJewogCQkJdHhiLT5xdWV1ZV9pbmRleCA9IFVQMkFDKHNrYi0+cHJpb3JpdHkpOwogCQl9IGVsc2UgewotCQkJdHhiLT5xdWV1ZV9pbmRleCA9IFdNRV9BQ19CSzs7CisJCQl0eGItPnF1ZXVlX2luZGV4ID0gV01FX0FDX0JLOwogCQl9CiAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTkyVV9jb3JlLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOTJVX2NvcmUuYwppbmRleCA0OTRmMTgwLi5hZTRmMmI5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOTJVX2NvcmUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOTJVX2NvcmUuYwpAQCAtNzcsOSArNzcsNyBAQAogI2luY2x1ZGUgInI4MTkyX3BtLmgiCiAjZW5kaWYKIAotI2lmZGVmIEVOQUJMRV9ET1QxMUQKICNpbmNsdWRlICJkb3QxMWQuaCIKLSNlbmRpZgogLy9zZXQgaGVyZSB0byBvcGVuIHlvdXIgdHJhY2UgY29kZS4gLy9XQgogdTMyIHJ0X2dsb2JhbF9kZWJ1Z19jb21wb25lbnQgPSBcCiAJCQkvLwlDT01QX0lOSVQgICAgCXwKQEAgLTE2Niw3ICsxNjQsNiBAQAogI2VuZGlmCiB9OwogCi0jaWZkZWYgRU5BQkxFX0RPVDExRAogCiB0eXBlZGVmIHN0cnVjdCBfQ0hBTk5FTF9MSVNUCiB7CkBAIC0yNDIsOSArMjM5LDcgQEAKIAl9CiAJcmV0dXJuOwogfQotI2VuZGlmCiAKLSNkZWZpbmUgZXFNYWNBZGRyKGEsYikgKCAoKGEpWzBdPT0oYilbMF0gJiYgKGEpWzFdPT0oYilbMV0gJiYgKGEpWzJdPT0oYilbMl0gJiYgKGEpWzNdPT0oYilbM10gJiYgKGEpWzRdPT0oYilbNF0gJiYgKGEpWzVdPT0oYilbNV0pID8gMTowICkKIAogI2RlZmluZSAJcnhfaGFsX2lzX2Nja19yYXRlKF9wZHJ2aW5mbylcCiAJCQkoX3BkcnZpbmZvLT5SeFJhdGUgPT0gREVTQzkwX1JBVEUxTSB8fFwKQEAgLTE1MDcsNyArMTUwMiw3IEBACiAJewogCQkvLwogCQkvLyBIYW5kbGUgSFcgQmVhY29uOgotCQkvLyBXZSBoYWQgdHJhbnNmZXIgb3VyIGJlYWNvbiBmcmFtZSB0byBob3N0IGNvbnRyb2xlciBhdCB0aGlzIG1vbWVudC4KKwkJLy8gV2UgaGFkIHRyYW5zZmVyIG91ciBiZWFjb24gZnJhbWUgdG8gaG9zdCBjb250cm9sbGVyIGF0IHRoaXMgbW9tZW50LgogCQkvLwogCQkvLwogCQkvLyBDYXV0aW9uOgpAQCAtMjIwMyw2ICsyMTk4LDggQEAKIAogCXByaXYtPnJ4X3VyYiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB1cmIgKikgKiAoTUFYX1JYX1VSQisxKSwKIAkJCQlHRlBfS0VSTkVMKTsKKwlpZiAocHJpdi0+cnhfdXJiID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOwogCiAjaWZuZGVmIEpBQ0tTT05fTkVXX1JYCiAJZm9yKGk9MDtpPChNQVhfUlhfVVJCKzEpO2krKyl7CkBAIC0zMTU1LDcgKzMxNTIsNiBAQAogc2hvcnQgcnRsODE5Ml9nZXRfY2hhbm5lbF9tYXAoc3RydWN0IG5ldF9kZXZpY2UgKiBkZXYpCiB7CiAJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOwotI2lmZGVmIEVOQUJMRV9ET1QxMUQKIAlpZihwcml2LT5DaGFubmVsUGxhbiA+IENPVU5UUllfQ09ERV9HTE9CQUxfRE9NQUlOKXsKIAkJcHJpbnRrKCJydGw4MTgwX2luaXQ6RXJyb3IgY2hhbm5lbCBwbGFuISBTZXQgdG8gZGVmYXVsdC5cbiIpOwogCQlwcml2LT5DaGFubmVsUGxhbj0gMDsKQEAgLTMxNjMsMjEgKzMxNTksNiBAQAogCVJUX1RSQUNFKENPTVBfSU5JVCwgIkNoYW5uZWwgcGxhbiBpcyAlZFxuIixwcml2LT5DaGFubmVsUGxhbik7CiAKIAlydGw4MTl4X3NldF9jaGFubmVsX21hcChwcml2LT5DaGFubmVsUGxhbiwgcHJpdik7Ci0jZWxzZQotCWludCBjaCxpOwotCS8vU2V0IERlZmF1bHQgQ2hhbm5lbCBQbGFuCi0JaWYoIWNoYW5uZWxzKXsKLQkJRE1FU0coIk5vIGNoYW5uZWxzLCBhYm9ydGluZyIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCWNoPWNoYW5uZWxzOwotCXByaXYtPkNoYW5uZWxQbGFuPSAwOy8vaGlrYXJ1Ci0JIC8vIHNldCBjaGFubmVscyAxLi4xNCBhbGxvd2VkIGluIGdpdmVuIGxvY2FsZQotCWZvciAoaT0xOyBpPD0xNDsgaSsrKSB7Ci0JCShwcml2LT5pZWVlODAyMTEtPmNoYW5uZWxfbWFwKVtpXSA9ICh1OCkoY2ggJiAweDAxKTsKLQkJY2ggPj49IDE7Ci0JfQotI2VuZGlmCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTUwODUsNyArNTA2Niw3IEBACiAJCQkvL0dldCBSeCBzbnIgdmFsdWUgaW4gREIKIAkJCXRtcF9yeHNuciA9CXBvZmRtX2J1Zi0+cnhzbnJfWFtpXTsKIAkJCXJ4X3NuclggPSAoY2hhcikodG1wX3J4c25yKTsKLQkJCS8vcnhfc25yWCA+Pj0gMTs7CisJCQkvL3J4X3NuclggPj49IDE7CiAJCQlyeF9zbnJYIC89IDI7CiAJCQlwcml2LT5zdGF0cy5yeFNOUmRCW2ldID0gKGxvbmcpcnhfc25yWDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTkyVV93eC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTkyVV93eC5jCmluZGV4IDI1ZDVjODcuLmY2NDA4ZjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5MlVfd3guYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOTJVX3d4LmMKQEAgLTIxLDkgKzIxLDcgQEAKICNpbmNsdWRlICJyODE5MlUuaCIKICNpbmNsdWRlICJyODE5MlVfaHcuaCIKIAotI2lmZGVmIEVOQUJMRV9ET1QxMUQKICNpbmNsdWRlICJkb3QxMWQuaCIKLSNlbmRpZgogCiAjZGVmaW5lIFJBVEVfQ09VTlQgMTIKIHUzMiBydGw4MTgwX3JhdGVzW10gPSB7MTAwMDAwMCwyMDAwMDAwLDU1MDAwMDAsMTEwMDAwMDAsCkBAIC00NTgsMTEgKzQ1Niw3IEBACiAJZm9yIChpID0gMCwgdmFsID0gMDsgaSA8IDE0OyBpKyspIHsKIAogCQkvLyBJbmNsdWRlIG9ubHkgbGVnYWwgZnJlcXVlbmNpZXMgZm9yIHNvbWUgY291bnRyaWVzCi0jaWZkZWYgRU5BQkxFX0RPVDExRAogCQlpZiAoKEdFVF9ET1QxMURfSU5GTyhwcml2LT5pZWVlODAyMTEpLT5jaGFubmVsX21hcClbaSsxXSkgewotI2Vsc2UKLQkJaWYgKChwcml2LT5pZWVlODAyMTEtPmNoYW5uZWxfbWFwKVtpKzFdKSB7Ci0jZW5kaWYKIAkJCXJhbmdlLT5mcmVxW3ZhbF0uaSA9IGkgKyAxOwogCQkJcmFuZ2UtPmZyZXFbdmFsXS5tID0gaWVlZTgwMjExX3dsYW5fZnJlcXVlbmNpZXNbaV0gKiAxMDAwMDA7CiAJCQlyYW5nZS0+ZnJlcVt2YWxdLmUgPSAxOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTl4VV9waHkuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5eFVfcGh5LmMKaW5kZXggYTNhZGFlZC4uNDE2ODRlOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTl4VV9waHkuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOXhVX3BoeS5jCkBAIC02LDkgKzYsNyBAQAogI2luY2x1ZGUgInI4MTkyVV9kbS5oIgogI2luY2x1ZGUgInI4MTl4VV9maXJtd2FyZV9pbWcuaCIKIAotI2lmZGVmIEVOQUJMRV9ET1QxMUQKICNpbmNsdWRlICJkb3QxMWQuaCIKLSNlbmRpZgogc3RhdGljIHUzMiBSRl9DSEFOTkVMX1RBQkxFX1pFQlJBW10gPSB7CiAJMCwKIAkweDA4NWMsIC8vMjQxMiAxCkBAIC0xMDExLDcgKzEwMDksNyBAQAogCQkJYnJlYWs7CiAJfQogCi0JcmV0dXJuIHJldDs7CisJcmV0dXJuIHJldDsKIAogfQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMTI1NywxMyArMTI1NSwxMSBAQAogCiAJUlRfVFJBQ0UoQ09NUF9DSCwgIj09PT0+JXMoKT09PT1zdGFnZTolZCwgc3RlcDolZCwgY2hhbm5lbDolZFxuIiwgX19GVU5DVElPTl9fLCAqc3RhZ2UsICpzdGVwLCBjaGFubmVsKTsKIC8vCVJUX0FTU0VSVChJc0xlZ2FsQ2hhbm5lbChBZGFwdGVyLCBjaGFubmVsKSwgKCJpbGxlZ2FsIGNoYW5uZWw6ICVkXG4iLCBjaGFubmVsKSk7Ci0jaWZkZWYgRU5BQkxFX0RPVDExRAogCWlmICghSXNMZWdhbENoYW5uZWwocHJpdi0+aWVlZTgwMjExLCBjaGFubmVsKSkKIAl7CiAJCVJUX1RSQUNFKENPTVBfRVJSLCAiPT09PT09PT09PT09PT5zZXQgdG8gaWxsZWdhbCBjaGFubmVsOiVkXG4iLCBjaGFubmVsKTsKIAkJcmV0dXJuIHRydWU7IC8vcmV0dXJuIHRydWUgdG8gdGVsbCB1cHBlciBjYWxsZXIgZnVuY3Rpb24gdGhpcyBjaGFubmVsIHNldHRpbmcgaXMgZmluaXNoZWQhIE9yIGl0IHdpbGwgaW4gd2hpbGUgbG9vcC4KIAl9Ci0jZW5kaWYKIC8vRklYTUU6bmVlZCB0byBjaGVjayB3aGV0aGVyIGNoYW5uZWwgaXMgbGVnYWwgb3Igbm90IGhlcmUuV0IKIAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9UT0RPIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvVE9ETwppbmRleCA1Yzg4ODIxLi4yYWE1ZGViIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9UT0RPCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL1RPRE8KQEAgLTMsNyArMyw2IEBACiAtIHN3aXRjaCB0byB1c2UgTElCODAyMTEKIC0gc3dpdGNoIHRvIHVzZSBNQUM4MDIxMQogLSBjaGVja3BhdGNoLnBsIGZpeGVzIC0gb25seSBhIGZldyByZW1haW4KLS0gc3BhcnNlIGZpeGVzCiAtIHN3aXRjaCBmcm9tIGxhcmdlIGlubGluZSBmaXJtd2FyZSBmaWxlIHRvIHVzZSB0aGUgZmlybXdhcmUgaW50ZXJmYWNlCiAgIGFuZCBhZGQgdGhlIGZpbGUgdG8gdGhlIGxpbnV4LWZpcm13YXJlIHBhY2thZ2UuCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL29zZGVwX3NlcnZpY2UuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL29zZGVwX3NlcnZpY2UuaAppbmRleCA4MzFkODFlLi4zNmVlYjVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9vc2RlcF9zZXJ2aWNlLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvb3NkZXBfc2VydmljZS5oCkBAIC0xOTUsMTAgKzE5NSw3IEBACiAKIHN0YXRpYyBpbmxpbmUgdTggKl9tYWxsb2ModTMyIHN6KQogewotCXU4ICpwYnVmOwotCi0JcGJ1ZiA9CWttYWxsb2Moc3osIEdGUF9BVE9NSUMpOwotCXJldHVybiBwYnVmOworCXJldHVybglrbWFsbG9jKHN6LCBHRlBfQVRPTUlDKTsKIH0KIAogc3RhdGljIGlubGluZSB1bnNpZ25lZCBjaGFyIF9jYW5jZWxfdGltZXJfZXgoc3RydWN0IHRpbWVyX2xpc3QgKnB0aW1lcikKQEAgLTIyMCwzNCArMjE3LDIyIEBACiAKIHN0YXRpYyBpbmxpbmUgdTMyIF9STkQ4KHUzMiBzeikKIHsKLQl1MzIJdmFsOwotCi0JdmFsID0gKChzeiA+PiAzKSArICgoc3ogJiA3KSA/IDEgOiAwKSkgPDwgMzsKLQlyZXR1cm4gdmFsOworCXJldHVybiAoKHN6ID4+IDMpICsgKChzeiAmIDcpID8gMSA6IDApKSA8PCAzOwogfQogCiBzdGF0aWMgaW5saW5lIHUzMiBfUk5EMTI4KHUzMiBzeikKIHsKLQl1MzIJdmFsOwotCi0JdmFsID0gKChzeiA+PiA3KSArICgoc3ogJiAxMjcpID8gMSA6IDApKSA8PCA3OwotCXJldHVybiB2YWw7CisJcmV0dXJuICgoc3ogPj4gNykgKyAoKHN6ICYgMTI3KSA/IDEgOiAwKSkgPDwgNzsKIH0KIAogc3RhdGljIGlubGluZSB1MzIgX1JORDI1Nih1MzIgc3opCiB7Ci0JdTMyCXZhbDsKLQotCXZhbCA9ICgoc3ogPj4gOCkgKyAoKHN6ICYgMjU1KSA/IDEgOiAwKSkgPDwgODsKLQlyZXR1cm4gdmFsOworCXJldHVybiAoKHN6ID4+IDgpICsgKChzeiAmIDI1NSkgPyAxIDogMCkpIDw8IDg7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdTMyIF9STkQ1MTIodTMyIHN6KQogewotCXUzMgl2YWw7Ci0KLQl2YWwgPSAoKHN6ID4+IDkpICsgKChzeiAmIDUxMSkgPyAxIDogMCkpIDw8IDk7Ci0JcmV0dXJuIHZhbDsKKwlyZXR1cm4gKChzeiA+PiA5KSArICgoc3ogJiA1MTEpID8gMSA6IDApKSA8PCA5OwogfQogCiAjZGVmaW5lIFNUUlVDVF9QQUNLRUQgX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzEyX2VmdXNlLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzEyX2VmdXNlLmMKaW5kZXggOTczMGFlMS4uMWRjMTJiNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxMl9lZnVzZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MTJfZWZ1c2UuYwpAQCAtNDI4LDcgKzQyOCw3IEBACiAJCSAgICAgIHUxNiBjbnRzLCB1OCAqZGF0YSkKIHsKIAlpbnQgaTsKLQl1OCByZXMgPSB0cnVlOzsKKwl1OCByZXMgPSB0cnVlOwogCiAJaWYgKHN0YXJ0X2FkZHIgPiBFRlVTRV9NQVhfU0laRSkKIAkJcmV0dXJuIGZhbHNlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxMl94bWl0LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzEyX3htaXQuYwppbmRleCA4ZWRjNTE4Li44OGExNTA0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzEyX3htaXQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzEyX3htaXQuYwpAQCAtMTQ4LDcgKzE0OCw3IEBACiAJCWNhc2UgMHgxMToKIAkJY2FzZSAweDEyOgogCQljYXNlIDB4MTM6Ci0JCQlhZGRyID0gUlRMODcxMl9ETUFfSDJDQ01EOzsKKwkJCWFkZHIgPSBSVEw4NzEyX0RNQV9IMkNDTUQ7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCWFkZHIgPSBSVEw4NzEyX0RNQV9CRVE7LypSVEw4NzEyX0VQX0xPOyovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X3htaXQuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfeG1pdC5jCmluZGV4IGI4MTk1ZTMuLjc1ZjFhNmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfeG1pdC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfeG1pdC5jCkBAIC0zNzIsNyArMzcyLDcgQEAKIAkJCQkJICAgMHgwLCAweDAsIDB4MCwgMHgwLCAweDAsIDB4MCwgMHgwLAogCQkJCQkgICAweDAsIDB4MH07CiAJCQlkYXRhbGVuID0gcGF0dHJpYi0+cGt0bGVuIC0gcGF0dHJpYi0+aGRybGVuOwotCQkJcGZyYW1lID0gcHhtaXRmcmFtZS0+YnVmX2FkZHIgKyBUWERFU0NfT0ZGU0VUOzsKKwkJCXBmcmFtZSA9IHB4bWl0ZnJhbWUtPmJ1Zl9hZGRyICsgVFhERVNDX09GRlNFVDsKIAkJCWlmIChibWNzdCkgewogCQkJCWlmICghbWVtY21wKHBzZWN1cml0eXByaXYtPlhHcnB0eG1pY2tleQogCQkJCSAgIFtwc2VjdXJpdHlwcml2LT5YR3JwS2V5aWRdLnNrZXksCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi91c2JfaW50Zi5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvdXNiX2ludGYuYwppbmRleCBmMWYwYzYzLi5hNjkyZWU4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi91c2JfaW50Zi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3VzYl9pbnRmLmMKQEAgLTUyNyw3ICs1MjcsNyBAQAogc3RhdGljIHZvaWQgcjg3MXh1X2Rldl9yZW1vdmUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKnB1c2JfaW50ZikKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqcG5ldGRldiA9IHVzYl9nZXRfaW50ZmRhdGEocHVzYl9pbnRmKTsKLQlzdHJ1Y3QgX2FkYXB0ZXIgKnBhZGFwdGVyID0gKHN0cnVjdCBfYWRhcHRlciAqKW5ldGRldl9wcml2KHBuZXRkZXYpOworCXN0cnVjdCBfYWRhcHRlciAqcGFkYXB0ZXIgPSBuZXRkZXZfcHJpdihwbmV0ZGV2KTsKIAlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiA9IGludGVyZmFjZV90b191c2JkZXYocHVzYl9pbnRmKTsKIAogCWlmIChwYWRhcHRlcikgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NlcC9LY29uZmlnIGIvZHJpdmVycy9zdGFnaW5nL3NlcC9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyYmYxNjYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvc2VwL0tjb25maWcKQEAgLTAsMCArMSwxMCBAQAorY29uZmlnIERYX1NFUAorCXRyaXN0YXRlICJEaXNjcmV0aXggU0VQIGRyaXZlciIKKwlkZXBlbmRzIG9uIFBDSQorCWhlbHAKKwkgIERpc2NyZXRpeCBTRVAgZHJpdmVyOyB1c2VkIGZvciB0aGUgc2VjdXJpdHkgcHJvY2Vzc29yIHN1YnN5c3RlbQorCSAgb24gYmFyZCB0aGUgSW50ZWwgTW9iaWxlIEludGVybmV0IERldmljZS4KKworCSAgVGhlIGRyaXZlcidzIG5hbWUgaXMgc2VwX2RyaXZlci4KKworCSAgSWYgdW5zdXJlLCBzZWxlY3QgTi4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zZXAvTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvc2VwL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyOGQ1ZjkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvc2VwL01ha2VmaWxlCkBAIC0wLDAgKzEsMiBAQAorb2JqLSQoQ09ORklHX0RYX1NFUCkgOj0gc2VwX2RyaXZlci5vCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zZXAvVE9ETyBiL2RyaXZlcnMvc3RhZ2luZy9zZXAvVE9ETwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODljMjQwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3NlcC9UT0RPCkBAIC0wLDAgKzEsNSBAQAorVG9kbydzIHNvIGZhciAoZnJvbSBBbGFuIENveCkKKy0gQ2hlY2sgd2hldGhlciBpdCBjYW4gYmUgcGx1Z2dlZCBpbnRvIGFueSBvZiB0aGUga2VybmVsIGNyeXB0byBBUEkKKyAgaW50ZXJmYWNlcyAtIENyeXB0byBBUEkgJ2dsdWUnIGlzIHN0aWxsIG5vdCByZWFkeSB0byBzdWJtaXQKKy0gQ2xlYW4gdXAgdW51c2VkIGlvY3RscyAtIE5lZWRzIHZlbmRvciBoZWxwCistIENsZWFuIHVwIHVudXNlZCBmaWVsZHMgaW4gaW9jdGwgc3RydWN0dXJlcyAtIE5lZWRzIHZlbmRvciBoZWxwCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc2VwL3NlcF9kZXYuaCBiL2RyaXZlcnMvc3RhZ2luZy9zZXAvc2VwX2Rldi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmZmU2OGMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvc2VwL3NlcF9kZXYuaApAQCAtMCwwICsxLDE1NiBAQAorI2lmbmRlZiBfX1NFUF9ERVZfSF9fCisjZGVmaW5lIF9fU0VQX0RFVl9IX18KKworLyoKKyAqCisgKiAgc2VwX2Rldi5oIC0gU2VjdXJpdHkgUHJvY2Vzc29yIERldmljZSBTdHJ1Y3R1cmVzCisgKgorICogIENvcHlyaWdodChjKSAyMDA5LDIwMTAgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiAgQ29udHJpYnV0aW9ucyhjKSAyMDA5LDIwMTAgRGlzY3JldGl4LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiAgU29mdHdhcmUgRm91bmRhdGlvbjsgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqICBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiAgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiAgdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5CisgKiAgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisgKgorICogIENPTlRBQ1RTOgorICoKKyAqICBNYXJrIEFsbHluCQltYXJrLmEuYWxseW5AaW50ZWwuY29tCisgKiAgSmF5YW50IE1hbmdhbGFtcGFsbGkgamF5YW50Lm1hbmdhbGFtcGFsbGlAaW50ZWwuY29tCisgKgorICogIENIQU5HRVMKKyAqICAyMDEwLjA5LjE0ICB1cGdyYWRlIHRvIE1lZGZpZWxkCisgKi8KKworc3RydWN0IHNlcF9kZXZpY2UgeworCS8qIHBvaW50ZXIgdG8gcGNpIGRldiAqLworCXN0cnVjdCBwY2lfZGV2ICpwZGV2OworCisJLyogY2hhcmFjdGVyIGRldmljZSBmaWxlICovCisJc3RydWN0IGNkZXYgc2VwX2NkZXY7CisJc3RydWN0IGNkZXYgc2VwX2RhZW1vbl9jZGV2OworCXN0cnVjdCBjZGV2IHNlcF9zaW5nbGV0b25fY2RldjsKKworCS8qIGRldmljZXMgKHVzaW5nIG1pc2MgZGV2KSAqLworCXN0cnVjdCBtaXNjZGV2aWNlIG1pc2NkZXZfc2VwOworCXN0cnVjdCBtaXNjZGV2aWNlIG1pc2NkZXZfc2luZ2xldG9uOworCXN0cnVjdCBtaXNjZGV2aWNlIG1pc2NkZXZfZGFlbW9uOworCisJLyogbWFqb3IgLyBtaW5vciBudW1iZXJzIG9mIGRldmljZSAqLworCWRldl90IHNlcF9kZXZubzsKKwlkZXZfdCBzZXBfZGFlbW9uX2Rldm5vOworCWRldl90IHNlcF9zaW5nbGV0b25fZGV2bm87CisKKwlzdHJ1Y3QgbXV0ZXggc2VwX211dGV4OworCXN0cnVjdCBtdXRleCBpb2N0bF9tdXRleDsKKwlzcGlubG9ja190IHNuZF9ycGx5X2xjazsKKworCS8qIGZsYWdzIHRvIGluZGljYXRlIHVzZSBhbmQgbG9jayBzdGF0dXMgb2Ygc2VwICovCisJdTMyIHBpZF9kb2luZ190cmFuc2FjdGlvbjsKKwl1bnNpZ25lZCBsb25nIGluX3VzZV9mbGFnczsKKworCS8qIHJlcXVlc3QgZGFlbW9uIGFscmVhZCBvcGVuICovCisJdW5zaWduZWQgbG9uZyByZXF1ZXN0X2RhZW1vbl9vcGVuOworCisJLyogMSA9IE1vb3Jlc3Rvd247IDAgPSBNZWRmaWVsZCAqLworCWludCBtcnN0OworCisJLyogYWRkcmVzcyBvZiB0aGUgc2hhcmVkIG1lbW9yeSBhbGxvY2F0ZWQgZHVyaW5nIGluaXQgZm9yIFNFUCBkcml2ZXIKKwkgICAoY29oZXJlbnQgYWxsb2MpICovCisJZG1hX2FkZHJfdCBzaGFyZWRfYnVzOworCXNpemVfdCBzaGFyZWRfc2l6ZTsKKwl2b2lkICpzaGFyZWRfYWRkcjsKKworCS8qIHJlc3RyaWN0ZWQgYWNjZXNzIHJlZ2lvbiAoY29oZXJlbnQgYWxsb2MpICovCisJZG1hX2FkZHJfdCByYXJfYnVzOworCXNpemVfdCByYXJfc2l6ZTsKKwl2b2lkICpyYXJfYWRkcjsKKworCS8qIEZpcm13YXJlIHJlZ2lvbnM7IGNhY2hlIGlzIGF0IHJhciBmb3IgTW9vcmVzdG93biBhbmQKKwkgICByZXNpZGVudCBpcyBhdCByYXIgZm9yIE1lZGZpZWxkICovCisJZG1hX2FkZHJfdCBjYWNoZV9idXM7CisJc2l6ZV90IGNhY2hlX3NpemU7CisJdm9pZCAqY2FjaGVfYWRkcjsKKworCWRtYV9hZGRyX3QgcmVzaWRlbnRfYnVzOworCXNpemVfdCByZXNpZGVudF9zaXplOworCXZvaWQgKnJlc2lkZW50X2FkZHI7CisKKwkvKiBzZXAncyBzY3JhdGNocGFkICovCisJZG1hX2FkZHJfdCBkY2FjaGVfYnVzOworCXNpemVfdCBkY2FjaGVfc2l6ZTsKKwl2b2lkICpkY2FjaGVfYWRkcjsKKworCS8qIE9ubHkgdXNlZCBvbiBNZWRmaWVsZCAqLworCWRtYV9hZGRyX3QgZXh0YXBwX2J1czsKKwlzaXplX3QgZXh0YXBwX3NpemU7CisJdm9pZCAqZXh0YXBwX2FkZHI7CisKKwkvKiBzdGFydCBhZGRyZXNzIG9mIHRoZSBhY2Nlc3MgdG8gdGhlIFNFUCByZWdpc3RlcnMgZnJvbSBkcml2ZXIgKi8KKwlkbWFfYWRkcl90IHJlZ19waHlzaWNhbF9hZGRyOworCWRtYV9hZGRyX3QgcmVnX3BoeXNpY2FsX2VuZDsKKwl2b2lkIF9faW9tZW0gKnJlZ19hZGRyOworCisJLyogd2FpdCBxdWV1ZSBoZWFkIChldmVudCkgb2YgdGhlIGRyaXZlciAqLworCXdhaXRfcXVldWVfaGVhZF90IGV2ZW50OworCXdhaXRfcXVldWVfaGVhZF90IGV2ZW50X3JlcXVlc3RfZGFlbW9uOworCXdhaXRfcXVldWVfaGVhZF90IGV2ZW50X21tYXA7CisKKwlzdHJ1Y3Qgc2VwX2NhbGxlcl9pZF9lbnRyeQorCQljYWxsZXJfaWRfdGFibGVbU0VQX0NBTExFUl9JRF9UQUJMRV9OVU1fRU5UUklFU107CisKKwkvKiBhY2Nlc3MgZmxhZyBmb3Igc2luZ2xldG9uIGRldmljZSAqLworCXVuc2lnbmVkIGxvbmcgc2luZ2xldG9uX2FjY2Vzc19mbGFnOworCisJLyogdHJhbnNhY3Rpb24gY291bnRlciB0aGF0IGNvb3JkaW5hdGVzIHRoZQorCSAgIHRyYW5zYWN0aW9ucyBiZXR3ZWVuIFNFUCBhbmQgSE9TVCAqLworCXVuc2lnbmVkIGxvbmcgc2VuZF9jdDsKKwkvKiBjb3VudGVyIGZvciB0aGUgbWVzc2FnZXMgZnJvbSBzZXAgKi8KKwl1bnNpZ25lZCBsb25nIHJlcGx5X2N0OworCS8qIGNvdW50ZXIgZm9yIHRoZSBudW1iZXIgb2YgYnl0ZXMgYWxsb2NhdGVkIGluIHRoZSBwb29sIGZvciB0aGUKKwkgICBjdXJyZW50IHRyYW5zYWN0aW9uICovCisJbG9uZyBkYXRhX3Bvb2xfYnl0ZXNfYWxsb2NhdGVkOworCisJdTMyIG51bV9vZl9kYXRhX2FsbG9jYXRpb25zOworCisJLyogbnVtYmVyIG9mIHRoZSBsbGkgdGFibGVzIGNyZWF0ZWQgaW4gdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb24gKi8KKwl1MzIgICAgIG51bV9sbGlfdGFibGVzX2NyZWF0ZWQ7CisKKwkvKiBudW1iZXIgb2YgZGF0YSBjb250cm9sIGJsb2NrcyAqLworCXUzMiBucl9kY2JfY3JlYXQ7CisKKwlzdHJ1Y3Qgc2VwX2RtYV9yZXNvdXJjZSBkbWFfcmVzX2FycltTRVBfTUFYX05VTV9TWU5DX0RNQV9PUFNdOworCit9OworCitzdGF0aWMgaW5saW5lIHZvaWQgc2VwX3dyaXRlX3JlZyhzdHJ1Y3Qgc2VwX2RldmljZSAqZGV2LCBpbnQgcmVnLCB1MzIgdmFsdWUpCit7CisJdm9pZCBfX2lvbWVtICphZGRyID0gZGV2LT5yZWdfYWRkciArIHJlZzsKKwl3cml0ZWwodmFsdWUsIGFkZHIpOworfQorCitzdGF0aWMgaW5saW5lIHUzMiBzZXBfcmVhZF9yZWcoc3RydWN0IHNlcF9kZXZpY2UgKmRldiwgaW50IHJlZykKK3sKKwl2b2lkIF9faW9tZW0gKmFkZHIgPSBkZXYtPnJlZ19hZGRyICsgcmVnOworCXJldHVybiByZWFkbChhZGRyKTsKK30KKworLyogd2FpdCBmb3IgU1JBTSB3cml0ZSBjb21wbGV0ZShpbmRpcmVjdCB3cml0ZSAqLworc3RhdGljIGlubGluZSB2b2lkIHNlcF93YWl0X3NyYW1fd3JpdGUoc3RydWN0IHNlcF9kZXZpY2UgKmRldikKK3sKKwl1MzIgcmVnX3ZhbDsKKwlkbyB7CisJCXJlZ192YWwgPSBzZXBfcmVhZF9yZWcoZGV2LCBIV19TUkFNX0RBVEFfUkVBRFlfUkVHX0FERFIpOworCX0gd2hpbGUgKCEocmVnX3ZhbCAmIDEpKTsKK30KKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zZXAvc2VwX2RyaXZlci5jIGIvZHJpdmVycy9zdGFnaW5nL3NlcC9zZXBfZHJpdmVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWM1ZDU2OQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zZXAvc2VwX2RyaXZlci5jCkBAIC0wLDAgKzEsMzU3NyBAQAorLyoKKyAqCisgKiAgc2VwX2RyaXZlci5jIC0gU2VjdXJpdHkgUHJvY2Vzc29yIERyaXZlciBtYWluIGdyb3VwIG9mIGZ1bmN0aW9ucworICoKKyAqICBDb3B5cmlnaHQoYykgMjAwOSwyMDEwIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogIENvbnRyaWJ1dGlvbnMoYykgMjAwOSwyMDEwIERpc2NyZXRpeC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogIFNvZnR3YXJlIEZvdW5kYXRpb247IHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZS4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiAgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiAgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICogIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqICBDT05UQUNUUzoKKyAqCisgKiAgTWFyayBBbGx5bgkJbWFyay5hLmFsbHluQGludGVsLmNvbQorICogIEpheWFudCBNYW5nYWxhbXBhbGxpIGpheWFudC5tYW5nYWxhbXBhbGxpQGludGVsLmNvbQorICoKKyAqICBDSEFOR0VTOgorICoKKyAqICAyMDA5LjA2LjI2CUluaXRpYWwgcHVibGlzaAorICogIDIwMTAuMDkuMTQgIFVwZ3JhZGUgdG8gTWVkZmllbGQKKyAqCisgKi8KKyNkZWZpbmUgREVCVUcKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvY2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2tkZXZfdC5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KKyNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW9jdGwuaD4KKyNpbmNsdWRlIDxhc20vY3VycmVudC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgorI2luY2x1ZGUgPGFzbS9jYWNoZWZsdXNoLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9yYXJfcmVnaXN0ZXIuaD4KKworI2luY2x1ZGUgIi4uL21lbXJhci9tZW1yYXIuaCIKKworI2luY2x1ZGUgInNlcF9kcml2ZXJfaHdfZGVmcy5oIgorI2luY2x1ZGUgInNlcF9kcml2ZXJfY29uZmlnLmgiCisjaW5jbHVkZSAic2VwX2RyaXZlcl9hcGkuaCIKKyNpbmNsdWRlICJzZXBfZGV2LmgiCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCURFRklORVMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2RlZmluZSBTRVBfUkFSX0lPX01FTV9SRUdJT05fU0laRSAweDQwMDAwCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlHTE9CQUwgdmFyaWFibGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIEtlZXAgdGhpcyBhIHNpbmdsZSBzdGF0aWMgb2JqZWN0IGZvciBub3cgdG8ga2VlcCB0aGUgY29udmVyc2lvbiBlYXN5ICovCisKK3N0YXRpYyBzdHJ1Y3Qgc2VwX2RldmljZSAqc2VwX2RldjsKKworLyoqCisgKglzZXBfbG9hZF9maXJtd2FyZSAtIGNvcHkgZmlybXdhcmUgY2FjaGUvcmVzaWRlbnQKKyAqCUBzZXA6IHBvaW50ZXIgdG8gc3RydWN0IHNlcF9kZXZpY2Ugd2UgYXJlIGxvYWRpbmcKKyAqCisgKglUaGlzIGZ1bmN0aW9ucyBjb3BpZXMgdGhlIGNhY2hlIGFuZCByZXNpZGVudCBmcm9tIHRoZWlyIHNvdXJjZQorICoJbG9jYXRpb24gaW50byBkZXN0aW5hdGlvbiBzaGFyZWQgbWVtb3J5LgorICovCitzdGF0aWMgaW50IHNlcF9sb2FkX2Zpcm13YXJlKHN0cnVjdCBzZXBfZGV2aWNlICpzZXApCit7CisJY29uc3Qgc3RydWN0IGZpcm13YXJlICpmdzsKKwljaGFyICpjYWNoZV9uYW1lID0gImNhY2hlLmltYWdlLmJpbiI7CisJY2hhciAqcmVzX25hbWUgPSAicmVzaWRlbnQuaW1hZ2UuYmluIjsKKwljaGFyICpleHRhcHBfbmFtZSA9ICJleHRhcHAuaW1hZ2UuYmluIjsKKwlpbnQgZXJyb3IgOworCXVuc2lnbmVkIGxvbmcgd29yazEsIHdvcmsyLCB3b3JrMzsKKworCS8qIFNldCBhZGRyZXNzZXMgYW5kIGxvYWQgcmVzaWRlbnQgKi8KKwlzZXAtPnJlc2lkZW50X2J1cyA9IHNlcC0+cmFyX2J1czsKKwlzZXAtPnJlc2lkZW50X2FkZHIgPSBzZXAtPnJhcl9hZGRyOworCisJZXJyb3IgPSByZXF1ZXN0X2Zpcm13YXJlKCZmdywgcmVzX25hbWUsICZzZXAtPnBkZXYtPmRldik7CisJaWYgKGVycm9yKSB7CisJCWRldl93YXJuKCZzZXAtPnBkZXYtPmRldiwgImNhbid0IHJlcXVlc3QgcmVzaWRlbnQgZndcbiIpOworCQlyZXR1cm4gZXJyb3I7CisJfQorCisJbWVtY3B5KHNlcC0+cmVzaWRlbnRfYWRkciwgKHZvaWQgKilmdy0+ZGF0YSwgZnctPnNpemUpOworCXNlcC0+cmVzaWRlbnRfc2l6ZSA9IGZ3LT5zaXplOworCXJlbGVhc2VfZmlybXdhcmUoZncpOworCisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJyZXNpZGVudCB2aXJ0dWFsIGlzICVwXG4iLAorCQlzZXAtPnJlc2lkZW50X2FkZHIpOworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAicmVzaWRlbnQgYnVzIGlzICVseFxuIiwKKwkJKHVuc2lnbmVkIGxvbmcpc2VwLT5yZXNpZGVudF9idXMpOworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAicmVzaWRlbnQgc2l6ZSBpcyAlMDh6eFxuIiwKKwkJc2VwLT5yZXNpZGVudF9zaXplKTsKKworCS8qIFNldCBhZGRyZXNzZXMgZm9yIGRjYWNoZSAobm8gbG9hZGluZyBuZWVkZWQpICovCisJd29yazEgPSAodW5zaWduZWQgbG9uZylzZXAtPnJlc2lkZW50X2J1czsKKwl3b3JrMiA9ICh1bnNpZ25lZCBsb25nKXNlcC0+cmVzaWRlbnRfc2l6ZTsKKwl3b3JrMyA9ICh3b3JrMSArIHdvcmsyICsgKDEwMjQgKiA0KSkgJiAweGZmZmZmMDAwOworCXNlcC0+ZGNhY2hlX2J1cyA9IChkbWFfYWRkcl90KXdvcmszOworCisJd29yazEgPSAodW5zaWduZWQgbG9uZylzZXAtPnJlc2lkZW50X2FkZHI7CisJd29yazIgPSAodW5zaWduZWQgbG9uZylzZXAtPnJlc2lkZW50X3NpemU7CisJd29yazMgPSAod29yazEgKyB3b3JrMiArICgxMDI0ICogNCkpICYgMHhmZmZmZjAwMDsKKwlzZXAtPmRjYWNoZV9hZGRyID0gKHZvaWQgKil3b3JrMzsKKworCXNlcC0+ZGNhY2hlX3NpemUgPSAxMDI0ICogMTI4OworCisJLyogU2V0IGFkZHJlc3NlcyBhbmQgbG9hZCBjYWNoZSAqLworCXNlcC0+Y2FjaGVfYnVzID0gc2VwLT5kY2FjaGVfYnVzICsgc2VwLT5kY2FjaGVfc2l6ZTsKKwlzZXAtPmNhY2hlX2FkZHIgPSBzZXAtPmRjYWNoZV9hZGRyICsgc2VwLT5kY2FjaGVfc2l6ZTsKKworCWVycm9yID0gcmVxdWVzdF9maXJtd2FyZSgmZncsIGNhY2hlX25hbWUsICZzZXAtPnBkZXYtPmRldik7CisJaWYgKGVycm9yKSB7CisJCWRldl93YXJuKCZzZXAtPnBkZXYtPmRldiwgIlVuYWJsZSB0byByZXF1ZXN0IGNhY2hlIGZpcm13YXJlXG4iKTsKKwkJcmV0dXJuIGVycm9yOworCX0KKworCW1lbWNweShzZXAtPmNhY2hlX2FkZHIsICh2b2lkICopZnctPmRhdGEsIGZ3LT5zaXplKTsKKwlzZXAtPmNhY2hlX3NpemUgPSBmdy0+c2l6ZTsKKwlyZWxlYXNlX2Zpcm13YXJlKGZ3KTsKKworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAiY2FjaGUgdmlydHVhbCBpcyAlcFxuIiwKKwkJc2VwLT5jYWNoZV9hZGRyKTsKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgImNhY2hlIGJ1cyBpcyAlMDhseFxuIiwKKwkJKHVuc2lnbmVkIGxvbmcpc2VwLT5jYWNoZV9idXMpOworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAiY2FjaGUgc2l6ZSBpcyAlMDh6eFxuIiwKKwkJc2VwLT5jYWNoZV9zaXplKTsKKworCS8qIFNldCBhZGRyZXNzZXMgYW5kIGxvYWQgZXh0YXBwICovCisJc2VwLT5leHRhcHBfYnVzID0gc2VwLT5jYWNoZV9idXMgKyAoMTAyNCAqIDM3MCk7CisJc2VwLT5leHRhcHBfYWRkciA9IHNlcC0+Y2FjaGVfYWRkciArICgxMDI0ICogMzcwKTsKKworCWVycm9yID0gcmVxdWVzdF9maXJtd2FyZSgmZncsIGV4dGFwcF9uYW1lLCAmc2VwLT5wZGV2LT5kZXYpOworCWlmIChlcnJvcikgeworCQlkZXZfd2Fybigmc2VwLT5wZGV2LT5kZXYsICJVbmFibGUgdG8gcmVxdWVzdCBleHRhcHAgZmlybXdhcmVcbiIpOworCQlyZXR1cm4gZXJyb3I7CisJfQorCisJbWVtY3B5KHNlcC0+ZXh0YXBwX2FkZHIsICh2b2lkICopZnctPmRhdGEsIGZ3LT5zaXplKTsKKwlzZXAtPmV4dGFwcF9zaXplID0gZnctPnNpemU7CisJcmVsZWFzZV9maXJtd2FyZShmdyk7CisKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgImV4dGFwcCB2aXJ0dWFsIGlzICVwXG4iLAorCQlzZXAtPmV4dGFwcF9hZGRyKTsKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgImV4dGFwcCBidXMgaXMgJTA4bGx4XG4iLAorCQkodW5zaWduZWQgbG9uZyBsb25nKXNlcC0+ZXh0YXBwX2J1cyk7CisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJleHRhcHAgc2l6ZSBpcyAlMDh6eFxuIiwKKwkJc2VwLT5leHRhcHBfc2l6ZSk7CisKKwlyZXR1cm4gZXJyb3I7Cit9CisKK01PRFVMRV9GSVJNV0FSRSgic2VwL2NhY2hlLmltYWdlLmJpbiIpOworTU9EVUxFX0ZJUk1XQVJFKCJzZXAvcmVzaWRlbnQuaW1hZ2UuYmluIik7CitNT0RVTEVfRklSTVdBUkUoInNlcC9leHRhcHAuaW1hZ2UuYmluIik7CisKKy8qKgorICoJc2VwX2R1bXBfbWVzc2FnZSAtIGR1bXAgdGhlIG1lc3NhZ2UgdGhhdCBpcyBwZW5kaW5nCisgKglAc2VwOiBTRVAgZGV2aWNlCisgKi8KK3N0YXRpYyB2b2lkIHNlcF9kdW1wX21lc3NhZ2Uoc3RydWN0IHNlcF9kZXZpY2UgKnNlcCkKK3sKKwlpbnQgY291bnQ7CisJdTMyICpwID0gc2VwLT5zaGFyZWRfYWRkcjsKKwlmb3IgKGNvdW50ID0gMDsgY291bnQgPCAxMiAqIDQ7IGNvdW50ICs9IDQpCisJCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAiV29yZCAlZCBvZiB0aGUgbWVzc2FnZSBpcyAleFxuIiwKKwkJCQkJCQkJY291bnQsICpwKyspOworfQorCisvKioKKyAqCXNlcF9tYXBfYW5kX2FsbG9jX3NoYXJlZF9hcmVhIC0JYWxsb2NhdGUgc2hhcmVkIGJsb2NrCisgKglAc2VwOiBzZWN1cml0eSBwcm9jZXNzb3IKKyAqCUBzaXplOiBzaXplIG9mIHNoYXJlZCBhcmVhCisgKi8KK3N0YXRpYyBpbnQgc2VwX21hcF9hbmRfYWxsb2Nfc2hhcmVkX2FyZWEoc3RydWN0IHNlcF9kZXZpY2UgKnNlcCkKK3sKKwlzZXAtPnNoYXJlZF9hZGRyID0gZG1hX2FsbG9jX2NvaGVyZW50KCZzZXAtPnBkZXYtPmRldiwKKwkJc2VwLT5zaGFyZWRfc2l6ZSwKKwkJJnNlcC0+c2hhcmVkX2J1cywgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIXNlcC0+c2hhcmVkX2FkZHIpIHsKKwkJZGV2X3dhcm4oJnNlcC0+cGRldi0+ZGV2LAorCQkJInNoYXJlZCBtZW1vcnkgZG1hX2FsbG9jX2NvaGVyZW50IGZhaWxlZFxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwKKwkJInNoYXJlZF9hZGRyICV6eCBieXRlcyBAJXAgKGJ1cyAlbGx4KVxuIiwKKwkJCQlzZXAtPnNoYXJlZF9zaXplLCBzZXAtPnNoYXJlZF9hZGRyLAorCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpc2VwLT5zaGFyZWRfYnVzKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKglzZXBfdW5tYXBfYW5kX2ZyZWVfc2hhcmVkX2FyZWEgLSBmcmVlIHNoYXJlZCBibG9jaworICoJQHNlcDogc2VjdXJpdHkgcHJvY2Vzc29yCisgKi8KK3N0YXRpYyB2b2lkIHNlcF91bm1hcF9hbmRfZnJlZV9zaGFyZWRfYXJlYShzdHJ1Y3Qgc2VwX2RldmljZSAqc2VwKQoreworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAic2hhcmVkIGFyZWEgdW5tYXAgYW5kIGZyZWVcbiIpOworCWRtYV9mcmVlX2NvaGVyZW50KCZzZXAtPnBkZXYtPmRldiwgc2VwLT5zaGFyZWRfc2l6ZSwKKwkJCQlzZXAtPnNoYXJlZF9hZGRyLCBzZXAtPnNoYXJlZF9idXMpOworfQorCisvKioKKyAqCXNlcF9zaGFyZWRfYnVzX3RvX3ZpcnQgLSBjb252ZXJ0IGJ1cy92aXJ0IGFkZHJlc3NlcworICoJQHNlcDogcG9pbnRlciB0byBzdHJ1Y3Qgc2VwX2RldmljZQorICoJQGJ1c19hZGRyZXNzOiBhZGRyZXNzIHRvIGNvbnZlcnQKKyAqCisgKglSZXR1cm5zIHZpcnR1YWwgYWRkcmVzcyBpbnNpZGUgdGhlIHNoYXJlZCBhcmVhIGFjY29yZGluZworICoJdG8gdGhlIGJ1cyBhZGRyZXNzLgorICovCitzdGF0aWMgdm9pZCAqc2VwX3NoYXJlZF9idXNfdG9fdmlydChzdHJ1Y3Qgc2VwX2RldmljZSAqc2VwLAorCQkJCQkJZG1hX2FkZHJfdCBidXNfYWRkcmVzcykKK3sKKwlyZXR1cm4gc2VwLT5zaGFyZWRfYWRkciArIChidXNfYWRkcmVzcyAtIHNlcC0+c2hhcmVkX2J1cyk7Cit9CisKKy8qKgorICoJb3BlbiBmdW5jdGlvbiBmb3IgdGhlIHNpbmdsZXRvbiBkcml2ZXIKKyAqCUBpbm9kZV9wdHIgc3RydWN0IGlub2RlICoKKyAqCUBmaWxlX3B0ciBzdHJ1Y3QgZmlsZSAqCisgKgorICoJQ2FsbGVkIHdoZW4gdGhlIHVzZXIgb3BlbnMgdGhlIHNpbmdsZXRvbiBkZXZpY2UgaW50ZXJmYWNlCisgKi8KK3N0YXRpYyBpbnQgc2VwX3NpbmdsZXRvbl9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGVfcHRyLCBzdHJ1Y3QgZmlsZSAqZmlsZV9wdHIpCit7CisJaW50IGVycm9yID0gMDsKKwlzdHJ1Y3Qgc2VwX2RldmljZSAqc2VwOworCisJLyoKKwkgKiBHZXQgdGhlIFNFUCBkZXZpY2Ugc3RydWN0dXJlIGFuZCB1c2UgaXQgZm9yIHRoZQorCSAqIHByaXZhdGVfZGF0YSBmaWVsZCBpbiBmaWxwIGZvciBvdGhlciBtZXRob2RzCisJICovCisJc2VwID0gc2VwX2RldjsKKworCWZpbGVfcHRyLT5wcml2YXRlX2RhdGEgPSBzZXA7CisKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgIlNpbmdsZXRvbiBvcGVuIGZvciBwaWQgJWRcbiIsIGN1cnJlbnQtPnBpZCk7CisKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgImNhbGxpbmcgdGVzdCBhbmQgc2V0IGZvciBzaW5nbGV0b24gMFxuIik7CisJaWYgKHRlc3RfYW5kX3NldF9iaXQoMCwgJnNlcC0+c2luZ2xldG9uX2FjY2Vzc19mbGFnKSkgeworCQllcnJvciA9IC1FQlVTWTsKKwkJZ290byBlbmRfZnVuY3Rpb247CisJfQorCisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJzZXBfc2luZ2xldG9uX29wZW4gZW5kXG4iKTsKK2VuZF9mdW5jdGlvbjoKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qKgorICoJc2VwX29wZW4gLSBkZXZpY2Ugb3BlbiBtZXRob2QKKyAqCUBpbm9kZTogaW5vZGUgb2YgU0VQIGRldmljZQorICoJQGZpbHA6IGZpbGUgaGFuZGxlIHRvIFNFUCBkZXZpY2UKKyAqCisgKglPcGVuIG1ldGhvZCBmb3IgdGhlIFNFUCBkZXZpY2UuIENhbGxlZCB3aGVuIHVzZXJzcGFjZSBvcGVucworICoJdGhlIFNFUCBkZXZpY2Ugbm9kZS4KKyAqCisgKglSZXR1cm5zIHplcm8gb24gc3VjY2VzcyBvdGhlcndpc2UgYW4gZXJyb3IgY29kZS4KKyAqLworc3RhdGljIGludCBzZXBfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwlzdHJ1Y3Qgc2VwX2RldmljZSAqc2VwOworCisJLyoKKwkgKiBHZXQgdGhlIFNFUCBkZXZpY2Ugc3RydWN0dXJlIGFuZCB1c2UgaXQgZm9yIHRoZQorCSAqIHByaXZhdGVfZGF0YSBmaWVsZCBpbiBmaWxwIGZvciBvdGhlciBtZXRob2RzCisJICovCisJc2VwID0gc2VwX2RldjsKKwlmaWxwLT5wcml2YXRlX2RhdGEgPSBzZXA7CisKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgIk9wZW4gZm9yIHBpZCAlZFxuIiwgY3VycmVudC0+cGlkKTsKKworCS8qIEFueW9uZSBjYW4gb3BlbjsgbG9ja2luZyB0YWtlcyBwbGFjZSBhdCB0cmFuc2FjdGlvbiBsZXZlbCAqLworCXJldHVybiAwOworfQorCisvKioKKyAqCXNlcF9zaW5nbGV0b25fcmVsZWFzZSAtIGNsb3NlIGEgU0VQIHNpbmdsZXRvbiBkZXZpY2UKKyAqCUBpbm9kZTogaW5vZGUgb2YgU0VQIGRldmljZQorICoJQGZpbHA6IGZpbGUgaGFuZGxlIGJlaW5nIGNsb3NlZAorICoKKyAqCUNhbGxlZCBvbiB0aGUgZmluYWwgY2xvc2Ugb2YgYSBTRVAgZGV2aWNlLiBBcyB0aGUgb3BlbiBwcm90ZWN0cyBhZ2FpbnN0CisgKgltdWx0aXBsZSBzaW11bHRhZW5vdXMgb3BlbnMgdGhhdCBtZWFucyB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB0aGUKKyAqCWZpbmFsIHJlZmVyZW5jZSB0byB0aGUgb3BlbiBoYW5kbGUgaXMgZHJvcHBlZC4KKyAqLworc3RhdGljIGludCBzZXBfc2luZ2xldG9uX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApCit7CisJc3RydWN0IHNlcF9kZXZpY2UgKnNlcCA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAiU2luZ2xldG9uIHJlbGVhc2UgZm9yIHBpZCAlZFxuIiwKKwkJCQkJCQljdXJyZW50LT5waWQpOworCWNsZWFyX2JpdCgwLCAmc2VwLT5zaW5nbGV0b25fYWNjZXNzX2ZsYWcpOworCXJldHVybiAwOworfQorCisvKioKKyAqCXNlcF9yZXF1ZXN0X2RhZW1vbm9wZW4gLSByZXF1ZXN0IGRhZW1vbiBvcGVuIG1ldGhvZAorICoJQGlub2RlOiBpbm9kZSBvZiBTRVAgZGV2aWNlCisgKglAZmlscDogZmlsZSBoYW5kbGUgdG8gU0VQIGRldmljZQorICoKKyAqCU9wZW4gbWV0aG9kIGZvciB0aGUgU0VQIHJlcXVlc3QgZGFlbW9uLiBDYWxsZWQgd2hlbgorICoJcmVxdWVzdCBkYWVtb24gaW4gdXNlcnNwYWNlIG9wZW5zIHRoZSBTRVAgZGV2aWNlIG5vZGUuCisgKgorICoJUmV0dXJucyB6ZXJvIG9uIHN1Y2Nlc3Mgb3RoZXJ3aXNlIGFuIGVycm9yIGNvZGUuCisgKi8KK3N0YXRpYyBpbnQgc2VwX3JlcXVlc3RfZGFlbW9uX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApCit7CisJc3RydWN0IHNlcF9kZXZpY2UgKnNlcCA9IHNlcF9kZXY7CisJaW50IGVycm9yID0gMDsKKworCWZpbHAtPnByaXZhdGVfZGF0YSA9IHNlcDsKKworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAiUmVxdWVzdCBkYWVtb24gb3BlbiBmb3IgcGlkICVkXG4iLAorCQljdXJyZW50LT5waWQpOworCisJLyogVGhlcmUgaXMgc3VwcG9zZWQgdG8gYmUgb25seSBvbmUgcmVxdWVzdCBkYWVtb24gKi8KKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgImNhbGxpbmcgdGVzdCBhbmQgc2V0IGZvciByZXFfZG1vbiBvcGVuIDBcbiIpOworCWlmICh0ZXN0X2FuZF9zZXRfYml0KDAsICZzZXAtPnJlcXVlc3RfZGFlbW9uX29wZW4pKQorCQllcnJvciA9IC1FQlVTWTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qKgorICoJc2VwX3JlcXVlc3RfZGFlbW9uX3JlbGVhc2UgLSBjbG9zZSBhIFNFUCBkYWVtb24KKyAqCUBpbm9kZTogaW5vZGUgb2YgU0VQIGRldmljZQorICoJQGZpbHA6IGZpbGUgaGFuZGxlIGJlaW5nIGNsb3NlZAorICoKKyAqCUNhbGxlZCBvbiB0aGUgZmluYWwgY2xvc2Ugb2YgYSBTRVAgZGFlbW9uLgorICovCitzdGF0aWMgaW50IHNlcF9yZXF1ZXN0X2RhZW1vbl9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKQoreworCXN0cnVjdCBzZXBfZGV2aWNlICpzZXAgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgIlJlcXVlcyBkYWVtb24gcmVsZWFzZSBmb3IgcGlkICVkXG4iLAorCQljdXJyZW50LT5waWQpOworCisJLyogQ2xlYXIgdGhlIHJlcXVlc3RfZGFlbW9uX29wZW4gZmxhZyAqLworCWNsZWFyX2JpdCgwLCAmc2VwLT5yZXF1ZXN0X2RhZW1vbl9vcGVuKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKglzZXBfcmVxX2RhZW1vbl9zZW5kX3JlcGx5X2NvbW1hbmRfaGFuZGxlciAtIHBva2UgdGhlIFNFUAorICoJQHNlcDogc3RydWN0IHNlcF9kZXZpY2UgKgorICoKKyAqCVRoaXMgZnVuY3Rpb24gcmFpc2VzIGludGVycnVwdCB0byBTRVBtIHRoYXQgc2lnbmFscyB0aGF0IGlzIGhhcyBhCisgKgluZXcgY29tbWFuZCBmcm9tIEhPU1QKKyAqLworc3RhdGljIGludCBzZXBfcmVxX2RhZW1vbl9zZW5kX3JlcGx5X2NvbW1hbmRfaGFuZGxlcihzdHJ1Y3Qgc2VwX2RldmljZSAqc2VwKQoreworCXVuc2lnbmVkIGxvbmcgbGNrX2ZsYWdzOworCisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsCisJCSJzZXBfcmVxX2RhZW1vbl9zZW5kX3JlcGx5X2NvbW1hbmRfaGFuZGxlciBzdGFydFxuIik7CisKKwlzZXBfZHVtcF9tZXNzYWdlKHNlcCk7CisKKwkvKiBDb3VudGVycyBhcmUgbG9ja2FibGUgcmVnaW9uICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJnNlcC0+c25kX3JwbHlfbGNrLCBsY2tfZmxhZ3MpOworCXNlcC0+c2VuZF9jdCsrOworCXNlcC0+cmVwbHlfY3QrKzsKKworCS8qIFNlbmQgdGhlIGludGVycnVwdCB0byBTRVAgKi8KKwlzZXBfd3JpdGVfcmVnKHNlcCwgSFdfSE9TVF9IT1NUX1NFUF9HUFIyX1JFR19BRERSLCBzZXAtPnNlbmRfY3QpOworCXNlcC0+c2VuZF9jdCsrOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2VwLT5zbmRfcnBseV9sY2ssIGxja19mbGFncyk7CisKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwKKwkJInNlcF9yZXFfZGFlbW9uX3NlbmRfcmVwbHkgc2VuZF9jdCAlbHggcmVwbHlfY3QgJWx4XG4iLAorCQlzZXAtPnNlbmRfY3QsIHNlcC0+cmVwbHlfY3QpOworCisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsCisJCSJzZXBfcmVxX2RhZW1vbl9zZW5kX3JlcGx5X2NvbW1hbmRfaGFuZGxlciBlbmRcbiIpOworCisJcmV0dXJuIDA7Cit9CisKKworLyoqCisgKglzZXBfZnJlZV9kbWFfdGFibGVfZGF0YV9oYW5kbGVyIC0gZnJlZSBETUEgdGFibGUKKyAqCUBzZXA6IHBvaW50ZXJlIHRvIHN0cnVjdCBzZXBfZGV2aWNlCisgKgorICoJSGFuZGxlcyB0aGUgcmVxdWVzdCB0byAgZnJlZSBETUEgdGFibGUgZm9yIHN5bmNocm9uaWMgYWN0aW9ucworICovCitzdGF0aWMgaW50IHNlcF9mcmVlX2RtYV90YWJsZV9kYXRhX2hhbmRsZXIoc3RydWN0IHNlcF9kZXZpY2UgKnNlcCkKK3sKKwlpbnQgY291bnQ7CisJaW50IGRjYl9jb3VudGVyOworCS8qIFBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgZG1hX3Jlc291cmNlIHN0cnVjdCAqLworCXN0cnVjdCBzZXBfZG1hX3Jlc291cmNlICpkbWE7CisKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgInNlcF9mcmVlX2RtYV90YWJsZV9kYXRhX2hhbmRsZXIgc3RhcnRcbiIpOworCisJZm9yIChkY2JfY291bnRlciA9IDA7IGRjYl9jb3VudGVyIDwgc2VwLT5ucl9kY2JfY3JlYXQ7IGRjYl9jb3VudGVyKyspIHsKKwkJZG1hID0gJnNlcC0+ZG1hX3Jlc19hcnJbZGNiX2NvdW50ZXJdOworCisJCS8qIFVubWFwIGFuZCBmcmVlIGlucHV0IG1hcCBhcnJheSAqLworCQlpZiAoZG1hLT5pbl9tYXBfYXJyYXkpIHsKKwkJCWZvciAoY291bnQgPSAwOyBjb3VudCA8IGRtYS0+aW5fbnVtX3BhZ2VzOyBjb3VudCsrKSB7CisJCQkJZG1hX3VubWFwX3BhZ2UoJnNlcC0+cGRldi0+ZGV2LAorCQkJCQlkbWEtPmluX21hcF9hcnJheVtjb3VudF0uZG1hX2FkZHIsCisJCQkJCWRtYS0+aW5fbWFwX2FycmF5W2NvdW50XS5zaXplLAorCQkJCQlETUFfVE9fREVWSUNFKTsKKwkJCX0KKwkJCWtmcmVlKGRtYS0+aW5fbWFwX2FycmF5KTsKKwkJfQorCisJCS8qIFVubWFwIG91dHB1dCBtYXAgYXJyYXksIERPTidUIGZyZWUgaXQgeWV0ICovCisJCWlmIChkbWEtPm91dF9tYXBfYXJyYXkpIHsKKwkJCWZvciAoY291bnQgPSAwOyBjb3VudCA8IGRtYS0+b3V0X251bV9wYWdlczsgY291bnQrKykgeworCQkJCWRtYV91bm1hcF9wYWdlKCZzZXAtPnBkZXYtPmRldiwKKwkJCQkJZG1hLT5vdXRfbWFwX2FycmF5W2NvdW50XS5kbWFfYWRkciwKKwkJCQkJZG1hLT5vdXRfbWFwX2FycmF5W2NvdW50XS5zaXplLAorCQkJCQlETUFfRlJPTV9ERVZJQ0UpOworCQkJfQorCQkJa2ZyZWUoZG1hLT5vdXRfbWFwX2FycmF5KTsKKwkJfQorCisJCS8qIEZyZWUgcGFnZSBjYWNoZSBmb3Igb3V0cHV0ICovCisJCWlmIChkbWEtPmluX3BhZ2VfYXJyYXkpIHsKKwkJCWZvciAoY291bnQgPSAwOyBjb3VudCA8IGRtYS0+aW5fbnVtX3BhZ2VzOyBjb3VudCsrKSB7CisJCQkJZmx1c2hfZGNhY2hlX3BhZ2UoZG1hLT5pbl9wYWdlX2FycmF5W2NvdW50XSk7CisJCQkJcGFnZV9jYWNoZV9yZWxlYXNlKGRtYS0+aW5fcGFnZV9hcnJheVtjb3VudF0pOworCQkJfQorCQkJa2ZyZWUoZG1hLT5pbl9wYWdlX2FycmF5KTsKKwkJfQorCisJCWlmIChkbWEtPm91dF9wYWdlX2FycmF5KSB7CisJCQlmb3IgKGNvdW50ID0gMDsgY291bnQgPCBkbWEtPm91dF9udW1fcGFnZXM7IGNvdW50KyspIHsKKwkJCQlpZiAoIVBhZ2VSZXNlcnZlZChkbWEtPm91dF9wYWdlX2FycmF5W2NvdW50XSkpCisJCQkJCVNldFBhZ2VEaXJ0eShkbWEtPm91dF9wYWdlX2FycmF5W2NvdW50XSk7CisJCQkJZmx1c2hfZGNhY2hlX3BhZ2UoZG1hLT5vdXRfcGFnZV9hcnJheVtjb3VudF0pOworCQkJCXBhZ2VfY2FjaGVfcmVsZWFzZShkbWEtPm91dF9wYWdlX2FycmF5W2NvdW50XSk7CisJCQl9CisJCQlrZnJlZShkbWEtPm91dF9wYWdlX2FycmF5KTsKKwkJfQorCisJCS8qIFJlc2V0IGFsbCB0aGUgdmFsdWVzICovCisJCWRtYS0+aW5fcGFnZV9hcnJheSA9IE5VTEw7CisJCWRtYS0+b3V0X3BhZ2VfYXJyYXkgPSBOVUxMOworCQlkbWEtPmluX251bV9wYWdlcyA9IDA7CisJCWRtYS0+b3V0X251bV9wYWdlcyA9IDA7CisJCWRtYS0+aW5fbWFwX2FycmF5ID0gTlVMTDsKKwkJZG1hLT5vdXRfbWFwX2FycmF5ID0gTlVMTDsKKwkJZG1hLT5pbl9tYXBfbnVtX2VudHJpZXMgPSAwOworCQlkbWEtPm91dF9tYXBfbnVtX2VudHJpZXMgPSAwOworCX0KKworCXNlcC0+bnJfZGNiX2NyZWF0ID0gMDsKKwlzZXAtPm51bV9sbGlfdGFibGVzX2NyZWF0ZWQgPSAwOworCisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJzZXBfZnJlZV9kbWFfdGFibGVfZGF0YV9oYW5kbGVyIGVuZFxuIik7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICoJc2VwX3JlcXVlc3RfZGFlbW9uX21tYXAgLSBtYXBzIHRoZSBzaGFyZWQgYXJlYSB0byB1c2VyIHNwYWNlCisgKglAZmlscDogcG9pbnRlciB0byBzdHJ1Y3QgZmlsZQorICoJQHZtYTogcG9pbnRlciB0byB2bV9hcmVhX3N0cnVjdAorICoKKyAqCUNhbGxlZCBieSB0aGUga2VybmVsIHdoZW4gdGhlIGRhZW1vbiBhdHRlbXB0cyBhbiBtbWFwKCkgc3lzY2FsbAorICoJdXNpbmcgb3VyIGhhbmRsZS4KKyAqLworc3RhdGljIGludCBzZXBfcmVxdWVzdF9kYWVtb25fbW1hcChzdHJ1Y3QgZmlsZSAgKmZpbHAsCisJc3RydWN0IHZtX2FyZWFfc3RydWN0ICAqdm1hKQoreworCXN0cnVjdCBzZXBfZGV2aWNlICpzZXAgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJZG1hX2FkZHJfdCBidXNfYWRkcmVzczsKKwlpbnQgZXJyb3IgPSAwOworCisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJkYWVtb24gbW1hcCBzdGFydFxuIik7CisKKwlpZiAoKHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydCkgPiBTRVBfRFJJVkVSX01NTUFQX0FSRUFfU0laRSkgeworCQllcnJvciA9IC1FSU5WQUw7CisJCWdvdG8gZW5kX2Z1bmN0aW9uOworCX0KKworCS8qIEdldCBwaHlzaWNhbCBhZGRyZXNzICovCisJYnVzX2FkZHJlc3MgPSBzZXAtPnNoYXJlZF9idXM7CisKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgImJ1c19hZGRyZXNzIGlzICUwOGx4XG4iLAorCQkJCQkodW5zaWduZWQgbG9uZylidXNfYWRkcmVzcyk7CisKKwlpZiAocmVtYXBfcGZuX3JhbmdlKHZtYSwgdm1hLT52bV9zdGFydCwgYnVzX2FkZHJlc3MgPj4gUEFHRV9TSElGVCwKKwkJdm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0LCB2bWEtPnZtX3BhZ2VfcHJvdCkpIHsKKworCQlkZXZfd2Fybigmc2VwLT5wZGV2LT5kZXYsICJyZW1hcF9wYWdlX3JhbmdlIGZhaWxlZFxuIik7CisJCWVycm9yID0gLUVBR0FJTjsKKwkJZ290byBlbmRfZnVuY3Rpb247CisJfQorCitlbmRfZnVuY3Rpb246CisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJkYWVtb24gbW1hcCBlbmRcbiIpOworCXJldHVybiBlcnJvcjsKK30KKworLyoqCisgKglzZXBfcmVxdWVzdF9kYWVtb25fcG9sbCAtIHBvbGwgaW1wbGVtZW50YXRpb24KKyAqCUBzZXA6IHN0cnVjdCBzZXBfZGV2aWNlICogZm9yIGN1cnJlbnQgU0VQIGRldmljZQorICoJQGZpbHA6IHN0cnVjdCBmaWxlICogZm9yIG9wZW4gZmlsZQorICoJQHdhaXQ6IHBvbGxfdGFibGUgKiBmb3IgcG9sbAorICoKKyAqCUNhbGxlZCB3aGVuIG91ciBkZXZpY2UgaXMgcGFydCBvZiBhIHBvbGwoKSBvciBzZWxlY3QoKSBzeXNjYWxsCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgc2VwX3JlcXVlc3RfZGFlbW9uX3BvbGwoc3RydWN0IGZpbGUgKmZpbHAsCisJcG9sbF90YWJsZSAgKndhaXQpCit7CisJdTMyCW1hc2sgPSAwOworCS8qIEdQUjIgcmVnaXN0ZXIgKi8KKwl1MzIJcmV0dmFsMjsKKwl1bnNpZ25lZCBsb25nIGxja19mbGFnczsKKwlzdHJ1Y3Qgc2VwX2RldmljZSAqc2VwID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJkYWVtb24gcG9sbDogc3RhcnRcbiIpOworCisJcG9sbF93YWl0KGZpbHAsICZzZXAtPmV2ZW50X3JlcXVlc3RfZGFlbW9uLCB3YWl0KTsKKworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAiZGFlbW9uIHBvbGw6IHNlbmRfY3QgaXMgJWx4IHJlcGx5IGN0IGlzICVseFxuIiwKKwkJCQkJCXNlcC0+c2VuZF9jdCwgc2VwLT5yZXBseV9jdCk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc2VwLT5zbmRfcnBseV9sY2ssIGxja19mbGFncyk7CisJLyogQ2hlY2sgaWYgdGhlIGRhdGEgaXMgcmVhZHkgKi8KKwlpZiAoc2VwLT5zZW5kX2N0ID09IHNlcC0+cmVwbHlfY3QpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2VwLT5zbmRfcnBseV9sY2ssIGxja19mbGFncyk7CisKKwkJcmV0dmFsMiA9IHNlcF9yZWFkX3JlZyhzZXAsIEhXX0hPU1RfU0VQX0hPU1RfR1BSMl9SRUdfQUREUik7CisJCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LAorCQkJImRhZW1vbiBwb2xsOiBkYXRhIGNoZWNrIChHUFIyKSBpcyAleFxuIiwgcmV0dmFsMik7CisKKwkJLyogQ2hlY2sgaWYgUFJJTlQgcmVxdWVzdCAqLworCQlpZiAoKHJldHZhbDIgPj4gMzApICYgMHgxKSB7CisJCQlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgImRhZW1vbiBwb2xsOiBQUklOVEYgcmVxdWVzdCBpblxuIik7CisJCQltYXNrIHw9IFBPTExJTjsKKwkJCWdvdG8gZW5kX2Z1bmN0aW9uOworCQl9CisJCS8qIENoZWNrIGlmIE5WUyByZXF1ZXN0ICovCisJCWlmIChyZXR2YWwyID4+IDMxKSB7CisJCQlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgImRhZW1vbiBwb2xsOiBOVlMgcmVxdWVzdCBpblxuIik7CisJCQltYXNrIHw9IFBPTExQUkkgfCBQT0xMV1JOT1JNOworCQl9CisJfSBlbHNlIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2VwLT5zbmRfcnBseV9sY2ssIGxja19mbGFncyk7CisJCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LAorCQkJImRhZW1vbiBwb2xsOiBubyByZXBseSByZWNlaXZlZDsgcmV0dXJuaW5nIDBcbiIpOworCQltYXNrID0gMDsKKwl9CitlbmRfZnVuY3Rpb246CisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJkYWVtb24gcG9sbDogZXhpdFxuIik7CisJcmV0dXJuIG1hc2s7Cit9CisKKy8qKgorICoJc2VwX3JlbGVhc2UgLSBjbG9zZSBhIFNFUCBkZXZpY2UKKyAqCUBpbm9kZTogaW5vZGUgb2YgU0VQIGRldmljZQorICoJQGZpbHA6IGZpbGUgaGFuZGxlIGJlaW5nIGNsb3NlZAorICoKKyAqCUNhbGxlZCBvbiB0aGUgZmluYWwgY2xvc2Ugb2YgYSBTRVAgZGV2aWNlLgorICovCitzdGF0aWMgaW50IHNlcF9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKQoreworCXN0cnVjdCBzZXBfZGV2aWNlICpzZXAgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgIlJlbGVhc2UgZm9yIHBpZCAlZFxuIiwgY3VycmVudC0+cGlkKTsKKworCW11dGV4X2xvY2soJnNlcC0+c2VwX211dGV4KTsKKwkvKiBJcyB0aGlzIHRoZSBwcm9jZXNzIHRoYXQgaGFzIGEgdHJhbnNhY3Rpb24gb3Blbj8KKwkgKiBJZiBzbywgbGV0cyByZXNldCBwaWRfZG9pbmdfdHJhbnNhY3Rpb24gdG8gMCBhbmQKKwkgKiBjbGVhciB0aGUgaW4gdXNlIGZsYWdzLCBhbmQgdGhlbiB3YWtlIHVwIHNlcF9ldmVudAorCSAqIHNvIHRoYXQgb3RoZXIgcHJvY2Vzc2VzIGNhbiBkbyB0cmFuc2FjdGlvbnMKKwkgKi8KKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgIndha2luZyB1cCBldmVudCBhbmQgbW1hcF9ldmVudFxuIik7CisJaWYgKHNlcC0+cGlkX2RvaW5nX3RyYW5zYWN0aW9uID09IGN1cnJlbnQtPnBpZCkgeworCQljbGVhcl9iaXQoU0VQX01NQVBfTE9DS19CSVQsICZzZXAtPmluX3VzZV9mbGFncyk7CisJCWNsZWFyX2JpdChTRVBfU0VORF9NU0dfTE9DS19CSVQsICZzZXAtPmluX3VzZV9mbGFncyk7CisJCXNlcF9mcmVlX2RtYV90YWJsZV9kYXRhX2hhbmRsZXIoc2VwKTsKKwkJd2FrZV91cCgmc2VwLT5ldmVudCk7CisJCXNlcC0+cGlkX2RvaW5nX3RyYW5zYWN0aW9uID0gMDsKKwl9CisKKwltdXRleF91bmxvY2soJnNlcC0+c2VwX211dGV4KTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKglzZXBfbW1hcCAtICBtYXBzIHRoZSBzaGFyZWQgYXJlYSB0byB1c2VyIHNwYWNlCisgKglAZmlscDogcG9pbnRlciB0byBzdHJ1Y3QgZmlsZQorICoJQHZtYTogcG9pbnRlciB0byB2bV9hcmVhX3N0cnVjdAorICoKKyAqCUNhbGxlZCBvbiBhbiBtbWFwIG9mIG91ciBzcGFjZSB2aWEgdGhlIG5vcm1hbCBTRVAgZGV2aWNlCisgKi8KK3N0YXRpYyBpbnQgc2VwX21tYXAoc3RydWN0IGZpbGUgKmZpbHAsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQoreworCWRtYV9hZGRyX3QgYnVzX2FkZHI7CisJc3RydWN0IHNlcF9kZXZpY2UgKnNlcCA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGVycm9yID0gMDsKKworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAibW1hcCBzdGFydFxuIik7CisKKwkvKiBTZXQgdGhlIHRyYW5zYWN0aW9uIGJ1c3kgKG93biB0aGUgZGV2aWNlKSAqLworCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShzZXAtPmV2ZW50LAorCQl0ZXN0X2FuZF9zZXRfYml0KFNFUF9NTUFQX0xPQ0tfQklULAorCQkmc2VwLT5pbl91c2VfZmxhZ3MpID09IDApOworCisJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCWVycm9yID0gLUVJTlRSOworCQlnb3RvIGVuZF9mdW5jdGlvbl93aXRoX2Vycm9yOworCX0KKwkvKgorCSAqIFRoZSBwaWRfZG9pbmdfdHJhbnNhY3Rpb24gaW5kaWNhdGVzIHRoYXQgdGhpcyBwcm9jZXNzCisJICogbm93IG93bnMgdGhlIGZhY2lsaXRpZXMgdG8gcGVyZm9ybWEgYSB0cmFuc2FjdGlvbiB3aXRoCisJICogdGhlIFNFUC4gV2hpbGUgdGhpcyBwcm9jZXNzIGlzIHBlcmZvcm1pbmcgYSB0cmFuc2FjdGlvbiwKKwkgKiBubyBvdGhlciBwcm9jZXNzIHdobyBoYXMgdGhlIFNFUCBkZXZpY2Ugb3BlbiBjYW4gcGVyZm9ybQorCSAqIGFueSB0cmFuc2FjdGlvbnMuIFRoaXMgbWV0aG9kIGFsbG93cyBtb3JlIHRoYW4gb25lIHByb2Nlc3MKKwkgKiB0byBoYXZlIHRoZSBkZXZpY2Ugb3BlbiBhdCBhbnkgZ2l2ZW4gdGltZSwgd2hpY2ggcHJvdmlkZXMKKwkgKiBmaW5lciBncmFudWxhcml0eSBmb3IgZGV2aWNlIHV0aWxpemF0aW9uIGJ5IG11bHRpcGxlCisJICogcHJvY2Vzc2VzLgorCSAqLworCW11dGV4X2xvY2soJnNlcC0+c2VwX211dGV4KTsKKwlzZXAtPnBpZF9kb2luZ190cmFuc2FjdGlvbiA9IGN1cnJlbnQtPnBpZDsKKwltdXRleF91bmxvY2soJnNlcC0+c2VwX211dGV4KTsKKworCS8qIFplcm8gdGhlIHBvb2xzIGFuZCB0aGUgbnVtYmVyIG9mIGRhdGEgcG9vbCBhbG9jYXRpb24gcG9pbnRlcnMgKi8KKwlzZXAtPmRhdGFfcG9vbF9ieXRlc19hbGxvY2F0ZWQgPSAwOworCXNlcC0+bnVtX29mX2RhdGFfYWxsb2NhdGlvbnMgPSAwOworCisJLyoKKwkgKiBDaGVjayB0aGF0IHRoZSBzaXplIG9mIHRoZSBtYXBwZWQgcmFuZ2UgaXMgYXMgdGhlIHNpemUgb2YgdGhlIG1lc3NhZ2UKKwkgKiBzaGFyZWQgYXJlYQorCSAqLworCWlmICgodm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0KSA+IFNFUF9EUklWRVJfTU1NQVBfQVJFQV9TSVpFKSB7CisJCWVycm9yID0gLUVJTlZBTDsKKwkJZ290byBlbmRfZnVuY3Rpb25fd2l0aF9lcnJvcjsKKwl9CisKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgInNoYXJlZF9hZGRyIGlzICVwXG4iLCBzZXAtPnNoYXJlZF9hZGRyKTsKKworCS8qIEdldCBidXMgYWRkcmVzcyAqLworCWJ1c19hZGRyID0gc2VwLT5zaGFyZWRfYnVzOworCisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsCisJCSJidXNfYWRkcmVzcyBpcyAlbHhcbiIsICh1bnNpZ25lZCBsb25nKWJ1c19hZGRyKTsKKworCWlmIChyZW1hcF9wZm5fcmFuZ2Uodm1hLCB2bWEtPnZtX3N0YXJ0LCBidXNfYWRkciA+PiBQQUdFX1NISUZULAorCQl2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQsIHZtYS0+dm1fcGFnZV9wcm90KSkgeworCQlkZXZfd2Fybigmc2VwLT5wZGV2LT5kZXYsICJyZW1hcF9wYWdlX3JhbmdlIGZhaWxlZFxuIik7CisJCWVycm9yID0gLUVBR0FJTjsKKwkJZ290byBlbmRfZnVuY3Rpb25fd2l0aF9lcnJvcjsKKwl9CisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJtbWFwIGVuZFxuIik7CisJZ290byBlbmRfZnVuY3Rpb247CisKK2VuZF9mdW5jdGlvbl93aXRoX2Vycm9yOgorCS8qIENsZWFyIHRoZSBiaXQgKi8KKwljbGVhcl9iaXQoU0VQX01NQVBfTE9DS19CSVQsICZzZXAtPmluX3VzZV9mbGFncyk7CisJbXV0ZXhfbG9jaygmc2VwLT5zZXBfbXV0ZXgpOworCXNlcC0+cGlkX2RvaW5nX3RyYW5zYWN0aW9uID0gMDsKKwltdXRleF91bmxvY2soJnNlcC0+c2VwX211dGV4KTsKKworCS8qIFJhaXNlIGV2ZW50IGZvciBzdHVjayBjb250ZXh0ZXMgKi8KKworCWRldl93YXJuKCZzZXAtPnBkZXYtPmRldiwgIm1tYXAgZXJyb3IgLSB3YWtpbmcgdXAgZXZlbnRcbiIpOworCXdha2VfdXAoJnNlcC0+ZXZlbnQpOworCitlbmRfZnVuY3Rpb246CisJcmV0dXJuIGVycm9yOworfQorCisvKioKKyAqCXNlcF9wb2xsIC0gcG9sbCBoYW5kbGVyCisgKglAZmlscDogcG9pbnRlciB0byBzdHJ1Y3QgZmlsZQorICoJQHdhaXQ6IHBvaW50ZXIgdG8gcG9sbF90YWJsZQorICoKKyAqCUNhbGxlZCBieSB0aGUgT1Mgd2hlbiB0aGUga2VybmVsIGlzIGFza2VkIHRvIGRvIGEgcG9sbCBvbgorICoJYSBTRVAgZmlsZSBoYW5kbGUuCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgc2VwX3BvbGwoc3RydWN0IGZpbGUgKmZpbHAsIHBvbGxfdGFibGUgKndhaXQpCit7CisJdTMyIG1hc2sgPSAwOworCXUzMiByZXR2YWwgPSAwOworCXUzMiByZXR2YWwyID0gMDsKKwl1bnNpZ25lZCBsb25nIGxja19mbGFnczsKKworCXN0cnVjdCBzZXBfZGV2aWNlICpzZXAgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgInBvbGw6IHN0YXJ0XG4iKTsKKworCS8qIEFtIEkgdGhlIHByb2Nlc3MgdGhhdCBvd25zIHRoZSB0cmFuc2FjdGlvbj8gKi8KKwltdXRleF9sb2NrKCZzZXAtPnNlcF9tdXRleCk7CisJaWYgKGN1cnJlbnQtPnBpZCAhPSBzZXAtPnBpZF9kb2luZ190cmFuc2FjdGlvbikgeworCQlkZXZfd2Fybigmc2VwLT5wZGV2LT5kZXYsICJwb2xsOyB3cm9uZyBwaWRcbiIpOworCQltYXNrID0gUE9MTEVSUjsKKwkJbXV0ZXhfdW5sb2NrKCZzZXAtPnNlcF9tdXRleCk7CisJCWdvdG8gZW5kX2Z1bmN0aW9uOworCX0KKwltdXRleF91bmxvY2soJnNlcC0+c2VwX211dGV4KTsKKworCS8qIENoZWNrIGlmIHNlbmQgY29tbWFuZCBvciBzZW5kX3JlcGx5IHdlcmUgYWN0aXZhdGVkIHByZXZpb3VzbHkgKi8KKwlpZiAoIXRlc3RfYml0KFNFUF9TRU5EX01TR19MT0NLX0JJVCwgJnNlcC0+aW5fdXNlX2ZsYWdzKSkgeworCQlkZXZfd2Fybigmc2VwLT5wZGV2LT5kZXYsICJwb2xsOyBsb2NrIGJpdCBzZXRcbiIpOworCQltYXNrID0gUE9MTEVSUjsKKwkJZ290byBlbmRfZnVuY3Rpb247CisJfQorCisJLyogQWRkIHRoZSBldmVudCB0byB0aGUgcG9sbGluZyB3YWl0IHRhYmxlICovCisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJwb2xsOiBjYWxsaW5nIHdhaXQgc2VwX2V2ZW50XG4iKTsKKworCXBvbGxfd2FpdChmaWxwLCAmc2VwLT5ldmVudCwgd2FpdCk7CisKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgInBvbGw6IHNlbmRfY3QgaXMgJWx4IHJlcGx5IGN0IGlzICVseFxuIiwKKwkJc2VwLT5zZW5kX2N0LCBzZXAtPnJlcGx5X2N0KTsKKworCS8qIENoZWNrIGlmIGVycm9yIG9jY3VyZWQgZHVyaW5nIHBvbGwgKi8KKwlyZXR2YWwyID0gc2VwX3JlYWRfcmVnKHNlcCwgSFdfSE9TVF9TRVBfSE9TVF9HUFIzX1JFR19BRERSKTsKKwlpZiAocmV0dmFsMiAhPSAweDApIHsKKwkJZGV2X3dhcm4oJnNlcC0+cGRldi0+ZGV2LCAicG9sbDsgcG9sbCBlcnJvciAleFxuIiwgcmV0dmFsMik7CisJCW1hc2sgfD0gUE9MTEVSUjsKKwkJZ290byBlbmRfZnVuY3Rpb247CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJnNlcC0+c25kX3JwbHlfbGNrLCBsY2tfZmxhZ3MpOworCisJaWYgKHNlcC0+c2VuZF9jdCA9PSBzZXAtPnJlcGx5X2N0KSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNlcC0+c25kX3JwbHlfbGNrLCBsY2tfZmxhZ3MpOworCQlyZXR2YWwgPSBzZXBfcmVhZF9yZWcoc2VwLCBIV19IT1NUX1NFUF9IT1NUX0dQUjJfUkVHX0FERFIpOworCQlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgInBvbGw6IGRhdGEgcmVhZHkgY2hlY2sgKEdQUjIpICAleFxuIiwKKwkJCXJldHZhbCk7CisKKwkJLyogQ2hlY2sgaWYgcHJpbnRmIHJlcXVlc3QgICovCisJCWlmICgocmV0dmFsID4+IDMwKSAmIDB4MSkgeworCQkJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJwb2xsOiBTRVAgcHJpbnRmIHJlcXVlc3RcbiIpOworCQkJd2FrZV91cCgmc2VwLT5ldmVudF9yZXF1ZXN0X2RhZW1vbik7CisJCQlnb3RvIGVuZF9mdW5jdGlvbjsKKwkJfQorCisJCS8qIENoZWNrIGlmIHRoZSB0aGlzIGlzIFNFUCByZXBseSBvciByZXF1ZXN0ICovCisJCWlmIChyZXR2YWwgPj4gMzEpIHsKKwkJCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAicG9sbDogU0VQIHJlcXVlc3RcbiIpOworCQkJd2FrZV91cCgmc2VwLT5ldmVudF9yZXF1ZXN0X2RhZW1vbik7CisJCX0gZWxzZSB7CisJCQlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgInBvbGw6IG5vcm1hbCByZXR1cm5cbiIpOworCQkJLyogSW4gY2FzZSBpdCBpcyBhZ2FpbiBieSBzZW5kX3JlcGx5X2NvbWFuZCAqLworCQkJY2xlYXJfYml0KFNFUF9TRU5EX01TR19MT0NLX0JJVCwgJnNlcC0+aW5fdXNlX2ZsYWdzKTsKKwkJCXNlcF9kdW1wX21lc3NhZ2Uoc2VwKTsKKwkJCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LAorCQkJCSJwb2xsOyBTRVAgcmVwbHkgUE9MTElOIHwgUE9MTFJETk9STVxuIik7CisJCQltYXNrIHw9IFBPTExJTiB8IFBPTExSRE5PUk07CisJCX0KKwl9IGVsc2UgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZXAtPnNuZF9ycGx5X2xjaywgbGNrX2ZsYWdzKTsKKwkJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsCisJCQkicG9sbDsgbm8gcmVwbHkgcmVjZWl2ZWQ7IHJldHVybmluZyBtYXNrIG9mIDBcbiIpOworCQltYXNrID0gMDsKKwl9CisKK2VuZF9mdW5jdGlvbjoKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgInBvbGw6IGVuZFxuIik7CisJcmV0dXJuIG1hc2s7Cit9CisKKy8qKgorICoJc2VwX3RpbWVfYWRkcmVzcyAtIGFkZHJlc3MgaW4gU0VQIG1lbW9yeSBvZiB0aW1lCisgKglAc2VwOiBTRVAgZGV2aWNlIHdlIHdhbnQgdGhlIGFkZHJlc3MgZnJvbQorICoKKyAqCVJldHVybiB0aGUgYWRkcmVzcyBvZiB0aGUgdHdvIGR3b3JkcyBpbiBtZW1vcnkgdXNlZCBmb3IgdGltZQorICoJc2V0dGluZy4KKyAqLworc3RhdGljIHUzMiAqc2VwX3RpbWVfYWRkcmVzcyhzdHJ1Y3Qgc2VwX2RldmljZSAqc2VwKQoreworCXJldHVybiBzZXAtPnNoYXJlZF9hZGRyICsgU0VQX0RSSVZFUl9TWVNURU1fVElNRV9NRU1PUllfT0ZGU0VUX0lOX0JZVEVTOworfQorCisvKioKKyAqCXNlcF9zZXRfdGltZSAtIHNldCB0aGUgU0VQIHRpbWUKKyAqCUBzZXA6IHRoZSBTRVAgd2UgYXJlIHNldHRpbmcgdGhlIHRpbWUgZm9yCisgKgorICoJQ2FsY3VsYXRlcyB0aW1lIGFuZCBzZXRzIGl0IGF0IHRoZSBwcmVkZWZpbmVkIGFkZHJlc3MuCisgKglDYWxsZWQgd2l0aCB0aGUgU0VQIG11dGV4IGhlbGQuCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIHNlcF9zZXRfdGltZShzdHJ1Y3Qgc2VwX2RldmljZSAqc2VwKQoreworCXN0cnVjdCB0aW1ldmFsIHRpbWU7CisJdTMyICp0aW1lX2FkZHI7CS8qIEFkZHJlc3Mgb2YgdGltZSBhcyBzZWVuIGJ5IHRoZSBrZXJuZWwgKi8KKworCisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJzZXBfc2V0X3RpbWUgc3RhcnRcbiIpOworCisJZG9fZ2V0dGltZW9mZGF5KCZ0aW1lKTsKKworCS8qIFNldCB2YWx1ZSBpbiB0aGUgU1lTVEVNIE1FTU9SWSBvZmZzZXQgKi8KKwl0aW1lX2FkZHIgPSBzZXBfdGltZV9hZGRyZXNzKHNlcCk7CisKKwl0aW1lX2FkZHJbMF0gPSBTRVBfVElNRV9WQUxfVE9LRU47CisJdGltZV9hZGRyWzFdID0gdGltZS50dl9zZWM7CisKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgInRpbWUudHZfc2VjIGlzICVsdVxuIiwgdGltZS50dl9zZWMpOworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAidGltZV9hZGRyIGlzICVwXG4iLCB0aW1lX2FkZHIpOworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAic2VwLT5zaGFyZWRfYWRkciBpcyAlcFxuIiwgc2VwLT5zaGFyZWRfYWRkcik7CisKKwlyZXR1cm4gdGltZS50dl9zZWM7Cit9CisKKy8qKgorICoJc2VwX3NldF9jYWxsZXJfaWRfaGFuZGxlciAtIGluc2VydCBjYWxsZXIgaWQgZW50cnkKKyAqCUBzZXA6IFNFUCBkZXZpY2UKKyAqCUBhcmc6IHBvaW50ZXIgdG8gc3RydWN0IGNhbGxlcl9pZF9zdHJ1Y3QKKyAqCisgKglJbnNlcnRzIHRoZSBkYXRhIGludG8gdGhlIGNhbGxlciBpZCB0YWJsZS4gTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24KKyAqCWZhbGxzIHVuZGVyIHRoZSBpb2N0bCBsb2NrCisgKi8KK3N0YXRpYyBpbnQgc2VwX3NldF9jYWxsZXJfaWRfaGFuZGxlcihzdHJ1Y3Qgc2VwX2RldmljZSAqc2VwLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwl2b2lkIF9fdXNlciAqaGFzaDsKKwlpbnQgICBlcnJvciA9IDA7CisJaW50ICAgaTsKKwlzdHJ1Y3QgY2FsbGVyX2lkX3N0cnVjdCBjb21tYW5kX2FyZ3M7CisKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgInNlcF9zZXRfY2FsbGVyX2lkX2hhbmRsZXIgc3RhcnRcbiIpOworCisJZm9yIChpID0gMDsgaSA8IFNFUF9DQUxMRVJfSURfVEFCTEVfTlVNX0VOVFJJRVM7IGkrKykgeworCQlpZiAoc2VwLT5jYWxsZXJfaWRfdGFibGVbaV0ucGlkID09IDApCisJCQlicmVhazsKKwl9CisKKwlpZiAoaSA9PSBTRVBfQ0FMTEVSX0lEX1RBQkxFX05VTV9FTlRSSUVTKSB7CisJCWRldl93YXJuKCZzZXAtPnBkZXYtPmRldiwgIm5vIG1vcmUgY2FsbGVyIGlkIGVudHJpZXMgbGVmdFxuIik7CisJCWRldl93YXJuKCZzZXAtPnBkZXYtPmRldiwgIm1heGltdW0gbnVtYmVyIGlzICVkXG4iLAorCQkJCQlTRVBfQ0FMTEVSX0lEX1RBQkxFX05VTV9FTlRSSUVTKTsKKwkJZXJyb3IgPSAtRVVTRVJTOworCQlnb3RvIGVuZF9mdW5jdGlvbjsKKwl9CisKKwkvKiBDb3B5IHRoZSBkYXRhICovCisJaWYgKGNvcHlfZnJvbV91c2VyKCZjb21tYW5kX2FyZ3MsICh2b2lkIF9fdXNlciAqKWFyZywKKwkJc2l6ZW9mKGNvbW1hbmRfYXJncykpKSB7CisJCWVycm9yID0gLUVGQVVMVDsKKwkJZ290byBlbmRfZnVuY3Rpb247CisJfQorCisJaGFzaCA9ICh2b2lkIF9fdXNlciAqKSh1bnNpZ25lZCBsb25nKWNvbW1hbmRfYXJncy5jYWxsZXJJZEFkZHJlc3M7CisKKwlpZiAoIWNvbW1hbmRfYXJncy5waWQgfHwgIWNvbW1hbmRfYXJncy5jYWxsZXJJZFNpemVJbkJ5dGVzKSB7CisJCWVycm9yID0gLUVJTlZBTDsKKwkJZ290byBlbmRfZnVuY3Rpb247CisJfQorCisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJwaWQgaXMgJXhcbiIsIGNvbW1hbmRfYXJncy5waWQpOworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAiY2FsbGVySWRTaXplSW5CeXRlcyBpcyAleFxuIiwKKwkJY29tbWFuZF9hcmdzLmNhbGxlcklkU2l6ZUluQnl0ZXMpOworCisJaWYgKGNvbW1hbmRfYXJncy5jYWxsZXJJZFNpemVJbkJ5dGVzID4KKwkJCQkJU0VQX0NBTExFUl9JRF9IQVNIX1NJWkVfSU5fQllURVMpIHsKKwkJZXJyb3IgPSAtRU1TR1NJWkU7CisJCWdvdG8gZW5kX2Z1bmN0aW9uOworCX0KKworCXNlcC0+Y2FsbGVyX2lkX3RhYmxlW2ldLnBpZCA9IGNvbW1hbmRfYXJncy5waWQ7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoc2VwLT5jYWxsZXJfaWRfdGFibGVbaV0uY2FsbGVySWRIYXNoLAorCQloYXNoLCBjb21tYW5kX2FyZ3MuY2FsbGVySWRTaXplSW5CeXRlcykpCisJCWVycm9yID0gLUVGQVVMVDsKK2VuZF9mdW5jdGlvbjoKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgInNlcF9zZXRfY2FsbGVyX2lkX2hhbmRsZXIgZW5kXG4iKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qKgorICoJc2VwX3NldF9jdXJyZW50X2NhbGxlcl9pZCAtIHNldCB0aGUgY2FsbGVyIGlkCisgKglAc2VwOiBwb2ludGVyIHRvIHN0cnVjdF9zZXBfZGV2aWNlCisgKgorICoJU2V0IHRoZSBjYWxsZXIgSUQgKGlmIGl0IGV4aXN0cykgdG8gdGhlIFNFUC4gTm90ZSB0aGF0IHRoaXMKKyAqCWZ1bmN0aW9uIGZhbGxzIHVuZGVyIHRoZSBpb2N0bCBsb2NrCisgKi8KK3N0YXRpYyBpbnQgc2VwX3NldF9jdXJyZW50X2NhbGxlcl9pZChzdHJ1Y3Qgc2VwX2RldmljZSAqc2VwKQoreworCWludCBpOworCXUzMiAqaGFzaF9idWZfcHRyOworCisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJzZXBfc2V0X2N1cnJlbnRfY2FsbGVyX2lkIHN0YXJ0XG4iKTsKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgImN1cnJlbnQgcHJvY2VzcyBpcyAlZFxuIiwgY3VycmVudC0+cGlkKTsKKworCS8qIFplcm8gdGhlIHByZXZpb3VzIHZhbHVlICovCisJbWVtc2V0KHNlcC0+c2hhcmVkX2FkZHIgKyBTRVBfQ0FMTEVSX0lEX09GRlNFVF9CWVRFUywKKwkJCQkJMCwgU0VQX0NBTExFUl9JRF9IQVNIX1NJWkVfSU5fQllURVMpOworCisJZm9yIChpID0gMDsgaSA8IFNFUF9DQUxMRVJfSURfVEFCTEVfTlVNX0VOVFJJRVM7IGkrKykgeworCQlpZiAoc2VwLT5jYWxsZXJfaWRfdGFibGVbaV0ucGlkID09IGN1cnJlbnQtPnBpZCkgeworCQkJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJDYWxsZXIgSWQgZm91bmRcbiIpOworCisJCQltZW1jcHkoc2VwLT5zaGFyZWRfYWRkciArIFNFUF9DQUxMRVJfSURfT0ZGU0VUX0JZVEVTLAorCQkJCSh2b2lkICopKHNlcC0+Y2FsbGVyX2lkX3RhYmxlW2ldLmNhbGxlcklkSGFzaCksCisJCQkJU0VQX0NBTExFUl9JRF9IQVNIX1NJWkVfSU5fQllURVMpOworCQkJYnJlYWs7CisJCX0KKwl9CisJLyogRW5zdXJlIGRhdGEgaXMgaW4gbGl0dGxlIGVuZGlhbiAqLworCWhhc2hfYnVmX3B0ciA9ICh1MzIgKilzZXAtPnNoYXJlZF9hZGRyICsKKwkJU0VQX0NBTExFUl9JRF9PRkZTRVRfQllURVM7CisKKwlmb3IgKGkgPSAwOyBpIDwgU0VQX0NBTExFUl9JRF9IQVNIX1NJWkVfSU5fV09SRFM7IGkrKykKKwkJaGFzaF9idWZfcHRyW2ldID0gY3B1X3RvX2xlMzIoaGFzaF9idWZfcHRyW2ldKTsKKworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAic2VwX3NldF9jdXJyZW50X2NhbGxlcl9pZCBlbmRcbiIpOworCXJldHVybiAwOworfQorCisvKioKKyAqCXNlcF9zZW5kX2NvbW1hbmRfaGFuZGxlciAtIGtpY2sgb2ZmIGEgY29tbWFuZAorICoJQHNlcDogU0VQIGJlaW5nIHNpZ25hbGxlZAorICoKKyAqCVRoaXMgZnVuY3Rpb24gcmFpc2VzIGludGVycnVwdCB0byBTRVAgdGhhdCBzaWduYWxzIHRoYXQgaXMgaGFzIGEgbmV3CisgKgljb21tYW5kIGZyb20gdGhlIGhvc3QKKyAqCisgKiAgICAgIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIGRvZXMgZmFsbCB1bmRlciB0aGUgaW9jdGwgbG9jaworICovCitzdGF0aWMgaW50IHNlcF9zZW5kX2NvbW1hbmRfaGFuZGxlcihzdHJ1Y3Qgc2VwX2RldmljZSAqc2VwKQoreworCXVuc2lnbmVkIGxvbmcgbGNrX2ZsYWdzOworCWludCBlcnJvciA9IDA7CisKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgInNlcF9zZW5kX2NvbW1hbmRfaGFuZGxlciBzdGFydFxuIik7CisKKwlpZiAodGVzdF9hbmRfc2V0X2JpdChTRVBfU0VORF9NU0dfTE9DS19CSVQsICZzZXAtPmluX3VzZV9mbGFncykpIHsKKwkJZXJyb3IgPSAtRVBST1RPOworCQlnb3RvIGVuZF9mdW5jdGlvbjsKKwl9CisJc2VwX3NldF90aW1lKHNlcCk7CisKKwlzZXBfc2V0X2N1cnJlbnRfY2FsbGVyX2lkKHNlcCk7CisKKwlzZXBfZHVtcF9tZXNzYWdlKHNlcCk7CisKKwkvKiBVcGRhdGUgY291bnRlciAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZzZXAtPnNuZF9ycGx5X2xjaywgbGNrX2ZsYWdzKTsKKwlzZXAtPnNlbmRfY3QrKzsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZXAtPnNuZF9ycGx5X2xjaywgbGNrX2ZsYWdzKTsKKworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LAorCQkic2VwX3NlbmRfY29tbWFuZF9oYW5kbGVyIHNlbmRfY3QgJWx4IHJlcGx5X2N0ICVseFxuIiwKKwkJCQkJCXNlcC0+c2VuZF9jdCwgc2VwLT5yZXBseV9jdCk7CisKKwkvKiBTZW5kIGludGVycnVwdCB0byBTRVAgKi8KKwlzZXBfd3JpdGVfcmVnKHNlcCwgSFdfSE9TVF9IT1NUX1NFUF9HUFIwX1JFR19BRERSLCAweDIpOworCitlbmRfZnVuY3Rpb246CisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJzZXBfc2VuZF9jb21tYW5kX2hhbmRsZXIgZW5kXG4iKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qKgorICoJc2VwX2FsbG9jYXRlX2RhdGFfcG9vbF9tZW1vcnlfaGFuZGxlciAtYWxsb2NhdGUgcG9vbCBtZW1vcnkKKyAqCUBzZXA6IHBvaW50ZXIgdG8gc3RydWN0IHNlcF9kZXZpY2UKKyAqCUBhcmc6IHBvaW50ZXIgdG8gc3RydWN0IGFsbG9jX3N0cnVjdAorICoKKyAqCVRoaXMgZnVuY3Rpb24gaGFuZGxlcyB0aGUgYWxsb2NhdGUgZGF0YSBwb29sIG1lbW9yeSByZXF1ZXN0CisgKglUaGlzIGZ1bmN0aW9uIHJldHVybnMgY2FsY3VsYXRlcyB0aGUgYnVzIGFkZHJlc3Mgb2YgdGhlCisgKglhbGxvY2F0ZWQgbWVtb3J5LCBhbmQgdGhlIG9mZnNldCBvZiB0aGlzIGFyZWEgZnJvbSB0aGUgbWFwcGVkIGFkZHJlc3MuCisgKglUaGVyZWZvcmUsIHRoZSBGVk9zIGluIHVzZXIgc3BhY2UgY2FuIGNhbGN1bGF0ZSB0aGUgZXhhY3QgdmlydHVhbAorICoJYWRkcmVzcyBvZiB0aGlzIGFsbG9jYXRlZCBtZW1vcnkKKyAqLworc3RhdGljIGludCBzZXBfYWxsb2NhdGVfZGF0YV9wb29sX21lbW9yeV9oYW5kbGVyKHN0cnVjdCBzZXBfZGV2aWNlICpzZXAsCisJdW5zaWduZWQgbG9uZyBhcmcpCit7CisJaW50IGVycm9yID0gMDsKKwlzdHJ1Y3QgYWxsb2Nfc3RydWN0IGNvbW1hbmRfYXJnczsKKworCS8qIEhvbGRzIHRoZSBhbGxvY2F0ZWQgYnVmZmVyIGFkZHJlc3MgaW4gdGhlIHN5c3RlbSBtZW1vcnkgcG9vbCAqLworCXUzMiAqdG9rZW5fYWRkcjsKKworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LAorCQkic2VwX2FsbG9jYXRlX2RhdGFfcG9vbF9tZW1vcnlfaGFuZGxlciBzdGFydFxuIik7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJmNvbW1hbmRfYXJncywgKHZvaWQgX191c2VyICopYXJnLAorCQkJCQlzaXplb2Yoc3RydWN0IGFsbG9jX3N0cnVjdCkpKSB7CisJCWVycm9yID0gLUVGQVVMVDsKKwkJZ290byBlbmRfZnVuY3Rpb247CisJfQorCisJLyogQWxsb2NhdGUgbWVtb3J5ICovCisJaWYgKChzZXAtPmRhdGFfcG9vbF9ieXRlc19hbGxvY2F0ZWQgKyBjb21tYW5kX2FyZ3MubnVtX2J5dGVzKSA+CisJCVNFUF9EUklWRVJfREFUQV9QT09MX1NIQVJFRF9BUkVBX1NJWkVfSU5fQllURVMpIHsKKwkJZXJyb3IgPSAtRU5PTUVNOworCQlnb3RvIGVuZF9mdW5jdGlvbjsKKwl9CisKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwKKwkJImJ5dGVzX2FsbG9jYXRlZDogJXhcbiIsIChpbnQpc2VwLT5kYXRhX3Bvb2xfYnl0ZXNfYWxsb2NhdGVkKTsKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwKKwkJIm9mZnNldDogJXhcbiIsIFNFUF9EUklWRVJfREFUQV9QT09MX0FSRUFfT0ZGU0VUX0lOX0JZVEVTKTsKKwkvKiBTZXQgdGhlIHZpcnR1YWwgYW5kIGJ1cyBhZGRyZXNzICovCisJY29tbWFuZF9hcmdzLm9mZnNldCA9IFNFUF9EUklWRVJfREFUQV9QT09MX0FSRUFfT0ZGU0VUX0lOX0JZVEVTICsKKwkJc2VwLT5kYXRhX3Bvb2xfYnl0ZXNfYWxsb2NhdGVkOworCisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsCisJCSJjb21tYW5kX2FyZ3Mub2Zmc2V0OiAleFxuIiwgY29tbWFuZF9hcmdzLm9mZnNldCk7CisKKwkvKiBQbGFjZSBpbiB0aGUgc2hhcmVkIGFyZWEgdGhhdCBpcyBrbm93biBieSB0aGUgU0VQICovCisJdG9rZW5fYWRkciA9ICh1MzIgKikoc2VwLT5zaGFyZWRfYWRkciArCisJCVNFUF9EUklWRVJfREFUQV9QT09MX0FMTE9DQVRJT05fT0ZGU0VUX0lOX0JZVEVTICsKKwkJKHNlcC0+bnVtX29mX2RhdGFfYWxsb2NhdGlvbnMpKjIqc2l6ZW9mKHUzMikpOworCisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJhbGxvY2F0aW9uIG9mZnNldDogJXhcbiIsCisJCVNFUF9EUklWRVJfREFUQV9QT09MX0FMTE9DQVRJT05fT0ZGU0VUX0lOX0JZVEVTKTsKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgImRhdGEgcG9vbCB0b2tlbiBhZGRyIGlzICVwXG4iLCB0b2tlbl9hZGRyKTsKKworCXRva2VuX2FkZHJbMF0gPSBTRVBfREFUQV9QT09MX1BPSU5URVJTX1ZBTF9UT0tFTjsKKwl0b2tlbl9hZGRyWzFdID0gKHUzMilzZXAtPnNoYXJlZF9idXMgKworCQlTRVBfRFJJVkVSX0RBVEFfUE9PTF9BUkVBX09GRlNFVF9JTl9CWVRFUyArCisJCXNlcC0+ZGF0YV9wb29sX2J5dGVzX2FsbG9jYXRlZDsKKworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAiZGF0YSBwb29sIHRva2VuIFswXSAleFxuIiwgdG9rZW5fYWRkclswXSk7CisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJkYXRhIHBvb2wgdG9rZW4gWzFdICV4XG4iLCB0b2tlbl9hZGRyWzFdKTsKKworCS8qIFdyaXRlIHRoZSBtZW1vcnkgYmFjayB0byB0aGUgdXNlciBzcGFjZSAqLworCWVycm9yID0gY29weV90b191c2VyKCh2b2lkICopYXJnLCAodm9pZCAqKSZjb21tYW5kX2FyZ3MsCisJCXNpemVvZihzdHJ1Y3QgYWxsb2Nfc3RydWN0KSk7CisJaWYgKGVycm9yKSB7CisJCWVycm9yID0gLUVGQVVMVDsKKwkJZ290byBlbmRfZnVuY3Rpb247CisJfQorCisJLyogVXBkYXRlIHRoZSBhbGxvY2F0aW9uICovCisJc2VwLT5kYXRhX3Bvb2xfYnl0ZXNfYWxsb2NhdGVkICs9IGNvbW1hbmRfYXJncy5udW1fYnl0ZXM7CisJc2VwLT5udW1fb2ZfZGF0YV9hbGxvY2F0aW9ucyArPSAxOworCisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJkYXRhX2FsbG9jYXRpb25zICVkXG4iLAorCQlzZXAtPm51bV9vZl9kYXRhX2FsbG9jYXRpb25zKTsKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgImJ5dGVzIGFsbG9jYXRlZCAgJWRcbiIsCisJCShpbnQpc2VwLT5kYXRhX3Bvb2xfYnl0ZXNfYWxsb2NhdGVkKTsKKworZW5kX2Z1bmN0aW9uOgorCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAic2VwX2FsbG9jYXRlX2RhdGFfcG9vbF9tZW1vcnlfaGFuZGxlciBlbmRcbiIpOworCXJldHVybiBlcnJvcjsKK30KKworLyoqCisgKglzZXBfbG9ja19rZXJuZWxfcGFnZXMgLSBtYXAga2VybmVsIHBhZ2VzIGZvciBETUEKKyAqCUBzZXA6IHBvaW50ZXIgdG8gc3RydWN0IHNlcF9kZXZpY2UKKyAqCUBrZXJuZWxfdmlydF9hZGRyOiBhZGRyZXNzIG9mIGRhdGEgYnVmZmVyIGluIGtlcm5lbAorICoJQGRhdGFfc2l6ZTogc2l6ZSBvZiBkYXRhCisgKglAbGxpX2FycmF5X3B0cjogbGxpIGFycmF5CisgKglAaW5fb3V0X2ZsYWc6IGlucHV0IGludG8gZGV2aWNlIG9yIG91dHB1dCBmcm9tIGRldmljZQorICoKKyAqCVRoaXMgZnVuY3Rpb24gbG9ja3MgYWxsIHRoZSBwaHlzaWNhbCBwYWdlcyBvZiB0aGUga2VybmVsIHZpcnR1YWwgYnVmZmVyCisgKglhbmQgY29uc3RydWN0IGEgYmFzaWMgbGxpICBhcnJheSwgd2hlcmUgZWFjaCBlbnRyeSBob2xkcyB0aGUgcGh5c2ljYWwKKyAqCXBhZ2UgYWRkcmVzcyBhbmQgdGhlIHNpemUgdGhhdCBhcHBsaWNhdGlvbiBkYXRhIGhvbGRzIGluIHRoaXMgcGFnZQorICoJVGhpcyBmdW5jdGlvbiBpcyB1c2VkIG9ubHkgZHVyaW5nIGtlcm5lbCBjcnlwdG8gbW9kIGNhbGxzIGZyb20gd2l0aGluCisgKgl0aGUga2VybmVsICh3aGVuIGlvY3RsIGlzIG5vdCB1c2VkKQorICovCitzdGF0aWMgaW50IHNlcF9sb2NrX2tlcm5lbF9wYWdlcyhzdHJ1Y3Qgc2VwX2RldmljZSAqc2VwLAorCXVuc2lnbmVkIGxvbmcga2VybmVsX3ZpcnRfYWRkciwKKwl1MzIgZGF0YV9zaXplLAorCXN0cnVjdCBzZXBfbGxpX2VudHJ5ICoqbGxpX2FycmF5X3B0ciwKKwlpbnQgaW5fb3V0X2ZsYWcpCisKK3sKKwlpbnQgZXJyb3IgPSAwOworCS8qIEFycmF5IG9mIGxsaSAqLworCXN0cnVjdCBzZXBfbGxpX2VudHJ5ICpsbGlfYXJyYXk7CisJLyogTWFwIGFycmF5ICovCisJc3RydWN0IHNlcF9kbWFfbWFwICptYXBfYXJyYXk7CisKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgInNlcF9sb2NrX2tlcm5lbF9wYWdlcyBzdGFydFxuIik7CisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJrZXJuZWxfdmlydF9hZGRyIGlzICUwOGx4XG4iLAorCQkJCSh1bnNpZ25lZCBsb25nKWtlcm5lbF92aXJ0X2FkZHIpOworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAiZGF0YV9zaXplIGlzICV4XG4iLCBkYXRhX3NpemUpOworCisJbGxpX2FycmF5ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHNlcF9sbGlfZW50cnkpLCBHRlBfQVRPTUlDKTsKKwlpZiAoIWxsaV9hcnJheSkgeworCQllcnJvciA9IC1FTk9NRU07CisJCWdvdG8gZW5kX2Z1bmN0aW9uOworCX0KKwltYXBfYXJyYXkgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc2VwX2RtYV9tYXApLCBHRlBfQVRPTUlDKTsKKwlpZiAoIW1hcF9hcnJheSkgeworCQllcnJvciA9IC1FTk9NRU07CisJCWdvdG8gZW5kX2Z1bmN0aW9uX3dpdGhfZXJyb3I7CisJfQorCisJbWFwX2FycmF5WzBdLmRtYV9hZGRyID0KKwkJZG1hX21hcF9zaW5nbGUoJnNlcC0+cGRldi0+ZGV2LCAodm9pZCAqKWtlcm5lbF92aXJ0X2FkZHIsCisJCWRhdGFfc2l6ZSwgRE1BX0JJRElSRUNUSU9OQUwpOworCW1hcF9hcnJheVswXS5zaXplID0gZGF0YV9zaXplOworCisKKwkvKgorCSAqIFNldCB0aGUgc3RhcnQgYWRkcmVzcyBvZiB0aGUgZmlyc3QgcGFnZSAtIGFwcCBkYXRhIG1heSBzdGFydCBub3QgYXQKKwkgKiB0aGUgYmVnaW5uaW5nIG9mIHRoZSBwYWdlCisJICovCisJbGxpX2FycmF5WzBdLmJ1c19hZGRyZXNzID0gKHUzMiltYXBfYXJyYXlbMF0uZG1hX2FkZHI7CisJbGxpX2FycmF5WzBdLmJsb2NrX3NpemUgPSBtYXBfYXJyYXlbMF0uc2l6ZTsKKworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LAorCSJsbGlfYXJyYXlbMF0uYnVzX2FkZHJlc3MgaXMgJTA4bHgsIGxsaV9hcnJheVswXS5ibG9ja19zaXplIGlzICV4XG4iLAorCQkodW5zaWduZWQgbG9uZylsbGlfYXJyYXlbMF0uYnVzX2FkZHJlc3MsCisJCWxsaV9hcnJheVswXS5ibG9ja19zaXplKTsKKworCS8qIFNldCB0aGUgb3V0cHV0IHBhcmFtZXRlcnMgKi8KKwlpZiAoaW5fb3V0X2ZsYWcgPT0gU0VQX0RSSVZFUl9JTl9GTEFHKSB7CisJCSpsbGlfYXJyYXlfcHRyID0gbGxpX2FycmF5OworCQlzZXAtPmRtYV9yZXNfYXJyW3NlcC0+bnJfZGNiX2NyZWF0XS5pbl9udW1fcGFnZXMgPSAxOworCQlzZXAtPmRtYV9yZXNfYXJyW3NlcC0+bnJfZGNiX2NyZWF0XS5pbl9wYWdlX2FycmF5ID0gTlVMTDsKKwkJc2VwLT5kbWFfcmVzX2FycltzZXAtPm5yX2RjYl9jcmVhdF0uaW5fbWFwX2FycmF5ID0gbWFwX2FycmF5OworCQlzZXAtPmRtYV9yZXNfYXJyW3NlcC0+bnJfZGNiX2NyZWF0XS5pbl9tYXBfbnVtX2VudHJpZXMgPSAxOworCX0gZWxzZSB7CisJCSpsbGlfYXJyYXlfcHRyID0gbGxpX2FycmF5OworCQlzZXAtPmRtYV9yZXNfYXJyW3NlcC0+bnJfZGNiX2NyZWF0XS5vdXRfbnVtX3BhZ2VzID0gMTsKKwkJc2VwLT5kbWFfcmVzX2FycltzZXAtPm5yX2RjYl9jcmVhdF0ub3V0X3BhZ2VfYXJyYXkgPSBOVUxMOworCQlzZXAtPmRtYV9yZXNfYXJyW3NlcC0+bnJfZGNiX2NyZWF0XS5vdXRfbWFwX2FycmF5ID0gbWFwX2FycmF5OworCQlzZXAtPmRtYV9yZXNfYXJyW3NlcC0+bnJfZGNiX2NyZWF0XS5vdXRfbWFwX251bV9lbnRyaWVzID0gMTsKKwl9CisJZ290byBlbmRfZnVuY3Rpb247CisKK2VuZF9mdW5jdGlvbl93aXRoX2Vycm9yOgorCWtmcmVlKGxsaV9hcnJheSk7CisKK2VuZF9mdW5jdGlvbjoKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgInNlcF9sb2NrX2tlcm5lbF9wYWdlcyBlbmRcbiIpOworCXJldHVybiBlcnJvcjsKK30KKworLyoqCisgKglzZXBfbG9ja191c2VyX3BhZ2VzIC0gbG9jayBhbmQgbWFwIHVzZXIgcGFnZXMgZm9yIERNQQorICoJQHNlcDogcG9pbnRlciB0byBzdHJ1Y3Qgc2VwX2RldmljZQorICoJQGFwcF92aXJ0X2FkZHI6IHVzZXIgbWVtb3J5IGRhdGEgYnVmZmVyCisgKglAZGF0YV9zaXplOiBzaXplIG9mIGRhdGEgYnVmZmVyCisgKglAbGxpX2FycmF5X3B0cjogbGxpIGFycmF5CisgKglAaW5fb3V0X2ZsYWc6IGlucHV0IG9yIG91dHB1dCB0byBkZXZpY2UKKyAqCisgKglUaGlzIGZ1bmN0aW9uIGxvY2tzIGFsbCB0aGUgcGh5c2ljYWwgcGFnZXMgb2YgdGhlIGFwcGxpY2F0aW9uCisgKgl2aXJ0dWFsIGJ1ZmZlciBhbmQgY29uc3RydWN0IGEgYmFzaWMgbGxpICBhcnJheSwgd2hlcmUgZWFjaCBlbnRyeQorICoJaG9sZHMgdGhlIHBoeXNpY2FsIHBhZ2UgYWRkcmVzcyBhbmQgdGhlIHNpemUgdGhhdCBhcHBsaWNhdGlvbgorICoJZGF0YSBob2xkcyBpbiB0aGlzIHBoeXNpY2FsIHBhZ2VzCisgKi8KK3N0YXRpYyBpbnQgc2VwX2xvY2tfdXNlcl9wYWdlcyhzdHJ1Y3Qgc2VwX2RldmljZSAqc2VwLAorCXUzMiBhcHBfdmlydF9hZGRyLAorCXUzMiBkYXRhX3NpemUsCisJc3RydWN0IHNlcF9sbGlfZW50cnkgKipsbGlfYXJyYXlfcHRyLAorCWludCBpbl9vdXRfZmxhZykKKworeworCWludCBlcnJvciA9IDA7CisJdTMyIGNvdW50OworCWludCByZXN1bHQ7CisJLyogVGhlIHRoZSBwYWdlIG9mIHRoZSBlbmQgYWRkcmVzcyBvZiB0aGUgdXNlciBzcGFjZSBidWZmZXIgKi8KKwl1MzIgZW5kX3BhZ2U7CisJLyogVGhlIHBhZ2Ugb2YgdGhlIHN0YXJ0IGFkZHJlc3Mgb2YgdGhlIHVzZXIgc3BhY2UgYnVmZmVyICovCisJdTMyIHN0YXJ0X3BhZ2U7CisJLyogVGhlIHJhbmdlIGluIHBhZ2VzICovCisJdTMyIG51bV9wYWdlczsKKwkvKiBBcnJheSBvZiBwb2ludGVycyB0byBwYWdlICovCisJc3RydWN0IHBhZ2UgKipwYWdlX2FycmF5OworCS8qIEFycmF5IG9mIGxsaSAqLworCXN0cnVjdCBzZXBfbGxpX2VudHJ5ICpsbGlfYXJyYXk7CisJLyogTWFwIGFycmF5ICovCisJc3RydWN0IHNlcF9kbWFfbWFwICptYXBfYXJyYXk7CisJLyogRGlyZWN0aW9uIG9mIHRoZSBETUEgbWFwcGluZyBmb3IgbG9ja2VkIHBhZ2VzICovCisJZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24JZGlyOworCisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJzZXBfbG9ja191c2VyX3BhZ2VzIHN0YXJ0XG4iKTsKKworCS8qIFNldCBzdGFydCBhbmQgZW5kIHBhZ2VzICBhbmQgbnVtIHBhZ2VzICovCisJZW5kX3BhZ2UgPSAoYXBwX3ZpcnRfYWRkciArIGRhdGFfc2l6ZSAtIDEpID4+IFBBR0VfU0hJRlQ7CisJc3RhcnRfcGFnZSA9IGFwcF92aXJ0X2FkZHIgPj4gUEFHRV9TSElGVDsKKwludW1fcGFnZXMgPSBlbmRfcGFnZSAtIHN0YXJ0X3BhZ2UgKyAxOworCisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJhcHBfdmlydF9hZGRyIGlzICV4XG4iLCBhcHBfdmlydF9hZGRyKTsKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgImRhdGFfc2l6ZSBpcyAleFxuIiwgZGF0YV9zaXplKTsKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgInN0YXJ0X3BhZ2UgaXMgJXhcbiIsIHN0YXJ0X3BhZ2UpOworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAiZW5kX3BhZ2UgaXMgJXhcbiIsIGVuZF9wYWdlKTsKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgIm51bV9wYWdlcyBpcyAleFxuIiwgbnVtX3BhZ2VzKTsKKworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAic3RhcnRpbmcgcGFnZV9hcnJheSBtYWxsb2NcbiIpOworCisJLyogQWxsb2NhdGUgYXJyYXkgb2YgcGFnZXMgc3RydWN0dXJlIHBvaW50ZXJzICovCisJcGFnZV9hcnJheSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBwYWdlICopICogbnVtX3BhZ2VzLCBHRlBfQVRPTUlDKTsKKwlpZiAoIXBhZ2VfYXJyYXkpIHsKKwkJZXJyb3IgPSAtRU5PTUVNOworCQlnb3RvIGVuZF9mdW5jdGlvbjsKKwl9CisJbWFwX2FycmF5ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHNlcF9kbWFfbWFwKSAqIG51bV9wYWdlcywgR0ZQX0FUT01JQyk7CisJaWYgKCFtYXBfYXJyYXkpIHsKKwkJZGV2X3dhcm4oJnNlcC0+cGRldi0+ZGV2LCAia21hbGxvYyBmb3IgbWFwX2FycmF5IGZhaWxlZFxuIik7CisJCWVycm9yID0gLUVOT01FTTsKKwkJZ290byBlbmRfZnVuY3Rpb25fd2l0aF9lcnJvcjE7CisJfQorCisJbGxpX2FycmF5ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHNlcF9sbGlfZW50cnkpICogbnVtX3BhZ2VzLAorCQlHRlBfQVRPTUlDKTsKKworCWlmICghbGxpX2FycmF5KSB7CisJCWRldl93YXJuKCZzZXAtPnBkZXYtPmRldiwgImttYWxsb2MgZm9yIGxsaV9hcnJheSBmYWlsZWRcbiIpOworCQllcnJvciA9IC1FTk9NRU07CisJCWdvdG8gZW5kX2Z1bmN0aW9uX3dpdGhfZXJyb3IyOworCX0KKworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAic3RhcnRpbmcgZ2V0X3VzZXJfcGFnZXNcbiIpOworCisJLyogQ29udmVydCB0aGUgYXBwbGljYXRpb24gdmlydHVhbCBhZGRyZXNzIGludG8gYSBzZXQgb2YgcGh5c2ljYWwgKi8KKwlkb3duX3JlYWQoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7CisJcmVzdWx0ID0gZ2V0X3VzZXJfcGFnZXMoY3VycmVudCwgY3VycmVudC0+bW0sIGFwcF92aXJ0X2FkZHIsCisJCW51bV9wYWdlcywKKwkJKChpbl9vdXRfZmxhZyA9PSBTRVBfRFJJVkVSX0lOX0ZMQUcpID8gMCA6IDEpLAorCQkwLCBwYWdlX2FycmF5LCBOVUxMKTsKKworCXVwX3JlYWQoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7CisKKwkvKiBDaGVjayB0aGUgbnVtYmVyIG9mIHBhZ2VzIGxvY2tlZCAtIGlmIG5vdCBhbGwgdGhlbiBleGl0IHdpdGggZXJyb3IgKi8KKwlpZiAocmVzdWx0ICE9IG51bV9wYWdlcykgeworCQlkZXZfd2Fybigmc2VwLT5wZGV2LT5kZXYsCisJCQkibm90IGFsbCBwYWdlcyBsb2NrZWQgYnkgZ2V0X3VzZXJfcGFnZXNcbiIpOworCQllcnJvciA9IC1FTk9NRU07CisJCWdvdG8gZW5kX2Z1bmN0aW9uX3dpdGhfZXJyb3IzOworCX0KKworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAiZ2V0X3VzZXJfcGFnZXMgc3VjY2VlZGVkXG4iKTsKKworCS8qIFNldCBkaXJlY3Rpb24gKi8KKwlpZiAoaW5fb3V0X2ZsYWcgPT0gU0VQX0RSSVZFUl9JTl9GTEFHKQorCQlkaXIgPSBETUFfVE9fREVWSUNFOworCWVsc2UKKwkJZGlyID0gRE1BX0ZST01fREVWSUNFOworCisJLyoKKwkgKiBGaWxsIHRoZSBhcnJheSB1c2luZyBwYWdlIGFycmF5IGRhdGEgYW5kCisJICogbWFwIHRoZSBwYWdlcyAtIHRoaXMgYWN0aW9uIHdpbGwgYWxzbyBmbHVzaCB0aGUgY2FjaGUgYXMgbmVlZGVkCisJICovCisJZm9yIChjb3VudCA9IDA7IGNvdW50IDwgbnVtX3BhZ2VzOyBjb3VudCsrKSB7CisJCS8qIEZpbGwgdGhlIG1hcCBhcnJheSAqLworCQltYXBfYXJyYXlbY291bnRdLmRtYV9hZGRyID0KKwkJCWRtYV9tYXBfcGFnZSgmc2VwLT5wZGV2LT5kZXYsIHBhZ2VfYXJyYXlbY291bnRdLAorCQkJMCwgUEFHRV9TSVpFLCAvKmRpciovRE1BX0JJRElSRUNUSU9OQUwpOworCisJCW1hcF9hcnJheVtjb3VudF0uc2l6ZSA9IFBBR0VfU0laRTsKKworCQkvKiBGaWxsIHRoZSBsbGkgYXJyYXkgZW50cnkgKi8KKwkJbGxpX2FycmF5W2NvdW50XS5idXNfYWRkcmVzcyA9ICh1MzIpbWFwX2FycmF5W2NvdW50XS5kbWFfYWRkcjsKKwkJbGxpX2FycmF5W2NvdW50XS5ibG9ja19zaXplID0gUEFHRV9TSVpFOworCisJCWRldl93YXJuKCZzZXAtPnBkZXYtPmRldiwgImxsaV9hcnJheVsleF0uYnVzX2FkZHJlc3MgaXMgJTA4bHgsIGxsaV9hcnJheVsleF0uYmxvY2tfc2l6ZSBpcyAleFxuIiwKKwkJCWNvdW50LCAodW5zaWduZWQgbG9uZylsbGlfYXJyYXlbY291bnRdLmJ1c19hZGRyZXNzLAorCQkJY291bnQsIGxsaV9hcnJheVtjb3VudF0uYmxvY2tfc2l6ZSk7CisJfQorCisJLyogQ2hlY2sgdGhlIG9mZnNldCBmb3IgdGhlIGZpcnN0IHBhZ2UgKi8KKwlsbGlfYXJyYXlbMF0uYnVzX2FkZHJlc3MgPQorCQlsbGlfYXJyYXlbMF0uYnVzX2FkZHJlc3MgKyAoYXBwX3ZpcnRfYWRkciAmICh+UEFHRV9NQVNLKSk7CisKKwkvKiBDaGVjayB0aGF0IG5vdCBhbGwgdGhlIGRhdGEgaXMgaW4gdGhlIGZpcnN0IHBhZ2Ugb25seSAqLworCWlmICgoUEFHRV9TSVpFIC0gKGFwcF92aXJ0X2FkZHIgJiAoflBBR0VfTUFTSykpKSA+PSBkYXRhX3NpemUpCisJCWxsaV9hcnJheVswXS5ibG9ja19zaXplID0gZGF0YV9zaXplOworCWVsc2UKKwkJbGxpX2FycmF5WzBdLmJsb2NrX3NpemUgPQorCQkJUEFHRV9TSVpFIC0gKGFwcF92aXJ0X2FkZHIgJiAoflBBR0VfTUFTSykpOworCisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsCisJCSJsbGlfYXJyYXlbMF0uYnVzX2FkZHJlc3MgaXMgJTA4bHgsIGxsaV9hcnJheVswXS5ibG9ja19zaXplIGlzICV4XG4iLAorCQkodW5zaWduZWQgbG9uZylsbGlfYXJyYXlbY291bnRdLmJ1c19hZGRyZXNzLAorCQlsbGlfYXJyYXlbY291bnRdLmJsb2NrX3NpemUpOworCisJLyogQ2hlY2sgdGhlIHNpemUgb2YgdGhlIGxhc3QgcGFnZSAqLworCWlmIChudW1fcGFnZXMgPiAxKSB7CisJCWxsaV9hcnJheVtudW1fcGFnZXMgLSAxXS5ibG9ja19zaXplID0KKwkJCShhcHBfdmlydF9hZGRyICsgZGF0YV9zaXplKSAmICh+UEFHRV9NQVNLKTsKKworCQlkZXZfd2Fybigmc2VwLT5wZGV2LT5kZXYsCisJCQkibGxpX2FycmF5WyV4XS5idXNfYWRkcmVzcyBpcyAlMDhseCwgbGxpX2FycmF5WyV4XS5ibG9ja19zaXplIGlzICV4XG4iLAorCQkJbnVtX3BhZ2VzIC0gMSwKKwkJCSh1bnNpZ25lZCBsb25nKWxsaV9hcnJheVtjb3VudF0uYnVzX2FkZHJlc3MsCisJCQludW1fcGFnZXMgLSAxLAorCQkJbGxpX2FycmF5W2NvdW50XS5ibG9ja19zaXplKTsKKwl9CisKKwkvKiBTZXQgb3V0cHV0IHBhcmFtcyBhY29yZGluZyB0byB0aGUgaW5fb3V0IGZsYWcgKi8KKwlpZiAoaW5fb3V0X2ZsYWcgPT0gU0VQX0RSSVZFUl9JTl9GTEFHKSB7CisJCSpsbGlfYXJyYXlfcHRyID0gbGxpX2FycmF5OworCQlzZXAtPmRtYV9yZXNfYXJyW3NlcC0+bnJfZGNiX2NyZWF0XS5pbl9udW1fcGFnZXMgPSBudW1fcGFnZXM7CisJCXNlcC0+ZG1hX3Jlc19hcnJbc2VwLT5ucl9kY2JfY3JlYXRdLmluX3BhZ2VfYXJyYXkgPSBwYWdlX2FycmF5OworCQlzZXAtPmRtYV9yZXNfYXJyW3NlcC0+bnJfZGNiX2NyZWF0XS5pbl9tYXBfYXJyYXkgPSBtYXBfYXJyYXk7CisJCXNlcC0+ZG1hX3Jlc19hcnJbc2VwLT5ucl9kY2JfY3JlYXRdLmluX21hcF9udW1fZW50cmllcyA9CisJCQkJCQkJCW51bV9wYWdlczsKKwl9IGVsc2UgeworCQkqbGxpX2FycmF5X3B0ciA9IGxsaV9hcnJheTsKKwkJc2VwLT5kbWFfcmVzX2FycltzZXAtPm5yX2RjYl9jcmVhdF0ub3V0X251bV9wYWdlcyA9IG51bV9wYWdlczsKKwkJc2VwLT5kbWFfcmVzX2FycltzZXAtPm5yX2RjYl9jcmVhdF0ub3V0X3BhZ2VfYXJyYXkgPQorCQkJCQkJCQlwYWdlX2FycmF5OworCQlzZXAtPmRtYV9yZXNfYXJyW3NlcC0+bnJfZGNiX2NyZWF0XS5vdXRfbWFwX2FycmF5ID0gbWFwX2FycmF5OworCQlzZXAtPmRtYV9yZXNfYXJyW3NlcC0+bnJfZGNiX2NyZWF0XS5vdXRfbWFwX251bV9lbnRyaWVzID0KKwkJCQkJCQkJbnVtX3BhZ2VzOworCX0KKwlnb3RvIGVuZF9mdW5jdGlvbjsKKworZW5kX2Z1bmN0aW9uX3dpdGhfZXJyb3IzOgorCS8qIEZyZWUgbGxpIGFycmF5ICovCisJa2ZyZWUobGxpX2FycmF5KTsKKworZW5kX2Z1bmN0aW9uX3dpdGhfZXJyb3IyOgorCWtmcmVlKG1hcF9hcnJheSk7CisKK2VuZF9mdW5jdGlvbl93aXRoX2Vycm9yMToKKwkvKiBGcmVlIHBhZ2UgYXJyYXkgKi8KKwlrZnJlZShwYWdlX2FycmF5KTsKKworZW5kX2Z1bmN0aW9uOgorCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAic2VwX2xvY2tfdXNlcl9wYWdlcyBlbmRcbiIpOworCXJldHVybiBlcnJvcjsKK30KKworLyoqCisgKgl1MzIgc2VwX2NhbGN1bGF0ZV9sbGlfdGFibGVfbWF4X3NpemUgLSBzaXplIHRoZSBMTEkgdGFibGUKKyAqCUBzZXA6IHBvaW50ZXIgdG8gc3RydWN0IHNlcF9kZXZpY2UKKyAqCUBsbGlfaW5fYXJyYXlfcHRyCisgKglAbnVtX2FycmF5X2VudHJpZXMKKyAqCUBsYXN0X3RhYmxlX2ZsYWcKKyAqCisgKglUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIHNpemUgb2YgZGF0YSB0aGF0IGNhbiBiZSBpbnNlcnRlZCBpbnRvCisgKgl0aGUgbGxpIHRhYmxlIGZyb20gdGhpcyBhcnJheSwgc3VjaCB0aGF0IGVpdGhlciB0aGUgdGFibGUgaXMgZnVsbAorICoJKGFsbCBlbnRyaWVzIGFyZSBlbnRlcmVkKSwgb3IgdGhlcmUgYXJlIG5vIG1vcmUgZW50cmllcyBpbiB0aGUKKyAqCWxsaSBhcnJheQorICovCitzdGF0aWMgdTMyIHNlcF9jYWxjdWxhdGVfbGxpX3RhYmxlX21heF9zaXplKHN0cnVjdCBzZXBfZGV2aWNlICpzZXAsCisJc3RydWN0IHNlcF9sbGlfZW50cnkgKmxsaV9pbl9hcnJheV9wdHIsCisJdTMyIG51bV9hcnJheV9lbnRyaWVzLAorCXUzMiAqbGFzdF90YWJsZV9mbGFnKQoreworCXUzMiBjb3VudGVyOworCS8qIFRhYmxlIGRhdGEgc2l6ZSAqLworCXUzMiB0YWJsZV9kYXRhX3NpemUgPSAwOworCS8qIERhdGEgc2l6ZSBmb3IgdGhlIG5leHQgdGFibGUgKi8KKwl1MzIgbmV4dF90YWJsZV9kYXRhX3NpemU7CisKKwkqbGFzdF90YWJsZV9mbGFnID0gMDsKKworCS8qCisJICogQ2FsY3VsYXRlIHRoZSBkYXRhIGluIHRoZSBvdXQgbGxpIHRhYmxlIHRpbGwgd2UgZmlsbCB0aGUgd2hvbGUKKwkgKiB0YWJsZSBvciB0aWxsIHRoZSBkYXRhIGhhcyBlbmRlZAorCSAqLworCWZvciAoY291bnRlciA9IDA7CisJCShjb3VudGVyIDwgKFNFUF9EUklWRVJfRU5UUklFU19QRVJfVEFCTEVfSU5fU0VQIC0gMSkpICYmCisJCQkoY291bnRlciA8IG51bV9hcnJheV9lbnRyaWVzKTsgY291bnRlcisrKQorCQl0YWJsZV9kYXRhX3NpemUgKz0gbGxpX2luX2FycmF5X3B0cltjb3VudGVyXS5ibG9ja19zaXplOworCisJLyoKKwkgKiBDaGVjayBpZiB3ZSByZWFjaGVkIHRoZSBsYXN0IGVudHJ5LAorCSAqIG1lYW5pbmcgdGhpcyBpYSB0aGUgbGFzdCB0YWJsZSB0byBidWlsZCwKKwkgKiBhbmQgbm8gbmVlZCB0byBjaGVjayB0aGUgYmxvY2sgYWxpZ25tZW50CisJICovCisJaWYgKGNvdW50ZXIgPT0gbnVtX2FycmF5X2VudHJpZXMpIHsKKwkJLyogU2V0IHRoZSBsYXN0IHRhYmxlIGZsYWcgKi8KKwkJKmxhc3RfdGFibGVfZmxhZyA9IDE7CisJCWdvdG8gZW5kX2Z1bmN0aW9uOworCX0KKworCS8qCisJICogQ2FsY3VsYXRlIHRoZSBkYXRhIHNpemUgb2YgdGhlIG5leHQgdGFibGUuCisJICogU3RvcCBpZiBubyBlbnRyaWVzIGxlZnQgb3IgaWYgZGF0YSBzaXplIGlzIG1vcmUgdGhlIERNQSByZXN0cmljdGlvbgorCSAqLworCW5leHRfdGFibGVfZGF0YV9zaXplID0gMDsKKwlmb3IgKDsgY291bnRlciA8IG51bV9hcnJheV9lbnRyaWVzOyBjb3VudGVyKyspIHsKKwkJbmV4dF90YWJsZV9kYXRhX3NpemUgKz0gbGxpX2luX2FycmF5X3B0cltjb3VudGVyXS5ibG9ja19zaXplOworCQlpZiAobmV4dF90YWJsZV9kYXRhX3NpemUgPj0gU0VQX0RSSVZFUl9NSU5fREFUQV9TSVpFX1BFUl9UQUJMRSkKKwkJCWJyZWFrOworCX0KKworCS8qCisJICogQ2hlY2sgaWYgdGhlIG5leHQgdGFibGUgZGF0YSBzaXplIGlzIGxlc3MgdGhlbiBETUEgcnN0cmljdGlvbi4KKwkgKiBpZiBpdCBpcyAtIHJlY2FsY3VsYXRlIHRoZSBjdXJyZW50IHRhYmxlIHNpemUsIHNvIHRoYXQgdGhlIG5leHQKKwkgKiB0YWJsZSBkYXRhIHNpemUgd2lsbCBiZSBhZGFxdWV0ZSBmb3IgRE1BCisJICovCisJaWYgKG5leHRfdGFibGVfZGF0YV9zaXplICYmCisJCW5leHRfdGFibGVfZGF0YV9zaXplIDwgU0VQX0RSSVZFUl9NSU5fREFUQV9TSVpFX1BFUl9UQUJMRSkKKworCQl0YWJsZV9kYXRhX3NpemUgLT0gKFNFUF9EUklWRVJfTUlOX0RBVEFfU0laRV9QRVJfVEFCTEUgLQorCQkJbmV4dF90YWJsZV9kYXRhX3NpemUpOworCisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJ0YWJsZSBkYXRhIHNpemUgaXMgJXhcbiIsCisJCQkJCQkJdGFibGVfZGF0YV9zaXplKTsKK2VuZF9mdW5jdGlvbjoKKwlyZXR1cm4gdGFibGVfZGF0YV9zaXplOworfQorCisvKioKKyAqCXNlcF9idWlsZF9sbGlfdGFibGUgLSBidWlsZCBhbiBsbGkgYXJyYXkgZm9yIHRoZSBnaXZlbiB0YWJsZQorICoJQHNlcDogcG9pbnRlciB0byBzdHJ1Y3Qgc2VwX2RldmljZQorICoJQGxsaV9hcnJheV9wdHI6IHBvaW50ZXIgdG8gbGxpIGFycmF5CisgKglAbGxpX3RhYmxlX3B0cjogcG9pbnRlciB0byBsbGkgdGFibGUKKyAqCUBudW1fcHJvY2Vzc2VkX2VudHJpZXNfcHRyOiBwb2ludGVyIHRvIG51bWJlciBvZiBlbnRyaWVzCisgKglAbnVtX3RhYmxlX2VudHJpZXNfcHRyOiBwb2ludGVyIHRvIG51bWJlciBvZiB0YWJsZXMKKyAqCUB0YWJsZV9kYXRhX3NpemU6IHRvdGFsIGRhdGEgc2l6ZQorICoKKyAqCUJ1aWxkcyBhbnQgbGxpIHRhYmxlIGZyb20gdGhlIGxsaV9hcnJheSBhY2NvcmRpbmcgdG8KKyAqCXRoZSBnaXZlbiBzaXplIG9mIGRhdGEKKyAqLworc3RhdGljIHZvaWQgc2VwX2J1aWxkX2xsaV90YWJsZShzdHJ1Y3Qgc2VwX2RldmljZSAqc2VwLAorCXN0cnVjdCBzZXBfbGxpX2VudHJ5CSpsbGlfYXJyYXlfcHRyLAorCXN0cnVjdCBzZXBfbGxpX2VudHJ5CSpsbGlfdGFibGVfcHRyLAorCXUzMiAqbnVtX3Byb2Nlc3NlZF9lbnRyaWVzX3B0ciwKKwl1MzIgKm51bV90YWJsZV9lbnRyaWVzX3B0ciwKKwl1MzIgdGFibGVfZGF0YV9zaXplKQoreworCS8qIEN1cnJlbnQgdGFibGUgZGF0YSBzaXplICovCisJdTMyIGN1cnJfdGFibGVfZGF0YV9zaXplOworCS8qIENvdW50ZXIgb2YgbGxpIGFycmF5IGVudHJ5ICovCisJdTMyIGFycmF5X2NvdW50ZXI7CisKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgInNlcF9idWlsZF9sbGlfdGFibGUgc3RhcnRcbiIpOworCisJLyogSW5pdCBjdXJycmVudCB0YWJsZSBkYXRhIHNpemUgYW5kIGxsaSBhcnJheSBlbnRyeSBjb3VudGVyICovCisJY3Vycl90YWJsZV9kYXRhX3NpemUgPSAwOworCWFycmF5X2NvdW50ZXIgPSAwOworCSpudW1fdGFibGVfZW50cmllc19wdHIgPSAxOworCisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJ0YWJsZV9kYXRhX3NpemUgaXMgJXhcbiIsIHRhYmxlX2RhdGFfc2l6ZSk7CisKKwkvKiBGaWxsIHRoZSB0YWJsZSB0aWxsIHRhYmxlIHNpemUgcmVhY2hlcyB0aGUgbmVlZGVkIGFtb3VudCAqLworCXdoaWxlIChjdXJyX3RhYmxlX2RhdGFfc2l6ZSA8IHRhYmxlX2RhdGFfc2l6ZSkgeworCQkvKiBVcGRhdGUgdGhlIG51bWJlciBvZiBlbnRyaWVzIGluIHRhYmxlICovCisJCSgqbnVtX3RhYmxlX2VudHJpZXNfcHRyKSsrOworCisJCWxsaV90YWJsZV9wdHItPmJ1c19hZGRyZXNzID0KKwkJCWNwdV90b19sZTMyKGxsaV9hcnJheV9wdHJbYXJyYXlfY291bnRlcl0uYnVzX2FkZHJlc3MpOworCisJCWxsaV90YWJsZV9wdHItPmJsb2NrX3NpemUgPQorCQkJY3B1X3RvX2xlMzIobGxpX2FycmF5X3B0clthcnJheV9jb3VudGVyXS5ibG9ja19zaXplKTsKKworCQljdXJyX3RhYmxlX2RhdGFfc2l6ZSArPSBsbGlfYXJyYXlfcHRyW2FycmF5X2NvdW50ZXJdLmJsb2NrX3NpemU7CisKKwkJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJsbGlfdGFibGVfcHRyIGlzICVwXG4iLAorCQkJCQkJCQlsbGlfdGFibGVfcHRyKTsKKwkJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJsbGlfdGFibGVfcHRyLT5idXNfYWRkcmVzcyBpcyAlMDhseFxuIiwKKwkJCQkodW5zaWduZWQgbG9uZylsbGlfdGFibGVfcHRyLT5idXNfYWRkcmVzcyk7CisJCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAibGxpX3RhYmxlX3B0ci0+YmxvY2tfc2l6ZSBpcyAleFxuIiwKKwkJCWxsaV90YWJsZV9wdHItPmJsb2NrX3NpemUpOworCisJCS8qIENoZWNrIGZvciBvdmVyZmxvdyBvZiB0aGUgdGFibGUgZGF0YSAqLworCQlpZiAoY3Vycl90YWJsZV9kYXRhX3NpemUgPiB0YWJsZV9kYXRhX3NpemUpIHsKKwkJCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LAorCQkJCSJjdXJyX3RhYmxlX2RhdGFfc2l6ZSB0b28gbGFyZ2VcbiIpOworCisJCQkvKiBVcGRhdGUgdGhlIHNpemUgb2YgYmxvY2sgaW4gdGhlIHRhYmxlICovCisJCQlsbGlfdGFibGVfcHRyLT5ibG9ja19zaXplIC09CisJCQljcHVfdG9fbGUzMigoY3Vycl90YWJsZV9kYXRhX3NpemUgLSB0YWJsZV9kYXRhX3NpemUpKTsKKworCQkJLyogVXBkYXRlIHRoZSBwaHlzaWNhbCBhZGRyZXNzIGluIHRoZSBsbGkgYXJyYXkgKi8KKwkJCWxsaV9hcnJheV9wdHJbYXJyYXlfY291bnRlcl0uYnVzX2FkZHJlc3MgKz0KKwkJCWNwdV90b19sZTMyKGxsaV90YWJsZV9wdHItPmJsb2NrX3NpemUpOworCisJCQkvKiBVcGRhdGUgdGhlIGJsb2NrIHNpemUgbGVmdCBpbiB0aGUgbGxpIGFycmF5ICovCisJCQlsbGlfYXJyYXlfcHRyW2FycmF5X2NvdW50ZXJdLmJsb2NrX3NpemUgPQorCQkJCShjdXJyX3RhYmxlX2RhdGFfc2l6ZSAtIHRhYmxlX2RhdGFfc2l6ZSk7CisJCX0gZWxzZQorCQkJLyogQWR2YW5jZSB0byB0aGUgbmV4dCBlbnRyeSBpbiB0aGUgbGxpX2FycmF5ICovCisJCQlhcnJheV9jb3VudGVyKys7CisKKwkJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsCisJCQkibGxpX3RhYmxlX3B0ci0+YnVzX2FkZHJlc3MgaXMgJTA4bHhcbiIsCisJCQkJKHVuc2lnbmVkIGxvbmcpbGxpX3RhYmxlX3B0ci0+YnVzX2FkZHJlc3MpOworCQlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwKKwkJCSJsbGlfdGFibGVfcHRyLT5ibG9ja19zaXplIGlzICV4XG4iLAorCQkJbGxpX3RhYmxlX3B0ci0+YmxvY2tfc2l6ZSk7CisKKwkJLyogTW92ZSB0byB0aGUgbmV4dCBlbnRyeSBpbiB0YWJsZSAqLworCQlsbGlfdGFibGVfcHRyKys7CisJfQorCisJLyogU2V0IHRoZSBpbmZvIGVudHJ5IHRvIGRlZmF1bHQgKi8KKwlsbGlfdGFibGVfcHRyLT5idXNfYWRkcmVzcyA9IDB4ZmZmZmZmZmY7CisJbGxpX3RhYmxlX3B0ci0+YmxvY2tfc2l6ZSA9IDA7CisKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgImxsaV90YWJsZV9wdHIgaXMgJXBcbiIsIGxsaV90YWJsZV9wdHIpOworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAibGxpX3RhYmxlX3B0ci0+YnVzX2FkZHJlc3MgaXMgJTA4bHhcbiIsCisJCQkJKHVuc2lnbmVkIGxvbmcpbGxpX3RhYmxlX3B0ci0+YnVzX2FkZHJlc3MpOworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAibGxpX3RhYmxlX3B0ci0+YmxvY2tfc2l6ZSBpcyAleFxuIiwKKwkJCQkJCWxsaV90YWJsZV9wdHItPmJsb2NrX3NpemUpOworCisJLyogU2V0IHRoZSBvdXRwdXQgcGFyYW1ldGVyICovCisJKm51bV9wcm9jZXNzZWRfZW50cmllc19wdHIgKz0gYXJyYXlfY291bnRlcjsKKworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAibnVtX3Byb2Nlc3NlZF9lbnRyaWVzX3B0ciBpcyAleFxuIiwKKwkJKm51bV9wcm9jZXNzZWRfZW50cmllc19wdHIpOworCisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJzZXBfYnVpbGRfbGxpX3RhYmxlIGVuZFxuIik7Cit9CisKKy8qKgorICoJc2VwX3NoYXJlZF9hcmVhX3ZpcnRfdG9fYnVzIC0gbWFwIHNoYXJlZCBhcmVhIHRvIGJ1cyBhZGRyZXNzCisgKglAc2VwOiBwb2ludGVyIHRvIHN0cnVjdCBzZXBfZGV2aWNlCisgKglAdmlydF9hZGRyZXNzOiB2aXJ0dWFsIGFkZHJlc3MgdG8gY29udmVydAorICoKKyAqCVRoaXMgZnVuY3Rpb25zIHJldHVybnMgdGhlIHBoeXNpY2FsIGFkZHJlc3MgaW5zaWRlIHNoYXJlZCBhcmVhIGFjY29yZGluZworICoJdG8gdGhlIHZpcnR1YWwgYWRkcmVzcy4gSXQgY2FuIGJlIGVpdGhlciBvbiB0aGUgZXh0ZXJuYSBSQU0gZGV2aWNlCisgKgkoaW9yZW1hcHBlZCksIG9yIG9uIHRoZSBzeXN0ZW0gUkFNCisgKglUaGlzIGltcGxlbWVudGF0aW9uIGlzIGZvciB0aGUgZXh0ZXJuYWwgUkFNCisgKi8KK3N0YXRpYyBkbWFfYWRkcl90IHNlcF9zaGFyZWRfYXJlYV92aXJ0X3RvX2J1cyhzdHJ1Y3Qgc2VwX2RldmljZSAqc2VwLAorCXZvaWQgKnZpcnRfYWRkcmVzcykKK3sKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgInNoIHZpcnQgdG8gcGh5cyB2ICVwXG4iLCB2aXJ0X2FkZHJlc3MpOworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAic2ggdmlydCB0byBwaHlzIHAgJTA4bHhcbiIsCisJCSh1bnNpZ25lZCBsb25nKQorCQlzZXAtPnNoYXJlZF9idXMgKyAodmlydF9hZGRyZXNzIC0gc2VwLT5zaGFyZWRfYWRkcikpOworCisJcmV0dXJuIHNlcC0+c2hhcmVkX2J1cyArIChzaXplX3QpKHZpcnRfYWRkcmVzcyAtIHNlcC0+c2hhcmVkX2FkZHIpOworfQorCisvKioKKyAqCXNlcF9zaGFyZWRfYXJlYV9idXNfdG9fdmlydCAtIG1hcCBzaGFyZWQgYXJlYSBidXMgYWRkcmVzcyB0byBrZXJuZWwKKyAqCUBzZXA6IHBvaW50ZXIgdG8gc3RydWN0IHNlcF9kZXZpY2UKKyAqCUBidXNfYWRkcmVzczogYnVzIGFkZHJlc3MgdG8gY29udmVydAorICoKKyAqCVRoaXMgZnVuY3Rpb25zIHJldHVybnMgdGhlIHZpcnR1YWwgYWRkcmVzcyBpbnNpZGUgc2hhcmVkIGFyZWEKKyAqCWFjY29yZGluZyB0byB0aGUgcGh5c2ljYWwgYWRkcmVzcy4gSXQgY2FuIGJlIGVpdGhlciBvbiB0aGUKKyAqCWV4dGVybmEgUkFNIGRldmljZSAoaW9yZW1hcHBlZCksIG9yIG9uIHRoZSBzeXN0ZW0gUkFNCisgKglUaGlzIGltcGxlbWVudGF0aW9uIGlzIGZvciB0aGUgZXh0ZXJuYWwgUkFNCisgKi8KK3N0YXRpYyB2b2lkICpzZXBfc2hhcmVkX2FyZWFfYnVzX3RvX3ZpcnQoc3RydWN0IHNlcF9kZXZpY2UgKnNlcCwKKwlkbWFfYWRkcl90IGJ1c19hZGRyZXNzKQoreworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAic2hhcmVkIGJ1cyB0byB2aXJ0IGI9JWx4IHY9JWx4XG4iLAorCQkodW5zaWduZWQgbG9uZylidXNfYWRkcmVzcywgKHVuc2lnbmVkIGxvbmcpKHNlcC0+c2hhcmVkX2FkZHIgKworCQkJKHNpemVfdCkoYnVzX2FkZHJlc3MgLSBzZXAtPnNoYXJlZF9idXMpKSk7CisKKwlyZXR1cm4gc2VwLT5zaGFyZWRfYWRkcgkrIChzaXplX3QpKGJ1c19hZGRyZXNzIC0gc2VwLT5zaGFyZWRfYnVzKTsKK30KKworLyoqCisgKglzZXBfZGVidWdfcHJpbnRfbGxpX3RhYmxlcyAtIGR1bXAgTExJIHRhYmxlCisgKglAc2VwOiBwb2ludGVyIHRvIHN0cnVjdCBzZXBfZGV2aWNlCisgKglAbGxpX3RhYmxlX3B0cjogcG9pbnRlciB0byBzZXBfbGxpX2VudHJ5CisgKglAbnVtX3RhYmxlX2VudHJpZXM6IG51bWJlciBvZiBlbnRyaWVzCisgKglAdGFibGVfZGF0YV9zaXplOiB0b3RhbCBkYXRhIHNpemUKKyAqCisgKglXYWxrIHRoZSB0aGUgbGlzdCBvZiB0aGUgcHJpbnQgY3JlYXRlZCB0YWJsZXMgYW5kIHByaW50IGFsbCB0aGUgZGF0YQorICovCitzdGF0aWMgdm9pZCBzZXBfZGVidWdfcHJpbnRfbGxpX3RhYmxlcyhzdHJ1Y3Qgc2VwX2RldmljZSAqc2VwLAorCXN0cnVjdCBzZXBfbGxpX2VudHJ5ICpsbGlfdGFibGVfcHRyLAorCXVuc2lnbmVkIGxvbmcgbnVtX3RhYmxlX2VudHJpZXMsCisJdW5zaWduZWQgbG9uZyB0YWJsZV9kYXRhX3NpemUpCit7CisJdW5zaWduZWQgbG9uZyB0YWJsZV9jb3VudCA9IDE7CisJdW5zaWduZWQgbG9uZyBlbnRyaWVzX2NvdW50ID0gMDsKKworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAic2VwX2RlYnVnX3ByaW50X2xsaV90YWJsZXMgc3RhcnRcbiIpOworCisJd2hpbGUgKCh1bnNpZ25lZCBsb25nKSBsbGlfdGFibGVfcHRyLT5idXNfYWRkcmVzcyAhPSAweGZmZmZmZmZmKSB7CisJCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LAorCQkJImxsaSB0YWJsZSAlMDhseCwgdGFibGVfZGF0YV9zaXplIGlzICVsdVxuIiwKKwkJCXRhYmxlX2NvdW50LCB0YWJsZV9kYXRhX3NpemUpOworCQlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgIm51bV90YWJsZV9lbnRyaWVzIGlzICVsdVxuIiwKKwkJCQkJCQludW1fdGFibGVfZW50cmllcyk7CisKKwkJLyogUHJpbnQgZW50cmllcyBvZiB0aGUgdGFibGUgKHdpdGhvdXQgaW5mbyBlbnRyeSkgKi8KKwkJZm9yIChlbnRyaWVzX2NvdW50ID0gMDsgZW50cmllc19jb3VudCA8IG51bV90YWJsZV9lbnRyaWVzOworCQkJZW50cmllc19jb3VudCsrLCBsbGlfdGFibGVfcHRyKyspIHsKKworCQkJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsCisJCQkJImxsaV90YWJsZV9wdHIgYWRkcmVzcyBpcyAlMDhseFxuIiwKKwkJCQkodW5zaWduZWQgbG9uZykgbGxpX3RhYmxlX3B0cik7CisKKwkJCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LAorCQkJCSJwaHlzIGFkZHJlc3MgaXMgJTA4bHggYmxvY2sgc2l6ZSBpcyAleFxuIiwKKwkJCQkodW5zaWduZWQgbG9uZylsbGlfdGFibGVfcHRyLT5idXNfYWRkcmVzcywKKwkJCQlsbGlfdGFibGVfcHRyLT5ibG9ja19zaXplKTsKKwkJfQorCQkvKiBQb2ludCB0byB0aGUgaW5mbyBlbnRyeSAqLworCQlsbGlfdGFibGVfcHRyLS07CisKKwkJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsCisJCQkicGh5cyBsbGlfdGFibGVfcHRyLT5ibG9ja19zaXplIGlzICV4XG4iLAorCQkJbGxpX3RhYmxlX3B0ci0+YmxvY2tfc2l6ZSk7CisKKwkJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsCisJCQkicGh5cyBsbGlfdGFibGVfcHRyLT5waHlzaWNhbF9hZGRyZXNzIGlzICUwOGx1XG4iLAorCQkJKHVuc2lnbmVkIGxvbmcpbGxpX3RhYmxlX3B0ci0+YnVzX2FkZHJlc3MpOworCisKKwkJdGFibGVfZGF0YV9zaXplID0gbGxpX3RhYmxlX3B0ci0+YmxvY2tfc2l6ZSAmIDB4ZmZmZmZmOworCQludW1fdGFibGVfZW50cmllcyA9IChsbGlfdGFibGVfcHRyLT5ibG9ja19zaXplID4+IDI0KSAmIDB4ZmY7CisKKwkJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsCisJCQkicGh5cyB0YWJsZV9kYXRhX3NpemUgaXMgJWx1IG51bV90YWJsZV9lbnRyaWVzIGlzIgorCQkJIiAlbHUgYnVzX2FkZHJlc3MgaXMlbHVcbiIsIHRhYmxlX2RhdGFfc2l6ZSwKKwkJCW51bV90YWJsZV9lbnRyaWVzLCAodW5zaWduZWQgbG9uZylsbGlfdGFibGVfcHRyLT5idXNfYWRkcmVzcyk7CisKKwkJaWYgKCh1bnNpZ25lZCBsb25nKWxsaV90YWJsZV9wdHItPmJ1c19hZGRyZXNzICE9IDB4ZmZmZmZmZmYpCisJCQlsbGlfdGFibGVfcHRyID0gKHN0cnVjdCBzZXBfbGxpX2VudHJ5ICopCisJCQkJc2VwX3NoYXJlZF9idXNfdG9fdmlydChzZXAsCisJCQkJKHVuc2lnbmVkIGxvbmcpbGxpX3RhYmxlX3B0ci0+YnVzX2FkZHJlc3MpOworCisJCXRhYmxlX2NvdW50Kys7CisJfQorCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAic2VwX2RlYnVnX3ByaW50X2xsaV90YWJsZXMgZW5kXG4iKTsKK30KKworCisvKioKKyAqCXNlcF9wcmVwYXJlX2VtcHR5X2xsaV90YWJsZSAtIGNyZWF0ZSBhIGJsYW5rIExMSSB0YWJsZQorICoJQHNlcDogcG9pbnRlciB0byBzdHJ1Y3Qgc2VwX2RldmljZQorICoJQGxsaV90YWJsZV9hZGRyX3B0cjogcG9pbnRlciB0byBsbGkgdGFibGUKKyAqCUBudW1fZW50cmllc19wdHI6IHBvaW50ZXIgdG8gbnVtYmVyIG9mIGVudHJpZXMKKyAqCUB0YWJsZV9kYXRhX3NpemVfcHRyOiBwb2ludCB0byB0YWJsZSBkYXRhIHNpemUKKyAqCisgKglUaGlzIGZ1bmN0aW9uIGNyZWF0ZXMgZW1wdHkgbGxpIHRhYmxlcyB3aGVuIHRoZXJlIGlzIG5vIGRhdGEKKyAqLworc3RhdGljIHZvaWQgc2VwX3ByZXBhcmVfZW1wdHlfbGxpX3RhYmxlKHN0cnVjdCBzZXBfZGV2aWNlICpzZXAsCisJCWRtYV9hZGRyX3QgKmxsaV90YWJsZV9hZGRyX3B0ciwKKwkJdTMyICpudW1fZW50cmllc19wdHIsCisJCXUzMiAqdGFibGVfZGF0YV9zaXplX3B0cikKK3sKKwlzdHJ1Y3Qgc2VwX2xsaV9lbnRyeSAqbGxpX3RhYmxlX3B0cjsKKworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAic2VwX3ByZXBhcmVfZW1wdHlfbGxpX3RhYmxlIHN0YXJ0XG4iKTsKKworCS8qIEZpbmQgdGhlIGFyZWEgZm9yIG5ldyB0YWJsZSAqLworCWxsaV90YWJsZV9wdHIgPQorCQkoc3RydWN0IHNlcF9sbGlfZW50cnkgKikoc2VwLT5zaGFyZWRfYWRkciArCisJCVNZTkNIUk9OSUNfRE1BX1RBQkxFU19BUkVBX09GRlNFVF9CWVRFUyArCisJCXNlcC0+bnVtX2xsaV90YWJsZXNfY3JlYXRlZCAqIHNpemVvZihzdHJ1Y3Qgc2VwX2xsaV9lbnRyeSkgKgorCQkJU0VQX0RSSVZFUl9FTlRSSUVTX1BFUl9UQUJMRV9JTl9TRVApOworCisJbGxpX3RhYmxlX3B0ci0+YnVzX2FkZHJlc3MgPSAwOworCWxsaV90YWJsZV9wdHItPmJsb2NrX3NpemUgPSAwOworCisJbGxpX3RhYmxlX3B0cisrOworCWxsaV90YWJsZV9wdHItPmJ1c19hZGRyZXNzID0gMHhGRkZGRkZGRjsKKwlsbGlfdGFibGVfcHRyLT5ibG9ja19zaXplID0gMDsKKworCS8qIFNldCB0aGUgb3V0cHV0IHBhcmFtZXRlciB2YWx1ZSAqLworCSpsbGlfdGFibGVfYWRkcl9wdHIgPSBzZXAtPnNoYXJlZF9idXMgKworCQlTWU5DSFJPTklDX0RNQV9UQUJMRVNfQVJFQV9PRkZTRVRfQllURVMgKworCQlzZXAtPm51bV9sbGlfdGFibGVzX2NyZWF0ZWQgKgorCQlzaXplb2Yoc3RydWN0IHNlcF9sbGlfZW50cnkpICoKKwkJU0VQX0RSSVZFUl9FTlRSSUVTX1BFUl9UQUJMRV9JTl9TRVA7CisKKwkvKiBTZXQgdGhlIG51bSBvZiBlbnRyaWVzIGFuZCB0YWJsZSBkYXRhIHNpemUgZm9yIGVtcHR5IHRhYmxlICovCisJKm51bV9lbnRyaWVzX3B0ciA9IDI7CisJKnRhYmxlX2RhdGFfc2l6ZV9wdHIgPSAwOworCisJLyogVXBkYXRlIHRoZSBudW1iZXIgb2YgY3JlYXRlZCB0YWJsZXMgKi8KKwlzZXAtPm51bV9sbGlfdGFibGVzX2NyZWF0ZWQrKzsKKworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAic2VwX3ByZXBhcmVfZW1wdHlfbGxpX3RhYmxlIHN0YXJ0XG4iKTsKKworfQorCisvKioKKyAqCXNlcF9wcmVwYXJlX2lucHV0X2RtYV90YWJsZSAtIHByZXBhcmUgaW5wdXQgRE1BIG1hcHBpbmdzCisgKglAc2VwOiBwb2ludGVyIHRvIHN0cnVjdCBzZXBfZGV2aWNlCisgKglAZGF0YV9zaXplOgorICoJQGJsb2NrX3NpemU6CisgKglAbGxpX3RhYmxlX3B0cjoKKyAqCUBudW1fZW50cmllc19wdHI6CisgKglAdGFibGVfZGF0YV9zaXplX3B0cjoKKyAqCUBpc19rdmE6IHNldCBmb3Iga2VybmVsIGRhdGEgKGtlcm5lbCBjcnlwdGlvIGNhbGwpCisgKgorICoJVGhpcyBmdW5jdGlvbiBwcmVwYXJlcyBvbmx5IGlucHV0IERNQSB0YWJsZSBmb3Igc3luaHJvbmljIHN5bW1ldHJpYworICoJb3BlcmF0aW9ucyAoSEFTSCkKKyAqCU5vdGUgdGhhdCBhbGwgYnVzIGFkZHJlc3NlcyB0aGF0IGFyZSBwYXNzZWQgdG8gdGhlIFNFUAorICoJYXJlIGluIDMyIGJpdCBmb3JtYXQ7IHRoZSBTRVAgaXMgYSAzMiBiaXQgZGV2aWNlCisgKi8KK3N0YXRpYyBpbnQgc2VwX3ByZXBhcmVfaW5wdXRfZG1hX3RhYmxlKHN0cnVjdCBzZXBfZGV2aWNlICpzZXAsCisJdW5zaWduZWQgbG9uZyBhcHBfdmlydF9hZGRyLAorCXUzMiBkYXRhX3NpemUsCisJdTMyIGJsb2NrX3NpemUsCisJZG1hX2FkZHJfdCAqbGxpX3RhYmxlX3B0ciwKKwl1MzIgKm51bV9lbnRyaWVzX3B0ciwKKwl1MzIgKnRhYmxlX2RhdGFfc2l6ZV9wdHIsCisJYm9vbCBpc19rdmEpCit7CisJaW50IGVycm9yID0gMDsKKwkvKiBQb2ludGVyIHRvIHRoZSBpbmZvIGVudHJ5IG9mIHRoZSB0YWJsZSAtIHRoZSBsYXN0IGVudHJ5ICovCisJc3RydWN0IHNlcF9sbGlfZW50cnkgKmluZm9fZW50cnlfcHRyOworCS8qIEFycmF5IG9mIHBvaW50ZXJzIHRvIHBhZ2UgKi8KKwlzdHJ1Y3Qgc2VwX2xsaV9lbnRyeSAqbGxpX2FycmF5X3B0cjsKKwkvKiBQb2ludHMgdG8gdGhlIGZpcnN0IGVudHJ5IHRvIGJlIHByb2Nlc3NlZCBpbiB0aGUgbGxpX2luX2FycmF5ICovCisJdTMyIGN1cnJlbnRfZW50cnkgPSAwOworCS8qIE51bSBlbnRyaWVzIGluIHRoZSB2aXJ0dWFsIGJ1ZmZlciAqLworCXUzMiBzZXBfbGxpX2VudHJpZXMgPSAwOworCS8qIExsaSB0YWJsZSBwb2ludGVyICovCisJc3RydWN0IHNlcF9sbGlfZW50cnkgKmluX2xsaV90YWJsZV9wdHI7CisJLyogVGhlIHRvdGFsIGRhdGEgaW4gb25lIHRhYmxlICovCisJdTMyIHRhYmxlX2RhdGFfc2l6ZSA9IDA7CisJLyogRmxhZyBmb3IgbGFzdCB0YWJsZSAqLworCXUzMiBsYXN0X3RhYmxlX2ZsYWcgPSAwOworCS8qIE51bWJlciBvZiBlbnRyaWVzIGluIGxsaSB0YWJsZSAqLworCXUzMiBudW1fZW50cmllc19pbl90YWJsZSA9IDA7CisJLyogTmV4dCB0YWJsZSBhZGRyZXNzICovCisJdm9pZCAqbGxpX3RhYmxlX2FsbG9jX2FkZHIgPSAwOworCisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJzZXBfcHJlcGFyZV9pbnB1dF9kbWFfdGFibGUgc3RhcnRcbiIpOworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAiZGF0YV9zaXplIGlzICV4XG4iLCBkYXRhX3NpemUpOworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAiYmxvY2tfc2l6ZSBpcyAleFxuIiwgYmxvY2tfc2l6ZSk7CisKKwkvKiBJbml0aWFsaXplIHRoZSBwYWdlcyBwb2ludGVycyAqLworCXNlcC0+ZG1hX3Jlc19hcnJbc2VwLT5ucl9kY2JfY3JlYXRdLmluX3BhZ2VfYXJyYXkgPSBOVUxMOworCXNlcC0+ZG1hX3Jlc19hcnJbc2VwLT5ucl9kY2JfY3JlYXRdLmluX251bV9wYWdlcyA9IDA7CisKKwkvKiBTZXQgdGhlIGtlcm5lbCBhZGRyZXNzIGZvciBmaXJzdCB0YWJsZSB0byBiZSBhbGxvY2F0ZWQgKi8KKwlsbGlfdGFibGVfYWxsb2NfYWRkciA9ICh2b2lkICopKHNlcC0+c2hhcmVkX2FkZHIgKworCQlTWU5DSFJPTklDX0RNQV9UQUJMRVNfQVJFQV9PRkZTRVRfQllURVMgKworCQlzZXAtPm51bV9sbGlfdGFibGVzX2NyZWF0ZWQgKiBzaXplb2Yoc3RydWN0IHNlcF9sbGlfZW50cnkpICoKKwkJU0VQX0RSSVZFUl9FTlRSSUVTX1BFUl9UQUJMRV9JTl9TRVApOworCisJaWYgKGRhdGFfc2l6ZSA9PSAwKSB7CisJCS8qIFNwZWNpYWwgY2FzZSAgLSBjcmVhdGUgbWVwdHUgdGFibGUgLSAyIGVudHJpZXMsIHplcm8gZGF0YSAqLworCQlzZXBfcHJlcGFyZV9lbXB0eV9sbGlfdGFibGUoc2VwLCBsbGlfdGFibGVfcHRyLAorCQkJCW51bV9lbnRyaWVzX3B0ciwgdGFibGVfZGF0YV9zaXplX3B0cik7CisJCWdvdG8gdXBkYXRlX2RjYl9jb3VudGVyOworCX0KKworCS8qIENoZWNrIGlmIHRoZSBwYWdlcyBhcmUgaW4gS2VybmVsIFZpcnR1YWwgQWRkcmVzcyBsYXlvdXQgKi8KKwlpZiAoaXNfa3ZhID09IHRydWUpCisJCS8qIExvY2sgdGhlIHBhZ2VzIGluIHRoZSBrZXJuZWwgKi8KKwkJZXJyb3IgPSBzZXBfbG9ja19rZXJuZWxfcGFnZXMoc2VwLCBhcHBfdmlydF9hZGRyLAorCQkJZGF0YV9zaXplLCAmbGxpX2FycmF5X3B0ciwgU0VQX0RSSVZFUl9JTl9GTEFHKTsKKwllbHNlCisJCS8qCisJCSAqIExvY2sgdGhlIHBhZ2VzIG9mIHRoZSB1c2VyIGJ1ZmZlcgorCQkgKiBhbmQgdHJhbnNsYXRlIHRoZW0gdG8gcGFnZXMKKwkJICovCisJCWVycm9yID0gc2VwX2xvY2tfdXNlcl9wYWdlcyhzZXAsIGFwcF92aXJ0X2FkZHIsCisJCQlkYXRhX3NpemUsICZsbGlfYXJyYXlfcHRyLCBTRVBfRFJJVkVSX0lOX0ZMQUcpOworCisJaWYgKGVycm9yKQorCQlnb3RvIGVuZF9mdW5jdGlvbjsKKworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAib3V0cHV0IHNlcF9pbl9udW1fcGFnZXMgaXMgJXhcbiIsCisJCXNlcC0+ZG1hX3Jlc19hcnJbc2VwLT5ucl9kY2JfY3JlYXRdLmluX251bV9wYWdlcyk7CisKKwljdXJyZW50X2VudHJ5ID0gMDsKKwlpbmZvX2VudHJ5X3B0ciA9IE5VTEw7CisKKwlzZXBfbGxpX2VudHJpZXMgPSBzZXAtPmRtYV9yZXNfYXJyW3NlcC0+bnJfZGNiX2NyZWF0XS5pbl9udW1fcGFnZXM7CisKKwkvKiBMb29wIHRpbGwgYWxsIHRoZSBlbnRyaWVzIGluIGluIGFycmF5IGFyZSBub3QgcHJvY2Vzc2VkICovCisJd2hpbGUgKGN1cnJlbnRfZW50cnkgPCBzZXBfbGxpX2VudHJpZXMpIHsKKworCQkvKiBTZXQgdGhlIG5ldyBpbnB1dCBhbmQgb3V0cHV0IHRhYmxlcyAqLworCQlpbl9sbGlfdGFibGVfcHRyID0KKwkJCShzdHJ1Y3Qgc2VwX2xsaV9lbnRyeSAqKWxsaV90YWJsZV9hbGxvY19hZGRyOworCisJCWxsaV90YWJsZV9hbGxvY19hZGRyICs9IHNpemVvZihzdHJ1Y3Qgc2VwX2xsaV9lbnRyeSkgKgorCQkJU0VQX0RSSVZFUl9FTlRSSUVTX1BFUl9UQUJMRV9JTl9TRVA7CisKKwkJaWYgKGxsaV90YWJsZV9hbGxvY19hZGRyID4KKwkJCSgodm9pZCAqKXNlcC0+c2hhcmVkX2FkZHIgKworCQkJU1lOQ0hST05JQ19ETUFfVEFCTEVTX0FSRUFfT0ZGU0VUX0JZVEVTICsKKwkJCVNZTkNIUk9OSUNfRE1BX1RBQkxFU19BUkVBX1NJWkVfQllURVMpKSB7CisKKwkJCWVycm9yID0gLUVOT01FTTsKKwkJCWdvdG8gZW5kX2Z1bmN0aW9uX2Vycm9yOworCisJCX0KKworCQkvKiBVcGRhdGUgdGhlIG51bWJlciBvZiBjcmVhdGVkIHRhYmxlcyAqLworCQlzZXAtPm51bV9sbGlfdGFibGVzX2NyZWF0ZWQrKzsKKworCQkvKiBDYWxjdWxhdGUgdGhlIG1heGltdW0gc2l6ZSBvZiBkYXRhIGZvciBpbnB1dCB0YWJsZSAqLworCQl0YWJsZV9kYXRhX3NpemUgPSBzZXBfY2FsY3VsYXRlX2xsaV90YWJsZV9tYXhfc2l6ZShzZXAsCisJCQkmbGxpX2FycmF5X3B0cltjdXJyZW50X2VudHJ5XSwKKwkJCShzZXBfbGxpX2VudHJpZXMgLSBjdXJyZW50X2VudHJ5KSwKKwkJCSZsYXN0X3RhYmxlX2ZsYWcpOworCisJCS8qCisJCSAqIElmIHRoaXMgaXMgbm90IHRoZSBsYXN0IHRhYmxlIC0KKwkJICogdGhlbiBhbGxpZ24gaXQgdG8gdGhlIGJsb2NrIHNpemUKKwkJICovCisJCWlmICghbGFzdF90YWJsZV9mbGFnKQorCQkJdGFibGVfZGF0YV9zaXplID0KKwkJCQkodGFibGVfZGF0YV9zaXplIC8gYmxvY2tfc2l6ZSkgKiBibG9ja19zaXplOworCisJCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAib3V0cHV0IHRhYmxlX2RhdGFfc2l6ZSBpcyAleFxuIiwKKwkJCQkJCQl0YWJsZV9kYXRhX3NpemUpOworCisJCS8qIENvbnN0cnVjdCBpbnB1dCBsbGkgdGFibGUgKi8KKwkJc2VwX2J1aWxkX2xsaV90YWJsZShzZXAsICZsbGlfYXJyYXlfcHRyW2N1cnJlbnRfZW50cnldLAorCQkJaW5fbGxpX3RhYmxlX3B0ciwKKwkJCSZjdXJyZW50X2VudHJ5LCAmbnVtX2VudHJpZXNfaW5fdGFibGUsIHRhYmxlX2RhdGFfc2l6ZSk7CisKKwkJaWYgKGluZm9fZW50cnlfcHRyID09IE5VTEwpIHsKKworCQkJLyogU2V0IHRoZSBvdXRwdXQgcGFyYW1ldGVycyB0byBwaHlzaWNhbCBhZGRyZXNzZXMgKi8KKwkJCSpsbGlfdGFibGVfcHRyID0gc2VwX3NoYXJlZF9hcmVhX3ZpcnRfdG9fYnVzKHNlcCwKKwkJCQlpbl9sbGlfdGFibGVfcHRyKTsKKwkJCSpudW1fZW50cmllc19wdHIgPSBudW1fZW50cmllc19pbl90YWJsZTsKKwkJCSp0YWJsZV9kYXRhX3NpemVfcHRyID0gdGFibGVfZGF0YV9zaXplOworCisJCQlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwKKwkJCQkib3V0cHV0IGxsaV90YWJsZV9pbl9wdHIgaXMgJTA4bHhcbiIsCisJCQkJKHVuc2lnbmVkIGxvbmcpKmxsaV90YWJsZV9wdHIpOworCisJCX0gZWxzZSB7CisJCQkvKiBVcGRhdGUgdGhlIGluZm8gZW50cnkgb2YgdGhlIHByZXZpb3VzIGluIHRhYmxlICovCisJCQlpbmZvX2VudHJ5X3B0ci0+YnVzX2FkZHJlc3MgPQorCQkJCXNlcF9zaGFyZWRfYXJlYV92aXJ0X3RvX2J1cyhzZXAsCisJCQkJCQkJaW5fbGxpX3RhYmxlX3B0cik7CisJCQlpbmZvX2VudHJ5X3B0ci0+YmxvY2tfc2l6ZSA9CisJCQkJKChudW1fZW50cmllc19pbl90YWJsZSkgPDwgMjQpIHwKKwkJCQkodGFibGVfZGF0YV9zaXplKTsKKwkJfQorCQkvKiBTYXZlIHRoZSBwb2ludGVyIHRvIHRoZSBpbmZvIGVudHJ5IG9mIHRoZSBjdXJyZW50IHRhYmxlcyAqLworCQlpbmZvX2VudHJ5X3B0ciA9IGluX2xsaV90YWJsZV9wdHIgKyBudW1fZW50cmllc19pbl90YWJsZSAtIDE7CisJfQorCS8qIFByaW50IGlucHV0IHRhYmxlcyAqLworCXNlcF9kZWJ1Z19wcmludF9sbGlfdGFibGVzKHNlcCwgKHN0cnVjdCBzZXBfbGxpX2VudHJ5ICopCisJCXNlcF9zaGFyZWRfYXJlYV9idXNfdG9fdmlydChzZXAsICpsbGlfdGFibGVfcHRyKSwKKwkJKm51bV9lbnRyaWVzX3B0ciwgKnRhYmxlX2RhdGFfc2l6ZV9wdHIpOworCS8qIFRoZSBhcnJheSBvZiB0aGUgcGFnZXMgKi8KKwlrZnJlZShsbGlfYXJyYXlfcHRyKTsKKwordXBkYXRlX2RjYl9jb3VudGVyOgorCS8qIFVwZGF0ZSBEQ0IgY291bnRlciAqLworCXNlcC0+bnJfZGNiX2NyZWF0Kys7CisJZ290byBlbmRfZnVuY3Rpb247CisKK2VuZF9mdW5jdGlvbl9lcnJvcjoKKwkvKiBGcmVlIGFsbCB0aGUgYWxsb2NhdGVkIHJlc291cmNlcyAqLworCWtmcmVlKHNlcC0+ZG1hX3Jlc19hcnJbc2VwLT5ucl9kY2JfY3JlYXRdLmluX21hcF9hcnJheSk7CisJa2ZyZWUobGxpX2FycmF5X3B0cik7CisJa2ZyZWUoc2VwLT5kbWFfcmVzX2FycltzZXAtPm5yX2RjYl9jcmVhdF0uaW5fcGFnZV9hcnJheSk7CisKK2VuZF9mdW5jdGlvbjoKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgInNlcF9wcmVwYXJlX2lucHV0X2RtYV90YWJsZSBlbmRcbiIpOworCXJldHVybiBlcnJvcjsKKworfQorLyoqCisgKglzZXBfY29uc3RydWN0X2RtYV90YWJsZXNfZnJvbV9sbGkgLSBwcmVwYXJlIEFFUy9ERVMgbWFwcGluZ3MKKyAqCUBzZXA6IHBvaW50ZXIgdG8gc3RydWN0IHNlcF9kZXZpY2UKKyAqCUBsbGlfaW5fYXJyYXk6CisgKglAc2VwX2luX2xsaV9lbnRyaWVzOgorICoJQGxsaV9vdXRfYXJyYXk6CisgKglAc2VwX291dF9sbGlfZW50cmllcworICoJQGJsb2NrX3NpemUKKyAqCUBsbGlfdGFibGVfaW5fcHRyCisgKglAbGxpX3RhYmxlX291dF9wdHIKKyAqCUBpbl9udW1fZW50cmllc19wdHIKKyAqCUBvdXRfbnVtX2VudHJpZXNfcHRyCisgKglAdGFibGVfZGF0YV9zaXplX3B0cgorICoKKyAqCVRoaXMgZnVuY3Rpb24gY3JlYXRlcyB0aGUgaW5wdXQgYW5kIG91dHB1dCBETUEgdGFibGVzIGZvcgorICoJc3ltbWV0cmljIG9wZXJhdGlvbnMgKEFFUy9ERVMpIGFjY29yZGluZyB0byB0aGUgYmxvY2sKKyAqCXNpemUgZnJvbSBMTEkgYXJheXMKKyAqCU5vdGUgdGhhdCBhbGwgYnVzIGFkZHJlc3NlcyB0aGF0IGFyZSBwYXNzZWQgdG8gdGhlIFNFUAorICoJYXJlIGluIDMyIGJpdCBmb3JtYXQ7IHRoZSBTRVAgaXMgYSAzMiBiaXQgZGV2aWNlCisgKi8KK3N0YXRpYyBpbnQgc2VwX2NvbnN0cnVjdF9kbWFfdGFibGVzX2Zyb21fbGxpKAorCXN0cnVjdCBzZXBfZGV2aWNlICpzZXAsCisJc3RydWN0IHNlcF9sbGlfZW50cnkgKmxsaV9pbl9hcnJheSwKKwl1MzIJc2VwX2luX2xsaV9lbnRyaWVzLAorCXN0cnVjdCBzZXBfbGxpX2VudHJ5ICpsbGlfb3V0X2FycmF5LAorCXUzMglzZXBfb3V0X2xsaV9lbnRyaWVzLAorCXUzMglibG9ja19zaXplLAorCWRtYV9hZGRyX3QgKmxsaV90YWJsZV9pbl9wdHIsCisJZG1hX2FkZHJfdCAqbGxpX3RhYmxlX291dF9wdHIsCisJdTMyCSppbl9udW1fZW50cmllc19wdHIsCisJdTMyCSpvdXRfbnVtX2VudHJpZXNfcHRyLAorCXUzMgkqdGFibGVfZGF0YV9zaXplX3B0cikKK3sKKwkvKiBQb2ludHMgdG8gdGhlIGFyZWEgd2hlcmUgbmV4dCBsbGkgdGFibGUgY2FuIGJlIGFsbG9jYXRlZCAqLworCXZvaWQgKmxsaV90YWJsZV9hbGxvY19hZGRyID0gMDsKKwkvKiBJbnB1dCBsbGkgdGFibGUgKi8KKwlzdHJ1Y3Qgc2VwX2xsaV9lbnRyeSAqaW5fbGxpX3RhYmxlX3B0ciA9IE5VTEw7CisJLyogT3V0cHV0IGxsaSB0YWJsZSAqLworCXN0cnVjdCBzZXBfbGxpX2VudHJ5ICpvdXRfbGxpX3RhYmxlX3B0ciA9IE5VTEw7CisJLyogUG9pbnRlciB0byB0aGUgaW5mbyBlbnRyeSBvZiB0aGUgdGFibGUgLSB0aGUgbGFzdCBlbnRyeSAqLworCXN0cnVjdCBzZXBfbGxpX2VudHJ5ICppbmZvX2luX2VudHJ5X3B0ciA9IE5VTEw7CisJLyogUG9pbnRlciB0byB0aGUgaW5mbyBlbnRyeSBvZiB0aGUgdGFibGUgLSB0aGUgbGFzdCBlbnRyeSAqLworCXN0cnVjdCBzZXBfbGxpX2VudHJ5ICppbmZvX291dF9lbnRyeV9wdHIgPSBOVUxMOworCS8qIFBvaW50cyB0byB0aGUgZmlyc3QgZW50cnkgdG8gYmUgcHJvY2Vzc2VkIGluIHRoZSBsbGlfaW5fYXJyYXkgKi8KKwl1MzIgY3VycmVudF9pbl9lbnRyeSA9IDA7CisJLyogUG9pbnRzIHRvIHRoZSBmaXJzdCBlbnRyeSB0byBiZSBwcm9jZXNzZWQgaW4gdGhlIGxsaV9vdXRfYXJyYXkgKi8KKwl1MzIgY3VycmVudF9vdXRfZW50cnkgPSAwOworCS8qIE1heCBzaXplIG9mIHRoZSBpbnB1dCB0YWJsZSAqLworCXUzMiBpbl90YWJsZV9kYXRhX3NpemUgPSAwOworCS8qIE1heCBzaXplIG9mIHRoZSBvdXRwdXQgdGFibGUgKi8KKwl1MzIgb3V0X3RhYmxlX2RhdGFfc2l6ZSA9IDA7CisJLyogRmxhZyB0ZSBzaWduaWZpZXMgaWYgdGhpcyBpcyB0aGUgbGFzdCB0YWJsZXMgYnVpbGQgKi8KKwl1MzIgbGFzdF90YWJsZV9mbGFnID0gMDsKKwkvKiBUaGUgZGF0YSBzaXplIHRoYXQgc2hvdWxkIGJlIGluIHRhYmxlICovCisJdTMyIHRhYmxlX2RhdGFfc2l6ZSA9IDA7CisJLyogTnVtYmVyIG9mIGV0bnJpZXMgaW4gdGhlIGlucHV0IHRhYmxlICovCisJdTMyIG51bV9lbnRyaWVzX2luX3RhYmxlID0gMDsKKwkvKiBOdW1iZXIgb2YgZXRucmllcyBpbiB0aGUgb3V0cHV0IHRhYmxlICovCisJdTMyIG51bV9lbnRyaWVzX291dF90YWJsZSA9IDA7CisKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgInNlcF9jb25zdHJ1Y3RfZG1hX3RhYmxlc19mcm9tX2xsaSBzdGFydFxuIik7CisKKwkvKiBJbml0aWF0ZSB0byBwb2ludCBhZnRlciB0aGUgbWVzc2FnZSBhcmVhICovCisJbGxpX3RhYmxlX2FsbG9jX2FkZHIgPSAodm9pZCAqKShzZXAtPnNoYXJlZF9hZGRyICsKKwkJU1lOQ0hST05JQ19ETUFfVEFCTEVTX0FSRUFfT0ZGU0VUX0JZVEVTICsKKwkJKHNlcC0+bnVtX2xsaV90YWJsZXNfY3JlYXRlZCAqCisJCShzaXplb2Yoc3RydWN0IHNlcF9sbGlfZW50cnkpICoKKwkJU0VQX0RSSVZFUl9FTlRSSUVTX1BFUl9UQUJMRV9JTl9TRVApKSk7CisKKwkvKiBMb29wIHRpbGwgYWxsIHRoZSBlbnRyaWVzIGluIGluIGFycmF5IGFyZSBub3QgcHJvY2Vzc2VkICovCisJd2hpbGUgKGN1cnJlbnRfaW5fZW50cnkgPCBzZXBfaW5fbGxpX2VudHJpZXMpIHsKKwkJLyogU2V0IHRoZSBuZXcgaW5wdXQgYW5kIG91dHB1dCB0YWJsZXMgKi8KKwkJaW5fbGxpX3RhYmxlX3B0ciA9CisJCQkoc3RydWN0IHNlcF9sbGlfZW50cnkgKilsbGlfdGFibGVfYWxsb2NfYWRkcjsKKworCQlsbGlfdGFibGVfYWxsb2NfYWRkciArPSBzaXplb2Yoc3RydWN0IHNlcF9sbGlfZW50cnkpICoKKwkJCVNFUF9EUklWRVJfRU5UUklFU19QRVJfVEFCTEVfSU5fU0VQOworCisJCS8qIFNldCB0aGUgZmlyc3Qgb3V0cHV0IHRhYmxlcyAqLworCQlvdXRfbGxpX3RhYmxlX3B0ciA9CisJCQkoc3RydWN0IHNlcF9sbGlfZW50cnkgKilsbGlfdGFibGVfYWxsb2NfYWRkcjsKKworCQkvKiBDaGVjayBpZiB0aGUgRE1BIHRhYmxlIGFyZWEgbGltaXQgd2FzIG92ZXJydW4gKi8KKwkJaWYgKChsbGlfdGFibGVfYWxsb2NfYWRkciArIHNpemVvZihzdHJ1Y3Qgc2VwX2xsaV9lbnRyeSkgKgorCQkJU0VQX0RSSVZFUl9FTlRSSUVTX1BFUl9UQUJMRV9JTl9TRVApID4KKwkJCSgodm9pZCAqKXNlcC0+c2hhcmVkX2FkZHIgKworCQkJU1lOQ0hST05JQ19ETUFfVEFCTEVTX0FSRUFfT0ZGU0VUX0JZVEVTICsKKwkJCVNZTkNIUk9OSUNfRE1BX1RBQkxFU19BUkVBX1NJWkVfQllURVMpKSB7CisKKwkJCWRldl93YXJuKCZzZXAtPnBkZXYtPmRldiwgImRtYSB0YWJsZSBsaW1pdCBvdmVycnVuXG4iKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisKKwkJLyogVXBkYXRlIHRoZSBudW1iZXIgb2YgdGhlIGxsaSB0YWJsZXMgY3JlYXRlZCAqLworCQlzZXAtPm51bV9sbGlfdGFibGVzX2NyZWF0ZWQgKz0gMjsKKworCQlsbGlfdGFibGVfYWxsb2NfYWRkciArPSBzaXplb2Yoc3RydWN0IHNlcF9sbGlfZW50cnkpICoKKwkJCVNFUF9EUklWRVJfRU5UUklFU19QRVJfVEFCTEVfSU5fU0VQOworCisJCS8qIENhbGN1bGF0ZSB0aGUgbWF4aW11bSBzaXplIG9mIGRhdGEgZm9yIGlucHV0IHRhYmxlICovCisJCWluX3RhYmxlX2RhdGFfc2l6ZSA9CisJCQlzZXBfY2FsY3VsYXRlX2xsaV90YWJsZV9tYXhfc2l6ZShzZXAsCisJCQkmbGxpX2luX2FycmF5W2N1cnJlbnRfaW5fZW50cnldLAorCQkJKHNlcF9pbl9sbGlfZW50cmllcyAtIGN1cnJlbnRfaW5fZW50cnkpLAorCQkJJmxhc3RfdGFibGVfZmxhZyk7CisKKwkJLyogQ2FsY3VsYXRlIHRoZSBtYXhpbXVtIHNpemUgb2YgZGF0YSBmb3Igb3V0cHV0IHRhYmxlICovCisJCW91dF90YWJsZV9kYXRhX3NpemUgPQorCQkJc2VwX2NhbGN1bGF0ZV9sbGlfdGFibGVfbWF4X3NpemUoc2VwLAorCQkJJmxsaV9vdXRfYXJyYXlbY3VycmVudF9vdXRfZW50cnldLAorCQkJKHNlcF9vdXRfbGxpX2VudHJpZXMgLSBjdXJyZW50X291dF9lbnRyeSksCisJCQkmbGFzdF90YWJsZV9mbGFnKTsKKworCQlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwKKwkJCSJpbl90YWJsZV9kYXRhX3NpemUgaXMgJXhcbiIsCisJCQlpbl90YWJsZV9kYXRhX3NpemUpOworCisJCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LAorCQkJIm91dF90YWJsZV9kYXRhX3NpemUgaXMgJXhcbiIsCisJCQlvdXRfdGFibGVfZGF0YV9zaXplKTsKKworCQl0YWJsZV9kYXRhX3NpemUgPSBpbl90YWJsZV9kYXRhX3NpemU7CisKKwkJaWYgKCFsYXN0X3RhYmxlX2ZsYWcpIHsKKwkJCS8qCisJCQkgKiBJZiB0aGlzIGlzIG5vdCB0aGUgbGFzdCB0YWJsZSwKKwkJCSAqIHRoZW4gbXVzdCBjaGVjayB3aGVyZSB0aGUgZGF0YSBpcyBzbWFsbGVzdAorCQkJICogYW5kIHRoZW4gYWxpZ24gaXQgdG8gdGhlIGJsb2NrIHNpemUKKwkJCSAqLworCQkJaWYgKHRhYmxlX2RhdGFfc2l6ZSA+IG91dF90YWJsZV9kYXRhX3NpemUpCisJCQkJdGFibGVfZGF0YV9zaXplID0gb3V0X3RhYmxlX2RhdGFfc2l6ZTsKKworCQkJLyoKKwkJCSAqIE5vdyBjYWxjdWxhdGUgdGhlIHRhYmxlIHNpemUgc28gdGhhdAorCQkJICogaXQgd2lsbCBiZSBtb2R1bGUgYmxvY2sgc2l6ZQorCQkJICovCisJCQl0YWJsZV9kYXRhX3NpemUgPSAodGFibGVfZGF0YV9zaXplIC8gYmxvY2tfc2l6ZSkgKgorCQkJCWJsb2NrX3NpemU7CisJCX0KKworCQlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgInRhYmxlX2RhdGFfc2l6ZSBpcyAleFxuIiwKKwkJCQkJCQl0YWJsZV9kYXRhX3NpemUpOworCisJCS8qIENvbnN0cnVjdCBpbnB1dCBsbGkgdGFibGUgKi8KKwkJc2VwX2J1aWxkX2xsaV90YWJsZShzZXAsICZsbGlfaW5fYXJyYXlbY3VycmVudF9pbl9lbnRyeV0sCisJCQlpbl9sbGlfdGFibGVfcHRyLAorCQkJJmN1cnJlbnRfaW5fZW50cnksCisJCQkmbnVtX2VudHJpZXNfaW5fdGFibGUsCisJCQl0YWJsZV9kYXRhX3NpemUpOworCisJCS8qIENvbnN0cnVjdCBvdXRwdXQgbGxpIHRhYmxlICovCisJCXNlcF9idWlsZF9sbGlfdGFibGUoc2VwLCAmbGxpX291dF9hcnJheVtjdXJyZW50X291dF9lbnRyeV0sCisJCQlvdXRfbGxpX3RhYmxlX3B0ciwKKwkJCSZjdXJyZW50X291dF9lbnRyeSwKKwkJCSZudW1fZW50cmllc19vdXRfdGFibGUsCisJCQl0YWJsZV9kYXRhX3NpemUpOworCisJCS8qIElmIGluZm8gZW50cnkgaXMgbnVsbCAtIHRoaXMgaXMgdGhlIGZpcnN0IHRhYmxlIGJ1aWx0ICovCisJCWlmIChpbmZvX2luX2VudHJ5X3B0ciA9PSBOVUxMKSB7CisJCQkvKiBTZXQgdGhlIG91dHB1dCBwYXJhbWV0ZXJzIHRvIHBoeXNpY2FsIGFkZHJlc3NlcyAqLworCQkJKmxsaV90YWJsZV9pbl9wdHIgPQorCQkJc2VwX3NoYXJlZF9hcmVhX3ZpcnRfdG9fYnVzKHNlcCwgaW5fbGxpX3RhYmxlX3B0cik7CisKKwkJCSppbl9udW1fZW50cmllc19wdHIgPSBudW1fZW50cmllc19pbl90YWJsZTsKKworCQkJKmxsaV90YWJsZV9vdXRfcHRyID0KKwkJCQlzZXBfc2hhcmVkX2FyZWFfdmlydF90b19idXMoc2VwLAorCQkJCW91dF9sbGlfdGFibGVfcHRyKTsKKworCQkJKm91dF9udW1fZW50cmllc19wdHIgPSBudW1fZW50cmllc19vdXRfdGFibGU7CisJCQkqdGFibGVfZGF0YV9zaXplX3B0ciA9IHRhYmxlX2RhdGFfc2l6ZTsKKworCQkJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsCisJCQkib3V0cHV0IGxsaV90YWJsZV9pbl9wdHIgaXMgJTA4bHhcbiIsCisJCQkJKHVuc2lnbmVkIGxvbmcpKmxsaV90YWJsZV9pbl9wdHIpOworCQkJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsCisJCQkib3V0cHV0IGxsaV90YWJsZV9vdXRfcHRyIGlzICUwOGx4XG4iLAorCQkJCSh1bnNpZ25lZCBsb25nKSpsbGlfdGFibGVfb3V0X3B0cik7CisJCX0gZWxzZSB7CisJCQkvKiBVcGRhdGUgdGhlIGluZm8gZW50cnkgb2YgdGhlIHByZXZpb3VzIGluIHRhYmxlICovCisJCQlpbmZvX2luX2VudHJ5X3B0ci0+YnVzX2FkZHJlc3MgPQorCQkJCXNlcF9zaGFyZWRfYXJlYV92aXJ0X3RvX2J1cyhzZXAsCisJCQkJaW5fbGxpX3RhYmxlX3B0cik7CisKKwkJCWluZm9faW5fZW50cnlfcHRyLT5ibG9ja19zaXplID0KKwkJCQkoKG51bV9lbnRyaWVzX2luX3RhYmxlKSA8PCAyNCkgfAorCQkJCSh0YWJsZV9kYXRhX3NpemUpOworCisJCQkvKiBVcGRhdGUgdGhlIGluZm8gZW50cnkgb2YgdGhlIHByZXZpb3VzIGluIHRhYmxlICovCisJCQlpbmZvX291dF9lbnRyeV9wdHItPmJ1c19hZGRyZXNzID0KKwkJCQlzZXBfc2hhcmVkX2FyZWFfdmlydF90b19idXMoc2VwLAorCQkJCW91dF9sbGlfdGFibGVfcHRyKTsKKworCQkJaW5mb19vdXRfZW50cnlfcHRyLT5ibG9ja19zaXplID0KKwkJCQkoKG51bV9lbnRyaWVzX291dF90YWJsZSkgPDwgMjQpIHwKKwkJCQkodGFibGVfZGF0YV9zaXplKTsKKworCQkJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsCisJCQkJIm91dHB1dCBsbGlfdGFibGVfaW5fcHRyOiUwOGx4ICUwOHhcbiIsCisJCQkJKHVuc2lnbmVkIGxvbmcpaW5mb19pbl9lbnRyeV9wdHItPmJ1c19hZGRyZXNzLAorCQkJCWluZm9faW5fZW50cnlfcHRyLT5ibG9ja19zaXplKTsKKworCQkJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsCisJCQkJIm91dHB1dCBsbGlfdGFibGVfb3V0X3B0cjolMDhseCAgJTA4eFxuIiwKKwkJCQkodW5zaWduZWQgbG9uZylpbmZvX291dF9lbnRyeV9wdHItPmJ1c19hZGRyZXNzLAorCQkJCWluZm9fb3V0X2VudHJ5X3B0ci0+YmxvY2tfc2l6ZSk7CisJCX0KKworCQkvKiBTYXZlIHRoZSBwb2ludGVyIHRvIHRoZSBpbmZvIGVudHJ5IG9mIHRoZSBjdXJyZW50IHRhYmxlcyAqLworCQlpbmZvX2luX2VudHJ5X3B0ciA9IGluX2xsaV90YWJsZV9wdHIgKworCQkJbnVtX2VudHJpZXNfaW5fdGFibGUgLSAxOworCQlpbmZvX291dF9lbnRyeV9wdHIgPSBvdXRfbGxpX3RhYmxlX3B0ciArCisJCQludW1fZW50cmllc19vdXRfdGFibGUgLSAxOworCisJCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LAorCQkJIm91dHB1dCBudW1fZW50cmllc19vdXRfdGFibGUgaXMgJXhcbiIsCisJCQkodTMyKW51bV9lbnRyaWVzX291dF90YWJsZSk7CisJCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LAorCQkJIm91dHB1dCBpbmZvX2luX2VudHJ5X3B0ciBpcyAlbHhcbiIsCisJCQkodW5zaWduZWQgbG9uZylpbmZvX2luX2VudHJ5X3B0cik7CisJCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LAorCQkJIm91dHB1dCBpbmZvX291dF9lbnRyeV9wdHIgaXMgJWx4XG4iLAorCQkJKHVuc2lnbmVkIGxvbmcpaW5mb19vdXRfZW50cnlfcHRyKTsKKwl9CisKKwkvKiBQcmludCBpbnB1dCB0YWJsZXMgKi8KKwlzZXBfZGVidWdfcHJpbnRfbGxpX3RhYmxlcyhzZXAsCisJKHN0cnVjdCBzZXBfbGxpX2VudHJ5ICopCisJc2VwX3NoYXJlZF9hcmVhX2J1c190b192aXJ0KHNlcCwgKmxsaV90YWJsZV9pbl9wdHIpLAorCSppbl9udW1fZW50cmllc19wdHIsCisJKnRhYmxlX2RhdGFfc2l6ZV9wdHIpOworCisJLyogUHJpbnQgb3V0cHV0IHRhYmxlcyAqLworCXNlcF9kZWJ1Z19wcmludF9sbGlfdGFibGVzKHNlcCwKKwkoc3RydWN0IHNlcF9sbGlfZW50cnkgKikKKwlzZXBfc2hhcmVkX2FyZWFfYnVzX3RvX3ZpcnQoc2VwLCAqbGxpX3RhYmxlX291dF9wdHIpLAorCSpvdXRfbnVtX2VudHJpZXNfcHRyLAorCSp0YWJsZV9kYXRhX3NpemVfcHRyKTsKKworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAic2VwX2NvbnN0cnVjdF9kbWFfdGFibGVzX2Zyb21fbGxpIGVuZFxuIik7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICoJc2VwX3ByZXBhcmVfaW5wdXRfb3V0cHV0X2RtYV90YWJsZSAtIHByZXBhcmUgRE1BIEkvTyB0YWJsZQorICoJQGFwcF92aXJ0X2luX2FkZHI6CisgKglAYXBwX3ZpcnRfb3V0X2FkZHI6CisgKglAZGF0YV9zaXplOgorICoJQGJsb2NrX3NpemU6CisgKglAbGxpX3RhYmxlX2luX3B0cjoKKyAqCUBsbGlfdGFibGVfb3V0X3B0cjoKKyAqCUBpbl9udW1fZW50cmllc19wdHI6CisgKglAb3V0X251bV9lbnRyaWVzX3B0cjoKKyAqCUB0YWJsZV9kYXRhX3NpemVfcHRyOgorICoJQGlzX2t2YTogc2V0IGZvciBrZXJuZWwgZGF0YTsgdXNlZCBvbmx5IGZvciBrZXJuZWwgY3J5cHRvIG1vZHVsZQorICoKKyAqCVRoaXMgZnVuY3Rpb24gYnVpbGRzIGlucHV0IGFuZCBvdXRwdXQgRE1BIHRhYmxlcyBmb3Igc3luaHJvbmljCisgKglzeW1tZXRyaWMgb3BlcmF0aW9ucyAoQUVTLCBERVMsIEhBU0gpLiBJdCBhbHNvIGNoZWNrcyB0aGF0IGVhY2ggdGFibGUKKyAqCWlzIG9mIHRoZSBtb2R1bGFyIGJsb2NrIHNpemUKKyAqCU5vdGUgdGhhdCBhbGwgYnVzIGFkZHJlc3NlcyB0aGF0IGFyZSBwYXNzZWQgdG8gdGhlIFNFUAorICoJYXJlIGluIDMyIGJpdCBmb3JtYXQ7IHRoZSBTRVAgaXMgYSAzMiBiaXQgZGV2aWNlCisgKi8KK3N0YXRpYyBpbnQgc2VwX3ByZXBhcmVfaW5wdXRfb3V0cHV0X2RtYV90YWJsZShzdHJ1Y3Qgc2VwX2RldmljZSAqc2VwLAorCXVuc2lnbmVkIGxvbmcgYXBwX3ZpcnRfaW5fYWRkciwKKwl1bnNpZ25lZCBsb25nIGFwcF92aXJ0X291dF9hZGRyLAorCXUzMiBkYXRhX3NpemUsCisJdTMyIGJsb2NrX3NpemUsCisJZG1hX2FkZHJfdCAqbGxpX3RhYmxlX2luX3B0ciwKKwlkbWFfYWRkcl90ICpsbGlfdGFibGVfb3V0X3B0ciwKKwl1MzIgKmluX251bV9lbnRyaWVzX3B0ciwKKwl1MzIgKm91dF9udW1fZW50cmllc19wdHIsCisJdTMyICp0YWJsZV9kYXRhX3NpemVfcHRyLAorCWJvb2wgaXNfa3ZhKQorCit7CisJaW50IGVycm9yID0gMDsKKwkvKiBBcnJheSBvZiBwb2ludGVycyBvZiBwYWdlICovCisJc3RydWN0IHNlcF9sbGlfZW50cnkgKmxsaV9pbl9hcnJheTsKKwkvKiBBcnJheSBvZiBwb2ludGVycyBvZiBwYWdlICovCisJc3RydWN0IHNlcF9sbGlfZW50cnkgKmxsaV9vdXRfYXJyYXk7CisKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgInNlcF9wcmVwYXJlX2lucHV0X291dHB1dF9kbWFfdGFibGUgc3RhcnRcbiIpOworCisJaWYgKGRhdGFfc2l6ZSA9PSAwKSB7CisJCS8qIFByZXBhcmUgZW1wdHkgdGFibGUgZm9yIGlucHV0IGFuZCBvdXRwdXQgKi8KKwkJc2VwX3ByZXBhcmVfZW1wdHlfbGxpX3RhYmxlKHNlcCwgbGxpX3RhYmxlX2luX3B0ciwKKwkJCWluX251bV9lbnRyaWVzX3B0ciwgdGFibGVfZGF0YV9zaXplX3B0cik7CisKKwkJc2VwX3ByZXBhcmVfZW1wdHlfbGxpX3RhYmxlKHNlcCwgbGxpX3RhYmxlX291dF9wdHIsCisJCQlvdXRfbnVtX2VudHJpZXNfcHRyLCB0YWJsZV9kYXRhX3NpemVfcHRyKTsKKworCQlnb3RvIHVwZGF0ZV9kY2JfY291bnRlcjsKKwl9CisKKwkvKiBJbml0aWFsaXplIHRoZSBwYWdlcyBwb2ludGVycyAqLworCXNlcC0+ZG1hX3Jlc19hcnJbc2VwLT5ucl9kY2JfY3JlYXRdLmluX3BhZ2VfYXJyYXkgPSBOVUxMOworCXNlcC0+ZG1hX3Jlc19hcnJbc2VwLT5ucl9kY2JfY3JlYXRdLm91dF9wYWdlX2FycmF5ID0gTlVMTDsKKworCS8qIExvY2sgdGhlIHBhZ2VzIG9mIHRoZSBidWZmZXIgYW5kIHRyYW5zbGF0ZSB0aGVtIHRvIHBhZ2VzICovCisJaWYgKGlzX2t2YSA9PSB0cnVlKSB7CisJCWVycm9yID0gc2VwX2xvY2tfa2VybmVsX3BhZ2VzKHNlcCwgYXBwX3ZpcnRfaW5fYWRkciwKKwkJCWRhdGFfc2l6ZSwgJmxsaV9pbl9hcnJheSwgU0VQX0RSSVZFUl9JTl9GTEFHKTsKKworCQlpZiAoZXJyb3IpIHsKKwkJCWRldl93YXJuKCZzZXAtPnBkZXYtPmRldiwKKwkJCQkibG9jayBrZXJuZWwgZm9yIGluIGZhaWxlZFxuIik7CisJCQlnb3RvIGVuZF9mdW5jdGlvbjsKKwkJfQorCisJCWVycm9yID0gc2VwX2xvY2tfa2VybmVsX3BhZ2VzKHNlcCwgYXBwX3ZpcnRfb3V0X2FkZHIsCisJCQlkYXRhX3NpemUsICZsbGlfb3V0X2FycmF5LCBTRVBfRFJJVkVSX09VVF9GTEFHKTsKKworCQlpZiAoZXJyb3IpIHsKKwkJCWRldl93YXJuKCZzZXAtPnBkZXYtPmRldiwKKwkJCQkibG9jayBrZXJuZWwgZm9yIG91dCBmYWlsZWRcbiIpOworCQkJZ290byBlbmRfZnVuY3Rpb247CisJCX0KKwl9CisKKwllbHNlIHsKKwkJZXJyb3IgPSBzZXBfbG9ja191c2VyX3BhZ2VzKHNlcCwgYXBwX3ZpcnRfaW5fYWRkciwKKwkJCQlkYXRhX3NpemUsICZsbGlfaW5fYXJyYXksIFNFUF9EUklWRVJfSU5fRkxBRyk7CisJCWlmIChlcnJvcikgeworCQkJZGV2X3dhcm4oJnNlcC0+cGRldi0+ZGV2LAorCQkJCSJzZXBfbG9ja191c2VyX3BhZ2VzIGZvciBpbnB1dCB2aXJ0dWFsIGJ1ZmZlciBmYWlsZWRcbiIpOworCQkJZ290byBlbmRfZnVuY3Rpb247CisJCX0KKworCQllcnJvciA9IHNlcF9sb2NrX3VzZXJfcGFnZXMoc2VwLCBhcHBfdmlydF9vdXRfYWRkciwKKwkJCWRhdGFfc2l6ZSwgJmxsaV9vdXRfYXJyYXksIFNFUF9EUklWRVJfT1VUX0ZMQUcpOworCisJCWlmIChlcnJvcikgeworCQkJZGV2X3dhcm4oJnNlcC0+cGRldi0+ZGV2LAorCQkJCSJzZXBfbG9ja191c2VyX3BhZ2VzIGZvciBvdXRwdXQgdmlydHVhbCBidWZmZXIgZmFpbGVkXG4iKTsKKwkJCWdvdG8gZW5kX2Z1bmN0aW9uX2ZyZWVfbGxpX2luOworCQl9CisJfQorCisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJzZXBfaW5fbnVtX3BhZ2VzIGlzICV4XG4iLAorCQlzZXAtPmRtYV9yZXNfYXJyW3NlcC0+bnJfZGNiX2NyZWF0XS5pbl9udW1fcGFnZXMpOworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAic2VwX291dF9udW1fcGFnZXMgaXMgJXhcbiIsCisJCXNlcC0+ZG1hX3Jlc19hcnJbc2VwLT5ucl9kY2JfY3JlYXRdLm91dF9udW1fcGFnZXMpOworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAiU0VQX0RSSVZFUl9FTlRSSUVTX1BFUl9UQUJMRV9JTl9TRVAgaXMgJXhcbiIsCisJCVNFUF9EUklWRVJfRU5UUklFU19QRVJfVEFCTEVfSU5fU0VQKTsKKworCS8qIENhbGwgdGhlIGZ1Y250aW9uIHRoYXQgY3JlYXRlcyB0YWJsZSBmcm9tIHRoZSBsbGkgYXJyYXlzICovCisJZXJyb3IgPSBzZXBfY29uc3RydWN0X2RtYV90YWJsZXNfZnJvbV9sbGkoc2VwLCBsbGlfaW5fYXJyYXksCisJCXNlcC0+ZG1hX3Jlc19hcnJbc2VwLT5ucl9kY2JfY3JlYXRdLmluX251bV9wYWdlcywKKwkJbGxpX291dF9hcnJheSwKKwkJc2VwLT5kbWFfcmVzX2FycltzZXAtPm5yX2RjYl9jcmVhdF0ub3V0X251bV9wYWdlcywKKwkJYmxvY2tfc2l6ZSwgbGxpX3RhYmxlX2luX3B0ciwgbGxpX3RhYmxlX291dF9wdHIsCisJCWluX251bV9lbnRyaWVzX3B0ciwgb3V0X251bV9lbnRyaWVzX3B0ciwgdGFibGVfZGF0YV9zaXplX3B0cik7CisKKwlpZiAoZXJyb3IpIHsKKwkJZGV2X3dhcm4oJnNlcC0+cGRldi0+ZGV2LAorCQkJInNlcF9jb25zdHJ1Y3RfZG1hX3RhYmxlc19mcm9tX2xsaSBmYWlsZWRcbiIpOworCQlnb3RvIGVuZF9mdW5jdGlvbl93aXRoX2Vycm9yOworCX0KKworCWtmcmVlKGxsaV9vdXRfYXJyYXkpOworCWtmcmVlKGxsaV9pbl9hcnJheSk7CisKK3VwZGF0ZV9kY2JfY291bnRlcjoKKwkvKiBVcGRhdGUgRENCIGNvdW50ZXIgKi8KKwlzZXAtPm5yX2RjYl9jcmVhdCsrOworCS8qIEZhbGwgdGhyb3VnaCAtIGZyZWUgdGhlIGxsaSBlbnRyeSBhcnJheXMgKi8KKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgImluX251bV9lbnRyaWVzX3B0ciBpcyAlMDh4XG4iLAorCQkJCQkJKmluX251bV9lbnRyaWVzX3B0cik7CisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJvdXRfbnVtX2VudHJpZXNfcHRyIGlzICUwOHhcbiIsCisJCQkJCQkqb3V0X251bV9lbnRyaWVzX3B0cik7CisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJ0YWJsZV9kYXRhX3NpemVfcHRyIGlzICUwOHhcbiIsCisJCQkJCQkqdGFibGVfZGF0YV9zaXplX3B0cik7CisKKwlnb3RvIGVuZF9mdW5jdGlvbjsKKworZW5kX2Z1bmN0aW9uX3dpdGhfZXJyb3I6CisJa2ZyZWUoc2VwLT5kbWFfcmVzX2FycltzZXAtPm5yX2RjYl9jcmVhdF0ub3V0X21hcF9hcnJheSk7CisJa2ZyZWUoc2VwLT5kbWFfcmVzX2FycltzZXAtPm5yX2RjYl9jcmVhdF0ub3V0X3BhZ2VfYXJyYXkpOworCWtmcmVlKGxsaV9vdXRfYXJyYXkpOworCisKK2VuZF9mdW5jdGlvbl9mcmVlX2xsaV9pbjoKKwlrZnJlZShzZXAtPmRtYV9yZXNfYXJyW3NlcC0+bnJfZGNiX2NyZWF0XS5pbl9tYXBfYXJyYXkpOworCWtmcmVlKHNlcC0+ZG1hX3Jlc19hcnJbc2VwLT5ucl9kY2JfY3JlYXRdLmluX3BhZ2VfYXJyYXkpOworCWtmcmVlKGxsaV9pbl9hcnJheSk7CisKK2VuZF9mdW5jdGlvbjoKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwKKwkJInNlcF9wcmVwYXJlX2lucHV0X291dHB1dF9kbWFfdGFibGUgZW5kIHJlc3VsdCA9ICVkXG4iLCBlcnJvcik7CisKKwlyZXR1cm4gZXJyb3I7CisKK30KKworLyoqCisgKglzZXBfcHJlcGFyZV9pbnB1dF9vdXRwdXRfZG1hX3RhYmxlX2luX2RjYiAtIHByZXBhcmUgY29udHJvbCBibG9ja3MKKyAqCUBhcHBfaW5fYWRkcmVzczogdW5zaWduZWQgbG9uZzsgZm9yIGRhdGEgYnVmZmVyIGluICh1c2VyIHNwYWNlKQorICoJQGFwcF9vdXRfYWRkcmVzczogdW5zaWduZWQgbG9uZzsgZm9yIGRhdGEgYnVmZmVyIG91dCAodXNlciBzcGFjZSkKKyAqCUBkYXRhX2luX3NpemU6IHUzMjsgZm9yIHNpemUgb2YgZGF0YQorICoJQGJsb2NrX3NpemU6IHUzMjsgZm9yIGJsb2NrIHNpemUKKyAqCUB0YWlsX2Jsb2NrX3NpemU6IHUzMjsgZm9yIHNpemUgb2YgdGFpbCBibG9jaworICoJQGlzYXBwbGV0OiBib29sOyB0byBpbmRpY2F0ZSBleHRlcm5hbCBhcHAKKyAqCUBpc19rdmE6IGJvb2w7IGtlcm5lbCBidWZmZXI7IG9ubHkgdXNlZCBmb3Iga2VybmVsIGNyeXB0byBtb2R1bGUKKyAqCisgKglUaGlzIGZ1bmN0aW9uIHByZXBhcmVzIHRoZSBsaW5rZWQgRE1BIHRhYmxlcyBhbmQgcHV0cyB0aGUKKyAqCWFkZHJlc3MgZm9yIHRoZSBsaW5rZWQgbGlzdCBvZiB0YWJsZXMgaW50YSBhIERDQiAoZGF0YSBjb250cm9sCisgKglibG9jaykgdGhlIGFkZHJlc3Mgb2Ygd2hpY2ggaXMga25vd24gYnkgdGhlIFNFUCBoYXJkd2FyZQorICoJTm90ZSB0aGF0IGFsbCBidXMgYWRkcmVzc2VzIHRoYXQgYXJlIHBhc3NlZCB0byB0aGUgU0VQCisgKglhcmUgaW4gMzIgYml0IGZvcm1hdDsgdGhlIFNFUCBpcyBhIDMyIGJpdCBkZXZpY2UKKyAqLworc3RhdGljIGludCBzZXBfcHJlcGFyZV9pbnB1dF9vdXRwdXRfZG1hX3RhYmxlX2luX2RjYihzdHJ1Y3Qgc2VwX2RldmljZSAqc2VwLAorCXVuc2lnbmVkIGxvbmcgIGFwcF9pbl9hZGRyZXNzLAorCXVuc2lnbmVkIGxvbmcgIGFwcF9vdXRfYWRkcmVzcywKKwl1MzIgIGRhdGFfaW5fc2l6ZSwKKwl1MzIgIGJsb2NrX3NpemUsCisJdTMyICB0YWlsX2Jsb2NrX3NpemUsCisJYm9vbCBpc2FwcGxldCwKKwlib29sCWlzX2t2YSkKK3sKKwlpbnQgZXJyb3IgPSAwOworCS8qIFNpemUgb2YgdGFpbCAqLworCXUzMiB0YWlsX3NpemUgPSAwOworCS8qIEFkZHJlc3Mgb2YgdGhlIGNyZWF0ZWQgRENCIHRhYmxlICovCisJc3RydWN0IHNlcF9kY2Jsb2NrICpkY2JfdGFibGVfcHRyID0gTlVMTDsKKwkvKiBUaGUgcGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUgZmlyc3QgaW5wdXQgRE1BIHRhYmxlICovCisJZG1hX2FkZHJfdCBpbl9maXJzdF9tbGxpX2FkZHJlc3MgPSAwOworCS8qIE51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBmaXJzdCBpbnB1dCBETUEgdGFibGUgKi8KKwl1MzIgIGluX2ZpcnN0X251bV9lbnRyaWVzID0gMDsKKwkvKiBUaGUgcGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUgZmlyc3Qgb3V0cHV0IERNQSB0YWJsZSAqLworCWRtYV9hZGRyX3QgIG91dF9maXJzdF9tbGxpX2FkZHJlc3MgPSAwOworCS8qIE51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBmaXJzdCBvdXRwdXQgRE1BIHRhYmxlICovCisJdTMyICBvdXRfZmlyc3RfbnVtX2VudHJpZXMgPSAwOworCS8qIERhdGEgaW4gdGhlIGZpcnN0IGlucHV0L291dHB1dCB0YWJsZSAqLworCXUzMiAgZmlyc3RfZGF0YV9zaXplID0gMDsKKworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAicHJlcGFyZV9pbnB1dF9vdXRwdXRfZG1hX3RhYmxlX2luX2RjYiBzdGFydFxuIik7CisKKwlpZiAoc2VwLT5ucl9kY2JfY3JlYXQgPT0gU0VQX01BWF9OVU1fU1lOQ19ETUFfT1BTKSB7CisJCS8qIE5vIG1vcmUgRENCcyB0byBhbGxvY2F0ZSAqLworCQlkZXZfd2Fybigmc2VwLT5wZGV2LT5kZXYsICJubyBtb3JlIERDQnMgYXZhaWxhYmxlXG4iKTsKKwkJZXJyb3IgPSAtRU5PU1BDOworCQlnb3RvIGVuZF9mdW5jdGlvbjsKKwl9CisKKwkvKiBBbGxvY2F0ZSBuZXcgRENCICovCisJZGNiX3RhYmxlX3B0ciA9IChzdHJ1Y3Qgc2VwX2RjYmxvY2sgKikoc2VwLT5zaGFyZWRfYWRkciArCisJCVNFUF9EUklWRVJfU1lTVEVNX0RDQl9NRU1PUllfT0ZGU0VUX0lOX0JZVEVTICsKKwkJKHNlcC0+bnJfZGNiX2NyZWF0ICogc2l6ZW9mKHN0cnVjdCBzZXBfZGNibG9jaykpKTsKKworCS8qIFNldCB0aGUgZGVmYXVsdCB2YWx1ZXMgaW4gdGhlIERDQiAqLworCWRjYl90YWJsZV9wdHItPmlucHV0X21sbGlfYWRkcmVzcyA9IDA7CisJZGNiX3RhYmxlX3B0ci0+aW5wdXRfbWxsaV9udW1fZW50cmllcyA9IDA7CisJZGNiX3RhYmxlX3B0ci0+aW5wdXRfbWxsaV9kYXRhX3NpemUgPSAwOworCWRjYl90YWJsZV9wdHItPm91dHB1dF9tbGxpX2FkZHJlc3MgPSAwOworCWRjYl90YWJsZV9wdHItPm91dHB1dF9tbGxpX251bV9lbnRyaWVzID0gMDsKKwlkY2JfdGFibGVfcHRyLT5vdXRwdXRfbWxsaV9kYXRhX3NpemUgPSAwOworCWRjYl90YWJsZV9wdHItPnRhaWxfZGF0YV9zaXplID0gMDsKKwlkY2JfdGFibGVfcHRyLT5vdXRfdnJfdGFpbF9wdCA9IDA7CisKKwlpZiAoaXNhcHBsZXQgPT0gdHJ1ZSkgeworCQl0YWlsX3NpemUgPSBkYXRhX2luX3NpemUgJSBibG9ja19zaXplOworCQlpZiAodGFpbF9zaXplKSB7CisJCQlpZiAoZGF0YV9pbl9zaXplIDwgdGFpbF9ibG9ja19zaXplKSB7CisJCQkJZGV2X3dhcm4oJnNlcC0+cGRldi0+ZGV2LCAiZGF0YSBpbiBzaXplIHNtYWxsZXIgdGhhbiB0YWlsIGJsb2NrIHNpemVcbiIpOworCQkJCWVycm9yID0gLUVOT1NQQzsKKwkJCQlnb3RvIGVuZF9mdW5jdGlvbjsKKwkJCX0KKwkJCWlmICh0YWlsX2Jsb2NrX3NpemUpCisJCQkJLyoKKwkJCQkgKiBDYXNlIHRoZSB0YWlsIHNpemUgc2hvdWxkIGJlCisJCQkJICogYmlnZ2VyIHRoYW4gdGhlIHJlYWwgYmxvY2sgc2l6ZQorCQkJCSAqLworCQkJCXRhaWxfc2l6ZSA9IHRhaWxfYmxvY2tfc2l6ZSArCisJCQkJCSgoZGF0YV9pbl9zaXplIC0KKwkJCQkJCXRhaWxfYmxvY2tfc2l6ZSkgJSBibG9ja19zaXplKTsKKwkJfQorCisJCS8qIENoZWNrIGlmIHRoZXJlIGlzIGVub3VnaCBkYXRhIGZvciBETUEgb3BlcmF0aW9uICovCisJCWlmIChkYXRhX2luX3NpemUgPCBTRVBfRFJJVkVSX01JTl9EQVRBX1NJWkVfUEVSX1RBQkxFKSB7CisJCQlpZiAoaXNfa3ZhID09IHRydWUpIHsKKwkJCQltZW1jcHkoZGNiX3RhYmxlX3B0ci0+dGFpbF9kYXRhLAorCQkJCQkodm9pZCAqKWFwcF9pbl9hZGRyZXNzLCBkYXRhX2luX3NpemUpOworCQkJfSBlbHNlIHsKKwkJCQlpZiAoY29weV9mcm9tX3VzZXIoZGNiX3RhYmxlX3B0ci0+dGFpbF9kYXRhLAorCQkJCQkodm9pZCBfX3VzZXIgKilhcHBfaW5fYWRkcmVzcywKKwkJCQkJZGF0YV9pbl9zaXplKSkgeworCQkJCQllcnJvciA9IC1FRkFVTFQ7CisJCQkJCWdvdG8gZW5kX2Z1bmN0aW9uOworCQkJCX0KKwkJCX0KKworCQkJZGNiX3RhYmxlX3B0ci0+dGFpbF9kYXRhX3NpemUgPSBkYXRhX2luX3NpemU7CisKKwkJCS8qIFNldCB0aGUgb3V0cHV0IHVzZXItc3BhY2UgYWRkcmVzcyBmb3IgbWVtMm1lbSBvcCAqLworCQkJaWYgKGFwcF9vdXRfYWRkcmVzcykKKwkJCQlkY2JfdGFibGVfcHRyLT5vdXRfdnJfdGFpbF9wdCA9CisJCQkJCQkJKHUzMilhcHBfb3V0X2FkZHJlc3M7CisKKwkJCS8qCisJCQkgKiBVcGRhdGUgYm90aCBkYXRhIGxlbmd0aCBwYXJhbWV0ZXJzIGluIG9yZGVyIHRvIGF2b2lkCisJCQkgKiBzZWNvbmQgZGF0YSBjb3B5IGFuZCBhbGxvdyBidWlsZGluZyBvZiBlbXB0eSBtbGxpCisJCQkgKiB0YWJsZXMKKwkJCSAqLworCQkJdGFpbF9zaXplID0gMHgwOworCQkJZGF0YV9pbl9zaXplID0gMHgwOworCQl9CisJCWlmICh0YWlsX3NpemUpIHsKKwkJCWlmIChpc19rdmEgPT0gdHJ1ZSkgeworCQkJCW1lbWNweShkY2JfdGFibGVfcHRyLT50YWlsX2RhdGEsCisJCQkJCSh2b2lkICopKGFwcF9pbl9hZGRyZXNzICsgZGF0YV9pbl9zaXplIC0KKwkJCQkJdGFpbF9zaXplKSwgdGFpbF9zaXplKTsKKwkJCX0gZWxzZSB7CisJCQkJLyogV2UgaGF2ZSB0YWlsIGRhdGEgLSBjb3B5IGl0IHRvIERDQiAqLworCQkJCWlmIChjb3B5X2Zyb21fdXNlcihkY2JfdGFibGVfcHRyLT50YWlsX2RhdGEsCisJCQkJCSh2b2lkICopKGFwcF9pbl9hZGRyZXNzICsKKwkJCQkJZGF0YV9pbl9zaXplIC0gdGFpbF9zaXplKSwgdGFpbF9zaXplKSkgeworCQkJCQllcnJvciA9IC1FRkFVTFQ7CisJCQkJCWdvdG8gZW5kX2Z1bmN0aW9uOworCQkJCX0KKwkJCX0KKwkJCWlmIChhcHBfb3V0X2FkZHJlc3MpCisJCQkJLyoKKwkJCQkgKiBDYWxjdWxhdGUgdGhlIG91dHB1dCBhZGRyZXNzCisJCQkJICogYWNjb3JkaW5nIHRvIHRhaWwgZGF0YSBzaXplCisJCQkJICovCisJCQkJZGNiX3RhYmxlX3B0ci0+b3V0X3ZyX3RhaWxfcHQgPQorCQkJCQkodTMyKWFwcF9vdXRfYWRkcmVzcyArIGRhdGFfaW5fc2l6ZQorCQkJCQktIHRhaWxfc2l6ZTsKKworCQkJLyogU2F2ZSB0aGUgcmVhbCB0YWlsIGRhdGEgc2l6ZSAqLworCQkJZGNiX3RhYmxlX3B0ci0+dGFpbF9kYXRhX3NpemUgPSB0YWlsX3NpemU7CisJCQkvKgorCQkJICogVXBkYXRlIHRoZSBkYXRhIHNpemUgd2l0aG91dCB0aGUgdGFpbAorCQkJICogZGF0YSBzaXplIEFLQSBkYXRhIGZvciB0aGUgZG1hCisJCQkgKi8KKwkJCWRhdGFfaW5fc2l6ZSA9IChkYXRhX2luX3NpemUgLSB0YWlsX3NpemUpOworCQl9CisJfQorCS8qIENoZWNrIGlmIHdlIG5lZWQgdG8gYnVpbGQgb25seSBpbnB1dCB0YWJsZSBvciBpbnB1dC9vdXRwdXQgKi8KKwlpZiAoYXBwX291dF9hZGRyZXNzKSB7CisJCS8qIFByZXBhcmUgaW5wdXQvb3V0cHV0IHRhYmxlcyAqLworCQllcnJvciA9IHNlcF9wcmVwYXJlX2lucHV0X291dHB1dF9kbWFfdGFibGUoc2VwLAorCQkJYXBwX2luX2FkZHJlc3MsCisJCQlhcHBfb3V0X2FkZHJlc3MsCisJCQlkYXRhX2luX3NpemUsCisJCQlibG9ja19zaXplLAorCQkJJmluX2ZpcnN0X21sbGlfYWRkcmVzcywKKwkJCSZvdXRfZmlyc3RfbWxsaV9hZGRyZXNzLAorCQkJJmluX2ZpcnN0X251bV9lbnRyaWVzLAorCQkJJm91dF9maXJzdF9udW1fZW50cmllcywKKwkJCSZmaXJzdF9kYXRhX3NpemUsCisJCQlpc19rdmEpOworCX0gZWxzZSB7CisJCS8qIFByZXBhcmUgaW5wdXQgdGFibGVzICovCisJCWVycm9yID0gc2VwX3ByZXBhcmVfaW5wdXRfZG1hX3RhYmxlKHNlcCwKKwkJCWFwcF9pbl9hZGRyZXNzLAorCQkJZGF0YV9pbl9zaXplLAorCQkJYmxvY2tfc2l6ZSwKKwkJCSZpbl9maXJzdF9tbGxpX2FkZHJlc3MsCisJCQkmaW5fZmlyc3RfbnVtX2VudHJpZXMsCisJCQkmZmlyc3RfZGF0YV9zaXplLAorCQkJaXNfa3ZhKTsKKwl9CisKKwlpZiAoZXJyb3IpIHsKKwkJZGV2X3dhcm4oJnNlcC0+cGRldi0+ZGV2LCAicHJlcGFyZSBETUEgdGFibGUgY2FsbCBmYWlsZWQgZnJvbSBwcmVwYXJlIERDQiBjYWxsXG4iKTsKKwkJZ290byBlbmRfZnVuY3Rpb247CisJfQorCisJLyogU2V0IHRoZSBEQ0IgdmFsdWVzICovCisJZGNiX3RhYmxlX3B0ci0+aW5wdXRfbWxsaV9hZGRyZXNzID0gaW5fZmlyc3RfbWxsaV9hZGRyZXNzOworCWRjYl90YWJsZV9wdHItPmlucHV0X21sbGlfbnVtX2VudHJpZXMgPSBpbl9maXJzdF9udW1fZW50cmllczsKKwlkY2JfdGFibGVfcHRyLT5pbnB1dF9tbGxpX2RhdGFfc2l6ZSA9IGZpcnN0X2RhdGFfc2l6ZTsKKwlkY2JfdGFibGVfcHRyLT5vdXRwdXRfbWxsaV9hZGRyZXNzID0gb3V0X2ZpcnN0X21sbGlfYWRkcmVzczsKKwlkY2JfdGFibGVfcHRyLT5vdXRwdXRfbWxsaV9udW1fZW50cmllcyA9IG91dF9maXJzdF9udW1fZW50cmllczsKKwlkY2JfdGFibGVfcHRyLT5vdXRwdXRfbWxsaV9kYXRhX3NpemUgPSBmaXJzdF9kYXRhX3NpemU7CisKK2VuZF9mdW5jdGlvbjoKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwKKwkJInNlcF9wcmVwYXJlX2lucHV0X291dHB1dF9kbWFfdGFibGVfaW5fZGNiIGVuZFxuIik7CisJcmV0dXJuIGVycm9yOworCit9CisKKworLyoqCisgKglzZXBfY3JlYXRlX3N5bmNfZG1hX3RhYmxlc19oYW5kbGVyIC0gY3JlYXRlIHN5bmMgRE1BIHRhYmxlcworICoJQHNlcDogcG9pbnRlciB0byBzdHJ1Y3Qgc2VwX2RldmljZQorICoJQGFyZzogcG9pbnRlciB0byBzdHJ1Y3QgYmxkX3N5bl90YWJfc3RydWN0CisgKgorICoJSGFuZGxlIHRoZSByZXF1ZXN0IGZvciBjcmVhdGlvbiBvZiB0aGUgRE1BIHRhYmxlcyBmb3IgdGhlIHN5bmNocm9uaWMKKyAqCXN5bW1ldHJpYyBvcGVyYXRpb25zIChBRVMsREVTKS4gTm90ZSB0aGF0IGFsbCBidXMgYWRkcmVzc2VzIHRoYXQgYXJlCisgKglwYXNzZWQgdG8gdGhlIFNFUCBhcmUgaW4gMzIgYml0IGZvcm1hdDsgdGhlIFNFUCBpcyBhIDMyIGJpdCBkZXZpY2UKKyAqLworc3RhdGljIGludCBzZXBfY3JlYXRlX3N5bmNfZG1hX3RhYmxlc19oYW5kbGVyKHN0cnVjdCBzZXBfZGV2aWNlICpzZXAsCisJCQkJCQl1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlpbnQgZXJyb3IgPSAwOworCisJLyogQ29tbWFuZCBhcmd1bWVudHMgKi8KKwlzdHJ1Y3QgYmxkX3N5bl90YWJfc3RydWN0IGNvbW1hbmRfYXJnczsKKworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LAorCQkic2VwX2NyZWF0ZV9zeW5jX2RtYV90YWJsZXNfaGFuZGxlciBzdGFydFxuIik7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJmNvbW1hbmRfYXJncywgKHZvaWQgX191c2VyICopYXJnLAorCQkJCQlzaXplb2Yoc3RydWN0IGJsZF9zeW5fdGFiX3N0cnVjdCkpKSB7CisJCWVycm9yID0gLUVGQVVMVDsKKwkJZ290byBlbmRfZnVuY3Rpb247CisJfQorCisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJhcHBfaW5fYWRkcmVzcyBpcyAlMDhsbHhcbiIsCisJCQkJCQljb21tYW5kX2FyZ3MuYXBwX2luX2FkZHJlc3MpOworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAiYXBwX291dF9hZGRyZXNzIGlzICUwOGxseFxuIiwKKwkJCQkJCWNvbW1hbmRfYXJncy5hcHBfb3V0X2FkZHJlc3MpOworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAiZGF0YV9zaXplIGlzICV1XG4iLAorCQkJCQkJY29tbWFuZF9hcmdzLmRhdGFfaW5fc2l6ZSk7CisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJibG9ja19zaXplIGlzICV1XG4iLAorCQkJCQkJY29tbWFuZF9hcmdzLmJsb2NrX3NpemUpOworCisJLyogVmFsaWRhdGUgdXNlciBwYXJhbWV0ZXJzICovCisJaWYgKCFjb21tYW5kX2FyZ3MuYXBwX2luX2FkZHJlc3MpIHsKKwkJZXJyb3IgPSAtRUlOVkFMOworCQlnb3RvIGVuZF9mdW5jdGlvbjsKKwl9CisKKwllcnJvciA9IHNlcF9wcmVwYXJlX2lucHV0X291dHB1dF9kbWFfdGFibGVfaW5fZGNiKHNlcCwKKwkJKHVuc2lnbmVkIGxvbmcpY29tbWFuZF9hcmdzLmFwcF9pbl9hZGRyZXNzLAorCQkodW5zaWduZWQgbG9uZyljb21tYW5kX2FyZ3MuYXBwX291dF9hZGRyZXNzLAorCQljb21tYW5kX2FyZ3MuZGF0YV9pbl9zaXplLAorCQljb21tYW5kX2FyZ3MuYmxvY2tfc2l6ZSwKKwkJMHgwLAorCQlmYWxzZSwKKwkJZmFsc2UpOworCitlbmRfZnVuY3Rpb246CisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJzZXBfY3JlYXRlX3N5bmNfZG1hX3RhYmxlc19oYW5kbGVyIGVuZFxuIik7CisJcmV0dXJuIGVycm9yOworfQorCisvKioKKyAqCXNlcF9mcmVlX2RtYV90YWJsZXNfYW5kX2RjYiAtIGZyZWUgRE1BIHRhYmxlcyBhbmQgRENCcworICoJQHNlcDogcG9pbnRlciB0byBzdHJ1Y3Qgc2VwX2RldmljZQorICoJQGlzYXBwbGV0OiBpbmRpY2F0ZXMgZXh0ZXJuYWwgYXBwbGljYXRpb24gKHVzZWQgZm9yIGtlcm5lbCBhY2Nlc3MpCisgKglAaXNfa3ZhOiBpbmRpY2F0ZXMga2VybmVsIGFkZHJlc3NlcyAob25seSB1c2VkIGZvciBrZXJuZWwgY3J5cHRvKQorICoKKyAqCVRoaXMgZnVuY3Rpb24gZnJlZXMgdGhlIERNQSB0YWJsZXMgYW5kIERDQgorICovCitzdGF0aWMgaW50IHNlcF9mcmVlX2RtYV90YWJsZXNfYW5kX2RjYihzdHJ1Y3Qgc2VwX2RldmljZSAqc2VwLCBib29sIGlzYXBwbGV0LAorCWJvb2wgaXNfa3ZhKQoreworCWludCBpID0gMDsKKwlpbnQgZXJyb3IgPSAwOworCWludCBlcnJvcl90ZW1wID0gMDsKKwlzdHJ1Y3Qgc2VwX2RjYmxvY2sgKmRjYl90YWJsZV9wdHI7CisJdW5zaWduZWQgbG9uZyBwdF9ob2xkOworCXZvaWQgKnRhaWxfcHQ7CisKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgInNlcF9mcmVlX2RtYV90YWJsZXNfYW5kX2RjYiBzdGFydFxuIik7CisKKwlpZiAoaXNhcHBsZXQgPT0gdHJ1ZSkgeworCQkvKiBTZXQgcG9pbnRlciB0byBmaXJzdCBEQ0IgdGFibGUgKi8KKwkJZGNiX3RhYmxlX3B0ciA9IChzdHJ1Y3Qgc2VwX2RjYmxvY2sgKikKKwkJCShzZXAtPnNoYXJlZF9hZGRyICsKKwkJCVNFUF9EUklWRVJfU1lTVEVNX0RDQl9NRU1PUllfT0ZGU0VUX0lOX0JZVEVTKTsKKworCQkvKiBHbyBvdmVyIGVhY2ggRENCIGFuZCBzZWUgaWYgdGFpbCBwb2ludGVyIG11c3QgYmUgdXBkYXRlZCAqLworCQlmb3IgKGkgPSAwOyBpIDwgc2VwLT5ucl9kY2JfY3JlYXQ7IGkrKywgZGNiX3RhYmxlX3B0cisrKSB7CisJCQlpZiAoZGNiX3RhYmxlX3B0ci0+b3V0X3ZyX3RhaWxfcHQpIHsKKwkJCQlwdF9ob2xkID0gKHVuc2lnbmVkIGxvbmcpZGNiX3RhYmxlX3B0ci0+b3V0X3ZyX3RhaWxfcHQ7CisJCQkJdGFpbF9wdCA9ICh2b2lkICopcHRfaG9sZDsKKwkJCQlpZiAoaXNfa3ZhID09IHRydWUpIHsKKwkJCQkJbWVtY3B5KHRhaWxfcHQsCisJCQkJCQlkY2JfdGFibGVfcHRyLT50YWlsX2RhdGEsCisJCQkJCQlkY2JfdGFibGVfcHRyLT50YWlsX2RhdGFfc2l6ZSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJZXJyb3JfdGVtcCA9IGNvcHlfdG9fdXNlcigKKwkJCQkJCXRhaWxfcHQsCisJCQkJCQlkY2JfdGFibGVfcHRyLT50YWlsX2RhdGEsCisJCQkJCQlkY2JfdGFibGVfcHRyLT50YWlsX2RhdGFfc2l6ZSk7CisJCQkJfQorCQkJCWlmIChlcnJvcl90ZW1wKSB7CisJCQkJCS8qIFJlbGVhc2UgdGhlIERNQSByZXNvdXJjZSAqLworCQkJCQllcnJvciA9IC1FRkFVTFQ7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKwkvKiBGcmVlIHRoZSBvdXRwdXQgcGFnZXMsIGlmIGFueSAqLworCXNlcF9mcmVlX2RtYV90YWJsZV9kYXRhX2hhbmRsZXIoc2VwKTsKKworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAic2VwX2ZyZWVfZG1hX3RhYmxlc19hbmRfZGNiIGVuZFxuIik7CisJcmV0dXJuIGVycm9yOworfQorCisvKioKKyAqCXNlcF9nZXRfc3RhdGljX3Bvb2xfYWRkcl9oYW5kbGVyIC0gZ2V0IHN0YXRpYyBwb29sIGFkZHJlc3MKKyAqCUBzZXA6IHBvaW50ZXIgdG8gc3RydWN0IHNlcF9kZXZpY2UKKyAqCisgKglUaGlzIGZ1bmN0aW9uIHNldHMgdGhlIGJ1cyBhbmQgdmlydHVhbCBhZGRyZXNzZXMgb2YgdGhlIHN0YXRpYyBwb29sCisgKi8KK3N0YXRpYyBpbnQgc2VwX2dldF9zdGF0aWNfcG9vbF9hZGRyX2hhbmRsZXIoc3RydWN0IHNlcF9kZXZpY2UgKnNlcCkKK3sKKwl1MzIgKnN0YXRpY19wb29sX2FkZHIgPSBOVUxMOworCisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJzZXBfZ2V0X3N0YXRpY19wb29sX2FkZHJfaGFuZGxlciBzdGFydFxuIik7CisKKwlzdGF0aWNfcG9vbF9hZGRyID0gKHUzMiAqKShzZXAtPnNoYXJlZF9hZGRyICsKKwkJU0VQX0RSSVZFUl9TWVNURU1fUkFSX01FTU9SWV9PRkZTRVRfSU5fQllURVMpOworCisJc3RhdGljX3Bvb2xfYWRkclswXSA9IFNFUF9TVEFUSUNfUE9PTF9WQUxfVE9LRU47CisJc3RhdGljX3Bvb2xfYWRkclsxXSA9ICh1MzIpc2VwLT5zaGFyZWRfYnVzICsKKwkJU0VQX0RSSVZFUl9TVEFUSUNfQVJFQV9PRkZTRVRfSU5fQllURVM7CisKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgInN0YXRpYyBwb29sOiBwaHlzaWNhbCAleFxuIiwKKwkJKHUzMilzdGF0aWNfcG9vbF9hZGRyWzFdKTsKKworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAic2VwX2dldF9zdGF0aWNfcG9vbF9hZGRyX2hhbmRsZXIgZW5kXG4iKTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqCXNlcF9zdGFydF9oYW5kbGVyIC0gc3RhcnQgZGV2aWNlCisgKglAc2VwOiBwb2ludGVyIHRvIHN0cnVjdCBzZXBfZGV2aWNlCisgKi8KK3N0YXRpYyBpbnQgc2VwX3N0YXJ0X2hhbmRsZXIoc3RydWN0IHNlcF9kZXZpY2UgKnNlcCkKK3sKKwl1bnNpZ25lZCBsb25nIHJlZ192YWw7CisJdW5zaWduZWQgbG9uZyBlcnJvciA9IDA7CisKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgInNlcF9zdGFydF9oYW5kbGVyIHN0YXJ0XG4iKTsKKworCS8qIFdhaXQgaW4gcG9sbGluZyBmb3IgbWVzc2FnZSBmcm9tIFNFUCAqLworCWRvIHsKKwkJcmVnX3ZhbCA9IHNlcF9yZWFkX3JlZyhzZXAsIEhXX0hPU1RfU0VQX0hPU1RfR1BSM19SRUdfQUREUik7CisJfSB3aGlsZSAoIXJlZ192YWwpOworCisJLyogQ2hlY2sgdGhlIHZhbHVlICovCisJaWYgKHJlZ192YWwgPT0gMHgxKQorCQkvKiBGYXRhbCBlcnJvciAtIHJlYWQgZXJyb3Igc3RhdHVzIGZyb20gR1BSTyAqLworCQllcnJvciA9IHNlcF9yZWFkX3JlZyhzZXAsIEhXX0hPU1RfU0VQX0hPU1RfR1BSMF9SRUdfQUREUik7CisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJzZXBfc3RhcnRfaGFuZGxlciBlbmRcbiIpOworCXJldHVybiBlcnJvcjsKK30KKworLyoqCisgKgllcF9jaGVja19zdW1fY2FsYyAtIGNoZWNrc3VtIG1lc3NhZ2VzCisgKglAZGF0YTogYnVmZmVyIHRvIGNoZWNrc3VtCisgKglAbGVuZ3RoOiBidWZmZXIgc2l6ZQorICoKKyAqCVRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgYSBjaGVja3N1bSBmb3IgbWVzc2FnZXMgdGhhdCBhcmUgc2VudAorICoJdG8gdGhlIFNFUC4KKyAqLworc3RhdGljIHUzMiBzZXBfY2hlY2tfc3VtX2NhbGModTggKmRhdGEsIHUzMiBsZW5ndGgpCit7CisJdTMyIHN1bSA9IDA7CisJdTE2ICpUZGF0YSA9ICh1MTYgKilkYXRhOworCisJd2hpbGUgKGxlbmd0aCA+IDEpIHsKKwkJLyogIFRoaXMgaXMgdGhlIGlubmVyIGxvb3AgKi8KKwkJc3VtICs9ICpUZGF0YSsrOworCQlsZW5ndGggLT0gMjsKKwl9CisKKwkvKiAgQWRkIGxlZnQtb3ZlciBieXRlLCBpZiBhbnkgKi8KKwlpZiAobGVuZ3RoID4gMCkKKwkJc3VtICs9ICoodTggKilUZGF0YTsKKworCS8qICBGb2xkIDMyLWJpdCBzdW0gdG8gMTYgYml0cyAqLworCXdoaWxlIChzdW0+PjE2KQorCQlzdW0gPSAoc3VtICYgMHhmZmZmKSArIChzdW0gPj4gMTYpOworCisJcmV0dXJuIH5zdW0gJiAweEZGRkY7Cit9CisKKy8qKgorICoJc2VwX2luaXRfaGFuZGxlciAtCisgKglAc2VwOiBwb2ludGVyIHRvIHN0cnVjdCBzZXBfZGV2aWNlCisgKglAYXJnOiBwYXJhbWV0ZXJzIGZyb20gdXNlciBzcGFjZSBhcHBsaWNhdGlvbgorICoKKyAqCUhhbmRsZXMgdGhlIHJlcXVlc3QgZm9yIFNFUCBpbml0aWFsaXphdGlvbgorICoJTm90ZSB0aGF0IHRoaXMgd2lsbCBnbyBhd2F5IGZvciBNZWRmaWVsZCBvbmNlIHRoZSBTQ1UKKyAqCVNFUCBpbml0aWFsaXphdGlvbiBpcyBjb21wbGV0ZQorICoJQWxzbyBub3RlIHRoYXQgdGhlIG1lc3NhZ2UgdG8gdGhlIFNFUCBoYXMgY29tcG9uZW50cworICoJZnJvbSB1c2VyIHNwYWNlIGFzIHdlbGwgYXMgY29tcG9uZW50cyB3cml0dGVuIGJ5IHRoZSBkcml2ZXIKKyAqCVRoaXMgaXMgYmVjdWFzZSB0aGUgcG9ydGlvbnMgb2YgdGhlIG1lc3NhZ2UgdGhhdCBwZXJ0YWluIHRvCisgKglwaHlzaWNhbCBhZGRyZXNzZXMgbXVzdCBiZSBzZXQgYnkgdGhlIGRyaXZlciBhZnRlciB0aGUgbWVzc2FnZQorICoJbGVhdmVzIGN1c3RvZHkgb2YgdGhlIHVzZXIgc3BhY2UgYXBwbGljYXRpb24gZm9yIHNlY3VyaXR5CisgKglyZWFzb25zLgorICovCitzdGF0aWMgaW50IHNlcF9pbml0X2hhbmRsZXIoc3RydWN0IHNlcF9kZXZpY2UgKnNlcCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJdTMyIG1lc3NhZ2VfYnVmZlsxNF07CisJdTMyIGNvdW50ZXI7CisJaW50IGVycm9yID0gMDsKKwl1MzIgcmVnX3ZhbDsKKwlkbWFfYWRkcl90IG5ld19iYXNlX2FkZHI7CisJdW5zaWduZWQgbG9uZyBhZGRyX2hvbGQ7CisJc3RydWN0IGluaXRfc3RydWN0IGNvbW1hbmRfYXJnczsKKworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAic2VwX2luaXRfaGFuZGxlciBzdGFydFxuIik7CisKKwkvKiBNYWtlIHN1cmUgdGhhdCB3ZSBoYXZlIG5vdCBpbml0aWFsaXplZCBhbHJlYWR5ICovCisJcmVnX3ZhbCA9IHNlcF9yZWFkX3JlZyhzZXAsIEhXX0hPU1RfU0VQX0hPU1RfR1BSM19SRUdfQUREUik7CisKKwlpZiAocmVnX3ZhbCAhPSAweDIpIHsKKwkJZXJyb3IgPSBTRVBfQUxSRUFEWV9JTklUSUFMSVpFRF9FUlI7CisJCWRldl93YXJuKCZzZXAtPnBkZXYtPmRldiwgImluaXQ7IGRldmljZSBhbHJlYWR5IGluaXRpYWxpemVkXG4iKTsKKwkJZ290byBlbmRfZnVuY3Rpb247CisJfQorCisJLyogT25seSByb290IGNhbiBpbml0aWFsaXplICovCisJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKSB7CisJCWVycm9yID0gLUVBQ0NFUzsKKwkJZ290byBlbmRfZnVuY3Rpb247CisJfQorCisJLyogQ29weSBpbiB0aGUgcGFyYW1ldGVycyAqLworCWVycm9yID0gY29weV9mcm9tX3VzZXIoJmNvbW1hbmRfYXJncywgKHZvaWQgX191c2VyICopYXJnLAorCQlzaXplb2Yoc3RydWN0IGluaXRfc3RydWN0KSk7CisKKwlpZiAoZXJyb3IpIHsKKwkJZXJyb3IgPSAtRUZBVUxUOworCQlnb3RvIGVuZF9mdW5jdGlvbjsKKwl9CisKKwkvKiBWYWxpZGF0ZSBwYXJhbWV0ZXJzICovCisJaWYgKCFjb21tYW5kX2FyZ3MubWVzc2FnZV9hZGRyIHx8ICFjb21tYW5kX2FyZ3Muc2VwX3NyYW1fYWRkciB8fAorCQljb21tYW5kX2FyZ3MubWVzc2FnZV9zaXplX2luX3dvcmRzID4gMTQpIHsKKwkJZXJyb3IgPSAtRUlOVkFMOworCQlnb3RvIGVuZF9mdW5jdGlvbjsKKwl9CisKKwkvKiBDb3B5IGluIHRoZSBTRVAgaW5pdCBtZXNzYWdlICovCisJYWRkcl9ob2xkID0gKHVuc2lnbmVkIGxvbmcpY29tbWFuZF9hcmdzLm1lc3NhZ2VfYWRkcjsKKwllcnJvciA9IGNvcHlfZnJvbV91c2VyKG1lc3NhZ2VfYnVmZiwKKwkJKHZvaWQgX191c2VyICopYWRkcl9ob2xkLAorCQljb21tYW5kX2FyZ3MubWVzc2FnZV9zaXplX2luX3dvcmRzKnNpemVvZih1MzIpKTsKKworCWlmIChlcnJvcikgeworCQllcnJvciA9IC1FRkFVTFQ7CisJCWdvdG8gZW5kX2Z1bmN0aW9uOworCX0KKworCS8qIExvYWQgcmVzaWRlbnQsIGNhY2hlLCBhbmQgZXh0YXBwIGZpcm13YXJlICovCisJZXJyb3IgPSBzZXBfbG9hZF9maXJtd2FyZShzZXApOworCisJaWYgKGVycm9yKSB7CisJCWRldl93YXJuKCZzZXAtPnBkZXYtPmRldiwKKwkJCSJpbml0OyBjb3B5IFNFUCBpbml0IG1lc3NhZ2UgZmFpbGVkICV4XG4iLCBlcnJvcik7CisJCWdvdG8gZW5kX2Z1bmN0aW9uOworCX0KKworCS8qIENvbXB1dGUgdGhlIGJhc2UgYWRkcmVzcyAqLworCW5ld19iYXNlX2FkZHIgPSBzZXAtPnNoYXJlZF9idXM7CisKKwlpZiAoc2VwLT5yZXNpZGVudF9idXMgPCBuZXdfYmFzZV9hZGRyKQorCQluZXdfYmFzZV9hZGRyID0gc2VwLT5yZXNpZGVudF9idXM7CisKKwlpZiAoc2VwLT5jYWNoZV9idXMgPCBuZXdfYmFzZV9hZGRyKQorCQluZXdfYmFzZV9hZGRyID0gc2VwLT5jYWNoZV9idXM7CisKKwlpZiAoc2VwLT5kY2FjaGVfYnVzIDwgbmV3X2Jhc2VfYWRkcikKKwkJbmV3X2Jhc2VfYWRkciA9IHNlcC0+ZGNhY2hlX2J1czsKKworCS8qIFB1dCBwaHlzaWNhbCBhZGRyZXNzZXMgaW4gU0VQIG1lc3NhZ2UgKi8KKwltZXNzYWdlX2J1ZmZbM10gPSAodTMyKW5ld19iYXNlX2FkZHI7CisJbWVzc2FnZV9idWZmWzRdID0gKHUzMilzZXAtPnNoYXJlZF9idXM7CisJbWVzc2FnZV9idWZmWzZdID0gKHUzMilzZXAtPnJlc2lkZW50X2J1czsKKwltZXNzYWdlX2J1ZmZbN10gPSAodTMyKXNlcC0+Y2FjaGVfYnVzOworCW1lc3NhZ2VfYnVmZls4XSA9ICh1MzIpc2VwLT5kY2FjaGVfYnVzOworCisJbWVzc2FnZV9idWZmW2NvbW1hbmRfYXJncy5tZXNzYWdlX3NpemVfaW5fd29yZHMgLSAxXSA9IDB4MDsKKwltZXNzYWdlX2J1ZmZbY29tbWFuZF9hcmdzLm1lc3NhZ2Vfc2l6ZV9pbl93b3JkcyAtIDFdID0KKwkJc2VwX2NoZWNrX3N1bV9jYWxjKCh1OCAqKW1lc3NhZ2VfYnVmZiwKKwkJY29tbWFuZF9hcmdzLm1lc3NhZ2Vfc2l6ZV9pbl93b3JkcypzaXplb2YodTMyKSk7CisKKwkvKiBEZWJ1ZyBwcmludCBvZiBtZXNzYWdlICovCisJZm9yIChjb3VudGVyID0gMDsgY291bnRlciA8IGNvbW1hbmRfYXJncy5tZXNzYWdlX3NpemVfaW5fd29yZHM7CisJCQkJCQkJCWNvdW50ZXIrKykKKwkJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJpbml0OyBTRVAgbWVzc2FnZSB3b3JkICVkIGlzICV4XG4iLAorCQkJY291bnRlciwgbWVzc2FnZV9idWZmW2NvdW50ZXJdKTsKKworCS8qIFRlbGwgdGhlIFNFUCB0aGUgc3JhbSBhZGRyZXNzICovCisJc2VwX3dyaXRlX3JlZyhzZXAsIEhXX1NSQU1fQUREUl9SRUdfQUREUiwgY29tbWFuZF9hcmdzLnNlcF9zcmFtX2FkZHIpOworCisJLyogUHVzaCB0aGUgbWVzc2FnZSB0byB0aGUgU0VQICovCisJZm9yIChjb3VudGVyID0gMDsgY291bnRlciA8IGNvbW1hbmRfYXJncy5tZXNzYWdlX3NpemVfaW5fd29yZHM7CisJCQkJCQkJCWNvdW50ZXIrKykgeworCQlzZXBfd3JpdGVfcmVnKHNlcCwgSFdfU1JBTV9EQVRBX1JFR19BRERSLAorCQkJCQkJbWVzc2FnZV9idWZmW2NvdW50ZXJdKTsKKwkJc2VwX3dhaXRfc3JhbV93cml0ZShzZXApOworCX0KKworCS8qIFNpZ25hbCBTRVAgdGhhdCBtZXNzYWdlIGlzIHJlYWR5IGFuZCB0byBpbml0ICovCisJc2VwX3dyaXRlX3JlZyhzZXAsIEhXX0hPU1RfSE9TVF9TRVBfR1BSMF9SRUdfQUREUiwgMHgxKTsKKworCS8qIFdhaXQgZm9yIGFja25vd2xlZGdlICovCisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJpbml0OyB3YWl0aW5nIGZvciBtc2cgcmVzcG9uc2VcbiIpOworCisJZG8geworCQlyZWdfdmFsID0gc2VwX3JlYWRfcmVnKHNlcCwgSFdfSE9TVF9TRVBfSE9TVF9HUFIzX1JFR19BRERSKTsKKwl9IHdoaWxlICghKHJlZ192YWwgJiAweEZGRkZGRkZEKSk7CisKKwlpZiAocmVnX3ZhbCA9PSAweDEpIHsKKwkJZGV2X3dhcm4oJnNlcC0+cGRldi0+ZGV2LCAiaW5pdDsgZGV2aWNlIGludCBmYWlsZWRcbiIpOworCQllcnJvciA9IHNlcF9yZWFkX3JlZyhzZXAsIDB4ODA2MCk7CisJCWRldl93YXJuKCZzZXAtPnBkZXYtPmRldiwgImluaXQ7IHN3IG1vbml0b3IgaXMgJXhcbiIsIGVycm9yKTsKKwkJZXJyb3IgPSBzZXBfcmVhZF9yZWcoc2VwLCBIV19IT1NUX1NFUF9IT1NUX0dQUjBfUkVHX0FERFIpOworCQlkZXZfd2Fybigmc2VwLT5wZGV2LT5kZXYsICJpbml0OyBlcnJvciBpcyAleFxuIiwgZXJyb3IpOworCQlnb3RvIGVuZF9mdW5jdGlvbjsKKwl9CisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJpbml0OyBlbmQgQ0MgSU5JVCwgcmVnX3ZhbCBpcyAleFxuIiwgcmVnX3ZhbCk7CisKKwkvKiBTaWduYWwgU0VQIHRvIHplcm8gdGhlIEdQUjMgKi8KKwlzZXBfd3JpdGVfcmVnKHNlcCwgSFdfSE9TVF9IT1NUX1NFUF9HUFIwX1JFR19BRERSLCAweDEwKTsKKworCS8qIFdhaXQgZm9yIHJlc3BvbnNlICovCisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJpbml0OyB3YWl0aW5nIGZvciB6ZXJvIHNldCByZXNwb25zZVxuIik7CisKKwlkbyB7CisJCXJlZ192YWwgPSBzZXBfcmVhZF9yZWcoc2VwLCBIV19IT1NUX1NFUF9IT1NUX0dQUjNfUkVHX0FERFIpOworCX0gd2hpbGUgKHJlZ192YWwgIT0gMCk7CisKK2VuZF9mdW5jdGlvbjoKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgImluaXQgaXMgZG9uZVxuIik7CisJcmV0dXJuIGVycm9yOworfQorCisvKioKKyAqCXNlcF9lbmRfdHJhbnNhY3Rpb25faGFuZGxlciAtIGVuZCB0cmFuc2FjdGlvbgorICoJQHNlcDogcG9pbnRlciB0byBzdHJ1Y3Qgc2VwX2RldmljZQorICoKKyAqCVRoaXMgQVBJIGhhbmRsZXMgdGhlIGVuZCB0cmFuc2FjdGlvbiByZXF1ZXN0CisgKi8KK3N0YXRpYyBpbnQgc2VwX2VuZF90cmFuc2FjdGlvbl9oYW5kbGVyKHN0cnVjdCBzZXBfZGV2aWNlICpzZXApCit7CisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJzZXBfZW5kX3RyYW5zYWN0aW9uX2hhbmRsZXIgc3RhcnRcbiIpOworCisJLyogQ2xlYXIgdGhlIGRhdGEgcG9vbCBwb2ludGVycyBUb2tlbiAqLworCW1lbXNldCgodm9pZCAqKShzZXAtPnNoYXJlZF9hZGRyICsKKwkJU0VQX0RSSVZFUl9EQVRBX1BPT0xfQUxMT0NBVElPTl9PRkZTRVRfSU5fQllURVMpLAorCQkwLCBzZXAtPm51bV9vZl9kYXRhX2FsbG9jYXRpb25zKjIqc2l6ZW9mKHUzMikpOworCisJLyogQ2hlY2sgdGhhdCBhbGwgdGhlIERNQSByZXNvdXJjZXMgd2VyZSBmcmVlZCAqLworCXNlcF9mcmVlX2RtYV90YWJsZV9kYXRhX2hhbmRsZXIoc2VwKTsKKworCWNsZWFyX2JpdChTRVBfTU1BUF9MT0NLX0JJVCwgJnNlcC0+aW5fdXNlX2ZsYWdzKTsKKworCS8qCisJICogV2UgYXJlIG5vdyB0aHJvdWdoIHdpdGggdGhlIHRyYW5zYWN0aW9uLiBMZXQncworCSAqIGFsbG93IG90aGVyIHByb2Nlc3NlcyB3aG8gaGF2ZSB0aGUgZGV2aWNlIG9wZW4KKwkgKiB0byBwZXJmb3JtIHRyYW5zYWN0aW9ucworCSAqLworCW11dGV4X2xvY2soJnNlcC0+c2VwX211dGV4KTsKKwlzZXAtPnBpZF9kb2luZ190cmFuc2FjdGlvbiA9IDA7CisJbXV0ZXhfdW5sb2NrKCZzZXAtPnNlcF9tdXRleCk7CisJLyogUmFpc2UgZXZlbnQgZm9yIHN0dWNrIGNvbnRleHRlcyAqLworCXdha2VfdXAoJnNlcC0+ZXZlbnQpOworCisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJ3YWtpbmcgdXAgZXZlbnRcbiIpOworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAic2VwX2VuZF90cmFuc2FjdGlvbl9oYW5kbGVyIGVuZFxuIik7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKglzZXBfcHJlcGFyZV9kY2JfaGFuZGxlciAtIHByZXBhcmUgYSBjb250cm9sIGJsb2NrCisgKglAc2VwOiBwb2ludGVyIHRvIHN0cnVjdCBzZXBfZGV2aWNlCisgKglAYXJnOiBwb2ludGVyIHRvIHVzZXIgcGFyYW1ldGVycworICoKKyAqCVRoaXMgZnVuY3Rpb24gd2lsbCByZXRyaWV2ZSB0aGUgUkFSIGJ1ZmZlciBwaHlzaWNhbCBhZGRyZXNzZXMsIHR5cGUKKyAqCSYgc2l6ZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBSQVIgaGFuZGxlcyBwcm92aWRlZCBpbiB0aGUgYnVmZmVycyB2ZWN0b3IuCisgKi8KK3N0YXRpYyBpbnQgc2VwX3ByZXBhcmVfZGNiX2hhbmRsZXIoc3RydWN0IHNlcF9kZXZpY2UgKnNlcCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJaW50IGVycm9yOworCS8qIENvbW1hbmQgYXJndW1lbnRzICovCisJc3RydWN0IGJ1aWxkX2RjYl9zdHJ1Y3QgY29tbWFuZF9hcmdzOworCisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJzZXBfcHJlcGFyZV9kY2JfaGFuZGxlciBzdGFydFxuIik7CisKKwkvKiBHZXQgdGhlIGNvbW1hbmQgYXJndW1lbnRzICovCisJaWYgKGNvcHlfZnJvbV91c2VyKCZjb21tYW5kX2FyZ3MsICh2b2lkIF9fdXNlciAqKWFyZywKKwkJCQkJc2l6ZW9mKHN0cnVjdCBidWlsZF9kY2Jfc3RydWN0KSkpIHsKKwkJZXJyb3IgPSAtRUZBVUxUOworCQlnb3RvIGVuZF9mdW5jdGlvbjsKKwl9CisKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgImFwcF9pbl9hZGRyZXNzIGlzICUwOGxseFxuIiwKKwkJCQkJCWNvbW1hbmRfYXJncy5hcHBfaW5fYWRkcmVzcyk7CisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJhcHBfb3V0X2FkZHJlc3MgaXMgJTA4bGx4XG4iLAorCQkJCQkJY29tbWFuZF9hcmdzLmFwcF9vdXRfYWRkcmVzcyk7CisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJkYXRhX3NpemUgaXMgJXhcbiIsCisJCQkJCQljb21tYW5kX2FyZ3MuZGF0YV9pbl9zaXplKTsKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgImJsb2NrX3NpemUgaXMgJXhcbiIsCisJCQkJCQljb21tYW5kX2FyZ3MuYmxvY2tfc2l6ZSk7CisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJ0YWlsIGJsb2NrX3NpemUgaXMgJXhcbiIsCisJCQkJCQljb21tYW5kX2FyZ3MudGFpbF9ibG9ja19zaXplKTsKKworCWVycm9yID0gc2VwX3ByZXBhcmVfaW5wdXRfb3V0cHV0X2RtYV90YWJsZV9pbl9kY2Ioc2VwLAorCQkodW5zaWduZWQgbG9uZyljb21tYW5kX2FyZ3MuYXBwX2luX2FkZHJlc3MsCisJCSh1bnNpZ25lZCBsb25nKWNvbW1hbmRfYXJncy5hcHBfb3V0X2FkZHJlc3MsCisJCWNvbW1hbmRfYXJncy5kYXRhX2luX3NpemUsIGNvbW1hbmRfYXJncy5ibG9ja19zaXplLAorCQljb21tYW5kX2FyZ3MudGFpbF9ibG9ja19zaXplLCB0cnVlLCBmYWxzZSk7CisKK2VuZF9mdW5jdGlvbjoKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgInNlcF9wcmVwYXJlX2RjYl9oYW5kbGVyIGVuZFxuIik7CisJcmV0dXJuIGVycm9yOworCit9CisKKy8qKgorICoJc2VwX2ZyZWVfZGNiX2hhbmRsZXIgLSBmcmVlIGNvbnRyb2wgYmxvY2sgcmVzb3VyY2VzCisgKglAc2VwOiBwb2ludGVyIHRvIHN0cnVjdCBzZXBfZGV2aWNlCisgKgorICoJVGhpcyBmdW5jdGlvbiBmcmVlcyB0aGUgRENCIHJlc291cmNlcyBhbmQgdXBkYXRlcyB0aGUgbmVlZGVkCisgKgl1c2VyLXNwYWNlIGJ1ZmZlcnMuCisgKi8KK3N0YXRpYyBpbnQgc2VwX2ZyZWVfZGNiX2hhbmRsZXIoc3RydWN0IHNlcF9kZXZpY2UgKnNlcCkKK3sKKwlpbnQgZXJyb3IgOworCisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJzZXBfcHJlcGFyZV9kY2JfaGFuZGxlciBzdGFydFxuIik7CisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJudW0gb2YgRENCcyAleFxuIiwgc2VwLT5ucl9kY2JfY3JlYXQpOworCisJZXJyb3IgPSBzZXBfZnJlZV9kbWFfdGFibGVzX2FuZF9kY2Ioc2VwLCBmYWxzZSwgZmFsc2UpOworCisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJzZXBfZnJlZV9kY2JfaGFuZGxlciBlbmRcbiIpOworCXJldHVybiBlcnJvcjsKK30KKworLyoqCisgKglzZXBfcmFyX3ByZXBhcmVfb3V0cHV0X21zZ19oYW5kbGVyIC0gcHJlcGFyZSBhbiBvdXRwdXQgbWVzc2FnZQorICoJQHNlcDogcG9pbnRlciB0byBzdHJ1Y3Qgc2VwX2RldmljZQorICoJQGFyZzogcG9pbnRlciB0byB1c2VyIHBhcmFtZXRlcnMKKyAqCisgKglUaGlzIGZ1bmN0aW9uIHdpbGwgcmV0cmlldmUgdGhlIFJBUiBidWZmZXIgcGh5c2ljYWwgYWRkcmVzc2VzLCB0eXBlCisgKgkmIHNpemUgY29ycmVzcG9uZGluZyB0byB0aGUgUkFSIGhhbmRsZXMgcHJvdmlkZWQgaW4gdGhlIGJ1ZmZlcnMgdmVjdG9yLgorICovCitzdGF0aWMgaW50IHNlcF9yYXJfcHJlcGFyZV9vdXRwdXRfbXNnX2hhbmRsZXIoc3RydWN0IHNlcF9kZXZpY2UgKnNlcCwKKwl1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlpbnQgZXJyb3IgPSAwOworCS8qIENvbW1hbmQgYXJncyAqLworCXN0cnVjdCByYXJfaG5kbF90b19idXNfc3RydWN0IGNvbW1hbmRfYXJnczsKKwlzdHJ1Y3QgUkFSX2J1ZmZlciByYXJfYnVmOworCS8qIEJ1cyBhZGRyZXNzICovCisJZG1hX2FkZHJfdCAgcmFyX2J1cyA9IDA7CisJLyogSG9sZHMgdGhlIFJBUiBhZGRyZXNzIGluIHRoZSBzeXN0ZW0gbWVtb3J5IG9mZnNldCAqLworCXUzMiAqcmFyX2FkZHI7CisKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgInNlcF9yYXJfcHJlcGFyZV9vdXRwdXRfbXNnX2hhbmRsZXIgc3RhcnRcbiIpOworCisJLyogQ29weSB0aGUgZGF0YSAqLworCWlmIChjb3B5X2Zyb21fdXNlcigmY29tbWFuZF9hcmdzLCAodm9pZCBfX3VzZXIgKilhcmcsCisJCQkJCQlzaXplb2YoY29tbWFuZF9hcmdzKSkpIHsKKwkJZXJyb3IgPSAtRUZBVUxUOworCQlnb3RvIGVuZF9mdW5jdGlvbjsKKwl9CisKKwkvKiBDYWxsIHRvIHRyYW5zbGF0aW9uIGZ1bmN0aW9uIG9ubHkgaWYgdXNlciBoYW5kbGUgaXMgbm90IE5VTEwgKi8KKwlpZiAoY29tbWFuZF9hcmdzLnJhcl9oYW5kbGUpIHsKKwkJbWVtc2V0KCZyYXJfYnVmLCAwLCBzaXplb2YocmFyX2J1ZikpOworCQlyYXJfYnVmLmluZm8uaGFuZGxlID0gKHUzMiljb21tYW5kX2FyZ3MucmFyX2hhbmRsZTsKKworCQlpZiAocmFyX2hhbmRsZV90b19idXMoJnJhcl9idWYsIDEpICE9IDEpIHsKKwkJCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAicmFyX2hhbmRsZV90b19idXMgZmFpbHVyZVxuIik7CisJCQllcnJvciA9IC1FRkFVTFQ7CisJCQlnb3RvIGVuZF9mdW5jdGlvbjsKKwkJfQorCQlyYXJfYnVzID0gcmFyX2J1Zi5idXNfYWRkcmVzczsKKwl9CisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJyYXIgbXNnOyByYXJfYWRkcl9idXMgPSAleFxuIiwgKHUzMilyYXJfYnVzKTsKKworCS8qIFNldCB2YWx1ZSBpbiB0aGUgU1lTVEVNIE1FTU9SWSBvZmZzZXQgKi8KKwlyYXJfYWRkciA9ICh1MzIgKikoc2VwLT5zaGFyZWRfYWRkciArCisJCVNFUF9EUklWRVJfU1lTVEVNX1JBUl9NRU1PUllfT0ZGU0VUX0lOX0JZVEVTKTsKKworCS8qIENvcHkgdGhlIHBoeXNpY2FsIGFkZHJlc3MgdG8gdGhlIFN5c3RlbSBBcmVhIGZvciB0aGUgU0VQICovCisJcmFyX2FkZHJbMF0gPSBTRVBfUkFSX1ZBTF9UT0tFTjsKKwlyYXJfYWRkclsxXSA9IHJhcl9idXM7CisKK2VuZF9mdW5jdGlvbjoKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgInNlcF9yYXJfcHJlcGFyZV9vdXRwdXRfbXNnX2hhbmRsZXIgc3RhcnRcbiIpOworCXJldHVybiBlcnJvcjsKK30KKworLyoqCisgKglzZXBfcmVhbGxvY19leHRfY2FjaGVfaGFuZGxlciAtIHJlcG9ydCBsb2NhdGlvbiBvZiBleHRjYWNoZQorICoJQHNlcDogcG9pbnRlciB0byBzdHJ1Y3Qgc2VwX2RldmljZQorICoJQGFyZzogcG9pbnRlciB0byB1c2VyIHBhcmFtZXRlcnMKKyAqCisgKglUaGlzIGZ1bmN0aW9uIHRlbGxzIHRoZSBTRVAgd2hlcmUgdGhlIGV4dGFwcCBpcyBsb2NhdGVkCisgKi8KK3N0YXRpYyBpbnQgc2VwX3JlYWxsb2NfZXh0X2NhY2hlX2hhbmRsZXIoc3RydWN0IHNlcF9kZXZpY2UgKnNlcCwKKwl1bnNpZ25lZCBsb25nIGFyZykKK3sKKwkvKiBIb2xkcyB0aGUgbmV3IGV4dCBjYWNoZSBhZGRyZXNzIGluIHRoZSBzeXN0ZW0gbWVtb3J5IG9mZnNldCAqLworCXUzMiAqc3lzdGVtX2FkZHI7CisKKwkvKiBTZXQgdmFsdWUgaW4gdGhlIFNZU1RFTSBNRU1PUlkgb2Zmc2V0ICovCisJc3lzdGVtX2FkZHIgPSAodTMyICopKHNlcC0+c2hhcmVkX2FkZHIgKworCQlTRVBfRFJJVkVSX1NZU1RFTV9FWFRfQ0FDSEVfQUREUl9PRkZTRVRfSU5fQllURVMpOworCisJLyogQ29weSB0aGUgcGh5c2ljYWwgYWRkcmVzcyB0byB0aGUgU3lzdGVtIEFyZWEgZm9yIHRoZSBTRVAgKi8KKwlzeXN0ZW1fYWRkclswXSA9IFNFUF9FWFRfQ0FDSEVfQUREUl9WQUxfVE9LRU47CisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJleHQgY2FjaGUgaW5pdDsgc3lzdGVtIGFkZHIgMCBpcyAleFxuIiwKKwkJCQkJCQlzeXN0ZW1fYWRkclswXSk7CisJc3lzdGVtX2FkZHJbMV0gPSBzZXAtPmV4dGFwcF9idXM7CisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJleHQgY2FjaGUgaW5pdDsgc3lzdGVtIGFkZHIgMSBpcyAleFxuIiwKKwkJCQkJCQlzeXN0ZW1fYWRkclsxXSk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKglzZXBfaW9jdGwgLSBpb2N0bCBhcGkKKyAqCUBmaWxwOiBwb2ludGVyIHRvIHN0cnVjdCBmaWxlCisgKglAY21kOiBjb21tYW5kCisgKglAYXJnOiBwb2ludGVyIHRvIGFyZ3VtZW50IHN0cnVjdHVyZQorICoKKyAqCUltcGxlbWVudCB0aGUgaW9jdGwgbWV0aG9kcyBhdmFpbGJsZSBvbiB0aGUgU0VQIGRldmljZS4KKyAqLworc3RhdGljIGxvbmcgc2VwX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxwLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlpbnQgZXJyb3IgPSAwOworCXN0cnVjdCBzZXBfZGV2aWNlICpzZXAgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgImlvY3RsIHN0YXJ0XG4iKTsKKworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAiY21kIGlzICV4XG4iLCBjbWQpOworCisJLyogTWFrZSBzdXJlIHdlIG93biB0aGlzIGRldmljZSAqLworCW11dGV4X2xvY2soJnNlcC0+c2VwX211dGV4KTsKKwlpZiAoKGN1cnJlbnQtPnBpZCAhPSBzZXAtPnBpZF9kb2luZ190cmFuc2FjdGlvbikgJiYKKwkJCQkoc2VwLT5waWRfZG9pbmdfdHJhbnNhY3Rpb24gIT0gMCkpIHsKKwkJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJpb2N0bCBwaWQgaXMgbm90IG93bmVyXG4iKTsKKwkJbXV0ZXhfdW5sb2NrKCZzZXAtPnNlcF9tdXRleCk7CisJCWVycm9yID0gLUVBQ0NFUzsKKwkJZ290byBlbmRfZnVuY3Rpb247CisJfQorCisJbXV0ZXhfdW5sb2NrKCZzZXAtPnNlcF9tdXRleCk7CisKKwkvKiBDaGVjayB0aGF0IHRoZSBjb21tYW5kIGlzIGZvciBTRVAgZGV2aWNlICovCisJaWYgKF9JT0NfVFlQRShjbWQpICE9IFNFUF9JT0NfTUFHSUNfTlVNQkVSKSB7CisJCWVycm9yID0gLUVOT1RUWTsKKwkJZ290byBlbmRfZnVuY3Rpb247CisJfQorCisJLyogTG9jayB0byBwcmV2ZW50IHRoZSBkYWVtb24gdG8gaW50ZXJmZXJlIHdpdGggb3BlcmF0aW9uICovCisJbXV0ZXhfbG9jaygmc2VwLT5pb2N0bF9tdXRleCk7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgU0VQX0lPQ1NFTkRTRVBDT01NQU5EOgorCQkvKiBTZW5kIGNvbW1hbmQgdG8gU0VQICovCisJCWVycm9yID0gc2VwX3NlbmRfY29tbWFuZF9oYW5kbGVyKHNlcCk7CisJCWJyZWFrOworCWNhc2UgU0VQX0lPQ0FMTE9DREFUQVBPTEw6CisJCS8qIEFsbG9jYXRlIGRhdGEgcG9vbCAqLworCQllcnJvciA9IHNlcF9hbGxvY2F0ZV9kYXRhX3Bvb2xfbWVtb3J5X2hhbmRsZXIoc2VwLCBhcmcpOworCQlicmVhazsKKwljYXNlIFNFUF9JT0NDUkVBVEVTWU1ETUFUQUJMRToKKwkJLyogQ3JlYXRlIERNQSB0YWJsZSBmb3Igc3luaHJvbmljIG9wZXJhdGlvbiAqLworCQllcnJvciA9IHNlcF9jcmVhdGVfc3luY19kbWFfdGFibGVzX2hhbmRsZXIoc2VwLCBhcmcpOworCQlicmVhazsKKwljYXNlIFNFUF9JT0NGUkVFRE1BVEFCTEVEQVRBOgorCQkvKiBGcmVlIHRoZSBwYWdlcyAqLworCQllcnJvciA9IHNlcF9mcmVlX2RtYV90YWJsZV9kYXRhX2hhbmRsZXIoc2VwKTsKKwkJYnJlYWs7CisJY2FzZSBTRVBfSU9DU0VQU1RBUlQ6CisJCS8qIFN0YXJ0IGNvbW1hbmQgdG8gU0VQICovCisJCWlmIChzZXAtPnBkZXYtPnJldmlzaW9uID09IDApIC8qIE9ubHkgZm9yIG9sZCBjaGlwICovCisJCQllcnJvciA9IHNlcF9zdGFydF9oYW5kbGVyKHNlcCk7CisJCWVsc2UKKwkJCWVycm9yID0gLUVQRVJNOyAvKiBOb3QgcGVybWl0dGVkIG9uIG5ldyBjaGlwICovCisJCWJyZWFrOworCWNhc2UgU0VQX0lPQ1NFUElOSVQ6CisJCS8qIEluaXQgY29tbWFuZCB0byBTRVAgKi8KKwkJaWYgKHNlcC0+cGRldi0+cmV2aXNpb24gPT0gMCkgLyogT25seSBmb3Igb2xkIGNoaXAgKi8KKwkJCWVycm9yID0gc2VwX2luaXRfaGFuZGxlcihzZXAsIGFyZyk7CisJCWVsc2UKKwkJCWVycm9yID0gLUVQRVJNOyAvKiBOb3QgcGVybWl0dGVkIG9uIG5ldyBjaGlwICovCisJCWJyZWFrOworCWNhc2UgU0VQX0lPQ0dFVFNUQVRJQ1BPT0xBRERSOgorCQkvKiBJbmZvcm0gdGhlIFNFUCB0aGUgYnVzIGFkZHJlc3Mgb2YgdGhlIHN0YXRpYyBwb29sICovCisJCWVycm9yID0gc2VwX2dldF9zdGF0aWNfcG9vbF9hZGRyX2hhbmRsZXIoc2VwKTsKKwkJYnJlYWs7CisJY2FzZSBTRVBfSU9DRU5EVFJBTlNBQ1RJT046CisJCWVycm9yID0gc2VwX2VuZF90cmFuc2FjdGlvbl9oYW5kbGVyKHNlcCk7CisJCWJyZWFrOworCWNhc2UgU0VQX0lPQ1JFQUxMT0NFWFRDQUNIRToKKwkJaWYgKHNlcC0+cGRldi0+cmV2aXNpb24gPT0gMCkgLyogT25seSBmb3Igb2xkIGNoaXAgKi8KKwkJCWVycm9yID0gc2VwX3JlYWxsb2NfZXh0X2NhY2hlX2hhbmRsZXIoc2VwLCBhcmcpOworCQllbHNlCisJCQllcnJvciA9IC1FUEVSTTsgLyogTm90IHBlcm1pdHRlZCBvbiBuZXcgY2hpcCAqLworCQlicmVhazsKKwljYXNlIFNFUF9JT0NSQVJQUkVQQVJFTUVTU0FHRToKKwkJZXJyb3IgPSBzZXBfcmFyX3ByZXBhcmVfb3V0cHV0X21zZ19oYW5kbGVyKHNlcCwgYXJnKTsKKwkJYnJlYWs7CisJY2FzZSBTRVBfSU9DUFJFUEFSRURDQjoKKwkJZXJyb3IgPSBzZXBfcHJlcGFyZV9kY2JfaGFuZGxlcihzZXAsIGFyZyk7CisJCWJyZWFrOworCWNhc2UgU0VQX0lPQ0ZSRUVEQ0I6CisJCWVycm9yID0gc2VwX2ZyZWVfZGNiX2hhbmRsZXIoc2VwKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJpbnZhbGlkIGlvY3RsICV4XG4iLCBjbWQpOworCQllcnJvciA9IC1FTk9UVFk7CisJCWJyZWFrOworCX0KKwltdXRleF91bmxvY2soJnNlcC0+aW9jdGxfbXV0ZXgpOworCitlbmRfZnVuY3Rpb246CisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJpb2N0bCBlbmRcbiIpOworCXJldHVybiBlcnJvcjsKK30KKworLyoqCisgKglzZXBfc2luZ2xldG9uX2lvY3RsIC0gaW9jdGwgYXBpIGZvciBzaW5nbGV0b24gaW50ZXJmYWNlCisgKglAZmlscDogcG9pbnRlciB0byBzdHJ1Y3QgZmlsZQorICoJQGNtZDogY29tbWFuZAorICoJQGFyZzogcG9pbnRlciB0byBhcmd1bWVudCBzdHJ1Y3R1cmUKKyAqCisgKglJbXBsZW1lbnQgdGhlIGFkZGl0aW9uYWwgaW9jdGxzIGZvciB0aGUgc2luZ2xldG9uIGRldmljZQorICovCitzdGF0aWMgbG9uZyBzZXBfc2luZ2xldG9uX2lvY3RsKHN0cnVjdCBmaWxlICAqZmlscCwgdTMyIGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJbG9uZyBlcnJvciA9IDA7CisJc3RydWN0IHNlcF9kZXZpY2UgKnNlcCA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAic2luZ2xldG9uX2lvY3RsIHN0YXJ0XG4iKTsKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgImNtZCBpcyAleFxuIiwgY21kKTsKKworCS8qIENoZWNrIHRoYXQgdGhlIGNvbW1hbmQgaXMgZm9yIHRoZSBTRVAgZGV2aWNlICovCisJaWYgKF9JT0NfVFlQRShjbWQpICE9IFNFUF9JT0NfTUFHSUNfTlVNQkVSKSB7CisJCWVycm9yID0gIC1FTk9UVFk7CisJCWdvdG8gZW5kX2Z1bmN0aW9uOworCX0KKworCS8qIE1ha2Ugc3VyZSB3ZSBvd24gdGhpcyBkZXZpY2UgKi8KKwltdXRleF9sb2NrKCZzZXAtPnNlcF9tdXRleCk7CisJaWYgKChjdXJyZW50LT5waWQgIT0gc2VwLT5waWRfZG9pbmdfdHJhbnNhY3Rpb24pICYmCisJCQkJKHNlcC0+cGlkX2RvaW5nX3RyYW5zYWN0aW9uICE9IDApKSB7CisJCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAic2luZ2xldG9uIGlvY3RsIHBpZCBpcyBub3Qgb3duZXJcbiIpOworCQltdXRleF91bmxvY2soJnNlcC0+c2VwX211dGV4KTsKKwkJZXJyb3IgPSAtRUFDQ0VTOworCQlnb3RvIGVuZF9mdW5jdGlvbjsKKwl9CisKKwltdXRleF91bmxvY2soJnNlcC0+c2VwX211dGV4KTsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBTRVBfSU9DVExTRVRDQUxMRVJJRDoKKwkJbXV0ZXhfbG9jaygmc2VwLT5pb2N0bF9tdXRleCk7CisJCWVycm9yID0gc2VwX3NldF9jYWxsZXJfaWRfaGFuZGxlcihzZXAsIGFyZyk7CisJCW11dGV4X3VubG9jaygmc2VwLT5pb2N0bF9tdXRleCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWVycm9yID0gc2VwX2lvY3RsKGZpbHAsIGNtZCwgYXJnKTsKKwkJYnJlYWs7CisJfQorCitlbmRfZnVuY3Rpb246CisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJzaW5nbGV0b24gaW9jdGwgZW5kXG4iKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qKgorICoJc2VwX3JlcXVlc3RfZGFlbW9uX2lvY3RsIC0gaW9jdGwgZm9yIGRhZW1vbgorICoJQGZpbHA6IHBvaW50ZXIgdG8gc3RydWN0IGZpbGUKKyAqCUBjbWQ6IGNvbW1hbmQKKyAqCUBhcmc6IHBvaW50ZXIgdG8gYXJndW1lbnQgc3RydWN0dXJlCisgKgorICoJQ2FsbGVkIGJ5IHRoZSByZXF1ZXN0IGRhZW1vbiB0byBwZXJmb3JtIGlvY3RscyBvbiB0aGUgZGFlbW9uIGRldmljZQorICovCitzdGF0aWMgbG9uZyBzZXBfcmVxdWVzdF9kYWVtb25faW9jdGwoc3RydWN0IGZpbGUgKmZpbHAsIHUzMiBjbWQsCisJdW5zaWduZWQgbG9uZyBhcmcpCit7CisKKwlsb25nIGVycm9yOworCXN0cnVjdCBzZXBfZGV2aWNlICpzZXAgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgImRhZW1vbiBpb2N0bDogc3RhcnRcbiIpOworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAiZGFlbW9uIGlvY3RsOiBjbWQgaXMgJXhcbiIsIGNtZCk7CisKKwkvKiBDaGVjayB0aGF0IHRoZSBjb21tYW5kIGlzIGZvciBTRVAgZGV2aWNlICovCisJaWYgKF9JT0NfVFlQRShjbWQpICE9IFNFUF9JT0NfTUFHSUNfTlVNQkVSKSB7CisJCWVycm9yID0gLUVOT1RUWTsKKwkJZ290byBlbmRfZnVuY3Rpb247CisJfQorCisJLyogT25seSBvbmUgcHJvY2VzcyBjYW4gYWNjZXNzIGlvY3RsIGF0IGFueSBnaXZlbiB0aW1lICovCisJbXV0ZXhfbG9jaygmc2VwLT5pb2N0bF9tdXRleCk7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgU0VQX0lPQ1NFTkRTRVBSUExZQ09NTUFORDoKKwkJLyogU2VuZCByZXBseSBjb21tYW5kIHRvIFNFUCAqLworCQllcnJvciA9IHNlcF9yZXFfZGFlbW9uX3NlbmRfcmVwbHlfY29tbWFuZF9oYW5kbGVyKHNlcCk7CisJCWJyZWFrOworCWNhc2UgU0VQX0lPQ0VORFRSQU5TQUNUSU9OOgorCQkvKgorCQkgKiBFbmQgcmVxIGRhZW1vbiB0cmFuc2FjdGlvbiwgZG8gbm90aGluZworCQkgKiB3aWxsIGJlIHJlbW92ZWQgdXBvbiB1cGRhdGUgaW4gbWlkZGxld2FyZQorCQkgKiBBUEkgbGlicmFyeQorCQkgKi8KKwkJZXJyb3IgPSAwOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgImRhZW1vbiBpb2N0bDogbm8gc3VjaCBJT0NUTFxuIik7CisJCWVycm9yID0gLUVOT1RUWTsKKwl9CisJbXV0ZXhfdW5sb2NrKCZzZXAtPmlvY3RsX211dGV4KTsKKworZW5kX2Z1bmN0aW9uOgorCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAiZGFlbW9uIGlvY3RsOiBlbmRcbiIpOworCXJldHVybiBlcnJvcjsKKworfQorCisvKioKKyAqCXNlcF9pbnRoYW5kbGVyIC0gaW50ZXJydXB0IGhhbmRsZXIKKyAqCUBpcnE6IGludGVycnVwdAorICoJQGRldl9pZDogZGV2aWNlIGlkCisgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCBzZXBfaW50aGFuZGxlcihpbnQgaXJxLCB2b2lkICpkZXZfaWQpCit7CisJaXJxcmV0dXJuX3QgaW50X2Vycm9yID0gSVJRX0hBTkRMRUQ7CisJdW5zaWduZWQgbG9uZyBsY2tfZmxhZ3M7CisJdTMyIHJlZ192YWwsIHJlZ192YWwyID0gMDsKKwlzdHJ1Y3Qgc2VwX2RldmljZSAqc2VwID0gZGV2X2lkOworCisJLyogUmVhZCB0aGUgSVJSIHJlZ2lzdGVyIHRvIGNoZWNrIGlmIHRoaXMgaXMgU0VQIGludGVycnVwdCAqLworCXJlZ192YWwgPSBzZXBfcmVhZF9yZWcoc2VwLCBIV19IT1NUX0lSUl9SRUdfQUREUik7CisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJTRVAgSW50ZXJydXB0IC0gcmVnIGlzICUwOHhcbiIsIHJlZ192YWwpOworCisJaWYgKHJlZ192YWwgJiAoMHgxIDw8IDEzKSkgeworCQkvKiBMb2NrIGFuZCB1cGRhdGUgdGhlIGNvdW50ZXIgb2YgcmVwbHkgbWVzc2FnZXMgKi8KKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnNlcC0+c25kX3JwbHlfbGNrLCBsY2tfZmxhZ3MpOworCQlzZXAtPnJlcGx5X2N0Kys7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNlcC0+c25kX3JwbHlfbGNrLCBsY2tfZmxhZ3MpOworCisJCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAic2VwIGludDogc2VuZF9jdCAlbHggcmVwbHlfY3QgJWx4XG4iLAorCQkJCQlzZXAtPnNlbmRfY3QsIHNlcC0+cmVwbHlfY3QpOworCisJCS8qIElzIHRoaXMgcHJpbnRmIG9yIGRhZW1vbiByZXF1ZXN0PyAqLworCQlyZWdfdmFsMiA9IHNlcF9yZWFkX3JlZyhzZXAsIEhXX0hPU1RfU0VQX0hPU1RfR1BSMl9SRUdfQUREUik7CisJCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LAorCQkJIlNFUCBJbnRlcnJ1cHQgLSByZWcyIGlzICUwOHhcbiIsIHJlZ192YWwyKTsKKworCQlpZiAoKHJlZ192YWwyID4+IDMwKSAmIDB4MSkgeworCQkJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJpbnQ6IHByaW50ZiByZXF1ZXN0XG4iKTsKKwkJCXdha2VfdXAoJnNlcC0+ZXZlbnRfcmVxdWVzdF9kYWVtb24pOworCQl9IGVsc2UgaWYgKHJlZ192YWwyID4+IDMxKSB7CisJCQlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgImludDogZGFlbW9uIHJlcXVlc3RcbiIpOworCQkJd2FrZV91cCgmc2VwLT5ldmVudF9yZXF1ZXN0X2RhZW1vbik7CisJCX0gZWxzZSB7CisJCQlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgImludDogU0VQIHJlcGx5XG4iKTsKKwkJCXdha2VfdXAoJnNlcC0+ZXZlbnQpOworCQl9CisJfSBlbHNlIHsKKwkJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJpbnQ6IG5vdCBTRVAgaW50ZXJydXB0XG4iKTsKKwkJaW50X2Vycm9yID0gSVJRX05PTkU7CisJfQorCWlmIChpbnRfZXJyb3IgPT0gSVJRX0hBTkRMRUQpCisJCXNlcF93cml0ZV9yZWcoc2VwLCBIV19IT1NUX0lDUl9SRUdfQUREUiwgcmVnX3ZhbCk7CisKKwlyZXR1cm4gaW50X2Vycm9yOworfQorCisvKioKKyAqCXNlcF9yZWNvbmZpZ19zaGFyZWRfYXJlYSAtIHJlY29uZmlndXJlIHNoYXJlZCBhcmVhCisgKglAc2VwOiBwb2ludGVyIHRvIHN0cnVjdCBzZXBfZGV2aWNlCisgKgorICoJUmVjb25maWcgdGhlIHNoYXJlZCBhcmVhIGJldHdlZW4gSE9TVCBhbmQgU0VQIC0gbmVlZGVkIGluIGNhc2UKKyAqCXRoZSBEWF9DQ19Jbml0IGZ1bmN0aW9uIHdhcyBjYWxsZWQgYmVmb3JlIE9TIGxvYWRpbmcuCisgKi8KK3N0YXRpYyBpbnQgc2VwX3JlY29uZmlnX3NoYXJlZF9hcmVhKHN0cnVjdCBzZXBfZGV2aWNlICpzZXApCit7CisJaW50IHJldF92YWw7CisKKwkvKiB1c2UgdG8gbGltaXQgd2FpdGluZyBmb3IgU0VQICovCisJdW5zaWduZWQgbG9uZyBlbmRfdGltZTsKKworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAicmVjb25maWcgc2hhcmVkIGFyZWEgc3RhcnRcbiIpOworCisJLyogU2VuZCB0aGUgbmV3IFNIQVJFRCBNRVNTQUdFIEFSRUEgdG8gdGhlIFNFUCAqLworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAic2VuZGluZyAlMDhsbHggdG8gc2VwXG4iLAorCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpc2VwLT5zaGFyZWRfYnVzKTsKKworCXNlcF93cml0ZV9yZWcoc2VwLCBIV19IT1NUX0hPU1RfU0VQX0dQUjFfUkVHX0FERFIsIHNlcC0+c2hhcmVkX2J1cyk7CisKKwkvKiBQb2xsIGZvciBTRVAgcmVzcG9uc2UgKi8KKwlyZXRfdmFsID0gc2VwX3JlYWRfcmVnKHNlcCwgSFdfSE9TVF9TRVBfSE9TVF9HUFIxX1JFR19BRERSKTsKKworCWVuZF90aW1lID0gamlmZmllcyArIChXQUlUX1RJTUUgKiBIWik7CisKKwl3aGlsZSAoKHRpbWVfYmVmb3JlKGppZmZpZXMsIGVuZF90aW1lKSkgJiYgKHJldF92YWwgIT0gMHhmZmZmZmZmZikgJiYKKwkJKHJldF92YWwgIT0gc2VwLT5zaGFyZWRfYnVzKSkKKwkJcmV0X3ZhbCA9IHNlcF9yZWFkX3JlZyhzZXAsIEhXX0hPU1RfU0VQX0hPU1RfR1BSMV9SRUdfQUREUik7CisKKwkvKiBDaGVjayB0aGUgcmV0dXJuIHZhbHVlIChyZWdpc3RlcikgKi8KKwlpZiAocmV0X3ZhbCAhPSBzZXAtPnNoYXJlZF9idXMpIHsKKwkJZGV2X3dhcm4oJnNlcC0+cGRldi0+ZGV2LCAiY291bGQgbm90IHJlY29uZmlnIHNoYXJlZCBhcmVhXG4iKTsKKwkJZGV2X3dhcm4oJnNlcC0+cGRldi0+ZGV2LCAicmVzdWx0IHdhcyAleFxuIiwgcmV0X3ZhbCk7CisJCXJldF92YWwgPSAtRU5PTUVNOworCX0gZWxzZQorCQlyZXRfdmFsID0gMDsKKworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LCAicmVjb25maWcgc2hhcmVkIGFyZWEgZW5kXG4iKTsKKwlyZXR1cm4gcmV0X3ZhbDsKK30KKworLyogRmlsZSBvcGVyYXRpb24gZm9yIHNpbmdsZXRvbiBTRVAgb3BlcmF0aW9ucyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgc2luZ2xldG9uX2ZpbGVfb3BlcmF0aW9ucyA9IHsKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkudW5sb2NrZWRfaW9jdGwgPSBzZXBfc2luZ2xldG9uX2lvY3RsLAorCS5wb2xsID0gc2VwX3BvbGwsCisJLm9wZW4gPSBzZXBfc2luZ2xldG9uX29wZW4sCisJLnJlbGVhc2UgPSBzZXBfc2luZ2xldG9uX3JlbGVhc2UsCisJLm1tYXAgPSBzZXBfbW1hcCwKK307CisKKy8qIEZpbGUgb3BlcmF0aW9uIGZvciBkYWVtb24gb3BlcmF0aW9ucyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZGFlbW9uX2ZpbGVfb3BlcmF0aW9ucyA9IHsKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkudW5sb2NrZWRfaW9jdGwgPSBzZXBfcmVxdWVzdF9kYWVtb25faW9jdGwsCisJLnBvbGwgPSBzZXBfcmVxdWVzdF9kYWVtb25fcG9sbCwKKwkub3BlbiA9IHNlcF9yZXF1ZXN0X2RhZW1vbl9vcGVuLAorCS5yZWxlYXNlID0gc2VwX3JlcXVlc3RfZGFlbW9uX3JlbGVhc2UsCisJLm1tYXAgPSBzZXBfcmVxdWVzdF9kYWVtb25fbW1hcCwKK307CisKKy8qIFRoZSBmaWxlcyBvcGVyYXRpb25zIHN0cnVjdHVyZSBvZiB0aGUgZHJpdmVyICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBzZXBfZmlsZV9vcGVyYXRpb25zID0geworCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS51bmxvY2tlZF9pb2N0bCA9IHNlcF9pb2N0bCwKKwkucG9sbCA9IHNlcF9wb2xsLAorCS5vcGVuID0gc2VwX29wZW4sCisJLnJlbGVhc2UgPSBzZXBfcmVsZWFzZSwKKwkubW1hcCA9IHNlcF9tbWFwLAorfTsKKworLyoqCisgKglzZXBfcmVnaXN0ZXJfZHJpdmVyX3dpdGhfZnMgLSByZWdpc3RlciBtaXNjIGRldmljZXMKKyAqCUBzZXA6IHBvaW50ZXIgdG8gc3RydWN0IHNlcF9kZXZpY2UKKyAqCisgKglUaGlzIGZ1bmN0aW9uIHJlZ2lzdGVycyB0aGUgZHJpdmVyIHdpdGggdGhlIGZpbGUgc3lzdGVtCisgKi8KK3N0YXRpYyBpbnQgc2VwX3JlZ2lzdGVyX2RyaXZlcl93aXRoX2ZzKHN0cnVjdCBzZXBfZGV2aWNlICpzZXApCit7CisJaW50IHJldF92YWw7CisKKwlzZXAtPm1pc2NkZXZfc2VwLm1pbm9yID0gTUlTQ19EWU5BTUlDX01JTk9SOworCXNlcC0+bWlzY2Rldl9zZXAubmFtZSA9IFNFUF9ERVZfTkFNRTsKKwlzZXAtPm1pc2NkZXZfc2VwLmZvcHMgPSAmc2VwX2ZpbGVfb3BlcmF0aW9uczsKKworCXNlcC0+bWlzY2Rldl9zaW5nbGV0b24ubWlub3IgPSBNSVNDX0RZTkFNSUNfTUlOT1I7CisJc2VwLT5taXNjZGV2X3NpbmdsZXRvbi5uYW1lID0gU0VQX0RFVl9TSU5HTEVUT047CisJc2VwLT5taXNjZGV2X3NpbmdsZXRvbi5mb3BzID0gJnNpbmdsZXRvbl9maWxlX29wZXJhdGlvbnM7CisKKwlzZXAtPm1pc2NkZXZfZGFlbW9uLm1pbm9yID0gTUlTQ19EWU5BTUlDX01JTk9SOworCXNlcC0+bWlzY2Rldl9kYWVtb24ubmFtZSA9IFNFUF9ERVZfREFFTU9OOworCXNlcC0+bWlzY2Rldl9kYWVtb24uZm9wcyA9ICZkYWVtb25fZmlsZV9vcGVyYXRpb25zOworCisJcmV0X3ZhbCA9IG1pc2NfcmVnaXN0ZXIoJnNlcC0+bWlzY2Rldl9zZXApOworCWlmIChyZXRfdmFsKSB7CisJCWRldl93YXJuKCZzZXAtPnBkZXYtPmRldiwgIm1pc2MgcmVnIGZhaWxzIGZvciBTRVAgJXhcbiIsCisJCQlyZXRfdmFsKTsKKwkJcmV0dXJuIHJldF92YWw7CisJfQorCisJcmV0X3ZhbCA9IG1pc2NfcmVnaXN0ZXIoJnNlcC0+bWlzY2Rldl9zaW5nbGV0b24pOworCWlmIChyZXRfdmFsKSB7CisJCWRldl93YXJuKCZzZXAtPnBkZXYtPmRldiwgIm1pc2MgcmVnIGZhaWxzIGZvciBzaW5nICV4XG4iLAorCQkJcmV0X3ZhbCk7CisJCW1pc2NfZGVyZWdpc3Rlcigmc2VwLT5taXNjZGV2X3NlcCk7CisJCXJldHVybiByZXRfdmFsOworCX0KKworCXJldF92YWwgPSBtaXNjX3JlZ2lzdGVyKCZzZXAtPm1pc2NkZXZfZGFlbW9uKTsKKwlpZiAocmV0X3ZhbCkgeworCQlkZXZfd2Fybigmc2VwLT5wZGV2LT5kZXYsICJtaXNjIHJlZyBmYWlscyBmb3IgZG1uICV4XG4iLAorCQkJcmV0X3ZhbCk7CisJCW1pc2NfZGVyZWdpc3Rlcigmc2VwLT5taXNjZGV2X3NlcCk7CisJCW1pc2NfZGVyZWdpc3Rlcigmc2VwLT5taXNjZGV2X3NpbmdsZXRvbik7CisKKwkJcmV0dXJuIHJldF92YWw7CisJfQorCXJldHVybiByZXRfdmFsOworfQorCisKKy8qKgorICoJc2VwX3Byb2JlIC0gcHJvYmUgYSBtYXRjaGluZyBQQ0kgZGV2aWNlCisgKglAcGRldjogcGNpX2RldmljZQorICoJQGVuZDogcGNpX2RldmljZV9pZAorICoKKyAqCUF0dGVtcHQgdG8gc2V0IHVwIGFuZCBjb25maWd1cmUgYSBTRVAgZGV2aWNlIHRoYXQgaGFzIGJlZW4KKyAqCWRpc2NvdmVyZWQgYnkgdGhlIFBDSSBsYXllci4KKyAqLworc3RhdGljIGludCBfX2RldmluaXQgc2VwX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCWNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCit7CisJaW50IGVycm9yID0gMDsKKwlzdHJ1Y3Qgc2VwX2RldmljZSAqc2VwOworCisJcHJfZGVidWcoIlNFUCBwY2kgcHJvYmUgc3RhcnRpbmdcbiIpOworCWlmIChzZXBfZGV2ICE9IE5VTEwpIHsKKwkJZGV2X3dhcm4oJnBkZXYtPmRldiwgIm9ubHkgb25lIFNFUCBzdXBwb3J0ZWQuXG4iKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwkvKiBFbmFibGUgdGhlIGRldmljZSAqLworCWVycm9yID0gcGNpX2VuYWJsZV9kZXZpY2UocGRldik7CisJaWYgKGVycm9yKSB7CisJCWRldl93YXJuKCZwZGV2LT5kZXYsICJlcnJvciBlbmFibGluZyBwY2kgZGV2aWNlXG4iKTsKKwkJZ290byBlbmRfZnVuY3Rpb247CisJfQorCisJLyogQWxsb2NhdGUgdGhlIHNlcF9kZXZpY2Ugc3RydWN0dXJlIGZvciB0aGlzIGRldmljZSAqLworCXNlcF9kZXYgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgc2VwX2RldmljZSksIEdGUF9BVE9NSUMpOworCWlmIChzZXBfZGV2ID09IE5VTEwpIHsKKwkJZGV2X3dhcm4oJnBkZXYtPmRldiwKKwkJCSJjYW4ndCBrbWFsbG9jIHRoZSBzZXBfZGV2aWNlIHN0cnVjdHVyZVxuIik7CisJCWVycm9yID0gLUVOT01FTTsKKwkJZ290byBlbmRfZnVuY3Rpb25fZGlzYWJsZV9kZXZpY2U7CisJfQorCisJLyoKKwkgKiBXZSdyZSBnb2luZyB0byB1c2UgYW5vdGhlciB2YXJpYWJsZSBmb3IgYWN0dWFsbHkKKwkgKiB3b3JraW5nIHdpdGggdGhlIGRldmljZTsgdGhpcyB3YXksIGlmIHdlIGhhdmUKKwkgKiBtdWx0aXBsZSBkZXZpY2VzIGluIHRoZSBmdXR1cmUsIGl0IHdvdWxkIGJlIGVhc2llcgorCSAqIHRvIG1ha2UgYXBwcm9wcmlhdGUgY2hhbmdlcworCSAqLworCXNlcCA9IHNlcF9kZXY7CisKKwlzZXAtPnBkZXYgPSBwY2lfZGV2X2dldChwZGV2KTsKKworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnNlcC0+ZXZlbnQpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnNlcC0+ZXZlbnRfcmVxdWVzdF9kYWVtb24pOworCXNwaW5fbG9ja19pbml0KCZzZXAtPnNuZF9ycGx5X2xjayk7CisJbXV0ZXhfaW5pdCgmc2VwLT5zZXBfbXV0ZXgpOworCW11dGV4X2luaXQoJnNlcC0+aW9jdGxfbXV0ZXgpOworCisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJQQ0kgb2J0YWluZWQsIGRldmljZSBiZWluZyBwcmVwYXJlZFxuIik7CisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJyZXZpc2lvbiBpcyAlZFxuIiwgc2VwLT5wZGV2LT5yZXZpc2lvbik7CisKKwkvKiBTZXQgdXAgb3VyIHJlZ2lzdGVyIGFyZWEgKi8KKwlzZXAtPnJlZ19waHlzaWNhbF9hZGRyID0gcGNpX3Jlc291cmNlX3N0YXJ0KHNlcC0+cGRldiwgMCk7CisJaWYgKCFzZXAtPnJlZ19waHlzaWNhbF9hZGRyKSB7CisJCWRldl93YXJuKCZzZXAtPnBkZXYtPmRldiwgIkVycm9yIGdldHRpbmcgcmVnaXN0ZXIgc3RhcnRcbiIpOworCQllcnJvciA9IC1FTk9ERVY7CisJCWdvdG8gZW5kX2Z1bmN0aW9uX2ZyZWVfc2VwX2RldjsKKwl9CisKKwlzZXAtPnJlZ19waHlzaWNhbF9lbmQgPSBwY2lfcmVzb3VyY2VfZW5kKHNlcC0+cGRldiwgMCk7CisJaWYgKCFzZXAtPnJlZ19waHlzaWNhbF9lbmQpIHsKKwkJZGV2X3dhcm4oJnNlcC0+cGRldi0+ZGV2LCAiRXJyb3IgZ2V0dGluZyByZWdpc3RlciBlbmRcbiIpOworCQllcnJvciA9IC1FTk9ERVY7CisJCWdvdG8gZW5kX2Z1bmN0aW9uX2ZyZWVfc2VwX2RldjsKKwl9CisKKwlzZXAtPnJlZ19hZGRyID0gaW9yZW1hcF9ub2NhY2hlKHNlcC0+cmVnX3BoeXNpY2FsX2FkZHIsCisJCShzaXplX3QpKHNlcC0+cmVnX3BoeXNpY2FsX2VuZCAtIHNlcC0+cmVnX3BoeXNpY2FsX2FkZHIgKyAxKSk7CisJaWYgKCFzZXAtPnJlZ19hZGRyKSB7CisJCWRldl93YXJuKCZzZXAtPnBkZXYtPmRldiwgIkVycm9yIGdldHRpbmcgcmVnaXN0ZXIgdmlydHVhbFxuIik7CisJCWVycm9yID0gLUVOT0RFVjsKKwkJZ290byBlbmRfZnVuY3Rpb25fZnJlZV9zZXBfZGV2OworCX0KKworCWRldl9kYmcoJnNlcC0+cGRldi0+ZGV2LAorCQkiUmVnaXN0ZXIgYXJlYSBzdGFydCAlbGx4IGVuZCAlbGx4IHZpcnR1YWwgJXBcbiIsCisJCSh1bnNpZ25lZCBsb25nIGxvbmcpc2VwLT5yZWdfcGh5c2ljYWxfYWRkciwKKwkJKHVuc2lnbmVkIGxvbmcgbG9uZylzZXAtPnJlZ19waHlzaWNhbF9lbmQsCisJCXNlcC0+cmVnX2FkZHIpOworCisJLyogQWxsb2NhdGUgdGhlIHNoYXJlZCBhcmVhICovCisJc2VwLT5zaGFyZWRfc2l6ZSA9IFNFUF9EUklWRVJfTUVTU0FHRV9TSEFSRURfQVJFQV9TSVpFX0lOX0JZVEVTICsKKwkJU1lOQ0hST05JQ19ETUFfVEFCTEVTX0FSRUFfU0laRV9CWVRFUyArCisJCVNFUF9EUklWRVJfREFUQV9QT09MX1NIQVJFRF9BUkVBX1NJWkVfSU5fQllURVMgKworCQlTRVBfRFJJVkVSX1NUQVRJQ19BUkVBX1NJWkVfSU5fQllURVMgKworCQlTRVBfRFJJVkVSX1NZU1RFTV9EQVRBX01FTU9SWV9TSVpFX0lOX0JZVEVTOworCisJaWYgKHNlcF9tYXBfYW5kX2FsbG9jX3NoYXJlZF9hcmVhKHNlcCkpIHsKKwkJZXJyb3IgPSAtRU5PTUVNOworCQkvKiBBbGxvY2F0aW9uIGZhaWxlZCAqLworCQlnb3RvIGVuZF9mdW5jdGlvbl9lcnJvcjsKKwl9CisKKwlzZXAtPnJhcl9zaXplID0gRkFLRV9SQVJfU0laRTsKKwlzZXAtPnJhcl9hZGRyID0gZG1hX2FsbG9jX2NvaGVyZW50KCZzZXAtPnBkZXYtPmRldiwKKwkJc2VwLT5yYXJfc2l6ZSwgJnNlcC0+cmFyX2J1cywgR0ZQX0tFUk5FTCk7CisJaWYgKHNlcC0+cmFyX2FkZHIgPT0gTlVMTCkgeworCQlkZXZfd2Fybigmc2VwLT5wZGV2LT5kZXYsICJjYW4ndCBhbGxvY2F0ZSBtZmxkIHJhclxuIik7CisJCWVycm9yID0gLUVOT01FTTsKKwkJZ290byBlbmRfZnVuY3Rpb25fZGVhbGxvY2F0ZV9zZXBfc2hhcmVkX2FyZWE7CisJfQorCisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJyYXIgc3RhcnQgaXMgJXAsIHBoeSBpcyAlbGx4LCIKKwkJIiBzaXplIGlzICV6eFxuIiwgc2VwLT5yYXJfYWRkciwKKwkJKHVuc2lnbmVkIGxvbmcgbG9uZylzZXAtPnJhcl9idXMsCisJCXNlcC0+cmFyX3NpemUpOworCisJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJhYm91dCB0byB3cml0ZSBJTVIgYW5kIElDUiBSRUdfQUREUlxuIik7CisKKwkvKiBDbGVhciBJQ1IgcmVnaXN0ZXIgKi8KKwlzZXBfd3JpdGVfcmVnKHNlcCwgSFdfSE9TVF9JQ1JfUkVHX0FERFIsIDB4RkZGRkZGRkYpOworCisJLyogU2V0IHRoZSBJTVIgcmVnaXN0ZXIgLSBvcGVuIG9ubHkgR1BSIDIgKi8KKwlzZXBfd3JpdGVfcmVnKHNlcCwgSFdfSE9TVF9JTVJfUkVHX0FERFIsICh+KDB4MSA8PCAxMykpKTsKKworCS8qIFJlYWQgc2VuZC9yZWNlaXZlIGNvdW50ZXJzIGZyb20gU0VQICovCisJc2VwLT5yZXBseV9jdCA9IHNlcF9yZWFkX3JlZyhzZXAsIEhXX0hPU1RfU0VQX0hPU1RfR1BSMl9SRUdfQUREUik7CisJc2VwLT5yZXBseV9jdCAmPSAweDNGRkZGRkZGOworCXNlcC0+c2VuZF9jdCA9IHNlcC0+cmVwbHlfY3Q7CisKKwlkZXZfZGJnKCZzZXAtPnBkZXYtPmRldiwgImFib3V0IHRvIGNhbGwgcmVxdWVzdF9pcnFcbiIpOworCS8qIEdldCB0aGUgaW50ZXJydXB0IGxpbmUgKi8KKwllcnJvciA9IHJlcXVlc3RfaXJxKHBkZXYtPmlycSwgc2VwX2ludGhhbmRsZXIsIElSUUZfU0hBUkVELAorCQkic2VwX2RyaXZlciIsIHNlcCk7CisKKwlpZiAoZXJyb3IpCisJCWdvdG8gZW5kX2Z1bmN0aW9uX2RlYWxsb2NfcmFyOworCisJLyogVGhlIG5ldyBjaGlwIHJlcXVpcmVzIGFzaGFyZWQgYXJlYSByZWNvbmZpZ3VyZSAqLworCWlmIChzZXAtPnBkZXYtPnJldmlzaW9uID09IDQpIHsgLyogT25seSBmb3IgbmV3IGNoaXAgKi8KKwkJZXJyb3IgPSBzZXBfcmVjb25maWdfc2hhcmVkX2FyZWEoc2VwKTsKKwkJaWYgKGVycm9yKQorCQkJZ290byBlbmRfZnVuY3Rpb25fZnJlZV9pcnE7CisJfQorCS8qIEZpbmFsbHkgbWFnaWMgdXAgdGhlIGRldmljZSBub2RlcyAqLworCS8qIFJlZ2lzdGVyIGRyaXZlciB3aXRoIHRoZSBmcyAqLworCWVycm9yID0gc2VwX3JlZ2lzdGVyX2RyaXZlcl93aXRoX2ZzKHNlcCk7CisJaWYgKGVycm9yID09IDApCisJCS8qIFN1Y2Nlc3MgKi8KKwkJcmV0dXJuIDA7CisKK2VuZF9mdW5jdGlvbl9mcmVlX2lycToKKwlmcmVlX2lycShwZGV2LT5pcnEsIHNlcCk7CisKK2VuZF9mdW5jdGlvbl9kZWFsbG9jX3JhcjoKKwlpZiAoc2VwLT5yYXJfYWRkcikKKwkJZG1hX2ZyZWVfY29oZXJlbnQoJnNlcC0+cGRldi0+ZGV2LCBzZXAtPnJhcl9zaXplLAorCQkJc2VwLT5yYXJfYWRkciwgc2VwLT5yYXJfYnVzKTsKKwlnb3RvIGVuZF9mdW5jdGlvbjsKKworZW5kX2Z1bmN0aW9uX2RlYWxsb2NhdGVfc2VwX3NoYXJlZF9hcmVhOgorCS8qIERlLWFsbG9jYXRlIHNoYXJlZCBhcmVhICovCisJc2VwX3VubWFwX2FuZF9mcmVlX3NoYXJlZF9hcmVhKHNlcCk7CisKK2VuZF9mdW5jdGlvbl9lcnJvcjoKKwlpb3VubWFwKHNlcC0+cmVnX2FkZHIpOworCitlbmRfZnVuY3Rpb25fZnJlZV9zZXBfZGV2OgorCXBjaV9kZXZfcHV0KHNlcF9kZXYtPnBkZXYpOworCWtmcmVlKHNlcF9kZXYpOworCXNlcF9kZXYgPSBOVUxMOworCitlbmRfZnVuY3Rpb25fZGlzYWJsZV9kZXZpY2U6CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCitlbmRfZnVuY3Rpb246CisJcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgdm9pZCBzZXBfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBzZXBfZGV2aWNlICpzZXAgPSBzZXBfZGV2OworCisJLyogVW5yZWdpc3RlciBmcm9tIGZzICovCisJbWlzY19kZXJlZ2lzdGVyKCZzZXAtPm1pc2NkZXZfc2VwKTsKKwltaXNjX2RlcmVnaXN0ZXIoJnNlcC0+bWlzY2Rldl9zaW5nbGV0b24pOworCW1pc2NfZGVyZWdpc3Rlcigmc2VwLT5taXNjZGV2X2RhZW1vbik7CisKKwkvKiBGcmVlIHRoZSBpcnEgKi8KKwlmcmVlX2lycShzZXAtPnBkZXYtPmlycSwgc2VwKTsKKworCS8qIEZyZWUgdGhlIHNoYXJlZCBhcmVhICAqLworCXNlcF91bm1hcF9hbmRfZnJlZV9zaGFyZWRfYXJlYShzZXBfZGV2KTsKKwlpb3VubWFwKCh2b2lkICopIHNlcF9kZXYtPnJlZ19hZGRyKTsKK30KKworc3RhdGljIERFRklORV9QQ0lfREVWSUNFX1RBQkxFKHNlcF9wY2lfaWRfdGJsKSA9IHsKKwl7UENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0lOVEVMLCBNRkxEX1BDSV9ERVZJQ0VfSUQpfSwKKwl7MH0KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBzZXBfcGNpX2lkX3RibCk7CisKKy8qIEZpZWxkIGZvciByZWdpc3RlcmluZyBkcml2ZXIgdG8gUENJIGRldmljZSAqLworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIHNlcF9wY2lfZHJpdmVyID0geworCS5uYW1lID0gInNlcF9zZWNfZHJpdmVyIiwKKwkuaWRfdGFibGUgPSBzZXBfcGNpX2lkX3RibCwKKwkucHJvYmUgPSBzZXBfcHJvYmUsCisJLnJlbW92ZSA9IHNlcF9yZW1vdmUKK307CisKKworLyoqCisgKglzZXBfaW5pdCAtIGluaXQgZnVuY3Rpb24KKyAqCisgKglNb2R1bGUgbG9hZCB0aW1lLiBSZWdpc3RlciB0aGUgUENJIGRldmljZSBkcml2ZXIuCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IHNlcF9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJnNlcF9wY2lfZHJpdmVyKTsKK30KKworCisvKioKKyAqCXNlcF9leGl0IC0gY2FsbGVkIHRvIHVubG9hZCBkcml2ZXIKKyAqCisgKglEcm9wIHRoZSBtaXNjIGRldmljZXMgdGhlbiByZW1vdmUgYW5kIHVubWFwIHRoZSB2YXJpb3VzIHJlc291cmNlcworICoJdGhhdCBhcmUgbm90IHJlbGVhc2VkIGJ5IHRoZSBkcml2ZXIgcmVtb3ZlIG1ldGhvZC4KKyAqLworc3RhdGljIHZvaWQgX19leGl0IHNlcF9leGl0KHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZzZXBfcGNpX2RyaXZlcik7Cit9CisKKworbW9kdWxlX2luaXQoc2VwX2luaXQpOworbW9kdWxlX2V4aXQoc2VwX2V4aXQpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc2VwL3NlcF9kcml2ZXJfYXBpLmggYi9kcml2ZXJzL3N0YWdpbmcvc2VwL3NlcF9kcml2ZXJfYXBpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmJiZmEyMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zZXAvc2VwX2RyaXZlcl9hcGkuaApAQCAtMCwwICsxLDI5NyBAQAorLyoKKyAqCisgKiAgc2VwX2RyaXZlcl9hcGkuaCAtIFNlY3VyaXR5IFByb2Nlc3NvciBEcml2ZXIgYXBpIGRlZmluaXRpb25zCisgKgorICogIENvcHlyaWdodChjKSAyMDA5LDIwMTAgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiAgQ29udHJpYnV0aW9ucyhjKSAyMDA5LDIwMTAgRGlzY3JldGl4LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiAgU29mdHdhcmUgRm91bmRhdGlvbjsgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqICBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiAgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiAgdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5CisgKiAgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisgKgorICogIENPTlRBQ1RTOgorICoKKyAqICBNYXJrIEFsbHluCQltYXJrLmEuYWxseW5AaW50ZWwuY29tCisgKiAgSmF5YW50IE1hbmdhbGFtcGFsbGkgamF5YW50Lm1hbmdhbGFtcGFsbGlAaW50ZWwuY29tCisgKgorICogIENIQU5HRVM6CisgKgorICogIDIwMTAuMDkuMTQgIFVwZ3JhZGUgdG8gTWVkZmllbGQKKyAqCisgKi8KKworI2lmbmRlZiBfX1NFUF9EUklWRVJfQVBJX0hfXworI2RlZmluZSBfX1NFUF9EUklWRVJfQVBJX0hfXworCisvKiBUeXBlIG9mIHJlcXVlc3QgZnJvbSBkZXZpY2UgKi8KKyNkZWZpbmUgU0VQX0RSSVZFUl9TUkNfUkVQTFkJCTEKKyNkZWZpbmUgU0VQX0RSSVZFUl9TUkNfUkVRCQkyCisjZGVmaW5lIFNFUF9EUklWRVJfU1JDX1BSSU5URgkJMworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFRZUEVERUZTCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoKKyAqIE5vdGUgdGhhdCBzZXZlcmFsIG1lbWJlcnMgb2YgdGhlc2Ugc3RydWN0cmVzIGFyZSBvbmx5IGhlcmUKKyAqIGZvciBjYW1wYXRhYmlsaXR5IHdpdGggdGhlIG1pZGRsZXdhcmU7IHRoZXkgYXJlIG5vdCB1c2VkCisgKiBieSB0aGlzIGRyaXZlci4KKyAqIEFsbCB1c2VyIHNwYWNlIGJ1ZmZlciBhZGRyZXNzZXMgYXJlIHNldCB0byBhbGlnbmVkIHU2NAorICogaW4gb3JkZXIgdG8gZW5zdXJlIGNvbXBhdGliaWxpdHkgd2l0aCA2NCBiaXQgc3lzdGVtcworICovCisKKy8qCisgIGluaXQgY29tbWFuZCBzdHJ1Y3Q7IHRoaXMgd2lsbCBnbyBhd2F5IHdoZW4gU0NVIGRvZXMgaW5pdAorKi8KK3N0cnVjdCBpbml0X3N0cnVjdCB7CisJLyogYWRkcmVzcyB0aGF0IFNFUCBjYW4gYWNjZXNzIGZvciBtZXNzYWdlICovCisJYWxpZ25lZF91NjQgICBtZXNzYWdlX2FkZHI7CisKKwkvKiBtZXNzYWdlIHNpemUgKi8KKwl1MzIgICBtZXNzYWdlX3NpemVfaW5fd29yZHM7CisKKwkvKiBvZmZzZXQgb2YgdGhlIGluaXQgbWVzc2FnZSBpbiB0aGUgc2VwIHNyYW0gKi8KKwl1MzIgICBzZXBfc3JhbV9hZGRyOworCisJLyogLW5vdCB1c2VkLSByZXNpZGVudCBzaXplIGluIGJ5dGVzKi8KKwl1MzIgICB1bnVzZWRfcmVzaWRlbnRfc2l6ZV9pbl9ieXRlczsKKworCS8qIC1ub3QgdXNlZC0gY2FjaGUgc2l6ZSBpbiBieXRlcyovCisJdTMyICAgdW51c2VkX2NhY2hlX3NpemVfaW5fYnl0ZXM7CisKKwkvKiAtbm90IHVzZWQtIGV4dCBjYWNoZSBjdXJyZW50IGFkZHJlc3MgKi8KKwlhbGlnbmVkX3U2NCAgIHVudXNlZF9leHRjYWNoZV9hZGRyOworCisJLyogLW5vdCB1c2VkLSBleHQgY2FjaGUgc2l6ZSBpbiBieXRlcyovCisJdTMyICAgdW51c2VkX2V4dGNhY2hlX3NpemVfaW5fYnl0ZXM7Cit9OworCitzdHJ1Y3QgcmVhbGxvY19leHRfc3RydWN0IHsKKwkvKiAtbm90IHVzZWQtIGN1cnJlbnQgZXh0ZXJuYWwgY2FjaGUgYWRkcmVzcyAqLworCWFsaWduZWRfdTY0ICAgdW51c2VkX2V4dF9jYWNoZV9hZGRyOworCisJLyogLW5vdCB1c2VkLSBleHRlcm5hbCBjYWNoZSBzaXplIGluIGJ5dGVzKi8KKwl1MzIgICB1bnVzZWRfZXh0X2NhY2hlX3NpemVfaW5fYnl0ZXM7Cit9OworCitzdHJ1Y3QgYWxsb2Nfc3RydWN0IHsKKwkvKiBvZmZzZXQgZnJvbSBzdGFydCBvZiBzaGFyZWQgcG9vbCBhcmVhICovCisJdTMyICBvZmZzZXQ7CisJLyogbnVtYmVyIG9mIGJ5dGVzIHRvIGFsbG9jYXRlICovCisJdTMyICBudW1fYnl0ZXM7Cit9OworCisvKgorCU5vdGUgdGhhdCBhbGwgYXBwIGFkZHJlc3NlcyBhcmUgY2FzdCBhcyB1MzI7IHRoZSBzZXAKKwltaWRkbGV3YXJlIHNlbmRzIHRoZW0gYXMgZml4ZWQgMzIgYml0IHdvcmRzCisqLworc3RydWN0IGJsZF9zeW5fdGFiX3N0cnVjdCB7CisJLyogYWRkcmVzcyB2YWx1ZSBvZiB0aGUgZGF0YSBpbiAodXNlciBzcGFjZSBhZGRyKSAqLworCWFsaWduZWRfdTY0IGFwcF9pbl9hZGRyZXNzOworCisJLyogc2l6ZSBvZiBkYXRhIGluICovCisJdTMyIGRhdGFfaW5fc2l6ZTsKKworCS8qIGFkZHJlc3Mgb2YgdGhlIGRhdGEgb3V0ICh1c2VyIHNwYWNlIGFkZHIpICovCisJYWxpZ25lZF91NjQgYXBwX291dF9hZGRyZXNzOworCisJLyogdGhlIHNpemUgb2YgdGhlIGJsb2NrIG9mIHRoZSBvcGVyYXRpb24gLSBpZiBuZWVkZWQsCisJICAgZXZlcnkgdGFibGUgd2lsbCBiZSBtb2R1bG8gdGhpcyBwYXJhbWV0ZXIgKi8KKwl1MzIgYmxvY2tfc2l6ZTsKKworCS8qIC1ub3QgdXNlZC0gZGlzdGluY3QgdXNlci9rZXJuZWwgbGF5b3V0ICovCisJYm9vbCBpc0tlcm5lbFZpcnR1YWxBZGRyZXNzOworCit9OworCisvKiBjb21tYW5kIHN0cnVjdCBmb3IgZ2V0dGluZyBjYWxsZXIgaWQgdmFsdWUgYW5kIGFkZHJlc3MgKi8KK3N0cnVjdCBjYWxsZXJfaWRfc3RydWN0IHsKKwkvKiBwaWQgb2YgdGhlIHByb2Nlc3MgKi8KKwl1MzIgcGlkOworCS8qIHZpcnR1YWwgYWRkcmVzcyBvZiB0aGUgY2FsbGVyIGlkIGhhc2ggKi8KKwlhbGlnbmVkX3U2NCBjYWxsZXJJZEFkZHJlc3M7CisJLyogY2FsbGVyIGlkIGhhc2ggc2l6ZSBpbiBieXRlcyAqLworCXUzMiBjYWxsZXJJZFNpemVJbkJ5dGVzOworfTsKKworLyoKKyAgc3RydWN0dXJlIHRoYXQgcmVwcmVzZW50cyBEQ0IKKyovCitzdHJ1Y3Qgc2VwX2RjYmxvY2sgeworCS8qIHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIGZpcnN0IGlucHV0IG1sbGkgKi8KKwl1MzIJaW5wdXRfbWxsaV9hZGRyZXNzOworCS8qIG51bSBvZiBlbnRyaWVzIGluIHRoZSBmaXJzdCBpbnB1dCBtbGxpICovCisJdTMyCWlucHV0X21sbGlfbnVtX2VudHJpZXM7CisJLyogc2l6ZSBvZiBkYXRhIGluIHRoZSBmaXJzdCBpbnB1dCBtbGxpICovCisJdTMyCWlucHV0X21sbGlfZGF0YV9zaXplOworCS8qIHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIGZpcnN0IG91dHB1dCBtbGxpICovCisJdTMyCW91dHB1dF9tbGxpX2FkZHJlc3M7CisJLyogbnVtIG9mIGVudHJpZXMgaW4gdGhlIGZpcnN0IG91dHB1dCBtbGxpICovCisJdTMyCW91dHB1dF9tbGxpX251bV9lbnRyaWVzOworCS8qIHNpemUgb2YgZGF0YSBpbiB0aGUgZmlyc3Qgb3V0cHV0IG1sbGkgKi8KKwl1MzIJb3V0cHV0X21sbGlfZGF0YV9zaXplOworCS8qIHBvaW50ZXIgdG8gdGhlIG91dHB1dCB2aXJ0dWFsIHRhaWwgKi8KKwl1MzIJb3V0X3ZyX3RhaWxfcHQ7CisJLyogc2l6ZSBvZiB0YWlsIGRhdGEgKi8KKwl1MzIJdGFpbF9kYXRhX3NpemU7CisJLyogaW5wdXQgdGFpbCBkYXRhIGFycmF5ICovCisJdTgJdGFpbF9kYXRhWzY0XTsKK307CisKK3N0cnVjdCBzZXBfY2FsbGVyX2lkX2VudHJ5IHsKKwlpbnQgcGlkOworCXVuc2lnbmVkIGNoYXIgY2FsbGVySWRIYXNoW1NFUF9DQUxMRVJfSURfSEFTSF9TSVpFX0lOX0JZVEVTXTsKK307CisKKy8qCisJY29tbWFuZCBzdHJ1Y3R1cmUgZm9yIGJ1aWxkaW5nIGRjYiBibG9jayAoY3VycmVudGx5IGZvciBleHQgYXBwIG9ubHkKKyovCitzdHJ1Y3QgYnVpbGRfZGNiX3N0cnVjdCB7CisJLyogYWRkcmVzcyB2YWx1ZSBvZiB0aGUgZGF0YSBpbiAqLworCWFsaWduZWRfdTY0IGFwcF9pbl9hZGRyZXNzOworCS8qIHNpemUgb2YgZGF0YSBpbiAqLworCXUzMiAgZGF0YV9pbl9zaXplOworCS8qIGFkZHJlc3Mgb2YgdGhlIGRhdGEgb3V0ICovCisJYWxpZ25lZF91NjQgYXBwX291dF9hZGRyZXNzOworCS8qIHRoZSBzaXplIG9mIHRoZSBibG9jayBvZiB0aGUgb3BlcmF0aW9uIC0gaWYgbmVlZGVkLAorCWV2ZXJ5IHRhYmxlIHdpbGwgYmUgbW9kdWxvIHRoaXMgcGFyYW1ldGVyICovCisJdTMyICBibG9ja19zaXplOworCS8qIHRoZSBzaXplIG9mIHRoZSBibG9jayBvZiB0aGUgb3BlcmF0aW9uIC0gaWYgbmVlZGVkLAorCWV2ZXJ5IHRhYmxlIHdpbGwgYmUgbW9kdWxvIHRoaXMgcGFyYW1ldGVyICovCisJdTMyICB0YWlsX2Jsb2NrX3NpemU7Cit9OworCisvKioKKyAqIEBzdHJ1Y3Qgc2VwX2RtYV9tYXAKKyAqCisgKiBTdHJ1Y3R1cmUgdGhhdCBjb250YWlucyBhbGwgaW5mb3JtYXRpb24gbmVlZGVkIGZvciBtYXBwaW5nIHRoZSB1c2VyIHBhZ2VzCisgKgkgICAgIG9yIGtlcm5lbCBidWZmZXJzIGZvciBkbWEgb3BlcmF0aW9ucworICoKKyAqCisgKi8KK3N0cnVjdCBzZXBfZG1hX21hcCB7CisJLyogbWFwcGVkIGRtYSBhZGRyZXNzICovCisJZG1hX2FkZHJfdCAgICBkbWFfYWRkcjsKKwkvKiBzaXplIG9mIHRoZSBtYXBwZWQgZGF0YSAqLworCXNpemVfdCAgICAgICAgc2l6ZTsKK307CisKK3N0cnVjdCBzZXBfZG1hX3Jlc291cmNlIHsKKwkvKiBhcnJheSBvZiBwb2ludGVycyB0byB0aGUgcGFnZXMgdGhhdCByZXByZXNlbnQKKwlpbnB1dCBkYXRhIGZvciB0aGUgc3luY2hyb25pYyBETUEgYWN0aW9uICovCisJc3RydWN0IHBhZ2UgKippbl9wYWdlX2FycmF5OworCisJLyogYXJyYXkgb2YgcG9pbnRlcnMgdG8gdGhlIHBhZ2VzIHRoYXQgcmVwcmVzZW50IG91dAorCWRhdGEgZm9yIHRoZSBzeW5jaHJvbmljIERNQSBhY3Rpb24gKi8KKwlzdHJ1Y3QgcGFnZSAqKm91dF9wYWdlX2FycmF5OworCisJLyogbnVtYmVyIG9mIHBhZ2VzIGluIHRoZSBzZXBfaW5fcGFnZV9hcnJheSAqLworCXUzMiBpbl9udW1fcGFnZXM7CisKKwkvKiBudW1iZXIgb2YgcGFnZXMgaW4gdGhlIHNlcF9vdXRfcGFnZV9hcnJheSAqLworCXUzMiBvdXRfbnVtX3BhZ2VzOworCisJLyogbWFwIGFycmF5IG9mIHRoZSBpbnB1dCBkYXRhICovCisJc3RydWN0IHNlcF9kbWFfbWFwICppbl9tYXBfYXJyYXk7CisKKwkvKiBtYXAgYXJyYXkgb2YgdGhlIG91dHB1dCBkYXRhICovCisJc3RydWN0IHNlcF9kbWFfbWFwICpvdXRfbWFwX2FycmF5OworCisJLyogbnVtYmVyIG9mIGVudHJpZXMgb2YgdGhlIGlucHV0IG1hcHAgYXJyYXkgKi8KKwl1MzIgaW5fbWFwX251bV9lbnRyaWVzOworCisJLyogbnVtYmVyIG9mIGVudHJpZXMgb2YgdGhlIG91dHB1dCBtYXBwIGFycmF5ICovCisJdTMyIG91dF9tYXBfbnVtX2VudHJpZXM7Cit9OworCisKKy8qIGNvbW1hbmQgc3RydWN0IGZvciB0cmFuc2xhdGluZyByYXIgaGFuZGxlIHRvIGJ1cyBhZGRyZXNzCisgICBhbmQgc2V0dGluZyBpdCBhdCBwcmVkZWZpbmVkIGxvY2F0aW9uICovCitzdHJ1Y3QgcmFyX2huZGxfdG9fYnVzX3N0cnVjdCB7CisKKwkvKiByYXIgaGFuZGxlICovCisJYWxpZ25lZF91NjQgcmFyX2hhbmRsZTsKK307CisKKy8qCisgIHN0cnVjdHVyZSB0aGF0IHJlcHJlc2VudCBvbmUgZW50cnkgaW4gdGhlIERNQSBMTEkgdGFibGUKKyovCitzdHJ1Y3Qgc2VwX2xsaV9lbnRyeSB7CisJLyogcGh5c2ljYWwgYWRkcmVzcyAqLworCXUzMiBidXNfYWRkcmVzczsKKworCS8qIGJsb2NrIHNpemUgKi8KKwl1MzIgYmxvY2tfc2l6ZTsKK307CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCUlPQ1RMIGNvbW1hbmQgZGVmaW5lcworCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogbWFnaWMgbnVtYmVyIDEgb2YgdGhlIHNlcCBJT0NUTCBjb21tYW5kICovCisjZGVmaW5lIFNFUF9JT0NfTUFHSUNfTlVNQkVSCSAgICAgICAgICAgICAgICAgICAgICdzJworCisvKiBzZW5kcyBpbnRlcnJ1cHQgdG8gc2VwIHRoYXQgbWVzc2FnZSBpcyByZWFkeSAqLworI2RlZmluZSBTRVBfSU9DU0VORFNFUENPTU1BTkQJIFwKKwlfSU8oU0VQX0lPQ19NQUdJQ19OVU1CRVIsIDApCisKKy8qIHNlbmRzIGludGVycnVwdCB0byBzZXAgdGhhdCBtZXNzYWdlIGlzIHJlYWR5ICovCisjZGVmaW5lIFNFUF9JT0NTRU5EU0VQUlBMWUNPTU1BTkQJIFwKKwlfSU8oU0VQX0lPQ19NQUdJQ19OVU1CRVIsIDEpCisKKy8qIGFsbG9jYXRlIG1lbW9yeSBpbiBkYXRhIHBvb2wgKi8KKyNkZWZpbmUgU0VQX0lPQ0FMTE9DREFUQVBPTEwJXAorCV9JT1coU0VQX0lPQ19NQUdJQ19OVU1CRVIsIDIsIHN0cnVjdCBhbGxvY19zdHJ1Y3QpCisKKy8qIGNyZWF0ZSBzeW0gZG1hIGxsaSB0YWJsZXMgKi8KKyNkZWZpbmUgU0VQX0lPQ0NSRUFURVNZTURNQVRBQkxFCVwKKwlfSU9XKFNFUF9JT0NfTUFHSUNfTlVNQkVSLCA1LCBzdHJ1Y3QgYmxkX3N5bl90YWJfc3RydWN0KQorCisvKiBmcmVlIGR5bmFtaWMgZGF0YSBhYWxvY2F0ZWQgZHVyaW5nIHRhYmxlIGNyZWF0aW9uICovCisjZGVmaW5lIFNFUF9JT0NGUkVFRE1BVEFCTEVEQVRBCSBcCisJX0lPKFNFUF9JT0NfTUFHSUNfTlVNQkVSLCA3KQorCisvKiBnZXQgdGhlIHN0YXRpYyBwb29sIGFyZWEgYWRkZXJzc2VzIChwaHlzaWNhbCBhbmQgdmlydHVhbCkgKi8KKyNkZWZpbmUgU0VQX0lPQ0dFVFNUQVRJQ1BPT0xBRERSCVwKKwlfSU8oU0VQX0lPQ19NQUdJQ19OVU1CRVIsIDgpCisKKy8qIHN0YXJ0IHNlcCBjb21tYW5kICovCisjZGVmaW5lIFNFUF9JT0NTRVBTVEFSVAkgXAorCV9JTyhTRVBfSU9DX01BR0lDX05VTUJFUiwgMTIpCisKKy8qIGluaXQgc2VwIGNvbW1hbmQgKi8KKyNkZWZpbmUgU0VQX0lPQ1NFUElOSVQJXAorCV9JT1coU0VQX0lPQ19NQUdJQ19OVU1CRVIsIDEzLCBzdHJ1Y3QgaW5pdF9zdHJ1Y3QpCisKKy8qIGVuZCB0cmFuc2FjdGlvbiBjb21tYW5kICovCisjZGVmaW5lIFNFUF9JT0NFTkRUUkFOU0FDVElPTgkgXAorCV9JTyhTRVBfSU9DX01BR0lDX05VTUJFUiwgMTUpCisKKy8qIHJlYWxsb2NhdGUgZXh0ZXJuYWwgYXBwOyB1bnVzZWQgc3RydWN0dXJlIHN0aWxsIG5lZWRlZCBmb3IKKyAqIGNvbXBhdGFiaWxpdHkgd2l0aCBtaWRkbGV3YXJlICovCisjZGVmaW5lIFNFUF9JT0NSRUFMTE9DRVhUQ0FDSEUJXAorCV9JT1coU0VQX0lPQ19NQUdJQ19OVU1CRVIsIDE4LCBzdHJ1Y3QgcmVhbGxvY19leHRfc3RydWN0KQorCisjZGVmaW5lIFNFUF9JT0NSQVJQUkVQQVJFTUVTU0FHRQlcCisJX0lPVyhTRVBfSU9DX01BR0lDX05VTUJFUiwgMjAsIHN0cnVjdCByYXJfaG5kbF90b19idXNfc3RydWN0KQorCisjZGVmaW5lIFNFUF9JT0NUTFNFVENBTExFUklECVwKKwlfSU9XKFNFUF9JT0NfTUFHSUNfTlVNQkVSLCAzNCwgc3RydWN0IGNhbGxlcl9pZF9zdHJ1Y3QpCisKKyNkZWZpbmUgU0VQX0lPQ1BSRVBBUkVEQ0IJCQkJCVwKKwlfSU9XKFNFUF9JT0NfTUFHSUNfTlVNQkVSLCAzNSwgc3RydWN0IGJ1aWxkX2RjYl9zdHJ1Y3QpCisKKyNkZWZpbmUgU0VQX0lPQ0ZSRUVEQ0IJCQkJCVwKKwlfSU8oU0VQX0lPQ19NQUdJQ19OVU1CRVIsIDM2KQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zZXAvc2VwX2RyaXZlcl9jb25maWcuaCBiL2RyaXZlcnMvc3RhZ2luZy9zZXAvc2VwX2RyaXZlcl9jb25maWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTg2MjVkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3NlcC9zZXBfZHJpdmVyX2NvbmZpZy5oCkBAIC0wLDAgKzEsMjM5IEBACisvKgorICoKKyAqICBzZXBfZHJpdmVyX2NvbmZpZy5oIC0gU2VjdXJpdHkgUHJvY2Vzc29yIERyaXZlciBjb25maWd1cmF0aW9uCisgKgorICogIENvcHlyaWdodChjKSAyMDA5LDIwMTAgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiAgQ29udHJpYnV0aW9ucyhjKSAyMDA5LDIwMTAgRGlzY3JldGl4LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiAgU29mdHdhcmUgRm91bmRhdGlvbjsgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqICBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiAgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiAgdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5CisgKiAgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisgKgorICogIENPTlRBQ1RTOgorICoKKyAqICBNYXJrIEFsbHluCQltYXJrLmEuYWxseW5AaW50ZWwuY29tCisgKiAgSmF5YW50IE1hbmdhbGFtcGFsbGkgamF5YW50Lm1hbmdhbGFtcGFsbGlAaW50ZWwuY29tCisgKgorICogIENIQU5HRVM6CisgKgorICogIDIwMTAuMDYuMjYJVXBncmFkZSB0byBNZWRmaWVsZAorICoKKyAqLworCisjaWZuZGVmIF9fU0VQX0RSSVZFUl9DT05GSUdfSF9fCisjZGVmaW5lIF9fU0VQX0RSSVZFUl9DT05GSUdfSF9fCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBEUklWRVIgQ09ORklHVVJBVElPTiBGTEFHUworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogaWYgZmxhZyBpcyBvbiAsIHRoZW4gdGhlIGRyaXZlciBpcyBydW5uaW5nIGluIHBvbGxpbmcgYW5kCisJbm90IGludGVycnVwdCBtb2RlICovCisjZGVmaW5lIFNFUF9EUklWRVJfUE9MTElOR19NT0RFICAgICAgICAgICAgICAgICAgICAgICAgIDAKKworLyogZmxhZyB3aGljaCBkZWZpbmVzIGlmIHRoZSBzaGFyZWQgYXJlYSBhZGRyZXNzIHNob3VsZCBiZQorCXJlY29uZmlnZWQgKHNlbmQgdG8gU0VQIGFuZXcpIGR1cmluZyBpbml0IG9mIHRoZSBkcml2ZXIgKi8KKyNkZWZpbmUgU0VQX0RSSVZFUl9SRUNPTkZJR19NRVNTQUdFX0FSRUEgICAgICAgICAgICAgICAgMAorCisvKiB0aGUgbW9kZSBmb3IgcnVubmluZyBvbiB0aGUgQVJNMTE3MiBFdmFsdWF0aW9uIHBsYXRmb3JtIChmbGFnIGlzIDEpICovCisjZGVmaW5lIFNFUF9EUklWRVJfQVJNX0RFQlVHX01PREUgICAgICAgICAgICAgICAgICAgICAgIDAKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJSU5URVJOQUwgREFUQSBDT05GSUdVUkFUSU9OCisJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIGZsYWcgZm9yIHRoZSBpbnB1dCBhcnJheSAqLworI2RlZmluZSBTRVBfRFJJVkVSX0lOX0ZMQUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwCisKKy8qIGZsYWcgZm9yIG91dHB1dCBhcnJheSAqLworI2RlZmluZSBTRVBfRFJJVkVSX09VVF9GTEFHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxCisKKy8qIG1heGltdW0gbnVtYmVyIG9mIGVudHJpZXMgaW4gb25lIExMSSB0YWJsZXMgKi8KKyNkZWZpbmUgU0VQX0RSSVZFUl9FTlRSSUVTX1BFUl9UQUJMRV9JTl9TRVAgICAgICAgICAgICAgMzEKKworLyogbWluaW11bSBkYXRhIHNpemUgb2YgdGhlIE1MTEkgdGFibGUgKi8KKyNkZWZpbmUgU0VQX0RSSVZFUl9NSU5fREFUQV9TSVpFX1BFUl9UQUJMRQkJMTYKKworLyogZmxhZyB0aGF0IHNpZ25pZmllcyB0YWggdGhlIGxvY2sgaXMKK2N1cnJlbnRseSBoZWxkIGJ5IHRoZSBwcm9jY2VzcyAoc3RydWN0IGZpbGUpICovCisjZGVmaW5lIFNFUF9EUklWRVJfT1dOX0xPQ0tfRkxBRyAgICAgICAgICAgICAgICAgICAgICAgIDEKKworLyogZmxhZyB0aGF0IHNpZ25pZmllcyB0YWggdGhlIGxvY2sgaXMgY3VycmVudGx5IE5PVAoraGVsZCBieSB0aGUgcHJvY2Nlc3MgKHN0cnVjdCBmaWxlKSAqLworI2RlZmluZSBTRVBfRFJJVkVSX0RJU09XTl9MT0NLX0ZMQUcgICAgICAgICAgICAgICAgICAgICAwCisKKy8qIGluZGljYXRlcyB3aGV0aGVyIGRyaXZlciBoYXMgbWFwcGVkL3VubWFwcGVkIHNoYXJlZCBhcmVhICovCisjZGVmaW5lIFNFUF9SRVFVRVNUX0RBRU1PTl9NQVBQRUQgMQorI2RlZmluZSBTRVBfUkVRVUVTVF9EQUVNT05fVU5NQVBQRUQgMAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJU0hBUkVEIEFSRUEgIG1lbW9yeSB0b3RhbCBzaXplIGlzIDM2SworCWl0IGlzIGRpdmlkZWQgaXMgZm9sbG93aW5nOgorCisJU0hBUkVEX01FU1NBR0VfQVJFQSAgICAgICAgICAgICAgICAgICAgIDhLICAgICAgICAgfQorCQkJCQkJCQkJfQorCVNUQVRJQ19QT09MX0FSRUEgICAgICAgICAgICAgICAgICAgICAgICA0SyAgICAgICAgIH0gTUFQUEVEIEFSRUEgKCAyNCBLKQorCQkJCQkJCQkJfQorCURBVEFfUE9PTF9BUkVBICAgICAgICAgICAgICAgICAgICAgICAgICAxMksgICAgICAgIH0KKworCVNZTkNIUk9OSUNfRE1BX1RBQkxFU19BUkVBICAgICAgICAgICAgICA1SworCisJcGxhY2Vob2xkZXIgdW50aWwgZHJ2ZXIgY2hhbmdlcworCUZMT1dfRE1BX1RBQkxFU19BUkVBICAgICAgICAgICAgICAgICAgICA0SworCisJU1lTVEVNX01FTU9SWV9BUkVBICAgICAgICAgICAgICAgICAgICAgIDNrCisKKwlTWVNURU1fTUVNT1JZIHRvdGFsIHNpemUgaXMgM2sKKwlpdCBpcyBkaXZpZGVkIGFzIGZvbGxvd2luZzoKKworCVRJTUVfTUVNT1JZX0FSRUEgICAgICAgICAgICAgICAgICAgICA4QgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjZGVmaW5lIFNFUF9ERVZfTkFNRSAic2VwX3NlY19kcml2ZXIiCisjZGVmaW5lIFNFUF9ERVZfU0lOR0xFVE9OICJzZXBfc2VjX3NpbmdsZXRvbl9kcml2ZXIiCisjZGVmaW5lIFNFUF9ERVZfREFFTU9OICJzZXBfcmVxX2RhZW1vbl9kcml2ZXIiCisKKworLyoKKwl0aGUgbWF4aW11bSBsZW5ndGggb2YgdGhlIG1lc3NhZ2UgLSB0aGUgcmVzdCBvZiB0aGUgbWVzc2FnZSBzaGFyZWQKKwlhcmVhIHdpbGwgYmUgZGVkaWNhdGVkIHRvIHRoZSBkbWEgbGxpIHRhYmxlcworKi8KKyNkZWZpbmUgU0VQX0RSSVZFUl9NQVhfTUVTU0FHRV9TSVpFX0lOX0JZVEVTCQkJKDggKiAxMDI0KQorCisvKiB0aGUgc2l6ZSBvZiB0aGUgbWVzc2FnZSBzaGFyZWQgYXJlYSBpbiBwYWdlcyAqLworI2RlZmluZSBTRVBfRFJJVkVSX01FU1NBR0VfU0hBUkVEX0FSRUFfU0laRV9JTl9CWVRFUwkJKDggKiAxMDI0KQorCisvKiB0aGUgc2l6ZSBvZiB0aGUgZGF0YSBwb29sIHN0YXRpYyBhcmVhIGluIHBhZ2VzICovCisjZGVmaW5lIFNFUF9EUklWRVJfU1RBVElDX0FSRUFfU0laRV9JTl9CWVRFUwkJCSg0ICogMTAyNCkKKworLyogdGhlIHNpemUgb2YgdGhlIGRhdGEgcG9vbCBzaGFyZWQgYXJlYSBzaXplIGluIHBhZ2VzICovCisjZGVmaW5lIFNFUF9EUklWRVJfREFUQV9QT09MX1NIQVJFRF9BUkVBX1NJWkVfSU5fQllURVMJCSgxNiAqIDEwMjQpCisKKy8qIHRoZSBzaXplIG9mIHRoZSBtZXNzYWdlIHNoYXJlZCBhcmVhIGluIHBhZ2VzICovCisjZGVmaW5lIFNZTkNIUk9OSUNfRE1BX1RBQkxFU19BUkVBX1NJWkVfQllURVMJKDEwMjQgKiA1KQorCisvKiBQbGFjZWhvbGRlciB1bnRpbCBkcml2ZXIgY2hhbmdlcyAqLworI2RlZmluZSBTRVBfRFJJVkVSX0ZMT1dfRE1BX1RBQkxFU19BUkVBX1NJWkVfSU5fQllURVMJCSgxMDI0ICogNCkKKworLyogc3lzdGVtIGRhdGEgKHRpbWUsIGNhbGxlciBpZCBldGMnKSBwb29sICovCisjZGVmaW5lIFNFUF9EUklWRVJfU1lTVEVNX0RBVEFfTUVNT1JZX1NJWkVfSU5fQllURVMJCSgxMDI0ICogMykKKworLyogdGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIHRpbWUgbWVtb3J5ICovCisjZGVmaW5lIFNFUF9EUklWRVJfVElNRV9NRU1PUllfU0laRV9JTl9CWVRFUwkJCTgKKworLyogdGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIFJBUiBwYXJhbWV0ZXJzIG1lbW9yeSAqLworI2RlZmluZSBTRVBfRFJJVkVSX1NZU1RFTV9SQVJfTUVNT1JZX1NJWkVfSU5fQllURVMJCTgKKworLyogYXJlYSBzaXplIHRoYXQgaXMgbWFwcGVkICAtIHdlIG1hcCB0aGUgTUVTU0FHRSBBUkVBLCBTVEFUSUMgUE9PTCBhbmQKKwlEQVRBIFBPT0wgYXJlYXMuIGFyZWEgbXVzdCBiZSBtb2R1bGUgNGsgKi8KKyNkZWZpbmUgU0VQX0RSSVZFUl9NTU1BUF9BUkVBX1NJWkUJCQkJKDEwMjQgKiAyOCkKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCW9mZnNldHMgb2YgdGhlIGFyZWFzIHN0YXJ0aW5nIGZyb20gdGhlIHNoYXJlZCBhcmVhIHN0YXJ0IGFkZHJlc3MKKyovCisKKy8qIG1lc3NhZ2UgYXJlYSBvZmZzZXQgKi8KKyNkZWZpbmUgU0VQX0RSSVZFUl9NRVNTQUdFX0FSRUFfT0ZGU0VUX0lOX0JZVEVTCQkJMAorCisvKiBzdGF0aWMgcG9vbCBhcmVhIG9mZnNldCAqLworI2RlZmluZSBTRVBfRFJJVkVSX1NUQVRJQ19BUkVBX09GRlNFVF9JTl9CWVRFUyBcCisJKFNFUF9EUklWRVJfTUVTU0FHRV9TSEFSRURfQVJFQV9TSVpFX0lOX0JZVEVTKQorCisvKiBkYXRhIHBvb2wgYXJlYSBvZmZzZXQgKi8KKyNkZWZpbmUgU0VQX0RSSVZFUl9EQVRBX1BPT0xfQVJFQV9PRkZTRVRfSU5fQllURVMgXAorCShTRVBfRFJJVkVSX1NUQVRJQ19BUkVBX09GRlNFVF9JTl9CWVRFUyArIFwKKwlTRVBfRFJJVkVSX1NUQVRJQ19BUkVBX1NJWkVfSU5fQllURVMpCisKKy8qIHN5bmhyb25pYyBkbWEgdGFibGVzIGFyZWEgb2Zmc2V0ICovCisjZGVmaW5lIFNZTkNIUk9OSUNfRE1BX1RBQkxFU19BUkVBX09GRlNFVF9CWVRFUyBcCisJKFNFUF9EUklWRVJfREFUQV9QT09MX0FSRUFfT0ZGU0VUX0lOX0JZVEVTICsgXAorCVNFUF9EUklWRVJfREFUQV9QT09MX1NIQVJFRF9BUkVBX1NJWkVfSU5fQllURVMpCisKKy8qIHN5c3RlbSBtZW1vcnkgb2Zmc2V0IGluIGJ5dGVzICovCisjZGVmaW5lIFNFUF9EUklWRVJfU1lTVEVNX0RBVEFfTUVNT1JZX09GRlNFVF9JTl9CWVRFUyBcCisJKFNZTkNIUk9OSUNfRE1BX1RBQkxFU19BUkVBX09GRlNFVF9CWVRFUyArIFwKKwlTWU5DSFJPTklDX0RNQV9UQUJMRVNfQVJFQV9TSVpFX0JZVEVTKQorCisvKiBvZmZzZXQgb2YgdGhlIHRpbWUgYXJlYSAqLworI2RlZmluZSBTRVBfRFJJVkVSX1NZU1RFTV9USU1FX01FTU9SWV9PRkZTRVRfSU5fQllURVMgXAorCShTRVBfRFJJVkVSX1NZU1RFTV9EQVRBX01FTU9SWV9PRkZTRVRfSU5fQllURVMpCisKKy8qIG9mZnNldCBvZiB0aGUgUkFSIGFyZWEgKi8KKyNkZWZpbmUgU0VQX0RSSVZFUl9TWVNURU1fUkFSX01FTU9SWV9PRkZTRVRfSU5fQllURVMgXAorCShTRVBfRFJJVkVSX1NZU1RFTV9USU1FX01FTU9SWV9PRkZTRVRfSU5fQllURVMgKyBcCisJU0VQX0RSSVZFUl9USU1FX01FTU9SWV9TSVpFX0lOX0JZVEVTKQorCisvKiBvZmZzZXQgb2YgdGhlIGNhbGxlciBpZCBhcmVhICovCisjZGVmaW5lIFNFUF9DQUxMRVJfSURfT0ZGU0VUX0JZVEVTIFwKKwkoU0VQX0RSSVZFUl9TWVNURU1fUkFSX01FTU9SWV9PRkZTRVRfSU5fQllURVMgKyBcCisgICAgU0VQX0RSSVZFUl9TWVNURU1fUkFSX01FTU9SWV9TSVpFX0lOX0JZVEVTKQorCisvKiBvZmZzZXQgb2YgdGhlIERDQiBhcmVhICovCisjZGVmaW5lIFNFUF9EUklWRVJfU1lTVEVNX0RDQl9NRU1PUllfT0ZGU0VUX0lOX0JZVEVTIFwKKwkoU0VQX0RSSVZFUl9TWVNURU1fREFUQV9NRU1PUllfT0ZGU0VUX0lOX0JZVEVTICsgXAorCTB4NDAwKQorCisvKiBvZmZzZXQgb2YgdGhlIGV4dCBjYWNoZSBhcmVhICovCisjZGVmaW5lIFNFUF9EUklWRVJfU1lTVEVNX0VYVF9DQUNIRV9BRERSX09GRlNFVF9JTl9CWVRFUyBcCisJU0VQX0RSSVZFUl9TWVNURU1fUkFSX01FTU9SWV9PRkZTRVRfSU5fQllURVMKKworLyogb2Zmc2V0IG9mIHRoZSBhbGxvY2F0aW9uIGRhdGEgcG9pbnRlciBhcmVhICovCisjZGVmaW5lIFNFUF9EUklWRVJfREFUQV9QT09MX0FMTE9DQVRJT05fT0ZGU0VUX0lOX0JZVEVTIFwKKwkoU0VQX0NBTExFUl9JRF9PRkZTRVRfQllURVMgKyBcCisJU0VQX0NBTExFUl9JRF9IQVNIX1NJWkVfSU5fQllURVMpCisKKy8qIHRoZSB0b2tlbiB0aGF0IGRlZmluZXMgdGhlIHN0YXJ0IG9mIHRpbWUgYWRkcmVzcyAqLworI2RlZmluZSBTRVBfVElNRV9WQUxfVE9LRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEyMzQ1Njc4CisKKyNkZWZpbmUgRkFLRV9SQVJfU0laRSAoMTAyNCoxMDI0KSAvKiB1c2VkIG9ubHkgZm9yIG1mbGQgKi8KKy8qIERFQlVHIExFVkVMIE1BU0tTICovCisKKy8qIHNpemUgb2YgdGhlIGNhbGxlciBpZCBoYXNoIChzaGEyKSAqLworI2RlZmluZSBTRVBfQ0FMTEVSX0lEX0hBU0hfU0laRV9JTl9CWVRFUyAgICAgICAgICAgICAgICAgICAgICAzMgorCisvKiBzaXplIG9mIHRoZSBjYWxsZXIgaWQgaGFzaCAoc2hhMikgaW4gMzIgYml0IHdvcmRzICovCisjZGVmaW5lIFNFUF9DQUxMRVJfSURfSEFTSF9TSVpFX0lOX1dPUkRTICAgICAgICAgICAgICAgIDgKKworLyogbWF4aW11bSBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgY2FsbGVyIGlkIHRhYmxlICovCisjZGVmaW5lIFNFUF9DQUxMRVJfSURfVEFCTEVfTlVNX0VOVFJJRVMgICAgICAgICAgICAgICAgICAgICAgIDIwCisKKy8qIG1heGltdW0gbnVtYmVyIG9mIHN5bWV0cmljIG9wZXJhdGlvbiAodGhhdCByZXF1aXJlIERNQSByZXNvdXJjZSkKKwlwZXIgb25lIG1lc3NhZ2UgKi8KKyNkZWZpbmUgU0VQX01BWF9OVU1fU1lOQ19ETUFfT1BTCQkJMTYKKworLyogdGhlIHRva2VuIHRoYXQgZGVmaW5lcyB0aGUgc3RhcnQgb2YgdGltZSBhZGRyZXNzICovCisjZGVmaW5lIFNFUF9SQVJfVkFMX1RPS0VOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4QUJBQkFCQUIKKworLyogaW9jdGwgZXJyb3IgdGhhdCBzaG91bGQgYmUgcmV0dXJuZWQgd2hlbiB0cnlpbmcKKyAgIHRvIHJlYWxsb2MgdGhlIGNhY2hlL3Jlc2lkZW50IHNlY29uZCB0aW1lICovCisjZGVmaW5lIFNFUF9BTFJFQURZX0lOSVRJQUxJWkVEX0VSUiAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyCisKKy8qIGJpdCB0aGF0IGxvY2tzIGFjY2VzcyB0byB0aGUgc2hhcmVkIGFyZWEgKi8KKyNkZWZpbmUgU0VQX01NQVBfTE9DS19CSVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMAorCisvKiBiaXQgdGhhdCBsb2NrIGFjY2VzcyB0byB0aGUgcG9sbCAgLSBhZnRlciBzZW5kX2NvbW1hbmQgKi8KKyNkZWZpbmUgU0VQX1NFTkRfTVNHX0xPQ0tfQklUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMQorCisvKiB0aGUgdG9rZW4gdGhhdCBkZWZpbmVzIHRoZSBzdGF0aWMgcG9vbCBhZGRyZXNzIGFkZHJlc3MgKi8KKyNkZWZpbmUgU0VQX1NUQVRJQ19QT09MX1ZBTF9UT0tFTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhBQkJBQUJCQQorCisvKiB0aGUgdG9rZW4gdGhhdCBkZWZpbmVzIHRoZSBkYXRhIHBvb2wgcG9pbnRlcnMgYWRkcmVzcyAqLworI2RlZmluZSBTRVBfREFUQV9QT09MX1BPSU5URVJTX1ZBTF9UT0tFTiAgICAgICAgICAgICAgICAgICAgICAweEVEREVFRERFCisKKy8qIHRoZSB0b2tlbiB0aGF0IGRlZmluZXMgdGhlIGRhdGEgcG9vbCBwb2ludGVycyBhZGRyZXNzICovCisjZGVmaW5lIFNFUF9FWFRfQ0FDSEVfQUREUl9WQUxfVE9LRU4gICAgICAgICAgICAgICAgICAgICAgICAgIDB4QkFCQUJBQkEKKworLyogVGltZSBsaW1pdCBmb3IgU0VQIHRvIGZpbmlzaCAqLworI2RlZmluZSBXQUlUX1RJTUUgMTAKKworI2VuZGlmIC8qIFNFUCBEUklWRVIgQ09ORklHICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc2VwL3NlcF9kcml2ZXJfaHdfZGVmcy5oIGIvZHJpdmVycy9zdGFnaW5nL3NlcC9zZXBfZHJpdmVyX2h3X2RlZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDBmOTA5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3NlcC9zZXBfZHJpdmVyX2h3X2RlZnMuaApAQCAtMCwwICsxLDIzMyBAQAorLyoKKyAqCisgKiAgc2VwX2RyaXZlcl9od19kZWZzLmggLSBTZWN1cml0eSBQcm9jZXNzb3IgRHJpdmVyIGhhcmR3YXJlIGRlZmluaXRpb25zCisgKgorICogIENvcHlyaWdodChjKSAyMDA5LDIwMTAgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiAgQ29udHJpYnV0aW9ucyhjKSAyMDA5LDIwMTAgRGlzY3JldGl4LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiAgU29mdHdhcmUgRm91bmRhdGlvbjsgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqICBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiAgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiAgdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5CisgKiAgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisgKgorICogIENPTlRBQ1RTOgorICoKKyAqICBNYXJrIEFsbHluCQltYXJrLmEuYWxseW5AaW50ZWwuY29tCisgKiAgSmF5YW50IE1hbmdhbGFtcGFsbGkgamF5YW50Lm1hbmdhbGFtcGFsbGlAaW50ZWwuY29tCisgKgorICogIENIQU5HRVM6CisgKgorICogIDIwMTAuMDkuMjAJVXBncmFkZSB0byBNZWRmaWVsZAorICoKKyAqLworCisjaWZuZGVmIFNFUF9EUklWRVJfSFdfREVGU19fSAorI2RlZmluZSBTRVBfRFJJVkVSX0hXX0RFRlNfX0gKKworLyogUENJIElEJ3MgKi8KKyNkZWZpbmUgTUZMRF9QQ0lfREVWSUNFX0lEIDB4MDgyNgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBIVyBSZWdpc3RlcnMgRGVmaW5lcy4gICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLSovCisKKworLyogY2YgcmVnaXN0ZXJzICovCisjZGVmaW5lCQlIV19SMEJfQUREUl8wX1JFR19BRERSCQkJMHgwMDAwVUwKKyNkZWZpbmUJCUhXX1IwQl9BRERSXzFfUkVHX0FERFIJCQkweDAwMDRVTAorI2RlZmluZQkJSFdfUjBCX0FERFJfMl9SRUdfQUREUgkJCTB4MDAwOFVMCisjZGVmaW5lCQlIV19SMEJfQUREUl8zX1JFR19BRERSCQkJMHgwMDBjVUwKKyNkZWZpbmUJCUhXX1IwQl9BRERSXzRfUkVHX0FERFIJCQkweDAwMTBVTAorI2RlZmluZQkJSFdfUjBCX0FERFJfNV9SRUdfQUREUgkJCTB4MDAxNFVMCisjZGVmaW5lCQlIV19SMEJfQUREUl82X1JFR19BRERSCQkJMHgwMDE4VUwKKyNkZWZpbmUJCUhXX1IwQl9BRERSXzdfUkVHX0FERFIJCQkweDAwMWNVTAorI2RlZmluZQkJSFdfUjBCX0FERFJfOF9SRUdfQUREUgkJCTB4MDAyMFVMCisjZGVmaW5lCQlIV19SMkJfQUREUl8wX1JFR19BRERSCQkJMHgwMDgwVUwKKyNkZWZpbmUJCUhXX1IyQl9BRERSXzFfUkVHX0FERFIJCQkweDAwODRVTAorI2RlZmluZQkJSFdfUjJCX0FERFJfMl9SRUdfQUREUgkJCTB4MDA4OFVMCisjZGVmaW5lCQlIV19SMkJfQUREUl8zX1JFR19BRERSCQkJMHgwMDhjVUwKKyNkZWZpbmUJCUhXX1IyQl9BRERSXzRfUkVHX0FERFIJCQkweDAwOTBVTAorI2RlZmluZQkJSFdfUjJCX0FERFJfNV9SRUdfQUREUgkJCTB4MDA5NFVMCisjZGVmaW5lCQlIV19SMkJfQUREUl82X1JFR19BRERSCQkJMHgwMDk4VUwKKyNkZWZpbmUJCUhXX1IyQl9BRERSXzdfUkVHX0FERFIJCQkweDAwOWNVTAorI2RlZmluZQkJSFdfUjJCX0FERFJfOF9SRUdfQUREUgkJCTB4MDBhMFVMCisjZGVmaW5lCQlIV19SM0JfUkVHX0FERFIJCQkJMHgwMEMwVUwKKyNkZWZpbmUJCUhXX1I0Ql9SRUdfQUREUgkJCQkweDAxMDBVTAorI2RlZmluZQkJSFdfQ1NBX0FERFJfMF9SRUdfQUREUgkJCTB4MDE0MFVMCisjZGVmaW5lCQlIV19DU0FfQUREUl8xX1JFR19BRERSCQkJMHgwMTQ0VUwKKyNkZWZpbmUJCUhXX0NTQV9BRERSXzJfUkVHX0FERFIJCQkweDAxNDhVTAorI2RlZmluZQkJSFdfQ1NBX0FERFJfM19SRUdfQUREUgkJCTB4MDE0Y1VMCisjZGVmaW5lCQlIV19DU0FfQUREUl80X1JFR19BRERSCQkJMHgwMTUwVUwKKyNkZWZpbmUJCUhXX0NTQV9BRERSXzVfUkVHX0FERFIJCQkweDAxNTRVTAorI2RlZmluZQkJSFdfQ1NBX0FERFJfNl9SRUdfQUREUgkJCTB4MDE1OFVMCisjZGVmaW5lCQlIV19DU0FfQUREUl83X1JFR19BRERSCQkJMHgwMTVjVUwKKyNkZWZpbmUJCUhXX0NTQV9BRERSXzhfUkVHX0FERFIJCQkweDAxNjBVTAorI2RlZmluZQkJSFdfQ1NBX1JFR19BRERSCQkJCTB4MDE0MFVMCisjZGVmaW5lCQlIV19TSU5CX1JFR19BRERSCQkJMHgwMTgwVUwKKyNkZWZpbmUJCUhXX1NPVVRCX1JFR19BRERSCQkJMHgwMTg0VUwKKyNkZWZpbmUJCUhXX1BLSV9DT05UUk9MX1JFR19BRERSCQkJMHgwMUMwVUwKKyNkZWZpbmUJCUhXX1BLSV9TVEFUVVNfUkVHX0FERFIJCQkweDAxQzRVTAorI2RlZmluZQkJSFdfUEtJX0JVU1lfUkVHX0FERFIJCQkweDAxQzhVTAorI2RlZmluZQkJSFdfUEtJX0FfMTAyNV9SRUdfQUREUgkJCTB4MDFDQ1VMCisjZGVmaW5lCQlIV19QS0lfU0RNQV9DVExfUkVHX0FERFIJCTB4MDFEMFVMCisjZGVmaW5lCQlIV19QS0lfU0RNQV9PRkZTRVRfUkVHX0FERFIJCTB4MDFENFVMCisjZGVmaW5lCQlIV19QS0lfU0RNQV9QT0lOVEVSU19SRUdfQUREUgkJMHgwMUQ4VUwKKyNkZWZpbmUJCUhXX1BLSV9TRE1BX0RMRU5HX1JFR19BRERSCQkweDAxRENVTAorI2RlZmluZQkJSFdfUEtJX1NETUFfRVhQX1BPSU5URVJTX1JFR19BRERSCTB4MDFFMFVMCisjZGVmaW5lCQlIV19QS0lfU0RNQV9SRVNfUE9JTlRFUlNfUkVHX0FERFIJMHgwMUU0VUwKKyNkZWZpbmUJCUhXX1BLSV9DTFJfUkVHX0FERFIJCQkweDAxRThVTAorI2RlZmluZQkJSFdfUEtJX1NETUFfQlVTWV9SRUdfQUREUgkJMHgwMUU4VUwKKyNkZWZpbmUJCUhXX1BLSV9TRE1BX0ZJUlNUX0VYUF9OX1JFR19BRERSCTB4MDFFQ1VMCisjZGVmaW5lCQlIV19QS0lfU0RNQV9NVUxfQlkxX1JFR19BRERSCQkweDAxRjBVTAorI2RlZmluZQkJSFdfUEtJX1NETUFfUk1VTF9TRUxfUkVHX0FERFIJCTB4MDFGNFVMCisjZGVmaW5lCQlIV19ERVNfS0VZXzBfUkVHX0FERFIJCQkweDAyMDhVTAorI2RlZmluZQkJSFdfREVTX0tFWV8xX1JFR19BRERSCQkJMHgwMjBDVUwKKyNkZWZpbmUJCUhXX0RFU19LRVlfMl9SRUdfQUREUgkJCTB4MDIxMFVMCisjZGVmaW5lCQlIV19ERVNfS0VZXzNfUkVHX0FERFIJCQkweDAyMTRVTAorI2RlZmluZQkJSFdfREVTX0tFWV80X1JFR19BRERSCQkJMHgwMjE4VUwKKyNkZWZpbmUJCUhXX0RFU19LRVlfNV9SRUdfQUREUgkJCTB4MDIxQ1VMCisjZGVmaW5lCQlIV19ERVNfQ09OVFJPTF8wX1JFR19BRERSCQkweDAyMjBVTAorI2RlZmluZQkJSFdfREVTX0NPTlRST0xfMV9SRUdfQUREUgkJMHgwMjI0VUwKKyNkZWZpbmUJCUhXX0RFU19JVl8wX1JFR19BRERSCQkJMHgwMjI4VUwKKyNkZWZpbmUJCUhXX0RFU19JVl8xX1JFR19BRERSCQkJMHgwMjJDVUwKKyNkZWZpbmUJCUhXX0FFU19LRVlfMF9BRERSXzBfUkVHX0FERFIJCTB4MDQwMFVMCisjZGVmaW5lCQlIV19BRVNfS0VZXzBfQUREUl8xX1JFR19BRERSCQkweDA0MDRVTAorI2RlZmluZQkJSFdfQUVTX0tFWV8wX0FERFJfMl9SRUdfQUREUgkJMHgwNDA4VUwKKyNkZWZpbmUJCUhXX0FFU19LRVlfMF9BRERSXzNfUkVHX0FERFIJCTB4MDQwY1VMCisjZGVmaW5lCQlIV19BRVNfS0VZXzBfQUREUl80X1JFR19BRERSCQkweDA0MTBVTAorI2RlZmluZQkJSFdfQUVTX0tFWV8wX0FERFJfNV9SRUdfQUREUgkJMHgwNDE0VUwKKyNkZWZpbmUJCUhXX0FFU19LRVlfMF9BRERSXzZfUkVHX0FERFIJCTB4MDQxOFVMCisjZGVmaW5lCQlIV19BRVNfS0VZXzBfQUREUl83X1JFR19BRERSCQkweDA0MWNVTAorI2RlZmluZQkJSFdfQUVTX0tFWV8wX1JFR19BRERSCQkJMHgwNDAwVUwKKyNkZWZpbmUJCUhXX0FFU19JVl8wX0FERFJfMF9SRUdfQUREUgkJMHgwNDQwVUwKKyNkZWZpbmUJCUhXX0FFU19JVl8wX0FERFJfMV9SRUdfQUREUgkJMHgwNDQ0VUwKKyNkZWZpbmUJCUhXX0FFU19JVl8wX0FERFJfMl9SRUdfQUREUgkJMHgwNDQ4VUwKKyNkZWZpbmUJCUhXX0FFU19JVl8wX0FERFJfM19SRUdfQUREUgkJMHgwNDRjVUwKKyNkZWZpbmUJCUhXX0FFU19JVl8wX1JFR19BRERSCQkJMHgwNDQwVUwKKyNkZWZpbmUJCUhXX0FFU19DVFIxX0FERFJfMF9SRUdfQUREUgkJMHgwNDYwVUwKKyNkZWZpbmUJCUhXX0FFU19DVFIxX0FERFJfMV9SRUdfQUREUgkJMHgwNDY0VUwKKyNkZWZpbmUJCUhXX0FFU19DVFIxX0FERFJfMl9SRUdfQUREUgkJMHgwNDY4VUwKKyNkZWZpbmUJCUhXX0FFU19DVFIxX0FERFJfM19SRUdfQUREUgkJMHgwNDZjVUwKKyNkZWZpbmUJCUhXX0FFU19DVFIxX1JFR19BRERSCQkJMHgwNDYwVUwKKyNkZWZpbmUJCUhXX0FFU19TS19SRUdfQUREUgkJCTB4MDQ3OFVMCisjZGVmaW5lCQlIV19BRVNfTUFDX09LX1JFR19BRERSCQkJMHgwNDgwVUwKKyNkZWZpbmUJCUhXX0FFU19QUkVWX0lWXzBfQUREUl8wX1JFR19BRERSCTB4MDQ5MFVMCisjZGVmaW5lCQlIV19BRVNfUFJFVl9JVl8wX0FERFJfMV9SRUdfQUREUgkweDA0OTRVTAorI2RlZmluZQkJSFdfQUVTX1BSRVZfSVZfMF9BRERSXzJfUkVHX0FERFIJMHgwNDk4VUwKKyNkZWZpbmUJCUhXX0FFU19QUkVWX0lWXzBfQUREUl8zX1JFR19BRERSCTB4MDQ5Y1VMCisjZGVmaW5lCQlIV19BRVNfUFJFVl9JVl8wX1JFR19BRERSCQkweDA0OTBVTAorI2RlZmluZQkJSFdfQUVTX0NPTlRST0xfUkVHX0FERFIJCQkweDA0QzBVTAorI2RlZmluZQkJSFdfSEFTSF9IMF9SRUdfQUREUgkJCTB4MDY0MFVMCisjZGVmaW5lCQlIV19IQVNIX0gxX1JFR19BRERSCQkJMHgwNjQ0VUwKKyNkZWZpbmUJCUhXX0hBU0hfSDJfUkVHX0FERFIJCQkweDA2NDhVTAorI2RlZmluZQkJSFdfSEFTSF9IM19SRUdfQUREUgkJCTB4MDY0Q1VMCisjZGVmaW5lCQlIV19IQVNIX0g0X1JFR19BRERSCQkJMHgwNjUwVUwKKyNkZWZpbmUJCUhXX0hBU0hfSDVfUkVHX0FERFIJCQkweDA2NTRVTAorI2RlZmluZQkJSFdfSEFTSF9INl9SRUdfQUREUgkJCTB4MDY1OFVMCisjZGVmaW5lCQlIV19IQVNIX0g3X1JFR19BRERSCQkJMHgwNjVDVUwKKyNkZWZpbmUJCUhXX0hBU0hfSDhfUkVHX0FERFIJCQkweDA2NjBVTAorI2RlZmluZQkJSFdfSEFTSF9IOV9SRUdfQUREUgkJCTB4MDY2NFVMCisjZGVmaW5lCQlIV19IQVNIX0gxMF9SRUdfQUREUgkJCTB4MDY2OFVMCisjZGVmaW5lCQlIV19IQVNIX0gxMV9SRUdfQUREUgkJCTB4MDY2Q1VMCisjZGVmaW5lCQlIV19IQVNIX0gxMl9SRUdfQUREUgkJCTB4MDY3MFVMCisjZGVmaW5lCQlIV19IQVNIX0gxM19SRUdfQUREUgkJCTB4MDY3NFVMCisjZGVmaW5lCQlIV19IQVNIX0gxNF9SRUdfQUREUgkJCTB4MDY3OFVMCisjZGVmaW5lCQlIV19IQVNIX0gxNV9SRUdfQUREUgkJCTB4MDY3Q1VMCisjZGVmaW5lCQlIV19IQVNIX0NPTlRST0xfUkVHX0FERFIJCTB4MDdDMFVMCisjZGVmaW5lCQlIV19IQVNIX1BBRF9FTl9SRUdfQUREUgkJCTB4MDdDNFVMCisjZGVmaW5lCQlIV19IQVNIX1BBRF9DRkdfUkVHX0FERFIJCTB4MDdDOFVMCisjZGVmaW5lCQlIV19IQVNIX0NVUl9MRU5fMF9SRUdfQUREUgkJMHgwN0NDVUwKKyNkZWZpbmUJCUhXX0hBU0hfQ1VSX0xFTl8xX1JFR19BRERSCQkweDA3RDBVTAorI2RlZmluZQkJSFdfSEFTSF9DVVJfTEVOXzJfUkVHX0FERFIJCTB4MDdENFVMCisjZGVmaW5lCQlIV19IQVNIX0NVUl9MRU5fM19SRUdfQUREUgkJMHgwN0Q4VUwKKyNkZWZpbmUJCUhXX0hBU0hfUEFSQU1fUkVHX0FERFIJCQkweDA3RENVTAorI2RlZmluZQkJSFdfSEFTSF9JTlRfQlVTWV9SRUdfQUREUgkJMHgwN0UwVUwKKyNkZWZpbmUJCUhXX0hBU0hfU1dfUkVTRVRfUkVHX0FERFIJCTB4MDdFNFVMCisjZGVmaW5lCQlIV19IQVNIX0VORElBTkVTU19SRUdfQUREUgkJMHgwN0U4VUwKKyNkZWZpbmUJCUhXX0hBU0hfREFUQV9SRUdfQUREUgkJCTB4MDdFQ1VMCisjZGVmaW5lCQlIV19EUk5HX0NPTlRST0xfUkVHX0FERFIJCTB4MDgwMFVMCisjZGVmaW5lCQlIV19EUk5HX1ZBTElEX1JFR19BRERSCQkJMHgwODA0VUwKKyNkZWZpbmUJCUhXX0RSTkdfREFUQV9SRUdfQUREUgkJCTB4MDgwOFVMCisjZGVmaW5lCQlIV19STkRfU1JDX0VOX1JFR19BRERSCQkJMHgwODBDVUwKKyNkZWZpbmUJCUhXX0FFU19DTEtfRU5BQkxFX1JFR19BRERSCQkweDA4MTBVTAorI2RlZmluZQkJSFdfREVTX0NMS19FTkFCTEVfUkVHX0FERFIJCTB4MDgxNFVMCisjZGVmaW5lCQlIV19IQVNIX0NMS19FTkFCTEVfUkVHX0FERFIJCTB4MDgxOFVMCisjZGVmaW5lCQlIV19QS0lfQ0xLX0VOQUJMRV9SRUdfQUREUgkJMHgwODFDVUwKKyNkZWZpbmUJCUhXX0NMS19TVEFUVVNfUkVHX0FERFIJCQkweDA4MjRVTAorI2RlZmluZQkJSFdfQ0xLX0VOQUJMRV9SRUdfQUREUgkJCTB4MDgyOFVMCisjZGVmaW5lCQlIV19EUk5HX1NBTVBMRV9SRUdfQUREUgkJCTB4MDg1MFVMCisjZGVmaW5lCQlIV19STkRfU1JDX0NUTF9SRUdfQUREUgkJCTB4MDg1OFVMCisjZGVmaW5lCQlIV19DUllQVE9fQ1RMX1JFR19BRERSCQkJMHgwOTAwVUwKKyNkZWZpbmUJCUhXX0NSWVBUT19TVEFUVVNfUkVHX0FERFIJCTB4MDkwQ1VMCisjZGVmaW5lCQlIV19DUllQVE9fQlVTWV9SRUdfQUREUgkJCTB4MDkxMFVMCisjZGVmaW5lCQlIV19BRVNfQlVTWV9SRUdfQUREUgkJCTB4MDkxNFVMCisjZGVmaW5lCQlIV19ERVNfQlVTWV9SRUdfQUREUgkJCTB4MDkxOFVMCisjZGVmaW5lCQlIV19IQVNIX0JVU1lfUkVHX0FERFIJCQkweDA5MUNVTAorI2RlZmluZQkJSFdfQ09OVEVOVF9SRUdfQUREUgkJCTB4MDkyNFVMCisjZGVmaW5lCQlIV19WRVJTSU9OX1JFR19BRERSCQkJMHgwOTI4VUwKKyNkZWZpbmUJCUhXX0NPTlRFWFRfSURfUkVHX0FERFIJCQkweDA5MzBVTAorI2RlZmluZQkJSFdfRElOX0JVRkZFUl9SRUdfQUREUgkJCTB4MEMwMFVMCisjZGVmaW5lCQlIV19ESU5fTUVNX0RNQV9CVVNZX1JFR19BRERSCQkweDBjMjBVTAorI2RlZmluZQkJSFdfU1JDX0xMSV9NRU1fQUREUl9SRUdfQUREUgkJMHgwYzI0VUwKKyNkZWZpbmUJCUhXX1NSQ19MTElfV09SRDBfUkVHX0FERFIJCTB4MEMyOFVMCisjZGVmaW5lCQlIV19TUkNfTExJX1dPUkQxX1JFR19BRERSCQkweDBDMkNVTAorI2RlZmluZQkJSFdfU1JBTV9TUkNfQUREUl9SRUdfQUREUgkJMHgwYzMwVUwKKyNkZWZpbmUJCUhXX0RJTl9TUkFNX0JZVEVTX0xFTl9SRUdfQUREUgkJMHgwYzM0VUwKKyNkZWZpbmUJCUhXX0RJTl9TUkFNX0RNQV9CVVNZX1JFR19BRERSCQkweDBDMzhVTAorI2RlZmluZQkJSFdfV1JJVEVfQUxJR05fUkVHX0FERFIJCQkweDBDM0NVTAorI2RlZmluZQkJSFdfT0xEX0RBVEFfUkVHX0FERFIJCQkweDBDNDhVTAorI2RlZmluZQkJSFdfV1JJVEVfQUxJR05fTEFTVF9SRUdfQUREUgkJMHgwQzRDVUwKKyNkZWZpbmUJCUhXX0RPVVRfQlVGRkVSX1JFR19BRERSCQkJMHgwQzAwVUwKKyNkZWZpbmUJCUhXX0RTVF9MTElfV09SRDBfUkVHX0FERFIJCTB4MEQyOFVMCisjZGVmaW5lCQlIV19EU1RfTExJX1dPUkQxX1JFR19BRERSCQkweDBEMkNVTAorI2RlZmluZQkJSFdfRFNUX0xMSV9NRU1fQUREUl9SRUdfQUREUgkJMHgwRDI0VUwKKyNkZWZpbmUJCUhXX0RPVVRfTUVNX0RNQV9CVVNZX1JFR19BRERSCQkweDBEMjBVTAorI2RlZmluZQkJSFdfU1JBTV9ERVNUX0FERFJfUkVHX0FERFIJCTB4MEQzMFVMCisjZGVmaW5lCQlIV19ET1VUX1NSQU1fQllURVNfTEVOX1JFR19BRERSCQkweDBEMzRVTAorI2RlZmluZQkJSFdfRE9VVF9TUkFNX0RNQV9CVVNZX1JFR19BRERSCQkweDBEMzhVTAorI2RlZmluZQkJSFdfUkVBRF9BTElHTl9SRUdfQUREUgkJCTB4MEQzQ1VMCisjZGVmaW5lCQlIV19SRUFEX0xBU1RfREFUQV9SRUdfQUREUgkJMHgwRDQ0VUwKKyNkZWZpbmUJCUhXX1JDNF9USFJVX0NQVV9SRUdfQUREUgkJMHgwRDRDVUwKKyNkZWZpbmUJCUhXX0FIQl9TSU5HTEVfUkVHX0FERFIJCQkweDBFMDBVTAorI2RlZmluZQkJSFdfU1JBTV9EQVRBX1JFR19BRERSCQkJMHgwRjAwVUwKKyNkZWZpbmUJCUhXX1NSQU1fQUREUl9SRUdfQUREUgkJCTB4MEYwNFVMCisjZGVmaW5lCQlIV19TUkFNX0RBVEFfUkVBRFlfUkVHX0FERFIJCTB4MEYwOFVMCisjZGVmaW5lCQlIV19IT1NUX0lSUl9SRUdfQUREUgkJCTB4MEEwMFVMCisjZGVmaW5lCQlIV19IT1NUX0lNUl9SRUdfQUREUgkJCTB4MEEwNFVMCisjZGVmaW5lCQlIV19IT1NUX0lDUl9SRUdfQUREUgkJCTB4MEEwOFVMCisjZGVmaW5lCQlIV19IT1NUX1NFUF9TUkFNX1RIUkVTSE9MRF9SRUdfQUREUgkweDBBMTBVTAorI2RlZmluZQkJSFdfSE9TVF9TRVBfQlVTWV9SRUdfQUREUgkJMHgwQTE0VUwKKyNkZWZpbmUJCUhXX0hPU1RfU0VQX0xDU19SRUdfQUREUgkJMHgwQTE4VUwKKyNkZWZpbmUJCUhXX0hPU1RfQ0NfU1dfUlNUX1JFR19BRERSCQkweDBBNDBVTAorI2RlZmluZQkJSFdfSE9TVF9TRVBfU1dfUlNUX1JFR19BRERSCQkweDBBNDRVTAorI2RlZmluZQkJSFdfSE9TVF9GTE9XX0RNQV9TV19JTlQwX1JFR19BRERSCTB4MEE4MFVMCisjZGVmaW5lCQlIV19IT1NUX0ZMT1dfRE1BX1NXX0lOVDFfUkVHX0FERFIJMHgwQTg0VUwKKyNkZWZpbmUJCUhXX0hPU1RfRkxPV19ETUFfU1dfSU5UMl9SRUdfQUREUgkweDBBODhVTAorI2RlZmluZQkJSFdfSE9TVF9GTE9XX0RNQV9TV19JTlQzX1JFR19BRERSCTB4MEE4Y1VMCisjZGVmaW5lCQlIV19IT1NUX0ZMT1dfRE1BX1NXX0lOVDRfUkVHX0FERFIJMHgwQTkwVUwKKyNkZWZpbmUJCUhXX0hPU1RfRkxPV19ETUFfU1dfSU5UNV9SRUdfQUREUgkweDBBOTRVTAorI2RlZmluZQkJSFdfSE9TVF9GTE9XX0RNQV9TV19JTlQ2X1JFR19BRERSCTB4MEE5OFVMCisjZGVmaW5lCQlIV19IT1NUX0ZMT1dfRE1BX1NXX0lOVDdfUkVHX0FERFIJMHgwQTljVUwKKyNkZWZpbmUJCUhXX0hPU1RfU0VQX0hPU1RfR1BSMF9SRUdfQUREUgkJMHgwQjAwVUwKKyNkZWZpbmUJCUhXX0hPU1RfU0VQX0hPU1RfR1BSMV9SRUdfQUREUgkJMHgwQjA0VUwKKyNkZWZpbmUJCUhXX0hPU1RfU0VQX0hPU1RfR1BSMl9SRUdfQUREUgkJMHgwQjA4VUwKKyNkZWZpbmUJCUhXX0hPU1RfU0VQX0hPU1RfR1BSM19SRUdfQUREUgkJMHgwQjBDVUwKKyNkZWZpbmUJCUhXX0hPU1RfSE9TVF9TRVBfR1BSMF9SRUdfQUREUgkJMHgwQjgwVUwKKyNkZWZpbmUJCUhXX0hPU1RfSE9TVF9TRVBfR1BSMV9SRUdfQUREUgkJMHgwQjg0VUwKKyNkZWZpbmUJCUhXX0hPU1RfSE9TVF9TRVBfR1BSMl9SRUdfQUREUgkJMHgwQjg4VUwKKyNkZWZpbmUJCUhXX0hPU1RfSE9TVF9TRVBfR1BSM19SRUdfQUREUgkJMHgwQjhDVUwKKyNkZWZpbmUJCUhXX0hPU1RfSE9TVF9FTkRJQU5fUkVHX0FERFIJCTB4MEI5MFVMCisjZGVmaW5lCQlIV19IT1NUX0hPU1RfQ09NTV9DTEtfRU5fUkVHX0FERFIJMHgwQjk0VUwKKyNkZWZpbmUJCUhXX0NMUl9TUkFNX0JVU1lfUkVHX1JFR19BRERSCQkweDBGMENVTAorI2RlZmluZQkJSFdfQ0NfU1JBTV9CQVNFX0FERFJFU1MJCQkweDU4MDBVTAorCisjZW5kaWYJCS8qIGlmbmRlZiBIV19ERUZTICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc203eHgvc210Y2ZiLmMgYi9kcml2ZXJzL3N0YWdpbmcvc203eHgvc210Y2ZiLmMKaW5kZXggMjRmNDdkNi4uZjRiMTYzZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3NtN3h4L3NtdGNmYi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zbTd4eC9zbXRjZmIuYwpAQCAtOTk2LDcgKzk5Niw3IEBACiAKIAogLyogSmFzb24gKDA4LzExLzIwMDkpIFBDSV9EUlYgd3JhcHBlciBlc3NlbnRpYWwgc3RydWN0cyAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkIHNtdGNmYl9wY2lfdGFibGVbXSA9IHsKK3N0YXRpYyBERUZJTkVfUENJX0RFVklDRV9UQUJMRShzbXRjZmJfcGNpX3RhYmxlKSA9IHsKIAl7MHgxMjZmLCAweDcxMCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sCiAJezB4MTI2ZiwgMHg3MTIsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LAogCXsweDEyNmYsIDB4NzIwLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zb2xvNngxMC9LY29uZmlnIGIvZHJpdmVycy9zdGFnaW5nL3NvbG82eDEwL0tjb25maWcKaW5kZXggZDk2Mzk4Yy4uMmNmNzdjOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3NvbG82eDEwL0tjb25maWcKKysrIGIvZHJpdmVycy9zdGFnaW5nL3NvbG82eDEwL0tjb25maWcKQEAgLTEsNyArMSw3IEBACiBjb25maWcgU09MTzZYMTAKIAl0cmlzdGF0ZSAiU29mdGxvZ2ljIDZ4MTAgTVBFRyBjb2RlYyBjYXJkcyIKLQlkZXBlbmRzIG9uIFBDSSAmJiBWSURFT19ERVYgJiYgU05ECi0Jc2VsZWN0IFZJREVPQlVGX0RNQV9DT05USUcKKwlkZXBlbmRzIG9uIFBDSSAmJiBWSURFT19ERVYgJiYgU05EICYmIEkyQworCXNlbGVjdCBWSURFT0JVRl9ETUFfU0cKIAktLS1oZWxwLS0tCiAJICBUaGlzIGRyaXZlciBzdXBwb3J0cyB0aGUgU29mdGxvZ2ljIGJhc2VkIE1QRUctNCBhbmQgaC4yNjQgY29kZWMKIAkgIGNvZGVjIGNhcmRzLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NvbG82eDEwL1RPRE8gYi9kcml2ZXJzL3N0YWdpbmcvc29sbzZ4MTAvVE9ETwppbmRleCBlNmEyZWUyLi43ZTZjNGZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvc29sbzZ4MTAvVE9ETworKysgYi9kcml2ZXJzL3N0YWdpbmcvc29sbzZ4MTAvVE9ETwpAQCAtMSw3ICsxLDUgQEAKIFRPRE8gKHN0YWdpbmcgPT4gbWFpbik6CiAKLQkqIGNoZWNrcGF0Y2gucGwgKGhhdmVuJ3QgcnVuIGl0IHlldCkKLQkqIExpbmRlbnQgKHNob3VsZCBiZSBjbGVhbiwgYnV0IGNoZWNrKQogCSogTW90aW9uIGRldGVjdGlvbiBmbGFncyBuZWVkIHRvIGJlIG1vdmVkIHRvIHY0bDIKIAkqIFNvbWUgcHJpdmF0ZSBDSURzIG5lZWQgdG8gYmUgbW92ZWQgdG8gdjRsMgogCkBAIC0yMSw4ICsxOSw2IEBACiAJICAtIGltcGxlbWVudCBwbGF5YmFjayB2aWEgZXh0ZXJuYWwgc291bmQgamFjawogCSAgLSBpbXBsZW1lbnQgbG9vcGJhY2sgb2YgZXh0ZXJuYWwgc291bmQgamFjayB3aXRoIGluY29taW5nIGF1ZGlvPwogCSAgLSBpbXBsZW1lbnQgcGF1c2UvcmVzdW1lCi0JICAtIGNoZWNrIGludG8gamFja2luZyBzb3VuZCBmcm9tIHR4Mjh4eCBjaGlwcyBkaXJlY3RseSAodG8gYXZvaWQKLQkgICAgZy43MjMvOGtoeiBsaW1pdGF0aW9ucykKIAogUGxhc2Ugc2VuZCBwYXRjaGVzIHRvIEdyZWcgS3JvYWgtSGFydG1hbiA8Z3JlZ0Brcm9haC5jb20+IGFuZCBDYyBCZW4gQ29sbGlucwogPGJjb2xsaW5zQGJsdWVjaGVycnkubmV0PgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NvbG82eDEwL3NvbG82MDEwLWNvcmUuYyBiL2RyaXZlcnMvc3RhZ2luZy9zb2xvNngxMC9zb2xvNjAxMC1jb3JlLmMKaW5kZXggNGEwNTFjZC4uYzQzMzEzNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3NvbG82eDEwL3NvbG82MDEwLWNvcmUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvc29sbzZ4MTAvc29sbzYwMTAtY29yZS5jCkBAIC0xMzYsNiArMTM2LDcgQEAKIAlpbnQgcmV0OwogCWludCBzZHJhbTsKIAl1OCBjaGlwX2lkOworCiAJc29sb19kZXYgPSBremFsbG9jKHNpemVvZigqc29sb19kZXYpLCBHRlBfS0VSTkVMKTsKIAlpZiAoc29sb19kZXYgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9NRU07CkBAIC0xNjMsMjEgKzE2NCwyMSBAQAogCWNoaXBfaWQgPSBzb2xvX3JlZ19yZWFkKHNvbG9fZGV2LCBTT0xPX0NISVBfT1BUSU9OKSAmCiAJCQkJCVNPTE9fQ0hJUF9JRF9NQVNLOwogCXN3aXRjaCAoY2hpcF9pZCkgewotCQljYXNlIDc6Ci0JCQlzb2xvX2Rldi0+bnJfY2hhbnMgPSAxNjsKLQkJCXNvbG9fZGV2LT5ucl9leHQgPSA1OwotCQkJYnJlYWs7Ci0JCWNhc2UgNjoKLQkJCXNvbG9fZGV2LT5ucl9jaGFucyA9IDg7Ci0JCQlzb2xvX2Rldi0+bnJfZXh0ID0gMjsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJZGV2X3dhcm4oJnBkZXYtPmRldiwgIkludmFsaWQgY2hpcF9pZCAweCUwMngsICIKLQkJCQkgImRlZmF1bHRpbmcgdG8gNCBjaGFubmVsc1xuIiwKLQkJCQkgY2hpcF9pZCk7Ci0JCWNhc2UgNToKLQkJCXNvbG9fZGV2LT5ucl9jaGFucyA9IDQ7Ci0JCQlzb2xvX2Rldi0+bnJfZXh0ID0gMTsKKwljYXNlIDc6CisJCXNvbG9fZGV2LT5ucl9jaGFucyA9IDE2OworCQlzb2xvX2Rldi0+bnJfZXh0ID0gNTsKKwkJYnJlYWs7CisJY2FzZSA2OgorCQlzb2xvX2Rldi0+bnJfY2hhbnMgPSA4OworCQlzb2xvX2Rldi0+bnJfZXh0ID0gMjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGV2X3dhcm4oJnBkZXYtPmRldiwgIkludmFsaWQgY2hpcF9pZCAweCUwMngsICIKKwkJCSAiZGVmYXVsdGluZyB0byA0IGNoYW5uZWxzXG4iLAorCQkJIGNoaXBfaWQpOworCWNhc2UgNToKKwkJc29sb19kZXYtPm5yX2NoYW5zID0gNDsKKwkJc29sb19kZXYtPm5yX2V4dCA9IDE7CiAJfQogCiAJLyogRGlzYWJsZSBhbGwgaW50ZXJydXB0cyB0byBzdGFydCAqLwpAQCAtMjYxLDEzICsyNjIsMTggQEAKIH0KIAogc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHNvbG82MDEwX2lkX3RhYmxlW10gPSB7CisJLyogNjAxMCBiYXNlZCBjYXJkcyAqLwogCXtQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfU09GVExPR0lDLCBQQ0lfREVWSUNFX0lEX1NPTE82MDEwKX0sCiAJe1BDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9CTFVFQ0hFUlJZLCBQQ0lfREVWSUNFX0lEX05FVVNPTE9fNCl9LAogCXtQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfQkxVRUNIRVJSWSwgUENJX0RFVklDRV9JRF9ORVVTT0xPXzkpfSwKIAl7UENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0JMVUVDSEVSUlksIFBDSV9ERVZJQ0VfSURfTkVVU09MT18xNil9LAotCXtQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfQkxVRUNIRVJSWSwgUENJX0RFVklDRV9JRF9DT01NU09MT180KX0sCi0Je1BDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9CTFVFQ0hFUlJZLCBQQ0lfREVWSUNFX0lEX0NPTU1TT0xPXzkpfSwKLQl7UENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0JMVUVDSEVSUlksIFBDSV9ERVZJQ0VfSURfQ09NTVNPTE9fMTYpfSwKKwl7UENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0JMVUVDSEVSUlksIFBDSV9ERVZJQ0VfSURfQkNfU09MT180KX0sCisJe1BDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9CTFVFQ0hFUlJZLCBQQ0lfREVWSUNFX0lEX0JDX1NPTE9fOSl9LAorCXtQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfQkxVRUNIRVJSWSwgUENJX0RFVklDRV9JRF9CQ19TT0xPXzE2KX0sCisJLyogNjExMCBiYXNlZCBjYXJkcyAqLworCXtQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfQkxVRUNIRVJSWSwgUENJX0RFVklDRV9JRF9CQ182MTEwXzQpfSwKKwl7UENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0JMVUVDSEVSUlksIFBDSV9ERVZJQ0VfSURfQkNfNjExMF84KX0sCisJe1BDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9CTFVFQ0hFUlJZLCBQQ0lfREVWSUNFX0lEX0JDXzYxMTBfMTYpfSwKIAl7MCx9CiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc29sbzZ4MTAvc29sbzYwMTAtZGlzcC5jIGIvZHJpdmVycy9zdGFnaW5nL3NvbG82eDEwL3NvbG82MDEwLWRpc3AuYwppbmRleCA1NTVmMDI0Li5mODY2Zjg0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvc29sbzZ4MTAvc29sbzYwMTAtZGlzcC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zb2xvNngxMC9zb2xvNjAxMC1kaXNwLmMKQEAgLTE5OCwxMiArMTk4LDEyIEBACiAJfQogCiAJLyogRGVmYXVsdCBtb3Rpb24gc2V0dGluZ3MgKi8KLSAgICAgICAgc29sb19yZWdfd3JpdGUoc29sb19kZXYsIFNPTE9fVklfTU9UX0FEUiwgU09MT19WSV9NT1RJT05fRU4oMCkgfAorCXNvbG9fcmVnX3dyaXRlKHNvbG9fZGV2LCBTT0xPX1ZJX01PVF9BRFIsIFNPTE9fVklfTU9USU9OX0VOKDApIHwKIAkJICAgICAgIChTT0xPX01PVElPTl9FWFRfQUREUihzb2xvX2RldikgPj4gMTYpKTsKIAlzb2xvX3JlZ193cml0ZShzb2xvX2RldiwgU09MT19WSV9NT1RfQ1RSTCwKIAkJICAgICAgIFNPTE9fVklfTU9USU9OX0ZSQU1FX0NPVU5UKDMpIHwKIAkJICAgICAgIFNPTE9fVklfTU9USU9OX1NBTVBMRV9MRU5HVEgoc29sb19kZXYtPnZpZGVvX2hzaXplIC8gMTYpCi0JCSAgICAgICB8IC8vU09MT19WSV9NT1RJT05fSU5UUl9TVEFSVF9TVE9QIHwKKwkJICAgICAgIHwgLyogU09MT19WSV9NT1RJT05fSU5UUl9TVEFSVF9TVE9QIHwgKi8KIAkJICAgICAgIFNPTE9fVklfTU9USU9OX1NBTVBMRV9DT1VOVCgxMCkpOwogCiAJc29sb19yZWdfd3JpdGUoc29sb19kZXYsIFNPTE9fVklfTU9USU9OX0JPUkRFUiwgMCk7CkBAIC0yNjQsNyArMjY0LDcgQEAKIAlzb2xvX3JlZ193cml0ZShzb2xvX2RldiwgU09MT19WT19SRUNUQU5HTEVfQ1RSTCgwKSwgMCk7CiAJc29sb19yZWdfd3JpdGUoc29sb19kZXYsIFNPTE9fVk9fUkVDVEFOR0xFX1NUQVJUKDApLCAwKTsKIAlzb2xvX3JlZ193cml0ZShzb2xvX2RldiwgU09MT19WT19SRUNUQU5HTEVfU1RPUCgwKSwgMCk7Ci0JCisKIAlzb2xvX3JlZ193cml0ZShzb2xvX2RldiwgU09MT19WT19SRUNUQU5HTEVfQ1RSTCgxKSwgMCk7CiAJc29sb19yZWdfd3JpdGUoc29sb19kZXYsIFNPTE9fVk9fUkVDVEFOR0xFX1NUQVJUKDEpLCAwKTsKIAlzb2xvX3JlZ193cml0ZShzb2xvX2RldiwgU09MT19WT19SRUNUQU5HTEVfU1RPUCgxKSwgMCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc29sbzZ4MTAvc29sbzYwMTAtZW5jLmMgYi9kcml2ZXJzL3N0YWdpbmcvc29sbzZ4MTAvc29sbzYwMTAtZW5jLmMKaW5kZXggYTZjZjBhOC4uNDgxYTQ5MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3NvbG82eDEwL3NvbG82MDEwLWVuYy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zb2xvNngxMC9zb2xvNjAxMC1lbmMuYwpAQCAtMjIsNyArMjIsNyBAQAogI2luY2x1ZGUgInNvbG82MDEwLmgiCiAjaW5jbHVkZSAic29sbzYwMTAtb3NkLWZvbnQuaCIKIAotI2RlZmluZSBDQVBUVVJFX01BWF9CQU5EV0lEVEgJCTMyCS8vIEQxIDRjaGFubmVsIChEMSA9PSA0KQorI2RlZmluZSBDQVBUVVJFX01BWF9CQU5EV0lEVEgJCTMyCS8qIEQxIDRjaGFubmVsIChEMSA9PSA0KSAqLwogI2RlZmluZSBPU0dfQlVGRkVSX1NJWkUJCQkxMDI0CiAKICNkZWZpbmUgVklfUFJPR19IU0laRQkJCSgxMjgwIC0gMTYpCkBAIC0xNDUsOCArMTQ1LDggQEAKIAogCXNvbG9fcDJtX2RtYShzb2xvX2RldiwgMCwgMSwgYnVmLCBTT0xPX0VPU0RfRVhUX0FERFIoc29sb19kZXYpICsKIAkJICAgICAoc29sb19lbmMtPmNoICogU09MT19FT1NEX0VYVF9TSVpFKSwgU09MT19FT1NEX0VYVF9TSVpFKTsKLSAgICAgICAgcmVnIHw9ICgxIDw8IHNvbG9fZW5jLT5jaCk7Ci0gICAgICAgIHNvbG9fcmVnX3dyaXRlKHNvbG9fZGV2LCBTT0xPX1ZFX09TRF9DSCwgcmVnKTsKKwlyZWcgfD0gKDEgPDwgc29sb19lbmMtPmNoKTsKKwlzb2xvX3JlZ193cml0ZShzb2xvX2RldiwgU09MT19WRV9PU0RfQ0gsIHJlZyk7CiAKIAlrZnJlZShidWYpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc29sbzZ4MTAvc29sbzYwMTAtZzcyMy5jIGIvZHJpdmVycy9zdGFnaW5nL3NvbG82eDEwL3NvbG82MDEwLWc3MjMuYwppbmRleCA4MmZiY2I4Li4yNTRiNDZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvc29sbzZ4MTAvc29sbzYwMTAtZzcyMy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zb2xvNngxMC9zb2xvNjAxMC1nNzIzLmMKQEAgLTQ3LDcgKzQ3LDcgQEAKICAqIGlzIGJyb2tlbiBkb3duIHRvIDIwICogNDggYnl0ZSByZWdpb25zIChvbmUgZm9yIGVhY2ggY2hhbm5lbCBwb3NzaWJsZSkKICAqIHdpdGggdGhlIHJlc3Qgb2YgdGhlIHBhZ2UgYmVpbmcgZHVtbXkgZGF0YS4gKi8KICNkZWZpbmUgTUFYX0JVRkZFUgkJKEc3MjNfUEVSSU9EX0JZVEVTICogUEVSSU9EU19NQVgpCi0jZGVmaW5lIElSUV9QQUdFUwkJNCAvLyAwIC0gNAorI2RlZmluZSBJUlFfUEFHRVMJCTQgLyogMCAtIDQgKi8KICNkZWZpbmUgUEVSSU9EU19NSU4JCSgxIDw8IElSUV9QQUdFUykKICNkZWZpbmUgUEVSSU9EU19NQVgJCUc3MjNfRkRNQV9QQUdFUwogCkBAIC0xNTgsNyArMTU4LDcgQEAKIAlzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHNzKSA9IHNvbG9fcGNtLT5zb2xvX2RldjsKIAlrZnJlZShzb2xvX3BjbSk7CiAKLSAgICAgICAgcmV0dXJuIDA7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgc25kX3NvbG9fcGNtX3RyaWdnZXIoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzcywgaW50IGNtZCkKQEAgLTE5Nyw3ICsxOTcsNyBAQAogCiBzdGF0aWMgaW50IHNuZF9zb2xvX3BjbV9wcmVwYXJlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3MpCiB7Ci0gICAgICAgIHJldHVybiAwOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgc25kX3BjbV91ZnJhbWVzX3Qgc25kX3NvbG9fcGNtX3BvaW50ZXIoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzcykKQEAgLTI3MSw3ICsyNzEsNyBAQAogCiAJdmFsdWUtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSB0dzI4X2dldF9hdWRpb19nYWluKHNvbG9fZGV2LCBjaCk7CiAKLSAgICAgICAgcmV0dXJuIDA7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgc25kX3NvbG9fY2FwdHVyZV92b2x1bWVfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLApAQCAtMjc5LDE1ICsyNzksMTUgQEAKIHsKIAlzdHJ1Y3Qgc29sbzYwMTBfZGV2ICpzb2xvX2RldiA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKIAl1OCBjaCA9IHZhbHVlLT5pZC5udW1pZCAtIDE7Ci0gICAgICAgIHU4IG9sZF92YWw7CisJdTggb2xkX3ZhbDsKIAotICAgICAgICBvbGRfdmFsID0gdHcyOF9nZXRfYXVkaW9fZ2Fpbihzb2xvX2RldiwgY2gpOworCW9sZF92YWwgPSB0dzI4X2dldF9hdWRpb19nYWluKHNvbG9fZGV2LCBjaCk7CiAJaWYgKG9sZF92YWwgPT0gdmFsdWUtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pCiAJCXJldHVybiAwOwogCiAJdHcyOF9zZXRfYXVkaW9fZ2Fpbihzb2xvX2RldiwgY2gsIHZhbHVlLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKTsKIAotICAgICAgICByZXR1cm4gMTsKKwlyZXR1cm4gMTsKIH0KIAogc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNuZF9zb2xvX2NhcHR1cmVfdm9sdW1lID0gewpAQCAtMzY4LDE0ICszNjgsMTYgQEAKIAlzdHJjcHkoY2FyZC0+bWl4ZXJuYW1lLCAiU09MTy02MDEwIik7CiAJa2N0bCA9IHNuZF9zb2xvX2NhcHR1cmVfdm9sdW1lOwogCWtjdGwuY291bnQgPSBzb2xvX2Rldi0+bnJfY2hhbnM7Ci0gICAgICAgIHJldCA9IHNuZF9jdGxfYWRkKGNhcmQsIHNuZF9jdGxfbmV3MSgma2N0bCwgc29sb19kZXYpKTsKKwlyZXQgPSBzbmRfY3RsX2FkZChjYXJkLCBzbmRfY3RsX25ldzEoJmtjdGwsIHNvbG9fZGV2KSk7CiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CiAKLQlpZiAoKHJldCA9IHNvbG9fc25kX3BjbV9pbml0KHNvbG9fZGV2KSkgPCAwKQorCXJldCA9IHNvbG9fc25kX3BjbV9pbml0KHNvbG9fZGV2KTsKKwlpZiAocmV0IDwgMCkKIAkJZ290byBzbmRfZXJyb3I7CiAKLQlpZiAoKHJldCA9IHNuZF9jYXJkX3JlZ2lzdGVyKGNhcmQpKSA8IDApCisJcmV0ID0gc25kX2NhcmRfcmVnaXN0ZXIoY2FyZCk7CisJaWYgKHJldCA8IDApCiAJCWdvdG8gc25kX2Vycm9yOwogCiAJc29sb19nNzIzX2NvbmZpZyhzb2xvX2Rldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc29sbzZ4MTAvc29sbzYwMTAtZ3Bpby5jIGIvZHJpdmVycy9zdGFnaW5nL3NvbG82eDEwL3NvbG82MDEwLWdwaW8uYwppbmRleCA0NmY3YTcxLi44ODY5Yjg4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvc29sbzZ4MTAvc29sbzYwMTAtZ3Bpby5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zb2xvNngxMC9zb2xvNjAxMC1ncGlvLmMKQEAgLTkyLDggKzkyLDggQEAKIAogaW50IHNvbG9fZ3Bpb19pbml0KHN0cnVjdCBzb2xvNjAxMF9kZXYgKnNvbG9fZGV2KQogewotICAgICAgICBzb2xvX2dwaW9fY29uZmlnKHNvbG9fZGV2KTsKLSAgICAgICAgcmV0dXJuIDA7CisJc29sb19ncGlvX2NvbmZpZyhzb2xvX2Rldik7CisJcmV0dXJuIDA7CiB9CiAKIHZvaWQgc29sb19ncGlvX2V4aXQoc3RydWN0IHNvbG82MDEwX2RldiAqc29sb19kZXYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc29sbzZ4MTAvc29sbzYwMTAtaTJjLmMgYi9kcml2ZXJzL3N0YWdpbmcvc29sbzZ4MTAvc29sbzYwMTAtaTJjLmMKaW5kZXggY2FkZDUxMi4uNjBiNjljZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3NvbG82eDEwL3NvbG82MDEwLWkyYy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zb2xvNngxMC9zb2xvNjAxMC1pMmMuYwpAQCAtNDYsNyArNDYsNyBAQAogCiAJaTJjX3RyYW5zZmVyKCZzb2xvX2Rldi0+aTJjX2FkYXBbaWRdLCBtc2dzLCAyKTsKIAotICAgICAgICByZXR1cm4gZGF0YTsKKwlyZXR1cm4gZGF0YTsKIH0KIAogdm9pZCBzb2xvX2kyY193cml0ZWJ5dGUoc3RydWN0IHNvbG82MDEwX2RldiAqc29sb19kZXYsIGludCBpZCwgdTggYWRkciwKQEAgLTIyNSw5ICsyMjUsOSBAQAogCX0KIAogCWlmIChpID09IFNPTE9fSTJDX0FEQVBURVJTKQotCQlyZXR1cm4gbnVtOyAvLyBYWFggUmlnaHQgcmV0dXJuIHZhbHVlIGZvciBmYWlsdXJlPworCQlyZXR1cm4gbnVtOyAvKiBYWFggUmlnaHQgcmV0dXJuIHZhbHVlIGZvciBmYWlsdXJlPyAqLwogCi0JZG93bigmc29sb19kZXYtPmkyY19zZW0pOworCW11dGV4X2xvY2soJnNvbG9fZGV2LT5pMmNfbXV0ZXgpOwogCXNvbG9fZGV2LT5pMmNfaWQgPSBpOwogCXNvbG9fZGV2LT5pMmNfbXNnID0gbXNnczsKIAlzb2xvX2Rldi0+aTJjX21zZ19udW0gPSBudW07CkBAIC0yNTgsNyArMjU4LDcgQEAKIAlzb2xvX2Rldi0+aTJjX3N0YXRlID0gSUlDX1NUQVRFX0lETEU7CiAJc29sb19kZXYtPmkyY19pZCA9IC0xOwogCi0JdXAoJnNvbG9fZGV2LT5pMmNfc2VtKTsKKwltdXRleF91bmxvY2soJnNvbG9fZGV2LT5pMmNfbXV0ZXgpOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTI4NCw3ICsyODQsNyBAQAogCXNvbG9fZGV2LT5pMmNfaWQgPSAtMTsKIAlzb2xvX2Rldi0+aTJjX3N0YXRlID0gSUlDX1NUQVRFX0lETEU7CiAJaW5pdF93YWl0cXVldWVfaGVhZCgmc29sb19kZXYtPmkyY193YWl0KTsKLQlzZW1hX2luaXQoJnNvbG9fZGV2LT5pMmNfc2VtLCAxKTsKKwltdXRleF9pbml0KCZzb2xvX2Rldi0+aTJjX211dGV4KTsKIAogCWZvciAoaSA9IDA7IGkgPCBTT0xPX0kyQ19BREFQVEVSUzsgaSsrKSB7CiAJCXN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCA9ICZzb2xvX2Rldi0+aTJjX2FkYXBbaV07CkBAIC0yOTYsNyArMjk2LDggQEAKIAkJYWRhcC0+cmV0cmllcyA9IDE7CiAJCWFkYXAtPmRldi5wYXJlbnQgPSAmc29sb19kZXYtPnBkZXYtPmRldjsKIAotCQlpZiAoKHJldCA9IGkyY19hZGRfYWRhcHRlcihhZGFwKSkpIHsKKwkJcmV0ID0gaTJjX2FkZF9hZGFwdGVyKGFkYXApOworCQlpZiAocmV0KSB7CiAJCQlhZGFwLT5hbGdvX2RhdGEgPSBOVUxMOwogCQkJYnJlYWs7CiAJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zb2xvNngxMC9zb2xvNjAxMC1vc2QtZm9udC5oIGIvZHJpdmVycy9zdGFnaW5nL3NvbG82eDEwL3NvbG82MDEwLW9zZC1mb250LmgKaW5kZXggZDZmNTY1Yi4uZDcyZWZiYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3NvbG82eDEwL3NvbG82MDEwLW9zZC1mb250LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3NvbG82eDEwL3NvbG82MDEwLW9zZC1mb250LmgKQEAgLTIyLDcgKzIyLDcgQEAKIAogc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzb2xvX29zZF9mb250W10gPSB7CiAJMHgwMDAwMDAwMCwgMHgwMDAwYzBjOCwgMHhjY2ZlZmUwYywgMHgwODAwMDAwMCwKLQkweDAwMDAwMDAwLCAweDEwMTAzODM4LCAweDdjN2NmZWZlLCAweDAwMDAwMDAwLAkvLyAwCisJMHgwMDAwMDAwMCwgMHgxMDEwMzgzOCwgMHg3YzdjZmVmZSwgMHgwMDAwMDAwMCwJLyogMCAqLwogCTB4MDAwMDAwMDAsIDB4ZmVmZTdjN2MsIDB4MzgzODEwMTAsIDB4MTAwMDAwMDAsCiAJMHgwMDAwMDAwMCwgMHg3YzgyZmVmZSwgMHhmZWZlZmU3YywgMHgwMDAwMDAwMCwKIAkweDAwMDAwMDAwLCAweDAwMDAxMDM4LCAweDEwMDAwMDAwLCAweDAwMDAwMDAwLApAQCAtNTQsNjcgKzU0LDY3IEBACiAJMHgwMDAwMDAzZiwgMHg3ZjQwNGM1MiwgMHg1MjRjNDA3ZiwgMHgwMDAwMDAwMCwKIAkweDAwMDAwMDdjLCAweDgyYmE4MmJhLCAweDgyYmE4MmZlLCAweDAwMDAwMDAwLAogCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwgMHgxODNjM2MzYywgMHgxODE4MDAxOCwgMHgxODAwMDAwMCwJLy8gMzIgICAhCisJMHgwMDAwMDAwMCwgMHgxODNjM2MzYywgMHgxODE4MDAxOCwgMHgxODAwMDAwMCwJLyogMzIgICAhICovCiAJMHgwMDAwMDA2NiwgMHg2NjI0MDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLCAweDZjNmNmZTZjLCAweDZjNmNmZTZjLCAweDZjMDAwMDAwLAkvLyAzNCAiICMKKwkweDAwMDAwMDAwLCAweDZjNmNmZTZjLCAweDZjNmNmZTZjLCAweDZjMDAwMDAwLAkvKiAzNCAiICMgKi8KIAkweDAwMDAxMDEwLCAweDdjZDZkNjE2LCAweDdjZDBkNmQ2LCAweDdjMTAxMDAwLAotCTB4MDAwMDAwMDAsIDB4MDA4NmM2NjAsIDB4MzAxODBjYzYsIDB4YzIwMDAwMDAsCS8vIDM2ICQgJQorCTB4MDAwMDAwMDAsIDB4MDA4NmM2NjAsIDB4MzAxODBjYzYsIDB4YzIwMDAwMDAsCS8qIDM2ICQgJSAqLwogCTB4MDAwMDAwMDAsIDB4Mzg2YzZjMzgsIDB4ZGM3NjY2NjYsIDB4ZGMwMDAwMDAsCi0JMHgwMDAwMDAwYywgMHgwYzBjMDYwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwJLy8gMzggJiAnCisJMHgwMDAwMDAwYywgMHgwYzBjMDYwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwJLyogMzggJiAnICovCiAJMHgwMDAwMDAwMCwgMHgzMDE4MGMwYywgMHgwYzBjMGMxOCwgMHgzMDAwMDAwMCwKLQkweDAwMDAwMDAwLCAweDBjMTgzMDMwLCAweDMwMzAzMDE4LCAweDBjMDAwMDAwLAkvLyA0MCAoICkKKwkweDAwMDAwMDAwLCAweDBjMTgzMDMwLCAweDMwMzAzMDE4LCAweDBjMDAwMDAwLAkvKiA0MCAoICkgKi8KIAkweDAwMDAwMDAwLCAweDAwMDA2NjNjLCAweGZmM2M2NjAwLCAweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsIDB4MDAwMDE4MTgsIDB4N2UxODE4MDAsIDB4MDAwMDAwMDAsCS8vIDQyICogKworCTB4MDAwMDAwMDAsIDB4MDAwMDE4MTgsIDB4N2UxODE4MDAsIDB4MDAwMDAwMDAsCS8qIDQyICogKyAqLwogCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDBlMGUsIDB4MGMwNjAwMDAsCi0JMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHg3ZTAwMDAwMCwgMHgwMDAwMDAwMCwJLy8gNDQgLCAtCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHg3ZTAwMDAwMCwgMHgwMDAwMDAwMCwJLyogNDQgLCAtICovCiAJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwNiwgMHgwNjAwMDAwMCwKLQkweDAwMDAwMDAwLCAweDgwYzA2MDMwLCAweDE4MGMwNjAyLCAweDAwMDAwMDAwLAkvLyA0NiAuIC8KKwkweDAwMDAwMDAwLCAweDgwYzA2MDMwLCAweDE4MGMwNjAyLCAweDAwMDAwMDAwLAkvKiA0NiAuIC8gKi8KIAkweDAwMDAwMDdjLCAweGM2ZTZmNmRlLCAweGNlYzZjNjdjLCAweDAwMDAwMDAwLAotCTB4MDAwMDAwMzAsIDB4MzgzYzMwMzAsIDB4MzAzMDMwZmMsIDB4MDAwMDAwMDAsCS8vIDQ4IDAgMQorCTB4MDAwMDAwMzAsIDB4MzgzYzMwMzAsIDB4MzAzMDMwZmMsIDB4MDAwMDAwMDAsCS8qIDQ4IDAgMSAqLwogCTB4MDAwMDAwN2MsIDB4YzZjMDYwMzAsIDB4MTgwY2M2ZmUsIDB4MDAwMDAwMDAsCi0JMHgwMDAwMDA3YywgMHhjNmMwYzA3YywgMHhjMGMwYzY3YywgMHgwMDAwMDAwMCwJLy8gNTAgMiAzCisJMHgwMDAwMDA3YywgMHhjNmMwYzA3YywgMHhjMGMwYzY3YywgMHgwMDAwMDAwMCwJLyogNTAgMiAzICovCiAJMHgwMDAwMDA2MCwgMHg3MDc4NmM2NiwgMHhmZTYwNjBmMCwgMHgwMDAwMDAwMCwKLQkweDAwMDAwMGZlLCAweDA2MDYwNjdlLCAweGMwYzBjNjdjLCAweDAwMDAwMDAwLAkvLyA1MiA0IDUKKwkweDAwMDAwMGZlLCAweDA2MDYwNjdlLCAweGMwYzBjNjdjLCAweDAwMDAwMDAwLAkvKiA1MiA0IDUgKi8KIAkweDAwMDAwMDM4LCAweDBjMDYwNjdlLCAweGM2YzZjNjdjLCAweDAwMDAwMDAwLAotCTB4MDAwMDAwZmUsIDB4YzZjMDYwMzAsIDB4MTgxODE4MTgsIDB4MDAwMDAwMDAsCS8vIDU0IDYgNworCTB4MDAwMDAwZmUsIDB4YzZjMDYwMzAsIDB4MTgxODE4MTgsIDB4MDAwMDAwMDAsCS8qIDU0IDYgNyAqLwogCTB4MDAwMDAwN2MsIDB4YzZjNmM2N2MsIDB4YzZjNmM2N2MsIDB4MDAwMDAwMDAsCi0JMHgwMDAwMDA3YywgMHhjNmM2YzZmYywgMHhjMGMwNjAzOCwgMHgwMDAwMDAwMCwJLy8gNTYgOCA5CisJMHgwMDAwMDA3YywgMHhjNmM2YzZmYywgMHhjMGMwNjAzOCwgMHgwMDAwMDAwMCwJLyogNTYgOCA5ICovCiAJMHgwMDAwMDAwMCwgMHgxODE4MDAwMCwgMHgwMDE4MTgwMCwgMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLCAweDE4MTgwMDAwLCAweDAwMTgxODBjLCAweDAwMDAwMDAwLAkvLyA1OCA6IDsKKwkweDAwMDAwMDAwLCAweDE4MTgwMDAwLCAweDAwMTgxODBjLCAweDAwMDAwMDAwLAkvKiA1OCA6IDsgKi8KIAkweDAwMDAwMDYwLCAweDMwMTgwYzA2LCAweDBjMTgzMDYwLCAweDAwMDAwMDAwLAogCTB4MDAwMDAwMDAsIDB4MDA3ZTAwMDAsIDB4MDA3ZTAwMDAsIDB4MDAwMDAwMDAsCiAJMHgwMDAwMDAwNiwgMHgwYzE4MzA2MCwgMHgzMDE4MGMwNiwgMHgwMDAwMDAwMCwKIAkweDAwMDAwMDdjLCAweGM2YzY2MDMwLCAweDMwMDAzMDMwLCAweDAwMDAwMDAwLAogCTB4MDAwMDAwN2MsIDB4YzZmNmQ2ZDYsIDB4NzYwNjA2N2MsIDB4MDAwMDAwMDAsCi0JMHgwMDAwMDAxMCwgMHgzODZjYzZjNiwgMHhmZWM2YzZjNiwgMHgwMDAwMDAwMCwJLy8gNjQgQCBBCisJMHgwMDAwMDAxMCwgMHgzODZjYzZjNiwgMHhmZWM2YzZjNiwgMHgwMDAwMDAwMCwJLyogNjQgQCBBICovCiAJMHgwMDAwMDA3ZSwgMHhjNmM2YzY3ZSwgMHhjNmM2YzY3ZSwgMHgwMDAwMDAwMCwKLQkweDAwMDAwMDc4LCAweGNjMDYwNjA2LCAweDA2MDZjYzc4LCAweDAwMDAwMDAwLAkvLyA2NgorCTB4MDAwMDAwNzgsIDB4Y2MwNjA2MDYsIDB4MDYwNmNjNzgsIDB4MDAwMDAwMDAsCS8qIDY2ICovCiAJMHgwMDAwMDAzZSwgMHg2NmM2YzZjNiwgMHhjNmM2NjYzZSwgMHgwMDAwMDAwMCwKLQkweDAwMDAwMGZlLCAweDA2MDYwNjNlLCAweDA2MDYwNmZlLCAweDAwMDAwMDAwLAkvLyA2OAorCTB4MDAwMDAwZmUsIDB4MDYwNjA2M2UsIDB4MDYwNjA2ZmUsIDB4MDAwMDAwMDAsCS8qIDY4ICovCiAJMHgwMDAwMDBmZSwgMHgwNjA2MDYzZSwgMHgwNjA2MDYwNiwgMHgwMDAwMDAwMCwKLQkweDAwMDAwMDc4LCAweGNjMDYwNjA2LCAweGY2YzZjY2I4LCAweDAwMDAwMDAwLAkvLyA3MAorCTB4MDAwMDAwNzgsIDB4Y2MwNjA2MDYsIDB4ZjZjNmNjYjgsIDB4MDAwMDAwMDAsCS8qIDcwICovCiAJMHgwMDAwMDBjNiwgMHhjNmM2YzZmZSwgMHhjNmM2YzZjNiwgMHgwMDAwMDAwMCwKLQkweDAwMDAwMDNjLCAweDE4MTgxODE4LCAweDE4MTgxODNjLCAweDAwMDAwMDAwLAkvLyA3MgorCTB4MDAwMDAwM2MsIDB4MTgxODE4MTgsIDB4MTgxODE4M2MsIDB4MDAwMDAwMDAsCS8qIDcyICovCiAJMHgwMDAwMDA2MCwgMHg2MDYwNjA2MCwgMHg2MDY2NjYzYywgMHgwMDAwMDAwMCwKLQkweDAwMDAwMGM2LCAweGM2NjYzNjFlLCAweDM2NjZjNmM2LCAweDAwMDAwMDAwLAkvLyA3NAorCTB4MDAwMDAwYzYsIDB4YzY2NjM2MWUsIDB4MzY2NmM2YzYsIDB4MDAwMDAwMDAsCS8qIDc0ICovCiAJMHgwMDAwMDAwNiwgMHgwNjA2MDYwNiwgMHgwNjA2MDZmZSwgMHgwMDAwMDAwMCwKLQkweDAwMDAwMGM2LCAweGVlZmVkNmM2LCAweGM2YzZjNmM2LCAweDAwMDAwMDAwLAkvLyA3NgorCTB4MDAwMDAwYzYsIDB4ZWVmZWQ2YzYsIDB4YzZjNmM2YzYsIDB4MDAwMDAwMDAsCS8qIDc2ICovCiAJMHgwMDAwMDBjNiwgMHhjZWRlZmVmNiwgMHhlNmM2YzZjNiwgMHgwMDAwMDAwMCwKLQkweDAwMDAwMDM4LCAweDZjYzZjNmM2LCAweGM2YzY2YzM4LCAweDAwMDAwMDAwLAkvLyA3OAorCTB4MDAwMDAwMzgsIDB4NmNjNmM2YzYsIDB4YzZjNjZjMzgsIDB4MDAwMDAwMDAsCS8qIDc4ICovCiAJMHgwMDAwMDA3ZSwgMHhjNmM2YzY3ZSwgMHgwNjA2MDYwNiwgMHgwMDAwMDAwMCwKLQkweDAwMDAwMDM4LCAweDZjYzZjNmM2LCAweGM2ZDY3YzM4LCAweDYwMDAwMDAwLAkvLyA4MAorCTB4MDAwMDAwMzgsIDB4NmNjNmM2YzYsIDB4YzZkNjdjMzgsIDB4NjAwMDAwMDAsCS8qIDgwICovCiAJMHgwMDAwMDA3ZSwgMHhjNmM2YzY3ZSwgMHg2NmM2YzZjNiwgMHgwMDAwMDAwMCwKLQkweDAwMDAwMDdjLCAweGM2YzYwYzM4LCAweDYwYzZjNjdjLCAweDAwMDAwMDAwLAkvLyA4MgorCTB4MDAwMDAwN2MsIDB4YzZjNjBjMzgsIDB4NjBjNmM2N2MsIDB4MDAwMDAwMDAsCS8qIDgyICovCiAJMHgwMDAwMDA3ZSwgMHgxODE4MTgxOCwgMHgxODE4MTgxOCwgMHgwMDAwMDAwMCwKLQkweDAwMDAwMGM2LCAweGM2YzZjNmM2LCAweGM2YzZjNjdjLCAweDAwMDAwMDAwLAkvLyA4NAorCTB4MDAwMDAwYzYsIDB4YzZjNmM2YzYsIDB4YzZjNmM2N2MsIDB4MDAwMDAwMDAsCS8qIDg0ICovCiAJMHgwMDAwMDBjNiwgMHhjNmM2YzZjNiwgMHhjNjZjMzgxMCwgMHgwMDAwMDAwMCwKLQkweDAwMDAwMGM2LCAweGM2YzZjNmM2LCAweGQ2ZDZmZTZjLCAweDAwMDAwMDAwLAkvLyA4NgorCTB4MDAwMDAwYzYsIDB4YzZjNmM2YzYsIDB4ZDZkNmZlNmMsIDB4MDAwMDAwMDAsCS8qIDg2ICovCiAJMHgwMDAwMDBjNiwgMHhjNmM2NmMzOCwgMHg2Y2M2YzZjNiwgMHgwMDAwMDAwMCwKLQkweDAwMDAwMDY2LCAweDY2NjY2NjY2LCAweDNjMTgxODE4LCAweDAwMDAwMDAwLAkvLyA4OAorCTB4MDAwMDAwNjYsIDB4NjY2NjY2NjYsIDB4M2MxODE4MTgsIDB4MDAwMDAwMDAsCS8qIDg4ICovCiAJMHgwMDAwMDBmZSwgMHhjMDYwMzAxOCwgMHgwYzA2MDZmZSwgMHgwMDAwMDAwMCwKLQkweDAwMDAwMDNjLCAweDBjMGMwYzBjLCAweDBjMGMwYzNjLCAweDAwMDAwMDAwLAkvLyA5MAorCTB4MDAwMDAwM2MsIDB4MGMwYzBjMGMsIDB4MGMwYzBjM2MsIDB4MDAwMDAwMDAsCS8qIDkwICovCiAJMHgwMDAwMDAwMiwgMHgwNjBjMTgzMCwgMHg2MGMwODAwMCwgMHgwMDAwMDAwMCwKLQkweDAwMDAwMDNjLCAweDMwMzAzMDMwLCAweDMwMzAzMDNjLCAweDAwMDAwMDAwLAkvLyA5MgorCTB4MDAwMDAwM2MsIDB4MzAzMDMwMzAsIDB4MzAzMDMwM2MsIDB4MDAwMDAwMDAsCS8qIDkyICovCiAJMHgwMDAwMTAzOCwgMHg2Y2M2MDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKIAkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwZmUwMDAwLAogCTB4MDAwMDE4MTgsIDB4MzAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc29sbzZ4MTAvc29sbzYwMTAtcDJtLmMgYi9kcml2ZXJzL3N0YWdpbmcvc29sbzZ4MTAvc29sbzYwMTAtcDJtLmMKaW5kZXggN2VkM2VkNC4uOTU2ZGVhMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3NvbG82eDEwL3NvbG82MDEwLXAybS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zb2xvNngxMC9zb2xvNjAxMC1wMm0uYwpAQCAtMTgsMTAgKzE4LDExIEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjYXR0ZXJsaXN0Lmg+CiAKICNpbmNsdWRlICJzb2xvNjAxMC5oIgogCi0vLyAjZGVmaW5lIFNPTE9fVEVTVF9QMk0KKy8qICNkZWZpbmUgU09MT19URVNUX1AyTSAqLwogCiBpbnQgc29sb19wMm1fZG1hKHN0cnVjdCBzb2xvNjAxMF9kZXYgKnNvbG9fZGV2LCB1OCBpZCwgaW50IHdyLAogCQkgdm9pZCAqc3lzX2FkZHIsIHUzMiBleHRfYWRkciwgdTMyIHNpemUpCkBAIC0zMCw4ICszMSw5IEBACiAJaW50IHJldDsKIAogCVdBUk5fT04oIXNpemUpOwotCVdBUk5fT04oaWQgPj0gU09MT19OUl9QMk0pOwotCWlmICghc2l6ZSB8fCBpZCA+PSBTT0xPX05SX1AyTSkKKwlCVUdfT04oaWQgPj0gU09MT19OUl9QMk0pOworCisJaWYgKCFzaXplKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWRtYV9hZGRyID0gcGNpX21hcF9zaW5nbGUoc29sb19kZXYtPnBkZXYsIHN5c19hZGRyLCBzaXplLApAQCAtNDgsNDEgKzUwLDEzNiBAQAogaW50IHNvbG9fcDJtX2RtYV90KHN0cnVjdCBzb2xvNjAxMF9kZXYgKnNvbG9fZGV2LCB1OCBpZCwgaW50IHdyLAogCQkgICBkbWFfYWRkcl90IGRtYV9hZGRyLCB1MzIgZXh0X2FkZHIsIHUzMiBzaXplKQogewotCXN0cnVjdCBzb2xvX3AybV9kZXYgKnAybV9kZXY7Ci0JdW5zaWduZWQgaW50IHRpbWVvdXQgPSAwOworCXN0cnVjdCBwMm1fZGVzYyAqZGVzYyA9IGt6YWxsb2Moc2l6ZW9mKCpkZXNjKSAqIDIsIEdGUF9ETUEpOworCWludCByZXQ7CiAKLQlXQVJOX09OKCFzaXplKTsKLQlXQVJOX09OKGlkID49IFNPTE9fTlJfUDJNKTsKLQlpZiAoIXNpemUgfHwgaWQgPj0gU09MT19OUl9QMk0pCi0JCXJldHVybiAtRUlOVkFMOworCWlmIChkZXNjID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJc29sb19wMm1fcHVzaF9kZXNjKCZkZXNjWzFdLCB3ciwgZG1hX2FkZHIsIGV4dF9hZGRyLCBzaXplLCAwLCAwKTsKKwlyZXQgPSBzb2xvX3AybV9kbWFfZGVzYyhzb2xvX2RldiwgaWQsIGRlc2MsIDIpOworCWtmcmVlKGRlc2MpOworCisJcmV0dXJuIHJldDsKK30KKwordm9pZCBzb2xvX3AybV9wdXNoX2Rlc2Moc3RydWN0IHAybV9kZXNjICpkZXNjLCBpbnQgd3IsIGRtYV9hZGRyX3QgZG1hX2FkZHIsCisJCQl1MzIgZXh0X2FkZHIsIHUzMiBzaXplLCBpbnQgcmVwZWF0LCB1MzIgZXh0X3NpemUpCit7CisJZGVzYy0+dGEgPSBkbWFfYWRkcjsKKwlkZXNjLT5mYSA9IGV4dF9hZGRyOworCisJZGVzYy0+ZXh0ID0gU09MT19QMk1fQ09QWV9TSVpFKHNpemUgPj4gMik7CisJZGVzYy0+Y3RybCA9IFNPTE9fUDJNX0JVUlNUX1NJWkUoU09MT19QMk1fQlVSU1RfMjU2KSB8CisJCSh3ciA/IFNPTE9fUDJNX1dSSVRFIDogMCkgfCBTT0xPX1AyTV9UUkFOU19PTjsKKworCS8qIEV4dCBzaXplIG9ubHkgbWF0dGVycyB3aGVuIHdlJ3JlIHJlcGVhdGluZyAqLworCWlmIChyZXBlYXQpIHsKKwkJZGVzYy0+ZXh0IHw9IFNPTE9fUDJNX0VYVF9JTkMoZXh0X3NpemUgPj4gMik7CisJCWRlc2MtPmN0cmwgfD0gIFNPTE9fUDJNX1BDSV9JTkMoc2l6ZSA+PiAyKSB8CisJCQlTT0xPX1AyTV9SRVBFQVQocmVwZWF0KTsKKwl9Cit9CisKK2ludCBzb2xvX3AybV9kbWFfZGVzYyhzdHJ1Y3Qgc29sbzYwMTBfZGV2ICpzb2xvX2RldiwgdTggaWQsCisJCSAgICAgIHN0cnVjdCBwMm1fZGVzYyAqZGVzYywgaW50IGRlc2NfY291bnQpCit7CisJc3RydWN0IHNvbG9fcDJtX2RldiAqcDJtX2RldjsKKwl1bnNpZ25lZCBpbnQgdGltZW91dDsKKwlpbnQgcmV0ID0gMDsKKwl1MzIgY29uZmlnID0gMDsKKwlkbWFfYWRkcl90IGRlc2NfZG1hID0gMDsKKworCUJVR19PTihpZCA+PSBTT0xPX05SX1AyTSk7CisJQlVHX09OKCFkZXNjX2NvdW50IHx8IGRlc2NfY291bnQgPiBTT0xPX05SX1AyTV9ERVNDKTsKIAogCXAybV9kZXYgPSAmc29sb19kZXYtPnAybV9kZXZbaWRdOwogCi0JZG93bigmcDJtX2Rldi0+c2VtKTsKKwltdXRleF9sb2NrKCZwMm1fZGV2LT5tdXRleCk7CiAKLXN0YXJ0X2RtYToKKwlzb2xvX3JlZ193cml0ZShzb2xvX2RldiwgU09MT19QMk1fQ09OVFJPTChpZCksIDApOworCiAJSU5JVF9DT01QTEVUSU9OKHAybV9kZXYtPmNvbXBsZXRpb24pOwogCXAybV9kZXYtPmVycm9yID0gMDsKLQlzb2xvX3JlZ193cml0ZShzb2xvX2RldiwgU09MT19QMk1fVEFSX0FEUihpZCksIGRtYV9hZGRyKTsKLQlzb2xvX3JlZ193cml0ZShzb2xvX2RldiwgU09MT19QMk1fRVhUX0FEUihpZCksIGV4dF9hZGRyKTsKLQlzb2xvX3JlZ193cml0ZShzb2xvX2RldiwgU09MT19QMk1fRVhUX0NGRyhpZCksCi0JCSAgICAgICBTT0xPX1AyTV9DT1BZX1NJWkUoc2l6ZSA+PiAyKSk7Ci0Jc29sb19yZWdfd3JpdGUoc29sb19kZXYsIFNPTE9fUDJNX0NPTlRST0woaWQpLAotCQkgICAgICAgU09MT19QMk1fQlVSU1RfU0laRShTT0xPX1AyTV9CVVJTVF8yNTYpIHwKLQkJICAgICAgICh3ciA/IFNPTE9fUDJNX1dSSVRFIDogMCkgfCBTT0xPX1AyTV9UUkFOU19PTik7CiAKKwkvKiBFbmFibGUgdGhlIGRlc2NyaXB0b3JzICovCisJY29uZmlnID0gc29sb19yZWdfcmVhZChzb2xvX2RldiwgU09MT19QMk1fQ09ORklHKGlkKSk7CisJZGVzY19kbWEgPSBwY2lfbWFwX3NpbmdsZShzb2xvX2Rldi0+cGRldiwgZGVzYywKKwkJCQkgIGRlc2NfY291bnQgKiBzaXplb2YoKmRlc2MpLAorCQkJCSAgUENJX0RNQV9UT0RFVklDRSk7CisJc29sb19yZWdfd3JpdGUoc29sb19kZXYsIFNPTE9fUDJNX0RFU19BRFIoaWQpLCBkZXNjX2RtYSk7CisJc29sb19yZWdfd3JpdGUoc29sb19kZXYsIFNPTE9fUDJNX0RFU0NfSUQoaWQpLCBkZXNjX2NvdW50IC0gMSk7CisJc29sb19yZWdfd3JpdGUoc29sb19kZXYsIFNPTE9fUDJNX0NPTkZJRyhpZCksIGNvbmZpZyB8CisJCSAgICAgICBTT0xPX1AyTV9ERVNDX01PREUpOworCisJLyogU2hvdWxkIGhhdmUgYWxsIGRlc2NyaXB0b3JzIGNvbXBsZXRlZCBmcm9tIG9uZSBpbnRlcnJ1cHQgKi8KIAl0aW1lb3V0ID0gd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZwMm1fZGV2LT5jb21wbGV0aW9uLCBIWik7CiAKIAlzb2xvX3JlZ193cml0ZShzb2xvX2RldiwgU09MT19QMk1fQ09OVFJPTChpZCksIDApOwogCi0JLyogWFhYIFJlYWxseSBsb29rcyB0byBtZSBsaWtlIHdlIHdpbGwgZ2V0IHN0dWNrIGhlcmUgaWYgYQotCSAqIHJlYWwgUENJIFAyTSBlcnJvciBvY2N1cnMgKi8KKwkvKiBSZXNldCBiYWNrIHRvIG5vbi1kZXNjcmlwdG9yIG1vZGUgKi8KKwlzb2xvX3JlZ193cml0ZShzb2xvX2RldiwgU09MT19QMk1fQ09ORklHKGlkKSwgY29uZmlnKTsKKwlzb2xvX3JlZ193cml0ZShzb2xvX2RldiwgU09MT19QMk1fREVTQ19JRChpZCksIDApOworCXNvbG9fcmVnX3dyaXRlKHNvbG9fZGV2LCBTT0xPX1AyTV9ERVNfQURSKGlkKSwgMCk7CisJcGNpX3VubWFwX3NpbmdsZShzb2xvX2Rldi0+cGRldiwgZGVzY19kbWEsCisJCQkgZGVzY19jb3VudCAqIHNpemVvZigqZGVzYyksCisJCQkgUENJX0RNQV9UT0RFVklDRSk7CisKIAlpZiAocDJtX2Rldi0+ZXJyb3IpCi0JCWdvdG8gc3RhcnRfZG1hOworCQlyZXQgPSAtRUlPOworCWVsc2UgaWYgKHRpbWVvdXQgPT0gMCkKKwkJcmV0ID0gLUVBR0FJTjsKIAotCXVwKCZwMm1fZGV2LT5zZW0pOworCW11dGV4X3VubG9jaygmcDJtX2Rldi0+bXV0ZXgpOwogCi0JcmV0dXJuICh0aW1lb3V0ID09IDApID8gLUVBR0FJTiA6IDA7CisJV0FSTl9PTl9PTkNFKHJldCk7CisKKwlyZXR1cm4gcmV0OworfQorCitpbnQgc29sb19wMm1fZG1hX3NnKHN0cnVjdCBzb2xvNjAxMF9kZXYgKnNvbG9fZGV2LCB1OCBpZCwKKwkJICAgIHN0cnVjdCBwMm1fZGVzYyAqcGRlc2MsIGludCB3ciwKKwkJICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csIHUzMiBzZ19vZmYsCisJCSAgICB1MzIgZXh0X2FkZHIsIHUzMiBzaXplKQoreworCWludCBpOworCWludCBpZHg7CisKKwlCVUdfT04oaWQgPj0gU09MT19OUl9QMk0pOworCisJaWYgKFdBUk5fT05fT05DRSghc2l6ZSkpCisJCXJldHVybiAtRUlOVkFMOworCisJbWVtc2V0KHBkZXNjLCAwLCBzaXplb2YoKnBkZXNjKSk7CisKKwkvKiBTaG91bGQgcmV3cml0ZSB0aGlzIHRvIGhhbmRsZSA+IFNPTE9fTlJfUDJNX0RFU0MgdHJhbnNhY3Rpb25zICovCisJZm9yIChpID0gMCwgaWR4ID0gMTsgaWR4IDwgU09MT19OUl9QMk1fREVTQyAmJiBzZyAmJiBzaXplID4gMDsKKwkgICAgIGkrKywgc2cgPSBzZ19uZXh0KHNnKSkgeworCQlzdHJ1Y3QgcDJtX2Rlc2MgKmRlc2MgPSAmcGRlc2NbaWR4XTsKKwkJdTMyIHNnX2xlbiA9IHNnX2RtYV9sZW4oc2cpOworCQl1MzIgbGVuOworCisJCWlmIChzZ19vZmYgPj0gc2dfbGVuKSB7CisJCQlzZ19vZmYgLT0gc2dfbGVuOworCQkJY29udGludWU7CisJCX0KKworCQlzZ19sZW4gLT0gc2dfb2ZmOworCQlsZW4gPSBtaW4oc2dfbGVuLCBzaXplKTsKKworCQlzb2xvX3AybV9wdXNoX2Rlc2MoZGVzYywgd3IsIHNnX2RtYV9hZGRyZXNzKHNnKSArIHNnX29mZiwKKwkJCQkgICBleHRfYWRkciwgbGVuLCAwLCAwKTsKKworCQlzaXplIC09IGxlbjsKKwkJZXh0X2FkZHIgKz0gbGVuOworCQlpZHgrKzsKKworCQlzZ19vZmYgPSAwOworCX0KKworCVdBUk5fT05fT05DRShzaXplIHx8IGkgPj0gU09MT19OUl9QMk1fREVTQyk7CisKKwlyZXR1cm4gc29sb19wMm1fZG1hX2Rlc2Moc29sb19kZXYsIGlkLCBwZGVzYywgaWR4KTsKIH0KIAogI2lmZGVmIFNPTE9fVEVTVF9QMk0KQEAgLTE0NywxMyArMjQ0LDE2IEBACiAJcmV0dXJuOwogfQogI2Vsc2UKLSNkZWZpbmUgcnVuX3AybV90ZXN0KF9fc29sbykJZG97fXdoaWxlKDApCisjZGVmaW5lIHJ1bl9wMm1fdGVzdChfX3NvbG8pCWRvIHt9IHdoaWxlICgwKQogI2VuZGlmCiAKIHZvaWQgc29sb19wMm1faXNyKHN0cnVjdCBzb2xvNjAxMF9kZXYgKnNvbG9fZGV2LCBpbnQgaWQpCiB7CisJc3RydWN0IHNvbG9fcDJtX2RldiAqcDJtX2RldiA9ICZzb2xvX2Rldi0+cDJtX2RldltpZF07CisKIAlzb2xvX3JlZ193cml0ZShzb2xvX2RldiwgU09MT19JUlFfU1RBVCwgU09MT19JUlFfUDJNKGlkKSk7Ci0JY29tcGxldGUoJnNvbG9fZGV2LT5wMm1fZGV2W2lkXS5jb21wbGV0aW9uKTsKKworCWNvbXBsZXRlKCZwMm1fZGV2LT5jb21wbGV0aW9uKTsKIH0KIAogdm9pZCBzb2xvX3AybV9lcnJvcl9pc3Ioc3RydWN0IHNvbG82MDEwX2RldiAqc29sb19kZXYsIHUzMiBzdGF0dXMpCkBAIC0xODgsMTYgKzI4OCwxNCBAQAogCWZvciAoaSA9IDA7IGkgPCBTT0xPX05SX1AyTTsgaSsrKSB7CiAJCXAybV9kZXYgPSAmc29sb19kZXYtPnAybV9kZXZbaV07CiAKLQkJc2VtYV9pbml0KCZwMm1fZGV2LT5zZW0sIDEpOworCQltdXRleF9pbml0KCZwMm1fZGV2LT5tdXRleCk7CiAJCWluaXRfY29tcGxldGlvbigmcDJtX2Rldi0+Y29tcGxldGlvbik7CiAKLQkJc29sb19yZWdfd3JpdGUoc29sb19kZXYsIFNPTE9fUDJNX0RFU19BRFIoaSksCi0JCQkgICAgICAgX19wYShwMm1fZGV2LT5kZXNjKSk7Ci0KIAkJc29sb19yZWdfd3JpdGUoc29sb19kZXYsIFNPTE9fUDJNX0NPTlRST0woaSksIDApOwogCQlzb2xvX3JlZ193cml0ZShzb2xvX2RldiwgU09MT19QMk1fQ09ORklHKGkpLAogCQkJICAgICAgIFNPTE9fUDJNX0NTQ18xNkJJVF81NjUgfAotCQkJICAgICAgIFNPTE9fUDJNX0RNQV9JTlRFUlZBTCgwKSB8CisJCQkgICAgICAgU09MT19QMk1fRE1BX0lOVEVSVkFMKDMpIHwKKwkJCSAgICAgICBTT0xPX1AyTV9ERVNDX0lOVFJfT1BUIHwKIAkJCSAgICAgICBTT0xPX1AyTV9QQ0lfTUFTVEVSX01PREUpOwogCQlzb2xvNjAxMF9pcnFfb24oc29sb19kZXYsIFNPTE9fSVJRX1AyTShpKSk7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NvbG82eDEwL3NvbG82MDEwLXR3MjguYyBiL2RyaXZlcnMvc3RhZ2luZy9zb2xvNngxMC9zb2xvNjAxMC10dzI4LmMKaW5kZXggMDE1OWM4My4uOTA1YTZhZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3NvbG82eDEwL3NvbG82MDEwLXR3MjguYworKysgYi9kcml2ZXJzL3N0YWdpbmcvc29sbzZ4MTAvc29sbzYwMTAtdHcyOC5jCkBAIC0zNSwxMDcgKzM1LDEwNyBAQAogI2RlZmluZSBERUZBVUxUX1ZBQ1RJVkVfUEFMCQkoMzEyLURFRkFVTFRfVkRFTEFZX1BBTCkKIAogc3RhdGljIHU4IHRibF90dzI4NjRfdGVtcGxhdGVbXSA9IHsKLQkweDAwLCAweDAwLCAweDgwLCAweDEwLCAweDgwLCAweDgwLCAweDAwLCAweDAyLCAvLyAweDAwCisJMHgwMCwgMHgwMCwgMHg4MCwgMHgxMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMiwgLyogMHgwMCAqLwogCTB4MTIsIDB4ZjUsIDB4MDksIDB4ZDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4N2YsCi0JMHgwMCwgMHgwMCwgMHg4MCwgMHgxMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMiwgLy8gMHgxMAorCTB4MDAsIDB4MDAsIDB4ODAsIDB4MTAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDIsIC8qIDB4MTAgKi8KIAkweDEyLCAweGY1LCAweDA5LCAweGQwLCAweDAwLCAweDAwLCAweDAwLCAweDdmLAotCTB4MDAsIDB4MDAsIDB4ODAsIDB4MTAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDIsIC8vIDB4MjAKKwkweDAwLCAweDAwLCAweDgwLCAweDEwLCAweDgwLCAweDgwLCAweDAwLCAweDAyLCAvKiAweDIwICovCiAJMHgxMiwgMHhmNSwgMHgwOSwgMHhkMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3ZiwKLQkweDAwLCAweDAwLCAweDgwLCAweDEwLCAweDgwLCAweDgwLCAweDAwLCAweDAyLCAvLyAweDMwCisJMHgwMCwgMHgwMCwgMHg4MCwgMHgxMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMiwgLyogMHgzMCAqLwogCTB4MTIsIDB4ZjUsIDB4MDksIDB4ZDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4N2YsCi0JMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLy8gMHg0MAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDAgKi8KIAkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8vIDB4NTAKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDUwICovCiAJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvLyAweDYwCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2MCAqLwogCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLy8gMHg3MAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzAgKi8KIAkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEEzLCAweDAwLAotCTB4MDAsIDB4MDIsIDB4MDAsIDB4Y2MsIDB4MDAsIDB4ODAsIDB4NDQsIDB4NTAsIC8vIDB4ODAKKwkweDAwLCAweDAyLCAweDAwLCAweGNjLCAweDAwLCAweDgwLCAweDQ0LCAweDUwLCAvKiAweDgwICovCiAJMHgyMiwgMHgwMSwgMHhkOCwgMHhiYywgMHhiOCwgMHg0NCwgMHgzOCwgMHgwMCwKLQkweDAwLCAweDc4LCAweDcyLCAweDNlLCAweDE0LCAweGE1LCAweGU0LCAweDA1LCAvLyAweDkwCisJMHgwMCwgMHg3OCwgMHg3MiwgMHgzZSwgMHgxNCwgMHhhNSwgMHhlNCwgMHgwNSwgLyogMHg5MCAqLwogCTB4MDAsIDB4MjgsIDB4NDQsIDB4NDQsIDB4YTAsIDB4ODgsIDB4NWEsIDB4MDEsCi0JMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgxYSwgMHgxYSwgMHgxYSwgMHgxYSwgLy8gMHhhMAorCTB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MWEsIDB4MWEsIDB4MWEsIDB4MWEsIC8qIDB4YTAgKi8KIAkweDAwLCAweDAwLCAweDAwLCAweGYwLCAweGYwLCAweGYwLCAweGYwLCAweDQ0LAotCTB4NDQsIDB4MGEsIDB4MDAsIDB4ZmYsIDB4ZWYsIDB4ZWYsIDB4ZWYsIDB4ZWYsIC8vIDB4YjAKKwkweDQ0LCAweDBhLCAweDAwLCAweGZmLCAweGVmLCAweGVmLCAweGVmLCAweGVmLCAvKiAweGIwICovCiAJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvLyAweGMwCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhjMCAqLwogCTB4MDAsIDB4MDAsIDB4NTUsIDB4MDAsIDB4YjEsIDB4ZTQsIDB4NDAsIDB4MDAsCi0JMHg3NywgMHg3NywgMHgwMSwgMHgxMywgMHg1NywgMHg5YiwgMHhkZiwgMHgyMCwgLy8gMHhkMAorCTB4NzcsIDB4NzcsIDB4MDEsIDB4MTMsIDB4NTcsIDB4OWIsIDB4ZGYsIDB4MjAsIC8qIDB4ZDAgKi8KIAkweDY0LCAweGE4LCAweGVjLCAweGQxLCAweDBmLCAweDExLCAweDExLCAweDgxLAotCTB4MTAsIDB4ZTAsIDB4YmIsIDB4YmIsIDB4MDAsIDB4MTEsIDB4MDAsIDB4MDAsIC8vIDB4ZTAKKwkweDEwLCAweGUwLCAweGJiLCAweGJiLCAweDAwLCAweDExLCAweDAwLCAweDAwLCAvKiAweGUwICovCiAJMHgxMSwgMHgwMCwgMHgwMCwgMHgxMSwgMHgwMCwgMHgwMCwgMHgxMSwgMHgwMCwKLQkweDgzLCAweGI1LCAweDA5LCAweDc4LCAweDg1LCAweDAwLCAweDAxLCAweDIwLCAvLyAweGYwCisJMHg4MywgMHhiNSwgMHgwOSwgMHg3OCwgMHg4NSwgMHgwMCwgMHgwMSwgMHgyMCwgLyogMHhmMCAqLwogCTB4NjQsIDB4MTEsIDB4NDAsIDB4YWYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4MDAsCiB9OwogCiBzdGF0aWMgdTggdGJsX3R3Mjg2NV9udHNjX3RlbXBsYXRlW10gPSB7Ci0JMHgwMCwgMHhmMCwgMHg3MCwgMHgzMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMiwgLy8gMHgwMAorCTB4MDAsIDB4ZjAsIDB4NzAsIDB4MzAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDIsIC8qIDB4MDAgKi8KIAkweDEyLCAweGZmLCAweDA5LCAweGQwLCAweDAwLCAweDAwLCAweDAwLCAweDdmLAotCTB4MDAsIDB4ZjAsIDB4NzAsIDB4MzAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDIsIC8vIDB4MTAKKwkweDAwLCAweGYwLCAweDcwLCAweDMwLCAweDgwLCAweDgwLCAweDAwLCAweDAyLCAvKiAweDEwICovCiAJMHgxMiwgMHhmZiwgMHgwOSwgMHhkMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3ZiwKLQkweDAwLCAweGYwLCAweDcwLCAweDMwLCAweDgwLCAweDgwLCAweDAwLCAweDAyLCAvLyAweDIwCisJMHgwMCwgMHhmMCwgMHg3MCwgMHgzMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMiwgLyogMHgyMCAqLwogCTB4MTIsIDB4ZmYsIDB4MDksIDB4ZDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4N2YsCi0JMHgwMCwgMHhmMCwgMHg3MCwgMHg0OCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMiwgLy8gMHgzMAorCTB4MDAsIDB4ZjAsIDB4NzAsIDB4NDgsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDIsIC8qIDB4MzAgKi8KIAkweDEyLCAweGZmLCAweDA5LCAweGQwLCAweDAwLCAweDAwLCAweDAwLCAweDdmLAotCTB4MDAsIDB4MDAsIDB4OTAsIDB4NjgsIDB4MDAsIDB4MzgsIDB4ODAsIDB4ODAsIC8vIDB4NDAKKwkweDAwLCAweDAwLCAweDkwLCAweDY4LCAweDAwLCAweDM4LCAweDgwLCAweDgwLCAvKiAweDQwICovCiAJMHg4MCwgMHg4MCwgMHg3NywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvLyAweDUwCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1MCAqLwogCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JMHg0NSwgMHgxMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLy8gMHg2MAorCTB4NDUsIDB4MTEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjAgKi8KIAkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDIxLCAweDQzLAotCTB4MDgsIDB4MDAsIDB4MDAsIDB4MDEsIDB4ZjEsIDB4MDMsIDB4RUYsIDB4MDMsIC8vIDB4NzAKKwkweDA4LCAweDAwLCAweDAwLCAweDAxLCAweGYxLCAweDAzLCAweEVGLCAweDAzLCAvKiAweDcwICovCiAJMHhFOSwgMHgwMywgMHhEOSwgMHgxNSwgMHgxNSwgMHhFNCwgMHhBMywgMHg4MCwKLQkweDAwLCAweDAyLCAweDAwLCAweENDLCAweDAwLCAweDgwLCAweDQ0LCAweDUwLCAvLyAweDgwCisJMHgwMCwgMHgwMiwgMHgwMCwgMHhDQywgMHgwMCwgMHg4MCwgMHg0NCwgMHg1MCwgLyogMHg4MCAqLwogCTB4MjIsIDB4MDEsIDB4RDgsIDB4QkMsIDB4QjgsIDB4NDQsIDB4MzgsIDB4MDAsCi0JMHgwMCwgMHg3OCwgMHg0NCwgMHgzRCwgMHgxNCwgMHhBNSwgMHhFMCwgMHgwNSwgLy8gMHg5MAorCTB4MDAsIDB4NzgsIDB4NDQsIDB4M0QsIDB4MTQsIDB4QTUsIDB4RTAsIDB4MDUsIC8qIDB4OTAgKi8KIAkweDAwLCAweDI4LCAweDQ0LCAweDQ0LCAweEEwLCAweDkwLCAweDUyLCAweDEzLAotCTB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MUEsIDB4MUEsIDB4MUIsIDB4MUEsIC8vIDB4YTAKKwkweDA4LCAweDA4LCAweDA4LCAweDA4LCAweDFBLCAweDFBLCAweDFCLCAweDFBLCAvKiAweGEwICovCiAJMHgwMCwgMHgwMCwgMHgwMCwgMHhGMCwgMHhGMCwgMHhGMCwgMHhGMCwgMHg0NCwKLQkweDQ0LCAweDRBLCAweDAwLCAweEZGLCAweEVGLCAweEVGLCAweEVGLCAweEVGLCAvLyAweGIwCisJMHg0NCwgMHg0QSwgMHgwMCwgMHhGRiwgMHhFRiwgMHhFRiwgMHhFRiwgMHhFRiwgLyogMHhiMCAqLwogCTB4RkYsIDB4RTcsIDB4RTksIDB4RTksIDB4RUIsIDB4RkYsIDB4RDYsIDB4RDgsCi0JMHhEOCwgMHhENywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLy8gMHhjMAorCTB4RDgsIDB4RDcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4YzAgKi8KIAkweDAwLCAweDAwLCAweDU1LCAweDAwLCAweEU0LCAweDM5LCAweDAwLCAweDgwLAotCTB4NzcsIDB4NzcsIDB4MDMsIDB4MjAsIDB4NTcsIDB4OWIsIDB4ZGYsIDB4MzEsIC8vIDB4ZDAKKwkweDc3LCAweDc3LCAweDAzLCAweDIwLCAweDU3LCAweDliLCAweGRmLCAweDMxLCAvKiAweGQwICovCiAJMHg2NCwgMHhhOCwgMHhlYywgMHhkMSwgMHgwZiwgMHgxMSwgMHgxMSwgMHg4MSwKLQkweDEwLCAweEMwLCAweEFBLCAweEFBLCAweDAwLCAweDExLCAweDAwLCAweDAwLCAvLyAweGUwCisJMHgxMCwgMHhDMCwgMHhBQSwgMHhBQSwgMHgwMCwgMHgxMSwgMHgwMCwgMHgwMCwgLyogMHhlMCAqLwogCTB4MTEsIDB4MDAsIDB4MDAsIDB4MTEsIDB4MDAsIDB4MDAsIDB4MTEsIDB4MDAsCi0JMHg4MywgMHhCNSwgMHgwOSwgMHg3OCwgMHg4NSwgMHgwMCwgMHgwMSwgMHgyMCwgLy8gMHhmMAorCTB4ODMsIDB4QjUsIDB4MDksIDB4NzgsIDB4ODUsIDB4MDAsIDB4MDEsIDB4MjAsIC8qIDB4ZjAgKi8KIAkweDY0LCAweDUxLCAweDQwLCAweGFmLCAweEZGLCAweEYwLCAweDAwLCAweEMwLAogfTsKIAogc3RhdGljIHU4IHRibF90dzI4NjVfcGFsX3RlbXBsYXRlW10gPSB7Ci0JMHgwMCwgMHhmMCwgMHg3MCwgMHgzMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgxMiwgLy8gMHgwMAorCTB4MDAsIDB4ZjAsIDB4NzAsIDB4MzAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MTIsIC8qIDB4MDAgKi8KIAkweDExLCAweGZmLCAweDAxLCAweGMzLCAweDAwLCAweDAwLCAweDAxLCAweDdmLAotCTB4MDAsIDB4ZjAsIDB4NzAsIDB4MzAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MTIsIC8vIDB4MTAKKwkweDAwLCAweGYwLCAweDcwLCAweDMwLCAweDgwLCAweDgwLCAweDAwLCAweDEyLCAvKiAweDEwICovCiAJMHgxMSwgMHhmZiwgMHgwMSwgMHhjMywgMHgwMCwgMHgwMCwgMHgwMSwgMHg3ZiwKLQkweDAwLCAweGYwLCAweDcwLCAweDMwLCAweDgwLCAweDgwLCAweDAwLCAweDEyLCAvLyAweDIwCisJMHgwMCwgMHhmMCwgMHg3MCwgMHgzMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgxMiwgLyogMHgyMCAqLwogCTB4MTEsIDB4ZmYsIDB4MDEsIDB4YzMsIDB4MDAsIDB4MDAsIDB4MDEsIDB4N2YsCi0JMHgwMCwgMHhmMCwgMHg3MCwgMHgzMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgxMiwgLy8gMHgzMAorCTB4MDAsIDB4ZjAsIDB4NzAsIDB4MzAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MTIsIC8qIDB4MzAgKi8KIAkweDExLCAweGZmLCAweDAxLCAweGMzLCAweDAwLCAweDAwLCAweDAxLCAweDdmLAotCTB4MDAsIDB4OTQsIDB4OTAsIDB4NDgsIDB4MDAsIDB4MzgsIDB4N0YsIDB4ODAsIC8vIDB4NDAKKwkweDAwLCAweDk0LCAweDkwLCAweDQ4LCAweDAwLCAweDM4LCAweDdGLCAweDgwLCAvKiAweDQwICovCiAJMHg4MCwgMHg4MCwgMHg3NywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvLyAweDUwCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1MCAqLwogCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JMHg0NSwgMHgxMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLy8gMHg2MAorCTB4NDUsIDB4MTEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjAgKi8KIAkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDIxLCAweDQzLAotCTB4MDgsIDB4MDAsIDB4MDAsIDB4MDEsIDB4ZjEsIDB4MDMsIDB4RUYsIDB4MDMsIC8vIDB4NzAKKwkweDA4LCAweDAwLCAweDAwLCAweDAxLCAweGYxLCAweDAzLCAweEVGLCAweDAzLCAvKiAweDcwICovCiAJMHhFQSwgMHgwMywgMHhEOSwgMHgxNSwgMHgxNSwgMHhFNCwgMHhBMywgMHg4MCwKLQkweDAwLCAweDAyLCAweDAwLCAweENDLCAweDAwLCAweDgwLCAweDQ0LCAweDUwLCAvLyAweDgwCisJMHgwMCwgMHgwMiwgMHgwMCwgMHhDQywgMHgwMCwgMHg4MCwgMHg0NCwgMHg1MCwgLyogMHg4MCAqLwogCTB4MjIsIDB4MDEsIDB4RDgsIDB4QkMsIDB4QjgsIDB4NDQsIDB4MzgsIDB4MDAsCi0JMHgwMCwgMHg3OCwgMHg0NCwgMHgzRCwgMHgxNCwgMHhBNSwgMHhFMCwgMHgwNSwgLy8gMHg5MAorCTB4MDAsIDB4NzgsIDB4NDQsIDB4M0QsIDB4MTQsIDB4QTUsIDB4RTAsIDB4MDUsIC8qIDB4OTAgKi8KIAkweDAwLCAweDI4LCAweDQ0LCAweDQ0LCAweEEwLCAweDkwLCAweDUyLCAweDEzLAotCTB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIC8vIDB4YTAKKwkweDA4LCAweDA4LCAweDA4LCAweDA4LCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAvKiAweGEwICovCiAJMHgwMCwgMHgwMCwgMHgwMCwgMHhGMCwgMHhGMCwgMHhGMCwgMHhGMCwgMHg0NCwKLQkweDQ0LCAweDRBLCAweDAwLCAweEZGLCAweEVGLCAweEVGLCAweEVGLCAweEVGLCAvLyAweGIwCisJMHg0NCwgMHg0QSwgMHgwMCwgMHhGRiwgMHhFRiwgMHhFRiwgMHhFRiwgMHhFRiwgLyogMHhiMCAqLwogCTB4RkYsIDB4RTcsIDB4RTksIDB4RTksIDB4RTksIDB4RkYsIDB4RDcsIDB4RDgsCi0JMHhEOSwgMHhEOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLy8gMHhjMAorCTB4RDksIDB4RDgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4YzAgKi8KIAkweDAwLCAweDAwLCAweDU1LCAweDAwLCAweEU0LCAweDM5LCAweDAwLCAweDgwLAotCTB4NzcsIDB4NzcsIDB4MDMsIDB4MjAsIDB4NTcsIDB4OWIsIDB4ZGYsIDB4MzEsIC8vIDB4ZDAKKwkweDc3LCAweDc3LCAweDAzLCAweDIwLCAweDU3LCAweDliLCAweGRmLCAweDMxLCAvKiAweGQwICovCiAJMHg2NCwgMHhhOCwgMHhlYywgMHhkMSwgMHgwZiwgMHgxMSwgMHgxMSwgMHg4MSwKLQkweDEwLCAweEMwLCAweEFBLCAweEFBLCAweDAwLCAweDExLCAweDAwLCAweDAwLCAvLyAweGUwCisJMHgxMCwgMHhDMCwgMHhBQSwgMHhBQSwgMHgwMCwgMHgxMSwgMHgwMCwgMHgwMCwgLyogMHhlMCAqLwogCTB4MTEsIDB4MDAsIDB4MDAsIDB4MTEsIDB4MDAsIDB4MDAsIDB4MTEsIDB4MDAsCi0JMHg4MywgMHhCNSwgMHgwOSwgMHgwMCwgMHhBMCwgMHgwMCwgMHgwMSwgMHgyMCwgLy8gMHhmMAorCTB4ODMsIDB4QjUsIDB4MDksIDB4MDAsIDB4QTAsIDB4MDAsIDB4MDEsIDB4MjAsIC8qIDB4ZjAgKi8KIAkweDY0LCAweDUxLCAweDQwLCAweGFmLCAweEZGLCAweEYwLCAweDAwLCAweEMwLAogfTsKIApAQCAtMTgxLDggKzE4MSw4IEBACiAJCW1zbGVlcF9pbnRlcnJ1cHRpYmxlKDEpOwogCX0KIAotLy8JcHJpbnRrKCJzb2xvNjAxMC90dzI4OiBFcnJvciB3cml0aW5nIHJlZ2lzdGVyOiAlMDJ4LT4lMDJ4IFslMDJ4XVxuIiwKLS8vCQlhZGRyLCBvZmYsIHZhbCk7CisvKglwcmludGsoInNvbG82MDEwL3R3Mjg6IEVycm9yIHdyaXRpbmcgcmVnaXN0ZXI6ICUwMngtPiUwMnggWyUwMnhdXG4iLAorCQlhZGRyLCBvZmYsIHZhbCk7ICovCiB9CiAKIHN0YXRpYyBpbnQgdHcyODY1X3NldHVwKHN0cnVjdCBzb2xvNjAxMF9kZXYgKnNvbG9fZGV2LCB1OCBkZXZfYWRkcikKQEAgLTIxNyw3ICsyMTcsNyBAQAogCiAJZm9yIChpID0gMDsgaSA8IDB4ZmY7IGkrKykgewogCQkvKiBTa2lwIHJlYWQgb25seSByZWdpc3RlcnMgKi8KLQkJaWYgKGkgPj0gMHhiOCAmJiBpIDw9IDB4YzEgKQorCQlpZiAoaSA+PSAweGI4ICYmIGkgPD0gMHhjMSkKIAkJCWNvbnRpbnVlOwogCQlpZiAoKGkgJiB+MHgzMCkgPT0gMHgwMCB8fAogCQkgICAgKGkgJiB+MHgzMCkgPT0gMHgwYyB8fApAQCAtMzAyLDcgKzMwMiw3IEBACiAKIAlmb3IgKGkgPSAwOyBpIDwgMHhmZjsgaSsrKSB7CiAJCS8qIFNraXAgcmVhZCBvbmx5IHJlZ2lzdGVycyAqLwotCQlpZiAoaSA+PSAweGI4ICYmIGkgPD0gMHhjMSApCisJCWlmIChpID49IDB4YjggJiYgaSA8PSAweGMxKQogCQkJY29udGludWU7CiAJCWlmICgoaSAmIH4weDMwKSA9PSAweDAwIHx8CiAJCSAgICAoaSAmIH4weDMwKSA9PSAweDBjIHx8CkBAIC0zMzQsMTMgKzMzNCwxMyBAQAogCX07CiAKIAl1OCB0YmxfdHcyODE1X3NmcltdID0gewotCQkweDAwLCAweDAwLCAweDAwLCAweGMwLCAweDQ1LCAweGEwLCAweGQwLCAweDJmLCAvLyAweDAwCisJCTB4MDAsIDB4MDAsIDB4MDAsIDB4YzAsIDB4NDUsIDB4YTAsIDB4ZDAsIDB4MmYsIC8qIDB4MDAgKi8KIAkJMHg2NCwgMHg4MCwgMHg4MCwgMHg4MiwgMHg4MiwgMHgwMCwgMHgwMCwgMHgwMCwKLQkJMHgwMCwgMHgwZiwgMHgwNSwgMHgwMCwgMHgwMCwgMHg4MCwgMHgwNiwgMHgwMCwgLy8gMHgxMAorCQkweDAwLCAweDBmLCAweDA1LCAweDAwLCAweDAwLCAweDgwLCAweDA2LCAweDAwLCAvKiAweDEwICovCiAJCTB4MDAsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4OGYsIDB4MDAsIDB4MDAsIDB4MDAsCi0JCTB4ODgsIDB4ODgsIDB4YzAsIDB4MDAsIDB4MjAsIDB4NjQsIDB4YTgsIDB4ZWMsIC8vIDB4MjAKKwkJMHg4OCwgMHg4OCwgMHhjMCwgMHgwMCwgMHgyMCwgMHg2NCwgMHhhOCwgMHhlYywgLyogMHgyMCAqLwogCQkweDMxLCAweDc1LCAweGI5LCAweGZkLCAweDAwLCAweDAwLCAweDg4LCAweDg4LAotCQkweDg4LCAweDExLCAweDAwLCAweDg4LCAweDg4LCAweDAwLAkJLy8gMHgzMAorCQkweDg4LCAweDExLCAweDAwLCAweDg4LCAweDg4LCAweDAwLAkJLyogMHgzMCAqLwogCX07CiAJdTggKnRibF90dzI4MTVfY29tbW9uOwogCWludCBpOwpAQCAtNDU5LDcgKzQ1OSw3IEBACiAKIAkJZm9yIChpID0gMDsgaSA8IDB4MGY7IGkrKykgewogCQkJaWYgKGkgPT0gMHgwMCkKLQkJCQljb250aW51ZTsJLy8gcmVhZC1vbmx5CisJCQkJY29udGludWU7CS8qIHJlYWQtb25seSAqLwogCQkJc29sb19pMmNfd3JpdGVieXRlKHNvbG9fZGV2LCBTT0xPX0kyQ19UVywKIAkJCQkJICAgZGV2X2FkZHIsIChjaCAqIDB4MTApICsgaSwKIAkJCQkJICAgdGJsX3R3MjgxNV9jb21tb25baV0pOwpAQCAtNTk3LDcgKzU5Nyw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLS8qIAorLyoKICAqIFdlIGFjY2Vzc2VkIHRoZSB2aWRlbyBzdGF0dXMgc2lnbmFsIGluIHRoZSBUZWNod2VsbCBjaGlwIHRocm91Z2gKICAqIGlpYy9pMmMgYmVjYXVzZSB0aGUgdmlkZW8gc3RhdHVzIHJlcG9ydGVkIGJ5IHJlZ2lzdGVyIFJFR19WSV9TVEFUVVMxCiAgKiAoYWRkcmVzcyAweDAxMkMpIG9mIHRoZSBTT0xPNjAxMCBjaGlwIGRvZXNuJ3QgZ2l2ZSB0aGUgY29ycmVjdCB2aWRlbwpAQCAtNzUxLDcgKzc1MSw3IEBACiAJCXJ2YWwgPSB0d19yZWFkYnl0ZShzb2xvX2RldiwgY2hpcF9udW0sCiAJCQkJICAgVFcyODZ4X0JSSUdIVE5FU1NfQUREUihjaCksCiAJCQkJICAgVFdfQlJJR0hUTkVTU19BRERSKGNoKSk7Ci0JCWlmIChpc190dzI4Nngoc29sb19kZXYsIGNoaXBfbnVtKSkgCisJCWlmIChpc190dzI4Nngoc29sb19kZXYsIGNoaXBfbnVtKSkKIAkJCSp2YWwgPSAoczMyKSgoY2hhcilydmFsKSArIDEyODsKIAkJZWxzZQogCQkJKnZhbCA9IHJ2YWw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc29sbzZ4MTAvc29sbzYwMTAtdjRsMi1lbmMuYyBiL2RyaXZlcnMvc3RhZ2luZy9zb2xvNngxMC9zb2xvNjAxMC12NGwyLWVuYy5jCmluZGV4IDA5N2U4MmIuLjdiYmI5NDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9zb2xvNngxMC9zb2xvNjAxMC12NGwyLWVuYy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zb2xvNngxMC9zb2xvNjAxMC12NGwyLWVuYy5jCkBAIC0yNCw3ICsyNCw3IEBACiAKICNpbmNsdWRlIDxtZWRpYS92NGwyLWlvY3RsLmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1jb21tb24uaD4KLSNpbmNsdWRlIDxtZWRpYS92aWRlb2J1Zi1kbWEtY29udGlnLmg+CisjaW5jbHVkZSA8bWVkaWEvdmlkZW9idWYtZG1hLXNnLmg+CiAKICNpbmNsdWRlICJzb2xvNjAxMC5oIgogI2luY2x1ZGUgInNvbG82MDEwLXR3MjguaCIKQEAgLTQ3LDEzICs0NywxNCBAQAogCXN0cnVjdCB2aWRlb2J1Zl9xdWV1ZQl2aWRxOwogCXN0cnVjdCBsaXN0X2hlYWQJdmlkcV9hY3RpdmU7CiAJc3RydWN0IHRhc2tfc3RydWN0CSprdGhyZWFkOworCXN0cnVjdCBwMm1fZGVzYwkJZGVzY1tTT0xPX05SX1AyTV9ERVNDXTsKIH07CiAKIHN0YXRpYyB1bnNpZ25lZCBjaGFyIHZpZF92b3BfaGVhZGVyW10gPSB7CiAJMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgyMCwKIAkweDAyLCAweDQ4LCAweDA1LCAweGMwLCAweDAwLCAweDQwLCAweDAwLCAweDQwLAogCTB4MDAsIDB4NDAsIDB4MDAsIDB4ODAsIDB4MDAsIDB4OTcsIDB4NTMsIDB4MDQsCi0JMHgxZiwgMHg0YywgMHg1OCwgMHgxMCwgMHg3OCwgMHg1MSwgMHgxOCwgMHgzZSwKKwkweDFmLCAweDRjLCAweDU4LCAweDEwLCAweDc4LCAweDUxLCAweDE4LCAweDNmLAogfTsKIAogLyoKQEAgLTE1MSw2ICsxNTIsMTEgQEAKIAllbHNlCiAJCXNvbG9fZGV2LT5tb3Rpb25fbWFzayAmPSB+KDEgPDwgY2gpOwogCisJLyogRG8gdGhpcyByZWdhcmRsZXNzIG9mIGlmIHdlIGFyZSB0dXJuaW5nIG9uIG9yIG9mZiAqLworCXNvbG9fcmVnX3dyaXRlKHNvbG9fZW5jLT5zb2xvX2RldiwgU09MT19WSV9NT1RfQ0xFQVIsCisJCSAgICAgICAxIDw8IHNvbG9fZW5jLT5jaCk7CisJc29sb19lbmMtPm1vdGlvbl9kZXRlY3RlZCA9IDA7CisKIAlzb2xvX3JlZ193cml0ZShzb2xvX2RldiwgU09MT19WSV9NT1RfQURSLAogCQkgICAgICAgU09MT19WSV9NT1RJT05fRU4oc29sb19kZXYtPm1vdGlvbl9tYXNrKSB8CiAJCSAgICAgICAoU09MT19NT1RJT05fRVhUX0FERFIoc29sb19kZXYpID4+IDE2KSk7CkBAIC0xODQsNyArMTkwLDcgQEAKIAkJc29sb19lbmMtPmJ3X3dlaWdodCA8PD0gMjsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJV0FSTigxLCAibW9kZSBpcyB1bmtub3duIik7CisJCVdBUk4oMSwgIm1vZGUgaXMgdW5rbm93blxuIik7CiAJfQogfQogCkBAIC0yMTEsMTEgKzIxNyw2IEBACiAJCQlzb2xvX2Rldi0+ZW5jX2J3X3JlbWFpbiAtPSBzb2xvX2VuYy0+Yndfd2VpZ2h0OwogCX0KIAotCWZoLT5rdGhyZWFkID0ga3RocmVhZF9ydW4oc29sb19lbmNfdGhyZWFkLCBmaCwgU09MTzYwMTBfTkFNRSAiX2VuYyIpOwotCi0JaWYgKElTX0VSUihmaC0+a3RocmVhZCkpCi0JCXJldHVybiBQVFJfRVJSKGZoLT5rdGhyZWFkKTsKLQogCWZoLT5lbmNfb24gPSAxOwogCWZoLT5yZF9pZHggPSBzb2xvX2VuYy0+c29sb19kZXYtPmVuY193cl9pZHg7CiAKQEAgLTI3OSw2ICsyODAsMjQgQEAKIAlzb2xvX3JlZ193cml0ZShzb2xvX2RldiwgU09MT19DQVBfQ0hfQ09NUF9FTkFfRShzb2xvX2VuYy0+Y2gpLCAwKTsKIH0KIAorc3RhdGljIGludCBzb2xvX3N0YXJ0X2ZoX3RocmVhZChzdHJ1Y3Qgc29sb19lbmNfZmggKmZoKQoreworCXN0cnVjdCBzb2xvX2VuY19kZXYgKnNvbG9fZW5jID0gZmgtPmVuYzsKKworCWZoLT5rdGhyZWFkID0ga3RocmVhZF9ydW4oc29sb19lbmNfdGhyZWFkLCBmaCwgU09MTzYwMTBfTkFNRSAiX2VuYyIpOworCisJLyogT29wcywgd2UgaGFkIGEgcHJvYmxlbSAqLworCWlmIChJU19FUlIoZmgtPmt0aHJlYWQpKSB7CisJCXNwaW5fbG9jaygmc29sb19lbmMtPmxvY2spOworCQlzb2xvX2VuY19vZmYoZmgpOworCQlzcGluX3VubG9jaygmc29sb19lbmMtPmxvY2spOworCisJCXJldHVybiBQVFJfRVJSKGZoLT5rdGhyZWFkKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIHZvaWQgZW5jX3Jlc2V0X2dvcChzdHJ1Y3Qgc29sbzYwMTBfZGV2ICpzb2xvX2RldiwgdTggY2gpCiB7CiAJQlVHX09OKGNoID49IHNvbG9fZGV2LT5ucl9jaGFucyk7CkBAIC0yOTksMjIgKzMxOCw2OCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGVuY19nZXRfbXBlZ19kbWFfdChzdHJ1Y3Qgc29sbzYwMTBfZGV2ICpzb2xvX2RldiwgZG1hX2FkZHJfdCBidWYsCi0JCQkgICAgICB1bnNpZ25lZCBpbnQgb2ZmLCB1bnNpZ25lZCBpbnQgc2l6ZSkKK3N0YXRpYyB2b2lkIGVuY193cml0ZV9zZyhzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnbGlzdCwgdm9pZCAqYnVmLCBpbnQgc2l6ZSkKK3sKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnOworCXU4ICpzcmMgPSBidWY7CisKKwlmb3IgKHNnID0gc2dsaXN0OyBzZyAmJiBzaXplID4gMDsgc2cgPSBzZ19uZXh0KHNnKSkgeworCQl1OCAqcCA9IHNnX3ZpcnQoc2cpOworCQlzaXplX3QgbGVuID0gc2dfZG1hX2xlbihzZyk7CisJCWludCBpOworCisJCWZvciAoaSA9IDA7IGkgPCBsZW4gJiYgc2l6ZTsgaSsrKQorCQkJcFtpXSA9ICooc3JjKyspOworCX0KK30KKworc3RhdGljIGludCBlbmNfZ2V0X21wZWdfZG1hX3NnKHN0cnVjdCBzb2xvNjAxMF9kZXYgKnNvbG9fZGV2LAorCQkJICAgICAgIHN0cnVjdCBwMm1fZGVzYyAqZGVzYywKKwkJCSAgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnbGlzdCwgaW50IHNraXAsCisJCQkgICAgICAgdW5zaWduZWQgaW50IG9mZiwgdW5zaWduZWQgaW50IHNpemUpCiB7CiAJaW50IHJldDsKIAogCWlmIChvZmYgPiBTT0xPX01QNEVfRVhUX1NJWkUoc29sb19kZXYpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWlmIChvZmYgKyBzaXplIDw9IFNPTE9fTVA0RV9FWFRfU0laRShzb2xvX2RldikpCisJaWYgKG9mZiArIHNpemUgPD0gU09MT19NUDRFX0VYVF9TSVpFKHNvbG9fZGV2KSkgeworCQlyZXR1cm4gc29sb19wMm1fZG1hX3NnKHNvbG9fZGV2LCBTT0xPX1AyTV9ETUFfSURfTVA0RSwKKwkJCQkgICAgICAgZGVzYywgMCwgc2dsaXN0LCBza2lwLAorCQkJCSAgICAgICBTT0xPX01QNEVfRVhUX0FERFIoc29sb19kZXYpICsgb2ZmLCBzaXplKTsKKwl9CisKKwkvKiBCdWZmZXIgd3JhcCAqLworCXJldCA9IHNvbG9fcDJtX2RtYV9zZyhzb2xvX2RldiwgU09MT19QMk1fRE1BX0lEX01QNEUsIGRlc2MsIDAsCisJCQkgICAgICBzZ2xpc3QsIHNraXAsIFNPTE9fTVA0RV9FWFRfQUREUihzb2xvX2RldikgKyBvZmYsCisJCQkgICAgICBTT0xPX01QNEVfRVhUX1NJWkUoc29sb19kZXYpIC0gb2ZmKTsKKworCXJldCB8PSBzb2xvX3AybV9kbWFfc2coc29sb19kZXYsIFNPTE9fUDJNX0RNQV9JRF9NUDRFLCBkZXNjLCAwLAorCQkJICAgICAgIHNnbGlzdCwgc2tpcCArIFNPTE9fTVA0RV9FWFRfU0laRShzb2xvX2RldikgLSBvZmYsCisJCQkgICAgICAgU09MT19NUDRFX0VYVF9BRERSKHNvbG9fZGV2KSwKKwkJCSAgICAgICBzaXplICsgb2ZmIC0gU09MT19NUDRFX0VYVF9TSVpFKHNvbG9fZGV2KSk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGVuY19nZXRfbXBlZ19kbWFfdChzdHJ1Y3Qgc29sbzYwMTBfZGV2ICpzb2xvX2RldiwKKwkJCSAgICAgIGRtYV9hZGRyX3QgYnVmLCB1bnNpZ25lZCBpbnQgb2ZmLAorCQkJICAgICAgdW5zaWduZWQgaW50IHNpemUpCit7CisJaW50IHJldDsKKworCWlmIChvZmYgPiBTT0xPX01QNEVfRVhUX1NJWkUoc29sb19kZXYpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChvZmYgKyBzaXplIDw9IFNPTE9fTVA0RV9FWFRfU0laRShzb2xvX2RldikpIHsKIAkJcmV0dXJuIHNvbG9fcDJtX2RtYV90KHNvbG9fZGV2LCBTT0xPX1AyTV9ETUFfSURfTVA0RSwgMCwgYnVmLAogCQkJCSAgICAgIFNPTE9fTVA0RV9FWFRfQUREUihzb2xvX2RldikgKyBvZmYsIHNpemUpOworCX0KIAogCS8qIEJ1ZmZlciB3cmFwICovCiAJcmV0ID0gc29sb19wMm1fZG1hX3Qoc29sb19kZXYsIFNPTE9fUDJNX0RNQV9JRF9NUDRFLCAwLCBidWYsCi0JCQkgICAgU09MT19NUDRFX0VYVF9BRERSKHNvbG9fZGV2KSArIG9mZiwKLQkJCSAgICBTT0xPX01QNEVfRVhUX1NJWkUoc29sb19kZXYpIC0gb2ZmKTsKKwkJCSAgICAgU09MT19NUDRFX0VYVF9BRERSKHNvbG9fZGV2KSArIG9mZiwKKwkJCSAgICAgU09MT19NUDRFX0VYVF9TSVpFKHNvbG9fZGV2KSAtIG9mZik7CiAKIAlyZXQgfD0gc29sb19wMm1fZG1hX3Qoc29sb19kZXYsIFNPTE9fUDJNX0RNQV9JRF9NUDRFLCAwLAogCQkJICAgICAgYnVmICsgU09MT19NUDRFX0VYVF9TSVpFKHNvbG9fZGV2KSAtIG9mZiwKQEAgLTMzNyw3MCArNDAyLDEwOCBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgZW5jX2dldF9qcGVnX2RtYShzdHJ1Y3Qgc29sbzYwMTBfZGV2ICpzb2xvX2RldiwgZG1hX2FkZHJfdCBidWYsCi0JCQkgICAgdW5zaWduZWQgaW50IG9mZiwgdW5zaWduZWQgaW50IHNpemUpCitzdGF0aWMgaW50IGVuY19nZXRfanBlZ19kbWFfc2coc3RydWN0IHNvbG82MDEwX2RldiAqc29sb19kZXYsCisJCQkgICAgICAgc3RydWN0IHAybV9kZXNjICpkZXNjLAorCQkJICAgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc2dsaXN0LCBpbnQgc2tpcCwKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgb2ZmLCB1bnNpZ25lZCBpbnQgc2l6ZSkKIHsKIAlpbnQgcmV0OwogCiAJaWYgKG9mZiA+IFNPTE9fSlBFR19FWFRfU0laRShzb2xvX2RldikpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JaWYgKG9mZiArIHNpemUgPD0gU09MT19KUEVHX0VYVF9TSVpFKHNvbG9fZGV2KSkKLQkJcmV0dXJuIHNvbG9fcDJtX2RtYV90KHNvbG9fZGV2LCBTT0xPX1AyTV9ETUFfSURfSlBFRywgMCwgYnVmLAotCQkJCSAgICAgIFNPTE9fSlBFR19FWFRfQUREUihzb2xvX2RldikgKyBvZmYsIHNpemUpOworCWlmIChvZmYgKyBzaXplIDw9IFNPTE9fSlBFR19FWFRfU0laRShzb2xvX2RldikpIHsKKwkJcmV0dXJuIHNvbG9fcDJtX2RtYV9zZyhzb2xvX2RldiwgU09MT19QMk1fRE1BX0lEX0pQRUcsCisJCQkJICAgICAgIGRlc2MsIDAsIHNnbGlzdCwgc2tpcCwKKwkJCQkgICAgICAgU09MT19KUEVHX0VYVF9BRERSKHNvbG9fZGV2KSArIG9mZiwgc2l6ZSk7CisJfQogCiAJLyogQnVmZmVyIHdyYXAgKi8KLQlyZXQgPSBzb2xvX3AybV9kbWFfdChzb2xvX2RldiwgU09MT19QMk1fRE1BX0lEX0pQRUcsIDAsIGJ1ZiwKLQkJCSAgICAgU09MT19KUEVHX0VYVF9BRERSKHNvbG9fZGV2KSArIG9mZiwKLQkJCSAgICAgU09MT19KUEVHX0VYVF9TSVpFKHNvbG9fZGV2KSAtIG9mZik7CisJcmV0ID0gc29sb19wMm1fZG1hX3NnKHNvbG9fZGV2LCBTT0xPX1AyTV9ETUFfSURfSlBFRywgZGVzYywgMCwKKwkJCSAgICAgIHNnbGlzdCwgc2tpcCwgU09MT19KUEVHX0VYVF9BRERSKHNvbG9fZGV2KSArIG9mZiwKKwkJCSAgICAgIFNPTE9fSlBFR19FWFRfU0laRShzb2xvX2RldikgLSBvZmYpOwogCi0JcmV0IHw9IHNvbG9fcDJtX2RtYV90KHNvbG9fZGV2LCBTT0xPX1AyTV9ETUFfSURfSlBFRywgMCwKLQkJCSAgICAgIGJ1ZiArIFNPTE9fSlBFR19FWFRfU0laRShzb2xvX2RldikgLSBvZmYsCi0JCQkgICAgICBTT0xPX0pQRUdfRVhUX0FERFIoc29sb19kZXYpLAotCQkJICAgICAgc2l6ZSArIG9mZiAtIFNPTE9fSlBFR19FWFRfU0laRShzb2xvX2RldikpOworCXJldCB8PSBzb2xvX3AybV9kbWFfc2coc29sb19kZXYsIFNPTE9fUDJNX0RNQV9JRF9KUEVHLCBkZXNjLCAwLAorCQkJICAgICAgIHNnbGlzdCwgc2tpcCArIFNPTE9fSlBFR19FWFRfU0laRShzb2xvX2RldikgLSBvZmYsCisJCQkgICAgICAgU09MT19KUEVHX0VYVF9BRERSKHNvbG9fZGV2KSwKKwkJCSAgICAgICBzaXplICsgb2ZmIC0gU09MT19KUEVHX0VYVF9TSVpFKHNvbG9fZGV2KSk7CiAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IHNvbG9fZmlsbF9qcGVnKHN0cnVjdCBzb2xvX2VuY19maCAqZmgsIHN0cnVjdCBzb2xvX2VuY19idWYgKmVuY19idWYsCi0JCQkgIHN0cnVjdCB2aWRlb2J1Zl9idWZmZXIgKnZiLCBkbWFfYWRkcl90IHZidWYpCisvKiBSZXR1cm5zIHRydWUgb2YgX19jaGsgaXMgd2l0aGluIHRoZSBmaXJzdCBfX3JhbmdlIGJ5dGVzIG9mIF9fb2ZmICovCisjZGVmaW5lIE9GRl9JTl9SQU5HRShfX29mZiwgX19yYW5nZSwgX19jaGspIFwKKwkoKF9fb2ZmIDw9IF9fY2hrKSAmJiAoKF9fb2ZmICsgX19yYW5nZSkgPj0gX19jaGspKQorCitzdGF0aWMgdm9pZCBzb2xvX2pwZWdfaGVhZGVyKHN0cnVjdCBzb2xvX2VuY19kZXYgKnNvbG9fZW5jLAorCQkJICAgICBzdHJ1Y3QgdmlkZW9idWZfZG1hYnVmICp2YnVmKQogewotCXN0cnVjdCBzb2xvX2VuY19kZXYgKnNvbG9fZW5jID0gZmgtPmVuYzsKLQlzdHJ1Y3Qgc29sbzYwMTBfZGV2ICpzb2xvX2RldiA9IHNvbG9fZW5jLT5zb2xvX2RldjsKLQl1OCAqcCA9IHZpZGVvYnVmX3F1ZXVlX3RvX3ZhZGRyKCZmaC0+dmlkcSwgdmIpOworCXN0cnVjdCBzY2F0dGVybGlzdCAqc2c7CisJdm9pZCAqc3JjID0ganBlZ19oZWFkZXI7CisJc2l6ZV90IGNvcGllZCA9IDA7CisJc2l6ZV90IHRvX2NvcHkgPSBzaXplb2YoanBlZ19oZWFkZXIpOwogCi0JbWVtY3B5KHAsIGpwZWdfaGVhZGVyLCBzaXplb2YoanBlZ19oZWFkZXIpKTsKLQlwW1NPRjBfU1RBUlQgKyA1XSA9IDB4ZmYgJiAoc29sb19lbmMtPmhlaWdodCA+PiA4KTsKLQlwW1NPRjBfU1RBUlQgKyA2XSA9IDB4ZmYgJiBzb2xvX2VuYy0+aGVpZ2h0OwotCXBbU09GMF9TVEFSVCArIDddID0gMHhmZiAmIChzb2xvX2VuYy0+d2lkdGggPj4gOCk7Ci0JcFtTT0YwX1NUQVJUICsgOF0gPSAweGZmICYgc29sb19lbmMtPndpZHRoOworCWZvciAoc2cgPSB2YnVmLT5zZ2xpc3Q7IHNnICYmIGNvcGllZCA8IHRvX2NvcHk7IHNnID0gc2dfbmV4dChzZykpIHsKKwkJc2l6ZV90IHRoaXNfY29weSA9IG1pbihzZ19kbWFfbGVuKHNnKSwKKwkJCQkgICAgICAgKHVuc2lnbmVkIGludCkodG9fY29weSAtIGNvcGllZCkpOworCQl1OCAqcCA9IHNnX3ZpcnQoc2cpOwogCi0JdmJ1ZiArPSBzaXplb2YoanBlZ19oZWFkZXIpOwotCXZiLT5zaXplID0gZW5jX2J1Zi0+anBlZ19zaXplICsgc2l6ZW9mKGpwZWdfaGVhZGVyKTsKKwkJbWVtY3B5KHAsIHNyYyArIGNvcGllZCwgdGhpc19jb3B5KTsKIAotCXJldHVybiBlbmNfZ2V0X2pwZWdfZG1hKHNvbG9fZGV2LCB2YnVmLCBlbmNfYnVmLT5qcGVnX29mZiwKLQkJCQllbmNfYnVmLT5qcGVnX3NpemUpOworCQlpZiAoT0ZGX0lOX1JBTkdFKGNvcGllZCwgdGhpc19jb3B5LCBTT0YwX1NUQVJUICsgNSkpCisJCQlwWyhTT0YwX1NUQVJUICsgNSkgLSBjb3BpZWRdID0KKwkJCQkweGZmICYgKHNvbG9fZW5jLT5oZWlnaHQgPj4gOCk7CisJCWlmIChPRkZfSU5fUkFOR0UoY29waWVkLCB0aGlzX2NvcHksIFNPRjBfU1RBUlQgKyA2KSkKKwkJCXBbKFNPRjBfU1RBUlQgKyA2KSAtIGNvcGllZF0gPSAweGZmICYgc29sb19lbmMtPmhlaWdodDsKKwkJaWYgKE9GRl9JTl9SQU5HRShjb3BpZWQsIHRoaXNfY29weSwgU09GMF9TVEFSVCArIDcpKQorCQkJcFsoU09GMF9TVEFSVCArIDcpIC0gY29waWVkXSA9CisJCQkJMHhmZiAmIChzb2xvX2VuYy0+d2lkdGggPj4gOCk7CisJCWlmIChPRkZfSU5fUkFOR0UoY29waWVkLCB0aGlzX2NvcHksIFNPRjBfU1RBUlQgKyA4KSkKKwkJCXBbKFNPRjBfU1RBUlQgKyA4KSAtIGNvcGllZF0gPSAweGZmICYgc29sb19lbmMtPndpZHRoOworCisJCWNvcGllZCArPSB0aGlzX2NvcHk7CisJfQorfQorCitzdGF0aWMgaW50IHNvbG9fZmlsbF9qcGVnKHN0cnVjdCBzb2xvX2VuY19maCAqZmgsIHN0cnVjdCBzb2xvX2VuY19idWYgKmVuY19idWYsCisJCQkgIHN0cnVjdCB2aWRlb2J1Zl9idWZmZXIgKnZiLAorCQkJICBzdHJ1Y3QgdmlkZW9idWZfZG1hYnVmICp2YnVmKQoreworCXN0cnVjdCBzb2xvNjAxMF9kZXYgKnNvbG9fZGV2ID0gZmgtPmVuYy0+c29sb19kZXY7CisJaW50IHNpemUgPSBlbmNfYnVmLT5qcGVnX3NpemU7CisKKwkvKiBDb3B5IHRoZSBoZWFkZXIgZmlyc3QgKGRpcmVjdCB3cml0ZSkgKi8KKwlzb2xvX2pwZWdfaGVhZGVyKGZoLT5lbmMsIHZidWYpOworCisJdmItPnNpemUgPSBzaXplICsgc2l6ZW9mKGpwZWdfaGVhZGVyKTsKKworCS8qIEdyYWIgdGhlIGpwZWcgZnJhbWUgKi8KKwlyZXR1cm4gZW5jX2dldF9qcGVnX2RtYV9zZyhzb2xvX2RldiwgZmgtPmRlc2MsIHZidWYtPnNnbGlzdCwKKwkJCQkgICBzaXplb2YoanBlZ19oZWFkZXIpLAorCQkJCSAgIGVuY19idWYtPmpwZWdfb2ZmLCBzaXplKTsKIH0KIAogc3RhdGljIGludCBzb2xvX2ZpbGxfbXBlZyhzdHJ1Y3Qgc29sb19lbmNfZmggKmZoLCBzdHJ1Y3Qgc29sb19lbmNfYnVmICplbmNfYnVmLAotCQkJICBzdHJ1Y3QgdmlkZW9idWZfYnVmZmVyICp2YiwgZG1hX2FkZHJfdCB2YnVmKQorCQkJICBzdHJ1Y3QgdmlkZW9idWZfYnVmZmVyICp2YiwKKwkJCSAgc3RydWN0IHZpZGVvYnVmX2RtYWJ1ZiAqdmJ1ZikKIHsKIAlzdHJ1Y3Qgc29sb19lbmNfZGV2ICpzb2xvX2VuYyA9IGZoLT5lbmM7CiAJc3RydWN0IHNvbG82MDEwX2RldiAqc29sb19kZXYgPSBzb2xvX2VuYy0+c29sb19kZXY7CiAJc3RydWN0IHZvcF9oZWFkZXIgdmg7CiAJaW50IHJldDsKIAlpbnQgZnJhbWVfc2l6ZSwgZnJhbWVfb2ZmOworCWludCBza2lwID0gMDsKIAogCWlmIChXQVJOX09OX09OQ0UoZW5jX2J1Zi0+c2l6ZSA8PSBzaXplb2YodmgpKSkKLQkJcmV0dXJuIC0xOworCQlyZXR1cm4gLUVJTlZBTDsKIAogCS8qIEZpcnN0IGdldCB0aGUgaGFyZHdhcmUgdm9wIGhlYWRlciAobm90IHJlYWwgbXBlZykgKi8KIAlyZXQgPSBlbmNfZ2V0X21wZWdfZG1hKHNvbG9fZGV2LCAmdmgsIGVuY19idWYtPm9mZiwgc2l6ZW9mKHZoKSk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIC0xOworCWlmIChXQVJOX09OX09OQ0UocmV0KSkKKwkJcmV0dXJuIHJldDsKIAogCWlmIChXQVJOX09OX09OQ0Uodmguc2l6ZSA+IGVuY19idWYtPnNpemUpKQotCQlyZXR1cm4gLTE7CisJCXJldHVybiAtRUlOVkFMOwogCiAJdmItPndpZHRoID0gdmguaHNpemUgPDwgNDsKIAl2Yi0+aGVpZ2h0ID0gdmgudnNpemUgPDwgNDsKQEAgLTQxMCw5ICs1MTMsOSBAQAogCWlmICghZW5jX2J1Zi0+dm9wKSB7CiAJCXUxNiBmcHMgPSBzb2xvX2Rldi0+ZnBzICogMTAwMDsKIAkJdTE2IGludGVydmFsID0gc29sb19lbmMtPmludGVydmFsICogMTAwMDsKLQkJdTggKnAgPSB2aWRlb2J1Zl9xdWV1ZV90b192YWRkcigmZmgtPnZpZHEsIHZiKTsKKwkJdTggcFtzaXplb2YodmlkX3ZvcF9oZWFkZXIpXTsKIAotCQltZW1jcHkocCwgdmlkX3ZvcF9oZWFkZXIsIHNpemVvZih2aWRfdm9wX2hlYWRlcikpOworCQltZW1jcHkocCwgdmlkX3ZvcF9oZWFkZXIsIHNpemVvZihwKSk7CiAKIAkJaWYgKHNvbG9fZGV2LT52aWRlb190eXBlID09IFNPTE9fVk9fRk1UX1RZUEVfTlRTQykKIAkJCXBbMTBdIHw9ICgoWFZJRF9QQVJfNDNfTlRTQyA8PCAzKSAmIDB4NzgpOwpAQCAtNDM0LDQzICs1MzcsNDkgQEAKIAkJaWYgKHZoLmludGVybGFjZSkKIAkJCXBbMjldIHw9IDB4MjA7CiAKKwkJZW5jX3dyaXRlX3NnKHZidWYtPnNnbGlzdCwgcCwgc2l6ZW9mKHApKTsKKwogCQkvKiBBZGp1c3QgdGhlIGRtYSBidWZmZXIgcGFzdCB0aGlzIGhlYWRlciAqLwogCQl2Yi0+c2l6ZSArPSBzaXplb2YodmlkX3ZvcF9oZWFkZXIpOwotCQl2YnVmICs9IHNpemVvZih2aWRfdm9wX2hlYWRlcik7CisJCXNraXAgPSBzaXplb2YodmlkX3ZvcF9oZWFkZXIpOwogCX0KIAogCS8qIE5vdyBnZXQgdGhlIGFjdHVhbCBtcGVnIHBheWxvYWQgKi8KIAlmcmFtZV9vZmYgPSAoZW5jX2J1Zi0+b2ZmICsgc2l6ZW9mKHZoKSkgJSBTT0xPX01QNEVfRVhUX1NJWkUoc29sb19kZXYpOwogCWZyYW1lX3NpemUgPSBlbmNfYnVmLT5zaXplIC0gc2l6ZW9mKHZoKTsKLQlyZXQgPSBlbmNfZ2V0X21wZWdfZG1hX3Qoc29sb19kZXYsIHZidWYsIGZyYW1lX29mZiwgZnJhbWVfc2l6ZSk7Ci0JaWYgKFdBUk5fT05fT05DRShyZXQpKQotCQlyZXR1cm4gLTE7CiAKLQlyZXR1cm4gMDsKKwlyZXQgPSBlbmNfZ2V0X21wZWdfZG1hX3NnKHNvbG9fZGV2LCBmaC0+ZGVzYywgdmJ1Zi0+c2dsaXN0LAorCQkJCSAgc2tpcCwgZnJhbWVfb2ZmLCBmcmFtZV9zaXplKTsKKwlXQVJOX09OX09OQ0UocmV0KTsKKworCXJldHVybiByZXQ7CiB9CiAKLS8qIE9uIHN1Y2Nlc3NmdWwgcmV0dXJuICgwKSwgbGVhdmVzIHNvbG9fZW5jLT5sb2NrIHVubG9ja2VkICovCi1zdGF0aWMgaW50IHNvbG9fZW5jX2ZpbGxidWYoc3RydWN0IHNvbG9fZW5jX2ZoICpmaCwKK3N0YXRpYyB2b2lkIHNvbG9fZW5jX2ZpbGxidWYoc3RydWN0IHNvbG9fZW5jX2ZoICpmaCwKIAkJCSAgICBzdHJ1Y3QgdmlkZW9idWZfYnVmZmVyICp2YikKIHsKIAlzdHJ1Y3Qgc29sb19lbmNfZGV2ICpzb2xvX2VuYyA9IGZoLT5lbmM7CiAJc3RydWN0IHNvbG82MDEwX2RldiAqc29sb19kZXYgPSBzb2xvX2VuYy0+c29sb19kZXY7CiAJc3RydWN0IHNvbG9fZW5jX2J1ZiAqZW5jX2J1ZiA9IE5VTEw7Ci0JZG1hX2FkZHJfdCB2YnVmOworCXN0cnVjdCB2aWRlb2J1Zl9kbWFidWYgKnZidWY7CiAJaW50IHJldDsKKwlpbnQgZXJyb3IgPSAxOwogCXUxNiBpZHggPSBmaC0+cmRfaWR4OwogCiAJd2hpbGUgKGlkeCAhPSBzb2xvX2Rldi0+ZW5jX3dyX2lkeCkgewogCQlzdHJ1Y3Qgc29sb19lbmNfYnVmICplYnVmID0gJnNvbG9fZGV2LT5lbmNfYnVmW2lkeF07CisKIAkJaWR4ID0gKGlkeCArIDEpICUgU09MT19OUl9SSU5HX0JVRlM7CisKKwkJaWYgKGVidWYtPmNoICE9IHNvbG9fZW5jLT5jaCkKKwkJCWNvbnRpbnVlOworCiAJCWlmIChmaC0+Zm10ID09IFY0TDJfUElYX0ZNVF9NUEVHKSB7Ci0JCQlpZiAoZmgtPnR5cGUgIT0gZWJ1Zi0+dHlwZSkKLQkJCQljb250aW51ZTsKLQkJCWlmIChlYnVmLT5jaCA9PSBzb2xvX2VuYy0+Y2gpIHsKKwkJCWlmIChmaC0+dHlwZSA9PSBlYnVmLT50eXBlKSB7CiAJCQkJZW5jX2J1ZiA9IGVidWY7CiAJCQkJYnJlYWs7CiAJCQl9Ci0JCX0gZWxzZSBpZiAoZWJ1Zi0+Y2ggPT0gc29sb19lbmMtPmNoKSB7CisJCX0gZWxzZSB7CiAJCQkvKiBGb3IgbWpwZWcsIGtlZXAgcmVhZGluZyB0byB0aGUgbmV3ZXN0IGZyYW1lICovCiAJCQllbmNfYnVmID0gZWJ1ZjsKIAkJfQpAQCAtNDc4LDQ4ICs1ODcsNTUgQEAKIAogCWZoLT5yZF9pZHggPSBpZHg7CiAKLQlpZiAoIWVuY19idWYpCi0JCXJldHVybiAtMTsKKwlpZiAoV0FSTl9PTl9PTkNFKCFlbmNfYnVmKSkKKwkJZ290byBidWZfZXJyOwogCiAJaWYgKChmaC0+Zm10ID09IFY0TDJfUElYX0ZNVF9NUEVHICYmCiAJICAgICB2Yi0+YnNpemUgPCBlbmNfYnVmLT5zaXplKSB8fAogCSAgICAoZmgtPmZtdCA9PSBWNEwyX1BJWF9GTVRfTUpQRUcgJiYKIAkgICAgIHZiLT5ic2l6ZSA8IChlbmNfYnVmLT5qcGVnX3NpemUgKyBzaXplb2YoanBlZ19oZWFkZXIpKSkpIHsKLQkJcmV0dXJuIC0xOworCQlXQVJOX09OX09OQ0UoMSk7CisJCWdvdG8gYnVmX2VycjsKIAl9CiAKLQlpZiAoISh2YnVmID0gdmlkZW9idWZfdG9fZG1hX2NvbnRpZyh2YikpKQotCQlyZXR1cm4gLTE7Ci0KLQkvKiBJcyBpdCBvayB0aGF0IHdlIG1lc3Mgd2l0aCB0aGlzIGJ1ZmZlciBvdXQgb2YgbG9jaz8gKi8KLQlzcGluX3VubG9jaygmc29sb19lbmMtPmxvY2spOworCXZidWYgPSB2aWRlb2J1Zl90b19kbWEodmIpOworCWlmIChXQVJOX09OX09OQ0UoIXZidWYpKQorCQlnb3RvIGJ1Zl9lcnI7CiAKIAlpZiAoZmgtPmZtdCA9PSBWNEwyX1BJWF9GTVRfTVBFRykKIAkJcmV0ID0gc29sb19maWxsX21wZWcoZmgsIGVuY19idWYsIHZiLCB2YnVmKTsKIAllbHNlCiAJCXJldCA9IHNvbG9fZmlsbF9qcGVnKGZoLCBlbmNfYnVmLCB2YiwgdmJ1Zik7CiAKLQlpZiAocmV0KSAvLyBJZ25vcmUgZmFpbHVyZXMKLQkJcmV0dXJuIDA7CisJaWYgKCFyZXQpCisJCWVycm9yID0gMDsKIAotCWxpc3RfZGVsKCZ2Yi0+cXVldWUpOwotCXZiLT5maWVsZF9jb3VudCsrOwotCXZiLT50cyA9IGVuY19idWYtPnRzOwotCXZiLT5zdGF0ZSA9IFZJREVPQlVGX0RPTkU7CitidWZfZXJyOgorCWlmIChlcnJvcikgeworCQl2Yi0+c3RhdGUgPSBWSURFT0JVRl9FUlJPUjsKKwl9IGVsc2UgeworCQl2Yi0+ZmllbGRfY291bnQrKzsKKwkJdmItPnRzID0gZW5jX2J1Zi0+dHM7CisJCXZiLT5zdGF0ZSA9IFZJREVPQlVGX0RPTkU7CisJfQogCiAJd2FrZV91cCgmdmItPmRvbmUpOwogCi0JcmV0dXJuIDA7CisJcmV0dXJuOwogfQogCiBzdGF0aWMgdm9pZCBzb2xvX2VuY190aHJlYWRfdHJ5KHN0cnVjdCBzb2xvX2VuY19maCAqZmgpCiB7CiAJc3RydWN0IHNvbG9fZW5jX2RldiAqc29sb19lbmMgPSBmaC0+ZW5jOworCXN0cnVjdCBzb2xvNjAxMF9kZXYgKnNvbG9fZGV2ID0gc29sb19lbmMtPnNvbG9fZGV2OwogCXN0cnVjdCB2aWRlb2J1Zl9idWZmZXIgKnZiOwogCiAJZm9yICg7OykgewogCQlzcGluX2xvY2soJnNvbG9fZW5jLT5sb2NrKTsKIAorCQlpZiAoZmgtPnJkX2lkeCA9PSBzb2xvX2Rldi0+ZW5jX3dyX2lkeCkKKwkJCWJyZWFrOworCiAJCWlmIChsaXN0X2VtcHR5KCZmaC0+dmlkcV9hY3RpdmUpKQogCQkJYnJlYWs7CiAKQEAgLTUyOSw5ICs2NDUsMTEgQEAKIAkJaWYgKCF3YWl0cXVldWVfYWN0aXZlKCZ2Yi0+ZG9uZSkpCiAJCQlicmVhazsKIAotCQkvKiBPbiBzdWNjZXNzLCByZXR1cm5zIHdpdGggc29sb19lbmMtPmxvY2sgdW5sb2NrZWQgKi8KLQkJaWYgKHNvbG9fZW5jX2ZpbGxidWYoZmgsIHZiKSkKLQkJCWJyZWFrOworCQlsaXN0X2RlbCgmdmItPnF1ZXVlKTsKKworCQlzcGluX3VubG9jaygmc29sb19lbmMtPmxvY2spOworCisJCXNvbG9fZW5jX2ZpbGxidWYoZmgsIHZiKTsKIAl9CiAKIAlhc3NlcnRfc3Bpbl9sb2NrZWQoJnNvbG9fZW5jLT5sb2NrKTsKQEAgLTU1Nyw3ICs2NzUsNyBAQAogCiAJcmVtb3ZlX3dhaXRfcXVldWUoJnNvbG9fZW5jLT50aHJlYWRfd2FpdCwgJndhaXQpOwogCi0gICAgICAgIHJldHVybiAwOworCXJldHVybiAwOwogfQogCiB2b2lkIHNvbG9fbW90aW9uX2lzcihzdHJ1Y3Qgc29sbzYwMTBfZGV2ICpzb2xvX2RldikKQEAgLTYxNCw3ICs3MzIsOCBAQAogCQlqcGVnX25leHQgPSBzb2xvX3JlZ19yZWFkKHNvbG9fZGV2LAogCQkJCQlTT0xPX1ZFX0pQRUdfUVVFKHNvbG9fZGV2LT5lbmNfaWR4KSk7CiAKLQkJaWYgKChjaCA9IChtcGVnX2N1cnJlbnQgPj4gMjQpICYgMHgxZikgPj0gU09MT19NQVhfQ0hBTk5FTFMpIHsKKwkJY2ggPSAobXBlZ19jdXJyZW50ID4+IDI0KSAmIDB4MWY7CisJCWlmIChjaCA+PSBTT0xPX01BWF9DSEFOTkVMUykgewogCQkJY2ggLT0gU09MT19NQVhfQ0hBTk5FTFM7CiAJCQllbmNfdHlwZSA9IFNPTE9fRU5DX1RZUEVfRVhUOwogCQl9IGVsc2UKQEAgLTY2OSwxMiArNzg4LDEyIEBACiBzdGF0aWMgaW50IHNvbG9fZW5jX2J1Zl9zZXR1cChzdHJ1Y3QgdmlkZW9idWZfcXVldWUgKnZxLCB1bnNpZ25lZCBpbnQgKmNvdW50LAogCQkJICAgICAgdW5zaWduZWQgaW50ICpzaXplKQogewotICAgICAgICAqc2l6ZSA9IEZSQU1FX0JVRl9TSVpFOworCSpzaXplID0gRlJBTUVfQlVGX1NJWkU7CiAKLSAgICAgICAgaWYgKCpjb3VudCA8IE1JTl9WSURfQlVGRkVSUykKKwlpZiAoKmNvdW50IDwgTUlOX1ZJRF9CVUZGRVJTKQogCQkqY291bnQgPSBNSU5fVklEX0JVRkZFUlM7CiAKLSAgICAgICAgcmV0dXJuIDA7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgc29sb19lbmNfYnVmX3ByZXBhcmUoc3RydWN0IHZpZGVvYnVmX3F1ZXVlICp2cSwKQEAgLTY5Niw3ICs4MTUsOSBAQAogCWlmICh2Yi0+c3RhdGUgPT0gVklERU9CVUZfTkVFRFNfSU5JVCkgewogCQlpbnQgcmMgPSB2aWRlb2J1Zl9pb2xvY2sodnEsIHZiLCBOVUxMKTsKIAkJaWYgKHJjIDwgMCkgewotCQkJdmlkZW9idWZfZG1hX2NvbnRpZ19mcmVlKHZxLCB2Yik7CisJCQlzdHJ1Y3QgdmlkZW9idWZfZG1hYnVmICpkbWEgPSB2aWRlb2J1Zl90b19kbWEodmIpOworCQkJdmlkZW9idWZfZG1hX3VubWFwKHZxLT5kZXYsIGRtYSk7CisJCQl2aWRlb2J1Zl9kbWFfZnJlZShkbWEpOwogCQkJdmItPnN0YXRlID0gVklERU9CVUZfTkVFRFNfSU5JVDsKIAkJCXJldHVybiByYzsKIAkJfQpAQCAtNzE5LDcgKzg0MCwxMCBAQAogc3RhdGljIHZvaWQgc29sb19lbmNfYnVmX3JlbGVhc2Uoc3RydWN0IHZpZGVvYnVmX3F1ZXVlICp2cSwKIAkJCQkgc3RydWN0IHZpZGVvYnVmX2J1ZmZlciAqdmIpCiB7Ci0JdmlkZW9idWZfZG1hX2NvbnRpZ19mcmVlKHZxLCB2Yik7CisJc3RydWN0IHZpZGVvYnVmX2RtYWJ1ZiAqZG1hID0gdmlkZW9idWZfdG9fZG1hKHZiKTsKKworCXZpZGVvYnVmX2RtYV91bm1hcCh2cS0+ZGV2LCBkbWEpOworCXZpZGVvYnVmX2RtYV9mcmVlKGRtYSk7CiAJdmItPnN0YXRlID0gVklERU9CVUZfTkVFRFNfSU5JVDsKIH0KIApAQCAtNzUwLDI1ICs4NzQsMjIgQEAKIAlzdHJ1Y3Qgc29sb19lbmNfZGV2ICpzb2xvX2VuYyA9IHZpZGVvX2RydmRhdGEoZmlsZSk7CiAJc3RydWN0IHNvbG9fZW5jX2ZoICpmaDsKIAotCWlmICgoZmggPSBremFsbG9jKHNpemVvZigqZmgpLCBHRlBfS0VSTkVMKSkgPT0gTlVMTCkKKwlmaCA9IGt6YWxsb2Moc2l6ZW9mKCpmaCksIEdGUF9LRVJORUwpOworCWlmIChmaCA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCXNwaW5fbG9jaygmc29sb19lbmMtPmxvY2spOwotCiAJZmgtPmVuYyA9IHNvbG9fZW5jOwogCWZpbGUtPnByaXZhdGVfZGF0YSA9IGZoOwogCUlOSVRfTElTVF9IRUFEKCZmaC0+dmlkcV9hY3RpdmUpOwogCWZoLT5mbXQgPSBWNEwyX1BJWF9GTVRfTVBFRzsKIAlmaC0+dHlwZSA9IFNPTE9fRU5DX1RZUEVfU1REOwogCi0JdmlkZW9idWZfcXVldWVfZG1hX2NvbnRpZ19pbml0KCZmaC0+dmlkcSwgJnNvbG9fZW5jX3ZpZGVvX3FvcHMsCi0JCQkJICAgICZzb2xvX2VuYy0+c29sb19kZXYtPnBkZXYtPmRldiwKLQkJCQkgICAgJnNvbG9fZW5jLT5sb2NrLAotCQkJCSAgICBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUsCi0JCQkJICAgIFY0TDJfRklFTERfSU5URVJMQUNFRCwKLQkJCQkgICAgc2l6ZW9mKHN0cnVjdCB2aWRlb2J1Zl9idWZmZXIpLCBmaCwgTlVMTCk7Ci0KLQlzcGluX3VubG9jaygmc29sb19lbmMtPmxvY2spOworCXZpZGVvYnVmX3F1ZXVlX3NnX2luaXQoJmZoLT52aWRxLCAmc29sb19lbmNfdmlkZW9fcW9wcywKKwkJCSAgICAgICAmc29sb19lbmMtPnNvbG9fZGV2LT5wZGV2LT5kZXYsCisJCQkgICAgICAgJnNvbG9fZW5jLT5sb2NrLAorCQkJICAgICAgIFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSwKKwkJCSAgICAgICBWNEwyX0ZJRUxEX0lOVEVSTEFDRUQsCisJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCB2aWRlb2J1Zl9idWZmZXIpLCBmaCwgTlVMTCk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTc4NSw3ICs5MDYsMTEgQEAKIAogCQlzcGluX2xvY2soJnNvbG9fZW5jLT5sb2NrKTsKIAkJcmV0ID0gc29sb19lbmNfb24oZmgpOwotCSAgICAgICAgc3Bpbl91bmxvY2soJnNvbG9fZW5jLT5sb2NrKTsKKwkJc3Bpbl91bmxvY2soJnNvbG9fZW5jLT5sb2NrKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisKKwkJcmV0ID0gc29sb19zdGFydF9maF90aHJlYWQoZmgpOwogCQlpZiAocmV0KQogCQkJcmV0dXJuIHJldDsKIAl9CkBAIC03OTcsMTAgKzkyMiwxNSBAQAogc3RhdGljIGludCBzb2xvX2VuY19yZWxlYXNlKHN0cnVjdCBmaWxlICpmaWxlKQogewogCXN0cnVjdCBzb2xvX2VuY19maCAqZmggPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHNvbG9fZW5jX2RldiAqc29sb19lbmMgPSBmaC0+ZW5jOwogCiAJdmlkZW9idWZfc3RvcCgmZmgtPnZpZHEpOwogCXZpZGVvYnVmX21tYXBfZnJlZSgmZmgtPnZpZHEpOworCisJc3Bpbl9sb2NrKCZzb2xvX2VuYy0+bG9jayk7CiAJc29sb19lbmNfb2ZmKGZoKTsKKwlzcGluX3VubG9jaygmc29sb19lbmMtPmxvY2spOworCiAJa2ZyZWUoZmgpOwogCiAJcmV0dXJuIDA7CkBAIC04NDIsNyArOTcyLDcgQEAKIAlpZiAoc29sb19kZXYtPnZpZGVvX3R5cGUgPT0gU09MT19WT19GTVRfVFlQRV9OVFNDKQogCQlpbnB1dC0+c3RkID0gVjRMMl9TVERfTlRTQ19NOwogCWVsc2UKLQkJaW5wdXQtPnN0ZCA9IFY0TDJfU1REX1BBTF9NOworCQlpbnB1dC0+c3RkID0gVjRMMl9TVERfUEFMX0I7CiAKIAlpZiAoIXR3MjhfZ2V0X3ZpZGVvX3N0YXR1cyhzb2xvX2Rldiwgc29sb19lbmMtPmNoKSkKIAkJaW5wdXQtPnN0YXR1cyA9IFY0TDJfSU5fU1RfTk9fU0lHTkFMOwpAQCAtOTE1LDkgKzEwNDUsOCBAQAogCiAJaWYgKHBpeC0+ZmllbGQgPT0gVjRMMl9GSUVMRF9BTlkpCiAJCXBpeC0+ZmllbGQgPSBWNEwyX0ZJRUxEX0lOVEVSTEFDRUQ7Ci0JZWxzZSBpZiAocGl4LT5maWVsZCAhPSBWNEwyX0ZJRUxEX0lOVEVSTEFDRUQpIHsKKwllbHNlIGlmIChwaXgtPmZpZWxkICE9IFY0TDJfRklFTERfSU5URVJMQUNFRCkKIAkJcGl4LT5maWVsZCA9IFY0TDJfRklFTERfSU5URVJMQUNFRDsKLQl9CiAKIAkvKiBKdXN0IHNldCB0aGVzZSAqLwogCXBpeC0+Y29sb3JzcGFjZSA9IFY0TDJfQ09MT1JTUEFDRV9TTVBURTE3ME07CkBAIC05MzcsNyArMTA2Niw4IEBACiAKIAlzcGluX2xvY2soJnNvbG9fZW5jLT5sb2NrKTsKIAotCWlmICgocmV0ID0gc29sb19lbmNfdHJ5X2ZtdF9jYXAoZmlsZSwgcHJpdiwgZikpKSB7CisJcmV0ID0gc29sb19lbmNfdHJ5X2ZtdF9jYXAoZmlsZSwgcHJpdiwgZik7CisJaWYgKHJldCkgewogCQlzcGluX3VubG9jaygmc29sb19lbmMtPmxvY2spOwogCQlyZXR1cm4gcmV0OwogCX0KQEAgLTk1Niw3ICsxMDg2LDEwIEBACiAKIAlzcGluX3VubG9jaygmc29sb19lbmMtPmxvY2spOwogCi0JcmV0dXJuIHJldDsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIHNvbG9fc3RhcnRfZmhfdGhyZWFkKGZoKTsKIH0KIAogc3RhdGljIGludCBzb2xvX2VuY19nZXRfZm10X2NhcChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKQEAgLTk3Nyw3ICsxMTEwLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBzb2xvX2VuY19yZXFidWZzKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LCAKK3N0YXRpYyBpbnQgc29sb19lbmNfcmVxYnVmcyhzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKIAkJCSAgICBzdHJ1Y3QgdjRsMl9yZXF1ZXN0YnVmZmVycyAqcmVxKQogewogCXN0cnVjdCBzb2xvX2VuY19maCAqZmggPSBwcml2OwpAQCAtMTAxNCw2ICsxMTQ3LDEwIEBACiAJCXNwaW5fdW5sb2NrKCZzb2xvX2VuYy0+bG9jayk7CiAJCWlmIChyZXQpCiAJCQlyZXR1cm4gcmV0OworCisJCXJldCA9IHNvbG9fc3RhcnRfZmhfdGhyZWFkKGZoKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CiAJfQogCiAJcmV0ID0gdmlkZW9idWZfZHFidWYoJmZoLT52aWRxLCBidWYsIGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKTsKQEAgLTEwMzMsMTIgKzExNzAsMTYgQEAKIAogCS8qIENoZWNrIGZvciBrZXkgZnJhbWUgb24gbXBlZyBkYXRhICovCiAJaWYgKGZoLT5mbXQgPT0gVjRMMl9QSVhfRk1UX01QRUcpIHsKLQkJc3RydWN0IHZpZGVvYnVmX2J1ZmZlciAqdmIgPSBmaC0+dmlkcS5idWZzW2J1Zi0+aW5kZXhdOwotCQl1OCAqcCA9IHZpZGVvYnVmX3F1ZXVlX3RvX3ZhZGRyKCZmaC0+dmlkcSwgdmIpOwotCQlpZiAocFszXSA9PSAweDAwKQotCQkJYnVmLT5mbGFncyB8PSBWNEwyX0JVRl9GTEFHX0tFWUZSQU1FOwotCQllbHNlCi0JCQlidWYtPmZsYWdzIHw9IFY0TDJfQlVGX0ZMQUdfUEZSQU1FOworCQlzdHJ1Y3QgdmlkZW9idWZfZG1hYnVmICp2YnVmID0KKwkJCQl2aWRlb2J1Zl90b19kbWEoZmgtPnZpZHEuYnVmc1tidWYtPmluZGV4XSk7CisKKwkJaWYgKHZidWYpIHsKKwkJCXU4ICpwID0gc2dfdmlydCh2YnVmLT5zZ2xpc3QpOworCQkJaWYgKHBbM10gPT0gMHgwMCkKKwkJCQlidWYtPmZsYWdzIHw9IFY0TDJfQlVGX0ZMQUdfS0VZRlJBTUU7CisJCQllbHNlCisJCQkJYnVmLT5mbGFncyB8PSBWNEwyX0JVRl9GTEFHX1BGUkFNRTsKKwkJfQogCX0KIAogCXJldHVybiAwOwpAQCAtMTEzNiw3ICsxMjc3LDcgQEAKIAkvKiBYWFg6IFNob3VsZG4ndCB3ZSBiZSBhYmxlIHRvIGdldC9zZXQgdGhpcyBmcm9tIHZpZGVvYnVmPyAqLwogCWNwLT5yZWFkYnVmZmVycyA9IDI7CiAKLSAgICAgICAgcmV0dXJuIDA7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgc29sb19zX3Bhcm0oc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCkBAIC0xMTc2LDcgKzEzMTcsNyBAQAogCiAJc3Bpbl91bmxvY2soJnNvbG9fZW5jLT5sb2NrKTsKIAotICAgICAgICByZXR1cm4gMDsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBzb2xvX3F1ZXJ5Y3RybChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKQEAgLTEyNDAsNyArMTM4MSw3IEBACiAJCXJldHVybiAwOwogCX0KIAotICAgICAgICByZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gLUVJTlZBTDsKIH0KIAogc3RhdGljIGludCBzb2xvX3F1ZXJ5bWVudShzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKQEAgLTEyNTAsNyArMTM5MSw4IEBACiAJaW50IGVycjsKIAogCXFjdHJsLmlkID0gcW1lbnUtPmlkOwotCWlmICgoZXJyID0gc29sb19xdWVyeWN0cmwoZmlsZSwgcHJpdiwgJnFjdHJsKSkpCisJZXJyID0gc29sb19xdWVyeWN0cmwoZmlsZSwgcHJpdiwgJnFjdHJsKTsKKwlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwogCiAJcmV0dXJuIHY0bDJfY3RybF9xdWVyeV9tZW51KHFtZW51LCAmcWN0cmwsIE5VTEwpOwpAQCAtMTM1MCw5ICsxNDkyLDkgQEAKIAkJc3dpdGNoIChjdHJsLT5pZCkgewogCQljYXNlIFY0TDJfQ0lEX1JEU19UWF9SQURJT19URVhUOgogCQkJaWYgKGN0cmwtPnNpemUgLSAxID4gT1NEX1RFWFRfTUFYKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSAtRVJBTkdFOworCQkJCWVyciA9IC1FUkFOR0U7CiAJCQllbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIAllcnIgPSBjb3B5X2Zyb21fdXNlcihzb2xvX2VuYy0+b3NkX3RleHQsCisJCQkJZXJyID0gY29weV9mcm9tX3VzZXIoc29sb19lbmMtPm9zZF90ZXh0LAogCQkJCQkJICAgICBjdHJsLT5zdHJpbmcsCiAJCQkJCQkgICAgIE9TRF9URVhUX01BWCk7CiAJCQkJc29sb19lbmMtPm9zZF90ZXh0W09TRF9URVhUX01BWF0gPSAnXDAnOwpAQCAtMTQ1OSw3ICsxNjAxLDcgQEAKIAkubWlub3IJCQk9IC0xLAogCS5yZWxlYXNlCQk9IHZpZGVvX2RldmljZV9yZWxlYXNlLAogCi0JLnR2bm9ybXMJCT0gVjRMMl9TVERfTlRTQ19NIHwgVjRMMl9TVERfUEFMX00sCisJLnR2bm9ybXMJCT0gVjRMMl9TVERfTlRTQ19NIHwgVjRMMl9TVERfUEFMX0IsCiAJLmN1cnJlbnRfbm9ybQkJPSBWNEwyX1NURF9OVFNDX00sCiB9OwogCkBAIC0xNTA1LDcgKzE2NDcsNyBAQAogCWF0b21pY19zZXQoJnNvbG9fZW5jLT5yZWFkZXJzLCAwKTsKIAogCXNvbG9fZW5jLT5xcCA9IFNPTE9fREVGQVVMVF9RUDsKLSAgICAgICAgc29sb19lbmMtPmdvcCA9IHNvbG9fZGV2LT5mcHM7CisJc29sb19lbmMtPmdvcCA9IHNvbG9fZGV2LT5mcHM7CiAJc29sb19lbmMtPmludGVydmFsID0gMTsKIAlzb2xvX2VuYy0+bW9kZSA9IFNPTE9fRU5DX01PREVfQ0lGOwogCXNvbG9fZW5jLT5tb3Rpb25fdGhyZXNoID0gU09MT19ERUZfTU9UX1RIUkVTSDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zb2xvNngxMC9zb2xvNjAxMC12NGwyLmMgYi9kcml2ZXJzL3N0YWdpbmcvc29sbzZ4MTAvc29sbzYwMTAtdjRsMi5jCmluZGV4IDZmZmQyMWQuLmE4NDkxZGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9zb2xvNngxMC9zb2xvNjAxMC12NGwyLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3NvbG82eDEwL3NvbG82MDEwLXY0bDIuYwpAQCAtMjQsMTQgKzI0LDEzIEBACiAKICNpbmNsdWRlIDxtZWRpYS92NGwyLWlvY3RsLmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1jb21tb24uaD4KLSNpbmNsdWRlIDxtZWRpYS92aWRlb2J1Zi1kbWEtY29udGlnLmg+CisjaW5jbHVkZSA8bWVkaWEvdmlkZW9idWYtZG1hLXNnLmg+CiAKICNpbmNsdWRlICJzb2xvNjAxMC5oIgogI2luY2x1ZGUgInNvbG82MDEwLXR3MjguaCIKIAogI2RlZmluZSBTT0xPX0hXX0JQTAkJMjA0OAogI2RlZmluZSBTT0xPX0RJU1BfUElYX0ZJRUxECVY0TDJfRklFTERfSU5URVJMQUNFRAotI2RlZmluZSBTT0xPX0RJU1BfQlVGX1NJWkUJKDY0ICogMTAyNCkgLy8gNjRrCiAKIC8qIEltYWdlIHNpemUgaXMgdHdvIGZpZWxkcywgU09MT19IV19CUEwgaXMgb25lIGhvcml6b250YWwgbGluZSAqLwogI2RlZmluZSBzb2xvX3ZsaW5lcyhfX3NvbG8pCShfX3NvbG8tPnZpZGVvX3ZzaXplICogMikKQEAgLTQ5LDYgKzQ4LDggQEAKIAlzcGlubG9ja190CQlzbG9jazsKIAlpbnQJCQlvbGRfd3JpdGU7CiAJc3RydWN0IGxpc3RfaGVhZAl2aWRxX2FjdGl2ZTsKKwlzdHJ1Y3QgcDJtX2Rlc2MJCWRlc2NbU09MT19OUl9QMk1fREVTQ107CisJaW50CQkJZGVzY19pZHg7CiB9OwogCiB1bnNpZ25lZCB2aWRlb19uciA9IC0xOwpAQCAtOTYsNyArOTcsNyBAQAogCQkgICAgICAgU09MT19WSV9XSU5fRVgoZXgpIHwKIAkJICAgICAgIFNPTE9fVklfV0lOX1NDQUxFKHNjYWxlKSk7CiAKLSAgICAgICAgc29sb19yZWdfd3JpdGUoc29sb19kZXYsIFNPTE9fVklfV0lOX0NUUkwxKGNoKSwKKwlzb2xvX3JlZ193cml0ZShzb2xvX2RldiwgU09MT19WSV9XSU5fQ1RSTDEoY2gpLAogCQkgICAgICAgU09MT19WSV9XSU5fU1koc3kpIHwKIAkJICAgICAgIFNPTE9fVklfV0lOX0VZKGV5KSk7CiB9CkBAIC0yMDMsNTAgKzIwNCwxNDkgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHZvaWQgZGlzcF9yZXNldF9kZXNjKHN0cnVjdCBzb2xvX2ZpbGVoYW5kbGUgKmZoKQoreworCS8qIFdlIHVzZSBkZXNjIG1vZGUsIHdoaWNoIGlnbm9yZXMgZGVzYyAwICovCisJbWVtc2V0KGZoLT5kZXNjLCAwLCBzaXplb2YoKmZoLT5kZXNjKSk7CisJZmgtPmRlc2NfaWR4ID0gMTsKK30KKworc3RhdGljIGludCBkaXNwX2ZsdXNoX2Rlc2NzKHN0cnVjdCBzb2xvX2ZpbGVoYW5kbGUgKmZoKQoreworCWludCByZXQ7CisKKwlpZiAoIWZoLT5kZXNjX2lkeCkKKwkJcmV0dXJuIDA7CisKKwlyZXQgPSBzb2xvX3AybV9kbWFfZGVzYyhmaC0+c29sb19kZXYsIFNPTE9fUDJNX0RNQV9JRF9ESVNQLAorCQkJCWZoLT5kZXNjLCBmaC0+ZGVzY19pZHgpOworCWRpc3BfcmVzZXRfZGVzYyhmaCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGRpc3BfcHVzaF9kZXNjKHN0cnVjdCBzb2xvX2ZpbGVoYW5kbGUgKmZoLCBkbWFfYWRkcl90IGRtYV9hZGRyLAorCQkgICAgICB1MzIgZXh0X2FkZHIsIGludCBzaXplLCBpbnQgcmVwZWF0LCBpbnQgZXh0X3NpemUpCit7CisJaWYgKGZoLT5kZXNjX2lkeCA+PSBTT0xPX05SX1AyTV9ERVNDKSB7CisJCWludCByZXQgPSBkaXNwX2ZsdXNoX2Rlc2NzKGZoKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJfQorCisJc29sb19wMm1fcHVzaF9kZXNjKCZmaC0+ZGVzY1tmaC0+ZGVzY19pZHhdLCAwLCBkbWFfYWRkciwgZXh0X2FkZHIsCisJCQkgICBzaXplLCByZXBlYXQsIGV4dF9zaXplKTsKKwlmaC0+ZGVzY19pZHgrKzsKKworCXJldHVybiAwOworfQorCiBzdGF0aWMgdm9pZCBzb2xvX2ZpbGxidWYoc3RydWN0IHNvbG9fZmlsZWhhbmRsZSAqZmgsCiAJCQkgc3RydWN0IHZpZGVvYnVmX2J1ZmZlciAqdmIpCiB7CiAJc3RydWN0IHNvbG82MDEwX2RldiAqc29sb19kZXYgPSBmaC0+c29sb19kZXY7Ci0JZG1hX2FkZHJfdCB2YnVmOworCXN0cnVjdCB2aWRlb2J1Zl9kbWFidWYgKnZidWY7CiAJdW5zaWduZWQgaW50IGZkbWFfYWRkcjsKLQlpbnQgZnJhbWVfc2l6ZTsKIAlpbnQgZXJyb3IgPSAxOwogCWludCBpOworCXN0cnVjdCBzY2F0dGVybGlzdCAqc2c7CisJZG1hX2FkZHJfdCBzZ19kbWE7CisJaW50IHNnX3NpemVfbGVmdDsKIAotCWlmICghKHZidWYgPSB2aWRlb2J1Zl90b19kbWFfY29udGlnKHZiKSkpCisJdmJ1ZiA9IHZpZGVvYnVmX3RvX2RtYSh2Yik7CisJaWYgKCF2YnVmKQogCQlnb3RvIGZpbmlzaF9idWY7CiAKIAlpZiAoZXJhc2Vfb2ZmKHNvbG9fZGV2KSkgewotCQl2b2lkICpwID0gdmlkZW9idWZfcXVldWVfdG9fdmFkZHIoJmZoLT52aWRxLCB2Yik7Ci0JCWludCBpbWFnZV9zaXplID0gc29sb19pbWFnZV9zaXplKHNvbG9fZGV2KTsKLQkJZm9yIChpID0gMDsgaSA8IGltYWdlX3NpemU7IGkgKz0gMikgewotCQkJKCh1OCAqKXApW2ldID0gMHg4MDsKLQkJCSgodTggKilwKVtpICsgMV0gPSAweDAwOworCQlpbnQgaTsKKworCQkvKiBKdXN0IGJsaXQgdG8gdGhlIGVudGlyZSBzZyBsaXN0LCBpZ25vcmluZyBzaXplICovCisJCWZvcl9lYWNoX3NnKHZidWYtPnNnbGlzdCwgc2csIHZidWYtPnNnbGVuLCBpKSB7CisJCQl2b2lkICpwID0gc2dfdmlydChzZyk7CisJCQlzaXplX3QgbGVuID0gc2dfZG1hX2xlbihzZyk7CisKKwkJCWZvciAoaSA9IDA7IGkgPCBsZW47IGkgKz0gMikgeworCQkJCSgodTggKilwKVtpXSA9IDB4ODA7CisJCQkJKCh1OCAqKXApW2kgKyAxXSA9IDB4MDA7CisJCQl9CiAJCX0KKwogCQllcnJvciA9IDA7CiAJCWdvdG8gZmluaXNoX2J1ZjsKIAl9CiAKLQlmcmFtZV9zaXplID0gU09MT19IV19CUEwgKiBzb2xvX3ZsaW5lcyhzb2xvX2Rldik7Ci0JZmRtYV9hZGRyID0gU09MT19ESVNQX0VYVF9BRERSKHNvbG9fZGV2KSArIChmaC0+b2xkX3dyaXRlICogZnJhbWVfc2l6ZSk7CisJZGlzcF9yZXNldF9kZXNjKGZoKTsKKwlzZyA9IHZidWYtPnNnbGlzdDsKKwlzZ19kbWEgPSBzZ19kbWFfYWRkcmVzcyhzZyk7CisJc2dfc2l6ZV9sZWZ0ID0gc2dfZG1hX2xlbihzZyk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgZnJhbWVfc2l6ZSAvIFNPTE9fRElTUF9CVUZfU0laRTsgaSsrKSB7Ci0JCWludCBqOwotCQlmb3IgKGogPSAwOyBqIDwgKFNPTE9fRElTUF9CVUZfU0laRSAvIFNPTE9fSFdfQlBMKTsgaisrKSB7Ci0JCQlpZiAoc29sb19wMm1fZG1hX3Qoc29sb19kZXYsIFNPTE9fUDJNX0RNQV9JRF9ESVNQLCAwLAotCQkJCQkgICB2YnVmLCBmZG1hX2FkZHIgKyAoaiAqIFNPTE9fSFdfQlBMKSwKLQkJCQkJICAgc29sb19ieXRlc3BlcmxpbmUoc29sb19kZXYpKSkKKwlmZG1hX2FkZHIgPSBTT0xPX0RJU1BfRVhUX0FERFIoc29sb19kZXYpICsgKGZoLT5vbGRfd3JpdGUgKgorCQkJKFNPTE9fSFdfQlBMICogc29sb192bGluZXMoc29sb19kZXYpKSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgc29sb192bGluZXMoc29sb19kZXYpOyBpKyspIHsKKwkJaW50IGxpbmVfbGVuID0gc29sb19ieXRlc3BlcmxpbmUoc29sb19kZXYpOworCQlpbnQgbGluZXM7CisKKwkJaWYgKCFzZ19zaXplX2xlZnQpIHsKKwkJCXNnID0gc2dfbmV4dChzZyk7CisJCQlpZiAoc2cgPT0gTlVMTCkKIAkJCQlnb3RvIGZpbmlzaF9idWY7Ci0JCQl2YnVmICs9IHNvbG9fYnl0ZXNwZXJsaW5lKHNvbG9fZGV2KTsKKwkJCXNnX2RtYSA9IHNnX2RtYV9hZGRyZXNzKHNnKTsKKwkJCXNnX3NpemVfbGVmdCA9IHNnX2RtYV9sZW4oc2cpOwogCQl9Ci0JCWZkbWFfYWRkciArPSBTT0xPX0RJU1BfQlVGX1NJWkU7CisKKwkJLyogTm8gcm9vbSBmb3IgYW4gZW50aXJlIGxpbmUsIHNvIGNodW5rIGl0IHVwICovCisJCWlmIChzZ19zaXplX2xlZnQgPCBsaW5lX2xlbikgeworCQkJaW50IHRoaXNfYWRkciA9IGZkbWFfYWRkcjsKKworCQkJd2hpbGUgKGxpbmVfbGVuID4gMCkgeworCQkJCWludCB0aGlzX3dyaXRlOworCisJCQkJaWYgKCFzZ19zaXplX2xlZnQpIHsKKwkJCQkJc2cgPSBzZ19uZXh0KHNnKTsKKwkJCQkJaWYgKHNnID09IE5VTEwpCisJCQkJCQlnb3RvIGZpbmlzaF9idWY7CisJCQkJCXNnX2RtYSA9IHNnX2RtYV9hZGRyZXNzKHNnKTsKKwkJCQkJc2dfc2l6ZV9sZWZ0ID0gc2dfZG1hX2xlbihzZyk7CisJCQkJfQorCisJCQkJdGhpc193cml0ZSA9IG1pbihzZ19zaXplX2xlZnQsIGxpbmVfbGVuKTsKKworCQkJCWlmIChkaXNwX3B1c2hfZGVzYyhmaCwgc2dfZG1hLCB0aGlzX2FkZHIsCisJCQkJCQkgICB0aGlzX3dyaXRlLCAwLCAwKSkKKwkJCQkJZ290byBmaW5pc2hfYnVmOworCisJCQkJbGluZV9sZW4gLT0gdGhpc193cml0ZTsKKwkJCQlzZ19zaXplX2xlZnQgLT0gdGhpc193cml0ZTsKKwkJCQlzZ19kbWEgKz0gdGhpc193cml0ZTsKKwkJCQl0aGlzX2FkZHIgKz0gdGhpc193cml0ZTsKKwkJCX0KKworCQkJZmRtYV9hZGRyICs9IFNPTE9fSFdfQlBMOworCQkJY29udGludWU7CisJCX0KKworCQkvKiBTaG92ZSBhcyBtYW55IGxpbmVzIGludG8gYSByZXBlYXRpbmcgZGVzY3JpcHRvciBhcyBwb3NzaWJsZSAqLworCQlsaW5lcyA9IG1pbihzZ19zaXplX2xlZnQgLyBsaW5lX2xlbiwKKwkJCSAgICBzb2xvX3ZsaW5lcyhzb2xvX2RldikgLSBpKTsKKworCQlpZiAoZGlzcF9wdXNoX2Rlc2MoZmgsIHNnX2RtYSwgZmRtYV9hZGRyLCBsaW5lX2xlbiwKKwkJCQkgICBsaW5lcyAtIDEsIFNPTE9fSFdfQlBMKSkKKwkJCWdvdG8gZmluaXNoX2J1ZjsKKworCQlpICs9IGxpbmVzIC0gMTsKKwkJZmRtYV9hZGRyICs9IFNPTE9fSFdfQlBMICogbGluZXM7CisJCXNnX2RtYSArPSBsaW5lcyAqIGxpbmVfbGVuOworCQlzZ19zaXplX2xlZnQgLT0gbGluZXMgKiBsaW5lX2xlbjsKIAl9Ci0JZXJyb3IgPSAwOworCisJZXJyb3IgPSBkaXNwX2ZsdXNoX2Rlc2NzKGZoKTsKIAogZmluaXNoX2J1ZjoKIAlpZiAoZXJyb3IpIHsKIAkJdmItPnN0YXRlID0gVklERU9CVUZfRVJST1I7CiAJfSBlbHNlIHsKKwkJdmItPnNpemUgPSBzb2xvX3ZsaW5lcyhzb2xvX2RldikgKiBzb2xvX2J5dGVzcGVybGluZShzb2xvX2Rldik7CiAJCXZiLT5zdGF0ZSA9IFZJREVPQlVGX0RPTkU7CiAJCXZiLT5maWVsZF9jb3VudCsrOwogCQlkb19nZXR0aW1lb2ZkYXkoJnZiLT50cyk7CkBAIC0yNzUsNyArMzc1LDcgQEAKIAkJCWJyZWFrOwogCiAJCWN1cl93cml0ZSA9IFNPTE9fVklfU1RBVFVTMF9QQUdFKHNvbG9fcmVnX3JlYWQoZmgtPnNvbG9fZGV2LAotCQkJCQkJCVNPTE9fVklfU1RBVFVTMCkpOworCQkJCQkJIFNPTE9fVklfU1RBVFVTMCkpOwogCQlpZiAoY3VyX3dyaXRlID09IGZoLT5vbGRfd3JpdGUpCiAJCQlicmVhazsKIApAQCAtMzEwLDcgKzQxMCw3IEBACiAKIAlyZW1vdmVfd2FpdF9xdWV1ZSgmc29sb19kZXYtPmRpc3BfdGhyZWFkX3dhaXQsICZ3YWl0KTsKIAotICAgICAgICByZXR1cm4gMDsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBzb2xvX3N0YXJ0X3RocmVhZChzdHJ1Y3Qgc29sb19maWxlaGFuZGxlICpmaCkKQEAgLTMzNywxMiArNDM3LDEyIEBACiAJc3RydWN0IHNvbG9fZmlsZWhhbmRsZSAqZmggPSB2cS0+cHJpdl9kYXRhOwogCXN0cnVjdCBzb2xvNjAxMF9kZXYgKnNvbG9fZGV2ICA9IGZoLT5zb2xvX2RldjsKIAotICAgICAgICAqc2l6ZSA9IHNvbG9faW1hZ2Vfc2l6ZShzb2xvX2Rldik7CisJKnNpemUgPSBzb2xvX2ltYWdlX3NpemUoc29sb19kZXYpOwogCi0gICAgICAgIGlmICgqY291bnQgPCBNSU5fVklEX0JVRkZFUlMpCisJaWYgKCpjb3VudCA8IE1JTl9WSURfQlVGRkVSUykKIAkJKmNvdW50ID0gTUlOX1ZJRF9CVUZGRVJTOwogCi0gICAgICAgIHJldHVybiAwOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IHNvbG9fYnVmX3ByZXBhcmUoc3RydWN0IHZpZGVvYnVmX3F1ZXVlICp2cSwKQEAgLTM2NCw3ICs0NjQsOSBAQAogCWlmICh2Yi0+c3RhdGUgPT0gVklERU9CVUZfTkVFRFNfSU5JVCkgewogCQlpbnQgcmMgPSB2aWRlb2J1Zl9pb2xvY2sodnEsIHZiLCBOVUxMKTsKIAkJaWYgKHJjIDwgMCkgewotCQkJdmlkZW9idWZfZG1hX2NvbnRpZ19mcmVlKHZxLCB2Yik7CisJCQlzdHJ1Y3QgdmlkZW9idWZfZG1hYnVmICpkbWEgPSB2aWRlb2J1Zl90b19kbWEodmIpOworCQkJdmlkZW9idWZfZG1hX3VubWFwKHZxLT5kZXYsIGRtYSk7CisJCQl2aWRlb2J1Zl9kbWFfZnJlZShkbWEpOwogCQkJdmItPnN0YXRlID0gVklERU9CVUZfTkVFRFNfSU5JVDsKIAkJCXJldHVybiByYzsKIAkJfQpAQCAtMzg4LDcgKzQ5MCwxMCBAQAogc3RhdGljIHZvaWQgc29sb19idWZfcmVsZWFzZShzdHJ1Y3QgdmlkZW9idWZfcXVldWUgKnZxLAogCQkJICAgICBzdHJ1Y3QgdmlkZW9idWZfYnVmZmVyICp2YikKIHsKLQl2aWRlb2J1Zl9kbWFfY29udGlnX2ZyZWUodnEsIHZiKTsKKwlzdHJ1Y3QgdmlkZW9idWZfZG1hYnVmICpkbWEgPSB2aWRlb2J1Zl90b19kbWEodmIpOworCisJdmlkZW9idWZfZG1hX3VubWFwKHZxLT5kZXYsIGRtYSk7CisJdmlkZW9idWZfZG1hX2ZyZWUoZG1hKTsKIAl2Yi0+c3RhdGUgPSBWSURFT0JVRl9ORUVEU19JTklUOwogfQogCkBAIC00MDQsNyArNTA5LDcgQEAKIHsKIAlzdHJ1Y3Qgc29sb19maWxlaGFuZGxlICpmaCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKIAotICAgICAgICByZXR1cm4gdmlkZW9idWZfcG9sbF9zdHJlYW0oZmlsZSwgJmZoLT52aWRxLCB3YWl0KTsKKwlyZXR1cm4gdmlkZW9idWZfcG9sbF9zdHJlYW0oZmlsZSwgJmZoLT52aWRxLCB3YWl0KTsKIH0KIAogc3RhdGljIGludCBzb2xvX3Y0bDJfbW1hcChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCkBAIC00MjAsNyArNTI1LDggQEAKIAlzdHJ1Y3Qgc29sb19maWxlaGFuZGxlICpmaDsKIAlpbnQgcmV0OwogCi0JaWYgKChmaCA9IGt6YWxsb2Moc2l6ZW9mKCpmaCksIEdGUF9LRVJORUwpKSA9PSBOVUxMKQorCWZoID0ga3phbGxvYyhzaXplb2YoKmZoKSwgR0ZQX0tFUk5FTCk7CisJaWYgKGZoID09IE5VTEwpCiAJCXJldHVybiAtRU5PTUVNOwogCiAJc3Bpbl9sb2NrX2luaXQoJmZoLT5zbG9jayk7CkBAIC00MjgsMTYgKzUzNCwxNyBAQAogCWZoLT5zb2xvX2RldiA9IHNvbG9fZGV2OwogCWZpbGUtPnByaXZhdGVfZGF0YSA9IGZoOwogCi0JaWYgKChyZXQgPSBzb2xvX3N0YXJ0X3RocmVhZChmaCkpKSB7CisJcmV0ID0gc29sb19zdGFydF90aHJlYWQoZmgpOworCWlmIChyZXQpIHsKIAkJa2ZyZWUoZmgpOwogCQlyZXR1cm4gcmV0OwogCX0KIAotCXZpZGVvYnVmX3F1ZXVlX2RtYV9jb250aWdfaW5pdCgmZmgtPnZpZHEsICZzb2xvX3ZpZGVvX3FvcHMsCi0JCQkJICAgICZzb2xvX2Rldi0+cGRldi0+ZGV2LCAmZmgtPnNsb2NrLAotCQkJCSAgICBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUsCi0JCQkJICAgIFNPTE9fRElTUF9QSVhfRklFTEQsCi0JCQkJICAgIHNpemVvZihzdHJ1Y3QgdmlkZW9idWZfYnVmZmVyKSwgZmgsIE5VTEwpOworCXZpZGVvYnVmX3F1ZXVlX3NnX2luaXQoJmZoLT52aWRxLCAmc29sb192aWRlb19xb3BzLAorCQkJICAgICAgICZzb2xvX2Rldi0+cGRldi0+ZGV2LCAmZmgtPnNsb2NrLAorCQkJICAgICAgIFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSwKKwkJCSAgICAgICBTT0xPX0RJU1BfUElYX0ZJRUxELAorCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgdmlkZW9idWZfYnVmZmVyKSwgZmgsIE5VTEwpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC01MzAsNyArNjM3LDcgQEAKIAlpZiAoc29sb19kZXYtPnZpZGVvX3R5cGUgPT0gU09MT19WT19GTVRfVFlQRV9OVFNDKQogCQlpbnB1dC0+c3RkID0gVjRMMl9TVERfTlRTQ19NOwogCWVsc2UKLQkJaW5wdXQtPnN0ZCA9IFY0TDJfU1REX1BBTF9NOworCQlpbnB1dC0+c3RkID0gVjRMMl9TVERfUEFMX0I7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTYyMiw3ICs3MjksNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHNvbG9fcmVxYnVmcyhzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwgCitzdGF0aWMgaW50IHNvbG9fcmVxYnVmcyhzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKIAkJCXN0cnVjdCB2NGwyX3JlcXVlc3RidWZmZXJzICpyZXEpCiB7CiAJc3RydWN0IHNvbG9fZmlsZWhhbmRsZSAqZmggPSBwcml2OwpAQCAtNzgxLDExICs4ODgsMTEgQEAKIAkudmlkaW9jX3FidWYJCQk9IHNvbG9fcWJ1ZiwKIAkudmlkaW9jX2RxYnVmCQkJPSBzb2xvX2RxYnVmLAogCS52aWRpb2Nfc3RyZWFtb24JCT0gc29sb19zdHJlYW1vbiwKLSAgICAgICAgLnZpZGlvY19zdHJlYW1vZmYJCT0gc29sb19zdHJlYW1vZmYsCisJLnZpZGlvY19zdHJlYW1vZmYJCT0gc29sb19zdHJlYW1vZmYsCiAJLyogQ29udHJvbHMgKi8KIAkudmlkaW9jX3F1ZXJ5Y3RybAkJPSBzb2xvX2Rpc3BfcXVlcnljdHJsLAotICAgICAgICAudmlkaW9jX2dfY3RybAkJCT0gc29sb19kaXNwX2dfY3RybCwKLSAgICAgICAgLnZpZGlvY19zX2N0cmwJCQk9IHNvbG9fZGlzcF9zX2N0cmwsCisJLnZpZGlvY19nX2N0cmwJCQk9IHNvbG9fZGlzcF9nX2N0cmwsCisJLnZpZGlvY19zX2N0cmwJCQk9IHNvbG9fZGlzcF9zX2N0cmwsCiB9OwogCiBzdGF0aWMgc3RydWN0IHZpZGVvX2RldmljZSBzb2xvX3Y0bDJfdGVtcGxhdGUgPSB7CkBAIC03OTUsNyArOTAyLDcgQEAKIAkubWlub3IJCQk9IC0xLAogCS5yZWxlYXNlCQk9IHZpZGVvX2RldmljZV9yZWxlYXNlLAogCi0JLnR2bm9ybXMJCT0gVjRMMl9TVERfTlRTQ19NIHwgVjRMMl9TVERfUEFMX00sCisJLnR2bm9ybXMJCT0gVjRMMl9TVERfTlRTQ19NIHwgVjRMMl9TVERfUEFMX0IsCiAJLmN1cnJlbnRfbm9ybQkJPSBWNEwyX1NURF9OVFNDX00sCiB9OwogCkBAIC04MzYsMTMgKzk0MywxMyBAQAogCWZvciAoaSA9IDA7IGkgPCBzb2xvX2Rldi0+bnJfY2hhbnM7IGkrKykgewogCQlzb2xvX3Y0bDJfc2V0X2NoKHNvbG9fZGV2LCBpKTsKIAkJd2hpbGUgKGVyYXNlX29mZihzb2xvX2RldikpCi0JCQk7Ly8gRG8gbm90aGluZworCQkJOy8qIERvIG5vdGhpbmcgKi8KIAl9CiAKIAkvKiBTZXQgdGhlIGRlZmF1bHQgZGlzcGxheSBjaGFubmVsICovCiAJc29sb192NGwyX3NldF9jaChzb2xvX2RldiwgMCk7CiAJd2hpbGUgKGVyYXNlX29mZihzb2xvX2RldikpCi0JCTsvLyBEbyBub3RoaW5nCisJCTsvKiBEbyBub3RoaW5nICovCiAKIAlzb2xvNjAxMF9pcnFfb24oc29sb19kZXYsIFNPTE9fSVJRX1ZJREVPX0lOKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NvbG82eDEwL3NvbG82MDEwLmggYi9kcml2ZXJzL3N0YWdpbmcvc29sbzZ4MTAvc29sbzYwMTAuaAppbmRleCBkY2E4ZTNlLi45YzkzMGYzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvc29sbzZ4MTAvc29sbzYwMTAuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvc29sbzZ4MTAvc29sbzYwMTAuaApAQCAtMjYsOCArMjYsOCBAQAogI2luY2x1ZGUgPGxpbnV4L3NlbWFwaG9yZS5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvd2FpdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgogCkBAIC00OCwxMCArNDgsMTQgQEAKICNkZWZpbmUgUENJX0RFVklDRV9JRF9ORVVTT0xPXzQJCTB4NDMwNAogI2RlZmluZSBQQ0lfREVWSUNFX0lEX05FVVNPTE9fOQkJMHg0MzA5CiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTkVVU09MT18xNgkweDQzMTAKLS8qIENvbW1lbGwgU29mdGxvZ2ljIDYwMTAgYmFzZWQgY2FyZHMgKi8KLSNkZWZpbmUgUENJX0RFVklDRV9JRF9DT01NU09MT180CTB4NEUwNAotI2RlZmluZSBQQ0lfREVWSUNFX0lEX0NPTU1TT0xPXzkJMHg0RTA5Ci0jZGVmaW5lIFBDSV9ERVZJQ0VfSURfQ09NTVNPTE9fMTYJMHg0RTEwCisvKiBCbHVlY2hlcnJ5IFNvZnRsb2dpYyA2MDEwIGJhc2VkIGNhcmRzICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQkNfU09MT180CQkweDRFMDQKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9CQ19TT0xPXzkJCTB4NEUwOQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0JDX1NPTE9fMTYJMHg0RTEwCisvKiBCbHVlY2hlcnJ5IFNvZnRsb2dpYyA2MTEwIGJhc2VkIGNhcmRzICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQkNfNjExMF80CQkweDUzMDQKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9CQ182MTEwXzgJCTB4NTMwOAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0JDXzYxMTBfMTYJMHg1MzEwCiAjZW5kaWYgLyogQmx1ZWNoZXJyeSAqLwogCiAjZGVmaW5lIFNPTE82MDEwX05BTUUJCQkic29sbzYwMTAiCkBAIC02NCw3ICs2OCw3IEBACiAjZGVmaW5lIFNPTE82MDEwX1ZFUl9NSU5PUgkJMAogI2RlZmluZSBTT0xPNjAxMF9WRVJfU1VCCQkwCiAjZGVmaW5lIFNPTE82MDEwX1ZFUl9OVU0gXAotICAgIEtFUk5FTF9WRVJTSU9OKFNPTE82MDEwX1ZFUl9NQUpPUiwgU09MTzYwMTBfVkVSX01JTk9SLCBTT0xPNjAxMF9WRVJfU1VCKQorCUtFUk5FTF9WRVJTSU9OKFNPTE82MDEwX1ZFUl9NQUpPUiwgU09MTzYwMTBfVkVSX01JTk9SLCBTT0xPNjAxMF9WRVJfU1VCKQogCiAvKgogICogVGhlIFNPTE82MDEwIGFjdHVhbGx5IGhhcyA4IGkyYyBjaGFubmVscywgYnV0IHdlIG9ubHkgdXNlIDIuCkBAIC03OCw3ICs4Miw2IEBACiAvKiBETUEgRW5naW5lIHNldHVwICovCiAjZGVmaW5lIFNPTE9fTlJfUDJNCQkJNAogI2RlZmluZSBTT0xPX05SX1AyTV9ERVNDCQkyNTYKLSNkZWZpbmUgU09MT19QMk1fREVTQ19TSVpFCQkoU09MT19OUl9QMk1fREVTQyAqIDE2KQogLyogTVBFRyBhbmQgSlBFRyBzaGFyZSB0aGUgc2FtZSBpbnRlcnJ1cHQgYW5kIGxvY2tzIHNvIHRoZXkgbXVzdCBiZSB0b2dldGhlcgogICogaW4gdGhlIHNhbWUgZG1hIGNoYW5uZWwuICovCiAjZGVmaW5lIFNPTE9fUDJNX0RNQV9JRF9NUDRFCQkwCkBAIC0xMjMsMTEgKzEyNiwxNyBAQAogCUlJQ19TVEFURV9TVE9QCiB9OwogCitzdHJ1Y3QgcDJtX2Rlc2MgeworCXUzMiBjdHJsOworCXUzMiBleHQ7CisJdTMyIHRhOworCXUzMiBmYTsKK307CisKIHN0cnVjdCBzb2xvX3AybV9kZXYgewotCXN0cnVjdCBzZW1hcGhvcmUJc2VtOworCXN0cnVjdCBtdXRleAkJbXV0ZXg7CiAJc3RydWN0IGNvbXBsZXRpb24JY29tcGxldGlvbjsKIAlpbnQJCQllcnJvcjsKLQl1OAkJCWRlc2NbU09MT19QMk1fREVTQ19TSVpFXTsKIH07CiAKICNkZWZpbmUgT1NEX1RFWFRfTUFYCQkzMApAQCAtMTg1LDcgKzE5NCw3IEBACiAJLyogaTJjIHJlbGF0ZWQgaXRlbXMgKi8KIAlzdHJ1Y3QgaTJjX2FkYXB0ZXIJaTJjX2FkYXBbU09MT19JMkNfQURBUFRFUlNdOwogCWVudW0gU09MT19JMkNfU1RBVEUJaTJjX3N0YXRlOwotCXN0cnVjdCBzZW1hcGhvcmUJaTJjX3NlbTsKKwlzdHJ1Y3QgbXV0ZXgJCWkyY19tdXRleDsKIAlpbnQJCQlpMmNfaWQ7CiAJd2FpdF9xdWV1ZV9oZWFkX3QJaTJjX3dhaXQ7CiAJc3RydWN0IGkyY19tc2cJCSppMmNfbXNnOwpAQCAtMjEyLDcgKzIyMSw3IEBACiAJc3RydWN0IHNvbG9fZW5jX2J1ZgllbmNfYnVmW1NPTE9fTlJfUklOR19CVUZTXTsKIAogCS8qIEN1cnJlbnQgdmlkZW8gc2V0dGluZ3MgKi8KLQl1MzIgCQkJdmlkZW9fdHlwZTsKKwl1MzIJCQl2aWRlb190eXBlOwogCXUxNgkJCXZpZGVvX2hzaXplLCB2aWRlb192c2l6ZTsKIAl1MTYJCQl2b3V0X2hzdGFydCwgdm91dF92c3RhcnQ7CiAJdTE2CQkJdmluX2hzdGFydCwgdmluX3ZzdGFydDsKQEAgLTMwNiw2ICszMTUsMTQgQEAKIAkJICAgZG1hX2FkZHJfdCBkbWFfYWRkciwgdTMyIGV4dF9hZGRyLCB1MzIgc2l6ZSk7CiBpbnQgc29sb19wMm1fZG1hKHN0cnVjdCBzb2xvNjAxMF9kZXYgKnNvbG9fZGV2LCB1OCBpZCwgaW50IHdyLAogCQkgdm9pZCAqc3lzX2FkZHIsIHUzMiBleHRfYWRkciwgdTMyIHNpemUpOworaW50IHNvbG9fcDJtX2RtYV9zZyhzdHJ1Y3Qgc29sbzYwMTBfZGV2ICpzb2xvX2RldiwgdTggaWQsCisJCSAgICBzdHJ1Y3QgcDJtX2Rlc2MgKnBkZXNjLCBpbnQgd3IsCisJCSAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnbGlzdCwgdTMyIHNnX29mZiwKKwkJICAgIHUzMiBleHRfYWRkciwgdTMyIHNpemUpOwordm9pZCBzb2xvX3AybV9wdXNoX2Rlc2Moc3RydWN0IHAybV9kZXNjICpkZXNjLCBpbnQgd3IsIGRtYV9hZGRyX3QgZG1hX2FkZHIsCisJCQl1MzIgZXh0X2FkZHIsIHUzMiBzaXplLCBpbnQgcmVwZWF0LCB1MzIgZXh0X3NpemUpOworaW50IHNvbG9fcDJtX2RtYV9kZXNjKHN0cnVjdCBzb2xvNjAxMF9kZXYgKnNvbG9fZGV2LCB1OCBpZCwKKwkJICAgICAgc3RydWN0IHAybV9kZXNjICpkZXNjLCBpbnQgZGVzY19jb3VudCk7CiAKIC8qIFNldCB0aGUgdGhyZXNob2xkIGZvciBtb3Rpb24gZGV0ZWN0aW9uICovCiB2b2lkIHNvbG9fc2V0X21vdGlvbl90aHJlc2hvbGQoc3RydWN0IHNvbG82MDEwX2RldiAqc29sb19kZXYsIHU4IGNoLCB1MTYgdmFsKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zcGVha3VwL2tvYmplY3RzLmMgYi9kcml2ZXJzL3N0YWdpbmcvc3BlYWt1cC9rb2JqZWN0cy5jCmluZGV4IGNjNzlmOWUuLjQwOGJiOWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9zcGVha3VwL2tvYmplY3RzLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3NwZWFrdXAva29iamVjdHMuYwpAQCAtOTg0LDggKzk4NCwxMCBAQAogCSAqIG5vdCBrbm93biBhaGVhZCBvZiB0aW1lLgogCSAqLwogCWFjY2Vzc2liaWxpdHlfa29iaiA9IGtvYmplY3RfY3JlYXRlX2FuZF9hZGQoImFjY2Vzc2liaWxpdHkiLCBOVUxMKTsKLQlpZiAoIWFjY2Vzc2liaWxpdHlfa29iaikKLQkJcmV0dXJuIC1FTk9NRU07CisJaWYgKCFhY2Nlc3NpYmlsaXR5X2tvYmopIHsKKwkJcmV0dmFsID0gLUVOT01FTTsKKwkJZ290byBvdXQ7CisJfQogCiAJc3BlYWt1cF9rb2JqID0ga29iamVjdF9jcmVhdGVfYW5kX2FkZCgic3BlYWt1cCIsIGFjY2Vzc2liaWxpdHlfa29iaik7CiAJaWYgKCFzcGVha3VwX2tvYmopIHsKQEAgLTEwMDIsNyArMTAwNCw3IEBACiAJaWYgKHJldHZhbCkKIAkJZ290byBlcnJfZ3JvdXA7CiAKLQlyZXR1cm4gMDsKKwlnb3RvIG91dDsKIAogZXJyX2dyb3VwOgogCXN5c2ZzX3JlbW92ZV9ncm91cChzcGVha3VwX2tvYmosICZtYWluX2F0dHJfZ3JvdXApOwpAQCAtMTAxMCw2ICsxMDEyLDcgQEAKIAlrb2JqZWN0X3B1dChzcGVha3VwX2tvYmopOwogZXJyX2FjYzoKIAlrb2JqZWN0X3B1dChhY2Nlc3NpYmlsaXR5X2tvYmopOworb3V0OgogCXJldHVybiByZXR2YWw7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zcGVha3VwL21haW4uYyBiL2RyaXZlcnMvc3RhZ2luZy9zcGVha3VwL21haW4uYwppbmRleCA0YjdhOWMyLi4zY2QwMDM5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvc3BlYWt1cC9tYWluLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3NwZWFrdXAvbWFpbi5jCkBAIC0yMjUzLDE3ICsyMjUzLDE3IEBACiAKIAllcnIgPSBzcGVha3VwX2FkZF92aXJ0dWFsX2tleWJvYXJkKCk7CiAJaWYgKGVycikKLQkJcmV0dXJuIGVycjsKKwkJZ290byBvdXQ7CiAKIAlpbml0aWFsaXplX21zZ3MoKTsJLyogSW5pdGlhbGl6ZSBhcnJheXMgZm9yIGkxOG4uICovCiAJZmlyc3RfY29uc29sZSA9IGt6YWxsb2Moc2l6ZW9mKCpmaXJzdF9jb25zb2xlKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFmaXJzdF9jb25zb2xlKQotCQlyZXR1cm4gLUVOT01FTTsKLQllcnIgPSBzcGVha3VwX2tvYmpfaW5pdCgpOwotCWlmIChlcnIpIHsKLQkJa2ZyZWUoZmlyc3RfY29uc29sZSk7Ci0JCXJldHVybiBlcnI7CisJaWYgKCFmaXJzdF9jb25zb2xlKSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZXJyX2NvbnM7CiAJfQorCWVyciA9IHNwZWFrdXBfa29ial9pbml0KCk7CisJaWYgKGVycikKKwkJZ290byBlcnJfa29iamVjdDsKIAogCXJlc2V0X2RlZmF1bHRfY2hhcnMoKTsKIAlyZXNldF9kZWZhdWx0X2NoYXJ0YWIoKTsKQEAgLTIyOTksMTEgKzIyOTksMjAgQEAKIAogCXNwZWFrdXBfdGFzayA9IGt0aHJlYWRfY3JlYXRlKHNwZWFrdXBfdGhyZWFkLCBOVUxMLCAic3BlYWt1cCIpOwogCXNldF91c2VyX25pY2Uoc3BlYWt1cF90YXNrLCAxMCk7Ci0JaWYgKCFJU19FUlIoc3BlYWt1cF90YXNrKSkKLQkJd2FrZV91cF9wcm9jZXNzKHNwZWFrdXBfdGFzayk7Ci0JZWxzZQotCQlyZXR1cm4gLUVOT01FTTsKLQlyZXR1cm4gMDsKKwlpZiAoSVNfRVJSKHNwZWFrdXBfdGFzaykpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBlcnJfa29iamVjdDsKKwl9CisJd2FrZV91cF9wcm9jZXNzKHNwZWFrdXBfdGFzayk7CisJZ290byBvdXQ7CisKK2Vycl9rb2JqZWN0Ogorc3BlYWt1cF9rb2JqX2V4aXQoKTsKKwlrZnJlZShmaXJzdF9jb25zb2xlKTsKK2Vycl9jb25zOgorCXNwZWFrdXBfcmVtb3ZlX3ZpcnR1YWxfa2V5Ym9hcmQoKTsKK291dDoKKwlyZXR1cm4gZXJyOwogfQogCiBtb2R1bGVfaW5pdChzcGVha3VwX2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NwZWFrdXAvc3BrX3R5cGVzLmggYi9kcml2ZXJzL3N0YWdpbmcvc3BlYWt1cC9zcGtfdHlwZXMuaAppbmRleCA4NDBiZGRiLi5kMzZjOTBlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvc3BlYWt1cC9zcGtfdHlwZXMuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvc3BlYWt1cC9zcGtfdHlwZXMuaApAQCAtNTIsNyArNTIsNyBAQAogCiAjZGVmaW5lIENPTE9SX0JVRkZFUl9TSVpFIDE2MAogCi1zdHJ1Y3Qgc3BrX2hpZ2hsaWdodF9jb2xvcl90cmFja3sKK3N0cnVjdCBzcGtfaGlnaGxpZ2h0X2NvbG9yX3RyYWNrIHsKIAkvKiBDb3VudCBvZiBlYWNoIGJhY2tncm91bmQgY29sb3IgKi8KIAl1bnNpZ25lZCBpbnQgYmdjb3VudFs4XTsKIAkvKiBCdWZmZXIgZm9yIGNoYXJhY3RlcnMgZHJhd24gd2l0aCBlYWNoIGJhY2tncm91bmQgY29sb3IgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zcGVjdHJhL2Zmc3BvcnQuYyBiL2RyaXZlcnMvc3RhZ2luZy9zcGVjdHJhL2Zmc3BvcnQuYwppbmRleCA2M2E5ZDBhLi4wMDdiMjRiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvc3BlY3RyYS9mZnNwb3J0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3NwZWN0cmEvZmZzcG9ydC5jCkBAIC0yOCw2ICsyOCw3IEBACiAjaW5jbHVkZSA8bGludXgvbG9nMi5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvYXN5bmMuaD4KIAogLyoqKiogSGVscGVyIGZ1bmN0aW9ucyB1c2VkIGZvciBEaXYsIFJlbWFpbmRlciBvcGVyYXRpb24gb24gdTY0ICoqKiovCiAKQEAgLTcyOSwzNCArNzMwLDE2IEBACiB9CiAqLwogCi1zdGF0aWMgaW50IEdMT0JfU0JEX2luaXQodm9pZCkKK3N0YXRpYyB2b2lkIHJlZ2lzdGVyX3NwZWN0cmFfZnRsX2FzeW5jKHZvaWQgKnVudXNlZCwgYXN5bmNfY29va2llX3QgY29va2llKQogewogCWludCBpOwogCi0JLyogU2V0IGRlYnVnIG91dHB1dCBsZXZlbCAoMH4zKSBoZXJlLiAzIGlzIG1vc3QgdmVyYm9zZSAqLwotCXByaW50ayhLRVJOX0FMRVJUICJTcGVjdHJhOiAlc1xuIiwgR0xPQl92ZXJzaW9uKTsKLQotCW11dGV4X2luaXQoJnNwZWN0cmFfbG9jayk7Ci0KLQlHTE9CX1NCRF9tYWpvcm51bSA9IHJlZ2lzdGVyX2Jsa2RldigwLCBHTE9CX1NCRF9OQU1FKTsKLQlpZiAoR0xPQl9TQkRfbWFqb3JudW0gPD0gMCkgewotCQlwcmludGsoS0VSTl9FUlIgIlVuYWJsZSB0byBnZXQgdGhlIG1ham9yICVkIGZvciBTcGVjdHJhIiwKLQkJICAgICAgIEdMT0JfU0JEX21ham9ybnVtKTsKLQkJcmV0dXJuIC1FQlVTWTsKLQl9Ci0KLQlpZiAoUEFTUyAhPSBHTE9CX0ZUTF9GbGFzaF9Jbml0KCkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJTcGVjdHJhOiBVbmFibGUgdG8gSW5pdGlhbGl6ZSBGbGFzaCBEZXZpY2UuICIKLQkJICAgICAgICJBYm9ydGluZ1xuIik7Ci0JCWdvdG8gb3V0X2ZsYXNoX3JlZ2lzdGVyOwotCX0KLQogCS8qIGNyZWF0ZV9zeXNmc19lbnRyeSgmZGV2LT5kZXYpOyAqLwogCiAJaWYgKFBBU1MgIT0gR0xPQl9GVExfSWRlbnRpZnlEZXZpY2UoJklkZW50aWZ5RGV2aWNlRGF0YSkpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJTcGVjdHJhOiBVbmFibGUgdG8gUmVhZCBGbGFzaCBEZXZpY2UuICIKIAkJICAgICAgICJBYm9ydGluZ1xuIik7Ci0JCWdvdG8gb3V0X2ZsYXNoX3JlZ2lzdGVyOworCQlyZXR1cm47CiAJfSBlbHNlIHsKIAkJbmFuZF9kYmdfcHJpbnQoTkFORF9EQkdfV0FSTiwgIkluIEdMT0JfU0JEX2luaXQ6ICIKIAkJCSAgICAgICAiTnVtIGJsb2Nrcz0lZCwgcGFnZXNwZXJibG9jaz0lZCwgIgpAQCAtNzc1LDI0ICs3NTgsNTAgQEAKIAl9CiAJcHJpbnRrKEtFUk5fQUxFUlQgIlNwZWN0cmE6IGJsb2NrIHRhYmxlIGhhcyBiZWVuIGZvdW5kLlxuIik7CiAKKwlHTE9CX1NCRF9tYWpvcm51bSA9IHJlZ2lzdGVyX2Jsa2RldigwLCBHTE9CX1NCRF9OQU1FKTsKKwlpZiAoR0xPQl9TQkRfbWFqb3JudW0gPD0gMCkgeworCQlwcmludGsoS0VSTl9FUlIgIlVuYWJsZSB0byBnZXQgdGhlIG1ham9yICVkIGZvciBTcGVjdHJhIiwKKwkJICAgICAgIEdMT0JfU0JEX21ham9ybnVtKTsKKwkJZ290byBvdXRfZnRsX2ZsYXNoX3JlZ2lzdGVyOworCX0KKwogCWZvciAoaSA9IDA7IGkgPCBOVU1fREVWSUNFUzsgaSsrKQogCQlpZiAoU0JEX3NldHVwX2RldmljZSgmbmFuZF9kZXZpY2VbaV0sIGkpID09IC1FTk9NRU0pCi0JCQlnb3RvIG91dF9mdGxfZmxhc2hfcmVnaXN0ZXI7CisJCQlnb3RvIG91dF9ibGtfcmVnaXN0ZXI7CiAKIAluYW5kX2RiZ19wcmludChOQU5EX0RCR19ERUJVRywKIAkJICAgICAgICJTcGVjdHJhOiBtb2R1bGUgbG9hZGVkIHdpdGggbWFqb3IgbnVtYmVyICVkXG4iLAogCQkgICAgICAgR0xPQl9TQkRfbWFqb3JudW0pOwogCi0JcmV0dXJuIDA7CisJcmV0dXJuOwogCitvdXRfYmxrX3JlZ2lzdGVyOgorCXVucmVnaXN0ZXJfYmxrZGV2KEdMT0JfU0JEX21ham9ybnVtLCBHTE9CX1NCRF9OQU1FKTsKIG91dF9mdGxfZmxhc2hfcmVnaXN0ZXI6CiAJR0xPQl9GVExfQ2FjaGVfUmVsZWFzZSgpOwotb3V0X2ZsYXNoX3JlZ2lzdGVyOgotCUdMT0JfRlRMX0ZsYXNoX1JlbGVhc2UoKTsKLQl1bnJlZ2lzdGVyX2Jsa2RldihHTE9CX1NCRF9tYWpvcm51bSwgR0xPQl9TQkRfTkFNRSk7CiAJcHJpbnRrKEtFUk5fRVJSICJTcGVjdHJhOiBNb2R1bGUgbG9hZCBmYWlsZWQuXG4iKTsKK30KIAotCXJldHVybiAtRU5PTUVNOworaW50IHJlZ2lzdGVyX3NwZWN0cmFfZnRsKCkKK3sKKwlhc3luY19zY2hlZHVsZShyZWdpc3Rlcl9zcGVjdHJhX2Z0bF9hc3luYywgTlVMTCk7CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChyZWdpc3Rlcl9zcGVjdHJhX2Z0bCk7CisKK3N0YXRpYyBpbnQgR0xPQl9TQkRfaW5pdCh2b2lkKQoreworCS8qIFNldCBkZWJ1ZyBvdXRwdXQgbGV2ZWwgKDB+MykgaGVyZS4gMyBpcyBtb3N0IHZlcmJvc2UgKi8KKwlwcmludGsoS0VSTl9BTEVSVCAiU3BlY3RyYTogJXNcbiIsIEdMT0JfdmVyc2lvbik7CisKKwltdXRleF9pbml0KCZzcGVjdHJhX2xvY2spOworCisJaWYgKFBBU1MgIT0gR0xPQl9GVExfRmxhc2hfSW5pdCgpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiU3BlY3RyYTogVW5hYmxlIHRvIEluaXRpYWxpemUgRmxhc2ggRGV2aWNlLiAiCisJCSAgICAgICAiQWJvcnRpbmdcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBHTE9CX1NCRF9leGl0KHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc3BlY3RyYS9mZnNwb3J0LmggYi9kcml2ZXJzL3N0YWdpbmcvc3BlY3RyYS9mZnNwb3J0LmgKaW5kZXggNmM1ZDkwYy4uODVjMDc1MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3NwZWN0cmEvZmZzcG9ydC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zcGVjdHJhL2Zmc3BvcnQuaApAQCAtODAsNSArODAsNiBAQAogZXh0ZXJuIGludCBHTE9CX0NhbGNfVXNlZF9CaXRzKHUzMiBuKTsKIGV4dGVybiB1NjQgR0xPQl91NjRfRGl2KHU2NCBhZGRyLCB1MzIgZGl2aXNvcik7CiBleHRlcm4gdTY0IEdMT0JfdTY0X1JlbWFpbmRlcih1NjQgYWRkciwgdTMyIGRpdmlzb3JfdHlwZSk7CitleHRlcm4gaW50IHJlZ2lzdGVyX3NwZWN0cmFfZnRsKHZvaWQpOwogCiAjZW5kaWYgLyogX0ZGU1BPUlRfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc3BlY3RyYS9mbGFzaC5jIGIvZHJpdmVycy9zdGFnaW5nL3NwZWN0cmEvZmxhc2guYwppbmRleCA0ZTZlNDUxLi5mYjM5YzhlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvc3BlY3RyYS9mbGFzaC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zcGVjdHJhL2ZsYXNoLmMKQEAgLTEyNTgsOSArMTI1OCw3IEBACiAKIAlnX1NCRENtZEluZGV4ID0gMDsKIAotCUdMT0JfTExEX0ZsYXNoX0luaXQoKTsKLQotCXN0YXR1cyA9IEdMT0JfTExEX1JlYWRfRGV2aWNlX0lEKCk7CisJc3RhdHVzID0gR0xPQl9MTERfRmxhc2hfSW5pdCgpOwogCiAJcmV0dXJuIHN0YXR1czsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zcGVjdHJhL2xsZF9lbXUuYyBiL2RyaXZlcnMvc3RhZ2luZy9zcGVjdHJhL2xsZF9lbXUuYwppbmRleCA2NzMzYmJmLi4wOTVmMmYwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvc3BlY3RyYS9sbGRfZW11LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3NwZWN0cmEvbGxkX2VtdS5jCkBAIC0xODAsMTAgKzE4MCw4IEBACiAJbmFuZF9kYmdfcHJpbnQoTkFORF9EQkdfVFJBQ0UsICIlcywgTGluZSAlZCwgRnVuY3Rpb246ICVzXG4iLAogCQkgICAgICAgX19GSUxFX18sIF9fTElORV9fLCBfX2Z1bmNfXyk7CiAKLQlmbGFzaF9tZW1vcnlbMF0gPSAodTggKil2bWFsbG9jKEdMT0JfTExEX1BBR0VfU0laRSAqCi0JCQkJCQkgICBHTE9CX0xMRF9CTE9DS1MgKgotCQkJCQkJICAgR0xPQl9MTERfUEFHRVMgKgotCQkJCQkJICAgc2l6ZW9mKHU4KSk7CisJZmxhc2hfbWVtb3J5WzBdID0gdm1hbGxvYyhHTE9CX0xMRF9QQUdFX1NJWkUgKiBHTE9CX0xMRF9CTE9DS1MgKgorCQkJCSAgR0xPQl9MTERfUEFHRVMgKiBzaXplb2YodTgpKTsKIAlpZiAoIWZsYXNoX21lbW9yeVswXSkgewogCQlwcmludGsoS0VSTl9FUlIgIkZhaWwgdG8gYWxsb2NhdGUgbWVtb3J5ICIKIAkJICAgICAgICJmb3IgbmFuZCBlbXVsYXRvciFcbiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NwZWN0cmEvbGxkX25hbmQuYyBiL2RyaXZlcnMvc3RhZ2luZy9zcGVjdHJhL2xsZF9uYW5kLmMKaW5kZXggMGQ2NDdhOGYuLjIyNjNkM2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9zcGVjdHJhL2xsZF9uYW5kLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3NwZWN0cmEvbGxkX25hbmQuYwpAQCAtMjM5NSwxMTIgKzIzOTUsOSBAQAogCXVuc2lnbmVkIGxvbmcgY3NyX2Jhc2U7CiAJdW5zaWduZWQgbG9uZyBjc3JfbGVuOwogCXN0cnVjdCBtcnN0X25hbmRfaW5mbyAqcG5kZXYgPSAmaW5mbzsKLQotCW5hbmRfZGJnX3ByaW50KE5BTkRfREJHX1dBUk4sICIlcywgTGluZSAlZCwgRnVuY3Rpb246ICVzXG4iLAotCQkgICAgICAgX19GSUxFX18sIF9fTElORV9fLCBfX2Z1bmNfXyk7Ci0KLQlyZXQgPSBwY2lfZW5hYmxlX2RldmljZShkZXYpOwotCWlmIChyZXQpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJTcGVjdHJhOiBwY2lfZW5hYmxlX2RldmljZSBmYWlsZWQuXG4iKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlwY2lfc2V0X21hc3RlcihkZXYpOwotCXBuZGV2LT5kZXYgPSBkZXY7Ci0KLQljc3JfYmFzZSA9IHBjaV9yZXNvdXJjZV9zdGFydChkZXYsIDApOwotCWlmICghY3NyX2Jhc2UpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJTcGVjdHJhOiBwY2lfcmVzb3VyY2Vfc3RhcnQgZmFpbGVkIVxuIik7Ci0JCXJldCA9IC1FTk9ERVY7Ci0JCWdvdG8gZmFpbGVkX3JlcV9jc3I7Ci0JfQotCi0JY3NyX2xlbiA9IHBjaV9yZXNvdXJjZV9sZW4oZGV2LCAwKTsKLQlpZiAoIWNzcl9sZW4pIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJTcGVjdHJhOiBwY2lfcmVzb3VyY2VfbGVuIGZhaWxlZCFcbiIpOwotCQlyZXQgPSAtRU5PREVWOwotCQlnb3RvIGZhaWxlZF9yZXFfY3NyOwotCX0KLQotCXJldCA9IHBjaV9yZXF1ZXN0X3JlZ2lvbnMoZGV2LCBTUEVDVFJBX05BTkRfTkFNRSk7Ci0JaWYgKHJldCkgewotCQlwcmludGsoS0VSTl9FUlIgIlNwZWN0cmE6IFVuYWJsZSB0byByZXF1ZXN0ICIKLQkJICAgICAgICJtZW1vcnkgcmVnaW9uXG4iKTsKLQkJZ290byBmYWlsZWRfcmVxX2NzcjsKLQl9Ci0KLQlwbmRldi0+aW9hZGRyID0gaW9yZW1hcF9ub2NhY2hlKGNzcl9iYXNlLCBjc3JfbGVuKTsKLQlpZiAoIXBuZGV2LT5pb2FkZHIpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJTcGVjdHJhOiBVbmFibGUgdG8gcmVtYXAgbWVtb3J5IHJlZ2lvblxuIik7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gZmFpbGVkX3JlbWFwX2NzcjsKLQl9Ci0JbmFuZF9kYmdfcHJpbnQoTkFORF9EQkdfREVCVUcsICJTcGVjdHJhOiBDU1IgMHglMDhseCAtPiAweCVwICgweCVseClcbiIsCi0JCSAgICAgICBjc3JfYmFzZSwgcG5kZXYtPmlvYWRkciwgY3NyX2xlbik7Ci0KLQlpbml0X2NvbXBsZXRpb24oJnBuZGV2LT5jb21wbGV0ZSk7Ci0JbmFuZF9kYmdfcHJpbnQoTkFORF9EQkdfREVCVUcsICJTcGVjdHJhOiBJUlEgJWRcbiIsIGRldi0+aXJxKTsKLQotI2lmIENNRF9ETUEKLQlpZiAocmVxdWVzdF9pcnEoZGV2LT5pcnEsIGNkbWFfaXNyLCBJUlFGX1NIQVJFRCwKLQkJCVNQRUNUUkFfTkFORF9OQU1FLCAmaW5mbykpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJTcGVjdHJhOiBVbmFibGUgdG8gYWxsb2NhdGUgSVJRXG4iKTsKLQkJcmV0ID0gLUVOT0RFVjsKLQkJaW91bm1hcChwbmRldi0+aW9hZGRyKTsKLQkJZ290byBmYWlsZWRfcmVtYXBfY3NyOwotCX0KLSNlbHNlCi0JaWYgKHJlcXVlc3RfaXJxKGRldi0+aXJxLCBkZG1hX2lzciwgSVJRRl9TSEFSRUQsCi0JCQlTUEVDVFJBX05BTkRfTkFNRSwgJmluZm8pKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiU3BlY3RyYTogVW5hYmxlIHRvIGFsbG9jYXRlIElSUVxuIik7Ci0JCXJldCA9IC1FTk9ERVY7Ci0JCWlvdW5tYXAocG5kZXYtPmlvYWRkcik7Ci0JCWdvdG8gZmFpbGVkX3JlbWFwX2NzcjsKLQl9Ci0jZW5kaWYKLQotCXBjaV9zZXRfZHJ2ZGF0YShkZXYsIHBuZGV2KTsKLQotCXJldHVybiAwOwotCi1mYWlsZWRfcmVtYXBfY3NyOgotCXBjaV9yZWxlYXNlX3JlZ2lvbnMoZGV2KTsKLWZhaWxlZF9yZXFfY3NyOgotCXBjaV9kaXNhYmxlX2RldmljZShkZXYpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHZvaWQgbmFuZF9wY2lfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpkZXYpCi17Ci0Jc3RydWN0IG1yc3RfbmFuZF9pbmZvICpwbmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShkZXYpOwotCi0JbmFuZF9kYmdfcHJpbnQoTkFORF9EQkdfV0FSTiwgIiVzLCBMaW5lICVkLCBGdW5jdGlvbjogJXNcbiIsCi0JCSAgICAgICBfX0ZJTEVfXywgX19MSU5FX18sIF9fZnVuY19fKTsKLQotI2lmIENNRF9ETUEKLQlmcmVlX2lycShkZXYtPmlycSwgcG5kZXYpOwotI2VuZGlmCi0JaW91bm1hcChwbmRldi0+aW9hZGRyKTsKLQlwY2lfcmVsZWFzZV9yZWdpb25zKGRldik7Ci0JcGNpX2Rpc2FibGVfZGV2aWNlKGRldik7Ci19Ci0KLU1PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBuYW5kX3BjaV9pZHMpOwotCi1zdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgbmFuZF9wY2lfZHJpdmVyID0gewotCS5uYW1lID0gU1BFQ1RSQV9OQU5EX05BTUUsCi0JLmlkX3RhYmxlID0gbmFuZF9wY2lfaWRzLAotCS5wcm9iZSA9IG5hbmRfcGNpX3Byb2JlLAotCS5yZW1vdmUgPSBuYW5kX3BjaV9yZW1vdmUsCi19OwotCi1pbnQgTkFORF9GbGFzaF9Jbml0KHZvaWQpCi17Ci0JaW50IHJldHZhbDsKIAl1MzIgaW50X21hc2s7CiAKLQluYW5kX2RiZ19wcmludChOQU5EX0RCR19UUkFDRSwgIiVzLCBMaW5lICVkLCBGdW5jdGlvbjogJXNcbiIsCisJbmFuZF9kYmdfcHJpbnQoTkFORF9EQkdfV0FSTiwgIiVzLCBMaW5lICVkLCBGdW5jdGlvbjogJXNcbiIsCiAJCSAgICAgICBfX0ZJTEVfXywgX19MSU5FX18sIF9fZnVuY19fKTsKIAogCUZsYXNoUmVnID0gaW9yZW1hcF9ub2NhY2hlKEdMT0JfSFdDVExfUkVHX0JBU0UsCkBAIC0yNTgyLDYgKzI0NzksMTIyIEBACiAJaW93cml0ZTMyKDAsIEZsYXNoUmVnICsgVFdPX1JPV19BRERSX0NZQ0xFUyk7CiAJaW93cml0ZTMyKDEsIEZsYXNoUmVnICsgRUNDX0VOQUJMRSk7CiAJZW5hYmxlX2VjYyA9IDE7CisJcmV0ID0gcGNpX2VuYWJsZV9kZXZpY2UoZGV2KTsKKwlpZiAocmV0KSB7CisJCXByaW50ayhLRVJOX0VSUiAiU3BlY3RyYTogcGNpX2VuYWJsZV9kZXZpY2UgZmFpbGVkLlxuIik7CisJCWdvdG8gZmFpbGVkX3JlcV9jc3I7CisJfQorCisJcGNpX3NldF9tYXN0ZXIoZGV2KTsKKwlwbmRldi0+ZGV2ID0gZGV2OworCisJY3NyX2Jhc2UgPSBwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2LCAwKTsKKwlpZiAoIWNzcl9iYXNlKSB7CisJCXByaW50ayhLRVJOX0VSUiAiU3BlY3RyYTogcGNpX3Jlc291cmNlX3N0YXJ0IGZhaWxlZCFcbiIpOworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIGZhaWxlZF9yZXFfY3NyOworCX0KKworCWNzcl9sZW4gPSBwY2lfcmVzb3VyY2VfbGVuKGRldiwgMCk7CisJaWYgKCFjc3JfbGVuKSB7CisJCXByaW50ayhLRVJOX0VSUiAiU3BlY3RyYTogcGNpX3Jlc291cmNlX2xlbiBmYWlsZWQhXG4iKTsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBmYWlsZWRfcmVxX2NzcjsKKwl9CisKKwlyZXQgPSBwY2lfcmVxdWVzdF9yZWdpb25zKGRldiwgU1BFQ1RSQV9OQU5EX05BTUUpOworCWlmIChyZXQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJTcGVjdHJhOiBVbmFibGUgdG8gcmVxdWVzdCAiCisJCSAgICAgICAibWVtb3J5IHJlZ2lvblxuIik7CisJCWdvdG8gZmFpbGVkX3JlcV9jc3I7CisJfQorCisJcG5kZXYtPmlvYWRkciA9IGlvcmVtYXBfbm9jYWNoZShjc3JfYmFzZSwgY3NyX2xlbik7CisJaWYgKCFwbmRldi0+aW9hZGRyKSB7CisJCXByaW50ayhLRVJOX0VSUiAiU3BlY3RyYTogVW5hYmxlIHRvIHJlbWFwIG1lbW9yeSByZWdpb25cbiIpOworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGZhaWxlZF9yZW1hcF9jc3I7CisJfQorCW5hbmRfZGJnX3ByaW50KE5BTkRfREJHX0RFQlVHLCAiU3BlY3RyYTogQ1NSIDB4JTA4bHggLT4gMHglcCAoMHglbHgpXG4iLAorCQkgICAgICAgY3NyX2Jhc2UsIHBuZGV2LT5pb2FkZHIsIGNzcl9sZW4pOworCisJaW5pdF9jb21wbGV0aW9uKCZwbmRldi0+Y29tcGxldGUpOworCW5hbmRfZGJnX3ByaW50KE5BTkRfREJHX0RFQlVHLCAiU3BlY3RyYTogSVJRICVkXG4iLCBkZXYtPmlycSk7CisKKyNpZiBDTURfRE1BCisJaWYgKHJlcXVlc3RfaXJxKGRldi0+aXJxLCBjZG1hX2lzciwgSVJRRl9TSEFSRUQsCisJCQlTUEVDVFJBX05BTkRfTkFNRSwgJmluZm8pKSB7CisJCXByaW50ayhLRVJOX0VSUiAiU3BlY3RyYTogVW5hYmxlIHRvIGFsbG9jYXRlIElSUVxuIik7CisJCXJldCA9IC1FTk9ERVY7CisJCWlvdW5tYXAocG5kZXYtPmlvYWRkcik7CisJCWdvdG8gZmFpbGVkX3JlbWFwX2NzcjsKKwl9CisjZWxzZQorCWlmIChyZXF1ZXN0X2lycShkZXYtPmlycSwgZGRtYV9pc3IsIElSUUZfU0hBUkVELAorCQkJU1BFQ1RSQV9OQU5EX05BTUUsICZpbmZvKSkgeworCQlwcmludGsoS0VSTl9FUlIgIlNwZWN0cmE6IFVuYWJsZSB0byBhbGxvY2F0ZSBJUlFcbiIpOworCQlyZXQgPSAtRU5PREVWOworCQlpb3VubWFwKHBuZGV2LT5pb2FkZHIpOworCQlnb3RvIGZhaWxlZF9yZW1hcF9jc3I7CisJfQorI2VuZGlmCisKKwlwY2lfc2V0X2RydmRhdGEoZGV2LCBwbmRldik7CisKKwlyZXQgPSBHTE9CX0xMRF9SZWFkX0RldmljZV9JRCgpOworCWlmIChyZXQpIHsKKwkJaW91bm1hcChwbmRldi0+aW9hZGRyKTsKKwkJZ290byBmYWlsZWRfcmVtYXBfY3NyOworCX0KKworCXJldCA9IHJlZ2lzdGVyX3NwZWN0cmFfZnRsKCk7CisJaWYgKHJldCkgeworCQlpb3VubWFwKHBuZGV2LT5pb2FkZHIpOworCQlnb3RvIGZhaWxlZF9yZW1hcF9jc3I7CisJfQorCisJcmV0dXJuIDA7CisKK2ZhaWxlZF9yZW1hcF9jc3I6CisJcGNpX3JlbGVhc2VfcmVnaW9ucyhkZXYpOworZmFpbGVkX3JlcV9jc3I6CisJcGNpX2Rpc2FibGVfZGV2aWNlKGRldik7CisJaW91bm1hcChGbGFzaE1lbSk7CisJaW91bm1hcChGbGFzaFJlZyk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBuYW5kX3BjaV9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwlzdHJ1Y3QgbXJzdF9uYW5kX2luZm8gKnBuZGV2ID0gcGNpX2dldF9kcnZkYXRhKGRldik7CisKKwluYW5kX2RiZ19wcmludChOQU5EX0RCR19XQVJOLCAiJXMsIExpbmUgJWQsIEZ1bmN0aW9uOiAlc1xuIiwKKwkJICAgICAgIF9fRklMRV9fLCBfX0xJTkVfXywgX19mdW5jX18pOworCisjaWYgQ01EX0RNQQorCWZyZWVfaXJxKGRldi0+aXJxLCBwbmRldik7CisjZW5kaWYKKwlpb3VubWFwKHBuZGV2LT5pb2FkZHIpOworCXBjaV9yZWxlYXNlX3JlZ2lvbnMoZGV2KTsKKwlwY2lfZGlzYWJsZV9kZXZpY2UoZGV2KTsKK30KKworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIG5hbmRfcGNpX2lkcyk7CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBuYW5kX3BjaV9kcml2ZXIgPSB7CisJLm5hbWUgPSBTUEVDVFJBX05BTkRfTkFNRSwKKwkuaWRfdGFibGUgPSBuYW5kX3BjaV9pZHMsCisJLnByb2JlID0gbmFuZF9wY2lfcHJvYmUsCisJLnJlbW92ZSA9IG5hbmRfcGNpX3JlbW92ZSwKK307CisKK2ludCBOQU5EX0ZsYXNoX0luaXQodm9pZCkKK3sKKwlpbnQgcmV0dmFsOworCisJbmFuZF9kYmdfcHJpbnQoTkFORF9EQkdfVFJBQ0UsICIlcywgTGluZSAlZCwgRnVuY3Rpb246ICVzXG4iLAorCQkgICAgICAgX19GSUxFX18sIF9fTElORV9fLCBfX2Z1bmNfXyk7CiAKIAlyZXR2YWwgPSBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZuYW5kX3BjaV9kcml2ZXIpOwogCWlmIChyZXR2YWwpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc3RlX3JtaTQvS2NvbmZpZyBiL2RyaXZlcnMvc3RhZ2luZy9zdGVfcm1pNC9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4Njc5NTAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvc3RlX3JtaTQvS2NvbmZpZwpAQCAtMCwwICsxLDkgQEAKK2NvbmZpZyBUT1VDSFNDUkVFTl9TWU5BUFRJQ1NfSTJDX1JNSTQKKwl0cmlzdGF0ZSAiU3luYXB0aWNzIGkyYyBybWk0IHRvdWNoc2NyZWVuIgorCWRlcGVuZHMgb24gSTJDICYmIElOUFVUCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3UgaGF2ZSBhIFN5bmFwdGljcyBSTUk0IGFuZAorCSAgd2FudCB0byBlbmFibGUgc3VwcG9ydCBmb3IgdGhlIGJ1aWx0LWluIHRvdWNoc2NyZWVuLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBzeW5hcHRpY3Nfcm1pNF90cy4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zdGVfcm1pNC9NYWtlZmlsZSBiL2RyaXZlcnMvc3RhZ2luZy9zdGVfcm1pNC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Y2NlMmVkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3N0ZV9ybWk0L01ha2VmaWxlCkBAIC0wLDAgKzEsNCBAQAorIworIyBNYWtlZmlsZSBmb3IgdGhlIFJNSTQgdG91Y2hzY3JlZW4gZHJpdmVyLgorIworb2JqLSQoQ09ORklHX1RPVUNIU0NSRUVOX1NZTkFQVElDU19JMkNfUk1JNCkgKz0gc3luYXB0aWNzX2kyY19ybWk0Lm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zdGVfcm1pNC9UT0RPIGIvZHJpdmVycy9zdGFnaW5nL3N0ZV9ybWk0L1RPRE8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWJlMjQzNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zdGVfcm1pNC9UT0RPCkBAIC0wLDAgKzEsNyBAQAorVE9ETworLS0tLQorCitXYWl0IGZvciB0aGUgb2ZmaWNpYWwgdXBzdHJlYW0gc3luYXB0aWNzIHJtaTQgY2xlYXJwYWQgZHJpdmVycyBhcyBwcm9taXNlZCBvdmVyIHRoZSBwYXN0IGZldyBtb250aHMKK01lcmdlIGFueSBkZXZpY2Ugc3VwcG9ydCBuZWVkZWQgZnJvbSB0aGlzIGRyaXZlciBpbnRvIGl0CitEZWxldGUgdGhpcyBkcml2ZXIKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3N0ZV9ybWk0L3N5bmFwdGljc19pMmNfcm1pNC5jIGIvZHJpdmVycy9zdGFnaW5nL3N0ZV9ybWk0L3N5bmFwdGljc19pMmNfcm1pNC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4ZjA0N2UKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvc3RlX3JtaTQvc3luYXB0aWNzX2kyY19ybWk0LmMKQEAgLTAsMCArMSwxMTc5IEBACisvKioKKyAqCisgKiBTeW5hcHRpY3MgUmVnaXN0ZXIgTWFwcGVkIEludGVyZmFjZSAoUk1JNCkgSTJDIFBoeXNpY2FsIExheWVyIERyaXZlci4KKyAqIENvcHlyaWdodCAoYykgMjAwNy0yMDEwLCBTeW5hcHRpY3MgSW5jb3Jwb3JhdGVkCisgKgorICogQXV0aG9yOiBKcyBIQSA8anMuaGFAc3Rlcmljc3Nvbi5jb20+IGZvciBTVC1Fcmljc3NvbgorICogQXV0aG9yOiBOYXZlZW4gS3VtYXIgRyA8bmF2ZWVuLmdhZGRpcGF0aUBzdGVyaWNzc29uLmNvbT4gZm9yIFNULUVyaWNzc29uCisgKiBDb3B5cmlnaHQgMjAxMCAoYykgU1QtRXJpY3Nzb24gQUIKKyAqLworLyoKKyAqIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgR1BMMiBsaWNlbnNlLgorICoKKyAqIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAqIEdQTAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQKKyAqIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKKyAqIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9jb25zdW1lci5oPgorI2luY2x1ZGUgInN5bmFwdGljc19pMmNfcm1pNC5oIgorCisvKiBUT0RPOiBmb3IgbXVsdGlwbGUgZGV2aWNlIHN1cHBvcnQgd2lsbCBuZWVkIGEgcGVyLWRldmljZSBtdXRleCAqLworI2RlZmluZSBEUklWRVJfTkFNRSAic3luYXB0aWNzX3JtaTRfaTJjIgorCisjZGVmaW5lIE1BWF9FUlJPUl9SRVBPUlQJNgorI2RlZmluZSBNQVhfVE9VQ0hfTUFKT1IJCTE1CisjZGVmaW5lIE1BWF9SRVRSWV9DT1VOVAkJNQorI2RlZmluZSBTVERfUVVFUllfTEVOCQkyMQorI2RlZmluZSBQQUdFX0xFTgkJMgorI2RlZmluZSBEQVRBX0JVRl9MRU4JCTMyCisjZGVmaW5lIEJVRl9MRU4JCQkzNworI2RlZmluZSBRVUVSWV9MRU4JCTkKKyNkZWZpbmUgREFUQV9MRU4JCTEyCisjZGVmaW5lIEhBU19UQVAJCQkweDAxCisjZGVmaW5lIEhBU19QQUxNREVURUNUCQkweDAxCisjZGVmaW5lIEhBU19ST1RBVEUJCTB4MDIKKyNkZWZpbmUgSEFTX1RBUEFOREhPTEQJCTB4MDIKKyNkZWZpbmUgSEFTX0RPVUJMRVRBUAkJMHgwNAorI2RlZmluZSBIQVNfRUFSTFlUQVAJCTB4MDgKKyNkZWZpbmUgSEFTX1JFTEVBU0UJCTB4MDgKKyNkZWZpbmUgSEFTX0ZMSUNLCQkweDEwCisjZGVmaW5lIEhBU19QUkVTUwkJMHgyMAorI2RlZmluZSBIQVNfUElOQ0gJCTB4NDAKKworI2RlZmluZSBNQVNLXzE2QklUCQkweEZGRkYKKyNkZWZpbmUgTUFTS184QklUCQkweEZGCisjZGVmaW5lIE1BU0tfN0JJVAkJMHg3RgorI2RlZmluZSBNQVNLXzVCSVQJCTB4MUYKKyNkZWZpbmUgTUFTS180QklUCQkweDBGCisjZGVmaW5lIE1BU0tfM0JJVAkJMHgwNworI2RlZmluZSBNQVNLXzJCSVQJCTB4MDMKKyNkZWZpbmUgVE9VQ0hQQURfQ1RSTF9JTlRSCTB4OAorI2RlZmluZSBQRFRfU1RBUlRfU0NBTl9MT0NBVElPTiAoMHgwMEU5KQorI2RlZmluZSBQRFRfRU5EX1NDQU5fTE9DQVRJT04JKDB4MDAwQSkKKyNkZWZpbmUgUERUX0VOVFJZX1NJWkUJCSgweDAwMDYpCisjZGVmaW5lIFJNSTRfTlVNQkVSX09GX01BWF9GSU5HRVJTCQkoOCkKKyNkZWZpbmUgU1lOQVBUSUNTX1JNSTRfVE9VQ0hQQURfRlVOQ19OVU0JKDB4MTEpCisjZGVmaW5lIFNZTkFQVElDU19STUk0X0RFVklDRV9DT05UUk9MX0ZVTkNfTlVNCSgweDAxKQorCisvKioKKyAqIHN0cnVjdCBzeW5hcHRpY3Nfcm1pNF9mbl9kZXNjIC0gY29udGFpbnMgdGhlIGZ1bnRpb24gZGVzY3JpcHRvciBpbmZvcm1hdGlvbgorICogQHF1ZXJ5X2Jhc2VfYWRkcjogYmFzZSBhZGRyZXNzIGZvciBxdWVyeQorICogQGNtZF9iYXNlX2FkZHI6IGJhc2UgYWRkcmVzcyBmb3IgY29tbWFuZAorICogQGN0cmxfYmFzZV9hZGRyOiBiYXNlIGFkZHJlc3MgZm9yIGNvbnRyb2wKKyAqIEBkYXRhX2Jhc2VfYWRkcjogYmFzZSBhZGRyZXNzIGZvciBkYXRhCisgKiBAaW50cl9zcmNfY291bnQ6IGNvdW50IGZvciB0aGUgaW50ZXJydXB0IHNvdXJjZQorICogQGZuX251bWJlcjogZnVuY3Rpb24gbnVtYmVyCisgKgorICogVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBnaXZlcyB0aGUgZnVuY3Rpb24gZGVzY3JpcHRvciBpbmZvcm1hdGlvbgorICogb2YgdGhlIHBhcnRpY3VsYXIgZnVuY3Rpb25hbGl0eS4KKyAqLworc3RydWN0IHN5bmFwdGljc19ybWk0X2ZuX2Rlc2MgeworCXVuc2lnbmVkIGNoYXIJcXVlcnlfYmFzZV9hZGRyOworCXVuc2lnbmVkIGNoYXIJY21kX2Jhc2VfYWRkcjsKKwl1bnNpZ25lZCBjaGFyCWN0cmxfYmFzZV9hZGRyOworCXVuc2lnbmVkIGNoYXIJZGF0YV9iYXNlX2FkZHI7CisJdW5zaWduZWQgY2hhcglpbnRyX3NyY19jb3VudDsKKwl1bnNpZ25lZCBjaGFyCWZuX251bWJlcjsKK307CisKKy8qKgorICogc3RydWN0IHN5bmFwdGljc19ybWk0X2ZuIC0gY29udGFpbnMgdGhlIGZ1bnRpb24gaW5mb3JtYXRpb24KKyAqIEBmbl9udW1iZXI6IGZ1bmN0aW9uIG51bWJlcgorICogQG51bV9vZl9kYXRhX3NvdXJjZXM6IG51bWJlciBvZiBkYXRhIHNvdXJjZXMKKyAqIEBudW1fb2ZfZGF0YV9wb2ludHM6IG51bWJlciBvZiBmaW5nZXJzIHRvdWNoZWQKKyAqIEBzaXplX29mX2RhdGFfcmVnaXN0ZXJfYmxvY2s6IGRhdGEgcmVnaXN0ZXIgYmxvY2sgc2l6ZQorICogQGluZGV4X3RvX2ludHJfcmVnOiBpbmRleCBmb3IgaW50ZXJydXB0IHJlZ2lzdGVyCisgKiBAaW50cl9tYXNrOiBpbnRlcnJ1cHQgbWFzayB2YWx1ZQorICogQGZuX2Rlc2M6IHZhcmlhYmxlIGZvciBmdW5jdGlvbiBkZXNjcmlwdG9yIHN0cnVjdHVyZQorICogQGxpbms6IGxpbmtlZCBsaXN0IGZvciBmdW5jdGlvbiBkZXNjcmlwdG9ycworICoKKyAqIFRoaXMgc3RydWN0dXJlIGdpdmVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBudW1iZXIgb2YgZGF0YSBzb3VyY2VzIGFuZAorICogdGhlIG51bWJlciBvZiBkYXRhIHJlZ2lzdGVycyBhc3NvY2lhdGVkIHdpdGggdGhlIGZ1bmN0aW9uLgorICovCitzdHJ1Y3Qgc3luYXB0aWNzX3JtaTRfZm4geworCXVuc2lnbmVkIGNoYXIJCWZuX251bWJlcjsKKwl1bnNpZ25lZCBjaGFyCQludW1fb2ZfZGF0YV9zb3VyY2VzOworCXVuc2lnbmVkIGNoYXIJCW51bV9vZl9kYXRhX3BvaW50czsKKwl1bnNpZ25lZCBjaGFyCQlzaXplX29mX2RhdGFfcmVnaXN0ZXJfYmxvY2s7CisJdW5zaWduZWQgY2hhcgkJaW5kZXhfdG9faW50cl9yZWc7CisJdW5zaWduZWQgY2hhcgkJaW50cl9tYXNrOworCXN0cnVjdCBzeW5hcHRpY3Nfcm1pNF9mbl9kZXNjCWZuX2Rlc2M7CisJc3RydWN0IGxpc3RfaGVhZAlsaW5rOworfTsKKworLyoqCisgKiBzdHJ1Y3Qgc3luYXB0aWNzX3JtaTRfZGV2aWNlX2luZm8gLSBjb250YWlucyB0aGUgcm1pNCBkZXZpY2UgaW5mb3JtYXRpb24KKyAqIEB2ZXJzaW9uX21ham9yOiBwcm90b2NvbCBtYWpvciB2ZXJzaW9uIG51bWJlcgorICogQHZlcnNpb25fbWlub3I6IHByb3RvY29sIG1pbm9yIHZlcnNpb24gbnVtYmVyCisgKiBAbWFudWZhY3R1cmVyX2lkOiBtYW51ZmFjdHVyZXIgaWRlbnRpZmljYXRpb24gYnl0ZQorICogQHByb2R1Y3RfcHJvcHM6IHByb2R1Y3QgcHJvcGVydGllcyBpbmZvcm1hdGlvbgorICogQHByb2R1Y3RfaW5mbzogcHJvZHVjdCBpbmZvIGFycmF5CisgKiBAZGF0ZV9jb2RlOiBkZXZpY2UgbWFudWZhY3R1cmUgZGF0ZQorICogQHRlc3Rlcl9pZDogdGVzdGVyIGlkIGFycmF5CisgKiBAc2VyaWFsX251bWJlcjogc2VyaWFsIG51bWJlciBmb3IgdGhhdCBkZXZpY2UKKyAqIEBwcm9kdWN0X2lkX3N0cmluZzogcHJvZHVjdCBpZCBmb3IgdGhlIGRldmljZQorICogQHN1cHBvcnRfZm5fbGlzdDogbGlua2VkIGxpc3QgZm9yIGRldmljZSBpbmZvcm1hdGlvbgorICoKKyAqIFRoaXMgc3RydWN0dXJlIGdpdmVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBudW1iZXIgb2YgZGF0YSBzb3VyY2VzIGFuZAorICogdGhlIG51bWJlciBvZiBkYXRhIHJlZ2lzdGVycyBhc3NvY2lhdGVkIHdpdGggdGhlIGZ1bmN0aW9uLgorICovCitzdHJ1Y3Qgc3luYXB0aWNzX3JtaTRfZGV2aWNlX2luZm8geworCXVuc2lnbmVkIGludAkJdmVyc2lvbl9tYWpvcjsKKwl1bnNpZ25lZCBpbnQJCXZlcnNpb25fbWlub3I7CisJdW5zaWduZWQgY2hhcgkJbWFudWZhY3R1cmVyX2lkOworCXVuc2lnbmVkIGNoYXIJCXByb2R1Y3RfcHJvcHM7CisJdW5zaWduZWQgY2hhcgkJcHJvZHVjdF9pbmZvWzJdOworCXVuc2lnbmVkIGNoYXIJCWRhdGVfY29kZVszXTsKKwl1bnNpZ25lZCBzaG9ydAkJdGVzdGVyX2lkOworCXVuc2lnbmVkIHNob3J0CQlzZXJpYWxfbnVtYmVyOworCXVuc2lnbmVkIGNoYXIJCXByb2R1Y3RfaWRfc3RyaW5nWzExXTsKKwlzdHJ1Y3QgbGlzdF9oZWFkCXN1cHBvcnRfZm5fbGlzdDsKK307CisKKy8qKgorICogc3RydWN0IHN5bmFwdGljc19ybWk0X2RhdGEgLSBjb250YWlucyB0aGUgcm1pNCBkZXZpY2UgZGF0YQorICogQHJtaTRfbW9kX2luZm86IHN0cnVjdHVyZSB2YXJpYWJsZSBmb3Igcm1pNCBkZXZpY2UgaW5mbworICogQGlucHV0X2RldjogcG9pbnRlciBmb3IgaW5wdXQgZGV2aWNlCisgKiBAaTJjX2NsaWVudDogcG9pbnRlciBmb3IgaTJjIGNsaWVudAorICogQGJvYXJkOiBjb25zdGFudCBwb2ludGVyIGZvciB0b3VjaCBwbGF0Zm9ybSBkYXRhCisgKiBAZm5fbGlzdF9tdXRleDogbXV0ZXggZm9yIGZ1bnRpb24gbGlzdAorICogQHJtaTRfcGFnZV9tdXRleDogbXV0ZXggZm9yIHJtaTQgcGFnZQorICogQGN1cnJlbnRfcGFnZTogdmFyaWFibGUgZm9yIGludGVnZXIKKyAqIEBudW1iZXJfb2ZfaW50ZXJydXB0X3JlZ2lzdGVyOiBpbnRlcnJ1cHQgcmVnaXN0ZXJzIGNvdW50CisgKiBAZm4wMV9jdHJsX2Jhc2VfYWRkcjogY29udHJvbCBiYXNlIGFkZHJlc3MgZm9yIGZuMDEKKyAqIEBmbjAxX3F1ZXJ5X2Jhc2VfYWRkcjogcXVlcnkgYmFzZSBhZGRyZXNzIGZvciBmbjAxCisgKiBAZm4wMV9kYXRhX2Jhc2VfYWRkcjogZGF0YSBiYXNlIGFkZHJlc3MgZm9yIGZuMDEKKyAqIEBzZW5zb3JfbWF4X3g6IHNlbnNvciBtYXhpbXVtIHggdmFsdWUKKyAqIEBzZW5zb3JfbWF4X3k6IHNlbnNvciBtYXhpbXVtIHkgdmFsdWUKKyAqIEByZWd1bGF0b3I6IHBvaW50ZXIgdG8gdGhlIHJlZ3VsYXRvciBzdHJ1Y3R1cmUKKyAqIEB3YWl0OiB3YWl0IHF1ZXVlIHN0cnVjdHVyZSB2YXJpYWJsZQorICogQHRvdWNoX3N0b3BwZWQ6IGZsYWcgdG8gc3RvcCB0aGUgdGhyZWFkIGZ1bmN0aW9uCisgKgorICogVGhpcyBzdHJ1Y3R1cmUgZ2l2ZXMgdGhlIGRldmljZSBkYXRhIGluZm9ybWF0aW9uLgorICovCitzdHJ1Y3Qgc3luYXB0aWNzX3JtaTRfZGF0YSB7CisJc3RydWN0IHN5bmFwdGljc19ybWk0X2RldmljZV9pbmZvIHJtaTRfbW9kX2luZm87CisJc3RydWN0IGlucHV0X2RldgkqaW5wdXRfZGV2OworCXN0cnVjdCBpMmNfY2xpZW50CSppMmNfY2xpZW50OworCWNvbnN0IHN0cnVjdCBzeW5hcHRpY3Nfcm1pNF9wbGF0Zm9ybV9kYXRhICpib2FyZDsKKwlzdHJ1Y3QgbXV0ZXgJCWZuX2xpc3RfbXV0ZXg7CisJc3RydWN0IG11dGV4CQlybWk0X3BhZ2VfbXV0ZXg7CisJaW50CQkJY3VycmVudF9wYWdlOworCXVuc2lnbmVkIGludAkJbnVtYmVyX29mX2ludGVycnVwdF9yZWdpc3RlcjsKKwl1bnNpZ25lZCBzaG9ydAkJZm4wMV9jdHJsX2Jhc2VfYWRkcjsKKwl1bnNpZ25lZCBzaG9ydAkJZm4wMV9xdWVyeV9iYXNlX2FkZHI7CisJdW5zaWduZWQgc2hvcnQJCWZuMDFfZGF0YV9iYXNlX2FkZHI7CisJaW50CQkJc2Vuc29yX21heF94OworCWludAkJCXNlbnNvcl9tYXhfeTsKKwlzdHJ1Y3QgcmVndWxhdG9yCSpyZWd1bGF0b3I7CisJd2FpdF9xdWV1ZV9oZWFkX3QJd2FpdDsKKwlib29sCQkJdG91Y2hfc3RvcHBlZDsKK307CisKKy8qKgorICogc3luYXB0aWNzX3JtaTRfc2V0X3BhZ2UoKSAtIHNldHMgdGhlIHBhZ2UKKyAqIEBwZGF0YTogcG9pbnRlciB0byBzeW5hcHRpY3Nfcm1pNF9kYXRhIHN0cnVjdHVyZQorICogQGFkZHJlc3M6IHNldCB0aGUgYWRkcmVzcyBvZiB0aGUgcGFnZQorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBzZXQgdGhlIHBhZ2UgYW5kIHJldHVybnMgaW50ZWdlci4KKyAqLworc3RhdGljIGludCBzeW5hcHRpY3Nfcm1pNF9zZXRfcGFnZShzdHJ1Y3Qgc3luYXB0aWNzX3JtaTRfZGF0YSAqcGRhdGEsCisJCQkJCXVuc2lnbmVkIGludCBhZGRyZXNzKQoreworCXVuc2lnbmVkIGNoYXIJdHhidWZbUEFHRV9MRU5dOworCWludAkJcmV0dmFsOworCXVuc2lnbmVkIGludAlwYWdlOworCXN0cnVjdCBpMmNfY2xpZW50ICppMmMgPSBwZGF0YS0+aTJjX2NsaWVudDsKKworCXBhZ2UJPSAoKGFkZHJlc3MgPj4gOCkgJiBNQVNLXzhCSVQpOworCWlmIChwYWdlICE9IHBkYXRhLT5jdXJyZW50X3BhZ2UpIHsKKwkJdHhidWZbMF0JPSBNQVNLXzhCSVQ7CisJCXR4YnVmWzFdCT0gcGFnZTsKKwkJcmV0dmFsCT0gaTJjX21hc3Rlcl9zZW5kKGkyYywgdHhidWYsIFBBR0VfTEVOKTsKKwkJaWYgKHJldHZhbCAhPSBQQUdFX0xFTikKKwkJCWRldl9lcnIoJmkyYy0+ZGV2LCAiJXM6ZmFpbGVkOiVkXG4iLCBfX2Z1bmNfXywgcmV0dmFsKTsKKwkJZWxzZQorCQkJcGRhdGEtPmN1cnJlbnRfcGFnZSA9IHBhZ2U7CisJfSBlbHNlCisJCXJldHZhbCA9IFBBR0VfTEVOOworCXJldHVybiByZXR2YWw7Cit9CisvKioKKyAqIHN5bmFwdGljc19ybWk0X2kyY19ibG9ja19yZWFkKCkgLSByZWFkIHRoZSBibG9jayBvZiBkYXRhCisgKiBAcGRhdGE6IHBvaW50ZXIgdG8gc3luYXB0aWNzX3JtaTRfZGF0YSBzdHJ1Y3R1cmUKKyAqIEBhZGRyZXNzOiByZWFkIHRoZSBibG9jayBvZiBkYXRhIGZyb20gdGhpcyBvZmZzZXQKKyAqIEB2YWxwOiBwb2ludGVyIHRvIGEgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIGRhdGEgdG8gYmUgcmVhZAorICogQHNpemU6IG51bWJlciBvZiBieXRlcyB0byByZWFkCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyB0byByZWFkIHRoZSBibG9jayBvZiBkYXRhIGFuZCByZXR1cm5zIGludGVnZXIuCisgKi8KK3N0YXRpYyBpbnQgc3luYXB0aWNzX3JtaTRfaTJjX2Jsb2NrX3JlYWQoc3RydWN0IHN5bmFwdGljc19ybWk0X2RhdGEgKnBkYXRhLAorCQkJCQkJdW5zaWduZWQgc2hvcnQgYWRkcmVzcywKKwkJCQkJCXVuc2lnbmVkIGNoYXIgKnZhbHAsIGludCBzaXplKQoreworCWludCByZXR2YWwgPSAwOworCWludCByZXRyeV9jb3VudCA9IDA7CisJaW50IGluZGV4OworCXN0cnVjdCBpMmNfY2xpZW50ICppMmMgPSBwZGF0YS0+aTJjX2NsaWVudDsKKworCW11dGV4X2xvY2soJihwZGF0YS0+cm1pNF9wYWdlX211dGV4KSk7CisJcmV0dmFsID0gc3luYXB0aWNzX3JtaTRfc2V0X3BhZ2UocGRhdGEsIGFkZHJlc3MpOworCWlmIChyZXR2YWwgIT0gUEFHRV9MRU4pCisJCWdvdG8gZXhpdDsKKwlpbmRleCA9IGFkZHJlc3MgJiBNQVNLXzhCSVQ7CityZXRyeToKKwlyZXR2YWwgPSBpMmNfc21idXNfcmVhZF9pMmNfYmxvY2tfZGF0YShpMmMsIGluZGV4LCBzaXplLCB2YWxwKTsKKwlpZiAocmV0dmFsICE9IHNpemUpIHsKKwkJaWYgKCsrcmV0cnlfY291bnQgPT0gTUFYX1JFVFJZX0NPVU5UKQorCQkJZGV2X2VycigmaTJjLT5kZXYsCisJCQkJIiVzOmFkZHJlc3MgMHglMDR4IHNpemUgJWQgZmFpbGVkOiVkXG4iLAorCQkJCQlfX2Z1bmNfXywgYWRkcmVzcywgc2l6ZSwgcmV0dmFsKTsKKwkJZWxzZSB7CisJCQlzeW5hcHRpY3Nfcm1pNF9zZXRfcGFnZShwZGF0YSwgYWRkcmVzcyk7CisJCQlnb3RvIHJldHJ5OworCQl9CisJfQorZXhpdDoKKwltdXRleF91bmxvY2soJihwZGF0YS0+cm1pNF9wYWdlX211dGV4KSk7CisJcmV0dXJuIHJldHZhbDsKK30KKworLyoqCisgKiBzeW5hcHRpY3Nfcm1pNF9pMmNfYnl0ZV93cml0ZSgpIC0gd3JpdGUgdGhlIHNpbmdsZSBieXRlIGRhdGEKKyAqIEBwZGF0YTogcG9pbnRlciB0byBzeW5hcHRpY3Nfcm1pNF9kYXRhIHN0cnVjdHVyZQorICogQGFkZHJlc3M6IHdyaXRlIHRoZSBibG9jayBvZiBkYXRhIGZyb20gdGhpcyBvZmZzZXQKKyAqIEBkYXRhOiBkYXRhIHRvIGJlIHdyaXRlCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyB0byB3cml0ZSB0aGUgc2luZ2xlIGJ5dGUgZGF0YSBhbmQgcmV0dXJucyBpbnRlZ2VyLgorICovCitzdGF0aWMgaW50IHN5bmFwdGljc19ybWk0X2kyY19ieXRlX3dyaXRlKHN0cnVjdCBzeW5hcHRpY3Nfcm1pNF9kYXRhICpwZGF0YSwKKwkJCQkJCXVuc2lnbmVkIHNob3J0IGFkZHJlc3MsCisJCQkJCQl1bnNpZ25lZCBjaGFyIGRhdGEpCit7CisJdW5zaWduZWQgY2hhciB0eGJ1ZlsyXTsKKwlpbnQgcmV0dmFsID0gMDsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqaTJjID0gcGRhdGEtPmkyY19jbGllbnQ7CisKKwkvKiBDYW4ndCBoYXZlIGFueW9uZSBlbHNlIGNoYW5naW5nIHRoZSBwYWdlIGJlaGluZCBvdXIgYmFja3MgKi8KKwltdXRleF9sb2NrKCYocGRhdGEtPnJtaTRfcGFnZV9tdXRleCkpOworCisJcmV0dmFsID0gc3luYXB0aWNzX3JtaTRfc2V0X3BhZ2UocGRhdGEsIGFkZHJlc3MpOworCWlmIChyZXR2YWwgIT0gUEFHRV9MRU4pCisJCWdvdG8gZXhpdDsKKwl0eGJ1ZlswXQk9IGFkZHJlc3MgJiBNQVNLXzhCSVQ7CisJdHhidWZbMV0JPSBkYXRhOworCXJldHZhbAkJPSBpMmNfbWFzdGVyX3NlbmQocGRhdGEtPmkyY19jbGllbnQsIHR4YnVmLCAyKTsKKwkvKiBBZGQgaW4gcmV0cnkgb24gd3JpdGVzIG9ubHkgaW4gY2VydGlhbiBlcnJvciByZXR1cm4gdmFsdWVzICovCisJaWYgKHJldHZhbCAhPSAyKSB7CisJCWRldl9lcnIoJmkyYy0+ZGV2LCAiJXM6ZmFpbGVkOiVkXG4iLCBfX2Z1bmNfXywgcmV0dmFsKTsKKwkJcmV0dmFsID0gLUVJTzsKKwl9IGVsc2UKKwkJcmV0dmFsID0gMTsKK2V4aXQ6CisJbXV0ZXhfdW5sb2NrKCYocGRhdGEtPnJtaTRfcGFnZV9tdXRleCkpOworCXJldHVybiByZXR2YWw7Cit9CisKKy8qKgorICogc3lucGF0aWNzX3JtaTRfdG91Y2hwYWRfcmVwb3J0KCkgLSByZXBvcnRzIGZvciB0aGUgcm1pNCB0b3VjaHBhZCBkZXZpY2UKKyAqIEBwZGF0YTogcG9pbnRlciB0byBzeW5hcHRpY3Nfcm1pNF9kYXRhIHN0cnVjdHVyZQorICogQHJmaTogcG9pbnRlciB0byBzeW5hcHRpY3Nfcm1pNF9mbiBzdHJ1Y3R1cmUKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGNhbGxzIHRvIHJlcG9ydHMgZm9yIHRoZSBybWk0IHRvdWNocGFkIGRldmljZQorICovCitzdGF0aWMgaW50IHN5bnBhdGljc19ybWk0X3RvdWNocGFkX3JlcG9ydChzdHJ1Y3Qgc3luYXB0aWNzX3JtaTRfZGF0YSAqcGRhdGEsCisJCQkJCQlzdHJ1Y3Qgc3luYXB0aWNzX3JtaTRfZm4gKnJmaSkKK3sKKwkvKiBudW1iZXIgb2YgdG91Y2ggcG9pbnRzIC0gZmluZ2VycyBkb3duIGluIHRoaXMgY2FzZSAqLworCWludAl0b3VjaF9jb3VudCA9IDA7CisJaW50CWZpbmdlcjsKKwlpbnQJZmluZ2Vyc19zdXBwb3J0ZWQ7CisJaW50CWZpbmdlcl9yZWdpc3RlcnM7CisJaW50CXJlZzsKKwlpbnQJZmluZ2VyX3NoaWZ0OworCWludAlmaW5nZXJfc3RhdHVzOworCWludAlyZXR2YWw7CisJdW5zaWduZWQgc2hvcnQJZGF0YV9iYXNlX2FkZHI7CisJdW5zaWduZWQgc2hvcnQJZGF0YV9vZmZzZXQ7CisJdW5zaWduZWQgY2hhcglkYXRhX3JlZ19ibGtfc2l6ZTsKKwl1bnNpZ25lZCBjaGFyCXZhbHVlc1syXTsKKwl1bnNpZ25lZCBjaGFyCWRhdGFbREFUQV9MRU5dOworCWludAl4W1JNSTRfTlVNQkVSX09GX01BWF9GSU5HRVJTXTsKKwlpbnQJeVtSTUk0X05VTUJFUl9PRl9NQVhfRklOR0VSU107CisJaW50CXd4W1JNSTRfTlVNQkVSX09GX01BWF9GSU5HRVJTXTsKKwlpbnQJd3lbUk1JNF9OVU1CRVJfT0ZfTUFYX0ZJTkdFUlNdOworCXN0cnVjdAlpMmNfY2xpZW50ICpjbGllbnQgPSBwZGF0YS0+aTJjX2NsaWVudDsKKworCS8qIGdldCAyRCBzZW5zb3IgZmluZ2VyIGRhdGEgKi8KKwkvKgorCSAqIEZpcnN0IGdldCB0aGUgZmluZ2VyIHN0YXR1cyBmaWVsZCAtIHRoZSBzaXplIG9mIHRoZSBmaW5nZXIgc3RhdHVzCisJICogZmllbGQgaXMgZGV0ZXJtaW5lZCBieSB0aGUgbnVtYmVyIG9mIGZpbmdlciBzdXBwb3J0ZSAtIDIgYml0cyBwZXIKKwkgKiBmaW5nZXIsIHNvIHRoZSBudW1iZXIgb2YgcmVnaXN0ZXJzIHRvIHJlYWQgaXM6CisJICogcmVnaXN0ZXJDb3VudCA9IGNlaWwobnVtYmVyT2ZGaW5nZXJzLzQpLgorCSAqIFJlYWQgdGhlIHJlcXVpcmVkIG51bWJlciBvZiByZWdpc3RlcnMgYW5kIGNoZWNrIGVhY2ggMiBiaXQgZmllbGQgdG8KKwkgKiBkZXRlcm1pbmUgaWYgYSBmaW5nZXIgaXMgZG93bjoKKwkgKgkwMCA9IGZpbmdlciBub3QgcHJlc2VudCwKKwkgKgkwMSA9IGZpbmdlciBwcmVzZW50IGFuZCBkYXRhIGFjY3VyYXRlLAorCSAqCTEwID0gZmluZ2VyIHByZXNlbnQgYnV0IGRhdGEgbWF5IG5vdCBiZSBhY2N1cmF0ZSwKKwkgKgkxMSA9IHJlc2VydmVkIGZvciBwcm9kdWN0IHVzZS4KKwkgKi8KKwlmaW5nZXJzX3N1cHBvcnRlZAk9IHJmaS0+bnVtX29mX2RhdGFfcG9pbnRzOworCWZpbmdlcl9yZWdpc3RlcnMJPSAoZmluZ2Vyc19zdXBwb3J0ZWQgKyAzKS80OworCWRhdGFfYmFzZV9hZGRyCQk9IHJmaS0+Zm5fZGVzYy5kYXRhX2Jhc2VfYWRkcjsKKwlyZXR2YWwgPSBzeW5hcHRpY3Nfcm1pNF9pMmNfYmxvY2tfcmVhZChwZGF0YSwgZGF0YV9iYXNlX2FkZHIsIHZhbHVlcywKKwkJCQkJCQlmaW5nZXJfcmVnaXN0ZXJzKTsKKwlpZiAocmV0dmFsICE9IGZpbmdlcl9yZWdpc3RlcnMpIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICIlczpyZWFkIHN0YXR1cyByZWdpc3RlcnMgZmFpbGVkXG4iLAorCQkJCQkJCQlfX2Z1bmNfXyk7CisJCXJldHVybiAwOworCX0KKwkvKgorCSAqIEZvciBlYWNoIGZpbmdlciBwcmVzZW50LCByZWFkIHRoZSBwcm9wZXIgbnVtYmVyIG9mIHJlZ2lzdGVycworCSAqIHRvIGdldCBhYnNvbHV0ZSBkYXRhLgorCSAqLworCWRhdGFfcmVnX2Jsa19zaXplID0gcmZpLT5zaXplX29mX2RhdGFfcmVnaXN0ZXJfYmxvY2s7CisJZm9yIChmaW5nZXIgPSAwOyBmaW5nZXIgPCBmaW5nZXJzX3N1cHBvcnRlZDsgZmluZ2VyKyspIHsKKwkJLyogZGV0ZXJtaW5lIHdoaWNoIGRhdGEgYnl0ZSB0aGUgZmluZ2VyIHN0YXR1cyBpcyBpbiAqLworCQlyZWcgPSBmaW5nZXIvNDsKKwkJLyogYml0IHNoaWZ0IHRvIGdldCBmaW5nZXIncyBzdGF0dXMgKi8KKwkJZmluZ2VyX3NoaWZ0CT0gKGZpbmdlciAlIDQpICogMjsKKwkJZmluZ2VyX3N0YXR1cwk9ICh2YWx1ZXNbcmVnXSA+PiBmaW5nZXJfc2hpZnQpICYgMzsKKwkJLyoKKwkJICogaWYgZmluZ2VyIHN0YXR1cyBpbmRpY2F0ZXMgYSBmaW5nZXIgaXMgcHJlc2VudCB0aGVuCisJCSAqIHJlYWQgdGhlIGZpbmdlciBkYXRhIGFuZCByZXBvcnQgaXQKKwkJICovCisJCWlmIChmaW5nZXJfc3RhdHVzID09IDEgfHwgZmluZ2VyX3N0YXR1cyA9PSAyKSB7CisJCQkvKiBSZWFkIHRoZSBmaW5nZXIgZGF0YSAqLworCQkJZGF0YV9vZmZzZXQgPSBkYXRhX2Jhc2VfYWRkciArCisJCQkJCSgoZmluZ2VyICogZGF0YV9yZWdfYmxrX3NpemUpICsKKwkJCQkJZmluZ2VyX3JlZ2lzdGVycyk7CisJCQlyZXR2YWwgPSBzeW5hcHRpY3Nfcm1pNF9pMmNfYmxvY2tfcmVhZChwZGF0YSwKKwkJCQkJCWRhdGFfb2Zmc2V0LCBkYXRhLAorCQkJCQkJZGF0YV9yZWdfYmxrX3NpemUpOworCQkJaWYgKHJldHZhbCAhPSBkYXRhX3JlZ19ibGtfc2l6ZSkgeworCQkJCXByaW50ayhLRVJOX0VSUiAiJXM6cmVhZCBkYXRhIGZhaWxlZFxuIiwKKwkJCQkJCQkJX19mdW5jX18pOworCQkJCXJldHVybiAwOworCQkJfSBlbHNlIHsKKwkJCQl4W3RvdWNoX2NvdW50XQk9CisJCQkJCShkYXRhWzBdIDw8IDQpIHwgKGRhdGFbMl0gJiBNQVNLXzRCSVQpOworCQkJCXlbdG91Y2hfY291bnRdCT0KKwkJCQkJKGRhdGFbMV0gPDwgNCkgfAorCQkJCQkoKGRhdGFbMl0gPj4gNCkgJiBNQVNLXzRCSVQpOworCQkJCXd5W3RvdWNoX2NvdW50XQk9CisJCQkJCQkoZGF0YVszXSA+PiA0KSAmIE1BU0tfNEJJVDsKKwkJCQl3eFt0b3VjaF9jb3VudF0JPQorCQkJCQkJKGRhdGFbM10gJiBNQVNLXzRCSVQpOworCisJCQkJaWYgKHBkYXRhLT5ib2FyZC0+eF9mbGlwKQorCQkJCQl4W3RvdWNoX2NvdW50XSA9CisJCQkJCQlwZGF0YS0+c2Vuc29yX21heF94IC0KKwkJCQkJCQkJeFt0b3VjaF9jb3VudF07CisJCQkJaWYgKHBkYXRhLT5ib2FyZC0+eV9mbGlwKQorCQkJCQl5W3RvdWNoX2NvdW50XSA9CisJCQkJCQlwZGF0YS0+c2Vuc29yX21heF95IC0KKwkJCQkJCQkJeVt0b3VjaF9jb3VudF07CisJCQl9CisJCQkvKiBudW1iZXIgb2YgYWN0aXZlIHRvdWNoIHBvaW50cyAqLworCQkJdG91Y2hfY291bnQrKzsKKwkJfQorCX0KKworCS8qIHJlcG9ydCB0byBpbnB1dCBzdWJzeXN0ZW0gKi8KKwlpZiAodG91Y2hfY291bnQpIHsKKwkJZm9yIChmaW5nZXIgPSAwOyBmaW5nZXIgPCB0b3VjaF9jb3VudDsgZmluZ2VyKyspIHsKKwkJCWlucHV0X3JlcG9ydF9hYnMocGRhdGEtPmlucHV0X2RldiwgQUJTX01UX1RPVUNIX01BSk9SLAorCQkJCQkJbWF4KHd4W2Zpbmdlcl0gLCB3eVtmaW5nZXJdKSk7CisJCQlpbnB1dF9yZXBvcnRfYWJzKHBkYXRhLT5pbnB1dF9kZXYsIEFCU19NVF9QT1NJVElPTl9YLAorCQkJCQkJCQl4W2Zpbmdlcl0pOworCQkJaW5wdXRfcmVwb3J0X2FicyhwZGF0YS0+aW5wdXRfZGV2LCBBQlNfTVRfUE9TSVRJT05fWSwKKwkJCQkJCQkJeVtmaW5nZXJdKTsKKwkJCWlucHV0X210X3N5bmMocGRhdGEtPmlucHV0X2Rldik7CisJCX0KKwl9IGVsc2UKKwkJaW5wdXRfbXRfc3luYyhwZGF0YS0+aW5wdXRfZGV2KTsKKworCS8qIHN5bmMgYWZ0ZXIgZ3JvdXBzIG9mIGV2ZW50cyAqLworCWlucHV0X3N5bmMocGRhdGEtPmlucHV0X2Rldik7CisJLyogcmV0dXJuIHRoZSBudW1iZXIgb2YgdG91Y2ggcG9pbnRzICovCisJcmV0dXJuIHRvdWNoX2NvdW50OworfQorCisvKioKKyAqIHN5bmFwdGljc19ybWk0X3JlcG9ydF9kZXZpY2UoKSAtIHJlcG9ydHMgdGhlIHJtaTQgZGV2aWNlCisgKiBAcGRhdGE6IHBvaW50ZXIgdG8gc3luYXB0aWNzX3JtaTRfZGF0YSBzdHJ1Y3R1cmUKKyAqIEByZmk6IHBvaW50ZXIgdG8gc3luYXB0aWNzX3JtaTRfZm4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gY2FsbCB0aGUgcmVwb3J0IGZ1bmN0aW9uIG9mIHRoZSBybWk0IGRldmljZS4KKyAqLworc3RhdGljIGludCBzeW5hcHRpY3Nfcm1pNF9yZXBvcnRfZGV2aWNlKHN0cnVjdCBzeW5hcHRpY3Nfcm1pNF9kYXRhICpwZGF0YSwKKwkJCQkJc3RydWN0IHN5bmFwdGljc19ybWk0X2ZuICpyZmkpCit7CisJaW50IHRvdWNoID0gMDsKKwlzdHJ1Y3QJaTJjX2NsaWVudCAqY2xpZW50ID0gcGRhdGEtPmkyY19jbGllbnQ7CisJc3RhdGljIGludCBudW1fZXJyb3JfcmVwb3J0czsKKwlpZiAocmZpLT5mbl9udW1iZXIgIT0gU1lOQVBUSUNTX1JNSTRfVE9VQ0hQQURfRlVOQ19OVU0pIHsKKwkJbnVtX2Vycm9yX3JlcG9ydHMrKzsKKwkJaWYgKG51bV9lcnJvcl9yZXBvcnRzIDwgTUFYX0VSUk9SX1JFUE9SVCkKKwkJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiJXM6cmVwb3J0IG5vdCBzdXBwb3J0ZWRcbiIsCisJCQkJCQkJCV9fZnVuY19fKTsKKwl9IGVsc2UKKwkJdG91Y2ggPSBzeW5wYXRpY3Nfcm1pNF90b3VjaHBhZF9yZXBvcnQocGRhdGEsIHJmaSk7CisJcmV0dXJuIHRvdWNoOworfQorLyoqCisgKiBzeW5hcHRpY3Nfcm1pNF9zZW5zb3JfcmVwb3J0KCkgLSByZXBvcnRzIHRvIGlucHV0IHN1YnN5c3RlbQorICogQHBkYXRhOiBwb2ludGVyIHRvIHN5bmFwdGljc19ybWk0X2RhdGEgc3RydWN0dXJlCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHJlYWRzIGluIGFsbCBkYXRhIHNvdXJjZXMgYW5kIHJlcG9ydHMKKyAqIHRoZW0gdG8gdGhlIGlucHV0IHN1YnN5c3RlbS4KKyAqLworc3RhdGljIGludCBzeW5hcHRpY3Nfcm1pNF9zZW5zb3JfcmVwb3J0KHN0cnVjdCBzeW5hcHRpY3Nfcm1pNF9kYXRhICpwZGF0YSkKK3sKKwl1bnNpZ25lZCBjaGFyCWludHJfc3RhdHVzWzRdOworCS8qIG51bWJlciBvZiB0b3VjaCBwb2ludHMgLSBmaW5nZXJzIG9yIGJ1dHRvbnMgKi8KKwlpbnQgdG91Y2ggPSAwOworCXVuc2lnbmVkIGludCByZXR2YWw7CisJc3RydWN0IHN5bmFwdGljc19ybWk0X2ZuCQkqcmZpOworCXN0cnVjdCBzeW5hcHRpY3Nfcm1pNF9kZXZpY2VfaW5mbwkqcm1pOworCXN0cnVjdAlpMmNfY2xpZW50ICpjbGllbnQgPSBwZGF0YS0+aTJjX2NsaWVudDsKKworCS8qCisJICogR2V0IHRoZSBpbnRlcnJ1cHQgc3RhdHVzIGZyb20gdGhlIGZ1bmN0aW9uICQwMQorCSAqIGNvbnRyb2wgcmVnaXN0ZXIrMSB0byBmaW5kIHdoaWNoIHNvdXJjZShzKSB3ZXJlIGludGVycnVwdGluZworCSAqIHNvIHdlIGNhbiByZWFkIHRoZSBkYXRhIGZyb20gdGhlIHNvdXJjZShzKSAoMkQgc2Vuc29yLCBidXR0b25zLi4pCisJICovCisJcmV0dmFsID0gc3luYXB0aWNzX3JtaTRfaTJjX2Jsb2NrX3JlYWQocGRhdGEsCisJCQkJCXBkYXRhLT5mbjAxX2RhdGFfYmFzZV9hZGRyICsgMSwKKwkJCQkJaW50cl9zdGF0dXMsCisJCQkJCXBkYXRhLT5udW1iZXJfb2ZfaW50ZXJydXB0X3JlZ2lzdGVyKTsKKwlpZiAocmV0dmFsICE9IHBkYXRhLT5udW1iZXJfb2ZfaW50ZXJydXB0X3JlZ2lzdGVyKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LAorCQkJCSJjb3VsZCBub3QgcmVhZCBpbnRlcnJ1cHQgc3RhdHVzIHJlZ2lzdGVyc1xuIik7CisJCXJldHVybiAwOworCX0KKwkvKgorCSAqIGNoZWNrIGVhY2ggZnVuY3Rpb24gdGhhdCBoYXMgZGF0YSBzb3VyY2VzIGFuZCBpZiB0aGUgaW50ZXJydXB0IGZvcgorCSAqIHRoYXQgdHJpZ2dlcmVkIHRoZW4gY2FsbCB0aGF0IFJNSTQgZnVuY3Rpb25zIHJlcG9ydCgpIGZ1bmN0aW9uIHRvCisJICogZ2F0aGVyIGRhdGEgYW5kIHJlcG9ydCBpdCB0byB0aGUgaW5wdXQgc3Vic3lzdGVtCisJICovCisJcm1pID0gJihwZGF0YS0+cm1pNF9tb2RfaW5mbyk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShyZmksICZybWktPnN1cHBvcnRfZm5fbGlzdCwgbGluaykgeworCQlpZiAocmZpLT5udW1fb2ZfZGF0YV9zb3VyY2VzKSB7CisJCQlpZiAoaW50cl9zdGF0dXNbcmZpLT5pbmRleF90b19pbnRyX3JlZ10gJgorCQkJCQkJCXJmaS0+aW50cl9tYXNrKQorCQkJCXRvdWNoID0gc3luYXB0aWNzX3JtaTRfcmVwb3J0X2RldmljZShwZGF0YSwKKwkJCQkJCQkJCXJmaSk7CisJCX0KKwl9CisJLyogcmV0dXJuIHRoZSBudW1iZXIgb2YgdG91Y2ggcG9pbnRzICovCisJcmV0dXJuIHRvdWNoOworfQorCisvKioKKyAqIHN5bmFwdGljc19ybWk0X2lycSgpIC0gdGhyZWFkIGZ1bmN0aW9uIGZvciBybWk0IGF0dGVudGlvbiBsaW5lCisgKiBAaXJxOiBpcnEgdmFsdWUKKyAqIEBkYXRhOiB2b2lkIHBvaW50ZXIKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGludGVycnVwdCB0aHJlYWQgZnVuY3Rpb24uIEl0IGp1c3Qgbm90aWZpZXMgdGhlCisgKiBhcHBsaWNhdGlvbiBsYXllciB0aGF0IGF0dGVudGlvbiBpcyByZXF1aXJlZC4KKyAqLworc3RhdGljIGlycXJldHVybl90IHN5bmFwdGljc19ybWk0X2lycShpbnQgaXJxLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBzeW5hcHRpY3Nfcm1pNF9kYXRhICpwZGF0YSA9IGRhdGE7CisJaW50IHRvdWNoX2NvdW50OworCWRvIHsKKwkJdG91Y2hfY291bnQgPSBzeW5hcHRpY3Nfcm1pNF9zZW5zb3JfcmVwb3J0KHBkYXRhKTsKKwkJaWYgKHRvdWNoX2NvdW50KQorCQkJd2FpdF9ldmVudF90aW1lb3V0KHBkYXRhLT53YWl0LCBwZGF0YS0+dG91Y2hfc3RvcHBlZCwKKwkJCQkJCQltc2Vjc190b19qaWZmaWVzKDEpKTsKKwkJZWxzZQorCQkJYnJlYWs7CisJfSB3aGlsZSAoIXBkYXRhLT50b3VjaF9zdG9wcGVkKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKy8qKgorICogc3lucGF0aWNzX3JtaTRfdG91Y2hwYWRfZGV0ZWN0KCkgLSBkZXRlY3RzIHRoZSBybWk0IHRvdWNocGFkIGRldmljZQorICogQHBkYXRhOiBwb2ludGVyIHRvIHN5bmFwdGljc19ybWk0X2RhdGEgc3RydWN0dXJlCisgKiBAcmZpOiBwb2ludGVyIHRvIHN5bmFwdGljc19ybWk0X2ZuIHN0cnVjdHVyZQorICogQGZkOiBwb2ludGVyIHRvIHN5bmFwdGljc19ybWk0X2ZuX2Rlc2Mgc3RydWN0dXJlCisgKiBAaW50ZXJydXB0Y291bnQ6IGNvdW50IHRoZSBudW1iZXIgb2YgaW50ZXJydXB0cworICoKKyAqIFRoaXMgZnVuY3Rpb24gY2FsbHMgdG8gZGV0ZWN0cyB0aGUgcm1pNCB0b3VjaHBhZCBkZXZpY2UKKyAqLworc3RhdGljIGludCBzeW5wYXRpY3Nfcm1pNF90b3VjaHBhZF9kZXRlY3Qoc3RydWN0IHN5bmFwdGljc19ybWk0X2RhdGEgKnBkYXRhLAorCQkJCQlzdHJ1Y3Qgc3luYXB0aWNzX3JtaTRfZm4gKnJmaSwKKwkJCQkJc3RydWN0IHN5bmFwdGljc19ybWk0X2ZuX2Rlc2MgKmZkLAorCQkJCQl1bnNpZ25lZCBpbnQgaW50ZXJydXB0Y291bnQpCit7CisJdW5zaWduZWQgY2hhcglxdWVyaWVzW1FVRVJZX0xFTl07CisJdW5zaWduZWQgc2hvcnQJaW50cl9vZmZzZXQ7CisJdW5zaWduZWQgY2hhcglhYnNfZGF0YV9zaXplOworCXVuc2lnbmVkIGNoYXIJYWJzX2RhdGFfYmxrX3NpemU7CisJdW5zaWduZWQgY2hhcgllZ3JfMCwgZWdyXzE7CisJdW5zaWduZWQgaW50CWFsbF9kYXRhX2Jsa19zaXplOworCWludAloYXNfcGluY2gsIGhhc19mbGljaywgaGFzX3RhcDsKKwlpbnQJaGFzX3RhcGFuZGhvbGQsIGhhc19kb3VibGV0YXA7CisJaW50CWhhc19lYXJseXRhcCwgaGFzX3ByZXNzOworCWludAloYXNfcGFsbWRldGVjdCwgaGFzX3JvdGF0ZTsKKwlpbnQJaGFzX3JlbDsKKwlpbnQJaTsKKwlpbnQJcmV0dmFsOworCXN0cnVjdAlpMmNfY2xpZW50ICpjbGllbnQgPSBwZGF0YS0+aTJjX2NsaWVudDsKKworCXJmaS0+Zm5fZGVzYy5xdWVyeV9iYXNlX2FkZHIJPSBmZC0+cXVlcnlfYmFzZV9hZGRyOworCXJmaS0+Zm5fZGVzYy5kYXRhX2Jhc2VfYWRkcgk9IGZkLT5kYXRhX2Jhc2VfYWRkcjsKKwlyZmktPmZuX2Rlc2MuaW50cl9zcmNfY291bnQJPSBmZC0+aW50cl9zcmNfY291bnQ7CisJcmZpLT5mbl9kZXNjLmZuX251bWJlcgkJPSBmZC0+Zm5fbnVtYmVyOworCXJmaS0+Zm5fbnVtYmVyCQkJPSBmZC0+Zm5fbnVtYmVyOworCXJmaS0+bnVtX29mX2RhdGFfc291cmNlcwk9IGZkLT5pbnRyX3NyY19jb3VudDsKKwlyZmktPmZuX2Rlc2MuY3RybF9iYXNlX2FkZHIJPSBmZC0+Y3RybF9iYXNlX2FkZHI7CisJcmZpLT5mbl9kZXNjLmNtZF9iYXNlX2FkZHIJPSBmZC0+Y21kX2Jhc2VfYWRkcjsKKworCS8qCisJICogbmVlZCB0byBnZXQgbnVtYmVyIG9mIGZpbmdlcnMgc3VwcG9ydGVkLCBkYXRhIHNpemUsIGV0Yy4KKwkgKiB0byBiZSB1c2VkIHdoZW4gZ2V0dGluZyBkYXRhIHNpbmNlIHRoZSBudW1iZXIgb2YgcmVnaXN0ZXJzIHRvCisJICogcmVhZCBkZXBlbmRzIG9uIHRoZSBudW1iZXIgb2YgZmluZ2VycyBzdXBwb3J0ZWQgYW5kIGRhdGEgc2l6ZS4KKwkgKi8KKwlyZXR2YWwgPSBzeW5hcHRpY3Nfcm1pNF9pMmNfYmxvY2tfcmVhZChwZGF0YSwgZmQtPnF1ZXJ5X2Jhc2VfYWRkciwKKwkJCQkJCQlxdWVyaWVzLAorCQkJCQkJCXNpemVvZihxdWVyaWVzKSk7CisJaWYgKHJldHZhbCAhPSBzaXplb2YocXVlcmllcykpIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICIlczpyZWFkIGZ1bmN0aW9uIHF1ZXJ5IHJlZ2lzdGVyc1xuIiwKKwkJCQkJCQlfX2Z1bmNfXyk7CisJCXJldHVybiByZXR2YWw7CisJfQorCS8qCisJICogMkQgZGF0YSBzb3VyY2VzIGhhdmUgb25seSAzIGJpdHMgZm9yIHRoZSBudW1iZXIgb2YgZmluZ2VycworCSAqIHN1cHBvcnRlZCAtIHNvIHRoZSBlbmNvZGluZyBpcyBhIGJpdCB3aWVyZC4KKwkgKi8KKwlpZiAoKHF1ZXJpZXNbMV0gJiBNQVNLXzNCSVQpIDw9IDQpCisJCS8qIGFkZCAxIHNpbmNlIHplcm8gYmFzZWQgKi8KKwkJcmZpLT5udW1fb2ZfZGF0YV9wb2ludHMgPSAocXVlcmllc1sxXSAmIE1BU0tfM0JJVCkgKyAxOworCWVsc2UgeworCQkvKgorCQkgKiBhIHZhbHVlIG9mIDUgaXMgdXAgdG8gMTAgZmluZ2VycyAtIDYgYW5kIDcgYXJlIHJlc2VydmVkCisJCSAqIChzaG91bGRuJ3QgZ2V0IHRoZXNlIGkgaW50IHJldHZhbDtuIGEgbm9ybWFsIDJEIHNvdXJjZSkuCisJCSAqLworCQlpZiAoKHF1ZXJpZXNbMV0gJiBNQVNLXzNCSVQpID09IDUpCisJCQlyZmktPm51bV9vZl9kYXRhX3BvaW50cyA9IDEwOworCX0KKwkvKiBOZWVkIHRvIGdldCBpbnRlcnJ1cHQgaW5mbyBmb3IgaGFuZGxpbmcgaW50ZXJydXB0cyAqLworCXJmaS0+aW5kZXhfdG9faW50cl9yZWcgPSAoaW50ZXJydXB0Y291bnQgKyA3KS84OworCWlmIChyZmktPmluZGV4X3RvX2ludHJfcmVnICE9IDApCisJCXJmaS0+aW5kZXhfdG9faW50cl9yZWcgLT0gMTsKKwkvKgorCSAqIGxvb3AgdGhyb3VnaCBpbnRlcnJ1cHRzIGZvciBlYWNoIHNvdXJjZSBpbiBmbiAkMTEKKwkgKiBhbmQgb3IgaW4gYSBiaXQgdG8gdGhlIGludGVycnVwdCBtYXNrIGZvciBlYWNoLgorCSAqLworCWludHJfb2Zmc2V0ID0gaW50ZXJydXB0Y291bnQgJSA4OworCXJmaS0+aW50cl9tYXNrID0gMDsKKwlmb3IgKGkgPSBpbnRyX29mZnNldDsKKwkJaSA8ICgoZmQtPmludHJfc3JjX2NvdW50ICYgTUFTS18zQklUKSArIGludHJfb2Zmc2V0KTsgaSsrKQorCQlyZmktPmludHJfbWFzayB8PSAxIDw8IGk7CisKKwkvKiBTaXplIG9mIGp1c3QgdGhlIGFic29sdXRlIGRhdGEgZm9yIG9uZSBmaW5nZXIgKi8KKwlhYnNfZGF0YV9zaXplCT0gcXVlcmllc1s1XSAmIE1BU0tfMkJJVDsKKwkvKiBPbmUgZWFjaCBmb3IgWCBhbmQgWSwgb25lIGZvciBMU0IgZm9yIFggJiBZLCBvbmUgZm9yIFcsIG9uZSBmb3IgWiAqLworCWFic19kYXRhX2Jsa19zaXplID0gMyArICgyICogKGFic19kYXRhX3NpemUgPT0gMCA/IDEgOiAwKSk7CisJcmZpLT5zaXplX29mX2RhdGFfcmVnaXN0ZXJfYmxvY2sgPSBhYnNfZGF0YV9ibGtfc2l6ZTsKKworCS8qCisJICogbmVlZCB0byBkZXRlcm1pbmUgdGhlIHNpemUgb2YgZGF0YSB0byByZWFkIC0gdGhpcyBkZXBlbmRzIG9uCisJICogY29uZGl0aW9ucyBzdWNoIGFzIHdoZXRoZXIgUmVsYXRpdmUgZGF0YSBpcyByZXBvcnRlZCBhbmQgaWYgR2VzdHVyZQorCSAqIGRhdGEgaXMgcmVwb3J0ZWQuCisJICovCisJZWdyXzAgPSBxdWVyaWVzWzddOworCWVncl8xID0gcXVlcmllc1s4XTsKKworCS8qCisJICogR2V0IGluZm8gYWJvdXQgd2hhdCBFR1IgZGF0YSBpcyBzdXBwb3J0ZWQsIHdoZXRoZXIgaXQgaGFzCisJICogUmVsYXRpdmUgZGF0YSBzdXBwb3J0ZWQsIGV0Yy4KKwkgKi8KKwloYXNfcGluY2gJPSBlZ3JfMCAmIEhBU19QSU5DSDsKKwloYXNfZmxpY2sJPSBlZ3JfMCAmIEhBU19GTElDSzsKKwloYXNfdGFwCQk9IGVncl8wICYgSEFTX1RBUDsKKwloYXNfZWFybHl0YXAJPSBlZ3JfMCAmIEhBU19FQVJMWVRBUDsKKwloYXNfcHJlc3MJPSBlZ3JfMCAmIEhBU19QUkVTUzsKKwloYXNfcm90YXRlCT0gZWdyXzEgJiBIQVNfUk9UQVRFOworCWhhc19yZWwJCT0gcXVlcmllc1sxXSAmIEhBU19SRUxFQVNFOworCWhhc190YXBhbmRob2xkCT0gZWdyXzAgJiBIQVNfVEFQQU5ESE9MRDsKKwloYXNfZG91YmxldGFwCT0gZWdyXzAgJiBIQVNfRE9VQkxFVEFQOworCWhhc19wYWxtZGV0ZWN0CT0gZWdyXzEgJiBIQVNfUEFMTURFVEVDVDsKKworCS8qCisJICogU2l6ZSBvZiBhbGwgZGF0YSBpbmNsdWRpbmcgZmluZ2VyIHN0YXR1cywgYWJzb2x1dGUgZGF0YSBmb3IgZWFjaAorCSAqIGZpbmdlciwgcmVsYXRpdmUgZGF0YSBhbmQgRUdSIGRhdGEKKwkgKi8KKwlhbGxfZGF0YV9ibGtfc2l6ZSA9CisJCS8qIGZpbmdlciBzdGF0dXMsIGZvdXIgZmluZ2VycyBwZXIgcmVnaXN0ZXIgKi8KKwkJKChyZmktPm51bV9vZl9kYXRhX3BvaW50cyArIDMpIC8gNCkgKworCQkvKiBhYnNvbHV0ZSBkYXRhLCBwZXIgZmluZ2VyIHRpbWVzIG51bWJlciBvZiBmaW5nZXJzICovCisJCShhYnNfZGF0YV9ibGtfc2l6ZSAqIHJmaS0+bnVtX29mX2RhdGFfcG9pbnRzKSArCisJCS8qCisJCSAqIHR3byByZWxhdGl2ZSByZWdpc3RlcnMgKGlmIHJlbGF0aXZlIGlzIGJlaW5nIHJlcG9ydGVkKQorCQkgKi8KKwkJMiAqIGhhc19yZWwgKworCQkvKgorCQkgKiBGMTFfMkRfZGF0YTggaXMgb25seSBwcmVzZW50IGlmIHRoZSBlZ3JfMAorCQkgKiByZWdpc3RlciBpcyBub24temVyby4KKwkJICovCisJCSEhKGVncl8wKSArCisJCS8qCisJCSAqIEYxMV8yRF9kYXRhOSBpcyBvbmx5IHByZXNlbnQgaWYgZWl0aGVyIGVncl8wIG9yCisJCSAqIGVncl8xIHJlZ2lzdGVycyBhcmUgbm9uLXplcm8uCisJCSAqLworCQkoZWdyXzAgfHwgZWdyXzEpICsKKwkJLyoKKwkJICogRjExXzJEX2RhdGExMCBpcyBvbmx5IHByZXNlbnQgaWYgRUdSX1BJTkNIIG9yIEVHUl9GTElDSyBvZgorCQkgKiBlZ3JfMCByZXBvcnRzIGFzIDEuCisJCSAqLworCQkhIShoYXNfcGluY2ggfCBoYXNfZmxpY2spICsKKwkJLyoKKwkJICogRjExXzJEX2RhdGExMSBhbmQgRjExXzJEX2RhdGExMiBhcmUgb25seSBwcmVzZW50IGlmCisJCSAqIEVHUl9GTElDSyBvZiBlZ3JfMCByZXBvcnRzIGFzIDEuCisJCSAqLworCQkyICogISEoaGFzX2ZsaWNrKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKioKKyAqIHN5bnBhdGljc19ybWk0X3RvdWNocGFkX2NvbmZpZygpIC0gY29uZml1cmVzIHRoZSBybWk0IHRvdWNocGFkIGRldmljZQorICogQHBkYXRhOiBwb2ludGVyIHRvIHN5bmFwdGljc19ybWk0X2RhdGEgc3RydWN0dXJlCisgKiBAcmZpOiBwb2ludGVyIHRvIHN5bmFwdGljc19ybWk0X2ZuIHN0cnVjdHVyZQorICoKKyAqIFRoaXMgZnVuY3Rpb24gY2FsbHMgdG8gY29uZml1cmVzIHRoZSBybWk0IHRvdWNocGFkIGRldmljZQorICovCitpbnQgc3lucGF0aWNzX3JtaTRfdG91Y2hwYWRfY29uZmlnKHN0cnVjdCBzeW5hcHRpY3Nfcm1pNF9kYXRhICpwZGF0YSwKKwkJCQkJCXN0cnVjdCBzeW5hcHRpY3Nfcm1pNF9mbiAqcmZpKQoreworCS8qCisJICogRm9yIHRoZSBkYXRhIHNvdXJjZSAtIHByaW50IGluZm8gYW5kIGRvIGFueQorCSAqIHNvdXJjZSBzcGVjaWZpYyBjb25maWd1cmF0aW9uLgorCSAqLworCXVuc2lnbmVkIGNoYXIgZGF0YVtCVUZfTEVOXTsKKwlpbnQgcmV0dmFsID0gMDsKKwlzdHJ1Y3QJaTJjX2NsaWVudCAqY2xpZW50ID0gcGRhdGEtPmkyY19jbGllbnQ7CisKKwkvKiBHZXQgYW5kIHByaW50IHNvbWUgaW5mbyBhYm91dCB0aGUgZGF0YSBzb3VyY2UuLi4gKi8KKwkvKiBUbyBRdWVyeSAyRCBkZXZpY2VzIHdlIG5lZWQgdG8gcmVhZCBmcm9tIHRoZSBhZGRyZXNzIG9idGFpbmVkCisJICogZnJvbSB0aGUgZnVuY3Rpb24gZGVzY3JpcHRvciBzdG9yZWQgaW4gdGhlIFJNSSBmdW5jdGlvbiBpbmZvLgorCSAqLworCXJldHZhbCA9IHN5bmFwdGljc19ybWk0X2kyY19ibG9ja19yZWFkKHBkYXRhLAorCQkJCQkJcmZpLT5mbl9kZXNjLnF1ZXJ5X2Jhc2VfYWRkciwKKwkJCQkJCWRhdGEsIFFVRVJZX0xFTik7CisJaWYgKHJldHZhbCAhPSBRVUVSWV9MRU4pCisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiJXM6cmVhZCBxdWVyeSByZWdpc3RlcnMgZmFpbGVkXG4iLAorCQkJCQkJCQlfX2Z1bmNfXyk7CisJZWxzZSB7CisJCXJldHZhbCA9IHN5bmFwdGljc19ybWk0X2kyY19ibG9ja19yZWFkKHBkYXRhLAorCQkJCQkJcmZpLT5mbl9kZXNjLmN0cmxfYmFzZV9hZGRyLAorCQkJCQkJZGF0YSwgREFUQV9CVUZfTEVOKTsKKwkJaWYgKHJldHZhbCAhPSBEQVRBX0JVRl9MRU4pIHsKKwkJCWRldl9lcnIoJmNsaWVudC0+ZGV2LAorCQkJCSIlczpyZWFkIGNvbnRyb2wgcmVnaXN0ZXJzIGZhaWxlZFxuIiwKKwkJCQkJCQkJX19mdW5jX18pOworCQkJcmV0dXJuIHJldHZhbDsKKwkJfQorCQkvKiBTdG9yZSB0aGVzZSBmb3IgdXNlIGxhdGVyKi8KKwkJcGRhdGEtPnNlbnNvcl9tYXhfeCA9ICgoZGF0YVs2XSAmIE1BU0tfOEJJVCkgPDwgMCkgfAorCQkJCQkJKChkYXRhWzddICYgTUFTS180QklUKSA8PCA4KTsKKwkJcGRhdGEtPnNlbnNvcl9tYXhfeSA9ICgoZGF0YVs4XSAmIE1BU0tfNUJJVCkgPDwgMCkgfAorCQkJCQkJKChkYXRhWzldICYgTUFTS180QklUKSA8PCA4KTsKKwl9CisJcmV0dXJuIHJldHZhbDsKK30KKworLyoqCisgKiBzeW5hcHRpY3Nfcm1pNF9pMmNfcXVlcnlfZGV2aWNlKCkgLSBxdWVyeSB0aGUgcm1pNCBkZXZpY2UKKyAqIEBwZGF0YTogcG9pbnRlciB0byBzeW5hcHRpY3Nfcm1pNF9kYXRhIHN0cnVjdHVyZQorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBxdWVyeSB0aGUgcm1pNCBkZXZpY2UuCisgKi8KK3N0YXRpYyBpbnQgc3luYXB0aWNzX3JtaTRfaTJjX3F1ZXJ5X2RldmljZShzdHJ1Y3Qgc3luYXB0aWNzX3JtaTRfZGF0YSAqcGRhdGEpCit7CisJaW50IGk7CisJaW50IHJldHZhbDsKKwl1bnNpZ25lZCBjaGFyIHN0ZF9xdWVyaWVzW1NURF9RVUVSWV9MRU5dOworCXVuc2lnbmVkIGNoYXIgaW50cl9jb3VudCA9IDA7CisJaW50IGRhdGFfc291cmNlcyA9IDA7CisJdW5zaWduZWQgaW50IGN0cmxfb2Zmc2V0OworCXN0cnVjdCBzeW5hcHRpY3Nfcm1pNF9mbiAqcmZpOworCXN0cnVjdCBzeW5hcHRpY3Nfcm1pNF9mbl9kZXNjCXJtaV9mZDsKKwlzdHJ1Y3Qgc3luYXB0aWNzX3JtaTRfZGV2aWNlX2luZm8gKnJtaTsKKwlzdHJ1Y3QJaTJjX2NsaWVudCAqY2xpZW50ID0gcGRhdGEtPmkyY19jbGllbnQ7CisKKwkvKgorCSAqIGluaXQgdGhlIHBoeXNpY2FsIGRyaXZlcnMgUk1JIG1vZHVsZQorCSAqIGluZm8gbGlzdCBvZiBmdW5jdGlvbnMKKwkgKi8KKwlJTklUX0xJU1RfSEVBRCgmcGRhdGEtPnJtaTRfbW9kX2luZm8uc3VwcG9ydF9mbl9saXN0KTsKKworCS8qCisJICogUmVhZCB0aGUgUGFnZSBEZXNjcmlwdG9yIFRhYmxlIHRvIGRldGVybWluZSB3aGF0IGZ1bmN0aW9ucworCSAqIGFyZSBwcmVzZW50CisJICovCisJZm9yIChpID0gUERUX1NUQVJUX1NDQU5fTE9DQVRJT047IGkgPiBQRFRfRU5EX1NDQU5fTE9DQVRJT047CisJCQkJCQlpIC09IFBEVF9FTlRSWV9TSVpFKSB7CisJCXJldHZhbCA9IHN5bmFwdGljc19ybWk0X2kyY19ibG9ja19yZWFkKHBkYXRhLCBpLAorCQkJCQkJKHVuc2lnbmVkIGNoYXIgKikmcm1pX2ZkLAorCQkJCQkJc2l6ZW9mKHJtaV9mZCkpOworCQlpZiAocmV0dmFsICE9IHNpemVvZihybWlfZmQpKSB7CisJCQkvKiBmYWlsZWQgdG8gcmVhZCBuZXh0IFBEVCBlbnRyeSAqLworCQkJZGV2X2VycigmY2xpZW50LT5kZXYsICIlczogcmVhZCBlcnJvclxuIiwgX19mdW5jX18pOworCQkJcmV0dXJuIC1FSU87CisJCX0KKwkJcmZpID0gTlVMTDsKKwkJaWYgKHJtaV9mZC5mbl9udW1iZXIpIHsKKwkJCXN3aXRjaCAocm1pX2ZkLmZuX251bWJlciAmIE1BU0tfOEJJVCkgeworCQkJY2FzZSBTWU5BUFRJQ1NfUk1JNF9ERVZJQ0VfQ09OVFJPTF9GVU5DX05VTToKKwkJCQlwZGF0YS0+Zm4wMV9xdWVyeV9iYXNlX2FkZHIgPQorCQkJCQkJcm1pX2ZkLnF1ZXJ5X2Jhc2VfYWRkcjsKKwkJCQlwZGF0YS0+Zm4wMV9jdHJsX2Jhc2VfYWRkciA9CisJCQkJCQlybWlfZmQuY3RybF9iYXNlX2FkZHI7CisJCQkJcGRhdGEtPmZuMDFfZGF0YV9iYXNlX2FkZHIgPQorCQkJCQkJcm1pX2ZkLmRhdGFfYmFzZV9hZGRyOworCQkJCWJyZWFrOworCQkJY2FzZSBTWU5BUFRJQ1NfUk1JNF9UT1VDSFBBRF9GVU5DX05VTToKKwkJCQlpZiAocm1pX2ZkLmludHJfc3JjX2NvdW50KSB7CisJCQkJCXJmaSA9IGttYWxsb2Moc2l6ZW9mKCpyZmkpLAorCQkJCQkJCQlHRlBfS0VSTkVMKTsKKwkJCQkJaWYgKCFyZmkpIHsKKwkJCQkJCWRldl9lcnIoJmNsaWVudC0+ZGV2LAorCQkJCQkJCSIlczprbWFsbG9jIGZhaWxlZFxuIiwKKwkJCQkJCQkJX19mdW5jX18pOworCQkJCQkJCXJldHVybiAtRU5PTUVNOworCQkJCQl9CisJCQkJCXJldHZhbCA9IHN5bnBhdGljc19ybWk0X3RvdWNocGFkX2RldGVjdAorCQkJCQkJCQkocGRhdGEsCXJmaSwKKwkJCQkJCQkJJnJtaV9mZCwKKwkJCQkJCQkJaW50cl9jb3VudCk7CisJCQkJCWlmIChyZXR2YWwgPCAwKQorCQkJCQkJcmV0dXJuIHJldHZhbDsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQl9CisJCQkvKiBpbnRlcnJ1cHQgY291bnQgZm9yIG5leHQgaXRlcmF0aW9uICovCisJCQlpbnRyX2NvdW50ICs9IChybWlfZmQuaW50cl9zcmNfY291bnQgJiBNQVNLXzNCSVQpOworCQkJLyoKKwkJCSAqIFdlIG9ubHkgd2FudCB0byBhZGQgZnVuY3Rpb25zIHRvIHRoZSBsaXN0CisJCQkgKiB0aGF0IGhhdmUgZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlbS4KKwkJCSAqLworCQkJaWYgKHJmaSAmJiBybWlfZmQuaW50cl9zcmNfY291bnQpIHsKKwkJCQkvKiBsaW5rIHRoaXMgZnVuY3Rpb24gaW5mbyB0byB0aGUgUk1JIG1vZHVsZSAqLworCQkJCW11dGV4X2xvY2soJihwZGF0YS0+Zm5fbGlzdF9tdXRleCkpOworCQkJCWxpc3RfYWRkX3RhaWwoJnJmaS0+bGluaywKKwkJCQkJJnBkYXRhLT5ybWk0X21vZF9pbmZvLnN1cHBvcnRfZm5fbGlzdCk7CisJCQkJbXV0ZXhfdW5sb2NrKCYocGRhdGEtPmZuX2xpc3RfbXV0ZXgpKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8qCisJCQkgKiBBIHplcm8gaW4gdGhlIGZ1bmN0aW9uIG51bWJlcgorCQkJICogc2lnbmFscyB0aGUgZW5kIG9mIHRoZSBQRFQKKwkJCSAqLworCQkJZGV2X2RiZygmY2xpZW50LT5kZXYsCisJCQkJIiVzOmVuZCBvZiBQRFRcbiIsIF9fZnVuY19fKTsKKwkJCWJyZWFrOworCQl9CisJfQorCS8qCisJICogY2FsY3VsYXRlIHRoZSBpbnRlcnJ1cHQgcmVnaXN0ZXIgY291bnQgLSB1c2VkIGluIHRoZQorCSAqIElTUiB0byByZWFkIHRoZSBjb3JyZWN0IG51bWJlciBvZiBpbnRlcnJ1cHQgcmVnaXN0ZXJzCisJICovCisJcGRhdGEtPm51bWJlcl9vZl9pbnRlcnJ1cHRfcmVnaXN0ZXIgPSAoaW50cl9jb3VudCArIDcpIC8gODsKKwkvKgorCSAqIEZ1bmN0aW9uICQwMSB3aWxsIGJlIHVzZWQgdG8gcXVlcnkgdGhlIHByb2R1Y3QgcHJvcGVydGllcywKKwkgKiBhbmQgcHJvZHVjdCBJRCAgc28gd2UgaGFkIHRvIHJlYWQgdGhlIFBEVCBhYm92ZSBmaXJzdCB0byBnZXQKKwkgKiB0aGUgRm4gJDAxIHF1ZXJ5IGFkZHJlc3MgYW5kIHByaW9yIHRvIGZpbGxpbmcgaW4gdGhlIHByb2R1Y3QKKwkgKiBpbmZvLiBOT1RFOiBFdmVuIGFuIHVuZmxhc2hlZCBkZXZpY2Ugd2lsbCBzdGlsbCBoYXZlIEZOICQwMS4KKwkgKi8KKworCS8qIExvYWQgdXAgdGhlIHN0YW5kYXJkIHF1ZXJpZXMgYW5kIGdldCB0aGUgUk1JNCBtb2R1bGUgaW5mbyAqLworCXJldHZhbCA9IHN5bmFwdGljc19ybWk0X2kyY19ibG9ja19yZWFkKHBkYXRhLAorCQkJCQlwZGF0YS0+Zm4wMV9xdWVyeV9iYXNlX2FkZHIsCisJCQkJCXN0ZF9xdWVyaWVzLAorCQkJCQlzaXplb2Yoc3RkX3F1ZXJpZXMpKTsKKwlpZiAocmV0dmFsICE9IHNpemVvZihzdGRfcXVlcmllcykpIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICIlczpGYWlsZWQgcmVhZGluZyBxdWVyaWVzXG4iLAorCQkJCQkJCV9fZnVuY19fKTsKKwkJIHJldHVybiAtRUlPOworCX0KKworCS8qIEN1cnJlbnRseSBzdXBwb3J0ZWQgUk1JIHZlcnNpb24gaXMgNC4wICovCisJcGRhdGEtPnJtaTRfbW9kX2luZm8udmVyc2lvbl9tYWpvcgk9IDQ7CisJcGRhdGEtPnJtaTRfbW9kX2luZm8udmVyc2lvbl9taW5vcgk9IDA7CisJLyoKKwkgKiBnZXQgbWFudWZhY3R1cmVyIGlkLCBwcm9kdWN0X3Byb3BzLCBwcm9kdWN0IGluZm8sCisJICogZGF0ZSBjb2RlLCB0ZXN0ZXIgaWQsIHNlcmlhbCBudW0gYW5kIHByb2R1Y3QgaWQgKG5hbWUpCisJICovCisJcGRhdGEtPnJtaTRfbW9kX2luZm8ubWFudWZhY3R1cmVyX2lkCT0gc3RkX3F1ZXJpZXNbMF07CisJcGRhdGEtPnJtaTRfbW9kX2luZm8ucHJvZHVjdF9wcm9wcwk9IHN0ZF9xdWVyaWVzWzFdOworCXBkYXRhLT5ybWk0X21vZF9pbmZvLnByb2R1Y3RfaW5mb1swXQk9IHN0ZF9xdWVyaWVzWzJdOworCXBkYXRhLT5ybWk0X21vZF9pbmZvLnByb2R1Y3RfaW5mb1sxXQk9IHN0ZF9xdWVyaWVzWzNdOworCS8qIHllYXIgLSAyMDAxLTIwMzIgKi8KKwlwZGF0YS0+cm1pNF9tb2RfaW5mby5kYXRlX2NvZGVbMF0JPSBzdGRfcXVlcmllc1s0XSAmIE1BU0tfNUJJVDsKKwkvKiBtb250aCAtIDEtMTIgKi8KKwlwZGF0YS0+cm1pNF9tb2RfaW5mby5kYXRlX2NvZGVbMV0JPSBzdGRfcXVlcmllc1s1XSAmIE1BU0tfNEJJVDsKKwkvKiBkYXkgLSAxLTMxICovCisJcGRhdGEtPnJtaTRfbW9kX2luZm8uZGF0ZV9jb2RlWzJdCT0gc3RkX3F1ZXJpZXNbNl0gJiBNQVNLXzVCSVQ7CisJcGRhdGEtPnJtaTRfbW9kX2luZm8udGVzdGVyX2lkID0gKChzdGRfcXVlcmllc1s3XSAmIE1BU0tfN0JJVCkgPDwgOCkgfAorCQkJCQkJKHN0ZF9xdWVyaWVzWzhdICYgTUFTS183QklUKTsKKwlwZGF0YS0+cm1pNF9tb2RfaW5mby5zZXJpYWxfbnVtYmVyID0KKwkJKChzdGRfcXVlcmllc1s5XSAmIE1BU0tfN0JJVCkgPDwgOCkgfAorCQkJCShzdGRfcXVlcmllc1sxMF0gJiBNQVNLXzdCSVQpOworCW1lbWNweShwZGF0YS0+cm1pNF9tb2RfaW5mby5wcm9kdWN0X2lkX3N0cmluZywgJnN0ZF9xdWVyaWVzWzExXSwgMTApOworCisJLyogQ2hlY2sgaWYgdGhpcyBpcyBhIFN5bmFwdGljcyBkZXZpY2UgLSByZXBvcnQgaWYgbm90LiAqLworCWlmIChwZGF0YS0+cm1pNF9tb2RfaW5mby5tYW51ZmFjdHVyZXJfaWQgIT0gMSkKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICIlczogbm9uLVN5bmFwdGljcyBtZmcgaWQ6JWRcbiIsCisJCQlfX2Z1bmNfXywgcGRhdGEtPnJtaTRfbW9kX2luZm8ubWFudWZhY3R1cmVyX2lkKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkocmZpLCAmcGRhdGEtPnJtaTRfbW9kX2luZm8uc3VwcG9ydF9mbl9saXN0LCBsaW5rKQorCQlkYXRhX3NvdXJjZXMgKz0gcmZpLT5udW1fb2ZfZGF0YV9zb3VyY2VzOworCWlmIChkYXRhX3NvdXJjZXMpIHsKKwkJcm1pID0gJihwZGF0YS0+cm1pNF9tb2RfaW5mbyk7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkocmZpLCAmcm1pLT5zdXBwb3J0X2ZuX2xpc3QsIGxpbmspIHsKKwkJCWlmIChyZmktPm51bV9vZl9kYXRhX3NvdXJjZXMpIHsKKwkJCQlpZiAocmZpLT5mbl9udW1iZXIgPT0KKwkJCQkJU1lOQVBUSUNTX1JNSTRfVE9VQ0hQQURfRlVOQ19OVU0pIHsKKwkJCQkJcmV0dmFsID0gc3lucGF0aWNzX3JtaTRfdG91Y2hwYWRfY29uZmlnCisJCQkJCQkJCShwZGF0YSwgcmZpKTsKKwkJCQkJaWYgKHJldHZhbCA8IDApCisJCQkJCQlyZXR1cm4gcmV0dmFsOworCQkJCX0gZWxzZQorCQkJCQlkZXZfZXJyKCZjbGllbnQtPmRldiwKKwkJCQkJCSIlczpmbl9udW1iZXIgbm90IHN1cHBvcnRlZFxuIiwKKwkJCQkJCQkJX19mdW5jX18pOworCQkJCS8qCisJCQkJICogVHVybiBvbiBpbnRlcnJ1cHRzIGZvciB0aGlzCisJCQkJICogZnVuY3Rpb24ncyBkYXRhIHNvdXJjZXMuCisJCQkJICovCisJCQkJY3RybF9vZmZzZXQgPSBwZGF0YS0+Zm4wMV9jdHJsX2Jhc2VfYWRkciArIDEgKworCQkJCQkJCXJmaS0+aW5kZXhfdG9faW50cl9yZWc7CisJCQkJcmV0dmFsID0gc3luYXB0aWNzX3JtaTRfaTJjX2J5dGVfd3JpdGUocGRhdGEsCisJCQkJCQkJY3RybF9vZmZzZXQsCisJCQkJCQkJcmZpLT5pbnRyX21hc2spOworCQkJCWlmIChyZXR2YWwgPCAwKQorCQkJCQlyZXR1cm4gcmV0dmFsOworCQkJfQorCQl9CisJfQorCXJldHVybiAwOworfQorCisvKioKKyAqIHN5bmFwdGljc19ybWk0X3Byb2JlKCkgLSBJbml0aWFsemUgdGhlIGkyYy1jbGllbnQgdG91Y2hzY3JlZW4gZHJpdmVyCisgKiBAaTJjOiBpMmMgY2xpZW50IHN0cnVjdHVyZSBwb2ludGVyCisgKiBAaWQ6aTJjIGRldmljZSBpZCBwb2ludGVyCisgKgorICogVGhpcyBmdW5jdGlvbiB3aWxsIGFsbG9jYXRlIGFuZCBpbml0aWFsaXplIHRoZSBpbnN0YW5jZQorICogZGF0YSBhbmQgcmVxdWVzdCB0aGUgaXJxIGFuZCBzZXQgdGhlIGluc3RhbmNlIGRhdGEgYXMgdGhlIGNsaWVudHMKKyAqIHBsYXRmb3JtIGRhdGEgdGhlbiByZWdpc3RlciB0aGUgcGh5c2ljYWwgZHJpdmVyIHdoaWNoIHdpbGwgZG8gYSBzY2FuIG9mCisgKiB0aGUgcm1pNCBQaHlzaWNhbCBEZXZpY2UgVGFibGUgYW5kIGVudW1lcmF0ZSBhbnkgcm1pNCBmdW5jdGlvbnMgdGhhdAorICogaGF2ZSBkYXRhIHNvdXJjZXMgYXNzb2NpYXRlZCB3aXRoIHRoZW0uCisgKi8KK3N0YXRpYyBpbnQgX19kZXZpbml0IHN5bmFwdGljc19ybWk0X3Byb2JlCisJKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICpkZXZfaWQpCit7CisJaW50IHJldHZhbDsKKwl1bnNpZ25lZCBjaGFyIGludHJfc3RhdHVzWzRdOworCXN0cnVjdCBzeW5hcHRpY3Nfcm1pNF9kYXRhICpybWk0X2RhdGE7CisJY29uc3Qgc3RydWN0IHN5bmFwdGljc19ybWk0X3BsYXRmb3JtX2RhdGEgKnBsYXRmb3JtZGF0YSA9CisJCQkJCQljbGllbnQtPmRldi5wbGF0Zm9ybV9kYXRhOworCisJaWYgKCFpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eShjbGllbnQtPmFkYXB0ZXIsCisJCQkJCUkyQ19GVU5DX1NNQlVTX0JZVEVfREFUQSkpIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJpMmMgc21idXMgYnl0ZSBkYXRhIG5vdCBzdXBwb3J0ZWRcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlpZiAoIXBsYXRmb3JtZGF0YSkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIiVzOiBubyBwbGF0Zm9ybSBkYXRhXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIEFsbG9jYXRlIGFuZCBpbml0aWFsaXplIHRoZSBpbnN0YW5jZSBkYXRhIGZvciB0aGlzIGNsaWVudCAqLworCXJtaTRfZGF0YSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBzeW5hcHRpY3Nfcm1pNF9kYXRhKSAqIDIsCisJCQkJCQkJR0ZQX0tFUk5FTCk7CisJaWYgKCFybWk0X2RhdGEpIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICIlczogbm8gbWVtb3J5IGFsbG9jYXRlZFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlybWk0X2RhdGEtPmlucHV0X2RldiA9IGlucHV0X2FsbG9jYXRlX2RldmljZSgpOworCWlmIChybWk0X2RhdGEtPmlucHV0X2RldiA9PSBOVUxMKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiJXM6aW5wdXQgZGV2aWNlIGFsbG9jIGZhaWxlZFxuIiwKKwkJCQkJCV9fZnVuY19fKTsKKwkJcmV0dmFsID0gLUVOT01FTTsKKwkJZ290byBlcnJfaW5wdXQ7CisJfQorCisJZGV2X3NldF9uYW1lKCZjbGllbnQtPmRldiwgcGxhdGZvcm1kYXRhLT5uYW1lKTsKKworCWlmIChwbGF0Zm9ybWRhdGEtPnJlZ3VsYXRvcl9lbikgeworCQlybWk0X2RhdGEtPnJlZ3VsYXRvciA9IHJlZ3VsYXRvcl9nZXQoJmNsaWVudC0+ZGV2LCAidi10b3VjaCIpOworCQlpZiAoSVNfRVJSKHJtaTRfZGF0YS0+cmVndWxhdG9yKSkgeworCQkJZGV2X2VycigmY2xpZW50LT5kZXYsICIlczpnZXQgcmVndWxhdG9yIGZhaWxlZFxuIiwKKwkJCQkJCQkJX19mdW5jX18pOworCQkJcmV0dmFsID0gUFRSX0VSUihybWk0X2RhdGEtPnJlZ3VsYXRvcik7CisJCQlnb3RvIGVycl9yZWd1bGF0b3I7CisJCX0KKwkJcmVndWxhdG9yX2VuYWJsZShybWk0X2RhdGEtPnJlZ3VsYXRvcik7CisJfQorCisJaW5pdF93YWl0cXVldWVfaGVhZCgmcm1pNF9kYXRhLT53YWl0KTsKKwkvKgorCSAqIENvcHkgaTJjX2NsaWVudCBwb2ludGVyIGludG8gUlRJRCdzIGkyY19jbGllbnQgcG9pbnRlciBmb3IKKwkgKiBsYXRlciB1c2UgaW4gcm1pNF9yZWFkLCBybWk0X3dyaXRlLCBldGMuCisJICovCisJcm1pNF9kYXRhLT5pMmNfY2xpZW50CQk9IGNsaWVudDsKKwkvKiBTbyB3ZSBzZXQgdGhlIHBhZ2UgY29ycmVjdGx5IHRoZSBmaXJzdCB0aW1lICovCisJcm1pNF9kYXRhLT5jdXJyZW50X3BhZ2UJCT0gTUFTS18xNkJJVDsKKwlybWk0X2RhdGEtPmJvYXJkCQk9IHBsYXRmb3JtZGF0YTsKKwlybWk0X2RhdGEtPnRvdWNoX3N0b3BwZWQJPSBmYWxzZTsKKworCS8qIGluaXQgdGhlIG11dGV4ZXMgZm9yIG1haW50YWluIHRoZSBsaXN0cyAqLworCW11dGV4X2luaXQoJihybWk0X2RhdGEtPmZuX2xpc3RfbXV0ZXgpKTsKKwltdXRleF9pbml0KCYocm1pNF9kYXRhLT5ybWk0X3BhZ2VfbXV0ZXgpKTsKKworCS8qCisJICogUmVnaXN0ZXIgcGh5c2ljYWwgZHJpdmVyIC0gdGhpcyB3aWxsIGNhbGwgdGhlIGRldGVjdCBmdW5jdGlvbiB0aGF0CisJICogd2lsbCB0aGVuIHNjYW4gdGhlIGRldmljZSBhbmQgZGV0ZXJtaW5lIHRoZSBzdXBwb3J0ZWQKKwkgKiBybWk0IGZ1bmN0aW9ucy4KKwkgKi8KKwlyZXR2YWwgPSBzeW5hcHRpY3Nfcm1pNF9pMmNfcXVlcnlfZGV2aWNlKHJtaTRfZGF0YSk7CisJaWYgKHJldHZhbCkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIiVzOiBybWk0IHF1ZXJ5IGRldmljZSBmYWlsZWRcbiIsCisJCQkJCQkJX19mdW5jX18pOworCQlnb3RvIGVycl9xdWVyeV9kZXY7CisJfQorCisJLyogU3RvcmUgdGhlIGluc3RhbmNlIGRhdGEgaW4gdGhlIGkyY19jbGllbnQgKi8KKwlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBybWk0X2RhdGEpOworCisJLyppbml0aWFsaXplIHRoZSBpbnB1dCBkZXZpY2UgcGFyYW1ldGVycyAqLworCXJtaTRfZGF0YS0+aW5wdXRfZGV2LT5uYW1lCT0gRFJJVkVSX05BTUU7CisJcm1pNF9kYXRhLT5pbnB1dF9kZXYtPnBoeXMJPSAiU3luYXB0aWNzX0NsZWFycGFkIjsKKwlybWk0X2RhdGEtPmlucHV0X2Rldi0+aWQuYnVzdHlwZSA9IEJVU19JMkM7CisJcm1pNF9kYXRhLT5pbnB1dF9kZXYtPmRldi5wYXJlbnQgPSAmY2xpZW50LT5kZXY7CisJaW5wdXRfc2V0X2RydmRhdGEocm1pNF9kYXRhLT5pbnB1dF9kZXYsIHJtaTRfZGF0YSk7CisKKwkvKiBJbml0aWFsaXplIHRoZSBmdW5jdGlvbiBoYW5kbGVycyBmb3Igcm1pNCAqLworCXNldF9iaXQoRVZfU1lOLCBybWk0X2RhdGEtPmlucHV0X2Rldi0+ZXZiaXQpOworCXNldF9iaXQoRVZfS0VZLCBybWk0X2RhdGEtPmlucHV0X2Rldi0+ZXZiaXQpOworCXNldF9iaXQoRVZfQUJTLCBybWk0X2RhdGEtPmlucHV0X2Rldi0+ZXZiaXQpOworCisJaW5wdXRfc2V0X2Fic19wYXJhbXMocm1pNF9kYXRhLT5pbnB1dF9kZXYsIEFCU19NVF9QT1NJVElPTl9YLCAwLAorCQkJCQlybWk0X2RhdGEtPnNlbnNvcl9tYXhfeCwgMCwgMCk7CisJaW5wdXRfc2V0X2Fic19wYXJhbXMocm1pNF9kYXRhLT5pbnB1dF9kZXYsIEFCU19NVF9QT1NJVElPTl9ZLCAwLAorCQkJCQlybWk0X2RhdGEtPnNlbnNvcl9tYXhfeSwgMCwgMCk7CisJaW5wdXRfc2V0X2Fic19wYXJhbXMocm1pNF9kYXRhLT5pbnB1dF9kZXYsIEFCU19NVF9UT1VDSF9NQUpPUiwgMCwKKwkJCQkJCU1BWF9UT1VDSF9NQUpPUiwgMCwgMCk7CisKKwlyZXR2YWwgPSBpbnB1dF9yZWdpc3Rlcl9kZXZpY2Uocm1pNF9kYXRhLT5pbnB1dF9kZXYpOworCWlmIChyZXR2YWwpIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICIlczppbnB1dCByZWdpc3RlciBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKwkJZ290byBlcnJfaW5wdXRfcmVnaXN0ZXI7CisJfQorCisJLyogQ2xlYXIgaW50ZXJydXB0cyAqLworCXN5bmFwdGljc19ybWk0X2kyY19ibG9ja19yZWFkKHJtaTRfZGF0YSwKKwkJCXJtaTRfZGF0YS0+Zm4wMV9kYXRhX2Jhc2VfYWRkciArIDEsIGludHJfc3RhdHVzLAorCQkJCXJtaTRfZGF0YS0+bnVtYmVyX29mX2ludGVycnVwdF9yZWdpc3Rlcik7CisJcmV0dmFsID0gcmVxdWVzdF90aHJlYWRlZF9pcnEocGxhdGZvcm1kYXRhLT5pcnFfbnVtYmVyLCBOVUxMLAorCQkJCQlzeW5hcHRpY3Nfcm1pNF9pcnEsCisJCQkJCXBsYXRmb3JtZGF0YS0+aXJxX3R5cGUsCisJCQkJCXBsYXRmb3JtZGF0YS0+bmFtZSwgcm1pNF9kYXRhKTsKKwlpZiAocmV0dmFsKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiJXM6VW5hYmxlIHRvIGdldCBhdHRuIGlycSAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgcGxhdGZvcm1kYXRhLT5pcnFfbnVtYmVyKTsKKwkJZ290byBlcnJfcmVxdWVzdF9pcnE7CisJfQorCisJcmV0dXJuIHJldHZhbDsKKworZXJyX3JlcXVlc3RfaXJxOgorCWZyZWVfaXJxKHBsYXRmb3JtZGF0YS0+aXJxX251bWJlciwgcm1pNF9kYXRhKTsKKwlpbnB1dF91bnJlZ2lzdGVyX2RldmljZShybWk0X2RhdGEtPmlucHV0X2Rldik7CitlcnJfaW5wdXRfcmVnaXN0ZXI6CisJaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgTlVMTCk7CitlcnJfcXVlcnlfZGV2OgorCWlmIChwbGF0Zm9ybWRhdGEtPnJlZ3VsYXRvcl9lbikgeworCQlyZWd1bGF0b3JfZGlzYWJsZShybWk0X2RhdGEtPnJlZ3VsYXRvcik7CisJCXJlZ3VsYXRvcl9wdXQocm1pNF9kYXRhLT5yZWd1bGF0b3IpOworCX0KK2Vycl9yZWd1bGF0b3I6CisJaW5wdXRfZnJlZV9kZXZpY2Uocm1pNF9kYXRhLT5pbnB1dF9kZXYpOworCXJtaTRfZGF0YS0+aW5wdXRfZGV2ID0gTlVMTDsKK2Vycl9pbnB1dDoKKwlrZnJlZShybWk0X2RhdGEpOworCisJcmV0dXJuIHJldHZhbDsKK30KKy8qKgorICogc3luYXB0aWNzX3JtaTRfcmVtb3ZlKCkgLSBSZW1vdmVzIHRoZSBpMmMtY2xpZW50IHRvdWNoc2NyZWVuIGRyaXZlcgorICogQGNsaWVudDogaTJjIGNsaWVudCBzdHJ1Y3R1cmUgcG9pbnRlcgorICoKKyAqIFRoaXMgZnVudGlvbiB1c2VzIHRvIHJlbW92ZSB0aGUgaTJjLWNsaWVudAorICogdG91Y2hzY3JlZW4gZHJpdmVyIGFuZCByZXR1cm5zIGludGVnZXIuCisgKi8KK3N0YXRpYyBpbnQgX19kZXZleGl0IHN5bmFwdGljc19ybWk0X3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXN0cnVjdCBzeW5hcHRpY3Nfcm1pNF9kYXRhICpybWk0X2RhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwljb25zdCBzdHJ1Y3Qgc3luYXB0aWNzX3JtaTRfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBybWk0X2RhdGEtPmJvYXJkOworCisJcm1pNF9kYXRhLT50b3VjaF9zdG9wcGVkID0gdHJ1ZTsKKwl3YWtlX3VwKCZybWk0X2RhdGEtPndhaXQpOworCWZyZWVfaXJxKHBkYXRhLT5pcnFfbnVtYmVyLCBybWk0X2RhdGEpOworCWlucHV0X3VucmVnaXN0ZXJfZGV2aWNlKHJtaTRfZGF0YS0+aW5wdXRfZGV2KTsKKwlpZiAocGRhdGEtPnJlZ3VsYXRvcl9lbikgeworCQlyZWd1bGF0b3JfZGlzYWJsZShybWk0X2RhdGEtPnJlZ3VsYXRvcik7CisJCXJlZ3VsYXRvcl9wdXQocm1pNF9kYXRhLT5yZWd1bGF0b3IpOworCX0KKwlrZnJlZShybWk0X2RhdGEpOworCisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBDT05GSUdfUE0KKy8qKgorICogc3luYXB0aWNzX3JtaTRfc3VzcGVuZCgpIC0gc3VzcGVuZCB0aGUgdG91Y2ggc2NyZWVuIGNvbnRyb2xsZXIKKyAqIEBkZXY6IHBvaW50ZXIgdG8gZGV2aWNlIHN0cnVjdHVyZQorICoKKyAqIFRoaXMgZnVudGlvbiBpcyB1c2VkIHRvIHN1c3BlbmQgdGhlCisgKiB0b3VjaCBwYW5lbCBjb250cm9sbGVyIGFuZCByZXR1cm5zIGludGVnZXIKKyAqLworc3RhdGljIGludCBzeW5hcHRpY3Nfcm1pNF9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwkvKiBUb3VjaCBzbGVlcCBtb2RlICovCisJaW50IHJldHZhbDsKKwl1bnNpZ25lZCBjaGFyIGludHJfc3RhdHVzOworCXN0cnVjdCBzeW5hcHRpY3Nfcm1pNF9kYXRhICpybWk0X2RhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwljb25zdCBzdHJ1Y3Qgc3luYXB0aWNzX3JtaTRfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBybWk0X2RhdGEtPmJvYXJkOworCisJcm1pNF9kYXRhLT50b3VjaF9zdG9wcGVkID0gdHJ1ZTsKKwlkaXNhYmxlX2lycShwZGF0YS0+aXJxX251bWJlcik7CisKKwlyZXR2YWwgPSBzeW5hcHRpY3Nfcm1pNF9pMmNfYmxvY2tfcmVhZChybWk0X2RhdGEsCisJCQkJcm1pNF9kYXRhLT5mbjAxX2RhdGFfYmFzZV9hZGRyICsgMSwKKwkJCQkmaW50cl9zdGF0dXMsCisJCQkJcm1pNF9kYXRhLT5udW1iZXJfb2ZfaW50ZXJydXB0X3JlZ2lzdGVyKTsKKwlpZiAocmV0dmFsIDwgMCkKKwkJcmV0dXJuIHJldHZhbDsKKworCXJldHZhbCA9IHN5bmFwdGljc19ybWk0X2kyY19ieXRlX3dyaXRlKHJtaTRfZGF0YSwKKwkJCQkJcm1pNF9kYXRhLT5mbjAxX2N0cmxfYmFzZV9hZGRyICsgMSwKKwkJCQkJKGludHJfc3RhdHVzICYgflRPVUNIUEFEX0NUUkxfSU5UUikpOworCWlmIChyZXR2YWwgPCAwKQorCQlyZXR1cm4gcmV0dmFsOworCisJaWYgKHBkYXRhLT5yZWd1bGF0b3JfZW4pCisJCXJlZ3VsYXRvcl9kaXNhYmxlKHJtaTRfZGF0YS0+cmVndWxhdG9yKTsKKworCXJldHVybiAwOworfQorLyoqCisgKiBzeW5hcHRpY3Nfcm1pNF9yZXN1bWUoKSAtIHJlc3VtZSB0aGUgdG91Y2ggc2NyZWVuIGNvbnRyb2xsZXIKKyAqIEBkZXY6IHBvaW50ZXIgdG8gZGV2aWNlIHN0cnVjdHVyZQorICoKKyAqIFRoaXMgZnVudGlvbiBpcyB1c2VkIHRvIHJlc3VtZSB0aGUgdG91Y2ggcGFuZWwKKyAqIGNvbnRyb2xsZXIgYW5kIHJldHVybnMgaW50ZWdlci4KKyAqLworc3RhdGljIGludCBzeW5hcHRpY3Nfcm1pNF9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQoreworCWludCByZXR2YWw7CisJdW5zaWduZWQgY2hhciBpbnRyX3N0YXR1czsKKwlzdHJ1Y3Qgc3luYXB0aWNzX3JtaTRfZGF0YSAqcm1pNF9kYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJY29uc3Qgc3RydWN0IHN5bmFwdGljc19ybWk0X3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gcm1pNF9kYXRhLT5ib2FyZDsKKworCWlmIChwZGF0YS0+cmVndWxhdG9yX2VuKQorCQlyZWd1bGF0b3JfZW5hYmxlKHJtaTRfZGF0YS0+cmVndWxhdG9yKTsKKworCWVuYWJsZV9pcnEocGRhdGEtPmlycV9udW1iZXIpOworCXJtaTRfZGF0YS0+dG91Y2hfc3RvcHBlZCA9IGZhbHNlOworCisJcmV0dmFsID0gc3luYXB0aWNzX3JtaTRfaTJjX2Jsb2NrX3JlYWQocm1pNF9kYXRhLAorCQkJCXJtaTRfZGF0YS0+Zm4wMV9kYXRhX2Jhc2VfYWRkciArIDEsCisJCQkJJmludHJfc3RhdHVzLAorCQkJCXJtaTRfZGF0YS0+bnVtYmVyX29mX2ludGVycnVwdF9yZWdpc3Rlcik7CisJaWYgKHJldHZhbCA8IDApCisJCXJldHVybiByZXR2YWw7CisKKwlyZXR2YWwgPSBzeW5hcHRpY3Nfcm1pNF9pMmNfYnl0ZV93cml0ZShybWk0X2RhdGEsCisJCQkJCXJtaTRfZGF0YS0+Zm4wMV9jdHJsX2Jhc2VfYWRkciArIDEsCisJCQkJCShpbnRyX3N0YXR1cyB8IFRPVUNIUEFEX0NUUkxfSU5UUikpOworCWlmIChyZXR2YWwgPCAwKQorCQlyZXR1cm4gcmV0dmFsOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyBzeW5hcHRpY3Nfcm1pNF9kZXZfcG1fb3BzID0geworCS5zdXNwZW5kID0gc3luYXB0aWNzX3JtaTRfc3VzcGVuZCwKKwkucmVzdW1lICA9IHN5bmFwdGljc19ybWk0X3Jlc3VtZSwKK307CisjZW5kaWYKKworc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIHN5bmFwdGljc19ybWk0X2lkX3RhYmxlW10gPSB7CisJeyBEUklWRVJfTkFNRSwgMCB9LAorCXsgfSwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgc3luYXB0aWNzX3JtaTRfaWRfdGFibGUpOworCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgc3luYXB0aWNzX3JtaTRfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lCT0JRFJJVkVSX05BTUUsCisJCS5vd25lcgk9CVRISVNfTU9EVUxFLAorI2lmZGVmIENPTkZJR19QTQorCQkucG0JPQkmc3luYXB0aWNzX3JtaTRfZGV2X3BtX29wcywKKyNlbmRpZgorCX0sCisJLnByb2JlCQk9CXN5bmFwdGljc19ybWk0X3Byb2JlLAorCS5yZW1vdmUJCT0JX19kZXZleGl0X3Aoc3luYXB0aWNzX3JtaTRfcmVtb3ZlKSwKKwkuaWRfdGFibGUJPQlzeW5hcHRpY3Nfcm1pNF9pZF90YWJsZSwKK307CisvKioKKyAqIHN5bmFwdGljc19ybWk0X2luaXQoKSAtIEluaXRpYWxpemUgdGhlIHRvdWNoc2NyZWVuIGRyaXZlcgorICoKKyAqIFRoaXMgZnVudGlvbiB1c2VzIHRvIGluaXRpYWxpemVzIHRoZSBzeW5hcHRpY3MKKyAqIHRvdWNoc2NyZWVuIGRyaXZlciBhbmQgcmV0dXJucyBpbnRlZ2VyLgorICovCitzdGF0aWMgaW50IF9faW5pdCBzeW5hcHRpY3Nfcm1pNF9pbml0KHZvaWQpCit7CisJcmV0dXJuIGkyY19hZGRfZHJpdmVyKCZzeW5hcHRpY3Nfcm1pNF9kcml2ZXIpOworfQorLyoqCisgKiBzeW5hcHRpY3Nfcm1pNF9leGl0KCkgLSBEZS1pbml0aWFsaXplIHRoZSB0b3VjaHNjcmVlbiBkcml2ZXIKKyAqCisgKiBUaGlzIGZ1bnRpb24gdXNlcyB0byBkZS1pbml0aWFsaXplIHRoZSBzeW5hcHRpY3MKKyAqIHRvdWNoc2NyZWVuIGRyaXZlciBhbmQgcmV0dXJucyBub25lLgorICovCitzdGF0aWMgdm9pZCBfX2V4aXQgc3luYXB0aWNzX3JtaTRfZXhpdCh2b2lkKQoreworCWkyY19kZWxfZHJpdmVyKCZzeW5hcHRpY3Nfcm1pNF9kcml2ZXIpOworfQorCisKK21vZHVsZV9pbml0KHN5bmFwdGljc19ybWk0X2luaXQpOworbW9kdWxlX2V4aXQoc3luYXB0aWNzX3JtaTRfZXhpdCk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKK01PRFVMRV9BVVRIT1IoIm5hdmVlbi5nYWRkaXBhdGlAc3Rlcmljc3Nvbi5jb20sIGpzLmhhQHN0ZXJpY3Nzb24uY29tIik7CitNT0RVTEVfREVTQ1JJUFRJT04oInN5bmFwdGljcyBybWk0IGkyYyB0b3VjaCBEcml2ZXIiKTsKK01PRFVMRV9BTElBUygiaTJjOnN5bmFwdGljc19ybWk0X3RzIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc3RlX3JtaTQvc3luYXB0aWNzX2kyY19ybWk0LmggYi9kcml2ZXJzL3N0YWdpbmcvc3RlX3JtaTQvc3luYXB0aWNzX2kyY19ybWk0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODIwYWUyNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zdGVfcm1pNC9zeW5hcHRpY3NfaTJjX3JtaTQuaApAQCAtMCwwICsxLDUwIEBACisvKioKKyAqCisgKiBTeW5hcHRpY3MgUmVnaXN0ZXIgTWFwcGVkIEludGVyZmFjZSAoUk1JNCkgSTJDIFBoeXNpY2FsIExheWVyIERyaXZlci4KKyAqIENvcHlyaWdodCAoYykgMjAwNy0yMDEwLCBTeW5hcHRpY3MgSW5jb3Jwb3JhdGVkCisgKgorICogQXV0aG9yOiBKcyBIQSA8anMuaGFAc3Rlcmljc3Nvbi5jb20+IGZvciBTVC1Fcmljc3NvbgorICogQXV0aG9yOiBOYXZlZW4gS3VtYXIgRyA8bmF2ZWVuLmdhZGRpcGF0aUBzdGVyaWNzc29uLmNvbT4gZm9yIFNULUVyaWNzc29uCisgKiBDb3B5cmlnaHQgMjAxMCAoYykgU1QtRXJpY3Nzb24gQUIKKyAqLworLyoKKyAqIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgR1BMMiBsaWNlbnNlLgorICoKKyAqIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAqIEdQTAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQKKyAqIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKKyAqIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgKi8KKworI2lmbmRlZiBfU1lOQVBUSUNTX1JNSTRfSF9JTkNMVURFRF8KKyNkZWZpbmUgX1NZTkFQVElDU19STUk0X0hfSU5DTFVERURfCisKKy8qKgorICogc3RydWN0IHN5bmFwdGljc19ybWk0X3BsYXRmb3JtX2RhdGEgLSBjb250YWlucyB0aGUgcm1pNCBwbGF0Zm9ybSBkYXRhCisgKiBAaXJxX251bWJlcjogaXJxIG51bWJlcgorICogQGlycV90eXBlOiBpcnEgdHlwZQorICogQHggZmxpcDogeCBmbGlwIGZsYWcKKyAqIEB5IGZsaXA6IHkgZmxpcCBmbGFnCisgKiBAcmVndWxhdG9yX2VuOiByZWd1bGF0b3IgZW5hYmxlIGZsYWcKKyAqCisgKiBUaGlzIHN0cnVjdHVyZSBnaXZlcyBwbGF0Zm9ybSBkYXRhIGZvciBybWk0LgorICovCitzdHJ1Y3Qgc3luYXB0aWNzX3JtaTRfcGxhdGZvcm1fZGF0YSB7CisJY29uc3QgY2hhciAqbmFtZTsKKwlpbnQgaXJxX251bWJlcjsKKwlpbnQgaXJxX3R5cGU7CisJYm9vbCB4X2ZsaXA7CisJYm9vbCB5X2ZsaXA7CisJYm9vbCByZWd1bGF0b3JfZW47Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9jb3JlL3Rpb21hcDM0MzAuYyBiL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9jb3JlL3Rpb21hcDM0MzAuYwppbmRleCAxYmUwODFmLi5hM2IwYTE4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvY29yZS90aW9tYXAzNDMwLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL2NvcmUvdGlvbWFwMzQzMC5jCkBAIC01OTYsNyArNTk2LDcgQEAKIAkJZGV2X2RiZyhicmlkZ2UsICJEU1AgY19pbnQwMCBBZGRyZXNzID0gIDB4JXhcbiIsIGRzcF9hZGRyKTsKIAkJaWYgKGRzcF9kZWJ1ZykKIAkJCXdoaWxlIChfX3Jhd19yZWFkdyhkd19zeW5jX2FkZHIpKQotCQkJCTs7CisJCQkJOwogCiAJCS8qIFdhaXQgZm9yIERTUCB0byBjbGVhciB3b3JkIGluIHNoYXJlZCBtZW1vcnkgKi8KIAkJLyogUmVhZCB0aGUgTG9jYXRpb24gKi8KQEAgLTE2NzEsNyArMTY3MSw3IEBACiAJCQkvKiBGaW5kIGEgZnJlZSBMMiBQVC4gKi8KIAkJCWZvciAoaSA9IDA7IChpIDwgcHQtPmwyX251bV9wYWdlcykgJiYKIAkJCSAgICAgKHB0LT5wZ19pbmZvW2ldLm51bV9lbnRyaWVzICE9IDApOyBpKyspCi0JCQkJOzsKKwkJCQk7CiAJCQlpZiAoaSA8IHB0LT5sMl9udW1fcGFnZXMpIHsKIAkJCQlsMl9wYWdlX251bSA9IGk7CiAJCQkJbDJfYmFzZV9wYSA9IHB0LT5sMl9iYXNlX3BhICsgKGwyX3BhZ2VfbnVtICoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9ybWdyL25sZHIuYyBiL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9ybWdyL25sZHIuYwppbmRleCBhNmFlMDA3Li4yODM1NGJiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2Uvcm1nci9ubGRyLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL3JtZ3Ivbmxkci5jCkBAIC05NDMsNyArOTQzLDcgQEAKIAogCS8qIERldGVybWluZSB3aGljaCBwaGFzZSB0aGlzIHNlY3Rpb24gYmVsb25ncyB0byAqLwogCWZvciAocGNoID0gc2VjdF9uYW1lICsgMTsgKnBjaCAmJiAqcGNoICE9IHNlcHM7IHBjaCsrKQotCQk7OworCQk7CiAKIAlpZiAoKnBjaCkgewogCQlwY2grKzsJCS8qIFNraXAgb3ZlciB0aGUgJzonICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvdmhjaV9oY2QuYyBiL2RyaXZlcnMvc3RhZ2luZy91c2JpcC92aGNpX2hjZC5jCmluZGV4IDgzMjYwOGQuLjA4YmQyNmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy91c2JpcC92aGNpX2hjZC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91c2JpcC92aGNpX2hjZC5jCkBAIC03OTksMjAgKzc5OSw2IEBACiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZkZXYtPnByaXZfbG9jaywgZmxhZ3MyKTsKIAl9CiAKLQotCWlmICghdmRldi0+dWQudGNwX3NvY2tldCkgewotCQkvKiB0Y3AgY29ubmVjdGlvbiBpcyBjbG9zZWQgKi8KLQkJdXNiaXBfdWluZm8oInZoY2lfaGNkOiB2aGNpX3VyYl9kZXF1ZXVlKCkgZ2l2ZXMgYmFjayB1cmIgJXBcbiIsCi0JCQkJCQkJCQl1cmIpOwotCi0JCXVzYl9oY2RfdW5saW5rX3VyYl9mcm9tX2VwKGhjZCwgdXJiKTsKLQotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0aGVfY29udHJvbGxlci0+bG9jaywgZmxhZ3MpOwotCQl1c2JfaGNkX2dpdmViYWNrX3VyYih2aGNpX3RvX2hjZCh0aGVfY29udHJvbGxlciksIHVyYiwKLQkJCQkJCQkJdXJiLT5zdGF0dXMpOwotCQlzcGluX2xvY2tfaXJxc2F2ZSgmdGhlX2NvbnRyb2xsZXItPmxvY2ssIGZsYWdzKTsKLQl9Ci0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0aGVfY29udHJvbGxlci0+bG9jaywgZmxhZ3MpOwogCiAJdXNiaXBfZGJnX3ZoY2lfaGMoImxlYXZlXG4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92bWUvYnJpZGdlcy9Nb2R1bGUuc3ltdmVycyBiL2RyaXZlcnMvc3RhZ2luZy92bWUvYnJpZGdlcy9Nb2R1bGUuc3ltdmVycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3ZtZS9icmlkZ2VzL01vZHVsZS5zeW12ZXJzCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdm1lL2JyaWRnZXMvdm1lX2NhOTFjeDQyLmMgYi9kcml2ZXJzL3N0YWdpbmcvdm1lL2JyaWRnZXMvdm1lX2NhOTFjeDQyLmMKaW5kZXggNGQ3NDU2Mi4uNDJkZTgzZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3ZtZS9icmlkZ2VzL3ZtZV9jYTkxY3g0Mi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92bWUvYnJpZGdlcy92bWVfY2E5MWN4NDIuYwpAQCAtNDQsNyArNDQsNyBAQAogCiBzdGF0aWMgY2hhciBkcml2ZXJfbmFtZVtdID0gInZtZV9jYTkxY3g0MiI7CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCBjYTkxY3g0Ml9pZHNbXSA9IHsKK3N0YXRpYyBERUZJTkVfUENJX0RFVklDRV9UQUJMRShjYTkxY3g0Ml9pZHMpID0gewogCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX1RVTkRSQSwgUENJX0RFVklDRV9JRF9UVU5EUkFfQ0E5MUMxNDIpIH0sCiAJeyB9LAogfTsKQEAgLTU4LDcgKzU4LDcgQEAKIAogc3RhdGljIHUzMiBjYTkxY3g0Ml9ETUFfaXJxaGFuZGxlcihzdHJ1Y3QgY2E5MWN4NDJfZHJpdmVyICpicmlkZ2UpCiB7Ci0Jd2FrZV91cCgmKGJyaWRnZS0+ZG1hX3F1ZXVlKSk7CisJd2FrZV91cCgmYnJpZGdlLT5kbWFfcXVldWUpOwogCiAJcmV0dXJuIENBOTFDWDQyX0xJTlRfRE1BOwogfQpAQCAtODIsMTQgKzgyLDE0IEBACiAvKiBYWFggVGhpcyBuZWVkcyB0byBiZSBzcGxpdCBpbnRvIDQgcXVldWVzICovCiBzdGF0aWMgdTMyIGNhOTFjeDQyX01CX2lycWhhbmRsZXIoc3RydWN0IGNhOTFjeDQyX2RyaXZlciAqYnJpZGdlLCBpbnQgbWJveF9tYXNrKQogewotCXdha2VfdXAoJihicmlkZ2UtPm1ib3hfcXVldWUpKTsKKwl3YWtlX3VwKCZicmlkZ2UtPm1ib3hfcXVldWUpOwogCiAJcmV0dXJuIENBOTFDWDQyX0xJTlRfTUJPWDsKIH0KIAogc3RhdGljIHUzMiBjYTkxY3g0Ml9JQUNLX2lycWhhbmRsZXIoc3RydWN0IGNhOTFjeDQyX2RyaXZlciAqYnJpZGdlKQogewotCXdha2VfdXAoJihicmlkZ2UtPmlhY2tfcXVldWUpKTsKKwl3YWtlX3VwKCZicmlkZ2UtPmlhY2tfcXVldWUpOwogCiAJcmV0dXJuIENBOTFDWDQyX0xJTlRfU1dfSUFDSzsKIH0KQEAgLTIwNyw5ICsyMDcsOSBAQAogCXBkZXYgPSBjb250YWluZXJfb2YoY2E5MWN4NDJfYnJpZGdlLT5wYXJlbnQsIHN0cnVjdCBwY2lfZGV2LCBkZXYpOwogCiAJLyogSW5pdGlhbGlzZSBsaXN0IGZvciBWTUUgYnVzIGVycm9ycyAqLwotCUlOSVRfTElTVF9IRUFEKCYoY2E5MWN4NDJfYnJpZGdlLT52bWVfZXJyb3JzKSk7CisJSU5JVF9MSVNUX0hFQUQoJmNhOTFjeDQyX2JyaWRnZS0+dm1lX2Vycm9ycyk7CiAKLQltdXRleF9pbml0KCYoY2E5MWN4NDJfYnJpZGdlLT5pcnFfbXR4KSk7CisJbXV0ZXhfaW5pdCgmY2E5MWN4NDJfYnJpZGdlLT5pcnFfbXR4KTsKIAogCS8qIERpc2FibGUgaW50ZXJydXB0cyBmcm9tIFBDSSB0byBWTUUgKi8KIAlpb3dyaXRlMzIoMCwgYnJpZGdlLT5iYXNlICsgVklOVF9FTik7CkBAIC0yNTksOCArMjU5LDggQEAKIC8qCiAgKiBTZXQgdXAgYW4gVk1FIGludGVycnVwdAogICovCi12b2lkIGNhOTFjeDQyX2lycV9zZXQoc3RydWN0IHZtZV9icmlkZ2UgKmNhOTFjeDQyX2JyaWRnZSwgaW50IGxldmVsLCBpbnQgc3RhdGUsCi0JaW50IHN5bmMpCitzdGF0aWMgdm9pZCBjYTkxY3g0Ml9pcnFfc2V0KHN0cnVjdCB2bWVfYnJpZGdlICpjYTkxY3g0Ml9icmlkZ2UsIGludCBsZXZlbCwKKwlpbnQgc3RhdGUsIGludCBzeW5jKQogCiB7CiAJc3RydWN0IHBjaV9kZXYgKnBkZXY7CkBAIC0yODcsNyArMjg3LDcgQEAKIAl9CiB9CiAKLWludCBjYTkxY3g0Ml9pcnFfZ2VuZXJhdGUoc3RydWN0IHZtZV9icmlkZ2UgKmNhOTFjeDQyX2JyaWRnZSwgaW50IGxldmVsLAorc3RhdGljIGludCBjYTkxY3g0Ml9pcnFfZ2VuZXJhdGUoc3RydWN0IHZtZV9icmlkZ2UgKmNhOTFjeDQyX2JyaWRnZSwgaW50IGxldmVsLAogCWludCBzdGF0aWQpCiB7CiAJdTMyIHRtcDsKQEAgLTI5OSw3ICsyOTksNyBAQAogCWlmIChzdGF0aWQgJiAxKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCW11dGV4X2xvY2soJihicmlkZ2UtPnZtZV9pbnQpKTsKKwltdXRleF9sb2NrKCZicmlkZ2UtPnZtZV9pbnQpOwogCiAJdG1wID0gaW9yZWFkMzIoYnJpZGdlLT5iYXNlICsgVklOVF9FTik7CiAKQEAgLTMxOCwxMiArMzE4LDEyIEBACiAJdG1wID0gdG1wICYgfigxIDw8IChsZXZlbCArIDI0KSk7CiAJaW93cml0ZTMyKHRtcCwgYnJpZGdlLT5iYXNlICsgVklOVF9FTik7CiAKLQltdXRleF91bmxvY2soJihicmlkZ2UtPnZtZV9pbnQpKTsKKwltdXRleF91bmxvY2soJmJyaWRnZS0+dm1lX2ludCk7CiAKIAlyZXR1cm4gMDsKIH0KIAotaW50IGNhOTFjeDQyX3NsYXZlX3NldChzdHJ1Y3Qgdm1lX3NsYXZlX3Jlc291cmNlICppbWFnZSwgaW50IGVuYWJsZWQsCitzdGF0aWMgaW50IGNhOTFjeDQyX3NsYXZlX3NldChzdHJ1Y3Qgdm1lX3NsYXZlX3Jlc291cmNlICppbWFnZSwgaW50IGVuYWJsZWQsCiAJdW5zaWduZWQgbG9uZyBsb25nIHZtZV9iYXNlLCB1bnNpZ25lZCBsb25nIGxvbmcgc2l6ZSwKIAlkbWFfYWRkcl90IHBjaV9iYXNlLCB2bWVfYWRkcmVzc190IGFzcGFjZSwgdm1lX2N5Y2xlX3QgY3ljbGUpCiB7CkBAIC00MjksNyArNDI5LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IGNhOTFjeDQyX3NsYXZlX2dldChzdHJ1Y3Qgdm1lX3NsYXZlX3Jlc291cmNlICppbWFnZSwgaW50ICplbmFibGVkLAorc3RhdGljIGludCBjYTkxY3g0Ml9zbGF2ZV9nZXQoc3RydWN0IHZtZV9zbGF2ZV9yZXNvdXJjZSAqaW1hZ2UsIGludCAqZW5hYmxlZCwKIAl1bnNpZ25lZCBsb25nIGxvbmcgKnZtZV9iYXNlLCB1bnNpZ25lZCBsb25nIGxvbmcgKnNpemUsCiAJZG1hX2FkZHJfdCAqcGNpX2Jhc2UsIHZtZV9hZGRyZXNzX3QgKmFzcGFjZSwgdm1lX2N5Y2xlX3QgKmN5Y2xlKQogewpAQCAtNTE4LDggKzUxOCw4IEBACiAJCWltYWdlLT5rZXJuX2Jhc2UgPSBOVUxMOwogCQlpZiAoaW1hZ2UtPmJ1c19yZXNvdXJjZS5uYW1lICE9IE5VTEwpCiAJCQlrZnJlZShpbWFnZS0+YnVzX3Jlc291cmNlLm5hbWUpOwotCQlyZWxlYXNlX3Jlc291cmNlKCYoaW1hZ2UtPmJ1c19yZXNvdXJjZSkpOwotCQltZW1zZXQoJihpbWFnZS0+YnVzX3Jlc291cmNlKSwgMCwgc2l6ZW9mKHN0cnVjdCByZXNvdXJjZSkpOworCQlyZWxlYXNlX3Jlc291cmNlKCZpbWFnZS0+YnVzX3Jlc291cmNlKTsKKwkJbWVtc2V0KCZpbWFnZS0+YnVzX3Jlc291cmNlLCAwLCBzaXplb2Yoc3RydWN0IHJlc291cmNlKSk7CiAJfQogCiAJaWYgKGltYWdlLT5idXNfcmVzb3VyY2UubmFtZSA9PSBOVUxMKSB7CkBAIC01NDAsNyArNTQwLDcgQEAKIAlpbWFnZS0+YnVzX3Jlc291cmNlLmZsYWdzID0gSU9SRVNPVVJDRV9NRU07CiAKIAlyZXR2YWwgPSBwY2lfYnVzX2FsbG9jX3Jlc291cmNlKHBkZXYtPmJ1cywKLQkJJihpbWFnZS0+YnVzX3Jlc291cmNlKSwgc2l6ZSwgc2l6ZSwgUENJQklPU19NSU5fTUVNLAorCQkmaW1hZ2UtPmJ1c19yZXNvdXJjZSwgc2l6ZSwgc2l6ZSwgUENJQklPU19NSU5fTUVNLAogCQkwLCBOVUxMLCBOVUxMKTsKIAlpZiAocmV0dmFsKSB7CiAJCWRldl9lcnIoY2E5MWN4NDJfYnJpZGdlLT5wYXJlbnQsICJGYWlsZWQgdG8gYWxsb2NhdGUgbWVtICIKQEAgLTU2MywxMCArNTYzLDEwIEBACiAJaW91bm1hcChpbWFnZS0+a2Vybl9iYXNlKTsKIAlpbWFnZS0+a2Vybl9iYXNlID0gTlVMTDsKIGVycl9yZW1hcDoKLQlyZWxlYXNlX3Jlc291cmNlKCYoaW1hZ2UtPmJ1c19yZXNvdXJjZSkpOworCXJlbGVhc2VfcmVzb3VyY2UoJmltYWdlLT5idXNfcmVzb3VyY2UpOwogZXJyX3Jlc291cmNlOgogCWtmcmVlKGltYWdlLT5idXNfcmVzb3VyY2UubmFtZSk7Ci0JbWVtc2V0KCYoaW1hZ2UtPmJ1c19yZXNvdXJjZSksIDAsIHNpemVvZihzdHJ1Y3QgcmVzb3VyY2UpKTsKKwltZW1zZXQoJmltYWdlLT5idXNfcmVzb3VyY2UsIDAsIHNpemVvZihzdHJ1Y3QgcmVzb3VyY2UpKTsKIGVycl9uYW1lOgogCXJldHVybiByZXR2YWw7CiB9CkBAIC01NzgsMTMgKzU3OCwxMyBAQAogewogCWlvdW5tYXAoaW1hZ2UtPmtlcm5fYmFzZSk7CiAJaW1hZ2UtPmtlcm5fYmFzZSA9IE5VTEw7Ci0JcmVsZWFzZV9yZXNvdXJjZSgmKGltYWdlLT5idXNfcmVzb3VyY2UpKTsKKwlyZWxlYXNlX3Jlc291cmNlKCZpbWFnZS0+YnVzX3Jlc291cmNlKTsKIAlrZnJlZShpbWFnZS0+YnVzX3Jlc291cmNlLm5hbWUpOwotCW1lbXNldCgmKGltYWdlLT5idXNfcmVzb3VyY2UpLCAwLCBzaXplb2Yoc3RydWN0IHJlc291cmNlKSk7CisJbWVtc2V0KCZpbWFnZS0+YnVzX3Jlc291cmNlLCAwLCBzaXplb2Yoc3RydWN0IHJlc291cmNlKSk7CiB9CiAKIAotaW50IGNhOTFjeDQyX21hc3Rlcl9zZXQoc3RydWN0IHZtZV9tYXN0ZXJfcmVzb3VyY2UgKmltYWdlLCBpbnQgZW5hYmxlZCwKK3N0YXRpYyBpbnQgY2E5MWN4NDJfbWFzdGVyX3NldChzdHJ1Y3Qgdm1lX21hc3Rlcl9yZXNvdXJjZSAqaW1hZ2UsIGludCBlbmFibGVkLAogCXVuc2lnbmVkIGxvbmcgbG9uZyB2bWVfYmFzZSwgdW5zaWduZWQgbG9uZyBsb25nIHNpemUsCiAJdm1lX2FkZHJlc3NfdCBhc3BhY2UsIHZtZV9jeWNsZV90IGN5Y2xlLCB2bWVfd2lkdGhfdCBkd2lkdGgpCiB7CkBAIC02MjAsNyArNjIwLDcgQEAKIAkJZ290byBlcnJfd2luZG93OwogCX0KIAotCXNwaW5fbG9jaygmKGltYWdlLT5sb2NrKSk7CisJc3Bpbl9sb2NrKCZpbWFnZS0+bG9jayk7CiAKIAkvKgogCSAqIExldCdzIGFsbG9jYXRlIHRoZSByZXNvdXJjZSBoZXJlIHJhdGhlciB0aGFuIGZ1cnRoZXIgdXAgdGhlIHN0YWNrIGFzCkBAIC02MjgsNyArNjI4LDcgQEAKIAkgKi8KIAlyZXR2YWwgPSBjYTkxY3g0Ml9hbGxvY19yZXNvdXJjZShpbWFnZSwgc2l6ZSk7CiAJaWYgKHJldHZhbCkgewotCQlzcGluX3VubG9jaygmKGltYWdlLT5sb2NrKSk7CisJCXNwaW5fdW5sb2NrKCZpbWFnZS0+bG9jayk7CiAJCWRldl9lcnIoY2E5MWN4NDJfYnJpZGdlLT5wYXJlbnQsICJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5ICIKIAkJCSJmb3IgcmVzb3VyY2UgbmFtZVxuIik7CiAJCXJldHZhbCA9IC1FTk9NRU07CkBAIC02NzIsNyArNjcyLDcgQEAKIAkJdGVtcF9jdGwgfD0gQ0E5MUNYNDJfTFNJX0NUTF9WRFdfRDY0OwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlzcGluX3VubG9jaygmKGltYWdlLT5sb2NrKSk7CisJCXNwaW5fdW5sb2NrKCZpbWFnZS0+bG9jayk7CiAJCWRldl9lcnIoY2E5MWN4NDJfYnJpZGdlLT5wYXJlbnQsICJJbnZhbGlkIGRhdGEgd2lkdGhcbiIpOwogCQlyZXR2YWwgPSAtRUlOVkFMOwogCQlnb3RvIGVycl9kd2lkdGg7CkBAIC03MDQsNyArNzA0LDcgQEAKIAljYXNlIFZNRV9VU0VSMzoKIAljYXNlIFZNRV9VU0VSNDoKIAlkZWZhdWx0OgotCQlzcGluX3VubG9jaygmKGltYWdlLT5sb2NrKSk7CisJCXNwaW5fdW5sb2NrKCZpbWFnZS0+bG9jayk7CiAJCWRldl9lcnIoY2E5MWN4NDJfYnJpZGdlLT5wYXJlbnQsICJJbnZhbGlkIGFkZHJlc3Mgc3BhY2VcbiIpOwogCQlyZXR2YWwgPSAtRUlOVkFMOwogCQlnb3RvIGVycl9hc3BhY2U7CkBAIC03MzAsNyArNzMwLDcgQEAKIAogCWlvd3JpdGUzMih0ZW1wX2N0bCwgYnJpZGdlLT5iYXNlICsgQ0E5MUNYNDJfTFNJX0NUTFtpXSk7CiAKLQlzcGluX3VubG9jaygmKGltYWdlLT5sb2NrKSk7CisJc3Bpbl91bmxvY2soJmltYWdlLT5sb2NrKTsKIAlyZXR1cm4gMDsKIAogZXJyX2FzcGFjZToKQEAgLTc0MSw4ICs3NDEsOCBAQAogCXJldHVybiByZXR2YWw7CiB9CiAKLWludCBfX2NhOTFjeDQyX21hc3Rlcl9nZXQoc3RydWN0IHZtZV9tYXN0ZXJfcmVzb3VyY2UgKmltYWdlLCBpbnQgKmVuYWJsZWQsCi0JdW5zaWduZWQgbG9uZyBsb25nICp2bWVfYmFzZSwgdW5zaWduZWQgbG9uZyBsb25nICpzaXplLAorc3RhdGljIGludCBfX2NhOTFjeDQyX21hc3Rlcl9nZXQoc3RydWN0IHZtZV9tYXN0ZXJfcmVzb3VyY2UgKmltYWdlLAorCWludCAqZW5hYmxlZCwgdW5zaWduZWQgbG9uZyBsb25nICp2bWVfYmFzZSwgdW5zaWduZWQgbG9uZyBsb25nICpzaXplLAogCXZtZV9hZGRyZXNzX3QgKmFzcGFjZSwgdm1lX2N5Y2xlX3QgKmN5Y2xlLCB2bWVfd2lkdGhfdCAqZHdpZHRoKQogewogCXVuc2lnbmVkIGludCBpLCBjdGw7CkBAIC04MjgsMjQgKzgyOCwyNCBAQAogCXJldHVybiAwOwogfQogCi1pbnQgY2E5MWN4NDJfbWFzdGVyX2dldChzdHJ1Y3Qgdm1lX21hc3Rlcl9yZXNvdXJjZSAqaW1hZ2UsIGludCAqZW5hYmxlZCwKK3N0YXRpYyBpbnQgY2E5MWN4NDJfbWFzdGVyX2dldChzdHJ1Y3Qgdm1lX21hc3Rlcl9yZXNvdXJjZSAqaW1hZ2UsIGludCAqZW5hYmxlZCwKIAl1bnNpZ25lZCBsb25nIGxvbmcgKnZtZV9iYXNlLCB1bnNpZ25lZCBsb25nIGxvbmcgKnNpemUsCiAJdm1lX2FkZHJlc3NfdCAqYXNwYWNlLCB2bWVfY3ljbGVfdCAqY3ljbGUsIHZtZV93aWR0aF90ICpkd2lkdGgpCiB7CiAJaW50IHJldHZhbDsKIAotCXNwaW5fbG9jaygmKGltYWdlLT5sb2NrKSk7CisJc3Bpbl9sb2NrKCZpbWFnZS0+bG9jayk7CiAKIAlyZXR2YWwgPSBfX2NhOTFjeDQyX21hc3Rlcl9nZXQoaW1hZ2UsIGVuYWJsZWQsIHZtZV9iYXNlLCBzaXplLCBhc3BhY2UsCiAJCWN5Y2xlLCBkd2lkdGgpOwogCi0Jc3Bpbl91bmxvY2soJihpbWFnZS0+bG9jaykpOworCXNwaW5fdW5sb2NrKCZpbWFnZS0+bG9jayk7CiAKIAlyZXR1cm4gcmV0dmFsOwogfQogCi1zc2l6ZV90IGNhOTFjeDQyX21hc3Rlcl9yZWFkKHN0cnVjdCB2bWVfbWFzdGVyX3Jlc291cmNlICppbWFnZSwgdm9pZCAqYnVmLAotCXNpemVfdCBjb3VudCwgbG9mZl90IG9mZnNldCkKK3N0YXRpYyBzc2l6ZV90IGNhOTFjeDQyX21hc3Rlcl9yZWFkKHN0cnVjdCB2bWVfbWFzdGVyX3Jlc291cmNlICppbWFnZSwKKwl2b2lkICpidWYsIHNpemVfdCBjb3VudCwgbG9mZl90IG9mZnNldCkKIHsKIAlzc2l6ZV90IHJldHZhbDsKIAl2b2lkICphZGRyID0gaW1hZ2UtPmtlcm5fYmFzZSArIG9mZnNldDsKQEAgLTg1NSw3ICs4NTUsNyBAQAogCWlmIChjb3VudCA9PSAwKQogCQlyZXR1cm4gMDsKIAotCXNwaW5fbG9jaygmKGltYWdlLT5sb2NrKSk7CisJc3Bpbl9sb2NrKCZpbWFnZS0+bG9jayk7CiAKIAkvKiBUaGUgZm9sbG93aW5nIGNvZGUgaGFuZGxlcyBWTUUgYWRkcmVzcyBhbGlnbm1lbnQgcHJvYmxlbQogCSAqIGluIG9yZGVyIHRvIGFzc3VyZSB0aGUgbWF4aW1hbCBkYXRhIHdpZHRoIGN5Y2xlLgpAQCAtODk5LDEzICs4OTksMTMgQEAKIAl9CiBvdXQ6CiAJcmV0dmFsID0gY291bnQ7Ci0Jc3Bpbl91bmxvY2soJihpbWFnZS0+bG9jaykpOworCXNwaW5fdW5sb2NrKCZpbWFnZS0+bG9jayk7CiAKIAlyZXR1cm4gcmV0dmFsOwogfQogCi1zc2l6ZV90IGNhOTFjeDQyX21hc3Rlcl93cml0ZShzdHJ1Y3Qgdm1lX21hc3Rlcl9yZXNvdXJjZSAqaW1hZ2UsIHZvaWQgKmJ1ZiwKLQlzaXplX3QgY291bnQsIGxvZmZfdCBvZmZzZXQpCitzdGF0aWMgc3NpemVfdCBjYTkxY3g0Ml9tYXN0ZXJfd3JpdGUoc3RydWN0IHZtZV9tYXN0ZXJfcmVzb3VyY2UgKmltYWdlLAorCXZvaWQgKmJ1Ziwgc2l6ZV90IGNvdW50LCBsb2ZmX3Qgb2Zmc2V0KQogewogCXNzaXplX3QgcmV0dmFsOwogCXZvaWQgKmFkZHIgPSBpbWFnZS0+a2Vybl9iYXNlICsgb2Zmc2V0OwpAQCAtOTE1LDcgKzkxNSw3IEBACiAJaWYgKGNvdW50ID09IDApCiAJCXJldHVybiAwOwogCi0Jc3Bpbl9sb2NrKCYoaW1hZ2UtPmxvY2spKTsKKwlzcGluX2xvY2soJmltYWdlLT5sb2NrKTsKIAogCS8qIEhlcmUgd2UgYXBwbHkgZm9yIHRoZSBzYW1lIHN0cmF0ZWd5IHdlIGRvIGluIG1hc3Rlcl9yZWFkCiAJICogZnVuY3Rpb24gaW4gb3JkZXIgdG8gYXNzdXJlIEQxNiBjeWNsZSB3aGVuIHJlcXVpcmVkLgpAQCAtOTU0LDExICs5NTQsMTIgQEAKIG91dDoKIAlyZXR2YWwgPSBjb3VudDsKIAotCXNwaW5fdW5sb2NrKCYoaW1hZ2UtPmxvY2spKTsKKwlzcGluX3VubG9jaygmaW1hZ2UtPmxvY2spOworCiAJcmV0dXJuIHJldHZhbDsKIH0KIAotdW5zaWduZWQgaW50IGNhOTFjeDQyX21hc3Rlcl9ybXcoc3RydWN0IHZtZV9tYXN0ZXJfcmVzb3VyY2UgKmltYWdlLAorc3RhdGljIHVuc2lnbmVkIGludCBjYTkxY3g0Ml9tYXN0ZXJfcm13KHN0cnVjdCB2bWVfbWFzdGVyX3Jlc291cmNlICppbWFnZSwKIAl1bnNpZ25lZCBpbnQgbWFzaywgdW5zaWduZWQgaW50IGNvbXBhcmUsIHVuc2lnbmVkIGludCBzd2FwLAogCWxvZmZfdCBvZmZzZXQpCiB7CkBAIC05NzQsMTAgKzk3NSwxMCBAQAogCWkgPSBpbWFnZS0+bnVtYmVyOwogCiAJLyogTG9ja2luZyBhcyB3ZSBjYW4gb25seSBkbyBvbmUgb2YgdGhlc2UgYXQgYSB0aW1lICovCi0JbXV0ZXhfbG9jaygmKGJyaWRnZS0+dm1lX3JtdykpOworCW11dGV4X2xvY2soJmJyaWRnZS0+dm1lX3Jtdyk7CiAKIAkvKiBMb2NrIGltYWdlICovCi0Jc3Bpbl9sb2NrKCYoaW1hZ2UtPmxvY2spKTsKKwlzcGluX2xvY2soJmltYWdlLT5sb2NrKTsKIAogCXBjaV9hZGRyID0gKHUzMilpbWFnZS0+a2Vybl9iYXNlICsgb2Zmc2V0OwogCkBAIC0xMDA3LDE1ICsxMDA4LDE1IEBACiAJaW93cml0ZTMyKDAsIGJyaWRnZS0+YmFzZSArIFNDWUNfQ1RMKTsKIAogb3V0OgotCXNwaW5fdW5sb2NrKCYoaW1hZ2UtPmxvY2spKTsKKwlzcGluX3VubG9jaygmaW1hZ2UtPmxvY2spOwogCi0JbXV0ZXhfdW5sb2NrKCYoYnJpZGdlLT52bWVfcm13KSk7CisJbXV0ZXhfdW5sb2NrKCZicmlkZ2UtPnZtZV9ybXcpOwogCiAJcmV0dXJuIHJlc3VsdDsKIH0KIAotaW50IGNhOTFjeDQyX2RtYV9saXN0X2FkZChzdHJ1Y3Qgdm1lX2RtYV9saXN0ICpsaXN0LCBzdHJ1Y3Qgdm1lX2RtYV9hdHRyICpzcmMsCi0Jc3RydWN0IHZtZV9kbWFfYXR0ciAqZGVzdCwgc2l6ZV90IGNvdW50KQorc3RhdGljIGludCBjYTkxY3g0Ml9kbWFfbGlzdF9hZGQoc3RydWN0IHZtZV9kbWFfbGlzdCAqbGlzdCwKKwlzdHJ1Y3Qgdm1lX2RtYV9hdHRyICpzcmMsIHN0cnVjdCB2bWVfZG1hX2F0dHIgKmRlc3QsIHNpemVfdCBjb3VudCkKIHsKIAlzdHJ1Y3QgY2E5MWN4NDJfZG1hX2VudHJ5ICplbnRyeSwgKnByZXY7CiAJc3RydWN0IHZtZV9kbWFfcGNpICpwY2lfYXR0cjsKQEAgLTEwMzYsMTQgKzEwMzcsMTQgQEAKIAl9CiAKIAkvKiBUZXN0IGRlc2NyaXB0b3IgYWxpZ25tZW50ICovCi0JaWYgKCh1bnNpZ25lZCBsb25nKSYoZW50cnktPmRlc2NyaXB0b3IpICYgQ0E5MUNYNDJfRENQUF9NKSB7CisJaWYgKCh1bnNpZ25lZCBsb25nKSZlbnRyeS0+ZGVzY3JpcHRvciAmIENBOTFDWDQyX0RDUFBfTSkgewogCQlkZXZfZXJyKGRldiwgIkRlc2NyaXB0b3Igbm90IGFsaWduZWQgdG8gMTYgYnl0ZSBib3VuZGFyeSBhcyAiCi0JCQkicmVxdWlyZWQ6ICVwXG4iLCAmKGVudHJ5LT5kZXNjcmlwdG9yKSk7CisJCQkicmVxdWlyZWQ6ICVwXG4iLCAmZW50cnktPmRlc2NyaXB0b3IpOwogCQlyZXR2YWwgPSAtRUlOVkFMOwogCQlnb3RvIGVycl9hbGlnbjsKIAl9CiAKLQltZW1zZXQoJihlbnRyeS0+ZGVzY3JpcHRvciksIDAsIHNpemVvZihzdHJ1Y3QgY2E5MWN4NDJfZG1hX2Rlc2NyaXB0b3IpKTsKKwltZW1zZXQoJmVudHJ5LT5kZXNjcmlwdG9yLCAwLCBzaXplb2Yoc3RydWN0IGNhOTFjeDQyX2RtYV9kZXNjcmlwdG9yKSk7CiAKIAlpZiAoZGVzdC0+dHlwZSA9PSBWTUVfRE1BX1ZNRSkgewogCQllbnRyeS0+ZGVzY3JpcHRvci5kY3RsIHw9IENBOTFDWDQyX0RDVExfTDJWOwpAQCAtMTEzOCwxNCArMTEzOSwxNCBAQAogCWVudHJ5LT5kZXNjcmlwdG9yLmRjcHAgPSBDQTkxQ1g0Ml9EQ1BQX05VTEw7CiAKIAkvKiBBZGQgdG8gbGlzdCAqLwotCWxpc3RfYWRkX3RhaWwoJihlbnRyeS0+bGlzdCksICYobGlzdC0+ZW50cmllcykpOworCWxpc3RfYWRkX3RhaWwoJmVudHJ5LT5saXN0LCAmbGlzdC0+ZW50cmllcyk7CiAKIAkvKiBGaWxsIG91dCBwcmV2aW91cyBkZXNjcmlwdG9ycyAiTmV4dCBBZGRyZXNzIiAqLwotCWlmIChlbnRyeS0+bGlzdC5wcmV2ICE9ICYobGlzdC0+ZW50cmllcykpIHsKKwlpZiAoZW50cnktPmxpc3QucHJldiAhPSAmbGlzdC0+ZW50cmllcykgewogCQlwcmV2ID0gbGlzdF9lbnRyeShlbnRyeS0+bGlzdC5wcmV2LCBzdHJ1Y3QgY2E5MWN4NDJfZG1hX2VudHJ5LAogCQkJbGlzdCk7CiAJCS8qIFdlIG5lZWQgdGhlIGJ1cyBhZGRyZXNzIGZvciB0aGUgcG9pbnRlciAqLwotCQlkZXNjX3B0ciA9IHZpcnRfdG9fYnVzKCYoZW50cnktPmRlc2NyaXB0b3IpKTsKKwkJZGVzY19wdHIgPSB2aXJ0X3RvX2J1cygmZW50cnktPmRlc2NyaXB0b3IpOwogCQlwcmV2LT5kZXNjcmlwdG9yLmRjcHAgPSBkZXNjX3B0ciAmIH5DQTkxQ1g0Ml9EQ1BQX007CiAJfQogCkBAIC0xMTc1LDcgKzExNzYsNyBAQAogCQlyZXR1cm4gMTsKIH0KIAotaW50IGNhOTFjeDQyX2RtYV9saXN0X2V4ZWMoc3RydWN0IHZtZV9kbWFfbGlzdCAqbGlzdCkKK3N0YXRpYyBpbnQgY2E5MWN4NDJfZG1hX2xpc3RfZXhlYyhzdHJ1Y3Qgdm1lX2RtYV9saXN0ICpsaXN0KQogewogCXN0cnVjdCB2bWVfZG1hX3Jlc291cmNlICpjdHJscjsKIAlzdHJ1Y3QgY2E5MWN4NDJfZG1hX2VudHJ5ICplbnRyeTsKQEAgLTExOTAsMjggKzExOTEsMjggQEAKIAlicmlkZ2UgPSBjdHJsci0+cGFyZW50LT5kcml2ZXJfcHJpdjsKIAlkZXYgPSBjdHJsci0+cGFyZW50LT5wYXJlbnQ7CiAKLQltdXRleF9sb2NrKCYoY3RybHItPm10eCkpOworCW11dGV4X2xvY2soJmN0cmxyLT5tdHgpOwogCi0JaWYgKCEobGlzdF9lbXB0eSgmKGN0cmxyLT5ydW5uaW5nKSkpKSB7CisJaWYgKCEobGlzdF9lbXB0eSgmY3RybHItPnJ1bm5pbmcpKSkgewogCQkvKgogCQkgKiBYWFggV2UgaGF2ZSBhbiBhY3RpdmUgRE1BIHRyYW5zZmVyIGFuZCBjdXJyZW50bHkgaGF2ZW4ndAogCQkgKiAgICAgc29ydGVkIG91dCB0aGUgbWVjaGFuaXNtIGZvciAicGVuZGluZyIgRE1BIHRyYW5zZmVycy4KIAkJICogICAgIFJldHVybiBidXN5LgogCQkgKi8KIAkJLyogTmVlZCB0byBhZGQgdG8gcGVuZGluZyBoZXJlICovCi0JCW11dGV4X3VubG9jaygmKGN0cmxyLT5tdHgpKTsKKwkJbXV0ZXhfdW5sb2NrKCZjdHJsci0+bXR4KTsKIAkJcmV0dXJuIC1FQlVTWTsKIAl9IGVsc2UgewotCQlsaXN0X2FkZCgmKGxpc3QtPmxpc3QpLCAmKGN0cmxyLT5ydW5uaW5nKSk7CisJCWxpc3RfYWRkKCZsaXN0LT5saXN0LCAmY3RybHItPnJ1bm5pbmcpOwogCX0KIAogCS8qIEdldCBmaXJzdCBidXMgYWRkcmVzcyBhbmQgd3JpdGUgaW50byByZWdpc3RlcnMgKi8KLQllbnRyeSA9IGxpc3RfZmlyc3RfZW50cnkoJihsaXN0LT5lbnRyaWVzKSwgc3RydWN0IGNhOTFjeDQyX2RtYV9lbnRyeSwKKwllbnRyeSA9IGxpc3RfZmlyc3RfZW50cnkoJmxpc3QtPmVudHJpZXMsIHN0cnVjdCBjYTkxY3g0Ml9kbWFfZW50cnksCiAJCWxpc3QpOwogCi0JYnVzX2FkZHIgPSB2aXJ0X3RvX2J1cygmKGVudHJ5LT5kZXNjcmlwdG9yKSk7CisJYnVzX2FkZHIgPSB2aXJ0X3RvX2J1cygmZW50cnktPmRlc2NyaXB0b3IpOwogCi0JbXV0ZXhfdW5sb2NrKCYoY3RybHItPm10eCkpOworCW11dGV4X3VubG9jaygmY3RybHItPm10eCk7CiAKIAlpb3dyaXRlMzIoMCwgYnJpZGdlLT5iYXNlICsgRFRCQyk7CiAJaW93cml0ZTMyKGJ1c19hZGRyICYgfkNBOTFDWDQyX0RDUFBfTSwgYnJpZGdlLT5iYXNlICsgRENQUCk7CkBAIC0xMjQ5LDIxICsxMjUwLDIxIEBACiAJfQogCiAJLyogUmVtb3ZlIGxpc3QgZnJvbSBydW5uaW5nIGxpc3QgKi8KLQltdXRleF9sb2NrKCYoY3RybHItPm10eCkpOwotCWxpc3RfZGVsKCYobGlzdC0+bGlzdCkpOwotCW11dGV4X3VubG9jaygmKGN0cmxyLT5tdHgpKTsKKwltdXRleF9sb2NrKCZjdHJsci0+bXR4KTsKKwlsaXN0X2RlbCgmbGlzdC0+bGlzdCk7CisJbXV0ZXhfdW5sb2NrKCZjdHJsci0+bXR4KTsKIAogCXJldHVybiByZXR2YWw7CiAKIH0KIAotaW50IGNhOTFjeDQyX2RtYV9saXN0X2VtcHR5KHN0cnVjdCB2bWVfZG1hX2xpc3QgKmxpc3QpCitzdGF0aWMgaW50IGNhOTFjeDQyX2RtYV9saXN0X2VtcHR5KHN0cnVjdCB2bWVfZG1hX2xpc3QgKmxpc3QpCiB7CiAJc3RydWN0IGxpc3RfaGVhZCAqcG9zLCAqdGVtcDsKIAlzdHJ1Y3QgY2E5MWN4NDJfZG1hX2VudHJ5ICplbnRyeTsKIAogCS8qIGRldGFjaCBhbmQgZnJlZSBlYWNoIGVudHJ5ICovCi0JbGlzdF9mb3JfZWFjaF9zYWZlKHBvcywgdGVtcCwgJihsaXN0LT5lbnRyaWVzKSkgeworCWxpc3RfZm9yX2VhY2hfc2FmZShwb3MsIHRlbXAsICZsaXN0LT5lbnRyaWVzKSB7CiAJCWxpc3RfZGVsKHBvcyk7CiAJCWVudHJ5ID0gbGlzdF9lbnRyeShwb3MsIHN0cnVjdCBjYTkxY3g0Ml9kbWFfZW50cnksIGxpc3QpOwogCQlrZnJlZShlbnRyeSk7CkBAIC0xMjc5LDggKzEyODAsOCBAQAogICogVGhpcyBkb2VzIG5vdCBlbmFibGUgdGhlIExNIG1vbml0b3IgLSB0aGF0IHNob3VsZCBiZSBkb25lIHdoZW4gdGhlIGZpcnN0CiAgKiBjYWxsYmFjayBpcyBhdHRhY2hlZCBhbmQgZGlzYWJsZWQgd2hlbiB0aGUgbGFzdCBjYWxsYmFjayBpcyByZW1vdmVkLgogICovCi1pbnQgY2E5MWN4NDJfbG1fc2V0KHN0cnVjdCB2bWVfbG1fcmVzb3VyY2UgKmxtLCB1bnNpZ25lZCBsb25nIGxvbmcgbG1fYmFzZSwKLQl2bWVfYWRkcmVzc190IGFzcGFjZSwgdm1lX2N5Y2xlX3QgY3ljbGUpCitzdGF0aWMgaW50IGNhOTFjeDQyX2xtX3NldChzdHJ1Y3Qgdm1lX2xtX3Jlc291cmNlICpsbSwKKwl1bnNpZ25lZCBsb25nIGxvbmcgbG1fYmFzZSwgdm1lX2FkZHJlc3NfdCBhc3BhY2UsIHZtZV9jeWNsZV90IGN5Y2xlKQogewogCXUzMiB0ZW1wX2Jhc2UsIGxtX2N0bCA9IDA7CiAJaW50IGk7CkBAIC0xMjk4LDEyICsxMjk5LDEyIEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCW11dGV4X2xvY2soJihsbS0+bXR4KSk7CisJbXV0ZXhfbG9jaygmbG0tPm10eCk7CiAKIAkvKiBJZiB3ZSBhbHJlYWR5IGhhdmUgYSBjYWxsYmFjayBhdHRhY2hlZCwgd2UgY2FuJ3QgbW92ZSBpdCEgKi8KIAlmb3IgKGkgPSAwOyBpIDwgbG0tPm1vbml0b3JzOyBpKyspIHsKIAkJaWYgKGJyaWRnZS0+bG1fY2FsbGJhY2tbaV0gIT0gTlVMTCkgewotCQkJbXV0ZXhfdW5sb2NrKCYobG0tPm10eCkpOworCQkJbXV0ZXhfdW5sb2NrKCZsbS0+bXR4KTsKIAkJCWRldl9lcnIoZGV2LCAiTG9jYXRpb24gbW9uaXRvciBjYWxsYmFjayBhdHRhY2hlZCwgIgogCQkJCSJjYW4ndCByZXNldFxuIik7CiAJCQlyZXR1cm4gLUVCVVNZOwpAQCAtMTMyMSw3ICsxMzIyLDcgQEAKIAkJbG1fY3RsIHw9IENBOTFDWDQyX0xNX0NUTF9BU19BMzI7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCW11dGV4X3VubG9jaygmKGxtLT5tdHgpKTsKKwkJbXV0ZXhfdW5sb2NrKCZsbS0+bXR4KTsKIAkJZGV2X2VycihkZXYsICJJbnZhbGlkIGFkZHJlc3Mgc3BhY2VcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAkJYnJlYWs7CkBAIC0xMzM5LDcgKzEzNDAsNyBAQAogCWlvd3JpdGUzMihsbV9iYXNlLCBicmlkZ2UtPmJhc2UgKyBMTV9CUyk7CiAJaW93cml0ZTMyKGxtX2N0bCwgYnJpZGdlLT5iYXNlICsgTE1fQ1RMKTsKIAotCW11dGV4X3VubG9jaygmKGxtLT5tdHgpKTsKKwltdXRleF91bmxvY2soJmxtLT5tdHgpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xMzQ3LDE1ICsxMzQ4LDE1IEBACiAvKiBHZXQgY29uZmlndXJhdGlvbiBvZiB0aGUgY2FsbGJhY2sgbW9uaXRvciBhbmQgcmV0dXJuIHdoZXRoZXIgaXQgaXMgZW5hYmxlZAogICogb3IgZGlzYWJsZWQuCiAgKi8KLWludCBjYTkxY3g0Ml9sbV9nZXQoc3RydWN0IHZtZV9sbV9yZXNvdXJjZSAqbG0sIHVuc2lnbmVkIGxvbmcgbG9uZyAqbG1fYmFzZSwKLQl2bWVfYWRkcmVzc190ICphc3BhY2UsIHZtZV9jeWNsZV90ICpjeWNsZSkKK3N0YXRpYyBpbnQgY2E5MWN4NDJfbG1fZ2V0KHN0cnVjdCB2bWVfbG1fcmVzb3VyY2UgKmxtLAorCXVuc2lnbmVkIGxvbmcgbG9uZyAqbG1fYmFzZSwgdm1lX2FkZHJlc3NfdCAqYXNwYWNlLCB2bWVfY3ljbGVfdCAqY3ljbGUpCiB7CiAJdTMyIGxtX2N0bCwgZW5hYmxlZCA9IDA7CiAJc3RydWN0IGNhOTFjeDQyX2RyaXZlciAqYnJpZGdlOwogCiAJYnJpZGdlID0gbG0tPnBhcmVudC0+ZHJpdmVyX3ByaXY7CiAKLQltdXRleF9sb2NrKCYobG0tPm10eCkpOworCW11dGV4X2xvY2soJmxtLT5tdHgpOwogCiAJKmxtX2Jhc2UgPSAodW5zaWduZWQgbG9uZyBsb25nKWlvcmVhZDMyKGJyaWRnZS0+YmFzZSArIExNX0JTKTsKIAlsbV9jdGwgPSBpb3JlYWQzMihicmlkZ2UtPmJhc2UgKyBMTV9DVEwpOwpAQCAtMTM4MCw3ICsxMzgxLDcgQEAKIAlpZiAobG1fY3RsICYgQ0E5MUNYNDJfTE1fQ1RMX0RBVEEpCiAJCSpjeWNsZSB8PSBWTUVfREFUQTsKIAotCW11dGV4X3VubG9jaygmKGxtLT5tdHgpKTsKKwltdXRleF91bmxvY2soJmxtLT5tdHgpOwogCiAJcmV0dXJuIGVuYWJsZWQ7CiB9CkBAIC0xMzkwLDcgKzEzOTEsNyBAQAogICoKICAqIENhbGxiYWNrIHdpbGwgYmUgcGFzc2VkIHRoZSBtb25pdG9yIHRyaWdnZXJlZC4KICAqLwotaW50IGNhOTFjeDQyX2xtX2F0dGFjaChzdHJ1Y3Qgdm1lX2xtX3Jlc291cmNlICpsbSwgaW50IG1vbml0b3IsCitzdGF0aWMgaW50IGNhOTFjeDQyX2xtX2F0dGFjaChzdHJ1Y3Qgdm1lX2xtX3Jlc291cmNlICpsbSwgaW50IG1vbml0b3IsCiAJdm9pZCAoKmNhbGxiYWNrKShpbnQpKQogewogCXUzMiBsbV9jdGwsIHRtcDsKQEAgLTE0MDAsMTkgKzE0MDEsMTkgQEAKIAlicmlkZ2UgPSBsbS0+cGFyZW50LT5kcml2ZXJfcHJpdjsKIAlkZXYgPSBsbS0+cGFyZW50LT5wYXJlbnQ7CiAKLQltdXRleF9sb2NrKCYobG0tPm10eCkpOworCW11dGV4X2xvY2soJmxtLT5tdHgpOwogCiAJLyogRW5zdXJlIHRoYXQgdGhlIGxvY2F0aW9uIG1vbml0b3IgaXMgY29uZmlndXJlZCAtIG5lZWQgUEdNIG9yIERBVEEgKi8KIAlsbV9jdGwgPSBpb3JlYWQzMihicmlkZ2UtPmJhc2UgKyBMTV9DVEwpOwogCWlmICgobG1fY3RsICYgKENBOTFDWDQyX0xNX0NUTF9QR00gfCBDQTkxQ1g0Ml9MTV9DVExfREFUQSkpID09IDApIHsKLQkJbXV0ZXhfdW5sb2NrKCYobG0tPm10eCkpOworCQltdXRleF91bmxvY2soJmxtLT5tdHgpOwogCQlkZXZfZXJyKGRldiwgIkxvY2F0aW9uIG1vbml0b3Igbm90IHByb3Blcmx5IGNvbmZpZ3VyZWRcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKIAkvKiBDaGVjayB0aGF0IGEgY2FsbGJhY2sgaXNuJ3QgYWxyZWFkeSBhdHRhY2hlZCAqLwogCWlmIChicmlkZ2UtPmxtX2NhbGxiYWNrW21vbml0b3JdICE9IE5VTEwpIHsKLQkJbXV0ZXhfdW5sb2NrKCYobG0tPm10eCkpOworCQltdXRleF91bmxvY2soJmxtLT5tdHgpOwogCQlkZXZfZXJyKGRldiwgIkV4aXN0aW5nIGNhbGxiYWNrIGF0dGFjaGVkXG4iKTsKIAkJcmV0dXJuIC1FQlVTWTsKIAl9CkBAIC0xNDMxLDcgKzE0MzIsNyBAQAogCQlpb3dyaXRlMzIobG1fY3RsLCBicmlkZ2UtPmJhc2UgKyBMTV9DVEwpOwogCX0KIAotCW11dGV4X3VubG9jaygmKGxtLT5tdHgpKTsKKwltdXRleF91bmxvY2soJmxtLT5tdHgpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xNDM5LDE0ICsxNDQwLDE0IEBACiAvKgogICogRGV0YWNoIGEgY2FsbGJhY2sgZnVuY3Rpb24gZm9ybiBhIHNwZWNpZmljIGxvY2F0aW9uIG1vbml0b3IuCiAgKi8KLWludCBjYTkxY3g0Ml9sbV9kZXRhY2goc3RydWN0IHZtZV9sbV9yZXNvdXJjZSAqbG0sIGludCBtb25pdG9yKQorc3RhdGljIGludCBjYTkxY3g0Ml9sbV9kZXRhY2goc3RydWN0IHZtZV9sbV9yZXNvdXJjZSAqbG0sIGludCBtb25pdG9yKQogewogCXUzMiB0bXA7CiAJc3RydWN0IGNhOTFjeDQyX2RyaXZlciAqYnJpZGdlOwogCiAJYnJpZGdlID0gbG0tPnBhcmVudC0+ZHJpdmVyX3ByaXY7CiAKLQltdXRleF9sb2NrKCYobG0tPm10eCkpOworCW11dGV4X2xvY2soJmxtLT5tdHgpOwogCiAJLyogRGlzYWJsZSBMb2NhdGlvbiBNb25pdG9yIGFuZCBlbnN1cmUgcHJldmlvdXMgaW50ZXJydXB0cyBhcmUgY2xlYXIgKi8KIAl0bXAgPSBpb3JlYWQzMihicmlkZ2UtPmJhc2UgKyBMSU5UX0VOKTsKQEAgLTE0NjcsMTIgKzE0NjgsMTIgQEAKIAkJaW93cml0ZTMyKHRtcCwgYnJpZGdlLT5iYXNlICsgTE1fQ1RMKTsKIAl9CiAKLQltdXRleF91bmxvY2soJihsbS0+bXR4KSk7CisJbXV0ZXhfdW5sb2NrKCZsbS0+bXR4KTsKIAogCXJldHVybiAwOwogfQogCi1pbnQgY2E5MWN4NDJfc2xvdF9nZXQoc3RydWN0IHZtZV9icmlkZ2UgKmNhOTFjeDQyX2JyaWRnZSkKK3N0YXRpYyBpbnQgY2E5MWN4NDJfc2xvdF9nZXQoc3RydWN0IHZtZV9icmlkZ2UgKmNhOTFjeDQyX2JyaWRnZSkKIHsKIAl1MzIgc2xvdCA9IDA7CiAJc3RydWN0IGNhOTFjeDQyX2RyaXZlciAqYnJpZGdlOwpAQCAtMTUyNiw3ICsxNTI3LDcgQEAKIAogCS8qIEFsbG9jYXRlIG1lbSBmb3IgQ1IvQ1NSIGltYWdlICovCiAJYnJpZGdlLT5jcmNzcl9rZXJuZWwgPSBwY2lfYWxsb2NfY29uc2lzdGVudChwZGV2LCBWTUVfQ1JDU1JfQlVGX1NJWkUsCi0JCSYoYnJpZGdlLT5jcmNzcl9idXMpKTsKKwkJJmJyaWRnZS0+Y3Jjc3JfYnVzKTsKIAlpZiAoYnJpZGdlLT5jcmNzcl9rZXJuZWwgPT0gTlVMTCkgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBDUi9DU1IgIgogCQkJImltYWdlXG4iKTsKQEAgLTE2MzIsMTIgKzE2MzMsMTIgQEAKIAl9CiAKIAkvKiBJbml0aWFsaXplIHdhaXQgcXVldWVzICYgbXV0dWFsIGV4Y2x1c2lvbiBmbGFncyAqLwotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJihjYTkxY3g0Ml9kZXZpY2UtPmRtYV9xdWV1ZSkpOwotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJihjYTkxY3g0Ml9kZXZpY2UtPmlhY2tfcXVldWUpKTsKLQltdXRleF9pbml0KCYoY2E5MWN4NDJfZGV2aWNlLT52bWVfaW50KSk7Ci0JbXV0ZXhfaW5pdCgmKGNhOTFjeDQyX2RldmljZS0+dm1lX3JtdykpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmNhOTFjeDQyX2RldmljZS0+ZG1hX3F1ZXVlKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZjYTkxY3g0Ml9kZXZpY2UtPmlhY2tfcXVldWUpOworCW11dGV4X2luaXQoJmNhOTFjeDQyX2RldmljZS0+dm1lX2ludCk7CisJbXV0ZXhfaW5pdCgmY2E5MWN4NDJfZGV2aWNlLT52bWVfcm13KTsKIAotCWNhOTFjeDQyX2JyaWRnZS0+cGFyZW50ID0gJihwZGV2LT5kZXYpOworCWNhOTFjeDQyX2JyaWRnZS0+cGFyZW50ID0gJnBkZXYtPmRldjsKIAlzdHJjcHkoY2E5MWN4NDJfYnJpZGdlLT5uYW1lLCBkcml2ZXJfbmFtZSk7CiAKIAkvKiBTZXR1cCBJUlEgKi8KQEAgLTE2NDgsNyArMTY0OSw3IEBACiAJfQogCiAJLyogQWRkIG1hc3RlciB3aW5kb3dzIHRvIGxpc3QgKi8KLQlJTklUX0xJU1RfSEVBRCgmKGNhOTFjeDQyX2JyaWRnZS0+bWFzdGVyX3Jlc291cmNlcykpOworCUlOSVRfTElTVF9IRUFEKCZjYTkxY3g0Ml9icmlkZ2UtPm1hc3Rlcl9yZXNvdXJjZXMpOwogCWZvciAoaSA9IDA7IGkgPCBDQTkxQzE0Ml9NQVhfTUFTVEVSOyBpKyspIHsKIAkJbWFzdGVyX2ltYWdlID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHZtZV9tYXN0ZXJfcmVzb3VyY2UpLAogCQkJR0ZQX0tFUk5FTCk7CkBAIC0xNjU5LDcgKzE2NjAsNyBAQAogCQkJZ290byBlcnJfbWFzdGVyOwogCQl9CiAJCW1hc3Rlcl9pbWFnZS0+cGFyZW50ID0gY2E5MWN4NDJfYnJpZGdlOwotCQlzcGluX2xvY2tfaW5pdCgmKG1hc3Rlcl9pbWFnZS0+bG9jaykpOworCQlzcGluX2xvY2tfaW5pdCgmbWFzdGVyX2ltYWdlLT5sb2NrKTsKIAkJbWFzdGVyX2ltYWdlLT5sb2NrZWQgPSAwOwogCQltYXN0ZXJfaW1hZ2UtPm51bWJlciA9IGk7CiAJCW1hc3Rlcl9pbWFnZS0+YWRkcmVzc19hdHRyID0gVk1FX0ExNiB8IFZNRV9BMjQgfCBWTUVfQTMyIHwKQEAgLTE2NjcsMTUgKzE2NjgsMTUgQEAKIAkJbWFzdGVyX2ltYWdlLT5jeWNsZV9hdHRyID0gVk1FX1NDVCB8IFZNRV9CTFQgfCBWTUVfTUJMVCB8CiAJCQlWTUVfU1VQRVIgfCBWTUVfVVNFUiB8IFZNRV9QUk9HIHwgVk1FX0RBVEE7CiAJCW1hc3Rlcl9pbWFnZS0+d2lkdGhfYXR0ciA9IFZNRV9EOCB8IFZNRV9EMTYgfCBWTUVfRDMyIHwgVk1FX0Q2NDsKLQkJbWVtc2V0KCYobWFzdGVyX2ltYWdlLT5idXNfcmVzb3VyY2UpLCAwLAorCQltZW1zZXQoJm1hc3Rlcl9pbWFnZS0+YnVzX3Jlc291cmNlLCAwLAogCQkJc2l6ZW9mKHN0cnVjdCByZXNvdXJjZSkpOwogCQltYXN0ZXJfaW1hZ2UtPmtlcm5fYmFzZSAgPSBOVUxMOwotCQlsaXN0X2FkZF90YWlsKCYobWFzdGVyX2ltYWdlLT5saXN0KSwKLQkJCSYoY2E5MWN4NDJfYnJpZGdlLT5tYXN0ZXJfcmVzb3VyY2VzKSk7CisJCWxpc3RfYWRkX3RhaWwoJm1hc3Rlcl9pbWFnZS0+bGlzdCwKKwkJCSZjYTkxY3g0Ml9icmlkZ2UtPm1hc3Rlcl9yZXNvdXJjZXMpOwogCX0KIAogCS8qIEFkZCBzbGF2ZSB3aW5kb3dzIHRvIGxpc3QgKi8KLQlJTklUX0xJU1RfSEVBRCgmKGNhOTFjeDQyX2JyaWRnZS0+c2xhdmVfcmVzb3VyY2VzKSk7CisJSU5JVF9MSVNUX0hFQUQoJmNhOTFjeDQyX2JyaWRnZS0+c2xhdmVfcmVzb3VyY2VzKTsKIAlmb3IgKGkgPSAwOyBpIDwgQ0E5MUMxNDJfTUFYX1NMQVZFOyBpKyspIHsKIAkJc2xhdmVfaW1hZ2UgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgdm1lX3NsYXZlX3Jlc291cmNlKSwKIAkJCUdGUF9LRVJORUwpOwpAQCAtMTY4Niw3ICsxNjg3LDcgQEAKIAkJCWdvdG8gZXJyX3NsYXZlOwogCQl9CiAJCXNsYXZlX2ltYWdlLT5wYXJlbnQgPSBjYTkxY3g0Ml9icmlkZ2U7Ci0JCW11dGV4X2luaXQoJihzbGF2ZV9pbWFnZS0+bXR4KSk7CisJCW11dGV4X2luaXQoJnNsYXZlX2ltYWdlLT5tdHgpOwogCQlzbGF2ZV9pbWFnZS0+bG9ja2VkID0gMDsKIAkJc2xhdmVfaW1hZ2UtPm51bWJlciA9IGk7CiAJCXNsYXZlX2ltYWdlLT5hZGRyZXNzX2F0dHIgPSBWTUVfQTI0IHwgVk1FX0EzMiB8IFZNRV9VU0VSMSB8CkBAIC0xNjk4LDEyICsxNjk5LDEyIEBACiAKIAkJc2xhdmVfaW1hZ2UtPmN5Y2xlX2F0dHIgPSBWTUVfU0NUIHwgVk1FX0JMVCB8IFZNRV9NQkxUIHwKIAkJCVZNRV9TVVBFUiB8IFZNRV9VU0VSIHwgVk1FX1BST0cgfCBWTUVfREFUQTsKLQkJbGlzdF9hZGRfdGFpbCgmKHNsYXZlX2ltYWdlLT5saXN0KSwKLQkJCSYoY2E5MWN4NDJfYnJpZGdlLT5zbGF2ZV9yZXNvdXJjZXMpKTsKKwkJbGlzdF9hZGRfdGFpbCgmc2xhdmVfaW1hZ2UtPmxpc3QsCisJCQkmY2E5MWN4NDJfYnJpZGdlLT5zbGF2ZV9yZXNvdXJjZXMpOwogCX0KIAogCS8qIEFkZCBkbWEgZW5naW5lcyB0byBsaXN0ICovCi0JSU5JVF9MSVNUX0hFQUQoJihjYTkxY3g0Ml9icmlkZ2UtPmRtYV9yZXNvdXJjZXMpKTsKKwlJTklUX0xJU1RfSEVBRCgmY2E5MWN4NDJfYnJpZGdlLT5kbWFfcmVzb3VyY2VzKTsKIAlmb3IgKGkgPSAwOyBpIDwgQ0E5MUMxNDJfTUFYX0RNQTsgaSsrKSB7CiAJCWRtYV9jdHJsciA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB2bWVfZG1hX3Jlc291cmNlKSwKIAkJCUdGUF9LRVJORUwpOwpAQCAtMTcxNCwxOSArMTcxNSwxOSBAQAogCQkJZ290byBlcnJfZG1hOwogCQl9CiAJCWRtYV9jdHJsci0+cGFyZW50ID0gY2E5MWN4NDJfYnJpZGdlOwotCQltdXRleF9pbml0KCYoZG1hX2N0cmxyLT5tdHgpKTsKKwkJbXV0ZXhfaW5pdCgmZG1hX2N0cmxyLT5tdHgpOwogCQlkbWFfY3RybHItPmxvY2tlZCA9IDA7CiAJCWRtYV9jdHJsci0+bnVtYmVyID0gaTsKIAkJZG1hX2N0cmxyLT5yb3V0ZV9hdHRyID0gVk1FX0RNQV9WTUVfVE9fTUVNIHwKIAkJCVZNRV9ETUFfTUVNX1RPX1ZNRTsKLQkJSU5JVF9MSVNUX0hFQUQoJihkbWFfY3RybHItPnBlbmRpbmcpKTsKLQkJSU5JVF9MSVNUX0hFQUQoJihkbWFfY3RybHItPnJ1bm5pbmcpKTsKLQkJbGlzdF9hZGRfdGFpbCgmKGRtYV9jdHJsci0+bGlzdCksCi0JCQkmKGNhOTFjeDQyX2JyaWRnZS0+ZG1hX3Jlc291cmNlcykpOworCQlJTklUX0xJU1RfSEVBRCgmZG1hX2N0cmxyLT5wZW5kaW5nKTsKKwkJSU5JVF9MSVNUX0hFQUQoJmRtYV9jdHJsci0+cnVubmluZyk7CisJCWxpc3RfYWRkX3RhaWwoJmRtYV9jdHJsci0+bGlzdCwKKwkJCSZjYTkxY3g0Ml9icmlkZ2UtPmRtYV9yZXNvdXJjZXMpOwogCX0KIAogCS8qIEFkZCBsb2NhdGlvbiBtb25pdG9yIHRvIGxpc3QgKi8KLQlJTklUX0xJU1RfSEVBRCgmKGNhOTFjeDQyX2JyaWRnZS0+bG1fcmVzb3VyY2VzKSk7CisJSU5JVF9MSVNUX0hFQUQoJmNhOTFjeDQyX2JyaWRnZS0+bG1fcmVzb3VyY2VzKTsKIAlsbSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB2bWVfbG1fcmVzb3VyY2UpLCBHRlBfS0VSTkVMKTsKIAlpZiAobG0gPT0gTlVMTCkgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciAiCkBAIC0xNzM1LDExICsxNzM2LDExIEBACiAJCWdvdG8gZXJyX2xtOwogCX0KIAlsbS0+cGFyZW50ID0gY2E5MWN4NDJfYnJpZGdlOwotCW11dGV4X2luaXQoJihsbS0+bXR4KSk7CisJbXV0ZXhfaW5pdCgmbG0tPm10eCk7CiAJbG0tPmxvY2tlZCA9IDA7CiAJbG0tPm51bWJlciA9IDE7CiAJbG0tPm1vbml0b3JzID0gNDsKLQlsaXN0X2FkZF90YWlsKCYobG0tPmxpc3QpLCAmKGNhOTFjeDQyX2JyaWRnZS0+bG1fcmVzb3VyY2VzKSk7CisJbGlzdF9hZGRfdGFpbCgmbG0tPmxpc3QsICZjYTkxY3g0Ml9icmlkZ2UtPmxtX3Jlc291cmNlcyk7CiAKIAljYTkxY3g0Ml9icmlkZ2UtPnNsYXZlX2dldCA9IGNhOTFjeDQyX3NsYXZlX2dldDsKIAljYTkxY3g0Ml9icmlkZ2UtPnNsYXZlX3NldCA9IGNhOTFjeDQyX3NsYXZlX3NldDsKQEAgLTE3ODYsMjggKzE3ODcsMjggQEAKIAljYTkxY3g0Ml9jcmNzcl9leGl0KGNhOTFjeDQyX2JyaWRnZSwgcGRldik7CiBlcnJfbG06CiAJLyogcmVzb3VyY2VzIGFyZSBzdG9yZWQgaW4gbGluayBsaXN0ICovCi0JbGlzdF9mb3JfZWFjaChwb3MsICYoY2E5MWN4NDJfYnJpZGdlLT5sbV9yZXNvdXJjZXMpKSB7CisJbGlzdF9mb3JfZWFjaChwb3MsICZjYTkxY3g0Ml9icmlkZ2UtPmxtX3Jlc291cmNlcykgewogCQlsbSA9IGxpc3RfZW50cnkocG9zLCBzdHJ1Y3Qgdm1lX2xtX3Jlc291cmNlLCBsaXN0KTsKIAkJbGlzdF9kZWwocG9zKTsKIAkJa2ZyZWUobG0pOwogCX0KIGVycl9kbWE6CiAJLyogcmVzb3VyY2VzIGFyZSBzdG9yZWQgaW4gbGluayBsaXN0ICovCi0JbGlzdF9mb3JfZWFjaChwb3MsICYoY2E5MWN4NDJfYnJpZGdlLT5kbWFfcmVzb3VyY2VzKSkgeworCWxpc3RfZm9yX2VhY2gocG9zLCAmY2E5MWN4NDJfYnJpZGdlLT5kbWFfcmVzb3VyY2VzKSB7CiAJCWRtYV9jdHJsciA9IGxpc3RfZW50cnkocG9zLCBzdHJ1Y3Qgdm1lX2RtYV9yZXNvdXJjZSwgbGlzdCk7CiAJCWxpc3RfZGVsKHBvcyk7CiAJCWtmcmVlKGRtYV9jdHJscik7CiAJfQogZXJyX3NsYXZlOgogCS8qIHJlc291cmNlcyBhcmUgc3RvcmVkIGluIGxpbmsgbGlzdCAqLwotCWxpc3RfZm9yX2VhY2gocG9zLCAmKGNhOTFjeDQyX2JyaWRnZS0+c2xhdmVfcmVzb3VyY2VzKSkgeworCWxpc3RfZm9yX2VhY2gocG9zLCAmY2E5MWN4NDJfYnJpZGdlLT5zbGF2ZV9yZXNvdXJjZXMpIHsKIAkJc2xhdmVfaW1hZ2UgPSBsaXN0X2VudHJ5KHBvcywgc3RydWN0IHZtZV9zbGF2ZV9yZXNvdXJjZSwgbGlzdCk7CiAJCWxpc3RfZGVsKHBvcyk7CiAJCWtmcmVlKHNsYXZlX2ltYWdlKTsKIAl9CiBlcnJfbWFzdGVyOgogCS8qIHJlc291cmNlcyBhcmUgc3RvcmVkIGluIGxpbmsgbGlzdCAqLwotCWxpc3RfZm9yX2VhY2gocG9zLCAmKGNhOTFjeDQyX2JyaWRnZS0+bWFzdGVyX3Jlc291cmNlcykpIHsKKwlsaXN0X2Zvcl9lYWNoKHBvcywgJmNhOTFjeDQyX2JyaWRnZS0+bWFzdGVyX3Jlc291cmNlcykgewogCQltYXN0ZXJfaW1hZ2UgPSBsaXN0X2VudHJ5KHBvcywgc3RydWN0IHZtZV9tYXN0ZXJfcmVzb3VyY2UsCiAJCQlsaXN0KTsKIAkJbGlzdF9kZWwocG9zKTsKQEAgLTE4MzEsNyArMTgzMiw3IEBACiAKIH0KIAotdm9pZCBjYTkxY3g0Ml9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCitzdGF0aWMgdm9pZCBjYTkxY3g0Ml9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCiB7CiAJc3RydWN0IGxpc3RfaGVhZCAqcG9zID0gTlVMTDsKIAlzdHJ1Y3Qgdm1lX21hc3Rlcl9yZXNvdXJjZSAqbWFzdGVyX2ltYWdlOwpAQCAtMTg3MCwyOCArMTg3MSwyOCBAQAogCWNhOTFjeDQyX2NyY3NyX2V4aXQoY2E5MWN4NDJfYnJpZGdlLCBwZGV2KTsKIAogCS8qIHJlc291cmNlcyBhcmUgc3RvcmVkIGluIGxpbmsgbGlzdCAqLwotCWxpc3RfZm9yX2VhY2gocG9zLCAmKGNhOTFjeDQyX2JyaWRnZS0+bG1fcmVzb3VyY2VzKSkgeworCWxpc3RfZm9yX2VhY2gocG9zLCAmY2E5MWN4NDJfYnJpZGdlLT5sbV9yZXNvdXJjZXMpIHsKIAkJbG0gPSBsaXN0X2VudHJ5KHBvcywgc3RydWN0IHZtZV9sbV9yZXNvdXJjZSwgbGlzdCk7CiAJCWxpc3RfZGVsKHBvcyk7CiAJCWtmcmVlKGxtKTsKIAl9CiAKIAkvKiByZXNvdXJjZXMgYXJlIHN0b3JlZCBpbiBsaW5rIGxpc3QgKi8KLQlsaXN0X2Zvcl9lYWNoKHBvcywgJihjYTkxY3g0Ml9icmlkZ2UtPmRtYV9yZXNvdXJjZXMpKSB7CisJbGlzdF9mb3JfZWFjaChwb3MsICZjYTkxY3g0Ml9icmlkZ2UtPmRtYV9yZXNvdXJjZXMpIHsKIAkJZG1hX2N0cmxyID0gbGlzdF9lbnRyeShwb3MsIHN0cnVjdCB2bWVfZG1hX3Jlc291cmNlLCBsaXN0KTsKIAkJbGlzdF9kZWwocG9zKTsKIAkJa2ZyZWUoZG1hX2N0cmxyKTsKIAl9CiAKIAkvKiByZXNvdXJjZXMgYXJlIHN0b3JlZCBpbiBsaW5rIGxpc3QgKi8KLQlsaXN0X2Zvcl9lYWNoKHBvcywgJihjYTkxY3g0Ml9icmlkZ2UtPnNsYXZlX3Jlc291cmNlcykpIHsKKwlsaXN0X2Zvcl9lYWNoKHBvcywgJmNhOTFjeDQyX2JyaWRnZS0+c2xhdmVfcmVzb3VyY2VzKSB7CiAJCXNsYXZlX2ltYWdlID0gbGlzdF9lbnRyeShwb3MsIHN0cnVjdCB2bWVfc2xhdmVfcmVzb3VyY2UsIGxpc3QpOwogCQlsaXN0X2RlbChwb3MpOwogCQlrZnJlZShzbGF2ZV9pbWFnZSk7CiAJfQogCiAJLyogcmVzb3VyY2VzIGFyZSBzdG9yZWQgaW4gbGluayBsaXN0ICovCi0JbGlzdF9mb3JfZWFjaChwb3MsICYoY2E5MWN4NDJfYnJpZGdlLT5tYXN0ZXJfcmVzb3VyY2VzKSkgeworCWxpc3RfZm9yX2VhY2gocG9zLCAmY2E5MWN4NDJfYnJpZGdlLT5tYXN0ZXJfcmVzb3VyY2VzKSB7CiAJCW1hc3Rlcl9pbWFnZSA9IGxpc3RfZW50cnkocG9zLCBzdHJ1Y3Qgdm1lX21hc3Rlcl9yZXNvdXJjZSwKIAkJCWxpc3QpOwogCQlsaXN0X2RlbChwb3MpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3ZtZS9icmlkZ2VzL3ZtZV9jYTkxY3g0Mi5oIGIvZHJpdmVycy9zdGFnaW5nL3ZtZS9icmlkZ2VzL3ZtZV9jYTkxY3g0Mi5oCmluZGV4IGU3MmM2NWIuLjAyYTdjNzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy92bWUvYnJpZGdlcy92bWVfY2E5MWN4NDIuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdm1lL2JyaWRnZXMvdm1lX2NhOTFjeDQyLmgKQEAgLTM5LDcgKzM5LDcgQEAKIAogLyogU3RydWN0dXJlIHVzZWQgdG8gaG9sZCBkcml2ZXIgc3BlY2lmaWMgaW5mb3JtYXRpb24gKi8KIHN0cnVjdCBjYTkxY3g0Ml9kcml2ZXIgewotCXZvaWQgKmJhc2U7CS8qIEJhc2UgQWRkcmVzcyBvZiBkZXZpY2UgcmVnaXN0ZXJzICovCisJdm9pZCBfX2lvbWVtICpiYXNlOwkvKiBCYXNlIEFkZHJlc3Mgb2YgZGV2aWNlIHJlZ2lzdGVycyAqLwogCXdhaXRfcXVldWVfaGVhZF90IGRtYV9xdWV1ZTsKIAl3YWl0X3F1ZXVlX2hlYWRfdCBpYWNrX3F1ZXVlOwogCXdhaXRfcXVldWVfaGVhZF90IG1ib3hfcXVldWU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdm1lL2JyaWRnZXMvdm1lX3RzaTE0OC5jIGIvZHJpdmVycy9zdGFnaW5nL3ZtZS9icmlkZ2VzL3ZtZV90c2kxNDguYwppbmRleCA0OTJkZGIyLi4yNmVhNDJmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdm1lL2JyaWRnZXMvdm1lX3RzaTE0OC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92bWUvYnJpZGdlcy92bWVfdHNpMTQ4LmMKQEAgLTQ2LDcgKzQ2LDcgQEAKIAogc3RhdGljIGNoYXIgZHJpdmVyX25hbWVbXSA9ICJ2bWVfdHNpMTQ4IjsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkIHRzaTE0OF9pZHNbXSA9IHsKK3N0YXRpYyBERUZJTkVfUENJX0RFVklDRV9UQUJMRSh0c2kxNDhfaWRzKSA9IHsKIAl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9UVU5EUkEsIFBDSV9ERVZJQ0VfSURfVFVORFJBX1RTSTE0OCkgfSwKIAl7IH0sCiB9OwpAQCAtODEsMTEgKzgxLDExIEBACiAJdTMyIHNlcnZpY2VkID0gMDsKIAogCWlmIChjaGFubmVsX21hc2sgJiBUU0kxNDhfTENTUl9JTlRTX0RNQTBTKSB7Ci0JCXdha2VfdXAoJihicmlkZ2UtPmRtYV9xdWV1ZVswXSkpOworCQl3YWtlX3VwKCZicmlkZ2UtPmRtYV9xdWV1ZVswXSk7CiAJCXNlcnZpY2VkIHw9IFRTSTE0OF9MQ1NSX0lOVENfRE1BMEM7CiAJfQogCWlmIChjaGFubmVsX21hc2sgJiBUU0kxNDhfTENTUl9JTlRTX0RNQTFTKSB7Ci0JCXdha2VfdXAoJihicmlkZ2UtPmRtYV9xdWV1ZVsxXSkpOworCQl3YWtlX3VwKCZicmlkZ2UtPmRtYV9xdWV1ZVsxXSk7CiAJCXNlcnZpY2VkIHw9IFRTSTE0OF9MQ1NSX0lOVENfRE1BMUM7CiAJfQogCkBAIC0xOTEsNyArMTkxLDcgQEAKIAlpZiAoZXJyb3IpIHsKIAkJZXJyb3ItPmFkZHJlc3MgPSBlcnJvcl9hZGRyOwogCQllcnJvci0+YXR0cmlidXRlcyA9IGVycm9yX2F0dHJpYjsKLQkJbGlzdF9hZGRfdGFpbCgmKGVycm9yLT5saXN0KSwgJih0c2kxNDhfYnJpZGdlLT52bWVfZXJyb3JzKSk7CisJCWxpc3RfYWRkX3RhaWwoJmVycm9yLT5saXN0LCAmdHNpMTQ4X2JyaWRnZS0+dm1lX2Vycm9ycyk7CiAJfSBlbHNlIHsKIAkJZGV2X2Vycih0c2kxNDhfYnJpZGdlLT5wYXJlbnQsICJVbmFibGUgdG8gYWxsb2MgbWVtb3J5IGZvciAiCiAJCQkiVk1FYnVzIEVycm9yIHJlcG9ydGluZ1xuIik7CkBAIC0yMTAsNyArMjEwLDcgQEAKICAqLwogc3RhdGljIHUzMiB0c2kxNDhfSUFDS19pcnFoYW5kbGVyKHN0cnVjdCB0c2kxNDhfZHJpdmVyICpicmlkZ2UpCiB7Ci0Jd2FrZV91cCgmKGJyaWRnZS0+aWFja19xdWV1ZSkpOworCXdha2VfdXAoJmJyaWRnZS0+aWFja19xdWV1ZSk7CiAKIAlyZXR1cm4gVFNJMTQ4X0xDU1JfSU5UQ19JQUNLQzsKIH0KQEAgLTMyMCw5ICszMjAsOSBAQAogCWJyaWRnZSA9IHRzaTE0OF9icmlkZ2UtPmRyaXZlcl9wcml2OwogCiAJLyogSW5pdGlhbGlzZSBsaXN0IGZvciBWTUUgYnVzIGVycm9ycyAqLwotCUlOSVRfTElTVF9IRUFEKCYodHNpMTQ4X2JyaWRnZS0+dm1lX2Vycm9ycykpOworCUlOSVRfTElTVF9IRUFEKCZ0c2kxNDhfYnJpZGdlLT52bWVfZXJyb3JzKTsKIAotCW11dGV4X2luaXQoJih0c2kxNDhfYnJpZGdlLT5pcnFfbXR4KSk7CisJbXV0ZXhfaW5pdCgmdHNpMTQ4X2JyaWRnZS0+aXJxX210eCk7CiAKIAlyZXN1bHQgPSByZXF1ZXN0X2lycShwZGV2LT5pcnEsCiAJCQkgICAgIHRzaTE0OF9pcnFoYW5kbGVyLApAQCAtMzc0LDggKzM3NCwxMSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCB0c2kxNDhfaXJxX2V4aXQoc3RydWN0IHRzaTE0OF9kcml2ZXIgKmJyaWRnZSwgc3RydWN0IHBjaV9kZXYgKnBkZXYpCitzdGF0aWMgdm9pZCB0c2kxNDhfaXJxX2V4aXQoc3RydWN0IHZtZV9icmlkZ2UgKnRzaTE0OF9icmlkZ2UsCisJc3RydWN0IHBjaV9kZXYgKnBkZXYpCiB7CisJc3RydWN0IHRzaTE0OF9kcml2ZXIgKmJyaWRnZSA9IHRzaTE0OF9icmlkZ2UtPmRyaXZlcl9wcml2OworCiAJLyogVHVybiBvZmYgaW50ZXJydXB0cyAqLwogCWlvd3JpdGUzMmJlKDB4MCwgYnJpZGdlLT5iYXNlICsgVFNJMTQ4X0xDU1JfSU5URU8pOwogCWlvd3JpdGUzMmJlKDB4MCwgYnJpZGdlLT5iYXNlICsgVFNJMTQ4X0xDU1JfSU5URU4pOwpAQCAtMzg0LDEzICszODcsMTMgQEAKIAlpb3dyaXRlMzJiZSgweEZGRkZGRkZGLCBicmlkZ2UtPmJhc2UgKyBUU0kxNDhfTENTUl9JTlRDKTsKIAogCS8qIERldGFjaCBpbnRlcnJ1cHQgaGFuZGxlciAqLwotCWZyZWVfaXJxKHBkZXYtPmlycSwgcGRldik7CisJZnJlZV9pcnEocGRldi0+aXJxLCB0c2kxNDhfYnJpZGdlKTsKIH0KIAogLyoKICAqIENoZWNrIHRvIHNlZSBpZiBhbiBJQUNrIGhhcyBiZWVuIHJlY2VpdmVkLCByZXR1cm4gdHJ1ZSAoMSkgb3IgZmFsc2UgKDApLgogICovCi1pbnQgdHNpMTQ4X2lhY2tfcmVjZWl2ZWQoc3RydWN0IHRzaTE0OF9kcml2ZXIgKmJyaWRnZSkKK3N0YXRpYyBpbnQgdHNpMTQ4X2lhY2tfcmVjZWl2ZWQoc3RydWN0IHRzaTE0OF9kcml2ZXIgKmJyaWRnZSkKIHsKIAl1MzIgdG1wOwogCkBAIC00MDUsNyArNDA4LDcgQEAKIC8qCiAgKiBDb25maWd1cmUgVk1FIGludGVycnVwdAogICovCi12b2lkIHRzaTE0OF9pcnFfc2V0KHN0cnVjdCB2bWVfYnJpZGdlICp0c2kxNDhfYnJpZGdlLCBpbnQgbGV2ZWwsCitzdGF0aWMgdm9pZCB0c2kxNDhfaXJxX3NldChzdHJ1Y3Qgdm1lX2JyaWRnZSAqdHNpMTQ4X2JyaWRnZSwgaW50IGxldmVsLAogCWludCBzdGF0ZSwgaW50IHN5bmMpCiB7CiAJc3RydWN0IHBjaV9kZXYgKnBkZXY7CkBAIC00NDUsMTQgKzQ0OCwxNSBAQAogICogR2VuZXJhdGUgYSBWTUUgYnVzIGludGVycnVwdCBhdCB0aGUgcmVxdWVzdGVkIGxldmVsICYgdmVjdG9yLiBXYWl0IGZvcgogICogaW50ZXJydXB0IHRvIGJlIGFja2VkLgogICovCi1pbnQgdHNpMTQ4X2lycV9nZW5lcmF0ZShzdHJ1Y3Qgdm1lX2JyaWRnZSAqdHNpMTQ4X2JyaWRnZSwgaW50IGxldmVsLCBpbnQgc3RhdGlkKQorc3RhdGljIGludCB0c2kxNDhfaXJxX2dlbmVyYXRlKHN0cnVjdCB2bWVfYnJpZGdlICp0c2kxNDhfYnJpZGdlLCBpbnQgbGV2ZWwsCisJaW50IHN0YXRpZCkKIHsKIAl1MzIgdG1wOwogCXN0cnVjdCB0c2kxNDhfZHJpdmVyICpicmlkZ2U7CiAKIAlicmlkZ2UgPSB0c2kxNDhfYnJpZGdlLT5kcml2ZXJfcHJpdjsKIAotCW11dGV4X2xvY2soJihicmlkZ2UtPnZtZV9pbnQpKTsKKwltdXRleF9sb2NrKCZicmlkZ2UtPnZtZV9pbnQpOwogCiAJLyogUmVhZCBWSUNSIHJlZ2lzdGVyICovCiAJdG1wID0gaW9yZWFkMzJiZShicmlkZ2UtPmJhc2UgKyBUU0kxNDhfTENTUl9WSUNSKTsKQEAgLTQ3MCw3ICs0NzQsNyBAQAogCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShicmlkZ2UtPmlhY2tfcXVldWUsCiAJCXRzaTE0OF9pYWNrX3JlY2VpdmVkKGJyaWRnZSkpOwogCi0JbXV0ZXhfdW5sb2NrKCYoYnJpZGdlLT52bWVfaW50KSk7CisJbXV0ZXhfdW5sb2NrKCZicmlkZ2UtPnZtZV9pbnQpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC00OTYsNyArNTAwLDcgQEAKIAkgKi8KIAllcnJfcG9zID0gTlVMTDsKIAkvKiBJdGVyYXRlIHRocm91Z2ggZXJyb3JzICovCi0JbGlzdF9mb3JfZWFjaChlcnJfcG9zLCAmKHRzaTE0OF9icmlkZ2UtPnZtZV9lcnJvcnMpKSB7CisJbGlzdF9mb3JfZWFjaChlcnJfcG9zLCAmdHNpMTQ4X2JyaWRnZS0+dm1lX2Vycm9ycykgewogCQl2bWVfZXJyID0gbGlzdF9lbnRyeShlcnJfcG9zLCBzdHJ1Y3Qgdm1lX2J1c19lcnJvciwgbGlzdCk7CiAJCWlmICgodm1lX2Vyci0+YWRkcmVzcyA+PSBhZGRyZXNzKSAmJgogCQkJKHZtZV9lcnItPmFkZHJlc3MgPCBib3VuZCkpIHsKQEAgLTUzMCw3ICs1MzQsNyBAQAogCSAqLwogCWVycl9wb3MgPSBOVUxMOwogCS8qIEl0ZXJhdGUgdGhyb3VnaCBlcnJvcnMgKi8KLQlsaXN0X2Zvcl9lYWNoX3NhZmUoZXJyX3BvcywgdGVtcCwgJih0c2kxNDhfYnJpZGdlLT52bWVfZXJyb3JzKSkgeworCWxpc3RfZm9yX2VhY2hfc2FmZShlcnJfcG9zLCB0ZW1wLCAmdHNpMTQ4X2JyaWRnZS0+dm1lX2Vycm9ycykgewogCQl2bWVfZXJyID0gbGlzdF9lbnRyeShlcnJfcG9zLCBzdHJ1Y3Qgdm1lX2J1c19lcnJvciwgbGlzdCk7CiAKIAkJaWYgKCh2bWVfZXJyLT5hZGRyZXNzID49IGFkZHJlc3MpICYmCkBAIC01NDUsNyArNTQ5LDcgQEAKIC8qCiAgKiBJbml0aWFsaXplIGEgc2xhdmUgd2luZG93IHdpdGggdGhlIHJlcXVlc3RlZCBhdHRyaWJ1dGVzLgogICovCi1pbnQgdHNpMTQ4X3NsYXZlX3NldChzdHJ1Y3Qgdm1lX3NsYXZlX3Jlc291cmNlICppbWFnZSwgaW50IGVuYWJsZWQsCitzdGF0aWMgaW50IHRzaTE0OF9zbGF2ZV9zZXQoc3RydWN0IHZtZV9zbGF2ZV9yZXNvdXJjZSAqaW1hZ2UsIGludCBlbmFibGVkLAogCXVuc2lnbmVkIGxvbmcgbG9uZyB2bWVfYmFzZSwgdW5zaWduZWQgbG9uZyBsb25nIHNpemUsCiAJZG1hX2FkZHJfdCBwY2lfYmFzZSwgdm1lX2FkZHJlc3NfdCBhc3BhY2UsIHZtZV9jeWNsZV90IGN5Y2xlKQogewpAQCAtNjk1LDcgKzY5OSw3IEBACiAvKgogICogR2V0IHNsYXZlIHdpbmRvdyBjb25maWd1cmF0aW9uLgogICovCi1pbnQgdHNpMTQ4X3NsYXZlX2dldChzdHJ1Y3Qgdm1lX3NsYXZlX3Jlc291cmNlICppbWFnZSwgaW50ICplbmFibGVkLAorc3RhdGljIGludCB0c2kxNDhfc2xhdmVfZ2V0KHN0cnVjdCB2bWVfc2xhdmVfcmVzb3VyY2UgKmltYWdlLCBpbnQgKmVuYWJsZWQsCiAJdW5zaWduZWQgbG9uZyBsb25nICp2bWVfYmFzZSwgdW5zaWduZWQgbG9uZyBsb25nICpzaXplLAogCWRtYV9hZGRyX3QgKnBjaV9iYXNlLCB2bWVfYWRkcmVzc190ICphc3BhY2UsIHZtZV9jeWNsZV90ICpjeWNsZSkKIHsKQEAgLTgxOSw4ICs4MjMsOCBAQAogCQlpbWFnZS0+a2Vybl9iYXNlID0gTlVMTDsKIAkJaWYgKGltYWdlLT5idXNfcmVzb3VyY2UubmFtZSAhPSBOVUxMKQogCQkJa2ZyZWUoaW1hZ2UtPmJ1c19yZXNvdXJjZS5uYW1lKTsKLQkJcmVsZWFzZV9yZXNvdXJjZSgmKGltYWdlLT5idXNfcmVzb3VyY2UpKTsKLQkJbWVtc2V0KCYoaW1hZ2UtPmJ1c19yZXNvdXJjZSksIDAsIHNpemVvZihzdHJ1Y3QgcmVzb3VyY2UpKTsKKwkJcmVsZWFzZV9yZXNvdXJjZSgmaW1hZ2UtPmJ1c19yZXNvdXJjZSk7CisJCW1lbXNldCgmaW1hZ2UtPmJ1c19yZXNvdXJjZSwgMCwgc2l6ZW9mKHN0cnVjdCByZXNvdXJjZSkpOwogCX0KIAogCS8qIEV4aXQgaGVyZSBpZiBzaXplIGlzIHplcm8gKi8KQEAgLTg0NSw3ICs4NDksNyBAQAogCWltYWdlLT5idXNfcmVzb3VyY2UuZmxhZ3MgPSBJT1JFU09VUkNFX01FTTsKIAogCXJldHZhbCA9IHBjaV9idXNfYWxsb2NfcmVzb3VyY2UocGRldi0+YnVzLAotCQkmKGltYWdlLT5idXNfcmVzb3VyY2UpLCBzaXplLCBzaXplLCBQQ0lCSU9TX01JTl9NRU0sCisJCSZpbWFnZS0+YnVzX3Jlc291cmNlLCBzaXplLCBzaXplLCBQQ0lCSU9TX01JTl9NRU0sCiAJCTAsIE5VTEwsIE5VTEwpOwogCWlmIChyZXR2YWwpIHsKIAkJZGV2X2Vycih0c2kxNDhfYnJpZGdlLT5wYXJlbnQsICJGYWlsZWQgdG8gYWxsb2NhdGUgbWVtICIKQEAgLTg2OCwxMCArODcyLDEwIEBACiAJaW91bm1hcChpbWFnZS0+a2Vybl9iYXNlKTsKIAlpbWFnZS0+a2Vybl9iYXNlID0gTlVMTDsKIGVycl9yZW1hcDoKLQlyZWxlYXNlX3Jlc291cmNlKCYoaW1hZ2UtPmJ1c19yZXNvdXJjZSkpOworCXJlbGVhc2VfcmVzb3VyY2UoJmltYWdlLT5idXNfcmVzb3VyY2UpOwogZXJyX3Jlc291cmNlOgogCWtmcmVlKGltYWdlLT5idXNfcmVzb3VyY2UubmFtZSk7Ci0JbWVtc2V0KCYoaW1hZ2UtPmJ1c19yZXNvdXJjZSksIDAsIHNpemVvZihzdHJ1Y3QgcmVzb3VyY2UpKTsKKwltZW1zZXQoJmltYWdlLT5idXNfcmVzb3VyY2UsIDAsIHNpemVvZihzdHJ1Y3QgcmVzb3VyY2UpKTsKIGVycl9uYW1lOgogCXJldHVybiByZXR2YWw7CiB9CkBAIC04ODMsMTUgKzg4NywxNSBAQAogewogCWlvdW5tYXAoaW1hZ2UtPmtlcm5fYmFzZSk7CiAJaW1hZ2UtPmtlcm5fYmFzZSA9IE5VTEw7Ci0JcmVsZWFzZV9yZXNvdXJjZSgmKGltYWdlLT5idXNfcmVzb3VyY2UpKTsKKwlyZWxlYXNlX3Jlc291cmNlKCZpbWFnZS0+YnVzX3Jlc291cmNlKTsKIAlrZnJlZShpbWFnZS0+YnVzX3Jlc291cmNlLm5hbWUpOwotCW1lbXNldCgmKGltYWdlLT5idXNfcmVzb3VyY2UpLCAwLCBzaXplb2Yoc3RydWN0IHJlc291cmNlKSk7CisJbWVtc2V0KCZpbWFnZS0+YnVzX3Jlc291cmNlLCAwLCBzaXplb2Yoc3RydWN0IHJlc291cmNlKSk7CiB9CiAKIC8qCiAgKiBTZXQgdGhlIGF0dHJpYnV0ZXMgb2YgYW4gb3V0Ym91bmQgd2luZG93LgogICovCi1pbnQgdHNpMTQ4X21hc3Rlcl9zZXQoc3RydWN0IHZtZV9tYXN0ZXJfcmVzb3VyY2UgKmltYWdlLCBpbnQgZW5hYmxlZCwKK3N0YXRpYyBpbnQgdHNpMTQ4X21hc3Rlcl9zZXQoc3RydWN0IHZtZV9tYXN0ZXJfcmVzb3VyY2UgKmltYWdlLCBpbnQgZW5hYmxlZCwKIAl1bnNpZ25lZCBsb25nIGxvbmcgdm1lX2Jhc2UsIHVuc2lnbmVkIGxvbmcgbG9uZyBzaXplLAogCXZtZV9hZGRyZXNzX3QgYXNwYWNlLCB2bWVfY3ljbGVfdCBjeWNsZSwgdm1lX3dpZHRoX3QgZHdpZHRoKQogewpAQCAtOTI0LDcgKzkyOCw3IEBACiAJCWdvdG8gZXJyX3dpbmRvdzsKIAl9CiAKLQlzcGluX2xvY2soJihpbWFnZS0+bG9jaykpOworCXNwaW5fbG9jaygmaW1hZ2UtPmxvY2spOwogCiAJLyogTGV0J3MgYWxsb2NhdGUgdGhlIHJlc291cmNlIGhlcmUgcmF0aGVyIHRoYW4gZnVydGhlciB1cCB0aGUgc3RhY2sgYXMKIAkgKiBpdCBhdm9pZHMgcHVzaGluZyBsb2FkcyBvZiBidXMgZGVwZW5kYW50IHN0dWZmIHVwIHRoZSBzdGFjay4gSWYgc2l6ZQpAQCAtOTMyLDcgKzkzNiw3IEBACiAJICovCiAJcmV0dmFsID0gdHNpMTQ4X2FsbG9jX3Jlc291cmNlKGltYWdlLCBzaXplKTsKIAlpZiAocmV0dmFsKSB7Ci0JCXNwaW5fdW5sb2NrKCYoaW1hZ2UtPmxvY2spKTsKKwkJc3Bpbl91bmxvY2soJmltYWdlLT5sb2NrKTsKIAkJZGV2X2Vycih0c2kxNDhfYnJpZGdlLT5wYXJlbnQsICJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciAiCiAJCQkicmVzb3VyY2VcbiIpOwogCQlnb3RvIGVycl9yZXM7CkBAIC05NTksMTkgKzk2MywxOSBAQAogCXJlZ19zcGxpdCh2bWVfb2Zmc2V0LCAmdm1lX29mZnNldF9oaWdoLCAmdm1lX29mZnNldF9sb3cpOwogCiAJaWYgKHBjaV9iYXNlX2xvdyAmIDB4RkZGRikgewotCQlzcGluX3VubG9jaygmKGltYWdlLT5sb2NrKSk7CisJCXNwaW5fdW5sb2NrKCZpbWFnZS0+bG9jayk7CiAJCWRldl9lcnIodHNpMTQ4X2JyaWRnZS0+cGFyZW50LCAiSW52YWxpZCBQQ0kgYmFzZSBhbGlnbm1lbnRcbiIpOwogCQlyZXR2YWwgPSAtRUlOVkFMOwogCQlnb3RvIGVycl9ncmFuOwogCX0KIAlpZiAocGNpX2JvdW5kX2xvdyAmIDB4RkZGRikgewotCQlzcGluX3VubG9jaygmKGltYWdlLT5sb2NrKSk7CisJCXNwaW5fdW5sb2NrKCZpbWFnZS0+bG9jayk7CiAJCWRldl9lcnIodHNpMTQ4X2JyaWRnZS0+cGFyZW50LCAiSW52YWxpZCBQQ0kgYm91bmQgYWxpZ25tZW50XG4iKTsKIAkJcmV0dmFsID0gLUVJTlZBTDsKIAkJZ290byBlcnJfZ3JhbjsKIAl9CiAJaWYgKHZtZV9vZmZzZXRfbG93ICYgMHhGRkZGKSB7Ci0JCXNwaW5fdW5sb2NrKCYoaW1hZ2UtPmxvY2spKTsKKwkJc3Bpbl91bmxvY2soJmltYWdlLT5sb2NrKTsKIAkJZGV2X2Vycih0c2kxNDhfYnJpZGdlLT5wYXJlbnQsICJJbnZhbGlkIFZNRSBPZmZzZXQgIgogCQkJImFsaWdubWVudFxuIik7CiAJCXJldHZhbCA9IC1FSU5WQUw7CkBAIC0xMDM1LDcgKzEwMzksNyBAQAogCQl0ZW1wX2N0bCB8PSBUU0kxNDhfTENTUl9PVEFUX0RCV18zMjsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJc3Bpbl91bmxvY2soJihpbWFnZS0+bG9jaykpOworCQlzcGluX3VubG9jaygmaW1hZ2UtPmxvY2spOwogCQlkZXZfZXJyKHRzaTE0OF9icmlkZ2UtPnBhcmVudCwgIkludmFsaWQgZGF0YSB3aWR0aFxuIik7CiAJCXJldHZhbCA9IC1FSU5WQUw7CiAJCWdvdG8gZXJyX2R3aWR0aDsKQEAgLTEwNzIsNyArMTA3Niw3IEBACiAJCXRlbXBfY3RsIHw9IFRTSTE0OF9MQ1NSX09UQVRfQU1PREVfVVNFUjQ7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCXNwaW5fdW5sb2NrKCYoaW1hZ2UtPmxvY2spKTsKKwkJc3Bpbl91bmxvY2soJmltYWdlLT5sb2NrKTsKIAkJZGV2X2Vycih0c2kxNDhfYnJpZGdlLT5wYXJlbnQsICJJbnZhbGlkIGFkZHJlc3Mgc3BhY2VcbiIpOwogCQlyZXR2YWwgPSAtRUlOVkFMOwogCQlnb3RvIGVycl9hc3BhY2U7CkBAIC0xMTA5LDcgKzExMTMsNyBAQAogCWlvd3JpdGUzMmJlKHRlbXBfY3RsLCBicmlkZ2UtPmJhc2UgKyBUU0kxNDhfTENTUl9PVFtpXSArCiAJCVRTSTE0OF9MQ1NSX09GRlNFVF9PVEFUKTsKIAotCXNwaW5fdW5sb2NrKCYoaW1hZ2UtPmxvY2spKTsKKwlzcGluX3VubG9jaygmaW1hZ2UtPmxvY2spOwogCXJldHVybiAwOwogCiBlcnJfYXNwYWNlOgpAQCAtMTEyNyw3ICsxMTMxLDcgQEAKICAqCiAgKiBYWFggTm90IHBhcnNpbmcgcHJlZmV0Y2ggaW5mb3JtYXRpb24uCiAgKi8KLWludCBfX3RzaTE0OF9tYXN0ZXJfZ2V0KHN0cnVjdCB2bWVfbWFzdGVyX3Jlc291cmNlICppbWFnZSwgaW50ICplbmFibGVkLAorc3RhdGljIGludCBfX3RzaTE0OF9tYXN0ZXJfZ2V0KHN0cnVjdCB2bWVfbWFzdGVyX3Jlc291cmNlICppbWFnZSwgaW50ICplbmFibGVkLAogCXVuc2lnbmVkIGxvbmcgbG9uZyAqdm1lX2Jhc2UsIHVuc2lnbmVkIGxvbmcgbG9uZyAqc2l6ZSwKIAl2bWVfYWRkcmVzc190ICphc3BhY2UsIHZtZV9jeWNsZV90ICpjeWNsZSwgdm1lX3dpZHRoX3QgKmR3aWR0aCkKIHsKQEAgLTEyMzcsMjMgKzEyNDEsMjMgQEAKIH0KIAogCi1pbnQgdHNpMTQ4X21hc3Rlcl9nZXQoc3RydWN0IHZtZV9tYXN0ZXJfcmVzb3VyY2UgKmltYWdlLCBpbnQgKmVuYWJsZWQsCitzdGF0aWMgaW50IHRzaTE0OF9tYXN0ZXJfZ2V0KHN0cnVjdCB2bWVfbWFzdGVyX3Jlc291cmNlICppbWFnZSwgaW50ICplbmFibGVkLAogCXVuc2lnbmVkIGxvbmcgbG9uZyAqdm1lX2Jhc2UsIHVuc2lnbmVkIGxvbmcgbG9uZyAqc2l6ZSwKIAl2bWVfYWRkcmVzc190ICphc3BhY2UsIHZtZV9jeWNsZV90ICpjeWNsZSwgdm1lX3dpZHRoX3QgKmR3aWR0aCkKIHsKIAlpbnQgcmV0dmFsOwogCi0Jc3Bpbl9sb2NrKCYoaW1hZ2UtPmxvY2spKTsKKwlzcGluX2xvY2soJmltYWdlLT5sb2NrKTsKIAogCXJldHZhbCA9IF9fdHNpMTQ4X21hc3Rlcl9nZXQoaW1hZ2UsIGVuYWJsZWQsIHZtZV9iYXNlLCBzaXplLCBhc3BhY2UsCiAJCWN5Y2xlLCBkd2lkdGgpOwogCi0Jc3Bpbl91bmxvY2soJihpbWFnZS0+bG9jaykpOworCXNwaW5fdW5sb2NrKCZpbWFnZS0+bG9jayk7CiAKIAlyZXR1cm4gcmV0dmFsOwogfQogCi1zc2l6ZV90IHRzaTE0OF9tYXN0ZXJfcmVhZChzdHJ1Y3Qgdm1lX21hc3Rlcl9yZXNvdXJjZSAqaW1hZ2UsIHZvaWQgKmJ1ZiwKK3N0YXRpYyBzc2l6ZV90IHRzaTE0OF9tYXN0ZXJfcmVhZChzdHJ1Y3Qgdm1lX21hc3Rlcl9yZXNvdXJjZSAqaW1hZ2UsIHZvaWQgKmJ1ZiwKIAlzaXplX3QgY291bnQsIGxvZmZfdCBvZmZzZXQpCiB7CiAJaW50IHJldHZhbCwgZW5hYmxlZDsKQEAgLTEyNjYsNyArMTI3MCw3IEBACiAKIAl0c2kxNDhfYnJpZGdlID0gaW1hZ2UtPnBhcmVudDsKIAotCXNwaW5fbG9jaygmKGltYWdlLT5sb2NrKSk7CisJc3Bpbl9sb2NrKCZpbWFnZS0+bG9jayk7CiAKIAltZW1jcHlfZnJvbWlvKGJ1ZiwgaW1hZ2UtPmtlcm5fYmFzZSArIG9mZnNldCwgKHVuc2lnbmVkIGludCljb3VudCk7CiAJcmV0dmFsID0gY291bnQ7CkBAIC0xMjg5LDEzICsxMjkzLDEzIEBACiAJfQogCiBza2lwX2NoazoKLQlzcGluX3VubG9jaygmKGltYWdlLT5sb2NrKSk7CisJc3Bpbl91bmxvY2soJmltYWdlLT5sb2NrKTsKIAogCXJldHVybiByZXR2YWw7CiB9CiAKIAotc3NpemVfdCB0c2kxNDhfbWFzdGVyX3dyaXRlKHN0cnVjdCB2bWVfbWFzdGVyX3Jlc291cmNlICppbWFnZSwgdm9pZCAqYnVmLAorc3RhdGljIHNzaXplX3QgdHNpMTQ4X21hc3Rlcl93cml0ZShzdHJ1Y3Qgdm1lX21hc3Rlcl9yZXNvdXJjZSAqaW1hZ2UsIHZvaWQgKmJ1ZiwKIAlzaXplX3QgY291bnQsIGxvZmZfdCBvZmZzZXQpCiB7CiAJaW50IHJldHZhbCA9IDAsIGVuYWJsZWQ7CkBAIC0xMzEyLDcgKzEzMTYsNyBAQAogCiAJYnJpZGdlID0gdHNpMTQ4X2JyaWRnZS0+ZHJpdmVyX3ByaXY7CiAKLQlzcGluX2xvY2soJihpbWFnZS0+bG9jaykpOworCXNwaW5fbG9jaygmaW1hZ2UtPmxvY2spOwogCiAJbWVtY3B5X3RvaW8oaW1hZ2UtPmtlcm5fYmFzZSArIG9mZnNldCwgYnVmLCAodW5zaWduZWQgaW50KWNvdW50KTsKIAlyZXR2YWwgPSBjb3VudDsKQEAgLTEzNTIsNyArMTM1Niw3IEBACiAJfQogCiBza2lwX2NoazoKLQlzcGluX3VubG9jaygmKGltYWdlLT5sb2NrKSk7CisJc3Bpbl91bmxvY2soJmltYWdlLT5sb2NrKTsKIAogCXJldHVybiByZXR2YWw7CiB9CkBAIC0xMzYyLDcgKzEzNjYsNyBAQAogICoKICAqIFJlcXVpcmVzIGEgcHJldmlvdXNseSBjb25maWd1cmVkIG1hc3RlciB3aW5kb3csIHJldHVybnMgZmluYWwgdmFsdWUuCiAgKi8KLXVuc2lnbmVkIGludCB0c2kxNDhfbWFzdGVyX3JtdyhzdHJ1Y3Qgdm1lX21hc3Rlcl9yZXNvdXJjZSAqaW1hZ2UsCitzdGF0aWMgdW5zaWduZWQgaW50IHRzaTE0OF9tYXN0ZXJfcm13KHN0cnVjdCB2bWVfbWFzdGVyX3Jlc291cmNlICppbWFnZSwKIAl1bnNpZ25lZCBpbnQgbWFzaywgdW5zaWduZWQgaW50IGNvbXBhcmUsIHVuc2lnbmVkIGludCBzd2FwLAogCWxvZmZfdCBvZmZzZXQpCiB7CkBAIC0xMzc4LDEwICsxMzgyLDEwIEBACiAJaSA9IGltYWdlLT5udW1iZXI7CiAKIAkvKiBMb2NraW5nIGFzIHdlIGNhbiBvbmx5IGRvIG9uZSBvZiB0aGVzZSBhdCBhIHRpbWUgKi8KLQltdXRleF9sb2NrKCYoYnJpZGdlLT52bWVfcm13KSk7CisJbXV0ZXhfbG9jaygmYnJpZGdlLT52bWVfcm13KTsKIAogCS8qIExvY2sgaW1hZ2UgKi8KLQlzcGluX2xvY2soJihpbWFnZS0+bG9jaykpOworCXNwaW5fbG9jaygmaW1hZ2UtPmxvY2spOwogCiAJcGNpX2FkZHJfaGlnaCA9IGlvcmVhZDMyYmUoYnJpZGdlLT5iYXNlICsgVFNJMTQ4X0xDU1JfT1RbaV0gKwogCQlUU0kxNDhfTENTUl9PRkZTRVRfT1RTQVUpOwpAQCAtMTQxMSw5ICsxNDE1LDkgQEAKIAl0bXAgJj0gflRTSTE0OF9MQ1NSX1ZNQ1RSTF9STVdFTjsKIAlpb3dyaXRlMzJiZSh0bXAsIGJyaWRnZS0+YmFzZSArIFRTSTE0OF9MQ1NSX1ZNQ1RSTCk7CiAKLQlzcGluX3VubG9jaygmKGltYWdlLT5sb2NrKSk7CisJc3Bpbl91bmxvY2soJmltYWdlLT5sb2NrKTsKIAotCW11dGV4X3VubG9jaygmKGJyaWRnZS0+dm1lX3JtdykpOworCW11dGV4X3VubG9jaygmYnJpZGdlLT52bWVfcm13KTsKIAogCXJldHVybiByZXN1bHQ7CiB9CkBAIC0xNjA5LDggKzE2MTMsOCBAQAogLyoKICAqIEFkZCBhIGxpbmsgbGlzdCBkZXNjcmlwdG9yIHRvIHRoZSBsaXN0CiAgKi8KLWludCB0c2kxNDhfZG1hX2xpc3RfYWRkKHN0cnVjdCB2bWVfZG1hX2xpc3QgKmxpc3QsIHN0cnVjdCB2bWVfZG1hX2F0dHIgKnNyYywKLQlzdHJ1Y3Qgdm1lX2RtYV9hdHRyICpkZXN0LCBzaXplX3QgY291bnQpCitzdGF0aWMgaW50IHRzaTE0OF9kbWFfbGlzdF9hZGQoc3RydWN0IHZtZV9kbWFfbGlzdCAqbGlzdCwKKwlzdHJ1Y3Qgdm1lX2RtYV9hdHRyICpzcmMsIHN0cnVjdCB2bWVfZG1hX2F0dHIgKmRlc3QsIHNpemVfdCBjb3VudCkKIHsKIAlzdHJ1Y3QgdHNpMTQ4X2RtYV9lbnRyeSAqZW50cnksICpwcmV2OwogCXUzMiBhZGRyZXNzX2hpZ2gsIGFkZHJlc3NfbG93OwpAQCAtMTYzMywxMCArMTYzNywxMCBAQAogCX0KIAogCS8qIFRlc3QgZGVzY3JpcHRvciBhbGlnbm1lbnQgKi8KLQlpZiAoKHVuc2lnbmVkIGxvbmcpJihlbnRyeS0+ZGVzY3JpcHRvcikgJiAweDcpIHsKKwlpZiAoKHVuc2lnbmVkIGxvbmcpJmVudHJ5LT5kZXNjcmlwdG9yICYgMHg3KSB7CiAJCWRldl9lcnIodHNpMTQ4X2JyaWRnZS0+cGFyZW50LCAiRGVzY3JpcHRvciBub3QgYWxpZ25lZCB0byA4ICIKIAkJCSJieXRlIGJvdW5kYXJ5IGFzIHJlcXVpcmVkOiAlcFxuIiwKLQkJCSYoZW50cnktPmRlc2NyaXB0b3IpKTsKKwkJCSZlbnRyeS0+ZGVzY3JpcHRvcik7CiAJCXJldHZhbCA9IC1FSU5WQUw7CiAJCWdvdG8gZXJyX2FsaWduOwogCX0KQEAgLTE2NDQsNyArMTY0OCw3IEBACiAJLyogR2l2ZW4gd2UgYXJlIGdvaW5nIHRvIGZpbGwgb3V0IHRoZSBzdHJ1Y3R1cmUsIHdlIHByb2JhYmx5IGRvbid0CiAJICogbmVlZCB0byB6ZXJvIGl0LCBidXQgYmV0dGVyIHNhZmUgdGhhbiBzb3JyeSBmb3Igbm93LgogCSAqLwotCW1lbXNldCgmKGVudHJ5LT5kZXNjcmlwdG9yKSwgMCwgc2l6ZW9mKHN0cnVjdCB0c2kxNDhfZG1hX2Rlc2NyaXB0b3IpKTsKKwltZW1zZXQoJmVudHJ5LT5kZXNjcmlwdG9yLCAwLCBzaXplb2Yoc3RydWN0IHRzaTE0OF9kbWFfZGVzY3JpcHRvcikpOwogCiAJLyogRmlsbCBvdXQgc291cmNlIHBhcnQgKi8KIAlzd2l0Y2ggKHNyYy0+dHlwZSkgewpAQCAtMTY4MSw3ICsxNjg1LDcgQEAKIAkJZW50cnktPmRlc2NyaXB0b3IuZHNhdCA9IFRTSTE0OF9MQ1NSX0RTQVRfVFlQX1ZNRTsKIAogCQlyZXR2YWwgPSB0c2kxNDhfZG1hX3NldF92bWVfc3JjX2F0dHJpYnV0ZXMoCi0JCQl0c2kxNDhfYnJpZGdlLT5wYXJlbnQsICYoZW50cnktPmRlc2NyaXB0b3IuZHNhdCksCisJCQl0c2kxNDhfYnJpZGdlLT5wYXJlbnQsICZlbnRyeS0+ZGVzY3JpcHRvci5kc2F0LAogCQkJdm1lX2F0dHItPmFzcGFjZSwgdm1lX2F0dHItPmN5Y2xlLCB2bWVfYXR0ci0+ZHdpZHRoKTsKIAkJaWYgKHJldHZhbCA8IDApCiAJCQlnb3RvIGVycl9zb3VyY2U7CkBAIC0xNzE5LDcgKzE3MjMsNyBAQAogCQllbnRyeS0+ZGVzY3JpcHRvci5kZGF0ID0gVFNJMTQ4X0xDU1JfRERBVF9UWVBfVk1FOwogCiAJCXJldHZhbCA9IHRzaTE0OF9kbWFfc2V0X3ZtZV9kZXN0X2F0dHJpYnV0ZXMoCi0JCQl0c2kxNDhfYnJpZGdlLT5wYXJlbnQsICYoZW50cnktPmRlc2NyaXB0b3IuZGRhdCksCisJCQl0c2kxNDhfYnJpZGdlLT5wYXJlbnQsICZlbnRyeS0+ZGVzY3JpcHRvci5kZGF0LAogCQkJdm1lX2F0dHItPmFzcGFjZSwgdm1lX2F0dHItPmN5Y2xlLCB2bWVfYXR0ci0+ZHdpZHRoKTsKIAkJaWYgKHJldHZhbCA8IDApCiAJCQlnb3RvIGVycl9kZXN0OwpAQCAtMTczNSwxNiArMTczOSwxNiBAQAogCWVudHJ5LT5kZXNjcmlwdG9yLmRjbnQgPSAodTMyKWNvdW50OwogCiAJLyogQWRkIHRvIGxpc3QgKi8KLQlsaXN0X2FkZF90YWlsKCYoZW50cnktPmxpc3QpLCAmKGxpc3QtPmVudHJpZXMpKTsKKwlsaXN0X2FkZF90YWlsKCZlbnRyeS0+bGlzdCwgJmxpc3QtPmVudHJpZXMpOwogCiAJLyogRmlsbCBvdXQgcHJldmlvdXMgZGVzY3JpcHRvcnMgIk5leHQgQWRkcmVzcyIgKi8KLQlpZiAoZW50cnktPmxpc3QucHJldiAhPSAmKGxpc3QtPmVudHJpZXMpKSB7CisJaWYgKGVudHJ5LT5saXN0LnByZXYgIT0gJmxpc3QtPmVudHJpZXMpIHsKIAkJcHJldiA9IGxpc3RfZW50cnkoZW50cnktPmxpc3QucHJldiwgc3RydWN0IHRzaTE0OF9kbWFfZW50cnksCiAJCQlsaXN0KTsKIAkJLyogV2UgbmVlZCB0aGUgYnVzIGFkZHJlc3MgZm9yIHRoZSBwb2ludGVyICovCi0JCWRlc2NfcHRyID0gdmlydF90b19idXMoJihlbnRyeS0+ZGVzY3JpcHRvcikpOwotCQlyZWdfc3BsaXQoZGVzY19wdHIsICYocHJldi0+ZGVzY3JpcHRvci5kbmxhdSksCi0JCQkmKHByZXYtPmRlc2NyaXB0b3IuZG5sYWwpKTsKKwkJZGVzY19wdHIgPSB2aXJ0X3RvX2J1cygmZW50cnktPmRlc2NyaXB0b3IpOworCQlyZWdfc3BsaXQoZGVzY19wdHIsICZwcmV2LT5kZXNjcmlwdG9yLmRubGF1LAorCQkJJnByZXYtPmRlc2NyaXB0b3IuZG5sYWwpOwogCX0KIAogCXJldHVybiAwOwpAQCAtMTc4Miw3ICsxNzg2LDcgQEAKICAqCiAgKiBYWFggTmVlZCB0byBwcm92aWRlIGNvbnRyb2wgcmVnaXN0ZXIgY29uZmlndXJhdGlvbi4KICAqLwotaW50IHRzaTE0OF9kbWFfbGlzdF9leGVjKHN0cnVjdCB2bWVfZG1hX2xpc3QgKmxpc3QpCitzdGF0aWMgaW50IHRzaTE0OF9kbWFfbGlzdF9leGVjKHN0cnVjdCB2bWVfZG1hX2xpc3QgKmxpc3QpCiB7CiAJc3RydWN0IHZtZV9kbWFfcmVzb3VyY2UgKmN0cmxyOwogCWludCBjaGFubmVsLCByZXR2YWwgPSAwOwpAQCAtMTc5OSwzMCArMTgwMywzMCBAQAogCiAJYnJpZGdlID0gdHNpMTQ4X2JyaWRnZS0+ZHJpdmVyX3ByaXY7CiAKLQltdXRleF9sb2NrKCYoY3RybHItPm10eCkpOworCW11dGV4X2xvY2soJmN0cmxyLT5tdHgpOwogCiAJY2hhbm5lbCA9IGN0cmxyLT5udW1iZXI7CiAKLQlpZiAoIWxpc3RfZW1wdHkoJihjdHJsci0+cnVubmluZykpKSB7CisJaWYgKCFsaXN0X2VtcHR5KCZjdHJsci0+cnVubmluZykpIHsKIAkJLyoKIAkJICogWFhYIFdlIGhhdmUgYW4gYWN0aXZlIERNQSB0cmFuc2ZlciBhbmQgY3VycmVudGx5IGhhdmVuJ3QKIAkJICogICAgIHNvcnRlZCBvdXQgdGhlIG1lY2hhbmlzbSBmb3IgInBlbmRpbmciIERNQSB0cmFuc2ZlcnMuCiAJCSAqICAgICBSZXR1cm4gYnVzeS4KIAkJICovCiAJCS8qIE5lZWQgdG8gYWRkIHRvIHBlbmRpbmcgaGVyZSAqLwotCQltdXRleF91bmxvY2soJihjdHJsci0+bXR4KSk7CisJCW11dGV4X3VubG9jaygmY3RybHItPm10eCk7CiAJCXJldHVybiAtRUJVU1k7CiAJfSBlbHNlIHsKLQkJbGlzdF9hZGQoJihsaXN0LT5saXN0KSwgJihjdHJsci0+cnVubmluZykpOworCQlsaXN0X2FkZCgmbGlzdC0+bGlzdCwgJmN0cmxyLT5ydW5uaW5nKTsKIAl9CiAKIAkvKiBHZXQgZmlyc3QgYnVzIGFkZHJlc3MgYW5kIHdyaXRlIGludG8gcmVnaXN0ZXJzICovCi0JZW50cnkgPSBsaXN0X2ZpcnN0X2VudHJ5KCYobGlzdC0+ZW50cmllcyksIHN0cnVjdCB0c2kxNDhfZG1hX2VudHJ5LAorCWVudHJ5ID0gbGlzdF9maXJzdF9lbnRyeSgmbGlzdC0+ZW50cmllcywgc3RydWN0IHRzaTE0OF9kbWFfZW50cnksCiAJCWxpc3QpOwogCi0JYnVzX2FkZHIgPSB2aXJ0X3RvX2J1cygmKGVudHJ5LT5kZXNjcmlwdG9yKSk7CisJYnVzX2FkZHIgPSB2aXJ0X3RvX2J1cygmZW50cnktPmRlc2NyaXB0b3IpOwogCi0JbXV0ZXhfdW5sb2NrKCYoY3RybHItPm10eCkpOworCW11dGV4X3VubG9jaygmY3RybHItPm10eCk7CiAKIAlyZWdfc3BsaXQoYnVzX2FkZHIsICZidXNfYWRkcl9oaWdoLCAmYnVzX2FkZHJfbG93KTsKIApAQCAtMTg1MCw5ICsxODU0LDkgQEAKIAl9CiAKIAkvKiBSZW1vdmUgbGlzdCBmcm9tIHJ1bm5pbmcgbGlzdCAqLwotCW11dGV4X2xvY2soJihjdHJsci0+bXR4KSk7Ci0JbGlzdF9kZWwoJihsaXN0LT5saXN0KSk7Ci0JbXV0ZXhfdW5sb2NrKCYoY3RybHItPm10eCkpOworCW11dGV4X2xvY2soJmN0cmxyLT5tdHgpOworCWxpc3RfZGVsKCZsaXN0LT5saXN0KTsKKwltdXRleF91bmxvY2soJmN0cmxyLT5tdHgpOwogCiAJcmV0dXJuIHJldHZhbDsKIH0KQEAgLTE4NjIsMTMgKzE4NjYsMTMgQEAKICAqCiAgKiBXZSBoYXZlIGEgc2VwYXJhdGUgZnVuY3Rpb24sIGRvbid0IGFzc3VtZSB0aGF0IHRoZSBjaGFpbiBjYW4ndCBiZSByZXVzZWQuCiAgKi8KLWludCB0c2kxNDhfZG1hX2xpc3RfZW1wdHkoc3RydWN0IHZtZV9kbWFfbGlzdCAqbGlzdCkKK3N0YXRpYyBpbnQgdHNpMTQ4X2RtYV9saXN0X2VtcHR5KHN0cnVjdCB2bWVfZG1hX2xpc3QgKmxpc3QpCiB7CiAJc3RydWN0IGxpc3RfaGVhZCAqcG9zLCAqdGVtcDsKIAlzdHJ1Y3QgdHNpMTQ4X2RtYV9lbnRyeSAqZW50cnk7CiAKIAkvKiBkZXRhY2ggYW5kIGZyZWUgZWFjaCBlbnRyeSAqLwotCWxpc3RfZm9yX2VhY2hfc2FmZShwb3MsIHRlbXAsICYobGlzdC0+ZW50cmllcykpIHsKKwlsaXN0X2Zvcl9lYWNoX3NhZmUocG9zLCB0ZW1wLCAmbGlzdC0+ZW50cmllcykgewogCQlsaXN0X2RlbChwb3MpOwogCQllbnRyeSA9IGxpc3RfZW50cnkocG9zLCBzdHJ1Y3QgdHNpMTQ4X2RtYV9lbnRyeSwgbGlzdCk7CiAJCWtmcmVlKGVudHJ5KTsKQEAgLTE4ODQsNyArMTg4OCw3IEBACiAgKiBUaGlzIGRvZXMgbm90IGVuYWJsZSB0aGUgTE0gbW9uaXRvciAtIHRoYXQgc2hvdWxkIGJlIGRvbmUgd2hlbiB0aGUgZmlyc3QKICAqIGNhbGxiYWNrIGlzIGF0dGFjaGVkIGFuZCBkaXNhYmxlZCB3aGVuIHRoZSBsYXN0IGNhbGxiYWNrIGlzIHJlbW92ZWQuCiAgKi8KLWludCB0c2kxNDhfbG1fc2V0KHN0cnVjdCB2bWVfbG1fcmVzb3VyY2UgKmxtLCB1bnNpZ25lZCBsb25nIGxvbmcgbG1fYmFzZSwKK3N0YXRpYyBpbnQgdHNpMTQ4X2xtX3NldChzdHJ1Y3Qgdm1lX2xtX3Jlc291cmNlICpsbSwgdW5zaWduZWQgbG9uZyBsb25nIGxtX2Jhc2UsCiAJdm1lX2FkZHJlc3NfdCBhc3BhY2UsIHZtZV9jeWNsZV90IGN5Y2xlKQogewogCXUzMiBsbV9iYXNlX2hpZ2gsIGxtX2Jhc2VfbG93LCBsbV9jdGwgPSAwOwpAQCAtMTg5NiwxMiArMTkwMCwxMiBAQAogCiAJYnJpZGdlID0gdHNpMTQ4X2JyaWRnZS0+ZHJpdmVyX3ByaXY7CiAKLQltdXRleF9sb2NrKCYobG0tPm10eCkpOworCW11dGV4X2xvY2soJmxtLT5tdHgpOwogCiAJLyogSWYgd2UgYWxyZWFkeSBoYXZlIGEgY2FsbGJhY2sgYXR0YWNoZWQsIHdlIGNhbid0IG1vdmUgaXQhICovCiAJZm9yIChpID0gMDsgaSA8IGxtLT5tb25pdG9yczsgaSsrKSB7CiAJCWlmIChicmlkZ2UtPmxtX2NhbGxiYWNrW2ldICE9IE5VTEwpIHsKLQkJCW11dGV4X3VubG9jaygmKGxtLT5tdHgpKTsKKwkJCW11dGV4X3VubG9jaygmbG0tPm10eCk7CiAJCQlkZXZfZXJyKHRzaTE0OF9icmlkZ2UtPnBhcmVudCwgIkxvY2F0aW9uIG1vbml0b3IgIgogCQkJCSJjYWxsYmFjayBhdHRhY2hlZCwgY2FuJ3QgcmVzZXRcbiIpOwogCQkJcmV0dXJuIC1FQlVTWTsKQEAgLTE5MjIsNyArMTkyNiw3IEBACiAJCWxtX2N0bCB8PSBUU0kxNDhfTENTUl9MTUFUX0FTX0E2NDsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJbXV0ZXhfdW5sb2NrKCYobG0tPm10eCkpOworCQltdXRleF91bmxvY2soJmxtLT5tdHgpOwogCQlkZXZfZXJyKHRzaTE0OF9icmlkZ2UtPnBhcmVudCwgIkludmFsaWQgYWRkcmVzcyBzcGFjZVxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCQlicmVhazsKQEAgLTE5NDMsNyArMTk0Nyw3IEBACiAJaW93cml0ZTMyYmUobG1fYmFzZV9sb3csIGJyaWRnZS0+YmFzZSArIFRTSTE0OF9MQ1NSX0xNQkFMKTsKIAlpb3dyaXRlMzJiZShsbV9jdGwsIGJyaWRnZS0+YmFzZSArIFRTSTE0OF9MQ1NSX0xNQVQpOwogCi0JbXV0ZXhfdW5sb2NrKCYobG0tPm10eCkpOworCW11dGV4X3VubG9jaygmbG0tPm10eCk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTE5NTEsMTUgKzE5NTUsMTUgQEAKIC8qIEdldCBjb25maWd1cmF0aW9uIG9mIHRoZSBjYWxsYmFjayBtb25pdG9yIGFuZCByZXR1cm4gd2hldGhlciBpdCBpcyBlbmFibGVkCiAgKiBvciBkaXNhYmxlZC4KICAqLwotaW50IHRzaTE0OF9sbV9nZXQoc3RydWN0IHZtZV9sbV9yZXNvdXJjZSAqbG0sIHVuc2lnbmVkIGxvbmcgbG9uZyAqbG1fYmFzZSwKLQl2bWVfYWRkcmVzc190ICphc3BhY2UsIHZtZV9jeWNsZV90ICpjeWNsZSkKK3N0YXRpYyBpbnQgdHNpMTQ4X2xtX2dldChzdHJ1Y3Qgdm1lX2xtX3Jlc291cmNlICpsbSwKKwl1bnNpZ25lZCBsb25nIGxvbmcgKmxtX2Jhc2UsIHZtZV9hZGRyZXNzX3QgKmFzcGFjZSwgdm1lX2N5Y2xlX3QgKmN5Y2xlKQogewogCXUzMiBsbV9iYXNlX2hpZ2gsIGxtX2Jhc2VfbG93LCBsbV9jdGwsIGVuYWJsZWQgPSAwOwogCXN0cnVjdCB0c2kxNDhfZHJpdmVyICpicmlkZ2U7CiAKIAlicmlkZ2UgPSBsbS0+cGFyZW50LT5kcml2ZXJfcHJpdjsKIAotCW11dGV4X2xvY2soJihsbS0+bXR4KSk7CisJbXV0ZXhfbG9jaygmbG0tPm10eCk7CiAKIAlsbV9iYXNlX2hpZ2ggPSBpb3JlYWQzMmJlKGJyaWRnZS0+YmFzZSArIFRTSTE0OF9MQ1NSX0xNQkFVKTsKIAlsbV9iYXNlX2xvdyA9IGlvcmVhZDMyYmUoYnJpZGdlLT5iYXNlICsgVFNJMTQ4X0xDU1JfTE1CQUwpOwpAQCAtMTk5Miw3ICsxOTk2LDcgQEAKIAlpZiAobG1fY3RsICYgVFNJMTQ4X0xDU1JfTE1BVF9EQVRBKQogCQkqY3ljbGUgfD0gVk1FX0RBVEE7CiAKLQltdXRleF91bmxvY2soJihsbS0+bXR4KSk7CisJbXV0ZXhfdW5sb2NrKCZsbS0+bXR4KTsKIAogCXJldHVybiBlbmFibGVkOwogfQpAQCAtMjAwMiw3ICsyMDA2LDcgQEAKICAqCiAgKiBDYWxsYmFjayB3aWxsIGJlIHBhc3NlZCB0aGUgbW9uaXRvciB0cmlnZ2VyZWQuCiAgKi8KLWludCB0c2kxNDhfbG1fYXR0YWNoKHN0cnVjdCB2bWVfbG1fcmVzb3VyY2UgKmxtLCBpbnQgbW9uaXRvciwKK3N0YXRpYyBpbnQgdHNpMTQ4X2xtX2F0dGFjaChzdHJ1Y3Qgdm1lX2xtX3Jlc291cmNlICpsbSwgaW50IG1vbml0b3IsCiAJdm9pZCAoKmNhbGxiYWNrKShpbnQpKQogewogCXUzMiBsbV9jdGwsIHRtcDsKQEAgLTIwMTMsMTIgKzIwMTcsMTIgQEAKIAogCWJyaWRnZSA9IHRzaTE0OF9icmlkZ2UtPmRyaXZlcl9wcml2OwogCi0JbXV0ZXhfbG9jaygmKGxtLT5tdHgpKTsKKwltdXRleF9sb2NrKCZsbS0+bXR4KTsKIAogCS8qIEVuc3VyZSB0aGF0IHRoZSBsb2NhdGlvbiBtb25pdG9yIGlzIGNvbmZpZ3VyZWQgLSBuZWVkIFBHTSBvciBEQVRBICovCiAJbG1fY3RsID0gaW9yZWFkMzJiZShicmlkZ2UtPmJhc2UgKyBUU0kxNDhfTENTUl9MTUFUKTsKIAlpZiAoKGxtX2N0bCAmIChUU0kxNDhfTENTUl9MTUFUX1BHTSB8IFRTSTE0OF9MQ1NSX0xNQVRfREFUQSkpID09IDApIHsKLQkJbXV0ZXhfdW5sb2NrKCYobG0tPm10eCkpOworCQltdXRleF91bmxvY2soJmxtLT5tdHgpOwogCQlkZXZfZXJyKHRzaTE0OF9icmlkZ2UtPnBhcmVudCwgIkxvY2F0aW9uIG1vbml0b3Igbm90IHByb3Blcmx5ICIKIAkJCSJjb25maWd1cmVkXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0yMDI2LDcgKzIwMzAsNyBAQAogCiAJLyogQ2hlY2sgdGhhdCBhIGNhbGxiYWNrIGlzbid0IGFscmVhZHkgYXR0YWNoZWQgKi8KIAlpZiAoYnJpZGdlLT5sbV9jYWxsYmFja1ttb25pdG9yXSAhPSBOVUxMKSB7Ci0JCW11dGV4X3VubG9jaygmKGxtLT5tdHgpKTsKKwkJbXV0ZXhfdW5sb2NrKCZsbS0+bXR4KTsKIAkJZGV2X2Vycih0c2kxNDhfYnJpZGdlLT5wYXJlbnQsICJFeGlzdGluZyBjYWxsYmFjayBhdHRhY2hlZFxuIik7CiAJCXJldHVybiAtRUJVU1k7CiAJfQpAQCAtMjA0OSw3ICsyMDUzLDcgQEAKIAkJaW93cml0ZTMyYmUobG1fY3RsLCBicmlkZ2UtPmJhc2UgKyBUU0kxNDhfTENTUl9MTUFUKTsKIAl9CiAKLQltdXRleF91bmxvY2soJihsbS0+bXR4KSk7CisJbXV0ZXhfdW5sb2NrKCZsbS0+bXR4KTsKIAogCXJldHVybiAwOwogfQpAQCAtMjA1NywxNCArMjA2MSwxNCBAQAogLyoKICAqIERldGFjaCBhIGNhbGxiYWNrIGZ1bmN0aW9uIGZvcm4gYSBzcGVjaWZpYyBsb2NhdGlvbiBtb25pdG9yLgogICovCi1pbnQgdHNpMTQ4X2xtX2RldGFjaChzdHJ1Y3Qgdm1lX2xtX3Jlc291cmNlICpsbSwgaW50IG1vbml0b3IpCitzdGF0aWMgaW50IHRzaTE0OF9sbV9kZXRhY2goc3RydWN0IHZtZV9sbV9yZXNvdXJjZSAqbG0sIGludCBtb25pdG9yKQogewogCXUzMiBsbV9lbiwgdG1wOwogCXN0cnVjdCB0c2kxNDhfZHJpdmVyICpicmlkZ2U7CiAKIAlicmlkZ2UgPSBsbS0+cGFyZW50LT5kcml2ZXJfcHJpdjsKIAotCW11dGV4X2xvY2soJihsbS0+bXR4KSk7CisJbXV0ZXhfbG9jaygmbG0tPm10eCk7CiAKIAkvKiBEaXNhYmxlIExvY2F0aW9uIE1vbml0b3IgYW5kIGVuc3VyZSBwcmV2aW91cyBpbnRlcnJ1cHRzIGFyZSBjbGVhciAqLwogCWxtX2VuID0gaW9yZWFkMzJiZShicmlkZ2UtPmJhc2UgKyBUU0kxNDhfTENTUl9JTlRFTik7CkBAIC0yMDg5LDcgKzIwOTMsNyBAQAogCQlpb3dyaXRlMzJiZSh0bXAsIGJyaWRnZS0+YmFzZSArIFRTSTE0OF9MQ1NSX0xNQVQpOwogCX0KIAotCW11dGV4X3VubG9jaygmKGxtLT5tdHgpKTsKKwltdXRleF91bmxvY2soJmxtLT5tdHgpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0yMDk3LDcgKzIxMDEsNyBAQAogLyoKICAqIERldGVybWluZSBHZW9ncmFwaGljYWwgQWRkcmVzc2luZwogICovCi1pbnQgdHNpMTQ4X3Nsb3RfZ2V0KHN0cnVjdCB2bWVfYnJpZGdlICp0c2kxNDhfYnJpZGdlKQorc3RhdGljIGludCB0c2kxNDhfc2xvdF9nZXQoc3RydWN0IHZtZV9icmlkZ2UgKnRzaTE0OF9icmlkZ2UpCiB7CiAJdTMyIHNsb3QgPSAwOwogCXN0cnVjdCB0c2kxNDhfZHJpdmVyICpicmlkZ2U7CkBAIC0yMTQyLDcgKzIxNDYsNyBAQAogCiAJLyogQWxsb2NhdGUgbWVtIGZvciBDUi9DU1IgaW1hZ2UgKi8KIAlicmlkZ2UtPmNyY3NyX2tlcm5lbCA9IHBjaV9hbGxvY19jb25zaXN0ZW50KHBkZXYsIFZNRV9DUkNTUl9CVUZfU0laRSwKLQkJJihicmlkZ2UtPmNyY3NyX2J1cykpOworCQkmYnJpZGdlLT5jcmNzcl9idXMpOwogCWlmIChicmlkZ2UtPmNyY3NyX2tlcm5lbCA9PSBOVUxMKSB7CiAJCWRldl9lcnIodHNpMTQ4X2JyaWRnZS0+cGFyZW50LCAiRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgIgogCQkJIkNSL0NTUiBpbWFnZVxuIik7CkBAIC0yMjgwLDEzICsyMjg0LDEzIEBACiAJfQogCiAJLyogSW5pdGlhbGl6ZSB3YWl0IHF1ZXVlcyAmIG11dHVhbCBleGNsdXNpb24gZmxhZ3MgKi8KLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCYodHNpMTQ4X2RldmljZS0+ZG1hX3F1ZXVlWzBdKSk7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmKHRzaTE0OF9kZXZpY2UtPmRtYV9xdWV1ZVsxXSkpOwotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJih0c2kxNDhfZGV2aWNlLT5pYWNrX3F1ZXVlKSk7Ci0JbXV0ZXhfaW5pdCgmKHRzaTE0OF9kZXZpY2UtPnZtZV9pbnQpKTsKLQltdXRleF9pbml0KCYodHNpMTQ4X2RldmljZS0+dm1lX3JtdykpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnRzaTE0OF9kZXZpY2UtPmRtYV9xdWV1ZVswXSk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmdHNpMTQ4X2RldmljZS0+ZG1hX3F1ZXVlWzFdKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZ0c2kxNDhfZGV2aWNlLT5pYWNrX3F1ZXVlKTsKKwltdXRleF9pbml0KCZ0c2kxNDhfZGV2aWNlLT52bWVfaW50KTsKKwltdXRleF9pbml0KCZ0c2kxNDhfZGV2aWNlLT52bWVfcm13KTsKIAotCXRzaTE0OF9icmlkZ2UtPnBhcmVudCA9ICYocGRldi0+ZGV2KTsKKwl0c2kxNDhfYnJpZGdlLT5wYXJlbnQgPSAmcGRldi0+ZGV2OwogCXN0cmNweSh0c2kxNDhfYnJpZGdlLT5uYW1lLCBkcml2ZXJfbmFtZSk7CiAKIAkvKiBTZXR1cCBJUlEgKi8KQEAgLTIzMTQsNyArMjMxOCw3IEBACiAJCQlnb3RvIGVycl9tYXN0ZXI7CiAJCX0KIAkJdHNpMTQ4X2RldmljZS0+Zmx1c2hfaW1hZ2UtPnBhcmVudCA9IHRzaTE0OF9icmlkZ2U7Ci0JCXNwaW5fbG9ja19pbml0KCYodHNpMTQ4X2RldmljZS0+Zmx1c2hfaW1hZ2UtPmxvY2spKTsKKwkJc3Bpbl9sb2NrX2luaXQoJnRzaTE0OF9kZXZpY2UtPmZsdXNoX2ltYWdlLT5sb2NrKTsKIAkJdHNpMTQ4X2RldmljZS0+Zmx1c2hfaW1hZ2UtPmxvY2tlZCA9IDE7CiAJCXRzaTE0OF9kZXZpY2UtPmZsdXNoX2ltYWdlLT5udW1iZXIgPSBtYXN0ZXJfbnVtOwogCQl0c2kxNDhfZGV2aWNlLT5mbHVzaF9pbWFnZS0+YWRkcmVzc19hdHRyID0gVk1FX0ExNiB8IFZNRV9BMjQgfApAQCAtMjMyNCwxMyArMjMyOCwxMyBAQAogCQkJVk1FXzJlU1NUMTYwIHwgVk1FXzJlU1NUMjY3IHwgVk1FXzJlU1NUMzIwIHwgVk1FX1NVUEVSIHwKIAkJCVZNRV9VU0VSIHwgVk1FX1BST0cgfCBWTUVfREFUQTsKIAkJdHNpMTQ4X2RldmljZS0+Zmx1c2hfaW1hZ2UtPndpZHRoX2F0dHIgPSBWTUVfRDE2IHwgVk1FX0QzMjsKLQkJbWVtc2V0KCYodHNpMTQ4X2RldmljZS0+Zmx1c2hfaW1hZ2UtPmJ1c19yZXNvdXJjZSksIDAsCisJCW1lbXNldCgmdHNpMTQ4X2RldmljZS0+Zmx1c2hfaW1hZ2UtPmJ1c19yZXNvdXJjZSwgMCwKIAkJCXNpemVvZihzdHJ1Y3QgcmVzb3VyY2UpKTsKIAkJdHNpMTQ4X2RldmljZS0+Zmx1c2hfaW1hZ2UtPmtlcm5fYmFzZSAgPSBOVUxMOwogCX0KIAogCS8qIEFkZCBtYXN0ZXIgd2luZG93cyB0byBsaXN0ICovCi0JSU5JVF9MSVNUX0hFQUQoJih0c2kxNDhfYnJpZGdlLT5tYXN0ZXJfcmVzb3VyY2VzKSk7CisJSU5JVF9MSVNUX0hFQUQoJnRzaTE0OF9icmlkZ2UtPm1hc3Rlcl9yZXNvdXJjZXMpOwogCWZvciAoaSA9IDA7IGkgPCBtYXN0ZXJfbnVtOyBpKyspIHsKIAkJbWFzdGVyX2ltYWdlID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHZtZV9tYXN0ZXJfcmVzb3VyY2UpLAogCQkJR0ZQX0tFUk5FTCk7CkBAIC0yMzQxLDcgKzIzNDUsNyBAQAogCQkJZ290byBlcnJfbWFzdGVyOwogCQl9CiAJCW1hc3Rlcl9pbWFnZS0+cGFyZW50ID0gdHNpMTQ4X2JyaWRnZTsKLQkJc3Bpbl9sb2NrX2luaXQoJihtYXN0ZXJfaW1hZ2UtPmxvY2spKTsKKwkJc3Bpbl9sb2NrX2luaXQoJm1hc3Rlcl9pbWFnZS0+bG9jayk7CiAJCW1hc3Rlcl9pbWFnZS0+bG9ja2VkID0gMDsKIAkJbWFzdGVyX2ltYWdlLT5udW1iZXIgPSBpOwogCQltYXN0ZXJfaW1hZ2UtPmFkZHJlc3NfYXR0ciA9IFZNRV9BMTYgfCBWTUVfQTI0IHwgVk1FX0EzMiB8CkBAIC0yMzUxLDE1ICsyMzU1LDE1IEBACiAJCQlWTUVfMmVTU1QyNjcgfCBWTUVfMmVTU1QzMjAgfCBWTUVfU1VQRVIgfCBWTUVfVVNFUiB8CiAJCQlWTUVfUFJPRyB8IFZNRV9EQVRBOwogCQltYXN0ZXJfaW1hZ2UtPndpZHRoX2F0dHIgPSBWTUVfRDE2IHwgVk1FX0QzMjsKLQkJbWVtc2V0KCYobWFzdGVyX2ltYWdlLT5idXNfcmVzb3VyY2UpLCAwLAorCQltZW1zZXQoJm1hc3Rlcl9pbWFnZS0+YnVzX3Jlc291cmNlLCAwLAogCQkJc2l6ZW9mKHN0cnVjdCByZXNvdXJjZSkpOwogCQltYXN0ZXJfaW1hZ2UtPmtlcm5fYmFzZSAgPSBOVUxMOwotCQlsaXN0X2FkZF90YWlsKCYobWFzdGVyX2ltYWdlLT5saXN0KSwKLQkJCSYodHNpMTQ4X2JyaWRnZS0+bWFzdGVyX3Jlc291cmNlcykpOworCQlsaXN0X2FkZF90YWlsKCZtYXN0ZXJfaW1hZ2UtPmxpc3QsCisJCQkmdHNpMTQ4X2JyaWRnZS0+bWFzdGVyX3Jlc291cmNlcyk7CiAJfQogCiAJLyogQWRkIHNsYXZlIHdpbmRvd3MgdG8gbGlzdCAqLwotCUlOSVRfTElTVF9IRUFEKCYodHNpMTQ4X2JyaWRnZS0+c2xhdmVfcmVzb3VyY2VzKSk7CisJSU5JVF9MSVNUX0hFQUQoJnRzaTE0OF9icmlkZ2UtPnNsYXZlX3Jlc291cmNlcyk7CiAJZm9yIChpID0gMDsgaSA8IFRTSTE0OF9NQVhfU0xBVkU7IGkrKykgewogCQlzbGF2ZV9pbWFnZSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB2bWVfc2xhdmVfcmVzb3VyY2UpLAogCQkJR0ZQX0tFUk5FTCk7CkBAIC0yMzcwLDcgKzIzNzQsNyBAQAogCQkJZ290byBlcnJfc2xhdmU7CiAJCX0KIAkJc2xhdmVfaW1hZ2UtPnBhcmVudCA9IHRzaTE0OF9icmlkZ2U7Ci0JCW11dGV4X2luaXQoJihzbGF2ZV9pbWFnZS0+bXR4KSk7CisJCW11dGV4X2luaXQoJnNsYXZlX2ltYWdlLT5tdHgpOwogCQlzbGF2ZV9pbWFnZS0+bG9ja2VkID0gMDsKIAkJc2xhdmVfaW1hZ2UtPm51bWJlciA9IGk7CiAJCXNsYXZlX2ltYWdlLT5hZGRyZXNzX2F0dHIgPSBWTUVfQTE2IHwgVk1FX0EyNCB8IFZNRV9BMzIgfApAQCAtMjM4MCwxMiArMjM4NCwxMiBAQAogCQkJVk1FXzJlVk1FIHwgVk1FXzJlU1NUIHwgVk1FXzJlU1NUQiB8IFZNRV8yZVNTVDE2MCB8CiAJCQlWTUVfMmVTU1QyNjcgfCBWTUVfMmVTU1QzMjAgfCBWTUVfU1VQRVIgfCBWTUVfVVNFUiB8CiAJCQlWTUVfUFJPRyB8IFZNRV9EQVRBOwotCQlsaXN0X2FkZF90YWlsKCYoc2xhdmVfaW1hZ2UtPmxpc3QpLAotCQkJJih0c2kxNDhfYnJpZGdlLT5zbGF2ZV9yZXNvdXJjZXMpKTsKKwkJbGlzdF9hZGRfdGFpbCgmc2xhdmVfaW1hZ2UtPmxpc3QsCisJCQkmdHNpMTQ4X2JyaWRnZS0+c2xhdmVfcmVzb3VyY2VzKTsKIAl9CiAKIAkvKiBBZGQgZG1hIGVuZ2luZXMgdG8gbGlzdCAqLwotCUlOSVRfTElTVF9IRUFEKCYodHNpMTQ4X2JyaWRnZS0+ZG1hX3Jlc291cmNlcykpOworCUlOSVRfTElTVF9IRUFEKCZ0c2kxNDhfYnJpZGdlLT5kbWFfcmVzb3VyY2VzKTsKIAlmb3IgKGkgPSAwOyBpIDwgVFNJMTQ4X01BWF9ETUE7IGkrKykgewogCQlkbWFfY3RybHIgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgdm1lX2RtYV9yZXNvdXJjZSksCiAJCQlHRlBfS0VSTkVMKTsKQEAgLTIzOTYsMjEgKzI0MDAsMjEgQEAKIAkJCWdvdG8gZXJyX2RtYTsKIAkJfQogCQlkbWFfY3RybHItPnBhcmVudCA9IHRzaTE0OF9icmlkZ2U7Ci0JCW11dGV4X2luaXQoJihkbWFfY3RybHItPm10eCkpOworCQltdXRleF9pbml0KCZkbWFfY3RybHItPm10eCk7CiAJCWRtYV9jdHJsci0+bG9ja2VkID0gMDsKIAkJZG1hX2N0cmxyLT5udW1iZXIgPSBpOwogCQlkbWFfY3RybHItPnJvdXRlX2F0dHIgPSBWTUVfRE1BX1ZNRV9UT19NRU0gfAogCQkJVk1FX0RNQV9NRU1fVE9fVk1FIHwgVk1FX0RNQV9WTUVfVE9fVk1FIHwKIAkJCVZNRV9ETUFfTUVNX1RPX01FTSB8IFZNRV9ETUFfUEFUVEVSTl9UT19WTUUgfAogCQkJVk1FX0RNQV9QQVRURVJOX1RPX01FTTsKLQkJSU5JVF9MSVNUX0hFQUQoJihkbWFfY3RybHItPnBlbmRpbmcpKTsKLQkJSU5JVF9MSVNUX0hFQUQoJihkbWFfY3RybHItPnJ1bm5pbmcpKTsKLQkJbGlzdF9hZGRfdGFpbCgmKGRtYV9jdHJsci0+bGlzdCksCi0JCQkmKHRzaTE0OF9icmlkZ2UtPmRtYV9yZXNvdXJjZXMpKTsKKwkJSU5JVF9MSVNUX0hFQUQoJmRtYV9jdHJsci0+cGVuZGluZyk7CisJCUlOSVRfTElTVF9IRUFEKCZkbWFfY3RybHItPnJ1bm5pbmcpOworCQlsaXN0X2FkZF90YWlsKCZkbWFfY3RybHItPmxpc3QsCisJCQkmdHNpMTQ4X2JyaWRnZS0+ZG1hX3Jlc291cmNlcyk7CiAJfQogCiAJLyogQWRkIGxvY2F0aW9uIG1vbml0b3IgdG8gbGlzdCAqLwotCUlOSVRfTElTVF9IRUFEKCYodHNpMTQ4X2JyaWRnZS0+bG1fcmVzb3VyY2VzKSk7CisJSU5JVF9MSVNUX0hFQUQoJnRzaTE0OF9icmlkZ2UtPmxtX3Jlc291cmNlcyk7CiAJbG0gPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgdm1lX2xtX3Jlc291cmNlKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKGxtID09IE5VTEwpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgIgpAQCAtMjQxOSwxMSArMjQyMywxMSBAQAogCQlnb3RvIGVycl9sbTsKIAl9CiAJbG0tPnBhcmVudCA9IHRzaTE0OF9icmlkZ2U7Ci0JbXV0ZXhfaW5pdCgmKGxtLT5tdHgpKTsKKwltdXRleF9pbml0KCZsbS0+bXR4KTsKIAlsbS0+bG9ja2VkID0gMDsKIAlsbS0+bnVtYmVyID0gMTsKIAlsbS0+bW9uaXRvcnMgPSA0OwotCWxpc3RfYWRkX3RhaWwoJihsbS0+bGlzdCksICYodHNpMTQ4X2JyaWRnZS0+bG1fcmVzb3VyY2VzKSk7CisJbGlzdF9hZGRfdGFpbCgmbG0tPmxpc3QsICZ0c2kxNDhfYnJpZGdlLT5sbV9yZXNvdXJjZXMpOwogCiAJdHNpMTQ4X2JyaWRnZS0+c2xhdmVfZ2V0ID0gdHNpMTQ4X3NsYXZlX2dldDsKIAl0c2kxNDhfYnJpZGdlLT5zbGF2ZV9zZXQgPSB0c2kxNDhfc2xhdmVfc2V0OwpAQCAtMjQ3Nyw0MSArMjQ4MSw0MCBAQAogCiAJcmV0dXJuIDA7CiAKLQl2bWVfdW5yZWdpc3Rlcl9icmlkZ2UodHNpMTQ4X2JyaWRnZSk7CiBlcnJfcmVnOgogCXRzaTE0OF9jcmNzcl9leGl0KHRzaTE0OF9icmlkZ2UsIHBkZXYpOwogZXJyX2NyY3NyOgogZXJyX2xtOgogCS8qIHJlc291cmNlcyBhcmUgc3RvcmVkIGluIGxpbmsgbGlzdCAqLwotCWxpc3RfZm9yX2VhY2gocG9zLCAmKHRzaTE0OF9icmlkZ2UtPmxtX3Jlc291cmNlcykpIHsKKwlsaXN0X2Zvcl9lYWNoKHBvcywgJnRzaTE0OF9icmlkZ2UtPmxtX3Jlc291cmNlcykgewogCQlsbSA9IGxpc3RfZW50cnkocG9zLCBzdHJ1Y3Qgdm1lX2xtX3Jlc291cmNlLCBsaXN0KTsKIAkJbGlzdF9kZWwocG9zKTsKIAkJa2ZyZWUobG0pOwogCX0KIGVycl9kbWE6CiAJLyogcmVzb3VyY2VzIGFyZSBzdG9yZWQgaW4gbGluayBsaXN0ICovCi0JbGlzdF9mb3JfZWFjaChwb3MsICYodHNpMTQ4X2JyaWRnZS0+ZG1hX3Jlc291cmNlcykpIHsKKwlsaXN0X2Zvcl9lYWNoKHBvcywgJnRzaTE0OF9icmlkZ2UtPmRtYV9yZXNvdXJjZXMpIHsKIAkJZG1hX2N0cmxyID0gbGlzdF9lbnRyeShwb3MsIHN0cnVjdCB2bWVfZG1hX3Jlc291cmNlLCBsaXN0KTsKIAkJbGlzdF9kZWwocG9zKTsKIAkJa2ZyZWUoZG1hX2N0cmxyKTsKIAl9CiBlcnJfc2xhdmU6CiAJLyogcmVzb3VyY2VzIGFyZSBzdG9yZWQgaW4gbGluayBsaXN0ICovCi0JbGlzdF9mb3JfZWFjaChwb3MsICYodHNpMTQ4X2JyaWRnZS0+c2xhdmVfcmVzb3VyY2VzKSkgeworCWxpc3RfZm9yX2VhY2gocG9zLCAmdHNpMTQ4X2JyaWRnZS0+c2xhdmVfcmVzb3VyY2VzKSB7CiAJCXNsYXZlX2ltYWdlID0gbGlzdF9lbnRyeShwb3MsIHN0cnVjdCB2bWVfc2xhdmVfcmVzb3VyY2UsIGxpc3QpOwogCQlsaXN0X2RlbChwb3MpOwogCQlrZnJlZShzbGF2ZV9pbWFnZSk7CiAJfQogZXJyX21hc3RlcjoKIAkvKiByZXNvdXJjZXMgYXJlIHN0b3JlZCBpbiBsaW5rIGxpc3QgKi8KLQlsaXN0X2Zvcl9lYWNoKHBvcywgJih0c2kxNDhfYnJpZGdlLT5tYXN0ZXJfcmVzb3VyY2VzKSkgeworCWxpc3RfZm9yX2VhY2gocG9zLCAmdHNpMTQ4X2JyaWRnZS0+bWFzdGVyX3Jlc291cmNlcykgewogCQltYXN0ZXJfaW1hZ2UgPSBsaXN0X2VudHJ5KHBvcywgc3RydWN0IHZtZV9tYXN0ZXJfcmVzb3VyY2UsCiAJCQlsaXN0KTsKIAkJbGlzdF9kZWwocG9zKTsKIAkJa2ZyZWUobWFzdGVyX2ltYWdlKTsKIAl9CiAKLQl0c2kxNDhfaXJxX2V4aXQodHNpMTQ4X2RldmljZSwgcGRldik7CisJdHNpMTQ4X2lycV9leGl0KHRzaTE0OF9icmlkZ2UsIHBkZXYpOwogZXJyX2lycToKIGVycl90ZXN0OgogCWlvdW5tYXAodHNpMTQ4X2RldmljZS0+YmFzZSk7CkBAIC0yNTMxLDYgKzI1MzQsNyBAQAogc3RhdGljIHZvaWQgdHNpMTQ4X3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkICpwb3MgPSBOVUxMOworCXN0cnVjdCBsaXN0X2hlYWQgKnRtcGxpc3Q7CiAJc3RydWN0IHZtZV9tYXN0ZXJfcmVzb3VyY2UgKm1hc3Rlcl9pbWFnZTsKIAlzdHJ1Y3Qgdm1lX3NsYXZlX3Jlc291cmNlICpzbGF2ZV9pbWFnZTsKIAlzdHJ1Y3Qgdm1lX2RtYV9yZXNvdXJjZSAqZG1hX2N0cmxyOwpAQCAtMjU4MiwzNiArMjU4NiwzNCBAQAogCWlvd3JpdGUzMmJlKDB4MCwgYnJpZGdlLT5iYXNlICsgVFNJMTQ4X0xDU1JfSU5UTTEpOwogCWlvd3JpdGUzMmJlKDB4MCwgYnJpZGdlLT5iYXNlICsgVFNJMTQ4X0xDU1JfSU5UTTIpOwogCi0JdHNpMTQ4X2lycV9leGl0KGJyaWRnZSwgcGRldik7CisJdHNpMTQ4X2lycV9leGl0KHRzaTE0OF9icmlkZ2UsIHBkZXYpOwogCiAJdm1lX3VucmVnaXN0ZXJfYnJpZGdlKHRzaTE0OF9icmlkZ2UpOwogCiAJdHNpMTQ4X2NyY3NyX2V4aXQodHNpMTQ4X2JyaWRnZSwgcGRldik7CiAKIAkvKiByZXNvdXJjZXMgYXJlIHN0b3JlZCBpbiBsaW5rIGxpc3QgKi8KLQlsaXN0X2Zvcl9lYWNoKHBvcywgJih0c2kxNDhfYnJpZGdlLT5kbWFfcmVzb3VyY2VzKSkgeworCWxpc3RfZm9yX2VhY2hfc2FmZShwb3MsIHRtcGxpc3QsICZ0c2kxNDhfYnJpZGdlLT5kbWFfcmVzb3VyY2VzKSB7CiAJCWRtYV9jdHJsciA9IGxpc3RfZW50cnkocG9zLCBzdHJ1Y3Qgdm1lX2RtYV9yZXNvdXJjZSwgbGlzdCk7CiAJCWxpc3RfZGVsKHBvcyk7CiAJCWtmcmVlKGRtYV9jdHJscik7CiAJfQogCiAJLyogcmVzb3VyY2VzIGFyZSBzdG9yZWQgaW4gbGluayBsaXN0ICovCi0JbGlzdF9mb3JfZWFjaChwb3MsICYodHNpMTQ4X2JyaWRnZS0+c2xhdmVfcmVzb3VyY2VzKSkgeworCWxpc3RfZm9yX2VhY2hfc2FmZShwb3MsIHRtcGxpc3QsICZ0c2kxNDhfYnJpZGdlLT5zbGF2ZV9yZXNvdXJjZXMpIHsKIAkJc2xhdmVfaW1hZ2UgPSBsaXN0X2VudHJ5KHBvcywgc3RydWN0IHZtZV9zbGF2ZV9yZXNvdXJjZSwgbGlzdCk7CiAJCWxpc3RfZGVsKHBvcyk7CiAJCWtmcmVlKHNsYXZlX2ltYWdlKTsKIAl9CiAKIAkvKiByZXNvdXJjZXMgYXJlIHN0b3JlZCBpbiBsaW5rIGxpc3QgKi8KLQlsaXN0X2Zvcl9lYWNoKHBvcywgJih0c2kxNDhfYnJpZGdlLT5tYXN0ZXJfcmVzb3VyY2VzKSkgeworCWxpc3RfZm9yX2VhY2hfc2FmZShwb3MsIHRtcGxpc3QsICZ0c2kxNDhfYnJpZGdlLT5tYXN0ZXJfcmVzb3VyY2VzKSB7CiAJCW1hc3Rlcl9pbWFnZSA9IGxpc3RfZW50cnkocG9zLCBzdHJ1Y3Qgdm1lX21hc3Rlcl9yZXNvdXJjZSwKIAkJCWxpc3QpOwogCQlsaXN0X2RlbChwb3MpOwogCQlrZnJlZShtYXN0ZXJfaW1hZ2UpOwogCX0KIAotCXRzaTE0OF9pcnFfZXhpdChicmlkZ2UsIHBkZXYpOwotCiAJaW91bm1hcChicmlkZ2UtPmJhc2UpOwogCiAJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92bWUvYnJpZGdlcy92bWVfdHNpMTQ4LmggYi9kcml2ZXJzL3N0YWdpbmcvdm1lL2JyaWRnZXMvdm1lX3RzaTE0OC5oCmluZGV4IGJkYTY0ZWYuLjlmOTdmYTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy92bWUvYnJpZGdlcy92bWVfdHNpMTQ4LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3ZtZS9icmlkZ2VzL3ZtZV90c2kxNDguaApAQCAtMzUsNyArMzUsNyBAQAogCiAvKiBTdHJ1Y3R1cmUgdXNlZCB0byBob2xkIGRyaXZlciBzcGVjaWZpYyBpbmZvcm1hdGlvbiAqLwogc3RydWN0IHRzaTE0OF9kcml2ZXIgewotCXZvaWQgKmJhc2U7CS8qIEJhc2UgQWRkcmVzcyBvZiBkZXZpY2UgcmVnaXN0ZXJzICovCisJdm9pZCBfX2lvbWVtICpiYXNlOwkvKiBCYXNlIEFkZHJlc3Mgb2YgZGV2aWNlIHJlZ2lzdGVycyAqLwogCXdhaXRfcXVldWVfaGVhZF90IGRtYV9xdWV1ZVsyXTsKIAl3YWl0X3F1ZXVlX2hlYWRfdCBpYWNrX3F1ZXVlOwogCXZvaWQgKCpsbV9jYWxsYmFja1s0XSkoaW50KTsJLyogQ2FsbGVkIGluIGludGVycnVwdCBoYW5kbGVyICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdm1lL2RldmljZXMvdm1lX3VzZXIuYyBiL2RyaXZlcnMvc3RhZ2luZy92bWUvZGV2aWNlcy92bWVfdXNlci5jCmluZGV4IDcxYmJjNTIuLmE1NzExNzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy92bWUvZGV2aWNlcy92bWVfdXNlci5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92bWUvZGV2aWNlcy92bWVfdXNlci5jCkBAIC00NCw3ICs0NCw3IEBACiBzdGF0aWMgY2hhciBkcml2ZXJfbmFtZVtdID0gInZtZV91c2VyIjsKIAogc3RhdGljIGludCBidXNbVVNFUl9CVVNfTUFYXTsKLXN0YXRpYyBpbnQgYnVzX251bTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgYnVzX251bTsKIAogLyogQ3VycmVudGx5IERvY3VtZW50YXRpb24vZGV2aWNlcy50eHQgZGVmaW5lcyB0aGUgZm9sbG93aW5nIGZvciBWTUU6CiAgKgpAQCAtOTIsNyArOTIsNyBAQAogICogU3RydWN0dXJlIHRvIGhhbmRsZSBpbWFnZSByZWxhdGVkIHBhcmFtZXRlcnMuCiAgKi8KIHR5cGVkZWYgc3RydWN0IHsKLQl2b2lkIF9faW9tZW0gKmtlcm5fYnVmOwkvKiBCdWZmZXIgYWRkcmVzcyBpbiBrZXJuZWwgc3BhY2UgKi8KKwl2b2lkICprZXJuX2J1ZjsJLyogQnVmZmVyIGFkZHJlc3MgaW4ga2VybmVsIHNwYWNlICovCiAJZG1hX2FkZHJfdCBwY2lfYnVmOwkvKiBCdWZmZXIgYWRkcmVzcyBpbiBQQ0kgYWRkcmVzcyBzcGFjZSAqLwogCXVuc2lnbmVkIGxvbmcgbG9uZyBzaXplX2J1ZjsJLyogQnVmZmVyIHNpemUgKi8KIAlzdHJ1Y3Qgc2VtYXBob3JlIHNlbTsJLyogU2VtYXBob3JlIGZvciBsb2NraW5nIGltYWdlICovCkBAIC0xMTQsOSArMTE0LDkgQEAKIH0gZHJpdmVyX3N0YXRzX3Q7CiBzdGF0aWMgZHJpdmVyX3N0YXRzX3Qgc3RhdGlzdGljczsKIAotc3RydWN0IGNkZXYgKnZtZV91c2VyX2NkZXY7CQkvKiBDaGFyYWN0ZXIgZGV2aWNlICovCi1zdHJ1Y3QgY2xhc3MgKnZtZV91c2VyX3N5c2ZzX2NsYXNzOwkvKiBTeXNmcyBjbGFzcyAqLwotc3RydWN0IGRldmljZSAqdm1lX3VzZXJfYnJpZGdlOwkJLyogUG9pbnRlciB0byB0aGUgYnJpZGdlIGRldmljZSAqLworc3RhdGljIHN0cnVjdCBjZGV2ICp2bWVfdXNlcl9jZGV2OwkJLyogQ2hhcmFjdGVyIGRldmljZSAqLworc3RhdGljIHN0cnVjdCBjbGFzcyAqdm1lX3VzZXJfc3lzZnNfY2xhc3M7CS8qIFN5c2ZzIGNsYXNzICovCitzdGF0aWMgc3RydWN0IGRldmljZSAqdm1lX3VzZXJfYnJpZGdlOwkJLyogUG9pbnRlciB0byBicmlkZ2UgZGV2aWNlICovCiAKIAogc3RhdGljIGNvbnN0IGludCB0eXBlW1ZNRV9ERVZTXSA9IHsJTUFTVEVSX01JTk9SLAlNQVNURVJfTUlOT1IsCkBAIC0xMjksMTMgKzEyOSwxNCBAQAogCiBzdGF0aWMgaW50IHZtZV91c2VyX29wZW4oc3RydWN0IGlub2RlICosIHN0cnVjdCBmaWxlICopOwogc3RhdGljIGludCB2bWVfdXNlcl9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgZmlsZSAqKTsKLXN0YXRpYyBzc2l6ZV90IHZtZV91c2VyX3JlYWQoc3RydWN0IGZpbGUgKiwgY2hhciAqLCBzaXplX3QsIGxvZmZfdCAqKTsKLXN0YXRpYyBzc2l6ZV90IHZtZV91c2VyX3dyaXRlKHN0cnVjdCBmaWxlICosIGNvbnN0IGNoYXIgKiwgc2l6ZV90LCBsb2ZmX3QgKik7CitzdGF0aWMgc3NpemVfdCB2bWVfdXNlcl9yZWFkKHN0cnVjdCBmaWxlICosIGNoYXIgX191c2VyICosIHNpemVfdCwgbG9mZl90ICopOworc3RhdGljIHNzaXplX3Qgdm1lX3VzZXJfd3JpdGUoc3RydWN0IGZpbGUgKiwgY29uc3QgY2hhciBfX3VzZXIgKiwgc2l6ZV90LAorCWxvZmZfdCAqKTsKIHN0YXRpYyBsb2ZmX3Qgdm1lX3VzZXJfbGxzZWVrKHN0cnVjdCBmaWxlICosIGxvZmZfdCwgaW50KTsKIHN0YXRpYyBsb25nIHZtZV91c2VyX3VubG9ja2VkX2lvY3RsKHN0cnVjdCBmaWxlICosIHVuc2lnbmVkIGludCwgdW5zaWduZWQgbG9uZyk7CiAKLXN0YXRpYyBpbnQgX19pbml0IHZtZV91c2VyX3Byb2JlKHN0cnVjdCBkZXZpY2UgKiwgaW50LCBpbnQpOwotc3RhdGljIGludCBfX2V4aXQgdm1lX3VzZXJfcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKiwgaW50LCBpbnQpOworc3RhdGljIGludCBfX2RldmluaXQgdm1lX3VzZXJfcHJvYmUoc3RydWN0IGRldmljZSAqLCBpbnQsIGludCk7CitzdGF0aWMgaW50IF9fZGV2ZXhpdCB2bWVfdXNlcl9yZW1vdmUoc3RydWN0IGRldmljZSAqLCBpbnQsIGludCk7CiAKIHN0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHZtZV91c2VyX2ZvcHMgPSB7CiAJLm9wZW4gPSB2bWVfdXNlcl9vcGVuLApAQCAtMjQ2LDcgKzI0Nyw3IEBACiAgKiBwYWdlKSB0cmFuc2ZlcnMgd2lsbCBsb2NrIHRoZSB1c2VyIHNwYWNlIGJ1ZmZlciBpbnRvIG1lbW9yeSBhbmQgdGhlbgogICogdHJhbnNmZXIgdGhlIGRhdGEgZGlyZWN0bHkgZnJvbSB0aGUgdXNlciBzcGFjZSBidWZmZXJzIG91dCB0byBWTUUuCiAgKi8KLXN0YXRpYyBzc2l6ZV90IHJlc291cmNlX2Zyb21fdXNlcih1bnNpZ25lZCBpbnQgbWlub3IsIGNvbnN0IGNoYXIgKmJ1ZiwKK3N0YXRpYyBzc2l6ZV90IHJlc291cmNlX2Zyb21fdXNlcih1bnNpZ25lZCBpbnQgbWlub3IsIGNvbnN0IGNoYXIgX191c2VyICpidWYsCiAJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCiB7CiAJc3NpemVfdCByZXR2YWw7CkBAIC0yNzcsNyArMjc4LDcgQEAKIHN0YXRpYyBzc2l6ZV90IGJ1ZmZlcl90b191c2VyKHVuc2lnbmVkIGludCBtaW5vciwgY2hhciBfX3VzZXIgKmJ1ZiwKIAlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKIHsKLQl2b2lkIF9faW9tZW0gKmltYWdlX3B0cjsKKwl2b2lkICppbWFnZV9wdHI7CiAJc3NpemVfdCByZXR2YWw7CiAKIAlpbWFnZV9wdHIgPSBpbWFnZVttaW5vcl0ua2Vybl9idWYgKyAqcHBvczsKQEAgLTI5MywxMCArMjk0LDEwIEBACiAJcmV0dXJuIHJldHZhbDsKIH0KIAotc3RhdGljIHNzaXplX3QgYnVmZmVyX2Zyb21fdXNlcih1bnNpZ25lZCBpbnQgbWlub3IsIGNvbnN0IGNoYXIgKmJ1ZiwKK3N0YXRpYyBzc2l6ZV90IGJ1ZmZlcl9mcm9tX3VzZXIodW5zaWduZWQgaW50IG1pbm9yLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLAogCXNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQogewotCXZvaWQgX19pb21lbSAqaW1hZ2VfcHRyOworCXZvaWQgKmltYWdlX3B0cjsKIAlzaXplX3QgcmV0dmFsOwogCiAJaW1hZ2VfcHRyID0gaW1hZ2VbbWlub3JdLmtlcm5fYnVmICsgKnBwb3M7CkBAIC0zMTIsNyArMzEzLDcgQEAKIAlyZXR1cm4gcmV0dmFsOwogfQogCi1zdGF0aWMgc3NpemVfdCB2bWVfdXNlcl9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyICpidWYsIHNpemVfdCBjb3VudCwKK3N0YXRpYyBzc2l6ZV90IHZtZV91c2VyX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCwKIAkJCWxvZmZfdCAqcHBvcykKIHsKIAl1bnNpZ25lZCBpbnQgbWlub3IgPSBNSU5PUihmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZS0+aV9yZGV2KTsKQEAgLTM1Niw4ICszNTcsOCBAQAogCXJldHVybiByZXR2YWw7CiB9CiAKLXN0YXRpYyBzc2l6ZV90IHZtZV91c2VyX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCwKLQkJCSBsb2ZmX3QgKnBwb3MpCitzdGF0aWMgc3NpemVfdCB2bWVfdXNlcl93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJCXNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQogewogCXVuc2lnbmVkIGludCBtaW5vciA9IE1JTk9SKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLT5pX3JkZXYpOwogCXNzaXplX3QgcmV0dmFsOwpAQCAtNDU1LDYgKzQ1Niw3IEBACiAJdW5zaWduZWQgaW50IG1pbm9yID0gTUlOT1IoaW5vZGUtPmlfcmRldik7CiAJaW50IHJldHZhbDsKIAlkbWFfYWRkcl90IHBjaV9hZGRyOworCXZvaWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOwogCiAJc3RhdGlzdGljcy5pb2N0bHMrKzsKIApAQCAtNDcwLDExICs0NzIsMTEgQEAKIAkJCSAqCXRvIHVzZXJzcGFjZSBhcyB0aGV5IGFyZQogCQkJICovCiAJCQlyZXR2YWwgPSB2bWVfbWFzdGVyX2dldChpbWFnZVttaW5vcl0ucmVzb3VyY2UsCi0JCQkJJihtYXN0ZXIuZW5hYmxlKSwgJihtYXN0ZXIudm1lX2FkZHIpLAotCQkJCSYobWFzdGVyLnNpemUpLCAmKG1hc3Rlci5hc3BhY2UpLAotCQkJCSYobWFzdGVyLmN5Y2xlKSwgJihtYXN0ZXIuZHdpZHRoKSk7CisJCQkJJm1hc3Rlci5lbmFibGUsICZtYXN0ZXIudm1lX2FkZHIsCisJCQkJJm1hc3Rlci5zaXplLCAmbWFzdGVyLmFzcGFjZSwKKwkJCQkmbWFzdGVyLmN5Y2xlLCAmbWFzdGVyLmR3aWR0aCk7CiAKLQkJCWNvcGllZCA9IGNvcHlfdG9fdXNlcigoY2hhciAqKWFyZywgJm1hc3RlciwKKwkJCWNvcGllZCA9IGNvcHlfdG9fdXNlcihhcmdwLCAmbWFzdGVyLAogCQkJCXNpemVvZihzdHJ1Y3Qgdm1lX21hc3RlcikpOwogCQkJaWYgKGNvcGllZCAhPSAwKSB7CiAJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiUGFydGlhbCBjb3B5IHRvICIKQEAgLTQ4Nyw4ICs0ODksNyBAQAogCiAJCWNhc2UgVk1FX1NFVF9NQVNURVI6CiAKLQkJCWNvcGllZCA9IGNvcHlfZnJvbV91c2VyKCZtYXN0ZXIsIChjaGFyICopYXJnLAotCQkJCXNpemVvZihtYXN0ZXIpKTsKKwkJCWNvcGllZCA9IGNvcHlfZnJvbV91c2VyKCZtYXN0ZXIsIGFyZ3AsIHNpemVvZihtYXN0ZXIpKTsKIAkJCWlmIChjb3BpZWQgIT0gMCkgewogCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIlBhcnRpYWwgY29weSBmcm9tICIKIAkJCQkJInVzZXJzcGFjZVxuIik7CkBAIC01MTQsMTEgKzUxNSwxMSBAQAogCQkJICoJdG8gdXNlcnNwYWNlIGFzIHRoZXkgYXJlCiAJCQkgKi8KIAkJCXJldHZhbCA9IHZtZV9zbGF2ZV9nZXQoaW1hZ2VbbWlub3JdLnJlc291cmNlLAotCQkJCSYoc2xhdmUuZW5hYmxlKSwgJihzbGF2ZS52bWVfYWRkciksCi0JCQkJJihzbGF2ZS5zaXplKSwgJnBjaV9hZGRyLCAmKHNsYXZlLmFzcGFjZSksCi0JCQkJJihzbGF2ZS5jeWNsZSkpOworCQkJCSZzbGF2ZS5lbmFibGUsICZzbGF2ZS52bWVfYWRkciwKKwkJCQkmc2xhdmUuc2l6ZSwgJnBjaV9hZGRyLCAmc2xhdmUuYXNwYWNlLAorCQkJCSZzbGF2ZS5jeWNsZSk7CiAKLQkJCWNvcGllZCA9IGNvcHlfdG9fdXNlcigoY2hhciAqKWFyZywgJnNsYXZlLAorCQkJY29waWVkID0gY29weV90b191c2VyKGFyZ3AsICZzbGF2ZSwKIAkJCQlzaXplb2Yoc3RydWN0IHZtZV9zbGF2ZSkpOwogCQkJaWYgKGNvcGllZCAhPSAwKSB7CiAJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiUGFydGlhbCBjb3B5IHRvICIKQEAgLTUzMSw4ICs1MzIsNyBAQAogCiAJCWNhc2UgVk1FX1NFVF9TTEFWRToKIAotCQkJY29waWVkID0gY29weV9mcm9tX3VzZXIoJnNsYXZlLCAoY2hhciAqKWFyZywKLQkJCQlzaXplb2Yoc2xhdmUpKTsKKwkJCWNvcGllZCA9IGNvcHlfZnJvbV91c2VyKCZzbGF2ZSwgYXJncCwgc2l6ZW9mKHNsYXZlKSk7CiAJCQlpZiAoY29waWVkICE9IDApIHsKIAkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJQYXJ0aWFsIGNvcHkgZnJvbSAiCiAJCQkJCSJ1c2Vyc3BhY2VcbiIpOwpAQCAtNTk2LDcgKzU5Niw3IEBACiBzdGF0aWMgc3RydWN0IHZtZV9kcml2ZXIgdm1lX3VzZXJfZHJpdmVyID0gewogCS5uYW1lID0gZHJpdmVyX25hbWUsCiAJLnByb2JlID0gdm1lX3VzZXJfcHJvYmUsCi0JLnJlbW92ZSA9IHZtZV91c2VyX3JlbW92ZSwKKwkucmVtb3ZlID0gX19kZXZleGl0X3Aodm1lX3VzZXJfcmVtb3ZlKSwKIH07CiAKIApAQCAtNjExLDYgKzYxMSw3IEBACiAJaWYgKGJ1c19udW0gPT0gMCkgewogCQlwcmludGsoS0VSTl9FUlIgIiVzOiBObyBjYXJkcywgc2tpcHBpbmcgcmVnaXN0cmF0aW9uXG4iLAogCQkJZHJpdmVyX25hbWUpOworCQlyZXR2YWwgPSAtRU5PREVWOwogCQlnb3RvIGVycl9ub2NhcmQ7CiAJfQogCkBAIC02MjksNiArNjMwLDcgQEAKIAlpZiAoaWRzID09IE5VTEwpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICIlczogVW5hYmxlIHRvIGFsbG9jYXRlIElEIHRhYmxlXG4iLAogCQkJZHJpdmVyX25hbWUpOworCQlyZXR2YWwgPSAtRU5PTUVNOwogCQlnb3RvIGVycl9pZDsKIAl9CiAKQEAgLTY1Miw3ICs2NTQsNiBAQAogCiAJcmV0dXJuIHJldHZhbDsKIAotCXZtZV91bnJlZ2lzdGVyX2RyaXZlcigmdm1lX3VzZXJfZHJpdmVyKTsKIGVycl9yZWc6CiAJa2ZyZWUoaWRzKTsKIGVycl9pZDoKQEAgLTY2NSw3ICs2NjYsOCBAQAogICogYXMgcHJhY3RpY2FsLiBXZSB3aWxsIHRoZXJlZm9yZSByZXNlcnZlIHRoZSBidWZmZXJzIGFuZCByZXF1ZXN0IHRoZSBpbWFnZXMKICAqIGhlcmUgc28gdGhhdCB3ZSBkb24ndCBoYXZlIHRvIGRvIGl0IGxhdGVyLgogICovCi1zdGF0aWMgaW50IF9faW5pdCB2bWVfdXNlcl9wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCBjdXJfYnVzLCBpbnQgY3VyX3Nsb3QpCitzdGF0aWMgaW50IF9fZGV2aW5pdCB2bWVfdXNlcl9wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCBjdXJfYnVzLAorCWludCBjdXJfc2xvdCkKIHsKIAlpbnQgaSwgZXJyOwogCWNoYXIgbmFtZVsxMl07CkBAIC02ODMsNyArNjg1LDcgQEAKIAlmb3IgKGkgPSAwOyBpIDwgVk1FX0RFVlM7IGkrKykgewogCQlpbWFnZVtpXS5rZXJuX2J1ZiA9IE5VTEw7CiAJCWltYWdlW2ldLnBjaV9idWYgPSAwOwotCQlzZW1hX2luaXQoJihpbWFnZVtpXS5zZW0pLCAxKTsKKwkJc2VtYV9pbml0KCZpbWFnZVtpXS5zZW0sIDEpOwogCQlpbWFnZVtpXS5kZXZpY2UgPSBOVUxMOwogCQlpbWFnZVtpXS5yZXNvdXJjZSA9IE5VTEw7CiAJCWltYWdlW2ldLnVzZXJzID0gMDsKQEAgLTcyNyw3ICs3MjksNyBAQAogCQl9CiAJCWltYWdlW2ldLnNpemVfYnVmID0gUENJX0JVRl9TSVpFOwogCQlpbWFnZVtpXS5rZXJuX2J1ZiA9IHZtZV9hbGxvY19jb25zaXN0ZW50KGltYWdlW2ldLnJlc291cmNlLAotCQkJaW1hZ2VbaV0uc2l6ZV9idWYsICYoaW1hZ2VbaV0ucGNpX2J1ZikpOworCQkJaW1hZ2VbaV0uc2l6ZV9idWYsICZpbWFnZVtpXS5wY2lfYnVmKTsKIAkJaWYgKGltYWdlW2ldLmtlcm5fYnVmID09IE5VTEwpIHsKIAkJCXByaW50ayhLRVJOX1dBUk5JTkcgIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yICIKIAkJCQkiYnVmZmVyXG4iKTsKQEAgLTgyOCw4ICs4MzAsOCBAQAogZXJyX3NsYXZlOgogCXdoaWxlIChpID4gU0xBVkVfTUlOT1IpIHsKIAkJaS0tOwotCQl2bWVfc2xhdmVfZnJlZShpbWFnZVtpXS5yZXNvdXJjZSk7CiAJCWJ1Zl91bmFsbG9jKGkpOworCQl2bWVfc2xhdmVfZnJlZShpbWFnZVtpXS5yZXNvdXJjZSk7CiAJfQogZXJyX2NsYXNzOgogCWNkZXZfZGVsKHZtZV91c2VyX2NkZXYpOwpAQCAtODQwLDcgKzg0Miw4IEBACiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIGludCBfX2V4aXQgdm1lX3VzZXJfcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IGN1cl9idXMsIGludCBjdXJfc2xvdCkKK3N0YXRpYyBpbnQgX19kZXZleGl0IHZtZV91c2VyX3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCBjdXJfYnVzLAorCWludCBjdXJfc2xvdCkKIHsKIAlpbnQgaTsKIApAQCAtODQ5LDEzICs4NTIsMTUgQEAKIAkJZGV2aWNlX2Rlc3Ryb3kodm1lX3VzZXJfc3lzZnNfY2xhc3MsIE1LREVWKFZNRV9NQUpPUiwgaSkpOwogCWNsYXNzX2Rlc3Ryb3kodm1lX3VzZXJfc3lzZnNfY2xhc3MpOwogCi0JZm9yIChpID0gTUFTVEVSX01JTk9SOyBpIDwgKE1BU1RFUl9NQVggKyAxKTsgaSsrKQorCWZvciAoaSA9IE1BU1RFUl9NSU5PUjsgaSA8IChNQVNURVJfTUFYICsgMSk7IGkrKykgewogCQlrZnJlZShpbWFnZVtpXS5rZXJuX2J1Zik7CisJCXZtZV9tYXN0ZXJfZnJlZShpbWFnZVtpXS5yZXNvdXJjZSk7CisJfQogCiAJZm9yIChpID0gU0xBVkVfTUlOT1I7IGkgPCAoU0xBVkVfTUFYICsgMSk7IGkrKykgewogCQl2bWVfc2xhdmVfc2V0KGltYWdlW2ldLnJlc291cmNlLCAwLCAwLCAwLCAwLCBWTUVfQTMyLCAwKTsKLQkJdm1lX3NsYXZlX2ZyZWUoaW1hZ2VbaV0ucmVzb3VyY2UpOwogCQlidWZfdW5hbGxvYyhpKTsKKwkJdm1lX3NsYXZlX2ZyZWUoaW1hZ2VbaV0ucmVzb3VyY2UpOwogCX0KIAogCS8qIFVucmVnaXN0ZXIgZGV2aWNlIGRyaXZlciAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3ZtZS92bWUuYyBiL2RyaXZlcnMvc3RhZ2luZy92bWUvdm1lLmMKaW5kZXggMDkzZmJmZi4uZDlmYzg2NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3ZtZS92bWUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdm1lL3ZtZS5jCkBAIC0yNDUsNyArMjQ1LDcgQEAKIAl9CiAKIAkvKiBMb29wIHRocm91Z2ggc2xhdmUgcmVzb3VyY2VzICovCi0JbGlzdF9mb3JfZWFjaChzbGF2ZV9wb3MsICYoYnJpZGdlLT5zbGF2ZV9yZXNvdXJjZXMpKSB7CisJbGlzdF9mb3JfZWFjaChzbGF2ZV9wb3MsICZicmlkZ2UtPnNsYXZlX3Jlc291cmNlcykgewogCQlzbGF2ZV9pbWFnZSA9IGxpc3RfZW50cnkoc2xhdmVfcG9zLAogCQkJc3RydWN0IHZtZV9zbGF2ZV9yZXNvdXJjZSwgbGlzdCk7CiAKQEAgLTI1NSwxNyArMjU1LDE3IEBACiAJCX0KIAogCQkvKiBGaW5kIGFuIHVubG9ja2VkIGFuZCBjb21wYXRpYmxlIGltYWdlICovCi0JCW11dGV4X2xvY2soJihzbGF2ZV9pbWFnZS0+bXR4KSk7CisJCW11dGV4X2xvY2soJnNsYXZlX2ltYWdlLT5tdHgpOwogCQlpZiAoKChzbGF2ZV9pbWFnZS0+YWRkcmVzc19hdHRyICYgYWRkcmVzcykgPT0gYWRkcmVzcykgJiYKIAkJCSgoc2xhdmVfaW1hZ2UtPmN5Y2xlX2F0dHIgJiBjeWNsZSkgPT0gY3ljbGUpICYmCiAJCQkoc2xhdmVfaW1hZ2UtPmxvY2tlZCA9PSAwKSkgewogCiAJCQlzbGF2ZV9pbWFnZS0+bG9ja2VkID0gMTsKLQkJCW11dGV4X3VubG9jaygmKHNsYXZlX2ltYWdlLT5tdHgpKTsKKwkJCW11dGV4X3VubG9jaygmc2xhdmVfaW1hZ2UtPm10eCk7CiAJCQlhbGxvY2F0ZWRfaW1hZ2UgPSBzbGF2ZV9pbWFnZTsKIAkJCWJyZWFrOwogCQl9Ci0JCW11dGV4X3VubG9jaygmKHNsYXZlX2ltYWdlLT5tdHgpKTsKKwkJbXV0ZXhfdW5sb2NrKCZzbGF2ZV9pbWFnZS0+bXR4KTsKIAl9CiAKIAkvKiBObyBmcmVlIGltYWdlICovCkBAIC0yNzgsMTUgKzI3OCwxNSBAQAogCQlnb3RvIGVycl9hbGxvYzsKIAl9CiAJcmVzb3VyY2UtPnR5cGUgPSBWTUVfU0xBVkU7Ci0JcmVzb3VyY2UtPmVudHJ5ID0gJihhbGxvY2F0ZWRfaW1hZ2UtPmxpc3QpOworCXJlc291cmNlLT5lbnRyeSA9ICZhbGxvY2F0ZWRfaW1hZ2UtPmxpc3Q7CiAKIAlyZXR1cm4gcmVzb3VyY2U7CiAKIGVycl9hbGxvYzoKIAkvKiBVbmxvY2sgaW1hZ2UgKi8KLQltdXRleF9sb2NrKCYoc2xhdmVfaW1hZ2UtPm10eCkpOworCW11dGV4X2xvY2soJnNsYXZlX2ltYWdlLT5tdHgpOwogCXNsYXZlX2ltYWdlLT5sb2NrZWQgPSAwOwotCW11dGV4X3VubG9jaygmKHNsYXZlX2ltYWdlLT5tdHgpKTsKKwltdXRleF91bmxvY2soJnNsYXZlX2ltYWdlLT5tdHgpOwogZXJyX2ltYWdlOgogZXJyX2J1czoKIAlyZXR1cm4gTlVMTDsKQEAgLTM2OSwxMiArMzY5LDEyIEBACiAJfQogCiAJLyogVW5sb2NrIGltYWdlICovCi0JbXV0ZXhfbG9jaygmKHNsYXZlX2ltYWdlLT5tdHgpKTsKKwltdXRleF9sb2NrKCZzbGF2ZV9pbWFnZS0+bXR4KTsKIAlpZiAoc2xhdmVfaW1hZ2UtPmxvY2tlZCA9PSAwKQogCQlwcmludGsoS0VSTl9FUlIgIkltYWdlIGlzIGFscmVhZHkgZnJlZVxuIik7CiAKIAlzbGF2ZV9pbWFnZS0+bG9ja2VkID0gMDsKLQltdXRleF91bmxvY2soJihzbGF2ZV9pbWFnZS0+bXR4KSk7CisJbXV0ZXhfdW5sb2NrKCZzbGF2ZV9pbWFnZS0+bXR4KTsKIAogCS8qIEZyZWUgdXAgcmVzb3VyY2UgbWVtb3J5ICovCiAJa2ZyZWUocmVzb3VyY2UpOwpAQCAtNDAxLDcgKzQwMSw3IEBACiAJfQogCiAJLyogTG9vcCB0aHJvdWdoIG1hc3RlciByZXNvdXJjZXMgKi8KLQlsaXN0X2Zvcl9lYWNoKG1hc3Rlcl9wb3MsICYoYnJpZGdlLT5tYXN0ZXJfcmVzb3VyY2VzKSkgeworCWxpc3RfZm9yX2VhY2gobWFzdGVyX3BvcywgJmJyaWRnZS0+bWFzdGVyX3Jlc291cmNlcykgewogCQltYXN0ZXJfaW1hZ2UgPSBsaXN0X2VudHJ5KG1hc3Rlcl9wb3MsCiAJCQlzdHJ1Y3Qgdm1lX21hc3Rlcl9yZXNvdXJjZSwgbGlzdCk7CiAKQEAgLTQxMSwxOCArNDExLDE4IEBACiAJCX0KIAogCQkvKiBGaW5kIGFuIHVubG9ja2VkIGFuZCBjb21wYXRpYmxlIGltYWdlICovCi0JCXNwaW5fbG9jaygmKG1hc3Rlcl9pbWFnZS0+bG9jaykpOworCQlzcGluX2xvY2soJm1hc3Rlcl9pbWFnZS0+bG9jayk7CiAJCWlmICgoKG1hc3Rlcl9pbWFnZS0+YWRkcmVzc19hdHRyICYgYWRkcmVzcykgPT0gYWRkcmVzcykgJiYKIAkJCSgobWFzdGVyX2ltYWdlLT5jeWNsZV9hdHRyICYgY3ljbGUpID09IGN5Y2xlKSAmJgogCQkJKChtYXN0ZXJfaW1hZ2UtPndpZHRoX2F0dHIgJiBkd2lkdGgpID09IGR3aWR0aCkgJiYKIAkJCShtYXN0ZXJfaW1hZ2UtPmxvY2tlZCA9PSAwKSkgewogCiAJCQltYXN0ZXJfaW1hZ2UtPmxvY2tlZCA9IDE7Ci0JCQlzcGluX3VubG9jaygmKG1hc3Rlcl9pbWFnZS0+bG9jaykpOworCQkJc3Bpbl91bmxvY2soJm1hc3Rlcl9pbWFnZS0+bG9jayk7CiAJCQlhbGxvY2F0ZWRfaW1hZ2UgPSBtYXN0ZXJfaW1hZ2U7CiAJCQlicmVhazsKIAkJfQotCQlzcGluX3VubG9jaygmKG1hc3Rlcl9pbWFnZS0+bG9jaykpOworCQlzcGluX3VubG9jaygmbWFzdGVyX2ltYWdlLT5sb2NrKTsKIAl9CiAKIAkvKiBDaGVjayB0byBzZWUgaWYgd2UgZm91bmQgYSByZXNvdXJjZSAqLwpAQCAtNDM3LDE2ICs0MzcsMTYgQEAKIAkJZ290byBlcnJfYWxsb2M7CiAJfQogCXJlc291cmNlLT50eXBlID0gVk1FX01BU1RFUjsKLQlyZXNvdXJjZS0+ZW50cnkgPSAmKGFsbG9jYXRlZF9pbWFnZS0+bGlzdCk7CisJcmVzb3VyY2UtPmVudHJ5ID0gJmFsbG9jYXRlZF9pbWFnZS0+bGlzdDsKIAogCXJldHVybiByZXNvdXJjZTsKIAogCWtmcmVlKHJlc291cmNlKTsKIGVycl9hbGxvYzoKIAkvKiBVbmxvY2sgaW1hZ2UgKi8KLQlzcGluX2xvY2soJihtYXN0ZXJfaW1hZ2UtPmxvY2spKTsKKwlzcGluX2xvY2soJm1hc3Rlcl9pbWFnZS0+bG9jayk7CiAJbWFzdGVyX2ltYWdlLT5sb2NrZWQgPSAwOwotCXNwaW5fdW5sb2NrKCYobWFzdGVyX2ltYWdlLT5sb2NrKSk7CisJc3Bpbl91bmxvY2soJm1hc3Rlcl9pbWFnZS0+bG9jayk7CiBlcnJfaW1hZ2U6CiBlcnJfYnVzOgogCXJldHVybiBOVUxMOwpAQCAtNjI4LDEyICs2MjgsMTIgQEAKIAl9CiAKIAkvKiBVbmxvY2sgaW1hZ2UgKi8KLQlzcGluX2xvY2soJihtYXN0ZXJfaW1hZ2UtPmxvY2spKTsKKwlzcGluX2xvY2soJm1hc3Rlcl9pbWFnZS0+bG9jayk7CiAJaWYgKG1hc3Rlcl9pbWFnZS0+bG9ja2VkID09IDApCiAJCXByaW50ayhLRVJOX0VSUiAiSW1hZ2UgaXMgYWxyZWFkeSBmcmVlXG4iKTsKIAogCW1hc3Rlcl9pbWFnZS0+bG9ja2VkID0gMDsKLQlzcGluX3VubG9jaygmKG1hc3Rlcl9pbWFnZS0+bG9jaykpOworCXNwaW5fdW5sb2NrKCZtYXN0ZXJfaW1hZ2UtPmxvY2spOwogCiAJLyogRnJlZSB1cCByZXNvdXJjZSBtZW1vcnkgKi8KIAlrZnJlZShyZXNvdXJjZSk7CkBAIC02NjIsNyArNjYyLDcgQEAKIAl9CiAKIAkvKiBMb29wIHRocm91Z2ggRE1BIHJlc291cmNlcyAqLwotCWxpc3RfZm9yX2VhY2goZG1hX3BvcywgJihicmlkZ2UtPmRtYV9yZXNvdXJjZXMpKSB7CisJbGlzdF9mb3JfZWFjaChkbWFfcG9zLCAmYnJpZGdlLT5kbWFfcmVzb3VyY2VzKSB7CiAJCWRtYV9jdHJsciA9IGxpc3RfZW50cnkoZG1hX3BvcywKIAkJCXN0cnVjdCB2bWVfZG1hX3Jlc291cmNlLCBsaXN0KTsKIApAQCAtNjcyLDE2ICs2NzIsMTYgQEAKIAkJfQogCiAJCS8qIEZpbmQgYW4gdW5sb2NrZWQgYW5kIGNvbXBhdGlibGUgY29udHJvbGxlciAqLwotCQltdXRleF9sb2NrKCYoZG1hX2N0cmxyLT5tdHgpKTsKKwkJbXV0ZXhfbG9jaygmZG1hX2N0cmxyLT5tdHgpOwogCQlpZiAoKChkbWFfY3RybHItPnJvdXRlX2F0dHIgJiByb3V0ZSkgPT0gcm91dGUpICYmCiAJCQkoZG1hX2N0cmxyLT5sb2NrZWQgPT0gMCkpIHsKIAogCQkJZG1hX2N0cmxyLT5sb2NrZWQgPSAxOwotCQkJbXV0ZXhfdW5sb2NrKCYoZG1hX2N0cmxyLT5tdHgpKTsKKwkJCW11dGV4X3VubG9jaygmZG1hX2N0cmxyLT5tdHgpOwogCQkJYWxsb2NhdGVkX2N0cmxyID0gZG1hX2N0cmxyOwogCQkJYnJlYWs7CiAJCX0KLQkJbXV0ZXhfdW5sb2NrKCYoZG1hX2N0cmxyLT5tdHgpKTsKKwkJbXV0ZXhfdW5sb2NrKCZkbWFfY3RybHItPm10eCk7CiAJfQogCiAJLyogQ2hlY2sgdG8gc2VlIGlmIHdlIGZvdW5kIGEgcmVzb3VyY2UgKi8KQEAgLTY5NCwxNSArNjk0LDE1IEBACiAJCWdvdG8gZXJyX2FsbG9jOwogCX0KIAlyZXNvdXJjZS0+dHlwZSA9IFZNRV9ETUE7Ci0JcmVzb3VyY2UtPmVudHJ5ID0gJihhbGxvY2F0ZWRfY3RybHItPmxpc3QpOworCXJlc291cmNlLT5lbnRyeSA9ICZhbGxvY2F0ZWRfY3RybHItPmxpc3Q7CiAKIAlyZXR1cm4gcmVzb3VyY2U7CiAKIGVycl9hbGxvYzoKIAkvKiBVbmxvY2sgaW1hZ2UgKi8KLQltdXRleF9sb2NrKCYoZG1hX2N0cmxyLT5tdHgpKTsKKwltdXRleF9sb2NrKCZkbWFfY3RybHItPm10eCk7CiAJZG1hX2N0cmxyLT5sb2NrZWQgPSAwOwotCW11dGV4X3VubG9jaygmKGRtYV9jdHJsci0+bXR4KSk7CisJbXV0ZXhfdW5sb2NrKCZkbWFfY3RybHItPm10eCk7CiBlcnJfY3RybHI6CiBlcnJfYnVzOgogCXJldHVybiBOVUxMOwpAQCAtNzI5LDkgKzcyOSw5IEBACiAJCXByaW50ayhLRVJOX0VSUiAiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgbmV3IGRtYSBsaXN0XG4iKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQotCUlOSVRfTElTVF9IRUFEKCYoZG1hX2xpc3QtPmVudHJpZXMpKTsKKwlJTklUX0xJU1RfSEVBRCgmZG1hX2xpc3QtPmVudHJpZXMpOwogCWRtYV9saXN0LT5wYXJlbnQgPSBjdHJscjsKLQltdXRleF9pbml0KCYoZG1hX2xpc3QtPm10eCkpOworCW11dGV4X2luaXQoJmRtYV9saXN0LT5tdHgpOwogCiAJcmV0dXJuIGRtYV9saXN0OwogfQpAQCAtODgwLDE0ICs4ODAsMTQgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JaWYgKCFtdXRleF90cnlsb2NrKCYobGlzdC0+bXR4KSkpIHsKKwlpZiAoIW11dGV4X3RyeWxvY2soJmxpc3QtPm10eCkpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJMaW5rIExpc3QgYWxyZWFkeSBzdWJtaXR0ZWRcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKIAlyZXR2YWwgPSBicmlkZ2UtPmRtYV9saXN0X2FkZChsaXN0LCBzcmMsIGRlc3QsIGNvdW50KTsKIAotCW11dGV4X3VubG9jaygmKGxpc3QtPm10eCkpOworCW11dGV4X3VubG9jaygmbGlzdC0+bXR4KTsKIAogCXJldHVybiByZXR2YWw7CiB9CkBAIC05MDMsMTEgKzkwMywxMSBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQltdXRleF9sb2NrKCYobGlzdC0+bXR4KSk7CisJbXV0ZXhfbG9jaygmbGlzdC0+bXR4KTsKIAogCXJldHZhbCA9IGJyaWRnZS0+ZG1hX2xpc3RfZXhlYyhsaXN0KTsKIAotCW11dGV4X3VubG9jaygmKGxpc3QtPm10eCkpOworCW11dGV4X3VubG9jaygmbGlzdC0+bXR4KTsKIAogCXJldHVybiByZXR2YWw7CiB9CkBAIC05MjMsNyArOTIzLDcgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JaWYgKCFtdXRleF90cnlsb2NrKCYobGlzdC0+bXR4KSkpIHsKKwlpZiAoIW11dGV4X3RyeWxvY2soJmxpc3QtPm10eCkpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJMaW5rIExpc3QgaW4gdXNlXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpAQCAtOTM1LDEwICs5MzUsMTAgQEAKIAlyZXR2YWwgPSBicmlkZ2UtPmRtYV9saXN0X2VtcHR5KGxpc3QpOwogCWlmIChyZXR2YWwpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJVbmFibGUgdG8gZW1wdHkgbGluay1saXN0IGVudHJpZXNcbiIpOwotCQltdXRleF91bmxvY2soJihsaXN0LT5tdHgpKTsKKwkJbXV0ZXhfdW5sb2NrKCZsaXN0LT5tdHgpOwogCQlyZXR1cm4gcmV0dmFsOwogCX0KLQltdXRleF91bmxvY2soJihsaXN0LT5tdHgpKTsKKwltdXRleF91bmxvY2soJmxpc3QtPm10eCk7CiAJa2ZyZWUobGlzdCk7CiAKIAlyZXR1cm4gcmV0dmFsOwpAQCAtOTU2LDIwICs5NTYsMjAgQEAKIAogCWN0cmxyID0gbGlzdF9lbnRyeShyZXNvdXJjZS0+ZW50cnksIHN0cnVjdCB2bWVfZG1hX3Jlc291cmNlLCBsaXN0KTsKIAotCWlmICghbXV0ZXhfdHJ5bG9jaygmKGN0cmxyLT5tdHgpKSkgeworCWlmICghbXV0ZXhfdHJ5bG9jaygmY3RybHItPm10eCkpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJSZXNvdXJjZSBidXN5LCBjYW4ndCBmcmVlXG4iKTsKIAkJcmV0dXJuIC1FQlVTWTsKIAl9CiAKLQlpZiAoIShsaXN0X2VtcHR5KCYoY3RybHItPnBlbmRpbmcpKSAmJiBsaXN0X2VtcHR5KCYoY3RybHItPnJ1bm5pbmcpKSkpIHsKKwlpZiAoIShsaXN0X2VtcHR5KCZjdHJsci0+cGVuZGluZykgJiYgbGlzdF9lbXB0eSgmY3RybHItPnJ1bm5pbmcpKSkgewogCQlwcmludGsoS0VSTl9XQVJOSU5HICJSZXNvdXJjZSBzdGlsbCBwcm9jZXNzaW5nIHRyYW5zZmVyc1xuIik7Ci0JCW11dGV4X3VubG9jaygmKGN0cmxyLT5tdHgpKTsKKwkJbXV0ZXhfdW5sb2NrKCZjdHJsci0+bXR4KTsKIAkJcmV0dXJuIC1FQlVTWTsKIAl9CiAKIAljdHJsci0+bG9ja2VkID0gMDsKIAotCW11dGV4X3VubG9jaygmKGN0cmxyLT5tdHgpKTsKKwltdXRleF91bmxvY2soJmN0cmxyLT5tdHgpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xMDEzLDEwICsxMDEzLDEwIEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCW11dGV4X2xvY2soJihicmlkZ2UtPmlycV9tdHgpKTsKKwltdXRleF9sb2NrKCZicmlkZ2UtPmlycV9tdHgpOwogCiAJaWYgKGJyaWRnZS0+aXJxW2xldmVsIC0gMV0uY2FsbGJhY2tbc3RhdGlkXS5mdW5jKSB7Ci0JCW11dGV4X3VubG9jaygmKGJyaWRnZS0+aXJxX210eCkpOworCQltdXRleF91bmxvY2soJmJyaWRnZS0+aXJxX210eCk7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIlZNRSBJbnRlcnJ1cHQgYWxyZWFkeSB0YWtlblxuIik7CiAJCXJldHVybiAtRUJVU1k7CiAJfQpAQCAtMTAyOCw3ICsxMDI4LDcgQEAKIAkvKiBFbmFibGUgSVJRIGxldmVsICovCiAJYnJpZGdlLT5pcnFfc2V0KGJyaWRnZSwgbGV2ZWwsIDEsIDEpOwogCi0JbXV0ZXhfdW5sb2NrKCYoYnJpZGdlLT5pcnFfbXR4KSk7CisJbXV0ZXhfdW5sb2NrKCZicmlkZ2UtPmlycV9tdHgpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xMDU0LDcgKzEwNTQsNyBAQAogCQlyZXR1cm47CiAJfQogCi0JbXV0ZXhfbG9jaygmKGJyaWRnZS0+aXJxX210eCkpOworCW11dGV4X2xvY2soJmJyaWRnZS0+aXJxX210eCk7CiAKIAlicmlkZ2UtPmlycVtsZXZlbCAtIDFdLmNvdW50LS07CiAKQEAgLTEwNjUsNyArMTA2NSw3IEBACiAJYnJpZGdlLT5pcnFbbGV2ZWwgLSAxXS5jYWxsYmFja1tzdGF0aWRdLmZ1bmMgPSBOVUxMOwogCWJyaWRnZS0+aXJxW2xldmVsIC0gMV0uY2FsbGJhY2tbc3RhdGlkXS5wcml2X2RhdGEgPSBOVUxMOwogCi0JbXV0ZXhfdW5sb2NrKCYoYnJpZGdlLT5pcnFfbXR4KSk7CisJbXV0ZXhfdW5sb2NrKCZicmlkZ2UtPmlycV9tdHgpOwogfQogRVhQT1JUX1NZTUJPTCh2bWVfaXJxX2ZyZWUpOwogCkBAIC0xMTExLDcgKzExMTEsNyBAQAogCX0KIAogCS8qIExvb3AgdGhyb3VnaCBETUEgcmVzb3VyY2VzICovCi0JbGlzdF9mb3JfZWFjaChsbV9wb3MsICYoYnJpZGdlLT5sbV9yZXNvdXJjZXMpKSB7CisJbGlzdF9mb3JfZWFjaChsbV9wb3MsICZicmlkZ2UtPmxtX3Jlc291cmNlcykgewogCQlsbSA9IGxpc3RfZW50cnkobG1fcG9zLAogCQkJc3RydWN0IHZtZV9sbV9yZXNvdXJjZSwgbGlzdCk7CiAKQEAgLTExMjIsMTQgKzExMjIsMTQgQEAKIAkJfQogCiAJCS8qIEZpbmQgYW4gdW5sb2NrZWQgY29udHJvbGxlciAqLwotCQltdXRleF9sb2NrKCYobG0tPm10eCkpOworCQltdXRleF9sb2NrKCZsbS0+bXR4KTsKIAkJaWYgKGxtLT5sb2NrZWQgPT0gMCkgewogCQkJbG0tPmxvY2tlZCA9IDE7Ci0JCQltdXRleF91bmxvY2soJihsbS0+bXR4KSk7CisJCQltdXRleF91bmxvY2soJmxtLT5tdHgpOwogCQkJYWxsb2NhdGVkX2xtID0gbG07CiAJCQlicmVhazsKIAkJfQotCQltdXRleF91bmxvY2soJihsbS0+bXR4KSk7CisJCW11dGV4X3VubG9jaygmbG0tPm10eCk7CiAJfQogCiAJLyogQ2hlY2sgdG8gc2VlIGlmIHdlIGZvdW5kIGEgcmVzb3VyY2UgKi8KQEAgLTExNDIsMTUgKzExNDIsMTUgQEAKIAkJZ290byBlcnJfYWxsb2M7CiAJfQogCXJlc291cmNlLT50eXBlID0gVk1FX0xNOwotCXJlc291cmNlLT5lbnRyeSA9ICYoYWxsb2NhdGVkX2xtLT5saXN0KTsKKwlyZXNvdXJjZS0+ZW50cnkgPSAmYWxsb2NhdGVkX2xtLT5saXN0OwogCiAJcmV0dXJuIHJlc291cmNlOwogCiBlcnJfYWxsb2M6CiAJLyogVW5sb2NrIGltYWdlICovCi0JbXV0ZXhfbG9jaygmKGxtLT5tdHgpKTsKKwltdXRleF9sb2NrKCZsbS0+bXR4KTsKIAlsbS0+bG9ja2VkID0gMDsKLQltdXRleF91bmxvY2soJihsbS0+bXR4KSk7CisJbXV0ZXhfdW5sb2NrKCZsbS0+bXR4KTsKIGVycl9sbToKIGVycl9idXM6CiAJcmV0dXJuIE5VTEw7CkBAIC0xMjcwLDcgKzEyNzAsNyBAQAogCiAJbG0gPSBsaXN0X2VudHJ5KHJlc291cmNlLT5lbnRyeSwgc3RydWN0IHZtZV9sbV9yZXNvdXJjZSwgbGlzdCk7CiAKLQltdXRleF9sb2NrKCYobG0tPm10eCkpOworCW11dGV4X2xvY2soJmxtLT5tdHgpOwogCiAJLyogWFhYCiAJICogQ2hlY2sgdG8gc2VlIHRoYXQgdGhlcmUgYXJlbid0IGFueSBjYWxsYmFja3Mgc3RpbGwgYXR0YWNoZWQsIGlmCkBAIC0xMjc5LDcgKzEyNzksNyBAQAogCiAJbG0tPmxvY2tlZCA9IDA7CiAKLQltdXRleF91bmxvY2soJihsbS0+bXR4KSk7CisJbXV0ZXhfdW5sb2NrKCZsbS0+bXR4KTsKIAogCWtmcmVlKHJlc291cmNlKTsKIH0KQEAgLTEzMjYsNyArMTMyNiw3IEBACiBzdGF0aWMgdm9pZCB2bWVfZnJlZV9idXNfbnVtKGludCBidXMpCiB7CiAJbXV0ZXhfbG9jaygmdm1lX2J1c19udW1fbXR4KTsKLQl2bWVfYnVzX251bWJlcnMgfD0gfigweDEgPDwgYnVzKTsKKwl2bWVfYnVzX251bWJlcnMgJj0gfigweDEgPDwgYnVzKTsKIAltdXRleF91bmxvY2soJnZtZV9idXNfbnVtX210eCk7CiB9CiAKQEAgLTEzNDMsMTEgKzEzNDMsMTEgQEAKIAkgKiBzcGVjaWZpY2F0aW9uLgogCSAqLwogCWZvciAoaSA9IDA7IGkgPCBWTUVfU0xPVFNfTUFYOyBpKyspIHsKLQkJZGV2ID0gJihicmlkZ2UtPmRldltpXSk7CisJCWRldiA9ICZicmlkZ2UtPmRldltpXTsKIAkJbWVtc2V0KGRldiwgMCwgc2l6ZW9mKHN0cnVjdCBkZXZpY2UpKTsKIAogCQlkZXYtPnBhcmVudCA9IGJyaWRnZS0+cGFyZW50OwotCQlkZXYtPmJ1cyA9ICYodm1lX2J1c190eXBlKTsKKwkJZGV2LT5idXMgPSAmdm1lX2J1c190eXBlOwogCQkvKgogCQkgKiBXZSBzYXZlIGEgcG9pbnRlciB0byB0aGUgYnJpZGdlIGluIHBsYXRmb3JtX2RhdGEgc28gdGhhdCB3ZQogCQkgKiBjYW4gZ2V0IHRvIGl0IGxhdGVyLiBXZSBrZWVwIGRyaXZlcl9kYXRhIGZvciB1c2UgYnkgdGhlCkBAIC0xMzY2LDcgKzEzNjYsNyBAQAogCWkgPSBWTUVfU0xPVFNfTUFYOwogZXJyX3JlZzoKIAl3aGlsZSAoaSA+IC0xKSB7Ci0JCWRldiA9ICYoYnJpZGdlLT5kZXZbaV0pOworCQlkZXYgPSAmYnJpZGdlLT5kZXZbaV07CiAJCWRldmljZV91bnJlZ2lzdGVyKGRldik7CiAJfQogCXZtZV9mcmVlX2J1c19udW0oYnJpZGdlLT5udW0pOwpAQCAtMTM4MSw3ICsxMzgxLDcgQEAKIAogCiAJZm9yIChpID0gMDsgaSA8IFZNRV9TTE9UU19NQVg7IGkrKykgewotCQlkZXYgPSAmKGJyaWRnZS0+ZGV2W2ldKTsKKwkJZGV2ID0gJmJyaWRnZS0+ZGV2W2ldOwogCQlkZXZpY2VfdW5yZWdpc3RlcihkZXYpOwogCX0KIAl2bWVfZnJlZV9idXNfbnVtKGJyaWRnZS0+bnVtKTsKQEAgLTE0MTgsNyArMTQxOCw3IEBACiAJLyogRGV0ZXJtaW5lIHNsb3QgbnVtYmVyICovCiAJbnVtID0gMDsKIAl3aGlsZSAobnVtIDwgVk1FX1NMT1RTX01BWCkgewotCQlpZiAoJihicmlkZ2UtPmRldltudW1dKSA9PSBkZXYpCisJCWlmICgmYnJpZGdlLT5kZXZbbnVtXSA9PSBkZXYpCiAJCQlicmVhazsKIAogCQludW0rKzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92bWUvdm1lX2JyaWRnZS5oIGIvZHJpdmVycy9zdGFnaW5nL3ZtZS92bWVfYnJpZGdlLmgKaW5kZXggYjY1M2VjMC4uNGM2ZWMzMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3ZtZS92bWVfYnJpZGdlLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3ZtZS92bWVfYnJpZGdlLmgKQEAgLTIwLDcgKzIwLDcgQEAKIAl2bWVfY3ljbGVfdCBjeWNsZV9hdHRyOwogCXZtZV93aWR0aF90IHdpZHRoX2F0dHI7CiAJc3RydWN0IHJlc291cmNlIGJ1c19yZXNvdXJjZTsKLQl2b2lkICprZXJuX2Jhc2U7CisJdm9pZCBfX2lvbWVtICprZXJuX2Jhc2U7CiB9OwogCiBzdHJ1Y3Qgdm1lX3NsYXZlX3Jlc291cmNlIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvY2FyZC5jIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9jYXJkLmMKaW5kZXggMzJkMDk1Yy4uOTUxYTNhOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9jYXJkLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9jYXJkLmMKQEAgLTIwNTgsNyArMjA1OCw3IEBACiBRV09SRCBDQVJEcUdldFRTRk9mZnNldCAodW5zaWduZWQgY2hhciBieVJ4UmF0ZSwgUVdPUkQgcXdUU0YxLCBRV09SRCBxd1RTRjIpCiB7CiAgICAgUVdPUkQgICBxd1RTRk9mZnNldDsKLSAgICB1bnNpZ25lZCBzaG9ydCB3UnhCY25UU0ZPZmZzdD0gMDs7CisgICAgdW5zaWduZWQgc2hvcnQgd1J4QmNuVFNGT2Zmc3Q9IDA7CiAKICAgICBISURXT1JEKHF3VFNGT2Zmc2V0KSA9IDA7CiAgICAgTE9EV09SRChxd1RTRk9mZnNldCkgPSAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9pd2N0bC5jIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9pd2N0bC5jCmluZGV4IDkyZTMzOTkuLjVlNDI1ZDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvaXdjdGwuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L2l3Y3RsLmMKQEAgLTIwNzMsNyArMjA3Myw3IEBACiAgICAgICAgICAgICAgc3RydWN0IGl3X3BvaW50ICp3cnEsCiAgICAgICAgICAgICAgY2hhciAqZXh0cmEpCiB7Ci0JCXJldHVybiAtRU9QTk9UU1VQUDs7CisJCXJldHVybiAtRU9QTk9UU1VQUDsKIH0KIAogaW50IGl3Y3RsX3Npd21sbWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvd3BhMi5jIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS93cGEyLmMKaW5kZXggODA1MTY0Yi4uNzQ0Nzk5YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS93cGEyLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS93cGEyLmMKQEAgLTIxNiw3ICsyMTYsNyBAQAogICAgICAgICBtID0gKigodW5zaWduZWQgc2hvcnQgKikgJihwUlNOLT5hYnlSU05bNF0pKTsKIAogICAgICAgICBpZiAocFJTTi0+bGVuID49IDEwK20qNCkgeyAvLyB2ZXIoMikgKyBHSyg0KSArIFBLIGNvdW50KDIpICsgUEtTKDQqbSkgKyBBS01TUyBjb3VudCgyKQotICAgICAgICAgICAgcEJTU05vZGUtPndBS01TU0F1dGhDb3VudCA9ICooKHVuc2lnbmVkIHNob3J0ICopICYocFJTTi0+YWJ5UlNOWzYrNCptXSkpOzsKKyAgICAgICAgICAgIHBCU1NOb2RlLT53QUtNU1NBdXRoQ291bnQgPSAqKCh1bnNpZ25lZCBzaG9ydCAqKSAmKHBSU04tPmFieVJTTls2KzQqbV0pKTsKICAgICAgICAgICAgIGogPSAwOwogICAgICAgICAgICAgcGJ5T1VJID0gJihwUlNOLT5hYnlSU05bOCs0Km1dKTsKICAgICAgICAgICAgIGZvciAoaSA9IDA7IChpIDwgcEJTU05vZGUtPndBS01TU0F1dGhDb3VudCkgJiYgKGogPCBzaXplb2YocEJTU05vZGUtPmFieUFLTVNTQXV0aFR5cGUpL3NpemVvZih1bnNpZ25lZCBjaGFyKSk7IGkrKykgewpAQCAtMjM1LDcgKzIzNSw3IEBACiAgICAgICAgICAgICBwQlNTTm9kZS0+d0FLTVNTQXV0aENvdW50ID0gKHVuc2lnbmVkIHNob3J0KWo7CiAgICAgICAgICAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPIndBS01TU0F1dGhDb3VudDogJWRcbiIsIHBCU1NOb2RlLT53QUtNU1NBdXRoQ291bnQpOwogCi0gICAgICAgICAgICBuID0gKigodW5zaWduZWQgc2hvcnQgKikgJihwUlNOLT5hYnlSU05bNis0Km1dKSk7OworICAgICAgICAgICAgbiA9ICooKHVuc2lnbmVkIHNob3J0ICopICYocFJTTi0+YWJ5UlNOWzYrNCptXSkpOwogICAgICAgICAgICAgaWYgKHBSU04tPmxlbiA+PSAxMis0Km0rNCpuKSB7IC8vIHZlcigyKStHSyg0KStQS0NudCgyKStQS1MoNCptKStBS01TU0NudCgyKStBS01TUyg0Km4pK0NhcCgyKQogICAgICAgICAgICAgICAgIHBCU1NOb2RlLT5zUlNOQ2FwT2JqLmJSU05DYXBFeGlzdCA9IHRydWU7CiAgICAgICAgICAgICAgICAgcEJTU05vZGUtPnNSU05DYXBPYmoud1JTTkNhcCA9ICooKHVuc2lnbmVkIHNob3J0ICopICYocFJTTi0+YWJ5UlNOWzgrNCptKzQqbl0pKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvYmFzZWJhbmQuYyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvYmFzZWJhbmQuYwppbmRleCBlNWFkZDIwLi4wZDExMTQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L2Jhc2ViYW5kLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9iYXNlYmFuZC5jCkBAIC05NjMsNyArOTYzLDcgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIEFOVF9SWEI6CiAgICAgICAgICAgICBwRGV2aWNlLT5ieUJCUnhDb25mICY9IDB4RkU7Ci0gICAgICAgICAgICBwRGV2aWNlLT5ieUJCUnhDb25mIHw9IDB4MDI7OworICAgICAgICAgICAgcERldmljZS0+YnlCQlJ4Q29uZiB8PSAweDAyOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L2NhcmQuYyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvY2FyZC5jCmluZGV4IDhkZTIxYWEuLmE0OTA1M2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvY2FyZC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvY2FyZC5jCkBAIC0xMDkyLDcgKzEwOTIsNyBAQAogICAgICAgICBwRGV2aWNlLT5zTWdtdE9iai51Q3VyckNoYW5uZWwgPSBieU5ld0NoYW5uZWw7CiAgICAgICAgIGJSZXN1bHQgPSBDQVJEYlNldE1lZGlhQ2hhbm5lbChwRGV2aWNlLCBieU5ld0NoYW5uZWwpOwogCi0gICAgICAgIHJldHVybihiUmVzdWx0KTsKKwlyZXR1cm4gYlJlc3VsdDsKICAgICB9CiAgICAgcERldmljZS0+YnlDaGFubmVsU3dpdGNoQ291bnQgPSBieUNvdW50OwogICAgIHBEZXZpY2UtPmJ5TmV3Q2hhbm5lbCA9IGJ5TmV3Q2hhbm5lbDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvZHBjLmMgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L2RwYy5jCmluZGV4IDFmOWQyOTYzLi5mNGZiMGM2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L2RwYy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvZHBjLmMKQEAgLTE2MDgsOCArMTYwOCw4IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwRGV2aWNlLT5iSXNSeE1uZ1dvcmtJdGVtUXVldWVkID0gRkFMU0U7Ci0gICAgc3Bpbl91bmxvY2tfaXJxKCZwRGV2aWNlLT5sb2NrKTsKKwlwRGV2aWNlLT5iSXNSeE1uZ1dvcmtJdGVtUXVldWVkID0gRkFMU0U7CisJc3Bpbl91bmxvY2tfaXJxKCZwRGV2aWNlLT5sb2NrKTsKIAogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L2l3Y3RsLmMgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L2l3Y3RsLmMKaW5kZXggMDAwNGJlOC4uMjEyMTIwNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9pd2N0bC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvaXdjdGwuYwpAQCAtMTg4Myw3ICsxODgzLDcgQEAKICAgICAgICAgICAgICBzdHJ1Y3QgaXdfcG9pbnQgKndycSwKICAgICAgICAgICAgICBjaGFyICpleHRyYSkKIHsKLQkJcmV0dXJuIC1FT1BOT1RTVVBQOzsKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOwogfQogCiBpbnQgaXdjdGxfc2l3bWxtZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9wb3dlci5jIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9wb3dlci5jCmluZGV4IDBjMTJmZDMuLmU4YzFiMzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvcG93ZXIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L3Bvd2VyLmMKQEAgLTE5Miw3ICsxOTIsNyBAQAogICAgIC8vIGNoZWNrIGlmIGFscmVhZHkgaW4gRG96ZSBtb2RlCiAgICAgQ29udHJvbHZSZWFkQnl0ZShwRGV2aWNlLCBNRVNTQUdFX1JFUVVFU1RfTUFDUkVHLCBNQUNfUkVHX1BTQ1RMLCAmYnlEYXRhKTsKICAgICBpZiAoIChieURhdGEgJiBQU0NUTF9QUykgIT0gMCApCi0gICAgICAgIHJldHVybiBUUlVFOzsKKyAgICAgICAgcmV0dXJuIFRSVUU7CiAKICAgICBpZiAocE1nbXQtPmVDdXJyTW9kZSAhPSBXTUFDX01PREVfSUJTU19TVEEpIHsKICAgICAgICAgLy8gY2hlY2sgaWYgaW4gVElNIHdha2UgcGVyaW9kCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L3J4dHguYyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvcnh0eC5jCmluZGV4IGJiZGMxMjcuLjhmMTg1NzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvcnh0eC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvcnh0eC5jCkBAIC02OCw4ICs2OCw3IEBACiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgU3RhdGljIENsYXNzZXMgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgU3RhdGljIFZhcmlhYmxlcyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLy9zdGF0aWMgaW50ICAgICAgICAgIG1zZ2xldmVsICAgICAgICAgICAgICAgID1NU0dfTEVWRUxfREVCVUc7Ci1zdGF0aWMgaW50ICAgICAgICAgIG1zZ2xldmVsICAgICAgICAgICAgICAgID1NU0dfTEVWRUxfSU5GTzsKK3N0YXRpYyBpbnQgICAgICAgICAgbXNnbGV2ZWwgICAgICAgICAgICAgICAgPSBNU0dfTEVWRUxfSU5GTzsKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0gIFN0YXRpYyBGdW5jdGlvbnMgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni90a2lwLmMgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L3RraXAuYwppbmRleCBhNmJkNTMzLi4wNzE1NjM2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L3RraXAuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L3RraXAuYwpAQCAtMjE0LDEzICsyMTQsMTQgQEAKICAgICAvKiBQaGFzZSAxLCBzdGVwIDIgKi8KICAgICBmb3IgKGk9MDsgaTw4OyBpKyspIHsKICAgICAgICAgaiA9IDIqKGkgJiAxKTsKLSAgICAgICAgcDFrWzBdID0gKHAxa1swXSArIHRraXBfc2JveCggKHAxa1s0XSBeICgoMjU2KnBieVRLZXlbMStqXSkgKyBwYnlUS2V5W2pdKSkgJSA2NTUzNiApKSAlIDY1NTM2OwotICAgICAgICBwMWtbMV0gPSAocDFrWzFdICsgdGtpcF9zYm94KCAocDFrWzBdIF4gKCgyNTYqcGJ5VEtleVs1K2pdKSArIHBieVRLZXlbNCtqXSkpICUgNjU1MzYgKSkgJSA2NTUzNjsKLSAgICAgICAgcDFrWzJdID0gKHAxa1syXSArIHRraXBfc2JveCggKHAxa1sxXSBeICgoMjU2KnBieVRLZXlbOStqXSkgKyBwYnlUS2V5Wzgral0pKSAlIDY1NTM2ICkpICUgNjU1MzY7Ci0gICAgICAgIHAxa1szXSA9IChwMWtbM10gKyB0a2lwX3Nib3goIChwMWtbMl0gXiAoKDI1NipwYnlUS2V5WzEzK2pdKSArIHBieVRLZXlbMTIral0pKSAlIDY1NTM2ICkpICUgNjU1MzY7Ci0gICAgICAgIHAxa1s0XSA9IChwMWtbNF0gKyB0a2lwX3Nib3goIChwMWtbM10gXiAoKCgyNTYqcGJ5VEtleVsxK2pdKSArIHBieVRLZXlbal0pKSkgJSA2NTUzNiApKSAlIDY1NTM2OworICAgICAgICBwMWtbMF0gPSAocDFrWzBdICsgdGtpcF9zYm94KChwMWtbNF0gXiAoKDI1NipwYnlUS2V5WzEral0pICsgcGJ5VEtleVtqXSkpICUgNjU1MzYpKSAlIDY1NTM2OworICAgICAgICBwMWtbMV0gPSAocDFrWzFdICsgdGtpcF9zYm94KChwMWtbMF0gXiAoKDI1NipwYnlUS2V5WzUral0pICsgcGJ5VEtleVs0K2pdKSkgJSA2NTUzNikpICUgNjU1MzY7CisgICAgICAgIHAxa1syXSA9IChwMWtbMl0gKyB0a2lwX3Nib3goKHAxa1sxXSBeICgoMjU2KnBieVRLZXlbOStqXSkgKyBwYnlUS2V5Wzgral0pKSAlIDY1NTM2KSkgJSA2NTUzNjsKKyAgICAgICAgcDFrWzNdID0gKHAxa1szXSArIHRraXBfc2JveCgocDFrWzJdIF4gKCgyNTYqcGJ5VEtleVsxMytqXSkgKyBwYnlUS2V5WzEyK2pdKSkgJSA2NTUzNikpICUgNjU1MzY7CisgICAgICAgIHAxa1s0XSA9IChwMWtbNF0gKyB0a2lwX3Nib3goKHAxa1szXSBeICgoKDI1NipwYnlUS2V5WzEral0pICsgcGJ5VEtleVtqXSkpKSAlIDY1NTM2KSkgJSA2NTUzNjsKICAgICAgICAgcDFrWzRdID0gKHAxa1s0XSArIGkpICUgNjU1MzY7CiAgICAgfQorIAogICAgIC8qIFBoYXNlIDIsIFN0ZXAgMSAqLwogICAgIHBwazAgPSBwMWtbMF07CiAgICAgcHBrMSA9IHAxa1sxXTsKQEAgLTIzMCwxOSArMjMxLDE5IEBACiAgICAgcHBrNSA9IChwMWtbNF0gKyB0c2MyKSAlIDY1NTM2OwogCiAgICAgLyogUGhhc2UyLCBTdGVwIDIgKi8KLSAgICBwcGswID0gcHBrMCArIHRraXBfc2JveCggKHBwazUgXiAoKDI1NipwYnlUS2V5WzFdKSArIHBieVRLZXlbMF0pKSAlIDY1NTM2KTsKLSAgICBwcGsxID0gcHBrMSArIHRraXBfc2JveCggKHBwazAgXiAoKDI1NipwYnlUS2V5WzNdKSArIHBieVRLZXlbMl0pKSAlIDY1NTM2KTsKLSAgICBwcGsyID0gcHBrMiArIHRraXBfc2JveCggKHBwazEgXiAoKDI1NipwYnlUS2V5WzVdKSArIHBieVRLZXlbNF0pKSAlIDY1NTM2KTsKLSAgICBwcGszID0gcHBrMyArIHRraXBfc2JveCggKHBwazIgXiAoKDI1NipwYnlUS2V5WzddKSArIHBieVRLZXlbNl0pKSAlIDY1NTM2KTsKLSAgICBwcGs0ID0gcHBrNCArIHRraXBfc2JveCggKHBwazMgXiAoKDI1NipwYnlUS2V5WzldKSArIHBieVRLZXlbOF0pKSAlIDY1NTM2KTsKLSAgICBwcGs1ID0gcHBrNSArIHRraXBfc2JveCggKHBwazQgXiAoKDI1NipwYnlUS2V5WzExXSkgKyBwYnlUS2V5WzEwXSkpICUgNjU1MzYpOworCXBwazAgPSBwcGswICsgdGtpcF9zYm94KChwcGs1IF4gKCgyNTYqcGJ5VEtleVsxXSkgKyBwYnlUS2V5WzBdKSkgJSA2NTUzNik7CisJcHBrMSA9IHBwazEgKyB0a2lwX3Nib3goKHBwazAgXiAoKDI1NipwYnlUS2V5WzNdKSArIHBieVRLZXlbMl0pKSAlIDY1NTM2KTsKKwlwcGsyID0gcHBrMiArIHRraXBfc2JveCgocHBrMSBeICgoMjU2KnBieVRLZXlbNV0pICsgcGJ5VEtleVs0XSkpICUgNjU1MzYpOworCXBwazMgPSBwcGszICsgdGtpcF9zYm94KChwcGsyIF4gKCgyNTYqcGJ5VEtleVs3XSkgKyBwYnlUS2V5WzZdKSkgJSA2NTUzNik7CisJcHBrNCA9IHBwazQgKyB0a2lwX3Nib3goKHBwazMgXiAoKDI1NipwYnlUS2V5WzldKSArIHBieVRLZXlbOF0pKSAlIDY1NTM2KTsKKwlwcGs1ID0gcHBrNSArIHRraXBfc2JveCgocHBrNCBeICgoMjU2KnBieVRLZXlbMTFdKSArIHBieVRLZXlbMTBdKSkgJSA2NTUzNik7CiAKLSAgICBwcGswID0gcHBrMCArIHJvdHIxKHBwazUgXiAoKDI1NipwYnlUS2V5WzEzXSkgKyBwYnlUS2V5WzEyXSkpOwotICAgIHBwazEgPSBwcGsxICsgcm90cjEocHBrMCBeICgoMjU2KnBieVRLZXlbMTVdKSArIHBieVRLZXlbMTRdKSk7Ci0gICAgcHBrMiA9IHBwazIgKyByb3RyMShwcGsxKTsKLSAgICBwcGszID0gcHBrMyArIHJvdHIxKHBwazIpOwotICAgIHBwazQgPSBwcGs0ICsgcm90cjEocHBrMyk7Ci0gICAgcHBrNSA9IHBwazUgKyByb3RyMShwcGs0KTsKKwlwcGswID0gcHBrMCArIHJvdHIxKHBwazUgXiAoKDI1NipwYnlUS2V5WzEzXSkgKyBwYnlUS2V5WzEyXSkpOworCXBwazEgPSBwcGsxICsgcm90cjEocHBrMCBeICgoMjU2KnBieVRLZXlbMTVdKSArIHBieVRLZXlbMTRdKSk7CisJcHBrMiA9IHBwazIgKyByb3RyMShwcGsxKTsKKwlwcGszID0gcHBrMyArIHJvdHIxKHBwazIpOworCXBwazQgPSBwcGs0ICsgcm90cjEocHBrMyk7CisJcHBrNSA9IHBwazUgKyByb3RyMShwcGs0KTsKIAogICAgIC8qIFBoYXNlIDIsIFN0ZXAgMyAqLwogICAgIHBieVJDNEtleVswXSA9ICh0c2MyID4+IDgpICUgMjU2OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni93cGEyLmMgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L3dwYTIuYwppbmRleCA2ZDEzMTkwLi5kNGYzZjc1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L3dwYTIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L3dwYTIuYwpAQCAtMjE1LDcgKzIxNSw3IEBACiAgICAgICAgIG0gPSAqKChQV09SRCkgJihwUlNOLT5hYnlSU05bNF0pKTsKIAogICAgICAgICBpZiAocFJTTi0+bGVuID49IDEwK20qNCkgeyAvLyB2ZXIoMikgKyBHSyg0KSArIFBLIGNvdW50KDIpICsgUEtTKDQqbSkgKyBBS01TUyBjb3VudCgyKQotICAgICAgICAgICAgcEJTU05vZGUtPndBS01TU0F1dGhDb3VudCA9ICooKFBXT1JEKSAmKHBSU04tPmFieVJTTls2KzQqbV0pKTs7CisgICAgICAgICAgICBwQlNTTm9kZS0+d0FLTVNTQXV0aENvdW50ID0gKigoUFdPUkQpICYocFJTTi0+YWJ5UlNOWzYrNCptXSkpOwogICAgICAgICAgICAgaiA9IDA7CiAgICAgICAgICAgICBwYnlPVUkgPSAmKHBSU04tPmFieVJTTls4KzQqbV0pOwogICAgICAgICAgICAgZm9yIChpID0gMDsgKGkgPCBwQlNTTm9kZS0+d0FLTVNTQXV0aENvdW50KSAmJiAoaiA8IHNpemVvZihwQlNTTm9kZS0+YWJ5QUtNU1NBdXRoVHlwZSkvc2l6ZW9mKEJZVEUpKTsgaSsrKSB7CkBAIC0yMzQsNyArMjM0LDcgQEAKICAgICAgICAgICAgIHBCU1NOb2RlLT53QUtNU1NBdXRoQ291bnQgPSAoV09SRClqOwogICAgICAgICAgICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyJ3QUtNU1NBdXRoQ291bnQ6ICVkXG4iLCBwQlNTTm9kZS0+d0FLTVNTQXV0aENvdW50KTsKIAotICAgICAgICAgICAgbiA9ICooKFBXT1JEKSAmKHBSU04tPmFieVJTTls2KzQqbV0pKTs7CisgICAgICAgICAgICBuID0gKigoUFdPUkQpICYocFJTTi0+YWJ5UlNOWzYrNCptXSkpOwogICAgICAgICAgICAgaWYgKHBSU04tPmxlbiA+PSAxMis0Km0rNCpuKSB7IC8vIHZlcigyKStHSyg0KStQS0NudCgyKStQS1MoNCptKStBS01TU0NudCgyKStBS01TUyg0Km4pK0NhcCgyKQogICAgICAgICAgICAgICAgIHBCU1NOb2RlLT5zUlNOQ2FwT2JqLmJSU05DYXBFeGlzdCA9IFRSVUU7CiAgICAgICAgICAgICAgICAgcEJTU05vZGUtPnNSU05DYXBPYmoud1JTTkNhcCA9ICooKFBXT1JEKSAmKHBSU04tPmFieVJTTls4KzQqbSs0Km5dKSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2VzdGJyaWRnZS9hc3RvcmlhL2FyY2gvYXJtL21hY2gtb21hcDIvY3lhc2hhbG9tYXBfa2VybmVsLmMgYi9kcml2ZXJzL3N0YWdpbmcvd2VzdGJyaWRnZS9hc3RvcmlhL2FyY2gvYXJtL21hY2gtb21hcDIvY3lhc2hhbG9tYXBfa2VybmVsLmMKaW5kZXggYTY3ODAyOS4uYWQwYzYxZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dlc3RicmlkZ2UvYXN0b3JpYS9hcmNoL2FybS9tYWNoLW9tYXAyL2N5YXNoYWxvbWFwX2tlcm5lbC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93ZXN0YnJpZGdlL2FzdG9yaWEvYXJjaC9hcm0vbWFjaC1vbWFwMi9jeWFzaGFsb21hcF9rZXJuZWwuYwpAQCAtMjEyNywxMCArMjEyNyw3IEBACiAgKi8KIHZvaWQgKmN5X2FzX2hhbF9hbGxvYyh1aW50MzJfdCBjbnQpCiB7Ci0Jdm9pZCAqcmV0X3A7Ci0KLQlyZXRfcCA9IGttYWxsb2MoY250LCBHRlBfQVRPTUlDKTsKLQlyZXR1cm4gcmV0X3A7CisJcmV0dXJuIGttYWxsb2MoY250LCBHRlBfQVRPTUlDKTsKIH0KIAogLyoKQEAgLTIxNTAsMTAgKzIxNDcsNyBAQAogICovCiB2b2lkICpjeV9hc19oYWxfY19iX2FsbG9jKHVpbnQzMl90IGNudCkKIHsKLQl2b2lkICpyZXRfcDsKLQotCXJldF9wID0ga21hbGxvYyhjbnQsIEdGUF9BVE9NSUMpOwotCXJldHVybiByZXRfcDsKKwlyZXR1cm4ga21hbGxvYyhjbnQsIEdGUF9BVE9NSUMpOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9NYWtlZmlsZQppbmRleCA3OWZhMjI3Li4wODFkNDhkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9NYWtlZmlsZQpAQCAtMSw2ICsxLDUgQEAKIHczNXVuZC15IDo9CQkJXAogCW1kcy5vCQkJXAotCW1sbWV0eHJ4Lm8JCVwKIAltdG8ubwkJCVwKIAlwaHlfY2FsaWJyYXRpb24ubwlcCiAJcmVnLm8JCQlcCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9jb3JlLmggYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9jb3JlLmgKaW5kZXggMmI4N2EwMC4uZDdiM2FjYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvY29yZS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL2NvcmUuaApAQCAtNCw3ICs0LDcgQEAKICNpbmNsdWRlIDxsaW51eC93aXJlbGVzcy5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAKLSNpbmNsdWRlICJ3YmhhbF9zLmgiCisjaW5jbHVkZSAid2JoYWwuaCIKICNpbmNsdWRlICJtdG8uaCIKIAogI2luY2x1ZGUgIm1hY19zdHJ1Y3R1cmVzLmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9tYWNfc3RydWN0dXJlcy5oIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbWFjX3N0cnVjdHVyZXMuaAppbmRleCBlZDNkZjI5Li43NmM2M2M3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9tYWNfc3RydWN0dXJlcy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL21hY19zdHJ1Y3R1cmVzLmgKQEAgLTIxLDIzICsyMSwxMSBAQAogI2lmbmRlZiBfTUFDX1N0cnVjdHVyZXNfSF8KICNkZWZpbmUgX01BQ19TdHJ1Y3R1cmVzX0hfCiAKLSNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIFNvbWUgbWlzY2VsbGFuZW91cyBkZWZpbml0aW9ucwotLy8tLS0tLSovCi0jZGVmaW5lIE1BWF9DSEFOTkVMUyAgICAgICAgICAgICAgICAgICAgICAgIDMwCiAjZGVmaW5lIE1BQ19BRERSX0xFTkdUSCAgICAgICAgICAgICAgICAgICAgIDYKLSNkZWZpbmUgTUFYX1dFUF9LRVlfU0laRSAgICAgICAgICAgICAgICAgICAgMTYgIC8qIDEyOCBiaXRzICovCi0jZGVmaW5lCU1BWF84MDJfMTFfRlJBR01FTlRfTlVNQkVSCQkxMCAvKiBCeSBzcGVjICovCiAKIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAvLyA4MDIuMTEgRnJhbWUgZGVmaW5lCiAvLy0tLS0tICovCi0jZGVmaW5lIE1BU0tfUFJPVE9DT0xfVkVSU0lPTl9UWVBFCTB4MEYKLSNkZWZpbmUgTUFTS19GUkFHTUVOVF9OVU1CRVIJCTB4MDAwRgotI2RlZmluZSBTRVFVRU5DRV9OVU1CRVJfU0hJRlQJCTQKLSNkZWZpbmUgRElGRkVSXzExX1RPXzMJCQkJMTgKICNkZWZpbmUgRE9UXzExX01BQ19IRUFERVJfU0laRQkJMjQKICNkZWZpbmUgRE9UXzExX1NOQVBfU0laRQkJCTYKICNkZWZpbmUgRE9UXzExX0RVUkFUSU9OX09GRlNFVAkJMgpAQCAtNDcsMTUgKzM1LDkgQEAKICNkZWZpbmUgRE9UXzExX1RZUEVfT0ZGU0VUCQkJMzAKICNkZWZpbmUgRE9UXzExX0RBVEFfT0ZGU0VUICAgICAgICAgIDI0CiAjZGVmaW5lIERPVF8xMV9EQV9PRkZTRVQJCQk0Ci0jZGVmaW5lIERPVF8zX1RZUEVfQVJQCQkJCTB4ODBGMwotI2RlZmluZSBET1RfM19UWVBFX0lQWAkJCQkweDgxMzcKLSNkZWZpbmUgRE9UXzNfVFlQRV9PRkZTRVQJCQkxMgogCi0KLSNkZWZpbmUgRVRIRVJORVRfSEVBREVSX1NJWkUJCQkxNAogI2RlZmluZSBNQVhfRVRIRVJORVRfUEFDS0VUX1NJWkUJCTE1MTQKIAotCiAvKiAtLS0tLSAgbWFuYWdlbWVudCA6IFR5cGUgb2YgQml0cyAoMiwgMykgYW5kIFN1YnR5cGUgb2YgQml0cyAoNCwgNSwgNiwgNykgKi8KICNkZWZpbmUgTUFDX1NVQlRZUEVfTU5HTU5UX0FTU09DX1JFUVVFU1QgICAgMHgwMAogI2RlZmluZSBNQUNfU1VCVFlQRV9NTkdNTlRfQVNTT0NfUkVTUE9OU0UgICAweDEwCkBAIC02OSwxMjkgKzUxLDYgQEAKICNkZWZpbmUgTUFDX1NVQlRZUEVfTU5HTU5UX0FVVEhFTlRJQ0FUSU9OICAgMHhCMAogI2RlZmluZSBNQUNfU1VCVFlQRV9NTkdNTlRfREVBVVRIRU5USUNBVElPTiAweEMwCiAKLS8qIC0tLS0tICBjb250cm9sIDogVHlwZSBvZiBCaXRzICgyLCAzKSBhbmQgU3VidHlwZSBvZiBCaXRzICg0LCA1LCA2LCA3KSAqLwotI2RlZmluZSBNQUNfU1VCVFlQRV9DT05UUk9MX1BTUE9MTCAgICAgICAgICAweEE0Ci0jZGVmaW5lIE1BQ19TVUJUWVBFX0NPTlRST0xfUlRTICAgICAgICAgICAgIDB4QjQKLSNkZWZpbmUgTUFDX1NVQlRZUEVfQ09OVFJPTF9DVFMgICAgICAgICAgICAgMHhDNAotI2RlZmluZSBNQUNfU1VCVFlQRV9DT05UUk9MX0FDSyAgICAgICAgICAgICAweEQ0Ci0jZGVmaW5lIE1BQ19TVUJUWVBFX0NPTlRST0xfQ0ZFTkQgICAgICAgICAgIDB4RTQKLSNkZWZpbmUgTUFDX1NVQlRZUEVfQ09OVFJPTF9DRkVORF9DRkFDSyAgICAgMHhGNAotCi0vKiAtLS0tLSAgZGF0YSA6IFR5cGUgb2YgQml0cyAoMiwgMykgYW5kIFN1YnR5cGUgb2YgQml0cyAoNCwgNSwgNiwgNykgKi8KLSNkZWZpbmUgTUFDX1NVQlRZUEVfREFUQSAgICAgICAgICAgICAgICAgICAgMHgwOAotI2RlZmluZSBNQUNfU1VCVFlQRV9EQVRBX0NGQUNLICAgICAgICAgICAgICAweDE4Ci0jZGVmaW5lIE1BQ19TVUJUWVBFX0RBVEFfQ0ZQT0xMICAgICAgICAgICAgIDB4MjgKLSNkZWZpbmUgTUFDX1NVQlRZUEVfREFUQV9DRkFDS19DRlBPTEwgICAgICAgMHgzOAotI2RlZmluZSBNQUNfU1VCVFlQRV9EQVRBX05VTEwgICAgICAgICAgICAgICAweDQ4Ci0jZGVmaW5lIE1BQ19TVUJUWVBFX0RBVEFfQ0ZBQ0tfTlVMTCAgICAgICAgIDB4NTgKLSNkZWZpbmUgTUFDX1NVQlRZUEVfREFUQV9DRlBPTExfTlVMTCAgICAgICAgMHg2OAotI2RlZmluZSBNQUNfU1VCVFlQRV9EQVRBX0NGQUNLX0NGUE9MTF9OVUxMICAweDc4Ci0KLS8qIC0tLS0tICBGcmFtZSBUeXBlIG9mIEJpdHMgKDIsIDMpICovCi0jZGVmaW5lIE1BQ19UWVBFX01BTkFHRU1FTlQgICAgICAgICAgICAgICAgIDB4MDAKLSNkZWZpbmUgTUFDX1RZUEVfQ09OVFJPTCAgICAgICAgICAgICAgICAgICAgMHgwNAotI2RlZmluZSBNQUNfVFlQRV9EQVRBICAgICAgICAgICAgICAgICAgICAgICAweDA4Ci0KLS8qIC0tLS0tIGRlZmluaXRpb25zIGZvciBNYW5hZ2VtZW50IEZyYW1lIEVsZW1lbnQgSUQgKDEgQllURSkgKi8KLSNkZWZpbmUgRUxFTUVOVF9JRF9TU0lEICAgICAgICAgICAgICAgICAgICAgMAotI2RlZmluZSBFTEVNRU5UX0lEX1NVUFBPUlRFRF9SQVRFUyAgICAgICAgICAxCi0jZGVmaW5lIEVMRU1FTlRfSURfRkhfUEFSQU1FVEVSX1NFVCAgICAgICAgIDIKLSNkZWZpbmUgRUxFTUVOVF9JRF9EU19QQVJBTUVURVJfU0VUICAgICAgICAgMwotI2RlZmluZSBFTEVNRU5UX0lEX0NGX1BBUkFNRVRFUl9TRVQgICAgICAgICA0Ci0jZGVmaW5lIEVMRU1FTlRfSURfVElNICAgICAgICAgICAgICAgICAgICAgIDUKLSNkZWZpbmUgRUxFTUVOVF9JRF9JQlNTX1BBUkFNRVRFUl9TRVQgICAgICAgNgotLyogN34xNSByZXNlcnZlcmQgKi8KLSNkZWZpbmUgRUxFTUVOVF9JRF9DSEFMTEVOR0VfVEVYVCAgICAgICAgICAgMTYKLS8qIDE3fjMxIHJlc2VydmVkIGZvciBjaGFsbGVuZ2UgdGV4dCBleHRlbnNpb24gKi8KLS8qIDMyfjI1NSByZXNlcnZlZCAqLwotLyotLSAgMTFHICAtLSAqLwotI2RlZmluZSBFTEVNRU5UX0lEX0VSUF9JTkZPUk1BVElPTgkJCTQyCi0jZGVmaW5lIEVMRU1FTlRfSURfRVhURU5ERURfU1VQUE9SVEVEX1JBVEVTIDUwCi0KLS8qIC0tICBXUEEgIC0tICovCi0KLSNkZWZpbmUgRUxFTUVOVF9JRF9SU05fV1BBCQkJCQkyMjEKLSNpZmRlZiBfV1BBMl8KLSNkZWZpbmUgRUxFTUVOVF9JRF9SU05fV1BBMgkJCQkgICAgNDgKLSNlbmRpZiAvKiBlbmRpZiBXUEEyICovCi0KLSNkZWZpbmUgV0xBTl9NQVhfUEFJUldJU0VfQ0lQSEVSX1NVSVRFX0NPVU5UICAgICgodTE2KSA2KQotI2RlZmluZSBXTEFOX01BWF9BVVRIX0tFWV9NR1RfU1VJVEVfTElTVF9DT1VOVCAgKCh1MTYpIDIpCi0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSogIFJlYXNvbiBDb2RlIChUYWJsZSAxOCk6IGluZGljYXRlIHRoZSByZWFzb24gb2YgRGlzQXNzb2MsIERlQXV0aGVuCi0qICBsZW5ndGggb2YgUmVhc29uQ29kZSBpcyAyIE9jdHMuCi0qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLSNkZWZpbmUgUkVBU09OX1JFQVNFUkVEICAgICAgICAgICAgIDAKLSNkZWZpbmUgUkVBU09OX1VOU1BFQ0lESUVEICAgICAgICAgIDEKLSNkZWZpbmUgUkVBU09OX1BSRUFVVEhfSU5WQUxJRCAgICAgIDIKLSNkZWZpbmUgREVBVVRIX1JFQVNPTl9MRUZUX0JTUyAgICAgIDMKLSNkZWZpbmUgRElTQVNTX1JFQVNPTl9BUF9JTkFDVElWRSAgIDQKLSNkZWZpbmUgRElTQVNTX1JFQVNPTl9BUF9CVVNZICAgICAgIDUKLSNkZWZpbmUgUkVBU09OX0NMQVNTMl9GUkFNRV9GUk9NX05PTkFVVEhfU1RBICAgIDYKLSNkZWZpbmUgUkVBU09OX0NMQVNTM19GUkFNRV9GUk9NX05PTkFTU09fU1RBICAgIDcKLSNkZWZpbmUgRElTQVNTX1JFQVNPTl9MRUZUX0JTUyAgICAgIDgKLSNkZWZpbmUgUkVBU09OX05PVF9BVVRIX1lFVCAgICAgICAgIDkKLS8qIDgwMi4xMWkgZGVmaW5lICovCi0jZGVmaW5lIFJFQVNPTl9JTlZBTElEX0lFCQkJCQkJMTMKLSNkZWZpbmUgUkVBU09OX01JQ19FUlJPUgkJCQkJCTE0Ci0jZGVmaW5lIFJFQVNPTl80V0FZX0hBTkRTSEFLRV9USU1FT1VUCQkJMTUKLSNkZWZpbmUgUkVBU09OX0dST1VQS0VZX1VQREFURV9USU1FT1VUCQkJMTYKLSNkZWZpbmUgUkVBU09OX0lFX0RJRkZfNFdBWV9BU1NPQwkJCQkxNwotI2RlZmluZSBSRUFTT05fSU5WQUxJRF9NVUxUSUNBU1RfQ0lQSEVSCQkJMTgKLSNkZWZpbmUgUkVBU09OX0lOVkFMSURfVU5JQ0FTVF9DSVBIRVIJCQkxOQotI2RlZmluZSBSRUFTT05fSU5WQUxJRF9BS01QCQkJCQkJMjAKLSNkZWZpbmUgUkVBU09OX1VOU1VQUE9SVEVEX1JTTklFX1ZFUlNJT04JCTIxCi0jZGVmaW5lIFJFQVNPTl9JTlZBTElEX1JTTklFX0NBUEFCSUxJVFkJCQkyMgotI2RlZmluZSBSRUFTT05fODAyXzFYX0FVVEhfRkFJTAkJCQkJMjMKLSNkZWZpbmUJUkVBU09OX0NJUEhFUl9SRUpFQ1RfUEVSX1NFQ19QT0xJQ1kJCTE0Ci0KLS8qCi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyBlbnVtX01NUERVUmVzdWx0Q29kZSAtLQotLy8gICBTdGF0dXMgY29kZSAoMiBPY3RzKSBpbiB0aGUgTU1QRFUncyBmcmFtZSBib2R5LiBUYWJsZS4xOQotLy8KLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLWVudW0gZW51bV9NTVBEVVJlc3VsdENvZGUKLXsKLS8vICAgIFNVQ0NFU1MgICA9IDAsICAgICAgLy8gUmVkZWZpbmVkCi0gICAgVU5TUEVDSUZJRURfRkFJTFVSRSAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsCi0KLSAgICAvLyAyIC0gOSBSZXNlcnZlZAotCi0gICAgTk9UX1NVUFBST1RfQ0FQQUJJTElUSUVTICAgICAgICAgICAgICAgICAgICA9IDEwLAotCi0gICAgLy9SRUFTU09DSUFUSU9OX0RFTklFRAotICAgIC8vCi0gICAgUkVBU1NPQ19ERU5JRURfVU5BQkxFX0NGTV9BU1NPQ19FWElTVCAgICAgICA9IDExLAotCi0gICAgLy9BU1NPQ0lBVElPTl9ERU5JRURfTk9UX0lOX1NUQU5EQVJECi0gICAgLy8KLSAgICBBU1NPQ19ERU5JRURfUkVBU09OX05PVF9JTl9TVEFOREFSRCAgICAgICAgID0gMTIsCi0gICAgUEVFUl9OT1RfU1VQUE9SVF9BVVRIX0FMR09SSVRITSAgICAgICAgICAgICA9IDEzLAotICAgIEFVVEhfU0VRTlVNX09VVF9PRl9FWFBFQ1QgICAgICAgICAgICAgICAgICAgPSAxNCwKLSAgICBBVVRIX1JFSkVDVF9SRUFTT05fQ0hBTExFTkdFX0ZBSUwgICAgICAgICAgID0gMTUsCi0gICAgQVVUSF9SRUpFQ1RfUkVBU09OX1dBSVRfVElNRU9VVCAgICAgICAgICAgICA9IDE2LAotICAgIEFTU09DX0RFTklFRF9SRUFTT05fQVBfQlVTWSAgICAgICAgICAgICAgICAgPSAxNywKLSAgICBBU1NPQ19ERU5JRURfUkVBU09OX05PVF9TVVBQT1JUX0JBU0lDX1JBVEUgID0gMTgKLX0gV0JfTU1QRFVSRVNVTFRDT0RFLCAqUFdCX01NUERVUkVTVUxUQ09ERTsKLSovCi0KLSNkZWZpbmUJUkFURV9CSVRNQVBfMU0JCQkJMQotI2RlZmluZQlSQVRFX0JJVE1BUF8yTQkJCQkyCi0jZGVmaW5lCVJBVEVfQklUTUFQXzVkb3Q1TQkJCTUKLSNkZWZpbmUgUkFURV9CSVRNQVBfNk0JCQkJNgotI2RlZmluZSBSQVRFX0JJVE1BUF85TQkJCQk5Ci0jZGVmaW5lIFJBVEVfQklUTUFQXzExTQkJCQkxMQotI2RlZmluZSBSQVRFX0JJVE1BUF8xMk0JCQkJMTIKLSNkZWZpbmUgUkFURV9CSVRNQVBfMThNCQkJCTE4Ci0jZGVmaW5lIFJBVEVfQklUTUFQXzIyTQkJCQkyMgotI2RlZmluZSBSQVRFX0JJVE1BUF8yNE0JCQkJMjQKLSNkZWZpbmUgUkFURV9CSVRNQVBfMzNNCQkJCTE3Ci0jZGVmaW5lIFJBVEVfQklUTUFQXzM2TQkJCQkxOQotI2RlZmluZSBSQVRFX0JJVE1BUF80OE0JCQkJMjUKLSNkZWZpbmUgUkFURV9CSVRNQVBfNTRNCQkJCTI4Ci0KICNkZWZpbmUgUkFURV9BVVRPCQkJCQkwCiAjZGVmaW5lIFJBVEVfMU0JCQkJCQkyCiAjZGVmaW5lIFJBVEVfMk0JCQkJCQk0CkBAIC0yMDksNDA4ICs2OCw0IEBACiAjZGVmaW5lIFJBVEVfNTRNCQkJCQkxMDgKICNkZWZpbmUgUkFURV9NQVgJCQkJCTI1NQogCi0vKiBDQVBBQklMSVRZICovCi0jZGVmaW5lIENBUEFCSUxJVFlfRVNTX0JJVAkJCQkweDAwMDEKLSNkZWZpbmUgQ0FQQUJJTElUWV9JQlNTX0JJVAkJCQkweDAwMDIKLSNkZWZpbmUgQ0FQQUJJTElUWV9DRl9QT0xMX0JJVAkJCTB4MDAwNAotI2RlZmluZSBDQVBBQklMSVRZX0NGX1BPTExfUkVRX0JJVAkJMHgwMDA4Ci0jZGVmaW5lIENBUEFCSUxJVFlfUFJJVkFDWV9CSVQJCQkweDAwMTAKLSNkZWZpbmUgQ0FQQUJJTElUWV9TSE9SVF9QUkVBTUJMRV9CSVQJMHgwMDIwCi0jZGVmaW5lIENBUEFCSUxJVFlfUEJDQ19CSVQJCQkJMHgwMDQwCi0jZGVmaW5lIENBUEFCSUxJVFlfQ0hBTl9BR0lMSVRZX0JJVAkJMHgwMDgwCi0jZGVmaW5lIENBUEFCSUxJVFlfU0hPUlRfU0xPVF9USU1FX0JJVAkweDA0MDAKLSNkZWZpbmUgQ0FQQUJJTElUWV9EU1NTX09GRE1fQklUCQkweDIwMDAKLQotCi1zdHJ1Y3QgQ2FwYWJpbGl0eV9JbmZvcm1hdGlvbl9FbGVtZW50IHsKLSAgdW5pb24gewotCXUxNiBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgd1ZhbHVlOwotICAgICNpZmRlZiBfQklHX0VORElBTl8gIC8qIDIwMDYwOTI2IGFkZCBieSBhbnNvbidzIGVuZGlhbiAqLwotICAgIHN0cnVjdCBfQ2FwYWJpbGl0eSB7Ci0JLyogLS0gIDExRyAgLS0gKi8KLQl1OAlSZXNlcnZlZDM6MjsKLQl1OAlEU1NTX09GRE06MTsKLQl1OAlSZXNlcnZlZDI6MjsKLQl1OAlTaG9ydF9TbG90X1RpbWU6MTsKLQl1OCAgICBSZXNlcnZlZDE6MjsKLQl1OCAgICBDaGFubmVsX0FnaWxpdHk6MTsKLQl1OCAgICBQQkNDOjE7Ci0JdTggICAgU2hvcnRQcmVhbWJsZToxOwotCXU4ICAgIENGX1ByaXZhY3k6MTsKLQl1OCAgICBDRl9Qb2xsX1JlcXVlc3Q6MTsKLQl1OCAgICBDRl9Qb2xsYWJsZToxOwotCXU4ICAgIElCU1M6MTsKLQl1OCAgICBFU1M6MTsKLSAgICB9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBDYXBhYmlsaXR5OwotICAgICNlbHNlCi0gICAgc3RydWN0IF9DYXBhYmlsaXR5IHsKLQl1OCAgICBFU1M6MTsKLQl1OCAgICBJQlNTOjE7Ci0JdTggICAgQ0ZfUG9sbGFibGU6MTsKLQl1OCAgICBDRl9Qb2xsX1JlcXVlc3Q6MTsKLQl1OCAgICBDRl9Qcml2YWN5OjE7Ci0JdTggICAgU2hvcnRQcmVhbWJsZToxOwotCXU4ICAgIFBCQ0M6MTsKLQl1OCAgICBDaGFubmVsX0FnaWxpdHk6MTsKLQl1OCAgICBSZXNlcnZlZDE6MjsKLQkJLyogLS0gIDExRyAgLS0gKi8KLQkJdTgJU2hvcnRfU2xvdF9UaW1lOjE7Ci0JCXU4CVJlc2VydmVkMjoyOwotCQl1OAlEU1NTX09GRE06MTsKLQkJdTgJUmVzZXJ2ZWQzOjI7Ci0gICAgfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgQ2FwYWJpbGl0eTsKLSAgICAjZW5kaWYKLSAgfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci0KLXN0cnVjdCBGSF9QYXJhbWV0ZXJfU2V0X0VsZW1lbnQgewotICAgIHU4ICAgIEVsZW1lbnRfSUQ7Ci0gICAgdTggICAgTGVuZ3RoOwotICAgIHU4ICAgIER3ZWxsX1RpbWVbMl07Ci0gICAgdTggICAgSG9wX1NldDsKLSAgICB1OCAgICBIb3BfUGF0dGVybjsKLSAgICB1OCAgICBIb3BfSW5kZXg7Ci19OwotCi1zdHJ1Y3QgRFNfUGFyYW1ldGVyX1NldF9FbGVtZW50IHsKLSAgICB1OCAgICBFbGVtZW50X0lEOwotICAgIHU4ICAgIExlbmd0aDsKLSAgICB1OCAgICBDdXJyZW50X0NoYW5uZWw7Ci19OwotCi1zdHJ1Y3QgU3VwcG9ydGVkX1JhdGVzX0VsZW1lbnQgewotICAgIHU4ICAgIEVsZW1lbnRfSUQ7Ci0gICAgdTggICAgTGVuZ3RoOwotICAgIHU4ICAgIFN1cHBvcnRlZFJhdGVzWzhdOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci0KLXN0cnVjdCBTU0lEX0VsZW1lbnQgewotICAgIHU4ICAgIEVsZW1lbnRfSUQ7Ci0gICAgdTggICAgTGVuZ3RoOwotICAgIHU4ICAgIFNTSURbMzJdOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgOwotCi1zdHJ1Y3QgQ0ZfUGFyYW1ldGVyX1NldF9FbGVtZW50IHsKLSAgICB1OCAgICBFbGVtZW50X0lEOwotICAgIHU4ICAgIExlbmd0aDsKLSAgICB1OCAgICBDRlBfQ291bnQ7Ci0gICAgdTggICAgQ0ZQX1BlcmlvZDsKLSAgICB1OCAgICBDRlBfTWF4RHVyYXRpb25bMl07ICAgICAvKiBpbiBUaW1lIFVuaXRzICovCi0gICAgdTggICAgQ0ZQX0R1clJlbWFpbmluZ1syXTsgICAgLyogaW4gdGltZSB1bml0cyAqLwotfTsKLQotc3RydWN0IFRJTV9FbGVtZW50IHsKLSAgICB1OCAgICBFbGVtZW50X0lEOwotICAgIHU4ICAgIExlbmd0aDsKLSAgICB1OCAgICBEVElNX0NvdW50OwotICAgIHU4ICAgIERUSU1fUGVyaW9kOwotICAgIHU4ICAgIEJpdG1hcF9Db250cm9sOwotICAgIHU4ICAgIFBhcnRpYWxfVmlydHVhbF9CaXRtYXBbMjUxXTsKLX07Ci0KLXN0cnVjdCBJQlNTX1BhcmFtZXRlcl9TZXRfRWxlbWVudCB7Ci0gICAgdTggICAgRWxlbWVudF9JRDsKLSAgICB1OCAgICBMZW5ndGg7Ci0gICAgdTggICAgQVRJTV9XaW5kb3dbMl07Ci19OwotCi1zdHJ1Y3QgQ2hhbGxlbmdlX1RleHRfRWxlbWVudCB7Ci0gICAgdTggICAgRWxlbWVudF9JRDsKLSAgICB1OCAgICBMZW5ndGg7Ci0gICAgdTggICAgQ2hhbGxlbmdlX1RleHRbMjUzXTsKLX07Ci0KLXN0cnVjdCBQSFlfUGFyYW1ldGVyX1NldF9FbGVtZW50IHsKLS8qICBpbnQgICAgIGFTbG90VGltZTsgKi8KLS8qICBpbnQgICAgIGFTaWZzVGltZTsgKi8KLSAgICBzMzIgICAgIGFDQ0FUaW1lOwotICAgIHMzMiAgICAgYVJ4VHhUdXJuYXJvdW5kVGltZTsKLSAgICBzMzIgICAgIGFUeFBMQ1BEZWxheTsKLSAgICBzMzIgICAgIFJ4UExDUERlbGF5OwotICAgIHMzMiAgICAgYVJ4VHhTd2l0Y2hUaW1lOwotICAgIHMzMiAgICAgYVR4UmFtcE9udGltZTsKLSAgICBzMzIgICAgIGFUeFJhbXBPZmZUaW1lOwotICAgIHMzMiAgICAgYVR4UkZEZWxheTsKLSAgICBzMzIgICAgIGFSeFJGRGVsYXk7Ci0gICAgczMyICAgICBhQWlyUHJvcGFnYXRpb25UaW1lOwotICAgIHMzMiAgICAgYU1BQ1Byb2Nlc3NpbmdEZWxheTsKLSAgICBzMzIgICAgIGFQcmVhbWJsZUxlbmd0aDsKLSAgICBzMzIgICAgIGFQTENQSGVhZGVyTGVuZ3RoOwotICAgIHMzMiAgICAgYU1QRFVEdXJhdGlvbkZhY3RvcjsKLSAgICBzMzIgICAgIGFNUERVTWF4TGVuZ3RoOwotLyogIGludCAgICAgYUNXbWluOyAqLwotLyogIGludCAgICAgYUNXbWF4OyAqLwotfTsKLQotLyogLS0gIDExRyAgLS0gKi8KLXN0cnVjdCBFUlBfSW5mb3JtYXRpb25fRWxlbWVudCB7Ci0gICAgdTgJRWxlbWVudF9JRDsKLSAgICB1OAlMZW5ndGg7Ci0gICAgI2lmZGVmIF9CSUdfRU5ESUFOXyAvKiAyMDA2MDkyNiBhZGQgYnkgYW5zb24ncyBlbmRpYW4gKi8KLQl1OAlSZXNlcnZlZDo1OyAgIC8qIDIwMDYwOTI2IGFkZCBieSBhbnNvbiAqLwotCXU4CUJhcmtlcl9QcmVhbWJsZV9Nb2RlOjE7Ci0JdTgJVXNlX1Byb3RlY3Rpb246MTsKLSAgICAgICB1OAlOb25FUlBfUHJlc2VudDoxOwotICAgICNlbHNlCi0JdTgJTm9uRVJQX1ByZXNlbnQ6MTsKLQl1OAlVc2VfUHJvdGVjdGlvbjoxOwotCXU4CUJhcmtlcl9QcmVhbWJsZV9Nb2RlOjE7Ci0JdTgJUmVzZXJ2ZWQ6NTsKLSAgICAjZW5kaWYKLX07Ci0KLXN0cnVjdCBFeHRlbmRlZF9TdXBwb3J0ZWRfUmF0ZXNfRWxlbWVudCB7Ci0gICAgdTgJRWxlbWVudF9JRDsKLSAgICB1OAlMZW5ndGg7Ci0gICAgdTgJRXh0ZW5kZWRTdXBwb3J0ZWRSYXRlc1syNTVdOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci0KLS8qIFdQQSg4MDIuMTFpIGRyYWZ0IDMuMCkgKi8KLSNkZWZpbmUgVkVSU0lPTl9XUEEJCQkJMQotI2lmZGVmIF9XUEEyXwotI2RlZmluZSBWRVJTSU9OX1dQQTIgICAgICAgICAgICAxCi0jZW5kaWYgLyogZW5kIGRlZiAgX1dQQTJfICovCi0vKiBXUEEyLjAgT1VJPTAwOjUwOkYyLCB0aGUgTVNCIGlzIHJlc2VydmVkIGZvciBzdWl0ZSB0eXBlICovCi0jZGVmaW5lIE9VSV9XUEEJCQkJCTB4MDBGMjUwMDAKLSNpZmRlZiBfV1BBMl8KLS8qIGZvciB3cGEyIGNoYW5nZSB0byAweDAwQUNPRjA0IGJ5IFdzIDI2LzA0LzA0ICovCi0jZGVmaW5lIE9VSV9XUEEyCQkJCTB4MDBBQzBGMDAKLSNlbmRpZiAvKiBlbmQgZGVmIF9XUEEyXyAqLwotCi0jZGVmaW5lIE9VSV9XUEFfQURESVRJT05BTAkJMHgwMQotI2RlZmluZSBXTEFOX01JTl9SU05fV1BBX0xFTkdUSCAgICAgICAgICAgICAgICAgNiAvKiBhZGRlZCBieSB3cyAwOS8xMC8wNCAqLwotI2lmZGVmIF9XUEEyXwotI2RlZmluZSBXTEFOX01JTl9SU05fV1BBMl9MRU5HVEggICAgICAgICAgICAgICAgMiAvKiBGaXggdG8gMiAwOS8xNC8wNSAqLwotI2VuZGlmIC8qIGVuZCBkZWYgX1dQQTJfICovCi0KLSNkZWZpbmUgb3VpX3dwYSAgICAgICAgICAgICAgICAgICh1MzIpKE9VSV9XUEF8T1VJX1dQQV9BRERJVElPTkFMKQotCi0jZGVmaW5lIFdQQV9PVUlfQklHICAgICgodTMyKSAweDAxRjI1MDAwKS8qIGFkZGVkIGJ5IHdzIDA5LzIzLzA0ICovCi0jZGVmaW5lIFdQQV9PVUlfTElUVExFICAoKHUzMikgMHgwMUYyNTAwMSkvKiBhZGRlZCBieSB3cyAwOS8yMy8wNCAqLwotLyogMjAwNjExMDggRm9yIFdQUy4gSXQncyBsaXR0bGUgZW5kaWFuLiBCaWcgZW5kaWFuIGlzIDB4MDA1MEYyMDQgKi8KLSNkZWZpbmUgV1BBX1dQU19PVUkJCQkJY3B1X3RvX2xlMzIoMHgwNEYyNTAwMCkKLQotLyogLS0tLS1XUEEyLS0tLS0gKi8KLSNpZmRlZiBfV1BBMl8KLSNkZWZpbmUgV1BBMl9PVUlfQklHICAgICgodTMyKTB4MDFBQzBGMDApCi0jZGVmaW5lIFdQQTJfT1VJX0xJVFRMRSAoKHUzMikweDAxQUMwRjAxKQotI2VuZGlmIC8qIGVuZCBkZWYgX1dQQTJfICovCi0KLS8qIEF1dGhlbnRpY2F0aW9uIHN1aXRlICovCi0jZGVmaW5lIE9VSV9BVVRIX1dQQV9OT05FICAgICAgICAgICAweDAwIC8qIGZvciBXUEFfTk9ORSAqLwotI2RlZmluZSBPVUlfQVVUSF84MDIxWAkJCQkweDAxCi0jZGVmaW5lIE9VSV9BVVRIX1BTSwkJCQkweDAyCi0vKiBDaXBoZXIgc3VpdGUgKi8KLSNkZWZpbmUgT1VJX0NJUEhFUl9HUk9VUF9LRVkgICAgICAgIDB4MDAgIC8qIGFkZGVkIGJ5IHdzIDA1LzIxLzA0ICovCi0jZGVmaW5lIE9VSV9DSVBIRVJfV0VQXzQwCQkJMHgwMQotI2RlZmluZSBPVUlfQ0lQSEVSX1RLSVAJCQkJMHgwMgotI2RlZmluZSBPVUlfQ0lQSEVSX0NDTVAJCQkJMHgwNAotI2RlZmluZSBPVUlfQ0lQSEVSX1dFUF8xMDQJCQkweDA1Ci0KLXN0cnVjdCBzdWl0ZV9zZWxlY3RvcnsKLQl1bmlvbnsKLQkJdTgJVmFsdWVbNF07Ci0JCXN0cnVjdCBfU1VJVF8gewotCQkJdTgJT1VJWzNdOwotCQkJdTgJVHlwZTsKLQkJfSBTdWl0U2VsZWN0b3I7Ci0JfTsKLX07Ci0KLS8qIC0tICBXUEEgIC0tICovCi1zdHJ1Y3QJUlNOX0luZm9ybWF0aW9uX0VsZW1lbnR7Ci0JdTgJCQkJCUVsZW1lbnRfSUQ7Ci0JdTgJCQkJCUxlbmd0aDsKLSAvKiBXUEEgdmVyc2lvbiAyLjAgYWRkaXRpb25hbCBmaWVsZCwgYW5kIHNob3VsZCBiZSAwMDo1MDpGMjowMSAqLwotCXN0cnVjdCBzdWl0ZV9zZWxlY3RvcglPdWlXUEFBZGRpdGlvbmFsOwotCXUxNgkJCQkJVmVyc2lvbjsKLQlzdHJ1Y3Qgc3VpdGVfc2VsZWN0b3IJCUdyb3VwS2V5U3VpdGU7Ci0JdTE2CQkJCQlQYWlyd2lzZUtleVN1aXRlQ291bnQ7Ci0Jc3RydWN0IHN1aXRlX3NlbGVjdG9yCQlQYWlyd2lzZUtleVN1aXRlWzFdOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci1zdHJ1Y3QgUlNOX0F1dGhfU3ViX0luZm9ybWF0aW9uX0VsZW1lbnQgewotCXUxNgkJCQlBdXRoS2V5TW5ndFN1aXRlQ291bnQ7Ci0Jc3RydWN0IHN1aXRlX3NlbGVjdG9yCUF1dGhLZXlNbmd0U3VpdGVbMV07Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLQotLyogLS0gIFdQQTIgIC0tICovCi1zdHJ1Y3QgUlNOX0NhcGFiaWxpdHlfRWxlbWVudCB7Ci0gIHVuaW9uIHsKLQl1MTYJX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpCXdWYWx1ZTsKLSAgICAjaWZkZWYgX0JJR19FTkRJQU5fCSAvKiAyMDA2MDkyNyBhZGQgYnkgYW5zb24ncyBlbmRpYW4gKi8KLSAgICBzdHJ1Y3QgX1JTTl9DYXBhYmlsaXR5IHsKLQl1MTYgICBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgIFJlc2VydmVkMjo4OyAvKiAyMDA1MTIwMSAqLwotCXUxNiAgIF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSAgUmVzZXJ2ZWQxOjI7Ci0JdTE2ICAgX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpICBHVEtfUmVwbGF5X0NvdW50ZXI6MjsKLQl1MTYgICBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgIFBUS19SZXBsYXlfQ291bnRlcjoyOwotCXUxNiAgIF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSAgTm9fUGFpcndpc2U6MTsKLQl1MTYgICBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgIFByZV9BdXRoOjE7Ci0gICAgfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgIFJTTl9DYXBhYmlsaXR5OwotICAgICNlbHNlCi0gICAgc3RydWN0IF9SU05fQ2FwYWJpbGl0eSB7Ci0JdTE2ICAgX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpICBQcmVfQXV0aDoxOwotCXUxNiAgIF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSAgTm9fUGFpcndpc2U6MTsKLQl1MTYgICBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgIFBUS19SZXBsYXlfQ291bnRlcjoyOwotCXUxNiAgIF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSAgR1RLX1JlcGxheV9Db3VudGVyOjI7Ci0JdTE2ICAgX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpICBSZXNlcnZlZDE6MjsKLQl1MTYgICBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgIFJlc2VydmVkMjo4OyAvKiAyMDA1MTIwMSAqLwotICAgIH0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpICBSU05fQ2FwYWJpbGl0eTsKLSAgICAjZW5kaWYKLQotICB9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSA7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSA7Ci0KLSNpZmRlZiBfV1BBMl8KLXN0cnVjdCBwbWtpZCB7Ci0gIHU4IHBWYWx1ZVsxNl07Ci19OwotCi1zdHJ1Y3QJV1BBMl9SU05fSW5mb3JtYXRpb25fRWxlbWVudCB7Ci0JdTgJCQkJCUVsZW1lbnRfSUQ7Ci0JdTgJCQkJCUxlbmd0aDsKLQl1MTYJCQkJCVZlcnNpb247Ci0Jc3RydWN0IHN1aXRlX3NlbGVjdG9yCQlHcm91cEtleVN1aXRlOwotCXUxNgkJCQkJUGFpcndpc2VLZXlTdWl0ZUNvdW50OwotCXN0cnVjdCBzdWl0ZV9zZWxlY3RvcgkJUGFpcndpc2VLZXlTdWl0ZVsxXTsKLQotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci0KLXN0cnVjdCBXUEEyX1JTTl9BdXRoX1N1Yl9JbmZvcm1hdGlvbl9FbGVtZW50IHsKLQl1MTYJCQkJQXV0aEtleU1uZ3RTdWl0ZUNvdW50OwotCXN0cnVjdCBzdWl0ZV9zZWxlY3RvcglBdXRoS2V5TW5ndFN1aXRlWzFdOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci0KLQotc3RydWN0IFBNS0lEX0luZm9ybWF0aW9uX0VsZW1lbnQgewotCXUxNgkJCQlQTUtJRF9Db3VudDsKLQlzdHJ1Y3QgcG1raWQgcG1raWRbMTZdOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci0KLSNlbmRpZiAvKiBlbmRkZWYgX1dQQTJfICovCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gTUFDIEZyYW1lIHN0cnVjdHVyZSAoZGlmZmVyZW50IHR5cGUpIGFuZCBzdWJmaWVsZCBzdHJ1Y3R1cmUKLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLXN0cnVjdCBNQUNfZnJhbWVfY29udHJvbCB7Ci0vKiBhIGNvbWJpbmF0aW9uIG9mIHRoZSBbUHJvdG9jb2wgVmVyc2lvbiwgQ29udHJvbCBUeXBlLCBDb250cm9sIFN1YnR5cGVdKi8KLSAgICB1OCAgICBtYWNfZnJhbWVfaW5mbzsKLS8qIDIwMDYwOTI3IGFkZCBieSBhbnNvbidzIGVuZGlhbiAqLwotICAgICNpZmRlZiBfQklHX0VORElBTl8KLSAgICB1OCAgICBvcmRlcjoxOwotICAgIHU4ICAgIFdFUDoxOwotICAgIHU4ICAgIG1vcmVfZGF0YToxOwotICAgIHU4ICAgIHB3cl9tZ3Q6MTsKLSAgICB1OCAgICByZXRyeToxOwotICAgIHU4ICAgIG1vcmVfZnJhZzoxOwotICAgIHU4ICAgIGZyb21fZHM6MTsKLSAgICB1OCAgICB0b19kczoxOwotICAgICNlbHNlCi0gICAgdTggICAgdG9fZHM6MTsKLSAgICB1OCAgICBmcm9tX2RzOjE7Ci0gICAgdTggICAgbW9yZV9mcmFnOjE7Ci0gICAgdTggICAgcmV0cnk6MTsKLSAgICB1OCAgICBwd3JfbWd0OjE7Ci0gICAgdTggICAgbW9yZV9kYXRhOjE7Ci0gICAgdTggICAgV0VQOjE7Ci0gICAgdTggICAgb3JkZXI6MTsKLSAgICAjZW5kaWYKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwotCi1zdHJ1Y3QgTWFuYWdlbWVudF9GcmFtZSB7Ci0vKiAyQiwgVG9EUyxGcm9tRFMsTW9yZUZyYWcsTW9yZURhdGEsT3JkZXI9MCAqLwotICAgIHN0cnVjdCBNQUNfZnJhbWVfY29udHJvbCBmcmFtZV9jb250cm9sOwotICAgIHUxNgkJZHVyYXRpb247Ci0gICAgdTgJCURBW01BQ19BRERSX0xFTkdUSF07CQkJLyogQWRkcjEgKi8KLSAgICB1OAkJU0FbTUFDX0FERFJfTEVOR1RIXTsJCQkvKiBBZGRyMiAqLwotICAgIHU4CQlCU1NJRFtNQUNfQUREUl9MRU5HVEhdOwkJCS8qIEFkZHIzICovCi0gICAgdTE2CQlTZXF1ZW5jZV9Db250cm9sOwotICAgIC8qIE1hbmFnZW1lbnQgRnJhbWUgQm9keSA8PSAzMjUgYnl0ZXMgKi8KLSAgICAvKiBGQ1MgNCBieXRlcyAqLwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci0KLS8qIFNXLU1BQyBkb24ndCBUeC9SeCBDb250cm9sLUZyYW1lLCBIVy1NQUMgZG8gaXQuICovCi1zdHJ1Y3QgQ29udHJvbF9GcmFtZSB7Ci0vKiBUb0RTLEZyb21EUyxNb3JlRnJhZyxSZXRyeSxNb3JlRGF0YSxXRVAsT3JkZXI9MCAqLwotICAgIHN0cnVjdCBNQUNfZnJhbWVfY29udHJvbCBmcmFtZV9jb250cm9sOwotICAgIHUxNgkJZHVyYXRpb247Ci0gICAgdTgJCVJBW01BQ19BRERSX0xFTkdUSF07Ci0gICAgdTgJCVRBW01BQ19BRERSX0xFTkdUSF07Ci0gICAgdTE2CQlGQ1M7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLQotc3RydWN0IERhdGFfRnJhbWUgewotICAgIHN0cnVjdCBNQUNfZnJhbWVfY29udHJvbCBmcmFtZV9jb250cm9sOwotICAgIHUxNgkJZHVyYXRpb247Ci0gICAgdTgJCUFkZHIxW01BQ19BRERSX0xFTkdUSF07Ci0gICAgdTgJCUFkZHIyW01BQ19BRERSX0xFTkdUSF07Ci0gICAgdTgJCUFkZHIzW01BQ19BRERSX0xFTkdUSF07Ci0gICAgdTE2CQlTZXF1ZW5jZV9Db250cm9sOwotICAgIHU4CQlBZGRyNFtNQUNfQUREUl9MRU5HVEhdOyAvKiBvbmx5IGV4aXN0IHdoZW4gVG9EUz1Gcm9tRFM9MSAqLwotICAgIC8qIERhdGEgRnJhbWUgQm9keSA8PSAyMzEyICovCi0gICAgLyogRkNTICovCi19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLQotc3RydWN0IERpc2Fzc29jaWF0aW9uX0ZyYW1lX0JvZHkgewotICAgIHUxNiAgICByZWFzb25Db2RlOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci0KLXN0cnVjdCBBc3NvY2lhdGlvbl9SZXF1ZXN0X0ZyYW1lX0JvZHkgewotICAgIHUxNiAgICBjYXBhYmlsaXR5X2luZm9ybWF0aW9uOwotICAgIHUxNiAgICBsaXN0ZW5JbnRlcnZhbDsKLSAgICB1OCAgICAgQ3VycmVudF9BUF9BZGRyZXNzW01BQ19BRERSX0xFTkdUSF07LyogZm9yIHJlYXNzb2NpYXRpb24gb25seSAqLwotICAgIC8qICBTU0lEICgyKzMyIGJ5dGVzKSAqLwotICAgIC8qICBTdXBwb3J0ZWRfUmF0ZXMgKDIrOCBieXRlcykgKi8KLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwotCi1zdHJ1Y3QgQXNzb2NpYXRpb25fUmVzcG9uc2VfRnJhbWVfQm9keSB7Ci0gICAgdTE2ICAgIGNhcGFiaWxpdHlfaW5mb3JtYXRpb247Ci0gICAgdTE2ICAgIHN0YXR1c0NvZGU7Ci0gICAgdTE2ICAgIEFzc29jaWF0aW9uX0lEOwotICAgIHN0cnVjdCBTdXBwb3J0ZWRfUmF0ZXNfRWxlbWVudCBzdXBwb3J0ZWRSYXRlczsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwotCi0vKnN0cnVjdCBSZWFzc29jaWF0aW9uX1JlcXVlc3RfRnJhbWVfQm9keQotewotICAgIHUxNiAgICBjYXBhYmlsaXR5X2luZm9ybWF0aW9uOwotICAgIHUxNiAgICBsaXN0ZW5JbnRlcnZhbDsKLSAgICB1OCAgICAgQ3VycmVudF9BUF9BZGRyZXNzW01BQ19BRERSX0xFTkdUSF07Ci0gICAgLy8gU1NJRCAoMiszMiBieXRlcykKLSAgICAvLyBTdXBwb3J0ZWRfUmF0ZXMgKDIrOCBieXRlcykKLX07Ki8KLS8qIGVsaW1pbmF0ZWQgYnkgV1MgMDcvMjIvMDQgY29tYm9pbmVkIHdpdGggYXNzb2NpYXRlaW9uIHJlcXVlc3QgZnJhbWUuICovCi0KLXN0cnVjdCBSZWFzc29jaWF0aW9uX1Jlc3BvbnNlX0ZyYW1lX0JvZHkgewotICAgIHUxNiAgICBjYXBhYmlsaXR5X2luZm9ybWF0aW9uOwotICAgIHUxNiAgICBzdGF0dXNDb2RlOwotICAgIHUxNiAgICBBc3NvY2lhdGlvbl9JRDsKLSAgICBzdHJ1Y3QgU3VwcG9ydGVkX1JhdGVzX0VsZW1lbnQgc3VwcG9ydGVkUmF0ZXM7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLQotc3RydWN0IERlYXV0aGVudGljYXRpb25fRnJhbWVfQm9keSB7Ci0gICAgdTE2ICAgIHJlYXNvbkNvZGU7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLQotCi1zdHJ1Y3QgUHJvYmVfUmVzcG9uc2VfRnJhbWVfQm9keSB7Ci0gICAgdTE2ICAgIFRpbWVzdGFtcDsKLSAgICB1MTYgICAgQmVhY29uX0ludGVydmFsOwotICAgIHUxNiAgICBDYXBhYmlsaXR5X0luZm9ybWF0aW9uOwotICAgIC8qIFNTSUQKLSAgICAvLyBTdXBwb3J0ZWRfUmF0ZXMKLSAgICAvLyBQSFkgcGFyYW1ldGVyIFNldCAoRFMgUGFyYW1ldGVycykKLSAgICAvLyBDRiBwYXJhbWV0ZXIgU2V0Ci0gICAgLy8gSUJTUyBwYXJhbWV0ZXIgU2V0ICovCi19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLQotc3RydWN0IEF1dGhlbnRpY2F0aW9uX0ZyYW1lX0JvZHkgewotICAgIHUxNiAgICBhbGdvcml0aG1OdW1iZXI7Ci0gICAgdTE2ICAgIHNlcXVlbmNlTnVtYmVyOwotICAgIHUxNiAgICBzdGF0dXNDb2RlOwotCS8qIE5COiBkb24ndCBpbmNsdWRlIENoYWxsZW5nZVRleHQgaW4gdGhpcyBzdHJ1Y3R1cmUKLQkvLyBzdHJ1Y3QgQ2hhbGxlbmdlX1RleHRfRWxlbWVudCBzQ2hhbGxlbmdlVGV4dEVsZW1lbnQ7Ci0JLy8gd2tjaGVuIGFkZGVkICovCi19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLQotCiAjZW5kaWYgLyogX01BQ19TdHJ1Y3R1cmVfSF8gKi8KLQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9tZHMuYyBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL21kcy5jCmluZGV4IDkyMTc3NjIuLjljZmVhOTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL21kcy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL21kcy5jCkBAIC0xLDkgKzEsNyBAQAogI2luY2x1ZGUgIm1kc19mLmgiCi0jaW5jbHVkZSAibWxtZXR4cnhfZi5oIgogI2luY2x1ZGUgIm10by5oIgotI2luY2x1ZGUgInN5c2RlZi5oIgotI2luY2x1ZGUgIndiaGFsX2YuaCIKLSNpbmNsdWRlICJ3YmxpbnV4X2YuaCIKKyNpbmNsdWRlICJ3YmhhbC5oIgorI2luY2x1ZGUgIndiMzV0eF9mLmgiCiAKIHVuc2lnbmVkIGNoYXIKIE1kc19pbml0aWFsKHN0cnVjdCB3YnNvZnRfcHJpdiAqYWRhcHRlcikKQEAgLTE3LDExICsxNSw2IEBACiAJcmV0dXJuIGhhbF9nZXRfdHhfYnVmZmVyKCZhZGFwdGVyLT5zSHdEYXRhLCAmcE1kcy0+cFR4QnVmZmVyKTsKIH0KIAotdm9pZAotTWRzX0Rlc3Ryb3koc3RydWN0IHdic29mdF9wcml2ICphZGFwdGVyKQotewotfQotCiBzdGF0aWMgdm9pZCBNZHNfRHVyYXRpb25TZXQoc3RydWN0IHdic29mdF9wcml2ICphZGFwdGVyLCAgc3RydWN0IHdiMzVfZGVzY3JpcHRvciAqcERlcywgIHU4ICpidWZmZXIpCiB7CiAJc3RydWN0IFQwMF9kZXNjcmlwdG9yICpwVDAwOwpAQCAtMzUwLDkgKzM0Myw3IEBACiAJY3RtcDEgPSBjdG1wZiA9IENVUlJFTlRfVFhfUkFURV9GT1JfTU5HOwogCiAJcERlcy0+VHhSYXRlID0gY3RtcDE7Ci0JI2lmZGVmIF9QRV9UWF9EVU1QXwotCXByaW50aygiVHggcmF0ZSA9JXhcbiIsIGN0bXAxKTsKLQkjZW5kaWYKKwlwcl9kZWJ1ZygiVHggcmF0ZSA9JXhcbiIsIGN0bXAxKTsKIAogCXBUMDEtPlQwMV9tb2R1bGF0aW9uX3R5cGUgPSAoY3RtcDElMykgPyAwIDogMTsKIApAQCAtNDA0LDYgKzM5NSw0NCBAQAogCiB9CiAKK3N0YXRpYyB2b2lkIE1MTUVfR2V0TmV4dFBhY2tldChzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKmFkYXB0ZXIsIHN0cnVjdCB3YjM1X2Rlc2NyaXB0b3IgKmRlc2MpCit7CisJZGVzYy0+SW50ZXJuYWxVc2VkID0gZGVzYy0+YnVmZmVyX3N0YXJ0X2luZGV4ICsgZGVzYy0+YnVmZmVyX251bWJlcjsKKwlkZXNjLT5JbnRlcm5hbFVzZWQgJT0gTUFYX0RFU0NSSVBUT1JfQlVGRkVSX0lOREVYOworCWRlc2MtPmJ1ZmZlcl9hZGRyZXNzW2Rlc2MtPkludGVybmFsVXNlZF0gPSBhZGFwdGVyLT5zTWxtZUZyYW1lLnBNTVBEVTsKKwlkZXNjLT5idWZmZXJfc2l6ZVtkZXNjLT5JbnRlcm5hbFVzZWRdID0gYWRhcHRlci0+c01sbWVGcmFtZS5sZW47CisJZGVzYy0+YnVmZmVyX3RvdGFsX3NpemUgKz0gYWRhcHRlci0+c01sbWVGcmFtZS5sZW47CisJZGVzYy0+YnVmZmVyX251bWJlcisrOworCWRlc2MtPlR5cGUgPSBhZGFwdGVyLT5zTWxtZUZyYW1lLkRhdGFUeXBlOworfQorCitzdGF0aWMgdm9pZCBNTE1FZnJlZU1NUERVQnVmZmVyKHN0cnVjdCB3YnNvZnRfcHJpdiAqYWRhcHRlciwgczggKnBEYXRhKQoreworCWludCBpOworCisJLyogUmVjbGFpbSB0aGUgZGF0YSBidWZmZXIgKi8KKwlmb3IgKGkgPSAwOyBpIDwgTUFYX05VTV9UWF9NTVBEVTsgaSsrKSB7CisJCWlmIChwRGF0YSA9PSAoczggKikmKGFkYXB0ZXItPnNNbG1lRnJhbWUuVHhNTVBEVVtpXSkpCisJCQlicmVhazsKKwl9CisJaWYgKGFkYXB0ZXItPnNNbG1lRnJhbWUuVHhNTVBEVUluVXNlW2ldKQorCQlhZGFwdGVyLT5zTWxtZUZyYW1lLlR4TU1QRFVJblVzZVtpXSA9IGZhbHNlOworCWVsc2UgIHsKKwkJLyogU29tZXRoaW5nIHdyb25nCisJCSBQRDQzIEFkZCBkZWJ1ZyBjb2RlIGhlcmU/Pz8gKi8KKwl9Cit9CisKK3N0YXRpYyB2b2lkIE1MTUVfU2VuZENvbXBsZXRlKHN0cnVjdCB3YnNvZnRfcHJpdiAqYWRhcHRlciwgdTggUGFja2V0SUQsIHVuc2lnbmVkIGNoYXIgU2VuZE9LKQoreworICAgIC8qIFJlY2xhaW0gdGhlIGRhdGEgYnVmZmVyICovCisJYWRhcHRlci0+c01sbWVGcmFtZS5sZW4gPSAwOworCU1MTUVmcmVlTU1QRFVCdWZmZXIoYWRhcHRlciwgYWRhcHRlci0+c01sbWVGcmFtZS5wTU1QRFUpOworCisJLyogUmV0dXJuIHJlc291cmNlICovCisJYWRhcHRlci0+c01sbWVGcmFtZS5Jc0luVXNlZCA9IFBBQ0tFVF9GUkVFX1RPX1VTRTsKK30KKwogdm9pZAogTWRzX1R4KHN0cnVjdCB3YnNvZnRfcHJpdiAqYWRhcHRlcikKIHsKQEAgLTQzMCw5ICs0NTksNyBAQAogCWRvIHsKIAkJRmlsbEluZGV4ID0gcE1kcy0+VHhGaWxsSW5kZXg7CiAJCWlmIChwTWRzLT5UeE93bmVyW0ZpbGxJbmRleF0pIHsgLyogSXMgb3duZWQgYnkgc29mdHdhcmUgMDpZZXMgMTpObyAqLwotI2lmZGVmIF9QRV9UWF9EVU1QXwotCQkJcHJpbnRrKCJbTWRzX1R4XSBUeCBPd25lciBpcyBIL1cuXG4iKTsKLSNlbmRpZgorCQkJcHJfZGVidWcoIltNZHNfVHhdIFR4IE93bmVyIGlzIEgvVy5cbiIpOwogCQkJYnJlYWs7CiAJCX0KIApAQCAtNDc2LDkgKzUwMyw3IEBACiAKIAkJCS8qIEZvciBzcGVlZCB1cCBLZXkgc2V0dGluZyAqLwogCQkJaWYgKHBUeERlcy0+RWFwRml4KSB7Ci0jaWZkZWYgX1BFX1RYX0RVTVBfCi0JCQkJcHJpbnRrKCIzNTogRVBBIDR0aCBmcmFtZSBkZXRlY3RlZC4gU2l6ZSA9ICVkXG4iLCBQYWNrZXRTaXplKTsKLSNlbmRpZgorCQkJCXByX2RlYnVnKCIzNTogRVBBIDR0aCBmcmFtZSBkZXRlY3RlZC4gU2l6ZSA9ICVkXG4iLCBQYWNrZXRTaXplKTsKIAkJCQlwSHdEYXRhLT5Jc0tleVByZVNldCA9IDE7CiAJCQl9CiAKQEAgLTQ5MiwxMSArNTE3LDYgQEAKIAkJCVhtaXRCdWZTaXplICs9IEN1cnJlbnRTaXplOwogCQkJWG1pdEJ1ZkFkZHJlc3MgKz0gQ3VycmVudFNpemU7CiAKLSNpZmRlZiBfSUJTU19CRUFDT05fU0VRX1NUSUNLXwotCQkJaWYgKChYbWl0QnVmQWRkcmVzc1tET1RfMTFfREFfT0ZGU0VUKzhdICYgMHhmYykgIT0gTUFDX1NVQlRZUEVfTU5HTU5UX1BST0JFX1JFUVVFU1QpIC8qICs4IGZvciBVU0IgaGRyICovCi0jZW5kaWYKLQkJCQlwTWRzLT5UeFRvZ2dsZSA9IHRydWU7Ci0KIAkJCS8qIEdldCBwYWNrZXQgdG8gdHJhbnNtaXQgY29tcGxldGVkLCAxOlRFU1RTVEEgMjpNTE1FIDM6IE5kaXMgZGF0YSAqLwogCQkJTUxNRV9TZW5kQ29tcGxldGUoYWRhcHRlciwgMCwgdHJ1ZSk7CiAKQEAgLTU2Nyw5ICs1ODcsNyBAQAogCQkJCQlwSHdEYXRhLT50eF9yZXRyeV9jb3VudFtSZXRyeUNvdW50XSArPSBSZXRyeUNvdW50OwogCQkJCWVsc2UKIAkJCQkJcEh3RGF0YS0+dHhfcmV0cnlfY291bnRbN10gKz0gUmV0cnlDb3VudDsKLQkJCQkjaWZkZWYgX1BFX1NUQVRFX0RVTVBfCi0JCQkJcHJpbnRrKCJkdG9fdHhfcmV0cnlfY291bnQgPSVkXG4iLCBwSHdEYXRhLT5kdG9fdHhfcmV0cnlfY291bnQpOwotCQkJCSNlbmRpZgorCQkJCXByX2RlYnVnKCJkdG9fdHhfcmV0cnlfY291bnQgPSVkXG4iLCBwSHdEYXRhLT5kdG9fdHhfcmV0cnlfY291bnQpOwogCQkJCU1UT19TZXRUeENvdW50KGFkYXB0ZXIsIFR4UmF0ZSwgUmV0cnlDb3VudCk7CiAJCQl9CiAJCQlwSHdEYXRhLT5kdG9fdHhfZnJhZ19jb3VudCArPSAoUmV0cnlDb3VudCsxKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL21kc19mLmggYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9tZHNfZi5oCmluZGV4IDdmNjhkZWEuLmNlOGJlMDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL21kc19mLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbWRzX2YuaApAQCAtMSwxMSArMSwxMCBAQAogI2lmbmRlZiBfX1dJTkJPTkRfTURTX0ZfSAogI2RlZmluZSBfX1dJTkJPTkRfTURTX0ZfSAogCi0jaW5jbHVkZSAid2JoYWxfcy5oIgorI2luY2x1ZGUgIndiaGFsLmgiCiAjaW5jbHVkZSAiY29yZS5oIgogCiB1bnNpZ25lZCBjaGFyIE1kc19pbml0aWFsKHN0cnVjdCB3YnNvZnRfcHJpdiAqYWRhcHRlcik7Ci12b2lkIE1kc19EZXN0cm95KHN0cnVjdCB3YnNvZnRfcHJpdiAqYWRhcHRlcik7CiB2b2lkIE1kc19UeChzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKmFkYXB0ZXIpOwogdm9pZCBNZHNfU2VuZENvbXBsZXRlKHN0cnVjdCB3YnNvZnRfcHJpdiAqYWRhcHRlciwgc3RydWN0IFQwMl9kZXNjcmlwdG9yICpwdDAyKTsKIHZvaWQgTWRzX01wZHVQcm9jZXNzKHN0cnVjdCB3YnNvZnRfcHJpdiAqYWRhcHRlciwgc3RydWN0IHdiMzVfZGVzY3JpcHRvciAqcHJ4ZGVzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL21kc19zLmggYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9tZHNfcy5oCmluZGV4IGUyZGU0YmQuLmVlZWRmMDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL21kc19zLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbWRzX3MuaApAQCAtMTA3LDEwICsxMDcsNiBAQAogCXU4CVR4UmF0ZVsoKE1BWF9VU0JfVFhfREVTQ1JJUFRPUiArIDEpICYgfjB4MDEpXVsyXTsgLyogWzBdIGN1cnJlbnQgdHggcmF0ZSwgWzFdIGZhbGwgYmFjayByYXRlICovCiAJdTgJVHhJbmZvWygoTUFYX1VTQl9UWF9ERVNDUklQVE9SICsgMSkgJiB+MHgwMSldOyAvKlN0b3JlIGluZm9ybWF0aW9uIGZvciBjYWxsYmFjayBmdW5jdGlvbiAqLwogCi0JLyogZm9yIHNjYW5uaW5nIG1lY2hhbmlzbSAqLwotCXU4CVR4VG9nZ2xlOwkvKiBJdCBpcyBUUlVFIGlmIHRoZXJlIGFyZSB0eCBhY3Rpdml0aWVzIGluIHNvbWUgdGltZSBpbnRlcnZhbCAqLwotCXU4CVJlc2VydmVkX1szXTsKLQogCS8qIC0tLS0gZm9yIFR4IFBhcmFtZXRlciAqLwogCXUxNglUeEZyYWdtZW50VGhyZXNob2xkOwkvKiBGb3IgZnJhbWUgYm9keSBvbmx5ICovCiAJdTE2CVR4UlRTVGhyZXNob2xkOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbWxtZXR4cnguYyBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL21sbWV0eHJ4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0MjVhMjMuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbWxtZXR4cnguYworKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgTW9kdWxlIE5hbWU6Ci0gICAgTUxNRVR4UnguQwotCi0gIERlc2NyaXB0aW9uOgotICAgIFRoZSBpbnRlcmZhY2UgYmV0d2VlbiBNRFMgKE1BQyBEYXRhIFNlcnZpY2UpIGFuZCBNTE1FLgotCi0gIFJldmlzaW9uIEhpc3Rvcnk6Ci0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JCTIwMDIwOSAgICAgIFVOMjAgSmVubmlmZXIgWHUKLQkJSW5pdGlhbCBSZWxlYXNlCi0JCTIwMDIxMTA4ICAgIFBENDMgQXVzdGluIExpdQotCQkyMDAzMDExNyAgICBQRDQzIEF1c3RpbiBMaXUKLQkJRGVsZXRlZCBNTE1FUmV0dXJuUGFja2V0IGFuZCBNTE1FUHJvY1RocmVhZCgpCi0KLSAgQ29weXJpZ2h0IChjKSAxOTk2LTIwMDIgV2luYm9uZCBFbGVjdHJvbmljcyBDb3JwLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotI2luY2x1ZGUgInN5c2RlZi5oIgotCi0jaW5jbHVkZSAibWRzX2YuaCIKLQotdm9pZCBNTE1FX0dldE5leHRQYWNrZXQoc3RydWN0IHdic29mdF9wcml2ICphZGFwdGVyLCBzdHJ1Y3Qgd2IzNV9kZXNjcmlwdG9yICpkZXNjKQotewotCWRlc2MtPkludGVybmFsVXNlZCA9IGRlc2MtPmJ1ZmZlcl9zdGFydF9pbmRleCArIGRlc2MtPmJ1ZmZlcl9udW1iZXI7Ci0JZGVzYy0+SW50ZXJuYWxVc2VkICU9IE1BWF9ERVNDUklQVE9SX0JVRkZFUl9JTkRFWDsKLQlkZXNjLT5idWZmZXJfYWRkcmVzc1tkZXNjLT5JbnRlcm5hbFVzZWRdID0gYWRhcHRlci0+c01sbWVGcmFtZS5wTU1QRFU7Ci0JZGVzYy0+YnVmZmVyX3NpemVbZGVzYy0+SW50ZXJuYWxVc2VkXSA9IGFkYXB0ZXItPnNNbG1lRnJhbWUubGVuOwotCWRlc2MtPmJ1ZmZlcl90b3RhbF9zaXplICs9IGFkYXB0ZXItPnNNbG1lRnJhbWUubGVuOwotCWRlc2MtPmJ1ZmZlcl9udW1iZXIrKzsKLQlkZXNjLT5UeXBlID0gYWRhcHRlci0+c01sbWVGcmFtZS5EYXRhVHlwZTsKLX0KLQotc3RhdGljIHZvaWQgTUxNRWZyZWVNTVBEVUJ1ZmZlcihzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKmFkYXB0ZXIsIHM4ICpwRGF0YSkKLXsKLQlpbnQgaTsKLQotCS8qIFJlY2xhaW0gdGhlIGRhdGEgYnVmZmVyICovCi0JZm9yIChpID0gMDsgaSA8IE1BWF9OVU1fVFhfTU1QRFU7IGkrKykgewotCQlpZiAocERhdGEgPT0gKHM4ICopJihhZGFwdGVyLT5zTWxtZUZyYW1lLlR4TU1QRFVbaV0pKQotCQkJYnJlYWs7Ci0JfQotCWlmIChhZGFwdGVyLT5zTWxtZUZyYW1lLlR4TU1QRFVJblVzZVtpXSkKLQkJYWRhcHRlci0+c01sbWVGcmFtZS5UeE1NUERVSW5Vc2VbaV0gPSBmYWxzZTsKLQllbHNlICB7Ci0JCS8qIFNvbWV0aGluZyB3cm9uZwotCQkgUEQ0MyBBZGQgZGVidWcgY29kZSBoZXJlPz8/ICovCi0JfQotfQotCi12b2lkCi1NTE1FX1NlbmRDb21wbGV0ZShzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKmFkYXB0ZXIsIHU4IFBhY2tldElELCB1bnNpZ25lZCBjaGFyIFNlbmRPSykKLXsKLSAgICAvKiBSZWNsYWltIHRoZSBkYXRhIGJ1ZmZlciAqLwotCWFkYXB0ZXItPnNNbG1lRnJhbWUubGVuID0gMDsKLQlNTE1FZnJlZU1NUERVQnVmZmVyKGFkYXB0ZXIsIGFkYXB0ZXItPnNNbG1lRnJhbWUucE1NUERVKTsKLQotCS8qIFJldHVybiByZXNvdXJjZSAqLwotCWFkYXB0ZXItPnNNbG1lRnJhbWUuSXNJblVzZWQgPSBQQUNLRVRfRlJFRV9UT19VU0U7Ci19Ci0KLQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9tbG1ldHhyeF9mLmggYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9tbG1ldHhyeF9mLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxMjUwN2YuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbWxtZXR4cnhfZi5oCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gTUxNRVR4UnguSCAtLQotLy8KLS8vICAgRnVuY3Rpb25zIGRlZmluZWQgaW4gTUxNRVR4UnguYy4KLS8vCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDIgV2luYm9uZCBFbGVjdHJpY3MgQ29ycC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotI2lmbmRlZiBfTUxNRVRYUlhfSAotI2RlZmluZSBfTUxNRVRYUlhfSAotCi0jaW5jbHVkZSAiY29yZS5oIgotCi12b2lkIE1MTUVfR2V0TmV4dFBhY2tldChzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKmFkYXB0ZXIsIHN0cnVjdCB3YjM1X2Rlc2NyaXB0b3IgKnBEZXMpOwotCi12b2lkCi1NTE1FX1NlbmRDb21wbGV0ZShzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKmFkYXB0ZXIsIHU4IFBhY2tldElELAotCQkgIHVuc2lnbmVkIGNoYXIgU2VuZE9LKTsKLQotI2lmZGVmIF9JQlNTX0JFQUNPTl9TRVFfU1RJQ0tfCi1zOCBTZW5kQkNOdWxsRGF0YShzdHJ1Y3Qgd2Jzb2Z0X3ByaXYgKmFkYXB0ZXIsIHUxNiB3SWR4KTsKLSNlbmRpZgotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL210by5jIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbXRvLmMKaW5kZXggOWNkMjEyNy4uYzAzZTUwMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbXRvLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvbXRvLmMKQEAgLTE3LDkgKzE3LDEwIEBACiAgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKi8KIAotI2luY2x1ZGUgInN5c2RlZi5oIgogI2luY2x1ZGUgInNtZV9hcGkuaCIKLSNpbmNsdWRlICJ3YmhhbF9mLmgiCisjaW5jbHVkZSAid2JoYWwuaCIKKyNpbmNsdWRlICJ3YjM1cmVnX2YuaCIKKyNpbmNsdWRlICJjb3JlLmgiCiAKIC8qIERlY2xhcmUgU1EzIHRvIHJhdGUgYW5kIGZyYWdtZW50YXRpb24gdGhyZXNob2xkIHRhYmxlICovCiAvKiBEZWNsYXJlIGZyYWdtZW50YXRpb24gdGhyZXNob2xkcyB0YWJsZSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvcGh5X2NhbGlicmF0aW9uLmMgYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9waHlfY2FsaWJyYXRpb24uYwppbmRleCAyYjM3NWJhLi4wOTg0NGRiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9waHlfY2FsaWJyYXRpb24uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9waHlfY2FsaWJyYXRpb24uYwpAQCAtMTAsOSArMTAsMTAgQEAKICAqLwogCiAvKioqKioqKioqKioqKioqKioqIElOQ0xVREUgRklMRVMgU0VDVElPTiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpbmNsdWRlICJzeXNkZWYuaCIKICNpbmNsdWRlICJwaHlfY2FsaWJyYXRpb24uaCIKLSNpbmNsdWRlICJ3YmhhbF9mLmgiCisjaW5jbHVkZSAid2JoYWwuaCIKKyNpbmNsdWRlICJ3YjM1cmVnX2YuaCIKKyNpbmNsdWRlICJjb3JlLmgiCiAKIAogLyoqKioqKioqKioqKioqKioqKiBERUJVRyBDT05TVEFOVCBBTkQgTUFDUk8gU0VDVElPTiAqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9waHlfY2FsaWJyYXRpb24uaCBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3BoeV9jYWxpYnJhdGlvbi5oCmluZGV4IDMwMzIwMzEuLjg0ZjZlODQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3BoeV9jYWxpYnJhdGlvbi5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3BoeV9jYWxpYnJhdGlvbi5oCkBAIC0xLDcgKzEsNyBAQAogI2lmbmRlZiBfX1dJTkJPTkRfUEhZX0NBTElCUkFUSU9OX0gKICNkZWZpbmUgX19XSU5CT05EX1BIWV9DQUxJQlJBVElPTl9ICiAKLSNpbmNsdWRlICJ3YmhhbF9mLmgiCisjaW5jbHVkZSAid2JoYWwuaCIKIAogI2RlZmluZSBSRUdfQUdDX0NUUkwxCQkweDEwMDAKICNkZWZpbmUgUkVHX0FHQ19DVFJMMgkJMHgxMDA0CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9yZWcuYyBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3JlZy5jCmluZGV4IDk5MGY5ZDQuLjFiMzhkNmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3JlZy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3JlZy5jCkBAIC0xLDUgKzEsNiBAQAotI2luY2x1ZGUgInN5c2RlZi5oIgotI2luY2x1ZGUgIndiaGFsX2YuaCIKKyNpbmNsdWRlICJ3YmhhbC5oIgorI2luY2x1ZGUgIndiMzVyZWdfZi5oIgorI2luY2x1ZGUgImNvcmUuaCIKIAogLyoKICAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KQEAgLTEwMTAsOSArMTAxMSw3IEBACiAJY2FzZSBSRl9BSVJPSEFfNzIzMDoKIAkJLyogU3RhcnQgdG8gZmlsbCBSRiBwYXJhbWV0ZXJzLCBQTExfT04gc2hvdWxkIGJlIHB1bGxlZCBsb3cuICovCiAJCVdiMzVSZWdfV3JpdGVTeW5jKHBId0RhdGEsIDB4MDNkYywgMHgwMDAwMDAwMCk7Ci0JCSNpZmRlZiBfUEVfU1RBVEVfRFVNUF8KLQkJcHJpbnRrKCIqIFBMTF9PTiAgICBsb3dcbiIpOwotCQkjZW5kaWYKKwkJcHJfZGVidWcoIiogUExMX09OICAgIGxvd1xuIik7CiAJCW51bWJlciA9IEFSUkFZX1NJWkUoYWw3MjMwX3JmX2RhdGFfMjQpOwogCQlTZXRfQ2hhbkluZGVwX1JmRGF0YV9hbDcyMzBfMjQocEh3RGF0YSwgcGx0bXAsIG51bWJlcik7CiAJCWJyZWFrOwpAQCAtMTA5OCw5ICsxMDk3LDcgQEAKIAljYXNlIFJGX0FJUk9IQV83MjMwOgogCQkvKiBSRiBwYXJhbWV0ZXJzIGhhdmUgZmlsbGVkIGNvbXBsZXRlbHksIFBMTF9PTiBzaG91bGQgYmUgcHVsbGVkIGhpZ2ggKi8KIAkJV2IzNVJlZ19Xcml0ZVN5bmMocEh3RGF0YSwgMHgwM2RjLCAweDAwMDAwMDgwKTsKLQkJI2lmZGVmIF9QRV9TVEFURV9EVU1QXwotCQlwcmludGsoIiogUExMX09OICAgIGhpZ2hcbiIpOwotCQkjZW5kaWYKKwkJcHJfZGVidWcoIiogUExMX09OICAgIGhpZ2hcbiIpOwogCiAJCS8qIDIuNEdIeiAqLwogCQlsdG1wID0gKDEgPDwgMzEpIHwgKDAgPDwgMzApIHwgKDI0IDw8IDI0KSB8IDB4OUFCQThGOwpAQCAtMTExNSw5ICsxMTEyLDcgQEAKIAogCQkvKiA1R0h6ICovCiAJCVdiMzVSZWdfV3JpdGVTeW5jKHBId0RhdGEsIDB4MDNkYywgMHgwMDAwMDAwMCk7Ci0JCSNpZmRlZiBfUEVfU1RBVEVfRFVNUF8KLQkJcHJpbnRrKCIqIFBMTF9PTiAgICBsb3dcbiIpOwotCQkjZW5kaWYKKwkJcHJfZGVidWcoIiogUExMX09OICAgIGxvd1xuIik7CiAKIAkJbnVtYmVyID0gQVJSQVlfU0laRShhbDcyMzBfcmZfZGF0YV81MCk7CiAJCVNldF9DaGFuSW5kZXBfUmZEYXRhX2FsNzIzMF81MChwSHdEYXRhLCBwbHRtcCwgbnVtYmVyKTsKQEAgLTExMjcsOSArMTEyMiw3IEBACiAJCW1zbGVlcCg1KTsKIAogCQlXYjM1UmVnX1dyaXRlU3luYyhwSHdEYXRhLCAweDAzZGMsIDB4MDAwMDAwODApOwotCQkjaWZkZWYgX1BFX1NUQVRFX0RVTVBfCi0JCXByaW50aygiKiBQTExfT04gICAgaGlnaFxuIik7Ci0JCSNlbmRpZgorCQlwcl9kZWJ1ZygiKiBQTExfT04gICAgaGlnaFxuIik7CiAKIAkJbHRtcCA9ICgxIDw8IDMxKSB8ICgwIDw8IDMwKSB8ICgyNCA8PCAyNCkgfCAweDlBQkE4RjsKIAkJV2IzNVJlZ19Xcml0ZVN5bmMocEh3RGF0YSwgMHgwODY0LCBsdG1wKTsKQEAgLTE3OTUsOSArMTc4OCw3IEBACiAKIAkJCS8qIFdyaXRlIHRvIHJlZ2lzdGVyLiBudW1iZXIgbXVzdCBsZXNzIGFuZCBlcXVhbCB0aGFuIDE2ICovCiAJCQlXYjM1UmVnX0J1cnN0V3JpdGUocEh3RGF0YSwgMHgwODY0LCBwbHRtcCwgbnVtYmVyLCBOT19JTkNSRU1FTlQpOwotCQkJI2lmZGVmIF9QRV9TVEFURV9EVU1QXwotCQkJcHJpbnRrKCJCYW5kIGNoYW5nZWRcbiIpOwotCQkJI2VuZGlmCisJCQlwcl9kZWJ1ZygiQmFuZCBjaGFuZ2VkXG4iKTsKIAkJfQogCiAJCWlmIChDaGFubmVsLmJhbmQgPD0gQkFORF9UWVBFX09GRE1fMjQpIHsgLyogY2hhbm5lbCAxIH4gMTQgKi8KQEAgLTIwNzMsMTEgKzIwNjQsNyBAQAogCSAqLwogCiAJLyogTTAwIGJpdCBzZXQgKi8KLQkjaWZkZWYgX0lCU1NfQkVBQ09OX1NFUV9TVElDS18KLQlyZWctPk0wMF9NYWNDb250cm9sID0gMDsgLyogU29sdmUgYmVhY29uIHNlcXVlbmNlIG51bWJlciBzdG9wIGJ5IHNvZnR3YXJlICovCi0JI2Vsc2UKIAlyZWctPk0wMF9NYWNDb250cm9sID0gMHg4MDAwMDAwMDsgLyogU29sdmUgYmVhY29uIHNlcXVlbmNlIG51bWJlciBzdG9wIGJ5IGhhcmR3YXJlICovCi0JI2VuZGlmCiAKIAkvKiBNMjQgZGlzYWJsZSBlbnRlciBwb3dlciBzYXZlLCBCQiBSeE9uIGFuZCBlbmFibGUgTkFWIGF0dGFjayAqLwogCXJlZy0+TTI0X01hY0NvbnRyb2wgPSAweDA4MDQwMDQyOwpAQCAtMjMzNiwxMyArMjMyMyw2IEBACiAJCXBId0RhdGEtPlR4VmdhRm9yNTBbMzJdLlR4VmdhVmFsdWUgPSBwVHhWZ2FbMTddIC0gc3RtcCAqIDIgLyA0OwogCQlwSHdEYXRhLT5UeFZnYUZvcjUwWzMxXS5UeFZnYVZhbHVlID0gcFR4VmdhWzE3XSAtIHN0bXAgKiAzIC8gNDsKIAl9Ci0KLQkjaWZkZWYgX1BFX1NUQVRFX0RVTVBfCi0JcHJpbnRrKCIgVHhWZ2FGb3IyNCA6XG4iKTsKLQlEYXRhRG1wKCh1OCAqKXBId0RhdGEtPlR4VmdhRm9yMjQsIDE0ICwgMCk7Ci0JcHJpbnRrKCIgVHhWZ2FGb3I1MCA6XG4iKTsKLQlEYXRhRG1wKCh1OCAqKXBId0RhdGEtPlR4VmdhRm9yNTAsIDcwICwgMCk7Ci0JI2VuZGlmCiB9CiAKIHZvaWQgQkJQcm9jZXNzb3JfUmF0ZUNoYW5naW5nKHN0cnVjdCBod19kYXRhICpwSHdEYXRhLCAgdTggcmF0ZSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3N5c2RlZi5oIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvc3lzZGVmLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwZDcxZjYuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvc3lzZGVmLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKiAgV2luYm9uZCBXTEFOIFN5c3RlbSBDb25maWd1cmF0aW9uIGRlZmluZXMgKi8KLQotI2lmbmRlZiBTWVNfREVGX0gKLSNkZWZpbmUgU1lTX0RFRl9ICi0KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotCi0jZGVmaW5lIFdCX0xJTlVYCi0jZGVmaW5lIFdCX0xJTlVYX1dQQV9QU0sKLQotI2RlZmluZSBfVVNFX0ZBTExCQUNLX1JBVEVfCi0KLSNkZWZpbmUgX1dQQTJfCi0KLSNpZm5kZWYgX1dQQV9QU0tfREVCVUcKLSN1bmRlZiAgX1dQQV9QU0tfREVCVUcKLSNlbmRpZgotCi0vKiBkZWJ1ZyBwcmludCBvcHRpb25zLCBtYXJrIHdoYXQgZGVidWcgeW91IGRvbid0IG5lZWQgKi8KLQotI2lmZGVmIEZVTExfREVCVUcKLSNkZWZpbmUgX1BFX1NUQVRFX0RVTVBfCi0jZGVmaW5lIF9QRV9UWF9EVU1QXwotI2RlZmluZSBfUEVfUlhfRFVNUF8KLSNkZWZpbmUgX1BFX09JRF9EVU1QXwotI2RlZmluZSBfUEVfRFRPX0RVTVBfCi0jZGVmaW5lIF9QRV9SRUdfRFVNUF8KLSNkZWZpbmUgX1BFX1VTQl9JTklfRFVNUF8KLSNlbmRpZgotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3diMzVyZWcuYyBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3diMzVyZWcuYwppbmRleCA3NzA3MjIzLi40MmFlNjEwMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvd2IzNXJlZy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3diMzVyZWcuYwpAQCAtMSw0ICsxLDMgQEAKLSNpbmNsdWRlICJzeXNkZWYuaCIKICNpbmNsdWRlICJ3YjM1cmVnX2YuaCIKIAogI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgpAQCAtMTQwLDggKzEzOSw4IEBACiAKIAkvKiBTeW5jIElvQ2FsbERyaXZlciAqLwogCXJlZy0+RVAwdm1fc3RhdGUgPSBWTV9SVU5OSU5HOwotCXJldCA9IHVzYl9jb250cm9sX21zZyhwSHdEYXRhLT5XYlVzYi51ZGV2LAotCQkJICAgICAgIHVzYl9zbmRjdHJscGlwZShwSHdEYXRhLT5XYlVzYi51ZGV2LCAwKSwKKwlyZXQgPSB1c2JfY29udHJvbF9tc2cocEh3RGF0YS0+dWRldiwKKwkJCSAgICAgICB1c2Jfc25kY3RybHBpcGUocEh3RGF0YS0+dWRldiwgMCksCiAJCQkgICAgICAgMHgwMywgVVNCX1RZUEVfVkVORE9SIHwgVVNCX1JFQ0lQX0RFVklDRSB8IFVTQl9ESVJfT1VULAogCQkJICAgICAgIDB4MCwgUmVnaXN0ZXJObywgJlJlZ2lzdGVyVmFsdWUsIDQsIEhaICogMTAwKTsKIAlyZWctPkVQMHZtX3N0YXRlID0gVk1fU1RPUDsKQEAgLTE1MCw5ICsxNDksNyBAQAogCVdiMzVSZWdfRVAwVk1fc3RhcnQocEh3RGF0YSk7CiAKIAlpZiAocmV0IDwgMCkgewotI2lmZGVmIF9QRV9SRUdfRFVNUF8KLQkJcHJpbnRrKCJFUDAgV3JpdGUgcmVnaXN0ZXIgdXNiIG1lc3NhZ2Ugc2VuZGluZyBlcnJvclxuIik7Ci0jZW5kaWYKKwkJcHJfZGVidWcoIkVQMCBXcml0ZSByZWdpc3RlciB1c2IgbWVzc2FnZSBzZW5kaW5nIGVycm9yXG4iKTsKIAkJcEh3RGF0YS0+U3VycHJpc2VSZW1vdmUgPSAxOwogCQlyZXR1cm4gZmFsc2U7CiAJfQpAQCAtMzA1LDggKzMwMiw4IEBACiAJCW1zbGVlcCgxMCk7CiAKIAlyZWctPkVQMHZtX3N0YXRlID0gVk1fUlVOTklORzsKLQlyZXQgPSB1c2JfY29udHJvbF9tc2cocEh3RGF0YS0+V2JVc2IudWRldiwKLQkJCSAgICAgICB1c2JfcmN2Y3RybHBpcGUocEh3RGF0YS0+V2JVc2IudWRldiwgMCksCisJcmV0ID0gdXNiX2NvbnRyb2xfbXNnKHBId0RhdGEtPnVkZXYsCisJCQkgICAgICAgdXNiX3JjdmN0cmxwaXBlKHBId0RhdGEtPnVkZXYsIDApLAogCQkJICAgICAgIDB4MDEsIFVTQl9UWVBFX1ZFTkRPUiB8IFVTQl9SRUNJUF9ERVZJQ0UgfCBVU0JfRElSX0lOLAogCQkJICAgICAgIDB4MCwgUmVnaXN0ZXJObywgcGx0bXAsIDQsIEhaICogMTAwKTsKIApAQCAtMzIwLDkgKzMxNyw3IEBACiAJV2IzNVJlZ19FUDBWTV9zdGFydChwSHdEYXRhKTsKIAogCWlmIChyZXQgPCAwKSB7Ci0jaWZkZWYgX1BFX1JFR19EVU1QXwotCQlwcmludGsoIkVQMCBSZWFkIHJlZ2lzdGVyIHVzYiBtZXNzYWdlIHNlbmRpbmcgZXJyb3JcbiIpOwotI2VuZGlmCisJCXByX2RlYnVnKCJFUDAgUmVhZCByZWdpc3RlciB1c2IgbWVzc2FnZSBzZW5kaW5nIGVycm9yXG4iKTsKIAkJcEh3RGF0YS0+U3VycHJpc2VSZW1vdmUgPSAxOwogCQlyZXR1cm4gZmFsc2U7CiAJfQpAQCAtNDMyLDggKzQyNyw4IEBACiAJaWYgKHJlZ19xdWV1ZS0+RElSRUNUID09IDEpIC8qIG91dHB1dCAqLwogCQlwQnVmZmVyID0gJnJlZ19xdWV1ZS0+VkFMVUU7CiAKLQl1c2JfZmlsbF9jb250cm9sX3VyYih1cmIsIHBId0RhdGEtPldiVXNiLnVkZXYsCi0JCQkgICAgICBSRUdfRElSRUNUSU9OKHBId0RhdGEtPldiVXNiLnVkZXYsIHJlZ19xdWV1ZSksCisJdXNiX2ZpbGxfY29udHJvbF91cmIodXJiLCBwSHdEYXRhLT51ZGV2LAorCQkJICAgICAgUkVHX0RJUkVDVElPTihwSHdEYXRhLT51ZGV2LCByZWdfcXVldWUpLAogCQkJICAgICAgKHU4ICopZHIsIHBCdWZmZXIsIGNwdV90b19sZTE2KGRyLT53TGVuZ3RoKSwKIAkJCSAgICAgIFdiMzVSZWdfRVAwVk1fY29tcGxldGUsICh2b2lkICopcEh3RGF0YSk7CiAKQEAgLTQ0Miw5ICs0MzcsNyBAQAogCXJldCA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgR0ZQX0FUT01JQyk7CiAKIAlpZiAocmV0IDwgMCkgewotI2lmZGVmIF9QRV9SRUdfRFVNUF8KLQkJcHJpbnRrKCJFUDAgSXJwIHNlbmRpbmcgZXJyb3JcbiIpOwotI2VuZGlmCisJCXByX2RlYnVnKCJFUDAgSXJwIHNlbmRpbmcgZXJyb3JcbiIpOwogCQlnb3RvIGNsZWFudXA7CiAJfQogCXJldHVybjsKQEAgLTQ3OSw5ICs0NzIsNyBAQAogCQlzcGluX3VubG9ja19pcnEoJnJlZy0+RVAwVk1fc3Bpbl9sb2NrKTsKIAogCQlpZiAocmVnLT5FUDBWTV9zdGF0dXMpIHsKLSNpZmRlZiBfUEVfUkVHX0RVTVBfCi0JCQlwcmludGsoIkVQMCBJb0NvbXBsZXRlUm91dGluZSByZXR1cm4gZXJyb3JcbiIpOwotI2VuZGlmCisJCQlwcl9kZWJ1ZygiRVAwIElvQ29tcGxldGVSb3V0aW5lIHJldHVybiBlcnJvclxuIik7CiAJCQlyZWctPkVQMHZtX3N0YXRlID0gVk1fU1RPUDsKIAkJCXBId0RhdGEtPlN1cnByaXNlUmVtb3ZlID0gMTsKIAkJfSBlbHNlIHsKQEAgLTUyNiw5ICs1MTcsNyBAQAogCQkJdXNiX2ZyZWVfdXJiKHVyYik7CiAJCQlrZnJlZShyZWdfcXVldWUpOwogCQl9IGVsc2UgewotI2lmZGVmIF9QRV9SRUdfRFVNUF8KLQkJCXByaW50aygiRVAwIHF1ZXVlIHJlbGVhc2UgZXJyb3JcbiIpOwotI2VuZGlmCisJCQlwcl9kZWJ1ZygiRVAwIHF1ZXVlIHJlbGVhc2UgZXJyb3JcbiIpOwogCQl9CiAJCXNwaW5fbG9ja19pcnEoJnJlZy0+RVAwVk1fc3Bpbl9sb2NrKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvd2IzNXJlZ19mLmggYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC93YjM1cmVnX2YuaAppbmRleCBiZjIzYzEwLi45NWRjOTgwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC93YjM1cmVnX2YuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC93YjM1cmVnX2YuaApAQCAtMSw3ICsxLDcgQEAKICNpZm5kZWYgX19XSU5CT05EX1dCMzVSRUdfRl9ICiAjZGVmaW5lIF9fV0lOQk9ORF9XQjM1UkVHX0ZfSAogCi0jaW5jbHVkZSAid2JoYWxfcy5oIgorI2luY2x1ZGUgIndiaGFsLmgiCiAKIC8qCiAgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3diMzVyZWdfcy5oIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvd2IzNXJlZ19zLmgKaW5kZXggNGVmZjAwOS4uZWIyNzRmZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvd2IzNXJlZ19zLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvd2IzNXJlZ19zLmgKQEAgLTUsNiArNSw4IEBACiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxhc20vYXRvbWljLmg+CiAKK3N0cnVjdCBod19kYXRhOworCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKgogICoJCQlIQUwgc2V0dGluZyBmdW5jdGlvbgpAQCAtNDksMTEgKzUxLDcgQEAKICNkZWZpbmUgREVGQVVMVF9DV01BWAkJCTEwMjMJLyogKE0yQykgQ1dtYXguIEl0cyB2YWx1ZSBpcyBpbiB0aGUgcmFuZ2UgMC0xMDIzLiAqLwogI2RlZmluZSBERUZBVUxUX0FJRAkJCTEJLyogKE0zNCkgQUlELiBJdHMgdmFsdWUgaXMgaW4gdGhlIHJhbmdlIDEtMjAwNy4gKi8KIAotI2lmZGVmIF9VU0VfRkFMTEJBQ0tfUkFURV8KICNkZWZpbmUgREVGQVVMVF9SQVRFX1JFVFJZX0xJTUlUCTIJLyogKE0zOCkgYXMgbmFtZWQgKi8KLSNlbHNlCi0jZGVmaW5lIERFRkFVTFRfUkFURV9SRVRSWV9MSU1JVAk3CS8qIChNMzgpIGFzIG5hbWVkICovCi0jZW5kaWYKIAogI2RlZmluZSBERUZBVUxUX0xPTkdfUkVUUllfTElNSVQJNwkvKiAoTTM4KSBMb25nUmV0cnlMaW1pdC4gSXRzIHZhbHVlIGlzIGluIHRoZSByYW5nZSAwLTE1LiAqLwogI2RlZmluZSBERUZBVUxUX1NIT1JUX1JFVFJZX0xJTUlUCTcJLyogKE0zOCkgU2hvcnRSZXRyeUxpbWl0LiBJdHMgdmFsdWUgaXMgaW4gdGhlIHJhbmdlIDAtMTUuICovCkBAIC0xNjgsNCArMTY2LDc1IEBACiAJdTMyCVNRM19maWx0ZXJbTUFYX1NRM19GSUxURVJfU0laRV07CiAJdTMyCVNRM19pbmRleDsKIH07CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRnVuY3Rpb24gZGVjbGFyYXRpb24KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCit2b2lkIGhhbF9yZW1vdmVfbWFwcGluZ19rZXkoc3RydWN0IGh3X2RhdGEgKmh3X2RhdGEsIHU4ICptYWNfYWRkcik7Cit2b2lkIGhhbF9yZW1vdmVfZGVmYXVsdF9rZXkoc3RydWN0IGh3X2RhdGEgKmh3X2RhdGEsIHUzMiBpbmRleCk7Cit1bnNpZ25lZCBjaGFyIGhhbF9zZXRfbWFwcGluZ19rZXkoc3RydWN0IGh3X2RhdGEgKmFkYXB0ZXIsIHU4ICptYWNfYWRkciwKKwkJCQkgIHU4IG51bGxfa2V5LCB1OCB3ZXBfb24sIHU4ICp0eF90c2MsCisJCQkJICB1OCAqcnhfdHNjLCB1OCBrZXlfdHlwZSwgdTgga2V5X2xlbiwKKwkJCQkgIHU4ICprZXlfZGF0YSk7Cit1bnNpZ25lZCBjaGFyIGhhbF9zZXRfZGVmYXVsdF9rZXkoc3RydWN0IGh3X2RhdGEgKmFkYXB0ZXIsIHU4IGluZGV4LAorCQkJCSAgdTggbnVsbF9rZXksIHU4IHdlcF9vbiwgdTggKnR4X3RzYywKKwkJCQkgIHU4ICpyeF90c2MsIHU4IGtleV90eXBlLCB1OCBrZXlfbGVuLAorCQkJCSAgdTggKmtleV9kYXRhKTsKK3ZvaWQgaGFsX2NsZWFyX2FsbF9kZWZhdWx0X2tleShzdHJ1Y3QgaHdfZGF0YSAqaHdfZGF0YSk7Cit2b2lkIGhhbF9jbGVhcl9hbGxfZ3JvdXBfa2V5KHN0cnVjdCBod19kYXRhICpod19kYXRhKTsKK3ZvaWQgaGFsX2NsZWFyX2FsbF9tYXBwaW5nX2tleShzdHJ1Y3QgaHdfZGF0YSAqaHdfZGF0YSk7Cit2b2lkIGhhbF9jbGVhcl9hbGxfa2V5KHN0cnVjdCBod19kYXRhICpod19kYXRhKTsKK3ZvaWQgaGFsX3NldF9wb3dlcl9zYXZlX21vZGUoc3RydWN0IGh3X2RhdGEgKmh3X2RhdGEsIHVuc2lnbmVkIGNoYXIgcG93ZXJfc2F2ZSwKKwkJCSAgICAgdW5zaWduZWQgY2hhciB3YWtldXAsIHVuc2lnbmVkIGNoYXIgZHRpbSk7Cit2b2lkIGhhbF9nZXRfcG93ZXJfc2F2ZV9tb2RlKHN0cnVjdCBod19kYXRhICpod19kYXRhLCB1OCAqaW5fcHdyX3NhdmUpOwordm9pZCBoYWxfc2V0X3Nsb3RfdGltZShzdHJ1Y3QgaHdfZGF0YSAqaHdfZGF0YSwgdTggdHlwZSk7CisKKyNkZWZpbmUgaGFsX3NldF9hdGltX3dpbmRvdyhfQSwgX0FUTSkKKwordm9pZCBoYWxfc3RhcnRfYnNzKHN0cnVjdCBod19kYXRhICpod19kYXRhLCB1OCBtYWNfb3BfbW9kZSk7CisKKy8qIDA6QlNTIFNUQSAxOklCU1MgU1RBICovCit2b2lkIGhhbF9qb2luX3JlcXVlc3Qoc3RydWN0IGh3X2RhdGEgKmh3X2RhdGEsIHU4IGJzc190eXBlKTsKKwordm9pZCBoYWxfc3RvcF9zeW5jX2JzcyhzdHJ1Y3QgaHdfZGF0YSAqaHdfZGF0YSk7Cit2b2lkIGhhbF9yZXN1bWVfc3luY19ic3Moc3RydWN0IGh3X2RhdGEgKmh3X2RhdGEpOwordm9pZCBoYWxfc2V0X2FpZChzdHJ1Y3QgaHdfZGF0YSAqaHdfZGF0YSwgdTE2IGFpZCk7Cit2b2lkIGhhbF9zZXRfYnNzaWQoc3RydWN0IGh3X2RhdGEgKmh3X2RhdGEsIHU4ICpic3NpZCk7Cit2b2lkIGhhbF9nZXRfYnNzaWQoc3RydWN0IGh3X2RhdGEgKmh3X2RhdGEsIHU4ICpic3NpZCk7Cit2b2lkIGhhbF9zZXRfbGlzdGVuX2ludGVydmFsKHN0cnVjdCBod19kYXRhICpod19kYXRhLCB1MTYgbGlzdGVuX2ludGVydmFsKTsKK3ZvaWQgaGFsX3NldF9jYXBfaW5mbyhzdHJ1Y3QgaHdfZGF0YSAqaHdfZGF0YSwgdTE2IGNhcGFiaWxpdHlfaW5mbyk7Cit2b2lkIGhhbF9zZXRfc3NpZChzdHJ1Y3QgaHdfZGF0YSAqaHdfZGF0YSwgdTggKnNzaWQsIHU4IHNzaWRfbGVuKTsKK3ZvaWQgaGFsX3N0YXJ0X3R4MChzdHJ1Y3QgaHdfZGF0YSAqaHdfZGF0YSk7CisKKyNkZWZpbmUgaGFsX2dldF9jd21pbihfQSkJKChfQSktPmN3bWluKQorCit2b2lkIGhhbF9zZXRfY3dtYXgoc3RydWN0IGh3X2RhdGEgKmh3X2RhdGEsIHUxNiBjd2luX21heCk7CisKKyNkZWZpbmUgaGFsX2dldF9jd21heChfQSkJKChfQSktPmN3bWF4KQorCit2b2lkIGhhbF9zZXRfcnNuX3dwYShzdHJ1Y3QgaHdfZGF0YSAqaHdfZGF0YSwgdTMyICpyc25faWVfYml0bWFwLAorCQkgICAgIHUzMiAqcnNuX291aV90eXBlICwgdW5zaWduZWQgY2hhciBkZXNpcmVkX2F1dGhfbW9kZSk7Cit2b2lkIGhhbF9zZXRfY29ubmVjdF9pbmZvKHN0cnVjdCBod19kYXRhICpod19kYXRhLCB1bnNpZ25lZCBjaGFyIGJvX2Nvbm5lY3QpOwordTggaGFsX2dldF9lc3Rfc3EzKHN0cnVjdCBod19kYXRhICpod19kYXRhLCB1OCBjb3VudCk7Cit2b2lkIGhhbF9kZXNjcmlwdG9yX2luZGljYXRlKHN0cnVjdCBod19kYXRhICpod19kYXRhLAorCQkJICAgICBzdHJ1Y3Qgd2IzNV9kZXNjcmlwdG9yICpkZXMpOwordTggaGFsX2dldF9hbnRlbm5hX251bWJlcihzdHJ1Y3QgaHdfZGF0YSAqaHdfZGF0YSk7Cit1MzIgaGFsX2dldF9ic3NfcGtfY250KHN0cnVjdCBod19kYXRhICpod19kYXRhKTsKKworI2RlZmluZSBoYWxfZ2V0X3JlZ2lvbl9mcm9tX0VFUFJPTShfQSkJKChfQSktPnJlZy5FRVBST01SZWdpb24pCisjZGVmaW5lIGhhbF9nZXRfdHhfYnVmZmVyKF9BLCBfQikJV2IzNVR4X2dldF90eF9idWZmZXIoX0EsIF9CKQorI2RlZmluZSBoYWxfc29mdHdhcmVfc2V0KF9BKQkJKF9BLT5Tb2Z0d2FyZVNldCkKKyNkZWZpbmUgaGFsX2RyaXZlcl9pbml0X09LKF9BKQkJKF9BLT5Jc0luaXRPSykKKyNkZWZpbmUgaGFsX3Jzc2lfYm91bmRhcnlfaGlnaChfQSkJKF9BLT5SU1NJX2hpZ2gpCisjZGVmaW5lIGhhbF9yc3NpX2JvdW5kYXJ5X2xvdyhfQSkJKF9BLT5SU1NJX2xvdykKKyNkZWZpbmUgaGFsX3NjYW5faW50ZXJ2YWwoX0EpCQkoX0EtPlNjYW5fSW50ZXJ2YWwpCisKKyNkZWZpbmUgUEhZX0RFQlVHKG1zZywgYXJncy4uLikKKworLyogcmV0dXJuIDEwMG1zIGNvdW50ICovCisjZGVmaW5lIGhhbF9nZXRfdGltZV9jb3VudChfUCkJCShfUC0+dGltZV9jb3VudCAvIDEwKQorCisjZGVmaW5lIGhhbF9pYnNzX2Rpc2Nvbm5lY3QoX0EpCQkoaGFsX3N0b3Bfc3luY19ic3MoX0EpKQorCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3diMzVyeC5jIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvd2IzNXJ4LmMKaW5kZXggNDQ4NTE0YS4uZjExOGVlYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvd2IzNXJ4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvd2IzNXJ4LmMKQEAgLTE0LDcgKzE0LDYgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAKICNpbmNsdWRlICJjb3JlLmgiCi0jaW5jbHVkZSAic3lzZGVmLmgiCiAjaW5jbHVkZSAid2IzNXJ4X2YuaCIKIAogc3RhdGljIHZvaWQgcGFja2V0X2NhbWUoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIGNoYXIgKnBSeEJ1ZmZlckFkZHJlc3MsIGludCBQYWNrZXRTaXplKQpAQCAtMTA5LDEwICsxMDgsNyBAQAogCiAJCQkvKiBCYXNpYyBjaGVjayBmb3IgUnggbGVuZ3RoLiBJcyBsZW5ndGggdmFsaWQ/ICovCiAJCQlpZiAoUGFja2V0U2l6ZSA+IE1BWF9QQUNLRVRfU0laRSkgewotI2lmZGVmIF9QRV9SWF9EVU1QXwotCQkJCXByaW50aygiU2VyaW91cyBFUlJPUiA6IFJ4IGRhdGEgc2l6ZSB0b28gbG9uZywgc2l6ZSA9JWRcbiIsIFBhY2tldFNpemUpOwotI2VuZGlmCi0KKwkJCQlwcl9kZWJ1ZygiU2VyaW91cyBFUlJPUiA6IFJ4IGRhdGEgc2l6ZSB0b28gbG9uZywgc2l6ZSA9JWRcbiIsIFBhY2tldFNpemUpOwogCQkJCXBXYjM1UngtPkVQM3ZtX3N0YXRlID0gVk1fU1RPUDsKIAkJCQlwV2IzNVJ4LT5FcDNFcnJvckNvdW50MisrOwogCQkJCWJyZWFrOwpAQCAtMTc0LDcgKzE3MCw3IEBACiAJLyogVGhlIElSUCBpcyBjb21wbGV0ZWQgKi8KIAlwV2IzNVJ4LT5FUDN2bV9zdGF0ZSA9IFZNX0NPTVBMRVRFRDsKIAotCWlmIChwSHdEYXRhLT5TdXJwcmlzZVJlbW92ZSB8fCBwSHdEYXRhLT5Id1N0b3ApIC8qIE11c3QgYmUgaGVyZSwgb3IgUnhCdWZmZXJJZCBpcyBpbnZhbGlkICovCisJaWYgKHBId0RhdGEtPlN1cnByaXNlUmVtb3ZlKSAvKiBNdXN0IGJlIGhlcmUsIG9yIFJ4QnVmZmVySWQgaXMgaW52YWxpZCAqLwogCQlnb3RvIGVycm9yOwogCiAJaWYgKHBXYjM1UngtPnJ4X2hhbHQpCkBAIC0xODYsOSArMTgyLDcgQEAKIAogCS8qIFRoZSBVUkIgaXMgY29tcGxldGVkLCBjaGVjayB0aGUgcmVzdWx0ICovCiAJaWYgKHBXYjM1UngtPkVQM1ZNX3N0YXR1cyAhPSAwKSB7Ci0jaWZkZWYgX1BFX1VTQl9TVEFURV9EVU1QXwotCQlwcmludGsoIkVQMyBJb0NvbXBsZXRlUm91dGluZSByZXR1cm4gZXJyb3JcbiIpOwotI2VuZGlmCisJCXByX2RlYnVnKCJFUDMgSW9Db21wbGV0ZVJvdXRpbmUgcmV0dXJuIGVycm9yXG4iKTsKIAkJcFdiMzVSeC0+RVAzdm1fc3RhdGUgPSBWTV9TVE9QOwogCQlnb3RvIGVycm9yOwogCX0KQEAgLTIzOSw3ICsyMzMsNyBAQAogCXUzMgkJCVJ4QnVmZmVySWQ7CiAKIAkvKiBJc3N1aW5nIFVSQiAqLwotCWlmIChwSHdEYXRhLT5TdXJwcmlzZVJlbW92ZSB8fCBwSHdEYXRhLT5Id1N0b3ApCisJaWYgKHBId0RhdGEtPlN1cnByaXNlUmVtb3ZlKQogCQlnb3RvIGVycm9yOwogCiAJaWYgKHBXYjM1UngtPnJ4X2hhbHQpCkBAIC0yNDksOSArMjQzLDcgQEAKIAlSeEJ1ZmZlcklkID0gcFdiMzVSeC0+UnhCdWZmZXJJZDsKIAlpZiAoIXBXYjM1UngtPlJ4T3duZXJbUnhCdWZmZXJJZF0pIHsKIAkJLyogSXQncyBpbXBvc3NpYmxlIHRvIHJ1biBoZXJlLiAqLwotI2lmZGVmIF9QRV9SWF9EVU1QXwotCQlwcmludGsoIlJ4IGRyaXZlciBmaWZvIHVuYXZhaWxhYmxlXG4iKTsKLSNlbmRpZgorCQlwcl9kZWJ1ZygiUnggZHJpdmVyIGZpZm8gdW5hdmFpbGFibGVcbiIpOwogCQlnb3RvIGVycm9yOwogCX0KIApAQCAtMjY4LDggKzI2MCw4IEBACiAJfQogCXBSeEJ1ZmZlckFkZHJlc3MgPSBwV2IzNVJ4LT5wRFJ4OwogCi0JdXNiX2ZpbGxfYnVsa191cmIodXJiLCBwSHdEYXRhLT5XYlVzYi51ZGV2LAotCQkJICB1c2JfcmN2YnVsa3BpcGUocEh3RGF0YS0+V2JVc2IudWRldiwgMyksCisJdXNiX2ZpbGxfYnVsa191cmIodXJiLCBwSHdEYXRhLT51ZGV2LAorCQkJICB1c2JfcmN2YnVsa3BpcGUocEh3RGF0YS0+dWRldiwgMyksCiAJCQkgIHBSeEJ1ZmZlckFkZHJlc3MsIE1BWF9VU0JfUlhfQlVGRkVSLAogCQkJICBXYjM1UnhfQ29tcGxldGUsIGh3KTsKIApAQCAtMzM3LDkgKzMyOSw3IEBACiAJLyogQ2FuY2VsaW5nIHRoZSBJcnAgaWYgYWxyZWFkeSBzZW5kcyBpdCBvdXQuICovCiAJaWYgKHBXYjM1UngtPkVQM3ZtX3N0YXRlID09IFZNX1JVTk5JTkcpIHsKIAkJdXNiX3VubGlua191cmIocFdiMzVSeC0+UnhVcmIpOyAvKiBPbmx5IHVzZSB1bmxpbmssIGxldCBXYjM1UnhfZGVzdHJveSB0byBmcmVlIHRoZW0gKi8KLSNpZmRlZiBfUEVfUlhfRFVNUF8KLQkJcHJpbnRrKCJFUDMgUnggc3RvcFxuIik7Ci0jZW5kaWYKKwkJcHJfZGVidWcoIkVQMyBSeCBzdG9wXG4iKTsKIAl9CiB9CiAKQEAgLTM1NSw4ICszNDUsNiBAQAogCiAJaWYgKHBXYjM1UngtPlJ4VXJiKQogCQl1c2JfZnJlZV91cmIocFdiMzVSeC0+UnhVcmIpOwotI2lmZGVmIF9QRV9SWF9EVU1QXwotCXByaW50aygiV2IzNVJ4X2Rlc3Ryb3kgT0tcbiIpOwotI2VuZGlmCisJcHJfZGVidWcoIldiMzVSeF9kZXN0cm95IE9LXG4iKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvd2IzNXJ4X2YuaCBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3diMzVyeF9mLmgKaW5kZXggOThhY2NlNS4uMWZkZjY1ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvd2IzNXJ4X2YuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC93YjM1cnhfZi5oCkBAIC0yLDcgKzIsNyBAQAogI2RlZmluZSBfX1dJTkJPTkRfV0IzNVJYX0ZfSAogCiAjaW5jbHVkZSA8bmV0L21hYzgwMjExLmg+Ci0jaW5jbHVkZSAid2JoYWxfcy5oIgorI2luY2x1ZGUgIndiaGFsLmgiCiAKIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAvLyBJbnRlcmZhY2UgZnVuY3Rpb24gZGVjbGFyZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvd2IzNXR4LmMgYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC93YjM1dHguYwppbmRleCAyYTlkMDU1Li40NGZjM2ZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC93YjM1dHguYworKysgYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC93YjM1dHguYwpAQCAtMTMsNyArMTMsNiBAQAogCiAjaW5jbHVkZSAid2IzNXR4X2YuaCIKICNpbmNsdWRlICJtZHNfZi5oIgotI2luY2x1ZGUgInN5c2RlZi5oIgogCiB1bnNpZ25lZCBjaGFyCiBXYjM1VHhfZ2V0X3R4X2J1ZmZlcihzdHJ1Y3QgaHdfZGF0YSAqIHBId0RhdGEsIHU4ICoqcEJ1ZmZlcikKQEAgLTQxLDcgKzQwLDcgQEAKIAlwV2IzNVR4LT5UeFNlbmRJbmRleCsrOwogCXBXYjM1VHgtPlR4U2VuZEluZGV4ICU9IE1BWF9VU0JfVFhfQlVGRkVSX05VTUJFUjsKIAotCWlmIChwSHdEYXRhLT5TdXJwcmlzZVJlbW92ZSB8fCBwSHdEYXRhLT5Id1N0b3ApIC8vIExldCBXYldsYW5IYWx0IHRvIGhhbmRsZSBzdXJwcmlzZSByZW1vdmUKKwlpZiAocEh3RGF0YS0+U3VycHJpc2VSZW1vdmUpIC8vIExldCBXYldsYW5IYWx0IHRvIGhhbmRsZSBzdXJwcmlzZSByZW1vdmUKIAkJZ290byBlcnJvcjsKIAogCWlmIChwV2IzNVR4LT50eF9oYWx0KQpAQCAtNzQsNyArNzMsNyBAQAogCXUzMgkJU2VuZEluZGV4OwogCiAKLQlpZiAocEh3RGF0YS0+U3VycHJpc2VSZW1vdmUgfHwgcEh3RGF0YS0+SHdTdG9wKQorCWlmIChwSHdEYXRhLT5TdXJwcmlzZVJlbW92ZSkKIAkJZ290byBjbGVhbnVwOwogCiAJaWYgKHBXYjM1VHgtPnR4X2hhbHQpCkBAIC04OSw4ICs4OCw4IEBACiAJLy8KIAkvLyBJc3N1aW5nIFVSQgogCS8vCi0JdXNiX2ZpbGxfYnVsa191cmIocFVyYiwgcEh3RGF0YS0+V2JVc2IudWRldiwKLQkJCSAgdXNiX3NuZGJ1bGtwaXBlKHBId0RhdGEtPldiVXNiLnVkZXYsIDQpLAorCXVzYl9maWxsX2J1bGtfdXJiKHBVcmIsIHBId0RhdGEtPnVkZXYsCisJCQkgIHVzYl9zbmRidWxrcGlwZShwSHdEYXRhLT51ZGV2LCA0KSwKIAkJCSAgcFR4QnVmZmVyQWRkcmVzcywgcE1kcy0+VHhCdWZmZXJTaXplWyBTZW5kSW5kZXggXSwKIAkJCSAgV2IzNVR4X2NvbXBsZXRlLCBhZGFwdGVyKTsKIApAQCAtMTUzLDE2ICsxNTIsMTIgQEAKIAkvLyBUcnlpbmcgdG8gY2FuY2VsaW5nIHRoZSBUcnAgb2YgRVAyCiAJaWYgKHBXYjM1VHgtPkVQMnZtX3N0YXRlID09IFZNX1JVTk5JTkcpCiAJCXVzYl91bmxpbmtfdXJiKCBwV2IzNVR4LT5UeDJVcmIgKTsgLy8gT25seSB1c2UgdW5saW5rLCBsZXQgV2IzNVR4X2Rlc3Ryb3QgdG8gZnJlZSB0aGVtCi0JI2lmZGVmIF9QRV9UWF9EVU1QXwotCXByaW50aygiRVAyIFR4IHN0b3BcbiIpOwotCSNlbmRpZgorCXByX2RlYnVnKCJFUDIgVHggc3RvcFxuIik7CiAKIAkvLyBUcnlpbmcgdG8gY2FuY2VsaW5nIHRoZSBJcnAgb2YgRVA0CiAJaWYgKHBXYjM1VHgtPkVQNHZtX3N0YXRlID09IFZNX1JVTk5JTkcpCiAJCXVzYl91bmxpbmtfdXJiKCBwV2IzNVR4LT5UeDRVcmIgKTsgLy8gT25seSB1c2UgdW5saW5rLCBsZXQgV2IzNVR4X2Rlc3Ryb3QgdG8gZnJlZSB0aGVtCi0JI2lmZGVmIF9QRV9UWF9EVU1QXwotCXByaW50aygiRVA0IFR4IHN0b3BcbiIpOwotCSNlbmRpZgorCXByX2RlYnVnKCJFUDQgVHggc3RvcFxuIik7CiB9CiAKIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CkBAIC0xODIsOSArMTc3LDcgQEAKIAlpZiAocFdiMzVUeC0+VHgyVXJiKQogCQl1c2JfZnJlZV91cmIoIHBXYjM1VHgtPlR4MlVyYiApOwogCi0JI2lmZGVmIF9QRV9UWF9EVU1QXwotCXByaW50aygiV2IzNVR4X2Rlc3Ryb3kgT0tcbiIpOwotCSNlbmRpZgorCXByX2RlYnVnKCJXYjM1VHhfZGVzdHJveSBPS1xuIik7CiB9CiAKIHZvaWQgV2IzNVR4X0N1cnJlbnRUaW1lKHN0cnVjdCB3YnNvZnRfcHJpdiAqYWRhcHRlciwgdTMyIFRpbWVDb3VudCkKQEAgLTIyMiw3ICsyMTUsNyBAQAogCXBXYjM1VHgtPkVQMlZNX3N0YXR1cyA9IHBVcmItPnN0YXR1czsKIAogCS8vIEZvciBMaW51eCAyLjQuIEludGVycnVwdCB3aWxsIGFsd2F5cyB0cmlnZ2VyCi0JaWYgKHBId0RhdGEtPlN1cnByaXNlUmVtb3ZlIHx8IHBId0RhdGEtPkh3U3RvcCkgLy8gTGV0IFdiV2xhbkhhbHQgdG8gaGFuZGxlIHN1cnByaXNlIHJlbW92ZQorCWlmIChwSHdEYXRhLT5TdXJwcmlzZVJlbW92ZSkgLy8gTGV0IFdiV2xhbkhhbHQgdG8gaGFuZGxlIHN1cnByaXNlIHJlbW92ZQogCQlnb3RvIGVycm9yOwogCiAJaWYgKHBXYjM1VHgtPnR4X2hhbHQpCkBAIC0yNjMsNyArMjU2LDcgQEAKIAl1MzIgKglwbHRtcCA9ICh1MzIgKilwV2IzNVR4LT5FUDJfYnVmOwogCWludAkJcmV0djsKIAotCWlmIChwSHdEYXRhLT5TdXJwcmlzZVJlbW92ZSB8fCBwSHdEYXRhLT5Id1N0b3ApCisJaWYgKHBId0RhdGEtPlN1cnByaXNlUmVtb3ZlKQogCQlnb3RvIGVycm9yOwogCiAJaWYgKHBXYjM1VHgtPnR4X2hhbHQpCkBAIC0yNzIsMTYgKzI2NSwxNCBAQAogCS8vCiAJLy8gSXNzdWluZyBVUkIKIAkvLwotCXVzYl9maWxsX2ludF91cmIoIHBVcmIsIHBId0RhdGEtPldiVXNiLnVkZXYsIHVzYl9yY3ZpbnRwaXBlKHBId0RhdGEtPldiVXNiLnVkZXYsMiksCisJdXNiX2ZpbGxfaW50X3VyYiggcFVyYiwgcEh3RGF0YS0+dWRldiwgdXNiX3JjdmludHBpcGUocEh3RGF0YS0+dWRldiwyKSwKIAkJCSAgcGx0bXAsIE1BWF9JTlRFUlJVUFRfTEVOR1RILCBXYjM1VHhfRVAyVk1fY29tcGxldGUsIGFkYXB0ZXIsIDMyKTsKIAogCXBXYjM1VHgtPkVQMnZtX3N0YXRlID0gVk1fUlVOTklORzsKIAlyZXR2ID0gdXNiX3N1Ym1pdF91cmIocFVyYiwgR0ZQX0FUT01JQyk7CiAKIAlpZiAocmV0diA8IDApIHsKLQkJI2lmZGVmIF9QRV9UWF9EVU1QXwotCQlwcmludGsoIkVQMiBUeCBJcnAgc2VuZGluZyBlcnJvclxuIik7Ci0JCSNlbmRpZgorCQlwcl9kZWJ1ZygiRVAyIFR4IElycCBzZW5kaW5nIGVycm9yXG4iKTsKIAkJZ290byBlcnJvcjsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3diMzV0eF9mLmggYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC93YjM1dHhfZi5oCmluZGV4IDFkM2I1MTUuLjAxOGZkMzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3diMzV0eF9mLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvd2IzNXR4X2YuaApAQCAtMiw3ICsyLDYgQEAKICNkZWZpbmUgX19XSU5CT05EX1dCMzVUWF9GX0gKIAogI2luY2x1ZGUgImNvcmUuaCIKLSNpbmNsdWRlICJ3YmhhbF9mLmgiCiAKIC8qCiAgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3diaGFsX3MuaCBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3diaGFsLmgKc2ltaWxhcml0eSBpbmRleCA5NyUKcmVuYW1lIGZyb20gZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvd2JoYWxfcy5oCnJlbmFtZSB0byBkcml2ZXJzL3N0YWdpbmcvd2luYm9uZC93YmhhbC5oCmluZGV4IDgyMWExYjMuLjM5ZTg0YTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3diaGFsX3MuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC93YmhhbC5oCkBAIC0zNDIsOSArMzQyLDYgQEAKIAl2b2lkCSpidWZmZXJfYWRkcmVzc1tNQVhfREVTQ1JJUFRPUl9CVUZGRVJfSU5ERVhdOwogfTsKIAotCi0jZGVmaW5lIERFRkFVTFRfTlVMTF9QQUNLRVRfQ09VTlQJMTgwMDAwCS8qIDE4MCBzZWNvbmRzICovCi0KICNkZWZpbmUgTUFYX1RYVkdBX0VFUFJPTQkJOQkvKiBIb3cgbWFueSB3b3JkKHUxNikgb2YgRUVQUk9NIHdpbGwgYmUgdXNlZCBmb3IgVHhWR0EgKi8KICNkZWZpbmUgTUFYX1JGX1BBUkFNRVRFUgkJMzIKIApAQCAtMzU5LDcgKzM1Niw2IEBACiAgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKi8KIAotI2luY2x1ZGUgIndidXNiX3MuaCIKICNpbmNsdWRlICJ3YjM1cmVnX3MuaCIKICNpbmNsdWRlICJ3YjM1dHhfcy5oIgogI2luY2x1ZGUgIndiMzVyeF9zLmgiCkBAIC00NDAsNyArNDM2LDcgQEAKIAkgKiBWYXJpYWJsZSBmb3IgZWFjaCBtb2R1bGUKIAkgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCSAqLwotCXN0cnVjdCB3Yl91c2IJCVdiVXNiOwkvKiBOZWVkIFdiVXNiLmggKi8KKwlzdHJ1Y3QgdXNiX2RldmljZQkqdWRldjsKIAlzdHJ1Y3Qgd2IzNV9yZWcJCXJlZzsJLyogTmVlZCBXYjM1UmVnLmggKi8KIAlzdHJ1Y3Qgd2IzNV90eAkJV2IzNVR4OyAvKiBOZWVkIFdiMzVUeC5oICovCiAJc3RydWN0IHdiMzVfcngJCVdiMzVSeDsgLyogTmVlZCBXYjM1UnguaCAqLwpAQCAtNTEwLDE2ICs1MDYsOCBAQAogCXUzMgkJUnhCeXRlQ291bnRMYXN0OwogCXUzMgkJVHhCeXRlQ291bnRMYXN0OwogCi0JYXRvbWljX3QJU3VycHJpc2VSZW1vdmVDb3VudDsKLQogCS8qIEZvciBnbG9iYWwgdGltZXIgKi8KIAl1MzIJCXRpbWVfY291bnQ7CS8qIFRJQ0tfVElNRV8xMDBtcyAxID0gMTAwbXMgKi8KLQotCS8qIEZvciBlcnJvciByZWNvdmVyICovCi0JdTMyCQlId1N0b3A7Ci0KLQkvKiBGb3IgYXZvaWQgQVAgZGlzY29ubmVjdCAqLwotCXUzMgkJTnVsbFBhY2tldENvdW50OwogfTsKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC93YmhhbF9mLmggYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC93YmhhbF9mLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjNzhjMTQuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvd2JoYWxfZi5oCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoKLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogRGV2aWNlIHJlbGF0ZWQgaW5jbHVkZQotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotI2luY2x1ZGUgIndiMzVyZWdfZi5oIgotI2luY2x1ZGUgIndiMzV0eF9mLmgiCi0jaW5jbHVkZSAid2IzNXJ4X2YuaCIKLQotI2luY2x1ZGUgImNvcmUuaCIKLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBGdW5jdGlvbiBkZWNsYXJhdGlvbgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLXZvaWQgaGFsX3JlbW92ZV9tYXBwaW5nX2tleShzdHJ1Y3QgaHdfZGF0YSAqaHdfZGF0YSwgdTggKm1hY19hZGRyKTsKLXZvaWQgaGFsX3JlbW92ZV9kZWZhdWx0X2tleShzdHJ1Y3QgaHdfZGF0YSAqaHdfZGF0YSwgdTMyIGluZGV4KTsKLXVuc2lnbmVkIGNoYXIgaGFsX3NldF9tYXBwaW5nX2tleShzdHJ1Y3QgaHdfZGF0YSAqYWRhcHRlciwgdTggKm1hY19hZGRyLAotCQkJCSAgdTggbnVsbF9rZXksIHU4IHdlcF9vbiwgdTggKnR4X3RzYywKLQkJCQkgIHU4ICpyeF90c2MsIHU4IGtleV90eXBlLCB1OCBrZXlfbGVuLAotCQkJCSAgdTggKmtleV9kYXRhKTsKLXVuc2lnbmVkIGNoYXIgaGFsX3NldF9kZWZhdWx0X2tleShzdHJ1Y3QgaHdfZGF0YSAqYWRhcHRlciwgdTggaW5kZXgsCi0JCQkJICB1OCBudWxsX2tleSwgdTggd2VwX29uLCB1OCAqdHhfdHNjLAotCQkJCSAgdTggKnJ4X3RzYywgdTgga2V5X3R5cGUsIHU4IGtleV9sZW4sCi0JCQkJICB1OCAqa2V5X2RhdGEpOwotdm9pZCBoYWxfY2xlYXJfYWxsX2RlZmF1bHRfa2V5KHN0cnVjdCBod19kYXRhICpod19kYXRhKTsKLXZvaWQgaGFsX2NsZWFyX2FsbF9ncm91cF9rZXkoc3RydWN0IGh3X2RhdGEgKmh3X2RhdGEpOwotdm9pZCBoYWxfY2xlYXJfYWxsX21hcHBpbmdfa2V5KHN0cnVjdCBod19kYXRhICpod19kYXRhKTsKLXZvaWQgaGFsX2NsZWFyX2FsbF9rZXkoc3RydWN0IGh3X2RhdGEgKmh3X2RhdGEpOwotdm9pZCBoYWxfc2V0X3Bvd2VyX3NhdmVfbW9kZShzdHJ1Y3QgaHdfZGF0YSAqaHdfZGF0YSwgdW5zaWduZWQgY2hhciBwb3dlcl9zYXZlLAotCQkJICAgICB1bnNpZ25lZCBjaGFyIHdha2V1cCwgdW5zaWduZWQgY2hhciBkdGltKTsKLXZvaWQgaGFsX2dldF9wb3dlcl9zYXZlX21vZGUoc3RydWN0IGh3X2RhdGEgKmh3X2RhdGEsIHU4ICppbl9wd3Jfc2F2ZSk7Ci12b2lkIGhhbF9zZXRfc2xvdF90aW1lKHN0cnVjdCBod19kYXRhICpod19kYXRhLCB1OCB0eXBlKTsKLQotI2RlZmluZSBoYWxfc2V0X2F0aW1fd2luZG93KF9BLCBfQVRNKQotCi12b2lkIGhhbF9zdGFydF9ic3Moc3RydWN0IGh3X2RhdGEgKmh3X2RhdGEsIHU4IG1hY19vcF9tb2RlKTsKLQotLyogMDpCU1MgU1RBIDE6SUJTUyBTVEEgKi8KLXZvaWQgaGFsX2pvaW5fcmVxdWVzdChzdHJ1Y3QgaHdfZGF0YSAqaHdfZGF0YSwgdTggYnNzX3R5cGUpOwotCi12b2lkIGhhbF9zdG9wX3N5bmNfYnNzKHN0cnVjdCBod19kYXRhICpod19kYXRhKTsKLXZvaWQgaGFsX3Jlc3VtZV9zeW5jX2JzcyhzdHJ1Y3QgaHdfZGF0YSAqaHdfZGF0YSk7Ci12b2lkIGhhbF9zZXRfYWlkKHN0cnVjdCBod19kYXRhICpod19kYXRhLCB1MTYgYWlkKTsKLXZvaWQgaGFsX3NldF9ic3NpZChzdHJ1Y3QgaHdfZGF0YSAqaHdfZGF0YSwgdTggKmJzc2lkKTsKLXZvaWQgaGFsX2dldF9ic3NpZChzdHJ1Y3QgaHdfZGF0YSAqaHdfZGF0YSwgdTggKmJzc2lkKTsKLXZvaWQgaGFsX3NldF9saXN0ZW5faW50ZXJ2YWwoc3RydWN0IGh3X2RhdGEgKmh3X2RhdGEsIHUxNiBsaXN0ZW5faW50ZXJ2YWwpOwotdm9pZCBoYWxfc2V0X2NhcF9pbmZvKHN0cnVjdCBod19kYXRhICpod19kYXRhLCB1MTYgY2FwYWJpbGl0eV9pbmZvKTsKLXZvaWQgaGFsX3NldF9zc2lkKHN0cnVjdCBod19kYXRhICpod19kYXRhLCB1OCAqc3NpZCwgdTggc3NpZF9sZW4pOwotdm9pZCBoYWxfc3RhcnRfdHgwKHN0cnVjdCBod19kYXRhICpod19kYXRhKTsKLQotI2RlZmluZSBoYWxfZ2V0X2N3bWluKF9BKQkoKF9BKS0+Y3dtaW4pCi0KLXZvaWQgaGFsX3NldF9jd21heChzdHJ1Y3QgaHdfZGF0YSAqaHdfZGF0YSwgdTE2IGN3aW5fbWF4KTsKLQotI2RlZmluZSBoYWxfZ2V0X2N3bWF4KF9BKQkoKF9BKS0+Y3dtYXgpCi0KLXZvaWQgaGFsX3NldF9yc25fd3BhKHN0cnVjdCBod19kYXRhICpod19kYXRhLCB1MzIgKnJzbl9pZV9iaXRtYXAsCi0JCSAgICAgdTMyICpyc25fb3VpX3R5cGUgLCB1bnNpZ25lZCBjaGFyIGRlc2lyZWRfYXV0aF9tb2RlKTsKLXZvaWQgaGFsX3NldF9jb25uZWN0X2luZm8oc3RydWN0IGh3X2RhdGEgKmh3X2RhdGEsIHVuc2lnbmVkIGNoYXIgYm9fY29ubmVjdCk7Ci11OCBoYWxfZ2V0X2VzdF9zcTMoc3RydWN0IGh3X2RhdGEgKmh3X2RhdGEsIHU4IGNvdW50KTsKLXZvaWQgaGFsX2Rlc2NyaXB0b3JfaW5kaWNhdGUoc3RydWN0IGh3X2RhdGEgKmh3X2RhdGEsCi0JCQkgICAgIHN0cnVjdCB3YjM1X2Rlc2NyaXB0b3IgKmRlcyk7Ci11OCBoYWxfZ2V0X2FudGVubmFfbnVtYmVyKHN0cnVjdCBod19kYXRhICpod19kYXRhKTsKLXUzMiBoYWxfZ2V0X2Jzc19wa19jbnQoc3RydWN0IGh3X2RhdGEgKmh3X2RhdGEpOwotCi0jZGVmaW5lIGhhbF9nZXRfcmVnaW9uX2Zyb21fRUVQUk9NKF9BKQkoKF9BKS0+cmVnLkVFUFJPTVJlZ2lvbikKLSNkZWZpbmUgaGFsX2dldF90eF9idWZmZXIoX0EsIF9CKQlXYjM1VHhfZ2V0X3R4X2J1ZmZlcihfQSwgX0IpCi0jZGVmaW5lIGhhbF9zb2Z0d2FyZV9zZXQoX0EpCQkoX0EtPlNvZnR3YXJlU2V0KQotI2RlZmluZSBoYWxfZHJpdmVyX2luaXRfT0soX0EpCQkoX0EtPklzSW5pdE9LKQotI2RlZmluZSBoYWxfcnNzaV9ib3VuZGFyeV9oaWdoKF9BKQkoX0EtPlJTU0lfaGlnaCkKLSNkZWZpbmUgaGFsX3Jzc2lfYm91bmRhcnlfbG93KF9BKQkoX0EtPlJTU0lfbG93KQotI2RlZmluZSBoYWxfc2Nhbl9pbnRlcnZhbChfQSkJCShfQS0+U2Nhbl9JbnRlcnZhbCkKLQotI2RlZmluZSBQSFlfREVCVUcobXNnLCBhcmdzLi4uKQotCi0vKiByZXR1cm4gMTAwbXMgY291bnQgKi8KLSNkZWZpbmUgaGFsX2dldF90aW1lX2NvdW50KF9QKQkJKF9QLT50aW1lX2NvdW50IC8gMTApCi0jZGVmaW5lIGhhbF9kZXRlY3RfZXJyb3IoX1ApCQkoX1AtPldiVXNiLkRldGVjdENvdW50KQotCi0jZGVmaW5lIGhhbF9pYnNzX2Rpc2Nvbm5lY3QoX0EpCQkoaGFsX3N0b3Bfc3luY19ic3MoX0EpKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvd2JsaW51eF9mLmggYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC93YmxpbnV4X2YuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGE5ZDIxNC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC93YmxpbnV4X2YuaAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLSNpZm5kZWYgX19XQkxJTlVYX0ZfSAotI2RlZmluZSBfX1dCTElOVVhfRl9ICi0KLSNpbmNsdWRlICJjb3JlLmgiCi0jaW5jbHVkZSAibWRzX3MuaCIKLQotLyoKLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBDb3B5cmlnaHQgKGMpIDE5OTYtMjAwNCBXaW5ib25kIEVsZWN0cm9uaWMgQ29ycG9yYXRpb24KLSAqCi0gKiB3YmxpbnV4X2YuaAotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotaW50IHdiMzVfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KTsKLXZvaWQgd2IzNV9zZXRfbXVsdGljYXN0KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpOwotc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKndiMzVfbmV0ZGV2X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpOwotI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC93YnVzYi5jIGIvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvd2J1c2IuYwppbmRleCAzZjYwY2Y3Li4yMTYzZDYwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC93YnVzYi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93aW5ib25kL3didXNiLmMKQEAgLTE0LDEwICsxNCwxMSBAQAogCiAjaW5jbHVkZSAiY29yZS5oIgogI2luY2x1ZGUgIm1kc19mLmgiCi0jaW5jbHVkZSAibWxtZXR4cnhfZi5oIgogI2luY2x1ZGUgIm10by5oIgotI2luY2x1ZGUgIndiaGFsX2YuaCIKLSNpbmNsdWRlICJ3YmxpbnV4X2YuaCIKKyNpbmNsdWRlICJ3YmhhbC5oIgorI2luY2x1ZGUgIndiMzVyZWdfZi5oIgorI2luY2x1ZGUgIndiMzV0eF9mLmgiCisjaW5jbHVkZSAid2IzNXJ4X2YuaCIKIAogTU9EVUxFX0RFU0NSSVBUSU9OKCJJUzg5QzM1IDgwMi4xMWJnIFdMQU4gVVNCIERyaXZlciIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpAQCAtMTgxLDEwICsxODIsNyBAQAogCVJGU3ludGhlc2l6ZXJfU3dpdGNoaW5nQ2hhbm5lbChwSHdEYXRhLCBjaGFubmVsKTsgLyogU3dpdGNoIGNoYW5uZWwgKi8KIAlwSHdEYXRhLT5DaGFubmVsID0gY2hhbm5lbC5DaGFuTm87CiAJcEh3RGF0YS0+YmFuZCA9IGNoYW5uZWwuYmFuZDsKLSNpZmRlZiBfUEVfU1RBVEVfRFVNUF8KLQlwcmludGsoIlNldCBjaGFubmVsIGlzICVkLCBiYW5kID0lZFxuIiwgcEh3RGF0YS0+Q2hhbm5lbCwKLQkgICAgICAgcEh3RGF0YS0+YmFuZCk7Ci0jZW5kaWYKKwlwcl9kZWJ1ZygiU2V0IGNoYW5uZWwgaXMgJWQsIGJhbmQgPSVkXG4iLCBwSHdEYXRhLT5DaGFubmVsLCBwSHdEYXRhLT5iYW5kKTsKIAlyZWctPk0yOF9NYWNDb250cm9sICY9IH4weGZmOwkvKiBDbGVhbiBjaGFubmVsIGluZm9ybWF0aW9uIGZpZWxkICovCiAJcmVnLT5NMjhfTWFjQ29udHJvbCB8PSBjaGFubmVsLkNoYW5ObzsKIAlXYjM1UmVnX1dyaXRlV2l0aENhbGxiYWNrVmFsdWUocEh3RGF0YSwgMHgwODI4LCByZWctPk0yOF9NYWNDb250cm9sLApAQCAtMzM5LDEwICszMzcsOCBAQAogc3RhdGljIHVuc2lnbmVkIGNoYXIgaGFsX2lkbGUoc3RydWN0IGh3X2RhdGEgKnBId0RhdGEpCiB7CiAJc3RydWN0IHdiMzVfcmVnICpyZWcgPSAmcEh3RGF0YS0+cmVnOwotCXN0cnVjdCB3Yl91c2IgKnBXYlVzYiA9ICZwSHdEYXRhLT5XYlVzYjsKIAotCWlmICghcEh3RGF0YS0+U3VycHJpc2VSZW1vdmUKLQkgICAgJiYgKHBXYlVzYi0+RGV0ZWN0Q291bnQgfHwgcmVnLT5FUDB2bV9zdGF0ZSAhPSBWTV9TVE9QKSkKKwlpZiAoIXBId0RhdGEtPlN1cnByaXNlUmVtb3ZlICYmIHJlZy0+RVAwdm1fc3RhdGUgIT0gVk1fU1RPUCkKIAkJcmV0dXJuIGZhbHNlOwogCiAJcmV0dXJuIHRydWU7CkBAIC02MDgsMTUgKzYwNCw2IEBACiAJCQl9CiAJCQlicmVhazsKIAkJfQotCi0JCS8qIEFjdGl2ZSBzZW5kIG51bGwgcGFja2V0IHRvIGF2b2lkIEFQIGRpc2Nvbm5lY3QgKi8KLQkJaWYgKHBId0RhdGEtPkxFRF9MaW5rT24pIHsKLQkJCXBId0RhdGEtPk51bGxQYWNrZXRDb3VudCArPSBUaW1lSW50ZXJ2YWw7Ci0JCQlpZiAocEh3RGF0YS0+TnVsbFBhY2tldENvdW50ID49Ci0JCQkgICAgREVGQVVMVF9OVUxMX1BBQ0tFVF9DT1VOVCkgewotCQkJCXBId0RhdGEtPk51bGxQYWNrZXRDb3VudCA9IDA7Ci0JCQl9Ci0JCX0KIAl9CiAKIAlwSHdEYXRhLT50aW1lX2NvdW50ICs9IFRpbWVJbnRlcnZhbDsKQEAgLTY1MSwxMyArNjM4LDYgQEAKIAogCVNvZnR3YXJlU2V0ID0gaGFsX3NvZnR3YXJlX3NldChwSHdEYXRhKTsKIAotI2lmZGVmIFZlbmRvcjIKLQkvKiBUcnkgdG8gbWFrZSBzdXJlIHRoZSBFRVBST00gY29udGFpbiAqLwotCVNvZnR3YXJlU2V0ID4+PSA4OwotCWlmIChTb2Z0d2FyZVNldCAhPSAweDgyKQotCQlyZXR1cm4gZmFsc2U7Ci0jZW5kaWYKLQogCVdiMzVSeF9zdGFydChodyk7CiAJV2IzNVR4X0VQMlZNX3N0YXJ0KHByaXYpOwogCkBAIC03MzQsOSArNzE0LDcgQEAKIAl9CiAKIAlwcml2LT5zTG9jYWxQYXJhLmJBbnRlbm5hTm8gPSBoYWxfZ2V0X2FudGVubmFfbnVtYmVyKHBId0RhdGEpOwotI2lmZGVmIF9QRV9TVEFURV9EVU1QXwotCXByaW50aygiRHJpdmVyIGluaXQsIGFudGVubmEgbm8gPSAlZFxuIiwgcHNMT0NBTC0+YkFudGVubmFObyk7Ci0jZW5kaWYKKwlwcl9kZWJ1ZygiRHJpdmVyIGluaXQsIGFudGVubmEgbm8gPSAlZFxuIiwgcHJpdi0+c0xvY2FsUGFyYS5iQW50ZW5uYU5vKTsKIAloYWxfZ2V0X2h3X3JhZGlvX29mZihwSHdEYXRhKTsKIAogCS8qIFdhaXRpbmcgZm9yIEhBTCBzZXR0aW5nIE9LICovCkBAIC03NjksNyArNzQ3LDYgQEAKIAlzdHJ1Y3QgdXNiX2hvc3RfaW50ZXJmYWNlICppbnRlcmZhY2U7CiAJc3RydWN0IGllZWU4MDIxMV9odyAqZGV2OwogCXN0cnVjdCB3YnNvZnRfcHJpdiAqcHJpdjsKLQlzdHJ1Y3Qgd2JfdXNiICpwV2JVc2I7CiAJaW50IG5yLCBlcnI7CiAJdTMyIGx0bXA7CiAKQEAgLTgwMCwxNiArNzc3LDEzIEBACiAKIAlwcml2ID0gZGV2LT5wcml2OwogCi0JcFdiVXNiID0gJnByaXYtPnNId0RhdGEuV2JVc2I7Ci0JcFdiVXNiLT51ZGV2ID0gdWRldjsKKwlwcml2LT5zSHdEYXRhLnVkZXYgPSB1ZGV2OwogCiAJaW50ZXJmYWNlID0gaW50Zi0+Y3VyX2FsdHNldHRpbmc7CiAJZW5kcG9pbnQgPSAmaW50ZXJmYWNlLT5lbmRwb2ludFswXS5kZXNjOwogCi0JaWYgKGVuZHBvaW50WzJdLndNYXhQYWNrZXRTaXplID09IDUxMikgeworCWlmIChlbmRwb2ludFsyXS53TWF4UGFja2V0U2l6ZSA9PSA1MTIpCiAJCXByaW50aygiW3czNXVuZF0gV29ya2luZyBvbiBVU0IgMi4wXG4iKTsKLQkJcFdiVXNiLT5Jc1VzYjIwID0gMTsKLQl9CiAKIAllcnIgPSB3YjM1X2h3X2luaXQoZGV2KTsKIAlpZiAoZXJyKQpAQCAtODYwLDEzICs4MzQsOSBAQAogCiBzdGF0aWMgdm9pZCB3YjM1X2h3X2hhbHQoc3RydWN0IHdic29mdF9wcml2ICphZGFwdGVyKQogewotCU1kc19EZXN0cm95KGFkYXB0ZXIpOwotCiAJLyogVHVybiBvZmYgUnggYW5kIFR4IGhhcmR3YXJlIGFiaWxpdHkgKi8KIAloYWxfc3RvcCgmYWRhcHRlci0+c0h3RGF0YSk7Ci0jaWZkZWYgX1BFX1VTQl9JTklfRFVNUF8KLQlwcmludGsoIlt3MzV1bmRdIEhhbF9zdG9wIE8uSy5cbiIpOwotI2VuZGlmCisJcHJfZGVidWcoIlt3MzV1bmRdIEhhbF9zdG9wIE8uSy5cbiIpOwogCS8qIFdhaXRpbmcgSXJwIGNvbXBsZXRlZCAqLwogCW1zbGVlcCgxMDApOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC93YnVzYl9zLmggYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC93YnVzYl9zLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5NjFhZTUuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvd2J1c2Jfcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBDb3B5cmlnaHQgKGMpIDE5OTYtMjAwNCBXaW5ib25kIEVsZWN0cm9uaWMgQ29ycG9yYXRpb24KLSAqCi0gKiAgTW9kdWxlIE5hbWU6Ci0gKiAgICB3YnVzYl9zLmgKLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi0jaWZuZGVmIF9fV0lOQk9ORF9XQlVTQl9TX0gKLSNkZWZpbmUgX19XSU5CT05EX1dCVVNCX1NfSAotCi0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLQotc3RydWN0IHdiX3VzYiB7Ci0JdTMyCUlzVXNiMjA7Ci0Jc3RydWN0CXVzYl9kZXZpY2UgKnVkZXY7Ci0JdTMyCURldGVjdENvdW50OwotfTsKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvd2xfcGNpLmMgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi93bF9wY2kuYwppbmRleCAwMjBiMTdhLi4yOGFlOWRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi93bF9wY2kuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi93bF9wY2kuYwpAQCAtNDU4LDcgKzQ1OCw3IEBACiAgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilwY2lfZ2V0X2RydmRhdGEoIHBkZXYgKTsKKyAgICBkZXYgPSBwY2lfZ2V0X2RydmRhdGEoIHBkZXYgKTsKICAgICBpZiggZGV2ID09IE5VTEwgKSB7CiAgICAgICAgIERCR19FUlJPUiggRGJnSW5mbywgIkNvdWxkIG5vdCByZXRyaWV2ZSBuZXRfZGV2aWNlIHN0cnVjdHVyZVxuIiApOwogICAgICAgICByZXR1cm47CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi93bF9wcm9maWxlLmMgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi93bF9wcm9maWxlLmMKaW5kZXggN2ExMzM3ZC4uYTQ1OWU0OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvd2xfcHJvZmlsZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL3dsX3Byb2ZpbGUuYwpAQCAtMjQ4LDcgKzI0OCw3IEBACiAJCX0gZWxzZSB7CiAJCQlEQkdfVFJBQ0UoRGJnSW5mbywgIkYvVyBpbWFnZSBmaWxlIGZvdW5kXG4iKTsKICNkZWZpbmUgREhGX0FMTE9DX1NJWkUgOTYwMDAJCQkvKiBqdXN0IGJlbG93IDk2SywgbGV0J3MgaG9wZSBpdCBzdWZmaWNlcyBmb3Igbm93IGFuZCBmb3IgdGhlIGZ1dHVyZSAqLwotCQkJY3AgPSAoY2hhciAqKXZtYWxsb2MoREhGX0FMTE9DX1NJWkUpOworCQkJY3AgPSB2bWFsbG9jKERIRl9BTExPQ19TSVpFKTsKIAkJCWlmIChjcCA9PSBOVUxMKSB7CiAJCQkJREJHX0VSUk9SKERiZ0luZm8sICJlcnJvciBpbiB2bWFsbG9jXG4iKTsKIAkJCX0gZWxzZSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi93bF9zeXNmcy5jIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvd2xfc3lzZnMuYwppbmRleCBlNGM4ODA0Li45YjgzM2IzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi93bF9zeXNmcy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL3dsX3N5c2ZzLmMKQEAgLTQyLDcgKzQyLDcgQEAKICAgICBDRkdfSEVSTUVTX1RBTExJRVNfU1RSQ1QgdGFsbGllczsKICAgICBzc2l6ZV90IHJldCA9IC1FSU5WQUw7CiAKLSAgICByZWFkX2xvY2soJmRldl9iYXNlX2xvY2spOworICAgIHJjdV9yZWFkX2xvY2soKTsKICAgICBpZiAoZGV2X2lzYWxpdmUoZGV2KSkgewogCXdsX2xvY2sobHAsICZmbGFncyk7CiAKQEAgLTEwMiw3ICsxMDIsNyBAQAogCSAgICB9CiAgICAgfQogCi0gICAgcmVhZF91bmxvY2soJmRldl9iYXNlX2xvY2spOworICAgIHJjdV9yZWFkX3VubG9jaygpOwogICAgIHJldHVybiByZXQ7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMWNvbnYuYyBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMWNvbnYuYwppbmRleCA4Mzg3OWY5Li4xNDZmMzY1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFjb252LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExY29udi5jCkBAIC0xNDgsNyArMTQ4LDggQEAKIAogCQkJLyogdGFjayBvbiBTTkFQICovCiAJCQllX3NuYXAgPQotCQkJICAgIChzdHJ1Y3Qgd2xhbl9zbmFwICopIHNrYl9wdXNoKHNrYiwgc2l6ZW9mKHN0cnVjdCB3bGFuX3NuYXApKTsKKwkJCSAgICAoc3RydWN0IHdsYW5fc25hcCAqKSBza2JfcHVzaChza2IsCisJCQkJc2l6ZW9mKHN0cnVjdCB3bGFuX3NuYXApKTsKIAkJCWVfc25hcC0+dHlwZSA9IGh0b25zKHByb3RvKTsKIAkJCWlmIChldGhjb252ID09IFdMQU5fRVRIQ09OVl84MDIxaAogCQkJICAgICYmIHA4MDIxMV9zdHRfZmluZHByb3RvKHByb3RvKSkgewpAQCAtMTYxLDcgKzE2Miw4IEBACiAKIAkJCS8qIHRhY2sgb24gbGxjICovCiAJCQllX2xsYyA9Ci0JCQkgICAgKHN0cnVjdCB3bGFuX2xsYyAqKSBza2JfcHVzaChza2IsIHNpemVvZihzdHJ1Y3Qgd2xhbl9sbGMpKTsKKwkJCSAgICAoc3RydWN0IHdsYW5fbGxjICopIHNrYl9wdXNoKHNrYiwKKwkJCQlzaXplb2Yoc3RydWN0IHdsYW5fbGxjKSk7CiAJCQllX2xsYy0+ZHNhcCA9IDB4QUE7CS8qIFNOQVAsIHNlZSBJRUVFIDgwMiAqLwogCQkJZV9sbGMtPnNzYXAgPSAweEFBOwogCQkJZV9sbGMtPmN0bCA9IDB4MDM7CkBAIC0yOTcsMTAgKzI5OSwxMiBAQAogCWlmICgoV0xBTl9HRVRfRkNfVE9EUyhmYykgPT0gMCkgJiYgKFdMQU5fR0VUX0ZDX0ZST01EUyhmYykgPT0gMCkpIHsKIAkJbWVtY3B5KGRhZGRyLCB3X2hkci0+YTMuYTEsIFdMQU5fRVRIQUREUl9MRU4pOwogCQltZW1jcHkoc2FkZHIsIHdfaGRyLT5hMy5hMiwgV0xBTl9FVEhBRERSX0xFTik7Ci0JfSBlbHNlIGlmICgoV0xBTl9HRVRfRkNfVE9EUyhmYykgPT0gMCkgJiYgKFdMQU5fR0VUX0ZDX0ZST01EUyhmYykgPT0gMSkpIHsKKwl9IGVsc2UgaWYgKChXTEFOX0dFVF9GQ19UT0RTKGZjKSA9PSAwKQorCQkJJiYgKFdMQU5fR0VUX0ZDX0ZST01EUyhmYykgPT0gMSkpIHsKIAkJbWVtY3B5KGRhZGRyLCB3X2hkci0+YTMuYTEsIFdMQU5fRVRIQUREUl9MRU4pOwogCQltZW1jcHkoc2FkZHIsIHdfaGRyLT5hMy5hMywgV0xBTl9FVEhBRERSX0xFTik7Ci0JfSBlbHNlIGlmICgoV0xBTl9HRVRfRkNfVE9EUyhmYykgPT0gMSkgJiYgKFdMQU5fR0VUX0ZDX0ZST01EUyhmYykgPT0gMCkpIHsKKwl9IGVsc2UgaWYgKChXTEFOX0dFVF9GQ19UT0RTKGZjKSA9PSAxKQorCQkJJiYgKFdMQU5fR0VUX0ZDX0ZST01EUyhmYykgPT0gMCkpIHsKIAkJbWVtY3B5KGRhZGRyLCB3X2hkci0+YTMuYTMsIFdMQU5fRVRIQUREUl9MRU4pOwogCQltZW1jcHkoc2FkZHIsIHdfaGRyLT5hMy5hMiwgV0xBTl9FVEhBRERSX0xFTik7CiAJfSBlbHNlIHsKQEAgLTM0OSw3ICszNTMsOCBAQAogCiAJZV9sbGMgPSAoc3RydWN0IHdsYW5fbGxjICopIChza2ItPmRhdGEgKyBwYXlsb2FkX29mZnNldCk7CiAJZV9zbmFwID0KLQkgICAgKHN0cnVjdCB3bGFuX3NuYXAgKikgKHNrYi0+ZGF0YSArIHBheWxvYWRfb2Zmc2V0ICsgc2l6ZW9mKHN0cnVjdCB3bGFuX2xsYykpOworCSAgICAoc3RydWN0IHdsYW5fc25hcCAqKSAoc2tiLT5kYXRhICsgcGF5bG9hZF9vZmZzZXQgKworCQlzaXplb2Yoc3RydWN0IHdsYW5fbGxjKSk7CiAKIAkvKiBUZXN0IGZvciB0aGUgdmFyaW91cyBlbmNvZGluZ3MgKi8KIAlpZiAoKHBheWxvYWRfbGVuZ3RoID49IHNpemVvZihzdHJ1Y3Qgd2xhbl9ldGhoZHIpKSAmJgpAQCAtMzcyLDkgKzM3NywxMSBAQAogCQkvKiBjaG9wIG9mZiB0aGUgODAyLjExIENSQyAqLwogCQlza2JfdHJpbShza2IsIHNrYi0+bGVuIC0gV0xBTl9DUkNfTEVOKTsKIAotCX0gZWxzZSBpZiAoKHBheWxvYWRfbGVuZ3RoID49IHNpemVvZihzdHJ1Y3Qgd2xhbl9sbGMpICsgc2l6ZW9mKHN0cnVjdCB3bGFuX3NuYXApKQotCQkgICAmJiAoZV9sbGMtPmRzYXAgPT0gMHhhYSkgJiYgKGVfbGxjLT5zc2FwID09IDB4YWEpCi0JCSAgICYmIChlX2xsYy0+Y3RsID09IDB4MDMpCisJfSBlbHNlIGlmICgocGF5bG9hZF9sZW5ndGggPj0gc2l6ZW9mKHN0cnVjdCB3bGFuX2xsYykgKworCQlzaXplb2Yoc3RydWN0IHdsYW5fc25hcCkpCisJCSYmKGVfbGxjLT5kc2FwID09IDB4YWEpCisJCSYmIChlX2xsYy0+c3NhcCA9PSAweGFhKQorCQkmJiAoZV9sbGMtPmN0bCA9PSAweDAzKQogCQkgICAmJgogCQkgICAoKChtZW1jbXAoZV9zbmFwLT5vdWksIG91aV9yZmMxMDQyLCBXTEFOX0lFRUVfT1VJX0xFTikgPT0gMCkKIAkJICAgICAmJiAoZXRoY29udiA9PSBXTEFOX0VUSENPTlZfODAyMWgpCkBAIC00MDYsMjEgKzQxMywyNSBAQAogCQkvKiBjaG9wIG9mZiB0aGUgODAyLjExIENSQyAqLwogCQlza2JfdHJpbShza2IsIHNrYi0+bGVuIC0gV0xBTl9DUkNfTEVOKTsKIAotCX0gZWxzZSBpZiAoKHBheWxvYWRfbGVuZ3RoID49IHNpemVvZihzdHJ1Y3Qgd2xhbl9sbGMpICsgc2l6ZW9mKHN0cnVjdCB3bGFuX3NuYXApKQotCQkgICAmJiAoZV9sbGMtPmRzYXAgPT0gMHhhYSkgJiYgKGVfbGxjLT5zc2FwID09IDB4YWEpCi0JCSAgICYmIChlX2xsYy0+Y3RsID09IDB4MDMpKSB7CisJfSBlbHNlIGlmICgocGF5bG9hZF9sZW5ndGggPj0gc2l6ZW9mKHN0cnVjdCB3bGFuX2xsYykgKworCQlzaXplb2Yoc3RydWN0IHdsYW5fc25hcCkpCisJCSYmKGVfbGxjLT5kc2FwID09IDB4YWEpCisJCSYmIChlX2xsYy0+c3NhcCA9PSAweGFhKQorCQkmJiAoZV9sbGMtPmN0bCA9PSAweDAzKSkgewogCQlwcl9kZWJ1ZygiODAyLjFoL1JGQzEwNDIgbGVuOiAlZFxuIiwgcGF5bG9hZF9sZW5ndGgpOwotCQkvKiBpdCdzIGFuIDgwMi4xaCBmcmFtZSB8fCAoYW4gUkZDMTA0MiAmJiBwcm90b2NvbCBpcyBub3QgaW4gU1RUKSAqLwotCQkvKiBidWlsZCBhIERJWElJICsgUkZDODk0ICovCisJCS8qIGl0J3MgYW4gODAyLjFoIGZyYW1lIHx8IChhbiBSRkMxMDQyICYmIHByb3RvY29sIG5vdCBpbiBTVFQpCisJCSAgIGJ1aWxkIGEgRElYSUkgKyBSRkM4OTQgKi8KIAogCQkvKiBUZXN0IGZvciBhbiBvdmVybGVuZ3RoIGZyYW1lICovCi0JCWlmICgocGF5bG9hZF9sZW5ndGggLSBzaXplb2Yoc3RydWN0IHdsYW5fbGxjKSAtIHNpemVvZihzdHJ1Y3Qgd2xhbl9zbmFwKSkKLQkJICAgID4gbmV0ZGV2LT5tdHUpIHsKKwkJaWYgKChwYXlsb2FkX2xlbmd0aCAtIHNpemVvZihzdHJ1Y3Qgd2xhbl9sbGMpIC0KKwkJCXNpemVvZihzdHJ1Y3Qgd2xhbl9zbmFwKSkKKwkJCT4gbmV0ZGV2LT5tdHUpIHsKIAkJCS8qIEEgYm9ndXMgbGVuZ3RoIGV0aGZybSBoYXMgYmVlbiBzZW50LiAqLwogCQkJLyogSXMgc29tZW9uZSB0cnlpbmcgYW4gb2Zsb3cgYXR0YWNrPyAqLwogCQkJcHJpbnRrKEtFUk5fRVJSICJESVhJSSBmcmFtZSB0b28gbGFyZ2UgKCVsZCA+ICVkKVxuIiwKLQkJCSAgICAgICAobG9uZyBpbnQpKHBheWxvYWRfbGVuZ3RoIC0gc2l6ZW9mKHN0cnVjdCB3bGFuX2xsYykgLQotCQkJCQkgIHNpemVvZihzdHJ1Y3Qgd2xhbl9zbmFwKSksIG5ldGRldi0+bXR1KTsKKwkJCSAgICAgICAobG9uZyBpbnQpKHBheWxvYWRfbGVuZ3RoIC0KKwkJCQkJc2l6ZW9mKHN0cnVjdCB3bGFuX2xsYykgLQorCQkJCQlzaXplb2Yoc3RydWN0IHdsYW5fc25hcCkpLCBuZXRkZXYtPm10dSk7CiAJCQlyZXR1cm4gMTsKIAkJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFjb252LmggYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFjb252LmgKaW5kZXggZWNhMDM5MS4uZWE0OTNhYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExY29udi5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMWNvbnYuaApAQCAtNjYsMTIgKzY2LDE0IEBACiAjZGVmaW5lCVA4MDIxMV9GUk1NRVRBX01BR0lDCTB4ODAyMTEwCiAKICNkZWZpbmUgUDgwMjExU0tCX0ZSTU1FVEEocykgXAotCSgoKCgoc3RydWN0IHA4MDIxMV9mcm1tZXRhICopKChzKS0+Y2IpKS0+bWFnaWMpID09IFA4MDIxMV9GUk1NRVRBX01BR0lDKSA/IFwKKwkoKCgoKHN0cnVjdCBwODAyMTFfZnJtbWV0YSAqKSgocyktPmNiKSktPm1hZ2ljKSA9PSBcCisJCVA4MDIxMV9GUk1NRVRBX01BR0lDKSA/IFwKIAkJKChzdHJ1Y3QgcDgwMjExX2ZybW1ldGEgKikoKHMpLT5jYikpIDogXAogCQkoTlVMTCkpCiAKICNkZWZpbmUgUDgwMjExU0tCX1JYTUVUQShzKSBcCi0JKFA4MDIxMVNLQl9GUk1NRVRBKChzKSkgPyAgUDgwMjExU0tCX0ZSTU1FVEEoKHMpKS0+cnggOiAoKHN0cnVjdCBwODAyMTFfcnhtZXRhICopKE5VTEwpKSkKKwkoUDgwMjExU0tCX0ZSTU1FVEEoKHMpKSA/ICBQODAyMTFTS0JfRlJNTUVUQSgocykpLT5yeCA6IFwKKwkJKChzdHJ1Y3QgcDgwMjExX3J4bWV0YSAqKShOVUxMKSkpCiAKIHN0cnVjdCBwODAyMTFfcnhtZXRhIHsKIAlzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMW5ldGRldi5jIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExbmV0ZGV2LmMKaW5kZXggYjdiNGE3My4uYjBhZjI5MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExbmV0ZGV2LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExbmV0ZGV2LmMKQEAgLTMwMSw3ICszMDEsOCBAQAogCQkJCQlpZiAobWVtY21wCiAJCQkJCSAgICAoaGRyLT5hMSwgd2xhbmRldi0+bmV0ZGV2LT5kZXZfYWRkciwKIAkJCQkJICAgICBFVEhfQUxFTikgIT0gMCkgewotCQkJCQkJLyogYnV0IHJlamVjdCBhbnl0aGluZyBlbHNlIHRoYXQgaXNuJ3QgbXVsdGljYXN0ICovCisJCQkJCQkvKiBidXQgcmVqZWN0IGFueXRoaW5nIGVsc2UgdGhhdAorCQkJCQkJICAgaXNuJ3QgbXVsdGljYXN0ICovCiAJCQkJCQlpZiAoIShoZHItPmExWzBdICYgMHgwMSkpIHsKIAkJCQkJCQlkZXZfa2ZyZWVfc2tiKHNrYik7CiAJCQkJCQkJY29udGludWU7CkBAIC03NzAsNyArNzcxLDggQEAKIAl9CiAKIAkvKiBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSB0aGUgc3RydWN0IGRldmljZSAqLwotCW5ldGRldiA9IGFsbG9jX25ldGRldihzaXplb2Yoc3RydWN0IHdpcmVsZXNzX2RldiksICJ3bGFuJWQiLCBldGhlcl9zZXR1cCk7CisJbmV0ZGV2ID0gYWxsb2NfbmV0ZGV2KHNpemVvZihzdHJ1Y3Qgd2lyZWxlc3NfZGV2KSwgIndsYW4lZCIsCisJCQkJZXRoZXJfc2V0dXApOwogCWlmIChuZXRkZXYgPT0gTlVMTCkgewogCQlwcmludGsoS0VSTl9FUlIgIkZhaWxlZCB0byBhbGxvYyBuZXRkZXYuXG4iKTsKIAkJd2xhbl9mcmVlX3dpcGh5KHdpcGh5KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMW5ldGRldi5oIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExbmV0ZGV2LmgKaW5kZXggMWVjMzM3NC4uODU4ODQxNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExbmV0ZGV2LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExbmV0ZGV2LmgKQEAgLTk0LDExICs5NCwxMSBAQAogI2VuZGlmCiAKIC8qLS0tIE5TRCBDYXBhYmlsaXRpZXMgRmxhZ3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNkZWZpbmUgUDgwMjExX05TRENBUF9IQVJEV0FSRVdFUCAgICAgICAgICAgMHgwMQkvKiBoYXJkd2FyZSB3ZXAgZW5naW5lICovCi0jZGVmaW5lIFA4MDIxMV9OU0RDQVBfU0hPUlRfUFJFQU1CTEUgICAgICAgIDB4MTAJLyogaGFyZHdhcmUgc3VwcG9ydHMgKi8KLSNkZWZpbmUgUDgwMjExX05TRENBUF9IV0ZSQUdNRU5UICAgICAgICAgICAgMHg4MAkvKiBuc2QgaGFuZGxlcyBmcmFnL2RlZnJhZyAqLwotI2RlZmluZSBQODAyMTFfTlNEQ0FQX0FVVE9KT0lOICAgICAgICAgICAgICAweDEwMAkvKiBuc2QgZG9lcyBhdXRvam9pbiAqLwotI2RlZmluZSBQODAyMTFfTlNEQ0FQX05PU0NBTiAgICAgICAgICAgICAgICAweDIwMAkvKiBuc2QgY2FuIHNjYW4gKi8KKyNkZWZpbmUgUDgwMjExX05TRENBUF9IQVJEV0FSRVdFUCAgICAgICAgICAgMHgwMSAgLyogaGFyZHdhcmUgd2VwIGVuZ2luZSAqLworI2RlZmluZSBQODAyMTFfTlNEQ0FQX1NIT1JUX1BSRUFNQkxFICAgICAgICAweDEwICAvKiBoYXJkd2FyZSBzdXBwb3J0cyAqLworI2RlZmluZSBQODAyMTFfTlNEQ0FQX0hXRlJBR01FTlQgICAgICAgICAgICAweDgwICAvKiBuc2QgaGFuZGxlcyBmcmFnL2RlZnJhZyAqLworI2RlZmluZSBQODAyMTFfTlNEQ0FQX0FVVE9KT0lOICAgICAgICAgICAgICAweDEwMCAvKiBuc2QgZG9lcyBhdXRvam9pbiAqLworI2RlZmluZSBQODAyMTFfTlNEQ0FQX05PU0NBTiAgICAgICAgICAgICAgICAweDIwMCAvKiBuc2QgY2FuIHNjYW4gKi8KIAogLyogUmVjZWl2ZWQgZnJhbWUgc3RhdGlzdGljcyAqLwogdHlwZWRlZiBzdHJ1Y3QgcDgwMjExX2ZybXJ4X3QgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExdHlwZXMuaCBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMXR5cGVzLmgKaW5kZXggNDFhOTljNS4uOWRlYzg1OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExdHlwZXMuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTF0eXBlcy5oCkBAIC0xNDEsMTQgKzE0MSwxNCBAQAogI2RlZmluZSBQODAyMTFESURfTFNCX0lURU0JCSgxMikKICNkZWZpbmUgUDgwMjExRElEX0xTQl9JTkRFWAkJKDE4KQogI2RlZmluZSBQODAyMTFESURfTFNCX0lTVEFCTEUJCSgyNikKLSNkZWZpbmUgUDgwMjExRElEX0xTQl9BQ0NFU1MgCQkoMjcpCisjZGVmaW5lIFA4MDIxMURJRF9MU0JfQUNDRVNTCQkoMjcpCiAKICNkZWZpbmUgUDgwMjExRElEX01BU0tfU0VDVElPTgkJKDB4MDAwMDAwM2ZVTCkKICNkZWZpbmUgUDgwMjExRElEX01BU0tfR1JPVVAJCSgweDAwMDAwMDNmVUwpCiAjZGVmaW5lIFA4MDIxMURJRF9NQVNLX0lURU0JCSgweDAwMDAwMDNmVUwpCiAjZGVmaW5lIFA4MDIxMURJRF9NQVNLX0lOREVYCQkoMHgwMDAwMDBmZlVMKQogI2RlZmluZSBQODAyMTFESURfTUFTS19JU1RBQkxFCQkoMHgwMDAwMDAwMVVMKQotI2RlZmluZSBQODAyMTFESURfTUFTS19BQ0NFU1MgCQkoMHgwMDAwMDAwM1VMKQorI2RlZmluZSBQODAyMTFESURfTUFTS19BQ0NFU1MJCSgweDAwMDAwMDAzVUwpCiAKICNkZWZpbmUgUDgwMjExRElEX01LKGEsIG0sIGwpCSgoKCh1MzIpKGEpKSAmIChtKSkgPDwgKGwpKQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wcmlzbTJtZ210LmMgYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wcmlzbTJtZ210LmMKaW5kZXggMDQ1MTRhOC4uNjY3NWM4MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcHJpc20ybWdtdC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3ByaXNtMm1nbXQuYwpAQCAtMjEzLDggKzIxMyw4IEBACiAJCXUxNiB3b3JkYnVmWzE3XTsKIAogCQlyZXN1bHQgPSBoZmEzODR4X2RydnJfc2V0Y29uZmlnMTYoaHcsCi0JCQkJCQkgIEhGQTM4NHhfUklEX0NORlJPQU1JTkdNT0RFLAotCQkJCQkJICBIRkEzODR4X1JPQU1NT0RFX0hPU1RTQ0FOX0hPU1RST0FNKTsKKwkJCQkJSEZBMzg0eF9SSURfQ05GUk9BTUlOR01PREUsCisJCQkJCUhGQTM4NHhfUk9BTU1PREVfSE9TVFNDQU5fSE9TVFJPQU0pOwogCQlpZiAocmVzdWx0KSB7CiAJCQlwcmludGsoS0VSTl9FUlIKIAkJCSAgICAgICAic2V0Y29uZmlnKFJPQU1JTkdNT0RFKSBmYWlsZWQuIHJlc3VsdD0lZFxuIiwKQEAgLTI1OCw4ICsyNTgsOCBAQAogCQl9CiAJCS8qIGlic3Mgb3B0aW9ucyAqLwogCQlyZXN1bHQgPSBoZmEzODR4X2RydnJfc2V0Y29uZmlnMTYoaHcsCi0JCQkJCQkgIEhGQTM4NHhfUklEX0NSRUFURUlCU1MsCi0JCQkJCQkgIEhGQTM4NHhfQ1JFQVRFSUJTU19KT0lOQ1JFQVRFSUJTUyk7CisJCQkJCUhGQTM4NHhfUklEX0NSRUFURUlCU1MsCisJCQkJCUhGQTM4NHhfQ1JFQVRFSUJTU19KT0lOQ1JFQVRFSUJTUyk7CiAJCWlmIChyZXN1bHQpIHsKIAkJCXByaW50ayhLRVJOX0VSUiAiRmFpbGVkIHRvIHNldCBDUkVBVEVJQlNTLlxuIik7CiAJCQltc2ctPnJlc3VsdGNvZGUuZGF0YSA9CkBAIC00MTYsNyArNDE2LDggQEAKICNkZWZpbmUgUkVRQkFTSUNSQVRFKE4pIFwKIAlpZiAoKGNvdW50ID49IE4pICYmIERPVDExX1JBVEU1X0lTQkFTSUNfR0VUKGl0ZW0tPnN1cHByYXRlc1soTiktMV0pKSB7IFwKIAkJcmVxLT5iYXNpY3JhdGUgIyMgTiAuZGF0YSA9IGl0ZW0tPnN1cHByYXRlc1soTiktMV07IFwKLQkJcmVxLT5iYXNpY3JhdGUgIyMgTiAuc3RhdHVzID0gUDgwMjExRU5VTV9tc2dpdGVtX3N0YXR1c19kYXRhX29rOyBcCisJCXJlcS0+YmFzaWNyYXRlICMjIE4gLnN0YXR1cyA9IFwKKwkJCVA4MDIxMUVOVU1fbXNnaXRlbV9zdGF0dXNfZGF0YV9vazsgXAogCX0KIAogCVJFUUJBU0lDUkFURSgxKTsKQEAgLTQzMSw3ICs0MzIsOCBAQAogI2RlZmluZSBSRVFTVVBQUkFURShOKSBcCiAJaWYgKGNvdW50ID49IE4pIHsgXAogCQlyZXEtPnN1cHByYXRlICMjIE4gLmRhdGEgPSBpdGVtLT5zdXBwcmF0ZXNbKE4pLTFdOyBcCi0JCXJlcS0+c3VwcHJhdGUgIyMgTiAuc3RhdHVzID0gUDgwMjExRU5VTV9tc2dpdGVtX3N0YXR1c19kYXRhX29rOyBcCisJCXJlcS0+c3VwcHJhdGUgIyMgTiAuc3RhdHVzID0gXAorCQkJUDgwMjExRU5VTV9tc2dpdGVtX3N0YXR1c19kYXRhX29rOyBcCiAJfQogCiAJUkVRU1VQUFJBVEUoMSk7CkBAIC0xMTAyLDcgKzExMDQsNyBAQAogCQlyZXN1bHQgPSBoZmEzODR4X2RydnJfZGlzYWJsZShodywgMCk7CiAJCWlmIChyZXN1bHQpIHsKIAkJCXByX2RlYnVnCi0JCQkgICAgKCJmYWlsZWQgdG8gZGlzYWJsZSBwb3J0IDAgYWZ0ZXIgc25pZmZpbmcsIHJlc3VsdD0lZFxuIiwKKwkJCSgiZmFpbGVkIHRvIGRpc2FibGUgcG9ydCAwIGFmdGVyIHNuaWZmaW5nLCByZXN1bHQ9JWRcbiIsCiAJCQkgICAgIHJlc3VsdCk7CiAJCQlnb3RvIGZhaWxlZDsKIAkJfQpAQCAtMTEzNyw3ICsxMTM5LDcgQEAKIAkJCXJlc3VsdCA9IGhmYTM4NHhfZHJ2cl9lbmFibGUoaHcsIDApOwogCQkJaWYgKHJlc3VsdCkgewogCQkJCXByX2RlYnVnCi0JCQkJICAgICgiZmFpbGVkIHRvIGVuYWJsZSBwb3J0IHRvIHByZXNuaWZmIHNldHRpbmcsIHJlc3VsdD0lZFxuIiwKKwkJCQkoImZhaWxlZCB0byBlbmFibGUgcG9ydCB0byBwcmVzbmlmZiBzZXR0aW5nLCByZXN1bHQ9JWRcbiIsCiAJCQkJICAgICByZXN1bHQpOwogCQkJCWdvdG8gZmFpbGVkOwogCQkJfQpAQCAtMTE2MSw3ICsxMTYzLDcgQEAKIAkJCQkJCSAgJihody0+cHJlc25pZmZfcG9ydF90eXBlKSk7CiAJCQkJaWYgKHJlc3VsdCkgewogCQkJCQlwcl9kZWJ1ZwotCQkJCQkgICAgKCJmYWlsZWQgdG8gcmVhZCBwb3J0dHlwZSwgcmVzdWx0PSVkXG4iLAorCQkJCQkoImZhaWxlZCB0byByZWFkIHBvcnR0eXBlLCByZXN1bHQ9JWRcbiIsCiAJCQkJCSAgICAgcmVzdWx0KTsKIAkJCQkJZ290byBmYWlsZWQ7CiAJCQkJfQpAQCAtMTE3MSw3ICsxMTczLDcgQEAKIAkJCQkJCSAgJihody0+cHJlc25pZmZfd2VwZmxhZ3MpKTsKIAkJCQlpZiAocmVzdWx0KSB7CiAJCQkJCXByX2RlYnVnCi0JCQkJCSAgICAoImZhaWxlZCB0byByZWFkIHdlcGZsYWdzLCByZXN1bHQ9JWRcbiIsCisJCQkJCSgiZmFpbGVkIHRvIHJlYWQgd2VwZmxhZ3MsIHJlc3VsdD0lZFxuIiwKIAkJCQkJICAgICByZXN1bHQpOwogCQkJCQlnb3RvIGZhaWxlZDsKIAkJCQl9CkBAIC0xMjM4LDggKzEyNDAsOCBAQAogCiAJCQlpZiAocmVzdWx0KSB7CiAJCQkJcHJfZGVidWcKLQkJCQkgICAgKCJmYWlsZWQgdG8gc2V0IHdlcGZsYWdzPTB4JTA0eCwgcmVzdWx0PSVkXG4iLAotCQkJCSAgICAgd29yZCwgcmVzdWx0KTsKKwkJCQkgICgiZmFpbGVkIHRvIHNldCB3ZXBmbGFncz0weCUwNHgsIHJlc3VsdD0lZFxuIiwKKwkJCQkgICB3b3JkLCByZXN1bHQpOwogCQkJCWdvdG8gZmFpbGVkOwogCQkJfQogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcveGdpZmIvWEdJX21haW5fMjYuYyBiL2RyaXZlcnMvc3RhZ2luZy94Z2lmYi9YR0lfbWFpbl8yNi5jCmluZGV4IDRmNzNkMDkuLmVlMDA4ZTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy94Z2lmYi9YR0lfbWFpbl8yNi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy94Z2lmYi9YR0lfbWFpbl8yNi5jCkBAIC00NzIsOSArNDcyLDExIEBACiAJCQlicmVhazsKIAkJfQogCi0JCXBkZXYgPSBwY2lfZmluZF9kZXZpY2UoUENJX1ZFTkRPUl9JRF9TSSwgbmJyaWRnZV9pZCwgcGRldik7Ci0JCWlmIChwZGV2KQorCQlwZGV2ID0gcGNpX2dldF9kZXZpY2UoUENJX1ZFTkRPUl9JRF9TSSwgbmJyaWRnZV9pZCwgcGRldik7CisJCWlmIChwZGV2KSB7CiAJCQl2YWxpZF9wZGV2ID0gMTsKKwkJCXBjaV9kZXZfcHV0KHBkZXYpOworCQl9CiAJfQogCiAJaWYgKCF2YWxpZF9wZGV2KSB7CkBAIC0yMTc4LDggKzIxODAsNyBAQAogCiAjaWZuZGVmIEFHUE9GRgogCWlmIChYR0lmYl9xdWV1ZW1vZGUgPT0gQUdQX0NNRF9RVUVVRSkgewotCQlhZ3BfaW5mbyA9IHZtYWxsb2Moc2l6ZW9mKCphZ3BfaW5mbykpOwotCQltZW1zZXQoKHZvaWQgKilhZ3BfaW5mbywgMHgwMCwgc2l6ZW9mKCphZ3BfaW5mbykpOworCQlhZ3BfaW5mbyA9IHZ6YWxsb2Moc2l6ZW9mKCphZ3BfaW5mbykpOwogCQlhZ3BfY29weV9pbmZvKGFncF9pbmZvKTsKIAogCQlhZ3BfYmFja2VuZF9hY3F1aXJlKCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvenJhbS94dm1hbGxvYy5jIGIvZHJpdmVycy9zdGFnaW5nL3pyYW0veHZtYWxsb2MuYwppbmRleCAzZmRiYjhhLi5iNjQ0MDY3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvenJhbS94dm1hbGxvYy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy96cmFtL3h2bWFsbG9jLmMKQEAgLTE4Nyw3ICsxODcsNyBAQAogCXNsaW5kZXggPSBnZXRfaW5kZXhfZm9yX2luc2VydChibG9jay0+c2l6ZSk7CiAJZmxpbmRleCA9IHNsaW5kZXggLyBCSVRTX1BFUl9MT05HOwogCi0JYmxvY2stPmxpbmsucHJldl9wYWdlID0gMDsKKwlibG9jay0+bGluay5wcmV2X3BhZ2UgPSBOVUxMOwogCWJsb2NrLT5saW5rLnByZXZfb2Zmc2V0ID0gMDsKIAlibG9jay0+bGluay5uZXh0X3BhZ2UgPSBwb29sLT5mcmVlbGlzdFtzbGluZGV4XS5wYWdlOwogCWJsb2NrLT5saW5rLm5leHRfb2Zmc2V0ID0gcG9vbC0+ZnJlZWxpc3Rbc2xpbmRleF0ub2Zmc2V0OwpAQCAtMjE3LDcgKzIxNyw3IEBACiAKIAlwb29sLT5mcmVlbGlzdFtzbGluZGV4XS5wYWdlID0gYmxvY2stPmxpbmsubmV4dF9wYWdlOwogCXBvb2wtPmZyZWVsaXN0W3NsaW5kZXhdLm9mZnNldCA9IGJsb2NrLT5saW5rLm5leHRfb2Zmc2V0OwotCWJsb2NrLT5saW5rLnByZXZfcGFnZSA9IDA7CisJYmxvY2stPmxpbmsucHJldl9wYWdlID0gTlVMTDsKIAlibG9jay0+bGluay5wcmV2X29mZnNldCA9IDA7CiAKIAlpZiAoIXBvb2wtPmZyZWVsaXN0W3NsaW5kZXhdLnBhZ2UpIHsKQEAgLTIzMiw3ICsyMzIsNyBAQAogCQkgKi8KIAkJdG1wYmxvY2sgPSBnZXRfcHRyX2F0b21pYyhwb29sLT5mcmVlbGlzdFtzbGluZGV4XS5wYWdlLAogCQkJCXBvb2wtPmZyZWVsaXN0W3NsaW5kZXhdLm9mZnNldCwgS01fVVNFUjEpOwotCQl0bXBibG9jay0+bGluay5wcmV2X3BhZ2UgPSAwOworCQl0bXBibG9jay0+bGluay5wcmV2X3BhZ2UgPSBOVUxMOwogCQl0bXBibG9jay0+bGluay5wcmV2X29mZnNldCA9IDA7CiAJCXB1dF9wdHJfYXRvbWljKHRtcGJsb2NrLCBLTV9VU0VSMSk7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3pyYW0venJhbV9kcnYuYyBiL2RyaXZlcnMvc3RhZ2luZy96cmFtL3pyYW1fZHJ2LmMKaW5kZXggZDBlOWUwMi4uNTQxNTcxMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3pyYW0venJhbV9kcnYuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvenJhbS96cmFtX2Rydi5jCkBAIC01MjcsNyArNTI3LDcgQEAKIAl9CiAKIAludW1fcGFnZXMgPSB6cmFtLT5kaXNrc2l6ZSA+PiBQQUdFX1NISUZUOwotCXpyYW0tPnRhYmxlID0gdm1hbGxvYyhudW1fcGFnZXMgKiBzaXplb2YoKnpyYW0tPnRhYmxlKSk7CisJenJhbS0+dGFibGUgPSB2emFsbG9jKG51bV9wYWdlcyAqIHNpemVvZigqenJhbS0+dGFibGUpKTsKIAlpZiAoIXpyYW0tPnRhYmxlKSB7CiAJCXByX2VycigiRXJyb3IgYWxsb2NhdGluZyB6cmFtIGFkZHJlc3MgdGFibGVcbiIpOwogCQkvKiBUbyBwcmV2ZW50IGFjY2Vzc2luZyB0YWJsZSBlbnRyaWVzIGR1cmluZyBjbGVhbnVwICovCkBAIC01MzUsNyArNTM1LDYgQEAKIAkJcmV0ID0gLUVOT01FTTsKIAkJZ290byBmYWlsOwogCX0KLQltZW1zZXQoenJhbS0+dGFibGUsIDAsIG51bV9wYWdlcyAqIHNpemVvZigqenJhbS0+dGFibGUpKTsKIAogCXNldF9jYXBhY2l0eSh6cmFtLT5kaXNrLCB6cmFtLT5kaXNrc2l6ZSA+PiBTRUNUT1JfU0hJRlQpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jb3JlL2RyaXZlci5jIGIvZHJpdmVycy91c2IvY29yZS9kcml2ZXIuYwppbmRleCBiOTI3OGExLi5mY2E2MTcyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jb3JlL2RyaXZlci5jCisrKyBiL2RyaXZlcnMvdXNiL2NvcmUvZHJpdmVyLmMKQEAgLTM3NSw3ICszNzUsNyBAQAogCQkgKiBKdXN0IHJlLWVuYWJsZSBpdCB3aXRob3V0IGFmZmVjdGluZyB0aGUgZW5kcG9pbnQgdG9nZ2xlcy4KIAkJICovCiAJCXVzYl9lbmFibGVfaW50ZXJmYWNlKHVkZXYsIGludGYsIGZhbHNlKTsKLQl9IGVsc2UgaWYgKCFlcnJvciAmJiBpbnRmLT5kZXYucG93ZXIuc3RhdHVzID09IERQTV9PTikgeworCX0gZWxzZSBpZiAoIWVycm9yICYmICFpbnRmLT5kZXYucG93ZXIuaW5fc3VzcGVuZCkgewogCQlyID0gdXNiX3NldF9pbnRlcmZhY2UodWRldiwgaW50Zi0+YWx0c2V0dGluZ1swXS4KIAkJCQlkZXNjLmJJbnRlcmZhY2VOdW1iZXIsIDApOwogCQlpZiAociA8IDApCkBAIC05NjAsNyArOTYwLDcgQEAKIAl9CiAKIAkvKiBUcnkgdG8gcmViaW5kIHRoZSBpbnRlcmZhY2UgKi8KLQlpZiAoaW50Zi0+ZGV2LnBvd2VyLnN0YXR1cyA9PSBEUE1fT04pIHsKKwlpZiAoIWludGYtPmRldi5wb3dlci5pbl9zdXNwZW5kKSB7CiAJCWludGYtPm5lZWRzX2JpbmRpbmcgPSAwOwogCQlyYyA9IGRldmljZV9hdHRhY2goJmludGYtPmRldik7CiAJCWlmIChyYyA8IDApCkBAIC0xMTA3LDggKzExMDcsNyBAQAogCWlmIChpbnRmLT5jb25kaXRpb24gPT0gVVNCX0lOVEVSRkFDRV9VTkJPVU5EKSB7CiAKIAkJLyogQ2Fycnkgb3V0IGEgZGVmZXJyZWQgc3dpdGNoIHRvIGFsdHNldHRpbmcgMCAqLwotCQlpZiAoaW50Zi0+bmVlZHNfYWx0c2V0dGluZzAgJiYKLQkJCQlpbnRmLT5kZXYucG93ZXIuc3RhdHVzID09IERQTV9PTikgeworCQlpZiAoaW50Zi0+bmVlZHNfYWx0c2V0dGluZzAgJiYgIWludGYtPmRldi5wb3dlci5pbl9zdXNwZW5kKSB7CiAJCQl1c2Jfc2V0X2ludGVyZmFjZSh1ZGV2LCBpbnRmLT5hbHRzZXR0aW5nWzBdLgogCQkJCQlkZXNjLmJJbnRlcmZhY2VOdW1iZXIsIDApOwogCQkJaW50Zi0+bmVlZHNfYWx0c2V0dGluZzAgPSAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbXVzYi9tdXNiX2RlYnVnZnMuYyBiL2RyaXZlcnMvdXNiL211c2IvbXVzYl9kZWJ1Z2ZzLmMKaW5kZXggOWU4NjM5ZC4uYjAxNzZlNCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbXVzYi9tdXNiX2RlYnVnZnMuYworKysgYi9kcml2ZXJzL3VzYi9tdXNiL211c2JfZGVidWdmcy5jCkBAIC0zNiw3ICszNiw2IEBACiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgotI2luY2x1ZGUgPGxpbnV4L2tvYmplY3QuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9vcHRpb24uYyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9vcHRpb24uYwppbmRleCBjZGZiMTg2Li43NDg3NzgyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvb3B0aW9uLmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL29wdGlvbi5jCkBAIC02MTUsNyArNjE1LDYgQEAKIAl7IFVTQl9ERVZJQ0VfQU5EX0lOVEVSRkFDRV9JTkZPKFpURV9WRU5ET1JfSUQsIDB4MDAwNCwgMHhmZiwgMHhmZiwgMHhmZikgfSwKIAl7IFVTQl9ERVZJQ0VfQU5EX0lOVEVSRkFDRV9JTkZPKFpURV9WRU5ET1JfSUQsIDB4MDAwNSwgMHhmZiwgMHhmZiwgMHhmZikgfSwKIAl7IFVTQl9ERVZJQ0VfQU5EX0lOVEVSRkFDRV9JTkZPKFpURV9WRU5ET1JfSUQsIDB4MDAwNiwgMHhmZiwgMHhmZiwgMHhmZikgfSwKLQl7IFVTQl9ERVZJQ0VfQU5EX0lOVEVSRkFDRV9JTkZPKFpURV9WRU5ET1JfSUQsIDB4MDAwNywgMHhmZiwgMHhmZiwgMHhmZikgfSwKIAl7IFVTQl9ERVZJQ0VfQU5EX0lOVEVSRkFDRV9JTkZPKFpURV9WRU5ET1JfSUQsIDB4MDAwOCwgMHhmZiwgMHhmZiwgMHhmZikgfSwKIAl7IFVTQl9ERVZJQ0VfQU5EX0lOVEVSRkFDRV9JTkZPKFpURV9WRU5ET1JfSUQsIDB4MDAwOSwgMHhmZiwgMHhmZiwgMHhmZikgfSwKIAl7IFVTQl9ERVZJQ0VfQU5EX0lOVEVSRkFDRV9JTkZPKFpURV9WRU5ET1JfSUQsIDB4MDAwYSwgMHhmZiwgMHhmZiwgMHhmZikgfSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vdWRsZmIuYyBiL2RyaXZlcnMvdmlkZW8vdWRsZmIuYwppbmRleCAwMjA1ODlhLi4yYzgzNjRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3VkbGZiLmMKKysrIGIvZHJpdmVycy92aWRlby91ZGxmYi5jCkBAIC0xMTI4LDE0ICsxMTI4LDEzIEBACiAJCSAqIEJ1dCB3aXRoIGltcGVyZmVjdCBkYW1hZ2UgaW5mbyB3ZSBtYXkgc2VuZCBwaXhlbHMgb3ZlciBVU0IKIAkJICogdGhhdCB3ZXJlLCBpbiBmYWN0LCB1bmNoYW5nZWQgLSB3YXN0aW5nIGxpbWl0ZWQgVVNCIGJhbmR3aWR0aAogCQkgKi8KLQkJbmV3X2JhY2sgPSB2bWFsbG9jKG5ld19sZW4pOworCQluZXdfYmFjayA9IHZ6YWxsb2MobmV3X2xlbik7CiAJCWlmICghbmV3X2JhY2spCi0JCQlwcl9pbmZvKCJObyBzaGFkb3cvYmFja2luZyBidWZmZXIgYWxsY29hdGVkXG4iKTsKKwkJCXByX2luZm8oIk5vIHNoYWRvdy9iYWNraW5nIGJ1ZmZlciBhbGxvY2F0ZWRcbiIpOwogCQllbHNlIHsKIAkJCWlmIChkZXYtPmJhY2tpbmdfYnVmZmVyKQogCQkJCXZmcmVlKGRldi0+YmFja2luZ19idWZmZXIpOwogCQkJZGV2LT5iYWNraW5nX2J1ZmZlciA9IG5ld19iYWNrOwotCQkJbWVtc2V0KGRldi0+YmFja2luZ19idWZmZXIsIDAsIG5ld19sZW4pOwogCQl9CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL3hlbi1mYmZyb250LmMgYi9kcml2ZXJzL3ZpZGVvL3hlbi1mYmZyb250LmMKaW5kZXggNGFiYjBiOS4uM2U2OTM0ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby94ZW4tZmJmcm9udC5jCisrKyBiL2RyaXZlcnMvdmlkZW8veGVuLWZiZnJvbnQuYwpAQCAtNTYyLDI2ICs1NjIsMjQgQEAKIHN0YXRpYyBpbnQgeGVuZmJfY29ubmVjdF9iYWNrZW5kKHN0cnVjdCB4ZW5idXNfZGV2aWNlICpkZXYsCiAJCQkJIHN0cnVjdCB4ZW5mYl9pbmZvICppbmZvKQogewotCWludCByZXQsIGV2dGNobjsKKwlpbnQgcmV0LCBldnRjaG4sIGlycTsKIAlzdHJ1Y3QgeGVuYnVzX3RyYW5zYWN0aW9uIHhidDsKIAogCXJldCA9IHhlbmJ1c19hbGxvY19ldnRjaG4oZGV2LCAmZXZ0Y2huKTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwotCXJldCA9IGJpbmRfZXZ0Y2huX3RvX2lycWhhbmRsZXIoZXZ0Y2huLCB4ZW5mYl9ldmVudF9oYW5kbGVyLAorCWlycSA9IGJpbmRfZXZ0Y2huX3RvX2lycWhhbmRsZXIoZXZ0Y2huLCB4ZW5mYl9ldmVudF9oYW5kbGVyLAogCQkJCQkwLCBkZXYtPmRldmljZXR5cGUsIGluZm8pOwotCWlmIChyZXQgPCAwKSB7CisJaWYgKGlycSA8IDApIHsKIAkJeGVuYnVzX2ZyZWVfZXZ0Y2huKGRldiwgZXZ0Y2huKTsKIAkJeGVuYnVzX2Rldl9mYXRhbChkZXYsIHJldCwgImJpbmRfZXZ0Y2huX3RvX2lycWhhbmRsZXIiKTsKLQkJcmV0dXJuIHJldDsKKwkJcmV0dXJuIGlycTsKIAl9Ci0JaW5mby0+aXJxID0gcmV0OwotCiAgYWdhaW46CiAJcmV0ID0geGVuYnVzX3RyYW5zYWN0aW9uX3N0YXJ0KCZ4YnQpOwogCWlmIChyZXQpIHsKIAkJeGVuYnVzX2Rldl9mYXRhbChkZXYsIHJldCwgInN0YXJ0aW5nIHRyYW5zYWN0aW9uIik7Ci0JCXJldHVybiByZXQ7CisJCWdvdG8gdW5iaW5kX2lycTsKIAl9CiAJcmV0ID0geGVuYnVzX3ByaW50Zih4YnQsIGRldi0+bm9kZW5hbWUsICJwYWdlLXJlZiIsICIlbHUiLAogCQkJICAgIHZpcnRfdG9fbWZuKGluZm8tPnBhZ2UpKTsKQEAgLTYwMywyMCArNjAxLDI1IEBACiAJCWlmIChyZXQgPT0gLUVBR0FJTikKIAkJCWdvdG8gYWdhaW47CiAJCXhlbmJ1c19kZXZfZmF0YWwoZGV2LCByZXQsICJjb21wbGV0aW5nIHRyYW5zYWN0aW9uIik7Ci0JCXJldHVybiByZXQ7CisJCWdvdG8gdW5iaW5kX2lycTsKIAl9CiAKIAl4ZW5idXNfc3dpdGNoX3N0YXRlKGRldiwgWGVuYnVzU3RhdGVJbml0aWFsaXNlZCk7CisJaW5mby0+aXJxID0gaXJxOwogCXJldHVybiAwOwogCiAgZXJyb3JfeGVuYnVzOgogCXhlbmJ1c190cmFuc2FjdGlvbl9lbmQoeGJ0LCAxKTsKIAl4ZW5idXNfZGV2X2ZhdGFsKGRldiwgcmV0LCAid3JpdGluZyB4ZW5zdG9yZSIpOworIHVuYmluZF9pcnE6CisJdW5iaW5kX2Zyb21faXJxaGFuZGxlcihpcnEsIGluZm8pOwogCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyB2b2lkIHhlbmZiX2Rpc2Nvbm5lY3RfYmFja2VuZChzdHJ1Y3QgeGVuZmJfaW5mbyAqaW5mbykKIHsKKwkvKiBQcmV2ZW50IHhlbmZiIHJlZnJlc2ggKi8KKwlpbmZvLT51cGRhdGVfd2FudGVkID0gMDsKIAlpZiAoaW5mby0+aXJxID49IDApCiAJCXVuYmluZF9mcm9tX2lycWhhbmRsZXIoaW5mby0+aXJxLCBpbmZvKTsKIAlpbmZvLT5pcnEgPSAtMTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvd2F0Y2hkb2cvaHB3ZHQuYyBiL2RyaXZlcnMvd2F0Y2hkb2cvaHB3ZHQuYwppbmRleCBkZWE3YjViLi4yNGI5NjZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3dhdGNoZG9nL2hwd2R0LmMKKysrIGIvZHJpdmVycy93YXRjaGRvZy9ocHdkdC5jCkBAIC00NjksNyArNDY5LDcgQEAKIAl1bnNpZ25lZCBsb25nIHJvbV9wbDsKIAlzdGF0aWMgaW50IGRpZV9ubWlfY2FsbGVkOwogCi0JaWYgKHVsUmVhc29uICE9IERJRV9OTUkgJiYgdWxSZWFzb24gIT0gRElFX05NSV9JUEkpCisJaWYgKHVsUmVhc29uICE9IERJRV9OTUlVTktOT1dOKQogCQlnb3RvIG91dDsKIAogCWlmICghaHB3ZHRfbm1pX2RlY29kaW5nKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy94ZW4vZXZlbnRzLmMgYi9kcml2ZXJzL3hlbi9ldmVudHMuYwppbmRleCA2NWY4NjM3Li43NDY4MTQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3hlbi9ldmVudHMuYworKysgYi9kcml2ZXJzL3hlbi9ldmVudHMuYwpAQCAtMTcwLDYgKzE3MCw5IEBACiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgZXZ0Y2huX2Zyb21faXJxKHVuc2lnbmVkIGlycSkKIHsKKwlpZiAodW5saWtlbHkoV0FSTihpcnEgPCAwIHx8IGlycSA+PSBucl9pcnFzLCAiSW52YWxpZCBpcnEgJWQhXG4iLCBpcnEpKSkKKwkJcmV0dXJuIDA7CisKIAlyZXR1cm4gaW5mb19mb3JfaXJxKGlycSktPmV2dGNobjsKIH0KIApAQCAtNDA1LDE1ICs0MDgsMjEgQEAKIHsKIAlzdHJ1Y3QgaXJxX2RhdGEgKmRhdGE7CiAJaW50IGlycSwgcmVzOwotCWludCBzdGFydCA9IGdldF9ucl9od19pcnFzKCk7CisJaW50IGJvdHRvbSA9IGdldF9ucl9od19pcnFzKCk7CisJaW50IHRvcCA9IG5yX2lycXMtMTsKIAotCWlmIChzdGFydCA9PSBucl9pcnFzKQorCWlmIChib3R0b20gPT0gbnJfaXJxcykKIAkJZ290byBub19pcnFzOwogCi0JLyogbnJfaXJxcyBpcyBhIG1hZ2ljIHZhbHVlLiBNdXN0IG5vdCB1c2UgaXQuKi8KLQlmb3IgKGlycSA9IG5yX2lycXMtMTsgaXJxID4gc3RhcnQ7IGlycS0tKSB7CisJLyogVGhpcyBsb29wIHN0YXJ0cyBmcm9tIHRoZSB0b3Agb2YgSVJRIHNwYWNlIGFuZCBnb2VzIGRvd24uCisJICogV2UgbmVlZCB0aGlzIGIvYyBpZiB3ZSBoYXZlIGEgUENJIGRldmljZSBpbiBhIFhlbiBQViBndWVzdAorCSAqIHdlIGRvIG5vdCBoYXZlIGFuIElPLUFQSUMgKHRob3VnaCB0aGUgYmFja2VuZCBtaWdodCBoYXZlIHRoZW0pCisJICogbWFwcGVkIGluLiBUbyBub3QgaGF2ZSBhIGNvbGxpc2lvbiBvZiBwaHlzaWNhbCBJUlFzIHdpdGggdGhlIFhlbgorCSAqIGV2ZW50IGNoYW5uZWxzIHN0YXJ0IGF0IHRoZSB0b3Agb2YgdGhlIElSUSBzcGFjZSBmb3IgdmlydHVhbCBJUlFzLgorCSAqLworCWZvciAoaXJxID0gdG9wOyBpcnEgPiBib3R0b207IGlycS0tKSB7CiAJCWRhdGEgPSBpcnFfZ2V0X2lycV9kYXRhKGlycSk7Ci0JCS8qIG9ubHkgMC0+MTUgaGF2ZSBpbml0J2QgZGVzYzsgaGFuZGxlIGlycSA+IDE2ICovCisJCS8qIG9ubHkgMTUtPjAgaGF2ZSBpbml0J2QgZGVzYzsgaGFuZGxlIGlycSA+IDE2ICovCiAJCWlmICghZGF0YSkKIAkJCWJyZWFrOwogCQlpZiAoZGF0YS0+Y2hpcCA9PSAmbm9faXJxX2NoaXApCkBAIC00MjQsNyArNDMzLDcgQEAKIAkJCXJldHVybiBpcnE7CiAJfQogCi0JaWYgKGlycSA9PSBzdGFydCkKKwlpZiAoaXJxID09IGJvdHRvbSkKIAkJZ290byBub19pcnFzOwogCiAJcmVzID0gaXJxX2FsbG9jX2Rlc2NfYXQoaXJxLCAtMSk7CmRpZmYgLS1naXQgYS9mcy85cC9LY29uZmlnIGIvZnMvOXAvS2NvbmZpZwppbmRleCA3ZTA1MTE0Li44MTRhYzRlIDEwMDY0NAotLS0gYS9mcy85cC9LY29uZmlnCisrKyBiL2ZzLzlwL0tjb25maWcKQEAgLTksNiArOSw4IEBACiAKIAkgIElmIHVuc3VyZSwgc2F5IE4uCiAKK2lmIDlQX0ZTCisKIGNvbmZpZyA5UF9GU0NBQ0hFCiAJYm9vbCAiRW5hYmxlIDlQIGNsaWVudCBjYWNoaW5nIHN1cHBvcnQgKEVYUEVSSU1FTlRBTCkiCiAJZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwKQEAgLTIwLDcgKzIyLDYgQEAKIAogY29uZmlnIDlQX0ZTX1BPU0lYX0FDTAogCWJvb2wgIjlQIFBPU0lYIEFjY2VzcyBDb250cm9sIExpc3RzIgotCWRlcGVuZHMgb24gOVBfRlMKIAlzZWxlY3QgRlNfUE9TSVhfQUNMCiAJaGVscAogCSAgUE9TSVggQWNjZXNzIENvbnRyb2wgTGlzdHMgKEFDTHMpIHN1cHBvcnQgcGVybWlzc2lvbnMgZm9yIHVzZXJzIGFuZApAQCAtMzAsMyArMzEsNSBAQAogCSAgTGludXggd2Vic2l0ZSA8aHR0cDovL2FjbC5iZXN0Yml0cy5hdC8+LgogCiAJICBJZiB5b3UgZG9uJ3Qga25vdyB3aGF0IEFjY2VzcyBDb250cm9sIExpc3RzIGFyZSwgc2F5IE4KKworZW5kaWYKZGlmZiAtLWdpdCBhL2ZzLzlwL01ha2VmaWxlIGIvZnMvOXAvTWFrZWZpbGUKaW5kZXggZjhiYTM3ZS4uYWI4YzEyNyAxMDA2NDQKLS0tIGEvZnMvOXAvTWFrZWZpbGUKKysrIGIvZnMvOXAvTWFrZWZpbGUKQEAgLTMsNiArMyw3IEBACiA5cC1vYmpzIDo9IFwKIAl2ZnNfc3VwZXIubyBcCiAJdmZzX2lub2RlLm8gXAorCXZmc19pbm9kZV9kb3RsLm8gXAogCXZmc19hZGRyLm8gXAogCXZmc19maWxlLm8gXAogCXZmc19kaXIubyBcCmRpZmYgLS1naXQgYS9mcy85cC9hY2wuYyBiL2ZzLzlwL2FjbC5jCmluZGV4IDZlNThjNGMuLjAyYTJjZjYgMTAwNjQ0Ci0tLSBhL2ZzLzlwL2FjbC5jCisrKyBiL2ZzLzlwL2FjbC5jCkBAIC0yOCw3ICsyOCw3IEBACiB7CiAJc3NpemVfdCBzaXplOwogCXZvaWQgKnZhbHVlID0gTlVMTDsKLQlzdHJ1Y3QgcG9zaXhfYWNsICphY2wgPSBOVUxMOzsKKwlzdHJ1Y3QgcG9zaXhfYWNsICphY2wgPSBOVUxMOwogCiAJc2l6ZSA9IHY5ZnNfZmlkX3hhdHRyX2dldChmaWQsIG5hbWUsIE5VTEwsIDApOwogCWlmIChzaXplID4gMCkgewpAQCAtMzY1LDcgKzM2NSw3IEBACiAJY2FzZSBBQ0xfVFlQRV9ERUZBVUxUOgogCQluYW1lID0gUE9TSVhfQUNMX1hBVFRSX0RFRkFVTFQ7CiAJCWlmICghU19JU0RJUihpbm9kZS0+aV9tb2RlKSkgewotCQkJcmV0dmFsID0gLUVJTlZBTDsKKwkJCXJldHZhbCA9IGFjbCA/IC1FSU5WQUwgOiAwOwogCQkJZ290byBlcnJfb3V0OwogCQl9CiAJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvZnMvOXAvdjlmcy5oIGIvZnMvOXAvdjlmcy5oCmluZGV4IGNiNjM5NjguLmM0YjVkODggMTAwNjQ0Ci0tLSBhL2ZzLzlwL3Y5ZnMuaAorKysgYi9mcy85cC92OWZzLmgKQEAgLTExMyw5ICsxMTMsMjcgQEAKIAogc3RydWN0IHA5X2ZpZCAqdjlmc19zZXNzaW9uX2luaXQoc3RydWN0IHY5ZnNfc2Vzc2lvbl9pbmZvICosIGNvbnN0IGNoYXIgKiwKIAkJCQkJCQkJCWNoYXIgKik7Ci12b2lkIHY5ZnNfc2Vzc2lvbl9jbG9zZShzdHJ1Y3Qgdjlmc19zZXNzaW9uX2luZm8gKnY5c2VzKTsKLXZvaWQgdjlmc19zZXNzaW9uX2NhbmNlbChzdHJ1Y3Qgdjlmc19zZXNzaW9uX2luZm8gKnY5c2VzKTsKLXZvaWQgdjlmc19zZXNzaW9uX2JlZ2luX2NhbmNlbChzdHJ1Y3Qgdjlmc19zZXNzaW9uX2luZm8gKnY5c2VzKTsKK2V4dGVybiB2b2lkIHY5ZnNfc2Vzc2lvbl9jbG9zZShzdHJ1Y3Qgdjlmc19zZXNzaW9uX2luZm8gKnY5c2VzKTsKK2V4dGVybiB2b2lkIHY5ZnNfc2Vzc2lvbl9jYW5jZWwoc3RydWN0IHY5ZnNfc2Vzc2lvbl9pbmZvICp2OXNlcyk7CitleHRlcm4gdm9pZCB2OWZzX3Nlc3Npb25fYmVnaW5fY2FuY2VsKHN0cnVjdCB2OWZzX3Nlc3Npb25faW5mbyAqdjlzZXMpOworZXh0ZXJuIHN0cnVjdCBkZW50cnkgKnY5ZnNfdmZzX2xvb2t1cChzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LAorCQkJc3RydWN0IG5hbWVpZGF0YSAqbmFtZWlkYXRhKTsKK2V4dGVybiBpbnQgdjlmc192ZnNfdW5saW5rKHN0cnVjdCBpbm9kZSAqaSwgc3RydWN0IGRlbnRyeSAqZCk7CitleHRlcm4gaW50IHY5ZnNfdmZzX3JtZGlyKHN0cnVjdCBpbm9kZSAqaSwgc3RydWN0IGRlbnRyeSAqZCk7CitleHRlcm4gaW50IHY5ZnNfdmZzX3JlbmFtZShzdHJ1Y3QgaW5vZGUgKm9sZF9kaXIsIHN0cnVjdCBkZW50cnkgKm9sZF9kZW50cnksCisJCQlzdHJ1Y3QgaW5vZGUgKm5ld19kaXIsIHN0cnVjdCBkZW50cnkgKm5ld19kZW50cnkpOworZXh0ZXJuIHZvaWQgdjlmc192ZnNfcHV0X2xpbmsoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCwKKwkJCXZvaWQgKnApOworZXh0ZXJuIHN0cnVjdCBpbm9kZSAqdjlmc19pbm9kZShzdHJ1Y3Qgdjlmc19zZXNzaW9uX2luZm8gKnY5c2VzLAorCQkJc3RydWN0IHA5X2ZpZCAqZmlkLAorCQkJc3RydWN0IHN1cGVyX2Jsb2NrICpzYik7CisKK2V4dGVybiBjb25zdCBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyB2OWZzX2Rpcl9pbm9kZV9vcGVyYXRpb25zX2RvdGw7CitleHRlcm4gY29uc3Qgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgdjlmc19maWxlX2lub2RlX29wZXJhdGlvbnNfZG90bDsKK2V4dGVybiBjb25zdCBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyB2OWZzX3N5bWxpbmtfaW5vZGVfb3BlcmF0aW9uc19kb3RsOworZXh0ZXJuIHN0cnVjdCBpbm9kZSAqdjlmc19pbm9kZV9kb3RsKHN0cnVjdCB2OWZzX3Nlc3Npb25faW5mbyAqdjlzZXMsCisJCQlzdHJ1Y3QgcDlfZmlkICpmaWQsCisJCQlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKTsKIAogLyogb3RoZXIgZGVmYXVsdCBnbG9iYWxzICovCiAjZGVmaW5lIFY5RlNfUE9SVAk1NjQKQEAgLTEzOCwzICsxNTYsMjEgQEAKIHsKIAlyZXR1cm4gdjlzZXMtPmZsYWdzICYgVjlGU19QUk9UT18yMDAwTDsKIH0KKworLyoqCisgKiB2OWZzX2lub2RlX2Zyb21fZmlkIC0gSGVscGVyIHJvdXRpbmUgdG8gcG9wdWxhdGUgYW4gaW5vZGUgYnkKKyAqIGlzc3VpbmcgYSBhdHRyaWJ1dGUgcmVxdWVzdAorICogQHY5c2VzOiBzZXNzaW9uIGluZm9ybWF0aW9uCisgKiBAZmlkOiBmaWQgdG8gaXNzdWUgYXR0cmlidXRlIHJlcXVlc3QgZm9yCisgKiBAc2I6IHN1cGVyYmxvY2sgb24gd2hpY2ggdG8gY3JlYXRlIGlub2RlCisgKgorICovCitzdGF0aWMgaW5saW5lIHN0cnVjdCBpbm9kZSAqCit2OWZzX2lub2RlX2Zyb21fZmlkKHN0cnVjdCB2OWZzX3Nlc3Npb25faW5mbyAqdjlzZXMsIHN0cnVjdCBwOV9maWQgKmZpZCwKKwkJCQlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCWlmICh2OWZzX3Byb3RvX2RvdGwodjlzZXMpKQorCQlyZXR1cm4gdjlmc19pbm9kZV9kb3RsKHY5c2VzLCBmaWQsIHNiKTsKKwllbHNlCisJCXJldHVybiB2OWZzX2lub2RlKHY5c2VzLCBmaWQsIHNiKTsKK30KZGlmZiAtLWdpdCBhL2ZzLzlwL3Zmc19pbm9kZS5jIGIvZnMvOXAvdmZzX2lub2RlLmMKaW5kZXggNTk3ODI5OC4uNTA3NmVlYiAxMDA2NDQKLS0tIGEvZnMvOXAvdmZzX2lub2RlLmMKKysrIGIvZnMvOXAvdmZzX2lub2RlLmMKQEAgLTQ5LDE1ICs0OSw4IEBACiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyB2OWZzX2Rpcl9pbm9kZV9vcGVyYXRpb25zOwogc3RhdGljIGNvbnN0IHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIHY5ZnNfZGlyX2lub2RlX29wZXJhdGlvbnNfZG90dTsKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyB2OWZzX2Rpcl9pbm9kZV9vcGVyYXRpb25zX2RvdGw7CiBzdGF0aWMgY29uc3Qgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgdjlmc19maWxlX2lub2RlX29wZXJhdGlvbnM7Ci1zdGF0aWMgY29uc3Qgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgdjlmc19maWxlX2lub2RlX29wZXJhdGlvbnNfZG90bDsKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyB2OWZzX3N5bWxpbmtfaW5vZGVfb3BlcmF0aW9uczsKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyB2OWZzX3N5bWxpbmtfaW5vZGVfb3BlcmF0aW9uc19kb3RsOwotCi1zdGF0aWMgaW50Ci12OWZzX3Zmc19ta25vZF9kb3RsKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGludCBvbW9kZSwKLQkJICAgIGRldl90IHJkZXYpOwogCiAvKioKICAqIHVuaXhtb2RlMnA5bW9kZSAtIGNvbnZlcnQgdW5peCBtb2RlIGJpdHMgdG8gcGxhbiA5CkBAIC0yNTEsNDEgKzI0NCw2IEBACiAjZW5kaWYKIAogLyoqCi0gKiB2OWZzX2dldF9mc2dpZF9mb3JfY3JlYXRlIC0gSGVscGVyIGZ1bmN0aW9uIHRvIGdldCB0aGUgZ2lkIGZvciBjcmVhdGluZyBhCi0gKiBuZXcgZmlsZSBzeXN0ZW0gb2JqZWN0LiBUaGlzIGNoZWNrcyB0aGUgU19JU0dJRCB0byBkZXRlcm1pbmUgdGhlIG93bmluZwotICogZ3JvdXAgb2YgdGhlIG5ldyBmaWxlIHN5c3RlbSBvYmplY3QuCi0gKi8KLQotc3RhdGljIGdpZF90IHY5ZnNfZ2V0X2ZzZ2lkX2Zvcl9jcmVhdGUoc3RydWN0IGlub2RlICpkaXJfaW5vZGUpCi17Ci0JQlVHX09OKGRpcl9pbm9kZSA9PSBOVUxMKTsKLQotCWlmIChkaXJfaW5vZGUtPmlfbW9kZSAmIFNfSVNHSUQpIHsKLQkJLyogc2V0X2dpZCBiaXQgaXMgc2V0LiovCi0JCXJldHVybiBkaXJfaW5vZGUtPmlfZ2lkOwotCX0KLQlyZXR1cm4gY3VycmVudF9mc2dpZCgpOwotfQotCi0vKioKLSAqIHY5ZnNfZGVudHJ5X2Zyb21fZGlyX2lub2RlIC0gaGVscGVyIGZ1bmN0aW9uIHRvIGdldCB0aGUgZGVudHJ5IGZyb20KLSAqIGRpciBpbm9kZS4KLSAqCi0gKi8KLQotc3RhdGljIHN0cnVjdCBkZW50cnkgKnY5ZnNfZGVudHJ5X2Zyb21fZGlyX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCi17Ci0Jc3RydWN0IGRlbnRyeSAqZGVudHJ5OwotCi0Jc3Bpbl9sb2NrKCZpbm9kZS0+aV9sb2NrKTsKLQkvKiBEaXJlY3Rvcnkgc2hvdWxkIGhhdmUgb25seSBvbmUgZW50cnkuICovCi0JQlVHX09OKFNfSVNESVIoaW5vZGUtPmlfbW9kZSkgJiYgIWxpc3RfaXNfc2luZ3VsYXIoJmlub2RlLT5pX2RlbnRyeSkpOwotCWRlbnRyeSA9IGxpc3RfZW50cnkoaW5vZGUtPmlfZGVudHJ5Lm5leHQsIHN0cnVjdCBkZW50cnksIGRfYWxpYXMpOwotCXNwaW5fdW5sb2NrKCZpbm9kZS0+aV9sb2NrKTsKLQlyZXR1cm4gZGVudHJ5OwotfQotCi0vKioKICAqIHY5ZnNfZ2V0X2lub2RlIC0gaGVscGVyIGZ1bmN0aW9uIHRvIHNldHVwIGFuIGlub2RlCiAgKiBAc2I6IHN1cGVyYmxvY2sKICAqIEBtb2RlOiBtb2RlIHRvIHNldHVwIGlub2RlIHdpdGgKQEAgLTQ1NCw3ICs0MTIsNyBAQAogI2VuZGlmCiB9CiAKLXN0YXRpYyBzdHJ1Y3QgaW5vZGUgKgorc3RydWN0IGlub2RlICoKIHY5ZnNfaW5vZGUoc3RydWN0IHY5ZnNfc2Vzc2lvbl9pbmZvICp2OXNlcywgc3RydWN0IHA5X2ZpZCAqZmlkLAogCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCiB7CkBAIC00ODksNjAgKzQ0Nyw2IEBACiAJcmV0dXJuIEVSUl9QVFIoZXJyKTsKIH0KIAotc3RhdGljIHN0cnVjdCBpbm9kZSAqCi12OWZzX2lub2RlX2RvdGwoc3RydWN0IHY5ZnNfc2Vzc2lvbl9pbmZvICp2OXNlcywgc3RydWN0IHA5X2ZpZCAqZmlkLAotCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCi17Ci0Jc3RydWN0IGlub2RlICpyZXQgPSBOVUxMOwotCWludCBlcnI7Ci0Jc3RydWN0IHA5X3N0YXRfZG90bCAqc3Q7Ci0KLQlzdCA9IHA5X2NsaWVudF9nZXRhdHRyX2RvdGwoZmlkLCBQOV9TVEFUU19CQVNJQyk7Ci0JaWYgKElTX0VSUihzdCkpCi0JCXJldHVybiBFUlJfQ0FTVChzdCk7Ci0KLQlyZXQgPSB2OWZzX2dldF9pbm9kZShzYiwgc3QtPnN0X21vZGUpOwotCWlmIChJU19FUlIocmV0KSkgewotCQllcnIgPSBQVFJfRVJSKHJldCk7Ci0JCWdvdG8gZXJyb3I7Ci0JfQotCi0Jdjlmc19zdGF0Mmlub2RlX2RvdGwoc3QsIHJldCk7Ci0JcmV0LT5pX2lubyA9IHY5ZnNfcWlkMmlubygmc3QtPnFpZCk7Ci0jaWZkZWYgQ09ORklHXzlQX0ZTQ0FDSEUKLQl2OWZzX3Zjb29raWVfc2V0X3FpZChyZXQsICZzdC0+cWlkKTsKLQl2OWZzX2NhY2hlX2lub2RlX2dldF9jb29raWUocmV0KTsKLSNlbmRpZgotCWVyciA9IHY5ZnNfZ2V0X2FjbChyZXQsIGZpZCk7Ci0JaWYgKGVycikgewotCQlpcHV0KHJldCk7Ci0JCWdvdG8gZXJyb3I7Ci0JfQotCWtmcmVlKHN0KTsKLQlyZXR1cm4gcmV0OwotZXJyb3I6Ci0Ja2ZyZWUoc3QpOwotCXJldHVybiBFUlJfUFRSKGVycik7Ci19Ci0KLS8qKgotICogdjlmc19pbm9kZV9mcm9tX2ZpZCAtIEhlbHBlciByb3V0aW5lIHRvIHBvcHVsYXRlIGFuIGlub2RlIGJ5Ci0gKiBpc3N1aW5nIGEgYXR0cmlidXRlIHJlcXVlc3QKLSAqIEB2OXNlczogc2Vzc2lvbiBpbmZvcm1hdGlvbgotICogQGZpZDogZmlkIHRvIGlzc3VlIGF0dHJpYnV0ZSByZXF1ZXN0IGZvcgotICogQHNiOiBzdXBlcmJsb2NrIG9uIHdoaWNoIHRvIGNyZWF0ZSBpbm9kZQotICoKLSAqLwotc3RhdGljIGlubGluZSBzdHJ1Y3QgaW5vZGUgKgotdjlmc19pbm9kZV9mcm9tX2ZpZChzdHJ1Y3Qgdjlmc19zZXNzaW9uX2luZm8gKnY5c2VzLCBzdHJ1Y3QgcDlfZmlkICpmaWQsCi0JCQlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQotewotCWlmICh2OWZzX3Byb3RvX2RvdGwodjlzZXMpKQotCQlyZXR1cm4gdjlmc19pbm9kZV9kb3RsKHY5c2VzLCBmaWQsIHNiKTsKLQllbHNlCi0JCXJldHVybiB2OWZzX2lub2RlKHY5c2VzLCBmaWQsIHNiKTsKLX0KLQogLyoqCiAgKiB2OWZzX3JlbW92ZSAtIGhlbHBlciBmdW5jdGlvbiB0byByZW1vdmUgZmlsZXMgYW5kIGRpcmVjdG9yaWVzCiAgKiBAZGlyOiBkaXJlY3RvcnkgaW5vZGUgdGhhdCBpcyBiZWluZyBkZWxldGVkCkBAIC02MzMsMTIgKzUzNyw2IEBACiAJCVA5X0RQUklOVEsoUDlfREVCVUdfVkZTLCAiaW5vZGUgY3JlYXRpb24gZmFpbGVkICVkXG4iLCBlcnIpOwogCQlnb3RvIGVycm9yOwogCX0KLQotCWlmICh2OXNlcy0+Y2FjaGUpCi0JCWRfc2V0X2Rfb3AoZGVudHJ5LCAmdjlmc19jYWNoZWRfZGVudHJ5X29wZXJhdGlvbnMpOwotCWVsc2UKLQkJZF9zZXRfZF9vcChkZW50cnksICZ2OWZzX2RlbnRyeV9vcGVyYXRpb25zKTsKLQogCWRfaW5zdGFudGlhdGUoZGVudHJ5LCBpbm9kZSk7CiAJZXJyID0gdjlmc19maWRfYWRkKGRlbnRyeSwgZmlkKTsKIAlpZiAoZXJyIDwgMCkKQEAgLTY1NywxNDQgKzU1NSw2IEBACiB9CiAKIC8qKgotICogdjlmc192ZnNfY3JlYXRlX2RvdGwgLSBWRlMgaG9vayB0byBjcmVhdGUgZmlsZXMgZm9yIDlQMjAwMC5MIHByb3RvY29sLgotICogQGRpcjogZGlyZWN0b3J5IGlub2RlIHRoYXQgaXMgYmVpbmcgY3JlYXRlZAotICogQGRlbnRyeTogIGRlbnRyeSB0aGF0IGlzIGJlaW5nIGRlbGV0ZWQKLSAqIEBtb2RlOiBjcmVhdGUgcGVybWlzc2lvbnMKLSAqIEBuZDogcGF0aCBpbmZvcm1hdGlvbgotICoKLSAqLwotCi1zdGF0aWMgaW50Ci12OWZzX3Zmc19jcmVhdGVfZG90bChzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBpbnQgb21vZGUsCi0JCXN0cnVjdCBuYW1laWRhdGEgKm5kKQotewotCWludCBlcnIgPSAwOwotCWNoYXIgKm5hbWUgPSBOVUxMOwotCWdpZF90IGdpZDsKLQlpbnQgZmxhZ3M7Ci0JbW9kZV90IG1vZGU7Ci0Jc3RydWN0IHY5ZnNfc2Vzc2lvbl9pbmZvICp2OXNlczsKLQlzdHJ1Y3QgcDlfZmlkICpmaWQgPSBOVUxMOwotCXN0cnVjdCBwOV9maWQgKmRmaWQsICpvZmlkOwotCXN0cnVjdCBmaWxlICpmaWxwOwotCXN0cnVjdCBwOV9xaWQgcWlkOwotCXN0cnVjdCBpbm9kZSAqaW5vZGU7Ci0Jc3RydWN0IHBvc2l4X2FjbCAqcGFjbCA9IE5VTEwsICpkYWNsID0gTlVMTDsKLQotCXY5c2VzID0gdjlmc19pbm9kZTJ2OXNlcyhkaXIpOwotCWlmIChuZCAmJiBuZC0+ZmxhZ3MgJiBMT09LVVBfT1BFTikKLQkJZmxhZ3MgPSBuZC0+aW50ZW50Lm9wZW4uZmxhZ3MgLSAxOwotCWVsc2UgewotCQkvKgotCQkgKiBjcmVhdGUgY2FsbCB3aXRob3V0IExPT0tVUF9PUEVOIGlzIGR1ZQotCQkgKiB0byBta25vZCBvZiByZWd1bGFyIGZpbGVzLiBTbyB1c2UgbWtub2QKLQkJICogb3BlcmF0aW9uLgotCQkgKi8KLQkJcmV0dXJuIHY5ZnNfdmZzX21rbm9kX2RvdGwoZGlyLCBkZW50cnksIG9tb2RlLCAwKTsKLQl9Ci0KLQluYW1lID0gKGNoYXIgKikgZGVudHJ5LT5kX25hbWUubmFtZTsKLQlQOV9EUFJJTlRLKFA5X0RFQlVHX1ZGUywgInY5ZnNfdmZzX2NyZWF0ZV9kb3RsOiBuYW1lOiVzIGZsYWdzOjB4JXggIgotCQkJIm1vZGU6MHgleFxuIiwgbmFtZSwgZmxhZ3MsIG9tb2RlKTsKLQotCWRmaWQgPSB2OWZzX2ZpZF9sb29rdXAoZGVudHJ5LT5kX3BhcmVudCk7Ci0JaWYgKElTX0VSUihkZmlkKSkgewotCQllcnIgPSBQVFJfRVJSKGRmaWQpOwotCQlQOV9EUFJJTlRLKFA5X0RFQlVHX1ZGUywgImZpZCBsb29rdXAgZmFpbGVkICVkXG4iLCBlcnIpOwotCQlyZXR1cm4gZXJyOwotCX0KLQotCS8qIGNsb25lIGEgZmlkIHRvIHVzZSBmb3IgY3JlYXRpb24gKi8KLQlvZmlkID0gcDlfY2xpZW50X3dhbGsoZGZpZCwgMCwgTlVMTCwgMSk7Ci0JaWYgKElTX0VSUihvZmlkKSkgewotCQllcnIgPSBQVFJfRVJSKG9maWQpOwotCQlQOV9EUFJJTlRLKFA5X0RFQlVHX1ZGUywgInA5X2NsaWVudF93YWxrIGZhaWxlZCAlZFxuIiwgZXJyKTsKLQkJcmV0dXJuIGVycjsKLQl9Ci0KLQlnaWQgPSB2OWZzX2dldF9mc2dpZF9mb3JfY3JlYXRlKGRpcik7Ci0KLQltb2RlID0gb21vZGU7Ci0JLyogVXBkYXRlIG1vZGUgYmFzZWQgb24gQUNMIHZhbHVlICovCi0JZXJyID0gdjlmc19hY2xfbW9kZShkaXIsICZtb2RlLCAmZGFjbCwgJnBhY2wpOwotCWlmIChlcnIpIHsKLQkJUDlfRFBSSU5USyhQOV9ERUJVR19WRlMsCi0JCQkgICAiRmFpbGVkIHRvIGdldCBhY2wgdmFsdWVzIGluIGNyZWF0ICVkXG4iLCBlcnIpOwotCQlnb3RvIGVycm9yOwotCX0KLQllcnIgPSBwOV9jbGllbnRfY3JlYXRlX2RvdGwob2ZpZCwgbmFtZSwgZmxhZ3MsIG1vZGUsIGdpZCwgJnFpZCk7Ci0JaWYgKGVyciA8IDApIHsKLQkJUDlfRFBSSU5USyhQOV9ERUJVR19WRlMsCi0JCQkJInA5X2NsaWVudF9vcGVuX2RvdGwgZmFpbGVkIGluIGNyZWF0ICVkXG4iLAotCQkJCWVycik7Ci0JCWdvdG8gZXJyb3I7Ci0JfQotCS8qIGluc3RhbnRpYXRlIGlub2RlIGFuZCBhc3NpZ24gdGhlIHVub3BlbmVkIGZpZCB0byB0aGUgZGVudHJ5ICovCi0JaWYgKHY5c2VzLT5jYWNoZSA9PSBDQUNIRV9MT09TRSB8fCB2OXNlcy0+Y2FjaGUgPT0gQ0FDSEVfRlNDQUNIRSB8fAotCSAgICAobmQgJiYgbmQtPmZsYWdzICYgTE9PS1VQX09QRU4pKSB7Ci0JCWZpZCA9IHA5X2NsaWVudF93YWxrKGRmaWQsIDEsICZuYW1lLCAxKTsKLQkJaWYgKElTX0VSUihmaWQpKSB7Ci0JCQllcnIgPSBQVFJfRVJSKGZpZCk7Ci0JCQlQOV9EUFJJTlRLKFA5X0RFQlVHX1ZGUywgInA5X2NsaWVudF93YWxrIGZhaWxlZCAlZFxuIiwKLQkJCQllcnIpOwotCQkJZmlkID0gTlVMTDsKLQkJCWdvdG8gZXJyb3I7Ci0JCX0KLQotCQlpbm9kZSA9IHY5ZnNfaW5vZGVfZnJvbV9maWQodjlzZXMsIGZpZCwgZGlyLT5pX3NiKTsKLQkJaWYgKElTX0VSUihpbm9kZSkpIHsKLQkJCWVyciA9IFBUUl9FUlIoaW5vZGUpOwotCQkJUDlfRFBSSU5USyhQOV9ERUJVR19WRlMsICJpbm9kZSBjcmVhdGlvbiBmYWlsZWQgJWRcbiIsCi0JCQkJZXJyKTsKLQkJCWdvdG8gZXJyb3I7Ci0JCX0KLQkJZF9zZXRfZF9vcChkZW50cnksICZ2OWZzX2NhY2hlZF9kZW50cnlfb3BlcmF0aW9ucyk7Ci0JCWRfaW5zdGFudGlhdGUoZGVudHJ5LCBpbm9kZSk7Ci0JCWVyciA9IHY5ZnNfZmlkX2FkZChkZW50cnksIGZpZCk7Ci0JCWlmIChlcnIgPCAwKQotCQkJZ290byBlcnJvcjsKLQkJLyogVGhlIGZpZCB3b3VsZCBnZXQgY2x1bmtlZCB2aWEgYSBkcHV0ICovCi0JCWZpZCA9IE5VTEw7Ci0JfSBlbHNlIHsKLQkJLyoKLQkJICogTm90IGluIGNhY2hlZCBtb2RlLiBObyBuZWVkIHRvIHBvcHVsYXRlCi0JCSAqIGlub2RlIHdpdGggc3RhdC4gV2UgbmVlZCB0byBnZXQgYW4gaW5vZGUKLQkJICogc28gdGhhdCB3ZSBjYW4gc2V0IHRoZSBhY2wgd2l0aCBkZW50cnkKLQkJICovCi0JCWlub2RlID0gdjlmc19nZXRfaW5vZGUoZGlyLT5pX3NiLCBtb2RlKTsKLQkJaWYgKElTX0VSUihpbm9kZSkpIHsKLQkJCWVyciA9IFBUUl9FUlIoaW5vZGUpOwotCQkJZ290byBlcnJvcjsKLQkJfQotCQlkX3NldF9kX29wKGRlbnRyeSwgJnY5ZnNfZGVudHJ5X29wZXJhdGlvbnMpOwotCQlkX2luc3RhbnRpYXRlKGRlbnRyeSwgaW5vZGUpOwotCX0KLQkvKiBOb3cgc2V0IHRoZSBBQ0wgYmFzZWQgb24gdGhlIGRlZmF1bHQgdmFsdWUgKi8KLQl2OWZzX3NldF9jcmVhdGVfYWNsKGRlbnRyeSwgZGFjbCwgcGFjbCk7Ci0KLQkvKiBpZiB3ZSBhcmUgb3BlbmluZyBhIGZpbGUsIGFzc2lnbiB0aGUgb3BlbiBmaWQgdG8gdGhlIGZpbGUgKi8KLQlpZiAobmQgJiYgbmQtPmZsYWdzICYgTE9PS1VQX09QRU4pIHsKLQkJZmlscCA9IGxvb2t1cF9pbnN0YW50aWF0ZV9maWxwKG5kLCBkZW50cnksIGdlbmVyaWNfZmlsZV9vcGVuKTsKLQkJaWYgKElTX0VSUihmaWxwKSkgewotCQkJcDlfY2xpZW50X2NsdW5rKG9maWQpOwotCQkJcmV0dXJuIFBUUl9FUlIoZmlscCk7Ci0JCX0KLQkJZmlscC0+cHJpdmF0ZV9kYXRhID0gb2ZpZDsKLQl9IGVsc2UKLQkJcDlfY2xpZW50X2NsdW5rKG9maWQpOwotCi0JcmV0dXJuIDA7Ci0KLWVycm9yOgotCWlmIChvZmlkKQotCQlwOV9jbGllbnRfY2x1bmsob2ZpZCk7Ci0JaWYgKGZpZCkKLQkJcDlfY2xpZW50X2NsdW5rKGZpZCk7Ci0JcmV0dXJuIGVycjsKLX0KLQotLyoqCiAgKiB2OWZzX3Zmc19jcmVhdGUgLSBWRlMgaG9vayB0byBjcmVhdGUgZmlsZXMKICAqIEBkaXI6IGRpcmVjdG9yeSBpbm9kZSB0aGF0IGlzIGJlaW5nIGNyZWF0ZWQKICAqIEBkZW50cnk6ICBkZW50cnkgdGhhdCBpcyBiZWluZyBkZWxldGVkCkBAIC04ODQsMTA3ICs2NDQsNiBAQAogCXJldHVybiBlcnI7CiB9CiAKLQotLyoqCi0gKiB2OWZzX3Zmc19ta2Rpcl9kb3RsIC0gVkZTIG1rZGlyIGhvb2sgdG8gY3JlYXRlIGEgZGlyZWN0b3J5Ci0gKiBAZGlyOiAgaW5vZGUgdGhhdCBpcyBiZWluZyB1bmxpbmtlZAotICogQGRlbnRyeTogZGVudHJ5IHRoYXQgaXMgYmVpbmcgdW5saW5rZWQKLSAqIEBtb2RlOiBtb2RlIGZvciBuZXcgZGlyZWN0b3J5Ci0gKgotICovCi0KLXN0YXRpYyBpbnQgdjlmc192ZnNfbWtkaXJfZG90bChzdHJ1Y3QgaW5vZGUgKmRpciwKLQkJCSAgICAgICBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGludCBvbW9kZSkKLXsKLQlpbnQgZXJyOwotCXN0cnVjdCB2OWZzX3Nlc3Npb25faW5mbyAqdjlzZXM7Ci0Jc3RydWN0IHA5X2ZpZCAqZmlkID0gTlVMTCwgKmRmaWQgPSBOVUxMOwotCWdpZF90IGdpZDsKLQljaGFyICpuYW1lOwotCW1vZGVfdCBtb2RlOwotCXN0cnVjdCBpbm9kZSAqaW5vZGU7Ci0Jc3RydWN0IHA5X3FpZCBxaWQ7Ci0Jc3RydWN0IGRlbnRyeSAqZGlyX2RlbnRyeTsKLQlzdHJ1Y3QgcG9zaXhfYWNsICpkYWNsID0gTlVMTCwgKnBhY2wgPSBOVUxMOwotCi0JUDlfRFBSSU5USyhQOV9ERUJVR19WRlMsICJuYW1lICVzXG4iLCBkZW50cnktPmRfbmFtZS5uYW1lKTsKLQllcnIgPSAwOwotCXY5c2VzID0gdjlmc19pbm9kZTJ2OXNlcyhkaXIpOwotCi0Jb21vZGUgfD0gU19JRkRJUjsKLQlpZiAoZGlyLT5pX21vZGUgJiBTX0lTR0lEKQotCQlvbW9kZSB8PSBTX0lTR0lEOwotCi0JZGlyX2RlbnRyeSA9IHY5ZnNfZGVudHJ5X2Zyb21fZGlyX2lub2RlKGRpcik7Ci0JZGZpZCA9IHY5ZnNfZmlkX2xvb2t1cChkaXJfZGVudHJ5KTsKLQlpZiAoSVNfRVJSKGRmaWQpKSB7Ci0JCWVyciA9IFBUUl9FUlIoZGZpZCk7Ci0JCVA5X0RQUklOVEsoUDlfREVCVUdfVkZTLCAiZmlkIGxvb2t1cCBmYWlsZWQgJWRcbiIsIGVycik7Ci0JCWRmaWQgPSBOVUxMOwotCQlnb3RvIGVycm9yOwotCX0KLQotCWdpZCA9IHY5ZnNfZ2V0X2ZzZ2lkX2Zvcl9jcmVhdGUoZGlyKTsKLQltb2RlID0gb21vZGU7Ci0JLyogVXBkYXRlIG1vZGUgYmFzZWQgb24gQUNMIHZhbHVlICovCi0JZXJyID0gdjlmc19hY2xfbW9kZShkaXIsICZtb2RlLCAmZGFjbCwgJnBhY2wpOwotCWlmIChlcnIpIHsKLQkJUDlfRFBSSU5USyhQOV9ERUJVR19WRlMsCi0JCQkgICAiRmFpbGVkIHRvIGdldCBhY2wgdmFsdWVzIGluIG1rZGlyICVkXG4iLCBlcnIpOwotCQlnb3RvIGVycm9yOwotCX0KLQluYW1lID0gKGNoYXIgKikgZGVudHJ5LT5kX25hbWUubmFtZTsKLQllcnIgPSBwOV9jbGllbnRfbWtkaXJfZG90bChkZmlkLCBuYW1lLCBtb2RlLCBnaWQsICZxaWQpOwotCWlmIChlcnIgPCAwKQotCQlnb3RvIGVycm9yOwotCi0JLyogaW5zdGFudGlhdGUgaW5vZGUgYW5kIGFzc2lnbiB0aGUgdW5vcGVuZWQgZmlkIHRvIHRoZSBkZW50cnkgKi8KLQlpZiAodjlzZXMtPmNhY2hlID09IENBQ0hFX0xPT1NFIHx8IHY5c2VzLT5jYWNoZSA9PSBDQUNIRV9GU0NBQ0hFKSB7Ci0JCWZpZCA9IHA5X2NsaWVudF93YWxrKGRmaWQsIDEsICZuYW1lLCAxKTsKLQkJaWYgKElTX0VSUihmaWQpKSB7Ci0JCQllcnIgPSBQVFJfRVJSKGZpZCk7Ci0JCQlQOV9EUFJJTlRLKFA5X0RFQlVHX1ZGUywgInA5X2NsaWVudF93YWxrIGZhaWxlZCAlZFxuIiwKLQkJCQllcnIpOwotCQkJZmlkID0gTlVMTDsKLQkJCWdvdG8gZXJyb3I7Ci0JCX0KLQotCQlpbm9kZSA9IHY5ZnNfaW5vZGVfZnJvbV9maWQodjlzZXMsIGZpZCwgZGlyLT5pX3NiKTsKLQkJaWYgKElTX0VSUihpbm9kZSkpIHsKLQkJCWVyciA9IFBUUl9FUlIoaW5vZGUpOwotCQkJUDlfRFBSSU5USyhQOV9ERUJVR19WRlMsICJpbm9kZSBjcmVhdGlvbiBmYWlsZWQgJWRcbiIsCi0JCQkJZXJyKTsKLQkJCWdvdG8gZXJyb3I7Ci0JCX0KLQkJZF9zZXRfZF9vcChkZW50cnksICZ2OWZzX2NhY2hlZF9kZW50cnlfb3BlcmF0aW9ucyk7Ci0JCWRfaW5zdGFudGlhdGUoZGVudHJ5LCBpbm9kZSk7Ci0JCWVyciA9IHY5ZnNfZmlkX2FkZChkZW50cnksIGZpZCk7Ci0JCWlmIChlcnIgPCAwKQotCQkJZ290byBlcnJvcjsKLQkJZmlkID0gTlVMTDsKLQl9IGVsc2UgewotCQkvKgotCQkgKiBOb3QgaW4gY2FjaGVkIG1vZGUuIE5vIG5lZWQgdG8gcG9wdWxhdGUKLQkJICogaW5vZGUgd2l0aCBzdGF0LiBXZSBuZWVkIHRvIGdldCBhbiBpbm9kZQotCQkgKiBzbyB0aGF0IHdlIGNhbiBzZXQgdGhlIGFjbCB3aXRoIGRlbnRyeQotCQkgKi8KLQkJaW5vZGUgPSB2OWZzX2dldF9pbm9kZShkaXItPmlfc2IsIG1vZGUpOwotCQlpZiAoSVNfRVJSKGlub2RlKSkgewotCQkJZXJyID0gUFRSX0VSUihpbm9kZSk7Ci0JCQlnb3RvIGVycm9yOwotCQl9Ci0JCWRfc2V0X2Rfb3AoZGVudHJ5LCAmdjlmc19kZW50cnlfb3BlcmF0aW9ucyk7Ci0JCWRfaW5zdGFudGlhdGUoZGVudHJ5LCBpbm9kZSk7Ci0JfQotCS8qIE5vdyBzZXQgdGhlIEFDTCBiYXNlZCBvbiB0aGUgZGVmYXVsdCB2YWx1ZSAqLwotCXY5ZnNfc2V0X2NyZWF0ZV9hY2woZGVudHJ5LCBkYWNsLCBwYWNsKTsKLQotZXJyb3I6Ci0JaWYgKGZpZCkKLQkJcDlfY2xpZW50X2NsdW5rKGZpZCk7Ci0JcmV0dXJuIGVycjsKLX0KLQogLyoqCiAgKiB2OWZzX3Zmc19sb29rdXAgLSBWRlMgbG9va3VwIGhvb2sgdG8gIndhbGsiIHRvIGEgbmV3IGlub2RlCiAgKiBAZGlyOiAgaW5vZGUgdGhhdCBpcyBiZWluZyB3YWxrZWQgZnJvbQpAQCAtOTkzLDcgKzY1Miw3IEBACiAgKgogICovCiAKLXN0YXRpYyBzdHJ1Y3QgZGVudHJ5ICp2OWZzX3Zmc19sb29rdXAoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwKK3N0cnVjdCBkZW50cnkgKnY5ZnNfdmZzX2xvb2t1cChzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LAogCQkJCSAgICAgIHN0cnVjdCBuYW1laWRhdGEgKm5hbWVpZGF0YSkKIHsKIAlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiOwpAQCAtMTA2Myw3ICs3MjIsNyBAQAogICoKICAqLwogCi1zdGF0aWMgaW50IHY5ZnNfdmZzX3VubGluayhzdHJ1Y3QgaW5vZGUgKmksIHN0cnVjdCBkZW50cnkgKmQpCitpbnQgdjlmc192ZnNfdW5saW5rKHN0cnVjdCBpbm9kZSAqaSwgc3RydWN0IGRlbnRyeSAqZCkKIHsKIAlyZXR1cm4gdjlmc19yZW1vdmUoaSwgZCwgMCk7CiB9CkBAIC0xMDc1LDcgKzczNCw3IEBACiAgKgogICovCiAKLXN0YXRpYyBpbnQgdjlmc192ZnNfcm1kaXIoc3RydWN0IGlub2RlICppLCBzdHJ1Y3QgZGVudHJ5ICpkKQoraW50IHY5ZnNfdmZzX3JtZGlyKHN0cnVjdCBpbm9kZSAqaSwgc3RydWN0IGRlbnRyeSAqZCkKIHsKIAlyZXR1cm4gdjlmc19yZW1vdmUoaSwgZCwgMSk7CiB9CkBAIC0xMDg5LDcgKzc0OCw3IEBACiAgKgogICovCiAKLXN0YXRpYyBpbnQKK2ludAogdjlmc192ZnNfcmVuYW1lKHN0cnVjdCBpbm9kZSAqb2xkX2Rpciwgc3RydWN0IGRlbnRyeSAqb2xkX2RlbnRyeSwKIAkJc3RydWN0IGlub2RlICpuZXdfZGlyLCBzdHJ1Y3QgZGVudHJ5ICpuZXdfZGVudHJ5KQogewpAQCAtMTE5Niw0MiArODU1LDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludAotdjlmc192ZnNfZ2V0YXR0cl9kb3RsKHN0cnVjdCB2ZnNtb3VudCAqbW50LCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksCi0JCSBzdHJ1Y3Qga3N0YXQgKnN0YXQpCi17Ci0JaW50IGVycjsKLQlzdHJ1Y3Qgdjlmc19zZXNzaW9uX2luZm8gKnY5c2VzOwotCXN0cnVjdCBwOV9maWQgKmZpZDsKLQlzdHJ1Y3QgcDlfc3RhdF9kb3RsICpzdDsKLQotCVA5X0RQUklOVEsoUDlfREVCVUdfVkZTLCAiZGVudHJ5OiAlcFxuIiwgZGVudHJ5KTsKLQllcnIgPSAtRVBFUk07Ci0JdjlzZXMgPSB2OWZzX2lub2RlMnY5c2VzKGRlbnRyeS0+ZF9pbm9kZSk7Ci0JaWYgKHY5c2VzLT5jYWNoZSA9PSBDQUNIRV9MT09TRSB8fCB2OXNlcy0+Y2FjaGUgPT0gQ0FDSEVfRlNDQUNIRSkKLQkJcmV0dXJuIHNpbXBsZV9nZXRhdHRyKG1udCwgZGVudHJ5LCBzdGF0KTsKLQotCWZpZCA9IHY5ZnNfZmlkX2xvb2t1cChkZW50cnkpOwotCWlmIChJU19FUlIoZmlkKSkKLQkJcmV0dXJuIFBUUl9FUlIoZmlkKTsKLQotCS8qIEFzayBmb3IgYWxsIHRoZSBmaWVsZHMgaW4gc3RhdCBzdHJ1Y3R1cmUuIFNlcnZlciB3aWxsIHJldHVybgotCSAqIHdoYXRldmVyIGl0IHN1cHBvcnRzCi0JICovCi0KLQlzdCA9IHA5X2NsaWVudF9nZXRhdHRyX2RvdGwoZmlkLCBQOV9TVEFUU19BTEwpOwotCWlmIChJU19FUlIoc3QpKQotCQlyZXR1cm4gUFRSX0VSUihzdCk7Ci0KLQl2OWZzX3N0YXQyaW5vZGVfZG90bChzdCwgZGVudHJ5LT5kX2lub2RlKTsKLQlnZW5lcmljX2ZpbGxhdHRyKGRlbnRyeS0+ZF9pbm9kZSwgc3RhdCk7Ci0JLyogQ2hhbmdlIGJsb2NrIHNpemUgdG8gd2hhdCB0aGUgc2VydmVyIHJldHVybmVkICovCi0Jc3RhdC0+Ymxrc2l6ZSA9IHN0LT5zdF9ibGtzaXplOwotCi0Ja2ZyZWUoc3QpOwotCXJldHVybiAwOwotfQotCiAvKioKICAqIHY5ZnNfdmZzX3NldGF0dHIgLSBzZXQgZmlsZSBtZXRhZGF0YQogICogQGRlbnRyeTogZmlsZSB3aG9zZSBtZXRhZGF0YSB0byBzZXQKQEAgLTEyOTEsNjQgKzkxNCw2IEBACiB9CiAKIC8qKgotICogdjlmc192ZnNfc2V0YXR0cl9kb3RsIC0gc2V0IGZpbGUgbWV0YWRhdGEKLSAqIEBkZW50cnk6IGZpbGUgd2hvc2UgbWV0YWRhdGEgdG8gc2V0Ci0gKiBAaWF0dHI6IG1ldGFkYXRhIGFzc2lnbm1lbnQgc3RydWN0dXJlCi0gKgotICovCi0KLWludCB2OWZzX3Zmc19zZXRhdHRyX2RvdGwoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgaWF0dHIgKmlhdHRyKQotewotCWludCByZXR2YWw7Ci0Jc3RydWN0IHY5ZnNfc2Vzc2lvbl9pbmZvICp2OXNlczsKLQlzdHJ1Y3QgcDlfZmlkICpmaWQ7Ci0Jc3RydWN0IHA5X2lhdHRyX2RvdGwgcDlhdHRyOwotCi0JUDlfRFBSSU5USyhQOV9ERUJVR19WRlMsICJcbiIpOwotCi0JcmV0dmFsID0gaW5vZGVfY2hhbmdlX29rKGRlbnRyeS0+ZF9pbm9kZSwgaWF0dHIpOwotCWlmIChyZXR2YWwpCi0JCXJldHVybiByZXR2YWw7Ci0KLQlwOWF0dHIudmFsaWQgPSBpYXR0ci0+aWFfdmFsaWQ7Ci0JcDlhdHRyLm1vZGUgPSBpYXR0ci0+aWFfbW9kZTsKLQlwOWF0dHIudWlkID0gaWF0dHItPmlhX3VpZDsKLQlwOWF0dHIuZ2lkID0gaWF0dHItPmlhX2dpZDsKLQlwOWF0dHIuc2l6ZSA9IGlhdHRyLT5pYV9zaXplOwotCXA5YXR0ci5hdGltZV9zZWMgPSBpYXR0ci0+aWFfYXRpbWUudHZfc2VjOwotCXA5YXR0ci5hdGltZV9uc2VjID0gaWF0dHItPmlhX2F0aW1lLnR2X25zZWM7Ci0JcDlhdHRyLm10aW1lX3NlYyA9IGlhdHRyLT5pYV9tdGltZS50dl9zZWM7Ci0JcDlhdHRyLm10aW1lX25zZWMgPSBpYXR0ci0+aWFfbXRpbWUudHZfbnNlYzsKLQotCXJldHZhbCA9IC1FUEVSTTsKLQl2OXNlcyA9IHY5ZnNfaW5vZGUydjlzZXMoZGVudHJ5LT5kX2lub2RlKTsKLQlmaWQgPSB2OWZzX2ZpZF9sb29rdXAoZGVudHJ5KTsKLQlpZiAoSVNfRVJSKGZpZCkpCi0JCXJldHVybiBQVFJfRVJSKGZpZCk7Ci0KLQlyZXR2YWwgPSBwOV9jbGllbnRfc2V0YXR0cihmaWQsICZwOWF0dHIpOwotCWlmIChyZXR2YWwgPCAwKQotCQlyZXR1cm4gcmV0dmFsOwotCi0JaWYgKChpYXR0ci0+aWFfdmFsaWQgJiBBVFRSX1NJWkUpICYmCi0JICAgIGlhdHRyLT5pYV9zaXplICE9IGlfc2l6ZV9yZWFkKGRlbnRyeS0+ZF9pbm9kZSkpIHsKLQkJcmV0dmFsID0gdm10cnVuY2F0ZShkZW50cnktPmRfaW5vZGUsIGlhdHRyLT5pYV9zaXplKTsKLQkJaWYgKHJldHZhbCkKLQkJCXJldHVybiByZXR2YWw7Ci0JfQotCi0Jc2V0YXR0cl9jb3B5KGRlbnRyeS0+ZF9pbm9kZSwgaWF0dHIpOwotCW1hcmtfaW5vZGVfZGlydHkoZGVudHJ5LT5kX2lub2RlKTsKLQlpZiAoaWF0dHItPmlhX3ZhbGlkICYgQVRUUl9NT0RFKSB7Ci0JCS8qIFdlIGFsc28gd2FudCB0byB1cGRhdGUgQUNMIHdoZW4gd2UgdXBkYXRlIG1vZGUgYml0cyAqLwotCQlyZXR2YWwgPSB2OWZzX2FjbF9jaG1vZChkZW50cnkpOwotCQlpZiAocmV0dmFsIDwgMCkKLQkJCXJldHVybiByZXR2YWw7Ci0JfQotCXJldHVybiAwOwotfQotCi0vKioKICAqIHY5ZnNfc3RhdDJpbm9kZSAtIHBvcHVsYXRlIGFuIGlub2RlIHN0cnVjdHVyZSB3aXRoIG1pc3RhdCBpbmZvCiAgKiBAc3RhdDogUGxhbiA5IG1ldGFkYXRhIChtaXN0YXQpIHN0cnVjdHVyZQogICogQGlub2RlOiBpbm9kZSB0byBwb3B1bGF0ZQpAQCAtMTQyNiw3NyArOTkxLDYgQEAKIH0KIAogLyoqCi0gKiB2OWZzX3N0YXQyaW5vZGVfZG90bCAtIHBvcHVsYXRlIGFuIGlub2RlIHN0cnVjdHVyZSB3aXRoIHN0YXQgaW5mbwotICogQHN0YXQ6IHN0YXQgc3RydWN0dXJlCi0gKiBAaW5vZGU6IGlub2RlIHRvIHBvcHVsYXRlCi0gKiBAc2I6IHN1cGVyYmxvY2sgb2YgZmlsZXN5c3RlbQotICoKLSAqLwotCi12b2lkCi12OWZzX3N0YXQyaW5vZGVfZG90bChzdHJ1Y3QgcDlfc3RhdF9kb3RsICpzdGF0LCBzdHJ1Y3QgaW5vZGUgKmlub2RlKQotewotCi0JaWYgKChzdGF0LT5zdF9yZXN1bHRfbWFzayAmIFA5X1NUQVRTX0JBU0lDKSA9PSBQOV9TVEFUU19CQVNJQykgewotCQlpbm9kZS0+aV9hdGltZS50dl9zZWMgPSBzdGF0LT5zdF9hdGltZV9zZWM7Ci0JCWlub2RlLT5pX2F0aW1lLnR2X25zZWMgPSBzdGF0LT5zdF9hdGltZV9uc2VjOwotCQlpbm9kZS0+aV9tdGltZS50dl9zZWMgPSBzdGF0LT5zdF9tdGltZV9zZWM7Ci0JCWlub2RlLT5pX210aW1lLnR2X25zZWMgPSBzdGF0LT5zdF9tdGltZV9uc2VjOwotCQlpbm9kZS0+aV9jdGltZS50dl9zZWMgPSBzdGF0LT5zdF9jdGltZV9zZWM7Ci0JCWlub2RlLT5pX2N0aW1lLnR2X25zZWMgPSBzdGF0LT5zdF9jdGltZV9uc2VjOwotCQlpbm9kZS0+aV91aWQgPSBzdGF0LT5zdF91aWQ7Ci0JCWlub2RlLT5pX2dpZCA9IHN0YXQtPnN0X2dpZDsKLQkJaW5vZGUtPmlfbmxpbmsgPSBzdGF0LT5zdF9ubGluazsKLQkJaW5vZGUtPmlfbW9kZSA9IHN0YXQtPnN0X21vZGU7Ci0JCWlub2RlLT5pX3JkZXYgPSBuZXdfZGVjb2RlX2RldihzdGF0LT5zdF9yZGV2KTsKLQotCQlpZiAoKFNfSVNCTEsoaW5vZGUtPmlfbW9kZSkpIHx8IChTX0lTQ0hSKGlub2RlLT5pX21vZGUpKSkKLQkJCWluaXRfc3BlY2lhbF9pbm9kZShpbm9kZSwgaW5vZGUtPmlfbW9kZSwgaW5vZGUtPmlfcmRldik7Ci0KLQkJaV9zaXplX3dyaXRlKGlub2RlLCBzdGF0LT5zdF9zaXplKTsKLQkJaW5vZGUtPmlfYmxvY2tzID0gc3RhdC0+c3RfYmxvY2tzOwotCX0gZWxzZSB7Ci0JCWlmIChzdGF0LT5zdF9yZXN1bHRfbWFzayAmIFA5X1NUQVRTX0FUSU1FKSB7Ci0JCQlpbm9kZS0+aV9hdGltZS50dl9zZWMgPSBzdGF0LT5zdF9hdGltZV9zZWM7Ci0JCQlpbm9kZS0+aV9hdGltZS50dl9uc2VjID0gc3RhdC0+c3RfYXRpbWVfbnNlYzsKLQkJfQotCQlpZiAoc3RhdC0+c3RfcmVzdWx0X21hc2sgJiBQOV9TVEFUU19NVElNRSkgewotCQkJaW5vZGUtPmlfbXRpbWUudHZfc2VjID0gc3RhdC0+c3RfbXRpbWVfc2VjOwotCQkJaW5vZGUtPmlfbXRpbWUudHZfbnNlYyA9IHN0YXQtPnN0X210aW1lX25zZWM7Ci0JCX0KLQkJaWYgKHN0YXQtPnN0X3Jlc3VsdF9tYXNrICYgUDlfU1RBVFNfQ1RJTUUpIHsKLQkJCWlub2RlLT5pX2N0aW1lLnR2X3NlYyA9IHN0YXQtPnN0X2N0aW1lX3NlYzsKLQkJCWlub2RlLT5pX2N0aW1lLnR2X25zZWMgPSBzdGF0LT5zdF9jdGltZV9uc2VjOwotCQl9Ci0JCWlmIChzdGF0LT5zdF9yZXN1bHRfbWFzayAmIFA5X1NUQVRTX1VJRCkKLQkJCWlub2RlLT5pX3VpZCA9IHN0YXQtPnN0X3VpZDsKLQkJaWYgKHN0YXQtPnN0X3Jlc3VsdF9tYXNrICYgUDlfU1RBVFNfR0lEKQotCQkJaW5vZGUtPmlfZ2lkID0gc3RhdC0+c3RfZ2lkOwotCQlpZiAoc3RhdC0+c3RfcmVzdWx0X21hc2sgJiBQOV9TVEFUU19OTElOSykKLQkJCWlub2RlLT5pX25saW5rID0gc3RhdC0+c3Rfbmxpbms7Ci0JCWlmIChzdGF0LT5zdF9yZXN1bHRfbWFzayAmIFA5X1NUQVRTX01PREUpIHsKLQkJCWlub2RlLT5pX21vZGUgPSBzdGF0LT5zdF9tb2RlOwotCQkJaWYgKChTX0lTQkxLKGlub2RlLT5pX21vZGUpKSB8fAotCQkJCQkJKFNfSVNDSFIoaW5vZGUtPmlfbW9kZSkpKQotCQkJCWluaXRfc3BlY2lhbF9pbm9kZShpbm9kZSwgaW5vZGUtPmlfbW9kZSwKLQkJCQkJCQkJaW5vZGUtPmlfcmRldik7Ci0JCX0KLQkJaWYgKHN0YXQtPnN0X3Jlc3VsdF9tYXNrICYgUDlfU1RBVFNfUkRFVikKLQkJCWlub2RlLT5pX3JkZXYgPSBuZXdfZGVjb2RlX2RldihzdGF0LT5zdF9yZGV2KTsKLQkJaWYgKHN0YXQtPnN0X3Jlc3VsdF9tYXNrICYgUDlfU1RBVFNfU0laRSkKLQkJCWlfc2l6ZV93cml0ZShpbm9kZSwgc3RhdC0+c3Rfc2l6ZSk7Ci0JCWlmIChzdGF0LT5zdF9yZXN1bHRfbWFzayAmIFA5X1NUQVRTX0JMT0NLUykKLQkJCWlub2RlLT5pX2Jsb2NrcyA9IHN0YXQtPnN0X2Jsb2NrczsKLQl9Ci0JaWYgKHN0YXQtPnN0X3Jlc3VsdF9tYXNrICYgUDlfU1RBVFNfR0VOKQotCQkJaW5vZGUtPmlfZ2VuZXJhdGlvbiA9IHN0YXQtPnN0X2dlbjsKLQotCS8qIEN1cnJlbnRseSB3ZSBkb24ndCBzdXBwb3J0IFA5X1NUQVRTX0JUSU1FIGFuZCBQOV9TVEFUU19EQVRBX1ZFUlNJT04KLQkgKiBiZWNhdXNlIHRoZSBpbm9kZSBzdHJ1Y3R1cmUgZG9lcyBub3QgaGF2ZSBmaWVsZHMgZm9yIHRoZW0uCi0JICovCi19Ci0KLS8qKgogICogdjlmc19xaWQyaW5vIC0gY29udmVydCBxaWQgaW50byBpbm9kZSBudW1iZXIKICAqIEBxaWQ6IHFpZCB0byBoYXNoCiAgKgpAQCAtMTYwMiw3ICsxMDk2LDcgQEAKICAqCiAgKi8KIAotc3RhdGljIHZvaWQKK3ZvaWQKIHY5ZnNfdmZzX3B1dF9saW5rKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IG5hbWVpZGF0YSAqbmQsIHZvaWQgKnApCiB7CiAJY2hhciAqcyA9IG5kX2dldF9saW5rKG5kKTsKQEAgLTE2NDYsOTQgKzExNDAsNiBAQAogfQogCiAvKioKLSAqIHY5ZnNfdmZzX3N5bWxpbmtfZG90bCAtIGhlbHBlciBmdW5jdGlvbiB0byBjcmVhdGUgc3ltbGlua3MKLSAqIEBkaXI6IGRpcmVjdG9yeSBpbm9kZSBjb250YWluaW5nIHN5bWxpbmsKLSAqIEBkZW50cnk6IGRlbnRyeSBmb3Igc3ltbGluawotICogQHN5bW5hbWU6IHN5bWxpbmsgZGF0YQotICoKLSAqIFNlZSBBbHNvOiA5UDIwMDAuTCBSRkMgZm9yIG1vcmUgaW5mb3JtYXRpb24KLSAqCi0gKi8KLQotc3RhdGljIGludAotdjlmc192ZnNfc3ltbGlua19kb3RsKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksCi0JCWNvbnN0IGNoYXIgKnN5bW5hbWUpCi17Ci0Jc3RydWN0IHY5ZnNfc2Vzc2lvbl9pbmZvICp2OXNlczsKLQlzdHJ1Y3QgcDlfZmlkICpkZmlkOwotCXN0cnVjdCBwOV9maWQgKmZpZCA9IE5VTEw7Ci0Jc3RydWN0IGlub2RlICppbm9kZTsKLQlzdHJ1Y3QgcDlfcWlkIHFpZDsKLQljaGFyICpuYW1lOwotCWludCBlcnI7Ci0JZ2lkX3QgZ2lkOwotCi0JbmFtZSA9IChjaGFyICopIGRlbnRyeS0+ZF9uYW1lLm5hbWU7Ci0JUDlfRFBSSU5USyhQOV9ERUJVR19WRlMsICJ2OWZzX3Zmc19zeW1saW5rX2RvdGwgOiAlbHUsJXMsJXNcbiIsCi0JCQlkaXItPmlfaW5vLCBuYW1lLCBzeW1uYW1lKTsKLQl2OXNlcyA9IHY5ZnNfaW5vZGUydjlzZXMoZGlyKTsKLQotCWRmaWQgPSB2OWZzX2ZpZF9sb29rdXAoZGVudHJ5LT5kX3BhcmVudCk7Ci0JaWYgKElTX0VSUihkZmlkKSkgewotCQllcnIgPSBQVFJfRVJSKGRmaWQpOwotCQlQOV9EUFJJTlRLKFA5X0RFQlVHX1ZGUywgImZpZCBsb29rdXAgZmFpbGVkICVkXG4iLCBlcnIpOwotCQlyZXR1cm4gZXJyOwotCX0KLQotCWdpZCA9IHY5ZnNfZ2V0X2ZzZ2lkX2Zvcl9jcmVhdGUoZGlyKTsKLQotCS8qIFNlcnZlciBkb2Vzbid0IGFsdGVyIGZpZCBvbiBUU1lNTElOSy4gSGVuY2Ugbm8gbmVlZCB0byBjbG9uZSBpdC4gKi8KLQllcnIgPSBwOV9jbGllbnRfc3ltbGluayhkZmlkLCBuYW1lLCAoY2hhciAqKXN5bW5hbWUsIGdpZCwgJnFpZCk7Ci0KLQlpZiAoZXJyIDwgMCkgewotCQlQOV9EUFJJTlRLKFA5X0RFQlVHX1ZGUywgInA5X2NsaWVudF9zeW1saW5rIGZhaWxlZCAlZFxuIiwgZXJyKTsKLQkJZ290byBlcnJvcjsKLQl9Ci0KLQlpZiAodjlzZXMtPmNhY2hlKSB7Ci0JCS8qIE5vdyB3YWxrIGZyb20gdGhlIHBhcmVudCBzbyB3ZSBjYW4gZ2V0IGFuIHVub3BlbmVkIGZpZC4gKi8KLQkJZmlkID0gcDlfY2xpZW50X3dhbGsoZGZpZCwgMSwgJm5hbWUsIDEpOwotCQlpZiAoSVNfRVJSKGZpZCkpIHsKLQkJCWVyciA9IFBUUl9FUlIoZmlkKTsKLQkJCVA5X0RQUklOVEsoUDlfREVCVUdfVkZTLCAicDlfY2xpZW50X3dhbGsgZmFpbGVkICVkXG4iLAotCQkJCQllcnIpOwotCQkJZmlkID0gTlVMTDsKLQkJCWdvdG8gZXJyb3I7Ci0JCX0KLQotCQkvKiBpbnN0YW50aWF0ZSBpbm9kZSBhbmQgYXNzaWduIHRoZSB1bm9wZW5lZCBmaWQgdG8gZGVudHJ5ICovCi0JCWlub2RlID0gdjlmc19pbm9kZV9mcm9tX2ZpZCh2OXNlcywgZmlkLCBkaXItPmlfc2IpOwotCQlpZiAoSVNfRVJSKGlub2RlKSkgewotCQkJZXJyID0gUFRSX0VSUihpbm9kZSk7Ci0JCQlQOV9EUFJJTlRLKFA5X0RFQlVHX1ZGUywgImlub2RlIGNyZWF0aW9uIGZhaWxlZCAlZFxuIiwKLQkJCQkJZXJyKTsKLQkJCWdvdG8gZXJyb3I7Ci0JCX0KLQkJZF9zZXRfZF9vcChkZW50cnksICZ2OWZzX2NhY2hlZF9kZW50cnlfb3BlcmF0aW9ucyk7Ci0JCWRfaW5zdGFudGlhdGUoZGVudHJ5LCBpbm9kZSk7Ci0JCWVyciA9IHY5ZnNfZmlkX2FkZChkZW50cnksIGZpZCk7Ci0JCWlmIChlcnIgPCAwKQotCQkJZ290byBlcnJvcjsKLQkJZmlkID0gTlVMTDsKLQl9IGVsc2UgewotCQkvKiBOb3QgaW4gY2FjaGVkIG1vZGUuIE5vIG5lZWQgdG8gcG9wdWxhdGUgaW5vZGUgd2l0aCBzdGF0ICovCi0JCWlub2RlID0gdjlmc19nZXRfaW5vZGUoZGlyLT5pX3NiLCBTX0lGTE5LKTsKLQkJaWYgKElTX0VSUihpbm9kZSkpIHsKLQkJCWVyciA9IFBUUl9FUlIoaW5vZGUpOwotCQkJZ290byBlcnJvcjsKLQkJfQotCQlkX3NldF9kX29wKGRlbnRyeSwgJnY5ZnNfZGVudHJ5X29wZXJhdGlvbnMpOwotCQlkX2luc3RhbnRpYXRlKGRlbnRyeSwgaW5vZGUpOwotCX0KLQotZXJyb3I6Ci0JaWYgKGZpZCkKLQkJcDlfY2xpZW50X2NsdW5rKGZpZCk7Ci0KLQlyZXR1cm4gZXJyOwotfQotCi0vKioKICAqIHY5ZnNfdmZzX3N5bWxpbmsgLSBoZWxwZXIgZnVuY3Rpb24gdG8gY3JlYXRlIHN5bWxpbmtzCiAgKiBAZGlyOiBkaXJlY3RvcnkgaW5vZGUgY29udGFpbmluZyBzeW1saW5rCiAgKiBAZGVudHJ5OiBkZW50cnkgZm9yIHN5bWxpbmsKQEAgLTE3OTIsNzcgKzExOTgsNiBAQAogfQogCiAvKioKLSAqIHY5ZnNfdmZzX2xpbmtfZG90bCAtIGNyZWF0ZSBhIGhhcmRsaW5rIGZvciBkb3RsCi0gKiBAb2xkX2RlbnRyeTogZGVudHJ5IGZvciBmaWxlIHRvIGxpbmsgdG8KLSAqIEBkaXI6IGlub2RlIGRlc3RpbmF0aW9uIGZvciBuZXcgbGluawotICogQGRlbnRyeTogZGVudHJ5IGZvciBsaW5rCi0gKgotICovCi0KLXN0YXRpYyBpbnQKLXY5ZnNfdmZzX2xpbmtfZG90bChzdHJ1Y3QgZGVudHJ5ICpvbGRfZGVudHJ5LCBzdHJ1Y3QgaW5vZGUgKmRpciwKLQkJc3RydWN0IGRlbnRyeSAqZGVudHJ5KQotewotCWludCBlcnI7Ci0Jc3RydWN0IHA5X2ZpZCAqZGZpZCwgKm9sZGZpZDsKLQljaGFyICpuYW1lOwotCXN0cnVjdCB2OWZzX3Nlc3Npb25faW5mbyAqdjlzZXM7Ci0Jc3RydWN0IGRlbnRyeSAqZGlyX2RlbnRyeTsKLQotCVA5X0RQUklOVEsoUDlfREVCVUdfVkZTLCAiZGlyIGlubzogJWx1LCBvbGRfbmFtZTogJXMsIG5ld19uYW1lOiAlc1xuIiwKLQkJCWRpci0+aV9pbm8sIG9sZF9kZW50cnktPmRfbmFtZS5uYW1lLAotCQkJZGVudHJ5LT5kX25hbWUubmFtZSk7Ci0KLQl2OXNlcyA9IHY5ZnNfaW5vZGUydjlzZXMoZGlyKTsKLQlkaXJfZGVudHJ5ID0gdjlmc19kZW50cnlfZnJvbV9kaXJfaW5vZGUoZGlyKTsKLQlkZmlkID0gdjlmc19maWRfbG9va3VwKGRpcl9kZW50cnkpOwotCWlmIChJU19FUlIoZGZpZCkpCi0JCXJldHVybiBQVFJfRVJSKGRmaWQpOwotCi0Jb2xkZmlkID0gdjlmc19maWRfbG9va3VwKG9sZF9kZW50cnkpOwotCWlmIChJU19FUlIob2xkZmlkKSkKLQkJcmV0dXJuIFBUUl9FUlIob2xkZmlkKTsKLQotCW5hbWUgPSAoY2hhciAqKSBkZW50cnktPmRfbmFtZS5uYW1lOwotCi0JZXJyID0gcDlfY2xpZW50X2xpbmsoZGZpZCwgb2xkZmlkLCAoY2hhciAqKWRlbnRyeS0+ZF9uYW1lLm5hbWUpOwotCi0JaWYgKGVyciA8IDApIHsKLQkJUDlfRFBSSU5USyhQOV9ERUJVR19WRlMsICJwOV9jbGllbnRfbGluayBmYWlsZWQgJWRcbiIsIGVycik7Ci0JCXJldHVybiBlcnI7Ci0JfQotCi0JaWYgKHY5c2VzLT5jYWNoZSA9PSBDQUNIRV9MT09TRSB8fCB2OXNlcy0+Y2FjaGUgPT0gQ0FDSEVfRlNDQUNIRSkgewotCQkvKiBHZXQgdGhlIGxhdGVzdCBzdGF0IGluZm8gZnJvbSBzZXJ2ZXIuICovCi0JCXN0cnVjdCBwOV9maWQgKmZpZDsKLQkJc3RydWN0IHA5X3N0YXRfZG90bCAqc3Q7Ci0KLQkJZmlkID0gdjlmc19maWRfbG9va3VwKG9sZF9kZW50cnkpOwotCQlpZiAoSVNfRVJSKGZpZCkpCi0JCQlyZXR1cm4gUFRSX0VSUihmaWQpOwotCi0JCXN0ID0gcDlfY2xpZW50X2dldGF0dHJfZG90bChmaWQsIFA5X1NUQVRTX0JBU0lDKTsKLQkJaWYgKElTX0VSUihzdCkpCi0JCQlyZXR1cm4gUFRSX0VSUihzdCk7Ci0KLQkJdjlmc19zdGF0Mmlub2RlX2RvdGwoc3QsIG9sZF9kZW50cnktPmRfaW5vZGUpOwotCi0JCWtmcmVlKHN0KTsKLQl9IGVsc2UgewotCQkvKiBDYWNoaW5nIGRpc2FibGVkLiBObyBuZWVkIHRvIGdldCB1cHRvIGRhdGUgc3RhdCBpbmZvLgotCQkgKiBUaGlzIGRlbnRyeSB3aWxsIGJlIHJlbGVhc2VkIGltbWVkaWF0ZWx5LiBTbywganVzdCBob2xkIHRoZQotCQkgKiBpbm9kZQotCQkgKi8KLQkJaWhvbGQob2xkX2RlbnRyeS0+ZF9pbm9kZSk7Ci0JfQotCi0JZF9zZXRfZF9vcChkZW50cnksIG9sZF9kZW50cnktPmRfb3ApOwotCWRfaW5zdGFudGlhdGUoZGVudHJ5LCBvbGRfZGVudHJ5LT5kX2lub2RlKTsKLQotCXJldHVybiBlcnI7Ci19Ci0KLS8qKgogICogdjlmc192ZnNfbWtub2QgLSBjcmVhdGUgYSBzcGVjaWFsIGZpbGUKICAqIEBkaXI6IGlub2RlIGRlc3RpbmF0aW9uIGZvciBuZXcgbGluawogICogQGRlbnRyeTogZGVudHJ5IGZvciBmaWxlCkBAIC0xOTA3LDE2MCArMTI0Miw2IEBACiAJcmV0dXJuIHJldHZhbDsKIH0KIAotLyoqCi0gKiB2OWZzX3Zmc19ta25vZF9kb3RsIC0gY3JlYXRlIGEgc3BlY2lhbCBmaWxlCi0gKiBAZGlyOiBpbm9kZSBkZXN0aW5hdGlvbiBmb3IgbmV3IGxpbmsKLSAqIEBkZW50cnk6IGRlbnRyeSBmb3IgZmlsZQotICogQG1vZGU6IG1vZGUgZm9yIGNyZWF0aW9uCi0gKiBAcmRldjogZGV2aWNlIGFzc29jaWF0ZWQgd2l0aCBzcGVjaWFsIGZpbGUKLSAqCi0gKi8KLXN0YXRpYyBpbnQKLXY5ZnNfdmZzX21rbm9kX2RvdGwoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50IG9tb2RlLAotCQlkZXZfdCByZGV2KQotewotCWludCBlcnI7Ci0JY2hhciAqbmFtZTsKLQltb2RlX3QgbW9kZTsKLQlzdHJ1Y3Qgdjlmc19zZXNzaW9uX2luZm8gKnY5c2VzOwotCXN0cnVjdCBwOV9maWQgKmZpZCA9IE5VTEwsICpkZmlkID0gTlVMTDsKLQlzdHJ1Y3QgaW5vZGUgKmlub2RlOwotCWdpZF90IGdpZDsKLQlzdHJ1Y3QgcDlfcWlkIHFpZDsKLQlzdHJ1Y3QgZGVudHJ5ICpkaXJfZGVudHJ5OwotCXN0cnVjdCBwb3NpeF9hY2wgKmRhY2wgPSBOVUxMLCAqcGFjbCA9IE5VTEw7Ci0KLQlQOV9EUFJJTlRLKFA5X0RFQlVHX1ZGUywKLQkJIiAlbHUsJXMgbW9kZTogJXggTUFKT1I6ICV1IE1JTk9SOiAldVxuIiwgZGlyLT5pX2lubywKLQkJZGVudHJ5LT5kX25hbWUubmFtZSwgb21vZGUsIE1BSk9SKHJkZXYpLCBNSU5PUihyZGV2KSk7Ci0KLQlpZiAoIW5ld192YWxpZF9kZXYocmRldikpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JdjlzZXMgPSB2OWZzX2lub2RlMnY5c2VzKGRpcik7Ci0JZGlyX2RlbnRyeSA9IHY5ZnNfZGVudHJ5X2Zyb21fZGlyX2lub2RlKGRpcik7Ci0JZGZpZCA9IHY5ZnNfZmlkX2xvb2t1cChkaXJfZGVudHJ5KTsKLQlpZiAoSVNfRVJSKGRmaWQpKSB7Ci0JCWVyciA9IFBUUl9FUlIoZGZpZCk7Ci0JCVA5X0RQUklOVEsoUDlfREVCVUdfVkZTLCAiZmlkIGxvb2t1cCBmYWlsZWQgJWRcbiIsIGVycik7Ci0JCWRmaWQgPSBOVUxMOwotCQlnb3RvIGVycm9yOwotCX0KLQotCWdpZCA9IHY5ZnNfZ2V0X2ZzZ2lkX2Zvcl9jcmVhdGUoZGlyKTsKLQltb2RlID0gb21vZGU7Ci0JLyogVXBkYXRlIG1vZGUgYmFzZWQgb24gQUNMIHZhbHVlICovCi0JZXJyID0gdjlmc19hY2xfbW9kZShkaXIsICZtb2RlLCAmZGFjbCwgJnBhY2wpOwotCWlmIChlcnIpIHsKLQkJUDlfRFBSSU5USyhQOV9ERUJVR19WRlMsCi0JCQkgICAiRmFpbGVkIHRvIGdldCBhY2wgdmFsdWVzIGluIG1rbm9kICVkXG4iLCBlcnIpOwotCQlnb3RvIGVycm9yOwotCX0KLQluYW1lID0gKGNoYXIgKikgZGVudHJ5LT5kX25hbWUubmFtZTsKLQotCWVyciA9IHA5X2NsaWVudF9ta25vZF9kb3RsKGRmaWQsIG5hbWUsIG1vZGUsIHJkZXYsIGdpZCwgJnFpZCk7Ci0JaWYgKGVyciA8IDApCi0JCWdvdG8gZXJyb3I7Ci0KLQkvKiBpbnN0YW50aWF0ZSBpbm9kZSBhbmQgYXNzaWduIHRoZSB1bm9wZW5lZCBmaWQgdG8gdGhlIGRlbnRyeSAqLwotCWlmICh2OXNlcy0+Y2FjaGUgPT0gQ0FDSEVfTE9PU0UgfHwgdjlzZXMtPmNhY2hlID09IENBQ0hFX0ZTQ0FDSEUpIHsKLQkJZmlkID0gcDlfY2xpZW50X3dhbGsoZGZpZCwgMSwgJm5hbWUsIDEpOwotCQlpZiAoSVNfRVJSKGZpZCkpIHsKLQkJCWVyciA9IFBUUl9FUlIoZmlkKTsKLQkJCVA5X0RQUklOVEsoUDlfREVCVUdfVkZTLCAicDlfY2xpZW50X3dhbGsgZmFpbGVkICVkXG4iLAotCQkJCWVycik7Ci0JCQlmaWQgPSBOVUxMOwotCQkJZ290byBlcnJvcjsKLQkJfQotCi0JCWlub2RlID0gdjlmc19pbm9kZV9mcm9tX2ZpZCh2OXNlcywgZmlkLCBkaXItPmlfc2IpOwotCQlpZiAoSVNfRVJSKGlub2RlKSkgewotCQkJZXJyID0gUFRSX0VSUihpbm9kZSk7Ci0JCQlQOV9EUFJJTlRLKFA5X0RFQlVHX1ZGUywgImlub2RlIGNyZWF0aW9uIGZhaWxlZCAlZFxuIiwKLQkJCQllcnIpOwotCQkJZ290byBlcnJvcjsKLQkJfQotCQlkX3NldF9kX29wKGRlbnRyeSwgJnY5ZnNfY2FjaGVkX2RlbnRyeV9vcGVyYXRpb25zKTsKLQkJZF9pbnN0YW50aWF0ZShkZW50cnksIGlub2RlKTsKLQkJZXJyID0gdjlmc19maWRfYWRkKGRlbnRyeSwgZmlkKTsKLQkJaWYgKGVyciA8IDApCi0JCQlnb3RvIGVycm9yOwotCQlmaWQgPSBOVUxMOwotCX0gZWxzZSB7Ci0JCS8qCi0JCSAqIE5vdCBpbiBjYWNoZWQgbW9kZS4gTm8gbmVlZCB0byBwb3B1bGF0ZSBpbm9kZSB3aXRoIHN0YXQuCi0JCSAqIHNvY2tldCBzeXNjYWxsIHJldHVybnMgYSBmZCwgc28gd2UgbmVlZCBpbnN0YW50aWF0ZQotCQkgKi8KLQkJaW5vZGUgPSB2OWZzX2dldF9pbm9kZShkaXItPmlfc2IsIG1vZGUpOwotCQlpZiAoSVNfRVJSKGlub2RlKSkgewotCQkJZXJyID0gUFRSX0VSUihpbm9kZSk7Ci0JCQlnb3RvIGVycm9yOwotCQl9Ci0JCWRfc2V0X2Rfb3AoZGVudHJ5LCAmdjlmc19kZW50cnlfb3BlcmF0aW9ucyk7Ci0JCWRfaW5zdGFudGlhdGUoZGVudHJ5LCBpbm9kZSk7Ci0JfQotCS8qIE5vdyBzZXQgdGhlIEFDTCBiYXNlZCBvbiB0aGUgZGVmYXVsdCB2YWx1ZSAqLwotCXY5ZnNfc2V0X2NyZWF0ZV9hY2woZGVudHJ5LCBkYWNsLCBwYWNsKTsKLWVycm9yOgotCWlmIChmaWQpCi0JCXA5X2NsaWVudF9jbHVuayhmaWQpOwotCXJldHVybiBlcnI7Ci19Ci0KLXN0YXRpYyBpbnQKLXY5ZnNfdmZzX3JlYWRsaW5rX2RvdGwoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBjaGFyICpidWZmZXIsIGludCBidWZsZW4pCi17Ci0JaW50IHJldHZhbDsKLQlzdHJ1Y3QgcDlfZmlkICpmaWQ7Ci0JY2hhciAqdGFyZ2V0ID0gTlVMTDsKLQotCVA5X0RQUklOVEsoUDlfREVCVUdfVkZTLCAiICVzXG4iLCBkZW50cnktPmRfbmFtZS5uYW1lKTsKLQlyZXR2YWwgPSAtRVBFUk07Ci0JZmlkID0gdjlmc19maWRfbG9va3VwKGRlbnRyeSk7Ci0JaWYgKElTX0VSUihmaWQpKQotCQlyZXR1cm4gUFRSX0VSUihmaWQpOwotCi0JcmV0dmFsID0gcDlfY2xpZW50X3JlYWRsaW5rKGZpZCwgJnRhcmdldCk7Ci0JaWYgKHJldHZhbCA8IDApCi0JCXJldHVybiByZXR2YWw7Ci0KLQlzdHJuY3B5KGJ1ZmZlciwgdGFyZ2V0LCBidWZsZW4pOwotCVA5X0RQUklOVEsoUDlfREVCVUdfVkZTLCAiJXMgLT4gJXNcbiIsIGRlbnRyeS0+ZF9uYW1lLm5hbWUsIGJ1ZmZlcik7Ci0KLQlyZXR2YWwgPSBzdHJubGVuKGJ1ZmZlciwgYnVmbGVuKTsKLQlyZXR1cm4gcmV0dmFsOwotfQotCi0vKioKLSAqIHY5ZnNfdmZzX2ZvbGxvd19saW5rX2RvdGwgLSBmb2xsb3cgYSBzeW1saW5rIHBhdGgKLSAqIEBkZW50cnk6IGRlbnRyeSBmb3Igc3ltbGluawotICogQG5kOiBuYW1laWRhdGEKLSAqCi0gKi8KLQotc3RhdGljIHZvaWQgKgotdjlmc192ZnNfZm9sbG93X2xpbmtfZG90bChzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBuYW1laWRhdGEgKm5kKQotewotCWludCBsZW4gPSAwOwotCWNoYXIgKmxpbmsgPSBfX2dldG5hbWUoKTsKLQotCVA5X0RQUklOVEsoUDlfREVCVUdfVkZTLCAiJXMgbiIsIGRlbnRyeS0+ZF9uYW1lLm5hbWUpOwotCi0JaWYgKCFsaW5rKQotCQlsaW5rID0gRVJSX1BUUigtRU5PTUVNKTsKLQllbHNlIHsKLQkJbGVuID0gdjlmc192ZnNfcmVhZGxpbmtfZG90bChkZW50cnksIGxpbmssIFBBVEhfTUFYKTsKLQkJaWYgKGxlbiA8IDApIHsKLQkJCV9fcHV0bmFtZShsaW5rKTsKLQkJCWxpbmsgPSBFUlJfUFRSKGxlbik7Ci0JCX0gZWxzZQotCQkJbGlua1ttaW4obGVuLCBQQVRIX01BWC0xKV0gPSAwOwotCX0KLQluZF9zZXRfbGluayhuZCwgbGluayk7Ci0KLQlyZXR1cm4gTlVMTDsKLX0KLQogc3RhdGljIGNvbnN0IHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIHY5ZnNfZGlyX2lub2RlX29wZXJhdGlvbnNfZG90dSA9IHsKIAkuY3JlYXRlID0gdjlmc192ZnNfY3JlYXRlLAogCS5sb29rdXAgPSB2OWZzX3Zmc19sb29rdXAsCkBAIC0yMDc1LDI1ICsxMjU2LDYgQEAKIAkuc2V0YXR0ciA9IHY5ZnNfdmZzX3NldGF0dHIsCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgdjlmc19kaXJfaW5vZGVfb3BlcmF0aW9uc19kb3RsID0gewotCS5jcmVhdGUgPSB2OWZzX3Zmc19jcmVhdGVfZG90bCwKLQkubG9va3VwID0gdjlmc192ZnNfbG9va3VwLAotCS5saW5rID0gdjlmc192ZnNfbGlua19kb3RsLAotCS5zeW1saW5rID0gdjlmc192ZnNfc3ltbGlua19kb3RsLAotCS51bmxpbmsgPSB2OWZzX3Zmc191bmxpbmssCi0JLm1rZGlyID0gdjlmc192ZnNfbWtkaXJfZG90bCwKLQkucm1kaXIgPSB2OWZzX3Zmc19ybWRpciwKLQkubWtub2QgPSB2OWZzX3Zmc19ta25vZF9kb3RsLAotCS5yZW5hbWUgPSB2OWZzX3Zmc19yZW5hbWUsCi0JLmdldGF0dHIgPSB2OWZzX3Zmc19nZXRhdHRyX2RvdGwsCi0JLnNldGF0dHIgPSB2OWZzX3Zmc19zZXRhdHRyX2RvdGwsCi0JLnNldHhhdHRyID0gZ2VuZXJpY19zZXR4YXR0ciwKLQkuZ2V0eGF0dHIgPSBnZW5lcmljX2dldHhhdHRyLAotCS5yZW1vdmV4YXR0ciA9IGdlbmVyaWNfcmVtb3ZleGF0dHIsCi0JLmxpc3R4YXR0ciA9IHY5ZnNfbGlzdHhhdHRyLAotCS5jaGVja19hY2wgPSB2OWZzX2NoZWNrX2FjbCwKLX07Ci0KIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyB2OWZzX2Rpcl9pbm9kZV9vcGVyYXRpb25zID0gewogCS5jcmVhdGUgPSB2OWZzX3Zmc19jcmVhdGUsCiAJLmxvb2t1cCA9IHY5ZnNfdmZzX2xvb2t1cCwKQEAgLTIxMTEsMTYgKzEyNzMsNiBAQAogCS5zZXRhdHRyID0gdjlmc192ZnNfc2V0YXR0ciwKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyB2OWZzX2ZpbGVfaW5vZGVfb3BlcmF0aW9uc19kb3RsID0gewotCS5nZXRhdHRyID0gdjlmc192ZnNfZ2V0YXR0cl9kb3RsLAotCS5zZXRhdHRyID0gdjlmc192ZnNfc2V0YXR0cl9kb3RsLAotCS5zZXR4YXR0ciA9IGdlbmVyaWNfc2V0eGF0dHIsCi0JLmdldHhhdHRyID0gZ2VuZXJpY19nZXR4YXR0ciwKLQkucmVtb3ZleGF0dHIgPSBnZW5lcmljX3JlbW92ZXhhdHRyLAotCS5saXN0eGF0dHIgPSB2OWZzX2xpc3R4YXR0ciwKLQkuY2hlY2tfYWNsID0gdjlmc19jaGVja19hY2wsCi19OwotCiBzdGF0aWMgY29uc3Qgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgdjlmc19zeW1saW5rX2lub2RlX29wZXJhdGlvbnMgPSB7CiAJLnJlYWRsaW5rID0gZ2VuZXJpY19yZWFkbGluaywKIAkuZm9sbG93X2xpbmsgPSB2OWZzX3Zmc19mb2xsb3dfbGluaywKQEAgLTIxMjksMTQgKzEyODEsMyBAQAogCS5zZXRhdHRyID0gdjlmc192ZnNfc2V0YXR0ciwKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyB2OWZzX3N5bWxpbmtfaW5vZGVfb3BlcmF0aW9uc19kb3RsID0gewotCS5yZWFkbGluayA9IHY5ZnNfdmZzX3JlYWRsaW5rX2RvdGwsCi0JLmZvbGxvd19saW5rID0gdjlmc192ZnNfZm9sbG93X2xpbmtfZG90bCwKLQkucHV0X2xpbmsgPSB2OWZzX3Zmc19wdXRfbGluaywKLQkuZ2V0YXR0ciA9IHY5ZnNfdmZzX2dldGF0dHJfZG90bCwKLQkuc2V0YXR0ciA9IHY5ZnNfdmZzX3NldGF0dHJfZG90bCwKLQkuc2V0eGF0dHIgPSBnZW5lcmljX3NldHhhdHRyLAotCS5nZXR4YXR0ciA9IGdlbmVyaWNfZ2V0eGF0dHIsCi0JLnJlbW92ZXhhdHRyID0gZ2VuZXJpY19yZW1vdmV4YXR0ciwKLQkubGlzdHhhdHRyID0gdjlmc19saXN0eGF0dHIsCi19OwpkaWZmIC0tZ2l0IGEvZnMvOXAvdmZzX2lub2RlX2RvdGwuYyBiL2ZzLzlwL3Zmc19pbm9kZV9kb3RsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmUzZmZhOQotLS0gL2Rldi9udWxsCisrKyBiL2ZzLzlwL3Zmc19pbm9kZV9kb3RsLmMKQEAgLTAsMCArMSw4MjQgQEAKKy8qCisgKiAgbGludXgvZnMvOXAvdmZzX2lub2RlX2RvdGwuYworICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyB2ZnMgaW5vZGUgb3BzIGZvciB0aGUgOVAyMDAwLkwgcHJvdG9jb2wuCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNCBieSBFcmljIFZhbiBIZW5zYmVyZ2VuIDxlcmljdmhAZ21haWwuY29tPgorICogIENvcHlyaWdodCAoQykgMjAwMiBieSBSb24gTWlubmljaCA8cm1pbm5pY2hAbGFubC5nb3Y+CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyAqICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0bzoKKyAqICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqICA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yCisgKiAgQm9zdG9uLCBNQSAgMDIxMTEtMTMwMSAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvaW5ldC5oPgorI2luY2x1ZGUgPGxpbnV4L25hbWVpLmg+CisjaW5jbHVkZSA8bGludXgvaWRyLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgveGF0dHIuaD4KKyNpbmNsdWRlIDxsaW51eC9wb3NpeF9hY2wuaD4KKyNpbmNsdWRlIDxuZXQvOXAvOXAuaD4KKyNpbmNsdWRlIDxuZXQvOXAvY2xpZW50Lmg+CisKKyNpbmNsdWRlICJ2OWZzLmgiCisjaW5jbHVkZSAidjlmc192ZnMuaCIKKyNpbmNsdWRlICJmaWQuaCIKKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgInhhdHRyLmgiCisjaW5jbHVkZSAiYWNsLmgiCisKK3N0YXRpYyBpbnQKK3Y5ZnNfdmZzX21rbm9kX2RvdGwoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50IG9tb2RlLAorCQkgICAgZGV2X3QgcmRldik7CisKKy8qKgorICogdjlmc19nZXRfZnNnaWRfZm9yX2NyZWF0ZSAtIEhlbHBlciBmdW5jdGlvbiB0byBnZXQgdGhlIGdpZCBmb3IgY3JlYXRpbmcgYQorICogbmV3IGZpbGUgc3lzdGVtIG9iamVjdC4gVGhpcyBjaGVja3MgdGhlIFNfSVNHSUQgdG8gZGV0ZXJtaW5lIHRoZSBvd25pbmcKKyAqIGdyb3VwIG9mIHRoZSBuZXcgZmlsZSBzeXN0ZW0gb2JqZWN0LgorICovCisKK3N0YXRpYyBnaWRfdCB2OWZzX2dldF9mc2dpZF9mb3JfY3JlYXRlKHN0cnVjdCBpbm9kZSAqZGlyX2lub2RlKQoreworCUJVR19PTihkaXJfaW5vZGUgPT0gTlVMTCk7CisKKwlpZiAoZGlyX2lub2RlLT5pX21vZGUgJiBTX0lTR0lEKSB7CisJCS8qIHNldF9naWQgYml0IGlzIHNldC4qLworCQlyZXR1cm4gZGlyX2lub2RlLT5pX2dpZDsKKwl9CisJcmV0dXJuIGN1cnJlbnRfZnNnaWQoKTsKK30KKworLyoqCisgKiB2OWZzX2RlbnRyeV9mcm9tX2Rpcl9pbm9kZSAtIGhlbHBlciBmdW5jdGlvbiB0byBnZXQgdGhlIGRlbnRyeSBmcm9tCisgKiBkaXIgaW5vZGUuCisgKgorICovCisKK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICp2OWZzX2RlbnRyeV9mcm9tX2Rpcl9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXN0cnVjdCBkZW50cnkgKmRlbnRyeTsKKworCXNwaW5fbG9jaygmaW5vZGUtPmlfbG9jayk7CisJLyogRGlyZWN0b3J5IHNob3VsZCBoYXZlIG9ubHkgb25lIGVudHJ5LiAqLworCUJVR19PTihTX0lTRElSKGlub2RlLT5pX21vZGUpICYmICFsaXN0X2lzX3Npbmd1bGFyKCZpbm9kZS0+aV9kZW50cnkpKTsKKwlkZW50cnkgPSBsaXN0X2VudHJ5KGlub2RlLT5pX2RlbnRyeS5uZXh0LCBzdHJ1Y3QgZGVudHJ5LCBkX2FsaWFzKTsKKwlzcGluX3VubG9jaygmaW5vZGUtPmlfbG9jayk7CisJcmV0dXJuIGRlbnRyeTsKK30KKworc3RydWN0IGlub2RlICoKK3Y5ZnNfaW5vZGVfZG90bChzdHJ1Y3Qgdjlmc19zZXNzaW9uX2luZm8gKnY5c2VzLCBzdHJ1Y3QgcDlfZmlkICpmaWQsCisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlzdHJ1Y3QgaW5vZGUgKnJldCA9IE5VTEw7CisJaW50IGVycjsKKwlzdHJ1Y3QgcDlfc3RhdF9kb3RsICpzdDsKKworCXN0ID0gcDlfY2xpZW50X2dldGF0dHJfZG90bChmaWQsIFA5X1NUQVRTX0JBU0lDKTsKKwlpZiAoSVNfRVJSKHN0KSkKKwkJcmV0dXJuIEVSUl9DQVNUKHN0KTsKKworCXJldCA9IHY5ZnNfZ2V0X2lub2RlKHNiLCBzdC0+c3RfbW9kZSk7CisJaWYgKElTX0VSUihyZXQpKSB7CisJCWVyciA9IFBUUl9FUlIocmV0KTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwl2OWZzX3N0YXQyaW5vZGVfZG90bChzdCwgcmV0KTsKKwlyZXQtPmlfaW5vID0gdjlmc19xaWQyaW5vKCZzdC0+cWlkKTsKKyNpZmRlZiBDT05GSUdfOVBfRlNDQUNIRQorCXY5ZnNfdmNvb2tpZV9zZXRfcWlkKHJldCwgJnN0LT5xaWQpOworCXY5ZnNfY2FjaGVfaW5vZGVfZ2V0X2Nvb2tpZShyZXQpOworI2VuZGlmCisJZXJyID0gdjlmc19nZXRfYWNsKHJldCwgZmlkKTsKKwlpZiAoZXJyKSB7CisJCWlwdXQocmV0KTsKKwkJZ290byBlcnJvcjsKKwl9CisJa2ZyZWUoc3QpOworCXJldHVybiByZXQ7CitlcnJvcjoKKwlrZnJlZShzdCk7CisJcmV0dXJuIEVSUl9QVFIoZXJyKTsKK30KKworLyoqCisgKiB2OWZzX3Zmc19jcmVhdGVfZG90bCAtIFZGUyBob29rIHRvIGNyZWF0ZSBmaWxlcyBmb3IgOVAyMDAwLkwgcHJvdG9jb2wuCisgKiBAZGlyOiBkaXJlY3RvcnkgaW5vZGUgdGhhdCBpcyBiZWluZyBjcmVhdGVkCisgKiBAZGVudHJ5OiAgZGVudHJ5IHRoYXQgaXMgYmVpbmcgZGVsZXRlZAorICogQG1vZGU6IGNyZWF0ZSBwZXJtaXNzaW9ucworICogQG5kOiBwYXRoIGluZm9ybWF0aW9uCisgKgorICovCisKK3N0YXRpYyBpbnQKK3Y5ZnNfdmZzX2NyZWF0ZV9kb3RsKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGludCBvbW9kZSwKKwkJc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisJaW50IGVyciA9IDA7CisJY2hhciAqbmFtZSA9IE5VTEw7CisJZ2lkX3QgZ2lkOworCWludCBmbGFnczsKKwltb2RlX3QgbW9kZTsKKwlzdHJ1Y3Qgdjlmc19zZXNzaW9uX2luZm8gKnY5c2VzOworCXN0cnVjdCBwOV9maWQgKmZpZCA9IE5VTEw7CisJc3RydWN0IHA5X2ZpZCAqZGZpZCwgKm9maWQ7CisJc3RydWN0IGZpbGUgKmZpbHA7CisJc3RydWN0IHA5X3FpZCBxaWQ7CisJc3RydWN0IGlub2RlICppbm9kZTsKKwlzdHJ1Y3QgcG9zaXhfYWNsICpwYWNsID0gTlVMTCwgKmRhY2wgPSBOVUxMOworCisJdjlzZXMgPSB2OWZzX2lub2RlMnY5c2VzKGRpcik7CisJaWYgKG5kICYmIG5kLT5mbGFncyAmIExPT0tVUF9PUEVOKQorCQlmbGFncyA9IG5kLT5pbnRlbnQub3Blbi5mbGFncyAtIDE7CisJZWxzZSB7CisJCS8qCisJCSAqIGNyZWF0ZSBjYWxsIHdpdGhvdXQgTE9PS1VQX09QRU4gaXMgZHVlCisJCSAqIHRvIG1rbm9kIG9mIHJlZ3VsYXIgZmlsZXMuIFNvIHVzZSBta25vZAorCQkgKiBvcGVyYXRpb24uCisJCSAqLworCQlyZXR1cm4gdjlmc192ZnNfbWtub2RfZG90bChkaXIsIGRlbnRyeSwgb21vZGUsIDApOworCX0KKworCW5hbWUgPSAoY2hhciAqKSBkZW50cnktPmRfbmFtZS5uYW1lOworCVA5X0RQUklOVEsoUDlfREVCVUdfVkZTLCAidjlmc192ZnNfY3JlYXRlX2RvdGw6IG5hbWU6JXMgZmxhZ3M6MHgleCAiCisJCQkibW9kZToweCV4XG4iLCBuYW1lLCBmbGFncywgb21vZGUpOworCisJZGZpZCA9IHY5ZnNfZmlkX2xvb2t1cChkZW50cnktPmRfcGFyZW50KTsKKwlpZiAoSVNfRVJSKGRmaWQpKSB7CisJCWVyciA9IFBUUl9FUlIoZGZpZCk7CisJCVA5X0RQUklOVEsoUDlfREVCVUdfVkZTLCAiZmlkIGxvb2t1cCBmYWlsZWQgJWRcbiIsIGVycik7CisJCXJldHVybiBlcnI7CisJfQorCisJLyogY2xvbmUgYSBmaWQgdG8gdXNlIGZvciBjcmVhdGlvbiAqLworCW9maWQgPSBwOV9jbGllbnRfd2FsayhkZmlkLCAwLCBOVUxMLCAxKTsKKwlpZiAoSVNfRVJSKG9maWQpKSB7CisJCWVyciA9IFBUUl9FUlIob2ZpZCk7CisJCVA5X0RQUklOVEsoUDlfREVCVUdfVkZTLCAicDlfY2xpZW50X3dhbGsgZmFpbGVkICVkXG4iLCBlcnIpOworCQlyZXR1cm4gZXJyOworCX0KKworCWdpZCA9IHY5ZnNfZ2V0X2ZzZ2lkX2Zvcl9jcmVhdGUoZGlyKTsKKworCW1vZGUgPSBvbW9kZTsKKwkvKiBVcGRhdGUgbW9kZSBiYXNlZCBvbiBBQ0wgdmFsdWUgKi8KKwllcnIgPSB2OWZzX2FjbF9tb2RlKGRpciwgJm1vZGUsICZkYWNsLCAmcGFjbCk7CisJaWYgKGVycikgeworCQlQOV9EUFJJTlRLKFA5X0RFQlVHX1ZGUywKKwkJCSAgICJGYWlsZWQgdG8gZ2V0IGFjbCB2YWx1ZXMgaW4gY3JlYXQgJWRcbiIsIGVycik7CisJCWdvdG8gZXJyb3I7CisJfQorCWVyciA9IHA5X2NsaWVudF9jcmVhdGVfZG90bChvZmlkLCBuYW1lLCBmbGFncywgbW9kZSwgZ2lkLCAmcWlkKTsKKwlpZiAoZXJyIDwgMCkgeworCQlQOV9EUFJJTlRLKFA5X0RFQlVHX1ZGUywKKwkJCQkicDlfY2xpZW50X29wZW5fZG90bCBmYWlsZWQgaW4gY3JlYXQgJWRcbiIsCisJCQkJZXJyKTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwkvKiBpbnN0YW50aWF0ZSBpbm9kZSBhbmQgYXNzaWduIHRoZSB1bm9wZW5lZCBmaWQgdG8gdGhlIGRlbnRyeSAqLworCWZpZCA9IHA5X2NsaWVudF93YWxrKGRmaWQsIDEsICZuYW1lLCAxKTsKKwlpZiAoSVNfRVJSKGZpZCkpIHsKKwkJZXJyID0gUFRSX0VSUihmaWQpOworCQlQOV9EUFJJTlRLKFA5X0RFQlVHX1ZGUywgInA5X2NsaWVudF93YWxrIGZhaWxlZCAlZFxuIiwgZXJyKTsKKwkJZmlkID0gTlVMTDsKKwkJZ290byBlcnJvcjsKKwl9CisJaW5vZGUgPSB2OWZzX2lub2RlX2Zyb21fZmlkKHY5c2VzLCBmaWQsIGRpci0+aV9zYik7CisJaWYgKElTX0VSUihpbm9kZSkpIHsKKwkJZXJyID0gUFRSX0VSUihpbm9kZSk7CisJCVA5X0RQUklOVEsoUDlfREVCVUdfVkZTLCAiaW5vZGUgY3JlYXRpb24gZmFpbGVkICVkXG4iLCBlcnIpOworCQlnb3RvIGVycm9yOworCX0KKwlkX2luc3RhbnRpYXRlKGRlbnRyeSwgaW5vZGUpOworCWVyciA9IHY5ZnNfZmlkX2FkZChkZW50cnksIGZpZCk7CisJaWYgKGVyciA8IDApCisJCWdvdG8gZXJyb3I7CisKKwkvKiBOb3cgc2V0IHRoZSBBQ0wgYmFzZWQgb24gdGhlIGRlZmF1bHQgdmFsdWUgKi8KKwl2OWZzX3NldF9jcmVhdGVfYWNsKGRlbnRyeSwgZGFjbCwgcGFjbCk7CisKKwkvKiBTaW5jZSB3ZSBhcmUgb3BlbmluZyBhIGZpbGUsIGFzc2lnbiB0aGUgb3BlbiBmaWQgdG8gdGhlIGZpbGUgKi8KKwlmaWxwID0gbG9va3VwX2luc3RhbnRpYXRlX2ZpbHAobmQsIGRlbnRyeSwgZ2VuZXJpY19maWxlX29wZW4pOworCWlmIChJU19FUlIoZmlscCkpIHsKKwkJcDlfY2xpZW50X2NsdW5rKG9maWQpOworCQlyZXR1cm4gUFRSX0VSUihmaWxwKTsKKwl9CisJZmlscC0+cHJpdmF0ZV9kYXRhID0gb2ZpZDsKKwlyZXR1cm4gMDsKKworZXJyb3I6CisJaWYgKG9maWQpCisJCXA5X2NsaWVudF9jbHVuayhvZmlkKTsKKwlpZiAoZmlkKQorCQlwOV9jbGllbnRfY2x1bmsoZmlkKTsKKwlyZXR1cm4gZXJyOworfQorCisvKioKKyAqIHY5ZnNfdmZzX21rZGlyX2RvdGwgLSBWRlMgbWtkaXIgaG9vayB0byBjcmVhdGUgYSBkaXJlY3RvcnkKKyAqIEBkaXI6ICBpbm9kZSB0aGF0IGlzIGJlaW5nIHVubGlua2VkCisgKiBAZGVudHJ5OiBkZW50cnkgdGhhdCBpcyBiZWluZyB1bmxpbmtlZAorICogQG1vZGU6IG1vZGUgZm9yIG5ldyBkaXJlY3RvcnkKKyAqCisgKi8KKworc3RhdGljIGludCB2OWZzX3Zmc19ta2Rpcl9kb3RsKHN0cnVjdCBpbm9kZSAqZGlyLAorCQkJICAgICAgIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50IG9tb2RlKQoreworCWludCBlcnI7CisJc3RydWN0IHY5ZnNfc2Vzc2lvbl9pbmZvICp2OXNlczsKKwlzdHJ1Y3QgcDlfZmlkICpmaWQgPSBOVUxMLCAqZGZpZCA9IE5VTEw7CisJZ2lkX3QgZ2lkOworCWNoYXIgKm5hbWU7CisJbW9kZV90IG1vZGU7CisJc3RydWN0IGlub2RlICppbm9kZTsKKwlzdHJ1Y3QgcDlfcWlkIHFpZDsKKwlzdHJ1Y3QgZGVudHJ5ICpkaXJfZGVudHJ5OworCXN0cnVjdCBwb3NpeF9hY2wgKmRhY2wgPSBOVUxMLCAqcGFjbCA9IE5VTEw7CisKKwlQOV9EUFJJTlRLKFA5X0RFQlVHX1ZGUywgIm5hbWUgJXNcbiIsIGRlbnRyeS0+ZF9uYW1lLm5hbWUpOworCWVyciA9IDA7CisJdjlzZXMgPSB2OWZzX2lub2RlMnY5c2VzKGRpcik7CisKKwlvbW9kZSB8PSBTX0lGRElSOworCWlmIChkaXItPmlfbW9kZSAmIFNfSVNHSUQpCisJCW9tb2RlIHw9IFNfSVNHSUQ7CisKKwlkaXJfZGVudHJ5ID0gdjlmc19kZW50cnlfZnJvbV9kaXJfaW5vZGUoZGlyKTsKKwlkZmlkID0gdjlmc19maWRfbG9va3VwKGRpcl9kZW50cnkpOworCWlmIChJU19FUlIoZGZpZCkpIHsKKwkJZXJyID0gUFRSX0VSUihkZmlkKTsKKwkJUDlfRFBSSU5USyhQOV9ERUJVR19WRlMsICJmaWQgbG9va3VwIGZhaWxlZCAlZFxuIiwgZXJyKTsKKwkJZGZpZCA9IE5VTEw7CisJCWdvdG8gZXJyb3I7CisJfQorCisJZ2lkID0gdjlmc19nZXRfZnNnaWRfZm9yX2NyZWF0ZShkaXIpOworCW1vZGUgPSBvbW9kZTsKKwkvKiBVcGRhdGUgbW9kZSBiYXNlZCBvbiBBQ0wgdmFsdWUgKi8KKwllcnIgPSB2OWZzX2FjbF9tb2RlKGRpciwgJm1vZGUsICZkYWNsLCAmcGFjbCk7CisJaWYgKGVycikgeworCQlQOV9EUFJJTlRLKFA5X0RFQlVHX1ZGUywKKwkJCSAgICJGYWlsZWQgdG8gZ2V0IGFjbCB2YWx1ZXMgaW4gbWtkaXIgJWRcbiIsIGVycik7CisJCWdvdG8gZXJyb3I7CisJfQorCW5hbWUgPSAoY2hhciAqKSBkZW50cnktPmRfbmFtZS5uYW1lOworCWVyciA9IHA5X2NsaWVudF9ta2Rpcl9kb3RsKGRmaWQsIG5hbWUsIG1vZGUsIGdpZCwgJnFpZCk7CisJaWYgKGVyciA8IDApCisJCWdvdG8gZXJyb3I7CisKKwkvKiBpbnN0YW50aWF0ZSBpbm9kZSBhbmQgYXNzaWduIHRoZSB1bm9wZW5lZCBmaWQgdG8gdGhlIGRlbnRyeSAqLworCWlmICh2OXNlcy0+Y2FjaGUgPT0gQ0FDSEVfTE9PU0UgfHwgdjlzZXMtPmNhY2hlID09IENBQ0hFX0ZTQ0FDSEUpIHsKKwkJZmlkID0gcDlfY2xpZW50X3dhbGsoZGZpZCwgMSwgJm5hbWUsIDEpOworCQlpZiAoSVNfRVJSKGZpZCkpIHsKKwkJCWVyciA9IFBUUl9FUlIoZmlkKTsKKwkJCVA5X0RQUklOVEsoUDlfREVCVUdfVkZTLCAicDlfY2xpZW50X3dhbGsgZmFpbGVkICVkXG4iLAorCQkJCWVycik7CisJCQlmaWQgPSBOVUxMOworCQkJZ290byBlcnJvcjsKKwkJfQorCisJCWlub2RlID0gdjlmc19pbm9kZV9mcm9tX2ZpZCh2OXNlcywgZmlkLCBkaXItPmlfc2IpOworCQlpZiAoSVNfRVJSKGlub2RlKSkgeworCQkJZXJyID0gUFRSX0VSUihpbm9kZSk7CisJCQlQOV9EUFJJTlRLKFA5X0RFQlVHX1ZGUywgImlub2RlIGNyZWF0aW9uIGZhaWxlZCAlZFxuIiwKKwkJCQllcnIpOworCQkJZ290byBlcnJvcjsKKwkJfQorCQlkX2luc3RhbnRpYXRlKGRlbnRyeSwgaW5vZGUpOworCQllcnIgPSB2OWZzX2ZpZF9hZGQoZGVudHJ5LCBmaWQpOworCQlpZiAoZXJyIDwgMCkKKwkJCWdvdG8gZXJyb3I7CisJCWZpZCA9IE5VTEw7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogTm90IGluIGNhY2hlZCBtb2RlLiBObyBuZWVkIHRvIHBvcHVsYXRlCisJCSAqIGlub2RlIHdpdGggc3RhdC4gV2UgbmVlZCB0byBnZXQgYW4gaW5vZGUKKwkJICogc28gdGhhdCB3ZSBjYW4gc2V0IHRoZSBhY2wgd2l0aCBkZW50cnkKKwkJICovCisJCWlub2RlID0gdjlmc19nZXRfaW5vZGUoZGlyLT5pX3NiLCBtb2RlKTsKKwkJaWYgKElTX0VSUihpbm9kZSkpIHsKKwkJCWVyciA9IFBUUl9FUlIoaW5vZGUpOworCQkJZ290byBlcnJvcjsKKwkJfQorCQlkX2luc3RhbnRpYXRlKGRlbnRyeSwgaW5vZGUpOworCX0KKwkvKiBOb3cgc2V0IHRoZSBBQ0wgYmFzZWQgb24gdGhlIGRlZmF1bHQgdmFsdWUgKi8KKwl2OWZzX3NldF9jcmVhdGVfYWNsKGRlbnRyeSwgZGFjbCwgcGFjbCk7CisKK2Vycm9yOgorCWlmIChmaWQpCisJCXA5X2NsaWVudF9jbHVuayhmaWQpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQKK3Y5ZnNfdmZzX2dldGF0dHJfZG90bChzdHJ1Y3QgdmZzbW91bnQgKm1udCwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LAorCQkgc3RydWN0IGtzdGF0ICpzdGF0KQoreworCWludCBlcnI7CisJc3RydWN0IHY5ZnNfc2Vzc2lvbl9pbmZvICp2OXNlczsKKwlzdHJ1Y3QgcDlfZmlkICpmaWQ7CisJc3RydWN0IHA5X3N0YXRfZG90bCAqc3Q7CisKKwlQOV9EUFJJTlRLKFA5X0RFQlVHX1ZGUywgImRlbnRyeTogJXBcbiIsIGRlbnRyeSk7CisJZXJyID0gLUVQRVJNOworCXY5c2VzID0gdjlmc19pbm9kZTJ2OXNlcyhkZW50cnktPmRfaW5vZGUpOworCWlmICh2OXNlcy0+Y2FjaGUgPT0gQ0FDSEVfTE9PU0UgfHwgdjlzZXMtPmNhY2hlID09IENBQ0hFX0ZTQ0FDSEUpCisJCXJldHVybiBzaW1wbGVfZ2V0YXR0cihtbnQsIGRlbnRyeSwgc3RhdCk7CisKKwlmaWQgPSB2OWZzX2ZpZF9sb29rdXAoZGVudHJ5KTsKKwlpZiAoSVNfRVJSKGZpZCkpCisJCXJldHVybiBQVFJfRVJSKGZpZCk7CisKKwkvKiBBc2sgZm9yIGFsbCB0aGUgZmllbGRzIGluIHN0YXQgc3RydWN0dXJlLiBTZXJ2ZXIgd2lsbCByZXR1cm4KKwkgKiB3aGF0ZXZlciBpdCBzdXBwb3J0cworCSAqLworCisJc3QgPSBwOV9jbGllbnRfZ2V0YXR0cl9kb3RsKGZpZCwgUDlfU1RBVFNfQUxMKTsKKwlpZiAoSVNfRVJSKHN0KSkKKwkJcmV0dXJuIFBUUl9FUlIoc3QpOworCisJdjlmc19zdGF0Mmlub2RlX2RvdGwoc3QsIGRlbnRyeS0+ZF9pbm9kZSk7CisJZ2VuZXJpY19maWxsYXR0cihkZW50cnktPmRfaW5vZGUsIHN0YXQpOworCS8qIENoYW5nZSBibG9jayBzaXplIHRvIHdoYXQgdGhlIHNlcnZlciByZXR1cm5lZCAqLworCXN0YXQtPmJsa3NpemUgPSBzdC0+c3RfYmxrc2l6ZTsKKworCWtmcmVlKHN0KTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiB2OWZzX3Zmc19zZXRhdHRyX2RvdGwgLSBzZXQgZmlsZSBtZXRhZGF0YQorICogQGRlbnRyeTogZmlsZSB3aG9zZSBtZXRhZGF0YSB0byBzZXQKKyAqIEBpYXR0cjogbWV0YWRhdGEgYXNzaWdubWVudCBzdHJ1Y3R1cmUKKyAqCisgKi8KKworaW50IHY5ZnNfdmZzX3NldGF0dHJfZG90bChzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBpYXR0ciAqaWF0dHIpCit7CisJaW50IHJldHZhbDsKKwlzdHJ1Y3Qgdjlmc19zZXNzaW9uX2luZm8gKnY5c2VzOworCXN0cnVjdCBwOV9maWQgKmZpZDsKKwlzdHJ1Y3QgcDlfaWF0dHJfZG90bCBwOWF0dHI7CisKKwlQOV9EUFJJTlRLKFA5X0RFQlVHX1ZGUywgIlxuIik7CisKKwlyZXR2YWwgPSBpbm9kZV9jaGFuZ2Vfb2soZGVudHJ5LT5kX2lub2RlLCBpYXR0cik7CisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIHJldHZhbDsKKworCXA5YXR0ci52YWxpZCA9IGlhdHRyLT5pYV92YWxpZDsKKwlwOWF0dHIubW9kZSA9IGlhdHRyLT5pYV9tb2RlOworCXA5YXR0ci51aWQgPSBpYXR0ci0+aWFfdWlkOworCXA5YXR0ci5naWQgPSBpYXR0ci0+aWFfZ2lkOworCXA5YXR0ci5zaXplID0gaWF0dHItPmlhX3NpemU7CisJcDlhdHRyLmF0aW1lX3NlYyA9IGlhdHRyLT5pYV9hdGltZS50dl9zZWM7CisJcDlhdHRyLmF0aW1lX25zZWMgPSBpYXR0ci0+aWFfYXRpbWUudHZfbnNlYzsKKwlwOWF0dHIubXRpbWVfc2VjID0gaWF0dHItPmlhX210aW1lLnR2X3NlYzsKKwlwOWF0dHIubXRpbWVfbnNlYyA9IGlhdHRyLT5pYV9tdGltZS50dl9uc2VjOworCisJcmV0dmFsID0gLUVQRVJNOworCXY5c2VzID0gdjlmc19pbm9kZTJ2OXNlcyhkZW50cnktPmRfaW5vZGUpOworCWZpZCA9IHY5ZnNfZmlkX2xvb2t1cChkZW50cnkpOworCWlmIChJU19FUlIoZmlkKSkKKwkJcmV0dXJuIFBUUl9FUlIoZmlkKTsKKworCXJldHZhbCA9IHA5X2NsaWVudF9zZXRhdHRyKGZpZCwgJnA5YXR0cik7CisJaWYgKHJldHZhbCA8IDApCisJCXJldHVybiByZXR2YWw7CisKKwlpZiAoKGlhdHRyLT5pYV92YWxpZCAmIEFUVFJfU0laRSkgJiYKKwkgICAgaWF0dHItPmlhX3NpemUgIT0gaV9zaXplX3JlYWQoZGVudHJ5LT5kX2lub2RlKSkgeworCQlyZXR2YWwgPSB2bXRydW5jYXRlKGRlbnRyeS0+ZF9pbm9kZSwgaWF0dHItPmlhX3NpemUpOworCQlpZiAocmV0dmFsKQorCQkJcmV0dXJuIHJldHZhbDsKKwl9CisKKwlzZXRhdHRyX2NvcHkoZGVudHJ5LT5kX2lub2RlLCBpYXR0cik7CisJbWFya19pbm9kZV9kaXJ0eShkZW50cnktPmRfaW5vZGUpOworCWlmIChpYXR0ci0+aWFfdmFsaWQgJiBBVFRSX01PREUpIHsKKwkJLyogV2UgYWxzbyB3YW50IHRvIHVwZGF0ZSBBQ0wgd2hlbiB3ZSB1cGRhdGUgbW9kZSBiaXRzICovCisJCXJldHZhbCA9IHY5ZnNfYWNsX2NobW9kKGRlbnRyeSk7CisJCWlmIChyZXR2YWwgPCAwKQorCQkJcmV0dXJuIHJldHZhbDsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogdjlmc19zdGF0Mmlub2RlX2RvdGwgLSBwb3B1bGF0ZSBhbiBpbm9kZSBzdHJ1Y3R1cmUgd2l0aCBzdGF0IGluZm8KKyAqIEBzdGF0OiBzdGF0IHN0cnVjdHVyZQorICogQGlub2RlOiBpbm9kZSB0byBwb3B1bGF0ZQorICogQHNiOiBzdXBlcmJsb2NrIG9mIGZpbGVzeXN0ZW0KKyAqCisgKi8KKwordm9pZAordjlmc19zdGF0Mmlub2RlX2RvdGwoc3RydWN0IHA5X3N0YXRfZG90bCAqc3RhdCwgc3RydWN0IGlub2RlICppbm9kZSkKK3sKKworCWlmICgoc3RhdC0+c3RfcmVzdWx0X21hc2sgJiBQOV9TVEFUU19CQVNJQykgPT0gUDlfU1RBVFNfQkFTSUMpIHsKKwkJaW5vZGUtPmlfYXRpbWUudHZfc2VjID0gc3RhdC0+c3RfYXRpbWVfc2VjOworCQlpbm9kZS0+aV9hdGltZS50dl9uc2VjID0gc3RhdC0+c3RfYXRpbWVfbnNlYzsKKwkJaW5vZGUtPmlfbXRpbWUudHZfc2VjID0gc3RhdC0+c3RfbXRpbWVfc2VjOworCQlpbm9kZS0+aV9tdGltZS50dl9uc2VjID0gc3RhdC0+c3RfbXRpbWVfbnNlYzsKKwkJaW5vZGUtPmlfY3RpbWUudHZfc2VjID0gc3RhdC0+c3RfY3RpbWVfc2VjOworCQlpbm9kZS0+aV9jdGltZS50dl9uc2VjID0gc3RhdC0+c3RfY3RpbWVfbnNlYzsKKwkJaW5vZGUtPmlfdWlkID0gc3RhdC0+c3RfdWlkOworCQlpbm9kZS0+aV9naWQgPSBzdGF0LT5zdF9naWQ7CisJCWlub2RlLT5pX25saW5rID0gc3RhdC0+c3Rfbmxpbms7CisJCWlub2RlLT5pX21vZGUgPSBzdGF0LT5zdF9tb2RlOworCQlpbm9kZS0+aV9yZGV2ID0gbmV3X2RlY29kZV9kZXYoc3RhdC0+c3RfcmRldik7CisKKwkJaWYgKChTX0lTQkxLKGlub2RlLT5pX21vZGUpKSB8fCAoU19JU0NIUihpbm9kZS0+aV9tb2RlKSkpCisJCQlpbml0X3NwZWNpYWxfaW5vZGUoaW5vZGUsIGlub2RlLT5pX21vZGUsIGlub2RlLT5pX3JkZXYpOworCisJCWlfc2l6ZV93cml0ZShpbm9kZSwgc3RhdC0+c3Rfc2l6ZSk7CisJCWlub2RlLT5pX2Jsb2NrcyA9IHN0YXQtPnN0X2Jsb2NrczsKKwl9IGVsc2UgeworCQlpZiAoc3RhdC0+c3RfcmVzdWx0X21hc2sgJiBQOV9TVEFUU19BVElNRSkgeworCQkJaW5vZGUtPmlfYXRpbWUudHZfc2VjID0gc3RhdC0+c3RfYXRpbWVfc2VjOworCQkJaW5vZGUtPmlfYXRpbWUudHZfbnNlYyA9IHN0YXQtPnN0X2F0aW1lX25zZWM7CisJCX0KKwkJaWYgKHN0YXQtPnN0X3Jlc3VsdF9tYXNrICYgUDlfU1RBVFNfTVRJTUUpIHsKKwkJCWlub2RlLT5pX210aW1lLnR2X3NlYyA9IHN0YXQtPnN0X210aW1lX3NlYzsKKwkJCWlub2RlLT5pX210aW1lLnR2X25zZWMgPSBzdGF0LT5zdF9tdGltZV9uc2VjOworCQl9CisJCWlmIChzdGF0LT5zdF9yZXN1bHRfbWFzayAmIFA5X1NUQVRTX0NUSU1FKSB7CisJCQlpbm9kZS0+aV9jdGltZS50dl9zZWMgPSBzdGF0LT5zdF9jdGltZV9zZWM7CisJCQlpbm9kZS0+aV9jdGltZS50dl9uc2VjID0gc3RhdC0+c3RfY3RpbWVfbnNlYzsKKwkJfQorCQlpZiAoc3RhdC0+c3RfcmVzdWx0X21hc2sgJiBQOV9TVEFUU19VSUQpCisJCQlpbm9kZS0+aV91aWQgPSBzdGF0LT5zdF91aWQ7CisJCWlmIChzdGF0LT5zdF9yZXN1bHRfbWFzayAmIFA5X1NUQVRTX0dJRCkKKwkJCWlub2RlLT5pX2dpZCA9IHN0YXQtPnN0X2dpZDsKKwkJaWYgKHN0YXQtPnN0X3Jlc3VsdF9tYXNrICYgUDlfU1RBVFNfTkxJTkspCisJCQlpbm9kZS0+aV9ubGluayA9IHN0YXQtPnN0X25saW5rOworCQlpZiAoc3RhdC0+c3RfcmVzdWx0X21hc2sgJiBQOV9TVEFUU19NT0RFKSB7CisJCQlpbm9kZS0+aV9tb2RlID0gc3RhdC0+c3RfbW9kZTsKKwkJCWlmICgoU19JU0JMSyhpbm9kZS0+aV9tb2RlKSkgfHwKKwkJCQkJCShTX0lTQ0hSKGlub2RlLT5pX21vZGUpKSkKKwkJCQlpbml0X3NwZWNpYWxfaW5vZGUoaW5vZGUsIGlub2RlLT5pX21vZGUsCisJCQkJCQkJCWlub2RlLT5pX3JkZXYpOworCQl9CisJCWlmIChzdGF0LT5zdF9yZXN1bHRfbWFzayAmIFA5X1NUQVRTX1JERVYpCisJCQlpbm9kZS0+aV9yZGV2ID0gbmV3X2RlY29kZV9kZXYoc3RhdC0+c3RfcmRldik7CisJCWlmIChzdGF0LT5zdF9yZXN1bHRfbWFzayAmIFA5X1NUQVRTX1NJWkUpCisJCQlpX3NpemVfd3JpdGUoaW5vZGUsIHN0YXQtPnN0X3NpemUpOworCQlpZiAoc3RhdC0+c3RfcmVzdWx0X21hc2sgJiBQOV9TVEFUU19CTE9DS1MpCisJCQlpbm9kZS0+aV9ibG9ja3MgPSBzdGF0LT5zdF9ibG9ja3M7CisJfQorCWlmIChzdGF0LT5zdF9yZXN1bHRfbWFzayAmIFA5X1NUQVRTX0dFTikKKwkJCWlub2RlLT5pX2dlbmVyYXRpb24gPSBzdGF0LT5zdF9nZW47CisKKwkvKiBDdXJyZW50bHkgd2UgZG9uJ3Qgc3VwcG9ydCBQOV9TVEFUU19CVElNRSBhbmQgUDlfU1RBVFNfREFUQV9WRVJTSU9OCisJICogYmVjYXVzZSB0aGUgaW5vZGUgc3RydWN0dXJlIGRvZXMgbm90IGhhdmUgZmllbGRzIGZvciB0aGVtLgorCSAqLworfQorCitzdGF0aWMgaW50Cit2OWZzX3Zmc19zeW1saW5rX2RvdGwoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwKKwkJY29uc3QgY2hhciAqc3ltbmFtZSkKK3sKKwlzdHJ1Y3Qgdjlmc19zZXNzaW9uX2luZm8gKnY5c2VzOworCXN0cnVjdCBwOV9maWQgKmRmaWQ7CisJc3RydWN0IHA5X2ZpZCAqZmlkID0gTlVMTDsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCXN0cnVjdCBwOV9xaWQgcWlkOworCWNoYXIgKm5hbWU7CisJaW50IGVycjsKKwlnaWRfdCBnaWQ7CisKKwluYW1lID0gKGNoYXIgKikgZGVudHJ5LT5kX25hbWUubmFtZTsKKwlQOV9EUFJJTlRLKFA5X0RFQlVHX1ZGUywgInY5ZnNfdmZzX3N5bWxpbmtfZG90bCA6ICVsdSwlcywlc1xuIiwKKwkJCWRpci0+aV9pbm8sIG5hbWUsIHN5bW5hbWUpOworCXY5c2VzID0gdjlmc19pbm9kZTJ2OXNlcyhkaXIpOworCisJZGZpZCA9IHY5ZnNfZmlkX2xvb2t1cChkZW50cnktPmRfcGFyZW50KTsKKwlpZiAoSVNfRVJSKGRmaWQpKSB7CisJCWVyciA9IFBUUl9FUlIoZGZpZCk7CisJCVA5X0RQUklOVEsoUDlfREVCVUdfVkZTLCAiZmlkIGxvb2t1cCBmYWlsZWQgJWRcbiIsIGVycik7CisJCXJldHVybiBlcnI7CisJfQorCisJZ2lkID0gdjlmc19nZXRfZnNnaWRfZm9yX2NyZWF0ZShkaXIpOworCisJLyogU2VydmVyIGRvZXNuJ3QgYWx0ZXIgZmlkIG9uIFRTWU1MSU5LLiBIZW5jZSBubyBuZWVkIHRvIGNsb25lIGl0LiAqLworCWVyciA9IHA5X2NsaWVudF9zeW1saW5rKGRmaWQsIG5hbWUsIChjaGFyICopc3ltbmFtZSwgZ2lkLCAmcWlkKTsKKworCWlmIChlcnIgPCAwKSB7CisJCVA5X0RQUklOVEsoUDlfREVCVUdfVkZTLCAicDlfY2xpZW50X3N5bWxpbmsgZmFpbGVkICVkXG4iLCBlcnIpOworCQlnb3RvIGVycm9yOworCX0KKworCWlmICh2OXNlcy0+Y2FjaGUpIHsKKwkJLyogTm93IHdhbGsgZnJvbSB0aGUgcGFyZW50IHNvIHdlIGNhbiBnZXQgYW4gdW5vcGVuZWQgZmlkLiAqLworCQlmaWQgPSBwOV9jbGllbnRfd2FsayhkZmlkLCAxLCAmbmFtZSwgMSk7CisJCWlmIChJU19FUlIoZmlkKSkgeworCQkJZXJyID0gUFRSX0VSUihmaWQpOworCQkJUDlfRFBSSU5USyhQOV9ERUJVR19WRlMsICJwOV9jbGllbnRfd2FsayBmYWlsZWQgJWRcbiIsCisJCQkJCWVycik7CisJCQlmaWQgPSBOVUxMOworCQkJZ290byBlcnJvcjsKKwkJfQorCisJCS8qIGluc3RhbnRpYXRlIGlub2RlIGFuZCBhc3NpZ24gdGhlIHVub3BlbmVkIGZpZCB0byBkZW50cnkgKi8KKwkJaW5vZGUgPSB2OWZzX2lub2RlX2Zyb21fZmlkKHY5c2VzLCBmaWQsIGRpci0+aV9zYik7CisJCWlmIChJU19FUlIoaW5vZGUpKSB7CisJCQllcnIgPSBQVFJfRVJSKGlub2RlKTsKKwkJCVA5X0RQUklOVEsoUDlfREVCVUdfVkZTLCAiaW5vZGUgY3JlYXRpb24gZmFpbGVkICVkXG4iLAorCQkJCQllcnIpOworCQkJZ290byBlcnJvcjsKKwkJfQorCQlkX2luc3RhbnRpYXRlKGRlbnRyeSwgaW5vZGUpOworCQllcnIgPSB2OWZzX2ZpZF9hZGQoZGVudHJ5LCBmaWQpOworCQlpZiAoZXJyIDwgMCkKKwkJCWdvdG8gZXJyb3I7CisJCWZpZCA9IE5VTEw7CisJfSBlbHNlIHsKKwkJLyogTm90IGluIGNhY2hlZCBtb2RlLiBObyBuZWVkIHRvIHBvcHVsYXRlIGlub2RlIHdpdGggc3RhdCAqLworCQlpbm9kZSA9IHY5ZnNfZ2V0X2lub2RlKGRpci0+aV9zYiwgU19JRkxOSyk7CisJCWlmIChJU19FUlIoaW5vZGUpKSB7CisJCQllcnIgPSBQVFJfRVJSKGlub2RlKTsKKwkJCWdvdG8gZXJyb3I7CisJCX0KKwkJZF9pbnN0YW50aWF0ZShkZW50cnksIGlub2RlKTsKKwl9CisKK2Vycm9yOgorCWlmIChmaWQpCisJCXA5X2NsaWVudF9jbHVuayhmaWQpOworCisJcmV0dXJuIGVycjsKK30KKworLyoqCisgKiB2OWZzX3Zmc19saW5rX2RvdGwgLSBjcmVhdGUgYSBoYXJkbGluayBmb3IgZG90bAorICogQG9sZF9kZW50cnk6IGRlbnRyeSBmb3IgZmlsZSB0byBsaW5rIHRvCisgKiBAZGlyOiBpbm9kZSBkZXN0aW5hdGlvbiBmb3IgbmV3IGxpbmsKKyAqIEBkZW50cnk6IGRlbnRyeSBmb3IgbGluaworICoKKyAqLworCitzdGF0aWMgaW50Cit2OWZzX3Zmc19saW5rX2RvdGwoc3RydWN0IGRlbnRyeSAqb2xkX2RlbnRyeSwgc3RydWN0IGlub2RlICpkaXIsCisJCXN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK3sKKwlpbnQgZXJyOworCXN0cnVjdCBwOV9maWQgKmRmaWQsICpvbGRmaWQ7CisJY2hhciAqbmFtZTsKKwlzdHJ1Y3Qgdjlmc19zZXNzaW9uX2luZm8gKnY5c2VzOworCXN0cnVjdCBkZW50cnkgKmRpcl9kZW50cnk7CisKKwlQOV9EUFJJTlRLKFA5X0RFQlVHX1ZGUywgImRpciBpbm86ICVsdSwgb2xkX25hbWU6ICVzLCBuZXdfbmFtZTogJXNcbiIsCisJCQlkaXItPmlfaW5vLCBvbGRfZGVudHJ5LT5kX25hbWUubmFtZSwKKwkJCWRlbnRyeS0+ZF9uYW1lLm5hbWUpOworCisJdjlzZXMgPSB2OWZzX2lub2RlMnY5c2VzKGRpcik7CisJZGlyX2RlbnRyeSA9IHY5ZnNfZGVudHJ5X2Zyb21fZGlyX2lub2RlKGRpcik7CisJZGZpZCA9IHY5ZnNfZmlkX2xvb2t1cChkaXJfZGVudHJ5KTsKKwlpZiAoSVNfRVJSKGRmaWQpKQorCQlyZXR1cm4gUFRSX0VSUihkZmlkKTsKKworCW9sZGZpZCA9IHY5ZnNfZmlkX2xvb2t1cChvbGRfZGVudHJ5KTsKKwlpZiAoSVNfRVJSKG9sZGZpZCkpCisJCXJldHVybiBQVFJfRVJSKG9sZGZpZCk7CisKKwluYW1lID0gKGNoYXIgKikgZGVudHJ5LT5kX25hbWUubmFtZTsKKworCWVyciA9IHA5X2NsaWVudF9saW5rKGRmaWQsIG9sZGZpZCwgKGNoYXIgKilkZW50cnktPmRfbmFtZS5uYW1lKTsKKworCWlmIChlcnIgPCAwKSB7CisJCVA5X0RQUklOVEsoUDlfREVCVUdfVkZTLCAicDlfY2xpZW50X2xpbmsgZmFpbGVkICVkXG4iLCBlcnIpOworCQlyZXR1cm4gZXJyOworCX0KKworCWlmICh2OXNlcy0+Y2FjaGUgPT0gQ0FDSEVfTE9PU0UgfHwgdjlzZXMtPmNhY2hlID09IENBQ0hFX0ZTQ0FDSEUpIHsKKwkJLyogR2V0IHRoZSBsYXRlc3Qgc3RhdCBpbmZvIGZyb20gc2VydmVyLiAqLworCQlzdHJ1Y3QgcDlfZmlkICpmaWQ7CisJCXN0cnVjdCBwOV9zdGF0X2RvdGwgKnN0OworCisJCWZpZCA9IHY5ZnNfZmlkX2xvb2t1cChvbGRfZGVudHJ5KTsKKwkJaWYgKElTX0VSUihmaWQpKQorCQkJcmV0dXJuIFBUUl9FUlIoZmlkKTsKKworCQlzdCA9IHA5X2NsaWVudF9nZXRhdHRyX2RvdGwoZmlkLCBQOV9TVEFUU19CQVNJQyk7CisJCWlmIChJU19FUlIoc3QpKQorCQkJcmV0dXJuIFBUUl9FUlIoc3QpOworCisJCXY5ZnNfc3RhdDJpbm9kZV9kb3RsKHN0LCBvbGRfZGVudHJ5LT5kX2lub2RlKTsKKworCQlrZnJlZShzdCk7CisJfSBlbHNlIHsKKwkJLyogQ2FjaGluZyBkaXNhYmxlZC4gTm8gbmVlZCB0byBnZXQgdXB0byBkYXRlIHN0YXQgaW5mby4KKwkJICogVGhpcyBkZW50cnkgd2lsbCBiZSByZWxlYXNlZCBpbW1lZGlhdGVseS4gU28sIGp1c3QgaG9sZCB0aGUKKwkJICogaW5vZGUKKwkJICovCisJCWlob2xkKG9sZF9kZW50cnktPmRfaW5vZGUpOworCX0KKwlkX2luc3RhbnRpYXRlKGRlbnRyeSwgb2xkX2RlbnRyeS0+ZF9pbm9kZSk7CisKKwlyZXR1cm4gZXJyOworfQorCisvKioKKyAqIHY5ZnNfdmZzX21rbm9kX2RvdGwgLSBjcmVhdGUgYSBzcGVjaWFsIGZpbGUKKyAqIEBkaXI6IGlub2RlIGRlc3RpbmF0aW9uIGZvciBuZXcgbGluaworICogQGRlbnRyeTogZGVudHJ5IGZvciBmaWxlCisgKiBAbW9kZTogbW9kZSBmb3IgY3JlYXRpb24KKyAqIEByZGV2OiBkZXZpY2UgYXNzb2NpYXRlZCB3aXRoIHNwZWNpYWwgZmlsZQorICoKKyAqLworc3RhdGljIGludAordjlmc192ZnNfbWtub2RfZG90bChzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBpbnQgb21vZGUsCisJCWRldl90IHJkZXYpCit7CisJaW50IGVycjsKKwljaGFyICpuYW1lOworCW1vZGVfdCBtb2RlOworCXN0cnVjdCB2OWZzX3Nlc3Npb25faW5mbyAqdjlzZXM7CisJc3RydWN0IHA5X2ZpZCAqZmlkID0gTlVMTCwgKmRmaWQgPSBOVUxMOworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisJZ2lkX3QgZ2lkOworCXN0cnVjdCBwOV9xaWQgcWlkOworCXN0cnVjdCBkZW50cnkgKmRpcl9kZW50cnk7CisJc3RydWN0IHBvc2l4X2FjbCAqZGFjbCA9IE5VTEwsICpwYWNsID0gTlVMTDsKKworCVA5X0RQUklOVEsoUDlfREVCVUdfVkZTLAorCQkiICVsdSwlcyBtb2RlOiAleCBNQUpPUjogJXUgTUlOT1I6ICV1XG4iLCBkaXItPmlfaW5vLAorCQlkZW50cnktPmRfbmFtZS5uYW1lLCBvbW9kZSwgTUFKT1IocmRldiksIE1JTk9SKHJkZXYpKTsKKworCWlmICghbmV3X3ZhbGlkX2RldihyZGV2KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl2OXNlcyA9IHY5ZnNfaW5vZGUydjlzZXMoZGlyKTsKKwlkaXJfZGVudHJ5ID0gdjlmc19kZW50cnlfZnJvbV9kaXJfaW5vZGUoZGlyKTsKKwlkZmlkID0gdjlmc19maWRfbG9va3VwKGRpcl9kZW50cnkpOworCWlmIChJU19FUlIoZGZpZCkpIHsKKwkJZXJyID0gUFRSX0VSUihkZmlkKTsKKwkJUDlfRFBSSU5USyhQOV9ERUJVR19WRlMsICJmaWQgbG9va3VwIGZhaWxlZCAlZFxuIiwgZXJyKTsKKwkJZGZpZCA9IE5VTEw7CisJCWdvdG8gZXJyb3I7CisJfQorCisJZ2lkID0gdjlmc19nZXRfZnNnaWRfZm9yX2NyZWF0ZShkaXIpOworCW1vZGUgPSBvbW9kZTsKKwkvKiBVcGRhdGUgbW9kZSBiYXNlZCBvbiBBQ0wgdmFsdWUgKi8KKwllcnIgPSB2OWZzX2FjbF9tb2RlKGRpciwgJm1vZGUsICZkYWNsLCAmcGFjbCk7CisJaWYgKGVycikgeworCQlQOV9EUFJJTlRLKFA5X0RFQlVHX1ZGUywKKwkJCSAgICJGYWlsZWQgdG8gZ2V0IGFjbCB2YWx1ZXMgaW4gbWtub2QgJWRcbiIsIGVycik7CisJCWdvdG8gZXJyb3I7CisJfQorCW5hbWUgPSAoY2hhciAqKSBkZW50cnktPmRfbmFtZS5uYW1lOworCisJZXJyID0gcDlfY2xpZW50X21rbm9kX2RvdGwoZGZpZCwgbmFtZSwgbW9kZSwgcmRldiwgZ2lkLCAmcWlkKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBlcnJvcjsKKworCS8qIGluc3RhbnRpYXRlIGlub2RlIGFuZCBhc3NpZ24gdGhlIHVub3BlbmVkIGZpZCB0byB0aGUgZGVudHJ5ICovCisJaWYgKHY5c2VzLT5jYWNoZSA9PSBDQUNIRV9MT09TRSB8fCB2OXNlcy0+Y2FjaGUgPT0gQ0FDSEVfRlNDQUNIRSkgeworCQlmaWQgPSBwOV9jbGllbnRfd2FsayhkZmlkLCAxLCAmbmFtZSwgMSk7CisJCWlmIChJU19FUlIoZmlkKSkgeworCQkJZXJyID0gUFRSX0VSUihmaWQpOworCQkJUDlfRFBSSU5USyhQOV9ERUJVR19WRlMsICJwOV9jbGllbnRfd2FsayBmYWlsZWQgJWRcbiIsCisJCQkJZXJyKTsKKwkJCWZpZCA9IE5VTEw7CisJCQlnb3RvIGVycm9yOworCQl9CisKKwkJaW5vZGUgPSB2OWZzX2lub2RlX2Zyb21fZmlkKHY5c2VzLCBmaWQsIGRpci0+aV9zYik7CisJCWlmIChJU19FUlIoaW5vZGUpKSB7CisJCQllcnIgPSBQVFJfRVJSKGlub2RlKTsKKwkJCVA5X0RQUklOVEsoUDlfREVCVUdfVkZTLCAiaW5vZGUgY3JlYXRpb24gZmFpbGVkICVkXG4iLAorCQkJCWVycik7CisJCQlnb3RvIGVycm9yOworCQl9CisJCWRfaW5zdGFudGlhdGUoZGVudHJ5LCBpbm9kZSk7CisJCWVyciA9IHY5ZnNfZmlkX2FkZChkZW50cnksIGZpZCk7CisJCWlmIChlcnIgPCAwKQorCQkJZ290byBlcnJvcjsKKwkJZmlkID0gTlVMTDsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBOb3QgaW4gY2FjaGVkIG1vZGUuIE5vIG5lZWQgdG8gcG9wdWxhdGUgaW5vZGUgd2l0aCBzdGF0LgorCQkgKiBzb2NrZXQgc3lzY2FsbCByZXR1cm5zIGEgZmQsIHNvIHdlIG5lZWQgaW5zdGFudGlhdGUKKwkJICovCisJCWlub2RlID0gdjlmc19nZXRfaW5vZGUoZGlyLT5pX3NiLCBtb2RlKTsKKwkJaWYgKElTX0VSUihpbm9kZSkpIHsKKwkJCWVyciA9IFBUUl9FUlIoaW5vZGUpOworCQkJZ290byBlcnJvcjsKKwkJfQorCQlkX2luc3RhbnRpYXRlKGRlbnRyeSwgaW5vZGUpOworCX0KKwkvKiBOb3cgc2V0IHRoZSBBQ0wgYmFzZWQgb24gdGhlIGRlZmF1bHQgdmFsdWUgKi8KKwl2OWZzX3NldF9jcmVhdGVfYWNsKGRlbnRyeSwgZGFjbCwgcGFjbCk7CitlcnJvcjoKKwlpZiAoZmlkKQorCQlwOV9jbGllbnRfY2x1bmsoZmlkKTsKKwlyZXR1cm4gZXJyOworfQorCisvKioKKyAqIHY5ZnNfdmZzX2ZvbGxvd19saW5rX2RvdGwgLSBmb2xsb3cgYSBzeW1saW5rIHBhdGgKKyAqIEBkZW50cnk6IGRlbnRyeSBmb3Igc3ltbGluaworICogQG5kOiBuYW1laWRhdGEKKyAqCisgKi8KKworc3RhdGljIHZvaWQgKgordjlmc192ZnNfZm9sbG93X2xpbmtfZG90bChzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBuYW1laWRhdGEgKm5kKQoreworCWludCByZXR2YWw7CisJc3RydWN0IHA5X2ZpZCAqZmlkOworCWNoYXIgKmxpbmsgPSBfX2dldG5hbWUoKTsKKwljaGFyICp0YXJnZXQ7CisKKwlQOV9EUFJJTlRLKFA5X0RFQlVHX1ZGUywgIiVzXG4iLCBkZW50cnktPmRfbmFtZS5uYW1lKTsKKworCWlmICghbGluaykgeworCQlsaW5rID0gRVJSX1BUUigtRU5PTUVNKTsKKwkJZ290byBuZHNldDsKKwl9CisJZmlkID0gdjlmc19maWRfbG9va3VwKGRlbnRyeSk7CisJaWYgKElTX0VSUihmaWQpKSB7CisJCV9fcHV0bmFtZShsaW5rKTsKKwkJbGluayA9IEVSUl9QVFIoUFRSX0VSUihmaWQpKTsKKwkJZ290byBuZHNldDsKKwl9CisJcmV0dmFsID0gcDlfY2xpZW50X3JlYWRsaW5rKGZpZCwgJnRhcmdldCk7CisJaWYgKCFyZXR2YWwpIHsKKwkJc3RyY3B5KGxpbmssIHRhcmdldCk7CisJCWtmcmVlKHRhcmdldCk7CisJCWdvdG8gbmRzZXQ7CisJfQorCV9fcHV0bmFtZShsaW5rKTsKKwlsaW5rID0gRVJSX1BUUihyZXR2YWwpOworbmRzZXQ6CisJbmRfc2V0X2xpbmsobmQsIGxpbmspOworCXJldHVybiBOVUxMOworfQorCitjb25zdCBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyB2OWZzX2Rpcl9pbm9kZV9vcGVyYXRpb25zX2RvdGwgPSB7CisJLmNyZWF0ZSA9IHY5ZnNfdmZzX2NyZWF0ZV9kb3RsLAorCS5sb29rdXAgPSB2OWZzX3Zmc19sb29rdXAsCisJLmxpbmsgPSB2OWZzX3Zmc19saW5rX2RvdGwsCisJLnN5bWxpbmsgPSB2OWZzX3Zmc19zeW1saW5rX2RvdGwsCisJLnVubGluayA9IHY5ZnNfdmZzX3VubGluaywKKwkubWtkaXIgPSB2OWZzX3Zmc19ta2Rpcl9kb3RsLAorCS5ybWRpciA9IHY5ZnNfdmZzX3JtZGlyLAorCS5ta25vZCA9IHY5ZnNfdmZzX21rbm9kX2RvdGwsCisJLnJlbmFtZSA9IHY5ZnNfdmZzX3JlbmFtZSwKKwkuZ2V0YXR0ciA9IHY5ZnNfdmZzX2dldGF0dHJfZG90bCwKKwkuc2V0YXR0ciA9IHY5ZnNfdmZzX3NldGF0dHJfZG90bCwKKwkuc2V0eGF0dHIgPSBnZW5lcmljX3NldHhhdHRyLAorCS5nZXR4YXR0ciA9IGdlbmVyaWNfZ2V0eGF0dHIsCisJLnJlbW92ZXhhdHRyID0gZ2VuZXJpY19yZW1vdmV4YXR0ciwKKwkubGlzdHhhdHRyID0gdjlmc19saXN0eGF0dHIsCisJLmNoZWNrX2FjbCA9IHY5ZnNfY2hlY2tfYWNsLAorfTsKKworY29uc3Qgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgdjlmc19maWxlX2lub2RlX29wZXJhdGlvbnNfZG90bCA9IHsKKwkuZ2V0YXR0ciA9IHY5ZnNfdmZzX2dldGF0dHJfZG90bCwKKwkuc2V0YXR0ciA9IHY5ZnNfdmZzX3NldGF0dHJfZG90bCwKKwkuc2V0eGF0dHIgPSBnZW5lcmljX3NldHhhdHRyLAorCS5nZXR4YXR0ciA9IGdlbmVyaWNfZ2V0eGF0dHIsCisJLnJlbW92ZXhhdHRyID0gZ2VuZXJpY19yZW1vdmV4YXR0ciwKKwkubGlzdHhhdHRyID0gdjlmc19saXN0eGF0dHIsCisJLmNoZWNrX2FjbCA9IHY5ZnNfY2hlY2tfYWNsLAorfTsKKworY29uc3Qgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgdjlmc19zeW1saW5rX2lub2RlX29wZXJhdGlvbnNfZG90bCA9IHsKKwkucmVhZGxpbmsgPSBnZW5lcmljX3JlYWRsaW5rLAorCS5mb2xsb3dfbGluayA9IHY5ZnNfdmZzX2ZvbGxvd19saW5rX2RvdGwsCisJLnB1dF9saW5rID0gdjlmc192ZnNfcHV0X2xpbmssCisJLmdldGF0dHIgPSB2OWZzX3Zmc19nZXRhdHRyX2RvdGwsCisJLnNldGF0dHIgPSB2OWZzX3Zmc19zZXRhdHRyX2RvdGwsCisJLnNldHhhdHRyID0gZ2VuZXJpY19zZXR4YXR0ciwKKwkuZ2V0eGF0dHIgPSBnZW5lcmljX2dldHhhdHRyLAorCS5yZW1vdmV4YXR0ciA9IGdlbmVyaWNfcmVtb3ZleGF0dHIsCisJLmxpc3R4YXR0ciA9IHY5ZnNfbGlzdHhhdHRyLAorfTsKZGlmZiAtLWdpdCBhL2ZzLzlwL3hhdHRyLmMgYi9mcy85cC94YXR0ci5jCmluZGV4IDQzZWM3ZGYuLmQyODg3NzMgMTAwNjQ0Ci0tLSBhL2ZzLzlwL3hhdHRyLmMKKysrIGIvZnMvOXAveGF0dHIuYwpAQCAtMTMzLDcgKzEzMyw3IEBACiAJCQkicDlfY2xpZW50X3hhdHRyY3JlYXRlIGZhaWxlZCAlZFxuIiwgcmV0dmFsKTsKIAkJZ290byBlcnJvcjsKIAl9Ci0JbXNpemUgPSBmaWQtPmNsbnQtPm1zaXplOzsKKwltc2l6ZSA9IGZpZC0+Y2xudC0+bXNpemU7CiAJd2hpbGUgKHZhbHVlX2xlbikgewogCQlpZiAodmFsdWVfbGVuID4gKG1zaXplIC0gUDlfSU9IRFJTWikpCiAJCQl3cml0ZV9jb3VudCA9IG1zaXplIC0gUDlfSU9IRFJTWjsKZGlmZiAtLWdpdCBhL2ZzL2NpZnMvY2FjaGUuYyBiL2ZzL2NpZnMvY2FjaGUuYwppbmRleCAyMjRkN2JiLi5lNjU0ZGZkIDEwMDY0NAotLS0gYS9mcy9jaWZzL2NhY2hlLmMKKysrIGIvZnMvY2lmcy9jYWNoZS5jCkBAIC02NCw3ICs2NCw5IEBACiAJCQkJICAgdm9pZCAqYnVmZmVyLCB1aW50MTZfdCBtYXhidWYpCiB7CiAJY29uc3Qgc3RydWN0IFRDUF9TZXJ2ZXJfSW5mbyAqc2VydmVyID0gY29va2llX25ldGZzX2RhdGE7Ci0JY29uc3Qgc3RydWN0IHNvY2thZGRyICpzYSA9IChzdHJ1Y3Qgc29ja2FkZHIgKikgJnNlcnZlci0+YWRkci5zb2NrQWRkcjsKKwljb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKnNhID0gKHN0cnVjdCBzb2NrYWRkciAqKSAmc2VydmVyLT5kc3RhZGRyOworCWNvbnN0IHN0cnVjdCBzb2NrYWRkcl9pbiAqYWRkciA9IChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikgc2E7CisJY29uc3Qgc3RydWN0IHNvY2thZGRyX2luNiAqYWRkcjYgPSAoc3RydWN0IHNvY2thZGRyX2luNiAqKSBzYTsKIAlzdHJ1Y3QgY2lmc19zZXJ2ZXJfa2V5ICprZXkgPSBidWZmZXI7CiAJdWludDE2X3Qga2V5X2xlbiA9IHNpemVvZihzdHJ1Y3QgY2lmc19zZXJ2ZXJfa2V5KTsKIApAQCAtNzYsMTYgKzc4LDE2IEBACiAJICovCiAJc3dpdGNoIChzYS0+c2FfZmFtaWx5KSB7CiAJY2FzZSBBRl9JTkVUOgotCQlrZXktPmZhbWlseSA9IHNlcnZlci0+YWRkci5zb2NrQWRkci5zaW5fZmFtaWx5OwotCQlrZXktPnBvcnQgPSBzZXJ2ZXItPmFkZHIuc29ja0FkZHIuc2luX3BvcnQ7Ci0JCWtleS0+YWRkclswXS5pcHY0X2FkZHIgPSBzZXJ2ZXItPmFkZHIuc29ja0FkZHIuc2luX2FkZHI7CisJCWtleS0+ZmFtaWx5ID0gc2EtPnNhX2ZhbWlseTsKKwkJa2V5LT5wb3J0ID0gYWRkci0+c2luX3BvcnQ7CisJCWtleS0+YWRkclswXS5pcHY0X2FkZHIgPSBhZGRyLT5zaW5fYWRkcjsKIAkJa2V5X2xlbiArPSBzaXplb2Yoa2V5LT5hZGRyWzBdLmlwdjRfYWRkcik7CiAJCWJyZWFrOwogCiAJY2FzZSBBRl9JTkVUNjoKLQkJa2V5LT5mYW1pbHkgPSBzZXJ2ZXItPmFkZHIuc29ja0FkZHI2LnNpbjZfZmFtaWx5OwotCQlrZXktPnBvcnQgPSBzZXJ2ZXItPmFkZHIuc29ja0FkZHI2LnNpbjZfcG9ydDsKLQkJa2V5LT5hZGRyWzBdLmlwdjZfYWRkciA9IHNlcnZlci0+YWRkci5zb2NrQWRkcjYuc2luNl9hZGRyOworCQlrZXktPmZhbWlseSA9IHNhLT5zYV9mYW1pbHk7CisJCWtleS0+cG9ydCA9IGFkZHI2LT5zaW42X3BvcnQ7CisJCWtleS0+YWRkclswXS5pcHY2X2FkZHIgPSBhZGRyNi0+c2luNl9hZGRyOwogCQlrZXlfbGVuICs9IHNpemVvZihrZXktPmFkZHJbMF0uaXB2Nl9hZGRyKTsKIAkJYnJlYWs7CiAKZGlmZiAtLWdpdCBhL2ZzL2NpZnMvY2lmc19kZWJ1Zy5jIGIvZnMvY2lmcy9jaWZzX2RlYnVnLmMKaW5kZXggMTAzYWI4Yi4uZWRlOTgzMCAxMDA2NDQKLS0tIGEvZnMvY2lmcy9jaWZzX2RlYnVnLmMKKysrIGIvZnMvY2lmcy9jaWZzX2RlYnVnLmMKQEAgLTExOSwyOSArMTE5LDI3IEBACiAJCSAgICAiRGlzcGxheSBJbnRlcm5hbCBDSUZTIERhdGEgU3RydWN0dXJlcyBmb3IgRGVidWdnaW5nXG4iCiAJCSAgICAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKIAlzZXFfcHJpbnRmKG0sICJDSUZTIFZlcnNpb24gJXNcbiIsIENJRlNfVkVSU0lPTik7Ci0Jc2VxX3ByaW50ZihtLCAiRmVhdHVyZXM6ICIpOworCXNlcV9wcmludGYobSwgIkZlYXR1cmVzOiIpOwogI2lmZGVmIENPTkZJR19DSUZTX0RGU19VUENBTEwKLQlzZXFfcHJpbnRmKG0sICJkZnMiKTsKLQlzZXFfcHV0YyhtLCAnICcpOworCXNlcV9wcmludGYobSwgIiBkZnMiKTsKICNlbmRpZgogI2lmZGVmIENPTkZJR19DSUZTX0ZTQ0FDSEUKLQlzZXFfcHJpbnRmKG0sICJmc2NhY2hlIik7Ci0Jc2VxX3B1dGMobSwgJyAnKTsKKwlzZXFfcHJpbnRmKG0sICIgZnNjYWNoZSIpOwogI2VuZGlmCiAjaWZkZWYgQ09ORklHX0NJRlNfV0VBS19QV19IQVNICi0Jc2VxX3ByaW50ZihtLCAibGFubWFuIik7Ci0Jc2VxX3B1dGMobSwgJyAnKTsKKwlzZXFfcHJpbnRmKG0sICIgbGFubWFuIik7CiAjZW5kaWYKICNpZmRlZiBDT05GSUdfQ0lGU19QT1NJWAotCXNlcV9wcmludGYobSwgInBvc2l4Iik7Ci0Jc2VxX3B1dGMobSwgJyAnKTsKKwlzZXFfcHJpbnRmKG0sICIgcG9zaXgiKTsKICNlbmRpZgogI2lmZGVmIENPTkZJR19DSUZTX1VQQ0FMTAotCXNlcV9wcmludGYobSwgInNwbmVnbyIpOwotCXNlcV9wdXRjKG0sICcgJyk7CisJc2VxX3ByaW50ZihtLCAiIHNwbmVnbyIpOwogI2VuZGlmCiAjaWZkZWYgQ09ORklHX0NJRlNfWEFUVFIKLQlzZXFfcHJpbnRmKG0sICJ4YXR0ciIpOworCXNlcV9wcmludGYobSwgIiB4YXR0ciIpOworI2VuZGlmCisjaWZkZWYgQ09ORklHX0NJRlNfQUNMCisJc2VxX3ByaW50ZihtLCAiIGFjbCIpOwogI2VuZGlmCiAJc2VxX3B1dGMobSwgJ1xuJyk7CiAJc2VxX3ByaW50ZihtLCAiQWN0aXZlIFZGUyBSZXF1ZXN0czogJWRcbiIsIEdsb2JhbFRvdGFsQWN0aXZlWGlkKTsKZGlmZiAtLWdpdCBhL2ZzL2NpZnMvY2lmc19zcG5lZ28uYyBiL2ZzL2NpZnMvY2lmc19zcG5lZ28uYwppbmRleCA4NzA0NDkwLi40ZGZiYTgyIDEwMDY0NAotLS0gYS9mcy9jaWZzL2NpZnNfc3BuZWdvLmMKKysrIGIvZnMvY2lmcy9jaWZzX3NwbmVnby5jCkBAIC05OCw2ICs5OCw4IEBACiBjaWZzX2dldF9zcG5lZ29fa2V5KHN0cnVjdCBjaWZzU2VzSW5mbyAqc2VzSW5mbykKIHsKIAlzdHJ1Y3QgVENQX1NlcnZlcl9JbmZvICpzZXJ2ZXIgPSBzZXNJbmZvLT5zZXJ2ZXI7CisJc3RydWN0IHNvY2thZGRyX2luICpzYSA9IChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikgJnNlcnZlci0+ZHN0YWRkcjsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW42ICpzYTYgPSAoc3RydWN0IHNvY2thZGRyX2luNiAqKSAmc2VydmVyLT5kc3RhZGRyOwogCWNoYXIgKmRlc2NyaXB0aW9uLCAqZHA7CiAJc2l6ZV90IGRlc2NfbGVuOwogCXN0cnVjdCBrZXkgKnNwbmVnb19rZXk7CkBAIC0xMjcsMTAgKzEyOSwxMCBAQAogCWRwID0gZGVzY3JpcHRpb24gKyBzdHJsZW4oZGVzY3JpcHRpb24pOwogCiAJLyogYWRkIHRoZSBzZXJ2ZXIgYWRkcmVzcyAqLwotCWlmIChzZXJ2ZXItPmFkZHIuc29ja0FkZHIuc2luX2ZhbWlseSA9PSBBRl9JTkVUKQotCQlzcHJpbnRmKGRwLCAiaXA0PSVwSTQiLCAmc2VydmVyLT5hZGRyLnNvY2tBZGRyLnNpbl9hZGRyKTsKLQllbHNlIGlmIChzZXJ2ZXItPmFkZHIuc29ja0FkZHIuc2luX2ZhbWlseSA9PSBBRl9JTkVUNikKLQkJc3ByaW50ZihkcCwgImlwNj0lcEk2IiwgJnNlcnZlci0+YWRkci5zb2NrQWRkcjYuc2luNl9hZGRyKTsKKwlpZiAoc2VydmVyLT5kc3RhZGRyLnNzX2ZhbWlseSA9PSBBRl9JTkVUKQorCQlzcHJpbnRmKGRwLCAiaXA0PSVwSTQiLCAmc2EtPnNpbl9hZGRyKTsKKwllbHNlIGlmIChzZXJ2ZXItPmRzdGFkZHIuc3NfZmFtaWx5ID09IEFGX0lORVQ2KQorCQlzcHJpbnRmKGRwLCAiaXA2PSVwSTYiLCAmc2E2LT5zaW42X2FkZHIpOwogCWVsc2UKIAkJZ290byBvdXQ7CiAKZGlmZiAtLWdpdCBhL2ZzL2NpZnMvY2lmc2VuY3J5cHQuYyBiL2ZzL2NpZnMvY2lmc2VuY3J5cHQuYwppbmRleCBmODU2NzMyLi42NmYzZDUwIDEwMDY0NAotLS0gYS9mcy9jaWZzL2NpZnNlbmNyeXB0LmMKKysrIGIvZnMvY2lmcy9jaWZzZW5jcnlwdC5jCkBAIC03Miw2ICs3Miw3IEBACiAJcmV0dXJuIDA7CiB9CiAKKy8qIG11c3QgYmUgY2FsbGVkIHdpdGggc2VydmVyLT5zcnZfbXV0ZXggaGVsZCAqLwogaW50IGNpZnNfc2lnbl9zbWIoc3RydWN0IHNtYl9oZHIgKmNpZnNfcGR1LCBzdHJ1Y3QgVENQX1NlcnZlcl9JbmZvICpzZXJ2ZXIsCiAJCSAgX191MzIgKnBleHBlY3RlZF9yZXNwb25zZV9zZXF1ZW5jZV9udW1iZXIpCiB7CkBAIC04NCwxNCArODUsMTIgQEAKIAlpZiAoKGNpZnNfcGR1LT5GbGFnczIgJiBTTUJGTEcyX1NFQ1VSSVRZX1NJR05BVFVSRSkgPT0gMCkKIAkJcmV0dXJuIHJjOwogCi0Jc3Bpbl9sb2NrKCZHbG9iYWxNaWRfTG9jayk7CiAJY2lmc19wZHUtPlNpZ25hdHVyZS5TZXF1ZW5jZS5TZXF1ZW5jZU51bWJlciA9CiAJCQljcHVfdG9fbGUzMihzZXJ2ZXItPnNlcXVlbmNlX251bWJlcik7CiAJY2lmc19wZHUtPlNpZ25hdHVyZS5TZXF1ZW5jZS5SZXNlcnZlZCA9IDA7CiAKIAkqcGV4cGVjdGVkX3Jlc3BvbnNlX3NlcXVlbmNlX251bWJlciA9IHNlcnZlci0+c2VxdWVuY2VfbnVtYmVyKys7CiAJc2VydmVyLT5zZXF1ZW5jZV9udW1iZXIrKzsKLQlzcGluX3VubG9jaygmR2xvYmFsTWlkX0xvY2spOwogCiAJcmMgPSBjaWZzX2NhbGN1bGF0ZV9zaWduYXR1cmUoY2lmc19wZHUsIHNlcnZlciwgc21iX3NpZ25hdHVyZSk7CiAJaWYgKHJjKQpAQCAtMTQ5LDYgKzE0OCw3IEBACiAJcmV0dXJuIHJjOwogfQogCisvKiBtdXN0IGJlIGNhbGxlZCB3aXRoIHNlcnZlci0+c3J2X211dGV4IGhlbGQgKi8KIGludCBjaWZzX3NpZ25fc21iMihzdHJ1Y3Qga3ZlYyAqaW92LCBpbnQgbl92ZWMsIHN0cnVjdCBUQ1BfU2VydmVyX0luZm8gKnNlcnZlciwKIAkJICAgX191MzIgKnBleHBlY3RlZF9yZXNwb25zZV9zZXF1ZW5jZV9udW1iZXIpCiB7CkBAIC0xNjIsMTQgKzE2MiwxMiBAQAogCWlmICgoY2lmc19wZHUtPkZsYWdzMiAmIFNNQkZMRzJfU0VDVVJJVFlfU0lHTkFUVVJFKSA9PSAwKQogCQlyZXR1cm4gcmM7CiAKLQlzcGluX2xvY2soJkdsb2JhbE1pZF9Mb2NrKTsKIAljaWZzX3BkdS0+U2lnbmF0dXJlLlNlcXVlbmNlLlNlcXVlbmNlTnVtYmVyID0KIAkJCQljcHVfdG9fbGUzMihzZXJ2ZXItPnNlcXVlbmNlX251bWJlcik7CiAJY2lmc19wZHUtPlNpZ25hdHVyZS5TZXF1ZW5jZS5SZXNlcnZlZCA9IDA7CiAKIAkqcGV4cGVjdGVkX3Jlc3BvbnNlX3NlcXVlbmNlX251bWJlciA9IHNlcnZlci0+c2VxdWVuY2VfbnVtYmVyKys7CiAJc2VydmVyLT5zZXF1ZW5jZV9udW1iZXIrKzsKLQlzcGluX3VubG9jaygmR2xvYmFsTWlkX0xvY2spOwogCiAJcmMgPSBjaWZzX2NhbGNfc2lnbmF0dXJlMihpb3YsIG5fdmVjLCBzZXJ2ZXIsIHNtYl9zaWduYXR1cmUpOwogCWlmIChyYykKZGlmZiAtLWdpdCBhL2ZzL2NpZnMvY2lmc2ZzLmMgYi9mcy9jaWZzL2NpZnNmcy5jCmluZGV4IDhlMjFlMGYuLjVlNzA3NWQgMTAwNjQ0Ci0tLSBhL2ZzL2NpZnMvY2lmc2ZzLmMKKysrIGIvZnMvY2lmcy9jaWZzZnMuYwpAQCAtMzI5LDYgKzMyOSw4IEBACiAJY2lmc19pbm9kZS0+aW52YWxpZF9tYXBwaW5nID0gZmFsc2U7CiAJY2lmc19pbm9kZS0+dmZzX2lub2RlLmlfYmxrYml0cyA9IDE0OyAgLyogMioqMTQgPSBDSUZTX01BWF9NU0dTSVpFICovCiAJY2lmc19pbm9kZS0+c2VydmVyX2VvZiA9IDA7CisJY2lmc19pbm9kZS0+dW5pcXVlaWQgPSAwOworCWNpZnNfaW5vZGUtPmNyZWF0ZXRpbWUgPSAwOwogCiAJLyogQ2FuIG5vdCBzZXQgaV9mbGFncyBoZXJlIC0gdGhleSBnZXQgaW1tZWRpYXRlbHkgb3ZlcndyaXR0ZW4KIAkgICB0byB6ZXJvIGJ5IHRoZSBWRlMgKi8KQEAgLTM2MSwxOCArMzYzLDE5IEBACiBzdGF0aWMgdm9pZAogY2lmc19zaG93X2FkZHJlc3Moc3RydWN0IHNlcV9maWxlICpzLCBzdHJ1Y3QgVENQX1NlcnZlcl9JbmZvICpzZXJ2ZXIpCiB7CisJc3RydWN0IHNvY2thZGRyX2luICpzYSA9IChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikgJnNlcnZlci0+ZHN0YWRkcjsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW42ICpzYTYgPSAoc3RydWN0IHNvY2thZGRyX2luNiAqKSAmc2VydmVyLT5kc3RhZGRyOworCiAJc2VxX3ByaW50ZihzLCAiLGFkZHI9Iik7CiAKLQlzd2l0Y2ggKHNlcnZlci0+YWRkci5zb2NrQWRkci5zaW5fZmFtaWx5KSB7CisJc3dpdGNoIChzZXJ2ZXItPmRzdGFkZHIuc3NfZmFtaWx5KSB7CiAJY2FzZSBBRl9JTkVUOgotCQlzZXFfcHJpbnRmKHMsICIlcEk0IiwgJnNlcnZlci0+YWRkci5zb2NrQWRkci5zaW5fYWRkci5zX2FkZHIpOworCQlzZXFfcHJpbnRmKHMsICIlcEk0IiwgJnNhLT5zaW5fYWRkci5zX2FkZHIpOwogCQlicmVhazsKIAljYXNlIEFGX0lORVQ2OgotCQlzZXFfcHJpbnRmKHMsICIlcEk2IiwKLQkJCSAgICZzZXJ2ZXItPmFkZHIuc29ja0FkZHI2LnNpbjZfYWRkci5zNl9hZGRyKTsKLQkJaWYgKHNlcnZlci0+YWRkci5zb2NrQWRkcjYuc2luNl9zY29wZV9pZCkKLQkJCXNlcV9wcmludGYocywgIiUlJXUiLAotCQkJCSAgIHNlcnZlci0+YWRkci5zb2NrQWRkcjYuc2luNl9zY29wZV9pZCk7CisJCXNlcV9wcmludGYocywgIiVwSTYiLCAmc2E2LT5zaW42X2FkZHIuczZfYWRkcik7CisJCWlmIChzYTYtPnNpbjZfc2NvcGVfaWQpCisJCQlzZXFfcHJpbnRmKHMsICIlJSV1Iiwgc2E2LT5zaW42X3Njb3BlX2lkKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJc2VxX3ByaW50ZihzLCAiKHVua25vd24pIik7CmRpZmYgLS1naXQgYS9mcy9jaWZzL2NpZnNnbG9iLmggYi9mcy9jaWZzL2NpZnNnbG9iLmgKaW5kZXggNzEzNmMwYy4uNjA2Y2E4YiAxMDA2NDQKLS0tIGEvZnMvY2lmcy9jaWZzZ2xvYi5oCisrKyBiL2ZzL2NpZnMvY2lmc2dsb2IuaApAQCAtMTYzLDEwICsxNjMsNyBAQAogCWNoYXIgc2VydmVyX1JGQzEwMDFfbmFtZVtSRkMxMDAxX05BTUVfTEVOX1dJVEhfTlVMTF07CiAJY2hhciAqaG9zdG5hbWU7IC8qIGhvc3RuYW1lIHBvcnRpb24gb2YgVU5DIHN0cmluZyAqLwogCXN0cnVjdCBzb2NrZXQgKnNzb2NrZXQ7Ci0JdW5pb24gewotCQlzdHJ1Y3Qgc29ja2FkZHJfaW4gc29ja0FkZHI7Ci0JCXN0cnVjdCBzb2NrYWRkcl9pbjYgc29ja0FkZHI2OwotCX0gYWRkcjsKKwlzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSBkc3RhZGRyOwogCXN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIHNyY2FkZHI7IC8qIGxvY2FsbHkgYmluZCB0byB0aGlzIElQICovCiAJd2FpdF9xdWV1ZV9oZWFkX3QgcmVzcG9uc2VfcTsKIAl3YWl0X3F1ZXVlX2hlYWRfdCByZXF1ZXN0X3E7IC8qIGlmIG1vcmUgdGhhbiBtYXhtcHggdG8gc3J2ciBtdXN0IGJsb2NrKi8KQEAgLTIxMCw3ICsyMDcsNyBAQAogCWNoYXIgY3J5cHRrZXlbQ0lGU19DUllQVE9fS0VZX1NJWkVdOyAvKiB1c2VkIGJ5IG50bG0sIG50bG12MiBldGMgKi8KIAkvKiAxNnRoIGJ5dGUgb2YgUkZDMTAwMSB3b3Jrc3RhdGlvbiBuYW1lIGlzIGFsd2F5cyBudWxsICovCiAJY2hhciB3b3Jrc3RhdGlvbl9SRkMxMDAxX25hbWVbUkZDMTAwMV9OQU1FX0xFTl9XSVRIX05VTExdOwotCV9fdTMyIHNlcXVlbmNlX251bWJlcjsgLyogbmVlZGVkIGZvciBDSUZTIFBEVSBzaWduYXR1cmUgKi8KKwlfX3UzMiBzZXF1ZW5jZV9udW1iZXI7IC8qIGZvciBzaWduaW5nLCBwcm90ZWN0ZWQgYnkgc3J2X211dGV4ICovCiAJc3RydWN0IHNlc3Npb25fa2V5IHNlc3Npb25fa2V5OwogCXVuc2lnbmVkIGxvbmcgbHN0cnA7IC8qIHdoZW4gd2UgZ290IGxhc3QgcmVzcG9uc2UgZnJvbSB0aGlzIHNlcnZlciAqLwogCXUxNiBkaWFsZWN0OyAvKiBkaWFsZWN0IGluZGV4IHRoYXQgc2VydmVyIGNob3NlICovCkBAIC00NTYsNiArNDUzLDcgQEAKIAlib29sIGludmFsaWRfbWFwcGluZzoxOwkJLyogcGFnZWNhY2hlIGlzIGludmFsaWQgKi8KIAl1NjQgIHNlcnZlcl9lb2Y7CQkvKiBjdXJyZW50IGZpbGUgc2l6ZSBvbiBzZXJ2ZXIgKi8KIAl1NjQgIHVuaXF1ZWlkOwkJCS8qIHNlcnZlciBpbm9kZSBudW1iZXIgKi8KKwl1NjQgIGNyZWF0ZXRpbWU7CQkvKiBjcmVhdGlvbiB0aW1lIG9uIHNlcnZlciAqLwogI2lmZGVmIENPTkZJR19DSUZTX0ZTQ0FDSEUKIAlzdHJ1Y3QgZnNjYWNoZV9jb29raWUgKmZzY2FjaGU7CiAjZW5kaWYKQEAgLTU3Niw2ICs1NzQsNyBAQAogCXU2NAkJY2ZfdW5pcXVlaWQ7CiAJdTY0CQljZl9lb2Y7CiAJdTY0CQljZl9ieXRlczsKKwl1NjQJCWNmX2NyZWF0ZXRpbWU7CiAJdWlkX3QJCWNmX3VpZDsKIAlnaWRfdAkJY2ZfZ2lkOwogCXVtb2RlX3QJCWNmX21vZGU7CmRpZmYgLS1naXQgYS9mcy9jaWZzL2NpZnNzbWIuYyBiL2ZzL2NpZnMvY2lmc3NtYi5jCmluZGV4IDY3YWNmYjMuLjJmNjc5NWUgMTAwNjQ0Ci0tLSBhL2ZzL2NpZnMvY2lmc3NtYi5jCisrKyBiL2ZzL2NpZnMvY2lmc3NtYi5jCkBAIC00MDEsMTUgKzQwMSwxMiBAQAogCWVsc2UgaWYgKChzZWNGbGFncyAmIENJRlNTRUNfQVVUSF9NQVNLKSA9PSBDSUZTU0VDX01BWV9LUkI1KSB7CiAJCWNGWUkoMSwgIktlcmJlcm9zIG9ubHkgbWVjaGFuaXNtLCBlbmFibGUgZXh0ZW5kZWQgc2VjdXJpdHkiKTsKIAkJcFNNQi0+aGRyLkZsYWdzMiB8PSBTTUJGTEcyX0VYVF9TRUM7Ci0JfQotI2lmZGVmIENPTkZJR19DSUZTX0VYUEVSSU1FTlRBTAotCWVsc2UgaWYgKChzZWNGbGFncyAmIENJRlNTRUNfTVVTVF9OVExNU1NQKSA9PSBDSUZTU0VDX01VU1RfTlRMTVNTUCkKKwl9IGVsc2UgaWYgKChzZWNGbGFncyAmIENJRlNTRUNfTVVTVF9OVExNU1NQKSA9PSBDSUZTU0VDX01VU1RfTlRMTVNTUCkKIAkJcFNNQi0+aGRyLkZsYWdzMiB8PSBTTUJGTEcyX0VYVF9TRUM7CiAJZWxzZSBpZiAoKHNlY0ZsYWdzICYgQ0lGU1NFQ19BVVRIX01BU0spID09IENJRlNTRUNfTUFZX05UTE1TU1ApIHsKIAkJY0ZZSSgxLCAiTlRMTVNTUCBvbmx5IG1lY2hhbmlzbSwgZW5hYmxlIGV4dGVuZGVkIHNlY3VyaXR5Iik7CiAJCXBTTUItPmhkci5GbGFnczIgfD0gU01CRkxHMl9FWFRfU0VDOwogCX0KLSNlbmRpZgogCiAJY291bnQgPSAwOwogCWZvciAoaSA9IDA7IGkgPCBDSUZTX05VTV9QUk9UOyBpKyspIHsKZGlmZiAtLWdpdCBhL2ZzL2NpZnMvY29ubmVjdC5jIGIvZnMvY2lmcy9jb25uZWN0LmMKaW5kZXggY2MxYTg2MC4uYTY1ZDMxMSAxMDA2NDQKLS0tIGEvZnMvY2lmcy9jb25uZWN0LmMKKysrIGIvZnMvY2lmcy9jb25uZWN0LmMKQEAgLTY0LDggKzY0LDggQEAKIAljaGFyICpVTkM7CiAJY2hhciAqVU5DaXA7CiAJY2hhciAqaW9jaGFyc2V0OyAgLyogbG9jYWwgY29kZSBwYWdlIGZvciBtYXBwaW5nIHRvIGFuZCBmcm9tIFVuaWNvZGUgKi8KLQljaGFyIHNvdXJjZV9yZmMxMDAxX25hbWVbMTZdOyAvKiBuZXRiaW9zIG5hbWUgb2YgY2xpZW50ICovCi0JY2hhciB0YXJnZXRfcmZjMTAwMV9uYW1lWzE2XTsgLyogbmV0YmlvcyBuYW1lIG9mIHNlcnZlciBmb3IgV2luOXgvTUUgKi8KKwljaGFyIHNvdXJjZV9yZmMxMDAxX25hbWVbUkZDMTAwMV9OQU1FX0xFTl9XSVRIX05VTExdOyAvKiBjbG50IG5iIG5hbWUgKi8KKwljaGFyIHRhcmdldF9yZmMxMDAxX25hbWVbUkZDMTAwMV9OQU1FX0xFTl9XSVRIX05VTExdOyAvKiBzcnZyIG5iIG5hbWUgKi8KIAl1aWRfdCBjcmVkX3VpZDsKIAl1aWRfdCBsaW51eF91aWQ7CiAJZ2lkX3QgbGludXhfZ2lkOwpAQCAtMTE1LDggKzExNSw4IEBACiAjZGVmaW5lIFRMSU5LX0VSUk9SX0VYUElSRQkoMSAqIEhaKQogI2RlZmluZSBUTElOS19JRExFX0VYUElSRQkoNjAwICogSFopCiAKLXN0YXRpYyBpbnQgaXB2NF9jb25uZWN0KHN0cnVjdCBUQ1BfU2VydmVyX0luZm8gKnNlcnZlcik7Ci1zdGF0aWMgaW50IGlwdjZfY29ubmVjdChzdHJ1Y3QgVENQX1NlcnZlcl9JbmZvICpzZXJ2ZXIpOworc3RhdGljIGludCBpcF9jb25uZWN0KHN0cnVjdCBUQ1BfU2VydmVyX0luZm8gKnNlcnZlcik7CitzdGF0aWMgaW50IGdlbmVyaWNfaXBfY29ubmVjdChzdHJ1Y3QgVENQX1NlcnZlcl9JbmZvICpzZXJ2ZXIpOwogc3RhdGljIHZvaWQgdGxpbmtfcmJfaW5zZXJ0KHN0cnVjdCByYl9yb290ICpyb290LCBzdHJ1Y3QgdGNvbl9saW5rICpuZXdfdGxpbmspOwogc3RhdGljIHZvaWQgY2lmc19wcnVuZV90bGlua3Moc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKIApAQCAtMjAwLDEwICsyMDAsOSBAQAogCXdoaWxlICgoc2VydmVyLT50Y3BTdGF0dXMgIT0gQ2lmc0V4aXRpbmcpICYmCiAJICAgICAgIChzZXJ2ZXItPnRjcFN0YXR1cyAhPSBDaWZzR29vZCkpIHsKIAkJdHJ5X3RvX2ZyZWV6ZSgpOwotCQlpZiAoc2VydmVyLT5hZGRyLnNvY2tBZGRyNi5zaW42X2ZhbWlseSA9PSBBRl9JTkVUNikKLQkJCXJjID0gaXB2Nl9jb25uZWN0KHNlcnZlcik7Ci0JCWVsc2UKLQkJCXJjID0gaXB2NF9jb25uZWN0KHNlcnZlcik7CisKKwkJLyogd2Ugc2hvdWxkIHRyeSBvbmx5IHRoZSBwb3J0IHdlIGNvbm5lY3RlZCB0byBiZWZvcmUgKi8KKwkJcmMgPSBnZW5lcmljX2lwX2Nvbm5lY3Qoc2VydmVyKTsKIAkJaWYgKHJjKSB7CiAJCQljRllJKDEsICJyZWNvbm5lY3QgZXJyb3IgJWQiLCByYyk7CiAJCQltc2xlZXAoMzAwMCk7CkBAIC00NzcsNyArNDc2LDcgQEAKIAkJCSAqIGluaXRpYWxpemUgZnJhbWUpCiAJCQkgKi8KIAkJCWNpZnNfc2V0X3BvcnQoKHN0cnVjdCBzb2NrYWRkciAqKQotCQkJCQkmc2VydmVyLT5hZGRyLnNvY2tBZGRyLCBDSUZTX1BPUlQpOworCQkJCQkmc2VydmVyLT5kc3RhZGRyLCBDSUZTX1BPUlQpOwogCQkJY2lmc19yZWNvbm5lY3Qoc2VydmVyKTsKIAkJCWNzb2NrZXQgPSBzZXJ2ZXItPnNzb2NrZXQ7CiAJCQl3YWtlX3VwKCZzZXJ2ZXItPnJlc3BvbnNlX3EpOwpAQCAtODE3LDExICs4MTYsMTEgQEAKIAkgKiBpbmZvcm1hdGlvbmFsLCBvbmx5IHVzZWQgZm9yIHNlcnZlcnMgdGhhdCBkbyBub3Qgc3VwcG9ydAogCSAqIHBvcnQgNDQ1IGFuZCBpdCBjYW4gYmUgb3ZlcnJpZGRlbiBhdCBtb3VudCB0aW1lCiAJICovCi0JbWVtc2V0KHZvbC0+c291cmNlX3JmYzEwMDFfbmFtZSwgMHgyMCwgMTUpOwotCWZvciAoaSA9IDA7IGkgPCBzdHJubGVuKG5vZGVuYW1lLCAxNSk7IGkrKykKKwltZW1zZXQodm9sLT5zb3VyY2VfcmZjMTAwMV9uYW1lLCAweDIwLCBSRkMxMDAxX05BTUVfTEVOKTsKKwlmb3IgKGkgPSAwOyBpIDwgc3Rybmxlbihub2RlbmFtZSwgUkZDMTAwMV9OQU1FX0xFTik7IGkrKykKIAkJdm9sLT5zb3VyY2VfcmZjMTAwMV9uYW1lW2ldID0gdG91cHBlcihub2RlbmFtZVtpXSk7CiAKLQl2b2wtPnNvdXJjZV9yZmMxMDAxX25hbWVbMTVdID0gMDsKKwl2b2wtPnNvdXJjZV9yZmMxMDAxX25hbWVbUkZDMTAwMV9OQU1FX0xFTl0gPSAwOwogCS8qIG51bGwgdGFyZ2V0IG5hbWUgaW5kaWNhdGVzIHRvIHVzZSAqU01CU0VSVlIgZGVmYXVsdCBjYWxsZWQgbmFtZQogCSAgIGlmIHdlIGVuZCB1cCBzZW5kaW5nIFJGQzEwMDEgc2Vzc2lvbiBpbml0aWFsaXplICovCiAJdm9sLT50YXJnZXRfcmZjMTAwMV9uYW1lWzBdID0gMDsKQEAgLTk4NSwxMyArOTg0LDExIEBACiAJCQkJcmV0dXJuIDE7CiAJCQl9IGVsc2UgaWYgKHN0cm5pY21wKHZhbHVlLCAia3JiNSIsIDQpID09IDApIHsKIAkJCQl2b2wtPnNlY0ZsZyB8PSBDSUZTU0VDX01BWV9LUkI1OwotI2lmZGVmIENPTkZJR19DSUZTX0VYUEVSSU1FTlRBTAogCQkJfSBlbHNlIGlmIChzdHJuaWNtcCh2YWx1ZSwgIm50bG1zc3BpIiwgOCkgPT0gMCkgewogCQkJCXZvbC0+c2VjRmxnIHw9IENJRlNTRUNfTUFZX05UTE1TU1AgfAogCQkJCQlDSUZTU0VDX01VU1RfU0lHTjsKIAkJCX0gZWxzZSBpZiAoc3RybmljbXAodmFsdWUsICJudGxtc3NwIiwgNykgPT0gMCkgewogCQkJCXZvbC0+c2VjRmxnIHw9IENJRlNTRUNfTUFZX05UTE1TU1A7Ci0jZW5kaWYKIAkJCX0gZWxzZSBpZiAoc3RybmljbXAodmFsdWUsICJudGxtdjJpIiwgNykgPT0gMCkgewogCQkJCXZvbC0+c2VjRmxnIHw9IENJRlNTRUNfTUFZX05UTE1WMiB8CiAJCQkJCUNJRlNTRUNfTVVTVF9TSUdOOwpAQCAtMTE2OCwyMiArMTE2NSwyMiBAQAogCQkJaWYgKCF2YWx1ZSB8fCAhKnZhbHVlIHx8ICgqdmFsdWUgPT0gJyAnKSkgewogCQkJCWNGWUkoMSwgImludmFsaWQgKGVtcHR5KSBuZXRiaW9zbmFtZSIpOwogCQkJfSBlbHNlIHsKLQkJCQltZW1zZXQodm9sLT5zb3VyY2VfcmZjMTAwMV9uYW1lLCAweDIwLCAxNSk7Ci0JCQkJZm9yIChpID0gMDsgaSA8IDE1OyBpKyspIHsKLQkJCQkvKiBCQiBhcmUgdGhlcmUgY2FzZXMgaW4gd2hpY2ggYSBjb21tYSBjYW4gYmUKLQkJCQl2YWxpZCBpbiB0aGlzIHdvcmtzdGF0aW9uIG5ldGJpb3MgbmFtZSAoYW5kIG5lZWQKLQkJCQlzcGVjaWFsIGhhbmRsaW5nKT8gKi8KLQotCQkJCS8qIFdlIGRvIG5vdCB1cHBlcmNhc2UgbmV0Ymlvc25hbWUgZm9yIHVzZXIgKi8KKwkJCQltZW1zZXQodm9sLT5zb3VyY2VfcmZjMTAwMV9uYW1lLCAweDIwLAorCQkJCQlSRkMxMDAxX05BTUVfTEVOKTsKKwkJCQkvKgorCQkJCSAqIEZJWE1FOiBhcmUgdGhlcmUgY2FzZXMgaW4gd2hpY2ggYSBjb21tYSBjYW4KKwkJCQkgKiBiZSB2YWxpZCBpbiB3b3Jrc3RhdGlvbiBuZXRiaW9zIG5hbWUgKGFuZAorCQkJCSAqIG5lZWQgc3BlY2lhbCBoYW5kbGluZyk/CisJCQkJICovCisJCQkJZm9yIChpID0gMDsgaSA8IFJGQzEwMDFfTkFNRV9MRU47IGkrKykgeworCQkJCQkvKiBkb24ndCB1Y2FzZSBuZXRiaW9zbmFtZSBmb3IgdXNlciAqLwogCQkJCQlpZiAodmFsdWVbaV0gPT0gMCkKIAkJCQkJCWJyZWFrOwotCQkJCQllbHNlCi0JCQkJCQl2b2wtPnNvdXJjZV9yZmMxMDAxX25hbWVbaV0gPQotCQkJCQkJCQl2YWx1ZVtpXTsKKwkJCQkJdm9sLT5zb3VyY2VfcmZjMTAwMV9uYW1lW2ldID0gdmFsdWVbaV07CiAJCQkJfQogCQkJCS8qIFRoZSBzdHJpbmcgaGFzIDE2dGggYnl0ZSB6ZXJvIHN0aWxsIGZyb20KIAkJCQlzZXQgYXQgdG9wIG9mIHRoZSBmdW5jdGlvbiAgKi8KLQkJCQlpZiAoKGkgPT0gMTUpICYmICh2YWx1ZVtpXSAhPSAwKSkKKwkJCQlpZiAoaSA9PSBSRkMxMDAxX05BTUVfTEVOICYmIHZhbHVlW2ldICE9IDApCiAJCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIkNJRlM6IG5ldGJpb3NuYW1lIgogCQkJCQkJIiBsb25nZXIgdGhhbiAxNSB0cnVuY2F0ZWQuXG4iKTsKIAkJCX0KQEAgLTExOTMsNyArMTE5MCw4IEBACiAJCQkJY0ZZSSgxLCAiZW1wdHkgc2VydmVyIG5ldGJpb3NuYW1lIHNwZWNpZmllZCIpOwogCQkJfSBlbHNlIHsKIAkJCQkvKiBsYXN0IGJ5dGUsIHR5cGUsIGlzIDB4MjAgZm9yIHNlcnZyIHR5cGUgKi8KLQkJCQltZW1zZXQodm9sLT50YXJnZXRfcmZjMTAwMV9uYW1lLCAweDIwLCAxNik7CisJCQkJbWVtc2V0KHZvbC0+dGFyZ2V0X3JmYzEwMDFfbmFtZSwgMHgyMCwKKwkJCQkJUkZDMTAwMV9OQU1FX0xFTl9XSVRIX05VTEwpOwogCiAJCQkJZm9yIChpID0gMDsgaSA8IDE1OyBpKyspIHsKIAkJCQkvKiBCQiBhcmUgdGhlcmUgY2FzZXMgaW4gd2hpY2ggYSBjb21tYSBjYW4gYmUKQEAgLTEyMTAsNyArMTIwOCw3IEBACiAJCQkJfQogCQkJCS8qIFRoZSBzdHJpbmcgaGFzIDE2dGggYnl0ZSB6ZXJvIHN0aWxsIGZyb20KIAkJCQkgICBzZXQgYXQgdG9wIG9mIHRoZSBmdW5jdGlvbiAgKi8KLQkJCQlpZiAoKGkgPT0gMTUpICYmICh2YWx1ZVtpXSAhPSAwKSkKKwkJCQlpZiAoaSA9PSBSRkMxMDAxX05BTUVfTEVOICYmIHZhbHVlW2ldICE9IDApCiAJCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIkNJRlM6IHNlcnZlciBuZXQiCiAJCQkJCSJiaW9zbmFtZSBsb25nZXIgdGhhbiAxNSB0cnVuY2F0ZWQuXG4iKTsKIAkJCX0KQEAgLTEzNDEsMTAgKzEzMzksOCBAQAogCQkJdm9sLT5ub19wc3hfYWNsID0gMDsKIAkJfSBlbHNlIGlmIChzdHJuaWNtcChkYXRhLCAibm9hY2wiLCA1KSA9PSAwKSB7CiAJCQl2b2wtPm5vX3BzeF9hY2wgPSAxOwotI2lmZGVmIENPTkZJR19DSUZTX0VYUEVSSU1FTlRBTAogCQl9IGVsc2UgaWYgKHN0cm5pY21wKGRhdGEsICJsb2NhbGxlYXNlIiwgNikgPT0gMCkgewogCQkJdm9sLT5sb2NhbF9sZWFzZSA9IDE7Ci0jZW5kaWYKIAkJfSBlbHNlIGlmIChzdHJuaWNtcChkYXRhLCAic2lnbiIsIDQpID09IDApIHsKIAkJCXZvbC0+c2VjRmxnIHw9IENJRlNTRUNfTVVTVF9TSUdOOwogCQl9IGVsc2UgaWYgKHN0cm5pY21wKGRhdGEsICJzZWFsIiwgNCkgPT0gMCkgewpAQCAtMTQ1NCwzNSArMTQ1MCw3MSBAQAogCX0KIH0KIAorLyoKKyAqIElmIG5vIHBvcnQgaXMgc3BlY2lmaWVkIGluIGFkZHIgc3RydWN0dXJlLCB3ZSB0cnkgdG8gbWF0Y2ggd2l0aCA0NDUgcG9ydAorICogYW5kIGlmIGl0IGZhaWxzIC0gd2l0aCAxMzkgcG9ydHMuIEl0IHNob3VsZCBiZSBjYWxsZWQgb25seSBpZiBhZGRyZXNzCisgKiBmYW1pbGllcyBvZiBzZXJ2ZXIgYW5kIGFkZHIgYXJlIGVxdWFsLgorICovCitzdGF0aWMgYm9vbAorbWF0Y2hfcG9ydChzdHJ1Y3QgVENQX1NlcnZlcl9JbmZvICpzZXJ2ZXIsIHN0cnVjdCBzb2NrYWRkciAqYWRkcikKK3sKKwl1bnNpZ25lZCBzaG9ydCBpbnQgcG9ydCwgKnNwb3J0OworCisJc3dpdGNoIChhZGRyLT5zYV9mYW1pbHkpIHsKKwljYXNlIEFGX0lORVQ6CisJCXNwb3J0ID0gJigoc3RydWN0IHNvY2thZGRyX2luICopICZzZXJ2ZXItPmRzdGFkZHIpLT5zaW5fcG9ydDsKKwkJcG9ydCA9ICgoc3RydWN0IHNvY2thZGRyX2luICopIGFkZHIpLT5zaW5fcG9ydDsKKwkJYnJlYWs7CisJY2FzZSBBRl9JTkVUNjoKKwkJc3BvcnQgPSAmKChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopICZzZXJ2ZXItPmRzdGFkZHIpLT5zaW42X3BvcnQ7CisJCXBvcnQgPSAoKHN0cnVjdCBzb2NrYWRkcl9pbjYgKikgYWRkciktPnNpbjZfcG9ydDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJV0FSTl9PTigxKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCWlmICghcG9ydCkgeworCQlwb3J0ID0gaHRvbnMoQ0lGU19QT1JUKTsKKwkJaWYgKHBvcnQgPT0gKnNwb3J0KQorCQkJcmV0dXJuIHRydWU7CisKKwkJcG9ydCA9IGh0b25zKFJGQzEwMDFfUE9SVCk7CisJfQorCisJcmV0dXJuIHBvcnQgPT0gKnNwb3J0OworfQogCiBzdGF0aWMgYm9vbAogbWF0Y2hfYWRkcmVzcyhzdHJ1Y3QgVENQX1NlcnZlcl9JbmZvICpzZXJ2ZXIsIHN0cnVjdCBzb2NrYWRkciAqYWRkciwKIAkgICAgICBzdHJ1Y3Qgc29ja2FkZHIgKnNyY2FkZHIpCiB7Ci0Jc3RydWN0IHNvY2thZGRyX2luICphZGRyNCA9IChzdHJ1Y3Qgc29ja2FkZHJfaW4gKilhZGRyOwotCXN0cnVjdCBzb2NrYWRkcl9pbjYgKmFkZHI2ID0gKHN0cnVjdCBzb2NrYWRkcl9pbjYgKilhZGRyOwotCiAJc3dpdGNoIChhZGRyLT5zYV9mYW1pbHkpIHsKLQljYXNlIEFGX0lORVQ6Ci0JCWlmIChhZGRyNC0+c2luX2FkZHIuc19hZGRyICE9Ci0JCSAgICBzZXJ2ZXItPmFkZHIuc29ja0FkZHIuc2luX2FkZHIuc19hZGRyKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAoYWRkcjQtPnNpbl9wb3J0ICYmCi0JCSAgICBhZGRyNC0+c2luX3BvcnQgIT0gc2VydmVyLT5hZGRyLnNvY2tBZGRyLnNpbl9wb3J0KQorCWNhc2UgQUZfSU5FVDogeworCQlzdHJ1Y3Qgc29ja2FkZHJfaW4gKmFkZHI0ID0gKHN0cnVjdCBzb2NrYWRkcl9pbiAqKWFkZHI7CisJCXN0cnVjdCBzb2NrYWRkcl9pbiAqc3J2X2FkZHI0ID0KKwkJCQkJKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSZzZXJ2ZXItPmRzdGFkZHI7CisKKwkJaWYgKGFkZHI0LT5zaW5fYWRkci5zX2FkZHIgIT0gc3J2X2FkZHI0LT5zaW5fYWRkci5zX2FkZHIpCiAJCQlyZXR1cm4gZmFsc2U7CiAJCWJyZWFrOwotCWNhc2UgQUZfSU5FVDY6CisJfQorCWNhc2UgQUZfSU5FVDY6IHsKKwkJc3RydWN0IHNvY2thZGRyX2luNiAqYWRkcjYgPSAoc3RydWN0IHNvY2thZGRyX2luNiAqKWFkZHI7CisJCXN0cnVjdCBzb2NrYWRkcl9pbjYgKnNydl9hZGRyNiA9CisJCQkJCShzdHJ1Y3Qgc29ja2FkZHJfaW42ICopJnNlcnZlci0+ZHN0YWRkcjsKKwogCQlpZiAoIWlwdjZfYWRkcl9lcXVhbCgmYWRkcjYtPnNpbjZfYWRkciwKLQkJCQkgICAgICZzZXJ2ZXItPmFkZHIuc29ja0FkZHI2LnNpbjZfYWRkcikpCisJCQkJICAgICAmc3J2X2FkZHI2LT5zaW42X2FkZHIpKQogCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAoYWRkcjYtPnNpbjZfc2NvcGVfaWQgIT0KLQkJICAgIHNlcnZlci0+YWRkci5zb2NrQWRkcjYuc2luNl9zY29wZV9pZCkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKGFkZHI2LT5zaW42X3BvcnQgJiYKLQkJICAgIGFkZHI2LT5zaW42X3BvcnQgIT0gc2VydmVyLT5hZGRyLnNvY2tBZGRyNi5zaW42X3BvcnQpCisJCWlmIChhZGRyNi0+c2luNl9zY29wZV9pZCAhPSBzcnZfYWRkcjYtPnNpbjZfc2NvcGVfaWQpCiAJCQlyZXR1cm4gZmFsc2U7CiAJCWJyZWFrOwogCX0KKwlkZWZhdWx0OgorCQlXQVJOX09OKDEpOworCQlyZXR1cm4gZmFsc2U7IC8qIGRvbid0IGV4cGVjdCB0byBiZSBoZXJlICovCisJfQogCiAJaWYgKCFzcmNpcF9tYXRjaGVzKHNyY2FkZHIsIChzdHJ1Y3Qgc29ja2FkZHIgKikmc2VydmVyLT5zcmNhZGRyKSkKIAkJcmV0dXJuIGZhbHNlOwpAQCAtMTU0OSw2ICsxNTgxLDkgQEAKIAkJCQkgICAoc3RydWN0IHNvY2thZGRyICopJnZvbC0+c3JjYWRkcikpCiAJCQljb250aW51ZTsKIAorCQlpZiAoIW1hdGNoX3BvcnQoc2VydmVyLCBhZGRyKSkKKwkJCWNvbnRpbnVlOworCiAJCWlmICghbWF0Y2hfc2VjdXJpdHkoc2VydmVyLCB2b2wpKQogCQkJY29udGludWU7CiAKQEAgLTE2ODEsMTQgKzE3MTYsMTMgQEAKIAkJY0ZZSSgxLCAiYXR0ZW1wdGluZyBpcHY2IGNvbm5lY3QiKTsKIAkJLyogQkIgc2hvdWxkIHdlIGFsbG93IGlwdjYgb24gcG9ydCAxMzk/ICovCiAJCS8qIG90aGVyIE9TIG5ldmVyIG9ic2VydmVkIGluIFdpbGQgZG9pbmcgMTM5IHdpdGggdjYgKi8KLQkJbWVtY3B5KCZ0Y3Bfc2VzLT5hZGRyLnNvY2tBZGRyNiwgc2luX3NlcnZlcjYsCi0JCQlzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luNikpOwotCQlyYyA9IGlwdjZfY29ubmVjdCh0Y3Bfc2VzKTsKLQl9IGVsc2UgewotCQltZW1jcHkoJnRjcF9zZXMtPmFkZHIuc29ja0FkZHIsIHNpbl9zZXJ2ZXIsCi0JCQlzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luKSk7Ci0JCXJjID0gaXB2NF9jb25uZWN0KHRjcF9zZXMpOwotCX0KKwkJbWVtY3B5KCZ0Y3Bfc2VzLT5kc3RhZGRyLCBzaW5fc2VydmVyNiwKKwkJICAgICAgIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW42KSk7CisJfSBlbHNlCisJCW1lbWNweSgmdGNwX3Nlcy0+ZHN0YWRkciwgc2luX3NlcnZlciwKKwkJICAgICAgIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW4pKTsKKworCXJjID0gaXBfY29ubmVjdCh0Y3Bfc2VzKTsKIAlpZiAocmMgPCAwKSB7CiAJCWNFUlJPUigxLCAiRXJyb3IgY29ubmVjdGluZyB0byBzb2NrZXQuIEFib3J0aW5nIG9wZXJhdGlvbiIpOwogCQlnb3RvIG91dF9lcnJfY3J5cHRvX3JlbGVhc2U7CkBAIC0xNzkzLDYgKzE4MjcsOCBAQAogewogCWludCByYyA9IC1FTk9NRU0sIHhpZDsKIAlzdHJ1Y3QgY2lmc1Nlc0luZm8gKnNlczsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gKmFkZHIgPSAoc3RydWN0IHNvY2thZGRyX2luICopJnNlcnZlci0+ZHN0YWRkcjsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW42ICphZGRyNiA9IChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopJnNlcnZlci0+ZHN0YWRkcjsKIAogCXhpZCA9IEdldFhpZCgpOwogCkBAIC0xODM2LDEyICsxODcyLDEwIEBACiAKIAkvKiBuZXcgU01CIHNlc3Npb24gdXNlcyBvdXIgc2VydmVyIHJlZiAqLwogCXNlcy0+c2VydmVyID0gc2VydmVyOwotCWlmIChzZXJ2ZXItPmFkZHIuc29ja0FkZHI2LnNpbjZfZmFtaWx5ID09IEFGX0lORVQ2KQotCQlzcHJpbnRmKHNlcy0+c2VydmVyTmFtZSwgIiVwSTYiLAotCQkJJnNlcnZlci0+YWRkci5zb2NrQWRkcjYuc2luNl9hZGRyKTsKKwlpZiAoc2VydmVyLT5kc3RhZGRyLnNzX2ZhbWlseSA9PSBBRl9JTkVUNikKKwkJc3ByaW50ZihzZXMtPnNlcnZlck5hbWUsICIlcEk2IiwgJmFkZHI2LT5zaW42X2FkZHIpOwogCWVsc2UKLQkJc3ByaW50ZihzZXMtPnNlcnZlck5hbWUsICIlcEk0IiwKLQkJCSZzZXJ2ZXItPmFkZHIuc29ja0FkZHIuc2luX2FkZHIuc19hZGRyKTsKKwkJc3ByaW50ZihzZXMtPnNlcnZlck5hbWUsICIlcEk0IiwgJmFkZHItPnNpbl9hZGRyKTsKIAogCWlmICh2b2x1bWVfaW5mby0+dXNlcm5hbWUpCiAJCXN0cm5jcHkoc2VzLT51c2VyTmFtZSwgdm9sdW1lX2luZm8tPnVzZXJuYW1lLApAQCAtMjEzNiwxOSArMjE3MCwxMDYgQEAKIH0KIAogc3RhdGljIGludAotaXB2NF9jb25uZWN0KHN0cnVjdCBUQ1BfU2VydmVyX0luZm8gKnNlcnZlcikKK2lwX3JmYzEwMDFfY29ubmVjdChzdHJ1Y3QgVENQX1NlcnZlcl9JbmZvICpzZXJ2ZXIpCiB7CiAJaW50IHJjID0gMDsKLQlpbnQgdmFsOwotCWJvb2wgY29ubmVjdGVkID0gZmFsc2U7Ci0JX19iZTE2IG9yaWdfcG9ydCA9IDA7CisJLyoKKwkgKiBzb21lIHNlcnZlcnMgcmVxdWlyZSBSRkMxMDAxIHNlc3Npbml0IGJlZm9yZSBzZW5kaW5nCisJICogbmVncHJvdCAtIEJCIGNoZWNrIHJlY29ubmVjdGlvbiBpbiBjYXNlIHdoZXJlIHNlY29uZAorCSAqIHNlc3Npbml0IGlzIHNlbnQgYnV0IG5vIHNlY29uZCBuZWdwcm90CisJICovCisJc3RydWN0IHJmYzEwMDJfc2Vzc2lvbl9wYWNrZXQgKnNlc19pbml0X2J1ZjsKKwlzdHJ1Y3Qgc21iX2hkciAqc21iX2J1ZjsKKwlzZXNfaW5pdF9idWYgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcmZjMTAwMl9zZXNzaW9uX3BhY2tldCksCisJCQkgICAgICAgR0ZQX0tFUk5FTCk7CisJaWYgKHNlc19pbml0X2J1ZikgeworCQlzZXNfaW5pdF9idWYtPnRyYWlsZXIuc2Vzc2lvbl9yZXEuY2FsbGVkX2xlbiA9IDMyOworCisJCWlmIChzZXJ2ZXItPnNlcnZlcl9SRkMxMDAxX25hbWUgJiYKKwkJICAgIHNlcnZlci0+c2VydmVyX1JGQzEwMDFfbmFtZVswXSAhPSAwKQorCQkJcmZjMTAwMm1hbmdsZShzZXNfaW5pdF9idWYtPnRyYWlsZXIuCisJCQkJICAgICAgc2Vzc2lvbl9yZXEuY2FsbGVkX25hbWUsCisJCQkJICAgICAgc2VydmVyLT5zZXJ2ZXJfUkZDMTAwMV9uYW1lLAorCQkJCSAgICAgIFJGQzEwMDFfTkFNRV9MRU5fV0lUSF9OVUxMKTsKKwkJZWxzZQorCQkJcmZjMTAwMm1hbmdsZShzZXNfaW5pdF9idWYtPnRyYWlsZXIuCisJCQkJICAgICAgc2Vzc2lvbl9yZXEuY2FsbGVkX25hbWUsCisJCQkJICAgICAgREVGQVVMVF9DSUZTX0NBTExFRF9OQU1FLAorCQkJCSAgICAgIFJGQzEwMDFfTkFNRV9MRU5fV0lUSF9OVUxMKTsKKworCQlzZXNfaW5pdF9idWYtPnRyYWlsZXIuc2Vzc2lvbl9yZXEuY2FsbGluZ19sZW4gPSAzMjsKKworCQkvKgorCQkgKiBjYWxsaW5nIG5hbWUgZW5kcyBpbiBudWxsIChieXRlIDE2KSBmcm9tIG9sZCBzbWIKKwkJICogY29udmVudGlvbi4KKwkJICovCisJCWlmIChzZXJ2ZXItPndvcmtzdGF0aW9uX1JGQzEwMDFfbmFtZSAmJgorCQkgICAgc2VydmVyLT53b3Jrc3RhdGlvbl9SRkMxMDAxX25hbWVbMF0gIT0gMCkKKwkJCXJmYzEwMDJtYW5nbGUoc2VzX2luaXRfYnVmLT50cmFpbGVyLgorCQkJCSAgICAgIHNlc3Npb25fcmVxLmNhbGxpbmdfbmFtZSwKKwkJCQkgICAgICBzZXJ2ZXItPndvcmtzdGF0aW9uX1JGQzEwMDFfbmFtZSwKKwkJCQkgICAgICBSRkMxMDAxX05BTUVfTEVOX1dJVEhfTlVMTCk7CisJCWVsc2UKKwkJCXJmYzEwMDJtYW5nbGUoc2VzX2luaXRfYnVmLT50cmFpbGVyLgorCQkJCSAgICAgIHNlc3Npb25fcmVxLmNhbGxpbmdfbmFtZSwKKwkJCQkgICAgICAiTElOVVhfQ0lGU19DTE5UIiwKKwkJCQkgICAgICBSRkMxMDAxX05BTUVfTEVOX1dJVEhfTlVMTCk7CisKKwkJc2VzX2luaXRfYnVmLT50cmFpbGVyLnNlc3Npb25fcmVxLnNjb3BlMSA9IDA7CisJCXNlc19pbml0X2J1Zi0+dHJhaWxlci5zZXNzaW9uX3JlcS5zY29wZTIgPSAwOworCQlzbWJfYnVmID0gKHN0cnVjdCBzbWJfaGRyICopc2VzX2luaXRfYnVmOworCisJCS8qIHNpemVvZiBSRkMxMDAyX1NFU1NJT05fUkVRVUVTVCB3aXRoIG5vIHNjb3BlICovCisJCXNtYl9idWYtPnNtYl9idWZfbGVuZ3RoID0gMHg4MTAwMDA0NDsKKwkJcmMgPSBzbWJfc2VuZChzZXJ2ZXIsIHNtYl9idWYsIDB4NDQpOworCQlrZnJlZShzZXNfaW5pdF9idWYpOworCQkvKgorCQkgKiBSRkMxMDAxIGxheWVyIGluIGF0IGxlYXN0IG9uZSBzZXJ2ZXIKKwkJICogcmVxdWlyZXMgdmVyeSBzaG9ydCBicmVhayBiZWZvcmUgbmVncHJvdAorCQkgKiBwcmVzdW1hYmx5IGJlY2F1c2Ugbm90IGV4cGVjdGluZyBuZWdwcm90CisJCSAqIHRvIGZvbGxvdyBzbyBmYXN0LiAgVGhpcyBpcyBhIHNpbXBsZQorCQkgKiBzb2x1dGlvbiB0aGF0IHdvcmtzIHdpdGhvdXQKKwkJICogY29tcGxpY2F0aW5nIHRoZSBjb2RlIGFuZCBjYXVzZXMgbm8KKwkJICogc2lnbmlmaWNhbnQgc2xvd2luZyBkb3duIG9uIG1vdW50CisJCSAqIGZvciBldmVyeW9uZSBlbHNlCisJCSAqLworCQl1c2xlZXBfcmFuZ2UoMTAwMCwgMjAwMCk7CisJfQorCS8qCisJICogZWxzZSB0aGUgbmVncHJvdCBtYXkgc3RpbGwgd29yayB3aXRob3V0IHRoaXMKKwkgKiBldmVuIHRob3VnaCBtYWxsb2MgZmFpbGVkCisJICovCisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQKK2dlbmVyaWNfaXBfY29ubmVjdChzdHJ1Y3QgVENQX1NlcnZlcl9JbmZvICpzZXJ2ZXIpCit7CisJaW50IHJjID0gMDsKKwl1bnNpZ25lZCBzaG9ydCBpbnQgc3BvcnQ7CisJaW50IHNsZW4sIHNmYW1pbHk7CiAJc3RydWN0IHNvY2tldCAqc29ja2V0ID0gc2VydmVyLT5zc29ja2V0OworCXN0cnVjdCBzb2NrYWRkciAqc2FkZHI7CisKKwlzYWRkciA9IChzdHJ1Y3Qgc29ja2FkZHIgKikgJnNlcnZlci0+ZHN0YWRkcjsKKworCWlmIChzZXJ2ZXItPmRzdGFkZHIuc3NfZmFtaWx5ID09IEFGX0lORVQ2KSB7CisJCXNwb3J0ID0gKChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopIHNhZGRyKS0+c2luNl9wb3J0OworCQlzbGVuID0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbjYpOworCQlzZmFtaWx5ID0gQUZfSU5FVDY7CisJfSBlbHNlIHsKKwkJc3BvcnQgPSAoKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSBzYWRkciktPnNpbl9wb3J0OworCQlzbGVuID0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbik7CisJCXNmYW1pbHkgPSBBRl9JTkVUOworCX0KIAogCWlmIChzb2NrZXQgPT0gTlVMTCkgewotCQlyYyA9IHNvY2tfY3JlYXRlX2tlcm4oUEZfSU5FVCwgU09DS19TVFJFQU0sCisJCXJjID0gc29ja19jcmVhdGVfa2VybihzZmFtaWx5LCBTT0NLX1NUUkVBTSwKIAkJCQkgICAgICBJUFBST1RPX1RDUCwgJnNvY2tldCk7CiAJCWlmIChyYyA8IDApIHsKIAkJCWNFUlJPUigxLCAiRXJyb3IgJWQgY3JlYXRpbmcgc29ja2V0IiwgcmMpOworCQkJc2VydmVyLT5zc29ja2V0ID0gTlVMTDsKIAkJCXJldHVybiByYzsKIAkJfQogCkBAIC0yMTU2LDIxOCArMjI3NywxOSBAQAogCQljRllJKDEsICJTb2NrZXQgY3JlYXRlZCIpOwogCQlzZXJ2ZXItPnNzb2NrZXQgPSBzb2NrZXQ7CiAJCXNvY2tldC0+c2stPnNrX2FsbG9jYXRpb24gPSBHRlBfTk9GUzsKLQkJY2lmc19yZWNsYXNzaWZ5X3NvY2tldDQoc29ja2V0KTsKKwkJaWYgKHNmYW1pbHkgPT0gQUZfSU5FVDYpCisJCQljaWZzX3JlY2xhc3NpZnlfc29ja2V0Nihzb2NrZXQpOworCQllbHNlCisJCQljaWZzX3JlY2xhc3NpZnlfc29ja2V0NChzb2NrZXQpOwogCX0KIAogCXJjID0gYmluZF9zb2NrZXQoc2VydmVyKTsKIAlpZiAocmMgPCAwKQogCQlyZXR1cm4gcmM7CiAKLQkvKiB1c2VyIG92ZXJyb2RlIGRlZmF1bHQgcG9ydCAqLwotCWlmIChzZXJ2ZXItPmFkZHIuc29ja0FkZHIuc2luX3BvcnQpIHsKLQkJcmMgPSBzb2NrZXQtPm9wcy0+Y29ubmVjdChzb2NrZXQsIChzdHJ1Y3Qgc29ja2FkZHIgKikKLQkJCQkJICAmc2VydmVyLT5hZGRyLnNvY2tBZGRyLAotCQkJCQkgIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW4pLCAwKTsKLQkJaWYgKHJjID49IDApCi0JCQljb25uZWN0ZWQgPSB0cnVlOwotCX0KLQotCWlmICghY29ubmVjdGVkKSB7Ci0JCS8qIHNhdmUgb3JpZ2luYWwgcG9ydCBzbyB3ZSBjYW4gcmV0cnkgdXNlciBzcGVjaWZpZWQgcG9ydAotCQkJbGF0ZXIgaWYgZmFsbCBiYWNrIHBvcnRzIGZhaWwgdGhpcyB0aW1lICAqLwotCQlvcmlnX3BvcnQgPSBzZXJ2ZXItPmFkZHIuc29ja0FkZHIuc2luX3BvcnQ7Ci0KLQkJLyogZG8gbm90IHJldHJ5IG9uIHRoZSBzYW1lIHBvcnQgd2UganVzdCBmYWlsZWQgb24gKi8KLQkJaWYgKHNlcnZlci0+YWRkci5zb2NrQWRkci5zaW5fcG9ydCAhPSBodG9ucyhDSUZTX1BPUlQpKSB7Ci0JCQlzZXJ2ZXItPmFkZHIuc29ja0FkZHIuc2luX3BvcnQgPSBodG9ucyhDSUZTX1BPUlQpOwotCQkJcmMgPSBzb2NrZXQtPm9wcy0+Y29ubmVjdChzb2NrZXQsCi0JCQkJCQkoc3RydWN0IHNvY2thZGRyICopCi0JCQkJCQkmc2VydmVyLT5hZGRyLnNvY2tBZGRyLAotCQkJCQkJc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbiksIDApOwotCQkJaWYgKHJjID49IDApCi0JCQkJY29ubmVjdGVkID0gdHJ1ZTsKLQkJfQotCX0KLQlpZiAoIWNvbm5lY3RlZCkgewotCQlzZXJ2ZXItPmFkZHIuc29ja0FkZHIuc2luX3BvcnQgPSBodG9ucyhSRkMxMDAxX1BPUlQpOwotCQlyYyA9IHNvY2tldC0+b3BzLT5jb25uZWN0KHNvY2tldCwgKHN0cnVjdCBzb2NrYWRkciAqKQotCQkJCQkgICAgICAmc2VydmVyLT5hZGRyLnNvY2tBZGRyLAotCQkJCQkgICAgICBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luKSwgMCk7Ci0JCWlmIChyYyA+PSAwKQotCQkJY29ubmVjdGVkID0gdHJ1ZTsKLQl9Ci0KLQkvKiBnaXZlIHVwIGhlcmUgLSB1bmxlc3Mgd2Ugd2FudCB0byByZXRyeSBvbiBkaWZmZXJlbnQKLQkJcHJvdG9jb2wgZmFtaWxpZXMgc29tZSBkYXkgKi8KLQlpZiAoIWNvbm5lY3RlZCkgewotCQlpZiAob3JpZ19wb3J0KQotCQkJc2VydmVyLT5hZGRyLnNvY2tBZGRyLnNpbl9wb3J0ID0gb3JpZ19wb3J0OwotCQljRllJKDEsICJFcnJvciAlZCBjb25uZWN0aW5nIHRvIHNlcnZlciB2aWEgaXB2NCIsIHJjKTsKLQkJc29ja19yZWxlYXNlKHNvY2tldCk7Ci0JCXNlcnZlci0+c3NvY2tldCA9IE5VTEw7Ci0JCXJldHVybiByYzsKLQl9Ci0KLQotCS8qCi0JICogRXZlbnR1YWxseSBjaGVjayBmb3Igb3RoZXIgc29ja2V0IG9wdGlvbnMgdG8gY2hhbmdlIGZyb20KLQkgKiAgdGhlIGRlZmF1bHQuIHNvY2tfc2V0c29ja29wdCBub3QgdXNlZCBiZWNhdXNlIGl0IGV4cGVjdHMKLQkgKiAgdXNlciBzcGFjZSBidWZmZXIKLQkgKi8KLQlzb2NrZXQtPnNrLT5za19yY3Z0aW1lbyA9IDcgKiBIWjsKLQlzb2NrZXQtPnNrLT5za19zbmR0aW1lbyA9IDUgKiBIWjsKLQotCS8qIG1ha2UgdGhlIGJ1ZnNpemVzIGRlcGVuZCBvbiB3c2l6ZS9yc2l6ZSBhbmQgbWF4IHJlcXVlc3RzICovCi0JaWYgKHNlcnZlci0+bm9hdXRvdHVuZSkgewotCQlpZiAoc29ja2V0LT5zay0+c2tfc25kYnVmIDwgKDIwMCAqIDEwMjQpKQotCQkJc29ja2V0LT5zay0+c2tfc25kYnVmID0gMjAwICogMTAyNDsKLQkJaWYgKHNvY2tldC0+c2stPnNrX3JjdmJ1ZiA8ICgxNDAgKiAxMDI0KSkKLQkJCXNvY2tldC0+c2stPnNrX3JjdmJ1ZiA9IDE0MCAqIDEwMjQ7Ci0JfQotCi0JaWYgKHNlcnZlci0+dGNwX25vZGVsYXkpIHsKLQkJdmFsID0gMTsKLQkJcmMgPSBrZXJuZWxfc2V0c29ja29wdChzb2NrZXQsIFNPTF9UQ1AsIFRDUF9OT0RFTEFZLAotCQkJCShjaGFyICopJnZhbCwgc2l6ZW9mKHZhbCkpOwotCQlpZiAocmMpCi0JCQljRllJKDEsICJzZXQgVENQX05PREVMQVkgc29ja2V0IG9wdGlvbiBlcnJvciAlZCIsIHJjKTsKLQl9Ci0KLQkgY0ZZSSgxLCAic25kYnVmICVkIHJjdmJ1ZiAlZCByY3Z0aW1lbyAweCVseCIsCi0JCSBzb2NrZXQtPnNrLT5za19zbmRidWYsCi0JCSBzb2NrZXQtPnNrLT5za19yY3ZidWYsIHNvY2tldC0+c2stPnNrX3JjdnRpbWVvKTsKLQotCS8qIHNlbmQgUkZDMTAwMSBzZXNzaW5pdCAqLwotCWlmIChzZXJ2ZXItPmFkZHIuc29ja0FkZHIuc2luX3BvcnQgPT0gaHRvbnMoUkZDMTAwMV9QT1JUKSkgewotCQkvKiBzb21lIHNlcnZlcnMgcmVxdWlyZSBSRkMxMDAxIHNlc3Npbml0IGJlZm9yZSBzZW5kaW5nCi0JCW5lZ3Byb3QgLSBCQiBjaGVjayByZWNvbm5lY3Rpb24gaW4gY2FzZSB3aGVyZSBzZWNvbmQKLQkJc2Vzc2luaXQgaXMgc2VudCBidXQgbm8gc2Vjb25kIG5lZ3Byb3QgKi8KLQkJc3RydWN0IHJmYzEwMDJfc2Vzc2lvbl9wYWNrZXQgKnNlc19pbml0X2J1ZjsKLQkJc3RydWN0IHNtYl9oZHIgKnNtYl9idWY7Ci0JCXNlc19pbml0X2J1ZiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCByZmMxMDAyX3Nlc3Npb25fcGFja2V0KSwKLQkJCQkgICAgICAgR0ZQX0tFUk5FTCk7Ci0JCWlmIChzZXNfaW5pdF9idWYpIHsKLQkJCXNlc19pbml0X2J1Zi0+dHJhaWxlci5zZXNzaW9uX3JlcS5jYWxsZWRfbGVuID0gMzI7Ci0JCQlpZiAoc2VydmVyLT5zZXJ2ZXJfUkZDMTAwMV9uYW1lICYmCi0JCQkgICAgc2VydmVyLT5zZXJ2ZXJfUkZDMTAwMV9uYW1lWzBdICE9IDApCi0JCQkJcmZjMTAwMm1hbmdsZShzZXNfaW5pdF9idWYtPnRyYWlsZXIuCi0JCQkJCQlzZXNzaW9uX3JlcS5jYWxsZWRfbmFtZSwKLQkJCQkJICAgICAgc2VydmVyLT5zZXJ2ZXJfUkZDMTAwMV9uYW1lLAotCQkJCQkgICAgICBSRkMxMDAxX05BTUVfTEVOX1dJVEhfTlVMTCk7Ci0JCQllbHNlCi0JCQkJcmZjMTAwMm1hbmdsZShzZXNfaW5pdF9idWYtPnRyYWlsZXIuCi0JCQkJCQlzZXNzaW9uX3JlcS5jYWxsZWRfbmFtZSwKLQkJCQkJICAgICAgREVGQVVMVF9DSUZTX0NBTExFRF9OQU1FLAotCQkJCQkgICAgICBSRkMxMDAxX05BTUVfTEVOX1dJVEhfTlVMTCk7Ci0KLQkJCXNlc19pbml0X2J1Zi0+dHJhaWxlci5zZXNzaW9uX3JlcS5jYWxsaW5nX2xlbiA9IDMyOwotCi0JCQkvKiBjYWxsaW5nIG5hbWUgZW5kcyBpbiBudWxsIChieXRlIDE2KSBmcm9tIG9sZCBzbWIKLQkJCWNvbnZlbnRpb24uICovCi0JCQlpZiAoc2VydmVyLT53b3Jrc3RhdGlvbl9SRkMxMDAxX25hbWUgJiYKLQkJCSAgICBzZXJ2ZXItPndvcmtzdGF0aW9uX1JGQzEwMDFfbmFtZVswXSAhPSAwKQotCQkJCXJmYzEwMDJtYW5nbGUoc2VzX2luaXRfYnVmLT50cmFpbGVyLgotCQkJCQkJc2Vzc2lvbl9yZXEuY2FsbGluZ19uYW1lLAotCQkJCQkgICAgICBzZXJ2ZXItPndvcmtzdGF0aW9uX1JGQzEwMDFfbmFtZSwKLQkJCQkJICAgICAgUkZDMTAwMV9OQU1FX0xFTl9XSVRIX05VTEwpOwotCQkJZWxzZQotCQkJCXJmYzEwMDJtYW5nbGUoc2VzX2luaXRfYnVmLT50cmFpbGVyLgotCQkJCQkJc2Vzc2lvbl9yZXEuY2FsbGluZ19uYW1lLAotCQkJCQkgICAgICAiTElOVVhfQ0lGU19DTE5UIiwKLQkJCQkJICAgICAgUkZDMTAwMV9OQU1FX0xFTl9XSVRIX05VTEwpOwotCi0JCQlzZXNfaW5pdF9idWYtPnRyYWlsZXIuc2Vzc2lvbl9yZXEuc2NvcGUxID0gMDsKLQkJCXNlc19pbml0X2J1Zi0+dHJhaWxlci5zZXNzaW9uX3JlcS5zY29wZTIgPSAwOwotCQkJc21iX2J1ZiA9IChzdHJ1Y3Qgc21iX2hkciAqKXNlc19pbml0X2J1ZjsKLQkJCS8qIHNpemVvZiBSRkMxMDAyX1NFU1NJT05fUkVRVUVTVCB3aXRoIG5vIHNjb3BlICovCi0JCQlzbWJfYnVmLT5zbWJfYnVmX2xlbmd0aCA9IDB4ODEwMDAwNDQ7Ci0JCQlyYyA9IHNtYl9zZW5kKHNlcnZlciwgc21iX2J1ZiwgMHg0NCk7Ci0JCQlrZnJlZShzZXNfaW5pdF9idWYpOwotCQkJbXNsZWVwKDEpOyAvKiBSRkMxMDAxIGxheWVyIGluIGF0IGxlYXN0IG9uZSBzZXJ2ZXIKLQkJCQkgICAgICByZXF1aXJlcyB2ZXJ5IHNob3J0IGJyZWFrIGJlZm9yZSBuZWdwcm90Ci0JCQkJICAgICAgcHJlc3VtYWJseSBiZWNhdXNlIG5vdCBleHBlY3RpbmcgbmVncHJvdAotCQkJCSAgICAgIHRvIGZvbGxvdyBzbyBmYXN0LiAgVGhpcyBpcyBhIHNpbXBsZQotCQkJCSAgICAgIHNvbHV0aW9uIHRoYXQgd29ya3Mgd2l0aG91dAotCQkJCSAgICAgIGNvbXBsaWNhdGluZyB0aGUgY29kZSBhbmQgY2F1c2VzIG5vCi0JCQkJICAgICAgc2lnbmlmaWNhbnQgc2xvd2luZyBkb3duIG9uIG1vdW50Ci0JCQkJICAgICAgZm9yIGV2ZXJ5b25lIGVsc2UgKi8KLQkJfQotCQkvKiBlbHNlIHRoZSBuZWdwcm90IG1heSBzdGlsbCB3b3JrIHdpdGhvdXQgdGhpcwotCQlldmVuIHRob3VnaCBtYWxsb2MgZmFpbGVkICovCi0KLQl9Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQKLWlwdjZfY29ubmVjdChzdHJ1Y3QgVENQX1NlcnZlcl9JbmZvICpzZXJ2ZXIpCi17Ci0JaW50IHJjID0gMDsKLQlpbnQgdmFsOwotCWJvb2wgY29ubmVjdGVkID0gZmFsc2U7Ci0JX19iZTE2IG9yaWdfcG9ydCA9IDA7Ci0Jc3RydWN0IHNvY2tldCAqc29ja2V0ID0gc2VydmVyLT5zc29ja2V0OwotCi0JaWYgKHNvY2tldCA9PSBOVUxMKSB7Ci0JCXJjID0gc29ja19jcmVhdGVfa2VybihQRl9JTkVUNiwgU09DS19TVFJFQU0sCi0JCQkJICAgICAgSVBQUk9UT19UQ1AsICZzb2NrZXQpOwotCQlpZiAocmMgPCAwKSB7Ci0JCQljRVJST1IoMSwgIkVycm9yICVkIGNyZWF0aW5nIGlwdjYgc29ja2V0IiwgcmMpOwotCQkJc29ja2V0ID0gTlVMTDsKLQkJCXJldHVybiByYzsKLQkJfQotCi0JCS8qIEJCIG90aGVyIHNvY2tldCBvcHRpb25zIHRvIHNldCBLRUVQQUxJVkUsIE5PREVMQVk/ICovCi0JCWNGWUkoMSwgImlwdjYgU29ja2V0IGNyZWF0ZWQiKTsKLQkJc2VydmVyLT5zc29ja2V0ID0gc29ja2V0OwotCQlzb2NrZXQtPnNrLT5za19hbGxvY2F0aW9uID0gR0ZQX05PRlM7Ci0JCWNpZnNfcmVjbGFzc2lmeV9zb2NrZXQ2KHNvY2tldCk7Ci0JfQotCi0JcmMgPSBiaW5kX3NvY2tldChzZXJ2ZXIpOwotCWlmIChyYyA8IDApCi0JCXJldHVybiByYzsKLQotCS8qIHVzZXIgb3ZlcnJvZGUgZGVmYXVsdCBwb3J0ICovCi0JaWYgKHNlcnZlci0+YWRkci5zb2NrQWRkcjYuc2luNl9wb3J0KSB7Ci0JCXJjID0gc29ja2V0LT5vcHMtPmNvbm5lY3Qoc29ja2V0LAotCQkJCShzdHJ1Y3Qgc29ja2FkZHIgKikgJnNlcnZlci0+YWRkci5zb2NrQWRkcjYsCi0JCQkJc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbjYpLCAwKTsKLQkJaWYgKHJjID49IDApCi0JCQljb25uZWN0ZWQgPSB0cnVlOwotCX0KLQotCWlmICghY29ubmVjdGVkKSB7Ci0JCS8qIHNhdmUgb3JpZ2luYWwgcG9ydCBzbyB3ZSBjYW4gcmV0cnkgdXNlciBzcGVjaWZpZWQgcG9ydAotCQkJbGF0ZXIgaWYgZmFsbCBiYWNrIHBvcnRzIGZhaWwgdGhpcyB0aW1lICAqLwotCi0JCW9yaWdfcG9ydCA9IHNlcnZlci0+YWRkci5zb2NrQWRkcjYuc2luNl9wb3J0OwotCQkvKiBkbyBub3QgcmV0cnkgb24gdGhlIHNhbWUgcG9ydCB3ZSBqdXN0IGZhaWxlZCBvbiAqLwotCQlpZiAoc2VydmVyLT5hZGRyLnNvY2tBZGRyNi5zaW42X3BvcnQgIT0gaHRvbnMoQ0lGU19QT1JUKSkgewotCQkJc2VydmVyLT5hZGRyLnNvY2tBZGRyNi5zaW42X3BvcnQgPSBodG9ucyhDSUZTX1BPUlQpOwotCQkJcmMgPSBzb2NrZXQtPm9wcy0+Y29ubmVjdChzb2NrZXQsIChzdHJ1Y3Qgc29ja2FkZHIgKikKLQkJCQkJJnNlcnZlci0+YWRkci5zb2NrQWRkcjYsCi0JCQkJCXNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW42KSwgMCk7Ci0JCQlpZiAocmMgPj0gMCkKLQkJCQljb25uZWN0ZWQgPSB0cnVlOwotCQl9Ci0JfQotCWlmICghY29ubmVjdGVkKSB7Ci0JCXNlcnZlci0+YWRkci5zb2NrQWRkcjYuc2luNl9wb3J0ID0gaHRvbnMoUkZDMTAwMV9QT1JUKTsKLQkJcmMgPSBzb2NrZXQtPm9wcy0+Y29ubmVjdChzb2NrZXQsIChzdHJ1Y3Qgc29ja2FkZHIgKikKLQkJCQkmc2VydmVyLT5hZGRyLnNvY2tBZGRyNiwKLQkJCQlzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luNiksIDApOwotCQlpZiAocmMgPj0gMCkKLQkJCWNvbm5lY3RlZCA9IHRydWU7Ci0JfQotCi0JLyogZ2l2ZSB1cCBoZXJlIC0gdW5sZXNzIHdlIHdhbnQgdG8gcmV0cnkgb24gZGlmZmVyZW50Ci0JCXByb3RvY29sIGZhbWlsaWVzIHNvbWUgZGF5ICovCi0JaWYgKCFjb25uZWN0ZWQpIHsKLQkJaWYgKG9yaWdfcG9ydCkKLQkJCXNlcnZlci0+YWRkci5zb2NrQWRkcjYuc2luNl9wb3J0ID0gb3JpZ19wb3J0OwotCQljRllJKDEsICJFcnJvciAlZCBjb25uZWN0aW5nIHRvIHNlcnZlciB2aWEgaXB2NiIsIHJjKTsKKwlyYyA9IHNvY2tldC0+b3BzLT5jb25uZWN0KHNvY2tldCwgc2FkZHIsIHNsZW4sIDApOworCWlmIChyYyA8IDApIHsKKwkJY0ZZSSgxLCAiRXJyb3IgJWQgY29ubmVjdGluZyB0byBzZXJ2ZXIiLCByYyk7CiAJCXNvY2tfcmVsZWFzZShzb2NrZXQpOwogCQlzZXJ2ZXItPnNzb2NrZXQgPSBOVUxMOwogCQlyZXR1cm4gcmM7CkBAIC0yMzgxLDE5ICsyMzAzLDYxIEBACiAJc29ja2V0LT5zay0+c2tfcmN2dGltZW8gPSA3ICogSFo7CiAJc29ja2V0LT5zay0+c2tfc25kdGltZW8gPSA1ICogSFo7CiAKKwkvKiBtYWtlIHRoZSBidWZzaXplcyBkZXBlbmQgb24gd3NpemUvcnNpemUgYW5kIG1heCByZXF1ZXN0cyAqLworCWlmIChzZXJ2ZXItPm5vYXV0b3R1bmUpIHsKKwkJaWYgKHNvY2tldC0+c2stPnNrX3NuZGJ1ZiA8ICgyMDAgKiAxMDI0KSkKKwkJCXNvY2tldC0+c2stPnNrX3NuZGJ1ZiA9IDIwMCAqIDEwMjQ7CisJCWlmIChzb2NrZXQtPnNrLT5za19yY3ZidWYgPCAoMTQwICogMTAyNCkpCisJCQlzb2NrZXQtPnNrLT5za19yY3ZidWYgPSAxNDAgKiAxMDI0OworCX0KKwogCWlmIChzZXJ2ZXItPnRjcF9ub2RlbGF5KSB7Ci0JCXZhbCA9IDE7CisJCWludCB2YWwgPSAxOwogCQlyYyA9IGtlcm5lbF9zZXRzb2Nrb3B0KHNvY2tldCwgU09MX1RDUCwgVENQX05PREVMQVksCiAJCQkJKGNoYXIgKikmdmFsLCBzaXplb2YodmFsKSk7CiAJCWlmIChyYykKIAkJCWNGWUkoMSwgInNldCBUQ1BfTk9ERUxBWSBzb2NrZXQgb3B0aW9uIGVycm9yICVkIiwgcmMpOwogCX0KIAotCXNlcnZlci0+c3NvY2tldCA9IHNvY2tldDsKKwkgY0ZZSSgxLCAic25kYnVmICVkIHJjdmJ1ZiAlZCByY3Z0aW1lbyAweCVseCIsCisJCSBzb2NrZXQtPnNrLT5za19zbmRidWYsCisJCSBzb2NrZXQtPnNrLT5za19yY3ZidWYsIHNvY2tldC0+c2stPnNrX3JjdnRpbWVvKTsKKworCWlmIChzcG9ydCA9PSBodG9ucyhSRkMxMDAxX1BPUlQpKQorCQlyYyA9IGlwX3JmYzEwMDFfY29ubmVjdChzZXJ2ZXIpOwogCiAJcmV0dXJuIHJjOwogfQogCitzdGF0aWMgaW50CitpcF9jb25uZWN0KHN0cnVjdCBUQ1BfU2VydmVyX0luZm8gKnNlcnZlcikKK3sKKwl1bnNpZ25lZCBzaG9ydCBpbnQgKnNwb3J0OworCXN0cnVjdCBzb2NrYWRkcl9pbjYgKmFkZHI2ID0gKHN0cnVjdCBzb2NrYWRkcl9pbjYgKikmc2VydmVyLT5kc3RhZGRyOworCXN0cnVjdCBzb2NrYWRkcl9pbiAqYWRkciA9IChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikmc2VydmVyLT5kc3RhZGRyOworCisJaWYgKHNlcnZlci0+ZHN0YWRkci5zc19mYW1pbHkgPT0gQUZfSU5FVDYpCisJCXNwb3J0ID0gJmFkZHI2LT5zaW42X3BvcnQ7CisJZWxzZQorCQlzcG9ydCA9ICZhZGRyLT5zaW5fcG9ydDsKKworCWlmICgqc3BvcnQgPT0gMCkgeworCQlpbnQgcmM7CisKKwkJLyogdHJ5IHdpdGggNDQ1IHBvcnQgYXQgZmlyc3QgKi8KKwkJKnNwb3J0ID0gaHRvbnMoQ0lGU19QT1JUKTsKKworCQlyYyA9IGdlbmVyaWNfaXBfY29ubmVjdChzZXJ2ZXIpOworCQlpZiAocmMgPj0gMCkKKwkJCXJldHVybiByYzsKKworCQkvKiBpZiBpdCBmYWlsZWQsIHRyeSB3aXRoIDEzOSBwb3J0ICovCisJCSpzcG9ydCA9IGh0b25zKFJGQzEwMDFfUE9SVCk7CisJfQorCisJcmV0dXJuIGdlbmVyaWNfaXBfY29ubmVjdChzZXJ2ZXIpOworfQorCiB2b2lkIHJlc2V0X2NpZnNfdW5peF9jYXBzKGludCB4aWQsIHN0cnVjdCBjaWZzVGNvbkluZm8gKnRjb24sCiAJCQkgIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBzbWJfdm9sICp2b2xfaW5mbykKIHsKZGlmZiAtLWdpdCBhL2ZzL2NpZnMvZGlyLmMgYi9mcy9jaWZzL2Rpci5jCmluZGV4IGRiMmE1OGMuLjJlNzczODIgMTAwNjQ0Ci0tLSBhL2ZzL2NpZnMvZGlyLmMKKysrIGIvZnMvY2lmcy9kaXIuYwpAQCAtMjkzLDEwICsyOTMsOCBAQAogCQkJYXJncy51aWQgPSBOT19DSEFOR0VfNjQ7CiAJCQlhcmdzLmdpZCA9IE5PX0NIQU5HRV82NDsKIAkJfQotCQlDSUZTU01CVW5peFNldFBhdGhJbmZvKHhpZCwgdGNvbiwgZnVsbF9wYXRoLCAmYXJncywKLQkJCQkJY2lmc19zYi0+bG9jYWxfbmxzLAotCQkJCQljaWZzX3NiLT5tbnRfY2lmc19mbGFncyAmCi0JCQkJCQlDSUZTX01PVU5UX01BUF9TUEVDSUFMX0NIUik7CisJCUNJRlNTTUJVbml4U2V0RmlsZUluZm8oeGlkLCB0Y29uLCAmYXJncywgZmlsZUhhbmRsZSwKKwkJCQkJY3VycmVudC0+dGdpZCk7CiAJfSBlbHNlIHsKIAkJLyogQkIgaW1wbGVtZW50IG1vZGUgc2V0dGluZyB2aWEgV2luZG93cyBzZWN1cml0eQogCQkgICBkZXNjcmlwdG9ycyBlLmcuICovCmRpZmYgLS1naXQgYS9mcy9jaWZzL2ZpbGUuYyBiL2ZzL2NpZnMvZmlsZS5jCmluZGV4IDVhMjg2NjAuLmQ4NDM2MzEgMTAwNjQ0Ci0tLSBhL2ZzL2NpZnMvZmlsZS5jCisrKyBiL2ZzL2NpZnMvZmlsZS5jCkBAIC0xMDQsNTMgKzEwNCw2IEBACiAJCXJldHVybiBGSUxFX09QRU47CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IGNpZnNfb3Blbl9pbm9kZV9oZWxwZXIoc3RydWN0IGlub2RlICppbm9kZSwKLQlzdHJ1Y3QgY2lmc1Rjb25JbmZvICpwVGNvbiwgX191MzIgb3Bsb2NrLCBGSUxFX0FMTF9JTkZPICpidWYsCi0JY2hhciAqZnVsbF9wYXRoLCBpbnQgeGlkKQotewotCXN0cnVjdCBjaWZzSW5vZGVJbmZvICpwQ2lmc0lub2RlID0gQ0lGU19JKGlub2RlKTsKLQlzdHJ1Y3QgdGltZXNwZWMgdGVtcDsKLQlpbnQgcmM7Ci0KLQlpZiAocENpZnNJbm9kZS0+Y2xpZW50Q2FuQ2FjaGVSZWFkKSB7Ci0JCS8qIHdlIGhhdmUgdGhlIGlub2RlIG9wZW4gc29tZXdoZXJlIGVsc2UKLQkJICAgbm8gbmVlZCB0byBkaXNjYXJkIGNhY2hlIGRhdGEgKi8KLQkJZ290byBjbGllbnRfY2FuX2NhY2hlOwotCX0KLQotCS8qIEJCIG5lZWQgc2FtZSBjaGVjayBpbiBjaWZzX2NyZWF0ZSB0b28/ICovCi0JLyogaWYgbm90IG9wbG9ja2VkLCBpbnZhbGlkYXRlIGlub2RlIHBhZ2VzIGlmIG10aW1lIG9yIGZpbGUKLQkgICBzaXplIGNoYW5nZWQgKi8KLQl0ZW1wID0gY2lmc19OVHRpbWVUb1VuaXgoYnVmLT5MYXN0V3JpdGVUaW1lKTsKLQlpZiAodGltZXNwZWNfZXF1YWwoJmlub2RlLT5pX210aW1lLCAmdGVtcCkgJiYKLQkJCSAgIChpbm9kZS0+aV9zaXplID09Ci0JCQkgICAgKGxvZmZfdClsZTY0X3RvX2NwdShidWYtPkVuZE9mRmlsZSkpKSB7Ci0JCWNGWUkoMSwgImlub2RlIHVuY2hhbmdlZCBvbiBzZXJ2ZXIiKTsKLQl9IGVsc2UgewotCQlpZiAoaW5vZGUtPmlfbWFwcGluZykgewotCQkJLyogQkIgbm8gbmVlZCB0byBsb2NrIGlub2RlIHVudGlsIGFmdGVyIGludmFsaWRhdGUKLQkJCXNpbmNlIG5hbWVpIGNvZGUgc2hvdWxkIGFscmVhZHkgaGF2ZSBpdCBsb2NrZWQ/ICovCi0JCQlyYyA9IGZpbGVtYXBfd3JpdGVfYW5kX3dhaXQoaW5vZGUtPmlfbWFwcGluZyk7Ci0JCQltYXBwaW5nX3NldF9lcnJvcihpbm9kZS0+aV9tYXBwaW5nLCByYyk7Ci0JCX0KLQkJY0ZZSSgxLCAiaW52YWxpZGF0aW5nIHJlbW90ZSBpbm9kZSBzaW5jZSBvcGVuIGRldGVjdGVkIGl0ICIKLQkJCSAiY2hhbmdlZCIpOwotCQlpbnZhbGlkYXRlX3JlbW90ZV9pbm9kZShpbm9kZSk7Ci0JfQotCi1jbGllbnRfY2FuX2NhY2hlOgotCWlmIChwVGNvbi0+dW5peF9leHQpCi0JCXJjID0gY2lmc19nZXRfaW5vZGVfaW5mb191bml4KCZpbm9kZSwgZnVsbF9wYXRoLCBpbm9kZS0+aV9zYiwKLQkJCQkJICAgICAgeGlkKTsKLQllbHNlCi0JCXJjID0gY2lmc19nZXRfaW5vZGVfaW5mbygmaW5vZGUsIGZ1bGxfcGF0aCwgYnVmLCBpbm9kZS0+aV9zYiwKLQkJCQkJIHhpZCwgTlVMTCk7Ci0KLQljaWZzX3NldF9vcGxvY2tfbGV2ZWwocENpZnNJbm9kZSwgb3Bsb2NrKTsKLQotCXJldHVybiByYzsKLX0KLQogaW50IGNpZnNfcG9zaXhfb3BlbihjaGFyICpmdWxsX3BhdGgsIHN0cnVjdCBpbm9kZSAqKnBpbm9kZSwKIAkJCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCBtb2RlLCB1bnNpZ25lZCBpbnQgZl9mbGFncywKIAkJCV9fdTMyICpwb3Bsb2NrLCBfX3UxNiAqcG5ldGZpZCwgaW50IHhpZCkKQEAgLTIxMyw2ICsxNjYsNzYgQEAKIAlyZXR1cm4gcmM7CiB9CiAKK3N0YXRpYyBpbnQKK2NpZnNfbnRfb3BlbihjaGFyICpmdWxsX3BhdGgsIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBjaWZzX3NiX2luZm8gKmNpZnNfc2IsCisJICAgICBzdHJ1Y3QgY2lmc1Rjb25JbmZvICp0Y29uLCB1bnNpZ25lZCBpbnQgZl9mbGFncywgX191MzIgKnBvcGxvY2ssCisJICAgICBfX3UxNiAqcG5ldGZpZCwgaW50IHhpZCkKK3sKKwlpbnQgcmM7CisJaW50IGRlc2lyZWRBY2Nlc3M7CisJaW50IGRpc3Bvc2l0aW9uOworCUZJTEVfQUxMX0lORk8gKmJ1ZjsKKworCWRlc2lyZWRBY2Nlc3MgPSBjaWZzX2NvbnZlcnRfZmxhZ3MoZl9mbGFncyk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBvcGVuIGZsYWcgbWFwcGluZyB0YWJsZToKKyAqCisgKglQT1NJWCBGbGFnICAgICAgICAgICAgQ0lGUyBEaXNwb3NpdGlvbgorICoJLS0tLS0tLS0tLSAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0KKyAqCU9fQ1JFQVQgICAgICAgICAgICAgICBGSUxFX09QRU5fSUYKKyAqCU9fQ1JFQVQgfCBPX0VYQ0wgICAgICBGSUxFX0NSRUFURQorICoJT19DUkVBVCB8IE9fVFJVTkMgICAgIEZJTEVfT1ZFUldSSVRFX0lGCisgKglPX1RSVU5DICAgICAgICAgICAgICAgRklMRV9PVkVSV1JJVEUKKyAqCW5vbmUgb2YgdGhlIGFib3ZlICAgICBGSUxFX09QRU4KKyAqCisgKglOb3RlIHRoYXQgdGhlcmUgaXMgbm90IGEgZGlyZWN0IG1hdGNoIGJldHdlZW4gZGlzcG9zaXRpb24KKyAqCUZJTEVfU1VQRVJTRURFIChpZSBjcmVhdGUgd2hldGhlciBvciBub3QgZmlsZSBleGlzdHMgYWx0aG91Z2gKKyAqCU9fQ1JFQVQgfCBPX1RSVU5DIGlzIHNpbWlsYXIgYnV0IHRydW5jYXRlcyB0aGUgZXhpc3RpbmcKKyAqCWZpbGUgcmF0aGVyIHRoYW4gY3JlYXRpbmcgYSBuZXcgZmlsZSBhcyBGSUxFX1NVUEVSU0VERSBkb2VzCisgKgkod2hpY2ggdXNlcyB0aGUgYXR0cmlidXRlcyAvIG1ldGFkYXRhIHBhc3NlZCBpbiBvbiBvcGVuIGNhbGwpCisgKj8KKyAqPyAgT19TWU5DIGlzIGEgcmVhc29uYWJsZSBtYXRjaCB0byBDSUZTIHdyaXRldGhyb3VnaCBmbGFnCisgKj8gIGFuZCB0aGUgcmVhZCB3cml0ZSBmbGFncyBtYXRjaCByZWFzb25hYmx5LiAgT19MQVJHRUZJTEUKKyAqPyAgaXMgaXJyZWxldmFudCBiZWNhdXNlIGxhcmdlZmlsZSBzdXBwb3J0IGlzIGFsd2F5cyB1c2VkCisgKj8gIGJ5IHRoaXMgY2xpZW50LiBGbGFncyBPX0FQUEVORCwgT19ESVJFQ1QsIE9fRElSRUNUT1JZLAorICoJIE9fRkFTWU5DLCBPX05PRk9MTE9XLCBPX05PTkJMT0NLIG5lZWQgZnVydGhlciBpbnZlc3RpZ2F0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisJZGlzcG9zaXRpb24gPSBjaWZzX2dldF9kaXNwb3NpdGlvbihmX2ZsYWdzKTsKKworCS8qIEJCIHBhc3MgT19TWU5DIGZsYWcgdGhyb3VnaCBvbiBmaWxlIGF0dHJpYnV0ZXMgLi4gQkIgKi8KKworCWJ1ZiA9IGttYWxsb2Moc2l6ZW9mKEZJTEVfQUxMX0lORk8pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWJ1ZikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpZiAodGNvbi0+c2VzLT5jYXBhYmlsaXRpZXMgJiBDQVBfTlRfU01CUykKKwkJcmMgPSBDSUZTU01CT3Blbih4aWQsIHRjb24sIGZ1bGxfcGF0aCwgZGlzcG9zaXRpb24sCisJCQkgZGVzaXJlZEFjY2VzcywgQ1JFQVRFX05PVF9ESVIsIHBuZXRmaWQsIHBvcGxvY2ssIGJ1ZiwKKwkJCSBjaWZzX3NiLT5sb2NhbF9ubHMsIGNpZnNfc2ItPm1udF9jaWZzX2ZsYWdzCisJCQkJICYgQ0lGU19NT1VOVF9NQVBfU1BFQ0lBTF9DSFIpOworCWVsc2UKKwkJcmMgPSBTTUJMZWdhY3lPcGVuKHhpZCwgdGNvbiwgZnVsbF9wYXRoLCBkaXNwb3NpdGlvbiwKKwkJCWRlc2lyZWRBY2Nlc3MsIENSRUFURV9OT1RfRElSLCBwbmV0ZmlkLCBwb3Bsb2NrLCBidWYsCisJCQljaWZzX3NiLT5sb2NhbF9ubHMsIGNpZnNfc2ItPm1udF9jaWZzX2ZsYWdzCisJCQkJJiBDSUZTX01PVU5UX01BUF9TUEVDSUFMX0NIUik7CisKKwlpZiAocmMpCisJCWdvdG8gb3V0OworCisJaWYgKHRjb24tPnVuaXhfZXh0KQorCQlyYyA9IGNpZnNfZ2V0X2lub2RlX2luZm9fdW5peCgmaW5vZGUsIGZ1bGxfcGF0aCwgaW5vZGUtPmlfc2IsCisJCQkJCSAgICAgIHhpZCk7CisJZWxzZQorCQlyYyA9IGNpZnNfZ2V0X2lub2RlX2luZm8oJmlub2RlLCBmdWxsX3BhdGgsIGJ1ZiwgaW5vZGUtPmlfc2IsCisJCQkJCSB4aWQsIHBuZXRmaWQpOworCitvdXQ6CisJa2ZyZWUoYnVmKTsKKwlyZXR1cm4gcmM7Cit9CisKIHN0cnVjdCBjaWZzRmlsZUluZm8gKgogY2lmc19uZXdfZmlsZWluZm8oX191MTYgZmlsZUhhbmRsZSwgc3RydWN0IGZpbGUgKmZpbGUsCiAJCSAgc3RydWN0IHRjb25fbGluayAqdGxpbmssIF9fdTMyIG9wbG9jaykKQEAgLTMxNywxMCArMzQwLDggQEAKIAlzdHJ1Y3QgY2lmc0ZpbGVJbmZvICpwQ2lmc0ZpbGUgPSBOVUxMOwogCXN0cnVjdCBjaWZzSW5vZGVJbmZvICpwQ2lmc0lub2RlOwogCWNoYXIgKmZ1bGxfcGF0aCA9IE5VTEw7Ci0JaW50IGRlc2lyZWRBY2Nlc3M7Ci0JaW50IGRpc3Bvc2l0aW9uOworCWJvb2wgcG9zaXhfb3Blbl9vayA9IGZhbHNlOwogCV9fdTE2IG5ldGZpZDsKLQlGSUxFX0FMTF9JTkZPICpidWYgPSBOVUxMOwogCiAJeGlkID0gR2V0WGlkKCk7CiAKQEAgLTM1OCwxNyArMzc5LDcgQEAKIAkJCQlmaWxlLT5mX2ZsYWdzLCAmb3Bsb2NrLCAmbmV0ZmlkLCB4aWQpOwogCQlpZiAocmMgPT0gMCkgewogCQkJY0ZZSSgxLCAicG9zaXggb3BlbiBzdWNjZWVkZWQiKTsKLQotCQkJcENpZnNGaWxlID0gY2lmc19uZXdfZmlsZWluZm8obmV0ZmlkLCBmaWxlLCB0bGluaywKLQkJCQkJCSAgICAgIG9wbG9jayk7Ci0JCQlpZiAocENpZnNGaWxlID09IE5VTEwpIHsKLQkJCQlDSUZTU01CQ2xvc2UoeGlkLCB0Y29uLCBuZXRmaWQpOwotCQkJCXJjID0gLUVOT01FTTsKLQkJCX0KLQotCQkJY2lmc19mc2NhY2hlX3NldF9pbm9kZV9jb29raWUoaW5vZGUsIGZpbGUpOwotCi0JCQlnb3RvIG91dDsKKwkJCXBvc2l4X29wZW5fb2sgPSB0cnVlOwogCQl9IGVsc2UgaWYgKChyYyA9PSAtRUlOVkFMKSB8fCAocmMgPT0gLUVPUE5PVFNVUFApKSB7CiAJCQlpZiAodGNvbi0+c2VzLT5zZXJ2ZXJOT1MpCiAJCQkJY0VSUk9SKDEsICJzZXJ2ZXIgJXMgb2YgdHlwZSAlcyByZXR1cm5lZCIKQEAgLTM4NSwxMDMgKzM5NiwzOSBAQAogCQkgICBvciBERlMgZXJyb3JzICovCiAJfQogCi0JZGVzaXJlZEFjY2VzcyA9IGNpZnNfY29udmVydF9mbGFncyhmaWxlLT5mX2ZsYWdzKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIG9wZW4gZmxhZyBtYXBwaW5nIHRhYmxlOgotICoKLSAqCVBPU0lYIEZsYWcgICAgICAgICAgICBDSUZTIERpc3Bvc2l0aW9uCi0gKgktLS0tLS0tLS0tICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLQotICoJT19DUkVBVCAgICAgICAgICAgICAgIEZJTEVfT1BFTl9JRgotICoJT19DUkVBVCB8IE9fRVhDTCAgICAgIEZJTEVfQ1JFQVRFCi0gKglPX0NSRUFUIHwgT19UUlVOQyAgICAgRklMRV9PVkVSV1JJVEVfSUYKLSAqCU9fVFJVTkMgICAgICAgICAgICAgICBGSUxFX09WRVJXUklURQotICoJbm9uZSBvZiB0aGUgYWJvdmUgICAgIEZJTEVfT1BFTgotICoKLSAqCU5vdGUgdGhhdCB0aGVyZSBpcyBub3QgYSBkaXJlY3QgbWF0Y2ggYmV0d2VlbiBkaXNwb3NpdGlvbgotICoJRklMRV9TVVBFUlNFREUgKGllIGNyZWF0ZSB3aGV0aGVyIG9yIG5vdCBmaWxlIGV4aXN0cyBhbHRob3VnaAotICoJT19DUkVBVCB8IE9fVFJVTkMgaXMgc2ltaWxhciBidXQgdHJ1bmNhdGVzIHRoZSBleGlzdGluZwotICoJZmlsZSByYXRoZXIgdGhhbiBjcmVhdGluZyBhIG5ldyBmaWxlIGFzIEZJTEVfU1VQRVJTRURFIGRvZXMKLSAqCSh3aGljaCB1c2VzIHRoZSBhdHRyaWJ1dGVzIC8gbWV0YWRhdGEgcGFzc2VkIGluIG9uIG9wZW4gY2FsbCkKLSAqPwotICo/ICBPX1NZTkMgaXMgYSByZWFzb25hYmxlIG1hdGNoIHRvIENJRlMgd3JpdGV0aHJvdWdoIGZsYWcKLSAqPyAgYW5kIHRoZSByZWFkIHdyaXRlIGZsYWdzIG1hdGNoIHJlYXNvbmFibHkuICBPX0xBUkdFRklMRQotICo/ICBpcyBpcnJlbGV2YW50IGJlY2F1c2UgbGFyZ2VmaWxlIHN1cHBvcnQgaXMgYWx3YXlzIHVzZWQKLSAqPyAgYnkgdGhpcyBjbGllbnQuIEZsYWdzIE9fQVBQRU5ELCBPX0RJUkVDVCwgT19ESVJFQ1RPUlksCi0gKgkgT19GQVNZTkMsIE9fTk9GT0xMT1csIE9fTk9OQkxPQ0sgbmVlZCBmdXJ0aGVyIGludmVzdGlnYXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQlkaXNwb3NpdGlvbiA9IGNpZnNfZ2V0X2Rpc3Bvc2l0aW9uKGZpbGUtPmZfZmxhZ3MpOwotCi0JLyogQkIgcGFzcyBPX1NZTkMgZmxhZyB0aHJvdWdoIG9uIGZpbGUgYXR0cmlidXRlcyAuLiBCQiAqLwotCi0JLyogQWxzbyByZWZyZXNoIGlub2RlIGJ5IHBhc3NpbmcgaW4gZmlsZV9pbmZvIGJ1ZiByZXR1cm5lZCBieSBTTUJPcGVuCi0JICAgYW5kIGNhbGxpbmcgZ2V0X2lub2RlX2luZm8gd2l0aCByZXR1cm5lZCBidWYgKGF0IGxlYXN0IGhlbHBzCi0JICAgbm9uLVVuaXggc2VydmVyIGNhc2UpICovCi0KLQkvKiBCQiB3ZSBjYW4gbm90IGRvIHRoaXMgaWYgdGhpcyBpcyB0aGUgc2Vjb25kIG9wZW4gb2YgYSBmaWxlCi0JICAgYW5kIHRoZSBmaXJzdCBoYW5kbGUgaGFzIHdyaXRlYmVoaW5kIGRhdGEsIHdlIG1pZ2h0IGJlCi0JICAgYWJsZSB0byBzaW1wbHkgZG8gYSBmaWxlbWFwX2ZkYXRhd3JpdGUvZmlsZW1hcF9mZGF0YXdhaXQgZmlyc3QgKi8KLQlidWYgPSBrbWFsbG9jKHNpemVvZihGSUxFX0FMTF9JTkZPKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFidWYpIHsKLQkJcmMgPSAtRU5PTUVNOwotCQlnb3RvIG91dDsKKwlpZiAoIXBvc2l4X29wZW5fb2spIHsKKwkJcmMgPSBjaWZzX250X29wZW4oZnVsbF9wYXRoLCBpbm9kZSwgY2lmc19zYiwgdGNvbiwKKwkJCQkgIGZpbGUtPmZfZmxhZ3MsICZvcGxvY2ssICZuZXRmaWQsIHhpZCk7CisJCWlmIChyYykKKwkJCWdvdG8gb3V0OwogCX0KIAotCWlmICh0Y29uLT5zZXMtPmNhcGFiaWxpdGllcyAmIENBUF9OVF9TTUJTKQotCQlyYyA9IENJRlNTTUJPcGVuKHhpZCwgdGNvbiwgZnVsbF9wYXRoLCBkaXNwb3NpdGlvbiwKLQkJCSBkZXNpcmVkQWNjZXNzLCBDUkVBVEVfTk9UX0RJUiwgJm5ldGZpZCwgJm9wbG9jaywgYnVmLAotCQkJIGNpZnNfc2ItPmxvY2FsX25scywgY2lmc19zYi0+bW50X2NpZnNfZmxhZ3MKLQkJCQkgJiBDSUZTX01PVU5UX01BUF9TUEVDSUFMX0NIUik7Ci0JZWxzZQotCQlyYyA9IC1FSU87IC8qIG5vIE5UIFNNQiBzdXBwb3J0IGZhbGwgaW50byBsZWdhY3kgb3BlbiBiZWxvdyAqLwotCi0JaWYgKHJjID09IC1FSU8pIHsKLQkJLyogT2xkIHNlcnZlciwgdHJ5IGxlZ2FjeSBzdHlsZSBPcGVuWCAqLwotCQlyYyA9IFNNQkxlZ2FjeU9wZW4oeGlkLCB0Y29uLCBmdWxsX3BhdGgsIGRpc3Bvc2l0aW9uLAotCQkJZGVzaXJlZEFjY2VzcywgQ1JFQVRFX05PVF9ESVIsICZuZXRmaWQsICZvcGxvY2ssIGJ1ZiwKLQkJCWNpZnNfc2ItPmxvY2FsX25scywgY2lmc19zYi0+bW50X2NpZnNfZmxhZ3MKLQkJCQkmIENJRlNfTU9VTlRfTUFQX1NQRUNJQUxfQ0hSKTsKLQl9Ci0JaWYgKHJjKSB7Ci0JCWNGWUkoMSwgImNpZnNfb3BlbiByZXR1cm5lZCAweCV4IiwgcmMpOwotCQlnb3RvIG91dDsKLQl9Ci0KLQlyYyA9IGNpZnNfb3Blbl9pbm9kZV9oZWxwZXIoaW5vZGUsIHRjb24sIG9wbG9jaywgYnVmLCBmdWxsX3BhdGgsIHhpZCk7Ci0JaWYgKHJjICE9IDApCi0JCWdvdG8gb3V0OwotCiAJcENpZnNGaWxlID0gY2lmc19uZXdfZmlsZWluZm8obmV0ZmlkLCBmaWxlLCB0bGluaywgb3Bsb2NrKTsKIAlpZiAocENpZnNGaWxlID09IE5VTEwpIHsKKwkJQ0lGU1NNQkNsb3NlKHhpZCwgdGNvbiwgbmV0ZmlkKTsKIAkJcmMgPSAtRU5PTUVNOwogCQlnb3RvIG91dDsKIAl9CiAKIAljaWZzX2ZzY2FjaGVfc2V0X2lub2RlX2Nvb2tpZShpbm9kZSwgZmlsZSk7CiAKLQlpZiAob3Bsb2NrICYgQ0lGU19DUkVBVEVfQUNUSU9OKSB7CisJaWYgKChvcGxvY2sgJiBDSUZTX0NSRUFURV9BQ1RJT04pICYmICFwb3NpeF9vcGVuX29rICYmIHRjb24tPnVuaXhfZXh0KSB7CiAJCS8qIHRpbWUgdG8gc2V0IG1vZGUgd2hpY2ggd2UgY2FuIG5vdCBzZXQgZWFybGllciBkdWUgdG8KIAkJICAgcHJvYmxlbXMgY3JlYXRpbmcgbmV3IHJlYWQtb25seSBmaWxlcyAqLwotCQlpZiAodGNvbi0+dW5peF9leHQpIHsKLQkJCXN0cnVjdCBjaWZzX3VuaXhfc2V0X2luZm9fYXJncyBhcmdzID0gewotCQkJCS5tb2RlCT0gaW5vZGUtPmlfbW9kZSwKLQkJCQkudWlkCT0gTk9fQ0hBTkdFXzY0LAotCQkJCS5naWQJPSBOT19DSEFOR0VfNjQsCi0JCQkJLmN0aW1lCT0gTk9fQ0hBTkdFXzY0LAotCQkJCS5hdGltZQk9IE5PX0NIQU5HRV82NCwKLQkJCQkubXRpbWUJPSBOT19DSEFOR0VfNjQsCi0JCQkJLmRldmljZQk9IDAsCi0JCQl9OwotCQkJQ0lGU1NNQlVuaXhTZXRQYXRoSW5mbyh4aWQsIHRjb24sIGZ1bGxfcGF0aCwgJmFyZ3MsCi0JCQkJCSAgICAgICBjaWZzX3NiLT5sb2NhbF9ubHMsCi0JCQkJCSAgICAgICBjaWZzX3NiLT5tbnRfY2lmc19mbGFncyAmCi0JCQkJCQlDSUZTX01PVU5UX01BUF9TUEVDSUFMX0NIUik7Ci0JCX0KKwkJc3RydWN0IGNpZnNfdW5peF9zZXRfaW5mb19hcmdzIGFyZ3MgPSB7CisJCQkubW9kZQk9IGlub2RlLT5pX21vZGUsCisJCQkudWlkCT0gTk9fQ0hBTkdFXzY0LAorCQkJLmdpZAk9IE5PX0NIQU5HRV82NCwKKwkJCS5jdGltZQk9IE5PX0NIQU5HRV82NCwKKwkJCS5hdGltZQk9IE5PX0NIQU5HRV82NCwKKwkJCS5tdGltZQk9IE5PX0NIQU5HRV82NCwKKwkJCS5kZXZpY2UJPSAwLAorCQl9OworCQlDSUZTU01CVW5peFNldEZpbGVJbmZvKHhpZCwgdGNvbiwgJmFyZ3MsIG5ldGZpZCwKKwkJCQkJcENpZnNGaWxlLT5waWQpOwogCX0KIAogb3V0OgotCWtmcmVlKGJ1Zik7CiAJa2ZyZWUoZnVsbF9wYXRoKTsKIAlGcmVlWGlkKHhpZCk7CiAJY2lmc19wdXRfdGxpbmsodGxpbmspOwpkaWZmIC0tZ2l0IGEvZnMvY2lmcy9pbm9kZS5jIGIvZnMvY2lmcy9pbm9kZS5jCmluZGV4IGE4NTNhODkuLjBjN2UzNjkgMTAwNjQ0Ci0tLSBhL2ZzL2NpZnMvaW5vZGUuYworKysgYi9mcy9jaWZzL2lub2RlLmMKQEAgLTUxOCw2ICs1MTgsNyBAQAogCiAJZmF0dHItPmNmX2VvZiA9IGxlNjRfdG9fY3B1KGluZm8tPkVuZE9mRmlsZSk7CiAJZmF0dHItPmNmX2J5dGVzID0gbGU2NF90b19jcHUoaW5mby0+QWxsb2NhdGlvblNpemUpOworCWZhdHRyLT5jZl9jcmVhdGV0aW1lID0gbGU2NF90b19jcHUoaW5mby0+Q3JlYXRpb25UaW1lKTsKIAogCWlmIChmYXR0ci0+Y2ZfY2lmc2F0dHJzICYgQVRUUl9ESVJFQ1RPUlkpIHsKIAkJZmF0dHItPmNmX21vZGUgPSBTX0lGRElSIHwgY2lmc19zYi0+bW50X2Rpcl9tb2RlOwpAQCAtNzc5LDYgKzc4MCwxMCBAQAogCWlmIChDSUZTX0koaW5vZGUpLT51bmlxdWVpZCAhPSBmYXR0ci0+Y2ZfdW5pcXVlaWQpCiAJCXJldHVybiAwOwogCisJLyogdXNlIGNyZWF0ZXRpbWUgbGlrZSBhbiBpX2dlbmVyYXRpb24gZmllbGQgKi8KKwlpZiAoQ0lGU19JKGlub2RlKS0+Y3JlYXRldGltZSAhPSBmYXR0ci0+Y2ZfY3JlYXRldGltZSkKKwkJcmV0dXJuIDA7CisKIAkvKiBkb24ndCBtYXRjaCBpbm9kZSBvZiBkaWZmZXJlbnQgdHlwZSAqLwogCWlmICgoaW5vZGUtPmlfbW9kZSAmIFNfSUZNVCkgIT0gKGZhdHRyLT5jZl9tb2RlICYgU19JRk1UKSkKIAkJcmV0dXJuIDA7CkBAIC03OTYsNiArODAxLDcgQEAKIAlzdHJ1Y3QgY2lmc19mYXR0ciAqZmF0dHIgPSAoc3RydWN0IGNpZnNfZmF0dHIgKikgb3BhcXVlOwogCiAJQ0lGU19JKGlub2RlKS0+dW5pcXVlaWQgPSBmYXR0ci0+Y2ZfdW5pcXVlaWQ7CisJQ0lGU19JKGlub2RlKS0+Y3JlYXRldGltZSA9IGZhdHRyLT5jZl9jcmVhdGV0aW1lOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9mcy9jaWZzL3JlYWRkaXIuYyBiL2ZzL2NpZnMvcmVhZGRpci5jCmluZGV4IGVjNWI2OGUuLjc2YjFiMzcgMTAwNjQ0Ci0tLSBhL2ZzL2NpZnMvcmVhZGRpci5jCisrKyBiL2ZzL2NpZnMvcmVhZGRpci5jCkBAIC0xNjAsNiArMTYwLDcgQEAKIAlmYXR0ci0+Y2ZfY2lmc2F0dHJzID0gbGUzMl90b19jcHUoaW5mby0+RXh0RmlsZUF0dHJpYnV0ZXMpOwogCWZhdHRyLT5jZl9lb2YgPSBsZTY0X3RvX2NwdShpbmZvLT5FbmRPZkZpbGUpOwogCWZhdHRyLT5jZl9ieXRlcyA9IGxlNjRfdG9fY3B1KGluZm8tPkFsbG9jYXRpb25TaXplKTsKKwlmYXR0ci0+Y2ZfY3JlYXRldGltZSA9IGxlNjRfdG9fY3B1KGluZm8tPkNyZWF0aW9uVGltZSk7CiAJZmF0dHItPmNmX2F0aW1lID0gY2lmc19OVHRpbWVUb1VuaXgoaW5mby0+TGFzdEFjY2Vzc1RpbWUpOwogCWZhdHRyLT5jZl9jdGltZSA9IGNpZnNfTlR0aW1lVG9Vbml4KGluZm8tPkNoYW5nZVRpbWUpOwogCWZhdHRyLT5jZl9tdGltZSA9IGNpZnNfTlR0aW1lVG9Vbml4KGluZm8tPkxhc3RXcml0ZVRpbWUpOwpkaWZmIC0tZ2l0IGEvZnMvY2lmcy9zZXNzLmMgYi9mcy9jaWZzL3Nlc3MuYwppbmRleCA3YjAxZDNmLi5lYjc0NjQ4IDEwMDY0NAotLS0gYS9mcy9jaWZzL3Nlc3MuYworKysgYi9mcy9jaWZzL3Nlc3MuYwpAQCAtNDIwLDcgKzQyMCw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLSNpZmRlZiBDT05GSUdfQ0lGU19FWFBFUklNRU5UQUwKIC8qIEJCIE1vdmUgdG8gbnRsbXNzcC5jIGV2ZW50dWFsbHkgKi8KIAogLyogV2UgZG8gbm90IG1hbGxvYyB0aGUgYmxvYiwgaXQgaXMgcGFzc2VkIGluIHBidWZmZXIsIGJlY2F1c2UKQEAgLTQzMSwxMyArNDMwLDE0IEBACiAJTkVHT1RJQVRFX01FU1NBR0UgKnNlY19ibG9iID0gKE5FR09USUFURV9NRVNTQUdFICopcGJ1ZmZlcjsKIAlfX3UzMiBmbGFnczsKIAorCW1lbXNldChwYnVmZmVyLCAwLCBzaXplb2YoTkVHT1RJQVRFX01FU1NBR0UpKTsKIAltZW1jcHkoc2VjX2Jsb2ItPlNpZ25hdHVyZSwgTlRMTVNTUF9TSUdOQVRVUkUsIDgpOwogCXNlY19ibG9iLT5NZXNzYWdlVHlwZSA9IE50TG1OZWdvdGlhdGU7CiAKIAkvKiBCQiBpcyBOVExNVjIgc2Vzc2lvbiBzZWN1cml0eSBmb3JtYXQgZWFzaWVyIHRvIHVzZSBoZXJlPyAqLwogCWZsYWdzID0gTlRMTVNTUF9ORUdPVElBVEVfNTYgfAlOVExNU1NQX1JFUVVFU1RfVEFSR0VUIHwKIAkJTlRMTVNTUF9ORUdPVElBVEVfMTI4IHwgTlRMTVNTUF9ORUdPVElBVEVfVU5JQ09ERSB8Ci0JCU5UTE1TU1BfTkVHT1RJQVRFX05UTE07CisJCU5UTE1TU1BfTkVHT1RJQVRFX05UTE0gfCBOVExNU1NQX05FR09USUFURV9FWFRFTkRFRF9TRUM7CiAJaWYgKHNlcy0+c2VydmVyLT5zZWNNb2RlICYKIAkJCShTRUNNT0RFX1NJR05fUkVRVUlSRUQgfCBTRUNNT0RFX1NJR05fRU5BQkxFRCkpIHsKIAkJZmxhZ3MgfD0gTlRMTVNTUF9ORUdPVElBVEVfU0lHTjsKQEAgLTQ0Niw3ICs0NDYsNyBAQAogCQkJCU5UTE1TU1BfTkVHT1RJQVRFX0VYVEVOREVEX1NFQzsKIAl9CiAKLQlzZWNfYmxvYi0+TmVnb3RpYXRlRmxhZ3MgfD0gY3B1X3RvX2xlMzIoZmxhZ3MpOworCXNlY19ibG9iLT5OZWdvdGlhdGVGbGFncyA9IGNwdV90b19sZTMyKGZsYWdzKTsKIAogCXNlY19ibG9iLT5Xb3Jrc3RhdGlvbk5hbWUuQnVmZmVyT2Zmc2V0ID0gMDsKIAlzZWNfYmxvYi0+V29ya3N0YXRpb25OYW1lLkxlbmd0aCA9IDA7CkBAIC00NzcsNyArNDc3LDcgQEAKIAlmbGFncyA9IE5UTE1TU1BfTkVHT1RJQVRFXzU2IHwKIAkJTlRMTVNTUF9SRVFVRVNUX1RBUkdFVCB8IE5UTE1TU1BfTkVHT1RJQVRFX1RBUkdFVF9JTkZPIHwKIAkJTlRMTVNTUF9ORUdPVElBVEVfMTI4IHwgTlRMTVNTUF9ORUdPVElBVEVfVU5JQ09ERSB8Ci0JCU5UTE1TU1BfTkVHT1RJQVRFX05UTE07CisJCU5UTE1TU1BfTkVHT1RJQVRFX05UTE0gfCBOVExNU1NQX05FR09USUFURV9FWFRFTkRFRF9TRUM7CiAJaWYgKHNlcy0+c2VydmVyLT5zZWNNb2RlICYKIAkgICAoU0VDTU9ERV9TSUdOX1JFUVVJUkVEIHwgU0VDTU9ERV9TSUdOX0VOQUJMRUQpKQogCQlmbGFncyB8PSBOVExNU1NQX05FR09USUFURV9TSUdOOwpAQCAtNDg1LDcgKzQ4NSw3IEBACiAJCWZsYWdzIHw9IE5UTE1TU1BfTkVHT1RJQVRFX0FMV0FZU19TSUdOOwogCiAJdG1wID0gcGJ1ZmZlciArIHNpemVvZihBVVRIRU5USUNBVEVfTUVTU0FHRSk7Ci0Jc2VjX2Jsb2ItPk5lZ290aWF0ZUZsYWdzIHw9IGNwdV90b19sZTMyKGZsYWdzKTsKKwlzZWNfYmxvYi0+TmVnb3RpYXRlRmxhZ3MgPSBjcHVfdG9fbGUzMihmbGFncyk7CiAKIAlzZWNfYmxvYi0+TG1DaGFsbGVuZ2VSZXNwb25zZS5CdWZmZXJPZmZzZXQgPQogCQkJCWNwdV90b19sZTMyKHNpemVvZihBVVRIRU5USUNBVEVfTUVTU0FHRSkpOwpAQCAtNTQ0LDggKzU0NCw5IEBACiAJc2VjX2Jsb2ItPldvcmtzdGF0aW9uTmFtZS5NYXhpbXVtTGVuZ3RoID0gMDsKIAl0bXAgKz0gMjsKIAotCWlmICgoc2VzLT5udGxtc3NwLT5zZXJ2ZXJfZmxhZ3MgJiBOVExNU1NQX05FR09USUFURV9LRVlfWENIKSAmJgotCQkJIWNhbGNfc2Vja2V5KHNlcykpIHsKKwlpZiAoKChzZXMtPm50bG1zc3AtPnNlcnZlcl9mbGFncyAmIE5UTE1TU1BfTkVHT1RJQVRFX0tFWV9YQ0gpIHx8CisJCShzZXMtPm50bG1zc3AtPnNlcnZlcl9mbGFncyAmIE5UTE1TU1BfTkVHT1RJQVRFX0VYVEVOREVEX1NFQykpCisJCQkmJiAhY2FsY19zZWNrZXkoc2VzKSkgewogCQltZW1jcHkodG1wLCBzZXMtPm50bG1zc3AtPmNpcGhlcnRleHQsIENJRlNfQ1BIVFhUX1NJWkUpOwogCQlzZWNfYmxvYi0+U2Vzc2lvbktleS5CdWZmZXJPZmZzZXQgPSBjcHVfdG9fbGUzMih0bXAgLSBwYnVmZmVyKTsKIAkJc2VjX2Jsb2ItPlNlc3Npb25LZXkuTGVuZ3RoID0gY3B1X3RvX2xlMTYoQ0lGU19DUEhUWFRfU0laRSk7CkBAIC01NjMsMTcgKzU2NCw2IEBACiAJcmV0dXJuIHJjOwogfQogCi0KLXN0YXRpYyB2b2lkIHNldHVwX250bG1zc3BfbmVnX3JlcShTRVNTSU9OX1NFVFVQX0FORFggKnBTTUIsCi0JCQkJIHN0cnVjdCBjaWZzU2VzSW5mbyAqc2VzKQotewotCWJ1aWxkX250bG1zc3BfbmVnb3RpYXRlX2Jsb2IoJnBTTUItPnJlcS5TZWN1cml0eUJsb2JbMF0sIHNlcyk7Ci0JcFNNQi0+cmVxLlNlY3VyaXR5QmxvYkxlbmd0aCA9IGNwdV90b19sZTE2KHNpemVvZihORUdPVElBVEVfTUVTU0FHRSkpOwotCi0JcmV0dXJuOwotfQotI2VuZGlmCi0KIGludAogQ0lGU19TZXNzU2V0dXAodW5zaWduZWQgaW50IHhpZCwgc3RydWN0IGNpZnNTZXNJbmZvICpzZXMsCiAJICAgICAgIGNvbnN0IHN0cnVjdCBubHNfdGFibGUgKm5sc19jcCkKQEAgLTgxNCw3MSArODA0LDcwIEBACiAJCXJjID0gLUVOT1NZUzsKIAkJZ290byBzc2V0dXBfZXhpdDsKICNlbmRpZiAvKiBDT05GSUdfQ0lGU19VUENBTEwgKi8KLQl9IGVsc2UgewotI2lmZGVmIENPTkZJR19DSUZTX0VYUEVSSU1FTlRBTAotCQlpZiAodHlwZSA9PSBSYXdOVExNU1NQKSB7Ci0JCQlpZiAoKHBTTUItPnJlcS5oZHIuRmxhZ3MyICYgU01CRkxHMl9VTklDT0RFKSA9PSAwKSB7Ci0JCQkJY0VSUk9SKDEsICJOVExNU1NQIHJlcXVpcmVzIFVuaWNvZGUgc3VwcG9ydCIpOwotCQkJCXJjID0gLUVOT1NZUzsKLQkJCQlnb3RvIHNzZXR1cF9leGl0OwotCQkJfQotCi0JCQljRllJKDEsICJudGxtc3NwIHNlc3Npb24gc2V0dXAgcGhhc2UgJWQiLCBwaGFzZSk7Ci0JCQlwU01CLT5yZXEuaGRyLkZsYWdzMiB8PSBTTUJGTEcyX0VYVF9TRUM7Ci0JCQljYXBhYmlsaXRpZXMgfD0gQ0FQX0VYVEVOREVEX1NFQ1VSSVRZOwotCQkJcFNNQi0+cmVxLkNhcGFiaWxpdGllcyB8PSBjcHVfdG9fbGUzMihjYXBhYmlsaXRpZXMpOwotCQkJaWYgKHBoYXNlID09IE50TG1OZWdvdGlhdGUpIHsKLQkJCQlzZXR1cF9udGxtc3NwX25lZ19yZXEocFNNQiwgc2VzKTsKLQkJCQlpb3ZbMV0uaW92X2xlbiA9IHNpemVvZihORUdPVElBVEVfTUVTU0FHRSk7Ci0JCQkJaW92WzFdLmlvdl9iYXNlID0gJnBTTUItPnJlcS5TZWN1cml0eUJsb2JbMF07Ci0JCQl9IGVsc2UgaWYgKHBoYXNlID09IE50TG1BdXRoZW50aWNhdGUpIHsKLQkJCQkvKiA1IGlzIGFuIGVtcGlyaWNhbCB2YWx1ZSwgbGFyZ2UgZW5vdWdodCB0bwotCQkJCSAqIGhvbGQgYXV0aGVudGljYXRlIG1lc3NhZ2UsIG1heCAxMCBvZgotCQkJCSAqIGF2IHBhcmlzLCBkb2FtaW4sdXNlcix3b3Jrc3RhdGlvbiBtYW1lcywKLQkJCQkgKiBmbGFncyBldGMuLgotCQkJCSAqLwotCQkJCW50bG1zc3BibG9iID0ga21hbGxvYygKLQkJCQkJNSpzaXplb2Yoc3RydWN0IF9BVVRIRU5USUNBVEVfTUVTU0FHRSksCi0JCQkJCUdGUF9LRVJORUwpOwotCQkJCWlmICghbnRsbXNzcGJsb2IpIHsKLQkJCQkJY0VSUk9SKDEsICJDYW4ndCBhbGxvY2F0ZSBOVExNU1NQIik7Ci0JCQkJCXJjID0gLUVOT01FTTsKLQkJCQkJZ290byBzc2V0dXBfZXhpdDsKLQkJCQl9Ci0KLQkJCQlyYyA9IGJ1aWxkX250bG1zc3BfYXV0aF9ibG9iKG50bG1zc3BibG9iLAotCQkJCQkJCSZibG9iX2xlbiwgc2VzLCBubHNfY3ApOwotCQkJCWlmIChyYykKLQkJCQkJZ290byBzc2V0dXBfZXhpdDsKLQkJCQlpb3ZbMV0uaW92X2xlbiA9IGJsb2JfbGVuOwotCQkJCWlvdlsxXS5pb3ZfYmFzZSA9IG50bG1zc3BibG9iOwotCQkJCXBTTUItPnJlcS5TZWN1cml0eUJsb2JMZW5ndGggPQotCQkJCQljcHVfdG9fbGUxNihibG9iX2xlbik7Ci0JCQkJLyogTWFrZSBzdXJlIHRoYXQgd2UgdGVsbCB0aGUgc2VydmVyIHRoYXQgd2UKLQkJCQkgICBhcmUgdXNpbmcgdGhlIHVpZCB0aGF0IGl0IGp1c3QgZ2F2ZSB1cyBiYWNrCi0JCQkJICAgb24gdGhlIHJlc3BvbnNlIChjaGFsbGVuZ2UpICovCi0JCQkJc21iX2J1Zi0+VWlkID0gc2VzLT5TdWlkOwotCQkJfSBlbHNlIHsKLQkJCQljRVJST1IoMSwgImludmFsaWQgcGhhc2UgJWQiLCBwaGFzZSk7Ci0JCQkJcmMgPSAtRU5PU1lTOwotCQkJCWdvdG8gc3NldHVwX2V4aXQ7Ci0JCQl9Ci0JCQkvKiB1bmljb2RlIHN0cmluZ3MgbXVzdCBiZSB3b3JkIGFsaWduZWQgKi8KLQkJCWlmICgoaW92WzBdLmlvdl9sZW4gKyBpb3ZbMV0uaW92X2xlbikgJSAyKSB7Ci0JCQkJKmJjY19wdHIgPSAwOwotCQkJCWJjY19wdHIrKzsKLQkJCX0KLQkJCXVuaWNvZGVfb3NsbV9zdHJpbmdzKCZiY2NfcHRyLCBubHNfY3ApOwotCQl9IGVsc2UgewotCQkJY0VSUk9SKDEsICJzZWNUeXBlICVkIG5vdCBzdXBwb3J0ZWQhIiwgdHlwZSk7CisJfSBlbHNlIGlmICh0eXBlID09IFJhd05UTE1TU1ApIHsKKwkJaWYgKChwU01CLT5yZXEuaGRyLkZsYWdzMiAmIFNNQkZMRzJfVU5JQ09ERSkgPT0gMCkgeworCQkJY0VSUk9SKDEsICJOVExNU1NQIHJlcXVpcmVzIFVuaWNvZGUgc3VwcG9ydCIpOwogCQkJcmMgPSAtRU5PU1lTOwogCQkJZ290byBzc2V0dXBfZXhpdDsKIAkJfQotI2Vsc2UKKworCQljRllJKDEsICJudGxtc3NwIHNlc3Npb24gc2V0dXAgcGhhc2UgJWQiLCBwaGFzZSk7CisJCXBTTUItPnJlcS5oZHIuRmxhZ3MyIHw9IFNNQkZMRzJfRVhUX1NFQzsKKwkJY2FwYWJpbGl0aWVzIHw9IENBUF9FWFRFTkRFRF9TRUNVUklUWTsKKwkJcFNNQi0+cmVxLkNhcGFiaWxpdGllcyB8PSBjcHVfdG9fbGUzMihjYXBhYmlsaXRpZXMpOworCQlzd2l0Y2gocGhhc2UpIHsKKwkJY2FzZSBOdExtTmVnb3RpYXRlOgorCQkJYnVpbGRfbnRsbXNzcF9uZWdvdGlhdGVfYmxvYigKKwkJCQlwU01CLT5yZXEuU2VjdXJpdHlCbG9iLCBzZXMpOworCQkJaW92WzFdLmlvdl9sZW4gPSBzaXplb2YoTkVHT1RJQVRFX01FU1NBR0UpOworCQkJaW92WzFdLmlvdl9iYXNlID0gcFNNQi0+cmVxLlNlY3VyaXR5QmxvYjsKKwkJCXBTTUItPnJlcS5TZWN1cml0eUJsb2JMZW5ndGggPQorCQkJCWNwdV90b19sZTE2KHNpemVvZihORUdPVElBVEVfTUVTU0FHRSkpOworCQkJYnJlYWs7CisJCWNhc2UgTnRMbUF1dGhlbnRpY2F0ZToKKwkJCS8qCisJCQkgKiA1IGlzIGFuIGVtcGlyaWNhbCB2YWx1ZSwgbGFyZ2UgZW5vdWdoIHRvIGhvbGQKKwkJCSAqIGF1dGhlbnRpY2F0ZSBtZXNzYWdlIHBsdXMgbWF4IDEwIG9mIGF2IHBhcmlzLAorCQkJICogZG9tYWluLCB1c2VyLCB3b3Jrc3RhdGlvbiBuYW1lcywgZmxhZ3MsIGV0Yy4KKwkJCSAqLworCQkJbnRsbXNzcGJsb2IgPSBremFsbG9jKAorCQkJCTUqc2l6ZW9mKHN0cnVjdCBfQVVUSEVOVElDQVRFX01FU1NBR0UpLAorCQkJCUdGUF9LRVJORUwpOworCQkJaWYgKCFudGxtc3NwYmxvYikgeworCQkJCWNFUlJPUigxLCAiQ2FuJ3QgYWxsb2NhdGUgTlRMTVNTUCBibG9iIik7CisJCQkJcmMgPSAtRU5PTUVNOworCQkJCWdvdG8gc3NldHVwX2V4aXQ7CisJCQl9CisKKwkJCXJjID0gYnVpbGRfbnRsbXNzcF9hdXRoX2Jsb2IobnRsbXNzcGJsb2IsCisJCQkJCQkmYmxvYl9sZW4sIHNlcywgbmxzX2NwKTsKKwkJCWlmIChyYykKKwkJCQlnb3RvIHNzZXR1cF9leGl0OworCQkJaW92WzFdLmlvdl9sZW4gPSBibG9iX2xlbjsKKwkJCWlvdlsxXS5pb3ZfYmFzZSA9IG50bG1zc3BibG9iOworCQkJcFNNQi0+cmVxLlNlY3VyaXR5QmxvYkxlbmd0aCA9IGNwdV90b19sZTE2KGJsb2JfbGVuKTsKKwkJCS8qCisJCQkgKiBNYWtlIHN1cmUgdGhhdCB3ZSB0ZWxsIHRoZSBzZXJ2ZXIgdGhhdCB3ZSBhcmUgdXNpbmcKKwkJCSAqIHRoZSB1aWQgdGhhdCBpdCBqdXN0IGdhdmUgdXMgYmFjayBvbiB0aGUgcmVzcG9uc2UKKwkJCSAqIChjaGFsbGVuZ2UpCisJCQkgKi8KKwkJCXNtYl9idWYtPlVpZCA9IHNlcy0+U3VpZDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJY0VSUk9SKDEsICJpbnZhbGlkIHBoYXNlICVkIiwgcGhhc2UpOworCQkJcmMgPSAtRU5PU1lTOworCQkJZ290byBzc2V0dXBfZXhpdDsKKwkJfQorCQkvKiB1bmljb2RlIHN0cmluZ3MgbXVzdCBiZSB3b3JkIGFsaWduZWQgKi8KKwkJaWYgKChpb3ZbMF0uaW92X2xlbiArIGlvdlsxXS5pb3ZfbGVuKSAlIDIpIHsKKwkJCSpiY2NfcHRyID0gMDsKKwkJCWJjY19wdHIrKzsKKwkJfQorCQl1bmljb2RlX29zbG1fc3RyaW5ncygmYmNjX3B0ciwgbmxzX2NwKTsKKwl9IGVsc2UgewogCQljRVJST1IoMSwgInNlY1R5cGUgJWQgbm90IHN1cHBvcnRlZCEiLCB0eXBlKTsKIAkJcmMgPSAtRU5PU1lTOwogCQlnb3RvIHNzZXR1cF9leGl0OwotI2VuZGlmCiAJfQogCiAJaW92WzJdLmlvdl9iYXNlID0gc3RyX2FyZWE7CmRpZmYgLS1naXQgYS9mcy9jaWZzL3RyYW5zcG9ydC5jIGIvZnMvY2lmcy90cmFuc3BvcnQuYwppbmRleCBlMDU4OGNkLi41OWNhODFiIDEwMDY0NAotLS0gYS9mcy9jaWZzL3RyYW5zcG9ydC5jCisrKyBiL2ZzL2NpZnMvdHJhbnNwb3J0LmMKQEAgLTExOSw3ICsxMTksNyBAQAogCWlmIChzc29ja2V0ID09IE5VTEwpCiAJCXJldHVybiAtRU5PVFNPQ0s7IC8qIEJCIGV2ZW50dWFsbHkgYWRkIHJlY29ubmVjdCBjb2RlIGhlcmUgKi8KIAotCXNtYl9tc2cubXNnX25hbWUgPSAoc3RydWN0IHNvY2thZGRyICopICZzZXJ2ZXItPmFkZHIuc29ja0FkZHI7CisJc21iX21zZy5tc2dfbmFtZSA9IChzdHJ1Y3Qgc29ja2FkZHIgKikgJnNlcnZlci0+ZHN0YWRkcjsKIAlzbWJfbXNnLm1zZ19uYW1lbGVuID0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcik7CiAJc21iX21zZy5tc2dfY29udHJvbCA9IE5VTEw7CiAJc21iX21zZy5tc2dfY29udHJvbGxlbiA9IDA7CmRpZmYgLS1naXQgYS9mcy9kbG0vbG93Y29tbXMuYyBiL2ZzL2RsbS9sb3djb21tcy5jCmluZGV4IDM3YTM0YzIuLjljNjRhZTkgMTAwNjQ0Ci0tLSBhL2ZzL2RsbS9sb3djb21tcy5jCisrKyBiL2ZzL2RsbS9sb3djb21tcy5jCkBAIC02Myw2ICs2Myw5IEBACiAjZGVmaW5lIE5FRURFRF9STUVNICg0KjEwMjQqMTAyNCkKICNkZWZpbmUgQ09OTl9IQVNIX1NJWkUgMzIKIAorLyogTnVtYmVyIG9mIG1lc3NhZ2VzIHRvIHNlbmQgYmVmb3JlIHJlc2NoZWR1bGluZyAqLworI2RlZmluZSBNQVhfU0VORF9NU0dfQ09VTlQgMjUKKwogc3RydWN0IGNidWYgewogCXVuc2lnbmVkIGludCBiYXNlOwogCXVuc2lnbmVkIGludCBsZW47CkBAIC0xMDgsNiArMTExLDcgQEAKICNkZWZpbmUgQ0ZfSU5JVF9QRU5ESU5HIDQKICNkZWZpbmUgQ0ZfSVNfT1RIRVJDT04gNQogI2RlZmluZSBDRl9DTE9TRSA2CisjZGVmaW5lIENGX0FQUF9MSU1JVEVEIDcKIAlzdHJ1Y3QgbGlzdF9oZWFkIHdyaXRlcXVldWU7ICAvKiBMaXN0IG9mIG91dGdvaW5nIHdyaXRlcXVldWVfZW50cmllcyAqLwogCXNwaW5sb2NrX3Qgd3JpdGVxdWV1ZV9sb2NrOwogCWludCAoKnJ4X2FjdGlvbikgKHN0cnVjdCBjb25uZWN0aW9uICopOwkvKiBXaGF0IHRvIGRvIHdoZW4gYWN0aXZlICovCkBAIC0yOTUsNyArMjk5LDE3IEBACiB7CiAJc3RydWN0IGNvbm5lY3Rpb24gKmNvbiA9IHNvY2syY29uKHNrKTsKIAotCWlmIChjb24gJiYgIXRlc3RfYW5kX3NldF9iaXQoQ0ZfV1JJVEVfUEVORElORywgJmNvbi0+ZmxhZ3MpKQorCWlmICghY29uKQorCQlyZXR1cm47CisKKwljbGVhcl9iaXQoU09DS19OT1NQQUNFLCAmY29uLT5zb2NrLT5mbGFncyk7CisKKwlpZiAodGVzdF9hbmRfY2xlYXJfYml0KENGX0FQUF9MSU1JVEVELCAmY29uLT5mbGFncykpIHsKKwkJY29uLT5zb2NrLT5zay0+c2tfd3JpdGVfcGVuZGluZy0tOworCQljbGVhcl9iaXQoU09DS19BU1lOQ19OT1NQQUNFLCAmY29uLT5zb2NrLT5mbGFncyk7CisJfQorCisJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KENGX1dSSVRFX1BFTkRJTkcsICZjb24tPmZsYWdzKSkKIAkJcXVldWVfd29yayhzZW5kX3dvcmtxdWV1ZSwgJmNvbi0+c3dvcmspOwogfQogCkBAIC05MTUsNiArOTI5LDcgQEAKIAlzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSBzYWRkciwgc3JjX2FkZHI7CiAJaW50IGFkZHJfbGVuOwogCXN0cnVjdCBzb2NrZXQgKnNvY2sgPSBOVUxMOworCWludCBvbmUgPSAxOwogCiAJaWYgKGNvbi0+bm9kZWlkID09IDApIHsKIAkJbG9nX3ByaW50KCJhdHRlbXB0IHRvIGNvbm5lY3Qgc29jayAwIGZvaWxlZCIpOwpAQCAtOTYwLDYgKzk3NSwxMSBAQAogCW1ha2Vfc29ja2FkZHIoJnNhZGRyLCBkbG1fY29uZmlnLmNpX3RjcF9wb3J0LCAmYWRkcl9sZW4pOwogCiAJbG9nX3ByaW50KCJjb25uZWN0aW5nIHRvICVkIiwgY29uLT5ub2RlaWQpOworCisJLyogVHVybiBvZmYgTmFnbGUncyBhbGdvcml0aG0gKi8KKwlrZXJuZWxfc2V0c29ja29wdChzb2NrLCBTT0xfVENQLCBUQ1BfTk9ERUxBWSwgKGNoYXIgKikmb25lLAorCQkJICBzaXplb2Yob25lKSk7CisKIAlyZXN1bHQgPQogCQlzb2NrLT5vcHMtPmNvbm5lY3Qoc29jaywgKHN0cnVjdCBzb2NrYWRkciAqKSZzYWRkciwgYWRkcl9sZW4sCiAJCQkJICAgT19OT05CTE9DSyk7CkBAIC0xMDExLDYgKzEwMzEsMTAgQEAKIAkJZ290byBjcmVhdGVfb3V0OwogCX0KIAorCS8qIFR1cm4gb2ZmIE5hZ2xlJ3MgYWxnb3JpdGhtICovCisJa2VybmVsX3NldHNvY2tvcHQoc29jaywgU09MX1RDUCwgVENQX05PREVMQVksIChjaGFyICopJm9uZSwKKwkJCSAgc2l6ZW9mKG9uZSkpOworCiAJcmVzdWx0ID0ga2VybmVsX3NldHNvY2tvcHQoc29jaywgU09MX1NPQ0tFVCwgU09fUkVVU0VBRERSLAogCQkJCSAgIChjaGFyICopJm9uZSwgc2l6ZW9mKG9uZSkpOwogCkBAIC0xMjk3LDYgKzEzMjEsNyBAQAogCWNvbnN0IGludCBtc2dfZmxhZ3MgPSBNU0dfRE9OVFdBSVQgfCBNU0dfTk9TSUdOQUw7CiAJc3RydWN0IHdyaXRlcXVldWVfZW50cnkgKmU7CiAJaW50IGxlbiwgb2Zmc2V0OworCWludCBjb3VudCA9IDA7CiAKIAltdXRleF9sb2NrKCZjb24tPnNvY2tfbXV0ZXgpOwogCWlmIChjb24tPnNvY2sgPT0gTlVMTCkKQEAgLTEzMTksMTQgKzEzNDQsMjcgQEAKIAkJCXJldCA9IGtlcm5lbF9zZW5kcGFnZShjb24tPnNvY2ssIGUtPnBhZ2UsIG9mZnNldCwgbGVuLAogCQkJCQkgICAgICBtc2dfZmxhZ3MpOwogCQkJaWYgKHJldCA9PSAtRUFHQUlOIHx8IHJldCA9PSAwKSB7CisJCQkJaWYgKHJldCA9PSAtRUFHQUlOICYmCisJCQkJICAgIHRlc3RfYml0KFNPQ0tfQVNZTkNfTk9TUEFDRSwgJmNvbi0+c29jay0+ZmxhZ3MpICYmCisJCQkJICAgICF0ZXN0X2FuZF9zZXRfYml0KENGX0FQUF9MSU1JVEVELCAmY29uLT5mbGFncykpIHsKKwkJCQkJLyogTm90aWZ5IFRDUCB0aGF0IHdlJ3JlIGxpbWl0ZWQgYnkgdGhlCisJCQkJCSAqIGFwcGxpY2F0aW9uIHdpbmRvdyBzaXplLgorCQkJCQkgKi8KKwkJCQkJc2V0X2JpdChTT0NLX05PU1BBQ0UsICZjb24tPnNvY2stPmZsYWdzKTsKKwkJCQkJY29uLT5zb2NrLT5zay0+c2tfd3JpdGVfcGVuZGluZysrOworCQkJCX0KIAkJCQljb25kX3Jlc2NoZWQoKTsKIAkJCQlnb3RvIG91dDsKIAkJCX0KIAkJCWlmIChyZXQgPD0gMCkKIAkJCQlnb3RvIHNlbmRfZXJyb3I7CiAJCX0KLQkJCS8qIERvbid0IHN0YXJ2ZSBwZW9wbGUgZmlsbGluZyBidWZmZXJzICovCisKKwkJLyogRG9uJ3Qgc3RhcnZlIHBlb3BsZSBmaWxsaW5nIGJ1ZmZlcnMgKi8KKwkJaWYgKCsrY291bnQgPj0gTUFYX1NFTkRfTVNHX0NPVU5UKSB7CiAJCQljb25kX3Jlc2NoZWQoKTsKKwkJCWNvdW50ID0gMDsKKwkJfQogCiAJCXNwaW5fbG9jaygmY29uLT53cml0ZXF1ZXVlX2xvY2spOwogCQllLT5vZmZzZXQgKz0gcmV0OwpAQCAtMTQzMCwyMCArMTQ2OCwxOSBAQAogCiBzdGF0aWMgaW50IHdvcmtfc3RhcnQodm9pZCkKIHsKLQlpbnQgZXJyb3I7Ci0JcmVjdl93b3JrcXVldWUgPSBjcmVhdGVfd29ya3F1ZXVlKCJkbG1fcmVjdiIpOwotCWVycm9yID0gSVNfRVJSKHJlY3Zfd29ya3F1ZXVlKTsKLQlpZiAoZXJyb3IpIHsKLQkJbG9nX3ByaW50KCJjYW4ndCBzdGFydCBkbG1fcmVjdiAlZCIsIGVycm9yKTsKLQkJcmV0dXJuIGVycm9yOworCXJlY3Zfd29ya3F1ZXVlID0gYWxsb2Nfd29ya3F1ZXVlKCJkbG1fcmVjdiIsIFdRX01FTV9SRUNMQUlNIHwKKwkJCQkJIFdRX0hJR0hQUkkgfCBXUV9GUkVFWkVBQkxFLCAwKTsKKwlpZiAoIXJlY3Zfd29ya3F1ZXVlKSB7CisJCWxvZ19wcmludCgiY2FuJ3Qgc3RhcnQgZGxtX3JlY3YiKTsKKwkJcmV0dXJuIC1FTk9NRU07CiAJfQogCi0Jc2VuZF93b3JrcXVldWUgPSBjcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZSgiZGxtX3NlbmQiKTsKLQllcnJvciA9IElTX0VSUihzZW5kX3dvcmtxdWV1ZSk7Ci0JaWYgKGVycm9yKSB7Ci0JCWxvZ19wcmludCgiY2FuJ3Qgc3RhcnQgZGxtX3NlbmQgJWQiLCBlcnJvcik7CisJc2VuZF93b3JrcXVldWUgPSBhbGxvY193b3JrcXVldWUoImRsbV9zZW5kIiwgV1FfTUVNX1JFQ0xBSU0gfAorCQkJCQkgV1FfSElHSFBSSSB8IFdRX0ZSRUVaRUFCTEUsIDApOworCWlmICghc2VuZF93b3JrcXVldWUpIHsKKwkJbG9nX3ByaW50KCJjYW4ndCBzdGFydCBkbG1fc2VuZCIpOwogCQlkZXN0cm95X3dvcmtxdWV1ZShyZWN2X3dvcmtxdWV1ZSk7Ci0JCXJldHVybiBlcnJvcjsKKwkJcmV0dXJuIC1FTk9NRU07CiAJfQogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9mcy9leHQyL2Rpci5jIGIvZnMvZXh0Mi9kaXIuYwppbmRleCAyNzA5YjM0Li40N2NkYTQxIDEwMDY0NAotLS0gYS9mcy9leHQyL2Rpci5jCisrKyBiL2ZzL2V4dDIvZGlyLmMKQEAgLTI4LDIxICsyOCwzMCBAQAogCiB0eXBlZGVmIHN0cnVjdCBleHQyX2Rpcl9lbnRyeV8yIGV4dDJfZGlyZW50OwogCisvKgorICogVGVzdHMgYWdhaW5zdCBNQVhfUkVDX0xFTiBldGMgd2VyZSBwdXQgaW4gcGxhY2UgZm9yIDY0ayBibG9jaworICogc2l6ZXM7IGlmIHRoYXQgaXMgbm90IHBvc3NpYmxlIG9uIHRoaXMgYXJjaCwgd2UgY2FuIHNraXAKKyAqIHRob3NlIHRlc3RzIGFuZCBzcGVlZCB0aGluZ3MgdXAuCisgKi8KIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgZXh0Ml9yZWNfbGVuX2Zyb21fZGlzayhfX2xlMTYgZGxlbikKIHsKIAl1bnNpZ25lZCBsZW4gPSBsZTE2X3RvX2NwdShkbGVuKTsKIAorI2lmIChQQUdFX0NBQ0hFX1NJWkUgPj0gNjU1MzYpCiAJaWYgKGxlbiA9PSBFWFQyX01BWF9SRUNfTEVOKQogCQlyZXR1cm4gMSA8PCAxNjsKKyNlbmRpZgogCXJldHVybiBsZW47CiB9CiAKIHN0YXRpYyBpbmxpbmUgX19sZTE2IGV4dDJfcmVjX2xlbl90b19kaXNrKHVuc2lnbmVkIGxlbikKIHsKKyNpZiAoUEFHRV9DQUNIRV9TSVpFID49IDY1NTM2KQogCWlmIChsZW4gPT0gKDEgPDwgMTYpKQogCQlyZXR1cm4gY3B1X3RvX2xlMTYoRVhUMl9NQVhfUkVDX0xFTik7CiAJZWxzZQogCQlCVUdfT04obGVuID4gKDEgPDwgMTYpKTsKKyNlbmRpZgogCXJldHVybiBjcHVfdG9fbGUxNihsZW4pOwogfQogCkBAIC0xMjksMTUgKzEzOCwxNSBAQAogCQlwID0gKGV4dDJfZGlyZW50ICopKGthZGRyICsgb2Zmcyk7CiAJCXJlY19sZW4gPSBleHQyX3JlY19sZW5fZnJvbV9kaXNrKHAtPnJlY19sZW4pOwogCi0JCWlmIChyZWNfbGVuIDwgRVhUMl9ESVJfUkVDX0xFTigxKSkKKwkJaWYgKHVubGlrZWx5KHJlY19sZW4gPCBFWFQyX0RJUl9SRUNfTEVOKDEpKSkKIAkJCWdvdG8gRXNob3J0OwotCQlpZiAocmVjX2xlbiAmIDMpCisJCWlmICh1bmxpa2VseShyZWNfbGVuICYgMykpCiAJCQlnb3RvIEVhbGlnbjsKLQkJaWYgKHJlY19sZW4gPCBFWFQyX0RJUl9SRUNfTEVOKHAtPm5hbWVfbGVuKSkKKwkJaWYgKHVubGlrZWx5KHJlY19sZW4gPCBFWFQyX0RJUl9SRUNfTEVOKHAtPm5hbWVfbGVuKSkpCiAJCQlnb3RvIEVuYW1lbGVuOwotCQlpZiAoKChvZmZzICsgcmVjX2xlbiAtIDEpIF4gb2ZmcykgJiB+KGNodW5rX3NpemUtMSkpCisJCWlmICh1bmxpa2VseSgoKG9mZnMgKyByZWNfbGVuIC0gMSkgXiBvZmZzKSAmIH4oY2h1bmtfc2l6ZS0xKSkpCiAJCQlnb3RvIEVzcGFuOwotCQlpZiAobGUzMl90b19jcHUocC0+aW5vZGUpID4gbWF4X2ludW1iZXIpCisJCWlmICh1bmxpa2VseShsZTMyX3RvX2NwdShwLT5pbm9kZSkgPiBtYXhfaW51bWJlcikpCiAJCQlnb3RvIEVpbnVtYmVyOwogCX0KIAlpZiAob2ZmcyAhPSBsaW1pdCkKZGlmZiAtLWdpdCBhL2ZzL2V4dDIvbmFtZWkuYyBiL2ZzL2V4dDIvbmFtZWkuYwppbmRleCBmOGFlY2QyLi4yZTFkODM0IDEwMDY0NAotLS0gYS9mcy9leHQyL25hbWVpLmMKKysrIGIvZnMvZXh0Mi9uYW1laS5jCkBAIC02Nyw3ICs2Nyw3IEBACiAJaW5vZGUgPSBOVUxMOwogCWlmIChpbm8pIHsKIAkJaW5vZGUgPSBleHQyX2lnZXQoZGlyLT5pX3NiLCBpbm8pOwotCQlpZiAodW5saWtlbHkoSVNfRVJSKGlub2RlKSkpIHsKKwkJaWYgKElTX0VSUihpbm9kZSkpIHsKIAkJCWlmIChQVFJfRVJSKGlub2RlKSA9PSAtRVNUQUxFKSB7CiAJCQkJZXh0Ml9lcnJvcihkaXItPmlfc2IsIF9fZnVuY19fLAogCQkJCQkJImRlbGV0ZWQgaW5vZGUgcmVmZXJlbmNlZDogJWx1IiwKZGlmZiAtLWdpdCBhL2ZzL2V4dDIvc3VwZXIuYyBiL2ZzL2V4dDIvc3VwZXIuYwppbmRleCBlMGM2MzgwLi43NzMxNjk1IDEwMDY0NAotLS0gYS9mcy9leHQyL3N1cGVyLmMKKysrIGIvZnMvZXh0Mi9zdXBlci5jCkBAIC00Myw5ICs0MywxMCBAQAogc3RhdGljIGludCBleHQyX3N0YXRmcyAoc3RydWN0IGRlbnRyeSAqIGRlbnRyeSwgc3RydWN0IGtzdGF0ZnMgKiBidWYpOwogc3RhdGljIGludCBleHQyX3N5bmNfZnMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IHdhaXQpOwogCi12b2lkIGV4dDJfZXJyb3IgKHN0cnVjdCBzdXBlcl9ibG9jayAqIHNiLCBjb25zdCBjaGFyICogZnVuY3Rpb24sCi0JCSBjb25zdCBjaGFyICogZm10LCAuLi4pCit2b2lkIGV4dDJfZXJyb3Ioc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgY29uc3QgY2hhciAqZnVuY3Rpb24sCisJCWNvbnN0IGNoYXIgKmZtdCwgLi4uKQogeworCXN0cnVjdCB2YV9mb3JtYXQgdmFmOwogCXZhX2xpc3QgYXJnczsKIAlzdHJ1Y3QgZXh0Ml9zYl9pbmZvICpzYmkgPSBFWFQyX1NCKHNiKTsKIAlzdHJ1Y3QgZXh0Ml9zdXBlcl9ibG9jayAqZXMgPSBzYmktPnNfZXM7CkBAIC01OSw5ICs2MCwxMyBAQAogCX0KIAogCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7Ci0JcHJpbnRrKEtFUk5fQ1JJVCAiRVhUMi1mcyAoJXMpOiBlcnJvcjogJXM6ICIsIHNiLT5zX2lkLCBmdW5jdGlvbik7Ci0JdnByaW50ayhmbXQsIGFyZ3MpOwotCXByaW50aygiXG4iKTsKKworCXZhZi5mbXQgPSBmbXQ7CisJdmFmLnZhID0gJmFyZ3M7CisKKwlwcmludGsoS0VSTl9DUklUICJFWFQyLWZzICglcyk6IGVycm9yOiAlczogJXBWXG4iLAorCSAgICAgICBzYi0+c19pZCwgZnVuY3Rpb24sICZ2YWYpOworCiAJdmFfZW5kKGFyZ3MpOwogCiAJaWYgKHRlc3Rfb3B0KHNiLCBFUlJPUlNfUEFOSUMpKQpAQCAtNzYsMTIgKzgxLDE2IEBACiB2b2lkIGV4dDJfbXNnKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGNvbnN0IGNoYXIgKnByZWZpeCwKIAkJY29uc3QgY2hhciAqZm10LCAuLi4pCiB7CisJc3RydWN0IHZhX2Zvcm1hdCB2YWY7CiAJdmFfbGlzdCBhcmdzOwogCiAJdmFfc3RhcnQoYXJncywgZm10KTsKLQlwcmludGsoIiVzRVhUMi1mcyAoJXMpOiAiLCBwcmVmaXgsIHNiLT5zX2lkKTsKLQl2cHJpbnRrKGZtdCwgYXJncyk7Ci0JcHJpbnRrKCJcbiIpOworCisJdmFmLmZtdCA9IGZtdDsKKwl2YWYudmEgPSAmYXJnczsKKworCXByaW50aygiJXNFWFQyLWZzICglcyk6ICVwVlxuIiwgcHJlZml4LCBzYi0+c19pZCwgJnZhZik7CisKIAl2YV9lbmQoYXJncyk7CiB9CiAKZGlmZiAtLWdpdCBhL2ZzL2V4dDIveGF0dHIuYyBiL2ZzL2V4dDIveGF0dHIuYwppbmRleCBmODQ3MDBiLi5jMmU0ZGNlIDEwMDY0NAotLS0gYS9mcy9leHQyL3hhdHRyLmMKKysrIGIvZnMvZXh0Mi94YXR0ci5jCkBAIC0xOTksMTQgKzE5OSw2IEBACiAJCQlnb3RvIGZvdW5kOwogCQllbnRyeSA9IG5leHQ7CiAJfQotCS8qIENoZWNrIHRoZSByZW1haW5pbmcgbmFtZSBlbnRyaWVzICovCi0Jd2hpbGUgKCFJU19MQVNUX0VOVFJZKGVudHJ5KSkgewotCQlzdHJ1Y3QgZXh0Ml94YXR0cl9lbnRyeSAqbmV4dCA9Ci0JCQlFWFQyX1hBVFRSX05FWFQoZW50cnkpOwotCQlpZiAoKGNoYXIgKiluZXh0ID49IGVuZCkKLQkJCWdvdG8gYmFkX2Jsb2NrOwotCQllbnRyeSA9IG5leHQ7Ci0JfQogCWlmIChleHQyX3hhdHRyX2NhY2hlX2luc2VydChiaCkpCiAJCWVhX2lkZWJ1Zyhpbm9kZSwgImNhY2hlIGluc2VydCBmYWlsZWQiKTsKIAllcnJvciA9IC1FTk9EQVRBOwpAQCAtMzU1LDcgKzM0Nyw3IEBACiAvKgogICogZXh0Ml94YXR0cl9zZXQoKQogICoKLSAqIENyZWF0ZSwgcmVwbGFjZSBvciByZW1vdmUgYW4gZXh0ZW5kZWQgYXR0cmlidXRlIGZvciB0aGlzIGlub2RlLiBCdWZmZXIKKyAqIENyZWF0ZSwgcmVwbGFjZSBvciByZW1vdmUgYW4gZXh0ZW5kZWQgYXR0cmlidXRlIGZvciB0aGlzIGlub2RlLiAgVmFsdWUKICAqIGlzIE5VTEwgdG8gcmVtb3ZlIGFuIGV4aXN0aW5nIGV4dGVuZGVkIGF0dHJpYnV0ZSwgYW5kIG5vbi1OVUxMIHRvCiAgKiBlaXRoZXIgcmVwbGFjZSBhbiBleGlzdGluZyBleHRlbmRlZCBhdHRyaWJ1dGUsIG9yIGNyZWF0ZSBhIG5ldyBleHRlbmRlZAogICogYXR0cmlidXRlLiBUaGUgZmxhZ3MgWEFUVFJfUkVQTEFDRSBhbmQgWEFUVFJfQ1JFQVRFCmRpZmYgLS1naXQgYS9mcy9leHQzL2JhbGxvYy5jIGIvZnMvZXh0My9iYWxsb2MuYwppbmRleCBiM2RiMjI2Li4wNDU5OTVjIDEwMDY0NAotLS0gYS9mcy9leHQzL2JhbGxvYy5jCisrKyBiL2ZzL2V4dDMvYmFsbG9jLmMKQEAgLTIwLDYgKzIwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9leHQzX2piZC5oPgogI2luY2x1ZGUgPGxpbnV4L3F1b3Rhb3BzLmg+CiAjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KIAogLyoKICAqIGJhbGxvYy5jIGNvbnRhaW5zIHRoZSBibG9ja3MgYWxsb2NhdGlvbiBhbmQgZGVhbGxvY2F0aW9uIHJvdXRpbmVzCkBAIC0zOSw2ICs0MCwyMSBAQAogCiAjZGVmaW5lIGluX3JhbmdlKGIsIGZpcnN0LCBsZW4pCSgoYikgPj0gKGZpcnN0KSAmJiAoYikgPD0gKGZpcnN0KSArIChsZW4pIC0gMSkKIAorLyoKKyAqIENhbGN1bGF0ZSB0aGUgYmxvY2sgZ3JvdXAgbnVtYmVyIGFuZCBvZmZzZXQsIGdpdmVuIGEgYmxvY2sgbnVtYmVyCisgKi8KK3N0YXRpYyB2b2lkIGV4dDNfZ2V0X2dyb3VwX25vX2FuZF9vZmZzZXQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwlleHQzX2ZzYmxrX3QgYmxvY2tuciwgdW5zaWduZWQgbG9uZyAqYmxvY2tncnBwLCBleHQzX2dycGJsa190ICpvZmZzZXRwKQoreworCXN0cnVjdCBleHQzX3N1cGVyX2Jsb2NrICplcyA9IEVYVDNfU0Ioc2IpLT5zX2VzOworCisJYmxvY2tuciA9IGJsb2NrbnIgLSBsZTMyX3RvX2NwdShlcy0+c19maXJzdF9kYXRhX2Jsb2NrKTsKKwlpZiAob2Zmc2V0cCkKKwkJKm9mZnNldHAgPSBibG9ja25yICUgRVhUM19CTE9DS1NfUEVSX0dST1VQKHNiKTsKKwlpZiAoYmxvY2tncnBwKQorCQkqYmxvY2tncnBwID0gYmxvY2tuciAvIEVYVDNfQkxPQ0tTX1BFUl9HUk9VUChzYik7Cit9CisKIC8qKgogICogZXh0M19nZXRfZ3JvdXBfZGVzYygpIC0tIGxvYWQgZ3JvdXAgZGVzY3JpcHRvciBmcm9tIGRpc2sKICAqIEBzYjoJCQlzdXBlciBibG9jawpAQCAtMTg4NSwzICsxOTAxLDI1MyBAQAogCXJldHVybiBleHQzX2JnX251bV9nZGJfbWV0YShzYixncm91cCk7CiAKIH0KKworLyoqCisgKiBleHQzX3RyaW1fYWxsX2ZyZWUgLS0gZnVuY3Rpb24gdG8gdHJpbSBhbGwgZnJlZSBzcGFjZSBpbiBhbGxvYy4gZ3JvdXAKKyAqIEBzYjoJCQlzdXBlciBibG9jayBmb3IgZmlsZSBzeXN0ZW0KKyAqIEBncm91cDoJCWFsbG9jYXRpb24gZ3JvdXAgdG8gdHJpbQorICogQHN0YXJ0OgkJZmlyc3QgZ3JvdXAgYmxvY2sgdG8gZXhhbWluZQorICogQG1heDoJCWxhc3QgZ3JvdXAgYmxvY2sgdG8gZXhhbWluZQorICogQGdkcDoJCWFsbG9jYXRpb24gZ3JvdXAgZGVzY3JpcHRpb24gc3RydWN0dXJlCisgKiBAbWluYmxvY2tzOgkJbWluaW11bSBleHRlbnQgYmxvY2sgY291bnQKKyAqCisgKiBleHQzX3RyaW1fYWxsX2ZyZWUgd2Fsa3MgdGhyb3VnaCBncm91cCdzIGJsb2NrIGJpdG1hcCBzZWFyY2hpbmcgZm9yIGZyZWUKKyAqIGJsb2Nrcy4gV2hlbiB0aGUgZnJlZSBibG9jayBpcyBmb3VuZCwgaXQgdHJpZXMgdG8gYWxsb2NhdGUgdGhpcyBibG9jayBhbmQKKyAqIGNvbnNlcXVlbnQgZnJlZSBibG9jayB0byBnZXQgdGhlIGJpZ2dlc3QgZnJlZSBleHRlbnQgcG9zc2libGUsIHVudGlsIGl0CisgKiByZWFjaGVzIGFueSB1c2VkIGJsb2NrLiBUaGVuIGlzc3VlIGEgVFJJTSBjb21tYW5kIG9uIHRoaXMgZXh0ZW50IGFuZCBmcmVlCisgKiB0aGUgZXh0ZW50IGluIHRoZSBibG9jayBiaXRtYXAuIFRoaXMgaXMgZG9uZSB1bnRpbCB3aG9sZSBncm91cCBpcyBzY2FubmVkLgorICovCitleHQzX2dycGJsa190IGV4dDNfdHJpbV9hbGxfZnJlZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB1bnNpZ25lZCBpbnQgZ3JvdXAsCisJCQkJZXh0M19ncnBibGtfdCBzdGFydCwgZXh0M19ncnBibGtfdCBtYXgsCisJCQkJZXh0M19ncnBibGtfdCBtaW5ibG9ja3MpCit7CisJaGFuZGxlX3QgKmhhbmRsZTsKKwlleHQzX2dycGJsa190IG5leHQsIGZyZWVfYmxvY2tzLCBiaXQsIGZyZWVkLCBjb3VudCA9IDA7CisJZXh0M19mc2Jsa190IGRpc2NhcmRfYmxvY2s7CisJc3RydWN0IGV4dDNfc2JfaW5mbyAqc2JpOworCXN0cnVjdCBidWZmZXJfaGVhZCAqZ2RwX2JoLCAqYml0bWFwX2JoID0gTlVMTDsKKwlzdHJ1Y3QgZXh0M19ncm91cF9kZXNjICpnZHA7CisJaW50IGVyciA9IDAsIHJldCA9IDA7CisKKwkvKgorCSAqIFdlIHdpbGwgdXBkYXRlIG9uZSBibG9jayBiaXRtYXAsIGFuZCBvbmUgZ3JvdXAgZGVzY3JpcHRvcgorCSAqLworCWhhbmRsZSA9IGV4dDNfam91cm5hbF9zdGFydF9zYihzYiwgMik7CisJaWYgKElTX0VSUihoYW5kbGUpKQorCQlyZXR1cm4gUFRSX0VSUihoYW5kbGUpOworCisJYml0bWFwX2JoID0gcmVhZF9ibG9ja19iaXRtYXAoc2IsIGdyb3VwKTsKKwlpZiAoIWJpdG1hcF9iaCkgeworCQllcnIgPSAtRUlPOworCQlnb3RvIGVycl9vdXQ7CisJfQorCisJQlVGRkVSX1RSQUNFKGJpdG1hcF9iaCwgImdldHRpbmcgdW5kbyBhY2Nlc3MiKTsKKwllcnIgPSBleHQzX2pvdXJuYWxfZ2V0X3VuZG9fYWNjZXNzKGhhbmRsZSwgYml0bWFwX2JoKTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycl9vdXQ7CisKKwlnZHAgPSBleHQzX2dldF9ncm91cF9kZXNjKHNiLCBncm91cCwgJmdkcF9iaCk7CisJaWYgKCFnZHApIHsKKwkJZXJyID0gLUVJTzsKKwkJZ290byBlcnJfb3V0OworCX0KKworCUJVRkZFUl9UUkFDRShnZHBfYmgsICJnZXRfd3JpdGVfYWNjZXNzIik7CisJZXJyID0gZXh0M19qb3VybmFsX2dldF93cml0ZV9hY2Nlc3MoaGFuZGxlLCBnZHBfYmgpOworCWlmIChlcnIpCisJCWdvdG8gZXJyX291dDsKKworCWZyZWVfYmxvY2tzID0gbGUxNl90b19jcHUoZ2RwLT5iZ19mcmVlX2Jsb2Nrc19jb3VudCk7CisJc2JpID0gRVhUM19TQihzYik7CisKKwkgLyogV2FsayB0aHJvdWdoIHRoZSB3aG9sZSBncm91cCAqLworCXdoaWxlIChzdGFydCA8IG1heCkgeworCQlzdGFydCA9IGJpdG1hcF9zZWFyY2hfbmV4dF91c2FibGVfYmxvY2soc3RhcnQsIGJpdG1hcF9iaCwgbWF4KTsKKwkJaWYgKHN0YXJ0IDwgMCkKKwkJCWJyZWFrOworCQluZXh0ID0gc3RhcnQ7CisKKwkJLyoKKwkJICogQWxsb2NhdGUgY29udGlndW91cyBmcmVlIGV4dGVudHMgYnkgc2V0dGluZyBiaXRzIGluIHRoZQorCQkgKiBibG9jayBiaXRtYXAKKwkJICovCisJCXdoaWxlIChuZXh0IDwgbWF4CisJCQkmJiBjbGFpbV9ibG9jayhzYl9iZ2xfbG9jayhzYmksIGdyb3VwKSwKKwkJCQkJbmV4dCwgYml0bWFwX2JoKSkgeworCQkJbmV4dCsrOworCQl9CisKKwkJIC8qIFdlIGRpZCBub3QgY2xhaW0gYW55IGJsb2NrcyAqLworCQlpZiAobmV4dCA9PSBzdGFydCkKKwkJCWNvbnRpbnVlOworCisJCWRpc2NhcmRfYmxvY2sgPSAoZXh0M19mc2Jsa190KXN0YXJ0ICsKKwkJCQlleHQzX2dyb3VwX2ZpcnN0X2Jsb2NrX25vKHNiLCBncm91cCk7CisKKwkJLyogVXBkYXRlIGNvdW50ZXJzICovCisJCXNwaW5fbG9jayhzYl9iZ2xfbG9jayhzYmksIGdyb3VwKSk7CisJCWxlMTZfYWRkX2NwdSgmZ2RwLT5iZ19mcmVlX2Jsb2Nrc19jb3VudCwgc3RhcnQgLSBuZXh0KTsKKwkJc3Bpbl91bmxvY2soc2JfYmdsX2xvY2soc2JpLCBncm91cCkpOworCQlwZXJjcHVfY291bnRlcl9zdWIoJnNiaS0+c19mcmVlYmxvY2tzX2NvdW50ZXIsIG5leHQgLSBzdGFydCk7CisKKwkJLyogRG8gbm90IGlzc3VlIGEgVFJJTSBvbiBleHRlbnRzIHNtYWxsZXIgdGhhbiBtaW5ibG9ja3MgKi8KKwkJaWYgKChuZXh0IC0gc3RhcnQpIDwgbWluYmxvY2tzKQorCQkJZ290byBmcmVlX2V4dGVudDsKKworCQkgLyogU2VuZCB0aGUgVFJJTSBjb21tYW5kIGRvd24gdG8gdGhlIGRldmljZSAqLworCQllcnIgPSBzYl9pc3N1ZV9kaXNjYXJkKHNiLCBkaXNjYXJkX2Jsb2NrLCBuZXh0IC0gc3RhcnQsCisJCQkJICAgICAgIEdGUF9OT0ZTLCAwKTsKKwkJY291bnQgKz0gKG5leHQgLSBzdGFydCk7CitmcmVlX2V4dGVudDoKKwkJZnJlZWQgPSAwOworCisJCS8qCisJCSAqIENsZWFyIGJpdHMgaW4gdGhlIGJpdG1hcAorCQkgKi8KKwkJZm9yIChiaXQgPSBzdGFydDsgYml0IDwgbmV4dDsgYml0KyspIHsKKwkJCUJVRkZFUl9UUkFDRShiaXRtYXBfYmgsICJjbGVhciBiaXQiKTsKKwkJCWlmICghZXh0M19jbGVhcl9iaXRfYXRvbWljKHNiX2JnbF9sb2NrKHNiaSwgZ3JvdXApLAorCQkJCQkJYml0LCBiaXRtYXBfYmgtPmJfZGF0YSkpIHsKKwkJCQlleHQzX2Vycm9yKHNiLCBfX2Z1bmNfXywKKwkJCQkJImJpdCBhbHJlYWR5IGNsZWFyZWQgZm9yIGJsb2NrICJFM0ZTQkxLLAorCQkJCQkgKHVuc2lnbmVkIGxvbmcpYml0KTsKKwkJCQlCVUZGRVJfVFJBQ0UoYml0bWFwX2JoLCAiYml0IGFscmVhZHkgY2xlYXJlZCIpOworCQkJfSBlbHNlIHsKKwkJCQlmcmVlZCsrOworCQkJfQorCQl9CisKKwkJLyogVXBkYXRlIGNvdXRlcnMgKi8KKwkJc3Bpbl9sb2NrKHNiX2JnbF9sb2NrKHNiaSwgZ3JvdXApKTsKKwkJbGUxNl9hZGRfY3B1KCZnZHAtPmJnX2ZyZWVfYmxvY2tzX2NvdW50LCBmcmVlZCk7CisJCXNwaW5fdW5sb2NrKHNiX2JnbF9sb2NrKHNiaSwgZ3JvdXApKTsKKwkJcGVyY3B1X2NvdW50ZXJfYWRkKCZzYmktPnNfZnJlZWJsb2Nrc19jb3VudGVyLCBmcmVlZCk7CisKKwkJc3RhcnQgPSBuZXh0OworCQlpZiAoZXJyIDwgMCkgeworCQkJaWYgKGVyciAhPSAtRU9QTk9UU1VQUCkKKwkJCQlleHQzX3dhcm5pbmcoc2IsIF9fZnVuY19fLCAiRGlzY2FyZCBjb21tYW5kICIKKwkJCQkJICAgICAicmV0dXJuZWQgZXJyb3IgJWRcbiIsIGVycik7CisJCQlicmVhazsKKwkJfQorCisJCWlmIChmYXRhbF9zaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJZXJyID0gLUVSRVNUQVJUU1lTOworCQkJYnJlYWs7CisJCX0KKworCQljb25kX3Jlc2NoZWQoKTsKKworCQkvKiBObyBtb3JlIHN1aXRhYmxlIGV4dGVudHMgKi8KKwkJaWYgKChmcmVlX2Jsb2NrcyAtIGNvdW50KSA8IG1pbmJsb2NrcykKKwkJCWJyZWFrOworCX0KKworCS8qIFdlIGRpcnRpZWQgdGhlIGJpdG1hcCBibG9jayAqLworCUJVRkZFUl9UUkFDRShiaXRtYXBfYmgsICJkaXJ0aWVkIGJpdG1hcCBibG9jayIpOworCXJldCA9IGV4dDNfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGJpdG1hcF9iaCk7CisJaWYgKCFlcnIpCisJCWVyciA9IHJldDsKKworCS8qIEFuZCB0aGUgZ3JvdXAgZGVzY3JpcHRvciBibG9jayAqLworCUJVRkZFUl9UUkFDRShnZHBfYmgsICJkaXJ0aWVkIGdyb3VwIGRlc2NyaXB0b3IgYmxvY2siKTsKKwlyZXQgPSBleHQzX2pvdXJuYWxfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBnZHBfYmgpOworCWlmICghZXJyKQorCQllcnIgPSByZXQ7CisKKwlleHQzX2RlYnVnKCJ0cmltbWVkICVkIGJsb2NrcyBpbiB0aGUgZ3JvdXAgJWRcbiIsCisJCWNvdW50LCBncm91cCk7CisKK2Vycl9vdXQ6CisJaWYgKGVycikKKwkJY291bnQgPSBlcnI7CisJZXh0M19qb3VybmFsX3N0b3AoaGFuZGxlKTsKKwlicmVsc2UoYml0bWFwX2JoKTsKKworCXJldHVybiBjb3VudDsKK30KKworLyoqCisgKiBleHQzX3RyaW1fZnMoKSAtLSB0cmltIGlvY3RsIGhhbmRsZSBmdW5jdGlvbgorICogQHNiOgkJCXN1cGVyYmxvY2sgZm9yIGZpbGVzeXN0ZW0KKyAqIEBzdGFydDoJCUZpcnN0IEJ5dGUgdG8gdHJpbQorICogQGxlbjoJCW51bWJlciBvZiBCeXRlcyB0byB0cmltIGZyb20gc3RhcnQKKyAqIEBtaW5sZW46CQltaW5pbXVtIGV4dGVudCBsZW5ndGggaW4gQnl0ZXMKKyAqCisgKiBleHQzX3RyaW1fZnMgZ29lcyB0aHJvdWdoIGFsbCBhbGxvY2F0aW9uIGdyb3VwcyBjb250YWluaW5nIEJ5dGVzIGZyb20KKyAqIHN0YXJ0IHRvIHN0YXJ0K2xlbi4gRm9yIGVhY2ggc3VjaCBhIGdyb3VwIGV4dDNfdHJpbV9hbGxfZnJlZSBmdW5jdGlvbgorICogaXMgaW52b2tlZCB0byB0cmltIGFsbCBmcmVlIHNwYWNlLgorICovCitpbnQgZXh0M190cmltX2ZzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBmc3RyaW1fcmFuZ2UgKnJhbmdlKQoreworCWV4dDNfZ3JwYmxrX3QgbGFzdF9ibG9jaywgZmlyc3RfYmxvY2ssIGZyZWVfYmxvY2tzOworCXVuc2lnbmVkIGxvbmcgZmlyc3RfZ3JvdXAsIGxhc3RfZ3JvdXA7CisJdW5zaWduZWQgbG9uZyBncm91cCwgbmdyb3VwczsKKwlzdHJ1Y3QgZXh0M19ncm91cF9kZXNjICpnZHA7CisJc3RydWN0IGV4dDNfc3VwZXJfYmxvY2sgKmVzID0gRVhUM19TQihzYiktPnNfZXM7CisJdWludDY0X3Qgc3RhcnQsIGxlbiwgbWlubGVuLCB0cmltbWVkOworCWV4dDNfZnNibGtfdCBtYXhfYmxrcyA9IGxlMzJfdG9fY3B1KGVzLT5zX2Jsb2Nrc19jb3VudCk7CisJaW50IHJldCA9IDA7CisKKwlzdGFydCA9IHJhbmdlLT5zdGFydCA+PiBzYi0+c19ibG9ja3NpemVfYml0czsKKwlsZW4gPSByYW5nZS0+bGVuID4+IHNiLT5zX2Jsb2Nrc2l6ZV9iaXRzOworCW1pbmxlbiA9IHJhbmdlLT5taW5sZW4gPj4gc2ItPnNfYmxvY2tzaXplX2JpdHM7CisJdHJpbW1lZCA9IDA7CisKKwlpZiAodW5saWtlbHkobWlubGVuID4gRVhUM19CTE9DS1NfUEVSX0dST1VQKHNiKSkpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChzdGFydCA+PSBtYXhfYmxrcykKKwkJZ290byBvdXQ7CisJaWYgKHN0YXJ0IDwgbGUzMl90b19jcHUoZXMtPnNfZmlyc3RfZGF0YV9ibG9jaykpIHsKKwkJbGVuIC09IGxlMzJfdG9fY3B1KGVzLT5zX2ZpcnN0X2RhdGFfYmxvY2spIC0gc3RhcnQ7CisJCXN0YXJ0ID0gbGUzMl90b19jcHUoZXMtPnNfZmlyc3RfZGF0YV9ibG9jayk7CisJfQorCWlmIChzdGFydCArIGxlbiA+IG1heF9ibGtzKQorCQlsZW4gPSBtYXhfYmxrcyAtIHN0YXJ0OworCisJbmdyb3VwcyA9IEVYVDNfU0Ioc2IpLT5zX2dyb3Vwc19jb3VudDsKKwlzbXBfcm1iKCk7CisKKwkvKiBEZXRlcm1pbmUgZmlyc3QgYW5kIGxhc3QgZ3JvdXAgdG8gZXhhbWluZSBiYXNlZCBvbiBzdGFydCBhbmQgbGVuICovCisJZXh0M19nZXRfZ3JvdXBfbm9fYW5kX29mZnNldChzYiwgKGV4dDNfZnNibGtfdCkgc3RhcnQsCisJCQkJICAgICAmZmlyc3RfZ3JvdXAsICZmaXJzdF9ibG9jayk7CisJZXh0M19nZXRfZ3JvdXBfbm9fYW5kX29mZnNldChzYiwgKGV4dDNfZnNibGtfdCkgKHN0YXJ0ICsgbGVuKSwKKwkJCQkgICAgICZsYXN0X2dyb3VwLCAmbGFzdF9ibG9jayk7CisJbGFzdF9ncm91cCA9IChsYXN0X2dyb3VwID4gbmdyb3VwcyAtIDEpID8gbmdyb3VwcyAtIDEgOiBsYXN0X2dyb3VwOworCWxhc3RfYmxvY2sgPSBFWFQzX0JMT0NLU19QRVJfR1JPVVAoc2IpOworCisJaWYgKGZpcnN0X2dyb3VwID4gbGFzdF9ncm91cCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlmb3IgKGdyb3VwID0gZmlyc3RfZ3JvdXA7IGdyb3VwIDw9IGxhc3RfZ3JvdXA7IGdyb3VwKyspIHsKKwkJZ2RwID0gZXh0M19nZXRfZ3JvdXBfZGVzYyhzYiwgZ3JvdXAsIE5VTEwpOworCQlpZiAoIWdkcCkKKwkJCWJyZWFrOworCisJCWZyZWVfYmxvY2tzID0gbGUxNl90b19jcHUoZ2RwLT5iZ19mcmVlX2Jsb2Nrc19jb3VudCk7CisJCWlmIChmcmVlX2Jsb2NrcyA8IG1pbmxlbikKKwkJCWNvbnRpbnVlOworCisJCWlmIChsZW4gPj0gRVhUM19CTE9DS1NfUEVSX0dST1VQKHNiKSkKKwkJCWxlbiAtPSAoRVhUM19CTE9DS1NfUEVSX0dST1VQKHNiKSAtIGZpcnN0X2Jsb2NrKTsKKwkJZWxzZQorCQkJbGFzdF9ibG9jayA9IGZpcnN0X2Jsb2NrICsgbGVuOworCisJCXJldCA9IGV4dDNfdHJpbV9hbGxfZnJlZShzYiwgZ3JvdXAsIGZpcnN0X2Jsb2NrLAorCQkJCQlsYXN0X2Jsb2NrLCBtaW5sZW4pOworCQlpZiAocmV0IDwgMCkKKwkJCWJyZWFrOworCisJCXRyaW1tZWQgKz0gcmV0OworCQlmaXJzdF9ibG9jayA9IDA7CisJfQorCisJaWYgKHJldCA+PSAwKQorCQlyZXQgPSAwOworCitvdXQ6CisJcmFuZ2UtPmxlbiA9IHRyaW1tZWQgKiBzYi0+c19ibG9ja3NpemU7CisKKwlyZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvZnMvZXh0My9kaXIuYyBiL2ZzL2V4dDMvZGlyLmMKaW5kZXggZTJlNzJjMy4uMzRmMGEwNyAxMDA2NDQKLS0tIGEvZnMvZXh0My9kaXIuYworKysgYi9mcy9leHQzL2Rpci5jCkBAIC02OSwyNSArNjksMjYgQEAKIAljb25zdCBjaGFyICogZXJyb3JfbXNnID0gTlVMTDsKIAljb25zdCBpbnQgcmxlbiA9IGV4dDNfcmVjX2xlbl9mcm9tX2Rpc2soZGUtPnJlY19sZW4pOwogCi0JaWYgKHJsZW4gPCBFWFQzX0RJUl9SRUNfTEVOKDEpKQorCWlmICh1bmxpa2VseShybGVuIDwgRVhUM19ESVJfUkVDX0xFTigxKSkpCiAJCWVycm9yX21zZyA9ICJyZWNfbGVuIGlzIHNtYWxsZXIgdGhhbiBtaW5pbWFsIjsKLQllbHNlIGlmIChybGVuICUgNCAhPSAwKQorCWVsc2UgaWYgKHVubGlrZWx5KHJsZW4gJSA0ICE9IDApKQogCQllcnJvcl9tc2cgPSAicmVjX2xlbiAlIDQgIT0gMCI7Ci0JZWxzZSBpZiAocmxlbiA8IEVYVDNfRElSX1JFQ19MRU4oZGUtPm5hbWVfbGVuKSkKKwllbHNlIGlmICh1bmxpa2VseShybGVuIDwgRVhUM19ESVJfUkVDX0xFTihkZS0+bmFtZV9sZW4pKSkKIAkJZXJyb3JfbXNnID0gInJlY19sZW4gaXMgdG9vIHNtYWxsIGZvciBuYW1lX2xlbiI7Ci0JZWxzZSBpZiAoKChjaGFyICopIGRlIC0gYmgtPmJfZGF0YSkgKyBybGVuID4gZGlyLT5pX3NiLT5zX2Jsb2Nrc2l6ZSkKKwllbHNlIGlmICh1bmxpa2VseSgoKChjaGFyICopIGRlIC0gYmgtPmJfZGF0YSkgKyBybGVuID4gZGlyLT5pX3NiLT5zX2Jsb2Nrc2l6ZSkpKQogCQllcnJvcl9tc2cgPSAiZGlyZWN0b3J5IGVudHJ5IGFjcm9zcyBibG9ja3MiOwotCWVsc2UgaWYgKGxlMzJfdG9fY3B1KGRlLT5pbm9kZSkgPgotCQkJbGUzMl90b19jcHUoRVhUM19TQihkaXItPmlfc2IpLT5zX2VzLT5zX2lub2Rlc19jb3VudCkpCisJZWxzZSBpZiAodW5saWtlbHkobGUzMl90b19jcHUoZGUtPmlub2RlKSA+CisJCQlsZTMyX3RvX2NwdShFWFQzX1NCKGRpci0+aV9zYiktPnNfZXMtPnNfaW5vZGVzX2NvdW50KSkpCiAJCWVycm9yX21zZyA9ICJpbm9kZSBvdXQgb2YgYm91bmRzIjsKIAotCWlmIChlcnJvcl9tc2cgIT0gTlVMTCkKKwlpZiAodW5saWtlbHkoZXJyb3JfbXNnICE9IE5VTEwpKQogCQlleHQzX2Vycm9yIChkaXItPmlfc2IsIGZ1bmN0aW9uLAogCQkJImJhZCBlbnRyeSBpbiBkaXJlY3RvcnkgIyVsdTogJXMgLSAiCiAJCQkib2Zmc2V0PSVsdSwgaW5vZGU9JWx1LCByZWNfbGVuPSVkLCBuYW1lX2xlbj0lZCIsCiAJCQlkaXItPmlfaW5vLCBlcnJvcl9tc2csIG9mZnNldCwKIAkJCSh1bnNpZ25lZCBsb25nKSBsZTMyX3RvX2NwdShkZS0+aW5vZGUpLAogCQkJcmxlbiwgZGUtPm5hbWVfbGVuKTsKKwogCXJldHVybiBlcnJvcl9tc2cgPT0gTlVMTCA/IDEgOiAwOwogfQogCmRpZmYgLS1naXQgYS9mcy9leHQzL2lub2RlLmMgYi9mcy9leHQzL2lub2RlLmMKaW5kZXggYTk1ODA2MS4uYWU5NGY2ZCAxMDA2NDQKLS0tIGEvZnMvZXh0My9pbm9kZS5jCisrKyBiL2ZzL2V4dDMvaW5vZGUuYwpAQCAtMjE0NSwxMyArMjE0NSwxNSBAQAogCWlmICh0cnlfdG9fZXh0ZW5kX3RyYW5zYWN0aW9uKGhhbmRsZSwgaW5vZGUpKSB7CiAJCWlmIChiaCkgewogCQkJQlVGRkVSX1RSQUNFKGJoLCAiY2FsbCBleHQzX2pvdXJuYWxfZGlydHlfbWV0YWRhdGEiKTsKLQkJCWV4dDNfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGJoKTsKKwkJCWlmIChleHQzX2pvdXJuYWxfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBiaCkpCisJCQkJcmV0dXJuOwogCQl9CiAJCWV4dDNfbWFya19pbm9kZV9kaXJ0eShoYW5kbGUsIGlub2RlKTsKIAkJdHJ1bmNhdGVfcmVzdGFydF90cmFuc2FjdGlvbihoYW5kbGUsIGlub2RlKTsKIAkJaWYgKGJoKSB7CiAJCQlCVUZGRVJfVFJBQ0UoYmgsICJyZXRha2luZyB3cml0ZSBhY2Nlc3MiKTsKLQkJCWV4dDNfam91cm5hbF9nZXRfd3JpdGVfYWNjZXNzKGhhbmRsZSwgYmgpOworCQkJaWYgKGV4dDNfam91cm5hbF9nZXRfd3JpdGVfYWNjZXNzKGhhbmRsZSwgYmgpKQorCQkJCXJldHVybjsKIAkJfQogCX0KIApkaWZmIC0tZ2l0IGEvZnMvZXh0My9pb2N0bC5jIGIvZnMvZXh0My9pb2N0bC5jCmluZGV4IDg4OTc0ODEuLmZjMDgwZGQgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDMvaW9jdGwuYworKysgYi9mcy9leHQzL2lvY3RsLmMKQEAgLTI3Niw3ICsyNzYsMjkgQEAKIAkJbW50X2Ryb3Bfd3JpdGUoZmlscC0+Zl9wYXRoLm1udCk7CiAJCXJldHVybiBlcnI7CiAJfQorCWNhc2UgRklUUklNOiB7CiAKKwkJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlub2RlLT5pX3NiOworCQlzdHJ1Y3QgZnN0cmltX3JhbmdlIHJhbmdlOworCQlpbnQgcmV0ID0gMDsKKworCQlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCisJCQlyZXR1cm4gLUVQRVJNOworCisJCWlmIChjb3B5X2Zyb21fdXNlcigmcmFuZ2UsIChzdHJ1Y3QgZnN0cmltX3JhbmdlICopYXJnLAorCQkJCSAgIHNpemVvZihyYW5nZSkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJcmV0ID0gZXh0M190cmltX2ZzKHNiLCAmcmFuZ2UpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisKKwkJaWYgKGNvcHlfdG9fdXNlcigoc3RydWN0IGZzdHJpbV9yYW5nZSAqKWFyZywgJnJhbmdlLAorCQkJCSBzaXplb2YocmFuZ2UpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCXJldHVybiAwOworCX0KIAogCWRlZmF1bHQ6CiAJCXJldHVybiAtRU5PVFRZOwpkaWZmIC0tZ2l0IGEvZnMvZXh0My9uYW1laS5jIGIvZnMvZXh0My9uYW1laS5jCmluZGV4IGJjZTlkY2UuLmIyN2JhNzEgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDMvbmFtZWkuYworKysgYi9mcy9leHQzL25hbWVpLmMKQEAgLTg1OCw2ICs4NTgsNyBAQAogCXN0cnVjdCBidWZmZXJfaGVhZCAqIGJoX3VzZVtOQU1FSV9SQV9TSVpFXTsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaCwgKnJldCA9IE5VTEw7CiAJdW5zaWduZWQgbG9uZyBzdGFydCwgYmxvY2ssIGI7CisJY29uc3QgdTggKm5hbWUgPSBlbnRyeS0+bmFtZTsKIAlpbnQgcmFfbWF4ID0gMDsJCS8qIE51bWJlciBvZiBiaCdzIGluIHRoZSByZWFkYWhlYWQKIAkJCQkgICBidWZmZXIsIGJoX3VzZVtdICovCiAJaW50IHJhX3B0ciA9IDA7CQkvKiBDdXJyZW50IGluZGV4IGludG8gcmVhZGFoZWFkCkBAIC04NzEsNiArODcyLDE2IEBACiAJbmFtZWxlbiA9IGVudHJ5LT5sZW47CiAJaWYgKG5hbWVsZW4gPiBFWFQzX05BTUVfTEVOKQogCQlyZXR1cm4gTlVMTDsKKwlpZiAoKG5hbWVsZW4gPD0gMikgJiYgKG5hbWVbMF0gPT0gJy4nKSAmJgorCSAgICAobmFtZVsxXSA9PSAnLicgfHwgbmFtZVsxXSA9PSAwKSkgeworCQkvKgorCQkgKiAiLiIgb3IgIi4uIiB3aWxsIG9ubHkgYmUgaW4gdGhlIGZpcnN0IGJsb2NrCisJCSAqIE5GUyBtYXkgbG9vayB1cCAiLi4iOyAiLiIgc2hvdWxkIGJlIGhhbmRsZWQgYnkgdGhlIFZGUworCQkgKi8KKwkJYmxvY2sgPSBzdGFydCA9IDA7CisJCW5ibG9ja3MgPSAxOworCQlnb3RvIHJlc3RhcnQ7CisJfQogCWlmIChpc19keChkaXIpKSB7CiAJCWJoID0gZXh0M19keF9maW5kX2VudHJ5KGRpciwgZW50cnksIHJlc19kaXIsICZlcnIpOwogCQkvKgpAQCAtOTYxLDU1ICs5NzIsMzUgQEAKIAkJCXN0cnVjdCBxc3RyICplbnRyeSwgc3RydWN0IGV4dDNfZGlyX2VudHJ5XzIgKipyZXNfZGlyLAogCQkJaW50ICplcnIpCiB7Ci0Jc3RydWN0IHN1cGVyX2Jsb2NrICogc2I7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGRpci0+aV9zYjsKIAlzdHJ1Y3QgZHhfaGFzaF9pbmZvCWhpbmZvOwotCXUzMiBoYXNoOwogCXN0cnVjdCBkeF9mcmFtZSBmcmFtZXNbMl0sICpmcmFtZTsKLQlzdHJ1Y3QgZXh0M19kaXJfZW50cnlfMiAqZGUsICp0b3A7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKIAl1bnNpZ25lZCBsb25nIGJsb2NrOwogCWludCByZXR2YWw7Ci0JaW50IG5hbWVsZW4gPSBlbnRyeS0+bGVuOwotCWNvbnN0IHU4ICpuYW1lID0gZW50cnktPm5hbWU7CiAKLQlzYiA9IGRpci0+aV9zYjsKLQkvKiBORlMgbWF5IGxvb2sgdXAgIi4uIiAtIGxvb2sgYXQgZHhfcm9vdCBkaXJlY3RvcnkgYmxvY2sgKi8KLQlpZiAobmFtZWxlbiA+IDIgfHwgbmFtZVswXSAhPSAnLid8fCAobmFtZWxlbiA9PSAyICYmIG5hbWVbMV0gIT0gJy4nKSkgewotCQlpZiAoIShmcmFtZSA9IGR4X3Byb2JlKGVudHJ5LCBkaXIsICZoaW5mbywgZnJhbWVzLCBlcnIpKSkKLQkJCXJldHVybiBOVUxMOwotCX0gZWxzZSB7Ci0JCWZyYW1lID0gZnJhbWVzOwotCQlmcmFtZS0+YmggPSBOVUxMOwkJCS8qIGZvciBkeF9yZWxlYXNlKCkgKi8KLQkJZnJhbWUtPmF0ID0gKHN0cnVjdCBkeF9lbnRyeSAqKWZyYW1lczsJLyogaGFjayBmb3IgemVybyBlbnRyeSovCi0JCWR4X3NldF9ibG9jayhmcmFtZS0+YXQsIDApOwkJLyogZHhfcm9vdCBibG9jayBpcyAwICovCi0JfQotCWhhc2ggPSBoaW5mby5oYXNoOworCWlmICghKGZyYW1lID0gZHhfcHJvYmUoZW50cnksIGRpciwgJmhpbmZvLCBmcmFtZXMsIGVycikpKQorCQlyZXR1cm4gTlVMTDsKIAlkbyB7CiAJCWJsb2NrID0gZHhfZ2V0X2Jsb2NrKGZyYW1lLT5hdCk7CiAJCWlmICghKGJoID0gZXh0M19icmVhZCAoTlVMTCxkaXIsIGJsb2NrLCAwLCBlcnIpKSkKIAkJCWdvdG8gZXJyb3V0OwotCQlkZSA9IChzdHJ1Y3QgZXh0M19kaXJfZW50cnlfMiAqKSBiaC0+Yl9kYXRhOwotCQl0b3AgPSAoc3RydWN0IGV4dDNfZGlyX2VudHJ5XzIgKikgKChjaGFyICopIGRlICsgc2ItPnNfYmxvY2tzaXplIC0KLQkJCQkgICAgICAgRVhUM19ESVJfUkVDX0xFTigwKSk7Ci0JCWZvciAoOyBkZSA8IHRvcDsgZGUgPSBleHQzX25leHRfZW50cnkoZGUpKSB7Ci0JCQlpbnQgb2ZmID0gKGJsb2NrIDw8IEVYVDNfQkxPQ0tfU0laRV9CSVRTKHNiKSkKLQkJCQkgICsgKChjaGFyICopIGRlIC0gYmgtPmJfZGF0YSk7CiAKLQkJCWlmICghZXh0M19jaGVja19kaXJfZW50cnkoX19mdW5jX18sIGRpciwgZGUsIGJoLCBvZmYpKSB7Ci0JCQkJYnJlbHNlKGJoKTsKLQkJCQkqZXJyID0gRVJSX0JBRF9EWF9ESVI7Ci0JCQkJZ290byBlcnJvdXQ7Ci0JCQl9Ci0KLQkJCWlmIChleHQzX21hdGNoKG5hbWVsZW4sIG5hbWUsIGRlKSkgewotCQkJCSpyZXNfZGlyID0gZGU7Ci0JCQkJZHhfcmVsZWFzZShmcmFtZXMpOwotCQkJCXJldHVybiBiaDsKLQkJCX0KKwkJcmV0dmFsID0gc2VhcmNoX2RpcmJsb2NrKGJoLCBkaXIsIGVudHJ5LAorCQkJCQkgYmxvY2sgPDwgRVhUM19CTE9DS19TSVpFX0JJVFMoc2IpLAorCQkJCQkgcmVzX2Rpcik7CisJCWlmIChyZXR2YWwgPT0gMSkgeworCQkJZHhfcmVsZWFzZShmcmFtZXMpOworCQkJcmV0dXJuIGJoOwogCQl9Ci0JCWJyZWxzZSAoYmgpOworCQlicmVsc2UoYmgpOworCQlpZiAocmV0dmFsID09IC0xKSB7CisJCQkqZXJyID0gRVJSX0JBRF9EWF9ESVI7CisJCQlnb3RvIGVycm91dDsKKwkJfQorCiAJCS8qIENoZWNrIHRvIHNlZSBpZiB3ZSBzaG91bGQgY29udGludWUgdG8gc2VhcmNoICovCi0JCXJldHZhbCA9IGV4dDNfaHRyZWVfbmV4dF9ibG9jayhkaXIsIGhhc2gsIGZyYW1lLAorCQlyZXR2YWwgPSBleHQzX2h0cmVlX25leHRfYmxvY2soZGlyLCBoaW5mby5oYXNoLCBmcmFtZSwKIAkJCQkJICAgICAgIGZyYW1lcywgTlVMTCk7CiAJCWlmIChyZXR2YWwgPCAwKSB7CiAJCQlleHQzX3dhcm5pbmcoc2IsIF9fZnVuY19fLApAQCAtMTA0Nyw3ICsxMDM4LDcgQEAKIAkJCXJldHVybiBFUlJfUFRSKC1FSU8pOwogCQl9CiAJCWlub2RlID0gZXh0M19pZ2V0KGRpci0+aV9zYiwgaW5vKTsKLQkJaWYgKHVubGlrZWx5KElTX0VSUihpbm9kZSkpKSB7CisJCWlmIChJU19FUlIoaW5vZGUpKSB7CiAJCQlpZiAoUFRSX0VSUihpbm9kZSkgPT0gLUVTVEFMRSkgewogCQkJCWV4dDNfZXJyb3IoZGlyLT5pX3NiLCBfX2Z1bmNfXywKIAkJCQkJCSJkZWxldGVkIGlub2RlIHJlZmVyZW5jZWQ6ICVsdSIsCkBAIC0xNjA3LDcgKzE1OTgsOSBAQAogCQkJaWYgKGVycikKIAkJCQlnb3RvIGpvdXJuYWxfZXJyb3I7CiAJCX0KLQkJZXh0M19qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgZnJhbWVzWzBdLmJoKTsKKwkJZXJyID0gZXh0M19qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgZnJhbWVzWzBdLmJoKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gam91cm5hbF9lcnJvcjsKIAl9CiAJZGUgPSBkb19zcGxpdChoYW5kbGUsIGRpciwgJmJoLCBmcmFtZSwgJmhpbmZvLCAmZXJyKTsKIAlpZiAoIWRlKQpAQCAtMTY0NCw4ICsxNjM3LDEzIEBACiAJCWlmICghZXh0M19jaGVja19kaXJfZW50cnkoImV4dDNfZGVsZXRlX2VudHJ5IiwgZGlyLCBkZSwgYmgsIGkpKQogCQkJcmV0dXJuIC1FSU87CiAJCWlmIChkZSA9PSBkZV9kZWwpICB7CisJCQlpbnQgZXJyOworCiAJCQlCVUZGRVJfVFJBQ0UoYmgsICJnZXRfd3JpdGVfYWNjZXNzIik7Ci0JCQlleHQzX2pvdXJuYWxfZ2V0X3dyaXRlX2FjY2VzcyhoYW5kbGUsIGJoKTsKKwkJCWVyciA9IGV4dDNfam91cm5hbF9nZXRfd3JpdGVfYWNjZXNzKGhhbmRsZSwgYmgpOworCQkJaWYgKGVycikKKwkJCQlnb3RvIGpvdXJuYWxfZXJyb3I7CisKIAkJCWlmIChwZGUpCiAJCQkJcGRlLT5yZWNfbGVuID0gZXh0M19yZWNfbGVuX3RvX2Rpc2soCiAJCQkJCWV4dDNfcmVjX2xlbl9mcm9tX2Rpc2socGRlLT5yZWNfbGVuKSArCkBAIC0xNjU0LDcgKzE2NTIsMTIgQEAKIAkJCQlkZS0+aW5vZGUgPSAwOwogCQkJZGlyLT5pX3ZlcnNpb24rKzsKIAkJCUJVRkZFUl9UUkFDRShiaCwgImNhbGwgZXh0M19qb3VybmFsX2RpcnR5X21ldGFkYXRhIik7Ci0JCQlleHQzX2pvdXJuYWxfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBiaCk7CisJCQllcnIgPSBleHQzX2pvdXJuYWxfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBiaCk7CisJCQlpZiAoZXJyKSB7Citqb3VybmFsX2Vycm9yOgorCQkJCWV4dDNfc3RkX2Vycm9yKGRpci0+aV9zYiwgZXJyKTsKKwkJCQlyZXR1cm4gZXJyOworCQkJfQogCQkJcmV0dXJuIDA7CiAJCX0KIAkJaSArPSBleHQzX3JlY19sZW5fZnJvbV9kaXNrKGRlLT5yZWNfbGVuKTsKQEAgLTE3NjIsNyArMTc2NSw3IEBACiB7CiAJaGFuZGxlX3QgKmhhbmRsZTsKIAlzdHJ1Y3QgaW5vZGUgKiBpbm9kZTsKLQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBkaXJfYmxvY2s7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICogZGlyX2Jsb2NrID0gTlVMTDsKIAlzdHJ1Y3QgZXh0M19kaXJfZW50cnlfMiAqIGRlOwogCWludCBlcnIsIHJldHJpZXMgPSAwOwogCkBAIC0xNzkwLDE1ICsxNzkzLDE0IEBACiAJaW5vZGUtPmlfZm9wID0gJmV4dDNfZGlyX29wZXJhdGlvbnM7CiAJaW5vZGUtPmlfc2l6ZSA9IEVYVDNfSShpbm9kZSktPmlfZGlza3NpemUgPSBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemU7CiAJZGlyX2Jsb2NrID0gZXh0M19icmVhZCAoaGFuZGxlLCBpbm9kZSwgMCwgMSwgJmVycik7Ci0JaWYgKCFkaXJfYmxvY2spIHsKLQkJZHJvcF9ubGluayhpbm9kZSk7IC8qIGlzIHRoaXMgbmxpbmsgPT0gMD8gKi8KLQkJdW5sb2NrX25ld19pbm9kZShpbm9kZSk7Ci0JCWV4dDNfbWFya19pbm9kZV9kaXJ0eShoYW5kbGUsIGlub2RlKTsKLQkJaXB1dCAoaW5vZGUpOwotCQlnb3RvIG91dF9zdG9wOwotCX0KKwlpZiAoIWRpcl9ibG9jaykKKwkJZ290byBvdXRfY2xlYXJfaW5vZGU7CisKIAlCVUZGRVJfVFJBQ0UoZGlyX2Jsb2NrLCAiZ2V0X3dyaXRlX2FjY2VzcyIpOwotCWV4dDNfam91cm5hbF9nZXRfd3JpdGVfYWNjZXNzKGhhbmRsZSwgZGlyX2Jsb2NrKTsKKwllcnIgPSBleHQzX2pvdXJuYWxfZ2V0X3dyaXRlX2FjY2VzcyhoYW5kbGUsIGRpcl9ibG9jayk7CisJaWYgKGVycikKKwkJZ290byBvdXRfY2xlYXJfaW5vZGU7CisKIAlkZSA9IChzdHJ1Y3QgZXh0M19kaXJfZW50cnlfMiAqKSBkaXJfYmxvY2stPmJfZGF0YTsKIAlkZS0+aW5vZGUgPSBjcHVfdG9fbGUzMihpbm9kZS0+aV9pbm8pOwogCWRlLT5uYW1lX2xlbiA9IDE7CkBAIC0xODE0LDExICsxODE2LDE2IEBACiAJZXh0M19zZXRfZGVfdHlwZShkaXItPmlfc2IsIGRlLCBTX0lGRElSKTsKIAlpbm9kZS0+aV9ubGluayA9IDI7CiAJQlVGRkVSX1RSQUNFKGRpcl9ibG9jaywgImNhbGwgZXh0M19qb3VybmFsX2RpcnR5X21ldGFkYXRhIik7Ci0JZXh0M19qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgZGlyX2Jsb2NrKTsKLQlicmVsc2UgKGRpcl9ibG9jayk7Ci0JZXh0M19tYXJrX2lub2RlX2RpcnR5KGhhbmRsZSwgaW5vZGUpOwotCWVyciA9IGV4dDNfYWRkX2VudHJ5IChoYW5kbGUsIGRlbnRyeSwgaW5vZGUpOworCWVyciA9IGV4dDNfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGRpcl9ibG9jayk7CisJaWYgKGVycikKKwkJZ290byBvdXRfY2xlYXJfaW5vZGU7CisKKwllcnIgPSBleHQzX21hcmtfaW5vZGVfZGlydHkoaGFuZGxlLCBpbm9kZSk7CisJaWYgKCFlcnIpCisJCWVyciA9IGV4dDNfYWRkX2VudHJ5IChoYW5kbGUsIGRlbnRyeSwgaW5vZGUpOworCiAJaWYgKGVycikgeworb3V0X2NsZWFyX2lub2RlOgogCQlpbm9kZS0+aV9ubGluayA9IDA7CiAJCXVubG9ja19uZXdfaW5vZGUoaW5vZGUpOwogCQlleHQzX21hcmtfaW5vZGVfZGlydHkoaGFuZGxlLCBpbm9kZSk7CkBAIC0xODI3LDEwICsxODM0LDE0IEBACiAJfQogCWluY19ubGluayhkaXIpOwogCWV4dDNfdXBkYXRlX2R4X2ZsYWcoZGlyKTsKLQlleHQzX21hcmtfaW5vZGVfZGlydHkoaGFuZGxlLCBkaXIpOworCWVyciA9IGV4dDNfbWFya19pbm9kZV9kaXJ0eShoYW5kbGUsIGRpcik7CisJaWYgKGVycikKKwkJZ290byBvdXRfY2xlYXJfaW5vZGU7CisKIAlkX2luc3RhbnRpYXRlKGRlbnRyeSwgaW5vZGUpOwogCXVubG9ja19uZXdfaW5vZGUoaW5vZGUpOwogb3V0X3N0b3A6CisJYnJlbHNlKGRpcl9ibG9jayk7CiAJZXh0M19qb3VybmFsX3N0b3AoaGFuZGxlKTsKIAlpZiAoZXJyID09IC1FTk9TUEMgJiYgZXh0M19zaG91bGRfcmV0cnlfYWxsb2MoZGlyLT5pX3NiLCAmcmV0cmllcykpCiAJCWdvdG8gcmV0cnk7CkBAIC0yMzUzLDcgKzIzNjQsOSBAQAogCQkJZ290byBlbmRfcmVuYW1lOwogCX0gZWxzZSB7CiAJCUJVRkZFUl9UUkFDRShuZXdfYmgsICJnZXQgd3JpdGUgYWNjZXNzIik7Ci0JCWV4dDNfam91cm5hbF9nZXRfd3JpdGVfYWNjZXNzKGhhbmRsZSwgbmV3X2JoKTsKKwkJcmV0dmFsID0gZXh0M19qb3VybmFsX2dldF93cml0ZV9hY2Nlc3MoaGFuZGxlLCBuZXdfYmgpOworCQlpZiAocmV0dmFsKQorCQkJZ290byBqb3VybmFsX2Vycm9yOwogCQluZXdfZGUtPmlub2RlID0gY3B1X3RvX2xlMzIob2xkX2lub2RlLT5pX2lubyk7CiAJCWlmIChFWFQzX0hBU19JTkNPTVBBVF9GRUFUVVJFKG5ld19kaXItPmlfc2IsCiAJCQkJCSAgICAgIEVYVDNfRkVBVFVSRV9JTkNPTVBBVF9GSUxFVFlQRSkpCkBAIC0yMzYyLDcgKzIzNzUsOSBAQAogCQluZXdfZGlyLT5pX2N0aW1lID0gbmV3X2Rpci0+aV9tdGltZSA9IENVUlJFTlRfVElNRV9TRUM7CiAJCWV4dDNfbWFya19pbm9kZV9kaXJ0eShoYW5kbGUsIG5ld19kaXIpOwogCQlCVUZGRVJfVFJBQ0UobmV3X2JoLCAiY2FsbCBleHQzX2pvdXJuYWxfZGlydHlfbWV0YWRhdGEiKTsKLQkJZXh0M19qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgbmV3X2JoKTsKKwkJcmV0dmFsID0gZXh0M19qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgbmV3X2JoKTsKKwkJaWYgKHJldHZhbCkKKwkJCWdvdG8gam91cm5hbF9lcnJvcjsKIAkJYnJlbHNlKG5ld19iaCk7CiAJCW5ld19iaCA9IE5VTEw7CiAJfQpAQCAtMjQxMSwxMCArMjQyNiwxNyBAQAogCWV4dDNfdXBkYXRlX2R4X2ZsYWcob2xkX2Rpcik7CiAJaWYgKGRpcl9iaCkgewogCQlCVUZGRVJfVFJBQ0UoZGlyX2JoLCAiZ2V0X3dyaXRlX2FjY2VzcyIpOwotCQlleHQzX2pvdXJuYWxfZ2V0X3dyaXRlX2FjY2VzcyhoYW5kbGUsIGRpcl9iaCk7CisJCXJldHZhbCA9IGV4dDNfam91cm5hbF9nZXRfd3JpdGVfYWNjZXNzKGhhbmRsZSwgZGlyX2JoKTsKKwkJaWYgKHJldHZhbCkKKwkJCWdvdG8gam91cm5hbF9lcnJvcjsKIAkJUEFSRU5UX0lOTyhkaXJfYmgtPmJfZGF0YSkgPSBjcHVfdG9fbGUzMihuZXdfZGlyLT5pX2lubyk7CiAJCUJVRkZFUl9UUkFDRShkaXJfYmgsICJjYWxsIGV4dDNfam91cm5hbF9kaXJ0eV9tZXRhZGF0YSIpOwotCQlleHQzX2pvdXJuYWxfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBkaXJfYmgpOworCQlyZXR2YWwgPSBleHQzX2pvdXJuYWxfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBkaXJfYmgpOworCQlpZiAocmV0dmFsKSB7Citqb3VybmFsX2Vycm9yOgorCQkJZXh0M19zdGRfZXJyb3IobmV3X2Rpci0+aV9zYiwgcmV0dmFsKTsKKwkJCWdvdG8gZW5kX3JlbmFtZTsKKwkJfQogCQlkcm9wX25saW5rKG9sZF9kaXIpOwogCQlpZiAobmV3X2lub2RlKSB7CiAJCQlkcm9wX25saW5rKG5ld19pbm9kZSk7CmRpZmYgLS1naXQgYS9mcy9leHQzL3Jlc2l6ZS5jIGIvZnMvZXh0My9yZXNpemUuYwppbmRleCBlNzQ2ZDMwLi4xMDhiMTQyIDEwMDY0NAotLS0gYS9mcy9leHQzL3Jlc2l6ZS5jCisrKyBiL2ZzL2V4dDMvcmVzaXplLmMKQEAgLTI0OSw3ICsyNDksMTEgQEAKIAkJbWVtY3B5KGdkYi0+Yl9kYXRhLCBzYmktPnNfZ3JvdXBfZGVzY1tpXS0+Yl9kYXRhLCBnZGItPmJfc2l6ZSk7CiAJCXNldF9idWZmZXJfdXB0b2RhdGUoZ2RiKTsKIAkJdW5sb2NrX2J1ZmZlcihnZGIpOwotCQlleHQzX2pvdXJuYWxfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBnZGIpOworCQllcnIgPSBleHQzX2pvdXJuYWxfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBnZGIpOworCQlpZiAoZXJyKSB7CisJCQlicmVsc2UoZ2RiKTsKKwkJCWdvdG8gZXhpdF9iaDsKKwkJfQogCQlleHQzX3NldF9iaXQoYml0LCBiaC0+Yl9kYXRhKTsKIAkJYnJlbHNlKGdkYik7CiAJfQpAQCAtMjY5LDcgKzI3MywxMSBAQAogCQkJZXJyID0gUFRSX0VSUihnZGIpOwogCQkJZ290byBleGl0X2JoOwogCQl9Ci0JCWV4dDNfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGdkYik7CisJCWVyciA9IGV4dDNfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGdkYik7CisJCWlmIChlcnIpIHsKKwkJCWJyZWxzZShnZGIpOworCQkJZ290byBleGl0X2JoOworCQl9CiAJCWV4dDNfc2V0X2JpdChiaXQsIGJoLT5iX2RhdGEpOwogCQlicmVsc2UoZ2RiKTsKIAl9CkBAIC0yOTUsNyArMzAzLDExIEBACiAJCQllcnIgPSBQVFJfRVJSKGl0KTsKIAkJCWdvdG8gZXhpdF9iaDsKIAkJfQotCQlleHQzX2pvdXJuYWxfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBpdCk7CisJCWVyciA9IGV4dDNfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGl0KTsKKwkJaWYgKGVycikgeworCQkJYnJlbHNlKGl0KTsKKwkJCWdvdG8gZXhpdF9iaDsKKwkJfQogCQlicmVsc2UoaXQpOwogCQlleHQzX3NldF9iaXQoYml0LCBiaC0+Yl9kYXRhKTsKIAl9CkBAIC0zMDYsNyArMzE4LDkgQEAKIAogCW1hcmtfYml0bWFwX2VuZChpbnB1dC0+YmxvY2tzX2NvdW50LCBFWFQzX0JMT0NLU19QRVJfR1JPVVAoc2IpLAogCQkJYmgtPmJfZGF0YSk7Ci0JZXh0M19qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgYmgpOworCWVyciA9IGV4dDNfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGJoKTsKKwlpZiAoZXJyKQorCQlnb3RvIGV4aXRfYmg7CiAJYnJlbHNlKGJoKTsKIAogCS8qIE1hcmsgdW51c2VkIGVudHJpZXMgaW4gaW5vZGUgYml0bWFwIHVzZWQgKi8KQEAgLTMxOSw3ICszMzMsNyBAQAogCiAJbWFya19iaXRtYXBfZW5kKEVYVDNfSU5PREVTX1BFUl9HUk9VUChzYiksIEVYVDNfQkxPQ0tTX1BFUl9HUk9VUChzYiksCiAJCQliaC0+Yl9kYXRhKTsKLQlleHQzX2pvdXJuYWxfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBiaCk7CisJZXJyID0gZXh0M19qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgYmgpOwogZXhpdF9iaDoKIAlicmVsc2UoYmgpOwogCkBAIC01MDMsMTIgKzUxNywxOSBAQAogCSAqIHJlc2VydmVkIGlub2RlLCBhbmQgd2lsbCBiZWNvbWUgR0RUIGJsb2NrcyAocHJpbWFyeSBhbmQgYmFja3VwKS4KIAkgKi8KIAlkYXRhW2dkYl9udW0gJSBFWFQzX0FERFJfUEVSX0JMT0NLKHNiKV0gPSAwOwotCWV4dDNfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGRpbmQpOworCWVyciA9IGV4dDNfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGRpbmQpOworCWlmIChlcnIpCisJCWdvdG8gZXhpdF9ncm91cF9kZXNjOwogCWJyZWxzZShkaW5kKTsKKwlkaW5kID0gTlVMTDsKIAlpbm9kZS0+aV9ibG9ja3MgLT0gKGdkYmFja3VwcyArIDEpICogc2ItPnNfYmxvY2tzaXplID4+IDk7Ci0JZXh0M19tYXJrX2lsb2NfZGlydHkoaGFuZGxlLCBpbm9kZSwgJmlsb2MpOworCWVyciA9IGV4dDNfbWFya19pbG9jX2RpcnR5KGhhbmRsZSwgaW5vZGUsICZpbG9jKTsKKwlpZiAoZXJyKQorCQlnb3RvIGV4aXRfZ3JvdXBfZGVzYzsKIAltZW1zZXQoKCpwcmltYXJ5KS0+Yl9kYXRhLCAwLCBzYi0+c19ibG9ja3NpemUpOwotCWV4dDNfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsICpwcmltYXJ5KTsKKwllcnIgPSBleHQzX2pvdXJuYWxfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCAqcHJpbWFyeSk7CisJaWYgKGVycikKKwkJZ290byBleGl0X2dyb3VwX2Rlc2M7CiAKIAlvX2dyb3VwX2Rlc2MgPSBFWFQzX1NCKHNiKS0+c19ncm91cF9kZXNjOwogCW1lbWNweShuX2dyb3VwX2Rlc2MsIG9fZ3JvdXBfZGVzYywKQEAgLTUxOSwxMCArNTQwLDE0IEBACiAJa2ZyZWUob19ncm91cF9kZXNjKTsKIAogCWxlMTZfYWRkX2NwdSgmZXMtPnNfcmVzZXJ2ZWRfZ2R0X2Jsb2NrcywgLTEpOwotCWV4dDNfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIEVYVDNfU0Ioc2IpLT5zX3NiaCk7CisJZXJyID0gZXh0M19qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgRVhUM19TQihzYiktPnNfc2JoKTsKKwlpZiAoZXJyKQorCQlnb3RvIGV4aXRfaW5vZGU7CiAKIAlyZXR1cm4gMDsKIAorZXhpdF9ncm91cF9kZXNjOgorCWtmcmVlKG5fZ3JvdXBfZGVzYyk7CiBleGl0X2lub2RlOgogCS8vZXh0M19qb3VybmFsX3JlbGVhc2VfYnVmZmVyKGhhbmRsZSwgaWxvYy5iaCk7CiAJYnJlbHNlKGlsb2MuYmgpOwpAQCAtNzA2LDE2ICs3MzEsMjAgQEAKIAkJfQogCQlleHQzX2RlYnVnKCJ1cGRhdGUgbWV0YWRhdGEgYmFja3VwICUjMDRseFxuIiwKIAkJCSAgKHVuc2lnbmVkIGxvbmcpYmgtPmJfYmxvY2tucik7Ci0JCWlmICgoZXJyID0gZXh0M19qb3VybmFsX2dldF93cml0ZV9hY2Nlc3MoaGFuZGxlLCBiaCkpKQorCQlpZiAoKGVyciA9IGV4dDNfam91cm5hbF9nZXRfd3JpdGVfYWNjZXNzKGhhbmRsZSwgYmgpKSkgeworCQkJYnJlbHNlKGJoKTsKIAkJCWJyZWFrOworCQl9CiAJCWxvY2tfYnVmZmVyKGJoKTsKIAkJbWVtY3B5KGJoLT5iX2RhdGEsIGRhdGEsIHNpemUpOwogCQlpZiAocmVzdCkKIAkJCW1lbXNldChiaC0+Yl9kYXRhICsgc2l6ZSwgMCwgcmVzdCk7CiAJCXNldF9idWZmZXJfdXB0b2RhdGUoYmgpOwogCQl1bmxvY2tfYnVmZmVyKGJoKTsKLQkJZXh0M19qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgYmgpOworCQllcnIgPSBleHQzX2pvdXJuYWxfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBiaCk7CiAJCWJyZWxzZShiaCk7CisJCWlmIChlcnIpCisJCQlicmVhazsKIAl9CiAJaWYgKChlcnIyID0gZXh0M19qb3VybmFsX3N0b3AoaGFuZGxlKSkgJiYgIWVycikKIAkJZXJyID0gZXJyMjsKQEAgLTkyMiw3ICs5NTEsOSBAQAogCS8qIFVwZGF0ZSB0aGUgZ2xvYmFsIGZzIHNpemUgZmllbGRzICovCiAJc2JpLT5zX2dyb3Vwc19jb3VudCsrOwogCi0JZXh0M19qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgcHJpbWFyeSk7CisJZXJyID0gZXh0M19qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgcHJpbWFyeSk7CisJaWYgKGVycikKKwkJZ290byBleGl0X2pvdXJuYWw7CiAKIAkvKiBVcGRhdGUgdGhlIHJlc2VydmVkIGJsb2NrIGNvdW50cyBvbmx5IG9uY2UgdGhlIG5ldyBncm91cCBpcwogCSAqIGFjdGl2ZS4gKi8KQEAgLTkzNCw3ICs5NjUsNyBAQAogCXBlcmNwdV9jb3VudGVyX2FkZCgmc2JpLT5zX2ZyZWVpbm9kZXNfY291bnRlciwKIAkJCSAgIEVYVDNfSU5PREVTX1BFUl9HUk9VUChzYikpOwogCi0JZXh0M19qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgc2JpLT5zX3NiaCk7CisJZXJyID0gZXh0M19qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgc2JpLT5zX3NiaCk7CiAKIGV4aXRfam91cm5hbDoKIAltdXRleF91bmxvY2soJnNiaS0+c19yZXNpemVfbG9jayk7CkBAIC0xMDY0LDggKzEwOTUsMTQgQEAKIAkJZ290byBleGl0X3B1dDsKIAl9CiAJZXMtPnNfYmxvY2tzX2NvdW50ID0gY3B1X3RvX2xlMzIob19ibG9ja3NfY291bnQgKyBhZGQpOwotCWV4dDNfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIEVYVDNfU0Ioc2IpLT5zX3NiaCk7CisJZXJyID0gZXh0M19qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgRVhUM19TQihzYiktPnNfc2JoKTsKIAltdXRleF91bmxvY2soJkVYVDNfU0Ioc2IpLT5zX3Jlc2l6ZV9sb2NrKTsKKwlpZiAoZXJyKSB7CisJCWV4dDNfd2FybmluZyhzYiwgX19mdW5jX18sCisJCQkgICAgICJlcnJvciAlZCBvbiBqb3VybmFsIGRpcnR5IG1ldGFkYXRhIiwgZXJyKTsKKwkJZXh0M19qb3VybmFsX3N0b3AoaGFuZGxlKTsKKwkJZ290byBleGl0X3B1dDsKKwl9CiAJZXh0M19kZWJ1ZygiZnJlZWluZyBibG9ja3MgIkUzRlNCTEsiIHRocm91Z2ggIkUzRlNCTEsiXG4iLAogCQkgICBvX2Jsb2Nrc19jb3VudCwgb19ibG9ja3NfY291bnQgKyBhZGQpOwogCWV4dDNfZnJlZV9ibG9ja3Nfc2IoaGFuZGxlLCBzYiwgb19ibG9ja3NfY291bnQsIGFkZCwgJmZyZWVkX2Jsb2Nrcyk7CmRpZmYgLS1naXQgYS9mcy9leHQzL3N1cGVyLmMgYi9mcy9leHQzL3N1cGVyLmMKaW5kZXggNzdjZTE2MS4uYjdkMDU1NCAxMDA2NDQKLS0tIGEvZnMvZXh0My9zdXBlci5jCisrKyBiL2ZzL2V4dDMvc3VwZXIuYwpAQCAtMTQzLDEyICsxNDMsMTYgQEAKIHZvaWQgZXh0M19tc2coc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgY29uc3QgY2hhciAqcHJlZml4LAogCQljb25zdCBjaGFyICpmbXQsIC4uLikKIHsKKwlzdHJ1Y3QgdmFfZm9ybWF0IHZhZjsKIAl2YV9saXN0IGFyZ3M7CiAKIAl2YV9zdGFydChhcmdzLCBmbXQpOwotCXByaW50aygiJXNFWFQzLWZzICglcyk6ICIsIHByZWZpeCwgc2ItPnNfaWQpOwotCXZwcmludGsoZm10LCBhcmdzKTsKLQlwcmludGsoIlxuIik7CisKKwl2YWYuZm10ID0gZm10OworCXZhZi52YSA9ICZhcmdzOworCisJcHJpbnRrKCIlc0VYVDMtZnMgKCVzKTogJXBWXG4iLCBwcmVmaXgsIHNiLT5zX2lkLCAmdmFmKTsKKwogCXZhX2VuZChhcmdzKTsKIH0KIApAQCAtMTk1LDE1ICsxOTksMjAgQEAKIAkJCXNiLT5zX2lkKTsKIH0KIAotdm9pZCBleHQzX2Vycm9yIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYiwgY29uc3QgY2hhciAqIGZ1bmN0aW9uLAotCQkgY29uc3QgY2hhciAqIGZtdCwgLi4uKQordm9pZCBleHQzX2Vycm9yKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGNvbnN0IGNoYXIgKmZ1bmN0aW9uLAorCQljb25zdCBjaGFyICpmbXQsIC4uLikKIHsKKwlzdHJ1Y3QgdmFfZm9ybWF0IHZhZjsKIAl2YV9saXN0IGFyZ3M7CiAKIAl2YV9zdGFydChhcmdzLCBmbXQpOwotCXByaW50ayhLRVJOX0NSSVQgIkVYVDMtZnMgZXJyb3IgKGRldmljZSAlcyk6ICVzOiAiLHNiLT5zX2lkLCBmdW5jdGlvbik7Ci0JdnByaW50ayhmbXQsIGFyZ3MpOwotCXByaW50aygiXG4iKTsKKworCXZhZi5mbXQgPSBmbXQ7CisJdmFmLnZhID0gJmFyZ3M7CisKKwlwcmludGsoS0VSTl9DUklUICJFWFQzLWZzIGVycm9yIChkZXZpY2UgJXMpOiAlczogJXBWXG4iLAorCSAgICAgICBzYi0+c19pZCwgZnVuY3Rpb24sICZ2YWYpOworCiAJdmFfZW5kKGFyZ3MpOwogCiAJZXh0M19oYW5kbGVfZXJyb3Ioc2IpOwpAQCAtMjc0LDE1ICsyODMsMjAgQEAKICAqIGNhc2Ugd2UgdGFrZSB0aGUgZWFzeSB3YXkgb3V0IGFuZCBwYW5pYyBpbW1lZGlhdGVseS4KICAqLwogCi12b2lkIGV4dDNfYWJvcnQgKHN0cnVjdCBzdXBlcl9ibG9jayAqIHNiLCBjb25zdCBjaGFyICogZnVuY3Rpb24sCi0JCSBjb25zdCBjaGFyICogZm10LCAuLi4pCit2b2lkIGV4dDNfYWJvcnQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgY29uc3QgY2hhciAqZnVuY3Rpb24sCisJCSBjb25zdCBjaGFyICpmbXQsIC4uLikKIHsKKwlzdHJ1Y3QgdmFfZm9ybWF0IHZhZjsKIAl2YV9saXN0IGFyZ3M7CiAKIAl2YV9zdGFydChhcmdzLCBmbXQpOwotCXByaW50ayhLRVJOX0NSSVQgIkVYVDMtZnMgKCVzKTogZXJyb3I6ICVzOiAiLCBzYi0+c19pZCwgZnVuY3Rpb24pOwotCXZwcmludGsoZm10LCBhcmdzKTsKLQlwcmludGsoIlxuIik7CisKKwl2YWYuZm10ID0gZm10OworCXZhZi52YSA9ICZhcmdzOworCisJcHJpbnRrKEtFUk5fQ1JJVCAiRVhUMy1mcyAoJXMpOiBlcnJvcjogJXM6ICVwVlxuIiwKKwkgICAgICAgc2ItPnNfaWQsIGZ1bmN0aW9uLCAmdmFmKTsKKwogCXZhX2VuZChhcmdzKTsKIAogCWlmICh0ZXN0X29wdChzYiwgRVJST1JTX1BBTklDKSkKQEAgLTMwMCwxNiArMzE0LDIwIEBACiAJCWpvdXJuYWxfYWJvcnQoRVhUM19TQihzYiktPnNfam91cm5hbCwgLUVJTyk7CiB9CiAKLXZvaWQgZXh0M193YXJuaW5nIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYiwgY29uc3QgY2hhciAqIGZ1bmN0aW9uLAotCQkgICBjb25zdCBjaGFyICogZm10LCAuLi4pCit2b2lkIGV4dDNfd2FybmluZyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBjb25zdCBjaGFyICpmdW5jdGlvbiwKKwkJICBjb25zdCBjaGFyICpmbXQsIC4uLikKIHsKKwlzdHJ1Y3QgdmFfZm9ybWF0IHZhZjsKIAl2YV9saXN0IGFyZ3M7CiAKIAl2YV9zdGFydChhcmdzLCBmbXQpOwotCXByaW50ayhLRVJOX1dBUk5JTkcgIkVYVDMtZnMgKCVzKTogd2FybmluZzogJXM6ICIsCi0JICAgICAgIHNiLT5zX2lkLCBmdW5jdGlvbik7Ci0JdnByaW50ayhmbXQsIGFyZ3MpOwotCXByaW50aygiXG4iKTsKKworCXZhZi5mbXQgPSBmbXQ7CisJdmFmLnZhID0gJmFyZ3M7CisKKwlwcmludGsoS0VSTl9XQVJOSU5HICJFWFQzLWZzICglcyk6IHdhcm5pbmc6ICVzOiAlcFZcbiIsCisJICAgICAgIHNiLT5zX2lkLCBmdW5jdGlvbiwgJnZhZik7CisKIAl2YV9lbmQoYXJncyk7CiB9CiAKQEAgLTE4NDgsMTMgKzE4NjYsMTUgQEAKIAkJZ290byBmYWlsZWRfbW91bnQ7CiAJfQogCi0JaWYgKGdlbmVyaWNfY2hlY2tfYWRkcmVzc2FibGUoc2ItPnNfYmxvY2tzaXplX2JpdHMsCi0JCQkJICAgICAgbGUzMl90b19jcHUoZXMtPnNfYmxvY2tzX2NvdW50KSkpIHsKKwllcnIgPSBnZW5lcmljX2NoZWNrX2FkZHJlc3NhYmxlKHNiLT5zX2Jsb2Nrc2l6ZV9iaXRzLAorCQkJCQlsZTMyX3RvX2NwdShlcy0+c19ibG9ja3NfY291bnQpKTsKKwlpZiAoZXJyKSB7CiAJCWV4dDNfbXNnKHNiLCBLRVJOX0VSUiwKIAkJCSJlcnJvcjogZmlsZXN5c3RlbSBpcyB0b28gbGFyZ2UgdG8gbW91bnQgc2FmZWx5Iik7CiAJCWlmIChzaXplb2Yoc2VjdG9yX3QpIDwgOCkKIAkJCWV4dDNfbXNnKHNiLCBLRVJOX0VSUiwKIAkJCQkiZXJyb3I6IENPTkZJR19MQkRBRiBub3QgZW5hYmxlZCIpOworCQlyZXQgPSBlcnI7CiAJCWdvdG8gZmFpbGVkX21vdW50OwogCX0KIApAQCAtMjI5Nyw3ICsyMzE3LDcgQEAKIAlFWFQzX1NCKHNiKS0+c19qb3VybmFsID0gam91cm5hbDsKIAlleHQzX2NsZWFyX2pvdXJuYWxfZXJyKHNiLCBlcyk7CiAKLQlpZiAoam91cm5hbF9kZXZudW0gJiYKKwlpZiAoIXJlYWxseV9yZWFkX29ubHkgJiYgam91cm5hbF9kZXZudW0gJiYKIAkgICAgam91cm5hbF9kZXZudW0gIT0gbGUzMl90b19jcHUoZXMtPnNfam91cm5hbF9kZXYpKSB7CiAJCWVzLT5zX2pvdXJuYWxfZGV2ID0gY3B1X3RvX2xlMzIoam91cm5hbF9kZXZudW0pOwogCmRpZmYgLS1naXQgYS9mcy9leHQzL3hhdHRyLmMgYi9mcy9leHQzL3hhdHRyLmMKaW5kZXggZTY5ZGM2ZC4uMzJlNmNjMiAxMDA2NDQKLS0tIGEvZnMvZXh0My94YXR0ci5jCisrKyBiL2ZzL2V4dDMveGF0dHIuYwpAQCAtOTI1LDcgKzkyNSw3IEBACiAvKgogICogZXh0M194YXR0cl9zZXRfaGFuZGxlKCkKICAqCi0gKiBDcmVhdGUsIHJlcGxhY2Ugb3IgcmVtb3ZlIGFuIGV4dGVuZGVkIGF0dHJpYnV0ZSBmb3IgdGhpcyBpbm9kZS4gQnVmZmVyCisgKiBDcmVhdGUsIHJlcGxhY2Ugb3IgcmVtb3ZlIGFuIGV4dGVuZGVkIGF0dHJpYnV0ZSBmb3IgdGhpcyBpbm9kZS4gIFZhbHVlCiAgKiBpcyBOVUxMIHRvIHJlbW92ZSBhbiBleGlzdGluZyBleHRlbmRlZCBhdHRyaWJ1dGUsIGFuZCBub24tTlVMTCB0bwogICogZWl0aGVyIHJlcGxhY2UgYW4gZXhpc3RpbmcgZXh0ZW5kZWQgYXR0cmlidXRlLCBvciBjcmVhdGUgYSBuZXcgZXh0ZW5kZWQKICAqIGF0dHJpYnV0ZS4gVGhlIGZsYWdzIFhBVFRSX1JFUExBQ0UgYW5kIFhBVFRSX0NSRUFURQpkaWZmIC0tZ2l0IGEvZnMvZXh0NC9iYWxsb2MuYyBiL2ZzL2V4dDQvYmFsbG9jLmMKaW5kZXggMTRjM2FmMi4uYWRmOTZiOCAxMDA2NDQKLS0tIGEvZnMvZXh0NC9iYWxsb2MuYworKysgYi9mcy9leHQ0L2JhbGxvYy5jCkBAIC01OTIsNyArNTkyLDggQEAKIAkgKiBBY2NvdW50IGZvciB0aGUgYWxsb2NhdGVkIG1ldGEgYmxvY2tzLiAgV2Ugd2lsbCBuZXZlcgogCSAqIGZhaWwgRURRVU9UIGZvciBtZXRkYXRhLCBidXQgd2UgZG8gYWNjb3VudCBmb3IgaXQuCiAJICovCi0JaWYgKCEoKmVycnApICYmIEVYVDRfSShpbm9kZSktPmlfZGVsYWxsb2NfcmVzZXJ2ZWRfZmxhZykgeworCWlmICghKCplcnJwKSAmJgorCSAgICBleHQ0X3Rlc3RfaW5vZGVfc3RhdGUoaW5vZGUsIEVYVDRfU1RBVEVfREVMQUxMT0NfUkVTRVJWRUQpKSB7CiAJCXNwaW5fbG9jaygmRVhUNF9JKGlub2RlKS0+aV9ibG9ja19yZXNlcnZhdGlvbl9sb2NrKTsKIAkJRVhUNF9JKGlub2RlKS0+aV9hbGxvY2F0ZWRfbWV0YV9ibG9ja3MgKz0gYXIubGVuOwogCQlzcGluX3VubG9jaygmRVhUNF9JKGlub2RlKS0+aV9ibG9ja19yZXNlcnZhdGlvbl9sb2NrKTsKZGlmZiAtLWdpdCBhL2ZzL2V4dDQvZGlyLmMgYi9mcy9leHQ0L2Rpci5jCmluZGV4IGVjZTc2ZmIuLjE2NGM1NjAgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDQvZGlyLmMKKysrIGIvZnMvZXh0NC9kaXIuYwpAQCAtNjAsOSArNjAsMTMgQEAKIAlyZXR1cm4gKGV4dDRfZmlsZXR5cGVfdGFibGVbZmlsZXR5cGVdKTsKIH0KIAotCisvKgorICogUmV0dXJuIDAgaWYgdGhlIGRpcmVjdG9yeSBlbnRyeSBpcyBPSywgYW5kIDEgaWYgdGhlcmUgaXMgYSBwcm9ibGVtCisgKgorICogTm90ZTogdGhpcyBpcyB0aGUgb3Bwb3NpdGUgb2Ygd2hhdCBleHQyIGFuZCBleHQzIGhpc3RvcmljYWxseSByZXR1cm5lZC4uLgorICovCiBpbnQgX19leHQ0X2NoZWNrX2Rpcl9lbnRyeShjb25zdCBjaGFyICpmdW5jdGlvbiwgdW5zaWduZWQgaW50IGxpbmUsCi0JCQkgICBzdHJ1Y3QgaW5vZGUgKmRpciwKKwkJCSAgIHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZmlsZSAqZmlscCwKIAkJCSAgIHN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICpkZSwKIAkJCSAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsCiAJCQkgICB1bnNpZ25lZCBpbnQgb2Zmc2V0KQpAQCAtNzEsMjYgKzc1LDM3IEBACiAJY29uc3QgaW50IHJsZW4gPSBleHQ0X3JlY19sZW5fZnJvbV9kaXNrKGRlLT5yZWNfbGVuLAogCQkJCQkJZGlyLT5pX3NiLT5zX2Jsb2Nrc2l6ZSk7CiAKLQlpZiAocmxlbiA8IEVYVDRfRElSX1JFQ19MRU4oMSkpCisJaWYgKHVubGlrZWx5KHJsZW4gPCBFWFQ0X0RJUl9SRUNfTEVOKDEpKSkKIAkJZXJyb3JfbXNnID0gInJlY19sZW4gaXMgc21hbGxlciB0aGFuIG1pbmltYWwiOwotCWVsc2UgaWYgKHJsZW4gJSA0ICE9IDApCisJZWxzZSBpZiAodW5saWtlbHkocmxlbiAlIDQgIT0gMCkpCiAJCWVycm9yX21zZyA9ICJyZWNfbGVuICUgNCAhPSAwIjsKLQllbHNlIGlmIChybGVuIDwgRVhUNF9ESVJfUkVDX0xFTihkZS0+bmFtZV9sZW4pKQorCWVsc2UgaWYgKHVubGlrZWx5KHJsZW4gPCBFWFQ0X0RJUl9SRUNfTEVOKGRlLT5uYW1lX2xlbikpKQogCQllcnJvcl9tc2cgPSAicmVjX2xlbiBpcyB0b28gc21hbGwgZm9yIG5hbWVfbGVuIjsKLQllbHNlIGlmICgoKGNoYXIgKikgZGUgLSBiaC0+Yl9kYXRhKSArIHJsZW4gPiBkaXItPmlfc2ItPnNfYmxvY2tzaXplKQorCWVsc2UgaWYgKHVubGlrZWx5KCgoY2hhciAqKSBkZSAtIGJoLT5iX2RhdGEpICsgcmxlbiA+CisJCQkgIGRpci0+aV9zYi0+c19ibG9ja3NpemUpKQogCQllcnJvcl9tc2cgPSAiZGlyZWN0b3J5IGVudHJ5IGFjcm9zcyBibG9ja3MiOwotCWVsc2UgaWYgKGxlMzJfdG9fY3B1KGRlLT5pbm9kZSkgPgotCQkJbGUzMl90b19jcHUoRVhUNF9TQihkaXItPmlfc2IpLT5zX2VzLT5zX2lub2Rlc19jb3VudCkpCisJZWxzZSBpZiAodW5saWtlbHkobGUzMl90b19jcHUoZGUtPmlub2RlKSA+CisJCQlsZTMyX3RvX2NwdShFWFQ0X1NCKGRpci0+aV9zYiktPnNfZXMtPnNfaW5vZGVzX2NvdW50KSkpCiAJCWVycm9yX21zZyA9ICJpbm9kZSBvdXQgb2YgYm91bmRzIjsKKwllbHNlCisJCXJldHVybiAwOwogCi0JaWYgKGVycm9yX21zZyAhPSBOVUxMKQotCQlleHQ0X2Vycm9yX2lub2RlKGRpciwgZnVuY3Rpb24sIGxpbmUsIGJoLT5iX2Jsb2NrbnIsCi0JCQkiYmFkIGVudHJ5IGluIGRpcmVjdG9yeTogJXMgLSAiCi0JCQkib2Zmc2V0PSV1KCV1KSwgaW5vZGU9JXUsIHJlY19sZW49JWQsIG5hbWVfbGVuPSVkIiwKLQkJCWVycm9yX21zZywgKHVuc2lnbmVkKSAob2Zmc2V0JWJoLT5iX3NpemUpLCBvZmZzZXQsCi0JCQlsZTMyX3RvX2NwdShkZS0+aW5vZGUpLAotCQkJcmxlbiwgZGUtPm5hbWVfbGVuKTsKLQlyZXR1cm4gZXJyb3JfbXNnID09IE5VTEwgPyAxIDogMDsKKwlpZiAoZmlscCkKKwkJZXh0NF9lcnJvcl9maWxlKGZpbHAsIGZ1bmN0aW9uLCBsaW5lLCBiaCA/IGJoLT5iX2Jsb2NrbnIgOiAwLAorCQkJCSJiYWQgZW50cnkgaW4gZGlyZWN0b3J5OiAlcyAtIG9mZnNldD0ldSgldSksICIKKwkJCQkiaW5vZGU9JXUsIHJlY19sZW49JWQsIG5hbWVfbGVuPSVkIiwKKwkJCQllcnJvcl9tc2csICh1bnNpZ25lZCkgKG9mZnNldCViaC0+Yl9zaXplKSwKKwkJCQlvZmZzZXQsIGxlMzJfdG9fY3B1KGRlLT5pbm9kZSksCisJCQkJcmxlbiwgZGUtPm5hbWVfbGVuKTsKKwllbHNlCisJCWV4dDRfZXJyb3JfaW5vZGUoZGlyLCBmdW5jdGlvbiwgbGluZSwgYmggPyBiaC0+Yl9ibG9ja25yIDogMCwKKwkJCQkiYmFkIGVudHJ5IGluIGRpcmVjdG9yeTogJXMgLSBvZmZzZXQ9JXUoJXUpLCAiCisJCQkJImlub2RlPSV1LCByZWNfbGVuPSVkLCBuYW1lX2xlbj0lZCIsCisJCQkJZXJyb3JfbXNnLCAodW5zaWduZWQpIChvZmZzZXQlYmgtPmJfc2l6ZSksCisJCQkJb2Zmc2V0LCBsZTMyX3RvX2NwdShkZS0+aW5vZGUpLAorCQkJCXJsZW4sIGRlLT5uYW1lX2xlbik7CisKKwlyZXR1cm4gMTsKIH0KIAogc3RhdGljIGludCBleHQ0X3JlYWRkaXIoc3RydWN0IGZpbGUgKmZpbHAsCkBAIC0xNTIsOCArMTY3LDkgQEAKIAkJICovCiAJCWlmICghYmgpIHsKIAkJCWlmICghZGlyX2hhc19lcnJvcikgewotCQkJCUVYVDRfRVJST1JfSU5PREUoaW5vZGUsICJkaXJlY3RvcnkgIgotCQkJCQkgICAiY29udGFpbnMgYSBob2xlIGF0IG9mZnNldCAlTHUiLAorCQkJCUVYVDRfRVJST1JfRklMRShmaWxwLCAwLAorCQkJCQkJImRpcmVjdG9yeSBjb250YWlucyBhICIKKwkJCQkJCSJob2xlIGF0IG9mZnNldCAlbGx1IiwKIAkJCQkJICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgZmlscC0+Zl9wb3MpOwogCQkJCWRpcl9oYXNfZXJyb3IgPSAxOwogCQkJfQpAQCAtMTk0LDggKzIxMCw4IEBACiAJCXdoaWxlICghZXJyb3IgJiYgZmlscC0+Zl9wb3MgPCBpbm9kZS0+aV9zaXplCiAJCSAgICAgICAmJiBvZmZzZXQgPCBzYi0+c19ibG9ja3NpemUpIHsKIAkJCWRlID0gKHN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICopIChiaC0+Yl9kYXRhICsgb2Zmc2V0KTsKLQkJCWlmICghZXh0NF9jaGVja19kaXJfZW50cnkoaW5vZGUsIGRlLAotCQkJCQkJICBiaCwgb2Zmc2V0KSkgeworCQkJaWYgKGV4dDRfY2hlY2tfZGlyX2VudHJ5KGlub2RlLCBmaWxwLCBkZSwKKwkJCQkJCSBiaCwgb2Zmc2V0KSkgewogCQkJCS8qCiAJCQkJICogT24gZXJyb3IsIHNraXAgdGhlIGZfcG9zIHRvIHRoZSBuZXh0IGJsb2NrCiAJCQkJICovCmRpZmYgLS1naXQgYS9mcy9leHQ0L2V4dDQuaCBiL2ZzL2V4dDQvZXh0NC5oCmluZGV4IDk0Y2UzZDcuLmJhYjIzODcgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDQvZXh0NC5oCisrKyBiL2ZzL2V4dDQvZXh0NC5oCkBAIC02Miw4ICs2Miw4IEBACiAjZGVmaW5lIEVYVDRfRVJST1JfSU5PREVfQkxPQ0soaW5vZGUsIGJsb2NrLCBmbXQsIGEuLi4pCQkJXAogCWV4dDRfZXJyb3JfaW5vZGUoKGlub2RlKSwgX19mdW5jX18sIF9fTElORV9fLCAoYmxvY2spLCAoZm10KSwgIyMgYSkKIAotI2RlZmluZSBFWFQ0X0VSUk9SX0ZJTEUoZmlsZSwgZm10LCBhLi4uKQlcCi0JZXh0NF9lcnJvcl9maWxlKF9fZnVuY19fLCBfX0xJTkVfXywgKGZpbGUpLCAoZm10KSwgIyMgYSkKKyNkZWZpbmUgRVhUNF9FUlJPUl9GSUxFKGZpbGUsIGJsb2NrLCBmbXQsIGEuLi4pCQkJCVwKKwlleHQ0X2Vycm9yX2ZpbGUoKGZpbGUpLCBfX2Z1bmNfXywgX19MSU5FX18sIChibG9jayksIChmbXQpLCAjIyBhKQogCiAvKiBkYXRhIHR5cGUgZm9yIGJsb2NrIG9mZnNldCBvZiBibG9jayBncm91cCAqLwogdHlwZWRlZiBpbnQgZXh0NF9ncnBibGtfdDsKQEAgLTU2MSwyMiArNTYxLDYgQEAKICNkZWZpbmUgRVhUNF9JT0MzMl9TRVRWRVJTSU9OX09MRAlGU19JT0MzMl9TRVRWRVJTSU9OCiAjZW5kaWYKIAotCi0vKgotICogIE1vdW50IG9wdGlvbnMKLSAqLwotc3RydWN0IGV4dDRfbW91bnRfb3B0aW9ucyB7Ci0JdW5zaWduZWQgbG9uZyBzX21vdW50X29wdDsKLQl1aWRfdCBzX3Jlc3VpZDsKLQlnaWRfdCBzX3Jlc2dpZDsKLQl1bnNpZ25lZCBsb25nIHNfY29tbWl0X2ludGVydmFsOwotCXUzMiBzX21pbl9iYXRjaF90aW1lLCBzX21heF9iYXRjaF90aW1lOwotI2lmZGVmIENPTkZJR19RVU9UQQotCWludCBzX2pxdW90YV9mbXQ7Ci0JY2hhciAqc19xZl9uYW1lc1tNQVhRVU9UQVNdOwotI2VuZGlmCi19OwotCiAvKiBNYXggcGh5c2ljYWwgYmxvY2sgd2UgY2FuIGFkZHJlcyB3L28gZXh0ZW50cyAqLwogI2RlZmluZSBFWFQ0X01BWF9CTE9DS19GSUxFX1BIWVMJMHhGRkZGRkZGRgogCkBAIC03MDksNiArNjkzLDggQEAKIAlpZiAoRVhUNF9GSVRTX0lOX0lOT0RFKHJhd19pbm9kZSwgRVhUNF9JKGlub2RlKSwgeHRpbWUgIyMgX2V4dHJhKSkgICAgIFwKIAkJZXh0NF9kZWNvZGVfZXh0cmFfdGltZSgmKGlub2RlKS0+eHRpbWUsCQkJICAgICAgIFwKIAkJCQkgICAgICAgcmF3X2lub2RlLT54dGltZSAjIyBfZXh0cmEpOwkgICAgICAgXAorCWVsc2UJCQkJCQkJCSAgICAgICBcCisJCShpbm9kZSktPnh0aW1lLnR2X25zZWMgPSAwOwkJCQkgICAgICAgXAogfSB3aGlsZSAoMCkKIAogI2RlZmluZSBFWFQ0X0VJTk9ERV9HRVRfWFRJTUUoeHRpbWUsIGVpbm9kZSwgcmF3X2lub2RlKQkJCSAgICAgICBcCkBAIC03MTksNiArNzA1LDggQEAKIAlpZiAoRVhUNF9GSVRTX0lOX0lOT0RFKHJhd19pbm9kZSwgZWlub2RlLCB4dGltZSAjIyBfZXh0cmEpKQkgICAgICAgXAogCQlleHQ0X2RlY29kZV9leHRyYV90aW1lKCYoZWlub2RlKS0+eHRpbWUsCQkgICAgICAgXAogCQkJCSAgICAgICByYXdfaW5vZGUtPnh0aW1lICMjIF9leHRyYSk7CSAgICAgICBcCisJZWxzZQkJCQkJCQkJICAgICAgIFwKKwkJKGVpbm9kZSktPnh0aW1lLnR2X25zZWMgPSAwOwkJCQkgICAgICAgXAogfSB3aGlsZSAoMCkKIAogI2RlZmluZSBpX2Rpc2tfdmVyc2lvbiBvc2QxLmxpbnV4MS5sX2lfdmVyc2lvbgpAQCAtNzUwLDEyICs3MzgsMTMgQEAKIAogLyoKICAqIHN0b3JhZ2UgZm9yIGNhY2hlZCBleHRlbnQKKyAqIElmIGVjX2xlbiA9PSAwLCB0aGVuIHRoZSBjYWNoZSBpcyBpbnZhbGlkLgorICogSWYgZWNfc3RhcnQgPT0gMCwgdGhlbiB0aGUgY2FjaGUgcmVwcmVzZW50cyBhIGdhcCAobnVsbCBtYXBwaW5nKQogICovCiBzdHJ1Y3QgZXh0NF9leHRfY2FjaGUgewogCWV4dDRfZnNibGtfdAllY19zdGFydDsKIAlleHQ0X2xibGtfdAllY19ibG9jazsKIAlfX3UzMgkJZWNfbGVuOyAvKiBtdXN0IGJlIDMyYml0IHRvIHJldHVybiBob2xlcyAqLwotCV9fdTMyCQllY190eXBlOwogfTsKIAogLyoKQEAgLTc3NCwxMCArNzYzLDEyIEBACiAJICogbmVhciB0byB0aGVpciBwYXJlbnQgZGlyZWN0b3J5J3MgaW5vZGUuCiAJICovCiAJZXh0NF9ncm91cF90CWlfYmxvY2tfZ3JvdXA7CisJZXh0NF9sYmxrX3QJaV9kaXJfc3RhcnRfbG9va3VwOworI2lmIChCSVRTX1BFUl9MT05HIDwgNjQpCiAJdW5zaWduZWQgbG9uZwlpX3N0YXRlX2ZsYWdzOwkJLyogRHluYW1pYyBzdGF0ZSBmbGFncyAqLworI2VuZGlmCiAJdW5zaWduZWQgbG9uZwlpX2ZsYWdzOwogCi0JZXh0NF9sYmxrX3QJCWlfZGlyX3N0YXJ0X2xvb2t1cDsKICNpZmRlZiBDT05GSUdfRVhUNF9GU19YQVRUUgogCS8qCiAJICogRXh0ZW5kZWQgYXR0cmlidXRlcyBjYW4gYmUgcmVhZCBpbmRlcGVuZGVudGx5IG9mIHRoZSBtYWluIGZpbGUKQEAgLTgyMCw3ICs4MTEsNyBAQAogCSAqLwogCXN0cnVjdCByd19zZW1hcGhvcmUgaV9kYXRhX3NlbTsKIAlzdHJ1Y3QgaW5vZGUgdmZzX2lub2RlOwotCXN0cnVjdCBqYmQyX2lub2RlIGppbm9kZTsKKwlzdHJ1Y3QgamJkMl9pbm9kZSAqamlub2RlOwogCiAJc3RydWN0IGV4dDRfZXh0X2NhY2hlIGlfY2FjaGVkX2V4dGVudDsKIAkvKgpAQCAtODQwLDE0ICs4MzEsMTIgQEAKIAl1bnNpZ25lZCBpbnQgaV9yZXNlcnZlZF9kYXRhX2Jsb2NrczsKIAl1bnNpZ25lZCBpbnQgaV9yZXNlcnZlZF9tZXRhX2Jsb2NrczsKIAl1bnNpZ25lZCBpbnQgaV9hbGxvY2F0ZWRfbWV0YV9ibG9ja3M7Ci0JdW5zaWduZWQgc2hvcnQgaV9kZWxhbGxvY19yZXNlcnZlZF9mbGFnOwotCXNlY3Rvcl90IGlfZGFfbWV0YWRhdGFfY2FsY19sYXN0X2xibG9jazsKKwlleHQ0X2xibGtfdCBpX2RhX21ldGFkYXRhX2NhbGNfbGFzdF9sYmxvY2s7CiAJaW50IGlfZGFfbWV0YWRhdGFfY2FsY19sZW47CiAKIAkvKiBvbi1kaXNrIGFkZGl0aW9uYWwgbGVuZ3RoICovCiAJX191MTYgaV9leHRyYV9pc2l6ZTsKIAotCXNwaW5sb2NrX3QgaV9ibG9ja19yZXNlcnZhdGlvbl9sb2NrOwogI2lmZGVmIENPTkZJR19RVU9UQQogCS8qIHF1b3RhIHNwYWNlIHJlc2VydmF0aW9uLCBtYW5hZ2VkIGludGVybmFsbHkgYnkgcXVvdGEgY29kZSAqLwogCXFzaXplX3QgaV9yZXNlcnZlZF9xdW90YTsKQEAgLTg1Niw5ICs4NDUsMTEgQEAKIAkvKiBjb21wbGV0ZWQgSU9zIHRoYXQgbWlnaHQgbmVlZCB1bndyaXR0ZW4gZXh0ZW50cyBoYW5kbGluZyAqLwogCXN0cnVjdCBsaXN0X2hlYWQgaV9jb21wbGV0ZWRfaW9fbGlzdDsKIAlzcGlubG9ja190IGlfY29tcGxldGVkX2lvX2xvY2s7CisJYXRvbWljX3QgaV9pb2VuZF9jb3VudDsJLyogTnVtYmVyIG9mIG91dHN0YW5kaW5nIGlvX2VuZCBzdHJ1Y3RzICovCiAJLyogY3VycmVudCBpb19lbmQgc3RydWN0dXJlIGZvciBhc3luYyBESU8gd3JpdGUqLwogCWV4dDRfaW9fZW5kX3QgKmN1cl9haW9fZGlvOwotCWF0b21pY190IGlfaW9lbmRfY291bnQ7CS8qIE51bWJlciBvZiBvdXRzdGFuZGluZyBpb19lbmQgc3RydWN0cyAqLworCisJc3BpbmxvY2tfdCBpX2Jsb2NrX3Jlc2VydmF0aW9uX2xvY2s7CiAKIAkvKgogCSAqIFRyYW5zYWN0aW9ucyB0aGF0IGNvbnRhaW4gaW5vZGUncyBtZXRhZGF0YSBuZWVkZWQgdG8gY29tcGxldGUKQEAgLTkxNywxMSArOTA4LDIwIEBACiAjZGVmaW5lIEVYVDRfTU9VTlRfRElTQ0FSRAkJMHg0MDAwMDAwMCAvKiBJc3N1ZSBESVNDQVJEIHJlcXVlc3RzICovCiAjZGVmaW5lIEVYVDRfTU9VTlRfSU5JVF9JTk9ERV9UQUJMRQkweDgwMDAwMDAwIC8qIEluaXRpYWxpemUgdW5pbml0aWFsaXplZCBpdGFibGVzICovCiAKLSNkZWZpbmUgY2xlYXJfb3B0KG8sIG9wdCkJCW8gJj0gfkVYVDRfTU9VTlRfIyNvcHQKLSNkZWZpbmUgc2V0X29wdChvLCBvcHQpCQkJbyB8PSBFWFQ0X01PVU5UXyMjb3B0CisjZGVmaW5lIGNsZWFyX29wdChzYiwgb3B0KQkJRVhUNF9TQihzYiktPnNfbW91bnRfb3B0ICY9IFwKKwkJCQkJCX5FWFQ0X01PVU5UXyMjb3B0CisjZGVmaW5lIHNldF9vcHQoc2IsIG9wdCkJCUVYVDRfU0Ioc2IpLT5zX21vdW50X29wdCB8PSBcCisJCQkJCQlFWFQ0X01PVU5UXyMjb3B0CiAjZGVmaW5lIHRlc3Rfb3B0KHNiLCBvcHQpCQkoRVhUNF9TQihzYiktPnNfbW91bnRfb3B0ICYgXAogCQkJCQkgRVhUNF9NT1VOVF8jI29wdCkKIAorI2RlZmluZSBjbGVhcl9vcHQyKHNiLCBvcHQpCQlFWFQ0X1NCKHNiKS0+c19tb3VudF9vcHQyICY9IFwKKwkJCQkJCX5FWFQ0X01PVU5UMl8jI29wdAorI2RlZmluZSBzZXRfb3B0MihzYiwgb3B0KQkJRVhUNF9TQihzYiktPnNfbW91bnRfb3B0MiB8PSBcCisJCQkJCQlFWFQ0X01PVU5UMl8jI29wdAorI2RlZmluZSB0ZXN0X29wdDIoc2IsIG9wdCkJCShFWFQ0X1NCKHNiKS0+c19tb3VudF9vcHQyICYgXAorCQkJCQkgRVhUNF9NT1VOVDJfIyNvcHQpCisKICNkZWZpbmUgZXh0NF9zZXRfYml0CQkJZXh0Ml9zZXRfYml0CiAjZGVmaW5lIGV4dDRfc2V0X2JpdF9hdG9taWMJCWV4dDJfc2V0X2JpdF9hdG9taWMKICNkZWZpbmUgZXh0NF9jbGVhcl9iaXQJCQlleHQyX2NsZWFyX2JpdApAQCAtMTA4Nyw2ICsxMDg3LDcgQEAKIAlzdHJ1Y3QgZXh0NF9zdXBlcl9ibG9jayAqc19lczsJLyogUG9pbnRlciB0byB0aGUgc3VwZXIgYmxvY2sgaW4gdGhlIGJ1ZmZlciAqLwogCXN0cnVjdCBidWZmZXJfaGVhZCAqKnNfZ3JvdXBfZGVzYzsKIAl1bnNpZ25lZCBpbnQgc19tb3VudF9vcHQ7CisJdW5zaWduZWQgaW50IHNfbW91bnRfb3B0MjsKIAl1bnNpZ25lZCBpbnQgc19tb3VudF9mbGFnczsKIAlleHQ0X2ZzYmxrX3Qgc19zYl9ibG9jazsKIAl1aWRfdCBzX3Jlc3VpZDsKQEAgLTEyMzcsMjQgKzEyMzgsMzkgQEAKIAlFWFQ0X1NUQVRFX0VYVF9NSUdSQVRFLAkJLyogSW5vZGUgaXMgbWlncmF0aW5nICovCiAJRVhUNF9TVEFURV9ESU9fVU5XUklUVEVOLAkvKiBuZWVkIGNvbnZlcnQgb24gZGlvIGRvbmUqLwogCUVYVDRfU1RBVEVfTkVXRU5UUlksCQkvKiBGaWxlIGp1c3QgYWRkZWQgdG8gZGlyICovCisJRVhUNF9TVEFURV9ERUxBTExPQ19SRVNFUlZFRCwJLyogYmxrcyBhbHJlYWR5IHJlc2VydmVkIGZvciBkZWxhbGxvYyAqLwogfTsKIAotI2RlZmluZSBFWFQ0X0lOT0RFX0JJVF9GTlMobmFtZSwgZmllbGQpCQkJCQlcCisjZGVmaW5lIEVYVDRfSU5PREVfQklUX0ZOUyhuYW1lLCBmaWVsZCwgb2Zmc2V0KQkJCQlcCiBzdGF0aWMgaW5saW5lIGludCBleHQ0X3Rlc3RfaW5vZGVfIyNuYW1lKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBiaXQpCVwKIHsJCQkJCQkJCQlcCi0JcmV0dXJuIHRlc3RfYml0KGJpdCwgJkVYVDRfSShpbm9kZSktPmlfIyNmaWVsZCk7CQlcCisJcmV0dXJuIHRlc3RfYml0KGJpdCArIChvZmZzZXQpLCAmRVhUNF9JKGlub2RlKS0+aV8jI2ZpZWxkKTsJXAogfQkJCQkJCQkJCVwKIHN0YXRpYyBpbmxpbmUgdm9pZCBleHQ0X3NldF9pbm9kZV8jI25hbWUoc3RydWN0IGlub2RlICppbm9kZSwgaW50IGJpdCkJXAogewkJCQkJCQkJCVwKLQlzZXRfYml0KGJpdCwgJkVYVDRfSShpbm9kZSktPmlfIyNmaWVsZCk7CQkJXAorCXNldF9iaXQoYml0ICsgKG9mZnNldCksICZFWFQ0X0koaW5vZGUpLT5pXyMjZmllbGQpOwkJXAogfQkJCQkJCQkJCVwKIHN0YXRpYyBpbmxpbmUgdm9pZCBleHQ0X2NsZWFyX2lub2RlXyMjbmFtZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgYml0KSBcCiB7CQkJCQkJCQkJXAotCWNsZWFyX2JpdChiaXQsICZFWFQ0X0koaW5vZGUpLT5pXyMjZmllbGQpOwkJCVwKKwljbGVhcl9iaXQoYml0ICsgKG9mZnNldCksICZFWFQ0X0koaW5vZGUpLT5pXyMjZmllbGQpOwkJXAogfQogCi1FWFQ0X0lOT0RFX0JJVF9GTlMoZmxhZywgZmxhZ3MpCi1FWFQ0X0lOT0RFX0JJVF9GTlMoc3RhdGUsIHN0YXRlX2ZsYWdzKQorRVhUNF9JTk9ERV9CSVRfRk5TKGZsYWcsIGZsYWdzLCAwKQorI2lmIChCSVRTX1BFUl9MT05HIDwgNjQpCitFWFQ0X0lOT0RFX0JJVF9GTlMoc3RhdGUsIHN0YXRlX2ZsYWdzLCAwKQorCitzdGF0aWMgaW5saW5lIHZvaWQgZXh0NF9jbGVhcl9zdGF0ZV9mbGFncyhzdHJ1Y3QgZXh0NF9pbm9kZV9pbmZvICplaSkKK3sKKwkoZWkpLT5pX3N0YXRlX2ZsYWdzID0gMDsKK30KKyNlbHNlCitFWFQ0X0lOT0RFX0JJVF9GTlMoc3RhdGUsIGZsYWdzLCAzMikKKworc3RhdGljIGlubGluZSB2b2lkIGV4dDRfY2xlYXJfc3RhdGVfZmxhZ3Moc3RydWN0IGV4dDRfaW5vZGVfaW5mbyAqZWkpCit7CisJLyogV2UgZGVwZW5kIG9uIHRoZSBmYWN0IHRoYXQgY2FsbGVycyB3aWxsIHNldCBpX2ZsYWdzICovCit9CisjZW5kaWYKICNlbHNlCiAvKiBBc3N1bWUgdGhhdCB1c2VyIG1vZGUgcHJvZ3JhbXMgYXJlIHBhc3NpbmcgaW4gYW4gZXh0NGZzIHN1cGVyYmxvY2ssIG5vdAogICogYSBrZXJuZWwgc3RydWN0IHN1cGVyX2Jsb2NrLiAgVGhpcyB3aWxsIGFsbG93IHVzIHRvIGNhbGwgdGhlIGZlYXR1cmUtdGVzdApAQCAtMTY0MiwxMCArMTY1OCwxMiBAQAogCiAvKiBkaXIuYyAqLwogZXh0ZXJuIGludCBfX2V4dDRfY2hlY2tfZGlyX2VudHJ5KGNvbnN0IGNoYXIgKiwgdW5zaWduZWQgaW50LCBzdHJ1Y3QgaW5vZGUgKiwKKwkJCQkgIHN0cnVjdCBmaWxlICosCiAJCQkJICBzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqLAogCQkJCSAgc3RydWN0IGJ1ZmZlcl9oZWFkICosIHVuc2lnbmVkIGludCk7Ci0jZGVmaW5lIGV4dDRfY2hlY2tfZGlyX2VudHJ5KGRpciwgZGUsIGJoLCBvZmZzZXQpIFwKLQlfX2V4dDRfY2hlY2tfZGlyX2VudHJ5KF9fZnVuY19fLCBfX0xJTkVfXywgKGRpciksIChkZSksIChiaCksIChvZmZzZXQpKQorI2RlZmluZSBleHQ0X2NoZWNrX2Rpcl9lbnRyeShkaXIsIGZpbHAsIGRlLCBiaCwgb2Zmc2V0KQkJCVwKKwl1bmxpa2VseShfX2V4dDRfY2hlY2tfZGlyX2VudHJ5KF9fZnVuY19fLCBfX0xJTkVfXywgKGRpciksIChmaWxwKSwgXAorCQkJCQkoZGUpLCAoYmgpLCAob2Zmc2V0KSkpCiBleHRlcm4gaW50IGV4dDRfaHRyZWVfc3RvcmVfZGlyZW50KHN0cnVjdCBmaWxlICpkaXJfZmlsZSwgX191MzIgaGFzaCwKIAkJCQkgICAgX191MzIgbWlub3JfaGFzaCwKIAkJCQkgICAgc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKmRpcmVudCk7CkBAIC0xNjUzLDYgKzE2NzEsNyBAQAogCiAvKiBmc3luYy5jICovCiBleHRlcm4gaW50IGV4dDRfc3luY19maWxlKHN0cnVjdCBmaWxlICosIGludCk7CitleHRlcm4gaW50IGV4dDRfZmx1c2hfY29tcGxldGVkX0lPKHN0cnVjdCBpbm9kZSAqKTsKIAogLyogaGFzaC5jICovCiBleHRlcm4gaW50IGV4dDRmc19kaXJoYXNoKGNvbnN0IGNoYXIgKm5hbWUsIGludCBsZW4sIHN0cnVjdApAQCAtMTc1Miw4ICsxNzcxLDggQEAKIAkJCSAgICAgZXh0NF9mc2Jsa190LCBjb25zdCBjaGFyICosIC4uLikKIAlfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDUsIDYpKSk7CiBleHRlcm4gdm9pZCBleHQ0X2Vycm9yX2ZpbGUoc3RydWN0IGZpbGUgKiwgY29uc3QgY2hhciAqLCB1bnNpZ25lZCBpbnQsCi0JCQkgICAgY29uc3QgY2hhciAqLCAuLi4pCi0JX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCA0LCA1KSkpOworCQkJICAgIGV4dDRfZnNibGtfdCwgY29uc3QgY2hhciAqLCAuLi4pCisJX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCA1LCA2KSkpOwogZXh0ZXJuIHZvaWQgX19leHQ0X3N0ZF9lcnJvcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgY29uc3QgY2hhciAqLAogCQkJICAgICB1bnNpZ25lZCBpbnQsIGludCk7CiBleHRlcm4gdm9pZCBfX2V4dDRfYWJvcnQoc3RydWN0IHN1cGVyX2Jsb2NrICosIGNvbnN0IGNoYXIgKiwgdW5zaWduZWQgaW50LApkaWZmIC0tZ2l0IGEvZnMvZXh0NC9leHQ0X2V4dGVudHMuaCBiL2ZzL2V4dDQvZXh0NF9leHRlbnRzLmgKaW5kZXggMjhjZTcwZi4uMmUyOWFiYiAxMDA2NDQKLS0tIGEvZnMvZXh0NC9leHQ0X2V4dGVudHMuaAorKysgYi9mcy9leHQ0L2V4dDRfZXh0ZW50cy5oCkBAIC0xMTksMTAgKzExOSw2IEBACiAgKiBzdHJ1Y3R1cmUgZm9yIGV4dGVybmFsIEFQSQogICovCiAKLSNkZWZpbmUgRVhUNF9FWFRfQ0FDSEVfTk8JMAotI2RlZmluZSBFWFQ0X0VYVF9DQUNIRV9HQVAJMQotI2RlZmluZSBFWFQ0X0VYVF9DQUNIRV9FWFRFTlQJMgotCiAvKgogICogdG8gYmUgY2FsbGVkIGJ5IGV4dDRfZXh0X3dhbGtfc3BhY2UoKQogICogbmVnYXRpdmUgcmV0Y29kZSAtIGVycm9yCkBAIC0xOTcsNyArMTkzLDcgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZAogZXh0NF9leHRfaW52YWxpZGF0ZV9jYWNoZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQogewotCUVYVDRfSShpbm9kZSktPmlfY2FjaGVkX2V4dGVudC5lY190eXBlID0gRVhUNF9FWFRfQ0FDSEVfTk87CisJRVhUNF9JKGlub2RlKS0+aV9jYWNoZWRfZXh0ZW50LmVjX2xlbiA9IDA7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBleHQ0X2V4dF9tYXJrX3VuaW5pdGlhbGl6ZWQoc3RydWN0IGV4dDRfZXh0ZW50ICpleHQpCkBAIC0yNzgsNyArMjc0LDcgQEAKIH0KIAogZXh0ZXJuIGludCBleHQ0X2V4dF9jYWxjX21ldGFkYXRhX2Ftb3VudChzdHJ1Y3QgaW5vZGUgKmlub2RlLAotCQkJCQkgc2VjdG9yX3QgbGJsb2Nrcyk7CisJCQkJCSBleHQ0X2xibGtfdCBsYmxvY2tzKTsKIGV4dGVybiBpbnQgZXh0NF9leHRlbnRfdHJlZV9pbml0KGhhbmRsZV90ICosIHN0cnVjdCBpbm9kZSAqKTsKIGV4dGVybiBpbnQgZXh0NF9leHRfY2FsY19jcmVkaXRzX2Zvcl9zaW5nbGVfZXh0ZW50KHN0cnVjdCBpbm9kZSAqaW5vZGUsCiAJCQkJCQkgICBpbnQgbnVtLApkaWZmIC0tZ2l0IGEvZnMvZXh0NC9leHQ0X2piZDIuaCBiL2ZzL2V4dDQvZXh0NF9qYmQyLmgKaW5kZXggYjBiZDc5Mi4uZDhiOTkyZSAxMDA2NDQKLS0tIGEvZnMvZXh0NC9leHQ0X2piZDIuaAorKysgYi9mcy9leHQ0L2V4dDRfamJkMi5oCkBAIC0yNTMsNyArMjUzLDcgQEAKIHN0YXRpYyBpbmxpbmUgaW50IGV4dDRfamJkMl9maWxlX2lub2RlKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7CiAJaWYgKGV4dDRfaGFuZGxlX3ZhbGlkKGhhbmRsZSkpCi0JCXJldHVybiBqYmQyX2pvdXJuYWxfZmlsZV9pbm9kZShoYW5kbGUsICZFWFQ0X0koaW5vZGUpLT5qaW5vZGUpOworCQlyZXR1cm4gamJkMl9qb3VybmFsX2ZpbGVfaW5vZGUoaGFuZGxlLCBFWFQ0X0koaW5vZGUpLT5qaW5vZGUpOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9mcy9leHQ0L2V4dGVudHMuYyBiL2ZzL2V4dDQvZXh0ZW50cy5jCmluZGV4IDA1NTRjNDguLmU5MTA3MjAgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDQvZXh0ZW50cy5jCisrKyBiL2ZzL2V4dDQvZXh0ZW50cy5jCkBAIC0xMTcsMTEgKzExNywzMyBAQAogCQlzdHJ1Y3QgZXh0NF9leHRlbnQgKmV4OwogCQlkZXB0aCA9IHBhdGgtPnBfZGVwdGg7CiAKLQkJLyogdHJ5IHRvIHByZWRpY3QgYmxvY2sgcGxhY2VtZW50ICovCisJCS8qCisJCSAqIFRyeSB0byBwcmVkaWN0IGJsb2NrIHBsYWNlbWVudCBhc3N1bWluZyB0aGF0IHdlIGFyZQorCQkgKiBmaWxsaW5nIGluIGEgZmlsZSB3aGljaCB3aWxsIGV2ZW50dWFsbHkgYmUKKwkJICogbm9uLXNwYXJzZSAtLS0gaS5lLiwgaW4gdGhlIGNhc2Ugb2YgbGliYmZkIHdyaXRpbmcKKwkJICogYW4gRUxGIG9iamVjdCBzZWN0aW9ucyBvdXQtb2Ytb3JkZXIgYnV0IGluIGEgd2F5CisJCSAqIHRoZSBldmVudHVhbGx5IHJlc3VsdHMgaW4gYSBjb250aWd1b3VzIG9iamVjdCBvcgorCQkgKiBleGVjdXRhYmxlIGZpbGUsIG9yIHNvbWUgZGF0YWJhc2UgZXh0ZW5kaW5nIGEgdGFibGUKKwkJICogc3BhY2UgZmlsZS4gIEhvd2V2ZXIsIHRoaXMgaXMgYWN0dWFsbHkgc29tZXdoYXQKKwkJICogbm9uLWlkZWFsIGlmIHdlIGFyZSB3cml0aW5nIGEgc3BhcnNlIGZpbGUgc3VjaCBhcworCQkgKiBxZW11IG9yIEtWTSB3cml0aW5nIGEgcmF3IGltYWdlIGZpbGUgdGhhdCBpcyBnb2luZworCQkgKiB0byBzdGF5IGZhaXJseSBzcGFyc2UsIHNpbmNlIGl0IHdpbGwgZW5kIHVwCisJCSAqIGZyYWdtZW50aW5nIHRoZSBmaWxlIHN5c3RlbSdzIGZyZWUgc3BhY2UuICBNYXliZSB3ZQorCQkgKiBzaG91bGQgaGF2ZSBzb21lIGh1ZXJpc3RpY3Mgb3Igc29tZSB3YXkgdG8gYWxsb3cKKwkJICogdXNlcnNwYWNlIHRvIHBhc3MgYSBoaW50IHRvIGZpbGUgc3lzdGVtLAorCQkgKiBlc3BlY2lpYWxseSBpZiB0aGUgbGF0dGVyIGNhc2UgdHVybnMgb3V0IHRvIGJlCisJCSAqIGNvbW1vbi4KKwkJICovCiAJCWV4ID0gcGF0aFtkZXB0aF0ucF9leHQ7Ci0JCWlmIChleCkKLQkJCXJldHVybiAoZXh0NF9leHRfcGJsb2NrKGV4KSArCi0JCQkJKGJsb2NrIC0gbGUzMl90b19jcHUoZXgtPmVlX2Jsb2NrKSkpOworCQlpZiAoZXgpIHsKKwkJCWV4dDRfZnNibGtfdCBleHRfcGJsayA9IGV4dDRfZXh0X3BibG9jayhleCk7CisJCQlleHQ0X2xibGtfdCBleHRfYmxvY2sgPSBsZTMyX3RvX2NwdShleC0+ZWVfYmxvY2spOworCisJCQlpZiAoYmxvY2sgPiBleHRfYmxvY2spCisJCQkJcmV0dXJuIGV4dF9wYmxrICsgKGJsb2NrIC0gZXh0X2Jsb2NrKTsKKwkJCWVsc2UKKwkJCQlyZXR1cm4gZXh0X3BibGsgLSAoZXh0X2Jsb2NrIC0gYmxvY2spOworCQl9CiAKIAkJLyogaXQgbG9va3MgbGlrZSBpbmRleCBpcyBlbXB0eTsKIAkJICogdHJ5IHRvIGZpbmQgc3RhcnRpbmcgYmxvY2sgZnJvbSBpbmRleCBpdHNlbGYgKi8KQEAgLTI0NCw3ICsyNjYsNyBAQAogICogdG8gYWxsb2NhdGUgQGJsb2NrcwogICogV29yc2UgY2FzZSBpcyBvbmUgYmxvY2sgcGVyIGV4dGVudAogICovCi1pbnQgZXh0NF9leHRfY2FsY19tZXRhZGF0YV9hbW91bnQoc3RydWN0IGlub2RlICppbm9kZSwgc2VjdG9yX3QgbGJsb2NrKQoraW50IGV4dDRfZXh0X2NhbGNfbWV0YWRhdGFfYW1vdW50KHN0cnVjdCBpbm9kZSAqaW5vZGUsIGV4dDRfbGJsa190IGxibG9jaykKIHsKIAlzdHJ1Y3QgZXh0NF9pbm9kZV9pbmZvICplaSA9IEVYVDRfSShpbm9kZSk7CiAJaW50IGlkeHMsIG51bSA9IDA7CkBAIC0xODcyLDEyICsxODk0LDEwIEBACiAJCQljYmV4LmVjX2Jsb2NrID0gc3RhcnQ7CiAJCQljYmV4LmVjX2xlbiA9IGVuZCAtIHN0YXJ0OwogCQkJY2JleC5lY19zdGFydCA9IDA7Ci0JCQljYmV4LmVjX3R5cGUgPSBFWFQ0X0VYVF9DQUNIRV9HQVA7CiAJCX0gZWxzZSB7CiAJCQljYmV4LmVjX2Jsb2NrID0gbGUzMl90b19jcHUoZXgtPmVlX2Jsb2NrKTsKIAkJCWNiZXguZWNfbGVuID0gZXh0NF9leHRfZ2V0X2FjdHVhbF9sZW4oZXgpOwogCQkJY2JleC5lY19zdGFydCA9IGV4dDRfZXh0X3BibG9jayhleCk7Ci0JCQljYmV4LmVjX3R5cGUgPSBFWFQ0X0VYVF9DQUNIRV9FWFRFTlQ7CiAJCX0KIAogCQlpZiAodW5saWtlbHkoY2JleC5lY19sZW4gPT0gMCkpIHsKQEAgLTE5MTcsMTMgKzE5MzcsMTIgQEAKIAogc3RhdGljIHZvaWQKIGV4dDRfZXh0X3B1dF9pbl9jYWNoZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBleHQ0X2xibGtfdCBibG9jaywKLQkJCV9fdTMyIGxlbiwgZXh0NF9mc2Jsa190IHN0YXJ0LCBpbnQgdHlwZSkKKwkJCV9fdTMyIGxlbiwgZXh0NF9mc2Jsa190IHN0YXJ0KQogewogCXN0cnVjdCBleHQ0X2V4dF9jYWNoZSAqY2V4OwogCUJVR19PTihsZW4gPT0gMCk7CiAJc3Bpbl9sb2NrKCZFWFQ0X0koaW5vZGUpLT5pX2Jsb2NrX3Jlc2VydmF0aW9uX2xvY2spOwogCWNleCA9ICZFWFQ0X0koaW5vZGUpLT5pX2NhY2hlZF9leHRlbnQ7Ci0JY2V4LT5lY190eXBlID0gdHlwZTsKIAljZXgtPmVjX2Jsb2NrID0gYmxvY2s7CiAJY2V4LT5lY19sZW4gPSBsZW47CiAJY2V4LT5lY19zdGFydCA9IHN0YXJ0OwpAQCAtMTk3NiwxNSArMTk5NSwxOCBAQAogCX0KIAogCWV4dF9kZWJ1ZygiIC0+ICV1OiVsdVxuIiwgbGJsb2NrLCBsZW4pOwotCWV4dDRfZXh0X3B1dF9pbl9jYWNoZShpbm9kZSwgbGJsb2NrLCBsZW4sIDAsIEVYVDRfRVhUX0NBQ0hFX0dBUCk7CisJZXh0NF9leHRfcHV0X2luX2NhY2hlKGlub2RlLCBsYmxvY2ssIGxlbiwgMCk7CiB9CiAKKy8qCisgKiBSZXR1cm4gMCBpZiBjYWNoZSBpcyBpbnZhbGlkOyAxIGlmIHRoZSBjYWNoZSBpcyB2YWxpZAorICovCiBzdGF0aWMgaW50CiBleHQ0X2V4dF9pbl9jYWNoZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBleHQ0X2xibGtfdCBibG9jaywKIAkJCXN0cnVjdCBleHQ0X2V4dGVudCAqZXgpCiB7CiAJc3RydWN0IGV4dDRfZXh0X2NhY2hlICpjZXg7Ci0JaW50IHJldCA9IEVYVDRfRVhUX0NBQ0hFX05POworCWludCByZXQgPSAwOwogCiAJLyoKIAkgKiBXZSBib3Jyb3cgaV9ibG9ja19yZXNlcnZhdGlvbl9sb2NrIHRvIHByb3RlY3QgaV9jYWNoZWRfZXh0ZW50CkBAIC0xOTkzLDExICsyMDE1LDkgQEAKIAljZXggPSAmRVhUNF9JKGlub2RlKS0+aV9jYWNoZWRfZXh0ZW50OwogCiAJLyogaGFzIGNhY2hlIHZhbGlkIGRhdGE/ICovCi0JaWYgKGNleC0+ZWNfdHlwZSA9PSBFWFQ0X0VYVF9DQUNIRV9OTykKKwlpZiAoY2V4LT5lY19sZW4gPT0gMCkKIAkJZ290byBlcnJvdXQ7CiAKLQlCVUdfT04oY2V4LT5lY190eXBlICE9IEVYVDRfRVhUX0NBQ0hFX0dBUCAmJgotCQkJY2V4LT5lY190eXBlICE9IEVYVDRfRVhUX0NBQ0hFX0VYVEVOVCk7CiAJaWYgKGluX3JhbmdlKGJsb2NrLCBjZXgtPmVjX2Jsb2NrLCBjZXgtPmVjX2xlbikpIHsKIAkJZXgtPmVlX2Jsb2NrID0gY3B1X3RvX2xlMzIoY2V4LT5lY19ibG9jayk7CiAJCWV4dDRfZXh0X3N0b3JlX3BibG9jayhleCwgY2V4LT5lY19zdGFydCk7CkBAIC0yMDA1LDcgKzIwMjUsNyBAQAogCQlleHRfZGVidWcoIiV1IGNhY2hlZCBieSAldToldTolbGx1XG4iLAogCQkJCWJsb2NrLAogCQkJCWNleC0+ZWNfYmxvY2ssIGNleC0+ZWNfbGVuLCBjZXgtPmVjX3N0YXJ0KTsKLQkJcmV0ID0gY2V4LT5lY190eXBlOworCQlyZXQgPSAxOwogCX0KIGVycm91dDoKIAlzcGluX3VubG9jaygmRVhUNF9JKGlub2RlKS0+aV9ibG9ja19yZXNlcnZhdGlvbl9sb2NrKTsKQEAgLTMwODIsNyArMzEwMiw3IEBACiAgKiBIYW5kbGUgRU9GQkxPQ0tTX0ZMIGZsYWcsIGNsZWFyaW5nIGl0IGlmIG5lY2Vzc2FyeQogICovCiBzdGF0aWMgaW50IGNoZWNrX2VvZmJsb2Nrc19mbChoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAotCQkJICAgICAgc3RydWN0IGV4dDRfbWFwX2Jsb2NrcyAqbWFwLAorCQkJICAgICAgZXh0NF9sYmxrX3QgbGJsaywKIAkJCSAgICAgIHN0cnVjdCBleHQ0X2V4dF9wYXRoICpwYXRoLAogCQkJICAgICAgdW5zaWduZWQgaW50IGxlbikKIHsKQEAgLTMxMTIsNyArMzEzMiw3IEBACiAJICogdGhpcyB0dXJucyBvdXQgdG8gYmUgZmFsc2UsIHdlIGNhbiBiYWlsIG91dCBmcm9tIHRoaXMKIAkgKiBmdW5jdGlvbiBpbW1lZGlhdGVseS4KIAkgKi8KLQlpZiAobWFwLT5tX2xibGsgKyBsZW4gPCBsZTMyX3RvX2NwdShsYXN0X2V4LT5lZV9ibG9jaykgKworCWlmIChsYmxrICsgbGVuIDwgbGUzMl90b19jcHUobGFzdF9leC0+ZWVfYmxvY2spICsKIAkgICAgZXh0NF9leHRfZ2V0X2FjdHVhbF9sZW4obGFzdF9leCkpCiAJCXJldHVybiAwOwogCS8qCkBAIC0zMTY4LDggKzMxODgsOCBAQAogCQkJCQkJCXBhdGgpOwogCQlpZiAocmV0ID49IDApIHsKIAkJCWV4dDRfdXBkYXRlX2lub2RlX2ZzeW5jX3RyYW5zKGhhbmRsZSwgaW5vZGUsIDEpOwotCQkJZXJyID0gY2hlY2tfZW9mYmxvY2tzX2ZsKGhhbmRsZSwgaW5vZGUsIG1hcCwgcGF0aCwKLQkJCQkJCSBtYXAtPm1fbGVuKTsKKwkJCWVyciA9IGNoZWNrX2VvZmJsb2Nrc19mbChoYW5kbGUsIGlub2RlLCBtYXAtPm1fbGJsaywKKwkJCQkJCSBwYXRoLCBtYXAtPm1fbGVuKTsKIAkJfSBlbHNlCiAJCQllcnIgPSByZXQ7CiAJCWdvdG8gb3V0MjsKQEAgLTMxOTksNyArMzIxOSw4IEBACiAJcmV0ID0gZXh0NF9leHRfY29udmVydF90b19pbml0aWFsaXplZChoYW5kbGUsIGlub2RlLCBtYXAsIHBhdGgpOwogCWlmIChyZXQgPj0gMCkgewogCQlleHQ0X3VwZGF0ZV9pbm9kZV9mc3luY190cmFucyhoYW5kbGUsIGlub2RlLCAxKTsKLQkJZXJyID0gY2hlY2tfZW9mYmxvY2tzX2ZsKGhhbmRsZSwgaW5vZGUsIG1hcCwgcGF0aCwgbWFwLT5tX2xlbik7CisJCWVyciA9IGNoZWNrX2VvZmJsb2Nrc19mbChoYW5kbGUsIGlub2RlLCBtYXAtPm1fbGJsaywgcGF0aCwKKwkJCQkJIG1hcC0+bV9sZW4pOwogCQlpZiAoZXJyIDwgMCkKIAkJCWdvdG8gb3V0MjsKIAl9CkBAIC0zMjc2LDcgKzMyOTcsNyBAQAogCXN0cnVjdCBleHQ0X2V4dGVudF9oZWFkZXIgKmVoOwogCXN0cnVjdCBleHQ0X2V4dGVudCBuZXdleCwgKmV4OwogCWV4dDRfZnNibGtfdCBuZXdibG9jazsKLQlpbnQgZXJyID0gMCwgZGVwdGgsIHJldCwgY2FjaGVfdHlwZTsKKwlpbnQgZXJyID0gMCwgZGVwdGgsIHJldDsKIAl1bnNpZ25lZCBpbnQgYWxsb2NhdGVkID0gMDsKIAlzdHJ1Y3QgZXh0NF9hbGxvY2F0aW9uX3JlcXVlc3QgYXI7CiAJZXh0NF9pb19lbmRfdCAqaW8gPSBFWFQ0X0koaW5vZGUpLT5jdXJfYWlvX2RpbzsKQEAgLTMyODUsOSArMzMwNiw4IEBACiAJCSAgbWFwLT5tX2xibGssIG1hcC0+bV9sZW4sIGlub2RlLT5pX2lubyk7CiAKIAkvKiBjaGVjayBpbiBjYWNoZSAqLwotCWNhY2hlX3R5cGUgPSBleHQ0X2V4dF9pbl9jYWNoZShpbm9kZSwgbWFwLT5tX2xibGssICZuZXdleCk7Ci0JaWYgKGNhY2hlX3R5cGUpIHsKLQkJaWYgKGNhY2hlX3R5cGUgPT0gRVhUNF9FWFRfQ0FDSEVfR0FQKSB7CisJaWYgKGV4dDRfZXh0X2luX2NhY2hlKGlub2RlLCBtYXAtPm1fbGJsaywgJm5ld2V4KSkgeworCQlpZiAoIW5ld2V4LmVlX3N0YXJ0X2xvICYmICFuZXdleC5lZV9zdGFydF9oaSkgewogCQkJaWYgKChmbGFncyAmIEVYVDRfR0VUX0JMT0NLU19DUkVBVEUpID09IDApIHsKIAkJCQkvKgogCQkJCSAqIGJsb2NrIGlzbid0IGFsbG9jYXRlZCB5ZXQgYW5kCkBAIC0zMjk2LDcgKzMzMTYsNyBAQAogCQkJCWdvdG8gb3V0MjsKIAkJCX0KIAkJCS8qIHdlIHNob3VsZCBhbGxvY2F0ZSByZXF1ZXN0ZWQgYmxvY2sgKi8KLQkJfSBlbHNlIGlmIChjYWNoZV90eXBlID09IEVYVDRfRVhUX0NBQ0hFX0VYVEVOVCkgeworCQl9IGVsc2UgewogCQkJLyogYmxvY2sgaXMgYWxyZWFkeSBhbGxvY2F0ZWQgKi8KIAkJCW5ld2Jsb2NrID0gbWFwLT5tX2xibGsKIAkJCQkgICAtIGxlMzJfdG9fY3B1KG5ld2V4LmVlX2Jsb2NrKQpAQCAtMzMwNSw4ICszMzI1LDYgQEAKIAkJCWFsbG9jYXRlZCA9IGV4dDRfZXh0X2dldF9hY3R1YWxfbGVuKCZuZXdleCkgLQogCQkJCShtYXAtPm1fbGJsayAtIGxlMzJfdG9fY3B1KG5ld2V4LmVlX2Jsb2NrKSk7CiAJCQlnb3RvIG91dDsKLQkJfSBlbHNlIHsKLQkJCUJVRygpOwogCQl9CiAJfQogCkBAIC0zMzU3LDggKzMzNzUsNyBAQAogCQkJLyogRG8gbm90IHB1dCB1bmluaXRpYWxpemVkIGV4dGVudCBpbiB0aGUgY2FjaGUgKi8KIAkJCWlmICghZXh0NF9leHRfaXNfdW5pbml0aWFsaXplZChleCkpIHsKIAkJCQlleHQ0X2V4dF9wdXRfaW5fY2FjaGUoaW5vZGUsIGVlX2Jsb2NrLAotCQkJCQkJCWVlX2xlbiwgZWVfc3RhcnQsCi0JCQkJCQkJRVhUNF9FWFRfQ0FDSEVfRVhURU5UKTsKKwkJCQkJCQllZV9sZW4sIGVlX3N0YXJ0KTsKIAkJCQlnb3RvIG91dDsKIAkJCX0KIAkJCXJldCA9IGV4dDRfZXh0X2hhbmRsZV91bmluaXRpYWxpemVkX2V4dGVudHMoaGFuZGxlLApAQCAtMzQ1Niw3ICszNDczLDcgQEAKIAkJCW1hcC0+bV9mbGFncyB8PSBFWFQ0X01BUF9VTklOSVQ7CiAJfQogCi0JZXJyID0gY2hlY2tfZW9mYmxvY2tzX2ZsKGhhbmRsZSwgaW5vZGUsIG1hcCwgcGF0aCwgYXIubGVuKTsKKwllcnIgPSBjaGVja19lb2ZibG9ja3NfZmwoaGFuZGxlLCBpbm9kZSwgbWFwLT5tX2xibGssIHBhdGgsIGFyLmxlbik7CiAJaWYgKGVycikKIAkJZ290byBvdXQyOwogCkBAIC0zNDkwLDggKzM1MDcsNyBAQAogCSAqIHdoZW4gaXQgaXMgX25vdF8gYW4gdW5pbml0aWFsaXplZCBleHRlbnQuCiAJICovCiAJaWYgKChmbGFncyAmIEVYVDRfR0VUX0JMT0NLU19VTklOSVRfRVhUKSA9PSAwKSB7Ci0JCWV4dDRfZXh0X3B1dF9pbl9jYWNoZShpbm9kZSwgbWFwLT5tX2xibGssIGFsbG9jYXRlZCwgbmV3YmxvY2ssCi0JCQkJCQlFWFQ0X0VYVF9DQUNIRV9FWFRFTlQpOworCQlleHQ0X2V4dF9wdXRfaW5fY2FjaGUoaW5vZGUsIG1hcC0+bV9sYmxrLCBhbGxvY2F0ZWQsIG5ld2Jsb2NrKTsKIAkJZXh0NF91cGRhdGVfaW5vZGVfZnN5bmNfdHJhbnMoaGFuZGxlLCBpbm9kZSwgMSk7CiAJfSBlbHNlCiAJCWV4dDRfdXBkYXRlX2lub2RlX2ZzeW5jX3RyYW5zKGhhbmRsZSwgaW5vZGUsIDApOwpAQCAtMzUxOSw2ICszNTM1LDEyIEBACiAJaW50IGVyciA9IDA7CiAKIAkvKgorCSAqIGZpbmlzaCBhbnkgcGVuZGluZyBlbmRfaW8gd29yayBzbyB3ZSB3b24ndCBydW4gdGhlIHJpc2sgb2YKKwkgKiBjb252ZXJ0aW5nIGFueSB0cnVuY2F0ZWQgYmxvY2tzIHRvIGluaXRpYWxpemVkIGxhdGVyCisJICovCisJZXh0NF9mbHVzaF9jb21wbGV0ZWRfSU8oaW5vZGUpOworCisJLyoKIAkgKiBwcm9iYWJseSBmaXJzdCBleHRlbnQgd2UncmUgZ29ubmEgZnJlZSB3aWxsIGJlIGxhc3QgaW4gYmxvY2sKIAkgKi8KIAllcnIgPSBleHQ0X3dyaXRlcGFnZV90cmFuc19ibG9ja3MoaW5vZGUpOwpAQCAtMzc2Nyw3ICszNzg5LDcgQEAKIAogCWxvZ2ljYWwgPSAgKF9fdTY0KW5ld2V4LT5lY19ibG9jayA8PCBibGtzaXplX2JpdHM7CiAKLQlpZiAobmV3ZXgtPmVjX3R5cGUgPT0gRVhUNF9FWFRfQ0FDSEVfR0FQKSB7CisJaWYgKG5ld2V4LT5lY19zdGFydCA9PSAwKSB7CiAJCXBnb2ZmX3Qgb2Zmc2V0OwogCQlzdHJ1Y3QgcGFnZSAqcGFnZTsKIAkJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IE5VTEw7CmRpZmYgLS1naXQgYS9mcy9leHQ0L2ZpbGUuYyBiL2ZzL2V4dDQvZmlsZS5jCmluZGV4IDVhNWM1NWQuLmJiMDAzZGMgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDQvZmlsZS5jCisrKyBiL2ZzL2V4dDQvZmlsZS5jCkBAIC0xMDQsNiArMTA0LDcgQEAKIHsKIAlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaW5vZGUtPmlfc2I7CiAJc3RydWN0IGV4dDRfc2JfaW5mbyAqc2JpID0gRVhUNF9TQihpbm9kZS0+aV9zYik7CisJc3RydWN0IGV4dDRfaW5vZGVfaW5mbyAqZWkgPSBFWFQ0X0koaW5vZGUpOwogCXN0cnVjdCB2ZnNtb3VudCAqbW50ID0gZmlscC0+Zl9wYXRoLm1udDsKIAlzdHJ1Y3QgcGF0aCBwYXRoOwogCWNoYXIgYnVmWzY0XSwgKmNwOwpAQCAtMTI3LDYgKzEyOCwyNyBAQAogCQkJZXh0NF9tYXJrX3N1cGVyX2RpcnR5KHNiKTsKIAkJfQogCX0KKwkvKgorCSAqIFNldCB1cCB0aGUgamJkMl9pbm9kZSBpZiB3ZSBhcmUgb3BlbmluZyB0aGUgaW5vZGUgZm9yCisJICogd3JpdGluZyBhbmQgdGhlIGpvdXJuYWwgaXMgcHJlc2VudAorCSAqLworCWlmIChzYmktPnNfam91cm5hbCAmJiAhZWktPmppbm9kZSAmJiAoZmlscC0+Zl9tb2RlICYgRk1PREVfV1JJVEUpKSB7CisJCXN0cnVjdCBqYmQyX2lub2RlICpqaW5vZGUgPSBqYmQyX2FsbG9jX2lub2RlKEdGUF9LRVJORUwpOworCisJCXNwaW5fbG9jaygmaW5vZGUtPmlfbG9jayk7CisJCWlmICghZWktPmppbm9kZSkgeworCQkJaWYgKCFqaW5vZGUpIHsKKwkJCQlzcGluX3VubG9jaygmaW5vZGUtPmlfbG9jayk7CisJCQkJcmV0dXJuIC1FTk9NRU07CisJCQl9CisJCQllaS0+amlub2RlID0gamlub2RlOworCQkJamJkMl9qb3VybmFsX2luaXRfamJkX2lub2RlKGVpLT5qaW5vZGUsIGlub2RlKTsKKwkJCWppbm9kZSA9IE5VTEw7CisJCX0KKwkJc3Bpbl91bmxvY2soJmlub2RlLT5pX2xvY2spOworCQlpZiAodW5saWtlbHkoamlub2RlICE9IE5VTEwpKQorCQkJamJkMl9mcmVlX2lub2RlKGppbm9kZSk7CisJfQogCXJldHVybiBkcXVvdF9maWxlX29wZW4oaW5vZGUsIGZpbHApOwogfQogCmRpZmYgLS1naXQgYS9mcy9leHQ0L2ZzeW5jLmMgYi9mcy9leHQ0L2ZzeW5jLmMKaW5kZXggYzFhN2JjOS4uNzgyOWIyOCAxMDA2NDQKLS0tIGEvZnMvZXh0NC9mc3luYy5jCisrKyBiL2ZzL2V4dDQvZnN5bmMuYwpAQCAtNzUsNyArNzUsNyBAQAogICogdG8gd3JpdHRlbi4KICAqIFRoZSBmdW5jdGlvbiByZXR1cm4gdGhlIG51bWJlciBvZiBwZW5kaW5nIElPcyBvbiBzdWNjZXNzLgogICovCi1zdGF0aWMgaW50IGZsdXNoX2NvbXBsZXRlZF9JTyhzdHJ1Y3QgaW5vZGUgKmlub2RlKQorZXh0ZXJuIGludCBleHQ0X2ZsdXNoX2NvbXBsZXRlZF9JTyhzdHJ1Y3QgaW5vZGUgKmlub2RlKQogewogCWV4dDRfaW9fZW5kX3QgKmlvOwogCXN0cnVjdCBleHQ0X2lub2RlX2luZm8gKmVpID0gRVhUNF9JKGlub2RlKTsKQEAgLTE2OSw3ICsxNjksNyBAQAogCWlmIChpbm9kZS0+aV9zYi0+c19mbGFncyAmIE1TX1JET05MWSkKIAkJcmV0dXJuIDA7CiAKLQlyZXQgPSBmbHVzaF9jb21wbGV0ZWRfSU8oaW5vZGUpOworCXJldCA9IGV4dDRfZmx1c2hfY29tcGxldGVkX0lPKGlub2RlKTsKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKIApkaWZmIC0tZ2l0IGEvZnMvZXh0NC9pYWxsb2MuYyBiL2ZzL2V4dDQvaWFsbG9jLmMKaW5kZXggMWNlMjQwYS4uZWI5MDk3YSAxMDA2NDQKLS0tIGEvZnMvZXh0NC9pYWxsb2MuYworKysgYi9mcy9leHQ0L2lhbGxvYy5jCkBAIC0xMDI3LDcgKzEwMjcsNyBAQAogCWlub2RlLT5pX2dlbmVyYXRpb24gPSBzYmktPnNfbmV4dF9nZW5lcmF0aW9uKys7CiAJc3Bpbl91bmxvY2soJnNiaS0+c19uZXh0X2dlbl9sb2NrKTsKIAotCWVpLT5pX3N0YXRlX2ZsYWdzID0gMDsKKwlleHQ0X2NsZWFyX3N0YXRlX2ZsYWdzKGVpKTsgLyogT25seSByZWxldmFudCBvbiAzMi1iaXQgYXJjaHMgKi8KIAlleHQ0X3NldF9pbm9kZV9zdGF0ZShpbm9kZSwgRVhUNF9TVEFURV9ORVcpOwogCiAJZWktPmlfZXh0cmFfaXNpemUgPSBFWFQ0X1NCKHNiKS0+c193YW50X2V4dHJhX2lzaXplOwpkaWZmIC0tZ2l0IGEvZnMvZXh0NC9pbm9kZS5jIGIvZnMvZXh0NC9pbm9kZS5jCmluZGV4IGU2NTk1OTcuLmU4MGZjNTEgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDQvaW5vZGUuYworKysgYi9mcy9leHQ0L2lub2RlLmMKQEAgLTQwLDYgKzQwLDcgQEAKICNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvcmF0ZWxpbWl0Lmg+CiAKICNpbmNsdWRlICJleHQ0X2piZDIuaCIKICNpbmNsdWRlICJ4YXR0ci5oIgpAQCAtNTQsMTAgKzU1LDE3IEBACiAJCQkJCSAgICAgIGxvZmZfdCBuZXdfc2l6ZSkKIHsKIAl0cmFjZV9leHQ0X2JlZ2luX29yZGVyZWRfdHJ1bmNhdGUoaW5vZGUsIG5ld19zaXplKTsKLQlyZXR1cm4gamJkMl9qb3VybmFsX2JlZ2luX29yZGVyZWRfdHJ1bmNhdGUoCi0JCQkJCUVYVDRfU0IoaW5vZGUtPmlfc2IpLT5zX2pvdXJuYWwsCi0JCQkJCSZFWFQ0X0koaW5vZGUpLT5qaW5vZGUsCi0JCQkJCW5ld19zaXplKTsKKwkvKgorCSAqIElmIGppbm9kZSBpcyB6ZXJvLCB0aGVuIHdlIG5ldmVyIG9wZW5lZCB0aGUgZmlsZSBmb3IKKwkgKiB3cml0aW5nLCBzbyB0aGVyZSdzIG5vIG5lZWQgdG8gY2FsbAorCSAqIGpiZDJfam91cm5hbF9iZWdpbl9vcmRlcmVkX3RydW5jYXRlKCkgc2luY2UgdGhlcmUncyBubworCSAqIG91dHN0YW5kaW5nIHdyaXRlcyB3ZSBuZWVkIHRvIGZsdXNoLgorCSAqLworCWlmICghRVhUNF9JKGlub2RlKS0+amlub2RlKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gamJkMl9qb3VybmFsX2JlZ2luX29yZGVyZWRfdHJ1bmNhdGUoRVhUNF9KT1VSTkFMKGlub2RlKSwKKwkJCQkJCSAgIEVYVDRfSShpbm9kZSktPmppbm9kZSwKKwkJCQkJCSAgIG5ld19zaXplKTsKIH0KIAogc3RhdGljIHZvaWQgZXh0NF9pbnZhbGlkYXRlcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgbG9uZyBvZmZzZXQpOwpAQCAtNTUyLDcgKzU2MCw3IEBACiB9CiAKIC8qKgotICoJZXh0NF9ibGtzX3RvX2FsbG9jYXRlOiBMb29rIHVwIHRoZSBibG9jayBtYXAgYW5kIGNvdW50IHRoZSBudW1iZXIKKyAqCWV4dDRfYmxrc190b19hbGxvY2F0ZSAtIExvb2sgdXAgdGhlIGJsb2NrIG1hcCBhbmQgY291bnQgdGhlIG51bWJlcgogICoJb2YgZGlyZWN0IGJsb2NrcyBuZWVkIHRvIGJlIGFsbG9jYXRlZCBmb3IgdGhlIGdpdmVuIGJyYW5jaC4KICAqCiAgKglAYnJhbmNoOiBjaGFpbiBvZiBpbmRpcmVjdCBibG9ja3MKQEAgLTU5MSwxMyArNTk5LDE5IEBACiAKIC8qKgogICoJZXh0NF9hbGxvY19ibG9ja3M6IG11bHRpcGxlIGFsbG9jYXRlIGJsb2NrcyBuZWVkZWQgZm9yIGEgYnJhbmNoCisgKglAaGFuZGxlOiBoYW5kbGUgZm9yIHRoaXMgdHJhbnNhY3Rpb24KKyAqCUBpbm9kZTogaW5vZGUgd2hpY2ggbmVlZHMgYWxsb2NhdGVkIGJsb2NrcworICoJQGlibG9jazogdGhlIGxvZ2ljYWwgYmxvY2sgdG8gc3RhcnQgYWxsb2NhdGVkIGF0CisgKglAZ29hbDogcHJlZmVycmVkIHBoeXNpY2FsIGJsb2NrIG9mIGFsbG9jYXRpb24KICAqCUBpbmRpcmVjdF9ibGtzOiB0aGUgbnVtYmVyIG9mIGJsb2NrcyBuZWVkIHRvIGFsbG9jYXRlIGZvciBpbmRpcmVjdAogICoJCQlibG9ja3MKLSAqCisgKglAYmxrczogbnVtYmVyIG9mIGRlc2lyZWQgYmxvY2tzCiAgKglAbmV3X2Jsb2Nrczogb24gcmV0dXJuIGl0IHdpbGwgc3RvcmUgdGhlIG5ldyBibG9jayBudW1iZXJzIGZvcgogICoJdGhlIGluZGlyZWN0IGJsb2NrcyhpZiBuZWVkZWQpIGFuZCB0aGUgZmlyc3QgZGlyZWN0IGJsb2NrLAotICoJQGJsa3M6CW9uIHJldHVybiBpdCB3aWxsIHN0b3JlIHRoZSB0b3RhbCBudW1iZXIgb2YgYWxsb2NhdGVkCi0gKgkJZGlyZWN0IGJsb2NrcworICoJQGVycjogb24gcmV0dXJuIGl0IHdpbGwgc3RvcmUgdGhlIGVycm9yIGNvZGUKKyAqCisgKglUaGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIHRoZSBudW1iZXIgb2YgYmxvY2tzIGFsbG9jYXRlZCBhcworICoJcmVxdWVzdGVkIGJ5IHRoZSBwYXNzZWQtaW4gcGFyYW1ldGVycy4KICAqLwogc3RhdGljIGludCBleHQ0X2FsbG9jX2Jsb2NrcyhoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAogCQkJICAgICBleHQ0X2xibGtfdCBpYmxvY2ssIGV4dDRfZnNibGtfdCBnb2FsLApAQCAtNzExLDkgKzcyNSwxMSBAQAogCiAvKioKICAqCWV4dDRfYWxsb2NfYnJhbmNoIC0gYWxsb2NhdGUgYW5kIHNldCB1cCBhIGNoYWluIG9mIGJsb2Nrcy4KKyAqCUBoYW5kbGU6IGhhbmRsZSBmb3IgdGhpcyB0cmFuc2FjdGlvbgogICoJQGlub2RlOiBvd25lcgogICoJQGluZGlyZWN0X2Jsa3M6IG51bWJlciBvZiBhbGxvY2F0ZWQgaW5kaXJlY3QgYmxvY2tzCiAgKglAYmxrczogbnVtYmVyIG9mIGFsbG9jYXRlZCBkaXJlY3QgYmxvY2tzCisgKglAZ29hbDogcHJlZmVycmVkIHBsYWNlIGZvciBhbGxvY2F0aW9uCiAgKglAb2Zmc2V0czogb2Zmc2V0cyAoaW4gdGhlIGJsb2NrcykgdG8gc3RvcmUgdGhlIHBvaW50ZXJzIHRvIG5leHQuCiAgKglAYnJhbmNoOiBwbGFjZSB0byBzdG9yZSB0aGUgY2hhaW4gaW4uCiAgKgpAQCAtODI2LDYgKzg0Miw3IEBACiAKIC8qKgogICogZXh0NF9zcGxpY2VfYnJhbmNoIC0gc3BsaWNlIHRoZSBhbGxvY2F0ZWQgYnJhbmNoIG9udG8gaW5vZGUuCisgKiBAaGFuZGxlOiBoYW5kbGUgZm9yIHRoaXMgdHJhbnNhY3Rpb24KICAqIEBpbm9kZTogb3duZXIKICAqIEBibG9jazogKGxvZ2ljYWwpIG51bWJlciBvZiBibG9jayB3ZSBhcmUgYWRkaW5nCiAgKiBAY2hhaW46IGNoYWluIG9mIGluZGlyZWN0IGJsb2NrcyAod2l0aCBhIG1pc3NpbmcgbGluayAtIHNlZQpAQCAtMTA4MSw3ICsxMDk4LDcgQEAKICAqIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIG1ldGFkYXRhIGJsb2NrcyBuZWVkIHRvIHJlc2VydmUKICAqIHRvIGFsbG9jYXRlIGEgYmxvY2sgbG9jYXRlZCBhdCBAbGJsb2NrCiAgKi8KLXN0YXRpYyBpbnQgZXh0NF9jYWxjX21ldGFkYXRhX2Ftb3VudChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzZWN0b3JfdCBsYmxvY2spCitzdGF0aWMgaW50IGV4dDRfY2FsY19tZXRhZGF0YV9hbW91bnQoc3RydWN0IGlub2RlICppbm9kZSwgZXh0NF9sYmxrX3QgbGJsb2NrKQogewogCWlmIChleHQ0X3Rlc3RfaW5vZGVfZmxhZyhpbm9kZSwgRVhUNF9JTk9ERV9FWFRFTlRTKSkKIAkJcmV0dXJuIGV4dDRfZXh0X2NhbGNfbWV0YWRhdGFfYW1vdW50KGlub2RlLCBsYmxvY2spOwpAQCAtMTMyMCw3ICsxMzM3LDcgQEAKIAkgKiBhdm9pZCBkb3VibGUgYWNjb3VudGluZwogCSAqLwogCWlmIChmbGFncyAmIEVYVDRfR0VUX0JMT0NLU19ERUxBTExPQ19SRVNFUlZFKQotCQlFWFQ0X0koaW5vZGUpLT5pX2RlbGFsbG9jX3Jlc2VydmVkX2ZsYWcgPSAxOworCQlleHQ0X3NldF9pbm9kZV9zdGF0ZShpbm9kZSwgRVhUNF9TVEFURV9ERUxBTExPQ19SRVNFUlZFRCk7CiAJLyoKIAkgKiBXZSBuZWVkIHRvIGNoZWNrIGZvciBFWFQ0IGhlcmUgYmVjYXVzZSBtaWdyYXRlCiAJICogY291bGQgaGF2ZSBjaGFuZ2VkIHRoZSBpbm9kZSB0eXBlIGluIGJldHdlZW4KQEAgLTEzNTAsNyArMTM2Nyw3IEBACiAJCQlleHQ0X2RhX3VwZGF0ZV9yZXNlcnZlX3NwYWNlKGlub2RlLCByZXR2YWwsIDEpOwogCX0KIAlpZiAoZmxhZ3MgJiBFWFQ0X0dFVF9CTE9DS1NfREVMQUxMT0NfUkVTRVJWRSkKLQkJRVhUNF9JKGlub2RlKS0+aV9kZWxhbGxvY19yZXNlcnZlZF9mbGFnID0gMDsKKwkJZXh0NF9jbGVhcl9pbm9kZV9zdGF0ZShpbm9kZSwgRVhUNF9TVEFURV9ERUxBTExPQ19SRVNFUlZFRCk7CiAKIAl1cF93cml0ZSgoJkVYVDRfSShpbm9kZSktPmlfZGF0YV9zZW0pKTsKIAlpZiAocmV0dmFsID4gMCAmJiBtYXAtPm1fZmxhZ3MgJiBFWFQ0X01BUF9NQVBQRUQpIHsKQEAgLTE4NzgsNyArMTg5NSw3IEBACiAvKgogICogUmVzZXJ2ZSBhIHNpbmdsZSBibG9jayBsb2NhdGVkIGF0IGxibG9jawogICovCi1zdGF0aWMgaW50IGV4dDRfZGFfcmVzZXJ2ZV9zcGFjZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzZWN0b3JfdCBsYmxvY2spCitzdGF0aWMgaW50IGV4dDRfZGFfcmVzZXJ2ZV9zcGFjZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBleHQ0X2xibGtfdCBsYmxvY2spCiB7CiAJaW50IHJldHJpZXMgPSAwOwogCXN0cnVjdCBleHQ0X3NiX2luZm8gKnNiaSA9IEVYVDRfU0IoaW5vZGUtPmlfc2IpOwpAQCAtMjIzOSw3ICsyMjU2LDcgQEAKIAkgKiBhZmZlY3RzIGZ1bmN0aW9ucyBpbiBtYW55IGRpZmZlcmVudCBwYXJ0cyBvZiB0aGUgYWxsb2NhdGlvbgogCSAqIGNhbGwgcGF0aC4gIFRoaXMgZmxhZyBleGlzdHMgcHJpbWFyaWx5IGJlY2F1c2Ugd2UgZG9uJ3QKIAkgKiB3YW50IHRvIGNoYW5nZSAqbWFueSogY2FsbCBmdW5jdGlvbnMsIHNvIGV4dDRfbWFwX2Jsb2NrcygpCi0JICogd2lsbCBzZXQgdGhlIG1hZ2ljIGlfZGVsYWxsb2NfcmVzZXJ2ZWRfZmxhZyBvbmNlIHRoZQorCSAqIHdpbGwgc2V0IHRoZSBFWFQ0X1NUQVRFX0RFTEFMTE9DX1JFU0VSVkVEIGZsYWcgb25jZSB0aGUKIAkgKiBpbm9kZSdzIGFsbG9jYXRpb24gc2VtYXBob3JlIGlzIHRha2VuLgogCSAqCiAJICogSWYgdGhlIGJsb2NrcyBpbiBxdWVzdGlvbnMgd2VyZSBkZWxhbGxvYyBibG9ja3MsIHNldApAQCAtMzcyMCw4ICszNzM3LDcgQEAKIHJldHJ5OgogCWlvX2VuZCA9IGV4dDRfaW5pdF9pb19lbmQoaW5vZGUsIEdGUF9BVE9NSUMpOwogCWlmICghaW9fZW5kKSB7Ci0JCWlmIChwcmludGtfcmF0ZWxpbWl0KCkpCi0JCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogYWxsb2NhdGlvbiBmYWlsXG4iLCBfX2Z1bmNfXyk7CisJCXByX3dhcm5pbmdfcmF0ZWxpbWl0ZWQoIiVzOiBhbGxvY2F0aW9uIGZhaWxcbiIsIF9fZnVuY19fKTsKIAkJc2NoZWR1bGUoKTsKIAkJZ290byByZXRyeTsKIAl9CkBAIC00MDQ1LDcgKzQwNjEsNyBAQAogCWlmIChleHQ0X3Nob3VsZF9qb3VybmFsX2RhdGEoaW5vZGUpKSB7CiAJCWVyciA9IGV4dDRfaGFuZGxlX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgaW5vZGUsIGJoKTsKIAl9IGVsc2UgewotCQlpZiAoZXh0NF9zaG91bGRfb3JkZXJfZGF0YShpbm9kZSkpCisJCWlmIChleHQ0X3Nob3VsZF9vcmRlcl9kYXRhKGlub2RlKSAmJiBFWFQ0X0koaW5vZGUpLT5qaW5vZGUpCiAJCQllcnIgPSBleHQ0X2piZDJfZmlsZV9pbm9kZShoYW5kbGUsIGlub2RlKTsKIAkJbWFya19idWZmZXJfZGlydHkoYmgpOwogCX0KQEAgLTQxNjksNiArNDE4NSw3IEBACiB7CiAJX19sZTMyICpwOwogCWludAlmbGFncyA9IEVYVDRfRlJFRV9CTE9DS1NfRk9SR0VUIHwgRVhUNF9GUkVFX0JMT0NLU19WQUxJREFURUQ7CisJaW50CWVycjsKIAogCWlmIChTX0lTRElSKGlub2RlLT5pX21vZGUpIHx8IFNfSVNMTksoaW5vZGUtPmlfbW9kZSkpCiAJCWZsYWdzIHw9IEVYVDRfRlJFRV9CTE9DS1NfTUVUQURBVEE7CkBAIC00MTg0LDExICs0MjAxLDIzIEBACiAJaWYgKHRyeV90b19leHRlbmRfdHJhbnNhY3Rpb24oaGFuZGxlLCBpbm9kZSkpIHsKIAkJaWYgKGJoKSB7CiAJCQlCVUZGRVJfVFJBQ0UoYmgsICJjYWxsIGV4dDRfaGFuZGxlX2RpcnR5X21ldGFkYXRhIik7Ci0JCQlleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGlub2RlLCBiaCk7CisJCQllcnIgPSBleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGlub2RlLCBiaCk7CisJCQlpZiAodW5saWtlbHkoZXJyKSkgeworCQkJCWV4dDRfc3RkX2Vycm9yKGlub2RlLT5pX3NiLCBlcnIpOworCQkJCXJldHVybiAxOworCQkJfQogCQl9Ci0JCWV4dDRfbWFya19pbm9kZV9kaXJ0eShoYW5kbGUsIGlub2RlKTsKLQkJZXh0NF90cnVuY2F0ZV9yZXN0YXJ0X3RyYW5zKGhhbmRsZSwgaW5vZGUsCi0JCQkJCSAgICBibG9ja3NfZm9yX3RydW5jYXRlKGlub2RlKSk7CisJCWVyciA9IGV4dDRfbWFya19pbm9kZV9kaXJ0eShoYW5kbGUsIGlub2RlKTsKKwkJaWYgKHVubGlrZWx5KGVycikpIHsKKwkJCWV4dDRfc3RkX2Vycm9yKGlub2RlLT5pX3NiLCBlcnIpOworCQkJcmV0dXJuIDE7CisJCX0KKwkJZXJyID0gZXh0NF90cnVuY2F0ZV9yZXN0YXJ0X3RyYW5zKGhhbmRsZSwgaW5vZGUsCisJCQkJCQkgIGJsb2Nrc19mb3JfdHJ1bmNhdGUoaW5vZGUpKTsKKwkJaWYgKHVubGlrZWx5KGVycikpIHsKKwkJCWV4dDRfc3RkX2Vycm9yKGlub2RlLT5pX3NiLCBlcnIpOworCQkJcmV0dXJuIDE7CisJCX0KIAkJaWYgKGJoKSB7CiAJCQlCVUZGRVJfVFJBQ0UoYmgsICJyZXRha2luZyB3cml0ZSBhY2Nlc3MiKTsKIAkJCWV4dDRfam91cm5hbF9nZXRfd3JpdGVfYWNjZXNzKGhhbmRsZSwgYmgpOwpAQCAtNDM0OSw2ICs0Mzc4LDcgQEAKIAkJCQkJKF9fbGUzMiAqKSBiaC0+Yl9kYXRhLAogCQkJCQkoX19sZTMyICopIGJoLT5iX2RhdGEgKyBhZGRyX3Blcl9ibG9jaywKIAkJCQkJZGVwdGgpOworCQkJYnJlbHNlKGJoKTsKIAogCQkJLyoKIAkJCSAqIEV2ZXJ5dGhpbmcgYmVsb3cgdGhpcyB0aGlzIHBvaW50ZXIgaGFzIGJlZW4KQEAgLTQ4NTksNyArNDg4OSw3IEBACiAJfQogCWlub2RlLT5pX25saW5rID0gbGUxNl90b19jcHUocmF3X2lub2RlLT5pX2xpbmtzX2NvdW50KTsKIAotCWVpLT5pX3N0YXRlX2ZsYWdzID0gMDsKKwlleHQ0X2NsZWFyX3N0YXRlX2ZsYWdzKGVpKTsJLyogT25seSByZWxldmFudCBvbiAzMi1iaXQgYXJjaHMgKi8KIAllaS0+aV9kaXJfc3RhcnRfbG9va3VwID0gMDsKIAllaS0+aV9kdGltZSA9IGxlMzJfdG9fY3B1KHJhd19pbm9kZS0+aV9kdGltZSk7CiAJLyogV2Ugbm93IGhhdmUgZW5vdWdoIGZpZWxkcyB0byBjaGVjayBpZiB0aGUgaW5vZGUgd2FzIGFjdGl2ZSBvciBub3QuCkBAIC01MTE4LDcgKzUxNDgsNyBAQAogCWlmIChleHQ0X2lub2RlX2Jsb2Nrc19zZXQoaGFuZGxlLCByYXdfaW5vZGUsIGVpKSkKIAkJZ290byBvdXRfYnJlbHNlOwogCXJhd19pbm9kZS0+aV9kdGltZSA9IGNwdV90b19sZTMyKGVpLT5pX2R0aW1lKTsKLQlyYXdfaW5vZGUtPmlfZmxhZ3MgPSBjcHVfdG9fbGUzMihlaS0+aV9mbGFncyk7CisJcmF3X2lub2RlLT5pX2ZsYWdzID0gY3B1X3RvX2xlMzIoZWktPmlfZmxhZ3MgJiAweEZGRkZGRkZGKTsKIAlpZiAoRVhUNF9TQihpbm9kZS0+aV9zYiktPnNfZXMtPnNfY3JlYXRvcl9vcyAhPQogCSAgICBjcHVfdG9fbGUzMihFWFQ0X09TX0hVUkQpKQogCQlyYXdfaW5vZGUtPmlfZmlsZV9hY2xfaGlnaCA9CmRpZmYgLS1naXQgYS9mcy9leHQ0L21iYWxsb2MuYyBiL2ZzL2V4dDQvbWJhbGxvYy5jCmluZGV4IDViNGQ0ZTMuLjg1MWY0OWIgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDQvbWJhbGxvYy5jCisrKyBiL2ZzL2V4dDQvbWJhbGxvYy5jCkBAIC0yNjA4LDE4ICsyNjA4LDEyIEBACiBzdGF0aWMgaW5saW5lIGludCBleHQ0X2lzc3VlX2Rpc2NhcmQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKIAkJZXh0NF9ncm91cF90IGJsb2NrX2dyb3VwLCBleHQ0X2dycGJsa190IGJsb2NrLCBpbnQgY291bnQpCiB7Ci0JaW50IHJldDsKIAlleHQ0X2ZzYmxrX3QgZGlzY2FyZF9ibG9jazsKIAogCWRpc2NhcmRfYmxvY2sgPSBibG9jayArIGV4dDRfZ3JvdXBfZmlyc3RfYmxvY2tfbm8oc2IsIGJsb2NrX2dyb3VwKTsKIAl0cmFjZV9leHQ0X2Rpc2NhcmRfYmxvY2tzKHNiLAogCQkJKHVuc2lnbmVkIGxvbmcgbG9uZykgZGlzY2FyZF9ibG9jaywgY291bnQpOwotCXJldCA9IHNiX2lzc3VlX2Rpc2NhcmQoc2IsIGRpc2NhcmRfYmxvY2ssIGNvdW50LCBHRlBfTk9GUywgMCk7Ci0JaWYgKHJldCA9PSAtRU9QTk9UU1VQUCkgewotCQlleHQ0X3dhcm5pbmcoc2IsICJkaXNjYXJkIG5vdCBzdXBwb3J0ZWQsIGRpc2FibGluZyIpOwotCQljbGVhcl9vcHQoRVhUNF9TQihzYiktPnNfbW91bnRfb3B0LCBESVNDQVJEKTsKLQl9Ci0JcmV0dXJuIHJldDsKKwlyZXR1cm4gc2JfaXNzdWVfZGlzY2FyZChzYiwgZGlzY2FyZF9ibG9jaywgY291bnQsIEdGUF9OT0ZTLCAwKTsKIH0KIAogLyoKQEAgLTI2MzEsNyArMjYyNSw3IEBACiAJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGpvdXJuYWwtPmpfcHJpdmF0ZTsKIAlzdHJ1Y3QgZXh0NF9idWRkeSBlNGI7CiAJc3RydWN0IGV4dDRfZ3JvdXBfaW5mbyAqZGI7Ci0JaW50IGVyciwgY291bnQgPSAwLCBjb3VudDIgPSAwOworCWludCBlcnIsIHJldCwgY291bnQgPSAwLCBjb3VudDIgPSAwOwogCXN0cnVjdCBleHQ0X2ZyZWVfZGF0YSAqZW50cnk7CiAJc3RydWN0IGxpc3RfaGVhZCAqbCwgKmx0bXA7CiAKQEAgLTI2NDEsOSArMjYzNSwxNSBAQAogCQltYl9kZWJ1ZygxLCAiZ29ubmEgZnJlZSAldSBibG9ja3MgaW4gZ3JvdXAgJXUgKDB4JXApOiIsCiAJCQkgZW50cnktPmNvdW50LCBlbnRyeS0+Z3JvdXAsIGVudHJ5KTsKIAotCQlpZiAodGVzdF9vcHQoc2IsIERJU0NBUkQpKQotCQkJZXh0NF9pc3N1ZV9kaXNjYXJkKHNiLCBlbnRyeS0+Z3JvdXAsCisJCWlmICh0ZXN0X29wdChzYiwgRElTQ0FSRCkpIHsKKwkJCXJldCA9IGV4dDRfaXNzdWVfZGlzY2FyZChzYiwgZW50cnktPmdyb3VwLAogCQkJCQllbnRyeS0+c3RhcnRfYmxrLCBlbnRyeS0+Y291bnQpOworCQkJaWYgKHVubGlrZWx5KHJldCA9PSAtRU9QTk9UU1VQUCkpIHsKKwkJCQlleHQ0X3dhcm5pbmcoc2IsICJkaXNjYXJkIG5vdCBzdXBwb3J0ZWQsICIKKwkJCQkJCSAiZGlzYWJsaW5nIik7CisJCQkJY2xlYXJfb3B0KHNiLCBESVNDQVJEKTsKKwkJCX0KKwkJfQogCiAJCWVyciA9IGV4dDRfbWJfbG9hZF9idWRkeShzYiwgZW50cnktPmdyb3VwLCAmZTRiKTsKIAkJLyogd2UgZXhwZWN0IHRvIGZpbmQgZXhpc3RpbmcgYnVkZHkgYmVjYXVzZSBpdCdzIHBpbm5lZCAqLwpAQCAtMzg4MSwxOSArMzg4MSw2IEBACiAJfQogfQogCi0vKgotICogZmluZHMgYWxsIHByZWFsbG9jYXRlZCBzcGFjZXMgYW5kIHJldHVybiBibG9ja3MgYmVpbmcgZnJlZWQgdG8gdGhlbQotICogaWYgcHJlYWxsb2NhdGVkIHNwYWNlIGJlY29tZXMgZnVsbCAobm8gYmxvY2sgaXMgdXNlZCBmcm9tIHRoZSBzcGFjZSkKLSAqIHRoZW4gdGhlIGZ1bmN0aW9uIGZyZWVzIHNwYWNlIGluIGJ1ZGR5Ci0gKiBYWFg6IGF0IHRoZSBtb21lbnQsIHRydW5jYXRlICh3aGljaCBpcyB0aGUgb25seSB3YXkgdG8gZnJlZSBibG9ja3MpCi0gKiBkaXNjYXJkcyBhbGwgcHJlYWxsb2NhdGlvbnMKLSAqLwotc3RhdGljIHZvaWQgZXh0NF9tYl9yZXR1cm5fdG9fcHJlYWxsb2NhdGlvbihzdHJ1Y3QgaW5vZGUgKmlub2RlLAotCQkJCQlzdHJ1Y3QgZXh0NF9idWRkeSAqZTRiLAotCQkJCQlzZWN0b3JfdCBibG9jaywgaW50IGNvdW50KQotewotCUJVR19PTighbGlzdF9lbXB0eSgmRVhUNF9JKGlub2RlKS0+aV9wcmVhbGxvY19saXN0KSk7Ci19CiAjaWZkZWYgQ09ORklHX0VYVDRfREVCVUcKIHN0YXRpYyB2b2lkIGV4dDRfbWJfc2hvd19hYyhzdHJ1Y3QgZXh0NF9hbGxvY2F0aW9uX2NvbnRleHQgKmFjKQogewpAQCAtNDI4Myw3ICs0MjcwLDcgQEAKIAkgKiBFRFFVT1QgY2hlY2ssIGFzIGJsb2NrcyBhbmQgcXVvdGFzIGhhdmUgYmVlbiBhbHJlYWR5CiAJICogcmVzZXJ2ZWQgd2hlbiBkYXRhIGJlaW5nIGNvcGllZCBpbnRvIHBhZ2VjYWNoZS4KIAkgKi8KLQlpZiAoRVhUNF9JKGFyLT5pbm9kZSktPmlfZGVsYWxsb2NfcmVzZXJ2ZWRfZmxhZykKKwlpZiAoZXh0NF90ZXN0X2lub2RlX3N0YXRlKGFyLT5pbm9kZSwgRVhUNF9TVEFURV9ERUxBTExPQ19SRVNFUlZFRCkpCiAJCWFyLT5mbGFncyB8PSBFWFQ0X01CX0RFTEFMTE9DX1JFU0VSVkVEOwogCWVsc2UgewogCQkvKiBXaXRob3V0IGRlbGF5ZWQgYWxsb2NhdGlvbiB3ZSBuZWVkIHRvIHZlcmlmeQpAQCAtNDM4MCw3ICs0MzY3LDggQEAKIAlpZiAoaW5xdW90YSAmJiBhci0+bGVuIDwgaW5xdW90YSkKIAkJZHF1b3RfZnJlZV9ibG9jayhhci0+aW5vZGUsIGlucXVvdGEgLSBhci0+bGVuKTsKIAlpZiAoIWFyLT5sZW4pIHsKLQkJaWYgKCFFWFQ0X0koYXItPmlub2RlKS0+aV9kZWxhbGxvY19yZXNlcnZlZF9mbGFnKQorCQlpZiAoIWV4dDRfdGVzdF9pbm9kZV9zdGF0ZShhci0+aW5vZGUsCisJCQkJCSAgIEVYVDRfU1RBVEVfREVMQUxMT0NfUkVTRVJWRUQpKQogCQkJLyogcmVsZWFzZSBhbGwgdGhlIHJlc2VydmVkIGJsb2NrcyBpZiBub24gZGVsYWxsb2MgKi8KIAkJCXBlcmNwdV9jb3VudGVyX3N1Yigmc2JpLT5zX2RpcnR5YmxvY2tzX2NvdW50ZXIsCiAJCQkJCQlyZXNlcnZfYmxrcyk7CkBAIC00NjI2LDcgKzQ2MTQsMTEgQEAKIAkJICogYmxvY2tzIGJlaW5nIGZyZWVkIGFyZSBtZXRhZGF0YS4gdGhlc2UgYmxvY2tzIHNob3VsZG4ndAogCQkgKiBiZSB1c2VkIHVudGlsIHRoaXMgdHJhbnNhY3Rpb24gaXMgY29tbWl0dGVkCiAJCSAqLwotCQluZXdfZW50cnkgID0ga21lbV9jYWNoZV9hbGxvYyhleHQ0X2ZyZWVfZXh0X2NhY2hlcCwgR0ZQX05PRlMpOworCQluZXdfZW50cnkgPSBrbWVtX2NhY2hlX2FsbG9jKGV4dDRfZnJlZV9leHRfY2FjaGVwLCBHRlBfTk9GUyk7CisJCWlmICghbmV3X2VudHJ5KSB7CisJCQllcnIgPSAtRU5PTUVNOworCQkJZ290byBlcnJvcl9yZXR1cm47CisJCX0KIAkJbmV3X2VudHJ5LT5zdGFydF9ibGsgPSBiaXQ7CiAJCW5ld19lbnRyeS0+Z3JvdXAgID0gYmxvY2tfZ3JvdXA7CiAJCW5ld19lbnRyeS0+Y291bnQgPSBjb3VudDsKQEAgLTQ2NDMsNyArNDYzNSw2IEBACiAJCWV4dDRfbG9ja19ncm91cChzYiwgYmxvY2tfZ3JvdXApOwogCQltYl9jbGVhcl9iaXRzKGJpdG1hcF9iaC0+Yl9kYXRhLCBiaXQsIGNvdW50KTsKIAkJbWJfZnJlZV9ibG9ja3MoaW5vZGUsICZlNGIsIGJpdCwgY291bnQpOwotCQlleHQ0X21iX3JldHVybl90b19wcmVhbGxvY2F0aW9uKGlub2RlLCAmZTRiLCBibG9jaywgY291bnQpOwogCX0KIAogCXJldCA9IGV4dDRfZnJlZV9ibGtzX2NvdW50KHNiLCBnZHApICsgY291bnQ7CkBAIC00NzE4LDggKzQ3MDksNiBAQAogCWV4dDRfdW5sb2NrX2dyb3VwKHNiLCBncm91cCk7CiAKIAlyZXQgPSBleHQ0X2lzc3VlX2Rpc2NhcmQoc2IsIGdyb3VwLCBzdGFydCwgY291bnQpOwotCWlmIChyZXQpCi0JCWV4dDRfc3RkX2Vycm9yKHNiLCByZXQpOwogCiAJZXh0NF9sb2NrX2dyb3VwKHNiLCBncm91cCk7CiAJbWJfZnJlZV9ibG9ja3MoTlVMTCwgZTRiLCBzdGFydCwgZXguZmVfbGVuKTsKQEAgLTQ4MTksNiArNDgwOCw4IEBACiAJZXh0NF9ncm91cF90IGdyb3VwLCBuZ3JvdXBzID0gZXh0NF9nZXRfZ3JvdXBzX2NvdW50KHNiKTsKIAlleHQ0X2dycGJsa190IGNudCA9IDAsIGZpcnN0X2Jsb2NrLCBsYXN0X2Jsb2NrOwogCXVpbnQ2NF90IHN0YXJ0LCBsZW4sIG1pbmxlbiwgdHJpbW1lZDsKKwlleHQ0X2ZzYmxrX3QgZmlyc3RfZGF0YV9ibGsgPQorCQkJbGUzMl90b19jcHUoRVhUNF9TQihzYiktPnNfZXMtPnNfZmlyc3RfZGF0YV9ibG9jayk7CiAJaW50IHJldCA9IDA7CiAKIAlzdGFydCA9IHJhbmdlLT5zdGFydCA+PiBzYi0+c19ibG9ja3NpemVfYml0czsKQEAgLTQ4MjgsNiArNDgxOSwxMCBAQAogCiAJaWYgKHVubGlrZWx5KG1pbmxlbiA+IEVYVDRfQkxPQ0tTX1BFUl9HUk9VUChzYikpKQogCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoc3RhcnQgPCBmaXJzdF9kYXRhX2JsaykgeworCQlsZW4gLT0gZmlyc3RfZGF0YV9ibGsgLSBzdGFydDsKKwkJc3RhcnQgPSBmaXJzdF9kYXRhX2JsazsKKwl9CiAKIAkvKiBEZXRlcm1pbmUgZmlyc3QgYW5kIGxhc3QgZ3JvdXAgdG8gZXhhbWluZSBiYXNlZCBvbiBzdGFydCBhbmQgbGVuICovCiAJZXh0NF9nZXRfZ3JvdXBfbm9fYW5kX29mZnNldChzYiwgKGV4dDRfZnNibGtfdCkgc3RhcnQsCkBAIC00ODUxLDcgKzQ4NDYsNyBAQAogCQlpZiAobGVuID49IEVYVDRfQkxPQ0tTX1BFUl9HUk9VUChzYikpCiAJCQlsZW4gLT0gKEVYVDRfQkxPQ0tTX1BFUl9HUk9VUChzYikgLSBmaXJzdF9ibG9jayk7CiAJCWVsc2UKLQkJCWxhc3RfYmxvY2sgPSBsZW47CisJCQlsYXN0X2Jsb2NrID0gZmlyc3RfYmxvY2sgKyBsZW47CiAKIAkJaWYgKGU0Yi5iZF9pbmZvLT5iYl9mcmVlID49IG1pbmxlbikgewogCQkJY250ID0gZXh0NF90cmltX2FsbF9mcmVlKHNiLCAmZTRiLCBmaXJzdF9ibG9jaywKZGlmZiAtLWdpdCBhL2ZzL2V4dDQvbWlncmF0ZS5jIGIvZnMvZXh0NC9taWdyYXRlLmMKaW5kZXggMjVmM2E5Ny4uYjBhMTI2ZiAxMDA2NDQKLS0tIGEvZnMvZXh0NC9taWdyYXRlLmMKKysrIGIvZnMvZXh0NC9taWdyYXRlLmMKQEAgLTQ5Niw3ICs0OTYsNyBAQAogCWdvYWwgPSAoKChpbm9kZS0+aV9pbm8gLSAxKSAvIEVYVDRfSU5PREVTX1BFUl9HUk9VUChpbm9kZS0+aV9zYikpICoKIAkJRVhUNF9JTk9ERVNfUEVSX0dST1VQKGlub2RlLT5pX3NiKSkgKyAxOwogCXRtcF9pbm9kZSA9IGV4dDRfbmV3X2lub2RlKGhhbmRsZSwgaW5vZGUtPmlfc2ItPnNfcm9vdC0+ZF9pbm9kZSwKLQkJCQkgICBTX0lGUkVHLCAwLCBnb2FsKTsKKwkJCQkgICBTX0lGUkVHLCBOVUxMLCBnb2FsKTsKIAlpZiAoSVNfRVJSKHRtcF9pbm9kZSkpIHsKIAkJcmV0dmFsID0gLUVOT01FTTsKIAkJZXh0NF9qb3VybmFsX3N0b3AoaGFuZGxlKTsKZGlmZiAtLWdpdCBhL2ZzL2V4dDQvbmFtZWkuYyBiL2ZzL2V4dDQvbmFtZWkuYwppbmRleCBkYzQwZTc1Li41NDg1MzkwIDEwMDY0NAotLS0gYS9mcy9leHQ0L25hbWVpLmMKKysrIGIvZnMvZXh0NC9uYW1laS5jCkBAIC01ODEsOSArNTgxLDkgQEAKIAkJCQkJICAgZGlyLT5pX3NiLT5zX2Jsb2Nrc2l6ZSAtCiAJCQkJCSAgIEVYVDRfRElSX1JFQ19MRU4oMCkpOwogCWZvciAoOyBkZSA8IHRvcDsgZGUgPSBleHQ0X25leHRfZW50cnkoZGUsIGRpci0+aV9zYi0+c19ibG9ja3NpemUpKSB7Ci0JCWlmICghZXh0NF9jaGVja19kaXJfZW50cnkoZGlyLCBkZSwgYmgsCi0JCQkJCShibG9jazw8RVhUNF9CTE9DS19TSVpFX0JJVFMoZGlyLT5pX3NiKSkKLQkJCQkJCSsoKGNoYXIgKilkZSAtIGJoLT5iX2RhdGEpKSkgeworCQlpZiAoZXh0NF9jaGVja19kaXJfZW50cnkoZGlyLCBOVUxMLCBkZSwgYmgsCisJCQkJKGJsb2NrPDxFWFQ0X0JMT0NLX1NJWkVfQklUUyhkaXItPmlfc2IpKQorCQkJCQkgKyAoKGNoYXIgKilkZSAtIGJoLT5iX2RhdGEpKSkgewogCQkJLyogT24gZXJyb3IsIHNraXAgdGhlIGZfcG9zIHRvIHRoZSBuZXh0IGJsb2NrLiAqLwogCQkJZGlyX2ZpbGUtPmZfcG9zID0gKGRpcl9maWxlLT5mX3BvcyB8CiAJCQkJCShkaXItPmlfc2ItPnNfYmxvY2tzaXplIC0gMSkpICsgMTsKQEAgLTgyMCw3ICs4MjAsNyBAQAogCQlpZiAoKGNoYXIgKikgZGUgKyBuYW1lbGVuIDw9IGRsaW1pdCAmJgogCQkgICAgZXh0NF9tYXRjaCAobmFtZWxlbiwgbmFtZSwgZGUpKSB7CiAJCQkvKiBmb3VuZCBhIG1hdGNoIC0ganVzdCB0byBiZSBzdXJlLCBkbyBhIGZ1bGwgY2hlY2sgKi8KLQkJCWlmICghZXh0NF9jaGVja19kaXJfZW50cnkoZGlyLCBkZSwgYmgsIG9mZnNldCkpCisJCQlpZiAoZXh0NF9jaGVja19kaXJfZW50cnkoZGlyLCBOVUxMLCBkZSwgYmgsIG9mZnNldCkpCiAJCQkJcmV0dXJuIC0xOwogCQkJKnJlc19kaXIgPSBkZTsKIAkJCXJldHVybiAxOwpAQCAtMTAzNiw3ICsxMDM2LDcgQEAKIAkJCXJldHVybiBFUlJfUFRSKC1FSU8pOwogCQl9CiAJCWlub2RlID0gZXh0NF9pZ2V0KGRpci0+aV9zYiwgaW5vKTsKLQkJaWYgKHVubGlrZWx5KElTX0VSUihpbm9kZSkpKSB7CisJCWlmIChJU19FUlIoaW5vZGUpKSB7CiAJCQlpZiAoUFRSX0VSUihpbm9kZSkgPT0gLUVTVEFMRSkgewogCQkJCUVYVDRfRVJST1JfSU5PREUoZGlyLAogCQkJCQkJICJkZWxldGVkIGlub2RlIHJlZmVyZW5jZWQ6ICV1IiwKQEAgLTEyNjksNyArMTI2OSw3IEBACiAJCWRlID0gKHN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICopYmgtPmJfZGF0YTsKIAkJdG9wID0gYmgtPmJfZGF0YSArIGJsb2Nrc2l6ZSAtIHJlY2xlbjsKIAkJd2hpbGUgKChjaGFyICopIGRlIDw9IHRvcCkgewotCQkJaWYgKCFleHQ0X2NoZWNrX2Rpcl9lbnRyeShkaXIsIGRlLCBiaCwgb2Zmc2V0KSkKKwkJCWlmIChleHQ0X2NoZWNrX2Rpcl9lbnRyeShkaXIsIE5VTEwsIGRlLCBiaCwgb2Zmc2V0KSkKIAkJCQlyZXR1cm4gLUVJTzsKIAkJCWlmIChleHQ0X21hdGNoKG5hbWVsZW4sIG5hbWUsIGRlKSkKIAkJCQlyZXR1cm4gLUVFWElTVDsKQEAgLTE2MDIsNyArMTYwMiwxMSBAQAogCQkJaWYgKGVycikKIAkJCQlnb3RvIGpvdXJuYWxfZXJyb3I7CiAJCX0KLQkJZXh0NF9oYW5kbGVfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBpbm9kZSwgZnJhbWVzWzBdLmJoKTsKKwkJZXJyID0gZXh0NF9oYW5kbGVfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBpbm9kZSwgZnJhbWVzWzBdLmJoKTsKKwkJaWYgKGVycikgeworCQkJZXh0NF9zdGRfZXJyb3IoaW5vZGUtPmlfc2IsIGVycik7CisJCQlnb3RvIGNsZWFudXA7CisJCX0KIAl9CiAJZGUgPSBkb19zcGxpdChoYW5kbGUsIGRpciwgJmJoLCBmcmFtZSwgJmhpbmZvLCAmZXJyKTsKIAlpZiAoIWRlKQpAQCAtMTYzMCwxNyArMTYzNCwyMSBAQAogewogCXN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICpkZSwgKnBkZTsKIAl1bnNpZ25lZCBpbnQgYmxvY2tzaXplID0gZGlyLT5pX3NiLT5zX2Jsb2Nrc2l6ZTsKLQlpbnQgaTsKKwlpbnQgaSwgZXJyOwogCiAJaSA9IDA7CiAJcGRlID0gTlVMTDsKIAlkZSA9IChzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqKSBiaC0+Yl9kYXRhOwogCXdoaWxlIChpIDwgYmgtPmJfc2l6ZSkgewotCQlpZiAoIWV4dDRfY2hlY2tfZGlyX2VudHJ5KGRpciwgZGUsIGJoLCBpKSkKKwkJaWYgKGV4dDRfY2hlY2tfZGlyX2VudHJ5KGRpciwgTlVMTCwgZGUsIGJoLCBpKSkKIAkJCXJldHVybiAtRUlPOwogCQlpZiAoZGUgPT0gZGVfZGVsKSAgewogCQkJQlVGRkVSX1RSQUNFKGJoLCAiZ2V0X3dyaXRlX2FjY2VzcyIpOwotCQkJZXh0NF9qb3VybmFsX2dldF93cml0ZV9hY2Nlc3MoaGFuZGxlLCBiaCk7CisJCQllcnIgPSBleHQ0X2pvdXJuYWxfZ2V0X3dyaXRlX2FjY2VzcyhoYW5kbGUsIGJoKTsKKwkJCWlmICh1bmxpa2VseShlcnIpKSB7CisJCQkJZXh0NF9zdGRfZXJyb3IoZGlyLT5pX3NiLCBlcnIpOworCQkJCXJldHVybiBlcnI7CisJCQl9CiAJCQlpZiAocGRlKQogCQkJCXBkZS0+cmVjX2xlbiA9IGV4dDRfcmVjX2xlbl90b19kaXNrKAogCQkJCQlleHQ0X3JlY19sZW5fZnJvbV9kaXNrKHBkZS0+cmVjX2xlbiwKQEAgLTE2NTIsNyArMTY2MCwxMSBAQAogCQkJCWRlLT5pbm9kZSA9IDA7CiAJCQlkaXItPmlfdmVyc2lvbisrOwogCQkJQlVGRkVSX1RSQUNFKGJoLCAiY2FsbCBleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YSIpOwotCQkJZXh0NF9oYW5kbGVfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBkaXIsIGJoKTsKKwkJCWVyciA9IGV4dDRfaGFuZGxlX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgZGlyLCBiaCk7CisJCQlpZiAodW5saWtlbHkoZXJyKSkgeworCQkJCWV4dDRfc3RkX2Vycm9yKGRpci0+aV9zYiwgZXJyKTsKKwkJCQlyZXR1cm4gZXJyOworCQkJfQogCQkJcmV0dXJuIDA7CiAJCX0KIAkJaSArPSBleHQ0X3JlY19sZW5fZnJvbV9kaXNrKGRlLT5yZWNfbGVuLCBibG9ja3NpemUpOwpAQCAtMTc4OSw3ICsxODAxLDcgQEAKIHsKIAloYW5kbGVfdCAqaGFuZGxlOwogCXN0cnVjdCBpbm9kZSAqaW5vZGU7Ci0Jc3RydWN0IGJ1ZmZlcl9oZWFkICpkaXJfYmxvY2s7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpkaXJfYmxvY2sgPSBOVUxMOwogCXN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICpkZTsKIAl1bnNpZ25lZCBpbnQgYmxvY2tzaXplID0gZGlyLT5pX3NiLT5zX2Jsb2Nrc2l6ZTsKIAlpbnQgZXJyLCByZXRyaWVzID0gMDsKQEAgLTE4MjIsNyArMTgzNCw5IEBACiAJaWYgKCFkaXJfYmxvY2spCiAJCWdvdG8gb3V0X2NsZWFyX2lub2RlOwogCUJVRkZFUl9UUkFDRShkaXJfYmxvY2ssICJnZXRfd3JpdGVfYWNjZXNzIik7Ci0JZXh0NF9qb3VybmFsX2dldF93cml0ZV9hY2Nlc3MoaGFuZGxlLCBkaXJfYmxvY2spOworCWVyciA9IGV4dDRfam91cm5hbF9nZXRfd3JpdGVfYWNjZXNzKGhhbmRsZSwgZGlyX2Jsb2NrKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dF9jbGVhcl9pbm9kZTsKIAlkZSA9IChzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqKSBkaXJfYmxvY2stPmJfZGF0YTsKIAlkZS0+aW5vZGUgPSBjcHVfdG9fbGUzMihpbm9kZS0+aV9pbm8pOwogCWRlLT5uYW1lX2xlbiA9IDE7CkBAIC0xODM5LDEwICsxODUzLDEyIEBACiAJZXh0NF9zZXRfZGVfdHlwZShkaXItPmlfc2IsIGRlLCBTX0lGRElSKTsKIAlpbm9kZS0+aV9ubGluayA9IDI7CiAJQlVGRkVSX1RSQUNFKGRpcl9ibG9jaywgImNhbGwgZXh0NF9oYW5kbGVfZGlydHlfbWV0YWRhdGEiKTsKLQlleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGRpciwgZGlyX2Jsb2NrKTsKLQlicmVsc2UoZGlyX2Jsb2NrKTsKLQlleHQ0X21hcmtfaW5vZGVfZGlydHkoaGFuZGxlLCBpbm9kZSk7Ci0JZXJyID0gZXh0NF9hZGRfZW50cnkoaGFuZGxlLCBkZW50cnksIGlub2RlKTsKKwllcnIgPSBleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGRpciwgZGlyX2Jsb2NrKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dF9jbGVhcl9pbm9kZTsKKwllcnIgPSBleHQ0X21hcmtfaW5vZGVfZGlydHkoaGFuZGxlLCBpbm9kZSk7CisJaWYgKCFlcnIpCisJCWVyciA9IGV4dDRfYWRkX2VudHJ5KGhhbmRsZSwgZGVudHJ5LCBpbm9kZSk7CiAJaWYgKGVycikgewogb3V0X2NsZWFyX2lub2RlOgogCQljbGVhcl9ubGluayhpbm9kZSk7CkBAIC0xODUzLDEwICsxODY5LDEzIEBACiAJfQogCWV4dDRfaW5jX2NvdW50KGhhbmRsZSwgZGlyKTsKIAlleHQ0X3VwZGF0ZV9keF9mbGFnKGRpcik7Ci0JZXh0NF9tYXJrX2lub2RlX2RpcnR5KGhhbmRsZSwgZGlyKTsKKwllcnIgPSBleHQ0X21hcmtfaW5vZGVfZGlydHkoaGFuZGxlLCBkaXIpOworCWlmIChlcnIpCisJCWdvdG8gb3V0X2NsZWFyX2lub2RlOwogCWRfaW5zdGFudGlhdGUoZGVudHJ5LCBpbm9kZSk7CiAJdW5sb2NrX25ld19pbm9kZShpbm9kZSk7CiBvdXRfc3RvcDoKKwlicmVsc2UoZGlyX2Jsb2NrKTsKIAlleHQ0X2pvdXJuYWxfc3RvcChoYW5kbGUpOwogCWlmIChlcnIgPT0gLUVOT1NQQyAmJiBleHQ0X3Nob3VsZF9yZXRyeV9hbGxvYyhkaXItPmlfc2IsICZyZXRyaWVzKSkKIAkJZ290byByZXRyeTsKQEAgLTE5MTksNyArMTkzOCw3IEBACiAJCQl9CiAJCQlkZSA9IChzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqKSBiaC0+Yl9kYXRhOwogCQl9Ci0JCWlmICghZXh0NF9jaGVja19kaXJfZW50cnkoaW5vZGUsIGRlLCBiaCwgb2Zmc2V0KSkgeworCQlpZiAoZXh0NF9jaGVja19kaXJfZW50cnkoaW5vZGUsIE5VTEwsIGRlLCBiaCwgb2Zmc2V0KSkgewogCQkJZGUgPSAoc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKikoYmgtPmJfZGF0YSArCiAJCQkJCQkJIHNiLT5zX2Jsb2Nrc2l6ZSk7CiAJCQlvZmZzZXQgPSAob2Zmc2V0IHwgKHNiLT5zX2Jsb2Nrc2l6ZSAtIDEpKSArIDE7CkBAIC0yNDA3LDcgKzI0MjYsMTEgQEAKIAkJCQkJZXh0NF9jdXJyZW50X3RpbWUobmV3X2Rpcik7CiAJCWV4dDRfbWFya19pbm9kZV9kaXJ0eShoYW5kbGUsIG5ld19kaXIpOwogCQlCVUZGRVJfVFJBQ0UobmV3X2JoLCAiY2FsbCBleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YSIpOwotCQlleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIG5ld19kaXIsIG5ld19iaCk7CisJCXJldHZhbCA9IGV4dDRfaGFuZGxlX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgbmV3X2RpciwgbmV3X2JoKTsKKwkJaWYgKHVubGlrZWx5KHJldHZhbCkpIHsKKwkJCWV4dDRfc3RkX2Vycm9yKG5ld19kaXItPmlfc2IsIHJldHZhbCk7CisJCQlnb3RvIGVuZF9yZW5hbWU7CisJCX0KIAkJYnJlbHNlKG5ld19iaCk7CiAJCW5ld19iaCA9IE5VTEw7CiAJfQpAQCAtMjQ1OSw3ICsyNDgyLDExIEBACiAJCVBBUkVOVF9JTk8oZGlyX2JoLT5iX2RhdGEsIG5ld19kaXItPmlfc2ItPnNfYmxvY2tzaXplKSA9CiAJCQkJCQljcHVfdG9fbGUzMihuZXdfZGlyLT5pX2lubyk7CiAJCUJVRkZFUl9UUkFDRShkaXJfYmgsICJjYWxsIGV4dDRfaGFuZGxlX2RpcnR5X21ldGFkYXRhIik7Ci0JCWV4dDRfaGFuZGxlX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgb2xkX2RpciwgZGlyX2JoKTsKKwkJcmV0dmFsID0gZXh0NF9oYW5kbGVfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBvbGRfZGlyLCBkaXJfYmgpOworCQlpZiAocmV0dmFsKSB7CisJCQlleHQ0X3N0ZF9lcnJvcihvbGRfZGlyLT5pX3NiLCByZXR2YWwpOworCQkJZ290byBlbmRfcmVuYW1lOworCQl9CiAJCWV4dDRfZGVjX2NvdW50KGhhbmRsZSwgb2xkX2Rpcik7CiAJCWlmIChuZXdfaW5vZGUpIHsKIAkJCS8qIGNoZWNrZWQgZW1wdHlfZGlyIGFib3ZlLCBjYW4ndCBoYXZlIGFub3RoZXIgcGFyZW50LApkaWZmIC0tZ2l0IGEvZnMvZXh0NC9wYWdlLWlvLmMgYi9mcy9leHQ0L3BhZ2UtaW8uYwppbmRleCBiZWFjY2UxLi43MjcwZGNmIDEwMDY0NAotLS0gYS9mcy9leHQ0L3BhZ2UtaW8uYworKysgYi9mcy9leHQ0L3BhZ2UtaW8uYwpAQCAtNDQsNyArNDQsNyBAQAogCWlmIChpb19wYWdlX2NhY2hlcCA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT01FTTsKIAlpb19lbmRfY2FjaGVwID0gS01FTV9DQUNIRShleHQ0X2lvX2VuZCwgU0xBQl9SRUNMQUlNX0FDQ09VTlQpOwotCWlmIChpb19wYWdlX2NhY2hlcCA9PSBOVUxMKSB7CisJaWYgKGlvX2VuZF9jYWNoZXAgPT0gTlVMTCkgewogCQlrbWVtX2NhY2hlX2Rlc3Ryb3koaW9fcGFnZV9jYWNoZXApOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CkBAIC0xNTgsMTEgKzE1OCw4IEBACiAKIGV4dDRfaW9fZW5kX3QgKmV4dDRfaW5pdF9pb19lbmQoc3RydWN0IGlub2RlICppbm9kZSwgZ2ZwX3QgZmxhZ3MpCiB7Ci0JZXh0NF9pb19lbmRfdCAqaW8gPSBOVUxMOwotCi0JaW8gPSBrbWVtX2NhY2hlX2FsbG9jKGlvX2VuZF9jYWNoZXAsIGZsYWdzKTsKKwlleHQ0X2lvX2VuZF90ICppbyA9IGttZW1fY2FjaGVfemFsbG9jKGlvX2VuZF9jYWNoZXAsIGZsYWdzKTsKIAlpZiAoaW8pIHsKLQkJbWVtc2V0KGlvLCAwLCBzaXplb2YoKmlvKSk7CiAJCWF0b21pY19pbmMoJkVYVDRfSShpbm9kZSktPmlfaW9lbmRfY291bnQpOwogCQlpby0+aW5vZGUgPSBpbm9kZTsKIAkJSU5JVF9XT1JLKCZpby0+d29yaywgZXh0NF9lbmRfaW9fd29yayk7CmRpZmYgLS1naXQgYS9mcy9leHQ0L3Jlc2l6ZS5jIGIvZnMvZXh0NC9yZXNpemUuYwppbmRleCA5ODFjODQ3Li4zZWNjNmU0IDEwMDY0NAotLS0gYS9mcy9leHQ0L3Jlc2l6ZS5jCisrKyBiL2ZzL2V4dDQvcmVzaXplLmMKQEAgLTIyMCw3ICsyMjAsMTEgQEAKIAkJbWVtY3B5KGdkYi0+Yl9kYXRhLCBzYmktPnNfZ3JvdXBfZGVzY1tpXS0+Yl9kYXRhLCBnZGItPmJfc2l6ZSk7CiAJCXNldF9idWZmZXJfdXB0b2RhdGUoZ2RiKTsKIAkJdW5sb2NrX2J1ZmZlcihnZGIpOwotCQlleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIE5VTEwsIGdkYik7CisJCWVyciA9IGV4dDRfaGFuZGxlX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgTlVMTCwgZ2RiKTsKKwkJaWYgKHVubGlrZWx5KGVycikpIHsKKwkJCWJyZWxzZShnZGIpOworCQkJZ290byBleGl0X2JoOworCQl9CiAJCWV4dDRfc2V0X2JpdChiaXQsIGJoLT5iX2RhdGEpOwogCQlicmVsc2UoZ2RiKTsKIAl9CkBAIC0yNTgsNyArMjYyLDExIEBACiAKIAlleHQ0X21hcmtfYml0bWFwX2VuZChpbnB1dC0+YmxvY2tzX2NvdW50LCBzYi0+c19ibG9ja3NpemUgKiA4LAogCQkJICAgICBiaC0+Yl9kYXRhKTsKLQlleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIE5VTEwsIGJoKTsKKwllcnIgPSBleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIE5VTEwsIGJoKTsKKwlpZiAodW5saWtlbHkoZXJyKSkgeworCQlleHQ0X3N0ZF9lcnJvcihzYiwgZXJyKTsKKwkJZ290byBleGl0X2JoOworCX0KIAlicmVsc2UoYmgpOwogCS8qIE1hcmsgdW51c2VkIGVudHJpZXMgaW4gaW5vZGUgYml0bWFwIHVzZWQgKi8KIAlleHQ0X2RlYnVnKCJjbGVhciBpbm9kZSBiaXRtYXAgJSMwNGxseCAoKyVsbHUpXG4iLApAQCAtMjcwLDcgKzI3OCw5IEBACiAKIAlleHQ0X21hcmtfYml0bWFwX2VuZChFWFQ0X0lOT0RFU19QRVJfR1JPVVAoc2IpLCBzYi0+c19ibG9ja3NpemUgKiA4LAogCQkJICAgICBiaC0+Yl9kYXRhKTsKLQlleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIE5VTEwsIGJoKTsKKwllcnIgPSBleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIE5VTEwsIGJoKTsKKwlpZiAodW5saWtlbHkoZXJyKSkKKwkJZXh0NF9zdGRfZXJyb3Ioc2IsIGVycik7CiBleGl0X2JoOgogCWJyZWxzZShiaCk7CiAKQEAgLTQyMiwxNyArNDMyLDIxIEBACiAJCWdvdG8gZXhpdF9kaW5kOwogCX0KIAotCWlmICgoZXJyID0gZXh0NF9qb3VybmFsX2dldF93cml0ZV9hY2Nlc3MoaGFuZGxlLCBFWFQ0X1NCKHNiKS0+c19zYmgpKSkKKwllcnIgPSBleHQ0X2pvdXJuYWxfZ2V0X3dyaXRlX2FjY2VzcyhoYW5kbGUsIEVYVDRfU0Ioc2IpLT5zX3NiaCk7CisJaWYgKHVubGlrZWx5KGVycikpCiAJCWdvdG8gZXhpdF9kaW5kOwogCi0JaWYgKChlcnIgPSBleHQ0X2pvdXJuYWxfZ2V0X3dyaXRlX2FjY2VzcyhoYW5kbGUsICpwcmltYXJ5KSkpCisJZXJyID0gZXh0NF9qb3VybmFsX2dldF93cml0ZV9hY2Nlc3MoaGFuZGxlLCAqcHJpbWFyeSk7CisJaWYgKHVubGlrZWx5KGVycikpCiAJCWdvdG8gZXhpdF9zYmg7CiAKLQlpZiAoKGVyciA9IGV4dDRfam91cm5hbF9nZXRfd3JpdGVfYWNjZXNzKGhhbmRsZSwgZGluZCkpKQotCQlnb3RvIGV4aXRfcHJpbWFyeTsKKwllcnIgPSBleHQ0X2pvdXJuYWxfZ2V0X3dyaXRlX2FjY2VzcyhoYW5kbGUsIGRpbmQpOworCWlmICh1bmxpa2VseShlcnIpKQorCQlleHQ0X3N0ZF9lcnJvcihzYiwgZXJyKTsKIAogCS8qIGV4dDRfcmVzZXJ2ZV9pbm9kZV93cml0ZSgpIGdldHMgYSByZWZlcmVuY2Ugb24gdGhlIGlsb2MgKi8KLQlpZiAoKGVyciA9IGV4dDRfcmVzZXJ2ZV9pbm9kZV93cml0ZShoYW5kbGUsIGlub2RlLCAmaWxvYykpKQorCWVyciA9IGV4dDRfcmVzZXJ2ZV9pbm9kZV93cml0ZShoYW5kbGUsIGlub2RlLCAmaWxvYyk7CisJaWYgKHVubGlrZWx5KGVycikpCiAJCWdvdG8gZXhpdF9kaW5kajsKIAogCW5fZ3JvdXBfZGVzYyA9IGttYWxsb2MoKGdkYl9udW0gKyAxKSAqIHNpemVvZihzdHJ1Y3QgYnVmZmVyX2hlYWQgKiksCkBAIC00NTQsMTIgKzQ2OCwyMCBAQAogCSAqIHJlc2VydmVkIGlub2RlLCBhbmQgd2lsbCBiZWNvbWUgR0RUIGJsb2NrcyAocHJpbWFyeSBhbmQgYmFja3VwKS4KIAkgKi8KIAlkYXRhW2dkYl9udW0gJSBFWFQ0X0FERFJfUEVSX0JMT0NLKHNiKV0gPSAwOwotCWV4dDRfaGFuZGxlX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgTlVMTCwgZGluZCk7Ci0JYnJlbHNlKGRpbmQpOworCWVyciA9IGV4dDRfaGFuZGxlX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgTlVMTCwgZGluZCk7CisJaWYgKHVubGlrZWx5KGVycikpIHsKKwkJZXh0NF9zdGRfZXJyb3Ioc2IsIGVycik7CisJCWdvdG8gZXhpdF9pbm9kZTsKKwl9CiAJaW5vZGUtPmlfYmxvY2tzIC09IChnZGJhY2t1cHMgKyAxKSAqIHNiLT5zX2Jsb2Nrc2l6ZSA+PiA5OwogCWV4dDRfbWFya19pbG9jX2RpcnR5KGhhbmRsZSwgaW5vZGUsICZpbG9jKTsKIAltZW1zZXQoKCpwcmltYXJ5KS0+Yl9kYXRhLCAwLCBzYi0+c19ibG9ja3NpemUpOwotCWV4dDRfaGFuZGxlX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgTlVMTCwgKnByaW1hcnkpOworCWVyciA9IGV4dDRfaGFuZGxlX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgTlVMTCwgKnByaW1hcnkpOworCWlmICh1bmxpa2VseShlcnIpKSB7CisJCWV4dDRfc3RkX2Vycm9yKHNiLCBlcnIpOworCQlnb3RvIGV4aXRfaW5vZGU7CisJfQorCWJyZWxzZShkaW5kKTsKIAogCW9fZ3JvdXBfZGVzYyA9IEVYVDRfU0Ioc2IpLT5zX2dyb3VwX2Rlc2M7CiAJbWVtY3B5KG5fZ3JvdXBfZGVzYywgb19ncm91cF9kZXNjLApAQCAtNDcwLDE5ICs0OTIsMTkgQEAKIAlrZnJlZShvX2dyb3VwX2Rlc2MpOwogCiAJbGUxNl9hZGRfY3B1KCZlcy0+c19yZXNlcnZlZF9nZHRfYmxvY2tzLCAtMSk7Ci0JZXh0NF9oYW5kbGVfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBOVUxMLCBFWFQ0X1NCKHNiKS0+c19zYmgpOworCWVyciA9IGV4dDRfaGFuZGxlX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgTlVMTCwgRVhUNF9TQihzYiktPnNfc2JoKTsKKwlpZiAoZXJyKQorCQlleHQ0X3N0ZF9lcnJvcihzYiwgZXJyKTsKIAotCXJldHVybiAwOworCXJldHVybiBlcnI7CiAKIGV4aXRfaW5vZGU6CiAJLyogZXh0NF9qb3VybmFsX3JlbGVhc2VfYnVmZmVyKGhhbmRsZSwgaWxvYy5iaCk7ICovCiAJYnJlbHNlKGlsb2MuYmgpOwogZXhpdF9kaW5kajoKIAkvKiBleHQ0X2pvdXJuYWxfcmVsZWFzZV9idWZmZXIoaGFuZGxlLCBkaW5kKTsgKi8KLWV4aXRfcHJpbWFyeToKLQkvKiBleHQ0X2pvdXJuYWxfcmVsZWFzZV9idWZmZXIoaGFuZGxlLCAqcHJpbWFyeSk7ICovCiBleGl0X3NiaDoKLQkvKiBleHQ0X2pvdXJuYWxfcmVsZWFzZV9idWZmZXIoaGFuZGxlLCAqcHJpbWFyeSk7ICovCisJLyogZXh0NF9qb3VybmFsX3JlbGVhc2VfYnVmZmVyKGhhbmRsZSwgRVhUNF9TQihzYiktPnNfc2JoKTsgKi8KIGV4aXRfZGluZDoKIAlicmVsc2UoZGluZCk7CiBleGl0X2JoOgpAQCAtNjY1LDcgKzY4Nyw5IEBACiAJCQltZW1zZXQoYmgtPmJfZGF0YSArIHNpemUsIDAsIHJlc3QpOwogCQlzZXRfYnVmZmVyX3VwdG9kYXRlKGJoKTsKIAkJdW5sb2NrX2J1ZmZlcihiaCk7Ci0JCWV4dDRfaGFuZGxlX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgTlVMTCwgYmgpOworCQllcnIgPSBleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIE5VTEwsIGJoKTsKKwkJaWYgKHVubGlrZWx5KGVycikpCisJCQlleHQ0X3N0ZF9lcnJvcihzYiwgZXJyKTsKIAkJYnJlbHNlKGJoKTsKIAl9CiAJaWYgKChlcnIyID0gZXh0NF9qb3VybmFsX3N0b3AoaGFuZGxlKSkgJiYgIWVycikKQEAgLTg4Myw3ICs5MDcsMTEgQEAKIAkvKiBVcGRhdGUgdGhlIGdsb2JhbCBmcyBzaXplIGZpZWxkcyAqLwogCXNiaS0+c19ncm91cHNfY291bnQrKzsKIAotCWV4dDRfaGFuZGxlX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgTlVMTCwgcHJpbWFyeSk7CisJZXJyID0gZXh0NF9oYW5kbGVfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBOVUxMLCBwcmltYXJ5KTsKKwlpZiAodW5saWtlbHkoZXJyKSkgeworCQlleHQ0X3N0ZF9lcnJvcihzYiwgZXJyKTsKKwkJZ290byBleGl0X2pvdXJuYWw7CisJfQogCiAJLyogVXBkYXRlIHRoZSByZXNlcnZlZCBibG9jayBjb3VudHMgb25seSBvbmNlIHRoZSBuZXcgZ3JvdXAgaXMKIAkgKiBhY3RpdmUuICovCmRpZmYgLS1naXQgYS9mcy9leHQ0L3N1cGVyLmMgYi9mcy9leHQ0L3N1cGVyLmMKaW5kZXggY2QzN2Y5ZC4uMjljODBmNiAxMDA2NDQKLS0tIGEvZnMvZXh0NC9zdXBlci5jCisrKyBiL2ZzL2V4dDQvc3VwZXIuYwpAQCAtMzg4LDEzICszODgsMTQgQEAKIHZvaWQgX19leHQ0X2Vycm9yKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGNvbnN0IGNoYXIgKmZ1bmN0aW9uLAogCQkgIHVuc2lnbmVkIGludCBsaW5lLCBjb25zdCBjaGFyICpmbXQsIC4uLikKIHsKKwlzdHJ1Y3QgdmFfZm9ybWF0IHZhZjsKIAl2YV9saXN0IGFyZ3M7CiAKIAl2YV9zdGFydChhcmdzLCBmbXQpOwotCXByaW50ayhLRVJOX0NSSVQgIkVYVDQtZnMgZXJyb3IgKGRldmljZSAlcyk6ICVzOiVkOiBjb21tICVzOiAiLAotCSAgICAgICBzYi0+c19pZCwgZnVuY3Rpb24sIGxpbmUsIGN1cnJlbnQtPmNvbW0pOwotCXZwcmludGsoZm10LCBhcmdzKTsKLQlwcmludGsoIlxuIik7CisJdmFmLmZtdCA9IGZtdDsKKwl2YWYudmEgPSAmYXJnczsKKwlwcmludGsoS0VSTl9DUklUICJFWFQ0LWZzIGVycm9yIChkZXZpY2UgJXMpOiAlczolZDogY29tbSAlczogJXBWXG4iLAorCSAgICAgICBzYi0+c19pZCwgZnVuY3Rpb24sIGxpbmUsIGN1cnJlbnQtPmNvbW0sICZ2YWYpOwogCXZhX2VuZChhcmdzKTsKIAogCWV4dDRfaGFuZGxlX2Vycm9yKHNiKTsKQEAgLTQwNSwyOCArNDA2LDMxIEBACiAJCSAgICAgIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQogewogCXZhX2xpc3QgYXJnczsKKwlzdHJ1Y3QgdmFfZm9ybWF0IHZhZjsKIAlzdHJ1Y3QgZXh0NF9zdXBlcl9ibG9jayAqZXMgPSBFWFQ0X1NCKGlub2RlLT5pX3NiKS0+c19lczsKIAogCWVzLT5zX2xhc3RfZXJyb3JfaW5vID0gY3B1X3RvX2xlMzIoaW5vZGUtPmlfaW5vKTsKIAllcy0+c19sYXN0X2Vycm9yX2Jsb2NrID0gY3B1X3RvX2xlNjQoYmxvY2spOwogCXNhdmVfZXJyb3JfaW5mbyhpbm9kZS0+aV9zYiwgZnVuY3Rpb24sIGxpbmUpOwogCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisJdmFmLmZtdCA9IGZtdDsKKwl2YWYudmEgPSAmYXJnczsKIAlwcmludGsoS0VSTl9DUklUICJFWFQ0LWZzIGVycm9yIChkZXZpY2UgJXMpOiAlczolZDogaW5vZGUgIyVsdTogIiwKIAkgICAgICAgaW5vZGUtPmlfc2ItPnNfaWQsIGZ1bmN0aW9uLCBsaW5lLCBpbm9kZS0+aV9pbm8pOwogCWlmIChibG9jaykKLQkJcHJpbnRrKCJibG9jayAlbGx1OiAiLCBibG9jayk7Ci0JcHJpbnRrKCJjb21tICVzOiAiLCBjdXJyZW50LT5jb21tKTsKLQl2cHJpbnRrKGZtdCwgYXJncyk7Ci0JcHJpbnRrKCJcbiIpOworCQlwcmludGsoS0VSTl9DT05UICJibG9jayAlbGx1OiAiLCBibG9jayk7CisJcHJpbnRrKEtFUk5fQ09OVCAiY29tbSAlczogJXBWXG4iLCBjdXJyZW50LT5jb21tLCAmdmFmKTsKIAl2YV9lbmQoYXJncyk7CiAKIAlleHQ0X2hhbmRsZV9lcnJvcihpbm9kZS0+aV9zYik7CiB9CiAKIHZvaWQgZXh0NF9lcnJvcl9maWxlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyICpmdW5jdGlvbiwKLQkJICAgICB1bnNpZ25lZCBpbnQgbGluZSwgY29uc3QgY2hhciAqZm10LCAuLi4pCisJCSAgICAgdW5zaWduZWQgaW50IGxpbmUsIGV4dDRfZnNibGtfdCBibG9jaywKKwkJICAgICBjb25zdCBjaGFyICpmbXQsIC4uLikKIHsKIAl2YV9saXN0IGFyZ3M7CisJc3RydWN0IHZhX2Zvcm1hdCB2YWY7CiAJc3RydWN0IGV4dDRfc3VwZXJfYmxvY2sgKmVzOwogCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZTsKIAljaGFyIHBhdGhuYW1lWzgwXSwgKnBhdGg7CkBAIC00MzQsMTcgKzQzOCwxOCBAQAogCWVzID0gRVhUNF9TQihpbm9kZS0+aV9zYiktPnNfZXM7CiAJZXMtPnNfbGFzdF9lcnJvcl9pbm8gPSBjcHVfdG9fbGUzMihpbm9kZS0+aV9pbm8pOwogCXNhdmVfZXJyb3JfaW5mbyhpbm9kZS0+aV9zYiwgZnVuY3Rpb24sIGxpbmUpOwotCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7CiAJcGF0aCA9IGRfcGF0aCgmKGZpbGUtPmZfcGF0aCksIHBhdGhuYW1lLCBzaXplb2YocGF0aG5hbWUpKTsKLQlpZiAoIXBhdGgpCisJaWYgKElTX0VSUihwYXRoKSkKIAkJcGF0aCA9ICIodW5rbm93bikiOwogCXByaW50ayhLRVJOX0NSSVQKLQkgICAgICAgIkVYVDQtZnMgZXJyb3IgKGRldmljZSAlcyk6ICVzOiVkOiBpbm9kZSAjJWx1ICIKLQkgICAgICAgIihjb21tICVzIHBhdGggJXMpOiAiLAotCSAgICAgICBpbm9kZS0+aV9zYi0+c19pZCwgZnVuY3Rpb24sIGxpbmUsIGlub2RlLT5pX2lubywKLQkgICAgICAgY3VycmVudC0+Y29tbSwgcGF0aCk7Ci0JdnByaW50ayhmbXQsIGFyZ3MpOwotCXByaW50aygiXG4iKTsKKwkgICAgICAgIkVYVDQtZnMgZXJyb3IgKGRldmljZSAlcyk6ICVzOiVkOiBpbm9kZSAjJWx1OiAiLAorCSAgICAgICBpbm9kZS0+aV9zYi0+c19pZCwgZnVuY3Rpb24sIGxpbmUsIGlub2RlLT5pX2lubyk7CisJaWYgKGJsb2NrKQorCQlwcmludGsoS0VSTl9DT05UICJibG9jayAlbGx1OiAiLCBibG9jayk7CisJdmFfc3RhcnQoYXJncywgZm10KTsKKwl2YWYuZm10ID0gZm10OworCXZhZi52YSA9ICZhcmdzOworCXByaW50ayhLRVJOX0NPTlQgImNvbW0gJXM6IHBhdGggJXM6ICVwVlxuIiwgY3VycmVudC0+Y29tbSwgcGF0aCwgJnZhZik7CiAJdmFfZW5kKGFyZ3MpOwogCiAJZXh0NF9oYW5kbGVfZXJyb3IoaW5vZGUtPmlfc2IpOwpAQCAtNTQzLDI4ICs1NDgsMjkgQEAKIAkJcGFuaWMoIkVYVDQtZnMgcGFuaWMgZnJvbSBwcmV2aW91cyBlcnJvclxuIik7CiB9CiAKLXZvaWQgZXh0NF9tc2cgKHN0cnVjdCBzdXBlcl9ibG9jayAqIHNiLCBjb25zdCBjaGFyICpwcmVmaXgsCi0JCSAgIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQordm9pZCBleHQ0X21zZyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBjb25zdCBjaGFyICpwcmVmaXgsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQogeworCXN0cnVjdCB2YV9mb3JtYXQgdmFmOwogCXZhX2xpc3QgYXJnczsKIAogCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7Ci0JcHJpbnRrKCIlc0VYVDQtZnMgKCVzKTogIiwgcHJlZml4LCBzYi0+c19pZCk7Ci0JdnByaW50ayhmbXQsIGFyZ3MpOwotCXByaW50aygiXG4iKTsKKwl2YWYuZm10ID0gZm10OworCXZhZi52YSA9ICZhcmdzOworCXByaW50aygiJXNFWFQ0LWZzICglcyk6ICVwVlxuIiwgcHJlZml4LCBzYi0+c19pZCwgJnZhZik7CiAJdmFfZW5kKGFyZ3MpOwogfQogCiB2b2lkIF9fZXh0NF93YXJuaW5nKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGNvbnN0IGNoYXIgKmZ1bmN0aW9uLAogCQkgICAgdW5zaWduZWQgaW50IGxpbmUsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQogeworCXN0cnVjdCB2YV9mb3JtYXQgdmFmOwogCXZhX2xpc3QgYXJnczsKIAogCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7Ci0JcHJpbnRrKEtFUk5fV0FSTklORyAiRVhUNC1mcyB3YXJuaW5nIChkZXZpY2UgJXMpOiAlczolZDogIiwKLQkgICAgICAgc2ItPnNfaWQsIGZ1bmN0aW9uLCBsaW5lKTsKLQl2cHJpbnRrKGZtdCwgYXJncyk7Ci0JcHJpbnRrKCJcbiIpOworCXZhZi5mbXQgPSBmbXQ7CisJdmFmLnZhID0gJmFyZ3M7CisJcHJpbnRrKEtFUk5fV0FSTklORyAiRVhUNC1mcyB3YXJuaW5nIChkZXZpY2UgJXMpOiAlczolZDogJXBWXG4iLAorCSAgICAgICBzYi0+c19pZCwgZnVuY3Rpb24sIGxpbmUsICZ2YWYpOwogCXZhX2VuZChhcmdzKTsKIH0KIApAQCAtNTc1LDIxICs1ODEsMjUgQEAKIF9fcmVsZWFzZXMoYml0bG9jaykKIF9fYWNxdWlyZXMoYml0bG9jaykKIHsKKwlzdHJ1Y3QgdmFfZm9ybWF0IHZhZjsKIAl2YV9saXN0IGFyZ3M7CiAJc3RydWN0IGV4dDRfc3VwZXJfYmxvY2sgKmVzID0gRVhUNF9TQihzYiktPnNfZXM7CiAKIAllcy0+c19sYXN0X2Vycm9yX2lubyA9IGNwdV90b19sZTMyKGlubyk7CiAJZXMtPnNfbGFzdF9lcnJvcl9ibG9jayA9IGNwdV90b19sZTY0KGJsb2NrKTsKIAlfX3NhdmVfZXJyb3JfaW5mbyhzYiwgZnVuY3Rpb24sIGxpbmUpOworCiAJdmFfc3RhcnQoYXJncywgZm10KTsKKworCXZhZi5mbXQgPSBmbXQ7CisJdmFmLnZhID0gJmFyZ3M7CiAJcHJpbnRrKEtFUk5fQ1JJVCAiRVhUNC1mcyBlcnJvciAoZGV2aWNlICVzKTogJXM6JWQ6IGdyb3VwICV1IiwKIAkgICAgICAgc2ItPnNfaWQsIGZ1bmN0aW9uLCBsaW5lLCBncnApOwogCWlmIChpbm8pCi0JCXByaW50aygiaW5vZGUgJWx1OiAiLCBpbm8pOworCQlwcmludGsoS0VSTl9DT05UICJpbm9kZSAlbHU6ICIsIGlubyk7CiAJaWYgKGJsb2NrKQotCQlwcmludGsoImJsb2NrICVsbHU6IiwgKHVuc2lnbmVkIGxvbmcgbG9uZykgYmxvY2spOwotCXZwcmludGsoZm10LCBhcmdzKTsKLQlwcmludGsoIlxuIik7CisJCXByaW50ayhLRVJOX0NPTlQgImJsb2NrICVsbHU6IiwgKHVuc2lnbmVkIGxvbmcgbG9uZykgYmxvY2spOworCXByaW50ayhLRVJOX0NPTlQgIiVwVlxuIiwgJnZhZik7CiAJdmFfZW5kKGFyZ3MpOwogCiAJaWYgKHRlc3Rfb3B0KHNiLCBFUlJPUlNfQ09OVCkpIHsKQEAgLTgwOCwyMSArODE4LDE1IEBACiAJbWVtc2V0KCZlaS0+aV9jYWNoZWRfZXh0ZW50LCAwLCBzaXplb2Yoc3RydWN0IGV4dDRfZXh0X2NhY2hlKSk7CiAJSU5JVF9MSVNUX0hFQUQoJmVpLT5pX3ByZWFsbG9jX2xpc3QpOwogCXNwaW5fbG9ja19pbml0KCZlaS0+aV9wcmVhbGxvY19sb2NrKTsKLQkvKgotCSAqIE5vdGU6ICBXZSBjYW4gYmUgY2FsbGVkIGJlZm9yZSBFWFQ0X1NCKHNiKS0+c19qb3VybmFsIGlzIHNldCwKLQkgKiB0aGVyZWZvcmUgaXQgY2FuIGJlIG51bGwgaGVyZS4gIERvbid0IGNoZWNrIGl0LCBqdXN0IGluaXRpYWxpemUKLQkgKiBqaW5vZGUuCi0JICovCi0JamJkMl9qb3VybmFsX2luaXRfamJkX2lub2RlKCZlaS0+amlub2RlLCAmZWktPnZmc19pbm9kZSk7CiAJZWktPmlfcmVzZXJ2ZWRfZGF0YV9ibG9ja3MgPSAwOwogCWVpLT5pX3Jlc2VydmVkX21ldGFfYmxvY2tzID0gMDsKIAllaS0+aV9hbGxvY2F0ZWRfbWV0YV9ibG9ja3MgPSAwOwogCWVpLT5pX2RhX21ldGFkYXRhX2NhbGNfbGVuID0gMDsKLQllaS0+aV9kZWxhbGxvY19yZXNlcnZlZF9mbGFnID0gMDsKIAlzcGluX2xvY2tfaW5pdCgmKGVpLT5pX2Jsb2NrX3Jlc2VydmF0aW9uX2xvY2spKTsKICNpZmRlZiBDT05GSUdfUVVPVEEKIAllaS0+aV9yZXNlcnZlZF9xdW90YSA9IDA7CiAjZW5kaWYKKwllaS0+amlub2RlID0gTlVMTDsKIAlJTklUX0xJU1RfSEVBRCgmZWktPmlfY29tcGxldGVkX2lvX2xpc3QpOwogCXNwaW5fbG9ja19pbml0KCZlaS0+aV9jb21wbGV0ZWRfaW9fbG9jayk7CiAJZWktPmN1cl9haW9fZGlvID0gTlVMTDsKQEAgLTg5OCw5ICs5MDIsMTIgQEAKIAllbmRfd3JpdGViYWNrKGlub2RlKTsKIAlkcXVvdF9kcm9wKGlub2RlKTsKIAlleHQ0X2Rpc2NhcmRfcHJlYWxsb2NhdGlvbnMoaW5vZGUpOwotCWlmIChFWFQ0X0pPVVJOQUwoaW5vZGUpKQotCQlqYmQyX2pvdXJuYWxfcmVsZWFzZV9qYmRfaW5vZGUoRVhUNF9TQihpbm9kZS0+aV9zYiktPnNfam91cm5hbCwKLQkJCQkgICAgICAgJkVYVDRfSShpbm9kZSktPmppbm9kZSk7CisJaWYgKEVYVDRfSShpbm9kZSktPmppbm9kZSkgeworCQlqYmQyX2pvdXJuYWxfcmVsZWFzZV9qYmRfaW5vZGUoRVhUNF9KT1VSTkFMKGlub2RlKSwKKwkJCQkJICAgICAgIEVYVDRfSShpbm9kZSktPmppbm9kZSk7CisJCWpiZDJfZnJlZV9pbm9kZShFWFQ0X0koaW5vZGUpLT5qaW5vZGUpOworCQlFWFQ0X0koaW5vZGUpLT5qaW5vZGUgPSBOVUxMOworCX0KIH0KIAogc3RhdGljIGlubGluZSB2b2lkIGV4dDRfc2hvd19xdW90YV9vcHRpb25zKHN0cnVjdCBzZXFfZmlsZSAqc2VxLApAQCAtMTM5Myw3ICsxNDAwLDcgQEAKIAkJc2JpLT5zX3FmX25hbWVzW3F0eXBlXSA9IE5VTEw7CiAJCXJldHVybiAwOwogCX0KLQlzZXRfb3B0KHNiaS0+c19tb3VudF9vcHQsIFFVT1RBKTsKKwlzZXRfb3B0KHNiLCBRVU9UQSk7CiAJcmV0dXJuIDE7CiB9CiAKQEAgLTE0NDgsMjEgKzE0NTUsMjEgQEAKIAkJc3dpdGNoICh0b2tlbikgewogCQljYXNlIE9wdF9ic2RfZGY6CiAJCQlleHQ0X21zZyhzYiwgS0VSTl9XQVJOSU5HLCBkZXByZWNhdGVkX21zZywgcCwgIjIuNi4zOCIpOwotCQkJY2xlYXJfb3B0KHNiaS0+c19tb3VudF9vcHQsIE1JTklYX0RGKTsKKwkJCWNsZWFyX29wdChzYiwgTUlOSVhfREYpOwogCQkJYnJlYWs7CiAJCWNhc2UgT3B0X21pbml4X2RmOgogCQkJZXh0NF9tc2coc2IsIEtFUk5fV0FSTklORywgZGVwcmVjYXRlZF9tc2csIHAsICIyLjYuMzgiKTsKLQkJCXNldF9vcHQoc2JpLT5zX21vdW50X29wdCwgTUlOSVhfREYpOworCQkJc2V0X29wdChzYiwgTUlOSVhfREYpOwogCiAJCQlicmVhazsKIAkJY2FzZSBPcHRfZ3JwaWQ6CiAJCQlleHQ0X21zZyhzYiwgS0VSTl9XQVJOSU5HLCBkZXByZWNhdGVkX21zZywgcCwgIjIuNi4zOCIpOwotCQkJc2V0X29wdChzYmktPnNfbW91bnRfb3B0LCBHUlBJRCk7CisJCQlzZXRfb3B0KHNiLCBHUlBJRCk7CiAKIAkJCWJyZWFrOwogCQljYXNlIE9wdF9ub2dycGlkOgogCQkJZXh0NF9tc2coc2IsIEtFUk5fV0FSTklORywgZGVwcmVjYXRlZF9tc2csIHAsICIyLjYuMzgiKTsKLQkJCWNsZWFyX29wdChzYmktPnNfbW91bnRfb3B0LCBHUlBJRCk7CisJCQljbGVhcl9vcHQoc2IsIEdSUElEKTsKIAogCQkJYnJlYWs7CiAJCWNhc2UgT3B0X3Jlc3VpZDoKQEAgLTE0ODAsMzggKzE0ODcsMzggQEAKIAkJCS8qICpzYl9ibG9jayA9IG1hdGNoX2ludCgmYXJnc1swXSk7ICovCiAJCQlicmVhazsKIAkJY2FzZSBPcHRfZXJyX3BhbmljOgotCQkJY2xlYXJfb3B0KHNiaS0+c19tb3VudF9vcHQsIEVSUk9SU19DT05UKTsKLQkJCWNsZWFyX29wdChzYmktPnNfbW91bnRfb3B0LCBFUlJPUlNfUk8pOwotCQkJc2V0X29wdChzYmktPnNfbW91bnRfb3B0LCBFUlJPUlNfUEFOSUMpOworCQkJY2xlYXJfb3B0KHNiLCBFUlJPUlNfQ09OVCk7CisJCQljbGVhcl9vcHQoc2IsIEVSUk9SU19STyk7CisJCQlzZXRfb3B0KHNiLCBFUlJPUlNfUEFOSUMpOwogCQkJYnJlYWs7CiAJCWNhc2UgT3B0X2Vycl9ybzoKLQkJCWNsZWFyX29wdChzYmktPnNfbW91bnRfb3B0LCBFUlJPUlNfQ09OVCk7Ci0JCQljbGVhcl9vcHQoc2JpLT5zX21vdW50X29wdCwgRVJST1JTX1BBTklDKTsKLQkJCXNldF9vcHQoc2JpLT5zX21vdW50X29wdCwgRVJST1JTX1JPKTsKKwkJCWNsZWFyX29wdChzYiwgRVJST1JTX0NPTlQpOworCQkJY2xlYXJfb3B0KHNiLCBFUlJPUlNfUEFOSUMpOworCQkJc2V0X29wdChzYiwgRVJST1JTX1JPKTsKIAkJCWJyZWFrOwogCQljYXNlIE9wdF9lcnJfY29udDoKLQkJCWNsZWFyX29wdChzYmktPnNfbW91bnRfb3B0LCBFUlJPUlNfUk8pOwotCQkJY2xlYXJfb3B0KHNiaS0+c19tb3VudF9vcHQsIEVSUk9SU19QQU5JQyk7Ci0JCQlzZXRfb3B0KHNiaS0+c19tb3VudF9vcHQsIEVSUk9SU19DT05UKTsKKwkJCWNsZWFyX29wdChzYiwgRVJST1JTX1JPKTsKKwkJCWNsZWFyX29wdChzYiwgRVJST1JTX1BBTklDKTsKKwkJCXNldF9vcHQoc2IsIEVSUk9SU19DT05UKTsKIAkJCWJyZWFrOwogCQljYXNlIE9wdF9ub3VpZDMyOgotCQkJc2V0X29wdChzYmktPnNfbW91bnRfb3B0LCBOT19VSUQzMik7CisJCQlzZXRfb3B0KHNiLCBOT19VSUQzMik7CiAJCQlicmVhazsKIAkJY2FzZSBPcHRfZGVidWc6Ci0JCQlzZXRfb3B0KHNiaS0+c19tb3VudF9vcHQsIERFQlVHKTsKKwkJCXNldF9vcHQoc2IsIERFQlVHKTsKIAkJCWJyZWFrOwogCQljYXNlIE9wdF9vbGRhbGxvYzoKLQkJCXNldF9vcHQoc2JpLT5zX21vdW50X29wdCwgT0xEQUxMT0MpOworCQkJc2V0X29wdChzYiwgT0xEQUxMT0MpOwogCQkJYnJlYWs7CiAJCWNhc2UgT3B0X29ybG92OgotCQkJY2xlYXJfb3B0KHNiaS0+c19tb3VudF9vcHQsIE9MREFMTE9DKTsKKwkJCWNsZWFyX29wdChzYiwgT0xEQUxMT0MpOwogCQkJYnJlYWs7CiAjaWZkZWYgQ09ORklHX0VYVDRfRlNfWEFUVFIKIAkJY2FzZSBPcHRfdXNlcl94YXR0cjoKLQkJCXNldF9vcHQoc2JpLT5zX21vdW50X29wdCwgWEFUVFJfVVNFUik7CisJCQlzZXRfb3B0KHNiLCBYQVRUUl9VU0VSKTsKIAkJCWJyZWFrOwogCQljYXNlIE9wdF9ub3VzZXJfeGF0dHI6Ci0JCQljbGVhcl9vcHQoc2JpLT5zX21vdW50X29wdCwgWEFUVFJfVVNFUik7CisJCQljbGVhcl9vcHQoc2IsIFhBVFRSX1VTRVIpOwogCQkJYnJlYWs7CiAjZWxzZQogCQljYXNlIE9wdF91c2VyX3hhdHRyOgpAQCAtMTUyMSwxMCArMTUyOCwxMCBAQAogI2VuZGlmCiAjaWZkZWYgQ09ORklHX0VYVDRfRlNfUE9TSVhfQUNMCiAJCWNhc2UgT3B0X2FjbDoKLQkJCXNldF9vcHQoc2JpLT5zX21vdW50X29wdCwgUE9TSVhfQUNMKTsKKwkJCXNldF9vcHQoc2IsIFBPU0lYX0FDTCk7CiAJCQlicmVhazsKIAkJY2FzZSBPcHRfbm9hY2w6Ci0JCQljbGVhcl9vcHQoc2JpLT5zX21vdW50X29wdCwgUE9TSVhfQUNMKTsKKwkJCWNsZWFyX29wdChzYiwgUE9TSVhfQUNMKTsKIAkJCWJyZWFrOwogI2Vsc2UKIAkJY2FzZSBPcHRfYWNsOgpAQCAtMTU0Myw3ICsxNTUwLDcgQEAKIAkJCQkJICJDYW5ub3Qgc3BlY2lmeSBqb3VybmFsIG9uIHJlbW91bnQiKTsKIAkJCQlyZXR1cm4gMDsKIAkJCX0KLQkJCXNldF9vcHQoc2JpLT5zX21vdW50X29wdCwgVVBEQVRFX0pPVVJOQUwpOworCQkJc2V0X29wdChzYiwgVVBEQVRFX0pPVVJOQUwpOwogCQkJYnJlYWs7CiAJCWNhc2UgT3B0X2pvdXJuYWxfZGV2OgogCQkJaWYgKGlzX3JlbW91bnQpIHsKQEAgLTE1NTYsMTQgKzE1NjMsMTQgQEAKIAkJCSpqb3VybmFsX2Rldm51bSA9IG9wdGlvbjsKIAkJCWJyZWFrOwogCQljYXNlIE9wdF9qb3VybmFsX2NoZWNrc3VtOgotCQkJc2V0X29wdChzYmktPnNfbW91bnRfb3B0LCBKT1VSTkFMX0NIRUNLU1VNKTsKKwkJCXNldF9vcHQoc2IsIEpPVVJOQUxfQ0hFQ0tTVU0pOwogCQkJYnJlYWs7CiAJCWNhc2UgT3B0X2pvdXJuYWxfYXN5bmNfY29tbWl0OgotCQkJc2V0X29wdChzYmktPnNfbW91bnRfb3B0LCBKT1VSTkFMX0FTWU5DX0NPTU1JVCk7Ci0JCQlzZXRfb3B0KHNiaS0+c19tb3VudF9vcHQsIEpPVVJOQUxfQ0hFQ0tTVU0pOworCQkJc2V0X29wdChzYiwgSk9VUk5BTF9BU1lOQ19DT01NSVQpOworCQkJc2V0X29wdChzYiwgSk9VUk5BTF9DSEVDS1NVTSk7CiAJCQlicmVhazsKIAkJY2FzZSBPcHRfbm9sb2FkOgotCQkJc2V0X29wdChzYmktPnNfbW91bnRfb3B0LCBOT0xPQUQpOworCQkJc2V0X29wdChzYiwgTk9MT0FEKTsKIAkJCWJyZWFrOwogCQljYXNlIE9wdF9jb21taXQ6CiAJCQlpZiAobWF0Y2hfaW50KCZhcmdzWzBdLCAmb3B0aW9uKSkKQEAgLTE2MDYsMTUgKzE2MTMsMTUgQEAKIAkJCQkJcmV0dXJuIDA7CiAJCQkJfQogCQkJfSBlbHNlIHsKLQkJCQljbGVhcl9vcHQoc2JpLT5zX21vdW50X29wdCwgREFUQV9GTEFHUyk7CisJCQkJY2xlYXJfb3B0KHNiLCBEQVRBX0ZMQUdTKTsKIAkJCQlzYmktPnNfbW91bnRfb3B0IHw9IGRhdGFfb3B0OwogCQkJfQogCQkJYnJlYWs7CiAJCWNhc2UgT3B0X2RhdGFfZXJyX2Fib3J0OgotCQkJc2V0X29wdChzYmktPnNfbW91bnRfb3B0LCBEQVRBX0VSUl9BQk9SVCk7CisJCQlzZXRfb3B0KHNiLCBEQVRBX0VSUl9BQk9SVCk7CiAJCQlicmVhazsKIAkJY2FzZSBPcHRfZGF0YV9lcnJfaWdub3JlOgotCQkJY2xlYXJfb3B0KHNiaS0+c19tb3VudF9vcHQsIERBVEFfRVJSX0FCT1JUKTsKKwkJCWNsZWFyX29wdChzYiwgREFUQV9FUlJfQUJPUlQpOwogCQkJYnJlYWs7CiAjaWZkZWYgQ09ORklHX1FVT1RBCiAJCWNhc2UgT3B0X3VzcmpxdW90YToKQEAgLTE2NTQsMTIgKzE2NjEsMTIgQEAKIAkJCWJyZWFrOwogCQljYXNlIE9wdF9xdW90YToKIAkJY2FzZSBPcHRfdXNycXVvdGE6Ci0JCQlzZXRfb3B0KHNiaS0+c19tb3VudF9vcHQsIFFVT1RBKTsKLQkJCXNldF9vcHQoc2JpLT5zX21vdW50X29wdCwgVVNSUVVPVEEpOworCQkJc2V0X29wdChzYiwgUVVPVEEpOworCQkJc2V0X29wdChzYiwgVVNSUVVPVEEpOwogCQkJYnJlYWs7CiAJCWNhc2UgT3B0X2dycHF1b3RhOgotCQkJc2V0X29wdChzYmktPnNfbW91bnRfb3B0LCBRVU9UQSk7Ci0JCQlzZXRfb3B0KHNiaS0+c19tb3VudF9vcHQsIEdSUFFVT1RBKTsKKwkJCXNldF9vcHQoc2IsIFFVT1RBKTsKKwkJCXNldF9vcHQoc2IsIEdSUFFVT1RBKTsKIAkJCWJyZWFrOwogCQljYXNlIE9wdF9ub3F1b3RhOgogCQkJaWYgKHNiX2FueV9xdW90YV9sb2FkZWQoc2IpKSB7CkBAIC0xNjY3LDkgKzE2NzQsOSBAQAogCQkJCQkib3B0aW9ucyB3aGVuIHF1b3RhIHR1cm5lZCBvbiIpOwogCQkJCXJldHVybiAwOwogCQkJfQotCQkJY2xlYXJfb3B0KHNiaS0+c19tb3VudF9vcHQsIFFVT1RBKTsKLQkJCWNsZWFyX29wdChzYmktPnNfbW91bnRfb3B0LCBVU1JRVU9UQSk7Ci0JCQljbGVhcl9vcHQoc2JpLT5zX21vdW50X29wdCwgR1JQUVVPVEEpOworCQkJY2xlYXJfb3B0KHNiLCBRVU9UQSk7CisJCQljbGVhcl9vcHQoc2IsIFVTUlFVT1RBKTsKKwkJCWNsZWFyX29wdChzYiwgR1JQUVVPVEEpOwogCQkJYnJlYWs7CiAjZWxzZQogCQljYXNlIE9wdF9xdW90YToKQEAgLTE2OTUsNyArMTcwMiw3IEBACiAJCQlzYmktPnNfbW91bnRfZmxhZ3MgfD0gRVhUNF9NRl9GU19BQk9SVEVEOwogCQkJYnJlYWs7CiAJCWNhc2UgT3B0X25vYmFycmllcjoKLQkJCWNsZWFyX29wdChzYmktPnNfbW91bnRfb3B0LCBCQVJSSUVSKTsKKwkJCWNsZWFyX29wdChzYiwgQkFSUklFUik7CiAJCQlicmVhazsKIAkJY2FzZSBPcHRfYmFycmllcjoKIAkJCWlmIChhcmdzWzBdLmZyb20pIHsKQEAgLTE3MDQsOSArMTcxMSw5IEBACiAJCQl9IGVsc2UKIAkJCQlvcHRpb24gPSAxOwkvKiBObyBhcmd1bWVudCwgZGVmYXVsdCB0byAxICovCiAJCQlpZiAob3B0aW9uKQotCQkJCXNldF9vcHQoc2JpLT5zX21vdW50X29wdCwgQkFSUklFUik7CisJCQkJc2V0X29wdChzYiwgQkFSUklFUik7CiAJCQllbHNlCi0JCQkJY2xlYXJfb3B0KHNiaS0+c19tb3VudF9vcHQsIEJBUlJJRVIpOworCQkJCWNsZWFyX29wdChzYiwgQkFSUklFUik7CiAJCQlicmVhazsKIAkJY2FzZSBPcHRfaWdub3JlOgogCQkJYnJlYWs7CkBAIC0xNzMwLDE3ICsxNzM3LDE3IEBACiAJCQkJICJJZ25vcmluZyBkZXByZWNhdGVkIGJoIG9wdGlvbiIpOwogCQkJYnJlYWs7CiAJCWNhc2UgT3B0X2lfdmVyc2lvbjoKLQkJCXNldF9vcHQoc2JpLT5zX21vdW50X29wdCwgSV9WRVJTSU9OKTsKKwkJCXNldF9vcHQoc2IsIElfVkVSU0lPTik7CiAJCQlzYi0+c19mbGFncyB8PSBNU19JX1ZFUlNJT047CiAJCQlicmVhazsKIAkJY2FzZSBPcHRfbm9kZWxhbGxvYzoKLQkJCWNsZWFyX29wdChzYmktPnNfbW91bnRfb3B0LCBERUxBTExPQyk7CisJCQljbGVhcl9vcHQoc2IsIERFTEFMTE9DKTsKIAkJCWJyZWFrOwogCQljYXNlIE9wdF9tYmxrX2lvX3N1Ym1pdDoKLQkJCXNldF9vcHQoc2JpLT5zX21vdW50X29wdCwgTUJMS19JT19TVUJNSVQpOworCQkJc2V0X29wdChzYiwgTUJMS19JT19TVUJNSVQpOwogCQkJYnJlYWs7CiAJCWNhc2UgT3B0X25vbWJsa19pb19zdWJtaXQ6Ci0JCQljbGVhcl9vcHQoc2JpLT5zX21vdW50X29wdCwgTUJMS19JT19TVUJNSVQpOworCQkJY2xlYXJfb3B0KHNiLCBNQkxLX0lPX1NVQk1JVCk7CiAJCQlicmVhazsKIAkJY2FzZSBPcHRfc3RyaXBlOgogCQkJaWYgKG1hdGNoX2ludCgmYXJnc1swXSwgJm9wdGlvbikpCkBAIC0xNzUwLDEzICsxNzU3LDEzIEBACiAJCQlzYmktPnNfc3RyaXBlID0gb3B0aW9uOwogCQkJYnJlYWs7CiAJCWNhc2UgT3B0X2RlbGFsbG9jOgotCQkJc2V0X29wdChzYmktPnNfbW91bnRfb3B0LCBERUxBTExPQyk7CisJCQlzZXRfb3B0KHNiLCBERUxBTExPQyk7CiAJCQlicmVhazsKIAkJY2FzZSBPcHRfYmxvY2tfdmFsaWRpdHk6Ci0JCQlzZXRfb3B0KHNiaS0+c19tb3VudF9vcHQsIEJMT0NLX1ZBTElESVRZKTsKKwkJCXNldF9vcHQoc2IsIEJMT0NLX1ZBTElESVRZKTsKIAkJCWJyZWFrOwogCQljYXNlIE9wdF9ub2Jsb2NrX3ZhbGlkaXR5OgotCQkJY2xlYXJfb3B0KHNiaS0+c19tb3VudF9vcHQsIEJMT0NLX1ZBTElESVRZKTsKKwkJCWNsZWFyX29wdChzYiwgQkxPQ0tfVkFMSURJVFkpOwogCQkJYnJlYWs7CiAJCWNhc2UgT3B0X2lub2RlX3JlYWRhaGVhZF9ibGtzOgogCQkJaWYgKG1hdGNoX2ludCgmYXJnc1swXSwgJm9wdGlvbikpCkBAIC0xNzgwLDcgKzE3ODcsNyBAQAogCQkJCQkJCSAgICBvcHRpb24pOwogCQkJYnJlYWs7CiAJCWNhc2UgT3B0X25vYXV0b19kYV9hbGxvYzoKLQkJCXNldF9vcHQoc2JpLT5zX21vdW50X29wdCxOT19BVVRPX0RBX0FMTE9DKTsKKwkJCXNldF9vcHQoc2IsIE5PX0FVVE9fREFfQUxMT0MpOwogCQkJYnJlYWs7CiAJCWNhc2UgT3B0X2F1dG9fZGFfYWxsb2M6CiAJCQlpZiAoYXJnc1swXS5mcm9tKSB7CkBAIC0xNzg5LDI0ICsxNzk2LDI0IEBACiAJCQl9IGVsc2UKIAkJCQlvcHRpb24gPSAxOwkvKiBObyBhcmd1bWVudCwgZGVmYXVsdCB0byAxICovCiAJCQlpZiAob3B0aW9uKQotCQkJCWNsZWFyX29wdChzYmktPnNfbW91bnRfb3B0LCBOT19BVVRPX0RBX0FMTE9DKTsKKwkJCQljbGVhcl9vcHQoc2IsIE5PX0FVVE9fREFfQUxMT0MpOwogCQkJZWxzZQotCQkJCXNldF9vcHQoc2JpLT5zX21vdW50X29wdCxOT19BVVRPX0RBX0FMTE9DKTsKKwkJCQlzZXRfb3B0KHNiLE5PX0FVVE9fREFfQUxMT0MpOwogCQkJYnJlYWs7CiAJCWNhc2UgT3B0X2Rpc2NhcmQ6Ci0JCQlzZXRfb3B0KHNiaS0+c19tb3VudF9vcHQsIERJU0NBUkQpOworCQkJc2V0X29wdChzYiwgRElTQ0FSRCk7CiAJCQlicmVhazsKIAkJY2FzZSBPcHRfbm9kaXNjYXJkOgotCQkJY2xlYXJfb3B0KHNiaS0+c19tb3VudF9vcHQsIERJU0NBUkQpOworCQkJY2xlYXJfb3B0KHNiLCBESVNDQVJEKTsKIAkJCWJyZWFrOwogCQljYXNlIE9wdF9kaW9yZWFkX25vbG9jazoKLQkJCXNldF9vcHQoc2JpLT5zX21vdW50X29wdCwgRElPUkVBRF9OT0xPQ0spOworCQkJc2V0X29wdChzYiwgRElPUkVBRF9OT0xPQ0spOwogCQkJYnJlYWs7CiAJCWNhc2UgT3B0X2Rpb3JlYWRfbG9jazoKLQkJCWNsZWFyX29wdChzYmktPnNfbW91bnRfb3B0LCBESU9SRUFEX05PTE9DSyk7CisJCQljbGVhcl9vcHQoc2IsIERJT1JFQURfTk9MT0NLKTsKIAkJCWJyZWFrOwogCQljYXNlIE9wdF9pbml0X2lub2RlX3RhYmxlOgotCQkJc2V0X29wdChzYmktPnNfbW91bnRfb3B0LCBJTklUX0lOT0RFX1RBQkxFKTsKKwkJCXNldF9vcHQoc2IsIElOSVRfSU5PREVfVEFCTEUpOwogCQkJaWYgKGFyZ3NbMF0uZnJvbSkgewogCQkJCWlmIChtYXRjaF9pbnQoJmFyZ3NbMF0sICZvcHRpb24pKQogCQkJCQlyZXR1cm4gMDsKQEAgLTE4MTcsNyArMTgyNCw3IEBACiAJCQlzYmktPnNfbGlfd2FpdF9tdWx0ID0gb3B0aW9uOwogCQkJYnJlYWs7CiAJCWNhc2UgT3B0X25vaW5pdF9pbm9kZV90YWJsZToKLQkJCWNsZWFyX29wdChzYmktPnNfbW91bnRfb3B0LCBJTklUX0lOT0RFX1RBQkxFKTsKKwkJCWNsZWFyX29wdChzYiwgSU5JVF9JTk9ERV9UQUJMRSk7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCWV4dDRfbXNnKHNiLCBLRVJOX0VSUiwKQEAgLTE4MjksMTAgKzE4MzYsMTAgQEAKICNpZmRlZiBDT05GSUdfUVVPVEEKIAlpZiAoc2JpLT5zX3FmX25hbWVzW1VTUlFVT1RBXSB8fCBzYmktPnNfcWZfbmFtZXNbR1JQUVVPVEFdKSB7CiAJCWlmICh0ZXN0X29wdChzYiwgVVNSUVVPVEEpICYmIHNiaS0+c19xZl9uYW1lc1tVU1JRVU9UQV0pCi0JCQljbGVhcl9vcHQoc2JpLT5zX21vdW50X29wdCwgVVNSUVVPVEEpOworCQkJY2xlYXJfb3B0KHNiLCBVU1JRVU9UQSk7CiAKIAkJaWYgKHRlc3Rfb3B0KHNiLCBHUlBRVU9UQSkgJiYgc2JpLT5zX3FmX25hbWVzW0dSUFFVT1RBXSkKLQkJCWNsZWFyX29wdChzYmktPnNfbW91bnRfb3B0LCBHUlBRVU9UQSk7CisJCQljbGVhcl9vcHQoc2IsIEdSUFFVT1RBKTsKIAogCQlpZiAodGVzdF9vcHQoc2IsIEdSUFFVT1RBKSB8fCB0ZXN0X29wdChzYiwgVVNSUVVPVEEpKSB7CiAJCQlleHQ0X21zZyhzYiwgS0VSTl9FUlIsICJvbGQgYW5kIG5ldyBxdW90YSAiCkBAIC0xOTAyLDEyICsxOTA5LDEyIEBACiAJZXh0NF9jb21taXRfc3VwZXIoc2IsIDEpOwogCWlmICh0ZXN0X29wdChzYiwgREVCVUcpKQogCQlwcmludGsoS0VSTl9JTkZPICJbRVhUNCBGUyBicz0lbHUsIGdjPSV1LCAiCi0JCQkJImJwZz0lbHUsIGlwZz0lbHUsIG1vPSUwNHhdXG4iLAorCQkJCSJicGc9JWx1LCBpcGc9JWx1LCBtbz0lMDR4LCBtbzI9JTA0eF1cbiIsCiAJCQlzYi0+c19ibG9ja3NpemUsCiAJCQlzYmktPnNfZ3JvdXBzX2NvdW50LAogCQkJRVhUNF9CTE9DS1NfUEVSX0dST1VQKHNiKSwKIAkJCUVYVDRfSU5PREVTX1BFUl9HUk9VUChzYiksCi0JCQlzYmktPnNfbW91bnRfb3B0KTsKKwkJCXNiaS0+c19tb3VudF9vcHQsIHNiaS0+c19tb3VudF9vcHQyKTsKIAogCXJldHVybiByZXM7CiB9CkBAIC0xOTM3LDE0ICsxOTQ0LDEzIEBACiAJc2l6ZSA9IGZsZXhfZ3JvdXBfY291bnQgKiBzaXplb2Yoc3RydWN0IGZsZXhfZ3JvdXBzKTsKIAlzYmktPnNfZmxleF9ncm91cHMgPSBremFsbG9jKHNpemUsIEdGUF9LRVJORUwpOwogCWlmIChzYmktPnNfZmxleF9ncm91cHMgPT0gTlVMTCkgewotCQlzYmktPnNfZmxleF9ncm91cHMgPSB2bWFsbG9jKHNpemUpOwotCQlpZiAoc2JpLT5zX2ZsZXhfZ3JvdXBzKQotCQkJbWVtc2V0KHNiaS0+c19mbGV4X2dyb3VwcywgMCwgc2l6ZSk7Ci0JfQotCWlmIChzYmktPnNfZmxleF9ncm91cHMgPT0gTlVMTCkgewotCQlleHQ0X21zZyhzYiwgS0VSTl9FUlIsICJub3QgZW5vdWdoIG1lbW9yeSBmb3IgIgotCQkJCSIldSBmbGV4IGdyb3VwcyIsIGZsZXhfZ3JvdXBfY291bnQpOwotCQlnb3RvIGZhaWxlZDsKKwkJc2JpLT5zX2ZsZXhfZ3JvdXBzID0gdnphbGxvYyhzaXplKTsKKwkJaWYgKHNiaS0+c19mbGV4X2dyb3VwcyA9PSBOVUxMKSB7CisJCQlleHQ0X21zZyhzYiwgS0VSTl9FUlIsCisJCQkJICJub3QgZW5vdWdoIG1lbW9yeSBmb3IgJXUgZmxleCBncm91cHMiLAorCQkJCSBmbGV4X2dyb3VwX2NvdW50KTsKKwkJCWdvdG8gZmFpbGVkOworCQl9CiAJfQogCiAJZm9yIChpID0gMDsgaSA8IHNiaS0+c19ncm91cHNfY291bnQ7IGkrKykgewpAQCAtMjkyMyw3ICsyOTI5LDcgQEAKIAlzdHJ1Y3QgZXh0NF9zYl9pbmZvICpzYmkgPSBFWFQ0X1NCKHNiKTsKIAlzdHJ1Y3QgZXh0NF9saV9yZXF1ZXN0ICplbHI7CiAJZXh0NF9ncm91cF90IG5ncm91cHMgPSBFWFQ0X1NCKHNiKS0+c19ncm91cHNfY291bnQ7Ci0JaW50IHJldDsKKwlpbnQgcmV0ID0gMDsKIAogCWlmIChzYmktPnNfbGlfcmVxdWVzdCAhPSBOVUxMKQogCQlyZXR1cm4gMDsKQEAgLTMwNzgsNDEgKzMwODQsNDEgQEAKIAogCS8qIFNldCBkZWZhdWx0cyBiZWZvcmUgd2UgcGFyc2UgdGhlIG1vdW50IG9wdGlvbnMgKi8KIAlkZWZfbW91bnRfb3B0cyA9IGxlMzJfdG9fY3B1KGVzLT5zX2RlZmF1bHRfbW91bnRfb3B0cyk7Ci0Jc2V0X29wdChzYmktPnNfbW91bnRfb3B0LCBJTklUX0lOT0RFX1RBQkxFKTsKKwlzZXRfb3B0KHNiLCBJTklUX0lOT0RFX1RBQkxFKTsKIAlpZiAoZGVmX21vdW50X29wdHMgJiBFWFQ0X0RFRk1fREVCVUcpCi0JCXNldF9vcHQoc2JpLT5zX21vdW50X29wdCwgREVCVUcpOworCQlzZXRfb3B0KHNiLCBERUJVRyk7CiAJaWYgKGRlZl9tb3VudF9vcHRzICYgRVhUNF9ERUZNX0JTREdST1VQUykgewogCQlleHQ0X21zZyhzYiwgS0VSTl9XQVJOSU5HLCBkZXByZWNhdGVkX21zZywgImJzZGdyb3VwcyIsCiAJCQkiMi42LjM4Iik7Ci0JCXNldF9vcHQoc2JpLT5zX21vdW50X29wdCwgR1JQSUQpOworCQlzZXRfb3B0KHNiLCBHUlBJRCk7CiAJfQogCWlmIChkZWZfbW91bnRfb3B0cyAmIEVYVDRfREVGTV9VSUQxNikKLQkJc2V0X29wdChzYmktPnNfbW91bnRfb3B0LCBOT19VSUQzMik7CisJCXNldF9vcHQoc2IsIE5PX1VJRDMyKTsKICNpZmRlZiBDT05GSUdfRVhUNF9GU19YQVRUUgogCWlmIChkZWZfbW91bnRfb3B0cyAmIEVYVDRfREVGTV9YQVRUUl9VU0VSKQotCQlzZXRfb3B0KHNiaS0+c19tb3VudF9vcHQsIFhBVFRSX1VTRVIpOworCQlzZXRfb3B0KHNiLCBYQVRUUl9VU0VSKTsKICNlbmRpZgogI2lmZGVmIENPTkZJR19FWFQ0X0ZTX1BPU0lYX0FDTAogCWlmIChkZWZfbW91bnRfb3B0cyAmIEVYVDRfREVGTV9BQ0wpCi0JCXNldF9vcHQoc2JpLT5zX21vdW50X29wdCwgUE9TSVhfQUNMKTsKKwkJc2V0X29wdChzYiwgUE9TSVhfQUNMKTsKICNlbmRpZgogCWlmICgoZGVmX21vdW50X29wdHMgJiBFWFQ0X0RFRk1fSk1PREUpID09IEVYVDRfREVGTV9KTU9ERV9EQVRBKQotCQlzZXRfb3B0KHNiaS0+c19tb3VudF9vcHQsIEpPVVJOQUxfREFUQSk7CisJCXNldF9vcHQoc2IsIEpPVVJOQUxfREFUQSk7CiAJZWxzZSBpZiAoKGRlZl9tb3VudF9vcHRzICYgRVhUNF9ERUZNX0pNT0RFKSA9PSBFWFQ0X0RFRk1fSk1PREVfT1JERVJFRCkKLQkJc2V0X29wdChzYmktPnNfbW91bnRfb3B0LCBPUkRFUkVEX0RBVEEpOworCQlzZXRfb3B0KHNiLCBPUkRFUkVEX0RBVEEpOwogCWVsc2UgaWYgKChkZWZfbW91bnRfb3B0cyAmIEVYVDRfREVGTV9KTU9ERSkgPT0gRVhUNF9ERUZNX0pNT0RFX1dCQUNLKQotCQlzZXRfb3B0KHNiaS0+c19tb3VudF9vcHQsIFdSSVRFQkFDS19EQVRBKTsKKwkJc2V0X29wdChzYiwgV1JJVEVCQUNLX0RBVEEpOwogCiAJaWYgKGxlMTZfdG9fY3B1KHNiaS0+c19lcy0+c19lcnJvcnMpID09IEVYVDRfRVJST1JTX1BBTklDKQotCQlzZXRfb3B0KHNiaS0+c19tb3VudF9vcHQsIEVSUk9SU19QQU5JQyk7CisJCXNldF9vcHQoc2IsIEVSUk9SU19QQU5JQyk7CiAJZWxzZSBpZiAobGUxNl90b19jcHUoc2JpLT5zX2VzLT5zX2Vycm9ycykgPT0gRVhUNF9FUlJPUlNfQ09OVElOVUUpCi0JCXNldF9vcHQoc2JpLT5zX21vdW50X29wdCwgRVJST1JTX0NPTlQpOworCQlzZXRfb3B0KHNiLCBFUlJPUlNfQ09OVCk7CiAJZWxzZQotCQlzZXRfb3B0KHNiaS0+c19tb3VudF9vcHQsIEVSUk9SU19STyk7CisJCXNldF9vcHQoc2IsIEVSUk9SU19STyk7CiAJaWYgKGRlZl9tb3VudF9vcHRzICYgRVhUNF9ERUZNX0JMT0NLX1ZBTElESVRZKQotCQlzZXRfb3B0KHNiaS0+c19tb3VudF9vcHQsIEJMT0NLX1ZBTElESVRZKTsKKwkJc2V0X29wdChzYiwgQkxPQ0tfVkFMSURJVFkpOwogCWlmIChkZWZfbW91bnRfb3B0cyAmIEVYVDRfREVGTV9ESVNDQVJEKQotCQlzZXRfb3B0KHNiaS0+c19tb3VudF9vcHQsIERJU0NBUkQpOworCQlzZXRfb3B0KHNiLCBESVNDQVJEKTsKIAogCXNiaS0+c19yZXN1aWQgPSBsZTE2X3RvX2NwdShlcy0+c19kZWZfcmVzdWlkKTsKIAlzYmktPnNfcmVzZ2lkID0gbGUxNl90b19jcHUoZXMtPnNfZGVmX3Jlc2dpZCk7CkBAIC0zMTIxLDcgKzMxMjcsNyBAQAogCXNiaS0+c19tYXhfYmF0Y2hfdGltZSA9IEVYVDRfREVGX01BWF9CQVRDSF9USU1FOwogCiAJaWYgKChkZWZfbW91bnRfb3B0cyAmIEVYVDRfREVGTV9OT0JBUlJJRVIpID09IDApCi0JCXNldF9vcHQoc2JpLT5zX21vdW50X29wdCwgQkFSUklFUik7CisJCXNldF9vcHQoc2IsIEJBUlJJRVIpOwogCiAJLyoKIAkgKiBlbmFibGUgZGVsYXllZCBhbGxvY2F0aW9uIGJ5IGRlZmF1bHQKQEAgLTMxMjksNyArMzEzNSw3IEBACiAJICovCiAJaWYgKCFJU19FWFQzX1NCKHNiKSAmJgogCSAgICAoKGRlZl9tb3VudF9vcHRzICYgRVhUNF9ERUZNX05PREVMQUxMT0MpID09IDApKQotCQlzZXRfb3B0KHNiaS0+c19tb3VudF9vcHQsIERFTEFMTE9DKTsKKwkJc2V0X29wdChzYiwgREVMQUxMT0MpOwogCiAJaWYgKCFwYXJzZV9vcHRpb25zKChjaGFyICopIHNiaS0+c19lcy0+c19tb3VudF9vcHRzLCBzYiwKIAkJCSAgICZqb3VybmFsX2Rldm51bSwgJmpvdXJuYWxfaW9wcmlvLCBOVUxMLCAwKSkgewpAQCAtMzQzMiw4ICszNDM4LDggQEAKIAkJICAgICAgICJzdXBwcmVzc2VkIGFuZCBub3QgbW91bnRlZCByZWFkLW9ubHkiKTsKIAkJZ290byBmYWlsZWRfbW91bnRfd3E7CiAJfSBlbHNlIHsKLQkJY2xlYXJfb3B0KHNiaS0+c19tb3VudF9vcHQsIERBVEFfRkxBR1MpOwotCQlzZXRfb3B0KHNiaS0+c19tb3VudF9vcHQsIFdSSVRFQkFDS19EQVRBKTsKKwkJY2xlYXJfb3B0KHNiLCBEQVRBX0ZMQUdTKTsKKwkJc2V0X29wdChzYiwgV1JJVEVCQUNLX0RBVEEpOwogCQlzYmktPnNfam91cm5hbCA9IE5VTEw7CiAJCW5lZWRzX3JlY292ZXJ5ID0gMDsKIAkJZ290byBub19qb3VybmFsOwpAQCAtMzQ3MSw5ICszNDc3LDkgQEAKIAkJICovCiAJCWlmIChqYmQyX2pvdXJuYWxfY2hlY2tfYXZhaWxhYmxlX2ZlYXR1cmVzCiAJCSAgICAoc2JpLT5zX2pvdXJuYWwsIDAsIDAsIEpCRDJfRkVBVFVSRV9JTkNPTVBBVF9SRVZPS0UpKQotCQkJc2V0X29wdChzYmktPnNfbW91bnRfb3B0LCBPUkRFUkVEX0RBVEEpOworCQkJc2V0X29wdChzYiwgT1JERVJFRF9EQVRBKTsKIAkJZWxzZQotCQkJc2V0X29wdChzYmktPnNfbW91bnRfb3B0LCBKT1VSTkFMX0RBVEEpOworCQkJc2V0X29wdChzYiwgSk9VUk5BTF9EQVRBKTsKIAkJYnJlYWs7CiAKIAljYXNlIEVYVDRfTU9VTlRfT1JERVJFRF9EQVRBOgpAQCAtMzU2MywxOCArMzU2OSwxOCBAQAogCSAgICAodGVzdF9vcHQoc2IsIERBVEFfRkxBR1MpID09IEVYVDRfTU9VTlRfSk9VUk5BTF9EQVRBKSkgewogCQlleHQ0X21zZyhzYiwgS0VSTl9XQVJOSU5HLCAiSWdub3JpbmcgZGVsYWxsb2Mgb3B0aW9uIC0gIgogCQkJICJyZXF1ZXN0ZWQgZGF0YSBqb3VybmFsaW5nIG1vZGUiKTsKLQkJY2xlYXJfb3B0KHNiaS0+c19tb3VudF9vcHQsIERFTEFMTE9DKTsKKwkJY2xlYXJfb3B0KHNiLCBERUxBTExPQyk7CiAJfQogCWlmICh0ZXN0X29wdChzYiwgRElPUkVBRF9OT0xPQ0spKSB7CiAJCWlmICh0ZXN0X29wdChzYiwgREFUQV9GTEFHUykgPT0gRVhUNF9NT1VOVF9KT1VSTkFMX0RBVEEpIHsKIAkJCWV4dDRfbXNnKHNiLCBLRVJOX1dBUk5JTkcsICJJZ25vcmluZyBkaW9yZWFkX25vbG9jayAiCiAJCQkJIm9wdGlvbiAtIHJlcXVlc3RlZCBkYXRhIGpvdXJuYWxpbmcgbW9kZSIpOwotCQkJY2xlYXJfb3B0KHNiaS0+c19tb3VudF9vcHQsIERJT1JFQURfTk9MT0NLKTsKKwkJCWNsZWFyX29wdChzYiwgRElPUkVBRF9OT0xPQ0spOwogCQl9CiAJCWlmIChzYi0+c19ibG9ja3NpemUgPCBQQUdFX1NJWkUpIHsKIAkJCWV4dDRfbXNnKHNiLCBLRVJOX1dBUk5JTkcsICJJZ25vcmluZyBkaW9yZWFkX25vbG9jayAiCiAJCQkJIm9wdGlvbiAtIGJsb2NrIHNpemUgaXMgdG9vIHNtYWxsIik7Ci0JCQljbGVhcl9vcHQoc2JpLT5zX21vdW50X29wdCwgRElPUkVBRF9OT0xPQ0spOworCQkJY2xlYXJfb3B0KHNiLCBESU9SRUFEX05PTE9DSyk7CiAJCX0KIAl9CiAKQEAgLTQxNzMsNiArNDE3OSwyMiBAQAogCXJldHVybiAwOwogfQogCisvKgorICogU3RydWN0dXJlIHRvIHNhdmUgbW91bnQgb3B0aW9ucyBmb3IgZXh0NF9yZW1vdW50J3MgYmVuZWZpdAorICovCitzdHJ1Y3QgZXh0NF9tb3VudF9vcHRpb25zIHsKKwl1bnNpZ25lZCBsb25nIHNfbW91bnRfb3B0OworCXVuc2lnbmVkIGxvbmcgc19tb3VudF9vcHQyOworCXVpZF90IHNfcmVzdWlkOworCWdpZF90IHNfcmVzZ2lkOworCXVuc2lnbmVkIGxvbmcgc19jb21taXRfaW50ZXJ2YWw7CisJdTMyIHNfbWluX2JhdGNoX3RpbWUsIHNfbWF4X2JhdGNoX3RpbWU7CisjaWZkZWYgQ09ORklHX1FVT1RBCisJaW50IHNfanF1b3RhX2ZtdDsKKwljaGFyICpzX3FmX25hbWVzW01BWFFVT1RBU107CisjZW5kaWYKK307CisKIHN0YXRpYyBpbnQgZXh0NF9yZW1vdW50KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCAqZmxhZ3MsIGNoYXIgKmRhdGEpCiB7CiAJc3RydWN0IGV4dDRfc3VwZXJfYmxvY2sgKmVzOwpAQCAtNDE5Myw2ICs0MjE1LDcgQEAKIAlsb2NrX3N1cGVyKHNiKTsKIAlvbGRfc2JfZmxhZ3MgPSBzYi0+c19mbGFnczsKIAlvbGRfb3B0cy5zX21vdW50X29wdCA9IHNiaS0+c19tb3VudF9vcHQ7CisJb2xkX29wdHMuc19tb3VudF9vcHQyID0gc2JpLT5zX21vdW50X29wdDI7CiAJb2xkX29wdHMuc19yZXN1aWQgPSBzYmktPnNfcmVzdWlkOwogCW9sZF9vcHRzLnNfcmVzZ2lkID0gc2JpLT5zX3Jlc2dpZDsKIAlvbGRfb3B0cy5zX2NvbW1pdF9pbnRlcnZhbCA9IHNiaS0+c19jb21taXRfaW50ZXJ2YWw7CkBAIC00MzQ2LDYgKzQzNjksNyBAQAogcmVzdG9yZV9vcHRzOgogCXNiLT5zX2ZsYWdzID0gb2xkX3NiX2ZsYWdzOwogCXNiaS0+c19tb3VudF9vcHQgPSBvbGRfb3B0cy5zX21vdW50X29wdDsKKwlzYmktPnNfbW91bnRfb3B0MiA9IG9sZF9vcHRzLnNfbW91bnRfb3B0MjsKIAlzYmktPnNfcmVzdWlkID0gb2xkX29wdHMuc19yZXN1aWQ7CiAJc2JpLT5zX3Jlc2dpZCA9IG9sZF9vcHRzLnNfcmVzZ2lkOwogCXNiaS0+c19jb21taXRfaW50ZXJ2YWwgPSBvbGRfb3B0cy5zX2NvbW1pdF9pbnRlcnZhbDsKZGlmZiAtLWdpdCBhL2ZzL2V4dDQveGF0dHIuYyBiL2ZzL2V4dDQveGF0dHIuYwppbmRleCBmYTRiODk5Li5mYzMyMTc2IDEwMDY0NAotLS0gYS9mcy9leHQ0L3hhdHRyLmMKKysrIGIvZnMvZXh0NC94YXR0ci5jCkBAIC00MjcsMjMgKzQyNywyMyBAQAogc3RhdGljIGludAogZXh0NF94YXR0cl9saXN0KHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgY2hhciAqYnVmZmVyLCBzaXplX3QgYnVmZmVyX3NpemUpCiB7Ci0JaW50IGlfZXJyb3IsIGJfZXJyb3I7CisJaW50IHJldCwgcmV0MjsKIAogCWRvd25fcmVhZCgmRVhUNF9JKGRlbnRyeS0+ZF9pbm9kZSktPnhhdHRyX3NlbSk7Ci0JaV9lcnJvciA9IGV4dDRfeGF0dHJfaWJvZHlfbGlzdChkZW50cnksIGJ1ZmZlciwgYnVmZmVyX3NpemUpOwotCWlmIChpX2Vycm9yIDwgMCkgewotCQliX2Vycm9yID0gMDsKLQl9IGVsc2UgewotCQlpZiAoYnVmZmVyKSB7Ci0JCQlidWZmZXIgKz0gaV9lcnJvcjsKLQkJCWJ1ZmZlcl9zaXplIC09IGlfZXJyb3I7Ci0JCX0KLQkJYl9lcnJvciA9IGV4dDRfeGF0dHJfYmxvY2tfbGlzdChkZW50cnksIGJ1ZmZlciwgYnVmZmVyX3NpemUpOwotCQlpZiAoYl9lcnJvciA8IDApCi0JCQlpX2Vycm9yID0gMDsKKwlyZXQgPSByZXQyID0gZXh0NF94YXR0cl9pYm9keV9saXN0KGRlbnRyeSwgYnVmZmVyLCBidWZmZXJfc2l6ZSk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyb3V0OworCWlmIChidWZmZXIpIHsKKwkJYnVmZmVyICs9IHJldDsKKwkJYnVmZmVyX3NpemUgLT0gcmV0OwogCX0KKwlyZXQgPSBleHQ0X3hhdHRyX2Jsb2NrX2xpc3QoZGVudHJ5LCBidWZmZXIsIGJ1ZmZlcl9zaXplKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnJvdXQ7CisJcmV0ICs9IHJldDI7CitlcnJvdXQ6CiAJdXBfcmVhZCgmRVhUNF9JKGRlbnRyeS0+ZF9pbm9kZSktPnhhdHRyX3NlbSk7Ci0JcmV0dXJuIGlfZXJyb3IgKyBiX2Vycm9yOworCXJldHVybiByZXQ7CiB9CiAKIC8qCkBAIC05NDcsNyArOTQ3LDcgQEAKIC8qCiAgKiBleHQ0X3hhdHRyX3NldF9oYW5kbGUoKQogICoKLSAqIENyZWF0ZSwgcmVwbGFjZSBvciByZW1vdmUgYW4gZXh0ZW5kZWQgYXR0cmlidXRlIGZvciB0aGlzIGlub2RlLiBCdWZmZXIKKyAqIENyZWF0ZSwgcmVwbGFjZSBvciByZW1vdmUgYW4gZXh0ZW5kZWQgYXR0cmlidXRlIGZvciB0aGlzIGlub2RlLiAgVmFsdWUKICAqIGlzIE5VTEwgdG8gcmVtb3ZlIGFuIGV4aXN0aW5nIGV4dGVuZGVkIGF0dHJpYnV0ZSwgYW5kIG5vbi1OVUxMIHRvCiAgKiBlaXRoZXIgcmVwbGFjZSBhbiBleGlzdGluZyBleHRlbmRlZCBhdHRyaWJ1dGUsIG9yIGNyZWF0ZSBhIG5ldyBleHRlbmRlZAogICogYXR0cmlidXRlLiBUaGUgZmxhZ3MgWEFUVFJfUkVQTEFDRSBhbmQgWEFUVFJfQ1JFQVRFCmRpZmYgLS1naXQgYS9mcy9mdXNlL2Rldi5jIGIvZnMvZnVzZS9kZXYuYwppbmRleCA2ZTA3Njk2Li5jZjhkMjhkIDEwMDY0NAotLS0gYS9mcy9mdXNlL2Rldi5jCisrKyBiL2ZzL2Z1c2UvZGV2LmMKQEAgLTI1MSw2ICsyNTEsMjAgQEAKIAlraWxsX2Zhc3luYygmZmMtPmZhc3luYywgU0lHSU8sIFBPTExfSU4pOwogfQogCit2b2lkIGZ1c2VfcXVldWVfZm9yZ2V0KHN0cnVjdCBmdXNlX2Nvbm4gKmZjLCBzdHJ1Y3QgZnVzZV9mb3JnZXRfbGluayAqZm9yZ2V0LAorCQkgICAgICAgdTY0IG5vZGVpZCwgdTY0IG5sb29rdXApCit7CisJZm9yZ2V0LT5mb3JnZXRfb25lLm5vZGVpZCA9IG5vZGVpZDsKKwlmb3JnZXQtPmZvcmdldF9vbmUubmxvb2t1cCA9IG5sb29rdXA7CisKKwlzcGluX2xvY2soJmZjLT5sb2NrKTsKKwlmYy0+Zm9yZ2V0X2xpc3RfdGFpbC0+bmV4dCA9IGZvcmdldDsKKwlmYy0+Zm9yZ2V0X2xpc3RfdGFpbCA9IGZvcmdldDsKKwl3YWtlX3VwKCZmYy0+d2FpdHEpOworCWtpbGxfZmFzeW5jKCZmYy0+ZmFzeW5jLCBTSUdJTywgUE9MTF9JTik7CisJc3Bpbl91bmxvY2soJmZjLT5sb2NrKTsKK30KKwogc3RhdGljIHZvaWQgZmx1c2hfYmdfcXVldWUoc3RydWN0IGZ1c2VfY29ubiAqZmMpCiB7CiAJd2hpbGUgKGZjLT5hY3RpdmVfYmFja2dyb3VuZCA8IGZjLT5tYXhfYmFja2dyb3VuZCAmJgpAQCAtNDM4LDEyICs0NTIsNiBAQAogCX0KIH0KIAotdm9pZCBmdXNlX3JlcXVlc3Rfc2VuZF9ub3JlcGx5KHN0cnVjdCBmdXNlX2Nvbm4gKmZjLCBzdHJ1Y3QgZnVzZV9yZXEgKnJlcSkKLXsKLQlyZXEtPmlzcmVwbHkgPSAwOwotCWZ1c2VfcmVxdWVzdF9zZW5kX25vd2FpdChmYywgcmVxKTsKLX0KLQogdm9pZCBmdXNlX3JlcXVlc3Rfc2VuZF9iYWNrZ3JvdW5kKHN0cnVjdCBmdXNlX2Nvbm4gKmZjLCBzdHJ1Y3QgZnVzZV9yZXEgKnJlcSkKIHsKIAlyZXEtPmlzcmVwbHkgPSAxOwpAQCAtODk2LDkgKzkwNCwxNSBAQAogCXJldHVybiBlcnI7CiB9CiAKK3N0YXRpYyBpbnQgZm9yZ2V0X3BlbmRpbmcoc3RydWN0IGZ1c2VfY29ubiAqZmMpCit7CisJcmV0dXJuIGZjLT5mb3JnZXRfbGlzdF9oZWFkLm5leHQgIT0gTlVMTDsKK30KKwogc3RhdGljIGludCByZXF1ZXN0X3BlbmRpbmcoc3RydWN0IGZ1c2VfY29ubiAqZmMpCiB7Ci0JcmV0dXJuICFsaXN0X2VtcHR5KCZmYy0+cGVuZGluZykgfHwgIWxpc3RfZW1wdHkoJmZjLT5pbnRlcnJ1cHRzKTsKKwlyZXR1cm4gIWxpc3RfZW1wdHkoJmZjLT5wZW5kaW5nKSB8fCAhbGlzdF9lbXB0eSgmZmMtPmludGVycnVwdHMpIHx8CisJCWZvcmdldF9wZW5kaW5nKGZjKTsKIH0KIAogLyogV2FpdCB1bnRpbCBhIHJlcXVlc3QgaXMgYXZhaWxhYmxlIG9uIHRoZSBwZW5kaW5nIGxpc3QgKi8KQEAgLTk2MCw2ICs5NzQsMTIwIEBACiAJcmV0dXJuIGVyciA/IGVyciA6IHJlcXNpemU7CiB9CiAKK3N0YXRpYyBzdHJ1Y3QgZnVzZV9mb3JnZXRfbGluayAqZGVxdWV1ZV9mb3JnZXQoc3RydWN0IGZ1c2VfY29ubiAqZmMsCisJCQkJCSAgICAgICB1bnNpZ25lZCBtYXgsCisJCQkJCSAgICAgICB1bnNpZ25lZCAqY291bnRwKQoreworCXN0cnVjdCBmdXNlX2ZvcmdldF9saW5rICpoZWFkID0gZmMtPmZvcmdldF9saXN0X2hlYWQubmV4dDsKKwlzdHJ1Y3QgZnVzZV9mb3JnZXRfbGluayAqKm5ld2hlYWQgPSAmaGVhZDsKKwl1bnNpZ25lZCBjb3VudDsKKworCWZvciAoY291bnQgPSAwOyAqbmV3aGVhZCAhPSBOVUxMICYmIGNvdW50IDwgbWF4OyBjb3VudCsrKQorCQluZXdoZWFkID0gJigqbmV3aGVhZCktPm5leHQ7CisKKwlmYy0+Zm9yZ2V0X2xpc3RfaGVhZC5uZXh0ID0gKm5ld2hlYWQ7CisJKm5ld2hlYWQgPSBOVUxMOworCWlmIChmYy0+Zm9yZ2V0X2xpc3RfaGVhZC5uZXh0ID09IE5VTEwpCisJCWZjLT5mb3JnZXRfbGlzdF90YWlsID0gJmZjLT5mb3JnZXRfbGlzdF9oZWFkOworCisJaWYgKGNvdW50cCAhPSBOVUxMKQorCQkqY291bnRwID0gY291bnQ7CisKKwlyZXR1cm4gaGVhZDsKK30KKworc3RhdGljIGludCBmdXNlX3JlYWRfc2luZ2xlX2ZvcmdldChzdHJ1Y3QgZnVzZV9jb25uICpmYywKKwkJCQkgICBzdHJ1Y3QgZnVzZV9jb3B5X3N0YXRlICpjcywKKwkJCQkgICBzaXplX3QgbmJ5dGVzKQorX19yZWxlYXNlcyhmYy0+bG9jaykKK3sKKwlpbnQgZXJyOworCXN0cnVjdCBmdXNlX2ZvcmdldF9saW5rICpmb3JnZXQgPSBkZXF1ZXVlX2ZvcmdldChmYywgMSwgTlVMTCk7CisJc3RydWN0IGZ1c2VfZm9yZ2V0X2luIGFyZyA9IHsKKwkJLm5sb29rdXAgPSBmb3JnZXQtPmZvcmdldF9vbmUubmxvb2t1cCwKKwl9OworCXN0cnVjdCBmdXNlX2luX2hlYWRlciBpaCA9IHsKKwkJLm9wY29kZSA9IEZVU0VfRk9SR0VULAorCQkubm9kZWlkID0gZm9yZ2V0LT5mb3JnZXRfb25lLm5vZGVpZCwKKwkJLnVuaXF1ZSA9IGZ1c2VfZ2V0X3VuaXF1ZShmYyksCisJCS5sZW4gPSBzaXplb2YoaWgpICsgc2l6ZW9mKGFyZyksCisJfTsKKworCXNwaW5fdW5sb2NrKCZmYy0+bG9jayk7CisJa2ZyZWUoZm9yZ2V0KTsKKwlpZiAobmJ5dGVzIDwgaWgubGVuKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWVyciA9IGZ1c2VfY29weV9vbmUoY3MsICZpaCwgc2l6ZW9mKGloKSk7CisJaWYgKCFlcnIpCisJCWVyciA9IGZ1c2VfY29weV9vbmUoY3MsICZhcmcsIHNpemVvZihhcmcpKTsKKwlmdXNlX2NvcHlfZmluaXNoKGNzKTsKKworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlyZXR1cm4gaWgubGVuOworfQorCitzdGF0aWMgaW50IGZ1c2VfcmVhZF9iYXRjaF9mb3JnZXQoc3RydWN0IGZ1c2VfY29ubiAqZmMsCisJCQkJICAgc3RydWN0IGZ1c2VfY29weV9zdGF0ZSAqY3MsIHNpemVfdCBuYnl0ZXMpCitfX3JlbGVhc2VzKGZjLT5sb2NrKQoreworCWludCBlcnI7CisJdW5zaWduZWQgbWF4X2ZvcmdldHM7CisJdW5zaWduZWQgY291bnQ7CisJc3RydWN0IGZ1c2VfZm9yZ2V0X2xpbmsgKmhlYWQ7CisJc3RydWN0IGZ1c2VfYmF0Y2hfZm9yZ2V0X2luIGFyZyA9IHsgLmNvdW50ID0gMCB9OworCXN0cnVjdCBmdXNlX2luX2hlYWRlciBpaCA9IHsKKwkJLm9wY29kZSA9IEZVU0VfQkFUQ0hfRk9SR0VULAorCQkudW5pcXVlID0gZnVzZV9nZXRfdW5pcXVlKGZjKSwKKwkJLmxlbiA9IHNpemVvZihpaCkgKyBzaXplb2YoYXJnKSwKKwl9OworCisJaWYgKG5ieXRlcyA8IGloLmxlbikgeworCQlzcGluX3VubG9jaygmZmMtPmxvY2spOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwltYXhfZm9yZ2V0cyA9IChuYnl0ZXMgLSBpaC5sZW4pIC8gc2l6ZW9mKHN0cnVjdCBmdXNlX2ZvcmdldF9vbmUpOworCWhlYWQgPSBkZXF1ZXVlX2ZvcmdldChmYywgbWF4X2ZvcmdldHMsICZjb3VudCk7CisJc3Bpbl91bmxvY2soJmZjLT5sb2NrKTsKKworCWFyZy5jb3VudCA9IGNvdW50OworCWloLmxlbiArPSBjb3VudCAqIHNpemVvZihzdHJ1Y3QgZnVzZV9mb3JnZXRfb25lKTsKKwllcnIgPSBmdXNlX2NvcHlfb25lKGNzLCAmaWgsIHNpemVvZihpaCkpOworCWlmICghZXJyKQorCQllcnIgPSBmdXNlX2NvcHlfb25lKGNzLCAmYXJnLCBzaXplb2YoYXJnKSk7CisKKwl3aGlsZSAoaGVhZCkgeworCQlzdHJ1Y3QgZnVzZV9mb3JnZXRfbGluayAqZm9yZ2V0ID0gaGVhZDsKKworCQlpZiAoIWVycikgeworCQkJZXJyID0gZnVzZV9jb3B5X29uZShjcywgJmZvcmdldC0+Zm9yZ2V0X29uZSwKKwkJCQkJICAgIHNpemVvZihmb3JnZXQtPmZvcmdldF9vbmUpKTsKKwkJfQorCQloZWFkID0gZm9yZ2V0LT5uZXh0OworCQlrZnJlZShmb3JnZXQpOworCX0KKworCWZ1c2VfY29weV9maW5pc2goY3MpOworCisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCXJldHVybiBpaC5sZW47Cit9CisKK3N0YXRpYyBpbnQgZnVzZV9yZWFkX2ZvcmdldChzdHJ1Y3QgZnVzZV9jb25uICpmYywgc3RydWN0IGZ1c2VfY29weV9zdGF0ZSAqY3MsCisJCQkgICAgc2l6ZV90IG5ieXRlcykKK19fcmVsZWFzZXMoZmMtPmxvY2spCit7CisJaWYgKGZjLT5taW5vciA8IDE2IHx8IGZjLT5mb3JnZXRfbGlzdF9oZWFkLm5leHQtPm5leHQgPT0gTlVMTCkKKwkJcmV0dXJuIGZ1c2VfcmVhZF9zaW5nbGVfZm9yZ2V0KGZjLCBjcywgbmJ5dGVzKTsKKwllbHNlCisJCXJldHVybiBmdXNlX3JlYWRfYmF0Y2hfZm9yZ2V0KGZjLCBjcywgbmJ5dGVzKTsKK30KKwogLyoKICAqIFJlYWQgYSBzaW5nbGUgcmVxdWVzdCBpbnRvIHRoZSB1c2Vyc3BhY2UgZmlsZXN5c3RlbSdzIGJ1ZmZlci4gIFRoaXMKICAqIGZ1bmN0aW9uIHdhaXRzIHVudGlsIGEgcmVxdWVzdCBpcyBhdmFpbGFibGUsIHRoZW4gcmVtb3ZlcyBpdCBmcm9tCkBAIC05OTgsNiArMTEyNiwxNCBAQAogCQlyZXR1cm4gZnVzZV9yZWFkX2ludGVycnVwdChmYywgY3MsIG5ieXRlcywgcmVxKTsKIAl9CiAKKwlpZiAoZm9yZ2V0X3BlbmRpbmcoZmMpKSB7CisJCWlmIChsaXN0X2VtcHR5KCZmYy0+cGVuZGluZykgfHwgZmMtPmZvcmdldF9iYXRjaC0tID4gMCkKKwkJCXJldHVybiBmdXNlX3JlYWRfZm9yZ2V0KGZjLCBjcywgbmJ5dGVzKTsKKworCQlpZiAoZmMtPmZvcmdldF9iYXRjaCA8PSAtOCkKKwkJCWZjLT5mb3JnZXRfYmF0Y2ggPSAxNjsKKwl9CisKIAlyZXEgPSBsaXN0X2VudHJ5KGZjLT5wZW5kaW5nLm5leHQsIHN0cnVjdCBmdXNlX3JlcSwgbGlzdCk7CiAJcmVxLT5zdGF0ZSA9IEZVU0VfUkVRX1JFQURJTkc7CiAJbGlzdF9tb3ZlKCZyZXEtPmxpc3QsICZmYy0+aW8pOwpAQCAtMTA5MCw3ICsxMjI2LDcgQEAKIAlpZiAoIWZjKQogCQlyZXR1cm4gLUVQRVJNOwogCi0JYnVmcyA9IGttYWxsb2MocGlwZS0+YnVmZmVycyAqIHNpemVvZiAoc3RydWN0IHBpcGVfYnVmZmVyKSwgR0ZQX0tFUk5FTCk7CisJYnVmcyA9IGttYWxsb2MocGlwZS0+YnVmZmVycyAqIHNpemVvZihzdHJ1Y3QgcGlwZV9idWZmZXIpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWJ1ZnMpCiAJCXJldHVybiAtRU5PTUVNOwogCkBAIC0xNjI2LDcgKzE3NjIsNyBAQAogCWlmICghZmMpCiAJCXJldHVybiAtRVBFUk07CiAKLQlidWZzID0ga21hbGxvYyhwaXBlLT5idWZmZXJzICogc2l6ZW9mIChzdHJ1Y3QgcGlwZV9idWZmZXIpLCBHRlBfS0VSTkVMKTsKKwlidWZzID0ga21hbGxvYyhwaXBlLT5idWZmZXJzICogc2l6ZW9mKHN0cnVjdCBwaXBlX2J1ZmZlciksIEdGUF9LRVJORUwpOwogCWlmICghYnVmcykKIAkJcmV0dXJuIC1FTk9NRU07CiAKQEAgLTE3NzAsNiArMTkwNiw4IEBACiAJZmx1c2hfYmdfcXVldWUoZmMpOwogCWVuZF9yZXF1ZXN0cyhmYywgJmZjLT5wZW5kaW5nKTsKIAllbmRfcmVxdWVzdHMoZmMsICZmYy0+cHJvY2Vzc2luZyk7CisJd2hpbGUgKGZvcmdldF9wZW5kaW5nKGZjKSkKKwkJa2ZyZWUoZGVxdWV1ZV9mb3JnZXQoZmMsIDEsIE5VTEwpKTsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL2ZzL2Z1c2UvZGlyLmMgYi9mcy9mdXNlL2Rpci5jCmluZGV4IGY3Mzg1OTkuLjA0MmFmNzMgMTAwNjQ0Ci0tLSBhL2ZzL2Z1c2UvZGlyLmMKKysrIGIvZnMvZnVzZS9kaXIuYwpAQCAtMTAsOSArMTAsOSBAQAogCiAjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgogI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KLSNpbmNsdWRlIDxsaW51eC9nZnAuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L25hbWVpLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogCiAjaWYgQklUU19QRVJfTE9ORyA+PSA2NAogc3RhdGljIGlubGluZSB2b2lkIGZ1c2VfZGVudHJ5X3NldHRpbWUoc3RydWN0IGRlbnRyeSAqZW50cnksIHU2NCB0aW1lKQpAQCAtMTY5LDcgKzE2OSw3IEBACiAJCXN0cnVjdCBmdXNlX2VudHJ5X291dCBvdXRhcmc7CiAJCXN0cnVjdCBmdXNlX2Nvbm4gKmZjOwogCQlzdHJ1Y3QgZnVzZV9yZXEgKnJlcTsKLQkJc3RydWN0IGZ1c2VfcmVxICpmb3JnZXRfcmVxOworCQlzdHJ1Y3QgZnVzZV9mb3JnZXRfbGluayAqZm9yZ2V0OwogCQlzdHJ1Y3QgZGVudHJ5ICpwYXJlbnQ7CiAJCXU2NCBhdHRyX3ZlcnNpb247CiAKQEAgLTE4Miw4ICsxODIsOCBAQAogCQlpZiAoSVNfRVJSKHJlcSkpCiAJCQlyZXR1cm4gMDsKIAotCQlmb3JnZXRfcmVxID0gZnVzZV9nZXRfcmVxKGZjKTsKLQkJaWYgKElTX0VSUihmb3JnZXRfcmVxKSkgeworCQlmb3JnZXQgPSBmdXNlX2FsbG9jX2ZvcmdldCgpOworCQlpZiAoIWZvcmdldCkgewogCQkJZnVzZV9wdXRfcmVxdWVzdChmYywgcmVxKTsKIAkJCXJldHVybiAwOwogCQl9CkBAIC0yMDMsMTUgKzIwMywxNCBAQAogCQlpZiAoIWVycikgewogCQkJc3RydWN0IGZ1c2VfaW5vZGUgKmZpID0gZ2V0X2Z1c2VfaW5vZGUoaW5vZGUpOwogCQkJaWYgKG91dGFyZy5ub2RlaWQgIT0gZ2V0X25vZGVfaWQoaW5vZGUpKSB7Ci0JCQkJZnVzZV9zZW5kX2ZvcmdldChmYywgZm9yZ2V0X3JlcSwKLQkJCQkJCSBvdXRhcmcubm9kZWlkLCAxKTsKKwkJCQlmdXNlX3F1ZXVlX2ZvcmdldChmYywgZm9yZ2V0LCBvdXRhcmcubm9kZWlkLCAxKTsKIAkJCQlyZXR1cm4gMDsKIAkJCX0KIAkJCXNwaW5fbG9jaygmZmMtPmxvY2spOwogCQkJZmktPm5sb29rdXArKzsKIAkJCXNwaW5fdW5sb2NrKCZmYy0+bG9jayk7CiAJCX0KLQkJZnVzZV9wdXRfcmVxdWVzdChmYywgZm9yZ2V0X3JlcSk7CisJCWtmcmVlKGZvcmdldCk7CiAJCWlmIChlcnIgfHwgKG91dGFyZy5hdHRyLm1vZGUgXiBpbm9kZS0+aV9tb2RlKSAmIFNfSUZNVCkKIAkJCXJldHVybiAwOwogCkBAIC0yNjMsNyArMjYyLDcgQEAKIHsKIAlzdHJ1Y3QgZnVzZV9jb25uICpmYyA9IGdldF9mdXNlX2Nvbm5fc3VwZXIoc2IpOwogCXN0cnVjdCBmdXNlX3JlcSAqcmVxOwotCXN0cnVjdCBmdXNlX3JlcSAqZm9yZ2V0X3JlcTsKKwlzdHJ1Y3QgZnVzZV9mb3JnZXRfbGluayAqZm9yZ2V0OwogCXU2NCBhdHRyX3ZlcnNpb247CiAJaW50IGVycjsKIApAQCAtMjc3LDkgKzI3Niw5IEBACiAJaWYgKElTX0VSUihyZXEpKQogCQlnb3RvIG91dDsKIAotCWZvcmdldF9yZXEgPSBmdXNlX2dldF9yZXEoZmMpOwotCWVyciA9IFBUUl9FUlIoZm9yZ2V0X3JlcSk7Ci0JaWYgKElTX0VSUihmb3JnZXRfcmVxKSkgeworCWZvcmdldCA9IGZ1c2VfYWxsb2NfZm9yZ2V0KCk7CisJZXJyID0gLUVOT01FTTsKKwlpZiAoIWZvcmdldCkgewogCQlmdXNlX3B1dF9yZXF1ZXN0KGZjLCByZXEpOwogCQlnb3RvIG91dDsKIAl9CkBAIC0zMDUsMTMgKzMwNCwxMyBAQAogCQkJICAgYXR0cl92ZXJzaW9uKTsKIAllcnIgPSAtRU5PTUVNOwogCWlmICghKmlub2RlKSB7Ci0JCWZ1c2Vfc2VuZF9mb3JnZXQoZmMsIGZvcmdldF9yZXEsIG91dGFyZy0+bm9kZWlkLCAxKTsKKwkJZnVzZV9xdWV1ZV9mb3JnZXQoZmMsIGZvcmdldCwgb3V0YXJnLT5ub2RlaWQsIDEpOwogCQlnb3RvIG91dDsKIAl9CiAJZXJyID0gMDsKIAogIG91dF9wdXRfZm9yZ2V0OgotCWZ1c2VfcHV0X3JlcXVlc3QoZmMsIGZvcmdldF9yZXEpOworCWtmcmVlKGZvcmdldCk7CiAgb3V0OgogCXJldHVybiBlcnI7CiB9CkBAIC0zNzgsNyArMzc3LDcgQEAKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlOwogCXN0cnVjdCBmdXNlX2Nvbm4gKmZjID0gZ2V0X2Z1c2VfY29ubihkaXIpOwogCXN0cnVjdCBmdXNlX3JlcSAqcmVxOwotCXN0cnVjdCBmdXNlX3JlcSAqZm9yZ2V0X3JlcTsKKwlzdHJ1Y3QgZnVzZV9mb3JnZXRfbGluayAqZm9yZ2V0OwogCXN0cnVjdCBmdXNlX2NyZWF0ZV9pbiBpbmFyZzsKIAlzdHJ1Y3QgZnVzZV9vcGVuX291dCBvdXRvcGVuOwogCXN0cnVjdCBmdXNlX2VudHJ5X291dCBvdXRlbnRyeTsKQEAgLTM5Miw5ICszOTEsOSBAQAogCWlmIChmbGFncyAmIE9fRElSRUNUKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWZvcmdldF9yZXEgPSBmdXNlX2dldF9yZXEoZmMpOwotCWlmIChJU19FUlIoZm9yZ2V0X3JlcSkpCi0JCXJldHVybiBQVFJfRVJSKGZvcmdldF9yZXEpOworCWZvcmdldCA9IGZ1c2VfYWxsb2NfZm9yZ2V0KCk7CisJaWYgKCFmb3JnZXQpCisJCXJldHVybiAtRU5PTUVNOwogCiAJcmVxID0gZnVzZV9nZXRfcmVxKGZjKTsKIAllcnIgPSBQVFJfRVJSKHJlcSk7CkBAIC00NTIsMTAgKzQ1MSwxMCBAQAogCWlmICghaW5vZGUpIHsKIAkJZmxhZ3MgJj0gfihPX0NSRUFUIHwgT19FWENMIHwgT19UUlVOQyk7CiAJCWZ1c2Vfc3luY19yZWxlYXNlKGZmLCBmbGFncyk7Ci0JCWZ1c2Vfc2VuZF9mb3JnZXQoZmMsIGZvcmdldF9yZXEsIG91dGVudHJ5Lm5vZGVpZCwgMSk7CisJCWZ1c2VfcXVldWVfZm9yZ2V0KGZjLCBmb3JnZXQsIG91dGVudHJ5Lm5vZGVpZCwgMSk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KLQlmdXNlX3B1dF9yZXF1ZXN0KGZjLCBmb3JnZXRfcmVxKTsKKwlrZnJlZShmb3JnZXQpOwogCWRfaW5zdGFudGlhdGUoZW50cnksIGlub2RlKTsKIAlmdXNlX2NoYW5nZV9lbnRyeV90aW1lb3V0KGVudHJ5LCAmb3V0ZW50cnkpOwogCWZ1c2VfaW52YWxpZGF0ZV9hdHRyKGRpcik7CkBAIC00NzMsNyArNDcyLDcgQEAKICBvdXRfcHV0X3JlcXVlc3Q6CiAJZnVzZV9wdXRfcmVxdWVzdChmYywgcmVxKTsKICBvdXRfcHV0X2ZvcmdldF9yZXE6Ci0JZnVzZV9wdXRfcmVxdWVzdChmYywgZm9yZ2V0X3JlcSk7CisJa2ZyZWUoZm9yZ2V0KTsKIAlyZXR1cm4gZXJyOwogfQogCkBAIC00ODcsMTIgKzQ4NiwxMiBAQAogCXN0cnVjdCBmdXNlX2VudHJ5X291dCBvdXRhcmc7CiAJc3RydWN0IGlub2RlICppbm9kZTsKIAlpbnQgZXJyOwotCXN0cnVjdCBmdXNlX3JlcSAqZm9yZ2V0X3JlcTsKKwlzdHJ1Y3QgZnVzZV9mb3JnZXRfbGluayAqZm9yZ2V0OwogCi0JZm9yZ2V0X3JlcSA9IGZ1c2VfZ2V0X3JlcShmYyk7Ci0JaWYgKElTX0VSUihmb3JnZXRfcmVxKSkgeworCWZvcmdldCA9IGZ1c2VfYWxsb2NfZm9yZ2V0KCk7CisJaWYgKCFmb3JnZXQpIHsKIAkJZnVzZV9wdXRfcmVxdWVzdChmYywgcmVxKTsKLQkJcmV0dXJuIFBUUl9FUlIoZm9yZ2V0X3JlcSk7CisJCXJldHVybiAtRU5PTUVNOwogCX0KIAogCW1lbXNldCgmb3V0YXJnLCAwLCBzaXplb2Yob3V0YXJnKSk7CkBAIC01MTksMTAgKzUxOCwxMCBAQAogCWlub2RlID0gZnVzZV9pZ2V0KGRpci0+aV9zYiwgb3V0YXJnLm5vZGVpZCwgb3V0YXJnLmdlbmVyYXRpb24sCiAJCQkgICZvdXRhcmcuYXR0ciwgZW50cnlfYXR0cl90aW1lb3V0KCZvdXRhcmcpLCAwKTsKIAlpZiAoIWlub2RlKSB7Ci0JCWZ1c2Vfc2VuZF9mb3JnZXQoZmMsIGZvcmdldF9yZXEsIG91dGFyZy5ub2RlaWQsIDEpOworCQlmdXNlX3F1ZXVlX2ZvcmdldChmYywgZm9yZ2V0LCBvdXRhcmcubm9kZWlkLCAxKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQotCWZ1c2VfcHV0X3JlcXVlc3QoZmMsIGZvcmdldF9yZXEpOworCWtmcmVlKGZvcmdldCk7CiAKIAlpZiAoU19JU0RJUihpbm9kZS0+aV9tb2RlKSkgewogCQlzdHJ1Y3QgZGVudHJ5ICphbGlhczsKQEAgLTU0NSw3ICs1NDQsNyBAQAogCXJldHVybiAwOwogCiAgb3V0X3B1dF9mb3JnZXRfcmVxOgotCWZ1c2VfcHV0X3JlcXVlc3QoZmMsIGZvcmdldF9yZXEpOworCWtmcmVlKGZvcmdldCk7CiAJcmV0dXJuIGVycjsKIH0KIApkaWZmIC0tZ2l0IGEvZnMvZnVzZS9maWxlLmMgYi9mcy9mdXNlL2ZpbGUuYwppbmRleCA4Yjk4NGEyLi45NWRhMWJjIDEwMDY0NAotLS0gYS9mcy9mdXNlL2ZpbGUuYworKysgYi9mcy9mdXNlL2ZpbGUuYwpAQCAtMTYzNCw5ICsxNjM0LDkgQEAKICAqIGFuZCA2NGJpdC4gIEZvcnR1bmF0ZWx5IHdlIGNhbiBkZXRlcm1pbmUgd2hpY2ggc3RydWN0dXJlIHRoZSBzZXJ2ZXIKICAqIHVzZWQgZnJvbSB0aGUgc2l6ZSBvZiB0aGUgcmVwbHkuCiAgKi8KLXN0YXRpYyBpbnQgZnVzZV9jb3B5X2lvY3RsX2lvdmVjKHN0cnVjdCBpb3ZlYyAqZHN0LCB2b2lkICpzcmMsCi0JCQkJIHNpemVfdCB0cmFuc2ZlcnJlZCwgdW5zaWduZWQgY291bnQsCi0JCQkJIGJvb2wgaXNfY29tcGF0KQorc3RhdGljIGludCBmdXNlX2NvcHlfaW9jdGxfaW92ZWNfb2xkKHN0cnVjdCBpb3ZlYyAqZHN0LCB2b2lkICpzcmMsCisJCQkJICAgICBzaXplX3QgdHJhbnNmZXJyZWQsIHVuc2lnbmVkIGNvdW50LAorCQkJCSAgICAgYm9vbCBpc19jb21wYXQpCiB7CiAjaWZkZWYgQ09ORklHX0NPTVBBVAogCWlmIChjb3VudCAqIHNpemVvZihzdHJ1Y3QgY29tcGF0X2lvdmVjKSA9PSB0cmFuc2ZlcnJlZCkgewpAQCAtMTY4MCw2ICsxNjgwLDQyIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgZnVzZV9jb3B5X2lvY3RsX2lvdmVjKHN0cnVjdCBmdXNlX2Nvbm4gKmZjLCBzdHJ1Y3QgaW92ZWMgKmRzdCwKKwkJCQkgdm9pZCAqc3JjLCBzaXplX3QgdHJhbnNmZXJyZWQsIHVuc2lnbmVkIGNvdW50LAorCQkJCSBib29sIGlzX2NvbXBhdCkKK3sKKwl1bnNpZ25lZCBpOworCXN0cnVjdCBmdXNlX2lvY3RsX2lvdmVjICpmaW92ID0gc3JjOworCisJaWYgKGZjLT5taW5vciA8IDE2KSB7CisJCXJldHVybiBmdXNlX2NvcHlfaW9jdGxfaW92ZWNfb2xkKGRzdCwgc3JjLCB0cmFuc2ZlcnJlZCwKKwkJCQkJCSBjb3VudCwgaXNfY29tcGF0KTsKKwl9CisKKwlpZiAoY291bnQgKiBzaXplb2Yoc3RydWN0IGZ1c2VfaW9jdGxfaW92ZWMpICE9IHRyYW5zZmVycmVkKQorCQlyZXR1cm4gLUVJTzsKKworCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisJCS8qIERpZCB0aGUgc2VydmVyIHN1cHBseSBhbiBpbmFwcHJvcHJpYXRlIHZhbHVlPyAqLworCQlpZiAoZmlvdltpXS5iYXNlICE9ICh1bnNpZ25lZCBsb25nKSBmaW92W2ldLmJhc2UgfHwKKwkJICAgIGZpb3ZbaV0ubGVuICE9ICh1bnNpZ25lZCBsb25nKSBmaW92W2ldLmxlbikKKwkJCXJldHVybiAtRUlPOworCisJCWRzdFtpXS5pb3ZfYmFzZSA9ICh2b2lkIF9fdXNlciAqKSAodW5zaWduZWQgbG9uZykgZmlvdltpXS5iYXNlOworCQlkc3RbaV0uaW92X2xlbiA9IChzaXplX3QpIGZpb3ZbaV0ubGVuOworCisjaWZkZWYgQ09ORklHX0NPTVBBVAorCQlpZiAoaXNfY29tcGF0ICYmCisJCSAgICAocHRyX3RvX2NvbXBhdChkc3RbaV0uaW92X2Jhc2UpICE9IGZpb3ZbaV0uYmFzZSB8fAorCQkgICAgIChjb21wYXRfc2l6ZV90KSBkc3RbaV0uaW92X2xlbiAhPSBmaW92W2ldLmxlbikpCisJCQlyZXR1cm4gLUVJTzsKKyNlbmRpZgorCX0KKworCXJldHVybiAwOworfQorCisKIC8qCiAgKiBGb3IgaW9jdGxzLCB0aGVyZSBpcyBubyBnZW5lcmljIHdheSB0byBkZXRlcm1pbmUgaG93IG11Y2ggbWVtb3J5CiAgKiBuZWVkcyB0byBiZSByZWFkIGFuZC9vciB3cml0dGVuLiAgRnVydGhlcm1vcmUsIGlvY3RscyBhcmUgYWxsb3dlZApAQCAtMTc0MCwxOCArMTc3NiwyNSBAQAogCXN0cnVjdCBmdXNlX2lvY3RsX291dCBvdXRhcmc7CiAJc3RydWN0IGZ1c2VfcmVxICpyZXEgPSBOVUxMOwogCXN0cnVjdCBwYWdlICoqcGFnZXMgPSBOVUxMOwotCXN0cnVjdCBwYWdlICppb3ZfcGFnZSA9IE5VTEw7CisJc3RydWN0IGlvdmVjICppb3ZfcGFnZSA9IE5VTEw7CiAJc3RydWN0IGlvdmVjICppbl9pb3YgPSBOVUxMLCAqb3V0X2lvdiA9IE5VTEw7CiAJdW5zaWduZWQgaW50IGluX2lvdnMgPSAwLCBvdXRfaW92cyA9IDAsIG51bV9wYWdlcyA9IDAsIG1heF9wYWdlczsKIAlzaXplX3QgaW5fc2l6ZSwgb3V0X3NpemUsIHRyYW5zZmVycmVkOwogCWludCBlcnI7CiAKKyNpZiBCSVRTX1BFUl9MT05HID09IDMyCisJaW5hcmcuZmxhZ3MgfD0gRlVTRV9JT0NUTF8zMkJJVDsKKyNlbHNlCisJaWYgKGZsYWdzICYgRlVTRV9JT0NUTF9DT01QQVQpCisJCWluYXJnLmZsYWdzIHw9IEZVU0VfSU9DVExfMzJCSVQ7CisjZW5kaWYKKwogCS8qIGFzc3VtZSBhbGwgdGhlIGlvdnMgcmV0dXJuZWQgYnkgY2xpZW50IGFsd2F5cyBmaXRzIGluIGEgcGFnZSAqLwotCUJVSUxEX0JVR19PTihzaXplb2Yoc3RydWN0IGlvdmVjKSAqIEZVU0VfSU9DVExfTUFYX0lPViA+IFBBR0VfU0laRSk7CisJQlVJTERfQlVHX09OKHNpemVvZihzdHJ1Y3QgZnVzZV9pb2N0bF9pb3ZlYykgKiBGVVNFX0lPQ1RMX01BWF9JT1YgPiBQQUdFX1NJWkUpOwogCiAJZXJyID0gLUVOT01FTTsKIAlwYWdlcyA9IGt6YWxsb2Moc2l6ZW9mKHBhZ2VzWzBdKSAqIEZVU0VfTUFYX1BBR0VTX1BFUl9SRVEsIEdGUF9LRVJORUwpOwotCWlvdl9wYWdlID0gYWxsb2NfcGFnZShHRlBfS0VSTkVMKTsKKwlpb3ZfcGFnZSA9IChzdHJ1Y3QgaW92ZWMgKikgX19nZXRfZnJlZV9wYWdlKEdGUF9LRVJORUwpOwogCWlmICghcGFnZXMgfHwgIWlvdl9wYWdlKQogCQlnb3RvIG91dDsKIApAQCAtMTc2MCw3ICsxODAzLDcgQEAKIAkgKiBSRVRSWSBmcm9tIHNlcnZlciBpcyBub3QgYWxsb3dlZC4KIAkgKi8KIAlpZiAoIShmbGFncyAmIEZVU0VfSU9DVExfVU5SRVNUUklDVEVEKSkgewotCQlzdHJ1Y3QgaW92ZWMgKmlvdiA9IHBhZ2VfYWRkcmVzcyhpb3ZfcGFnZSk7CisJCXN0cnVjdCBpb3ZlYyAqaW92ID0gaW92X3BhZ2U7CiAKIAkJaW92LT5pb3ZfYmFzZSA9ICh2b2lkIF9fdXNlciAqKWFyZzsKIAkJaW92LT5pb3ZfbGVuID0gX0lPQ19TSVpFKGNtZCk7CkBAIC0xODQxLDcgKzE4ODQsNyBAQAogCiAJLyogZGlkIGl0IGFzayBmb3IgcmV0cnk/ICovCiAJaWYgKG91dGFyZy5mbGFncyAmIEZVU0VfSU9DVExfUkVUUlkpIHsKLQkJY2hhciAqdmFkZHI7CisJCXZvaWQgKnZhZGRyOwogCiAJCS8qIG5vIHJldHJ5IGlmIGluIHJlc3RyaWN0ZWQgbW9kZSAqLwogCQllcnIgPSAtRUlPOwpAQCAtMTg2MiwxNCArMTkwNSwxNCBAQAogCQkJZ290byBvdXQ7CiAKIAkJdmFkZHIgPSBrbWFwX2F0b21pYyhwYWdlc1swXSwgS01fVVNFUjApOwotCQllcnIgPSBmdXNlX2NvcHlfaW9jdGxfaW92ZWMocGFnZV9hZGRyZXNzKGlvdl9wYWdlKSwgdmFkZHIsCisJCWVyciA9IGZ1c2VfY29weV9pb2N0bF9pb3ZlYyhmYywgaW92X3BhZ2UsIHZhZGRyLAogCQkJCQkgICAgdHJhbnNmZXJyZWQsIGluX2lvdnMgKyBvdXRfaW92cywKIAkJCQkJICAgIChmbGFncyAmIEZVU0VfSU9DVExfQ09NUEFUKSAhPSAwKTsKIAkJa3VubWFwX2F0b21pYyh2YWRkciwgS01fVVNFUjApOwogCQlpZiAoZXJyKQogCQkJZ290byBvdXQ7CiAKLQkJaW5faW92ID0gcGFnZV9hZGRyZXNzKGlvdl9wYWdlKTsKKwkJaW5faW92ID0gaW92X3BhZ2U7CiAJCW91dF9pb3YgPSBpbl9pb3YgKyBpbl9pb3ZzOwogCiAJCWVyciA9IGZ1c2VfdmVyaWZ5X2lvY3RsX2lvdihpbl9pb3YsIGluX2lvdnMpOwpAQCAtMTg5MSw4ICsxOTM0LDcgQEAKICBvdXQ6CiAJaWYgKHJlcSkKIAkJZnVzZV9wdXRfcmVxdWVzdChmYywgcmVxKTsKLQlpZiAoaW92X3BhZ2UpCi0JCV9fZnJlZV9wYWdlKGlvdl9wYWdlKTsKKwlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpIGlvdl9wYWdlKTsKIAl3aGlsZSAobnVtX3BhZ2VzKQogCQlfX2ZyZWVfcGFnZShwYWdlc1stLW51bV9wYWdlc10pOwogCWtmcmVlKHBhZ2VzKTsKZGlmZiAtLWdpdCBhL2ZzL2Z1c2UvZnVzZV9pLmggYi9mcy9mdXNlL2Z1c2VfaS5oCmluZGV4IDU3ZDRhM2EuLmFlNTc0NGEgMTAwNjQ0Ci0tLSBhL2ZzL2Z1c2UvZnVzZV9pLmgKKysrIGIvZnMvZnVzZS9mdXNlX2kuaApAQCAtNTMsNiArNTMsMTIgQEAKIGV4dGVybiB1bnNpZ25lZCBtYXhfdXNlcl9iZ3JlcTsKIGV4dGVybiB1bnNpZ25lZCBtYXhfdXNlcl9jb25ndGhyZXNoOwogCisvKiBPbmUgZm9yZ2V0IHJlcXVlc3QgKi8KK3N0cnVjdCBmdXNlX2ZvcmdldF9saW5rIHsKKwlzdHJ1Y3QgZnVzZV9mb3JnZXRfb25lIGZvcmdldF9vbmU7CisJc3RydWN0IGZ1c2VfZm9yZ2V0X2xpbmsgKm5leHQ7Cit9OworCiAvKiogRlVTRSBpbm9kZSAqLwogc3RydWN0IGZ1c2VfaW5vZGUgewogCS8qKiBJbm9kZSBkYXRhICovCkBAIC02Niw3ICs3Miw3IEBACiAJdTY0IG5sb29rdXA7CiAKIAkvKiogVGhlIHJlcXVlc3QgdXNlZCBmb3Igc2VuZGluZyB0aGUgRk9SR0VUIG1lc3NhZ2UgKi8KLQlzdHJ1Y3QgZnVzZV9yZXEgKmZvcmdldF9yZXE7CisJc3RydWN0IGZ1c2VfZm9yZ2V0X2xpbmsgKmZvcmdldDsKIAogCS8qKiBUaW1lIGluIGppZmZpZXMgdW50aWwgdGhlIGZpbGUgYXR0cmlidXRlcyBhcmUgdmFsaWQgKi8KIAl1NjQgaV90aW1lOwpAQCAtMjU1LDcgKzI2MSw2IEBACiAKIAkvKiogRGF0YSBmb3IgYXN5bmNocm9ub3VzIHJlcXVlc3RzICovCiAJdW5pb24gewotCQlzdHJ1Y3QgZnVzZV9mb3JnZXRfaW4gZm9yZ2V0X2luOwogCQlzdHJ1Y3QgewogCQkJc3RydWN0IGZ1c2VfcmVsZWFzZV9pbiBpbjsKIAkJCXN0cnVjdCBwYXRoIHBhdGg7CkBAIC0zNjksNiArMzc0LDEzIEBACiAJLyoqIFBlbmRpbmcgaW50ZXJydXB0cyAqLwogCXN0cnVjdCBsaXN0X2hlYWQgaW50ZXJydXB0czsKIAorCS8qKiBRdWV1ZSBvZiBwZW5kaW5nIGZvcmdldHMgKi8KKwlzdHJ1Y3QgZnVzZV9mb3JnZXRfbGluayBmb3JnZXRfbGlzdF9oZWFkOworCXN0cnVjdCBmdXNlX2ZvcmdldF9saW5rICpmb3JnZXRfbGlzdF90YWlsOworCisJLyoqIEJhdGNoaW5nIG9mIEZPUkdFVCByZXF1ZXN0cyAocG9zaXRpdmUgaW5kaWNhdGVzIEZPUkdFVCBiYXRjaCkgKi8KKwlpbnQgZm9yZ2V0X2JhdGNoOworCiAJLyoqIEZsYWcgaW5kaWNhdGluZyBpZiBjb25uZWN0aW9uIGlzIGJsb2NrZWQuICBUaGlzIHdpbGwgYmUKIAkgICAgdGhlIGNhc2UgYmVmb3JlIHRoZSBJTklUIHJlcGx5IGlzIHJlY2VpdmVkLCBhbmQgaWYgdGhlcmUKIAkgICAgYXJlIHRvbyBtYW55IG91dHN0YWRpbmcgYmFja2dyb3VuZHMgcmVxdWVzdHMgKi8KQEAgLTU0Myw4ICs1NTUsMTAgQEAKIC8qKgogICogU2VuZCBGT1JHRVQgY29tbWFuZAogICovCi12b2lkIGZ1c2Vfc2VuZF9mb3JnZXQoc3RydWN0IGZ1c2VfY29ubiAqZmMsIHN0cnVjdCBmdXNlX3JlcSAqcmVxLAotCQkgICAgICB1NjQgbm9kZWlkLCB1NjQgbmxvb2t1cCk7Cit2b2lkIGZ1c2VfcXVldWVfZm9yZ2V0KHN0cnVjdCBmdXNlX2Nvbm4gKmZjLCBzdHJ1Y3QgZnVzZV9mb3JnZXRfbGluayAqZm9yZ2V0LAorCQkgICAgICAgdTY0IG5vZGVpZCwgdTY0IG5sb29rdXApOworCitzdHJ1Y3QgZnVzZV9mb3JnZXRfbGluayAqZnVzZV9hbGxvY19mb3JnZXQodm9pZCk7CiAKIC8qKgogICogSW5pdGlhbGl6ZSBSRUFEIG9yIFJFQURESVIgcmVxdWVzdApAQCAtNjU2LDExICs2NzAsNiBAQAogdm9pZCBmdXNlX3JlcXVlc3Rfc2VuZChzdHJ1Y3QgZnVzZV9jb25uICpmYywgc3RydWN0IGZ1c2VfcmVxICpyZXEpOwogCiAvKioKLSAqIFNlbmQgYSByZXF1ZXN0IHdpdGggbm8gcmVwbHkKLSAqLwotdm9pZCBmdXNlX3JlcXVlc3Rfc2VuZF9ub3JlcGx5KHN0cnVjdCBmdXNlX2Nvbm4gKmZjLCBzdHJ1Y3QgZnVzZV9yZXEgKnJlcSk7Ci0KLS8qKgogICogU2VuZCBhIHJlcXVlc3QgaW4gdGhlIGJhY2tncm91bmQKICAqLwogdm9pZCBmdXNlX3JlcXVlc3Rfc2VuZF9iYWNrZ3JvdW5kKHN0cnVjdCBmdXNlX2Nvbm4gKmZjLCBzdHJ1Y3QgZnVzZV9yZXEgKnJlcSk7CmRpZmYgLS1naXQgYS9mcy9mdXNlL2lub2RlLmMgYi9mcy9mdXNlL2lub2RlLmMKaW5kZXggYThiMzFkYS4uZjYyYjMyYyAxMDA2NDQKLS0tIGEvZnMvZnVzZS9pbm9kZS5jCisrKyBiL2ZzL2Z1c2UvaW5vZGUuYwpAQCAtNzEsNiArNzEsMTEgQEAKIAl1bnNpZ25lZCBibGtzaXplOwogfTsKIAorc3RydWN0IGZ1c2VfZm9yZ2V0X2xpbmsgKmZ1c2VfYWxsb2NfZm9yZ2V0KCkKK3sKKwlyZXR1cm4ga3phbGxvYyhzaXplb2Yoc3RydWN0IGZ1c2VfZm9yZ2V0X2xpbmspLCBHRlBfS0VSTkVMKTsKK30KKwogc3RhdGljIHN0cnVjdCBpbm9kZSAqZnVzZV9hbGxvY19pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQogewogCXN0cnVjdCBpbm9kZSAqaW5vZGU7CkBAIC05MCw4ICs5NSw4IEBACiAJSU5JVF9MSVNUX0hFQUQoJmZpLT5xdWV1ZWRfd3JpdGVzKTsKIAlJTklUX0xJU1RfSEVBRCgmZmktPndyaXRlcGFnZXMpOwogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmZpLT5wYWdlX3dhaXRxKTsKLQlmaS0+Zm9yZ2V0X3JlcSA9IGZ1c2VfcmVxdWVzdF9hbGxvYygpOwotCWlmICghZmktPmZvcmdldF9yZXEpIHsKKwlmaS0+Zm9yZ2V0ID0gZnVzZV9hbGxvY19mb3JnZXQoKTsKKwlpZiAoIWZpLT5mb3JnZXQpIHsKIAkJa21lbV9jYWNoZV9mcmVlKGZ1c2VfaW5vZGVfY2FjaGVwLCBpbm9kZSk7CiAJCXJldHVybiBOVUxMOwogCX0KQEAgLTExMSwyNCArMTE2LDEwIEBACiAJc3RydWN0IGZ1c2VfaW5vZGUgKmZpID0gZ2V0X2Z1c2VfaW5vZGUoaW5vZGUpOwogCUJVR19PTighbGlzdF9lbXB0eSgmZmktPndyaXRlX2ZpbGVzKSk7CiAJQlVHX09OKCFsaXN0X2VtcHR5KCZmaS0+cXVldWVkX3dyaXRlcykpOwotCWlmIChmaS0+Zm9yZ2V0X3JlcSkKLQkJZnVzZV9yZXF1ZXN0X2ZyZWUoZmktPmZvcmdldF9yZXEpOworCWtmcmVlKGZpLT5mb3JnZXQpOwogCWNhbGxfcmN1KCZpbm9kZS0+aV9yY3UsIGZ1c2VfaV9jYWxsYmFjayk7CiB9CiAKLXZvaWQgZnVzZV9zZW5kX2ZvcmdldChzdHJ1Y3QgZnVzZV9jb25uICpmYywgc3RydWN0IGZ1c2VfcmVxICpyZXEsCi0JCSAgICAgIHU2NCBub2RlaWQsIHU2NCBubG9va3VwKQotewotCXN0cnVjdCBmdXNlX2ZvcmdldF9pbiAqaW5hcmcgPSAmcmVxLT5taXNjLmZvcmdldF9pbjsKLQlpbmFyZy0+bmxvb2t1cCA9IG5sb29rdXA7Ci0JcmVxLT5pbi5oLm9wY29kZSA9IEZVU0VfRk9SR0VUOwotCXJlcS0+aW4uaC5ub2RlaWQgPSBub2RlaWQ7Ci0JcmVxLT5pbi5udW1hcmdzID0gMTsKLQlyZXEtPmluLmFyZ3NbMF0uc2l6ZSA9IHNpemVvZihzdHJ1Y3QgZnVzZV9mb3JnZXRfaW4pOwotCXJlcS0+aW4uYXJnc1swXS52YWx1ZSA9IGluYXJnOwotCWZ1c2VfcmVxdWVzdF9zZW5kX25vcmVwbHkoZmMsIHJlcSk7Ci19Ci0KIHN0YXRpYyB2b2lkIGZ1c2VfZXZpY3RfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKIHsKIAl0cnVuY2F0ZV9pbm9kZV9wYWdlcygmaW5vZGUtPmlfZGF0YSwgMCk7CkBAIC0xMzYsOCArMTI3LDggQEAKIAlpZiAoaW5vZGUtPmlfc2ItPnNfZmxhZ3MgJiBNU19BQ1RJVkUpIHsKIAkJc3RydWN0IGZ1c2VfY29ubiAqZmMgPSBnZXRfZnVzZV9jb25uKGlub2RlKTsKIAkJc3RydWN0IGZ1c2VfaW5vZGUgKmZpID0gZ2V0X2Z1c2VfaW5vZGUoaW5vZGUpOwotCQlmdXNlX3NlbmRfZm9yZ2V0KGZjLCBmaS0+Zm9yZ2V0X3JlcSwgZmktPm5vZGVpZCwgZmktPm5sb29rdXApOwotCQlmaS0+Zm9yZ2V0X3JlcSA9IE5VTEw7CisJCWZ1c2VfcXVldWVfZm9yZ2V0KGZjLCBmaS0+Zm9yZ2V0LCBmaS0+bm9kZWlkLCBmaS0+bmxvb2t1cCk7CisJCWZpLT5mb3JnZXQgPSBOVUxMOwogCX0KIH0KIApAQCAtNTQxLDYgKzUzMiw3IEBACiAJSU5JVF9MSVNUX0hFQUQoJmZjLT5pbnRlcnJ1cHRzKTsKIAlJTklUX0xJU1RfSEVBRCgmZmMtPmJnX3F1ZXVlKTsKIAlJTklUX0xJU1RfSEVBRCgmZmMtPmVudHJ5KTsKKwlmYy0+Zm9yZ2V0X2xpc3RfdGFpbCA9ICZmYy0+Zm9yZ2V0X2xpc3RfaGVhZDsKIAlhdG9taWNfc2V0KCZmYy0+bnVtX3dhaXRpbmcsIDApOwogCWZjLT5tYXhfYmFja2dyb3VuZCA9IEZVU0VfREVGQVVMVF9NQVhfQkFDS0dST1VORDsKIAlmYy0+Y29uZ2VzdGlvbl90aHJlc2hvbGQgPSBGVVNFX0RFRkFVTFRfQ09OR0VTVElPTl9USFJFU0hPTEQ7CmRpZmYgLS1naXQgYS9mcy9nZnMyL2luY29yZS5oIGIvZnMvZ2ZzMi9pbmNvcmUuaAppbmRleCA4ZDNkMmI0Li5hNzk3OTBjIDEwMDY0NAotLS0gYS9mcy9nZnMyL2luY29yZS5oCisrKyBiL2ZzL2dmczIvaW5jb3JlLmgKQEAgLTExLDYgKzExLDcgQEAKICNkZWZpbmUgX19JTkNPUkVfRE9UX0hfXwogCiAjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9rb2JqZWN0Lmg+CiAjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CiAjaW5jbHVkZSA8bGludXgvZGxtLmg+CiAjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KZGlmZiAtLWdpdCBhL2ZzL2piZDIvam91cm5hbC5jIGIvZnMvamJkMi9qb3VybmFsLmMKaW5kZXggZjgzN2JhOS4uOWU0Njg2OSAxMDA2NDQKLS0tIGEvZnMvamJkMi9qb3VybmFsLmMKKysrIGIvZnMvamJkMi9qb3VybmFsLmMKQEAgLTQzLDYgKzQzLDcgQEAKICNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CiAjaW5jbHVkZSA8bGludXgvYmFja2luZy1kZXYuaD4KICNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9yYXRlbGltaXQuaD4KIAogI2RlZmluZSBDUkVBVEVfVFJBQ0VfUE9JTlRTCiAjaW5jbHVkZSA8dHJhY2UvZXZlbnRzL2piZDIuaD4KQEAgLTkzLDYgKzk0LDcgQEAKIEVYUE9SVF9TWU1CT0woamJkMl9qb3VybmFsX2luaXRfamJkX2lub2RlKTsKIEVYUE9SVF9TWU1CT0woamJkMl9qb3VybmFsX3JlbGVhc2VfamJkX2lub2RlKTsKIEVYUE9SVF9TWU1CT0woamJkMl9qb3VybmFsX2JlZ2luX29yZGVyZWRfdHJ1bmNhdGUpOworRVhQT1JUX1NZTUJPTChqYmQyX2lub2RlX2NhY2hlKTsKIAogc3RhdGljIGludCBqb3VybmFsX2NvbnZlcnRfc3VwZXJibG9ja192MShqb3VybmFsX3QgKiwgam91cm5hbF9zdXBlcmJsb2NrX3QgKik7CiBzdGF0aWMgdm9pZCBfX2pvdXJuYWxfYWJvcnRfc29mdCAoam91cm5hbF90ICpqb3VybmFsLCBpbnQgZXJybm8pOwpAQCAtODI3LDcgKzgyOSw3IEBACiAKIAlqb3VybmFsID0ga3phbGxvYyhzaXplb2YoKmpvdXJuYWwpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWpvdXJuYWwpCi0JCWdvdG8gZmFpbDsKKwkJcmV0dXJuIE5VTEw7CiAKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZqb3VybmFsLT5qX3dhaXRfdHJhbnNhY3Rpb25fbG9ja2VkKTsKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZqb3VybmFsLT5qX3dhaXRfbG9nc3BhY2UpOwpAQCAtODUyLDE0ICs4NTQsMTIgQEAKIAllcnIgPSBqYmQyX2pvdXJuYWxfaW5pdF9yZXZva2Uoam91cm5hbCwgSk9VUk5BTF9SRVZPS0VfREVGQVVMVF9IQVNIKTsKIAlpZiAoZXJyKSB7CiAJCWtmcmVlKGpvdXJuYWwpOwotCQlnb3RvIGZhaWw7CisJCXJldHVybiBOVUxMOwogCX0KIAogCXNwaW5fbG9ja19pbml0KCZqb3VybmFsLT5qX2hpc3RvcnlfbG9jayk7CiAKIAlyZXR1cm4gam91cm5hbDsKLWZhaWw6Ci0JcmV0dXJuIE5VTEw7CiB9CiAKIC8qIGpiZDJfam91cm5hbF9pbml0X2RldiBhbmQgamJkMl9qb3VybmFsX2luaXRfaW5vZGU6CkBAIC0xOTgyLDcgKzE5ODIsNiBAQAogc3RhdGljIHN0cnVjdCBqb3VybmFsX2hlYWQgKmpvdXJuYWxfYWxsb2Nfam91cm5hbF9oZWFkKHZvaWQpCiB7CiAJc3RydWN0IGpvdXJuYWxfaGVhZCAqcmV0OwotCXN0YXRpYyB1bnNpZ25lZCBsb25nIGxhc3Rfd2FybmluZzsKIAogI2lmZGVmIENPTkZJR19KQkQyX0RFQlVHCiAJYXRvbWljX2luYygmbnJfam91cm5hbF9oZWFkcyk7CkBAIC0xOTkwLDExICsxOTg5LDcgQEAKIAlyZXQgPSBrbWVtX2NhY2hlX2FsbG9jKGpiZDJfam91cm5hbF9oZWFkX2NhY2hlLCBHRlBfTk9GUyk7CiAJaWYgKCFyZXQpIHsKIAkJamJkX2RlYnVnKDEsICJvdXQgb2YgbWVtb3J5IGZvciBqb3VybmFsX2hlYWRcbiIpOwotCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCBsYXN0X3dhcm5pbmcgKyA1KkhaKSkgewotCQkJcHJpbnRrKEtFUk5fTk9USUNFICJFTk9NRU0gaW4gJXMsIHJldHJ5aW5nLlxuIiwKLQkJCSAgICAgICBfX2Z1bmNfXyk7Ci0JCQlsYXN0X3dhcm5pbmcgPSBqaWZmaWVzOwotCQl9CisJCXByX25vdGljZV9yYXRlbGltaXRlZCgiRU5PTUVNIGluICVzLCByZXRyeWluZy5cbiIsIF9fZnVuY19fKTsKIAkJd2hpbGUgKCFyZXQpIHsKIAkJCXlpZWxkKCk7CiAJCQlyZXQgPSBrbWVtX2NhY2hlX2FsbG9jKGpiZDJfam91cm5hbF9oZWFkX2NhY2hlLCBHRlBfTk9GUyk7CkBAIC0yMjkyLDE3ICsyMjg3LDE5IEBACiAKICNlbmRpZgogCi1zdHJ1Y3Qga21lbV9jYWNoZSAqamJkMl9oYW5kbGVfY2FjaGU7CitzdHJ1Y3Qga21lbV9jYWNoZSAqamJkMl9oYW5kbGVfY2FjaGUsICpqYmQyX2lub2RlX2NhY2hlOwogCiBzdGF0aWMgaW50IF9faW5pdCBqb3VybmFsX2luaXRfaGFuZGxlX2NhY2hlKHZvaWQpCiB7Ci0JamJkMl9oYW5kbGVfY2FjaGUgPSBrbWVtX2NhY2hlX2NyZWF0ZSgiamJkMl9qb3VybmFsX2hhbmRsZSIsCi0JCQkJc2l6ZW9mKGhhbmRsZV90KSwKLQkJCQkwLAkJLyogb2Zmc2V0ICovCi0JCQkJU0xBQl9URU1QT1JBUlksCS8qIGZsYWdzICovCi0JCQkJTlVMTCk7CQkvKiBjdG9yICovCisJamJkMl9oYW5kbGVfY2FjaGUgPSBLTUVNX0NBQ0hFKGpiZDJfam91cm5hbF9oYW5kbGUsIFNMQUJfVEVNUE9SQVJZKTsKIAlpZiAoamJkMl9oYW5kbGVfY2FjaGUgPT0gTlVMTCkgewotCQlwcmludGsoS0VSTl9FTUVSRyAiSkJEOiBmYWlsZWQgdG8gY3JlYXRlIGhhbmRsZSBjYWNoZVxuIik7CisJCXByaW50ayhLRVJOX0VNRVJHICJKQkQyOiBmYWlsZWQgdG8gY3JlYXRlIGhhbmRsZSBjYWNoZVxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlqYmQyX2lub2RlX2NhY2hlID0gS01FTV9DQUNIRShqYmQyX2lub2RlLCAwKTsKKwlpZiAoamJkMl9pbm9kZV9jYWNoZSA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VNRVJHICJKQkQyOiBmYWlsZWQgdG8gY3JlYXRlIGlub2RlIGNhY2hlXG4iKTsKKwkJa21lbV9jYWNoZV9kZXN0cm95KGpiZDJfaGFuZGxlX2NhY2hlKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCXJldHVybiAwOwpAQCAtMjMxMiw2ICsyMzA5LDkgQEAKIHsKIAlpZiAoamJkMl9oYW5kbGVfY2FjaGUpCiAJCWttZW1fY2FjaGVfZGVzdHJveShqYmQyX2hhbmRsZV9jYWNoZSk7CisJaWYgKGpiZDJfaW5vZGVfY2FjaGUpCisJCWttZW1fY2FjaGVfZGVzdHJveShqYmQyX2lub2RlX2NhY2hlKTsKKwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvZnMvamJkMi9yZWNvdmVyeS5jIGIvZnMvamJkMi9yZWNvdmVyeS5jCmluZGV4IDJiYzRkNWYuLjFjYWQ4NjkgMTAwNjQ0Ci0tLSBhL2ZzL2piZDIvcmVjb3ZlcnkuYworKysgYi9mcy9qYmQyL3JlY292ZXJ5LmMKQEAgLTI5OSwxMCArMjk5LDEwIEBACiAjaWZkZWYgQ09ORklHX0pCRDJfREVCVUcKIAkJaW50IGRyb3BwZWQgPSBpbmZvLmVuZF90cmFuc2FjdGlvbiAtIAogCQkJYmUzMl90b19jcHUoam91cm5hbC0+al9zdXBlcmJsb2NrLT5zX3NlcXVlbmNlKTsKLSNlbmRpZgogCQlqYmRfZGVidWcoMSwKIAkJCSAgIkpCRDogaWdub3JpbmcgJWQgdHJhbnNhY3Rpb24lcyBmcm9tIHRoZSBqb3VybmFsLlxuIiwKIAkJCSAgZHJvcHBlZCwgKGRyb3BwZWQgPT0gMSkgPyAiIiA6ICJzIik7CisjZW5kaWYKIAkJam91cm5hbC0+al90cmFuc2FjdGlvbl9zZXF1ZW5jZSA9ICsraW5mby5lbmRfdHJhbnNhY3Rpb247CiAJfQogCmRpZmYgLS1naXQgYS9mcy9qYmQyL3RyYW5zYWN0aW9uLmMgYi9mcy9qYmQyL3RyYW5zYWN0aW9uLmMKaW5kZXggNmJmMGEyNC4uMzk0ODkzMiAxMDA2NDQKLS0tIGEvZnMvamJkMi90cmFuc2FjdGlvbi5jCisrKyBiL2ZzL2piZDIvdHJhbnNhY3Rpb24uYwpAQCAtMzQwLDkgKzM0MCw3IEBACiAJCWpiZDJfZnJlZV9oYW5kbGUoaGFuZGxlKTsKIAkJY3VycmVudC0+am91cm5hbF9pbmZvID0gTlVMTDsKIAkJaGFuZGxlID0gRVJSX1BUUihlcnIpOwotCQlnb3RvIG91dDsKIAl9Ci1vdXQ6CiAJcmV0dXJuIGhhbmRsZTsKIH0KIEVYUE9SVF9TWU1CT0woamJkMl9fam91cm5hbF9zdGFydCk7CkBAIC01ODksNyArNTg3LDcgQEAKIAl0cmFuc2FjdGlvbiA9IGhhbmRsZS0+aF90cmFuc2FjdGlvbjsKIAlqb3VybmFsID0gdHJhbnNhY3Rpb24tPnRfam91cm5hbDsKIAotCWpiZF9kZWJ1Zyg1LCAiYnVmZmVyX2hlYWQgJXAsIGZvcmNlX2NvcHkgJWRcbiIsIGpoLCBmb3JjZV9jb3B5KTsKKwlqYmRfZGVidWcoNSwgImpvdXJuYWxfaGVhZCAlcCwgZm9yY2VfY29weSAlZFxuIiwgamgsIGZvcmNlX2NvcHkpOwogCiAJSkJVRkZFUl9UUkFDRShqaCwgImVudHJ5Iik7CiByZXBlYXQ6CkBAIC03NzQsNyArNzcyLDcgQEAKIAkJSl9FWFBFQ1RfSkgoamgsIGJ1ZmZlcl91cHRvZGF0ZShqaDJiaChqaCkpLAogCQkJICAgICJQb3NzaWJsZSBJTyBmYWlsdXJlLlxuIik7CiAJCXBhZ2UgPSBqaDJiaChqaCktPmJfcGFnZTsKLQkJb2Zmc2V0ID0gKCh1bnNpZ25lZCBsb25nKSBqaDJiaChqaCktPmJfZGF0YSkgJiB+UEFHRV9NQVNLOworCQlvZmZzZXQgPSBvZmZzZXRfaW5fcGFnZShqaDJiaChqaCktPmJfZGF0YSk7CiAJCXNvdXJjZSA9IGttYXBfYXRvbWljKHBhZ2UsIEtNX1VTRVIwKTsKIAkJLyogRmlyZSBkYXRhIGZyb3plbiB0cmlnZ2VyIGp1c3QgYmVmb3JlIHdlIGNvcHkgdGhlIGRhdGEgKi8KIAkJamJkMl9idWZmZXJfZnJvemVuX3RyaWdnZXIoamgsIHNvdXJjZSArIG9mZnNldCwKZGlmZiAtLWdpdCBhL2ZzL2xvY2tkL01ha2VmaWxlIGIvZnMvbG9ja2QvTWFrZWZpbGUKaW5kZXggOTdmNjA3My4uY2E1OGQ2NCAxMDA2NDQKLS0tIGEvZnMvbG9ja2QvTWFrZWZpbGUKKysrIGIvZnMvbG9ja2QvTWFrZWZpbGUKQEAgLTQsNyArNCw3IEBACiAKIG9iai0kKENPTkZJR19MT0NLRCkgKz0gbG9ja2QubwogCi1sb2NrZC1vYmpzLXkgOj0gY2xudGxvY2subyBjbG50cHJvYy5vIGhvc3QubyBzdmMubyBzdmNsb2NrLm8gc3Zjc2hhcmUubyBcCi0JICAgICAgICBzdmNwcm9jLm8gc3Zjc3Vicy5vIG1vbi5vIHhkci5vIGdyYWNlLm8KLWxvY2tkLW9ianMtJChDT05GSUdfTE9DS0RfVjQpICs9IHhkcjQubyBzdmM0cHJvYy5vCitsb2NrZC1vYmpzLXkgOj0gY2xudGxvY2subyBjbG50cHJvYy5vIGNsbnR4ZHIubyBob3N0Lm8gc3ZjLm8gc3ZjbG9jay5vIFwKKwkgICAgICAgIHN2Y3NoYXJlLm8gc3ZjcHJvYy5vIHN2Y3N1YnMubyBtb24ubyB4ZHIubyBncmFjZS5vCitsb2NrZC1vYmpzLSQoQ09ORklHX0xPQ0tEX1Y0KSArPSBjbG50NHhkci5vIHhkcjQubyBzdmM0cHJvYy5vCiBsb2NrZC1vYmpzCQkgICAgICA6PSAkKGxvY2tkLW9ianMteSkKZGlmZiAtLWdpdCBhL2ZzL2xvY2tkL2NsbnQ0eGRyLmMgYi9mcy9sb2NrZC9jbG50NHhkci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4NDhiNTIKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9sb2NrZC9jbG50NHhkci5jCkBAIC0wLDAgKzEsNjA1IEBACisvKgorICogbGludXgvZnMvbG9ja2QvY2xudDR4ZHIuYworICoKKyAqIFhEUiBmdW5jdGlvbnMgdG8gZW5jb2RlL2RlY29kZSBOTE0gdmVyc2lvbiA0IFJQQyBhcmd1bWVudHMgYW5kIHJlc3VsdHMuCisgKgorICogTkxNIGNsaWVudC1zaWRlIG9ubHkuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEwLCBPcmFjbGUuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICovCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy94ZHIuaD4KKyNpbmNsdWRlIDxsaW51eC9zdW5ycGMvY2xudC5oPgorI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9zdGF0cy5oPgorI2luY2x1ZGUgPGxpbnV4L2xvY2tkL2xvY2tkLmg+CisKKyNkZWZpbmUgTkxNREJHX0ZBQ0lMSVRZCQlOTE1EQkdfWERSCisKKyNpZiAoTkxNQ0xOVF9PSFNJWkUgPiBYRFJfTUFYX05FVE9CSikKKyMgIGVycm9yICJOTE0gaG9zdCBuYW1lIGNhbm5vdCBiZSBsYXJnZXIgdGhhbiBYRFJfTUFYX05FVE9CSiEiCisjZW5kaWYKKworI2lmIChOTE1DTE5UX09IU0laRSA+IE5MTV9NQVhTVFJMRU4pCisjICBlcnJvciAiTkxNIGhvc3QgbmFtZSBjYW5ub3QgYmUgbGFyZ2VyIHRoYW4gTkxNJ3MgbWF4aW11bSBzdHJpbmcgbGVuZ3RoISIKKyNlbmRpZgorCisvKgorICogRGVjbGFyZSB0aGUgc3BhY2UgcmVxdWlyZW1lbnRzIGZvciBOTE0gYXJndW1lbnRzIGFuZCByZXBsaWVzIGFzCisgKiBudW1iZXIgb2YgMzJiaXQtd29yZHMKKyAqLworI2RlZmluZSBOTE00X3ZvaWRfc3oJCSgwKQorI2RlZmluZSBOTE00X2Nvb2tpZV9zegkJKDErKE5MTV9NQVhDT09LSUVMRU4+PjIpKQorI2RlZmluZSBOTE00X2NhbGxlcl9zegkJKDErKE5MTUNMTlRfT0hTSVpFPj4yKSkKKyNkZWZpbmUgTkxNNF9vd25lcl9zegkJKDErKE5MTUNMTlRfT0hTSVpFPj4yKSkKKyNkZWZpbmUgTkxNNF9maGFuZGxlX3N6CQkoMSsoTkZTM19GSFNJWkU+PjIpKQorI2RlZmluZSBOTE00X2xvY2tfc3oJCSg1K05MTTRfY2FsbGVyX3N6K05MTTRfb3duZXJfc3orTkxNNF9maGFuZGxlX3N6KQorI2RlZmluZSBOTE00X2hvbGRlcl9zegkJKDYrTkxNNF9vd25lcl9zeikKKworI2RlZmluZSBOTE00X3Rlc3RhcmdzX3N6CShOTE00X2Nvb2tpZV9zeisxK05MTTRfbG9ja19zeikKKyNkZWZpbmUgTkxNNF9sb2NrYXJnc19zegkoTkxNNF9jb29raWVfc3orNCtOTE00X2xvY2tfc3opCisjZGVmaW5lIE5MTTRfY2FuY2FyZ3Nfc3oJKE5MTTRfY29va2llX3N6KzIrTkxNNF9sb2NrX3N6KQorI2RlZmluZSBOTE00X3VubG9ja2FyZ3Nfc3oJKE5MTTRfY29va2llX3N6K05MTTRfbG9ja19zeikKKworI2RlZmluZSBOTE00X3Rlc3RyZXNfc3oJCShOTE00X2Nvb2tpZV9zeisxK05MTTRfaG9sZGVyX3N6KQorI2RlZmluZSBOTE00X3Jlc19zegkJKE5MTTRfY29va2llX3N6KzEpCisjZGVmaW5lIE5MTTRfbm9yZXBfc3oJCSgwKQorCisKK3N0YXRpYyBzNjQgbG9mZl90X3RvX3M2NChsb2ZmX3Qgb2Zmc2V0KQoreworCXM2NCByZXM7CisKKwlpZiAob2Zmc2V0ID49IE5MTTRfT0ZGU0VUX01BWCkKKwkJcmVzID0gTkxNNF9PRkZTRVRfTUFYOworCWVsc2UgaWYgKG9mZnNldCA8PSAtTkxNNF9PRkZTRVRfTUFYKQorCQlyZXMgPSAtTkxNNF9PRkZTRVRfTUFYOworCWVsc2UKKwkJcmVzID0gb2Zmc2V0OworCXJldHVybiByZXM7Cit9CisKK3N0YXRpYyB2b2lkIG5sbTRfY29tcHV0ZV9vZmZzZXRzKGNvbnN0IHN0cnVjdCBubG1fbG9jayAqbG9jaywKKwkJCQkgdTY0ICpsX29mZnNldCwgdTY0ICpsX2xlbikKK3sKKwljb25zdCBzdHJ1Y3QgZmlsZV9sb2NrICpmbCA9ICZsb2NrLT5mbDsKKworCUJVR19PTihmbC0+Zmxfc3RhcnQgPiBOTE00X09GRlNFVF9NQVgpOworCUJVR19PTihmbC0+ZmxfZW5kID4gTkxNNF9PRkZTRVRfTUFYICYmCisJCQkJZmwtPmZsX2VuZCAhPSBPRkZTRVRfTUFYKTsKKworCSpsX29mZnNldCA9IGxvZmZfdF90b19zNjQoZmwtPmZsX3N0YXJ0KTsKKwlpZiAoZmwtPmZsX2VuZCA9PSBPRkZTRVRfTUFYKQorCQkqbF9sZW4gPSAwOworCWVsc2UKKwkJKmxfbGVuID0gbG9mZl90X3RvX3M2NChmbC0+ZmxfZW5kIC0gZmwtPmZsX3N0YXJ0ICsgMSk7Cit9CisKKy8qCisgKiBIYW5kbGUgZGVjb2RlIGJ1ZmZlciBvdmVyZmxvd3Mgb3V0LW9mLWxpbmUuCisgKi8KK3N0YXRpYyB2b2lkIHByaW50X292ZXJmbG93X21zZyhjb25zdCBjaGFyICpmdW5jLCBjb25zdCBzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyKQoreworCWRwcmludGsoImxvY2tkOiAlcyBwcmVtYXR1cmVseSBoaXQgdGhlIGVuZCBvZiBvdXIgcmVjZWl2ZSBidWZmZXIuICIKKwkJIlJlbWFpbmluZyBidWZmZXIgbGVuZ3RoIGlzICV0dSB3b3Jkcy5cbiIsCisJCWZ1bmMsIHhkci0+ZW5kIC0geGRyLT5wKTsKK30KKworCisvKgorICogRW5jb2RlL2RlY29kZSBOTE12NCBiYXNpYyBkYXRhIHR5cGVzCisgKgorICogQmFzaWMgTkxNdjQgZGF0YSB0eXBlcyBhcmUgZGVmaW5lZCBpbiBBcHBlbmRpeCBJSSwgc2VjdGlvbiA2LjEuNAorICogb2YgUkZDIDE4MTM6ICJORlMgVmVyc2lvbiAzIFByb3RvY29sIFNwZWNpZmljYXRpb24iIGFuZCBpbiBDaGFwdGVyCisgKiAxMCBvZiBYL09wZW4ncyAiUHJvdG9jb2xzIGZvciBJbnRlcndvcmtpbmc6IFhORlMsIFZlcnNpb24gM1ciLgorICoKKyAqIE5vdCBhbGwgYmFzaWMgZGF0YSB0eXBlcyBoYXZlIHRoZWlyIG93biBlbmNvZGluZyBhbmQgZGVjb2RpbmcKKyAqIGZ1bmN0aW9ucy4gIEZvciBydW4tdGltZSBlZmZpY2llbmN5LCBzb21lIGRhdGEgdHlwZXMgYXJlIGVuY29kZWQKKyAqIG9yIGRlY29kZWQgaW5saW5lLgorICovCisKK3N0YXRpYyB2b2lkIGVuY29kZV9ib29sKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIGNvbnN0IGludCB2YWx1ZSkKK3sKKwlfX2JlMzIgKnA7CisKKwlwID0geGRyX3Jlc2VydmVfc3BhY2UoeGRyLCA0KTsKKwkqcCA9IHZhbHVlID8geGRyX29uZSA6IHhkcl96ZXJvOworfQorCitzdGF0aWMgdm9pZCBlbmNvZGVfaW50MzIoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgY29uc3QgczMyIHZhbHVlKQoreworCV9fYmUzMiAqcDsKKworCXAgPSB4ZHJfcmVzZXJ2ZV9zcGFjZSh4ZHIsIDQpOworCSpwID0gY3B1X3RvX2JlMzIodmFsdWUpOworfQorCisvKgorICoJdHlwZWRlZiBvcGFxdWUgbmV0b2JqPE1BWE5FVE9CSl9TWj4KKyAqLworc3RhdGljIHZvaWQgZW5jb2RlX25ldG9iaihzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAorCQkJICBjb25zdCB1OCAqZGF0YSwgY29uc3QgdW5zaWduZWQgaW50IGxlbmd0aCkKK3sKKwlfX2JlMzIgKnA7CisKKwlCVUdfT04obGVuZ3RoID4gWERSX01BWF9ORVRPQkopOworCXAgPSB4ZHJfcmVzZXJ2ZV9zcGFjZSh4ZHIsIDQgKyBsZW5ndGgpOworCXhkcl9lbmNvZGVfb3BhcXVlKHAsIGRhdGEsIGxlbmd0aCk7Cit9CisKK3N0YXRpYyBpbnQgZGVjb2RlX25ldG9iaihzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAorCQkJIHN0cnVjdCB4ZHJfbmV0b2JqICpvYmopCit7CisJdTMyIGxlbmd0aDsKKwlfX2JlMzIgKnA7CisKKwlwID0geGRyX2lubGluZV9kZWNvZGUoeGRyLCA0KTsKKwlpZiAodW5saWtlbHkocCA9PSBOVUxMKSkKKwkJZ290byBvdXRfb3ZlcmZsb3c7CisJbGVuZ3RoID0gYmUzMl90b19jcHVwKHArKyk7CisJaWYgKHVubGlrZWx5KGxlbmd0aCA+IFhEUl9NQVhfTkVUT0JKKSkKKwkJZ290byBvdXRfc2l6ZTsKKwlvYmotPmxlbiA9IGxlbmd0aDsKKwlvYmotPmRhdGEgPSAodTggKilwOworCXJldHVybiAwOworb3V0X3NpemU6CisJZHByaW50aygiTkZTOiByZXR1cm5lZCBuZXRvYmogd2FzIHRvbyBsb25nOiAldVxuIiwgbGVuZ3RoKTsKKwlyZXR1cm4gLUVJTzsKK291dF9vdmVyZmxvdzoKKwlwcmludF9vdmVyZmxvd19tc2coX19mdW5jX18sIHhkcik7CisJcmV0dXJuIC1FSU87Cit9CisKKy8qCisgKgluZXRvYmogY29va2llOworICovCitzdGF0aWMgdm9pZCBlbmNvZGVfY29va2llKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCisJCQkgIGNvbnN0IHN0cnVjdCBubG1fY29va2llICpjb29raWUpCit7CisJQlVHX09OKGNvb2tpZS0+bGVuID4gTkxNX01BWENPT0tJRUxFTik7CisJZW5jb2RlX25ldG9iaih4ZHIsICh1OCAqKSZjb29raWUtPmRhdGEsIGNvb2tpZS0+bGVuKTsKK30KKworc3RhdGljIGludCBkZWNvZGVfY29va2llKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCisJCQkgICAgIHN0cnVjdCBubG1fY29va2llICpjb29raWUpCit7CisJdTMyIGxlbmd0aDsKKwlfX2JlMzIgKnA7CisKKwlwID0geGRyX2lubGluZV9kZWNvZGUoeGRyLCA0KTsKKwlpZiAodW5saWtlbHkocCA9PSBOVUxMKSkKKwkJZ290byBvdXRfb3ZlcmZsb3c7CisJbGVuZ3RoID0gYmUzMl90b19jcHVwKHArKyk7CisJLyogYXBwYXJlbnRseSBIUFVYIGNhbiByZXR1cm4gZW1wdHkgY29va2llcyAqLworCWlmIChsZW5ndGggPT0gMCkKKwkJZ290byBvdXRfaHB1eDsKKwlpZiAobGVuZ3RoID4gTkxNX01BWENPT0tJRUxFTikKKwkJZ290byBvdXRfc2l6ZTsKKwlwID0geGRyX2lubGluZV9kZWNvZGUoeGRyLCBsZW5ndGgpOworCWlmICh1bmxpa2VseShwID09IE5VTEwpKQorCQlnb3RvIG91dF9vdmVyZmxvdzsKKwljb29raWUtPmxlbiA9IGxlbmd0aDsKKwltZW1jcHkoY29va2llLT5kYXRhLCBwLCBsZW5ndGgpOworCXJldHVybiAwOworb3V0X2hwdXg6CisJY29va2llLT5sZW4gPSA0OworCW1lbXNldChjb29raWUtPmRhdGEsIDAsIDQpOworCXJldHVybiAwOworb3V0X3NpemU6CisJZHByaW50aygiTkZTOiByZXR1cm5lZCBjb29raWUgd2FzIHRvbyBsb25nOiAldVxuIiwgbGVuZ3RoKTsKKwlyZXR1cm4gLUVJTzsKK291dF9vdmVyZmxvdzoKKwlwcmludF9vdmVyZmxvd19tc2coX19mdW5jX18sIHhkcik7CisJcmV0dXJuIC1FSU87Cit9CisKKy8qCisgKgluZXRvYmogZmg7CisgKi8KK3N0YXRpYyB2b2lkIGVuY29kZV9maChzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBjb25zdCBzdHJ1Y3QgbmZzX2ZoICpmaCkKK3sKKwlCVUdfT04oZmgtPnNpemUgPiBORlMzX0ZIU0laRSk7CisJZW5jb2RlX25ldG9iaih4ZHIsICh1OCAqKSZmaC0+ZGF0YSwgZmgtPnNpemUpOworfQorCisvKgorICoJZW51bSBubG00X3N0YXRzIHsKKyAqCQlOTE00X0dSQU5URUQgPSAwLAorICoJCU5MTTRfREVOSUVEID0gMSwKKyAqCQlOTE00X0RFTklFRF9OT0xPQ0tTID0gMiwKKyAqCQlOTE00X0JMT0NLRUQgPSAzLAorICoJCU5MTTRfREVOSUVEX0dSQUNFX1BFUklPRCA9IDQsCisgKgkJTkxNNF9ERUFETENLID0gNSwKKyAqCQlOTE00X1JPRlMgPSA2LAorICoJCU5MTTRfU1RBTEVfRkggPSA3LAorICoJCU5MTTRfRkJJRyA9IDgsCisgKgkJTkxNNF9GQUlMRUQgPSA5CisgKgl9OworICoKKyAqCXN0cnVjdCBubG00X3N0YXQgeworICoJCW5sbTRfc3RhdHMgc3RhdDsKKyAqCX07CisgKgorICogTkI6IHdlIGRvbid0IHN3YXAgYnl0ZXMgZm9yIHRoZSBOTE0gc3RhdHVzIHZhbHVlcy4gIFRoZSB1cHBlcgorICogbGF5ZXJzIGRlYWwgZGlyZWN0bHkgd2l0aCB0aGUgc3RhdHVzIHZhbHVlIGluIG5ldHdvcmsgYnl0ZQorICogb3JkZXIuCisgKi8KK3N0YXRpYyB2b2lkIGVuY29kZV9ubG00X3N0YXQoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKKwkJCSAgICAgY29uc3QgX19iZTMyIHN0YXQpCit7CisJX19iZTMyICpwOworCisJQlVHX09OKGJlMzJfdG9fY3B1KHN0YXQpID4gTkxNX0ZBSUxFRCk7CisJcCA9IHhkcl9yZXNlcnZlX3NwYWNlKHhkciwgNCk7CisJKnAgPSBzdGF0OworfQorCitzdGF0aWMgaW50IGRlY29kZV9ubG00X3N0YXQoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgX19iZTMyICpzdGF0KQoreworCV9fYmUzMiAqcDsKKworCXAgPSB4ZHJfaW5saW5lX2RlY29kZSh4ZHIsIDQpOworCWlmICh1bmxpa2VseShwID09IE5VTEwpKQorCQlnb3RvIG91dF9vdmVyZmxvdzsKKwlpZiAodW5saWtlbHkoKnAgPiBubG00X2ZhaWxlZCkpCisJCWdvdG8gb3V0X2JhZF94ZHI7CisJKnN0YXQgPSAqcDsKKwlyZXR1cm4gMDsKK291dF9iYWRfeGRyOgorCWRwcmludGsoIiVzOiBzZXJ2ZXIgcmV0dXJuZWQgaW52YWxpZCBubG00X3N0YXRzIHZhbHVlOiAldVxuIiwKKwkJCV9fZnVuY19fLCBiZTMyX3RvX2NwdXAocCkpOworCXJldHVybiAtRUlPOworb3V0X292ZXJmbG93OgorCXByaW50X292ZXJmbG93X21zZyhfX2Z1bmNfXywgeGRyKTsKKwlyZXR1cm4gLUVJTzsKK30KKworLyoKKyAqCXN0cnVjdCBubG00X2hvbGRlciB7CisgKgkJYm9vbAlleGNsdXNpdmU7CisgKgkJaW50MzIJc3ZpZDsKKyAqCQluZXRvYmoJb2g7CisgKgkJdWludDY0CWxfb2Zmc2V0OworICoJCXVpbnQ2NAlsX2xlbjsKKyAqCX07CisgKi8KK3N0YXRpYyB2b2lkIGVuY29kZV9ubG00X2hvbGRlcihzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAorCQkJICAgICAgIGNvbnN0IHN0cnVjdCBubG1fcmVzICpyZXN1bHQpCit7CisJY29uc3Qgc3RydWN0IG5sbV9sb2NrICpsb2NrID0gJnJlc3VsdC0+bG9jazsKKwl1NjQgbF9vZmZzZXQsIGxfbGVuOworCV9fYmUzMiAqcDsKKworCWVuY29kZV9ib29sKHhkciwgbG9jay0+ZmwuZmxfdHlwZSA9PSBGX1JETENLKTsKKwllbmNvZGVfaW50MzIoeGRyLCBsb2NrLT5zdmlkKTsKKwllbmNvZGVfbmV0b2JqKHhkciwgbG9jay0+b2guZGF0YSwgbG9jay0+b2gubGVuKTsKKworCXAgPSB4ZHJfcmVzZXJ2ZV9zcGFjZSh4ZHIsIDQgKyA0KTsKKwlubG00X2NvbXB1dGVfb2Zmc2V0cyhsb2NrLCAmbF9vZmZzZXQsICZsX2xlbik7CisJcCA9IHhkcl9lbmNvZGVfaHlwZXIocCwgbF9vZmZzZXQpOworCXhkcl9lbmNvZGVfaHlwZXIocCwgbF9sZW4pOworfQorCitzdGF0aWMgaW50IGRlY29kZV9ubG00X2hvbGRlcihzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBzdHJ1Y3QgbmxtX3JlcyAqcmVzdWx0KQoreworCXN0cnVjdCBubG1fbG9jayAqbG9jayA9ICZyZXN1bHQtPmxvY2s7CisJc3RydWN0IGZpbGVfbG9jayAqZmwgPSAmbG9jay0+Zmw7CisJdTY0IGxfb2Zmc2V0LCBsX2xlbjsKKwl1MzIgZXhjbHVzaXZlOworCWludCBlcnJvcjsKKwlfX2JlMzIgKnA7CisJczMyIGVuZDsKKworCW1lbXNldChsb2NrLCAwLCBzaXplb2YoKmxvY2spKTsKKwlsb2Nrc19pbml0X2xvY2soZmwpOworCisJcCA9IHhkcl9pbmxpbmVfZGVjb2RlKHhkciwgNCArIDQpOworCWlmICh1bmxpa2VseShwID09IE5VTEwpKQorCQlnb3RvIG91dF9vdmVyZmxvdzsKKwlleGNsdXNpdmUgPSBiZTMyX3RvX2NwdXAocCsrKTsKKwlsb2NrLT5zdmlkID0gYmUzMl90b19jcHVwKHApOworCWZsLT5mbF9waWQgPSAocGlkX3QpbG9jay0+c3ZpZDsKKworCWVycm9yID0gZGVjb2RlX25ldG9iaih4ZHIsICZsb2NrLT5vaCk7CisJaWYgKHVubGlrZWx5KGVycm9yKSkKKwkJZ290byBvdXQ7CisKKwlwID0geGRyX2lubGluZV9kZWNvZGUoeGRyLCA4ICsgOCk7CisJaWYgKHVubGlrZWx5KHAgPT0gTlVMTCkpCisJCWdvdG8gb3V0X292ZXJmbG93OworCisJZmwtPmZsX2ZsYWdzID0gRkxfUE9TSVg7CisJZmwtPmZsX3R5cGUgID0gZXhjbHVzaXZlICE9IDAgPyBGX1dSTENLIDogRl9SRExDSzsKKwlwID0geGRyX2RlY29kZV9oeXBlcihwLCAmbF9vZmZzZXQpOworCXhkcl9kZWNvZGVfaHlwZXIocCwgJmxfbGVuKTsKKwllbmQgPSBsX29mZnNldCArIGxfbGVuIC0gMTsKKworCWZsLT5mbF9zdGFydCA9IChsb2ZmX3QpbF9vZmZzZXQ7CisJaWYgKGxfbGVuID09IDAgfHwgZW5kIDwgMCkKKwkJZmwtPmZsX2VuZCA9IE9GRlNFVF9NQVg7CisJZWxzZQorCQlmbC0+ZmxfZW5kID0gKGxvZmZfdCllbmQ7CisJZXJyb3IgPSAwOworb3V0OgorCXJldHVybiBlcnJvcjsKK291dF9vdmVyZmxvdzoKKwlwcmludF9vdmVyZmxvd19tc2coX19mdW5jX18sIHhkcik7CisJcmV0dXJuIC1FSU87Cit9CisKKy8qCisgKglzdHJpbmcgY2FsbGVyX25hbWU8TE1fTUFYU1RSTEVOPjsKKyAqLworc3RhdGljIHZvaWQgZW5jb2RlX2NhbGxlcl9uYW1lKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJLyogTkI6IGNsaWVudC1zaWRlIGRvZXMgbm90IHNldCBsb2NrLT5sZW4gKi8KKwl1MzIgbGVuZ3RoID0gc3RybGVuKG5hbWUpOworCV9fYmUzMiAqcDsKKworCUJVR19PTihsZW5ndGggPiBOTE1fTUFYU1RSTEVOKTsKKwlwID0geGRyX3Jlc2VydmVfc3BhY2UoeGRyLCA0ICsgbGVuZ3RoKTsKKwl4ZHJfZW5jb2RlX29wYXF1ZShwLCBuYW1lLCBsZW5ndGgpOworfQorCisvKgorICoJc3RydWN0IG5sbTRfbG9jayB7CisgKgkJc3RyaW5nCWNhbGxlcl9uYW1lPExNX01BWFNUUkxFTj47CisgKgkJbmV0b2JqCWZoOworICoJCW5ldG9iaglvaDsKKyAqCQlpbnQzMglzdmlkOworICoJCXVpbnQ2NAlsX29mZnNldDsKKyAqCQl1aW50NjQJbF9sZW47CisgKgl9OworICovCitzdGF0aWMgdm9pZCBlbmNvZGVfbmxtNF9sb2NrKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCisJCQkgICAgIGNvbnN0IHN0cnVjdCBubG1fbG9jayAqbG9jaykKK3sKKwl1NjQgbF9vZmZzZXQsIGxfbGVuOworCV9fYmUzMiAqcDsKKworCWVuY29kZV9jYWxsZXJfbmFtZSh4ZHIsIGxvY2stPmNhbGxlcik7CisJZW5jb2RlX2ZoKHhkciwgJmxvY2stPmZoKTsKKwllbmNvZGVfbmV0b2JqKHhkciwgbG9jay0+b2guZGF0YSwgbG9jay0+b2gubGVuKTsKKworCXAgPSB4ZHJfcmVzZXJ2ZV9zcGFjZSh4ZHIsIDQgKyA4ICsgOCk7CisJKnArKyA9IGNwdV90b19iZTMyKGxvY2stPnN2aWQpOworCisJbmxtNF9jb21wdXRlX29mZnNldHMobG9jaywgJmxfb2Zmc2V0LCAmbF9sZW4pOworCXAgPSB4ZHJfZW5jb2RlX2h5cGVyKHAsIGxfb2Zmc2V0KTsKKwl4ZHJfZW5jb2RlX2h5cGVyKHAsIGxfbGVuKTsKK30KKworCisvKgorICogTkxNdjQgWERSIGVuY29kZSBmdW5jdGlvbnMKKyAqCisgKiBOTE12NCBhcmd1bWVudCB0eXBlcyBhcmUgZGVmaW5lZCBpbiBBcHBlbmRpeCBJSSBvZiBSRkMgMTgxMzoKKyAqICJORlMgVmVyc2lvbiAzIFByb3RvY29sIFNwZWNpZmljYXRpb24iIGFuZCBDaGFwdGVyIDEwIG9mIFgvT3BlbidzCisgKiAiUHJvdG9jb2xzIGZvciBJbnRlcndvcmtpbmc6IFhORlMsIFZlcnNpb24gM1ciLgorICovCisKKy8qCisgKglzdHJ1Y3QgbmxtNF90ZXN0YXJncyB7CisgKgkJbmV0b2JqIGNvb2tpZTsKKyAqCQlib29sIGV4Y2x1c2l2ZTsKKyAqCQlzdHJ1Y3QgbmxtNF9sb2NrIGFsb2NrOworICoJfTsKKyAqLworc3RhdGljIHZvaWQgbmxtNF94ZHJfZW5jX3Rlc3RhcmdzKHN0cnVjdCBycGNfcnFzdCAqcmVxLAorCQkJCSAgc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKKwkJCQkgIGNvbnN0IHN0cnVjdCBubG1fYXJncyAqYXJncykKK3sKKwljb25zdCBzdHJ1Y3QgbmxtX2xvY2sgKmxvY2sgPSAmYXJncy0+bG9jazsKKworCWVuY29kZV9jb29raWUoeGRyLCAmYXJncy0+Y29va2llKTsKKwllbmNvZGVfYm9vbCh4ZHIsIGxvY2stPmZsLmZsX3R5cGUgPT0gRl9XUkxDSyk7CisJZW5jb2RlX25sbTRfbG9jayh4ZHIsIGxvY2spOworfQorCisvKgorICoJc3RydWN0IG5sbTRfbG9ja2FyZ3MgeworICoJCW5ldG9iaiBjb29raWU7CisgKgkJYm9vbCBibG9jazsKKyAqCQlib29sIGV4Y2x1c2l2ZTsKKyAqCQlzdHJ1Y3QgbmxtNF9sb2NrIGFsb2NrOworICoJCWJvb2wgcmVjbGFpbTsKKyAqCQlpbnQgc3RhdGU7CisgKgl9OworICovCitzdGF0aWMgdm9pZCBubG00X3hkcl9lbmNfbG9ja2FyZ3Moc3RydWN0IHJwY19ycXN0ICpyZXEsCisJCQkJICBzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAorCQkJCSAgY29uc3Qgc3RydWN0IG5sbV9hcmdzICphcmdzKQoreworCWNvbnN0IHN0cnVjdCBubG1fbG9jayAqbG9jayA9ICZhcmdzLT5sb2NrOworCisJZW5jb2RlX2Nvb2tpZSh4ZHIsICZhcmdzLT5jb29raWUpOworCWVuY29kZV9ib29sKHhkciwgYXJncy0+YmxvY2spOworCWVuY29kZV9ib29sKHhkciwgbG9jay0+ZmwuZmxfdHlwZSA9PSBGX1dSTENLKTsKKwllbmNvZGVfbmxtNF9sb2NrKHhkciwgbG9jayk7CisJZW5jb2RlX2Jvb2woeGRyLCBhcmdzLT5yZWNsYWltKTsKKwllbmNvZGVfaW50MzIoeGRyLCBhcmdzLT5zdGF0ZSk7Cit9CisKKy8qCisgKglzdHJ1Y3QgbmxtNF9jYW5jYXJncyB7CisgKgkJbmV0b2JqIGNvb2tpZTsKKyAqCQlib29sIGJsb2NrOworICoJCWJvb2wgZXhjbHVzaXZlOworICoJCXN0cnVjdCBubG00X2xvY2sgYWxvY2s7CisgKgl9OworICovCitzdGF0aWMgdm9pZCBubG00X3hkcl9lbmNfY2FuY2FyZ3Moc3RydWN0IHJwY19ycXN0ICpyZXEsCisJCQkJICBzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAorCQkJCSAgY29uc3Qgc3RydWN0IG5sbV9hcmdzICphcmdzKQoreworCWNvbnN0IHN0cnVjdCBubG1fbG9jayAqbG9jayA9ICZhcmdzLT5sb2NrOworCisJZW5jb2RlX2Nvb2tpZSh4ZHIsICZhcmdzLT5jb29raWUpOworCWVuY29kZV9ib29sKHhkciwgYXJncy0+YmxvY2spOworCWVuY29kZV9ib29sKHhkciwgbG9jay0+ZmwuZmxfdHlwZSA9PSBGX1dSTENLKTsKKwllbmNvZGVfbmxtNF9sb2NrKHhkciwgbG9jayk7Cit9CisKKy8qCisgKglzdHJ1Y3QgbmxtNF91bmxvY2thcmdzIHsKKyAqCQluZXRvYmogY29va2llOworICoJCXN0cnVjdCBubG00X2xvY2sgYWxvY2s7CisgKgl9OworICovCitzdGF0aWMgdm9pZCBubG00X3hkcl9lbmNfdW5sb2NrYXJncyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwKKwkJCQkgICAgc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKKwkJCQkgICAgY29uc3Qgc3RydWN0IG5sbV9hcmdzICphcmdzKQoreworCWNvbnN0IHN0cnVjdCBubG1fbG9jayAqbG9jayA9ICZhcmdzLT5sb2NrOworCisJZW5jb2RlX2Nvb2tpZSh4ZHIsICZhcmdzLT5jb29raWUpOworCWVuY29kZV9ubG00X2xvY2soeGRyLCBsb2NrKTsKK30KKworLyoKKyAqCXN0cnVjdCBubG00X3JlcyB7CisgKgkJbmV0b2JqIGNvb2tpZTsKKyAqCQlubG00X3N0YXQgc3RhdDsKKyAqCX07CisgKi8KK3N0YXRpYyB2b2lkIG5sbTRfeGRyX2VuY19yZXMoc3RydWN0IHJwY19ycXN0ICpyZXEsCisJCQkgICAgIHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCisJCQkgICAgIGNvbnN0IHN0cnVjdCBubG1fcmVzICpyZXN1bHQpCit7CisJZW5jb2RlX2Nvb2tpZSh4ZHIsICZyZXN1bHQtPmNvb2tpZSk7CisJZW5jb2RlX25sbTRfc3RhdCh4ZHIsIHJlc3VsdC0+c3RhdHVzKTsKK30KKworLyoKKyAqCXVuaW9uIG5sbTRfdGVzdHJwbHkgc3dpdGNoIChubG00X3N0YXRzIHN0YXQpIHsKKyAqCWNhc2UgTkxNNF9ERU5JRUQ6CisgKgkJc3RydWN0IG5sbTRfaG9sZGVyIGhvbGRlcjsKKyAqCWRlZmF1bHQ6CisgKgkJdm9pZDsKKyAqCX07CisgKgorICoJc3RydWN0IG5sbTRfdGVzdHJlcyB7CisgKgkJbmV0b2JqIGNvb2tpZTsKKyAqCQlubG00X3Rlc3RycGx5IHRlc3Rfc3RhdDsKKyAqCX07CisgKi8KK3N0YXRpYyB2b2lkIG5sbTRfeGRyX2VuY190ZXN0cmVzKHN0cnVjdCBycGNfcnFzdCAqcmVxLAorCQkJCSBzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAorCQkJCSBjb25zdCBzdHJ1Y3QgbmxtX3JlcyAqcmVzdWx0KQoreworCWVuY29kZV9jb29raWUoeGRyLCAmcmVzdWx0LT5jb29raWUpOworCWVuY29kZV9ubG00X3N0YXQoeGRyLCByZXN1bHQtPnN0YXR1cyk7CisJaWYgKHJlc3VsdC0+c3RhdHVzID09IG5sbV9sY2tfZGVuaWVkKQorCQllbmNvZGVfbmxtNF9ob2xkZXIoeGRyLCByZXN1bHQpOworfQorCisKKy8qCisgKiBOTE12NCBYRFIgZGVjb2RlIGZ1bmN0aW9ucworICoKKyAqIE5MTXY0IGFyZ3VtZW50IHR5cGVzIGFyZSBkZWZpbmVkIGluIEFwcGVuZGl4IElJIG9mIFJGQyAxODEzOgorICogIk5GUyBWZXJzaW9uIDMgUHJvdG9jb2wgU3BlY2lmaWNhdGlvbiIgYW5kIENoYXB0ZXIgMTAgb2YgWC9PcGVuJ3MKKyAqICJQcm90b2NvbHMgZm9yIEludGVyd29ya2luZzogWE5GUywgVmVyc2lvbiAzVyIuCisgKi8KKworLyoKKyAqCXVuaW9uIG5sbTRfdGVzdHJwbHkgc3dpdGNoIChubG00X3N0YXRzIHN0YXQpIHsKKyAqCWNhc2UgTkxNNF9ERU5JRUQ6CisgKgkJc3RydWN0IG5sbTRfaG9sZGVyIGhvbGRlcjsKKyAqCWRlZmF1bHQ6CisgKgkJdm9pZDsKKyAqCX07CisgKgorICoJc3RydWN0IG5sbTRfdGVzdHJlcyB7CisgKgkJbmV0b2JqIGNvb2tpZTsKKyAqCQlubG00X3Rlc3RycGx5IHRlc3Rfc3RhdDsKKyAqCX07CisgKi8KK3N0YXRpYyBpbnQgZGVjb2RlX25sbTRfdGVzdHJwbHkoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKKwkJCQlzdHJ1Y3QgbmxtX3JlcyAqcmVzdWx0KQoreworCWludCBlcnJvcjsKKworCWVycm9yID0gZGVjb2RlX25sbTRfc3RhdCh4ZHIsICZyZXN1bHQtPnN0YXR1cyk7CisJaWYgKHVubGlrZWx5KGVycm9yKSkKKwkJZ290byBvdXQ7CisJaWYgKHJlc3VsdC0+c3RhdHVzID09IG5sbV9sY2tfZGVuaWVkKQorCQllcnJvciA9IGRlY29kZV9ubG00X2hvbGRlcih4ZHIsIHJlc3VsdCk7CitvdXQ6CisJcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgaW50IG5sbTRfeGRyX2RlY190ZXN0cmVzKHN0cnVjdCBycGNfcnFzdCAqcmVxLAorCQkJCXN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCisJCQkJc3RydWN0IG5sbV9yZXMgKnJlc3VsdCkKK3sKKwlpbnQgZXJyb3I7CisKKwllcnJvciA9IGRlY29kZV9jb29raWUoeGRyLCAmcmVzdWx0LT5jb29raWUpOworCWlmICh1bmxpa2VseShlcnJvcikpCisJCWdvdG8gb3V0OworCWVycm9yID0gZGVjb2RlX25sbTRfdGVzdHJwbHkoeGRyLCByZXN1bHQpOworb3V0OgorCXJldHVybiBlcnJvcjsKK30KKworLyoKKyAqCXN0cnVjdCBubG00X3JlcyB7CisgKgkJbmV0b2JqIGNvb2tpZTsKKyAqCQlubG00X3N0YXQgc3RhdDsKKyAqCX07CisgKi8KK3N0YXRpYyBpbnQgbmxtNF94ZHJfZGVjX3JlcyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwKKwkJCSAgICBzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAorCQkJICAgIHN0cnVjdCBubG1fcmVzICpyZXN1bHQpCit7CisJaW50IGVycm9yOworCisJZXJyb3IgPSBkZWNvZGVfY29va2llKHhkciwgJnJlc3VsdC0+Y29va2llKTsKKwlpZiAodW5saWtlbHkoZXJyb3IpKQorCQlnb3RvIG91dDsKKwllcnJvciA9IGRlY29kZV9ubG00X3N0YXQoeGRyLCAmcmVzdWx0LT5zdGF0dXMpOworb3V0OgorCXJldHVybiBlcnJvcjsKK30KKworCisvKgorICogRm9yIE5MTSwgYSB2b2lkIHByb2NlZHVyZSByZWFsbHkgcmV0dXJucyBub3RoaW5nCisgKi8KKyNkZWZpbmUgbmxtNF94ZHJfZGVjX25vcmVwCU5VTEwKKworI2RlZmluZSBQUk9DKHByb2MsIGFyZ3R5cGUsIHJlc3R5cGUpCQkJCQlcCitbTkxNUFJPQ18jI3Byb2NdID0gewkJCQkJCQlcCisJLnBfcHJvYyAgICAgID0gTkxNUFJPQ18jI3Byb2MsCQkJCQlcCisJLnBfZW5jb2RlICAgID0gKGt4ZHJlcHJvY190KW5sbTRfeGRyX2VuY18jI2FyZ3R5cGUsCQlcCisJLnBfZGVjb2RlICAgID0gKGt4ZHJkcHJvY190KW5sbTRfeGRyX2RlY18jI3Jlc3R5cGUsCQlcCisJLnBfYXJnbGVuICAgID0gTkxNNF8jI2FyZ3R5cGUjI19zeiwJCQkJXAorCS5wX3JlcGxlbiAgICA9IE5MTTRfIyNyZXN0eXBlIyNfc3osCQkJCVwKKwkucF9zdGF0aWR4ICAgPSBOTE1QUk9DXyMjcHJvYywJCQkJCVwKKwkucF9uYW1lICAgICAgPSAjcHJvYywJCQkJCQlcCisJfQorCitzdGF0aWMgc3RydWN0IHJwY19wcm9jaW5mbwlubG00X3Byb2NlZHVyZXNbXSA9IHsKKwlQUk9DKFRFU1QsCQl0ZXN0YXJncywJdGVzdHJlcyksCisJUFJPQyhMT0NLLAkJbG9ja2FyZ3MsCXJlcyksCisJUFJPQyhDQU5DRUwsCQljYW5jYXJncywJcmVzKSwKKwlQUk9DKFVOTE9DSywJCXVubG9ja2FyZ3MsCXJlcyksCisJUFJPQyhHUkFOVEVELAkJdGVzdGFyZ3MsCXJlcyksCisJUFJPQyhURVNUX01TRywJCXRlc3RhcmdzLAlub3JlcCksCisJUFJPQyhMT0NLX01TRywJCWxvY2thcmdzLAlub3JlcCksCisJUFJPQyhDQU5DRUxfTVNHLAljYW5jYXJncywJbm9yZXApLAorCVBST0MoVU5MT0NLX01TRywJdW5sb2NrYXJncywJbm9yZXApLAorCVBST0MoR1JBTlRFRF9NU0csCXRlc3RhcmdzLAlub3JlcCksCisJUFJPQyhURVNUX1JFUywJCXRlc3RyZXMsCW5vcmVwKSwKKwlQUk9DKExPQ0tfUkVTLAkJcmVzLAkJbm9yZXApLAorCVBST0MoQ0FOQ0VMX1JFUywJcmVzLAkJbm9yZXApLAorCVBST0MoVU5MT0NLX1JFUywJcmVzLAkJbm9yZXApLAorCVBST0MoR1JBTlRFRF9SRVMsCXJlcywJCW5vcmVwKSwKK307CisKK3N0cnVjdCBycGNfdmVyc2lvbglubG1fdmVyc2lvbjQgPSB7CisJLm51bWJlcgkJPSA0LAorCS5ucnByb2NzCT0gQVJSQVlfU0laRShubG00X3Byb2NlZHVyZXMpLAorCS5wcm9jcwkJPSBubG00X3Byb2NlZHVyZXMsCit9OwpkaWZmIC0tZ2l0IGEvZnMvbG9ja2QvY2xudGxvY2suYyBiL2ZzL2xvY2tkL2NsbnRsb2NrLmMKaW5kZXggMjU1MDllYi4uOGQ0ZWE4MyAxMDA2NDQKLS0tIGEvZnMvbG9ja2QvY2xudGxvY2suYworKysgYi9mcy9sb2NrZC9jbG50bG9jay5jCkBAIC03OSw3ICs3OSw3IEBACiAgKi8KIHZvaWQgbmxtY2xudF9kb25lKHN0cnVjdCBubG1faG9zdCAqaG9zdCkKIHsKLQlubG1fcmVsZWFzZV9ob3N0KGhvc3QpOworCW5sbWNsbnRfcmVsZWFzZV9ob3N0KGhvc3QpOwogCWxvY2tkX2Rvd24oKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKG5sbWNsbnRfZG9uZSk7CkBAIC0yNzMsNyArMjczLDcgQEAKIAlzcGluX3VubG9jaygmbmxtX2Jsb2NrZWRfbG9jayk7CiAKIAkvKiBSZWxlYXNlIGhvc3QgaGFuZGxlIGFmdGVyIHVzZSAqLwotCW5sbV9yZWxlYXNlX2hvc3QoaG9zdCk7CisJbmxtY2xudF9yZWxlYXNlX2hvc3QoaG9zdCk7CiAJbG9ja2RfZG93bigpOwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZnMvbG9ja2QvY2xudHByb2MuYyBiL2ZzL2xvY2tkL2NsbnRwcm9jLmMKaW5kZXggMzMyYzU0Yy4uYWRiNDVlYyAxMDA2NDQKLS0tIGEvZnMvbG9ja2QvY2xudHByb2MuYworKysgYi9mcy9sb2NrZC9jbG50cHJvYy5jCkBAIC01OCw3ICs1OCw3IEBACiAJCXJldHVybjsKIAlsaXN0X2RlbCgmbG9ja293bmVyLT5saXN0KTsKIAlzcGluX3VubG9jaygmbG9ja293bmVyLT5ob3N0LT5oX2xvY2spOwotCW5sbV9yZWxlYXNlX2hvc3QobG9ja293bmVyLT5ob3N0KTsKKwlubG1jbG50X3JlbGVhc2VfaG9zdChsb2Nrb3duZXItPmhvc3QpOwogCWtmcmVlKGxvY2tvd25lcik7CiB9CiAKQEAgLTIwNywyMiArMjA3LDIyIEBACiAJCXByaW50aygibmxtX2FsbG9jX2NhbGw6IGZhaWxlZCwgd2FpdGluZyBmb3IgbWVtb3J5XG4iKTsKIAkJc2NoZWR1bGVfdGltZW91dF9pbnRlcnJ1cHRpYmxlKDUqSFopOwogCX0KLQlubG1fcmVsZWFzZV9ob3N0KGhvc3QpOworCW5sbWNsbnRfcmVsZWFzZV9ob3N0KGhvc3QpOwogCXJldHVybiBOVUxMOwogfQogCi12b2lkIG5sbV9yZWxlYXNlX2NhbGwoc3RydWN0IG5sbV9ycXN0ICpjYWxsKQordm9pZCBubG1jbG50X3JlbGVhc2VfY2FsbChzdHJ1Y3QgbmxtX3Jxc3QgKmNhbGwpCiB7CiAJaWYgKCFhdG9taWNfZGVjX2FuZF90ZXN0KCZjYWxsLT5hX2NvdW50KSkKIAkJcmV0dXJuOwotCW5sbV9yZWxlYXNlX2hvc3QoY2FsbC0+YV9ob3N0KTsKKwlubG1jbG50X3JlbGVhc2VfaG9zdChjYWxsLT5hX2hvc3QpOwogCW5sbWNsbnRfcmVsZWFzZV9sb2NrYXJncyhjYWxsKTsKIAlrZnJlZShjYWxsKTsKIH0KIAogc3RhdGljIHZvaWQgbmxtY2xudF9ycGNfcmVsZWFzZSh2b2lkICpkYXRhKQogewotCW5sbV9yZWxlYXNlX2NhbGwoZGF0YSk7CisJbmxtY2xudF9yZWxlYXNlX2NhbGwoZGF0YSk7CiB9CiAKIHN0YXRpYyBpbnQgbmxtX3dhaXRfb25fZ3JhY2Uod2FpdF9xdWV1ZV9oZWFkX3QgKnF1ZXVlKQpAQCAtNDM2LDcgKzQzNiw3IEBACiAJCQlzdGF0dXMgPSBubG1fc3RhdF90b19lcnJubyhyZXEtPmFfcmVzLnN0YXR1cyk7CiAJfQogb3V0OgotCW5sbV9yZWxlYXNlX2NhbGwocmVxKTsKKwlubG1jbG50X3JlbGVhc2VfY2FsbChyZXEpOwogCXJldHVybiBzdGF0dXM7CiB9CiAKQEAgLTU5Myw3ICs1OTMsNyBAQAogb3V0X3VuYmxvY2s6CiAJbmxtY2xudF9maW5pc2hfYmxvY2soYmxvY2spOwogb3V0OgotCW5sbV9yZWxlYXNlX2NhbGwocmVxKTsKKwlubG1jbG50X3JlbGVhc2VfY2FsbChyZXEpOwogCXJldHVybiBzdGF0dXM7CiBvdXRfdW5sb2NrOgogCS8qIEZhdGFsIGVycm9yOiBlbnN1cmUgdGhhdCB3ZSByZW1vdmUgdGhlIGxvY2sgYWx0b2dldGhlciAqLwpAQCAtNjk0LDcgKzY5NCw3IEBACiAJLyogV2hhdCB0byBkbyBub3c/IEknbSBvdXQgb2YgbXkgZGVwdGguLi4gKi8KIAlzdGF0dXMgPSAtRU5PTENLOwogb3V0OgotCW5sbV9yZWxlYXNlX2NhbGwocmVxKTsKKwlubG1jbG50X3JlbGVhc2VfY2FsbChyZXEpOwogCXJldHVybiBzdGF0dXM7CiB9CiAKQEAgLTc1NSw3ICs3NTUsNyBAQAogCQkJTkxNUFJPQ19DQU5DRUwsICZubG1jbG50X2NhbmNlbF9vcHMpOwogCWlmIChzdGF0dXMgPT0gMCAmJiByZXEtPmFfcmVzLnN0YXR1cyA9PSBubG1fbGNrX2RlbmllZCkKIAkJc3RhdHVzID0gLUVOT0xDSzsKLQlubG1fcmVsZWFzZV9jYWxsKHJlcSk7CisJbmxtY2xudF9yZWxlYXNlX2NhbGwocmVxKTsKIAlyZXR1cm4gc3RhdHVzOwogfQogCmRpZmYgLS1naXQgYS9mcy9sb2NrZC9jbG50eGRyLmMgYi9mcy9sb2NrZC9jbG50eGRyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTgwYWMzNAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2xvY2tkL2NsbnR4ZHIuYwpAQCAtMCwwICsxLDYyNyBAQAorLyoKKyAqIGxpbnV4L2ZzL2xvY2tkL2NsbnR4ZHIuYworICoKKyAqIFhEUiBmdW5jdGlvbnMgdG8gZW5jb2RlL2RlY29kZSBOTE0gdmVyc2lvbiAzIFJQQyBhcmd1bWVudHMgYW5kIHJlc3VsdHMuCisgKiBOTE0gdmVyc2lvbiAzIGlzIGJhY2t3YXJkcyBjb21wYXRpYmxlIHdpdGggTkxNIHZlcnNpb25zIDEgYW5kIDIuCisgKgorICogTkxNIGNsaWVudC1zaWRlIG9ubHkuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEwLCBPcmFjbGUuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICovCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy94ZHIuaD4KKyNpbmNsdWRlIDxsaW51eC9zdW5ycGMvY2xudC5oPgorI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9zdGF0cy5oPgorI2luY2x1ZGUgPGxpbnV4L2xvY2tkL2xvY2tkLmg+CisKKyNkZWZpbmUgTkxNREJHX0ZBQ0lMSVRZCQlOTE1EQkdfWERSCisKKyNpZiAoTkxNQ0xOVF9PSFNJWkUgPiBYRFJfTUFYX05FVE9CSikKKyMgIGVycm9yICJOTE0gaG9zdCBuYW1lIGNhbm5vdCBiZSBsYXJnZXIgdGhhbiBYRFJfTUFYX05FVE9CSiEiCisjZW5kaWYKKworLyoKKyAqIERlY2xhcmUgdGhlIHNwYWNlIHJlcXVpcmVtZW50cyBmb3IgTkxNIGFyZ3VtZW50cyBhbmQgcmVwbGllcyBhcworICogbnVtYmVyIG9mIDMyYml0LXdvcmRzCisgKi8KKyNkZWZpbmUgTkxNX2Nvb2tpZV9zegkJKDErKE5MTV9NQVhDT09LSUVMRU4+PjIpKQorI2RlZmluZSBOTE1fY2FsbGVyX3N6CQkoMSsoTkxNQ0xOVF9PSFNJWkU+PjIpKQorI2RlZmluZSBOTE1fb3duZXJfc3oJCSgxKyhOTE1DTE5UX09IU0laRT4+MikpCisjZGVmaW5lIE5MTV9maGFuZGxlX3N6CQkoMSsoTkZTMl9GSFNJWkU+PjIpKQorI2RlZmluZSBOTE1fbG9ja19zegkJKDMrTkxNX2NhbGxlcl9zeitOTE1fb3duZXJfc3orTkxNX2ZoYW5kbGVfc3opCisjZGVmaW5lIE5MTV9ob2xkZXJfc3oJCSg0K05MTV9vd25lcl9zeikKKworI2RlZmluZSBOTE1fdGVzdGFyZ3Nfc3oJCShOTE1fY29va2llX3N6KzErTkxNX2xvY2tfc3opCisjZGVmaW5lIE5MTV9sb2NrYXJnc19zegkJKE5MTV9jb29raWVfc3orNCtOTE1fbG9ja19zeikKKyNkZWZpbmUgTkxNX2NhbmNhcmdzX3N6CQkoTkxNX2Nvb2tpZV9zeisyK05MTV9sb2NrX3N6KQorI2RlZmluZSBOTE1fdW5sb2NrYXJnc19zegkoTkxNX2Nvb2tpZV9zeitOTE1fbG9ja19zeikKKworI2RlZmluZSBOTE1fdGVzdHJlc19zegkJKE5MTV9jb29raWVfc3orMStOTE1faG9sZGVyX3N6KQorI2RlZmluZSBOTE1fcmVzX3N6CQkoTkxNX2Nvb2tpZV9zeisxKQorI2RlZmluZSBOTE1fbm9yZXBfc3oJCSgwKQorCisKK3N0YXRpYyBzMzIgbG9mZl90X3RvX3MzMihsb2ZmX3Qgb2Zmc2V0KQoreworCXMzMiByZXM7CisKKwlpZiAob2Zmc2V0ID49IE5MTV9PRkZTRVRfTUFYKQorCQlyZXMgPSBOTE1fT0ZGU0VUX01BWDsKKwllbHNlIGlmIChvZmZzZXQgPD0gLU5MTV9PRkZTRVRfTUFYKQorCQlyZXMgPSAtTkxNX09GRlNFVF9NQVg7CisJZWxzZQorCQlyZXMgPSBvZmZzZXQ7CisJcmV0dXJuIHJlczsKK30KKworc3RhdGljIHZvaWQgbmxtX2NvbXB1dGVfb2Zmc2V0cyhjb25zdCBzdHJ1Y3QgbmxtX2xvY2sgKmxvY2ssCisJCQkJdTMyICpsX29mZnNldCwgdTMyICpsX2xlbikKK3sKKwljb25zdCBzdHJ1Y3QgZmlsZV9sb2NrICpmbCA9ICZsb2NrLT5mbDsKKworCUJVR19PTihmbC0+Zmxfc3RhcnQgPiBOTE1fT0ZGU0VUX01BWCk7CisJQlVHX09OKGZsLT5mbF9lbmQgPiBOTE1fT0ZGU0VUX01BWCAmJgorCQkJCWZsLT5mbF9lbmQgIT0gT0ZGU0VUX01BWCk7CisKKwkqbF9vZmZzZXQgPSBsb2ZmX3RfdG9fczMyKGZsLT5mbF9zdGFydCk7CisJaWYgKGZsLT5mbF9lbmQgPT0gT0ZGU0VUX01BWCkKKwkJKmxfbGVuID0gMDsKKwllbHNlCisJCSpsX2xlbiA9IGxvZmZfdF90b19zMzIoZmwtPmZsX2VuZCAtIGZsLT5mbF9zdGFydCArIDEpOworfQorCisvKgorICogSGFuZGxlIGRlY29kZSBidWZmZXIgb3ZlcmZsb3dzIG91dC1vZi1saW5lLgorICovCitzdGF0aWMgdm9pZCBwcmludF9vdmVyZmxvd19tc2coY29uc3QgY2hhciAqZnVuYywgY29uc3Qgc3RydWN0IHhkcl9zdHJlYW0gKnhkcikKK3sKKwlkcHJpbnRrKCJsb2NrZDogJXMgcHJlbWF0dXJlbHkgaGl0IHRoZSBlbmQgb2Ygb3VyIHJlY2VpdmUgYnVmZmVyLiAiCisJCSJSZW1haW5pbmcgYnVmZmVyIGxlbmd0aCBpcyAldHUgd29yZHMuXG4iLAorCQlmdW5jLCB4ZHItPmVuZCAtIHhkci0+cCk7Cit9CisKKworLyoKKyAqIEVuY29kZS9kZWNvZGUgTkxNdjMgYmFzaWMgZGF0YSB0eXBlcworICoKKyAqIEJhc2ljIE5MTXYzIGRhdGEgdHlwZXMgYXJlIG5vdCBkZWZpbmVkIGluIGFuIElFVEYgc3RhbmRhcmRzCisgKiBkb2N1bWVudC4gIFgvT3BlbiBoYXMgYSBkZXNjcmlwdGlvbiBvZiB0aGVzZSBkYXRhIHR5cGVzIHRoYXQKKyAqIGlzIHVzZWZ1bC4gIFNlZSBDaGFwdGVyIDEwIG9mICJQcm90b2NvbHMgZm9yIEludGVyd29ya2luZzoKKyAqIFhORlMsIFZlcnNpb24gM1ciLgorICoKKyAqIE5vdCBhbGwgYmFzaWMgZGF0YSB0eXBlcyBoYXZlIHRoZWlyIG93biBlbmNvZGluZyBhbmQgZGVjb2RpbmcKKyAqIGZ1bmN0aW9ucy4gIEZvciBydW4tdGltZSBlZmZpY2llbmN5LCBzb21lIGRhdGEgdHlwZXMgYXJlIGVuY29kZWQKKyAqIG9yIGRlY29kZWQgaW5saW5lLgorICovCisKK3N0YXRpYyB2b2lkIGVuY29kZV9ib29sKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIGNvbnN0IGludCB2YWx1ZSkKK3sKKwlfX2JlMzIgKnA7CisKKwlwID0geGRyX3Jlc2VydmVfc3BhY2UoeGRyLCA0KTsKKwkqcCA9IHZhbHVlID8geGRyX29uZSA6IHhkcl96ZXJvOworfQorCitzdGF0aWMgdm9pZCBlbmNvZGVfaW50MzIoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgY29uc3QgczMyIHZhbHVlKQoreworCV9fYmUzMiAqcDsKKworCXAgPSB4ZHJfcmVzZXJ2ZV9zcGFjZSh4ZHIsIDQpOworCSpwID0gY3B1X3RvX2JlMzIodmFsdWUpOworfQorCisvKgorICoJdHlwZWRlZiBvcGFxdWUgbmV0b2JqPE1BWE5FVE9CSl9TWj4KKyAqLworc3RhdGljIHZvaWQgZW5jb2RlX25ldG9iaihzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAorCQkJICBjb25zdCB1OCAqZGF0YSwgY29uc3QgdW5zaWduZWQgaW50IGxlbmd0aCkKK3sKKwlfX2JlMzIgKnA7CisKKwlCVUdfT04obGVuZ3RoID4gWERSX01BWF9ORVRPQkopOworCXAgPSB4ZHJfcmVzZXJ2ZV9zcGFjZSh4ZHIsIDQgKyBsZW5ndGgpOworCXhkcl9lbmNvZGVfb3BhcXVlKHAsIGRhdGEsIGxlbmd0aCk7Cit9CisKK3N0YXRpYyBpbnQgZGVjb2RlX25ldG9iaihzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAorCQkJIHN0cnVjdCB4ZHJfbmV0b2JqICpvYmopCit7CisJdTMyIGxlbmd0aDsKKwlfX2JlMzIgKnA7CisKKwlwID0geGRyX2lubGluZV9kZWNvZGUoeGRyLCA0KTsKKwlpZiAodW5saWtlbHkocCA9PSBOVUxMKSkKKwkJZ290byBvdXRfb3ZlcmZsb3c7CisJbGVuZ3RoID0gYmUzMl90b19jcHVwKHArKyk7CisJaWYgKHVubGlrZWx5KGxlbmd0aCA+IFhEUl9NQVhfTkVUT0JKKSkKKwkJZ290byBvdXRfc2l6ZTsKKwlvYmotPmxlbiA9IGxlbmd0aDsKKwlvYmotPmRhdGEgPSAodTggKilwOworCXJldHVybiAwOworb3V0X3NpemU6CisJZHByaW50aygiTkZTOiByZXR1cm5lZCBuZXRvYmogd2FzIHRvbyBsb25nOiAldVxuIiwgbGVuZ3RoKTsKKwlyZXR1cm4gLUVJTzsKK291dF9vdmVyZmxvdzoKKwlwcmludF9vdmVyZmxvd19tc2coX19mdW5jX18sIHhkcik7CisJcmV0dXJuIC1FSU87Cit9CisKKy8qCisgKgluZXRvYmogY29va2llOworICovCitzdGF0aWMgdm9pZCBlbmNvZGVfY29va2llKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCisJCQkgIGNvbnN0IHN0cnVjdCBubG1fY29va2llICpjb29raWUpCit7CisJQlVHX09OKGNvb2tpZS0+bGVuID4gTkxNX01BWENPT0tJRUxFTik7CisJZW5jb2RlX25ldG9iaih4ZHIsICh1OCAqKSZjb29raWUtPmRhdGEsIGNvb2tpZS0+bGVuKTsKK30KKworc3RhdGljIGludCBkZWNvZGVfY29va2llKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCisJCQkgc3RydWN0IG5sbV9jb29raWUgKmNvb2tpZSkKK3sKKwl1MzIgbGVuZ3RoOworCV9fYmUzMiAqcDsKKworCXAgPSB4ZHJfaW5saW5lX2RlY29kZSh4ZHIsIDQpOworCWlmICh1bmxpa2VseShwID09IE5VTEwpKQorCQlnb3RvIG91dF9vdmVyZmxvdzsKKwlsZW5ndGggPSBiZTMyX3RvX2NwdXAocCsrKTsKKwkvKiBhcHBhcmVudGx5IEhQVVggY2FuIHJldHVybiBlbXB0eSBjb29raWVzICovCisJaWYgKGxlbmd0aCA9PSAwKQorCQlnb3RvIG91dF9ocHV4OworCWlmIChsZW5ndGggPiBOTE1fTUFYQ09PS0lFTEVOKQorCQlnb3RvIG91dF9zaXplOworCXAgPSB4ZHJfaW5saW5lX2RlY29kZSh4ZHIsIGxlbmd0aCk7CisJaWYgKHVubGlrZWx5KHAgPT0gTlVMTCkpCisJCWdvdG8gb3V0X292ZXJmbG93OworCWNvb2tpZS0+bGVuID0gbGVuZ3RoOworCW1lbWNweShjb29raWUtPmRhdGEsIHAsIGxlbmd0aCk7CisJcmV0dXJuIDA7CitvdXRfaHB1eDoKKwljb29raWUtPmxlbiA9IDQ7CisJbWVtc2V0KGNvb2tpZS0+ZGF0YSwgMCwgNCk7CisJcmV0dXJuIDA7CitvdXRfc2l6ZToKKwlkcHJpbnRrKCJORlM6IHJldHVybmVkIGNvb2tpZSB3YXMgdG9vIGxvbmc6ICV1XG4iLCBsZW5ndGgpOworCXJldHVybiAtRUlPOworb3V0X292ZXJmbG93OgorCXByaW50X292ZXJmbG93X21zZyhfX2Z1bmNfXywgeGRyKTsKKwlyZXR1cm4gLUVJTzsKK30KKworLyoKKyAqCW5ldG9iaiBmaDsKKyAqLworc3RhdGljIHZvaWQgZW5jb2RlX2ZoKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIGNvbnN0IHN0cnVjdCBuZnNfZmggKmZoKQoreworCUJVR19PTihmaC0+c2l6ZSAhPSBORlMyX0ZIU0laRSk7CisJZW5jb2RlX25ldG9iaih4ZHIsICh1OCAqKSZmaC0+ZGF0YSwgTkZTMl9GSFNJWkUpOworfQorCisvKgorICoJZW51bSBubG1fc3RhdHMgeworICoJCUxDS19HUkFOVEVEID0gMCwKKyAqCQlMQ0tfREVOSUVEID0gMSwKKyAqCQlMQ0tfREVOSUVEX05PTE9DS1MgPSAyLAorICoJCUxDS19CTE9DS0VEID0gMywKKyAqCQlMQ0tfREVOSUVEX0dSQUNFX1BFUklPRCA9IDQKKyAqCX07CisgKgorICoKKyAqCXN0cnVjdCBubG1fc3RhdCB7CisgKgkJbmxtX3N0YXRzIHN0YXQ7CisgKgl9OworICoKKyAqIE5COiB3ZSBkb24ndCBzd2FwIGJ5dGVzIGZvciB0aGUgTkxNIHN0YXR1cyB2YWx1ZXMuICBUaGUgdXBwZXIKKyAqIGxheWVycyBkZWFsIGRpcmVjdGx5IHdpdGggdGhlIHN0YXR1cyB2YWx1ZSBpbiBuZXR3b3JrIGJ5dGUKKyAqIG9yZGVyLgorICovCisKK3N0YXRpYyB2b2lkIGVuY29kZV9ubG1fc3RhdChzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAorCQkJICAgIGNvbnN0IF9fYmUzMiBzdGF0KQoreworCV9fYmUzMiAqcDsKKworCUJVR19PTihiZTMyX3RvX2NwdShzdGF0KSA+IE5MTV9MQ0tfREVOSUVEX0dSQUNFX1BFUklPRCk7CisJcCA9IHhkcl9yZXNlcnZlX3NwYWNlKHhkciwgNCk7CisJKnAgPSBzdGF0OworfQorCitzdGF0aWMgaW50IGRlY29kZV9ubG1fc3RhdChzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAorCQkJICAgX19iZTMyICpzdGF0KQoreworCV9fYmUzMiAqcDsKKworCXAgPSB4ZHJfaW5saW5lX2RlY29kZSh4ZHIsIDQpOworCWlmICh1bmxpa2VseShwID09IE5VTEwpKQorCQlnb3RvIG91dF9vdmVyZmxvdzsKKwlpZiAodW5saWtlbHkoKnAgPiBubG1fbGNrX2RlbmllZF9ncmFjZV9wZXJpb2QpKQorCQlnb3RvIG91dF9lbnVtOworCSpzdGF0ID0gKnA7CisJcmV0dXJuIDA7CitvdXRfZW51bToKKwlkcHJpbnRrKCIlczogc2VydmVyIHJldHVybmVkIGludmFsaWQgbmxtX3N0YXRzIHZhbHVlOiAldVxuIiwKKwkJX19mdW5jX18sIGJlMzJfdG9fY3B1cChwKSk7CisJcmV0dXJuIC1FSU87CitvdXRfb3ZlcmZsb3c6CisJcHJpbnRfb3ZlcmZsb3dfbXNnKF9fZnVuY19fLCB4ZHIpOworCXJldHVybiAtRUlPOworfQorCisvKgorICoJc3RydWN0IG5sbV9ob2xkZXIgeworICoJCWJvb2wgZXhjbHVzaXZlOworICoJCWludCB1cHBpZDsKKyAqCQluZXRvYmogb2g7CisgKgkJdW5zaWduZWQgbF9vZmZzZXQ7CisgKgkJdW5zaWduZWQgbF9sZW47CisgKgl9OworICovCitzdGF0aWMgdm9pZCBlbmNvZGVfbmxtX2hvbGRlcihzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAorCQkJICAgICAgY29uc3Qgc3RydWN0IG5sbV9yZXMgKnJlc3VsdCkKK3sKKwljb25zdCBzdHJ1Y3QgbmxtX2xvY2sgKmxvY2sgPSAmcmVzdWx0LT5sb2NrOworCXUzMiBsX29mZnNldCwgbF9sZW47CisJX19iZTMyICpwOworCisJZW5jb2RlX2Jvb2woeGRyLCBsb2NrLT5mbC5mbF90eXBlID09IEZfUkRMQ0spOworCWVuY29kZV9pbnQzMih4ZHIsIGxvY2stPnN2aWQpOworCWVuY29kZV9uZXRvYmooeGRyLCBsb2NrLT5vaC5kYXRhLCBsb2NrLT5vaC5sZW4pOworCisJcCA9IHhkcl9yZXNlcnZlX3NwYWNlKHhkciwgNCArIDQpOworCW5sbV9jb21wdXRlX29mZnNldHMobG9jaywgJmxfb2Zmc2V0LCAmbF9sZW4pOworCSpwKysgPSBjcHVfdG9fYmUzMihsX29mZnNldCk7CisJKnAgICA9IGNwdV90b19iZTMyKGxfbGVuKTsKK30KKworc3RhdGljIGludCBkZWNvZGVfbmxtX2hvbGRlcihzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBzdHJ1Y3QgbmxtX3JlcyAqcmVzdWx0KQoreworCXN0cnVjdCBubG1fbG9jayAqbG9jayA9ICZyZXN1bHQtPmxvY2s7CisJc3RydWN0IGZpbGVfbG9jayAqZmwgPSAmbG9jay0+Zmw7CisJdTMyIGV4Y2x1c2l2ZSwgbF9vZmZzZXQsIGxfbGVuOworCWludCBlcnJvcjsKKwlfX2JlMzIgKnA7CisJczMyIGVuZDsKKworCW1lbXNldChsb2NrLCAwLCBzaXplb2YoKmxvY2spKTsKKwlsb2Nrc19pbml0X2xvY2soZmwpOworCisJcCA9IHhkcl9pbmxpbmVfZGVjb2RlKHhkciwgNCArIDQpOworCWlmICh1bmxpa2VseShwID09IE5VTEwpKQorCQlnb3RvIG91dF9vdmVyZmxvdzsKKwlleGNsdXNpdmUgPSBiZTMyX3RvX2NwdXAocCsrKTsKKwlsb2NrLT5zdmlkID0gYmUzMl90b19jcHVwKHApOworCWZsLT5mbF9waWQgPSAocGlkX3QpbG9jay0+c3ZpZDsKKworCWVycm9yID0gZGVjb2RlX25ldG9iaih4ZHIsICZsb2NrLT5vaCk7CisJaWYgKHVubGlrZWx5KGVycm9yKSkKKwkJZ290byBvdXQ7CisKKwlwID0geGRyX2lubGluZV9kZWNvZGUoeGRyLCA0ICsgNCk7CisJaWYgKHVubGlrZWx5KHAgPT0gTlVMTCkpCisJCWdvdG8gb3V0X292ZXJmbG93OworCisJZmwtPmZsX2ZsYWdzID0gRkxfUE9TSVg7CisJZmwtPmZsX3R5cGUgID0gZXhjbHVzaXZlICE9IDAgPyBGX1dSTENLIDogRl9SRExDSzsKKwlsX29mZnNldCA9IGJlMzJfdG9fY3B1cChwKyspOworCWxfbGVuID0gYmUzMl90b19jcHVwKHApOworCWVuZCA9IGxfb2Zmc2V0ICsgbF9sZW4gLSAxOworCisJZmwtPmZsX3N0YXJ0ID0gKGxvZmZfdClsX29mZnNldDsKKwlpZiAobF9sZW4gPT0gMCB8fCBlbmQgPCAwKQorCQlmbC0+ZmxfZW5kID0gT0ZGU0VUX01BWDsKKwllbHNlCisJCWZsLT5mbF9lbmQgPSAobG9mZl90KWVuZDsKKwllcnJvciA9IDA7CitvdXQ6CisJcmV0dXJuIGVycm9yOworb3V0X292ZXJmbG93OgorCXByaW50X292ZXJmbG93X21zZyhfX2Z1bmNfXywgeGRyKTsKKwlyZXR1cm4gLUVJTzsKK30KKworLyoKKyAqCXN0cmluZyBjYWxsZXJfbmFtZTxMTV9NQVhTVFJMRU4+OworICovCitzdGF0aWMgdm9pZCBlbmNvZGVfY2FsbGVyX25hbWUoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgY29uc3QgY2hhciAqbmFtZSkKK3sKKwkvKiBOQjogY2xpZW50LXNpZGUgZG9lcyBub3Qgc2V0IGxvY2stPmxlbiAqLworCXUzMiBsZW5ndGggPSBzdHJsZW4obmFtZSk7CisJX19iZTMyICpwOworCisJQlVHX09OKGxlbmd0aCA+IE5MTV9NQVhTVFJMRU4pOworCXAgPSB4ZHJfcmVzZXJ2ZV9zcGFjZSh4ZHIsIDQgKyBsZW5ndGgpOworCXhkcl9lbmNvZGVfb3BhcXVlKHAsIG5hbWUsIGxlbmd0aCk7Cit9CisKKy8qCisgKglzdHJ1Y3QgbmxtX2xvY2sgeworICoJCXN0cmluZyBjYWxsZXJfbmFtZTxMTV9NQVhTVFJMRU4+OworICoJCW5ldG9iaiBmaDsKKyAqCQluZXRvYmogb2g7CisgKgkJaW50IHVwcGlkOworICoJCXVuc2lnbmVkIGxfb2Zmc2V0OworICoJCXVuc2lnbmVkIGxfbGVuOworICoJfTsKKyAqLworc3RhdGljIHZvaWQgZW5jb2RlX25sbV9sb2NrKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCisJCQkgICAgY29uc3Qgc3RydWN0IG5sbV9sb2NrICpsb2NrKQoreworCXUzMiBsX29mZnNldCwgbF9sZW47CisJX19iZTMyICpwOworCisJZW5jb2RlX2NhbGxlcl9uYW1lKHhkciwgbG9jay0+Y2FsbGVyKTsKKwllbmNvZGVfZmgoeGRyLCAmbG9jay0+ZmgpOworCWVuY29kZV9uZXRvYmooeGRyLCBsb2NrLT5vaC5kYXRhLCBsb2NrLT5vaC5sZW4pOworCisJcCA9IHhkcl9yZXNlcnZlX3NwYWNlKHhkciwgNCArIDQgKyA0KTsKKwkqcCsrID0gY3B1X3RvX2JlMzIobG9jay0+c3ZpZCk7CisKKwlubG1fY29tcHV0ZV9vZmZzZXRzKGxvY2ssICZsX29mZnNldCwgJmxfbGVuKTsKKwkqcCsrID0gY3B1X3RvX2JlMzIobF9vZmZzZXQpOworCSpwICAgPSBjcHVfdG9fYmUzMihsX2xlbik7Cit9CisKKworLyoKKyAqIE5MTXYzIFhEUiBlbmNvZGUgZnVuY3Rpb25zCisgKgorICogTkxNdjMgYXJndW1lbnQgdHlwZXMgYXJlIGRlZmluZWQgaW4gQ2hhcHRlciAxMCBvZiBUaGUgT3BlbiBHcm91cCdzCisgKiAiUHJvdG9jb2xzIGZvciBJbnRlcndvcmtpbmc6IFhORlMsIFZlcnNpb24gM1ciLgorICovCisKKy8qCisgKglzdHJ1Y3QgbmxtX3Rlc3RhcmdzIHsKKyAqCQluZXRvYmogY29va2llOworICoJCWJvb2wgZXhjbHVzaXZlOworICoJCXN0cnVjdCBubG1fbG9jayBhbG9jazsKKyAqCX07CisgKi8KK3N0YXRpYyB2b2lkIG5sbV94ZHJfZW5jX3Rlc3RhcmdzKHN0cnVjdCBycGNfcnFzdCAqcmVxLAorCQkJCSBzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAorCQkJCSBjb25zdCBzdHJ1Y3QgbmxtX2FyZ3MgKmFyZ3MpCit7CisJY29uc3Qgc3RydWN0IG5sbV9sb2NrICpsb2NrID0gJmFyZ3MtPmxvY2s7CisKKwllbmNvZGVfY29va2llKHhkciwgJmFyZ3MtPmNvb2tpZSk7CisJZW5jb2RlX2Jvb2woeGRyLCBsb2NrLT5mbC5mbF90eXBlID09IEZfV1JMQ0spOworCWVuY29kZV9ubG1fbG9jayh4ZHIsIGxvY2spOworfQorCisvKgorICoJc3RydWN0IG5sbV9sb2NrYXJncyB7CisgKgkJbmV0b2JqIGNvb2tpZTsKKyAqCQlib29sIGJsb2NrOworICoJCWJvb2wgZXhjbHVzaXZlOworICoJCXN0cnVjdCBubG1fbG9jayBhbG9jazsKKyAqCQlib29sIHJlY2xhaW07CisgKgkJaW50IHN0YXRlOworICoJfTsKKyAqLworc3RhdGljIHZvaWQgbmxtX3hkcl9lbmNfbG9ja2FyZ3Moc3RydWN0IHJwY19ycXN0ICpyZXEsCisJCQkJIHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCisJCQkJIGNvbnN0IHN0cnVjdCBubG1fYXJncyAqYXJncykKK3sKKwljb25zdCBzdHJ1Y3QgbmxtX2xvY2sgKmxvY2sgPSAmYXJncy0+bG9jazsKKworCWVuY29kZV9jb29raWUoeGRyLCAmYXJncy0+Y29va2llKTsKKwllbmNvZGVfYm9vbCh4ZHIsIGFyZ3MtPmJsb2NrKTsKKwllbmNvZGVfYm9vbCh4ZHIsIGxvY2stPmZsLmZsX3R5cGUgPT0gRl9XUkxDSyk7CisJZW5jb2RlX25sbV9sb2NrKHhkciwgbG9jayk7CisJZW5jb2RlX2Jvb2woeGRyLCBhcmdzLT5yZWNsYWltKTsKKwllbmNvZGVfaW50MzIoeGRyLCBhcmdzLT5zdGF0ZSk7Cit9CisKKy8qCisgKglzdHJ1Y3QgbmxtX2NhbmNhcmdzIHsKKyAqCQluZXRvYmogY29va2llOworICoJCWJvb2wgYmxvY2s7CisgKgkJYm9vbCBleGNsdXNpdmU7CisgKgkJc3RydWN0IG5sbV9sb2NrIGFsb2NrOworICoJfTsKKyAqLworc3RhdGljIHZvaWQgbmxtX3hkcl9lbmNfY2FuY2FyZ3Moc3RydWN0IHJwY19ycXN0ICpyZXEsCisJCQkJIHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCisJCQkJIGNvbnN0IHN0cnVjdCBubG1fYXJncyAqYXJncykKK3sKKwljb25zdCBzdHJ1Y3QgbmxtX2xvY2sgKmxvY2sgPSAmYXJncy0+bG9jazsKKworCWVuY29kZV9jb29raWUoeGRyLCAmYXJncy0+Y29va2llKTsKKwllbmNvZGVfYm9vbCh4ZHIsIGFyZ3MtPmJsb2NrKTsKKwllbmNvZGVfYm9vbCh4ZHIsIGxvY2stPmZsLmZsX3R5cGUgPT0gRl9XUkxDSyk7CisJZW5jb2RlX25sbV9sb2NrKHhkciwgbG9jayk7Cit9CisKKy8qCisgKglzdHJ1Y3QgbmxtX3VubG9ja2FyZ3MgeworICoJCW5ldG9iaiBjb29raWU7CisgKgkJc3RydWN0IG5sbV9sb2NrIGFsb2NrOworICoJfTsKKyAqLworc3RhdGljIHZvaWQgbmxtX3hkcl9lbmNfdW5sb2NrYXJncyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwKKwkJCQkgICBzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAorCQkJCSAgIGNvbnN0IHN0cnVjdCBubG1fYXJncyAqYXJncykKK3sKKwljb25zdCBzdHJ1Y3QgbmxtX2xvY2sgKmxvY2sgPSAmYXJncy0+bG9jazsKKworCWVuY29kZV9jb29raWUoeGRyLCAmYXJncy0+Y29va2llKTsKKwllbmNvZGVfbmxtX2xvY2soeGRyLCBsb2NrKTsKK30KKworLyoKKyAqCXN0cnVjdCBubG1fcmVzIHsKKyAqCQluZXRvYmogY29va2llOworICoJCW5sbV9zdGF0IHN0YXQ7CisgKgl9OworICovCitzdGF0aWMgdm9pZCBubG1feGRyX2VuY19yZXMoc3RydWN0IHJwY19ycXN0ICpyZXEsCisJCQkgICAgc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKKwkJCSAgICBjb25zdCBzdHJ1Y3QgbmxtX3JlcyAqcmVzdWx0KQoreworCWVuY29kZV9jb29raWUoeGRyLCAmcmVzdWx0LT5jb29raWUpOworCWVuY29kZV9ubG1fc3RhdCh4ZHIsIHJlc3VsdC0+c3RhdHVzKTsKK30KKworLyoKKyAqCXVuaW9uIG5sbV90ZXN0cnBseSBzd2l0Y2ggKG5sbV9zdGF0cyBzdGF0KSB7CisgKgljYXNlIExDS19ERU5JRUQ6CisgKgkJc3RydWN0IG5sbV9ob2xkZXIgaG9sZGVyOworICoJZGVmYXVsdDoKKyAqCQl2b2lkOworICoJfTsKKyAqCisgKglzdHJ1Y3QgbmxtX3Rlc3RyZXMgeworICoJCW5ldG9iaiBjb29raWU7CisgKgkJbmxtX3Rlc3RycGx5IHRlc3Rfc3RhdDsKKyAqCX07CisgKi8KK3N0YXRpYyB2b2lkIGVuY29kZV9ubG1fdGVzdHJwbHkoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKKwkJCQljb25zdCBzdHJ1Y3QgbmxtX3JlcyAqcmVzdWx0KQoreworCWlmIChyZXN1bHQtPnN0YXR1cyA9PSBubG1fbGNrX2RlbmllZCkKKwkJZW5jb2RlX25sbV9ob2xkZXIoeGRyLCByZXN1bHQpOworfQorCitzdGF0aWMgdm9pZCBubG1feGRyX2VuY190ZXN0cmVzKHN0cnVjdCBycGNfcnFzdCAqcmVxLAorCQkJCXN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCisJCQkJY29uc3Qgc3RydWN0IG5sbV9yZXMgKnJlc3VsdCkKK3sKKwllbmNvZGVfY29va2llKHhkciwgJnJlc3VsdC0+Y29va2llKTsKKwllbmNvZGVfbmxtX3N0YXQoeGRyLCByZXN1bHQtPnN0YXR1cyk7CisJZW5jb2RlX25sbV90ZXN0cnBseSh4ZHIsIHJlc3VsdCk7Cit9CisKKworLyoKKyAqIE5MTXYzIFhEUiBkZWNvZGUgZnVuY3Rpb25zCisgKgorICogTkxNdjMgcmVzdWx0IHR5cGVzIGFyZSBkZWZpbmVkIGluIENoYXB0ZXIgMTAgb2YgVGhlIE9wZW4gR3JvdXAncworICogIlByb3RvY29scyBmb3IgSW50ZXJ3b3JraW5nOiBYTkZTLCBWZXJzaW9uIDNXIi4KKyAqLworCisvKgorICoJdW5pb24gbmxtX3Rlc3RycGx5IHN3aXRjaCAobmxtX3N0YXRzIHN0YXQpIHsKKyAqCWNhc2UgTENLX0RFTklFRDoKKyAqCQlzdHJ1Y3QgbmxtX2hvbGRlciBob2xkZXI7CisgKglkZWZhdWx0OgorICoJCXZvaWQ7CisgKgl9OworICoKKyAqCXN0cnVjdCBubG1fdGVzdHJlcyB7CisgKgkJbmV0b2JqIGNvb2tpZTsKKyAqCQlubG1fdGVzdHJwbHkgdGVzdF9zdGF0OworICoJfTsKKyAqLworc3RhdGljIGludCBkZWNvZGVfbmxtX3Rlc3RycGx5KHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCisJCQkgICAgICAgc3RydWN0IG5sbV9yZXMgKnJlc3VsdCkKK3sKKwlpbnQgZXJyb3I7CisKKwllcnJvciA9IGRlY29kZV9ubG1fc3RhdCh4ZHIsICZyZXN1bHQtPnN0YXR1cyk7CisJaWYgKHVubGlrZWx5KGVycm9yKSkKKwkJZ290byBvdXQ7CisJaWYgKHJlc3VsdC0+c3RhdHVzID09IG5sbV9sY2tfZGVuaWVkKQorCQllcnJvciA9IGRlY29kZV9ubG1faG9sZGVyKHhkciwgcmVzdWx0KTsKK291dDoKKwlyZXR1cm4gZXJyb3I7Cit9CisKK3N0YXRpYyBpbnQgbmxtX3hkcl9kZWNfdGVzdHJlcyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwKKwkJCSAgICAgICBzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAorCQkJICAgICAgIHN0cnVjdCBubG1fcmVzICpyZXN1bHQpCit7CisJaW50IGVycm9yOworCisJZXJyb3IgPSBkZWNvZGVfY29va2llKHhkciwgJnJlc3VsdC0+Y29va2llKTsKKwlpZiAodW5saWtlbHkoZXJyb3IpKQorCQlnb3RvIG91dDsKKwllcnJvciA9IGRlY29kZV9ubG1fdGVzdHJwbHkoeGRyLCByZXN1bHQpOworb3V0OgorCXJldHVybiBlcnJvcjsKK30KKworLyoKKyAqCXN0cnVjdCBubG1fcmVzIHsKKyAqCQluZXRvYmogY29va2llOworICoJCW5sbV9zdGF0IHN0YXQ7CisgKgl9OworICovCitzdGF0aWMgaW50IG5sbV94ZHJfZGVjX3JlcyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwKKwkJCSAgIHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCisJCQkgICBzdHJ1Y3QgbmxtX3JlcyAqcmVzdWx0KQoreworCWludCBlcnJvcjsKKworCWVycm9yID0gZGVjb2RlX2Nvb2tpZSh4ZHIsICZyZXN1bHQtPmNvb2tpZSk7CisJaWYgKHVubGlrZWx5KGVycm9yKSkKKwkJZ290byBvdXQ7CisJZXJyb3IgPSBkZWNvZGVfbmxtX3N0YXQoeGRyLCAmcmVzdWx0LT5zdGF0dXMpOworb3V0OgorCXJldHVybiBlcnJvcjsKK30KKworCisvKgorICogRm9yIE5MTSwgYSB2b2lkIHByb2NlZHVyZSByZWFsbHkgcmV0dXJucyBub3RoaW5nCisgKi8KKyNkZWZpbmUgbmxtX3hkcl9kZWNfbm9yZXAJTlVMTAorCisjZGVmaW5lIFBST0MocHJvYywgYXJndHlwZSwgcmVzdHlwZSkJXAorW05MTVBST0NfIyNwcm9jXSA9IHsJCQkJCQkJXAorCS5wX3Byb2MgICAgICA9IE5MTVBST0NfIyNwcm9jLAkJCQkJXAorCS5wX2VuY29kZSAgICA9IChreGRyZXByb2NfdClubG1feGRyX2VuY18jI2FyZ3R5cGUsCQlcCisJLnBfZGVjb2RlICAgID0gKGt4ZHJkcHJvY190KW5sbV94ZHJfZGVjXyMjcmVzdHlwZSwJCVwKKwkucF9hcmdsZW4gICAgPSBOTE1fIyNhcmd0eXBlIyNfc3osCQkJCVwKKwkucF9yZXBsZW4gICAgPSBOTE1fIyNyZXN0eXBlIyNfc3osCQkJCVwKKwkucF9zdGF0aWR4ICAgPSBOTE1QUk9DXyMjcHJvYywJCQkJCVwKKwkucF9uYW1lICAgICAgPSAjcHJvYywJCQkJCQlcCisJfQorCitzdGF0aWMgc3RydWN0IHJwY19wcm9jaW5mbwlubG1fcHJvY2VkdXJlc1tdID0geworCVBST0MoVEVTVCwJCXRlc3RhcmdzLAl0ZXN0cmVzKSwKKwlQUk9DKExPQ0ssCQlsb2NrYXJncywJcmVzKSwKKwlQUk9DKENBTkNFTCwJCWNhbmNhcmdzLAlyZXMpLAorCVBST0MoVU5MT0NLLAkJdW5sb2NrYXJncywJcmVzKSwKKwlQUk9DKEdSQU5URUQsCQl0ZXN0YXJncywJcmVzKSwKKwlQUk9DKFRFU1RfTVNHLAkJdGVzdGFyZ3MsCW5vcmVwKSwKKwlQUk9DKExPQ0tfTVNHLAkJbG9ja2FyZ3MsCW5vcmVwKSwKKwlQUk9DKENBTkNFTF9NU0csCWNhbmNhcmdzLAlub3JlcCksCisJUFJPQyhVTkxPQ0tfTVNHLAl1bmxvY2thcmdzLAlub3JlcCksCisJUFJPQyhHUkFOVEVEX01TRywJdGVzdGFyZ3MsCW5vcmVwKSwKKwlQUk9DKFRFU1RfUkVTLAkJdGVzdHJlcywJbm9yZXApLAorCVBST0MoTE9DS19SRVMsCQlyZXMsCQlub3JlcCksCisJUFJPQyhDQU5DRUxfUkVTLAlyZXMsCQlub3JlcCksCisJUFJPQyhVTkxPQ0tfUkVTLAlyZXMsCQlub3JlcCksCisJUFJPQyhHUkFOVEVEX1JFUywJcmVzLAkJbm9yZXApLAorfTsKKworc3RhdGljIHN0cnVjdCBycGNfdmVyc2lvbglubG1fdmVyc2lvbjEgPSB7CisJCS5udW1iZXIJCT0gMSwKKwkJLm5ycHJvY3MJPSBBUlJBWV9TSVpFKG5sbV9wcm9jZWR1cmVzKSwKKwkJLnByb2NzCQk9IG5sbV9wcm9jZWR1cmVzLAorfTsKKworc3RhdGljIHN0cnVjdCBycGNfdmVyc2lvbglubG1fdmVyc2lvbjMgPSB7CisJCS5udW1iZXIJCT0gMywKKwkJLm5ycHJvY3MJPSBBUlJBWV9TSVpFKG5sbV9wcm9jZWR1cmVzKSwKKwkJLnByb2NzCQk9IG5sbV9wcm9jZWR1cmVzLAorfTsKKworc3RhdGljIHN0cnVjdCBycGNfdmVyc2lvbgkqbmxtX3ZlcnNpb25zW10gPSB7CisJWzFdID0gJm5sbV92ZXJzaW9uMSwKKwlbM10gPSAmbmxtX3ZlcnNpb24zLAorI2lmZGVmIENPTkZJR19MT0NLRF9WNAorCVs0XSA9ICZubG1fdmVyc2lvbjQsCisjZW5kaWYKK307CisKK3N0YXRpYyBzdHJ1Y3QgcnBjX3N0YXQJCW5sbV9ycGNfc3RhdHM7CisKK3N0cnVjdCBycGNfcHJvZ3JhbQkJbmxtX3Byb2dyYW0gPSB7CisJCS5uYW1lCQk9ICJsb2NrZCIsCisJCS5udW1iZXIJCT0gTkxNX1BST0dSQU0sCisJCS5ucnZlcnMJCT0gQVJSQVlfU0laRShubG1fdmVyc2lvbnMpLAorCQkudmVyc2lvbgk9IG5sbV92ZXJzaW9ucywKKwkJLnN0YXRzCQk9ICZubG1fcnBjX3N0YXRzLAorfTsKZGlmZiAtLWdpdCBhL2ZzL2xvY2tkL2hvc3QuYyBiL2ZzL2xvY2tkL2hvc3QuYwppbmRleCBlZDBjNTlmLi41ZjFiY2IyIDEwMDY0NAotLS0gYS9mcy9sb2NrZC9ob3N0LmMKKysrIGIvZnMvbG9ja2QvaG9zdC5jCkBAIC0yNSw5ICsyNSwyMiBAQAogI2RlZmluZSBOTE1fSE9TVF9FWFBJUkUJCSgzMDAgKiBIWikKICNkZWZpbmUgTkxNX0hPU1RfQ09MTEVDVAkoMTIwICogSFopCiAKLXN0YXRpYyBzdHJ1Y3QgaGxpc3RfaGVhZAlubG1faG9zdHNbTkxNX0hPU1RfTlJIQVNIXTsKK3N0YXRpYyBzdHJ1Y3QgaGxpc3RfaGVhZAlubG1fc2VydmVyX2hvc3RzW05MTV9IT1NUX05SSEFTSF07CitzdGF0aWMgc3RydWN0IGhsaXN0X2hlYWQJbmxtX2NsaWVudF9ob3N0c1tOTE1fSE9TVF9OUkhBU0hdOworCisjZGVmaW5lIGZvcl9lYWNoX2hvc3QoaG9zdCwgcG9zLCBjaGFpbiwgdGFibGUpIFwKKwlmb3IgKChjaGFpbikgPSAodGFibGUpOyBcCisJICAgICAoY2hhaW4pIDwgKHRhYmxlKSArIE5MTV9IT1NUX05SSEFTSDsgKysoY2hhaW4pKSBcCisJCWhsaXN0X2Zvcl9lYWNoX2VudHJ5KChob3N0KSwgKHBvcyksIChjaGFpbiksIGhfaGFzaCkKKworI2RlZmluZSBmb3JfZWFjaF9ob3N0X3NhZmUoaG9zdCwgcG9zLCBuZXh0LCBjaGFpbiwgdGFibGUpIFwKKwlmb3IgKChjaGFpbikgPSAodGFibGUpOyBcCisJICAgICAoY2hhaW4pIDwgKHRhYmxlKSArIE5MTV9IT1NUX05SSEFTSDsgKysoY2hhaW4pKSBcCisJCWhsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoKGhvc3QpLCAocG9zKSwgKG5leHQpLCBcCisJCQkJCQkoY2hhaW4pLCBoX2hhc2gpCisKIHN0YXRpYyB1bnNpZ25lZCBsb25nCQluZXh0X2djOwotc3RhdGljIGludAkJCW5yaG9zdHM7CitzdGF0aWMgdW5zaWduZWQgbG9uZwkJbnJob3N0czsKIHN0YXRpYyBERUZJTkVfTVVURVgobmxtX2hvc3RfbXV0ZXgpOwogCiBzdGF0aWMgdm9pZAkJCW5sbV9nY19ob3N0cyh2b2lkKTsKQEAgLTQwLDggKzUzLDYgQEAKIAljb25zdCB1MzIJCXZlcnNpb247CS8qIE5MTSB2ZXJzaW9uIHRvIHNlYXJjaCBmb3IgKi8KIAljb25zdCBjaGFyCQkqaG9zdG5hbWU7CS8qIHJlbW90ZSdzIGhvc3RuYW1lICovCiAJY29uc3Qgc2l6ZV90CQlob3N0bmFtZV9sZW47CS8qIGl0J3MgbGVuZ3RoICovCi0JY29uc3Qgc3RydWN0IHNvY2thZGRyCSpzcmNfc2FwOwkvKiBvdXIgYWRkcmVzcyAob3B0aW9uYWwpICovCi0JY29uc3Qgc2l6ZV90CQlzcmNfbGVuOwkvKiBpdCdzIGxlbmd0aCAqLwogCWNvbnN0IGludAkJbm9yZXN2cG9ydDsJLyogdXNlIG5vbi1wcml2IHBvcnQgKi8KIH07CiAKQEAgLTg4LDEyNyArOTksODMgQEAKIH0KIAogLyoKLSAqIENvbW1vbiBob3N0IGxvb2t1cCByb3V0aW5lIGZvciBzZXJ2ZXIgJiBjbGllbnQKKyAqIEFsbG9jYXRlIGFuZCBpbml0aWFsaXplIGFuIG5sbV9ob3N0LiAgQ29tbW9uIHRvIGJvdGggY2xpZW50IGFuZCBzZXJ2ZXIuCiAgKi8KLXN0YXRpYyBzdHJ1Y3QgbmxtX2hvc3QgKm5sbV9sb29rdXBfaG9zdChzdHJ1Y3QgbmxtX2xvb2t1cF9ob3N0X2luZm8gKm5pKQorc3RhdGljIHN0cnVjdCBubG1faG9zdCAqbmxtX2FsbG9jX2hvc3Qoc3RydWN0IG5sbV9sb29rdXBfaG9zdF9pbmZvICpuaSwKKwkJCQkgICAgICAgc3RydWN0IG5zbV9oYW5kbGUgKm5zbSkKIHsKLQlzdHJ1Y3QgaGxpc3RfaGVhZCAqY2hhaW47Ci0Jc3RydWN0IGhsaXN0X25vZGUgKnBvczsKLQlzdHJ1Y3QgbmxtX2hvc3QJKmhvc3Q7Ci0Jc3RydWN0IG5zbV9oYW5kbGUgKm5zbSA9IE5VTEw7CisJc3RydWN0IG5sbV9ob3N0ICpob3N0ID0gTlVMTDsKKwl1bnNpZ25lZCBsb25nIG5vdyA9IGppZmZpZXM7CiAKLQltdXRleF9sb2NrKCZubG1faG9zdF9tdXRleCk7Ci0KLQlpZiAodGltZV9hZnRlcl9lcShqaWZmaWVzLCBuZXh0X2djKSkKLQkJbmxtX2djX2hvc3RzKCk7Ci0KLQkvKiBXZSBtYXkga2VlcCBzZXZlcmFsIG5sbV9ob3N0IG9iamVjdHMgZm9yIGEgcGVlciwgYmVjYXVzZSBlYWNoCi0JICogbmxtX2hvc3QgaXMgaWRlbnRpZmllZCBieQotCSAqIChhZGRyZXNzLCBwcm90b2NvbCwgdmVyc2lvbiwgc2VydmVyL2NsaWVudCkKLQkgKiBXZSBjb3VsZCBwcm9iYWJseSBzaW1wbGlmeSB0aGlzIGEgbGl0dGxlIGJ5IHB1dHRpbmcgYWxsIHRob3NlCi0JICogZGlmZmVyZW50IE5MTSBycGNfY2xpZW50cyBpbnRvIG9uZSBzaW5nbGUgbmxtX2hvc3Qgb2JqZWN0LgotCSAqIFRoaXMgd291bGQgYWxsb3cgdXMgdG8gaGF2ZSBvbmUgbmxtX2hvc3QgcGVyIGFkZHJlc3MuCi0JICovCi0JY2hhaW4gPSAmbmxtX2hvc3RzW25sbV9oYXNoX2FkZHJlc3MobmktPnNhcCldOwotCWhsaXN0X2Zvcl9lYWNoX2VudHJ5KGhvc3QsIHBvcywgY2hhaW4sIGhfaGFzaCkgewotCQlpZiAoIXJwY19jbXBfYWRkcihubG1fYWRkcihob3N0KSwgbmktPnNhcCkpCi0JCQljb250aW51ZTsKLQotCQkvKiBTZWUgaWYgd2UgaGF2ZSBhbiBOU00gaGFuZGxlIGZvciB0aGlzIGNsaWVudCAqLwotCQlpZiAoIW5zbSkKLQkJCW5zbSA9IGhvc3QtPmhfbnNtaGFuZGxlOwotCi0JCWlmIChob3N0LT5oX3Byb3RvICE9IG5pLT5wcm90b2NvbCkKLQkJCWNvbnRpbnVlOwotCQlpZiAoaG9zdC0+aF92ZXJzaW9uICE9IG5pLT52ZXJzaW9uKQotCQkJY29udGludWU7Ci0JCWlmIChob3N0LT5oX3NlcnZlciAhPSBuaS0+c2VydmVyKQotCQkJY29udGludWU7Ci0JCWlmIChuaS0+c2VydmVyICYmIG5pLT5zcmNfbGVuICE9IDAgJiYKLQkJICAgICFycGNfY21wX2FkZHIobmxtX3NyY2FkZHIoaG9zdCksIG5pLT5zcmNfc2FwKSkKLQkJCWNvbnRpbnVlOwotCi0JCS8qIE1vdmUgdG8gaGVhZCBvZiBoYXNoIGNoYWluLiAqLwotCQlobGlzdF9kZWwoJmhvc3QtPmhfaGFzaCk7Ci0JCWhsaXN0X2FkZF9oZWFkKCZob3N0LT5oX2hhc2gsIGNoYWluKTsKLQotCQlubG1fZ2V0X2hvc3QoaG9zdCk7Ci0JCWRwcmludGsoImxvY2tkOiBubG1fbG9va3VwX2hvc3QgZm91bmQgaG9zdCAlcyAoJXMpXG4iLAotCQkJCWhvc3QtPmhfbmFtZSwgaG9zdC0+aF9hZGRyYnVmKTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JLyoKLQkgKiBUaGUgaG9zdCB3YXNuJ3QgaW4gb3VyIGhhc2ggdGFibGUuICBJZiB3ZSBkb24ndAotCSAqIGhhdmUgYW4gTlNNIGhhbmRsZSBmb3IgaXQgeWV0LCBjcmVhdGUgb25lLgotCSAqLwotCWlmIChuc20pCisJaWYgKG5zbSAhPSBOVUxMKQogCQlhdG9taWNfaW5jKCZuc20tPnNtX2NvdW50KTsKIAllbHNlIHsKIAkJaG9zdCA9IE5VTEw7CiAJCW5zbSA9IG5zbV9nZXRfaGFuZGxlKG5pLT5zYXAsIG5pLT5zYWxlbiwKIAkJCQkJbmktPmhvc3RuYW1lLCBuaS0+aG9zdG5hbWVfbGVuKTsKLQkJaWYgKCFuc20pIHsKLQkJCWRwcmludGsoImxvY2tkOiBubG1fbG9va3VwX2hvc3QgZmFpbGVkOyAiCi0JCQkJIm5vIG5zbSBoYW5kbGVcbiIpOworCQlpZiAodW5saWtlbHkobnNtID09IE5VTEwpKSB7CisJCQlkcHJpbnRrKCJsb2NrZDogJXMgZmFpbGVkOyBubyBuc20gaGFuZGxlXG4iLAorCQkJCV9fZnVuY19fKTsKIAkJCWdvdG8gb3V0OwogCQl9CiAJfQogCi0JaG9zdCA9IGt6YWxsb2Moc2l6ZW9mKCpob3N0KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFob3N0KSB7CisJaG9zdCA9IGttYWxsb2Moc2l6ZW9mKCpob3N0KSwgR0ZQX0tFUk5FTCk7CisJaWYgKHVubGlrZWx5KGhvc3QgPT0gTlVMTCkpIHsKKwkJZHByaW50aygibG9ja2Q6ICVzIGZhaWxlZDsgbm8gbWVtb3J5XG4iLCBfX2Z1bmNfXyk7CiAJCW5zbV9yZWxlYXNlKG5zbSk7Ci0JCWRwcmludGsoImxvY2tkOiBubG1fbG9va3VwX2hvc3QgZmFpbGVkOyBubyBtZW1vcnlcbiIpOwogCQlnb3RvIG91dDsKIAl9Ci0JaG9zdC0+aF9uYW1lCSAgID0gbnNtLT5zbV9uYW1lOwotCWhvc3QtPmhfYWRkcmJ1ZiAgICA9IG5zbS0+c21fYWRkcmJ1ZjsKKwogCW1lbWNweShubG1fYWRkcihob3N0KSwgbmktPnNhcCwgbmktPnNhbGVuKTsKLQlob3N0LT5oX2FkZHJsZW4gPSBuaS0+c2FsZW47CisJaG9zdC0+aF9hZGRybGVuICAgID0gbmktPnNhbGVuOwogCXJwY19zZXRfcG9ydChubG1fYWRkcihob3N0KSwgMCk7Ci0JbWVtY3B5KG5sbV9zcmNhZGRyKGhvc3QpLCBuaS0+c3JjX3NhcCwgbmktPnNyY19sZW4pOwotCWhvc3QtPmhfc3JjYWRkcmxlbiA9IG5pLT5zcmNfbGVuOworCWhvc3QtPmhfc3JjYWRkcmxlbiA9IDA7CisKKwlob3N0LT5oX3JwY2NsbnQgICAgPSBOVUxMOworCWhvc3QtPmhfbmFtZQkgICA9IG5zbS0+c21fbmFtZTsKIAlob3N0LT5oX3ZlcnNpb24gICAgPSBuaS0+dmVyc2lvbjsKIAlob3N0LT5oX3Byb3RvICAgICAgPSBuaS0+cHJvdG9jb2w7Ci0JaG9zdC0+aF9ycGNjbG50ICAgID0gTlVMTDsKLQltdXRleF9pbml0KCZob3N0LT5oX211dGV4KTsKLQlob3N0LT5oX25leHRyZWJpbmQgPSBqaWZmaWVzICsgTkxNX0hPU1RfUkVCSU5EOwotCWhvc3QtPmhfZXhwaXJlcyAgICA9IGppZmZpZXMgKyBOTE1fSE9TVF9FWFBJUkU7Ci0JYXRvbWljX3NldCgmaG9zdC0+aF9jb3VudCwgMSk7CisJaG9zdC0+aF9yZWNsYWltaW5nID0gMDsKKwlob3N0LT5oX3NlcnZlciAgICAgPSBuaS0+c2VydmVyOworCWhvc3QtPmhfbm9yZXN2cG9ydCA9IG5pLT5ub3Jlc3Zwb3J0OworCWhvc3QtPmhfaW51c2UgICAgICA9IDA7CiAJaW5pdF93YWl0cXVldWVfaGVhZCgmaG9zdC0+aF9ncmFjZXdhaXQpOwogCWluaXRfcndzZW0oJmhvc3QtPmhfcndzZW0pOwotCWhvc3QtPmhfc3RhdGUgICAgICA9IDA7CQkJLyogcHNldWRvIE5TTSBzdGF0ZSAqLwotCWhvc3QtPmhfbnNtc3RhdGUgICA9IDA7CQkJLyogcmVhbCBOU00gc3RhdGUgKi8KLQlob3N0LT5oX25zbWhhbmRsZSAgPSBuc207Ci0JaG9zdC0+aF9zZXJ2ZXIJICAgPSBuaS0+c2VydmVyOwotCWhvc3QtPmhfbm9yZXN2cG9ydCA9IG5pLT5ub3Jlc3Zwb3J0OwotCWhsaXN0X2FkZF9oZWFkKCZob3N0LT5oX2hhc2gsIGNoYWluKTsKKwlob3N0LT5oX3N0YXRlICAgICAgPSAwOworCWhvc3QtPmhfbnNtc3RhdGUgICA9IDA7CisJaG9zdC0+aF9waWRjb3VudCAgID0gMDsKKwlhdG9taWNfc2V0KCZob3N0LT5oX2NvdW50LCAxKTsKKwltdXRleF9pbml0KCZob3N0LT5oX211dGV4KTsKKwlob3N0LT5oX25leHRyZWJpbmQgPSBub3cgKyBOTE1fSE9TVF9SRUJJTkQ7CisJaG9zdC0+aF9leHBpcmVzICAgID0gbm93ICsgTkxNX0hPU1RfRVhQSVJFOwogCUlOSVRfTElTVF9IRUFEKCZob3N0LT5oX2xvY2tvd25lcnMpOwogCXNwaW5fbG9ja19pbml0KCZob3N0LT5oX2xvY2spOwogCUlOSVRfTElTVF9IRUFEKCZob3N0LT5oX2dyYW50ZWQpOwogCUlOSVRfTElTVF9IRUFEKCZob3N0LT5oX3JlY2xhaW0pOwotCi0JbnJob3N0cysrOwotCi0JZHByaW50aygibG9ja2Q6IG5sbV9sb29rdXBfaG9zdCBjcmVhdGVkIGhvc3QgJXNcbiIsCi0JCQlob3N0LT5oX25hbWUpOworCWhvc3QtPmhfbnNtaGFuZGxlICA9IG5zbTsKKwlob3N0LT5oX2FkZHJidWYgICAgPSBuc20tPnNtX2FkZHJidWY7CiAKIG91dDoKLQltdXRleF91bmxvY2soJm5sbV9ob3N0X211dGV4KTsKIAlyZXR1cm4gaG9zdDsKIH0KIAogLyoKLSAqIERlc3Ryb3kgYSBob3N0CisgKiBEZXN0cm95IGFuIG5sbV9ob3N0IGFuZCBmcmVlIGFzc29jaWF0ZWQgcmVzb3VyY2VzCisgKgorICogQ2FsbGVyIG11c3QgaG9sZCBubG1faG9zdF9tdXRleC4KICAqLwotc3RhdGljIHZvaWQKLW5sbV9kZXN0cm95X2hvc3Qoc3RydWN0IG5sbV9ob3N0ICpob3N0KQorc3RhdGljIHZvaWQgbmxtX2Rlc3Ryb3lfaG9zdF9sb2NrZWQoc3RydWN0IG5sbV9ob3N0ICpob3N0KQogewogCXN0cnVjdCBycGNfY2xudAkqY2xudDsKIAorCWRwcmludGsoImxvY2tkOiBkZXN0cm95IGhvc3QgJXNcbiIsIGhvc3QtPmhfbmFtZSk7CisKIAlCVUdfT04oIWxpc3RfZW1wdHkoJmhvc3QtPmhfbG9ja293bmVycykpOwogCUJVR19PTihhdG9taWNfcmVhZCgmaG9zdC0+aF9jb3VudCkpOwogCisJaGxpc3RfZGVsX2luaXQoJmhvc3QtPmhfaGFzaCk7CisKIAluc21fdW5tb25pdG9yKGhvc3QpOwogCW5zbV9yZWxlYXNlKGhvc3QtPmhfbnNtaGFuZGxlKTsKIApAQCAtMjE2LDYgKzE4Myw4IEBACiAJaWYgKGNsbnQgIT0gTlVMTCkKIAkJcnBjX3NodXRkb3duX2NsaWVudChjbG50KTsKIAlrZnJlZShob3N0KTsKKworCW5yaG9zdHMtLTsKIH0KIAogLyoqCkBAIC0yNDksMTIgKzIxOCw3NiBAQAogCQkuaG9zdG5hbWVfbGVuCT0gc3RybGVuKGhvc3RuYW1lKSwKIAkJLm5vcmVzdnBvcnQJPSBub3Jlc3Zwb3J0LAogCX07CisJc3RydWN0IGhsaXN0X2hlYWQgKmNoYWluOworCXN0cnVjdCBobGlzdF9ub2RlICpwb3M7CisJc3RydWN0IG5sbV9ob3N0CSpob3N0OworCXN0cnVjdCBuc21faGFuZGxlICpuc20gPSBOVUxMOwogCiAJZHByaW50aygibG9ja2Q6ICVzKGhvc3Q9JyVzJywgdmVycz0ldSwgcHJvdG89JXMpXG4iLCBfX2Z1bmNfXywKIAkJCShob3N0bmFtZSA/IGhvc3RuYW1lIDogIjxub25lPiIpLCB2ZXJzaW9uLAogCQkJKHByb3RvY29sID09IElQUFJPVE9fVURQID8gInVkcCIgOiAidGNwIikpOwogCi0JcmV0dXJuIG5sbV9sb29rdXBfaG9zdCgmbmkpOworCW11dGV4X2xvY2soJm5sbV9ob3N0X211dGV4KTsKKworCWNoYWluID0gJm5sbV9jbGllbnRfaG9zdHNbbmxtX2hhc2hfYWRkcmVzcyhzYXApXTsKKwlobGlzdF9mb3JfZWFjaF9lbnRyeShob3N0LCBwb3MsIGNoYWluLCBoX2hhc2gpIHsKKwkJaWYgKCFycGNfY21wX2FkZHIobmxtX2FkZHIoaG9zdCksIHNhcCkpCisJCQljb250aW51ZTsKKworCQkvKiBTYW1lIGFkZHJlc3MuIFNoYXJlIGFuIE5TTSBoYW5kbGUgaWYgd2UgYWxyZWFkeSBoYXZlIG9uZSAqLworCQlpZiAobnNtID09IE5VTEwpCisJCQluc20gPSBob3N0LT5oX25zbWhhbmRsZTsKKworCQlpZiAoaG9zdC0+aF9wcm90byAhPSBwcm90b2NvbCkKKwkJCWNvbnRpbnVlOworCQlpZiAoaG9zdC0+aF92ZXJzaW9uICE9IHZlcnNpb24pCisJCQljb250aW51ZTsKKworCQlubG1fZ2V0X2hvc3QoaG9zdCk7CisJCWRwcmludGsoImxvY2tkOiAlcyBmb3VuZCBob3N0ICVzICglcylcbiIsIF9fZnVuY19fLAorCQkJaG9zdC0+aF9uYW1lLCBob3N0LT5oX2FkZHJidWYpOworCQlnb3RvIG91dDsKKwl9CisKKwlob3N0ID0gbmxtX2FsbG9jX2hvc3QoJm5pLCBuc20pOworCWlmICh1bmxpa2VseShob3N0ID09IE5VTEwpKQorCQlnb3RvIG91dDsKKworCWhsaXN0X2FkZF9oZWFkKCZob3N0LT5oX2hhc2gsIGNoYWluKTsKKwlucmhvc3RzKys7CisKKwlkcHJpbnRrKCJsb2NrZDogJXMgY3JlYXRlZCBob3N0ICVzICglcylcbiIsIF9fZnVuY19fLAorCQlob3N0LT5oX25hbWUsIGhvc3QtPmhfYWRkcmJ1Zik7CisKK291dDoKKwltdXRleF91bmxvY2soJm5sbV9ob3N0X211dGV4KTsKKwlyZXR1cm4gaG9zdDsKK30KKworLyoqCisgKiBubG1jbG50X3JlbGVhc2VfaG9zdCAtIHJlbGVhc2UgY2xpZW50IG5sbV9ob3N0CisgKiBAaG9zdDogbmxtX2hvc3QgdG8gcmVsZWFzZQorICoKKyAqLwordm9pZCBubG1jbG50X3JlbGVhc2VfaG9zdChzdHJ1Y3QgbmxtX2hvc3QgKmhvc3QpCit7CisJaWYgKGhvc3QgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJZHByaW50aygibG9ja2Q6IHJlbGVhc2UgY2xpZW50IGhvc3QgJXNcbiIsIGhvc3QtPmhfbmFtZSk7CisKKwlCVUdfT04oYXRvbWljX3JlYWQoJmhvc3QtPmhfY291bnQpIDwgMCk7CisJQlVHX09OKGhvc3QtPmhfc2VydmVyKTsKKworCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZob3N0LT5oX2NvdW50KSkgeworCQlCVUdfT04oIWxpc3RfZW1wdHkoJmhvc3QtPmhfbG9ja293bmVycykpOworCQlCVUdfT04oIWxpc3RfZW1wdHkoJmhvc3QtPmhfZ3JhbnRlZCkpOworCQlCVUdfT04oIWxpc3RfZW1wdHkoJmhvc3QtPmhfcmVjbGFpbSkpOworCisJCW11dGV4X2xvY2soJm5sbV9ob3N0X211dGV4KTsKKwkJbmxtX2Rlc3Ryb3lfaG9zdF9sb2NrZWQoaG9zdCk7CisJCW11dGV4X3VubG9jaygmbmxtX2hvc3RfbXV0ZXgpOworCX0KIH0KIAogLyoqCkBAIC0yNzksMTIgKzMxMiwxOCBAQAogCQkJCSAgICBjb25zdCBjaGFyICpob3N0bmFtZSwKIAkJCQkgICAgY29uc3Qgc2l6ZV90IGhvc3RuYW1lX2xlbikKIHsKKwlzdHJ1Y3QgaGxpc3RfaGVhZCAqY2hhaW47CisJc3RydWN0IGhsaXN0X25vZGUgKnBvczsKKwlzdHJ1Y3QgbmxtX2hvc3QJKmhvc3QgPSBOVUxMOworCXN0cnVjdCBuc21faGFuZGxlICpuc20gPSBOVUxMOwogCXN0cnVjdCBzb2NrYWRkcl9pbiBzaW4gPSB7CiAJCS5zaW5fZmFtaWx5CT0gQUZfSU5FVCwKIAl9OwogCXN0cnVjdCBzb2NrYWRkcl9pbjYgc2luNiA9IHsKIAkJLnNpbjZfZmFtaWx5CT0gQUZfSU5FVDYsCiAJfTsKKwlzdHJ1Y3Qgc29ja2FkZHIgKnNyY19zYXA7CisJc2l6ZV90IHNyY19sZW4gPSBycXN0cC0+cnFfYWRkcmxlbjsKIAlzdHJ1Y3QgbmxtX2xvb2t1cF9ob3N0X2luZm8gbmkgPSB7CiAJCS5zZXJ2ZXIJCT0gMSwKIAkJLnNhcAkJPSBzdmNfYWRkcihycXN0cCksCkBAIC0yOTMsMjcgKzMzMiw5MSBAQAogCQkudmVyc2lvbgk9IHJxc3RwLT5ycV92ZXJzLAogCQkuaG9zdG5hbWUJPSBob3N0bmFtZSwKIAkJLmhvc3RuYW1lX2xlbgk9IGhvc3RuYW1lX2xlbiwKLQkJLnNyY19sZW4JPSBycXN0cC0+cnFfYWRkcmxlbiwKIAl9OwogCiAJZHByaW50aygibG9ja2Q6ICVzKGhvc3Q9JyUqcycsIHZlcnM9JXUsIHByb3RvPSVzKVxuIiwgX19mdW5jX18sCiAJCQkoaW50KWhvc3RuYW1lX2xlbiwgaG9zdG5hbWUsIHJxc3RwLT5ycV92ZXJzLAogCQkJKHJxc3RwLT5ycV9wcm90ID09IElQUFJPVE9fVURQID8gInVkcCIgOiAidGNwIikpOwogCisJbXV0ZXhfbG9jaygmbmxtX2hvc3RfbXV0ZXgpOworCiAJc3dpdGNoIChuaS5zYXAtPnNhX2ZhbWlseSkgewogCWNhc2UgQUZfSU5FVDoKIAkJc2luLnNpbl9hZGRyLnNfYWRkciA9IHJxc3RwLT5ycV9kYWRkci5hZGRyLnNfYWRkcjsKLQkJbmkuc3JjX3NhcCA9IChzdHJ1Y3Qgc29ja2FkZHIgKikmc2luOworCQlzcmNfc2FwID0gKHN0cnVjdCBzb2NrYWRkciAqKSZzaW47CiAJCWJyZWFrOwogCWNhc2UgQUZfSU5FVDY6CiAJCWlwdjZfYWRkcl9jb3B5KCZzaW42LnNpbjZfYWRkciwgJnJxc3RwLT5ycV9kYWRkci5hZGRyNik7Ci0JCW5pLnNyY19zYXAgPSAoc3RydWN0IHNvY2thZGRyICopJnNpbjY7CisJCXNyY19zYXAgPSAoc3RydWN0IHNvY2thZGRyICopJnNpbjY7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCXJldHVybiBOVUxMOworCQlkcHJpbnRrKCJsb2NrZDogJXMgZmFpbGVkOyB1bnJlY29nbml6ZWQgYWRkcmVzcyBmYW1pbHlcbiIsCisJCQlfX2Z1bmNfXyk7CisJCWdvdG8gb3V0OwogCX0KIAotCXJldHVybiBubG1fbG9va3VwX2hvc3QoJm5pKTsKKwlpZiAodGltZV9hZnRlcl9lcShqaWZmaWVzLCBuZXh0X2djKSkKKwkJbmxtX2djX2hvc3RzKCk7CisKKwljaGFpbiA9ICZubG1fc2VydmVyX2hvc3RzW25sbV9oYXNoX2FkZHJlc3Mobmkuc2FwKV07CisJaGxpc3RfZm9yX2VhY2hfZW50cnkoaG9zdCwgcG9zLCBjaGFpbiwgaF9oYXNoKSB7CisJCWlmICghcnBjX2NtcF9hZGRyKG5sbV9hZGRyKGhvc3QpLCBuaS5zYXApKQorCQkJY29udGludWU7CisKKwkJLyogU2FtZSBhZGRyZXNzLiBTaGFyZSBhbiBOU00gaGFuZGxlIGlmIHdlIGFscmVhZHkgaGF2ZSBvbmUgKi8KKwkJaWYgKG5zbSA9PSBOVUxMKQorCQkJbnNtID0gaG9zdC0+aF9uc21oYW5kbGU7CisKKwkJaWYgKGhvc3QtPmhfcHJvdG8gIT0gbmkucHJvdG9jb2wpCisJCQljb250aW51ZTsKKwkJaWYgKGhvc3QtPmhfdmVyc2lvbiAhPSBuaS52ZXJzaW9uKQorCQkJY29udGludWU7CisJCWlmICghcnBjX2NtcF9hZGRyKG5sbV9zcmNhZGRyKGhvc3QpLCBzcmNfc2FwKSkKKwkJCWNvbnRpbnVlOworCisJCS8qIE1vdmUgdG8gaGVhZCBvZiBoYXNoIGNoYWluLiAqLworCQlobGlzdF9kZWwoJmhvc3QtPmhfaGFzaCk7CisJCWhsaXN0X2FkZF9oZWFkKCZob3N0LT5oX2hhc2gsIGNoYWluKTsKKworCQlubG1fZ2V0X2hvc3QoaG9zdCk7CisJCWRwcmludGsoImxvY2tkOiAlcyBmb3VuZCBob3N0ICVzICglcylcbiIsCisJCQlfX2Z1bmNfXywgaG9zdC0+aF9uYW1lLCBob3N0LT5oX2FkZHJidWYpOworCQlnb3RvIG91dDsKKwl9CisKKwlob3N0ID0gbmxtX2FsbG9jX2hvc3QoJm5pLCBuc20pOworCWlmICh1bmxpa2VseShob3N0ID09IE5VTEwpKQorCQlnb3RvIG91dDsKKworCW1lbWNweShubG1fc3JjYWRkcihob3N0KSwgc3JjX3NhcCwgc3JjX2xlbik7CisJaG9zdC0+aF9zcmNhZGRybGVuID0gc3JjX2xlbjsKKwlobGlzdF9hZGRfaGVhZCgmaG9zdC0+aF9oYXNoLCBjaGFpbik7CisJbnJob3N0cysrOworCisJZHByaW50aygibG9ja2Q6ICVzIGNyZWF0ZWQgaG9zdCAlcyAoJXMpXG4iLAorCQlfX2Z1bmNfXywgaG9zdC0+aF9uYW1lLCBob3N0LT5oX2FkZHJidWYpOworCitvdXQ6CisJbXV0ZXhfdW5sb2NrKCZubG1faG9zdF9tdXRleCk7CisJcmV0dXJuIGhvc3Q7Cit9CisKKy8qKgorICogbmxtc3ZjX3JlbGVhc2VfaG9zdCAtIHJlbGVhc2Ugc2VydmVyIG5sbV9ob3N0CisgKiBAaG9zdDogbmxtX2hvc3QgdG8gcmVsZWFzZQorICoKKyAqIEhvc3QgaXMgZGVzdHJveWVkIGxhdGVyIGluIG5sbV9nY19ob3N0KCkuCisgKi8KK3ZvaWQgbmxtc3ZjX3JlbGVhc2VfaG9zdChzdHJ1Y3QgbmxtX2hvc3QgKmhvc3QpCit7CisJaWYgKGhvc3QgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJZHByaW50aygibG9ja2Q6IHJlbGVhc2Ugc2VydmVyIGhvc3QgJXNcbiIsIGhvc3QtPmhfbmFtZSk7CisKKwlCVUdfT04oYXRvbWljX3JlYWQoJmhvc3QtPmhfY291bnQpIDwgMCk7CisJQlVHX09OKCFob3N0LT5oX3NlcnZlcik7CisJYXRvbWljX2RlYygmaG9zdC0+aF9jb3VudCk7CiB9CiAKIC8qCkBAIC00MTMsMjAgKzUxNiwyOCBAQAogCXJldHVybiBob3N0OwogfQogCi0vKgotICogUmVsZWFzZSBOTE0gaG9zdCBhZnRlciB1c2UKLSAqLwotdm9pZCBubG1fcmVsZWFzZV9ob3N0KHN0cnVjdCBubG1faG9zdCAqaG9zdCkKK3N0YXRpYyBzdHJ1Y3QgbmxtX2hvc3QgKm5leHRfaG9zdF9zdGF0ZShzdHJ1Y3QgaGxpc3RfaGVhZCAqY2FjaGUsCisJCQkJCXN0cnVjdCBuc21faGFuZGxlICpuc20sCisJCQkJCWNvbnN0IHN0cnVjdCBubG1fcmVib290ICppbmZvKQogewotCWlmIChob3N0ICE9IE5VTEwpIHsKLQkJZHByaW50aygibG9ja2Q6IHJlbGVhc2UgaG9zdCAlc1xuIiwgaG9zdC0+aF9uYW1lKTsKLQkJQlVHX09OKGF0b21pY19yZWFkKCZob3N0LT5oX2NvdW50KSA8IDApOwotCQlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmaG9zdC0+aF9jb3VudCkpIHsKLQkJCUJVR19PTighbGlzdF9lbXB0eSgmaG9zdC0+aF9sb2Nrb3duZXJzKSk7Ci0JCQlCVUdfT04oIWxpc3RfZW1wdHkoJmhvc3QtPmhfZ3JhbnRlZCkpOwotCQkJQlVHX09OKCFsaXN0X2VtcHR5KCZob3N0LT5oX3JlY2xhaW0pKTsKKwlzdHJ1Y3QgbmxtX2hvc3QgKmhvc3QgPSBOVUxMOworCXN0cnVjdCBobGlzdF9oZWFkICpjaGFpbjsKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSAqcG9zOworCisJbXV0ZXhfbG9jaygmbmxtX2hvc3RfbXV0ZXgpOworCWZvcl9lYWNoX2hvc3QoaG9zdCwgcG9zLCBjaGFpbiwgY2FjaGUpIHsKKwkJaWYgKGhvc3QtPmhfbnNtaGFuZGxlID09IG5zbQorCQkgICAgJiYgaG9zdC0+aF9uc21zdGF0ZSAhPSBpbmZvLT5zdGF0ZSkgeworCQkJaG9zdC0+aF9uc21zdGF0ZSA9IGluZm8tPnN0YXRlOworCQkJaG9zdC0+aF9zdGF0ZSsrOworCisJCQlubG1fZ2V0X2hvc3QoaG9zdCk7CisJCQlnb3RvIG91dDsKIAkJfQogCX0KK291dDoKKwltdXRleF91bmxvY2soJm5sbV9ob3N0X211dGV4KTsKKwlyZXR1cm4gaG9zdDsKIH0KIAogLyoqCkBAIC00MzgsOCArNTQ5LDYgQEAKICAqLwogdm9pZCBubG1faG9zdF9yZWJvb3RlZChjb25zdCBzdHJ1Y3QgbmxtX3JlYm9vdCAqaW5mbykKIHsKLQlzdHJ1Y3QgaGxpc3RfaGVhZCAqY2hhaW47Ci0Jc3RydWN0IGhsaXN0X25vZGUgKnBvczsKIAlzdHJ1Y3QgbnNtX2hhbmRsZSAqbnNtOwogCXN0cnVjdCBubG1faG9zdAkqaG9zdDsKIApAQCAtNDUyLDMyICs1NjEsMTUgQEAKIAkgKiBsb2NrIGZvciB0aGlzLgogCSAqIFRvIGF2b2lkIHByb2Nlc3NpbmcgYSBob3N0IHNldmVyYWwgdGltZXMsIHdlIG1hdGNoIHRoZSBuc21zdGF0ZS4KIAkgKi8KLWFnYWluOgltdXRleF9sb2NrKCZubG1faG9zdF9tdXRleCk7Ci0JZm9yIChjaGFpbiA9IG5sbV9ob3N0czsgY2hhaW4gPCBubG1faG9zdHMgKyBOTE1fSE9TVF9OUkhBU0g7ICsrY2hhaW4pIHsKLQkJaGxpc3RfZm9yX2VhY2hfZW50cnkoaG9zdCwgcG9zLCBjaGFpbiwgaF9oYXNoKSB7Ci0JCQlpZiAoaG9zdC0+aF9uc21oYW5kbGUgPT0gbnNtCi0JCQkgJiYgaG9zdC0+aF9uc21zdGF0ZSAhPSBpbmZvLT5zdGF0ZSkgewotCQkJCWhvc3QtPmhfbnNtc3RhdGUgPSBpbmZvLT5zdGF0ZTsKLQkJCQlob3N0LT5oX3N0YXRlKys7Ci0KLQkJCQlubG1fZ2V0X2hvc3QoaG9zdCk7Ci0JCQkJbXV0ZXhfdW5sb2NrKCZubG1faG9zdF9tdXRleCk7Ci0KLQkJCQlpZiAoaG9zdC0+aF9zZXJ2ZXIpIHsKLQkJCQkJLyogV2UncmUgc2VydmVyIGZvciB0aGlzIGd1eSwganVzdCBkaXRjaAotCQkJCQkgKiBhbGwgdGhlIGxvY2tzIGhlIGhlbGQuICovCi0JCQkJCW5sbXN2Y19mcmVlX2hvc3RfcmVzb3VyY2VzKGhvc3QpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCS8qIEhlJ3MgdGhlIHNlcnZlciwgaW5pdGlhdGUgbG9jayByZWNvdmVyeS4gKi8KLQkJCQkJbmxtY2xudF9yZWNvdmVyeShob3N0KTsKLQkJCQl9Ci0KLQkJCQlubG1fcmVsZWFzZV9ob3N0KGhvc3QpOwotCQkJCWdvdG8gYWdhaW47Ci0JCQl9Ci0JCX0KKwl3aGlsZSAoKGhvc3QgPSBuZXh0X2hvc3Rfc3RhdGUobmxtX3NlcnZlcl9ob3N0cywgbnNtLCBpbmZvKSkgIT0gTlVMTCkgeworCQlubG1zdmNfZnJlZV9ob3N0X3Jlc291cmNlcyhob3N0KTsKKwkJbmxtc3ZjX3JlbGVhc2VfaG9zdChob3N0KTsKIAl9Ci0JbXV0ZXhfdW5sb2NrKCZubG1faG9zdF9tdXRleCk7CisJd2hpbGUgKChob3N0ID0gbmV4dF9ob3N0X3N0YXRlKG5sbV9jbGllbnRfaG9zdHMsIG5zbSwgaW5mbykpICE9IE5VTEwpIHsKKwkJbmxtY2xudF9yZWNvdmVyeShob3N0KTsKKwkJbmxtY2xudF9yZWxlYXNlX2hvc3QoaG9zdCk7CisJfQorCiAJbnNtX3JlbGVhc2UobnNtKTsKIH0KIApAQCAtNDk3LDEzICs1ODksMTEgQEAKIAogCS8qIEZpcnN0LCBtYWtlIGFsbCBob3N0cyBlbGlnaWJsZSBmb3IgZ2MgKi8KIAlkcHJpbnRrKCJsb2NrZDogbnVraW5nIGFsbCBob3N0cy4uLlxuIik7Ci0JZm9yIChjaGFpbiA9IG5sbV9ob3N0czsgY2hhaW4gPCBubG1faG9zdHMgKyBOTE1fSE9TVF9OUkhBU0g7ICsrY2hhaW4pIHsKLQkJaGxpc3RfZm9yX2VhY2hfZW50cnkoaG9zdCwgcG9zLCBjaGFpbiwgaF9oYXNoKSB7Ci0JCQlob3N0LT5oX2V4cGlyZXMgPSBqaWZmaWVzIC0gMTsKLQkJCWlmIChob3N0LT5oX3JwY2NsbnQpIHsKLQkJCQlycGNfc2h1dGRvd25fY2xpZW50KGhvc3QtPmhfcnBjY2xudCk7Ci0JCQkJaG9zdC0+aF9ycGNjbG50ID0gTlVMTDsKLQkJCX0KKwlmb3JfZWFjaF9ob3N0KGhvc3QsIHBvcywgY2hhaW4sIG5sbV9zZXJ2ZXJfaG9zdHMpIHsKKwkJaG9zdC0+aF9leHBpcmVzID0gamlmZmllcyAtIDE7CisJCWlmIChob3N0LT5oX3JwY2NsbnQpIHsKKwkJCXJwY19zaHV0ZG93bl9jbGllbnQoaG9zdC0+aF9ycGNjbG50KTsKKwkJCWhvc3QtPmhfcnBjY2xudCA9IE5VTEw7CiAJCX0KIAl9CiAKQEAgLTUxMiwxNSArNjAyLDEzIEBACiAJbXV0ZXhfdW5sb2NrKCZubG1faG9zdF9tdXRleCk7CiAKIAkvKiBjb21wbGFpbiBpZiBhbnkgaG9zdHMgYXJlIGxlZnQgKi8KLQlpZiAobnJob3N0cykgeworCWlmIChucmhvc3RzICE9IDApIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAibG9ja2Q6IGNvdWxkbid0IHNodXRkb3duIGhvc3QgbW9kdWxlIVxuIik7Ci0JCWRwcmludGsoImxvY2tkOiAlZCBob3N0cyBsZWZ0OlxuIiwgbnJob3N0cyk7Ci0JCWZvciAoY2hhaW4gPSBubG1faG9zdHM7IGNoYWluIDwgbmxtX2hvc3RzICsgTkxNX0hPU1RfTlJIQVNIOyArK2NoYWluKSB7Ci0JCQlobGlzdF9mb3JfZWFjaF9lbnRyeShob3N0LCBwb3MsIGNoYWluLCBoX2hhc2gpIHsKLQkJCQlkcHJpbnRrKCIgICAgICAgJXMgKGNudCAlZCB1c2UgJWQgZXhwICVsZClcbiIsCi0JCQkJCWhvc3QtPmhfbmFtZSwgYXRvbWljX3JlYWQoJmhvc3QtPmhfY291bnQpLAotCQkJCQlob3N0LT5oX2ludXNlLCBob3N0LT5oX2V4cGlyZXMpOwotCQkJfQorCQlkcHJpbnRrKCJsb2NrZDogJWx1IGhvc3RzIGxlZnQ6XG4iLCBucmhvc3RzKTsKKwkJZm9yX2VhY2hfaG9zdChob3N0LCBwb3MsIGNoYWluLCBubG1fc2VydmVyX2hvc3RzKSB7CisJCQlkcHJpbnRrKCIgICAgICAgJXMgKGNudCAlZCB1c2UgJWQgZXhwICVsZClcbiIsCisJCQkJaG9zdC0+aF9uYW1lLCBhdG9taWNfcmVhZCgmaG9zdC0+aF9jb3VudCksCisJCQkJaG9zdC0+aF9pbnVzZSwgaG9zdC0+aF9leHBpcmVzKTsKIAkJfQogCX0KIH0KQEAgLTUzOCwyOSArNjI2LDIyIEBACiAJc3RydWN0IG5sbV9ob3N0CSpob3N0OwogCiAJZHByaW50aygibG9ja2Q6IGhvc3QgZ2FyYmFnZSBjb2xsZWN0aW9uXG4iKTsKLQlmb3IgKGNoYWluID0gbmxtX2hvc3RzOyBjaGFpbiA8IG5sbV9ob3N0cyArIE5MTV9IT1NUX05SSEFTSDsgKytjaGFpbikgewotCQlobGlzdF9mb3JfZWFjaF9lbnRyeShob3N0LCBwb3MsIGNoYWluLCBoX2hhc2gpCi0JCQlob3N0LT5oX2ludXNlID0gMDsKLQl9CisJZm9yX2VhY2hfaG9zdChob3N0LCBwb3MsIGNoYWluLCBubG1fc2VydmVyX2hvc3RzKQorCQlob3N0LT5oX2ludXNlID0gMDsKIAogCS8qIE1hcmsgYWxsIGhvc3RzIHRoYXQgaG9sZCBsb2NrcywgYmxvY2tzIG9yIHNoYXJlcyAqLwogCW5sbXN2Y19tYXJrX3Jlc291cmNlcygpOwogCi0JZm9yIChjaGFpbiA9IG5sbV9ob3N0czsgY2hhaW4gPCBubG1faG9zdHMgKyBOTE1fSE9TVF9OUkhBU0g7ICsrY2hhaW4pIHsKLQkJaGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShob3N0LCBwb3MsIG5leHQsIGNoYWluLCBoX2hhc2gpIHsKLQkJCWlmIChhdG9taWNfcmVhZCgmaG9zdC0+aF9jb3VudCkgfHwgaG9zdC0+aF9pbnVzZQotCQkJIHx8IHRpbWVfYmVmb3JlKGppZmZpZXMsIGhvc3QtPmhfZXhwaXJlcykpIHsKLQkJCQlkcHJpbnRrKCJubG1fZ2NfaG9zdHMgc2tpcHBpbmcgJXMgKGNudCAlZCB1c2UgJWQgZXhwICVsZClcbiIsCi0JCQkJCWhvc3QtPmhfbmFtZSwgYXRvbWljX3JlYWQoJmhvc3QtPmhfY291bnQpLAotCQkJCQlob3N0LT5oX2ludXNlLCBob3N0LT5oX2V4cGlyZXMpOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJZHByaW50aygibG9ja2Q6IGRlbGV0ZSBob3N0ICVzXG4iLCBob3N0LT5oX25hbWUpOwotCQkJaGxpc3RfZGVsX2luaXQoJmhvc3QtPmhfaGFzaCk7Ci0KLQkJCW5sbV9kZXN0cm95X2hvc3QoaG9zdCk7Ci0JCQlucmhvc3RzLS07CisJZm9yX2VhY2hfaG9zdF9zYWZlKGhvc3QsIHBvcywgbmV4dCwgY2hhaW4sIG5sbV9zZXJ2ZXJfaG9zdHMpIHsKKwkJaWYgKGF0b21pY19yZWFkKCZob3N0LT5oX2NvdW50KSB8fCBob3N0LT5oX2ludXNlCisJCSB8fCB0aW1lX2JlZm9yZShqaWZmaWVzLCBob3N0LT5oX2V4cGlyZXMpKSB7CisJCQlkcHJpbnRrKCJubG1fZ2NfaG9zdHMgc2tpcHBpbmcgJXMgIgorCQkJCSIoY250ICVkIHVzZSAlZCBleHAgJWxkKVxuIiwKKwkJCQlob3N0LT5oX25hbWUsIGF0b21pY19yZWFkKCZob3N0LT5oX2NvdW50KSwKKwkJCQlob3N0LT5oX2ludXNlLCBob3N0LT5oX2V4cGlyZXMpOworCQkJY29udGludWU7CiAJCX0KKwkJbmxtX2Rlc3Ryb3lfaG9zdF9sb2NrZWQoaG9zdCk7CiAJfQogCiAJbmV4dF9nYyA9IGppZmZpZXMgKyBOTE1fSE9TVF9DT0xMRUNUOwpkaWZmIC0tZ2l0IGEvZnMvbG9ja2QvbW9uLmMgYi9mcy9sb2NrZC9tb24uYwppbmRleCBlMGM5MTg5Li4yM2Q3NDUxIDEwMDY0NAotLS0gYS9mcy9sb2NrZC9tb24uYworKysgYi9mcy9sb2NrZC9tb24uYwpAQCAtNDAxLDI2ICs0MDEsMjIgQEAKICAqIFN0YXR1cyBNb25pdG9yIHdpcmUgcHJvdG9jb2wuCiAgKi8KIAotc3RhdGljIGludCBlbmNvZGVfbnNtX3N0cmluZyhzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBjb25zdCBjaGFyICpzdHJpbmcpCitzdGF0aWMgdm9pZCBlbmNvZGVfbnNtX3N0cmluZyhzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBjb25zdCBjaGFyICpzdHJpbmcpCiB7CiAJY29uc3QgdTMyIGxlbiA9IHN0cmxlbihzdHJpbmcpOwogCV9fYmUzMiAqcDsKIAotCWlmICh1bmxpa2VseShsZW4gPiBTTV9NQVhTVFJMRU4pKQotCQlyZXR1cm4gLUVJTzsKLQlwID0geGRyX3Jlc2VydmVfc3BhY2UoeGRyLCBzaXplb2YodTMyKSArIGxlbik7Ci0JaWYgKHVubGlrZWx5KHAgPT0gTlVMTCkpCi0JCXJldHVybiAtRUlPOworCUJVR19PTihsZW4gPiBTTV9NQVhTVFJMRU4pOworCXAgPSB4ZHJfcmVzZXJ2ZV9zcGFjZSh4ZHIsIDQgKyBsZW4pOwogCXhkcl9lbmNvZGVfb3BhcXVlKHAsIHN0cmluZywgbGVuKTsKLQlyZXR1cm4gMDsKIH0KIAogLyoKICAqICJtb25fbmFtZSIgc3BlY2lmaWVzIHRoZSBob3N0IHRvIGJlIG1vbml0b3JlZC4KICAqLwotc3RhdGljIGludCBlbmNvZGVfbW9uX25hbWUoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgY29uc3Qgc3RydWN0IG5zbV9hcmdzICphcmdwKQorc3RhdGljIHZvaWQgZW5jb2RlX21vbl9uYW1lKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIGNvbnN0IHN0cnVjdCBuc21fYXJncyAqYXJncCkKIHsKLQlyZXR1cm4gZW5jb2RlX25zbV9zdHJpbmcoeGRyLCBhcmdwLT5tb25fbmFtZSk7CisJZW5jb2RlX25zbV9zdHJpbmcoeGRyLCBhcmdwLT5tb25fbmFtZSk7CiB9CiAKIC8qCkBAIC00MjksMzUgKzQyNSwyNSBAQAogICogKHZpYSB0aGUgTkxNUFJPQ19TTV9OT1RJRlkgY2FsbCkgdGhhdCB0aGUgc3RhdGUgb2YgaG9zdCAibW9uX25hbWUiCiAgKiBoYXMgY2hhbmdlZC4KICAqLwotc3RhdGljIGludCBlbmNvZGVfbXlfaWQoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgY29uc3Qgc3RydWN0IG5zbV9hcmdzICphcmdwKQorc3RhdGljIHZvaWQgZW5jb2RlX215X2lkKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIGNvbnN0IHN0cnVjdCBuc21fYXJncyAqYXJncCkKIHsKLQlpbnQgc3RhdHVzOwogCV9fYmUzMiAqcDsKIAotCXN0YXR1cyA9IGVuY29kZV9uc21fc3RyaW5nKHhkciwgdXRzbmFtZSgpLT5ub2RlbmFtZSk7Ci0JaWYgKHVubGlrZWx5KHN0YXR1cyAhPSAwKSkKLQkJcmV0dXJuIHN0YXR1czsKLQlwID0geGRyX3Jlc2VydmVfc3BhY2UoeGRyLCAzICogc2l6ZW9mKHUzMikpOwotCWlmICh1bmxpa2VseShwID09IE5VTEwpKQotCQlyZXR1cm4gLUVJTzsKLQkqcCsrID0gaHRvbmwoYXJncC0+cHJvZyk7Ci0JKnArKyA9IGh0b25sKGFyZ3AtPnZlcnMpOwotCSpwKysgPSBodG9ubChhcmdwLT5wcm9jKTsKLQlyZXR1cm4gMDsKKwllbmNvZGVfbnNtX3N0cmluZyh4ZHIsIHV0c25hbWUoKS0+bm9kZW5hbWUpOworCXAgPSB4ZHJfcmVzZXJ2ZV9zcGFjZSh4ZHIsIDQgKyA0ICsgNCk7CisJKnArKyA9IGNwdV90b19iZTMyKGFyZ3AtPnByb2cpOworCSpwKysgPSBjcHVfdG9fYmUzMihhcmdwLT52ZXJzKTsKKwkqcCA9IGNwdV90b19iZTMyKGFyZ3AtPnByb2MpOwogfQogCiAvKgogICogVGhlICJtb25faWQiIGFyZ3VtZW50IHNwZWNpZmllcyB0aGUgbm9uLXByaXZhdGUgYXJndW1lbnRzCiAgKiBvZiBhbiBOU01QUk9DX01PTiBvciBOU01QUk9DX1VOTU9OIGNhbGwuCiAgKi8KLXN0YXRpYyBpbnQgZW5jb2RlX21vbl9pZChzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBjb25zdCBzdHJ1Y3QgbnNtX2FyZ3MgKmFyZ3ApCitzdGF0aWMgdm9pZCBlbmNvZGVfbW9uX2lkKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIGNvbnN0IHN0cnVjdCBuc21fYXJncyAqYXJncCkKIHsKLQlpbnQgc3RhdHVzOwotCi0Jc3RhdHVzID0gZW5jb2RlX21vbl9uYW1lKHhkciwgYXJncCk7Ci0JaWYgKHVubGlrZWx5KHN0YXR1cyAhPSAwKSkKLQkJcmV0dXJuIHN0YXR1czsKLQlyZXR1cm4gZW5jb2RlX215X2lkKHhkciwgYXJncCk7CisJZW5jb2RlX21vbl9uYW1lKHhkciwgYXJncCk7CisJZW5jb2RlX215X2lkKHhkciwgYXJncCk7CiB9CiAKIC8qCkBAIC00NjUsNjggKzQ1MSw1NiBAQAogICogYnkgdGhlIE5TTVBST0NfTU9OIGNhbGwuIFRoaXMgaW5mb3JtYXRpb24gd2lsbCBiZSBzdXBwbGllZCBpbiB0aGUKICAqIE5MTVBST0NfU01fTk9USUZZIGNhbGwuCiAgKi8KLXN0YXRpYyBpbnQgZW5jb2RlX3ByaXYoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgY29uc3Qgc3RydWN0IG5zbV9hcmdzICphcmdwKQorc3RhdGljIHZvaWQgZW5jb2RlX3ByaXYoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgY29uc3Qgc3RydWN0IG5zbV9hcmdzICphcmdwKQogewogCV9fYmUzMiAqcDsKIAogCXAgPSB4ZHJfcmVzZXJ2ZV9zcGFjZSh4ZHIsIFNNX1BSSVZfU0laRSk7CisJeGRyX2VuY29kZV9vcGFxdWVfZml4ZWQocCwgYXJncC0+cHJpdi0+ZGF0YSwgU01fUFJJVl9TSVpFKTsKK30KKworc3RhdGljIHZvaWQgbnNtX3hkcl9lbmNfbW9uKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAorCQkJICAgIGNvbnN0IHN0cnVjdCBuc21fYXJncyAqYXJncCkKK3sKKwllbmNvZGVfbW9uX2lkKHhkciwgYXJncCk7CisJZW5jb2RlX3ByaXYoeGRyLCBhcmdwKTsKK30KKworc3RhdGljIHZvaWQgbnNtX3hkcl9lbmNfdW5tb24oc3RydWN0IHJwY19ycXN0ICpyZXEsIHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCisJCQkgICAgICBjb25zdCBzdHJ1Y3QgbnNtX2FyZ3MgKmFyZ3ApCit7CisJZW5jb2RlX21vbl9pZCh4ZHIsIGFyZ3ApOworfQorCitzdGF0aWMgaW50IG5zbV94ZHJfZGVjX3N0YXRfcmVzKHN0cnVjdCBycGNfcnFzdCAqcnFzdHAsCisJCQkJc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKKwkJCQlzdHJ1Y3QgbnNtX3JlcyAqcmVzcCkKK3sKKwlfX2JlMzIgKnA7CisKKwlwID0geGRyX2lubGluZV9kZWNvZGUoeGRyLCA0ICsgNCk7CiAJaWYgKHVubGlrZWx5KHAgPT0gTlVMTCkpCiAJCXJldHVybiAtRUlPOwotCXhkcl9lbmNvZGVfb3BhcXVlX2ZpeGVkKHAsIGFyZ3AtPnByaXYtPmRhdGEsIFNNX1BSSVZfU0laRSk7CisJcmVzcC0+c3RhdHVzID0gYmUzMl90b19jcHVwKHArKyk7CisJcmVzcC0+c3RhdGUgPSBiZTMyX3RvX2NwdXAocCk7CisKKwlkcHJpbnRrKCJsb2NrZDogJXMgc3RhdHVzICVkIHN0YXRlICVkXG4iLAorCQlfX2Z1bmNfXywgcmVzcC0+c3RhdHVzLCByZXNwLT5zdGF0ZSk7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgeGRyX2VuY19tb24oc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwKLQkJICAgICAgIGNvbnN0IHN0cnVjdCBuc21fYXJncyAqYXJncCkKLXsKLQlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7Ci0JaW50IHN0YXR1czsKLQotCXhkcl9pbml0X2VuY29kZSgmeGRyLCAmcmVxLT5ycV9zbmRfYnVmLCBwKTsKLQlzdGF0dXMgPSBlbmNvZGVfbW9uX2lkKCZ4ZHIsIGFyZ3ApOwotCWlmICh1bmxpa2VseShzdGF0dXMpKQotCQlyZXR1cm4gc3RhdHVzOwotCXJldHVybiBlbmNvZGVfcHJpdigmeGRyLCBhcmdwKTsKLX0KLQotc3RhdGljIGludCB4ZHJfZW5jX3VubW9uKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsCi0JCQkgY29uc3Qgc3RydWN0IG5zbV9hcmdzICphcmdwKQotewotCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKLQotCXhkcl9pbml0X2VuY29kZSgmeGRyLCAmcmVxLT5ycV9zbmRfYnVmLCBwKTsKLQlyZXR1cm4gZW5jb2RlX21vbl9pZCgmeGRyLCBhcmdwKTsKLX0KLQotc3RhdGljIGludCB4ZHJfZGVjX3N0YXRfcmVzKHN0cnVjdCBycGNfcnFzdCAqcnFzdHAsIF9fYmUzMiAqcCwKK3N0YXRpYyBpbnQgbnNtX3hkcl9kZWNfc3RhdChzdHJ1Y3QgcnBjX3Jxc3QgKnJxc3RwLAorCQkJICAgIHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCiAJCQkgICAgc3RydWN0IG5zbV9yZXMgKnJlc3ApCiB7Ci0Jc3RydWN0IHhkcl9zdHJlYW0geGRyOworCV9fYmUzMiAqcDsKIAotCXhkcl9pbml0X2RlY29kZSgmeGRyLCAmcnFzdHAtPnJxX3Jjdl9idWYsIHApOwotCXAgPSB4ZHJfaW5saW5lX2RlY29kZSgmeGRyLCAyICogc2l6ZW9mKHUzMikpOworCXAgPSB4ZHJfaW5saW5lX2RlY29kZSh4ZHIsIDQpOwogCWlmICh1bmxpa2VseShwID09IE5VTEwpKQogCQlyZXR1cm4gLUVJTzsKLQlyZXNwLT5zdGF0dXMgPSBudG9obCgqcCsrKTsKLQlyZXNwLT5zdGF0ZSA9IG50b2hsKCpwKTsKKwlyZXNwLT5zdGF0ZSA9IGJlMzJfdG9fY3B1cChwKTsKIAotCWRwcmludGsoImxvY2tkOiB4ZHJfZGVjX3N0YXRfcmVzIHN0YXR1cyAlZCBzdGF0ZSAlZFxuIiwKLQkJCXJlc3AtPnN0YXR1cywgcmVzcC0+c3RhdGUpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHhkcl9kZWNfc3RhdChzdHJ1Y3QgcnBjX3Jxc3QgKnJxc3RwLCBfX2JlMzIgKnAsCi0JCQlzdHJ1Y3QgbnNtX3JlcyAqcmVzcCkKLXsKLQlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7Ci0KLQl4ZHJfaW5pdF9kZWNvZGUoJnhkciwgJnJxc3RwLT5ycV9yY3ZfYnVmLCBwKTsKLQlwID0geGRyX2lubGluZV9kZWNvZGUoJnhkciwgc2l6ZW9mKHUzMikpOwotCWlmICh1bmxpa2VseShwID09IE5VTEwpKQotCQlyZXR1cm4gLUVJTzsKLQlyZXNwLT5zdGF0ZSA9IG50b2hsKCpwKTsKLQotCWRwcmludGsoImxvY2tkOiB4ZHJfZGVjX3N0YXQgc3RhdGUgJWRcbiIsIHJlc3AtPnN0YXRlKTsKKwlkcHJpbnRrKCJsb2NrZDogJXMgc3RhdGUgJWRcbiIsIF9fZnVuY19fLCByZXNwLT5zdGF0ZSk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTU0Miw4ICs1MTYsOCBAQAogc3RhdGljIHN0cnVjdCBycGNfcHJvY2luZm8JbnNtX3Byb2NlZHVyZXNbXSA9IHsKIFtOU01QUk9DX01PTl0gPSB7CiAJCS5wX3Byb2MJCT0gTlNNUFJPQ19NT04sCi0JCS5wX2VuY29kZQk9IChreGRycHJvY190KXhkcl9lbmNfbW9uLAotCQkucF9kZWNvZGUJPSAoa3hkcnByb2NfdCl4ZHJfZGVjX3N0YXRfcmVzLAorCQkucF9lbmNvZGUJPSAoa3hkcmVwcm9jX3QpbnNtX3hkcl9lbmNfbW9uLAorCQkucF9kZWNvZGUJPSAoa3hkcmRwcm9jX3QpbnNtX3hkcl9kZWNfc3RhdF9yZXMsCiAJCS5wX2FyZ2xlbgk9IFNNX21vbl9zeiwKIAkJLnBfcmVwbGVuCT0gU01fbW9ucmVzX3N6LAogCQkucF9zdGF0aWR4CT0gTlNNUFJPQ19NT04sCkBAIC01NTEsOCArNTI1LDggQEAKIAl9LAogW05TTVBST0NfVU5NT05dID0gewogCQkucF9wcm9jCQk9IE5TTVBST0NfVU5NT04sCi0JCS5wX2VuY29kZQk9IChreGRycHJvY190KXhkcl9lbmNfdW5tb24sCi0JCS5wX2RlY29kZQk9IChreGRycHJvY190KXhkcl9kZWNfc3RhdCwKKwkJLnBfZW5jb2RlCT0gKGt4ZHJlcHJvY190KW5zbV94ZHJfZW5jX3VubW9uLAorCQkucF9kZWNvZGUJPSAoa3hkcmRwcm9jX3QpbnNtX3hkcl9kZWNfc3RhdCwKIAkJLnBfYXJnbGVuCT0gU01fbW9uX2lkX3N6LAogCQkucF9yZXBsZW4JPSBTTV91bm1vbnJlc19zeiwKIAkJLnBfc3RhdGlkeAk9IE5TTVBST0NfVU5NT04sCmRpZmYgLS1naXQgYS9mcy9sb2NrZC9zdmM0cHJvYy5jIGIvZnMvbG9ja2Qvc3ZjNHByb2MuYwppbmRleCAzOGQyNjExLi45YTQxZmRjIDEwMDY0NAotLS0gYS9mcy9sb2NrZC9zdmM0cHJvYy5jCisrKyBiL2ZzL2xvY2tkL3N2YzRwcm9jLmMKQEAgLTUxLDcgKzUxLDcgQEAKIAlyZXR1cm4gMDsKIAogbm9fbG9ja3M6Ci0JbmxtX3JlbGVhc2VfaG9zdChob3N0KTsKKwlubG1zdmNfcmVsZWFzZV9ob3N0KGhvc3QpOwogIAlpZiAoZXJyb3IpCiAJCXJldHVybiBlcnJvcjsJCiAJcmV0dXJuIG5sbV9sY2tfZGVuaWVkX25vbG9ja3M7CkBAIC05Miw3ICs5Miw3IEBACiAJZWxzZQogCQlkcHJpbnRrKCJsb2NrZDogVEVTVDQgICAgICAgIHN0YXR1cyAlZFxuIiwgbnRvaGwocmVzcC0+c3RhdHVzKSk7CiAKLQlubG1fcmVsZWFzZV9ob3N0KGhvc3QpOworCW5sbXN2Y19yZWxlYXNlX2hvc3QoaG9zdCk7CiAJbmxtX3JlbGVhc2VfZmlsZShmaWxlKTsKIAlyZXR1cm4gcmM7CiB9CkBAIC0xMzQsNyArMTM0LDcgQEAKIAllbHNlCiAJCWRwcmludGsoImxvY2tkOiBMT0NLICAgICAgICAgc3RhdHVzICVkXG4iLCBudG9obChyZXNwLT5zdGF0dXMpKTsKIAotCW5sbV9yZWxlYXNlX2hvc3QoaG9zdCk7CisJbmxtc3ZjX3JlbGVhc2VfaG9zdChob3N0KTsKIAlubG1fcmVsZWFzZV9maWxlKGZpbGUpOwogCXJldHVybiByYzsKIH0KQEAgLTE2NCw3ICsxNjQsNyBAQAogCXJlc3AtPnN0YXR1cyA9IG5sbXN2Y19jYW5jZWxfYmxvY2tlZChmaWxlLCAmYXJncC0+bG9jayk7CiAKIAlkcHJpbnRrKCJsb2NrZDogQ0FOQ0VMICAgICAgICBzdGF0dXMgJWRcbiIsIG50b2hsKHJlc3AtPnN0YXR1cykpOwotCW5sbV9yZWxlYXNlX2hvc3QoaG9zdCk7CisJbmxtc3ZjX3JlbGVhc2VfaG9zdChob3N0KTsKIAlubG1fcmVsZWFzZV9maWxlKGZpbGUpOwogCXJldHVybiBycGNfc3VjY2VzczsKIH0KQEAgLTE5Nyw3ICsxOTcsNyBAQAogCXJlc3AtPnN0YXR1cyA9IG5sbXN2Y191bmxvY2soZmlsZSwgJmFyZ3AtPmxvY2spOwogCiAJZHByaW50aygibG9ja2Q6IFVOTE9DSyAgICAgICAgc3RhdHVzICVkXG4iLCBudG9obChyZXNwLT5zdGF0dXMpKTsKLQlubG1fcmVsZWFzZV9ob3N0KGhvc3QpOworCW5sbXN2Y19yZWxlYXNlX2hvc3QoaG9zdCk7CiAJbmxtX3JlbGVhc2VfZmlsZShmaWxlKTsKIAlyZXR1cm4gcnBjX3N1Y2Nlc3M7CiB9CkBAIC0yMjksNyArMjI5LDcgQEAKIAogc3RhdGljIHZvaWQgbmxtNHN2Y19jYWxsYmFja19yZWxlYXNlKHZvaWQgKmRhdGEpCiB7Ci0JbmxtX3JlbGVhc2VfY2FsbChkYXRhKTsKKwlubG1zdmNfcmVsZWFzZV9jYWxsKGRhdGEpOwogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHJwY19jYWxsX29wcyBubG00c3ZjX2NhbGxiYWNrX29wcyA9IHsKQEAgLTI2MSw3ICsyNjEsNyBAQAogCiAJc3RhdCA9IGZ1bmMocnFzdHAsIGFyZ3AsICZjYWxsLT5hX3Jlcyk7CiAJaWYgKHN0YXQgIT0gMCkgewotCQlubG1fcmVsZWFzZV9jYWxsKGNhbGwpOworCQlubG1zdmNfcmVsZWFzZV9jYWxsKGNhbGwpOwogCQlyZXR1cm4gc3RhdDsKIAl9CiAKQEAgLTMzNCw3ICszMzQsNyBAQAogCXJlc3AtPnN0YXR1cyA9IG5sbXN2Y19zaGFyZV9maWxlKGhvc3QsIGZpbGUsIGFyZ3ApOwogCiAJZHByaW50aygibG9ja2Q6IFNIQVJFICAgICAgICAgc3RhdHVzICVkXG4iLCBudG9obChyZXNwLT5zdGF0dXMpKTsKLQlubG1fcmVsZWFzZV9ob3N0KGhvc3QpOworCW5sbXN2Y19yZWxlYXNlX2hvc3QoaG9zdCk7CiAJbmxtX3JlbGVhc2VfZmlsZShmaWxlKTsKIAlyZXR1cm4gcnBjX3N1Y2Nlc3M7CiB9CkBAIC0zNjcsNyArMzY3LDcgQEAKIAlyZXNwLT5zdGF0dXMgPSBubG1zdmNfdW5zaGFyZV9maWxlKGhvc3QsIGZpbGUsIGFyZ3ApOwogCiAJZHByaW50aygibG9ja2Q6IFVOU0hBUkUgICAgICAgc3RhdHVzICVkXG4iLCBudG9obChyZXNwLT5zdGF0dXMpKTsKLQlubG1fcmVsZWFzZV9ob3N0KGhvc3QpOworCW5sbXN2Y19yZWxlYXNlX2hvc3QoaG9zdCk7CiAJbmxtX3JlbGVhc2VfZmlsZShmaWxlKTsKIAlyZXR1cm4gcnBjX3N1Y2Nlc3M7CiB9CkBAIC0zOTksNyArMzk5LDcgQEAKIAkJcmV0dXJuIHJwY19zdWNjZXNzOwogCiAJbmxtc3ZjX2ZyZWVfaG9zdF9yZXNvdXJjZXMoaG9zdCk7Ci0JbmxtX3JlbGVhc2VfaG9zdChob3N0KTsKKwlubG1zdmNfcmVsZWFzZV9ob3N0KGhvc3QpOwogCXJldHVybiBycGNfc3VjY2VzczsKIH0KIApkaWZmIC0tZ2l0IGEvZnMvbG9ja2Qvc3ZjbG9jay5jIGIvZnMvbG9ja2Qvc3ZjbG9jay5jCmluZGV4IGVmNTY1OWIuLjZlMzE2OTUgMTAwNjQ0Ci0tLSBhL2ZzL2xvY2tkL3N2Y2xvY2suYworKysgYi9mcy9sb2NrZC9zdmNsb2NrLmMKQEAgLTQ2LDYgKzQ2LDcgQEAKIHN0YXRpYyBpbnQgbmxtc3ZjX3NldGdyYW50YXJncyhzdHJ1Y3QgbmxtX3Jxc3QgKmNhbGwsIHN0cnVjdCBubG1fbG9jayAqbG9jayk7CiBzdGF0aWMgdm9pZCBubG1zdmNfZnJlZWdyYW50YXJncyhzdHJ1Y3QgbmxtX3Jxc3QgKmNhbGwpOwogc3RhdGljIGNvbnN0IHN0cnVjdCBycGNfY2FsbF9vcHMgbmxtc3ZjX2dyYW50X29wczsKK3N0YXRpYyBjb25zdCBjaGFyICpubG1kYmdfY29va2llMmEoY29uc3Qgc3RydWN0IG5sbV9jb29raWUgKmNvb2tpZSk7CiAKIC8qCiAgKiBUaGUgbGlzdCBvZiBibG9ja2VkIGxvY2tzIHRvIHJldHJ5CkBAIC0yMzMsNyArMjM0LDcgQEAKIGZhaWxlZF9mcmVlOgogCWtmcmVlKGJsb2NrKTsKIGZhaWxlZDoKLQlubG1fcmVsZWFzZV9jYWxsKGNhbGwpOworCW5sbXN2Y19yZWxlYXNlX2NhbGwoY2FsbCk7CiAJcmV0dXJuIE5VTEw7CiB9CiAKQEAgLTI2Niw3ICsyNjcsNyBAQAogCW11dGV4X3VubG9jaygmZmlsZS0+Zl9tdXRleCk7CiAKIAlubG1zdmNfZnJlZWdyYW50YXJncyhibG9jay0+Yl9jYWxsKTsKLQlubG1fcmVsZWFzZV9jYWxsKGJsb2NrLT5iX2NhbGwpOworCW5sbXN2Y19yZWxlYXNlX2NhbGwoYmxvY2stPmJfY2FsbCk7CiAJbmxtX3JlbGVhc2VfZmlsZShibG9jay0+Yl9maWxlKTsKIAlrZnJlZShibG9jay0+Yl9mbCk7CiAJa2ZyZWUoYmxvY2spOwpAQCAtOTM0LDMgKzkzNSwzMiBAQAogCiAJcmV0dXJuIHRpbWVvdXQ7CiB9CisKKyNpZmRlZiBSUENfREVCVUcKK3N0YXRpYyBjb25zdCBjaGFyICpubG1kYmdfY29va2llMmEoY29uc3Qgc3RydWN0IG5sbV9jb29raWUgKmNvb2tpZSkKK3sKKwkvKgorCSAqIFdlIGNhbiBnZXQgYXdheSB3aXRoIGEgc3RhdGljIGJ1ZmZlciBiZWNhdXNlIHdlJ3JlIG9ubHkKKwkgKiBjYWxsZWQgd2l0aCBCS0wgaGVsZC4KKwkgKi8KKwlzdGF0aWMgY2hhciBidWZbMipOTE1fTUFYQ09PS0lFTEVOKzFdOworCXVuc2lnbmVkIGludCBpLCBsZW4gPSBzaXplb2YoYnVmKTsKKwljaGFyICpwID0gYnVmOworCisJbGVuLS07CS8qIGFsbG93IGZvciB0cmFpbGluZyBcMCAqLworCWlmIChsZW4gPCAzKQorCQlyZXR1cm4gIj8/PyI7CisJZm9yIChpID0gMCA7IGkgPCBjb29raWUtPmxlbiA7IGkrKykgeworCQlpZiAobGVuIDwgMikgeworCQkJc3RyY3B5KHAtMywgIi4uLiIpOworCQkJYnJlYWs7CisJCX0KKwkJc3ByaW50ZihwLCAiJTAyeCIsIGNvb2tpZS0+ZGF0YVtpXSk7CisJCXAgKz0gMjsKKwkJbGVuIC09IDI7CisJfQorCSpwID0gJ1wwJzsKKworCXJldHVybiBidWY7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2ZzL2xvY2tkL3N2Y3Byb2MuYyBiL2ZzL2xvY2tkL3N2Y3Byb2MuYwppbmRleCAwY2FlYTUzLi5kMjdhYWIxIDEwMDY0NAotLS0gYS9mcy9sb2NrZC9zdmNwcm9jLmMKKysrIGIvZnMvbG9ja2Qvc3ZjcHJvYy5jCkBAIC04MCw3ICs4MCw3IEBACiAJcmV0dXJuIDA7CiAKIG5vX2xvY2tzOgotCW5sbV9yZWxlYXNlX2hvc3QoaG9zdCk7CisJbmxtc3ZjX3JlbGVhc2VfaG9zdChob3N0KTsKIAlpZiAoZXJyb3IpCiAJCXJldHVybiBlcnJvcjsKIAlyZXR1cm4gbmxtX2xja19kZW5pZWRfbm9sb2NrczsKQEAgLTEyMiw3ICsxMjIsNyBAQAogCQlkcHJpbnRrKCJsb2NrZDogVEVTVCAgICAgICAgICBzdGF0dXMgJWQgdmVycyAlZFxuIiwKIAkJCW50b2hsKHJlc3AtPnN0YXR1cyksIHJxc3RwLT5ycV92ZXJzKTsKIAotCW5sbV9yZWxlYXNlX2hvc3QoaG9zdCk7CisJbmxtc3ZjX3JlbGVhc2VfaG9zdChob3N0KTsKIAlubG1fcmVsZWFzZV9maWxlKGZpbGUpOwogCXJldHVybiByYzsKIH0KQEAgLTE2NCw3ICsxNjQsNyBAQAogCWVsc2UKIAkJZHByaW50aygibG9ja2Q6IExPQ0sgICAgICAgICBzdGF0dXMgJWRcbiIsIG50b2hsKHJlc3AtPnN0YXR1cykpOwogCi0JbmxtX3JlbGVhc2VfaG9zdChob3N0KTsKKwlubG1zdmNfcmVsZWFzZV9ob3N0KGhvc3QpOwogCW5sbV9yZWxlYXNlX2ZpbGUoZmlsZSk7CiAJcmV0dXJuIHJjOwogfQpAQCAtMTk0LDcgKzE5NCw3IEBACiAJcmVzcC0+c3RhdHVzID0gY2FzdF9zdGF0dXMobmxtc3ZjX2NhbmNlbF9ibG9ja2VkKGZpbGUsICZhcmdwLT5sb2NrKSk7CiAKIAlkcHJpbnRrKCJsb2NrZDogQ0FOQ0VMICAgICAgICBzdGF0dXMgJWRcbiIsIG50b2hsKHJlc3AtPnN0YXR1cykpOwotCW5sbV9yZWxlYXNlX2hvc3QoaG9zdCk7CisJbmxtc3ZjX3JlbGVhc2VfaG9zdChob3N0KTsKIAlubG1fcmVsZWFzZV9maWxlKGZpbGUpOwogCXJldHVybiBycGNfc3VjY2VzczsKIH0KQEAgLTIyNyw3ICsyMjcsNyBAQAogCXJlc3AtPnN0YXR1cyA9IGNhc3Rfc3RhdHVzKG5sbXN2Y191bmxvY2soZmlsZSwgJmFyZ3AtPmxvY2spKTsKIAogCWRwcmludGsoImxvY2tkOiBVTkxPQ0sgICAgICAgIHN0YXR1cyAlZFxuIiwgbnRvaGwocmVzcC0+c3RhdHVzKSk7Ci0JbmxtX3JlbGVhc2VfaG9zdChob3N0KTsKKwlubG1zdmNfcmVsZWFzZV9ob3N0KGhvc3QpOwogCW5sbV9yZWxlYXNlX2ZpbGUoZmlsZSk7CiAJcmV0dXJuIHJwY19zdWNjZXNzOwogfQpAQCAtMjU3LDkgKzI1NywxNyBAQAogCQkJLXRhc2stPnRrX3N0YXR1cyk7CiB9CiAKK3ZvaWQgbmxtc3ZjX3JlbGVhc2VfY2FsbChzdHJ1Y3QgbmxtX3Jxc3QgKmNhbGwpCit7CisJaWYgKCFhdG9taWNfZGVjX2FuZF90ZXN0KCZjYWxsLT5hX2NvdW50KSkKKwkJcmV0dXJuOworCW5sbXN2Y19yZWxlYXNlX2hvc3QoY2FsbC0+YV9ob3N0KTsKKwlrZnJlZShjYWxsKTsKK30KKwogc3RhdGljIHZvaWQgbmxtc3ZjX2NhbGxiYWNrX3JlbGVhc2Uodm9pZCAqZGF0YSkKIHsKLQlubG1fcmVsZWFzZV9jYWxsKGRhdGEpOworCW5sbXN2Y19yZWxlYXNlX2NhbGwoZGF0YSk7CiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcnBjX2NhbGxfb3BzIG5sbXN2Y19jYWxsYmFja19vcHMgPSB7CkBAIC0yOTEsNyArMjk5LDcgQEAKIAogCXN0YXQgPSBmdW5jKHJxc3RwLCBhcmdwLCAmY2FsbC0+YV9yZXMpOwogCWlmIChzdGF0ICE9IDApIHsKLQkJbmxtX3JlbGVhc2VfY2FsbChjYWxsKTsKKwkJbmxtc3ZjX3JlbGVhc2VfY2FsbChjYWxsKTsKIAkJcmV0dXJuIHN0YXQ7CiAJfQogCkBAIC0zNjYsNyArMzc0LDcgQEAKIAlyZXNwLT5zdGF0dXMgPSBjYXN0X3N0YXR1cyhubG1zdmNfc2hhcmVfZmlsZShob3N0LCBmaWxlLCBhcmdwKSk7CiAKIAlkcHJpbnRrKCJsb2NrZDogU0hBUkUgICAgICAgICBzdGF0dXMgJWRcbiIsIG50b2hsKHJlc3AtPnN0YXR1cykpOwotCW5sbV9yZWxlYXNlX2hvc3QoaG9zdCk7CisJbmxtc3ZjX3JlbGVhc2VfaG9zdChob3N0KTsKIAlubG1fcmVsZWFzZV9maWxlKGZpbGUpOwogCXJldHVybiBycGNfc3VjY2VzczsKIH0KQEAgLTM5OSw3ICs0MDcsNyBAQAogCXJlc3AtPnN0YXR1cyA9IGNhc3Rfc3RhdHVzKG5sbXN2Y191bnNoYXJlX2ZpbGUoaG9zdCwgZmlsZSwgYXJncCkpOwogCiAJZHByaW50aygibG9ja2Q6IFVOU0hBUkUgICAgICAgc3RhdHVzICVkXG4iLCBudG9obChyZXNwLT5zdGF0dXMpKTsKLQlubG1fcmVsZWFzZV9ob3N0KGhvc3QpOworCW5sbXN2Y19yZWxlYXNlX2hvc3QoaG9zdCk7CiAJbmxtX3JlbGVhc2VfZmlsZShmaWxlKTsKIAlyZXR1cm4gcnBjX3N1Y2Nlc3M7CiB9CkBAIC00MzEsNyArNDM5LDcgQEAKIAkJcmV0dXJuIHJwY19zdWNjZXNzOwogCiAJbmxtc3ZjX2ZyZWVfaG9zdF9yZXNvdXJjZXMoaG9zdCk7Ci0JbmxtX3JlbGVhc2VfaG9zdChob3N0KTsKKwlubG1zdmNfcmVsZWFzZV9ob3N0KGhvc3QpOwogCXJldHVybiBycGNfc3VjY2VzczsKIH0KIApkaWZmIC0tZ2l0IGEvZnMvbG9ja2QveGRyLmMgYi9mcy9sb2NrZC94ZHIuYwppbmRleCBiNTgzYWIwLi45NjQ2NjZjIDEwMDY0NAotLS0gYS9mcy9sb2NrZC94ZHIuYworKysgYi9mcy9sb2NrZC94ZHIuYwpAQCAtMTQ5LDM3ICsxNDksNiBAQAogfQogCiAvKgotICogRW5jb2RlIGEgbG9jayBhcyBwYXJ0IG9mIGFuIE5MTSBjYWxsCi0gKi8KLXN0YXRpYyBfX2JlMzIgKgotbmxtX2VuY29kZV9sb2NrKF9fYmUzMiAqcCwgc3RydWN0IG5sbV9sb2NrICpsb2NrKQotewotCXN0cnVjdCBmaWxlX2xvY2sJKmZsID0gJmxvY2stPmZsOwotCV9fczMyCQkJc3RhcnQsIGxlbjsKLQotCWlmICghKHAgPSB4ZHJfZW5jb2RlX3N0cmluZyhwLCBsb2NrLT5jYWxsZXIpKQotCSB8fCAhKHAgPSBubG1fZW5jb2RlX2ZoKHAsICZsb2NrLT5maCkpCi0JIHx8ICEocCA9IG5sbV9lbmNvZGVfb2gocCwgJmxvY2stPm9oKSkpCi0JCXJldHVybiBOVUxMOwotCi0JaWYgKGZsLT5mbF9zdGFydCA+IE5MTV9PRkZTRVRfTUFYCi0JIHx8IChmbC0+ZmxfZW5kID4gTkxNX09GRlNFVF9NQVggJiYgZmwtPmZsX2VuZCAhPSBPRkZTRVRfTUFYKSkKLQkJcmV0dXJuIE5VTEw7Ci0KLQlzdGFydCA9IGxvZmZfdF90b19zMzIoZmwtPmZsX3N0YXJ0KTsKLQlpZiAoZmwtPmZsX2VuZCA9PSBPRkZTRVRfTUFYKQotCQlsZW4gPSAwOwotCWVsc2UKLQkJbGVuID0gbG9mZl90X3RvX3MzMihmbC0+ZmxfZW5kIC0gZmwtPmZsX3N0YXJ0ICsgMSk7Ci0KLQkqcCsrID0gaHRvbmwobG9jay0+c3ZpZCk7Ci0JKnArKyA9IGh0b25sKHN0YXJ0KTsKLQkqcCsrID0gaHRvbmwobGVuKTsKLQotCXJldHVybiBwOwotfQotCi0vKgogICogRW5jb2RlIHJlc3VsdCBvZiBhIFRFU1QvVEVTVF9NU0cgY2FsbAogICovCiBzdGF0aWMgX19iZTMyICoKQEAgLTM3MiwyNTkgKzM0MSwzIEBACiB7CiAJcmV0dXJuIHhkcl9yZXNzaXplX2NoZWNrKHJxc3RwLCBwKTsKIH0KLQotLyoKLSAqIE5vdywgdGhlIGNsaWVudCBzaWRlIFhEUiBmdW5jdGlvbnMKLSAqLwotI2lmZGVmIE5MTUNMTlRfU1VQUE9SVF9TSEFSRVMKLXN0YXRpYyBpbnQKLW5sbWNsdF9kZWNvZGVfdm9pZChzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdTMyICpwLCB2b2lkICpwdHIpCi17Ci0JcmV0dXJuIDA7Ci19Ci0jZW5kaWYKLQotc3RhdGljIGludAotbmxtY2x0X2VuY29kZV90ZXN0YXJncyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLCBubG1fYXJncyAqYXJncCkKLXsKLQlzdHJ1Y3QgbmxtX2xvY2sJKmxvY2sgPSAmYXJncC0+bG9jazsKLQotCWlmICghKHAgPSBubG1fZW5jb2RlX2Nvb2tpZShwLCAmYXJncC0+Y29va2llKSkpCi0JCXJldHVybiAtRUlPOwotCSpwKysgPSAobG9jay0+ZmwuZmxfdHlwZSA9PSBGX1dSTENLKT8geGRyX29uZSA6IHhkcl96ZXJvOwotCWlmICghKHAgPSBubG1fZW5jb2RlX2xvY2socCwgbG9jaykpKQotCQlyZXR1cm4gLUVJTzsKLQlyZXEtPnJxX3NsZW4gPSB4ZHJfYWRqdXN0X2lvdmVjKHJlcS0+cnFfc3ZlYywgcCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQKLW5sbWNsdF9kZWNvZGVfdGVzdHJlcyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLCBzdHJ1Y3QgbmxtX3JlcyAqcmVzcCkKLXsKLQlpZiAoIShwID0gbmxtX2RlY29kZV9jb29raWUocCwgJnJlc3AtPmNvb2tpZSkpKQotCQlyZXR1cm4gLUVJTzsKLQlyZXNwLT5zdGF0dXMgPSAqcCsrOwotCWlmIChyZXNwLT5zdGF0dXMgPT0gbmxtX2xja19kZW5pZWQpIHsKLQkJc3RydWN0IGZpbGVfbG9jawkqZmwgPSAmcmVzcC0+bG9jay5mbDsKLQkJdTMyCQkJZXhjbDsKLQkJczMyCQkJc3RhcnQsIGxlbiwgZW5kOwotCi0JCW1lbXNldCgmcmVzcC0+bG9jaywgMCwgc2l6ZW9mKHJlc3AtPmxvY2spKTsKLQkJbG9ja3NfaW5pdF9sb2NrKGZsKTsKLQkJZXhjbCA9IG50b2hsKCpwKyspOwotCQlyZXNwLT5sb2NrLnN2aWQgPSBudG9obCgqcCsrKTsKLQkJZmwtPmZsX3BpZCA9IChwaWRfdClyZXNwLT5sb2NrLnN2aWQ7Ci0JCWlmICghKHAgPSBubG1fZGVjb2RlX29oKHAsICZyZXNwLT5sb2NrLm9oKSkpCi0JCQlyZXR1cm4gLUVJTzsKLQotCQlmbC0+ZmxfZmxhZ3MgPSBGTF9QT1NJWDsKLQkJZmwtPmZsX3R5cGUgID0gZXhjbD8gRl9XUkxDSyA6IEZfUkRMQ0s7Ci0JCXN0YXJ0ID0gbnRvaGwoKnArKyk7Ci0JCWxlbiA9IG50b2hsKCpwKyspOwotCQllbmQgPSBzdGFydCArIGxlbiAtIDE7Ci0KLQkJZmwtPmZsX3N0YXJ0ID0gczMyX3RvX2xvZmZfdChzdGFydCk7Ci0JCWlmIChsZW4gPT0gMCB8fCBlbmQgPCAwKQotCQkJZmwtPmZsX2VuZCA9IE9GRlNFVF9NQVg7Ci0JCWVsc2UKLQkJCWZsLT5mbF9lbmQgPSBzMzJfdG9fbG9mZl90KGVuZCk7Ci0JfQotCXJldHVybiAwOwotfQotCi0KLXN0YXRpYyBpbnQKLW5sbWNsdF9lbmNvZGVfbG9ja2FyZ3Moc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgbmxtX2FyZ3MgKmFyZ3ApCi17Ci0Jc3RydWN0IG5sbV9sb2NrCSpsb2NrID0gJmFyZ3AtPmxvY2s7Ci0KLQlpZiAoIShwID0gbmxtX2VuY29kZV9jb29raWUocCwgJmFyZ3AtPmNvb2tpZSkpKQotCQlyZXR1cm4gLUVJTzsKLQkqcCsrID0gYXJncC0+YmxvY2s/IHhkcl9vbmUgOiB4ZHJfemVybzsKLQkqcCsrID0gKGxvY2stPmZsLmZsX3R5cGUgPT0gRl9XUkxDSyk/IHhkcl9vbmUgOiB4ZHJfemVybzsKLQlpZiAoIShwID0gbmxtX2VuY29kZV9sb2NrKHAsIGxvY2spKSkKLQkJcmV0dXJuIC1FSU87Ci0JKnArKyA9IGFyZ3AtPnJlY2xhaW0/IHhkcl9vbmUgOiB4ZHJfemVybzsKLQkqcCsrID0gaHRvbmwoYXJncC0+c3RhdGUpOwotCXJlcS0+cnFfc2xlbiA9IHhkcl9hZGp1c3RfaW92ZWMocmVxLT5ycV9zdmVjLCBwKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludAotbmxtY2x0X2VuY29kZV9jYW5jYXJncyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLCBubG1fYXJncyAqYXJncCkKLXsKLQlzdHJ1Y3QgbmxtX2xvY2sJKmxvY2sgPSAmYXJncC0+bG9jazsKLQotCWlmICghKHAgPSBubG1fZW5jb2RlX2Nvb2tpZShwLCAmYXJncC0+Y29va2llKSkpCi0JCXJldHVybiAtRUlPOwotCSpwKysgPSBhcmdwLT5ibG9jaz8geGRyX29uZSA6IHhkcl96ZXJvOwotCSpwKysgPSAobG9jay0+ZmwuZmxfdHlwZSA9PSBGX1dSTENLKT8geGRyX29uZSA6IHhkcl96ZXJvOwotCWlmICghKHAgPSBubG1fZW5jb2RlX2xvY2socCwgbG9jaykpKQotCQlyZXR1cm4gLUVJTzsKLQlyZXEtPnJxX3NsZW4gPSB4ZHJfYWRqdXN0X2lvdmVjKHJlcS0+cnFfc3ZlYywgcCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQKLW5sbWNsdF9lbmNvZGVfdW5sb2NrYXJncyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLCBubG1fYXJncyAqYXJncCkKLXsKLQlzdHJ1Y3QgbmxtX2xvY2sJKmxvY2sgPSAmYXJncC0+bG9jazsKLQotCWlmICghKHAgPSBubG1fZW5jb2RlX2Nvb2tpZShwLCAmYXJncC0+Y29va2llKSkpCi0JCXJldHVybiAtRUlPOwotCWlmICghKHAgPSBubG1fZW5jb2RlX2xvY2socCwgbG9jaykpKQotCQlyZXR1cm4gLUVJTzsKLQlyZXEtPnJxX3NsZW4gPSB4ZHJfYWRqdXN0X2lvdmVjKHJlcS0+cnFfc3ZlYywgcCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQKLW5sbWNsdF9lbmNvZGVfcmVzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsIHN0cnVjdCBubG1fcmVzICpyZXNwKQotewotCWlmICghKHAgPSBubG1fZW5jb2RlX2Nvb2tpZShwLCAmcmVzcC0+Y29va2llKSkpCi0JCXJldHVybiAtRUlPOwotCSpwKysgPSByZXNwLT5zdGF0dXM7Ci0JcmVxLT5ycV9zbGVuID0geGRyX2FkanVzdF9pb3ZlYyhyZXEtPnJxX3N2ZWMsIHApOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50Ci1ubG1jbHRfZW5jb2RlX3Rlc3RyZXMoc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgc3RydWN0IG5sbV9yZXMgKnJlc3ApCi17Ci0JaWYgKCEocCA9IG5sbV9lbmNvZGVfdGVzdHJlcyhwLCByZXNwKSkpCi0JCXJldHVybiAtRUlPOwotCXJlcS0+cnFfc2xlbiA9IHhkcl9hZGp1c3RfaW92ZWMocmVxLT5ycV9zdmVjLCBwKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludAotbmxtY2x0X2RlY29kZV9yZXMoc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgc3RydWN0IG5sbV9yZXMgKnJlc3ApCi17Ci0JaWYgKCEocCA9IG5sbV9kZWNvZGVfY29va2llKHAsICZyZXNwLT5jb29raWUpKSkKLQkJcmV0dXJuIC1FSU87Ci0JcmVzcC0+c3RhdHVzID0gKnArKzsKLQlyZXR1cm4gMDsKLX0KLQotI2lmIChOTE1DTE5UX09IU0laRSA+IFhEUl9NQVhfTkVUT0JKKQotIyAgZXJyb3IgIk5MTSBob3N0IG5hbWUgY2Fubm90IGJlIGxhcmdlciB0aGFuIFhEUl9NQVhfTkVUT0JKISIKLSNlbmRpZgotCi0vKgotICogQnVmZmVyIHJlcXVpcmVtZW50cyBmb3IgTkxNCi0gKi8KLSNkZWZpbmUgTkxNX3ZvaWRfc3oJCTAKLSNkZWZpbmUgTkxNX2Nvb2tpZV9zegkJMStYRFJfUVVBRExFTihOTE1fTUFYQ09PS0lFTEVOKQotI2RlZmluZSBOTE1fY2FsbGVyX3N6CQkxK1hEUl9RVUFETEVOKE5MTUNMTlRfT0hTSVpFKQotI2RlZmluZSBOTE1fb3duZXJfc3oJCTErWERSX1FVQURMRU4oTkxNQ0xOVF9PSFNJWkUpCi0jZGVmaW5lIE5MTV9maGFuZGxlX3N6CQkxK1hEUl9RVUFETEVOKE5GUzJfRkhTSVpFKQotI2RlZmluZSBOTE1fbG9ja19zegkJMytOTE1fY2FsbGVyX3N6K05MTV9vd25lcl9zeitOTE1fZmhhbmRsZV9zegotI2RlZmluZSBOTE1faG9sZGVyX3N6CQk0K05MTV9vd25lcl9zegotCi0jZGVmaW5lIE5MTV90ZXN0YXJnc19zegkJTkxNX2Nvb2tpZV9zeisxK05MTV9sb2NrX3N6Ci0jZGVmaW5lIE5MTV9sb2NrYXJnc19zegkJTkxNX2Nvb2tpZV9zeis0K05MTV9sb2NrX3N6Ci0jZGVmaW5lIE5MTV9jYW5jYXJnc19zegkJTkxNX2Nvb2tpZV9zeisyK05MTV9sb2NrX3N6Ci0jZGVmaW5lIE5MTV91bmxvY2thcmdzX3N6CU5MTV9jb29raWVfc3orTkxNX2xvY2tfc3oKLQotI2RlZmluZSBOTE1fdGVzdHJlc19zegkJTkxNX2Nvb2tpZV9zeisxK05MTV9ob2xkZXJfc3oKLSNkZWZpbmUgTkxNX3Jlc19zegkJTkxNX2Nvb2tpZV9zeisxCi0jZGVmaW5lIE5MTV9ub3JlcF9zegkJMAotCi0vKgotICogRm9yIE5MTSwgYSB2b2lkIHByb2NlZHVyZSByZWFsbHkgcmV0dXJucyBub3RoaW5nCi0gKi8KLSNkZWZpbmUgbmxtY2x0X2RlY29kZV9ub3JlcAlOVUxMCi0KLSNkZWZpbmUgUFJPQyhwcm9jLCBhcmd0eXBlLCByZXN0eXBlKQlcCi1bTkxNUFJPQ18jI3Byb2NdID0gewkJCQkJCQlcCi0JLnBfcHJvYyAgICAgID0gTkxNUFJPQ18jI3Byb2MsCQkJCQlcCi0JLnBfZW5jb2RlICAgID0gKGt4ZHJwcm9jX3QpIG5sbWNsdF9lbmNvZGVfIyNhcmd0eXBlLAkJXAotCS5wX2RlY29kZSAgICA9IChreGRycHJvY190KSBubG1jbHRfZGVjb2RlXyMjcmVzdHlwZSwJCVwKLQkucF9hcmdsZW4gICAgPSBOTE1fIyNhcmd0eXBlIyNfc3osCQkJCVwKLQkucF9yZXBsZW4gICAgPSBOTE1fIyNyZXN0eXBlIyNfc3osCQkJCVwKLQkucF9zdGF0aWR4ICAgPSBOTE1QUk9DXyMjcHJvYywJCQkJCVwKLQkucF9uYW1lICAgICAgPSAjcHJvYywJCQkJCQlcCi0JfQotCi1zdGF0aWMgc3RydWN0IHJwY19wcm9jaW5mbwlubG1fcHJvY2VkdXJlc1tdID0gewotICAgIFBST0MoVEVTVCwJCXRlc3RhcmdzLAl0ZXN0cmVzKSwKLSAgICBQUk9DKExPQ0ssCQlsb2NrYXJncywJcmVzKSwKLSAgICBQUk9DKENBTkNFTCwJY2FuY2FyZ3MsCXJlcyksCi0gICAgUFJPQyhVTkxPQ0ssCXVubG9ja2FyZ3MsCXJlcyksCi0gICAgUFJPQyhHUkFOVEVELAl0ZXN0YXJncywJcmVzKSwKLSAgICBQUk9DKFRFU1RfTVNHLAl0ZXN0YXJncywJbm9yZXApLAotICAgIFBST0MoTE9DS19NU0csCWxvY2thcmdzLAlub3JlcCksCi0gICAgUFJPQyhDQU5DRUxfTVNHLAljYW5jYXJncywJbm9yZXApLAotICAgIFBST0MoVU5MT0NLX01TRywJdW5sb2NrYXJncywJbm9yZXApLAotICAgIFBST0MoR1JBTlRFRF9NU0csCXRlc3RhcmdzLAlub3JlcCksCi0gICAgUFJPQyhURVNUX1JFUywJdGVzdHJlcywJbm9yZXApLAotICAgIFBST0MoTE9DS19SRVMsCXJlcywJCW5vcmVwKSwKLSAgICBQUk9DKENBTkNFTF9SRVMsCXJlcywJCW5vcmVwKSwKLSAgICBQUk9DKFVOTE9DS19SRVMsCXJlcywJCW5vcmVwKSwKLSAgICBQUk9DKEdSQU5URURfUkVTLAlyZXMsCQlub3JlcCksCi0jaWZkZWYgTkxNQ0xOVF9TVVBQT1JUX1NIQVJFUwotICAgIFBST0MoU0hBUkUsCQlzaGFyZWFyZ3MsCXNoYXJlcmVzKSwKLSAgICBQUk9DKFVOU0hBUkUsCXNoYXJlYXJncywJc2hhcmVyZXMpLAotICAgIFBST0MoTk1fTE9DSywJbG9ja2FyZ3MsCXJlcyksCi0gICAgUFJPQyhGUkVFX0FMTCwJbm90aWZ5LAkJdm9pZCksCi0jZW5kaWYKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcnBjX3ZlcnNpb24JbmxtX3ZlcnNpb24xID0gewotCQkubnVtYmVyCQk9IDEsCi0JCS5ucnByb2NzCT0gMTYsCi0JCS5wcm9jcwkJPSBubG1fcHJvY2VkdXJlcywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcnBjX3ZlcnNpb24JbmxtX3ZlcnNpb24zID0gewotCQkubnVtYmVyCQk9IDMsCi0JCS5ucnByb2NzCT0gMjQsCi0JCS5wcm9jcwkJPSBubG1fcHJvY2VkdXJlcywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcnBjX3ZlcnNpb24gKglubG1fdmVyc2lvbnNbXSA9IHsKLQlbMV0gPSAmbmxtX3ZlcnNpb24xLAotCVszXSA9ICZubG1fdmVyc2lvbjMsCi0jaWZkZWYgCUNPTkZJR19MT0NLRF9WNAotCVs0XSA9ICZubG1fdmVyc2lvbjQsCi0jZW5kaWYKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcnBjX3N0YXQJCW5sbV9zdGF0czsKLQotc3RydWN0IHJwY19wcm9ncmFtCQlubG1fcHJvZ3JhbSA9IHsKLQkJLm5hbWUJCT0gImxvY2tkIiwKLQkJLm51bWJlcgkJPSBOTE1fUFJPR1JBTSwKLQkJLm5ydmVycwkJPSBBUlJBWV9TSVpFKG5sbV92ZXJzaW9ucyksCi0JCS52ZXJzaW9uCT0gbmxtX3ZlcnNpb25zLAotCQkuc3RhdHMJCT0gJm5sbV9zdGF0cywKLX07Ci0KLSNpZmRlZiBSUENfREVCVUcKLWNvbnN0IGNoYXIgKm5sbWRiZ19jb29raWUyYShjb25zdCBzdHJ1Y3QgbmxtX2Nvb2tpZSAqY29va2llKQotewotCS8qCi0JICogV2UgY2FuIGdldCBhd2F5IHdpdGggYSBzdGF0aWMgYnVmZmVyIGJlY2F1c2Ugd2UncmUgb25seQotCSAqIGNhbGxlZCB3aXRoIEJLTCBoZWxkLgotCSAqLwotCXN0YXRpYyBjaGFyIGJ1ZlsyKk5MTV9NQVhDT09LSUVMRU4rMV07Ci0JdW5zaWduZWQgaW50IGksIGxlbiA9IHNpemVvZihidWYpOwotCWNoYXIgKnAgPSBidWY7Ci0KLQlsZW4tLTsJLyogYWxsb3cgZm9yIHRyYWlsaW5nIFwwICovCi0JaWYgKGxlbiA8IDMpCi0JCXJldHVybiAiPz8/IjsKLQlmb3IgKGkgPSAwIDsgaSA8IGNvb2tpZS0+bGVuIDsgaSsrKSB7Ci0JCWlmIChsZW4gPCAyKSB7Ci0JCQlzdHJjcHkocC0zLCAiLi4uIik7Ci0JCQlicmVhazsKLQkJfQotCQlzcHJpbnRmKHAsICIlMDJ4IiwgY29va2llLT5kYXRhW2ldKTsKLQkJcCArPSAyOwotCQlsZW4gLT0gMjsKLQl9Ci0JKnAgPSAnXDAnOwotCi0JcmV0dXJuIGJ1ZjsKLX0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZnMvbG9ja2QveGRyNC5jIGIvZnMvbG9ja2QveGRyNC5jCmluZGV4IGFkOWRiYmMuLmRmYTQ3ODkgMTAwNjQ0Ci0tLSBhL2ZzL2xvY2tkL3hkcjQuYworKysgYi9mcy9sb2NrZC94ZHI0LmMKQEAgLTkzLDE1ICs5Myw2IEBACiAJcmV0dXJuIHAgKyBYRFJfUVVBRExFTihmLT5zaXplKTsKIH0KIAotc3RhdGljIF9fYmUzMiAqCi1ubG00X2VuY29kZV9maChfX2JlMzIgKnAsIHN0cnVjdCBuZnNfZmggKmYpCi17Ci0JKnArKyA9IGh0b25sKGYtPnNpemUpOwotCWlmIChmLT5zaXplKSBwW1hEUl9RVUFETEVOKGYtPnNpemUpLTFdID0gMDsgLyogZG9uJ3QgbGVhayBhbnl0aGluZyAqLwotCW1lbWNweShwLCBmLT5kYXRhLCBmLT5zaXplKTsKLQlyZXR1cm4gcCArIFhEUl9RVUFETEVOKGYtPnNpemUpOwotfQotCiAvKgogICogRW5jb2RlIGFuZCBkZWNvZGUgb3duZXIgaGFuZGxlCiAgKi8KQEAgLTExMiwxMiArMTAzLDYgQEAKIH0KIAogc3RhdGljIF9fYmUzMiAqCi1ubG00X2VuY29kZV9vaChfX2JlMzIgKnAsIHN0cnVjdCB4ZHJfbmV0b2JqICpvaCkKLXsKLQlyZXR1cm4geGRyX2VuY29kZV9uZXRvYmoocCwgb2gpOwotfQotCi1zdGF0aWMgX19iZTMyICoKIG5sbTRfZGVjb2RlX2xvY2soX19iZTMyICpwLCBzdHJ1Y3QgbmxtX2xvY2sgKmxvY2spCiB7CiAJc3RydWN0IGZpbGVfbG9jawkqZmwgPSAmbG9jay0+Zmw7CkBAIC0xNTAsMzggKzEzNSw2IEBACiB9CiAKIC8qCi0gKiBFbmNvZGUgYSBsb2NrIGFzIHBhcnQgb2YgYW4gTkxNIGNhbGwKLSAqLwotc3RhdGljIF9fYmUzMiAqCi1ubG00X2VuY29kZV9sb2NrKF9fYmUzMiAqcCwgc3RydWN0IG5sbV9sb2NrICpsb2NrKQotewotCXN0cnVjdCBmaWxlX2xvY2sJKmZsID0gJmxvY2stPmZsOwotCV9fczY0CQkJc3RhcnQsIGxlbjsKLQotCWlmICghKHAgPSB4ZHJfZW5jb2RlX3N0cmluZyhwLCBsb2NrLT5jYWxsZXIpKQotCSB8fCAhKHAgPSBubG00X2VuY29kZV9maChwLCAmbG9jay0+ZmgpKQotCSB8fCAhKHAgPSBubG00X2VuY29kZV9vaChwLCAmbG9jay0+b2gpKSkKLQkJcmV0dXJuIE5VTEw7Ci0KLQlpZiAoZmwtPmZsX3N0YXJ0ID4gTkxNNF9PRkZTRVRfTUFYCi0JIHx8IChmbC0+ZmxfZW5kID4gTkxNNF9PRkZTRVRfTUFYICYmIGZsLT5mbF9lbmQgIT0gT0ZGU0VUX01BWCkpCi0JCXJldHVybiBOVUxMOwotCi0JKnArKyA9IGh0b25sKGxvY2stPnN2aWQpOwotCi0Jc3RhcnQgPSBsb2ZmX3RfdG9fczY0KGZsLT5mbF9zdGFydCk7Ci0JaWYgKGZsLT5mbF9lbmQgPT0gT0ZGU0VUX01BWCkKLQkJbGVuID0gMDsKLQllbHNlCi0JCWxlbiA9IGxvZmZfdF90b19zNjQoZmwtPmZsX2VuZCAtIGZsLT5mbF9zdGFydCArIDEpOwotCi0JcCA9IHhkcl9lbmNvZGVfaHlwZXIocCwgc3RhcnQpOwotCXAgPSB4ZHJfZW5jb2RlX2h5cGVyKHAsIGxlbik7Ci0KLQlyZXR1cm4gcDsKLX0KLQotLyoKICAqIEVuY29kZSByZXN1bHQgb2YgYSBURVNUL1RFU1RfTVNHIGNhbGwKICAqLwogc3RhdGljIF9fYmUzMiAqCkBAIC0zNzksMjExICszMzIsMyBAQAogewogCXJldHVybiB4ZHJfcmVzc2l6ZV9jaGVjayhycXN0cCwgcCk7CiB9Ci0KLS8qCi0gKiBOb3csIHRoZSBjbGllbnQgc2lkZSBYRFIgZnVuY3Rpb25zCi0gKi8KLSNpZmRlZiBOTE1DTE5UX1NVUFBPUlRfU0hBUkVTCi1zdGF0aWMgaW50Ci1ubG00Y2x0X2RlY29kZV92b2lkKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsIHZvaWQgKnB0cikKLXsKLQlyZXR1cm4gMDsKLX0KLSNlbmRpZgotCi1zdGF0aWMgaW50Ci1ubG00Y2x0X2VuY29kZV90ZXN0YXJncyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLCBubG1fYXJncyAqYXJncCkKLXsKLQlzdHJ1Y3QgbmxtX2xvY2sJKmxvY2sgPSAmYXJncC0+bG9jazsKLQotCWlmICghKHAgPSBubG00X2VuY29kZV9jb29raWUocCwgJmFyZ3AtPmNvb2tpZSkpKQotCQlyZXR1cm4gLUVJTzsKLQkqcCsrID0gKGxvY2stPmZsLmZsX3R5cGUgPT0gRl9XUkxDSyk/IHhkcl9vbmUgOiB4ZHJfemVybzsKLQlpZiAoIShwID0gbmxtNF9lbmNvZGVfbG9jayhwLCBsb2NrKSkpCi0JCXJldHVybiAtRUlPOwotCXJlcS0+cnFfc2xlbiA9IHhkcl9hZGp1c3RfaW92ZWMocmVxLT5ycV9zdmVjLCBwKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludAotbmxtNGNsdF9kZWNvZGVfdGVzdHJlcyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLCBzdHJ1Y3QgbmxtX3JlcyAqcmVzcCkKLXsKLQlpZiAoIShwID0gbmxtNF9kZWNvZGVfY29va2llKHAsICZyZXNwLT5jb29raWUpKSkKLQkJcmV0dXJuIC1FSU87Ci0JcmVzcC0+c3RhdHVzID0gKnArKzsKLQlpZiAocmVzcC0+c3RhdHVzID09IG5sbV9sY2tfZGVuaWVkKSB7Ci0JCXN0cnVjdCBmaWxlX2xvY2sJKmZsID0gJnJlc3AtPmxvY2suZmw7Ci0JCXUzMgkJCWV4Y2w7Ci0JCV9fdTY0CQkJc3RhcnQsIGxlbjsKLQkJX19zNjQJCQllbmQ7Ci0KLQkJbWVtc2V0KCZyZXNwLT5sb2NrLCAwLCBzaXplb2YocmVzcC0+bG9jaykpOwotCQlsb2Nrc19pbml0X2xvY2soZmwpOwotCQlleGNsID0gbnRvaGwoKnArKyk7Ci0JCXJlc3AtPmxvY2suc3ZpZCA9IG50b2hsKCpwKyspOwotCQlmbC0+ZmxfcGlkID0gKHBpZF90KXJlc3AtPmxvY2suc3ZpZDsKLQkJaWYgKCEocCA9IG5sbTRfZGVjb2RlX29oKHAsICZyZXNwLT5sb2NrLm9oKSkpCi0JCQlyZXR1cm4gLUVJTzsKLQotCQlmbC0+ZmxfZmxhZ3MgPSBGTF9QT1NJWDsKLQkJZmwtPmZsX3R5cGUgID0gZXhjbD8gRl9XUkxDSyA6IEZfUkRMQ0s7Ci0JCXAgPSB4ZHJfZGVjb2RlX2h5cGVyKHAsICZzdGFydCk7Ci0JCXAgPSB4ZHJfZGVjb2RlX2h5cGVyKHAsICZsZW4pOwotCQllbmQgPSBzdGFydCArIGxlbiAtIDE7Ci0KLQkJZmwtPmZsX3N0YXJ0ID0gczY0X3RvX2xvZmZfdChzdGFydCk7Ci0JCWlmIChsZW4gPT0gMCB8fCBlbmQgPCAwKQotCQkJZmwtPmZsX2VuZCA9IE9GRlNFVF9NQVg7Ci0JCWVsc2UKLQkJCWZsLT5mbF9lbmQgPSBzNjRfdG9fbG9mZl90KGVuZCk7Ci0JfQotCXJldHVybiAwOwotfQotCi0KLXN0YXRpYyBpbnQKLW5sbTRjbHRfZW5jb2RlX2xvY2thcmdzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsIG5sbV9hcmdzICphcmdwKQotewotCXN0cnVjdCBubG1fbG9jawkqbG9jayA9ICZhcmdwLT5sb2NrOwotCi0JaWYgKCEocCA9IG5sbTRfZW5jb2RlX2Nvb2tpZShwLCAmYXJncC0+Y29va2llKSkpCi0JCXJldHVybiAtRUlPOwotCSpwKysgPSBhcmdwLT5ibG9jaz8geGRyX29uZSA6IHhkcl96ZXJvOwotCSpwKysgPSAobG9jay0+ZmwuZmxfdHlwZSA9PSBGX1dSTENLKT8geGRyX29uZSA6IHhkcl96ZXJvOwotCWlmICghKHAgPSBubG00X2VuY29kZV9sb2NrKHAsIGxvY2spKSkKLQkJcmV0dXJuIC1FSU87Ci0JKnArKyA9IGFyZ3AtPnJlY2xhaW0/IHhkcl9vbmUgOiB4ZHJfemVybzsKLQkqcCsrID0gaHRvbmwoYXJncC0+c3RhdGUpOwotCXJlcS0+cnFfc2xlbiA9IHhkcl9hZGp1c3RfaW92ZWMocmVxLT5ycV9zdmVjLCBwKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludAotbmxtNGNsdF9lbmNvZGVfY2FuY2FyZ3Moc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgbmxtX2FyZ3MgKmFyZ3ApCi17Ci0Jc3RydWN0IG5sbV9sb2NrCSpsb2NrID0gJmFyZ3AtPmxvY2s7Ci0KLQlpZiAoIShwID0gbmxtNF9lbmNvZGVfY29va2llKHAsICZhcmdwLT5jb29raWUpKSkKLQkJcmV0dXJuIC1FSU87Ci0JKnArKyA9IGFyZ3AtPmJsb2NrPyB4ZHJfb25lIDogeGRyX3plcm87Ci0JKnArKyA9IChsb2NrLT5mbC5mbF90eXBlID09IEZfV1JMQ0spPyB4ZHJfb25lIDogeGRyX3plcm87Ci0JaWYgKCEocCA9IG5sbTRfZW5jb2RlX2xvY2socCwgbG9jaykpKQotCQlyZXR1cm4gLUVJTzsKLQlyZXEtPnJxX3NsZW4gPSB4ZHJfYWRqdXN0X2lvdmVjKHJlcS0+cnFfc3ZlYywgcCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQKLW5sbTRjbHRfZW5jb2RlX3VubG9ja2FyZ3Moc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgbmxtX2FyZ3MgKmFyZ3ApCi17Ci0Jc3RydWN0IG5sbV9sb2NrCSpsb2NrID0gJmFyZ3AtPmxvY2s7Ci0KLQlpZiAoIShwID0gbmxtNF9lbmNvZGVfY29va2llKHAsICZhcmdwLT5jb29raWUpKSkKLQkJcmV0dXJuIC1FSU87Ci0JaWYgKCEocCA9IG5sbTRfZW5jb2RlX2xvY2socCwgbG9jaykpKQotCQlyZXR1cm4gLUVJTzsKLQlyZXEtPnJxX3NsZW4gPSB4ZHJfYWRqdXN0X2lvdmVjKHJlcS0+cnFfc3ZlYywgcCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQKLW5sbTRjbHRfZW5jb2RlX3JlcyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLCBzdHJ1Y3QgbmxtX3JlcyAqcmVzcCkKLXsKLQlpZiAoIShwID0gbmxtNF9lbmNvZGVfY29va2llKHAsICZyZXNwLT5jb29raWUpKSkKLQkJcmV0dXJuIC1FSU87Ci0JKnArKyA9IHJlc3AtPnN0YXR1czsKLQlyZXEtPnJxX3NsZW4gPSB4ZHJfYWRqdXN0X2lvdmVjKHJlcS0+cnFfc3ZlYywgcCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQKLW5sbTRjbHRfZW5jb2RlX3Rlc3RyZXMoc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgc3RydWN0IG5sbV9yZXMgKnJlc3ApCi17Ci0JaWYgKCEocCA9IG5sbTRfZW5jb2RlX3Rlc3RyZXMocCwgcmVzcCkpKQotCQlyZXR1cm4gLUVJTzsKLQlyZXEtPnJxX3NsZW4gPSB4ZHJfYWRqdXN0X2lvdmVjKHJlcS0+cnFfc3ZlYywgcCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQKLW5sbTRjbHRfZGVjb2RlX3JlcyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLCBzdHJ1Y3QgbmxtX3JlcyAqcmVzcCkKLXsKLQlpZiAoIShwID0gbmxtNF9kZWNvZGVfY29va2llKHAsICZyZXNwLT5jb29raWUpKSkKLQkJcmV0dXJuIC1FSU87Ci0JcmVzcC0+c3RhdHVzID0gKnArKzsKLQlyZXR1cm4gMDsKLX0KLQotI2lmIChOTE1DTE5UX09IU0laRSA+IFhEUl9NQVhfTkVUT0JKKQotIyAgZXJyb3IgIk5MTSBob3N0IG5hbWUgY2Fubm90IGJlIGxhcmdlciB0aGFuIFhEUl9NQVhfTkVUT0JKISIKLSNlbmRpZgotCi0jaWYgKE5MTUNMTlRfT0hTSVpFID4gTkxNX01BWFNUUkxFTikKLSMgIGVycm9yICJOTE0gaG9zdCBuYW1lIGNhbm5vdCBiZSBsYXJnZXIgdGhhbiBOTE0ncyBtYXhpbXVtIHN0cmluZyBsZW5ndGghIgotI2VuZGlmCi0KLS8qCi0gKiBCdWZmZXIgcmVxdWlyZW1lbnRzIGZvciBOTE0KLSAqLwotI2RlZmluZSBOTE00X3ZvaWRfc3oJCTAKLSNkZWZpbmUgTkxNNF9jb29raWVfc3oJCTErWERSX1FVQURMRU4oTkxNX01BWENPT0tJRUxFTikKLSNkZWZpbmUgTkxNNF9jYWxsZXJfc3oJCTErWERSX1FVQURMRU4oTkxNQ0xOVF9PSFNJWkUpCi0jZGVmaW5lIE5MTTRfb3duZXJfc3oJCTErWERSX1FVQURMRU4oTkxNQ0xOVF9PSFNJWkUpCi0jZGVmaW5lIE5MTTRfZmhhbmRsZV9zegkJMStYRFJfUVVBRExFTihORlMzX0ZIU0laRSkKLSNkZWZpbmUgTkxNNF9sb2NrX3N6CQk1K05MTTRfY2FsbGVyX3N6K05MTTRfb3duZXJfc3orTkxNNF9maGFuZGxlX3N6Ci0jZGVmaW5lIE5MTTRfaG9sZGVyX3N6CQk2K05MTTRfb3duZXJfc3oKLQotI2RlZmluZSBOTE00X3Rlc3RhcmdzX3N6CU5MTTRfY29va2llX3N6KzErTkxNNF9sb2NrX3N6Ci0jZGVmaW5lIE5MTTRfbG9ja2FyZ3Nfc3oJTkxNNF9jb29raWVfc3orNCtOTE00X2xvY2tfc3oKLSNkZWZpbmUgTkxNNF9jYW5jYXJnc19zeglOTE00X2Nvb2tpZV9zeisyK05MTTRfbG9ja19zegotI2RlZmluZSBOTE00X3VubG9ja2FyZ3Nfc3oJTkxNNF9jb29raWVfc3orTkxNNF9sb2NrX3N6Ci0KLSNkZWZpbmUgTkxNNF90ZXN0cmVzX3N6CQlOTE00X2Nvb2tpZV9zeisxK05MTTRfaG9sZGVyX3N6Ci0jZGVmaW5lIE5MTTRfcmVzX3N6CQlOTE00X2Nvb2tpZV9zeisxCi0jZGVmaW5lIE5MTTRfbm9yZXBfc3oJCTAKLQotLyoKLSAqIEZvciBOTE0sIGEgdm9pZCBwcm9jZWR1cmUgcmVhbGx5IHJldHVybnMgbm90aGluZwotICovCi0jZGVmaW5lIG5sbTRjbHRfZGVjb2RlX25vcmVwCU5VTEwKLQotI2RlZmluZSBQUk9DKHByb2MsIGFyZ3R5cGUsIHJlc3R5cGUpCQkJCQlcCi1bTkxNUFJPQ18jI3Byb2NdID0gewkJCQkJCQlcCi0JLnBfcHJvYyAgICAgID0gTkxNUFJPQ18jI3Byb2MsCQkJCQlcCi0JLnBfZW5jb2RlICAgID0gKGt4ZHJwcm9jX3QpIG5sbTRjbHRfZW5jb2RlXyMjYXJndHlwZSwJCVwKLQkucF9kZWNvZGUgICAgPSAoa3hkcnByb2NfdCkgbmxtNGNsdF9kZWNvZGVfIyNyZXN0eXBlLAkJXAotCS5wX2FyZ2xlbiAgICA9IE5MTTRfIyNhcmd0eXBlIyNfc3osCQkJCVwKLQkucF9yZXBsZW4gICAgPSBOTE00XyMjcmVzdHlwZSMjX3N6LAkJCQlcCi0JLnBfc3RhdGlkeCAgID0gTkxNUFJPQ18jI3Byb2MsCQkJCQlcCi0JLnBfbmFtZSAgICAgID0gI3Byb2MsCQkJCQkJXAotCX0KLQotc3RhdGljIHN0cnVjdCBycGNfcHJvY2luZm8JbmxtNF9wcm9jZWR1cmVzW10gPSB7Ci0gICAgUFJPQyhURVNULAkJdGVzdGFyZ3MsCXRlc3RyZXMpLAotICAgIFBST0MoTE9DSywJCWxvY2thcmdzLAlyZXMpLAotICAgIFBST0MoQ0FOQ0VMLAljYW5jYXJncywJcmVzKSwKLSAgICBQUk9DKFVOTE9DSywJdW5sb2NrYXJncywJcmVzKSwKLSAgICBQUk9DKEdSQU5URUQsCXRlc3RhcmdzLAlyZXMpLAotICAgIFBST0MoVEVTVF9NU0csCXRlc3RhcmdzLAlub3JlcCksCi0gICAgUFJPQyhMT0NLX01TRywJbG9ja2FyZ3MsCW5vcmVwKSwKLSAgICBQUk9DKENBTkNFTF9NU0csCWNhbmNhcmdzLAlub3JlcCksCi0gICAgUFJPQyhVTkxPQ0tfTVNHLAl1bmxvY2thcmdzLAlub3JlcCksCi0gICAgUFJPQyhHUkFOVEVEX01TRywJdGVzdGFyZ3MsCW5vcmVwKSwKLSAgICBQUk9DKFRFU1RfUkVTLAl0ZXN0cmVzLAlub3JlcCksCi0gICAgUFJPQyhMT0NLX1JFUywJcmVzLAkJbm9yZXApLAotICAgIFBST0MoQ0FOQ0VMX1JFUywJcmVzLAkJbm9yZXApLAotICAgIFBST0MoVU5MT0NLX1JFUywJcmVzLAkJbm9yZXApLAotICAgIFBST0MoR1JBTlRFRF9SRVMsCXJlcywJCW5vcmVwKSwKLSNpZmRlZiBOTE1DTE5UX1NVUFBPUlRfU0hBUkVTCi0gICAgUFJPQyhTSEFSRSwJCXNoYXJlYXJncywJc2hhcmVyZXMpLAotICAgIFBST0MoVU5TSEFSRSwJc2hhcmVhcmdzLAlzaGFyZXJlcyksCi0gICAgUFJPQyhOTV9MT0NLLAlsb2NrYXJncywJcmVzKSwKLSAgICBQUk9DKEZSRUVfQUxMLAlub3RpZnksCQl2b2lkKSwKLSNlbmRpZgotfTsKLQotc3RydWN0IHJwY192ZXJzaW9uCW5sbV92ZXJzaW9uNCA9IHsKLQkubnVtYmVyCQk9IDQsCi0JLm5ycHJvY3MJPSAyNCwKLQkucHJvY3MJCT0gbmxtNF9wcm9jZWR1cmVzLAotfTsKZGlmZiAtLWdpdCBhL2ZzL21iY2FjaGUuYyBiL2ZzL21iY2FjaGUuYwppbmRleCA5MzQ0NDc0Li5hMjU0NDRhYiAxMDA2NDQKLS0tIGEvZnMvbWJjYWNoZS5jCisrKyBiL2ZzL21iY2FjaGUuYwpAQCAtNzYsMTggKzc2LDYgQEAKIEVYUE9SVF9TWU1CT0wobWJfY2FjaGVfZW50cnlfZmluZF9uZXh0KTsKICNlbmRpZgogCi1zdHJ1Y3QgbWJfY2FjaGUgewotCXN0cnVjdCBsaXN0X2hlYWQJCWNfY2FjaGVfbGlzdDsKLQljb25zdCBjaGFyCQkJKmNfbmFtZTsKLQlhdG9taWNfdAkJCWNfZW50cnlfY291bnQ7Ci0JaW50CQkJCWNfbWF4X2VudHJpZXM7Ci0JaW50CQkJCWNfYnVja2V0X2JpdHM7Ci0Jc3RydWN0IGttZW1fY2FjaGUJCSpjX2VudHJ5X2NhY2hlOwotCXN0cnVjdCBsaXN0X2hlYWQJCSpjX2Jsb2NrX2hhc2g7Ci0Jc3RydWN0IGxpc3RfaGVhZAkJKmNfaW5kZXhfaGFzaDsKLX07Ci0KLQogLyoKICAqIEdsb2JhbCBkYXRhOiBsaXN0IG9mIGFsbCBtYmNhY2hlJ3MsIGxydSBsaXN0LCBhbmQgYSBzcGlubG9jayBmb3IKICAqIGFjY2Vzc2luZyBjYWNoZSBkYXRhIHN0cnVjdHVyZXMgb24gU01QIG1hY2hpbmVzLiBUaGUgbHJ1IGxpc3QgaXMKZGlmZiAtLWdpdCBhL2ZzL25hbWVpLmMgYi9mcy9uYW1laS5jCmluZGV4IDE5NDMzY2QuLjI0ZWNlMTAgMTAwNjQ0Ci0tLSBhL2ZzL25hbWVpLmMKKysrIGIvZnMvbmFtZWkuYwpAQCAtMjAyLDcgKzIwMiw3IEBACiAgKiBAaW5vZGU6CWlub2RlIHRvIGNoZWNrIGFjY2VzcyByaWdodHMgZm9yCiAgKiBAbWFzazoJcmlnaHQgdG8gY2hlY2sgZm9yICglTUFZX1JFQUQsICVNQVlfV1JJVEUsICVNQVlfRVhFQykKICAqIEBjaGVja19hY2w6CW9wdGlvbmFsIGNhbGxiYWNrIHRvIGNoZWNrIGZvciBQb3NpeCBBQ0xzCi0gKiBAZmxhZ3MJSVBFUk1fRkxBR18gZmxhZ3MuCisgKiBAZmxhZ3M6CUlQRVJNX0ZMQUdfIGZsYWdzLgogICoKICAqIFVzZWQgdG8gY2hlY2sgZm9yIHJlYWQvd3JpdGUvZXhlY3V0ZSBwZXJtaXNzaW9ucyBvbiBhIGZpbGUuCiAgKiBXZSB1c2UgImZzdWlkIiBmb3IgdGhpcywgbGV0dGluZyB1cyBzZXQgYXJiaXRyYXJ5IHBlcm1pc3Npb25zCkBAIC00MDcsNyArNDA3LDcgQEAKIC8qKgogICogbmFtZWlkYXRhX2Ryb3BfcmN1IC0gZHJvcCB0aGlzIG5hbWVpZGF0YSBvdXQgb2YgcmN1LXdhbGsKICAqIEBuZDogbmFtZWlkYXRhIHBhdGh3YWxrIGRhdGEgdG8gZHJvcAotICogQFJldHVybnM6IDAgb24gc3VjY2VzcywgLUVDSExJRCBvbiBmYWlsdXJlCisgKiBSZXR1cm5zOiAwIG9uIHN1Y2Nlc3MsIC1FQ0hJTEQgb24gZmFpbHVyZQogICoKICAqIFBhdGggd2Fsa2luZyBoYXMgMiBtb2RlcywgcmN1LXdhbGsgYW5kIHJlZi13YWxrIChzZWUKICAqIERvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvcGF0aC1sb29rdXAudHh0KS4gX19kcm9wX3JjdSogZnVuY3Rpb25zIGF0dGVtcHQKQEAgLTQ2OCw3ICs0NjgsNyBAQAogICogbmFtZWlkYXRhX2RlbnRyeV9kcm9wX3JjdSAtIGRyb3AgbmFtZWlkYXRhIGFuZCBkZW50cnkgb3V0IG9mIHJjdS13YWxrCiAgKiBAbmQ6IG5hbWVpZGF0YSBwYXRod2FsayBkYXRhIHRvIGRyb3AKICAqIEBkZW50cnk6IGRlbnRyeSB0byBkcm9wCi0gKiBAUmV0dXJuczogMCBvbiBzdWNjZXNzLCAtRUNITElEIG9uIGZhaWx1cmUKKyAqIFJldHVybnM6IDAgb24gc3VjY2VzcywgLUVDSElMRCBvbiBmYWlsdXJlCiAgKgogICogbmFtZWlkYXRhX2RlbnRyeV9kcm9wX3JjdSBhdHRlbXB0cyB0byBkcm9wIHRoZSBjdXJyZW50IG5kLT5wYXRoIGFuZCBuZC0+cm9vdCwKICAqIGFuZCBkZW50cnkgaW50byByZWYtd2Fsay4gQGRlbnRyeSBtdXN0IGJlIGEgcGF0aCBmb3VuZCBieSBhIGRvX2xvb2t1cCBjYWxsIG9uCkBAIC01MzAsNyArNTMwLDcgQEAKIC8qKgogICogbmFtZWlkYXRhX2Ryb3BfcmN1X2xhc3QgLSBkcm9wIG5hbWVpZGF0YSBlbmRpbmcgcGF0aCB3YWxrIG91dCBvZiByY3Utd2FsawogICogQG5kOiBuYW1laWRhdGEgcGF0aHdhbGsgZGF0YSB0byBkcm9wCi0gKiBAUmV0dXJuczogMCBvbiBzdWNjZXNzLCAtRUNITElEIG9uIGZhaWx1cmUKKyAqIFJldHVybnM6IDAgb24gc3VjY2VzcywgLUVDSElMRCBvbiBmYWlsdXJlCiAgKgogICogbmFtZWlkYXRhX2Ryb3BfcmN1X2xhc3QgYXR0ZW1wdHMgdG8gZHJvcCB0aGUgY3VycmVudCBuZC0+cGF0aCBpbnRvIHJlZi13YWxrLgogICogbmQtPnBhdGggc2hvdWxkIGJlIHRoZSBmaW5hbCBlbGVtZW50IG9mIHRoZSBsb29rdXAsIHNvIG5kLT5yb290IGlzIGRpc2NhcmRlZC4KZGlmZiAtLWdpdCBhL2ZzL25mcy9jYWxsYmFjay5jIGIvZnMvbmZzL2NhbGxiYWNrLmMKaW5kZXggOTNhOGIzYi4uMTk5MDE2NSAxMDA2NDQKLS0tIGEvZnMvbmZzL2NhbGxiYWNrLmMKKysrIGIvZnMvbmZzL2NhbGxiYWNrLmMKQEAgLTE2LDkgKzE2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9mcmVlemVyLmg+CiAjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgogI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9zdmNhdXRoX2dzcy5oPgotI2lmIGRlZmluZWQoQ09ORklHX05GU19WNF8xKQogI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9iY194cHJ0Lmg+Ci0jZW5kaWYKIAogI2luY2x1ZGUgPG5ldC9pbmV0X3NvY2suaD4KIApAQCAtMTM3LDYgKzEzNSwzMyBAQAogCiAjaWYgZGVmaW5lZChDT05GSUdfTkZTX1Y0XzEpCiAvKgorICogICogQ0JfU0VRVUVOQ0Ugb3BlcmF0aW9ucyB3aWxsIGZhaWwgdW50aWwgdGhlIGNhbGxiYWNrIHNlc3Npb25pZCBpcyBzZXQuCisgKiAgICovCitpbnQgbmZzNF9zZXRfY2FsbGJhY2tfc2Vzc2lvbmlkKHN0cnVjdCBuZnNfY2xpZW50ICpjbHApCit7CisJc3RydWN0IHN2Y19zZXJ2ICpzZXJ2ID0gY2xwLT5jbF9ycGNjbGllbnQtPmNsX3hwcnQtPmJjX3NlcnY7CisJc3RydWN0IG5mczRfc2Vzc2lvbmlkICpiY19zaWQ7CisKKwlpZiAoIXNlcnYtPnN2X2JjX3hwcnQpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogb24gc3VjY2VzcyBmcmVlZCBpbiB4cHJ0X2ZyZWUgKi8KKwliY19zaWQgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgbmZzNF9zZXNzaW9uaWQpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWJjX3NpZCkKKwkJcmV0dXJuIC1FTk9NRU07CisJbWVtY3B5KGJjX3NpZC0+ZGF0YSwgJmNscC0+Y2xfc2Vzc2lvbi0+c2Vzc19pZC5kYXRhLAorCQlORlM0X01BWF9TRVNTSU9OSURfTEVOKTsKKwlzcGluX2xvY2tfYmgoJnNlcnYtPnN2X2NiX2xvY2spOworCXNlcnYtPnN2X2JjX3hwcnQtPnhwdF9iY19zaWQgPSBiY19zaWQ7CisJc3Bpbl91bmxvY2tfYmgoJnNlcnYtPnN2X2NiX2xvY2spOworCWRwcmludGsoIiVzIHNldCB4cHRfYmNfc2lkPSV1OiV1OiV1OiV1IGZvciBzdl9iY194cHJ0ICVwXG4iLCBfX2Z1bmNfXywKKwkJKCh1MzIgKiliY19zaWQtPmRhdGEpWzBdLCAoKHUzMiAqKWJjX3NpZC0+ZGF0YSlbMV0sCisJCSgodTMyICopYmNfc2lkLT5kYXRhKVsyXSwgKCh1MzIgKiliY19zaWQtPmRhdGEpWzNdLAorCQlzZXJ2LT5zdl9iY194cHJ0KTsKKwlyZXR1cm4gMDsKK30KKworLyoKICAqIFRoZSBjYWxsYmFjayBzZXJ2aWNlIGZvciBORlN2NC4xIGNhbGxiYWNrcwogICovCiBzdGF0aWMgaW50CkBAIC0xNzcsMzAgKzIwMiwzOCBAQAogc3RydWN0IHN2Y19ycXN0ICoKIG5mczQxX2NhbGxiYWNrX3VwKHN0cnVjdCBzdmNfc2VydiAqc2Vydiwgc3RydWN0IHJwY194cHJ0ICp4cHJ0KQogewotCXN0cnVjdCBzdmNfeHBydCAqYmNfeHBydDsKLQlzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwID0gRVJSX1BUUigtRU5PTUVNKTsKKwlzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwOworCWludCByZXQ7CiAKLQlkcHJpbnRrKCItLT4gJXNcbiIsIF9fZnVuY19fKTsKLQkvKiBDcmVhdGUgYSBzdmNfc29jayBmb3IgdGhlIHNlcnZpY2UgKi8KLQliY194cHJ0ID0gc3ZjX3NvY2tfY3JlYXRlKHNlcnYsIHhwcnQtPnByb3QpOwotCWlmICghYmNfeHBydCkKKwkvKgorCSAqIENyZWF0ZSBhbiBzdmNfc29jayBmb3IgdGhlIGJhY2sgY2hhbm5lbCBzZXJ2aWNlIHRoYXQgc2hhcmVzIHRoZQorCSAqIGZvcmUgY2hhbm5lbCBjb25uZWN0aW9uLgorCSAqIFJldHVybnMgdGhlIGlucHV0IHBvcnQgKDApIGFuZCBzZXRzIHRoZSBzdmNfc2VydiBiY194cHJ0IG9uIHN1Y2Nlc3MKKwkgKi8KKwlyZXQgPSBzdmNfY3JlYXRlX3hwcnQoc2VydiwgInRjcC1iYyIsICZpbml0X25ldCwgUEZfSU5FVCwgMCwKKwkJCSAgICAgIFNWQ19TT0NLX0FOT05ZTU9VUyk7CisJaWYgKHJldCA8IDApIHsKKwkJcnFzdHAgPSBFUlJfUFRSKHJldCk7CiAJCWdvdG8gb3V0OworCX0KIAogCS8qCiAJICogU2F2ZSB0aGUgc3ZjX3NlcnYgaW4gdGhlIHRyYW5zcG9ydCBzbyB0aGF0IGl0IGNhbgogCSAqIGJlIHJlZmVyZW5jZWQgd2hlbiB0aGUgc2Vzc2lvbiBiYWNrY2hhbm5lbCBpcyBpbml0aWFsaXplZAogCSAqLwotCXNlcnYtPmJjX3hwcnQgPSBiY194cHJ0OwogCXhwcnQtPmJjX3NlcnYgPSBzZXJ2OwogCiAJSU5JVF9MSVNUX0hFQUQoJnNlcnYtPnN2X2NiX2xpc3QpOwogCXNwaW5fbG9ja19pbml0KCZzZXJ2LT5zdl9jYl9sb2NrKTsKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZzZXJ2LT5zdl9jYl93YWl0cSk7CiAJcnFzdHAgPSBzdmNfcHJlcGFyZV90aHJlYWQoc2VydiwgJnNlcnYtPnN2X3Bvb2xzWzBdKTsKLQlpZiAoSVNfRVJSKHJxc3RwKSkKLQkJc3ZjX3NvY2tfZGVzdHJveShiY194cHJ0KTsKKwlpZiAoSVNfRVJSKHJxc3RwKSkgeworCQlzdmNfeHBydF9wdXQoc2Vydi0+c3ZfYmNfeHBydCk7CisJCXNlcnYtPnN2X2JjX3hwcnQgPSBOVUxMOworCX0KIG91dDoKLQlkcHJpbnRrKCItLT4gJXMgcmV0dXJuICVwXG4iLCBfX2Z1bmNfXywgcnFzdHApOworCWRwcmludGsoIi0tPiAlcyByZXR1cm4gJWxkXG4iLCBfX2Z1bmNfXywKKwkJSVNfRVJSKHJxc3RwKSA/IFBUUl9FUlIocnFzdHApIDogMCk7CiAJcmV0dXJuIHJxc3RwOwogfQogCkBAIC0yMzMsNiArMjY2LDEwIEBACiAJCXN0cnVjdCBuZnNfY2FsbGJhY2tfZGF0YSAqY2JfaW5mbykKIHsKIH0KK2ludCBuZnM0X3NldF9jYWxsYmFja19zZXNzaW9uaWQoc3RydWN0IG5mc19jbGllbnQgKmNscCkKK3sKKwlyZXR1cm4gMDsKK30KICNlbmRpZiAvKiBDT05GSUdfTkZTX1Y0XzEgKi8KIAogLyoKQEAgLTMyOCw2ICszNjUsOSBAQAogCXN0cnVjdCBycGNfY2xudCAqciA9IGNscC0+Y2xfcnBjY2xpZW50OwogCWNoYXIgKnAgPSBzdmNfZ3NzX3ByaW5jaXBhbChycXN0cCk7CiAKKwkvKiBObyBSUENfQVVUSF9HU1Mgb24gTkZTdjQuMSBiYWNrIGNoYW5uZWwgeWV0ICovCisJaWYgKGNscC0+Y2xfbWlub3J2ZXJzaW9uICE9IDApCisJCXJldHVybiBTVkNfRFJPUDsKIAkvKgogCSAqIEl0IG1pZ2h0IGp1c3QgYmUgYSBub3JtYWwgdXNlciBwcmluY2lwYWwsIGluIHdoaWNoIGNhc2UKIAkgKiB1c2Vyc3BhY2Ugd29uJ3QgYm90aGVyIHRvIHRlbGwgdXMgdGhlIG5hbWUgYXQgYWxsLgpAQCAtMzQ1LDYgKzM4NSwyMyBAQAogCXJldHVybiBTVkNfT0s7CiB9CiAKKy8qIHBnX2F1dGhlbnRpY2F0ZSBtZXRob2QgaGVscGVyICovCitzdGF0aWMgc3RydWN0IG5mc19jbGllbnQgKm5mc19jYl9maW5kX2NsaWVudChzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwKQoreworCXN0cnVjdCBuZnM0X3Nlc3Npb25pZCAqc2Vzc2lvbmlkID0gYmNfeHBydF9zaWQocnFzdHApOworCWludCBpc19jYl9jb21wb3VuZCA9IHJxc3RwLT5ycV9wcm9jID09IENCX0NPTVBPVU5EID8gMSA6IDA7CisKKwlkcHJpbnRrKCItLT4gJXMgcnFfcHJvYyAlZFxuIiwgX19mdW5jX18sIHJxc3RwLT5ycV9wcm9jKTsKKwlpZiAoc3ZjX2lzX2JhY2tjaGFubmVsKHJxc3RwKSkKKwkJLyogU2Vzc2lvbmlkICh1c3VhbGx5KSBzZXQgYWZ0ZXIgQ0JfTlVMTCBwaW5nICovCisJCXJldHVybiBuZnM0X2ZpbmRfY2xpZW50X3Nlc3Npb25pZChzdmNfYWRkcihycXN0cCksIHNlc3Npb25pZCwKKwkJCQkJCSAgaXNfY2JfY29tcG91bmQpOworCWVsc2UKKwkJLyogTm8gY2FsbGJhY2sgaWRlbnRpZmllciBpbiBwZ19hdXRoZW50aWNhdGUgKi8KKwkJcmV0dXJuIG5mczRfZmluZF9jbGllbnRfbm9faWRlbnQoc3ZjX2FkZHIocnFzdHApKTsKK30KKworLyogcGdfYXV0aGVudGljYXRlIG1ldGhvZCBmb3IgbmZzdjQgY2FsbGJhY2sgdGhyZWFkcy4gKi8KIHN0YXRpYyBpbnQgbmZzX2NhbGxiYWNrX2F1dGhlbnRpY2F0ZShzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwKQogewogCXN0cnVjdCBuZnNfY2xpZW50ICpjbHA7CkBAIC0zNTIsNyArNDA5LDcgQEAKIAlpbnQgcmV0ID0gU1ZDX09LOwogCiAJLyogRG9uJ3QgdGFsayB0byBzdHJhbmdlcnMgKi8KLQljbHAgPSBuZnNfZmluZF9jbGllbnQoc3ZjX2FkZHIocnFzdHApLCA0KTsKKwljbHAgPSBuZnNfY2JfZmluZF9jbGllbnQocnFzdHApOwogCWlmIChjbHAgPT0gTlVMTCkKIAkJcmV0dXJuIFNWQ19EUk9QOwogCmRpZmYgLS1naXQgYS9mcy9uZnMvY2FsbGJhY2suaCBiL2ZzL25mcy9jYWxsYmFjay5oCmluZGV4IDg1YTdjZmQuLmQzYjQ0ZjkgMTAwNjQ0Ci0tLSBhL2ZzL25mcy9jYWxsYmFjay5oCisrKyBiL2ZzL25mcy9jYWxsYmFjay5oCkBAIC0zNCwxMCArMzQsMTcgQEAKIAlPUF9DQl9JTExFR0FMID0gMTAwNDQsCiB9OwogCitzdHJ1Y3QgY2JfcHJvY2Vzc19zdGF0ZSB7CisJX19iZTMyCQkJZHJjX3N0YXR1czsKKwlzdHJ1Y3QgbmZzX2NsaWVudAkqY2xwOworCXN0cnVjdCBuZnM0X3Nlc3Npb25pZAkqc3ZjX3NpZDsgLyogdjQuMSBjYWxsYmFjayBzZXJ2aWNlIHNlc3Npb25pZCAqLworfTsKKwogc3RydWN0IGNiX2NvbXBvdW5kX2hkcl9hcmcgewogCXVuc2lnbmVkIGludCB0YWdsZW47CiAJY29uc3QgY2hhciAqdGFnOwogCXVuc2lnbmVkIGludCBtaW5vcnZlcnNpb247CisJdW5zaWduZWQgaW50IGNiX2lkZW50OyAvKiB2NC4wIGNhbGxiYWNrIGlkZW50aWZpZXIgKi8KIAl1bnNpZ25lZCBub3BzOwogfTsKIApAQCAtMTAzLDE0ICsxMTAsMjMgQEAKIAl1aW50MzJfdAkJCWNzcl90YXJnZXRfaGlnaGVzdHNsb3RpZDsKIH07CiAKLWV4dGVybiB1bnNpZ25lZCBuZnM0X2NhbGxiYWNrX3NlcXVlbmNlKHN0cnVjdCBjYl9zZXF1ZW5jZWFyZ3MgKmFyZ3MsCi0JCQkJICAgICAgIHN0cnVjdCBjYl9zZXF1ZW5jZXJlcyAqcmVzKTsKK2V4dGVybiBfX2JlMzIgbmZzNF9jYWxsYmFja19zZXF1ZW5jZShzdHJ1Y3QgY2Jfc2VxdWVuY2VhcmdzICphcmdzLAorCQkJCSAgICAgICBzdHJ1Y3QgY2Jfc2VxdWVuY2VyZXMgKnJlcywKKwkJCQkgICAgICAgc3RydWN0IGNiX3Byb2Nlc3Nfc3RhdGUgKmNwcyk7CiAKIGV4dGVybiBpbnQgbmZzNDFfdmFsaWRhdGVfZGVsZWdhdGlvbl9zdGF0ZWlkKHN0cnVjdCBuZnNfZGVsZWdhdGlvbiAqZGVsZWdhdGlvbiwKIAkJCQkJICAgICBjb25zdCBuZnM0X3N0YXRlaWQgKnN0YXRlaWQpOwogCiAjZGVmaW5lIFJDQTRfVFlQRV9NQVNLX1JEQVRBX0RMRwkwCiAjZGVmaW5lIFJDQTRfVFlQRV9NQVNLX1dEQVRBX0RMRwkxCisjZGVmaW5lIFJDQTRfVFlQRV9NQVNLX0RJUl9ETEcgICAgICAgICAyCisjZGVmaW5lIFJDQTRfVFlQRV9NQVNLX0ZJTEVfTEFZT1VUICAgICAzCisjZGVmaW5lIFJDQTRfVFlQRV9NQVNLX0JMS19MQVlPVVQgICAgICA0CisjZGVmaW5lIFJDQTRfVFlQRV9NQVNLX09CSl9MQVlPVVRfTUlOICA4CisjZGVmaW5lIFJDQTRfVFlQRV9NQVNLX09CSl9MQVlPVVRfTUFYICA5CisjZGVmaW5lIFJDQTRfVFlQRV9NQVNLX09USEVSX0xBWU9VVF9NSU4gMTIKKyNkZWZpbmUgUkNBNF9UWVBFX01BU0tfT1RIRVJfTEFZT1VUX01BWCAxNQorI2RlZmluZSBSQ0E0X1RZUEVfTUFTS19BTEwgMHhmMzFmCiAKIHN0cnVjdCBjYl9yZWNhbGxhbnlhcmdzIHsKIAlzdHJ1Y3Qgc29ja2FkZHIJKmNyYWFfYWRkcjsKQEAgLTExOCwyNSArMTM0LDUyIEBACiAJdWludDMyX3QJY3JhYV90eXBlX21hc2s7CiB9OwogCi1leHRlcm4gdW5zaWduZWQgbmZzNF9jYWxsYmFja19yZWNhbGxhbnkoc3RydWN0IGNiX3JlY2FsbGFueWFyZ3MgKmFyZ3MsIHZvaWQgKmR1bW15KTsKK2V4dGVybiBfX2JlMzIgbmZzNF9jYWxsYmFja19yZWNhbGxhbnkoc3RydWN0IGNiX3JlY2FsbGFueWFyZ3MgKmFyZ3MsCisJCQkJCXZvaWQgKmR1bW15LAorCQkJCQlzdHJ1Y3QgY2JfcHJvY2Vzc19zdGF0ZSAqY3BzKTsKIAogc3RydWN0IGNiX3JlY2FsbHNsb3RhcmdzIHsKIAlzdHJ1Y3Qgc29ja2FkZHIJKmNyc2FfYWRkcjsKIAl1aW50MzJfdAljcnNhX3RhcmdldF9tYXhfc2xvdHM7CiB9OwotZXh0ZXJuIHVuc2lnbmVkIG5mczRfY2FsbGJhY2tfcmVjYWxsc2xvdChzdHJ1Y3QgY2JfcmVjYWxsc2xvdGFyZ3MgKmFyZ3MsCi0JCQkJCSAgdm9pZCAqZHVtbXkpOworZXh0ZXJuIF9fYmUzMiBuZnM0X2NhbGxiYWNrX3JlY2FsbHNsb3Qoc3RydWN0IGNiX3JlY2FsbHNsb3RhcmdzICphcmdzLAorCQkJCQkgdm9pZCAqZHVtbXksCisJCQkJCSBzdHJ1Y3QgY2JfcHJvY2Vzc19zdGF0ZSAqY3BzKTsKIAorc3RydWN0IGNiX2xheW91dHJlY2FsbGFyZ3MgeworCXN0cnVjdCBzb2NrYWRkcgkJKmNibF9hZGRyOworCXVpbnQzMl90CQljYmxfcmVjYWxsX3R5cGU7CisJdWludDMyX3QJCWNibF9sYXlvdXRfdHlwZTsKKwl1aW50MzJfdAkJY2JsX2xheW91dGNoYW5nZWQ7CisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJc3RydWN0IG5mc19maAkJY2JsX2ZoOworCQkJc3RydWN0IHBuZnNfbGF5b3V0X3JhbmdlIGNibF9yYW5nZTsKKwkJCW5mczRfc3RhdGVpZAkJY2JsX3N0YXRlaWQ7CisJCX07CisJCXN0cnVjdCBuZnNfZnNpZAkJY2JsX2ZzaWQ7CisJfTsKK307CisKK2V4dGVybiB1bnNpZ25lZCBuZnM0X2NhbGxiYWNrX2xheW91dHJlY2FsbCgKKwlzdHJ1Y3QgY2JfbGF5b3V0cmVjYWxsYXJncyAqYXJncywKKwl2b2lkICpkdW1teSwgc3RydWN0IGNiX3Byb2Nlc3Nfc3RhdGUgKmNwcyk7CisKK2V4dGVybiB2b2lkIG5mczRfY2hlY2tfZHJhaW5fYmNfY29tcGxldGUoc3RydWN0IG5mczRfc2Vzc2lvbiAqc2VzKTsKK2V4dGVybiB2b2lkIG5mczRfY2JfdGFrZV9zbG90KHN0cnVjdCBuZnNfY2xpZW50ICpjbHApOwogI2VuZGlmIC8qIENPTkZJR19ORlNfVjRfMSAqLwogCi1leHRlcm4gX19iZTMyIG5mczRfY2FsbGJhY2tfZ2V0YXR0cihzdHJ1Y3QgY2JfZ2V0YXR0cmFyZ3MgKmFyZ3MsIHN0cnVjdCBjYl9nZXRhdHRycmVzICpyZXMpOwotZXh0ZXJuIF9fYmUzMiBuZnM0X2NhbGxiYWNrX3JlY2FsbChzdHJ1Y3QgY2JfcmVjYWxsYXJncyAqYXJncywgdm9pZCAqZHVtbXkpOwotCitleHRlcm4gX19iZTMyIG5mczRfY2FsbGJhY2tfZ2V0YXR0cihzdHJ1Y3QgY2JfZ2V0YXR0cmFyZ3MgKmFyZ3MsCisJCQkJICAgIHN0cnVjdCBjYl9nZXRhdHRycmVzICpyZXMsCisJCQkJICAgIHN0cnVjdCBjYl9wcm9jZXNzX3N0YXRlICpjcHMpOworZXh0ZXJuIF9fYmUzMiBuZnM0X2NhbGxiYWNrX3JlY2FsbChzdHJ1Y3QgY2JfcmVjYWxsYXJncyAqYXJncywgdm9pZCAqZHVtbXksCisJCQkJICAgc3RydWN0IGNiX3Byb2Nlc3Nfc3RhdGUgKmNwcyk7CiAjaWZkZWYgQ09ORklHX05GU19WNAogZXh0ZXJuIGludCBuZnNfY2FsbGJhY2tfdXAodTMyIG1pbm9ydmVyc2lvbiwgc3RydWN0IHJwY194cHJ0ICp4cHJ0KTsKIGV4dGVybiB2b2lkIG5mc19jYWxsYmFja19kb3duKGludCBtaW5vcnZlcnNpb24pOwogZXh0ZXJuIGludCBuZnM0X3ZhbGlkYXRlX2RlbGVnYXRpb25fc3RhdGVpZChzdHJ1Y3QgbmZzX2RlbGVnYXRpb24gKmRlbGVnYXRpb24sCiAJCQkJCSAgICBjb25zdCBuZnM0X3N0YXRlaWQgKnN0YXRlaWQpOworZXh0ZXJuIGludCBuZnM0X3NldF9jYWxsYmFja19zZXNzaW9uaWQoc3RydWN0IG5mc19jbGllbnQgKmNscCk7CiAjZW5kaWYgLyogQ09ORklHX05GU19WNCAqLwogLyoKICAqIG5mczQxOiBDYWxsYmFja3MgYXJlIGV4cGVjdGVkIHRvIG5vdCBjYXVzZSBzdWJzdGFudGlhbCBsYXRlbmN5LApkaWZmIC0tZ2l0IGEvZnMvbmZzL2NhbGxiYWNrX3Byb2MuYyBiL2ZzL25mcy9jYWxsYmFja19wcm9jLmMKaW5kZXggMjk1MGZjYS4uNGJiOTFjYiAxMDA2NDQKLS0tIGEvZnMvbmZzL2NhbGxiYWNrX3Byb2MuYworKysgYi9mcy9uZnMvY2FsbGJhY2tfcHJvYy5jCkBAIC0xMiwzMCArMTIsMzMgQEAKICNpbmNsdWRlICJjYWxsYmFjay5oIgogI2luY2x1ZGUgImRlbGVnYXRpb24uaCIKICNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgInBuZnMuaCIKIAogI2lmZGVmIE5GU19ERUJVRwogI2RlZmluZSBORlNEQkdfRkFDSUxJVFkgTkZTREJHX0NBTExCQUNLCiAjZW5kaWYKLSAKLV9fYmUzMiBuZnM0X2NhbGxiYWNrX2dldGF0dHIoc3RydWN0IGNiX2dldGF0dHJhcmdzICphcmdzLCBzdHJ1Y3QgY2JfZ2V0YXR0cnJlcyAqcmVzKQorCitfX2JlMzIgbmZzNF9jYWxsYmFja19nZXRhdHRyKHN0cnVjdCBjYl9nZXRhdHRyYXJncyAqYXJncywKKwkJCSAgICAgc3RydWN0IGNiX2dldGF0dHJyZXMgKnJlcywKKwkJCSAgICAgc3RydWN0IGNiX3Byb2Nlc3Nfc3RhdGUgKmNwcykKIHsKLQlzdHJ1Y3QgbmZzX2NsaWVudCAqY2xwOwogCXN0cnVjdCBuZnNfZGVsZWdhdGlvbiAqZGVsZWdhdGlvbjsKIAlzdHJ1Y3QgbmZzX2lub2RlICpuZnNpOwogCXN0cnVjdCBpbm9kZSAqaW5vZGU7CiAKLQlyZXMtPmJpdG1hcFswXSA9IHJlcy0+Yml0bWFwWzFdID0gMDsKLQlyZXMtPnN0YXR1cyA9IGh0b25sKE5GUzRFUlJfQkFESEFORExFKTsKLQljbHAgPSBuZnNfZmluZF9jbGllbnQoYXJncy0+YWRkciwgNCk7Ci0JaWYgKGNscCA9PSBOVUxMKQorCXJlcy0+c3RhdHVzID0gaHRvbmwoTkZTNEVSUl9PUF9OT1RfSU5fU0VTU0lPTik7CisJaWYgKCFjcHMtPmNscCkgLyogQWx3YXlzIHNldCBmb3IgdjQuMC4gU2V0IGluIGNiX3NlcXVlbmNlIGZvciB2NC4xICovCiAJCWdvdG8gb3V0OwogCi0JZHByaW50aygiTkZTOiBHRVRBVFRSIGNhbGxiYWNrIHJlcXVlc3QgZnJvbSAlc1xuIiwKLQkJcnBjX3BlZXJhZGRyMnN0cihjbHAtPmNsX3JwY2NsaWVudCwgUlBDX0RJU1BMQVlfQUREUikpOworCXJlcy0+Yml0bWFwWzBdID0gcmVzLT5iaXRtYXBbMV0gPSAwOworCXJlcy0+c3RhdHVzID0gaHRvbmwoTkZTNEVSUl9CQURIQU5ETEUpOwogCi0JaW5vZGUgPSBuZnNfZGVsZWdhdGlvbl9maW5kX2lub2RlKGNscCwgJmFyZ3MtPmZoKTsKKwlkcHJpbnRrKCJORlM6IEdFVEFUVFIgY2FsbGJhY2sgcmVxdWVzdCBmcm9tICVzXG4iLAorCQlycGNfcGVlcmFkZHIyc3RyKGNwcy0+Y2xwLT5jbF9ycGNjbGllbnQsIFJQQ19ESVNQTEFZX0FERFIpKTsKKworCWlub2RlID0gbmZzX2RlbGVnYXRpb25fZmluZF9pbm9kZShjcHMtPmNscCwgJmFyZ3MtPmZoKTsKIAlpZiAoaW5vZGUgPT0gTlVMTCkKLQkJZ290byBvdXRfcHV0Y2xpZW50OworCQlnb3RvIG91dDsKIAluZnNpID0gTkZTX0koaW5vZGUpOwogCXJjdV9yZWFkX2xvY2soKTsKIAlkZWxlZ2F0aW9uID0gcmN1X2RlcmVmZXJlbmNlKG5mc2ktPmRlbGVnYXRpb24pOwpAQCAtNTUsNDkgKzU4LDQxIEBACiBvdXRfaXB1dDoKIAlyY3VfcmVhZF91bmxvY2soKTsKIAlpcHV0KGlub2RlKTsKLW91dF9wdXRjbGllbnQ6Ci0JbmZzX3B1dF9jbGllbnQoY2xwKTsKIG91dDoKIAlkcHJpbnRrKCIlczogZXhpdCB3aXRoIHN0YXR1cyA9ICVkXG4iLCBfX2Z1bmNfXywgbnRvaGwocmVzLT5zdGF0dXMpKTsKIAlyZXR1cm4gcmVzLT5zdGF0dXM7CiB9CiAKLV9fYmUzMiBuZnM0X2NhbGxiYWNrX3JlY2FsbChzdHJ1Y3QgY2JfcmVjYWxsYXJncyAqYXJncywgdm9pZCAqZHVtbXkpCitfX2JlMzIgbmZzNF9jYWxsYmFja19yZWNhbGwoc3RydWN0IGNiX3JlY2FsbGFyZ3MgKmFyZ3MsIHZvaWQgKmR1bW15LAorCQkJICAgIHN0cnVjdCBjYl9wcm9jZXNzX3N0YXRlICpjcHMpCiB7Ci0Jc3RydWN0IG5mc19jbGllbnQgKmNscDsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlOwogCV9fYmUzMiByZXM7CiAJCi0JcmVzID0gaHRvbmwoTkZTNEVSUl9CQURIQU5ETEUpOwotCWNscCA9IG5mc19maW5kX2NsaWVudChhcmdzLT5hZGRyLCA0KTsKLQlpZiAoY2xwID09IE5VTEwpCisJcmVzID0gaHRvbmwoTkZTNEVSUl9PUF9OT1RfSU5fU0VTU0lPTik7CisJaWYgKCFjcHMtPmNscCkgLyogQWx3YXlzIHNldCBmb3IgdjQuMC4gU2V0IGluIGNiX3NlcXVlbmNlIGZvciB2NC4xICovCiAJCWdvdG8gb3V0OwogCiAJZHByaW50aygiTkZTOiBSRUNBTEwgY2FsbGJhY2sgcmVxdWVzdCBmcm9tICVzXG4iLAotCQlycGNfcGVlcmFkZHIyc3RyKGNscC0+Y2xfcnBjY2xpZW50LCBSUENfRElTUExBWV9BRERSKSk7CisJCXJwY19wZWVyYWRkcjJzdHIoY3BzLT5jbHAtPmNsX3JwY2NsaWVudCwgUlBDX0RJU1BMQVlfQUREUikpOwogCi0JZG8gewotCQlzdHJ1Y3QgbmZzX2NsaWVudCAqcHJldiA9IGNscDsKLQotCQlpbm9kZSA9IG5mc19kZWxlZ2F0aW9uX2ZpbmRfaW5vZGUoY2xwLCAmYXJncy0+ZmgpOwotCQlpZiAoaW5vZGUgIT0gTlVMTCkgewotCQkJLyogU2V0IHVwIGEgaGVscGVyIHRocmVhZCB0byBhY3R1YWxseSByZXR1cm4gdGhlIGRlbGVnYXRpb24gKi8KLQkJCXN3aXRjaCAobmZzX2FzeW5jX2lub2RlX3JldHVybl9kZWxlZ2F0aW9uKGlub2RlLCAmYXJncy0+c3RhdGVpZCkpIHsKLQkJCQljYXNlIDA6Ci0JCQkJCXJlcyA9IDA7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgLUVOT0VOVDoKLQkJCQkJaWYgKHJlcyAhPSAwKQotCQkJCQkJcmVzID0gaHRvbmwoTkZTNEVSUl9CQURfU1RBVEVJRCk7Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJlcyA9IGh0b25sKE5GUzRFUlJfUkVTT1VSQ0UpOwotCQkJfQotCQkJaXB1dChpbm9kZSk7Ci0JCX0KLQkJY2xwID0gbmZzX2ZpbmRfY2xpZW50X25leHQocHJldik7Ci0JCW5mc19wdXRfY2xpZW50KHByZXYpOwotCX0gd2hpbGUgKGNscCAhPSBOVUxMKTsKKwlyZXMgPSBodG9ubChORlM0RVJSX0JBREhBTkRMRSk7CisJaW5vZGUgPSBuZnNfZGVsZWdhdGlvbl9maW5kX2lub2RlKGNwcy0+Y2xwLCAmYXJncy0+ZmgpOworCWlmIChpbm9kZSA9PSBOVUxMKQorCQlnb3RvIG91dDsKKwkvKiBTZXQgdXAgYSBoZWxwZXIgdGhyZWFkIHRvIGFjdHVhbGx5IHJldHVybiB0aGUgZGVsZWdhdGlvbiAqLworCXN3aXRjaCAobmZzX2FzeW5jX2lub2RlX3JldHVybl9kZWxlZ2F0aW9uKGlub2RlLCAmYXJncy0+c3RhdGVpZCkpIHsKKwljYXNlIDA6CisJCXJlcyA9IDA7CisJCWJyZWFrOworCWNhc2UgLUVOT0VOVDoKKwkJaWYgKHJlcyAhPSAwKQorCQkJcmVzID0gaHRvbmwoTkZTNEVSUl9CQURfU1RBVEVJRCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJlcyA9IGh0b25sKE5GUzRFUlJfUkVTT1VSQ0UpOworCX0KKwlpcHV0KGlub2RlKTsKIG91dDoKIAlkcHJpbnRrKCIlczogZXhpdCB3aXRoIHN0YXR1cyA9ICVkXG4iLCBfX2Z1bmNfXywgbnRvaGwocmVzKSk7CiAJcmV0dXJuIHJlczsKQEAgLTExMyw2ICsxMDgsMTM5IEBACiAKICNpZiBkZWZpbmVkKENPTkZJR19ORlNfVjRfMSkKIAorc3RhdGljIHUzMiBpbml0aWF0ZV9maWxlX2RyYWluaW5nKHN0cnVjdCBuZnNfY2xpZW50ICpjbHAsCisJCQkJICBzdHJ1Y3QgY2JfbGF5b3V0cmVjYWxsYXJncyAqYXJncykKK3sKKwlzdHJ1Y3QgcG5mc19sYXlvdXRfaGRyICpsbzsKKwlzdHJ1Y3QgaW5vZGUgKmlubzsKKwlib29sIGZvdW5kID0gZmFsc2U7CisJdTMyIHJ2ID0gTkZTNEVSUl9OT01BVENISU5HX0xBWU9VVDsKKwlMSVNUX0hFQUQoZnJlZV9tZV9saXN0KTsKKworCXNwaW5fbG9jaygmY2xwLT5jbF9sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGxvLCAmY2xwLT5jbF9sYXlvdXRzLCBwbGhfbGF5b3V0cykgeworCQlpZiAobmZzX2NvbXBhcmVfZmgoJmFyZ3MtPmNibF9maCwKKwkJCQkgICAmTkZTX0kobG8tPnBsaF9pbm9kZSktPmZoKSkKKwkJCWNvbnRpbnVlOworCQlpbm8gPSBpZ3JhYihsby0+cGxoX2lub2RlKTsKKwkJaWYgKCFpbm8pCisJCQljb250aW51ZTsKKwkJZm91bmQgPSB0cnVlOworCQkvKiBXaXRob3V0IHRoaXMsIGxheW91dCBjYW4gYmUgZnJlZWQgYXMgc29vbgorCQkgKiBhcyB3ZSByZWxlYXNlIGNsX2xvY2suCisJCSAqLworCQlnZXRfbGF5b3V0X2hkcihsbyk7CisJCWJyZWFrOworCX0KKwlzcGluX3VubG9jaygmY2xwLT5jbF9sb2NrKTsKKwlpZiAoIWZvdW5kKQorCQlyZXR1cm4gTkZTNEVSUl9OT01BVENISU5HX0xBWU9VVDsKKworCXNwaW5fbG9jaygmaW5vLT5pX2xvY2spOworCWlmICh0ZXN0X2JpdChORlNfTEFZT1VUX0JVTEtfUkVDQUxMLCAmbG8tPnBsaF9mbGFncykgfHwKKwkgICAgbWFya19tYXRjaGluZ19sc2Vnc19pbnZhbGlkKGxvLCAmZnJlZV9tZV9saXN0LAorCQkJCQlhcmdzLT5jYmxfcmFuZ2UuaW9tb2RlKSkKKwkJcnYgPSBORlM0RVJSX0RFTEFZOworCWVsc2UKKwkJcnYgPSBORlM0RVJSX05PTUFUQ0hJTkdfTEFZT1VUOworCXBuZnNfc2V0X2xheW91dF9zdGF0ZWlkKGxvLCAmYXJncy0+Y2JsX3N0YXRlaWQsIHRydWUpOworCXNwaW5fdW5sb2NrKCZpbm8tPmlfbG9jayk7CisJcG5mc19mcmVlX2xzZWdfbGlzdCgmZnJlZV9tZV9saXN0KTsKKwlwdXRfbGF5b3V0X2hkcihsbyk7CisJaXB1dChpbm8pOworCXJldHVybiBydjsKK30KKworc3RhdGljIHUzMiBpbml0aWF0ZV9idWxrX2RyYWluaW5nKHN0cnVjdCBuZnNfY2xpZW50ICpjbHAsCisJCQkJICBzdHJ1Y3QgY2JfbGF5b3V0cmVjYWxsYXJncyAqYXJncykKK3sKKwlzdHJ1Y3QgcG5mc19sYXlvdXRfaGRyICpsbzsKKwlzdHJ1Y3QgaW5vZGUgKmlubzsKKwl1MzIgcnYgPSBORlM0RVJSX05PTUFUQ0hJTkdfTEFZT1VUOworCXN0cnVjdCBwbmZzX2xheW91dF9oZHIgKnRtcDsKKwlMSVNUX0hFQUQocmVjYWxsX2xpc3QpOworCUxJU1RfSEVBRChmcmVlX21lX2xpc3QpOworCXN0cnVjdCBwbmZzX2xheW91dF9yYW5nZSByYW5nZSA9IHsKKwkJLmlvbW9kZSA9IElPTU9ERV9BTlksCisJCS5vZmZzZXQgPSAwLAorCQkubGVuZ3RoID0gTkZTNF9NQVhfVUlOVDY0LAorCX07CisKKwlzcGluX2xvY2soJmNscC0+Y2xfbG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShsbywgJmNscC0+Y2xfbGF5b3V0cywgcGxoX2xheW91dHMpIHsKKwkJaWYgKChhcmdzLT5jYmxfcmVjYWxsX3R5cGUgPT0gUkVUVVJOX0ZTSUQpICYmCisJCSAgICBtZW1jbXAoJk5GU19TRVJWRVIobG8tPnBsaF9pbm9kZSktPmZzaWQsCisJCQkgICAmYXJncy0+Y2JsX2ZzaWQsIHNpemVvZihzdHJ1Y3QgbmZzX2ZzaWQpKSkKKwkJCWNvbnRpbnVlOworCQlpZiAoIWlncmFiKGxvLT5wbGhfaW5vZGUpKQorCQkJY29udGludWU7CisJCWdldF9sYXlvdXRfaGRyKGxvKTsKKwkJQlVHX09OKCFsaXN0X2VtcHR5KCZsby0+cGxoX2J1bGtfcmVjYWxsKSk7CisJCWxpc3RfYWRkKCZsby0+cGxoX2J1bGtfcmVjYWxsLCAmcmVjYWxsX2xpc3QpOworCX0KKwlzcGluX3VubG9jaygmY2xwLT5jbF9sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobG8sIHRtcCwKKwkJCQkgJnJlY2FsbF9saXN0LCBwbGhfYnVsa19yZWNhbGwpIHsKKwkJaW5vID0gbG8tPnBsaF9pbm9kZTsKKwkJc3Bpbl9sb2NrKCZpbm8tPmlfbG9jayk7CisJCXNldF9iaXQoTkZTX0xBWU9VVF9CVUxLX1JFQ0FMTCwgJmxvLT5wbGhfZmxhZ3MpOworCQlpZiAobWFya19tYXRjaGluZ19sc2Vnc19pbnZhbGlkKGxvLCAmZnJlZV9tZV9saXN0LCByYW5nZS5pb21vZGUpKQorCQkJcnYgPSBORlM0RVJSX0RFTEFZOworCQlsaXN0X2RlbF9pbml0KCZsby0+cGxoX2J1bGtfcmVjYWxsKTsKKwkJc3Bpbl91bmxvY2soJmluby0+aV9sb2NrKTsKKwkJcHV0X2xheW91dF9oZHIobG8pOworCQlpcHV0KGlubyk7CisJfQorCXBuZnNfZnJlZV9sc2VnX2xpc3QoJmZyZWVfbWVfbGlzdCk7CisJcmV0dXJuIHJ2OworfQorCitzdGF0aWMgdTMyIGRvX2NhbGxiYWNrX2xheW91dHJlY2FsbChzdHJ1Y3QgbmZzX2NsaWVudCAqY2xwLAorCQkJCSAgICBzdHJ1Y3QgY2JfbGF5b3V0cmVjYWxsYXJncyAqYXJncykKK3sKKwl1MzIgcmVzID0gTkZTNEVSUl9ERUxBWTsKKworCWRwcmludGsoIiVzIGVudGVyLCB0eXBlPSVpXG4iLCBfX2Z1bmNfXywgYXJncy0+Y2JsX3JlY2FsbF90eXBlKTsKKwlpZiAodGVzdF9hbmRfc2V0X2JpdChORlM0Q0xOVF9MQVlPVVRSRUNBTEwsICZjbHAtPmNsX3N0YXRlKSkKKwkJZ290byBvdXQ7CisJaWYgKGFyZ3MtPmNibF9yZWNhbGxfdHlwZSA9PSBSRVRVUk5fRklMRSkKKwkJcmVzID0gaW5pdGlhdGVfZmlsZV9kcmFpbmluZyhjbHAsIGFyZ3MpOworCWVsc2UKKwkJcmVzID0gaW5pdGlhdGVfYnVsa19kcmFpbmluZyhjbHAsIGFyZ3MpOworCWNsZWFyX2JpdChORlM0Q0xOVF9MQVlPVVRSRUNBTEwsICZjbHAtPmNsX3N0YXRlKTsKK291dDoKKwlkcHJpbnRrKCIlcyByZXR1cm5pbmcgJWlcbiIsIF9fZnVuY19fLCByZXMpOworCXJldHVybiByZXM7CisKK30KKworX19iZTMyIG5mczRfY2FsbGJhY2tfbGF5b3V0cmVjYWxsKHN0cnVjdCBjYl9sYXlvdXRyZWNhbGxhcmdzICphcmdzLAorCQkJCSAgdm9pZCAqZHVtbXksIHN0cnVjdCBjYl9wcm9jZXNzX3N0YXRlICpjcHMpCit7CisJdTMyIHJlczsKKworCWRwcmludGsoIiVzOiAtLT5cbiIsIF9fZnVuY19fKTsKKworCWlmIChjcHMtPmNscCkKKwkJcmVzID0gZG9fY2FsbGJhY2tfbGF5b3V0cmVjYWxsKGNwcy0+Y2xwLCBhcmdzKTsKKwllbHNlCisJCXJlcyA9IE5GUzRFUlJfT1BfTk9UX0lOX1NFU1NJT047CisKKwlkcHJpbnRrKCIlczogZXhpdCB3aXRoIHN0YXR1cyA9ICVkXG4iLCBfX2Z1bmNfXywgcmVzKTsKKwlyZXR1cm4gY3B1X3RvX2JlMzIocmVzKTsKK30KKworc3RhdGljIHZvaWQgcG5mc19yZWNhbGxfYWxsX2xheW91dHMoc3RydWN0IG5mc19jbGllbnQgKmNscCkKK3sKKwlzdHJ1Y3QgY2JfbGF5b3V0cmVjYWxsYXJncyBhcmdzOworCisJLyogUHJldGVuZCB3ZSBnb3QgYSBDQl9MQVlPVVRSRUNBTEwoQUxMKSAqLworCW1lbXNldCgmYXJncywgMCwgc2l6ZW9mKGFyZ3MpKTsKKwlhcmdzLmNibF9yZWNhbGxfdHlwZSA9IFJFVFVSTl9BTEw7CisJLyogRklYTUUgd2UgaWdub3JlIGVycm9ycywgd2hhdCBzaG91bGQgd2UgZG8/ICovCisJZG9fY2FsbGJhY2tfbGF5b3V0cmVjYWxsKGNscCwgJmFyZ3MpOworfQorCiBpbnQgbmZzNDFfdmFsaWRhdGVfZGVsZWdhdGlvbl9zdGF0ZWlkKHN0cnVjdCBuZnNfZGVsZWdhdGlvbiAqZGVsZWdhdGlvbiwgY29uc3QgbmZzNF9zdGF0ZWlkICpzdGF0ZWlkKQogewogCWlmIChkZWxlZ2F0aW9uID09IE5VTEwpCkBAIC0xODUsNDIgKzMxMyw2IEBACiB9CiAKIC8qCi0gKiBSZXR1cm5zIGEgcG9pbnRlciB0byBhIGhlbGQgJ3N0cnVjdCBuZnNfY2xpZW50JyB0aGF0IG1hdGNoZXMgdGhlIHNlcnZlcidzCi0gKiBhZGRyZXNzLCBtYWpvciB2ZXJzaW9uIG51bWJlciwgYW5kIHNlc3Npb24gSUQuICBJdCBpcyB0aGUgY2FsbGVyJ3MKLSAqIHJlc3BvbnNpYmlsaXR5IHRvIHJlbGVhc2UgdGhlIHJldHVybmVkIHJlZmVyZW5jZS4KLSAqCi0gKiBSZXR1cm5zIE5VTEwgaWYgdGhlcmUgYXJlIG5vIGNvbm5lY3Rpb25zIHdpdGggc2Vzc2lvbnMsIG9yIGlmIG5vIHNlc3Npb24KLSAqIG1hdGNoZXMgdGhlIG9uZSBvZiBpbnRlcmVzdC4KLSAqLwotIHN0YXRpYyBzdHJ1Y3QgbmZzX2NsaWVudCAqZmluZF9jbGllbnRfd2l0aF9zZXNzaW9uKAotCWNvbnN0IHN0cnVjdCBzb2NrYWRkciAqYWRkciwgdTMyIG5mc3ZlcnNpb24sCi0Jc3RydWN0IG5mczRfc2Vzc2lvbmlkICpzZXNzaW9uaWQpCi17Ci0Jc3RydWN0IG5mc19jbGllbnQgKmNscDsKLQotCWNscCA9IG5mc19maW5kX2NsaWVudChhZGRyLCA0KTsKLQlpZiAoY2xwID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCi0JZG8gewotCQlzdHJ1Y3QgbmZzX2NsaWVudCAqcHJldiA9IGNscDsKLQotCQlpZiAoY2xwLT5jbF9zZXNzaW9uICE9IE5VTEwpIHsKLQkJCWlmIChtZW1jbXAoY2xwLT5jbF9zZXNzaW9uLT5zZXNzX2lkLmRhdGEsCi0JCQkJCXNlc3Npb25pZC0+ZGF0YSwKLQkJCQkJTkZTNF9NQVhfU0VTU0lPTklEX0xFTikgPT0gMCkgewotCQkJCS8qIFJldHVybnMgYSBoZWxkIHJlZmVyZW5jZSB0byBjbHAgKi8KLQkJCQlyZXR1cm4gY2xwOwotCQkJfQotCQl9Ci0JCWNscCA9IG5mc19maW5kX2NsaWVudF9uZXh0KHByZXYpOwotCQluZnNfcHV0X2NsaWVudChwcmV2KTsKLQl9IHdoaWxlIChjbHAgIT0gTlVMTCk7Ci0KLQlyZXR1cm4gTlVMTDsKLX0KLQotLyoKICAqIEZvciBlYWNoIHJlZmVycmluZyBjYWxsIHRyaXBsZSwgY2hlY2sgdGhlIHNlc3Npb24ncyBzbG90IHRhYmxlIGZvcgogICogYSBtYXRjaC4gIElmIHRoZSBzbG90IGlzIGluIHVzZSBhbmQgdGhlIHNlcXVlbmNlIG51bWJlcnMgbWF0Y2gsIHRoZQogICogY2xpZW50IGlzIHN0aWxsIHdhaXRpbmcgZm9yIGEgcmVzcG9uc2UgdG8gdGhlIG9yaWdpbmFsIHJlcXVlc3QuCkBAIC0yNzYsMjAgKzM2OCwzNCBAQAogfQogCiBfX2JlMzIgbmZzNF9jYWxsYmFja19zZXF1ZW5jZShzdHJ1Y3QgY2Jfc2VxdWVuY2VhcmdzICphcmdzLAotCQkJCXN0cnVjdCBjYl9zZXF1ZW5jZXJlcyAqcmVzKQorCQkJICAgICAgc3RydWN0IGNiX3NlcXVlbmNlcmVzICpyZXMsCisJCQkgICAgICBzdHJ1Y3QgY2JfcHJvY2Vzc19zdGF0ZSAqY3BzKQogewogCXN0cnVjdCBuZnNfY2xpZW50ICpjbHA7CiAJaW50IGk7CiAJX19iZTMyIHN0YXR1czsKIAorCWNwcy0+Y2xwID0gTlVMTDsKKwogCXN0YXR1cyA9IGh0b25sKE5GUzRFUlJfQkFEU0VTU0lPTik7Ci0JY2xwID0gZmluZF9jbGllbnRfd2l0aF9zZXNzaW9uKGFyZ3MtPmNzYV9hZGRyLCA0LCAmYXJncy0+Y3NhX3Nlc3Npb25pZCk7CisJLyogSW5jb21pbmcgc2Vzc2lvbiBtdXN0IG1hdGNoIHRoZSBjYWxsYmFjayBzZXNzaW9uICovCisJaWYgKG1lbWNtcCgmYXJncy0+Y3NhX3Nlc3Npb25pZCwgY3BzLT5zdmNfc2lkLCBORlM0X01BWF9TRVNTSU9OSURfTEVOKSkKKwkJZ290byBvdXQ7CisKKwljbHAgPSBuZnM0X2ZpbmRfY2xpZW50X3Nlc3Npb25pZChhcmdzLT5jc2FfYWRkciwKKwkJCQkJICZhcmdzLT5jc2Ffc2Vzc2lvbmlkLCAxKTsKIAlpZiAoY2xwID09IE5VTEwpCiAJCWdvdG8gb3V0OwogCisJLyogc3RhdGUgbWFuYWdlciBpcyByZXNldHRpbmcgdGhlIHNlc3Npb24gKi8KKwlpZiAodGVzdF9iaXQoTkZTNF9TRVNTSU9OX0RSQUlOSU5HLCAmY2xwLT5jbF9zZXNzaW9uLT5zZXNzaW9uX3N0YXRlKSkgeworCQlzdGF0dXMgPSBORlM0RVJSX0RFTEFZOworCQlnb3RvIG91dDsKKwl9CisKIAlzdGF0dXMgPSB2YWxpZGF0ZV9zZXFpZCgmY2xwLT5jbF9zZXNzaW9uLT5iY19zbG90X3RhYmxlLCBhcmdzKTsKIAlpZiAoc3RhdHVzKQotCQlnb3RvIG91dF9wdXRjbGllbnQ7CisJCWdvdG8gb3V0OwogCiAJLyoKIAkgKiBDaGVjayBmb3IgcGVuZGluZyByZWZlcnJpbmcgY2FsbHMuICBJZiBhIG1hdGNoIGlzIGZvdW5kLCBhCkBAIC0yOTgsNyArNDA0LDcgQEAKIAkgKi8KIAlpZiAocmVmZXJyaW5nX2NhbGxfZXhpc3RzKGNscCwgYXJncy0+Y3NhX25yY2xpc3RzLCBhcmdzLT5jc2FfcmNsaXN0cykpIHsKIAkJc3RhdHVzID0gaHRvbmwoTkZTNEVSUl9ERUxBWSk7Ci0JCWdvdG8gb3V0X3B1dGNsaWVudDsKKwkJZ290byBvdXQ7CiAJfQogCiAJbWVtY3B5KCZyZXMtPmNzcl9zZXNzaW9uaWQsICZhcmdzLT5jc2Ffc2Vzc2lvbmlkLApAQCAtMzA3LDgzICs0MTMsOTMgQEAKIAlyZXMtPmNzcl9zbG90aWQgPSBhcmdzLT5jc2Ffc2xvdGlkOwogCXJlcy0+Y3NyX2hpZ2hlc3RzbG90aWQgPSBORlM0MV9CQ19NQVhfQ0FMTEJBQ0tTIC0gMTsKIAlyZXMtPmNzcl90YXJnZXRfaGlnaGVzdHNsb3RpZCA9IE5GUzQxX0JDX01BWF9DQUxMQkFDS1MgLSAxOworCW5mczRfY2JfdGFrZV9zbG90KGNscCk7CisJY3BzLT5jbHAgPSBjbHA7IC8qIHB1dCBpbiBuZnM0X2NhbGxiYWNrX2NvbXBvdW5kICovCiAKLW91dF9wdXRjbGllbnQ6Ci0JbmZzX3B1dF9jbGllbnQoY2xwKTsKIG91dDoKIAlmb3IgKGkgPSAwOyBpIDwgYXJncy0+Y3NhX25yY2xpc3RzOyBpKyspCiAJCWtmcmVlKGFyZ3MtPmNzYV9yY2xpc3RzW2ldLnJjbF9yZWZjYWxscyk7CiAJa2ZyZWUoYXJncy0+Y3NhX3JjbGlzdHMpOwogCi0JaWYgKHN0YXR1cyA9PSBodG9ubChORlM0RVJSX1JFVFJZX1VOQ0FDSEVEX1JFUCkpCi0JCXJlcy0+Y3NyX3N0YXR1cyA9IDA7Ci0JZWxzZQorCWlmIChzdGF0dXMgPT0gaHRvbmwoTkZTNEVSUl9SRVRSWV9VTkNBQ0hFRF9SRVApKSB7CisJCWNwcy0+ZHJjX3N0YXR1cyA9IHN0YXR1czsKKwkJc3RhdHVzID0gMDsKKwl9IGVsc2UKIAkJcmVzLT5jc3Jfc3RhdHVzID0gc3RhdHVzOworCiAJZHByaW50aygiJXM6IGV4aXQgd2l0aCBzdGF0dXMgPSAlZCByZXMtPmNzcl9zdGF0dXMgJWRcbiIsIF9fZnVuY19fLAogCQludG9obChzdGF0dXMpLCBudG9obChyZXMtPmNzcl9zdGF0dXMpKTsKIAlyZXR1cm4gc3RhdHVzOwogfQogCi1fX2JlMzIgbmZzNF9jYWxsYmFja19yZWNhbGxhbnkoc3RydWN0IGNiX3JlY2FsbGFueWFyZ3MgKmFyZ3MsIHZvaWQgKmR1bW15KQorc3RhdGljIGJvb2wKK3ZhbGlkYXRlX2JpdG1hcF92YWx1ZXModW5zaWduZWQgbG9uZyBtYXNrKQogewotCXN0cnVjdCBuZnNfY2xpZW50ICpjbHA7CisJcmV0dXJuIChtYXNrICYgflJDQTRfVFlQRV9NQVNLX0FMTCkgPT0gMDsKK30KKworX19iZTMyIG5mczRfY2FsbGJhY2tfcmVjYWxsYW55KHN0cnVjdCBjYl9yZWNhbGxhbnlhcmdzICphcmdzLCB2b2lkICpkdW1teSwKKwkJCSAgICAgICBzdHJ1Y3QgY2JfcHJvY2Vzc19zdGF0ZSAqY3BzKQorewogCV9fYmUzMiBzdGF0dXM7CiAJZm1vZGVfdCBmbGFncyA9IDA7CiAKLQlzdGF0dXMgPSBodG9ubChORlM0RVJSX09QX05PVF9JTl9TRVNTSU9OKTsKLQljbHAgPSBuZnNfZmluZF9jbGllbnQoYXJncy0+Y3JhYV9hZGRyLCA0KTsKLQlpZiAoY2xwID09IE5VTEwpCisJc3RhdHVzID0gY3B1X3RvX2JlMzIoTkZTNEVSUl9PUF9OT1RfSU5fU0VTU0lPTik7CisJaWYgKCFjcHMtPmNscCkgLyogc2V0IGluIGNiX3NlcXVlbmNlICovCiAJCWdvdG8gb3V0OwogCiAJZHByaW50aygiTkZTOiBSRUNBTExfQU5ZIGNhbGxiYWNrIHJlcXVlc3QgZnJvbSAlc1xuIiwKLQkJcnBjX3BlZXJhZGRyMnN0cihjbHAtPmNsX3JwY2NsaWVudCwgUlBDX0RJU1BMQVlfQUREUikpOworCQlycGNfcGVlcmFkZHIyc3RyKGNwcy0+Y2xwLT5jbF9ycGNjbGllbnQsIFJQQ19ESVNQTEFZX0FERFIpKTsKIAorCXN0YXR1cyA9IGNwdV90b19iZTMyKE5GUzRFUlJfSU5WQUwpOworCWlmICghdmFsaWRhdGVfYml0bWFwX3ZhbHVlcyhhcmdzLT5jcmFhX3R5cGVfbWFzaykpCisJCWdvdG8gb3V0OworCisJc3RhdHVzID0gY3B1X3RvX2JlMzIoTkZTNF9PSyk7CiAJaWYgKHRlc3RfYml0KFJDQTRfVFlQRV9NQVNLX1JEQVRBX0RMRywgKGNvbnN0IHVuc2lnbmVkIGxvbmcgKikKIAkJICAgICAmYXJncy0+Y3JhYV90eXBlX21hc2spKQogCQlmbGFncyA9IEZNT0RFX1JFQUQ7CiAJaWYgKHRlc3RfYml0KFJDQTRfVFlQRV9NQVNLX1dEQVRBX0RMRywgKGNvbnN0IHVuc2lnbmVkIGxvbmcgKikKIAkJICAgICAmYXJncy0+Y3JhYV90eXBlX21hc2spKQogCQlmbGFncyB8PSBGTU9ERV9XUklURTsKLQorCWlmICh0ZXN0X2JpdChSQ0E0X1RZUEVfTUFTS19GSUxFX0xBWU9VVCwgKGNvbnN0IHVuc2lnbmVkIGxvbmcgKikKKwkJICAgICAmYXJncy0+Y3JhYV90eXBlX21hc2spKQorCQlwbmZzX3JlY2FsbF9hbGxfbGF5b3V0cyhjcHMtPmNscCk7CiAJaWYgKGZsYWdzKQotCQluZnNfZXhwaXJlX2FsbF9kZWxlZ2F0aW9uX3R5cGVzKGNscCwgZmxhZ3MpOwotCXN0YXR1cyA9IGh0b25sKE5GUzRfT0spOworCQluZnNfZXhwaXJlX2FsbF9kZWxlZ2F0aW9uX3R5cGVzKGNwcy0+Y2xwLCBmbGFncyk7CiBvdXQ6CiAJZHByaW50aygiJXM6IGV4aXQgd2l0aCBzdGF0dXMgPSAlZFxuIiwgX19mdW5jX18sIG50b2hsKHN0YXR1cykpOwogCXJldHVybiBzdGF0dXM7CiB9CiAKIC8qIFJlZHVjZSB0aGUgZm9yZSBjaGFubmVsJ3MgbWF4X3Nsb3RzIHRvIHRoZSB0YXJnZXQgdmFsdWUgKi8KLV9fYmUzMiBuZnM0X2NhbGxiYWNrX3JlY2FsbHNsb3Qoc3RydWN0IGNiX3JlY2FsbHNsb3RhcmdzICphcmdzLCB2b2lkICpkdW1teSkKK19fYmUzMiBuZnM0X2NhbGxiYWNrX3JlY2FsbHNsb3Qoc3RydWN0IGNiX3JlY2FsbHNsb3RhcmdzICphcmdzLCB2b2lkICpkdW1teSwKKwkJCQlzdHJ1Y3QgY2JfcHJvY2Vzc19zdGF0ZSAqY3BzKQogewotCXN0cnVjdCBuZnNfY2xpZW50ICpjbHA7CiAJc3RydWN0IG5mczRfc2xvdF90YWJsZSAqZmNfdGJsOwogCV9fYmUzMiBzdGF0dXM7CiAKIAlzdGF0dXMgPSBodG9ubChORlM0RVJSX09QX05PVF9JTl9TRVNTSU9OKTsKLQljbHAgPSBuZnNfZmluZF9jbGllbnQoYXJncy0+Y3JzYV9hZGRyLCA0KTsKLQlpZiAoY2xwID09IE5VTEwpCisJaWYgKCFjcHMtPmNscCkgLyogc2V0IGluIGNiX3NlcXVlbmNlICovCiAJCWdvdG8gb3V0OwogCiAJZHByaW50aygiTkZTOiBDQl9SRUNBTExfU0xPVCByZXF1ZXN0IGZyb20gJXMgdGFyZ2V0IG1heCBzbG90cyAlZFxuIiwKLQkJcnBjX3BlZXJhZGRyMnN0cihjbHAtPmNsX3JwY2NsaWVudCwgUlBDX0RJU1BMQVlfQUREUiksCisJCXJwY19wZWVyYWRkcjJzdHIoY3BzLT5jbHAtPmNsX3JwY2NsaWVudCwgUlBDX0RJU1BMQVlfQUREUiksCiAJCWFyZ3MtPmNyc2FfdGFyZ2V0X21heF9zbG90cyk7CiAKLQlmY190YmwgPSAmY2xwLT5jbF9zZXNzaW9uLT5mY19zbG90X3RhYmxlOworCWZjX3RibCA9ICZjcHMtPmNscC0+Y2xfc2Vzc2lvbi0+ZmNfc2xvdF90YWJsZTsKIAogCXN0YXR1cyA9IGh0b25sKE5GUzRFUlJfQkFEX0hJR0hfU0xPVCk7CiAJaWYgKGFyZ3MtPmNyc2FfdGFyZ2V0X21heF9zbG90cyA+IGZjX3RibC0+bWF4X3Nsb3RzIHx8CiAJICAgIGFyZ3MtPmNyc2FfdGFyZ2V0X21heF9zbG90cyA8IDEpCi0JCWdvdG8gb3V0X3B1dGNsaWVudDsKKwkJZ290byBvdXQ7CiAKIAlzdGF0dXMgPSBodG9ubChORlM0X09LKTsKIAlpZiAoYXJncy0+Y3JzYV90YXJnZXRfbWF4X3Nsb3RzID09IGZjX3RibC0+bWF4X3Nsb3RzKQotCQlnb3RvIG91dF9wdXRjbGllbnQ7CisJCWdvdG8gb3V0OwogCiAJZmNfdGJsLT50YXJnZXRfbWF4X3Nsb3RzID0gYXJncy0+Y3JzYV90YXJnZXRfbWF4X3Nsb3RzOwotCW5mczQxX2hhbmRsZV9yZWNhbGxfc2xvdChjbHApOwotb3V0X3B1dGNsaWVudDoKLQluZnNfcHV0X2NsaWVudChjbHApOwkvKiBiYWxhbmNlIG5mc19maW5kX2NsaWVudCAqLworCW5mczQxX2hhbmRsZV9yZWNhbGxfc2xvdChjcHMtPmNscCk7CiBvdXQ6CiAJZHByaW50aygiJXM6IGV4aXQgd2l0aCBzdGF0dXMgPSAlZFxuIiwgX19mdW5jX18sIG50b2hsKHN0YXR1cykpOwogCXJldHVybiBzdGF0dXM7CmRpZmYgLS1naXQgYS9mcy9uZnMvY2FsbGJhY2tfeGRyLmMgYi9mcy9uZnMvY2FsbGJhY2tfeGRyLmMKaW5kZXggMDVhZjIxMi4uMjMxMTJjMiAxMDA2NDQKLS0tIGEvZnMvbmZzL2NhbGxiYWNrX3hkci5jCisrKyBiL2ZzL25mcy9jYWxsYmFja194ZHIuYwpAQCAtMTAsOCArMTAsMTAgQEAKICNpbmNsdWRlIDxsaW51eC9uZnM0Lmg+CiAjaW5jbHVkZSA8bGludXgvbmZzX2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9iY194cHJ0Lmg+CiAjaW5jbHVkZSAibmZzNF9mcy5oIgogI2luY2x1ZGUgImNhbGxiYWNrLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKIAogI2RlZmluZSBDQl9PUF9UQUdMRU5fTUFYU1oJKDUxMikKICNkZWZpbmUgQ0JfT1BfSERSX1JFU19NQVhTWgkoMiArIENCX09QX1RBR0xFTl9NQVhTWikKQEAgLTIyLDYgKzI0LDcgQEAKICNkZWZpbmUgQ0JfT1BfUkVDQUxMX1JFU19NQVhTWgkoQ0JfT1BfSERSX1JFU19NQVhTWikKIAogI2lmIGRlZmluZWQoQ09ORklHX05GU19WNF8xKQorI2RlZmluZSBDQl9PUF9MQVlPVVRSRUNBTExfUkVTX01BWFNaCShDQl9PUF9IRFJfUkVTX01BWFNaKQogI2RlZmluZSBDQl9PUF9TRVFVRU5DRV9SRVNfTUFYU1oJKENCX09QX0hEUl9SRVNfTUFYU1ogKyBcCiAJCQkJCTQgKyAxICsgMykKICNkZWZpbmUgQ0JfT1BfUkVDQUxMQU5ZX1JFU19NQVhTWgkoQ0JfT1BfSERSX1JFU19NQVhTWikKQEAgLTMzLDcgKzM2LDggQEAKIC8qIEludGVybmFsIGVycm9yIGNvZGUgKi8KICNkZWZpbmUgTkZTNEVSUl9SRVNPVVJDRV9IRFIJMTEwNTAKIAotdHlwZWRlZiBfX2JlMzIgKCpjYWxsYmFja19wcm9jZXNzX29wX3QpKHZvaWQgKiwgdm9pZCAqKTsKK3R5cGVkZWYgX19iZTMyICgqY2FsbGJhY2tfcHJvY2Vzc19vcF90KSh2b2lkICosIHZvaWQgKiwKKwkJCQkJc3RydWN0IGNiX3Byb2Nlc3Nfc3RhdGUgKik7CiB0eXBlZGVmIF9fYmUzMiAoKmNhbGxiYWNrX2RlY29kZV9hcmdfdCkoc3RydWN0IHN2Y19ycXN0ICosIHN0cnVjdCB4ZHJfc3RyZWFtICosIHZvaWQgKik7CiB0eXBlZGVmIF9fYmUzMiAoKmNhbGxiYWNrX2VuY29kZV9yZXNfdCkoc3RydWN0IHN2Y19ycXN0ICosIHN0cnVjdCB4ZHJfc3RyZWFtICosIHZvaWQgKik7CiAKQEAgLTE2MCw3ICsxNjQsNyBAQAogCWhkci0+bWlub3J2ZXJzaW9uID0gbnRvaGwoKnArKyk7CiAJLyogQ2hlY2sgbWlub3IgdmVyc2lvbiBpcyB6ZXJvIG9yIG9uZS4gKi8KIAlpZiAoaGRyLT5taW5vcnZlcnNpb24gPD0gMSkgewotCQlwKys7CS8qIHNraXAgY2FsbGJhY2tfaWRlbnQgKi8KKwkJaGRyLT5jYl9pZGVudCA9IG50b2hsKCpwKyspOyAvKiBpZ25vcmVkIGJ5IHY0LjEgKi8KIAl9IGVsc2UgewogCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogTkZTdjQgc2VydmVyIGNhbGxiYWNrIHdpdGggIgogCQkJImlsbGVnYWwgbWlub3IgdmVyc2lvbiAldSFcbiIsCkBAIC0yMjAsNiArMjI0LDY2IEBACiAKICNpZiBkZWZpbmVkKENPTkZJR19ORlNfVjRfMSkKIAorc3RhdGljIF9fYmUzMiBkZWNvZGVfbGF5b3V0cmVjYWxsX2FyZ3Moc3RydWN0IHN2Y19ycXN0ICpycXN0cCwKKwkJCQkgICAgICAgc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKKwkJCQkgICAgICAgc3RydWN0IGNiX2xheW91dHJlY2FsbGFyZ3MgKmFyZ3MpCit7CisJX19iZTMyICpwOworCV9fYmUzMiBzdGF0dXMgPSAwOworCXVpbnQzMl90IGlvbW9kZTsKKworCWFyZ3MtPmNibF9hZGRyID0gc3ZjX2FkZHIocnFzdHApOworCXAgPSByZWFkX2J1Zih4ZHIsIDQgKiBzaXplb2YodWludDMyX3QpKTsKKwlpZiAodW5saWtlbHkocCA9PSBOVUxMKSkgeworCQlzdGF0dXMgPSBodG9ubChORlM0RVJSX0JBRFhEUik7CisJCWdvdG8gb3V0OworCX0KKworCWFyZ3MtPmNibF9sYXlvdXRfdHlwZSA9IG50b2hsKCpwKyspOworCS8qIERlcGl0ZSB0aGUgc3BlYydzIHhkciwgaW9tb2RlIHJlYWxseSBiZWxvbmdzIGluIHRoZSBGSUxFIHN3aXRjaCwKKwkgKiBhcyBpdCBpcyB1bnVzZWFibGUgYW5kIGlnbm9yZWQgd2l0aCB0aGUgb3RoZXIgdHlwZXMuCisJICovCisJaW9tb2RlID0gbnRvaGwoKnArKyk7CisJYXJncy0+Y2JsX2xheW91dGNoYW5nZWQgPSBudG9obCgqcCsrKTsKKwlhcmdzLT5jYmxfcmVjYWxsX3R5cGUgPSBudG9obCgqcCsrKTsKKworCWlmIChhcmdzLT5jYmxfcmVjYWxsX3R5cGUgPT0gUkVUVVJOX0ZJTEUpIHsKKwkJYXJncy0+Y2JsX3JhbmdlLmlvbW9kZSA9IGlvbW9kZTsKKwkJc3RhdHVzID0gZGVjb2RlX2ZoKHhkciwgJmFyZ3MtPmNibF9maCk7CisJCWlmICh1bmxpa2VseShzdGF0dXMgIT0gMCkpCisJCQlnb3RvIG91dDsKKworCQlwID0gcmVhZF9idWYoeGRyLCAyICogc2l6ZW9mKHVpbnQ2NF90KSk7CisJCWlmICh1bmxpa2VseShwID09IE5VTEwpKSB7CisJCQlzdGF0dXMgPSBodG9ubChORlM0RVJSX0JBRFhEUik7CisJCQlnb3RvIG91dDsKKwkJfQorCQlwID0geGRyX2RlY29kZV9oeXBlcihwLCAmYXJncy0+Y2JsX3JhbmdlLm9mZnNldCk7CisJCXAgPSB4ZHJfZGVjb2RlX2h5cGVyKHAsICZhcmdzLT5jYmxfcmFuZ2UubGVuZ3RoKTsKKwkJc3RhdHVzID0gZGVjb2RlX3N0YXRlaWQoeGRyLCAmYXJncy0+Y2JsX3N0YXRlaWQpOworCQlpZiAodW5saWtlbHkoc3RhdHVzICE9IDApKQorCQkJZ290byBvdXQ7CisJfSBlbHNlIGlmIChhcmdzLT5jYmxfcmVjYWxsX3R5cGUgPT0gUkVUVVJOX0ZTSUQpIHsKKwkJcCA9IHJlYWRfYnVmKHhkciwgMiAqIHNpemVvZih1aW50NjRfdCkpOworCQlpZiAodW5saWtlbHkocCA9PSBOVUxMKSkgeworCQkJc3RhdHVzID0gaHRvbmwoTkZTNEVSUl9CQURYRFIpOworCQkJZ290byBvdXQ7CisJCX0KKwkJcCA9IHhkcl9kZWNvZGVfaHlwZXIocCwgJmFyZ3MtPmNibF9mc2lkLm1ham9yKTsKKwkJcCA9IHhkcl9kZWNvZGVfaHlwZXIocCwgJmFyZ3MtPmNibF9mc2lkLm1pbm9yKTsKKwl9IGVsc2UgaWYgKGFyZ3MtPmNibF9yZWNhbGxfdHlwZSAhPSBSRVRVUk5fQUxMKSB7CisJCXN0YXR1cyA9IGh0b25sKE5GUzRFUlJfQkFEWERSKTsKKwkJZ290byBvdXQ7CisJfQorCWRwcmludGsoIiVzOiBsdHlwZSAweCV4IGlvbW9kZSAlZCBjaGFuZ2VkICVkIHJlY2FsbF90eXBlICVkXG4iLAorCQlfX2Z1bmNfXywKKwkJYXJncy0+Y2JsX2xheW91dF90eXBlLCBpb21vZGUsCisJCWFyZ3MtPmNibF9sYXlvdXRjaGFuZ2VkLCBhcmdzLT5jYmxfcmVjYWxsX3R5cGUpOworb3V0OgorCWRwcmludGsoIiVzOiBleGl0IHdpdGggc3RhdHVzID0gJWRcbiIsIF9fZnVuY19fLCBudG9obChzdGF0dXMpKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCiBzdGF0aWMgX19iZTMyIGRlY29kZV9zZXNzaW9uaWQoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKIAkJCQkgc3RydWN0IG5mczRfc2Vzc2lvbmlkICpzaWQpCiB7CkBAIC01NzQsMTAgKzYzOCwxMCBAQAogCWNhc2UgT1BfQ0JfU0VRVUVOQ0U6CiAJY2FzZSBPUF9DQl9SRUNBTExfQU5ZOgogCWNhc2UgT1BfQ0JfUkVDQUxMX1NMT1Q6CisJY2FzZSBPUF9DQl9MQVlPVVRSRUNBTEw6CiAJCSpvcCA9ICZjYWxsYmFja19vcHNbb3BfbnJdOwogCQlicmVhazsKIAotCWNhc2UgT1BfQ0JfTEFZT1VUUkVDQUxMOgogCWNhc2UgT1BfQ0JfTk9USUZZX0RFVklDRUlEOgogCWNhc2UgT1BfQ0JfTk9USUZZOgogCWNhc2UgT1BfQ0JfUFVTSF9ERUxFRzoKQEAgLTU5Myw2ICs2NTcsMzcgQEAKIAlyZXR1cm4gaHRvbmwoTkZTX09LKTsKIH0KIAorc3RhdGljIHZvaWQgbmZzNF9jYWxsYmFja19mcmVlX3Nsb3Qoc3RydWN0IG5mczRfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKwlzdHJ1Y3QgbmZzNF9zbG90X3RhYmxlICp0YmwgPSAmc2Vzc2lvbi0+YmNfc2xvdF90YWJsZTsKKworCXNwaW5fbG9jaygmdGJsLT5zbG90X3RibF9sb2NrKTsKKwkvKgorCSAqIExldCB0aGUgc3RhdGUgbWFuYWdlciBrbm93IGNhbGxiYWNrIHByb2Nlc3NpbmcgZG9uZS4KKwkgKiBBIHNpbmdsZSBzbG90LCBzbyBoaWdoZXN0IHVzZWQgc2xvdGlkIGlzIGVpdGhlciAwIG9yIC0xCisJICovCisJdGJsLT5oaWdoZXN0X3VzZWRfc2xvdGlkLS07CisJbmZzNF9jaGVja19kcmFpbl9iY19jb21wbGV0ZShzZXNzaW9uKTsKKwlzcGluX3VubG9jaygmdGJsLT5zbG90X3RibF9sb2NrKTsKK30KKworc3RhdGljIHZvaWQgbmZzNF9jYl9mcmVlX3Nsb3Qoc3RydWN0IG5mc19jbGllbnQgKmNscCkKK3sKKwlpZiAoY2xwICYmIGNscC0+Y2xfc2Vzc2lvbikKKwkJbmZzNF9jYWxsYmFja19mcmVlX3Nsb3QoY2xwLT5jbF9zZXNzaW9uKTsKK30KKworLyogQSBzaW5nbGUgc2xvdCwgc28gaGlnaGVzdCB1c2VkIHNsb3RpZCBpcyBlaXRoZXIgMCBvciAtMSAqLwordm9pZCBuZnM0X2NiX3Rha2Vfc2xvdChzdHJ1Y3QgbmZzX2NsaWVudCAqY2xwKQoreworCXN0cnVjdCBuZnM0X3Nsb3RfdGFibGUgKnRibCA9ICZjbHAtPmNsX3Nlc3Npb24tPmJjX3Nsb3RfdGFibGU7CisKKwlzcGluX2xvY2soJnRibC0+c2xvdF90YmxfbG9jayk7CisJdGJsLT5oaWdoZXN0X3VzZWRfc2xvdGlkKys7CisJQlVHX09OKHRibC0+aGlnaGVzdF91c2VkX3Nsb3RpZCAhPSAwKTsKKwlzcGluX3VubG9jaygmdGJsLT5zbG90X3RibF9sb2NrKTsKK30KKwogI2Vsc2UgLyogQ09ORklHX05GU19WNF8xICovCiAKIHN0YXRpYyBfX2JlMzIKQEAgLTYwMSw2ICs2OTYsOSBAQAogCXJldHVybiBodG9ubChORlM0RVJSX01JTk9SX1ZFUlNfTUlTTUFUQ0gpOwogfQogCitzdGF0aWMgdm9pZCBuZnM0X2NiX2ZyZWVfc2xvdChzdHJ1Y3QgbmZzX2NsaWVudCAqY2xwKQoreworfQogI2VuZGlmIC8qIENPTkZJR19ORlNfVjRfMSAqLwogCiBzdGF0aWMgX19iZTMyCkBAIC02MjEsNyArNzE5LDggQEAKIHN0YXRpYyBfX2JlMzIgcHJvY2Vzc19vcCh1aW50MzJfdCBtaW5vcnZlcnNpb24sIGludCBub3AsCiAJCXN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsCiAJCXN0cnVjdCB4ZHJfc3RyZWFtICp4ZHJfaW4sIHZvaWQgKmFyZ3AsCi0JCXN0cnVjdCB4ZHJfc3RyZWFtICp4ZHJfb3V0LCB2b2lkICpyZXNwLCBpbnQqIGRyY19zdGF0dXMpCisJCXN0cnVjdCB4ZHJfc3RyZWFtICp4ZHJfb3V0LCB2b2lkICpyZXNwLAorCQlzdHJ1Y3QgY2JfcHJvY2Vzc19zdGF0ZSAqY3BzKQogewogCXN0cnVjdCBjYWxsYmFja19vcCAqb3AgPSAmY2FsbGJhY2tfb3BzWzBdOwogCXVuc2lnbmVkIGludCBvcF9ucjsKQEAgLTY0NCw4ICs3NDMsOCBAQAogCWlmIChzdGF0dXMpCiAJCWdvdG8gZW5jb2RlX2hkcjsKIAotCWlmICgqZHJjX3N0YXR1cykgewotCQlzdGF0dXMgPSAqZHJjX3N0YXR1czsKKwlpZiAoY3BzLT5kcmNfc3RhdHVzKSB7CisJCXN0YXR1cyA9IGNwcy0+ZHJjX3N0YXR1czsKIAkJZ290byBlbmNvZGVfaGRyOwogCX0KIApAQCAtNjUzLDE2ICs3NTIsMTAgQEAKIAlpZiAobWF4bGVuID4gMCAmJiBtYXhsZW4gPCBQQUdFX1NJWkUpIHsKIAkJc3RhdHVzID0gb3AtPmRlY29kZV9hcmdzKHJxc3RwLCB4ZHJfaW4sIGFyZ3ApOwogCQlpZiAobGlrZWx5KHN0YXR1cyA9PSAwKSkKLQkJCXN0YXR1cyA9IG9wLT5wcm9jZXNzX29wKGFyZ3AsIHJlc3ApOworCQkJc3RhdHVzID0gb3AtPnByb2Nlc3Nfb3AoYXJncCwgcmVzcCwgY3BzKTsKIAl9IGVsc2UKIAkJc3RhdHVzID0gaHRvbmwoTkZTNEVSUl9SRVNPVVJDRSk7CiAKLQkvKiBPbmx5IHNldCBieSBPUF9DQl9TRVFVRU5DRSBwcm9jZXNzaW5nICovCi0JaWYgKHN0YXR1cyA9PSBodG9ubChORlM0RVJSX1JFVFJZX1VOQ0FDSEVEX1JFUCkpIHsKLQkJKmRyY19zdGF0dXMgPSBzdGF0dXM7Ci0JCXN0YXR1cyA9IDA7Ci0JfQotCiBlbmNvZGVfaGRyOgogCXJlcyA9IGVuY29kZV9vcF9oZHIoeGRyX291dCwgb3BfbnIsIHN0YXR1cyk7CiAJaWYgKHVubGlrZWx5KHJlcykpCkBAIC02ODEsOCArNzc0LDExIEBACiAJc3RydWN0IGNiX2NvbXBvdW5kX2hkcl9hcmcgaGRyX2FyZyA9IHsgMCB9OwogCXN0cnVjdCBjYl9jb21wb3VuZF9oZHJfcmVzIGhkcl9yZXMgPSB7IE5VTEwgfTsKIAlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHJfaW4sIHhkcl9vdXQ7Ci0JX19iZTMyICpwOwotCV9fYmUzMiBzdGF0dXMsIGRyY19zdGF0dXMgPSAwOworCV9fYmUzMiAqcCwgc3RhdHVzOworCXN0cnVjdCBjYl9wcm9jZXNzX3N0YXRlIGNwcyA9IHsKKwkJLmRyY19zdGF0dXMgPSAwLAorCQkuY2xwID0gTlVMTCwKKwl9OwogCXVuc2lnbmVkIGludCBub3BzID0gMDsKIAogCWRwcmludGsoIiVzOiBzdGFydFxuIiwgX19mdW5jX18pOwpAQCAtNjk2LDYgKzc5MiwxMyBAQAogCWlmIChzdGF0dXMgPT0gX19jb25zdGFudF9odG9ubChORlM0RVJSX1JFU09VUkNFKSkKIAkJcmV0dXJuIHJwY19nYXJiYWdlX2FyZ3M7CiAKKwlpZiAoaGRyX2FyZy5taW5vcnZlcnNpb24gPT0gMCkgeworCQljcHMuY2xwID0gbmZzNF9maW5kX2NsaWVudF9pZGVudChoZHJfYXJnLmNiX2lkZW50KTsKKwkJaWYgKCFjcHMuY2xwKQorCQkJcmV0dXJuIHJwY19kcm9wX3JlcGx5OworCX0gZWxzZQorCQljcHMuc3ZjX3NpZCA9IGJjX3hwcnRfc2lkKHJxc3RwKTsKKwogCWhkcl9yZXMudGFnbGVuID0gaGRyX2FyZy50YWdsZW47CiAJaGRyX3Jlcy50YWcgPSBoZHJfYXJnLnRhZzsKIAlpZiAoZW5jb2RlX2NvbXBvdW5kX2hkcl9yZXMoJnhkcl9vdXQsICZoZHJfcmVzKSAhPSAwKQpAQCAtNzAzLDcgKzgwNiw3IEBACiAKIAl3aGlsZSAoc3RhdHVzID09IDAgJiYgbm9wcyAhPSBoZHJfYXJnLm5vcHMpIHsKIAkJc3RhdHVzID0gcHJvY2Vzc19vcChoZHJfYXJnLm1pbm9ydmVyc2lvbiwgbm9wcywgcnFzdHAsCi0JCQkJICAgICZ4ZHJfaW4sIGFyZ3AsICZ4ZHJfb3V0LCByZXNwLCAmZHJjX3N0YXR1cyk7CisJCQkJICAgICZ4ZHJfaW4sIGFyZ3AsICZ4ZHJfb3V0LCByZXNwLCAmY3BzKTsKIAkJbm9wcysrOwogCX0KIApAQCAtNzE2LDYgKzgxOSw4IEBACiAKIAkqaGRyX3Jlcy5zdGF0dXMgPSBzdGF0dXM7CiAJKmhkcl9yZXMubm9wcyA9IGh0b25sKG5vcHMpOworCW5mczRfY2JfZnJlZV9zbG90KGNwcy5jbHApOworCW5mc19wdXRfY2xpZW50KGNwcy5jbHApOwogCWRwcmludGsoIiVzOiBkb25lLCBzdGF0dXMgPSAldVxuIiwgX19mdW5jX18sIG50b2hsKHN0YXR1cykpOwogCXJldHVybiBycGNfc3VjY2VzczsKIH0KQEAgLTczOSw2ICs4NDQsMTIgQEAKIAkJLnJlc19tYXhzaXplID0gQ0JfT1BfUkVDQUxMX1JFU19NQVhTWiwKIAl9LAogI2lmIGRlZmluZWQoQ09ORklHX05GU19WNF8xKQorCVtPUF9DQl9MQVlPVVRSRUNBTExdID0geworCQkucHJvY2Vzc19vcCA9IChjYWxsYmFja19wcm9jZXNzX29wX3QpbmZzNF9jYWxsYmFja19sYXlvdXRyZWNhbGwsCisJCS5kZWNvZGVfYXJncyA9CisJCQkoY2FsbGJhY2tfZGVjb2RlX2FyZ190KWRlY29kZV9sYXlvdXRyZWNhbGxfYXJncywKKwkJLnJlc19tYXhzaXplID0gQ0JfT1BfTEFZT1VUUkVDQUxMX1JFU19NQVhTWiwKKwl9LAogCVtPUF9DQl9TRVFVRU5DRV0gPSB7CiAJCS5wcm9jZXNzX29wID0gKGNhbGxiYWNrX3Byb2Nlc3Nfb3BfdCluZnM0X2NhbGxiYWNrX3NlcXVlbmNlLAogCQkuZGVjb2RlX2FyZ3MgPSAoY2FsbGJhY2tfZGVjb2RlX2FyZ190KWRlY29kZV9jYl9zZXF1ZW5jZV9hcmdzLApkaWZmIC0tZ2l0IGEvZnMvbmZzL2NsaWVudC5jIGIvZnMvbmZzL2NsaWVudC5jCmluZGV4IDA4NzBkMGQuLjE5MmYyZjggMTAwNjQ0Ci0tLSBhL2ZzL25mcy9jbGllbnQuYworKysgYi9mcy9uZnMvY2xpZW50LmMKQEAgLTU2LDYgKzU2LDMwIEBACiBzdGF0aWMgTElTVF9IRUFEKG5mc19jbGllbnRfbGlzdCk7CiBzdGF0aWMgTElTVF9IRUFEKG5mc192b2x1bWVfbGlzdCk7CiBzdGF0aWMgREVDTEFSRV9XQUlUX1FVRVVFX0hFQUQobmZzX2NsaWVudF9hY3RpdmVfd3EpOworI2lmZGVmIENPTkZJR19ORlNfVjQKK3N0YXRpYyBERUZJTkVfSURSKGNiX2lkZW50X2lkcik7IC8qIFByb3RlY3RlZCBieSBuZnNfY2xpZW50X2xvY2sgKi8KKworLyoKKyAqIEdldCBhIHVuaXF1ZSBORlN2NC4wIGNhbGxiYWNrIGlkZW50aWZpZXIgd2hpY2ggd2lsbCBiZSB1c2VkCisgKiBieSB0aGUgVjQuMCBjYWxsYmFjayBzZXJ2aWNlIHRvIGxvb2t1cCB0aGUgbmZzX2NsaWVudCBzdHJ1Y3QKKyAqLworc3RhdGljIGludCBuZnNfZ2V0X2NiX2lkZW50X2lkcihzdHJ1Y3QgbmZzX2NsaWVudCAqY2xwLCBpbnQgbWlub3J2ZXJzaW9uKQoreworCWludCByZXQgPSAwOworCisJaWYgKGNscC0+cnBjX29wcy0+dmVyc2lvbiAhPSA0IHx8IG1pbm9ydmVyc2lvbiAhPSAwKQorCQlyZXR1cm4gcmV0OworcmV0cnk6CisJaWYgKCFpZHJfcHJlX2dldCgmY2JfaWRlbnRfaWRyLCBHRlBfS0VSTkVMKSkKKwkJcmV0dXJuIC1FTk9NRU07CisJc3Bpbl9sb2NrKCZuZnNfY2xpZW50X2xvY2spOworCXJldCA9IGlkcl9nZXRfbmV3KCZjYl9pZGVudF9pZHIsIGNscCwgJmNscC0+Y2xfY2JfaWRlbnQpOworCXNwaW5fdW5sb2NrKCZuZnNfY2xpZW50X2xvY2spOworCWlmIChyZXQgPT0gLUVBR0FJTikKKwkJZ290byByZXRyeTsKKwlyZXR1cm4gcmV0OworfQorI2VuZGlmIC8qIENPTkZJR19ORlNfVjQgKi8KIAogLyoKICAqIFJQQyBjcnVmdCBmb3IgTkZTCkBAIC0xNDQsNyArMTY4LDEwIEBACiAJY2xwLT5jbF9wcm90byA9IGNsX2luaXQtPnByb3RvOwogCiAjaWZkZWYgQ09ORklHX05GU19WNAotCUlOSVRfTElTVF9IRUFEKCZjbHAtPmNsX2RlbGVnYXRpb25zKTsKKwllcnIgPSBuZnNfZ2V0X2NiX2lkZW50X2lkcihjbHAsIGNsX2luaXQtPm1pbm9ydmVyc2lvbik7CisJaWYgKGVycikKKwkJZ290byBlcnJvcl9jbGVhbnVwOworCiAJc3Bpbl9sb2NrX2luaXQoJmNscC0+Y2xfbG9jayk7CiAJSU5JVF9ERUxBWUVEX1dPUksoJmNscC0+Y2xfcmVuZXdkLCBuZnM0X3JlbmV3X3N0YXRlKTsKIAlycGNfaW5pdF93YWl0X3F1ZXVlKCZjbHAtPmNsX3JwY3dhaXRxLCAiTkZTIGNsaWVudCIpOwpAQCAtMTcwLDIxICsxOTcsMTcgQEAKIH0KIAogI2lmZGVmIENPTkZJR19ORlNfVjQKLS8qCi0gKiBDbGVhcnMvcHV0cyBhbGwgbWlub3IgdmVyc2lvbiBzcGVjaWZpYyBwYXJ0cyBmcm9tIGFuIG5mc19jbGllbnQgc3RydWN0Ci0gKiByZXZlcnRpbmcgaXQgdG8gbWlub3J2ZXJzaW9uIDAuCi0gKi8KLXN0YXRpYyB2b2lkIG5mczRfY2xlYXJfY2xpZW50X21pbm9yX3ZlcnNpb24oc3RydWN0IG5mc19jbGllbnQgKmNscCkKLXsKICNpZmRlZiBDT05GSUdfTkZTX1Y0XzEKLQlpZiAobmZzNF9oYXNfc2Vzc2lvbihjbHApKSB7CitzdGF0aWMgdm9pZCBuZnM0X3NodXRkb3duX3Nlc3Npb24oc3RydWN0IG5mc19jbGllbnQgKmNscCkKK3sKKwlpZiAobmZzNF9oYXNfc2Vzc2lvbihjbHApKQogCQluZnM0X2Rlc3Ryb3lfc2Vzc2lvbihjbHAtPmNsX3Nlc3Npb24pOwotCQljbHAtPmNsX3Nlc3Npb24gPSBOVUxMOwotCX0KLQotCWNscC0+Y2xfbXZvcHMgPSBuZnNfdjRfbWlub3Jfb3BzWzBdOwotI2VuZGlmIC8qIENPTkZJR19ORlNfVjRfMSAqLwogfQorI2Vsc2UgLyogQ09ORklHX05GU19WNF8xICovCitzdGF0aWMgdm9pZCBuZnM0X3NodXRkb3duX3Nlc3Npb24oc3RydWN0IG5mc19jbGllbnQgKmNscCkKK3sKK30KKyNlbmRpZiAvKiBDT05GSUdfTkZTX1Y0XzEgKi8KIAogLyoKICAqIERlc3Ryb3kgdGhlIE5GUzQgY2FsbGJhY2sgc2VydmljZQpAQCAtMTk5LDE3ICsyMjIsNDkgQEAKIHsKIAlpZiAoX190ZXN0X2FuZF9jbGVhcl9iaXQoTkZTX0NTX1JFTkVXRCwgJmNscC0+Y2xfcmVzX3N0YXRlKSkKIAkJbmZzNF9raWxsX3JlbmV3ZChjbHApOwotCW5mczRfY2xlYXJfY2xpZW50X21pbm9yX3ZlcnNpb24oY2xwKTsKKwluZnM0X3NodXRkb3duX3Nlc3Npb24oY2xwKTsKIAluZnM0X2Rlc3Ryb3lfY2FsbGJhY2soY2xwKTsKIAlpZiAoX190ZXN0X2FuZF9jbGVhcl9iaXQoTkZTX0NTX0lETUFQLCAmY2xwLT5jbF9yZXNfc3RhdGUpKQogCQluZnNfaWRtYXBfZGVsZXRlKGNscCk7CiAKIAlycGNfZGVzdHJveV93YWl0X3F1ZXVlKCZjbHAtPmNsX3JwY3dhaXRxKTsKIH0KKworLyogaWRyX3JlbW92ZV9hbGwgaXMgbm90IG5lZWRlZCBhcyBhbGwgaWQncyBhcmUgcmVtb3ZlZCBieSBuZnNfcHV0X2NsaWVudCAqLwordm9pZCBuZnNfY2xlYW51cF9jYl9pZGVudF9pZHIodm9pZCkKK3sKKwlpZHJfZGVzdHJveSgmY2JfaWRlbnRfaWRyKTsKK30KKworLyogbmZzX2NsaWVudF9sb2NrIGhlbGQgKi8KK3N0YXRpYyB2b2lkIG5mc19jYl9pZHJfcmVtb3ZlX2xvY2tlZChzdHJ1Y3QgbmZzX2NsaWVudCAqY2xwKQoreworCWlmIChjbHAtPmNsX2NiX2lkZW50KQorCQlpZHJfcmVtb3ZlKCZjYl9pZGVudF9pZHIsIGNscC0+Y2xfY2JfaWRlbnQpOworfQorCitzdGF0aWMgdm9pZCBwbmZzX2luaXRfc2VydmVyKHN0cnVjdCBuZnNfc2VydmVyICpzZXJ2ZXIpCit7CisJcnBjX2luaXRfd2FpdF9xdWV1ZSgmc2VydmVyLT5yb2NfcnBjd2FpdHEsICJwTkZTIFJPQyIpOworfQorCiAjZWxzZQogc3RhdGljIHZvaWQgbmZzNF9zaHV0ZG93bl9jbGllbnQoc3RydWN0IG5mc19jbGllbnQgKmNscCkKIHsKIH0KKwordm9pZCBuZnNfY2xlYW51cF9jYl9pZGVudF9pZHIodm9pZCkKK3sKK30KKworc3RhdGljIHZvaWQgbmZzX2NiX2lkcl9yZW1vdmVfbG9ja2VkKHN0cnVjdCBuZnNfY2xpZW50ICpjbHApCit7Cit9CisKK3N0YXRpYyB2b2lkIHBuZnNfaW5pdF9zZXJ2ZXIoc3RydWN0IG5mc19zZXJ2ZXIgKnNlcnZlcikKK3sKK30KKwogI2VuZGlmIC8qIENPTkZJR19ORlNfVjQgKi8KIAogLyoKQEAgLTI0OCw2ICszMDMsNyBAQAogCiAJaWYgKGF0b21pY19kZWNfYW5kX2xvY2soJmNscC0+Y2xfY291bnQsICZuZnNfY2xpZW50X2xvY2spKSB7CiAJCWxpc3RfZGVsKCZjbHAtPmNsX3NoYXJlX2xpbmspOworCQluZnNfY2JfaWRyX3JlbW92ZV9sb2NrZWQoY2xwKTsKIAkJc3Bpbl91bmxvY2soJm5mc19jbGllbnRfbG9jayk7CiAKIAkJQlVHX09OKCFsaXN0X2VtcHR5KCZjbHAtPmNsX3N1cGVyYmxvY2tzKSk7CkBAIC0zNjMsNzAgKzQxOSwyOCBAQAogCXJldHVybiAwOwogfQogCi0vKgotICogRmluZCBhIGNsaWVudCBieSBJUCBhZGRyZXNzIGFuZCBwcm90b2NvbCB2ZXJzaW9uCi0gKiAtIHJldHVybnMgTlVMTCBpZiBubyBzdWNoIGNsaWVudAotICovCi1zdHJ1Y3QgbmZzX2NsaWVudCAqbmZzX2ZpbmRfY2xpZW50KGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqYWRkciwgdTMyIG5mc3ZlcnNpb24pCisvKiBDb21tb24gbWF0Y2ggcm91dGluZSBmb3IgdjQuMCBhbmQgdjQuMSBjYWxsYmFjayBzZXJ2aWNlcyAqLworYm9vbAorbmZzNF9jYl9tYXRjaF9jbGllbnQoY29uc3Qgc3RydWN0IHNvY2thZGRyICphZGRyLCBzdHJ1Y3QgbmZzX2NsaWVudCAqY2xwLAorCQkgICAgIHUzMiBtaW5vcnZlcnNpb24pCiB7Ci0Jc3RydWN0IG5mc19jbGllbnQgKmNscDsKKwlzdHJ1Y3Qgc29ja2FkZHIgKmNsYXAgPSAoc3RydWN0IHNvY2thZGRyICopJmNscC0+Y2xfYWRkcjsKIAotCXNwaW5fbG9jaygmbmZzX2NsaWVudF9sb2NrKTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNscCwgJm5mc19jbGllbnRfbGlzdCwgY2xfc2hhcmVfbGluaykgewotCQlzdHJ1Y3Qgc29ja2FkZHIgKmNsYXAgPSAoc3RydWN0IHNvY2thZGRyICopJmNscC0+Y2xfYWRkcjsKKwkvKiBEb24ndCBtYXRjaCBjbGllbnRzIHRoYXQgZmFpbGVkIHRvIGluaXRpYWxpc2UgKi8KKwlpZiAoIShjbHAtPmNsX2NvbnNfc3RhdGUgPT0gTkZTX0NTX1JFQURZIHx8CisJICAgIGNscC0+Y2xfY29uc19zdGF0ZSA9PSBORlNfQ1NfU0VTU0lPTl9JTklUSU5HKSkKKwkJcmV0dXJuIGZhbHNlOwogCi0JCS8qIERvbid0IG1hdGNoIGNsaWVudHMgdGhhdCBmYWlsZWQgdG8gaW5pdGlhbGlzZSBwcm9wZXJseSAqLwotCQlpZiAoIShjbHAtPmNsX2NvbnNfc3RhdGUgPT0gTkZTX0NTX1JFQURZIHx8Ci0JCSAgICAgIGNscC0+Y2xfY29uc19zdGF0ZSA9PSBORlNfQ1NfU0VTU0lPTl9JTklUSU5HKSkKLQkJCWNvbnRpbnVlOworCS8qIE1hdGNoIHRoZSB2ZXJzaW9uIGFuZCBtaW5vcnZlcnNpb24gKi8KKwlpZiAoY2xwLT5ycGNfb3BzLT52ZXJzaW9uICE9IDQgfHwKKwkgICAgY2xwLT5jbF9taW5vcnZlcnNpb24gIT0gbWlub3J2ZXJzaW9uKQorCQlyZXR1cm4gZmFsc2U7CiAKLQkJLyogRGlmZmVyZW50IE5GUyB2ZXJzaW9ucyBjYW5ub3Qgc2hhcmUgdGhlIHNhbWUgbmZzX2NsaWVudCAqLwotCQlpZiAoY2xwLT5ycGNfb3BzLT52ZXJzaW9uICE9IG5mc3ZlcnNpb24pCi0JCQljb250aW51ZTsKKwkvKiBNYXRjaCBvbmx5IHRoZSBJUCBhZGRyZXNzLCBub3QgdGhlIHBvcnQgbnVtYmVyICovCisJaWYgKCFuZnNfc29ja2FkZHJfbWF0Y2hfaXBhZGRyKGFkZHIsIGNsYXApKQorCQlyZXR1cm4gZmFsc2U7CiAKLQkJLyogTWF0Y2ggb25seSB0aGUgSVAgYWRkcmVzcywgbm90IHRoZSBwb3J0IG51bWJlciAqLwotCQlpZiAoIW5mc19zb2NrYWRkcl9tYXRjaF9pcGFkZHIoYWRkciwgY2xhcCkpCi0JCQljb250aW51ZTsKLQotCQlhdG9taWNfaW5jKCZjbHAtPmNsX2NvdW50KTsKLQkJc3Bpbl91bmxvY2soJm5mc19jbGllbnRfbG9jayk7Ci0JCXJldHVybiBjbHA7Ci0JfQotCXNwaW5fdW5sb2NrKCZuZnNfY2xpZW50X2xvY2spOwotCXJldHVybiBOVUxMOwotfQotCi0vKgotICogRmluZCBhIGNsaWVudCBieSBJUCBhZGRyZXNzIGFuZCBwcm90b2NvbCB2ZXJzaW9uCi0gKiAtIHJldHVybnMgTlVMTCBpZiBubyBzdWNoIGNsaWVudAotICovCi1zdHJ1Y3QgbmZzX2NsaWVudCAqbmZzX2ZpbmRfY2xpZW50X25leHQoc3RydWN0IG5mc19jbGllbnQgKmNscCkKLXsKLQlzdHJ1Y3Qgc29ja2FkZHIgKnNhcCA9IChzdHJ1Y3Qgc29ja2FkZHIgKikmY2xwLT5jbF9hZGRyOwotCXUzMiBuZnN2ZXJzID0gY2xwLT5ycGNfb3BzLT52ZXJzaW9uOwotCi0Jc3Bpbl9sb2NrKCZuZnNfY2xpZW50X2xvY2spOwotCWxpc3RfZm9yX2VhY2hfZW50cnlfY29udGludWUoY2xwLCAmbmZzX2NsaWVudF9saXN0LCBjbF9zaGFyZV9saW5rKSB7Ci0JCXN0cnVjdCBzb2NrYWRkciAqY2xhcCA9IChzdHJ1Y3Qgc29ja2FkZHIgKikmY2xwLT5jbF9hZGRyOwotCi0JCS8qIERvbid0IG1hdGNoIGNsaWVudHMgdGhhdCBmYWlsZWQgdG8gaW5pdGlhbGlzZSBwcm9wZXJseSAqLwotCQlpZiAoY2xwLT5jbF9jb25zX3N0YXRlICE9IE5GU19DU19SRUFEWSkKLQkJCWNvbnRpbnVlOwotCi0JCS8qIERpZmZlcmVudCBORlMgdmVyc2lvbnMgY2Fubm90IHNoYXJlIHRoZSBzYW1lIG5mc19jbGllbnQgKi8KLQkJaWYgKGNscC0+cnBjX29wcy0+dmVyc2lvbiAhPSBuZnN2ZXJzKQotCQkJY29udGludWU7Ci0KLQkJLyogTWF0Y2ggb25seSB0aGUgSVAgYWRkcmVzcywgbm90IHRoZSBwb3J0IG51bWJlciAqLwotCQlpZiAoIW5mc19zb2NrYWRkcl9tYXRjaF9pcGFkZHIoc2FwLCBjbGFwKSkKLQkJCWNvbnRpbnVlOwotCi0JCWF0b21pY19pbmMoJmNscC0+Y2xfY291bnQpOwotCQlzcGluX3VubG9jaygmbmZzX2NsaWVudF9sb2NrKTsKLQkJcmV0dXJuIGNscDsKLQl9Ci0Jc3Bpbl91bmxvY2soJm5mc19jbGllbnRfbG9jayk7Ci0JcmV0dXJuIE5VTEw7CisJcmV0dXJuIHRydWU7CiB9CiAKIC8qCkBAIC05ODgsNiArMTAwMiwyNyBAQAogCXRhcmdldC0+b3B0aW9ucyA9IHNvdXJjZS0+b3B0aW9uczsKIH0KIAorc3RhdGljIHZvaWQgbmZzX3NlcnZlcl9pbnNlcnRfbGlzdHMoc3RydWN0IG5mc19zZXJ2ZXIgKnNlcnZlcikKK3sKKwlzdHJ1Y3QgbmZzX2NsaWVudCAqY2xwID0gc2VydmVyLT5uZnNfY2xpZW50OworCisJc3Bpbl9sb2NrKCZuZnNfY2xpZW50X2xvY2spOworCWxpc3RfYWRkX3RhaWxfcmN1KCZzZXJ2ZXItPmNsaWVudF9saW5rLCAmY2xwLT5jbF9zdXBlcmJsb2Nrcyk7CisJbGlzdF9hZGRfdGFpbCgmc2VydmVyLT5tYXN0ZXJfbGluaywgJm5mc192b2x1bWVfbGlzdCk7CisJc3Bpbl91bmxvY2soJm5mc19jbGllbnRfbG9jayk7CisKK30KKworc3RhdGljIHZvaWQgbmZzX3NlcnZlcl9yZW1vdmVfbGlzdHMoc3RydWN0IG5mc19zZXJ2ZXIgKnNlcnZlcikKK3sKKwlzcGluX2xvY2soJm5mc19jbGllbnRfbG9jayk7CisJbGlzdF9kZWxfcmN1KCZzZXJ2ZXItPmNsaWVudF9saW5rKTsKKwlsaXN0X2RlbCgmc2VydmVyLT5tYXN0ZXJfbGluayk7CisJc3Bpbl91bmxvY2soJm5mc19jbGllbnRfbG9jayk7CisKKwlzeW5jaHJvbml6ZV9yY3UoKTsKK30KKwogLyoKICAqIEFsbG9jYXRlIGFuZCBpbml0aWFsaXNlIGEgc2VydmVyIHJlY29yZAogICovCkBAIC0xMDA0LDYgKzEwMzksNyBAQAogCS8qIFplcm8gb3V0IHRoZSBORlMgc3RhdGUgc3R1ZmYgKi8KIAlJTklUX0xJU1RfSEVBRCgmc2VydmVyLT5jbGllbnRfbGluayk7CiAJSU5JVF9MSVNUX0hFQUQoJnNlcnZlci0+bWFzdGVyX2xpbmspOworCUlOSVRfTElTVF9IRUFEKCZzZXJ2ZXItPmRlbGVnYXRpb25zKTsKIAogCWF0b21pY19zZXQoJnNlcnZlci0+YWN0aXZlLCAwKTsKIApAQCAtMTAxOSw2ICsxMDU1LDggQEAKIAkJcmV0dXJuIE5VTEw7CiAJfQogCisJcG5mc19pbml0X3NlcnZlcihzZXJ2ZXIpOworCiAJcmV0dXJuIHNlcnZlcjsKIH0KIApAQCAtMTAyOSwxMSArMTA2Nyw4IEBACiB7CiAJZHByaW50aygiLS0+IG5mc19mcmVlX3NlcnZlcigpXG4iKTsKIAorCW5mc19zZXJ2ZXJfcmVtb3ZlX2xpc3RzKHNlcnZlcik7CiAJdW5zZXRfcG5mc19sYXlvdXRkcml2ZXIoc2VydmVyKTsKLQlzcGluX2xvY2soJm5mc19jbGllbnRfbG9jayk7Ci0JbGlzdF9kZWwoJnNlcnZlci0+Y2xpZW50X2xpbmspOwotCWxpc3RfZGVsKCZzZXJ2ZXItPm1hc3Rlcl9saW5rKTsKLQlzcGluX3VubG9jaygmbmZzX2NsaWVudF9sb2NrKTsKIAogCWlmIChzZXJ2ZXItPmRlc3Ryb3kgIT0gTlVMTCkKIAkJc2VydmVyLT5kZXN0cm95KHNlcnZlcik7CkBAIC0xMTA4LDExICsxMTQzLDcgQEAKIAkJKHVuc2lnbmVkIGxvbmcgbG9uZykgc2VydmVyLT5mc2lkLm1ham9yLAogCQkodW5zaWduZWQgbG9uZyBsb25nKSBzZXJ2ZXItPmZzaWQubWlub3IpOwogCi0Jc3Bpbl9sb2NrKCZuZnNfY2xpZW50X2xvY2spOwotCWxpc3RfYWRkX3RhaWwoJnNlcnZlci0+Y2xpZW50X2xpbmssICZzZXJ2ZXItPm5mc19jbGllbnQtPmNsX3N1cGVyYmxvY2tzKTsKLQlsaXN0X2FkZF90YWlsKCZzZXJ2ZXItPm1hc3Rlcl9saW5rLCAmbmZzX3ZvbHVtZV9saXN0KTsKLQlzcGluX3VubG9jaygmbmZzX2NsaWVudF9sb2NrKTsKLQorCW5mc19zZXJ2ZXJfaW5zZXJ0X2xpc3RzKHNlcnZlcik7CiAJc2VydmVyLT5tb3VudF90aW1lID0gamlmZmllczsKIAluZnNfZnJlZV9mYXR0cihmYXR0cik7CiAJcmV0dXJuIHNlcnZlcjsKQEAgLTExMjUsNiArMTE1NiwxMDEgQEAKIAogI2lmZGVmIENPTkZJR19ORlNfVjQKIC8qCisgKiBORlN2NC4wIGNhbGxiYWNrIHRocmVhZCBoZWxwZXIKKyAqCisgKiBGaW5kIGEgY2xpZW50IGJ5IElQIGFkZHJlc3MsIHByb3RvY29sIHZlcnNpb24sIGFuZCBtaW5vcnZlcnNpb24KKyAqCisgKiBDYWxsZWQgZnJvbSB0aGUgcGdfYXV0aGVudGljYXRlIG1ldGhvZC4gVGhlIGNhbGxiYWNrIGlkZW50aWZpZXIKKyAqIGlzIG5vdCB1c2VkIGFzIGl0IGhhcyBub3QgYmVlbiBkZWNvZGVkLgorICoKKyAqIFJldHVybnMgTlVMTCBpZiBubyBzdWNoIGNsaWVudAorICovCitzdHJ1Y3QgbmZzX2NsaWVudCAqCituZnM0X2ZpbmRfY2xpZW50X25vX2lkZW50KGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqYWRkcikKK3sKKwlzdHJ1Y3QgbmZzX2NsaWVudCAqY2xwOworCisJc3Bpbl9sb2NrKCZuZnNfY2xpZW50X2xvY2spOworCWxpc3RfZm9yX2VhY2hfZW50cnkoY2xwLCAmbmZzX2NsaWVudF9saXN0LCBjbF9zaGFyZV9saW5rKSB7CisJCWlmIChuZnM0X2NiX21hdGNoX2NsaWVudChhZGRyLCBjbHAsIDApID09IGZhbHNlKQorCQkJY29udGludWU7CisJCWF0b21pY19pbmMoJmNscC0+Y2xfY291bnQpOworCQlzcGluX3VubG9jaygmbmZzX2NsaWVudF9sb2NrKTsKKwkJcmV0dXJuIGNscDsKKwl9CisJc3Bpbl91bmxvY2soJm5mc19jbGllbnRfbG9jayk7CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qCisgKiBORlN2NC4wIGNhbGxiYWNrIHRocmVhZCBoZWxwZXIKKyAqCisgKiBGaW5kIGEgY2xpZW50IGJ5IGNhbGxiYWNrIGlkZW50aWZpZXIKKyAqLworc3RydWN0IG5mc19jbGllbnQgKgorbmZzNF9maW5kX2NsaWVudF9pZGVudChpbnQgY2JfaWRlbnQpCit7CisJc3RydWN0IG5mc19jbGllbnQgKmNscDsKKworCXNwaW5fbG9jaygmbmZzX2NsaWVudF9sb2NrKTsKKwljbHAgPSBpZHJfZmluZCgmY2JfaWRlbnRfaWRyLCBjYl9pZGVudCk7CisJaWYgKGNscCkKKwkJYXRvbWljX2luYygmY2xwLT5jbF9jb3VudCk7CisJc3Bpbl91bmxvY2soJm5mc19jbGllbnRfbG9jayk7CisJcmV0dXJuIGNscDsKK30KKworI2lmIGRlZmluZWQoQ09ORklHX05GU19WNF8xKQorLyoKKyAqIE5GU3Y0LjEgY2FsbGJhY2sgdGhyZWFkIGhlbHBlcgorICogRm9yIENCX0NPTVBPVU5EIGNhbGxzLCBmaW5kIGEgY2xpZW50IGJ5IElQIGFkZHJlc3MsIHByb3RvY29sIHZlcnNpb24sCisgKiBtaW5vcnZlcnNpb24sIGFuZCBzZXNzaW9uSUQKKyAqCisgKiBDUkVBVEVfU0VTU0lPTiB0cmlnZ2VycyBhIENCX05VTEwgcGluZyBmcm9tIHNlcnZlcnMuIFRoZSBjYWxsYmFjayBzZXJ2aWNlCisgKiBzZXNzaW9uaWQgY2FuIG9ubHkgYmUgc2V0IGFmdGVyIHRoZSBDUkVBVEVfU0VTU0lPTiByZXR1cm4sIHNvIGEgQ0JfTlVMTAorICogY2FuIGFycml2ZSBiZWZvcmUgdGhlIGNhbGxiYWNrIHNlc3Npb25pZCBpcyBzZXQuIEZvciBDQl9OVUxMIGNhbGxzLAorICogZmluZCBhIGNsaWVudCBieSBJUCBhZGRyZXNzIHByb3RvY29sIHZlcnNpb24sIGFuZCBtaW5vcnZlcnNpb24uCisgKgorICogUmV0dXJucyBOVUxMIGlmIG5vIHN1Y2ggY2xpZW50CisgKi8KK3N0cnVjdCBuZnNfY2xpZW50ICoKK25mczRfZmluZF9jbGllbnRfc2Vzc2lvbmlkKGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqYWRkciwKKwkJCSAgIHN0cnVjdCBuZnM0X3Nlc3Npb25pZCAqc2lkLCBpbnQgaXNfY2JfY29tcG91bmQpCit7CisJc3RydWN0IG5mc19jbGllbnQgKmNscDsKKworCXNwaW5fbG9jaygmbmZzX2NsaWVudF9sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNscCwgJm5mc19jbGllbnRfbGlzdCwgY2xfc2hhcmVfbGluaykgeworCQlpZiAobmZzNF9jYl9tYXRjaF9jbGllbnQoYWRkciwgY2xwLCAxKSA9PSBmYWxzZSkKKwkJCWNvbnRpbnVlOworCisJCWlmICghbmZzNF9oYXNfc2Vzc2lvbihjbHApKQorCQkJY29udGludWU7CisKKwkJLyogTWF0Y2ggc2Vzc2lvbmlkIHVubGVzcyBjYl9udWxsIGNhbGwqLworCQlpZiAoaXNfY2JfY29tcG91bmQgJiYgKG1lbWNtcChjbHAtPmNsX3Nlc3Npb24tPnNlc3NfaWQuZGF0YSwKKwkJICAgIHNpZC0+ZGF0YSwgTkZTNF9NQVhfU0VTU0lPTklEX0xFTikgIT0gMCkpCisJCQljb250aW51ZTsKKworCQlhdG9taWNfaW5jKCZjbHAtPmNsX2NvdW50KTsKKwkJc3Bpbl91bmxvY2soJm5mc19jbGllbnRfbG9jayk7CisJCXJldHVybiBjbHA7CisJfQorCXNwaW5fdW5sb2NrKCZuZnNfY2xpZW50X2xvY2spOworCXJldHVybiBOVUxMOworfQorCisjZWxzZSAvKiBDT05GSUdfTkZTX1Y0XzEgKi8KKworc3RydWN0IG5mc19jbGllbnQgKgorbmZzNF9maW5kX2NsaWVudF9zZXNzaW9uaWQoY29uc3Qgc3RydWN0IHNvY2thZGRyICphZGRyLAorCQkJICAgc3RydWN0IG5mczRfc2Vzc2lvbmlkICpzaWQsIGludCBpc19jYl9jb21wb3VuZCkKK3sKKwlyZXR1cm4gTlVMTDsKK30KKyNlbmRpZiAvKiBDT05GSUdfTkZTX1Y0XzEgKi8KKworLyoKICAqIEluaXRpYWxpemUgdGhlIE5GUzQgY2FsbGJhY2sgc2VydmljZQogICovCiBzdGF0aWMgaW50IG5mczRfaW5pdF9jYWxsYmFjayhzdHJ1Y3QgbmZzX2NsaWVudCAqY2xwKQpAQCAtMTM0MiwxMSArMTQ2OCw3IEBACiAJaWYgKHNlcnZlci0+bmFtZWxlbiA9PSAwIHx8IHNlcnZlci0+bmFtZWxlbiA+IE5GUzRfTUFYTkFNTEVOKQogCQlzZXJ2ZXItPm5hbWVsZW4gPSBORlM0X01BWE5BTUxFTjsKIAotCXNwaW5fbG9jaygmbmZzX2NsaWVudF9sb2NrKTsKLQlsaXN0X2FkZF90YWlsKCZzZXJ2ZXItPmNsaWVudF9saW5rLCAmc2VydmVyLT5uZnNfY2xpZW50LT5jbF9zdXBlcmJsb2Nrcyk7Ci0JbGlzdF9hZGRfdGFpbCgmc2VydmVyLT5tYXN0ZXJfbGluaywgJm5mc192b2x1bWVfbGlzdCk7Ci0Jc3Bpbl91bmxvY2soJm5mc19jbGllbnRfbG9jayk7Ci0KKwluZnNfc2VydmVyX2luc2VydF9saXN0cyhzZXJ2ZXIpOwogCXNlcnZlci0+bW91bnRfdGltZSA9IGppZmZpZXM7CiBvdXQ6CiAJbmZzX2ZyZWVfZmF0dHIoZmF0dHIpOwpAQCAtMTU1MSwxMSArMTY3Myw3IEBACiAJaWYgKGVycm9yIDwgMCkKIAkJZ290byBvdXRfZnJlZV9zZXJ2ZXI7CiAKLQlzcGluX2xvY2soJm5mc19jbGllbnRfbG9jayk7Ci0JbGlzdF9hZGRfdGFpbCgmc2VydmVyLT5jbGllbnRfbGluaywgJnNlcnZlci0+bmZzX2NsaWVudC0+Y2xfc3VwZXJibG9ja3MpOwotCWxpc3RfYWRkX3RhaWwoJnNlcnZlci0+bWFzdGVyX2xpbmssICZuZnNfdm9sdW1lX2xpc3QpOwotCXNwaW5fdW5sb2NrKCZuZnNfY2xpZW50X2xvY2spOwotCisJbmZzX3NlcnZlcl9pbnNlcnRfbGlzdHMoc2VydmVyKTsKIAlzZXJ2ZXItPm1vdW50X3RpbWUgPSBqaWZmaWVzOwogCiAJbmZzX2ZyZWVfZmF0dHIoZmF0dHJfZnNpbmZvKTsKZGlmZiAtLWdpdCBhL2ZzL25mcy9kZWxlZ2F0aW9uLmMgYi9mcy9uZnMvZGVsZWdhdGlvbi5jCmluZGV4IDFmZDYyZmMuLjM2NGU0MzIgMTAwNjQ0Ci0tLSBhL2ZzL25mcy9kZWxlZ2F0aW9uLmMKKysrIGIvZnMvbmZzL2RlbGVnYXRpb24uYwpAQCAtNDAsMTEgKzQwLDIzIEBACiAJY2FsbF9yY3UoJmRlbGVnYXRpb24tPnJjdSwgbmZzX2ZyZWVfZGVsZWdhdGlvbl9jYWxsYmFjayk7CiB9CiAKKy8qKgorICogbmZzX21hcmtfZGVsZWdhdGlvbl9yZWZlcmVuY2VkIC0gc2V0IGRlbGVnYXRpb24ncyBSRUZFUkVOQ0VEIGZsYWcKKyAqIEBkZWxlZ2F0aW9uOiBkZWxlZ2F0aW9uIHRvIHByb2Nlc3MKKyAqCisgKi8KIHZvaWQgbmZzX21hcmtfZGVsZWdhdGlvbl9yZWZlcmVuY2VkKHN0cnVjdCBuZnNfZGVsZWdhdGlvbiAqZGVsZWdhdGlvbikKIHsKIAlzZXRfYml0KE5GU19ERUxFR0FUSU9OX1JFRkVSRU5DRUQsICZkZWxlZ2F0aW9uLT5mbGFncyk7CiB9CiAKKy8qKgorICogbmZzX2hhdmVfZGVsZWdhdGlvbiAtIGNoZWNrIGlmIGlub2RlIGhhcyBhIGRlbGVnYXRpb24KKyAqIEBpbm9kZTogaW5vZGUgdG8gY2hlY2sKKyAqIEBmbGFnczogZGVsZWdhdGlvbiB0eXBlcyB0byBjaGVjayBmb3IKKyAqCisgKiBSZXR1cm5zIG9uZSBpZiBpbm9kZSBoYXMgdGhlIGluZGljYXRlZCBkZWxlZ2F0aW9uLCBvdGhlcndpc2UgemVyby4KKyAqLwogaW50IG5mc19oYXZlX2RlbGVnYXRpb24oc3RydWN0IGlub2RlICppbm9kZSwgZm1vZGVfdCBmbGFncykKIHsKIAlzdHJ1Y3QgbmZzX2RlbGVnYXRpb24gKmRlbGVnYXRpb247CkBAIC0xMTksMTAgKzEzMSwxNSBAQAogCXJldHVybiAwOwogfQogCi0vKgotICogU2V0IHVwIGEgZGVsZWdhdGlvbiBvbiBhbiBpbm9kZQorLyoqCisgKiBuZnNfaW5vZGVfcmVjbGFpbV9kZWxlZ2F0aW9uIC0gcHJvY2VzcyBhIGRlbGVnYXRpb24gcmVjbGFpbSByZXF1ZXN0CisgKiBAaW5vZGU6IGlub2RlIHRvIHByb2Nlc3MKKyAqIEBjcmVkOiBjcmVkZW50aWFsIHRvIHVzZSBmb3IgcmVxdWVzdAorICogQHJlczogbmV3IGRlbGVnYXRpb24gc3RhdGUgZnJvbSBzZXJ2ZXIKKyAqCiAgKi8KLXZvaWQgbmZzX2lub2RlX3JlY2xhaW1fZGVsZWdhdGlvbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgcnBjX2NyZWQgKmNyZWQsIHN0cnVjdCBuZnNfb3BlbnJlcyAqcmVzKQordm9pZCBuZnNfaW5vZGVfcmVjbGFpbV9kZWxlZ2F0aW9uKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBycGNfY3JlZCAqY3JlZCwKKwkJCQkgIHN0cnVjdCBuZnNfb3BlbnJlcyAqcmVzKQogewogCXN0cnVjdCBuZnNfZGVsZWdhdGlvbiAqZGVsZWdhdGlvbjsKIAlzdHJ1Y3QgcnBjX2NyZWQgKm9sZGNyZWQgPSBOVUxMOwpAQCAtMTc1LDM4ICsxOTIsNTIgQEAKIAlyZXR1cm4gaW5vZGU7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgbmZzX2RlbGVnYXRpb24gKm5mc19kZXRhY2hfZGVsZWdhdGlvbl9sb2NrZWQoc3RydWN0IG5mc19pbm9kZSAqbmZzaSwKLQkJCQkJCQkgICBjb25zdCBuZnM0X3N0YXRlaWQgKnN0YXRlaWQsCi0JCQkJCQkJICAgc3RydWN0IG5mc19jbGllbnQgKmNscCkKK3N0YXRpYyBzdHJ1Y3QgbmZzX2RlbGVnYXRpb24gKgorbmZzX2RldGFjaF9kZWxlZ2F0aW9uX2xvY2tlZChzdHJ1Y3QgbmZzX2lub2RlICpuZnNpLAorCQkJICAgICBzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyKQogewogCXN0cnVjdCBuZnNfZGVsZWdhdGlvbiAqZGVsZWdhdGlvbiA9CiAJCXJjdV9kZXJlZmVyZW5jZV9wcm90ZWN0ZWQobmZzaS0+ZGVsZWdhdGlvbiwKLQkJCQkJICBsb2NrZGVwX2lzX2hlbGQoJmNscC0+Y2xfbG9jaykpOworCQkJCWxvY2tkZXBfaXNfaGVsZCgmc2VydmVyLT5uZnNfY2xpZW50LT5jbF9sb2NrKSk7CiAKIAlpZiAoZGVsZWdhdGlvbiA9PSBOVUxMKQogCQlnb3RvIG5vbWF0Y2g7CisKIAlzcGluX2xvY2soJmRlbGVnYXRpb24tPmxvY2spOwotCWlmIChzdGF0ZWlkICE9IE5VTEwgJiYgbWVtY21wKGRlbGVnYXRpb24tPnN0YXRlaWQuZGF0YSwgc3RhdGVpZC0+ZGF0YSwKLQkJCQlzaXplb2YoZGVsZWdhdGlvbi0+c3RhdGVpZC5kYXRhKSkgIT0gMCkKLQkJZ290byBub21hdGNoX3VubG9jazsKIAlsaXN0X2RlbF9yY3UoJmRlbGVnYXRpb24tPnN1cGVyX2xpc3QpOwogCWRlbGVnYXRpb24tPmlub2RlID0gTlVMTDsKIAluZnNpLT5kZWxlZ2F0aW9uX3N0YXRlID0gMDsKIAlyY3VfYXNzaWduX3BvaW50ZXIobmZzaS0+ZGVsZWdhdGlvbiwgTlVMTCk7CiAJc3Bpbl91bmxvY2soJmRlbGVnYXRpb24tPmxvY2spOwogCXJldHVybiBkZWxlZ2F0aW9uOwotbm9tYXRjaF91bmxvY2s6Ci0Jc3Bpbl91bmxvY2soJmRlbGVnYXRpb24tPmxvY2spOwogbm9tYXRjaDoKIAlyZXR1cm4gTlVMTDsKIH0KIAotLyoKLSAqIFNldCB1cCBhIGRlbGVnYXRpb24gb24gYW4gaW5vZGUKK3N0YXRpYyBzdHJ1Y3QgbmZzX2RlbGVnYXRpb24gKm5mc19kZXRhY2hfZGVsZWdhdGlvbihzdHJ1Y3QgbmZzX2lub2RlICpuZnNpLAorCQkJCQkJICAgIHN0cnVjdCBuZnNfc2VydmVyICpzZXJ2ZXIpCit7CisJc3RydWN0IG5mc19jbGllbnQgKmNscCA9IHNlcnZlci0+bmZzX2NsaWVudDsKKwlzdHJ1Y3QgbmZzX2RlbGVnYXRpb24gKmRlbGVnYXRpb247CisKKwlzcGluX2xvY2soJmNscC0+Y2xfbG9jayk7CisJZGVsZWdhdGlvbiA9IG5mc19kZXRhY2hfZGVsZWdhdGlvbl9sb2NrZWQobmZzaSwgc2VydmVyKTsKKwlzcGluX3VubG9jaygmY2xwLT5jbF9sb2NrKTsKKwlyZXR1cm4gZGVsZWdhdGlvbjsKK30KKworLyoqCisgKiBuZnNfaW5vZGVfc2V0X2RlbGVnYXRpb24gLSBzZXQgdXAgYSBkZWxlZ2F0aW9uIG9uIGFuIGlub2RlCisgKiBAaW5vZGU6IGlub2RlIHRvIHdoaWNoIGRlbGVnYXRpb24gYXBwbGllcworICogQGNyZWQ6IGNyZWQgdG8gdXNlIGZvciBzdWJzZXF1ZW50IGRlbGVnYXRpb24gcHJvY2Vzc2luZworICogQHJlczogbmV3IGRlbGVnYXRpb24gc3RhdGUgZnJvbSBzZXJ2ZXIKKyAqCisgKiBSZXR1cm5zIHplcm8gb24gc3VjY2Vzcywgb3IgYSBuZWdhdGl2ZSBlcnJubyB2YWx1ZS4KICAqLwogaW50IG5mc19pbm9kZV9zZXRfZGVsZWdhdGlvbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgcnBjX2NyZWQgKmNyZWQsIHN0cnVjdCBuZnNfb3BlbnJlcyAqcmVzKQogewotCXN0cnVjdCBuZnNfY2xpZW50ICpjbHAgPSBORlNfU0VSVkVSKGlub2RlKS0+bmZzX2NsaWVudDsKKwlzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyID0gTkZTX1NFUlZFUihpbm9kZSk7CisJc3RydWN0IG5mc19jbGllbnQgKmNscCA9IHNlcnZlci0+bmZzX2NsaWVudDsKIAlzdHJ1Y3QgbmZzX2lub2RlICpuZnNpID0gTkZTX0koaW5vZGUpOwogCXN0cnVjdCBuZnNfZGVsZWdhdGlvbiAqZGVsZWdhdGlvbiwgKm9sZF9kZWxlZ2F0aW9uOwogCXN0cnVjdCBuZnNfZGVsZWdhdGlvbiAqZnJlZW1lID0gTlVMTDsKQEAgLTIyNyw3ICsyNTgsNyBAQAogCiAJc3Bpbl9sb2NrKCZjbHAtPmNsX2xvY2spOwogCW9sZF9kZWxlZ2F0aW9uID0gcmN1X2RlcmVmZXJlbmNlX3Byb3RlY3RlZChuZnNpLT5kZWxlZ2F0aW9uLAotCQkJCQkJICAgbG9ja2RlcF9pc19oZWxkKCZjbHAtPmNsX2xvY2spKTsKKwkJCQkJbG9ja2RlcF9pc19oZWxkKCZjbHAtPmNsX2xvY2spKTsKIAlpZiAob2xkX2RlbGVnYXRpb24gIT0gTlVMTCkgewogCQlpZiAobWVtY21wKCZkZWxlZ2F0aW9uLT5zdGF0ZWlkLCAmb2xkX2RlbGVnYXRpb24tPnN0YXRlaWQsCiAJCQkJCXNpemVvZihvbGRfZGVsZWdhdGlvbi0+c3RhdGVpZCkpID09IDAgJiYKQEAgLTI0Niw5ICsyNzcsOSBAQAogCQkJZGVsZWdhdGlvbiA9IE5VTEw7CiAJCQlnb3RvIG91dDsKIAkJfQotCQlmcmVlbWUgPSBuZnNfZGV0YWNoX2RlbGVnYXRpb25fbG9ja2VkKG5mc2ksIE5VTEwsIGNscCk7CisJCWZyZWVtZSA9IG5mc19kZXRhY2hfZGVsZWdhdGlvbl9sb2NrZWQobmZzaSwgc2VydmVyKTsKIAl9Ci0JbGlzdF9hZGRfcmN1KCZkZWxlZ2F0aW9uLT5zdXBlcl9saXN0LCAmY2xwLT5jbF9kZWxlZ2F0aW9ucyk7CisJbGlzdF9hZGRfcmN1KCZkZWxlZ2F0aW9uLT5zdXBlcl9saXN0LCAmc2VydmVyLT5kZWxlZ2F0aW9ucyk7CiAJbmZzaS0+ZGVsZWdhdGlvbl9zdGF0ZSA9IGRlbGVnYXRpb24tPnR5cGU7CiAJcmN1X2Fzc2lnbl9wb2ludGVyKG5mc2ktPmRlbGVnYXRpb24sIGRlbGVnYXRpb24pOwogCWRlbGVnYXRpb24gPSBOVUxMOwpAQCAtMjkwLDczICszMjEsODUgQEAKIAlyZXR1cm4gZXJyOwogfQogCi0vKgotICogUmV0dXJuIGFsbCBkZWxlZ2F0aW9ucyB0aGF0IGhhdmUgYmVlbiBtYXJrZWQgZm9yIHJldHVybgorLyoqCisgKiBuZnNfY2xpZW50X3JldHVybl9tYXJrZWRfZGVsZWdhdGlvbnMgLSByZXR1cm4gcHJldmlvdXNseSBtYXJrZWQgZGVsZWdhdGlvbnMKKyAqIEBjbHA6IG5mc19jbGllbnQgdG8gcHJvY2VzcworICoKKyAqIFJldHVybnMgemVybyBvbiBzdWNjZXNzLCBvciBhIG5lZ2F0aXZlIGVycm5vIHZhbHVlLgogICovCiBpbnQgbmZzX2NsaWVudF9yZXR1cm5fbWFya2VkX2RlbGVnYXRpb25zKHN0cnVjdCBuZnNfY2xpZW50ICpjbHApCiB7CiAJc3RydWN0IG5mc19kZWxlZ2F0aW9uICpkZWxlZ2F0aW9uOworCXN0cnVjdCBuZnNfc2VydmVyICpzZXJ2ZXI7CiAJc3RydWN0IGlub2RlICppbm9kZTsKIAlpbnQgZXJyID0gMDsKIAogcmVzdGFydDoKIAlyY3VfcmVhZF9sb2NrKCk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UoZGVsZWdhdGlvbiwgJmNscC0+Y2xfZGVsZWdhdGlvbnMsIHN1cGVyX2xpc3QpIHsKLQkJaWYgKCF0ZXN0X2FuZF9jbGVhcl9iaXQoTkZTX0RFTEVHQVRJT05fUkVUVVJOLCAmZGVsZWdhdGlvbi0+ZmxhZ3MpKQotCQkJY29udGludWU7Ci0JCWlub2RlID0gbmZzX2RlbGVnYXRpb25fZ3JhYl9pbm9kZShkZWxlZ2F0aW9uKTsKLQkJaWYgKGlub2RlID09IE5VTEwpCi0JCQljb250aW51ZTsKLQkJc3Bpbl9sb2NrKCZjbHAtPmNsX2xvY2spOwotCQlkZWxlZ2F0aW9uID0gbmZzX2RldGFjaF9kZWxlZ2F0aW9uX2xvY2tlZChORlNfSShpbm9kZSksIE5VTEwsIGNscCk7Ci0JCXNwaW5fdW5sb2NrKCZjbHAtPmNsX2xvY2spOwotCQlyY3VfcmVhZF91bmxvY2soKTsKLQkJaWYgKGRlbGVnYXRpb24gIT0gTlVMTCkgewotCQkJZmlsZW1hcF9mbHVzaChpbm9kZS0+aV9tYXBwaW5nKTsKLQkJCWVyciA9IF9fbmZzX2lub2RlX3JldHVybl9kZWxlZ2F0aW9uKGlub2RlLCBkZWxlZ2F0aW9uLCAwKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShzZXJ2ZXIsICZjbHAtPmNsX3N1cGVyYmxvY2tzLCBjbGllbnRfbGluaykgeworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShkZWxlZ2F0aW9uLCAmc2VydmVyLT5kZWxlZ2F0aW9ucywKKwkJCQkJCQkJc3VwZXJfbGlzdCkgeworCQkJaWYgKCF0ZXN0X2FuZF9jbGVhcl9iaXQoTkZTX0RFTEVHQVRJT05fUkVUVVJOLAorCQkJCQkJCSZkZWxlZ2F0aW9uLT5mbGFncykpCisJCQkJY29udGludWU7CisJCQlpbm9kZSA9IG5mc19kZWxlZ2F0aW9uX2dyYWJfaW5vZGUoZGVsZWdhdGlvbik7CisJCQlpZiAoaW5vZGUgPT0gTlVMTCkKKwkJCQljb250aW51ZTsKKwkJCWRlbGVnYXRpb24gPSBuZnNfZGV0YWNoX2RlbGVnYXRpb24oTkZTX0koaW5vZGUpLAorCQkJCQkJCQlzZXJ2ZXIpOworCQkJcmN1X3JlYWRfdW5sb2NrKCk7CisKKwkJCWlmIChkZWxlZ2F0aW9uICE9IE5VTEwpIHsKKwkJCQlmaWxlbWFwX2ZsdXNoKGlub2RlLT5pX21hcHBpbmcpOworCQkJCWVyciA9IF9fbmZzX2lub2RlX3JldHVybl9kZWxlZ2F0aW9uKGlub2RlLAorCQkJCQkJCQlkZWxlZ2F0aW9uLCAwKTsKKwkJCX0KKwkJCWlwdXQoaW5vZGUpOworCQkJaWYgKCFlcnIpCisJCQkJZ290byByZXN0YXJ0OworCQkJc2V0X2JpdChORlM0Q0xOVF9ERUxFR1JFVFVSTiwgJmNscC0+Y2xfc3RhdGUpOworCQkJcmV0dXJuIGVycjsKIAkJfQotCQlpcHV0KGlub2RlKTsKLQkJaWYgKCFlcnIpCi0JCQlnb3RvIHJlc3RhcnQ7Ci0JCXNldF9iaXQoTkZTNENMTlRfREVMRUdSRVRVUk4sICZjbHAtPmNsX3N0YXRlKTsKLQkJcmV0dXJuIGVycjsKIAl9CiAJcmN1X3JlYWRfdW5sb2NrKCk7CiAJcmV0dXJuIDA7CiB9CiAKLS8qCi0gKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGRlbGVnYXRpb24gd2l0aG91dCByZWNsYWltaW5nIG9wZW5zCi0gKiBvciBwcm90ZWN0aW5nIGFnYWluc3QgZGVsZWdhdGlvbiByZWNsYWltcy4KLSAqIEl0IGlzIHRoZXJlZm9yZSByZWFsbHkgb25seSBzYWZlIHRvIGJlIGNhbGxlZCBmcm9tCi0gKiBuZnM0X2NsZWFyX2lub2RlKCkKKy8qKgorICogbmZzX2lub2RlX3JldHVybl9kZWxlZ2F0aW9uX25vcmVjbGFpbSAtIHJldHVybiBkZWxlZ2F0aW9uLCBkb24ndCByZWNsYWltIG9wZW5zCisgKiBAaW5vZGU6IGlub2RlIHRvIHByb2Nlc3MKKyAqCisgKiBEb2VzIG5vdCBwcm90ZWN0IGFnYWluc3QgZGVsZWdhdGlvbiByZWNsYWltcywgdGhlcmVmb3JlIHJlYWxseSBvbmx5IHNhZmUKKyAqIHRvIGJlIGNhbGxlZCBmcm9tIG5mczRfY2xlYXJfaW5vZGUoKS4KICAqLwogdm9pZCBuZnNfaW5vZGVfcmV0dXJuX2RlbGVnYXRpb25fbm9yZWNsYWltKHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7Ci0Jc3RydWN0IG5mc19jbGllbnQgKmNscCA9IE5GU19TRVJWRVIoaW5vZGUpLT5uZnNfY2xpZW50OworCXN0cnVjdCBuZnNfc2VydmVyICpzZXJ2ZXIgPSBORlNfU0VSVkVSKGlub2RlKTsKIAlzdHJ1Y3QgbmZzX2lub2RlICpuZnNpID0gTkZTX0koaW5vZGUpOwogCXN0cnVjdCBuZnNfZGVsZWdhdGlvbiAqZGVsZWdhdGlvbjsKIAogCWlmIChyY3VfYWNjZXNzX3BvaW50ZXIobmZzaS0+ZGVsZWdhdGlvbikgIT0gTlVMTCkgewotCQlzcGluX2xvY2soJmNscC0+Y2xfbG9jayk7Ci0JCWRlbGVnYXRpb24gPSBuZnNfZGV0YWNoX2RlbGVnYXRpb25fbG9ja2VkKG5mc2ksIE5VTEwsIGNscCk7Ci0JCXNwaW5fdW5sb2NrKCZjbHAtPmNsX2xvY2spOworCQlkZWxlZ2F0aW9uID0gbmZzX2RldGFjaF9kZWxlZ2F0aW9uKG5mc2ksIHNlcnZlcik7CiAJCWlmIChkZWxlZ2F0aW9uICE9IE5VTEwpCiAJCQluZnNfZG9fcmV0dXJuX2RlbGVnYXRpb24oaW5vZGUsIGRlbGVnYXRpb24sIDApOwogCX0KIH0KIAorLyoqCisgKiBuZnNfaW5vZGVfcmV0dXJuX2RlbGVnYXRpb24gLSBzeW5jaHJvbm91c2x5IHJldHVybiBhIGRlbGVnYXRpb24KKyAqIEBpbm9kZTogaW5vZGUgdG8gcHJvY2VzcworICoKKyAqIFJldHVybnMgemVybyBvbiBzdWNjZXNzLCBvciBhIG5lZ2F0aXZlIGVycm5vIHZhbHVlLgorICovCiBpbnQgbmZzX2lub2RlX3JldHVybl9kZWxlZ2F0aW9uKHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7Ci0Jc3RydWN0IG5mc19jbGllbnQgKmNscCA9IE5GU19TRVJWRVIoaW5vZGUpLT5uZnNfY2xpZW50OworCXN0cnVjdCBuZnNfc2VydmVyICpzZXJ2ZXIgPSBORlNfU0VSVkVSKGlub2RlKTsKIAlzdHJ1Y3QgbmZzX2lub2RlICpuZnNpID0gTkZTX0koaW5vZGUpOwogCXN0cnVjdCBuZnNfZGVsZWdhdGlvbiAqZGVsZWdhdGlvbjsKIAlpbnQgZXJyID0gMDsKIAogCWlmIChyY3VfYWNjZXNzX3BvaW50ZXIobmZzaS0+ZGVsZWdhdGlvbikgIT0gTlVMTCkgewotCQlzcGluX2xvY2soJmNscC0+Y2xfbG9jayk7Ci0JCWRlbGVnYXRpb24gPSBuZnNfZGV0YWNoX2RlbGVnYXRpb25fbG9ja2VkKG5mc2ksIE5VTEwsIGNscCk7Ci0JCXNwaW5fdW5sb2NrKCZjbHAtPmNsX2xvY2spOworCQlkZWxlZ2F0aW9uID0gbmZzX2RldGFjaF9kZWxlZ2F0aW9uKG5mc2ksIHNlcnZlcik7CiAJCWlmIChkZWxlZ2F0aW9uICE9IE5VTEwpIHsKIAkJCW5mc193Yl9hbGwoaW5vZGUpOwogCQkJZXJyID0gX19uZnNfaW5vZGVfcmV0dXJuX2RlbGVnYXRpb24oaW5vZGUsIGRlbGVnYXRpb24sIDEpOwpAQCAtMzY1LDQ2ICs0MDgsNjEgQEAKIAlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgdm9pZCBuZnNfbWFya19yZXR1cm5fZGVsZWdhdGlvbihzdHJ1Y3QgbmZzX2NsaWVudCAqY2xwLCBzdHJ1Y3QgbmZzX2RlbGVnYXRpb24gKmRlbGVnYXRpb24pCitzdGF0aWMgdm9pZCBuZnNfbWFya19yZXR1cm5fZGVsZWdhdGlvbihzdHJ1Y3QgbmZzX2RlbGVnYXRpb24gKmRlbGVnYXRpb24pCiB7CisJc3RydWN0IG5mc19jbGllbnQgKmNscCA9IE5GU19TRVJWRVIoZGVsZWdhdGlvbi0+aW5vZGUpLT5uZnNfY2xpZW50OworCiAJc2V0X2JpdChORlNfREVMRUdBVElPTl9SRVRVUk4sICZkZWxlZ2F0aW9uLT5mbGFncyk7CiAJc2V0X2JpdChORlM0Q0xOVF9ERUxFR1JFVFVSTiwgJmNscC0+Y2xfc3RhdGUpOwogfQogCi0vKgotICogUmV0dXJuIGFsbCBkZWxlZ2F0aW9ucyBhc3NvY2lhdGVkIHRvIGEgc3VwZXIgYmxvY2sKKy8qKgorICogbmZzX3N1cGVyX3JldHVybl9hbGxfZGVsZWdhdGlvbnMgLSByZXR1cm4gZGVsZWdhdGlvbnMgZm9yIG9uZSBzdXBlcmJsb2NrCisgKiBAc2I6IHNiIHRvIHByb2Nlc3MKKyAqCiAgKi8KIHZvaWQgbmZzX3N1cGVyX3JldHVybl9hbGxfZGVsZWdhdGlvbnMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKIHsKLQlzdHJ1Y3QgbmZzX2NsaWVudCAqY2xwID0gTkZTX1NCKHNiKS0+bmZzX2NsaWVudDsKKwlzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyID0gTkZTX1NCKHNiKTsKKwlzdHJ1Y3QgbmZzX2NsaWVudCAqY2xwID0gc2VydmVyLT5uZnNfY2xpZW50OwogCXN0cnVjdCBuZnNfZGVsZWdhdGlvbiAqZGVsZWdhdGlvbjsKIAogCWlmIChjbHAgPT0gTlVMTCkKIAkJcmV0dXJuOworCiAJcmN1X3JlYWRfbG9jaygpOwotCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGRlbGVnYXRpb24sICZjbHAtPmNsX2RlbGVnYXRpb25zLCBzdXBlcl9saXN0KSB7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UoZGVsZWdhdGlvbiwgJnNlcnZlci0+ZGVsZWdhdGlvbnMsIHN1cGVyX2xpc3QpIHsKIAkJc3Bpbl9sb2NrKCZkZWxlZ2F0aW9uLT5sb2NrKTsKLQkJaWYgKGRlbGVnYXRpb24tPmlub2RlICE9IE5VTEwgJiYgZGVsZWdhdGlvbi0+aW5vZGUtPmlfc2IgPT0gc2IpCi0JCQlzZXRfYml0KE5GU19ERUxFR0FUSU9OX1JFVFVSTiwgJmRlbGVnYXRpb24tPmZsYWdzKTsKKwkJc2V0X2JpdChORlNfREVMRUdBVElPTl9SRVRVUk4sICZkZWxlZ2F0aW9uLT5mbGFncyk7CiAJCXNwaW5fdW5sb2NrKCZkZWxlZ2F0aW9uLT5sb2NrKTsKIAl9CiAJcmN1X3JlYWRfdW5sb2NrKCk7CisKIAlpZiAobmZzX2NsaWVudF9yZXR1cm5fbWFya2VkX2RlbGVnYXRpb25zKGNscCkgIT0gMCkKIAkJbmZzNF9zY2hlZHVsZV9zdGF0ZV9tYW5hZ2VyKGNscCk7CiB9CiAKLXN0YXRpYwotdm9pZCBuZnNfY2xpZW50X21hcmtfcmV0dXJuX2FsbF9kZWxlZ2F0aW9uX3R5cGVzKHN0cnVjdCBuZnNfY2xpZW50ICpjbHAsIGZtb2RlX3QgZmxhZ3MpCitzdGF0aWMgdm9pZCBuZnNfbWFya19yZXR1cm5fYWxsX2RlbGVnYXRpb25fdHlwZXMoc3RydWN0IG5mc19zZXJ2ZXIgKnNlcnZlciwKKwkJCQkJCSBmbW9kZV90IGZsYWdzKQogewogCXN0cnVjdCBuZnNfZGVsZWdhdGlvbiAqZGVsZWdhdGlvbjsKIAotCXJjdV9yZWFkX2xvY2soKTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShkZWxlZ2F0aW9uLCAmY2xwLT5jbF9kZWxlZ2F0aW9ucywgc3VwZXJfbGlzdCkgeworCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGRlbGVnYXRpb24sICZzZXJ2ZXItPmRlbGVnYXRpb25zLCBzdXBlcl9saXN0KSB7CiAJCWlmICgoZGVsZWdhdGlvbi0+dHlwZSA9PSAoRk1PREVfUkVBRHxGTU9ERV9XUklURSkpICYmICEoZmxhZ3MgJiBGTU9ERV9XUklURSkpCiAJCQljb250aW51ZTsKIAkJaWYgKGRlbGVnYXRpb24tPnR5cGUgJiBmbGFncykKLQkJCW5mc19tYXJrX3JldHVybl9kZWxlZ2F0aW9uKGNscCwgZGVsZWdhdGlvbik7CisJCQluZnNfbWFya19yZXR1cm5fZGVsZWdhdGlvbihkZWxlZ2F0aW9uKTsKIAl9Cit9CisKK3N0YXRpYyB2b2lkIG5mc19jbGllbnRfbWFya19yZXR1cm5fYWxsX2RlbGVnYXRpb25fdHlwZXMoc3RydWN0IG5mc19jbGllbnQgKmNscCwKKwkJCQkJCQlmbW9kZV90IGZsYWdzKQoreworCXN0cnVjdCBuZnNfc2VydmVyICpzZXJ2ZXI7CisKKwlyY3VfcmVhZF9sb2NrKCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3Uoc2VydmVyLCAmY2xwLT5jbF9zdXBlcmJsb2NrcywgY2xpZW50X2xpbmspCisJCW5mc19tYXJrX3JldHVybl9hbGxfZGVsZWdhdGlvbl90eXBlcyhzZXJ2ZXIsIGZsYWdzKTsKIAlyY3VfcmVhZF91bmxvY2soKTsKIH0KIApAQCAtNDE5LDE5ICs0NzcsMzIgQEAKIAkJbmZzNF9zY2hlZHVsZV9zdGF0ZV9tYW5hZ2VyKGNscCk7CiB9CiAKKy8qKgorICogbmZzX2V4cGlyZV9hbGxfZGVsZWdhdGlvbl90eXBlcworICogQGNscDogY2xpZW50IHRvIHByb2Nlc3MKKyAqIEBmbGFnczogZGVsZWdhdGlvbiB0eXBlcyB0byBleHBpcmUKKyAqCisgKi8KIHZvaWQgbmZzX2V4cGlyZV9hbGxfZGVsZWdhdGlvbl90eXBlcyhzdHJ1Y3QgbmZzX2NsaWVudCAqY2xwLCBmbW9kZV90IGZsYWdzKQogewogCW5mc19jbGllbnRfbWFya19yZXR1cm5fYWxsX2RlbGVnYXRpb25fdHlwZXMoY2xwLCBmbGFncyk7CiAJbmZzX2RlbGVnYXRpb25fcnVuX3N0YXRlX21hbmFnZXIoY2xwKTsKIH0KIAorLyoqCisgKiBuZnNfZXhwaXJlX2FsbF9kZWxlZ2F0aW9ucworICogQGNscDogY2xpZW50IHRvIHByb2Nlc3MKKyAqCisgKi8KIHZvaWQgbmZzX2V4cGlyZV9hbGxfZGVsZWdhdGlvbnMoc3RydWN0IG5mc19jbGllbnQgKmNscCkKIHsKIAluZnNfZXhwaXJlX2FsbF9kZWxlZ2F0aW9uX3R5cGVzKGNscCwgRk1PREVfUkVBRHxGTU9ERV9XUklURSk7CiB9CiAKLS8qCi0gKiBSZXR1cm4gYWxsIGRlbGVnYXRpb25zIGZvbGxvd2luZyBhbiBORlM0RVJSX0NCX1BBVEhfRE9XTiBlcnJvci4KKy8qKgorICogbmZzX2hhbmRsZV9jYl9wYXRoZG93biAtIHJldHVybiBhbGwgZGVsZWdhdGlvbnMgYWZ0ZXIgTkZTNEVSUl9DQl9QQVRIX0RPV04KKyAqIEBjbHA6IGNsaWVudCB0byBwcm9jZXNzCisgKgogICovCiB2b2lkIG5mc19oYW5kbGVfY2JfcGF0aGRvd24oc3RydWN0IG5mc19jbGllbnQgKmNscCkKIHsKQEAgLTQ0MCwyOSArNTExLDQzIEBACiAJbmZzX2NsaWVudF9tYXJrX3JldHVybl9hbGxfZGVsZWdhdGlvbnMoY2xwKTsKIH0KIAotc3RhdGljIHZvaWQgbmZzX2NsaWVudF9tYXJrX3JldHVybl91bnJlZmVyZW5jZWRfZGVsZWdhdGlvbnMoc3RydWN0IG5mc19jbGllbnQgKmNscCkKK3N0YXRpYyB2b2lkIG5mc19tYXJrX3JldHVybl91bnJlZmVyZW5jZWRfZGVsZWdhdGlvbnMoc3RydWN0IG5mc19zZXJ2ZXIgKnNlcnZlcikKIHsKIAlzdHJ1Y3QgbmZzX2RlbGVnYXRpb24gKmRlbGVnYXRpb247CiAKLQlyY3VfcmVhZF9sb2NrKCk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UoZGVsZWdhdGlvbiwgJmNscC0+Y2xfZGVsZWdhdGlvbnMsIHN1cGVyX2xpc3QpIHsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShkZWxlZ2F0aW9uLCAmc2VydmVyLT5kZWxlZ2F0aW9ucywgc3VwZXJfbGlzdCkgewogCQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KE5GU19ERUxFR0FUSU9OX1JFRkVSRU5DRUQsICZkZWxlZ2F0aW9uLT5mbGFncykpCiAJCQljb250aW51ZTsKLQkJbmZzX21hcmtfcmV0dXJuX2RlbGVnYXRpb24oY2xwLCBkZWxlZ2F0aW9uKTsKKwkJbmZzX21hcmtfcmV0dXJuX2RlbGVnYXRpb24oZGVsZWdhdGlvbik7CiAJfQotCXJjdV9yZWFkX3VubG9jaygpOwogfQogCisvKioKKyAqIG5mc19leHBpcmVfdW5yZWZlcmVuY2VkX2RlbGVnYXRpb25zIC0gRWxpbWluYXRlIHVudXNlZCBkZWxlZ2F0aW9ucworICogQGNscDogbmZzX2NsaWVudCB0byBwcm9jZXNzCisgKgorICovCiB2b2lkIG5mc19leHBpcmVfdW5yZWZlcmVuY2VkX2RlbGVnYXRpb25zKHN0cnVjdCBuZnNfY2xpZW50ICpjbHApCiB7Ci0JbmZzX2NsaWVudF9tYXJrX3JldHVybl91bnJlZmVyZW5jZWRfZGVsZWdhdGlvbnMoY2xwKTsKKwlzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyOworCisJcmN1X3JlYWRfbG9jaygpOworCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KHNlcnZlciwgJmNscC0+Y2xfc3VwZXJibG9ja3MsIGNsaWVudF9saW5rKQorCQluZnNfbWFya19yZXR1cm5fdW5yZWZlcmVuY2VkX2RlbGVnYXRpb25zKHNlcnZlcik7CisJcmN1X3JlYWRfdW5sb2NrKCk7CisKIAluZnNfZGVsZWdhdGlvbl9ydW5fc3RhdGVfbWFuYWdlcihjbHApOwogfQogCi0vKgotICogQXN5bmNocm9ub3VzIGRlbGVnYXRpb24gcmVjYWxsIQorLyoqCisgKiBuZnNfYXN5bmNfaW5vZGVfcmV0dXJuX2RlbGVnYXRpb24gLSBhc3luY2hyb25vdXNseSByZXR1cm4gYSBkZWxlZ2F0aW9uCisgKiBAaW5vZGU6IGlub2RlIHRvIHByb2Nlc3MKKyAqIEBzdGF0ZWlkOiBzdGF0ZSBJRCBpbmZvcm1hdGlvbiBmcm9tIENCX1JFQ0FMTCBhcmd1bWVudHMKKyAqCisgKiBSZXR1cm5zIHplcm8gb24gc3VjY2Vzcywgb3IgYSBuZWdhdGl2ZSBlcnJubyB2YWx1ZS4KICAqLwotaW50IG5mc19hc3luY19pbm9kZV9yZXR1cm5fZGVsZWdhdGlvbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjb25zdCBuZnM0X3N0YXRlaWQgKnN0YXRlaWQpCitpbnQgbmZzX2FzeW5jX2lub2RlX3JldHVybl9kZWxlZ2F0aW9uKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJICAgICAgY29uc3QgbmZzNF9zdGF0ZWlkICpzdGF0ZWlkKQogewogCXN0cnVjdCBuZnNfY2xpZW50ICpjbHAgPSBORlNfU0VSVkVSKGlub2RlKS0+bmZzX2NsaWVudDsKIAlzdHJ1Y3QgbmZzX2RlbGVnYXRpb24gKmRlbGVnYXRpb247CkBAIC00NzQsMjIgKzU1OSwyMSBAQAogCQlyY3VfcmVhZF91bmxvY2soKTsKIAkJcmV0dXJuIC1FTk9FTlQ7CiAJfQotCi0JbmZzX21hcmtfcmV0dXJuX2RlbGVnYXRpb24oY2xwLCBkZWxlZ2F0aW9uKTsKKwluZnNfbWFya19yZXR1cm5fZGVsZWdhdGlvbihkZWxlZ2F0aW9uKTsKIAlyY3VfcmVhZF91bmxvY2soKTsKKwogCW5mc19kZWxlZ2F0aW9uX3J1bl9zdGF0ZV9tYW5hZ2VyKGNscCk7CiAJcmV0dXJuIDA7CiB9CiAKLS8qCi0gKiBSZXRyaWV2ZSB0aGUgaW5vZGUgYXNzb2NpYXRlZCB3aXRoIGEgZGVsZWdhdGlvbgotICovCi1zdHJ1Y3QgaW5vZGUgKm5mc19kZWxlZ2F0aW9uX2ZpbmRfaW5vZGUoc3RydWN0IG5mc19jbGllbnQgKmNscCwgY29uc3Qgc3RydWN0IG5mc19maCAqZmhhbmRsZSkKK3N0YXRpYyBzdHJ1Y3QgaW5vZGUgKgorbmZzX2RlbGVnYXRpb25fZmluZF9pbm9kZV9zZXJ2ZXIoc3RydWN0IG5mc19zZXJ2ZXIgKnNlcnZlciwKKwkJCQkgY29uc3Qgc3RydWN0IG5mc19maCAqZmhhbmRsZSkKIHsKIAlzdHJ1Y3QgbmZzX2RlbGVnYXRpb24gKmRlbGVnYXRpb247CiAJc3RydWN0IGlub2RlICpyZXMgPSBOVUxMOwotCXJjdV9yZWFkX2xvY2soKTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShkZWxlZ2F0aW9uLCAmY2xwLT5jbF9kZWxlZ2F0aW9ucywgc3VwZXJfbGlzdCkgeworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UoZGVsZWdhdGlvbiwgJnNlcnZlci0+ZGVsZWdhdGlvbnMsIHN1cGVyX2xpc3QpIHsKIAkJc3Bpbl9sb2NrKCZkZWxlZ2F0aW9uLT5sb2NrKTsKIAkJaWYgKGRlbGVnYXRpb24tPmlub2RlICE9IE5VTEwgJiYKIAkJICAgIG5mc19jb21wYXJlX2ZoKGZoYW5kbGUsICZORlNfSShkZWxlZ2F0aW9uLT5pbm9kZSktPmZoKSA9PSAwKSB7CkBAIC00OTksNDkgKzU4MywxMjEgQEAKIAkJaWYgKHJlcyAhPSBOVUxMKQogCQkJYnJlYWs7CiAJfQorCXJldHVybiByZXM7Cit9CisKKy8qKgorICogbmZzX2RlbGVnYXRpb25fZmluZF9pbm9kZSAtIHJldHJpZXZlIHRoZSBpbm9kZSBhc3NvY2lhdGVkIHdpdGggYSBkZWxlZ2F0aW9uCisgKiBAY2xwOiBjbGllbnQgc3RhdGUgaGFuZGxlCisgKiBAZmhhbmRsZTogZmlsZWhhbmRsZSBmcm9tIGEgZGVsZWdhdGlvbiByZWNhbGwKKyAqCisgKiBSZXR1cm5zIHBvaW50ZXIgdG8gaW5vZGUgbWF0Y2hpbmcgImZoYW5kbGUsIiBvciBOVUxMIGlmIGEgbWF0Y2hpbmcgaW5vZGUKKyAqIGNhbm5vdCBiZSBmb3VuZC4KKyAqLworc3RydWN0IGlub2RlICpuZnNfZGVsZWdhdGlvbl9maW5kX2lub2RlKHN0cnVjdCBuZnNfY2xpZW50ICpjbHAsCisJCQkJCWNvbnN0IHN0cnVjdCBuZnNfZmggKmZoYW5kbGUpCit7CisJc3RydWN0IG5mc19zZXJ2ZXIgKnNlcnZlcjsKKwlzdHJ1Y3QgaW5vZGUgKnJlcyA9IE5VTEw7CisKKwlyY3VfcmVhZF9sb2NrKCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3Uoc2VydmVyLCAmY2xwLT5jbF9zdXBlcmJsb2NrcywgY2xpZW50X2xpbmspIHsKKwkJcmVzID0gbmZzX2RlbGVnYXRpb25fZmluZF9pbm9kZV9zZXJ2ZXIoc2VydmVyLCBmaGFuZGxlKTsKKwkJaWYgKHJlcyAhPSBOVUxMKQorCQkJYnJlYWs7CisJfQogCXJjdV9yZWFkX3VubG9jaygpOwogCXJldHVybiByZXM7CiB9CiAKLS8qCi0gKiBNYXJrIGFsbCBkZWxlZ2F0aW9ucyBhcyBuZWVkaW5nIHRvIGJlIHJlY2xhaW1lZAorc3RhdGljIHZvaWQgbmZzX2RlbGVnYXRpb25fbWFya19yZWNsYWltX3NlcnZlcihzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyKQoreworCXN0cnVjdCBuZnNfZGVsZWdhdGlvbiAqZGVsZWdhdGlvbjsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGRlbGVnYXRpb24sICZzZXJ2ZXItPmRlbGVnYXRpb25zLCBzdXBlcl9saXN0KQorCQlzZXRfYml0KE5GU19ERUxFR0FUSU9OX05FRURfUkVDTEFJTSwgJmRlbGVnYXRpb24tPmZsYWdzKTsKK30KKworLyoqCisgKiBuZnNfZGVsZWdhdGlvbl9tYXJrX3JlY2xhaW0gLSBtYXJrIGFsbCBkZWxlZ2F0aW9ucyBhcyBuZWVkaW5nIHRvIGJlIHJlY2xhaW1lZAorICogQGNscDogbmZzX2NsaWVudCB0byBwcm9jZXNzCisgKgogICovCiB2b2lkIG5mc19kZWxlZ2F0aW9uX21hcmtfcmVjbGFpbShzdHJ1Y3QgbmZzX2NsaWVudCAqY2xwKQogewotCXN0cnVjdCBuZnNfZGVsZWdhdGlvbiAqZGVsZWdhdGlvbjsKKwlzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyOworCiAJcmN1X3JlYWRfbG9jaygpOwotCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGRlbGVnYXRpb24sICZjbHAtPmNsX2RlbGVnYXRpb25zLCBzdXBlcl9saXN0KQotCQlzZXRfYml0KE5GU19ERUxFR0FUSU9OX05FRURfUkVDTEFJTSwgJmRlbGVnYXRpb24tPmZsYWdzKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShzZXJ2ZXIsICZjbHAtPmNsX3N1cGVyYmxvY2tzLCBjbGllbnRfbGluaykKKwkJbmZzX2RlbGVnYXRpb25fbWFya19yZWNsYWltX3NlcnZlcihzZXJ2ZXIpOwogCXJjdV9yZWFkX3VubG9jaygpOwogfQogCi0vKgotICogUmVhcCBhbGwgdW5jbGFpbWVkIGRlbGVnYXRpb25zIGFmdGVyIHJlYm9vdCByZWNvdmVyeSBpcyBkb25lCisvKioKKyAqIG5mc19kZWxlZ2F0aW9uX3JlYXBfdW5jbGFpbWVkIC0gcmVhcCB1bmNsYWltZWQgZGVsZWdhdGlvbnMgYWZ0ZXIgcmVib290IHJlY292ZXJ5IGlzIGRvbmUKKyAqIEBjbHA6IG5mc19jbGllbnQgdG8gcHJvY2VzcworICoKICAqLwogdm9pZCBuZnNfZGVsZWdhdGlvbl9yZWFwX3VuY2xhaW1lZChzdHJ1Y3QgbmZzX2NsaWVudCAqY2xwKQogewogCXN0cnVjdCBuZnNfZGVsZWdhdGlvbiAqZGVsZWdhdGlvbjsKKwlzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyOwogCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisKIHJlc3RhcnQ6CiAJcmN1X3JlYWRfbG9jaygpOwotCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGRlbGVnYXRpb24sICZjbHAtPmNsX2RlbGVnYXRpb25zLCBzdXBlcl9saXN0KSB7Ci0JCWlmICh0ZXN0X2JpdChORlNfREVMRUdBVElPTl9ORUVEX1JFQ0xBSU0sICZkZWxlZ2F0aW9uLT5mbGFncykgPT0gMCkKLQkJCWNvbnRpbnVlOwotCQlpbm9kZSA9IG5mc19kZWxlZ2F0aW9uX2dyYWJfaW5vZGUoZGVsZWdhdGlvbik7Ci0JCWlmIChpbm9kZSA9PSBOVUxMKQotCQkJY29udGludWU7Ci0JCXNwaW5fbG9jaygmY2xwLT5jbF9sb2NrKTsKLQkJZGVsZWdhdGlvbiA9IG5mc19kZXRhY2hfZGVsZWdhdGlvbl9sb2NrZWQoTkZTX0koaW5vZGUpLCBOVUxMLCBjbHApOwotCQlzcGluX3VubG9jaygmY2xwLT5jbF9sb2NrKTsKLQkJcmN1X3JlYWRfdW5sb2NrKCk7Ci0JCWlmIChkZWxlZ2F0aW9uICE9IE5VTEwpCi0JCQluZnNfZnJlZV9kZWxlZ2F0aW9uKGRlbGVnYXRpb24pOwotCQlpcHV0KGlub2RlKTsKLQkJZ290byByZXN0YXJ0OworCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KHNlcnZlciwgJmNscC0+Y2xfc3VwZXJibG9ja3MsIGNsaWVudF9saW5rKSB7CisJCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGRlbGVnYXRpb24sICZzZXJ2ZXItPmRlbGVnYXRpb25zLAorCQkJCQkJCQlzdXBlcl9saXN0KSB7CisJCQlpZiAodGVzdF9iaXQoTkZTX0RFTEVHQVRJT05fTkVFRF9SRUNMQUlNLAorCQkJCQkJJmRlbGVnYXRpb24tPmZsYWdzKSA9PSAwKQorCQkJCWNvbnRpbnVlOworCQkJaW5vZGUgPSBuZnNfZGVsZWdhdGlvbl9ncmFiX2lub2RlKGRlbGVnYXRpb24pOworCQkJaWYgKGlub2RlID09IE5VTEwpCisJCQkJY29udGludWU7CisJCQlkZWxlZ2F0aW9uID0gbmZzX2RldGFjaF9kZWxlZ2F0aW9uKE5GU19JKGlub2RlKSwKKwkJCQkJCQkJc2VydmVyKTsKKwkJCXJjdV9yZWFkX3VubG9jaygpOworCisJCQlpZiAoZGVsZWdhdGlvbiAhPSBOVUxMKQorCQkJCW5mc19mcmVlX2RlbGVnYXRpb24oZGVsZWdhdGlvbik7CisJCQlpcHV0KGlub2RlKTsKKwkJCWdvdG8gcmVzdGFydDsKKwkJfQogCX0KIAlyY3VfcmVhZF91bmxvY2soKTsKIH0KIAorLyoqCisgKiBuZnNfZGVsZWdhdGlvbnNfcHJlc2VudCAtIGNoZWNrIGZvciBleGlzdGVuY2Ugb2YgZGVsZWdhdGlvbnMKKyAqIEBjbHA6IGNsaWVudCBzdGF0ZSBoYW5kbGUKKyAqCisgKiBSZXR1cm5zIG9uZSBpZiB0aGVyZSBhcmUgYW55IG5mc19kZWxlZ2F0aW9uIHN0cnVjdHVyZXMgYXR0YWNoZWQKKyAqIHRvIHRoaXMgbmZzX2NsaWVudC4KKyAqLworaW50IG5mc19kZWxlZ2F0aW9uc19wcmVzZW50KHN0cnVjdCBuZnNfY2xpZW50ICpjbHApCit7CisJc3RydWN0IG5mc19zZXJ2ZXIgKnNlcnZlcjsKKwlpbnQgcmV0ID0gMDsKKworCXJjdV9yZWFkX2xvY2soKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShzZXJ2ZXIsICZjbHAtPmNsX3N1cGVyYmxvY2tzLCBjbGllbnRfbGluaykKKwkJaWYgKCFsaXN0X2VtcHR5KCZzZXJ2ZXItPmRlbGVnYXRpb25zKSkgeworCQkJcmV0ID0gMTsKKwkJCWJyZWFrOworCQl9CisJcmN1X3JlYWRfdW5sb2NrKCk7CisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBuZnM0X2NvcHlfZGVsZWdhdGlvbl9zdGF0ZWlkIC0gQ29weSBpbm9kZSdzIHN0YXRlIElEIGluZm9ybWF0aW9uCisgKiBAZHN0OiBzdGF0ZWlkIGRhdGEgc3RydWN0dXJlIHRvIGZpbGwgaW4KKyAqIEBpbm9kZTogaW5vZGUgdG8gY2hlY2sKKyAqCisgKiBSZXR1cm5zIG9uZSBhbmQgZmlsbHMgaW4gImRzdC0+ZGF0YSIgKiBpZiBpbm9kZSBoYWQgYSBkZWxlZ2F0aW9uLAorICogb3RoZXJ3aXNlIHplcm8gaXMgcmV0dXJuZWQuCisgKi8KIGludCBuZnM0X2NvcHlfZGVsZWdhdGlvbl9zdGF0ZWlkKG5mczRfc3RhdGVpZCAqZHN0LCBzdHJ1Y3QgaW5vZGUgKmlub2RlKQogewogCXN0cnVjdCBuZnNfaW5vZGUgKm5mc2kgPSBORlNfSShpbm9kZSk7CmRpZmYgLS1naXQgYS9mcy9uZnMvZGVsZWdhdGlvbi5oIGIvZnMvbmZzL2RlbGVnYXRpb24uaAppbmRleCAyMDI2MzA0Li5kOTMyMmU0IDEwMDY0NAotLS0gYS9mcy9uZnMvZGVsZWdhdGlvbi5oCisrKyBiL2ZzL25mcy9kZWxlZ2F0aW9uLmgKQEAgLTQ0LDYgKzQ0LDcgQEAKIHZvaWQgbmZzX2V4cGlyZV91bnJlZmVyZW5jZWRfZGVsZWdhdGlvbnMoc3RydWN0IG5mc19jbGllbnQgKmNscCk7CiB2b2lkIG5mc19oYW5kbGVfY2JfcGF0aGRvd24oc3RydWN0IG5mc19jbGllbnQgKmNscCk7CiBpbnQgbmZzX2NsaWVudF9yZXR1cm5fbWFya2VkX2RlbGVnYXRpb25zKHN0cnVjdCBuZnNfY2xpZW50ICpjbHApOworaW50IG5mc19kZWxlZ2F0aW9uc19wcmVzZW50KHN0cnVjdCBuZnNfY2xpZW50ICpjbHApOwogCiB2b2lkIG5mc19kZWxlZ2F0aW9uX21hcmtfcmVjbGFpbShzdHJ1Y3QgbmZzX2NsaWVudCAqY2xwKTsKIHZvaWQgbmZzX2RlbGVnYXRpb25fcmVhcF91bmNsYWltZWQoc3RydWN0IG5mc19jbGllbnQgKmNscCk7CmRpZmYgLS1naXQgYS9mcy9uZnMvZGlyLmMgYi9mcy9uZnMvZGlyLmMKaW5kZXggZDMzZGE1My4uYWJlNGYwYyAxMDA2NDQKLS0tIGEvZnMvbmZzL2Rpci5jCisrKyBiL2ZzL25mcy9kaXIuYwpAQCAtMzMsOCArMzMsOCBAQAogI2luY2x1ZGUgPGxpbnV4L25hbWVpLmg+CiAjaW5jbHVkZSA8bGludXgvbW91bnQuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KICNpbmNsdWRlIDxsaW51eC9rbWVtbGVhay5oPgorI2luY2x1ZGUgPGxpbnV4L3hhdHRyLmg+CiAKICNpbmNsdWRlICJkZWxlZ2F0aW9uLmgiCiAjaW5jbHVkZSAiaW9zdGF0LmgiCkBAIC0xMjUsOSArMTI1LDEwIEBACiAJLnBlcm1pc3Npb24JPSBuZnNfcGVybWlzc2lvbiwKIAkuZ2V0YXR0cgk9IG5mc19nZXRhdHRyLAogCS5zZXRhdHRyCT0gbmZzX3NldGF0dHIsCi0JLmdldHhhdHRyICAgICAgID0gbmZzNF9nZXR4YXR0ciwKLQkuc2V0eGF0dHIgICAgICAgPSBuZnM0X3NldHhhdHRyLAotCS5saXN0eGF0dHIgICAgICA9IG5mczRfbGlzdHhhdHRyLAorCS5nZXR4YXR0cgk9IGdlbmVyaWNfZ2V0eGF0dHIsCisJLnNldHhhdHRyCT0gZ2VuZXJpY19zZXR4YXR0ciwKKwkubGlzdHhhdHRyCT0gZ2VuZXJpY19saXN0eGF0dHIsCisJLnJlbW92ZXhhdHRyCT0gZ2VuZXJpY19yZW1vdmV4YXR0ciwKIH07CiAKICNlbmRpZiAvKiBDT05GSUdfTkZTX1Y0ICovCkBAIC0xNzIsNyArMTczLDcgQEAKIAlzdHJ1Y3QgbmZzX2NhY2hlX2FycmF5X2VudHJ5IGFycmF5WzBdOwogfTsKIAotdHlwZWRlZiBfX2JlMzIgKiAoKmRlY29kZV9kaXJlbnRfdCkoc3RydWN0IHhkcl9zdHJlYW0gKiwgc3RydWN0IG5mc19lbnRyeSAqLCBzdHJ1Y3QgbmZzX3NlcnZlciAqLCBpbnQpOwordHlwZWRlZiBpbnQgKCpkZWNvZGVfZGlyZW50X3QpKHN0cnVjdCB4ZHJfc3RyZWFtICosIHN0cnVjdCBuZnNfZW50cnkgKiwgaW50KTsKIHR5cGVkZWYgc3RydWN0IHsKIAlzdHJ1Y3QgZmlsZQkqZmlsZTsKIAlzdHJ1Y3QgcGFnZQkqcGFnZTsKQEAgLTM3OCwxNCArMzc5LDE0IEBACiAJcmV0dXJuIGVycm9yOwogfQogCi0vKiBGaWxsIGluIGFuIGVudHJ5IGJhc2VkIG9uIHRoZSB4ZHIgY29kZSBzdG9yZWQgaW4gZGVzYy0+cGFnZSAqLwotc3RhdGljCi1pbnQgeGRyX2RlY29kZShuZnNfcmVhZGRpcl9kZXNjcmlwdG9yX3QgKmRlc2MsIHN0cnVjdCBuZnNfZW50cnkgKmVudHJ5LCBzdHJ1Y3QgeGRyX3N0cmVhbSAqc3RyZWFtKQorc3RhdGljIGludCB4ZHJfZGVjb2RlKG5mc19yZWFkZGlyX2Rlc2NyaXB0b3JfdCAqZGVzYywKKwkJICAgICAgc3RydWN0IG5mc19lbnRyeSAqZW50cnksIHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIpCiB7Ci0JX19iZTMyICpwID0gZGVzYy0+ZGVjb2RlKHN0cmVhbSwgZW50cnksIE5GU19TRVJWRVIoZGVzYy0+ZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZSksIGRlc2MtPnBsdXMpOwotCWlmIChJU19FUlIocCkpCi0JCXJldHVybiBQVFJfRVJSKHApOworCWludCBlcnJvcjsKIAorCWVycm9yID0gZGVzYy0+ZGVjb2RlKHhkciwgZW50cnksIGRlc2MtPnBsdXMpOworCWlmIChlcnJvcikKKwkJcmV0dXJuIGVycm9yOwogCWVudHJ5LT5mYXR0ci0+dGltZV9zdGFydCA9IGRlc2MtPnRpbWVzdGFtcDsKIAllbnRyeS0+ZmF0dHItPmdlbmNvdW50ID0gZGVzYy0+Z2VuY291bnQ7CiAJcmV0dXJuIDA7CkBAIC00NTksMjUgKzQ2MCwyNiBAQAogLyogUGVyZm9ybSBjb252ZXJzaW9uIGZyb20geGRyIHRvIGNhY2hlIGFycmF5ICovCiBzdGF0aWMKIGludCBuZnNfcmVhZGRpcl9wYWdlX2ZpbGxlcihuZnNfcmVhZGRpcl9kZXNjcmlwdG9yX3QgKmRlc2MsIHN0cnVjdCBuZnNfZW50cnkgKmVudHJ5LAotCQkJCXZvaWQgKnhkcl9wYWdlLCBzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgaW50IGJ1ZmxlbikKKwkJCQlzdHJ1Y3QgcGFnZSAqKnhkcl9wYWdlcywgc3RydWN0IHBhZ2UgKnBhZ2UsIHVuc2lnbmVkIGludCBidWZsZW4pCiB7CiAJc3RydWN0IHhkcl9zdHJlYW0gc3RyZWFtOwotCXN0cnVjdCB4ZHJfYnVmIGJ1ZjsKLQlfX2JlMzIgKnB0ciA9IHhkcl9wYWdlOworCXN0cnVjdCB4ZHJfYnVmIGJ1ZiA9IHsKKwkJLnBhZ2VzID0geGRyX3BhZ2VzLAorCQkucGFnZV9sZW4gPSBidWZsZW4sCisJCS5idWZsZW4gPSBidWZsZW4sCisJCS5sZW4gPSBidWZsZW4sCisJfTsKKwlzdHJ1Y3QgcGFnZSAqc2NyYXRjaDsKIAlzdHJ1Y3QgbmZzX2NhY2hlX2FycmF5ICphcnJheTsKIAl1bnNpZ25lZCBpbnQgY291bnQgPSAwOwogCWludCBzdGF0dXM7CiAKLQlidWYuaGVhZC0+aW92X2Jhc2UgPSB4ZHJfcGFnZTsKLQlidWYuaGVhZC0+aW92X2xlbiA9IGJ1ZmxlbjsKLQlidWYudGFpbC0+aW92X2xlbiA9IDA7Ci0JYnVmLnBhZ2VfYmFzZSA9IDA7Ci0JYnVmLnBhZ2VfbGVuID0gMDsKLQlidWYuYnVmbGVuID0gYnVmLmhlYWQtPmlvdl9sZW47Ci0JYnVmLmxlbiA9IGJ1Zi5oZWFkLT5pb3ZfbGVuOworCXNjcmF0Y2ggPSBhbGxvY19wYWdlKEdGUF9LRVJORUwpOworCWlmIChzY3JhdGNoID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOwogCi0JeGRyX2luaXRfZGVjb2RlKCZzdHJlYW0sICZidWYsIHB0cik7Ci0KKwl4ZHJfaW5pdF9kZWNvZGUoJnN0cmVhbSwgJmJ1ZiwgTlVMTCk7CisJeGRyX3NldF9zY3JhdGNoX2J1ZmZlcigmc3RyZWFtLCBwYWdlX2FkZHJlc3Moc2NyYXRjaCksIFBBR0VfU0laRSk7CiAKIAlkbyB7CiAJCXN0YXR1cyA9IHhkcl9kZWNvZGUoZGVzYywgZW50cnksICZzdHJlYW0pOwpAQCAtNTA2LDYgKzUwOCw4IEBACiAJCX0gZWxzZQogCQkJc3RhdHVzID0gUFRSX0VSUihhcnJheSk7CiAJfQorCisJcHV0X3BhZ2Uoc2NyYXRjaCk7CiAJcmV0dXJuIHN0YXR1czsKIH0KIApAQCAtNTIxLDcgKzUyNSw2IEBACiB2b2lkIG5mc19yZWFkZGlyX2ZyZWVfbGFyZ2VfcGFnZSh2b2lkICpwdHIsIHN0cnVjdCBwYWdlICoqcGFnZXMsCiAJCXVuc2lnbmVkIGludCBucGFnZXMpCiB7Ci0Jdm1fdW5tYXBfcmFtKHB0ciwgbnBhZ2VzKTsKIAluZnNfcmVhZGRpcl9mcmVlX3BhZ2VhcnJheShwYWdlcywgbnBhZ2VzKTsKIH0KIApAQCAtNTMwLDkgKzUzMyw4IEBACiAgKiB0byBuZnNfcmVhZGRpcl9mcmVlX2xhcmdlX3BhZ2UKICAqLwogc3RhdGljCi12b2lkICpuZnNfcmVhZGRpcl9sYXJnZV9wYWdlKHN0cnVjdCBwYWdlICoqcGFnZXMsIHVuc2lnbmVkIGludCBucGFnZXMpCitpbnQgbmZzX3JlYWRkaXJfbGFyZ2VfcGFnZShzdHJ1Y3QgcGFnZSAqKnBhZ2VzLCB1bnNpZ25lZCBpbnQgbnBhZ2VzKQogewotCXZvaWQgKnB0cjsKIAl1bnNpZ25lZCBpbnQgaTsKIAogCWZvciAoaSA9IDA7IGkgPCBucGFnZXM7IGkrKykgewpAQCAtNTQxLDEzICs1NDMsMTEgQEAKIAkJCWdvdG8gb3V0X2ZyZWVwYWdlczsKIAkJcGFnZXNbaV0gPSBwYWdlOwogCX0KKwlyZXR1cm4gMDsKIAotCXB0ciA9IHZtX21hcF9yYW0ocGFnZXMsIG5wYWdlcywgMCwgUEFHRV9LRVJORUwpOwotCWlmICghSVNfRVJSX09SX05VTEwocHRyKSkKLQkJcmV0dXJuIHB0cjsKIG91dF9mcmVlcGFnZXM6CiAJbmZzX3JlYWRkaXJfZnJlZV9wYWdlYXJyYXkocGFnZXMsIGkpOwotCXJldHVybiBOVUxMOworCXJldHVybiAtRU5PTUVNOwogfQogCiBzdGF0aWMKQEAgLTU2Niw2ICs1NjYsNyBAQAogCWVudHJ5LmVvZiA9IDA7CiAJZW50cnkuZmggPSBuZnNfYWxsb2NfZmhhbmRsZSgpOwogCWVudHJ5LmZhdHRyID0gbmZzX2FsbG9jX2ZhdHRyKCk7CisJZW50cnkuc2VydmVyID0gTkZTX1NFUlZFUihpbm9kZSk7CiAJaWYgKGVudHJ5LmZoID09IE5VTEwgfHwgZW50cnkuZmF0dHIgPT0gTlVMTCkKIAkJZ290byBvdXQ7CiAKQEAgLTU3Nyw4ICs1NzgsOCBAQAogCW1lbXNldChhcnJheSwgMCwgc2l6ZW9mKHN0cnVjdCBuZnNfY2FjaGVfYXJyYXkpKTsKIAlhcnJheS0+ZW9mX2luZGV4ID0gLTE7CiAKLQlwYWdlc19wdHIgPSBuZnNfcmVhZGRpcl9sYXJnZV9wYWdlKHBhZ2VzLCBhcnJheV9zaXplKTsKLQlpZiAoIXBhZ2VzX3B0cikKKwlzdGF0dXMgPSBuZnNfcmVhZGRpcl9sYXJnZV9wYWdlKHBhZ2VzLCBhcnJheV9zaXplKTsKKwlpZiAoc3RhdHVzIDwgMCkKIAkJZ290byBvdXRfcmVsZWFzZV9hcnJheTsKIAlkbyB7CiAJCXVuc2lnbmVkIGludCBwZ2xlbjsKQEAgLTU4Nyw3ICs1ODgsNyBAQAogCQlpZiAoc3RhdHVzIDwgMCkKIAkJCWJyZWFrOwogCQlwZ2xlbiA9IHN0YXR1czsKLQkJc3RhdHVzID0gbmZzX3JlYWRkaXJfcGFnZV9maWxsZXIoZGVzYywgJmVudHJ5LCBwYWdlc19wdHIsIHBhZ2UsIHBnbGVuKTsKKwkJc3RhdHVzID0gbmZzX3JlYWRkaXJfcGFnZV9maWxsZXIoZGVzYywgJmVudHJ5LCBwYWdlcywgcGFnZSwgcGdsZW4pOwogCQlpZiAoc3RhdHVzIDwgMCkgewogCQkJaWYgKHN0YXR1cyA9PSAtRU5PU1BDKQogCQkJCXN0YXR1cyA9IDA7CkBAIC0xMjIxLDcgKzEyMjIsNyBAQAogCQlnb3RvIG91dF91bmJsb2NrX3NpbGx5cmVuYW1lOwogCX0KIAlpbm9kZSA9IG5mc19maGdldChkZW50cnktPmRfc2IsIGZoYW5kbGUsIGZhdHRyKTsKLQlyZXMgPSAoc3RydWN0IGRlbnRyeSAqKWlub2RlOworCXJlcyA9IEVSUl9DQVNUKGlub2RlKTsKIAlpZiAoSVNfRVJSKHJlcykpCiAJCWdvdG8gb3V0X3VuYmxvY2tfc2lsbHlyZW5hbWU7CiAKQEAgLTEzNTUsOCArMTM1Niw3IEBACiAJaWYgKG5kLT5mbGFncyAmIExPT0tVUF9DUkVBVEUpIHsKIAkJYXR0ci5pYV9tb2RlID0gbmQtPmludGVudC5vcGVuLmNyZWF0ZV9tb2RlOwogCQlhdHRyLmlhX3ZhbGlkID0gQVRUUl9NT0RFOwotCQlpZiAoIUlTX1BPU0lYQUNMKGRpcikpCi0JCQlhdHRyLmlhX21vZGUgJj0gfmN1cnJlbnRfdW1hc2soKTsKKwkJYXR0ci5pYV9tb2RlICY9IH5jdXJyZW50X3VtYXNrKCk7CiAJfSBlbHNlIHsKIAkJb3Blbl9mbGFncyAmPSB+KE9fRVhDTCB8IE9fQ1JFQVQpOwogCQlhdHRyLmlhX3ZhbGlkID0gMDsKZGlmZiAtLWdpdCBhL2ZzL25mcy9pZG1hcC5jIGIvZnMvbmZzL2lkbWFwLmMKaW5kZXggNGUyZDliNi4uMTg2OTY4OCAxMDA2NDQKLS0tIGEvZnMvbmZzL2lkbWFwLmMKKysrIGIvZnMvbmZzL2lkbWFwLmMKQEAgLTIzOCw3ICsyMzgsNyBAQAogCXJldHVybiBuZnNfaWRtYXBfbG9va3VwX25hbWUoZ2lkLCAiZ3JvdXAiLCBidWYsIGJ1Zmxlbik7CiB9CiAKLSNlbHNlICAvKiBDT05GSUdfTkZTX1VTRV9JRE1BUFBFUiBub3QgZGVmaW5lZCAqLworI2Vsc2UgIC8qIENPTkZJR19ORlNfVVNFX05FV19JRE1BUFBFUiBub3QgZGVmaW5lZCAqLwogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KZGlmZiAtLWdpdCBhL2ZzL25mcy9pbm9kZS5jIGIvZnMvbmZzL2lub2RlLmMKaW5kZXggMDE3ZGFhMy4uY2UwMGI3MCAxMDA2NDQKLS0tIGEvZnMvbmZzL2lub2RlLmMKKysrIGIvZnMvbmZzL2lub2RlLmMKQEAgLTE0MTAsOSArMTQxMCw5IEBACiAgKi8KIHZvaWQgbmZzNF9ldmljdF9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQogeworCXBuZnNfZGVzdHJveV9sYXlvdXQoTkZTX0koaW5vZGUpKTsKIAl0cnVuY2F0ZV9pbm9kZV9wYWdlcygmaW5vZGUtPmlfZGF0YSwgMCk7CiAJZW5kX3dyaXRlYmFjayhpbm9kZSk7Ci0JcG5mc19kZXN0cm95X2xheW91dChORlNfSShpbm9kZSkpOwogCS8qIElmIHdlIGFyZSBob2xkaW5nIGEgZGVsZWdhdGlvbiwgcmV0dXJuIGl0ISAqLwogCW5mc19pbm9kZV9yZXR1cm5fZGVsZWdhdGlvbl9ub3JlY2xhaW0oaW5vZGUpOwogCS8qIEZpcnN0IGNhbGwgc3RhbmRhcmQgTkZTIGNsZWFyX2lub2RlKCkgY29kZSAqLwpAQCAtMTYxOSw2ICsxNjE5LDcgQEAKICNpZmRlZiBDT05GSUdfUFJPQ19GUwogCXJwY19wcm9jX3VucmVnaXN0ZXIoIm5mcyIpOwogI2VuZGlmCisJbmZzX2NsZWFudXBfY2JfaWRlbnRfaWRyKCk7CiAJdW5yZWdpc3Rlcl9uZnNfZnMoKTsKIAluZnNfZnNfcHJvY19leGl0KCk7CiAJbmZzaW9kX3N0b3AoKTsKZGlmZiAtLWdpdCBhL2ZzL25mcy9pbnRlcm5hbC5oIGIvZnMvbmZzL2ludGVybmFsLmgKaW5kZXggZTYzNTZiNy4uYmZhM2EzNCAxMDA2NDQKLS0tIGEvZnMvbmZzL2ludGVybmFsLmgKKysrIGIvZnMvbmZzL2ludGVybmFsLmgKQEAgLTEyOCw5ICsxMjgsMTMgQEAKIC8qIGNsaWVudC5jICovCiBleHRlcm4gc3RydWN0IHJwY19wcm9ncmFtIG5mc19wcm9ncmFtOwogCitleHRlcm4gdm9pZCBuZnNfY2xlYW51cF9jYl9pZGVudF9pZHIodm9pZCk7CiBleHRlcm4gdm9pZCBuZnNfcHV0X2NsaWVudChzdHJ1Y3QgbmZzX2NsaWVudCAqKTsKLWV4dGVybiBzdHJ1Y3QgbmZzX2NsaWVudCAqbmZzX2ZpbmRfY2xpZW50KGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqLCB1MzIpOwotZXh0ZXJuIHN0cnVjdCBuZnNfY2xpZW50ICpuZnNfZmluZF9jbGllbnRfbmV4dChzdHJ1Y3QgbmZzX2NsaWVudCAqKTsKK2V4dGVybiBzdHJ1Y3QgbmZzX2NsaWVudCAqbmZzNF9maW5kX2NsaWVudF9ub19pZGVudChjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKik7CitleHRlcm4gc3RydWN0IG5mc19jbGllbnQgKm5mczRfZmluZF9jbGllbnRfaWRlbnQoaW50KTsKK2V4dGVybiBzdHJ1Y3QgbmZzX2NsaWVudCAqCituZnM0X2ZpbmRfY2xpZW50X3Nlc3Npb25pZChjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKiwgc3RydWN0IG5mczRfc2Vzc2lvbmlkICosCisJCQkgICBpbnQpOwogZXh0ZXJuIHN0cnVjdCBuZnNfc2VydmVyICpuZnNfY3JlYXRlX3NlcnZlcigKIAkJCQkJY29uc3Qgc3RydWN0IG5mc19wYXJzZWRfbW91bnRfZGF0YSAqLAogCQkJCQlzdHJ1Y3QgbmZzX2ZoICopOwpAQCAtMTg1LDE3ICsxODksMjAgQEAKIGV4dGVybiB2b2lkIG5mc19kZXN0cm95X2RpcmVjdGNhY2hlKHZvaWQpOwogCiAvKiBuZnMyeGRyLmMgKi8KLWV4dGVybiBpbnQgbmZzX3N0YXRfdG9fZXJybm8oaW50KTsKK2V4dGVybiBpbnQgbmZzX3N0YXRfdG9fZXJybm8oZW51bSBuZnNfc3RhdCk7CiBleHRlcm4gc3RydWN0IHJwY19wcm9jaW5mbyBuZnNfcHJvY2VkdXJlc1tdOwotZXh0ZXJuIF9fYmUzMiAqbmZzX2RlY29kZV9kaXJlbnQoc3RydWN0IHhkcl9zdHJlYW0gKiwgc3RydWN0IG5mc19lbnRyeSAqLCBzdHJ1Y3QgbmZzX3NlcnZlciAqLCBpbnQpOworZXh0ZXJuIGludCBuZnMyX2RlY29kZV9kaXJlbnQoc3RydWN0IHhkcl9zdHJlYW0gKiwKKwkJCQlzdHJ1Y3QgbmZzX2VudHJ5ICosIGludCk7CiAKIC8qIG5mczN4ZHIuYyAqLwogZXh0ZXJuIHN0cnVjdCBycGNfcHJvY2luZm8gbmZzM19wcm9jZWR1cmVzW107Ci1leHRlcm4gX19iZTMyICpuZnMzX2RlY29kZV9kaXJlbnQoc3RydWN0IHhkcl9zdHJlYW0gKiwgc3RydWN0IG5mc19lbnRyeSAqLCBzdHJ1Y3QgbmZzX3NlcnZlciAqLCBpbnQpOworZXh0ZXJuIGludCBuZnMzX2RlY29kZV9kaXJlbnQoc3RydWN0IHhkcl9zdHJlYW0gKiwKKwkJCQlzdHJ1Y3QgbmZzX2VudHJ5ICosIGludCk7CiAKIC8qIG5mczR4ZHIuYyAqLwogI2lmZGVmIENPTkZJR19ORlNfVjQKLWV4dGVybiBfX2JlMzIgKm5mczRfZGVjb2RlX2RpcmVudChzdHJ1Y3QgeGRyX3N0cmVhbSAqLCBzdHJ1Y3QgbmZzX2VudHJ5ICosIHN0cnVjdCBuZnNfc2VydmVyICosIGludCk7CitleHRlcm4gaW50IG5mczRfZGVjb2RlX2RpcmVudChzdHJ1Y3QgeGRyX3N0cmVhbSAqLAorCQkJCXN0cnVjdCBuZnNfZW50cnkgKiwgaW50KTsKICNlbmRpZgogI2lmZGVmIENPTkZJR19ORlNfVjRfMQogZXh0ZXJuIGNvbnN0IHUzMiBuZnM0MV9tYXhyZWFkX292ZXJoZWFkOwpkaWZmIC0tZ2l0IGEvZnMvbmZzL21vdW50X2NsbnQuYyBiL2ZzL25mcy9tb3VudF9jbG50LmMKaW5kZXggNGY5ODFmMS4uZDRjMmQ2YiAxMDA2NDQKLS0tIGEvZnMvbmZzL21vdW50X2NsbnQuYworKysgYi9mcy9uZnMvbW91bnRfY2xudC5jCkBAIC0yMzYsMTAgKzIzNiw4IEBACiAJCS5hdXRoZmxhdm9yCT0gUlBDX0FVVEhfVU5JWCwKIAkJLmZsYWdzCQk9IFJQQ19DTE5UX0NSRUFURV9OT1BJTkcsCiAJfTsKLQlzdHJ1Y3QgbW91bnRyZXMJcmVzdWx0OwogCXN0cnVjdCBycGNfbWVzc2FnZSBtc2cJPSB7CiAJCS5ycGNfYXJncAk9IGluZm8tPmRpcnBhdGgsCi0JCS5ycGNfcmVzcAk9ICZyZXN1bHQsCiAJfTsKIAlzdHJ1Y3QgcnBjX2NsbnQgKmNsbnQ7CiAJaW50IHN0YXR1czsKQEAgLTI0OCw3ICsyNDYsNyBAQAogCQlhcmdzLmZsYWdzIHw9IFJQQ19DTE5UX0NSRUFURV9OT05QUklWUE9SVDsKIAogCWNsbnQgPSBycGNfY3JlYXRlKCZhcmdzKTsKLQlpZiAodW5saWtlbHkoSVNfRVJSKGNsbnQpKSkKKwlpZiAoSVNfRVJSKGNsbnQpKQogCQlnb3RvIG91dF9jbG50X2VycjsKIAogCWRwcmludGsoIk5GUzogc2VuZGluZyBVTU5UIHJlcXVlc3QgZm9yICVzOiVzXG4iLApAQCAtMjgwLDI5ICsyNzgsMjAgQEAKICAqIFhEUiBlbmNvZGUvZGVjb2RlIGZ1bmN0aW9ucyBmb3IgTU9VTlQKICAqLwogCi1zdGF0aWMgaW50IGVuY29kZV9tbnRkaXJwYXRoKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIGNvbnN0IGNoYXIgKnBhdGhuYW1lKQorc3RhdGljIHZvaWQgZW5jb2RlX21udGRpcnBhdGgoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgY29uc3QgY2hhciAqcGF0aG5hbWUpCiB7CiAJY29uc3QgdTMyIHBhdGhuYW1lX2xlbiA9IHN0cmxlbihwYXRobmFtZSk7CiAJX19iZTMyICpwOwogCi0JaWYgKHVubGlrZWx5KHBhdGhuYW1lX2xlbiA+IE1OVFBBVEhMRU4pKQotCQlyZXR1cm4gLUVJTzsKLQotCXAgPSB4ZHJfcmVzZXJ2ZV9zcGFjZSh4ZHIsIHNpemVvZih1MzIpICsgcGF0aG5hbWVfbGVuKTsKLQlpZiAodW5saWtlbHkocCA9PSBOVUxMKSkKLQkJcmV0dXJuIC1FSU87CisJQlVHX09OKHBhdGhuYW1lX2xlbiA+IE1OVFBBVEhMRU4pOworCXAgPSB4ZHJfcmVzZXJ2ZV9zcGFjZSh4ZHIsIDQgKyBwYXRobmFtZV9sZW4pOwogCXhkcl9lbmNvZGVfb3BhcXVlKHAsIHBhdGhuYW1lLCBwYXRobmFtZV9sZW4pOwotCi0JcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgbW50X2VuY19kaXJwYXRoKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsCi0JCQkgICBjb25zdCBjaGFyICpkaXJwYXRoKQorc3RhdGljIHZvaWQgbW50X3hkcl9lbmNfZGlycGF0aChzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKKwkJCQljb25zdCBjaGFyICpkaXJwYXRoKQogewotCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKLQotCXhkcl9pbml0X2VuY29kZSgmeGRyLCAmcmVxLT5ycV9zbmRfYnVmLCBwKTsKLQlyZXR1cm4gZW5jb2RlX21udGRpcnBhdGgoJnhkciwgZGlycGF0aCk7CisJZW5jb2RlX21udGRpcnBhdGgoeGRyLCBkaXJwYXRoKTsKIH0KIAogLyoKQEAgLTMyMCwxMCArMzA5LDEwIEBACiAJdTMyIHN0YXR1czsKIAlfX2JlMzIgKnA7CiAKLQlwID0geGRyX2lubGluZV9kZWNvZGUoeGRyLCBzaXplb2Yoc3RhdHVzKSk7CisJcCA9IHhkcl9pbmxpbmVfZGVjb2RlKHhkciwgNCk7CiAJaWYgKHVubGlrZWx5KHAgPT0gTlVMTCkpCiAJCXJldHVybiAtRUlPOwotCXN0YXR1cyA9IG50b2hsKCpwKTsKKwlzdGF0dXMgPSBiZTMyX3RvX2NwdXAocCk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShtbnRfZXJydGJsKTsgaSsrKSB7CiAJCWlmIChtbnRfZXJydGJsW2ldLnN0YXR1cyA9PSBzdGF0dXMpIHsKQEAgLTM1MSwxOCArMzQwLDE2IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgbW50X2RlY19tb3VudHJlcyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLAotCQkJICAgIHN0cnVjdCBtb3VudHJlcyAqcmVzKQorc3RhdGljIGludCBtbnRfeGRyX2RlY19tb3VudHJlcyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwKKwkJCQlzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAorCQkJCXN0cnVjdCBtb3VudHJlcyAqcmVzKQogewotCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKIAlpbnQgc3RhdHVzOwogCi0JeGRyX2luaXRfZGVjb2RlKCZ4ZHIsICZyZXEtPnJxX3Jjdl9idWYsIHApOwotCi0Jc3RhdHVzID0gZGVjb2RlX3N0YXR1cygmeGRyLCByZXMpOworCXN0YXR1cyA9IGRlY29kZV9zdGF0dXMoeGRyLCByZXMpOwogCWlmICh1bmxpa2VseShzdGF0dXMgIT0gMCB8fCByZXMtPmVycm5vICE9IDApKQogCQlyZXR1cm4gc3RhdHVzOwotCXJldHVybiBkZWNvZGVfZmhhbmRsZSgmeGRyLCByZXMpOworCXJldHVybiBkZWNvZGVfZmhhbmRsZSh4ZHIsIHJlcyk7CiB9CiAKIHN0YXRpYyBpbnQgZGVjb2RlX2Zoc19zdGF0dXMoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgc3RydWN0IG1vdW50cmVzICpyZXMpCkBAIC0zNzEsMTAgKzM1OCwxMCBAQAogCXUzMiBzdGF0dXM7CiAJX19iZTMyICpwOwogCi0JcCA9IHhkcl9pbmxpbmVfZGVjb2RlKHhkciwgc2l6ZW9mKHN0YXR1cykpOworCXAgPSB4ZHJfaW5saW5lX2RlY29kZSh4ZHIsIDQpOwogCWlmICh1bmxpa2VseShwID09IE5VTEwpKQogCQlyZXR1cm4gLUVJTzsKLQlzdGF0dXMgPSBudG9obCgqcCk7CisJc3RhdHVzID0gYmUzMl90b19jcHVwKHApOwogCiAJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobW50M19lcnJ0YmwpOyBpKyspIHsKIAkJaWYgKG1udDNfZXJydGJsW2ldLnN0YXR1cyA9PSBzdGF0dXMpIHsKQEAgLTM5NCwxMSArMzgxLDExIEBACiAJdTMyIHNpemU7CiAJX19iZTMyICpwOwogCi0JcCA9IHhkcl9pbmxpbmVfZGVjb2RlKHhkciwgc2l6ZW9mKHNpemUpKTsKKwlwID0geGRyX2lubGluZV9kZWNvZGUoeGRyLCA0KTsKIAlpZiAodW5saWtlbHkocCA9PSBOVUxMKSkKIAkJcmV0dXJuIC1FSU87CiAKLQlzaXplID0gbnRvaGwoKnArKyk7CisJc2l6ZSA9IGJlMzJfdG9fY3B1cChwKTsKIAlpZiAoc2l6ZSA+IE5GUzNfRkhTSVpFIHx8IHNpemUgPT0gMCkKIAkJcmV0dXJuIC1FSU87CiAKQEAgLTQyMSwxNSArNDA4LDE1IEBACiAJaWYgKCpjb3VudCA9PSAwKQogCQlyZXR1cm4gMDsKIAotCXAgPSB4ZHJfaW5saW5lX2RlY29kZSh4ZHIsIHNpemVvZihlbnRyaWVzKSk7CisJcCA9IHhkcl9pbmxpbmVfZGVjb2RlKHhkciwgNCk7CiAJaWYgKHVubGlrZWx5KHAgPT0gTlVMTCkpCiAJCXJldHVybiAtRUlPOwotCWVudHJpZXMgPSBudG9obCgqcCk7CisJZW50cmllcyA9IGJlMzJfdG9fY3B1cChwKTsKIAlkcHJpbnRrKCJORlM6IHJlY2VpdmVkICV1IGF1dGggZmxhdm9yc1xuIiwgZW50cmllcyk7CiAJaWYgKGVudHJpZXMgPiBORlNfTUFYX1NFQ0ZMQVZPUlMpCiAJCWVudHJpZXMgPSBORlNfTUFYX1NFQ0ZMQVZPUlM7CiAKLQlwID0geGRyX2lubGluZV9kZWNvZGUoeGRyLCBzaXplb2YodTMyKSAqIGVudHJpZXMpOworCXAgPSB4ZHJfaW5saW5lX2RlY29kZSh4ZHIsIDQgKiBlbnRyaWVzKTsKIAlpZiAodW5saWtlbHkocCA9PSBOVUxMKSkKIAkJcmV0dXJuIC1FSU87CiAKQEAgLTQzNyw3ICs0MjQsNyBAQAogCQllbnRyaWVzID0gKmNvdW50OwogCiAJZm9yIChpID0gMDsgaSA8IGVudHJpZXM7IGkrKykgewotCQlmbGF2b3JzW2ldID0gbnRvaGwoKnArKyk7CisJCWZsYXZvcnNbaV0gPSBiZTMyX3RvX2NwdXAocCsrKTsKIAkJZHByaW50aygiTkZTOiAgIGF1dGggZmxhdm9yWyV1XTogJWRcbiIsIGksIGZsYXZvcnNbaV0pOwogCX0KIAkqY291bnQgPSBpOwpAQCAtNDQ1LDMwICs0MzIsMjggQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBtbnRfZGVjX21vdW50cmVzMyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLAotCQkJICAgICBzdHJ1Y3QgbW91bnRyZXMgKnJlcykKK3N0YXRpYyBpbnQgbW50X3hkcl9kZWNfbW91bnRyZXMzKHN0cnVjdCBycGNfcnFzdCAqcmVxLAorCQkJCSBzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAorCQkJCSBzdHJ1Y3QgbW91bnRyZXMgKnJlcykKIHsKLQlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CiAJaW50IHN0YXR1czsKIAotCXhkcl9pbml0X2RlY29kZSgmeGRyLCAmcmVxLT5ycV9yY3ZfYnVmLCBwKTsKLQotCXN0YXR1cyA9IGRlY29kZV9maHNfc3RhdHVzKCZ4ZHIsIHJlcyk7CisJc3RhdHVzID0gZGVjb2RlX2Zoc19zdGF0dXMoeGRyLCByZXMpOwogCWlmICh1bmxpa2VseShzdGF0dXMgIT0gMCB8fCByZXMtPmVycm5vICE9IDApKQogCQlyZXR1cm4gc3RhdHVzOwotCXN0YXR1cyA9IGRlY29kZV9maGFuZGxlMygmeGRyLCByZXMpOworCXN0YXR1cyA9IGRlY29kZV9maGFuZGxlMyh4ZHIsIHJlcyk7CiAJaWYgKHVubGlrZWx5KHN0YXR1cyAhPSAwKSkgewogCQlyZXMtPmVycm5vID0gLUVCQURIQU5ETEU7CiAJCXJldHVybiAwOwogCX0KLQlyZXR1cm4gZGVjb2RlX2F1dGhfZmxhdm9ycygmeGRyLCByZXMpOworCXJldHVybiBkZWNvZGVfYXV0aF9mbGF2b3JzKHhkciwgcmVzKTsKIH0KIAogc3RhdGljIHN0cnVjdCBycGNfcHJvY2luZm8gbW50X3Byb2NlZHVyZXNbXSA9IHsKIAlbTU9VTlRQUk9DX01OVF0gPSB7CiAJCS5wX3Byb2MJCT0gTU9VTlRQUk9DX01OVCwKLQkJLnBfZW5jb2RlCT0gKGt4ZHJwcm9jX3QpbW50X2VuY19kaXJwYXRoLAotCQkucF9kZWNvZGUJPSAoa3hkcnByb2NfdCltbnRfZGVjX21vdW50cmVzLAorCQkucF9lbmNvZGUJPSAoa3hkcmVwcm9jX3QpbW50X3hkcl9lbmNfZGlycGF0aCwKKwkJLnBfZGVjb2RlCT0gKGt4ZHJkcHJvY190KW1udF94ZHJfZGVjX21vdW50cmVzLAogCQkucF9hcmdsZW4JPSBNTlRfZW5jX2RpcnBhdGhfc3osCiAJCS5wX3JlcGxlbgk9IE1OVF9kZWNfbW91bnRyZXNfc3osCiAJCS5wX3N0YXRpZHgJPSBNT1VOVFBST0NfTU5ULApAQCAtNDc2LDcgKzQ2MSw3IEBACiAJfSwKIAlbTU9VTlRQUk9DX1VNTlRdID0gewogCQkucF9wcm9jCQk9IE1PVU5UUFJPQ19VTU5ULAotCQkucF9lbmNvZGUJPSAoa3hkcnByb2NfdCltbnRfZW5jX2RpcnBhdGgsCisJCS5wX2VuY29kZQk9IChreGRyZXByb2NfdCltbnRfeGRyX2VuY19kaXJwYXRoLAogCQkucF9hcmdsZW4JPSBNTlRfZW5jX2RpcnBhdGhfc3osCiAJCS5wX3N0YXRpZHgJPSBNT1VOVFBST0NfVU1OVCwKIAkJLnBfbmFtZQkJPSAiVU1PVU5UIiwKQEAgLTQ4Niw4ICs0NzEsOCBAQAogc3RhdGljIHN0cnVjdCBycGNfcHJvY2luZm8gbW50M19wcm9jZWR1cmVzW10gPSB7CiAJW01PVU5UUFJPQzNfTU5UXSA9IHsKIAkJLnBfcHJvYwkJPSBNT1VOVFBST0MzX01OVCwKLQkJLnBfZW5jb2RlCT0gKGt4ZHJwcm9jX3QpbW50X2VuY19kaXJwYXRoLAotCQkucF9kZWNvZGUJPSAoa3hkcnByb2NfdCltbnRfZGVjX21vdW50cmVzMywKKwkJLnBfZW5jb2RlCT0gKGt4ZHJlcHJvY190KW1udF94ZHJfZW5jX2RpcnBhdGgsCisJCS5wX2RlY29kZQk9IChreGRyZHByb2NfdCltbnRfeGRyX2RlY19tb3VudHJlczMsCiAJCS5wX2FyZ2xlbgk9IE1OVF9lbmNfZGlycGF0aF9zeiwKIAkJLnBfcmVwbGVuCT0gTU5UX2RlY19tb3VudHJlczNfc3osCiAJCS5wX3N0YXRpZHgJPSBNT1VOVFBST0MzX01OVCwKQEAgLTQ5NSw3ICs0ODAsNyBAQAogCX0sCiAJW01PVU5UUFJPQzNfVU1OVF0gPSB7CiAJCS5wX3Byb2MJCT0gTU9VTlRQUk9DM19VTU5ULAotCQkucF9lbmNvZGUJPSAoa3hkcnByb2NfdCltbnRfZW5jX2RpcnBhdGgsCisJCS5wX2VuY29kZQk9IChreGRyZXByb2NfdCltbnRfeGRyX2VuY19kaXJwYXRoLAogCQkucF9hcmdsZW4JPSBNTlRfZW5jX2RpcnBhdGhfc3osCiAJCS5wX3N0YXRpZHgJPSBNT1VOVFBST0MzX1VNTlQsCiAJCS5wX25hbWUJCT0gIlVNT1VOVCIsCmRpZmYgLS1naXQgYS9mcy9uZnMvbmZzMnhkci5jIGIvZnMvbmZzL25mczJ4ZHIuYwppbmRleCA1OTE0YTE5Li43OTJjYjEzIDEwMDY0NAotLS0gYS9mcy9uZnMvbmZzMnhkci5jCisrKyBiL2ZzL25mcy9uZnMyeGRyLmMKQEAgLTYxLDU4NCArNjEsMTAwOCBAQAogI2RlZmluZSBORlNfcmVhZGRpcnJlc19zegkoMSkKICNkZWZpbmUgTkZTX3N0YXRmc3Jlc19zegkoMStORlNfaW5mb19zeikKIAotLyoKLSAqIENvbW1vbiBORlMgWERSIGZ1bmN0aW9ucyBhcyBpbmxpbmVzCi0gKi8KLXN0YXRpYyBpbmxpbmUgX19iZTMyICoKLXhkcl9lbmNvZGVfZmhhbmRsZShfX2JlMzIgKnAsIGNvbnN0IHN0cnVjdCBuZnNfZmggKmZoYW5kbGUpCi17Ci0JbWVtY3B5KHAsIGZoYW5kbGUtPmRhdGEsIE5GUzJfRkhTSVpFKTsKLQlyZXR1cm4gcCArIFhEUl9RVUFETEVOKE5GUzJfRkhTSVpFKTsKLX0KLQotc3RhdGljIGlubGluZSBfX2JlMzIgKgoteGRyX2RlY29kZV9maGFuZGxlKF9fYmUzMiAqcCwgc3RydWN0IG5mc19maCAqZmhhbmRsZSkKLXsKLQkvKiBORlN2MiBoYW5kbGVzIGhhdmUgYSBmaXhlZCBsZW5ndGggKi8KLQlmaGFuZGxlLT5zaXplID0gTkZTMl9GSFNJWkU7Ci0JbWVtY3B5KGZoYW5kbGUtPmRhdGEsIHAsIE5GUzJfRkhTSVpFKTsKLQlyZXR1cm4gcCArIFhEUl9RVUFETEVOKE5GUzJfRkhTSVpFKTsKLX0KLQotc3RhdGljIGlubGluZSBfX2JlMzIqCi14ZHJfZW5jb2RlX3RpbWUoX19iZTMyICpwLCBzdHJ1Y3QgdGltZXNwZWMgKnRpbWVwKQotewotCSpwKysgPSBodG9ubCh0aW1lcC0+dHZfc2VjKTsKLQkvKiBDb252ZXJ0IG5hbm9zZWNvbmRzIGludG8gbWljcm9zZWNvbmRzICovCi0JKnArKyA9IGh0b25sKHRpbWVwLT50dl9uc2VjID8gdGltZXAtPnR2X25zZWMgLyAxMDAwIDogMCk7Ci0JcmV0dXJuIHA7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgX19iZTMyKgoteGRyX2VuY29kZV9jdXJyZW50X3NlcnZlcl90aW1lKF9fYmUzMiAqcCwgc3RydWN0IHRpbWVzcGVjICp0aW1lcCkKLXsKLQkvKgotCSAqIFBhc3NpbmcgdGhlIGludmFsaWQgdmFsdWUgdXNlY29uZHM9MTAwMDAwMCBpcyBhCi0JICogU3VuIGNvbnZlbnRpb24gZm9yICJzZXQgdG8gY3VycmVudCBzZXJ2ZXIgdGltZSIuCi0JICogSXQncyBuZWVkZWQgdG8gbWFrZSBwZXJtaXNzaW9ucyBjaGVja3MgZm9yIHRoZQotCSAqICJ0b3VjaCIgcHJvZ3JhbSBhY3Jvc3MgdjIgbW91bnRzIHRvIFNvbGFyaXMgYW5kCi0JICogSXJpeCBib3hlcyB3b3JrIGNvcnJlY3RseS4gU2VlIGRlc2NyaXB0aW9uIG9mCi0JICogc2F0dHIgaW4gc2VjdGlvbiA2LjEgb2YgIk5GUyBJbGx1c3RyYXRlZCIgYnkKLQkgKiBCcmVudCBDYWxsYWdoYW4sIEFkZGlzb24tV2VzbGV5LCBJU0JOIDAtMjAxLTMyNzUwLTUKLQkgKi8KLQkqcCsrID0gaHRvbmwodGltZXAtPnR2X3NlYyk7Ci0JKnArKyA9IGh0b25sKDEwMDAwMDApOwotCXJldHVybiBwOwotfQotCi1zdGF0aWMgaW5saW5lIF9fYmUzMioKLXhkcl9kZWNvZGVfdGltZShfX2JlMzIgKnAsIHN0cnVjdCB0aW1lc3BlYyAqdGltZXApCi17Ci0JdGltZXAtPnR2X3NlYyA9IG50b2hsKCpwKyspOwotCS8qIENvbnZlcnQgbWljcm9zZWNvbmRzIGludG8gbmFub3NlY29uZHMgKi8KLQl0aW1lcC0+dHZfbnNlYyA9IG50b2hsKCpwKyspICogMTAwMDsKLQlyZXR1cm4gcDsKLX0KLQotc3RhdGljIF9fYmUzMiAqCi14ZHJfZGVjb2RlX2ZhdHRyKF9fYmUzMiAqcCwgc3RydWN0IG5mc19mYXR0ciAqZmF0dHIpCi17Ci0JdTMyIHJkZXYsIHR5cGU7Ci0JdHlwZSA9IG50b2hsKCpwKyspOwotCWZhdHRyLT5tb2RlID0gbnRvaGwoKnArKyk7Ci0JZmF0dHItPm5saW5rID0gbnRvaGwoKnArKyk7Ci0JZmF0dHItPnVpZCA9IG50b2hsKCpwKyspOwotCWZhdHRyLT5naWQgPSBudG9obCgqcCsrKTsKLQlmYXR0ci0+c2l6ZSA9IG50b2hsKCpwKyspOwotCWZhdHRyLT5kdS5uZnMyLmJsb2Nrc2l6ZSA9IG50b2hsKCpwKyspOwotCXJkZXYgPSBudG9obCgqcCsrKTsKLQlmYXR0ci0+ZHUubmZzMi5ibG9ja3MgPSBudG9obCgqcCsrKTsKLQlmYXR0ci0+ZnNpZC5tYWpvciA9IG50b2hsKCpwKyspOwotCWZhdHRyLT5mc2lkLm1pbm9yID0gMDsKLQlmYXR0ci0+ZmlsZWlkID0gbnRvaGwoKnArKyk7Ci0JcCA9IHhkcl9kZWNvZGVfdGltZShwLCAmZmF0dHItPmF0aW1lKTsKLQlwID0geGRyX2RlY29kZV90aW1lKHAsICZmYXR0ci0+bXRpbWUpOwotCXAgPSB4ZHJfZGVjb2RlX3RpbWUocCwgJmZhdHRyLT5jdGltZSk7Ci0JZmF0dHItPnZhbGlkIHw9IE5GU19BVFRSX0ZBVFRSX1YyOwotCWZhdHRyLT5yZGV2ID0gbmV3X2RlY29kZV9kZXYocmRldik7Ci0JaWYgKHR5cGUgPT0gTkZDSFIgJiYgcmRldiA9PSBORlMyX0ZJRk9fREVWKSB7Ci0JCWZhdHRyLT5tb2RlID0gKGZhdHRyLT5tb2RlICYgflNfSUZNVCkgfCBTX0lGSUZPOwotCQlmYXR0ci0+cmRldiA9IDA7Ci0JfQotCXJldHVybiBwOwotfQotCi1zdGF0aWMgaW5saW5lIF9fYmUzMiAqCi14ZHJfZW5jb2RlX3NhdHRyKF9fYmUzMiAqcCwgc3RydWN0IGlhdHRyICphdHRyKQotewotCWNvbnN0IF9fYmUzMiBub3Rfc2V0ID0gX19jb25zdGFudF9odG9ubCgweEZGRkZGRkZGKTsKLQotCSpwKysgPSAoYXR0ci0+aWFfdmFsaWQgJiBBVFRSX01PREUpID8gaHRvbmwoYXR0ci0+aWFfbW9kZSkgOiBub3Rfc2V0OwotCSpwKysgPSAoYXR0ci0+aWFfdmFsaWQgJiBBVFRSX1VJRCkgPyBodG9ubChhdHRyLT5pYV91aWQpIDogbm90X3NldDsKLQkqcCsrID0gKGF0dHItPmlhX3ZhbGlkICYgQVRUUl9HSUQpID8gaHRvbmwoYXR0ci0+aWFfZ2lkKSA6IG5vdF9zZXQ7Ci0JKnArKyA9IChhdHRyLT5pYV92YWxpZCAmIEFUVFJfU0laRSkgPyBodG9ubChhdHRyLT5pYV9zaXplKSA6IG5vdF9zZXQ7Ci0KLQlpZiAoYXR0ci0+aWFfdmFsaWQgJiBBVFRSX0FUSU1FX1NFVCkgewotCQlwID0geGRyX2VuY29kZV90aW1lKHAsICZhdHRyLT5pYV9hdGltZSk7Ci0JfSBlbHNlIGlmIChhdHRyLT5pYV92YWxpZCAmIEFUVFJfQVRJTUUpIHsKLQkJcCA9IHhkcl9lbmNvZGVfY3VycmVudF9zZXJ2ZXJfdGltZShwLCAmYXR0ci0+aWFfYXRpbWUpOwotCX0gZWxzZSB7Ci0JCSpwKysgPSBub3Rfc2V0OwotCQkqcCsrID0gbm90X3NldDsKLQl9Ci0KLQlpZiAoYXR0ci0+aWFfdmFsaWQgJiBBVFRSX01USU1FX1NFVCkgewotCQlwID0geGRyX2VuY29kZV90aW1lKHAsICZhdHRyLT5pYV9tdGltZSk7Ci0JfSBlbHNlIGlmIChhdHRyLT5pYV92YWxpZCAmIEFUVFJfTVRJTUUpIHsKLQkJcCA9IHhkcl9lbmNvZGVfY3VycmVudF9zZXJ2ZXJfdGltZShwLCAmYXR0ci0+aWFfbXRpbWUpOwotCX0gZWxzZSB7Ci0JCSpwKysgPSBub3Rfc2V0OwkKLQkJKnArKyA9IG5vdF9zZXQ7Ci0JfQotICAJcmV0dXJuIHA7Ci19CiAKIC8qCi0gKiBORlMgZW5jb2RlIGZ1bmN0aW9ucworICogV2hpbGUgZW5jb2RpbmcgYXJndW1lbnRzLCBzZXQgdXAgdGhlIHJlcGx5IGJ1ZmZlciBpbiBhZHZhbmNlIHRvCisgKiByZWNlaXZlIHJlcGx5IGRhdGEgZGlyZWN0bHkgaW50byB0aGUgcGFnZSBjYWNoZS4KICAqLwotLyoKLSAqIEVuY29kZSBmaWxlIGhhbmRsZSBhcmd1bWVudAotICogR0VUQVRUUiwgUkVBRExJTkssIFNUQVRGUwotICovCi1zdGF0aWMgaW50Ci1uZnNfeGRyX2ZoYW5kbGUoc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgc3RydWN0IG5mc19maCAqZmgpCi17Ci0JcCA9IHhkcl9lbmNvZGVfZmhhbmRsZShwLCBmaCk7Ci0JcmVxLT5ycV9zbGVuID0geGRyX2FkanVzdF9pb3ZlYyhyZXEtPnJxX3N2ZWMsIHApOwotCXJldHVybiAwOwotfQotCi0vKgotICogRW5jb2RlIFNFVEFUVFIgYXJndW1lbnRzCi0gKi8KLXN0YXRpYyBpbnQKLW5mc194ZHJfc2F0dHJhcmdzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsIHN0cnVjdCBuZnNfc2F0dHJhcmdzICphcmdzKQotewotCXAgPSB4ZHJfZW5jb2RlX2ZoYW5kbGUocCwgYXJncy0+ZmgpOwotCXAgPSB4ZHJfZW5jb2RlX3NhdHRyKHAsIGFyZ3MtPnNhdHRyKTsKLQlyZXEtPnJxX3NsZW4gPSB4ZHJfYWRqdXN0X2lvdmVjKHJlcS0+cnFfc3ZlYywgcCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBFbmNvZGUgZGlyZWN0b3J5IG9wcyBhcmd1bWVudAotICogTE9PS1VQLCBSTURJUgotICovCi1zdGF0aWMgaW50Ci1uZnNfeGRyX2Rpcm9wYXJncyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLCBzdHJ1Y3QgbmZzX2Rpcm9wYXJncyAqYXJncykKLXsKLQlwID0geGRyX2VuY29kZV9maGFuZGxlKHAsIGFyZ3MtPmZoKTsKLQlwID0geGRyX2VuY29kZV9hcnJheShwLCBhcmdzLT5uYW1lLCBhcmdzLT5sZW4pOwotCXJlcS0+cnFfc2xlbiA9IHhkcl9hZGp1c3RfaW92ZWMocmVxLT5ycV9zdmVjLCBwKTsKLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIEVuY29kZSBSRU1PVkUgYXJndW1lbnQKLSAqLwotc3RhdGljIGludAotbmZzX3hkcl9yZW1vdmVhcmdzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsIGNvbnN0IHN0cnVjdCBuZnNfcmVtb3ZlYXJncyAqYXJncykKLXsKLQlwID0geGRyX2VuY29kZV9maGFuZGxlKHAsIGFyZ3MtPmZoKTsKLQlwID0geGRyX2VuY29kZV9hcnJheShwLCBhcmdzLT5uYW1lLm5hbWUsIGFyZ3MtPm5hbWUubGVuKTsKLQlyZXEtPnJxX3NsZW4gPSB4ZHJfYWRqdXN0X2lvdmVjKHJlcS0+cnFfc3ZlYywgcCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBBcmd1bWVudHMgdG8gYSBSRUFEIGNhbGwuIFNpbmNlIHdlIHJlYWQgZGF0YSBkaXJlY3RseSBpbnRvIHRoZSBwYWdlCi0gKiBjYWNoZSwgd2UgYWxzbyBzZXQgdXAgdGhlIHJlcGx5IGlvdmVjIGhlcmUgc28gdGhhdCBpb3ZbMV0gcG9pbnRzCi0gKiBleGFjdGx5IHRvIHRoZSBwYWdlIHdlIHdhbnQgdG8gZmV0Y2guCi0gKi8KLXN0YXRpYyBpbnQKLW5mc194ZHJfcmVhZGFyZ3Moc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgc3RydWN0IG5mc19yZWFkYXJncyAqYXJncykKK3N0YXRpYyB2b2lkIHByZXBhcmVfcmVwbHlfYnVmZmVyKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBzdHJ1Y3QgcGFnZSAqKnBhZ2VzLAorCQkJCSB1bnNpZ25lZCBpbnQgYmFzZSwgdW5zaWduZWQgaW50IGxlbiwKKwkJCQkgdW5zaWduZWQgaW50IGJ1ZnNpemUpCiB7CiAJc3RydWN0IHJwY19hdXRoCSphdXRoID0gcmVxLT5ycV9jcmVkLT5jcl9hdXRoOwogCXVuc2lnbmVkIGludCByZXBsZW47Ci0JdTMyIG9mZnNldCA9ICh1MzIpYXJncy0+b2Zmc2V0OwotCXUzMiBjb3VudCA9IGFyZ3MtPmNvdW50OwogCi0JcCA9IHhkcl9lbmNvZGVfZmhhbmRsZShwLCBhcmdzLT5maCk7Ci0JKnArKyA9IGh0b25sKG9mZnNldCk7Ci0JKnArKyA9IGh0b25sKGNvdW50KTsKLQkqcCsrID0gaHRvbmwoY291bnQpOwotCXJlcS0+cnFfc2xlbiA9IHhkcl9hZGp1c3RfaW92ZWMocmVxLT5ycV9zdmVjLCBwKTsKLQotCS8qIElubGluZSB0aGUgcGFnZSBhcnJheSAqLwotCXJlcGxlbiA9IChSUENfUkVQSERSU0laRSArIGF1dGgtPmF1X3JzbGFjayArIE5GU19yZWFkcmVzX3N6KSA8PCAyOwotCXhkcl9pbmxpbmVfcGFnZXMoJnJlcS0+cnFfcmN2X2J1ZiwgcmVwbGVuLAotCQkJIGFyZ3MtPnBhZ2VzLCBhcmdzLT5wZ2Jhc2UsIGNvdW50KTsKLQlyZXEtPnJxX3Jjdl9idWYuZmxhZ3MgfD0gWERSQlVGX1JFQUQ7Ci0JcmV0dXJuIDA7CisJcmVwbGVuID0gUlBDX1JFUEhEUlNJWkUgKyBhdXRoLT5hdV9yc2xhY2sgKyBidWZzaXplOworCXhkcl9pbmxpbmVfcGFnZXMoJnJlcS0+cnFfcmN2X2J1ZiwgcmVwbGVuIDw8IDIsIHBhZ2VzLCBiYXNlLCBsZW4pOwogfQogCiAvKgotICogRGVjb2RlIFJFQUQgcmVwbHkKKyAqIEhhbmRsZSBkZWNvZGUgYnVmZmVyIG92ZXJmbG93cyBvdXQtb2YtbGluZS4KICAqLwotc3RhdGljIGludAotbmZzX3hkcl9yZWFkcmVzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsIHN0cnVjdCBuZnNfcmVhZHJlcyAqcmVzKQotewotCXN0cnVjdCBrdmVjICppb3YgPSByZXEtPnJxX3Jjdl9idWYuaGVhZDsKLQlzaXplX3QgaGRybGVuOwotCXUzMiBjb3VudCwgcmVjdmQ7Ci0JaW50IHN0YXR1czsKLQotCWlmICgoc3RhdHVzID0gbnRvaGwoKnArKykpKQotCQlyZXR1cm4gbmZzX3N0YXRfdG9fZXJybm8oc3RhdHVzKTsKLQlwID0geGRyX2RlY29kZV9mYXR0cihwLCByZXMtPmZhdHRyKTsKLQotCWNvdW50ID0gbnRvaGwoKnArKyk7Ci0JcmVzLT5lb2YgPSAwOwotCWhkcmxlbiA9ICh1OCAqKSBwIC0gKHU4ICopIGlvdi0+aW92X2Jhc2U7Ci0JaWYgKGlvdi0+aW92X2xlbiA8IGhkcmxlbikgewotCQlkcHJpbnRrKCJORlM6IFJFQUQgcmVwbHkgaGVhZGVyIG92ZXJmbG93ZWQ6IgotCQkJCSJsZW5ndGggJVp1ID4gJVp1XG4iLCBoZHJsZW4sIGlvdi0+aW92X2xlbik7Ci0JCXJldHVybiAtZXJybm9fTkZTRVJSX0lPOwotCX0gZWxzZSBpZiAoaW92LT5pb3ZfbGVuICE9IGhkcmxlbikgewotCQlkcHJpbnRrKCJORlM6IFJFQUQgaGVhZGVyIGlzIHNob3J0LiBpb3ZlYyB3aWxsIGJlIHNoaWZ0ZWQuXG4iKTsKLQkJeGRyX3NoaWZ0X2J1ZigmcmVxLT5ycV9yY3ZfYnVmLCBpb3YtPmlvdl9sZW4gLSBoZHJsZW4pOwotCX0KLQotCXJlY3ZkID0gcmVxLT5ycV9yY3ZfYnVmLmxlbiAtIGhkcmxlbjsKLQlpZiAoY291bnQgPiByZWN2ZCkgewotCQlkcHJpbnRrKCJORlM6IHNlcnZlciBjaGVhdGluZyBpbiByZWFkIHJlcGx5OiAiCi0JCQkiY291bnQgJXUgPiByZWN2ZCAldVxuIiwgY291bnQsIHJlY3ZkKTsKLQkJY291bnQgPSByZWN2ZDsKLQl9Ci0KLQlkcHJpbnRrKCJSUEM6ICAgICAgcmVhZHJlcyBPSyBjb3VudCAldVxuIiwgY291bnQpOwotCWlmIChjb3VudCA8IHJlcy0+Y291bnQpCi0JCXJlcy0+Y291bnQgPSBjb3VudDsKLQotCXJldHVybiBjb3VudDsKLX0KLQotCi0vKgotICogV3JpdGUgYXJndW1lbnRzLiBTcGxpY2UgdGhlIGJ1ZmZlciB0byBiZSB3cml0dGVuIGludG8gdGhlIGlvdmVjLgotICovCi1zdGF0aWMgaW50Ci1uZnNfeGRyX3dyaXRlYXJncyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLCBzdHJ1Y3QgbmZzX3dyaXRlYXJncyAqYXJncykKLXsKLQlzdHJ1Y3QgeGRyX2J1ZiAqc25kYnVmID0gJnJlcS0+cnFfc25kX2J1ZjsKLQl1MzIgb2Zmc2V0ID0gKHUzMilhcmdzLT5vZmZzZXQ7Ci0JdTMyIGNvdW50ID0gYXJncy0+Y291bnQ7Ci0KLQlwID0geGRyX2VuY29kZV9maGFuZGxlKHAsIGFyZ3MtPmZoKTsKLQkqcCsrID0gaHRvbmwob2Zmc2V0KTsKLQkqcCsrID0gaHRvbmwob2Zmc2V0KTsKLQkqcCsrID0gaHRvbmwoY291bnQpOwotCSpwKysgPSBodG9ubChjb3VudCk7Ci0Jc25kYnVmLT5sZW4gPSB4ZHJfYWRqdXN0X2lvdmVjKHNuZGJ1Zi0+aGVhZCwgcCk7Ci0KLQkvKiBDb3B5IHRoZSBwYWdlIGFycmF5ICovCi0JeGRyX2VuY29kZV9wYWdlcyhzbmRidWYsIGFyZ3MtPnBhZ2VzLCBhcmdzLT5wZ2Jhc2UsIGNvdW50KTsKLQlzbmRidWYtPmZsYWdzIHw9IFhEUkJVRl9XUklURTsKLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIEVuY29kZSBjcmVhdGUgYXJndW1lbnRzCi0gKiBDUkVBVEUsIE1LRElSCi0gKi8KLXN0YXRpYyBpbnQKLW5mc194ZHJfY3JlYXRlYXJncyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLCBzdHJ1Y3QgbmZzX2NyZWF0ZWFyZ3MgKmFyZ3MpCi17Ci0JcCA9IHhkcl9lbmNvZGVfZmhhbmRsZShwLCBhcmdzLT5maCk7Ci0JcCA9IHhkcl9lbmNvZGVfYXJyYXkocCwgYXJncy0+bmFtZSwgYXJncy0+bGVuKTsKLQlwID0geGRyX2VuY29kZV9zYXR0cihwLCBhcmdzLT5zYXR0cik7Ci0JcmVxLT5ycV9zbGVuID0geGRyX2FkanVzdF9pb3ZlYyhyZXEtPnJxX3N2ZWMsIHApOwotCXJldHVybiAwOwotfQotCi0vKgotICogRW5jb2RlIFJFTkFNRSBhcmd1bWVudHMKLSAqLwotc3RhdGljIGludAotbmZzX3hkcl9yZW5hbWVhcmdzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsIHN0cnVjdCBuZnNfcmVuYW1lYXJncyAqYXJncykKLXsKLQlwID0geGRyX2VuY29kZV9maGFuZGxlKHAsIGFyZ3MtPm9sZF9kaXIpOwotCXAgPSB4ZHJfZW5jb2RlX2FycmF5KHAsIGFyZ3MtPm9sZF9uYW1lLT5uYW1lLCBhcmdzLT5vbGRfbmFtZS0+bGVuKTsKLQlwID0geGRyX2VuY29kZV9maGFuZGxlKHAsIGFyZ3MtPm5ld19kaXIpOwotCXAgPSB4ZHJfZW5jb2RlX2FycmF5KHAsIGFyZ3MtPm5ld19uYW1lLT5uYW1lLCBhcmdzLT5uZXdfbmFtZS0+bGVuKTsKLQlyZXEtPnJxX3NsZW4gPSB4ZHJfYWRqdXN0X2lvdmVjKHJlcS0+cnFfc3ZlYywgcCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBFbmNvZGUgTElOSyBhcmd1bWVudHMKLSAqLwotc3RhdGljIGludAotbmZzX3hkcl9saW5rYXJncyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLCBzdHJ1Y3QgbmZzX2xpbmthcmdzICphcmdzKQotewotCXAgPSB4ZHJfZW5jb2RlX2ZoYW5kbGUocCwgYXJncy0+ZnJvbWZoKTsKLQlwID0geGRyX2VuY29kZV9maGFuZGxlKHAsIGFyZ3MtPnRvZmgpOwotCXAgPSB4ZHJfZW5jb2RlX2FycmF5KHAsIGFyZ3MtPnRvbmFtZSwgYXJncy0+dG9sZW4pOwotCXJlcS0+cnFfc2xlbiA9IHhkcl9hZGp1c3RfaW92ZWMocmVxLT5ycV9zdmVjLCBwKTsKLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIEVuY29kZSBTWU1MSU5LIGFyZ3VtZW50cwotICovCi1zdGF0aWMgaW50Ci1uZnNfeGRyX3N5bWxpbmthcmdzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsIHN0cnVjdCBuZnNfc3ltbGlua2FyZ3MgKmFyZ3MpCi17Ci0Jc3RydWN0IHhkcl9idWYgKnNuZGJ1ZiA9ICZyZXEtPnJxX3NuZF9idWY7Ci0Jc2l6ZV90IHBhZDsKLQotCXAgPSB4ZHJfZW5jb2RlX2ZoYW5kbGUocCwgYXJncy0+ZnJvbWZoKTsKLQlwID0geGRyX2VuY29kZV9hcnJheShwLCBhcmdzLT5mcm9tbmFtZSwgYXJncy0+ZnJvbWxlbik7Ci0JKnArKyA9IGh0b25sKGFyZ3MtPnBhdGhsZW4pOwotCXNuZGJ1Zi0+bGVuID0geGRyX2FkanVzdF9pb3ZlYyhzbmRidWYtPmhlYWQsIHApOwotCi0JeGRyX2VuY29kZV9wYWdlcyhzbmRidWYsIGFyZ3MtPnBhZ2VzLCAwLCBhcmdzLT5wYXRobGVuKTsKLQotCS8qCi0JICogeGRyX2VuY29kZV9wYWdlcyBtYXkgaGF2ZSBhZGRlZCBhIGZldyBieXRlcyB0byBlbnN1cmUgdGhlCi0JICogcGF0aG5hbWUgZW5kcyBvbiBhIDQtYnl0ZSBib3VuZGFyeS4gIFN0YXJ0IGVuY29kaW5nIHRoZQotCSAqIGF0dHJpYnV0ZXMgYWZ0ZXIgdGhlIHBhZCBieXRlcy4KLQkgKi8KLQlwYWQgPSBzbmRidWYtPnRhaWwtPmlvdl9sZW47Ci0JaWYgKHBhZCA+IDApCi0JCXArKzsKLQlwID0geGRyX2VuY29kZV9zYXR0cihwLCBhcmdzLT5zYXR0cik7Ci0Jc25kYnVmLT5sZW4gKz0geGRyX2FkanVzdF9pb3ZlYyhzbmRidWYtPnRhaWwsIHApIC0gcGFkOwotCXJldHVybiAwOwotfQotCi0vKgotICogRW5jb2RlIGFyZ3VtZW50cyB0byByZWFkZGlyIGNhbGwKLSAqLwotc3RhdGljIGludAotbmZzX3hkcl9yZWFkZGlyYXJncyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLCBzdHJ1Y3QgbmZzX3JlYWRkaXJhcmdzICphcmdzKQotewotCXN0cnVjdCBycGNfYXV0aAkqYXV0aCA9IHJlcS0+cnFfY3JlZC0+Y3JfYXV0aDsKLQl1bnNpZ25lZCBpbnQgcmVwbGVuOwotCXUzMiBjb3VudCA9IGFyZ3MtPmNvdW50OwotCi0JcCA9IHhkcl9lbmNvZGVfZmhhbmRsZShwLCBhcmdzLT5maCk7Ci0JKnArKyA9IGh0b25sKGFyZ3MtPmNvb2tpZSk7Ci0JKnArKyA9IGh0b25sKGNvdW50KTsgLyogc2VlIGFib3ZlICovCi0JcmVxLT5ycV9zbGVuID0geGRyX2FkanVzdF9pb3ZlYyhyZXEtPnJxX3N2ZWMsIHApOwotCi0JLyogSW5saW5lIHRoZSBwYWdlIGFycmF5ICovCi0JcmVwbGVuID0gKFJQQ19SRVBIRFJTSVpFICsgYXV0aC0+YXVfcnNsYWNrICsgTkZTX3JlYWRkaXJyZXNfc3opIDw8IDI7Ci0JeGRyX2lubGluZV9wYWdlcygmcmVxLT5ycV9yY3ZfYnVmLCByZXBsZW4sIGFyZ3MtPnBhZ2VzLCAwLCBjb3VudCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBEZWNvZGUgdGhlIHJlc3VsdCBvZiBhIHJlYWRkaXIgY2FsbC4KLSAqIFdlJ3JlIG5vdCByZWFsbHkgZGVjb2RpbmcgYW55bW9yZSwgd2UganVzdCBsZWF2ZSB0aGUgYnVmZmVyIHVudG91Y2hlZAotICogYW5kIG9ubHkgY2hlY2sgdGhhdCBpdCBpcyBzeW50YWN0aWNhbGx5IGNvcnJlY3QuCi0gKiBUaGUgcmVhbCBkZWNvZGluZyBoYXBwZW5zIGluIG5mc19kZWNvZGVfZW50cnkgYmVsb3csIGNhbGxlZCBkaXJlY3RseQotICogZnJvbSBuZnNfcmVhZGRpciBmb3IgZWFjaCBlbnRyeS4KLSAqLwotc3RhdGljIGludAotbmZzX3hkcl9yZWFkZGlycmVzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsIHZvaWQgKmR1bW15KQotewotCXN0cnVjdCB4ZHJfYnVmICpyY3ZidWYgPSAmcmVxLT5ycV9yY3ZfYnVmOwotCXN0cnVjdCBrdmVjICppb3YgPSByY3ZidWYtPmhlYWQ7Ci0Jc3RydWN0IHBhZ2UgKipwYWdlOwotCXNpemVfdCBoZHJsZW47Ci0JdW5zaWduZWQgaW50IHBnbGVuLCByZWN2ZDsKLQlpbnQgc3RhdHVzOwotCi0JaWYgKChzdGF0dXMgPSBudG9obCgqcCsrKSkpCi0JCXJldHVybiBuZnNfc3RhdF90b19lcnJubyhzdGF0dXMpOwotCi0JaGRybGVuID0gKHU4ICopIHAgLSAodTggKikgaW92LT5pb3ZfYmFzZTsKLQlpZiAoaW92LT5pb3ZfbGVuIDwgaGRybGVuKSB7Ci0JCWRwcmludGsoIk5GUzogUkVBRERJUiByZXBseSBoZWFkZXIgb3ZlcmZsb3dlZDoiCi0JCQkJImxlbmd0aCAlWnUgPiAlWnVcbiIsIGhkcmxlbiwgaW92LT5pb3ZfbGVuKTsKLQkJcmV0dXJuIC1lcnJub19ORlNFUlJfSU87Ci0JfSBlbHNlIGlmIChpb3YtPmlvdl9sZW4gIT0gaGRybGVuKSB7Ci0JCWRwcmludGsoIk5GUzogUkVBRERJUiBoZWFkZXIgaXMgc2hvcnQuIGlvdmVjIHdpbGwgYmUgc2hpZnRlZC5cbiIpOwotCQl4ZHJfc2hpZnRfYnVmKHJjdmJ1ZiwgaW92LT5pb3ZfbGVuIC0gaGRybGVuKTsKLQl9Ci0KLQlwZ2xlbiA9IHJjdmJ1Zi0+cGFnZV9sZW47Ci0JcmVjdmQgPSByY3ZidWYtPmxlbiAtIGhkcmxlbjsKLQlpZiAocGdsZW4gPiByZWN2ZCkKLQkJcGdsZW4gPSByZWN2ZDsKLQlwYWdlID0gcmN2YnVmLT5wYWdlczsKLQlyZXR1cm4gcGdsZW47Ci19Ci0KIHN0YXRpYyB2b2lkIHByaW50X292ZXJmbG93X21zZyhjb25zdCBjaGFyICpmdW5jLCBjb25zdCBzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyKQogewotCWRwcmludGsoIm5mczogJXM6IHByZW1hdHVyZWx5IGhpdCBlbmQgb2YgcmVjZWl2ZSBidWZmZXIuICIKKwlkcHJpbnRrKCJORlM6ICVzIHByZW1hdHVyZWx5IGhpdCB0aGUgZW5kIG9mIG91ciByZWNlaXZlIGJ1ZmZlci4gIgogCQkiUmVtYWluaW5nIGJ1ZmZlciBsZW5ndGggaXMgJXR1IHdvcmRzLlxuIiwKIAkJZnVuYywgeGRyLT5lbmQgLSB4ZHItPnApOwogfQogCi1fX2JlMzIgKgotbmZzX2RlY29kZV9kaXJlbnQoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgc3RydWN0IG5mc19lbnRyeSAqZW50cnksIHN0cnVjdCBuZnNfc2VydmVyICpzZXJ2ZXIsIGludCBwbHVzKQorCisvKgorICogRW5jb2RlL2RlY29kZSBORlN2MiBiYXNpYyBkYXRhIHR5cGVzCisgKgorICogQmFzaWMgTkZTdjIgZGF0YSB0eXBlcyBhcmUgZGVmaW5lZCBpbiBzZWN0aW9uIDIuMyBvZiBSRkMgMTA5NDoKKyAqICJORlM6IE5ldHdvcmsgRmlsZSBTeXN0ZW0gUHJvdG9jb2wgU3BlY2lmaWNhdGlvbiIuCisgKgorICogTm90IGFsbCBiYXNpYyBkYXRhIHR5cGVzIGhhdmUgdGhlaXIgb3duIGVuY29kaW5nIGFuZCBkZWNvZGluZworICogZnVuY3Rpb25zLiAgRm9yIHJ1bi10aW1lIGVmZmljaWVuY3ksIHNvbWUgZGF0YSB0eXBlcyBhcmUgZW5jb2RlZAorICogb3IgZGVjb2RlZCBpbmxpbmUuCisgKi8KKworLyoKKyAqCXR5cGVkZWYgb3BhcXVlCW5mc2RhdGE8PjsKKyAqLworc3RhdGljIGludCBkZWNvZGVfbmZzZGF0YShzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBzdHJ1Y3QgbmZzX3JlYWRyZXMgKnJlc3VsdCkKK3sKKwl1MzIgcmVjdmQsIGNvdW50OworCXNpemVfdCBoZHJsZW47CisJX19iZTMyICpwOworCisJcCA9IHhkcl9pbmxpbmVfZGVjb2RlKHhkciwgNCk7CisJaWYgKHVubGlrZWx5KHAgPT0gTlVMTCkpCisJCWdvdG8gb3V0X292ZXJmbG93OworCWNvdW50ID0gYmUzMl90b19jcHVwKHApOworCWhkcmxlbiA9ICh1OCAqKXhkci0+cCAtICh1OCAqKXhkci0+aW92LT5pb3ZfYmFzZTsKKwlyZWN2ZCA9IHhkci0+YnVmLT5sZW4gLSBoZHJsZW47CisJaWYgKHVubGlrZWx5KGNvdW50ID4gcmVjdmQpKQorCQlnb3RvIG91dF9jaGVhdGluZzsKK291dDoKKwl4ZHJfcmVhZF9wYWdlcyh4ZHIsIGNvdW50KTsKKwlyZXN1bHQtPmVvZiA9IDA7CS8qIE5GU3YyIGRvZXMgbm90IHBhc3MgRU9GIGZsYWcgb24gdGhlIHdpcmUuICovCisJcmVzdWx0LT5jb3VudCA9IGNvdW50OworCXJldHVybiBjb3VudDsKK291dF9jaGVhdGluZzoKKwlkcHJpbnRrKCJORlM6IHNlcnZlciBjaGVhdGluZyBpbiByZWFkIHJlc3VsdDogIgorCQkiY291bnQgJXUgPiByZWN2ZCAldVxuIiwgY291bnQsIHJlY3ZkKTsKKwljb3VudCA9IHJlY3ZkOworCWdvdG8gb3V0Oworb3V0X292ZXJmbG93OgorCXByaW50X292ZXJmbG93X21zZyhfX2Z1bmNfXywgeGRyKTsKKwlyZXR1cm4gLUVJTzsKK30KKworLyoKKyAqCWVudW0gc3RhdCB7CisgKgkJTkZTX09LID0gMCwKKyAqCQlORlNFUlJfUEVSTSA9IDEsCisgKgkJTkZTRVJSX05PRU5UID0gMiwKKyAqCQlORlNFUlJfSU8gPSA1LAorICoJCU5GU0VSUl9OWElPID0gNiwKKyAqCQlORlNFUlJfQUNDRVMgPSAxMywKKyAqCQlORlNFUlJfRVhJU1QgPSAxNywKKyAqCQlORlNFUlJfTk9ERVYgPSAxOSwKKyAqCQlORlNFUlJfTk9URElSID0gMjAsCisgKgkJTkZTRVJSX0lTRElSID0gMjEsCisgKgkJTkZTRVJSX0ZCSUcgPSAyNywKKyAqCQlORlNFUlJfTk9TUEMgPSAyOCwKKyAqCQlORlNFUlJfUk9GUyA9IDMwLAorICoJCU5GU0VSUl9OQU1FVE9PTE9ORyA9IDYzLAorICoJCU5GU0VSUl9OT1RFTVBUWSA9IDY2LAorICoJCU5GU0VSUl9EUVVPVCA9IDY5LAorICoJCU5GU0VSUl9TVEFMRSA9IDcwLAorICoJCU5GU0VSUl9XRkxVU0ggPSA5OQorICoJfTsKKyAqLworc3RhdGljIGludCBkZWNvZGVfc3RhdChzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBlbnVtIG5mc19zdGF0ICpzdGF0dXMpCiB7CiAJX19iZTMyICpwOworCiAJcCA9IHhkcl9pbmxpbmVfZGVjb2RlKHhkciwgNCk7Ci0JaWYgKHVubGlrZWx5KCFwKSkKKwlpZiAodW5saWtlbHkocCA9PSBOVUxMKSkKIAkJZ290byBvdXRfb3ZlcmZsb3c7Ci0JaWYgKCFudG9obCgqcCsrKSkgewotCQlwID0geGRyX2lubGluZV9kZWNvZGUoeGRyLCA0KTsKLQkJaWYgKHVubGlrZWx5KCFwKSkKLQkJCWdvdG8gb3V0X292ZXJmbG93OwotCQlpZiAoIW50b2hsKCpwKyspKQotCQkJcmV0dXJuIEVSUl9QVFIoLUVBR0FJTik7Ci0JCWVudHJ5LT5lb2YgPSAxOwotCQlyZXR1cm4gRVJSX1BUUigtRUJBRENPT0tJRSk7CisJKnN0YXR1cyA9IGJlMzJfdG9fY3B1cChwKTsKKwlyZXR1cm4gMDsKK291dF9vdmVyZmxvdzoKKwlwcmludF9vdmVyZmxvd19tc2coX19mdW5jX18sIHhkcik7CisJcmV0dXJuIC1FSU87Cit9CisKKy8qCisgKiAyLjMuMi4gIGZ0eXBlCisgKgorICoJZW51bSBmdHlwZSB7CisgKgkJTkZOT04gPSAwLAorICoJCU5GUkVHID0gMSwKKyAqCQlORkRJUiA9IDIsCisgKgkJTkZCTEsgPSAzLAorICoJCU5GQ0hSID0gNCwKKyAqCQlORkxOSyA9IDUKKyAqCX07CisgKgorICovCitzdGF0aWMgX19iZTMyICp4ZHJfZGVjb2RlX2Z0eXBlKF9fYmUzMiAqcCwgdTMyICp0eXBlKQoreworCSp0eXBlID0gYmUzMl90b19jcHVwKHArKyk7CisJaWYgKHVubGlrZWx5KCp0eXBlID4gTkYyRklGTykpCisJCSp0eXBlID0gTkZCQUQ7CisJcmV0dXJuIHA7Cit9CisKKy8qCisgKiAyLjMuMy4gIGZoYW5kbGUKKyAqCisgKgl0eXBlZGVmIG9wYXF1ZSBmaGFuZGxlW0ZIU0laRV07CisgKi8KK3N0YXRpYyB2b2lkIGVuY29kZV9maGFuZGxlKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIGNvbnN0IHN0cnVjdCBuZnNfZmggKmZoKQoreworCV9fYmUzMiAqcDsKKworCUJVR19PTihmaC0+c2l6ZSAhPSBORlMyX0ZIU0laRSk7CisJcCA9IHhkcl9yZXNlcnZlX3NwYWNlKHhkciwgTkZTMl9GSFNJWkUpOworCW1lbWNweShwLCBmaC0+ZGF0YSwgTkZTMl9GSFNJWkUpOworfQorCitzdGF0aWMgaW50IGRlY29kZV9maGFuZGxlKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHN0cnVjdCBuZnNfZmggKmZoKQoreworCV9fYmUzMiAqcDsKKworCXAgPSB4ZHJfaW5saW5lX2RlY29kZSh4ZHIsIE5GUzJfRkhTSVpFKTsKKwlpZiAodW5saWtlbHkocCA9PSBOVUxMKSkKKwkJZ290byBvdXRfb3ZlcmZsb3c7CisJZmgtPnNpemUgPSBORlMyX0ZIU0laRTsKKwltZW1jcHkoZmgtPmRhdGEsIHAsIE5GUzJfRkhTSVpFKTsKKwlyZXR1cm4gMDsKK291dF9vdmVyZmxvdzoKKwlwcmludF9vdmVyZmxvd19tc2coX19mdW5jX18sIHhkcik7CisJcmV0dXJuIC1FSU87Cit9CisKKy8qCisgKiAyLjMuNC4gIHRpbWV2YWwKKyAqCisgKglzdHJ1Y3QgdGltZXZhbCB7CisgKgkJdW5zaWduZWQgaW50IHNlY29uZHM7CisgKgkJdW5zaWduZWQgaW50IHVzZWNvbmRzOworICoJfTsKKyAqLworc3RhdGljIF9fYmUzMiAqeGRyX2VuY29kZV90aW1lKF9fYmUzMiAqcCwgY29uc3Qgc3RydWN0IHRpbWVzcGVjICp0aW1lcCkKK3sKKwkqcCsrID0gY3B1X3RvX2JlMzIodGltZXAtPnR2X3NlYyk7CisJaWYgKHRpbWVwLT50dl9uc2VjICE9IDApCisJCSpwKysgPSBjcHVfdG9fYmUzMih0aW1lcC0+dHZfbnNlYyAvIE5TRUNfUEVSX1VTRUMpOworCWVsc2UKKwkJKnArKyA9IGNwdV90b19iZTMyKDApOworCXJldHVybiBwOworfQorCisvKgorICogUGFzc2luZyB0aGUgaW52YWxpZCB2YWx1ZSB1c2Vjb25kcz0xMDAwMDAwIGlzIGEgU3VuIGNvbnZlbnRpb24gZm9yCisgKiAic2V0IHRvIGN1cnJlbnQgc2VydmVyIHRpbWUiLiAgSXQncyBuZWVkZWQgdG8gbWFrZSBwZXJtaXNzaW9ucyBjaGVja3MKKyAqIGZvciB0aGUgInRvdWNoIiBwcm9ncmFtIGFjcm9zcyB2MiBtb3VudHMgdG8gU29sYXJpcyBhbmQgSXJpeCBzZXJ2ZXJzCisgKiB3b3JrIGNvcnJlY3RseS4gIFNlZSBkZXNjcmlwdGlvbiBvZiBzYXR0ciBpbiBzZWN0aW9uIDYuMSBvZiAiTkZTCisgKiBJbGx1c3RyYXRlZCIgYnkgQnJlbnQgQ2FsbGFnaGFuLCBBZGRpc29uLVdlc2xleSwgSVNCTiAwLTIwMS0zMjc1MC01LgorICovCitzdGF0aWMgX19iZTMyICp4ZHJfZW5jb2RlX2N1cnJlbnRfc2VydmVyX3RpbWUoX19iZTMyICpwLAorCQkJCQkgICAgICBjb25zdCBzdHJ1Y3QgdGltZXNwZWMgKnRpbWVwKQoreworCSpwKysgPSBjcHVfdG9fYmUzMih0aW1lcC0+dHZfc2VjKTsKKwkqcCsrID0gY3B1X3RvX2JlMzIoMTAwMDAwMCk7CisJcmV0dXJuIHA7Cit9CisKK3N0YXRpYyBfX2JlMzIgKnhkcl9kZWNvZGVfdGltZShfX2JlMzIgKnAsIHN0cnVjdCB0aW1lc3BlYyAqdGltZXApCit7CisJdGltZXAtPnR2X3NlYyA9IGJlMzJfdG9fY3B1cChwKyspOworCXRpbWVwLT50dl9uc2VjID0gYmUzMl90b19jcHVwKHArKykgKiBOU0VDX1BFUl9VU0VDOworCXJldHVybiBwOworfQorCisvKgorICogMi4zLjUuICBmYXR0cgorICoKKyAqCXN0cnVjdCBmYXR0ciB7CisgKgkJZnR5cGUJCXR5cGU7CisgKgkJdW5zaWduZWQgaW50CW1vZGU7CisgKgkJdW5zaWduZWQgaW50CW5saW5rOworICoJCXVuc2lnbmVkIGludAl1aWQ7CisgKgkJdW5zaWduZWQgaW50CWdpZDsKKyAqCQl1bnNpZ25lZCBpbnQJc2l6ZTsKKyAqCQl1bnNpZ25lZCBpbnQJYmxvY2tzaXplOworICoJCXVuc2lnbmVkIGludAlyZGV2OworICoJCXVuc2lnbmVkIGludAlibG9ja3M7CisgKgkJdW5zaWduZWQgaW50CWZzaWQ7CisgKgkJdW5zaWduZWQgaW50CWZpbGVpZDsKKyAqCQl0aW1ldmFsCQlhdGltZTsKKyAqCQl0aW1ldmFsCQltdGltZTsKKyAqCQl0aW1ldmFsCQljdGltZTsKKyAqCX07CisgKgorICovCitzdGF0aWMgaW50IGRlY29kZV9mYXR0cihzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBzdHJ1Y3QgbmZzX2ZhdHRyICpmYXR0cikKK3sKKwl1MzIgcmRldiwgdHlwZTsKKwlfX2JlMzIgKnA7CisKKwlwID0geGRyX2lubGluZV9kZWNvZGUoeGRyLCBORlNfZmF0dHJfc3ogPDwgMik7CisJaWYgKHVubGlrZWx5KHAgPT0gTlVMTCkpCisJCWdvdG8gb3V0X292ZXJmbG93OworCisJZmF0dHItPnZhbGlkIHw9IE5GU19BVFRSX0ZBVFRSX1YyOworCisJcCA9IHhkcl9kZWNvZGVfZnR5cGUocCwgJnR5cGUpOworCisJZmF0dHItPm1vZGUgPSBiZTMyX3RvX2NwdXAocCsrKTsKKwlmYXR0ci0+bmxpbmsgPSBiZTMyX3RvX2NwdXAocCsrKTsKKwlmYXR0ci0+dWlkID0gYmUzMl90b19jcHVwKHArKyk7CisJZmF0dHItPmdpZCA9IGJlMzJfdG9fY3B1cChwKyspOworCWZhdHRyLT5zaXplID0gYmUzMl90b19jcHVwKHArKyk7CisJZmF0dHItPmR1Lm5mczIuYmxvY2tzaXplID0gYmUzMl90b19jcHVwKHArKyk7CisKKwlyZGV2ID0gYmUzMl90b19jcHVwKHArKyk7CisJZmF0dHItPnJkZXYgPSBuZXdfZGVjb2RlX2RldihyZGV2KTsKKwlpZiAodHlwZSA9PSAodTMyKU5GQ0hSICYmIHJkZXYgPT0gKHUzMilORlMyX0ZJRk9fREVWKSB7CisJCWZhdHRyLT5tb2RlID0gKGZhdHRyLT5tb2RlICYgflNfSUZNVCkgfCBTX0lGSUZPOworCQlmYXR0ci0+cmRldiA9IDA7CiAJfQogCi0JcCA9IHhkcl9pbmxpbmVfZGVjb2RlKHhkciwgOCk7Ci0JaWYgKHVubGlrZWx5KCFwKSkKLQkJZ290byBvdXRfb3ZlcmZsb3c7CisJZmF0dHItPmR1Lm5mczIuYmxvY2tzID0gYmUzMl90b19jcHVwKHArKyk7CisJZmF0dHItPmZzaWQubWFqb3IgPSBiZTMyX3RvX2NwdXAocCsrKTsKKwlmYXR0ci0+ZnNpZC5taW5vciA9IDA7CisJZmF0dHItPmZpbGVpZCA9IGJlMzJfdG9fY3B1cChwKyspOwogCi0JZW50cnktPmlubwkgID0gbnRvaGwoKnArKyk7Ci0JZW50cnktPmxlbgkgID0gbnRvaGwoKnArKyk7CisJcCA9IHhkcl9kZWNvZGVfdGltZShwLCAmZmF0dHItPmF0aW1lKTsKKwlwID0geGRyX2RlY29kZV90aW1lKHAsICZmYXR0ci0+bXRpbWUpOworCXhkcl9kZWNvZGVfdGltZShwLCAmZmF0dHItPmN0aW1lKTsKKwlyZXR1cm4gMDsKK291dF9vdmVyZmxvdzoKKwlwcmludF9vdmVyZmxvd19tc2coX19mdW5jX18sIHhkcik7CisJcmV0dXJuIC1FSU87Cit9CiAKLQlwID0geGRyX2lubGluZV9kZWNvZGUoeGRyLCBlbnRyeS0+bGVuICsgNCk7Ci0JaWYgKHVubGlrZWx5KCFwKSkKKy8qCisgKiAyLjMuNi4gIHNhdHRyCisgKgorICoJc3RydWN0IHNhdHRyIHsKKyAqCQl1bnNpZ25lZCBpbnQJbW9kZTsKKyAqCQl1bnNpZ25lZCBpbnQJdWlkOworICoJCXVuc2lnbmVkIGludAlnaWQ7CisgKgkJdW5zaWduZWQgaW50CXNpemU7CisgKgkJdGltZXZhbAkJYXRpbWU7CisgKgkJdGltZXZhbAkJbXRpbWU7CisgKgl9OworICovCisKKyNkZWZpbmUgTkZTMl9TQVRUUl9OT1RfU0VUCSgweGZmZmZmZmZmKQorCitzdGF0aWMgX19iZTMyICp4ZHJfdGltZV9ub3Rfc2V0KF9fYmUzMiAqcCkKK3sKKwkqcCsrID0gY3B1X3RvX2JlMzIoTkZTMl9TQVRUUl9OT1RfU0VUKTsKKwkqcCsrID0gY3B1X3RvX2JlMzIoTkZTMl9TQVRUUl9OT1RfU0VUKTsKKwlyZXR1cm4gcDsKK30KKworc3RhdGljIHZvaWQgZW5jb2RlX3NhdHRyKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIGNvbnN0IHN0cnVjdCBpYXR0ciAqYXR0cikKK3sKKwlfX2JlMzIgKnA7CisKKwlwID0geGRyX3Jlc2VydmVfc3BhY2UoeGRyLCBORlNfc2F0dHJfc3ogPDwgMik7CisKKwlpZiAoYXR0ci0+aWFfdmFsaWQgJiBBVFRSX01PREUpCisJCSpwKysgPSBjcHVfdG9fYmUzMihhdHRyLT5pYV9tb2RlKTsKKwllbHNlCisJCSpwKysgPSBjcHVfdG9fYmUzMihORlMyX1NBVFRSX05PVF9TRVQpOworCWlmIChhdHRyLT5pYV92YWxpZCAmIEFUVFJfVUlEKQorCQkqcCsrID0gY3B1X3RvX2JlMzIoYXR0ci0+aWFfdWlkKTsKKwllbHNlCisJCSpwKysgPSBjcHVfdG9fYmUzMihORlMyX1NBVFRSX05PVF9TRVQpOworCWlmIChhdHRyLT5pYV92YWxpZCAmIEFUVFJfR0lEKQorCQkqcCsrID0gY3B1X3RvX2JlMzIoYXR0ci0+aWFfZ2lkKTsKKwllbHNlCisJCSpwKysgPSBjcHVfdG9fYmUzMihORlMyX1NBVFRSX05PVF9TRVQpOworCWlmIChhdHRyLT5pYV92YWxpZCAmIEFUVFJfU0laRSkKKwkJKnArKyA9IGNwdV90b19iZTMyKCh1MzIpYXR0ci0+aWFfc2l6ZSk7CisJZWxzZQorCQkqcCsrID0gY3B1X3RvX2JlMzIoTkZTMl9TQVRUUl9OT1RfU0VUKTsKKworCWlmIChhdHRyLT5pYV92YWxpZCAmIEFUVFJfQVRJTUVfU0VUKQorCQlwID0geGRyX2VuY29kZV90aW1lKHAsICZhdHRyLT5pYV9hdGltZSk7CisJZWxzZSBpZiAoYXR0ci0+aWFfdmFsaWQgJiBBVFRSX0FUSU1FKQorCQlwID0geGRyX2VuY29kZV9jdXJyZW50X3NlcnZlcl90aW1lKHAsICZhdHRyLT5pYV9hdGltZSk7CisJZWxzZQorCQlwID0geGRyX3RpbWVfbm90X3NldChwKTsKKwlpZiAoYXR0ci0+aWFfdmFsaWQgJiBBVFRSX01USU1FX1NFVCkKKwkJeGRyX2VuY29kZV90aW1lKHAsICZhdHRyLT5pYV9tdGltZSk7CisJZWxzZSBpZiAoYXR0ci0+aWFfdmFsaWQgJiBBVFRSX01USU1FKQorCQl4ZHJfZW5jb2RlX2N1cnJlbnRfc2VydmVyX3RpbWUocCwgJmF0dHItPmlhX210aW1lKTsKKwllbHNlCisJCXhkcl90aW1lX25vdF9zZXQocCk7Cit9CisKKy8qCisgKiAyLjMuNy4gIGZpbGVuYW1lCisgKgorICoJdHlwZWRlZiBzdHJpbmcgZmlsZW5hbWU8TUFYTkFNTEVOPjsKKyAqLworc3RhdGljIHZvaWQgZW5jb2RlX2ZpbGVuYW1lKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCisJCQkgICAgY29uc3QgY2hhciAqbmFtZSwgdTMyIGxlbmd0aCkKK3sKKwlfX2JlMzIgKnA7CisKKwlCVUdfT04obGVuZ3RoID4gTkZTMl9NQVhOQU1MRU4pOworCXAgPSB4ZHJfcmVzZXJ2ZV9zcGFjZSh4ZHIsIDQgKyBsZW5ndGgpOworCXhkcl9lbmNvZGVfb3BhcXVlKHAsIG5hbWUsIGxlbmd0aCk7Cit9CisKK3N0YXRpYyBpbnQgZGVjb2RlX2ZpbGVuYW1lX2lubGluZShzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAorCQkJCSAgY29uc3QgY2hhciAqKm5hbWUsIHUzMiAqbGVuZ3RoKQoreworCV9fYmUzMiAqcDsKKwl1MzIgY291bnQ7CisKKwlwID0geGRyX2lubGluZV9kZWNvZGUoeGRyLCA0KTsKKwlpZiAodW5saWtlbHkocCA9PSBOVUxMKSkKIAkJZ290byBvdXRfb3ZlcmZsb3c7Ci0JZW50cnktPm5hbWUJICA9IChjb25zdCBjaGFyICopIHA7Ci0JcAkJICs9IFhEUl9RVUFETEVOKGVudHJ5LT5sZW4pOwotCWVudHJ5LT5wcmV2X2Nvb2tpZQkgID0gZW50cnktPmNvb2tpZTsKLQllbnRyeS0+Y29va2llCSAgPSBudG9obCgqcCsrKTsKKwljb3VudCA9IGJlMzJfdG9fY3B1cChwKTsKKwlpZiAoY291bnQgPiBORlMzX01BWE5BTUxFTikKKwkJZ290byBvdXRfbmFtZXRvb2xvbmc7CisJcCA9IHhkcl9pbmxpbmVfZGVjb2RlKHhkciwgY291bnQpOworCWlmICh1bmxpa2VseShwID09IE5VTEwpKQorCQlnb3RvIG91dF9vdmVyZmxvdzsKKwkqbmFtZSA9IChjb25zdCBjaGFyICopcDsKKwkqbGVuZ3RoID0gY291bnQ7CisJcmV0dXJuIDA7CitvdXRfbmFtZXRvb2xvbmc6CisJZHByaW50aygiTkZTOiByZXR1cm5lZCBmaWxlbmFtZSB0b28gbG9uZzogJXVcbiIsIGNvdW50KTsKKwlyZXR1cm4gLUVOQU1FVE9PTE9ORzsKK291dF9vdmVyZmxvdzoKKwlwcmludF9vdmVyZmxvd19tc2coX19mdW5jX18sIHhkcik7CisJcmV0dXJuIC1FSU87Cit9CisKKy8qCisgKiAyLjMuOC4gIHBhdGgKKyAqCisgKgl0eXBlZGVmIHN0cmluZyBwYXRoPE1BWFBBVEhMRU4+OworICovCitzdGF0aWMgdm9pZCBlbmNvZGVfcGF0aChzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBzdHJ1Y3QgcGFnZSAqKnBhZ2VzLCB1MzIgbGVuZ3RoKQoreworCV9fYmUzMiAqcDsKKworCUJVR19PTihsZW5ndGggPiBORlMyX01BWFBBVEhMRU4pOworCXAgPSB4ZHJfcmVzZXJ2ZV9zcGFjZSh4ZHIsIDQpOworCSpwID0gY3B1X3RvX2JlMzIobGVuZ3RoKTsKKwl4ZHJfd3JpdGVfcGFnZXMoeGRyLCBwYWdlcywgMCwgbGVuZ3RoKTsKK30KKworc3RhdGljIGludCBkZWNvZGVfcGF0aChzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyKQoreworCXUzMiBsZW5ndGgsIHJlY3ZkOworCXNpemVfdCBoZHJsZW47CisJX19iZTMyICpwOworCisJcCA9IHhkcl9pbmxpbmVfZGVjb2RlKHhkciwgNCk7CisJaWYgKHVubGlrZWx5KHAgPT0gTlVMTCkpCisJCWdvdG8gb3V0X292ZXJmbG93OworCWxlbmd0aCA9IGJlMzJfdG9fY3B1cChwKTsKKwlpZiAodW5saWtlbHkobGVuZ3RoID49IHhkci0+YnVmLT5wYWdlX2xlbiB8fCBsZW5ndGggPiBORlNfTUFYUEFUSExFTikpCisJCWdvdG8gb3V0X3NpemU7CisJaGRybGVuID0gKHU4ICopeGRyLT5wIC0gKHU4ICopeGRyLT5pb3YtPmlvdl9iYXNlOworCXJlY3ZkID0geGRyLT5idWYtPmxlbiAtIGhkcmxlbjsKKwlpZiAodW5saWtlbHkobGVuZ3RoID4gcmVjdmQpKQorCQlnb3RvIG91dF9jaGVhdGluZzsKKworCXhkcl9yZWFkX3BhZ2VzKHhkciwgbGVuZ3RoKTsKKwl4ZHJfdGVybWluYXRlX3N0cmluZyh4ZHItPmJ1ZiwgbGVuZ3RoKTsKKwlyZXR1cm4gMDsKK291dF9zaXplOgorCWRwcmludGsoIk5GUzogcmV0dXJuZWQgcGF0aG5hbWUgdG9vIGxvbmc6ICV1XG4iLCBsZW5ndGgpOworCXJldHVybiAtRU5BTUVUT09MT05HOworb3V0X2NoZWF0aW5nOgorCWRwcmludGsoIk5GUzogc2VydmVyIGNoZWF0aW5nIGluIHBhdGhuYW1lIHJlc3VsdDogIgorCQkibGVuZ3RoICV1ID4gcmVjZWl2ZWQgJXVcbiIsIGxlbmd0aCwgcmVjdmQpOworCXJldHVybiAtRUlPOworb3V0X292ZXJmbG93OgorCXByaW50X292ZXJmbG93X21zZyhfX2Z1bmNfXywgeGRyKTsKKwlyZXR1cm4gLUVJTzsKK30KKworLyoKKyAqIDIuMy45LiAgYXR0cnN0YXQKKyAqCisgKgl1bmlvbiBhdHRyc3RhdCBzd2l0Y2ggKHN0YXQgc3RhdHVzKSB7CisgKgljYXNlIE5GU19PSzoKKyAqCQlmYXR0ciBhdHRyaWJ1dGVzOworICoJZGVmYXVsdDoKKyAqCQl2b2lkOworICoJfTsKKyAqLworc3RhdGljIGludCBkZWNvZGVfYXR0cnN0YXQoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgc3RydWN0IG5mc19mYXR0ciAqcmVzdWx0KQoreworCWVudW0gbmZzX3N0YXQgc3RhdHVzOworCWludCBlcnJvcjsKKworCWVycm9yID0gZGVjb2RlX3N0YXQoeGRyLCAmc3RhdHVzKTsKKwlpZiAodW5saWtlbHkoZXJyb3IpKQorCQlnb3RvIG91dDsKKwlpZiAoc3RhdHVzICE9IE5GU19PSykKKwkJZ290byBvdXRfZGVmYXVsdDsKKwllcnJvciA9IGRlY29kZV9mYXR0cih4ZHIsIHJlc3VsdCk7CitvdXQ6CisJcmV0dXJuIGVycm9yOworb3V0X2RlZmF1bHQ6CisJcmV0dXJuIG5mc19zdGF0X3RvX2Vycm5vKHN0YXR1cyk7Cit9CisKKy8qCisgKiAyLjMuMTAuICBkaXJvcGFyZ3MKKyAqCisgKglzdHJ1Y3QgZGlyb3BhcmdzIHsKKyAqCQlmaGFuZGxlICBkaXI7CisgKgkJZmlsZW5hbWUgbmFtZTsKKyAqCX07CisgKi8KK3N0YXRpYyB2b2lkIGVuY29kZV9kaXJvcGFyZ3Moc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgY29uc3Qgc3RydWN0IG5mc19maCAqZmgsCisJCQkgICAgIGNvbnN0IGNoYXIgKm5hbWUsIHUzMiBsZW5ndGgpCit7CisJZW5jb2RlX2ZoYW5kbGUoeGRyLCBmaCk7CisJZW5jb2RlX2ZpbGVuYW1lKHhkciwgbmFtZSwgbGVuZ3RoKTsKK30KKworLyoKKyAqIDIuMy4xMS4gIGRpcm9wcmVzCisgKgorICoJdW5pb24gZGlyb3ByZXMgc3dpdGNoIChzdGF0IHN0YXR1cykgeworICoJY2FzZSBORlNfT0s6CisgKgkJc3RydWN0IHsKKyAqCQkJZmhhbmRsZSBmaWxlOworICoJCQlmYXR0ciAgIGF0dHJpYnV0ZXM7CisgKgkJfSBkaXJvcG9rOworICoJZGVmYXVsdDoKKyAqCQl2b2lkOworICoJfTsKKyAqLworc3RhdGljIGludCBkZWNvZGVfZGlyb3BvayhzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBzdHJ1Y3QgbmZzX2Rpcm9wb2sgKnJlc3VsdCkKK3sKKwlpbnQgZXJyb3I7CisKKwllcnJvciA9IGRlY29kZV9maGFuZGxlKHhkciwgcmVzdWx0LT5maCk7CisJaWYgKHVubGlrZWx5KGVycm9yKSkKKwkJZ290byBvdXQ7CisJZXJyb3IgPSBkZWNvZGVfZmF0dHIoeGRyLCByZXN1bHQtPmZhdHRyKTsKK291dDoKKwlyZXR1cm4gZXJyb3I7Cit9CisKK3N0YXRpYyBpbnQgZGVjb2RlX2Rpcm9wcmVzKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHN0cnVjdCBuZnNfZGlyb3BvayAqcmVzdWx0KQoreworCWVudW0gbmZzX3N0YXQgc3RhdHVzOworCWludCBlcnJvcjsKKworCWVycm9yID0gZGVjb2RlX3N0YXQoeGRyLCAmc3RhdHVzKTsKKwlpZiAodW5saWtlbHkoZXJyb3IpKQorCQlnb3RvIG91dDsKKwlpZiAoc3RhdHVzICE9IE5GU19PSykKKwkJZ290byBvdXRfZGVmYXVsdDsKKwllcnJvciA9IGRlY29kZV9kaXJvcG9rKHhkciwgcmVzdWx0KTsKK291dDoKKwlyZXR1cm4gZXJyb3I7CitvdXRfZGVmYXVsdDoKKwlyZXR1cm4gbmZzX3N0YXRfdG9fZXJybm8oc3RhdHVzKTsKK30KKworCisvKgorICogTkZTdjIgWERSIGVuY29kZSBmdW5jdGlvbnMKKyAqCisgKiBORlN2MiBhcmd1bWVudCB0eXBlcyBhcmUgZGVmaW5lZCBpbiBzZWN0aW9uIDIuMiBvZiBSRkMgMTA5NDoKKyAqICJORlM6IE5ldHdvcmsgRmlsZSBTeXN0ZW0gUHJvdG9jb2wgU3BlY2lmaWNhdGlvbiIuCisgKi8KKworc3RhdGljIHZvaWQgbmZzMl94ZHJfZW5jX2ZoYW5kbGUoc3RydWN0IHJwY19ycXN0ICpyZXEsCisJCQkJIHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCisJCQkJIGNvbnN0IHN0cnVjdCBuZnNfZmggKmZoKQoreworCWVuY29kZV9maGFuZGxlKHhkciwgZmgpOworfQorCisvKgorICogMi4yLjMuICBzYXR0cmFyZ3MKKyAqCisgKglzdHJ1Y3Qgc2F0dHJhcmdzIHsKKyAqCQlmaGFuZGxlIGZpbGU7CisgKgkJc2F0dHIgYXR0cmlidXRlczsKKyAqCX07CisgKi8KK3N0YXRpYyB2b2lkIG5mczJfeGRyX2VuY19zYXR0cmFyZ3Moc3RydWN0IHJwY19ycXN0ICpyZXEsCisJCQkJICAgc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKKwkJCQkgICBjb25zdCBzdHJ1Y3QgbmZzX3NhdHRyYXJncyAqYXJncykKK3sKKwllbmNvZGVfZmhhbmRsZSh4ZHIsIGFyZ3MtPmZoKTsKKwllbmNvZGVfc2F0dHIoeGRyLCBhcmdzLT5zYXR0cik7Cit9CisKK3N0YXRpYyB2b2lkIG5mczJfeGRyX2VuY19kaXJvcGFyZ3Moc3RydWN0IHJwY19ycXN0ICpyZXEsCisJCQkJICAgc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKKwkJCQkgICBjb25zdCBzdHJ1Y3QgbmZzX2Rpcm9wYXJncyAqYXJncykKK3sKKwllbmNvZGVfZGlyb3BhcmdzKHhkciwgYXJncy0+ZmgsIGFyZ3MtPm5hbWUsIGFyZ3MtPmxlbik7Cit9CisKK3N0YXRpYyB2b2lkIG5mczJfeGRyX2VuY19yZWFkbGlua2FyZ3Moc3RydWN0IHJwY19ycXN0ICpyZXEsCisJCQkJICAgICAgc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKKwkJCQkgICAgICBjb25zdCBzdHJ1Y3QgbmZzX3JlYWRsaW5rYXJncyAqYXJncykKK3sKKwllbmNvZGVfZmhhbmRsZSh4ZHIsIGFyZ3MtPmZoKTsKKwlwcmVwYXJlX3JlcGx5X2J1ZmZlcihyZXEsIGFyZ3MtPnBhZ2VzLCBhcmdzLT5wZ2Jhc2UsCisJCQkJCWFyZ3MtPnBnbGVuLCBORlNfcmVhZGxpbmtyZXNfc3opOworfQorCisvKgorICogMi4yLjcuICByZWFkYXJncworICoKKyAqCXN0cnVjdCByZWFkYXJncyB7CisgKgkJZmhhbmRsZSBmaWxlOworICoJCXVuc2lnbmVkIG9mZnNldDsKKyAqCQl1bnNpZ25lZCBjb3VudDsKKyAqCQl1bnNpZ25lZCB0b3RhbGNvdW50OworICoJfTsKKyAqLworc3RhdGljIHZvaWQgZW5jb2RlX3JlYWRhcmdzKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCisJCQkgICAgY29uc3Qgc3RydWN0IG5mc19yZWFkYXJncyAqYXJncykKK3sKKwl1MzIgb2Zmc2V0ID0gYXJncy0+b2Zmc2V0OworCXUzMiBjb3VudCA9IGFyZ3MtPmNvdW50OworCV9fYmUzMiAqcDsKKworCWVuY29kZV9maGFuZGxlKHhkciwgYXJncy0+ZmgpOworCisJcCA9IHhkcl9yZXNlcnZlX3NwYWNlKHhkciwgNCArIDQgKyA0KTsKKwkqcCsrID0gY3B1X3RvX2JlMzIob2Zmc2V0KTsKKwkqcCsrID0gY3B1X3RvX2JlMzIoY291bnQpOworCSpwID0gY3B1X3RvX2JlMzIoY291bnQpOworfQorCitzdGF0aWMgdm9pZCBuZnMyX3hkcl9lbmNfcmVhZGFyZ3Moc3RydWN0IHJwY19ycXN0ICpyZXEsCisJCQkJICBzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAorCQkJCSAgY29uc3Qgc3RydWN0IG5mc19yZWFkYXJncyAqYXJncykKK3sKKwllbmNvZGVfcmVhZGFyZ3MoeGRyLCBhcmdzKTsKKwlwcmVwYXJlX3JlcGx5X2J1ZmZlcihyZXEsIGFyZ3MtPnBhZ2VzLCBhcmdzLT5wZ2Jhc2UsCisJCQkJCWFyZ3MtPmNvdW50LCBORlNfcmVhZHJlc19zeik7CisJcmVxLT5ycV9yY3ZfYnVmLmZsYWdzIHw9IFhEUkJVRl9SRUFEOworfQorCisvKgorICogMi4yLjkuICB3cml0ZWFyZ3MKKyAqCisgKglzdHJ1Y3Qgd3JpdGVhcmdzIHsKKyAqCQlmaGFuZGxlIGZpbGU7CisgKgkJdW5zaWduZWQgYmVnaW5vZmZzZXQ7CisgKgkJdW5zaWduZWQgb2Zmc2V0OworICoJCXVuc2lnbmVkIHRvdGFsY291bnQ7CisgKgkJbmZzZGF0YSBkYXRhOworICoJfTsKKyAqLworc3RhdGljIHZvaWQgZW5jb2RlX3dyaXRlYXJncyhzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAorCQkJICAgICBjb25zdCBzdHJ1Y3QgbmZzX3dyaXRlYXJncyAqYXJncykKK3sKKwl1MzIgb2Zmc2V0ID0gYXJncy0+b2Zmc2V0OworCXUzMiBjb3VudCA9IGFyZ3MtPmNvdW50OworCV9fYmUzMiAqcDsKKworCWVuY29kZV9maGFuZGxlKHhkciwgYXJncy0+ZmgpOworCisJcCA9IHhkcl9yZXNlcnZlX3NwYWNlKHhkciwgNCArIDQgKyA0ICsgNCk7CisJKnArKyA9IGNwdV90b19iZTMyKG9mZnNldCk7CisJKnArKyA9IGNwdV90b19iZTMyKG9mZnNldCk7CisJKnArKyA9IGNwdV90b19iZTMyKGNvdW50KTsKKworCS8qIG5mc2RhdGEgKi8KKwkqcCA9IGNwdV90b19iZTMyKGNvdW50KTsKKwl4ZHJfd3JpdGVfcGFnZXMoeGRyLCBhcmdzLT5wYWdlcywgYXJncy0+cGdiYXNlLCBjb3VudCk7Cit9CisKK3N0YXRpYyB2b2lkIG5mczJfeGRyX2VuY193cml0ZWFyZ3Moc3RydWN0IHJwY19ycXN0ICpyZXEsCisJCQkJICAgc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKKwkJCQkgICBjb25zdCBzdHJ1Y3QgbmZzX3dyaXRlYXJncyAqYXJncykKK3sKKwllbmNvZGVfd3JpdGVhcmdzKHhkciwgYXJncyk7CisJeGRyLT5idWYtPmZsYWdzIHw9IFhEUkJVRl9XUklURTsKK30KKworLyoKKyAqIDIuMi4xMC4gIGNyZWF0ZWFyZ3MKKyAqCisgKglzdHJ1Y3QgY3JlYXRlYXJncyB7CisgKgkJZGlyb3BhcmdzIHdoZXJlOworICoJCXNhdHRyIGF0dHJpYnV0ZXM7CisgKgl9OworICovCitzdGF0aWMgdm9pZCBuZnMyX3hkcl9lbmNfY3JlYXRlYXJncyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwKKwkJCQkgICAgc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKKwkJCQkgICAgY29uc3Qgc3RydWN0IG5mc19jcmVhdGVhcmdzICphcmdzKQoreworCWVuY29kZV9kaXJvcGFyZ3MoeGRyLCBhcmdzLT5maCwgYXJncy0+bmFtZSwgYXJncy0+bGVuKTsKKwllbmNvZGVfc2F0dHIoeGRyLCBhcmdzLT5zYXR0cik7Cit9CisKK3N0YXRpYyB2b2lkIG5mczJfeGRyX2VuY19yZW1vdmVhcmdzKHN0cnVjdCBycGNfcnFzdCAqcmVxLAorCQkJCSAgICBzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAorCQkJCSAgICBjb25zdCBzdHJ1Y3QgbmZzX3JlbW92ZWFyZ3MgKmFyZ3MpCit7CisJZW5jb2RlX2Rpcm9wYXJncyh4ZHIsIGFyZ3MtPmZoLCBhcmdzLT5uYW1lLm5hbWUsIGFyZ3MtPm5hbWUubGVuKTsKK30KKworLyoKKyAqIDIuMi4xMi4gIHJlbmFtZWFyZ3MKKyAqCisgKglzdHJ1Y3QgcmVuYW1lYXJncyB7CisgKgkJZGlyb3BhcmdzIGZyb207CisgKgkJZGlyb3BhcmdzIHRvOworICoJfTsKKyAqLworc3RhdGljIHZvaWQgbmZzMl94ZHJfZW5jX3JlbmFtZWFyZ3Moc3RydWN0IHJwY19ycXN0ICpyZXEsCisJCQkJICAgIHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCisJCQkJICAgIGNvbnN0IHN0cnVjdCBuZnNfcmVuYW1lYXJncyAqYXJncykKK3sKKwljb25zdCBzdHJ1Y3QgcXN0ciAqb2xkID0gYXJncy0+b2xkX25hbWU7CisJY29uc3Qgc3RydWN0IHFzdHIgKm5ldyA9IGFyZ3MtPm5ld19uYW1lOworCisJZW5jb2RlX2Rpcm9wYXJncyh4ZHIsIGFyZ3MtPm9sZF9kaXIsIG9sZC0+bmFtZSwgb2xkLT5sZW4pOworCWVuY29kZV9kaXJvcGFyZ3MoeGRyLCBhcmdzLT5uZXdfZGlyLCBuZXctPm5hbWUsIG5ldy0+bGVuKTsKK30KKworLyoKKyAqIDIuMi4xMy4gIGxpbmthcmdzCisgKgorICoJc3RydWN0IGxpbmthcmdzIHsKKyAqCQlmaGFuZGxlIGZyb207CisgKgkJZGlyb3BhcmdzIHRvOworICoJfTsKKyAqLworc3RhdGljIHZvaWQgbmZzMl94ZHJfZW5jX2xpbmthcmdzKHN0cnVjdCBycGNfcnFzdCAqcmVxLAorCQkJCSAgc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKKwkJCQkgIGNvbnN0IHN0cnVjdCBuZnNfbGlua2FyZ3MgKmFyZ3MpCit7CisJZW5jb2RlX2ZoYW5kbGUoeGRyLCBhcmdzLT5mcm9tZmgpOworCWVuY29kZV9kaXJvcGFyZ3MoeGRyLCBhcmdzLT50b2ZoLCBhcmdzLT50b25hbWUsIGFyZ3MtPnRvbGVuKTsKK30KKworLyoKKyAqIDIuMi4xNC4gIHN5bWxpbmthcmdzCisgKgorICoJc3RydWN0IHN5bWxpbmthcmdzIHsKKyAqCQlkaXJvcGFyZ3MgZnJvbTsKKyAqCQlwYXRoIHRvOworICoJCXNhdHRyIGF0dHJpYnV0ZXM7CisgKgl9OworICovCitzdGF0aWMgdm9pZCBuZnMyX3hkcl9lbmNfc3ltbGlua2FyZ3Moc3RydWN0IHJwY19ycXN0ICpyZXEsCisJCQkJICAgICBzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAorCQkJCSAgICAgY29uc3Qgc3RydWN0IG5mc19zeW1saW5rYXJncyAqYXJncykKK3sKKwllbmNvZGVfZGlyb3BhcmdzKHhkciwgYXJncy0+ZnJvbWZoLCBhcmdzLT5mcm9tbmFtZSwgYXJncy0+ZnJvbWxlbik7CisJZW5jb2RlX3BhdGgoeGRyLCBhcmdzLT5wYWdlcywgYXJncy0+cGF0aGxlbik7CisJZW5jb2RlX3NhdHRyKHhkciwgYXJncy0+c2F0dHIpOworfQorCisvKgorICogMi4yLjE3LiAgcmVhZGRpcmFyZ3MKKyAqCisgKglzdHJ1Y3QgcmVhZGRpcmFyZ3MgeworICoJCWZoYW5kbGUgZGlyOworICoJCW5mc2Nvb2tpZSBjb29raWU7CisgKgkJdW5zaWduZWQgY291bnQ7CisgKgl9OworICovCitzdGF0aWMgdm9pZCBlbmNvZGVfcmVhZGRpcmFyZ3Moc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKKwkJCSAgICAgICBjb25zdCBzdHJ1Y3QgbmZzX3JlYWRkaXJhcmdzICphcmdzKQoreworCV9fYmUzMiAqcDsKKworCWVuY29kZV9maGFuZGxlKHhkciwgYXJncy0+ZmgpOworCisJcCA9IHhkcl9yZXNlcnZlX3NwYWNlKHhkciwgNCArIDQpOworCSpwKysgPSBjcHVfdG9fYmUzMihhcmdzLT5jb29raWUpOworCSpwID0gY3B1X3RvX2JlMzIoYXJncy0+Y291bnQpOworfQorCitzdGF0aWMgdm9pZCBuZnMyX3hkcl9lbmNfcmVhZGRpcmFyZ3Moc3RydWN0IHJwY19ycXN0ICpyZXEsCisJCQkJICAgICBzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAorCQkJCSAgICAgY29uc3Qgc3RydWN0IG5mc19yZWFkZGlyYXJncyAqYXJncykKK3sKKwllbmNvZGVfcmVhZGRpcmFyZ3MoeGRyLCBhcmdzKTsKKwlwcmVwYXJlX3JlcGx5X2J1ZmZlcihyZXEsIGFyZ3MtPnBhZ2VzLCAwLAorCQkJCQlhcmdzLT5jb3VudCwgTkZTX3JlYWRkaXJyZXNfc3opOworfQorCisvKgorICogTkZTdjIgWERSIGRlY29kZSBmdW5jdGlvbnMKKyAqCisgKiBORlN2MiByZXN1bHQgdHlwZXMgYXJlIGRlZmluZWQgaW4gc2VjdGlvbiAyLjIgb2YgUkZDIDEwOTQ6CisgKiAiTkZTOiBOZXR3b3JrIEZpbGUgU3lzdGVtIFByb3RvY29sIFNwZWNpZmljYXRpb24iLgorICovCisKK3N0YXRpYyBpbnQgbmZzMl94ZHJfZGVjX3N0YXQoc3RydWN0IHJwY19ycXN0ICpyZXEsIHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCisJCQkgICAgIHZvaWQgKl9fdW51c2VkKQoreworCWVudW0gbmZzX3N0YXQgc3RhdHVzOworCWludCBlcnJvcjsKKworCWVycm9yID0gZGVjb2RlX3N0YXQoeGRyLCAmc3RhdHVzKTsKKwlpZiAodW5saWtlbHkoZXJyb3IpKQorCQlnb3RvIG91dDsKKwlpZiAoc3RhdHVzICE9IE5GU19PSykKKwkJZ290byBvdXRfZGVmYXVsdDsKK291dDoKKwlyZXR1cm4gZXJyb3I7CitvdXRfZGVmYXVsdDoKKwlyZXR1cm4gbmZzX3N0YXRfdG9fZXJybm8oc3RhdHVzKTsKK30KKworc3RhdGljIGludCBuZnMyX3hkcl9kZWNfYXR0cnN0YXQoc3RydWN0IHJwY19ycXN0ICpyZXEsIHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCisJCQkJIHN0cnVjdCBuZnNfZmF0dHIgKnJlc3VsdCkKK3sKKwlyZXR1cm4gZGVjb2RlX2F0dHJzdGF0KHhkciwgcmVzdWx0KTsKK30KKworc3RhdGljIGludCBuZnMyX3hkcl9kZWNfZGlyb3ByZXMoc3RydWN0IHJwY19ycXN0ICpyZXEsIHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCisJCQkJIHN0cnVjdCBuZnNfZGlyb3BvayAqcmVzdWx0KQoreworCXJldHVybiBkZWNvZGVfZGlyb3ByZXMoeGRyLCByZXN1bHQpOworfQorCisvKgorICogMi4yLjYuICByZWFkbGlua3JlcworICoKKyAqCXVuaW9uIHJlYWRsaW5rcmVzIHN3aXRjaCAoc3RhdCBzdGF0dXMpIHsKKyAqCWNhc2UgTkZTX09LOgorICoJCXBhdGggZGF0YTsKKyAqCWRlZmF1bHQ6CisgKgkJdm9pZDsKKyAqCX07CisgKi8KK3N0YXRpYyBpbnQgbmZzMl94ZHJfZGVjX3JlYWRsaW5rcmVzKHN0cnVjdCBycGNfcnFzdCAqcmVxLAorCQkJCSAgICBzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCB2b2lkICpfX3VudXNlZCkKK3sKKwllbnVtIG5mc19zdGF0IHN0YXR1czsKKwlpbnQgZXJyb3I7CisKKwllcnJvciA9IGRlY29kZV9zdGF0KHhkciwgJnN0YXR1cyk7CisJaWYgKHVubGlrZWx5KGVycm9yKSkKKwkJZ290byBvdXQ7CisJaWYgKHN0YXR1cyAhPSBORlNfT0spCisJCWdvdG8gb3V0X2RlZmF1bHQ7CisJZXJyb3IgPSBkZWNvZGVfcGF0aCh4ZHIpOworb3V0OgorCXJldHVybiBlcnJvcjsKK291dF9kZWZhdWx0OgorCXJldHVybiBuZnNfc3RhdF90b19lcnJubyhzdGF0dXMpOworfQorCisvKgorICogMi4yLjcuICByZWFkcmVzCisgKgorICoJdW5pb24gcmVhZHJlcyBzd2l0Y2ggKHN0YXQgc3RhdHVzKSB7CisgKgljYXNlIE5GU19PSzoKKyAqCQlmYXR0ciBhdHRyaWJ1dGVzOworICoJCW5mc2RhdGEgZGF0YTsKKyAqCWRlZmF1bHQ6CisgKgkJdm9pZDsKKyAqCX07CisgKi8KK3N0YXRpYyBpbnQgbmZzMl94ZHJfZGVjX3JlYWRyZXMoc3RydWN0IHJwY19ycXN0ICpyZXEsIHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCisJCQkJc3RydWN0IG5mc19yZWFkcmVzICpyZXN1bHQpCit7CisJZW51bSBuZnNfc3RhdCBzdGF0dXM7CisJaW50IGVycm9yOworCisJZXJyb3IgPSBkZWNvZGVfc3RhdCh4ZHIsICZzdGF0dXMpOworCWlmICh1bmxpa2VseShlcnJvcikpCisJCWdvdG8gb3V0OworCWlmIChzdGF0dXMgIT0gTkZTX09LKQorCQlnb3RvIG91dF9kZWZhdWx0OworCWVycm9yID0gZGVjb2RlX2ZhdHRyKHhkciwgcmVzdWx0LT5mYXR0cik7CisJaWYgKHVubGlrZWx5KGVycm9yKSkKKwkJZ290byBvdXQ7CisJZXJyb3IgPSBkZWNvZGVfbmZzZGF0YSh4ZHIsIHJlc3VsdCk7CitvdXQ6CisJcmV0dXJuIGVycm9yOworb3V0X2RlZmF1bHQ6CisJcmV0dXJuIG5mc19zdGF0X3RvX2Vycm5vKHN0YXR1cyk7Cit9CisKK3N0YXRpYyBpbnQgbmZzMl94ZHJfZGVjX3dyaXRlcmVzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAorCQkJCSBzdHJ1Y3QgbmZzX3dyaXRlcmVzICpyZXN1bHQpCit7CisJLyogQWxsIE5GU3YyIHdyaXRlcyBhcmUgImZpbGUgc3luYyIgd3JpdGVzICovCisJcmVzdWx0LT52ZXJmLT5jb21taXR0ZWQgPSBORlNfRklMRV9TWU5DOworCXJldHVybiBkZWNvZGVfYXR0cnN0YXQoeGRyLCByZXN1bHQtPmZhdHRyKTsKK30KKworLyoqCisgKiBuZnMyX2RlY29kZV9kaXJlbnQgLSBEZWNvZGUgYSBzaW5nbGUgTkZTdjIgZGlyZWN0b3J5IGVudHJ5IHN0b3JlZCBpbgorICogICAgICAgICAgICAgICAgICAgICAgdGhlIGxvY2FsIHBhZ2UgY2FjaGUuCisgKiBAeGRyOiBYRFIgc3RyZWFtIHdoZXJlIGVudHJ5IHJlc2lkZXMKKyAqIEBlbnRyeTogYnVmZmVyIHRvIGZpbGwgaW4gd2l0aCBlbnRyeSBkYXRhCisgKiBAcGx1czogYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhpcyBzaG91bGQgYmUgYSByZWFkZGlycGx1cyBlbnRyeQorICoKKyAqIFJldHVybnMgemVybyBpZiBzdWNjZXNzZnVsLCBvdGhlcndpc2UgYSBuZWdhdGl2ZSBlcnJubyB2YWx1ZSBpcworICogcmV0dXJuZWQuCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBub3QgaW52b2tlZCBkdXJpbmcgUkVBRERJUiByZXBseSBkZWNvZGluZywgYnV0CisgKiByYXRoZXIgd2hlbmV2ZXIgYW4gYXBwbGljYXRpb24gaW52b2tlcyB0aGUgZ2V0ZGVudHMoMikgc3lzdGVtIGNhbGwKKyAqIG9uIGEgZGlyZWN0b3J5IGFscmVhZHkgaW4gb3VyIGNhY2hlLgorICoKKyAqIDIuMi4xNy4gIGVudHJ5CisgKgorICoJc3RydWN0IGVudHJ5IHsKKyAqCQl1bnNpZ25lZAlmaWxlaWQ7CisgKgkJZmlsZW5hbWUJbmFtZTsKKyAqCQluZnNjb29raWUJY29va2llOworICoJCWVudHJ5CQkqbmV4dGVudHJ5OworICoJfTsKKyAqLworaW50IG5mczJfZGVjb2RlX2RpcmVudChzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBzdHJ1Y3QgbmZzX2VudHJ5ICplbnRyeSwKKwkJICAgICAgIGludCBwbHVzKQoreworCV9fYmUzMiAqcDsKKwlpbnQgZXJyb3I7CisKKwlwID0geGRyX2lubGluZV9kZWNvZGUoeGRyLCA0KTsKKwlpZiAodW5saWtlbHkocCA9PSBOVUxMKSkKKwkJZ290byBvdXRfb3ZlcmZsb3c7CisJaWYgKCpwKysgPT0geGRyX3plcm8pIHsKKwkJcCA9IHhkcl9pbmxpbmVfZGVjb2RlKHhkciwgNCk7CisJCWlmICh1bmxpa2VseShwID09IE5VTEwpKQorCQkJZ290byBvdXRfb3ZlcmZsb3c7CisJCWlmICgqcCsrID09IHhkcl96ZXJvKQorCQkJcmV0dXJuIC1FQUdBSU47CisJCWVudHJ5LT5lb2YgPSAxOworCQlyZXR1cm4gLUVCQURDT09LSUU7CisJfQorCisJcCA9IHhkcl9pbmxpbmVfZGVjb2RlKHhkciwgNCk7CisJaWYgKHVubGlrZWx5KHAgPT0gTlVMTCkpCisJCWdvdG8gb3V0X292ZXJmbG93OworCWVudHJ5LT5pbm8gPSBiZTMyX3RvX2NwdXAocCk7CisKKwllcnJvciA9IGRlY29kZV9maWxlbmFtZV9pbmxpbmUoeGRyLCAmZW50cnktPm5hbWUsICZlbnRyeS0+bGVuKTsKKwlpZiAodW5saWtlbHkoZXJyb3IpKQorCQlyZXR1cm4gZXJyb3I7CisKKwkvKgorCSAqIFRoZSB0eXBlIChzaXplIGFuZCBieXRlIG9yZGVyKSBvZiBuZnNjb29raWUgaXNuJ3QgZGVmaW5lZCBpbgorCSAqIFJGQyAxMDk0LiAgVGhpcyBpbXBsZW1lbnRhdGlvbiBhc3N1bWVzIHRoYXQgaXQncyBhbiBYRFIgdWludDMyLgorCSAqLworCWVudHJ5LT5wcmV2X2Nvb2tpZSA9IGVudHJ5LT5jb29raWU7CisJcCA9IHhkcl9pbmxpbmVfZGVjb2RlKHhkciwgNCk7CisJaWYgKHVubGlrZWx5KHAgPT0gTlVMTCkpCisJCWdvdG8gb3V0X292ZXJmbG93OworCWVudHJ5LT5jb29raWUgPSBiZTMyX3RvX2NwdXAocCk7CiAKIAllbnRyeS0+ZF90eXBlID0gRFRfVU5LTk9XTjsKIAotCXAgPSB4ZHJfaW5saW5lX3BlZWsoeGRyLCA4KTsKLQlpZiAocCAhPSBOVUxMKQotCQllbnRyeS0+ZW9mID0gIXBbMF0gJiYgcFsxXTsKLQllbHNlCi0JCWVudHJ5LT5lb2YgPSAwOwotCi0JcmV0dXJuIHA7CisJcmV0dXJuIDA7CiAKIG91dF9vdmVyZmxvdzoKIAlwcmludF9vdmVyZmxvd19tc2coX19mdW5jX18sIHhkcik7Ci0JcmV0dXJuIEVSUl9QVFIoLUVBR0FJTik7CisJcmV0dXJuIC1FQUdBSU47CiB9CiAKIC8qCi0gKiBORlMgWERSIGRlY29kZSBmdW5jdGlvbnMKKyAqIDIuMi4xNy4gIHJlYWRkaXJyZXMKKyAqCisgKgl1bmlvbiByZWFkZGlycmVzIHN3aXRjaCAoc3RhdCBzdGF0dXMpIHsKKyAqCWNhc2UgTkZTX09LOgorICoJCXN0cnVjdCB7CisgKgkJCWVudHJ5ICplbnRyaWVzOworICoJCQlib29sIGVvZjsKKyAqCQl9IHJlYWRkaXJvazsKKyAqCWRlZmF1bHQ6CisgKgkJdm9pZDsKKyAqCX07CisgKgorICogUmVhZCB0aGUgZGlyZWN0b3J5IGNvbnRlbnRzIGludG8gdGhlIHBhZ2UgY2FjaGUsIGJ1dCBkb24ndAorICogdG91Y2ggdGhlbS4gIFRoZSBhY3R1YWwgZGVjb2RpbmcgaXMgZG9uZSBieSBuZnMyX2RlY29kZV9kaXJlbnQoKQorICogZHVyaW5nIHN1YnNlcXVlbnQgbmZzX3JlYWRkaXIoKSBjYWxscy4KICAqLwotLyoKLSAqIERlY29kZSBzaW1wbGUgc3RhdHVzIHJlcGx5Ci0gKi8KLXN0YXRpYyBpbnQKLW5mc194ZHJfc3RhdChzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLCB2b2lkICpkdW1teSkKK3N0YXRpYyBpbnQgZGVjb2RlX3JlYWRkaXJvayhzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyKQogewotCWludAlzdGF0dXM7Ci0KLQlpZiAoKHN0YXR1cyA9IG50b2hsKCpwKyspKSAhPSAwKQotCQlzdGF0dXMgPSBuZnNfc3RhdF90b19lcnJubyhzdGF0dXMpOwotCXJldHVybiBzdGF0dXM7Ci19Ci0KLS8qCi0gKiBEZWNvZGUgYXR0cnN0YXQgcmVwbHkKLSAqIEdFVEFUVFIsIFNFVEFUVFIsIFdSSVRFCi0gKi8KLXN0YXRpYyBpbnQKLW5mc194ZHJfYXR0cnN0YXQoc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgc3RydWN0IG5mc19mYXR0ciAqZmF0dHIpCi17Ci0JaW50CXN0YXR1czsKLQotCWlmICgoc3RhdHVzID0gbnRvaGwoKnArKykpKQotCQlyZXR1cm4gbmZzX3N0YXRfdG9fZXJybm8oc3RhdHVzKTsKLQl4ZHJfZGVjb2RlX2ZhdHRyKHAsIGZhdHRyKTsKLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIERlY29kZSBkaXJvcHJlcyByZXBseQotICogTE9PS1VQLCBDUkVBVEUsIE1LRElSCi0gKi8KLXN0YXRpYyBpbnQKLW5mc194ZHJfZGlyb3ByZXMoc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgc3RydWN0IG5mc19kaXJvcG9rICpyZXMpCi17Ci0JaW50CXN0YXR1czsKLQotCWlmICgoc3RhdHVzID0gbnRvaGwoKnArKykpKQotCQlyZXR1cm4gbmZzX3N0YXRfdG9fZXJybm8oc3RhdHVzKTsKLQlwID0geGRyX2RlY29kZV9maGFuZGxlKHAsIHJlcy0+ZmgpOwotCXhkcl9kZWNvZGVfZmF0dHIocCwgcmVzLT5mYXR0cik7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBFbmNvZGUgUkVBRExJTksgYXJncwotICovCi1zdGF0aWMgaW50Ci1uZnNfeGRyX3JlYWRsaW5rYXJncyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLCBzdHJ1Y3QgbmZzX3JlYWRsaW5rYXJncyAqYXJncykKLXsKLQlzdHJ1Y3QgcnBjX2F1dGgJKmF1dGggPSByZXEtPnJxX2NyZWQtPmNyX2F1dGg7Ci0JdW5zaWduZWQgaW50IHJlcGxlbjsKLQotCXAgPSB4ZHJfZW5jb2RlX2ZoYW5kbGUocCwgYXJncy0+ZmgpOwotCXJlcS0+cnFfc2xlbiA9IHhkcl9hZGp1c3RfaW92ZWMocmVxLT5ycV9zdmVjLCBwKTsKLQotCS8qIElubGluZSB0aGUgcGFnZSBhcnJheSAqLwotCXJlcGxlbiA9IChSUENfUkVQSERSU0laRSArIGF1dGgtPmF1X3JzbGFjayArIE5GU19yZWFkbGlua3Jlc19zeikgPDwgMjsKLQl4ZHJfaW5saW5lX3BhZ2VzKCZyZXEtPnJxX3Jjdl9idWYsIHJlcGxlbiwgYXJncy0+cGFnZXMsIGFyZ3MtPnBnYmFzZSwgYXJncy0+cGdsZW4pOwotCXJldHVybiAwOwotfQotCi0vKgotICogRGVjb2RlIFJFQURMSU5LIHJlcGx5Ci0gKi8KLXN0YXRpYyBpbnQKLW5mc194ZHJfcmVhZGxpbmtyZXMoc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgdm9pZCAqZHVtbXkpCi17Ci0Jc3RydWN0IHhkcl9idWYgKnJjdmJ1ZiA9ICZyZXEtPnJxX3Jjdl9idWY7Ci0Jc3RydWN0IGt2ZWMgKmlvdiA9IHJjdmJ1Zi0+aGVhZDsKKwl1MzIgcmVjdmQsIHBnbGVuOwogCXNpemVfdCBoZHJsZW47Ci0JdTMyIGxlbiwgcmVjdmQ7Ci0JaW50CXN0YXR1czsKIAotCWlmICgoc3RhdHVzID0gbnRvaGwoKnArKykpKQotCQlyZXR1cm4gbmZzX3N0YXRfdG9fZXJybm8oc3RhdHVzKTsKLQkvKiBDb252ZXJ0IGxlbmd0aCBvZiBzeW1saW5rICovCi0JbGVuID0gbnRvaGwoKnArKyk7Ci0JaWYgKGxlbiA+PSByY3ZidWYtPnBhZ2VfbGVuKSB7Ci0JCWRwcmludGsoIm5mczogc2VydmVyIHJldHVybmVkIGdpYW50IHN5bWxpbmshXG4iKTsKLQkJcmV0dXJuIC1FTkFNRVRPT0xPTkc7Ci0JfQotCWhkcmxlbiA9ICh1OCAqKSBwIC0gKHU4ICopIGlvdi0+aW92X2Jhc2U7Ci0JaWYgKGlvdi0+aW92X2xlbiA8IGhkcmxlbikgewotCQlkcHJpbnRrKCJORlM6IFJFQURMSU5LIHJlcGx5IGhlYWRlciBvdmVyZmxvd2VkOiIKLQkJCQkibGVuZ3RoICVadSA+ICVadVxuIiwgaGRybGVuLCBpb3YtPmlvdl9sZW4pOwotCQlyZXR1cm4gLWVycm5vX05GU0VSUl9JTzsKLQl9IGVsc2UgaWYgKGlvdi0+aW92X2xlbiAhPSBoZHJsZW4pIHsKLQkJZHByaW50aygiTkZTOiBSRUFETElOSyBoZWFkZXIgaXMgc2hvcnQuIGlvdmVjIHdpbGwgYmUgc2hpZnRlZC5cbiIpOwotCQl4ZHJfc2hpZnRfYnVmKHJjdmJ1ZiwgaW92LT5pb3ZfbGVuIC0gaGRybGVuKTsKLQl9Ci0JcmVjdmQgPSByZXEtPnJxX3Jjdl9idWYubGVuIC0gaGRybGVuOwotCWlmIChyZWN2ZCA8IGxlbikgewotCQlkcHJpbnRrKCJORlM6IHNlcnZlciBjaGVhdGluZyBpbiByZWFkbGluayByZXBseTogIgotCQkJCSJjb3VudCAldSA+IHJlY3ZkICV1XG4iLCBsZW4sIHJlY3ZkKTsKLQkJcmV0dXJuIC1FSU87Ci0JfQorCXBnbGVuID0geGRyLT5idWYtPnBhZ2VfbGVuOworCWhkcmxlbiA9ICh1OCAqKXhkci0+cCAtICh1OCAqKXhkci0+aW92LT5pb3ZfYmFzZTsKKwlyZWN2ZCA9IHhkci0+YnVmLT5sZW4gLSBoZHJsZW47CisJaWYgKHVubGlrZWx5KHBnbGVuID4gcmVjdmQpKQorCQlnb3RvIG91dF9jaGVhdGluZzsKK291dDoKKwl4ZHJfcmVhZF9wYWdlcyh4ZHIsIHBnbGVuKTsKKwlyZXR1cm4gcGdsZW47CitvdXRfY2hlYXRpbmc6CisJZHByaW50aygiTkZTOiBzZXJ2ZXIgY2hlYXRpbmcgaW4gcmVhZGRpciByZXN1bHQ6ICIKKwkJInBnbGVuICV1ID4gcmVjdmQgJXVcbiIsIHBnbGVuLCByZWN2ZCk7CisJcGdsZW4gPSByZWN2ZDsKKwlnb3RvIG91dDsKK30KIAotCXhkcl90ZXJtaW5hdGVfc3RyaW5nKHJjdmJ1ZiwgbGVuKTsKLQlyZXR1cm4gMDsKK3N0YXRpYyBpbnQgbmZzMl94ZHJfZGVjX3JlYWRkaXJyZXMoc3RydWN0IHJwY19ycXN0ICpyZXEsCisJCQkJICAgc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgdm9pZCAqX191bnVzZWQpCit7CisJZW51bSBuZnNfc3RhdCBzdGF0dXM7CisJaW50IGVycm9yOworCisJZXJyb3IgPSBkZWNvZGVfc3RhdCh4ZHIsICZzdGF0dXMpOworCWlmICh1bmxpa2VseShlcnJvcikpCisJCWdvdG8gb3V0OworCWlmIChzdGF0dXMgIT0gTkZTX09LKQorCQlnb3RvIG91dF9kZWZhdWx0OworCWVycm9yID0gZGVjb2RlX3JlYWRkaXJvayh4ZHIpOworb3V0OgorCXJldHVybiBlcnJvcjsKK291dF9kZWZhdWx0OgorCXJldHVybiBuZnNfc3RhdF90b19lcnJubyhzdGF0dXMpOwogfQogCiAvKgotICogRGVjb2RlIFdSSVRFIHJlcGx5CisgKiAyLjIuMTguICBzdGF0ZnNyZXMKKyAqCisgKgl1bmlvbiBzdGF0ZnNyZXMgKHN0YXQgc3RhdHVzKSB7CisgKgljYXNlIE5GU19PSzoKKyAqCQlzdHJ1Y3QgeworICoJCQl1bnNpZ25lZCB0c2l6ZTsKKyAqCQkJdW5zaWduZWQgYnNpemU7CisgKgkJCXVuc2lnbmVkIGJsb2NrczsKKyAqCQkJdW5zaWduZWQgYmZyZWU7CisgKgkJCXVuc2lnbmVkIGJhdmFpbDsKKyAqCQl9IGluZm87CisgKglkZWZhdWx0OgorICoJCXZvaWQ7CisgKgl9OwogICovCi1zdGF0aWMgaW50Ci1uZnNfeGRyX3dyaXRlcmVzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsIHN0cnVjdCBuZnNfd3JpdGVyZXMgKnJlcykKK3N0YXRpYyBpbnQgZGVjb2RlX2luZm8oc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgc3RydWN0IG5mczJfZnNzdGF0ICpyZXN1bHQpCiB7Ci0JcmVzLT52ZXJmLT5jb21taXR0ZWQgPSBORlNfRklMRV9TWU5DOwotCXJldHVybiBuZnNfeGRyX2F0dHJzdGF0KHJlcSwgcCwgcmVzLT5mYXR0cik7Ci19CisJX19iZTMyICpwOwogCi0vKgotICogRGVjb2RlIFNUQVRGUyByZXBseQotICovCi1zdGF0aWMgaW50Ci1uZnNfeGRyX3N0YXRmc3JlcyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLCBzdHJ1Y3QgbmZzMl9mc3N0YXQgKnJlcykKLXsKLQlpbnQJc3RhdHVzOwotCi0JaWYgKChzdGF0dXMgPSBudG9obCgqcCsrKSkpCi0JCXJldHVybiBuZnNfc3RhdF90b19lcnJubyhzdGF0dXMpOwotCi0JcmVzLT50c2l6ZSAgPSBudG9obCgqcCsrKTsKLQlyZXMtPmJzaXplICA9IG50b2hsKCpwKyspOwotCXJlcy0+YmxvY2tzID0gbnRvaGwoKnArKyk7Ci0JcmVzLT5iZnJlZSAgPSBudG9obCgqcCsrKTsKLQlyZXMtPmJhdmFpbCA9IG50b2hsKCpwKyspOworCXAgPSB4ZHJfaW5saW5lX2RlY29kZSh4ZHIsIE5GU19pbmZvX3N6IDw8IDIpOworCWlmICh1bmxpa2VseShwID09IE5VTEwpKQorCQlnb3RvIG91dF9vdmVyZmxvdzsKKwlyZXN1bHQtPnRzaXplICA9IGJlMzJfdG9fY3B1cChwKyspOworCXJlc3VsdC0+YnNpemUgID0gYmUzMl90b19jcHVwKHArKyk7CisJcmVzdWx0LT5ibG9ja3MgPSBiZTMyX3RvX2NwdXAocCsrKTsKKwlyZXN1bHQtPmJmcmVlICA9IGJlMzJfdG9fY3B1cChwKyspOworCXJlc3VsdC0+YmF2YWlsID0gYmUzMl90b19jcHVwKHApOwogCXJldHVybiAwOworb3V0X292ZXJmbG93OgorCXByaW50X292ZXJmbG93X21zZyhfX2Z1bmNfXywgeGRyKTsKKwlyZXR1cm4gLUVJTzsKIH0KIAorc3RhdGljIGludCBuZnMyX3hkcl9kZWNfc3RhdGZzcmVzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAorCQkJCSAgc3RydWN0IG5mczJfZnNzdGF0ICpyZXN1bHQpCit7CisJZW51bSBuZnNfc3RhdCBzdGF0dXM7CisJaW50IGVycm9yOworCisJZXJyb3IgPSBkZWNvZGVfc3RhdCh4ZHIsICZzdGF0dXMpOworCWlmICh1bmxpa2VseShlcnJvcikpCisJCWdvdG8gb3V0OworCWlmIChzdGF0dXMgIT0gTkZTX09LKQorCQlnb3RvIG91dF9kZWZhdWx0OworCWVycm9yID0gZGVjb2RlX2luZm8oeGRyLCByZXN1bHQpOworb3V0OgorCXJldHVybiBlcnJvcjsKK291dF9kZWZhdWx0OgorCXJldHVybiBuZnNfc3RhdF90b19lcnJubyhzdGF0dXMpOworfQorCisKIC8qCiAgKiBXZSBuZWVkIHRvIHRyYW5zbGF0ZSBiZXR3ZWVuIG5mcyBzdGF0dXMgcmV0dXJuIHZhbHVlcyBhbmQKICAqIHRoZSBsb2NhbCBlcnJubyB2YWx1ZXMgd2hpY2ggbWF5IG5vdCBiZSB0aGUgc2FtZS4KICAqLwotc3RhdGljIHN0cnVjdCB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHsKIAlpbnQgc3RhdDsKIAlpbnQgZXJybm87CiB9IG5mc19lcnJ0YmxbXSA9IHsKQEAgLTY3OCwyOCArMTEwMiwzMCBAQAogCXsgLTEsCQkJLUVJTwkJfQogfTsKIAotLyoKLSAqIENvbnZlcnQgYW4gTkZTIGVycm9yIGNvZGUgdG8gYSBsb2NhbCBvbmUuCi0gKiBUaGlzIG9uZSBpcyB1c2VkIGpvaW50bHkgYnkgTkZTdjIgYW5kIE5GU3YzLgorLyoqCisgKiBuZnNfc3RhdF90b19lcnJubyAtIGNvbnZlcnQgYW4gTkZTIHN0YXR1cyBjb2RlIHRvIGEgbG9jYWwgZXJybm8KKyAqIEBzdGF0dXM6IE5GUyBzdGF0dXMgY29kZSB0byBjb252ZXJ0CisgKgorICogUmV0dXJucyBhIGxvY2FsIGVycm5vIHZhbHVlLCBvciAtRUlPIGlmIHRoZSBORlMgc3RhdHVzIGNvZGUgaXMKKyAqIG5vdCByZWNvZ25pemVkLiAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGpvaW50bHkgYnkgTkZTdjIgYW5kIE5GU3YzLgogICovCi1pbnQKLW5mc19zdGF0X3RvX2Vycm5vKGludCBzdGF0KQoraW50IG5mc19zdGF0X3RvX2Vycm5vKGVudW0gbmZzX3N0YXQgc3RhdHVzKQogewogCWludCBpOwogCiAJZm9yIChpID0gMDsgbmZzX2VycnRibFtpXS5zdGF0ICE9IC0xOyBpKyspIHsKLQkJaWYgKG5mc19lcnJ0YmxbaV0uc3RhdCA9PSBzdGF0KQorCQlpZiAobmZzX2VycnRibFtpXS5zdGF0ID09IChpbnQpc3RhdHVzKQogCQkJcmV0dXJuIG5mc19lcnJ0YmxbaV0uZXJybm87CiAJfQotCWRwcmludGsoIm5mc19zdGF0X3RvX2Vycm5vOiBiYWQgbmZzIHN0YXR1cyByZXR1cm4gdmFsdWU6ICVkXG4iLCBzdGF0KTsKKwlkcHJpbnRrKCJORlM6IFVucmVjb2duaXplZCBuZnMgc3RhdHVzIHZhbHVlOiAldVxuIiwgc3RhdHVzKTsKIAlyZXR1cm4gbmZzX2VycnRibFtpXS5lcnJubzsKIH0KIAogI2RlZmluZSBQUk9DKHByb2MsIGFyZ3R5cGUsIHJlc3R5cGUsIHRpbWVyKQkJCQlcCiBbTkZTUFJPQ18jI3Byb2NdID0gewkJCQkJCQlcCiAJLnBfcHJvYwkgICAgPSAgTkZTUFJPQ18jI3Byb2MsCQkJCQlcCi0JLnBfZW5jb2RlICAgPSAgKGt4ZHJwcm9jX3QpIG5mc194ZHJfIyNhcmd0eXBlLAkJCVwKLQkucF9kZWNvZGUgICA9ICAoa3hkcnByb2NfdCkgbmZzX3hkcl8jI3Jlc3R5cGUsCQkJXAorCS5wX2VuY29kZSAgID0gIChreGRyZXByb2NfdCluZnMyX3hkcl9lbmNfIyNhcmd0eXBlLAkJXAorCS5wX2RlY29kZSAgID0gIChreGRyZHByb2NfdCluZnMyX3hkcl9kZWNfIyNyZXN0eXBlLAkJXAogCS5wX2FyZ2xlbiAgID0gIE5GU18jI2FyZ3R5cGUjI19zeiwJCQkJXAogCS5wX3JlcGxlbiAgID0gIE5GU18jI3Jlc3R5cGUjI19zeiwJCQkJXAogCS5wX3RpbWVyICAgID0gIHRpbWVyLAkJCQkJCVwKQEAgLTcwNywyMSArMTEzMywyMSBAQAogCS5wX25hbWUgICAgID0gICNwcm9jLAkJCQkJCVwKIAl9CiBzdHJ1Y3QgcnBjX3Byb2NpbmZvCW5mc19wcm9jZWR1cmVzW10gPSB7Ci0gICAgUFJPQyhHRVRBVFRSLAlmaGFuZGxlLAlhdHRyc3RhdCwgMSksCi0gICAgUFJPQyhTRVRBVFRSLAlzYXR0cmFyZ3MsCWF0dHJzdGF0LCAwKSwKLSAgICBQUk9DKExPT0tVUCwJZGlyb3BhcmdzLAlkaXJvcHJlcywgMiksCi0gICAgUFJPQyhSRUFETElOSywJcmVhZGxpbmthcmdzLAlyZWFkbGlua3JlcywgMyksCi0gICAgUFJPQyhSRUFELAkJcmVhZGFyZ3MsCXJlYWRyZXMsIDMpLAotICAgIFBST0MoV1JJVEUsCQl3cml0ZWFyZ3MsCXdyaXRlcmVzLCA0KSwKLSAgICBQUk9DKENSRUFURSwJY3JlYXRlYXJncywJZGlyb3ByZXMsIDApLAotICAgIFBST0MoUkVNT1ZFLAlyZW1vdmVhcmdzLAlzdGF0LCAwKSwKLSAgICBQUk9DKFJFTkFNRSwJcmVuYW1lYXJncywJc3RhdCwgMCksCi0gICAgUFJPQyhMSU5LLAkJbGlua2FyZ3MsCXN0YXQsIDApLAotICAgIFBST0MoU1lNTElOSywJc3ltbGlua2FyZ3MsCXN0YXQsIDApLAotICAgIFBST0MoTUtESVIsCQljcmVhdGVhcmdzLAlkaXJvcHJlcywgMCksCi0gICAgUFJPQyhSTURJUiwJCWRpcm9wYXJncywJc3RhdCwgMCksCi0gICAgUFJPQyhSRUFERElSLAlyZWFkZGlyYXJncywJcmVhZGRpcnJlcywgMyksCi0gICAgUFJPQyhTVEFURlMsCWZoYW5kbGUsCXN0YXRmc3JlcywgMCksCisJUFJPQyhHRVRBVFRSLAlmaGFuZGxlLAlhdHRyc3RhdCwJMSksCisJUFJPQyhTRVRBVFRSLAlzYXR0cmFyZ3MsCWF0dHJzdGF0LAkwKSwKKwlQUk9DKExPT0tVUCwJZGlyb3BhcmdzLAlkaXJvcHJlcywJMiksCisJUFJPQyhSRUFETElOSywJcmVhZGxpbmthcmdzLAlyZWFkbGlua3JlcywJMyksCisJUFJPQyhSRUFELAlyZWFkYXJncywJcmVhZHJlcywJMyksCisJUFJPQyhXUklURSwJd3JpdGVhcmdzLAl3cml0ZXJlcywJNCksCisJUFJPQyhDUkVBVEUsCWNyZWF0ZWFyZ3MsCWRpcm9wcmVzLAkwKSwKKwlQUk9DKFJFTU9WRSwJcmVtb3ZlYXJncywJc3RhdCwJCTApLAorCVBST0MoUkVOQU1FLAlyZW5hbWVhcmdzLAlzdGF0LAkJMCksCisJUFJPQyhMSU5LLAlsaW5rYXJncywJc3RhdCwJCTApLAorCVBST0MoU1lNTElOSywJc3ltbGlua2FyZ3MsCXN0YXQsCQkwKSwKKwlQUk9DKE1LRElSLAljcmVhdGVhcmdzLAlkaXJvcHJlcywJMCksCisJUFJPQyhSTURJUiwJZGlyb3BhcmdzLAlzdGF0LAkJMCksCisJUFJPQyhSRUFERElSLAlyZWFkZGlyYXJncywJcmVhZGRpcnJlcywJMyksCisJUFJPQyhTVEFURlMsCWZoYW5kbGUsCXN0YXRmc3JlcywJMCksCiB9OwogCiBzdHJ1Y3QgcnBjX3ZlcnNpb24JCW5mc192ZXJzaW9uMiA9IHsKZGlmZiAtLWdpdCBhL2ZzL25mcy9uZnMzeGRyLmMgYi9mcy9uZnMvbmZzM3hkci5jCmluZGV4IGY2Y2M2MGYuLjAxYzVlOGIgMTAwNjQ0Ci0tLSBhL2ZzL25mcy9uZnMzeGRyLmMKKysrIGIvZnMvbmZzL25mczN4ZHIuYwpAQCAtMzcsMTggKzM3LDE2IEBACiAjZGVmaW5lIE5GUzNfZmlsZW5hbWVfc3oJKDErKE5GUzNfTUFYTkFNTEVOPj4yKSkKICNkZWZpbmUgTkZTM19wYXRoX3N6CQkoMSsoTkZTM19NQVhQQVRITEVOPj4yKSkKICNkZWZpbmUgTkZTM19mYXR0cl9zegkJKDIxKQotI2RlZmluZSBORlMzX3djY19hdHRyX3N6CQkoNikKKyNkZWZpbmUgTkZTM19jb29raWV2ZXJmX3N6CShORlMzX0NPT0tJRVZFUkZTSVpFPj4yKQorI2RlZmluZSBORlMzX3djY19hdHRyX3N6CSg2KQogI2RlZmluZSBORlMzX3ByZV9vcF9hdHRyX3N6CSgxK05GUzNfd2NjX2F0dHJfc3opCiAjZGVmaW5lIE5GUzNfcG9zdF9vcF9hdHRyX3N6CSgxK05GUzNfZmF0dHJfc3opCi0jZGVmaW5lIE5GUzNfd2NjX2RhdGFfc3oJCShORlMzX3ByZV9vcF9hdHRyX3N6K05GUzNfcG9zdF9vcF9hdHRyX3N6KQotI2RlZmluZSBORlMzX2Zzc3RhdF9zegkJCi0jZGVmaW5lIE5GUzNfZnNpbmZvX3N6CQkKLSNkZWZpbmUgTkZTM19wYXRoY29uZl9zegkJCi0jZGVmaW5lIE5GUzNfZW50cnlfc3oJCShORlMzX2ZpbGVuYW1lX3N6KzMpCi0KLSNkZWZpbmUgTkZTM19zYXR0cmFyZ3Nfc3oJKE5GUzNfZmhfc3orTkZTM19zYXR0cl9zeiszKQorI2RlZmluZSBORlMzX3djY19kYXRhX3N6CShORlMzX3ByZV9vcF9hdHRyX3N6K05GUzNfcG9zdF9vcF9hdHRyX3N6KQogI2RlZmluZSBORlMzX2Rpcm9wYXJnc19zegkoTkZTM19maF9zeitORlMzX2ZpbGVuYW1lX3N6KQotI2RlZmluZSBORlMzX3JlbW92ZWFyZ3Nfc3oJKE5GUzNfZmhfc3orTkZTM19maWxlbmFtZV9zeikKKworI2RlZmluZSBORlMzX2dldGF0dHJhcmdzX3N6CShORlMzX2ZoX3N6KQorI2RlZmluZSBORlMzX3NldGF0dHJhcmdzX3N6CShORlMzX2ZoX3N6K05GUzNfc2F0dHJfc3orMykKKyNkZWZpbmUgTkZTM19sb29rdXBhcmdzX3N6CShORlMzX2ZoX3N6K05GUzNfZmlsZW5hbWVfc3opCiAjZGVmaW5lIE5GUzNfYWNjZXNzYXJnc19zegkoTkZTM19maF9zeisxKQogI2RlZmluZSBORlMzX3JlYWRsaW5rYXJnc19zegkoTkZTM19maF9zeikKICNkZWZpbmUgTkZTM19yZWFkYXJnc19zegkoTkZTM19maF9zeiszKQpAQCAtNTcsMTQgKzU1LDE2IEBACiAjZGVmaW5lIE5GUzNfbWtkaXJhcmdzX3N6CShORlMzX2Rpcm9wYXJnc19zeitORlMzX3NhdHRyX3N6KQogI2RlZmluZSBORlMzX3N5bWxpbmthcmdzX3N6CShORlMzX2Rpcm9wYXJnc19zeisxK05GUzNfc2F0dHJfc3opCiAjZGVmaW5lIE5GUzNfbWtub2RhcmdzX3N6CShORlMzX2Rpcm9wYXJnc19zeisyK05GUzNfc2F0dHJfc3opCisjZGVmaW5lIE5GUzNfcmVtb3ZlYXJnc19zegkoTkZTM19maF9zeitORlMzX2ZpbGVuYW1lX3N6KQogI2RlZmluZSBORlMzX3JlbmFtZWFyZ3Nfc3oJKE5GUzNfZGlyb3BhcmdzX3N6K05GUzNfZGlyb3BhcmdzX3N6KQogI2RlZmluZSBORlMzX2xpbmthcmdzX3N6CQkoTkZTM19maF9zeitORlMzX2Rpcm9wYXJnc19zeikKLSNkZWZpbmUgTkZTM19yZWFkZGlyYXJnc19zegkoTkZTM19maF9zeisyKQorI2RlZmluZSBORlMzX3JlYWRkaXJhcmdzX3N6CShORlMzX2ZoX3N6K05GUzNfY29va2lldmVyZl9zeiszKQorI2RlZmluZSBORlMzX3JlYWRkaXJwbHVzYXJnc19zegkoTkZTM19maF9zeitORlMzX2Nvb2tpZXZlcmZfc3orNCkKICNkZWZpbmUgTkZTM19jb21taXRhcmdzX3N6CShORlMzX2ZoX3N6KzMpCiAKLSNkZWZpbmUgTkZTM19hdHRyc3RhdF9zegkoMStORlMzX2ZhdHRyX3N6KQotI2RlZmluZSBORlMzX3djY3N0YXRfc3oJCSgxK05GUzNfd2NjX2RhdGFfc3opCi0jZGVmaW5lIE5GUzNfcmVtb3ZlcmVzX3N6CShORlMzX3djY3N0YXRfc3opCisjZGVmaW5lIE5GUzNfZ2V0YXR0cnJlc19zegkoMStORlMzX2ZhdHRyX3N6KQorI2RlZmluZSBORlMzX3NldGF0dHJyZXNfc3oJKDErTkZTM193Y2NfZGF0YV9zeikKKyNkZWZpbmUgTkZTM19yZW1vdmVyZXNfc3oJKE5GUzNfc2V0YXR0cnJlc19zeikKICNkZWZpbmUgTkZTM19sb29rdXByZXNfc3oJKDErTkZTM19maF9zeisoMiAqIE5GUzNfcG9zdF9vcF9hdHRyX3N6KSkKICNkZWZpbmUgTkZTM19hY2Nlc3NyZXNfc3oJKDErTkZTM19wb3N0X29wX2F0dHJfc3orMSkKICNkZWZpbmUgTkZTM19yZWFkbGlua3Jlc19zegkoMStORlMzX3Bvc3Rfb3BfYXR0cl9zeisxKQpAQCAtMTAwLDEwNzkgKzEwMCwyMzYyIEBACiAJW05GM0ZJRk9dID0gU19JRklGTywKIH07CiAKKy8qCisgKiBXaGlsZSBlbmNvZGluZyBhcmd1bWVudHMsIHNldCB1cCB0aGUgcmVwbHkgYnVmZmVyIGluIGFkdmFuY2UgdG8KKyAqIHJlY2VpdmUgcmVwbHkgZGF0YSBkaXJlY3RseSBpbnRvIHRoZSBwYWdlIGNhY2hlLgorICovCitzdGF0aWMgdm9pZCBwcmVwYXJlX3JlcGx5X2J1ZmZlcihzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgc3RydWN0IHBhZ2UgKipwYWdlcywKKwkJCQkgdW5zaWduZWQgaW50IGJhc2UsIHVuc2lnbmVkIGludCBsZW4sCisJCQkJIHVuc2lnbmVkIGludCBidWZzaXplKQoreworCXN0cnVjdCBycGNfYXV0aAkqYXV0aCA9IHJlcS0+cnFfY3JlZC0+Y3JfYXV0aDsKKwl1bnNpZ25lZCBpbnQgcmVwbGVuOworCisJcmVwbGVuID0gUlBDX1JFUEhEUlNJWkUgKyBhdXRoLT5hdV9yc2xhY2sgKyBidWZzaXplOworCXhkcl9pbmxpbmVfcGFnZXMoJnJlcS0+cnFfcmN2X2J1ZiwgcmVwbGVuIDw8IDIsIHBhZ2VzLCBiYXNlLCBsZW4pOworfQorCisvKgorICogSGFuZGxlIGRlY29kZSBidWZmZXIgb3ZlcmZsb3dzIG91dC1vZi1saW5lLgorICovCiBzdGF0aWMgdm9pZCBwcmludF9vdmVyZmxvd19tc2coY29uc3QgY2hhciAqZnVuYywgY29uc3Qgc3RydWN0IHhkcl9zdHJlYW0gKnhkcikKIHsKLQlkcHJpbnRrKCJuZnM6ICVzOiBwcmVtYXR1cmVseSBoaXQgZW5kIG9mIHJlY2VpdmUgYnVmZmVyLiAiCisJZHByaW50aygiTkZTOiAlcyBwcmVtYXR1cmVseSBoaXQgdGhlIGVuZCBvZiBvdXIgcmVjZWl2ZSBidWZmZXIuICIKIAkJIlJlbWFpbmluZyBidWZmZXIgbGVuZ3RoIGlzICV0dSB3b3Jkcy5cbiIsCiAJCWZ1bmMsIHhkci0+ZW5kIC0geGRyLT5wKTsKIH0KIAorCiAvKgotICogQ29tbW9uIE5GUyBYRFIgZnVuY3Rpb25zIGFzIGlubGluZXMKKyAqIEVuY29kZS9kZWNvZGUgTkZTdjMgYmFzaWMgZGF0YSB0eXBlcworICoKKyAqIEJhc2ljIE5GU3YzIGRhdGEgdHlwZXMgYXJlIGRlZmluZWQgaW4gc2VjdGlvbiAyLjUgb2YgUkZDIDE4MTM6CisgKiAiTkZTIFZlcnNpb24gMyBQcm90b2NvbCBTcGVjaWZpY2F0aW9uIi4KKyAqCisgKiBOb3QgYWxsIGJhc2ljIGRhdGEgdHlwZXMgaGF2ZSB0aGVpciBvd24gZW5jb2RpbmcgYW5kIGRlY29kaW5nCisgKiBmdW5jdGlvbnMuICBGb3IgcnVuLXRpbWUgZWZmaWNpZW5jeSwgc29tZSBkYXRhIHR5cGVzIGFyZSBlbmNvZGVkCisgKiBvciBkZWNvZGVkIGlubGluZS4KICAqLwotc3RhdGljIGlubGluZSBfX2JlMzIgKgoteGRyX2VuY29kZV9maGFuZGxlKF9fYmUzMiAqcCwgY29uc3Qgc3RydWN0IG5mc19maCAqZmgpCisKK3N0YXRpYyB2b2lkIGVuY29kZV91aW50MzIoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgdTMyIHZhbHVlKQogewotCXJldHVybiB4ZHJfZW5jb2RlX2FycmF5KHAsIGZoLT5kYXRhLCBmaC0+c2l6ZSk7CisJX19iZTMyICpwID0geGRyX3Jlc2VydmVfc3BhY2UoeGRyLCA0KTsKKwkqcCA9IGNwdV90b19iZTMyKHZhbHVlKTsKIH0KIAotc3RhdGljIGlubGluZSBfX2JlMzIgKgoteGRyX2RlY29kZV9maGFuZGxlKF9fYmUzMiAqcCwgc3RydWN0IG5mc19maCAqZmgpCi17Ci0JaWYgKChmaC0+c2l6ZSA9IG50b2hsKCpwKyspKSA8PSBORlMzX0ZIU0laRSkgewotCQltZW1jcHkoZmgtPmRhdGEsIHAsIGZoLT5zaXplKTsKLQkJcmV0dXJuIHAgKyBYRFJfUVVBRExFTihmaC0+c2l6ZSk7Ci0JfQotCXJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgaW5saW5lIF9fYmUzMiAqCi14ZHJfZGVjb2RlX2ZoYW5kbGVfc3RyZWFtKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHN0cnVjdCBuZnNfZmggKmZoKQorc3RhdGljIGludCBkZWNvZGVfdWludDMyKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHUzMiAqdmFsdWUpCiB7CiAJX19iZTMyICpwOworCiAJcCA9IHhkcl9pbmxpbmVfZGVjb2RlKHhkciwgNCk7Ci0JaWYgKHVubGlrZWx5KCFwKSkKKwlpZiAodW5saWtlbHkocCA9PSBOVUxMKSkKIAkJZ290byBvdXRfb3ZlcmZsb3c7Ci0JZmgtPnNpemUgPSBudG9obCgqcCsrKTsKLQotCWlmIChmaC0+c2l6ZSA8PSBORlMzX0ZIU0laRSkgewotCQlwID0geGRyX2lubGluZV9kZWNvZGUoeGRyLCBmaC0+c2l6ZSk7Ci0JCWlmICh1bmxpa2VseSghcCkpCi0JCQlnb3RvIG91dF9vdmVyZmxvdzsKLQkJbWVtY3B5KGZoLT5kYXRhLCBwLCBmaC0+c2l6ZSk7Ci0JCXJldHVybiBwICsgWERSX1FVQURMRU4oZmgtPnNpemUpOwotCX0KLQlyZXR1cm4gTlVMTDsKLQorCSp2YWx1ZSA9IGJlMzJfdG9fY3B1cChwKTsKKwlyZXR1cm4gMDsKIG91dF9vdmVyZmxvdzoKIAlwcmludF9vdmVyZmxvd19tc2coX19mdW5jX18sIHhkcik7Ci0JcmV0dXJuIEVSUl9QVFIoLUVJTyk7CisJcmV0dXJuIC1FSU87Cit9CisKK3N0YXRpYyBpbnQgZGVjb2RlX3VpbnQ2NChzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCB1NjQgKnZhbHVlKQoreworCV9fYmUzMiAqcDsKKworCXAgPSB4ZHJfaW5saW5lX2RlY29kZSh4ZHIsIDgpOworCWlmICh1bmxpa2VseShwID09IE5VTEwpKQorCQlnb3RvIG91dF9vdmVyZmxvdzsKKwl4ZHJfZGVjb2RlX2h5cGVyKHAsIHZhbHVlKTsKKwlyZXR1cm4gMDsKK291dF9vdmVyZmxvdzoKKwlwcmludF9vdmVyZmxvd19tc2coX19mdW5jX18sIHhkcik7CisJcmV0dXJuIC1FSU87CiB9CiAKIC8qCi0gKiBFbmNvZGUvZGVjb2RlIHRpbWUuCisgKiBmaWxlaWQzCisgKgorICoJdHlwZWRlZiB1aW50NjQgZmlsZWlkMzsKICAqLwotc3RhdGljIGlubGluZSBfX2JlMzIgKgoteGRyX2VuY29kZV90aW1lMyhfX2JlMzIgKnAsIHN0cnVjdCB0aW1lc3BlYyAqdGltZXApCitzdGF0aWMgX19iZTMyICp4ZHJfZGVjb2RlX2ZpbGVpZDMoX19iZTMyICpwLCB1NjQgKmZpbGVpZCkKIHsKLQkqcCsrID0gaHRvbmwodGltZXAtPnR2X3NlYyk7Ci0JKnArKyA9IGh0b25sKHRpbWVwLT50dl9uc2VjKTsKLQlyZXR1cm4gcDsKKwlyZXR1cm4geGRyX2RlY29kZV9oeXBlcihwLCBmaWxlaWQpOwogfQogCi1zdGF0aWMgaW5saW5lIF9fYmUzMiAqCi14ZHJfZGVjb2RlX3RpbWUzKF9fYmUzMiAqcCwgc3RydWN0IHRpbWVzcGVjICp0aW1lcCkKK3N0YXRpYyBpbnQgZGVjb2RlX2ZpbGVpZDMoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgdTY0ICpmaWxlaWQpCiB7Ci0JdGltZXAtPnR2X3NlYyA9IG50b2hsKCpwKyspOwotCXRpbWVwLT50dl9uc2VjID0gbnRvaGwoKnArKyk7Ci0JcmV0dXJuIHA7CisJcmV0dXJuIGRlY29kZV91aW50NjQoeGRyLCBmaWxlaWQpOwogfQogCi1zdGF0aWMgX19iZTMyICoKLXhkcl9kZWNvZGVfZmF0dHIoX19iZTMyICpwLCBzdHJ1Y3QgbmZzX2ZhdHRyICpmYXR0cikKKy8qCisgKiBmaWxlbmFtZTMKKyAqCisgKgl0eXBlZGVmIHN0cmluZyBmaWxlbmFtZTM8PjsKKyAqLworc3RhdGljIHZvaWQgZW5jb2RlX2ZpbGVuYW1lMyhzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAorCQkJICAgICBjb25zdCBjaGFyICpuYW1lLCB1MzIgbGVuZ3RoKQogewotCXVuc2lnbmVkIGludAl0eXBlLCBtYWpvciwgbWlub3I7Ci0JdW1vZGVfdAkJZm1vZGU7CisJX19iZTMyICpwOwogCi0JdHlwZSA9IG50b2hsKCpwKyspOworCUJVR19PTihsZW5ndGggPiBORlMzX01BWE5BTUxFTik7CisJcCA9IHhkcl9yZXNlcnZlX3NwYWNlKHhkciwgNCArIGxlbmd0aCk7CisJeGRyX2VuY29kZV9vcGFxdWUocCwgbmFtZSwgbGVuZ3RoKTsKK30KKworc3RhdGljIGludCBkZWNvZGVfaW5saW5lX2ZpbGVuYW1lMyhzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAorCQkJCSAgIGNvbnN0IGNoYXIgKipuYW1lLCB1MzIgKmxlbmd0aCkKK3sKKwlfX2JlMzIgKnA7CisJdTMyIGNvdW50OworCisJcCA9IHhkcl9pbmxpbmVfZGVjb2RlKHhkciwgNCk7CisJaWYgKHVubGlrZWx5KHAgPT0gTlVMTCkpCisJCWdvdG8gb3V0X292ZXJmbG93OworCWNvdW50ID0gYmUzMl90b19jcHVwKHApOworCWlmIChjb3VudCA+IE5GUzNfTUFYTkFNTEVOKQorCQlnb3RvIG91dF9uYW1ldG9vbG9uZzsKKwlwID0geGRyX2lubGluZV9kZWNvZGUoeGRyLCBjb3VudCk7CisJaWYgKHVubGlrZWx5KHAgPT0gTlVMTCkpCisJCWdvdG8gb3V0X292ZXJmbG93OworCSpuYW1lID0gKGNvbnN0IGNoYXIgKilwOworCSpsZW5ndGggPSBjb3VudDsKKwlyZXR1cm4gMDsKKworb3V0X25hbWV0b29sb25nOgorCWRwcmludGsoIk5GUzogcmV0dXJuZWQgZmlsZW5hbWUgdG9vIGxvbmc6ICV1XG4iLCBjb3VudCk7CisJcmV0dXJuIC1FTkFNRVRPT0xPTkc7CitvdXRfb3ZlcmZsb3c6CisJcHJpbnRfb3ZlcmZsb3dfbXNnKF9fZnVuY19fLCB4ZHIpOworCXJldHVybiAtRUlPOworfQorCisvKgorICogbmZzcGF0aDMKKyAqCisgKgl0eXBlZGVmIHN0cmluZyBuZnNwYXRoMzw+OworICovCitzdGF0aWMgdm9pZCBlbmNvZGVfbmZzcGF0aDMoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgc3RydWN0IHBhZ2UgKipwYWdlcywKKwkJCSAgICBjb25zdCB1MzIgbGVuZ3RoKQoreworCUJVR19PTihsZW5ndGggPiBORlMzX01BWFBBVEhMRU4pOworCWVuY29kZV91aW50MzIoeGRyLCBsZW5ndGgpOworCXhkcl93cml0ZV9wYWdlcyh4ZHIsIHBhZ2VzLCAwLCBsZW5ndGgpOworfQorCitzdGF0aWMgaW50IGRlY29kZV9uZnNwYXRoMyhzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyKQoreworCXUzMiByZWN2ZCwgY291bnQ7CisJc2l6ZV90IGhkcmxlbjsKKwlfX2JlMzIgKnA7CisKKwlwID0geGRyX2lubGluZV9kZWNvZGUoeGRyLCA0KTsKKwlpZiAodW5saWtlbHkocCA9PSBOVUxMKSkKKwkJZ290byBvdXRfb3ZlcmZsb3c7CisJY291bnQgPSBiZTMyX3RvX2NwdXAocCk7CisJaWYgKHVubGlrZWx5KGNvdW50ID49IHhkci0+YnVmLT5wYWdlX2xlbiB8fCBjb3VudCA+IE5GUzNfTUFYUEFUSExFTikpCisJCWdvdG8gb3V0X25hbWV0b29sb25nOworCWhkcmxlbiA9ICh1OCAqKXhkci0+cCAtICh1OCAqKXhkci0+aW92LT5pb3ZfYmFzZTsKKwlyZWN2ZCA9IHhkci0+YnVmLT5sZW4gLSBoZHJsZW47CisJaWYgKHVubGlrZWx5KGNvdW50ID4gcmVjdmQpKQorCQlnb3RvIG91dF9jaGVhdGluZzsKKworCXhkcl9yZWFkX3BhZ2VzKHhkciwgY291bnQpOworCXhkcl90ZXJtaW5hdGVfc3RyaW5nKHhkci0+YnVmLCBjb3VudCk7CisJcmV0dXJuIDA7CisKK291dF9uYW1ldG9vbG9uZzoKKwlkcHJpbnRrKCJORlM6IHJldHVybmVkIHBhdGhuYW1lIHRvbyBsb25nOiAldVxuIiwgY291bnQpOworCXJldHVybiAtRU5BTUVUT09MT05HOworb3V0X2NoZWF0aW5nOgorCWRwcmludGsoIk5GUzogc2VydmVyIGNoZWF0aW5nIGluIHBhdGhuYW1lIHJlc3VsdDogIgorCQkiY291bnQgJXUgPiByZWN2ZCAldVxuIiwgY291bnQsIHJlY3ZkKTsKKwlyZXR1cm4gLUVJTzsKK291dF9vdmVyZmxvdzoKKwlwcmludF9vdmVyZmxvd19tc2coX19mdW5jX18sIHhkcik7CisJcmV0dXJuIC1FSU87Cit9CisKKy8qCisgKiBjb29raWUzCisgKgorICoJdHlwZWRlZiB1aW50NjQgY29va2llMworICovCitzdGF0aWMgX19iZTMyICp4ZHJfZW5jb2RlX2Nvb2tpZTMoX19iZTMyICpwLCB1NjQgY29va2llKQoreworCXJldHVybiB4ZHJfZW5jb2RlX2h5cGVyKHAsIGNvb2tpZSk7Cit9CisKK3N0YXRpYyBpbnQgZGVjb2RlX2Nvb2tpZTMoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgdTY0ICpjb29raWUpCit7CisJcmV0dXJuIGRlY29kZV91aW50NjQoeGRyLCBjb29raWUpOworfQorCisvKgorICogY29va2lldmVyZjMKKyAqCisgKgl0eXBlZGVmIG9wYXF1ZSBjb29raWV2ZXJmM1tORlMzX0NPT0tJRVZFUkZTSVpFXTsKKyAqLworc3RhdGljIF9fYmUzMiAqeGRyX2VuY29kZV9jb29raWV2ZXJmMyhfX2JlMzIgKnAsIGNvbnN0IF9fYmUzMiAqdmVyaWZpZXIpCit7CisJbWVtY3B5KHAsIHZlcmlmaWVyLCBORlMzX0NPT0tJRVZFUkZTSVpFKTsKKwlyZXR1cm4gcCArIFhEUl9RVUFETEVOKE5GUzNfQ09PS0lFVkVSRlNJWkUpOworfQorCitzdGF0aWMgaW50IGRlY29kZV9jb29raWV2ZXJmMyhzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBfX2JlMzIgKnZlcmlmaWVyKQoreworCV9fYmUzMiAqcDsKKworCXAgPSB4ZHJfaW5saW5lX2RlY29kZSh4ZHIsIE5GUzNfQ09PS0lFVkVSRlNJWkUpOworCWlmICh1bmxpa2VseShwID09IE5VTEwpKQorCQlnb3RvIG91dF9vdmVyZmxvdzsKKwltZW1jcHkodmVyaWZpZXIsIHAsIE5GUzNfQ09PS0lFVkVSRlNJWkUpOworCXJldHVybiAwOworb3V0X292ZXJmbG93OgorCXByaW50X292ZXJmbG93X21zZyhfX2Z1bmNfXywgeGRyKTsKKwlyZXR1cm4gLUVJTzsKK30KKworLyoKKyAqIGNyZWF0ZXZlcmYzCisgKgorICoJdHlwZWRlZiBvcGFxdWUgY3JlYXRldmVyZjNbTkZTM19DUkVBVEVWRVJGU0laRV07CisgKi8KK3N0YXRpYyB2b2lkIGVuY29kZV9jcmVhdGV2ZXJmMyhzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBjb25zdCBfX2JlMzIgKnZlcmlmaWVyKQoreworCV9fYmUzMiAqcDsKKworCXAgPSB4ZHJfcmVzZXJ2ZV9zcGFjZSh4ZHIsIE5GUzNfQ1JFQVRFVkVSRlNJWkUpOworCW1lbWNweShwLCB2ZXJpZmllciwgTkZTM19DUkVBVEVWRVJGU0laRSk7Cit9CisKK3N0YXRpYyBpbnQgZGVjb2RlX3dyaXRldmVyZjMoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgX19iZTMyICp2ZXJpZmllcikKK3sKKwlfX2JlMzIgKnA7CisKKwlwID0geGRyX2lubGluZV9kZWNvZGUoeGRyLCBORlMzX1dSSVRFVkVSRlNJWkUpOworCWlmICh1bmxpa2VseShwID09IE5VTEwpKQorCQlnb3RvIG91dF9vdmVyZmxvdzsKKwltZW1jcHkodmVyaWZpZXIsIHAsIE5GUzNfV1JJVEVWRVJGU0laRSk7CisJcmV0dXJuIDA7CitvdXRfb3ZlcmZsb3c6CisJcHJpbnRfb3ZlcmZsb3dfbXNnKF9fZnVuY19fLCB4ZHIpOworCXJldHVybiAtRUlPOworfQorCisvKgorICogc2l6ZTMKKyAqCisgKgl0eXBlZGVmIHVpbnQ2NCBzaXplMzsKKyAqLworc3RhdGljIF9fYmUzMiAqeGRyX2RlY29kZV9zaXplMyhfX2JlMzIgKnAsIHU2NCAqc2l6ZSkKK3sKKwlyZXR1cm4geGRyX2RlY29kZV9oeXBlcihwLCBzaXplKTsKK30KKworLyoKKyAqIG5mc3N0YXQzCisgKgorICoJZW51bSBuZnNzdGF0MyB7CisgKgkJTkZTM19PSyA9IDAsCisgKgkJLi4uCisgKgl9CisgKi8KKyNkZWZpbmUgTkZTM19PSwkJTkZTX09LCisKK3N0YXRpYyBpbnQgZGVjb2RlX25mc3N0YXQzKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIGVudW0gbmZzX3N0YXQgKnN0YXR1cykKK3sKKwlfX2JlMzIgKnA7CisKKwlwID0geGRyX2lubGluZV9kZWNvZGUoeGRyLCA0KTsKKwlpZiAodW5saWtlbHkocCA9PSBOVUxMKSkKKwkJZ290byBvdXRfb3ZlcmZsb3c7CisJKnN0YXR1cyA9IGJlMzJfdG9fY3B1cChwKTsKKwlyZXR1cm4gMDsKK291dF9vdmVyZmxvdzoKKwlwcmludF9vdmVyZmxvd19tc2coX19mdW5jX18sIHhkcik7CisJcmV0dXJuIC1FSU87Cit9CisKKy8qCisgKiBmdHlwZTMKKyAqCisgKgllbnVtIGZ0eXBlMyB7CisgKgkJTkYzUkVHCT0gMSwKKyAqCQlORjNESVIJPSAyLAorICoJCU5GM0JMSwk9IDMsCisgKgkJTkYzQ0hSCT0gNCwKKyAqCQlORjNMTksJPSA1LAorICoJCU5GM1NPQ0sJPSA2LAorICoJCU5GM0ZJRk8JPSA3CisgKgl9OworICovCitzdGF0aWMgdm9pZCBlbmNvZGVfZnR5cGUzKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIGNvbnN0IHUzMiB0eXBlKQoreworCUJVR19PTih0eXBlID4gTkYzRklGTyk7CisJZW5jb2RlX3VpbnQzMih4ZHIsIHR5cGUpOworfQorCitzdGF0aWMgX19iZTMyICp4ZHJfZGVjb2RlX2Z0eXBlMyhfX2JlMzIgKnAsIHVtb2RlX3QgKm1vZGUpCit7CisJdTMyIHR5cGU7CisKKwl0eXBlID0gYmUzMl90b19jcHVwKHArKyk7CiAJaWYgKHR5cGUgPiBORjNGSUZPKQogCQl0eXBlID0gTkYzTk9OOwotCWZtb2RlID0gbmZzX3R5cGUyZm10W3R5cGVdOwotCWZhdHRyLT5tb2RlID0gKG50b2hsKCpwKyspICYgflNfSUZNVCkgfCBmbW9kZTsKLQlmYXR0ci0+bmxpbmsgPSBudG9obCgqcCsrKTsKLQlmYXR0ci0+dWlkID0gbnRvaGwoKnArKyk7Ci0JZmF0dHItPmdpZCA9IG50b2hsKCpwKyspOwotCXAgPSB4ZHJfZGVjb2RlX2h5cGVyKHAsICZmYXR0ci0+c2l6ZSk7Ci0JcCA9IHhkcl9kZWNvZGVfaHlwZXIocCwgJmZhdHRyLT5kdS5uZnMzLnVzZWQpOworCSptb2RlID0gbmZzX3R5cGUyZm10W3R5cGVdOworCXJldHVybiBwOworfQogCi0JLyogVHVybiByZW1vdGUgZGV2aWNlIGluZm8gaW50byBMaW51eC1zcGVjaWZpYyBkZXZfdCAqLwotCW1ham9yID0gbnRvaGwoKnArKyk7Ci0JbWlub3IgPSBudG9obCgqcCsrKTsKLQlmYXR0ci0+cmRldiA9IE1LREVWKG1ham9yLCBtaW5vcik7Ci0JaWYgKE1BSk9SKGZhdHRyLT5yZGV2KSAhPSBtYWpvciB8fCBNSU5PUihmYXR0ci0+cmRldikgIT0gbWlub3IpCi0JCWZhdHRyLT5yZGV2ID0gMDsKKy8qCisgKiBzcGVjZGF0YTMKKyAqCisgKiAgICAgc3RydWN0IHNwZWNkYXRhMyB7CisgKiAgICAgICAgICAgICB1aW50MzIgIHNwZWNkYXRhMTsKKyAqICAgICAgICAgICAgIHVpbnQzMiAgc3BlY2RhdGEyOworICogICAgIH07CisgKi8KK3N0YXRpYyB2b2lkIGVuY29kZV9zcGVjZGF0YTMoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgY29uc3QgZGV2X3QgcmRldikKK3sKKwlfX2JlMzIgKnA7CisKKwlwID0geGRyX3Jlc2VydmVfc3BhY2UoeGRyLCA4KTsKKwkqcCsrID0gY3B1X3RvX2JlMzIoTUFKT1IocmRldikpOworCSpwID0gY3B1X3RvX2JlMzIoTUlOT1IocmRldikpOworfQorCitzdGF0aWMgX19iZTMyICp4ZHJfZGVjb2RlX3NwZWNkYXRhMyhfX2JlMzIgKnAsIGRldl90ICpyZGV2KQoreworCXVuc2lnbmVkIGludCBtYWpvciwgbWlub3I7CisKKwltYWpvciA9IGJlMzJfdG9fY3B1cChwKyspOworCW1pbm9yID0gYmUzMl90b19jcHVwKHArKyk7CisJKnJkZXYgPSBNS0RFVihtYWpvciwgbWlub3IpOworCWlmIChNQUpPUigqcmRldikgIT0gbWFqb3IgfHwgTUlOT1IoKnJkZXYpICE9IG1pbm9yKQorCQkqcmRldiA9IDA7CisJcmV0dXJuIHA7Cit9CisKKy8qCisgKiBuZnNfZmgzCisgKgorICoJc3RydWN0IG5mc19maDMgeworICoJCW9wYXF1ZSAgICAgICBkYXRhPE5GUzNfRkhTSVpFPjsKKyAqCX07CisgKi8KK3N0YXRpYyB2b2lkIGVuY29kZV9uZnNfZmgzKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIGNvbnN0IHN0cnVjdCBuZnNfZmggKmZoKQoreworCV9fYmUzMiAqcDsKKworCUJVR19PTihmaC0+c2l6ZSA+IE5GUzNfRkhTSVpFKTsKKwlwID0geGRyX3Jlc2VydmVfc3BhY2UoeGRyLCA0ICsgZmgtPnNpemUpOworCXhkcl9lbmNvZGVfb3BhcXVlKHAsIGZoLT5kYXRhLCBmaC0+c2l6ZSk7Cit9CisKK3N0YXRpYyBpbnQgZGVjb2RlX25mc19maDMoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgc3RydWN0IG5mc19maCAqZmgpCit7CisJdTMyIGxlbmd0aDsKKwlfX2JlMzIgKnA7CisKKwlwID0geGRyX2lubGluZV9kZWNvZGUoeGRyLCA0KTsKKwlpZiAodW5saWtlbHkocCA9PSBOVUxMKSkKKwkJZ290byBvdXRfb3ZlcmZsb3c7CisJbGVuZ3RoID0gYmUzMl90b19jcHVwKHArKyk7CisJaWYgKHVubGlrZWx5KGxlbmd0aCA+IE5GUzNfRkhTSVpFKSkKKwkJZ290byBvdXRfdG9vYmlnOworCXAgPSB4ZHJfaW5saW5lX2RlY29kZSh4ZHIsIGxlbmd0aCk7CisJaWYgKHVubGlrZWx5KHAgPT0gTlVMTCkpCisJCWdvdG8gb3V0X292ZXJmbG93OworCWZoLT5zaXplID0gbGVuZ3RoOworCW1lbWNweShmaC0+ZGF0YSwgcCwgbGVuZ3RoKTsKKwlyZXR1cm4gMDsKK291dF90b29iaWc6CisJZHByaW50aygiTkZTOiBmaWxlIGhhbmRsZSBzaXplICgldSkgdG9vIGJpZ1xuIiwgbGVuZ3RoKTsKKwlyZXR1cm4gLUUyQklHOworb3V0X292ZXJmbG93OgorCXByaW50X292ZXJmbG93X21zZyhfX2Z1bmNfXywgeGRyKTsKKwlyZXR1cm4gLUVJTzsKK30KKworc3RhdGljIHZvaWQgemVyb19uZnNfZmgzKHN0cnVjdCBuZnNfZmggKmZoKQoreworCW1lbXNldChmaCwgMCwgc2l6ZW9mKCpmaCkpOworfQorCisvKgorICogbmZzdGltZTMKKyAqCisgKglzdHJ1Y3QgbmZzdGltZTMgeworICoJCXVpbnQzMglzZWNvbmRzOworICoJCXVpbnQzMgluc2Vjb25kczsKKyAqCX07CisgKi8KK3N0YXRpYyBfX2JlMzIgKnhkcl9lbmNvZGVfbmZzdGltZTMoX19iZTMyICpwLCBjb25zdCBzdHJ1Y3QgdGltZXNwZWMgKnRpbWVwKQoreworCSpwKysgPSBjcHVfdG9fYmUzMih0aW1lcC0+dHZfc2VjKTsKKwkqcCsrID0gY3B1X3RvX2JlMzIodGltZXAtPnR2X25zZWMpOworCXJldHVybiBwOworfQorCitzdGF0aWMgX19iZTMyICp4ZHJfZGVjb2RlX25mc3RpbWUzKF9fYmUzMiAqcCwgc3RydWN0IHRpbWVzcGVjICp0aW1lcCkKK3sKKwl0aW1lcC0+dHZfc2VjID0gYmUzMl90b19jcHVwKHArKyk7CisJdGltZXAtPnR2X25zZWMgPSBiZTMyX3RvX2NwdXAocCsrKTsKKwlyZXR1cm4gcDsKK30KKworLyoKKyAqIHNhdHRyMworICoKKyAqCWVudW0gdGltZV9ob3cgeworICoJCURPTlRfQ0hBTkdFCQk9IDAsCisgKgkJU0VUX1RPX1NFUlZFUl9USU1FCT0gMSwKKyAqCQlTRVRfVE9fQ0xJRU5UX1RJTUUJPSAyCisgKgl9OworICoKKyAqCXVuaW9uIHNldF9tb2RlMyBzd2l0Y2ggKGJvb2wgc2V0X2l0KSB7CisgKgljYXNlIFRSVUU6CisgKgkJbW9kZTMJbW9kZTsKKyAqCWRlZmF1bHQ6CisgKgkJdm9pZDsKKyAqCX07CisgKgorICoJdW5pb24gc2V0X3VpZDMgc3dpdGNoIChib29sIHNldF9pdCkgeworICoJY2FzZSBUUlVFOgorICoJCXVpZDMJdWlkOworICoJZGVmYXVsdDoKKyAqCQl2b2lkOworICoJfTsKKyAqCisgKgl1bmlvbiBzZXRfZ2lkMyBzd2l0Y2ggKGJvb2wgc2V0X2l0KSB7CisgKgljYXNlIFRSVUU6CisgKgkJZ2lkMwlnaWQ7CisgKglkZWZhdWx0OgorICoJCXZvaWQ7CisgKgl9OworICoKKyAqCXVuaW9uIHNldF9zaXplMyBzd2l0Y2ggKGJvb2wgc2V0X2l0KSB7CisgKgljYXNlIFRSVUU6CisgKgkJc2l6ZTMJc2l6ZTsKKyAqCWRlZmF1bHQ6CisgKgkJdm9pZDsKKyAqCX07CisgKgorICoJdW5pb24gc2V0X2F0aW1lIHN3aXRjaCAodGltZV9ob3cgc2V0X2l0KSB7CisgKgljYXNlIFNFVF9UT19DTElFTlRfVElNRToKKyAqCQluZnN0aW1lMwlhdGltZTsKKyAqCWRlZmF1bHQ6CisgKgkJdm9pZDsKKyAqCX07CisgKgorICoJdW5pb24gc2V0X210aW1lIHN3aXRjaCAodGltZV9ob3cgc2V0X2l0KSB7CisgKgljYXNlIFNFVF9UT19DTElFTlRfVElNRToKKyAqCQluZnN0aW1lMyAgbXRpbWU7CisgKglkZWZhdWx0OgorICoJCXZvaWQ7CisgKgl9OworICoKKyAqCXN0cnVjdCBzYXR0cjMgeworICoJCXNldF9tb2RlMwltb2RlOworICoJCXNldF91aWQzCXVpZDsKKyAqCQlzZXRfZ2lkMwlnaWQ7CisgKgkJc2V0X3NpemUzCXNpemU7CisgKgkJc2V0X2F0aW1lCWF0aW1lOworICoJCXNldF9tdGltZQltdGltZTsKKyAqCX07CisgKi8KK3N0YXRpYyB2b2lkIGVuY29kZV9zYXR0cjMoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgY29uc3Qgc3RydWN0IGlhdHRyICphdHRyKQoreworCXUzMiBuYnl0ZXM7CisJX19iZTMyICpwOworCisJLyoKKwkgKiBJbiBvcmRlciB0byBtYWtlIG9ubHkgYSBzaW5nbGUgeGRyX3Jlc2VydmVfc3BhY2UoKSBjYWxsLAorCSAqIHByZS1jb21wdXRlIHRoZSB0b3RhbCBudW1iZXIgb2YgYnl0ZXMgdG8gYmUgcmVzZXJ2ZWQuCisJICogU2l4IGJvb2xlYW4gdmFsdWVzLCBvbmUgZm9yIGVhY2ggc2V0X2ZvbyBmaWVsZCwgYXJlIGFsd2F5cworCSAqIHByZXNlbnQgaW4gdGhlIGVuY29kZWQgcmVzdWx0LCBzbyBzdGFydCB0aGVyZS4KKwkgKi8KKwluYnl0ZXMgPSA2ICogNDsKKwlpZiAoYXR0ci0+aWFfdmFsaWQgJiBBVFRSX01PREUpCisJCW5ieXRlcyArPSA0OworCWlmIChhdHRyLT5pYV92YWxpZCAmIEFUVFJfVUlEKQorCQluYnl0ZXMgKz0gNDsKKwlpZiAoYXR0ci0+aWFfdmFsaWQgJiBBVFRSX0dJRCkKKwkJbmJ5dGVzICs9IDQ7CisJaWYgKGF0dHItPmlhX3ZhbGlkICYgQVRUUl9TSVpFKQorCQluYnl0ZXMgKz0gODsKKwlpZiAoYXR0ci0+aWFfdmFsaWQgJiBBVFRSX0FUSU1FX1NFVCkKKwkJbmJ5dGVzICs9IDg7CisJaWYgKGF0dHItPmlhX3ZhbGlkICYgQVRUUl9NVElNRV9TRVQpCisJCW5ieXRlcyArPSA4OworCXAgPSB4ZHJfcmVzZXJ2ZV9zcGFjZSh4ZHIsIG5ieXRlcyk7CisKKwlpZiAoYXR0ci0+aWFfdmFsaWQgJiBBVFRSX01PREUpIHsKKwkJKnArKyA9IHhkcl9vbmU7CisJCSpwKysgPSBjcHVfdG9fYmUzMihhdHRyLT5pYV9tb2RlICYgU19JQUxMVUdPKTsKKwl9IGVsc2UKKwkJKnArKyA9IHhkcl96ZXJvOworCisJaWYgKGF0dHItPmlhX3ZhbGlkICYgQVRUUl9VSUQpIHsKKwkJKnArKyA9IHhkcl9vbmU7CisJCSpwKysgPSBjcHVfdG9fYmUzMihhdHRyLT5pYV91aWQpOworCX0gZWxzZQorCQkqcCsrID0geGRyX3plcm87CisKKwlpZiAoYXR0ci0+aWFfdmFsaWQgJiBBVFRSX0dJRCkgeworCQkqcCsrID0geGRyX29uZTsKKwkJKnArKyA9IGNwdV90b19iZTMyKGF0dHItPmlhX2dpZCk7CisJfSBlbHNlCisJCSpwKysgPSB4ZHJfemVybzsKKworCWlmIChhdHRyLT5pYV92YWxpZCAmIEFUVFJfU0laRSkgeworCQkqcCsrID0geGRyX29uZTsKKwkJcCA9IHhkcl9lbmNvZGVfaHlwZXIocCwgKHU2NClhdHRyLT5pYV9zaXplKTsKKwl9IGVsc2UKKwkJKnArKyA9IHhkcl96ZXJvOworCisJaWYgKGF0dHItPmlhX3ZhbGlkICYgQVRUUl9BVElNRV9TRVQpIHsKKwkJKnArKyA9IHhkcl90d287CisJCXAgPSB4ZHJfZW5jb2RlX25mc3RpbWUzKHAsICZhdHRyLT5pYV9hdGltZSk7CisJfSBlbHNlIGlmIChhdHRyLT5pYV92YWxpZCAmIEFUVFJfQVRJTUUpIHsKKwkJKnArKyA9IHhkcl9vbmU7CisJfSBlbHNlCisJCSpwKysgPSB4ZHJfemVybzsKKworCWlmIChhdHRyLT5pYV92YWxpZCAmIEFUVFJfTVRJTUVfU0VUKSB7CisJCSpwKysgPSB4ZHJfdHdvOworCQl4ZHJfZW5jb2RlX25mc3RpbWUzKHAsICZhdHRyLT5pYV9tdGltZSk7CisJfSBlbHNlIGlmIChhdHRyLT5pYV92YWxpZCAmIEFUVFJfTVRJTUUpIHsKKwkJKnAgPSB4ZHJfb25lOworCX0gZWxzZQorCQkqcCA9IHhkcl96ZXJvOworfQorCisvKgorICogZmF0dHIzCisgKgorICoJc3RydWN0IGZhdHRyMyB7CisgKgkJZnR5cGUzCQl0eXBlOworICoJCW1vZGUzCQltb2RlOworICoJCXVpbnQzMgkJbmxpbms7CisgKgkJdWlkMwkJdWlkOworICoJCWdpZDMJCWdpZDsKKyAqCQlzaXplMwkJc2l6ZTsKKyAqCQlzaXplMwkJdXNlZDsKKyAqCQlzcGVjZGF0YTMJcmRldjsKKyAqCQl1aW50NjQJCWZzaWQ7CisgKgkJZmlsZWlkMwkJZmlsZWlkOworICoJCW5mc3RpbWUzCWF0aW1lOworICoJCW5mc3RpbWUzCW10aW1lOworICoJCW5mc3RpbWUzCWN0aW1lOworICoJfTsKKyAqLworc3RhdGljIGludCBkZWNvZGVfZmF0dHIzKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHN0cnVjdCBuZnNfZmF0dHIgKmZhdHRyKQoreworCXVtb2RlX3QgZm1vZGU7CisJX19iZTMyICpwOworCisJcCA9IHhkcl9pbmxpbmVfZGVjb2RlKHhkciwgTkZTM19mYXR0cl9zeiA8PCAyKTsKKwlpZiAodW5saWtlbHkocCA9PSBOVUxMKSkKKwkJZ290byBvdXRfb3ZlcmZsb3c7CisKKwlwID0geGRyX2RlY29kZV9mdHlwZTMocCwgJmZtb2RlKTsKKworCWZhdHRyLT5tb2RlID0gKGJlMzJfdG9fY3B1cChwKyspICYgflNfSUZNVCkgfCBmbW9kZTsKKwlmYXR0ci0+bmxpbmsgPSBiZTMyX3RvX2NwdXAocCsrKTsKKwlmYXR0ci0+dWlkID0gYmUzMl90b19jcHVwKHArKyk7CisJZmF0dHItPmdpZCA9IGJlMzJfdG9fY3B1cChwKyspOworCisJcCA9IHhkcl9kZWNvZGVfc2l6ZTMocCwgJmZhdHRyLT5zaXplKTsKKwlwID0geGRyX2RlY29kZV9zaXplMyhwLCAmZmF0dHItPmR1Lm5mczMudXNlZCk7CisJcCA9IHhkcl9kZWNvZGVfc3BlY2RhdGEzKHAsICZmYXR0ci0+cmRldik7CiAKIAlwID0geGRyX2RlY29kZV9oeXBlcihwLCAmZmF0dHItPmZzaWQubWFqb3IpOwogCWZhdHRyLT5mc2lkLm1pbm9yID0gMDsKLQlwID0geGRyX2RlY29kZV9oeXBlcihwLCAmZmF0dHItPmZpbGVpZCk7Ci0JcCA9IHhkcl9kZWNvZGVfdGltZTMocCwgJmZhdHRyLT5hdGltZSk7Ci0JcCA9IHhkcl9kZWNvZGVfdGltZTMocCwgJmZhdHRyLT5tdGltZSk7Ci0JcCA9IHhkcl9kZWNvZGVfdGltZTMocCwgJmZhdHRyLT5jdGltZSk7CiAKLQkvKiBVcGRhdGUgdGhlIG1vZGUgYml0cyAqLworCXAgPSB4ZHJfZGVjb2RlX2ZpbGVpZDMocCwgJmZhdHRyLT5maWxlaWQpOworCXAgPSB4ZHJfZGVjb2RlX25mc3RpbWUzKHAsICZmYXR0ci0+YXRpbWUpOworCXAgPSB4ZHJfZGVjb2RlX25mc3RpbWUzKHAsICZmYXR0ci0+bXRpbWUpOworCXhkcl9kZWNvZGVfbmZzdGltZTMocCwgJmZhdHRyLT5jdGltZSk7CisKIAlmYXR0ci0+dmFsaWQgfD0gTkZTX0FUVFJfRkFUVFJfVjM7Ci0JcmV0dXJuIHA7CisJcmV0dXJuIDA7CitvdXRfb3ZlcmZsb3c6CisJcHJpbnRfb3ZlcmZsb3dfbXNnKF9fZnVuY19fLCB4ZHIpOworCXJldHVybiAtRUlPOwogfQogCi1zdGF0aWMgaW5saW5lIF9fYmUzMiAqCi14ZHJfZW5jb2RlX3NhdHRyKF9fYmUzMiAqcCwgc3RydWN0IGlhdHRyICphdHRyKQorLyoKKyAqIHBvc3Rfb3BfYXR0cgorICoKKyAqCXVuaW9uIHBvc3Rfb3BfYXR0ciBzd2l0Y2ggKGJvb2wgYXR0cmlidXRlc19mb2xsb3cpIHsKKyAqCWNhc2UgVFJVRToKKyAqCQlmYXR0cjMJYXR0cmlidXRlczsKKyAqCWNhc2UgRkFMU0U6CisgKgkJdm9pZDsKKyAqCX07CisgKi8KK3N0YXRpYyBpbnQgZGVjb2RlX3Bvc3Rfb3BfYXR0cihzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBzdHJ1Y3QgbmZzX2ZhdHRyICpmYXR0cikKIHsKLQlpZiAoYXR0ci0+aWFfdmFsaWQgJiBBVFRSX01PREUpIHsKLQkJKnArKyA9IHhkcl9vbmU7Ci0JCSpwKysgPSBodG9ubChhdHRyLT5pYV9tb2RlICYgU19JQUxMVUdPKTsKLQl9IGVsc2UgewotCQkqcCsrID0geGRyX3plcm87Ci0JfQotCWlmIChhdHRyLT5pYV92YWxpZCAmIEFUVFJfVUlEKSB7Ci0JCSpwKysgPSB4ZHJfb25lOwotCQkqcCsrID0gaHRvbmwoYXR0ci0+aWFfdWlkKTsKLQl9IGVsc2UgewotCQkqcCsrID0geGRyX3plcm87Ci0JfQotCWlmIChhdHRyLT5pYV92YWxpZCAmIEFUVFJfR0lEKSB7Ci0JCSpwKysgPSB4ZHJfb25lOwotCQkqcCsrID0gaHRvbmwoYXR0ci0+aWFfZ2lkKTsKLQl9IGVsc2UgewotCQkqcCsrID0geGRyX3plcm87Ci0JfQotCWlmIChhdHRyLT5pYV92YWxpZCAmIEFUVFJfU0laRSkgewotCQkqcCsrID0geGRyX29uZTsKLQkJcCA9IHhkcl9lbmNvZGVfaHlwZXIocCwgKF9fdTY0KSBhdHRyLT5pYV9zaXplKTsKLQl9IGVsc2UgewotCQkqcCsrID0geGRyX3plcm87Ci0JfQotCWlmIChhdHRyLT5pYV92YWxpZCAmIEFUVFJfQVRJTUVfU0VUKSB7Ci0JCSpwKysgPSB4ZHJfdHdvOwotCQlwID0geGRyX2VuY29kZV90aW1lMyhwLCAmYXR0ci0+aWFfYXRpbWUpOwotCX0gZWxzZSBpZiAoYXR0ci0+aWFfdmFsaWQgJiBBVFRSX0FUSU1FKSB7Ci0JCSpwKysgPSB4ZHJfb25lOwotCX0gZWxzZSB7Ci0JCSpwKysgPSB4ZHJfemVybzsKLQl9Ci0JaWYgKGF0dHItPmlhX3ZhbGlkICYgQVRUUl9NVElNRV9TRVQpIHsKLQkJKnArKyA9IHhkcl90d287Ci0JCXAgPSB4ZHJfZW5jb2RlX3RpbWUzKHAsICZhdHRyLT5pYV9tdGltZSk7Ci0JfSBlbHNlIGlmIChhdHRyLT5pYV92YWxpZCAmIEFUVFJfTVRJTUUpIHsKLQkJKnArKyA9IHhkcl9vbmU7Ci0JfSBlbHNlIHsKLQkJKnArKyA9IHhkcl96ZXJvOwotCX0KLQlyZXR1cm4gcDsKKwlfX2JlMzIgKnA7CisKKwlwID0geGRyX2lubGluZV9kZWNvZGUoeGRyLCA0KTsKKwlpZiAodW5saWtlbHkocCA9PSBOVUxMKSkKKwkJZ290byBvdXRfb3ZlcmZsb3c7CisJaWYgKCpwICE9IHhkcl96ZXJvKQorCQlyZXR1cm4gZGVjb2RlX2ZhdHRyMyh4ZHIsIGZhdHRyKTsKKwlyZXR1cm4gMDsKK291dF9vdmVyZmxvdzoKKwlwcmludF9vdmVyZmxvd19tc2coX19mdW5jX18sIHhkcik7CisJcmV0dXJuIC1FSU87CiB9CiAKLXN0YXRpYyBpbmxpbmUgX19iZTMyICoKLXhkcl9kZWNvZGVfd2NjX2F0dHIoX19iZTMyICpwLCBzdHJ1Y3QgbmZzX2ZhdHRyICpmYXR0cikKKy8qCisgKiB3Y2NfYXR0cgorICoJc3RydWN0IHdjY19hdHRyIHsKKyAqCQlzaXplMwkJc2l6ZTsKKyAqCQluZnN0aW1lMwltdGltZTsKKyAqCQluZnN0aW1lMwljdGltZTsKKyAqCX07CisgKi8KK3N0YXRpYyBpbnQgZGVjb2RlX3djY19hdHRyKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHN0cnVjdCBuZnNfZmF0dHIgKmZhdHRyKQogewotCXAgPSB4ZHJfZGVjb2RlX2h5cGVyKHAsICZmYXR0ci0+cHJlX3NpemUpOwotCXAgPSB4ZHJfZGVjb2RlX3RpbWUzKHAsICZmYXR0ci0+cHJlX210aW1lKTsKLQlwID0geGRyX2RlY29kZV90aW1lMyhwLCAmZmF0dHItPnByZV9jdGltZSk7CisJX19iZTMyICpwOworCisJcCA9IHhkcl9pbmxpbmVfZGVjb2RlKHhkciwgTkZTM193Y2NfYXR0cl9zeiA8PCAyKTsKKwlpZiAodW5saWtlbHkocCA9PSBOVUxMKSkKKwkJZ290byBvdXRfb3ZlcmZsb3c7CisKIAlmYXR0ci0+dmFsaWQgfD0gTkZTX0FUVFJfRkFUVFJfUFJFU0laRQogCQl8IE5GU19BVFRSX0ZBVFRSX1BSRU1USU1FCiAJCXwgTkZTX0FUVFJfRkFUVFJfUFJFQ1RJTUU7Ci0JcmV0dXJuIHA7CisKKwlwID0geGRyX2RlY29kZV9zaXplMyhwLCAmZmF0dHItPnByZV9zaXplKTsKKwlwID0geGRyX2RlY29kZV9uZnN0aW1lMyhwLCAmZmF0dHItPnByZV9tdGltZSk7CisJeGRyX2RlY29kZV9uZnN0aW1lMyhwLCAmZmF0dHItPnByZV9jdGltZSk7CisKKwlyZXR1cm4gMDsKK291dF9vdmVyZmxvdzoKKwlwcmludF9vdmVyZmxvd19tc2coX19mdW5jX18sIHhkcik7CisJcmV0dXJuIC1FSU87CiB9CiAKLXN0YXRpYyBpbmxpbmUgX19iZTMyICoKLXhkcl9kZWNvZGVfcG9zdF9vcF9hdHRyKF9fYmUzMiAqcCwgc3RydWN0IG5mc19mYXR0ciAqZmF0dHIpCi17Ci0JaWYgKCpwKyspCi0JCXAgPSB4ZHJfZGVjb2RlX2ZhdHRyKHAsIGZhdHRyKTsKLQlyZXR1cm4gcDsKLX0KLQotc3RhdGljIGlubGluZSBfX2JlMzIgKgoteGRyX2RlY29kZV9wb3N0X29wX2F0dHJfc3RyZWFtKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHN0cnVjdCBuZnNfZmF0dHIgKmZhdHRyKQorLyoKKyAqIHByZV9vcF9hdHRyCisgKgl1bmlvbiBwcmVfb3BfYXR0ciBzd2l0Y2ggKGJvb2wgYXR0cmlidXRlc19mb2xsb3cpIHsKKyAqCWNhc2UgVFJVRToKKyAqCQl3Y2NfYXR0cglhdHRyaWJ1dGVzOworICoJY2FzZSBGQUxTRToKKyAqCQl2b2lkOworICoJfTsKKyAqCisgKiB3Y2NfZGF0YQorICoKKyAqCXN0cnVjdCB3Y2NfZGF0YSB7CisgKgkJcHJlX29wX2F0dHIJYmVmb3JlOworICoJCXBvc3Rfb3BfYXR0cglhZnRlcjsKKyAqCX07CisgKi8KK3N0YXRpYyBpbnQgZGVjb2RlX3ByZV9vcF9hdHRyKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHN0cnVjdCBuZnNfZmF0dHIgKmZhdHRyKQogewogCV9fYmUzMiAqcDsKIAogCXAgPSB4ZHJfaW5saW5lX2RlY29kZSh4ZHIsIDQpOwotCWlmICh1bmxpa2VseSghcCkpCisJaWYgKHVubGlrZWx5KHAgPT0gTlVMTCkpCiAJCWdvdG8gb3V0X292ZXJmbG93OwotCWlmIChudG9obCgqcCsrKSkgewotCQlwID0geGRyX2lubGluZV9kZWNvZGUoeGRyLCA4NCk7Ci0JCWlmICh1bmxpa2VseSghcCkpCi0JCQlnb3RvIG91dF9vdmVyZmxvdzsKLQkJcCA9IHhkcl9kZWNvZGVfZmF0dHIocCwgZmF0dHIpOwotCX0KLQlyZXR1cm4gcDsKKwlpZiAoKnAgIT0geGRyX3plcm8pCisJCXJldHVybiBkZWNvZGVfd2NjX2F0dHIoeGRyLCBmYXR0cik7CisJcmV0dXJuIDA7CiBvdXRfb3ZlcmZsb3c6CiAJcHJpbnRfb3ZlcmZsb3dfbXNnKF9fZnVuY19fLCB4ZHIpOwotCXJldHVybiBFUlJfUFRSKC1FSU8pOworCXJldHVybiAtRUlPOwogfQogCi1zdGF0aWMgaW5saW5lIF9fYmUzMiAqCi14ZHJfZGVjb2RlX3ByZV9vcF9hdHRyKF9fYmUzMiAqcCwgc3RydWN0IG5mc19mYXR0ciAqZmF0dHIpCitzdGF0aWMgaW50IGRlY29kZV93Y2NfZGF0YShzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBzdHJ1Y3QgbmZzX2ZhdHRyICpmYXR0cikKIHsKLQlpZiAoKnArKykKLQkJcmV0dXJuIHhkcl9kZWNvZGVfd2NjX2F0dHIocCwgZmF0dHIpOwotCXJldHVybiBwOwotfQorCWludCBlcnJvcjsKIAotCi1zdGF0aWMgaW5saW5lIF9fYmUzMiAqCi14ZHJfZGVjb2RlX3djY19kYXRhKF9fYmUzMiAqcCwgc3RydWN0IG5mc19mYXR0ciAqZmF0dHIpCi17Ci0JcCA9IHhkcl9kZWNvZGVfcHJlX29wX2F0dHIocCwgZmF0dHIpOwotCXJldHVybiB4ZHJfZGVjb2RlX3Bvc3Rfb3BfYXR0cihwLCBmYXR0cik7CisJZXJyb3IgPSBkZWNvZGVfcHJlX29wX2F0dHIoeGRyLCBmYXR0cik7CisJaWYgKHVubGlrZWx5KGVycm9yKSkKKwkJZ290byBvdXQ7CisJZXJyb3IgPSBkZWNvZGVfcG9zdF9vcF9hdHRyKHhkciwgZmF0dHIpOworb3V0OgorCXJldHVybiBlcnJvcjsKIH0KIAogLyoKLSAqIE5GUyBlbmNvZGUgZnVuY3Rpb25zCisgKiBwb3N0X29wX2ZoMworICoKKyAqCXVuaW9uIHBvc3Rfb3BfZmgzIHN3aXRjaCAoYm9vbCBoYW5kbGVfZm9sbG93cykgeworICoJY2FzZSBUUlVFOgorICoJCW5mc19maDMgIGhhbmRsZTsKKyAqCWNhc2UgRkFMU0U6CisgKgkJdm9pZDsKKyAqCX07CiAgKi8KLQotLyoKLSAqIEVuY29kZSBmaWxlIGhhbmRsZSBhcmd1bWVudAotICovCi1zdGF0aWMgaW50Ci1uZnMzX3hkcl9maGFuZGxlKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsIHN0cnVjdCBuZnNfZmggKmZoKQorc3RhdGljIGludCBkZWNvZGVfcG9zdF9vcF9maDMoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgc3RydWN0IG5mc19maCAqZmgpCiB7Ci0JcCA9IHhkcl9lbmNvZGVfZmhhbmRsZShwLCBmaCk7Ci0JcmVxLT5ycV9zbGVuID0geGRyX2FkanVzdF9pb3ZlYyhyZXEtPnJxX3N2ZWMsIHApOworCV9fYmUzMiAqcCA9IHhkcl9pbmxpbmVfZGVjb2RlKHhkciwgNCk7CisJaWYgKHVubGlrZWx5KHAgPT0gTlVMTCkpCisJCWdvdG8gb3V0X292ZXJmbG93OworCWlmICgqcCAhPSB4ZHJfemVybykKKwkJcmV0dXJuIGRlY29kZV9uZnNfZmgzKHhkciwgZmgpOworCXplcm9fbmZzX2ZoMyhmaCk7CiAJcmV0dXJuIDA7CitvdXRfb3ZlcmZsb3c6CisJcHJpbnRfb3ZlcmZsb3dfbXNnKF9fZnVuY19fLCB4ZHIpOworCXJldHVybiAtRUlPOwogfQogCiAvKgotICogRW5jb2RlIFNFVEFUVFIgYXJndW1lbnRzCisgKiBkaXJvcGFyZ3MzCisgKgorICoJc3RydWN0IGRpcm9wYXJnczMgeworICoJCW5mc19maDMJCWRpcjsKKyAqCQlmaWxlbmFtZTMJbmFtZTsKKyAqCX07CiAgKi8KLXN0YXRpYyBpbnQKLW5mczNfeGRyX3NhdHRyYXJncyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLCBzdHJ1Y3QgbmZzM19zYXR0cmFyZ3MgKmFyZ3MpCitzdGF0aWMgdm9pZCBlbmNvZGVfZGlyb3BhcmdzMyhzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBjb25zdCBzdHJ1Y3QgbmZzX2ZoICpmaCwKKwkJCSAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIHUzMiBsZW5ndGgpCiB7Ci0JcCA9IHhkcl9lbmNvZGVfZmhhbmRsZShwLCBhcmdzLT5maCk7Ci0JcCA9IHhkcl9lbmNvZGVfc2F0dHIocCwgYXJncy0+c2F0dHIpOwotCSpwKysgPSBodG9ubChhcmdzLT5ndWFyZCk7Ci0JaWYgKGFyZ3MtPmd1YXJkKQotCQlwID0geGRyX2VuY29kZV90aW1lMyhwLCAmYXJncy0+Z3VhcmR0aW1lKTsKLQlyZXEtPnJxX3NsZW4gPSB4ZHJfYWRqdXN0X2lvdmVjKHJlcS0+cnFfc3ZlYywgcCk7Ci0JcmV0dXJuIDA7CisJZW5jb2RlX25mc19maDMoeGRyLCBmaCk7CisJZW5jb2RlX2ZpbGVuYW1lMyh4ZHIsIG5hbWUsIGxlbmd0aCk7Cit9CisKKworLyoKKyAqIE5GU3YzIFhEUiBlbmNvZGUgZnVuY3Rpb25zCisgKgorICogTkZTdjMgYXJndW1lbnQgdHlwZXMgYXJlIGRlZmluZWQgaW4gc2VjdGlvbiAzLjMgb2YgUkZDIDE4MTM6CisgKiAiTkZTIFZlcnNpb24gMyBQcm90b2NvbCBTcGVjaWZpY2F0aW9uIi4KKyAqLworCisvKgorICogMy4zLjEgIEdFVEFUVFIzYXJncworICoKKyAqCXN0cnVjdCBHRVRBVFRSM2FyZ3MgeworICoJCW5mc19maDMgIG9iamVjdDsKKyAqCX07CisgKi8KK3N0YXRpYyB2b2lkIG5mczNfeGRyX2VuY19nZXRhdHRyM2FyZ3Moc3RydWN0IHJwY19ycXN0ICpyZXEsCisJCQkJICAgICAgc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKKwkJCQkgICAgICBjb25zdCBzdHJ1Y3QgbmZzX2ZoICpmaCkKK3sKKwllbmNvZGVfbmZzX2ZoMyh4ZHIsIGZoKTsKIH0KIAogLyoKLSAqIEVuY29kZSBkaXJlY3Rvcnkgb3BzIGFyZ3VtZW50CisgKiAzLjMuMiAgU0VUQVRUUjNhcmdzCisgKgorICoJdW5pb24gc2F0dHJndWFyZDMgc3dpdGNoIChib29sIGNoZWNrKSB7CisgKgljYXNlIFRSVUU6CisgKgkJbmZzdGltZTMgIG9ial9jdGltZTsKKyAqCWNhc2UgRkFMU0U6CisgKgkJdm9pZDsKKyAqCX07CisgKgorICoJc3RydWN0IFNFVEFUVFIzYXJncyB7CisgKgkJbmZzX2ZoMwkJb2JqZWN0OworICoJCXNhdHRyMwkJbmV3X2F0dHJpYnV0ZXM7CisgKgkJc2F0dHJndWFyZDMJZ3VhcmQ7CisgKgl9OwogICovCi1zdGF0aWMgaW50Ci1uZnMzX3hkcl9kaXJvcGFyZ3Moc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgc3RydWN0IG5mczNfZGlyb3BhcmdzICphcmdzKQorc3RhdGljIHZvaWQgZW5jb2RlX3NhdHRyZ3VhcmQzKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCisJCQkgICAgICAgY29uc3Qgc3RydWN0IG5mczNfc2F0dHJhcmdzICphcmdzKQogewotCXAgPSB4ZHJfZW5jb2RlX2ZoYW5kbGUocCwgYXJncy0+ZmgpOwotCXAgPSB4ZHJfZW5jb2RlX2FycmF5KHAsIGFyZ3MtPm5hbWUsIGFyZ3MtPmxlbik7Ci0JcmVxLT5ycV9zbGVuID0geGRyX2FkanVzdF9pb3ZlYyhyZXEtPnJxX3N2ZWMsIHApOwotCXJldHVybiAwOwotfQorCV9fYmUzMiAqcDsKIAotLyoKLSAqIEVuY29kZSBSRU1PVkUgYXJndW1lbnQKLSAqLwotc3RhdGljIGludAotbmZzM194ZHJfcmVtb3ZlYXJncyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLCBjb25zdCBzdHJ1Y3QgbmZzX3JlbW92ZWFyZ3MgKmFyZ3MpCi17Ci0JcCA9IHhkcl9lbmNvZGVfZmhhbmRsZShwLCBhcmdzLT5maCk7Ci0JcCA9IHhkcl9lbmNvZGVfYXJyYXkocCwgYXJncy0+bmFtZS5uYW1lLCBhcmdzLT5uYW1lLmxlbik7Ci0JcmVxLT5ycV9zbGVuID0geGRyX2FkanVzdF9pb3ZlYyhyZXEtPnJxX3N2ZWMsIHApOwotCXJldHVybiAwOwotfQotCi0vKgotICogRW5jb2RlIGFjY2VzcygpIGFyZ3VtZW50Ci0gKi8KLXN0YXRpYyBpbnQKLW5mczNfeGRyX2FjY2Vzc2FyZ3Moc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgc3RydWN0IG5mczNfYWNjZXNzYXJncyAqYXJncykKLXsKLQlwID0geGRyX2VuY29kZV9maGFuZGxlKHAsIGFyZ3MtPmZoKTsKLQkqcCsrID0gaHRvbmwoYXJncy0+YWNjZXNzKTsKLQlyZXEtPnJxX3NsZW4gPSB4ZHJfYWRqdXN0X2lvdmVjKHJlcS0+cnFfc3ZlYywgcCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBBcmd1bWVudHMgdG8gYSBSRUFEIGNhbGwuIFNpbmNlIHdlIHJlYWQgZGF0YSBkaXJlY3RseSBpbnRvIHRoZSBwYWdlCi0gKiBjYWNoZSwgd2UgYWxzbyBzZXQgdXAgdGhlIHJlcGx5IGlvdmVjIGhlcmUgc28gdGhhdCBpb3ZbMV0gcG9pbnRzCi0gKiBleGFjdGx5IHRvIHRoZSBwYWdlIHdlIHdhbnQgdG8gZmV0Y2guCi0gKi8KLXN0YXRpYyBpbnQKLW5mczNfeGRyX3JlYWRhcmdzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsIHN0cnVjdCBuZnNfcmVhZGFyZ3MgKmFyZ3MpCi17Ci0Jc3RydWN0IHJwY19hdXRoCSphdXRoID0gcmVxLT5ycV9jcmVkLT5jcl9hdXRoOwotCXVuc2lnbmVkIGludCByZXBsZW47Ci0JdTMyIGNvdW50ID0gYXJncy0+Y291bnQ7Ci0KLQlwID0geGRyX2VuY29kZV9maGFuZGxlKHAsIGFyZ3MtPmZoKTsKLQlwID0geGRyX2VuY29kZV9oeXBlcihwLCBhcmdzLT5vZmZzZXQpOwotCSpwKysgPSBodG9ubChjb3VudCk7Ci0JcmVxLT5ycV9zbGVuID0geGRyX2FkanVzdF9pb3ZlYyhyZXEtPnJxX3N2ZWMsIHApOwotCi0JLyogSW5saW5lIHRoZSBwYWdlIGFycmF5ICovCi0JcmVwbGVuID0gKFJQQ19SRVBIRFJTSVpFICsgYXV0aC0+YXVfcnNsYWNrICsgTkZTM19yZWFkcmVzX3N6KSA8PCAyOwotCXhkcl9pbmxpbmVfcGFnZXMoJnJlcS0+cnFfcmN2X2J1ZiwgcmVwbGVuLAotCQkJIGFyZ3MtPnBhZ2VzLCBhcmdzLT5wZ2Jhc2UsIGNvdW50KTsKLQlyZXEtPnJxX3Jjdl9idWYuZmxhZ3MgfD0gWERSQlVGX1JFQUQ7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBXcml0ZSBhcmd1bWVudHMuIFNwbGljZSB0aGUgYnVmZmVyIHRvIGJlIHdyaXR0ZW4gaW50byB0aGUgaW92ZWMuCi0gKi8KLXN0YXRpYyBpbnQKLW5mczNfeGRyX3dyaXRlYXJncyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLCBzdHJ1Y3QgbmZzX3dyaXRlYXJncyAqYXJncykKLXsKLQlzdHJ1Y3QgeGRyX2J1ZiAqc25kYnVmID0gJnJlcS0+cnFfc25kX2J1ZjsKLQl1MzIgY291bnQgPSBhcmdzLT5jb3VudDsKLQotCXAgPSB4ZHJfZW5jb2RlX2ZoYW5kbGUocCwgYXJncy0+ZmgpOwotCXAgPSB4ZHJfZW5jb2RlX2h5cGVyKHAsIGFyZ3MtPm9mZnNldCk7Ci0JKnArKyA9IGh0b25sKGNvdW50KTsKLQkqcCsrID0gaHRvbmwoYXJncy0+c3RhYmxlKTsKLQkqcCsrID0gaHRvbmwoY291bnQpOwotCXNuZGJ1Zi0+bGVuID0geGRyX2FkanVzdF9pb3ZlYyhzbmRidWYtPmhlYWQsIHApOwotCi0JLyogQ29weSB0aGUgcGFnZSBhcnJheSAqLwotCXhkcl9lbmNvZGVfcGFnZXMoc25kYnVmLCBhcmdzLT5wYWdlcywgYXJncy0+cGdiYXNlLCBjb3VudCk7Ci0Jc25kYnVmLT5mbGFncyB8PSBYRFJCVUZfV1JJVEU7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBFbmNvZGUgQ1JFQVRFIGFyZ3VtZW50cwotICovCi1zdGF0aWMgaW50Ci1uZnMzX3hkcl9jcmVhdGVhcmdzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsIHN0cnVjdCBuZnMzX2NyZWF0ZWFyZ3MgKmFyZ3MpCi17Ci0JcCA9IHhkcl9lbmNvZGVfZmhhbmRsZShwLCBhcmdzLT5maCk7Ci0JcCA9IHhkcl9lbmNvZGVfYXJyYXkocCwgYXJncy0+bmFtZSwgYXJncy0+bGVuKTsKLQotCSpwKysgPSBodG9ubChhcmdzLT5jcmVhdGVtb2RlKTsKLQlpZiAoYXJncy0+Y3JlYXRlbW9kZSA9PSBORlMzX0NSRUFURV9FWENMVVNJVkUpIHsKLQkJKnArKyA9IGFyZ3MtPnZlcmlmaWVyWzBdOwotCQkqcCsrID0gYXJncy0+dmVyaWZpZXJbMV07Ci0JfSBlbHNlCi0JCXAgPSB4ZHJfZW5jb2RlX3NhdHRyKHAsIGFyZ3MtPnNhdHRyKTsKLQotCXJlcS0+cnFfc2xlbiA9IHhkcl9hZGp1c3RfaW92ZWMocmVxLT5ycV9zdmVjLCBwKTsKLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIEVuY29kZSBNS0RJUiBhcmd1bWVudHMKLSAqLwotc3RhdGljIGludAotbmZzM194ZHJfbWtkaXJhcmdzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsIHN0cnVjdCBuZnMzX21rZGlyYXJncyAqYXJncykKLXsKLQlwID0geGRyX2VuY29kZV9maGFuZGxlKHAsIGFyZ3MtPmZoKTsKLQlwID0geGRyX2VuY29kZV9hcnJheShwLCBhcmdzLT5uYW1lLCBhcmdzLT5sZW4pOwotCXAgPSB4ZHJfZW5jb2RlX3NhdHRyKHAsIGFyZ3MtPnNhdHRyKTsKLQlyZXEtPnJxX3NsZW4gPSB4ZHJfYWRqdXN0X2lvdmVjKHJlcS0+cnFfc3ZlYywgcCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBFbmNvZGUgU1lNTElOSyBhcmd1bWVudHMKLSAqLwotc3RhdGljIGludAotbmZzM194ZHJfc3ltbGlua2FyZ3Moc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgc3RydWN0IG5mczNfc3ltbGlua2FyZ3MgKmFyZ3MpCi17Ci0JcCA9IHhkcl9lbmNvZGVfZmhhbmRsZShwLCBhcmdzLT5mcm9tZmgpOwotCXAgPSB4ZHJfZW5jb2RlX2FycmF5KHAsIGFyZ3MtPmZyb21uYW1lLCBhcmdzLT5mcm9tbGVuKTsKLQlwID0geGRyX2VuY29kZV9zYXR0cihwLCBhcmdzLT5zYXR0cik7Ci0JKnArKyA9IGh0b25sKGFyZ3MtPnBhdGhsZW4pOwotCXJlcS0+cnFfc2xlbiA9IHhkcl9hZGp1c3RfaW92ZWMocmVxLT5ycV9zdmVjLCBwKTsKLQotCS8qIENvcHkgdGhlIHBhZ2UgKi8KLQl4ZHJfZW5jb2RlX3BhZ2VzKCZyZXEtPnJxX3NuZF9idWYsIGFyZ3MtPnBhZ2VzLCAwLCBhcmdzLT5wYXRobGVuKTsKLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIEVuY29kZSBNS05PRCBhcmd1bWVudHMKLSAqLwotc3RhdGljIGludAotbmZzM194ZHJfbWtub2RhcmdzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsIHN0cnVjdCBuZnMzX21rbm9kYXJncyAqYXJncykKLXsKLQlwID0geGRyX2VuY29kZV9maGFuZGxlKHAsIGFyZ3MtPmZoKTsKLQlwID0geGRyX2VuY29kZV9hcnJheShwLCBhcmdzLT5uYW1lLCBhcmdzLT5sZW4pOwotCSpwKysgPSBodG9ubChhcmdzLT50eXBlKTsKLQlwID0geGRyX2VuY29kZV9zYXR0cihwLCBhcmdzLT5zYXR0cik7Ci0JaWYgKGFyZ3MtPnR5cGUgPT0gTkYzQ0hSIHx8IGFyZ3MtPnR5cGUgPT0gTkYzQkxLKSB7Ci0JCSpwKysgPSBodG9ubChNQUpPUihhcmdzLT5yZGV2KSk7Ci0JCSpwKysgPSBodG9ubChNSU5PUihhcmdzLT5yZGV2KSk7Ci0JfQotCi0JcmVxLT5ycV9zbGVuID0geGRyX2FkanVzdF9pb3ZlYyhyZXEtPnJxX3N2ZWMsIHApOwotCXJldHVybiAwOwotfQotCi0vKgotICogRW5jb2RlIFJFTkFNRSBhcmd1bWVudHMKLSAqLwotc3RhdGljIGludAotbmZzM194ZHJfcmVuYW1lYXJncyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLCBzdHJ1Y3QgbmZzX3JlbmFtZWFyZ3MgKmFyZ3MpCi17Ci0JcCA9IHhkcl9lbmNvZGVfZmhhbmRsZShwLCBhcmdzLT5vbGRfZGlyKTsKLQlwID0geGRyX2VuY29kZV9hcnJheShwLCBhcmdzLT5vbGRfbmFtZS0+bmFtZSwgYXJncy0+b2xkX25hbWUtPmxlbik7Ci0JcCA9IHhkcl9lbmNvZGVfZmhhbmRsZShwLCBhcmdzLT5uZXdfZGlyKTsKLQlwID0geGRyX2VuY29kZV9hcnJheShwLCBhcmdzLT5uZXdfbmFtZS0+bmFtZSwgYXJncy0+bmV3X25hbWUtPmxlbik7Ci0JcmVxLT5ycV9zbGVuID0geGRyX2FkanVzdF9pb3ZlYyhyZXEtPnJxX3N2ZWMsIHApOwotCXJldHVybiAwOwotfQotCi0vKgotICogRW5jb2RlIExJTksgYXJndW1lbnRzCi0gKi8KLXN0YXRpYyBpbnQKLW5mczNfeGRyX2xpbmthcmdzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsIHN0cnVjdCBuZnMzX2xpbmthcmdzICphcmdzKQotewotCXAgPSB4ZHJfZW5jb2RlX2ZoYW5kbGUocCwgYXJncy0+ZnJvbWZoKTsKLQlwID0geGRyX2VuY29kZV9maGFuZGxlKHAsIGFyZ3MtPnRvZmgpOwotCXAgPSB4ZHJfZW5jb2RlX2FycmF5KHAsIGFyZ3MtPnRvbmFtZSwgYXJncy0+dG9sZW4pOwotCXJlcS0+cnFfc2xlbiA9IHhkcl9hZGp1c3RfaW92ZWMocmVxLT5ycV9zdmVjLCBwKTsKLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIEVuY29kZSBhcmd1bWVudHMgdG8gcmVhZGRpciBjYWxsCi0gKi8KLXN0YXRpYyBpbnQKLW5mczNfeGRyX3JlYWRkaXJhcmdzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsIHN0cnVjdCBuZnMzX3JlYWRkaXJhcmdzICphcmdzKQotewotCXN0cnVjdCBycGNfYXV0aAkqYXV0aCA9IHJlcS0+cnFfY3JlZC0+Y3JfYXV0aDsKLQl1bnNpZ25lZCBpbnQgcmVwbGVuOwotCXUzMiBjb3VudCA9IGFyZ3MtPmNvdW50OwotCi0JcCA9IHhkcl9lbmNvZGVfZmhhbmRsZShwLCBhcmdzLT5maCk7Ci0JcCA9IHhkcl9lbmNvZGVfaHlwZXIocCwgYXJncy0+Y29va2llKTsKLQkqcCsrID0gYXJncy0+dmVyZlswXTsKLQkqcCsrID0gYXJncy0+dmVyZlsxXTsKLQlpZiAoYXJncy0+cGx1cykgewotCQkvKiByZWFkZGlycGx1czogbmVlZCBkaXJjb3VudCArIGJ1ZmZlciBzaXplLgotCQkgKiBXZSBqdXN0IG1ha2Ugc3VyZSB3ZSBtYWtlIGRpcmNvdW50IGJpZyBlbm91Z2ggKi8KLQkJKnArKyA9IGh0b25sKGNvdW50ID4+IDMpOwotCX0KLQkqcCsrID0gaHRvbmwoY291bnQpOwotCXJlcS0+cnFfc2xlbiA9IHhkcl9hZGp1c3RfaW92ZWMocmVxLT5ycV9zdmVjLCBwKTsKLQotCS8qIElubGluZSB0aGUgcGFnZSBhcnJheSAqLwotCXJlcGxlbiA9IChSUENfUkVQSERSU0laRSArIGF1dGgtPmF1X3JzbGFjayArIE5GUzNfcmVhZGRpcnJlc19zeikgPDwgMjsKLQl4ZHJfaW5saW5lX3BhZ2VzKCZyZXEtPnJxX3Jjdl9idWYsIHJlcGxlbiwgYXJncy0+cGFnZXMsIDAsIGNvdW50KTsKLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIERlY29kZSB0aGUgcmVzdWx0IG9mIGEgcmVhZGRpciBjYWxsLgotICogV2UganVzdCBjaGVjayBmb3Igc3ludGFjdGljYWwgY29ycmVjdG5lc3MuCi0gKi8KLXN0YXRpYyBpbnQKLW5mczNfeGRyX3JlYWRkaXJyZXMoc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgc3RydWN0IG5mczNfcmVhZGRpcnJlcyAqcmVzKQotewotCXN0cnVjdCB4ZHJfYnVmICpyY3ZidWYgPSAmcmVxLT5ycV9yY3ZfYnVmOwotCXN0cnVjdCBrdmVjICppb3YgPSByY3ZidWYtPmhlYWQ7Ci0Jc3RydWN0IHBhZ2UgKipwYWdlOwotCXNpemVfdCBoZHJsZW47Ci0JdTMyIHJlY3ZkLCBwZ2xlbjsKLQlpbnQgc3RhdHVzOwotCi0Jc3RhdHVzID0gbnRvaGwoKnArKyk7Ci0JLyogRGVjb2RlIHBvc3Rfb3BfYXR0cnMgKi8KLQlwID0geGRyX2RlY29kZV9wb3N0X29wX2F0dHIocCwgcmVzLT5kaXJfYXR0cik7Ci0JaWYgKHN0YXR1cykKLQkJcmV0dXJuIG5mc19zdGF0X3RvX2Vycm5vKHN0YXR1cyk7Ci0JLyogRGVjb2RlIHZlcmlmaWVyIGNvb2tpZSAqLwotCWlmIChyZXMtPnZlcmYpIHsKLQkJcmVzLT52ZXJmWzBdID0gKnArKzsKLQkJcmVzLT52ZXJmWzFdID0gKnArKzsKKwlpZiAoYXJncy0+Z3VhcmQpIHsKKwkJcCA9IHhkcl9yZXNlcnZlX3NwYWNlKHhkciwgNCArIDgpOworCQkqcCsrID0geGRyX29uZTsKKwkJeGRyX2VuY29kZV9uZnN0aW1lMyhwLCAmYXJncy0+Z3VhcmR0aW1lKTsKIAl9IGVsc2UgewotCQlwICs9IDI7CisJCXAgPSB4ZHJfcmVzZXJ2ZV9zcGFjZSh4ZHIsIDQpOworCQkqcCA9IHhkcl96ZXJvOwogCX0KLQotCWhkcmxlbiA9ICh1OCAqKSBwIC0gKHU4ICopIGlvdi0+aW92X2Jhc2U7Ci0JaWYgKGlvdi0+aW92X2xlbiA8IGhkcmxlbikgewotCQlkcHJpbnRrKCJORlM6IFJFQURESVIgcmVwbHkgaGVhZGVyIG92ZXJmbG93ZWQ6IgotCQkJCSJsZW5ndGggJVp1ID4gJVp1XG4iLCBoZHJsZW4sIGlvdi0+aW92X2xlbik7Ci0JCXJldHVybiAtZXJybm9fTkZTRVJSX0lPOwotCX0gZWxzZSBpZiAoaW92LT5pb3ZfbGVuICE9IGhkcmxlbikgewotCQlkcHJpbnRrKCJORlM6IFJFQURESVIgaGVhZGVyIGlzIHNob3J0LiBpb3ZlYyB3aWxsIGJlIHNoaWZ0ZWQuXG4iKTsKLQkJeGRyX3NoaWZ0X2J1ZihyY3ZidWYsIGlvdi0+aW92X2xlbiAtIGhkcmxlbik7Ci0JfQotCi0JcGdsZW4gPSByY3ZidWYtPnBhZ2VfbGVuOwotCXJlY3ZkID0gcmN2YnVmLT5sZW4gLSBoZHJsZW47Ci0JaWYgKHBnbGVuID4gcmVjdmQpCi0JCXBnbGVuID0gcmVjdmQ7Ci0JcGFnZSA9IHJjdmJ1Zi0+cGFnZXM7Ci0KLQlyZXR1cm4gcGdsZW47CiB9CiAKLV9fYmUzMiAqCi1uZnMzX2RlY29kZV9kaXJlbnQoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgc3RydWN0IG5mc19lbnRyeSAqZW50cnksIHN0cnVjdCBuZnNfc2VydmVyICpzZXJ2ZXIsIGludCBwbHVzKQorc3RhdGljIHZvaWQgbmZzM194ZHJfZW5jX3NldGF0dHIzYXJncyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwKKwkJCQkgICAgICBzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAorCQkJCSAgICAgIGNvbnN0IHN0cnVjdCBuZnMzX3NhdHRyYXJncyAqYXJncykKIHsKLQlfX2JlMzIgKnA7Ci0Jc3RydWN0IG5mc19lbnRyeSBvbGQgPSAqZW50cnk7Ci0KLQlwID0geGRyX2lubGluZV9kZWNvZGUoeGRyLCA0KTsKLQlpZiAodW5saWtlbHkoIXApKQotCQlnb3RvIG91dF9vdmVyZmxvdzsKLQlpZiAoIW50b2hsKCpwKyspKSB7Ci0JCXAgPSB4ZHJfaW5saW5lX2RlY29kZSh4ZHIsIDQpOwotCQlpZiAodW5saWtlbHkoIXApKQotCQkJZ290byBvdXRfb3ZlcmZsb3c7Ci0JCWlmICghbnRvaGwoKnArKykpCi0JCQlyZXR1cm4gRVJSX1BUUigtRUFHQUlOKTsKLQkJZW50cnktPmVvZiA9IDE7Ci0JCXJldHVybiBFUlJfUFRSKC1FQkFEQ09PS0lFKTsKLQl9Ci0KLQlwID0geGRyX2lubGluZV9kZWNvZGUoeGRyLCAxMik7Ci0JaWYgKHVubGlrZWx5KCFwKSkKLQkJZ290byBvdXRfb3ZlcmZsb3c7Ci0JcCA9IHhkcl9kZWNvZGVfaHlwZXIocCwgJmVudHJ5LT5pbm8pOwotCWVudHJ5LT5sZW4gID0gbnRvaGwoKnArKyk7Ci0KLQlwID0geGRyX2lubGluZV9kZWNvZGUoeGRyLCBlbnRyeS0+bGVuICsgOCk7Ci0JaWYgKHVubGlrZWx5KCFwKSkKLQkJZ290byBvdXRfb3ZlcmZsb3c7Ci0JZW50cnktPm5hbWUgPSAoY29uc3QgY2hhciAqKSBwOwotCXAgKz0gWERSX1FVQURMRU4oZW50cnktPmxlbik7Ci0JZW50cnktPnByZXZfY29va2llID0gZW50cnktPmNvb2tpZTsKLQlwID0geGRyX2RlY29kZV9oeXBlcihwLCAmZW50cnktPmNvb2tpZSk7Ci0KLQllbnRyeS0+ZF90eXBlID0gRFRfVU5LTk9XTjsKLQlpZiAocGx1cykgewotCQllbnRyeS0+ZmF0dHItPnZhbGlkID0gMDsKLQkJcCA9IHhkcl9kZWNvZGVfcG9zdF9vcF9hdHRyX3N0cmVhbSh4ZHIsIGVudHJ5LT5mYXR0cik7Ci0JCWlmIChJU19FUlIocCkpCi0JCQlnb3RvIG91dF9vdmVyZmxvd19leGl0OwotCQllbnRyeS0+ZF90eXBlID0gbmZzX3Vtb2RlX3RvX2R0eXBlKGVudHJ5LT5mYXR0ci0+bW9kZSk7Ci0JCS8qIEluIGZhY3QsIGEgcG9zdF9vcF9maDM6ICovCi0JCXAgPSB4ZHJfaW5saW5lX2RlY29kZSh4ZHIsIDQpOwotCQlpZiAodW5saWtlbHkoIXApKQotCQkJZ290byBvdXRfb3ZlcmZsb3c7Ci0JCWlmICgqcCsrKSB7Ci0JCQlwID0geGRyX2RlY29kZV9maGFuZGxlX3N0cmVhbSh4ZHIsIGVudHJ5LT5maCk7Ci0JCQlpZiAoSVNfRVJSKHApKQotCQkJCWdvdG8gb3V0X292ZXJmbG93X2V4aXQ7Ci0JCQkvKiBVZ2ggLS0gc2VydmVyIHJlcGx5IHdhcyB0cnVuY2F0ZWQgKi8KLQkJCWlmIChwID09IE5VTEwpIHsKLQkJCQlkcHJpbnRrKCJORlM6IEZIIHRydW5jYXRlZFxuIik7Ci0JCQkJKmVudHJ5ID0gb2xkOwotCQkJCXJldHVybiBFUlJfUFRSKC1FQUdBSU4pOwotCQkJfQotCQl9IGVsc2UKLQkJCW1lbXNldCgodTgqKShlbnRyeS0+ZmgpLCAwLCBzaXplb2YoKmVudHJ5LT5maCkpOwotCX0KLQotCXAgPSB4ZHJfaW5saW5lX3BlZWsoeGRyLCA4KTsKLQlpZiAocCAhPSBOVUxMKQotCQllbnRyeS0+ZW9mID0gIXBbMF0gJiYgcFsxXTsKLQllbHNlCi0JCWVudHJ5LT5lb2YgPSAwOwotCi0JcmV0dXJuIHA7Ci0KLW91dF9vdmVyZmxvdzoKLQlwcmludF9vdmVyZmxvd19tc2coX19mdW5jX18sIHhkcik7Ci1vdXRfb3ZlcmZsb3dfZXhpdDoKLQlyZXR1cm4gRVJSX1BUUigtRUFHQUlOKTsKKwllbmNvZGVfbmZzX2ZoMyh4ZHIsIGFyZ3MtPmZoKTsKKwllbmNvZGVfc2F0dHIzKHhkciwgYXJncy0+c2F0dHIpOworCWVuY29kZV9zYXR0cmd1YXJkMyh4ZHIsIGFyZ3MpOwogfQogCiAvKgotICogRW5jb2RlIENPTU1JVCBhcmd1bWVudHMKKyAqIDMuMy4zICBMT09LVVAzYXJncworICoKKyAqCXN0cnVjdCBMT09LVVAzYXJncyB7CisgKgkJZGlyb3BhcmdzMyAgd2hhdDsKKyAqCX07CiAgKi8KLXN0YXRpYyBpbnQKLW5mczNfeGRyX2NvbW1pdGFyZ3Moc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgc3RydWN0IG5mc193cml0ZWFyZ3MgKmFyZ3MpCitzdGF0aWMgdm9pZCBuZnMzX3hkcl9lbmNfbG9va3VwM2FyZ3Moc3RydWN0IHJwY19ycXN0ICpyZXEsCisJCQkJICAgICBzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAorCQkJCSAgICAgY29uc3Qgc3RydWN0IG5mczNfZGlyb3BhcmdzICphcmdzKQogewotCXAgPSB4ZHJfZW5jb2RlX2ZoYW5kbGUocCwgYXJncy0+ZmgpOworCWVuY29kZV9kaXJvcGFyZ3MzKHhkciwgYXJncy0+ZmgsIGFyZ3MtPm5hbWUsIGFyZ3MtPmxlbik7Cit9CisKKy8qCisgKiAzLjMuNCAgQUNDRVNTM2FyZ3MKKyAqCisgKglzdHJ1Y3QgQUNDRVNTM2FyZ3MgeworICoJCW5mc19maDMJCW9iamVjdDsKKyAqCQl1aW50MzIJCWFjY2VzczsKKyAqCX07CisgKi8KK3N0YXRpYyB2b2lkIGVuY29kZV9hY2Nlc3MzYXJncyhzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAorCQkJICAgICAgIGNvbnN0IHN0cnVjdCBuZnMzX2FjY2Vzc2FyZ3MgKmFyZ3MpCit7CisJZW5jb2RlX25mc19maDMoeGRyLCBhcmdzLT5maCk7CisJZW5jb2RlX3VpbnQzMih4ZHIsIGFyZ3MtPmFjY2Vzcyk7Cit9CisKK3N0YXRpYyB2b2lkIG5mczNfeGRyX2VuY19hY2Nlc3MzYXJncyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwKKwkJCQkgICAgIHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCisJCQkJICAgICBjb25zdCBzdHJ1Y3QgbmZzM19hY2Nlc3NhcmdzICphcmdzKQoreworCWVuY29kZV9hY2Nlc3MzYXJncyh4ZHIsIGFyZ3MpOworfQorCisvKgorICogMy4zLjUgIFJFQURMSU5LM2FyZ3MKKyAqCisgKglzdHJ1Y3QgUkVBRExJTkszYXJncyB7CisgKgkJbmZzX2ZoMwlzeW1saW5rOworICoJfTsKKyAqLworc3RhdGljIHZvaWQgbmZzM194ZHJfZW5jX3JlYWRsaW5rM2FyZ3Moc3RydWN0IHJwY19ycXN0ICpyZXEsCisJCQkJICAgICAgIHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCisJCQkJICAgICAgIGNvbnN0IHN0cnVjdCBuZnMzX3JlYWRsaW5rYXJncyAqYXJncykKK3sKKwllbmNvZGVfbmZzX2ZoMyh4ZHIsIGFyZ3MtPmZoKTsKKwlwcmVwYXJlX3JlcGx5X2J1ZmZlcihyZXEsIGFyZ3MtPnBhZ2VzLCBhcmdzLT5wZ2Jhc2UsCisJCQkJCWFyZ3MtPnBnbGVuLCBORlMzX3JlYWRsaW5rcmVzX3N6KTsKK30KKworLyoKKyAqIDMuMy42ICBSRUFEM2FyZ3MKKyAqCisgKglzdHJ1Y3QgUkVBRDNhcmdzIHsKKyAqCQluZnNfZmgzCQlmaWxlOworICoJCW9mZnNldDMJCW9mZnNldDsKKyAqCQljb3VudDMJCWNvdW50OworICoJfTsKKyAqLworc3RhdGljIHZvaWQgZW5jb2RlX3JlYWQzYXJncyhzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAorCQkJICAgICBjb25zdCBzdHJ1Y3QgbmZzX3JlYWRhcmdzICphcmdzKQoreworCV9fYmUzMiAqcDsKKworCWVuY29kZV9uZnNfZmgzKHhkciwgYXJncy0+ZmgpOworCisJcCA9IHhkcl9yZXNlcnZlX3NwYWNlKHhkciwgOCArIDQpOwogCXAgPSB4ZHJfZW5jb2RlX2h5cGVyKHAsIGFyZ3MtPm9mZnNldCk7Ci0JKnArKyA9IGh0b25sKGFyZ3MtPmNvdW50KTsKLQlyZXEtPnJxX3NsZW4gPSB4ZHJfYWRqdXN0X2lvdmVjKHJlcS0+cnFfc3ZlYywgcCk7Ci0JcmV0dXJuIDA7CisJKnAgPSBjcHVfdG9fYmUzMihhcmdzLT5jb3VudCk7Cit9CisKK3N0YXRpYyB2b2lkIG5mczNfeGRyX2VuY19yZWFkM2FyZ3Moc3RydWN0IHJwY19ycXN0ICpyZXEsCisJCQkJICAgc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKKwkJCQkgICBjb25zdCBzdHJ1Y3QgbmZzX3JlYWRhcmdzICphcmdzKQoreworCWVuY29kZV9yZWFkM2FyZ3MoeGRyLCBhcmdzKTsKKwlwcmVwYXJlX3JlcGx5X2J1ZmZlcihyZXEsIGFyZ3MtPnBhZ2VzLCBhcmdzLT5wZ2Jhc2UsCisJCQkJCWFyZ3MtPmNvdW50LCBORlMzX3JlYWRyZXNfc3opOworCXJlcS0+cnFfcmN2X2J1Zi5mbGFncyB8PSBYRFJCVUZfUkVBRDsKK30KKworLyoKKyAqIDMuMy43ICBXUklURTNhcmdzCisgKgorICoJZW51bSBzdGFibGVfaG93IHsKKyAqCQlVTlNUQUJMRSAgPSAwLAorICoJCURBVEFfU1lOQyA9IDEsCisgKgkJRklMRV9TWU5DID0gMgorICoJfTsKKyAqCisgKglzdHJ1Y3QgV1JJVEUzYXJncyB7CisgKgkJbmZzX2ZoMwkJZmlsZTsKKyAqCQlvZmZzZXQzCQlvZmZzZXQ7CisgKgkJY291bnQzCQljb3VudDsKKyAqCQlzdGFibGVfaG93CXN0YWJsZTsKKyAqCQlvcGFxdWUJCWRhdGE8PjsKKyAqCX07CisgKi8KK3N0YXRpYyB2b2lkIGVuY29kZV93cml0ZTNhcmdzKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCisJCQkgICAgICBjb25zdCBzdHJ1Y3QgbmZzX3dyaXRlYXJncyAqYXJncykKK3sKKwlfX2JlMzIgKnA7CisKKwllbmNvZGVfbmZzX2ZoMyh4ZHIsIGFyZ3MtPmZoKTsKKworCXAgPSB4ZHJfcmVzZXJ2ZV9zcGFjZSh4ZHIsIDggKyA0ICsgNCArIDQpOworCXAgPSB4ZHJfZW5jb2RlX2h5cGVyKHAsIGFyZ3MtPm9mZnNldCk7CisJKnArKyA9IGNwdV90b19iZTMyKGFyZ3MtPmNvdW50KTsKKwkqcCsrID0gY3B1X3RvX2JlMzIoYXJncy0+c3RhYmxlKTsKKwkqcCA9IGNwdV90b19iZTMyKGFyZ3MtPmNvdW50KTsKKwl4ZHJfd3JpdGVfcGFnZXMoeGRyLCBhcmdzLT5wYWdlcywgYXJncy0+cGdiYXNlLCBhcmdzLT5jb3VudCk7Cit9CisKK3N0YXRpYyB2b2lkIG5mczNfeGRyX2VuY193cml0ZTNhcmdzKHN0cnVjdCBycGNfcnFzdCAqcmVxLAorCQkJCSAgICBzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAorCQkJCSAgICBjb25zdCBzdHJ1Y3QgbmZzX3dyaXRlYXJncyAqYXJncykKK3sKKwllbmNvZGVfd3JpdGUzYXJncyh4ZHIsIGFyZ3MpOworCXhkci0+YnVmLT5mbGFncyB8PSBYRFJCVUZfV1JJVEU7Cit9CisKKy8qCisgKiAzLjMuOCAgQ1JFQVRFM2FyZ3MKKyAqCisgKgllbnVtIGNyZWF0ZW1vZGUzIHsKKyAqCQlVTkNIRUNLRUQgPSAwLAorICoJCUdVQVJERUQgICA9IDEsCisgKgkJRVhDTFVTSVZFID0gMgorICoJfTsKKyAqCisgKgl1bmlvbiBjcmVhdGVob3czIHN3aXRjaCAoY3JlYXRlbW9kZTMgbW9kZSkgeworICoJY2FzZSBVTkNIRUNLRUQ6CisgKgljYXNlIEdVQVJERUQ6CisgKgkJc2F0dHIzICAgICAgIG9ial9hdHRyaWJ1dGVzOworICoJY2FzZSBFWENMVVNJVkU6CisgKgkJY3JlYXRldmVyZjMgIHZlcmY7CisgKgl9OworICoKKyAqCXN0cnVjdCBDUkVBVEUzYXJncyB7CisgKgkJZGlyb3BhcmdzMwl3aGVyZTsKKyAqCQljcmVhdGVob3czCWhvdzsKKyAqCX07CisgKi8KK3N0YXRpYyB2b2lkIGVuY29kZV9jcmVhdGVob3czKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCisJCQkgICAgICBjb25zdCBzdHJ1Y3QgbmZzM19jcmVhdGVhcmdzICphcmdzKQoreworCWVuY29kZV91aW50MzIoeGRyLCBhcmdzLT5jcmVhdGVtb2RlKTsKKwlzd2l0Y2ggKGFyZ3MtPmNyZWF0ZW1vZGUpIHsKKwljYXNlIE5GUzNfQ1JFQVRFX1VOQ0hFQ0tFRDoKKwljYXNlIE5GUzNfQ1JFQVRFX0dVQVJERUQ6CisJCWVuY29kZV9zYXR0cjMoeGRyLCBhcmdzLT5zYXR0cik7CisJCWJyZWFrOworCWNhc2UgTkZTM19DUkVBVEVfRVhDTFVTSVZFOgorCQllbmNvZGVfY3JlYXRldmVyZjMoeGRyLCBhcmdzLT52ZXJpZmllcik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUJVRygpOworCX0KK30KKworc3RhdGljIHZvaWQgbmZzM194ZHJfZW5jX2NyZWF0ZTNhcmdzKHN0cnVjdCBycGNfcnFzdCAqcmVxLAorCQkJCSAgICAgc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKKwkJCQkgICAgIGNvbnN0IHN0cnVjdCBuZnMzX2NyZWF0ZWFyZ3MgKmFyZ3MpCit7CisJZW5jb2RlX2Rpcm9wYXJnczMoeGRyLCBhcmdzLT5maCwgYXJncy0+bmFtZSwgYXJncy0+bGVuKTsKKwllbmNvZGVfY3JlYXRlaG93Myh4ZHIsIGFyZ3MpOworfQorCisvKgorICogMy4zLjkgIE1LRElSM2FyZ3MKKyAqCisgKglzdHJ1Y3QgTUtESVIzYXJncyB7CisgKgkJZGlyb3BhcmdzMwl3aGVyZTsKKyAqCQlzYXR0cjMJCWF0dHJpYnV0ZXM7CisgKgl9OworICovCitzdGF0aWMgdm9pZCBuZnMzX3hkcl9lbmNfbWtkaXIzYXJncyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwKKwkJCQkgICAgc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKKwkJCQkgICAgY29uc3Qgc3RydWN0IG5mczNfbWtkaXJhcmdzICphcmdzKQoreworCWVuY29kZV9kaXJvcGFyZ3MzKHhkciwgYXJncy0+ZmgsIGFyZ3MtPm5hbWUsIGFyZ3MtPmxlbik7CisJZW5jb2RlX3NhdHRyMyh4ZHIsIGFyZ3MtPnNhdHRyKTsKK30KKworLyoKKyAqIDMuMy4xMCAgU1lNTElOSzNhcmdzCisgKgorICoJc3RydWN0IHN5bWxpbmtkYXRhMyB7CisgKgkJc2F0dHIzCQlzeW1saW5rX2F0dHJpYnV0ZXM7CisgKgkJbmZzcGF0aDMJc3ltbGlua19kYXRhOworICoJfTsKKyAqCisgKglzdHJ1Y3QgU1lNTElOSzNhcmdzIHsKKyAqCQlkaXJvcGFyZ3MzCXdoZXJlOworICoJCXN5bWxpbmtkYXRhMwlzeW1saW5rOworICoJfTsKKyAqLworc3RhdGljIHZvaWQgZW5jb2RlX3N5bWxpbmtkYXRhMyhzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAorCQkJCWNvbnN0IHN0cnVjdCBuZnMzX3N5bWxpbmthcmdzICphcmdzKQoreworCWVuY29kZV9zYXR0cjMoeGRyLCBhcmdzLT5zYXR0cik7CisJZW5jb2RlX25mc3BhdGgzKHhkciwgYXJncy0+cGFnZXMsIGFyZ3MtPnBhdGhsZW4pOworfQorCitzdGF0aWMgdm9pZCBuZnMzX3hkcl9lbmNfc3ltbGluazNhcmdzKHN0cnVjdCBycGNfcnFzdCAqcmVxLAorCQkJCSAgICAgIHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCisJCQkJICAgICAgY29uc3Qgc3RydWN0IG5mczNfc3ltbGlua2FyZ3MgKmFyZ3MpCit7CisJZW5jb2RlX2Rpcm9wYXJnczMoeGRyLCBhcmdzLT5mcm9tZmgsIGFyZ3MtPmZyb21uYW1lLCBhcmdzLT5mcm9tbGVuKTsKKwllbmNvZGVfc3ltbGlua2RhdGEzKHhkciwgYXJncyk7Cit9CisKKy8qCisgKiAzLjMuMTEgIE1LTk9EM2FyZ3MKKyAqCisgKglzdHJ1Y3QgZGV2aWNlZGF0YTMgeworICoJCXNhdHRyMwkJZGV2X2F0dHJpYnV0ZXM7CisgKgkJc3BlY2RhdGEzCXNwZWM7CisgKgl9OworICoKKyAqCXVuaW9uIG1rbm9kZGF0YTMgc3dpdGNoIChmdHlwZTMgdHlwZSkgeworICoJY2FzZSBORjNDSFI6CisgKgljYXNlIE5GM0JMSzoKKyAqCQlkZXZpY2VkYXRhMwlkZXZpY2U7CisgKgljYXNlIE5GM1NPQ0s6CisgKgljYXNlIE5GM0ZJRk86CisgKgkJc2F0dHIzCQlwaXBlX2F0dHJpYnV0ZXM7CisgKglkZWZhdWx0OgorICoJCXZvaWQ7CisgKgl9OworICoKKyAqCXN0cnVjdCBNS05PRDNhcmdzIHsKKyAqCQlkaXJvcGFyZ3MzCXdoZXJlOworICoJCW1rbm9kZGF0YTMJd2hhdDsKKyAqCX07CisgKi8KK3N0YXRpYyB2b2lkIGVuY29kZV9kZXZpY2VkYXRhMyhzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAorCQkJICAgICAgIGNvbnN0IHN0cnVjdCBuZnMzX21rbm9kYXJncyAqYXJncykKK3sKKwllbmNvZGVfc2F0dHIzKHhkciwgYXJncy0+c2F0dHIpOworCWVuY29kZV9zcGVjZGF0YTMoeGRyLCBhcmdzLT5yZGV2KTsKK30KKworc3RhdGljIHZvaWQgZW5jb2RlX21rbm9kZGF0YTMoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKKwkJCSAgICAgIGNvbnN0IHN0cnVjdCBuZnMzX21rbm9kYXJncyAqYXJncykKK3sKKwllbmNvZGVfZnR5cGUzKHhkciwgYXJncy0+dHlwZSk7CisJc3dpdGNoIChhcmdzLT50eXBlKSB7CisJY2FzZSBORjNDSFI6CisJY2FzZSBORjNCTEs6CisJCWVuY29kZV9kZXZpY2VkYXRhMyh4ZHIsIGFyZ3MpOworCQlicmVhazsKKwljYXNlIE5GM1NPQ0s6CisJY2FzZSBORjNGSUZPOgorCQllbmNvZGVfc2F0dHIzKHhkciwgYXJncy0+c2F0dHIpOworCQlicmVhazsKKwljYXNlIE5GM1JFRzoKKwljYXNlIE5GM0RJUjoKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJQlVHKCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBuZnMzX3hkcl9lbmNfbWtub2QzYXJncyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwKKwkJCQkgICAgc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKKwkJCQkgICAgY29uc3Qgc3RydWN0IG5mczNfbWtub2RhcmdzICphcmdzKQoreworCWVuY29kZV9kaXJvcGFyZ3MzKHhkciwgYXJncy0+ZmgsIGFyZ3MtPm5hbWUsIGFyZ3MtPmxlbik7CisJZW5jb2RlX21rbm9kZGF0YTMoeGRyLCBhcmdzKTsKK30KKworLyoKKyAqIDMuMy4xMiAgUkVNT1ZFM2FyZ3MKKyAqCisgKglzdHJ1Y3QgUkVNT1ZFM2FyZ3MgeworICoJCWRpcm9wYXJnczMgIG9iamVjdDsKKyAqCX07CisgKi8KK3N0YXRpYyB2b2lkIG5mczNfeGRyX2VuY19yZW1vdmUzYXJncyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwKKwkJCQkgICAgIHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCisJCQkJICAgICBjb25zdCBzdHJ1Y3QgbmZzX3JlbW92ZWFyZ3MgKmFyZ3MpCit7CisJZW5jb2RlX2Rpcm9wYXJnczMoeGRyLCBhcmdzLT5maCwgYXJncy0+bmFtZS5uYW1lLCBhcmdzLT5uYW1lLmxlbik7Cit9CisKKy8qCisgKiAzLjMuMTQgIFJFTkFNRTNhcmdzCisgKgorICoJc3RydWN0IFJFTkFNRTNhcmdzIHsKKyAqCQlkaXJvcGFyZ3MzCWZyb207CisgKgkJZGlyb3BhcmdzMwl0bzsKKyAqCX07CisgKi8KK3N0YXRpYyB2b2lkIG5mczNfeGRyX2VuY19yZW5hbWUzYXJncyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwKKwkJCQkgICAgIHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCisJCQkJICAgICBjb25zdCBzdHJ1Y3QgbmZzX3JlbmFtZWFyZ3MgKmFyZ3MpCit7CisJY29uc3Qgc3RydWN0IHFzdHIgKm9sZCA9IGFyZ3MtPm9sZF9uYW1lOworCWNvbnN0IHN0cnVjdCBxc3RyICpuZXcgPSBhcmdzLT5uZXdfbmFtZTsKKworCWVuY29kZV9kaXJvcGFyZ3MzKHhkciwgYXJncy0+b2xkX2Rpciwgb2xkLT5uYW1lLCBvbGQtPmxlbik7CisJZW5jb2RlX2Rpcm9wYXJnczMoeGRyLCBhcmdzLT5uZXdfZGlyLCBuZXctPm5hbWUsIG5ldy0+bGVuKTsKK30KKworLyoKKyAqIDMuMy4xNSAgTElOSzNhcmdzCisgKgorICoJc3RydWN0IExJTkszYXJncyB7CisgKgkJbmZzX2ZoMwkJZmlsZTsKKyAqCQlkaXJvcGFyZ3MzCWxpbms7CisgKgl9OworICovCitzdGF0aWMgdm9pZCBuZnMzX3hkcl9lbmNfbGluazNhcmdzKHN0cnVjdCBycGNfcnFzdCAqcmVxLAorCQkJCSAgIHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCisJCQkJICAgY29uc3Qgc3RydWN0IG5mczNfbGlua2FyZ3MgKmFyZ3MpCit7CisJZW5jb2RlX25mc19maDMoeGRyLCBhcmdzLT5mcm9tZmgpOworCWVuY29kZV9kaXJvcGFyZ3MzKHhkciwgYXJncy0+dG9maCwgYXJncy0+dG9uYW1lLCBhcmdzLT50b2xlbik7Cit9CisKKy8qCisgKiAzLjMuMTYgIFJFQURESVIzYXJncworICoKKyAqCXN0cnVjdCBSRUFERElSM2FyZ3MgeworICoJCW5mc19maDMJCWRpcjsKKyAqCQljb29raWUzCQljb29raWU7CisgKgkJY29va2lldmVyZjMJY29va2lldmVyZjsKKyAqCQljb3VudDMJCWNvdW50OworICoJfTsKKyAqLworc3RhdGljIHZvaWQgZW5jb2RlX3JlYWRkaXIzYXJncyhzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAorCQkJCWNvbnN0IHN0cnVjdCBuZnMzX3JlYWRkaXJhcmdzICphcmdzKQoreworCV9fYmUzMiAqcDsKKworCWVuY29kZV9uZnNfZmgzKHhkciwgYXJncy0+ZmgpOworCisJcCA9IHhkcl9yZXNlcnZlX3NwYWNlKHhkciwgOCArIE5GUzNfQ09PS0lFVkVSRlNJWkUgKyA0KTsKKwlwID0geGRyX2VuY29kZV9jb29raWUzKHAsIGFyZ3MtPmNvb2tpZSk7CisJcCA9IHhkcl9lbmNvZGVfY29va2lldmVyZjMocCwgYXJncy0+dmVyZik7CisJKnAgPSBjcHVfdG9fYmUzMihhcmdzLT5jb3VudCk7Cit9CisKK3N0YXRpYyB2b2lkIG5mczNfeGRyX2VuY19yZWFkZGlyM2FyZ3Moc3RydWN0IHJwY19ycXN0ICpyZXEsCisJCQkJICAgICAgc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKKwkJCQkgICAgICBjb25zdCBzdHJ1Y3QgbmZzM19yZWFkZGlyYXJncyAqYXJncykKK3sKKwllbmNvZGVfcmVhZGRpcjNhcmdzKHhkciwgYXJncyk7CisJcHJlcGFyZV9yZXBseV9idWZmZXIocmVxLCBhcmdzLT5wYWdlcywgMCwKKwkJCQlhcmdzLT5jb3VudCwgTkZTM19yZWFkZGlycmVzX3N6KTsKK30KKworLyoKKyAqIDMuMy4xNyAgUkVBRERJUlBMVVMzYXJncworICoKKyAqCXN0cnVjdCBSRUFERElSUExVUzNhcmdzIHsKKyAqCQluZnNfZmgzCQlkaXI7CisgKgkJY29va2llMwkJY29va2llOworICoJCWNvb2tpZXZlcmYzCWNvb2tpZXZlcmY7CisgKgkJY291bnQzCQlkaXJjb3VudDsKKyAqCQljb3VudDMJCW1heGNvdW50OworICoJfTsKKyAqLworc3RhdGljIHZvaWQgZW5jb2RlX3JlYWRkaXJwbHVzM2FyZ3Moc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKKwkJCQkgICAgY29uc3Qgc3RydWN0IG5mczNfcmVhZGRpcmFyZ3MgKmFyZ3MpCit7CisJX19iZTMyICpwOworCisJZW5jb2RlX25mc19maDMoeGRyLCBhcmdzLT5maCk7CisKKwlwID0geGRyX3Jlc2VydmVfc3BhY2UoeGRyLCA4ICsgTkZTM19DT09LSUVWRVJGU0laRSArIDQgKyA0KTsKKwlwID0geGRyX2VuY29kZV9jb29raWUzKHAsIGFyZ3MtPmNvb2tpZSk7CisJcCA9IHhkcl9lbmNvZGVfY29va2lldmVyZjMocCwgYXJncy0+dmVyZik7CisKKwkvKgorCSAqIHJlYWRkaXJwbHVzOiBuZWVkIGRpcmNvdW50ICsgYnVmZmVyIHNpemUuCisJICogV2UganVzdCBtYWtlIHN1cmUgd2UgbWFrZSBkaXJjb3VudCBiaWcgZW5vdWdoCisJICovCisJKnArKyA9IGNwdV90b19iZTMyKGFyZ3MtPmNvdW50ID4+IDMpOworCisJKnAgPSBjcHVfdG9fYmUzMihhcmdzLT5jb3VudCk7Cit9CisKK3N0YXRpYyB2b2lkIG5mczNfeGRyX2VuY19yZWFkZGlycGx1czNhcmdzKHN0cnVjdCBycGNfcnFzdCAqcmVxLAorCQkJCQkgIHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCisJCQkJCSAgY29uc3Qgc3RydWN0IG5mczNfcmVhZGRpcmFyZ3MgKmFyZ3MpCit7CisJZW5jb2RlX3JlYWRkaXJwbHVzM2FyZ3MoeGRyLCBhcmdzKTsKKwlwcmVwYXJlX3JlcGx5X2J1ZmZlcihyZXEsIGFyZ3MtPnBhZ2VzLCAwLAorCQkJCWFyZ3MtPmNvdW50LCBORlMzX3JlYWRkaXJyZXNfc3opOworfQorCisvKgorICogMy4zLjIxICBDT01NSVQzYXJncworICoKKyAqCXN0cnVjdCBDT01NSVQzYXJncyB7CisgKgkJbmZzX2ZoMwkJZmlsZTsKKyAqCQlvZmZzZXQzCQlvZmZzZXQ7CisgKgkJY291bnQzCQljb3VudDsKKyAqCX07CisgKi8KK3N0YXRpYyB2b2lkIGVuY29kZV9jb21taXQzYXJncyhzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAorCQkJICAgICAgIGNvbnN0IHN0cnVjdCBuZnNfd3JpdGVhcmdzICphcmdzKQoreworCV9fYmUzMiAqcDsKKworCWVuY29kZV9uZnNfZmgzKHhkciwgYXJncy0+ZmgpOworCisJcCA9IHhkcl9yZXNlcnZlX3NwYWNlKHhkciwgOCArIDQpOworCXAgPSB4ZHJfZW5jb2RlX2h5cGVyKHAsIGFyZ3MtPm9mZnNldCk7CisJKnAgPSBjcHVfdG9fYmUzMihhcmdzLT5jb3VudCk7Cit9CisKK3N0YXRpYyB2b2lkIG5mczNfeGRyX2VuY19jb21taXQzYXJncyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwKKwkJCQkgICAgIHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCisJCQkJICAgICBjb25zdCBzdHJ1Y3QgbmZzX3dyaXRlYXJncyAqYXJncykKK3sKKwllbmNvZGVfY29tbWl0M2FyZ3MoeGRyLCBhcmdzKTsKIH0KIAogI2lmZGVmIENPTkZJR19ORlNfVjNfQUNMCi0vKgotICogRW5jb2RlIEdFVEFDTCBhcmd1bWVudHMKLSAqLwotc3RhdGljIGludAotbmZzM194ZHJfZ2V0YWNsYXJncyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLAotCQkgICAgc3RydWN0IG5mczNfZ2V0YWNsYXJncyAqYXJncykKKworc3RhdGljIHZvaWQgbmZzM194ZHJfZW5jX2dldGFjbDNhcmdzKHN0cnVjdCBycGNfcnFzdCAqcmVxLAorCQkJCSAgICAgc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKKwkJCQkgICAgIGNvbnN0IHN0cnVjdCBuZnMzX2dldGFjbGFyZ3MgKmFyZ3MpCiB7Ci0Jc3RydWN0IHJwY19hdXRoCSphdXRoID0gcmVxLT5ycV9jcmVkLT5jcl9hdXRoOwotCXVuc2lnbmVkIGludCByZXBsZW47Ci0KLQlwID0geGRyX2VuY29kZV9maGFuZGxlKHAsIGFyZ3MtPmZoKTsKLQkqcCsrID0gaHRvbmwoYXJncy0+bWFzayk7Ci0JcmVxLT5ycV9zbGVuID0geGRyX2FkanVzdF9pb3ZlYyhyZXEtPnJxX3N2ZWMsIHApOwotCi0JaWYgKGFyZ3MtPm1hc2sgJiAoTkZTX0FDTCB8IE5GU19ERkFDTCkpIHsKLQkJLyogSW5saW5lIHRoZSBwYWdlIGFycmF5ICovCi0JCXJlcGxlbiA9IChSUENfUkVQSERSU0laRSArIGF1dGgtPmF1X3JzbGFjayArCi0JCQkgIEFDTDNfZ2V0YWNscmVzX3N6KSA8PCAyOwotCQl4ZHJfaW5saW5lX3BhZ2VzKCZyZXEtPnJxX3Jjdl9idWYsIHJlcGxlbiwgYXJncy0+cGFnZXMsIDAsCi0JCQkJIE5GU0FDTF9NQVhQQUdFUyA8PCBQQUdFX1NISUZUKTsKLQl9Ci0JcmV0dXJuIDA7CisJZW5jb2RlX25mc19maDMoeGRyLCBhcmdzLT5maCk7CisJZW5jb2RlX3VpbnQzMih4ZHIsIGFyZ3MtPm1hc2spOworCWlmIChhcmdzLT5tYXNrICYgKE5GU19BQ0wgfCBORlNfREZBQ0wpKQorCQlwcmVwYXJlX3JlcGx5X2J1ZmZlcihyZXEsIGFyZ3MtPnBhZ2VzLCAwLAorCQkJCQlORlNBQ0xfTUFYUEFHRVMgPDwgUEFHRV9TSElGVCwKKwkJCQkJQUNMM19nZXRhY2xyZXNfc3opOwogfQogCi0vKgotICogRW5jb2RlIFNFVEFDTCBhcmd1bWVudHMKLSAqLwotc3RhdGljIGludAotbmZzM194ZHJfc2V0YWNsYXJncyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLAotICAgICAgICAgICAgICAgICAgIHN0cnVjdCBuZnMzX3NldGFjbGFyZ3MgKmFyZ3MpCitzdGF0aWMgdm9pZCBuZnMzX3hkcl9lbmNfc2V0YWNsM2FyZ3Moc3RydWN0IHJwY19ycXN0ICpyZXEsCisJCQkJICAgICBzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAorCQkJCSAgICAgY29uc3Qgc3RydWN0IG5mczNfc2V0YWNsYXJncyAqYXJncykKIHsKLQlzdHJ1Y3QgeGRyX2J1ZiAqYnVmID0gJnJlcS0+cnFfc25kX2J1ZjsKIAl1bnNpZ25lZCBpbnQgYmFzZTsKLQlpbnQgZXJyOworCWludCBlcnJvcjsKIAotCXAgPSB4ZHJfZW5jb2RlX2ZoYW5kbGUocCwgTkZTX0ZIKGFyZ3MtPmlub2RlKSk7Ci0JKnArKyA9IGh0b25sKGFyZ3MtPm1hc2spOwotCXJlcS0+cnFfc2xlbiA9IHhkcl9hZGp1c3RfaW92ZWMocmVxLT5ycV9zdmVjLCBwKTsKLQliYXNlID0gcmVxLT5ycV9zbGVuOwotCisJZW5jb2RlX25mc19maDMoeGRyLCBORlNfRkgoYXJncy0+aW5vZGUpKTsKKwllbmNvZGVfdWludDMyKHhkciwgYXJncy0+bWFzayk7CiAJaWYgKGFyZ3MtPm5wYWdlcyAhPSAwKQotCQl4ZHJfZW5jb2RlX3BhZ2VzKGJ1ZiwgYXJncy0+cGFnZXMsIDAsIGFyZ3MtPmxlbik7Ci0JZWxzZQotCQlyZXEtPnJxX3NsZW4gPSB4ZHJfYWRqdXN0X2lvdmVjKHJlcS0+cnFfc3ZlYywKLQkJCQlwICsgWERSX1FVQURMRU4oYXJncy0+bGVuKSk7CisJCXhkcl93cml0ZV9wYWdlcyh4ZHIsIGFyZ3MtPnBhZ2VzLCAwLCBhcmdzLT5sZW4pOwogCi0JZXJyID0gbmZzYWNsX2VuY29kZShidWYsIGJhc2UsIGFyZ3MtPmlub2RlLAorCWJhc2UgPSByZXEtPnJxX3NsZW47CisJZXJyb3IgPSBuZnNhY2xfZW5jb2RlKHhkci0+YnVmLCBiYXNlLCBhcmdzLT5pbm9kZSwKIAkJCSAgICAoYXJncy0+bWFzayAmIE5GU19BQ0wpID8KIAkJCSAgICBhcmdzLT5hY2xfYWNjZXNzIDogTlVMTCwgMSwgMCk7Ci0JaWYgKGVyciA+IDApCi0JCWVyciA9IG5mc2FjbF9lbmNvZGUoYnVmLCBiYXNlICsgZXJyLCBhcmdzLT5pbm9kZSwKLQkJCQkgICAgKGFyZ3MtPm1hc2sgJiBORlNfREZBQ0wpID8KLQkJCQkgICAgYXJncy0+YWNsX2RlZmF1bHQgOiBOVUxMLCAxLAotCQkJCSAgICBORlNfQUNMX0RFRkFVTFQpOwotCXJldHVybiAoZXJyID4gMCkgPyAwIDogZXJyOworCUJVR19PTihlcnJvciA8IDApOworCWVycm9yID0gbmZzYWNsX2VuY29kZSh4ZHItPmJ1ZiwgYmFzZSArIGVycm9yLCBhcmdzLT5pbm9kZSwKKwkJCSAgICAoYXJncy0+bWFzayAmIE5GU19ERkFDTCkgPworCQkJICAgIGFyZ3MtPmFjbF9kZWZhdWx0IDogTlVMTCwgMSwKKwkJCSAgICBORlNfQUNMX0RFRkFVTFQpOworCUJVR19PTihlcnJvciA8IDApOwogfQorCiAjZW5kaWYgIC8qIENPTkZJR19ORlNfVjNfQUNMICovCiAKIC8qCi0gKiBORlMgWERSIGRlY29kZSBmdW5jdGlvbnMKKyAqIE5GU3YzIFhEUiBkZWNvZGUgZnVuY3Rpb25zCisgKgorICogTkZTdjMgcmVzdWx0IHR5cGVzIGFyZSBkZWZpbmVkIGluIHNlY3Rpb24gMy4zIG9mIFJGQyAxODEzOgorICogIk5GUyBWZXJzaW9uIDMgUHJvdG9jb2wgU3BlY2lmaWNhdGlvbiIuCiAgKi8KIAogLyoKLSAqIERlY29kZSBhdHRyc3RhdCByZXBseS4KKyAqIDMuMy4xICBHRVRBVFRSM3JlcworICoKKyAqCXN0cnVjdCBHRVRBVFRSM3Jlc29rIHsKKyAqCQlmYXR0cjMJCW9ial9hdHRyaWJ1dGVzOworICoJfTsKKyAqCisgKgl1bmlvbiBHRVRBVFRSM3JlcyBzd2l0Y2ggKG5mc3N0YXQzIHN0YXR1cykgeworICoJY2FzZSBORlMzX09LOgorICoJCUdFVEFUVFIzcmVzb2sgIHJlc29rOworICoJZGVmYXVsdDoKKyAqCQl2b2lkOworICoJfTsKICAqLwotc3RhdGljIGludAotbmZzM194ZHJfYXR0cnN0YXQoc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgc3RydWN0IG5mc19mYXR0ciAqZmF0dHIpCitzdGF0aWMgaW50IG5mczNfeGRyX2RlY19nZXRhdHRyM3JlcyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwKKwkJCQkgICAgc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKKwkJCQkgICAgc3RydWN0IG5mc19mYXR0ciAqcmVzdWx0KQogewotCWludAlzdGF0dXM7CisJZW51bSBuZnNfc3RhdCBzdGF0dXM7CisJaW50IGVycm9yOwogCi0JaWYgKChzdGF0dXMgPSBudG9obCgqcCsrKSkpCi0JCXJldHVybiBuZnNfc3RhdF90b19lcnJubyhzdGF0dXMpOwotCXhkcl9kZWNvZGVfZmF0dHIocCwgZmF0dHIpOwotCXJldHVybiAwOworCWVycm9yID0gZGVjb2RlX25mc3N0YXQzKHhkciwgJnN0YXR1cyk7CisJaWYgKHVubGlrZWx5KGVycm9yKSkKKwkJZ290byBvdXQ7CisJaWYgKHN0YXR1cyAhPSBORlMzX09LKQorCQlnb3RvIG91dF9kZWZhdWx0OworCWVycm9yID0gZGVjb2RlX2ZhdHRyMyh4ZHIsIHJlc3VsdCk7CitvdXQ6CisJcmV0dXJuIGVycm9yOworb3V0X2RlZmF1bHQ6CisJcmV0dXJuIG5mc19zdGF0X3RvX2Vycm5vKHN0YXR1cyk7CiB9CiAKIC8qCi0gKiBEZWNvZGUgc3RhdHVzK3djY19kYXRhIHJlcGx5Ci0gKiBTQVRUUiwgUkVNT1ZFLCBSTURJUgorICogMy4zLjIgIFNFVEFUVFIzcmVzCisgKgorICoJc3RydWN0IFNFVEFUVFIzcmVzb2sgeworICoJCXdjY19kYXRhICBvYmpfd2NjOworICoJfTsKKyAqCisgKglzdHJ1Y3QgU0VUQVRUUjNyZXNmYWlsIHsKKyAqCQl3Y2NfZGF0YSAgb2JqX3djYzsKKyAqCX07CisgKgorICoJdW5pb24gU0VUQVRUUjNyZXMgc3dpdGNoIChuZnNzdGF0MyBzdGF0dXMpIHsKKyAqCWNhc2UgTkZTM19PSzoKKyAqCQlTRVRBVFRSM3Jlc29rICAgcmVzb2s7CisgKglkZWZhdWx0OgorICoJCVNFVEFUVFIzcmVzZmFpbCByZXNmYWlsOworICoJfTsKICAqLwotc3RhdGljIGludAotbmZzM194ZHJfd2Njc3RhdChzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLCBzdHJ1Y3QgbmZzX2ZhdHRyICpmYXR0cikKK3N0YXRpYyBpbnQgbmZzM194ZHJfZGVjX3NldGF0dHIzcmVzKHN0cnVjdCBycGNfcnFzdCAqcmVxLAorCQkJCSAgICBzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAorCQkJCSAgICBzdHJ1Y3QgbmZzX2ZhdHRyICpyZXN1bHQpCiB7Ci0JaW50CXN0YXR1czsKKwllbnVtIG5mc19zdGF0IHN0YXR1czsKKwlpbnQgZXJyb3I7CiAKLQlpZiAoKHN0YXR1cyA9IG50b2hsKCpwKyspKSkKLQkJc3RhdHVzID0gbmZzX3N0YXRfdG9fZXJybm8oc3RhdHVzKTsKLQl4ZHJfZGVjb2RlX3djY19kYXRhKHAsIGZhdHRyKTsKLQlyZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0aWMgaW50Ci1uZnMzX3hkcl9yZW1vdmVyZXMoc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgc3RydWN0IG5mc19yZW1vdmVyZXMgKnJlcykKLXsKLQlyZXR1cm4gbmZzM194ZHJfd2Njc3RhdChyZXEsIHAsIHJlcy0+ZGlyX2F0dHIpOworCWVycm9yID0gZGVjb2RlX25mc3N0YXQzKHhkciwgJnN0YXR1cyk7CisJaWYgKHVubGlrZWx5KGVycm9yKSkKKwkJZ290byBvdXQ7CisJZXJyb3IgPSBkZWNvZGVfd2NjX2RhdGEoeGRyLCByZXN1bHQpOworCWlmICh1bmxpa2VseShlcnJvcikpCisJCWdvdG8gb3V0OworCWlmIChzdGF0dXMgIT0gTkZTM19PSykKKwkJZ290byBvdXRfc3RhdHVzOworb3V0OgorCXJldHVybiBlcnJvcjsKK291dF9zdGF0dXM6CisJcmV0dXJuIG5mc19zdGF0X3RvX2Vycm5vKHN0YXR1cyk7CiB9CiAKIC8qCi0gKiBEZWNvZGUgTE9PS1VQIHJlcGx5CisgKiAzLjMuMyAgTE9PS1VQM3JlcworICoKKyAqCXN0cnVjdCBMT09LVVAzcmVzb2sgeworICoJCW5mc19maDMJCW9iamVjdDsKKyAqCQlwb3N0X29wX2F0dHIJb2JqX2F0dHJpYnV0ZXM7CisgKgkJcG9zdF9vcF9hdHRyCWRpcl9hdHRyaWJ1dGVzOworICoJfTsKKyAqCisgKglzdHJ1Y3QgTE9PS1VQM3Jlc2ZhaWwgeworICoJCXBvc3Rfb3BfYXR0cglkaXJfYXR0cmlidXRlczsKKyAqCX07CisgKgorICoJdW5pb24gTE9PS1VQM3JlcyBzd2l0Y2ggKG5mc3N0YXQzIHN0YXR1cykgeworICoJY2FzZSBORlMzX09LOgorICoJCUxPT0tVUDNyZXNvawlyZXNvazsKKyAqCWRlZmF1bHQ6CisgKgkJTE9PS1VQM3Jlc2ZhaWwJcmVzZmFpbDsKKyAqCX07CiAgKi8KLXN0YXRpYyBpbnQKLW5mczNfeGRyX2xvb2t1cHJlcyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLCBzdHJ1Y3QgbmZzM19kaXJvcHJlcyAqcmVzKQorc3RhdGljIGludCBuZnMzX3hkcl9kZWNfbG9va3VwM3JlcyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwKKwkJCQkgICBzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAorCQkJCSAgIHN0cnVjdCBuZnMzX2Rpcm9wcmVzICpyZXN1bHQpCiB7Ci0JaW50CXN0YXR1czsKKwllbnVtIG5mc19zdGF0IHN0YXR1czsKKwlpbnQgZXJyb3I7CiAKLQlpZiAoKHN0YXR1cyA9IG50b2hsKCpwKyspKSkgewotCQlzdGF0dXMgPSBuZnNfc3RhdF90b19lcnJubyhzdGF0dXMpOwotCX0gZWxzZSB7Ci0JCWlmICghKHAgPSB4ZHJfZGVjb2RlX2ZoYW5kbGUocCwgcmVzLT5maCkpKQotCQkJcmV0dXJuIC1lcnJub19ORlNFUlJfSU87Ci0JCXAgPSB4ZHJfZGVjb2RlX3Bvc3Rfb3BfYXR0cihwLCByZXMtPmZhdHRyKTsKLQl9Ci0JeGRyX2RlY29kZV9wb3N0X29wX2F0dHIocCwgcmVzLT5kaXJfYXR0cik7Ci0JcmV0dXJuIHN0YXR1czsKKwllcnJvciA9IGRlY29kZV9uZnNzdGF0Myh4ZHIsICZzdGF0dXMpOworCWlmICh1bmxpa2VseShlcnJvcikpCisJCWdvdG8gb3V0OworCWlmIChzdGF0dXMgIT0gTkZTM19PSykKKwkJZ290byBvdXRfZGVmYXVsdDsKKwllcnJvciA9IGRlY29kZV9uZnNfZmgzKHhkciwgcmVzdWx0LT5maCk7CisJaWYgKHVubGlrZWx5KGVycm9yKSkKKwkJZ290byBvdXQ7CisJZXJyb3IgPSBkZWNvZGVfcG9zdF9vcF9hdHRyKHhkciwgcmVzdWx0LT5mYXR0cik7CisJaWYgKHVubGlrZWx5KGVycm9yKSkKKwkJZ290byBvdXQ7CisJZXJyb3IgPSBkZWNvZGVfcG9zdF9vcF9hdHRyKHhkciwgcmVzdWx0LT5kaXJfYXR0cik7CitvdXQ6CisJcmV0dXJuIGVycm9yOworb3V0X2RlZmF1bHQ6CisJZXJyb3IgPSBkZWNvZGVfcG9zdF9vcF9hdHRyKHhkciwgcmVzdWx0LT5kaXJfYXR0cik7CisJaWYgKHVubGlrZWx5KGVycm9yKSkKKwkJZ290byBvdXQ7CisJcmV0dXJuIG5mc19zdGF0X3RvX2Vycm5vKHN0YXR1cyk7CiB9CiAKIC8qCi0gKiBEZWNvZGUgQUNDRVNTIHJlcGx5CisgKiAzLjMuNCAgQUNDRVNTM3JlcworICoKKyAqCXN0cnVjdCBBQ0NFU1MzcmVzb2sgeworICoJCXBvc3Rfb3BfYXR0cglvYmpfYXR0cmlidXRlczsKKyAqCQl1aW50MzIJCWFjY2VzczsKKyAqCX07CisgKgorICoJc3RydWN0IEFDQ0VTUzNyZXNmYWlsIHsKKyAqCQlwb3N0X29wX2F0dHIJb2JqX2F0dHJpYnV0ZXM7CisgKgl9OworICoKKyAqCXVuaW9uIEFDQ0VTUzNyZXMgc3dpdGNoIChuZnNzdGF0MyBzdGF0dXMpIHsKKyAqCWNhc2UgTkZTM19PSzoKKyAqCQlBQ0NFU1MzcmVzb2sJcmVzb2s7CisgKglkZWZhdWx0OgorICoJCUFDQ0VTUzNyZXNmYWlsCXJlc2ZhaWw7CisgKgl9OwogICovCi1zdGF0aWMgaW50Ci1uZnMzX3hkcl9hY2Nlc3NyZXMoc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgc3RydWN0IG5mczNfYWNjZXNzcmVzICpyZXMpCitzdGF0aWMgaW50IG5mczNfeGRyX2RlY19hY2Nlc3MzcmVzKHN0cnVjdCBycGNfcnFzdCAqcmVxLAorCQkJCSAgIHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCisJCQkJICAgc3RydWN0IG5mczNfYWNjZXNzcmVzICpyZXN1bHQpCiB7Ci0JaW50CXN0YXR1cyA9IG50b2hsKCpwKyspOworCWVudW0gbmZzX3N0YXQgc3RhdHVzOworCWludCBlcnJvcjsKIAotCXAgPSB4ZHJfZGVjb2RlX3Bvc3Rfb3BfYXR0cihwLCByZXMtPmZhdHRyKTsKLQlpZiAoc3RhdHVzKQotCQlyZXR1cm4gbmZzX3N0YXRfdG9fZXJybm8oc3RhdHVzKTsKLQlyZXMtPmFjY2VzcyA9IG50b2hsKCpwKyspOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50Ci1uZnMzX3hkcl9yZWFkbGlua2FyZ3Moc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgc3RydWN0IG5mczNfcmVhZGxpbmthcmdzICphcmdzKQotewotCXN0cnVjdCBycGNfYXV0aAkqYXV0aCA9IHJlcS0+cnFfY3JlZC0+Y3JfYXV0aDsKLQl1bnNpZ25lZCBpbnQgcmVwbGVuOwotCi0JcCA9IHhkcl9lbmNvZGVfZmhhbmRsZShwLCBhcmdzLT5maCk7Ci0JcmVxLT5ycV9zbGVuID0geGRyX2FkanVzdF9pb3ZlYyhyZXEtPnJxX3N2ZWMsIHApOwotCi0JLyogSW5saW5lIHRoZSBwYWdlIGFycmF5ICovCi0JcmVwbGVuID0gKFJQQ19SRVBIRFJTSVpFICsgYXV0aC0+YXVfcnNsYWNrICsgTkZTM19yZWFkbGlua3Jlc19zeikgPDwgMjsKLQl4ZHJfaW5saW5lX3BhZ2VzKCZyZXEtPnJxX3Jjdl9idWYsIHJlcGxlbiwgYXJncy0+cGFnZXMsIGFyZ3MtPnBnYmFzZSwgYXJncy0+cGdsZW4pOwotCXJldHVybiAwOworCWVycm9yID0gZGVjb2RlX25mc3N0YXQzKHhkciwgJnN0YXR1cyk7CisJaWYgKHVubGlrZWx5KGVycm9yKSkKKwkJZ290byBvdXQ7CisJZXJyb3IgPSBkZWNvZGVfcG9zdF9vcF9hdHRyKHhkciwgcmVzdWx0LT5mYXR0cik7CisJaWYgKHVubGlrZWx5KGVycm9yKSkKKwkJZ290byBvdXQ7CisJaWYgKHN0YXR1cyAhPSBORlMzX09LKQorCQlnb3RvIG91dF9kZWZhdWx0OworCWVycm9yID0gZGVjb2RlX3VpbnQzMih4ZHIsICZyZXN1bHQtPmFjY2Vzcyk7CitvdXQ6CisJcmV0dXJuIGVycm9yOworb3V0X2RlZmF1bHQ6CisJcmV0dXJuIG5mc19zdGF0X3RvX2Vycm5vKHN0YXR1cyk7CiB9CiAKIC8qCi0gKiBEZWNvZGUgUkVBRExJTksgcmVwbHkKKyAqIDMuMy41ICBSRUFETElOSzNyZXMKKyAqCisgKglzdHJ1Y3QgUkVBRExJTkszcmVzb2sgeworICoJCXBvc3Rfb3BfYXR0cglzeW1saW5rX2F0dHJpYnV0ZXM7CisgKgkJbmZzcGF0aDMJZGF0YTsKKyAqCX07CisgKgorICoJc3RydWN0IFJFQURMSU5LM3Jlc2ZhaWwgeworICoJCXBvc3Rfb3BfYXR0cglzeW1saW5rX2F0dHJpYnV0ZXM7CisgKgl9OworICoKKyAqCXVuaW9uIFJFQURMSU5LM3JlcyBzd2l0Y2ggKG5mc3N0YXQzIHN0YXR1cykgeworICoJY2FzZSBORlMzX09LOgorICoJCVJFQURMSU5LM3Jlc29rCXJlc29rOworICoJZGVmYXVsdDoKKyAqCQlSRUFETElOSzNyZXNmYWlsIHJlc2ZhaWw7CisgKgl9OwogICovCi1zdGF0aWMgaW50Ci1uZnMzX3hkcl9yZWFkbGlua3JlcyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLCBzdHJ1Y3QgbmZzX2ZhdHRyICpmYXR0cikKK3N0YXRpYyBpbnQgbmZzM194ZHJfZGVjX3JlYWRsaW5rM3JlcyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwKKwkJCQkgICAgIHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCisJCQkJICAgICBzdHJ1Y3QgbmZzX2ZhdHRyICpyZXN1bHQpCiB7Ci0Jc3RydWN0IHhkcl9idWYgKnJjdmJ1ZiA9ICZyZXEtPnJxX3Jjdl9idWY7Ci0Jc3RydWN0IGt2ZWMgKmlvdiA9IHJjdmJ1Zi0+aGVhZDsKKwllbnVtIG5mc19zdGF0IHN0YXR1czsKKwlpbnQgZXJyb3I7CisKKwllcnJvciA9IGRlY29kZV9uZnNzdGF0Myh4ZHIsICZzdGF0dXMpOworCWlmICh1bmxpa2VseShlcnJvcikpCisJCWdvdG8gb3V0OworCWVycm9yID0gZGVjb2RlX3Bvc3Rfb3BfYXR0cih4ZHIsIHJlc3VsdCk7CisJaWYgKHVubGlrZWx5KGVycm9yKSkKKwkJZ290byBvdXQ7CisJaWYgKHN0YXR1cyAhPSBORlMzX09LKQorCQlnb3RvIG91dF9kZWZhdWx0OworCWVycm9yID0gZGVjb2RlX25mc3BhdGgzKHhkcik7CitvdXQ6CisJcmV0dXJuIGVycm9yOworb3V0X2RlZmF1bHQ6CisJcmV0dXJuIG5mc19zdGF0X3RvX2Vycm5vKHN0YXR1cyk7Cit9CisKKy8qCisgKiAzLjMuNiAgUkVBRDNyZXMKKyAqCisgKglzdHJ1Y3QgUkVBRDNyZXNvayB7CisgKgkJcG9zdF9vcF9hdHRyCWZpbGVfYXR0cmlidXRlczsKKyAqCQljb3VudDMJCWNvdW50OworICoJCWJvb2wJCWVvZjsKKyAqCQlvcGFxdWUJCWRhdGE8PjsKKyAqCX07CisgKgorICoJc3RydWN0IFJFQUQzcmVzZmFpbCB7CisgKgkJcG9zdF9vcF9hdHRyCWZpbGVfYXR0cmlidXRlczsKKyAqCX07CisgKgorICoJdW5pb24gUkVBRDNyZXMgc3dpdGNoIChuZnNzdGF0MyBzdGF0dXMpIHsKKyAqCWNhc2UgTkZTM19PSzoKKyAqCQlSRUFEM3Jlc29rCXJlc29rOworICoJZGVmYXVsdDoKKyAqCQlSRUFEM3Jlc2ZhaWwJcmVzZmFpbDsKKyAqCX07CisgKi8KK3N0YXRpYyBpbnQgZGVjb2RlX3JlYWQzcmVzb2soc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKKwkJCSAgICAgc3RydWN0IG5mc19yZWFkcmVzICpyZXN1bHQpCit7CisJdTMyIGVvZiwgY291bnQsIG9jb3VudCwgcmVjdmQ7CiAJc2l6ZV90IGhkcmxlbjsKLQl1MzIgbGVuLCByZWN2ZDsKLQlpbnQJc3RhdHVzOworCV9fYmUzMiAqcDsKIAotCXN0YXR1cyA9IG50b2hsKCpwKyspOwotCXAgPSB4ZHJfZGVjb2RlX3Bvc3Rfb3BfYXR0cihwLCBmYXR0cik7CisJcCA9IHhkcl9pbmxpbmVfZGVjb2RlKHhkciwgNCArIDQgKyA0KTsKKwlpZiAodW5saWtlbHkocCA9PSBOVUxMKSkKKwkJZ290byBvdXRfb3ZlcmZsb3c7CisJY291bnQgPSBiZTMyX3RvX2NwdXAocCsrKTsKKwllb2YgPSBiZTMyX3RvX2NwdXAocCsrKTsKKwlvY291bnQgPSBiZTMyX3RvX2NwdXAocCsrKTsKKwlpZiAodW5saWtlbHkob2NvdW50ICE9IGNvdW50KSkKKwkJZ290byBvdXRfbWlzbWF0Y2g7CisJaGRybGVuID0gKHU4ICopeGRyLT5wIC0gKHU4ICopeGRyLT5pb3YtPmlvdl9iYXNlOworCXJlY3ZkID0geGRyLT5idWYtPmxlbiAtIGhkcmxlbjsKKwlpZiAodW5saWtlbHkoY291bnQgPiByZWN2ZCkpCisJCWdvdG8gb3V0X2NoZWF0aW5nOwogCi0JaWYgKHN0YXR1cyAhPSAwKQotCQlyZXR1cm4gbmZzX3N0YXRfdG9fZXJybm8oc3RhdHVzKTsKLQotCS8qIENvbnZlcnQgbGVuZ3RoIG9mIHN5bWxpbmsgKi8KLQlsZW4gPSBudG9obCgqcCsrKTsKLQlpZiAobGVuID49IHJjdmJ1Zi0+cGFnZV9sZW4pIHsKLQkJZHByaW50aygibmZzOiBzZXJ2ZXIgcmV0dXJuZWQgZ2lhbnQgc3ltbGluayFcbiIpOwotCQlyZXR1cm4gLUVOQU1FVE9PTE9ORzsKLQl9Ci0KLQloZHJsZW4gPSAodTggKikgcCAtICh1OCAqKSBpb3YtPmlvdl9iYXNlOwotCWlmIChpb3YtPmlvdl9sZW4gPCBoZHJsZW4pIHsKLQkJZHByaW50aygiTkZTOiBSRUFETElOSyByZXBseSBoZWFkZXIgb3ZlcmZsb3dlZDoiCi0JCQkJImxlbmd0aCAlWnUgPiAlWnVcbiIsIGhkcmxlbiwgaW92LT5pb3ZfbGVuKTsKLQkJcmV0dXJuIC1lcnJub19ORlNFUlJfSU87Ci0JfSBlbHNlIGlmIChpb3YtPmlvdl9sZW4gIT0gaGRybGVuKSB7Ci0JCWRwcmludGsoIk5GUzogUkVBRExJTksgaGVhZGVyIGlzIHNob3J0LiAiCi0JCQkiaW92ZWMgd2lsbCBiZSBzaGlmdGVkLlxuIik7Ci0JCXhkcl9zaGlmdF9idWYocmN2YnVmLCBpb3YtPmlvdl9sZW4gLSBoZHJsZW4pOwotCX0KLQlyZWN2ZCA9IHJlcS0+cnFfcmN2X2J1Zi5sZW4gLSBoZHJsZW47Ci0JaWYgKHJlY3ZkIDwgbGVuKSB7Ci0JCWRwcmludGsoIk5GUzogc2VydmVyIGNoZWF0aW5nIGluIHJlYWRsaW5rIHJlcGx5OiAiCi0JCQkJImNvdW50ICV1ID4gcmVjdmQgJXVcbiIsIGxlbiwgcmVjdmQpOwotCQlyZXR1cm4gLUVJTzsKLQl9Ci0KLQl4ZHJfdGVybWluYXRlX3N0cmluZyhyY3ZidWYsIGxlbik7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBEZWNvZGUgUkVBRCByZXBseQotICovCi1zdGF0aWMgaW50Ci1uZnMzX3hkcl9yZWFkcmVzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsIHN0cnVjdCBuZnNfcmVhZHJlcyAqcmVzKQotewotCXN0cnVjdCBrdmVjICppb3YgPSByZXEtPnJxX3Jjdl9idWYuaGVhZDsKLQlzaXplX3QgaGRybGVuOwotCXUzMiBjb3VudCwgb2NvdW50LCByZWN2ZDsKLQlpbnQgc3RhdHVzOwotCi0Jc3RhdHVzID0gbnRvaGwoKnArKyk7Ci0JcCA9IHhkcl9kZWNvZGVfcG9zdF9vcF9hdHRyKHAsIHJlcy0+ZmF0dHIpOwotCi0JaWYgKHN0YXR1cyAhPSAwKQotCQlyZXR1cm4gbmZzX3N0YXRfdG9fZXJybm8oc3RhdHVzKTsKLQotCS8qIERlY29kZSByZXBseSBjb3VudCBhbmQgRU9GIGZsYWcuIE5GU3YzIGlzIHNvbWV3aGF0IHJlZHVuZGFudAotCSAqIGluIHRoYXQgaXQgcHV0cyB0aGUgY291bnQgYm90aCBpbiB0aGUgcmVzIHN0cnVjdCBhbmQgaW4gdGhlCi0JICogb3BhcXVlIGRhdGEgY291bnQuICovCi0JY291bnQgICAgPSBudG9obCgqcCsrKTsKLQlyZXMtPmVvZiA9IG50b2hsKCpwKyspOwotCW9jb3VudCAgID0gbnRvaGwoKnArKyk7Ci0KLQlpZiAob2NvdW50ICE9IGNvdW50KSB7Ci0JCWRwcmludGsoIk5GUzogUkVBRCBjb3VudCBkb2Vzbid0IG1hdGNoIFJQQyBvcGFxdWUgY291bnQuXG4iKTsKLQkJcmV0dXJuIC1lcnJub19ORlNFUlJfSU87Ci0JfQotCi0JaGRybGVuID0gKHU4ICopIHAgLSAodTggKikgaW92LT5pb3ZfYmFzZTsKLQlpZiAoaW92LT5pb3ZfbGVuIDwgaGRybGVuKSB7Ci0JCWRwcmludGsoIk5GUzogUkVBRCByZXBseSBoZWFkZXIgb3ZlcmZsb3dlZDoiCi0JCQkJImxlbmd0aCAlWnUgPiAlWnVcbiIsIGhkcmxlbiwgaW92LT5pb3ZfbGVuKTsKLSAgICAgICAJCXJldHVybiAtZXJybm9fTkZTRVJSX0lPOwotCX0gZWxzZSBpZiAoaW92LT5pb3ZfbGVuICE9IGhkcmxlbikgewotCQlkcHJpbnRrKCJORlM6IFJFQUQgaGVhZGVyIGlzIHNob3J0LiBpb3ZlYyB3aWxsIGJlIHNoaWZ0ZWQuXG4iKTsKLQkJeGRyX3NoaWZ0X2J1ZigmcmVxLT5ycV9yY3ZfYnVmLCBpb3YtPmlvdl9sZW4gLSBoZHJsZW4pOwotCX0KLQotCXJlY3ZkID0gcmVxLT5ycV9yY3ZfYnVmLmxlbiAtIGhkcmxlbjsKLQlpZiAoY291bnQgPiByZWN2ZCkgewotCQlkcHJpbnRrKCJORlM6IHNlcnZlciBjaGVhdGluZyBpbiByZWFkIHJlcGx5OiAiCi0JCQkiY291bnQgJXUgPiByZWN2ZCAldVxuIiwgY291bnQsIHJlY3ZkKTsKLQkJY291bnQgPSByZWN2ZDsKLQkJcmVzLT5lb2YgPSAwOwotCX0KLQotCWlmIChjb3VudCA8IHJlcy0+Y291bnQpCi0JCXJlcy0+Y291bnQgPSBjb3VudDsKLQorb3V0OgorCXhkcl9yZWFkX3BhZ2VzKHhkciwgY291bnQpOworCXJlc3VsdC0+ZW9mID0gZW9mOworCXJlc3VsdC0+Y291bnQgPSBjb3VudDsKIAlyZXR1cm4gY291bnQ7CitvdXRfbWlzbWF0Y2g6CisJZHByaW50aygiTkZTOiBSRUFEIGNvdW50IGRvZXNuJ3QgbWF0Y2ggbGVuZ3RoIG9mIG9wYXF1ZTogIgorCQkiY291bnQgJXUgIT0gb2NvdW50ICV1XG4iLCBjb3VudCwgb2NvdW50KTsKKwlyZXR1cm4gLUVJTzsKK291dF9jaGVhdGluZzoKKwlkcHJpbnRrKCJORlM6IHNlcnZlciBjaGVhdGluZyBpbiByZWFkIHJlc3VsdDogIgorCQkiY291bnQgJXUgPiByZWN2ZCAldVxuIiwgY291bnQsIHJlY3ZkKTsKKwljb3VudCA9IHJlY3ZkOworCWVvZiA9IDA7CisJZ290byBvdXQ7CitvdXRfb3ZlcmZsb3c6CisJcHJpbnRfb3ZlcmZsb3dfbXNnKF9fZnVuY19fLCB4ZHIpOworCXJldHVybiAtRUlPOworfQorCitzdGF0aWMgaW50IG5mczNfeGRyX2RlY19yZWFkM3JlcyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKKwkJCQkgc3RydWN0IG5mc19yZWFkcmVzICpyZXN1bHQpCit7CisJZW51bSBuZnNfc3RhdCBzdGF0dXM7CisJaW50IGVycm9yOworCisJZXJyb3IgPSBkZWNvZGVfbmZzc3RhdDMoeGRyLCAmc3RhdHVzKTsKKwlpZiAodW5saWtlbHkoZXJyb3IpKQorCQlnb3RvIG91dDsKKwllcnJvciA9IGRlY29kZV9wb3N0X29wX2F0dHIoeGRyLCByZXN1bHQtPmZhdHRyKTsKKwlpZiAodW5saWtlbHkoZXJyb3IpKQorCQlnb3RvIG91dDsKKwlpZiAoc3RhdHVzICE9IE5GUzNfT0spCisJCWdvdG8gb3V0X3N0YXR1czsKKwllcnJvciA9IGRlY29kZV9yZWFkM3Jlc29rKHhkciwgcmVzdWx0KTsKK291dDoKKwlyZXR1cm4gZXJyb3I7CitvdXRfc3RhdHVzOgorCXJldHVybiBuZnNfc3RhdF90b19lcnJubyhzdGF0dXMpOwogfQogCiAvKgotICogRGVjb2RlIFdSSVRFIHJlc3BvbnNlCisgKiAzLjMuNyAgV1JJVEUzcmVzCisgKgorICoJZW51bSBzdGFibGVfaG93IHsKKyAqCQlVTlNUQUJMRSAgPSAwLAorICoJCURBVEFfU1lOQyA9IDEsCisgKgkJRklMRV9TWU5DID0gMgorICoJfTsKKyAqCisgKglzdHJ1Y3QgV1JJVEUzcmVzb2sgeworICoJCXdjY19kYXRhCWZpbGVfd2NjOworICoJCWNvdW50MwkJY291bnQ7CisgKgkJc3RhYmxlX2hvdwljb21taXR0ZWQ7CisgKgkJd3JpdGV2ZXJmMwl2ZXJmOworICoJfTsKKyAqCisgKglzdHJ1Y3QgV1JJVEUzcmVzZmFpbCB7CisgKgkJd2NjX2RhdGEJZmlsZV93Y2M7CisgKgl9OworICoKKyAqCXVuaW9uIFdSSVRFM3JlcyBzd2l0Y2ggKG5mc3N0YXQzIHN0YXR1cykgeworICoJY2FzZSBORlMzX09LOgorICoJCVdSSVRFM3Jlc29rCXJlc29rOworICoJZGVmYXVsdDoKKyAqCQlXUklURTNyZXNmYWlsCXJlc2ZhaWw7CisgKgl9OwogICovCi1zdGF0aWMgaW50Ci1uZnMzX3hkcl93cml0ZXJlcyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLCBzdHJ1Y3QgbmZzX3dyaXRlcmVzICpyZXMpCitzdGF0aWMgaW50IGRlY29kZV93cml0ZTNyZXNvayhzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAorCQkJICAgICAgc3RydWN0IG5mc193cml0ZXJlcyAqcmVzdWx0KQogewotCWludAlzdGF0dXM7CisJX19iZTMyICpwOwogCi0Jc3RhdHVzID0gbnRvaGwoKnArKyk7Ci0JcCA9IHhkcl9kZWNvZGVfd2NjX2RhdGEocCwgcmVzLT5mYXR0cik7CisJcCA9IHhkcl9pbmxpbmVfZGVjb2RlKHhkciwgNCArIDQgKyBORlMzX1dSSVRFVkVSRlNJWkUpOworCWlmICh1bmxpa2VseShwID09IE5VTEwpKQorCQlnb3RvIG91dF9vdmVyZmxvdzsKKwlyZXN1bHQtPmNvdW50ID0gYmUzMl90b19jcHVwKHArKyk7CisJcmVzdWx0LT52ZXJmLT5jb21taXR0ZWQgPSBiZTMyX3RvX2NwdXAocCsrKTsKKwlpZiAodW5saWtlbHkocmVzdWx0LT52ZXJmLT5jb21taXR0ZWQgPiBORlNfRklMRV9TWU5DKSkKKwkJZ290byBvdXRfYmFkdmFsdWU7CisJbWVtY3B5KHJlc3VsdC0+dmVyZi0+dmVyaWZpZXIsIHAsIE5GUzNfV1JJVEVWRVJGU0laRSk7CisJcmV0dXJuIHJlc3VsdC0+Y291bnQ7CitvdXRfYmFkdmFsdWU6CisJZHByaW50aygiTkZTOiBiYWQgc3RhYmxlX2hvdyB2YWx1ZTogJXVcbiIsIHJlc3VsdC0+dmVyZi0+Y29tbWl0dGVkKTsKKwlyZXR1cm4gLUVJTzsKK291dF9vdmVyZmxvdzoKKwlwcmludF9vdmVyZmxvd19tc2coX19mdW5jX18sIHhkcik7CisJcmV0dXJuIC1FSU87Cit9CiAKLQlpZiAoc3RhdHVzICE9IDApCi0JCXJldHVybiBuZnNfc3RhdF90b19lcnJubyhzdGF0dXMpOworc3RhdGljIGludCBuZnMzX3hkcl9kZWNfd3JpdGUzcmVzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAorCQkJCSAgc3RydWN0IG5mc193cml0ZXJlcyAqcmVzdWx0KQoreworCWVudW0gbmZzX3N0YXQgc3RhdHVzOworCWludCBlcnJvcjsKIAotCXJlcy0+Y291bnQgPSBudG9obCgqcCsrKTsKLQlyZXMtPnZlcmYtPmNvbW1pdHRlZCA9IChlbnVtIG5mczNfc3RhYmxlX2hvdyludG9obCgqcCsrKTsKLQlyZXMtPnZlcmYtPnZlcmlmaWVyWzBdID0gKnArKzsKLQlyZXMtPnZlcmYtPnZlcmlmaWVyWzFdID0gKnArKzsKLQotCXJldHVybiByZXMtPmNvdW50OworCWVycm9yID0gZGVjb2RlX25mc3N0YXQzKHhkciwgJnN0YXR1cyk7CisJaWYgKHVubGlrZWx5KGVycm9yKSkKKwkJZ290byBvdXQ7CisJZXJyb3IgPSBkZWNvZGVfd2NjX2RhdGEoeGRyLCByZXN1bHQtPmZhdHRyKTsKKwlpZiAodW5saWtlbHkoZXJyb3IpKQorCQlnb3RvIG91dDsKKwlpZiAoc3RhdHVzICE9IE5GUzNfT0spCisJCWdvdG8gb3V0X3N0YXR1czsKKwllcnJvciA9IGRlY29kZV93cml0ZTNyZXNvayh4ZHIsIHJlc3VsdCk7CitvdXQ6CisJcmV0dXJuIGVycm9yOworb3V0X3N0YXR1czoKKwlyZXR1cm4gbmZzX3N0YXRfdG9fZXJybm8oc3RhdHVzKTsKIH0KIAogLyoKLSAqIERlY29kZSBhIENSRUFURSByZXNwb25zZQorICogMy4zLjggIENSRUFURTNyZXMKKyAqCisgKglzdHJ1Y3QgQ1JFQVRFM3Jlc29rIHsKKyAqCQlwb3N0X29wX2ZoMwlvYmo7CisgKgkJcG9zdF9vcF9hdHRyCW9ial9hdHRyaWJ1dGVzOworICoJCXdjY19kYXRhCWRpcl93Y2M7CisgKgl9OworICoKKyAqCXN0cnVjdCBDUkVBVEUzcmVzZmFpbCB7CisgKgkJd2NjX2RhdGEJZGlyX3djYzsKKyAqCX07CisgKgorICoJdW5pb24gQ1JFQVRFM3JlcyBzd2l0Y2ggKG5mc3N0YXQzIHN0YXR1cykgeworICoJY2FzZSBORlMzX09LOgorICoJCUNSRUFURTNyZXNvawlyZXNvazsKKyAqCWRlZmF1bHQ6CisgKgkJQ1JFQVRFM3Jlc2ZhaWwJcmVzZmFpbDsKKyAqCX07CiAgKi8KLXN0YXRpYyBpbnQKLW5mczNfeGRyX2NyZWF0ZXJlcyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLCBzdHJ1Y3QgbmZzM19kaXJvcHJlcyAqcmVzKQorc3RhdGljIGludCBkZWNvZGVfY3JlYXRlM3Jlc29rKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCisJCQkgICAgICAgc3RydWN0IG5mczNfZGlyb3ByZXMgKnJlc3VsdCkKIHsKLQlpbnQJc3RhdHVzOworCWludCBlcnJvcjsKIAotCXN0YXR1cyA9IG50b2hsKCpwKyspOwotCWlmIChzdGF0dXMgPT0gMCkgewotCQlpZiAoKnArKykgewotCQkJaWYgKCEocCA9IHhkcl9kZWNvZGVfZmhhbmRsZShwLCByZXMtPmZoKSkpCi0JCQkJcmV0dXJuIC1lcnJub19ORlNFUlJfSU87Ci0JCQlwID0geGRyX2RlY29kZV9wb3N0X29wX2F0dHIocCwgcmVzLT5mYXR0cik7Ci0JCX0gZWxzZSB7Ci0JCQltZW1zZXQocmVzLT5maCwgMCwgc2l6ZW9mKCpyZXMtPmZoKSk7Ci0JCQkvKiBEbyBkZWNvZGUgcG9zdF9vcF9hdHRyIGJ1dCBzZXQgaXQgdG8gTlVMTCAqLwotCQkJcCA9IHhkcl9kZWNvZGVfcG9zdF9vcF9hdHRyKHAsIHJlcy0+ZmF0dHIpOwotCQkJcmVzLT5mYXR0ci0+dmFsaWQgPSAwOwotCQl9Ci0JfSBlbHNlIHsKLQkJc3RhdHVzID0gbmZzX3N0YXRfdG9fZXJybm8oc3RhdHVzKTsKKwllcnJvciA9IGRlY29kZV9wb3N0X29wX2ZoMyh4ZHIsIHJlc3VsdC0+ZmgpOworCWlmICh1bmxpa2VseShlcnJvcikpCisJCWdvdG8gb3V0OworCWVycm9yID0gZGVjb2RlX3Bvc3Rfb3BfYXR0cih4ZHIsIHJlc3VsdC0+ZmF0dHIpOworCWlmICh1bmxpa2VseShlcnJvcikpCisJCWdvdG8gb3V0OworCS8qIFRoZSBzZXJ2ZXIgaXNuJ3QgcmVxdWlyZWQgdG8gcmV0dXJuIGEgZmlsZSBoYW5kbGUuCisJICogSWYgaXQgZGlkbid0LCBmb3JjZSB0aGUgY2xpZW50IHRvIHBlcmZvcm0gYSBMT09LVVAKKwkgKiB0byBkZXRlcm1pbmUgdGhlIGNvcnJlY3QgZmlsZSBoYW5kbGUgYW5kIGF0dHJpYnV0ZQorCSAqIHZhbHVlcyBmb3IgdGhlIG5ldyBvYmplY3QuICovCisJaWYgKHJlc3VsdC0+ZmgtPnNpemUgPT0gMCkKKwkJcmVzdWx0LT5mYXR0ci0+dmFsaWQgPSAwOworCWVycm9yID0gZGVjb2RlX3djY19kYXRhKHhkciwgcmVzdWx0LT5kaXJfYXR0cik7CitvdXQ6CisJcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgaW50IG5mczNfeGRyX2RlY19jcmVhdGUzcmVzKHN0cnVjdCBycGNfcnFzdCAqcmVxLAorCQkJCSAgIHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCisJCQkJICAgc3RydWN0IG5mczNfZGlyb3ByZXMgKnJlc3VsdCkKK3sKKwllbnVtIG5mc19zdGF0IHN0YXR1czsKKwlpbnQgZXJyb3I7CisKKwllcnJvciA9IGRlY29kZV9uZnNzdGF0Myh4ZHIsICZzdGF0dXMpOworCWlmICh1bmxpa2VseShlcnJvcikpCisJCWdvdG8gb3V0OworCWlmIChzdGF0dXMgIT0gTkZTM19PSykKKwkJZ290byBvdXRfZGVmYXVsdDsKKwllcnJvciA9IGRlY29kZV9jcmVhdGUzcmVzb2soeGRyLCByZXN1bHQpOworb3V0OgorCXJldHVybiBlcnJvcjsKK291dF9kZWZhdWx0OgorCWVycm9yID0gZGVjb2RlX3djY19kYXRhKHhkciwgcmVzdWx0LT5kaXJfYXR0cik7CisJaWYgKHVubGlrZWx5KGVycm9yKSkKKwkJZ290byBvdXQ7CisJcmV0dXJuIG5mc19zdGF0X3RvX2Vycm5vKHN0YXR1cyk7Cit9CisKKy8qCisgKiAzLjMuMTIgIFJFTU9WRTNyZXMKKyAqCisgKglzdHJ1Y3QgUkVNT1ZFM3Jlc29rIHsKKyAqCQl3Y2NfZGF0YSAgICBkaXJfd2NjOworICoJfTsKKyAqCisgKglzdHJ1Y3QgUkVNT1ZFM3Jlc2ZhaWwgeworICoJCXdjY19kYXRhICAgIGRpcl93Y2M7CisgKgl9OworICoKKyAqCXVuaW9uIFJFTU9WRTNyZXMgc3dpdGNoIChuZnNzdGF0MyBzdGF0dXMpIHsKKyAqCWNhc2UgTkZTM19PSzoKKyAqCQlSRU1PVkUzcmVzb2sgICByZXNvazsKKyAqCWRlZmF1bHQ6CisgKgkJUkVNT1ZFM3Jlc2ZhaWwgcmVzZmFpbDsKKyAqCX07CisgKi8KK3N0YXRpYyBpbnQgbmZzM194ZHJfZGVjX3JlbW92ZTNyZXMoc3RydWN0IHJwY19ycXN0ICpyZXEsCisJCQkJICAgc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKKwkJCQkgICBzdHJ1Y3QgbmZzX3JlbW92ZXJlcyAqcmVzdWx0KQoreworCWVudW0gbmZzX3N0YXQgc3RhdHVzOworCWludCBlcnJvcjsKKworCWVycm9yID0gZGVjb2RlX25mc3N0YXQzKHhkciwgJnN0YXR1cyk7CisJaWYgKHVubGlrZWx5KGVycm9yKSkKKwkJZ290byBvdXQ7CisJZXJyb3IgPSBkZWNvZGVfd2NjX2RhdGEoeGRyLCByZXN1bHQtPmRpcl9hdHRyKTsKKwlpZiAodW5saWtlbHkoZXJyb3IpKQorCQlnb3RvIG91dDsKKwlpZiAoc3RhdHVzICE9IE5GUzNfT0spCisJCWdvdG8gb3V0X3N0YXR1czsKK291dDoKKwlyZXR1cm4gZXJyb3I7CitvdXRfc3RhdHVzOgorCXJldHVybiBuZnNfc3RhdF90b19lcnJubyhzdGF0dXMpOworfQorCisvKgorICogMy4zLjE0ICBSRU5BTUUzcmVzCisgKgorICoJc3RydWN0IFJFTkFNRTNyZXNvayB7CisgKgkJd2NjX2RhdGEJZnJvbWRpcl93Y2M7CisgKgkJd2NjX2RhdGEJdG9kaXJfd2NjOworICoJfTsKKyAqCisgKglzdHJ1Y3QgUkVOQU1FM3Jlc2ZhaWwgeworICoJCXdjY19kYXRhCWZyb21kaXJfd2NjOworICoJCXdjY19kYXRhCXRvZGlyX3djYzsKKyAqCX07CisgKgorICoJdW5pb24gUkVOQU1FM3JlcyBzd2l0Y2ggKG5mc3N0YXQzIHN0YXR1cykgeworICoJY2FzZSBORlMzX09LOgorICoJCVJFTkFNRTNyZXNvayAgIHJlc29rOworICoJZGVmYXVsdDoKKyAqCQlSRU5BTUUzcmVzZmFpbCByZXNmYWlsOworICoJfTsKKyAqLworc3RhdGljIGludCBuZnMzX3hkcl9kZWNfcmVuYW1lM3JlcyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwKKwkJCQkgICBzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAorCQkJCSAgIHN0cnVjdCBuZnNfcmVuYW1lcmVzICpyZXN1bHQpCit7CisJZW51bSBuZnNfc3RhdCBzdGF0dXM7CisJaW50IGVycm9yOworCisJZXJyb3IgPSBkZWNvZGVfbmZzc3RhdDMoeGRyLCAmc3RhdHVzKTsKKwlpZiAodW5saWtlbHkoZXJyb3IpKQorCQlnb3RvIG91dDsKKwllcnJvciA9IGRlY29kZV93Y2NfZGF0YSh4ZHIsIHJlc3VsdC0+b2xkX2ZhdHRyKTsKKwlpZiAodW5saWtlbHkoZXJyb3IpKQorCQlnb3RvIG91dDsKKwllcnJvciA9IGRlY29kZV93Y2NfZGF0YSh4ZHIsIHJlc3VsdC0+bmV3X2ZhdHRyKTsKKwlpZiAodW5saWtlbHkoZXJyb3IpKQorCQlnb3RvIG91dDsKKwlpZiAoc3RhdHVzICE9IE5GUzNfT0spCisJCWdvdG8gb3V0X3N0YXR1czsKK291dDoKKwlyZXR1cm4gZXJyb3I7CitvdXRfc3RhdHVzOgorCXJldHVybiBuZnNfc3RhdF90b19lcnJubyhzdGF0dXMpOworfQorCisvKgorICogMy4zLjE1ICBMSU5LM3JlcworICoKKyAqCXN0cnVjdCBMSU5LM3Jlc29rIHsKKyAqCQlwb3N0X29wX2F0dHIJZmlsZV9hdHRyaWJ1dGVzOworICoJCXdjY19kYXRhCWxpbmtkaXJfd2NjOworICoJfTsKKyAqCisgKglzdHJ1Y3QgTElOSzNyZXNmYWlsIHsKKyAqCQlwb3N0X29wX2F0dHIJZmlsZV9hdHRyaWJ1dGVzOworICoJCXdjY19kYXRhCWxpbmtkaXJfd2NjOworICoJfTsKKyAqCisgKgl1bmlvbiBMSU5LM3JlcyBzd2l0Y2ggKG5mc3N0YXQzIHN0YXR1cykgeworICoJY2FzZSBORlMzX09LOgorICoJCUxJTkszcmVzb2sJcmVzb2s7CisgKglkZWZhdWx0OgorICoJCUxJTkszcmVzZmFpbAlyZXNmYWlsOworICoJfTsKKyAqLworc3RhdGljIGludCBuZnMzX3hkcl9kZWNfbGluazNyZXMoc3RydWN0IHJwY19ycXN0ICpyZXEsIHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCisJCQkJIHN0cnVjdCBuZnMzX2xpbmtyZXMgKnJlc3VsdCkKK3sKKwllbnVtIG5mc19zdGF0IHN0YXR1czsKKwlpbnQgZXJyb3I7CisKKwllcnJvciA9IGRlY29kZV9uZnNzdGF0Myh4ZHIsICZzdGF0dXMpOworCWlmICh1bmxpa2VseShlcnJvcikpCisJCWdvdG8gb3V0OworCWVycm9yID0gZGVjb2RlX3Bvc3Rfb3BfYXR0cih4ZHIsIHJlc3VsdC0+ZmF0dHIpOworCWlmICh1bmxpa2VseShlcnJvcikpCisJCWdvdG8gb3V0OworCWVycm9yID0gZGVjb2RlX3djY19kYXRhKHhkciwgcmVzdWx0LT5kaXJfYXR0cik7CisJaWYgKHVubGlrZWx5KGVycm9yKSkKKwkJZ290byBvdXQ7CisJaWYgKHN0YXR1cyAhPSBORlMzX09LKQorCQlnb3RvIG91dF9zdGF0dXM7CitvdXQ6CisJcmV0dXJuIGVycm9yOworb3V0X3N0YXR1czoKKwlyZXR1cm4gbmZzX3N0YXRfdG9fZXJybm8oc3RhdHVzKTsKK30KKworLyoqCisgKiBuZnMzX2RlY29kZV9kaXJlbnQgLSBEZWNvZGUgYSBzaW5nbGUgTkZTdjMgZGlyZWN0b3J5IGVudHJ5IHN0b3JlZCBpbgorICoJCQl0aGUgbG9jYWwgcGFnZSBjYWNoZQorICogQHhkcjogWERSIHN0cmVhbSB3aGVyZSBlbnRyeSByZXNpZGVzCisgKiBAZW50cnk6IGJ1ZmZlciB0byBmaWxsIGluIHdpdGggZW50cnkgZGF0YQorICogQHBsdXM6IGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoaXMgc2hvdWxkIGJlIGEgcmVhZGRpcnBsdXMgZW50cnkKKyAqCisgKiBSZXR1cm5zIHplcm8gaWYgc3VjY2Vzc2Z1bCwgb3RoZXJ3aXNlIGEgbmVnYXRpdmUgZXJybm8gdmFsdWUgaXMKKyAqIHJldHVybmVkLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgbm90IGludm9rZWQgZHVyaW5nIFJFQURESVIgcmVwbHkgZGVjb2RpbmcsIGJ1dAorICogcmF0aGVyIHdoZW5ldmVyIGFuIGFwcGxpY2F0aW9uIGludm9rZXMgdGhlIGdldGRlbnRzKDIpIHN5c3RlbSBjYWxsCisgKiBvbiBhIGRpcmVjdG9yeSBhbHJlYWR5IGluIG91ciBjYWNoZS4KKyAqCisgKiAzLjMuMTYgIGVudHJ5MworICoKKyAqCXN0cnVjdCBlbnRyeTMgeworICoJCWZpbGVpZDMJCWZpbGVpZDsKKyAqCQlmaWxlbmFtZTMJbmFtZTsKKyAqCQljb29raWUzCQljb29raWU7CisgKgkJZmhhbmRsZTMJZmlsZWhhbmRsZTsKKyAqCQlwb3N0X29wX2F0dHIzCWF0dHJpYnV0ZXM7CisgKgkJZW50cnkzCQkqbmV4dGVudHJ5OworICoJfTsKKyAqCisgKiAzLjMuMTcgIGVudHJ5cGx1czMKKyAqCXN0cnVjdCBlbnRyeXBsdXMzIHsKKyAqCQlmaWxlaWQzCQlmaWxlaWQ7CisgKgkJZmlsZW5hbWUzCW5hbWU7CisgKgkJY29va2llMwkJY29va2llOworICoJCXBvc3Rfb3BfYXR0cgluYW1lX2F0dHJpYnV0ZXM7CisgKgkJcG9zdF9vcF9maDMJbmFtZV9oYW5kbGU7CisgKgkJZW50cnlwbHVzMwkqbmV4dGVudHJ5OworICoJfTsKKyAqLworaW50IG5mczNfZGVjb2RlX2RpcmVudChzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBzdHJ1Y3QgbmZzX2VudHJ5ICplbnRyeSwKKwkJICAgICAgIGludCBwbHVzKQoreworCXN0cnVjdCBuZnNfZW50cnkgb2xkID0gKmVudHJ5OworCV9fYmUzMiAqcDsKKwlpbnQgZXJyb3I7CisKKwlwID0geGRyX2lubGluZV9kZWNvZGUoeGRyLCA0KTsKKwlpZiAodW5saWtlbHkocCA9PSBOVUxMKSkKKwkJZ290byBvdXRfb3ZlcmZsb3c7CisJaWYgKCpwID09IHhkcl96ZXJvKSB7CisJCXAgPSB4ZHJfaW5saW5lX2RlY29kZSh4ZHIsIDQpOworCQlpZiAodW5saWtlbHkocCA9PSBOVUxMKSkKKwkJCWdvdG8gb3V0X292ZXJmbG93OworCQlpZiAoKnAgPT0geGRyX3plcm8pCisJCQlyZXR1cm4gLUVBR0FJTjsKKwkJZW50cnktPmVvZiA9IDE7CisJCXJldHVybiAtRUJBRENPT0tJRTsKIAl9Ci0JcCA9IHhkcl9kZWNvZGVfd2NjX2RhdGEocCwgcmVzLT5kaXJfYXR0cik7Ci0JcmV0dXJuIHN0YXR1czsKKworCWVycm9yID0gZGVjb2RlX2ZpbGVpZDMoeGRyLCAmZW50cnktPmlubyk7CisJaWYgKHVubGlrZWx5KGVycm9yKSkKKwkJcmV0dXJuIGVycm9yOworCisJZXJyb3IgPSBkZWNvZGVfaW5saW5lX2ZpbGVuYW1lMyh4ZHIsICZlbnRyeS0+bmFtZSwgJmVudHJ5LT5sZW4pOworCWlmICh1bmxpa2VseShlcnJvcikpCisJCXJldHVybiBlcnJvcjsKKworCWVudHJ5LT5wcmV2X2Nvb2tpZSA9IGVudHJ5LT5jb29raWU7CisJZXJyb3IgPSBkZWNvZGVfY29va2llMyh4ZHIsICZlbnRyeS0+Y29va2llKTsKKwlpZiAodW5saWtlbHkoZXJyb3IpKQorCQlyZXR1cm4gZXJyb3I7CisKKwllbnRyeS0+ZF90eXBlID0gRFRfVU5LTk9XTjsKKworCWlmIChwbHVzKSB7CisJCWVudHJ5LT5mYXR0ci0+dmFsaWQgPSAwOworCQllcnJvciA9IGRlY29kZV9wb3N0X29wX2F0dHIoeGRyLCBlbnRyeS0+ZmF0dHIpOworCQlpZiAodW5saWtlbHkoZXJyb3IpKQorCQkJcmV0dXJuIGVycm9yOworCQlpZiAoZW50cnktPmZhdHRyLT52YWxpZCAmIE5GU19BVFRSX0ZBVFRSX1YzKQorCQkJZW50cnktPmRfdHlwZSA9IG5mc191bW9kZV90b19kdHlwZShlbnRyeS0+ZmF0dHItPm1vZGUpOworCisJCS8qIEluIGZhY3QsIGEgcG9zdF9vcF9maDM6ICovCisJCXAgPSB4ZHJfaW5saW5lX2RlY29kZSh4ZHIsIDQpOworCQlpZiAodW5saWtlbHkocCA9PSBOVUxMKSkKKwkJCWdvdG8gb3V0X292ZXJmbG93OworCQlpZiAoKnAgIT0geGRyX3plcm8pIHsKKwkJCWVycm9yID0gZGVjb2RlX25mc19maDMoeGRyLCBlbnRyeS0+ZmgpOworCQkJaWYgKHVubGlrZWx5KGVycm9yKSkgeworCQkJCWlmIChlcnJvciA9PSAtRTJCSUcpCisJCQkJCWdvdG8gb3V0X3RydW5jYXRlZDsKKwkJCQlyZXR1cm4gZXJyb3I7CisJCQl9CisJCX0gZWxzZQorCQkJemVyb19uZnNfZmgzKGVudHJ5LT5maCk7CisJfQorCisJcmV0dXJuIDA7CisKK291dF9vdmVyZmxvdzoKKwlwcmludF9vdmVyZmxvd19tc2coX19mdW5jX18sIHhkcik7CisJcmV0dXJuIC1FQUdBSU47CitvdXRfdHJ1bmNhdGVkOgorCWRwcmludGsoIk5GUzogZGlyZWN0b3J5IGVudHJ5IGNvbnRhaW5zIGludmFsaWQgZmlsZSBoYW5kbGVcbiIpOworCSplbnRyeSA9IG9sZDsKKwlyZXR1cm4gLUVBR0FJTjsKIH0KIAogLyoKLSAqIERlY29kZSBSRU5BTUUgcmVwbHkKKyAqIDMuMy4xNiAgUkVBRERJUjNyZXMKKyAqCisgKglzdHJ1Y3QgZGlybGlzdDMgeworICoJCWVudHJ5MwkJKmVudHJpZXM7CisgKgkJYm9vbAkJZW9mOworICoJfTsKKyAqCisgKglzdHJ1Y3QgUkVBRERJUjNyZXNvayB7CisgKgkJcG9zdF9vcF9hdHRyCWRpcl9hdHRyaWJ1dGVzOworICoJCWNvb2tpZXZlcmYzCWNvb2tpZXZlcmY7CisgKgkJZGlybGlzdDMJcmVwbHk7CisgKgl9OworICoKKyAqCXN0cnVjdCBSRUFERElSM3Jlc2ZhaWwgeworICoJCXBvc3Rfb3BfYXR0cglkaXJfYXR0cmlidXRlczsKKyAqCX07CisgKgorICoJdW5pb24gUkVBRERJUjNyZXMgc3dpdGNoIChuZnNzdGF0MyBzdGF0dXMpIHsKKyAqCWNhc2UgTkZTM19PSzoKKyAqCQlSRUFERElSM3Jlc29rCXJlc29rOworICoJZGVmYXVsdDoKKyAqCQlSRUFERElSM3Jlc2ZhaWwJcmVzZmFpbDsKKyAqCX07CisgKgorICogUmVhZCB0aGUgZGlyZWN0b3J5IGNvbnRlbnRzIGludG8gdGhlIHBhZ2UgY2FjaGUsIGJ1dCBvdGhlcndpc2UKKyAqIGRvbid0IHRvdWNoIHRoZW0uICBUaGUgYWN0dWFsIGRlY29kaW5nIGlzIGRvbmUgYnkgbmZzM19kZWNvZGVfZW50cnkoKQorICogZHVyaW5nIHN1YnNlcXVlbnQgbmZzX3JlYWRkaXIoKSBjYWxscy4KICAqLwotc3RhdGljIGludAotbmZzM194ZHJfcmVuYW1lcmVzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsIHN0cnVjdCBuZnNfcmVuYW1lcmVzICpyZXMpCitzdGF0aWMgaW50IGRlY29kZV9kaXJsaXN0MyhzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyKQogewotCWludAlzdGF0dXM7CisJdTMyIHJlY3ZkLCBwZ2xlbjsKKwlzaXplX3QgaGRybGVuOwogCi0JaWYgKChzdGF0dXMgPSBudG9obCgqcCsrKSkgIT0gMCkKLQkJc3RhdHVzID0gbmZzX3N0YXRfdG9fZXJybm8oc3RhdHVzKTsKLQlwID0geGRyX2RlY29kZV93Y2NfZGF0YShwLCByZXMtPm9sZF9mYXR0cik7Ci0JcCA9IHhkcl9kZWNvZGVfd2NjX2RhdGEocCwgcmVzLT5uZXdfZmF0dHIpOwotCXJldHVybiBzdGF0dXM7CisJcGdsZW4gPSB4ZHItPmJ1Zi0+cGFnZV9sZW47CisJaGRybGVuID0gKHU4ICopeGRyLT5wIC0gKHU4ICopeGRyLT5pb3YtPmlvdl9iYXNlOworCXJlY3ZkID0geGRyLT5idWYtPmxlbiAtIGhkcmxlbjsKKwlpZiAodW5saWtlbHkocGdsZW4gPiByZWN2ZCkpCisJCWdvdG8gb3V0X2NoZWF0aW5nOworb3V0OgorCXhkcl9yZWFkX3BhZ2VzKHhkciwgcGdsZW4pOworCXJldHVybiBwZ2xlbjsKK291dF9jaGVhdGluZzoKKwlkcHJpbnRrKCJORlM6IHNlcnZlciBjaGVhdGluZyBpbiByZWFkZGlyIHJlc3VsdDogIgorCQkicGdsZW4gJXUgPiByZWN2ZCAldVxuIiwgcGdsZW4sIHJlY3ZkKTsKKwlwZ2xlbiA9IHJlY3ZkOworCWdvdG8gb3V0OworfQorCitzdGF0aWMgaW50IGRlY29kZV9yZWFkZGlyM3Jlc29rKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCisJCQkJc3RydWN0IG5mczNfcmVhZGRpcnJlcyAqcmVzdWx0KQoreworCWludCBlcnJvcjsKKworCWVycm9yID0gZGVjb2RlX3Bvc3Rfb3BfYXR0cih4ZHIsIHJlc3VsdC0+ZGlyX2F0dHIpOworCWlmICh1bmxpa2VseShlcnJvcikpCisJCWdvdG8gb3V0OworCS8qIFhYWDogZG8gd2UgbmVlZCB0byBjaGVjayBpZiByZXN1bHQtPnZlcmYgIT0gTlVMTCA/ICovCisJZXJyb3IgPSBkZWNvZGVfY29va2lldmVyZjMoeGRyLCByZXN1bHQtPnZlcmYpOworCWlmICh1bmxpa2VseShlcnJvcikpCisJCWdvdG8gb3V0OworCWVycm9yID0gZGVjb2RlX2Rpcmxpc3QzKHhkcik7CitvdXQ6CisJcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgaW50IG5mczNfeGRyX2RlY19yZWFkZGlyM3JlcyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwKKwkJCQkgICAgc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKKwkJCQkgICAgc3RydWN0IG5mczNfcmVhZGRpcnJlcyAqcmVzdWx0KQoreworCWVudW0gbmZzX3N0YXQgc3RhdHVzOworCWludCBlcnJvcjsKKworCWVycm9yID0gZGVjb2RlX25mc3N0YXQzKHhkciwgJnN0YXR1cyk7CisJaWYgKHVubGlrZWx5KGVycm9yKSkKKwkJZ290byBvdXQ7CisJaWYgKHN0YXR1cyAhPSBORlMzX09LKQorCQlnb3RvIG91dF9kZWZhdWx0OworCWVycm9yID0gZGVjb2RlX3JlYWRkaXIzcmVzb2soeGRyLCByZXN1bHQpOworb3V0OgorCXJldHVybiBlcnJvcjsKK291dF9kZWZhdWx0OgorCWVycm9yID0gZGVjb2RlX3Bvc3Rfb3BfYXR0cih4ZHIsIHJlc3VsdC0+ZGlyX2F0dHIpOworCWlmICh1bmxpa2VseShlcnJvcikpCisJCWdvdG8gb3V0OworCXJldHVybiBuZnNfc3RhdF90b19lcnJubyhzdGF0dXMpOwogfQogCiAvKgotICogRGVjb2RlIExJTksgcmVwbHkKKyAqIDMuMy4xOCAgRlNTVEFUM3JlcworICoKKyAqCXN0cnVjdCBGU1NUQVQzcmVzb2sgeworICoJCXBvc3Rfb3BfYXR0cglvYmpfYXR0cmlidXRlczsKKyAqCQlzaXplMwkJdGJ5dGVzOworICoJCXNpemUzCQlmYnl0ZXM7CisgKgkJc2l6ZTMJCWFieXRlczsKKyAqCQlzaXplMwkJdGZpbGVzOworICoJCXNpemUzCQlmZmlsZXM7CisgKgkJc2l6ZTMJCWFmaWxlczsKKyAqCQl1aW50MzIJCWludmFyc2VjOworICoJfTsKKyAqCisgKglzdHJ1Y3QgRlNTVEFUM3Jlc2ZhaWwgeworICoJCXBvc3Rfb3BfYXR0cglvYmpfYXR0cmlidXRlczsKKyAqCX07CisgKgorICoJdW5pb24gRlNTVEFUM3JlcyBzd2l0Y2ggKG5mc3N0YXQzIHN0YXR1cykgeworICoJY2FzZSBORlMzX09LOgorICoJCUZTU1RBVDNyZXNvawlyZXNvazsKKyAqCWRlZmF1bHQ6CisgKgkJRlNTVEFUM3Jlc2ZhaWwJcmVzZmFpbDsKKyAqCX07CiAgKi8KLXN0YXRpYyBpbnQKLW5mczNfeGRyX2xpbmtyZXMoc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgc3RydWN0IG5mczNfbGlua3JlcyAqcmVzKQorc3RhdGljIGludCBkZWNvZGVfZnNzdGF0M3Jlc29rKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCisJCQkgICAgICAgc3RydWN0IG5mc19mc3N0YXQgKnJlc3VsdCkKIHsKLQlpbnQJc3RhdHVzOworCV9fYmUzMiAqcDsKIAotCWlmICgoc3RhdHVzID0gbnRvaGwoKnArKykpICE9IDApCi0JCXN0YXR1cyA9IG5mc19zdGF0X3RvX2Vycm5vKHN0YXR1cyk7Ci0JcCA9IHhkcl9kZWNvZGVfcG9zdF9vcF9hdHRyKHAsIHJlcy0+ZmF0dHIpOwotCXAgPSB4ZHJfZGVjb2RlX3djY19kYXRhKHAsIHJlcy0+ZGlyX2F0dHIpOwotCXJldHVybiBzdGF0dXM7Ci19Ci0KLS8qCi0gKiBEZWNvZGUgRlNTVEFUIHJlcGx5Ci0gKi8KLXN0YXRpYyBpbnQKLW5mczNfeGRyX2Zzc3RhdHJlcyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLCBzdHJ1Y3QgbmZzX2Zzc3RhdCAqcmVzKQotewotCWludAkJc3RhdHVzOwotCi0Jc3RhdHVzID0gbnRvaGwoKnArKyk7Ci0KLQlwID0geGRyX2RlY29kZV9wb3N0X29wX2F0dHIocCwgcmVzLT5mYXR0cik7Ci0JaWYgKHN0YXR1cyAhPSAwKQotCQlyZXR1cm4gbmZzX3N0YXRfdG9fZXJybm8oc3RhdHVzKTsKLQotCXAgPSB4ZHJfZGVjb2RlX2h5cGVyKHAsICZyZXMtPnRieXRlcyk7Ci0JcCA9IHhkcl9kZWNvZGVfaHlwZXIocCwgJnJlcy0+ZmJ5dGVzKTsKLQlwID0geGRyX2RlY29kZV9oeXBlcihwLCAmcmVzLT5hYnl0ZXMpOwotCXAgPSB4ZHJfZGVjb2RlX2h5cGVyKHAsICZyZXMtPnRmaWxlcyk7Ci0JcCA9IHhkcl9kZWNvZGVfaHlwZXIocCwgJnJlcy0+ZmZpbGVzKTsKLQlwID0geGRyX2RlY29kZV9oeXBlcihwLCAmcmVzLT5hZmlsZXMpOwotCisJcCA9IHhkcl9pbmxpbmVfZGVjb2RlKHhkciwgOCAqIDYgKyA0KTsKKwlpZiAodW5saWtlbHkocCA9PSBOVUxMKSkKKwkJZ290byBvdXRfb3ZlcmZsb3c7CisJcCA9IHhkcl9kZWNvZGVfc2l6ZTMocCwgJnJlc3VsdC0+dGJ5dGVzKTsKKwlwID0geGRyX2RlY29kZV9zaXplMyhwLCAmcmVzdWx0LT5mYnl0ZXMpOworCXAgPSB4ZHJfZGVjb2RlX3NpemUzKHAsICZyZXN1bHQtPmFieXRlcyk7CisJcCA9IHhkcl9kZWNvZGVfc2l6ZTMocCwgJnJlc3VsdC0+dGZpbGVzKTsKKwlwID0geGRyX2RlY29kZV9zaXplMyhwLCAmcmVzdWx0LT5mZmlsZXMpOworCXhkcl9kZWNvZGVfc2l6ZTMocCwgJnJlc3VsdC0+YWZpbGVzKTsKIAkvKiBpZ25vcmUgaW52YXJzZWMgKi8KIAlyZXR1cm4gMDsKK291dF9vdmVyZmxvdzoKKwlwcmludF9vdmVyZmxvd19tc2coX19mdW5jX18sIHhkcik7CisJcmV0dXJuIC1FSU87Cit9CisKK3N0YXRpYyBpbnQgbmZzM194ZHJfZGVjX2Zzc3RhdDNyZXMoc3RydWN0IHJwY19ycXN0ICpyZXEsCisJCQkJICAgc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKKwkJCQkgICBzdHJ1Y3QgbmZzX2Zzc3RhdCAqcmVzdWx0KQoreworCWVudW0gbmZzX3N0YXQgc3RhdHVzOworCWludCBlcnJvcjsKKworCWVycm9yID0gZGVjb2RlX25mc3N0YXQzKHhkciwgJnN0YXR1cyk7CisJaWYgKHVubGlrZWx5KGVycm9yKSkKKwkJZ290byBvdXQ7CisJZXJyb3IgPSBkZWNvZGVfcG9zdF9vcF9hdHRyKHhkciwgcmVzdWx0LT5mYXR0cik7CisJaWYgKHVubGlrZWx5KGVycm9yKSkKKwkJZ290byBvdXQ7CisJaWYgKHN0YXR1cyAhPSBORlMzX09LKQorCQlnb3RvIG91dF9zdGF0dXM7CisJZXJyb3IgPSBkZWNvZGVfZnNzdGF0M3Jlc29rKHhkciwgcmVzdWx0KTsKK291dDoKKwlyZXR1cm4gZXJyb3I7CitvdXRfc3RhdHVzOgorCXJldHVybiBuZnNfc3RhdF90b19lcnJubyhzdGF0dXMpOwogfQogCiAvKgotICogRGVjb2RlIEZTSU5GTyByZXBseQorICogMy4zLjE5ICBGU0lORk8zcmVzCisgKgorICoJc3RydWN0IEZTSU5GTzNyZXNvayB7CisgKgkJcG9zdF9vcF9hdHRyCW9ial9hdHRyaWJ1dGVzOworICoJCXVpbnQzMgkJcnRtYXg7CisgKgkJdWludDMyCQlydHByZWY7CisgKgkJdWludDMyCQlydG11bHQ7CisgKgkJdWludDMyCQl3dG1heDsKKyAqCQl1aW50MzIJCXd0cHJlZjsKKyAqCQl1aW50MzIJCXd0bXVsdDsKKyAqCQl1aW50MzIJCWR0cHJlZjsKKyAqCQlzaXplMwkJbWF4ZmlsZXNpemU7CisgKgkJbmZzdGltZTMJdGltZV9kZWx0YTsKKyAqCQl1aW50MzIJCXByb3BlcnRpZXM7CisgKgl9OworICoKKyAqCXN0cnVjdCBGU0lORk8zcmVzZmFpbCB7CisgKgkJcG9zdF9vcF9hdHRyCW9ial9hdHRyaWJ1dGVzOworICoJfTsKKyAqCisgKgl1bmlvbiBGU0lORk8zcmVzIHN3aXRjaCAobmZzc3RhdDMgc3RhdHVzKSB7CisgKgljYXNlIE5GUzNfT0s6CisgKgkJRlNJTkZPM3Jlc29rCXJlc29rOworICoJZGVmYXVsdDoKKyAqCQlGU0lORk8zcmVzZmFpbAlyZXNmYWlsOworICoJfTsKICAqLwotc3RhdGljIGludAotbmZzM194ZHJfZnNpbmZvcmVzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsIHN0cnVjdCBuZnNfZnNpbmZvICpyZXMpCitzdGF0aWMgaW50IGRlY29kZV9mc2luZm8zcmVzb2soc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKKwkJCSAgICAgICBzdHJ1Y3QgbmZzX2ZzaW5mbyAqcmVzdWx0KQogewotCWludAkJc3RhdHVzOworCV9fYmUzMiAqcDsKIAotCXN0YXR1cyA9IG50b2hsKCpwKyspOwotCi0JcCA9IHhkcl9kZWNvZGVfcG9zdF9vcF9hdHRyKHAsIHJlcy0+ZmF0dHIpOwotCWlmIChzdGF0dXMgIT0gMCkKLQkJcmV0dXJuIG5mc19zdGF0X3RvX2Vycm5vKHN0YXR1cyk7Ci0KLQlyZXMtPnJ0bWF4ICA9IG50b2hsKCpwKyspOwotCXJlcy0+cnRwcmVmID0gbnRvaGwoKnArKyk7Ci0JcmVzLT5ydG11bHQgPSBudG9obCgqcCsrKTsKLQlyZXMtPnd0bWF4ICA9IG50b2hsKCpwKyspOwotCXJlcy0+d3RwcmVmID0gbnRvaGwoKnArKyk7Ci0JcmVzLT53dG11bHQgPSBudG9obCgqcCsrKTsKLQlyZXMtPmR0cHJlZiA9IG50b2hsKCpwKyspOwotCXAgPSB4ZHJfZGVjb2RlX2h5cGVyKHAsICZyZXMtPm1heGZpbGVzaXplKTsKLQlwID0geGRyX2RlY29kZV90aW1lMyhwLCAmcmVzLT50aW1lX2RlbHRhKTsKKwlwID0geGRyX2lubGluZV9kZWNvZGUoeGRyLCA0ICogNyArIDggKyA4ICsgNCk7CisJaWYgKHVubGlrZWx5KHAgPT0gTlVMTCkpCisJCWdvdG8gb3V0X292ZXJmbG93OworCXJlc3VsdC0+cnRtYXggID0gYmUzMl90b19jcHVwKHArKyk7CisJcmVzdWx0LT5ydHByZWYgPSBiZTMyX3RvX2NwdXAocCsrKTsKKwlyZXN1bHQtPnJ0bXVsdCA9IGJlMzJfdG9fY3B1cChwKyspOworCXJlc3VsdC0+d3RtYXggID0gYmUzMl90b19jcHVwKHArKyk7CisJcmVzdWx0LT53dHByZWYgPSBiZTMyX3RvX2NwdXAocCsrKTsKKwlyZXN1bHQtPnd0bXVsdCA9IGJlMzJfdG9fY3B1cChwKyspOworCXJlc3VsdC0+ZHRwcmVmID0gYmUzMl90b19jcHVwKHArKyk7CisJcCA9IHhkcl9kZWNvZGVfc2l6ZTMocCwgJnJlc3VsdC0+bWF4ZmlsZXNpemUpOworCXhkcl9kZWNvZGVfbmZzdGltZTMocCwgJnJlc3VsdC0+dGltZV9kZWx0YSk7CiAKIAkvKiBpZ25vcmUgcHJvcGVydGllcyAqLwotCXJlcy0+bGVhc2VfdGltZSA9IDA7CisJcmVzdWx0LT5sZWFzZV90aW1lID0gMDsKIAlyZXR1cm4gMDsKK291dF9vdmVyZmxvdzoKKwlwcmludF9vdmVyZmxvd19tc2coX19mdW5jX18sIHhkcik7CisJcmV0dXJuIC1FSU87Cit9CisKK3N0YXRpYyBpbnQgbmZzM194ZHJfZGVjX2ZzaW5mbzNyZXMoc3RydWN0IHJwY19ycXN0ICpyZXEsCisJCQkJICAgc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKKwkJCQkgICBzdHJ1Y3QgbmZzX2ZzaW5mbyAqcmVzdWx0KQoreworCWVudW0gbmZzX3N0YXQgc3RhdHVzOworCWludCBlcnJvcjsKKworCWVycm9yID0gZGVjb2RlX25mc3N0YXQzKHhkciwgJnN0YXR1cyk7CisJaWYgKHVubGlrZWx5KGVycm9yKSkKKwkJZ290byBvdXQ7CisJZXJyb3IgPSBkZWNvZGVfcG9zdF9vcF9hdHRyKHhkciwgcmVzdWx0LT5mYXR0cik7CisJaWYgKHVubGlrZWx5KGVycm9yKSkKKwkJZ290byBvdXQ7CisJaWYgKHN0YXR1cyAhPSBORlMzX09LKQorCQlnb3RvIG91dF9zdGF0dXM7CisJZXJyb3IgPSBkZWNvZGVfZnNpbmZvM3Jlc29rKHhkciwgcmVzdWx0KTsKK291dDoKKwlyZXR1cm4gZXJyb3I7CitvdXRfc3RhdHVzOgorCXJldHVybiBuZnNfc3RhdF90b19lcnJubyhzdGF0dXMpOwogfQogCiAvKgotICogRGVjb2RlIFBBVEhDT05GIHJlcGx5CisgKiAzLjMuMjAgIFBBVEhDT05GM3JlcworICoKKyAqCXN0cnVjdCBQQVRIQ09ORjNyZXNvayB7CisgKgkJcG9zdF9vcF9hdHRyCW9ial9hdHRyaWJ1dGVzOworICoJCXVpbnQzMgkJbGlua21heDsKKyAqCQl1aW50MzIJCW5hbWVfbWF4OworICoJCWJvb2wJCW5vX3RydW5jOworICoJCWJvb2wJCWNob3duX3Jlc3RyaWN0ZWQ7CisgKgkJYm9vbAkJY2FzZV9pbnNlbnNpdGl2ZTsKKyAqCQlib29sCQljYXNlX3ByZXNlcnZpbmc7CisgKgl9OworICoKKyAqCXN0cnVjdCBQQVRIQ09ORjNyZXNmYWlsIHsKKyAqCQlwb3N0X29wX2F0dHIJb2JqX2F0dHJpYnV0ZXM7CisgKgl9OworICoKKyAqCXVuaW9uIFBBVEhDT05GM3JlcyBzd2l0Y2ggKG5mc3N0YXQzIHN0YXR1cykgeworICoJY2FzZSBORlMzX09LOgorICoJCVBBVEhDT05GM3Jlc29rCXJlc29rOworICoJZGVmYXVsdDoKKyAqCQlQQVRIQ09ORjNyZXNmYWlsIHJlc2ZhaWw7CisgKgl9OwogICovCi1zdGF0aWMgaW50Ci1uZnMzX3hkcl9wYXRoY29uZnJlcyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLCBzdHJ1Y3QgbmZzX3BhdGhjb25mICpyZXMpCitzdGF0aWMgaW50IGRlY29kZV9wYXRoY29uZjNyZXNvayhzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAorCQkJCSBzdHJ1Y3QgbmZzX3BhdGhjb25mICpyZXN1bHQpCiB7Ci0JaW50CQlzdGF0dXM7CisJX19iZTMyICpwOwogCi0Jc3RhdHVzID0gbnRvaGwoKnArKyk7Ci0KLQlwID0geGRyX2RlY29kZV9wb3N0X29wX2F0dHIocCwgcmVzLT5mYXR0cik7Ci0JaWYgKHN0YXR1cyAhPSAwKQotCQlyZXR1cm4gbmZzX3N0YXRfdG9fZXJybm8oc3RhdHVzKTsKLQlyZXMtPm1heF9saW5rID0gbnRvaGwoKnArKyk7Ci0JcmVzLT5tYXhfbmFtZWxlbiA9IG50b2hsKCpwKyspOwotCisJcCA9IHhkcl9pbmxpbmVfZGVjb2RlKHhkciwgNCAqIDYpOworCWlmICh1bmxpa2VseShwID09IE5VTEwpKQorCQlnb3RvIG91dF9vdmVyZmxvdzsKKwlyZXN1bHQtPm1heF9saW5rID0gYmUzMl90b19jcHVwKHArKyk7CisJcmVzdWx0LT5tYXhfbmFtZWxlbiA9IGJlMzJfdG9fY3B1cChwKTsKIAkvKiBpZ25vcmUgcmVtYWluaW5nIGZpZWxkcyAqLwogCXJldHVybiAwOworb3V0X292ZXJmbG93OgorCXByaW50X292ZXJmbG93X21zZyhfX2Z1bmNfXywgeGRyKTsKKwlyZXR1cm4gLUVJTzsKK30KKworc3RhdGljIGludCBuZnMzX3hkcl9kZWNfcGF0aGNvbmYzcmVzKHN0cnVjdCBycGNfcnFzdCAqcmVxLAorCQkJCSAgICAgc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKKwkJCQkgICAgIHN0cnVjdCBuZnNfcGF0aGNvbmYgKnJlc3VsdCkKK3sKKwllbnVtIG5mc19zdGF0IHN0YXR1czsKKwlpbnQgZXJyb3I7CisKKwllcnJvciA9IGRlY29kZV9uZnNzdGF0Myh4ZHIsICZzdGF0dXMpOworCWlmICh1bmxpa2VseShlcnJvcikpCisJCWdvdG8gb3V0OworCWVycm9yID0gZGVjb2RlX3Bvc3Rfb3BfYXR0cih4ZHIsIHJlc3VsdC0+ZmF0dHIpOworCWlmICh1bmxpa2VseShlcnJvcikpCisJCWdvdG8gb3V0OworCWlmIChzdGF0dXMgIT0gTkZTM19PSykKKwkJZ290byBvdXRfc3RhdHVzOworCWVycm9yID0gZGVjb2RlX3BhdGhjb25mM3Jlc29rKHhkciwgcmVzdWx0KTsKK291dDoKKwlyZXR1cm4gZXJyb3I7CitvdXRfc3RhdHVzOgorCXJldHVybiBuZnNfc3RhdF90b19lcnJubyhzdGF0dXMpOwogfQogCiAvKgotICogRGVjb2RlIENPTU1JVCByZXBseQorICogMy4zLjIxICBDT01NSVQzcmVzCisgKgorICoJc3RydWN0IENPTU1JVDNyZXNvayB7CisgKgkJd2NjX2RhdGEJZmlsZV93Y2M7CisgKgkJd3JpdGV2ZXJmMwl2ZXJmOworICoJfTsKKyAqCisgKglzdHJ1Y3QgQ09NTUlUM3Jlc2ZhaWwgeworICoJCXdjY19kYXRhCWZpbGVfd2NjOworICoJfTsKKyAqCisgKgl1bmlvbiBDT01NSVQzcmVzIHN3aXRjaCAobmZzc3RhdDMgc3RhdHVzKSB7CisgKgljYXNlIE5GUzNfT0s6CisgKgkJQ09NTUlUM3Jlc29rCXJlc29rOworICoJZGVmYXVsdDoKKyAqCQlDT01NSVQzcmVzZmFpbAlyZXNmYWlsOworICoJfTsKICAqLwotc3RhdGljIGludAotbmZzM194ZHJfY29tbWl0cmVzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsIHN0cnVjdCBuZnNfd3JpdGVyZXMgKnJlcykKK3N0YXRpYyBpbnQgbmZzM194ZHJfZGVjX2NvbW1pdDNyZXMoc3RydWN0IHJwY19ycXN0ICpyZXEsCisJCQkJICAgc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKKwkJCQkgICBzdHJ1Y3QgbmZzX3dyaXRlcmVzICpyZXN1bHQpCiB7Ci0JaW50CQlzdGF0dXM7CisJZW51bSBuZnNfc3RhdCBzdGF0dXM7CisJaW50IGVycm9yOwogCi0Jc3RhdHVzID0gbnRvaGwoKnArKyk7Ci0JcCA9IHhkcl9kZWNvZGVfd2NjX2RhdGEocCwgcmVzLT5mYXR0cik7Ci0JaWYgKHN0YXR1cyAhPSAwKQotCQlyZXR1cm4gbmZzX3N0YXRfdG9fZXJybm8oc3RhdHVzKTsKLQotCXJlcy0+dmVyZi0+dmVyaWZpZXJbMF0gPSAqcCsrOwotCXJlcy0+dmVyZi0+dmVyaWZpZXJbMV0gPSAqcCsrOwotCXJldHVybiAwOworCWVycm9yID0gZGVjb2RlX25mc3N0YXQzKHhkciwgJnN0YXR1cyk7CisJaWYgKHVubGlrZWx5KGVycm9yKSkKKwkJZ290byBvdXQ7CisJZXJyb3IgPSBkZWNvZGVfd2NjX2RhdGEoeGRyLCByZXN1bHQtPmZhdHRyKTsKKwlpZiAodW5saWtlbHkoZXJyb3IpKQorCQlnb3RvIG91dDsKKwlpZiAoc3RhdHVzICE9IE5GUzNfT0spCisJCWdvdG8gb3V0X3N0YXR1czsKKwllcnJvciA9IGRlY29kZV93cml0ZXZlcmYzKHhkciwgcmVzdWx0LT52ZXJmLT52ZXJpZmllcik7CitvdXQ6CisJcmV0dXJuIGVycm9yOworb3V0X3N0YXR1czoKKwlyZXR1cm4gbmZzX3N0YXRfdG9fZXJybm8oc3RhdHVzKTsKIH0KIAogI2lmZGVmIENPTkZJR19ORlNfVjNfQUNMCi0vKgotICogRGVjb2RlIEdFVEFDTCByZXBseQotICovCi1zdGF0aWMgaW50Ci1uZnMzX3hkcl9nZXRhY2xyZXMoc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwKLQkJICAgc3RydWN0IG5mczNfZ2V0YWNscmVzICpyZXMpCisKK3N0YXRpYyBpbmxpbmUgaW50IGRlY29kZV9nZXRhY2wzcmVzb2soc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKKwkJCQkgICAgICBzdHJ1Y3QgbmZzM19nZXRhY2xyZXMgKnJlc3VsdCkKIHsKLQlzdHJ1Y3QgeGRyX2J1ZiAqYnVmID0gJnJlcS0+cnFfcmN2X2J1ZjsKLQlpbnQgc3RhdHVzID0gbnRvaGwoKnArKyk7CiAJc3RydWN0IHBvc2l4X2FjbCAqKmFjbDsKIAl1bnNpZ25lZCBpbnQgKmFjbGNudDsKLQlpbnQgZXJyLCBiYXNlOworCXNpemVfdCBoZHJsZW47CisJaW50IGVycm9yOwogCi0JaWYgKHN0YXR1cyAhPSAwKQotCQlyZXR1cm4gbmZzX3N0YXRfdG9fZXJybm8oc3RhdHVzKTsKLQlwID0geGRyX2RlY29kZV9wb3N0X29wX2F0dHIocCwgcmVzLT5mYXR0cik7Ci0JcmVzLT5tYXNrID0gbnRvaGwoKnArKyk7Ci0JaWYgKHJlcy0+bWFzayAmIH4oTkZTX0FDTHxORlNfQUNMQ05UfE5GU19ERkFDTHxORlNfREZBQ0xDTlQpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQliYXNlID0gKGNoYXIgKilwIC0gKGNoYXIgKilyZXEtPnJxX3Jjdl9idWYuaGVhZC0+aW92X2Jhc2U7CisJZXJyb3IgPSBkZWNvZGVfcG9zdF9vcF9hdHRyKHhkciwgcmVzdWx0LT5mYXR0cik7CisJaWYgKHVubGlrZWx5KGVycm9yKSkKKwkJZ290byBvdXQ7CisJZXJyb3IgPSBkZWNvZGVfdWludDMyKHhkciwgJnJlc3VsdC0+bWFzayk7CisJaWYgKHVubGlrZWx5KGVycm9yKSkKKwkJZ290byBvdXQ7CisJZXJyb3IgPSAtRUlOVkFMOworCWlmIChyZXN1bHQtPm1hc2sgJiB+KE5GU19BQ0x8TkZTX0FDTENOVHxORlNfREZBQ0x8TkZTX0RGQUNMQ05UKSkKKwkJZ290byBvdXQ7CiAKLQlhY2wgPSAocmVzLT5tYXNrICYgTkZTX0FDTCkgPyAmcmVzLT5hY2xfYWNjZXNzIDogTlVMTDsKLQlhY2xjbnQgPSAocmVzLT5tYXNrICYgTkZTX0FDTENOVCkgPyAmcmVzLT5hY2xfYWNjZXNzX2NvdW50IDogTlVMTDsKLQllcnIgPSBuZnNhY2xfZGVjb2RlKGJ1ZiwgYmFzZSwgYWNsY250LCBhY2wpOworCWhkcmxlbiA9ICh1OCAqKXhkci0+cCAtICh1OCAqKXhkci0+aW92LT5pb3ZfYmFzZTsKIAotCWFjbCA9IChyZXMtPm1hc2sgJiBORlNfREZBQ0wpID8gJnJlcy0+YWNsX2RlZmF1bHQgOiBOVUxMOwotCWFjbGNudCA9IChyZXMtPm1hc2sgJiBORlNfREZBQ0xDTlQpID8gJnJlcy0+YWNsX2RlZmF1bHRfY291bnQgOiBOVUxMOwotCWlmIChlcnIgPiAwKQotCQllcnIgPSBuZnNhY2xfZGVjb2RlKGJ1ZiwgYmFzZSArIGVyciwgYWNsY250LCBhY2wpOwotCXJldHVybiAoZXJyID4gMCkgPyAwIDogZXJyOworCWFjbCA9IE5VTEw7CisJaWYgKHJlc3VsdC0+bWFzayAmIE5GU19BQ0wpCisJCWFjbCA9ICZyZXN1bHQtPmFjbF9hY2Nlc3M7CisJYWNsY250ID0gTlVMTDsKKwlpZiAocmVzdWx0LT5tYXNrICYgTkZTX0FDTENOVCkKKwkJYWNsY250ID0gJnJlc3VsdC0+YWNsX2FjY2Vzc19jb3VudDsKKwllcnJvciA9IG5mc2FjbF9kZWNvZGUoeGRyLT5idWYsIGhkcmxlbiwgYWNsY250LCBhY2wpOworCWlmICh1bmxpa2VseShlcnJvciA8PSAwKSkKKwkJZ290byBvdXQ7CisKKwlhY2wgPSBOVUxMOworCWlmIChyZXN1bHQtPm1hc2sgJiBORlNfREZBQ0wpCisJCWFjbCA9ICZyZXN1bHQtPmFjbF9kZWZhdWx0OworCWFjbGNudCA9IE5VTEw7CisJaWYgKHJlc3VsdC0+bWFzayAmIE5GU19ERkFDTENOVCkKKwkJYWNsY250ID0gJnJlc3VsdC0+YWNsX2RlZmF1bHRfY291bnQ7CisJZXJyb3IgPSBuZnNhY2xfZGVjb2RlKHhkci0+YnVmLCBoZHJsZW4gKyBlcnJvciwgYWNsY250LCBhY2wpOworCWlmICh1bmxpa2VseShlcnJvciA8PSAwKSkKKwkJcmV0dXJuIGVycm9yOworCWVycm9yID0gMDsKK291dDoKKwlyZXR1cm4gZXJyb3I7CiB9CiAKLS8qCi0gKiBEZWNvZGUgc2V0YWNsIHJlcGx5LgotICovCi1zdGF0aWMgaW50Ci1uZnMzX3hkcl9zZXRhY2xyZXMoc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgc3RydWN0IG5mc19mYXR0ciAqZmF0dHIpCitzdGF0aWMgaW50IG5mczNfeGRyX2RlY19nZXRhY2wzcmVzKHN0cnVjdCBycGNfcnFzdCAqcmVxLAorCQkJCSAgIHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCisJCQkJICAgc3RydWN0IG5mczNfZ2V0YWNscmVzICpyZXN1bHQpCiB7Ci0JaW50IHN0YXR1cyA9IG50b2hsKCpwKyspOworCWVudW0gbmZzX3N0YXQgc3RhdHVzOworCWludCBlcnJvcjsKIAotCWlmIChzdGF0dXMpCi0JCXJldHVybiBuZnNfc3RhdF90b19lcnJubyhzdGF0dXMpOwotCXhkcl9kZWNvZGVfcG9zdF9vcF9hdHRyKHAsIGZhdHRyKTsKLQlyZXR1cm4gMDsKKwllcnJvciA9IGRlY29kZV9uZnNzdGF0Myh4ZHIsICZzdGF0dXMpOworCWlmICh1bmxpa2VseShlcnJvcikpCisJCWdvdG8gb3V0OworCWlmIChzdGF0dXMgIT0gTkZTM19PSykKKwkJZ290byBvdXRfZGVmYXVsdDsKKwllcnJvciA9IGRlY29kZV9nZXRhY2wzcmVzb2soeGRyLCByZXN1bHQpOworb3V0OgorCXJldHVybiBlcnJvcjsKK291dF9kZWZhdWx0OgorCXJldHVybiBuZnNfc3RhdF90b19lcnJubyhzdGF0dXMpOwogfQorCitzdGF0aWMgaW50IG5mczNfeGRyX2RlY19zZXRhY2wzcmVzKHN0cnVjdCBycGNfcnFzdCAqcmVxLAorCQkJCSAgIHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCisJCQkJICAgc3RydWN0IG5mc19mYXR0ciAqcmVzdWx0KQoreworCWVudW0gbmZzX3N0YXQgc3RhdHVzOworCWludCBlcnJvcjsKKworCWVycm9yID0gZGVjb2RlX25mc3N0YXQzKHhkciwgJnN0YXR1cyk7CisJaWYgKHVubGlrZWx5KGVycm9yKSkKKwkJZ290byBvdXQ7CisJaWYgKHN0YXR1cyAhPSBORlMzX09LKQorCQlnb3RvIG91dF9kZWZhdWx0OworCWVycm9yID0gZGVjb2RlX3Bvc3Rfb3BfYXR0cih4ZHIsIHJlc3VsdCk7CitvdXQ6CisJcmV0dXJuIGVycm9yOworb3V0X2RlZmF1bHQ6CisJcmV0dXJuIG5mc19zdGF0X3RvX2Vycm5vKHN0YXR1cyk7Cit9CisKICNlbmRpZiAgLyogQ09ORklHX05GU19WM19BQ0wgKi8KIAogI2RlZmluZSBQUk9DKHByb2MsIGFyZ3R5cGUsIHJlc3R5cGUsIHRpbWVyKQkJCQlcCiBbTkZTM1BST0NfIyNwcm9jXSA9IHsJCQkJCQkJXAogCS5wX3Byb2MgICAgICA9IE5GUzNQUk9DXyMjcHJvYywJCQkJCVwKLQkucF9lbmNvZGUgICAgPSAoa3hkcnByb2NfdCkgbmZzM194ZHJfIyNhcmd0eXBlLAkJCVwKLQkucF9kZWNvZGUgICAgPSAoa3hkcnByb2NfdCkgbmZzM194ZHJfIyNyZXN0eXBlLAkJCVwKLQkucF9hcmdsZW4gICAgPSBORlMzXyMjYXJndHlwZSMjX3N6LAkJCQlcCi0JLnBfcmVwbGVuICAgID0gTkZTM18jI3Jlc3R5cGUjI19zeiwJCQkJXAorCS5wX2VuY29kZSAgICA9IChreGRyZXByb2NfdCluZnMzX3hkcl9lbmNfIyNhcmd0eXBlIyMzYXJncywJXAorCS5wX2RlY29kZSAgICA9IChreGRyZHByb2NfdCluZnMzX3hkcl9kZWNfIyNyZXN0eXBlIyMzcmVzLAlcCisJLnBfYXJnbGVuICAgID0gTkZTM18jI2FyZ3R5cGUjI2FyZ3Nfc3osCQkJCVwKKwkucF9yZXBsZW4gICAgPSBORlMzXyMjcmVzdHlwZSMjcmVzX3N6LAkJCQlcCiAJLnBfdGltZXIgICAgID0gdGltZXIsCQkJCQkJXAogCS5wX3N0YXRpZHggICA9IE5GUzNQUk9DXyMjcHJvYywJCQkJCVwKIAkucF9uYW1lICAgICAgPSAjcHJvYywJCQkJCQlcCiAJfQogCiBzdHJ1Y3QgcnBjX3Byb2NpbmZvCW5mczNfcHJvY2VkdXJlc1tdID0gewotICBQUk9DKEdFVEFUVFIsCQlmaGFuZGxlLAlhdHRyc3RhdCwgMSksCi0gIFBST0MoU0VUQVRUUiwgCXNhdHRyYXJncywJd2Njc3RhdCwgMCksCi0gIFBST0MoTE9PS1VQLAkJZGlyb3BhcmdzLAlsb29rdXByZXMsIDIpLAotICBQUk9DKEFDQ0VTUywJCWFjY2Vzc2FyZ3MsCWFjY2Vzc3JlcywgMSksCi0gIFBST0MoUkVBRExJTkssCXJlYWRsaW5rYXJncywJcmVhZGxpbmtyZXMsIDMpLAotICBQUk9DKFJFQUQsCQlyZWFkYXJncywJcmVhZHJlcywgMyksCi0gIFBST0MoV1JJVEUsCQl3cml0ZWFyZ3MsCXdyaXRlcmVzLCA0KSwKLSAgUFJPQyhDUkVBVEUsCQljcmVhdGVhcmdzLAljcmVhdGVyZXMsIDApLAotICBQUk9DKE1LRElSLAkJbWtkaXJhcmdzLAljcmVhdGVyZXMsIDApLAotICBQUk9DKFNZTUxJTkssCQlzeW1saW5rYXJncywJY3JlYXRlcmVzLCAwKSwKLSAgUFJPQyhNS05PRCwJCW1rbm9kYXJncywJY3JlYXRlcmVzLCAwKSwKLSAgUFJPQyhSRU1PVkUsCQlyZW1vdmVhcmdzLAlyZW1vdmVyZXMsIDApLAotICBQUk9DKFJNRElSLAkJZGlyb3BhcmdzLAl3Y2NzdGF0LCAwKSwKLSAgUFJPQyhSRU5BTUUsCQlyZW5hbWVhcmdzLAlyZW5hbWVyZXMsIDApLAotICBQUk9DKExJTkssCQlsaW5rYXJncywJbGlua3JlcywgMCksCi0gIFBST0MoUkVBRERJUiwJCXJlYWRkaXJhcmdzLAlyZWFkZGlycmVzLCAzKSwKLSAgUFJPQyhSRUFERElSUExVUywJcmVhZGRpcmFyZ3MsCXJlYWRkaXJyZXMsIDMpLAotICBQUk9DKEZTU1RBVCwJCWZoYW5kbGUsCWZzc3RhdHJlcywgMCksCi0gIFBST0MoRlNJTkZPLCAgCWZoYW5kbGUsCWZzaW5mb3JlcywgMCksCi0gIFBST0MoUEFUSENPTkYsCWZoYW5kbGUsCXBhdGhjb25mcmVzLCAwKSwKLSAgUFJPQyhDT01NSVQsCQljb21taXRhcmdzLAljb21taXRyZXMsIDUpLAorCVBST0MoR0VUQVRUUiwJCWdldGF0dHIsCWdldGF0dHIsCTEpLAorCVBST0MoU0VUQVRUUiwJCXNldGF0dHIsCXNldGF0dHIsCTApLAorCVBST0MoTE9PS1VQLAkJbG9va3VwLAkJbG9va3VwLAkJMiksCisJUFJPQyhBQ0NFU1MsCQlhY2Nlc3MsCQlhY2Nlc3MsCQkxKSwKKwlQUk9DKFJFQURMSU5LLAkJcmVhZGxpbmssCXJlYWRsaW5rLAkzKSwKKwlQUk9DKFJFQUQsCQlyZWFkLAkJcmVhZCwJCTMpLAorCVBST0MoV1JJVEUsCQl3cml0ZSwJCXdyaXRlLAkJNCksCisJUFJPQyhDUkVBVEUsCQljcmVhdGUsCQljcmVhdGUsCQkwKSwKKwlQUk9DKE1LRElSLAkJbWtkaXIsCQljcmVhdGUsCQkwKSwKKwlQUk9DKFNZTUxJTkssCQlzeW1saW5rLAljcmVhdGUsCQkwKSwKKwlQUk9DKE1LTk9ELAkJbWtub2QsCQljcmVhdGUsCQkwKSwKKwlQUk9DKFJFTU9WRSwJCXJlbW92ZSwJCXJlbW92ZSwJCTApLAorCVBST0MoUk1ESVIsCQlsb29rdXAsCQlzZXRhdHRyLAkwKSwKKwlQUk9DKFJFTkFNRSwJCXJlbmFtZSwJCXJlbmFtZSwJCTApLAorCVBST0MoTElOSywJCWxpbmssCQlsaW5rLAkJMCksCisJUFJPQyhSRUFERElSLAkJcmVhZGRpciwJcmVhZGRpciwJMyksCisJUFJPQyhSRUFERElSUExVUywJcmVhZGRpcnBsdXMsCXJlYWRkaXIsCTMpLAorCVBST0MoRlNTVEFULAkJZ2V0YXR0ciwJZnNzdGF0LAkJMCksCisJUFJPQyhGU0lORk8sCQlnZXRhdHRyLAlmc2luZm8sCQkwKSwKKwlQUk9DKFBBVEhDT05GLAkJZ2V0YXR0ciwJcGF0aGNvbmYsCTApLAorCVBST0MoQ09NTUlULAkJY29tbWl0LAkJY29tbWl0LAkJNSksCiB9OwogCiBzdHJ1Y3QgcnBjX3ZlcnNpb24JCW5mc192ZXJzaW9uMyA9IHsKQEAgLTExODUsOCArMjQ2OCw4IEBACiBzdGF0aWMgc3RydWN0IHJwY19wcm9jaW5mbwluZnMzX2FjbF9wcm9jZWR1cmVzW10gPSB7CiAJW0FDTFBST0MzX0dFVEFDTF0gPSB7CiAJCS5wX3Byb2MgPSBBQ0xQUk9DM19HRVRBQ0wsCi0JCS5wX2VuY29kZSA9IChreGRycHJvY190KSBuZnMzX3hkcl9nZXRhY2xhcmdzLAotCQkucF9kZWNvZGUgPSAoa3hkcnByb2NfdCkgbmZzM194ZHJfZ2V0YWNscmVzLAorCQkucF9lbmNvZGUgPSAoa3hkcmVwcm9jX3QpbmZzM194ZHJfZW5jX2dldGFjbDNhcmdzLAorCQkucF9kZWNvZGUgPSAoa3hkcmRwcm9jX3QpbmZzM194ZHJfZGVjX2dldGFjbDNyZXMsCiAJCS5wX2FyZ2xlbiA9IEFDTDNfZ2V0YWNsYXJnc19zeiwKIAkJLnBfcmVwbGVuID0gQUNMM19nZXRhY2xyZXNfc3osCiAJCS5wX3RpbWVyID0gMSwKQEAgLTExOTQsOCArMjQ3Nyw4IEBACiAJfSwKIAlbQUNMUFJPQzNfU0VUQUNMXSA9IHsKIAkJLnBfcHJvYyA9IEFDTFBST0MzX1NFVEFDTCwKLQkJLnBfZW5jb2RlID0gKGt4ZHJwcm9jX3QpIG5mczNfeGRyX3NldGFjbGFyZ3MsCi0JCS5wX2RlY29kZSA9IChreGRycHJvY190KSBuZnMzX3hkcl9zZXRhY2xyZXMsCisJCS5wX2VuY29kZSA9IChreGRyZXByb2NfdCluZnMzX3hkcl9lbmNfc2V0YWNsM2FyZ3MsCisJCS5wX2RlY29kZSA9IChreGRyZHByb2NfdCluZnMzX3hkcl9kZWNfc2V0YWNsM3JlcywKIAkJLnBfYXJnbGVuID0gQUNMM19zZXRhY2xhcmdzX3N6LAogCQkucF9yZXBsZW4gPSBBQ0wzX3NldGFjbHJlc19zeiwKIAkJLnBfdGltZXIgPSAwLApkaWZmIC0tZ2l0IGEvZnMvbmZzL25mczRfZnMuaCBiL2ZzL25mcy9uZnM0X2ZzLmgKaW5kZXggOWZhNDk2My4uN2E3NDc0MCAxMDA2NDQKLS0tIGEvZnMvbmZzL25mczRfZnMuaAorKysgYi9mcy9uZnMvbmZzNF9mcy5oCkBAIC00NCw2ICs0NCw3IEBACiAJTkZTNENMTlRfUkVDTEFJTV9SRUJPT1QsCiAJTkZTNENMTlRfUkVDTEFJTV9OT0dSQUNFLAogCU5GUzRDTE5UX0RFTEVHUkVUVVJOLAorCU5GUzRDTE5UX0xBWU9VVFJFQ0FMTCwKIAlORlM0Q0xOVF9TRVNTSU9OX1JFU0VULAogCU5GUzRDTE5UX1JFQ0FMTF9TTE9ULAogfTsKQEAgLTEwOSw3ICsxMTAsNyBAQAogc3RydWN0IG5mczRfc3RhdGVfb3duZXIgewogCXN0cnVjdCBuZnNfdW5pcXVlX2lkIHNvX293bmVyX2lkOwogCXN0cnVjdCBuZnNfc2VydmVyICAgICpzb19zZXJ2ZXI7Ci0Jc3RydWN0IHJiX25vZGUJICAgICBzb19jbGllbnRfbm9kZTsKKwlzdHJ1Y3QgcmJfbm9kZQkgICAgIHNvX3NlcnZlcl9ub2RlOwogCiAJc3RydWN0IHJwY19jcmVkCSAgICAgKnNvX2NyZWQ7CSAvKiBBc3NvY2lhdGVkIGNyZWQgKi8KIApAQCAtMjI3LDEyICsyMjgsNiBAQAogZXh0ZXJuIGNvbnN0IHN0cnVjdCBkZW50cnlfb3BlcmF0aW9ucyBuZnM0X2RlbnRyeV9vcGVyYXRpb25zOwogZXh0ZXJuIGNvbnN0IHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIG5mczRfZGlyX2lub2RlX29wZXJhdGlvbnM7CiAKLS8qIGlub2RlLmMgKi8KLWV4dGVybiBzc2l6ZV90IG5mczRfZ2V0eGF0dHIoc3RydWN0IGRlbnRyeSAqLCBjb25zdCBjaGFyICosIHZvaWQgKiwgc2l6ZV90KTsKLWV4dGVybiBpbnQgbmZzNF9zZXR4YXR0cihzdHJ1Y3QgZGVudHJ5ICosIGNvbnN0IGNoYXIgKiwgY29uc3Qgdm9pZCAqLCBzaXplX3QsIGludCk7Ci1leHRlcm4gc3NpemVfdCBuZnM0X2xpc3R4YXR0cihzdHJ1Y3QgZGVudHJ5ICosIGNoYXIgKiwgc2l6ZV90KTsKLQotCiAvKiBuZnM0cHJvYy5jICovCiBleHRlcm4gaW50IG5mczRfcHJvY19zZXRjbGllbnRpZChzdHJ1Y3QgbmZzX2NsaWVudCAqLCB1MzIsIHVuc2lnbmVkIHNob3J0LCBzdHJ1Y3QgcnBjX2NyZWQgKiwgc3RydWN0IG5mczRfc2V0Y2xpZW50aWRfcmVzICopOwogZXh0ZXJuIGludCBuZnM0X3Byb2Nfc2V0Y2xpZW50aWRfY29uZmlybShzdHJ1Y3QgbmZzX2NsaWVudCAqLCBzdHJ1Y3QgbmZzNF9zZXRjbGllbnRpZF9yZXMgKmFyZywgc3RydWN0IHJwY19jcmVkICopOwpAQCAtMjQxLDExICsyMzYsMTIgQEAKIGV4dGVybiBpbnQgbmZzNF9wcm9jX3JlbmV3KHN0cnVjdCBuZnNfY2xpZW50ICosIHN0cnVjdCBycGNfY3JlZCAqKTsKIGV4dGVybiBpbnQgbmZzNF9pbml0X2NsaWVudGlkKHN0cnVjdCBuZnNfY2xpZW50ICosIHN0cnVjdCBycGNfY3JlZCAqKTsKIGV4dGVybiBpbnQgbmZzNDFfaW5pdF9jbGllbnRpZChzdHJ1Y3QgbmZzX2NsaWVudCAqLCBzdHJ1Y3QgcnBjX2NyZWQgKik7Ci1leHRlcm4gaW50IG5mczRfZG9fY2xvc2Uoc3RydWN0IHBhdGggKnBhdGgsIHN0cnVjdCBuZnM0X3N0YXRlICpzdGF0ZSwgZ2ZwX3QgZ2ZwX21hc2ssIGludCB3YWl0KTsKK2V4dGVybiBpbnQgbmZzNF9kb19jbG9zZShzdHJ1Y3QgcGF0aCAqcGF0aCwgc3RydWN0IG5mczRfc3RhdGUgKnN0YXRlLCBnZnBfdCBnZnBfbWFzaywgaW50IHdhaXQsIGJvb2wgcm9jKTsKIGV4dGVybiBpbnQgbmZzNF9zZXJ2ZXJfY2FwYWJpbGl0aWVzKHN0cnVjdCBuZnNfc2VydmVyICpzZXJ2ZXIsIHN0cnVjdCBuZnNfZmggKmZoYW5kbGUpOwogZXh0ZXJuIGludCBuZnM0X3Byb2NfZnNfbG9jYXRpb25zKHN0cnVjdCBpbm9kZSAqZGlyLCBjb25zdCBzdHJ1Y3QgcXN0ciAqbmFtZSwKIAkJc3RydWN0IG5mczRfZnNfbG9jYXRpb25zICpmc19sb2NhdGlvbnMsIHN0cnVjdCBwYWdlICpwYWdlKTsKIGV4dGVybiB2b2lkIG5mczRfcmVsZWFzZV9sb2Nrb3duZXIoY29uc3Qgc3RydWN0IG5mczRfbG9ja19zdGF0ZSAqKTsKK2V4dGVybiBjb25zdCBzdHJ1Y3QgeGF0dHJfaGFuZGxlciAqbmZzNF94YXR0cl9oYW5kbGVyc1tdOwogCiAjaWYgZGVmaW5lZChDT05GSUdfTkZTX1Y0XzEpCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBuZnM0X3Nlc3Npb24gKm5mczRfZ2V0X3Nlc3Npb24oY29uc3Qgc3RydWN0IG5mc19zZXJ2ZXIgKnNlcnZlcikKQEAgLTMzMSw3ICszMjcsNiBAQAogZXh0ZXJuIGNvbnN0IG5mczRfc3RhdGVpZCB6ZXJvX3N0YXRlaWQ7CiAKIC8qIG5mczR4ZHIuYyAqLwotZXh0ZXJuIF9fYmUzMiAqbmZzNF9kZWNvZGVfZGlyZW50KHN0cnVjdCB4ZHJfc3RyZWFtICosIHN0cnVjdCBuZnNfZW50cnkgKiwgc3RydWN0IG5mc19zZXJ2ZXIgKiwgaW50KTsKIGV4dGVybiBzdHJ1Y3QgcnBjX3Byb2NpbmZvIG5mczRfcHJvY2VkdXJlc1tdOwogCiBzdHJ1Y3QgbmZzNF9tb3VudF9kYXRhOwpkaWZmIC0tZ2l0IGEvZnMvbmZzL25mczRmaWxlbGF5b3V0LmMgYi9mcy9uZnMvbmZzNGZpbGVsYXlvdXQuYwppbmRleCAyZTkyZjBkLi4yM2Y5MzBjIDEwMDY0NAotLS0gYS9mcy9uZnMvbmZzNGZpbGVsYXlvdXQuYworKysgYi9mcy9uZnMvbmZzNGZpbGVsYXlvdXQuYwpAQCAtODIsNyArODIsNyBAQAogewogCXN0cnVjdCBuZnM0X2ZpbGVfbGF5b3V0X2RzYWRkciAqZHNhZGRyOwogCWludCBzdGF0dXMgPSAtRUlOVkFMOwotCXN0cnVjdCBuZnNfc2VydmVyICpuZnNzID0gTkZTX1NFUlZFUihsby0+aW5vZGUpOworCXN0cnVjdCBuZnNfc2VydmVyICpuZnNzID0gTkZTX1NFUlZFUihsby0+cGxoX2lub2RlKTsKIAogCWRwcmludGsoIi0tPiAlc1xuIiwgX19mdW5jX18pOwogCkBAIC0xMDEsNyArMTAxLDcgQEAKIAkvKiBmaW5kIGFuZCByZWZlcmVuY2UgdGhlIGRldmljZWlkICovCiAJZHNhZGRyID0gbmZzNF9mbF9maW5kX2dldF9kZXZpY2VpZChuZnNzLT5uZnNfY2xpZW50LCBpZCk7CiAJaWYgKGRzYWRkciA9PSBOVUxMKSB7Ci0JCWRzYWRkciA9IGdldF9kZXZpY2VfaW5mbyhsby0+aW5vZGUsIGlkKTsKKwkJZHNhZGRyID0gZ2V0X2RldmljZV9pbmZvKGxvLT5wbGhfaW5vZGUsIGlkKTsKIAkJaWYgKGRzYWRkciA9PSBOVUxMKQogCQkJZ290byBvdXQ7CiAJfQpAQCAtMjQzLDcgKzI0Myw3IEBACiBzdGF0aWMgdm9pZAogZmlsZWxheW91dF9mcmVlX2xzZWcoc3RydWN0IHBuZnNfbGF5b3V0X3NlZ21lbnQgKmxzZWcpCiB7Ci0Jc3RydWN0IG5mc19zZXJ2ZXIgKm5mc3MgPSBORlNfU0VSVkVSKGxzZWctPmxheW91dC0+aW5vZGUpOworCXN0cnVjdCBuZnNfc2VydmVyICpuZnNzID0gTkZTX1NFUlZFUihsc2VnLT5wbHNfbGF5b3V0LT5wbGhfaW5vZGUpOwogCXN0cnVjdCBuZnM0X2ZpbGVsYXlvdXRfc2VnbWVudCAqZmwgPSBGSUxFTEFZT1VUX0xTRUcobHNlZyk7CiAKIAlkcHJpbnRrKCItLT4gJXNcbiIsIF9fZnVuY19fKTsKZGlmZiAtLWdpdCBhL2ZzL25mcy9uZnM0cHJvYy5jIGIvZnMvbmZzL25mczRwcm9jLmMKaW5kZXggNDQzNWU1ZS4uOWQ5OTJiMCAxMDA2NDQKLS0tIGEvZnMvbmZzL25mczRwcm9jLmMKKysrIGIvZnMvbmZzL25mczRwcm9jLmMKQEAgLTQ5LDYgKzQ5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tb3VudC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9iY194cHJ0Lmg+CisjaW5jbHVkZSA8bGludXgveGF0dHIuaD4KIAogI2luY2x1ZGUgIm5mczRfZnMuaCIKICNpbmNsdWRlICJkZWxlZ2F0aW9uLmgiCkBAIC0zNTUsOSArMzU2LDkgQEAKIH0KIAogLyoKLSAqIFNpZ25hbCBzdGF0ZSBtYW5hZ2VyIHRocmVhZCBpZiBzZXNzaW9uIGlzIGRyYWluZWQKKyAqIFNpZ25hbCBzdGF0ZSBtYW5hZ2VyIHRocmVhZCBpZiBzZXNzaW9uIGZvcmUgY2hhbm5lbCBpcyBkcmFpbmVkCiAgKi8KLXN0YXRpYyB2b2lkIG5mczQxX2NoZWNrX2RyYWluX3Nlc3Npb25fY29tcGxldGUoc3RydWN0IG5mczRfc2Vzc2lvbiAqc2VzKQorc3RhdGljIHZvaWQgbmZzNF9jaGVja19kcmFpbl9mY19jb21wbGV0ZShzdHJ1Y3QgbmZzNF9zZXNzaW9uICpzZXMpCiB7CiAJc3RydWN0IHJwY190YXNrICp0YXNrOwogCkBAIC0zNzEsOCArMzcyLDIwIEBACiAJaWYgKHNlcy0+ZmNfc2xvdF90YWJsZS5oaWdoZXN0X3VzZWRfc2xvdGlkICE9IC0xKQogCQlyZXR1cm47CiAKLQlkcHJpbnRrKCIlcyBDT01QTEVURTogU2Vzc2lvbiBEcmFpbmVkXG4iLCBfX2Z1bmNfXyk7Ci0JY29tcGxldGUoJnNlcy0+Y29tcGxldGUpOworCWRwcmludGsoIiVzIENPTVBMRVRFOiBTZXNzaW9uIEZvcmUgQ2hhbm5lbCBEcmFpbmVkXG4iLCBfX2Z1bmNfXyk7CisJY29tcGxldGUoJnNlcy0+ZmNfc2xvdF90YWJsZS5jb21wbGV0ZSk7Cit9CisKKy8qCisgKiBTaWduYWwgc3RhdGUgbWFuYWdlciB0aHJlYWQgaWYgc2Vzc2lvbiBiYWNrIGNoYW5uZWwgaXMgZHJhaW5lZAorICovCit2b2lkIG5mczRfY2hlY2tfZHJhaW5fYmNfY29tcGxldGUoc3RydWN0IG5mczRfc2Vzc2lvbiAqc2VzKQoreworCWlmICghdGVzdF9iaXQoTkZTNF9TRVNTSU9OX0RSQUlOSU5HLCAmc2VzLT5zZXNzaW9uX3N0YXRlKSB8fAorCSAgICBzZXMtPmJjX3Nsb3RfdGFibGUuaGlnaGVzdF91c2VkX3Nsb3RpZCAhPSAtMSkKKwkJcmV0dXJuOworCWRwcmludGsoIiVzIENPTVBMRVRFOiBTZXNzaW9uIEJhY2sgQ2hhbm5lbCBEcmFpbmVkXG4iLCBfX2Z1bmNfXyk7CisJY29tcGxldGUoJnNlcy0+YmNfc2xvdF90YWJsZS5jb21wbGV0ZSk7CiB9CiAKIHN0YXRpYyB2b2lkIG5mczQxX3NlcXVlbmNlX2ZyZWVfc2xvdChzdHJ1Y3QgbmZzNF9zZXF1ZW5jZV9yZXMgKnJlcykKQEAgLTM4OSw3ICs0MDIsNyBAQAogCiAJc3Bpbl9sb2NrKCZ0YmwtPnNsb3RfdGJsX2xvY2spOwogCW5mczRfZnJlZV9zbG90KHRibCwgcmVzLT5zcl9zbG90KTsKLQluZnM0MV9jaGVja19kcmFpbl9zZXNzaW9uX2NvbXBsZXRlKHJlcy0+c3Jfc2Vzc2lvbik7CisJbmZzNF9jaGVja19kcmFpbl9mY19jb21wbGV0ZShyZXMtPnNyX3Nlc3Npb24pOwogCXNwaW5fdW5sb2NrKCZ0YmwtPnNsb3RfdGJsX2xvY2spOwogCXJlcy0+c3Jfc2xvdCA9IE5VTEw7CiB9CkBAIC0xODI2LDYgKzE4MzksOCBAQAogCXN0cnVjdCBuZnNfY2xvc2VyZXMgcmVzOwogCXN0cnVjdCBuZnNfZmF0dHIgZmF0dHI7CiAJdW5zaWduZWQgbG9uZyB0aW1lc3RhbXA7CisJYm9vbCByb2M7CisJdTMyIHJvY19iYXJyaWVyOwogfTsKIAogc3RhdGljIHZvaWQgbmZzNF9mcmVlX2Nsb3NlZGF0YSh2b2lkICpkYXRhKQpAQCAtMTgzMyw2ICsxODQ4LDggQEAKIAlzdHJ1Y3QgbmZzNF9jbG9zZWRhdGEgKmNhbGxkYXRhID0gZGF0YTsKIAlzdHJ1Y3QgbmZzNF9zdGF0ZV9vd25lciAqc3AgPSBjYWxsZGF0YS0+c3RhdGUtPm93bmVyOwogCisJaWYgKGNhbGxkYXRhLT5yb2MpCisJCXBuZnNfcm9jX3JlbGVhc2UoY2FsbGRhdGEtPnN0YXRlLT5pbm9kZSk7CiAJbmZzNF9wdXRfb3Blbl9zdGF0ZShjYWxsZGF0YS0+c3RhdGUpOwogCW5mc19mcmVlX3NlcWlkKGNhbGxkYXRhLT5hcmcuc2VxaWQpOwogCW5mczRfcHV0X3N0YXRlX293bmVyKHNwKTsKQEAgLTE4NjUsNiArMTg4Miw5IEBACiAJICovCiAJc3dpdGNoICh0YXNrLT50a19zdGF0dXMpIHsKIAkJY2FzZSAwOgorCQkJaWYgKGNhbGxkYXRhLT5yb2MpCisJCQkJcG5mc19yb2Nfc2V0X2JhcnJpZXIoc3RhdGUtPmlub2RlLAorCQkJCQkJICAgICBjYWxsZGF0YS0+cm9jX2JhcnJpZXIpOwogCQkJbmZzX3NldF9vcGVuX3N0YXRlaWQoc3RhdGUsICZjYWxsZGF0YS0+cmVzLnN0YXRlaWQsIDApOwogCQkJcmVuZXdfbGVhc2Uoc2VydmVyLCBjYWxsZGF0YS0+dGltZXN0YW1wKTsKIAkJCW5mczRfY2xvc2VfY2xlYXJfc3RhdGVpZF9mbGFncyhzdGF0ZSwKQEAgLTE5MTcsOCArMTkzNywxNSBAQAogCQlyZXR1cm47CiAJfQogCi0JaWYgKGNhbGxkYXRhLT5hcmcuZm1vZGUgPT0gMCkKKwlpZiAoY2FsbGRhdGEtPmFyZy5mbW9kZSA9PSAwKSB7CiAJCXRhc2stPnRrX21zZy5ycGNfcHJvYyA9ICZuZnM0X3Byb2NlZHVyZXNbTkZTUFJPQzRfQ0xOVF9DTE9TRV07CisJCWlmIChjYWxsZGF0YS0+cm9jICYmCisJCSAgICBwbmZzX3JvY19kcmFpbihjYWxsZGF0YS0+aW5vZGUsICZjYWxsZGF0YS0+cm9jX2JhcnJpZXIpKSB7CisJCQlycGNfc2xlZXBfb24oJk5GU19TRVJWRVIoY2FsbGRhdGEtPmlub2RlKS0+cm9jX3JwY3dhaXRxLAorCQkJCSAgICAgdGFzaywgTlVMTCk7CisJCQlyZXR1cm47CisJCX0KKwl9CiAKIAluZnNfZmF0dHJfaW5pdChjYWxsZGF0YS0+cmVzLmZhdHRyKTsKIAljYWxsZGF0YS0+dGltZXN0YW1wID0gamlmZmllczsKQEAgLTE5NDYsNyArMTk3Myw3IEBACiAgKgogICogTk9URTogQ2FsbGVyIG11c3QgYmUgaG9sZGluZyB0aGUgc3AtPnNvX293bmVyIHNlbWFwaG9yZSEKICAqLwotaW50IG5mczRfZG9fY2xvc2Uoc3RydWN0IHBhdGggKnBhdGgsIHN0cnVjdCBuZnM0X3N0YXRlICpzdGF0ZSwgZ2ZwX3QgZ2ZwX21hc2ssIGludCB3YWl0KQoraW50IG5mczRfZG9fY2xvc2Uoc3RydWN0IHBhdGggKnBhdGgsIHN0cnVjdCBuZnM0X3N0YXRlICpzdGF0ZSwgZ2ZwX3QgZ2ZwX21hc2ssIGludCB3YWl0LCBib29sIHJvYykKIHsKIAlzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyID0gTkZTX1NFUlZFUihzdGF0ZS0+aW5vZGUpOwogCXN0cnVjdCBuZnM0X2Nsb3NlZGF0YSAqY2FsbGRhdGE7CkBAIC0xOTgxLDExICsyMDA4LDEyIEBACiAJY2FsbGRhdGEtPnJlcy5mYXR0ciA9ICZjYWxsZGF0YS0+ZmF0dHI7CiAJY2FsbGRhdGEtPnJlcy5zZXFpZCA9IGNhbGxkYXRhLT5hcmcuc2VxaWQ7CiAJY2FsbGRhdGEtPnJlcy5zZXJ2ZXIgPSBzZXJ2ZXI7CisJY2FsbGRhdGEtPnJvYyA9IHJvYzsKIAlwYXRoX2dldChwYXRoKTsKIAljYWxsZGF0YS0+cGF0aCA9ICpwYXRoOwogCi0JbXNnLnJwY19hcmdwID0gJmNhbGxkYXRhLT5hcmcsCi0JbXNnLnJwY19yZXNwID0gJmNhbGxkYXRhLT5yZXMsCisJbXNnLnJwY19hcmdwID0gJmNhbGxkYXRhLT5hcmc7CisJbXNnLnJwY19yZXNwID0gJmNhbGxkYXRhLT5yZXM7CiAJdGFza19zZXR1cF9kYXRhLmNhbGxiYWNrX2RhdGEgPSBjYWxsZGF0YTsKIAl0YXNrID0gcnBjX3J1bl90YXNrKCZ0YXNrX3NldHVwX2RhdGEpOwogCWlmIChJU19FUlIodGFzaykpCkBAIC0xOTk4LDYgKzIwMjYsOCBAQAogb3V0X2ZyZWVfY2FsbGRhdGE6CiAJa2ZyZWUoY2FsbGRhdGEpOwogb3V0OgorCWlmIChyb2MpCisJCXBuZnNfcm9jX3JlbGVhc2Uoc3RhdGUtPmlub2RlKTsKIAluZnM0X3B1dF9vcGVuX3N0YXRlKHN0YXRlKTsKIAluZnM0X3B1dF9zdGF0ZV9vd25lcihzcCk7CiAJcmV0dXJuIHN0YXR1czsKQEAgLTI0ODYsNiArMjUxNiw3IEBACiAJCXBhdGggPSAmY3R4LT5wYXRoOwogCQlmbW9kZSA9IGN0eC0+bW9kZTsKIAl9CisJc2F0dHItPmlhX21vZGUgJj0gfmN1cnJlbnRfdW1hc2soKTsKIAlzdGF0ZSA9IG5mczRfZG9fb3BlbihkaXIsIHBhdGgsIGZtb2RlLCBmbGFncywgc2F0dHIsIGNyZWQpOwogCWRfZHJvcChkZW50cnkpOwogCWlmIChJU19FUlIoc3RhdGUpKSB7CkBAIC0yODE2LDYgKzI4NDcsOCBAQAogewogCXN0cnVjdCBuZnM0X2V4Y2VwdGlvbiBleGNlcHRpb24gPSB7IH07CiAJaW50IGVycjsKKworCXNhdHRyLT5pYV9tb2RlICY9IH5jdXJyZW50X3VtYXNrKCk7CiAJZG8gewogCQllcnIgPSBuZnM0X2hhbmRsZV9leGNlcHRpb24oTkZTX1NFUlZFUihkaXIpLAogCQkJCV9uZnM0X3Byb2NfbWtkaXIoZGlyLCBkZW50cnksIHNhdHRyKSwKQEAgLTI5MTYsNiArMjk0OSw4IEBACiB7CiAJc3RydWN0IG5mczRfZXhjZXB0aW9uIGV4Y2VwdGlvbiA9IHsgfTsKIAlpbnQgZXJyOworCisJc2F0dHItPmlhX21vZGUgJj0gfmN1cnJlbnRfdW1hc2soKTsKIAlkbyB7CiAJCWVyciA9IG5mczRfaGFuZGxlX2V4Y2VwdGlvbihORlNfU0VSVkVSKGRpciksCiAJCQkJX25mczRfcHJvY19ta25vZChkaXIsIGRlbnRyeSwgc2F0dHIsIHJkZXYpLApAQCAtMzQ3OCw2ICszNTEzLDcgQEAKIAlzdHJ1Y3QgbmZzNF9zZXRjbGllbnRpZCBzZXRjbGllbnRpZCA9IHsKIAkJLnNjX3ZlcmlmaWVyID0gJnNjX3ZlcmlmaWVyLAogCQkuc2NfcHJvZyA9IHByb2dyYW0sCisJCS5zY19jYl9pZGVudCA9IGNscC0+Y2xfY2JfaWRlbnQsCiAJfTsKIAlzdHJ1Y3QgcnBjX21lc3NhZ2UgbXNnID0gewogCQkucnBjX3Byb2MgPSAmbmZzNF9wcm9jZWR1cmVzW05GU1BST0M0X0NMTlRfU0VUQ0xJRU5USURdLApAQCAtMzUxNyw3ICszNTUzLDcgQEAKIAkJaWYgKHNpZ25hbGxlZCgpKQogCQkJYnJlYWs7CiAJCWlmIChsb29wKysgJiAxKQotCQkJc3NsZWVwKGNscC0+Y2xfbGVhc2VfdGltZSArIDEpOworCQkJc3NsZWVwKGNscC0+Y2xfbGVhc2VfdGltZSAvIEhaICsgMSk7CiAJCWVsc2UKIAkJCWlmICgrK2NscC0+Y2xfaWRfdW5pcXVpZmllciA9PSAwKQogCQkJCWJyZWFrOwpAQCAtMzY2Myw4ICszNjk5LDggQEAKIAlkYXRhLT5ycGNfc3RhdHVzID0gMDsKIAogCXRhc2tfc2V0dXBfZGF0YS5jYWxsYmFja19kYXRhID0gZGF0YTsKLQltc2cucnBjX2FyZ3AgPSAmZGF0YS0+YXJncywKLQltc2cucnBjX3Jlc3AgPSAmZGF0YS0+cmVzLAorCW1zZy5ycGNfYXJncCA9ICZkYXRhLT5hcmdzOworCW1zZy5ycGNfcmVzcCA9ICZkYXRhLT5yZXM7CiAJdGFzayA9IHJwY19ydW5fdGFzaygmdGFza19zZXR1cF9kYXRhKTsKIAlpZiAoSVNfRVJSKHRhc2spKQogCQlyZXR1cm4gUFRSX0VSUih0YXNrKTsKQEAgLTM3NDMsNiArMzc3OSw3IEBACiAJCWdvdG8gb3V0OwogCWxzcCA9IHJlcXVlc3QtPmZsX3UubmZzNF9mbC5vd25lcjsKIAlhcmcubG9ja19vd25lci5pZCA9IGxzcC0+bHNfaWQuaWQ7CisJYXJnLmxvY2tfb3duZXIuc19kZXYgPSBzZXJ2ZXItPnNfZGV2OwogCXN0YXR1cyA9IG5mczRfY2FsbF9zeW5jKHNlcnZlciwgJm1zZywgJmFyZywgJnJlcywgMSk7CiAJc3dpdGNoIChzdGF0dXMpIHsKIAkJY2FzZSAwOgpAQCAtMzkwOCw4ICszOTQ1LDggQEAKIAkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CiAJfQogCi0JbXNnLnJwY19hcmdwID0gJmRhdGEtPmFyZywKLQltc2cucnBjX3Jlc3AgPSAmZGF0YS0+cmVzLAorCW1zZy5ycGNfYXJncCA9ICZkYXRhLT5hcmc7CisJbXNnLnJwY19yZXNwID0gJmRhdGEtPnJlczsKIAl0YXNrX3NldHVwX2RhdGEuY2FsbGJhY2tfZGF0YSA9IGRhdGE7CiAJcmV0dXJuIHJwY19ydW5fdGFzaygmdGFza19zZXR1cF9kYXRhKTsKIH0KQEAgLTM5ODgsNiArNDAyNSw3IEBACiAJcC0+YXJnLmxvY2tfc3RhdGVpZCA9ICZsc3AtPmxzX3N0YXRlaWQ7CiAJcC0+YXJnLmxvY2tfb3duZXIuY2xpZW50aWQgPSBzZXJ2ZXItPm5mc19jbGllbnQtPmNsX2NsaWVudGlkOwogCXAtPmFyZy5sb2NrX293bmVyLmlkID0gbHNwLT5sc19pZC5pZDsKKwlwLT5hcmcubG9ja19vd25lci5zX2RldiA9IHNlcnZlci0+c19kZXY7CiAJcC0+cmVzLmxvY2tfc2VxaWQgPSBwLT5hcmcubG9ja19zZXFpZDsKIAlwLT5sc3AgPSBsc3A7CiAJcC0+c2VydmVyID0gc2VydmVyOwpAQCAtNDE0NSw4ICs0MTgzLDggQEAKIAkJCWRhdGEtPmFyZy5yZWNsYWltID0gTkZTX0xPQ0tfUkVDTEFJTTsKIAkJdGFza19zZXR1cF9kYXRhLmNhbGxiYWNrX29wcyA9ICZuZnM0X3JlY292ZXJfbG9ja19vcHM7CiAJfQotCW1zZy5ycGNfYXJncCA9ICZkYXRhLT5hcmcsCi0JbXNnLnJwY19yZXNwID0gJmRhdGEtPnJlcywKKwltc2cucnBjX2FyZ3AgPSAmZGF0YS0+YXJnOworCW1zZy5ycGNfcmVzcCA9ICZkYXRhLT5yZXM7CiAJdGFza19zZXR1cF9kYXRhLmNhbGxiYWNrX2RhdGEgPSBkYXRhOwogCXRhc2sgPSBycGNfcnVuX3Rhc2soJnRhc2tfc2V0dXBfZGF0YSk7CiAJaWYgKElTX0VSUih0YXNrKSkKQEAgLTQzOTIsNDggKzQ0MzAsNDMgQEAKIAkJcmV0dXJuOwogCWFyZ3MtPmxvY2tfb3duZXIuY2xpZW50aWQgPSBzZXJ2ZXItPm5mc19jbGllbnQtPmNsX2NsaWVudGlkOwogCWFyZ3MtPmxvY2tfb3duZXIuaWQgPSBsc3AtPmxzX2lkLmlkOworCWFyZ3MtPmxvY2tfb3duZXIuc19kZXYgPSBzZXJ2ZXItPnNfZGV2OwogCW1zZy5ycGNfYXJncCA9IGFyZ3M7CiAJcnBjX2NhbGxfYXN5bmMoc2VydmVyLT5jbGllbnQsICZtc2csIDAsICZuZnM0X3JlbGVhc2VfbG9ja293bmVyX29wcywgYXJncyk7CiB9CiAKICNkZWZpbmUgWEFUVFJfTkFNRV9ORlNWNF9BQ0wgInN5c3RlbS5uZnM0X2FjbCIKIAotaW50IG5mczRfc2V0eGF0dHIoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBjb25zdCBjaGFyICprZXksIGNvbnN0IHZvaWQgKmJ1ZiwKLQkJc2l6ZV90IGJ1ZmxlbiwgaW50IGZsYWdzKQorc3RhdGljIGludCBuZnM0X3hhdHRyX3NldF9uZnM0X2FjbChzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGNvbnN0IGNoYXIgKmtleSwKKwkJCQkgICBjb25zdCB2b2lkICpidWYsIHNpemVfdCBidWZsZW4sCisJCQkJICAgaW50IGZsYWdzLCBpbnQgdHlwZSkKIHsKLQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZGVudHJ5LT5kX2lub2RlOworCWlmIChzdHJjbXAoa2V5LCAiIikgIT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CiAKLQlpZiAoc3RyY21wKGtleSwgWEFUVFJfTkFNRV9ORlNWNF9BQ0wpICE9IDApCi0JCXJldHVybiAtRU9QTk9UU1VQUDsKLQotCXJldHVybiBuZnM0X3Byb2Nfc2V0X2FjbChpbm9kZSwgYnVmLCBidWZsZW4pOworCXJldHVybiBuZnM0X3Byb2Nfc2V0X2FjbChkZW50cnktPmRfaW5vZGUsIGJ1ZiwgYnVmbGVuKTsKIH0KIAotLyogVGhlIGdldHhhdHRyIG1hbiBwYWdlIHN1Z2dlc3RzIHJldHVybmluZyAtRU5PREFUQSBmb3IgdW5rbm93biBhdHRyaWJ1dGVzLAotICogYW5kIHRoYXQncyB3aGF0IHdlJ2xsIGRvIGZvciBlLmcuIHVzZXIgYXR0cmlidXRlcyB0aGF0IGhhdmVuJ3QgYmVlbiBzZXQuCi0gKiBCdXQgd2UnbGwgZm9sbG93IGV4dDIvZXh0MydzIGxlYWQgYnkgcmV0dXJuaW5nIC1FT1BOT1RTVVBQIGZvciB1bnN1cHBvcnRlZAotICogYXR0cmlidXRlcyBpbiBrZXJuZWwtbWFuYWdlZCBhdHRyaWJ1dGUgbmFtZXNwYWNlcy4gKi8KLXNzaXplX3QgbmZzNF9nZXR4YXR0cihzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGNvbnN0IGNoYXIgKmtleSwgdm9pZCAqYnVmLAotCQlzaXplX3QgYnVmbGVuKQorc3RhdGljIGludCBuZnM0X3hhdHRyX2dldF9uZnM0X2FjbChzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGNvbnN0IGNoYXIgKmtleSwKKwkJCQkgICB2b2lkICpidWYsIHNpemVfdCBidWZsZW4sIGludCB0eXBlKQogewotCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CisJaWYgKHN0cmNtcChrZXksICIiKSAhPSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKIAotCWlmIChzdHJjbXAoa2V5LCBYQVRUUl9OQU1FX05GU1Y0X0FDTCkgIT0gMCkKLQkJcmV0dXJuIC1FT1BOT1RTVVBQOwotCi0JcmV0dXJuIG5mczRfcHJvY19nZXRfYWNsKGlub2RlLCBidWYsIGJ1Zmxlbik7CisJcmV0dXJuIG5mczRfcHJvY19nZXRfYWNsKGRlbnRyeS0+ZF9pbm9kZSwgYnVmLCBidWZsZW4pOwogfQogCi1zc2l6ZV90IG5mczRfbGlzdHhhdHRyKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgY2hhciAqYnVmLCBzaXplX3QgYnVmbGVuKQorc3RhdGljIHNpemVfdCBuZnM0X3hhdHRyX2xpc3RfbmZzNF9hY2woc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBjaGFyICpsaXN0LAorCQkJCSAgICAgICBzaXplX3QgbGlzdF9sZW4sIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkJICAgICAgIHNpemVfdCBuYW1lX2xlbiwgaW50IHR5cGUpCiB7Ci0Jc2l6ZV90IGxlbiA9IHN0cmxlbihYQVRUUl9OQU1FX05GU1Y0X0FDTCkgKyAxOworCXNpemVfdCBsZW4gPSBzaXplb2YoWEFUVFJfTkFNRV9ORlNWNF9BQ0wpOwogCiAJaWYgKCFuZnM0X3NlcnZlcl9zdXBwb3J0c19hY2xzKE5GU19TRVJWRVIoZGVudHJ5LT5kX2lub2RlKSkpCiAJCXJldHVybiAwOwotCWlmIChidWYgJiYgYnVmbGVuIDwgbGVuKQotCQlyZXR1cm4gLUVSQU5HRTsKLQlpZiAoYnVmKQotCQltZW1jcHkoYnVmLCBYQVRUUl9OQU1FX05GU1Y0X0FDTCwgbGVuKTsKKworCWlmIChsaXN0ICYmIGxlbiA8PSBsaXN0X2xlbikKKwkJbWVtY3B5KGxpc3QsIFhBVFRSX05BTUVfTkZTVjRfQUNMLCBsZW4pOwogCXJldHVybiBsZW47CiB9CiAKQEAgLTQ0ODYsNiArNDUxOSwyNSBAQAogCiAjaWZkZWYgQ09ORklHX05GU19WNF8xCiAvKgorICogQ2hlY2sgdGhlIGV4Y2hhbmdlIGZsYWdzIHJldHVybmVkIGJ5IHRoZSBzZXJ2ZXIgZm9yIGludmFsaWQgZmxhZ3MsIGhhdmluZworICogYm90aCBQTkZTIGFuZCBOT05fUE5GUyBmbGFncyBzZXQsIGFuZCBub3QgaGF2aW5nIG9uZSBvZiBOT05fUE5GUywgUE5GUywgb3IKKyAqIERTIGZsYWdzIHNldC4KKyAqLworc3RhdGljIGludCBuZnM0X2NoZWNrX2NsX2V4Y2hhbmdlX2ZsYWdzKHUzMiBmbGFncykKK3sKKwlpZiAoZmxhZ3MgJiB+RVhDSEdJRDRfRkxBR19NQVNLX1IpCisJCWdvdG8gb3V0X2ludmFsOworCWlmICgoZmxhZ3MgJiBFWENIR0lENF9GTEFHX1VTRV9QTkZTX01EUykgJiYKKwkgICAgKGZsYWdzICYgRVhDSEdJRDRfRkxBR19VU0VfTk9OX1BORlMpKQorCQlnb3RvIG91dF9pbnZhbDsKKwlpZiAoIShmbGFncyAmIChFWENIR0lENF9GTEFHX01BU0tfUE5GUykpKQorCQlnb3RvIG91dF9pbnZhbDsKKwlyZXR1cm4gTkZTX09LOworb3V0X2ludmFsOgorCXJldHVybiAtTkZTNEVSUl9JTlZBTDsKK30KKworLyoKICAqIG5mczRfcHJvY19leGNoYW5nZV9pZCgpCiAgKgogICogU2luY2UgdGhlIGNsaWVudGlkIGhhcyBleHBpcmVkLCBhbGwgY29tcG91bmRzIHVzaW5nIHNlc3Npb25zCkBAIC00NDk4LDcgKzQ1NTAsNyBAQAogCW5mczRfdmVyaWZpZXIgdmVyaWZpZXI7CiAJc3RydWN0IG5mczQxX2V4Y2hhbmdlX2lkX2FyZ3MgYXJncyA9IHsKIAkJLmNsaWVudCA9IGNscCwKLQkJLmZsYWdzID0gY2xwLT5jbF9leGNoYW5nZV9mbGFncywKKwkJLmZsYWdzID0gRVhDSEdJRDRfRkxBR19TVVBQX01PVkVEX1JFRkVSLAogCX07CiAJc3RydWN0IG5mczQxX2V4Y2hhbmdlX2lkX3JlcyByZXMgPSB7CiAJCS5jbGllbnQgPSBjbHAsCkBAIC00NTE1LDkgKzQ1NjcsNiBAQAogCWRwcmludGsoIi0tPiAlc1xuIiwgX19mdW5jX18pOwogCUJVR19PTihjbHAgPT0gTlVMTCk7CiAKLQkvKiBSZW1vdmUgc2VydmVyLW9ubHkgZmxhZ3MgKi8KLQlhcmdzLmZsYWdzICY9IH5FWENIR0lENF9GTEFHX0NPTkZJUk1FRF9SOwotCiAJcCA9ICh1MzIgKil2ZXJpZmllci5kYXRhOwogCSpwKysgPSBodG9ubCgodTMyKWNscC0+Y2xfYm9vdF90aW1lLnR2X3NlYyk7CiAJKnAgPSBodG9ubCgodTMyKWNscC0+Y2xfYm9vdF90aW1lLnR2X25zZWMpOwpAQCAtNDU0Myw2ICs0NTkyLDcgQEAKIAkJCWJyZWFrOwogCX0KIAorCXN0YXR1cyA9IG5mczRfY2hlY2tfY2xfZXhjaGFuZ2VfZmxhZ3MoY2xwLT5jbF9leGNoYW5nZV9mbGFncyk7CiAJZHByaW50aygiPC0tICVzIHN0YXR1cz0gJWRcbiIsIF9fZnVuY19fLCBzdGF0dXMpOwogCXJldHVybiBzdGF0dXM7CiB9CkBAIC00Nzc2LDE3ICs0ODI2LDE3IEBACiAJaWYgKCFzZXNzaW9uKQogCQlyZXR1cm4gTlVMTDsKIAotCWluaXRfY29tcGxldGlvbigmc2Vzc2lvbi0+Y29tcGxldGUpOwotCiAJdGJsID0gJnNlc3Npb24tPmZjX3Nsb3RfdGFibGU7CiAJdGJsLT5oaWdoZXN0X3VzZWRfc2xvdGlkID0gLTE7CiAJc3Bpbl9sb2NrX2luaXQoJnRibC0+c2xvdF90YmxfbG9jayk7CiAJcnBjX2luaXRfcHJpb3JpdHlfd2FpdF9xdWV1ZSgmdGJsLT5zbG90X3RibF93YWl0cSwgIkZvcmVDaGFubmVsIFNsb3QgdGFibGUiKTsKKwlpbml0X2NvbXBsZXRpb24oJnRibC0+Y29tcGxldGUpOwogCiAJdGJsID0gJnNlc3Npb24tPmJjX3Nsb3RfdGFibGU7CiAJdGJsLT5oaWdoZXN0X3VzZWRfc2xvdGlkID0gLTE7CiAJc3Bpbl9sb2NrX2luaXQoJnRibC0+c2xvdF90YmxfbG9jayk7CiAJcnBjX2luaXRfd2FpdF9xdWV1ZSgmdGJsLT5zbG90X3RibF93YWl0cSwgIkJhY2tDaGFubmVsIFNsb3QgdGFibGUiKTsKKwlpbml0X2NvbXBsZXRpb24oJnRibC0+Y29tcGxldGUpOwogCiAJc2Vzc2lvbi0+c2Vzc2lvbl9zdGF0ZSA9IDE8PE5GUzRfU0VTU0lPTl9JTklUSU5HOwogCkBAIC01MjgwLDEzICs1MzMwLDIzIEBACiBuZnM0X2xheW91dGdldF9wcmVwYXJlKHN0cnVjdCBycGNfdGFzayAqdGFzaywgdm9pZCAqY2FsbGRhdGEpCiB7CiAJc3RydWN0IG5mczRfbGF5b3V0Z2V0ICpsZ3AgPSBjYWxsZGF0YTsKLQlzdHJ1Y3QgaW5vZGUgKmlubyA9IGxncC0+YXJncy5pbm9kZTsKLQlzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyID0gTkZTX1NFUlZFUihpbm8pOworCXN0cnVjdCBuZnNfc2VydmVyICpzZXJ2ZXIgPSBORlNfU0VSVkVSKGxncC0+YXJncy5pbm9kZSk7CiAKIAlkcHJpbnRrKCItLT4gJXNcbiIsIF9fZnVuY19fKTsKKwkvKiBOb3RlIHRoZSBpcyBhIHJhY2UgaGVyZSwgd2hlcmUgYSBDQl9MQVlPVVRSRUNBTEwgY2FuIGNvbWUgaW4KKwkgKiByaWdodCBub3cgY292ZXJpbmcgdGhlIExBWU9VVEdFVCB3ZSBhcmUgYWJvdXQgdG8gc2VuZC4KKwkgKiBIb3dldmVyLCB0aGF0IGlzIG5vdCBzbyBjYXRhc3Ryb3BoaWMsIGFuZCB0aGVyZSBzZWVtcworCSAqIHRvIGJlIG5vIHdheSB0byBwcmV2ZW50IGl0IGNvbXBsZXRlbHkuCisJICovCiAJaWYgKG5mczRfc2V0dXBfc2VxdWVuY2Uoc2VydmVyLCAmbGdwLT5hcmdzLnNlcV9hcmdzLAogCQkJCSZsZ3AtPnJlcy5zZXFfcmVzLCAwLCB0YXNrKSkKIAkJcmV0dXJuOworCWlmIChwbmZzX2Nob29zZV9sYXlvdXRnZXRfc3RhdGVpZCgmbGdwLT5hcmdzLnN0YXRlaWQsCisJCQkJCSAgTkZTX0kobGdwLT5hcmdzLmlub2RlKS0+bGF5b3V0LAorCQkJCQkgIGxncC0+YXJncy5jdHgtPnN0YXRlKSkgeworCQlycGNfZXhpdCh0YXNrLCBORlM0X09LKTsKKwkJcmV0dXJuOworCX0KIAlycGNfY2FsbF9zdGFydCh0YXNrKTsKIH0KIApAQCAtNTMxMyw3ICs1MzczLDYgQEAKIAkJCXJldHVybjsKIAkJfQogCX0KLQlsZ3AtPnN0YXR1cyA9IHRhc2stPnRrX3N0YXR1czsKIAlkcHJpbnRrKCI8LS0gJXNcbiIsIF9fZnVuY19fKTsKIH0KIApAQCAtNTMyMiw3ICs1MzgxLDYgQEAKIAlzdHJ1Y3QgbmZzNF9sYXlvdXRnZXQgKmxncCA9IGNhbGxkYXRhOwogCiAJZHByaW50aygiLS0+ICVzXG4iLCBfX2Z1bmNfXyk7Ci0JcHV0X2xheW91dF9oZHIobGdwLT5hcmdzLmlub2RlKTsKIAlpZiAobGdwLT5yZXMubGF5b3V0LmJ1ZiAhPSBOVUxMKQogCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpIGxncC0+cmVzLmxheW91dC5idWYpOwogCXB1dF9uZnNfb3Blbl9jb250ZXh0KGxncC0+YXJncy5jdHgpOwpAQCAtNTM2NywxMyArNTQyNSwxMCBAQAogCWlmIChJU19FUlIodGFzaykpCiAJCXJldHVybiBQVFJfRVJSKHRhc2spOwogCXN0YXR1cyA9IG5mczRfd2FpdF9mb3JfY29tcGxldGlvbl9ycGNfdGFzayh0YXNrKTsKLQlpZiAoc3RhdHVzICE9IDApCi0JCWdvdG8gb3V0OwotCXN0YXR1cyA9IGxncC0+c3RhdHVzOwotCWlmIChzdGF0dXMgIT0gMCkKLQkJZ290byBvdXQ7Ci0Jc3RhdHVzID0gcG5mc19sYXlvdXRfcHJvY2VzcyhsZ3ApOwotb3V0OgorCWlmIChzdGF0dXMgPT0gMCkKKwkJc3RhdHVzID0gdGFzay0+dGtfc3RhdHVzOworCWlmIChzdGF0dXMgPT0gMCkKKwkJc3RhdHVzID0gcG5mc19sYXlvdXRfcHJvY2VzcyhsZ3ApOwogCXJwY19wdXRfdGFzayh0YXNrKTsKIAlkcHJpbnRrKCI8LS0gJXMgc3RhdHVzPSVkXG4iLCBfX2Z1bmNfXywgc3RhdHVzKTsKIAlyZXR1cm4gc3RhdHVzOwpAQCAtNTUwNCw5ICs1NTU5LDEwIEBACiAJLnBlcm1pc3Npb24JPSBuZnNfcGVybWlzc2lvbiwKIAkuZ2V0YXR0cgk9IG5mc19nZXRhdHRyLAogCS5zZXRhdHRyCT0gbmZzX3NldGF0dHIsCi0JLmdldHhhdHRyCT0gbmZzNF9nZXR4YXR0ciwKLQkuc2V0eGF0dHIJPSBuZnM0X3NldHhhdHRyLAotCS5saXN0eGF0dHIJPSBuZnM0X2xpc3R4YXR0ciwKKwkuZ2V0eGF0dHIJPSBnZW5lcmljX2dldHhhdHRyLAorCS5zZXR4YXR0cgk9IGdlbmVyaWNfc2V0eGF0dHIsCisJLmxpc3R4YXR0cgk9IGdlbmVyaWNfbGlzdHhhdHRyLAorCS5yZW1vdmV4YXR0cgk9IGdlbmVyaWNfcmVtb3ZleGF0dHIsCiB9OwogCiBjb25zdCBzdHJ1Y3QgbmZzX3JwY19vcHMgbmZzX3Y0X2NsaWVudG9wcyA9IHsKQEAgLTU1NTEsNiArNTYwNywxOCBAQAogCS5vcGVuX2NvbnRleHQJPSBuZnM0X2F0b21pY19vcGVuLAogfTsKIAorc3RhdGljIGNvbnN0IHN0cnVjdCB4YXR0cl9oYW5kbGVyIG5mczRfeGF0dHJfbmZzNF9hY2xfaGFuZGxlciA9IHsKKwkucHJlZml4CT0gWEFUVFJfTkFNRV9ORlNWNF9BQ0wsCisJLmxpc3QJPSBuZnM0X3hhdHRyX2xpc3RfbmZzNF9hY2wsCisJLmdldAk9IG5mczRfeGF0dHJfZ2V0X25mczRfYWNsLAorCS5zZXQJPSBuZnM0X3hhdHRyX3NldF9uZnM0X2FjbCwKK307CisKK2NvbnN0IHN0cnVjdCB4YXR0cl9oYW5kbGVyICpuZnM0X3hhdHRyX2hhbmRsZXJzW10gPSB7CisJJm5mczRfeGF0dHJfbmZzNF9hY2xfaGFuZGxlciwKKwlOVUxMCit9OworCiAvKgogICogTG9jYWwgdmFyaWFibGVzOgogICogIGMtYmFzaWMtb2Zmc2V0OiA4CmRpZmYgLS1naXQgYS9mcy9uZnMvbmZzNHJlbmV3ZC5jIGIvZnMvbmZzL25mczRyZW5ld2QuYwppbmRleCA3MmI2YzU4Li40MDIxNDNkIDEwMDY0NAotLS0gYS9mcy9uZnMvbmZzNHJlbmV3ZC5jCisrKyBiL2ZzL25mcy9uZnM0cmVuZXdkLmMKQEAgLTYzLDkgKzYzLDE0IEBACiAKIAlvcHMgPSBjbHAtPmNsX212b3BzLT5zdGF0ZV9yZW5ld2FsX29wczsKIAlkcHJpbnRrKCIlczogc3RhcnRcbiIsIF9fZnVuY19fKTsKLQkvKiBBcmUgdGhlcmUgYW55IGFjdGl2ZSBzdXBlcmJsb2Nrcz8gKi8KLQlpZiAobGlzdF9lbXB0eSgmY2xwLT5jbF9zdXBlcmJsb2NrcykpCisKKwlyY3VfcmVhZF9sb2NrKCk7CisJaWYgKGxpc3RfZW1wdHkoJmNscC0+Y2xfc3VwZXJibG9ja3MpKSB7CisJCXJjdV9yZWFkX3VubG9jaygpOwogCQlnb3RvIG91dDsKKwl9CisJcmN1X3JlYWRfdW5sb2NrKCk7CisKIAlzcGluX2xvY2soJmNscC0+Y2xfbG9jayk7CiAJbGVhc2UgPSBjbHAtPmNsX2xlYXNlX3RpbWU7CiAJbGFzdCA9IGNscC0+Y2xfbGFzdF9yZW5ld2FsOwpAQCAtNzUsNyArODAsNyBAQAogCQljcmVkID0gb3BzLT5nZXRfc3RhdGVfcmVuZXdhbF9jcmVkX2xvY2tlZChjbHApOwogCQlzcGluX3VubG9jaygmY2xwLT5jbF9sb2NrKTsKIAkJaWYgKGNyZWQgPT0gTlVMTCkgewotCQkJaWYgKGxpc3RfZW1wdHkoJmNscC0+Y2xfZGVsZWdhdGlvbnMpKSB7CisJCQlpZiAoIW5mc19kZWxlZ2F0aW9uc19wcmVzZW50KGNscCkpIHsKIAkJCQlzZXRfYml0KE5GUzRDTE5UX0xFQVNFX0VYUElSRUQsICZjbHAtPmNsX3N0YXRlKTsKIAkJCQlnb3RvIG91dDsKIAkJCX0KZGlmZiAtLWdpdCBhL2ZzL25mcy9uZnM0c3RhdGUuYyBiL2ZzL25mcy9uZnM0c3RhdGUuYwppbmRleCBmNTc1YTMxLi4yMzM2ZDUzIDEwMDY0NAotLS0gYS9mcy9uZnMvbmZzNHN0YXRlLmMKKysrIGIvZnMvbmZzL25mczRzdGF0ZS5jCkBAIC0xMDUsMTQgKzEwNSwxNyBAQAogCQlwdXRfcnBjY3JlZChjcmVkKTsKIH0KIAotc3RydWN0IHJwY19jcmVkICpuZnM0X2dldF9yZW5ld19jcmVkX2xvY2tlZChzdHJ1Y3QgbmZzX2NsaWVudCAqY2xwKQorc3RhdGljIHN0cnVjdCBycGNfY3JlZCAqCituZnM0X2dldF9yZW5ld19jcmVkX3NlcnZlcl9sb2NrZWQoc3RydWN0IG5mc19zZXJ2ZXIgKnNlcnZlcikKIHsKKwlzdHJ1Y3QgcnBjX2NyZWQgKmNyZWQgPSBOVUxMOwogCXN0cnVjdCBuZnM0X3N0YXRlX293bmVyICpzcDsKIAlzdHJ1Y3QgcmJfbm9kZSAqcG9zOwotCXN0cnVjdCBycGNfY3JlZCAqY3JlZCA9IE5VTEw7CiAKLQlmb3IgKHBvcyA9IHJiX2ZpcnN0KCZjbHAtPmNsX3N0YXRlX293bmVycyk7IHBvcyAhPSBOVUxMOyBwb3MgPSByYl9uZXh0KHBvcykpIHsKLQkJc3AgPSByYl9lbnRyeShwb3MsIHN0cnVjdCBuZnM0X3N0YXRlX293bmVyLCBzb19jbGllbnRfbm9kZSk7CisJZm9yIChwb3MgPSByYl9maXJzdCgmc2VydmVyLT5zdGF0ZV9vd25lcnMpOworCSAgICAgcG9zICE9IE5VTEw7CisJICAgICBwb3MgPSByYl9uZXh0KHBvcykpIHsKKwkJc3AgPSByYl9lbnRyeShwb3MsIHN0cnVjdCBuZnM0X3N0YXRlX293bmVyLCBzb19zZXJ2ZXJfbm9kZSk7CiAJCWlmIChsaXN0X2VtcHR5KCZzcC0+c29fc3RhdGVzKSkKIAkJCWNvbnRpbnVlOwogCQljcmVkID0gZ2V0X3JwY2NyZWQoc3AtPnNvX2NyZWQpOwpAQCAtMTIxLDYgKzEyNCwyOCBAQAogCXJldHVybiBjcmVkOwogfQogCisvKioKKyAqIG5mczRfZ2V0X3JlbmV3X2NyZWRfbG9ja2VkIC0gQWNxdWlyZSBjcmVkZW50aWFsIGZvciBhIHJlbmV3IG9wZXJhdGlvbgorICogQGNscDogY2xpZW50IHN0YXRlIGhhbmRsZQorICoKKyAqIFJldHVybnMgYW4gcnBjX2NyZWQgd2l0aCByZWZlcmVuY2UgY291bnQgYnVtcGVkLCBvciBOVUxMLgorICogQ2FsbGVyIG11c3QgaG9sZCBjbHAtPmNsX2xvY2suCisgKi8KK3N0cnVjdCBycGNfY3JlZCAqbmZzNF9nZXRfcmVuZXdfY3JlZF9sb2NrZWQoc3RydWN0IG5mc19jbGllbnQgKmNscCkKK3sKKwlzdHJ1Y3QgcnBjX2NyZWQgKmNyZWQgPSBOVUxMOworCXN0cnVjdCBuZnNfc2VydmVyICpzZXJ2ZXI7CisKKwlyY3VfcmVhZF9sb2NrKCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3Uoc2VydmVyLCAmY2xwLT5jbF9zdXBlcmJsb2NrcywgY2xpZW50X2xpbmspIHsKKwkJY3JlZCA9IG5mczRfZ2V0X3JlbmV3X2NyZWRfc2VydmVyX2xvY2tlZChzZXJ2ZXIpOworCQlpZiAoY3JlZCAhPSBOVUxMKQorCQkJYnJlYWs7CisJfQorCXJjdV9yZWFkX3VubG9jaygpOworCXJldHVybiBjcmVkOworfQorCiAjaWYgZGVmaW5lZChDT05GSUdfTkZTX1Y0XzEpCiAKIHN0YXRpYyBpbnQgbmZzNDFfc2V0dXBfc3RhdGVfcmVuZXdhbChzdHJ1Y3QgbmZzX2NsaWVudCAqY2xwKQpAQCAtMTQyLDYgKzE2NywxMSBAQAogCXJldHVybiBzdGF0dXM7CiB9CiAKKy8qCisgKiBCYWNrIGNoYW5uZWwgcmV0dXJucyBORlM0RVJSX0RFTEFZIGZvciBuZXcgcmVxdWVzdHMgd2hlbgorICogTkZTNF9TRVNTSU9OX0RSQUlOSU5HIGlzIHNldCBzbyB0aGVyZSBpcyBubyB3b3JrIHRvIGJlIGRvbmUgd2hlbiBkcmFpbmluZworICogaXMgZW5kZWQuCisgKi8KIHN0YXRpYyB2b2lkIG5mczRfZW5kX2RyYWluX3Nlc3Npb24oc3RydWN0IG5mc19jbGllbnQgKmNscCkKIHsKIAlzdHJ1Y3QgbmZzNF9zZXNzaW9uICpzZXMgPSBjbHAtPmNsX3Nlc3Npb247CkBAIC0xNjUsMjIgKzE5NSwzMiBAQAogCX0KIH0KIAotc3RhdGljIGludCBuZnM0X2JlZ2luX2RyYWluX3Nlc3Npb24oc3RydWN0IG5mc19jbGllbnQgKmNscCkKK3N0YXRpYyBpbnQgbmZzNF93YWl0X29uX3Nsb3RfdGJsKHN0cnVjdCBuZnM0X3Nsb3RfdGFibGUgKnRibCkKIHsKLQlzdHJ1Y3QgbmZzNF9zZXNzaW9uICpzZXMgPSBjbHAtPmNsX3Nlc3Npb247Ci0Jc3RydWN0IG5mczRfc2xvdF90YWJsZSAqdGJsID0gJnNlcy0+ZmNfc2xvdF90YWJsZTsKLQogCXNwaW5fbG9jaygmdGJsLT5zbG90X3RibF9sb2NrKTsKLQlzZXRfYml0KE5GUzRfU0VTU0lPTl9EUkFJTklORywgJnNlcy0+c2Vzc2lvbl9zdGF0ZSk7CiAJaWYgKHRibC0+aGlnaGVzdF91c2VkX3Nsb3RpZCAhPSAtMSkgewotCQlJTklUX0NPTVBMRVRJT04oc2VzLT5jb21wbGV0ZSk7CisJCUlOSVRfQ09NUExFVElPTih0YmwtPmNvbXBsZXRlKTsKIAkJc3Bpbl91bmxvY2soJnRibC0+c2xvdF90YmxfbG9jayk7Ci0JCXJldHVybiB3YWl0X2Zvcl9jb21wbGV0aW9uX2ludGVycnVwdGlibGUoJnNlcy0+Y29tcGxldGUpOworCQlyZXR1cm4gd2FpdF9mb3JfY29tcGxldGlvbl9pbnRlcnJ1cHRpYmxlKCZ0YmwtPmNvbXBsZXRlKTsKIAl9CiAJc3Bpbl91bmxvY2soJnRibC0+c2xvdF90YmxfbG9jayk7CiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgbmZzNF9iZWdpbl9kcmFpbl9zZXNzaW9uKHN0cnVjdCBuZnNfY2xpZW50ICpjbHApCit7CisJc3RydWN0IG5mczRfc2Vzc2lvbiAqc2VzID0gY2xwLT5jbF9zZXNzaW9uOworCWludCByZXQgPSAwOworCisJc2V0X2JpdChORlM0X1NFU1NJT05fRFJBSU5JTkcsICZzZXMtPnNlc3Npb25fc3RhdGUpOworCS8qIGJhY2sgY2hhbm5lbCAqLworCXJldCA9IG5mczRfd2FpdF9vbl9zbG90X3RibCgmc2VzLT5iY19zbG90X3RhYmxlKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCS8qIGZvcmUgY2hhbm5lbCAqLworCXJldHVybiBuZnM0X3dhaXRfb25fc2xvdF90YmwoJnNlcy0+ZmNfc2xvdF90YWJsZSk7Cit9CisKIGludCBuZnM0MV9pbml0X2NsaWVudGlkKHN0cnVjdCBuZnNfY2xpZW50ICpjbHAsIHN0cnVjdCBycGNfY3JlZCAqY3JlZCkKIHsKIAlpbnQgc3RhdHVzOwpAQCAtMTkyLDYgKzIzMiwxMiBAQAogCXN0YXR1cyA9IG5mczRfcHJvY19jcmVhdGVfc2Vzc2lvbihjbHApOwogCWlmIChzdGF0dXMgIT0gMCkKIAkJZ290byBvdXQ7CisJc3RhdHVzID0gbmZzNF9zZXRfY2FsbGJhY2tfc2Vzc2lvbmlkKGNscCk7CisJaWYgKHN0YXR1cyAhPSAwKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIlNlc3Npb25pZCBub3Qgc2V0LiBObyBjYWxsYmFjayBzZXJ2aWNlXG4iKTsKKwkJbmZzX2NhbGxiYWNrX2Rvd24oMSk7CisJCXN0YXR1cyA9IDA7CisJfQogCW5mczQxX3NldHVwX3N0YXRlX3JlbmV3YWwoY2xwKTsKIAluZnNfbWFya19jbGllbnRfcmVhZHkoY2xwLCBORlNfQ1NfUkVBRFkpOwogb3V0OgpAQCAtMjEwLDI4ICsyNTYsNTYgQEAKIAogI2VuZGlmIC8qIENPTkZJR19ORlNfVjRfMSAqLwogCi1zdHJ1Y3QgcnBjX2NyZWQgKm5mczRfZ2V0X3NldGNsaWVudGlkX2NyZWQoc3RydWN0IG5mc19jbGllbnQgKmNscCkKK3N0YXRpYyBzdHJ1Y3QgcnBjX2NyZWQgKgorbmZzNF9nZXRfc2V0Y2xpZW50aWRfY3JlZF9zZXJ2ZXIoc3RydWN0IG5mc19zZXJ2ZXIgKnNlcnZlcikKIHsKKwlzdHJ1Y3QgbmZzX2NsaWVudCAqY2xwID0gc2VydmVyLT5uZnNfY2xpZW50OworCXN0cnVjdCBycGNfY3JlZCAqY3JlZCA9IE5VTEw7CiAJc3RydWN0IG5mczRfc3RhdGVfb3duZXIgKnNwOwogCXN0cnVjdCByYl9ub2RlICpwb3M7Ci0Jc3RydWN0IHJwY19jcmVkICpjcmVkOwogCiAJc3Bpbl9sb2NrKCZjbHAtPmNsX2xvY2spOwotCWNyZWQgPSBuZnM0X2dldF9tYWNoaW5lX2NyZWRfbG9ja2VkKGNscCk7Ci0JaWYgKGNyZWQgIT0gTlVMTCkKLQkJZ290byBvdXQ7Ci0JcG9zID0gcmJfZmlyc3QoJmNscC0+Y2xfc3RhdGVfb3duZXJzKTsKKwlwb3MgPSByYl9maXJzdCgmc2VydmVyLT5zdGF0ZV9vd25lcnMpOwogCWlmIChwb3MgIT0gTlVMTCkgewotCQlzcCA9IHJiX2VudHJ5KHBvcywgc3RydWN0IG5mczRfc3RhdGVfb3duZXIsIHNvX2NsaWVudF9ub2RlKTsKKwkJc3AgPSByYl9lbnRyeShwb3MsIHN0cnVjdCBuZnM0X3N0YXRlX293bmVyLCBzb19zZXJ2ZXJfbm9kZSk7CiAJCWNyZWQgPSBnZXRfcnBjY3JlZChzcC0+c29fY3JlZCk7CiAJfQotb3V0OgogCXNwaW5fdW5sb2NrKCZjbHAtPmNsX2xvY2spOwogCXJldHVybiBjcmVkOwogfQogCi1zdGF0aWMgdm9pZCBuZnNfYWxsb2NfdW5pcXVlX2lkKHN0cnVjdCByYl9yb290ICpyb290LCBzdHJ1Y3QgbmZzX3VuaXF1ZV9pZCAqbmV3LAotCQlfX3U2NCBtaW52YWwsIGludCBtYXhiaXRzKQorLyoqCisgKiBuZnM0X2dldF9zZXRjbGllbnRpZF9jcmVkIC0gQWNxdWlyZSBjcmVkZW50aWFsIGZvciBhIHNldGNsaWVudGlkIG9wZXJhdGlvbgorICogQGNscDogY2xpZW50IHN0YXRlIGhhbmRsZQorICoKKyAqIFJldHVybnMgYW4gcnBjX2NyZWQgd2l0aCByZWZlcmVuY2UgY291bnQgYnVtcGVkLCBvciBOVUxMLgorICovCitzdHJ1Y3QgcnBjX2NyZWQgKm5mczRfZ2V0X3NldGNsaWVudGlkX2NyZWQoc3RydWN0IG5mc19jbGllbnQgKmNscCkKK3sKKwlzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyOworCXN0cnVjdCBycGNfY3JlZCAqY3JlZDsKKworCXNwaW5fbG9jaygmY2xwLT5jbF9sb2NrKTsKKwljcmVkID0gbmZzNF9nZXRfbWFjaGluZV9jcmVkX2xvY2tlZChjbHApOworCXNwaW5fdW5sb2NrKCZjbHAtPmNsX2xvY2spOworCWlmIChjcmVkICE9IE5VTEwpCisJCWdvdG8gb3V0OworCisJcmN1X3JlYWRfbG9jaygpOworCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KHNlcnZlciwgJmNscC0+Y2xfc3VwZXJibG9ja3MsIGNsaWVudF9saW5rKSB7CisJCWNyZWQgPSBuZnM0X2dldF9zZXRjbGllbnRpZF9jcmVkX3NlcnZlcihzZXJ2ZXIpOworCQlpZiAoY3JlZCAhPSBOVUxMKQorCQkJYnJlYWs7CisJfQorCXJjdV9yZWFkX3VubG9jaygpOworCitvdXQ6CisJcmV0dXJuIGNyZWQ7Cit9CisKK3N0YXRpYyB2b2lkIG5mc19hbGxvY191bmlxdWVfaWRfbG9ja2VkKHN0cnVjdCByYl9yb290ICpyb290LAorCQkJCSAgICAgICBzdHJ1Y3QgbmZzX3VuaXF1ZV9pZCAqbmV3LAorCQkJCSAgICAgICBfX3U2NCBtaW52YWwsIGludCBtYXhiaXRzKQogewogCXN0cnVjdCByYl9ub2RlICoqcCwgKnBhcmVudDsKIAlzdHJ1Y3QgbmZzX3VuaXF1ZV9pZCAqcG9zOwpAQCAtMjg2LDE2ICszNjAsMTUgQEAKIH0KIAogc3RhdGljIHN0cnVjdCBuZnM0X3N0YXRlX293bmVyICoKLW5mczRfZmluZF9zdGF0ZV9vd25lcihzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyLCBzdHJ1Y3QgcnBjX2NyZWQgKmNyZWQpCituZnM0X2ZpbmRfc3RhdGVfb3duZXJfbG9ja2VkKHN0cnVjdCBuZnNfc2VydmVyICpzZXJ2ZXIsIHN0cnVjdCBycGNfY3JlZCAqY3JlZCkKIHsKLQlzdHJ1Y3QgbmZzX2NsaWVudCAqY2xwID0gc2VydmVyLT5uZnNfY2xpZW50OwotCXN0cnVjdCByYl9ub2RlICoqcCA9ICZjbHAtPmNsX3N0YXRlX293bmVycy5yYl9ub2RlLAorCXN0cnVjdCByYl9ub2RlICoqcCA9ICZzZXJ2ZXItPnN0YXRlX293bmVycy5yYl9ub2RlLAogCQkgICAgICAgKnBhcmVudCA9IE5VTEw7CiAJc3RydWN0IG5mczRfc3RhdGVfb3duZXIgKnNwLCAqcmVzID0gTlVMTDsKIAogCXdoaWxlICgqcCAhPSBOVUxMKSB7CiAJCXBhcmVudCA9ICpwOwotCQlzcCA9IHJiX2VudHJ5KHBhcmVudCwgc3RydWN0IG5mczRfc3RhdGVfb3duZXIsIHNvX2NsaWVudF9ub2RlKTsKKwkJc3AgPSByYl9lbnRyeShwYXJlbnQsIHN0cnVjdCBuZnM0X3N0YXRlX293bmVyLCBzb19zZXJ2ZXJfbm9kZSk7CiAKIAkJaWYgKHNlcnZlciA8IHNwLT5zb19zZXJ2ZXIpIHsKIAkJCXAgPSAmcGFyZW50LT5yYl9sZWZ0OwpAQCAtMzE5LDI0ICszOTIsMTcgQEAKIH0KIAogc3RhdGljIHN0cnVjdCBuZnM0X3N0YXRlX293bmVyICoKLW5mczRfaW5zZXJ0X3N0YXRlX293bmVyKHN0cnVjdCBuZnNfY2xpZW50ICpjbHAsIHN0cnVjdCBuZnM0X3N0YXRlX293bmVyICpuZXcpCituZnM0X2luc2VydF9zdGF0ZV9vd25lcl9sb2NrZWQoc3RydWN0IG5mczRfc3RhdGVfb3duZXIgKm5ldykKIHsKLQlzdHJ1Y3QgcmJfbm9kZSAqKnAgPSAmY2xwLT5jbF9zdGF0ZV9vd25lcnMucmJfbm9kZSwKKwlzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyID0gbmV3LT5zb19zZXJ2ZXI7CisJc3RydWN0IHJiX25vZGUgKipwID0gJnNlcnZlci0+c3RhdGVfb3duZXJzLnJiX25vZGUsCiAJCSAgICAgICAqcGFyZW50ID0gTlVMTDsKIAlzdHJ1Y3QgbmZzNF9zdGF0ZV9vd25lciAqc3A7CiAKIAl3aGlsZSAoKnAgIT0gTlVMTCkgewogCQlwYXJlbnQgPSAqcDsKLQkJc3AgPSByYl9lbnRyeShwYXJlbnQsIHN0cnVjdCBuZnM0X3N0YXRlX293bmVyLCBzb19jbGllbnRfbm9kZSk7CisJCXNwID0gcmJfZW50cnkocGFyZW50LCBzdHJ1Y3QgbmZzNF9zdGF0ZV9vd25lciwgc29fc2VydmVyX25vZGUpOwogCi0JCWlmIChuZXctPnNvX3NlcnZlciA8IHNwLT5zb19zZXJ2ZXIpIHsKLQkJCXAgPSAmcGFyZW50LT5yYl9sZWZ0OwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKG5ldy0+c29fc2VydmVyID4gc3AtPnNvX3NlcnZlcikgewotCQkJcCA9ICZwYXJlbnQtPnJiX3JpZ2h0OwotCQkJY29udGludWU7Ci0JCX0KIAkJaWYgKG5ldy0+c29fY3JlZCA8IHNwLT5zb19jcmVkKQogCQkJcCA9ICZwYXJlbnQtPnJiX2xlZnQ7CiAJCWVsc2UgaWYgKG5ldy0+c29fY3JlZCA+IHNwLT5zb19jcmVkKQpAQCAtMzQ2LDE4ICs0MTIsMjEgQEAKIAkJCXJldHVybiBzcDsKIAkJfQogCX0KLQluZnNfYWxsb2NfdW5pcXVlX2lkKCZjbHAtPmNsX29wZW5vd25lcl9pZCwgJm5ldy0+c29fb3duZXJfaWQsIDEsIDY0KTsKLQlyYl9saW5rX25vZGUoJm5ldy0+c29fY2xpZW50X25vZGUsIHBhcmVudCwgcCk7Ci0JcmJfaW5zZXJ0X2NvbG9yKCZuZXctPnNvX2NsaWVudF9ub2RlLCAmY2xwLT5jbF9zdGF0ZV9vd25lcnMpOworCW5mc19hbGxvY191bmlxdWVfaWRfbG9ja2VkKCZzZXJ2ZXItPm9wZW5vd25lcl9pZCwKKwkJCQkJJm5ldy0+c29fb3duZXJfaWQsIDEsIDY0KTsKKwlyYl9saW5rX25vZGUoJm5ldy0+c29fc2VydmVyX25vZGUsIHBhcmVudCwgcCk7CisJcmJfaW5zZXJ0X2NvbG9yKCZuZXctPnNvX3NlcnZlcl9ub2RlLCAmc2VydmVyLT5zdGF0ZV9vd25lcnMpOwogCXJldHVybiBuZXc7CiB9CiAKIHN0YXRpYyB2b2lkCi1uZnM0X3JlbW92ZV9zdGF0ZV9vd25lcihzdHJ1Y3QgbmZzX2NsaWVudCAqY2xwLCBzdHJ1Y3QgbmZzNF9zdGF0ZV9vd25lciAqc3ApCituZnM0X3JlbW92ZV9zdGF0ZV9vd25lcl9sb2NrZWQoc3RydWN0IG5mczRfc3RhdGVfb3duZXIgKnNwKQogewotCWlmICghUkJfRU1QVFlfTk9ERSgmc3AtPnNvX2NsaWVudF9ub2RlKSkKLQkJcmJfZXJhc2UoJnNwLT5zb19jbGllbnRfbm9kZSwgJmNscC0+Y2xfc3RhdGVfb3duZXJzKTsKLQluZnNfZnJlZV91bmlxdWVfaWQoJmNscC0+Y2xfb3Blbm93bmVyX2lkLCAmc3AtPnNvX293bmVyX2lkKTsKKwlzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyID0gc3AtPnNvX3NlcnZlcjsKKworCWlmICghUkJfRU1QVFlfTk9ERSgmc3AtPnNvX3NlcnZlcl9ub2RlKSkKKwkJcmJfZXJhc2UoJnNwLT5zb19zZXJ2ZXJfbm9kZSwgJnNlcnZlci0+c3RhdGVfb3duZXJzKTsKKwluZnNfZnJlZV91bmlxdWVfaWQoJnNlcnZlci0+b3Blbm93bmVyX2lkLCAmc3AtPnNvX293bmVyX2lkKTsKIH0KIAogLyoKQEAgLTM4NiwyMyArNDU1LDMyIEBACiBzdGF0aWMgdm9pZAogbmZzNF9kcm9wX3N0YXRlX293bmVyKHN0cnVjdCBuZnM0X3N0YXRlX293bmVyICpzcCkKIHsKLQlpZiAoIVJCX0VNUFRZX05PREUoJnNwLT5zb19jbGllbnRfbm9kZSkpIHsKLQkJc3RydWN0IG5mc19jbGllbnQgKmNscCA9IHNwLT5zb19zZXJ2ZXItPm5mc19jbGllbnQ7CisJaWYgKCFSQl9FTVBUWV9OT0RFKCZzcC0+c29fc2VydmVyX25vZGUpKSB7CisJCXN0cnVjdCBuZnNfc2VydmVyICpzZXJ2ZXIgPSBzcC0+c29fc2VydmVyOworCQlzdHJ1Y3QgbmZzX2NsaWVudCAqY2xwID0gc2VydmVyLT5uZnNfY2xpZW50OwogCiAJCXNwaW5fbG9jaygmY2xwLT5jbF9sb2NrKTsKLQkJcmJfZXJhc2UoJnNwLT5zb19jbGllbnRfbm9kZSwgJmNscC0+Y2xfc3RhdGVfb3duZXJzKTsKLQkJUkJfQ0xFQVJfTk9ERSgmc3AtPnNvX2NsaWVudF9ub2RlKTsKKwkJcmJfZXJhc2UoJnNwLT5zb19zZXJ2ZXJfbm9kZSwgJnNlcnZlci0+c3RhdGVfb3duZXJzKTsKKwkJUkJfQ0xFQVJfTk9ERSgmc3AtPnNvX3NlcnZlcl9ub2RlKTsKIAkJc3Bpbl91bmxvY2soJmNscC0+Y2xfbG9jayk7CiAJfQogfQogCi1zdHJ1Y3QgbmZzNF9zdGF0ZV9vd25lciAqbmZzNF9nZXRfc3RhdGVfb3duZXIoc3RydWN0IG5mc19zZXJ2ZXIgKnNlcnZlciwgc3RydWN0IHJwY19jcmVkICpjcmVkKQorLyoqCisgKiBuZnM0X2dldF9zdGF0ZV9vd25lciAtIExvb2sgdXAgYSBzdGF0ZSBvd25lciBnaXZlbiBhIGNyZWRlbnRpYWwKKyAqIEBzZXJ2ZXI6IG5mc19zZXJ2ZXIgdG8gc2VhcmNoCisgKiBAY3JlZDogUlBDIGNyZWRlbnRpYWwgdG8gbWF0Y2gKKyAqCisgKiBSZXR1cm5zIGEgcG9pbnRlciB0byBhbiBpbnN0YW50aWF0ZWQgbmZzNF9zdGF0ZV9vd25lciBzdHJ1Y3QsIG9yIE5VTEwuCisgKi8KK3N0cnVjdCBuZnM0X3N0YXRlX293bmVyICpuZnM0X2dldF9zdGF0ZV9vd25lcihzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyLAorCQkJCQkgICAgICBzdHJ1Y3QgcnBjX2NyZWQgKmNyZWQpCiB7CiAJc3RydWN0IG5mc19jbGllbnQgKmNscCA9IHNlcnZlci0+bmZzX2NsaWVudDsKIAlzdHJ1Y3QgbmZzNF9zdGF0ZV9vd25lciAqc3AsICpuZXc7CiAKIAlzcGluX2xvY2soJmNscC0+Y2xfbG9jayk7Ci0Jc3AgPSBuZnM0X2ZpbmRfc3RhdGVfb3duZXIoc2VydmVyLCBjcmVkKTsKKwlzcCA9IG5mczRfZmluZF9zdGF0ZV9vd25lcl9sb2NrZWQoc2VydmVyLCBjcmVkKTsKIAlzcGluX3VubG9jaygmY2xwLT5jbF9sb2NrKTsKIAlpZiAoc3AgIT0gTlVMTCkKIAkJcmV0dXJuIHNwOwpAQCAtNDEyLDcgKzQ5MCw3IEBACiAJbmV3LT5zb19zZXJ2ZXIgPSBzZXJ2ZXI7CiAJbmV3LT5zb19jcmVkID0gY3JlZDsKIAlzcGluX2xvY2soJmNscC0+Y2xfbG9jayk7Ci0Jc3AgPSBuZnM0X2luc2VydF9zdGF0ZV9vd25lcihjbHAsIG5ldyk7CisJc3AgPSBuZnM0X2luc2VydF9zdGF0ZV9vd25lcl9sb2NrZWQobmV3KTsKIAlzcGluX3VubG9jaygmY2xwLT5jbF9sb2NrKTsKIAlpZiAoc3AgPT0gbmV3KQogCQlnZXRfcnBjY3JlZChjcmVkKTsKQEAgLTQyMyw2ICs1MDEsMTEgQEAKIAlyZXR1cm4gc3A7CiB9CiAKKy8qKgorICogbmZzNF9wdXRfc3RhdGVfb3duZXIgLSBSZWxlYXNlIGEgbmZzNF9zdGF0ZV9vd25lcgorICogQHNwOiBzdGF0ZSBvd25lciBkYXRhIHRvIHJlbGVhc2UKKyAqCisgKi8KIHZvaWQgbmZzNF9wdXRfc3RhdGVfb3duZXIoc3RydWN0IG5mczRfc3RhdGVfb3duZXIgKnNwKQogewogCXN0cnVjdCBuZnNfY2xpZW50ICpjbHAgPSBzcC0+c29fc2VydmVyLT5uZnNfY2xpZW50OwpAQCAtNDMwLDcgKzUxMyw3IEBACiAKIAlpZiAoIWF0b21pY19kZWNfYW5kX2xvY2soJnNwLT5zb19jb3VudCwgJmNscC0+Y2xfbG9jaykpCiAJCXJldHVybjsKLQluZnM0X3JlbW92ZV9zdGF0ZV9vd25lcihjbHAsIHNwKTsKKwluZnM0X3JlbW92ZV9zdGF0ZV9vd25lcl9sb2NrZWQoc3ApOwogCXNwaW5fdW5sb2NrKCZjbHAtPmNsX2xvY2spOwogCXJwY19kZXN0cm95X3dhaXRfcXVldWUoJnNwLT5zb19zZXF1ZW5jZS53YWl0KTsKIAlwdXRfcnBjY3JlZChjcmVkKTsKQEAgLTU4NSw4ICs2NjgsMTEgQEAKIAlpZiAoIWNhbGxfY2xvc2UpIHsKIAkJbmZzNF9wdXRfb3Blbl9zdGF0ZShzdGF0ZSk7CiAJCW5mczRfcHV0X3N0YXRlX293bmVyKG93bmVyKTsKLQl9IGVsc2UKLQkJbmZzNF9kb19jbG9zZShwYXRoLCBzdGF0ZSwgZ2ZwX21hc2ssIHdhaXQpOworCX0gZWxzZSB7CisJCWJvb2wgcm9jID0gcG5mc19yb2Moc3RhdGUtPmlub2RlKTsKKworCQluZnM0X2RvX2Nsb3NlKHBhdGgsIHN0YXRlLCBnZnBfbWFzaywgd2FpdCwgcm9jKTsKKwl9CiB9CiAKIHZvaWQgbmZzNF9jbG9zZV9zdGF0ZShzdHJ1Y3QgcGF0aCAqcGF0aCwgc3RydWN0IG5mczRfc3RhdGUgKnN0YXRlLCBmbW9kZV90IGZtb2RlKQpAQCAtNjMzLDcgKzcxOSw4IEBACiBzdGF0aWMgc3RydWN0IG5mczRfbG9ja19zdGF0ZSAqbmZzNF9hbGxvY19sb2NrX3N0YXRlKHN0cnVjdCBuZnM0X3N0YXRlICpzdGF0ZSwgZmxfb3duZXJfdCBmbF9vd25lciwgcGlkX3QgZmxfcGlkLCB1bnNpZ25lZCBpbnQgdHlwZSkKIHsKIAlzdHJ1Y3QgbmZzNF9sb2NrX3N0YXRlICpsc3A7Ci0Jc3RydWN0IG5mc19jbGllbnQgKmNscCA9IHN0YXRlLT5vd25lci0+c29fc2VydmVyLT5uZnNfY2xpZW50OworCXN0cnVjdCBuZnNfc2VydmVyICpzZXJ2ZXIgPSBzdGF0ZS0+b3duZXItPnNvX3NlcnZlcjsKKwlzdHJ1Y3QgbmZzX2NsaWVudCAqY2xwID0gc2VydmVyLT5uZnNfY2xpZW50OwogCiAJbHNwID0ga3phbGxvYyhzaXplb2YoKmxzcCksIEdGUF9OT0ZTKTsKIAlpZiAobHNwID09IE5VTEwpCkBAIC02NTcsNyArNzQ0LDcgQEAKIAkJcmV0dXJuIE5VTEw7CiAJfQogCXNwaW5fbG9jaygmY2xwLT5jbF9sb2NrKTsKLQluZnNfYWxsb2NfdW5pcXVlX2lkKCZjbHAtPmNsX2xvY2tvd25lcl9pZCwgJmxzcC0+bHNfaWQsIDEsIDY0KTsKKwluZnNfYWxsb2NfdW5pcXVlX2lkX2xvY2tlZCgmc2VydmVyLT5sb2Nrb3duZXJfaWQsICZsc3AtPmxzX2lkLCAxLCA2NCk7CiAJc3Bpbl91bmxvY2soJmNscC0+Y2xfbG9jayk7CiAJSU5JVF9MSVNUX0hFQUQoJmxzcC0+bHNfbG9ja3MpOwogCXJldHVybiBsc3A7CkBAIC02NjUsMTAgKzc1MiwxMSBAQAogCiBzdGF0aWMgdm9pZCBuZnM0X2ZyZWVfbG9ja19zdGF0ZShzdHJ1Y3QgbmZzNF9sb2NrX3N0YXRlICpsc3ApCiB7Ci0Jc3RydWN0IG5mc19jbGllbnQgKmNscCA9IGxzcC0+bHNfc3RhdGUtPm93bmVyLT5zb19zZXJ2ZXItPm5mc19jbGllbnQ7CisJc3RydWN0IG5mc19zZXJ2ZXIgKnNlcnZlciA9IGxzcC0+bHNfc3RhdGUtPm93bmVyLT5zb19zZXJ2ZXI7CisJc3RydWN0IG5mc19jbGllbnQgKmNscCA9IHNlcnZlci0+bmZzX2NsaWVudDsKIAogCXNwaW5fbG9jaygmY2xwLT5jbF9sb2NrKTsKLQluZnNfZnJlZV91bmlxdWVfaWQoJmNscC0+Y2xfbG9ja293bmVyX2lkLCAmbHNwLT5sc19pZCk7CisJbmZzX2ZyZWVfdW5pcXVlX2lkKCZzZXJ2ZXItPmxvY2tvd25lcl9pZCwgJmxzcC0+bHNfaWQpOwogCXNwaW5fdW5sb2NrKCZjbHAtPmNsX2xvY2spOwogCXJwY19kZXN0cm95X3dhaXRfcXVldWUoJmxzcC0+bHNfc2VxdWVuY2Uud2FpdCk7CiAJa2ZyZWUobHNwKTsKQEAgLTExMTQsMTUgKzEyMDIsMTkgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIG5mczRfc3RhdGVfbWFya19yZWNsYWltX2hlbHBlcihzdHJ1Y3QgbmZzX2NsaWVudCAqY2xwLCBpbnQgKCptYXJrX3JlY2xhaW0pKHN0cnVjdCBuZnNfY2xpZW50ICpjbHAsIHN0cnVjdCBuZnM0X3N0YXRlICpzdGF0ZSkpCitzdGF0aWMgdm9pZCBuZnM0X3Jlc2V0X3NlcWlkcyhzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyLAorCWludCAoKm1hcmtfcmVjbGFpbSkoc3RydWN0IG5mc19jbGllbnQgKmNscCwgc3RydWN0IG5mczRfc3RhdGUgKnN0YXRlKSkKIHsKKwlzdHJ1Y3QgbmZzX2NsaWVudCAqY2xwID0gc2VydmVyLT5uZnNfY2xpZW50OwogCXN0cnVjdCBuZnM0X3N0YXRlX293bmVyICpzcDsKIAlzdHJ1Y3QgcmJfbm9kZSAqcG9zOwogCXN0cnVjdCBuZnM0X3N0YXRlICpzdGF0ZTsKIAotCS8qIFJlc2V0IGFsbCBzZXF1ZW5jZSBpZHMgdG8gemVybyAqLwotCWZvciAocG9zID0gcmJfZmlyc3QoJmNscC0+Y2xfc3RhdGVfb3duZXJzKTsgcG9zICE9IE5VTEw7IHBvcyA9IHJiX25leHQocG9zKSkgewotCQlzcCA9IHJiX2VudHJ5KHBvcywgc3RydWN0IG5mczRfc3RhdGVfb3duZXIsIHNvX2NsaWVudF9ub2RlKTsKKwlzcGluX2xvY2soJmNscC0+Y2xfbG9jayk7CisJZm9yIChwb3MgPSByYl9maXJzdCgmc2VydmVyLT5zdGF0ZV9vd25lcnMpOworCSAgICAgcG9zICE9IE5VTEw7CisJICAgICBwb3MgPSByYl9uZXh0KHBvcykpIHsKKwkJc3AgPSByYl9lbnRyeShwb3MsIHN0cnVjdCBuZnM0X3N0YXRlX293bmVyLCBzb19zZXJ2ZXJfbm9kZSk7CiAJCXNwLT5zb19zZXFpZC5mbGFncyA9IDA7CiAJCXNwaW5fbG9jaygmc3AtPnNvX2xvY2spOwogCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHN0YXRlLCAmc3AtPnNvX3N0YXRlcywgb3Blbl9zdGF0ZXMpIHsKQEAgLTExMzEsNiArMTIyMywxOCBAQAogCQl9CiAJCXNwaW5fdW5sb2NrKCZzcC0+c29fbG9jayk7CiAJfQorCXNwaW5fdW5sb2NrKCZjbHAtPmNsX2xvY2spOworfQorCitzdGF0aWMgdm9pZCBuZnM0X3N0YXRlX21hcmtfcmVjbGFpbV9oZWxwZXIoc3RydWN0IG5mc19jbGllbnQgKmNscCwKKwlpbnQgKCptYXJrX3JlY2xhaW0pKHN0cnVjdCBuZnNfY2xpZW50ICpjbHAsIHN0cnVjdCBuZnM0X3N0YXRlICpzdGF0ZSkpCit7CisJc3RydWN0IG5mc19zZXJ2ZXIgKnNlcnZlcjsKKworCXJjdV9yZWFkX2xvY2soKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShzZXJ2ZXIsICZjbHAtPmNsX3N1cGVyYmxvY2tzLCBjbGllbnRfbGluaykKKwkJbmZzNF9yZXNldF9zZXFpZHMoc2VydmVyLCBtYXJrX3JlY2xhaW0pOworCXJjdV9yZWFkX3VubG9jaygpOwogfQogCiBzdGF0aWMgdm9pZCBuZnM0X3N0YXRlX3N0YXJ0X3JlY2xhaW1fcmVib290KHN0cnVjdCBuZnNfY2xpZW50ICpjbHApCkBAIC0xMTQ4LDI1ICsxMjUyLDQxIEBACiAJCSh2b2lkKW9wcy0+cmVjbGFpbV9jb21wbGV0ZShjbHApOwogfQogCi1zdGF0aWMgaW50IG5mczRfc3RhdGVfY2xlYXJfcmVjbGFpbV9yZWJvb3Qoc3RydWN0IG5mc19jbGllbnQgKmNscCkKK3N0YXRpYyB2b2lkIG5mczRfY2xlYXJfcmVjbGFpbV9zZXJ2ZXIoc3RydWN0IG5mc19zZXJ2ZXIgKnNlcnZlcikKIHsKKwlzdHJ1Y3QgbmZzX2NsaWVudCAqY2xwID0gc2VydmVyLT5uZnNfY2xpZW50OwogCXN0cnVjdCBuZnM0X3N0YXRlX293bmVyICpzcDsKIAlzdHJ1Y3QgcmJfbm9kZSAqcG9zOwogCXN0cnVjdCBuZnM0X3N0YXRlICpzdGF0ZTsKIAotCWlmICghdGVzdF9hbmRfY2xlYXJfYml0KE5GUzRDTE5UX1JFQ0xBSU1fUkVCT09ULCAmY2xwLT5jbF9zdGF0ZSkpCi0JCXJldHVybiAwOwotCi0JZm9yIChwb3MgPSByYl9maXJzdCgmY2xwLT5jbF9zdGF0ZV9vd25lcnMpOyBwb3MgIT0gTlVMTDsgcG9zID0gcmJfbmV4dChwb3MpKSB7Ci0JCXNwID0gcmJfZW50cnkocG9zLCBzdHJ1Y3QgbmZzNF9zdGF0ZV9vd25lciwgc29fY2xpZW50X25vZGUpOworCXNwaW5fbG9jaygmY2xwLT5jbF9sb2NrKTsKKwlmb3IgKHBvcyA9IHJiX2ZpcnN0KCZzZXJ2ZXItPnN0YXRlX293bmVycyk7CisJICAgICBwb3MgIT0gTlVMTDsKKwkgICAgIHBvcyA9IHJiX25leHQocG9zKSkgeworCQlzcCA9IHJiX2VudHJ5KHBvcywgc3RydWN0IG5mczRfc3RhdGVfb3duZXIsIHNvX3NlcnZlcl9ub2RlKTsKIAkJc3Bpbl9sb2NrKCZzcC0+c29fbG9jayk7CiAJCWxpc3RfZm9yX2VhY2hfZW50cnkoc3RhdGUsICZzcC0+c29fc3RhdGVzLCBvcGVuX3N0YXRlcykgewotCQkJaWYgKCF0ZXN0X2FuZF9jbGVhcl9iaXQoTkZTX1NUQVRFX1JFQ0xBSU1fUkVCT09ULCAmc3RhdGUtPmZsYWdzKSkKKwkJCWlmICghdGVzdF9hbmRfY2xlYXJfYml0KE5GU19TVEFURV9SRUNMQUlNX1JFQk9PVCwKKwkJCQkJCSZzdGF0ZS0+ZmxhZ3MpKQogCQkJCWNvbnRpbnVlOwogCQkJbmZzNF9zdGF0ZV9tYXJrX3JlY2xhaW1fbm9ncmFjZShjbHAsIHN0YXRlKTsKIAkJfQogCQlzcGluX3VubG9jaygmc3AtPnNvX2xvY2spOwogCX0KKwlzcGluX3VubG9jaygmY2xwLT5jbF9sb2NrKTsKK30KKworc3RhdGljIGludCBuZnM0X3N0YXRlX2NsZWFyX3JlY2xhaW1fcmVib290KHN0cnVjdCBuZnNfY2xpZW50ICpjbHApCit7CisJc3RydWN0IG5mc19zZXJ2ZXIgKnNlcnZlcjsKKworCWlmICghdGVzdF9hbmRfY2xlYXJfYml0KE5GUzRDTE5UX1JFQ0xBSU1fUkVCT09ULCAmY2xwLT5jbF9zdGF0ZSkpCisJCXJldHVybiAwOworCisJcmN1X3JlYWRfbG9jaygpOworCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KHNlcnZlciwgJmNscC0+Y2xfc3VwZXJibG9ja3MsIGNsaWVudF9saW5rKQorCQluZnM0X2NsZWFyX3JlY2xhaW1fc2VydmVyKHNlcnZlcik7CisJcmN1X3JlYWRfdW5sb2NrKCk7CiAKIAluZnNfZGVsZWdhdGlvbl9yZWFwX3VuY2xhaW1lZChjbHApOwogCXJldHVybiAxOwpAQCAtMTIzOCwyNyArMTM1OCw0MCBAQAogCiBzdGF0aWMgaW50IG5mczRfZG9fcmVjbGFpbShzdHJ1Y3QgbmZzX2NsaWVudCAqY2xwLCBjb25zdCBzdHJ1Y3QgbmZzNF9zdGF0ZV9yZWNvdmVyeV9vcHMgKm9wcykKIHsKKwlzdHJ1Y3QgbmZzNF9zdGF0ZV9vd25lciAqc3A7CisJc3RydWN0IG5mc19zZXJ2ZXIgKnNlcnZlcjsKIAlzdHJ1Y3QgcmJfbm9kZSAqcG9zOwogCWludCBzdGF0dXMgPSAwOwogCiByZXN0YXJ0OgotCXNwaW5fbG9jaygmY2xwLT5jbF9sb2NrKTsKLQlmb3IgKHBvcyA9IHJiX2ZpcnN0KCZjbHAtPmNsX3N0YXRlX293bmVycyk7IHBvcyAhPSBOVUxMOyBwb3MgPSByYl9uZXh0KHBvcykpIHsKLQkJc3RydWN0IG5mczRfc3RhdGVfb3duZXIgKnNwID0gcmJfZW50cnkocG9zLCBzdHJ1Y3QgbmZzNF9zdGF0ZV9vd25lciwgc29fY2xpZW50X25vZGUpOwotCQlpZiAoIXRlc3RfYW5kX2NsZWFyX2JpdChvcHMtPm93bmVyX2ZsYWdfYml0LCAmc3AtPnNvX2ZsYWdzKSkKLQkJCWNvbnRpbnVlOwotCQlhdG9taWNfaW5jKCZzcC0+c29fY291bnQpOwotCQlzcGluX3VubG9jaygmY2xwLT5jbF9sb2NrKTsKLQkJc3RhdHVzID0gbmZzNF9yZWNsYWltX29wZW5fc3RhdGUoc3AsIG9wcyk7Ci0JCWlmIChzdGF0dXMgPCAwKSB7Ci0JCQlzZXRfYml0KG9wcy0+b3duZXJfZmxhZ19iaXQsICZzcC0+c29fZmxhZ3MpOworCXJjdV9yZWFkX2xvY2soKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShzZXJ2ZXIsICZjbHAtPmNsX3N1cGVyYmxvY2tzLCBjbGllbnRfbGluaykgeworCQlzcGluX2xvY2soJmNscC0+Y2xfbG9jayk7CisJCWZvciAocG9zID0gcmJfZmlyc3QoJnNlcnZlci0+c3RhdGVfb3duZXJzKTsKKwkJICAgICBwb3MgIT0gTlVMTDsKKwkJICAgICBwb3MgPSByYl9uZXh0KHBvcykpIHsKKwkJCXNwID0gcmJfZW50cnkocG9zLAorCQkJCXN0cnVjdCBuZnM0X3N0YXRlX293bmVyLCBzb19zZXJ2ZXJfbm9kZSk7CisJCQlpZiAoIXRlc3RfYW5kX2NsZWFyX2JpdChvcHMtPm93bmVyX2ZsYWdfYml0LAorCQkJCQkJCSZzcC0+c29fZmxhZ3MpKQorCQkJCWNvbnRpbnVlOworCQkJYXRvbWljX2luYygmc3AtPnNvX2NvdW50KTsKKwkJCXNwaW5fdW5sb2NrKCZjbHAtPmNsX2xvY2spOworCQkJcmN1X3JlYWRfdW5sb2NrKCk7CisKKwkJCXN0YXR1cyA9IG5mczRfcmVjbGFpbV9vcGVuX3N0YXRlKHNwLCBvcHMpOworCQkJaWYgKHN0YXR1cyA8IDApIHsKKwkJCQlzZXRfYml0KG9wcy0+b3duZXJfZmxhZ19iaXQsICZzcC0+c29fZmxhZ3MpOworCQkJCW5mczRfcHV0X3N0YXRlX293bmVyKHNwKTsKKwkJCQlyZXR1cm4gbmZzNF9yZWNvdmVyeV9oYW5kbGVfZXJyb3IoY2xwLCBzdGF0dXMpOworCQkJfQorCiAJCQluZnM0X3B1dF9zdGF0ZV9vd25lcihzcCk7Ci0JCQlyZXR1cm4gbmZzNF9yZWNvdmVyeV9oYW5kbGVfZXJyb3IoY2xwLCBzdGF0dXMpOworCQkJZ290byByZXN0YXJ0OwogCQl9Ci0JCW5mczRfcHV0X3N0YXRlX293bmVyKHNwKTsKLQkJZ290byByZXN0YXJ0OworCQlzcGluX3VubG9jaygmY2xwLT5jbF9sb2NrKTsKIAl9Ci0Jc3Bpbl91bmxvY2soJmNscC0+Y2xfbG9jayk7CisJcmN1X3JlYWRfdW5sb2NrKCk7CiAJcmV0dXJuIHN0YXR1czsKIH0KIApkaWZmIC0tZ2l0IGEvZnMvbmZzL25mczR4ZHIuYyBiL2ZzL25mcy9uZnM0eGRyLmMKaW5kZXggOWYxODI2Yi4uMmFiOGU1YyAxMDA2NDQKLS0tIGEvZnMvbmZzL25mczR4ZHIuYworKysgYi9mcy9uZnMvbmZzNHhkci5jCkBAIC03MSw4ICs3MSw4IEBACiAvKiBsb2NrLG9wZW4gb3duZXIgaWQ6CiAgKiB3ZSBjdXJyZW50bHkgdXNlIHNpemUgMiAodTY0KSBvdXQgb2YgKE5GUzRfT1BBUVVFX0xJTUlUICA+PiAyKQogICovCi0jZGVmaW5lIG9wZW5fb3duZXJfaWRfbWF4c3oJKDEgKyA0KQotI2RlZmluZSBsb2NrX293bmVyX2lkX21heHN6CSgxICsgNCkKKyNkZWZpbmUgb3Blbl9vd25lcl9pZF9tYXhzegkoMSArIDEgKyA0KQorI2RlZmluZSBsb2NrX293bmVyX2lkX21heHN6CSgxICsgMSArIDQpCiAjZGVmaW5lIGRlY29kZV9sb2Nrb3duZXJfbWF4c3oJKDEgKyBYRFJfUVVBRExFTihJRE1BUF9OQU1FU1opKQogI2RlZmluZSBjb21wb3VuZF9lbmNvZGVfaGRyX21heHN6CSgzICsgKE5GUzRfTUFYVEFHTEVOID4+IDIpKQogI2RlZmluZSBjb21wb3VuZF9kZWNvZGVfaGRyX21heHN6CSgzICsgKE5GUzRfTUFYVEFHTEVOID4+IDIpKQpAQCAtMTA4OCwxMCArMTA4OCwxMSBAQAogewogCV9fYmUzMiAqcDsKIAotCXAgPSByZXNlcnZlX3NwYWNlKHhkciwgMjgpOworCXAgPSByZXNlcnZlX3NwYWNlKHhkciwgMzIpOwogCXAgPSB4ZHJfZW5jb2RlX2h5cGVyKHAsIGxvd25lci0+Y2xpZW50aWQpOwotCSpwKysgPSBjcHVfdG9fYmUzMigxNik7CisJKnArKyA9IGNwdV90b19iZTMyKDIwKTsKIAlwID0geGRyX2VuY29kZV9vcGFxdWVfZml4ZWQocCwgImxvY2sgaWQ6IiwgOCk7CisJKnArKyA9IGNwdV90b19iZTMyKGxvd25lci0+c19kZXYpOwogCXhkcl9lbmNvZGVfaHlwZXIocCwgbG93bmVyLT5pZCk7CiB9CiAKQEAgLTEyMTAsMTAgKzEyMTEsMTEgQEAKIAkqcCsrID0gY3B1X3RvX2JlMzIoT1BfT1BFTik7CiAJKnAgPSBjcHVfdG9fYmUzMihhcmctPnNlcWlkLT5zZXF1ZW5jZS0+Y291bnRlcik7CiAJZW5jb2RlX3NoYXJlX2FjY2Vzcyh4ZHIsIGFyZy0+Zm1vZGUpOwotCXAgPSByZXNlcnZlX3NwYWNlKHhkciwgMjgpOworCXAgPSByZXNlcnZlX3NwYWNlKHhkciwgMzIpOwogCXAgPSB4ZHJfZW5jb2RlX2h5cGVyKHAsIGFyZy0+Y2xpZW50aWQpOwotCSpwKysgPSBjcHVfdG9fYmUzMigxNik7CisJKnArKyA9IGNwdV90b19iZTMyKDIwKTsKIAlwID0geGRyX2VuY29kZV9vcGFxdWVfZml4ZWQocCwgIm9wZW4gaWQ6IiwgOCk7CisJKnArKyA9IGNwdV90b19iZTMyKGFyZy0+c2VydmVyLT5zX2Rldik7CiAJeGRyX2VuY29kZV9oeXBlcihwLCBhcmctPmlkKTsKIH0KIApAQCAtMTUxMCw3ICsxNTEyLDcgQEAKIAloZHItPnJlcGxlbiArPSBkZWNvZGVfcmVzdG9yZWZoX21heHN6OwogfQogCi1zdGF0aWMgaW50CitzdGF0aWMgdm9pZAogZW5jb2RlX3NldGFjbChzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBzdHJ1Y3QgbmZzX3NldGFjbGFyZ3MgKmFyZywgc3RydWN0IGNvbXBvdW5kX2hkciAqaGRyKQogewogCV9fYmUzMiAqcDsKQEAgLTE1MjEsMTQgKzE1MjMsMTIgQEAKIAlwID0gcmVzZXJ2ZV9zcGFjZSh4ZHIsIDIqNCk7CiAJKnArKyA9IGNwdV90b19iZTMyKDEpOwogCSpwID0gY3B1X3RvX2JlMzIoRkFUVFI0X1dPUkQwX0FDTCk7Ci0JaWYgKGFyZy0+YWNsX2xlbiAlIDQpCi0JCXJldHVybiAtRUlOVkFMOworCUJVR19PTihhcmctPmFjbF9sZW4gJSA0KTsKIAlwID0gcmVzZXJ2ZV9zcGFjZSh4ZHIsIDQpOwogCSpwID0gY3B1X3RvX2JlMzIoYXJnLT5hY2xfbGVuKTsKIAl4ZHJfd3JpdGVfcGFnZXMoeGRyLCBhcmctPmFjbF9wYWdlcywgYXJnLT5hY2xfcGdiYXNlLCBhcmctPmFjbF9sZW4pOwogCWhkci0+bm9wcysrOwogCWhkci0+cmVwbGVuICs9IGRlY29kZV9zZXRhY2xfbWF4c3o7Ci0JcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkCkBAIC0xNzg5LDcgKzE3ODksNiBAQAogCQkgICAgICBjb25zdCBzdHJ1Y3QgbmZzNF9sYXlvdXRnZXRfYXJncyAqYXJncywKIAkJICAgICAgc3RydWN0IGNvbXBvdW5kX2hkciAqaGRyKQogewotCW5mczRfc3RhdGVpZCBzdGF0ZWlkOwogCV9fYmUzMiAqcDsKIAogCXAgPSByZXNlcnZlX3NwYWNlKHhkciwgNDQgKyBORlM0X1NUQVRFSURfU0laRSk7CkBAIC0xODAwLDkgKzE3OTksNyBAQAogCXAgPSB4ZHJfZW5jb2RlX2h5cGVyKHAsIGFyZ3MtPnJhbmdlLm9mZnNldCk7CiAJcCA9IHhkcl9lbmNvZGVfaHlwZXIocCwgYXJncy0+cmFuZ2UubGVuZ3RoKTsKIAlwID0geGRyX2VuY29kZV9oeXBlcihwLCBhcmdzLT5taW5sZW5ndGgpOwotCXBuZnNfZ2V0X2xheW91dF9zdGF0ZWlkKCZzdGF0ZWlkLCBORlNfSShhcmdzLT5pbm9kZSktPmxheW91dCwKLQkJCQlhcmdzLT5jdHgtPnN0YXRlKTsKLQlwID0geGRyX2VuY29kZV9vcGFxdWVfZml4ZWQocCwgJnN0YXRlaWQuZGF0YSwgTkZTNF9TVEFURUlEX1NJWkUpOworCXAgPSB4ZHJfZW5jb2RlX29wYXF1ZV9maXhlZChwLCAmYXJncy0+c3RhdGVpZC5kYXRhLCBORlM0X1NUQVRFSURfU0laRSk7CiAJKnAgPSBjcHVfdG9fYmUzMihhcmdzLT5tYXhjb3VudCk7CiAKIAlkcHJpbnRrKCIlczogMXN0IHR5cGU6MHgleCBpb21vZGU6JWQgb2ZmOiVsdSBsZW46JWx1IG1jOiVkXG4iLApAQCAtMTgzMywzOTMgKzE4MzAsMzYyIEBACiAvKgogICogRW5jb2RlIGFuIEFDQ0VTUyByZXF1ZXN0CiAgKi8KLXN0YXRpYyBpbnQgbmZzNF94ZHJfZW5jX2FjY2VzcyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLCBjb25zdCBzdHJ1Y3QgbmZzNF9hY2Nlc3NhcmdzICphcmdzKQorc3RhdGljIHZvaWQgbmZzNF94ZHJfZW5jX2FjY2VzcyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKKwkJCQljb25zdCBzdHJ1Y3QgbmZzNF9hY2Nlc3NhcmdzICphcmdzKQogewotCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKIAlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkciA9IHsKIAkJLm1pbm9ydmVyc2lvbiA9IG5mczRfeGRyX21pbm9ydmVyc2lvbigmYXJncy0+c2VxX2FyZ3MpLAogCX07CiAKLQl4ZHJfaW5pdF9lbmNvZGUoJnhkciwgJnJlcS0+cnFfc25kX2J1ZiwgcCk7Ci0JZW5jb2RlX2NvbXBvdW5kX2hkcigmeGRyLCByZXEsICZoZHIpOwotCWVuY29kZV9zZXF1ZW5jZSgmeGRyLCAmYXJncy0+c2VxX2FyZ3MsICZoZHIpOwotCWVuY29kZV9wdXRmaCgmeGRyLCBhcmdzLT5maCwgJmhkcik7Ci0JZW5jb2RlX2FjY2VzcygmeGRyLCBhcmdzLT5hY2Nlc3MsICZoZHIpOwotCWVuY29kZV9nZXRmYXR0cigmeGRyLCBhcmdzLT5iaXRtYXNrLCAmaGRyKTsKKwllbmNvZGVfY29tcG91bmRfaGRyKHhkciwgcmVxLCAmaGRyKTsKKwllbmNvZGVfc2VxdWVuY2UoeGRyLCAmYXJncy0+c2VxX2FyZ3MsICZoZHIpOworCWVuY29kZV9wdXRmaCh4ZHIsIGFyZ3MtPmZoLCAmaGRyKTsKKwllbmNvZGVfYWNjZXNzKHhkciwgYXJncy0+YWNjZXNzLCAmaGRyKTsKKwllbmNvZGVfZ2V0ZmF0dHIoeGRyLCBhcmdzLT5iaXRtYXNrLCAmaGRyKTsKIAllbmNvZGVfbm9wcygmaGRyKTsKLQlyZXR1cm4gMDsKIH0KIAogLyoKICAqIEVuY29kZSBMT09LVVAgcmVxdWVzdAogICovCi1zdGF0aWMgaW50IG5mczRfeGRyX2VuY19sb29rdXAoc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgY29uc3Qgc3RydWN0IG5mczRfbG9va3VwX2FyZyAqYXJncykKK3N0YXRpYyB2b2lkIG5mczRfeGRyX2VuY19sb29rdXAoc3RydWN0IHJwY19ycXN0ICpyZXEsIHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCisJCQkJY29uc3Qgc3RydWN0IG5mczRfbG9va3VwX2FyZyAqYXJncykKIHsKLQlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CiAJc3RydWN0IGNvbXBvdW5kX2hkciBoZHIgPSB7CiAJCS5taW5vcnZlcnNpb24gPSBuZnM0X3hkcl9taW5vcnZlcnNpb24oJmFyZ3MtPnNlcV9hcmdzKSwKIAl9OwogCi0JeGRyX2luaXRfZW5jb2RlKCZ4ZHIsICZyZXEtPnJxX3NuZF9idWYsIHApOwotCWVuY29kZV9jb21wb3VuZF9oZHIoJnhkciwgcmVxLCAmaGRyKTsKLQllbmNvZGVfc2VxdWVuY2UoJnhkciwgJmFyZ3MtPnNlcV9hcmdzLCAmaGRyKTsKLQllbmNvZGVfcHV0ZmgoJnhkciwgYXJncy0+ZGlyX2ZoLCAmaGRyKTsKLQllbmNvZGVfbG9va3VwKCZ4ZHIsIGFyZ3MtPm5hbWUsICZoZHIpOwotCWVuY29kZV9nZXRmaCgmeGRyLCAmaGRyKTsKLQllbmNvZGVfZ2V0ZmF0dHIoJnhkciwgYXJncy0+Yml0bWFzaywgJmhkcik7CisJZW5jb2RlX2NvbXBvdW5kX2hkcih4ZHIsIHJlcSwgJmhkcik7CisJZW5jb2RlX3NlcXVlbmNlKHhkciwgJmFyZ3MtPnNlcV9hcmdzLCAmaGRyKTsKKwllbmNvZGVfcHV0ZmgoeGRyLCBhcmdzLT5kaXJfZmgsICZoZHIpOworCWVuY29kZV9sb29rdXAoeGRyLCBhcmdzLT5uYW1lLCAmaGRyKTsKKwllbmNvZGVfZ2V0ZmgoeGRyLCAmaGRyKTsKKwllbmNvZGVfZ2V0ZmF0dHIoeGRyLCBhcmdzLT5iaXRtYXNrLCAmaGRyKTsKIAllbmNvZGVfbm9wcygmaGRyKTsKLQlyZXR1cm4gMDsKIH0KIAogLyoKICAqIEVuY29kZSBMT09LVVBfUk9PVCByZXF1ZXN0CiAgKi8KLXN0YXRpYyBpbnQgbmZzNF94ZHJfZW5jX2xvb2t1cF9yb290KHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsIGNvbnN0IHN0cnVjdCBuZnM0X2xvb2t1cF9yb290X2FyZyAqYXJncykKK3N0YXRpYyB2b2lkIG5mczRfeGRyX2VuY19sb29rdXBfcm9vdChzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwKKwkJCQkgICAgIHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCisJCQkJICAgICBjb25zdCBzdHJ1Y3QgbmZzNF9sb29rdXBfcm9vdF9hcmcgKmFyZ3MpCiB7Ci0Jc3RydWN0IHhkcl9zdHJlYW0geGRyOwogCXN0cnVjdCBjb21wb3VuZF9oZHIgaGRyID0gewogCQkubWlub3J2ZXJzaW9uID0gbmZzNF94ZHJfbWlub3J2ZXJzaW9uKCZhcmdzLT5zZXFfYXJncyksCiAJfTsKIAotCXhkcl9pbml0X2VuY29kZSgmeGRyLCAmcmVxLT5ycV9zbmRfYnVmLCBwKTsKLQllbmNvZGVfY29tcG91bmRfaGRyKCZ4ZHIsIHJlcSwgJmhkcik7Ci0JZW5jb2RlX3NlcXVlbmNlKCZ4ZHIsICZhcmdzLT5zZXFfYXJncywgJmhkcik7Ci0JZW5jb2RlX3B1dHJvb3RmaCgmeGRyLCAmaGRyKTsKLQllbmNvZGVfZ2V0ZmgoJnhkciwgJmhkcik7Ci0JZW5jb2RlX2dldGZhdHRyKCZ4ZHIsIGFyZ3MtPmJpdG1hc2ssICZoZHIpOworCWVuY29kZV9jb21wb3VuZF9oZHIoeGRyLCByZXEsICZoZHIpOworCWVuY29kZV9zZXF1ZW5jZSh4ZHIsICZhcmdzLT5zZXFfYXJncywgJmhkcik7CisJZW5jb2RlX3B1dHJvb3RmaCh4ZHIsICZoZHIpOworCWVuY29kZV9nZXRmaCh4ZHIsICZoZHIpOworCWVuY29kZV9nZXRmYXR0cih4ZHIsIGFyZ3MtPmJpdG1hc2ssICZoZHIpOwogCWVuY29kZV9ub3BzKCZoZHIpOwotCXJldHVybiAwOwogfQogCiAvKgogICogRW5jb2RlIFJFTU9WRSByZXF1ZXN0CiAgKi8KLXN0YXRpYyBpbnQgbmZzNF94ZHJfZW5jX3JlbW92ZShzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLCBjb25zdCBzdHJ1Y3QgbmZzX3JlbW92ZWFyZ3MgKmFyZ3MpCitzdGF0aWMgdm9pZCBuZnM0X3hkcl9lbmNfcmVtb3ZlKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAorCQkJCWNvbnN0IHN0cnVjdCBuZnNfcmVtb3ZlYXJncyAqYXJncykKIHsKLQlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CiAJc3RydWN0IGNvbXBvdW5kX2hkciBoZHIgPSB7CiAJCS5taW5vcnZlcnNpb24gPSBuZnM0X3hkcl9taW5vcnZlcnNpb24oJmFyZ3MtPnNlcV9hcmdzKSwKIAl9OwogCi0JeGRyX2luaXRfZW5jb2RlKCZ4ZHIsICZyZXEtPnJxX3NuZF9idWYsIHApOwotCWVuY29kZV9jb21wb3VuZF9oZHIoJnhkciwgcmVxLCAmaGRyKTsKLQllbmNvZGVfc2VxdWVuY2UoJnhkciwgJmFyZ3MtPnNlcV9hcmdzLCAmaGRyKTsKLQllbmNvZGVfcHV0ZmgoJnhkciwgYXJncy0+ZmgsICZoZHIpOwotCWVuY29kZV9yZW1vdmUoJnhkciwgJmFyZ3MtPm5hbWUsICZoZHIpOwotCWVuY29kZV9nZXRmYXR0cigmeGRyLCBhcmdzLT5iaXRtYXNrLCAmaGRyKTsKKwllbmNvZGVfY29tcG91bmRfaGRyKHhkciwgcmVxLCAmaGRyKTsKKwllbmNvZGVfc2VxdWVuY2UoeGRyLCAmYXJncy0+c2VxX2FyZ3MsICZoZHIpOworCWVuY29kZV9wdXRmaCh4ZHIsIGFyZ3MtPmZoLCAmaGRyKTsKKwllbmNvZGVfcmVtb3ZlKHhkciwgJmFyZ3MtPm5hbWUsICZoZHIpOworCWVuY29kZV9nZXRmYXR0cih4ZHIsIGFyZ3MtPmJpdG1hc2ssICZoZHIpOwogCWVuY29kZV9ub3BzKCZoZHIpOwotCXJldHVybiAwOwogfQogCiAvKgogICogRW5jb2RlIFJFTkFNRSByZXF1ZXN0CiAgKi8KLXN0YXRpYyBpbnQgbmZzNF94ZHJfZW5jX3JlbmFtZShzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLCBjb25zdCBzdHJ1Y3QgbmZzX3JlbmFtZWFyZ3MgKmFyZ3MpCitzdGF0aWMgdm9pZCBuZnM0X3hkcl9lbmNfcmVuYW1lKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAorCQkJCWNvbnN0IHN0cnVjdCBuZnNfcmVuYW1lYXJncyAqYXJncykKIHsKLQlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CiAJc3RydWN0IGNvbXBvdW5kX2hkciBoZHIgPSB7CiAJCS5taW5vcnZlcnNpb24gPSBuZnM0X3hkcl9taW5vcnZlcnNpb24oJmFyZ3MtPnNlcV9hcmdzKSwKIAl9OwogCi0JeGRyX2luaXRfZW5jb2RlKCZ4ZHIsICZyZXEtPnJxX3NuZF9idWYsIHApOwotCWVuY29kZV9jb21wb3VuZF9oZHIoJnhkciwgcmVxLCAmaGRyKTsKLQllbmNvZGVfc2VxdWVuY2UoJnhkciwgJmFyZ3MtPnNlcV9hcmdzLCAmaGRyKTsKLQllbmNvZGVfcHV0ZmgoJnhkciwgYXJncy0+b2xkX2RpciwgJmhkcik7Ci0JZW5jb2RlX3NhdmVmaCgmeGRyLCAmaGRyKTsKLQllbmNvZGVfcHV0ZmgoJnhkciwgYXJncy0+bmV3X2RpciwgJmhkcik7Ci0JZW5jb2RlX3JlbmFtZSgmeGRyLCBhcmdzLT5vbGRfbmFtZSwgYXJncy0+bmV3X25hbWUsICZoZHIpOwotCWVuY29kZV9nZXRmYXR0cigmeGRyLCBhcmdzLT5iaXRtYXNrLCAmaGRyKTsKLQllbmNvZGVfcmVzdG9yZWZoKCZ4ZHIsICZoZHIpOwotCWVuY29kZV9nZXRmYXR0cigmeGRyLCBhcmdzLT5iaXRtYXNrLCAmaGRyKTsKKwllbmNvZGVfY29tcG91bmRfaGRyKHhkciwgcmVxLCAmaGRyKTsKKwllbmNvZGVfc2VxdWVuY2UoeGRyLCAmYXJncy0+c2VxX2FyZ3MsICZoZHIpOworCWVuY29kZV9wdXRmaCh4ZHIsIGFyZ3MtPm9sZF9kaXIsICZoZHIpOworCWVuY29kZV9zYXZlZmgoeGRyLCAmaGRyKTsKKwllbmNvZGVfcHV0ZmgoeGRyLCBhcmdzLT5uZXdfZGlyLCAmaGRyKTsKKwllbmNvZGVfcmVuYW1lKHhkciwgYXJncy0+b2xkX25hbWUsIGFyZ3MtPm5ld19uYW1lLCAmaGRyKTsKKwllbmNvZGVfZ2V0ZmF0dHIoeGRyLCBhcmdzLT5iaXRtYXNrLCAmaGRyKTsKKwllbmNvZGVfcmVzdG9yZWZoKHhkciwgJmhkcik7CisJZW5jb2RlX2dldGZhdHRyKHhkciwgYXJncy0+Yml0bWFzaywgJmhkcik7CiAJZW5jb2RlX25vcHMoJmhkcik7Ci0JcmV0dXJuIDA7CiB9CiAKIC8qCiAgKiBFbmNvZGUgTElOSyByZXF1ZXN0CiAgKi8KLXN0YXRpYyBpbnQgbmZzNF94ZHJfZW5jX2xpbmsoc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgY29uc3Qgc3RydWN0IG5mczRfbGlua19hcmcgKmFyZ3MpCitzdGF0aWMgdm9pZCBuZnM0X3hkcl9lbmNfbGluayhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKKwkJCSAgICAgY29uc3Qgc3RydWN0IG5mczRfbGlua19hcmcgKmFyZ3MpCiB7Ci0Jc3RydWN0IHhkcl9zdHJlYW0geGRyOwogCXN0cnVjdCBjb21wb3VuZF9oZHIgaGRyID0gewogCQkubWlub3J2ZXJzaW9uID0gbmZzNF94ZHJfbWlub3J2ZXJzaW9uKCZhcmdzLT5zZXFfYXJncyksCiAJfTsKIAotCXhkcl9pbml0X2VuY29kZSgmeGRyLCAmcmVxLT5ycV9zbmRfYnVmLCBwKTsKLQllbmNvZGVfY29tcG91bmRfaGRyKCZ4ZHIsIHJlcSwgJmhkcik7Ci0JZW5jb2RlX3NlcXVlbmNlKCZ4ZHIsICZhcmdzLT5zZXFfYXJncywgJmhkcik7Ci0JZW5jb2RlX3B1dGZoKCZ4ZHIsIGFyZ3MtPmZoLCAmaGRyKTsKLQllbmNvZGVfc2F2ZWZoKCZ4ZHIsICZoZHIpOwotCWVuY29kZV9wdXRmaCgmeGRyLCBhcmdzLT5kaXJfZmgsICZoZHIpOwotCWVuY29kZV9saW5rKCZ4ZHIsIGFyZ3MtPm5hbWUsICZoZHIpOwotCWVuY29kZV9nZXRmYXR0cigmeGRyLCBhcmdzLT5iaXRtYXNrLCAmaGRyKTsKLQllbmNvZGVfcmVzdG9yZWZoKCZ4ZHIsICZoZHIpOwotCWVuY29kZV9nZXRmYXR0cigmeGRyLCBhcmdzLT5iaXRtYXNrLCAmaGRyKTsKKwllbmNvZGVfY29tcG91bmRfaGRyKHhkciwgcmVxLCAmaGRyKTsKKwllbmNvZGVfc2VxdWVuY2UoeGRyLCAmYXJncy0+c2VxX2FyZ3MsICZoZHIpOworCWVuY29kZV9wdXRmaCh4ZHIsIGFyZ3MtPmZoLCAmaGRyKTsKKwllbmNvZGVfc2F2ZWZoKHhkciwgJmhkcik7CisJZW5jb2RlX3B1dGZoKHhkciwgYXJncy0+ZGlyX2ZoLCAmaGRyKTsKKwllbmNvZGVfbGluayh4ZHIsIGFyZ3MtPm5hbWUsICZoZHIpOworCWVuY29kZV9nZXRmYXR0cih4ZHIsIGFyZ3MtPmJpdG1hc2ssICZoZHIpOworCWVuY29kZV9yZXN0b3JlZmgoeGRyLCAmaGRyKTsKKwllbmNvZGVfZ2V0ZmF0dHIoeGRyLCBhcmdzLT5iaXRtYXNrLCAmaGRyKTsKIAllbmNvZGVfbm9wcygmaGRyKTsKLQlyZXR1cm4gMDsKIH0KIAogLyoKICAqIEVuY29kZSBDUkVBVEUgcmVxdWVzdAogICovCi1zdGF0aWMgaW50IG5mczRfeGRyX2VuY19jcmVhdGUoc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgY29uc3Qgc3RydWN0IG5mczRfY3JlYXRlX2FyZyAqYXJncykKK3N0YXRpYyB2b2lkIG5mczRfeGRyX2VuY19jcmVhdGUoc3RydWN0IHJwY19ycXN0ICpyZXEsIHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCisJCQkJY29uc3Qgc3RydWN0IG5mczRfY3JlYXRlX2FyZyAqYXJncykKIHsKLQlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CiAJc3RydWN0IGNvbXBvdW5kX2hkciBoZHIgPSB7CiAJCS5taW5vcnZlcnNpb24gPSBuZnM0X3hkcl9taW5vcnZlcnNpb24oJmFyZ3MtPnNlcV9hcmdzKSwKIAl9OwogCi0JeGRyX2luaXRfZW5jb2RlKCZ4ZHIsICZyZXEtPnJxX3NuZF9idWYsIHApOwotCWVuY29kZV9jb21wb3VuZF9oZHIoJnhkciwgcmVxLCAmaGRyKTsKLQllbmNvZGVfc2VxdWVuY2UoJnhkciwgJmFyZ3MtPnNlcV9hcmdzLCAmaGRyKTsKLQllbmNvZGVfcHV0ZmgoJnhkciwgYXJncy0+ZGlyX2ZoLCAmaGRyKTsKLQllbmNvZGVfc2F2ZWZoKCZ4ZHIsICZoZHIpOwotCWVuY29kZV9jcmVhdGUoJnhkciwgYXJncywgJmhkcik7Ci0JZW5jb2RlX2dldGZoKCZ4ZHIsICZoZHIpOwotCWVuY29kZV9nZXRmYXR0cigmeGRyLCBhcmdzLT5iaXRtYXNrLCAmaGRyKTsKLQllbmNvZGVfcmVzdG9yZWZoKCZ4ZHIsICZoZHIpOwotCWVuY29kZV9nZXRmYXR0cigmeGRyLCBhcmdzLT5iaXRtYXNrLCAmaGRyKTsKKwllbmNvZGVfY29tcG91bmRfaGRyKHhkciwgcmVxLCAmaGRyKTsKKwllbmNvZGVfc2VxdWVuY2UoeGRyLCAmYXJncy0+c2VxX2FyZ3MsICZoZHIpOworCWVuY29kZV9wdXRmaCh4ZHIsIGFyZ3MtPmRpcl9maCwgJmhkcik7CisJZW5jb2RlX3NhdmVmaCh4ZHIsICZoZHIpOworCWVuY29kZV9jcmVhdGUoeGRyLCBhcmdzLCAmaGRyKTsKKwllbmNvZGVfZ2V0ZmgoeGRyLCAmaGRyKTsKKwllbmNvZGVfZ2V0ZmF0dHIoeGRyLCBhcmdzLT5iaXRtYXNrLCAmaGRyKTsKKwllbmNvZGVfcmVzdG9yZWZoKHhkciwgJmhkcik7CisJZW5jb2RlX2dldGZhdHRyKHhkciwgYXJncy0+Yml0bWFzaywgJmhkcik7CiAJZW5jb2RlX25vcHMoJmhkcik7Ci0JcmV0dXJuIDA7CiB9CiAKIC8qCiAgKiBFbmNvZGUgU1lNTElOSyByZXF1ZXN0CiAgKi8KLXN0YXRpYyBpbnQgbmZzNF94ZHJfZW5jX3N5bWxpbmsoc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgY29uc3Qgc3RydWN0IG5mczRfY3JlYXRlX2FyZyAqYXJncykKK3N0YXRpYyB2b2lkIG5mczRfeGRyX2VuY19zeW1saW5rKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAorCQkJCSBjb25zdCBzdHJ1Y3QgbmZzNF9jcmVhdGVfYXJnICphcmdzKQogewotCXJldHVybiBuZnM0X3hkcl9lbmNfY3JlYXRlKHJlcSwgcCwgYXJncyk7CisJbmZzNF94ZHJfZW5jX2NyZWF0ZShyZXEsIHhkciwgYXJncyk7CiB9CiAKIC8qCiAgKiBFbmNvZGUgR0VUQVRUUiByZXF1ZXN0CiAgKi8KLXN0YXRpYyBpbnQgbmZzNF94ZHJfZW5jX2dldGF0dHIoc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgY29uc3Qgc3RydWN0IG5mczRfZ2V0YXR0cl9hcmcgKmFyZ3MpCitzdGF0aWMgdm9pZCBuZnM0X3hkcl9lbmNfZ2V0YXR0cihzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKKwkJCQkgY29uc3Qgc3RydWN0IG5mczRfZ2V0YXR0cl9hcmcgKmFyZ3MpCiB7Ci0Jc3RydWN0IHhkcl9zdHJlYW0geGRyOwogCXN0cnVjdCBjb21wb3VuZF9oZHIgaGRyID0gewogCQkubWlub3J2ZXJzaW9uID0gbmZzNF94ZHJfbWlub3J2ZXJzaW9uKCZhcmdzLT5zZXFfYXJncyksCiAJfTsKIAotCXhkcl9pbml0X2VuY29kZSgmeGRyLCAmcmVxLT5ycV9zbmRfYnVmLCBwKTsKLQllbmNvZGVfY29tcG91bmRfaGRyKCZ4ZHIsIHJlcSwgJmhkcik7Ci0JZW5jb2RlX3NlcXVlbmNlKCZ4ZHIsICZhcmdzLT5zZXFfYXJncywgJmhkcik7Ci0JZW5jb2RlX3B1dGZoKCZ4ZHIsIGFyZ3MtPmZoLCAmaGRyKTsKLQllbmNvZGVfZ2V0ZmF0dHIoJnhkciwgYXJncy0+Yml0bWFzaywgJmhkcik7CisJZW5jb2RlX2NvbXBvdW5kX2hkcih4ZHIsIHJlcSwgJmhkcik7CisJZW5jb2RlX3NlcXVlbmNlKHhkciwgJmFyZ3MtPnNlcV9hcmdzLCAmaGRyKTsKKwllbmNvZGVfcHV0ZmgoeGRyLCBhcmdzLT5maCwgJmhkcik7CisJZW5jb2RlX2dldGZhdHRyKHhkciwgYXJncy0+Yml0bWFzaywgJmhkcik7CiAJZW5jb2RlX25vcHMoJmhkcik7Ci0JcmV0dXJuIDA7CiB9CiAKIC8qCiAgKiBFbmNvZGUgYSBDTE9TRSByZXF1ZXN0CiAgKi8KLXN0YXRpYyBpbnQgbmZzNF94ZHJfZW5jX2Nsb3NlKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsIHN0cnVjdCBuZnNfY2xvc2VhcmdzICphcmdzKQorc3RhdGljIHZvaWQgbmZzNF94ZHJfZW5jX2Nsb3NlKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAorCQkJICAgICAgIHN0cnVjdCBuZnNfY2xvc2VhcmdzICphcmdzKQogewotCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKIAlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkciA9IHsKIAkJLm1pbm9ydmVyc2lvbiA9IG5mczRfeGRyX21pbm9ydmVyc2lvbigmYXJncy0+c2VxX2FyZ3MpLAogCX07CiAKLQl4ZHJfaW5pdF9lbmNvZGUoJnhkciwgJnJlcS0+cnFfc25kX2J1ZiwgcCk7Ci0JZW5jb2RlX2NvbXBvdW5kX2hkcigmeGRyLCByZXEsICZoZHIpOwotCWVuY29kZV9zZXF1ZW5jZSgmeGRyLCAmYXJncy0+c2VxX2FyZ3MsICZoZHIpOwotCWVuY29kZV9wdXRmaCgmeGRyLCBhcmdzLT5maCwgJmhkcik7Ci0JZW5jb2RlX2Nsb3NlKCZ4ZHIsIGFyZ3MsICZoZHIpOwotCWVuY29kZV9nZXRmYXR0cigmeGRyLCBhcmdzLT5iaXRtYXNrLCAmaGRyKTsKKwllbmNvZGVfY29tcG91bmRfaGRyKHhkciwgcmVxLCAmaGRyKTsKKwllbmNvZGVfc2VxdWVuY2UoeGRyLCAmYXJncy0+c2VxX2FyZ3MsICZoZHIpOworCWVuY29kZV9wdXRmaCh4ZHIsIGFyZ3MtPmZoLCAmaGRyKTsKKwllbmNvZGVfY2xvc2UoeGRyLCBhcmdzLCAmaGRyKTsKKwllbmNvZGVfZ2V0ZmF0dHIoeGRyLCBhcmdzLT5iaXRtYXNrLCAmaGRyKTsKIAllbmNvZGVfbm9wcygmaGRyKTsKLQlyZXR1cm4gMDsKIH0KIAogLyoKICAqIEVuY29kZSBhbiBPUEVOIHJlcXVlc3QKICAqLwotc3RhdGljIGludCBuZnM0X3hkcl9lbmNfb3BlbihzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLCBzdHJ1Y3QgbmZzX29wZW5hcmdzICphcmdzKQorc3RhdGljIHZvaWQgbmZzNF94ZHJfZW5jX29wZW4oc3RydWN0IHJwY19ycXN0ICpyZXEsIHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCisJCQkgICAgICBzdHJ1Y3QgbmZzX29wZW5hcmdzICphcmdzKQogewotCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKIAlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkciA9IHsKIAkJLm1pbm9ydmVyc2lvbiA9IG5mczRfeGRyX21pbm9ydmVyc2lvbigmYXJncy0+c2VxX2FyZ3MpLAogCX07CiAKLQl4ZHJfaW5pdF9lbmNvZGUoJnhkciwgJnJlcS0+cnFfc25kX2J1ZiwgcCk7Ci0JZW5jb2RlX2NvbXBvdW5kX2hkcigmeGRyLCByZXEsICZoZHIpOwotCWVuY29kZV9zZXF1ZW5jZSgmeGRyLCAmYXJncy0+c2VxX2FyZ3MsICZoZHIpOwotCWVuY29kZV9wdXRmaCgmeGRyLCBhcmdzLT5maCwgJmhkcik7Ci0JZW5jb2RlX3NhdmVmaCgmeGRyLCAmaGRyKTsKLQllbmNvZGVfb3BlbigmeGRyLCBhcmdzLCAmaGRyKTsKLQllbmNvZGVfZ2V0ZmgoJnhkciwgJmhkcik7Ci0JZW5jb2RlX2dldGZhdHRyKCZ4ZHIsIGFyZ3MtPmJpdG1hc2ssICZoZHIpOwotCWVuY29kZV9yZXN0b3JlZmgoJnhkciwgJmhkcik7Ci0JZW5jb2RlX2dldGZhdHRyKCZ4ZHIsIGFyZ3MtPmJpdG1hc2ssICZoZHIpOworCWVuY29kZV9jb21wb3VuZF9oZHIoeGRyLCByZXEsICZoZHIpOworCWVuY29kZV9zZXF1ZW5jZSh4ZHIsICZhcmdzLT5zZXFfYXJncywgJmhkcik7CisJZW5jb2RlX3B1dGZoKHhkciwgYXJncy0+ZmgsICZoZHIpOworCWVuY29kZV9zYXZlZmgoeGRyLCAmaGRyKTsKKwllbmNvZGVfb3Blbih4ZHIsIGFyZ3MsICZoZHIpOworCWVuY29kZV9nZXRmaCh4ZHIsICZoZHIpOworCWVuY29kZV9nZXRmYXR0cih4ZHIsIGFyZ3MtPmJpdG1hc2ssICZoZHIpOworCWVuY29kZV9yZXN0b3JlZmgoeGRyLCAmaGRyKTsKKwllbmNvZGVfZ2V0ZmF0dHIoeGRyLCBhcmdzLT5iaXRtYXNrLCAmaGRyKTsKIAllbmNvZGVfbm9wcygmaGRyKTsKLQlyZXR1cm4gMDsKIH0KIAogLyoKICAqIEVuY29kZSBhbiBPUEVOX0NPTkZJUk0gcmVxdWVzdAogICovCi1zdGF0aWMgaW50IG5mczRfeGRyX2VuY19vcGVuX2NvbmZpcm0oc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgc3RydWN0IG5mc19vcGVuX2NvbmZpcm1hcmdzICphcmdzKQorc3RhdGljIHZvaWQgbmZzNF94ZHJfZW5jX29wZW5fY29uZmlybShzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwKKwkJCQkgICAgICBzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAorCQkJCSAgICAgIHN0cnVjdCBuZnNfb3Blbl9jb25maXJtYXJncyAqYXJncykKIHsKLQlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CiAJc3RydWN0IGNvbXBvdW5kX2hkciBoZHIgPSB7CiAJCS5ub3BzICAgPSAwLAogCX07CiAKLQl4ZHJfaW5pdF9lbmNvZGUoJnhkciwgJnJlcS0+cnFfc25kX2J1ZiwgcCk7Ci0JZW5jb2RlX2NvbXBvdW5kX2hkcigmeGRyLCByZXEsICZoZHIpOwotCWVuY29kZV9wdXRmaCgmeGRyLCBhcmdzLT5maCwgJmhkcik7Ci0JZW5jb2RlX29wZW5fY29uZmlybSgmeGRyLCBhcmdzLCAmaGRyKTsKKwllbmNvZGVfY29tcG91bmRfaGRyKHhkciwgcmVxLCAmaGRyKTsKKwllbmNvZGVfcHV0ZmgoeGRyLCBhcmdzLT5maCwgJmhkcik7CisJZW5jb2RlX29wZW5fY29uZmlybSh4ZHIsIGFyZ3MsICZoZHIpOwogCWVuY29kZV9ub3BzKCZoZHIpOwotCXJldHVybiAwOwogfQogCiAvKgogICogRW5jb2RlIGFuIE9QRU4gcmVxdWVzdCB3aXRoIG5vIGF0dHJpYnV0ZXMuCiAgKi8KLXN0YXRpYyBpbnQgbmZzNF94ZHJfZW5jX29wZW5fbm9hdHRyKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsIHN0cnVjdCBuZnNfb3BlbmFyZ3MgKmFyZ3MpCitzdGF0aWMgdm9pZCBuZnM0X3hkcl9lbmNfb3Blbl9ub2F0dHIoc3RydWN0IHJwY19ycXN0ICpyZXEsCisJCQkJICAgICBzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAorCQkJCSAgICAgc3RydWN0IG5mc19vcGVuYXJncyAqYXJncykKIHsKLQlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CiAJc3RydWN0IGNvbXBvdW5kX2hkciBoZHIgPSB7CiAJCS5taW5vcnZlcnNpb24gPSBuZnM0X3hkcl9taW5vcnZlcnNpb24oJmFyZ3MtPnNlcV9hcmdzKSwKIAl9OwogCi0JeGRyX2luaXRfZW5jb2RlKCZ4ZHIsICZyZXEtPnJxX3NuZF9idWYsIHApOwotCWVuY29kZV9jb21wb3VuZF9oZHIoJnhkciwgcmVxLCAmaGRyKTsKLQllbmNvZGVfc2VxdWVuY2UoJnhkciwgJmFyZ3MtPnNlcV9hcmdzLCAmaGRyKTsKLQllbmNvZGVfcHV0ZmgoJnhkciwgYXJncy0+ZmgsICZoZHIpOwotCWVuY29kZV9vcGVuKCZ4ZHIsIGFyZ3MsICZoZHIpOwotCWVuY29kZV9nZXRmYXR0cigmeGRyLCBhcmdzLT5iaXRtYXNrLCAmaGRyKTsKKwllbmNvZGVfY29tcG91bmRfaGRyKHhkciwgcmVxLCAmaGRyKTsKKwllbmNvZGVfc2VxdWVuY2UoeGRyLCAmYXJncy0+c2VxX2FyZ3MsICZoZHIpOworCWVuY29kZV9wdXRmaCh4ZHIsIGFyZ3MtPmZoLCAmaGRyKTsKKwllbmNvZGVfb3Blbih4ZHIsIGFyZ3MsICZoZHIpOworCWVuY29kZV9nZXRmYXR0cih4ZHIsIGFyZ3MtPmJpdG1hc2ssICZoZHIpOwogCWVuY29kZV9ub3BzKCZoZHIpOwotCXJldHVybiAwOwogfQogCiAvKgogICogRW5jb2RlIGFuIE9QRU5fRE9XTkdSQURFIHJlcXVlc3QKICAqLwotc3RhdGljIGludCBuZnM0X3hkcl9lbmNfb3Blbl9kb3duZ3JhZGUoc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgc3RydWN0IG5mc19jbG9zZWFyZ3MgKmFyZ3MpCitzdGF0aWMgdm9pZCBuZnM0X3hkcl9lbmNfb3Blbl9kb3duZ3JhZGUoc3RydWN0IHJwY19ycXN0ICpyZXEsCisJCQkJCXN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCisJCQkJCXN0cnVjdCBuZnNfY2xvc2VhcmdzICphcmdzKQogewotCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKIAlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkciA9IHsKIAkJLm1pbm9ydmVyc2lvbiA9IG5mczRfeGRyX21pbm9ydmVyc2lvbigmYXJncy0+c2VxX2FyZ3MpLAogCX07CiAKLQl4ZHJfaW5pdF9lbmNvZGUoJnhkciwgJnJlcS0+cnFfc25kX2J1ZiwgcCk7Ci0JZW5jb2RlX2NvbXBvdW5kX2hkcigmeGRyLCByZXEsICZoZHIpOwotCWVuY29kZV9zZXF1ZW5jZSgmeGRyLCAmYXJncy0+c2VxX2FyZ3MsICZoZHIpOwotCWVuY29kZV9wdXRmaCgmeGRyLCBhcmdzLT5maCwgJmhkcik7Ci0JZW5jb2RlX29wZW5fZG93bmdyYWRlKCZ4ZHIsIGFyZ3MsICZoZHIpOwotCWVuY29kZV9nZXRmYXR0cigmeGRyLCBhcmdzLT5iaXRtYXNrLCAmaGRyKTsKKwllbmNvZGVfY29tcG91bmRfaGRyKHhkciwgcmVxLCAmaGRyKTsKKwllbmNvZGVfc2VxdWVuY2UoeGRyLCAmYXJncy0+c2VxX2FyZ3MsICZoZHIpOworCWVuY29kZV9wdXRmaCh4ZHIsIGFyZ3MtPmZoLCAmaGRyKTsKKwllbmNvZGVfb3Blbl9kb3duZ3JhZGUoeGRyLCBhcmdzLCAmaGRyKTsKKwllbmNvZGVfZ2V0ZmF0dHIoeGRyLCBhcmdzLT5iaXRtYXNrLCAmaGRyKTsKIAllbmNvZGVfbm9wcygmaGRyKTsKLQlyZXR1cm4gMDsKIH0KIAogLyoKICAqIEVuY29kZSBhIExPQ0sgcmVxdWVzdAogICovCi1zdGF0aWMgaW50IG5mczRfeGRyX2VuY19sb2NrKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsIHN0cnVjdCBuZnNfbG9ja19hcmdzICphcmdzKQorc3RhdGljIHZvaWQgbmZzNF94ZHJfZW5jX2xvY2soc3RydWN0IHJwY19ycXN0ICpyZXEsIHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCisJCQkgICAgICBzdHJ1Y3QgbmZzX2xvY2tfYXJncyAqYXJncykKIHsKLQlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CiAJc3RydWN0IGNvbXBvdW5kX2hkciBoZHIgPSB7CiAJCS5taW5vcnZlcnNpb24gPSBuZnM0X3hkcl9taW5vcnZlcnNpb24oJmFyZ3MtPnNlcV9hcmdzKSwKIAl9OwogCi0JeGRyX2luaXRfZW5jb2RlKCZ4ZHIsICZyZXEtPnJxX3NuZF9idWYsIHApOwotCWVuY29kZV9jb21wb3VuZF9oZHIoJnhkciwgcmVxLCAmaGRyKTsKLQllbmNvZGVfc2VxdWVuY2UoJnhkciwgJmFyZ3MtPnNlcV9hcmdzLCAmaGRyKTsKLQllbmNvZGVfcHV0ZmgoJnhkciwgYXJncy0+ZmgsICZoZHIpOwotCWVuY29kZV9sb2NrKCZ4ZHIsIGFyZ3MsICZoZHIpOworCWVuY29kZV9jb21wb3VuZF9oZHIoeGRyLCByZXEsICZoZHIpOworCWVuY29kZV9zZXF1ZW5jZSh4ZHIsICZhcmdzLT5zZXFfYXJncywgJmhkcik7CisJZW5jb2RlX3B1dGZoKHhkciwgYXJncy0+ZmgsICZoZHIpOworCWVuY29kZV9sb2NrKHhkciwgYXJncywgJmhkcik7CiAJZW5jb2RlX25vcHMoJmhkcik7Ci0JcmV0dXJuIDA7CiB9CiAKIC8qCiAgKiBFbmNvZGUgYSBMT0NLVCByZXF1ZXN0CiAgKi8KLXN0YXRpYyBpbnQgbmZzNF94ZHJfZW5jX2xvY2t0KHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsIHN0cnVjdCBuZnNfbG9ja3RfYXJncyAqYXJncykKK3N0YXRpYyB2b2lkIG5mczRfeGRyX2VuY19sb2NrdChzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKKwkJCSAgICAgICBzdHJ1Y3QgbmZzX2xvY2t0X2FyZ3MgKmFyZ3MpCiB7Ci0Jc3RydWN0IHhkcl9zdHJlYW0geGRyOwogCXN0cnVjdCBjb21wb3VuZF9oZHIgaGRyID0gewogCQkubWlub3J2ZXJzaW9uID0gbmZzNF94ZHJfbWlub3J2ZXJzaW9uKCZhcmdzLT5zZXFfYXJncyksCiAJfTsKIAotCXhkcl9pbml0X2VuY29kZSgmeGRyLCAmcmVxLT5ycV9zbmRfYnVmLCBwKTsKLQllbmNvZGVfY29tcG91bmRfaGRyKCZ4ZHIsIHJlcSwgJmhkcik7Ci0JZW5jb2RlX3NlcXVlbmNlKCZ4ZHIsICZhcmdzLT5zZXFfYXJncywgJmhkcik7Ci0JZW5jb2RlX3B1dGZoKCZ4ZHIsIGFyZ3MtPmZoLCAmaGRyKTsKLQllbmNvZGVfbG9ja3QoJnhkciwgYXJncywgJmhkcik7CisJZW5jb2RlX2NvbXBvdW5kX2hkcih4ZHIsIHJlcSwgJmhkcik7CisJZW5jb2RlX3NlcXVlbmNlKHhkciwgJmFyZ3MtPnNlcV9hcmdzLCAmaGRyKTsKKwllbmNvZGVfcHV0ZmgoeGRyLCBhcmdzLT5maCwgJmhkcik7CisJZW5jb2RlX2xvY2t0KHhkciwgYXJncywgJmhkcik7CiAJZW5jb2RlX25vcHMoJmhkcik7Ci0JcmV0dXJuIDA7CiB9CiAKIC8qCiAgKiBFbmNvZGUgYSBMT0NLVSByZXF1ZXN0CiAgKi8KLXN0YXRpYyBpbnQgbmZzNF94ZHJfZW5jX2xvY2t1KHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsIHN0cnVjdCBuZnNfbG9ja3VfYXJncyAqYXJncykKK3N0YXRpYyB2b2lkIG5mczRfeGRyX2VuY19sb2NrdShzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKKwkJCSAgICAgICBzdHJ1Y3QgbmZzX2xvY2t1X2FyZ3MgKmFyZ3MpCiB7Ci0Jc3RydWN0IHhkcl9zdHJlYW0geGRyOwogCXN0cnVjdCBjb21wb3VuZF9oZHIgaGRyID0gewogCQkubWlub3J2ZXJzaW9uID0gbmZzNF94ZHJfbWlub3J2ZXJzaW9uKCZhcmdzLT5zZXFfYXJncyksCiAJfTsKIAotCXhkcl9pbml0X2VuY29kZSgmeGRyLCAmcmVxLT5ycV9zbmRfYnVmLCBwKTsKLQllbmNvZGVfY29tcG91bmRfaGRyKCZ4ZHIsIHJlcSwgJmhkcik7Ci0JZW5jb2RlX3NlcXVlbmNlKCZ4ZHIsICZhcmdzLT5zZXFfYXJncywgJmhkcik7Ci0JZW5jb2RlX3B1dGZoKCZ4ZHIsIGFyZ3MtPmZoLCAmaGRyKTsKLQllbmNvZGVfbG9ja3UoJnhkciwgYXJncywgJmhkcik7CisJZW5jb2RlX2NvbXBvdW5kX2hkcih4ZHIsIHJlcSwgJmhkcik7CisJZW5jb2RlX3NlcXVlbmNlKHhkciwgJmFyZ3MtPnNlcV9hcmdzLCAmaGRyKTsKKwllbmNvZGVfcHV0ZmgoeGRyLCBhcmdzLT5maCwgJmhkcik7CisJZW5jb2RlX2xvY2t1KHhkciwgYXJncywgJmhkcik7CiAJZW5jb2RlX25vcHMoJmhkcik7Ci0JcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgbmZzNF94ZHJfZW5jX3JlbGVhc2VfbG9ja293bmVyKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsIHN0cnVjdCBuZnNfcmVsZWFzZV9sb2Nrb3duZXJfYXJncyAqYXJncykKK3N0YXRpYyB2b2lkIG5mczRfeGRyX2VuY19yZWxlYXNlX2xvY2tvd25lcihzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwKKwkJCQkJICAgc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKKwkJCQkJc3RydWN0IG5mc19yZWxlYXNlX2xvY2tvd25lcl9hcmdzICphcmdzKQogewotCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKIAlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkciA9IHsKIAkJLm1pbm9ydmVyc2lvbiA9IDAsCiAJfTsKIAotCXhkcl9pbml0X2VuY29kZSgmeGRyLCAmcmVxLT5ycV9zbmRfYnVmLCBwKTsKLQllbmNvZGVfY29tcG91bmRfaGRyKCZ4ZHIsIHJlcSwgJmhkcik7Ci0JZW5jb2RlX3JlbGVhc2VfbG9ja293bmVyKCZ4ZHIsICZhcmdzLT5sb2NrX293bmVyLCAmaGRyKTsKKwllbmNvZGVfY29tcG91bmRfaGRyKHhkciwgcmVxLCAmaGRyKTsKKwllbmNvZGVfcmVsZWFzZV9sb2Nrb3duZXIoeGRyLCAmYXJncy0+bG9ja19vd25lciwgJmhkcik7CiAJZW5jb2RlX25vcHMoJmhkcik7Ci0JcmV0dXJuIDA7CiB9CiAKIC8qCiAgKiBFbmNvZGUgYSBSRUFETElOSyByZXF1ZXN0CiAgKi8KLXN0YXRpYyBpbnQgbmZzNF94ZHJfZW5jX3JlYWRsaW5rKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsIGNvbnN0IHN0cnVjdCBuZnM0X3JlYWRsaW5rICphcmdzKQorc3RhdGljIHZvaWQgbmZzNF94ZHJfZW5jX3JlYWRsaW5rKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAorCQkJCSAgY29uc3Qgc3RydWN0IG5mczRfcmVhZGxpbmsgKmFyZ3MpCiB7Ci0Jc3RydWN0IHhkcl9zdHJlYW0geGRyOwogCXN0cnVjdCBjb21wb3VuZF9oZHIgaGRyID0gewogCQkubWlub3J2ZXJzaW9uID0gbmZzNF94ZHJfbWlub3J2ZXJzaW9uKCZhcmdzLT5zZXFfYXJncyksCiAJfTsKIAotCXhkcl9pbml0X2VuY29kZSgmeGRyLCAmcmVxLT5ycV9zbmRfYnVmLCBwKTsKLQllbmNvZGVfY29tcG91bmRfaGRyKCZ4ZHIsIHJlcSwgJmhkcik7Ci0JZW5jb2RlX3NlcXVlbmNlKCZ4ZHIsICZhcmdzLT5zZXFfYXJncywgJmhkcik7Ci0JZW5jb2RlX3B1dGZoKCZ4ZHIsIGFyZ3MtPmZoLCAmaGRyKTsKLQllbmNvZGVfcmVhZGxpbmsoJnhkciwgYXJncywgcmVxLCAmaGRyKTsKKwllbmNvZGVfY29tcG91bmRfaGRyKHhkciwgcmVxLCAmaGRyKTsKKwllbmNvZGVfc2VxdWVuY2UoeGRyLCAmYXJncy0+c2VxX2FyZ3MsICZoZHIpOworCWVuY29kZV9wdXRmaCh4ZHIsIGFyZ3MtPmZoLCAmaGRyKTsKKwllbmNvZGVfcmVhZGxpbmsoeGRyLCBhcmdzLCByZXEsICZoZHIpOwogCiAJeGRyX2lubGluZV9wYWdlcygmcmVxLT5ycV9yY3ZfYnVmLCBoZHIucmVwbGVuIDw8IDIsIGFyZ3MtPnBhZ2VzLAogCQkJYXJncy0+cGdiYXNlLCBhcmdzLT5wZ2xlbik7CiAJZW5jb2RlX25vcHMoJmhkcik7Ci0JcmV0dXJuIDA7CiB9CiAKIC8qCiAgKiBFbmNvZGUgYSBSRUFERElSIHJlcXVlc3QKICAqLwotc3RhdGljIGludCBuZnM0X3hkcl9lbmNfcmVhZGRpcihzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLCBjb25zdCBzdHJ1Y3QgbmZzNF9yZWFkZGlyX2FyZyAqYXJncykKK3N0YXRpYyB2b2lkIG5mczRfeGRyX2VuY19yZWFkZGlyKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAorCQkJCSBjb25zdCBzdHJ1Y3QgbmZzNF9yZWFkZGlyX2FyZyAqYXJncykKIHsKLQlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CiAJc3RydWN0IGNvbXBvdW5kX2hkciBoZHIgPSB7CiAJCS5taW5vcnZlcnNpb24gPSBuZnM0X3hkcl9taW5vcnZlcnNpb24oJmFyZ3MtPnNlcV9hcmdzKSwKIAl9OwogCi0JeGRyX2luaXRfZW5jb2RlKCZ4ZHIsICZyZXEtPnJxX3NuZF9idWYsIHApOwotCWVuY29kZV9jb21wb3VuZF9oZHIoJnhkciwgcmVxLCAmaGRyKTsKLQllbmNvZGVfc2VxdWVuY2UoJnhkciwgJmFyZ3MtPnNlcV9hcmdzLCAmaGRyKTsKLQllbmNvZGVfcHV0ZmgoJnhkciwgYXJncy0+ZmgsICZoZHIpOwotCWVuY29kZV9yZWFkZGlyKCZ4ZHIsIGFyZ3MsIHJlcSwgJmhkcik7CisJZW5jb2RlX2NvbXBvdW5kX2hkcih4ZHIsIHJlcSwgJmhkcik7CisJZW5jb2RlX3NlcXVlbmNlKHhkciwgJmFyZ3MtPnNlcV9hcmdzLCAmaGRyKTsKKwllbmNvZGVfcHV0ZmgoeGRyLCBhcmdzLT5maCwgJmhkcik7CisJZW5jb2RlX3JlYWRkaXIoeGRyLCBhcmdzLCByZXEsICZoZHIpOwogCiAJeGRyX2lubGluZV9wYWdlcygmcmVxLT5ycV9yY3ZfYnVmLCBoZHIucmVwbGVuIDw8IDIsIGFyZ3MtPnBhZ2VzLAogCQkJIGFyZ3MtPnBnYmFzZSwgYXJncy0+Y291bnQpOwpAQCAtMjIyNyw0MjggKzIxOTMsMzg3IEBACiAJCQlfX2Z1bmNfXywgaGRyLnJlcGxlbiA8PCAyLCBhcmdzLT5wYWdlcywKIAkJCWFyZ3MtPnBnYmFzZSwgYXJncy0+Y291bnQpOwogCWVuY29kZV9ub3BzKCZoZHIpOwotCXJldHVybiAwOwogfQogCiAvKgogICogRW5jb2RlIGEgUkVBRCByZXF1ZXN0CiAgKi8KLXN0YXRpYyBpbnQgbmZzNF94ZHJfZW5jX3JlYWQoc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgc3RydWN0IG5mc19yZWFkYXJncyAqYXJncykKK3N0YXRpYyB2b2lkIG5mczRfeGRyX2VuY19yZWFkKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAorCQkJICAgICAgc3RydWN0IG5mc19yZWFkYXJncyAqYXJncykKIHsKLQlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CiAJc3RydWN0IGNvbXBvdW5kX2hkciBoZHIgPSB7CiAJCS5taW5vcnZlcnNpb24gPSBuZnM0X3hkcl9taW5vcnZlcnNpb24oJmFyZ3MtPnNlcV9hcmdzKSwKIAl9OwogCi0JeGRyX2luaXRfZW5jb2RlKCZ4ZHIsICZyZXEtPnJxX3NuZF9idWYsIHApOwotCWVuY29kZV9jb21wb3VuZF9oZHIoJnhkciwgcmVxLCAmaGRyKTsKLQllbmNvZGVfc2VxdWVuY2UoJnhkciwgJmFyZ3MtPnNlcV9hcmdzLCAmaGRyKTsKLQllbmNvZGVfcHV0ZmgoJnhkciwgYXJncy0+ZmgsICZoZHIpOwotCWVuY29kZV9yZWFkKCZ4ZHIsIGFyZ3MsICZoZHIpOworCWVuY29kZV9jb21wb3VuZF9oZHIoeGRyLCByZXEsICZoZHIpOworCWVuY29kZV9zZXF1ZW5jZSh4ZHIsICZhcmdzLT5zZXFfYXJncywgJmhkcik7CisJZW5jb2RlX3B1dGZoKHhkciwgYXJncy0+ZmgsICZoZHIpOworCWVuY29kZV9yZWFkKHhkciwgYXJncywgJmhkcik7CiAKIAl4ZHJfaW5saW5lX3BhZ2VzKCZyZXEtPnJxX3Jjdl9idWYsIGhkci5yZXBsZW4gPDwgMiwKIAkJCSBhcmdzLT5wYWdlcywgYXJncy0+cGdiYXNlLCBhcmdzLT5jb3VudCk7CiAJcmVxLT5ycV9yY3ZfYnVmLmZsYWdzIHw9IFhEUkJVRl9SRUFEOwogCWVuY29kZV9ub3BzKCZoZHIpOwotCXJldHVybiAwOwogfQogCiAvKgogICogRW5jb2RlIGFuIFNFVEFUVFIgcmVxdWVzdAogICovCi1zdGF0aWMgaW50IG5mczRfeGRyX2VuY19zZXRhdHRyKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsIHN0cnVjdCBuZnNfc2V0YXR0cmFyZ3MgKmFyZ3MpCitzdGF0aWMgdm9pZCBuZnM0X3hkcl9lbmNfc2V0YXR0cihzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKKwkJCQkgc3RydWN0IG5mc19zZXRhdHRyYXJncyAqYXJncykKIHsKLQlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CiAJc3RydWN0IGNvbXBvdW5kX2hkciBoZHIgPSB7CiAJCS5taW5vcnZlcnNpb24gPSBuZnM0X3hkcl9taW5vcnZlcnNpb24oJmFyZ3MtPnNlcV9hcmdzKSwKIAl9OwogCi0JeGRyX2luaXRfZW5jb2RlKCZ4ZHIsICZyZXEtPnJxX3NuZF9idWYsIHApOwotCWVuY29kZV9jb21wb3VuZF9oZHIoJnhkciwgcmVxLCAmaGRyKTsKLQllbmNvZGVfc2VxdWVuY2UoJnhkciwgJmFyZ3MtPnNlcV9hcmdzLCAmaGRyKTsKLQllbmNvZGVfcHV0ZmgoJnhkciwgYXJncy0+ZmgsICZoZHIpOwotCWVuY29kZV9zZXRhdHRyKCZ4ZHIsIGFyZ3MsIGFyZ3MtPnNlcnZlciwgJmhkcik7Ci0JZW5jb2RlX2dldGZhdHRyKCZ4ZHIsIGFyZ3MtPmJpdG1hc2ssICZoZHIpOworCWVuY29kZV9jb21wb3VuZF9oZHIoeGRyLCByZXEsICZoZHIpOworCWVuY29kZV9zZXF1ZW5jZSh4ZHIsICZhcmdzLT5zZXFfYXJncywgJmhkcik7CisJZW5jb2RlX3B1dGZoKHhkciwgYXJncy0+ZmgsICZoZHIpOworCWVuY29kZV9zZXRhdHRyKHhkciwgYXJncywgYXJncy0+c2VydmVyLCAmaGRyKTsKKwllbmNvZGVfZ2V0ZmF0dHIoeGRyLCBhcmdzLT5iaXRtYXNrLCAmaGRyKTsKIAllbmNvZGVfbm9wcygmaGRyKTsKLQlyZXR1cm4gMDsKIH0KIAogLyoKICAqIEVuY29kZSBhIEdFVEFDTCByZXF1ZXN0CiAgKi8KLXN0YXRpYyBpbnQKLW5mczRfeGRyX2VuY19nZXRhY2woc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwKLQkJc3RydWN0IG5mc19nZXRhY2xhcmdzICphcmdzKQorc3RhdGljIHZvaWQgbmZzNF94ZHJfZW5jX2dldGFjbChzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKKwkJCQlzdHJ1Y3QgbmZzX2dldGFjbGFyZ3MgKmFyZ3MpCiB7Ci0Jc3RydWN0IHhkcl9zdHJlYW0geGRyOwogCXN0cnVjdCBjb21wb3VuZF9oZHIgaGRyID0gewogCQkubWlub3J2ZXJzaW9uID0gbmZzNF94ZHJfbWlub3J2ZXJzaW9uKCZhcmdzLT5zZXFfYXJncyksCiAJfTsKIAl1aW50MzJfdCByZXBsZW47CiAKLQl4ZHJfaW5pdF9lbmNvZGUoJnhkciwgJnJlcS0+cnFfc25kX2J1ZiwgcCk7Ci0JZW5jb2RlX2NvbXBvdW5kX2hkcigmeGRyLCByZXEsICZoZHIpOwotCWVuY29kZV9zZXF1ZW5jZSgmeGRyLCAmYXJncy0+c2VxX2FyZ3MsICZoZHIpOwotCWVuY29kZV9wdXRmaCgmeGRyLCBhcmdzLT5maCwgJmhkcik7CisJZW5jb2RlX2NvbXBvdW5kX2hkcih4ZHIsIHJlcSwgJmhkcik7CisJZW5jb2RlX3NlcXVlbmNlKHhkciwgJmFyZ3MtPnNlcV9hcmdzLCAmaGRyKTsKKwllbmNvZGVfcHV0ZmgoeGRyLCBhcmdzLT5maCwgJmhkcik7CiAJcmVwbGVuID0gaGRyLnJlcGxlbiArIG9wX2RlY29kZV9oZHJfbWF4c3ogKyBuZnM0X2ZhdHRyX2JpdG1hcF9tYXhzeiArIDE7Ci0JZW5jb2RlX2dldGF0dHJfdHdvKCZ4ZHIsIEZBVFRSNF9XT1JEMF9BQ0wsIDAsICZoZHIpOworCWVuY29kZV9nZXRhdHRyX3R3byh4ZHIsIEZBVFRSNF9XT1JEMF9BQ0wsIDAsICZoZHIpOwogCiAJeGRyX2lubGluZV9wYWdlcygmcmVxLT5ycV9yY3ZfYnVmLCByZXBsZW4gPDwgMiwKIAkJYXJncy0+YWNsX3BhZ2VzLCBhcmdzLT5hY2xfcGdiYXNlLCBhcmdzLT5hY2xfbGVuKTsKIAllbmNvZGVfbm9wcygmaGRyKTsKLQlyZXR1cm4gMDsKIH0KIAogLyoKICAqIEVuY29kZSBhIFdSSVRFIHJlcXVlc3QKICAqLwotc3RhdGljIGludCBuZnM0X3hkcl9lbmNfd3JpdGUoc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgc3RydWN0IG5mc193cml0ZWFyZ3MgKmFyZ3MpCitzdGF0aWMgdm9pZCBuZnM0X3hkcl9lbmNfd3JpdGUoc3RydWN0IHJwY19ycXN0ICpyZXEsIHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCisJCQkgICAgICAgc3RydWN0IG5mc193cml0ZWFyZ3MgKmFyZ3MpCiB7Ci0Jc3RydWN0IHhkcl9zdHJlYW0geGRyOwogCXN0cnVjdCBjb21wb3VuZF9oZHIgaGRyID0gewogCQkubWlub3J2ZXJzaW9uID0gbmZzNF94ZHJfbWlub3J2ZXJzaW9uKCZhcmdzLT5zZXFfYXJncyksCiAJfTsKIAotCXhkcl9pbml0X2VuY29kZSgmeGRyLCAmcmVxLT5ycV9zbmRfYnVmLCBwKTsKLQllbmNvZGVfY29tcG91bmRfaGRyKCZ4ZHIsIHJlcSwgJmhkcik7Ci0JZW5jb2RlX3NlcXVlbmNlKCZ4ZHIsICZhcmdzLT5zZXFfYXJncywgJmhkcik7Ci0JZW5jb2RlX3B1dGZoKCZ4ZHIsIGFyZ3MtPmZoLCAmaGRyKTsKLQllbmNvZGVfd3JpdGUoJnhkciwgYXJncywgJmhkcik7CisJZW5jb2RlX2NvbXBvdW5kX2hkcih4ZHIsIHJlcSwgJmhkcik7CisJZW5jb2RlX3NlcXVlbmNlKHhkciwgJmFyZ3MtPnNlcV9hcmdzLCAmaGRyKTsKKwllbmNvZGVfcHV0ZmgoeGRyLCBhcmdzLT5maCwgJmhkcik7CisJZW5jb2RlX3dyaXRlKHhkciwgYXJncywgJmhkcik7CiAJcmVxLT5ycV9zbmRfYnVmLmZsYWdzIHw9IFhEUkJVRl9XUklURTsKLQllbmNvZGVfZ2V0ZmF0dHIoJnhkciwgYXJncy0+Yml0bWFzaywgJmhkcik7CisJZW5jb2RlX2dldGZhdHRyKHhkciwgYXJncy0+Yml0bWFzaywgJmhkcik7CiAJZW5jb2RlX25vcHMoJmhkcik7Ci0JcmV0dXJuIDA7CiB9CiAKIC8qCiAgKiAgYSBDT01NSVQgcmVxdWVzdAogICovCi1zdGF0aWMgaW50IG5mczRfeGRyX2VuY19jb21taXQoc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgc3RydWN0IG5mc193cml0ZWFyZ3MgKmFyZ3MpCitzdGF0aWMgdm9pZCBuZnM0X3hkcl9lbmNfY29tbWl0KHN0cnVjdCBycGNfcnFzdCAqcmVxLCBzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAorCQkJCXN0cnVjdCBuZnNfd3JpdGVhcmdzICphcmdzKQogewotCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKIAlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkciA9IHsKIAkJLm1pbm9ydmVyc2lvbiA9IG5mczRfeGRyX21pbm9ydmVyc2lvbigmYXJncy0+c2VxX2FyZ3MpLAogCX07CiAKLQl4ZHJfaW5pdF9lbmNvZGUoJnhkciwgJnJlcS0+cnFfc25kX2J1ZiwgcCk7Ci0JZW5jb2RlX2NvbXBvdW5kX2hkcigmeGRyLCByZXEsICZoZHIpOwotCWVuY29kZV9zZXF1ZW5jZSgmeGRyLCAmYXJncy0+c2VxX2FyZ3MsICZoZHIpOwotCWVuY29kZV9wdXRmaCgmeGRyLCBhcmdzLT5maCwgJmhkcik7Ci0JZW5jb2RlX2NvbW1pdCgmeGRyLCBhcmdzLCAmaGRyKTsKLQllbmNvZGVfZ2V0ZmF0dHIoJnhkciwgYXJncy0+Yml0bWFzaywgJmhkcik7CisJZW5jb2RlX2NvbXBvdW5kX2hkcih4ZHIsIHJlcSwgJmhkcik7CisJZW5jb2RlX3NlcXVlbmNlKHhkciwgJmFyZ3MtPnNlcV9hcmdzLCAmaGRyKTsKKwllbmNvZGVfcHV0ZmgoeGRyLCBhcmdzLT5maCwgJmhkcik7CisJZW5jb2RlX2NvbW1pdCh4ZHIsIGFyZ3MsICZoZHIpOworCWVuY29kZV9nZXRmYXR0cih4ZHIsIGFyZ3MtPmJpdG1hc2ssICZoZHIpOwogCWVuY29kZV9ub3BzKCZoZHIpOwotCXJldHVybiAwOwogfQogCiAvKgogICogRlNJTkZPIHJlcXVlc3QKICAqLwotc3RhdGljIGludCBuZnM0X3hkcl9lbmNfZnNpbmZvKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsIHN0cnVjdCBuZnM0X2ZzaW5mb19hcmcgKmFyZ3MpCitzdGF0aWMgdm9pZCBuZnM0X3hkcl9lbmNfZnNpbmZvKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAorCQkJCXN0cnVjdCBuZnM0X2ZzaW5mb19hcmcgKmFyZ3MpCiB7Ci0Jc3RydWN0IHhkcl9zdHJlYW0geGRyOwogCXN0cnVjdCBjb21wb3VuZF9oZHIgaGRyID0gewogCQkubWlub3J2ZXJzaW9uID0gbmZzNF94ZHJfbWlub3J2ZXJzaW9uKCZhcmdzLT5zZXFfYXJncyksCiAJfTsKIAotCXhkcl9pbml0X2VuY29kZSgmeGRyLCAmcmVxLT5ycV9zbmRfYnVmLCBwKTsKLQllbmNvZGVfY29tcG91bmRfaGRyKCZ4ZHIsIHJlcSwgJmhkcik7Ci0JZW5jb2RlX3NlcXVlbmNlKCZ4ZHIsICZhcmdzLT5zZXFfYXJncywgJmhkcik7Ci0JZW5jb2RlX3B1dGZoKCZ4ZHIsIGFyZ3MtPmZoLCAmaGRyKTsKLQllbmNvZGVfZnNpbmZvKCZ4ZHIsIGFyZ3MtPmJpdG1hc2ssICZoZHIpOworCWVuY29kZV9jb21wb3VuZF9oZHIoeGRyLCByZXEsICZoZHIpOworCWVuY29kZV9zZXF1ZW5jZSh4ZHIsICZhcmdzLT5zZXFfYXJncywgJmhkcik7CisJZW5jb2RlX3B1dGZoKHhkciwgYXJncy0+ZmgsICZoZHIpOworCWVuY29kZV9mc2luZm8oeGRyLCBhcmdzLT5iaXRtYXNrLCAmaGRyKTsKIAllbmNvZGVfbm9wcygmaGRyKTsKLQlyZXR1cm4gMDsKIH0KIAogLyoKICAqIGEgUEFUSENPTkYgcmVxdWVzdAogICovCi1zdGF0aWMgaW50IG5mczRfeGRyX2VuY19wYXRoY29uZihzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLCBjb25zdCBzdHJ1Y3QgbmZzNF9wYXRoY29uZl9hcmcgKmFyZ3MpCitzdGF0aWMgdm9pZCBuZnM0X3hkcl9lbmNfcGF0aGNvbmYoc3RydWN0IHJwY19ycXN0ICpyZXEsIHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCisJCQkJICBjb25zdCBzdHJ1Y3QgbmZzNF9wYXRoY29uZl9hcmcgKmFyZ3MpCiB7Ci0Jc3RydWN0IHhkcl9zdHJlYW0geGRyOwogCXN0cnVjdCBjb21wb3VuZF9oZHIgaGRyID0gewogCQkubWlub3J2ZXJzaW9uID0gbmZzNF94ZHJfbWlub3J2ZXJzaW9uKCZhcmdzLT5zZXFfYXJncyksCiAJfTsKIAotCXhkcl9pbml0X2VuY29kZSgmeGRyLCAmcmVxLT5ycV9zbmRfYnVmLCBwKTsKLQllbmNvZGVfY29tcG91bmRfaGRyKCZ4ZHIsIHJlcSwgJmhkcik7Ci0JZW5jb2RlX3NlcXVlbmNlKCZ4ZHIsICZhcmdzLT5zZXFfYXJncywgJmhkcik7Ci0JZW5jb2RlX3B1dGZoKCZ4ZHIsIGFyZ3MtPmZoLCAmaGRyKTsKLQllbmNvZGVfZ2V0YXR0cl9vbmUoJnhkciwgYXJncy0+Yml0bWFza1swXSAmIG5mczRfcGF0aGNvbmZfYml0bWFwWzBdLAorCWVuY29kZV9jb21wb3VuZF9oZHIoeGRyLCByZXEsICZoZHIpOworCWVuY29kZV9zZXF1ZW5jZSh4ZHIsICZhcmdzLT5zZXFfYXJncywgJmhkcik7CisJZW5jb2RlX3B1dGZoKHhkciwgYXJncy0+ZmgsICZoZHIpOworCWVuY29kZV9nZXRhdHRyX29uZSh4ZHIsIGFyZ3MtPmJpdG1hc2tbMF0gJiBuZnM0X3BhdGhjb25mX2JpdG1hcFswXSwKIAkJCSAgICZoZHIpOwogCWVuY29kZV9ub3BzKCZoZHIpOwotCXJldHVybiAwOwogfQogCiAvKgogICogYSBTVEFURlMgcmVxdWVzdAogICovCi1zdGF0aWMgaW50IG5mczRfeGRyX2VuY19zdGF0ZnMoc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgY29uc3Qgc3RydWN0IG5mczRfc3RhdGZzX2FyZyAqYXJncykKK3N0YXRpYyB2b2lkIG5mczRfeGRyX2VuY19zdGF0ZnMoc3RydWN0IHJwY19ycXN0ICpyZXEsIHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCisJCQkJY29uc3Qgc3RydWN0IG5mczRfc3RhdGZzX2FyZyAqYXJncykKIHsKLQlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CiAJc3RydWN0IGNvbXBvdW5kX2hkciBoZHIgPSB7CiAJCS5taW5vcnZlcnNpb24gPSBuZnM0X3hkcl9taW5vcnZlcnNpb24oJmFyZ3MtPnNlcV9hcmdzKSwKIAl9OwogCi0JeGRyX2luaXRfZW5jb2RlKCZ4ZHIsICZyZXEtPnJxX3NuZF9idWYsIHApOwotCWVuY29kZV9jb21wb3VuZF9oZHIoJnhkciwgcmVxLCAmaGRyKTsKLQllbmNvZGVfc2VxdWVuY2UoJnhkciwgJmFyZ3MtPnNlcV9hcmdzLCAmaGRyKTsKLQllbmNvZGVfcHV0ZmgoJnhkciwgYXJncy0+ZmgsICZoZHIpOwotCWVuY29kZV9nZXRhdHRyX3R3bygmeGRyLCBhcmdzLT5iaXRtYXNrWzBdICYgbmZzNF9zdGF0ZnNfYml0bWFwWzBdLAorCWVuY29kZV9jb21wb3VuZF9oZHIoeGRyLCByZXEsICZoZHIpOworCWVuY29kZV9zZXF1ZW5jZSh4ZHIsICZhcmdzLT5zZXFfYXJncywgJmhkcik7CisJZW5jb2RlX3B1dGZoKHhkciwgYXJncy0+ZmgsICZoZHIpOworCWVuY29kZV9nZXRhdHRyX3R3byh4ZHIsIGFyZ3MtPmJpdG1hc2tbMF0gJiBuZnM0X3N0YXRmc19iaXRtYXBbMF0sCiAJCQkgICBhcmdzLT5iaXRtYXNrWzFdICYgbmZzNF9zdGF0ZnNfYml0bWFwWzFdLCAmaGRyKTsKIAllbmNvZGVfbm9wcygmaGRyKTsKLQlyZXR1cm4gMDsKIH0KIAogLyoKICAqIEdFVEFUVFJfQklUTUFQIHJlcXVlc3QKICAqLwotc3RhdGljIGludCBuZnM0X3hkcl9lbmNfc2VydmVyX2NhcHMoc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwKLQkJCQkgICAgc3RydWN0IG5mczRfc2VydmVyX2NhcHNfYXJnICphcmdzKQorc3RhdGljIHZvaWQgbmZzNF94ZHJfZW5jX3NlcnZlcl9jYXBzKHN0cnVjdCBycGNfcnFzdCAqcmVxLAorCQkJCSAgICAgc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKKwkJCQkgICAgIHN0cnVjdCBuZnM0X3NlcnZlcl9jYXBzX2FyZyAqYXJncykKIHsKLQlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CiAJc3RydWN0IGNvbXBvdW5kX2hkciBoZHIgPSB7CiAJCS5taW5vcnZlcnNpb24gPSBuZnM0X3hkcl9taW5vcnZlcnNpb24oJmFyZ3MtPnNlcV9hcmdzKSwKIAl9OwogCi0JeGRyX2luaXRfZW5jb2RlKCZ4ZHIsICZyZXEtPnJxX3NuZF9idWYsIHApOwotCWVuY29kZV9jb21wb3VuZF9oZHIoJnhkciwgcmVxLCAmaGRyKTsKLQllbmNvZGVfc2VxdWVuY2UoJnhkciwgJmFyZ3MtPnNlcV9hcmdzLCAmaGRyKTsKLQllbmNvZGVfcHV0ZmgoJnhkciwgYXJncy0+ZmhhbmRsZSwgJmhkcik7Ci0JZW5jb2RlX2dldGF0dHJfb25lKCZ4ZHIsIEZBVFRSNF9XT1JEMF9TVVBQT1JURURfQVRUUlN8CisJZW5jb2RlX2NvbXBvdW5kX2hkcih4ZHIsIHJlcSwgJmhkcik7CisJZW5jb2RlX3NlcXVlbmNlKHhkciwgJmFyZ3MtPnNlcV9hcmdzLCAmaGRyKTsKKwllbmNvZGVfcHV0ZmgoeGRyLCBhcmdzLT5maGFuZGxlLCAmaGRyKTsKKwllbmNvZGVfZ2V0YXR0cl9vbmUoeGRyLCBGQVRUUjRfV09SRDBfU1VQUE9SVEVEX0FUVFJTfAogCQkJICAgRkFUVFI0X1dPUkQwX0xJTktfU1VQUE9SVHwKIAkJCSAgIEZBVFRSNF9XT1JEMF9TWU1MSU5LX1NVUFBPUlR8CiAJCQkgICBGQVRUUjRfV09SRDBfQUNMU1VQUE9SVCwgJmhkcik7CiAJZW5jb2RlX25vcHMoJmhkcik7Ci0JcmV0dXJuIDA7CiB9CiAKIC8qCiAgKiBhIFJFTkVXIHJlcXVlc3QKICAqLwotc3RhdGljIGludCBuZnM0X3hkcl9lbmNfcmVuZXcoc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgc3RydWN0IG5mc19jbGllbnQgKmNscCkKK3N0YXRpYyB2b2lkIG5mczRfeGRyX2VuY19yZW5ldyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKKwkJCSAgICAgICBzdHJ1Y3QgbmZzX2NsaWVudCAqY2xwKQogewotCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKIAlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkciA9IHsKIAkJLm5vcHMJPSAwLAogCX07CiAKLQl4ZHJfaW5pdF9lbmNvZGUoJnhkciwgJnJlcS0+cnFfc25kX2J1ZiwgcCk7Ci0JZW5jb2RlX2NvbXBvdW5kX2hkcigmeGRyLCByZXEsICZoZHIpOwotCWVuY29kZV9yZW5ldygmeGRyLCBjbHAsICZoZHIpOworCWVuY29kZV9jb21wb3VuZF9oZHIoeGRyLCByZXEsICZoZHIpOworCWVuY29kZV9yZW5ldyh4ZHIsIGNscCwgJmhkcik7CiAJZW5jb2RlX25vcHMoJmhkcik7Ci0JcmV0dXJuIDA7CiB9CiAKIC8qCiAgKiBhIFNFVENMSUVOVElEIHJlcXVlc3QKICAqLwotc3RhdGljIGludCBuZnM0X3hkcl9lbmNfc2V0Y2xpZW50aWQoc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgc3RydWN0IG5mczRfc2V0Y2xpZW50aWQgKnNjKQorc3RhdGljIHZvaWQgbmZzNF94ZHJfZW5jX3NldGNsaWVudGlkKHN0cnVjdCBycGNfcnFzdCAqcmVxLAorCQkJCSAgICAgc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKKwkJCQkgICAgIHN0cnVjdCBuZnM0X3NldGNsaWVudGlkICpzYykKIHsKLQlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CiAJc3RydWN0IGNvbXBvdW5kX2hkciBoZHIgPSB7CiAJCS5ub3BzCT0gMCwKIAl9OwogCi0JeGRyX2luaXRfZW5jb2RlKCZ4ZHIsICZyZXEtPnJxX3NuZF9idWYsIHApOwotCWVuY29kZV9jb21wb3VuZF9oZHIoJnhkciwgcmVxLCAmaGRyKTsKLQllbmNvZGVfc2V0Y2xpZW50aWQoJnhkciwgc2MsICZoZHIpOworCWVuY29kZV9jb21wb3VuZF9oZHIoeGRyLCByZXEsICZoZHIpOworCWVuY29kZV9zZXRjbGllbnRpZCh4ZHIsIHNjLCAmaGRyKTsKIAllbmNvZGVfbm9wcygmaGRyKTsKLQlyZXR1cm4gMDsKIH0KIAogLyoKICAqIGEgU0VUQ0xJRU5USURfQ09ORklSTSByZXF1ZXN0CiAgKi8KLXN0YXRpYyBpbnQgbmZzNF94ZHJfZW5jX3NldGNsaWVudGlkX2NvbmZpcm0oc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgc3RydWN0IG5mczRfc2V0Y2xpZW50aWRfcmVzICphcmcpCitzdGF0aWMgdm9pZCBuZnM0X3hkcl9lbmNfc2V0Y2xpZW50aWRfY29uZmlybShzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwKKwkJCQkJICAgICBzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAorCQkJCQkgICAgIHN0cnVjdCBuZnM0X3NldGNsaWVudGlkX3JlcyAqYXJnKQogewotCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKIAlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkciA9IHsKIAkJLm5vcHMJPSAwLAogCX07CiAJY29uc3QgdTMyIGxlYXNlX2JpdG1hcFsyXSA9IHsgRkFUVFI0X1dPUkQwX0xFQVNFX1RJTUUsIDAgfTsKIAotCXhkcl9pbml0X2VuY29kZSgmeGRyLCAmcmVxLT5ycV9zbmRfYnVmLCBwKTsKLQllbmNvZGVfY29tcG91bmRfaGRyKCZ4ZHIsIHJlcSwgJmhkcik7Ci0JZW5jb2RlX3NldGNsaWVudGlkX2NvbmZpcm0oJnhkciwgYXJnLCAmaGRyKTsKLQllbmNvZGVfcHV0cm9vdGZoKCZ4ZHIsICZoZHIpOwotCWVuY29kZV9mc2luZm8oJnhkciwgbGVhc2VfYml0bWFwLCAmaGRyKTsKKwllbmNvZGVfY29tcG91bmRfaGRyKHhkciwgcmVxLCAmaGRyKTsKKwllbmNvZGVfc2V0Y2xpZW50aWRfY29uZmlybSh4ZHIsIGFyZywgJmhkcik7CisJZW5jb2RlX3B1dHJvb3RmaCh4ZHIsICZoZHIpOworCWVuY29kZV9mc2luZm8oeGRyLCBsZWFzZV9iaXRtYXAsICZoZHIpOwogCWVuY29kZV9ub3BzKCZoZHIpOwotCXJldHVybiAwOwogfQogCiAvKgogICogREVMRUdSRVRVUk4gcmVxdWVzdAogICovCi1zdGF0aWMgaW50IG5mczRfeGRyX2VuY19kZWxlZ3JldHVybihzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLCBjb25zdCBzdHJ1Y3QgbmZzNF9kZWxlZ3JldHVybmFyZ3MgKmFyZ3MpCitzdGF0aWMgdm9pZCBuZnM0X3hkcl9lbmNfZGVsZWdyZXR1cm4oc3RydWN0IHJwY19ycXN0ICpyZXEsCisJCQkJICAgICBzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAorCQkJCSAgICAgY29uc3Qgc3RydWN0IG5mczRfZGVsZWdyZXR1cm5hcmdzICphcmdzKQogewotCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKIAlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkciA9IHsKIAkJLm1pbm9ydmVyc2lvbiA9IG5mczRfeGRyX21pbm9ydmVyc2lvbigmYXJncy0+c2VxX2FyZ3MpLAogCX07CiAKLQl4ZHJfaW5pdF9lbmNvZGUoJnhkciwgJnJlcS0+cnFfc25kX2J1ZiwgcCk7Ci0JZW5jb2RlX2NvbXBvdW5kX2hkcigmeGRyLCByZXEsICZoZHIpOwotCWVuY29kZV9zZXF1ZW5jZSgmeGRyLCAmYXJncy0+c2VxX2FyZ3MsICZoZHIpOwotCWVuY29kZV9wdXRmaCgmeGRyLCBhcmdzLT5maGFuZGxlLCAmaGRyKTsKLQllbmNvZGVfZGVsZWdyZXR1cm4oJnhkciwgYXJncy0+c3RhdGVpZCwgJmhkcik7Ci0JZW5jb2RlX2dldGZhdHRyKCZ4ZHIsIGFyZ3MtPmJpdG1hc2ssICZoZHIpOworCWVuY29kZV9jb21wb3VuZF9oZHIoeGRyLCByZXEsICZoZHIpOworCWVuY29kZV9zZXF1ZW5jZSh4ZHIsICZhcmdzLT5zZXFfYXJncywgJmhkcik7CisJZW5jb2RlX3B1dGZoKHhkciwgYXJncy0+ZmhhbmRsZSwgJmhkcik7CisJZW5jb2RlX2RlbGVncmV0dXJuKHhkciwgYXJncy0+c3RhdGVpZCwgJmhkcik7CisJZW5jb2RlX2dldGZhdHRyKHhkciwgYXJncy0+Yml0bWFzaywgJmhkcik7CiAJZW5jb2RlX25vcHMoJmhkcik7Ci0JcmV0dXJuIDA7CiB9CiAKIC8qCiAgKiBFbmNvZGUgRlNfTE9DQVRJT05TIHJlcXVlc3QKICAqLwotc3RhdGljIGludCBuZnM0X3hkcl9lbmNfZnNfbG9jYXRpb25zKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsIHN0cnVjdCBuZnM0X2ZzX2xvY2F0aW9uc19hcmcgKmFyZ3MpCitzdGF0aWMgdm9pZCBuZnM0X3hkcl9lbmNfZnNfbG9jYXRpb25zKHN0cnVjdCBycGNfcnFzdCAqcmVxLAorCQkJCSAgICAgIHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCisJCQkJICAgICAgc3RydWN0IG5mczRfZnNfbG9jYXRpb25zX2FyZyAqYXJncykKIHsKLQlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CiAJc3RydWN0IGNvbXBvdW5kX2hkciBoZHIgPSB7CiAJCS5taW5vcnZlcnNpb24gPSBuZnM0X3hkcl9taW5vcnZlcnNpb24oJmFyZ3MtPnNlcV9hcmdzKSwKIAl9OwogCXVpbnQzMl90IHJlcGxlbjsKIAotCXhkcl9pbml0X2VuY29kZSgmeGRyLCAmcmVxLT5ycV9zbmRfYnVmLCBwKTsKLQllbmNvZGVfY29tcG91bmRfaGRyKCZ4ZHIsIHJlcSwgJmhkcik7Ci0JZW5jb2RlX3NlcXVlbmNlKCZ4ZHIsICZhcmdzLT5zZXFfYXJncywgJmhkcik7Ci0JZW5jb2RlX3B1dGZoKCZ4ZHIsIGFyZ3MtPmRpcl9maCwgJmhkcik7Ci0JZW5jb2RlX2xvb2t1cCgmeGRyLCBhcmdzLT5uYW1lLCAmaGRyKTsKKwllbmNvZGVfY29tcG91bmRfaGRyKHhkciwgcmVxLCAmaGRyKTsKKwllbmNvZGVfc2VxdWVuY2UoeGRyLCAmYXJncy0+c2VxX2FyZ3MsICZoZHIpOworCWVuY29kZV9wdXRmaCh4ZHIsIGFyZ3MtPmRpcl9maCwgJmhkcik7CisJZW5jb2RlX2xvb2t1cCh4ZHIsIGFyZ3MtPm5hbWUsICZoZHIpOwogCXJlcGxlbiA9IGhkci5yZXBsZW47CS8qIGdldCB0aGUgYXR0cmlidXRlIGludG8gYXJncy0+cGFnZSAqLwotCWVuY29kZV9mc19sb2NhdGlvbnMoJnhkciwgYXJncy0+Yml0bWFzaywgJmhkcik7CisJZW5jb2RlX2ZzX2xvY2F0aW9ucyh4ZHIsIGFyZ3MtPmJpdG1hc2ssICZoZHIpOwogCiAJeGRyX2lubGluZV9wYWdlcygmcmVxLT5ycV9yY3ZfYnVmLCByZXBsZW4gPDwgMiwgJmFyZ3MtPnBhZ2UsCiAJCQkwLCBQQUdFX1NJWkUpOwogCWVuY29kZV9ub3BzKCZoZHIpOwotCXJldHVybiAwOwogfQogCiAjaWYgZGVmaW5lZChDT05GSUdfTkZTX1Y0XzEpCiAvKgogICogRVhDSEFOR0VfSUQgcmVxdWVzdAogICovCi1zdGF0aWMgaW50IG5mczRfeGRyX2VuY19leGNoYW5nZV9pZChzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdWludDMyX3QgKnAsCi0JCQkJICAgIHN0cnVjdCBuZnM0MV9leGNoYW5nZV9pZF9hcmdzICphcmdzKQorc3RhdGljIHZvaWQgbmZzNF94ZHJfZW5jX2V4Y2hhbmdlX2lkKHN0cnVjdCBycGNfcnFzdCAqcmVxLAorCQkJCSAgICAgc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKKwkJCQkgICAgIHN0cnVjdCBuZnM0MV9leGNoYW5nZV9pZF9hcmdzICphcmdzKQogewotCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKIAlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkciA9IHsKIAkJLm1pbm9ydmVyc2lvbiA9IGFyZ3MtPmNsaWVudC0+Y2xfbXZvcHMtPm1pbm9yX3ZlcnNpb24sCiAJfTsKIAotCXhkcl9pbml0X2VuY29kZSgmeGRyLCAmcmVxLT5ycV9zbmRfYnVmLCBwKTsKLQllbmNvZGVfY29tcG91bmRfaGRyKCZ4ZHIsIHJlcSwgJmhkcik7Ci0JZW5jb2RlX2V4Y2hhbmdlX2lkKCZ4ZHIsIGFyZ3MsICZoZHIpOworCWVuY29kZV9jb21wb3VuZF9oZHIoeGRyLCByZXEsICZoZHIpOworCWVuY29kZV9leGNoYW5nZV9pZCh4ZHIsIGFyZ3MsICZoZHIpOwogCWVuY29kZV9ub3BzKCZoZHIpOwotCXJldHVybiAwOwogfQogCiAvKgogICogYSBDUkVBVEVfU0VTU0lPTiByZXF1ZXN0CiAgKi8KLXN0YXRpYyBpbnQgbmZzNF94ZHJfZW5jX2NyZWF0ZV9zZXNzaW9uKHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1aW50MzJfdCAqcCwKLQkJCQkgICAgICAgc3RydWN0IG5mczQxX2NyZWF0ZV9zZXNzaW9uX2FyZ3MgKmFyZ3MpCitzdGF0aWMgdm9pZCBuZnM0X3hkcl9lbmNfY3JlYXRlX3Nlc3Npb24oc3RydWN0IHJwY19ycXN0ICpyZXEsCisJCQkJCXN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCisJCQkJCXN0cnVjdCBuZnM0MV9jcmVhdGVfc2Vzc2lvbl9hcmdzICphcmdzKQogewotCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKIAlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkciA9IHsKIAkJLm1pbm9ydmVyc2lvbiA9IGFyZ3MtPmNsaWVudC0+Y2xfbXZvcHMtPm1pbm9yX3ZlcnNpb24sCiAJfTsKIAotCXhkcl9pbml0X2VuY29kZSgmeGRyLCAmcmVxLT5ycV9zbmRfYnVmLCBwKTsKLQllbmNvZGVfY29tcG91bmRfaGRyKCZ4ZHIsIHJlcSwgJmhkcik7Ci0JZW5jb2RlX2NyZWF0ZV9zZXNzaW9uKCZ4ZHIsIGFyZ3MsICZoZHIpOworCWVuY29kZV9jb21wb3VuZF9oZHIoeGRyLCByZXEsICZoZHIpOworCWVuY29kZV9jcmVhdGVfc2Vzc2lvbih4ZHIsIGFyZ3MsICZoZHIpOwogCWVuY29kZV9ub3BzKCZoZHIpOwotCXJldHVybiAwOwogfQogCiAvKgogICogYSBERVNUUk9ZX1NFU1NJT04gcmVxdWVzdAogICovCi1zdGF0aWMgaW50IG5mczRfeGRyX2VuY19kZXN0cm95X3Nlc3Npb24oc3RydWN0IHJwY19ycXN0ICpyZXEsIHVpbnQzMl90ICpwLAotCQkJCQlzdHJ1Y3QgbmZzNF9zZXNzaW9uICpzZXNzaW9uKQorc3RhdGljIHZvaWQgbmZzNF94ZHJfZW5jX2Rlc3Ryb3lfc2Vzc2lvbihzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwKKwkJCQkJIHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCisJCQkJCSBzdHJ1Y3QgbmZzNF9zZXNzaW9uICpzZXNzaW9uKQogewotCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKIAlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkciA9IHsKIAkJLm1pbm9ydmVyc2lvbiA9IHNlc3Npb24tPmNscC0+Y2xfbXZvcHMtPm1pbm9yX3ZlcnNpb24sCiAJfTsKIAotCXhkcl9pbml0X2VuY29kZSgmeGRyLCAmcmVxLT5ycV9zbmRfYnVmLCBwKTsKLQllbmNvZGVfY29tcG91bmRfaGRyKCZ4ZHIsIHJlcSwgJmhkcik7Ci0JZW5jb2RlX2Rlc3Ryb3lfc2Vzc2lvbigmeGRyLCBzZXNzaW9uLCAmaGRyKTsKKwllbmNvZGVfY29tcG91bmRfaGRyKHhkciwgcmVxLCAmaGRyKTsKKwllbmNvZGVfZGVzdHJveV9zZXNzaW9uKHhkciwgc2Vzc2lvbiwgJmhkcik7CiAJZW5jb2RlX25vcHMoJmhkcik7Ci0JcmV0dXJuIDA7CiB9CiAKIC8qCiAgKiBhIFNFUVVFTkNFIHJlcXVlc3QKICAqLwotc3RhdGljIGludCBuZnM0X3hkcl9lbmNfc2VxdWVuY2Uoc3RydWN0IHJwY19ycXN0ICpyZXEsIHVpbnQzMl90ICpwLAotCQkJCSBzdHJ1Y3QgbmZzNF9zZXF1ZW5jZV9hcmdzICphcmdzKQorc3RhdGljIHZvaWQgbmZzNF94ZHJfZW5jX3NlcXVlbmNlKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAorCQkJCSAgc3RydWN0IG5mczRfc2VxdWVuY2VfYXJncyAqYXJncykKIHsKLQlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CiAJc3RydWN0IGNvbXBvdW5kX2hkciBoZHIgPSB7CiAJCS5taW5vcnZlcnNpb24gPSBuZnM0X3hkcl9taW5vcnZlcnNpb24oYXJncyksCiAJfTsKIAotCXhkcl9pbml0X2VuY29kZSgmeGRyLCAmcmVxLT5ycV9zbmRfYnVmLCBwKTsKLQllbmNvZGVfY29tcG91bmRfaGRyKCZ4ZHIsIHJlcSwgJmhkcik7Ci0JZW5jb2RlX3NlcXVlbmNlKCZ4ZHIsIGFyZ3MsICZoZHIpOworCWVuY29kZV9jb21wb3VuZF9oZHIoeGRyLCByZXEsICZoZHIpOworCWVuY29kZV9zZXF1ZW5jZSh4ZHIsIGFyZ3MsICZoZHIpOwogCWVuY29kZV9ub3BzKCZoZHIpOwotCXJldHVybiAwOwogfQogCiAvKgogICogYSBHRVRfTEVBU0VfVElNRSByZXF1ZXN0CiAgKi8KLXN0YXRpYyBpbnQgbmZzNF94ZHJfZW5jX2dldF9sZWFzZV90aW1lKHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1aW50MzJfdCAqcCwKLQkJCQkgICAgICAgc3RydWN0IG5mczRfZ2V0X2xlYXNlX3RpbWVfYXJncyAqYXJncykKK3N0YXRpYyB2b2lkIG5mczRfeGRyX2VuY19nZXRfbGVhc2VfdGltZShzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwKKwkJCQkJc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKKwkJCQkJc3RydWN0IG5mczRfZ2V0X2xlYXNlX3RpbWVfYXJncyAqYXJncykKIHsKLQlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CiAJc3RydWN0IGNvbXBvdW5kX2hkciBoZHIgPSB7CiAJCS5taW5vcnZlcnNpb24gPSBuZnM0X3hkcl9taW5vcnZlcnNpb24oJmFyZ3MtPmxhX3NlcV9hcmdzKSwKIAl9OwogCWNvbnN0IHUzMiBsZWFzZV9iaXRtYXBbMl0gPSB7IEZBVFRSNF9XT1JEMF9MRUFTRV9USU1FLCAwIH07CiAKLQl4ZHJfaW5pdF9lbmNvZGUoJnhkciwgJnJlcS0+cnFfc25kX2J1ZiwgcCk7Ci0JZW5jb2RlX2NvbXBvdW5kX2hkcigmeGRyLCByZXEsICZoZHIpOwotCWVuY29kZV9zZXF1ZW5jZSgmeGRyLCAmYXJncy0+bGFfc2VxX2FyZ3MsICZoZHIpOwotCWVuY29kZV9wdXRyb290ZmgoJnhkciwgJmhkcik7Ci0JZW5jb2RlX2ZzaW5mbygmeGRyLCBsZWFzZV9iaXRtYXAsICZoZHIpOworCWVuY29kZV9jb21wb3VuZF9oZHIoeGRyLCByZXEsICZoZHIpOworCWVuY29kZV9zZXF1ZW5jZSh4ZHIsICZhcmdzLT5sYV9zZXFfYXJncywgJmhkcik7CisJZW5jb2RlX3B1dHJvb3RmaCh4ZHIsICZoZHIpOworCWVuY29kZV9mc2luZm8oeGRyLCBsZWFzZV9iaXRtYXAsICZoZHIpOwogCWVuY29kZV9ub3BzKCZoZHIpOwotCXJldHVybiAwOwogfQogCiAvKgogICogYSBSRUNMQUlNX0NPTVBMRVRFIHJlcXVlc3QKICAqLwotc3RhdGljIGludCBuZnM0X3hkcl9lbmNfcmVjbGFpbV9jb21wbGV0ZShzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdWludDMyX3QgKnAsCi0JCQkJICAgICBzdHJ1Y3QgbmZzNDFfcmVjbGFpbV9jb21wbGV0ZV9hcmdzICphcmdzKQorc3RhdGljIHZvaWQgbmZzNF94ZHJfZW5jX3JlY2xhaW1fY29tcGxldGUoc3RydWN0IHJwY19ycXN0ICpyZXEsCisJCQkJCSAgc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKKwkJCQlzdHJ1Y3QgbmZzNDFfcmVjbGFpbV9jb21wbGV0ZV9hcmdzICphcmdzKQogewotCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKIAlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkciA9IHsKIAkJLm1pbm9ydmVyc2lvbiA9IG5mczRfeGRyX21pbm9ydmVyc2lvbigmYXJncy0+c2VxX2FyZ3MpCiAJfTsKIAotCXhkcl9pbml0X2VuY29kZSgmeGRyLCAmcmVxLT5ycV9zbmRfYnVmLCBwKTsKLQllbmNvZGVfY29tcG91bmRfaGRyKCZ4ZHIsIHJlcSwgJmhkcik7Ci0JZW5jb2RlX3NlcXVlbmNlKCZ4ZHIsICZhcmdzLT5zZXFfYXJncywgJmhkcik7Ci0JZW5jb2RlX3JlY2xhaW1fY29tcGxldGUoJnhkciwgYXJncywgJmhkcik7CisJZW5jb2RlX2NvbXBvdW5kX2hkcih4ZHIsIHJlcSwgJmhkcik7CisJZW5jb2RlX3NlcXVlbmNlKHhkciwgJmFyZ3MtPnNlcV9hcmdzLCAmaGRyKTsKKwllbmNvZGVfcmVjbGFpbV9jb21wbGV0ZSh4ZHIsIGFyZ3MsICZoZHIpOwogCWVuY29kZV9ub3BzKCZoZHIpOwotCXJldHVybiAwOwogfQogCiAvKgogICogRW5jb2RlIEdFVERFVklDRUlORk8gcmVxdWVzdAogICovCi1zdGF0aWMgaW50IG5mczRfeGRyX2VuY19nZXRkZXZpY2VpbmZvKHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1aW50MzJfdCAqcCwKLQkJCQkgICAgICBzdHJ1Y3QgbmZzNF9nZXRkZXZpY2VpbmZvX2FyZ3MgKmFyZ3MpCitzdGF0aWMgdm9pZCBuZnM0X3hkcl9lbmNfZ2V0ZGV2aWNlaW5mbyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwKKwkJCQkgICAgICAgc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKKwkJCQkgICAgICAgc3RydWN0IG5mczRfZ2V0ZGV2aWNlaW5mb19hcmdzICphcmdzKQogewotCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKIAlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkciA9IHsKIAkJLm1pbm9ydmVyc2lvbiA9IG5mczRfeGRyX21pbm9ydmVyc2lvbigmYXJncy0+c2VxX2FyZ3MpLAogCX07CiAKLQl4ZHJfaW5pdF9lbmNvZGUoJnhkciwgJnJlcS0+cnFfc25kX2J1ZiwgcCk7Ci0JZW5jb2RlX2NvbXBvdW5kX2hkcigmeGRyLCByZXEsICZoZHIpOwotCWVuY29kZV9zZXF1ZW5jZSgmeGRyLCAmYXJncy0+c2VxX2FyZ3MsICZoZHIpOwotCWVuY29kZV9nZXRkZXZpY2VpbmZvKCZ4ZHIsIGFyZ3MsICZoZHIpOworCWVuY29kZV9jb21wb3VuZF9oZHIoeGRyLCByZXEsICZoZHIpOworCWVuY29kZV9zZXF1ZW5jZSh4ZHIsICZhcmdzLT5zZXFfYXJncywgJmhkcik7CisJZW5jb2RlX2dldGRldmljZWluZm8oeGRyLCBhcmdzLCAmaGRyKTsKIAogCS8qIHNldCB1cCByZXBseSBrdmVjLiBTdWJ0cmFjdCBub3RpZmljYXRpb24gYml0bWFwIG1heCBzaXplICgyKQogCSAqIHNvIHRoYXQgbm90aWZpY2F0aW9uIGJpdG1hcCBpcyBwdXQgaW4geGRyX2J1ZiB0YWlsICovCkBAIC0yNjU3LDI3ICsyNTgyLDI0IEBACiAJCQkgYXJncy0+cGRldi0+cGdsZW4pOwogCiAJZW5jb2RlX25vcHMoJmhkcik7Ci0JcmV0dXJuIDA7CiB9CiAKIC8qCiAgKiAgRW5jb2RlIExBWU9VVEdFVCByZXF1ZXN0CiAgKi8KLXN0YXRpYyBpbnQgbmZzNF94ZHJfZW5jX2xheW91dGdldChzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdWludDMyX3QgKnAsCi0JCQkJICBzdHJ1Y3QgbmZzNF9sYXlvdXRnZXRfYXJncyAqYXJncykKK3N0YXRpYyB2b2lkIG5mczRfeGRyX2VuY19sYXlvdXRnZXQoc3RydWN0IHJwY19ycXN0ICpyZXEsCisJCQkJICAgc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKKwkJCQkgICBzdHJ1Y3QgbmZzNF9sYXlvdXRnZXRfYXJncyAqYXJncykKIHsKLQlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CiAJc3RydWN0IGNvbXBvdW5kX2hkciBoZHIgPSB7CiAJCS5taW5vcnZlcnNpb24gPSBuZnM0X3hkcl9taW5vcnZlcnNpb24oJmFyZ3MtPnNlcV9hcmdzKSwKIAl9OwogCi0JeGRyX2luaXRfZW5jb2RlKCZ4ZHIsICZyZXEtPnJxX3NuZF9idWYsIHApOwotCWVuY29kZV9jb21wb3VuZF9oZHIoJnhkciwgcmVxLCAmaGRyKTsKLQllbmNvZGVfc2VxdWVuY2UoJnhkciwgJmFyZ3MtPnNlcV9hcmdzLCAmaGRyKTsKLQllbmNvZGVfcHV0ZmgoJnhkciwgTkZTX0ZIKGFyZ3MtPmlub2RlKSwgJmhkcik7Ci0JZW5jb2RlX2xheW91dGdldCgmeGRyLCBhcmdzLCAmaGRyKTsKKwllbmNvZGVfY29tcG91bmRfaGRyKHhkciwgcmVxLCAmaGRyKTsKKwllbmNvZGVfc2VxdWVuY2UoeGRyLCAmYXJncy0+c2VxX2FyZ3MsICZoZHIpOworCWVuY29kZV9wdXRmaCh4ZHIsIE5GU19GSChhcmdzLT5pbm9kZSksICZoZHIpOworCWVuY29kZV9sYXlvdXRnZXQoeGRyLCBhcmdzLCAmaGRyKTsKIAllbmNvZGVfbm9wcygmaGRyKTsKLQlyZXR1cm4gMDsKIH0KICNlbmRpZiAvKiBDT05GSUdfTkZTX1Y0XzEgKi8KIApAQCAtNDQ3NSw3ICs0Mzk3LDcgQEAKIAkJZ290byBvdXRfb3ZlcmZsb3c7CiAJZW9mID0gYmUzMl90b19jcHVwKHArKyk7CiAJY291bnQgPSBiZTMyX3RvX2NwdXAocCk7Ci0JaGRybGVuID0gKHU4ICopIHAgLSAodTggKikgaW92LT5pb3ZfYmFzZTsKKwloZHJsZW4gPSAodTggKikgeGRyLT5wIC0gKHU4ICopIGlvdi0+aW92X2Jhc2U7CiAJcmVjdmQgPSByZXEtPnJxX3Jjdl9idWYubGVuIC0gaGRybGVuOwogCWlmIChjb3VudCA+IHJlY3ZkKSB7CiAJCWRwcmludGsoIk5GUzogc2VydmVyIGNoZWF0aW5nIGluIHJlYWQgcmVwbHk6ICIKQEAgLTUwMDAsNyArNDkyMiw3IEBACiAJCWdvdG8gb3V0X292ZXJmbG93OwogCWxlbiA9IGJlMzJfdG9fY3B1cChwKTsKIAlpZiAobGVuKSB7Ci0JCWludCBpOworCQl1aW50MzJfdCBpOwogCiAJCXAgPSB4ZHJfaW5saW5lX2RlY29kZSh4ZHIsIDQgKiBsZW4pOwogCQlpZiAodW5saWtlbHkoIXApKQpAQCAtNTA5MCwyNiArNTAxMiwyNiBAQAogLyoKICAqIERlY29kZSBPUEVOX0RPV05HUkFERSByZXNwb25zZQogICovCi1zdGF0aWMgaW50IG5mczRfeGRyX2RlY19vcGVuX2Rvd25ncmFkZShzdHJ1Y3QgcnBjX3Jxc3QgKnJxc3RwLCBfX2JlMzIgKnAsIHN0cnVjdCBuZnNfY2xvc2VyZXMgKnJlcykKK3N0YXRpYyBpbnQgbmZzNF94ZHJfZGVjX29wZW5fZG93bmdyYWRlKHN0cnVjdCBycGNfcnFzdCAqcnFzdHAsCisJCQkJICAgICAgIHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCisJCQkJICAgICAgIHN0cnVjdCBuZnNfY2xvc2VyZXMgKnJlcykKIHsKLQlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CiAJc3RydWN0IGNvbXBvdW5kX2hkciBoZHI7CiAJaW50IHN0YXR1czsKIAotCXhkcl9pbml0X2RlY29kZSgmeGRyLCAmcnFzdHAtPnJxX3Jjdl9idWYsIHApOwotCXN0YXR1cyA9IGRlY29kZV9jb21wb3VuZF9oZHIoJnhkciwgJmhkcik7CisJc3RhdHVzID0gZGVjb2RlX2NvbXBvdW5kX2hkcih4ZHIsICZoZHIpOwogCWlmIChzdGF0dXMpCiAJCWdvdG8gb3V0OwotCXN0YXR1cyA9IGRlY29kZV9zZXF1ZW5jZSgmeGRyLCAmcmVzLT5zZXFfcmVzLCBycXN0cCk7CisJc3RhdHVzID0gZGVjb2RlX3NlcXVlbmNlKHhkciwgJnJlcy0+c2VxX3JlcywgcnFzdHApOwogCWlmIChzdGF0dXMpCiAJCWdvdG8gb3V0OwotCXN0YXR1cyA9IGRlY29kZV9wdXRmaCgmeGRyKTsKKwlzdGF0dXMgPSBkZWNvZGVfcHV0ZmgoeGRyKTsKIAlpZiAoc3RhdHVzKQogCQlnb3RvIG91dDsKLQlzdGF0dXMgPSBkZWNvZGVfb3Blbl9kb3duZ3JhZGUoJnhkciwgcmVzKTsKKwlzdGF0dXMgPSBkZWNvZGVfb3Blbl9kb3duZ3JhZGUoeGRyLCByZXMpOwogCWlmIChzdGF0dXMgIT0gMCkKIAkJZ290byBvdXQ7Ci0JZGVjb2RlX2dldGZhdHRyKCZ4ZHIsIHJlcy0+ZmF0dHIsIHJlcy0+c2VydmVyLAorCWRlY29kZV9nZXRmYXR0cih4ZHIsIHJlcy0+ZmF0dHIsIHJlcy0+c2VydmVyLAogCQkJIVJQQ19JU19BU1lOQyhycXN0cC0+cnFfdGFzaykpOwogb3V0OgogCXJldHVybiBzdGF0dXM7CkBAIC01MTE4LDI2ICs1MDQwLDI1IEBACiAvKgogICogRGVjb2RlIEFDQ0VTUyByZXNwb25zZQogICovCi1zdGF0aWMgaW50IG5mczRfeGRyX2RlY19hY2Nlc3Moc3RydWN0IHJwY19ycXN0ICpycXN0cCwgX19iZTMyICpwLCBzdHJ1Y3QgbmZzNF9hY2Nlc3NyZXMgKnJlcykKK3N0YXRpYyBpbnQgbmZzNF94ZHJfZGVjX2FjY2VzcyhzdHJ1Y3QgcnBjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAorCQkJICAgICAgIHN0cnVjdCBuZnM0X2FjY2Vzc3JlcyAqcmVzKQogewotCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKIAlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkcjsKIAlpbnQgc3RhdHVzOwogCi0JeGRyX2luaXRfZGVjb2RlKCZ4ZHIsICZycXN0cC0+cnFfcmN2X2J1ZiwgcCk7Ci0Jc3RhdHVzID0gZGVjb2RlX2NvbXBvdW5kX2hkcigmeGRyLCAmaGRyKTsKKwlzdGF0dXMgPSBkZWNvZGVfY29tcG91bmRfaGRyKHhkciwgJmhkcik7CiAJaWYgKHN0YXR1cykKIAkJZ290byBvdXQ7Ci0Jc3RhdHVzID0gZGVjb2RlX3NlcXVlbmNlKCZ4ZHIsICZyZXMtPnNlcV9yZXMsIHJxc3RwKTsKKwlzdGF0dXMgPSBkZWNvZGVfc2VxdWVuY2UoeGRyLCAmcmVzLT5zZXFfcmVzLCBycXN0cCk7CiAJaWYgKHN0YXR1cykKIAkJZ290byBvdXQ7Ci0Jc3RhdHVzID0gZGVjb2RlX3B1dGZoKCZ4ZHIpOworCXN0YXR1cyA9IGRlY29kZV9wdXRmaCh4ZHIpOwogCWlmIChzdGF0dXMgIT0gMCkKIAkJZ290byBvdXQ7Ci0Jc3RhdHVzID0gZGVjb2RlX2FjY2VzcygmeGRyLCByZXMpOworCXN0YXR1cyA9IGRlY29kZV9hY2Nlc3MoeGRyLCByZXMpOwogCWlmIChzdGF0dXMgIT0gMCkKIAkJZ290byBvdXQ7Ci0JZGVjb2RlX2dldGZhdHRyKCZ4ZHIsIHJlcy0+ZmF0dHIsIHJlcy0+c2VydmVyLAorCWRlY29kZV9nZXRmYXR0cih4ZHIsIHJlcy0+ZmF0dHIsIHJlcy0+c2VydmVyLAogCQkJIVJQQ19JU19BU1lOQyhycXN0cC0+cnFfdGFzaykpOwogb3V0OgogCXJldHVybiBzdGF0dXM7CkBAIC01MTQ2LDI2ICs1MDY3LDI4IEBACiAvKgogICogRGVjb2RlIExPT0tVUCByZXNwb25zZQogICovCi1zdGF0aWMgaW50IG5mczRfeGRyX2RlY19sb29rdXAoc3RydWN0IHJwY19ycXN0ICpycXN0cCwgX19iZTMyICpwLCBzdHJ1Y3QgbmZzNF9sb29rdXBfcmVzICpyZXMpCitzdGF0aWMgaW50IG5mczRfeGRyX2RlY19sb29rdXAoc3RydWN0IHJwY19ycXN0ICpycXN0cCwgc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKKwkJCSAgICAgICBzdHJ1Y3QgbmZzNF9sb29rdXBfcmVzICpyZXMpCiB7Ci0Jc3RydWN0IHhkcl9zdHJlYW0geGRyOwogCXN0cnVjdCBjb21wb3VuZF9oZHIgaGRyOwogCWludCBzdGF0dXM7CiAKLQl4ZHJfaW5pdF9kZWNvZGUoJnhkciwgJnJxc3RwLT5ycV9yY3ZfYnVmLCBwKTsKLQlzdGF0dXMgPSBkZWNvZGVfY29tcG91bmRfaGRyKCZ4ZHIsICZoZHIpOworCXN0YXR1cyA9IGRlY29kZV9jb21wb3VuZF9oZHIoeGRyLCAmaGRyKTsKIAlpZiAoc3RhdHVzKQogCQlnb3RvIG91dDsKLQlzdGF0dXMgPSBkZWNvZGVfc2VxdWVuY2UoJnhkciwgJnJlcy0+c2VxX3JlcywgcnFzdHApOworCXN0YXR1cyA9IGRlY29kZV9zZXF1ZW5jZSh4ZHIsICZyZXMtPnNlcV9yZXMsIHJxc3RwKTsKIAlpZiAoc3RhdHVzKQogCQlnb3RvIG91dDsKLQlpZiAoKHN0YXR1cyA9IGRlY29kZV9wdXRmaCgmeGRyKSkgIT0gMCkKKwlzdGF0dXMgPSBkZWNvZGVfcHV0ZmgoeGRyKTsKKwlpZiAoc3RhdHVzKQogCQlnb3RvIG91dDsKLQlpZiAoKHN0YXR1cyA9IGRlY29kZV9sb29rdXAoJnhkcikpICE9IDApCisJc3RhdHVzID0gZGVjb2RlX2xvb2t1cCh4ZHIpOworCWlmIChzdGF0dXMpCiAJCWdvdG8gb3V0OwotCWlmICgoc3RhdHVzID0gZGVjb2RlX2dldGZoKCZ4ZHIsIHJlcy0+ZmgpKSAhPSAwKQorCXN0YXR1cyA9IGRlY29kZV9nZXRmaCh4ZHIsIHJlcy0+ZmgpOworCWlmIChzdGF0dXMpCiAJCWdvdG8gb3V0OwotCXN0YXR1cyA9IGRlY29kZV9nZXRmYXR0cigmeGRyLCByZXMtPmZhdHRyLCByZXMtPnNlcnZlcgorCXN0YXR1cyA9IGRlY29kZV9nZXRmYXR0cih4ZHIsIHJlcy0+ZmF0dHIsIHJlcy0+c2VydmVyCiAJCQksIVJQQ19JU19BU1lOQyhycXN0cC0+cnFfdGFzaykpOwogb3V0OgogCXJldHVybiBzdGF0dXM7CkBAIC01MTc0LDIzICs1MDk3LDI1IEBACiAvKgogICogRGVjb2RlIExPT0tVUF9ST09UIHJlc3BvbnNlCiAgKi8KLXN0YXRpYyBpbnQgbmZzNF94ZHJfZGVjX2xvb2t1cF9yb290KHN0cnVjdCBycGNfcnFzdCAqcnFzdHAsIF9fYmUzMiAqcCwgc3RydWN0IG5mczRfbG9va3VwX3JlcyAqcmVzKQorc3RhdGljIGludCBuZnM0X3hkcl9kZWNfbG9va3VwX3Jvb3Qoc3RydWN0IHJwY19ycXN0ICpycXN0cCwKKwkJCQkgICAgc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKKwkJCQkgICAgc3RydWN0IG5mczRfbG9va3VwX3JlcyAqcmVzKQogewotCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKIAlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkcjsKIAlpbnQgc3RhdHVzOwogCi0JeGRyX2luaXRfZGVjb2RlKCZ4ZHIsICZycXN0cC0+cnFfcmN2X2J1ZiwgcCk7Ci0Jc3RhdHVzID0gZGVjb2RlX2NvbXBvdW5kX2hkcigmeGRyLCAmaGRyKTsKKwlzdGF0dXMgPSBkZWNvZGVfY29tcG91bmRfaGRyKHhkciwgJmhkcik7CiAJaWYgKHN0YXR1cykKIAkJZ290byBvdXQ7Ci0Jc3RhdHVzID0gZGVjb2RlX3NlcXVlbmNlKCZ4ZHIsICZyZXMtPnNlcV9yZXMsIHJxc3RwKTsKKwlzdGF0dXMgPSBkZWNvZGVfc2VxdWVuY2UoeGRyLCAmcmVzLT5zZXFfcmVzLCBycXN0cCk7CiAJaWYgKHN0YXR1cykKIAkJZ290byBvdXQ7Ci0JaWYgKChzdGF0dXMgPSBkZWNvZGVfcHV0cm9vdGZoKCZ4ZHIpKSAhPSAwKQorCXN0YXR1cyA9IGRlY29kZV9wdXRyb290ZmgoeGRyKTsKKwlpZiAoc3RhdHVzKQogCQlnb3RvIG91dDsKLQlpZiAoKHN0YXR1cyA9IGRlY29kZV9nZXRmaCgmeGRyLCByZXMtPmZoKSkgPT0gMCkKLQkJc3RhdHVzID0gZGVjb2RlX2dldGZhdHRyKCZ4ZHIsIHJlcy0+ZmF0dHIsIHJlcy0+c2VydmVyLAorCXN0YXR1cyA9IGRlY29kZV9nZXRmaCh4ZHIsIHJlcy0+ZmgpOworCWlmIChzdGF0dXMgPT0gMCkKKwkJc3RhdHVzID0gZGVjb2RlX2dldGZhdHRyKHhkciwgcmVzLT5mYXR0ciwgcmVzLT5zZXJ2ZXIsCiAJCQkJIVJQQ19JU19BU1lOQyhycXN0cC0+cnFfdGFzaykpOwogb3V0OgogCXJldHVybiBzdGF0dXM7CkBAIC01MTk5LDI0ICs1MTI0LDI1IEBACiAvKgogICogRGVjb2RlIFJFTU9WRSByZXNwb25zZQogICovCi1zdGF0aWMgaW50IG5mczRfeGRyX2RlY19yZW1vdmUoc3RydWN0IHJwY19ycXN0ICpycXN0cCwgX19iZTMyICpwLCBzdHJ1Y3QgbmZzX3JlbW92ZXJlcyAqcmVzKQorc3RhdGljIGludCBuZnM0X3hkcl9kZWNfcmVtb3ZlKHN0cnVjdCBycGNfcnFzdCAqcnFzdHAsIHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCisJCQkgICAgICAgc3RydWN0IG5mc19yZW1vdmVyZXMgKnJlcykKIHsKLQlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CiAJc3RydWN0IGNvbXBvdW5kX2hkciBoZHI7CiAJaW50IHN0YXR1czsKIAotCXhkcl9pbml0X2RlY29kZSgmeGRyLCAmcnFzdHAtPnJxX3Jjdl9idWYsIHApOwotCXN0YXR1cyA9IGRlY29kZV9jb21wb3VuZF9oZHIoJnhkciwgJmhkcik7CisJc3RhdHVzID0gZGVjb2RlX2NvbXBvdW5kX2hkcih4ZHIsICZoZHIpOwogCWlmIChzdGF0dXMpCiAJCWdvdG8gb3V0OwotCXN0YXR1cyA9IGRlY29kZV9zZXF1ZW5jZSgmeGRyLCAmcmVzLT5zZXFfcmVzLCBycXN0cCk7CisJc3RhdHVzID0gZGVjb2RlX3NlcXVlbmNlKHhkciwgJnJlcy0+c2VxX3JlcywgcnFzdHApOwogCWlmIChzdGF0dXMpCiAJCWdvdG8gb3V0OwotCWlmICgoc3RhdHVzID0gZGVjb2RlX3B1dGZoKCZ4ZHIpKSAhPSAwKQorCXN0YXR1cyA9IGRlY29kZV9wdXRmaCh4ZHIpOworCWlmIChzdGF0dXMpCiAJCWdvdG8gb3V0OwotCWlmICgoc3RhdHVzID0gZGVjb2RlX3JlbW92ZSgmeGRyLCAmcmVzLT5jaW5mbykpICE9IDApCisJc3RhdHVzID0gZGVjb2RlX3JlbW92ZSh4ZHIsICZyZXMtPmNpbmZvKTsKKwlpZiAoc3RhdHVzKQogCQlnb3RvIG91dDsKLQlkZWNvZGVfZ2V0ZmF0dHIoJnhkciwgcmVzLT5kaXJfYXR0ciwgcmVzLT5zZXJ2ZXIsCisJZGVjb2RlX2dldGZhdHRyKHhkciwgcmVzLT5kaXJfYXR0ciwgcmVzLT5zZXJ2ZXIsCiAJCQkhUlBDX0lTX0FTWU5DKHJxc3RwLT5ycV90YXNrKSk7CiBvdXQ6CiAJcmV0dXJuIHN0YXR1czsKQEAgLTUyMjUsMzQgKzUxNTEsMzggQEAKIC8qCiAgKiBEZWNvZGUgUkVOQU1FIHJlc3BvbnNlCiAgKi8KLXN0YXRpYyBpbnQgbmZzNF94ZHJfZGVjX3JlbmFtZShzdHJ1Y3QgcnBjX3Jxc3QgKnJxc3RwLCBfX2JlMzIgKnAsIHN0cnVjdCBuZnNfcmVuYW1lcmVzICpyZXMpCitzdGF0aWMgaW50IG5mczRfeGRyX2RlY19yZW5hbWUoc3RydWN0IHJwY19ycXN0ICpycXN0cCwgc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKKwkJCSAgICAgICBzdHJ1Y3QgbmZzX3JlbmFtZXJlcyAqcmVzKQogewotCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKIAlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkcjsKIAlpbnQgc3RhdHVzOwogCi0JeGRyX2luaXRfZGVjb2RlKCZ4ZHIsICZycXN0cC0+cnFfcmN2X2J1ZiwgcCk7Ci0Jc3RhdHVzID0gZGVjb2RlX2NvbXBvdW5kX2hkcigmeGRyLCAmaGRyKTsKKwlzdGF0dXMgPSBkZWNvZGVfY29tcG91bmRfaGRyKHhkciwgJmhkcik7CiAJaWYgKHN0YXR1cykKIAkJZ290byBvdXQ7Ci0Jc3RhdHVzID0gZGVjb2RlX3NlcXVlbmNlKCZ4ZHIsICZyZXMtPnNlcV9yZXMsIHJxc3RwKTsKKwlzdGF0dXMgPSBkZWNvZGVfc2VxdWVuY2UoeGRyLCAmcmVzLT5zZXFfcmVzLCBycXN0cCk7CiAJaWYgKHN0YXR1cykKIAkJZ290byBvdXQ7Ci0JaWYgKChzdGF0dXMgPSBkZWNvZGVfcHV0ZmgoJnhkcikpICE9IDApCisJc3RhdHVzID0gZGVjb2RlX3B1dGZoKHhkcik7CisJaWYgKHN0YXR1cykKIAkJZ290byBvdXQ7Ci0JaWYgKChzdGF0dXMgPSBkZWNvZGVfc2F2ZWZoKCZ4ZHIpKSAhPSAwKQorCXN0YXR1cyA9IGRlY29kZV9zYXZlZmgoeGRyKTsKKwlpZiAoc3RhdHVzKQogCQlnb3RvIG91dDsKLQlpZiAoKHN0YXR1cyA9IGRlY29kZV9wdXRmaCgmeGRyKSkgIT0gMCkKKwlzdGF0dXMgPSBkZWNvZGVfcHV0ZmgoeGRyKTsKKwlpZiAoc3RhdHVzKQogCQlnb3RvIG91dDsKLQlpZiAoKHN0YXR1cyA9IGRlY29kZV9yZW5hbWUoJnhkciwgJnJlcy0+b2xkX2NpbmZvLCAmcmVzLT5uZXdfY2luZm8pKSAhPSAwKQorCXN0YXR1cyA9IGRlY29kZV9yZW5hbWUoeGRyLCAmcmVzLT5vbGRfY2luZm8sICZyZXMtPm5ld19jaW5mbyk7CisJaWYgKHN0YXR1cykKIAkJZ290byBvdXQ7CiAJLyogQ3VycmVudCBGSCBpcyB0YXJnZXQgZGlyZWN0b3J5ICovCi0JaWYgKGRlY29kZV9nZXRmYXR0cigmeGRyLCByZXMtPm5ld19mYXR0ciwgcmVzLT5zZXJ2ZXIsCisJaWYgKGRlY29kZV9nZXRmYXR0cih4ZHIsIHJlcy0+bmV3X2ZhdHRyLCByZXMtPnNlcnZlciwKIAkJCQkhUlBDX0lTX0FTWU5DKHJxc3RwLT5ycV90YXNrKSkgIT0gMCkKIAkJZ290byBvdXQ7Ci0JaWYgKChzdGF0dXMgPSBkZWNvZGVfcmVzdG9yZWZoKCZ4ZHIpKSAhPSAwKQorCXN0YXR1cyA9IGRlY29kZV9yZXN0b3JlZmgoeGRyKTsKKwlpZiAoc3RhdHVzKQogCQlnb3RvIG91dDsKLQlkZWNvZGVfZ2V0ZmF0dHIoJnhkciwgcmVzLT5vbGRfZmF0dHIsIHJlcy0+c2VydmVyLAorCWRlY29kZV9nZXRmYXR0cih4ZHIsIHJlcy0+b2xkX2ZhdHRyLCByZXMtPnNlcnZlciwKIAkJCSFSUENfSVNfQVNZTkMocnFzdHAtPnJxX3Rhc2spKTsKIG91dDoKIAlyZXR1cm4gc3RhdHVzOwpAQCAtNTI2MSwzNyArNTE5MSw0MSBAQAogLyoKICAqIERlY29kZSBMSU5LIHJlc3BvbnNlCiAgKi8KLXN0YXRpYyBpbnQgbmZzNF94ZHJfZGVjX2xpbmsoc3RydWN0IHJwY19ycXN0ICpycXN0cCwgX19iZTMyICpwLCBzdHJ1Y3QgbmZzNF9saW5rX3JlcyAqcmVzKQorc3RhdGljIGludCBuZnM0X3hkcl9kZWNfbGluayhzdHJ1Y3QgcnBjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAorCQkJICAgICBzdHJ1Y3QgbmZzNF9saW5rX3JlcyAqcmVzKQogewotCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKIAlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkcjsKIAlpbnQgc3RhdHVzOwogCi0JeGRyX2luaXRfZGVjb2RlKCZ4ZHIsICZycXN0cC0+cnFfcmN2X2J1ZiwgcCk7Ci0Jc3RhdHVzID0gZGVjb2RlX2NvbXBvdW5kX2hkcigmeGRyLCAmaGRyKTsKKwlzdGF0dXMgPSBkZWNvZGVfY29tcG91bmRfaGRyKHhkciwgJmhkcik7CiAJaWYgKHN0YXR1cykKIAkJZ290byBvdXQ7Ci0Jc3RhdHVzID0gZGVjb2RlX3NlcXVlbmNlKCZ4ZHIsICZyZXMtPnNlcV9yZXMsIHJxc3RwKTsKKwlzdGF0dXMgPSBkZWNvZGVfc2VxdWVuY2UoeGRyLCAmcmVzLT5zZXFfcmVzLCBycXN0cCk7CiAJaWYgKHN0YXR1cykKIAkJZ290byBvdXQ7Ci0JaWYgKChzdGF0dXMgPSBkZWNvZGVfcHV0ZmgoJnhkcikpICE9IDApCisJc3RhdHVzID0gZGVjb2RlX3B1dGZoKHhkcik7CisJaWYgKHN0YXR1cykKIAkJZ290byBvdXQ7Ci0JaWYgKChzdGF0dXMgPSBkZWNvZGVfc2F2ZWZoKCZ4ZHIpKSAhPSAwKQorCXN0YXR1cyA9IGRlY29kZV9zYXZlZmgoeGRyKTsKKwlpZiAoc3RhdHVzKQogCQlnb3RvIG91dDsKLQlpZiAoKHN0YXR1cyA9IGRlY29kZV9wdXRmaCgmeGRyKSkgIT0gMCkKKwlzdGF0dXMgPSBkZWNvZGVfcHV0ZmgoeGRyKTsKKwlpZiAoc3RhdHVzKQogCQlnb3RvIG91dDsKLQlpZiAoKHN0YXR1cyA9IGRlY29kZV9saW5rKCZ4ZHIsICZyZXMtPmNpbmZvKSkgIT0gMCkKKwlzdGF0dXMgPSBkZWNvZGVfbGluayh4ZHIsICZyZXMtPmNpbmZvKTsKKwlpZiAoc3RhdHVzKQogCQlnb3RvIG91dDsKIAkvKgogCSAqIE5vdGUgb3JkZXI6IE9QX0xJTksgbGVhdmVzIHRoZSBkaXJlY3RvcnkgYXMgdGhlIGN1cnJlbnQKIAkgKiAgICAgICAgICAgICBmaWxlaGFuZGxlLgogCSAqLwotCWlmIChkZWNvZGVfZ2V0ZmF0dHIoJnhkciwgcmVzLT5kaXJfYXR0ciwgcmVzLT5zZXJ2ZXIsCisJaWYgKGRlY29kZV9nZXRmYXR0cih4ZHIsIHJlcy0+ZGlyX2F0dHIsIHJlcy0+c2VydmVyLAogCQkJCSFSUENfSVNfQVNZTkMocnFzdHAtPnJxX3Rhc2spKSAhPSAwKQogCQlnb3RvIG91dDsKLQlpZiAoKHN0YXR1cyA9IGRlY29kZV9yZXN0b3JlZmgoJnhkcikpICE9IDApCisJc3RhdHVzID0gZGVjb2RlX3Jlc3RvcmVmaCh4ZHIpOworCWlmIChzdGF0dXMpCiAJCWdvdG8gb3V0OwotCWRlY29kZV9nZXRmYXR0cigmeGRyLCByZXMtPmZhdHRyLCByZXMtPnNlcnZlciwKKwlkZWNvZGVfZ2V0ZmF0dHIoeGRyLCByZXMtPmZhdHRyLCByZXMtPnNlcnZlciwKIAkJCSFSUENfSVNfQVNZTkMocnFzdHAtPnJxX3Rhc2spKTsKIG91dDoKIAlyZXR1cm4gc3RhdHVzOwpAQCAtNTMwMCwzMyArNTIzNCwzNyBAQAogLyoKICAqIERlY29kZSBDUkVBVEUgcmVzcG9uc2UKICAqLwotc3RhdGljIGludCBuZnM0X3hkcl9kZWNfY3JlYXRlKHN0cnVjdCBycGNfcnFzdCAqcnFzdHAsIF9fYmUzMiAqcCwgc3RydWN0IG5mczRfY3JlYXRlX3JlcyAqcmVzKQorc3RhdGljIGludCBuZnM0X3hkcl9kZWNfY3JlYXRlKHN0cnVjdCBycGNfcnFzdCAqcnFzdHAsIHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCisJCQkgICAgICAgc3RydWN0IG5mczRfY3JlYXRlX3JlcyAqcmVzKQogewotCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKIAlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkcjsKIAlpbnQgc3RhdHVzOwogCi0JeGRyX2luaXRfZGVjb2RlKCZ4ZHIsICZycXN0cC0+cnFfcmN2X2J1ZiwgcCk7Ci0Jc3RhdHVzID0gZGVjb2RlX2NvbXBvdW5kX2hkcigmeGRyLCAmaGRyKTsKKwlzdGF0dXMgPSBkZWNvZGVfY29tcG91bmRfaGRyKHhkciwgJmhkcik7CiAJaWYgKHN0YXR1cykKIAkJZ290byBvdXQ7Ci0Jc3RhdHVzID0gZGVjb2RlX3NlcXVlbmNlKCZ4ZHIsICZyZXMtPnNlcV9yZXMsIHJxc3RwKTsKKwlzdGF0dXMgPSBkZWNvZGVfc2VxdWVuY2UoeGRyLCAmcmVzLT5zZXFfcmVzLCBycXN0cCk7CiAJaWYgKHN0YXR1cykKIAkJZ290byBvdXQ7Ci0JaWYgKChzdGF0dXMgPSBkZWNvZGVfcHV0ZmgoJnhkcikpICE9IDApCisJc3RhdHVzID0gZGVjb2RlX3B1dGZoKHhkcik7CisJaWYgKHN0YXR1cykKIAkJZ290byBvdXQ7Ci0JaWYgKChzdGF0dXMgPSBkZWNvZGVfc2F2ZWZoKCZ4ZHIpKSAhPSAwKQorCXN0YXR1cyA9IGRlY29kZV9zYXZlZmgoeGRyKTsKKwlpZiAoc3RhdHVzKQogCQlnb3RvIG91dDsKLQlpZiAoKHN0YXR1cyA9IGRlY29kZV9jcmVhdGUoJnhkciwmcmVzLT5kaXJfY2luZm8pKSAhPSAwKQorCXN0YXR1cyA9IGRlY29kZV9jcmVhdGUoeGRyLCAmcmVzLT5kaXJfY2luZm8pOworCWlmIChzdGF0dXMpCiAJCWdvdG8gb3V0OwotCWlmICgoc3RhdHVzID0gZGVjb2RlX2dldGZoKCZ4ZHIsIHJlcy0+ZmgpKSAhPSAwKQorCXN0YXR1cyA9IGRlY29kZV9nZXRmaCh4ZHIsIHJlcy0+ZmgpOworCWlmIChzdGF0dXMpCiAJCWdvdG8gb3V0OwotCWlmIChkZWNvZGVfZ2V0ZmF0dHIoJnhkciwgcmVzLT5mYXR0ciwgcmVzLT5zZXJ2ZXIsCisJaWYgKGRlY29kZV9nZXRmYXR0cih4ZHIsIHJlcy0+ZmF0dHIsIHJlcy0+c2VydmVyLAogCQkJCSFSUENfSVNfQVNZTkMocnFzdHAtPnJxX3Rhc2spKSAhPSAwKQogCQlnb3RvIG91dDsKLQlpZiAoKHN0YXR1cyA9IGRlY29kZV9yZXN0b3JlZmgoJnhkcikpICE9IDApCisJc3RhdHVzID0gZGVjb2RlX3Jlc3RvcmVmaCh4ZHIpOworCWlmIChzdGF0dXMpCiAJCWdvdG8gb3V0OwotCWRlY29kZV9nZXRmYXR0cigmeGRyLCByZXMtPmRpcl9mYXR0ciwgcmVzLT5zZXJ2ZXIsCisJZGVjb2RlX2dldGZhdHRyKHhkciwgcmVzLT5kaXJfZmF0dHIsIHJlcy0+c2VydmVyLAogCQkJIVJQQ19JU19BU1lOQyhycXN0cC0+cnFfdGFzaykpOwogb3V0OgogCXJldHVybiBzdGF0dXM7CkBAIC01MzM1LDMxICs1MjczLDMxIEBACiAvKgogICogRGVjb2RlIFNZTUxJTksgcmVzcG9uc2UKICAqLwotc3RhdGljIGludCBuZnM0X3hkcl9kZWNfc3ltbGluayhzdHJ1Y3QgcnBjX3Jxc3QgKnJxc3RwLCBfX2JlMzIgKnAsIHN0cnVjdCBuZnM0X2NyZWF0ZV9yZXMgKnJlcykKK3N0YXRpYyBpbnQgbmZzNF94ZHJfZGVjX3N5bWxpbmsoc3RydWN0IHJwY19ycXN0ICpycXN0cCwgc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKKwkJCQlzdHJ1Y3QgbmZzNF9jcmVhdGVfcmVzICpyZXMpCiB7Ci0JcmV0dXJuIG5mczRfeGRyX2RlY19jcmVhdGUocnFzdHAsIHAsIHJlcyk7CisJcmV0dXJuIG5mczRfeGRyX2RlY19jcmVhdGUocnFzdHAsIHhkciwgcmVzKTsKIH0KIAogLyoKICAqIERlY29kZSBHRVRBVFRSIHJlc3BvbnNlCiAgKi8KLXN0YXRpYyBpbnQgbmZzNF94ZHJfZGVjX2dldGF0dHIoc3RydWN0IHJwY19ycXN0ICpycXN0cCwgX19iZTMyICpwLCBzdHJ1Y3QgbmZzNF9nZXRhdHRyX3JlcyAqcmVzKQorc3RhdGljIGludCBuZnM0X3hkcl9kZWNfZ2V0YXR0cihzdHJ1Y3QgcnBjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAorCQkJCXN0cnVjdCBuZnM0X2dldGF0dHJfcmVzICpyZXMpCiB7Ci0Jc3RydWN0IHhkcl9zdHJlYW0geGRyOwogCXN0cnVjdCBjb21wb3VuZF9oZHIgaGRyOwogCWludCBzdGF0dXM7CiAKLQl4ZHJfaW5pdF9kZWNvZGUoJnhkciwgJnJxc3RwLT5ycV9yY3ZfYnVmLCBwKTsKLQlzdGF0dXMgPSBkZWNvZGVfY29tcG91bmRfaGRyKCZ4ZHIsICZoZHIpOworCXN0YXR1cyA9IGRlY29kZV9jb21wb3VuZF9oZHIoeGRyLCAmaGRyKTsKIAlpZiAoc3RhdHVzKQogCQlnb3RvIG91dDsKLQlzdGF0dXMgPSBkZWNvZGVfc2VxdWVuY2UoJnhkciwgJnJlcy0+c2VxX3JlcywgcnFzdHApOworCXN0YXR1cyA9IGRlY29kZV9zZXF1ZW5jZSh4ZHIsICZyZXMtPnNlcV9yZXMsIHJxc3RwKTsKIAlpZiAoc3RhdHVzKQogCQlnb3RvIG91dDsKLQlzdGF0dXMgPSBkZWNvZGVfcHV0ZmgoJnhkcik7CisJc3RhdHVzID0gZGVjb2RlX3B1dGZoKHhkcik7CiAJaWYgKHN0YXR1cykKIAkJZ290byBvdXQ7Ci0Jc3RhdHVzID0gZGVjb2RlX2dldGZhdHRyKCZ4ZHIsIHJlcy0+ZmF0dHIsIHJlcy0+c2VydmVyLAorCXN0YXR1cyA9IGRlY29kZV9nZXRmYXR0cih4ZHIsIHJlcy0+ZmF0dHIsIHJlcy0+c2VydmVyLAogCQkJIVJQQ19JU19BU1lOQyhycXN0cC0+cnFfdGFzaykpOwogb3V0OgogCXJldHVybiBzdGF0dXM7CkBAIC01MzY4LDQ2ICs1MzA2LDQwIEBACiAvKgogICogRW5jb2RlIGFuIFNFVEFDTCByZXF1ZXN0CiAgKi8KLXN0YXRpYyBpbnQKLW5mczRfeGRyX2VuY19zZXRhY2woc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgc3RydWN0IG5mc19zZXRhY2xhcmdzICphcmdzKQorc3RhdGljIHZvaWQgbmZzNF94ZHJfZW5jX3NldGFjbChzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKKwkJCQlzdHJ1Y3QgbmZzX3NldGFjbGFyZ3MgKmFyZ3MpCiB7Ci0Jc3RydWN0IHhkcl9zdHJlYW0geGRyOwogCXN0cnVjdCBjb21wb3VuZF9oZHIgaGRyID0gewogCQkubWlub3J2ZXJzaW9uID0gbmZzNF94ZHJfbWlub3J2ZXJzaW9uKCZhcmdzLT5zZXFfYXJncyksCiAJfTsKLQlpbnQgc3RhdHVzOwogCi0JeGRyX2luaXRfZW5jb2RlKCZ4ZHIsICZyZXEtPnJxX3NuZF9idWYsIHApOwotCWVuY29kZV9jb21wb3VuZF9oZHIoJnhkciwgcmVxLCAmaGRyKTsKLQllbmNvZGVfc2VxdWVuY2UoJnhkciwgJmFyZ3MtPnNlcV9hcmdzLCAmaGRyKTsKLQllbmNvZGVfcHV0ZmgoJnhkciwgYXJncy0+ZmgsICZoZHIpOwotCXN0YXR1cyA9IGVuY29kZV9zZXRhY2woJnhkciwgYXJncywgJmhkcik7CisJZW5jb2RlX2NvbXBvdW5kX2hkcih4ZHIsIHJlcSwgJmhkcik7CisJZW5jb2RlX3NlcXVlbmNlKHhkciwgJmFyZ3MtPnNlcV9hcmdzLCAmaGRyKTsKKwllbmNvZGVfcHV0ZmgoeGRyLCBhcmdzLT5maCwgJmhkcik7CisJZW5jb2RlX3NldGFjbCh4ZHIsIGFyZ3MsICZoZHIpOwogCWVuY29kZV9ub3BzKCZoZHIpOwotCXJldHVybiBzdGF0dXM7CiB9CiAKIC8qCiAgKiBEZWNvZGUgU0VUQUNMIHJlc3BvbnNlCiAgKi8KIHN0YXRpYyBpbnQKLW5mczRfeGRyX2RlY19zZXRhY2woc3RydWN0IHJwY19ycXN0ICpycXN0cCwgX19iZTMyICpwLAorbmZzNF94ZHJfZGVjX3NldGFjbChzdHJ1Y3QgcnBjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAogCQkgICAgc3RydWN0IG5mc19zZXRhY2xyZXMgKnJlcykKIHsKLQlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CiAJc3RydWN0IGNvbXBvdW5kX2hkciBoZHI7CiAJaW50IHN0YXR1czsKIAotCXhkcl9pbml0X2RlY29kZSgmeGRyLCAmcnFzdHAtPnJxX3Jjdl9idWYsIHApOwotCXN0YXR1cyA9IGRlY29kZV9jb21wb3VuZF9oZHIoJnhkciwgJmhkcik7CisJc3RhdHVzID0gZGVjb2RlX2NvbXBvdW5kX2hkcih4ZHIsICZoZHIpOwogCWlmIChzdGF0dXMpCiAJCWdvdG8gb3V0OwotCXN0YXR1cyA9IGRlY29kZV9zZXF1ZW5jZSgmeGRyLCAmcmVzLT5zZXFfcmVzLCBycXN0cCk7CisJc3RhdHVzID0gZGVjb2RlX3NlcXVlbmNlKHhkciwgJnJlcy0+c2VxX3JlcywgcnFzdHApOwogCWlmIChzdGF0dXMpCiAJCWdvdG8gb3V0OwotCXN0YXR1cyA9IGRlY29kZV9wdXRmaCgmeGRyKTsKKwlzdGF0dXMgPSBkZWNvZGVfcHV0ZmgoeGRyKTsKIAlpZiAoc3RhdHVzKQogCQlnb3RvIG91dDsKLQlzdGF0dXMgPSBkZWNvZGVfc2V0YXR0cigmeGRyKTsKKwlzdGF0dXMgPSBkZWNvZGVfc2V0YXR0cih4ZHIpOwogb3V0OgogCXJldHVybiBzdGF0dXM7CiB9CkBAIC01NDE2LDI0ICs1MzQ4LDIyIEBACiAgKiBEZWNvZGUgR0VUQUNMIHJlc3BvbnNlCiAgKi8KIHN0YXRpYyBpbnQKLW5mczRfeGRyX2RlY19nZXRhY2woc3RydWN0IHJwY19ycXN0ICpycXN0cCwgX19iZTMyICpwLAorbmZzNF94ZHJfZGVjX2dldGFjbChzdHJ1Y3QgcnBjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAogCQkgICAgc3RydWN0IG5mc19nZXRhY2xyZXMgKnJlcykKIHsKLQlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CiAJc3RydWN0IGNvbXBvdW5kX2hkciBoZHI7CiAJaW50IHN0YXR1czsKIAotCXhkcl9pbml0X2RlY29kZSgmeGRyLCAmcnFzdHAtPnJxX3Jjdl9idWYsIHApOwotCXN0YXR1cyA9IGRlY29kZV9jb21wb3VuZF9oZHIoJnhkciwgJmhkcik7CisJc3RhdHVzID0gZGVjb2RlX2NvbXBvdW5kX2hkcih4ZHIsICZoZHIpOwogCWlmIChzdGF0dXMpCiAJCWdvdG8gb3V0OwotCXN0YXR1cyA9IGRlY29kZV9zZXF1ZW5jZSgmeGRyLCAmcmVzLT5zZXFfcmVzLCBycXN0cCk7CisJc3RhdHVzID0gZGVjb2RlX3NlcXVlbmNlKHhkciwgJnJlcy0+c2VxX3JlcywgcnFzdHApOwogCWlmIChzdGF0dXMpCiAJCWdvdG8gb3V0OwotCXN0YXR1cyA9IGRlY29kZV9wdXRmaCgmeGRyKTsKKwlzdGF0dXMgPSBkZWNvZGVfcHV0ZmgoeGRyKTsKIAlpZiAoc3RhdHVzKQogCQlnb3RvIG91dDsKLQlzdGF0dXMgPSBkZWNvZGVfZ2V0YWNsKCZ4ZHIsIHJxc3RwLCAmcmVzLT5hY2xfbGVuKTsKKwlzdGF0dXMgPSBkZWNvZGVfZ2V0YWNsKHhkciwgcnFzdHAsICZyZXMtPmFjbF9sZW4pOwogCiBvdXQ6CiAJcmV0dXJuIHN0YXR1czsKQEAgLTU0NDIsMjMgKzUzNzIsMjIgQEAKIC8qCiAgKiBEZWNvZGUgQ0xPU0UgcmVzcG9uc2UKICAqLwotc3RhdGljIGludCBuZnM0X3hkcl9kZWNfY2xvc2Uoc3RydWN0IHJwY19ycXN0ICpycXN0cCwgX19iZTMyICpwLCBzdHJ1Y3QgbmZzX2Nsb3NlcmVzICpyZXMpCitzdGF0aWMgaW50IG5mczRfeGRyX2RlY19jbG9zZShzdHJ1Y3QgcnBjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAorCQkJICAgICAgc3RydWN0IG5mc19jbG9zZXJlcyAqcmVzKQogewotCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKIAlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkcjsKIAlpbnQgc3RhdHVzOwogCi0JeGRyX2luaXRfZGVjb2RlKCZ4ZHIsICZycXN0cC0+cnFfcmN2X2J1ZiwgcCk7Ci0Jc3RhdHVzID0gZGVjb2RlX2NvbXBvdW5kX2hkcigmeGRyLCAmaGRyKTsKKwlzdGF0dXMgPSBkZWNvZGVfY29tcG91bmRfaGRyKHhkciwgJmhkcik7CiAJaWYgKHN0YXR1cykKIAkJZ290byBvdXQ7Ci0Jc3RhdHVzID0gZGVjb2RlX3NlcXVlbmNlKCZ4ZHIsICZyZXMtPnNlcV9yZXMsIHJxc3RwKTsKKwlzdGF0dXMgPSBkZWNvZGVfc2VxdWVuY2UoeGRyLCAmcmVzLT5zZXFfcmVzLCBycXN0cCk7CiAJaWYgKHN0YXR1cykKIAkJZ290byBvdXQ7Ci0Jc3RhdHVzID0gZGVjb2RlX3B1dGZoKCZ4ZHIpOworCXN0YXR1cyA9IGRlY29kZV9wdXRmaCh4ZHIpOwogCWlmIChzdGF0dXMpCiAJCWdvdG8gb3V0OwotCXN0YXR1cyA9IGRlY29kZV9jbG9zZSgmeGRyLCByZXMpOworCXN0YXR1cyA9IGRlY29kZV9jbG9zZSh4ZHIsIHJlcyk7CiAJaWYgKHN0YXR1cyAhPSAwKQogCQlnb3RvIG91dDsKIAkvKgpAQCAtNTQ2Nyw3ICs1Mzk2LDcgQEAKIAkgKiAJYW4gRVNUQUxFIGVycm9yLiBTaG91bGRuJ3QgYmUgYSBwcm9ibGVtLAogCSAqIAl0aG91Z2gsIHNpbmNlIGZhdHRyLT52YWxpZCB3aWxsIHJlbWFpbiB1bnNldC4KIAkgKi8KLQlkZWNvZGVfZ2V0ZmF0dHIoJnhkciwgcmVzLT5mYXR0ciwgcmVzLT5zZXJ2ZXIsCisJZGVjb2RlX2dldGZhdHRyKHhkciwgcmVzLT5mYXR0ciwgcmVzLT5zZXJ2ZXIsCiAJCQkhUlBDX0lTX0FTWU5DKHJxc3RwLT5ycV90YXNrKSk7CiBvdXQ6CiAJcmV0dXJuIHN0YXR1czsKQEAgLTU0NzYsMzYgKzU0MDUsMzUgQEAKIC8qCiAgKiBEZWNvZGUgT1BFTiByZXNwb25zZQogICovCi1zdGF0aWMgaW50IG5mczRfeGRyX2RlY19vcGVuKHN0cnVjdCBycGNfcnFzdCAqcnFzdHAsIF9fYmUzMiAqcCwgc3RydWN0IG5mc19vcGVucmVzICpyZXMpCitzdGF0aWMgaW50IG5mczRfeGRyX2RlY19vcGVuKHN0cnVjdCBycGNfcnFzdCAqcnFzdHAsIHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCisJCQkgICAgIHN0cnVjdCBuZnNfb3BlbnJlcyAqcmVzKQogewotCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKIAlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkcjsKIAlpbnQgc3RhdHVzOwogCi0JeGRyX2luaXRfZGVjb2RlKCZ4ZHIsICZycXN0cC0+cnFfcmN2X2J1ZiwgcCk7Ci0Jc3RhdHVzID0gZGVjb2RlX2NvbXBvdW5kX2hkcigmeGRyLCAmaGRyKTsKKwlzdGF0dXMgPSBkZWNvZGVfY29tcG91bmRfaGRyKHhkciwgJmhkcik7CiAJaWYgKHN0YXR1cykKIAkJZ290byBvdXQ7Ci0Jc3RhdHVzID0gZGVjb2RlX3NlcXVlbmNlKCZ4ZHIsICZyZXMtPnNlcV9yZXMsIHJxc3RwKTsKKwlzdGF0dXMgPSBkZWNvZGVfc2VxdWVuY2UoeGRyLCAmcmVzLT5zZXFfcmVzLCBycXN0cCk7CiAJaWYgKHN0YXR1cykKIAkJZ290byBvdXQ7Ci0Jc3RhdHVzID0gZGVjb2RlX3B1dGZoKCZ4ZHIpOworCXN0YXR1cyA9IGRlY29kZV9wdXRmaCh4ZHIpOwogCWlmIChzdGF0dXMpCiAJCWdvdG8gb3V0OwotCXN0YXR1cyA9IGRlY29kZV9zYXZlZmgoJnhkcik7CisJc3RhdHVzID0gZGVjb2RlX3NhdmVmaCh4ZHIpOwogCWlmIChzdGF0dXMpCiAJCWdvdG8gb3V0OwotCXN0YXR1cyA9IGRlY29kZV9vcGVuKCZ4ZHIsIHJlcyk7CisJc3RhdHVzID0gZGVjb2RlX29wZW4oeGRyLCByZXMpOwogCWlmIChzdGF0dXMpCiAJCWdvdG8gb3V0OwotCWlmIChkZWNvZGVfZ2V0ZmgoJnhkciwgJnJlcy0+ZmgpICE9IDApCisJaWYgKGRlY29kZV9nZXRmaCh4ZHIsICZyZXMtPmZoKSAhPSAwKQogCQlnb3RvIG91dDsKLQlpZiAoZGVjb2RlX2dldGZhdHRyKCZ4ZHIsIHJlcy0+Zl9hdHRyLCByZXMtPnNlcnZlciwKKwlpZiAoZGVjb2RlX2dldGZhdHRyKHhkciwgcmVzLT5mX2F0dHIsIHJlcy0+c2VydmVyLAogCQkJCSFSUENfSVNfQVNZTkMocnFzdHAtPnJxX3Rhc2spKSAhPSAwKQogCQlnb3RvIG91dDsKLQlpZiAoZGVjb2RlX3Jlc3RvcmVmaCgmeGRyKSAhPSAwKQorCWlmIChkZWNvZGVfcmVzdG9yZWZoKHhkcikgIT0gMCkKIAkJZ290byBvdXQ7Ci0JZGVjb2RlX2dldGZhdHRyKCZ4ZHIsIHJlcy0+ZGlyX2F0dHIsIHJlcy0+c2VydmVyLAorCWRlY29kZV9nZXRmYXR0cih4ZHIsIHJlcy0+ZGlyX2F0dHIsIHJlcy0+c2VydmVyLAogCQkJIVJQQ19JU19BU1lOQyhycXN0cC0+cnFfdGFzaykpOwogb3V0OgogCXJldHVybiBzdGF0dXM7CkBAIC01NTE0LDIwICs1NDQyLDIwIEBACiAvKgogICogRGVjb2RlIE9QRU5fQ09ORklSTSByZXNwb25zZQogICovCi1zdGF0aWMgaW50IG5mczRfeGRyX2RlY19vcGVuX2NvbmZpcm0oc3RydWN0IHJwY19ycXN0ICpycXN0cCwgX19iZTMyICpwLCBzdHJ1Y3QgbmZzX29wZW5fY29uZmlybXJlcyAqcmVzKQorc3RhdGljIGludCBuZnM0X3hkcl9kZWNfb3Blbl9jb25maXJtKHN0cnVjdCBycGNfcnFzdCAqcnFzdHAsCisJCQkJICAgICBzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAorCQkJCSAgICAgc3RydWN0IG5mc19vcGVuX2NvbmZpcm1yZXMgKnJlcykKIHsKLQlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CiAJc3RydWN0IGNvbXBvdW5kX2hkciBoZHI7CiAJaW50IHN0YXR1czsKIAotCXhkcl9pbml0X2RlY29kZSgmeGRyLCAmcnFzdHAtPnJxX3Jjdl9idWYsIHApOwotCXN0YXR1cyA9IGRlY29kZV9jb21wb3VuZF9oZHIoJnhkciwgJmhkcik7CisJc3RhdHVzID0gZGVjb2RlX2NvbXBvdW5kX2hkcih4ZHIsICZoZHIpOwogCWlmIChzdGF0dXMpCiAJCWdvdG8gb3V0OwotCXN0YXR1cyA9IGRlY29kZV9wdXRmaCgmeGRyKTsKKwlzdGF0dXMgPSBkZWNvZGVfcHV0ZmgoeGRyKTsKIAlpZiAoc3RhdHVzKQogCQlnb3RvIG91dDsKLQlzdGF0dXMgPSBkZWNvZGVfb3Blbl9jb25maXJtKCZ4ZHIsIHJlcyk7CisJc3RhdHVzID0gZGVjb2RlX29wZW5fY29uZmlybSh4ZHIsIHJlcyk7CiBvdXQ6CiAJcmV0dXJuIHN0YXR1czsKIH0KQEAgLTU1MzUsMjYgKzU0NjMsMjYgQEAKIC8qCiAgKiBEZWNvZGUgT1BFTiByZXNwb25zZQogICovCi1zdGF0aWMgaW50IG5mczRfeGRyX2RlY19vcGVuX25vYXR0cihzdHJ1Y3QgcnBjX3Jxc3QgKnJxc3RwLCBfX2JlMzIgKnAsIHN0cnVjdCBuZnNfb3BlbnJlcyAqcmVzKQorc3RhdGljIGludCBuZnM0X3hkcl9kZWNfb3Blbl9ub2F0dHIoc3RydWN0IHJwY19ycXN0ICpycXN0cCwKKwkJCQkgICAgc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKKwkJCQkgICAgc3RydWN0IG5mc19vcGVucmVzICpyZXMpCiB7Ci0Jc3RydWN0IHhkcl9zdHJlYW0geGRyOwogCXN0cnVjdCBjb21wb3VuZF9oZHIgaGRyOwogCWludCBzdGF0dXM7CiAKLQl4ZHJfaW5pdF9kZWNvZGUoJnhkciwgJnJxc3RwLT5ycV9yY3ZfYnVmLCBwKTsKLQlzdGF0dXMgPSBkZWNvZGVfY29tcG91bmRfaGRyKCZ4ZHIsICZoZHIpOworCXN0YXR1cyA9IGRlY29kZV9jb21wb3VuZF9oZHIoeGRyLCAmaGRyKTsKIAlpZiAoc3RhdHVzKQogCQlnb3RvIG91dDsKLQlzdGF0dXMgPSBkZWNvZGVfc2VxdWVuY2UoJnhkciwgJnJlcy0+c2VxX3JlcywgcnFzdHApOworCXN0YXR1cyA9IGRlY29kZV9zZXF1ZW5jZSh4ZHIsICZyZXMtPnNlcV9yZXMsIHJxc3RwKTsKIAlpZiAoc3RhdHVzKQogCQlnb3RvIG91dDsKLQlzdGF0dXMgPSBkZWNvZGVfcHV0ZmgoJnhkcik7CisJc3RhdHVzID0gZGVjb2RlX3B1dGZoKHhkcik7CiAJaWYgKHN0YXR1cykKIAkJZ290byBvdXQ7Ci0Jc3RhdHVzID0gZGVjb2RlX29wZW4oJnhkciwgcmVzKTsKKwlzdGF0dXMgPSBkZWNvZGVfb3Blbih4ZHIsIHJlcyk7CiAJaWYgKHN0YXR1cykKIAkJZ290byBvdXQ7Ci0JZGVjb2RlX2dldGZhdHRyKCZ4ZHIsIHJlcy0+Zl9hdHRyLCByZXMtPnNlcnZlciwKKwlkZWNvZGVfZ2V0ZmF0dHIoeGRyLCByZXMtPmZfYXR0ciwgcmVzLT5zZXJ2ZXIsCiAJCQkhUlBDX0lTX0FTWU5DKHJxc3RwLT5ycV90YXNrKSk7CiBvdXQ6CiAJcmV0dXJuIHN0YXR1czsKQEAgLTU1NjMsMjYgKzU0OTEsMjYgQEAKIC8qCiAgKiBEZWNvZGUgU0VUQVRUUiByZXNwb25zZQogICovCi1zdGF0aWMgaW50IG5mczRfeGRyX2RlY19zZXRhdHRyKHN0cnVjdCBycGNfcnFzdCAqcnFzdHAsIF9fYmUzMiAqcCwgc3RydWN0IG5mc19zZXRhdHRycmVzICpyZXMpCitzdGF0aWMgaW50IG5mczRfeGRyX2RlY19zZXRhdHRyKHN0cnVjdCBycGNfcnFzdCAqcnFzdHAsCisJCQkJc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKKwkJCQlzdHJ1Y3QgbmZzX3NldGF0dHJyZXMgKnJlcykKIHsKLQlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CiAJc3RydWN0IGNvbXBvdW5kX2hkciBoZHI7CiAJaW50IHN0YXR1czsKIAotCXhkcl9pbml0X2RlY29kZSgmeGRyLCAmcnFzdHAtPnJxX3Jjdl9idWYsIHApOwotCXN0YXR1cyA9IGRlY29kZV9jb21wb3VuZF9oZHIoJnhkciwgJmhkcik7CisJc3RhdHVzID0gZGVjb2RlX2NvbXBvdW5kX2hkcih4ZHIsICZoZHIpOwogCWlmIChzdGF0dXMpCiAJCWdvdG8gb3V0OwotCXN0YXR1cyA9IGRlY29kZV9zZXF1ZW5jZSgmeGRyLCAmcmVzLT5zZXFfcmVzLCBycXN0cCk7CisJc3RhdHVzID0gZGVjb2RlX3NlcXVlbmNlKHhkciwgJnJlcy0+c2VxX3JlcywgcnFzdHApOwogCWlmIChzdGF0dXMpCiAJCWdvdG8gb3V0OwotCXN0YXR1cyA9IGRlY29kZV9wdXRmaCgmeGRyKTsKKwlzdGF0dXMgPSBkZWNvZGVfcHV0ZmgoeGRyKTsKIAlpZiAoc3RhdHVzKQogCQlnb3RvIG91dDsKLQlzdGF0dXMgPSBkZWNvZGVfc2V0YXR0cigmeGRyKTsKKwlzdGF0dXMgPSBkZWNvZGVfc2V0YXR0cih4ZHIpOwogCWlmIChzdGF0dXMpCiAJCWdvdG8gb3V0OwotCWRlY29kZV9nZXRmYXR0cigmeGRyLCByZXMtPmZhdHRyLCByZXMtPnNlcnZlciwKKwlkZWNvZGVfZ2V0ZmF0dHIoeGRyLCByZXMtPmZhdHRyLCByZXMtPnNlcnZlciwKIAkJCSFSUENfSVNfQVNZTkMocnFzdHAtPnJxX3Rhc2spKTsKIG91dDoKIAlyZXR1cm4gc3RhdHVzOwpAQCAtNTU5MSwyMyArNTUxOSwyMiBAQAogLyoKICAqIERlY29kZSBMT0NLIHJlc3BvbnNlCiAgKi8KLXN0YXRpYyBpbnQgbmZzNF94ZHJfZGVjX2xvY2soc3RydWN0IHJwY19ycXN0ICpycXN0cCwgX19iZTMyICpwLCBzdHJ1Y3QgbmZzX2xvY2tfcmVzICpyZXMpCitzdGF0aWMgaW50IG5mczRfeGRyX2RlY19sb2NrKHN0cnVjdCBycGNfcnFzdCAqcnFzdHAsIHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCisJCQkgICAgIHN0cnVjdCBuZnNfbG9ja19yZXMgKnJlcykKIHsKLQlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CiAJc3RydWN0IGNvbXBvdW5kX2hkciBoZHI7CiAJaW50IHN0YXR1czsKIAotCXhkcl9pbml0X2RlY29kZSgmeGRyLCAmcnFzdHAtPnJxX3Jjdl9idWYsIHApOwotCXN0YXR1cyA9IGRlY29kZV9jb21wb3VuZF9oZHIoJnhkciwgJmhkcik7CisJc3RhdHVzID0gZGVjb2RlX2NvbXBvdW5kX2hkcih4ZHIsICZoZHIpOwogCWlmIChzdGF0dXMpCiAJCWdvdG8gb3V0OwotCXN0YXR1cyA9IGRlY29kZV9zZXF1ZW5jZSgmeGRyLCAmcmVzLT5zZXFfcmVzLCBycXN0cCk7CisJc3RhdHVzID0gZGVjb2RlX3NlcXVlbmNlKHhkciwgJnJlcy0+c2VxX3JlcywgcnFzdHApOwogCWlmIChzdGF0dXMpCiAJCWdvdG8gb3V0OwotCXN0YXR1cyA9IGRlY29kZV9wdXRmaCgmeGRyKTsKKwlzdGF0dXMgPSBkZWNvZGVfcHV0ZmgoeGRyKTsKIAlpZiAoc3RhdHVzKQogCQlnb3RvIG91dDsKLQlzdGF0dXMgPSBkZWNvZGVfbG9jaygmeGRyLCByZXMpOworCXN0YXR1cyA9IGRlY29kZV9sb2NrKHhkciwgcmVzKTsKIG91dDoKIAlyZXR1cm4gc3RhdHVzOwogfQpAQCAtNTYxNSwyMyArNTU0MiwyMiBAQAogLyoKICAqIERlY29kZSBMT0NLVCByZXNwb25zZQogICovCi1zdGF0aWMgaW50IG5mczRfeGRyX2RlY19sb2NrdChzdHJ1Y3QgcnBjX3Jxc3QgKnJxc3RwLCBfX2JlMzIgKnAsIHN0cnVjdCBuZnNfbG9ja3RfcmVzICpyZXMpCitzdGF0aWMgaW50IG5mczRfeGRyX2RlY19sb2NrdChzdHJ1Y3QgcnBjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAorCQkJICAgICAgc3RydWN0IG5mc19sb2NrdF9yZXMgKnJlcykKIHsKLQlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CiAJc3RydWN0IGNvbXBvdW5kX2hkciBoZHI7CiAJaW50IHN0YXR1czsKIAotCXhkcl9pbml0X2RlY29kZSgmeGRyLCAmcnFzdHAtPnJxX3Jjdl9idWYsIHApOwotCXN0YXR1cyA9IGRlY29kZV9jb21wb3VuZF9oZHIoJnhkciwgJmhkcik7CisJc3RhdHVzID0gZGVjb2RlX2NvbXBvdW5kX2hkcih4ZHIsICZoZHIpOwogCWlmIChzdGF0dXMpCiAJCWdvdG8gb3V0OwotCXN0YXR1cyA9IGRlY29kZV9zZXF1ZW5jZSgmeGRyLCAmcmVzLT5zZXFfcmVzLCBycXN0cCk7CisJc3RhdHVzID0gZGVjb2RlX3NlcXVlbmNlKHhkciwgJnJlcy0+c2VxX3JlcywgcnFzdHApOwogCWlmIChzdGF0dXMpCiAJCWdvdG8gb3V0OwotCXN0YXR1cyA9IGRlY29kZV9wdXRmaCgmeGRyKTsKKwlzdGF0dXMgPSBkZWNvZGVfcHV0ZmgoeGRyKTsKIAlpZiAoc3RhdHVzKQogCQlnb3RvIG91dDsKLQlzdGF0dXMgPSBkZWNvZGVfbG9ja3QoJnhkciwgcmVzKTsKKwlzdGF0dXMgPSBkZWNvZGVfbG9ja3QoeGRyLCByZXMpOwogb3V0OgogCXJldHVybiBzdGF0dXM7CiB9CkBAIC01NjM5LDYxICs1NTY1LDU4IEBACiAvKgogICogRGVjb2RlIExPQ0tVIHJlc3BvbnNlCiAgKi8KLXN0YXRpYyBpbnQgbmZzNF94ZHJfZGVjX2xvY2t1KHN0cnVjdCBycGNfcnFzdCAqcnFzdHAsIF9fYmUzMiAqcCwgc3RydWN0IG5mc19sb2NrdV9yZXMgKnJlcykKK3N0YXRpYyBpbnQgbmZzNF94ZHJfZGVjX2xvY2t1KHN0cnVjdCBycGNfcnFzdCAqcnFzdHAsIHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCisJCQkgICAgICBzdHJ1Y3QgbmZzX2xvY2t1X3JlcyAqcmVzKQogewotCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKIAlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkcjsKIAlpbnQgc3RhdHVzOwogCi0JeGRyX2luaXRfZGVjb2RlKCZ4ZHIsICZycXN0cC0+cnFfcmN2X2J1ZiwgcCk7Ci0Jc3RhdHVzID0gZGVjb2RlX2NvbXBvdW5kX2hkcigmeGRyLCAmaGRyKTsKKwlzdGF0dXMgPSBkZWNvZGVfY29tcG91bmRfaGRyKHhkciwgJmhkcik7CiAJaWYgKHN0YXR1cykKIAkJZ290byBvdXQ7Ci0Jc3RhdHVzID0gZGVjb2RlX3NlcXVlbmNlKCZ4ZHIsICZyZXMtPnNlcV9yZXMsIHJxc3RwKTsKKwlzdGF0dXMgPSBkZWNvZGVfc2VxdWVuY2UoeGRyLCAmcmVzLT5zZXFfcmVzLCBycXN0cCk7CiAJaWYgKHN0YXR1cykKIAkJZ290byBvdXQ7Ci0Jc3RhdHVzID0gZGVjb2RlX3B1dGZoKCZ4ZHIpOworCXN0YXR1cyA9IGRlY29kZV9wdXRmaCh4ZHIpOwogCWlmIChzdGF0dXMpCiAJCWdvdG8gb3V0OwotCXN0YXR1cyA9IGRlY29kZV9sb2NrdSgmeGRyLCByZXMpOworCXN0YXR1cyA9IGRlY29kZV9sb2NrdSh4ZHIsIHJlcyk7CiBvdXQ6CiAJcmV0dXJuIHN0YXR1czsKIH0KIAotc3RhdGljIGludCBuZnM0X3hkcl9kZWNfcmVsZWFzZV9sb2Nrb3duZXIoc3RydWN0IHJwY19ycXN0ICpycXN0cCwgX19iZTMyICpwLCB2b2lkICpkdW1teSkKK3N0YXRpYyBpbnQgbmZzNF94ZHJfZGVjX3JlbGVhc2VfbG9ja293bmVyKHN0cnVjdCBycGNfcnFzdCAqcnFzdHAsCisJCQkJCSAgc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgdm9pZCAqZHVtbXkpCiB7Ci0Jc3RydWN0IHhkcl9zdHJlYW0geGRyOwogCXN0cnVjdCBjb21wb3VuZF9oZHIgaGRyOwogCWludCBzdGF0dXM7CiAKLQl4ZHJfaW5pdF9kZWNvZGUoJnhkciwgJnJxc3RwLT5ycV9yY3ZfYnVmLCBwKTsKLQlzdGF0dXMgPSBkZWNvZGVfY29tcG91bmRfaGRyKCZ4ZHIsICZoZHIpOworCXN0YXR1cyA9IGRlY29kZV9jb21wb3VuZF9oZHIoeGRyLCAmaGRyKTsKIAlpZiAoIXN0YXR1cykKLQkJc3RhdHVzID0gZGVjb2RlX3JlbGVhc2VfbG9ja293bmVyKCZ4ZHIpOworCQlzdGF0dXMgPSBkZWNvZGVfcmVsZWFzZV9sb2Nrb3duZXIoeGRyKTsKIAlyZXR1cm4gc3RhdHVzOwogfQogCiAvKgogICogRGVjb2RlIFJFQURMSU5LIHJlc3BvbnNlCiAgKi8KLXN0YXRpYyBpbnQgbmZzNF94ZHJfZGVjX3JlYWRsaW5rKHN0cnVjdCBycGNfcnFzdCAqcnFzdHAsIF9fYmUzMiAqcCwKK3N0YXRpYyBpbnQgbmZzNF94ZHJfZGVjX3JlYWRsaW5rKHN0cnVjdCBycGNfcnFzdCAqcnFzdHAsCisJCQkJIHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCiAJCQkJIHN0cnVjdCBuZnM0X3JlYWRsaW5rX3JlcyAqcmVzKQogewotCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKIAlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkcjsKIAlpbnQgc3RhdHVzOwogCi0JeGRyX2luaXRfZGVjb2RlKCZ4ZHIsICZycXN0cC0+cnFfcmN2X2J1ZiwgcCk7Ci0Jc3RhdHVzID0gZGVjb2RlX2NvbXBvdW5kX2hkcigmeGRyLCAmaGRyKTsKKwlzdGF0dXMgPSBkZWNvZGVfY29tcG91bmRfaGRyKHhkciwgJmhkcik7CiAJaWYgKHN0YXR1cykKIAkJZ290byBvdXQ7Ci0Jc3RhdHVzID0gZGVjb2RlX3NlcXVlbmNlKCZ4ZHIsICZyZXMtPnNlcV9yZXMsIHJxc3RwKTsKKwlzdGF0dXMgPSBkZWNvZGVfc2VxdWVuY2UoeGRyLCAmcmVzLT5zZXFfcmVzLCBycXN0cCk7CiAJaWYgKHN0YXR1cykKIAkJZ290byBvdXQ7Ci0Jc3RhdHVzID0gZGVjb2RlX3B1dGZoKCZ4ZHIpOworCXN0YXR1cyA9IGRlY29kZV9wdXRmaCh4ZHIpOwogCWlmIChzdGF0dXMpCiAJCWdvdG8gb3V0OwotCXN0YXR1cyA9IGRlY29kZV9yZWFkbGluaygmeGRyLCBycXN0cCk7CisJc3RhdHVzID0gZGVjb2RlX3JlYWRsaW5rKHhkciwgcnFzdHApOwogb3V0OgogCXJldHVybiBzdGF0dXM7CiB9CkBAIC01NzAxLDIzICs1NjI0LDIyIEBACiAvKgogICogRGVjb2RlIFJFQURESVIgcmVzcG9uc2UKICAqLwotc3RhdGljIGludCBuZnM0X3hkcl9kZWNfcmVhZGRpcihzdHJ1Y3QgcnBjX3Jxc3QgKnJxc3RwLCBfX2JlMzIgKnAsIHN0cnVjdCBuZnM0X3JlYWRkaXJfcmVzICpyZXMpCitzdGF0aWMgaW50IG5mczRfeGRyX2RlY19yZWFkZGlyKHN0cnVjdCBycGNfcnFzdCAqcnFzdHAsIHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCisJCQkJc3RydWN0IG5mczRfcmVhZGRpcl9yZXMgKnJlcykKIHsKLQlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CiAJc3RydWN0IGNvbXBvdW5kX2hkciBoZHI7CiAJaW50IHN0YXR1czsKIAotCXhkcl9pbml0X2RlY29kZSgmeGRyLCAmcnFzdHAtPnJxX3Jjdl9idWYsIHApOwotCXN0YXR1cyA9IGRlY29kZV9jb21wb3VuZF9oZHIoJnhkciwgJmhkcik7CisJc3RhdHVzID0gZGVjb2RlX2NvbXBvdW5kX2hkcih4ZHIsICZoZHIpOwogCWlmIChzdGF0dXMpCiAJCWdvdG8gb3V0OwotCXN0YXR1cyA9IGRlY29kZV9zZXF1ZW5jZSgmeGRyLCAmcmVzLT5zZXFfcmVzLCBycXN0cCk7CisJc3RhdHVzID0gZGVjb2RlX3NlcXVlbmNlKHhkciwgJnJlcy0+c2VxX3JlcywgcnFzdHApOwogCWlmIChzdGF0dXMpCiAJCWdvdG8gb3V0OwotCXN0YXR1cyA9IGRlY29kZV9wdXRmaCgmeGRyKTsKKwlzdGF0dXMgPSBkZWNvZGVfcHV0ZmgoeGRyKTsKIAlpZiAoc3RhdHVzKQogCQlnb3RvIG91dDsKLQlzdGF0dXMgPSBkZWNvZGVfcmVhZGRpcigmeGRyLCBycXN0cCwgcmVzKTsKKwlzdGF0dXMgPSBkZWNvZGVfcmVhZGRpcih4ZHIsIHJxc3RwLCByZXMpOwogb3V0OgogCXJldHVybiBzdGF0dXM7CiB9CkBAIC01NzI1LDIzICs1NjQ3LDIyIEBACiAvKgogICogRGVjb2RlIFJlYWQgcmVzcG9uc2UKICAqLwotc3RhdGljIGludCBuZnM0X3hkcl9kZWNfcmVhZChzdHJ1Y3QgcnBjX3Jxc3QgKnJxc3RwLCBfX2JlMzIgKnAsIHN0cnVjdCBuZnNfcmVhZHJlcyAqcmVzKQorc3RhdGljIGludCBuZnM0X3hkcl9kZWNfcmVhZChzdHJ1Y3QgcnBjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAorCQkJICAgICBzdHJ1Y3QgbmZzX3JlYWRyZXMgKnJlcykKIHsKLQlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CiAJc3RydWN0IGNvbXBvdW5kX2hkciBoZHI7CiAJaW50IHN0YXR1czsKIAotCXhkcl9pbml0X2RlY29kZSgmeGRyLCAmcnFzdHAtPnJxX3Jjdl9idWYsIHApOwotCXN0YXR1cyA9IGRlY29kZV9jb21wb3VuZF9oZHIoJnhkciwgJmhkcik7CisJc3RhdHVzID0gZGVjb2RlX2NvbXBvdW5kX2hkcih4ZHIsICZoZHIpOwogCWlmIChzdGF0dXMpCiAJCWdvdG8gb3V0OwotCXN0YXR1cyA9IGRlY29kZV9zZXF1ZW5jZSgmeGRyLCAmcmVzLT5zZXFfcmVzLCBycXN0cCk7CisJc3RhdHVzID0gZGVjb2RlX3NlcXVlbmNlKHhkciwgJnJlcy0+c2VxX3JlcywgcnFzdHApOwogCWlmIChzdGF0dXMpCiAJCWdvdG8gb3V0OwotCXN0YXR1cyA9IGRlY29kZV9wdXRmaCgmeGRyKTsKKwlzdGF0dXMgPSBkZWNvZGVfcHV0ZmgoeGRyKTsKIAlpZiAoc3RhdHVzKQogCQlnb3RvIG91dDsKLQlzdGF0dXMgPSBkZWNvZGVfcmVhZCgmeGRyLCBycXN0cCwgcmVzKTsKKwlzdGF0dXMgPSBkZWNvZGVfcmVhZCh4ZHIsIHJxc3RwLCByZXMpOwogCWlmICghc3RhdHVzKQogCQlzdGF0dXMgPSByZXMtPmNvdW50Owogb3V0OgpAQCAtNTc1MSwyNiArNTY3MiwyNSBAQAogLyoKICAqIERlY29kZSBXUklURSByZXNwb25zZQogICovCi1zdGF0aWMgaW50IG5mczRfeGRyX2RlY193cml0ZShzdHJ1Y3QgcnBjX3Jxc3QgKnJxc3RwLCBfX2JlMzIgKnAsIHN0cnVjdCBuZnNfd3JpdGVyZXMgKnJlcykKK3N0YXRpYyBpbnQgbmZzNF94ZHJfZGVjX3dyaXRlKHN0cnVjdCBycGNfcnFzdCAqcnFzdHAsIHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCisJCQkgICAgICBzdHJ1Y3QgbmZzX3dyaXRlcmVzICpyZXMpCiB7Ci0Jc3RydWN0IHhkcl9zdHJlYW0geGRyOwogCXN0cnVjdCBjb21wb3VuZF9oZHIgaGRyOwogCWludCBzdGF0dXM7CiAKLQl4ZHJfaW5pdF9kZWNvZGUoJnhkciwgJnJxc3RwLT5ycV9yY3ZfYnVmLCBwKTsKLQlzdGF0dXMgPSBkZWNvZGVfY29tcG91bmRfaGRyKCZ4ZHIsICZoZHIpOworCXN0YXR1cyA9IGRlY29kZV9jb21wb3VuZF9oZHIoeGRyLCAmaGRyKTsKIAlpZiAoc3RhdHVzKQogCQlnb3RvIG91dDsKLQlzdGF0dXMgPSBkZWNvZGVfc2VxdWVuY2UoJnhkciwgJnJlcy0+c2VxX3JlcywgcnFzdHApOworCXN0YXR1cyA9IGRlY29kZV9zZXF1ZW5jZSh4ZHIsICZyZXMtPnNlcV9yZXMsIHJxc3RwKTsKIAlpZiAoc3RhdHVzKQogCQlnb3RvIG91dDsKLQlzdGF0dXMgPSBkZWNvZGVfcHV0ZmgoJnhkcik7CisJc3RhdHVzID0gZGVjb2RlX3B1dGZoKHhkcik7CiAJaWYgKHN0YXR1cykKIAkJZ290byBvdXQ7Ci0Jc3RhdHVzID0gZGVjb2RlX3dyaXRlKCZ4ZHIsIHJlcyk7CisJc3RhdHVzID0gZGVjb2RlX3dyaXRlKHhkciwgcmVzKTsKIAlpZiAoc3RhdHVzKQogCQlnb3RvIG91dDsKLQlkZWNvZGVfZ2V0ZmF0dHIoJnhkciwgcmVzLT5mYXR0ciwgcmVzLT5zZXJ2ZXIsCisJZGVjb2RlX2dldGZhdHRyKHhkciwgcmVzLT5mYXR0ciwgcmVzLT5zZXJ2ZXIsCiAJCQkhUlBDX0lTX0FTWU5DKHJxc3RwLT5ycV90YXNrKSk7CiAJaWYgKCFzdGF0dXMpCiAJCXN0YXR1cyA9IHJlcy0+Y291bnQ7CkBAIC01NzgxLDI2ICs1NzAxLDI1IEBACiAvKgogICogRGVjb2RlIENPTU1JVCByZXNwb25zZQogICovCi1zdGF0aWMgaW50IG5mczRfeGRyX2RlY19jb21taXQoc3RydWN0IHJwY19ycXN0ICpycXN0cCwgX19iZTMyICpwLCBzdHJ1Y3QgbmZzX3dyaXRlcmVzICpyZXMpCitzdGF0aWMgaW50IG5mczRfeGRyX2RlY19jb21taXQoc3RydWN0IHJwY19ycXN0ICpycXN0cCwgc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKKwkJCSAgICAgICBzdHJ1Y3QgbmZzX3dyaXRlcmVzICpyZXMpCiB7Ci0Jc3RydWN0IHhkcl9zdHJlYW0geGRyOwogCXN0cnVjdCBjb21wb3VuZF9oZHIgaGRyOwogCWludCBzdGF0dXM7CiAKLQl4ZHJfaW5pdF9kZWNvZGUoJnhkciwgJnJxc3RwLT5ycV9yY3ZfYnVmLCBwKTsKLQlzdGF0dXMgPSBkZWNvZGVfY29tcG91bmRfaGRyKCZ4ZHIsICZoZHIpOworCXN0YXR1cyA9IGRlY29kZV9jb21wb3VuZF9oZHIoeGRyLCAmaGRyKTsKIAlpZiAoc3RhdHVzKQogCQlnb3RvIG91dDsKLQlzdGF0dXMgPSBkZWNvZGVfc2VxdWVuY2UoJnhkciwgJnJlcy0+c2VxX3JlcywgcnFzdHApOworCXN0YXR1cyA9IGRlY29kZV9zZXF1ZW5jZSh4ZHIsICZyZXMtPnNlcV9yZXMsIHJxc3RwKTsKIAlpZiAoc3RhdHVzKQogCQlnb3RvIG91dDsKLQlzdGF0dXMgPSBkZWNvZGVfcHV0ZmgoJnhkcik7CisJc3RhdHVzID0gZGVjb2RlX3B1dGZoKHhkcik7CiAJaWYgKHN0YXR1cykKIAkJZ290byBvdXQ7Ci0Jc3RhdHVzID0gZGVjb2RlX2NvbW1pdCgmeGRyLCByZXMpOworCXN0YXR1cyA9IGRlY29kZV9jb21taXQoeGRyLCByZXMpOwogCWlmIChzdGF0dXMpCiAJCWdvdG8gb3V0OwotCWRlY29kZV9nZXRmYXR0cigmeGRyLCByZXMtPmZhdHRyLCByZXMtPnNlcnZlciwKKwlkZWNvZGVfZ2V0ZmF0dHIoeGRyLCByZXMtPmZhdHRyLCByZXMtPnNlcnZlciwKIAkJCSFSUENfSVNfQVNZTkMocnFzdHAtPnJxX3Rhc2spKTsKIG91dDoKIAlyZXR1cm4gc3RhdHVzOwpAQCAtNTgwOSw4NSArNTcyOCw4MCBAQAogLyoKICAqIERlY29kZSBGU0lORk8gcmVzcG9uc2UKICAqLwotc3RhdGljIGludCBuZnM0X3hkcl9kZWNfZnNpbmZvKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsCitzdGF0aWMgaW50IG5mczRfeGRyX2RlY19mc2luZm8oc3RydWN0IHJwY19ycXN0ICpyZXEsIHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCiAJCQkgICAgICAgc3RydWN0IG5mczRfZnNpbmZvX3JlcyAqcmVzKQogewotCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKIAlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkcjsKIAlpbnQgc3RhdHVzOwogCi0JeGRyX2luaXRfZGVjb2RlKCZ4ZHIsICZyZXEtPnJxX3Jjdl9idWYsIHApOwotCXN0YXR1cyA9IGRlY29kZV9jb21wb3VuZF9oZHIoJnhkciwgJmhkcik7CisJc3RhdHVzID0gZGVjb2RlX2NvbXBvdW5kX2hkcih4ZHIsICZoZHIpOwogCWlmICghc3RhdHVzKQotCQlzdGF0dXMgPSBkZWNvZGVfc2VxdWVuY2UoJnhkciwgJnJlcy0+c2VxX3JlcywgcmVxKTsKKwkJc3RhdHVzID0gZGVjb2RlX3NlcXVlbmNlKHhkciwgJnJlcy0+c2VxX3JlcywgcmVxKTsKIAlpZiAoIXN0YXR1cykKLQkJc3RhdHVzID0gZGVjb2RlX3B1dGZoKCZ4ZHIpOworCQlzdGF0dXMgPSBkZWNvZGVfcHV0ZmgoeGRyKTsKIAlpZiAoIXN0YXR1cykKLQkJc3RhdHVzID0gZGVjb2RlX2ZzaW5mbygmeGRyLCByZXMtPmZzaW5mbyk7CisJCXN0YXR1cyA9IGRlY29kZV9mc2luZm8oeGRyLCByZXMtPmZzaW5mbyk7CiAJcmV0dXJuIHN0YXR1czsKIH0KIAogLyoKICAqIERlY29kZSBQQVRIQ09ORiByZXNwb25zZQogICovCi1zdGF0aWMgaW50IG5mczRfeGRyX2RlY19wYXRoY29uZihzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLAorc3RhdGljIGludCBuZnM0X3hkcl9kZWNfcGF0aGNvbmYoc3RydWN0IHJwY19ycXN0ICpyZXEsIHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCiAJCQkJIHN0cnVjdCBuZnM0X3BhdGhjb25mX3JlcyAqcmVzKQogewotCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKIAlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkcjsKIAlpbnQgc3RhdHVzOwogCi0JeGRyX2luaXRfZGVjb2RlKCZ4ZHIsICZyZXEtPnJxX3Jjdl9idWYsIHApOwotCXN0YXR1cyA9IGRlY29kZV9jb21wb3VuZF9oZHIoJnhkciwgJmhkcik7CisJc3RhdHVzID0gZGVjb2RlX2NvbXBvdW5kX2hkcih4ZHIsICZoZHIpOwogCWlmICghc3RhdHVzKQotCQlzdGF0dXMgPSBkZWNvZGVfc2VxdWVuY2UoJnhkciwgJnJlcy0+c2VxX3JlcywgcmVxKTsKKwkJc3RhdHVzID0gZGVjb2RlX3NlcXVlbmNlKHhkciwgJnJlcy0+c2VxX3JlcywgcmVxKTsKIAlpZiAoIXN0YXR1cykKLQkJc3RhdHVzID0gZGVjb2RlX3B1dGZoKCZ4ZHIpOworCQlzdGF0dXMgPSBkZWNvZGVfcHV0ZmgoeGRyKTsKIAlpZiAoIXN0YXR1cykKLQkJc3RhdHVzID0gZGVjb2RlX3BhdGhjb25mKCZ4ZHIsIHJlcy0+cGF0aGNvbmYpOworCQlzdGF0dXMgPSBkZWNvZGVfcGF0aGNvbmYoeGRyLCByZXMtPnBhdGhjb25mKTsKIAlyZXR1cm4gc3RhdHVzOwogfQogCiAvKgogICogRGVjb2RlIFNUQVRGUyByZXNwb25zZQogICovCi1zdGF0aWMgaW50IG5mczRfeGRyX2RlY19zdGF0ZnMoc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwKK3N0YXRpYyBpbnQgbmZzNF94ZHJfZGVjX3N0YXRmcyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKIAkJCSAgICAgICBzdHJ1Y3QgbmZzNF9zdGF0ZnNfcmVzICpyZXMpCiB7Ci0Jc3RydWN0IHhkcl9zdHJlYW0geGRyOwogCXN0cnVjdCBjb21wb3VuZF9oZHIgaGRyOwogCWludCBzdGF0dXM7CiAKLQl4ZHJfaW5pdF9kZWNvZGUoJnhkciwgJnJlcS0+cnFfcmN2X2J1ZiwgcCk7Ci0Jc3RhdHVzID0gZGVjb2RlX2NvbXBvdW5kX2hkcigmeGRyLCAmaGRyKTsKKwlzdGF0dXMgPSBkZWNvZGVfY29tcG91bmRfaGRyKHhkciwgJmhkcik7CiAJaWYgKCFzdGF0dXMpCi0JCXN0YXR1cyA9IGRlY29kZV9zZXF1ZW5jZSgmeGRyLCAmcmVzLT5zZXFfcmVzLCByZXEpOworCQlzdGF0dXMgPSBkZWNvZGVfc2VxdWVuY2UoeGRyLCAmcmVzLT5zZXFfcmVzLCByZXEpOwogCWlmICghc3RhdHVzKQotCQlzdGF0dXMgPSBkZWNvZGVfcHV0ZmgoJnhkcik7CisJCXN0YXR1cyA9IGRlY29kZV9wdXRmaCh4ZHIpOwogCWlmICghc3RhdHVzKQotCQlzdGF0dXMgPSBkZWNvZGVfc3RhdGZzKCZ4ZHIsIHJlcy0+ZnNzdGF0KTsKKwkJc3RhdHVzID0gZGVjb2RlX3N0YXRmcyh4ZHIsIHJlcy0+ZnNzdGF0KTsKIAlyZXR1cm4gc3RhdHVzOwogfQogCiAvKgogICogRGVjb2RlIEdFVEFUVFJfQklUTUFQIHJlc3BvbnNlCiAgKi8KLXN0YXRpYyBpbnQgbmZzNF94ZHJfZGVjX3NlcnZlcl9jYXBzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsIHN0cnVjdCBuZnM0X3NlcnZlcl9jYXBzX3JlcyAqcmVzKQorc3RhdGljIGludCBuZnM0X3hkcl9kZWNfc2VydmVyX2NhcHMoc3RydWN0IHJwY19ycXN0ICpyZXEsCisJCQkJICAgIHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCisJCQkJICAgIHN0cnVjdCBuZnM0X3NlcnZlcl9jYXBzX3JlcyAqcmVzKQogewotCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKIAlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkcjsKIAlpbnQgc3RhdHVzOwogCi0JeGRyX2luaXRfZGVjb2RlKCZ4ZHIsICZyZXEtPnJxX3Jjdl9idWYsIHApOwotCXN0YXR1cyA9IGRlY29kZV9jb21wb3VuZF9oZHIoJnhkciwgJmhkcik7CisJc3RhdHVzID0gZGVjb2RlX2NvbXBvdW5kX2hkcih4ZHIsICZoZHIpOwogCWlmIChzdGF0dXMpCiAJCWdvdG8gb3V0OwotCXN0YXR1cyA9IGRlY29kZV9zZXF1ZW5jZSgmeGRyLCAmcmVzLT5zZXFfcmVzLCByZXEpOworCXN0YXR1cyA9IGRlY29kZV9zZXF1ZW5jZSh4ZHIsICZyZXMtPnNlcV9yZXMsIHJlcSk7CiAJaWYgKHN0YXR1cykKIAkJZ290byBvdXQ7Ci0JaWYgKChzdGF0dXMgPSBkZWNvZGVfcHV0ZmgoJnhkcikpICE9IDApCisJc3RhdHVzID0gZGVjb2RlX3B1dGZoKHhkcik7CisJaWYgKHN0YXR1cykKIAkJZ290byBvdXQ7Ci0Jc3RhdHVzID0gZGVjb2RlX3NlcnZlcl9jYXBzKCZ4ZHIsIHJlcyk7CisJc3RhdHVzID0gZGVjb2RlX3NlcnZlcl9jYXBzKHhkciwgcmVzKTsKIG91dDoKIAlyZXR1cm4gc3RhdHVzOwogfQpAQCAtNTg5NSw3OSArNTgwOSw3NyBAQAogLyoKICAqIERlY29kZSBSRU5FVyByZXNwb25zZQogICovCi1zdGF0aWMgaW50IG5mczRfeGRyX2RlY19yZW5ldyhzdHJ1Y3QgcnBjX3Jxc3QgKnJxc3RwLCBfX2JlMzIgKnAsIHZvaWQgKmR1bW15KQorc3RhdGljIGludCBuZnM0X3hkcl9kZWNfcmVuZXcoc3RydWN0IHJwY19ycXN0ICpycXN0cCwgc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKKwkJCSAgICAgIHZvaWQgKl9fdW51c2VkKQogewotCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKIAlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkcjsKIAlpbnQgc3RhdHVzOwogCi0JeGRyX2luaXRfZGVjb2RlKCZ4ZHIsICZycXN0cC0+cnFfcmN2X2J1ZiwgcCk7Ci0Jc3RhdHVzID0gZGVjb2RlX2NvbXBvdW5kX2hkcigmeGRyLCAmaGRyKTsKKwlzdGF0dXMgPSBkZWNvZGVfY29tcG91bmRfaGRyKHhkciwgJmhkcik7CiAJaWYgKCFzdGF0dXMpCi0JCXN0YXR1cyA9IGRlY29kZV9yZW5ldygmeGRyKTsKKwkJc3RhdHVzID0gZGVjb2RlX3JlbmV3KHhkcik7CiAJcmV0dXJuIHN0YXR1czsKIH0KIAogLyoKICAqIERlY29kZSBTRVRDTElFTlRJRCByZXNwb25zZQogICovCi1zdGF0aWMgaW50IG5mczRfeGRyX2RlY19zZXRjbGllbnRpZChzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLAotCQlzdHJ1Y3QgbmZzNF9zZXRjbGllbnRpZF9yZXMgKnJlcykKK3N0YXRpYyBpbnQgbmZzNF94ZHJfZGVjX3NldGNsaWVudGlkKHN0cnVjdCBycGNfcnFzdCAqcmVxLAorCQkJCSAgICBzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAorCQkJCSAgICBzdHJ1Y3QgbmZzNF9zZXRjbGllbnRpZF9yZXMgKnJlcykKIHsKLQlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CiAJc3RydWN0IGNvbXBvdW5kX2hkciBoZHI7CiAJaW50IHN0YXR1czsKIAotCXhkcl9pbml0X2RlY29kZSgmeGRyLCAmcmVxLT5ycV9yY3ZfYnVmLCBwKTsKLQlzdGF0dXMgPSBkZWNvZGVfY29tcG91bmRfaGRyKCZ4ZHIsICZoZHIpOworCXN0YXR1cyA9IGRlY29kZV9jb21wb3VuZF9oZHIoeGRyLCAmaGRyKTsKIAlpZiAoIXN0YXR1cykKLQkJc3RhdHVzID0gZGVjb2RlX3NldGNsaWVudGlkKCZ4ZHIsIHJlcyk7CisJCXN0YXR1cyA9IGRlY29kZV9zZXRjbGllbnRpZCh4ZHIsIHJlcyk7CiAJcmV0dXJuIHN0YXR1czsKIH0KIAogLyoKICAqIERlY29kZSBTRVRDTElFTlRJRF9DT05GSVJNIHJlc3BvbnNlCiAgKi8KLXN0YXRpYyBpbnQgbmZzNF94ZHJfZGVjX3NldGNsaWVudGlkX2NvbmZpcm0oc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwgc3RydWN0IG5mc19mc2luZm8gKmZzaW5mbykKK3N0YXRpYyBpbnQgbmZzNF94ZHJfZGVjX3NldGNsaWVudGlkX2NvbmZpcm0oc3RydWN0IHJwY19ycXN0ICpyZXEsCisJCQkJCSAgICBzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAorCQkJCQkgICAgc3RydWN0IG5mc19mc2luZm8gKmZzaW5mbykKIHsKLQlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CiAJc3RydWN0IGNvbXBvdW5kX2hkciBoZHI7CiAJaW50IHN0YXR1czsKIAotCXhkcl9pbml0X2RlY29kZSgmeGRyLCAmcmVxLT5ycV9yY3ZfYnVmLCBwKTsKLQlzdGF0dXMgPSBkZWNvZGVfY29tcG91bmRfaGRyKCZ4ZHIsICZoZHIpOworCXN0YXR1cyA9IGRlY29kZV9jb21wb3VuZF9oZHIoeGRyLCAmaGRyKTsKIAlpZiAoIXN0YXR1cykKLQkJc3RhdHVzID0gZGVjb2RlX3NldGNsaWVudGlkX2NvbmZpcm0oJnhkcik7CisJCXN0YXR1cyA9IGRlY29kZV9zZXRjbGllbnRpZF9jb25maXJtKHhkcik7CiAJaWYgKCFzdGF0dXMpCi0JCXN0YXR1cyA9IGRlY29kZV9wdXRyb290ZmgoJnhkcik7CisJCXN0YXR1cyA9IGRlY29kZV9wdXRyb290ZmgoeGRyKTsKIAlpZiAoIXN0YXR1cykKLQkJc3RhdHVzID0gZGVjb2RlX2ZzaW5mbygmeGRyLCBmc2luZm8pOworCQlzdGF0dXMgPSBkZWNvZGVfZnNpbmZvKHhkciwgZnNpbmZvKTsKIAlyZXR1cm4gc3RhdHVzOwogfQogCiAvKgogICogRGVjb2RlIERFTEVHUkVUVVJOIHJlc3BvbnNlCiAgKi8KLXN0YXRpYyBpbnQgbmZzNF94ZHJfZGVjX2RlbGVncmV0dXJuKHN0cnVjdCBycGNfcnFzdCAqcnFzdHAsIF9fYmUzMiAqcCwgc3RydWN0IG5mczRfZGVsZWdyZXR1cm5yZXMgKnJlcykKK3N0YXRpYyBpbnQgbmZzNF94ZHJfZGVjX2RlbGVncmV0dXJuKHN0cnVjdCBycGNfcnFzdCAqcnFzdHAsCisJCQkJICAgIHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCisJCQkJICAgIHN0cnVjdCBuZnM0X2RlbGVncmV0dXJucmVzICpyZXMpCiB7Ci0Jc3RydWN0IHhkcl9zdHJlYW0geGRyOwogCXN0cnVjdCBjb21wb3VuZF9oZHIgaGRyOwogCWludCBzdGF0dXM7CiAKLQl4ZHJfaW5pdF9kZWNvZGUoJnhkciwgJnJxc3RwLT5ycV9yY3ZfYnVmLCBwKTsKLQlzdGF0dXMgPSBkZWNvZGVfY29tcG91bmRfaGRyKCZ4ZHIsICZoZHIpOworCXN0YXR1cyA9IGRlY29kZV9jb21wb3VuZF9oZHIoeGRyLCAmaGRyKTsKIAlpZiAoc3RhdHVzKQogCQlnb3RvIG91dDsKLQlzdGF0dXMgPSBkZWNvZGVfc2VxdWVuY2UoJnhkciwgJnJlcy0+c2VxX3JlcywgcnFzdHApOworCXN0YXR1cyA9IGRlY29kZV9zZXF1ZW5jZSh4ZHIsICZyZXMtPnNlcV9yZXMsIHJxc3RwKTsKIAlpZiAoc3RhdHVzKQogCQlnb3RvIG91dDsKLQlzdGF0dXMgPSBkZWNvZGVfcHV0ZmgoJnhkcik7CisJc3RhdHVzID0gZGVjb2RlX3B1dGZoKHhkcik7CiAJaWYgKHN0YXR1cyAhPSAwKQogCQlnb3RvIG91dDsKLQlzdGF0dXMgPSBkZWNvZGVfZGVsZWdyZXR1cm4oJnhkcik7CisJc3RhdHVzID0gZGVjb2RlX2RlbGVncmV0dXJuKHhkcik7CiAJaWYgKHN0YXR1cyAhPSAwKQogCQlnb3RvIG91dDsKLQlkZWNvZGVfZ2V0ZmF0dHIoJnhkciwgcmVzLT5mYXR0ciwgcmVzLT5zZXJ2ZXIsCisJZGVjb2RlX2dldGZhdHRyKHhkciwgcmVzLT5mYXR0ciwgcmVzLT5zZXJ2ZXIsCiAJCQkhUlBDX0lTX0FTWU5DKHJxc3RwLT5ycV90YXNrKSk7CiBvdXQ6CiAJcmV0dXJuIHN0YXR1czsKQEAgLTU5NzYsMjYgKzU4ODgsMjcgQEAKIC8qCiAgKiBEZWNvZGUgRlNfTE9DQVRJT05TIHJlc3BvbnNlCiAgKi8KLXN0YXRpYyBpbnQgbmZzNF94ZHJfZGVjX2ZzX2xvY2F0aW9ucyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLAorc3RhdGljIGludCBuZnM0X3hkcl9kZWNfZnNfbG9jYXRpb25zKHN0cnVjdCBycGNfcnFzdCAqcmVxLAorCQkJCSAgICAgc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKIAkJCQkgICAgIHN0cnVjdCBuZnM0X2ZzX2xvY2F0aW9uc19yZXMgKnJlcykKIHsKLQlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CiAJc3RydWN0IGNvbXBvdW5kX2hkciBoZHI7CiAJaW50IHN0YXR1czsKIAotCXhkcl9pbml0X2RlY29kZSgmeGRyLCAmcmVxLT5ycV9yY3ZfYnVmLCBwKTsKLQlzdGF0dXMgPSBkZWNvZGVfY29tcG91bmRfaGRyKCZ4ZHIsICZoZHIpOworCXN0YXR1cyA9IGRlY29kZV9jb21wb3VuZF9oZHIoeGRyLCAmaGRyKTsKIAlpZiAoc3RhdHVzKQogCQlnb3RvIG91dDsKLQlzdGF0dXMgPSBkZWNvZGVfc2VxdWVuY2UoJnhkciwgJnJlcy0+c2VxX3JlcywgcmVxKTsKKwlzdGF0dXMgPSBkZWNvZGVfc2VxdWVuY2UoeGRyLCAmcmVzLT5zZXFfcmVzLCByZXEpOwogCWlmIChzdGF0dXMpCiAJCWdvdG8gb3V0OwotCWlmICgoc3RhdHVzID0gZGVjb2RlX3B1dGZoKCZ4ZHIpKSAhPSAwKQorCXN0YXR1cyA9IGRlY29kZV9wdXRmaCh4ZHIpOworCWlmIChzdGF0dXMpCiAJCWdvdG8gb3V0OwotCWlmICgoc3RhdHVzID0gZGVjb2RlX2xvb2t1cCgmeGRyKSkgIT0gMCkKKwlzdGF0dXMgPSBkZWNvZGVfbG9va3VwKHhkcik7CisJaWYgKHN0YXR1cykKIAkJZ290byBvdXQ7Ci0JeGRyX2VudGVyX3BhZ2UoJnhkciwgUEFHRV9TSVpFKTsKLQlzdGF0dXMgPSBkZWNvZGVfZ2V0ZmF0dHIoJnhkciwgJnJlcy0+ZnNfbG9jYXRpb25zLT5mYXR0ciwKKwl4ZHJfZW50ZXJfcGFnZSh4ZHIsIFBBR0VfU0laRSk7CisJc3RhdHVzID0gZGVjb2RlX2dldGZhdHRyKHhkciwgJnJlcy0+ZnNfbG9jYXRpb25zLT5mYXR0ciwKIAkJCQkgcmVzLT5mc19sb2NhdGlvbnMtPnNlcnZlciwKIAkJCQkgIVJQQ19JU19BU1lOQyhyZXEtPnJxX3Rhc2spKTsKIG91dDoKQEAgLTYwMDYsMTI5ICs1OTE5LDEyMiBAQAogLyoKICAqIERlY29kZSBFWENIQU5HRV9JRCByZXNwb25zZQogICovCi1zdGF0aWMgaW50IG5mczRfeGRyX2RlY19leGNoYW5nZV9pZChzdHJ1Y3QgcnBjX3Jxc3QgKnJxc3RwLCB1aW50MzJfdCAqcCwKK3N0YXRpYyBpbnQgbmZzNF94ZHJfZGVjX2V4Y2hhbmdlX2lkKHN0cnVjdCBycGNfcnFzdCAqcnFzdHAsCisJCQkJICAgIHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCiAJCQkJICAgIHZvaWQgKnJlcykKIHsKLQlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CiAJc3RydWN0IGNvbXBvdW5kX2hkciBoZHI7CiAJaW50IHN0YXR1czsKIAotCXhkcl9pbml0X2RlY29kZSgmeGRyLCAmcnFzdHAtPnJxX3Jjdl9idWYsIHApOwotCXN0YXR1cyA9IGRlY29kZV9jb21wb3VuZF9oZHIoJnhkciwgJmhkcik7CisJc3RhdHVzID0gZGVjb2RlX2NvbXBvdW5kX2hkcih4ZHIsICZoZHIpOwogCWlmICghc3RhdHVzKQotCQlzdGF0dXMgPSBkZWNvZGVfZXhjaGFuZ2VfaWQoJnhkciwgcmVzKTsKKwkJc3RhdHVzID0gZGVjb2RlX2V4Y2hhbmdlX2lkKHhkciwgcmVzKTsKIAlyZXR1cm4gc3RhdHVzOwogfQogCiAvKgogICogRGVjb2RlIENSRUFURV9TRVNTSU9OIHJlc3BvbnNlCiAgKi8KLXN0YXRpYyBpbnQgbmZzNF94ZHJfZGVjX2NyZWF0ZV9zZXNzaW9uKHN0cnVjdCBycGNfcnFzdCAqcnFzdHAsIHVpbnQzMl90ICpwLAorc3RhdGljIGludCBuZnM0X3hkcl9kZWNfY3JlYXRlX3Nlc3Npb24oc3RydWN0IHJwY19ycXN0ICpycXN0cCwKKwkJCQkgICAgICAgc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKIAkJCQkgICAgICAgc3RydWN0IG5mczQxX2NyZWF0ZV9zZXNzaW9uX3JlcyAqcmVzKQogewotCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKIAlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkcjsKIAlpbnQgc3RhdHVzOwogCi0JeGRyX2luaXRfZGVjb2RlKCZ4ZHIsICZycXN0cC0+cnFfcmN2X2J1ZiwgcCk7Ci0Jc3RhdHVzID0gZGVjb2RlX2NvbXBvdW5kX2hkcigmeGRyLCAmaGRyKTsKKwlzdGF0dXMgPSBkZWNvZGVfY29tcG91bmRfaGRyKHhkciwgJmhkcik7CiAJaWYgKCFzdGF0dXMpCi0JCXN0YXR1cyA9IGRlY29kZV9jcmVhdGVfc2Vzc2lvbigmeGRyLCByZXMpOworCQlzdGF0dXMgPSBkZWNvZGVfY3JlYXRlX3Nlc3Npb24oeGRyLCByZXMpOwogCXJldHVybiBzdGF0dXM7CiB9CiAKIC8qCiAgKiBEZWNvZGUgREVTVFJPWV9TRVNTSU9OIHJlc3BvbnNlCiAgKi8KLXN0YXRpYyBpbnQgbmZzNF94ZHJfZGVjX2Rlc3Ryb3lfc2Vzc2lvbihzdHJ1Y3QgcnBjX3Jxc3QgKnJxc3RwLCB1aW50MzJfdCAqcCwKLQkJCQkJdm9pZCAqZHVtbXkpCitzdGF0aWMgaW50IG5mczRfeGRyX2RlY19kZXN0cm95X3Nlc3Npb24oc3RydWN0IHJwY19ycXN0ICpycXN0cCwKKwkJCQkJc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKKwkJCQkJdm9pZCAqcmVzKQogewotCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKIAlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkcjsKIAlpbnQgc3RhdHVzOwogCi0JeGRyX2luaXRfZGVjb2RlKCZ4ZHIsICZycXN0cC0+cnFfcmN2X2J1ZiwgcCk7Ci0Jc3RhdHVzID0gZGVjb2RlX2NvbXBvdW5kX2hkcigmeGRyLCAmaGRyKTsKKwlzdGF0dXMgPSBkZWNvZGVfY29tcG91bmRfaGRyKHhkciwgJmhkcik7CiAJaWYgKCFzdGF0dXMpCi0JCXN0YXR1cyA9IGRlY29kZV9kZXN0cm95X3Nlc3Npb24oJnhkciwgZHVtbXkpOworCQlzdGF0dXMgPSBkZWNvZGVfZGVzdHJveV9zZXNzaW9uKHhkciwgcmVzKTsKIAlyZXR1cm4gc3RhdHVzOwogfQogCiAvKgogICogRGVjb2RlIFNFUVVFTkNFIHJlc3BvbnNlCiAgKi8KLXN0YXRpYyBpbnQgbmZzNF94ZHJfZGVjX3NlcXVlbmNlKHN0cnVjdCBycGNfcnFzdCAqcnFzdHAsIHVpbnQzMl90ICpwLAorc3RhdGljIGludCBuZnM0X3hkcl9kZWNfc2VxdWVuY2Uoc3RydWN0IHJwY19ycXN0ICpycXN0cCwKKwkJCQkgc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKIAkJCQkgc3RydWN0IG5mczRfc2VxdWVuY2VfcmVzICpyZXMpCiB7Ci0Jc3RydWN0IHhkcl9zdHJlYW0geGRyOwogCXN0cnVjdCBjb21wb3VuZF9oZHIgaGRyOwogCWludCBzdGF0dXM7CiAKLQl4ZHJfaW5pdF9kZWNvZGUoJnhkciwgJnJxc3RwLT5ycV9yY3ZfYnVmLCBwKTsKLQlzdGF0dXMgPSBkZWNvZGVfY29tcG91bmRfaGRyKCZ4ZHIsICZoZHIpOworCXN0YXR1cyA9IGRlY29kZV9jb21wb3VuZF9oZHIoeGRyLCAmaGRyKTsKIAlpZiAoIXN0YXR1cykKLQkJc3RhdHVzID0gZGVjb2RlX3NlcXVlbmNlKCZ4ZHIsIHJlcywgcnFzdHApOworCQlzdGF0dXMgPSBkZWNvZGVfc2VxdWVuY2UoeGRyLCByZXMsIHJxc3RwKTsKIAlyZXR1cm4gc3RhdHVzOwogfQogCiAvKgogICogRGVjb2RlIEdFVF9MRUFTRV9USU1FIHJlc3BvbnNlCiAgKi8KLXN0YXRpYyBpbnQgbmZzNF94ZHJfZGVjX2dldF9sZWFzZV90aW1lKHN0cnVjdCBycGNfcnFzdCAqcnFzdHAsIHVpbnQzMl90ICpwLAorc3RhdGljIGludCBuZnM0X3hkcl9kZWNfZ2V0X2xlYXNlX3RpbWUoc3RydWN0IHJwY19ycXN0ICpycXN0cCwKKwkJCQkgICAgICAgc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKIAkJCQkgICAgICAgc3RydWN0IG5mczRfZ2V0X2xlYXNlX3RpbWVfcmVzICpyZXMpCiB7Ci0Jc3RydWN0IHhkcl9zdHJlYW0geGRyOwogCXN0cnVjdCBjb21wb3VuZF9oZHIgaGRyOwogCWludCBzdGF0dXM7CiAKLQl4ZHJfaW5pdF9kZWNvZGUoJnhkciwgJnJxc3RwLT5ycV9yY3ZfYnVmLCBwKTsKLQlzdGF0dXMgPSBkZWNvZGVfY29tcG91bmRfaGRyKCZ4ZHIsICZoZHIpOworCXN0YXR1cyA9IGRlY29kZV9jb21wb3VuZF9oZHIoeGRyLCAmaGRyKTsKIAlpZiAoIXN0YXR1cykKLQkJc3RhdHVzID0gZGVjb2RlX3NlcXVlbmNlKCZ4ZHIsICZyZXMtPmxyX3NlcV9yZXMsIHJxc3RwKTsKKwkJc3RhdHVzID0gZGVjb2RlX3NlcXVlbmNlKHhkciwgJnJlcy0+bHJfc2VxX3JlcywgcnFzdHApOwogCWlmICghc3RhdHVzKQotCQlzdGF0dXMgPSBkZWNvZGVfcHV0cm9vdGZoKCZ4ZHIpOworCQlzdGF0dXMgPSBkZWNvZGVfcHV0cm9vdGZoKHhkcik7CiAJaWYgKCFzdGF0dXMpCi0JCXN0YXR1cyA9IGRlY29kZV9mc2luZm8oJnhkciwgcmVzLT5scl9mc2luZm8pOworCQlzdGF0dXMgPSBkZWNvZGVfZnNpbmZvKHhkciwgcmVzLT5scl9mc2luZm8pOwogCXJldHVybiBzdGF0dXM7CiB9CiAKIC8qCiAgKiBEZWNvZGUgUkVDTEFJTV9DT01QTEVURSByZXNwb25zZQogICovCi1zdGF0aWMgaW50IG5mczRfeGRyX2RlY19yZWNsYWltX2NvbXBsZXRlKHN0cnVjdCBycGNfcnFzdCAqcnFzdHAsIHVpbnQzMl90ICpwLAorc3RhdGljIGludCBuZnM0X3hkcl9kZWNfcmVjbGFpbV9jb21wbGV0ZShzdHJ1Y3QgcnBjX3Jxc3QgKnJxc3RwLAorCQkJCQkgc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKIAkJCQkJIHN0cnVjdCBuZnM0MV9yZWNsYWltX2NvbXBsZXRlX3JlcyAqcmVzKQogewotCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKIAlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkcjsKIAlpbnQgc3RhdHVzOwogCi0JeGRyX2luaXRfZGVjb2RlKCZ4ZHIsICZycXN0cC0+cnFfcmN2X2J1ZiwgcCk7Ci0Jc3RhdHVzID0gZGVjb2RlX2NvbXBvdW5kX2hkcigmeGRyLCAmaGRyKTsKKwlzdGF0dXMgPSBkZWNvZGVfY29tcG91bmRfaGRyKHhkciwgJmhkcik7CiAJaWYgKCFzdGF0dXMpCi0JCXN0YXR1cyA9IGRlY29kZV9zZXF1ZW5jZSgmeGRyLCAmcmVzLT5zZXFfcmVzLCBycXN0cCk7CisJCXN0YXR1cyA9IGRlY29kZV9zZXF1ZW5jZSh4ZHIsICZyZXMtPnNlcV9yZXMsIHJxc3RwKTsKIAlpZiAoIXN0YXR1cykKLQkJc3RhdHVzID0gZGVjb2RlX3JlY2xhaW1fY29tcGxldGUoJnhkciwgKHZvaWQgKilOVUxMKTsKKwkJc3RhdHVzID0gZGVjb2RlX3JlY2xhaW1fY29tcGxldGUoeGRyLCAodm9pZCAqKU5VTEwpOwogCXJldHVybiBzdGF0dXM7CiB9CiAKIC8qCiAgKiBEZWNvZGUgR0VUREVWSU5GTyByZXNwb25zZQogICovCi1zdGF0aWMgaW50IG5mczRfeGRyX2RlY19nZXRkZXZpY2VpbmZvKHN0cnVjdCBycGNfcnFzdCAqcnFzdHAsIHVpbnQzMl90ICpwLAorc3RhdGljIGludCBuZnM0X3hkcl9kZWNfZ2V0ZGV2aWNlaW5mbyhzdHJ1Y3QgcnBjX3Jxc3QgKnJxc3RwLAorCQkJCSAgICAgIHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCiAJCQkJICAgICAgc3RydWN0IG5mczRfZ2V0ZGV2aWNlaW5mb19yZXMgKnJlcykKIHsKLQlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CiAJc3RydWN0IGNvbXBvdW5kX2hkciBoZHI7CiAJaW50IHN0YXR1czsKIAotCXhkcl9pbml0X2RlY29kZSgmeGRyLCAmcnFzdHAtPnJxX3Jjdl9idWYsIHApOwotCXN0YXR1cyA9IGRlY29kZV9jb21wb3VuZF9oZHIoJnhkciwgJmhkcik7CisJc3RhdHVzID0gZGVjb2RlX2NvbXBvdW5kX2hkcih4ZHIsICZoZHIpOwogCWlmIChzdGF0dXMgIT0gMCkKIAkJZ290byBvdXQ7Ci0Jc3RhdHVzID0gZGVjb2RlX3NlcXVlbmNlKCZ4ZHIsICZyZXMtPnNlcV9yZXMsIHJxc3RwKTsKKwlzdGF0dXMgPSBkZWNvZGVfc2VxdWVuY2UoeGRyLCAmcmVzLT5zZXFfcmVzLCBycXN0cCk7CiAJaWYgKHN0YXR1cyAhPSAwKQogCQlnb3RvIG91dDsKLQlzdGF0dXMgPSBkZWNvZGVfZ2V0ZGV2aWNlaW5mbygmeGRyLCByZXMtPnBkZXYpOworCXN0YXR1cyA9IGRlY29kZV9nZXRkZXZpY2VpbmZvKHhkciwgcmVzLT5wZGV2KTsKIG91dDoKIAlyZXR1cm4gc3RhdHVzOwogfQpAQCAtNjEzNiwzMSArNjA0Miw0NCBAQAogLyoKICAqIERlY29kZSBMQVlPVVRHRVQgcmVzcG9uc2UKICAqLwotc3RhdGljIGludCBuZnM0X3hkcl9kZWNfbGF5b3V0Z2V0KHN0cnVjdCBycGNfcnFzdCAqcnFzdHAsIHVpbnQzMl90ICpwLAorc3RhdGljIGludCBuZnM0X3hkcl9kZWNfbGF5b3V0Z2V0KHN0cnVjdCBycGNfcnFzdCAqcnFzdHAsCisJCQkJICBzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAogCQkJCSAgc3RydWN0IG5mczRfbGF5b3V0Z2V0X3JlcyAqcmVzKQogewotCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKIAlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkcjsKIAlpbnQgc3RhdHVzOwogCi0JeGRyX2luaXRfZGVjb2RlKCZ4ZHIsICZycXN0cC0+cnFfcmN2X2J1ZiwgcCk7Ci0Jc3RhdHVzID0gZGVjb2RlX2NvbXBvdW5kX2hkcigmeGRyLCAmaGRyKTsKKwlzdGF0dXMgPSBkZWNvZGVfY29tcG91bmRfaGRyKHhkciwgJmhkcik7CiAJaWYgKHN0YXR1cykKIAkJZ290byBvdXQ7Ci0Jc3RhdHVzID0gZGVjb2RlX3NlcXVlbmNlKCZ4ZHIsICZyZXMtPnNlcV9yZXMsIHJxc3RwKTsKKwlzdGF0dXMgPSBkZWNvZGVfc2VxdWVuY2UoeGRyLCAmcmVzLT5zZXFfcmVzLCBycXN0cCk7CiAJaWYgKHN0YXR1cykKIAkJZ290byBvdXQ7Ci0Jc3RhdHVzID0gZGVjb2RlX3B1dGZoKCZ4ZHIpOworCXN0YXR1cyA9IGRlY29kZV9wdXRmaCh4ZHIpOwogCWlmIChzdGF0dXMpCiAJCWdvdG8gb3V0OwotCXN0YXR1cyA9IGRlY29kZV9sYXlvdXRnZXQoJnhkciwgcnFzdHAsIHJlcyk7CisJc3RhdHVzID0gZGVjb2RlX2xheW91dGdldCh4ZHIsIHJxc3RwLCByZXMpOwogb3V0OgogCXJldHVybiBzdGF0dXM7CiB9CiAjZW5kaWYgLyogQ09ORklHX05GU19WNF8xICovCiAKLV9fYmUzMiAqbmZzNF9kZWNvZGVfZGlyZW50KHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHN0cnVjdCBuZnNfZW50cnkgKmVudHJ5LAotCQkJICAgc3RydWN0IG5mc19zZXJ2ZXIgKnNlcnZlciwgaW50IHBsdXMpCisvKioKKyAqIG5mczRfZGVjb2RlX2RpcmVudCAtIERlY29kZSBhIHNpbmdsZSBORlN2NCBkaXJlY3RvcnkgZW50cnkgc3RvcmVkIGluCisgKiAgICAgICAgICAgICAgICAgICAgICB0aGUgbG9jYWwgcGFnZSBjYWNoZS4KKyAqIEB4ZHI6IFhEUiBzdHJlYW0gd2hlcmUgZW50cnkgcmVzaWRlcworICogQGVudHJ5OiBidWZmZXIgdG8gZmlsbCBpbiB3aXRoIGVudHJ5IGRhdGEKKyAqIEBwbHVzOiBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGlzIHNob3VsZCBiZSBhIHJlYWRkaXJwbHVzIGVudHJ5CisgKgorICogUmV0dXJucyB6ZXJvIGlmIHN1Y2Nlc3NmdWwsIG90aGVyd2lzZSBhIG5lZ2F0aXZlIGVycm5vIHZhbHVlIGlzCisgKiByZXR1cm5lZC4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIG5vdCBpbnZva2VkIGR1cmluZyBSRUFERElSIHJlcGx5IGRlY29kaW5nLCBidXQKKyAqIHJhdGhlciB3aGVuZXZlciBhbiBhcHBsaWNhdGlvbiBpbnZva2VzIHRoZSBnZXRkZW50cygyKSBzeXN0ZW0gY2FsbAorICogb24gYSBkaXJlY3RvcnkgYWxyZWFkeSBpbiBvdXIgY2FjaGUuCisgKi8KK2ludCBuZnM0X2RlY29kZV9kaXJlbnQoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgc3RydWN0IG5mc19lbnRyeSAqZW50cnksCisJCSAgICAgICBpbnQgcGx1cykKIHsKIAl1aW50MzJfdCBiaXRtYXBbMl0gPSB7MH07CiAJdWludDMyX3QgbGVuOwpAQCAtNjE3Miw5ICs2MDkxLDkgQEAKIAkJaWYgKHVubGlrZWx5KCFwKSkKIAkJCWdvdG8gb3V0X292ZXJmbG93OwogCQlpZiAoIW50b2hsKCpwKyspKQotCQkJcmV0dXJuIEVSUl9QVFIoLUVBR0FJTik7CisJCQlyZXR1cm4gLUVBR0FJTjsKIAkJZW50cnktPmVvZiA9IDE7Ci0JCXJldHVybiBFUlJfUFRSKC1FQkFEQ09PS0lFKTsKKwkJcmV0dXJuIC1FQkFEQ09PS0lFOwogCX0KIAogCXAgPSB4ZHJfaW5saW5lX2RlY29kZSh4ZHIsIDEyKTsKQEAgLTYyMDMsNyArNjEyMiw4IEBACiAJaWYgKGRlY29kZV9hdHRyX2xlbmd0aCh4ZHIsICZsZW4sICZwKSA8IDApCiAJCWdvdG8gb3V0X292ZXJmbG93OwogCi0JaWYgKGRlY29kZV9nZXRmYXR0cl9hdHRycyh4ZHIsIGJpdG1hcCwgZW50cnktPmZhdHRyLCBlbnRyeS0+ZmgsIHNlcnZlciwgMSkgPCAwKQorCWlmIChkZWNvZGVfZ2V0ZmF0dHJfYXR0cnMoeGRyLCBiaXRtYXAsIGVudHJ5LT5mYXR0ciwgZW50cnktPmZoLAorCQkJCQllbnRyeS0+c2VydmVyLCAxKSA8IDApCiAJCWdvdG8gb3V0X292ZXJmbG93OwogCWlmIChlbnRyeS0+ZmF0dHItPnZhbGlkICYgTkZTX0FUVFJfRkFUVFJfRklMRUlEKQogCQllbnRyeS0+aW5vID0gZW50cnktPmZhdHRyLT5maWxlaWQ7CkBAIC02MjE1LDE3ICs2MTM1LDExIEBACiAJaWYgKHZlcmlmeV9hdHRyX2xlbih4ZHIsIHAsIGxlbikgPCAwKQogCQlnb3RvIG91dF9vdmVyZmxvdzsKIAotCXAgPSB4ZHJfaW5saW5lX3BlZWsoeGRyLCA4KTsKLQlpZiAocCAhPSBOVUxMKQotCQllbnRyeS0+ZW9mID0gIXBbMF0gJiYgcFsxXTsKLQllbHNlCi0JCWVudHJ5LT5lb2YgPSAwOwotCi0JcmV0dXJuIHA7CisJcmV0dXJuIDA7CiAKIG91dF9vdmVyZmxvdzoKIAlwcmludF9vdmVyZmxvd19tc2coX19mdW5jX18sIHhkcik7Ci0JcmV0dXJuIEVSUl9QVFIoLUVBR0FJTik7CisJcmV0dXJuIC1FQUdBSU47CiB9CiAKIC8qCkBAIC02MzAxLDggKzYyMTUsOCBAQAogI2RlZmluZSBQUk9DKHByb2MsIGFyZ3R5cGUsIHJlc3R5cGUpCQkJCVwKIFtORlNQUk9DNF9DTE5UXyMjcHJvY10gPSB7CQkJCQlcCiAJLnBfcHJvYyAgID0gTkZTUFJPQzRfQ09NUE9VTkQsCQkJCVwKLQkucF9lbmNvZGUgPSAoa3hkcnByb2NfdCkgbmZzNF94ZHJfIyNhcmd0eXBlLAkJXAotCS5wX2RlY29kZSA9IChreGRycHJvY190KSBuZnM0X3hkcl8jI3Jlc3R5cGUsCQlcCisJLnBfZW5jb2RlID0gKGt4ZHJlcHJvY190KW5mczRfeGRyXyMjYXJndHlwZSwJCVwKKwkucF9kZWNvZGUgPSAoa3hkcmRwcm9jX3QpbmZzNF94ZHJfIyNyZXN0eXBlLAkJXAogCS5wX2FyZ2xlbiA9IE5GUzRfIyNhcmd0eXBlIyNfc3osCQkJXAogCS5wX3JlcGxlbiA9IE5GUzRfIyNyZXN0eXBlIyNfc3osCQkJXAogCS5wX3N0YXRpZHggPSBORlNQUk9DNF9DTE5UXyMjcHJvYywJCQlcCkBAIC02MzEwLDUwICs2MjI0LDUwIEBACiB9CiAKIHN0cnVjdCBycGNfcHJvY2luZm8JbmZzNF9wcm9jZWR1cmVzW10gPSB7Ci0gIFBST0MoUkVBRCwJCWVuY19yZWFkLAlkZWNfcmVhZCksCi0gIFBST0MoV1JJVEUsCQllbmNfd3JpdGUsCWRlY193cml0ZSksCi0gIFBST0MoQ09NTUlULAkJZW5jX2NvbW1pdCwJZGVjX2NvbW1pdCksCi0gIFBST0MoT1BFTiwJCWVuY19vcGVuLAlkZWNfb3BlbiksCi0gIFBST0MoT1BFTl9DT05GSVJNLAllbmNfb3Blbl9jb25maXJtLAlkZWNfb3Blbl9jb25maXJtKSwKLSAgUFJPQyhPUEVOX05PQVRUUiwJZW5jX29wZW5fbm9hdHRyLAlkZWNfb3Blbl9ub2F0dHIpLAotICBQUk9DKE9QRU5fRE9XTkdSQURFLAllbmNfb3Blbl9kb3duZ3JhZGUsCWRlY19vcGVuX2Rvd25ncmFkZSksCi0gIFBST0MoQ0xPU0UsCQllbmNfY2xvc2UsCWRlY19jbG9zZSksCi0gIFBST0MoU0VUQVRUUiwJCWVuY19zZXRhdHRyLAlkZWNfc2V0YXR0ciksCi0gIFBST0MoRlNJTkZPLAkJZW5jX2ZzaW5mbywJZGVjX2ZzaW5mbyksCi0gIFBST0MoUkVORVcsCQllbmNfcmVuZXcsCWRlY19yZW5ldyksCi0gIFBST0MoU0VUQ0xJRU5USUQsCWVuY19zZXRjbGllbnRpZCwJZGVjX3NldGNsaWVudGlkKSwKLSAgUFJPQyhTRVRDTElFTlRJRF9DT05GSVJNLAllbmNfc2V0Y2xpZW50aWRfY29uZmlybSwJZGVjX3NldGNsaWVudGlkX2NvbmZpcm0pLAotICBQUk9DKExPQ0ssICAgICAgICAgICAgZW5jX2xvY2ssICAgICAgIGRlY19sb2NrKSwKLSAgUFJPQyhMT0NLVCwgICAgICAgICAgIGVuY19sb2NrdCwgICAgICBkZWNfbG9ja3QpLAotICBQUk9DKExPQ0tVLCAgICAgICAgICAgZW5jX2xvY2t1LCAgICAgIGRlY19sb2NrdSksCi0gIFBST0MoQUNDRVNTLAkJZW5jX2FjY2VzcywJZGVjX2FjY2VzcyksCi0gIFBST0MoR0VUQVRUUiwJCWVuY19nZXRhdHRyLAlkZWNfZ2V0YXR0ciksCi0gIFBST0MoTE9PS1VQLAkJZW5jX2xvb2t1cCwJZGVjX2xvb2t1cCksCi0gIFBST0MoTE9PS1VQX1JPT1QsCWVuY19sb29rdXBfcm9vdCwJZGVjX2xvb2t1cF9yb290KSwKLSAgUFJPQyhSRU1PVkUsCQllbmNfcmVtb3ZlLAlkZWNfcmVtb3ZlKSwKLSAgUFJPQyhSRU5BTUUsCQllbmNfcmVuYW1lLAlkZWNfcmVuYW1lKSwKLSAgUFJPQyhMSU5LLAkJZW5jX2xpbmssCWRlY19saW5rKSwKLSAgUFJPQyhTWU1MSU5LLAkJZW5jX3N5bWxpbmssCWRlY19zeW1saW5rKSwKLSAgUFJPQyhDUkVBVEUsCQllbmNfY3JlYXRlLAlkZWNfY3JlYXRlKSwKLSAgUFJPQyhQQVRIQ09ORiwJZW5jX3BhdGhjb25mLAlkZWNfcGF0aGNvbmYpLAotICBQUk9DKFNUQVRGUywJCWVuY19zdGF0ZnMsCWRlY19zdGF0ZnMpLAotICBQUk9DKFJFQURMSU5LLAllbmNfcmVhZGxpbmssCWRlY19yZWFkbGluayksCi0gIFBST0MoUkVBRERJUiwJCWVuY19yZWFkZGlyLAlkZWNfcmVhZGRpciksCi0gIFBST0MoU0VSVkVSX0NBUFMsCWVuY19zZXJ2ZXJfY2FwcywgZGVjX3NlcnZlcl9jYXBzKSwKLSAgUFJPQyhERUxFR1JFVFVSTiwJZW5jX2RlbGVncmV0dXJuLCBkZWNfZGVsZWdyZXR1cm4pLAotICBQUk9DKEdFVEFDTCwJCWVuY19nZXRhY2wsCWRlY19nZXRhY2wpLAotICBQUk9DKFNFVEFDTCwJCWVuY19zZXRhY2wsCWRlY19zZXRhY2wpLAotICBQUk9DKEZTX0xPQ0FUSU9OUywJZW5jX2ZzX2xvY2F0aW9ucywgZGVjX2ZzX2xvY2F0aW9ucyksCi0gIFBST0MoUkVMRUFTRV9MT0NLT1dORVIsIGVuY19yZWxlYXNlX2xvY2tvd25lciwgZGVjX3JlbGVhc2VfbG9ja293bmVyKSwKKwlQUk9DKFJFQUQsCQllbmNfcmVhZCwJCWRlY19yZWFkKSwKKwlQUk9DKFdSSVRFLAkJZW5jX3dyaXRlLAkJZGVjX3dyaXRlKSwKKwlQUk9DKENPTU1JVCwJCWVuY19jb21taXQsCQlkZWNfY29tbWl0KSwKKwlQUk9DKE9QRU4sCQllbmNfb3BlbiwJCWRlY19vcGVuKSwKKwlQUk9DKE9QRU5fQ09ORklSTSwJZW5jX29wZW5fY29uZmlybSwJZGVjX29wZW5fY29uZmlybSksCisJUFJPQyhPUEVOX05PQVRUUiwJZW5jX29wZW5fbm9hdHRyLAlkZWNfb3Blbl9ub2F0dHIpLAorCVBST0MoT1BFTl9ET1dOR1JBREUsCWVuY19vcGVuX2Rvd25ncmFkZSwJZGVjX29wZW5fZG93bmdyYWRlKSwKKwlQUk9DKENMT1NFLAkJZW5jX2Nsb3NlLAkJZGVjX2Nsb3NlKSwKKwlQUk9DKFNFVEFUVFIsCQllbmNfc2V0YXR0ciwJCWRlY19zZXRhdHRyKSwKKwlQUk9DKEZTSU5GTywJCWVuY19mc2luZm8sCQlkZWNfZnNpbmZvKSwKKwlQUk9DKFJFTkVXLAkJZW5jX3JlbmV3LAkJZGVjX3JlbmV3KSwKKwlQUk9DKFNFVENMSUVOVElELAllbmNfc2V0Y2xpZW50aWQsCWRlY19zZXRjbGllbnRpZCksCisJUFJPQyhTRVRDTElFTlRJRF9DT05GSVJNLCBlbmNfc2V0Y2xpZW50aWRfY29uZmlybSwgZGVjX3NldGNsaWVudGlkX2NvbmZpcm0pLAorCVBST0MoTE9DSywJCWVuY19sb2NrLAkJZGVjX2xvY2spLAorCVBST0MoTE9DS1QsCQllbmNfbG9ja3QsCQlkZWNfbG9ja3QpLAorCVBST0MoTE9DS1UsCQllbmNfbG9ja3UsCQlkZWNfbG9ja3UpLAorCVBST0MoQUNDRVNTLAkJZW5jX2FjY2VzcywJCWRlY19hY2Nlc3MpLAorCVBST0MoR0VUQVRUUiwJCWVuY19nZXRhdHRyLAkJZGVjX2dldGF0dHIpLAorCVBST0MoTE9PS1VQLAkJZW5jX2xvb2t1cCwJCWRlY19sb29rdXApLAorCVBST0MoTE9PS1VQX1JPT1QsCWVuY19sb29rdXBfcm9vdCwJZGVjX2xvb2t1cF9yb290KSwKKwlQUk9DKFJFTU9WRSwJCWVuY19yZW1vdmUsCQlkZWNfcmVtb3ZlKSwKKwlQUk9DKFJFTkFNRSwJCWVuY19yZW5hbWUsCQlkZWNfcmVuYW1lKSwKKwlQUk9DKExJTkssCQllbmNfbGluaywJCWRlY19saW5rKSwKKwlQUk9DKFNZTUxJTkssCQllbmNfc3ltbGluaywJCWRlY19zeW1saW5rKSwKKwlQUk9DKENSRUFURSwJCWVuY19jcmVhdGUsCQlkZWNfY3JlYXRlKSwKKwlQUk9DKFBBVEhDT05GLAkJZW5jX3BhdGhjb25mLAkJZGVjX3BhdGhjb25mKSwKKwlQUk9DKFNUQVRGUywJCWVuY19zdGF0ZnMsCQlkZWNfc3RhdGZzKSwKKwlQUk9DKFJFQURMSU5LLAkJZW5jX3JlYWRsaW5rLAkJZGVjX3JlYWRsaW5rKSwKKwlQUk9DKFJFQURESVIsCQllbmNfcmVhZGRpciwJCWRlY19yZWFkZGlyKSwKKwlQUk9DKFNFUlZFUl9DQVBTLAllbmNfc2VydmVyX2NhcHMsCWRlY19zZXJ2ZXJfY2FwcyksCisJUFJPQyhERUxFR1JFVFVSTiwJZW5jX2RlbGVncmV0dXJuLAlkZWNfZGVsZWdyZXR1cm4pLAorCVBST0MoR0VUQUNMLAkJZW5jX2dldGFjbCwJCWRlY19nZXRhY2wpLAorCVBST0MoU0VUQUNMLAkJZW5jX3NldGFjbCwJCWRlY19zZXRhY2wpLAorCVBST0MoRlNfTE9DQVRJT05TLAllbmNfZnNfbG9jYXRpb25zLAlkZWNfZnNfbG9jYXRpb25zKSwKKwlQUk9DKFJFTEVBU0VfTE9DS09XTkVSLAllbmNfcmVsZWFzZV9sb2Nrb3duZXIsCWRlY19yZWxlYXNlX2xvY2tvd25lciksCiAjaWYgZGVmaW5lZChDT05GSUdfTkZTX1Y0XzEpCi0gIFBST0MoRVhDSEFOR0VfSUQsCWVuY19leGNoYW5nZV9pZCwJZGVjX2V4Y2hhbmdlX2lkKSwKLSAgUFJPQyhDUkVBVEVfU0VTU0lPTiwJZW5jX2NyZWF0ZV9zZXNzaW9uLAlkZWNfY3JlYXRlX3Nlc3Npb24pLAotICBQUk9DKERFU1RST1lfU0VTU0lPTiwJZW5jX2Rlc3Ryb3lfc2Vzc2lvbiwJZGVjX2Rlc3Ryb3lfc2Vzc2lvbiksCi0gIFBST0MoU0VRVUVOQ0UsCWVuY19zZXF1ZW5jZSwJZGVjX3NlcXVlbmNlKSwKLSAgUFJPQyhHRVRfTEVBU0VfVElNRSwJZW5jX2dldF9sZWFzZV90aW1lLAlkZWNfZ2V0X2xlYXNlX3RpbWUpLAotICBQUk9DKFJFQ0xBSU1fQ09NUExFVEUsIGVuY19yZWNsYWltX2NvbXBsZXRlLCAgZGVjX3JlY2xhaW1fY29tcGxldGUpLAotICBQUk9DKEdFVERFVklDRUlORk8sIGVuY19nZXRkZXZpY2VpbmZvLCBkZWNfZ2V0ZGV2aWNlaW5mbyksCi0gIFBST0MoTEFZT1VUR0VULCAgZW5jX2xheW91dGdldCwgICAgIGRlY19sYXlvdXRnZXQpLAorCVBST0MoRVhDSEFOR0VfSUQsCWVuY19leGNoYW5nZV9pZCwJZGVjX2V4Y2hhbmdlX2lkKSwKKwlQUk9DKENSRUFURV9TRVNTSU9OLAllbmNfY3JlYXRlX3Nlc3Npb24sCWRlY19jcmVhdGVfc2Vzc2lvbiksCisJUFJPQyhERVNUUk9ZX1NFU1NJT04sCWVuY19kZXN0cm95X3Nlc3Npb24sCWRlY19kZXN0cm95X3Nlc3Npb24pLAorCVBST0MoU0VRVUVOQ0UsCQllbmNfc2VxdWVuY2UsCQlkZWNfc2VxdWVuY2UpLAorCVBST0MoR0VUX0xFQVNFX1RJTUUsCWVuY19nZXRfbGVhc2VfdGltZSwJZGVjX2dldF9sZWFzZV90aW1lKSwKKwlQUk9DKFJFQ0xBSU1fQ09NUExFVEUsCWVuY19yZWNsYWltX2NvbXBsZXRlLAlkZWNfcmVjbGFpbV9jb21wbGV0ZSksCisJUFJPQyhHRVRERVZJQ0VJTkZPLAllbmNfZ2V0ZGV2aWNlaW5mbywJZGVjX2dldGRldmljZWluZm8pLAorCVBST0MoTEFZT1VUR0VULAkJZW5jX2xheW91dGdldCwJCWRlY19sYXlvdXRnZXQpLAogI2VuZGlmIC8qIENPTkZJR19ORlNfVjRfMSAqLwogfTsKIApkaWZmIC0tZ2l0IGEvZnMvbmZzL3BhZ2VsaXN0LmMgYi9mcy9uZnMvcGFnZWxpc3QuYwppbmRleCBiNjg1MzZjLi5lMTE2NGUzIDEwMDY0NAotLS0gYS9mcy9uZnMvcGFnZWxpc3QuYworKysgYi9mcy9uZnMvcGFnZWxpc3QuYwpAQCAtMjYsMTIgKzI2LDkgQEAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IG5mc19wYWdlICoKIG5mc19wYWdlX2FsbG9jKHZvaWQpCiB7Ci0Jc3RydWN0IG5mc19wYWdlCSpwOwotCXAgPSBrbWVtX2NhY2hlX2FsbG9jKG5mc19wYWdlX2NhY2hlcCwgR0ZQX0tFUk5FTCk7Ci0JaWYgKHApIHsKLQkJbWVtc2V0KHAsIDAsIHNpemVvZigqcCkpOworCXN0cnVjdCBuZnNfcGFnZQkqcCA9IGttZW1fY2FjaGVfemFsbG9jKG5mc19wYWdlX2NhY2hlcCwgR0ZQX0tFUk5FTCk7CisJaWYgKHApCiAJCUlOSVRfTElTVF9IRUFEKCZwLT53Yl9saXN0KTsKLQl9CiAJcmV0dXJuIHA7CiB9CiAKZGlmZiAtLWdpdCBhL2ZzL25mcy9wbmZzLmMgYi9mcy9uZnMvcG5mcy5jCmluZGV4IGRiNzczNDIuLmJjNDA4OTcgMTAwNjQ0Ci0tLSBhL2ZzL25mcy9wbmZzLmMKKysrIGIvZnMvbmZzL3BuZnMuYwpAQCAtMTc3LDEwNSArMTc3LDE0OSBAQAogICogcE5GUyBjbGllbnQgbGF5b3V0IGNhY2hlCiAgKi8KIAotc3RhdGljIHZvaWQKLWdldF9sYXlvdXRfaGRyX2xvY2tlZChzdHJ1Y3QgcG5mc19sYXlvdXRfaGRyICpsbykKKy8qIE5lZWQgdG8gaG9sZCBpX2xvY2sgaWYgY2FsbGVyIGRvZXMgbm90IGFscmVhZHkgaG9sZCByZWZlcmVuY2UgKi8KK3ZvaWQKK2dldF9sYXlvdXRfaGRyKHN0cnVjdCBwbmZzX2xheW91dF9oZHIgKmxvKQogewotCWFzc2VydF9zcGluX2xvY2tlZCgmbG8tPmlub2RlLT5pX2xvY2spOwotCWxvLT5yZWZjb3VudCsrOworCWF0b21pY19pbmMoJmxvLT5wbGhfcmVmY291bnQpOworfQorCitzdGF0aWMgdm9pZAorZGVzdHJveV9sYXlvdXRfaGRyKHN0cnVjdCBwbmZzX2xheW91dF9oZHIgKmxvKQoreworCWRwcmludGsoIiVzOiBmcmVlaW5nIGxheW91dCBjYWNoZSAlcFxuIiwgX19mdW5jX18sIGxvKTsKKwlCVUdfT04oIWxpc3RfZW1wdHkoJmxvLT5wbGhfbGF5b3V0cykpOworCU5GU19JKGxvLT5wbGhfaW5vZGUpLT5sYXlvdXQgPSBOVUxMOworCWtmcmVlKGxvKTsKIH0KIAogc3RhdGljIHZvaWQKIHB1dF9sYXlvdXRfaGRyX2xvY2tlZChzdHJ1Y3QgcG5mc19sYXlvdXRfaGRyICpsbykKIHsKLQlhc3NlcnRfc3Bpbl9sb2NrZWQoJmxvLT5pbm9kZS0+aV9sb2NrKTsKLQlCVUdfT04obG8tPnJlZmNvdW50ID09IDApOwotCi0JbG8tPnJlZmNvdW50LS07Ci0JaWYgKCFsby0+cmVmY291bnQpIHsKLQkJZHByaW50aygiJXM6IGZyZWVpbmcgbGF5b3V0IGNhY2hlICVwXG4iLCBfX2Z1bmNfXywgbG8pOwotCQlCVUdfT04oIWxpc3RfZW1wdHkoJmxvLT5sYXlvdXRzKSk7Ci0JCU5GU19JKGxvLT5pbm9kZSktPmxheW91dCA9IE5VTEw7Ci0JCWtmcmVlKGxvKTsKLQl9CisJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJmxvLT5wbGhfcmVmY291bnQpKQorCQlkZXN0cm95X2xheW91dF9oZHIobG8pOwogfQogCiB2b2lkCi1wdXRfbGF5b3V0X2hkcihzdHJ1Y3QgaW5vZGUgKmlub2RlKQorcHV0X2xheW91dF9oZHIoc3RydWN0IHBuZnNfbGF5b3V0X2hkciAqbG8pCiB7Ci0Jc3Bpbl9sb2NrKCZpbm9kZS0+aV9sb2NrKTsKLQlwdXRfbGF5b3V0X2hkcl9sb2NrZWQoTkZTX0koaW5vZGUpLT5sYXlvdXQpOwotCXNwaW5fdW5sb2NrKCZpbm9kZS0+aV9sb2NrKTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gbG8tPnBsaF9pbm9kZTsKKworCWlmIChhdG9taWNfZGVjX2FuZF9sb2NrKCZsby0+cGxoX3JlZmNvdW50LCAmaW5vZGUtPmlfbG9jaykpIHsKKwkJZGVzdHJveV9sYXlvdXRfaGRyKGxvKTsKKwkJc3Bpbl91bmxvY2soJmlub2RlLT5pX2xvY2spOworCX0KIH0KIAogc3RhdGljIHZvaWQKIGluaXRfbHNlZyhzdHJ1Y3QgcG5mc19sYXlvdXRfaGRyICpsbywgc3RydWN0IHBuZnNfbGF5b3V0X3NlZ21lbnQgKmxzZWcpCiB7Ci0JSU5JVF9MSVNUX0hFQUQoJmxzZWctPmZpX2xpc3QpOwotCWtyZWZfaW5pdCgmbHNlZy0+a3JlZik7Ci0JbHNlZy0+bGF5b3V0ID0gbG87CisJSU5JVF9MSVNUX0hFQUQoJmxzZWctPnBsc19saXN0KTsKKwlhdG9taWNfc2V0KCZsc2VnLT5wbHNfcmVmY291bnQsIDEpOworCXNtcF9tYigpOworCXNldF9iaXQoTkZTX0xTRUdfVkFMSUQsICZsc2VnLT5wbHNfZmxhZ3MpOworCWxzZWctPnBsc19sYXlvdXQgPSBsbzsKIH0KIAotLyogQ2FsbGVkIHdpdGhvdXQgaV9sb2NrIGhlbGQsIGFzIHRoZSBmcmVlX2xzZWcgY2FsbCBtYXkgc2xlZXAgKi8KLXN0YXRpYyB2b2lkCi1kZXN0cm95X2xzZWcoc3RydWN0IGtyZWYgKmtyZWYpCitzdGF0aWMgdm9pZCBmcmVlX2xzZWcoc3RydWN0IHBuZnNfbGF5b3V0X3NlZ21lbnQgKmxzZWcpCiB7Ci0Jc3RydWN0IHBuZnNfbGF5b3V0X3NlZ21lbnQgKmxzZWcgPQotCQljb250YWluZXJfb2Yoa3JlZiwgc3RydWN0IHBuZnNfbGF5b3V0X3NlZ21lbnQsIGtyZWYpOwotCXN0cnVjdCBpbm9kZSAqaW5vID0gbHNlZy0+bGF5b3V0LT5pbm9kZTsKKwlzdHJ1Y3QgaW5vZGUgKmlubyA9IGxzZWctPnBsc19sYXlvdXQtPnBsaF9pbm9kZTsKIAotCWRwcmludGsoIi0tPiAlc1xuIiwgX19mdW5jX18pOwogCU5GU19TRVJWRVIoaW5vKS0+cG5mc19jdXJyX2xkLT5mcmVlX2xzZWcobHNlZyk7Ci0JLyogTWF0Y2hlZCBieSBnZXRfbGF5b3V0X2hkcl9sb2NrZWQgaW4gcG5mc19pbnNlcnRfbGF5b3V0ICovCi0JcHV0X2xheW91dF9oZHIoaW5vKTsKKwkvKiBNYXRjaGVkIGJ5IGdldF9sYXlvdXRfaGRyIGluIHBuZnNfaW5zZXJ0X2xheW91dCAqLworCXB1dF9sYXlvdXRfaGRyKE5GU19JKGlubyktPmxheW91dCk7CiB9CiAKLXN0YXRpYyB2b2lkCi1wdXRfbHNlZyhzdHJ1Y3QgcG5mc19sYXlvdXRfc2VnbWVudCAqbHNlZykKKy8qIFRoZSB1c2Ugb2YgdG1wX2xpc3QgaXMgbmVjZXNzYXJ5IGJlY2F1c2UgcG5mc19jdXJyX2xkLT5mcmVlX2xzZWcKKyAqIGNvdWxkIHNsZWVwLCBzbyBtdXN0IGJlIGNhbGxlZCBvdXRzaWRlIG9mIHRoZSBsb2NrLgorICogUmV0dXJucyAxIGlmIG9iamVjdCB3YXMgcmVtb3ZlZCwgb3RoZXJ3aXNlIHJldHVybiAwLgorICovCitzdGF0aWMgaW50CitwdXRfbHNlZ19sb2NrZWQoc3RydWN0IHBuZnNfbGF5b3V0X3NlZ21lbnQgKmxzZWcsCisJCXN0cnVjdCBsaXN0X2hlYWQgKnRtcF9saXN0KQogewotCWlmICghbHNlZykKLQkJcmV0dXJuOworCWRwcmludGsoIiVzOiBsc2VnICVwIHJlZiAlZCB2YWxpZCAlZFxuIiwgX19mdW5jX18sIGxzZWcsCisJCWF0b21pY19yZWFkKCZsc2VnLT5wbHNfcmVmY291bnQpLAorCQl0ZXN0X2JpdChORlNfTFNFR19WQUxJRCwgJmxzZWctPnBsc19mbGFncykpOworCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZsc2VnLT5wbHNfcmVmY291bnQpKSB7CisJCXN0cnVjdCBpbm9kZSAqaW5vID0gbHNlZy0+cGxzX2xheW91dC0+cGxoX2lub2RlOwogCi0JZHByaW50aygiJXM6IGxzZWcgJXAgcmVmICVkXG4iLCBfX2Z1bmNfXywgbHNlZywKLQkJYXRvbWljX3JlYWQoJmxzZWctPmtyZWYucmVmY291bnQpKTsKLQlrcmVmX3B1dCgmbHNlZy0+a3JlZiwgZGVzdHJveV9sc2VnKTsKKwkJQlVHX09OKHRlc3RfYml0KE5GU19MU0VHX1ZBTElELCAmbHNlZy0+cGxzX2ZsYWdzKSk7CisJCWxpc3RfZGVsKCZsc2VnLT5wbHNfbGlzdCk7CisJCWlmIChsaXN0X2VtcHR5KCZsc2VnLT5wbHNfbGF5b3V0LT5wbGhfc2VncykpIHsKKwkJCXN0cnVjdCBuZnNfY2xpZW50ICpjbHA7CisKKwkJCWNscCA9IE5GU19TRVJWRVIoaW5vKS0+bmZzX2NsaWVudDsKKwkJCXNwaW5fbG9jaygmY2xwLT5jbF9sb2NrKTsKKwkJCS8qIExpc3QgZG9lcyBub3QgdGFrZSBhIHJlZmVyZW5jZSwgc28gbm8gbmVlZCBmb3IgcHV0IGhlcmUgKi8KKwkJCWxpc3RfZGVsX2luaXQoJmxzZWctPnBsc19sYXlvdXQtPnBsaF9sYXlvdXRzKTsKKwkJCXNwaW5fdW5sb2NrKCZjbHAtPmNsX2xvY2spOworCQkJY2xlYXJfYml0KE5GU19MQVlPVVRfQlVMS19SRUNBTEwsICZsc2VnLT5wbHNfbGF5b3V0LT5wbGhfZmxhZ3MpOworCQl9CisJCXJwY193YWtlX3VwKCZORlNfU0VSVkVSKGlubyktPnJvY19ycGN3YWl0cSk7CisJCWxpc3RfYWRkKCZsc2VnLT5wbHNfbGlzdCwgdG1wX2xpc3QpOworCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkCi1wbmZzX2NsZWFyX2xzZWdfbGlzdChzdHJ1Y3QgcG5mc19sYXlvdXRfaGRyICpsbywgc3RydWN0IGxpc3RfaGVhZCAqdG1wX2xpc3QpCitzdGF0aWMgYm9vbAorc2hvdWxkX2ZyZWVfbHNlZyh1MzIgbHNlZ19pb21vZGUsIHUzMiByZWNhbGxfaW9tb2RlKQoreworCXJldHVybiAocmVjYWxsX2lvbW9kZSA9PSBJT01PREVfQU5ZIHx8CisJCWxzZWdfaW9tb2RlID09IHJlY2FsbF9pb21vZGUpOworfQorCisvKiBSZXR1cm5zIDEgaWYgbHNlZyBpcyByZW1vdmVkIGZyb20gbGlzdCwgMCBvdGhlcndpc2UgKi8KK3N0YXRpYyBpbnQgbWFya19sc2VnX2ludmFsaWQoc3RydWN0IHBuZnNfbGF5b3V0X3NlZ21lbnQgKmxzZWcsCisJCQkgICAgIHN0cnVjdCBsaXN0X2hlYWQgKnRtcF9saXN0KQoreworCWludCBydiA9IDA7CisKKwlpZiAodGVzdF9hbmRfY2xlYXJfYml0KE5GU19MU0VHX1ZBTElELCAmbHNlZy0+cGxzX2ZsYWdzKSkgeworCQkvKiBSZW1vdmUgdGhlIHJlZmVyZW5jZSBrZWVwaW5nIHRoZSBsc2VnIGluIHRoZQorCQkgKiBsaXN0LiAgSXQgd2lsbCBub3cgYmUgcmVtb3ZlZCB3aGVuIGFsbAorCQkgKiBvdXRzdGFuZGluZyBpbyBpcyBmaW5pc2hlZC4KKwkJICovCisJCXJ2ID0gcHV0X2xzZWdfbG9ja2VkKGxzZWcsIHRtcF9saXN0KTsKKwl9CisJcmV0dXJuIHJ2OworfQorCisvKiBSZXR1cm5zIGNvdW50IG9mIG51bWJlciBvZiBtYXRjaGluZyBpbnZhbGlkIGxzZWdzIHJlbWFpbmluZyBpbiBsaXN0CisgKiBhZnRlciBjYWxsLgorICovCitpbnQKK21hcmtfbWF0Y2hpbmdfbHNlZ3NfaW52YWxpZChzdHJ1Y3QgcG5mc19sYXlvdXRfaGRyICpsbywKKwkJCSAgICBzdHJ1Y3QgbGlzdF9oZWFkICp0bXBfbGlzdCwKKwkJCSAgICB1MzIgaW9tb2RlKQogewogCXN0cnVjdCBwbmZzX2xheW91dF9zZWdtZW50ICpsc2VnLCAqbmV4dDsKLQlzdHJ1Y3QgbmZzX2NsaWVudCAqY2xwOworCWludCBpbnZhbGlkID0gMCwgcmVtb3ZlZCA9IDA7CiAKIAlkcHJpbnRrKCIlczpCZWdpbiBsbyAlcFxuIiwgX19mdW5jX18sIGxvKTsKIAotCWFzc2VydF9zcGluX2xvY2tlZCgmbG8tPmlub2RlLT5pX2xvY2spOwotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShsc2VnLCBuZXh0LCAmbG8tPnNlZ3MsIGZpX2xpc3QpIHsKLQkJZHByaW50aygiJXM6IGZyZWVpbmcgbHNlZyAlcFxuIiwgX19mdW5jX18sIGxzZWcpOwotCQlsaXN0X21vdmUoJmxzZWctPmZpX2xpc3QsIHRtcF9saXN0KTsKLQl9Ci0JY2xwID0gTkZTX1NFUlZFUihsby0+aW5vZGUpLT5uZnNfY2xpZW50OwotCXNwaW5fbG9jaygmY2xwLT5jbF9sb2NrKTsKLQkvKiBMaXN0IGRvZXMgbm90IHRha2UgYSByZWZlcmVuY2UsIHNvIG5vIG5lZWQgZm9yIHB1dCBoZXJlICovCi0JbGlzdF9kZWxfaW5pdCgmbG8tPmxheW91dHMpOwotCXNwaW5fdW5sb2NrKCZjbHAtPmNsX2xvY2spOwotCXdyaXRlX3NlcWxvY2soJmxvLT5zZXFsb2NrKTsKLQljbGVhcl9iaXQoTkZTX0xBWU9VVF9TVEFURUlEX1NFVCwgJmxvLT5zdGF0ZSk7Ci0Jd3JpdGVfc2VxdW5sb2NrKCZsby0+c2VxbG9jayk7Ci0KLQlkcHJpbnRrKCIlczpSZXR1cm5cbiIsIF9fZnVuY19fKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobHNlZywgbmV4dCwgJmxvLT5wbGhfc2VncywgcGxzX2xpc3QpCisJCWlmIChzaG91bGRfZnJlZV9sc2VnKGxzZWctPnBsc19yYW5nZS5pb21vZGUsIGlvbW9kZSkpIHsKKwkJCWRwcmludGsoIiVzOiBmcmVlaW5nIGxzZWcgJXAgaW9tb2RlICVkICIKKwkJCQkib2Zmc2V0ICVsbHUgbGVuZ3RoICVsbHVcbiIsIF9fZnVuY19fLAorCQkJCWxzZWcsIGxzZWctPnBsc19yYW5nZS5pb21vZGUsIGxzZWctPnBsc19yYW5nZS5vZmZzZXQsCisJCQkJbHNlZy0+cGxzX3JhbmdlLmxlbmd0aCk7CisJCQlpbnZhbGlkKys7CisJCQlyZW1vdmVkICs9IG1hcmtfbHNlZ19pbnZhbGlkKGxzZWcsIHRtcF9saXN0KTsKKwkJfQorCWRwcmludGsoIiVzOlJldHVybiAlaVxuIiwgX19mdW5jX18sIGludmFsaWQgLSByZW1vdmVkKTsKKwlyZXR1cm4gaW52YWxpZCAtIHJlbW92ZWQ7CiB9CiAKLXN0YXRpYyB2b2lkCi1wbmZzX2ZyZWVfbHNlZ19saXN0KHN0cnVjdCBsaXN0X2hlYWQgKnRtcF9saXN0KQordm9pZAorcG5mc19mcmVlX2xzZWdfbGlzdChzdHJ1Y3QgbGlzdF9oZWFkICpmcmVlX21lKQogewotCXN0cnVjdCBwbmZzX2xheW91dF9zZWdtZW50ICpsc2VnOworCXN0cnVjdCBwbmZzX2xheW91dF9zZWdtZW50ICpsc2VnLCAqdG1wOwogCi0Jd2hpbGUgKCFsaXN0X2VtcHR5KHRtcF9saXN0KSkgewotCQlsc2VnID0gbGlzdF9lbnRyeSh0bXBfbGlzdC0+bmV4dCwgc3RydWN0IHBuZnNfbGF5b3V0X3NlZ21lbnQsCi0JCQkJZmlfbGlzdCk7Ci0JCWRwcmludGsoIiVzIGNhbGxpbmcgcHV0X2xzZWcgb24gJXBcbiIsIF9fZnVuY19fLCBsc2VnKTsKLQkJbGlzdF9kZWwoJmxzZWctPmZpX2xpc3QpOwotCQlwdXRfbHNlZyhsc2VnKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobHNlZywgdG1wLCBmcmVlX21lLCBwbHNfbGlzdCkgeworCQlsaXN0X2RlbCgmbHNlZy0+cGxzX2xpc3QpOworCQlmcmVlX2xzZWcobHNlZyk7CiAJfQogfQogCkBAIC0yODgsNyArMzMyLDggQEAKIAlzcGluX2xvY2soJm5mc2ktPnZmc19pbm9kZS5pX2xvY2spOwogCWxvID0gbmZzaS0+bGF5b3V0OwogCWlmIChsbykgewotCQlwbmZzX2NsZWFyX2xzZWdfbGlzdChsbywgJnRtcF9saXN0KTsKKwkJc2V0X2JpdChORlNfTEFZT1VUX0RFU1RST1lFRCwgJm5mc2ktPmxheW91dC0+cGxoX2ZsYWdzKTsKKwkJbWFya19tYXRjaGluZ19sc2Vnc19pbnZhbGlkKGxvLCAmdG1wX2xpc3QsIElPTU9ERV9BTlkpOwogCQkvKiBNYXRjaGVkIGJ5IHJlZmNvdW50IHNldCB0byAxIGluIGFsbG9jX2luaXRfbGF5b3V0X2hkciAqLwogCQlwdXRfbGF5b3V0X2hkcl9sb2NrZWQobG8pOwogCX0KQEAgLTMxMiw3NiArMzU3LDgwIEBACiAKIAl3aGlsZSAoIWxpc3RfZW1wdHkoJnRtcF9saXN0KSkgewogCQlsbyA9IGxpc3RfZW50cnkodG1wX2xpc3QubmV4dCwgc3RydWN0IHBuZnNfbGF5b3V0X2hkciwKLQkJCQlsYXlvdXRzKTsKKwkJCQlwbGhfbGF5b3V0cyk7CiAJCWRwcmludGsoIiVzIGZyZWVpbmcgbGF5b3V0IGZvciBpbm9kZSAlbHVcbiIsIF9fZnVuY19fLAotCQkJbG8tPmlub2RlLT5pX2lubyk7Ci0JCXBuZnNfZGVzdHJveV9sYXlvdXQoTkZTX0kobG8tPmlub2RlKSk7CisJCQlsby0+cGxoX2lub2RlLT5pX2lubyk7CisJCXBuZnNfZGVzdHJveV9sYXlvdXQoTkZTX0kobG8tPnBsaF9pbm9kZSkpOwogCX0KIH0KIAotLyogdXBkYXRlIGxvLT5zdGF0ZWlkIHdpdGggbmV3IGlmIGlzIG1vcmUgcmVjZW50Ci0gKgotICogbG8tPnN0YXRlaWQgY291bGQgYmUgdGhlIG9wZW4gc3RhdGVpZCwgaW4gd2hpY2ggY2FzZSB3ZSBqdXN0IHVzZSB3aGF0IGdpdmVuLgotICovCi1zdGF0aWMgdm9pZAotcG5mc19zZXRfbGF5b3V0X3N0YXRlaWQoc3RydWN0IHBuZnNfbGF5b3V0X2hkciAqbG8sCi0JCQljb25zdCBuZnM0X3N0YXRlaWQgKm5ldykKLXsKLQluZnM0X3N0YXRlaWQgKm9sZCA9ICZsby0+c3RhdGVpZDsKLQlib29sIG92ZXJ3cml0ZSA9IGZhbHNlOwotCi0Jd3JpdGVfc2VxbG9jaygmbG8tPnNlcWxvY2spOwotCWlmICghdGVzdF9iaXQoTkZTX0xBWU9VVF9TVEFURUlEX1NFVCwgJmxvLT5zdGF0ZSkgfHwKLQkgICAgbWVtY21wKG9sZC0+c3RhdGVpZC5vdGhlciwgbmV3LT5zdGF0ZWlkLm90aGVyLCBzaXplb2YobmV3LT5zdGF0ZWlkLm90aGVyKSkpCi0JCW92ZXJ3cml0ZSA9IHRydWU7Ci0JZWxzZSB7Ci0JCXUzMiBvbGRzZXEsIG5ld3NlcTsKLQotCQlvbGRzZXEgPSBiZTMyX3RvX2NwdShvbGQtPnN0YXRlaWQuc2VxaWQpOwotCQluZXdzZXEgPSBiZTMyX3RvX2NwdShuZXctPnN0YXRlaWQuc2VxaWQpOwotCQlpZiAoKGludCkobmV3c2VxIC0gb2xkc2VxKSA+IDApCi0JCQlvdmVyd3JpdGUgPSB0cnVlOwotCX0KLQlpZiAob3ZlcndyaXRlKQotCQltZW1jcHkoJm9sZC0+c3RhdGVpZCwgJm5ldy0+c3RhdGVpZCwgc2l6ZW9mKG5ldy0+c3RhdGVpZCkpOwotCXdyaXRlX3NlcXVubG9jaygmbG8tPnNlcWxvY2spOwotfQotCi1zdGF0aWMgdm9pZAotcG5mc19sYXlvdXRfZnJvbV9vcGVuX3N0YXRlaWQoc3RydWN0IHBuZnNfbGF5b3V0X2hkciAqbG8sCi0JCQkgICAgICBzdHJ1Y3QgbmZzNF9zdGF0ZSAqc3RhdGUpCi17Ci0JaW50IHNlcTsKLQotCWRwcmludGsoIi0tPiAlc1xuIiwgX19mdW5jX18pOwotCXdyaXRlX3NlcWxvY2soJmxvLT5zZXFsb2NrKTsKLQlkbyB7Ci0JCXNlcSA9IHJlYWRfc2VxYmVnaW4oJnN0YXRlLT5zZXFsb2NrKTsKLQkJbWVtY3B5KGxvLT5zdGF0ZWlkLmRhdGEsIHN0YXRlLT5zdGF0ZWlkLmRhdGEsCi0JCSAgICAgICBzaXplb2Yoc3RhdGUtPnN0YXRlaWQuZGF0YSkpOwotCX0gd2hpbGUgKHJlYWRfc2VxcmV0cnkoJnN0YXRlLT5zZXFsb2NrLCBzZXEpKTsKLQlzZXRfYml0KE5GU19MQVlPVVRfU1RBVEVJRF9TRVQsICZsby0+c3RhdGUpOwotCXdyaXRlX3NlcXVubG9jaygmbG8tPnNlcWxvY2spOwotCWRwcmludGsoIjwtLSAlc1xuIiwgX19mdW5jX18pOwotfQotCisvKiB1cGRhdGUgbG8tPnBsaF9zdGF0ZWlkIHdpdGggbmV3IGlmIGlzIG1vcmUgcmVjZW50ICovCiB2b2lkCi1wbmZzX2dldF9sYXlvdXRfc3RhdGVpZChuZnM0X3N0YXRlaWQgKmRzdCwgc3RydWN0IHBuZnNfbGF5b3V0X2hkciAqbG8sCi0JCQlzdHJ1Y3QgbmZzNF9zdGF0ZSAqb3Blbl9zdGF0ZSkKK3BuZnNfc2V0X2xheW91dF9zdGF0ZWlkKHN0cnVjdCBwbmZzX2xheW91dF9oZHIgKmxvLCBjb25zdCBuZnM0X3N0YXRlaWQgKm5ldywKKwkJCWJvb2wgdXBkYXRlX2JhcnJpZXIpCiB7Ci0JaW50IHNlcTsKKwl1MzIgb2xkc2VxLCBuZXdzZXE7CisKKwlvbGRzZXEgPSBiZTMyX3RvX2NwdShsby0+cGxoX3N0YXRlaWQuc3RhdGVpZC5zZXFpZCk7CisJbmV3c2VxID0gYmUzMl90b19jcHUobmV3LT5zdGF0ZWlkLnNlcWlkKTsKKwlpZiAoKGludCkobmV3c2VxIC0gb2xkc2VxKSA+IDApIHsKKwkJbWVtY3B5KCZsby0+cGxoX3N0YXRlaWQsICZuZXctPnN0YXRlaWQsIHNpemVvZihuZXctPnN0YXRlaWQpKTsKKwkJaWYgKHVwZGF0ZV9iYXJyaWVyKSB7CisJCQl1MzIgbmV3X2JhcnJpZXIgPSBiZTMyX3RvX2NwdShuZXctPnN0YXRlaWQuc2VxaWQpOworCisJCQlpZiAoKGludCkobmV3X2JhcnJpZXIgLSBsby0+cGxoX2JhcnJpZXIpKQorCQkJCWxvLT5wbGhfYmFycmllciA9IG5ld19iYXJyaWVyOworCQl9IGVsc2UgeworCQkJLyogQmVjYXVzZSBvZiB3cmFwYXJvdW5kLCB3ZSB3YW50IHRvIGtlZXAgdGhlIGJhcnJpZXIKKwkJCSAqICJjbG9zZSIgdG8gdGhlIGN1cnJlbnQgc2VxaWRzLiAgSXQgbmVlZHMgdG8gYmUKKwkJCSAqIHdpdGhpbiAyKiozMSB0byBjb3VudCBhcyAiYmVoaW5kIiwgc28gaWYgaXQKKwkJCSAqIGdldHMgdG9vIG5lYXIgdGhhdCBsaW1pdCwgZ2l2ZSB1cyBhIGxpdGxlIGxlZXdheQorCQkJICogYW5kIGJyaW5nIGl0IHRvIHdpdGhpbiAyKiozMC4KKwkJCSAqIE5PVEUgLSBhbmQgeWVzLCB0aGlzIGlzIGFsbCB1bnNpZ25lZCBhcml0aG1ldGljLgorCQkJICovCisJCQlpZiAodW5saWtlbHkoKG5ld3NlcSAtIGxvLT5wbGhfYmFycmllcikgPiAoMyA8PCAyOSkpKQorCQkJCWxvLT5wbGhfYmFycmllciA9IG5ld3NlcSAtICgxIDw8IDMwKTsKKwkJfQorCX0KK30KKworLyogbGdldCBpcyBzZXQgdG8gMSBpZiBjYWxsZWQgZnJvbSBpbnNpZGUgc2VuZF9sYXlvdXRnZXQgY2FsbCBjaGFpbiAqLworc3RhdGljIGJvb2wKK3BuZnNfbGF5b3V0Z2V0c19ibG9ja2VkKHN0cnVjdCBwbmZzX2xheW91dF9oZHIgKmxvLCBuZnM0X3N0YXRlaWQgKnN0YXRlaWQsCisJCQlpbnQgbGdldCkKK3sKKwlpZiAoKHN0YXRlaWQpICYmCisJICAgIChpbnQpKGxvLT5wbGhfYmFycmllciAtIGJlMzJfdG9fY3B1KHN0YXRlaWQtPnN0YXRlaWQuc2VxaWQpKSA+PSAwKQorCQlyZXR1cm4gdHJ1ZTsKKwlyZXR1cm4gbG8tPnBsaF9ibG9ja19sZ2V0cyB8fAorCQl0ZXN0X2JpdChORlNfTEFZT1VUX0JVTEtfUkVDQUxMLCAmbG8tPnBsaF9mbGFncykgfHwKKwkJKGxpc3RfZW1wdHkoJmxvLT5wbGhfc2VncykgJiYKKwkJIChhdG9taWNfcmVhZCgmbG8tPnBsaF9vdXRzdGFuZGluZykgPiBsZ2V0KSk7Cit9CisKK2ludAorcG5mc19jaG9vc2VfbGF5b3V0Z2V0X3N0YXRlaWQobmZzNF9zdGF0ZWlkICpkc3QsIHN0cnVjdCBwbmZzX2xheW91dF9oZHIgKmxvLAorCQkJICAgICAgc3RydWN0IG5mczRfc3RhdGUgKm9wZW5fc3RhdGUpCit7CisJaW50IHN0YXR1cyA9IDA7CiAKIAlkcHJpbnRrKCItLT4gJXNcbiIsIF9fZnVuY19fKTsKLQlkbyB7Ci0JCXNlcSA9IHJlYWRfc2VxYmVnaW4oJmxvLT5zZXFsb2NrKTsKLQkJaWYgKCF0ZXN0X2JpdChORlNfTEFZT1VUX1NUQVRFSURfU0VULCAmbG8tPnN0YXRlKSkgewotCQkJLyogVGhpcyB3aWxsIHRyaWdnZXIgcmV0cnkgb2YgdGhlIHJlYWQgKi8KLQkJCXBuZnNfbGF5b3V0X2Zyb21fb3Blbl9zdGF0ZWlkKGxvLCBvcGVuX3N0YXRlKTsKLQkJfSBlbHNlCi0JCQltZW1jcHkoZHN0LT5kYXRhLCBsby0+c3RhdGVpZC5kYXRhLAotCQkJICAgICAgIHNpemVvZihsby0+c3RhdGVpZC5kYXRhKSk7Ci0JfSB3aGlsZSAocmVhZF9zZXFyZXRyeSgmbG8tPnNlcWxvY2ssIHNlcSkpOworCXNwaW5fbG9jaygmbG8tPnBsaF9pbm9kZS0+aV9sb2NrKTsKKwlpZiAocG5mc19sYXlvdXRnZXRzX2Jsb2NrZWQobG8sIE5VTEwsIDEpKSB7CisJCXN0YXR1cyA9IC1FQUdBSU47CisJfSBlbHNlIGlmIChsaXN0X2VtcHR5KCZsby0+cGxoX3NlZ3MpKSB7CisJCWludCBzZXE7CisKKwkJZG8geworCQkJc2VxID0gcmVhZF9zZXFiZWdpbigmb3Blbl9zdGF0ZS0+c2VxbG9jayk7CisJCQltZW1jcHkoZHN0LT5kYXRhLCBvcGVuX3N0YXRlLT5zdGF0ZWlkLmRhdGEsCisJCQkgICAgICAgc2l6ZW9mKG9wZW5fc3RhdGUtPnN0YXRlaWQuZGF0YSkpOworCQl9IHdoaWxlIChyZWFkX3NlcXJldHJ5KCZvcGVuX3N0YXRlLT5zZXFsb2NrLCBzZXEpKTsKKwl9IGVsc2UKKwkJbWVtY3B5KGRzdC0+ZGF0YSwgbG8tPnBsaF9zdGF0ZWlkLmRhdGEsIHNpemVvZihsby0+cGxoX3N0YXRlaWQuZGF0YSkpOworCXNwaW5fdW5sb2NrKCZsby0+cGxoX2lub2RlLT5pX2xvY2spOwogCWRwcmludGsoIjwtLSAlc1xuIiwgX19mdW5jX18pOworCXJldHVybiBzdGF0dXM7CiB9CiAKIC8qCkBAIC0zOTUsNyArNDQ0LDcgQEAKIAkgICBzdHJ1Y3QgbmZzX29wZW5fY29udGV4dCAqY3R4LAogCSAgIHUzMiBpb21vZGUpCiB7Ci0Jc3RydWN0IGlub2RlICppbm8gPSBsby0+aW5vZGU7CisJc3RydWN0IGlub2RlICppbm8gPSBsby0+cGxoX2lub2RlOwogCXN0cnVjdCBuZnNfc2VydmVyICpzZXJ2ZXIgPSBORlNfU0VSVkVSKGlubyk7CiAJc3RydWN0IG5mczRfbGF5b3V0Z2V0ICpsZ3A7CiAJc3RydWN0IHBuZnNfbGF5b3V0X3NlZ21lbnQgKmxzZWcgPSBOVUxMOwpAQCAtNDA0LDEwICs0NTMsOCBAQAogCiAJQlVHX09OKGN0eCA9PSBOVUxMKTsKIAlsZ3AgPSBremFsbG9jKHNpemVvZigqbGdwKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKGxncCA9PSBOVUxMKSB7Ci0JCXB1dF9sYXlvdXRfaGRyKGxvLT5pbm9kZSk7CisJaWYgKGxncCA9PSBOVUxMKQogCQlyZXR1cm4gTlVMTDsKLQl9CiAJbGdwLT5hcmdzLm1pbmxlbmd0aCA9IE5GUzRfTUFYX1VJTlQ2NDsKIAlsZ3AtPmFyZ3MubWF4Y291bnQgPSBQTkZTX0xBWU9VVF9NQVhTSVpFOwogCWxncC0+YXJncy5yYW5nZS5pb21vZGUgPSBpb21vZGU7CkBAIC00MjQsMTEgKzQ3MSw4OCBAQAogCW5mczRfcHJvY19sYXlvdXRnZXQobGdwKTsKIAlpZiAoIWxzZWcpIHsKIAkJLyogcmVtZW1iZXIgdGhhdCBMQVlPVVRHRVQgZmFpbGVkIGFuZCBzdXNwZW5kIHRyeWluZyAqLwotCQlzZXRfYml0KGxvX2ZhaWxfYml0KGlvbW9kZSksICZsby0+c3RhdGUpOworCQlzZXRfYml0KGxvX2ZhaWxfYml0KGlvbW9kZSksICZsby0+cGxoX2ZsYWdzKTsKIAl9CiAJcmV0dXJuIGxzZWc7CiB9CiAKK2Jvb2wgcG5mc19yb2Moc3RydWN0IGlub2RlICppbm8pCit7CisJc3RydWN0IHBuZnNfbGF5b3V0X2hkciAqbG87CisJc3RydWN0IHBuZnNfbGF5b3V0X3NlZ21lbnQgKmxzZWcsICp0bXA7CisJTElTVF9IRUFEKHRtcF9saXN0KTsKKwlib29sIGZvdW5kID0gZmFsc2U7CisKKwlzcGluX2xvY2soJmluby0+aV9sb2NrKTsKKwlsbyA9IE5GU19JKGlubyktPmxheW91dDsKKwlpZiAoIWxvIHx8ICF0ZXN0X2FuZF9jbGVhcl9iaXQoTkZTX0xBWU9VVF9ST0MsICZsby0+cGxoX2ZsYWdzKSB8fAorCSAgICB0ZXN0X2JpdChORlNfTEFZT1VUX0JVTEtfUkVDQUxMLCAmbG8tPnBsaF9mbGFncykpCisJCWdvdG8gb3V0X25vbGF5b3V0OworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShsc2VnLCB0bXAsICZsby0+cGxoX3NlZ3MsIHBsc19saXN0KQorCQlpZiAodGVzdF9iaXQoTkZTX0xTRUdfUk9DLCAmbHNlZy0+cGxzX2ZsYWdzKSkgeworCQkJbWFya19sc2VnX2ludmFsaWQobHNlZywgJnRtcF9saXN0KTsKKwkJCWZvdW5kID0gdHJ1ZTsKKwkJfQorCWlmICghZm91bmQpCisJCWdvdG8gb3V0X25vbGF5b3V0OworCWxvLT5wbGhfYmxvY2tfbGdldHMrKzsKKwlnZXRfbGF5b3V0X2hkcihsbyk7IC8qIG1hdGNoZWQgaW4gcG5mc19yb2NfcmVsZWFzZSAqLworCXNwaW5fdW5sb2NrKCZpbm8tPmlfbG9jayk7CisJcG5mc19mcmVlX2xzZWdfbGlzdCgmdG1wX2xpc3QpOworCXJldHVybiB0cnVlOworCitvdXRfbm9sYXlvdXQ6CisJc3Bpbl91bmxvY2soJmluby0+aV9sb2NrKTsKKwlyZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgcG5mc19yb2NfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlubykKK3sKKwlzdHJ1Y3QgcG5mc19sYXlvdXRfaGRyICpsbzsKKworCXNwaW5fbG9jaygmaW5vLT5pX2xvY2spOworCWxvID0gTkZTX0koaW5vKS0+bGF5b3V0OworCWxvLT5wbGhfYmxvY2tfbGdldHMtLTsKKwlwdXRfbGF5b3V0X2hkcl9sb2NrZWQobG8pOworCXNwaW5fdW5sb2NrKCZpbm8tPmlfbG9jayk7Cit9CisKK3ZvaWQgcG5mc19yb2Nfc2V0X2JhcnJpZXIoc3RydWN0IGlub2RlICppbm8sIHUzMiBiYXJyaWVyKQoreworCXN0cnVjdCBwbmZzX2xheW91dF9oZHIgKmxvOworCisJc3Bpbl9sb2NrKCZpbm8tPmlfbG9jayk7CisJbG8gPSBORlNfSShpbm8pLT5sYXlvdXQ7CisJaWYgKChpbnQpKGJhcnJpZXIgLSBsby0+cGxoX2JhcnJpZXIpID4gMCkKKwkJbG8tPnBsaF9iYXJyaWVyID0gYmFycmllcjsKKwlzcGluX3VubG9jaygmaW5vLT5pX2xvY2spOworfQorCitib29sIHBuZnNfcm9jX2RyYWluKHN0cnVjdCBpbm9kZSAqaW5vLCB1MzIgKmJhcnJpZXIpCit7CisJc3RydWN0IG5mc19pbm9kZSAqbmZzaSA9IE5GU19JKGlubyk7CisJc3RydWN0IHBuZnNfbGF5b3V0X3NlZ21lbnQgKmxzZWc7CisJYm9vbCBmb3VuZCA9IGZhbHNlOworCisJc3Bpbl9sb2NrKCZpbm8tPmlfbG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShsc2VnLCAmbmZzaS0+bGF5b3V0LT5wbGhfc2VncywgcGxzX2xpc3QpCisJCWlmICh0ZXN0X2JpdChORlNfTFNFR19ST0MsICZsc2VnLT5wbHNfZmxhZ3MpKSB7CisJCQlmb3VuZCA9IHRydWU7CisJCQlicmVhazsKKwkJfQorCWlmICghZm91bmQpIHsKKwkJc3RydWN0IHBuZnNfbGF5b3V0X2hkciAqbG8gPSBuZnNpLT5sYXlvdXQ7CisJCXUzMiBjdXJyZW50X3NlcWlkID0gYmUzMl90b19jcHUobG8tPnBsaF9zdGF0ZWlkLnN0YXRlaWQuc2VxaWQpOworCisJCS8qIFNpbmNlIGNsb3NlIGRvZXMgbm90IHJldHVybiBhIGxheW91dCBzdGF0ZWlkIGZvciB1c2UgYXMKKwkJICogYSBiYXJyaWVyLCB3ZSBjaG9vc2UgdGhlIHdvcnN0LWNhc2UgYmFycmllci4KKwkJICovCisJCSpiYXJyaWVyID0gY3VycmVudF9zZXFpZCArIGF0b21pY19yZWFkKCZsby0+cGxoX291dHN0YW5kaW5nKTsKKwl9CisJc3Bpbl91bmxvY2soJmluby0+aV9sb2NrKTsKKwlyZXR1cm4gZm91bmQ7Cit9CisKIC8qCiAgKiBDb21wYXJlIHR3byBsYXlvdXQgc2VnbWVudHMgZm9yIHNvcnRpbmcgaW50byBsYXlvdXQgY2FjaGUuCiAgKiBXZSB3YW50IHRvIHByZWZlcmVudGlhbGx5IHJldHVybiBSVyBvdmVyIFJPIGxheW91dHMsIHNvIGVuc3VyZSB0aG9zZQpAQCAtNDUwLDM3ICs1NzQsMjkgQEAKIAogCWRwcmludGsoIiVzOkJlZ2luXG4iLCBfX2Z1bmNfXyk7CiAKLQlhc3NlcnRfc3Bpbl9sb2NrZWQoJmxvLT5pbm9kZS0+aV9sb2NrKTsKLQlpZiAobGlzdF9lbXB0eSgmbG8tPnNlZ3MpKSB7Ci0JCXN0cnVjdCBuZnNfY2xpZW50ICpjbHAgPSBORlNfU0VSVkVSKGxvLT5pbm9kZSktPm5mc19jbGllbnQ7Ci0KLQkJc3Bpbl9sb2NrKCZjbHAtPmNsX2xvY2spOwotCQlCVUdfT04oIWxpc3RfZW1wdHkoJmxvLT5sYXlvdXRzKSk7Ci0JCWxpc3RfYWRkX3RhaWwoJmxvLT5sYXlvdXRzLCAmY2xwLT5jbF9sYXlvdXRzKTsKLQkJc3Bpbl91bmxvY2soJmNscC0+Y2xfbG9jayk7Ci0JfQotCWxpc3RfZm9yX2VhY2hfZW50cnkobHAsICZsby0+c2VncywgZmlfbGlzdCkgewotCQlpZiAoY21wX2xheW91dChscC0+cmFuZ2UuaW9tb2RlLCBsc2VnLT5yYW5nZS5pb21vZGUpID4gMCkKKwlhc3NlcnRfc3Bpbl9sb2NrZWQoJmxvLT5wbGhfaW5vZGUtPmlfbG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShscCwgJmxvLT5wbGhfc2VncywgcGxzX2xpc3QpIHsKKwkJaWYgKGNtcF9sYXlvdXQobHAtPnBsc19yYW5nZS5pb21vZGUsIGxzZWctPnBsc19yYW5nZS5pb21vZGUpID4gMCkKIAkJCWNvbnRpbnVlOwotCQlsaXN0X2FkZF90YWlsKCZsc2VnLT5maV9saXN0LCAmbHAtPmZpX2xpc3QpOworCQlsaXN0X2FkZF90YWlsKCZsc2VnLT5wbHNfbGlzdCwgJmxwLT5wbHNfbGlzdCk7CiAJCWRwcmludGsoIiVzOiBpbnNlcnRlZCBsc2VnICVwICIKIAkJCSJpb21vZGUgJWQgb2Zmc2V0ICVsbHUgbGVuZ3RoICVsbHUgYmVmb3JlICIKIAkJCSJscCAlcCBpb21vZGUgJWQgb2Zmc2V0ICVsbHUgbGVuZ3RoICVsbHVcbiIsCi0JCQlfX2Z1bmNfXywgbHNlZywgbHNlZy0+cmFuZ2UuaW9tb2RlLAotCQkJbHNlZy0+cmFuZ2Uub2Zmc2V0LCBsc2VnLT5yYW5nZS5sZW5ndGgsCi0JCQlscCwgbHAtPnJhbmdlLmlvbW9kZSwgbHAtPnJhbmdlLm9mZnNldCwKLQkJCWxwLT5yYW5nZS5sZW5ndGgpOworCQkJX19mdW5jX18sIGxzZWcsIGxzZWctPnBsc19yYW5nZS5pb21vZGUsCisJCQlsc2VnLT5wbHNfcmFuZ2Uub2Zmc2V0LCBsc2VnLT5wbHNfcmFuZ2UubGVuZ3RoLAorCQkJbHAsIGxwLT5wbHNfcmFuZ2UuaW9tb2RlLCBscC0+cGxzX3JhbmdlLm9mZnNldCwKKwkJCWxwLT5wbHNfcmFuZ2UubGVuZ3RoKTsKIAkJZm91bmQgPSAxOwogCQlicmVhazsKIAl9CiAJaWYgKCFmb3VuZCkgewotCQlsaXN0X2FkZF90YWlsKCZsc2VnLT5maV9saXN0LCAmbG8tPnNlZ3MpOworCQlsaXN0X2FkZF90YWlsKCZsc2VnLT5wbHNfbGlzdCwgJmxvLT5wbGhfc2Vncyk7CiAJCWRwcmludGsoIiVzOiBpbnNlcnRlZCBsc2VnICVwICIKIAkJCSJpb21vZGUgJWQgb2Zmc2V0ICVsbHUgbGVuZ3RoICVsbHUgYXQgdGFpbFxuIiwKLQkJCV9fZnVuY19fLCBsc2VnLCBsc2VnLT5yYW5nZS5pb21vZGUsCi0JCQlsc2VnLT5yYW5nZS5vZmZzZXQsIGxzZWctPnJhbmdlLmxlbmd0aCk7CisJCQlfX2Z1bmNfXywgbHNlZywgbHNlZy0+cGxzX3JhbmdlLmlvbW9kZSwKKwkJCWxzZWctPnBsc19yYW5nZS5vZmZzZXQsIGxzZWctPnBsc19yYW5nZS5sZW5ndGgpOwogCX0KLQlnZXRfbGF5b3V0X2hkcl9sb2NrZWQobG8pOworCWdldF9sYXlvdXRfaGRyKGxvKTsKIAogCWRwcmludGsoIiVzOlJldHVyblxuIiwgX19mdW5jX18pOwogfQpAQCAtNDkzLDExICs2MDksMTEgQEAKIAlsbyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBwbmZzX2xheW91dF9oZHIpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWxvKQogCQlyZXR1cm4gTlVMTDsKLQlsby0+cmVmY291bnQgPSAxOwotCUlOSVRfTElTVF9IRUFEKCZsby0+bGF5b3V0cyk7Ci0JSU5JVF9MSVNUX0hFQUQoJmxvLT5zZWdzKTsKLQlzZXFsb2NrX2luaXQoJmxvLT5zZXFsb2NrKTsKLQlsby0+aW5vZGUgPSBpbm87CisJYXRvbWljX3NldCgmbG8tPnBsaF9yZWZjb3VudCwgMSk7CisJSU5JVF9MSVNUX0hFQUQoJmxvLT5wbGhfbGF5b3V0cyk7CisJSU5JVF9MSVNUX0hFQUQoJmxvLT5wbGhfc2Vncyk7CisJSU5JVF9MSVNUX0hFQUQoJmxvLT5wbGhfYnVsa19yZWNhbGwpOworCWxvLT5wbGhfaW5vZGUgPSBpbm87CiAJcmV0dXJuIGxvOwogfQogCkBAIC01MTAsOSArNjI2LDEyIEBACiAJZHByaW50aygiJXMgQmVnaW4gaW5vPSVwIGxheW91dD0lcFxuIiwgX19mdW5jX18sIGlubywgbmZzaS0+bGF5b3V0KTsKIAogCWFzc2VydF9zcGluX2xvY2tlZCgmaW5vLT5pX2xvY2spOwotCWlmIChuZnNpLT5sYXlvdXQpCi0JCXJldHVybiBuZnNpLT5sYXlvdXQ7Ci0KKwlpZiAobmZzaS0+bGF5b3V0KSB7CisJCWlmICh0ZXN0X2JpdChORlNfTEFZT1VUX0RFU1RST1lFRCwgJm5mc2ktPmxheW91dC0+cGxoX2ZsYWdzKSkKKwkJCXJldHVybiBOVUxMOworCQllbHNlCisJCQlyZXR1cm4gbmZzaS0+bGF5b3V0OworCX0KIAlzcGluX3VubG9jaygmaW5vLT5pX2xvY2spOwogCW5ldyA9IGFsbG9jX2luaXRfbGF5b3V0X2hkcihpbm8pOwogCXNwaW5fbG9jaygmaW5vLT5pX2xvY2spOwpAQCAtNTM4LDMxICs2NTcsMzIgQEAKIHN0YXRpYyBpbnQKIGlzX21hdGNoaW5nX2xzZWcoc3RydWN0IHBuZnNfbGF5b3V0X3NlZ21lbnQgKmxzZWcsIHUzMiBpb21vZGUpCiB7Ci0JcmV0dXJuIChpb21vZGUgIT0gSU9NT0RFX1JXIHx8IGxzZWctPnJhbmdlLmlvbW9kZSA9PSBJT01PREVfUlcpOworCXJldHVybiAoaW9tb2RlICE9IElPTU9ERV9SVyB8fCBsc2VnLT5wbHNfcmFuZ2UuaW9tb2RlID09IElPTU9ERV9SVyk7CiB9CiAKIC8qCiAgKiBsb29rdXAgcmFuZ2UgaW4gbGF5b3V0CiAgKi8KIHN0YXRpYyBzdHJ1Y3QgcG5mc19sYXlvdXRfc2VnbWVudCAqCi1wbmZzX2hhc19sYXlvdXQoc3RydWN0IHBuZnNfbGF5b3V0X2hkciAqbG8sIHUzMiBpb21vZGUpCitwbmZzX2ZpbmRfbHNlZyhzdHJ1Y3QgcG5mc19sYXlvdXRfaGRyICpsbywgdTMyIGlvbW9kZSkKIHsKIAlzdHJ1Y3QgcG5mc19sYXlvdXRfc2VnbWVudCAqbHNlZywgKnJldCA9IE5VTEw7CiAKIAlkcHJpbnRrKCIlczpCZWdpblxuIiwgX19mdW5jX18pOwogCi0JYXNzZXJ0X3NwaW5fbG9ja2VkKCZsby0+aW5vZGUtPmlfbG9jayk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeShsc2VnLCAmbG8tPnNlZ3MsIGZpX2xpc3QpIHsKLQkJaWYgKGlzX21hdGNoaW5nX2xzZWcobHNlZywgaW9tb2RlKSkgeworCWFzc2VydF9zcGluX2xvY2tlZCgmbG8tPnBsaF9pbm9kZS0+aV9sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGxzZWcsICZsby0+cGxoX3NlZ3MsIHBsc19saXN0KSB7CisJCWlmICh0ZXN0X2JpdChORlNfTFNFR19WQUxJRCwgJmxzZWctPnBsc19mbGFncykgJiYKKwkJICAgIGlzX21hdGNoaW5nX2xzZWcobHNlZywgaW9tb2RlKSkgewogCQkJcmV0ID0gbHNlZzsKIAkJCWJyZWFrOwogCQl9Ci0JCWlmIChjbXBfbGF5b3V0KGlvbW9kZSwgbHNlZy0+cmFuZ2UuaW9tb2RlKSA+IDApCisJCWlmIChjbXBfbGF5b3V0KGlvbW9kZSwgbHNlZy0+cGxzX3JhbmdlLmlvbW9kZSkgPiAwKQogCQkJYnJlYWs7CiAJfQogCiAJZHByaW50aygiJXM6UmV0dXJuIGxzZWcgJXAgcmVmICVkXG4iLAotCQlfX2Z1bmNfXywgcmV0LCByZXQgPyBhdG9taWNfcmVhZCgmcmV0LT5rcmVmLnJlZmNvdW50KSA6IDApOworCQlfX2Z1bmNfXywgcmV0LCByZXQgPyBhdG9taWNfcmVhZCgmcmV0LT5wbHNfcmVmY291bnQpIDogMCk7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtNTc2LDYgKzY5Niw3IEBACiAJCSAgIGVudW0gcG5mc19pb21vZGUgaW9tb2RlKQogewogCXN0cnVjdCBuZnNfaW5vZGUgKm5mc2kgPSBORlNfSShpbm8pOworCXN0cnVjdCBuZnNfY2xpZW50ICpjbHAgPSBORlNfU0VSVkVSKGlubyktPm5mc19jbGllbnQ7CiAJc3RydWN0IHBuZnNfbGF5b3V0X2hkciAqbG87CiAJc3RydWN0IHBuZnNfbGF5b3V0X3NlZ21lbnQgKmxzZWcgPSBOVUxMOwogCkBAIC01ODgsMjUgKzcwOSw1MyBAQAogCQlnb3RvIG91dF91bmxvY2s7CiAJfQogCi0JLyogQ2hlY2sgdG8gc2VlIGlmIHRoZSBsYXlvdXQgZm9yIHRoZSBnaXZlbiByYW5nZSBhbHJlYWR5IGV4aXN0cyAqLwotCWxzZWcgPSBwbmZzX2hhc19sYXlvdXQobG8sIGlvbW9kZSk7Ci0JaWYgKGxzZWcpIHsKLQkJZHByaW50aygiJXM6IFVzaW5nIGNhY2hlZCBsc2VnICVwIGZvciBpb21vZGUgJWQpXG4iLAotCQkJX19mdW5jX18sIGxzZWcsIGlvbW9kZSk7CisJLyogRG8gd2UgZXZlbiBuZWVkIHRvIGJvdGhlciB3aXRoIHRoaXM/ICovCisJaWYgKHRlc3RfYml0KE5GUzRDTE5UX0xBWU9VVFJFQ0FMTCwgJmNscC0+Y2xfc3RhdGUpIHx8CisJICAgIHRlc3RfYml0KE5GU19MQVlPVVRfQlVMS19SRUNBTEwsICZsby0+cGxoX2ZsYWdzKSkgeworCQlkcHJpbnRrKCIlcyBtYXRjaGVzIHJlY2FsbCwgdXNlIE1EU1xuIiwgX19mdW5jX18pOwogCQlnb3RvIG91dF91bmxvY2s7CiAJfQotCi0JLyogaWYgTEFZT1VUR0VUIGFscmVhZHkgZmFpbGVkIG9uY2Ugd2UgZG9uJ3QgdHJ5IGFnYWluICovCi0JaWYgKHRlc3RfYml0KGxvX2ZhaWxfYml0KGlvbW9kZSksICZuZnNpLT5sYXlvdXQtPnN0YXRlKSkKKwkvKiBDaGVjayB0byBzZWUgaWYgdGhlIGxheW91dCBmb3IgdGhlIGdpdmVuIHJhbmdlIGFscmVhZHkgZXhpc3RzICovCisJbHNlZyA9IHBuZnNfZmluZF9sc2VnKGxvLCBpb21vZGUpOworCWlmIChsc2VnKQogCQlnb3RvIG91dF91bmxvY2s7CiAKLQlnZXRfbGF5b3V0X2hkcl9sb2NrZWQobG8pOyAvKiBNYXRjaGVkIGluIG5mczRfbGF5b3V0Z2V0X3JlbGVhc2UgKi8KKwkvKiBpZiBMQVlPVVRHRVQgYWxyZWFkeSBmYWlsZWQgb25jZSB3ZSBkb24ndCB0cnkgYWdhaW4gKi8KKwlpZiAodGVzdF9iaXQobG9fZmFpbF9iaXQoaW9tb2RlKSwgJm5mc2ktPmxheW91dC0+cGxoX2ZsYWdzKSkKKwkJZ290byBvdXRfdW5sb2NrOworCisJaWYgKHBuZnNfbGF5b3V0Z2V0c19ibG9ja2VkKGxvLCBOVUxMLCAwKSkKKwkJZ290byBvdXRfdW5sb2NrOworCWF0b21pY19pbmMoJmxvLT5wbGhfb3V0c3RhbmRpbmcpOworCisJZ2V0X2xheW91dF9oZHIobG8pOworCWlmIChsaXN0X2VtcHR5KCZsby0+cGxoX3NlZ3MpKSB7CisJCS8qIFRoZSBsbyBtdXN0IGJlIG9uIHRoZSBjbHAgbGlzdCBpZiB0aGVyZSBpcyBhbnkKKwkJICogY2hhbmNlIG9mIGEgQ0JfTEFZT1VUUkVDQUxMKEZJTEUpIGNvbWluZyBpbi4KKwkJICovCisJCXNwaW5fbG9jaygmY2xwLT5jbF9sb2NrKTsKKwkJQlVHX09OKCFsaXN0X2VtcHR5KCZsby0+cGxoX2xheW91dHMpKTsKKwkJbGlzdF9hZGRfdGFpbCgmbG8tPnBsaF9sYXlvdXRzLCAmY2xwLT5jbF9sYXlvdXRzKTsKKwkJc3Bpbl91bmxvY2soJmNscC0+Y2xfbG9jayk7CisJfQogCXNwaW5fdW5sb2NrKCZpbm8tPmlfbG9jayk7CiAKIAlsc2VnID0gc2VuZF9sYXlvdXRnZXQobG8sIGN0eCwgaW9tb2RlKTsKKwlpZiAoIWxzZWcpIHsKKwkJc3Bpbl9sb2NrKCZpbm8tPmlfbG9jayk7CisJCWlmIChsaXN0X2VtcHR5KCZsby0+cGxoX3NlZ3MpKSB7CisJCQlzcGluX2xvY2soJmNscC0+Y2xfbG9jayk7CisJCQlsaXN0X2RlbF9pbml0KCZsby0+cGxoX2xheW91dHMpOworCQkJc3Bpbl91bmxvY2soJmNscC0+Y2xfbG9jayk7CisJCQljbGVhcl9iaXQoTkZTX0xBWU9VVF9CVUxLX1JFQ0FMTCwgJmxvLT5wbGhfZmxhZ3MpOworCQl9CisJCXNwaW5fdW5sb2NrKCZpbm8tPmlfbG9jayk7CisJfQorCWF0b21pY19kZWMoJmxvLT5wbGhfb3V0c3RhbmRpbmcpOworCXB1dF9sYXlvdXRfaGRyKGxvKTsKIG91dDoKIAlkcHJpbnRrKCIlcyBlbmQsIHN0YXRlIDB4JWx4IGxzZWcgJXBcbiIsIF9fZnVuY19fLAotCQluZnNpLT5sYXlvdXQtPnN0YXRlLCBsc2VnKTsKKwkJbmZzaS0+bGF5b3V0LT5wbGhfZmxhZ3MsIGxzZWcpOwogCXJldHVybiBsc2VnOwogb3V0X3VubG9jazoKIAlzcGluX3VubG9jaygmaW5vLT5pX2xvY2spOwpAQCAtNjE5LDkgKzc2OCwyMSBAQAogCXN0cnVjdCBwbmZzX2xheW91dF9oZHIgKmxvID0gTkZTX0kobGdwLT5hcmdzLmlub2RlKS0+bGF5b3V0OwogCXN0cnVjdCBuZnM0X2xheW91dGdldF9yZXMgKnJlcyA9ICZsZ3AtPnJlczsKIAlzdHJ1Y3QgcG5mc19sYXlvdXRfc2VnbWVudCAqbHNlZzsKLQlzdHJ1Y3QgaW5vZGUgKmlubyA9IGxvLT5pbm9kZTsKKwlzdHJ1Y3QgaW5vZGUgKmlubyA9IGxvLT5wbGhfaW5vZGU7CisJc3RydWN0IG5mc19jbGllbnQgKmNscCA9IE5GU19TRVJWRVIoaW5vKS0+bmZzX2NsaWVudDsKIAlpbnQgc3RhdHVzID0gMDsKIAorCS8qIFZlcmlmeSB3ZSBnb3Qgd2hhdCB3ZSBhc2tlZCBmb3IuCisJICogTm90ZSB0aGF0IGJlY2F1c2UgdGhlIHhkciBwYXJzaW5nIG9ubHkgYWNjZXB0cyBhIHNpbmdsZQorCSAqIGVsZW1lbnQgYXJyYXksIHRoaXMgY2FuIGZhaWwgZXZlbiBpZiB0aGUgc2VydmVyIGlzIGJlaGF2aW5nCisJICogY29ycmVjdGx5LgorCSAqLworCWlmIChsZ3AtPmFyZ3MucmFuZ2UuaW9tb2RlID4gcmVzLT5yYW5nZS5pb21vZGUgfHwKKwkgICAgcmVzLT5yYW5nZS5vZmZzZXQgIT0gMCB8fAorCSAgICByZXMtPnJhbmdlLmxlbmd0aCAhPSBORlM0X01BWF9VSU5UNjQpIHsKKwkJc3RhdHVzID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQogCS8qIEluamVjdCBsYXlvdXQgYmxvYiBpbnRvIEkvTyBkZXZpY2UgZHJpdmVyICovCiAJbHNlZyA9IE5GU19TRVJWRVIoaW5vKS0+cG5mc19jdXJyX2xkLT5hbGxvY19sc2VnKGxvLCByZXMpOwogCWlmICghbHNlZyB8fCBJU19FUlIobHNlZykpIHsKQEAgLTYzNSwxNiArNzk2LDM3IEBACiAJfQogCiAJc3Bpbl9sb2NrKCZpbm8tPmlfbG9jayk7CisJaWYgKHRlc3RfYml0KE5GUzRDTE5UX0xBWU9VVFJFQ0FMTCwgJmNscC0+Y2xfc3RhdGUpIHx8CisJICAgIHRlc3RfYml0KE5GU19MQVlPVVRfQlVMS19SRUNBTEwsICZsby0+cGxoX2ZsYWdzKSkgeworCQlkcHJpbnRrKCIlcyBmb3JnZXQgcmVwbHkgZHVlIHRvIHJlY2FsbFxuIiwgX19mdW5jX18pOworCQlnb3RvIG91dF9mb3JnZXRfcmVwbHk7CisJfQorCisJaWYgKHBuZnNfbGF5b3V0Z2V0c19ibG9ja2VkKGxvLCAmcmVzLT5zdGF0ZWlkLCAxKSkgeworCQlkcHJpbnRrKCIlcyBmb3JnZXQgcmVwbHkgZHVlIHRvIHN0YXRlXG4iLCBfX2Z1bmNfXyk7CisJCWdvdG8gb3V0X2ZvcmdldF9yZXBseTsKKwl9CiAJaW5pdF9sc2VnKGxvLCBsc2VnKTsKLQlsc2VnLT5yYW5nZSA9IHJlcy0+cmFuZ2U7CisJbHNlZy0+cGxzX3JhbmdlID0gcmVzLT5yYW5nZTsKIAkqbGdwLT5sc2VncHAgPSBsc2VnOwogCXBuZnNfaW5zZXJ0X2xheW91dChsbywgbHNlZyk7CiAKKwlpZiAocmVzLT5yZXR1cm5fb25fY2xvc2UpIHsKKwkJc2V0X2JpdChORlNfTFNFR19ST0MsICZsc2VnLT5wbHNfZmxhZ3MpOworCQlzZXRfYml0KE5GU19MQVlPVVRfUk9DLCAmbG8tPnBsaF9mbGFncyk7CisJfQorCiAJLyogRG9uZSBwcm9jZXNzaW5nIGxheW91dGdldC4gU2V0IHRoZSBsYXlvdXQgc3RhdGVpZCAqLwotCXBuZnNfc2V0X2xheW91dF9zdGF0ZWlkKGxvLCAmcmVzLT5zdGF0ZWlkKTsKKwlwbmZzX3NldF9sYXlvdXRfc3RhdGVpZChsbywgJnJlcy0+c3RhdGVpZCwgZmFsc2UpOwogCXNwaW5fdW5sb2NrKCZpbm8tPmlfbG9jayk7CiBvdXQ6CiAJcmV0dXJuIHN0YXR1czsKKworb3V0X2ZvcmdldF9yZXBseToKKwlzcGluX3VubG9jaygmaW5vLT5pX2xvY2spOworCWxzZWctPnBsc19sYXlvdXQgPSBsbzsKKwlORlNfU0VSVkVSKGlubyktPnBuZnNfY3Vycl9sZC0+ZnJlZV9sc2VnKGxzZWcpOworCWdvdG8gb3V0OwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvZnMvbmZzL3BuZnMuaCBiL2ZzL25mcy9wbmZzLmgKaW5kZXggZTEyMzY3ZC4uZTI2MTJlYSAxMDA2NDQKLS0tIGEvZnMvbmZzL3BuZnMuaAorKysgYi9mcy9uZnMvcG5mcy5oCkBAIC0zMCwxMSArMzAsMTcgQEAKICNpZm5kZWYgRlNfTkZTX1BORlNfSAogI2RlZmluZSBGU19ORlNfUE5GU19ICiAKK2VudW0geworCU5GU19MU0VHX1ZBTElEID0gMCwJLyogY2xlYXJlZCB3aGVuIGxzZWcgaXMgcmVjYWxsZWQvcmV0dXJuZWQgKi8KKwlORlNfTFNFR19ST0MsCQkvKiByb2MgYml0IHJlY2VpdmVkIGZyb20gc2VydmVyICovCit9OworCiBzdHJ1Y3QgcG5mc19sYXlvdXRfc2VnbWVudCB7Ci0Jc3RydWN0IGxpc3RfaGVhZCBmaV9saXN0OwotCXN0cnVjdCBwbmZzX2xheW91dF9yYW5nZSByYW5nZTsKLQlzdHJ1Y3Qga3JlZiBrcmVmOwotCXN0cnVjdCBwbmZzX2xheW91dF9oZHIgKmxheW91dDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHBsc19saXN0OworCXN0cnVjdCBwbmZzX2xheW91dF9yYW5nZSBwbHNfcmFuZ2U7CisJYXRvbWljX3QgcGxzX3JlZmNvdW50OworCXVuc2lnbmVkIGxvbmcgcGxzX2ZsYWdzOworCXN0cnVjdCBwbmZzX2xheW91dF9oZHIgKnBsc19sYXlvdXQ7CiB9OwogCiAjaWZkZWYgQ09ORklHX05GU19WNF8xCkBAIC00NCw3ICs1MCw5IEBACiBlbnVtIHsKIAlORlNfTEFZT1VUX1JPX0ZBSUxFRCA9IDAsCS8qIGdldCBybyBsYXlvdXQgZmFpbGVkIHN0b3AgdHJ5aW5nICovCiAJTkZTX0xBWU9VVF9SV19GQUlMRUQsCQkvKiBnZXQgcncgbGF5b3V0IGZhaWxlZCBzdG9wIHRyeWluZyAqLwotCU5GU19MQVlPVVRfU1RBVEVJRF9TRVQsCQkvKiBoYXZlIGEgdmFsaWQgbGF5b3V0IHN0YXRlaWQgKi8KKwlORlNfTEFZT1VUX0JVTEtfUkVDQUxMLAkJLyogYnVsayByZWNhbGwgYWZmZWN0aW5nIGxheW91dCAqLworCU5GU19MQVlPVVRfUk9DLAkJCS8qIHNvbWUgbHNlZyBoYWQgcm9jIGJpdCBzZXQgKi8KKwlORlNfTEFZT1VUX0RFU1RST1lFRCwJCS8qIG5vIG5ldyB1c2Ugb2YgbGF5b3V0IGFsbG93ZWQgKi8KIH07CiAKIC8qIFBlci1sYXlvdXQgZHJpdmVyIHNwZWNpZmljIHJlZ2lzdHJhdGlvbiBzdHJ1Y3R1cmUgKi8KQEAgLTYwLDEzICs2OCwxNiBAQAogfTsKIAogc3RydWN0IHBuZnNfbGF5b3V0X2hkciB7Ci0JdW5zaWduZWQgbG9uZwkJcmVmY291bnQ7Ci0Jc3RydWN0IGxpc3RfaGVhZAlsYXlvdXRzOyAgIC8qIG90aGVyIGNsaWVudCBsYXlvdXRzICovCi0Jc3RydWN0IGxpc3RfaGVhZAlzZWdzOyAgICAgIC8qIGxheW91dCBzZWdtZW50cyBsaXN0ICovCi0Jc2VxbG9ja190CQlzZXFsb2NrOyAgIC8qIFByb3RlY3RzIHRoZSBzdGF0ZWlkICovCi0JbmZzNF9zdGF0ZWlkCQlzdGF0ZWlkOwotCXVuc2lnbmVkIGxvbmcJCXN0YXRlOwotCXN0cnVjdCBpbm9kZQkJKmlub2RlOworCWF0b21pY190CQlwbGhfcmVmY291bnQ7CisJc3RydWN0IGxpc3RfaGVhZAlwbGhfbGF5b3V0czsgICAvKiBvdGhlciBjbGllbnQgbGF5b3V0cyAqLworCXN0cnVjdCBsaXN0X2hlYWQJcGxoX2J1bGtfcmVjYWxsOyAvKiBjbG50IGxpc3Qgb2YgYnVsayByZWNhbGxzICovCisJc3RydWN0IGxpc3RfaGVhZAlwbGhfc2VnczsgICAgICAvKiBsYXlvdXQgc2VnbWVudHMgbGlzdCAqLworCW5mczRfc3RhdGVpZAkJcGxoX3N0YXRlaWQ7CisJYXRvbWljX3QJCXBsaF9vdXRzdGFuZGluZzsgLyogbnVtYmVyIG9mIFJQQ3Mgb3V0ICovCisJdW5zaWduZWQgbG9uZwkJcGxoX2Jsb2NrX2xnZXRzOyAvKiBibG9jayBMQVlPVVRHRVQgaWYgPjAgKi8KKwl1MzIJCQlwbGhfYmFycmllcjsgLyogaWdub3JlIGxvd2VyIHNlcWlkcyAqLworCXVuc2lnbmVkIGxvbmcJCXBsaF9mbGFnczsKKwlzdHJ1Y3QgaW5vZGUJCSpwbGhfaW5vZGU7CiB9OwogCiBzdHJ1Y3QgcG5mc19kZXZpY2UgewpAQCAtMTM0LDE3ICsxNDUsMzAgQEAKIGV4dGVybiBpbnQgbmZzNF9wcm9jX2xheW91dGdldChzdHJ1Y3QgbmZzNF9sYXlvdXRnZXQgKmxncCk7CiAKIC8qIHBuZnMuYyAqLwordm9pZCBnZXRfbGF5b3V0X2hkcihzdHJ1Y3QgcG5mc19sYXlvdXRfaGRyICpsbyk7CiBzdHJ1Y3QgcG5mc19sYXlvdXRfc2VnbWVudCAqCiBwbmZzX3VwZGF0ZV9sYXlvdXQoc3RydWN0IGlub2RlICppbm8sIHN0cnVjdCBuZnNfb3Blbl9jb250ZXh0ICpjdHgsCiAJCSAgIGVudW0gcG5mc19pb21vZGUgYWNjZXNzX3R5cGUpOwogdm9pZCBzZXRfcG5mc19sYXlvdXRkcml2ZXIoc3RydWN0IG5mc19zZXJ2ZXIgKiwgdTMyIGlkKTsKIHZvaWQgdW5zZXRfcG5mc19sYXlvdXRkcml2ZXIoc3RydWN0IG5mc19zZXJ2ZXIgKik7CiBpbnQgcG5mc19sYXlvdXRfcHJvY2VzcyhzdHJ1Y3QgbmZzNF9sYXlvdXRnZXQgKmxncCk7Cit2b2lkIHBuZnNfZnJlZV9sc2VnX2xpc3Qoc3RydWN0IGxpc3RfaGVhZCAqdG1wX2xpc3QpOwogdm9pZCBwbmZzX2Rlc3Ryb3lfbGF5b3V0KHN0cnVjdCBuZnNfaW5vZGUgKik7CiB2b2lkIHBuZnNfZGVzdHJveV9hbGxfbGF5b3V0cyhzdHJ1Y3QgbmZzX2NsaWVudCAqKTsKLXZvaWQgcHV0X2xheW91dF9oZHIoc3RydWN0IGlub2RlICppbm9kZSk7Ci12b2lkIHBuZnNfZ2V0X2xheW91dF9zdGF0ZWlkKG5mczRfc3RhdGVpZCAqZHN0LCBzdHJ1Y3QgcG5mc19sYXlvdXRfaGRyICpsbywKLQkJCSAgICAgc3RydWN0IG5mczRfc3RhdGUgKm9wZW5fc3RhdGUpOwordm9pZCBwdXRfbGF5b3V0X2hkcihzdHJ1Y3QgcG5mc19sYXlvdXRfaGRyICpsbyk7Cit2b2lkIHBuZnNfc2V0X2xheW91dF9zdGF0ZWlkKHN0cnVjdCBwbmZzX2xheW91dF9oZHIgKmxvLAorCQkJICAgICBjb25zdCBuZnM0X3N0YXRlaWQgKm5ldywKKwkJCSAgICAgYm9vbCB1cGRhdGVfYmFycmllcik7CitpbnQgcG5mc19jaG9vc2VfbGF5b3V0Z2V0X3N0YXRlaWQobmZzNF9zdGF0ZWlkICpkc3QsCisJCQkJICBzdHJ1Y3QgcG5mc19sYXlvdXRfaGRyICpsbywKKwkJCQkgIHN0cnVjdCBuZnM0X3N0YXRlICpvcGVuX3N0YXRlKTsKK2ludCBtYXJrX21hdGNoaW5nX2xzZWdzX2ludmFsaWQoc3RydWN0IHBuZnNfbGF5b3V0X2hkciAqbG8sCisJCQkJc3RydWN0IGxpc3RfaGVhZCAqdG1wX2xpc3QsCisJCQkJdTMyIGlvbW9kZSk7Citib29sIHBuZnNfcm9jKHN0cnVjdCBpbm9kZSAqaW5vKTsKK3ZvaWQgcG5mc19yb2NfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlubyk7Cit2b2lkIHBuZnNfcm9jX3NldF9iYXJyaWVyKHN0cnVjdCBpbm9kZSAqaW5vLCB1MzIgYmFycmllcik7Citib29sIHBuZnNfcm9jX2RyYWluKHN0cnVjdCBpbm9kZSAqaW5vLCB1MzIgKmJhcnJpZXIpOwogCiAKIHN0YXRpYyBpbmxpbmUgaW50IGxvX2ZhaWxfYml0KHUzMiBpb21vZGUpCkBAIC0xNzYsNiArMjAwLDI4IEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKK3N0YXRpYyBpbmxpbmUgYm9vbAorcG5mc19yb2Moc3RydWN0IGlub2RlICppbm8pCit7CisJcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK3BuZnNfcm9jX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm8pCit7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorcG5mc19yb2Nfc2V0X2JhcnJpZXIoc3RydWN0IGlub2RlICppbm8sIHUzMiBiYXJyaWVyKQoreworfQorCitzdGF0aWMgaW5saW5lIGJvb2wKK3BuZnNfcm9jX2RyYWluKHN0cnVjdCBpbm9kZSAqaW5vLCB1MzIgKmJhcnJpZXIpCit7CisJcmV0dXJuIGZhbHNlOworfQorCiBzdGF0aWMgaW5saW5lIHZvaWQgc2V0X3BuZnNfbGF5b3V0ZHJpdmVyKHN0cnVjdCBuZnNfc2VydmVyICpzLCB1MzIgaWQpCiB7CiB9CmRpZmYgLS1naXQgYS9mcy9uZnMvcHJvYy5jIGIvZnMvbmZzL3Byb2MuYwppbmRleCA1OGU3Zjg0Li43N2Q1ZTIxIDEwMDY0NAotLS0gYS9mcy9uZnMvcHJvYy5jCisrKyBiL2ZzL25mcy9wcm9jLmMKQEAgLTQ1OCw3ICs0NTgsNyBAQAogCWZhdHRyID0gbmZzX2FsbG9jX2ZhdHRyKCk7CiAJc3RhdHVzID0gLUVOT01FTTsKIAlpZiAoZmggPT0gTlVMTCB8fCBmYXR0ciA9PSBOVUxMKQotCQlnb3RvIG91dDsKKwkJZ290byBvdXRfZnJlZTsKIAogCXN0YXR1cyA9IHJwY19jYWxsX3N5bmMoTkZTX0NMSUVOVChkaXIpLCAmbXNnLCAwKTsKIAluZnNfbWFya19mb3JfcmV2YWxpZGF0ZShkaXIpOwpAQCAtNDcxLDYgKzQ3MSw3IEBACiAJaWYgKHN0YXR1cyA9PSAwKQogCQlzdGF0dXMgPSBuZnNfaW5zdGFudGlhdGUoZGVudHJ5LCBmaCwgZmF0dHIpOwogCitvdXRfZnJlZToKIAluZnNfZnJlZV9mYXR0cihmYXR0cik7CiAJbmZzX2ZyZWVfZmhhbmRsZShmaCk7CiBvdXQ6CkBAIC03MzEsNyArNzMyLDcgQEAKIAkuc3RhdGZzCQk9IG5mc19wcm9jX3N0YXRmcywKIAkuZnNpbmZvCQk9IG5mc19wcm9jX2ZzaW5mbywKIAkucGF0aGNvbmYJPSBuZnNfcHJvY19wYXRoY29uZiwKLQkuZGVjb2RlX2RpcmVudAk9IG5mc19kZWNvZGVfZGlyZW50LAorCS5kZWNvZGVfZGlyZW50CT0gbmZzMl9kZWNvZGVfZGlyZW50LAogCS5yZWFkX3NldHVwCT0gbmZzX3Byb2NfcmVhZF9zZXR1cCwKIAkucmVhZF9kb25lCT0gbmZzX3JlYWRfZG9uZSwKIAkud3JpdGVfc2V0dXAJPSBuZnNfcHJvY193cml0ZV9zZXR1cCwKZGlmZiAtLWdpdCBhL2ZzL25mcy9zdXBlci5jIGIvZnMvbmZzL3N1cGVyLmMKaW5kZXggNDEwMDYzMC4uMGY5ZWE3MyAxMDA2NDQKLS0tIGEvZnMvbmZzL3N1cGVyLmMKKysrIGIvZnMvbmZzL3N1cGVyLmMKQEAgLTU5OCw3ICs1OTgsOSBAQAogCiAJaWYgKG5mc3MtPm1vdW50ZF92ZXJzaW9uIHx8IHNob3dkZWZhdWx0cykKIAkJc2VxX3ByaW50ZihtLCAiLG1vdW50dmVycz0ldSIsIG5mc3MtPm1vdW50ZF92ZXJzaW9uKTsKLQlpZiAobmZzcy0+bW91bnRkX3BvcnQgfHwgc2hvd2RlZmF1bHRzKQorCWlmICgobmZzcy0+bW91bnRkX3BvcnQgJiYKKwkJbmZzcy0+bW91bnRkX3BvcnQgIT0gKHVuc2lnbmVkIHNob3J0KU5GU19VTlNQRUNfUE9SVCkgfHwKKwkJc2hvd2RlZmF1bHRzKQogCQlzZXFfcHJpbnRmKG0sICIsbW91bnRwb3J0PSV1IiwgbmZzcy0+bW91bnRkX3BvcnQpOwogCiAJbmZzX3Nob3dfbW91bnRkX25ldGlkKG0sIG5mc3MsIHNob3dkZWZhdWx0cyk7CkBAIC0yNDk0LDcgKzI0OTYsMTMgQEAKIAlzYi0+c19tYXhieXRlcyA9IG9sZF9zYi0+c19tYXhieXRlczsKIAlzYi0+c190aW1lX2dyYW4gPSAxOwogCXNiLT5zX29wID0gb2xkX3NiLT5zX29wOwotIAluZnNfaW5pdGlhbGlzZV9zYihzYik7CisJLyoKKwkgKiBUaGUgVkZTIHNob3VsZG4ndCBhcHBseSB0aGUgdW1hc2sgdG8gbW9kZSBiaXRzLiBXZSB3aWxsIGRvCisJICogc28gb3Vyc2VsdmVzIHdoZW4gbmVjZXNzYXJ5LgorCSAqLworCXNiLT5zX2ZsYWdzICB8PSBNU19QT1NJWEFDTDsKKwlzYi0+c194YXR0ciAgPSBvbGRfc2ItPnNfeGF0dHI7CisJbmZzX2luaXRpYWxpc2Vfc2Ioc2IpOwogfQogCiAvKgpAQCAtMjUwNCw2ICsyNTEyLDEyIEBACiB7CiAJc2ItPnNfdGltZV9ncmFuID0gMTsKIAlzYi0+c19vcCA9ICZuZnM0X3NvcHM7CisJLyoKKwkgKiBUaGUgVkZTIHNob3VsZG4ndCBhcHBseSB0aGUgdW1hc2sgdG8gbW9kZSBiaXRzLiBXZSB3aWxsIGRvCisJICogc28gb3Vyc2VsdmVzIHdoZW4gbmVjZXNzYXJ5LgorCSAqLworCXNiLT5zX2ZsYWdzICB8PSBNU19QT1NJWEFDTDsKKwlzYi0+c194YXR0ciA9IG5mczRfeGF0dHJfaGFuZGxlcnM7CiAJbmZzX2luaXRpYWxpc2Vfc2Ioc2IpOwogfQogCmRpZmYgLS1naXQgYS9mcy9uZnMvdW5saW5rLmMgYi9mcy9uZnMvdW5saW5rLmMKaW5kZXggOGZlOWViNC4uZTMxM2E1MSAxMDA2NDQKLS0tIGEvZnMvbmZzL3VubGluay5jCisrKyBiL2ZzL25mcy91bmxpbmsuYwpAQCAtNDI5LDcgKzQyOSw3IEBACiAJZGF0YSA9IGt6YWxsb2Moc2l6ZW9mKCpkYXRhKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKGRhdGEgPT0gTlVMTCkKIAkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7Ci0JdGFza19zZXR1cF9kYXRhLmNhbGxiYWNrX2RhdGEgPSBkYXRhLAorCXRhc2tfc2V0dXBfZGF0YS5jYWxsYmFja19kYXRhID0gZGF0YTsKIAogCWRhdGEtPmNyZWQgPSBycGNfbG9va3VwX2NyZWQoKTsKIAlpZiAoSVNfRVJSKGRhdGEtPmNyZWQpKSB7CmRpZmYgLS1naXQgYS9mcy9uZnNkL25mczRjYWxsYmFjay5jIGIvZnMvbmZzZC9uZnM0Y2FsbGJhY2suYwppbmRleCAxNDNkYTJlLi4yMWE2M2RhIDEwMDY0NAotLS0gYS9mcy9uZnNkL25mczRjYWxsYmFjay5jCisrKyBiL2ZzL25mc2QvbmZzNGNhbGxiYWNrLmMKQEAgLTUwLDExICs1MCw2IEBACiAJTkZTUFJPQzRfQ0xOVF9DQl9TRVFVRU5DRSwKIH07CiAKLWVudW0gbmZzX2NiX29wbnVtNCB7Ci0JT1BfQ0JfUkVDQUxMICAgICAgICAgICAgPSA0LAotCU9QX0NCX1NFUVVFTkNFICAgICAgICAgID0gMTEsCi19OwotCiAjZGVmaW5lIE5GUzRfTUFYVEFHTEVOCQkyMAogCiAjZGVmaW5lIE5GUzRfZW5jX2NiX251bGxfc3oJCTAKQEAgLTc5LDYxICs3NCw2IEBACiAJCQkJCWNiX3NlcXVlbmNlX2RlY19zeiArICAgICAgICAgICAgXAogCQkJCQlvcF9kZWNfc3opCiAKLS8qCi0qIEdlbmVyaWMgZW5jb2RlIHJvdXRpbmVzIGZyb20gZnMvbmZzL25mczR4ZHIuYwotKi8KLXN0YXRpYyBpbmxpbmUgX19iZTMyICoKLXhkcl93cml0ZW1lbShfX2JlMzIgKnAsIGNvbnN0IHZvaWQgKnB0ciwgaW50IG5ieXRlcykKLXsKLQlpbnQgdG1wID0gWERSX1FVQURMRU4obmJ5dGVzKTsKLQlpZiAoIXRtcCkKLQkJcmV0dXJuIHA7Ci0JcFt0bXAtMV0gPSAwOwotCW1lbWNweShwLCBwdHIsIG5ieXRlcyk7Ci0JcmV0dXJuIHAgKyB0bXA7Ci19Ci0KLSNkZWZpbmUgV1JJVEUzMihuKSAgICAgICAgICAgICAgICpwKysgPSBodG9ubChuKQotI2RlZmluZSBXUklURU1FTShwdHIsbmJ5dGVzKSAgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQlwID0geGRyX3dyaXRlbWVtKHAsIHB0ciwgbmJ5dGVzKTsgICAgICAgICAgICAgICAgICAgICAgIFwKLX0gd2hpbGUgKDApCi0jZGVmaW5lIFJFU0VSVkVfU1BBQ0UobmJ5dGVzKSAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCXAgPSB4ZHJfcmVzZXJ2ZV9zcGFjZSh4ZHIsIG5ieXRlcyk7ICAgICAgICAgICAgICAgICAgICAgXAotCWlmICghcCkgZHByaW50aygiTkZTRDogUkVTRVJWRV9TUEFDRSglZCkgZmFpbGVkIGluIGZ1bmN0aW9uICVzXG4iLCAoaW50KSAobmJ5dGVzKSwgX19mdW5jX18pOyBcCi0JQlVHX09OKCFwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi19IHdoaWxlICgwKQotCi0vKgotICogR2VuZXJpYyBkZWNvZGUgcm91dGluZXMgZnJvbSBmcy9uZnMvbmZzNHhkci5jCi0gKi8KLSNkZWZpbmUgREVDT0RFX1RBSUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQlzdGF0dXMgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotb3V0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCXJldHVybiBzdGF0dXM7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCi14ZHJfZXJyb3I6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JZHByaW50aygiTkZTRDogeGRyIGVycm9yISAoJXM6JWQpXG4iLCBfX0ZJTEVfXywgX19MSU5FX18pOyBcCi0Jc3RhdHVzID0gLUVJTzsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQlnb3RvIG91dAotCi0jZGVmaW5lIFJFQUQzMih4KSAgICAgICAgICh4KSA9IG50b2hsKCpwKyspCi0jZGVmaW5lIFJFQUQ2NCh4KSAgICAgICAgIGRvIHsgICAgICAgICAgICAgICAgICBcCi0JKHgpID0gKHU2NCludG9obCgqcCsrKSA8PCAzMjsgICAgICAgICAgIFwKLQkoeCkgfD0gbnRvaGwoKnArKyk7ICAgICAgICAgICAgICAgICAgICAgXAotfSB3aGlsZSAoMCkKLSNkZWZpbmUgUkVBRFRJTUUoeCkgICAgICAgZG8geyAgICAgICAgICAgICAgICAgIFwKLQlwKys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCSh4LnR2X3NlYykgPSBudG9obCgqcCsrKTsgICAgICAgICAgICAgICBcCi0JKHgudHZfbnNlYykgPSBudG9obCgqcCsrKTsgICAgICAgICAgICAgIFwKLX0gd2hpbGUgKDApCi0jZGVmaW5lIFJFQURfQlVGKG5ieXRlcykgIGRvIHsgXAotCXAgPSB4ZHJfaW5saW5lX2RlY29kZSh4ZHIsIG5ieXRlcyk7IFwKLQlpZiAoIXApIHsgXAotCQlkcHJpbnRrKCJORlNEOiAlczogcmVwbHkgYnVmZmVyIG92ZXJmbG93ZWQgaW4gbGluZSAlZC5cbiIsIFwKLQkJCV9fZnVuY19fLCBfX0xJTkVfXyk7IFwKLQkJcmV0dXJuIC1FSU87IFwKLQl9IFwKLX0gd2hpbGUgKDApCi0KIHN0cnVjdCBuZnM0X2NiX2NvbXBvdW5kX2hkciB7CiAJLyogYXJncyAqLwogCXUzMgkJaWRlbnQ7CS8qIG1pbm9ydmVyc2lvbiAwIG9ubHkgKi8KQEAgLTE0NCwyOTUgKzg0LDUxMyBAQAogCWludAkJc3RhdHVzOwogfTsKIAotc3RhdGljIHN0cnVjdCB7Ci1pbnQgc3RhdDsKLWludCBlcnJubzsKLX0gbmZzX2NiX2VycnRibFtdID0gewotCXsgTkZTNF9PSywJCTAgICAgICAgICAgICAgICB9LAotCXsgTkZTNEVSUl9QRVJNLAkJRVBFUk0gICAgICAgICAgIH0sCi0JeyBORlM0RVJSX05PRU5ULAlFTk9FTlQgICAgICAgICAgfSwKLQl7IE5GUzRFUlJfSU8sCQlFSU8gICAgICAgICAgICAgfSwKLQl7IE5GUzRFUlJfTlhJTywJCUVOWElPICAgICAgICAgICB9LAotCXsgTkZTNEVSUl9BQ0NFU1MsCUVBQ0NFUyAgICAgICAgICB9LAotCXsgTkZTNEVSUl9FWElTVCwJRUVYSVNUICAgICAgICAgIH0sCi0JeyBORlM0RVJSX1hERVYsCQlFWERFViAgICAgICAgICAgfSwKLQl7IE5GUzRFUlJfTk9URElSLAlFTk9URElSICAgICAgICAgfSwKLQl7IE5GUzRFUlJfSVNESVIsCUVJU0RJUiAgICAgICAgICB9LAotCXsgTkZTNEVSUl9JTlZBTCwJRUlOVkFMICAgICAgICAgIH0sCi0JeyBORlM0RVJSX0ZCSUcsCQlFRkJJRyAgICAgICAgICAgfSwKLQl7IE5GUzRFUlJfTk9TUEMsCUVOT1NQQyAgICAgICAgICB9LAotCXsgTkZTNEVSUl9ST0ZTLAkJRVJPRlMgICAgICAgICAgIH0sCi0JeyBORlM0RVJSX01MSU5LLAlFTUxJTksgICAgICAgICAgfSwKLQl7IE5GUzRFUlJfTkFNRVRPT0xPTkcsCUVOQU1FVE9PTE9ORyAgICB9LAotCXsgTkZTNEVSUl9OT1RFTVBUWSwJRU5PVEVNUFRZICAgICAgIH0sCi0JeyBORlM0RVJSX0RRVU9ULAlFRFFVT1QgICAgICAgICAgfSwKLQl7IE5GUzRFUlJfU1RBTEUsCUVTVEFMRSAgICAgICAgICB9LAotCXsgTkZTNEVSUl9CQURIQU5ETEUsCUVCQURIQU5ETEUgICAgICB9LAotCXsgTkZTNEVSUl9CQURfQ09PS0lFLAlFQkFEQ09PS0lFICAgICAgfSwKLQl7IE5GUzRFUlJfTk9UU1VQUCwJRU5PVFNVUFAgICAgICAgIH0sCi0JeyBORlM0RVJSX1RPT1NNQUxMLAlFVE9PU01BTEwgICAgICAgfSwKLQl7IE5GUzRFUlJfU0VSVkVSRkFVTFQsCUVTRVJWRVJGQVVMVCAgICB9LAotCXsgTkZTNEVSUl9CQURUWVBFLAlFQkFEVFlQRSAgICAgICAgfSwKLQl7IE5GUzRFUlJfTE9DS0VELAlFQUdBSU4gICAgICAgICAgfSwKLQl7IE5GUzRFUlJfUkVTT1VSQ0UsCUVSRU1PVEVJTyAgICAgICB9LAotCXsgTkZTNEVSUl9TWU1MSU5LLAlFTE9PUCAgICAgICAgICAgfSwKLQl7IE5GUzRFUlJfT1BfSUxMRUdBTCwJRU9QTk9UU1VQUCAgICAgIH0sCi0JeyBORlM0RVJSX0RFQURMT0NLLAlFREVBRExLICAgICAgICAgfSwKLQl7IC0xLCAgICAgICAgICAgICAgICAgICBFSU8gICAgICAgICAgICAgfQotfTsKLQotc3RhdGljIGludAotbmZzX2NiX3N0YXRfdG9fZXJybm8oaW50IHN0YXQpCisvKgorICogSGFuZGxlIGRlY29kZSBidWZmZXIgb3ZlcmZsb3dzIG91dC1vZi1saW5lLgorICovCitzdGF0aWMgdm9pZCBwcmludF9vdmVyZmxvd19tc2coY29uc3QgY2hhciAqZnVuYywgY29uc3Qgc3RydWN0IHhkcl9zdHJlYW0gKnhkcikKIHsKLQlpbnQgaTsKLQlmb3IgKGkgPSAwOyBuZnNfY2JfZXJydGJsW2ldLnN0YXQgIT0gLTE7IGkrKykgewotCQlpZiAobmZzX2NiX2VycnRibFtpXS5zdGF0ID09IHN0YXQpCi0JCQlyZXR1cm4gbmZzX2NiX2VycnRibFtpXS5lcnJubzsKLQl9Ci0JLyogSWYgd2UgY2Fubm90IHRyYW5zbGF0ZSB0aGUgZXJyb3IsIHRoZSByZWNvdmVyeSByb3V0aW5lcyBzaG91bGQKLQkqIGhhbmRsZSBpdC4KLQkqIE5vdGU6IHJlbWFpbmluZyBORlN2NCBlcnJvciBjb2RlcyBoYXZlIHZhbHVlcyA+IDEwMDAwLCBzbyBzaG91bGQKLQkqIG5vdCBjb25mbGljdCB3aXRoIG5hdGl2ZSBMaW51eCBlcnJvciBjb2Rlcy4KLQkqLwotCXJldHVybiBzdGF0OworCWRwcmludGsoIk5GUzogJXMgcHJlbWF0dXJlbHkgaGl0IHRoZSBlbmQgb2Ygb3VyIHJlY2VpdmUgYnVmZmVyLiAiCisJCSJSZW1haW5pbmcgYnVmZmVyIGxlbmd0aCBpcyAldHUgd29yZHMuXG4iLAorCQlmdW5jLCB4ZHItPmVuZCAtIHhkci0+cCk7Cit9CisKK3N0YXRpYyBfX2JlMzIgKnhkcl9lbmNvZGVfZW1wdHlfYXJyYXkoX19iZTMyICpwKQoreworCSpwKysgPSB4ZHJfemVybzsKKwlyZXR1cm4gcDsKIH0KIAogLyoKLSAqIFhEUiBlbmNvZGUKKyAqIEVuY29kZS9kZWNvZGUgTkZTdjQgQ0IgYmFzaWMgZGF0YSB0eXBlcworICoKKyAqIEJhc2ljIE5GU3Y0IGNhbGxiYWNrIGRhdGEgdHlwZXMgYXJlIGRlZmluZWQgaW4gc2VjdGlvbiAxNSBvZiBSRkMKKyAqIDM1MzA6ICJOZXR3b3JrIEZpbGUgU3lzdGVtIChORlMpIHZlcnNpb24gNCBQcm90b2NvbCIgYW5kIHNlY3Rpb24KKyAqIDIwIG9mIFJGQyA1NjYxOiAiTmV0d29yayBGaWxlIFN5c3RlbSAoTkZTKSBWZXJzaW9uIDQgTWlub3IgVmVyc2lvbgorICogMSBQcm90b2NvbCIKICAqLwogCi1zdGF0aWMgdm9pZAotZW5jb2RlX3N0YXRlaWQoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgc3RhdGVpZF90ICpzaWQpCisvKgorICoJbmZzX2NiX29wbnVtNAorICoKKyAqCWVudW0gbmZzX2NiX29wbnVtNCB7CisgKgkJT1BfQ0JfR0VUQVRUUgkJPSAzLAorICoJCSAgLi4uCisgKgl9OworICovCitlbnVtIG5mc19jYl9vcG51bTQgeworCU9QX0NCX0dFVEFUVFIJCQk9IDMsCisJT1BfQ0JfUkVDQUxMCQkJPSA0LAorCU9QX0NCX0xBWU9VVFJFQ0FMTAkJPSA1LAorCU9QX0NCX05PVElGWQkJCT0gNiwKKwlPUF9DQl9QVVNIX0RFTEVHCQk9IDcsCisJT1BfQ0JfUkVDQUxMX0FOWQkJPSA4LAorCU9QX0NCX1JFQ0FMTEFCTEVfT0JKX0FWQUlMCT0gOSwKKwlPUF9DQl9SRUNBTExfU0xPVAkJPSAxMCwKKwlPUF9DQl9TRVFVRU5DRQkJCT0gMTEsCisJT1BfQ0JfV0FOVFNfQ0FOQ0VMTEVECQk9IDEyLAorCU9QX0NCX05PVElGWV9MT0NLCQk9IDEzLAorCU9QX0NCX05PVElGWV9ERVZJQ0VJRAkJPSAxNCwKKwlPUF9DQl9JTExFR0FMCQkJPSAxMDA0NAorfTsKKworc3RhdGljIHZvaWQgZW5jb2RlX25mc19jYl9vcG51bTQoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgZW51bSBuZnNfY2Jfb3BudW00IG9wKQogewogCV9fYmUzMiAqcDsKIAotCVJFU0VSVkVfU1BBQ0Uoc2l6ZW9mKHN0YXRlaWRfdCkpOwotCVdSSVRFMzIoc2lkLT5zaV9nZW5lcmF0aW9uKTsKLQlXUklURU1FTSgmc2lkLT5zaV9vcGFxdWUsIHNpemVvZihzdGF0ZWlkX29wYXF1ZV90KSk7CisJcCA9IHhkcl9yZXNlcnZlX3NwYWNlKHhkciwgNCk7CisJKnAgPSBjcHVfdG9fYmUzMihvcCk7CiB9CiAKLXN0YXRpYyB2b2lkCi1lbmNvZGVfY2JfY29tcG91bmRfaGRyKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHN0cnVjdCBuZnM0X2NiX2NvbXBvdW5kX2hkciAqaGRyKQorLyoKKyAqIG5mc19maDQKKyAqCisgKgl0eXBlZGVmIG9wYXF1ZSBuZnNfZmg0PE5GUzRfRkhTSVpFPjsKKyAqLworc3RhdGljIHZvaWQgZW5jb2RlX25mc19maDQoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgY29uc3Qgc3RydWN0IGtuZnNkX2ZoICpmaCkKK3sKKwl1MzIgbGVuZ3RoID0gZmgtPmZoX3NpemU7CisJX19iZTMyICpwOworCisJQlVHX09OKGxlbmd0aCA+IE5GUzRfRkhTSVpFKTsKKwlwID0geGRyX3Jlc2VydmVfc3BhY2UoeGRyLCA0ICsgbGVuZ3RoKTsKKwl4ZHJfZW5jb2RlX29wYXF1ZShwLCAmZmgtPmZoX2Jhc2UsIGxlbmd0aCk7Cit9CisKKy8qCisgKiBzdGF0ZWlkNAorICoKKyAqCXN0cnVjdCBzdGF0ZWlkNCB7CisgKgkJdWludDMyX3QJc2VxaWQ7CisgKgkJb3BhcXVlCQlvdGhlclsxMl07CisgKgl9OworICovCitzdGF0aWMgdm9pZCBlbmNvZGVfc3RhdGVpZDQoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgY29uc3Qgc3RhdGVpZF90ICpzaWQpCit7CisJX19iZTMyICpwOworCisJcCA9IHhkcl9yZXNlcnZlX3NwYWNlKHhkciwgTkZTNF9TVEFURUlEX1NJWkUpOworCSpwKysgPSBjcHVfdG9fYmUzMihzaWQtPnNpX2dlbmVyYXRpb24pOworCXhkcl9lbmNvZGVfb3BhcXVlX2ZpeGVkKHAsICZzaWQtPnNpX29wYXF1ZSwgTkZTNF9TVEFURUlEX09USEVSX1NJWkUpOworfQorCisvKgorICogc2Vzc2lvbmlkNAorICoKKyAqCXR5cGVkZWYgb3BhcXVlIHNlc3Npb25pZDRbTkZTNF9TRVNTSU9OSURfU0laRV07CisgKi8KK3N0YXRpYyB2b2lkIGVuY29kZV9zZXNzaW9uaWQ0KHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCisJCQkgICAgICBjb25zdCBzdHJ1Y3QgbmZzZDRfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKwlfX2JlMzIgKnA7CisKKwlwID0geGRyX3Jlc2VydmVfc3BhY2UoeGRyLCBORlM0X01BWF9TRVNTSU9OSURfTEVOKTsKKwl4ZHJfZW5jb2RlX29wYXF1ZV9maXhlZChwLCBzZXNzaW9uLT5zZV9zZXNzaW9uaWQuZGF0YSwKKwkJCQkJTkZTNF9NQVhfU0VTU0lPTklEX0xFTik7Cit9CisKKy8qCisgKiBuZnNzdGF0NAorICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHsKKwlpbnQgc3RhdDsKKwlpbnQgZXJybm87Cit9IG5mc19jYl9lcnJ0YmxbXSA9IHsKKwl7IE5GUzRfT0ssCQkwCQl9LAorCXsgTkZTNEVSUl9QRVJNLAkJLUVQRVJNCQl9LAorCXsgTkZTNEVSUl9OT0VOVCwJLUVOT0VOVAkJfSwKKwl7IE5GUzRFUlJfSU8sCQktRUlPCQl9LAorCXsgTkZTNEVSUl9OWElPLAkJLUVOWElPCQl9LAorCXsgTkZTNEVSUl9BQ0NFU1MsCS1FQUNDRVMJCX0sCisJeyBORlM0RVJSX0VYSVNULAktRUVYSVNUCQl9LAorCXsgTkZTNEVSUl9YREVWLAkJLUVYREVWCQl9LAorCXsgTkZTNEVSUl9OT1RESVIsCS1FTk9URElSCX0sCisJeyBORlM0RVJSX0lTRElSLAktRUlTRElSCQl9LAorCXsgTkZTNEVSUl9JTlZBTCwJLUVJTlZBTAkJfSwKKwl7IE5GUzRFUlJfRkJJRywJCS1FRkJJRwkJfSwKKwl7IE5GUzRFUlJfTk9TUEMsCS1FTk9TUEMJCX0sCisJeyBORlM0RVJSX1JPRlMsCQktRVJPRlMJCX0sCisJeyBORlM0RVJSX01MSU5LLAktRU1MSU5LCQl9LAorCXsgTkZTNEVSUl9OQU1FVE9PTE9ORywJLUVOQU1FVE9PTE9ORwl9LAorCXsgTkZTNEVSUl9OT1RFTVBUWSwJLUVOT1RFTVBUWQl9LAorCXsgTkZTNEVSUl9EUVVPVCwJLUVEUVVPVAkJfSwKKwl7IE5GUzRFUlJfU1RBTEUsCS1FU1RBTEUJCX0sCisJeyBORlM0RVJSX0JBREhBTkRMRSwJLUVCQURIQU5ETEUJfSwKKwl7IE5GUzRFUlJfQkFEX0NPT0tJRSwJLUVCQURDT09LSUUJfSwKKwl7IE5GUzRFUlJfTk9UU1VQUCwJLUVOT1RTVVBQCX0sCisJeyBORlM0RVJSX1RPT1NNQUxMLAktRVRPT1NNQUxMCX0sCisJeyBORlM0RVJSX1NFUlZFUkZBVUxULAktRVNFUlZFUkZBVUxUCX0sCisJeyBORlM0RVJSX0JBRFRZUEUsCS1FQkFEVFlQRQl9LAorCXsgTkZTNEVSUl9MT0NLRUQsCS1FQUdBSU4JCX0sCisJeyBORlM0RVJSX1JFU09VUkNFLAktRVJFTU9URUlPCX0sCisJeyBORlM0RVJSX1NZTUxJTkssCS1FTE9PUAkJfSwKKwl7IE5GUzRFUlJfT1BfSUxMRUdBTCwJLUVPUE5PVFNVUFAJfSwKKwl7IE5GUzRFUlJfREVBRExPQ0ssCS1FREVBRExLCX0sCisJeyAtMSwJCQktRUlPCQl9Cit9OworCisvKgorICogSWYgd2UgY2Fubm90IHRyYW5zbGF0ZSB0aGUgZXJyb3IsIHRoZSByZWNvdmVyeSByb3V0aW5lcyBzaG91bGQKKyAqIGhhbmRsZSBpdC4KKyAqCisgKiBOb3RlOiByZW1haW5pbmcgTkZTdjQgZXJyb3IgY29kZXMgaGF2ZSB2YWx1ZXMgPiAxMDAwMCwgc28gc2hvdWxkCisgKiBub3QgY29uZmxpY3Qgd2l0aCBuYXRpdmUgTGludXggZXJyb3IgY29kZXMuCisgKi8KK3N0YXRpYyBpbnQgbmZzX2NiX3N0YXRfdG9fZXJybm8oaW50IHN0YXR1cykKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IG5mc19jYl9lcnJ0YmxbaV0uc3RhdCAhPSAtMTsgaSsrKSB7CisJCWlmIChuZnNfY2JfZXJydGJsW2ldLnN0YXQgPT0gc3RhdHVzKQorCQkJcmV0dXJuIG5mc19jYl9lcnJ0YmxbaV0uZXJybm87CisJfQorCisJZHByaW50aygiTkZTRDogVW5yZWNvZ25pemVkIE5GUyBDQiBzdGF0dXMgdmFsdWU6ICV1XG4iLCBzdGF0dXMpOworCXJldHVybiAtc3RhdHVzOworfQorCitzdGF0aWMgaW50IGRlY29kZV9jYl9vcF9zdGF0dXMoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgZW51bSBuZnNfb3BudW00IGV4cGVjdGVkLAorCQkJICAgICAgIGVudW0gbmZzc3RhdDQgKnN0YXR1cykKK3sKKwlfX2JlMzIgKnA7CisJdTMyIG9wOworCisJcCA9IHhkcl9pbmxpbmVfZGVjb2RlKHhkciwgNCArIDQpOworCWlmICh1bmxpa2VseShwID09IE5VTEwpKQorCQlnb3RvIG91dF9vdmVyZmxvdzsKKwlvcCA9IGJlMzJfdG9fY3B1cChwKyspOworCWlmICh1bmxpa2VseShvcCAhPSBleHBlY3RlZCkpCisJCWdvdG8gb3V0X3VuZXhwZWN0ZWQ7CisJKnN0YXR1cyA9IGJlMzJfdG9fY3B1cChwKTsKKwlyZXR1cm4gMDsKK291dF9vdmVyZmxvdzoKKwlwcmludF9vdmVyZmxvd19tc2coX19mdW5jX18sIHhkcik7CisJcmV0dXJuIC1FSU87CitvdXRfdW5leHBlY3RlZDoKKwlkcHJpbnRrKCJORlNEOiBDYWxsYmFjayBzZXJ2ZXIgcmV0dXJuZWQgb3BlcmF0aW9uICVkIGJ1dCAiCisJCSJ3ZSBpc3N1ZWQgYSByZXF1ZXN0IGZvciAlZFxuIiwgb3AsIGV4cGVjdGVkKTsKKwlyZXR1cm4gLUVJTzsKK30KKworLyoKKyAqIENCX0NPTVBPVU5ENGFyZ3MKKyAqCisgKglzdHJ1Y3QgQ0JfQ09NUE9VTkQ0YXJncyB7CisgKgkJdXRmOHN0cl9jcwl0YWc7CisgKgkJdWludDMyX3QJbWlub3J2ZXJzaW9uOworICoJCXVpbnQzMl90CWNhbGxiYWNrX2lkZW50OworICoJCW5mc19jYl9hcmdvcDQJYXJnYXJyYXk8PjsKKyAqCX07CisqLworc3RhdGljIHZvaWQgZW5jb2RlX2NiX2NvbXBvdW5kNGFyZ3Moc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKKwkJCQkgICAgc3RydWN0IG5mczRfY2JfY29tcG91bmRfaGRyICpoZHIpCiB7CiAJX19iZTMyICogcDsKIAotCVJFU0VSVkVfU1BBQ0UoMTYpOwotCVdSSVRFMzIoMCk7ICAgICAgICAgICAgLyogdGFnIGxlbmd0aCBpcyBhbHdheXMgMCAqLwotCVdSSVRFMzIoaGRyLT5taW5vcnZlcnNpb24pOwotCVdSSVRFMzIoaGRyLT5pZGVudCk7CisJcCA9IHhkcl9yZXNlcnZlX3NwYWNlKHhkciwgNCArIDQgKyA0ICsgNCk7CisJcCA9IHhkcl9lbmNvZGVfZW1wdHlfYXJyYXkocCk7CQkvKiBlbXB0eSB0YWcgKi8KKwkqcCsrID0gY3B1X3RvX2JlMzIoaGRyLT5taW5vcnZlcnNpb24pOworCSpwKysgPSBjcHVfdG9fYmUzMihoZHItPmlkZW50KTsKKwogCWhkci0+bm9wc19wID0gcDsKLQlXUklURTMyKGhkci0+bm9wcyk7CisJKnAgPSBjcHVfdG9fYmUzMihoZHItPm5vcHMpOwkJLyogYXJnYXJyYXkgZWxlbWVudCBjb3VudCAqLwogfQogCisvKgorICogVXBkYXRlIGFyZ2FycmF5IGVsZW1lbnQgY291bnQKKyAqLwogc3RhdGljIHZvaWQgZW5jb2RlX2NiX25vcHMoc3RydWN0IG5mczRfY2JfY29tcG91bmRfaGRyICpoZHIpCiB7Ci0JKmhkci0+bm9wc19wID0gaHRvbmwoaGRyLT5ub3BzKTsKKwlCVUdfT04oaGRyLT5ub3BzID4gTkZTNF9NQVhfQkFDS19DSEFOTkVMX09QUyk7CisJKmhkci0+bm9wc19wID0gY3B1X3RvX2JlMzIoaGRyLT5ub3BzKTsKIH0KIAotc3RhdGljIHZvaWQKLWVuY29kZV9jYl9yZWNhbGwoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgc3RydWN0IG5mczRfZGVsZWdhdGlvbiAqZHAsCi0JCXN0cnVjdCBuZnM0X2NiX2NvbXBvdW5kX2hkciAqaGRyKQorLyoKKyAqIENCX0NPTVBPVU5ENHJlcworICoKKyAqCXN0cnVjdCBDQl9DT01QT1VORDRyZXMgeworICoJCW5mc3N0YXQ0CXN0YXR1czsKKyAqCQl1dGY4c3RyX2NzCXRhZzsKKyAqCQluZnNfY2JfcmVzb3A0CXJlc2FycmF5PD47CisgKgl9OworICovCitzdGF0aWMgaW50IGRlY29kZV9jYl9jb21wb3VuZDRyZXMoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKKwkJCQkgIHN0cnVjdCBuZnM0X2NiX2NvbXBvdW5kX2hkciAqaGRyKQoreworCXUzMiBsZW5ndGg7CisJX19iZTMyICpwOworCisJcCA9IHhkcl9pbmxpbmVfZGVjb2RlKHhkciwgNCArIDQpOworCWlmICh1bmxpa2VseShwID09IE5VTEwpKQorCQlnb3RvIG91dF9vdmVyZmxvdzsKKwloZHItPnN0YXR1cyA9IGJlMzJfdG9fY3B1cChwKyspOworCS8qIElnbm9yZSB0aGUgdGFnICovCisJbGVuZ3RoID0gYmUzMl90b19jcHVwKHArKyk7CisJcCA9IHhkcl9pbmxpbmVfZGVjb2RlKHhkciwgbGVuZ3RoICsgNCk7CisJaWYgKHVubGlrZWx5KHAgPT0gTlVMTCkpCisJCWdvdG8gb3V0X292ZXJmbG93OworCWhkci0+bm9wcyA9IGJlMzJfdG9fY3B1cChwKTsKKwlyZXR1cm4gMDsKK291dF9vdmVyZmxvdzoKKwlwcmludF9vdmVyZmxvd19tc2coX19mdW5jX18sIHhkcik7CisJcmV0dXJuIC1FSU87Cit9CisKKy8qCisgKiBDQl9SRUNBTEw0YXJncworICoKKyAqCXN0cnVjdCBDQl9SRUNBTEw0YXJncyB7CisgKgkJc3RhdGVpZDQJc3RhdGVpZDsKKyAqCQlib29sCQl0cnVuY2F0ZTsKKyAqCQluZnNfZmg0CQlmaDsKKyAqCX07CisgKi8KK3N0YXRpYyB2b2lkIGVuY29kZV9jYl9yZWNhbGw0YXJncyhzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAorCQkJCSAgY29uc3Qgc3RydWN0IG5mczRfZGVsZWdhdGlvbiAqZHAsCisJCQkJICBzdHJ1Y3QgbmZzNF9jYl9jb21wb3VuZF9oZHIgKmhkcikKIHsKIAlfX2JlMzIgKnA7Ci0JaW50IGxlbiA9IGRwLT5kbF9maC5maF9zaXplOwogCi0JUkVTRVJWRV9TUEFDRSg0KTsKLQlXUklURTMyKE9QX0NCX1JFQ0FMTCk7Ci0JZW5jb2RlX3N0YXRlaWQoeGRyLCAmZHAtPmRsX3N0YXRlaWQpOwotCVJFU0VSVkVfU1BBQ0UoOCArIChYRFJfUVVBRExFTihsZW4pIDw8IDIpKTsKLQlXUklURTMyKDApOyAvKiB0cnVuY2F0ZSBvcHRpbWl6YXRpb24gbm90IGltcGxlbWVudGVkICovCi0JV1JJVEUzMihsZW4pOwotCVdSSVRFTUVNKCZkcC0+ZGxfZmguZmhfYmFzZSwgbGVuKTsKKwllbmNvZGVfbmZzX2NiX29wbnVtNCh4ZHIsIE9QX0NCX1JFQ0FMTCk7CisJZW5jb2RlX3N0YXRlaWQ0KHhkciwgJmRwLT5kbF9zdGF0ZWlkKTsKKworCXAgPSB4ZHJfcmVzZXJ2ZV9zcGFjZSh4ZHIsIDQpOworCSpwKysgPSB4ZHJfemVybzsJCQkvKiB0cnVuY2F0ZSAqLworCisJZW5jb2RlX25mc19maDQoeGRyLCAmZHAtPmRsX2ZoKTsKKwogCWhkci0+bm9wcysrOwogfQogCi1zdGF0aWMgdm9pZAotZW5jb2RlX2NiX3NlcXVlbmNlKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHN0cnVjdCBuZnNkNF9jYWxsYmFjayAqY2IsCi0JCSAgIHN0cnVjdCBuZnM0X2NiX2NvbXBvdW5kX2hkciAqaGRyKQorLyoKKyAqIENCX1NFUVVFTkNFNGFyZ3MKKyAqCisgKglzdHJ1Y3QgQ0JfU0VRVUVOQ0U0YXJncyB7CisgKgkJc2Vzc2lvbmlkNAkJY3NhX3Nlc3Npb25pZDsKKyAqCQlzZXF1ZW5jZWlkNAkJY3NhX3NlcXVlbmNlaWQ7CisgKgkJc2xvdGlkNAkJCWNzYV9zbG90aWQ7CisgKgkJc2xvdGlkNAkJCWNzYV9oaWdoZXN0X3Nsb3RpZDsKKyAqCQlib29sCQkJY3NhX2NhY2hldGhpczsKKyAqCQlyZWZlcnJpbmdfY2FsbF9saXN0NAljc2FfcmVmZXJyaW5nX2NhbGxfbGlzdHM8PjsKKyAqCX07CisgKi8KK3N0YXRpYyB2b2lkIGVuY29kZV9jYl9zZXF1ZW5jZTRhcmdzKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCisJCQkJICAgIGNvbnN0IHN0cnVjdCBuZnNkNF9jYWxsYmFjayAqY2IsCisJCQkJICAgIHN0cnVjdCBuZnM0X2NiX2NvbXBvdW5kX2hkciAqaGRyKQogeworCXN0cnVjdCBuZnNkNF9zZXNzaW9uICpzZXNzaW9uID0gY2ItPmNiX2NscC0+Y2xfY2Jfc2Vzc2lvbjsKIAlfX2JlMzIgKnA7Ci0Jc3RydWN0IG5mc2Q0X3Nlc3Npb24gKnNlcyA9IGNiLT5jYl9jbHAtPmNsX2NiX3Nlc3Npb247CiAKIAlpZiAoaGRyLT5taW5vcnZlcnNpb24gPT0gMCkKIAkJcmV0dXJuOwogCi0JUkVTRVJWRV9TUEFDRSgxICsgTkZTNF9NQVhfU0VTU0lPTklEX0xFTiArIDIwKTsKKwllbmNvZGVfbmZzX2NiX29wbnVtNCh4ZHIsIE9QX0NCX1NFUVVFTkNFKTsKKwllbmNvZGVfc2Vzc2lvbmlkNCh4ZHIsIHNlc3Npb24pOwogCi0JV1JJVEUzMihPUF9DQl9TRVFVRU5DRSk7Ci0JV1JJVEVNRU0oc2VzLT5zZV9zZXNzaW9uaWQuZGF0YSwgTkZTNF9NQVhfU0VTU0lPTklEX0xFTik7Ci0JV1JJVEUzMihzZXMtPnNlX2NiX3NlcV9ucik7Ci0JV1JJVEUzMigwKTsJCS8qIHNsb3RpZCwgYWx3YXlzIDAgKi8KLQlXUklURTMyKDApOwkJLyogaGlnaGVzdCBzbG90aWQgYWx3YXlzIDAgKi8KLQlXUklURTMyKDApOwkJLyogY2FjaGV0aGlzIGFsd2F5cyAwICovCi0JV1JJVEUzMigwKTsgLyogRklYTUU6IHN1cHBvcnQgcmVmZXJyaW5nX2NhbGxfbGlzdHMgKi8KKwlwID0geGRyX3Jlc2VydmVfc3BhY2UoeGRyLCA0ICsgNCArIDQgKyA0ICsgNCk7CisJKnArKyA9IGNwdV90b19iZTMyKHNlc3Npb24tPnNlX2NiX3NlcV9ucik7CS8qIGNzYV9zZXF1ZW5jZWlkICovCisJKnArKyA9IHhkcl96ZXJvOwkJCS8qIGNzYV9zbG90aWQgKi8KKwkqcCsrID0geGRyX3plcm87CQkJLyogY3NhX2hpZ2hlc3Rfc2xvdGlkICovCisJKnArKyA9IHhkcl96ZXJvOwkJCS8qIGNzYV9jYWNoZXRoaXMgKi8KKwl4ZHJfZW5jb2RlX2VtcHR5X2FycmF5KHApOwkJLyogY3NhX3JlZmVycmluZ19jYWxsX2xpc3RzICovCisKIAloZHItPm5vcHMrKzsKIH0KIAotc3RhdGljIGludAotbmZzNF94ZHJfZW5jX2NiX251bGwoc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCkKLXsKLQlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHJzLCAqeGRyID0gJnhkcnM7Ci0KLQl4ZHJfaW5pdF9lbmNvZGUoJnhkcnMsICZyZXEtPnJxX3NuZF9idWYsIHApOwotICAgICAgICBSRVNFUlZFX1NQQUNFKDApOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50Ci1uZnM0X3hkcl9lbmNfY2JfcmVjYWxsKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsCi0JCXN0cnVjdCBuZnNkNF9jYWxsYmFjayAqY2IpCi17Ci0Jc3RydWN0IHhkcl9zdHJlYW0geGRyOwotCXN0cnVjdCBuZnM0X2RlbGVnYXRpb24gKmFyZ3MgPSBjYi0+Y2Jfb3A7Ci0Jc3RydWN0IG5mczRfY2JfY29tcG91bmRfaGRyIGhkciA9IHsKLQkJLmlkZW50ID0gY2ItPmNiX2NscC0+Y2xfY2JfaWRlbnQsCi0JCS5taW5vcnZlcnNpb24gPSBjYi0+Y2JfbWlub3J2ZXJzaW9uLAotCX07Ci0KLQl4ZHJfaW5pdF9lbmNvZGUoJnhkciwgJnJlcS0+cnFfc25kX2J1ZiwgcCk7Ci0JZW5jb2RlX2NiX2NvbXBvdW5kX2hkcigmeGRyLCAmaGRyKTsKLQllbmNvZGVfY2Jfc2VxdWVuY2UoJnhkciwgY2IsICZoZHIpOwotCWVuY29kZV9jYl9yZWNhbGwoJnhkciwgYXJncywgJmhkcik7Ci0JZW5jb2RlX2NiX25vcHMoJmhkcik7Ci0JcmV0dXJuIDA7Ci19Ci0KLQotc3RhdGljIGludAotZGVjb2RlX2NiX2NvbXBvdW5kX2hkcihzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBzdHJ1Y3QgbmZzNF9jYl9jb21wb3VuZF9oZHIgKmhkcil7Ci0gICAgICAgIF9fYmUzMiAqcDsKLQl1MzIgdGFnbGVuOwotCi0gICAgICAgIFJFQURfQlVGKDgpOwotICAgICAgICBSRUFEMzIoaGRyLT5zdGF0dXMpOwotCS8qIFdlJ3ZlIGdvdCBubyB1c2UgZm9yIHRoZSB0YWc7IGlnbm9yZSBpdDogKi8KLSAgICAgICAgUkVBRDMyKHRhZ2xlbik7Ci0gICAgICAgIFJFQURfQlVGKHRhZ2xlbiArIDQpOwotICAgICAgICBwICs9IFhEUl9RVUFETEVOKHRhZ2xlbik7Ci0gICAgICAgIFJFQUQzMihoZHItPm5vcHMpOwotICAgICAgICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGludAotZGVjb2RlX2NiX29wX2hkcihzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBlbnVtIG5mc19vcG51bTQgZXhwZWN0ZWQpCi17Ci0JX19iZTMyICpwOwotCXUzMiBvcDsKLQlpbnQzMl90IG5mc2VycjsKLQotCVJFQURfQlVGKDgpOwotCVJFQUQzMihvcCk7Ci0JaWYgKG9wICE9IGV4cGVjdGVkKSB7Ci0JCWRwcmludGsoIk5GU0Q6IGRlY29kZV9jYl9vcF9oZHI6IENhbGxiYWNrIHNlcnZlciByZXR1cm5lZCAiCi0JCSAgICAgICAgICIgb3BlcmF0aW9uICVkIGJ1dCB3ZSBpc3N1ZWQgYSByZXF1ZXN0IGZvciAlZFxuIiwKLQkJICAgICAgICAgb3AsIGV4cGVjdGVkKTsKLQkJcmV0dXJuIC1FSU87Ci0JfQotCVJFQUQzMihuZnNlcnIpOwotCWlmIChuZnNlcnIgIT0gTkZTX09LKQotCQlyZXR1cm4gLW5mc19jYl9zdGF0X3RvX2Vycm5vKG5mc2Vycik7Ci0JcmV0dXJuIDA7Ci19Ci0KIC8qCisgKiBDQl9TRVFVRU5DRTRyZXNvaworICoKKyAqCXN0cnVjdCBDQl9TRVFVRU5DRTRyZXNvayB7CisgKgkJc2Vzc2lvbmlkNAljc3Jfc2Vzc2lvbmlkOworICoJCXNlcXVlbmNlaWQ0CWNzcl9zZXF1ZW5jZWlkOworICoJCXNsb3RpZDQJCWNzcl9zbG90aWQ7CisgKgkJc2xvdGlkNAkJY3NyX2hpZ2hlc3Rfc2xvdGlkOworICoJCXNsb3RpZDQJCWNzcl90YXJnZXRfaGlnaGVzdF9zbG90aWQ7CisgKgl9OworICoKKyAqCXVuaW9uIENCX1NFUVVFTkNFNHJlcyBzd2l0Y2ggKG5mc3N0YXQ0IGNzcl9zdGF0dXMpIHsKKyAqCWNhc2UgTkZTNF9PSzoKKyAqCQlDQl9TRVFVRU5DRTRyZXNvawljc3JfcmVzb2s0OworICoJZGVmYXVsdDoKKyAqCQl2b2lkOworICoJfTsKKyAqCiAgKiBPdXIgY3VycmVudCBiYWNrIGNoYW5uZWwgaW1wbG1lbnRhdGlvbiBzdXBwb3J0cyBhIHNpbmdsZSBiYWNrY2hhbm5lbAogICogd2l0aCBhIHNpbmdsZSBzbG90LgogICovCi1zdGF0aWMgaW50Ci1kZWNvZGVfY2Jfc2VxdWVuY2Uoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgc3RydWN0IG5mc2Q0X2NhbGxiYWNrICpjYiwKLQkJICAgc3RydWN0IHJwY19ycXN0ICpycXN0cCkKK3N0YXRpYyBpbnQgZGVjb2RlX2NiX3NlcXVlbmNlNHJlc29rKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCisJCQkJICAgIHN0cnVjdCBuZnNkNF9jYWxsYmFjayAqY2IpCiB7Ci0Jc3RydWN0IG5mc2Q0X3Nlc3Npb24gKnNlcyA9IGNiLT5jYl9jbHAtPmNsX2NiX3Nlc3Npb247CisJc3RydWN0IG5mc2Q0X3Nlc3Npb24gKnNlc3Npb24gPSBjYi0+Y2JfY2xwLT5jbF9jYl9zZXNzaW9uOwogCXN0cnVjdCBuZnM0X3Nlc3Npb25pZCBpZDsKIAlpbnQgc3RhdHVzOwotCXUzMiBkdW1teTsKIAlfX2JlMzIgKnA7CisJdTMyIGR1bW15OwogCi0JaWYgKGNiLT5jYl9taW5vcnZlcnNpb24gPT0gMCkKLQkJcmV0dXJuIDA7Ci0KLQlzdGF0dXMgPSBkZWNvZGVfY2Jfb3BfaGRyKHhkciwgT1BfQ0JfU0VRVUVOQ0UpOwotCWlmIChzdGF0dXMpCi0JCXJldHVybiBzdGF0dXM7CisJc3RhdHVzID0gLUVTRVJWRVJGQVVMVDsKIAogCS8qCiAJICogSWYgdGhlIHNlcnZlciByZXR1cm5zIGRpZmZlcmVudCB2YWx1ZXMgZm9yIHNlc3Npb25JRCwgc2xvdElEIG9yCiAJICogc2VxdWVuY2UgbnVtYmVyLCB0aGUgc2VydmVyIGlzIGxvb25leSB0dW5lcy4KIAkgKi8KLQlzdGF0dXMgPSAtRVNFUlZFUkZBVUxUOwotCi0JUkVBRF9CVUYoTkZTNF9NQVhfU0VTU0lPTklEX0xFTiArIDE2KTsKKwlwID0geGRyX2lubGluZV9kZWNvZGUoeGRyLCBORlM0X01BWF9TRVNTSU9OSURfTEVOICsgNCArIDQpOworCWlmICh1bmxpa2VseShwID09IE5VTEwpKQorCQlnb3RvIG91dF9vdmVyZmxvdzsKIAltZW1jcHkoaWQuZGF0YSwgcCwgTkZTNF9NQVhfU0VTU0lPTklEX0xFTik7CisJaWYgKG1lbWNtcChpZC5kYXRhLCBzZXNzaW9uLT5zZV9zZXNzaW9uaWQuZGF0YSwKKwkJCQkJTkZTNF9NQVhfU0VTU0lPTklEX0xFTikgIT0gMCkgeworCQlkcHJpbnRrKCJORlM6ICVzIEludmFsaWQgc2Vzc2lvbiBpZFxuIiwgX19mdW5jX18pOworCQlnb3RvIG91dDsKKwl9CiAJcCArPSBYRFJfUVVBRExFTihORlM0X01BWF9TRVNTSU9OSURfTEVOKTsKLQlpZiAobWVtY21wKGlkLmRhdGEsIHNlcy0+c2Vfc2Vzc2lvbmlkLmRhdGEsIE5GUzRfTUFYX1NFU1NJT05JRF9MRU4pKSB7Ci0JCWRwcmludGsoIiVzIEludmFsaWQgc2Vzc2lvbiBpZFxuIiwgX19mdW5jX18pOworCisJZHVtbXkgPSBiZTMyX3RvX2NwdXAocCsrKTsKKwlpZiAoZHVtbXkgIT0gc2Vzc2lvbi0+c2VfY2Jfc2VxX25yKSB7CisJCWRwcmludGsoIk5GUzogJXMgSW52YWxpZCBzZXF1ZW5jZSBudW1iZXJcbiIsIF9fZnVuY19fKTsKIAkJZ290byBvdXQ7CiAJfQotCVJFQUQzMihkdW1teSk7Ci0JaWYgKGR1bW15ICE9IHNlcy0+c2VfY2Jfc2VxX25yKSB7Ci0JCWRwcmludGsoIiVzIEludmFsaWQgc2VxdWVuY2UgbnVtYmVyXG4iLCBfX2Z1bmNfXyk7Ci0JCWdvdG8gb3V0OwotCX0KLQlSRUFEMzIoZHVtbXkpOyAJLyogc2xvdGlkIG11c3QgYmUgMCAqLworCisJZHVtbXkgPSBiZTMyX3RvX2NwdXAocCsrKTsKIAlpZiAoZHVtbXkgIT0gMCkgewotCQlkcHJpbnRrKCIlcyBJbnZhbGlkIHNsb3RpZFxuIiwgX19mdW5jX18pOworCQlkcHJpbnRrKCJORlM6ICVzIEludmFsaWQgc2xvdGlkXG4iLCBfX2Z1bmNfXyk7CiAJCWdvdG8gb3V0OwogCX0KLQkvKiBGSVhNRTogcHJvY2VzcyBoaWdoZXN0IHNsb3RpZCBhbmQgdGFyZ2V0IGhpZ2hlc3Qgc2xvdGlkICovCisKKwkvKgorCSAqIEZJWE1FOiBwcm9jZXNzIGhpZ2hlc3Qgc2xvdGlkIGFuZCB0YXJnZXQgaGlnaGVzdCBzbG90aWQKKwkgKi8KIAlzdGF0dXMgPSAwOwogb3V0OgogCXJldHVybiBzdGF0dXM7CitvdXRfb3ZlcmZsb3c6CisJcHJpbnRfb3ZlcmZsb3dfbXNnKF9fZnVuY19fLCB4ZHIpOworCXJldHVybiAtRUlPOworfQorCitzdGF0aWMgaW50IGRlY29kZV9jYl9zZXF1ZW5jZTRyZXMoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKKwkJCQkgIHN0cnVjdCBuZnNkNF9jYWxsYmFjayAqY2IpCit7CisJZW51bSBuZnNzdGF0NCBuZnNlcnI7CisJaW50IHN0YXR1czsKKworCWlmIChjYi0+Y2JfbWlub3J2ZXJzaW9uID09IDApCisJCXJldHVybiAwOworCisJc3RhdHVzID0gZGVjb2RlX2NiX29wX3N0YXR1cyh4ZHIsIE9QX0NCX1NFUVVFTkNFLCAmbmZzZXJyKTsKKwlpZiAodW5saWtlbHkoc3RhdHVzKSkKKwkJZ290byBvdXQ7CisJaWYgKHVubGlrZWx5KG5mc2VyciAhPSBORlM0X09LKSkKKwkJZ290byBvdXRfZGVmYXVsdDsKKwlzdGF0dXMgPSBkZWNvZGVfY2Jfc2VxdWVuY2U0cmVzb2soeGRyLCBjYik7CitvdXQ6CisJcmV0dXJuIHN0YXR1czsKK291dF9kZWZhdWx0OgorCXJldHVybiBuZnNfY2Jfc3RhdF90b19lcnJubyhzdGF0dXMpOworfQorCisvKgorICogTkZTdjQuMCBhbmQgTkZTdjQuMSBYRFIgZW5jb2RlIGZ1bmN0aW9ucworICoKKyAqIE5GU3Y0LjAgY2FsbGJhY2sgYXJndW1lbnQgdHlwZXMgYXJlIGRlZmluZWQgaW4gc2VjdGlvbiAxNSBvZiBSRkMKKyAqIDM1MzA6ICJOZXR3b3JrIEZpbGUgU3lzdGVtIChORlMpIHZlcnNpb24gNCBQcm90b2NvbCIgYW5kIHNlY3Rpb24gMjAKKyAqIG9mIFJGQyA1NjYxOiAgIk5ldHdvcmsgRmlsZSBTeXN0ZW0gKE5GUykgVmVyc2lvbiA0IE1pbm9yIFZlcnNpb24gMQorICogUHJvdG9jb2wiLgorICovCisKKy8qCisgKiBOQjogV2l0aG91dCB0aGlzIHplcm8gc3BhY2UgcmVzZXJ2YXRpb24sIGNhbGxiYWNrcyBvdmVyIGtyYjVwIGZhaWwKKyAqLworc3RhdGljIHZvaWQgbmZzNF94ZHJfZW5jX2NiX251bGwoc3RydWN0IHJwY19ycXN0ICpyZXEsIHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCisJCQkJIHZvaWQgKl9fdW51c2VkKQoreworCXhkcl9yZXNlcnZlX3NwYWNlKHhkciwgMCk7Cit9CisKKy8qCisgKiAyMC4yLiBPcGVyYXRpb24gNDogQ0JfUkVDQUxMIC0gUmVjYWxsIGEgRGVsZWdhdGlvbgorICovCitzdGF0aWMgdm9pZCBuZnM0X3hkcl9lbmNfY2JfcmVjYWxsKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAorCQkJCSAgIGNvbnN0IHN0cnVjdCBuZnNkNF9jYWxsYmFjayAqY2IpCit7CisJY29uc3Qgc3RydWN0IG5mczRfZGVsZWdhdGlvbiAqYXJncyA9IGNiLT5jYl9vcDsKKwlzdHJ1Y3QgbmZzNF9jYl9jb21wb3VuZF9oZHIgaGRyID0geworCQkuaWRlbnQgPSBjYi0+Y2JfY2xwLT5jbF9jYl9pZGVudCwKKwkJLm1pbm9ydmVyc2lvbiA9IGNiLT5jYl9taW5vcnZlcnNpb24sCisJfTsKKworCWVuY29kZV9jYl9jb21wb3VuZDRhcmdzKHhkciwgJmhkcik7CisJZW5jb2RlX2NiX3NlcXVlbmNlNGFyZ3MoeGRyLCBjYiwgJmhkcik7CisJZW5jb2RlX2NiX3JlY2FsbDRhcmdzKHhkciwgYXJncywgJmhkcik7CisJZW5jb2RlX2NiX25vcHMoJmhkcik7CiB9CiAKIAotc3RhdGljIGludAotbmZzNF94ZHJfZGVjX2NiX251bGwoc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCkKKy8qCisgKiBORlN2NC4wIGFuZCBORlN2NC4xIFhEUiBkZWNvZGUgZnVuY3Rpb25zCisgKgorICogTkZTdjQuMCBjYWxsYmFjayByZXN1bHQgdHlwZXMgYXJlIGRlZmluZWQgaW4gc2VjdGlvbiAxNSBvZiBSRkMKKyAqIDM1MzA6ICJOZXR3b3JrIEZpbGUgU3lzdGVtIChORlMpIHZlcnNpb24gNCBQcm90b2NvbCIgYW5kIHNlY3Rpb24gMjAKKyAqIG9mIFJGQyA1NjYxOiAgIk5ldHdvcmsgRmlsZSBTeXN0ZW0gKE5GUykgVmVyc2lvbiA0IE1pbm9yIFZlcnNpb24gMQorICogUHJvdG9jb2wiLgorICovCisKK3N0YXRpYyBpbnQgbmZzNF94ZHJfZGVjX2NiX251bGwoc3RydWN0IHJwY19ycXN0ICpyZXEsIHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCisJCQkJdm9pZCAqX191bnVzZWQpCiB7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQKLW5mczRfeGRyX2RlY19jYl9yZWNhbGwoc3RydWN0IHJwY19ycXN0ICpycXN0cCwgX19iZTMyICpwLAotCQlzdHJ1Y3QgbmZzZDRfY2FsbGJhY2sgKmNiKQorLyoKKyAqIDIwLjIuIE9wZXJhdGlvbiA0OiBDQl9SRUNBTEwgLSBSZWNhbGwgYSBEZWxlZ2F0aW9uCisgKi8KK3N0YXRpYyBpbnQgbmZzNF94ZHJfZGVjX2NiX3JlY2FsbChzdHJ1Y3QgcnBjX3Jxc3QgKnJxc3RwLAorCQkJCSAgc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKKwkJCQkgIHN0cnVjdCBuZnNkNF9jYWxsYmFjayAqY2IpCiB7Ci0Jc3RydWN0IHhkcl9zdHJlYW0geGRyOwogCXN0cnVjdCBuZnM0X2NiX2NvbXBvdW5kX2hkciBoZHI7CisJZW51bSBuZnNzdGF0NCBuZnNlcnI7CiAJaW50IHN0YXR1czsKIAotCXhkcl9pbml0X2RlY29kZSgmeGRyLCAmcnFzdHAtPnJxX3Jjdl9idWYsIHApOwotCXN0YXR1cyA9IGRlY29kZV9jYl9jb21wb3VuZF9oZHIoJnhkciwgJmhkcik7Ci0JaWYgKHN0YXR1cykKKwlzdGF0dXMgPSBkZWNvZGVfY2JfY29tcG91bmQ0cmVzKHhkciwgJmhkcik7CisJaWYgKHVubGlrZWx5KHN0YXR1cykpCiAJCWdvdG8gb3V0OwotCWlmIChjYikgewotCQlzdGF0dXMgPSBkZWNvZGVfY2Jfc2VxdWVuY2UoJnhkciwgY2IsIHJxc3RwKTsKLQkJaWYgKHN0YXR1cykKKworCWlmIChjYiAhPSBOVUxMKSB7CisJCXN0YXR1cyA9IGRlY29kZV9jYl9zZXF1ZW5jZTRyZXMoeGRyLCBjYik7CisJCWlmICh1bmxpa2VseShzdGF0dXMpKQogCQkJZ290byBvdXQ7CiAJfQotCXN0YXR1cyA9IGRlY29kZV9jYl9vcF9oZHIoJnhkciwgT1BfQ0JfUkVDQUxMKTsKKworCXN0YXR1cyA9IGRlY29kZV9jYl9vcF9zdGF0dXMoeGRyLCBPUF9DQl9SRUNBTEwsICZuZnNlcnIpOworCWlmICh1bmxpa2VseShzdGF0dXMpKQorCQlnb3RvIG91dDsKKwlpZiAodW5saWtlbHkobmZzZXJyICE9IE5GUzRfT0spKQorCQlnb3RvIG91dF9kZWZhdWx0Owogb3V0OgogCXJldHVybiBzdGF0dXM7CitvdXRfZGVmYXVsdDoKKwlyZXR1cm4gbmZzX2NiX3N0YXRfdG9fZXJybm8oc3RhdHVzKTsKIH0KIAogLyoKICAqIFJQQyBwcm9jZWR1cmUgdGFibGVzCiAgKi8KLSNkZWZpbmUgUFJPQyhwcm9jLCBjYWxsLCBhcmd0eXBlLCByZXN0eXBlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLVtORlNQUk9DNF9DTE5UXyMjcHJvY10gPSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJXAotICAgICAgICAucF9wcm9jICAgPSBORlNQUk9DNF9DQl8jI2NhbGwsCQkJCQlcCi0gICAgICAgIC5wX2VuY29kZSA9IChreGRycHJvY190KSBuZnM0X3hkcl8jI2FyZ3R5cGUsICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIC5wX2RlY29kZSA9IChreGRycHJvY190KSBuZnM0X3hkcl8jI3Jlc3R5cGUsICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIC5wX2FyZ2xlbiA9IE5GUzRfIyNhcmd0eXBlIyNfc3osICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIC5wX3JlcGxlbiA9IE5GUzRfIyNyZXN0eXBlIyNfc3osICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIC5wX3N0YXRpZHggPSBORlNQUk9DNF9DQl8jI2NhbGwsCQkJCVwKLQkucF9uYW1lICAgPSAjcHJvYywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorI2RlZmluZSBQUk9DKHByb2MsIGNhbGwsIGFyZ3R5cGUsIHJlc3R5cGUpCQkJCVwKK1tORlNQUk9DNF9DTE5UXyMjcHJvY10gPSB7CQkJCQkJXAorCS5wX3Byb2MgICAgPSBORlNQUk9DNF9DQl8jI2NhbGwsCQkJCVwKKwkucF9lbmNvZGUgID0gKGt4ZHJlcHJvY190KW5mczRfeGRyX2VuY18jI2FyZ3R5cGUsCQlcCisJLnBfZGVjb2RlICA9IChreGRyZHByb2NfdCluZnM0X3hkcl9kZWNfIyNyZXN0eXBlLAkJXAorCS5wX2FyZ2xlbiAgPSBORlM0X2VuY18jI2FyZ3R5cGUjI19zeiwJCQkJXAorCS5wX3JlcGxlbiAgPSBORlM0X2RlY18jI3Jlc3R5cGUjI19zeiwJCQkJXAorCS5wX3N0YXRpZHggPSBORlNQUk9DNF9DQl8jI2NhbGwsCQkJCVwKKwkucF9uYW1lICAgID0gI3Byb2MsCQkJCQkJXAogfQogCi1zdGF0aWMgc3RydWN0IHJwY19wcm9jaW5mbyAgICAgbmZzNF9jYl9wcm9jZWR1cmVzW10gPSB7Ci0gICAgUFJPQyhDQl9OVUxMLCAgICAgIE5VTEwsICAgICBlbmNfY2JfbnVsbCwgICAgIGRlY19jYl9udWxsKSwKLSAgICBQUk9DKENCX1JFQ0FMTCwgICAgQ09NUE9VTkQsICAgZW5jX2NiX3JlY2FsbCwgICAgICBkZWNfY2JfcmVjYWxsKSwKK3N0YXRpYyBzdHJ1Y3QgcnBjX3Byb2NpbmZvIG5mczRfY2JfcHJvY2VkdXJlc1tdID0geworCVBST0MoQ0JfTlVMTCwJTlVMTCwJCWNiX251bGwsCWNiX251bGwpLAorCVBST0MoQ0JfUkVDQUxMLAlDT01QT1VORCwJY2JfcmVjYWxsLAljYl9yZWNhbGwpLAogfTsKIAotc3RhdGljIHN0cnVjdCBycGNfdmVyc2lvbiAgICAgICBuZnNfY2JfdmVyc2lvbjQgPSB7CitzdGF0aWMgc3RydWN0IHJwY192ZXJzaW9uIG5mc19jYl92ZXJzaW9uNCA9IHsKIC8qCiAgKiBOb3RlIG9uIHRoZSBjYWxsYmFjayBycGMgcHJvZ3JhbSB2ZXJzaW9uIG51bWJlcjogZGVzcGl0ZSBsYW5ndWFnZSBpbiByZmMKICAqIDU2NjEgc2VjdGlvbiAxOC4zNi4zIHJlcXVpcmluZyBzZXJ2ZXJzIHRvIHVzZSA0IGluIHRoaXMgZmllbGQsIHRoZQpAQCAtNDQwLDI5ICs1OTgsMjkgQEAKICAqIGluIHByYWN0aWNlIHRoYXQgYXBwZWFycyB0byBiZSB3aGF0IGltcGxlbWVudGF0aW9ucyB1c2UuICBUaGUgc2VjdGlvbgogICogMTguMzYuMyBsYW5ndWFnZSBpcyBleHBlY3RlZCB0byBiZSBmaXhlZCBpbiBhbiBlcnJhdHVtLgogICovCi0gICAgICAgIC5udW1iZXIgICAgICAgICAgICAgICAgID0gMSwKLSAgICAgICAgLm5ycHJvY3MgICAgICAgICAgICAgICAgPSBBUlJBWV9TSVpFKG5mczRfY2JfcHJvY2VkdXJlcyksCi0gICAgICAgIC5wcm9jcyAgICAgICAgICAgICAgICAgID0gbmZzNF9jYl9wcm9jZWR1cmVzCisJLm51bWJlcgkJCT0gMSwKKwkubnJwcm9jcwkJPSBBUlJBWV9TSVpFKG5mczRfY2JfcHJvY2VkdXJlcyksCisJLnByb2NzCQkJPSBuZnM0X2NiX3Byb2NlZHVyZXMKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgcnBjX3ZlcnNpb24gKgluZnNfY2JfdmVyc2lvbltdID0geworc3RhdGljIHN0cnVjdCBycGNfdmVyc2lvbiAqbmZzX2NiX3ZlcnNpb25bXSA9IHsKIAkmbmZzX2NiX3ZlcnNpb240LAogfTsKIAogc3RhdGljIHN0cnVjdCBycGNfcHJvZ3JhbSBjYl9wcm9ncmFtOwogCiBzdGF0aWMgc3RydWN0IHJwY19zdGF0IGNiX3N0YXRzID0gewotCQkucHJvZ3JhbQk9ICZjYl9wcm9ncmFtCisJLnByb2dyYW0JCT0gJmNiX3Byb2dyYW0KIH07CiAKICNkZWZpbmUgTkZTNF9DQUxMQkFDSyAweDQwMDAwMDAwCiBzdGF0aWMgc3RydWN0IHJwY19wcm9ncmFtIGNiX3Byb2dyYW0gPSB7Ci0JCS5uYW1lIAkJPSAibmZzNF9jYiIsCi0JCS5udW1iZXIJCT0gTkZTNF9DQUxMQkFDSywKLQkJLm5ydmVycwkJPSBBUlJBWV9TSVpFKG5mc19jYl92ZXJzaW9uKSwKLQkJLnZlcnNpb24JPSBuZnNfY2JfdmVyc2lvbiwKLQkJLnN0YXRzCQk9ICZjYl9zdGF0cywKLQkJLnBpcGVfZGlyX25hbWUgID0gIi9uZnNkNF9jYiIsCisJLm5hbWUJCQk9ICJuZnM0X2NiIiwKKwkubnVtYmVyCQkJPSBORlM0X0NBTExCQUNLLAorCS5ucnZlcnMJCQk9IEFSUkFZX1NJWkUobmZzX2NiX3ZlcnNpb24pLAorCS52ZXJzaW9uCQk9IG5mc19jYl92ZXJzaW9uLAorCS5zdGF0cwkJCT0gJmNiX3N0YXRzLAorCS5waXBlX2Rpcl9uYW1lCQk9ICIvbmZzZDRfY2IiLAogfTsKIAogc3RhdGljIGludCBtYXhfY2JfdGltZSh2b2lkKQpkaWZmIC0tZ2l0IGEvZnMvbmlsZnMyL2JtYXAuYyBiL2ZzL25pbGZzMi9ibWFwLmMKaW5kZXggOGI3ODJiMC4uM2VlNjdjNiAxMDA2NDQKLS0tIGEvZnMvbmlsZnMyL2JtYXAuYworKysgYi9mcy9uaWxmczIvYm1hcC5jCkBAIC0zNSw3ICszNSwyMCBAQAogCiBzdHJ1Y3QgaW5vZGUgKm5pbGZzX2JtYXBfZ2V0X2RhdChjb25zdCBzdHJ1Y3QgbmlsZnNfYm1hcCAqYm1hcCkKIHsKLQlyZXR1cm4gbmlsZnNfZGF0X2lub2RlKE5JTEZTX0lfTklMRlMoYm1hcC0+Yl9pbm9kZSkpOworCXJldHVybiBOSUxGU19JX05JTEZTKGJtYXAtPmJfaW5vZGUpLT5uc19kYXQ7Cit9CisKK3N0YXRpYyBpbnQgbmlsZnNfYm1hcF9jb252ZXJ0X2Vycm9yKHN0cnVjdCBuaWxmc19ibWFwICpibWFwLAorCQkJCSAgICAgY29uc3QgY2hhciAqZm5hbWUsIGludCBlcnIpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGJtYXAtPmJfaW5vZGU7CisKKwlpZiAoZXJyID09IC1FSU5WQUwpIHsKKwkJbmlsZnNfZXJyb3IoaW5vZGUtPmlfc2IsIGZuYW1lLAorCQkJICAgICJicm9rZW4gYm1hcCAoaW5vZGUgbnVtYmVyPSVsdSlcbiIsIGlub2RlLT5pX2lubyk7CisJCWVyciA9IC1FSU87CisJfQorCXJldHVybiBlcnI7CiB9CiAKIC8qKgpAQCAtNjYsOCArNzksMTAgQEAKIAogCWRvd25fcmVhZCgmYm1hcC0+Yl9zZW0pOwogCXJldCA9IGJtYXAtPmJfb3BzLT5ib3BfbG9va3VwKGJtYXAsIGtleSwgbGV2ZWwsIHB0cnApOwotCWlmIChyZXQgPCAwKQorCWlmIChyZXQgPCAwKSB7CisJCXJldCA9IG5pbGZzX2JtYXBfY29udmVydF9lcnJvcihibWFwLCBfX2Z1bmNfXywgcmV0KTsKIAkJZ290byBvdXQ7CisJfQogCWlmIChOSUxGU19CTUFQX1VTRV9WQk4oYm1hcCkpIHsKIAkJcmV0ID0gbmlsZnNfZGF0X3RyYW5zbGF0ZShuaWxmc19ibWFwX2dldF9kYXQoYm1hcCksICpwdHJwLAogCQkJCQkgICZibG9ja25yKTsKQEAgLTg4LDcgKzEwMyw4IEBACiAJZG93bl9yZWFkKCZibWFwLT5iX3NlbSk7CiAJcmV0ID0gYm1hcC0+Yl9vcHMtPmJvcF9sb29rdXBfY29udGlnKGJtYXAsIGtleSwgcHRycCwgbWF4YmxvY2tzKTsKIAl1cF9yZWFkKCZibWFwLT5iX3NlbSk7Ci0JcmV0dXJuIHJldDsKKworCXJldHVybiBuaWxmc19ibWFwX2NvbnZlcnRfZXJyb3IoYm1hcCwgX19mdW5jX18sIHJldCk7CiB9CiAKIHN0YXRpYyBpbnQgbmlsZnNfYm1hcF9kb19pbnNlcnQoc3RydWN0IG5pbGZzX2JtYXAgKmJtYXAsIF9fdTY0IGtleSwgX191NjQgcHRyKQpAQCAtMTQ0LDcgKzE2MCw4IEBACiAJZG93bl93cml0ZSgmYm1hcC0+Yl9zZW0pOwogCXJldCA9IG5pbGZzX2JtYXBfZG9faW5zZXJ0KGJtYXAsIGtleSwgcmVjKTsKIAl1cF93cml0ZSgmYm1hcC0+Yl9zZW0pOwotCXJldHVybiByZXQ7CisKKwlyZXR1cm4gbmlsZnNfYm1hcF9jb252ZXJ0X2Vycm9yKGJtYXAsIF9fZnVuY19fLCByZXQpOwogfQogCiBzdGF0aWMgaW50IG5pbGZzX2JtYXBfZG9fZGVsZXRlKHN0cnVjdCBuaWxmc19ibWFwICpibWFwLCBfX3U2NCBrZXkpCkBAIC0xODAsOSArMTk3LDEyIEBACiAKIAlkb3duX3JlYWQoJmJtYXAtPmJfc2VtKTsKIAlyZXQgPSBibWFwLT5iX29wcy0+Ym9wX2xhc3Rfa2V5KGJtYXAsICZsYXN0a2V5KTsKLQlpZiAoIXJldCkKLQkJKmtleSA9IGxhc3RrZXk7CiAJdXBfcmVhZCgmYm1hcC0+Yl9zZW0pOworCisJaWYgKHJldCA8IDApCisJCXJldCA9IG5pbGZzX2JtYXBfY29udmVydF9lcnJvcihibWFwLCBfX2Z1bmNfXywgcmV0KTsKKwllbHNlCisJCSprZXkgPSBsYXN0a2V5OwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTIxMCw3ICsyMzAsOCBAQAogCWRvd25fd3JpdGUoJmJtYXAtPmJfc2VtKTsKIAlyZXQgPSBuaWxmc19ibWFwX2RvX2RlbGV0ZShibWFwLCBrZXkpOwogCXVwX3dyaXRlKCZibWFwLT5iX3NlbSk7Ci0JcmV0dXJuIHJldDsKKworCXJldHVybiBuaWxmc19ibWFwX2NvbnZlcnRfZXJyb3IoYm1hcCwgX19mdW5jX18sIHJldCk7CiB9CiAKIHN0YXRpYyBpbnQgbmlsZnNfYm1hcF9kb190cnVuY2F0ZShzdHJ1Y3QgbmlsZnNfYm1hcCAqYm1hcCwgdW5zaWduZWQgbG9uZyBrZXkpCkBAIC0yNjEsNyArMjgyLDggQEAKIAlkb3duX3dyaXRlKCZibWFwLT5iX3NlbSk7CiAJcmV0ID0gbmlsZnNfYm1hcF9kb190cnVuY2F0ZShibWFwLCBrZXkpOwogCXVwX3dyaXRlKCZibWFwLT5iX3NlbSk7Ci0JcmV0dXJuIHJldDsKKworCXJldHVybiBuaWxmc19ibWFwX2NvbnZlcnRfZXJyb3IoYm1hcCwgX19mdW5jX18sIHJldCk7CiB9CiAKIC8qKgpAQCAtMzAwLDcgKzMyMiw4IEBACiAJZG93bl93cml0ZSgmYm1hcC0+Yl9zZW0pOwogCXJldCA9IGJtYXAtPmJfb3BzLT5ib3BfcHJvcGFnYXRlKGJtYXAsIGJoKTsKIAl1cF93cml0ZSgmYm1hcC0+Yl9zZW0pOwotCXJldHVybiByZXQ7CisKKwlyZXR1cm4gbmlsZnNfYm1hcF9jb252ZXJ0X2Vycm9yKGJtYXAsIF9fZnVuY19fLCByZXQpOwogfQogCiAvKioKQEAgLTM0NCw3ICszNjcsOCBAQAogCWRvd25fd3JpdGUoJmJtYXAtPmJfc2VtKTsKIAlyZXQgPSBibWFwLT5iX29wcy0+Ym9wX2Fzc2lnbihibWFwLCBiaCwgYmxvY2tuciwgYmluZm8pOwogCXVwX3dyaXRlKCZibWFwLT5iX3NlbSk7Ci0JcmV0dXJuIHJldDsKKworCXJldHVybiBuaWxmc19ibWFwX2NvbnZlcnRfZXJyb3IoYm1hcCwgX19mdW5jX18sIHJldCk7CiB9CiAKIC8qKgpAQCAtMzczLDcgKzM5Nyw4IEBACiAJZG93bl93cml0ZSgmYm1hcC0+Yl9zZW0pOwogCXJldCA9IGJtYXAtPmJfb3BzLT5ib3BfbWFyayhibWFwLCBrZXksIGxldmVsKTsKIAl1cF93cml0ZSgmYm1hcC0+Yl9zZW0pOwotCXJldHVybiByZXQ7CisKKwlyZXR1cm4gbmlsZnNfYm1hcF9jb252ZXJ0X2Vycm9yKGJtYXAsIF9fZnVuY19fLCByZXQpOwogfQogCiAvKioKZGlmZiAtLWdpdCBhL2ZzL25pbGZzMi9idG5vZGUuYyBiL2ZzL25pbGZzMi9idG5vZGUuYwppbmRleCA1MTE1ODE0Li4zODhlOWU4IDEwMDY0NAotLS0gYS9mcy9uaWxmczIvYnRub2RlLmMKKysrIGIvZnMvbmlsZnMyL2J0bm9kZS5jCkBAIC0xMDQsOCArMTA0LDcgQEAKIAlpZiAocGJsb2NrbnIgPT0gMCkgewogCQlwYmxvY2tuciA9IGJsb2NrbnI7CiAJCWlmIChpbm9kZS0+aV9pbm8gIT0gTklMRlNfREFUX0lOTykgewotCQkJc3RydWN0IGlub2RlICpkYXQgPQotCQkJCW5pbGZzX2RhdF9pbm9kZShOSUxGU19JX05JTEZTKGlub2RlKSk7CisJCQlzdHJ1Y3QgaW5vZGUgKmRhdCA9IE5JTEZTX0lfTklMRlMoaW5vZGUpLT5uc19kYXQ7CiAKIAkJCS8qIGJsb2NrbnIgaXMgYSB2aXJ0dWFsIGJsb2NrIG51bWJlciAqLwogCQkJZXJyID0gbmlsZnNfZGF0X3RyYW5zbGF0ZShkYXQsIGJsb2NrbnIsICZwYmxvY2tucik7CmRpZmYgLS1naXQgYS9mcy9uaWxmczIvZGlyLmMgYi9mcy9uaWxmczIvZGlyLmMKaW5kZXggY2IwMDNjOC4uOWQ0NTc3MyAxMDA2NDQKLS0tIGEvZnMvbmlsZnMyL2Rpci5jCisrKyBiL2ZzL25pbGZzMi9kaXIuYwpAQCAtOTEsNyArOTEsNiBAQAogCQkJICAgICAgIHVuc2lnbmVkIGZyb20sIHVuc2lnbmVkIHRvKQogewogCXN0cnVjdCBpbm9kZSAqZGlyID0gbWFwcGluZy0+aG9zdDsKLQlzdHJ1Y3QgbmlsZnNfc2JfaW5mbyAqc2JpID0gTklMRlNfU0IoZGlyLT5pX3NiKTsKIAlsb2ZmX3QgcG9zID0gcGFnZV9vZmZzZXQocGFnZSkgKyBmcm9tOwogCXVuc2lnbmVkIGxlbiA9IHRvIC0gZnJvbTsKIAl1bnNpZ25lZCBucl9kaXJ0eSwgY29waWVkOwpAQCAtMTAzLDcgKzEwMiw3IEBACiAJCWlfc2l6ZV93cml0ZShkaXIsIHBvcyArIGNvcGllZCk7CiAJaWYgKElTX0RJUlNZTkMoZGlyKSkKIAkJbmlsZnNfc2V0X3RyYW5zYWN0aW9uX2ZsYWcoTklMRlNfVElfU1lOQyk7Ci0JZXJyID0gbmlsZnNfc2V0X2ZpbGVfZGlydHkoc2JpLCBkaXIsIG5yX2RpcnR5KTsKKwllcnIgPSBuaWxmc19zZXRfZmlsZV9kaXJ0eShkaXIsIG5yX2RpcnR5KTsKIAlXQVJOX09OKGVycik7IC8qIGRvIG5vdCBoYXBwZW4gKi8KIAl1bmxvY2tfcGFnZShwYWdlKTsKIH0KZGlmZiAtLWdpdCBhL2ZzL25pbGZzMi9maWxlLmMgYi9mcy9uaWxmczIvZmlsZS5jCmluZGV4IGM5YTMwZDcuLjJmNTYwYzkgMTAwNjQ0Ci0tLSBhL2ZzL25pbGZzMi9maWxlLmMKKysrIGIvZnMvbmlsZnMyL2ZpbGUuYwpAQCAtMTU1LDYgKzE1NSw3IEBACiAJLnRydW5jYXRlCT0gbmlsZnNfdHJ1bmNhdGUsCiAJLnNldGF0dHIJPSBuaWxmc19zZXRhdHRyLAogCS5wZXJtaXNzaW9uICAgICA9IG5pbGZzX3Blcm1pc3Npb24sCisJLmZpZW1hcAkJPSBuaWxmc19maWVtYXAsCiB9OwogCiAvKiBlbmQgb2YgZmlsZSAqLwpkaWZmIC0tZ2l0IGEvZnMvbmlsZnMyL2lmaWxlLmMgYi9mcy9uaWxmczIvaWZpbGUuYwppbmRleCA5ZjhhMmRhLi5iZmM3M2QzIDEwMDY0NAotLS0gYS9mcy9uaWxmczIvaWZpbGUuYworKysgYi9mcy9uaWxmczIvaWZpbGUuYwpAQCAtMTQ5LDE0ICsxNDksOSBAQAogCX0KIAogCWVyciA9IG5pbGZzX3BhbGxvY19nZXRfZW50cnlfYmxvY2soaWZpbGUsIGlubywgMCwgb3V0X2JoKTsKLQlpZiAodW5saWtlbHkoZXJyKSkgewotCQlpZiAoZXJyID09IC1FSU5WQUwpCi0JCQluaWxmc19lcnJvcihzYiwgX19mdW5jX18sICJpZmlsZSBpcyBicm9rZW4iKTsKLQkJZWxzZQotCQkJbmlsZnNfd2FybmluZyhzYiwgX19mdW5jX18sCi0JCQkJICAgICAgInVuYWJsZSB0byByZWFkIGlub2RlOiAlbHUiLAotCQkJCSAgICAgICh1bnNpZ25lZCBsb25nKSBpbm8pOwotCX0KKwlpZiAodW5saWtlbHkoZXJyKSkKKwkJbmlsZnNfd2FybmluZyhzYiwgX19mdW5jX18sICJ1bmFibGUgdG8gcmVhZCBpbm9kZTogJWx1IiwKKwkJCSAgICAgICh1bnNpZ25lZCBsb25nKSBpbm8pOwogCXJldHVybiBlcnI7CiB9CiAKZGlmZiAtLWdpdCBhL2ZzL25pbGZzMi9pbm9kZS5jIGIvZnMvbmlsZnMyL2lub2RlLmMKaW5kZXggNzdiNDhjOC4uMmZkNDQwZCAxMDA2NDQKLS0tIGEvZnMvbmlsZnMyL2lub2RlLmMKKysrIGIvZnMvbmlsZnMyL2lub2RlLmMKQEAgLTU4LDcgKzU4LDcgQEAKIAlzdHJ1Y3QgbmlsZnNfaW5vZGVfaW5mbyAqaWkgPSBOSUxGU19JKGlub2RlKTsKIAlfX3U2NCBibGtudW0gPSAwOwogCWludCBlcnIgPSAwLCByZXQ7Ci0Jc3RydWN0IGlub2RlICpkYXQgPSBuaWxmc19kYXRfaW5vZGUoTklMRlNfSV9OSUxGUyhpbm9kZSkpOworCXN0cnVjdCBpbm9kZSAqZGF0ID0gTklMRlNfSV9OSUxGUyhpbm9kZSktPm5zX2RhdDsKIAl1bnNpZ25lZCBtYXhibG9ja3MgPSBiaF9yZXN1bHQtPmJfc2l6ZSA+PiBpbm9kZS0+aV9ibGtiaXRzOwogCiAJZG93bl9yZWFkKCZOSUxGU19NRFQoZGF0KS0+bWlfc2VtKTsKQEAgLTk2LDExICs5Niw2IEBACiAJCQkJICAgICAgIGlub2RlLT5pX2lubywKIAkJCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylibGtvZmYpOwogCQkJCWVyciA9IDA7Ci0JCQl9IGVsc2UgaWYgKGVyciA9PSAtRUlOVkFMKSB7Ci0JCQkJbmlsZnNfZXJyb3IoaW5vZGUtPmlfc2IsIF9fZnVuY19fLAotCQkJCQkgICAgImJyb2tlbiBibWFwIChpbm9kZT0lbHUpXG4iLAotCQkJCQkgICAgaW5vZGUtPmlfaW5vKTsKLQkJCQllcnIgPSAtRUlPOwogCQkJfQogCQkJbmlsZnNfdHJhbnNhY3Rpb25fYWJvcnQoaW5vZGUtPmlfc2IpOwogCQkJZ290byBvdXQ7CkBAIC0xMDksNiArMTA0LDcgQEAKIAkJbmlsZnNfdHJhbnNhY3Rpb25fY29tbWl0KGlub2RlLT5pX3NiKTsgLyogbmV2ZXIgZmFpbHMgKi8KIAkJLyogRXJyb3IgaGFuZGxpbmcgc2hvdWxkIGJlIGRldGFpbGVkICovCiAJCXNldF9idWZmZXJfbmV3KGJoX3Jlc3VsdCk7CisJCXNldF9idWZmZXJfZGVsYXkoYmhfcmVzdWx0KTsKIAkJbWFwX2JoKGJoX3Jlc3VsdCwgaW5vZGUtPmlfc2IsIDApOyAvKiBkYm4gbXVzdCBiZSBjaGFuZ2VkCiAJCQkJCQkgICAgICB0byBwcm9wZXIgdmFsdWUgKi8KIAl9IGVsc2UgaWYgKHJldCA9PSAtRU5PRU5UKSB7CkBAIC0xODUsMTAgKzE4MSw5IEBACiAKIAlpZiAocmV0KSB7CiAJCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBwYWdlLT5tYXBwaW5nLT5ob3N0OwotCQlzdHJ1Y3QgbmlsZnNfc2JfaW5mbyAqc2JpID0gTklMRlNfU0IoaW5vZGUtPmlfc2IpOwogCQl1bnNpZ25lZCBucl9kaXJ0eSA9IDEgPDwgKFBBR0VfU0hJRlQgLSBpbm9kZS0+aV9ibGtiaXRzKTsKIAotCQluaWxmc19zZXRfZmlsZV9kaXJ0eShzYmksIGlub2RlLCBucl9kaXJ0eSk7CisJCW5pbGZzX3NldF9maWxlX2RpcnR5KGlub2RlLCBucl9kaXJ0eSk7CiAJfQogCXJldHVybiByZXQ7CiB9CkBAIC0yMjksNyArMjI0LDcgQEAKIAkJCQkJCSAgc3RhcnQgKyBjb3BpZWQpOwogCWNvcGllZCA9IGdlbmVyaWNfd3JpdGVfZW5kKGZpbGUsIG1hcHBpbmcsIHBvcywgbGVuLCBjb3BpZWQsIHBhZ2UsCiAJCQkJICAgZnNkYXRhKTsKLQluaWxmc19zZXRfZmlsZV9kaXJ0eShOSUxGU19TQihpbm9kZS0+aV9zYiksIGlub2RlLCBucl9kaXJ0eSk7CisJbmlsZnNfc2V0X2ZpbGVfZGlydHkoaW5vZGUsIG5yX2RpcnR5KTsKIAllcnIgPSBuaWxmc190cmFuc2FjdGlvbl9jb21taXQoaW5vZGUtPmlfc2IpOwogCXJldHVybiBlcnIgPyA6IGNvcGllZDsKIH0KQEAgLTQyNSwxMyArNDIwLDEyIEBACiAJCQkgICAgICBzdHJ1Y3QgbmlsZnNfcm9vdCAqcm9vdCwgdW5zaWduZWQgbG9uZyBpbm8sCiAJCQkgICAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlKQogewotCXN0cnVjdCBuaWxmc19zYl9pbmZvICpzYmkgPSBOSUxGU19TQihzYik7Ci0Jc3RydWN0IGlub2RlICpkYXQgPSBuaWxmc19kYXRfaW5vZGUoc2JpLT5zX25pbGZzKTsKKwlzdHJ1Y3QgdGhlX25pbGZzICpuaWxmcyA9IE5JTEZTX1NCKHNiKS0+c19uaWxmczsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOwogCXN0cnVjdCBuaWxmc19pbm9kZSAqcmF3X2lub2RlOwogCWludCBlcnI7CiAKLQlkb3duX3JlYWQoJk5JTEZTX01EVChkYXQpLT5taV9zZW0pOwkvKiBYWFggKi8KKwlkb3duX3JlYWQoJk5JTEZTX01EVChuaWxmcy0+bnNfZGF0KS0+bWlfc2VtKTsKIAllcnIgPSBuaWxmc19pZmlsZV9nZXRfaW5vZGVfYmxvY2socm9vdC0+aWZpbGUsIGlubywgJmJoKTsKIAlpZiAodW5saWtlbHkoZXJyKSkKIAkJZ290byBiYWRfaW5vZGU7CkBAIC00NjEsNyArNDU1LDcgQEAKIAl9CiAJbmlsZnNfaWZpbGVfdW5tYXBfaW5vZGUocm9vdC0+aWZpbGUsIGlubywgYmgpOwogCWJyZWxzZShiaCk7Ci0JdXBfcmVhZCgmTklMRlNfTURUKGRhdCktPm1pX3NlbSk7CS8qIFhYWCAqLworCXVwX3JlYWQoJk5JTEZTX01EVChuaWxmcy0+bnNfZGF0KS0+bWlfc2VtKTsKIAluaWxmc19zZXRfaW5vZGVfZmxhZ3MoaW5vZGUpOwogCXJldHVybiAwOwogCkBAIC00NzAsNyArNDY0LDcgQEAKIAlicmVsc2UoYmgpOwogCiAgYmFkX2lub2RlOgotCXVwX3JlYWQoJk5JTEZTX01EVChkYXQpLT5taV9zZW0pOwkvKiBYWFggKi8KKwl1cF9yZWFkKCZOSUxGU19NRFQobmlsZnMtPm5zX2RhdCktPm1pX3NlbSk7CiAJcmV0dXJuIGVycjsKIH0KIApAQCAtNjI5LDcgKzYyMyw3IEBACiAKIAlpZiAoIXRlc3RfYml0KE5JTEZTX0lfQk1BUCwgJmlpLT5pX3N0YXRlKSkKIAkJcmV0dXJuOwotIHJlcGVhdDoKK3JlcGVhdDoKIAlyZXQgPSBuaWxmc19ibWFwX2xhc3Rfa2V5KGlpLT5pX2JtYXAsICZiKTsKIAlpZiAocmV0ID09IC1FTk9FTlQpCiAJCXJldHVybjsKQEAgLTY0NiwxNCArNjQwLDEwIEBACiAJCSAgICAgbmlsZnNfYm1hcF90cnVuY2F0ZShpaS0+aV9ibWFwLCBiKSA9PSAwKSkKIAkJZ290byByZXBlYXQ7CiAKLSBmYWlsZWQ6Ci0JaWYgKHJldCA9PSAtRUlOVkFMKQotCQluaWxmc19lcnJvcihpaS0+dmZzX2lub2RlLmlfc2IsIF9fZnVuY19fLAotCQkJICAgICJibWFwIGlzIGJyb2tlbiAoaW5vPSVsdSkiLCBpaS0+dmZzX2lub2RlLmlfaW5vKTsKLQllbHNlCi0JCW5pbGZzX3dhcm5pbmcoaWktPnZmc19pbm9kZS5pX3NiLCBfX2Z1bmNfXywKLQkJCSAgICAgICJmYWlsZWQgdG8gdHJ1bmNhdGUgYm1hcCAoaW5vPSVsdSwgZXJyPSVkKSIsCi0JCQkgICAgICBpaS0+dmZzX2lub2RlLmlfaW5vLCByZXQpOworZmFpbGVkOgorCW5pbGZzX3dhcm5pbmcoaWktPnZmc19pbm9kZS5pX3NiLCBfX2Z1bmNfXywKKwkJICAgICAgImZhaWxlZCB0byB0cnVuY2F0ZSBibWFwIChpbm89JWx1LCBlcnI9JWQpIiwKKwkJICAgICAgaWktPnZmc19pbm9kZS5pX2lubywgcmV0KTsKIH0KIAogdm9pZCBuaWxmc190cnVuY2F0ZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQpAQCAtNjgyLDcgKzY3Miw3IEBACiAJCW5pbGZzX3NldF90cmFuc2FjdGlvbl9mbGFnKE5JTEZTX1RJX1NZTkMpOwogCiAJbmlsZnNfbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7Ci0JbmlsZnNfc2V0X2ZpbGVfZGlydHkoTklMRlNfU0Ioc2IpLCBpbm9kZSwgMCk7CisJbmlsZnNfc2V0X2ZpbGVfZGlydHkoaW5vZGUsIDApOwogCW5pbGZzX3RyYW5zYWN0aW9uX2NvbW1pdChzYik7CiAJLyogTWF5IGNvbnN0cnVjdCBhIGxvZ2ljYWwgc2VnbWVudCBhbmQgbWF5IGZhaWwgaW4gc3luYyBtb2RlLgogCSAgIEJ1dCB0cnVuY2F0ZSBoYXMgbm8gcmV0dXJuIHZhbHVlLiAqLwpAQCAtODAwLDkgKzc5MCw5IEBACiAJcmV0dXJuIGdlbmVyaWNfcGVybWlzc2lvbihpbm9kZSwgbWFzaywgZmxhZ3MsIE5VTEwpOwogfQogCi1pbnQgbmlsZnNfbG9hZF9pbm9kZV9ibG9jayhzdHJ1Y3QgbmlsZnNfc2JfaW5mbyAqc2JpLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAotCQkJICAgc3RydWN0IGJ1ZmZlcl9oZWFkICoqcGJoKQoraW50IG5pbGZzX2xvYWRfaW5vZGVfYmxvY2soc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGJ1ZmZlcl9oZWFkICoqcGJoKQogeworCXN0cnVjdCBuaWxmc19zYl9pbmZvICpzYmkgPSBOSUxGU19TQihpbm9kZS0+aV9zYik7CiAJc3RydWN0IG5pbGZzX2lub2RlX2luZm8gKmlpID0gTklMRlNfSShpbm9kZSk7CiAJaW50IGVycjsKIApAQCAtODQzLDkgKzgzMyw5IEBACiAJcmV0dXJuIHJldDsKIH0KIAotaW50IG5pbGZzX3NldF9maWxlX2RpcnR5KHN0cnVjdCBuaWxmc19zYl9pbmZvICpzYmksIHN0cnVjdCBpbm9kZSAqaW5vZGUsCi0JCQkgdW5zaWduZWQgbnJfZGlydHkpCitpbnQgbmlsZnNfc2V0X2ZpbGVfZGlydHkoc3RydWN0IGlub2RlICppbm9kZSwgdW5zaWduZWQgbnJfZGlydHkpCiB7CisJc3RydWN0IG5pbGZzX3NiX2luZm8gKnNiaSA9IE5JTEZTX1NCKGlub2RlLT5pX3NiKTsKIAlzdHJ1Y3QgbmlsZnNfaW5vZGVfaW5mbyAqaWkgPSBOSUxGU19JKGlub2RlKTsKIAogCWF0b21pY19hZGQobnJfZGlydHksICZzYmktPnNfbmlsZnMtPm5zX25kaXJ0eWJsa3MpOwpAQCAtODc4LDExICs4NjgsMTAgQEAKIAogaW50IG5pbGZzX21hcmtfaW5vZGVfZGlydHkoc3RydWN0IGlub2RlICppbm9kZSkKIHsKLQlzdHJ1Y3QgbmlsZnNfc2JfaW5mbyAqc2JpID0gTklMRlNfU0IoaW5vZGUtPmlfc2IpOwogCXN0cnVjdCBidWZmZXJfaGVhZCAqaWJoOwogCWludCBlcnI7CiAKLQllcnIgPSBuaWxmc19sb2FkX2lub2RlX2Jsb2NrKHNiaSwgaW5vZGUsICZpYmgpOworCWVyciA9IG5pbGZzX2xvYWRfaW5vZGVfYmxvY2soaW5vZGUsICZpYmgpOwogCWlmICh1bmxpa2VseShlcnIpKSB7CiAJCW5pbGZzX3dhcm5pbmcoaW5vZGUtPmlfc2IsIF9fZnVuY19fLAogCQkJICAgICAgImZhaWxlZCB0byByZWdldCBpbm9kZSBibG9jay5cbiIpOwpAQCAtOTI0LDMgKzkxMywxMzQgQEAKIAluaWxmc19tYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKIAluaWxmc190cmFuc2FjdGlvbl9jb21taXQoaW5vZGUtPmlfc2IpOyAvKiBuZXZlciBmYWlscyAqLwogfQorCitpbnQgbmlsZnNfZmllbWFwKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWVtYXBfZXh0ZW50X2luZm8gKmZpZWluZm8sCisJCSBfX3U2NCBzdGFydCwgX191NjQgbGVuKQoreworCXN0cnVjdCB0aGVfbmlsZnMgKm5pbGZzID0gTklMRlNfSV9OSUxGUyhpbm9kZSk7CisJX191NjQgbG9naWNhbCA9IDAsIHBoeXMgPSAwLCBzaXplID0gMDsKKwlfX3UzMiBmbGFncyA9IDA7CisJbG9mZl90IGlzaXplOworCXNlY3Rvcl90IGJsa29mZiwgZW5kX2Jsa29mZjsKKwlzZWN0b3JfdCBkZWxhbGxvY19ibGtvZmY7CisJdW5zaWduZWQgbG9uZyBkZWxhbGxvY19ibGtsZW47CisJdW5zaWduZWQgaW50IGJsa2JpdHMgPSBpbm9kZS0+aV9ibGtiaXRzOworCWludCByZXQsIG47CisKKwlyZXQgPSBmaWVtYXBfY2hlY2tfZmxhZ3MoZmllaW5mbywgRklFTUFQX0ZMQUdfU1lOQyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCW11dGV4X2xvY2soJmlub2RlLT5pX211dGV4KTsKKworCWlzaXplID0gaV9zaXplX3JlYWQoaW5vZGUpOworCisJYmxrb2ZmID0gc3RhcnQgPj4gYmxrYml0czsKKwllbmRfYmxrb2ZmID0gKHN0YXJ0ICsgbGVuIC0gMSkgPj4gYmxrYml0czsKKworCWRlbGFsbG9jX2Jsa2xlbiA9IG5pbGZzX2ZpbmRfdW5jb21taXR0ZWRfZXh0ZW50KGlub2RlLCBibGtvZmYsCisJCQkJCQkJJmRlbGFsbG9jX2Jsa29mZik7CisKKwlkbyB7CisJCV9fdTY0IGJsa3BoeTsKKwkJdW5zaWduZWQgaW50IG1heGJsb2NrczsKKworCQlpZiAoZGVsYWxsb2NfYmxrbGVuICYmIGJsa29mZiA9PSBkZWxhbGxvY19ibGtvZmYpIHsKKwkJCWlmIChzaXplKSB7CisJCQkJLyogRW5kIG9mIHRoZSBjdXJyZW50IGV4dGVudCAqLworCQkJCXJldCA9IGZpZW1hcF9maWxsX25leHRfZXh0ZW50KAorCQkJCQlmaWVpbmZvLCBsb2dpY2FsLCBwaHlzLCBzaXplLCBmbGFncyk7CisJCQkJaWYgKHJldCkKKwkJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoYmxrb2ZmID4gZW5kX2Jsa29mZikKKwkJCQlicmVhazsKKworCQkJZmxhZ3MgPSBGSUVNQVBfRVhURU5UX01FUkdFRCB8IEZJRU1BUF9FWFRFTlRfREVMQUxMT0M7CisJCQlsb2dpY2FsID0gYmxrb2ZmIDw8IGJsa2JpdHM7CisJCQlwaHlzID0gMDsKKwkJCXNpemUgPSBkZWxhbGxvY19ibGtsZW4gPDwgYmxrYml0czsKKworCQkJYmxrb2ZmID0gZGVsYWxsb2NfYmxrb2ZmICsgZGVsYWxsb2NfYmxrbGVuOworCQkJZGVsYWxsb2NfYmxrbGVuID0gbmlsZnNfZmluZF91bmNvbW1pdHRlZF9leHRlbnQoCisJCQkJaW5vZGUsIGJsa29mZiwgJmRlbGFsbG9jX2Jsa29mZik7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qCisJCSAqIExpbWl0IHRoZSBudW1iZXIgb2YgYmxvY2tzIHRoYXQgd2UgbG9vayB1cCBzbyBhcworCQkgKiBub3QgdG8gZ2V0IGludG8gdGhlIG5leHQgZGVsYXllZCBhbGxvY2F0aW9uIGV4dGVudC4KKwkJICovCisJCW1heGJsb2NrcyA9IElOVF9NQVg7CisJCWlmIChkZWxhbGxvY19ibGtsZW4pCisJCQltYXhibG9ja3MgPSBtaW5fdChzZWN0b3JfdCwgZGVsYWxsb2NfYmxrb2ZmIC0gYmxrb2ZmLAorCQkJCQkgIG1heGJsb2Nrcyk7CisJCWJsa3BoeSA9IDA7CisKKwkJZG93bl9yZWFkKCZOSUxGU19NRFQobmlsZnMtPm5zX2RhdCktPm1pX3NlbSk7CisJCW4gPSBuaWxmc19ibWFwX2xvb2t1cF9jb250aWcoCisJCQlOSUxGU19JKGlub2RlKS0+aV9ibWFwLCBibGtvZmYsICZibGtwaHksIG1heGJsb2Nrcyk7CisJCXVwX3JlYWQoJk5JTEZTX01EVChuaWxmcy0+bnNfZGF0KS0+bWlfc2VtKTsKKworCQlpZiAobiA8IDApIHsKKwkJCWludCBwYXN0X2VvZjsKKworCQkJaWYgKHVubGlrZWx5KG4gIT0gLUVOT0VOVCkpCisJCQkJYnJlYWs7IC8qIGVycm9yICovCisKKwkJCS8qIEhPTEUgKi8KKwkJCWJsa29mZisrOworCQkJcGFzdF9lb2YgPSAoKGJsa29mZiA8PCBibGtiaXRzKSA+PSBpc2l6ZSk7CisKKwkJCWlmIChzaXplKSB7CisJCQkJLyogRW5kIG9mIHRoZSBjdXJyZW50IGV4dGVudCAqLworCisJCQkJaWYgKHBhc3RfZW9mKQorCQkJCQlmbGFncyB8PSBGSUVNQVBfRVhURU5UX0xBU1Q7CisKKwkJCQlyZXQgPSBmaWVtYXBfZmlsbF9uZXh0X2V4dGVudCgKKwkJCQkJZmllaW5mbywgbG9naWNhbCwgcGh5cywgc2l6ZSwgZmxhZ3MpOworCQkJCWlmIChyZXQpCisJCQkJCWJyZWFrOworCQkJCXNpemUgPSAwOworCQkJfQorCQkJaWYgKGJsa29mZiA+IGVuZF9ibGtvZmYgfHwgcGFzdF9lb2YpCisJCQkJYnJlYWs7CisJCX0gZWxzZSB7CisJCQlpZiAoc2l6ZSkgeworCQkJCWlmIChwaHlzICYmIGJsa3BoeSA8PCBibGtiaXRzID09IHBoeXMgKyBzaXplKSB7CisJCQkJCS8qIFRoZSBjdXJyZW50IGV4dGVudCBnb2VzIG9uICovCisJCQkJCXNpemUgKz0gbiA8PCBibGtiaXRzOworCQkJCX0gZWxzZSB7CisJCQkJCS8qIFRlcm1pbmF0ZSB0aGUgY3VycmVudCBleHRlbnQgKi8KKwkJCQkJcmV0ID0gZmllbWFwX2ZpbGxfbmV4dF9leHRlbnQoCisJCQkJCQlmaWVpbmZvLCBsb2dpY2FsLCBwaHlzLCBzaXplLAorCQkJCQkJZmxhZ3MpOworCQkJCQlpZiAocmV0IHx8IGJsa29mZiA+IGVuZF9ibGtvZmYpCisJCQkJCQlicmVhazsKKworCQkJCQkvKiBTdGFydCBhbm90aGVyIGV4dGVudCAqLworCQkJCQlmbGFncyA9IEZJRU1BUF9FWFRFTlRfTUVSR0VEOworCQkJCQlsb2dpY2FsID0gYmxrb2ZmIDw8IGJsa2JpdHM7CisJCQkJCXBoeXMgPSBibGtwaHkgPDwgYmxrYml0czsKKwkJCQkJc2l6ZSA9IG4gPDwgYmxrYml0czsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCS8qIFN0YXJ0IGEgbmV3IGV4dGVudCAqLworCQkJCWZsYWdzID0gRklFTUFQX0VYVEVOVF9NRVJHRUQ7CisJCQkJbG9naWNhbCA9IGJsa29mZiA8PCBibGtiaXRzOworCQkJCXBoeXMgPSBibGtwaHkgPDwgYmxrYml0czsKKwkJCQlzaXplID0gbiA8PCBibGtiaXRzOworCQkJfQorCQkJYmxrb2ZmICs9IG47CisJCX0KKwkJY29uZF9yZXNjaGVkKCk7CisJfSB3aGlsZSAodHJ1ZSk7CisKKwkvKiBJZiByZXQgaXMgMSB0aGVuIHdlIGp1c3QgaGl0IHRoZSBlbmQgb2YgdGhlIGV4dGVudCBhcnJheSAqLworCWlmIChyZXQgPT0gMSkKKwkJcmV0ID0gMDsKKworCW11dGV4X3VubG9jaygmaW5vZGUtPmlfbXV0ZXgpOworCXJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9mcy9uaWxmczIvaW9jdGwuYyBiL2ZzL25pbGZzMi9pb2N0bC5jCmluZGV4IGIxODVlOTMuLjQ5NjczODkgMTAwNjQ0Ci0tLSBhL2ZzL25pbGZzMi9pb2N0bC5jCisrKyBiL2ZzL25pbGZzMi9pb2N0bC5jCkBAIC0yMzMsNyArMjMzLDcgQEAKIAlpbnQgcmV0OwogCiAJZG93bl9yZWFkKCZuaWxmcy0+bnNfc2VnY3Rvcl9zZW0pOwotCXJldCA9IG5pbGZzX2RhdF9nZXRfdmluZm8obmlsZnNfZGF0X2lub2RlKG5pbGZzKSwgYnVmLCBzaXplLCBubWVtYnMpOworCXJldCA9IG5pbGZzX2RhdF9nZXRfdmluZm8obmlsZnMtPm5zX2RhdCwgYnVmLCBzaXplLCBubWVtYnMpOwogCXVwX3JlYWQoJm5pbGZzLT5uc19zZWdjdG9yX3NlbSk7CiAJcmV0dXJuIHJldDsKIH0KQEAgLTI0Miw4ICsyNDIsNyBAQAogbmlsZnNfaW9jdGxfZG9fZ2V0X2JkZXNjcyhzdHJ1Y3QgdGhlX25pbGZzICpuaWxmcywgX191NjQgKnBvc3AsIGludCBmbGFncywKIAkJCSAgdm9pZCAqYnVmLCBzaXplX3Qgc2l6ZSwgc2l6ZV90IG5tZW1icykKIHsKLQlzdHJ1Y3QgaW5vZGUgKmRhdCA9IG5pbGZzX2RhdF9pbm9kZShuaWxmcyk7Ci0Jc3RydWN0IG5pbGZzX2JtYXAgKmJtYXAgPSBOSUxGU19JKGRhdCktPmlfYm1hcDsKKwlzdHJ1Y3QgbmlsZnNfYm1hcCAqYm1hcCA9IE5JTEZTX0kobmlsZnMtPm5zX2RhdCktPmlfYm1hcDsKIAlzdHJ1Y3QgbmlsZnNfYmRlc2MgKmJkZXNjcyA9IGJ1ZjsKIAlpbnQgcmV0LCBpOwogCkBAIC00MjEsNyArNDIwLDcgQEAKIAlzaXplX3Qgbm1lbWJzID0gYXJndi0+dl9ubWVtYnM7CiAJaW50IHJldDsKIAotCXJldCA9IG5pbGZzX2RhdF9mcmVldihuaWxmc19kYXRfaW5vZGUobmlsZnMpLCBidWYsIG5tZW1icyk7CisJcmV0ID0gbmlsZnNfZGF0X2ZyZWV2KG5pbGZzLT5uc19kYXQsIGJ1Ziwgbm1lbWJzKTsKIAogCXJldHVybiAocmV0IDwgMCkgPyByZXQgOiBubWVtYnM7CiB9CkBAIC00MzAsOCArNDI5LDcgQEAKIAkJCQkJIHN0cnVjdCBuaWxmc19hcmd2ICphcmd2LCB2b2lkICpidWYpCiB7CiAJc2l6ZV90IG5tZW1icyA9IGFyZ3YtPnZfbm1lbWJzOwotCXN0cnVjdCBpbm9kZSAqZGF0ID0gbmlsZnNfZGF0X2lub2RlKG5pbGZzKTsKLQlzdHJ1Y3QgbmlsZnNfYm1hcCAqYm1hcCA9IE5JTEZTX0koZGF0KS0+aV9ibWFwOworCXN0cnVjdCBuaWxmc19ibWFwICpibWFwID0gTklMRlNfSShuaWxmcy0+bnNfZGF0KS0+aV9ibWFwOwogCXN0cnVjdCBuaWxmc19iZGVzYyAqYmRlc2NzID0gYnVmOwogCWludCByZXQsIGk7CiAKQEAgLTQ1MCw3ICs0NDgsNyBAQAogCQkJLyogc2tpcCBkZWFkIGJsb2NrICovCiAJCQljb250aW51ZTsKIAkJaWYgKGJkZXNjc1tpXS5iZF9sZXZlbCA9PSAwKSB7Ci0JCQlyZXQgPSBuaWxmc19tZHRfbWFya19ibG9ja19kaXJ0eShkYXQsCisJCQlyZXQgPSBuaWxmc19tZHRfbWFya19ibG9ja19kaXJ0eShuaWxmcy0+bnNfZGF0LAogCQkJCQkJCSBiZGVzY3NbaV0uYmRfb2Zmc2V0KTsKIAkJCWlmIChyZXQgPCAwKSB7CiAJCQkJV0FSTl9PTihyZXQgPT0gLUVOT0VOVCk7CmRpZmYgLS1naXQgYS9mcy9uaWxmczIvbWR0LmMgYi9mcy9uaWxmczIvbWR0LmMKaW5kZXggMzlhNWI4NC4uNmEwZTJhMSAxMDA2NDQKLS0tIGEvZnMvbmlsZnMyL21kdC5jCisrKyBiL2ZzL25pbGZzMi9tZHQuYwpAQCAtMjM3LDggKzIzNyw2IEBACiAgKgogICogJS1FTk9FTlQgLSB0aGUgc3BlY2lmaWVkIGJsb2NrIGRvZXMgbm90IGV4aXN0IChob2xlIGJsb2NrKQogICoKLSAqICUtRUlOVkFMIC0gYm1hcCBpcyBicm9rZW4uICh0aGUgY2FsbGVyIHNob3VsZCBjYWxsIG5pbGZzX2Vycm9yKCkpCi0gKgogICogJS1FUk9GUyAtIFJlYWQgb25seSBmaWxlc3lzdGVtIChmb3IgY3JlYXRlIG1vZGUpCiAgKi8KIGludCBuaWxmc19tZHRfZ2V0X2Jsb2NrKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHVuc2lnbmVkIGxvbmcgYmxrb2ZmLCBpbnQgY3JlYXRlLApAQCAtMjczLDggKzI3MSw2IEBACiAgKiAlLUVOT01FTSAtIEluc3VmZmljaWVudCBtZW1vcnkgYXZhaWxhYmxlLgogICoKICAqICUtRUlPIC0gSS9PIGVycm9yCi0gKgotICogJS1FSU5WQUwgLSBibWFwIGlzIGJyb2tlbi4gKHRoZSBjYWxsZXIgc2hvdWxkIGNhbGwgbmlsZnNfZXJyb3IoKSkKICAqLwogaW50IG5pbGZzX21kdF9kZWxldGVfYmxvY2soc3RydWN0IGlub2RlICppbm9kZSwgdW5zaWduZWQgbG9uZyBibG9jaykKIHsKQEAgLTM1MCw4ICszNDYsNiBAQAogICogJS1FSU8gLSBJL08gZXJyb3IKICAqCiAgKiAlLUVOT0VOVCAtIHRoZSBzcGVjaWZpZWQgYmxvY2sgZG9lcyBub3QgZXhpc3QgKGhvbGUgYmxvY2spCi0gKgotICogJS1FSU5WQUwgLSBibWFwIGlzIGJyb2tlbi4gKHRoZSBjYWxsZXIgc2hvdWxkIGNhbGwgbmlsZnNfZXJyb3IoKSkKICAqLwogaW50IG5pbGZzX21kdF9tYXJrX2Jsb2NrX2RpcnR5KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHVuc2lnbmVkIGxvbmcgYmxvY2spCiB7CkBAIC00OTksMzEgKzQ5MywyOSBAQAogCXN0cnVjdCBidWZmZXJfaGVhZCAqYmhfZnJvemVuOwogCXN0cnVjdCBwYWdlICpwYWdlOwogCWludCBibGtiaXRzID0gaW5vZGUtPmlfYmxrYml0czsKLQlpbnQgcmV0ID0gLUVOT01FTTsKIAogCXBhZ2UgPSBncmFiX2NhY2hlX3BhZ2UoJnNoYWRvdy0+ZnJvemVuX2RhdGEsIGJoLT5iX3BhZ2UtPmluZGV4KTsKIAlpZiAoIXBhZ2UpCi0JCXJldHVybiByZXQ7CisJCXJldHVybiAtRU5PTUVNOwogCiAJaWYgKCFwYWdlX2hhc19idWZmZXJzKHBhZ2UpKQogCQljcmVhdGVfZW1wdHlfYnVmZmVycyhwYWdlLCAxIDw8IGJsa2JpdHMsIDApOwogCiAJYmhfZnJvemVuID0gbmlsZnNfcGFnZV9nZXRfbnRoX2Jsb2NrKHBhZ2UsIGJoX29mZnNldChiaCkgPj4gYmxrYml0cyk7Ci0JaWYgKGJoX2Zyb3plbikgewotCQlpZiAoIWJ1ZmZlcl91cHRvZGF0ZShiaF9mcm96ZW4pKQotCQkJbmlsZnNfY29weV9idWZmZXIoYmhfZnJvemVuLCBiaCk7Ci0JCWlmIChsaXN0X2VtcHR5KCZiaF9mcm96ZW4tPmJfYXNzb2NfYnVmZmVycykpIHsKLQkJCWxpc3RfYWRkX3RhaWwoJmJoX2Zyb3plbi0+Yl9hc3NvY19idWZmZXJzLAotCQkJCSAgICAgICZzaGFkb3ctPmZyb3plbl9idWZmZXJzKTsKLQkJCXNldF9idWZmZXJfbmlsZnNfcmVkaXJlY3RlZChiaCk7Ci0JCX0gZWxzZSB7Ci0JCQlicmVsc2UoYmhfZnJvemVuKTsgLyogYWxyZWFkeSBmcm96ZW4gKi8KLQkJfQotCQlyZXQgPSAwOworCisJaWYgKCFidWZmZXJfdXB0b2RhdGUoYmhfZnJvemVuKSkKKwkJbmlsZnNfY29weV9idWZmZXIoYmhfZnJvemVuLCBiaCk7CisJaWYgKGxpc3RfZW1wdHkoJmJoX2Zyb3plbi0+Yl9hc3NvY19idWZmZXJzKSkgeworCQlsaXN0X2FkZF90YWlsKCZiaF9mcm96ZW4tPmJfYXNzb2NfYnVmZmVycywKKwkJCSAgICAgICZzaGFkb3ctPmZyb3plbl9idWZmZXJzKTsKKwkJc2V0X2J1ZmZlcl9uaWxmc19yZWRpcmVjdGVkKGJoKTsKKwl9IGVsc2UgeworCQlicmVsc2UoYmhfZnJvemVuKTsgLyogYWxyZWFkeSBmcm96ZW4gKi8KIAl9CisKIAl1bmxvY2tfcGFnZShwYWdlKTsKIAlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7Ci0JcmV0dXJuIHJldDsKKwlyZXR1cm4gMDsKIH0KIAogc3RydWN0IGJ1ZmZlcl9oZWFkICoKZGlmZiAtLWdpdCBhL2ZzL25pbGZzMi9uYW1laS5jIGIvZnMvbmlsZnMyL25hbWVpLmMKaW5kZXggNmU5NTU3ZS4uOTgwMzQyNyAxMDA2NDQKLS0tIGEvZnMvbmlsZnMyL25hbWVpLmMKKysrIGIvZnMvbmlsZnMyL25hbWVpLmMKQEAgLTU3Nyw2ICs1NzcsNyBAQAogCS5yZW5hbWUJCT0gbmlsZnNfcmVuYW1lLAogCS5zZXRhdHRyCT0gbmlsZnNfc2V0YXR0ciwKIAkucGVybWlzc2lvbgk9IG5pbGZzX3Blcm1pc3Npb24sCisJLmZpZW1hcAkJPSBuaWxmc19maWVtYXAsCiB9OwogCiBjb25zdCBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBuaWxmc19zcGVjaWFsX2lub2RlX29wZXJhdGlvbnMgPSB7CmRpZmYgLS1naXQgYS9mcy9uaWxmczIvbmlsZnMuaCBiL2ZzL25pbGZzMi9uaWxmcy5oCmluZGV4IDBjYTk4ODIuLjc3N2U4ZmQgMTAwNjQ0Ci0tLSBhL2ZzL25pbGZzMi9uaWxmcy5oCisrKyBiL2ZzL25pbGZzMi9uaWxmcy5oCkBAIC0xOTAsMTEgKzE5MCw2IEBACiAJcmV0dXJuIG5pbGZzX3Rlc3RfdHJhbnNhY3Rpb25fZmxhZyhOSUxGU19USV9XUklURVIpOwogfQogCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBpbm9kZSAqbmlsZnNfZGF0X2lub2RlKGNvbnN0IHN0cnVjdCB0aGVfbmlsZnMgKm5pbGZzKQotewotCXJldHVybiBuaWxmcy0+bnNfZGF0OwotfQotCiAvKgogICogZnVuY3Rpb24gcHJvdG90eXBlCiAgKi8KQEAgLTI1NywxMyArMjUyLDEzIEBACiBleHRlcm4gdm9pZCBuaWxmc19ldmljdF9pbm9kZShzdHJ1Y3QgaW5vZGUgKik7CiBleHRlcm4gaW50IG5pbGZzX3NldGF0dHIoc3RydWN0IGRlbnRyeSAqLCBzdHJ1Y3QgaWF0dHIgKik7CiBpbnQgbmlsZnNfcGVybWlzc2lvbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgbWFzaywgdW5zaWduZWQgaW50IGZsYWdzKTsKLWV4dGVybiBpbnQgbmlsZnNfbG9hZF9pbm9kZV9ibG9jayhzdHJ1Y3QgbmlsZnNfc2JfaW5mbyAqLCBzdHJ1Y3QgaW5vZGUgKiwKLQkJCQkgIHN0cnVjdCBidWZmZXJfaGVhZCAqKik7CitpbnQgbmlsZnNfbG9hZF9pbm9kZV9ibG9jayhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKipwYmgpOwogZXh0ZXJuIGludCBuaWxmc19pbm9kZV9kaXJ0eShzdHJ1Y3QgaW5vZGUgKik7Ci1leHRlcm4gaW50IG5pbGZzX3NldF9maWxlX2RpcnR5KHN0cnVjdCBuaWxmc19zYl9pbmZvICosIHN0cnVjdCBpbm9kZSAqLAotCQkJCXVuc2lnbmVkKTsKK2ludCBuaWxmc19zZXRfZmlsZV9kaXJ0eShzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1bnNpZ25lZCBucl9kaXJ0eSk7CiBleHRlcm4gaW50IG5pbGZzX21hcmtfaW5vZGVfZGlydHkoc3RydWN0IGlub2RlICopOwogZXh0ZXJuIHZvaWQgbmlsZnNfZGlydHlfaW5vZGUoc3RydWN0IGlub2RlICopOworaW50IG5pbGZzX2ZpZW1hcChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmllbWFwX2V4dGVudF9pbmZvICpmaWVpbmZvLAorCQkgX191NjQgc3RhcnQsIF9fdTY0IGxlbik7CiAKIC8qIHN1cGVyLmMgKi8KIGV4dGVybiBzdHJ1Y3QgaW5vZGUgKm5pbGZzX2FsbG9jX2lub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqKTsKZGlmZiAtLWdpdCBhL2ZzL25pbGZzMi9wYWdlLmMgYi9mcy9uaWxmczIvcGFnZS5jCmluZGV4IGE2YzNjMmU4Li4wYzQzMjQxIDEwMDY0NAotLS0gYS9mcy9uaWxmczIvcGFnZS5jCisrKyBiL2ZzL25pbGZzMi9wYWdlLmMKQEAgLTQ5MSw3ICs0OTEsNyBAQAogCX0KIAlyZXR1cm4gbmM7CiB9Ci0gCisKIHZvaWQgbmlsZnNfbWFwcGluZ19pbml0X29uY2Uoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcpCiB7CiAJbWVtc2V0KG1hcHBpbmcsIDAsIHNpemVvZigqbWFwcGluZykpOwpAQCAtNTQ2LDMgKzU0Niw4NyBAQAogCX0KIAlyZXR1cm4gVGVzdENsZWFyUGFnZURpcnR5KHBhZ2UpOwogfQorCisvKioKKyAqIG5pbGZzX2ZpbmRfdW5jb21taXR0ZWRfZXh0ZW50IC0gZmluZCBleHRlbnQgb2YgdW5jb21taXR0ZWQgZGF0YQorICogQGlub2RlOiBpbm9kZQorICogQHN0YXJ0X2Jsazogc3RhcnQgYmxvY2sgb2Zmc2V0IChpbikKKyAqIEBibGtvZmY6IHN0YXJ0IG9mZnNldCBvZiB0aGUgZm91bmQgZXh0ZW50IChvdXQpCisgKgorICogVGhpcyBmdW5jdGlvbiBzZWFyY2hlcyBhbiBleHRlbnQgb2YgYnVmZmVycyBtYXJrZWQgImRlbGF5ZWQiIHdoaWNoCisgKiBzdGFydHMgZnJvbSBhIGJsb2NrIG9mZnNldCBlcXVhbCB0byBvciBsYXJnZXIgdGhhbiBAc3RhcnRfYmxrLiAgSWYKKyAqIHN1Y2ggYW4gZXh0ZW50IHdhcyBmb3VuZCwgdGhpcyB3aWxsIHN0b3JlIHRoZSBzdGFydCBvZmZzZXQgaW4KKyAqIEBibGtvZmYgYW5kIHJldHVybiBpdHMgbGVuZ3RoIGluIGJsb2Nrcy4gIE90aGVyd2lzZSwgemVybyBpcworICogcmV0dXJuZWQuCisgKi8KK3Vuc2lnbmVkIGxvbmcgbmlsZnNfZmluZF91bmNvbW1pdHRlZF9leHRlbnQoc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQkJICAgIHNlY3Rvcl90IHN0YXJ0X2JsaywKKwkJCQkJICAgIHNlY3Rvcl90ICpibGtvZmYpCit7CisJdW5zaWduZWQgaW50IGk7CisJcGdvZmZfdCBpbmRleDsKKwl1bnNpZ25lZCBpbnQgbmJsb2Nrc19pbl9wYWdlOworCXVuc2lnbmVkIGxvbmcgbGVuZ3RoID0gMDsKKwlzZWN0b3JfdCBiOworCXN0cnVjdCBwYWdldmVjIHB2ZWM7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisKKwlpZiAoaW5vZGUtPmlfbWFwcGluZy0+bnJwYWdlcyA9PSAwKQorCQlyZXR1cm4gMDsKKworCWluZGV4ID0gc3RhcnRfYmxrID4+IChQQUdFX0NBQ0hFX1NISUZUIC0gaW5vZGUtPmlfYmxrYml0cyk7CisJbmJsb2Nrc19pbl9wYWdlID0gMVUgPDwgKFBBR0VfQ0FDSEVfU0hJRlQgLSBpbm9kZS0+aV9ibGtiaXRzKTsKKworCXBhZ2V2ZWNfaW5pdCgmcHZlYywgMCk7CisKK3JlcGVhdDoKKwlwdmVjLm5yID0gZmluZF9nZXRfcGFnZXNfY29udGlnKGlub2RlLT5pX21hcHBpbmcsIGluZGV4LCBQQUdFVkVDX1NJWkUsCisJCQkJCXB2ZWMucGFnZXMpOworCWlmIChwdmVjLm5yID09IDApCisJCXJldHVybiBsZW5ndGg7CisKKwlpZiAobGVuZ3RoID4gMCAmJiBwdmVjLnBhZ2VzWzBdLT5pbmRleCA+IGluZGV4KQorCQlnb3RvIG91dDsKKworCWIgPSBwdmVjLnBhZ2VzWzBdLT5pbmRleCA8PCAoUEFHRV9DQUNIRV9TSElGVCAtIGlub2RlLT5pX2Jsa2JpdHMpOworCWkgPSAwOworCWRvIHsKKwkJcGFnZSA9IHB2ZWMucGFnZXNbaV07CisKKwkJbG9ja19wYWdlKHBhZ2UpOworCQlpZiAocGFnZV9oYXNfYnVmZmVycyhwYWdlKSkgeworCQkJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwgKmhlYWQ7CisKKwkJCWJoID0gaGVhZCA9IHBhZ2VfYnVmZmVycyhwYWdlKTsKKwkJCWRvIHsKKwkJCQlpZiAoYiA8IHN0YXJ0X2JsaykKKwkJCQkJY29udGludWU7CisJCQkJaWYgKGJ1ZmZlcl9kZWxheShiaCkpIHsKKwkJCQkJaWYgKGxlbmd0aCA9PSAwKQorCQkJCQkJKmJsa29mZiA9IGI7CisJCQkJCWxlbmd0aCsrOworCQkJCX0gZWxzZSBpZiAobGVuZ3RoID4gMCkgeworCQkJCQlnb3RvIG91dF9sb2NrZWQ7CisJCQkJfQorCQkJfSB3aGlsZSAoKytiLCBiaCA9IGJoLT5iX3RoaXNfcGFnZSwgYmggIT0gaGVhZCk7CisJCX0gZWxzZSB7CisJCQlpZiAobGVuZ3RoID4gMCkKKwkJCQlnb3RvIG91dF9sb2NrZWQ7CisKKwkJCWIgKz0gbmJsb2Nrc19pbl9wYWdlOworCQl9CisJCXVubG9ja19wYWdlKHBhZ2UpOworCisJfSB3aGlsZSAoKytpIDwgcGFnZXZlY19jb3VudCgmcHZlYykpOworCisJaW5kZXggPSBwYWdlLT5pbmRleCArIDE7CisJcGFnZXZlY19yZWxlYXNlKCZwdmVjKTsKKwljb25kX3Jlc2NoZWQoKTsKKwlnb3RvIHJlcGVhdDsKKworb3V0X2xvY2tlZDoKKwl1bmxvY2tfcGFnZShwYWdlKTsKK291dDoKKwlwYWdldmVjX3JlbGVhc2UoJnB2ZWMpOworCXJldHVybiBsZW5ndGg7Cit9CmRpZmYgLS1naXQgYS9mcy9uaWxmczIvcGFnZS5oIGIvZnMvbmlsZnMyL3BhZ2UuaAppbmRleCBmYjllOGE4Li42MjJkZjI3IDEwMDY0NAotLS0gYS9mcy9uaWxmczIvcGFnZS5oCisrKyBiL2ZzL25pbGZzMi9wYWdlLmgKQEAgLTY2LDYgKzY2LDkgQEAKIAkJCXN0cnVjdCBiYWNraW5nX2Rldl9pbmZvICpiZGksCiAJCQljb25zdCBzdHJ1Y3QgYWRkcmVzc19zcGFjZV9vcGVyYXRpb25zICphb3BzKTsKIHVuc2lnbmVkIG5pbGZzX3BhZ2VfY291bnRfY2xlYW5fYnVmZmVycyhzdHJ1Y3QgcGFnZSAqLCB1bnNpZ25lZCwgdW5zaWduZWQpOwordW5zaWduZWQgbG9uZyBuaWxmc19maW5kX3VuY29tbWl0dGVkX2V4dGVudChzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCQkgICAgc2VjdG9yX3Qgc3RhcnRfYmxrLAorCQkJCQkgICAgc2VjdG9yX3QgKmJsa29mZik7CiAKICNkZWZpbmUgTklMRlNfUEFHRV9CVUcocGFnZSwgbSwgYS4uLikgXAogCWRvIHsgbmlsZnNfcGFnZV9idWcocGFnZSk7IEJVRygpOyB9IHdoaWxlICgwKQpkaWZmIC0tZ2l0IGEvZnMvbmlsZnMyL3JlY292ZXJ5LmMgYi9mcy9uaWxmczIvcmVjb3ZlcnkuYwppbmRleCA1ZDI3MTFjMi4uM2RmY2QzYiAxMDA2NDQKLS0tIGEvZnMvbmlsZnMyL3JlY292ZXJ5LmMKKysrIGIvZnMvbmlsZnMyL3JlY292ZXJ5LmMKQEAgLTUzNSw3ICs1MzUsNyBAQAogCQlpZiAodW5saWtlbHkoZXJyKSkKIAkJCWdvdG8gZmFpbGVkX3BhZ2U7CiAKLQkJZXJyID0gbmlsZnNfc2V0X2ZpbGVfZGlydHkoc2JpLCBpbm9kZSwgMSk7CisJCWVyciA9IG5pbGZzX3NldF9maWxlX2RpcnR5KGlub2RlLCAxKTsKIAkJaWYgKHVubGlrZWx5KGVycikpCiAJCQlnb3RvIGZhaWxlZF9wYWdlOwogCmRpZmYgLS1naXQgYS9mcy9uaWxmczIvc2IuaCBiL2ZzL25pbGZzMi9zYi5oCmluZGV4IDM1YTA3MTUuLjdhMTc3MTUgMTAwNjQ0Ci0tLSBhL2ZzL25pbGZzMi9zYi5oCisrKyBiL2ZzL25pbGZzMi9zYi5oCkBAIC0yNywxNCArMjcsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KIAotLyoKLSAqIE1vdW50IG9wdGlvbnMKLSAqLwotc3RydWN0IG5pbGZzX21vdW50X29wdGlvbnMgewotCXVuc2lnbmVkIGxvbmcgbW91bnRfb3B0OwotCV9fdTY0IHNuYXBzaG90X2NubzsKLX07Ci0KIHN0cnVjdCB0aGVfbmlsZnM7CiBzdHJ1Y3QgbmlsZnNfc2NfaW5mbzsKIApkaWZmIC0tZ2l0IGEvZnMvbmlsZnMyL3NlZ21lbnQuYyBiL2ZzL25pbGZzMi9zZWdtZW50LmMKaW5kZXggNjg3ZDA5MC4uNTVlYmFlNSAxMDA2NDQKLS0tIGEvZnMvbmlsZnMyL3NlZ21lbnQuYworKysgYi9mcy9uaWxmczIvc2VnbWVudC5jCkBAIC01MDQsMTcgKzUwNCw2IEBACiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIGludCBuaWxmc19oYW5kbGVfYm1hcF9lcnJvcihpbnQgZXJyLCBjb25zdCBjaGFyICpmbmFtZSwKLQkJCQkgICBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQotewotCWlmIChlcnIgPT0gLUVJTlZBTCkgewotCQluaWxmc19lcnJvcihzYiwgZm5hbWUsICJicm9rZW4gYm1hcCAoaW5vZGU9JWx1KVxuIiwKLQkJCSAgICBpbm9kZS0+aV9pbm8pOwotCQllcnIgPSAtRUlPOwotCX0KLQlyZXR1cm4gZXJyOwotfQotCiAvKgogICogQ2FsbGJhY2sgZnVuY3Rpb25zIHRoYXQgZW51bWVyYXRlLCBtYXJrLCBhbmQgY29sbGVjdCBkaXJ0eSBibG9ja3MKICAqLwpAQCAtNTI0LDkgKzUxMyw4IEBACiAJaW50IGVycjsKIAogCWVyciA9IG5pbGZzX2JtYXBfcHJvcGFnYXRlKE5JTEZTX0koaW5vZGUpLT5pX2JtYXAsIGJoKTsKLQlpZiAodW5saWtlbHkoZXJyIDwgMCkpCi0JCXJldHVybiBuaWxmc19oYW5kbGVfYm1hcF9lcnJvcihlcnIsIF9fZnVuY19fLCBpbm9kZSwKLQkJCQkJICAgICAgIHNjaS0+c2Nfc3VwZXIpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOwogCiAJZXJyID0gbmlsZnNfc2VnY3Rvcl9hZGRfZmlsZV9ibG9jayhzY2ksIGJoLCBpbm9kZSwKIAkJCQkJICAgc2l6ZW9mKHN0cnVjdCBuaWxmc19iaW5mb192KSk7CkBAIC01MzksMTMgKzUyNyw3IEBACiAJCQkJICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwKIAkJCQkgICBzdHJ1Y3QgaW5vZGUgKmlub2RlKQogewotCWludCBlcnI7Ci0KLQllcnIgPSBuaWxmc19ibWFwX3Byb3BhZ2F0ZShOSUxGU19JKGlub2RlKS0+aV9ibWFwLCBiaCk7Ci0JaWYgKHVubGlrZWx5KGVyciA8IDApKQotCQlyZXR1cm4gbmlsZnNfaGFuZGxlX2JtYXBfZXJyb3IoZXJyLCBfX2Z1bmNfXywgaW5vZGUsCi0JCQkJCSAgICAgICBzY2ktPnNjX3N1cGVyKTsKLQlyZXR1cm4gMDsKKwlyZXR1cm4gbmlsZnNfYm1hcF9wcm9wYWdhdGUoTklMRlNfSShpbm9kZSktPmlfYm1hcCwgYmgpOwogfQogCiBzdGF0aWMgaW50IG5pbGZzX2NvbGxlY3RfZmlsZV9ibWFwKHN0cnVjdCBuaWxmc19zY19pbmZvICpzY2ksCkBAIC01ODgsOSArNTcwLDggQEAKIAlpbnQgZXJyOwogCiAJZXJyID0gbmlsZnNfYm1hcF9wcm9wYWdhdGUoTklMRlNfSShpbm9kZSktPmlfYm1hcCwgYmgpOwotCWlmICh1bmxpa2VseShlcnIgPCAwKSkKLQkJcmV0dXJuIG5pbGZzX2hhbmRsZV9ibWFwX2Vycm9yKGVyciwgX19mdW5jX18sIGlub2RlLAotCQkJCQkgICAgICAgc2NpLT5zY19zdXBlcik7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CiAKIAllcnIgPSBuaWxmc19zZWdjdG9yX2FkZF9maWxlX2Jsb2NrKHNjaSwgYmgsIGlub2RlLCBzaXplb2YoX19sZTY0KSk7CiAJaWYgKCFlcnIpCkBAIC03NzYsOSArNzU3LDggQEAKIAkJcmV0Kys7CiAJaWYgKG5pbGZzX21kdF9mZXRjaF9kaXJ0eShuaWxmcy0+bnNfc3VmaWxlKSkKIAkJcmV0Kys7Ci0JaWYgKHJldCB8fCBuaWxmc19kb2luZ19nYygpKQotCQlpZiAobmlsZnNfbWR0X2ZldGNoX2RpcnR5KG5pbGZzX2RhdF9pbm9kZShuaWxmcykpKQotCQkJcmV0Kys7CisJaWYgKChyZXQgfHwgbmlsZnNfZG9pbmdfZ2MoKSkgJiYgbmlsZnNfbWR0X2ZldGNoX2RpcnR5KG5pbGZzLT5uc19kYXQpKQorCQlyZXQrKzsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC04MTQsNyArNzk0LDcgQEAKIAluaWxmc19tZHRfY2xlYXJfZGlydHkoc2NpLT5zY19yb290LT5pZmlsZSk7CiAJbmlsZnNfbWR0X2NsZWFyX2RpcnR5KG5pbGZzLT5uc19jcGZpbGUpOwogCW5pbGZzX21kdF9jbGVhcl9kaXJ0eShuaWxmcy0+bnNfc3VmaWxlKTsKLQluaWxmc19tZHRfY2xlYXJfZGlydHkobmlsZnNfZGF0X2lub2RlKG5pbGZzKSk7CisJbmlsZnNfbWR0X2NsZWFyX2RpcnR5KG5pbGZzLT5uc19kYXQpOwogfQogCiBzdGF0aWMgaW50IG5pbGZzX3NlZ2N0b3JfY3JlYXRlX2NoZWNrcG9pbnQoc3RydWN0IG5pbGZzX3NjX2luZm8gKnNjaSkKQEAgLTkyMyw3ICs5MDMsNyBAQAogCQkJICAgICAgbmlsZnMtPm5zX25vbmdjX2N0aW1lIDogc2NpLT5zY19zZWdfY3RpbWUpOwogCXJhd19zci0+c3JfZmxhZ3MgPSAwOwogCi0JbmlsZnNfd3JpdGVfaW5vZGVfY29tbW9uKG5pbGZzX2RhdF9pbm9kZShuaWxmcyksICh2b2lkICopcmF3X3NyICsKKwluaWxmc193cml0ZV9pbm9kZV9jb21tb24obmlsZnMtPm5zX2RhdCwgKHZvaWQgKilyYXdfc3IgKwogCQkJCSBOSUxGU19TUl9EQVRfT0ZGU0VUKGlzeiksIDEpOwogCW5pbGZzX3dyaXRlX2lub2RlX2NvbW1vbihuaWxmcy0+bnNfY3BmaWxlLCAodm9pZCAqKXJhd19zciArCiAJCQkJIE5JTEZTX1NSX0NQRklMRV9PRkZTRVQoaXN6KSwgMSk7CkBAIC0xMTc5LDcgKzExNTksNyBAQAogCQlzY2ktPnNjX3N0YWdlLnNjbnQrKzsgIC8qIEZhbGwgdGhyb3VnaCAqLwogCWNhc2UgTklMRlNfU1RfREFUOgogIGRhdF9zdGFnZToKLQkJZXJyID0gbmlsZnNfc2VnY3Rvcl9zY2FuX2ZpbGUoc2NpLCBuaWxmc19kYXRfaW5vZGUobmlsZnMpLAorCQllcnIgPSBuaWxmc19zZWdjdG9yX3NjYW5fZmlsZShzY2ksIG5pbGZzLT5uc19kYXQsCiAJCQkJCSAgICAgICZuaWxmc19zY19kYXRfb3BzKTsKIAkJaWYgKHVubGlrZWx5KGVycikpCiAJCQlicmVhazsKQEAgLTE1NjMsNyArMTU0Myw2IEBACiAJcmV0dXJuIDA7CiAKICBmYWlsZWRfYm1hcDoKLQllcnIgPSBuaWxmc19oYW5kbGVfYm1hcF9lcnJvcihlcnIsIF9fZnVuY19fLCBpbm9kZSwgc2NpLT5zY19zdXBlcik7CiAJcmV0dXJuIGVycjsKIH0KIApAQCAtMTc4Myw2ICsxNzYyLDcgQEAKIAkJCQlpZiAoIWVycikgewogCQkJCQlzZXRfYnVmZmVyX3VwdG9kYXRlKGJoKTsKIAkJCQkJY2xlYXJfYnVmZmVyX2RpcnR5KGJoKTsKKwkJCQkJY2xlYXJfYnVmZmVyX2RlbGF5KGJoKTsKIAkJCQkJY2xlYXJfYnVmZmVyX25pbGZzX3ZvbGF0aWxlKGJoKTsKIAkJCQl9CiAJCQkJYnJlbHNlKGJoKTsgLyogZm9yIGJfYXNzb2NfYnVmZmVycyAqLwpAQCAtMTkwOSw2ICsxODg5LDcgQEAKIAkJCQkgICAgYl9hc3NvY19idWZmZXJzKSB7CiAJCQlzZXRfYnVmZmVyX3VwdG9kYXRlKGJoKTsKIAkJCWNsZWFyX2J1ZmZlcl9kaXJ0eShiaCk7CisJCQljbGVhcl9idWZmZXJfZGVsYXkoYmgpOwogCQkJY2xlYXJfYnVmZmVyX25pbGZzX3ZvbGF0aWxlKGJoKTsKIAkJCWNsZWFyX2J1ZmZlcl9uaWxmc19yZWRpcmVjdGVkKGJoKTsKIAkJCWlmIChiaCA9PSBzZWdidWYtPnNiX3N1cGVyX3Jvb3QpIHsKZGlmZiAtLWdpdCBhL2ZzL25pbGZzMi9zdXBlci5jIGIvZnMvbmlsZnMyL3N1cGVyLmMKaW5kZXggZTJkY2M5Yy4uNzBkZmRkNSAxMDA2NDQKLS0tIGEvZnMvbmlsZnMyL3N1cGVyLmMKKysrIGIvZnMvbmlsZnMyL3N1cGVyLmMKQEAgLTQ3LDcgKzQ3LDYgQEAKICNpbmNsdWRlIDxsaW51eC9jcmMzMi5oPgogI2luY2x1ZGUgPGxpbnV4L3Zmcy5oPgogI2luY2x1ZGUgPGxpbnV4L3dyaXRlYmFjay5oPgotI2luY2x1ZGUgPGxpbnV4L2tvYmplY3QuaD4KICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgogI2luY2x1ZGUgPGxpbnV4L21vdW50Lmg+CiAjaW5jbHVkZSAibmlsZnMuaCIKQEAgLTExMSwxMiArMTEwLDE3IEBACiAJCSBjb25zdCBjaGFyICpmbXQsIC4uLikKIHsKIAlzdHJ1Y3QgbmlsZnNfc2JfaW5mbyAqc2JpID0gTklMRlNfU0Ioc2IpOworCXN0cnVjdCB2YV9mb3JtYXQgdmFmOwogCXZhX2xpc3QgYXJnczsKIAogCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7Ci0JcHJpbnRrKEtFUk5fQ1JJVCAiTklMRlMgZXJyb3IgKGRldmljZSAlcyk6ICVzOiAiLCBzYi0+c19pZCwgZnVuY3Rpb24pOwotCXZwcmludGsoZm10LCBhcmdzKTsKLQlwcmludGsoIlxuIik7CisKKwl2YWYuZm10ID0gZm10OworCXZhZi52YSA9ICZhcmdzOworCisJcHJpbnRrKEtFUk5fQ1JJVCAiTklMRlMgZXJyb3IgKGRldmljZSAlcyk6ICVzOiAlcFZcbiIsCisJICAgICAgIHNiLT5zX2lkLCBmdW5jdGlvbiwgJnZhZik7CisKIAl2YV9lbmQoYXJncyk7CiAKIAlpZiAoIShzYi0+c19mbGFncyAmIE1TX1JET05MWSkpIHsKQEAgLTEzNiwxMyArMTQwLDE3IEBACiB2b2lkIG5pbGZzX3dhcm5pbmcoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgY29uc3QgY2hhciAqZnVuY3Rpb24sCiAJCSAgIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQogeworCXN0cnVjdCB2YV9mb3JtYXQgdmFmOwogCXZhX2xpc3QgYXJnczsKIAogCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7Ci0JcHJpbnRrKEtFUk5fV0FSTklORyAiTklMRlMgd2FybmluZyAoZGV2aWNlICVzKTogJXM6ICIsCi0JICAgICAgIHNiLT5zX2lkLCBmdW5jdGlvbik7Ci0JdnByaW50ayhmbXQsIGFyZ3MpOwotCXByaW50aygiXG4iKTsKKworCXZhZi5mbXQgPSBmbXQ7CisJdmFmLnZhID0gJmFyZ3M7CisKKwlwcmludGsoS0VSTl9XQVJOSU5HICJOSUxGUyB3YXJuaW5nIChkZXZpY2UgJXMpOiAlczogJXBWXG4iLAorCSAgICAgICBzYi0+c19pZCwgZnVuY3Rpb24sICZ2YWYpOworCiAJdmFfZW5kKGFyZ3MpOwogfQogCkBAIC0xMDEwLDExICsxMDE4LDExIEBACiAJc3RydWN0IG5pbGZzX3NiX2luZm8gKnNiaSA9IE5JTEZTX1NCKHNiKTsKIAlzdHJ1Y3QgdGhlX25pbGZzICpuaWxmcyA9IHNiaS0+c19uaWxmczsKIAl1bnNpZ25lZCBsb25nIG9sZF9zYl9mbGFnczsKLQlzdHJ1Y3QgbmlsZnNfbW91bnRfb3B0aW9ucyBvbGRfb3B0czsKKwl1bnNpZ25lZCBsb25nIG9sZF9tb3VudF9vcHQ7CiAJaW50IGVycjsKIAogCW9sZF9zYl9mbGFncyA9IHNiLT5zX2ZsYWdzOwotCW9sZF9vcHRzLm1vdW50X29wdCA9IHNiaS0+c19tb3VudF9vcHQ7CisJb2xkX21vdW50X29wdCA9IHNiaS0+c19tb3VudF9vcHQ7CiAKIAlpZiAoIXBhcnNlX29wdGlvbnMoZGF0YSwgc2IsIDEpKSB7CiAJCWVyciA9IC1FSU5WQUw7CkBAIC0xMDgzLDcgKzEwOTEsNyBAQAogCiAgcmVzdG9yZV9vcHRzOgogCXNiLT5zX2ZsYWdzID0gb2xkX3NiX2ZsYWdzOwotCXNiaS0+c19tb3VudF9vcHQgPSBvbGRfb3B0cy5tb3VudF9vcHQ7CisJc2JpLT5zX21vdW50X29wdCA9IG9sZF9tb3VudF9vcHQ7CiAJcmV0dXJuIGVycjsKIH0KIApkaWZmIC0tZ2l0IGEvZnMvbmlsZnMyL3RoZV9uaWxmcy5jIGIvZnMvbmlsZnMyL3RoZV9uaWxmcy5jCmluZGV4IDAyNTRiZTIuLmFkNGFjNjAgMTAwNjQ0Ci0tLSBhL2ZzL25pbGZzMi90aGVfbmlsZnMuYworKysgYi9mcy9uaWxmczIvdGhlX25pbGZzLmMKQEAgLTMyOSw3ICszMjksNiBAQAogCXByaW50ayhLRVJOX0lORk8gIk5JTEZTOiByZWNvdmVyeSBjb21wbGV0ZS5cbiIpOwogCiAgc2tpcF9yZWNvdmVyeToKLQlzZXRfbmlsZnNfbG9hZGVkKG5pbGZzKTsKIAluaWxmc19jbGVhcl9yZWNvdmVyeV9pbmZvKCZyaSk7CiAJc2JpLT5zX3N1cGVyLT5zX2ZsYWdzID0gc19mbGFnczsKIAlyZXR1cm4gMDsKQEAgLTY1MSwxMiArNjUwLDExIEBACiAKIGludCBuaWxmc19jb3VudF9mcmVlX2Jsb2NrcyhzdHJ1Y3QgdGhlX25pbGZzICpuaWxmcywgc2VjdG9yX3QgKm5ibG9ja3MpCiB7Ci0Jc3RydWN0IGlub2RlICpkYXQgPSBuaWxmc19kYXRfaW5vZGUobmlsZnMpOwogCXVuc2lnbmVkIGxvbmcgbmNsZWFuc2VnczsKIAotCWRvd25fcmVhZCgmTklMRlNfTURUKGRhdCktPm1pX3NlbSk7CS8qIFhYWCAqLworCWRvd25fcmVhZCgmTklMRlNfTURUKG5pbGZzLT5uc19kYXQpLT5taV9zZW0pOwogCW5jbGVhbnNlZ3MgPSBuaWxmc19zdWZpbGVfZ2V0X25jbGVhbnNlZ3MobmlsZnMtPm5zX3N1ZmlsZSk7Ci0JdXBfcmVhZCgmTklMRlNfTURUKGRhdCktPm1pX3NlbSk7CS8qIFhYWCAqLworCXVwX3JlYWQoJk5JTEZTX01EVChuaWxmcy0+bnNfZGF0KS0+bWlfc2VtKTsKIAkqbmJsb2NrcyA9IChzZWN0b3JfdCluY2xlYW5zZWdzICogbmlsZnMtPm5zX2Jsb2Nrc19wZXJfc2VnbWVudDsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2ZzL25pbGZzMi90aGVfbmlsZnMuaCBiL2ZzL25pbGZzMi90aGVfbmlsZnMuaAppbmRleCA2OTIyNmUxLi5mZDg1ZTRjIDEwMDY0NAotLS0gYS9mcy9uaWxmczIvdGhlX25pbGZzLmgKKysrIGIvZnMvbmlsZnMyL3RoZV9uaWxmcy5oCkBAIC0zNiw4ICszNiw2IEBACiAvKiB0aGVfbmlsZnMgc3RydWN0ICovCiBlbnVtIHsKIAlUSEVfTklMRlNfSU5JVCA9IDAsICAgICAvKiBJbmZvcm1hdGlvbiBmcm9tIHN1cGVyX2Jsb2NrIGlzIHNldCAqLwotCVRIRV9OSUxGU19MT0FERUQsICAgICAgIC8qIFJvbGwtYmFjay9yb2xsLWZvcndhcmQgaGFzIGRvbmUgYW5kCi0JCQkJICAgdGhlIGxhdGVzdCBjaGVja3BvaW50IHdhcyBsb2FkZWQgKi8KIAlUSEVfTklMRlNfRElTQ09OVElOVUVELAkvKiAnbmV4dCcgcG9pbnRlciBjaGFpbiBoYXMgYnJva2VuICovCiAJVEhFX05JTEZTX0dDX1JVTk5JTkcsCS8qIGdjIHByb2Nlc3MgaXMgcnVubmluZyAqLwogCVRIRV9OSUxGU19TQl9ESVJUWSwJLyogc3VwZXIgYmxvY2sgaXMgZGlydHkgKi8KQEAgLTE3OCw3ICsxNzYsNiBAQAogfQogCiBUSEVfTklMRlNfRk5TKElOSVQsIGluaXQpCi1USEVfTklMRlNfRk5TKExPQURFRCwgbG9hZGVkKQogVEhFX05JTEZTX0ZOUyhESVNDT05USU5VRUQsIGRpc2NvbnRpbnVlZCkKIFRIRV9OSUxGU19GTlMoR0NfUlVOTklORywgZ2NfcnVubmluZykKIFRIRV9OSUxGU19GTlMoU0JfRElSVFksIHNiX2RpcnR5KQpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvS2NvbmZpZyBiL2ZzL29jZnMyL0tjb25maWcKaW5kZXggMGQ4NDA2Ni4uYWIxNTJjMCAxMDA2NDQKLS0tIGEvZnMvb2NmczIvS2NvbmZpZworKysgYi9mcy9vY2ZzMi9LY29uZmlnCkBAIC01MSw3ICs1MSw3IEBACiAKIGNvbmZpZyBPQ0ZTMl9GU19TVEFUUwogCWJvb2wgIk9DRlMyIHN0YXRpc3RpY3MiCi0JZGVwZW5kcyBvbiBPQ0ZTMl9GUworCWRlcGVuZHMgb24gT0NGUzJfRlMgJiYgREVCVUdfRlMKIAlkZWZhdWx0IHkKIAloZWxwCiAJICBUaGlzIG9wdGlvbiBhbGxvd3Mgc29tZSBmcyBzdGF0aXN0aWNzIHRvIGJlIGNhcHR1cmVkLiBFbmFibGluZwpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvYWxsb2MuYyBiL2ZzL29jZnMyL2FsbG9jLmMKaW5kZXggNTkyZmFlNS4uZTQ5ODRlMiAxMDA2NDQKLS0tIGEvZnMvb2NmczIvYWxsb2MuYworKysgYi9mcy9vY2ZzMi9hbGxvYy5jCkBAIC01NjUsNyArNTY1LDYgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgdm9pZCBvY2ZzMl9mcmVlX3RydW5jYXRlX2NvbnRleHQoc3RydWN0IG9jZnMyX3RydW5jYXRlX2NvbnRleHQgKnRjKTsKIHN0YXRpYyBpbnQgb2NmczJfY2FjaGVfZXh0ZW50X2Jsb2NrX2ZyZWUoc3RydWN0IG9jZnMyX2NhY2hlZF9kZWFsbG9jX2N0eHQgKmN0eHQsCiAJCQkJCSBzdHJ1Y3Qgb2NmczJfZXh0ZW50X2Jsb2NrICplYik7CiBzdGF0aWMgdm9pZCBvY2ZzMl9hZGp1c3RfcmlnaHRtb3N0X3JlY29yZHMoaGFuZGxlX3QgKmhhbmRsZSwKQEAgLTU4NTgsNiArNTg1Nyw3IEBACiAKIAlvY2ZzMl9qb3VybmFsX2RpcnR5KGhhbmRsZSwgdGxfYmgpOwogCisJb3NiLT50cnVuY2F0ZWRfY2x1c3RlcnMgKz0gbnVtX2NsdXN0ZXJzOwogYmFpbDoKIAltbG9nX2V4aXQoc3RhdHVzKTsKIAlyZXR1cm4gc3RhdHVzOwpAQCAtNTkyOSw2ICs1OTI5LDggQEAKIAkJaS0tOwogCX0KIAorCW9zYi0+dHJ1bmNhdGVkX2NsdXN0ZXJzID0gMDsKKwogYmFpbDoKIAltbG9nX2V4aXQoc3RhdHVzKTsKIAlyZXR1cm4gc3RhdHVzOwpAQCAtNzEzOSw2NCArNzE0MSw2IEBACiB9CiAKIC8qCi0gKiBFeHBlY3RzIHRoZSBpbm9kZSB0byBhbHJlYWR5IGJlIGxvY2tlZC4KLSAqLwotaW50IG9jZnMyX3ByZXBhcmVfdHJ1bmNhdGUoc3RydWN0IG9jZnMyX3N1cGVyICpvc2IsCi0JCQkgICBzdHJ1Y3QgaW5vZGUgKmlub2RlLAotCQkJICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpmZV9iaCwKLQkJCSAgIHN0cnVjdCBvY2ZzMl90cnVuY2F0ZV9jb250ZXh0ICoqdGMpCi17Ci0JaW50IHN0YXR1czsKLQl1bnNpZ25lZCBpbnQgbmV3X2lfY2x1c3RlcnM7Ci0Jc3RydWN0IG9jZnMyX2Rpbm9kZSAqZmU7Ci0Jc3RydWN0IG9jZnMyX2V4dGVudF9ibG9jayAqZWI7Ci0Jc3RydWN0IGJ1ZmZlcl9oZWFkICpsYXN0X2ViX2JoID0gTlVMTDsKLQotCW1sb2dfZW50cnlfdm9pZCgpOwotCi0JKnRjID0gTlVMTDsKLQotCW5ld19pX2NsdXN0ZXJzID0gb2NmczJfY2x1c3RlcnNfZm9yX2J5dGVzKG9zYi0+c2IsCi0JCQkJCQkgIGlfc2l6ZV9yZWFkKGlub2RlKSk7Ci0JZmUgPSAoc3RydWN0IG9jZnMyX2Rpbm9kZSAqKSBmZV9iaC0+Yl9kYXRhOwotCi0JbWxvZygwLCAiZmUtPmlfY2x1c3RlcnMgPSAldSwgbmV3X2lfY2x1c3RlcnMgPSAldSwgZmUtPmlfc2l6ZSA9IgotCSAgICAgIiVsbHVcbiIsIGxlMzJfdG9fY3B1KGZlLT5pX2NsdXN0ZXJzKSwgbmV3X2lfY2x1c3RlcnMsCi0JICAgICAodW5zaWduZWQgbG9uZyBsb25nKWxlNjRfdG9fY3B1KGZlLT5pX3NpemUpKTsKLQotCSp0YyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBvY2ZzMl90cnVuY2F0ZV9jb250ZXh0KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCEoKnRjKSkgewotCQlzdGF0dXMgPSAtRU5PTUVNOwotCQltbG9nX2Vycm5vKHN0YXR1cyk7Ci0JCWdvdG8gYmFpbDsKLQl9Ci0Jb2NmczJfaW5pdF9kZWFsbG9jX2N0eHQoJigqdGMpLT50Y19kZWFsbG9jKTsKLQotCWlmIChmZS0+aWQyLmlfbGlzdC5sX3RyZWVfZGVwdGgpIHsKLQkJc3RhdHVzID0gb2NmczJfcmVhZF9leHRlbnRfYmxvY2soSU5PREVfQ0FDSEUoaW5vZGUpLAotCQkJCQkJIGxlNjRfdG9fY3B1KGZlLT5pX2xhc3RfZWJfYmxrKSwKLQkJCQkJCSAmbGFzdF9lYl9iaCk7Ci0JCWlmIChzdGF0dXMgPCAwKSB7Ci0JCQltbG9nX2Vycm5vKHN0YXR1cyk7Ci0JCQlnb3RvIGJhaWw7Ci0JCX0KLQkJZWIgPSAoc3RydWN0IG9jZnMyX2V4dGVudF9ibG9jayAqKSBsYXN0X2ViX2JoLT5iX2RhdGE7Ci0JfQotCi0JKCp0YyktPnRjX2xhc3RfZWJfYmggPSBsYXN0X2ViX2JoOwotCi0Jc3RhdHVzID0gMDsKLWJhaWw6Ci0JaWYgKHN0YXR1cyA8IDApIHsKLQkJaWYgKCp0YykKLQkJCW9jZnMyX2ZyZWVfdHJ1bmNhdGVfY29udGV4dCgqdGMpOwotCQkqdGMgPSBOVUxMOwotCX0KLQltbG9nX2V4aXRfdm9pZCgpOwotCXJldHVybiBzdGF0dXM7Ci19Ci0KLS8qCiAgKiAnc3RhcnQnIGlzIGluY2x1c2l2ZSwgJ2VuZCcgaXMgbm90LgogICovCiBpbnQgb2NmczJfdHJ1bmNhdGVfaW5saW5lKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBidWZmZXJfaGVhZCAqZGlfYmgsCkBAIC03MjcwLDE4ICs3MjE0LDMgQEAKIG91dDoKIAlyZXR1cm4gcmV0OwogfQotCi1zdGF0aWMgdm9pZCBvY2ZzMl9mcmVlX3RydW5jYXRlX2NvbnRleHQoc3RydWN0IG9jZnMyX3RydW5jYXRlX2NvbnRleHQgKnRjKQotewotCS8qCi0JICogVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgY29tcGxldGluZyBkZWFsbG9jYXRpb24KLQkgKiBiZWZvcmUgZnJlZWluZyB0aGUgY29udGV4dC4KLQkgKi8KLQlpZiAodGMtPnRjX2RlYWxsb2MuY19maXJzdF9zdWJhbGxvY2F0b3IgIT0gTlVMTCkKLQkJbWxvZyhNTF9OT1RJQ0UsCi0JCSAgICAgIlRydW5jYXRlIGNvbXBsZXRpb24gaGFzIG5vbi1lbXB0eSBkZWFsbG9jIGNvbnRleHRcbiIpOwotCi0JYnJlbHNlKHRjLT50Y19sYXN0X2ViX2JoKTsKLQotCWtmcmVlKHRjKTsKLX0KZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2FsbG9jLmggYi9mcy9vY2ZzMi9hbGxvYy5oCmluZGV4IDU1NzYyYjUuLjNiZDA4YTAgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL2FsbG9jLmgKKysrIGIvZnMvb2NmczIvYWxsb2MuaApAQCAtMjI4LDEwICsyMjgsNiBAQAogCiBpbnQgb2NmczJfemVyb19yYW5nZV9mb3JfdHJ1bmNhdGUoc3RydWN0IGlub2RlICppbm9kZSwgaGFuZGxlX3QgKmhhbmRsZSwKIAkJCQkgIHU2NCByYW5nZV9zdGFydCwgdTY0IHJhbmdlX2VuZCk7Ci1pbnQgb2NmczJfcHJlcGFyZV90cnVuY2F0ZShzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiwKLQkJCSAgIHN0cnVjdCBpbm9kZSAqaW5vZGUsCi0JCQkgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmZlX2JoLAotCQkJICAgc3RydWN0IG9jZnMyX3RydW5jYXRlX2NvbnRleHQgKip0Yyk7CiBpbnQgb2NmczJfY29tbWl0X3RydW5jYXRlKHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiLAogCQkJICBzdHJ1Y3QgaW5vZGUgKmlub2RlLAogCQkJICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmRpX2JoKTsKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2FvcHMuYyBiL2ZzL29jZnMyL2FvcHMuYwppbmRleCAwZDdjNTU0Li4xZmJiMGUyIDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9hb3BzLmMKKysrIGIvZnMvb2NmczIvYW9wcy5jCkBAIC0xNjMwLDYgKzE2MzAsNDMgQEAKIAlyZXR1cm4gcmV0OwogfQogCisvKgorICogVHJ5IHRvIGZsdXNoIHRydW5jYXRlIGxvZ3MgaWYgd2UgY2FuIGZyZWUgZW5vdWdoIGNsdXN0ZXJzIGZyb20gaXQuCisgKiBBcyBmb3IgcmV0dXJuIHZhbHVlLCAiPCAwIiBtZWFucyBlcnJvciwgIjAiIG5vIHNwYWNlIGFuZCAiMSIgbWVhbnMKKyAqIHdlIGhhdmUgZnJlZWQgZW5vdWdoIHNwYWNlcyBhbmQgbGV0IHRoZSBjYWxsZXIgdHJ5IHRvIGFsbG9jYXRlIGFnYWluLgorICovCitzdGF0aWMgaW50IG9jZnMyX3RyeV90b19mcmVlX3RydW5jYXRlX2xvZyhzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiwKKwkJCQkJICB1bnNpZ25lZCBpbnQgbmVlZGVkKQoreworCXRpZF90IHRhcmdldDsKKwlpbnQgcmV0ID0gMDsKKwl1bnNpZ25lZCBpbnQgdHJ1bmNhdGVkX2NsdXN0ZXJzOworCisJbXV0ZXhfbG9jaygmb3NiLT5vc2JfdGxfaW5vZGUtPmlfbXV0ZXgpOworCXRydW5jYXRlZF9jbHVzdGVycyA9IG9zYi0+dHJ1bmNhdGVkX2NsdXN0ZXJzOworCW11dGV4X3VubG9jaygmb3NiLT5vc2JfdGxfaW5vZGUtPmlfbXV0ZXgpOworCisJLyoKKwkgKiBDaGVjayB3aGV0aGVyIHdlIGNhbiBzdWNjZWVkIGluIGFsbG9jYXRpbmcgaWYgd2UgZnJlZQorCSAqIHRoZSB0cnVuY2F0ZSBsb2cuCisJICovCisJaWYgKHRydW5jYXRlZF9jbHVzdGVycyA8IG5lZWRlZCkKKwkJZ290byBvdXQ7CisKKwlyZXQgPSBvY2ZzMl9mbHVzaF90cnVuY2F0ZV9sb2cob3NiKTsKKwlpZiAocmV0KSB7CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKGpiZDJfam91cm5hbF9zdGFydF9jb21taXQob3NiLT5qb3VybmFsLT5qX2pvdXJuYWwsICZ0YXJnZXQpKSB7CisJCWpiZDJfbG9nX3dhaXRfY29tbWl0KG9zYi0+am91cm5hbC0+al9qb3VybmFsLCB0YXJnZXQpOworCQlyZXQgPSAxOworCX0KK291dDoKKwlyZXR1cm4gcmV0OworfQorCiBpbnQgb2NmczJfd3JpdGVfYmVnaW5fbm9sb2NrKHN0cnVjdCBmaWxlICpmaWxwLAogCQkJICAgICBzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywKIAkJCSAgICAgbG9mZl90IHBvcywgdW5zaWduZWQgbGVuLCB1bnNpZ25lZCBmbGFncywKQEAgLTE2MzcsNyArMTY3NCw3IEBACiAJCQkgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqZGlfYmgsIHN0cnVjdCBwYWdlICptbWFwX3BhZ2UpCiB7CiAJaW50IHJldCwgY2x1c3Rlcl9vZl9wYWdlcywgY3JlZGl0cyA9IE9DRlMyX0lOT0RFX1VQREFURV9DUkVESVRTOwotCXVuc2lnbmVkIGludCBjbHVzdGVyc190b19hbGxvYywgZXh0ZW50c190b19zcGxpdDsKKwl1bnNpZ25lZCBpbnQgY2x1c3RlcnNfdG9fYWxsb2MsIGV4dGVudHNfdG9fc3BsaXQsIGNsdXN0ZXJzX25lZWQgPSAwOwogCXN0cnVjdCBvY2ZzMl93cml0ZV9jdHh0ICp3YzsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gbWFwcGluZy0+aG9zdDsKIAlzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiA9IE9DRlMyX1NCKGlub2RlLT5pX3NiKTsKQEAgLTE2NDYsNyArMTY4Myw5IEBACiAJc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKm1ldGFfYWMgPSBOVUxMOwogCWhhbmRsZV90ICpoYW5kbGU7CiAJc3RydWN0IG9jZnMyX2V4dGVudF90cmVlIGV0OworCWludCB0cnlfZnJlZSA9IDEsIHJldDE7CiAKK3RyeV9hZ2FpbjoKIAlyZXQgPSBvY2ZzMl9hbGxvY193cml0ZV9jdHh0KCZ3Yywgb3NiLCBwb3MsIGxlbiwgZGlfYmgpOwogCWlmIChyZXQpIHsKIAkJbWxvZ19lcnJubyhyZXQpOwpAQCAtMTY4MSw2ICsxNzIwLDcgQEAKIAkJbWxvZ19lcnJubyhyZXQpOwogCQlnb3RvIG91dDsKIAl9IGVsc2UgaWYgKHJldCA9PSAxKSB7CisJCWNsdXN0ZXJzX25lZWQgPSB3Yy0+d19jbGVuOwogCQlyZXQgPSBvY2ZzMl9yZWZjb3VudF9jb3coaW5vZGUsIGZpbHAsIGRpX2JoLAogCQkJCQkgd2MtPndfY3Bvcywgd2MtPndfY2xlbiwgVUlOVF9NQVgpOwogCQlpZiAocmV0KSB7CkBAIC0xNjk1LDYgKzE3MzUsNyBAQAogCQltbG9nX2Vycm5vKHJldCk7CiAJCWdvdG8gb3V0OwogCX0KKwljbHVzdGVyc19uZWVkICs9IGNsdXN0ZXJzX3RvX2FsbG9jOwogCiAJZGkgPSAoc3RydWN0IG9jZnMyX2Rpbm9kZSAqKXdjLT53X2RpX2JoLT5iX2RhdGE7CiAKQEAgLTE4MTcsNiArMTg1OCwyMiBAQAogCQlvY2ZzMl9mcmVlX2FsbG9jX2NvbnRleHQoZGF0YV9hYyk7CiAJaWYgKG1ldGFfYWMpCiAJCW9jZnMyX2ZyZWVfYWxsb2NfY29udGV4dChtZXRhX2FjKTsKKworCWlmIChyZXQgPT0gLUVOT1NQQyAmJiB0cnlfZnJlZSkgeworCQkvKgorCQkgKiBUcnkgdG8gZnJlZSBzb21lIHRydW5jYXRlIGxvZyBzbyB0aGF0IHdlIGNhbiBoYXZlIGVub3VnaAorCQkgKiBjbHVzdGVycyB0byBhbGxvY2F0ZS4KKwkJICovCisJCXRyeV9mcmVlID0gMDsKKworCQlyZXQxID0gb2NmczJfdHJ5X3RvX2ZyZWVfdHJ1bmNhdGVfbG9nKG9zYiwgY2x1c3RlcnNfbmVlZCk7CisJCWlmIChyZXQxID09IDEpCisJCQlnb3RvIHRyeV9hZ2FpbjsKKworCQlpZiAocmV0MSA8IDApCisJCQltbG9nX2Vycm5vKHJldDEpOworCX0KKwogCXJldHVybiByZXQ7CiB9CiAKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2NsdXN0ZXIvaGVhcnRiZWF0LmMgYi9mcy9vY2ZzMi9jbHVzdGVyL2hlYXJ0YmVhdC5jCmluZGV4IDllM2Q0NWIuLmE2Y2MwNTMgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL2NsdXN0ZXIvaGVhcnRiZWF0LmMKKysrIGIvZnMvb2NmczIvY2x1c3Rlci9oZWFydGJlYXQuYwpAQCAtODIsNiArODIsNyBAQAogI2RlZmluZSBPMkhCX0RCX1RZUEVfUkVHSU9OX0xJVkVOT0RFUwk0CiAjZGVmaW5lIE8ySEJfREJfVFlQRV9SRUdJT05fTlVNQkVSCTUKICNkZWZpbmUgTzJIQl9EQl9UWVBFX1JFR0lPTl9FTEFQU0VEX1RJTUUJNgorI2RlZmluZSBPMkhCX0RCX1RZUEVfUkVHSU9OX1BJTk5FRAk3CiBzdHJ1Y3QgbzJoYl9kZWJ1Z19idWYgewogCWludCBkYl90eXBlOwogCWludCBkYl9zaXplOwpAQCAtMTAxLDYgKzEwMiw3IEBACiAjZGVmaW5lIE8ySEJfREVCVUdfRkFJTEVEUkVHSU9OUwkiZmFpbGVkX3JlZ2lvbnMiCiAjZGVmaW5lIE8ySEJfREVCVUdfUkVHSU9OX05VTUJFUgkibnVtIgogI2RlZmluZSBPMkhCX0RFQlVHX1JFR0lPTl9FTEFQU0VEX1RJTUUJImVsYXBzZWRfdGltZV9pbl9tcyIKKyNkZWZpbmUgTzJIQl9ERUJVR19SRUdJT05fUElOTkVECSJwaW5uZWQiCiAKIHN0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpvMmhiX2RlYnVnX2RpcjsKIHN0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpvMmhiX2RlYnVnX2xpdmVub2RlczsKQEAgLTEzMiw2ICsxMzQsMzMgQEAKIHVuc2lnbmVkIGludCBvMmhiX2RlYWRfdGhyZXNob2xkID0gTzJIQl9ERUZBVUxUX0RFQURfVEhSRVNIT0xEOwogdW5zaWduZWQgaW50IG8yaGJfaGVhcnRiZWF0X21vZGUgPSBPMkhCX0hFQVJUQkVBVF9MT0NBTDsKIAorLyoKKyAqIG8yaGJfZGVwZW5kZW50X3VzZXJzIHRyYWNrcyB0aGUgbnVtYmVyIG9mIHJlZ2lzdGVyZWQgY2FsbGJhY2tzIHRoYXQgZGVwZW5kCisgKiBvbiBoZWFydGJlYXQuIG8ybmV0IGFuZCBvMmRsbSBhcmUgdHdvIGVudGl0aWVzIHRoYXQgcmVnaXN0ZXIgdGhpcyBjYWxsYmFjay4KKyAqIEhvd2V2ZXIgb25seSBvMmRsbSBkZXBlbmRzIG9uIHRoZSBoZWFydGJlYXQuIEl0IGRvZXMgbm90IHdhbnQgdGhlIGhlYXJ0YmVhdAorICogdG8gc3RvcCB3aGlsZSBhIGRsbSBkb21haW4gaXMgc3RpbGwgYWN0aXZlLgorICovCit1bnNpZ25lZCBpbnQgbzJoYl9kZXBlbmRlbnRfdXNlcnM7CisKKy8qCisgKiBJbiBnbG9iYWwgaGVhcnRiZWF0IG1vZGUsIGFsbCByZWdpb25zIGFyZSBwaW5uZWQgaWYgdGhlcmUgYXJlIG9uZSBvciBtb3JlCisgKiBkZXBlbmRlbnQgdXNlcnMgYW5kIHRoZSBxdW9ydW0gcmVnaW9uIGNvdW50IGlzIDw9IE8ySEJfUElOX0NVVF9PRkYuIEFsbAorICogcmVnaW9ucyBhcmUgdW5waW5uZWQgaWYgdGhlIHJlZ2lvbiBjb3VudCBleGNlZWRzIHRoZSBjdXQgb2ZmIG9yIHRoZSBudW1iZXIKKyAqIG9mIGRlcGVuZGVudCB1c2VycyBmYWxscyB0byB6ZXJvLgorICovCisjZGVmaW5lIE8ySEJfUElOX0NVVF9PRkYJCTMKKworLyoKKyAqIEluIGxvY2FsIGhlYXJ0YmVhdCBtb2RlLCB3ZSBhc3N1bWUgdGhlIGRsbSBkb21haW4gbmFtZSB0byBiZSB0aGUgc2FtZSBhcworICogcmVnaW9uIHV1aWQuIFRoaXMgaXMgdHJ1ZSBmb3IgZG9tYWlucyBjcmVhdGVkIGZvciB0aGUgZmlsZSBzeXN0ZW0gYnV0IG5vdAorICogbmVjZXNzYXJpbHkgdHJ1ZSBmb3IgdXNlcmRsbSBkb21haW5zLiBUaGlzIGlzIGEga25vd24gbGltaXRhdGlvbi4KKyAqCisgKiBJbiBnbG9iYWwgaGVhcnRiZWF0IG1vZGUsIHdlIHBpbi91bnBpbiBhbGwgbzJoYiByZWdpb25zLiBUaGlzIHNvbHV0aW9uCisgKiB3b3JrcyBmb3IgYm90aCBmaWxlIHN5c3RlbSBhbmQgdXNlcmRsbSBkb21haW5zLgorICovCitzdGF0aWMgaW50IG8yaGJfcmVnaW9uX3Bpbihjb25zdCBjaGFyICpyZWdpb25fdXVpZCk7CitzdGF0aWMgdm9pZCBvMmhiX3JlZ2lvbl91bnBpbihjb25zdCBjaGFyICpyZWdpb25fdXVpZCk7CisKIC8qIE9ubHkgc2V0cyBhIG5ldyB0aHJlc2hvbGQgaWYgdGhlcmUgYXJlIG5vIGFjdGl2ZSByZWdpb25zLgogICoKICAqIE5vIGxvY2tpbmcgb3Igb3RoZXJ3aXNlIGludGVyZXN0aW5nIGNvZGUgaXMgcmVxdWlyZWQgZm9yIHJlYWRpbmcKQEAgLTE4Niw3ICsyMTUsOSBAQAogCXN0cnVjdCBjb25maWdfaXRlbQlocl9pdGVtOwogCiAJc3RydWN0IGxpc3RfaGVhZAlocl9hbGxfaXRlbTsKLQl1bnNpZ25lZAkJaHJfdW5jbGVhbl9zdG9wOjE7CisJdW5zaWduZWQJCWhyX3VuY2xlYW5fc3RvcDoxLAorCQkJCWhyX2l0ZW1fcGlubmVkOjEsCisJCQkJaHJfaXRlbV9kcm9wcGVkOjE7CiAKIAkvKiBwcm90ZWN0ZWQgYnkgdGhlIGhyX2NhbGxiYWNrX3NlbSAqLwogCXN0cnVjdCB0YXNrX3N0cnVjdCAJKmhyX3Rhc2s7CkBAIC0yMTIsOSArMjQzLDExIEBACiAJc3RydWN0IGRlbnRyeQkJKmhyX2RlYnVnX2xpdmVub2RlczsKIAlzdHJ1Y3QgZGVudHJ5CQkqaHJfZGVidWdfcmVnbnVtOwogCXN0cnVjdCBkZW50cnkJCSpocl9kZWJ1Z19lbGFwc2VkX3RpbWU7CisJc3RydWN0IGRlbnRyeQkJKmhyX2RlYnVnX3Bpbm5lZDsKIAlzdHJ1Y3QgbzJoYl9kZWJ1Z19idWYJKmhyX2RiX2xpdmVub2RlczsKIAlzdHJ1Y3QgbzJoYl9kZWJ1Z19idWYJKmhyX2RiX3JlZ251bTsKIAlzdHJ1Y3QgbzJoYl9kZWJ1Z19idWYJKmhyX2RiX2VsYXBzZWRfdGltZTsKKwlzdHJ1Y3QgbzJoYl9kZWJ1Z19idWYJKmhyX2RiX3Bpbm5lZDsKIAogCS8qIGxldCB0aGUgcGVyc29uIHNldHRpbmcgdXAgaGIgd2FpdCBmb3IgaXQgdG8gcmV0dXJuIHVudGlsIGl0CiAJICogaGFzIHJlYWNoZWQgYSAnc3RlYWR5JyBzdGF0ZS4gIFRoaXMgd2lsbCBiZSBmaXhlZCB3aGVuIHdlIGhhdmUKQEAgLTcwMSw2ICs3MzQsMTQgQEAKIAkgICAgICAgY29uZmlnX2l0ZW1fbmFtZSgmcmVnLT5ocl9pdGVtKSk7CiAKIAlzZXRfYml0KHJlZy0+aHJfcmVnaW9uX251bSwgbzJoYl9xdW9ydW1fcmVnaW9uX2JpdG1hcCk7CisKKwkvKgorCSAqIElmIGdsb2JhbCBoZWFydGJlYXQgYWN0aXZlLCB1bnBpbiBhbGwgcmVnaW9ucyBpZiB0aGUKKwkgKiByZWdpb24gY291bnQgPiBDVVRfT0ZGCisJICovCisJaWYgKG8yaGJfcG9wX2NvdW50KCZvMmhiX3F1b3J1bV9yZWdpb25fYml0bWFwLAorCQkJICAgTzJOTV9NQVhfUkVHSU9OUykgPiBPMkhCX1BJTl9DVVRfT0ZGKQorCQlvMmhiX3JlZ2lvbl91bnBpbihOVUxMKTsKIH0KIAogc3RhdGljIGludCBvMmhiX2NoZWNrX3Nsb3Qoc3RydWN0IG8yaGJfcmVnaW9uICpyZWcsCkBAIC0xMDQxLDYgKzEwODIsOSBAQAogCiAJc2V0X3VzZXJfbmljZShjdXJyZW50LCAtMjApOwogCisJLyogUGluIG5vZGUgKi8KKwlvMm5tX2RlcGVuZF90aGlzX25vZGUoKTsKKwogCXdoaWxlICgha3RocmVhZF9zaG91bGRfc3RvcCgpICYmICFyZWctPmhyX3VuY2xlYW5fc3RvcCkgewogCQkvKiBXZSB0cmFjayB0aGUgdGltZSBzcGVudCBpbnNpZGUKIAkJICogbzJoYl9kb19kaXNrX2hlYXJ0YmVhdCBzbyB0aGF0IHdlIGF2b2lkIG1vcmUgdGhhbgpAQCAtMTA5MCw2ICsxMTM0LDkgQEAKIAkJbWxvZ19lcnJubyhyZXQpOwogCX0KIAorCS8qIFVucGluIG5vZGUgKi8KKwlvMm5tX3VuZGVwZW5kX3RoaXNfbm9kZSgpOworCiAJbWxvZyhNTF9IRUFSVEJFQVR8TUxfS1RIUkVBRCwgImhiIHRocmVhZCBleGl0aW5nXG4iKTsKIAogCXJldHVybiAwOwpAQCAtMTE0Miw2ICsxMTg5LDEyIEBACiAJCQkJCQkgcmVnLT5ocl9sYXN0X3RpbWVvdXRfc3RhcnQpKTsKIAkJZ290byBkb25lOwogCisJY2FzZSBPMkhCX0RCX1RZUEVfUkVHSU9OX1BJTk5FRDoKKwkJcmVnID0gKHN0cnVjdCBvMmhiX3JlZ2lvbiAqKWRiLT5kYl9kYXRhOworCQlvdXQgKz0gc25wcmludGYoYnVmICsgb3V0LCBQQUdFX1NJWkUgLSBvdXQsICIldVxuIiwKKwkJCQkhIXJlZy0+aHJfaXRlbV9waW5uZWQpOworCQlnb3RvIGRvbmU7CisKIAlkZWZhdWx0OgogCQlnb3RvIGRvbmU7CiAJfQpAQCAtMTMxNSw2ICsxMzY4LDggQEAKIAltZW1zZXQobzJoYl9xdW9ydW1fcmVnaW9uX2JpdG1hcCwgMCwgc2l6ZW9mKG8yaGJfcXVvcnVtX3JlZ2lvbl9iaXRtYXApKTsKIAltZW1zZXQobzJoYl9mYWlsZWRfcmVnaW9uX2JpdG1hcCwgMCwgc2l6ZW9mKG8yaGJfZmFpbGVkX3JlZ2lvbl9iaXRtYXApKTsKIAorCW8yaGJfZGVwZW5kZW50X3VzZXJzID0gMDsKKwogCXJldHVybiBvMmhiX2RlYnVnX2luaXQoKTsKIH0KIApAQCAtMTM4NCw2ICsxNDM5LDcgQEAKIAlkZWJ1Z2ZzX3JlbW92ZShyZWctPmhyX2RlYnVnX2xpdmVub2Rlcyk7CiAJZGVidWdmc19yZW1vdmUocmVnLT5ocl9kZWJ1Z19yZWdudW0pOwogCWRlYnVnZnNfcmVtb3ZlKHJlZy0+aHJfZGVidWdfZWxhcHNlZF90aW1lKTsKKwlkZWJ1Z2ZzX3JlbW92ZShyZWctPmhyX2RlYnVnX3Bpbm5lZCk7CiAJZGVidWdmc19yZW1vdmUocmVnLT5ocl9kZWJ1Z19kaXIpOwogCiAJc3Bpbl9sb2NrKCZvMmhiX2xpdmVfbG9jayk7CkBAIC0xOTQ4LDYgKzIwMDQsMTggQEAKIAkJZ290byBiYWlsOwogCX0KIAorCXJlZy0+aHJfZGVidWdfcGlubmVkID0KKwkJCW8yaGJfZGVidWdfY3JlYXRlKE8ySEJfREVCVUdfUkVHSU9OX1BJTk5FRCwKKwkJCQkJICByZWctPmhyX2RlYnVnX2RpciwKKwkJCQkJICAmKHJlZy0+aHJfZGJfcGlubmVkKSwKKwkJCQkJICBzaXplb2YoKihyZWctPmhyX2RiX3Bpbm5lZCkpLAorCQkJCQkgIE8ySEJfREJfVFlQRV9SRUdJT05fUElOTkVELAorCQkJCQkgIDAsIDAsIHJlZyk7CisJaWYgKCFyZWctPmhyX2RlYnVnX3Bpbm5lZCkgeworCQltbG9nX2Vycm5vKHJldCk7CisJCWdvdG8gYmFpbDsKKwl9CisKIAlyZXQgPSAwOwogYmFpbDoKIAlyZXR1cm4gcmV0OwpAQCAtMjAwMiwxNSArMjA3MCwyMCBAQAogewogCXN0cnVjdCB0YXNrX3N0cnVjdCAqaGJfdGFzazsKIAlzdHJ1Y3QgbzJoYl9yZWdpb24gKnJlZyA9IHRvX28yaGJfcmVnaW9uKGl0ZW0pOworCWludCBxdW9ydW1fcmVnaW9uID0gMDsKIAogCS8qIHN0b3AgdGhlIHRocmVhZCB3aGVuIHRoZSB1c2VyIHJlbW92ZXMgdGhlIHJlZ2lvbiBkaXIgKi8KIAlzcGluX2xvY2soJm8yaGJfbGl2ZV9sb2NrKTsKIAlpZiAobzJoYl9nbG9iYWxfaGVhcnRiZWF0X2FjdGl2ZSgpKSB7CiAJCWNsZWFyX2JpdChyZWctPmhyX3JlZ2lvbl9udW0sIG8yaGJfcmVnaW9uX2JpdG1hcCk7CiAJCWNsZWFyX2JpdChyZWctPmhyX3JlZ2lvbl9udW0sIG8yaGJfbGl2ZV9yZWdpb25fYml0bWFwKTsKKwkJaWYgKHRlc3RfYml0KHJlZy0+aHJfcmVnaW9uX251bSwgbzJoYl9xdW9ydW1fcmVnaW9uX2JpdG1hcCkpCisJCQlxdW9ydW1fcmVnaW9uID0gMTsKKwkJY2xlYXJfYml0KHJlZy0+aHJfcmVnaW9uX251bSwgbzJoYl9xdW9ydW1fcmVnaW9uX2JpdG1hcCk7CiAJfQogCWhiX3Rhc2sgPSByZWctPmhyX3Rhc2s7CiAJcmVnLT5ocl90YXNrID0gTlVMTDsKKwlyZWctPmhyX2l0ZW1fZHJvcHBlZCA9IDE7CiAJc3Bpbl91bmxvY2soJm8yaGJfbGl2ZV9sb2NrKTsKIAogCWlmIChoYl90YXNrKQpAQCAtMjAyOCw3ICsyMTAxLDI3IEBACiAJaWYgKG8yaGJfZ2xvYmFsX2hlYXJ0YmVhdF9hY3RpdmUoKSkKIAkJcHJpbnRrKEtFUk5fTk9USUNFICJvMmhiOiBIZWFydGJlYXQgc3RvcHBlZCBvbiByZWdpb24gJXNcbiIsCiAJCSAgICAgICBjb25maWdfaXRlbV9uYW1lKCZyZWctPmhyX2l0ZW0pKTsKKwogCWNvbmZpZ19pdGVtX3B1dChpdGVtKTsKKworCWlmICghbzJoYl9nbG9iYWxfaGVhcnRiZWF0X2FjdGl2ZSgpIHx8ICFxdW9ydW1fcmVnaW9uKQorCQlyZXR1cm47CisKKwkvKgorCSAqIElmIGdsb2JhbCBoZWFydGJlYXQgYWN0aXZlIGFuZCB0aGVyZSBhcmUgZGVwZW5kZW50IHVzZXJzLAorCSAqIHBpbiBhbGwgcmVnaW9ucyBpZiBxdW9ydW0gcmVnaW9uIGNvdW50IDw9IENVVF9PRkYKKwkgKi8KKwlzcGluX2xvY2soJm8yaGJfbGl2ZV9sb2NrKTsKKworCWlmICghbzJoYl9kZXBlbmRlbnRfdXNlcnMpCisJCWdvdG8gdW5sb2NrOworCisJaWYgKG8yaGJfcG9wX2NvdW50KCZvMmhiX3F1b3J1bV9yZWdpb25fYml0bWFwLAorCQkJICAgTzJOTV9NQVhfUkVHSU9OUykgPD0gTzJIQl9QSU5fQ1VUX09GRikKKwkJbzJoYl9yZWdpb25fcGluKE5VTEwpOworCit1bmxvY2s6CisJc3Bpbl91bmxvY2soJm8yaGJfbGl2ZV9sb2NrKTsKIH0KIAogc3RydWN0IG8yaGJfaGVhcnRiZWF0X2dyb3VwX2F0dHJpYnV0ZSB7CkBAIC0yMjE0LDYzICsyMzA3LDEzOCBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwobzJoYl9zZXR1cF9jYWxsYmFjayk7CiAKLXN0YXRpYyBzdHJ1Y3QgbzJoYl9yZWdpb24gKm8yaGJfZmluZF9yZWdpb24oY29uc3QgY2hhciAqcmVnaW9uX3V1aWQpCisvKgorICogSW4gbG9jYWwgaGVhcnRiZWF0IG1vZGUsIHJlZ2lvbl91dWlkIHBhc3NlZCBtYXRjaGVzIHRoZSBkbG0gZG9tYWluIG5hbWUuCisgKiBJbiBnbG9iYWwgaGVhcnRiZWF0IG1vZGUsIHJlZ2lvbl91dWlkIHBhc3NlZCBpcyBOVUxMLgorICoKKyAqIEluIGxvY2FsLCB3ZSBvbmx5IHBpbiB0aGUgbWF0Y2hpbmcgcmVnaW9uLiBJbiBnbG9iYWwgd2UgcGluIGFsbCB0aGUgYWN0aXZlCisgKiByZWdpb25zLgorICovCitzdGF0aWMgaW50IG8yaGJfcmVnaW9uX3Bpbihjb25zdCBjaGFyICpyZWdpb25fdXVpZCkKIHsKLQlzdHJ1Y3QgbzJoYl9yZWdpb24gKnAsICpyZWcgPSBOVUxMOworCWludCByZXQgPSAwLCBmb3VuZCA9IDA7CisJc3RydWN0IG8yaGJfcmVnaW9uICpyZWc7CisJY2hhciAqdXVpZDsKIAogCWFzc2VydF9zcGluX2xvY2tlZCgmbzJoYl9saXZlX2xvY2spOwogCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShwLCAmbzJoYl9hbGxfcmVnaW9ucywgaHJfYWxsX2l0ZW0pIHsKLQkJaWYgKCFzdHJjbXAocmVnaW9uX3V1aWQsIGNvbmZpZ19pdGVtX25hbWUoJnAtPmhyX2l0ZW0pKSkgewotCQkJcmVnID0gcDsKLQkJCWJyZWFrOworCWxpc3RfZm9yX2VhY2hfZW50cnkocmVnLCAmbzJoYl9hbGxfcmVnaW9ucywgaHJfYWxsX2l0ZW0pIHsKKwkJdXVpZCA9IGNvbmZpZ19pdGVtX25hbWUoJnJlZy0+aHJfaXRlbSk7CisKKwkJLyogbG9jYWwgaGVhcnRiZWF0ICovCisJCWlmIChyZWdpb25fdXVpZCkgeworCQkJaWYgKHN0cmNtcChyZWdpb25fdXVpZCwgdXVpZCkpCisJCQkJY29udGludWU7CisJCQlmb3VuZCA9IDE7CiAJCX0KKworCQlpZiAocmVnLT5ocl9pdGVtX3Bpbm5lZCB8fCByZWctPmhyX2l0ZW1fZHJvcHBlZCkKKwkJCWdvdG8gc2tpcF9waW47CisKKwkJLyogSWdub3JlIEVOT0VOVCBvbmx5IGZvciBsb2NhbCBoYiAodXNlcmRsbSBkb21haW4pICovCisJCXJldCA9IG8ybm1fZGVwZW5kX2l0ZW0oJnJlZy0+aHJfaXRlbSk7CisJCWlmICghcmV0KSB7CisJCQltbG9nKE1MX0NMVVNURVIsICJQaW4gcmVnaW9uICVzXG4iLCB1dWlkKTsKKwkJCXJlZy0+aHJfaXRlbV9waW5uZWQgPSAxOworCQl9IGVsc2UgeworCQkJaWYgKHJldCA9PSAtRU5PRU5UICYmIGZvdW5kKQorCQkJCXJldCA9IDA7CisJCQllbHNlIHsKKwkJCQltbG9nKE1MX0VSUk9SLCAiUGluIHJlZ2lvbiAlcyBmYWlscyB3aXRoICVkXG4iLAorCQkJCSAgICAgdXVpZCwgcmV0KTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorc2tpcF9waW46CisJCWlmIChmb3VuZCkKKwkJCWJyZWFrOwogCX0KIAotCXJldHVybiByZWc7Ci19Ci0KLXN0YXRpYyBpbnQgbzJoYl9yZWdpb25fZ2V0KGNvbnN0IGNoYXIgKnJlZ2lvbl91dWlkKQotewotCWludCByZXQgPSAwOwotCXN0cnVjdCBvMmhiX3JlZ2lvbiAqcmVnOwotCi0Jc3Bpbl9sb2NrKCZvMmhiX2xpdmVfbG9jayk7Ci0KLQlyZWcgPSBvMmhiX2ZpbmRfcmVnaW9uKHJlZ2lvbl91dWlkKTsKLQlpZiAoIXJlZykKLQkJcmV0ID0gLUVOT0VOVDsKLQlzcGluX3VubG9jaygmbzJoYl9saXZlX2xvY2spOwotCi0JaWYgKHJldCkKLQkJZ290byBvdXQ7Ci0KLQlyZXQgPSBvMm5tX2RlcGVuZF90aGlzX25vZGUoKTsKLQlpZiAocmV0KQotCQlnb3RvIG91dDsKLQotCXJldCA9IG8ybm1fZGVwZW5kX2l0ZW0oJnJlZy0+aHJfaXRlbSk7Ci0JaWYgKHJldCkKLQkJbzJubV91bmRlcGVuZF90aGlzX25vZGUoKTsKLQotb3V0OgogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyB2b2lkIG8yaGJfcmVnaW9uX3B1dChjb25zdCBjaGFyICpyZWdpb25fdXVpZCkKKy8qCisgKiBJbiBsb2NhbCBoZWFydGJlYXQgbW9kZSwgcmVnaW9uX3V1aWQgcGFzc2VkIG1hdGNoZXMgdGhlIGRsbSBkb21haW4gbmFtZS4KKyAqIEluIGdsb2JhbCBoZWFydGJlYXQgbW9kZSwgcmVnaW9uX3V1aWQgcGFzc2VkIGlzIE5VTEwuCisgKgorICogSW4gbG9jYWwsIHdlIG9ubHkgdW5waW4gdGhlIG1hdGNoaW5nIHJlZ2lvbi4gSW4gZ2xvYmFsIHdlIHVucGluIGFsbCB0aGUKKyAqIGFjdGl2ZSByZWdpb25zLgorICovCitzdGF0aWMgdm9pZCBvMmhiX3JlZ2lvbl91bnBpbihjb25zdCBjaGFyICpyZWdpb25fdXVpZCkKIHsKIAlzdHJ1Y3QgbzJoYl9yZWdpb24gKnJlZzsKKwljaGFyICp1dWlkOworCWludCBmb3VuZCA9IDA7CisKKwlhc3NlcnRfc3Bpbl9sb2NrZWQoJm8yaGJfbGl2ZV9sb2NrKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkocmVnLCAmbzJoYl9hbGxfcmVnaW9ucywgaHJfYWxsX2l0ZW0pIHsKKwkJdXVpZCA9IGNvbmZpZ19pdGVtX25hbWUoJnJlZy0+aHJfaXRlbSk7CisJCWlmIChyZWdpb25fdXVpZCkgeworCQkJaWYgKHN0cmNtcChyZWdpb25fdXVpZCwgdXVpZCkpCisJCQkJY29udGludWU7CisJCQlmb3VuZCA9IDE7CisJCX0KKworCQlpZiAocmVnLT5ocl9pdGVtX3Bpbm5lZCkgeworCQkJbWxvZyhNTF9DTFVTVEVSLCAiVW5waW4gcmVnaW9uICVzXG4iLCB1dWlkKTsKKwkJCW8ybm1fdW5kZXBlbmRfaXRlbSgmcmVnLT5ocl9pdGVtKTsKKwkJCXJlZy0+aHJfaXRlbV9waW5uZWQgPSAwOworCQl9CisJCWlmIChmb3VuZCkKKwkJCWJyZWFrOworCX0KK30KKworc3RhdGljIGludCBvMmhiX3JlZ2lvbl9pbmNfdXNlcihjb25zdCBjaGFyICpyZWdpb25fdXVpZCkKK3sKKwlpbnQgcmV0ID0gMDsKIAogCXNwaW5fbG9jaygmbzJoYl9saXZlX2xvY2spOwogCi0JcmVnID0gbzJoYl9maW5kX3JlZ2lvbihyZWdpb25fdXVpZCk7Ci0KLQlzcGluX3VubG9jaygmbzJoYl9saXZlX2xvY2spOwotCi0JaWYgKHJlZykgewotCQlvMm5tX3VuZGVwZW5kX2l0ZW0oJnJlZy0+aHJfaXRlbSk7Ci0JCW8ybm1fdW5kZXBlbmRfdGhpc19ub2RlKCk7CisJLyogbG9jYWwgaGVhcnRiZWF0ICovCisJaWYgKCFvMmhiX2dsb2JhbF9oZWFydGJlYXRfYWN0aXZlKCkpIHsKKwkgICAgcmV0ID0gbzJoYl9yZWdpb25fcGluKHJlZ2lvbl91dWlkKTsKKwkgICAgZ290byB1bmxvY2s7CiAJfQorCisJLyoKKwkgKiBpZiBnbG9iYWwgaGVhcnRiZWF0IGFjdGl2ZSBhbmQgdGhpcyBpcyB0aGUgZmlyc3QgZGVwZW5kZW50IHVzZXIsCisJICogcGluIGFsbCByZWdpb25zIGlmIHF1b3J1bSByZWdpb24gY291bnQgPD0gQ1VUX09GRgorCSAqLworCW8yaGJfZGVwZW5kZW50X3VzZXJzKys7CisJaWYgKG8yaGJfZGVwZW5kZW50X3VzZXJzID4gMSkKKwkJZ290byB1bmxvY2s7CisKKwlpZiAobzJoYl9wb3BfY291bnQoJm8yaGJfcXVvcnVtX3JlZ2lvbl9iaXRtYXAsCisJCQkgICBPMk5NX01BWF9SRUdJT05TKSA8PSBPMkhCX1BJTl9DVVRfT0ZGKQorCQlyZXQgPSBvMmhiX3JlZ2lvbl9waW4oTlVMTCk7CisKK3VubG9jazoKKwlzcGluX3VubG9jaygmbzJoYl9saXZlX2xvY2spOworCXJldHVybiByZXQ7Cit9CisKK3ZvaWQgbzJoYl9yZWdpb25fZGVjX3VzZXIoY29uc3QgY2hhciAqcmVnaW9uX3V1aWQpCit7CisJc3Bpbl9sb2NrKCZvMmhiX2xpdmVfbG9jayk7CisKKwkvKiBsb2NhbCBoZWFydGJlYXQgKi8KKwlpZiAoIW8yaGJfZ2xvYmFsX2hlYXJ0YmVhdF9hY3RpdmUoKSkgeworCSAgICBvMmhiX3JlZ2lvbl91bnBpbihyZWdpb25fdXVpZCk7CisJICAgIGdvdG8gdW5sb2NrOworCX0KKworCS8qCisJICogaWYgZ2xvYmFsIGhlYXJ0YmVhdCBhY3RpdmUgYW5kIHRoZXJlIGFyZSBubyBkZXBlbmRlbnQgdXNlcnMsCisJICogdW5waW4gYWxsIHF1b3J1bSByZWdpb25zCisJICovCisJbzJoYl9kZXBlbmRlbnRfdXNlcnMtLTsKKwlpZiAoIW8yaGJfZGVwZW5kZW50X3VzZXJzKQorCQlvMmhiX3JlZ2lvbl91bnBpbihOVUxMKTsKKwordW5sb2NrOgorCXNwaW5fdW5sb2NrKCZvMmhiX2xpdmVfbG9jayk7CiB9CiAKIGludCBvMmhiX3JlZ2lzdGVyX2NhbGxiYWNrKGNvbnN0IGNoYXIgKnJlZ2lvbl91dWlkLApAQCAtMjI5MSw5ICsyNDU5LDExIEBACiAJfQogCiAJaWYgKHJlZ2lvbl91dWlkKSB7Ci0JCXJldCA9IG8yaGJfcmVnaW9uX2dldChyZWdpb25fdXVpZCk7Ci0JCWlmIChyZXQpCisJCXJldCA9IG8yaGJfcmVnaW9uX2luY191c2VyKHJlZ2lvbl91dWlkKTsKKwkJaWYgKHJldCkgeworCQkJbWxvZ19lcnJubyhyZXQpOwogCQkJZ290byBvdXQ7CisJCX0KIAl9CiAKIAlkb3duX3dyaXRlKCZvMmhiX2NhbGxiYWNrX3NlbSk7CkBAIC0yMzExLDcgKzI0ODEsNyBAQAogCXVwX3dyaXRlKCZvMmhiX2NhbGxiYWNrX3NlbSk7CiAJcmV0ID0gMDsKIG91dDoKLQltbG9nKE1MX0hFQVJUQkVBVCwgInJldHVybmluZyAlZCBvbiBiZWhhbGYgb2YgJXAgZm9yIGZ1bmNzICVwXG4iLAorCW1sb2coTUxfQ0xVU1RFUiwgInJldHVybmluZyAlZCBvbiBiZWhhbGYgb2YgJXAgZm9yIGZ1bmNzICVwXG4iLAogCSAgICAgcmV0LCBfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCksIGhjKTsKIAlyZXR1cm4gcmV0OwogfQpAQCAtMjMyMiw3ICsyNDkyLDcgQEAKIHsKIAlCVUdfT04oaGMtPmhjX21hZ2ljICE9IE8ySEJfQ0JfTUFHSUMpOwogCi0JbWxvZyhNTF9IRUFSVEJFQVQsICJvbiBiZWhhbGYgb2YgJXAgZm9yIGZ1bmNzICVwXG4iLAorCW1sb2coTUxfQ0xVU1RFUiwgIm9uIGJlaGFsZiBvZiAlcCBmb3IgZnVuY3MgJXBcbiIsCiAJICAgICBfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCksIGhjKTsKIAogCS8qIFhYWCBDYW4gdGhpcyBoYXBwZW4gX3dpdGhfIGEgcmVnaW9uIHJlZmVyZW5jZT8gKi8KQEAgLTIzMzAsNyArMjUwMCw3IEBACiAJCXJldHVybjsKIAogCWlmIChyZWdpb25fdXVpZCkKLQkJbzJoYl9yZWdpb25fcHV0KHJlZ2lvbl91dWlkKTsKKwkJbzJoYl9yZWdpb25fZGVjX3VzZXIocmVnaW9uX3V1aWQpOwogCiAJZG93bl93cml0ZSgmbzJoYl9jYWxsYmFja19zZW0pOwogCmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9jbHVzdGVyL25ldGRlYnVnLmMgYi9mcy9vY2ZzMi9jbHVzdGVyL25ldGRlYnVnLmMKaW5kZXggYTNmMTUwZS4uM2E1ODM1OSAxMDA2NDQKLS0tIGEvZnMvb2NmczIvY2x1c3Rlci9uZXRkZWJ1Zy5jCisrKyBiL2ZzL29jZnMyL2NsdXN0ZXIvbmV0ZGVidWcuYwpAQCAtNDYsMTAgKzQ2LDE1IEBACiAjZGVmaW5lIE8yTkVUX0RFQlVHX0RJUgkJIm8ybmV0IgogI2RlZmluZSBTQ19ERUJVR19OQU1FCQkic29ja19jb250YWluZXJzIgogI2RlZmluZSBOU1RfREVCVUdfTkFNRQkJInNlbmRfdHJhY2tpbmciCisjZGVmaW5lIFNUQVRTX0RFQlVHX05BTUUJInN0YXRzIgorCisjZGVmaW5lIFNIT1dfU09DS19DT05UQUlORVJTCTAKKyNkZWZpbmUgU0hPV19TT0NLX1NUQVRTCQkxCiAKIHN0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpvMm5ldF9kZW50cnk7CiBzdGF0aWMgc3RydWN0IGRlbnRyeSAqc2NfZGVudHJ5Owogc3RhdGljIHN0cnVjdCBkZW50cnkgKm5zdF9kZW50cnk7CitzdGF0aWMgc3RydWN0IGRlbnRyeSAqc3RhdHNfZGVudHJ5OwogCiBzdGF0aWMgREVGSU5FX1NQSU5MT0NLKG8ybmV0X2RlYnVnX2xvY2spOwogCkBAIC0xMjMsMzcgKzEyOCw0MiBAQAogc3RhdGljIGludCBuc3Rfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCiB7CiAJc3RydWN0IG8ybmV0X3NlbmRfdHJhY2tpbmcgKm5zdCwgKmR1bW15X25zdCA9IHNlcS0+cHJpdmF0ZTsKKwlrdGltZV90IG5vdzsKKwlzNjQgc29jaywgc2VuZCwgc3RhdHVzOwogCiAJc3Bpbl9sb2NrKCZvMm5ldF9kZWJ1Z19sb2NrKTsKIAluc3QgPSBuZXh0X25zdChkdW1teV9uc3QpOworCWlmICghbnN0KQorCQlnb3RvIG91dDsKIAotCWlmIChuc3QgIT0gTlVMTCkgewotCQkvKiBnZXRfdGFza19jb21tIGlzbid0IGV4cG9ydGVkLiAgb2ggd2VsbC4gKi8KLQkJc2VxX3ByaW50ZihzZXEsICIlcDpcbiIKLQkJCSAgICIgIHBpZDogICAgICAgICAgJWx1XG4iCi0JCQkgICAiICB0Z2lkOiAgICAgICAgICVsdVxuIgotCQkJICAgIiAgcHJvY2VzcyBuYW1lOiAlc1xuIgotCQkJICAgIiAgbm9kZTogICAgICAgICAldVxuIgotCQkJICAgIiAgc2M6ICAgICAgICAgICAlcFxuIgotCQkJICAgIiAgbWVzc2FnZSBpZDogICAlZFxuIgotCQkJICAgIiAgbWVzc2FnZSB0eXBlOiAldVxuIgotCQkJICAgIiAgbWVzc2FnZSBrZXk6ICAweCUwOHhcbiIKLQkJCSAgICIgIHNvY2sgYWNxdWlyeTogJWx1LiVsZFxuIgotCQkJICAgIiAgc2VuZCBzdGFydDogICAlbHUuJWxkXG4iCi0JCQkgICAiICB3YWl0IHN0YXJ0OiAgICVsdS4lbGRcbiIsCi0JCQkgICBuc3QsICh1bnNpZ25lZCBsb25nKW5zdC0+c3RfdGFzay0+cGlkLAotCQkJICAgKHVuc2lnbmVkIGxvbmcpbnN0LT5zdF90YXNrLT50Z2lkLAotCQkJICAgbnN0LT5zdF90YXNrLT5jb21tLCBuc3QtPnN0X25vZGUsCi0JCQkgICBuc3QtPnN0X3NjLCBuc3QtPnN0X2lkLCBuc3QtPnN0X21zZ190eXBlLAotCQkJICAgbnN0LT5zdF9tc2dfa2V5LAotCQkJICAgbnN0LT5zdF9zb2NrX3RpbWUudHZfc2VjLAotCQkJICAgKGxvbmcpbnN0LT5zdF9zb2NrX3RpbWUudHZfdXNlYywKLQkJCSAgIG5zdC0+c3Rfc2VuZF90aW1lLnR2X3NlYywKLQkJCSAgIChsb25nKW5zdC0+c3Rfc2VuZF90aW1lLnR2X3VzZWMsCi0JCQkgICBuc3QtPnN0X3N0YXR1c190aW1lLnR2X3NlYywKLQkJCSAgIChsb25nKW5zdC0+c3Rfc3RhdHVzX3RpbWUudHZfdXNlYyk7Ci0JfQorCW5vdyA9IGt0aW1lX2dldCgpOworCXNvY2sgPSBrdGltZV90b191cyhrdGltZV9zdWIobm93LCBuc3QtPnN0X3NvY2tfdGltZSkpOworCXNlbmQgPSBrdGltZV90b191cyhrdGltZV9zdWIobm93LCBuc3QtPnN0X3NlbmRfdGltZSkpOworCXN0YXR1cyA9IGt0aW1lX3RvX3VzKGt0aW1lX3N1Yihub3csIG5zdC0+c3Rfc3RhdHVzX3RpbWUpKTsKIAorCS8qIGdldF90YXNrX2NvbW0gaXNuJ3QgZXhwb3J0ZWQuICBvaCB3ZWxsLiAqLworCXNlcV9wcmludGYoc2VxLCAiJXA6XG4iCisJCSAgICIgIHBpZDogICAgICAgICAgJWx1XG4iCisJCSAgICIgIHRnaWQ6ICAgICAgICAgJWx1XG4iCisJCSAgICIgIHByb2Nlc3MgbmFtZTogJXNcbiIKKwkJICAgIiAgbm9kZTogICAgICAgICAldVxuIgorCQkgICAiICBzYzogICAgICAgICAgICVwXG4iCisJCSAgICIgIG1lc3NhZ2UgaWQ6ICAgJWRcbiIKKwkJICAgIiAgbWVzc2FnZSB0eXBlOiAldVxuIgorCQkgICAiICBtZXNzYWdlIGtleTogIDB4JTA4eFxuIgorCQkgICAiICBzb2NrIGFjcXVpcnk6ICVsbGQgdXNlY3MgYWdvXG4iCisJCSAgICIgIHNlbmQgc3RhcnQ6ICAgJWxsZCB1c2VjcyBhZ29cbiIKKwkJICAgIiAgd2FpdCBzdGFydDogICAlbGxkIHVzZWNzIGFnb1xuIiwKKwkJICAgbnN0LCAodW5zaWduZWQgbG9uZyl0YXNrX3BpZF9ucihuc3QtPnN0X3Rhc2spLAorCQkgICAodW5zaWduZWQgbG9uZyluc3QtPnN0X3Rhc2stPnRnaWQsCisJCSAgIG5zdC0+c3RfdGFzay0+Y29tbSwgbnN0LT5zdF9ub2RlLAorCQkgICBuc3QtPnN0X3NjLCBuc3QtPnN0X2lkLCBuc3QtPnN0X21zZ190eXBlLAorCQkgICBuc3QtPnN0X21zZ19rZXksCisJCSAgIChsb25nIGxvbmcpc29jaywKKwkJICAgKGxvbmcgbG9uZylzZW5kLAorCQkgICAobG9uZyBsb25nKXN0YXR1cyk7CisKK291dDoKIAlzcGluX3VubG9jaygmbzJuZXRfZGVidWdfbG9jayk7CiAKIAlyZXR1cm4gMDsKQEAgLTIyOCw2ICsyMzgsMTEgQEAKIAlzcGluX3VubG9jaygmbzJuZXRfZGVidWdfbG9jayk7CiB9CiAKK3N0cnVjdCBvMm5ldF9zb2NrX2RlYnVnIHsKKwlpbnQgZGJnX2N0eHQ7CisJc3RydWN0IG8ybmV0X3NvY2tfY29udGFpbmVyICpkYmdfc29jazsKK307CisKIHN0YXRpYyBzdHJ1Y3QgbzJuZXRfc29ja19jb250YWluZXIKIAkJCSpuZXh0X3NjKHN0cnVjdCBvMm5ldF9zb2NrX2NvbnRhaW5lciAqc2Nfc3RhcnQpCiB7CkBAIC0yNTMsNyArMjY4LDggQEAKIAogc3RhdGljIHZvaWQgKnNjX3NlcV9zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgbG9mZl90ICpwb3MpCiB7Ci0Jc3RydWN0IG8ybmV0X3NvY2tfY29udGFpbmVyICpzYywgKmR1bW15X3NjID0gc2VxLT5wcml2YXRlOworCXN0cnVjdCBvMm5ldF9zb2NrX2RlYnVnICpzZCA9IHNlcS0+cHJpdmF0ZTsKKwlzdHJ1Y3QgbzJuZXRfc29ja19jb250YWluZXIgKnNjLCAqZHVtbXlfc2MgPSBzZC0+ZGJnX3NvY2s7CiAKIAlzcGluX2xvY2soJm8ybmV0X2RlYnVnX2xvY2spOwogCXNjID0gbmV4dF9zYyhkdW1teV9zYyk7CkBAIC0yNjQsNyArMjgwLDggQEAKIAogc3RhdGljIHZvaWQgKnNjX3NlcV9uZXh0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2LCBsb2ZmX3QgKnBvcykKIHsKLQlzdHJ1Y3QgbzJuZXRfc29ja19jb250YWluZXIgKnNjLCAqZHVtbXlfc2MgPSBzZXEtPnByaXZhdGU7CisJc3RydWN0IG8ybmV0X3NvY2tfZGVidWcgKnNkID0gc2VxLT5wcml2YXRlOworCXN0cnVjdCBvMm5ldF9zb2NrX2NvbnRhaW5lciAqc2MsICpkdW1teV9zYyA9IHNkLT5kYmdfc29jazsKIAogCXNwaW5fbG9jaygmbzJuZXRfZGVidWdfbG9jayk7CiAJc2MgPSBuZXh0X3NjKGR1bW15X3NjKTsKQEAgLTI3Niw2NSArMjkzLDEwNyBAQAogCXJldHVybiBzYzsgLyogdW51c2VkLCBqdXN0IG5lZWRzIHRvIGJlIG51bGwgd2hlbiBkb25lICovCiB9CiAKLSNkZWZpbmUgVFZfU0VDX1VTRUMoVFYpIFRWLnR2X3NlYywgKGxvbmcpVFYudHZfdXNlYworI2lmZGVmIENPTkZJR19PQ0ZTMl9GU19TVEFUUworIyBkZWZpbmUgc2Nfc2VuZF9jb3VudChfcykJCSgoX3MpLT5zY19zZW5kX2NvdW50KQorIyBkZWZpbmUgc2NfcmVjdl9jb3VudChfcykJCSgoX3MpLT5zY19yZWN2X2NvdW50KQorIyBkZWZpbmUgc2NfdHZfYWNxdWlyeV90b3RhbF9ucyhfcykJKGt0aW1lX3RvX25zKChfcyktPnNjX3R2X2FjcXVpcnlfdG90YWwpKQorIyBkZWZpbmUgc2NfdHZfc2VuZF90b3RhbF9ucyhfcykJKGt0aW1lX3RvX25zKChfcyktPnNjX3R2X3NlbmRfdG90YWwpKQorIyBkZWZpbmUgc2NfdHZfc3RhdHVzX3RvdGFsX25zKF9zKQkoa3RpbWVfdG9fbnMoKF9zKS0+c2NfdHZfc3RhdHVzX3RvdGFsKSkKKyMgZGVmaW5lIHNjX3R2X3Byb2Nlc3NfdG90YWxfbnMoX3MpCShrdGltZV90b19ucygoX3MpLT5zY190dl9wcm9jZXNzX3RvdGFsKSkKKyNlbHNlCisjIGRlZmluZSBzY19zZW5kX2NvdW50KF9zKQkJKDBVKQorIyBkZWZpbmUgc2NfcmVjdl9jb3VudChfcykJCSgwVSkKKyMgZGVmaW5lIHNjX3R2X2FjcXVpcnlfdG90YWxfbnMoX3MpCSgwTEwpCisjIGRlZmluZSBzY190dl9zZW5kX3RvdGFsX25zKF9zKQkoMExMKQorIyBkZWZpbmUgc2NfdHZfc3RhdHVzX3RvdGFsX25zKF9zKQkoMExMKQorIyBkZWZpbmUgc2NfdHZfcHJvY2Vzc190b3RhbF9ucyhfcykJKDBMTCkKKyNlbmRpZgorCisvKiBTbyB0aGF0IGRlYnVnZnMub2NmczIgY2FuIGRldGVybWluZSB3aGljaCBmb3JtYXQgaXMgYmVpbmcgdXNlZCAqLworI2RlZmluZSBPMk5FVF9TVEFUU19TVFJfVkVSU0lPTgkJMQorc3RhdGljIHZvaWQgc2Nfc2hvd19zb2NrX3N0YXRzKHN0cnVjdCBzZXFfZmlsZSAqc2VxLAorCQkJICAgICAgIHN0cnVjdCBvMm5ldF9zb2NrX2NvbnRhaW5lciAqc2MpCit7CisJaWYgKCFzYykKKwkJcmV0dXJuOworCisJc2VxX3ByaW50ZihzZXEsICIlZCwldSwlbHUsJWxsZCwlbGxkLCVsbGQsJWx1LCVsbGRcbiIsIE8yTkVUX1NUQVRTX1NUUl9WRVJTSU9OLAorCQkgICBzYy0+c2Nfbm9kZS0+bmRfbnVtLCAodW5zaWduZWQgbG9uZylzY19zZW5kX2NvdW50KHNjKSwKKwkJICAgKGxvbmcgbG9uZylzY190dl9hY3F1aXJ5X3RvdGFsX25zKHNjKSwKKwkJICAgKGxvbmcgbG9uZylzY190dl9zZW5kX3RvdGFsX25zKHNjKSwKKwkJICAgKGxvbmcgbG9uZylzY190dl9zdGF0dXNfdG90YWxfbnMoc2MpLAorCQkgICAodW5zaWduZWQgbG9uZylzY19yZWN2X2NvdW50KHNjKSwKKwkJICAgKGxvbmcgbG9uZylzY190dl9wcm9jZXNzX3RvdGFsX25zKHNjKSk7Cit9CisKK3N0YXRpYyB2b2lkIHNjX3Nob3dfc29ja19jb250YWluZXIoc3RydWN0IHNlcV9maWxlICpzZXEsCisJCQkJICAgc3RydWN0IG8ybmV0X3NvY2tfY29udGFpbmVyICpzYykKK3sKKwlzdHJ1Y3QgaW5ldF9zb2NrICppbmV0ID0gTlVMTDsKKwlfX2JlMzIgc2FkZHIgPSAwLCBkYWRkciA9IDA7CisJX19iZTE2IHNwb3J0ID0gMCwgZHBvcnQgPSAwOworCisJaWYgKCFzYykKKwkJcmV0dXJuOworCisJaWYgKHNjLT5zY19zb2NrKSB7CisJCWluZXQgPSBpbmV0X3NrKHNjLT5zY19zb2NrLT5zayk7CisJCS8qIHRoZSBzdGFjaydzIHN0cnVjdHMgYXJlbid0IHNwYXJzZSBlbmRpYW4gY2xlYW4gKi8KKwkJc2FkZHIgPSAoX19mb3JjZSBfX2JlMzIpaW5ldC0+aW5ldF9zYWRkcjsKKwkJZGFkZHIgPSAoX19mb3JjZSBfX2JlMzIpaW5ldC0+aW5ldF9kYWRkcjsKKwkJc3BvcnQgPSAoX19mb3JjZSBfX2JlMTYpaW5ldC0+aW5ldF9zcG9ydDsKKwkJZHBvcnQgPSAoX19mb3JjZSBfX2JlMTYpaW5ldC0+aW5ldF9kcG9ydDsKKwl9CisKKwkvKiBYWFggc2lnaCwgaW5ldC0+IGRvZXNuJ3QgaGF2ZSBzcGFyc2UgYW5ub3RhdGlvbiBzbyBhbnkKKwkgKiB1c2Ugb2YgaXQgaGVyZSBnZW5lcmF0ZXMgYSB3YXJuaW5nIHdpdGggLVdiaXR3aXNlICovCisJc2VxX3ByaW50ZihzZXEsICIlcDpcbiIKKwkJICAgIiAga3JlZnM6ICAgICAgICAgICAlZFxuIgorCQkgICAiICBzb2NrOiAgICAgICAgICAgICVwSTQ6JXUgLT4gIgorCQkJCSAgICAgICIlcEk0OiV1XG4iCisJCSAgICIgIHJlbW90ZSBub2RlOiAgICAgJXNcbiIKKwkJICAgIiAgcGFnZSBvZmY6ICAgICAgICAlenVcbiIKKwkJICAgIiAgaGFuZHNoYWtlIG9rOiAgICAldVxuIgorCQkgICAiICB0aW1lcjogICAgICAgICAgICVsbGQgdXNlY3NcbiIKKwkJICAgIiAgZGF0YSByZWFkeTogICAgICAlbGxkIHVzZWNzXG4iCisJCSAgICIgIGFkdmFuY2Ugc3RhcnQ6ICAgJWxsZCB1c2Vjc1xuIgorCQkgICAiICBhZHZhbmNlIHN0b3A6ICAgICVsbGQgdXNlY3NcbiIKKwkJICAgIiAgZnVuYyBzdGFydDogICAgICAlbGxkIHVzZWNzXG4iCisJCSAgICIgIGZ1bmMgc3RvcDogICAgICAgJWxsZCB1c2Vjc1xuIgorCQkgICAiICBmdW5jIGtleTogICAgICAgIDB4JTA4eFxuIgorCQkgICAiICBmdW5jIHR5cGU6ICAgICAgICV1XG4iLAorCQkgICBzYywKKwkJICAgYXRvbWljX3JlYWQoJnNjLT5zY19rcmVmLnJlZmNvdW50KSwKKwkJICAgJnNhZGRyLCBpbmV0ID8gbnRvaHMoc3BvcnQpIDogMCwKKwkJICAgJmRhZGRyLCBpbmV0ID8gbnRvaHMoZHBvcnQpIDogMCwKKwkJICAgc2MtPnNjX25vZGUtPm5kX25hbWUsCisJCSAgIHNjLT5zY19wYWdlX29mZiwKKwkJICAgc2MtPnNjX2hhbmRzaGFrZV9vaywKKwkJICAgKGxvbmcgbG9uZylrdGltZV90b191cyhzYy0+c2NfdHZfdGltZXIpLAorCQkgICAobG9uZyBsb25nKWt0aW1lX3RvX3VzKHNjLT5zY190dl9kYXRhX3JlYWR5KSwKKwkJICAgKGxvbmcgbG9uZylrdGltZV90b191cyhzYy0+c2NfdHZfYWR2YW5jZV9zdGFydCksCisJCSAgIChsb25nIGxvbmcpa3RpbWVfdG9fdXMoc2MtPnNjX3R2X2FkdmFuY2Vfc3RvcCksCisJCSAgIChsb25nIGxvbmcpa3RpbWVfdG9fdXMoc2MtPnNjX3R2X2Z1bmNfc3RhcnQpLAorCQkgICAobG9uZyBsb25nKWt0aW1lX3RvX3VzKHNjLT5zY190dl9mdW5jX3N0b3ApLAorCQkgICBzYy0+c2NfbXNnX2tleSwKKwkJICAgc2MtPnNjX21zZ190eXBlKTsKK30KIAogc3RhdGljIGludCBzY19zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKIHsKLQlzdHJ1Y3QgbzJuZXRfc29ja19jb250YWluZXIgKnNjLCAqZHVtbXlfc2MgPSBzZXEtPnByaXZhdGU7CisJc3RydWN0IG8ybmV0X3NvY2tfZGVidWcgKnNkID0gc2VxLT5wcml2YXRlOworCXN0cnVjdCBvMm5ldF9zb2NrX2NvbnRhaW5lciAqc2MsICpkdW1teV9zYyA9IHNkLT5kYmdfc29jazsKIAogCXNwaW5fbG9jaygmbzJuZXRfZGVidWdfbG9jayk7CiAJc2MgPSBuZXh0X3NjKGR1bW15X3NjKTsKIAotCWlmIChzYyAhPSBOVUxMKSB7Ci0JCXN0cnVjdCBpbmV0X3NvY2sgKmluZXQgPSBOVUxMOwotCi0JCV9fYmUzMiBzYWRkciA9IDAsIGRhZGRyID0gMDsKLQkJX19iZTE2IHNwb3J0ID0gMCwgZHBvcnQgPSAwOwotCi0JCWlmIChzYy0+c2Nfc29jaykgewotCQkJaW5ldCA9IGluZXRfc2soc2MtPnNjX3NvY2stPnNrKTsKLQkJCS8qIHRoZSBzdGFjaydzIHN0cnVjdHMgYXJlbid0IHNwYXJzZSBlbmRpYW4gY2xlYW4gKi8KLQkJCXNhZGRyID0gKF9fZm9yY2UgX19iZTMyKWluZXQtPmluZXRfc2FkZHI7Ci0JCQlkYWRkciA9IChfX2ZvcmNlIF9fYmUzMilpbmV0LT5pbmV0X2RhZGRyOwotCQkJc3BvcnQgPSAoX19mb3JjZSBfX2JlMTYpaW5ldC0+aW5ldF9zcG9ydDsKLQkJCWRwb3J0ID0gKF9fZm9yY2UgX19iZTE2KWluZXQtPmluZXRfZHBvcnQ7Ci0JCX0KLQotCQkvKiBYWFggc2lnaCwgaW5ldC0+IGRvZXNuJ3QgaGF2ZSBzcGFyc2UgYW5ub3RhdGlvbiBzbyBhbnkKLQkJICogdXNlIG9mIGl0IGhlcmUgZ2VuZXJhdGVzIGEgd2FybmluZyB3aXRoIC1XYml0d2lzZSAqLwotCQlzZXFfcHJpbnRmKHNlcSwgIiVwOlxuIgotCQkJICAgIiAga3JlZnM6ICAgICAgICAgICAlZFxuIgotCQkJICAgIiAgc29jazogICAgICAgICAgICAlcEk0OiV1IC0+ICIKLQkJCQkJICAgICAgIiVwSTQ6JXVcbiIKLQkJCSAgICIgIHJlbW90ZSBub2RlOiAgICAgJXNcbiIKLQkJCSAgICIgIHBhZ2Ugb2ZmOiAgICAgICAgJXp1XG4iCi0JCQkgICAiICBoYW5kc2hha2Ugb2s6ICAgICV1XG4iCi0JCQkgICAiICB0aW1lcjogICAgICAgICAgICVsdS4lbGRcbiIKLQkJCSAgICIgIGRhdGEgcmVhZHk6ICAgICAgJWx1LiVsZFxuIgotCQkJICAgIiAgYWR2YW5jZSBzdGFydDogICAlbHUuJWxkXG4iCi0JCQkgICAiICBhZHZhbmNlIHN0b3A6ICAgICVsdS4lbGRcbiIKLQkJCSAgICIgIGZ1bmMgc3RhcnQ6ICAgICAgJWx1LiVsZFxuIgotCQkJICAgIiAgZnVuYyBzdG9wOiAgICAgICAlbHUuJWxkXG4iCi0JCQkgICAiICBmdW5jIGtleTogICAgICAgICV1XG4iCi0JCQkgICAiICBmdW5jIHR5cGU6ICAgICAgICV1XG4iLAotCQkJICAgc2MsCi0JCQkgICBhdG9taWNfcmVhZCgmc2MtPnNjX2tyZWYucmVmY291bnQpLAotCQkJICAgJnNhZGRyLCBpbmV0ID8gbnRvaHMoc3BvcnQpIDogMCwKLQkJCSAgICZkYWRkciwgaW5ldCA/IG50b2hzKGRwb3J0KSA6IDAsCi0JCQkgICBzYy0+c2Nfbm9kZS0+bmRfbmFtZSwKLQkJCSAgIHNjLT5zY19wYWdlX29mZiwKLQkJCSAgIHNjLT5zY19oYW5kc2hha2Vfb2ssCi0JCQkgICBUVl9TRUNfVVNFQyhzYy0+c2NfdHZfdGltZXIpLAotCQkJICAgVFZfU0VDX1VTRUMoc2MtPnNjX3R2X2RhdGFfcmVhZHkpLAotCQkJICAgVFZfU0VDX1VTRUMoc2MtPnNjX3R2X2FkdmFuY2Vfc3RhcnQpLAotCQkJICAgVFZfU0VDX1VTRUMoc2MtPnNjX3R2X2FkdmFuY2Vfc3RvcCksCi0JCQkgICBUVl9TRUNfVVNFQyhzYy0+c2NfdHZfZnVuY19zdGFydCksCi0JCQkgICBUVl9TRUNfVVNFQyhzYy0+c2NfdHZfZnVuY19zdG9wKSwKLQkJCSAgIHNjLT5zY19tc2dfa2V5LAotCQkJICAgc2MtPnNjX21zZ190eXBlKTsKKwlpZiAoc2MpIHsKKwkJaWYgKHNkLT5kYmdfY3R4dCA9PSBTSE9XX1NPQ0tfQ09OVEFJTkVSUykKKwkJCXNjX3Nob3dfc29ja19jb250YWluZXIoc2VxLCBzYyk7CisJCWVsc2UKKwkJCXNjX3Nob3dfc29ja19zdGF0cyhzZXEsIHNjKTsKIAl9CiAKLQogCXNwaW5fdW5sb2NrKCZvMm5ldF9kZWJ1Z19sb2NrKTsKIAogCXJldHVybiAwOwpAQCAtMzUxLDcgKzQxMCw3IEBACiAJLnNob3cgPSBzY19zZXFfc2hvdywKIH07CiAKLXN0YXRpYyBpbnQgc2NfZm9wX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCitzdGF0aWMgaW50IHNjX2NvbW1vbl9vcGVuKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgbzJuZXRfc29ja19kZWJ1ZyAqc2QpCiB7CiAJc3RydWN0IG8ybmV0X3NvY2tfY29udGFpbmVyICpkdW1teV9zYzsKIAlzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcTsKQEAgLTM2OSw3ICs0MjgsOCBAQAogCQlnb3RvIG91dDsKIAogCXNlcSA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlzZXEtPnByaXZhdGUgPSBkdW1teV9zYzsKKwlzZXEtPnByaXZhdGUgPSBzZDsKKwlzZC0+ZGJnX3NvY2sgPSBkdW1teV9zYzsKIAlvMm5ldF9kZWJ1Z19hZGRfc2MoZHVtbXlfc2MpOwogCiAJZHVtbXlfc2MgPSBOVUxMOwpAQCAtMzgyLDEyICs0NDIsNDggQEAKIHN0YXRpYyBpbnQgc2NfZm9wX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCiB7CiAJc3RydWN0IHNlcV9maWxlICpzZXEgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IG8ybmV0X3NvY2tfY29udGFpbmVyICpkdW1teV9zYyA9IHNlcS0+cHJpdmF0ZTsKKwlzdHJ1Y3QgbzJuZXRfc29ja19kZWJ1ZyAqc2QgPSBzZXEtPnByaXZhdGU7CisJc3RydWN0IG8ybmV0X3NvY2tfY29udGFpbmVyICpkdW1teV9zYyA9IHNkLT5kYmdfc29jazsKIAogCW8ybmV0X2RlYnVnX2RlbF9zYyhkdW1teV9zYyk7CiAJcmV0dXJuIHNlcV9yZWxlYXNlX3ByaXZhdGUoaW5vZGUsIGZpbGUpOwogfQogCitzdGF0aWMgaW50IHN0YXRzX2ZvcF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBvMm5ldF9zb2NrX2RlYnVnICpzZDsKKworCXNkID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IG8ybmV0X3NvY2tfZGVidWcpLCBHRlBfS0VSTkVMKTsKKwlpZiAoc2QgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlzZC0+ZGJnX2N0eHQgPSBTSE9XX1NPQ0tfU1RBVFM7CisJc2QtPmRiZ19zb2NrID0gTlVMTDsKKworCXJldHVybiBzY19jb21tb25fb3BlbihmaWxlLCBzZCk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHN0YXRzX3NlcV9mb3BzID0geworCS5vcGVuID0gc3RhdHNfZm9wX29wZW4sCisJLnJlYWQgPSBzZXFfcmVhZCwKKwkubGxzZWVrID0gc2VxX2xzZWVrLAorCS5yZWxlYXNlID0gc2NfZm9wX3JlbGVhc2UsCit9OworCitzdGF0aWMgaW50IHNjX2ZvcF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBvMm5ldF9zb2NrX2RlYnVnICpzZDsKKworCXNkID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IG8ybmV0X3NvY2tfZGVidWcpLCBHRlBfS0VSTkVMKTsKKwlpZiAoc2QgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlzZC0+ZGJnX2N0eHQgPSBTSE9XX1NPQ0tfQ09OVEFJTkVSUzsKKwlzZC0+ZGJnX3NvY2sgPSBOVUxMOworCisJcmV0dXJuIHNjX2NvbW1vbl9vcGVuKGZpbGUsIHNkKTsKK30KKwogc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgc2Nfc2VxX2ZvcHMgPSB7CiAJLm9wZW4gPSBzY19mb3Bfb3BlbiwKIAkucmVhZCA9IHNlcV9yZWFkLApAQCAtNDE5LDI1ICs1MTUsMjkgQEAKIAkJZ290byBiYWlsOwogCX0KIAorCXN0YXRzX2RlbnRyeSA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoU1RBVFNfREVCVUdfTkFNRSwgU19JRlJFR3xTX0lSVVNSLAorCQkJCQkgICBvMm5ldF9kZW50cnksIE5VTEwsCisJCQkJCSAgICZzdGF0c19zZXFfZm9wcyk7CisJaWYgKCFzdGF0c19kZW50cnkpIHsKKwkJbWxvZ19lcnJubygtRU5PTUVNKTsKKwkJZ290byBiYWlsOworCX0KKwogCXJldHVybiAwOwogYmFpbDoKLQlpZiAoc2NfZGVudHJ5KQotCQlkZWJ1Z2ZzX3JlbW92ZShzY19kZW50cnkpOwotCWlmIChuc3RfZGVudHJ5KQotCQlkZWJ1Z2ZzX3JlbW92ZShuc3RfZGVudHJ5KTsKLQlpZiAobzJuZXRfZGVudHJ5KQotCQlkZWJ1Z2ZzX3JlbW92ZShvMm5ldF9kZW50cnkpOworCWRlYnVnZnNfcmVtb3ZlKHN0YXRzX2RlbnRyeSk7CisJZGVidWdmc19yZW1vdmUoc2NfZGVudHJ5KTsKKwlkZWJ1Z2ZzX3JlbW92ZShuc3RfZGVudHJ5KTsKKwlkZWJ1Z2ZzX3JlbW92ZShvMm5ldF9kZW50cnkpOwogCXJldHVybiAtRU5PTUVNOwogfQogCiB2b2lkIG8ybmV0X2RlYnVnZnNfZXhpdCh2b2lkKQogewotCWlmIChzY19kZW50cnkpCi0JCWRlYnVnZnNfcmVtb3ZlKHNjX2RlbnRyeSk7Ci0JaWYgKG5zdF9kZW50cnkpCi0JCWRlYnVnZnNfcmVtb3ZlKG5zdF9kZW50cnkpOwotCWlmIChvMm5ldF9kZW50cnkpCi0JCWRlYnVnZnNfcmVtb3ZlKG8ybmV0X2RlbnRyeSk7CisJZGVidWdmc19yZW1vdmUoc3RhdHNfZGVudHJ5KTsKKwlkZWJ1Z2ZzX3JlbW92ZShzY19kZW50cnkpOworCWRlYnVnZnNfcmVtb3ZlKG5zdF9kZW50cnkpOworCWRlYnVnZnNfcmVtb3ZlKG8ybmV0X2RlbnRyeSk7CiB9CiAKICNlbmRpZgkvKiBDT05GSUdfREVCVUdfRlMgKi8KZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2NsdXN0ZXIvdGNwLmMgYi9mcy9vY2ZzMi9jbHVzdGVyL3RjcC5jCmluZGV4IDlhYTQyNmUuLjNiMTFjYjEgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL2NsdXN0ZXIvdGNwLmMKKysrIGIvZnMvb2NmczIvY2x1c3Rlci90Y3AuYwpAQCAtMTUzLDYzICsxNTMsMTE0IEBACiAJbnN0LT5zdF9ub2RlID0gbm9kZTsKIH0KIAotc3RhdGljIHZvaWQgbzJuZXRfc2V0X25zdF9zb2NrX3RpbWUoc3RydWN0IG8ybmV0X3NlbmRfdHJhY2tpbmcgKm5zdCkKLXsKLQlkb19nZXR0aW1lb2ZkYXkoJm5zdC0+c3Rfc29ja190aW1lKTsKLX0KLQotc3RhdGljIHZvaWQgbzJuZXRfc2V0X25zdF9zZW5kX3RpbWUoc3RydWN0IG8ybmV0X3NlbmRfdHJhY2tpbmcgKm5zdCkKLXsKLQlkb19nZXR0aW1lb2ZkYXkoJm5zdC0+c3Rfc2VuZF90aW1lKTsKLX0KLQotc3RhdGljIHZvaWQgbzJuZXRfc2V0X25zdF9zdGF0dXNfdGltZShzdHJ1Y3QgbzJuZXRfc2VuZF90cmFja2luZyAqbnN0KQotewotCWRvX2dldHRpbWVvZmRheSgmbnN0LT5zdF9zdGF0dXNfdGltZSk7Ci19Ci0KLXN0YXRpYyB2b2lkIG8ybmV0X3NldF9uc3Rfc29ja19jb250YWluZXIoc3RydWN0IG8ybmV0X3NlbmRfdHJhY2tpbmcgKm5zdCwKLQkJCQkJIHN0cnVjdCBvMm5ldF9zb2NrX2NvbnRhaW5lciAqc2MpCi17Ci0JbnN0LT5zdF9zYyA9IHNjOwotfQotCi1zdGF0aWMgdm9pZCBvMm5ldF9zZXRfbnN0X21zZ19pZChzdHJ1Y3QgbzJuZXRfc2VuZF90cmFja2luZyAqbnN0LCB1MzIgbXNnX2lkKQotewotCW5zdC0+c3RfaWQgPSBtc2dfaWQ7Ci19Ci0KLSNlbHNlICAvKiBDT05GSUdfREVCVUdfRlMgKi8KLQotc3RhdGljIGlubGluZSB2b2lkIG8ybmV0X2luaXRfbnN0KHN0cnVjdCBvMm5ldF9zZW5kX3RyYWNraW5nICpuc3QsIHUzMiBtc2d0eXBlLAotCQkJCSAgdTMyIG1zZ2tleSwgc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCB1OCBub2RlKQotewotfQotCiBzdGF0aWMgaW5saW5lIHZvaWQgbzJuZXRfc2V0X25zdF9zb2NrX3RpbWUoc3RydWN0IG8ybmV0X3NlbmRfdHJhY2tpbmcgKm5zdCkKIHsKKwluc3QtPnN0X3NvY2tfdGltZSA9IGt0aW1lX2dldCgpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgbzJuZXRfc2V0X25zdF9zZW5kX3RpbWUoc3RydWN0IG8ybmV0X3NlbmRfdHJhY2tpbmcgKm5zdCkKIHsKKwluc3QtPnN0X3NlbmRfdGltZSA9IGt0aW1lX2dldCgpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgbzJuZXRfc2V0X25zdF9zdGF0dXNfdGltZShzdHJ1Y3QgbzJuZXRfc2VuZF90cmFja2luZyAqbnN0KQogeworCW5zdC0+c3Rfc3RhdHVzX3RpbWUgPSBrdGltZV9nZXQoKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIG8ybmV0X3NldF9uc3Rfc29ja19jb250YWluZXIoc3RydWN0IG8ybmV0X3NlbmRfdHJhY2tpbmcgKm5zdCwKIAkJCQkJCXN0cnVjdCBvMm5ldF9zb2NrX2NvbnRhaW5lciAqc2MpCiB7CisJbnN0LT5zdF9zYyA9IHNjOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgbzJuZXRfc2V0X25zdF9tc2dfaWQoc3RydWN0IG8ybmV0X3NlbmRfdHJhY2tpbmcgKm5zdCwKIAkJCQkJdTMyIG1zZ19pZCkKIHsKKwluc3QtPnN0X2lkID0gbXNnX2lkOwogfQogCitzdGF0aWMgaW5saW5lIHZvaWQgbzJuZXRfc2V0X3NvY2tfdGltZXIoc3RydWN0IG8ybmV0X3NvY2tfY29udGFpbmVyICpzYykKK3sKKwlzYy0+c2NfdHZfdGltZXIgPSBrdGltZV9nZXQoKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG8ybmV0X3NldF9kYXRhX3JlYWR5X3RpbWUoc3RydWN0IG8ybmV0X3NvY2tfY29udGFpbmVyICpzYykKK3sKKwlzYy0+c2NfdHZfZGF0YV9yZWFkeSA9IGt0aW1lX2dldCgpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbzJuZXRfc2V0X2FkdmFuY2Vfc3RhcnRfdGltZShzdHJ1Y3QgbzJuZXRfc29ja19jb250YWluZXIgKnNjKQoreworCXNjLT5zY190dl9hZHZhbmNlX3N0YXJ0ID0ga3RpbWVfZ2V0KCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBvMm5ldF9zZXRfYWR2YW5jZV9zdG9wX3RpbWUoc3RydWN0IG8ybmV0X3NvY2tfY29udGFpbmVyICpzYykKK3sKKwlzYy0+c2NfdHZfYWR2YW5jZV9zdG9wID0ga3RpbWVfZ2V0KCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBvMm5ldF9zZXRfZnVuY19zdGFydF90aW1lKHN0cnVjdCBvMm5ldF9zb2NrX2NvbnRhaW5lciAqc2MpCit7CisJc2MtPnNjX3R2X2Z1bmNfc3RhcnQgPSBrdGltZV9nZXQoKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG8ybmV0X3NldF9mdW5jX3N0b3BfdGltZShzdHJ1Y3QgbzJuZXRfc29ja19jb250YWluZXIgKnNjKQoreworCXNjLT5zY190dl9mdW5jX3N0b3AgPSBrdGltZV9nZXQoKTsKK30KKworc3RhdGljIGt0aW1lX3QgbzJuZXRfZ2V0X2Z1bmNfcnVuX3RpbWUoc3RydWN0IG8ybmV0X3NvY2tfY29udGFpbmVyICpzYykKK3sKKwlyZXR1cm4ga3RpbWVfc3ViKHNjLT5zY190dl9mdW5jX3N0b3AsIHNjLT5zY190dl9mdW5jX3N0YXJ0KTsKK30KKyNlbHNlICAvKiBDT05GSUdfREVCVUdfRlMgKi8KKyMgZGVmaW5lIG8ybmV0X2luaXRfbnN0KGEsIGIsIGMsIGQsIGUpCisjIGRlZmluZSBvMm5ldF9zZXRfbnN0X3NvY2tfdGltZShhKQorIyBkZWZpbmUgbzJuZXRfc2V0X25zdF9zZW5kX3RpbWUoYSkKKyMgZGVmaW5lIG8ybmV0X3NldF9uc3Rfc3RhdHVzX3RpbWUoYSkKKyMgZGVmaW5lIG8ybmV0X3NldF9uc3Rfc29ja19jb250YWluZXIoYSwgYikKKyMgZGVmaW5lIG8ybmV0X3NldF9uc3RfbXNnX2lkKGEsIGIpCisjIGRlZmluZSBvMm5ldF9zZXRfc29ja190aW1lcihhKQorIyBkZWZpbmUgbzJuZXRfc2V0X2RhdGFfcmVhZHlfdGltZShhKQorIyBkZWZpbmUgbzJuZXRfc2V0X2FkdmFuY2Vfc3RhcnRfdGltZShhKQorIyBkZWZpbmUgbzJuZXRfc2V0X2FkdmFuY2Vfc3RvcF90aW1lKGEpCisjIGRlZmluZSBvMm5ldF9zZXRfZnVuY19zdGFydF90aW1lKGEpCisjIGRlZmluZSBvMm5ldF9zZXRfZnVuY19zdG9wX3RpbWUoYSkKKyMgZGVmaW5lIG8ybmV0X2dldF9mdW5jX3J1bl90aW1lKGEpCQkoa3RpbWVfdCkwCiAjZW5kaWYgLyogQ09ORklHX0RFQlVHX0ZTICovCiAKKyNpZmRlZiBDT05GSUdfT0NGUzJfRlNfU1RBVFMKK3N0YXRpYyB2b2lkIG8ybmV0X3VwZGF0ZV9zZW5kX3N0YXRzKHN0cnVjdCBvMm5ldF9zZW5kX3RyYWNraW5nICpuc3QsCisJCQkJICAgIHN0cnVjdCBvMm5ldF9zb2NrX2NvbnRhaW5lciAqc2MpCit7CisJc2MtPnNjX3R2X3N0YXR1c190b3RhbCA9IGt0aW1lX2FkZChzYy0+c2NfdHZfc3RhdHVzX3RvdGFsLAorCQkJCQkgICBrdGltZV9zdWIoa3RpbWVfZ2V0KCksCisJCQkJCQkgICAgIG5zdC0+c3Rfc3RhdHVzX3RpbWUpKTsKKwlzYy0+c2NfdHZfc2VuZF90b3RhbCA9IGt0aW1lX2FkZChzYy0+c2NfdHZfc2VuZF90b3RhbCwKKwkJCQkJIGt0aW1lX3N1Yihuc3QtPnN0X3N0YXR1c190aW1lLAorCQkJCQkJICAgbnN0LT5zdF9zZW5kX3RpbWUpKTsKKwlzYy0+c2NfdHZfYWNxdWlyeV90b3RhbCA9IGt0aW1lX2FkZChzYy0+c2NfdHZfYWNxdWlyeV90b3RhbCwKKwkJCQkJICAgIGt0aW1lX3N1Yihuc3QtPnN0X3NlbmRfdGltZSwKKwkJCQkJCSAgICAgIG5zdC0+c3Rfc29ja190aW1lKSk7CisJc2MtPnNjX3NlbmRfY291bnQrKzsKK30KKworc3RhdGljIHZvaWQgbzJuZXRfdXBkYXRlX3JlY3Zfc3RhdHMoc3RydWN0IG8ybmV0X3NvY2tfY29udGFpbmVyICpzYykKK3sKKwlzYy0+c2NfdHZfcHJvY2Vzc190b3RhbCA9IGt0aW1lX2FkZChzYy0+c2NfdHZfcHJvY2Vzc190b3RhbCwKKwkJCQkJICAgIG8ybmV0X2dldF9mdW5jX3J1bl90aW1lKHNjKSk7CisJc2MtPnNjX3JlY3ZfY291bnQrKzsKK30KKworI2Vsc2UKKworIyBkZWZpbmUgbzJuZXRfdXBkYXRlX3NlbmRfc3RhdHMoYSwgYikKKworIyBkZWZpbmUgbzJuZXRfdXBkYXRlX3JlY3Zfc3RhdHMoc2MpCisKKyNlbmRpZiAvKiBDT05GSUdfT0NGUzJfRlNfU1RBVFMgKi8KKwogc3RhdGljIGlubGluZSBpbnQgbzJuZXRfcmVjb25uZWN0X2RlbGF5KHZvaWQpCiB7CiAJcmV0dXJuIG8ybm1fc2luZ2xlX2NsdXN0ZXItPmNsX3JlY29ubmVjdF9kZWxheV9tczsKQEAgLTM1NSw2ICs0MDYsNyBAQAogCQlzYy0+c2Nfc29jayA9IE5VTEw7CiAJfQogCisJbzJubV91bmRlcGVuZF9pdGVtKCZzYy0+c2Nfbm9kZS0+bmRfaXRlbSk7CiAJbzJubV9ub2RlX3B1dChzYy0+c2Nfbm9kZSk7CiAJc2MtPnNjX25vZGUgPSBOVUxMOwogCkBAIC0zNzYsNiArNDI4LDcgQEAKIHsKIAlzdHJ1Y3QgbzJuZXRfc29ja19jb250YWluZXIgKnNjLCAqcmV0ID0gTlVMTDsKIAlzdHJ1Y3QgcGFnZSAqcGFnZSA9IE5VTEw7CisJaW50IHN0YXR1cyA9IDA7CiAKIAlwYWdlID0gYWxsb2NfcGFnZShHRlBfTk9GUyk7CiAJc2MgPSBremFsbG9jKHNpemVvZigqc2MpLCBHRlBfTk9GUyk7CkBAIC0zODYsNiArNDM5LDEzIEBACiAJbzJubV9ub2RlX2dldChub2RlKTsKIAlzYy0+c2Nfbm9kZSA9IG5vZGU7CiAKKwkvKiBwaW4gdGhlIG5vZGUgaXRlbSBvZiB0aGUgcmVtb3RlIG5vZGUgKi8KKwlzdGF0dXMgPSBvMm5tX2RlcGVuZF9pdGVtKCZub2RlLT5uZF9pdGVtKTsKKwlpZiAoc3RhdHVzKSB7CisJCW1sb2dfZXJybm8oc3RhdHVzKTsKKwkJbzJubV9ub2RlX3B1dChub2RlKTsKKwkJZ290byBvdXQ7CisJfQogCUlOSVRfV09SSygmc2MtPnNjX2Nvbm5lY3Rfd29yaywgbzJuZXRfc2NfY29ubmVjdF9jb21wbGV0ZWQpOwogCUlOSVRfV09SSygmc2MtPnNjX3J4X3dvcmssIG8ybmV0X3J4X3VudGlsX2VtcHR5KTsKIAlJTklUX1dPUksoJnNjLT5zY19zaHV0ZG93bl93b3JrLCBvMm5ldF9zaHV0ZG93bl9zYyk7CkBAIC01NDYsNyArNjA2LDcgQEAKIAlpZiAoc2stPnNrX3VzZXJfZGF0YSkgewogCQlzdHJ1Y3QgbzJuZXRfc29ja19jb250YWluZXIgKnNjID0gc2stPnNrX3VzZXJfZGF0YTsKIAkJc2Nsb2coc2MsICJkYXRhX3JlYWR5IGhpdFxuIik7Ci0JCWRvX2dldHRpbWVvZmRheSgmc2MtPnNjX3R2X2RhdGFfcmVhZHkpOworCQlvMm5ldF9zZXRfZGF0YV9yZWFkeV90aW1lKHNjKTsKIAkJbzJuZXRfc2NfcXVldWVfd29yayhzYywgJnNjLT5zY19yeF93b3JrKTsKIAkJcmVhZHkgPSBzYy0+c2NfZGF0YV9yZWFkeTsKIAl9IGVsc2UgewpAQCAtMTA3MCw2ICsxMTMwLDggQEAKIAlvMm5ldF9zZXRfbnN0X3N0YXR1c190aW1lKCZuc3QpOwogCXdhaXRfZXZlbnQobnN3Lm5zX3dxLCBvMm5ldF9uc3dfY29tcGxldGVkKG5uLCAmbnN3KSk7CiAKKwlvMm5ldF91cGRhdGVfc2VuZF9zdGF0cygmbnN0LCBzYyk7CisKIAkvKiBOb3RlIHRoYXQgd2UgYXZvaWQgb3ZlcndyaXRpbmcgdGhlIGNhbGxlcnMgc3RhdHVzIHJldHVybgogCSAqIHZhcmlhYmxlIGlmIGEgc3lzdGVtIGVycm9yIHdhcyByZXBvcnRlZCBvbiB0aGUgb3RoZXIKIAkgKiBzaWRlLiBDYWxsZXJzIGJld2FyZS4gKi8KQEAgLTExODMsMTMgKzEyNDUsMTUgQEAKIAlpZiAoc3lzZXJyICE9IE8yTkVUX0VSUl9OT05FKQogCQlnb3RvIG91dF9yZXNwb25kOwogCi0JZG9fZ2V0dGltZW9mZGF5KCZzYy0+c2NfdHZfZnVuY19zdGFydCk7CisJbzJuZXRfc2V0X2Z1bmNfc3RhcnRfdGltZShzYyk7CiAJc2MtPnNjX21zZ19rZXkgPSBiZTMyX3RvX2NwdShoZHItPmtleSk7CiAJc2MtPnNjX21zZ190eXBlID0gYmUxNl90b19jcHUoaGRyLT5tc2dfdHlwZSk7CiAJaGFuZGxlcl9zdGF0dXMgPSAobm1oLT5uaF9mdW5jKShoZHIsIHNpemVvZihzdHJ1Y3QgbzJuZXRfbXNnKSArCiAJCQkJCSAgICAgYmUxNl90b19jcHUoaGRyLT5kYXRhX2xlbiksCiAJCQkJCW5taC0+bmhfZnVuY19kYXRhLCAmcmV0X2RhdGEpOwotCWRvX2dldHRpbWVvZmRheSgmc2MtPnNjX3R2X2Z1bmNfc3RvcCk7CisJbzJuZXRfc2V0X2Z1bmNfc3RvcF90aW1lKHNjKTsKKworCW8ybmV0X3VwZGF0ZV9yZWN2X3N0YXRzKHNjKTsKIAogb3V0X3Jlc3BvbmQ6CiAJLyogdGhpcyBkZXN0cm95cyB0aGUgaGRyLCBzbyBkb24ndCB1c2UgaXQgYWZ0ZXIgdGhpcyAqLwpAQCAtMTMwMCw3ICsxMzY0LDcgQEAKIAlzaXplX3QgZGF0YWxlbjsKIAogCXNjbG9nKHNjLCAicmVjZWl2aW5nXG4iKTsKLQlkb19nZXR0aW1lb2ZkYXkoJnNjLT5zY190dl9hZHZhbmNlX3N0YXJ0KTsKKwlvMm5ldF9zZXRfYWR2YW5jZV9zdGFydF90aW1lKHNjKTsKIAogCWlmICh1bmxpa2VseShzYy0+c2NfaGFuZHNoYWtlX29rID09IDApKSB7CiAJCWlmKHNjLT5zY19wYWdlX29mZiA8IHNpemVvZihzdHJ1Y3QgbzJuZXRfaGFuZHNoYWtlKSkgewpAQCAtMTM3NSw3ICsxNDM5LDcgQEAKIAogb3V0OgogCXNjbG9nKHNjLCAicmV0ID0gJWRcbiIsIHJldCk7Ci0JZG9fZ2V0dGltZW9mZGF5KCZzYy0+c2NfdHZfYWR2YW5jZV9zdG9wKTsKKwlvMm5ldF9zZXRfYWR2YW5jZV9zdG9wX3RpbWUoc2MpOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTE0NzUsMjcgKzE1MzksMjggQEAKIHsKIAlzdHJ1Y3QgbzJuZXRfc29ja19jb250YWluZXIgKnNjID0gKHN0cnVjdCBvMm5ldF9zb2NrX2NvbnRhaW5lciAqKWRhdGE7CiAJc3RydWN0IG8ybmV0X25vZGUgKm5uID0gbzJuZXRfbm5fZnJvbV9udW0oc2MtPnNjX25vZGUtPm5kX251bSk7Ci0Jc3RydWN0IHRpbWV2YWwgbm93OwogCi0JZG9fZ2V0dGltZW9mZGF5KCZub3cpOworI2lmZGVmIENPTkZJR19ERUJVR19GUworCWt0aW1lX3Qgbm93ID0ga3RpbWVfZ2V0KCk7CisjZW5kaWYKIAogCXByaW50ayhLRVJOX05PVElDRSAibzJuZXQ6IGNvbm5lY3Rpb24gdG8gIiBTQ19OT0RFRl9GTVQgIiBoYXMgYmVlbiBpZGxlIGZvciAldS4ldSAiCiAJICAgICAic2Vjb25kcywgc2h1dHRpbmcgaXQgZG93bi5cbiIsIFNDX05PREVGX0FSR1Moc2MpLAogCQkgICAgIG8ybmV0X2lkbGVfdGltZW91dCgpIC8gMTAwMCwKIAkJICAgICBvMm5ldF9pZGxlX3RpbWVvdXQoKSAlIDEwMDApOwotCW1sb2coTUxfTk9USUNFLCAiaGVyZSBhcmUgc29tZSB0aW1lcyB0aGF0IG1pZ2h0IGhlbHAgZGVidWcgdGhlICIKLQkgICAgICJzaXR1YXRpb246ICh0bXIgJWxkLiVsZCBub3cgJWxkLiVsZCBkciAlbGQuJWxkIGFkdiAiCi0JICAgICAiJWxkLiVsZDolbGQuJWxkIGZ1bmMgKCUwOHg6JXUpICVsZC4lbGQ6JWxkLiVsZClcbiIsCi0JICAgICBzYy0+c2NfdHZfdGltZXIudHZfc2VjLCAobG9uZykgc2MtPnNjX3R2X3RpbWVyLnR2X3VzZWMsCi0JICAgICBub3cudHZfc2VjLCAobG9uZykgbm93LnR2X3VzZWMsCi0JICAgICBzYy0+c2NfdHZfZGF0YV9yZWFkeS50dl9zZWMsIChsb25nKSBzYy0+c2NfdHZfZGF0YV9yZWFkeS50dl91c2VjLAotCSAgICAgc2MtPnNjX3R2X2FkdmFuY2Vfc3RhcnQudHZfc2VjLAotCSAgICAgKGxvbmcpIHNjLT5zY190dl9hZHZhbmNlX3N0YXJ0LnR2X3VzZWMsCi0JICAgICBzYy0+c2NfdHZfYWR2YW5jZV9zdG9wLnR2X3NlYywKLQkgICAgIChsb25nKSBzYy0+c2NfdHZfYWR2YW5jZV9zdG9wLnR2X3VzZWMsCisKKyNpZmRlZiBDT05GSUdfREVCVUdfRlMKKwltbG9nKE1MX05PVElDRSwgIkhlcmUgYXJlIHNvbWUgdGltZXMgdGhhdCBtaWdodCBoZWxwIGRlYnVnIHRoZSAiCisJICAgICAic2l0dWF0aW9uOiAoVGltZXI6ICVsbGQsIE5vdyAlbGxkLCBEYXRhUmVhZHkgJWxsZCwgQWR2YW5jZSAlbGxkLSVsbGQsICIKKwkgICAgICJLZXkgMHglMDh4LCBGdW5jICV1LCBGdW5jVGltZSAlbGxkLSVsbGQpXG4iLAorCSAgICAgKGxvbmcgbG9uZylrdGltZV90b191cyhzYy0+c2NfdHZfdGltZXIpLCAobG9uZyBsb25nKWt0aW1lX3RvX3VzKG5vdyksCisJICAgICAobG9uZyBsb25nKWt0aW1lX3RvX3VzKHNjLT5zY190dl9kYXRhX3JlYWR5KSwKKwkgICAgIChsb25nIGxvbmcpa3RpbWVfdG9fdXMoc2MtPnNjX3R2X2FkdmFuY2Vfc3RhcnQpLAorCSAgICAgKGxvbmcgbG9uZylrdGltZV90b191cyhzYy0+c2NfdHZfYWR2YW5jZV9zdG9wKSwKIAkgICAgIHNjLT5zY19tc2dfa2V5LCBzYy0+c2NfbXNnX3R5cGUsCi0JICAgICBzYy0+c2NfdHZfZnVuY19zdGFydC50dl9zZWMsIChsb25nKSBzYy0+c2NfdHZfZnVuY19zdGFydC50dl91c2VjLAotCSAgICAgc2MtPnNjX3R2X2Z1bmNfc3RvcC50dl9zZWMsIChsb25nKSBzYy0+c2NfdHZfZnVuY19zdG9wLnR2X3VzZWMpOworCSAgICAgKGxvbmcgbG9uZylrdGltZV90b191cyhzYy0+c2NfdHZfZnVuY19zdGFydCksCisJICAgICAobG9uZyBsb25nKWt0aW1lX3RvX3VzKHNjLT5zY190dl9mdW5jX3N0b3ApKTsKKyNlbmRpZgogCiAJLyoKIAkgKiBJbml0aWFsaXplIHRoZSBubl90aW1lb3V0IHNvIHRoYXQgdGhlIG5leHQgY29ubmVjdGlvbiBhdHRlbXB0CkBAIC0xNTExLDcgKzE1NzYsNyBAQAogCW8ybmV0X3NjX2NhbmNlbF9kZWxheWVkX3dvcmsoc2MsICZzYy0+c2Nfa2VlcGFsaXZlX3dvcmspOwogCW8ybmV0X3NjX3F1ZXVlX2RlbGF5ZWRfd29yayhzYywgJnNjLT5zY19rZWVwYWxpdmVfd29yaywKIAkJICAgICAgbXNlY3NfdG9famlmZmllcyhvMm5ldF9rZWVwYWxpdmVfZGVsYXkoKSkpOwotCWRvX2dldHRpbWVvZmRheSgmc2MtPnNjX3R2X3RpbWVyKTsKKwlvMm5ldF9zZXRfc29ja190aW1lcihzYyk7CiAJbW9kX3RpbWVyKCZzYy0+c2NfaWRsZV90aW1lb3V0LAogCSAgICAgICBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyhvMm5ldF9pZGxlX3RpbWVvdXQoKSkpOwogfQpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvY2x1c3Rlci90Y3BfaW50ZXJuYWwuaCBiL2ZzL29jZnMyL2NsdXN0ZXIvdGNwX2ludGVybmFsLmgKaW5kZXggMTVmZGJkZi4uNGNiY2I2NSAxMDA2NDQKLS0tIGEvZnMvb2NmczIvY2x1c3Rlci90Y3BfaW50ZXJuYWwuaAorKysgYi9mcy9vY2ZzMi9jbHVzdGVyL3RjcF9pbnRlcm5hbC5oCkBAIC0xNjYsMTggKzE2NiwyNyBAQAogCS8qIG9yaWdpbmFsIGhhbmRsZXJzIGZvciB0aGUgc29ja2V0cyAqLwogCXZvaWQJCQkoKnNjX3N0YXRlX2NoYW5nZSkoc3RydWN0IHNvY2sgKnNrKTsKIAl2b2lkCQkJKCpzY19kYXRhX3JlYWR5KShzdHJ1Y3Qgc29jayAqc2ssIGludCBieXRlcyk7Ci0jaWZkZWYgQ09ORklHX0RFQlVHX0ZTCi0Jc3RydWN0IGxpc3RfaGVhZCAgICAgICAgc2NfbmV0X2RlYnVnX2l0ZW07Ci0jZW5kaWYKLQlzdHJ1Y3QgdGltZXZhbCAJCXNjX3R2X3RpbWVyOwotCXN0cnVjdCB0aW1ldmFsIAkJc2NfdHZfZGF0YV9yZWFkeTsKLQlzdHJ1Y3QgdGltZXZhbCAJCXNjX3R2X2FkdmFuY2Vfc3RhcnQ7Ci0Jc3RydWN0IHRpbWV2YWwgCQlzY190dl9hZHZhbmNlX3N0b3A7Ci0Jc3RydWN0IHRpbWV2YWwgCQlzY190dl9mdW5jX3N0YXJ0OwotCXN0cnVjdCB0aW1ldmFsIAkJc2NfdHZfZnVuY19zdG9wOworCiAJdTMyCQkJc2NfbXNnX2tleTsKIAl1MTYJCQlzY19tc2dfdHlwZTsKIAorI2lmZGVmIENPTkZJR19ERUJVR19GUworCXN0cnVjdCBsaXN0X2hlYWQgICAgICAgIHNjX25ldF9kZWJ1Z19pdGVtOworCWt0aW1lX3QJCQlzY190dl90aW1lcjsKKwlrdGltZV90CQkJc2NfdHZfZGF0YV9yZWFkeTsKKwlrdGltZV90CQkJc2NfdHZfYWR2YW5jZV9zdGFydDsKKwlrdGltZV90CQkJc2NfdHZfYWR2YW5jZV9zdG9wOworCWt0aW1lX3QJCQlzY190dl9mdW5jX3N0YXJ0OworCWt0aW1lX3QJCQlzY190dl9mdW5jX3N0b3A7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfT0NGUzJfRlNfU1RBVFMKKwlrdGltZV90CQkJc2NfdHZfYWNxdWlyeV90b3RhbDsKKwlrdGltZV90CQkJc2NfdHZfc2VuZF90b3RhbDsKKwlrdGltZV90CQkJc2NfdHZfc3RhdHVzX3RvdGFsOworCXUzMgkJCXNjX3NlbmRfY291bnQ7CisJdTMyCQkJc2NfcmVjdl9jb3VudDsKKwlrdGltZV90CQkJc2NfdHZfcHJvY2Vzc190b3RhbDsKKyNlbmRpZgogCXN0cnVjdCBtdXRleAkJc2Nfc2VuZF9sb2NrOwogfTsKIApAQCAtMjIwLDkgKzIyOSw5IEBACiAJdTMyCQkJCXN0X21zZ190eXBlOwogCXUzMgkJCQlzdF9tc2dfa2V5OwogCXU4CQkJCXN0X25vZGU7Ci0Jc3RydWN0IHRpbWV2YWwJCQlzdF9zb2NrX3RpbWU7Ci0Jc3RydWN0IHRpbWV2YWwJCQlzdF9zZW5kX3RpbWU7Ci0Jc3RydWN0IHRpbWV2YWwJCQlzdF9zdGF0dXNfdGltZTsKKwlrdGltZV90CQkJCXN0X3NvY2tfdGltZTsKKwlrdGltZV90CQkJCXN0X3NlbmRfdGltZTsKKwlrdGltZV90CQkJCXN0X3N0YXR1c190aW1lOwogfTsKICNlbHNlCiBzdHJ1Y3QgbzJuZXRfc2VuZF90cmFja2luZyB7CmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9kbG0vZGxtYXN0LmMgYi9mcy9vY2ZzMi9kbG0vZGxtYXN0LmMKaW5kZXggZjQ0OTk5MS4uM2EzZWQ0YiAxMDA2NDQKLS0tIGEvZnMvb2NmczIvZGxtL2RsbWFzdC5jCisrKyBiL2ZzL29jZnMyL2RsbS9kbG1hc3QuYwpAQCAtOTAsMTkgKzkwLDI5IEBACiAKIHZvaWQgX19kbG1fcXVldWVfYXN0KHN0cnVjdCBkbG1fY3R4dCAqZGxtLCBzdHJ1Y3QgZGxtX2xvY2sgKmxvY2spCiB7Ci0JbWxvZ19lbnRyeV92b2lkKCk7CisJc3RydWN0IGRsbV9sb2NrX3Jlc291cmNlICpyZXM7CiAKIAlCVUdfT04oIWRsbSk7CiAJQlVHX09OKCFsb2NrKTsKIAorCXJlcyA9IGxvY2stPmxvY2tyZXM7CisKIAlhc3NlcnRfc3Bpbl9sb2NrZWQoJmRsbS0+YXN0X2xvY2spOworCiAJaWYgKCFsaXN0X2VtcHR5KCZsb2NrLT5hc3RfbGlzdCkpIHsKLQkJbWxvZyhNTF9FUlJPUiwgImFzdCBsaXN0IG5vdCBlbXB0eSEhICBwZW5kaW5nPSVkLCBuZXdsZXZlbD0lZFxuIiwKKwkJbWxvZyhNTF9FUlJPUiwgIiVzOiByZXMgJS4qcywgbG9jayAldTolbGx1LCAiCisJCSAgICAgIkFTVCBsaXN0IG5vdCBlbXB0eSwgcGVuZGluZyAlZCwgbmV3bGV2ZWwgJWRcbiIsCisJCSAgICAgZGxtLT5uYW1lLCByZXMtPmxvY2tuYW1lLmxlbiwgcmVzLT5sb2NrbmFtZS5uYW1lLAorCQkgICAgIGRsbV9nZXRfbG9ja19jb29raWVfbm9kZShiZTY0X3RvX2NwdShsb2NrLT5tbC5jb29raWUpKSwKKwkJICAgICBkbG1fZ2V0X2xvY2tfY29va2llX3NlcShiZTY0X3RvX2NwdShsb2NrLT5tbC5jb29raWUpKSwKIAkJICAgICBsb2NrLT5hc3RfcGVuZGluZywgbG9jay0+bWwudHlwZSk7CiAJCUJVRygpOwogCX0KIAlpZiAobG9jay0+YXN0X3BlbmRpbmcpCi0JCW1sb2coMCwgImxvY2sgaGFzIGFuIGFzdCBnZXR0aW5nIGZsdXNoZWQgcmlnaHQgbm93XG4iKTsKKwkJbWxvZygwLCAiJXM6IHJlcyAlLipzLCBsb2NrICV1OiVsbHUsIEFTVCBnZXR0aW5nIGZsdXNoZWRcbiIsCisJCSAgICAgZGxtLT5uYW1lLCByZXMtPmxvY2tuYW1lLmxlbiwgcmVzLT5sb2NrbmFtZS5uYW1lLAorCQkgICAgIGRsbV9nZXRfbG9ja19jb29raWVfbm9kZShiZTY0X3RvX2NwdShsb2NrLT5tbC5jb29raWUpKSwKKwkJICAgICBkbG1fZ2V0X2xvY2tfY29va2llX3NlcShiZTY0X3RvX2NwdShsb2NrLT5tbC5jb29raWUpKSk7CiAKIAkvKiBwdXR0aW5nIGxvY2sgb24gbGlzdCwgYWRkIGEgcmVmICovCiAJZGxtX2xvY2tfZ2V0KGxvY2spOwpAQCAtMTEwLDkgKzEyMCwxMCBAQAogCiAJLyogY2hlY2sgdG8gc2VlIGlmIHRoaXMgYXN0IG9ic29sZXRlcyB0aGUgYmFzdCAqLwogCWlmIChkbG1fc2hvdWxkX2NhbmNlbF9iYXN0KGRsbSwgbG9jaykpIHsKLQkJc3RydWN0IGRsbV9sb2NrX3Jlc291cmNlICpyZXMgPSBsb2NrLT5sb2NrcmVzOwotCQltbG9nKDAsICIlczogY2FuY2VsbGluZyBiYXN0IGZvciAlLipzXG4iLAotCQkgICAgIGRsbS0+bmFtZSwgcmVzLT5sb2NrbmFtZS5sZW4sIHJlcy0+bG9ja25hbWUubmFtZSk7CisJCW1sb2coMCwgIiVzOiByZXMgJS4qcywgbG9jayAldTolbGx1LCBDYW5jZWxsaW5nIEJBU1RcbiIsCisJCSAgICAgZGxtLT5uYW1lLCByZXMtPmxvY2tuYW1lLmxlbiwgcmVzLT5sb2NrbmFtZS5uYW1lLAorCQkgICAgIGRsbV9nZXRfbG9ja19jb29raWVfbm9kZShiZTY0X3RvX2NwdShsb2NrLT5tbC5jb29raWUpKSwKKwkJICAgICBkbG1fZ2V0X2xvY2tfY29va2llX3NlcShiZTY0X3RvX2NwdShsb2NrLT5tbC5jb29raWUpKSk7CiAJCWxvY2stPmJhc3RfcGVuZGluZyA9IDA7CiAJCWxpc3RfZGVsX2luaXQoJmxvY2stPmJhc3RfbGlzdCk7CiAJCWxvY2stPm1sLmhpZ2hlc3RfYmxvY2tlZCA9IExLTV9JVk1PREU7CkBAIC0xMzQsOCArMTQ1LDYgQEAKIAogdm9pZCBkbG1fcXVldWVfYXN0KHN0cnVjdCBkbG1fY3R4dCAqZGxtLCBzdHJ1Y3QgZGxtX2xvY2sgKmxvY2spCiB7Ci0JbWxvZ19lbnRyeV92b2lkKCk7Ci0KIAlCVUdfT04oIWRsbSk7CiAJQlVHX09OKCFsb2NrKTsKIApAQCAtMTQ3LDE1ICsxNTYsMjEgQEAKIAogdm9pZCBfX2RsbV9xdWV1ZV9iYXN0KHN0cnVjdCBkbG1fY3R4dCAqZGxtLCBzdHJ1Y3QgZGxtX2xvY2sgKmxvY2spCiB7Ci0JbWxvZ19lbnRyeV92b2lkKCk7CisJc3RydWN0IGRsbV9sb2NrX3Jlc291cmNlICpyZXM7CiAKIAlCVUdfT04oIWRsbSk7CiAJQlVHX09OKCFsb2NrKTsKKwogCWFzc2VydF9zcGluX2xvY2tlZCgmZGxtLT5hc3RfbG9jayk7CiAKKwlyZXMgPSBsb2NrLT5sb2NrcmVzOworCiAJQlVHX09OKCFsaXN0X2VtcHR5KCZsb2NrLT5iYXN0X2xpc3QpKTsKIAlpZiAobG9jay0+YmFzdF9wZW5kaW5nKQotCQltbG9nKDAsICJsb2NrIGhhcyBhIGJhc3QgZ2V0dGluZyBmbHVzaGVkIHJpZ2h0IG5vd1xuIik7CisJCW1sb2coMCwgIiVzOiByZXMgJS4qcywgbG9jayAldTolbGx1LCBCQVNUIGdldHRpbmcgZmx1c2hlZFxuIiwKKwkJICAgICBkbG0tPm5hbWUsIHJlcy0+bG9ja25hbWUubGVuLCByZXMtPmxvY2tuYW1lLm5hbWUsCisJCSAgICAgZGxtX2dldF9sb2NrX2Nvb2tpZV9ub2RlKGJlNjRfdG9fY3B1KGxvY2stPm1sLmNvb2tpZSkpLAorCQkgICAgIGRsbV9nZXRfbG9ja19jb29raWVfc2VxKGJlNjRfdG9fY3B1KGxvY2stPm1sLmNvb2tpZSkpKTsKIAogCS8qIHB1dHRpbmcgbG9jayBvbiBsaXN0LCBhZGQgYSByZWYgKi8KIAlkbG1fbG9ja19nZXQobG9jayk7CkBAIC0xNjcsOCArMTgyLDYgQEAKIAogdm9pZCBkbG1fcXVldWVfYmFzdChzdHJ1Y3QgZGxtX2N0eHQgKmRsbSwgc3RydWN0IGRsbV9sb2NrICpsb2NrKQogewotCW1sb2dfZW50cnlfdm9pZCgpOwotCiAJQlVHX09OKCFkbG0pOwogCUJVR19PTighbG9jayk7CiAKQEAgLTIxMyw3ICsyMjYsMTAgQEAKIAlkbG1fYXN0bG9ja2Z1bmNfdCAqZm47CiAJc3RydWN0IGRsbV9sb2Nrc3RhdHVzICpsa3NiOwogCi0JbWxvZ19lbnRyeV92b2lkKCk7CisJbWxvZygwLCAiJXM6IHJlcyAlLipzLCBsb2NrICV1OiVsbHUsIExvY2FsIEFTVFxuIiwgZGxtLT5uYW1lLAorCSAgICAgcmVzLT5sb2NrbmFtZS5sZW4sIHJlcy0+bG9ja25hbWUubmFtZSwKKwkgICAgIGRsbV9nZXRfbG9ja19jb29raWVfbm9kZShiZTY0X3RvX2NwdShsb2NrLT5tbC5jb29raWUpKSwKKwkgICAgIGRsbV9nZXRfbG9ja19jb29raWVfc2VxKGJlNjRfdG9fY3B1KGxvY2stPm1sLmNvb2tpZSkpKTsKIAogCWxrc2IgPSBsb2NrLT5sa3NiOwogCWZuID0gbG9jay0+YXN0OwpAQCAtMjMxLDcgKzI0NywxMCBAQAogCXN0cnVjdCBkbG1fbG9ja3N0YXR1cyAqbGtzYjsKIAlpbnQgbGtzYmZsYWdzOwogCi0JbWxvZ19lbnRyeV92b2lkKCk7CisJbWxvZygwLCAiJXM6IHJlcyAlLipzLCBsb2NrICV1OiVsbHUsIFJlbW90ZSBBU1RcbiIsIGRsbS0+bmFtZSwKKwkgICAgIHJlcy0+bG9ja25hbWUubGVuLCByZXMtPmxvY2tuYW1lLm5hbWUsCisJICAgICBkbG1fZ2V0X2xvY2tfY29va2llX25vZGUoYmU2NF90b19jcHUobG9jay0+bWwuY29va2llKSksCisJICAgICBkbG1fZ2V0X2xvY2tfY29va2llX3NlcShiZTY0X3RvX2NwdShsb2NrLT5tbC5jb29raWUpKSk7CiAKIAlsa3NiID0gbG9jay0+bGtzYjsKIAlCVUdfT04obG9jay0+bWwubm9kZSA9PSBkbG0tPm5vZGVfbnVtKTsKQEAgLTI1MCw5ICsyNjksMTQgQEAKIHsKIAlkbG1fYmFzdGxvY2tmdW5jX3QgKmZuID0gbG9jay0+YmFzdDsKIAotCW1sb2dfZW50cnlfdm9pZCgpOwogCUJVR19PTihsb2NrLT5tbC5ub2RlICE9IGRsbS0+bm9kZV9udW0pOwogCisJbWxvZygwLCAiJXM6IHJlcyAlLipzLCBsb2NrICV1OiVsbHUsIExvY2FsIEJBU1QsIGJsb2NrZWQgJWRcbiIsCisJICAgICBkbG0tPm5hbWUsIHJlcy0+bG9ja25hbWUubGVuLCByZXMtPmxvY2tuYW1lLm5hbWUsCisJICAgICBkbG1fZ2V0X2xvY2tfY29va2llX25vZGUoYmU2NF90b19jcHUobG9jay0+bWwuY29va2llKSksCisJICAgICBkbG1fZ2V0X2xvY2tfY29va2llX3NlcShiZTY0X3RvX2NwdShsb2NrLT5tbC5jb29raWUpKSwKKwkgICAgIGJsb2NrZWRfdHlwZSk7CisKIAkoKmZuKShsb2NrLT5hc3RkYXRhLCBibG9ja2VkX3R5cGUpOwogfQogCkBAIC0zMzIsNyArMzU2LDggQEAKIAkvKiBjYW5ub3QgZ2V0IGEgcHJveHkgYXN0IG1lc3NhZ2UgaWYgdGhpcyBub2RlIG93bnMgaXQgKi8KIAlCVUdfT04ocmVzLT5vd25lciA9PSBkbG0tPm5vZGVfbnVtKTsKIAotCW1sb2coMCwgImxvY2tyZXMgJS4qc1xuIiwgcmVzLT5sb2NrbmFtZS5sZW4sIHJlcy0+bG9ja25hbWUubmFtZSk7CisJbWxvZygwLCAiJXM6IHJlcyAlLipzXG4iLCBkbG0tPm5hbWUsIHJlcy0+bG9ja25hbWUubGVuLAorCSAgICAgcmVzLT5sb2NrbmFtZS5uYW1lKTsKIAogCXNwaW5fbG9jaygmcmVzLT5zcGlubG9jayk7CiAJaWYgKHJlcy0+c3RhdGUgJiBETE1fTE9DS19SRVNfUkVDT1ZFUklORykgewpAQCAtMzgyLDggKzQwNywxMiBAQAogCWlmIChwYXN0LT50eXBlID09IERMTV9BU1QpIHsKIAkJLyogZG8gbm90IGFsdGVyIGxvY2sgcmVmY291bnQuICBzd2l0Y2hpbmcgbGlzdHMuICovCiAJCWxpc3RfbW92ZV90YWlsKCZsb2NrLT5saXN0LCAmcmVzLT5ncmFudGVkKTsKLQkJbWxvZygwLCAiYXN0OiBBZGRpbmcgdG8gZ3JhbnRlZCBsaXN0Li4uIHR5cGU9JWQsICIKLQkJICAgICAiY29udmVydF90eXBlPSVkXG4iLCBsb2NrLT5tbC50eXBlLCBsb2NrLT5tbC5jb252ZXJ0X3R5cGUpOworCQltbG9nKDAsICIlczogcmVzICUuKnMsIGxvY2sgJXU6JWxsdSwgR3JhbnRlZCB0eXBlICVkID0+ICVkXG4iLAorCQkgICAgIGRsbS0+bmFtZSwgcmVzLT5sb2NrbmFtZS5sZW4sIHJlcy0+bG9ja25hbWUubmFtZSwKKwkJICAgICBkbG1fZ2V0X2xvY2tfY29va2llX25vZGUoYmU2NF90b19jcHUoY29va2llKSksCisJCSAgICAgZGxtX2dldF9sb2NrX2Nvb2tpZV9zZXEoYmU2NF90b19jcHUoY29va2llKSksCisJCSAgICAgbG9jay0+bWwudHlwZSwgbG9jay0+bWwuY29udmVydF90eXBlKTsKKwogCQlpZiAobG9jay0+bWwuY29udmVydF90eXBlICE9IExLTV9JVk1PREUpIHsKIAkJCWxvY2stPm1sLnR5cGUgPSBsb2NrLT5tbC5jb252ZXJ0X3R5cGU7CiAJCQlsb2NrLT5tbC5jb252ZXJ0X3R5cGUgPSBMS01fSVZNT0RFOwpAQCAtNDI2LDkgKzQ1NSw5IEBACiAJc2l6ZV90IHZlY2xlbiA9IDE7CiAJaW50IHN0YXR1czsKIAotCW1sb2dfZW50cnkoInJlcyAlLipzLCB0bz0ldSwgdHlwZT0lZCwgYmxvY2tlZF90eXBlPSVkXG4iLAotCQkgICByZXMtPmxvY2tuYW1lLmxlbiwgcmVzLT5sb2NrbmFtZS5uYW1lLCBsb2NrLT5tbC5ub2RlLAotCQkgICBtc2dfdHlwZSwgYmxvY2tlZF90eXBlKTsKKwltbG9nKDAsICIlczogcmVzICUuKnMsIHRvICV1LCB0eXBlICVkLCBibG9ja2VkX3R5cGUgJWRcbiIsIGRsbS0+bmFtZSwKKwkgICAgIHJlcy0+bG9ja25hbWUubGVuLCByZXMtPmxvY2tuYW1lLm5hbWUsIGxvY2stPm1sLm5vZGUsIG1zZ190eXBlLAorCSAgICAgYmxvY2tlZF90eXBlKTsKIAogCW1lbXNldCgmcGFzdCwgMCwgc2l6ZW9mKHN0cnVjdCBkbG1fcHJveHlfYXN0KSk7CiAJcGFzdC5ub2RlX2lkeCA9IGRsbS0+bm9kZV9udW07CkBAIC00NDEsNyArNDcwLDYgQEAKIAl2ZWNbMF0uaW92X2xlbiA9IHNpemVvZihzdHJ1Y3QgZGxtX3Byb3h5X2FzdCk7CiAJdmVjWzBdLmlvdl9iYXNlID0gJnBhc3Q7CiAJaWYgKGZsYWdzICYgRExNX0xLU0JfR0VUX0xWQikgewotCQltbG9nKDAsICJyZXR1cm5pbmcgcmVxdWVzdGVkIExWQiBkYXRhXG4iKTsKIAkJYmUzMl9hZGRfY3B1KCZwYXN0LmZsYWdzLCBMS01fR0VUX0xWQik7CiAJCXZlY1sxXS5pb3ZfbGVuID0gRExNX0xWQl9MRU47CiAJCXZlY1sxXS5pb3ZfYmFzZSA9IGxvY2stPmxrc2ItPmx2YjsKQEAgLTQ1MSw4ICs0NzksOCBAQAogCXJldCA9IG8ybmV0X3NlbmRfbWVzc2FnZV92ZWMoRExNX1BST1hZX0FTVF9NU0csIGRsbS0+a2V5LCB2ZWMsIHZlY2xlbiwKIAkJCQkgICAgIGxvY2stPm1sLm5vZGUsICZzdGF0dXMpOwogCWlmIChyZXQgPCAwKQotCQltbG9nKE1MX0VSUk9SLCAiRXJyb3IgJWQgd2hlbiBzZW5kaW5nIG1lc3NhZ2UgJXUgKGtleSAweCV4KSB0byAiCi0JCSAgICAgIm5vZGUgJXVcbiIsIHJldCwgRExNX1BST1hZX0FTVF9NU0csIGRsbS0+a2V5LAorCQltbG9nKE1MX0VSUk9SLCAiJXM6IHJlcyAlLipzLCBlcnJvciAlZCBzZW5kIEFTVCB0byBub2RlICV1XG4iLAorCQkgICAgIGRsbS0+bmFtZSwgcmVzLT5sb2NrbmFtZS5sZW4sIHJlcy0+bG9ja25hbWUubmFtZSwgcmV0LAogCQkgICAgIGxvY2stPm1sLm5vZGUpOwogCWVsc2UgewogCQlpZiAoc3RhdHVzID09IERMTV9SRUNPVkVSSU5HKSB7CmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9kbG0vZGxtY29tbW9uLmggYi9mcy9vY2ZzMi9kbG0vZGxtY29tbW9uLmgKaW5kZXggYjM2ZDBiZi4uNGJkZjdiYSAxMDA2NDQKLS0tIGEvZnMvb2NmczIvZGxtL2RsbWNvbW1vbi5oCisrKyBiL2ZzL29jZnMyL2RsbS9kbG1jb21tb24uaApAQCAtNTAsMTAgKzUwLDEwIEBACiAjZGVmaW5lIGRsbV9sb2NraWRfaGFzaChfbiwgX2wpIGZ1bGxfbmFtZV9oYXNoKF9uLCBfbCkKIAogZW51bSBkbG1fbWxlX3R5cGUgewotCURMTV9NTEVfQkxPQ0ssCi0JRExNX01MRV9NQVNURVIsCi0JRExNX01MRV9NSUdSQVRJT04sCi0JRExNX01MRV9OVU1fVFlQRVMKKwlETE1fTUxFX0JMT0NLID0gMCwKKwlETE1fTUxFX01BU1RFUiA9IDEsCisJRExNX01MRV9NSUdSQVRJT04gPSAyLAorCURMTV9NTEVfTlVNX1RZUEVTID0gMywKIH07CiAKIHN0cnVjdCBkbG1fbWFzdGVyX2xpc3RfZW50cnkgewpAQCAtODIsOCArODIsOCBAQAogCiBlbnVtIGRsbV9hc3RfdHlwZSB7CiAJRExNX0FTVCA9IDAsCi0JRExNX0JBU1QsCi0JRExNX0FTVFVOTE9DSworCURMTV9CQVNUID0gMSwKKwlETE1fQVNUVU5MT0NLID0gMiwKIH07CiAKIApAQCAtMTE5LDkgKzExOSw5IEBACiAKIGVudW0gZGxtX2N0eHRfc3RhdGUgewogCURMTV9DVFhUX05FVyA9IDAsCi0JRExNX0NUWFRfSk9JTkVELAotCURMTV9DVFhUX0lOX1NIVVRET1dOLAotCURMTV9DVFhUX0xFQVZJTkcsCisJRExNX0NUWFRfSk9JTkVEID0gMSwKKwlETE1fQ1RYVF9JTl9TSFVURE9XTiA9IDIsCisJRExNX0NUWFRfTEVBVklORyA9IDMsCiB9OwogCiBzdHJ1Y3QgZGxtX2N0eHQKQEAgLTM4OCw4ICszODgsOCBAQAogCiBlbnVtIGRsbV9sb2NrcmVzX2xpc3QgewogCURMTV9HUkFOVEVEX0xJU1QgPSAwLAotCURMTV9DT05WRVJUSU5HX0xJU1QsCi0JRExNX0JMT0NLRURfTElTVAorCURMTV9DT05WRVJUSU5HX0xJU1QgPSAxLAorCURMTV9CTE9DS0VEX0xJU1QgPSAyLAogfTsKIAogc3RhdGljIGlubGluZSBpbnQgZGxtX2x2Yl9pc19lbXB0eShjaGFyICpsdmIpCkBAIC00MjcsMjcgKzQyNywyNyBAQAogCiAKIGVudW0gewotCURMTV9NQVNURVJfUkVRVUVTVF9NU0cgICAgPSA1MDAsCi0JRExNX1VOVVNFRF9NU0cxLCAgICAgICAgIC8qIDUwMSAqLwotCURMTV9BU1NFUlRfTUFTVEVSX01TRywJIC8qIDUwMiAqLwotCURMTV9DUkVBVEVfTE9DS19NU0csCSAvKiA1MDMgKi8KLQlETE1fQ09OVkVSVF9MT0NLX01TRywJIC8qIDUwNCAqLwotCURMTV9QUk9YWV9BU1RfTVNHLAkgLyogNTA1ICovCi0JRExNX1VOTE9DS19MT0NLX01TRywJIC8qIDUwNiAqLwotCURMTV9ERVJFRl9MT0NLUkVTX01TRywJIC8qIDUwNyAqLwotCURMTV9NSUdSQVRFX1JFUVVFU1RfTVNHLCAvKiA1MDggKi8KLQlETE1fTUlHX0xPQ0tSRVNfTVNHLCAJIC8qIDUwOSAqLwotCURMTV9RVUVSWV9KT0lOX01TRywJIC8qIDUxMCAqLwotCURMTV9BU1NFUlRfSk9JTkVEX01TRywJIC8qIDUxMSAqLwotCURMTV9DQU5DRUxfSk9JTl9NU0csCSAvKiA1MTIgKi8KLQlETE1fRVhJVF9ET01BSU5fTVNHLAkgLyogNTEzICovCi0JRExNX01BU1RFUl9SRVFVRVJZX01TRywJIC8qIDUxNCAqLwotCURMTV9MT0NLX1JFUVVFU1RfTVNHLAkgLyogNTE1ICovCi0JRExNX1JFQ09fREFUQV9ET05FX01TRywJIC8qIDUxNiAqLwotCURMTV9CRUdJTl9SRUNPX01TRywJIC8qIDUxNyAqLwotCURMTV9GSU5BTElaRV9SRUNPX01TRywJIC8qIDUxOCAqLwotCURMTV9RVUVSWV9SRUdJT04sCSAvKiA1MTkgKi8KLQlETE1fUVVFUllfTk9ERUlORk8sCSAvKiA1MjAgKi8KKwlETE1fTUFTVEVSX1JFUVVFU1RfTVNHCQk9IDUwMCwKKwlETE1fVU5VU0VEX01TRzEJCQk9IDUwMSwKKwlETE1fQVNTRVJUX01BU1RFUl9NU0cJCT0gNTAyLAorCURMTV9DUkVBVEVfTE9DS19NU0cJCT0gNTAzLAorCURMTV9DT05WRVJUX0xPQ0tfTVNHCQk9IDUwNCwKKwlETE1fUFJPWFlfQVNUX01TRwkJPSA1MDUsCisJRExNX1VOTE9DS19MT0NLX01TRwkJPSA1MDYsCisJRExNX0RFUkVGX0xPQ0tSRVNfTVNHCQk9IDUwNywKKwlETE1fTUlHUkFURV9SRVFVRVNUX01TRwkJPSA1MDgsCisJRExNX01JR19MT0NLUkVTX01TRwkJPSA1MDksCisJRExNX1FVRVJZX0pPSU5fTVNHCQk9IDUxMCwKKwlETE1fQVNTRVJUX0pPSU5FRF9NU0cJCT0gNTExLAorCURMTV9DQU5DRUxfSk9JTl9NU0cJCT0gNTEyLAorCURMTV9FWElUX0RPTUFJTl9NU0cJCT0gNTEzLAorCURMTV9NQVNURVJfUkVRVUVSWV9NU0cJCT0gNTE0LAorCURMTV9MT0NLX1JFUVVFU1RfTVNHCQk9IDUxNSwKKwlETE1fUkVDT19EQVRBX0RPTkVfTVNHCQk9IDUxNiwKKwlETE1fQkVHSU5fUkVDT19NU0cJCT0gNTE3LAorCURMTV9GSU5BTElaRV9SRUNPX01TRwkJPSA1MTgsCisJRExNX1FVRVJZX1JFR0lPTgkJPSA1MTksCisJRExNX1FVRVJZX05PREVJTkZPCQk9IDUyMCwKIH07CiAKIHN0cnVjdCBkbG1fcmVjb19ub2RlX2RhdGEKQEAgLTQ2MCwxOSArNDYwLDE5IEBACiBlbnVtIHsKIAlETE1fUkVDT19OT0RFX0RBVEFfREVBRCA9IC0xLAogCURMTV9SRUNPX05PREVfREFUQV9JTklUID0gMCwKLQlETE1fUkVDT19OT0RFX0RBVEFfUkVRVUVTVElORywKLQlETE1fUkVDT19OT0RFX0RBVEFfUkVRVUVTVEVELAotCURMTV9SRUNPX05PREVfREFUQV9SRUNFSVZJTkcsCi0JRExNX1JFQ09fTk9ERV9EQVRBX0RPTkUsCi0JRExNX1JFQ09fTk9ERV9EQVRBX0ZJTkFMSVpFX1NFTlQsCisJRExNX1JFQ09fTk9ERV9EQVRBX1JFUVVFU1RJTkcgPSAxLAorCURMTV9SRUNPX05PREVfREFUQV9SRVFVRVNURUQgPSAyLAorCURMTV9SRUNPX05PREVfREFUQV9SRUNFSVZJTkcgPSAzLAorCURMTV9SRUNPX05PREVfREFUQV9ET05FID0gNCwKKwlETE1fUkVDT19OT0RFX0RBVEFfRklOQUxJWkVfU0VOVCA9IDUsCiB9OwogCiAKIGVudW0gewogCURMTV9NQVNURVJfUkVTUF9OTyA9IDAsCi0JRExNX01BU1RFUl9SRVNQX1lFUywKLQlETE1fTUFTVEVSX1JFU1BfTUFZQkUsCi0JRExNX01BU1RFUl9SRVNQX0VSUk9SCisJRExNX01BU1RFUl9SRVNQX1lFUyA9IDEsCisJRExNX01BU1RFUl9SRVNQX01BWUJFID0gMiwKKwlETE1fTUFTVEVSX1JFU1BfRVJST1IgPSAzLAogfTsKIAogCkBAIC02NDksOSArNjQ5LDkgQEAKICNkZWZpbmUgRExNX01PRF9LRVkgKDB4NjY2YzYxNzIpCiBlbnVtIGRsbV9xdWVyeV9qb2luX3Jlc3BvbnNlX2NvZGUgewogCUpPSU5fRElTQUxMT1cgPSAwLAotCUpPSU5fT0ssCi0JSk9JTl9PS19OT19NQVAsCi0JSk9JTl9QUk9UT0NPTF9NSVNNQVRDSCwKKwlKT0lOX09LID0gMSwKKwlKT0lOX09LX05PX01BUCA9IDIsCisJSk9JTl9QUk9UT0NPTF9NSVNNQVRDSCA9IDMsCiB9OwogCiBzdHJ1Y3QgZGxtX3F1ZXJ5X2pvaW5fcGFja2V0IHsKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2RsbS9kbG1kZWJ1Zy5jIGIvZnMvb2NmczIvZGxtL2RsbWRlYnVnLmMKaW5kZXggMjcyZWM4Ni4uMDRhMzJiZSAxMDA2NDQKLS0tIGEvZnMvb2NmczIvZGxtL2RsbWRlYnVnLmMKKysrIGIvZnMvb2NmczIvZGxtL2RsbWRlYnVnLmMKQEAgLTM3MCw5MiArMzcwLDQ2IEBACiAJa3JlZl9nZXQoJmRjLT5kZWJ1Z19yZWZjbnQpOwogfQogCi1zdGF0aWMgc3RydWN0IGRlYnVnX2J1ZmZlciAqZGVidWdfYnVmZmVyX2FsbG9jYXRlKHZvaWQpCitzdGF0aWMgaW50IGRlYnVnX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCiB7Ci0Jc3RydWN0IGRlYnVnX2J1ZmZlciAqZGIgPSBOVUxMOwotCi0JZGIgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZGVidWdfYnVmZmVyKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFkYikKLQkJZ290byBiYWlsOwotCi0JZGItPmxlbiA9IFBBR0VfU0laRTsKLQlkYi0+YnVmID0ga21hbGxvYyhkYi0+bGVuLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWRiLT5idWYpCi0JCWdvdG8gYmFpbDsKLQotCXJldHVybiBkYjsKLWJhaWw6Ci0Ja2ZyZWUoZGIpOwotCXJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgc3NpemVfdCBkZWJ1Z19idWZmZXJfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZiwKLQkJCQkgc2l6ZV90IG5ieXRlcywgbG9mZl90ICpwcG9zKQotewotCXN0cnVjdCBkZWJ1Z19idWZmZXIgKmRiID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCi0JcmV0dXJuIHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKGJ1ZiwgbmJ5dGVzLCBwcG9zLCBkYi0+YnVmLCBkYi0+bGVuKTsKLX0KLQotc3RhdGljIGxvZmZfdCBkZWJ1Z19idWZmZXJfbGxzZWVrKHN0cnVjdCBmaWxlICpmaWxlLCBsb2ZmX3Qgb2ZmLCBpbnQgd2hlbmNlKQotewotCXN0cnVjdCBkZWJ1Z19idWZmZXIgKmRiID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCWxvZmZfdCBuZXcgPSAtMTsKLQotCXN3aXRjaCAod2hlbmNlKSB7Ci0JY2FzZSAwOgotCQluZXcgPSBvZmY7Ci0JCWJyZWFrOwotCWNhc2UgMToKLQkJbmV3ID0gZmlsZS0+Zl9wb3MgKyBvZmY7Ci0JCWJyZWFrOwotCX0KLQotCWlmIChuZXcgPCAwIHx8IG5ldyA+IGRiLT5sZW4pCi0JCXJldHVybiAtRUlOVkFMOwotCi0JcmV0dXJuIChmaWxlLT5mX3BvcyA9IG5ldyk7Ci19Ci0KLXN0YXRpYyBpbnQgZGVidWdfYnVmZmVyX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0Jc3RydWN0IGRlYnVnX2J1ZmZlciAqZGIgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0KLQlpZiAoZGIpCi0JCWtmcmVlKGRiLT5idWYpOwotCWtmcmVlKGRiKTsKLQorCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylmaWxlLT5wcml2YXRlX2RhdGEpOwogCXJldHVybiAwOwogfQorCitzdGF0aWMgc3NpemVfdCBkZWJ1Z19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLAorCQkJICBzaXplX3QgbmJ5dGVzLCBsb2ZmX3QgKnBwb3MpCit7CisJcmV0dXJuIHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKGJ1ZiwgbmJ5dGVzLCBwcG9zLCBmaWxlLT5wcml2YXRlX2RhdGEsCisJCQkJICAgICAgIGlfc2l6ZV9yZWFkKGZpbGUtPmZfbWFwcGluZy0+aG9zdCkpOworfQogLyogZW5kIC0gdXRpbCBmdW5jcyAqLwogCiAvKiBiZWdpbiAtIHB1cmdlIGxpc3QgZnVuY3MgKi8KLXN0YXRpYyBpbnQgZGVidWdfcHVyZ2VsaXN0X3ByaW50KHN0cnVjdCBkbG1fY3R4dCAqZGxtLCBzdHJ1Y3QgZGVidWdfYnVmZmVyICpkYikKK3N0YXRpYyBpbnQgZGVidWdfcHVyZ2VsaXN0X3ByaW50KHN0cnVjdCBkbG1fY3R4dCAqZGxtLCBjaGFyICpidWYsIGludCBsZW4pCiB7CiAJc3RydWN0IGRsbV9sb2NrX3Jlc291cmNlICpyZXM7CiAJaW50IG91dCA9IDA7CiAJdW5zaWduZWQgbG9uZyB0b3RhbCA9IDA7CiAKLQlvdXQgKz0gc25wcmludGYoZGItPmJ1ZiArIG91dCwgZGItPmxlbiAtIG91dCwKKwlvdXQgKz0gc25wcmludGYoYnVmICsgb3V0LCBsZW4gLSBvdXQsCiAJCQkiRHVtcGluZyBQdXJnZWxpc3QgZm9yIERvbWFpbjogJXNcbiIsIGRsbS0+bmFtZSk7CiAKIAlzcGluX2xvY2soJmRsbS0+c3BpbmxvY2spOwogCWxpc3RfZm9yX2VhY2hfZW50cnkocmVzLCAmZGxtLT5wdXJnZV9saXN0LCBwdXJnZSkgewogCQkrK3RvdGFsOwotCQlpZiAoZGItPmxlbiAtIG91dCA8IDEwMCkKKwkJaWYgKGxlbiAtIG91dCA8IDEwMCkKIAkJCWNvbnRpbnVlOwogCQlzcGluX2xvY2soJnJlcy0+c3BpbmxvY2spOwogCQlvdXQgKz0gc3RyaW5naWZ5X2xvY2tuYW1lKHJlcy0+bG9ja25hbWUubmFtZSwKIAkJCQkJICByZXMtPmxvY2tuYW1lLmxlbiwKLQkJCQkJICBkYi0+YnVmICsgb3V0LCBkYi0+bGVuIC0gb3V0KTsKLQkJb3V0ICs9IHNucHJpbnRmKGRiLT5idWYgKyBvdXQsIGRiLT5sZW4gLSBvdXQsICJcdCVsZFxuIiwKKwkJCQkJICBidWYgKyBvdXQsIGxlbiAtIG91dCk7CisJCW91dCArPSBzbnByaW50ZihidWYgKyBvdXQsIGxlbiAtIG91dCwgIlx0JWxkXG4iLAogCQkJCShqaWZmaWVzIC0gcmVzLT5sYXN0X3VzZWQpL0haKTsKIAkJc3Bpbl91bmxvY2soJnJlcy0+c3BpbmxvY2spOwogCX0KIAlzcGluX3VubG9jaygmZGxtLT5zcGlubG9jayk7CiAKLQlvdXQgKz0gc25wcmludGYoZGItPmJ1ZiArIG91dCwgZGItPmxlbiAtIG91dCwKLQkJCSJUb3RhbCBvbiBsaXN0OiAlbGRcbiIsIHRvdGFsKTsKKwlvdXQgKz0gc25wcmludGYoYnVmICsgb3V0LCBsZW4gLSBvdXQsICJUb3RhbCBvbiBsaXN0OiAlbGRcbiIsIHRvdGFsKTsKIAogCXJldHVybiBvdXQ7CiB9CkBAIC00NjMsMTUgKzQxNywxNSBAQAogc3RhdGljIGludCBkZWJ1Z19wdXJnZWxpc3Rfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKIAlzdHJ1Y3QgZGxtX2N0eHQgKmRsbSA9IGlub2RlLT5pX3ByaXZhdGU7Ci0Jc3RydWN0IGRlYnVnX2J1ZmZlciAqZGI7CisJY2hhciAqYnVmID0gTlVMTDsKIAotCWRiID0gZGVidWdfYnVmZmVyX2FsbG9jYXRlKCk7Ci0JaWYgKCFkYikKKwlidWYgPSAoY2hhciAqKSBnZXRfemVyb2VkX3BhZ2UoR0ZQX05PRlMpOworCWlmICghYnVmKQogCQlnb3RvIGJhaWw7CiAKLQlkYi0+bGVuID0gZGVidWdfcHVyZ2VsaXN0X3ByaW50KGRsbSwgZGIpOworCWlfc2l6ZV93cml0ZShpbm9kZSwgZGVidWdfcHVyZ2VsaXN0X3ByaW50KGRsbSwgYnVmLCBQQUdFX1NJWkUgLSAxKSk7CiAKLQlmaWxlLT5wcml2YXRlX2RhdGEgPSBkYjsKKwlmaWxlLT5wcml2YXRlX2RhdGEgPSBidWY7CiAKIAlyZXR1cm4gMDsKIGJhaWw6CkBAIC00ODAsMTQgKzQzNCwxNCBAQAogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBkZWJ1Z19wdXJnZWxpc3RfZm9wcyA9IHsKIAkub3BlbiA9CQlkZWJ1Z19wdXJnZWxpc3Rfb3BlbiwKLQkucmVsZWFzZSA9CWRlYnVnX2J1ZmZlcl9yZWxlYXNlLAotCS5yZWFkID0JCWRlYnVnX2J1ZmZlcl9yZWFkLAotCS5sbHNlZWsgPQlkZWJ1Z19idWZmZXJfbGxzZWVrLAorCS5yZWxlYXNlID0JZGVidWdfcmVsZWFzZSwKKwkucmVhZCA9CQlkZWJ1Z19yZWFkLAorCS5sbHNlZWsgPQlnZW5lcmljX2ZpbGVfbGxzZWVrLAogfTsKIC8qIGVuZCAtIHB1cmdlIGxpc3QgZnVuY3MgKi8KIAogLyogYmVnaW4gLSBkZWJ1ZyBtbGUgZnVuY3MgKi8KLXN0YXRpYyBpbnQgZGVidWdfbWxlX3ByaW50KHN0cnVjdCBkbG1fY3R4dCAqZGxtLCBzdHJ1Y3QgZGVidWdfYnVmZmVyICpkYikKK3N0YXRpYyBpbnQgZGVidWdfbWxlX3ByaW50KHN0cnVjdCBkbG1fY3R4dCAqZGxtLCBjaGFyICpidWYsIGludCBsZW4pCiB7CiAJc3RydWN0IGRsbV9tYXN0ZXJfbGlzdF9lbnRyeSAqbWxlOwogCXN0cnVjdCBobGlzdF9oZWFkICpidWNrZXQ7CkBAIC00OTUsNyArNDQ5LDcgQEAKIAlpbnQgaSwgb3V0ID0gMDsKIAl1bnNpZ25lZCBsb25nIHRvdGFsID0gMCwgbG9uZ2VzdCA9IDAsIGJ1Y2tldF9jb3VudCA9IDA7CiAKLQlvdXQgKz0gc25wcmludGYoZGItPmJ1ZiArIG91dCwgZGItPmxlbiAtIG91dCwKKwlvdXQgKz0gc25wcmludGYoYnVmICsgb3V0LCBsZW4gLSBvdXQsCiAJCQkiRHVtcGluZyBNTEVzIGZvciBEb21haW46ICVzXG4iLCBkbG0tPm5hbWUpOwogCiAJc3Bpbl9sb2NrKCZkbG0tPm1hc3Rlcl9sb2NrKTsKQEAgLTUwNiwxNiArNDYwLDE2IEBACiAJCQkJCSAgbWFzdGVyX2hhc2hfbm9kZSk7CiAJCQkrK3RvdGFsOwogCQkJKytidWNrZXRfY291bnQ7Ci0JCQlpZiAoZGItPmxlbiAtIG91dCA8IDIwMCkKKwkJCWlmIChsZW4gLSBvdXQgPCAyMDApCiAJCQkJY29udGludWU7Ci0JCQlvdXQgKz0gZHVtcF9tbGUobWxlLCBkYi0+YnVmICsgb3V0LCBkYi0+bGVuIC0gb3V0KTsKKwkJCW91dCArPSBkdW1wX21sZShtbGUsIGJ1ZiArIG91dCwgbGVuIC0gb3V0KTsKIAkJfQogCQlsb25nZXN0ID0gbWF4KGxvbmdlc3QsIGJ1Y2tldF9jb3VudCk7CiAJCWJ1Y2tldF9jb3VudCA9IDA7CiAJfQogCXNwaW5fdW5sb2NrKCZkbG0tPm1hc3Rlcl9sb2NrKTsKIAotCW91dCArPSBzbnByaW50ZihkYi0+YnVmICsgb3V0LCBkYi0+bGVuIC0gb3V0LAorCW91dCArPSBzbnByaW50ZihidWYgKyBvdXQsIGxlbiAtIG91dCwKIAkJCSJUb3RhbDogJWxkLCBMb25nZXN0OiAlbGRcbiIsIHRvdGFsLCBsb25nZXN0KTsKIAlyZXR1cm4gb3V0OwogfQpAQCAtNTIzLDE1ICs0NzcsMTUgQEAKIHN0YXRpYyBpbnQgZGVidWdfbWxlX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCiB7CiAJc3RydWN0IGRsbV9jdHh0ICpkbG0gPSBpbm9kZS0+aV9wcml2YXRlOwotCXN0cnVjdCBkZWJ1Z19idWZmZXIgKmRiOworCWNoYXIgKmJ1ZiA9IE5VTEw7CiAKLQlkYiA9IGRlYnVnX2J1ZmZlcl9hbGxvY2F0ZSgpOwotCWlmICghZGIpCisJYnVmID0gKGNoYXIgKikgZ2V0X3plcm9lZF9wYWdlKEdGUF9OT0ZTKTsKKwlpZiAoIWJ1ZikKIAkJZ290byBiYWlsOwogCi0JZGItPmxlbiA9IGRlYnVnX21sZV9wcmludChkbG0sIGRiKTsKKwlpX3NpemVfd3JpdGUoaW5vZGUsIGRlYnVnX21sZV9wcmludChkbG0sIGJ1ZiwgUEFHRV9TSVpFIC0gMSkpOwogCi0JZmlsZS0+cHJpdmF0ZV9kYXRhID0gZGI7CisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gYnVmOwogCiAJcmV0dXJuIDA7CiBiYWlsOgpAQCAtNTQwLDkgKzQ5NCw5IEBACiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGRlYnVnX21sZV9mb3BzID0gewogCS5vcGVuID0JCWRlYnVnX21sZV9vcGVuLAotCS5yZWxlYXNlID0JZGVidWdfYnVmZmVyX3JlbGVhc2UsCi0JLnJlYWQgPQkJZGVidWdfYnVmZmVyX3JlYWQsCi0JLmxsc2VlayA9CWRlYnVnX2J1ZmZlcl9sbHNlZWssCisJLnJlbGVhc2UgPQlkZWJ1Z19yZWxlYXNlLAorCS5yZWFkID0JCWRlYnVnX3JlYWQsCisJLmxsc2VlayA9CWdlbmVyaWNfZmlsZV9sbHNlZWssCiB9OwogCiAvKiBlbmQgLSBkZWJ1ZyBtbGUgZnVuY3MgKi8KQEAgLTc1Nyw3ICs3MTEsNyBAQAogLyogZW5kIC0gZGVidWcgbG9ja3JlcyBmdW5jcyAqLwogCiAvKiBiZWdpbiAtIGRlYnVnIHN0YXRlIGZ1bmNzICovCi1zdGF0aWMgaW50IGRlYnVnX3N0YXRlX3ByaW50KHN0cnVjdCBkbG1fY3R4dCAqZGxtLCBzdHJ1Y3QgZGVidWdfYnVmZmVyICpkYikKK3N0YXRpYyBpbnQgZGVidWdfc3RhdGVfcHJpbnQoc3RydWN0IGRsbV9jdHh0ICpkbG0sIGNoYXIgKmJ1ZiwgaW50IGxlbikKIHsKIAlpbnQgb3V0ID0gMDsKIAlzdHJ1Y3QgZGxtX3JlY29fbm9kZV9kYXRhICpub2RlOwpAQCAtNzgxLDM1ICs3MzUsMzUgQEAKIAl9CiAKIAkvKiBEb21haW46IHh4eHh4eHh4eHggIEtleTogMHhkZmJhYzc2OSAqLwotCW91dCArPSBzbnByaW50ZihkYi0+YnVmICsgb3V0LCBkYi0+bGVuIC0gb3V0LAorCW91dCArPSBzbnByaW50ZihidWYgKyBvdXQsIGxlbiAtIG91dCwKIAkJCSJEb21haW46ICVzICBLZXk6IDB4JTA4eCAgUHJvdG9jb2w6ICVkLiVkXG4iLAogCQkJZGxtLT5uYW1lLCBkbG0tPmtleSwgZGxtLT5kbG1fbG9ja2luZ19wcm90by5wdl9tYWpvciwKIAkJCWRsbS0+ZGxtX2xvY2tpbmdfcHJvdG8ucHZfbWlub3IpOwogCiAJLyogVGhyZWFkIFBpZDogeHh4ICBOb2RlOiB4eHggIFN0YXRlOiB4eHh4eCAqLwotCW91dCArPSBzbnByaW50ZihkYi0+YnVmICsgb3V0LCBkYi0+bGVuIC0gb3V0LAorCW91dCArPSBzbnByaW50ZihidWYgKyBvdXQsIGxlbiAtIG91dCwKIAkJCSJUaHJlYWQgUGlkOiAlZCAgTm9kZTogJWQgIFN0YXRlOiAlc1xuIiwKLQkJCWRsbS0+ZGxtX3RocmVhZF90YXNrLT5waWQsIGRsbS0+bm9kZV9udW0sIHN0YXRlKTsKKwkJCXRhc2tfcGlkX25yKGRsbS0+ZGxtX3RocmVhZF90YXNrKSwgZGxtLT5ub2RlX251bSwgc3RhdGUpOwogCiAJLyogTnVtYmVyIG9mIEpvaW5zOiB4eHggIEpvaW5pbmcgTm9kZTogeHh4ICovCi0Jb3V0ICs9IHNucHJpbnRmKGRiLT5idWYgKyBvdXQsIGRiLT5sZW4gLSBvdXQsCisJb3V0ICs9IHNucHJpbnRmKGJ1ZiArIG91dCwgbGVuIC0gb3V0LAogCQkJIk51bWJlciBvZiBKb2luczogJWQgIEpvaW5pbmcgTm9kZTogJWRcbiIsCiAJCQlkbG0tPm51bV9qb2lucywgZGxtLT5qb2luaW5nX25vZGUpOwogCiAJLyogRG9tYWluIE1hcDogeHggeHggeHggKi8KLQlvdXQgKz0gc25wcmludGYoZGItPmJ1ZiArIG91dCwgZGItPmxlbiAtIG91dCwgIkRvbWFpbiBNYXA6ICIpOworCW91dCArPSBzbnByaW50ZihidWYgKyBvdXQsIGxlbiAtIG91dCwgIkRvbWFpbiBNYXA6ICIpOwogCW91dCArPSBzdHJpbmdpZnlfbm9kZW1hcChkbG0tPmRvbWFpbl9tYXAsIE8yTk1fTUFYX05PREVTLAotCQkJCSBkYi0+YnVmICsgb3V0LCBkYi0+bGVuIC0gb3V0KTsKLQlvdXQgKz0gc25wcmludGYoZGItPmJ1ZiArIG91dCwgZGItPmxlbiAtIG91dCwgIlxuIik7CisJCQkJIGJ1ZiArIG91dCwgbGVuIC0gb3V0KTsKKwlvdXQgKz0gc25wcmludGYoYnVmICsgb3V0LCBsZW4gLSBvdXQsICJcbiIpOwogCiAJLyogTGl2ZSBNYXA6IHh4IHh4IHh4ICovCi0Jb3V0ICs9IHNucHJpbnRmKGRiLT5idWYgKyBvdXQsIGRiLT5sZW4gLSBvdXQsICJMaXZlIE1hcDogIik7CisJb3V0ICs9IHNucHJpbnRmKGJ1ZiArIG91dCwgbGVuIC0gb3V0LCAiTGl2ZSBNYXA6ICIpOwogCW91dCArPSBzdHJpbmdpZnlfbm9kZW1hcChkbG0tPmxpdmVfbm9kZXNfbWFwLCBPMk5NX01BWF9OT0RFUywKLQkJCQkgZGItPmJ1ZiArIG91dCwgZGItPmxlbiAtIG91dCk7Ci0Jb3V0ICs9IHNucHJpbnRmKGRiLT5idWYgKyBvdXQsIGRiLT5sZW4gLSBvdXQsICJcbiIpOworCQkJCSBidWYgKyBvdXQsIGxlbiAtIG91dCk7CisJb3V0ICs9IHNucHJpbnRmKGJ1ZiArIG91dCwgbGVuIC0gb3V0LCAiXG4iKTsKIAogCS8qIExvY2sgUmVzb3VyY2VzOiB4eHggKHh4eCkgKi8KLQlvdXQgKz0gc25wcmludGYoZGItPmJ1ZiArIG91dCwgZGItPmxlbiAtIG91dCwKKwlvdXQgKz0gc25wcmludGYoYnVmICsgb3V0LCBsZW4gLSBvdXQsCiAJCQkiTG9jayBSZXNvdXJjZXM6ICVkICglZClcbiIsCiAJCQlhdG9taWNfcmVhZCgmZGxtLT5yZXNfY3VyX2NvdW50KSwKIAkJCWF0b21pY19yZWFkKCZkbG0tPnJlc190b3RfY291bnQpKTsKQEAgLTgyMSwyOSArNzc1LDI5IEBACiAJCWN1cl9tbGVzICs9IGF0b21pY19yZWFkKCZkbG0tPm1sZV9jdXJfY291bnRbaV0pOwogCiAJLyogTUxFczogeHh4ICh4eHgpICovCi0Jb3V0ICs9IHNucHJpbnRmKGRiLT5idWYgKyBvdXQsIGRiLT5sZW4gLSBvdXQsCisJb3V0ICs9IHNucHJpbnRmKGJ1ZiArIG91dCwgbGVuIC0gb3V0LAogCQkJIk1MRXM6ICVkICglZClcbiIsIGN1cl9tbGVzLCB0b3RfbWxlcyk7CiAKIAkvKiAgQmxvY2tpbmc6IHh4eCAoeHh4KSAqLwotCW91dCArPSBzbnByaW50ZihkYi0+YnVmICsgb3V0LCBkYi0+bGVuIC0gb3V0LAorCW91dCArPSBzbnByaW50ZihidWYgKyBvdXQsIGxlbiAtIG91dCwKIAkJCSIgIEJsb2NraW5nOiAlZCAoJWQpXG4iLAogCQkJYXRvbWljX3JlYWQoJmRsbS0+bWxlX2N1cl9jb3VudFtETE1fTUxFX0JMT0NLXSksCiAJCQlhdG9taWNfcmVhZCgmZGxtLT5tbGVfdG90X2NvdW50W0RMTV9NTEVfQkxPQ0tdKSk7CiAKIAkvKiAgTWFzdGVyeTogeHh4ICh4eHgpICovCi0Jb3V0ICs9IHNucHJpbnRmKGRiLT5idWYgKyBvdXQsIGRiLT5sZW4gLSBvdXQsCisJb3V0ICs9IHNucHJpbnRmKGJ1ZiArIG91dCwgbGVuIC0gb3V0LAogCQkJIiAgTWFzdGVyeTogJWQgKCVkKVxuIiwKIAkJCWF0b21pY19yZWFkKCZkbG0tPm1sZV9jdXJfY291bnRbRExNX01MRV9NQVNURVJdKSwKIAkJCWF0b21pY19yZWFkKCZkbG0tPm1sZV90b3RfY291bnRbRExNX01MRV9NQVNURVJdKSk7CiAKIAkvKiAgTWlncmF0aW9uOiB4eHggKHh4eCkgKi8KLQlvdXQgKz0gc25wcmludGYoZGItPmJ1ZiArIG91dCwgZGItPmxlbiAtIG91dCwKKwlvdXQgKz0gc25wcmludGYoYnVmICsgb3V0LCBsZW4gLSBvdXQsCiAJCQkiICBNaWdyYXRpb246ICVkICglZClcbiIsCiAJCQlhdG9taWNfcmVhZCgmZGxtLT5tbGVfY3VyX2NvdW50W0RMTV9NTEVfTUlHUkFUSU9OXSksCiAJCQlhdG9taWNfcmVhZCgmZGxtLT5tbGVfdG90X2NvdW50W0RMTV9NTEVfTUlHUkFUSU9OXSkpOwogCiAJLyogTGlzdHM6IERpcnR5PUVtcHR5ICBQdXJnZT1JblVzZSAgUGVuZGluZ0FTVHM9RW1wdHkgIC4uLiAqLwotCW91dCArPSBzbnByaW50ZihkYi0+YnVmICsgb3V0LCBkYi0+bGVuIC0gb3V0LAorCW91dCArPSBzbnByaW50ZihidWYgKyBvdXQsIGxlbiAtIG91dCwKIAkJCSJMaXN0czogRGlydHk9JXMgIFB1cmdlPSVzICBQZW5kaW5nQVNUcz0lcyAgIgogCQkJIlBlbmRpbmdCQVNUcz0lc1xuIiwKIAkJCShsaXN0X2VtcHR5KCZkbG0tPmRpcnR5X2xpc3QpID8gIkVtcHR5IiA6ICJJblVzZSIpLApAQCAtODUyLDEyICs4MDYsMTIgQEAKIAkJCShsaXN0X2VtcHR5KCZkbG0tPnBlbmRpbmdfYmFzdHMpID8gIkVtcHR5IiA6ICJJblVzZSIpKTsKIAogCS8qIFB1cmdlIENvdW50OiB4eHggIFJlZnM6IHh4eCAqLwotCW91dCArPSBzbnByaW50ZihkYi0+YnVmICsgb3V0LCBkYi0+bGVuIC0gb3V0LAorCW91dCArPSBzbnByaW50ZihidWYgKyBvdXQsIGxlbiAtIG91dCwKIAkJCSJQdXJnZSBDb3VudDogJWQgIFJlZnM6ICVkXG4iLCBkbG0tPnB1cmdlX2NvdW50LAogCQkJYXRvbWljX3JlYWQoJmRsbS0+ZGxtX3JlZnMucmVmY291bnQpKTsKIAogCS8qIERlYWQgTm9kZTogeHh4ICovCi0Jb3V0ICs9IHNucHJpbnRmKGRiLT5idWYgKyBvdXQsIGRiLT5sZW4gLSBvdXQsCisJb3V0ICs9IHNucHJpbnRmKGJ1ZiArIG91dCwgbGVuIC0gb3V0LAogCQkJIkRlYWQgTm9kZTogJWRcbiIsIGRsbS0+cmVjby5kZWFkX25vZGUpOwogCiAJLyogV2hhdCBhYm91dCBETE1fUkVDT19TVEFURV9GSU5BTElaRT8gKi8KQEAgLTg2NywxOSArODIxLDE5IEBACiAJCXN0YXRlID0gIklOQUNUSVZFIjsKIAogCS8qIFJlY292ZXJ5IFBpZDogeHh4eCAgTWFzdGVyOiB4eHggIFN0YXRlOiB4eHh4ICovCi0Jb3V0ICs9IHNucHJpbnRmKGRiLT5idWYgKyBvdXQsIGRiLT5sZW4gLSBvdXQsCisJb3V0ICs9IHNucHJpbnRmKGJ1ZiArIG91dCwgbGVuIC0gb3V0LAogCQkJIlJlY292ZXJ5IFBpZDogJWQgIE1hc3RlcjogJWQgIFN0YXRlOiAlc1xuIiwKLQkJCWRsbS0+ZGxtX3JlY29fdGhyZWFkX3Rhc2stPnBpZCwKKwkJCXRhc2tfcGlkX25yKGRsbS0+ZGxtX3JlY29fdGhyZWFkX3Rhc2spLAogCQkJZGxtLT5yZWNvLm5ld19tYXN0ZXIsIHN0YXRlKTsKIAogCS8qIFJlY292ZXJ5IE1hcDogeHggeHggKi8KLQlvdXQgKz0gc25wcmludGYoZGItPmJ1ZiArIG91dCwgZGItPmxlbiAtIG91dCwgIlJlY292ZXJ5IE1hcDogIik7CisJb3V0ICs9IHNucHJpbnRmKGJ1ZiArIG91dCwgbGVuIC0gb3V0LCAiUmVjb3ZlcnkgTWFwOiAiKTsKIAlvdXQgKz0gc3RyaW5naWZ5X25vZGVtYXAoZGxtLT5yZWNvdmVyeV9tYXAsIE8yTk1fTUFYX05PREVTLAotCQkJCSBkYi0+YnVmICsgb3V0LCBkYi0+bGVuIC0gb3V0KTsKLQlvdXQgKz0gc25wcmludGYoZGItPmJ1ZiArIG91dCwgZGItPmxlbiAtIG91dCwgIlxuIik7CisJCQkJIGJ1ZiArIG91dCwgbGVuIC0gb3V0KTsKKwlvdXQgKz0gc25wcmludGYoYnVmICsgb3V0LCBsZW4gLSBvdXQsICJcbiIpOwogCiAJLyogUmVjb3ZlcnkgTm9kZSBTdGF0ZTogKi8KLQlvdXQgKz0gc25wcmludGYoZGItPmJ1ZiArIG91dCwgZGItPmxlbiAtIG91dCwgIlJlY292ZXJ5IE5vZGUgU3RhdGU6XG4iKTsKKwlvdXQgKz0gc25wcmludGYoYnVmICsgb3V0LCBsZW4gLSBvdXQsICJSZWNvdmVyeSBOb2RlIFN0YXRlOlxuIik7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeShub2RlLCAmZGxtLT5yZWNvLm5vZGVfZGF0YSwgbGlzdCkgewogCQlzd2l0Y2ggKG5vZGUtPnN0YXRlKSB7CiAJCWNhc2UgRExNX1JFQ09fTk9ERV9EQVRBX0lOSVQ6CkBAIC05MDcsNyArODYxLDcgQEAKIAkJCXN0YXRlID0gIkJBRCI7CiAJCQlicmVhazsKIAkJfQotCQlvdXQgKz0gc25wcmludGYoZGItPmJ1ZiArIG91dCwgZGItPmxlbiAtIG91dCwgIlx0JXUgLSAlc1xuIiwKKwkJb3V0ICs9IHNucHJpbnRmKGJ1ZiArIG91dCwgbGVuIC0gb3V0LCAiXHQldSAtICVzXG4iLAogCQkJCW5vZGUtPm5vZGVfbnVtLCBzdGF0ZSk7CiAJfQogCkBAIC05MTksMTUgKzg3MywxNSBAQAogc3RhdGljIGludCBkZWJ1Z19zdGF0ZV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQogewogCXN0cnVjdCBkbG1fY3R4dCAqZGxtID0gaW5vZGUtPmlfcHJpdmF0ZTsKLQlzdHJ1Y3QgZGVidWdfYnVmZmVyICpkYiA9IE5VTEw7CisJY2hhciAqYnVmID0gTlVMTDsKIAotCWRiID0gZGVidWdfYnVmZmVyX2FsbG9jYXRlKCk7Ci0JaWYgKCFkYikKKwlidWYgPSAoY2hhciAqKSBnZXRfemVyb2VkX3BhZ2UoR0ZQX05PRlMpOworCWlmICghYnVmKQogCQlnb3RvIGJhaWw7CiAKLQlkYi0+bGVuID0gZGVidWdfc3RhdGVfcHJpbnQoZGxtLCBkYik7CisJaV9zaXplX3dyaXRlKGlub2RlLCBkZWJ1Z19zdGF0ZV9wcmludChkbG0sIGJ1ZiwgUEFHRV9TSVpFIC0gMSkpOwogCi0JZmlsZS0+cHJpdmF0ZV9kYXRhID0gZGI7CisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gYnVmOwogCiAJcmV0dXJuIDA7CiBiYWlsOgpAQCAtOTM2LDkgKzg5MCw5IEBACiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGRlYnVnX3N0YXRlX2ZvcHMgPSB7CiAJLm9wZW4gPQkJZGVidWdfc3RhdGVfb3BlbiwKLQkucmVsZWFzZSA9CWRlYnVnX2J1ZmZlcl9yZWxlYXNlLAotCS5yZWFkID0JCWRlYnVnX2J1ZmZlcl9yZWFkLAotCS5sbHNlZWsgPQlkZWJ1Z19idWZmZXJfbGxzZWVrLAorCS5yZWxlYXNlID0JZGVidWdfcmVsZWFzZSwKKwkucmVhZCA9CQlkZWJ1Z19yZWFkLAorCS5sbHNlZWsgPQlnZW5lcmljX2ZpbGVfbGxzZWVrLAogfTsKIC8qIGVuZCAgLSBkZWJ1ZyBzdGF0ZSBmdW5jcyAqLwogCkBAIC0xMDAyLDE0ICs5NTYsMTAgQEAKIAlzdHJ1Y3QgZGxtX2RlYnVnX2N0eHQgKmRjID0gZGxtLT5kbG1fZGVidWdfY3R4dDsKIAogCWlmIChkYykgewotCQlpZiAoZGMtPmRlYnVnX3B1cmdlbGlzdF9kZW50cnkpCi0JCQlkZWJ1Z2ZzX3JlbW92ZShkYy0+ZGVidWdfcHVyZ2VsaXN0X2RlbnRyeSk7Ci0JCWlmIChkYy0+ZGVidWdfbWxlX2RlbnRyeSkKLQkJCWRlYnVnZnNfcmVtb3ZlKGRjLT5kZWJ1Z19tbGVfZGVudHJ5KTsKLQkJaWYgKGRjLT5kZWJ1Z19sb2NrcmVzX2RlbnRyeSkKLQkJCWRlYnVnZnNfcmVtb3ZlKGRjLT5kZWJ1Z19sb2NrcmVzX2RlbnRyeSk7Ci0JCWlmIChkYy0+ZGVidWdfc3RhdGVfZGVudHJ5KQotCQkJZGVidWdmc19yZW1vdmUoZGMtPmRlYnVnX3N0YXRlX2RlbnRyeSk7CisJCWRlYnVnZnNfcmVtb3ZlKGRjLT5kZWJ1Z19wdXJnZWxpc3RfZGVudHJ5KTsKKwkJZGVidWdmc19yZW1vdmUoZGMtPmRlYnVnX21sZV9kZW50cnkpOworCQlkZWJ1Z2ZzX3JlbW92ZShkYy0+ZGVidWdfbG9ja3Jlc19kZW50cnkpOworCQlkZWJ1Z2ZzX3JlbW92ZShkYy0+ZGVidWdfc3RhdGVfZGVudHJ5KTsKIAkJZGxtX2RlYnVnX3B1dChkYyk7CiAJfQogfQpAQCAtMTA0MCw4ICs5OTAsNyBAQAogCiB2b2lkIGRsbV9kZXN0cm95X2RlYnVnZnNfc3Vicm9vdChzdHJ1Y3QgZGxtX2N0eHQgKmRsbSkKIHsKLQlpZiAoZGxtLT5kbG1fZGVidWdmc19zdWJyb290KQotCQlkZWJ1Z2ZzX3JlbW92ZShkbG0tPmRsbV9kZWJ1Z2ZzX3N1YnJvb3QpOworCWRlYnVnZnNfcmVtb3ZlKGRsbS0+ZGxtX2RlYnVnZnNfc3Vicm9vdCk7CiB9CiAKIC8qIGRlYnVnZnMgcm9vdCAqLwpAQCAtMTA1Nyw3ICsxMDA2LDYgQEAKIAogdm9pZCBkbG1fZGVzdHJveV9kZWJ1Z2ZzX3Jvb3Qodm9pZCkKIHsKLQlpZiAoZGxtX2RlYnVnZnNfcm9vdCkKLQkJZGVidWdmc19yZW1vdmUoZGxtX2RlYnVnZnNfcm9vdCk7CisJZGVidWdmc19yZW1vdmUoZGxtX2RlYnVnZnNfcm9vdCk7CiB9CiAjZW5kaWYJLyogQ09ORklHX0RFQlVHX0ZTICovCmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9kbG0vZGxtZGVidWcuaCBiL2ZzL29jZnMyL2RsbS9kbG1kZWJ1Zy5oCmluZGV4IDhjNjg2ZDIuLjFmMjdjNDggMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL2RsbS9kbG1kZWJ1Zy5oCisrKyBiL2ZzL29jZnMyL2RsbS9kbG1kZWJ1Zy5oCkBAIC0zNywxMSArMzcsNiBAQAogCXN0cnVjdCBkZW50cnkgKmRlYnVnX3B1cmdlbGlzdF9kZW50cnk7CiB9OwogCi1zdHJ1Y3QgZGVidWdfYnVmZmVyIHsKLQlpbnQgbGVuOwotCWNoYXIgKmJ1ZjsKLX07Ci0KIHN0cnVjdCBkZWJ1Z19sb2NrcmVzIHsKIAlpbnQgZGxfbGVuOwogCWNoYXIgKmRsX2J1ZjsKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2RsbS9kbG1kb21haW4uYyBiL2ZzL29jZnMyL2RsbS9kbG1kb21haW4uYwppbmRleCBjYzJhYWE5Li43ZTM4YTA3IDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9kbG0vZGxtZG9tYWluLmMKKysrIGIvZnMvb2NmczIvZGxtL2RsbWRvbWFpbi5jCkBAIC00NjAsOCArNDYwLDYgQEAKIAkJfQogCQljb25kX3Jlc2NoZWRfbG9jaygmZGxtLT5zcGlubG9jayk7CiAJCW51bSArPSBuOwotCQltbG9nKDAsICIlczogdG91Y2hlZCAlZCBsb2NrcmVzZXMgaW4gYnVja2V0ICVkICIKLQkJICAgICAiKHRvdD0lZClcbiIsIGRsbS0+bmFtZSwgbiwgaSwgbnVtKTsKIAl9CiAJc3Bpbl91bmxvY2soJmRsbS0+c3BpbmxvY2spOwogCXdha2VfdXAoJmRsbS0+ZGxtX3RocmVhZF93cSk7CkBAIC0xNjYxLDggKzE2NTksOCBAQAogCiBzdGF0aWMgdm9pZCBkbG1fdW5yZWdpc3Rlcl9kb21haW5faGFuZGxlcnMoc3RydWN0IGRsbV9jdHh0ICpkbG0pCiB7Ci0JbzJoYl91bnJlZ2lzdGVyX2NhbGxiYWNrKE5VTEwsICZkbG0tPmRsbV9oYl91cCk7Ci0JbzJoYl91bnJlZ2lzdGVyX2NhbGxiYWNrKE5VTEwsICZkbG0tPmRsbV9oYl9kb3duKTsKKwlvMmhiX3VucmVnaXN0ZXJfY2FsbGJhY2soZGxtLT5uYW1lLCAmZGxtLT5kbG1faGJfdXApOworCW8yaGJfdW5yZWdpc3Rlcl9jYWxsYmFjayhkbG0tPm5hbWUsICZkbG0tPmRsbV9oYl9kb3duKTsKIAlvMm5ldF91bnJlZ2lzdGVyX2hhbmRsZXJfbGlzdCgmZGxtLT5kbG1fZG9tYWluX2hhbmRsZXJzKTsKIH0KIApAQCAtMTY3NCwxMyArMTY3MiwxMyBAQAogCiAJbzJoYl9zZXR1cF9jYWxsYmFjaygmZGxtLT5kbG1faGJfZG93biwgTzJIQl9OT0RFX0RPV05fQ0IsCiAJCQkgICAgZGxtX2hiX25vZGVfZG93bl9jYiwgZGxtLCBETE1fSEJfTk9ERV9ET1dOX1BSSSk7Ci0Jc3RhdHVzID0gbzJoYl9yZWdpc3Rlcl9jYWxsYmFjayhOVUxMLCAmZGxtLT5kbG1faGJfZG93bik7CisJc3RhdHVzID0gbzJoYl9yZWdpc3Rlcl9jYWxsYmFjayhkbG0tPm5hbWUsICZkbG0tPmRsbV9oYl9kb3duKTsKIAlpZiAoc3RhdHVzKQogCQlnb3RvIGJhaWw7CiAKIAlvMmhiX3NldHVwX2NhbGxiYWNrKCZkbG0tPmRsbV9oYl91cCwgTzJIQl9OT0RFX1VQX0NCLAogCQkJICAgIGRsbV9oYl9ub2RlX3VwX2NiLCBkbG0sIERMTV9IQl9OT0RFX1VQX1BSSSk7Ci0Jc3RhdHVzID0gbzJoYl9yZWdpc3Rlcl9jYWxsYmFjayhOVUxMLCAmZGxtLT5kbG1faGJfdXApOworCXN0YXR1cyA9IG8yaGJfcmVnaXN0ZXJfY2FsbGJhY2soZGxtLT5uYW1lLCAmZGxtLT5kbG1faGJfdXApOwogCWlmIChzdGF0dXMpCiAJCWdvdG8gYmFpbDsKIApkaWZmIC0tZ2l0IGEvZnMvb2NmczIvZGxtL2RsbWxvY2suYyBiL2ZzL29jZnMyL2RsbS9kbG1sb2NrLmMKaW5kZXggNjljZjM2OS4uNzAwOTI5MiAxMDA2NDQKLS0tIGEvZnMvb2NmczIvZGxtL2RsbWxvY2suYworKysgYi9mcy9vY2ZzMi9kbG0vZGxtbG9jay5jCkBAIC0xMDYsNiArMTA2LDkgQEAKIAogCQlpZiAoIWRsbV9sb2NrX2NvbXBhdGlibGUodG1wbG9jay0+bWwudHlwZSwgbG9jay0+bWwudHlwZSkpCiAJCQlyZXR1cm4gMDsKKwkJaWYgKCFkbG1fbG9ja19jb21wYXRpYmxlKHRtcGxvY2stPm1sLmNvbnZlcnRfdHlwZSwKKwkJCQkJIGxvY2stPm1sLnR5cGUpKQorCQkJcmV0dXJuIDA7CiAJfQogCiAJcmV0dXJuIDE7CmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9kbG0vZGxtdGhyZWFkLmMgYi9mcy9vY2ZzMi9kbG0vZGxtdGhyZWFkLmMKaW5kZXggMjIxMWFjZi4uMWQ2ZDFkMiAxMDA2NDQKLS0tIGEvZnMvb2NmczIvZGxtL2RsbXRocmVhZC5jCisrKyBiL2ZzL29jZnMyL2RsbS9kbG10aHJlYWQuYwpAQCAtMTIyLDE1ICsxMjIsMTMgQEAKIHZvaWQgX19kbG1fbG9ja3Jlc19jYWxjX3VzYWdlKHN0cnVjdCBkbG1fY3R4dCAqZGxtLAogCQkJICAgICAgc3RydWN0IGRsbV9sb2NrX3Jlc291cmNlICpyZXMpCiB7Ci0JbWxvZ19lbnRyeSgiJS4qc1xuIiwgcmVzLT5sb2NrbmFtZS5sZW4sIHJlcy0+bG9ja25hbWUubmFtZSk7Ci0KIAlhc3NlcnRfc3Bpbl9sb2NrZWQoJmRsbS0+c3BpbmxvY2spOwogCWFzc2VydF9zcGluX2xvY2tlZCgmcmVzLT5zcGlubG9jayk7CiAKIAlpZiAoX19kbG1fbG9ja3Jlc191bnVzZWQocmVzKSl7CiAJCWlmIChsaXN0X2VtcHR5KCZyZXMtPnB1cmdlKSkgewotCQkJbWxvZygwLCAicHV0dGluZyBsb2NrcmVzICUuKnM6JXAgb250byBwdXJnZSBsaXN0XG4iLAotCQkJICAgICByZXMtPmxvY2tuYW1lLmxlbiwgcmVzLT5sb2NrbmFtZS5uYW1lLCByZXMpOworCQkJbWxvZygwLCAiJXM6IEFkZGluZyByZXMgJS4qcyB0byBwdXJnZSBsaXN0XG4iLAorCQkJICAgICBkbG0tPm5hbWUsIHJlcy0+bG9ja25hbWUubGVuLCByZXMtPmxvY2tuYW1lLm5hbWUpOwogCiAJCQlyZXMtPmxhc3RfdXNlZCA9IGppZmZpZXM7CiAJCQlkbG1fbG9ja3Jlc19nZXQocmVzKTsKQEAgLTEzOCw4ICsxMzYsOCBAQAogCQkJZGxtLT5wdXJnZV9jb3VudCsrOwogCQl9CiAJfSBlbHNlIGlmICghbGlzdF9lbXB0eSgmcmVzLT5wdXJnZSkpIHsKLQkJbWxvZygwLCAicmVtb3ZpbmcgbG9ja3JlcyAlLipzOiVwIGZyb20gcHVyZ2UgbGlzdCwgb3duZXI9JXVcbiIsCi0JCSAgICAgcmVzLT5sb2NrbmFtZS5sZW4sIHJlcy0+bG9ja25hbWUubmFtZSwgcmVzLCByZXMtPm93bmVyKTsKKwkJbWxvZygwLCAiJXM6IFJlbW92aW5nIHJlcyAlLipzIGZyb20gcHVyZ2UgbGlzdFxuIiwKKwkJICAgICBkbG0tPm5hbWUsIHJlcy0+bG9ja25hbWUubGVuLCByZXMtPmxvY2tuYW1lLm5hbWUpOwogCiAJCWxpc3RfZGVsX2luaXQoJnJlcy0+cHVyZ2UpOwogCQlkbG1fbG9ja3Jlc19wdXQocmVzKTsKQEAgLTE1MCw3ICsxNDgsNiBAQAogdm9pZCBkbG1fbG9ja3Jlc19jYWxjX3VzYWdlKHN0cnVjdCBkbG1fY3R4dCAqZGxtLAogCQkJICAgIHN0cnVjdCBkbG1fbG9ja19yZXNvdXJjZSAqcmVzKQogewotCW1sb2dfZW50cnkoIiUuKnNcbiIsIHJlcy0+bG9ja25hbWUubGVuLCByZXMtPmxvY2tuYW1lLm5hbWUpOwogCXNwaW5fbG9jaygmZGxtLT5zcGlubG9jayk7CiAJc3Bpbl9sb2NrKCZyZXMtPnNwaW5sb2NrKTsKIApAQCAtMTcxLDkgKzE2OCw4IEBACiAKIAltYXN0ZXIgPSAocmVzLT5vd25lciA9PSBkbG0tPm5vZGVfbnVtKTsKIAotCi0JbWxvZygwLCAicHVyZ2luZyBsb2NrcmVzICUuKnMsIG1hc3RlciA9ICVkXG4iLCByZXMtPmxvY2tuYW1lLmxlbiwKLQkgICAgIHJlcy0+bG9ja25hbWUubmFtZSwgbWFzdGVyKTsKKwltbG9nKDAsICIlczogUHVyZ2luZyByZXMgJS4qcywgbWFzdGVyICVkXG4iLCBkbG0tPm5hbWUsCisJICAgICByZXMtPmxvY2tuYW1lLmxlbiwgcmVzLT5sb2NrbmFtZS5uYW1lLCBtYXN0ZXIpOwogCiAJaWYgKCFtYXN0ZXIpIHsKIAkJcmVzLT5zdGF0ZSB8PSBETE1fTE9DS19SRVNfRFJPUFBJTkdfUkVGOwpAQCAtMTg5LDI3ICsxODUsMjUgQEAKIAkJLyogY2xlYXIgb3VyIGJpdCBmcm9tIHRoZSBtYXN0ZXIncyByZWZtYXAsIGlnbm9yZSBlcnJvcnMgKi8KIAkJcmV0ID0gZGxtX2Ryb3BfbG9ja3Jlc19yZWYoZGxtLCByZXMpOwogCQlpZiAocmV0IDwgMCkgewotCQkJbWxvZ19lcnJubyhyZXQpOworCQkJbWxvZyhNTF9FUlJPUiwgIiVzOiBkZXJlZiAlLipzIGZhaWxlZCAlZFxuIiwgZGxtLT5uYW1lLAorCQkJICAgICByZXMtPmxvY2tuYW1lLmxlbiwgcmVzLT5sb2NrbmFtZS5uYW1lLCByZXQpOwogCQkJaWYgKCFkbG1faXNfaG9zdF9kb3duKHJldCkpCiAJCQkJQlVHKCk7CiAJCX0KLQkJbWxvZygwLCAiJXM6JS4qczogZGxtX2RlcmVmX2xvY2tyZXMgcmV0dXJuZWQgJWRcbiIsCi0JCSAgICAgZGxtLT5uYW1lLCByZXMtPmxvY2tuYW1lLmxlbiwgcmVzLT5sb2NrbmFtZS5uYW1lLCByZXQpOwogCQlzcGluX2xvY2soJmRsbS0+c3BpbmxvY2spOwogCQlzcGluX2xvY2soJnJlcy0+c3BpbmxvY2spOwogCX0KIAogCWlmICghbGlzdF9lbXB0eSgmcmVzLT5wdXJnZSkpIHsKLQkJbWxvZygwLCAicmVtb3ZpbmcgbG9ja3JlcyAlLipzOiVwIGZyb20gcHVyZ2VsaXN0LCAiCi0JCSAgICAgIm1hc3RlciA9ICVkXG4iLCByZXMtPmxvY2tuYW1lLmxlbiwgcmVzLT5sb2NrbmFtZS5uYW1lLAotCQkgICAgIHJlcywgbWFzdGVyKTsKKwkJbWxvZygwLCAiJXM6IFJlbW92aW5nIHJlcyAlLipzIGZyb20gcHVyZ2VsaXN0LCBtYXN0ZXIgJWRcbiIsCisJCSAgICAgZGxtLT5uYW1lLCByZXMtPmxvY2tuYW1lLmxlbiwgcmVzLT5sb2NrbmFtZS5uYW1lLCBtYXN0ZXIpOwogCQlsaXN0X2RlbF9pbml0KCZyZXMtPnB1cmdlKTsKIAkJZGxtX2xvY2tyZXNfcHV0KHJlcyk7CiAJCWRsbS0+cHVyZ2VfY291bnQtLTsKIAl9CiAKIAlpZiAoIV9fZGxtX2xvY2tyZXNfdW51c2VkKHJlcykpIHsKLQkJbWxvZyhNTF9FUlJPUiwgImZvdW5kIGxvY2tyZXMgJXM6JS4qczogaW4gdXNlIGFmdGVyIGRlcmVmXG4iLAorCQltbG9nKE1MX0VSUk9SLCAiJXM6IHJlcyAlLipzIGluIHVzZSBhZnRlciBkZXJlZlxuIiwKIAkJICAgICBkbG0tPm5hbWUsIHJlcy0+bG9ja25hbWUubGVuLCByZXMtPmxvY2tuYW1lLm5hbWUpOwogCQlfX2RsbV9wcmludF9vbmVfbG9ja19yZXNvdXJjZShyZXMpOwogCQlCVUcoKTsKQEAgLTI2NiwxMCArMjYwLDEwIEBACiAJCXVudXNlZCA9IF9fZGxtX2xvY2tyZXNfdW51c2VkKGxvY2tyZXMpOwogCQlpZiAoIXVudXNlZCB8fAogCQkgICAgKGxvY2tyZXMtPnN0YXRlICYgRExNX0xPQ0tfUkVTX01JR1JBVElORykpIHsKLQkJCW1sb2coMCwgImxvY2tyZXMgJXM6JS4qczogaXMgaW4gdXNlIG9yICIKLQkJCSAgICAgImJlaW5nIHJlbWFzdGVyZWQsIHVzZWQgJWQsIHN0YXRlICVkXG4iLAotCQkJICAgICBkbG0tPm5hbWUsIGxvY2tyZXMtPmxvY2tuYW1lLmxlbiwKLQkJCSAgICAgbG9ja3Jlcy0+bG9ja25hbWUubmFtZSwgIXVudXNlZCwgbG9ja3Jlcy0+c3RhdGUpOworCQkJbWxvZygwLCAiJXM6IHJlcyAlLipzIGlzIGluIHVzZSBvciBiZWluZyByZW1hc3RlcmVkLCAiCisJCQkgICAgICJ1c2VkICVkLCBzdGF0ZSAlZFxuIiwgZGxtLT5uYW1lLAorCQkJICAgICBsb2NrcmVzLT5sb2NrbmFtZS5sZW4sIGxvY2tyZXMtPmxvY2tuYW1lLm5hbWUsCisJCQkgICAgICF1bnVzZWQsIGxvY2tyZXMtPnN0YXRlKTsKIAkJCWxpc3RfbW92ZV90YWlsKCZkbG0tPnB1cmdlX2xpc3QsICZsb2NrcmVzLT5wdXJnZSk7CiAJCQlzcGluX3VubG9jaygmbG9ja3Jlcy0+c3BpbmxvY2spOwogCQkJY29udGludWU7CkBAIC0yOTYsMTUgKzI5MCwxMiBAQAogCXN0cnVjdCBsaXN0X2hlYWQgKmhlYWQ7CiAJaW50IGNhbl9ncmFudCA9IDE7CiAKLQkvL21sb2coMCwgInJlcy0+bG9ja25hbWUubGVuPSVkXG4iLCByZXMtPmxvY2tuYW1lLmxlbik7Ci0JLy9tbG9nKDAsICJyZXMtPmxvY2tuYW1lLm5hbWU9JXBcbiIsIHJlcy0+bG9ja25hbWUubmFtZSk7Ci0JLy9tbG9nKDAsICJzaHVmZmxlIHJlcyAlLipzXG4iLCByZXMtPmxvY2tuYW1lLmxlbiwKLQkvLwkgIHJlcy0+bG9ja25hbWUubmFtZSk7Ci0KLQkvKiBiZWNhdXNlIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdpdGggdGhlIGxvY2tyZXMKKwkvKgorCSAqIEJlY2F1c2UgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2l0aCB0aGUgbG9ja3JlcwogCSAqIHNwaW5sb2NrLCBhbmQgYmVjYXVzZSB3ZSBrbm93IHRoYXQgaXQgaXMgbm90IG1pZ3JhdGluZy8KIAkgKiByZWNvdmVyaW5nL2luLXByb2dyZXNzLCBpdCBpcyBmaW5lIHRvIHJlc2VydmUgYXN0cyBhbmQKLQkgKiBiYXN0cyByaWdodCBiZWZvcmUgcXVldWVpbmcgdGhlbSBhbGwgdGhyb3VnaG91dCAqLworCSAqIGJhc3RzIHJpZ2h0IGJlZm9yZSBxdWV1ZWluZyB0aGVtIGFsbCB0aHJvdWdob3V0CisJICovCiAJYXNzZXJ0X3NwaW5fbG9ja2VkKCZkbG0tPmFzdF9sb2NrKTsKIAlhc3NlcnRfc3Bpbl9sb2NrZWQoJnJlcy0+c3BpbmxvY2spOwogCUJVR19PTigocmVzLT5zdGF0ZSAmIChETE1fTE9DS19SRVNfTUlHUkFUSU5HfApAQCAtMzE0LDEzICszMDUsMTMgQEAKIGNvbnZlcnRpbmc6CiAJaWYgKGxpc3RfZW1wdHkoJnJlcy0+Y29udmVydGluZykpCiAJCWdvdG8gYmxvY2tlZDsKLQltbG9nKDAsICJyZXMgJS4qcyBoYXMgbG9ja3Mgb24gYSBjb252ZXJ0IHF1ZXVlXG4iLCByZXMtPmxvY2tuYW1lLmxlbiwKLQkgICAgIHJlcy0+bG9ja25hbWUubmFtZSk7CisJbWxvZygwLCAiJXM6IHJlcyAlLipzIGhhcyBsb2NrcyBvbiB0aGUgY29udmVydCBxdWV1ZVxuIiwgZGxtLT5uYW1lLAorCSAgICAgcmVzLT5sb2NrbmFtZS5sZW4sIHJlcy0+bG9ja25hbWUubmFtZSk7CiAKIAl0YXJnZXQgPSBsaXN0X2VudHJ5KHJlcy0+Y29udmVydGluZy5uZXh0LCBzdHJ1Y3QgZGxtX2xvY2ssIGxpc3QpOwogCWlmICh0YXJnZXQtPm1sLmNvbnZlcnRfdHlwZSA9PSBMS01fSVZNT0RFKSB7Ci0JCW1sb2coTUxfRVJST1IsICIlLipzOiBjb252ZXJ0aW5nIGEgbG9jayB3aXRoIG5vICIKLQkJICAgICAiY29udmVydF90eXBlIVxuIiwgcmVzLT5sb2NrbmFtZS5sZW4sIHJlcy0+bG9ja25hbWUubmFtZSk7CisJCW1sb2coTUxfRVJST1IsICIlczogcmVzICUuKnMgY29udmVydGluZyBsb2NrIHRvIGludmFsaWQgbW9kZVxuIiwKKwkJICAgICBkbG0tPm5hbWUsIHJlcy0+bG9ja25hbWUubGVuLCByZXMtPmxvY2tuYW1lLm5hbWUpOwogCQlCVUcoKTsKIAl9CiAJaGVhZCA9ICZyZXMtPmdyYW50ZWQ7CkBAIC0zNjUsOSArMzU2LDEyIEBACiAJCXNwaW5fbG9jaygmdGFyZ2V0LT5zcGlubG9jayk7CiAJCUJVR19PTih0YXJnZXQtPm1sLmhpZ2hlc3RfYmxvY2tlZCAhPSBMS01fSVZNT0RFKTsKIAotCQltbG9nKDAsICJjYWxsaW5nIGFzdCBmb3IgY29udmVydGluZyBsb2NrOiAlLipzLCBoYXZlOiAlZCwgIgotCQkgICAgICJncmFudGluZzogJWQsIG5vZGU6ICV1XG4iLCByZXMtPmxvY2tuYW1lLmxlbiwKLQkJICAgICByZXMtPmxvY2tuYW1lLm5hbWUsIHRhcmdldC0+bWwudHlwZSwKKwkJbWxvZygwLCAiJXM6IHJlcyAlLipzLCBBU1QgZm9yIENvbnZlcnRpbmcgbG9jayAldTolbGx1LCB0eXBlICIKKwkJICAgICAiJWQgPT4gJWQsIG5vZGUgJXVcbiIsIGRsbS0+bmFtZSwgcmVzLT5sb2NrbmFtZS5sZW4sCisJCSAgICAgcmVzLT5sb2NrbmFtZS5uYW1lLAorCQkgICAgIGRsbV9nZXRfbG9ja19jb29raWVfbm9kZShiZTY0X3RvX2NwdSh0YXJnZXQtPm1sLmNvb2tpZSkpLAorCQkgICAgIGRsbV9nZXRfbG9ja19jb29raWVfc2VxKGJlNjRfdG9fY3B1KHRhcmdldC0+bWwuY29va2llKSksCisJCSAgICAgdGFyZ2V0LT5tbC50eXBlLAogCQkgICAgIHRhcmdldC0+bWwuY29udmVydF90eXBlLCB0YXJnZXQtPm1sLm5vZGUpOwogCiAJCXRhcmdldC0+bWwudHlwZSA9IHRhcmdldC0+bWwuY29udmVydF90eXBlOwpAQCAtNDI4LDExICs0MjIsMTQgQEAKIAkJc3Bpbl9sb2NrKCZ0YXJnZXQtPnNwaW5sb2NrKTsKIAkJQlVHX09OKHRhcmdldC0+bWwuaGlnaGVzdF9ibG9ja2VkICE9IExLTV9JVk1PREUpOwogCi0JCW1sb2coMCwgImNhbGxpbmcgYXN0IGZvciBibG9ja2VkIGxvY2s6ICUuKnMsIGdyYW50aW5nOiAlZCwgIgotCQkgICAgICJub2RlOiAldVxuIiwgcmVzLT5sb2NrbmFtZS5sZW4sIHJlcy0+bG9ja25hbWUubmFtZSwKKwkJbWxvZygwLCAiJXM6IHJlcyAlLipzLCBBU1QgZm9yIEJsb2NrZWQgbG9jayAldTolbGx1LCB0eXBlICVkLCAiCisJCSAgICAgIm5vZGUgJXVcbiIsIGRsbS0+bmFtZSwgcmVzLT5sb2NrbmFtZS5sZW4sCisJCSAgICAgcmVzLT5sb2NrbmFtZS5uYW1lLAorCQkgICAgIGRsbV9nZXRfbG9ja19jb29raWVfbm9kZShiZTY0X3RvX2NwdSh0YXJnZXQtPm1sLmNvb2tpZSkpLAorCQkgICAgIGRsbV9nZXRfbG9ja19jb29raWVfc2VxKGJlNjRfdG9fY3B1KHRhcmdldC0+bWwuY29va2llKSksCiAJCSAgICAgdGFyZ2V0LT5tbC50eXBlLCB0YXJnZXQtPm1sLm5vZGUpOwogCi0JCS8vIHRhcmdldC0+bWwudHlwZSBpcyBhbHJlYWR5IGNvcnJlY3QKKwkJLyogdGFyZ2V0LT5tbC50eXBlIGlzIGFscmVhZHkgY29ycmVjdCAqLwogCQlsaXN0X21vdmVfdGFpbCgmdGFyZ2V0LT5saXN0LCAmcmVzLT5ncmFudGVkKTsKIAogCQlCVUdfT04oIXRhcmdldC0+bGtzYik7CkBAIC00NTMsNyArNDUwLDYgQEAKIC8qIG11c3QgaGF2ZSBOTyBsb2NrcyB3aGVuIGNhbGxpbmcgdGhpcyB3aXRoIHJlcyAhPU5VTEwgKiAqLwogdm9pZCBkbG1fa2lja190aHJlYWQoc3RydWN0IGRsbV9jdHh0ICpkbG0sIHN0cnVjdCBkbG1fbG9ja19yZXNvdXJjZSAqcmVzKQogewotCW1sb2dfZW50cnkoImRsbT0lcCwgcmVzPSVwXG4iLCBkbG0sIHJlcyk7CiAJaWYgKHJlcykgewogCQlzcGluX2xvY2soJmRsbS0+c3BpbmxvY2spOwogCQlzcGluX2xvY2soJnJlcy0+c3BpbmxvY2spOwpAQCAtNDY2LDggKzQ2Miw2IEBACiAKIHZvaWQgX19kbG1fZGlydHlfbG9ja3JlcyhzdHJ1Y3QgZGxtX2N0eHQgKmRsbSwgc3RydWN0IGRsbV9sb2NrX3Jlc291cmNlICpyZXMpCiB7Ci0JbWxvZ19lbnRyeSgiZGxtPSVwLCByZXM9JXBcbiIsIGRsbSwgcmVzKTsKLQogCWFzc2VydF9zcGluX2xvY2tlZCgmZGxtLT5zcGlubG9jayk7CiAJYXNzZXJ0X3NwaW5fbG9ja2VkKCZyZXMtPnNwaW5sb2NrKTsKIApAQCAtNDg0LDEzICs0NzgsMTYgQEAKIAkJCXJlcy0+c3RhdGUgfD0gRExNX0xPQ0tfUkVTX0RJUlRZOwogCQl9CiAJfQorCisJbWxvZygwLCAiJXM6IHJlcyAlLipzXG4iLCBkbG0tPm5hbWUsIHJlcy0+bG9ja25hbWUubGVuLAorCSAgICAgcmVzLT5sb2NrbmFtZS5uYW1lKTsKIH0KIAogCiAvKiBMYXVuY2ggdGhlIE5NIHRocmVhZCBmb3IgdGhlIG1vdW50ZWQgdm9sdW1lICovCiBpbnQgZGxtX2xhdW5jaF90aHJlYWQoc3RydWN0IGRsbV9jdHh0ICpkbG0pCiB7Ci0JbWxvZygwLCAic3RhcnRpbmcgZGxtIHRocmVhZC4uLlxuIik7CisJbWxvZygwLCAiU3RhcnRpbmcgZGxtX3RocmVhZC4uLlxuIik7CiAKIAlkbG0tPmRsbV90aHJlYWRfdGFzayA9IGt0aHJlYWRfcnVuKGRsbV90aHJlYWQsIGRsbSwgImRsbV90aHJlYWQiKTsKIAlpZiAoSVNfRVJSKGRsbS0+ZGxtX3RocmVhZF90YXNrKSkgewpAQCAtNTA1LDcgKzUwMiw3IEBACiB2b2lkIGRsbV9jb21wbGV0ZV90aHJlYWQoc3RydWN0IGRsbV9jdHh0ICpkbG0pCiB7CiAJaWYgKGRsbS0+ZGxtX3RocmVhZF90YXNrKSB7Ci0JCW1sb2coTUxfS1RIUkVBRCwgIndhaXRpbmcgZm9yIGRsbSB0aHJlYWQgdG8gZXhpdFxuIik7CisJCW1sb2coTUxfS1RIUkVBRCwgIldhaXRpbmcgZm9yIGRsbSB0aHJlYWQgdG8gZXhpdFxuIik7CiAJCWt0aHJlYWRfc3RvcChkbG0tPmRsbV90aHJlYWRfdGFzayk7CiAJCWRsbS0+ZGxtX3RocmVhZF90YXNrID0gTlVMTDsKIAl9CkBAIC01MzYsNyArNTMzLDEyIEBACiAJCS8qIGdldCBhbiBleHRyYSByZWYgb24gbG9jayAqLwogCQlkbG1fbG9ja19nZXQobG9jayk7CiAJCXJlcyA9IGxvY2stPmxvY2tyZXM7Ci0JCW1sb2coMCwgImRlbGl2ZXJpbmcgYW4gYXN0IGZvciB0aGlzIGxvY2tyZXNcbiIpOworCQltbG9nKDAsICIlczogcmVzICUuKnMsIEZsdXNoIEFTVCBmb3IgbG9jayAldTolbGx1LCB0eXBlICVkLCAiCisJCSAgICAgIm5vZGUgJXVcbiIsIGRsbS0+bmFtZSwgcmVzLT5sb2NrbmFtZS5sZW4sCisJCSAgICAgcmVzLT5sb2NrbmFtZS5uYW1lLAorCQkgICAgIGRsbV9nZXRfbG9ja19jb29raWVfbm9kZShiZTY0X3RvX2NwdShsb2NrLT5tbC5jb29raWUpKSwKKwkJICAgICBkbG1fZ2V0X2xvY2tfY29va2llX3NlcShiZTY0X3RvX2NwdShsb2NrLT5tbC5jb29raWUpKSwKKwkJICAgICBsb2NrLT5tbC50eXBlLCBsb2NrLT5tbC5ub2RlKTsKIAogCQlCVUdfT04oIWxvY2stPmFzdF9wZW5kaW5nKTsKIApAQCAtNTU3LDkgKzU1OSw5IEBACiAJCS8qIHBvc3NpYmxlIHRoYXQgYW5vdGhlciBhc3Qgd2FzIHF1ZXVlZCB3aGlsZQogCQkgKiB3ZSB3ZXJlIGRlbGl2ZXJpbmcgdGhlIGxhc3Qgb25lICovCiAJCWlmICghbGlzdF9lbXB0eSgmbG9jay0+YXN0X2xpc3QpKSB7Ci0JCQltbG9nKDAsICJhaGEgYW5vdGhlciBhc3QgZ290IHF1ZXVlZCB3aGlsZSAiCi0JCQkgICAgICJ3ZSB3ZXJlIGZpbmlzaGluZyB0aGUgbGFzdCBvbmUuICB3aWxsICIKLQkJCSAgICAgImtlZXAgdGhlIGFzdF9wZW5kaW5nIGZsYWcgc2V0LlxuIik7CisJCQltbG9nKDAsICIlczogcmVzICUuKnMsIEFTVCBxdWV1ZWQgd2hpbGUgZmx1c2hpbmcgbGFzdCAiCisJCQkgICAgICJvbmVcbiIsIGRsbS0+bmFtZSwgcmVzLT5sb2NrbmFtZS5sZW4sCisJCQkgICAgIHJlcy0+bG9ja25hbWUubmFtZSk7CiAJCX0gZWxzZQogCQkJbG9jay0+YXN0X3BlbmRpbmcgPSAwOwogCkBAIC01OTAsOCArNTkyLDEyIEBACiAJCWRsbV9sb2NrX3B1dChsb2NrKTsKIAkJc3Bpbl91bmxvY2soJmRsbS0+YXN0X2xvY2spOwogCi0JCW1sb2coMCwgImRlbGl2ZXJpbmcgYSBiYXN0IGZvciB0aGlzIGxvY2tyZXMgIgotCQkgICAgICIoYmxvY2tlZCA9ICVkXG4iLCBoaSk7CisJCW1sb2coMCwgIiVzOiByZXMgJS4qcywgRmx1c2ggQkFTVCBmb3IgbG9jayAldTolbGx1LCAiCisJCSAgICAgImJsb2NrZWQgJWQsIG5vZGUgJXVcbiIsCisJCSAgICAgZGxtLT5uYW1lLCByZXMtPmxvY2tuYW1lLmxlbiwgcmVzLT5sb2NrbmFtZS5uYW1lLAorCQkgICAgIGRsbV9nZXRfbG9ja19jb29raWVfbm9kZShiZTY0X3RvX2NwdShsb2NrLT5tbC5jb29raWUpKSwKKwkJICAgICBkbG1fZ2V0X2xvY2tfY29va2llX3NlcShiZTY0X3RvX2NwdShsb2NrLT5tbC5jb29raWUpKSwKKwkJICAgICBoaSwgbG9jay0+bWwubm9kZSk7CiAKIAkJaWYgKGxvY2stPm1sLm5vZGUgIT0gZGxtLT5ub2RlX251bSkgewogCQkJcmV0ID0gZGxtX3NlbmRfcHJveHlfYmFzdChkbG0sIHJlcywgbG9jaywgaGkpOwpAQCAtNjA1LDkgKzYxMSw5IEBACiAJCS8qIHBvc3NpYmxlIHRoYXQgYW5vdGhlciBiYXN0IHdhcyBxdWV1ZWQgd2hpbGUKIAkJICogd2Ugd2VyZSBkZWxpdmVyaW5nIHRoZSBsYXN0IG9uZSAqLwogCQlpZiAoIWxpc3RfZW1wdHkoJmxvY2stPmJhc3RfbGlzdCkpIHsKLQkJCW1sb2coMCwgImFoYSBhbm90aGVyIGJhc3QgZ290IHF1ZXVlZCB3aGlsZSAiCi0JCQkgICAgICJ3ZSB3ZXJlIGZpbmlzaGluZyB0aGUgbGFzdCBvbmUuICB3aWxsICIKLQkJCSAgICAgImtlZXAgdGhlIGJhc3RfcGVuZGluZyBmbGFnIHNldC5cbiIpOworCQkJbWxvZygwLCAiJXM6IHJlcyAlLipzLCBCQVNUIHF1ZXVlZCB3aGlsZSBmbHVzaGluZyBsYXN0ICIKKwkJCSAgICAgIm9uZVxuIiwgZGxtLT5uYW1lLCByZXMtPmxvY2tuYW1lLmxlbiwKKwkJCSAgICAgcmVzLT5sb2NrbmFtZS5uYW1lKTsKIAkJfSBlbHNlCiAJCQlsb2NrLT5iYXN0X3BlbmRpbmcgPSAwOwogCkBAIC02NzUsMTEgKzY4MSwxMiBAQAogCQkJc3Bpbl9sb2NrKCZyZXMtPnNwaW5sb2NrKTsKIAkJCWlmIChyZXMtPm93bmVyICE9IGRsbS0+bm9kZV9udW0pIHsKIAkJCQlfX2RsbV9wcmludF9vbmVfbG9ja19yZXNvdXJjZShyZXMpOwotCQkJCW1sb2coTUxfRVJST1IsICJpbnByb2c6JXMsIG1pZzolcywgcmVjbzolcywgZGlydHk6JXNcbiIsCi0JCQkJICAgICByZXMtPnN0YXRlICYgRExNX0xPQ0tfUkVTX0lOX1BST0dSRVNTID8gInllcyIgOiAibm8iLAotCQkJCSAgICAgcmVzLT5zdGF0ZSAmIERMTV9MT0NLX1JFU19NSUdSQVRJTkcgPyAieWVzIiA6ICJubyIsCi0JCQkJICAgICByZXMtPnN0YXRlICYgRExNX0xPQ0tfUkVTX1JFQ09WRVJJTkcgPyAieWVzIiA6ICJubyIsCi0JCQkJICAgICByZXMtPnN0YXRlICYgRExNX0xPQ0tfUkVTX0RJUlRZID8gInllcyIgOiAibm8iKTsKKwkJCQltbG9nKE1MX0VSUk9SLCAiJXM6IGlucHJvZyAlZCwgbWlnICVkLCByZWNvICVkLCIKKwkJCQkgICAgICIgZGlydHkgJWRcbiIsIGRsbS0+bmFtZSwKKwkJCQkgICAgICEhKHJlcy0+c3RhdGUgJiBETE1fTE9DS19SRVNfSU5fUFJPR1JFU1MpLAorCQkJCSAgICAgISEocmVzLT5zdGF0ZSAmIERMTV9MT0NLX1JFU19NSUdSQVRJTkcpLAorCQkJCSAgICAgISEocmVzLT5zdGF0ZSAmIERMTV9MT0NLX1JFU19SRUNPVkVSSU5HKSwKKwkJCQkgICAgICEhKHJlcy0+c3RhdGUgJiBETE1fTE9DS19SRVNfRElSVFkpKTsKIAkJCX0KIAkJCUJVR19PTihyZXMtPm93bmVyICE9IGRsbS0+bm9kZV9udW0pOwogCkBAIC02OTMsOCArNzAwLDggQEAKIAkJCQlyZXMtPnN0YXRlICY9IH5ETE1fTE9DS19SRVNfRElSVFk7CiAJCQkJc3Bpbl91bmxvY2soJnJlcy0+c3BpbmxvY2spOwogCQkJCXNwaW5fdW5sb2NrKCZkbG0tPmFzdF9sb2NrKTsKLQkJCQltbG9nKDAsICJkZWxheWluZyBsaXN0IHNodWZmbGluZyBmb3IgaW4tIgotCQkJCSAgICAgInByb2dyZXNzIGxvY2tyZXMgJS4qcywgc3RhdGU9JWRcbiIsCisJCQkJbWxvZygwLCAiJXM6IHJlcyAlLipzLCBpbnByb2dyZXNzLCBkZWxheSBsaXN0ICIKKwkJCQkgICAgICJzaHVmZmxlLCBzdGF0ZSAlZFxuIiwgZGxtLT5uYW1lLAogCQkJCSAgICAgcmVzLT5sb2NrbmFtZS5sZW4sIHJlcy0+bG9ja25hbWUubmFtZSwKIAkJCQkgICAgIHJlcy0+c3RhdGUpOwogCQkJCWRlbGF5ID0gMTsKQEAgLTcwNiwxMCArNzEzLDYgQEAKIAkJCSAqIHNwaW5sb2NrIGFuZCBkbyBOT1QgaGF2ZSB0aGUgZGxtIGxvY2suCiAJCQkgKiBzYWZlIHRvIHJlc2VydmUvcXVldWUgYXN0cyBhbmQgcnVuIHRoZSBsaXN0cy4gKi8KIAotCQkJbWxvZygwLCAiY2FsbGluZyBkbG1fc2h1ZmZsZV9saXN0cyB3aXRoIGRsbT0lcywgIgotCQkJICAgICAicmVzPSUuKnNcbiIsIGRsbS0+bmFtZSwKLQkJCSAgICAgcmVzLT5sb2NrbmFtZS5sZW4sIHJlcy0+bG9ja25hbWUubmFtZSk7Ci0KIAkJCS8qIGNhbGxlZCB3aGlsZSBob2xkaW5nIGxvY2tyZXMgbG9jayAqLwogCQkJZGxtX3NodWZmbGVfbGlzdHMoZGxtLCByZXMpOwogCQkJcmVzLT5zdGF0ZSAmPSB+RExNX0xPQ0tfUkVTX0RJUlRZOwpAQCAtNzMzLDcgKzczNiw4IEBACiAJCQkvKiB1bmxpa2VseSwgYnV0IHdlIG1heSBuZWVkIHRvIGdpdmUgdGltZSB0bwogCQkJICogb3RoZXIgdGFza3MgKi8KIAkJCWlmICghLS1uKSB7Ci0JCQkJbWxvZygwLCAidGhyb3R0bGluZyBkbG1fdGhyZWFkXG4iKTsKKwkJCQltbG9nKDAsICIlczogVGhyb3R0bGluZyBkbG0gdGhyZWFkXG4iLAorCQkJCSAgICAgZGxtLT5uYW1lKTsKIAkJCQlicmVhazsKIAkJCX0KIAkJfQpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvbmFtZWkuYyBiL2ZzL29jZnMyL25hbWVpLmMKaW5kZXggZDE0Y2FkNi4uMzBjNTIzMSAxMDA2NDQKLS0tIGEvZnMvb2NmczIvbmFtZWkuYworKysgYi9mcy9vY2ZzMi9uYW1laS5jCkBAIC0xMDE3LDggKzEwMTcsMTEgQEAKIAkJICogQW4gZXJyb3IgcmV0dXJuIG11c3QgbWVhbiB0aGF0IG5vIGNsdXN0ZXIgbG9ja3MKIAkJICogd2VyZSBoZWxkIG9uIGZ1bmN0aW9uIGV4aXQuCiAJCSAqLwotCQlpZiAob2kxLT5pcF9ibGtubyAhPSBvaTItPmlwX2Jsa25vKQorCQlpZiAob2kxLT5pcF9ibGtubyAhPSBvaTItPmlwX2Jsa25vKSB7CiAJCQlvY2ZzMl9pbm9kZV91bmxvY2soaW5vZGUyLCAxKTsKKwkJCWJyZWxzZSgqYmgyKTsKKwkJCSpiaDIgPSBOVUxMOworCQl9CiAKIAkJaWYgKHN0YXR1cyAhPSAtRU5PRU5UKQogCQkJbWxvZ19lcnJubyhzdGF0dXMpOwpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvb2NmczIuaCBiL2ZzL29jZnMyL29jZnMyLmgKaW5kZXggNzBkZDNiMS4uNTFjZDY4OSAxMDA2NDQKLS0tIGEvZnMvb2NmczIvb2NmczIuaAorKysgYi9mcy9vY2ZzMi9vY2ZzMi5oCkBAIC00MjAsNiArNDIwLDExIEBACiAJc3RydWN0IGlub2RlCQkJKm9zYl90bF9pbm9kZTsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQJCSpvc2JfdGxfYmg7CiAJc3RydWN0IGRlbGF5ZWRfd29yawkJb3NiX3RydW5jYXRlX2xvZ193cTsKKwkvKgorCSAqIEhvdyBtYW55IGNsdXN0ZXJzIGluIG91ciB0cnVuY2F0ZSBsb2cuCisJICogSXQgbXVzdCBiZSBwcm90ZWN0ZWQgYnkgb3NiX3RsX2lub2RlLT5pX211dGV4LgorCSAqLworCXVuc2lnbmVkIGludCB0cnVuY2F0ZWRfY2x1c3RlcnM7CiAKIAlzdHJ1Y3Qgb2NmczJfbm9kZV9tYXAJCW9zYl9yZWNvdmVyaW5nX29ycGhhbl9kaXJzOwogCXVuc2lnbmVkIGludAkJCSpvc2Jfb3JwaGFuX3dpcGVzOwpkaWZmIC0tZ2l0IGEvZnMvcXVvdGEvZHF1b3QuYyBiL2ZzL3F1b3RhL2RxdW90LmMKaW5kZXggMGZlZDQxZS4uODRiZWNkMyAxMDA2NDQKLS0tIGEvZnMvcXVvdGEvZHF1b3QuYworKysgYi9mcy9xdW90YS9kcXVvdC5jCkBAIC0xMzMsMTYgKzEzMywyMCBAQAogRVhQT1JUX1NZTUJPTChkcV9kYXRhX2xvY2spOwogCiB2b2lkIF9fcXVvdGFfZXJyb3Ioc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgY29uc3QgY2hhciAqZnVuYywKLQkJICBjb25zdCBjaGFyICpmbXQsIC4uLikKKwkJICAgY29uc3QgY2hhciAqZm10LCAuLi4pCiB7Ci0JdmFfbGlzdCBhcmdzOwotCiAJaWYgKHByaW50a19yYXRlbGltaXQoKSkgeworCQl2YV9saXN0IGFyZ3M7CisJCXN0cnVjdCB2YV9mb3JtYXQgdmFmOworCiAJCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7Ci0JCXByaW50ayhLRVJOX0VSUiAiUXVvdGEgZXJyb3IgKGRldmljZSAlcyk6ICVzOiAiLAotCQkgICAgICAgc2ItPnNfaWQsIGZ1bmMpOwotCQl2cHJpbnRrKGZtdCwgYXJncyk7Ci0JCXByaW50aygiXG4iKTsKKworCQl2YWYuZm10ID0gZm10OworCQl2YWYudmEgPSAmYXJnczsKKworCQlwcmludGsoS0VSTl9FUlIgIlF1b3RhIGVycm9yIChkZXZpY2UgJXMpOiAlczogJXBWXG4iLAorCQkgICAgICAgc2ItPnNfaWQsIGZ1bmMsICZ2YWYpOworCiAJCXZhX2VuZChhcmdzKTsKIAl9CiB9CmRpZmYgLS1naXQgYS9mcy9xdW90YS9xdW90YV90cmVlLmMgYi9mcy9xdW90YS9xdW90YV90cmVlLmMKaW5kZXggOWU0ODg3NC4uZTQxYzFiZWNmIDEwMDY0NAotLS0gYS9mcy9xdW90YS9xdW90YV90cmVlLmMKKysrIGIvZnMvcXVvdGEvcXVvdGFfdHJlZS5jCkBAIC00NjgsOCArNDY4LDggQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAJcmV0ID0gcmVhZF9ibGsoaW5mbywgKmJsaywgYnVmKTsKIAlpZiAocmV0IDwgMCkgewotCQlxdW90YV9lcnJvcihkcXVvdC0+ZHFfc2IsICJDYW4ndCByZWFkIHF1b3RhIGRhdGEgIgotCQkJICAgICJibG9jayAldSIsIGJsayk7CisJCXF1b3RhX2Vycm9yKGRxdW90LT5kcV9zYiwgIkNhbid0IHJlYWQgcXVvdGEgZGF0YSBibG9jayAldSIsCisJCQkgICAgKmJsayk7CiAJCWdvdG8gb3V0X2J1ZjsKIAl9CiAJbmV3YmxrID0gbGUzMl90b19jcHUocmVmW2dldF9pbmRleChpbmZvLCBkcXVvdC0+ZHFfaWQsIGRlcHRoKV0pOwpAQCAtNDkzLDggKzQ5Myw5IEBACiAJCX0gZWxzZSB7CiAJCQlyZXQgPSB3cml0ZV9ibGsoaW5mbywgKmJsaywgYnVmKTsKIAkJCWlmIChyZXQgPCAwKQotCQkJCXF1b3RhX2Vycm9yKGRxdW90LT5kcV9zYiwgIkNhbid0IHdyaXRlIHF1b3RhICIKLQkJCQkJICAgICJ0cmVlIGJsb2NrICV1IiwgYmxrKTsKKwkJCQlxdW90YV9lcnJvcihkcXVvdC0+ZHFfc2IsCisJCQkJCSAgICAiQ2FuJ3Qgd3JpdGUgcXVvdGEgdHJlZSBibG9jayAldSIsCisJCQkJCSAgICAqYmxrKTsKIAkJfQogCX0KIG91dF9idWY6CmRpZmYgLS1naXQgYS9mcy9zeXNmcy9ncm91cC5jIGIvZnMvc3lzZnMvZ3JvdXAuYwppbmRleCA0NDJmMzRmLi5jODc2OWRjMiAxMDA2NDQKLS0tIGEvZnMvc3lzZnMvZ3JvdXAuYworKysgYi9mcy9zeXNmcy9ncm91cC5jCkBAIC0xNjUsMTAgKzE2NSw3IEBACiAJc3RydWN0IGF0dHJpYnV0ZSAqY29uc3QgKmF0dHI7CiAJaW50IGk7CiAKLQlpZiAoZ3JwKQotCQlkaXJfc2QgPSBzeXNmc19nZXRfZGlyZW50KGtvYmotPnNkLCBOVUxMLCBncnAtPm5hbWUpOwotCWVsc2UKLQkJZGlyX3NkID0gc3lzZnNfZ2V0KGtvYmotPnNkKTsKKwlkaXJfc2QgPSBzeXNmc19nZXRfZGlyZW50KGtvYmotPnNkLCBOVUxMLCBncnAtPm5hbWUpOwogCWlmICghZGlyX3NkKQogCQlyZXR1cm4gLUVOT0VOVDsKIApAQCAtMTk1LDEwICsxOTIsNyBAQAogCXN0cnVjdCBzeXNmc19kaXJlbnQgKmRpcl9zZDsKIAlzdHJ1Y3QgYXR0cmlidXRlICpjb25zdCAqYXR0cjsKIAotCWlmIChncnApCi0JCWRpcl9zZCA9IHN5c2ZzX2dldF9kaXJlbnQoa29iai0+c2QsIE5VTEwsIGdycC0+bmFtZSk7Ci0JZWxzZQotCQlkaXJfc2QgPSBzeXNmc19nZXQoa29iai0+c2QpOworCWRpcl9zZCA9IHN5c2ZzX2dldF9kaXJlbnQoa29iai0+c2QsIE5VTEwsIGdycC0+bmFtZSk7CiAJaWYgKGRpcl9zZCkgewogCQlmb3IgKGF0dHIgPSBncnAtPmF0dHJzOyAqYXR0cjsgKythdHRyKQogCQkJc3lzZnNfaGFzaF9hbmRfcmVtb3ZlKGRpcl9zZCwgTlVMTCwgKCphdHRyKS0+bmFtZSk7CmRpZmYgLS1naXQgYS9mcy9zeXNmcy9pbm9kZS5jIGIvZnMvc3lzZnMvaW5vZGUuYwppbmRleCAzMGFjMjczLi4wYTEyZWI4IDEwMDY0NAotLS0gYS9mcy9zeXNmcy9pbm9kZS5jCisrKyBiL2ZzL3N5c2ZzL2lub2RlLmMKQEAgLTE5LDYgKzE5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+CiAjaW5jbHVkZSA8bGludXgveGF0dHIuaD4KICNpbmNsdWRlIDxsaW51eC9zZWN1cml0eS5oPgogI2luY2x1ZGUgInN5c2ZzLmgiCmRpZmYgLS1naXQgYS9mcy9zeXNmcy9zeXNmcy5oIGIvZnMvc3lzZnMvc3lzZnMuaAppbmRleCBmZmFhYTgxLi4zZDI4YWYzIDEwMDY0NAotLS0gYS9mcy9zeXNmcy9zeXNmcy5oCisrKyBiL2ZzL3N5c2ZzL3N5c2ZzLmgKQEAgLTksNiArOSw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2xvY2tkZXAuaD4KKyNpbmNsdWRlIDxsaW51eC9rb2JqZWN0X25zLmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KIAogc3RydWN0IHN5c2ZzX29wZW5fZGlyZW50OwpkaWZmIC0tZ2l0IGEvZnMvdWRmL0tjb25maWcgYi9mcy91ZGYvS2NvbmZpZwppbmRleCBmOGRlZjNjLi4wZTBlOTliIDEwMDY0NAotLS0gYS9mcy91ZGYvS2NvbmZpZworKysgYi9mcy91ZGYvS2NvbmZpZwpAQCAtMSw2ICsxLDUgQEAKIGNvbmZpZyBVREZfRlMKIAl0cmlzdGF0ZSAiVURGIGZpbGUgc3lzdGVtIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBCS0wgIyBuZWVkcyBzZXJpb3VzIHdvcmsgdG8gcmVtb3ZlCiAJc2VsZWN0IENSQ19JVFVfVAogCWhlbHAKIAkgIFRoaXMgaXMgdGhlIG5ldyBmaWxlIHN5c3RlbSB1c2VkIG9uIHNvbWUgQ0QtUk9NcyBhbmQgRFZEcy4gU2F5IFkgaWYKZGlmZiAtLWdpdCBhL2ZzL3VkZi9iYWxsb2MuYyBiL2ZzL3VkZi9iYWxsb2MuYwppbmRleCBiNjA4ZWZhLi4zMDZlZTM5IDEwMDY0NAotLS0gYS9mcy91ZGYvYmFsbG9jLmMKKysrIGIvZnMvdWRmL2JhbGxvYy5jCkBAIC0xNTcsMTAgKzE1Nyw5IEBACiAJCQkJdWRmX2RlYnVnKCJiaXQgJWxkIGFscmVhZHkgc2V0XG4iLCBiaXQgKyBpKTsKIAkJCQl1ZGZfZGVidWcoImJ5dGU9JTJ4XG4iLAogCQkJCQkoKGNoYXIgKiliaC0+Yl9kYXRhKVsoYml0ICsgaSkgPj4gM10pOwotCQkJfSBlbHNlIHsKLQkJCQl1ZGZfYWRkX2ZyZWVfc3BhY2Uoc2IsIHNiaS0+c19wYXJ0aXRpb24sIDEpOwogCQkJfQogCQl9CisJCXVkZl9hZGRfZnJlZV9zcGFjZShzYiwgc2JpLT5zX3BhcnRpdGlvbiwgY291bnQpOwogCQltYXJrX2J1ZmZlcl9kaXJ0eShiaCk7CiAJCWlmIChvdmVyZmxvdykgewogCQkJYmxvY2sgKz0gY291bnQ7CmRpZmYgLS1naXQgYS9mcy91ZGYvZGlyLmMgYi9mcy91ZGYvZGlyLmMKaW5kZXggNTE1NTJiZi4uZWI4YmZlMiAxMDA2NDQKLS0tIGEvZnMvdWRmL2Rpci5jCisrKyBiL2ZzL3VkZi9kaXIuYwpAQCAtMzAsNyArMzAsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KICNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgogCiAjaW5jbHVkZSAidWRmX2kuaCIKQEAgLTE5MCwxOCArMTg5LDE0IEBACiAJc3RydWN0IGlub2RlICpkaXIgPSBmaWxwLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOwogCWludCByZXN1bHQ7CiAKLQlsb2NrX2tlcm5lbCgpOwotCiAJaWYgKGZpbHAtPmZfcG9zID09IDApIHsKIAkJaWYgKGZpbGxkaXIoZGlyZW50LCAiLiIsIDEsIGZpbHAtPmZfcG9zLCBkaXItPmlfaW5vLCBEVF9ESVIpIDwgMCkgewotCQkJdW5sb2NrX2tlcm5lbCgpOwogCQkJcmV0dXJuIDA7CiAJCX0KIAkJZmlscC0+Zl9wb3MrKzsKIAl9CiAKIAlyZXN1bHQgPSBkb191ZGZfcmVhZGRpcihkaXIsIGZpbHAsIGZpbGxkaXIsIGRpcmVudCk7Ci0JdW5sb2NrX2tlcm5lbCgpOwogIAlyZXR1cm4gcmVzdWx0OwogfQogCmRpZmYgLS1naXQgYS9mcy91ZGYvZmlsZS5jIGIvZnMvdWRmL2ZpbGUuYwppbmRleCA2NmI5ZTdlLi44OWM3ODQ4IDEwMDY0NAotLS0gYS9mcy91ZGYvZmlsZS5jCisrKyBiL2ZzL3VkZi9maWxlLmMKQEAgLTMyLDcgKzMyLDYgQEAKICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4gLyogbWVtc2V0ICovCiAjaW5jbHVkZSA8bGludXgvY2FwYWJpbGl0eS5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+Ci0jaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KICNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CiAjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KICNpbmNsdWRlIDxsaW51eC9haW8uaD4KQEAgLTExNCw2ICsxMTMsNyBAQAogCXNpemVfdCBjb3VudCA9IGlvY2ItPmtpX2xlZnQ7CiAJc3RydWN0IHVkZl9pbm9kZV9pbmZvICppaW5mbyA9IFVERl9JKGlub2RlKTsKIAorCWRvd25fd3JpdGUoJmlpbmZvLT5pX2RhdGFfc2VtKTsKIAlpZiAoaWluZm8tPmlfYWxsb2NfdHlwZSA9PSBJQ0JUQUdfRkxBR19BRF9JTl9JQ0IpIHsKIAkJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX0FQUEVORCkKIAkJCXBvcyA9IGlub2RlLT5pX3NpemU7CkBAIC0xMjYsNiArMTI2LDcgQEAKIAkJCXVkZl9leHBhbmRfZmlsZV9hZGluaWNiKGlub2RlLCBwb3MgKyBjb3VudCwgJmVycik7CiAJCQlpZiAoaWluZm8tPmlfYWxsb2NfdHlwZSA9PSBJQ0JUQUdfRkxBR19BRF9JTl9JQ0IpIHsKIAkJCQl1ZGZfZGVidWcoInVkZl9leHBhbmRfYWRpbmljYjogZXJyPSVkXG4iLCBlcnIpOworCQkJCXVwX3dyaXRlKCZpaW5mby0+aV9kYXRhX3NlbSk7CiAJCQkJcmV0dXJuIGVycjsKIAkJCX0KIAkJfSBlbHNlIHsKQEAgLTEzNSw2ICsxMzYsNyBAQAogCQkJCWlpbmZvLT5pX2xlbkFsbG9jID0gaW5vZGUtPmlfc2l6ZTsKIAkJfQogCX0KKwl1cF93cml0ZSgmaWluZm8tPmlfZGF0YV9zZW0pOwogCiAJcmV0dmFsID0gZ2VuZXJpY19maWxlX2Fpb193cml0ZShpb2NiLCBpb3YsIG5yX3NlZ3MsIHBwb3MpOwogCWlmIChyZXR2YWwgPiAwKQpAQCAtMTQ5LDggKzE1MSw2IEBACiAJbG9uZyBvbGRfYmxvY2ssIG5ld19ibG9jazsKIAlpbnQgcmVzdWx0ID0gLUVJTlZBTDsKIAotCWxvY2tfa2VybmVsKCk7Ci0KIAlpZiAoZmlsZV9wZXJtaXNzaW9uKGZpbHAsIE1BWV9SRUFEKSAhPSAwKSB7CiAJCXVkZl9kZWJ1Zygibm8gcGVybWlzc2lvbiB0byBhY2Nlc3MgaW5vZGUgJWx1XG4iLCBpbm9kZS0+aV9pbm8pOwogCQlyZXN1bHQgPSAtRVBFUk07CkBAIC0xOTYsNyArMTk2LDYgQEAKIAl9CiAKIG91dDoKLQl1bmxvY2tfa2VybmVsKCk7CiAJcmV0dXJuIHJlc3VsdDsKIH0KIApAQCAtMjA0LDEwICsyMDMsMTAgQEAKIHsKIAlpZiAoZmlscC0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKIAkJbXV0ZXhfbG9jaygmaW5vZGUtPmlfbXV0ZXgpOwotCQlsb2NrX2tlcm5lbCgpOworCQlkb3duX3dyaXRlKCZVREZfSShpbm9kZSktPmlfZGF0YV9zZW0pOwogCQl1ZGZfZGlzY2FyZF9wcmVhbGxvYyhpbm9kZSk7CiAJCXVkZl90cnVuY2F0ZV90YWlsX2V4dGVudChpbm9kZSk7Ci0JCXVubG9ja19rZXJuZWwoKTsKKwkJdXBfd3JpdGUoJlVERl9JKGlub2RlKS0+aV9kYXRhX3NlbSk7CiAJCW11dGV4X3VubG9jaygmaW5vZGUtPmlfbXV0ZXgpOwogCX0KIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2ZzL3VkZi9pYWxsb2MuYyBiL2ZzL3VkZi9pYWxsb2MuYwppbmRleCA3NWQ5MzA0Li42ZmI3ZTBhIDEwMDY0NAotLS0gYS9mcy91ZGYvaWFsbG9jLmMKKysrIGIvZnMvdWRmL2lhbGxvYy5jCkBAIC05MiwyOCArOTIsMTkgQEAKIAkJcmV0dXJuIE5VTEw7CiAJfQogCi0JbXV0ZXhfbG9jaygmc2JpLT5zX2FsbG9jX211dGV4KTsKIAlpZiAoc2JpLT5zX2x2aWRfYmgpIHsKLQkJc3RydWN0IGxvZ2ljYWxWb2xJbnRlZ3JpdHlEZXNjICpsdmlkID0KLQkJCShzdHJ1Y3QgbG9naWNhbFZvbEludGVncml0eURlc2MgKikKLQkJCXNiaS0+c19sdmlkX2JoLT5iX2RhdGE7Ci0JCXN0cnVjdCBsb2dpY2FsVm9sSW50ZWdyaXR5RGVzY0ltcFVzZSAqbHZpZGl1ID0KLQkJCQkJCQl1ZGZfc2JfbHZpZGl1KHNiaSk7Ci0JCXN0cnVjdCBsb2dpY2FsVm9sSGVhZGVyRGVzYyAqbHZoZDsKLQkJdWludDY0X3QgdW5pcXVlSUQ7Ci0JCWx2aGQgPSAoc3RydWN0IGxvZ2ljYWxWb2xIZWFkZXJEZXNjICopCi0JCQkJKGx2aWQtPmxvZ2ljYWxWb2xDb250ZW50c1VzZSk7CisJCXN0cnVjdCBsb2dpY2FsVm9sSW50ZWdyaXR5RGVzY0ltcFVzZSAqbHZpZGl1OworCisJCWlpbmZvLT5pX3VuaXF1ZSA9IGx2aWRfZ2V0X3VuaXF1ZV9pZChzYik7CisJCW11dGV4X2xvY2soJnNiaS0+c19hbGxvY19tdXRleCk7CisJCWx2aWRpdSA9IHVkZl9zYl9sdmlkaXUoc2JpKTsKIAkJaWYgKFNfSVNESVIobW9kZSkpCiAJCQlsZTMyX2FkZF9jcHUoJmx2aWRpdS0+bnVtRGlycywgMSk7CiAJCWVsc2UKIAkJCWxlMzJfYWRkX2NwdSgmbHZpZGl1LT5udW1GaWxlcywgMSk7Ci0JCWlpbmZvLT5pX3VuaXF1ZSA9IHVuaXF1ZUlEID0gbGU2NF90b19jcHUobHZoZC0+dW5pcXVlSUQpOwotCQlpZiAoISgrK3VuaXF1ZUlEICYgMHgwMDAwMDAwMEZGRkZGRkZGVUwpKQotCQkJdW5pcXVlSUQgKz0gMTY7Ci0JCWx2aGQtPnVuaXF1ZUlEID0gY3B1X3RvX2xlNjQodW5pcXVlSUQpOwogCQl1ZGZfdXBkYXRlZF9sdmlkKHNiKTsKKwkJbXV0ZXhfdW5sb2NrKCZzYmktPnNfYWxsb2NfbXV0ZXgpOwogCX0KLQltdXRleF91bmxvY2soJnNiaS0+c19hbGxvY19tdXRleCk7CiAKIAlpbm9kZV9pbml0X293bmVyKGlub2RlLCBkaXIsIG1vZGUpOwogCmRpZmYgLS1naXQgYS9mcy91ZGYvaW5vZGUuYyBiL2ZzL3VkZi9pbm9kZS5jCmluZGV4IGZjNDhmMzcuLmM2YTJlNzggMTAwNjQ0Ci0tLSBhL2ZzL3VkZi9pbm9kZS5jCisrKyBiL2ZzL3VkZi9pbm9kZS5jCkBAIC0zMSw3ICszMSw2IEBACiAKICNpbmNsdWRlICJ1ZGZkZWNsLmgiCiAjaW5jbHVkZSA8bGludXgvbW0uaD4KLSNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KICNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgpAQCAtNTEsNiArNTAsNyBAQAogc3RhdGljIG1vZGVfdCB1ZGZfY29udmVydF9wZXJtaXNzaW9ucyhzdHJ1Y3QgZmlsZUVudHJ5ICopOwogc3RhdGljIGludCB1ZGZfdXBkYXRlX2lub2RlKHN0cnVjdCBpbm9kZSAqLCBpbnQpOwogc3RhdGljIHZvaWQgdWRmX2ZpbGxfaW5vZGUoc3RydWN0IGlub2RlICosIHN0cnVjdCBidWZmZXJfaGVhZCAqKTsKK3N0YXRpYyBpbnQgdWRmX3N5bmNfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSk7CiBzdGF0aWMgaW50IHVkZl9hbGxvY19pX2RhdGEoc3RydWN0IGlub2RlICppbm9kZSwgc2l6ZV90IHNpemUpOwogc3RhdGljIHN0cnVjdCBidWZmZXJfaGVhZCAqaW5vZGVfZ2V0YmxrKHN0cnVjdCBpbm9kZSAqLCBzZWN0b3JfdCwgaW50ICosCiAJCQkJCXNlY3Rvcl90ICosIGludCAqKTsKQEAgLTc5LDkgKzc5LDcgQEAKIAkJd2FudF9kZWxldGUgPSAxOwogCQlpbm9kZS0+aV9zaXplID0gMDsKIAkJdWRmX3RydW5jYXRlKGlub2RlKTsKLQkJbG9ja19rZXJuZWwoKTsKIAkJdWRmX3VwZGF0ZV9pbm9kZShpbm9kZSwgSVNfU1lOQyhpbm9kZSkpOwotCQl1bmxvY2tfa2VybmVsKCk7CiAJfQogCWludmFsaWRhdGVfaW5vZGVfYnVmZmVycyhpbm9kZSk7CiAJZW5kX3dyaXRlYmFjayhpbm9kZSk7CkBAIC05Nyw5ICs5NSw3IEBACiAJa2ZyZWUoaWluZm8tPmlfZXh0LmlfZGF0YSk7CiAJaWluZm8tPmlfZXh0LmlfZGF0YSA9IE5VTEw7CiAJaWYgKHdhbnRfZGVsZXRlKSB7Ci0JCWxvY2tfa2VybmVsKCk7CiAJCXVkZl9mcmVlX2lub2RlKGlub2RlKTsKLQkJdW5sb2NrX2tlcm5lbCgpOwogCX0KIH0KIApAQCAtMzAyLDEwICsyOTgsOSBAQAogCWVyciA9IC1FSU87CiAJbmV3ID0gMDsKIAliaCA9IE5VTEw7Ci0KLQlsb2NrX2tlcm5lbCgpOwotCiAJaWluZm8gPSBVREZfSShpbm9kZSk7CisKKwlkb3duX3dyaXRlKCZpaW5mby0+aV9kYXRhX3NlbSk7CiAJaWYgKGJsb2NrID09IGlpbmZvLT5pX25leHRfYWxsb2NfYmxvY2sgKyAxKSB7CiAJCWlpbmZvLT5pX25leHRfYWxsb2NfYmxvY2srKzsKIAkJaWluZm8tPmlfbmV4dF9hbGxvY19nb2FsKys7CkBAIC0zMjQsNyArMzE5LDcgQEAKIAltYXBfYmgoYmhfcmVzdWx0LCBpbm9kZS0+aV9zYiwgcGh5cyk7CiAKIGFib3J0OgotCXVubG9ja19rZXJuZWwoKTsKKwl1cF93cml0ZSgmaWluZm8tPmlfZGF0YV9zZW0pOwogCXJldHVybiBlcnI7CiB9CiAKQEAgLTEwMjIsMTYgKzEwMTcsMTYgQEAKIAlpZiAoSVNfQVBQRU5EKGlub2RlKSB8fCBJU19JTU1VVEFCTEUoaW5vZGUpKQogCQlyZXR1cm47CiAKLQlsb2NrX2tlcm5lbCgpOwogCWlpbmZvID0gVURGX0koaW5vZGUpOwogCWlmIChpaW5mby0+aV9hbGxvY190eXBlID09IElDQlRBR19GTEFHX0FEX0lOX0lDQikgeworCQlkb3duX3dyaXRlKCZpaW5mby0+aV9kYXRhX3NlbSk7CiAJCWlmIChpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUgPAogCQkJCSh1ZGZfZmlsZV9lbnRyeV9hbGxvY19vZmZzZXQoaW5vZGUpICsKIAkJCQkgaW5vZGUtPmlfc2l6ZSkpIHsKIAkJCXVkZl9leHBhbmRfZmlsZV9hZGluaWNiKGlub2RlLCBpbm9kZS0+aV9zaXplLCAmZXJyKTsKIAkJCWlmIChpaW5mby0+aV9hbGxvY190eXBlID09IElDQlRBR19GTEFHX0FEX0lOX0lDQikgewogCQkJCWlub2RlLT5pX3NpemUgPSBpaW5mby0+aV9sZW5BbGxvYzsKLQkJCQl1bmxvY2tfa2VybmVsKCk7CisJCQkJdXBfd3JpdGUoJmlpbmZvLT5pX2RhdGFfc2VtKTsKIAkJCQlyZXR1cm47CiAJCQl9IGVsc2UKIAkJCQl1ZGZfdHJ1bmNhdGVfZXh0ZW50cyhpbm9kZSk7CkBAIC0xMDQyLDEwICsxMDM3LDEzIEBACiAJCQkJb2Zmc2V0IC0gdWRmX2ZpbGVfZW50cnlfYWxsb2Nfb2Zmc2V0KGlub2RlKSk7CiAJCQlpaW5mby0+aV9sZW5BbGxvYyA9IGlub2RlLT5pX3NpemU7CiAJCX0KKwkJdXBfd3JpdGUoJmlpbmZvLT5pX2RhdGFfc2VtKTsKIAl9IGVsc2UgewogCQlibG9ja190cnVuY2F0ZV9wYWdlKGlub2RlLT5pX21hcHBpbmcsIGlub2RlLT5pX3NpemUsCiAJCQkJICAgIHVkZl9nZXRfYmxvY2spOworCQlkb3duX3dyaXRlKCZpaW5mby0+aV9kYXRhX3NlbSk7CiAJCXVkZl90cnVuY2F0ZV9leHRlbnRzKGlub2RlKTsKKwkJdXBfd3JpdGUoJmlpbmZvLT5pX2RhdGFfc2VtKTsKIAl9CiAKIAlpbm9kZS0+aV9tdGltZSA9IGlub2RlLT5pX2N0aW1lID0gY3VycmVudF9mc190aW1lKGlub2RlLT5pX3NiKTsKQEAgLTEwNTMsNyArMTA1MSw2IEBACiAJCXVkZl9zeW5jX2lub2RlKGlub2RlKTsKIAllbHNlCiAJCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOwotCXVubG9ja19rZXJuZWwoKTsKIH0KIAogc3RhdGljIHZvaWQgX191ZGZfcmVhZF9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQpAQCAtMTIwMiw2ICsxMTk5LDcgQEAKIAkJcmV0dXJuOwogCX0KIAorCXJlYWRfbG9jaygmc2JpLT5zX2NyZWRfbG9jayk7CiAJaW5vZGUtPmlfdWlkID0gbGUzMl90b19jcHUoZmUtPnVpZCk7CiAJaWYgKGlub2RlLT5pX3VpZCA9PSAtMSB8fAogCSAgICBVREZfUVVFUllfRkxBRyhpbm9kZS0+aV9zYiwgVURGX0ZMQUdfVUlEX0lHTk9SRSkgfHwKQEAgLTEyMTQsMTMgKzEyMTIsNiBAQAogCSAgICBVREZfUVVFUllfRkxBRyhpbm9kZS0+aV9zYiwgVURGX0ZMQUdfR0lEX1NFVCkpCiAJCWlub2RlLT5pX2dpZCA9IFVERl9TQihpbm9kZS0+aV9zYiktPnNfZ2lkOwogCi0JaW5vZGUtPmlfbmxpbmsgPSBsZTE2X3RvX2NwdShmZS0+ZmlsZUxpbmtDb3VudCk7Ci0JaWYgKCFpbm9kZS0+aV9ubGluaykKLQkJaW5vZGUtPmlfbmxpbmsgPSAxOwotCi0JaW5vZGUtPmlfc2l6ZSA9IGxlNjRfdG9fY3B1KGZlLT5pbmZvcm1hdGlvbkxlbmd0aCk7Ci0JaWluZm8tPmlfbGVuRXh0ZW50cyA9IGlub2RlLT5pX3NpemU7Ci0KIAlpZiAoZmUtPmljYlRhZy5maWxlVHlwZSAhPSBJQ0JUQUdfRklMRV9UWVBFX0RJUkVDVE9SWSAmJgogCQkJc2JpLT5zX2Ztb2RlICE9IFVERl9JTlZBTElEX01PREUpCiAJCWlub2RlLT5pX21vZGUgPSBzYmktPnNfZm1vZGU7CkBAIC0xMjMwLDYgKzEyMjEsMTQgQEAKIAllbHNlCiAJCWlub2RlLT5pX21vZGUgPSB1ZGZfY29udmVydF9wZXJtaXNzaW9ucyhmZSk7CiAJaW5vZGUtPmlfbW9kZSAmPSB+c2JpLT5zX3VtYXNrOworCXJlYWRfdW5sb2NrKCZzYmktPnNfY3JlZF9sb2NrKTsKKworCWlub2RlLT5pX25saW5rID0gbGUxNl90b19jcHUoZmUtPmZpbGVMaW5rQ291bnQpOworCWlmICghaW5vZGUtPmlfbmxpbmspCisJCWlub2RlLT5pX25saW5rID0gMTsKKworCWlub2RlLT5pX3NpemUgPSBsZTY0X3RvX2NwdShmZS0+aW5mb3JtYXRpb25MZW5ndGgpOworCWlpbmZvLT5pX2xlbkV4dGVudHMgPSBpbm9kZS0+aV9zaXplOwogCiAJaWYgKGlpbmZvLT5pX2VmZSA9PSAwKSB7CiAJCWlub2RlLT5pX2Jsb2NrcyA9IGxlNjRfdG9fY3B1KGZlLT5sb2dpY2FsQmxvY2tzUmVjb3JkZWQpIDw8CkBAIC0xMzczLDE2ICsxMzcyLDEwIEBACiAKIGludCB1ZGZfd3JpdGVfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IHdyaXRlYmFja19jb250cm9sICp3YmMpCiB7Ci0JaW50IHJldDsKLQotCWxvY2tfa2VybmVsKCk7Ci0JcmV0ID0gdWRmX3VwZGF0ZV9pbm9kZShpbm9kZSwgd2JjLT5zeW5jX21vZGUgPT0gV0JfU1lOQ19BTEwpOwotCXVubG9ja19rZXJuZWwoKTsKLQotCXJldHVybiByZXQ7CisJcmV0dXJuIHVkZl91cGRhdGVfaW5vZGUoaW5vZGUsIHdiYy0+c3luY19tb2RlID09IFdCX1NZTkNfQUxMKTsKIH0KIAotaW50IHVkZl9zeW5jX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCitzdGF0aWMgaW50IHVkZl9zeW5jX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7CiAJcmV0dXJuIHVkZl91cGRhdGVfaW5vZGUoaW5vZGUsIDEpOwogfQpAQCAtMjA0OCw3ICsyMDQxLDcgQEAKIAlzdHJ1Y3QgZXh0ZW50X3Bvc2l0aW9uIGVwb3MgPSB7fTsKIAlpbnQgcmV0OwogCi0JbG9ja19rZXJuZWwoKTsKKwlkb3duX3JlYWQoJlVERl9JKGlub2RlKS0+aV9kYXRhX3NlbSk7CiAKIAlpZiAoaW5vZGVfYm1hcChpbm9kZSwgYmxvY2ssICZlcG9zLCAmZWxvYywgJmVsZW4sICZvZmZzZXQpID09CiAJCQkJCQkoRVhUX1JFQ09SREVEX0FMTE9DQVRFRCA+PiAzMCkpCkBAIC0yMDU2LDcgKzIwNDksNyBAQAogCWVsc2UKIAkJcmV0ID0gMDsKIAotCXVubG9ja19rZXJuZWwoKTsKKwl1cF9yZWFkKCZVREZfSShpbm9kZSktPmlfZGF0YV9zZW0pOwogCWJyZWxzZShlcG9zLmJoKTsKIAogCWlmIChVREZfUVVFUllfRkxBRyhpbm9kZS0+aV9zYiwgVURGX0ZMQUdfVkFSQ09OVikpCmRpZmYgLS1naXQgYS9mcy91ZGYvbmFtZWkuYyBiL2ZzL3VkZi9uYW1laS5jCmluZGV4IDZkOGRjMDIuLjJiZTBmOWUgMTAwNjQ0Ci0tLSBhL2ZzL3VkZi9uYW1laS5jCisrKyBiL2ZzL3VkZi9uYW1laS5jCkBAIC0yNyw3ICsyNyw2IEBACiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9jcmMtaXR1LXQuaD4KQEAgLTIyOCwxMCArMjI3LDggQEAKIAkJfQogCiAJCWlmICgoY2ZpLT5maWxlQ2hhcmFjdGVyaXN0aWNzICYgRklEX0ZJTEVfQ0hBUl9QQVJFTlQpICYmCi0JCSAgICBpc2RvdGRvdCkgewotCQkJYnJlbHNlKGVwb3MuYmgpOwotCQkJcmV0dXJuIGZpOwotCQl9CisJCSAgICBpc2RvdGRvdCkKKwkJCWdvdG8gb3V0X29rOwogCiAJCWlmICghbGZpKQogCQkJY29udGludWU7CkBAIC0yNjMsNyArMjYwLDYgQEAKIAlpZiAoZGVudHJ5LT5kX25hbWUubGVuID4gVURGX05BTUVfTEVOIC0gMikKIAkJcmV0dXJuIEVSUl9QVFIoLUVOQU1FVE9PTE9ORyk7CiAKLQlsb2NrX2tlcm5lbCgpOwogI2lmZGVmIFVERl9SRUNPVkVSWQogCS8qIHRlbXBvcmFyeSBzaG9ydGhhbmQgZm9yIHNwZWNpZnlpbmcgZmlsZXMgYnkgaW5vZGUgbnVtYmVyICovCiAJaWYgKCFzdHJuY21wKGRlbnRyeS0+ZF9uYW1lLm5hbWUsICIuQj0iLCAzKSkgewpAQCAtMjc1LDcgKzI3MSw2IEBACiAJCX07CiAJCWlub2RlID0gdWRmX2lnZXQoZGlyLT5pX3NiLCBsYik7CiAJCWlmICghaW5vZGUpIHsKLQkJCXVubG9ja19rZXJuZWwoKTsKIAkJCXJldHVybiBFUlJfUFRSKC1FQUNDRVMpOwogCQl9CiAJfSBlbHNlCkBAIC0yOTEsMTEgKzI4Niw5IEBACiAJCWxvYyA9IGxlbGJfdG9fY3B1KGNmaS5pY2IuZXh0TG9jYXRpb24pOwogCQlpbm9kZSA9IHVkZl9pZ2V0KGRpci0+aV9zYiwgJmxvYyk7CiAJCWlmICghaW5vZGUpIHsKLQkJCXVubG9ja19rZXJuZWwoKTsKIAkJCXJldHVybiBFUlJfUFRSKC1FQUNDRVMpOwogCQl9CiAJfQotCXVubG9ja19rZXJuZWwoKTsKIAogCXJldHVybiBkX3NwbGljZV9hbGlhcyhpbm9kZSwgZGVudHJ5KTsKIH0KQEAgLTQ3NiwxNSArNDY5LDE5IEBACiAJCQkJZl9wb3MgPj4gZGlyLT5pX3NiLT5zX2Jsb2Nrc2l6ZV9iaXRzLCAxLCBlcnIpOwogCQlpZiAoIWZpYmgtPmViaCkKIAkJCWdvdG8gb3V0X2VycjsKKwkJLyogRXh0ZW50cyBjb3VsZCBoYXZlIGJlZW4gbWVyZ2VkLCBpbnZhbGlkYXRlIG91ciBwb3NpdGlvbiAqLworCQlicmVsc2UoZXBvcy5iaCk7CisJCWVwb3MuYmggPSBOVUxMOworCQllcG9zLmJsb2NrID0gZGluZm8tPmlfbG9jYXRpb247CisJCWVwb3Mub2Zmc2V0ID0gdWRmX2ZpbGVfZW50cnlfYWxsb2Nfb2Zmc2V0KGRpcik7CiAKIAkJaWYgKCFmaWJoLT5zb2Zmc2V0KSB7Ci0JCQlpZiAodWRmX25leHRfYWV4dChkaXIsICZlcG9zLCAmZWxvYywgJmVsZW4sIDEpID09Ci0JCQkgICAgKEVYVF9SRUNPUkRFRF9BTExPQ0FURUQgPj4gMzApKSB7Ci0JCQkJYmxvY2sgPSBlbG9jLmxvZ2ljYWxCbG9ja051bSArICgoZWxlbiAtIDEpID4+CisJCQkvKiBGaW5kIHRoZSBmcmVzaGx5IGFsbG9jYXRlZCBibG9jayAqLworCQkJd2hpbGUgKHVkZl9uZXh0X2FleHQoZGlyLCAmZXBvcywgJmVsb2MsICZlbGVuLCAxKSA9PQorCQkJCShFWFRfUkVDT1JERURfQUxMT0NBVEVEID4+IDMwKSkKKwkJCQk7CisJCQlibG9jayA9IGVsb2MubG9naWNhbEJsb2NrTnVtICsgKChlbGVuIC0gMSkgPj4KIAkJCQkJZGlyLT5pX3NiLT5zX2Jsb2Nrc2l6ZV9iaXRzKTsKLQkJCX0gZWxzZQotCQkJCWJsb2NrKys7Ci0KIAkJCWJyZWxzZShmaWJoLT5zYmgpOwogCQkJZmliaC0+c2JoID0gZmliaC0+ZWJoOwogCQkJZmkgPSAoc3RydWN0IGZpbGVJZGVudERlc2MgKikoZmliaC0+c2JoLT5iX2RhdGEpOwpAQCAtNTYyLDEwICs1NTksOCBAQAogCWludCBlcnI7CiAJc3RydWN0IHVkZl9pbm9kZV9pbmZvICppaW5mbzsKIAotCWxvY2tfa2VybmVsKCk7CiAJaW5vZGUgPSB1ZGZfbmV3X2lub2RlKGRpciwgbW9kZSwgJmVycik7CiAJaWYgKCFpbm9kZSkgewotCQl1bmxvY2tfa2VybmVsKCk7CiAJCXJldHVybiBlcnI7CiAJfQogCkBAIC01ODMsNyArNTc4LDYgQEAKIAkJaW5vZGUtPmlfbmxpbmstLTsKIAkJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CiAJCWlwdXQoaW5vZGUpOwotCQl1bmxvY2tfa2VybmVsKCk7CiAJCXJldHVybiBlcnI7CiAJfQogCWNmaS5pY2IuZXh0TGVuZ3RoID0gY3B1X3RvX2xlMzIoaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplKTsKQEAgLTU5Niw3ICs1OTAsNiBAQAogCWlmIChmaWJoLnNiaCAhPSBmaWJoLmViaCkKIAkJYnJlbHNlKGZpYmguZWJoKTsKIAlicmVsc2UoZmliaC5zYmgpOwotCXVubG9ja19rZXJuZWwoKTsKIAlkX2luc3RhbnRpYXRlKGRlbnRyeSwgaW5vZGUpOwogCiAJcmV0dXJuIDA7CkBAIC02MTQsNyArNjA3LDYgQEAKIAlpZiAoIW9sZF92YWxpZF9kZXYocmRldikpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JbG9ja19rZXJuZWwoKTsKIAllcnIgPSAtRUlPOwogCWlub2RlID0gdWRmX25ld19pbm9kZShkaXIsIG1vZGUsICZlcnIpOwogCWlmICghaW5vZGUpCkBAIC02MjcsNyArNjE5LDYgQEAKIAkJaW5vZGUtPmlfbmxpbmstLTsKIAkJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CiAJCWlwdXQoaW5vZGUpOwotCQl1bmxvY2tfa2VybmVsKCk7CiAJCXJldHVybiBlcnI7CiAJfQogCWNmaS5pY2IuZXh0TGVuZ3RoID0gY3B1X3RvX2xlMzIoaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplKTsKQEAgLTY0Niw3ICs2MzcsNiBAQAogCWVyciA9IDA7CiAKIG91dDoKLQl1bmxvY2tfa2VybmVsKCk7CiAJcmV0dXJuIGVycjsKIH0KIApAQCAtNjU5LDcgKzY0OSw2IEBACiAJc3RydWN0IHVkZl9pbm9kZV9pbmZvICpkaW5mbyA9IFVERl9JKGRpcik7CiAJc3RydWN0IHVkZl9pbm9kZV9pbmZvICppaW5mbzsKIAotCWxvY2tfa2VybmVsKCk7CiAJZXJyID0gLUVNTElOSzsKIAlpZiAoZGlyLT5pX25saW5rID49ICgyNTYgPDwgc2l6ZW9mKGRpci0+aV9ubGluaykpIC0gMSkKIAkJZ290byBvdXQ7CkBAIC03MTIsNyArNzAxLDYgQEAKIAllcnIgPSAwOwogCiBvdXQ6Ci0JdW5sb2NrX2tlcm5lbCgpOwogCXJldHVybiBlcnI7CiB9CiAKQEAgLTc5NCw3ICs3ODIsNiBAQAogCXN0cnVjdCBrZXJuZWxfbGJfYWRkciB0bG9jOwogCiAJcmV0dmFsID0gLUVOT0VOVDsKLQlsb2NrX2tlcm5lbCgpOwogCWZpID0gdWRmX2ZpbmRfZW50cnkoZGlyLCAmZGVudHJ5LT5kX25hbWUsICZmaWJoLCAmY2ZpKTsKIAlpZiAoIWZpKQogCQlnb3RvIG91dDsKQEAgLTgyNiw3ICs4MTMsNiBAQAogCWJyZWxzZShmaWJoLnNiaCk7CiAKIG91dDoKLQl1bmxvY2tfa2VybmVsKCk7CiAJcmV0dXJuIHJldHZhbDsKIH0KIApAQCAtODQwLDcgKzgyNiw2IEBACiAJc3RydWN0IGtlcm5lbF9sYl9hZGRyIHRsb2M7CiAKIAlyZXR2YWwgPSAtRU5PRU5UOwotCWxvY2tfa2VybmVsKCk7CiAJZmkgPSB1ZGZfZmluZF9lbnRyeShkaXIsICZkZW50cnktPmRfbmFtZSwgJmZpYmgsICZjZmkpOwogCWlmICghZmkpCiAJCWdvdG8gb3V0OwpAQCAtODcwLDcgKzg1NSw2IEBACiAJYnJlbHNlKGZpYmguc2JoKTsKIAogb3V0OgotCXVubG9ja19rZXJuZWwoKTsKIAlyZXR1cm4gcmV0dmFsOwogfQogCkBAIC04OTAsMjEgKzg3NCwyMSBAQAogCWludCBibG9jazsKIAl1bnNpZ25lZCBjaGFyICpuYW1lID0gTlVMTDsKIAlpbnQgbmFtZWxlbjsKLQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOwogCXN0cnVjdCB1ZGZfaW5vZGVfaW5mbyAqaWluZm87CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGRpci0+aV9zYjsKIAotCWxvY2tfa2VybmVsKCk7CiAJaW5vZGUgPSB1ZGZfbmV3X2lub2RlKGRpciwgU19JRkxOSyB8IFNfSVJXWFVHTywgJmVycik7CiAJaWYgKCFpbm9kZSkKIAkJZ290byBvdXQ7CiAKKwlpaW5mbyA9IFVERl9JKGlub2RlKTsKKwlkb3duX3dyaXRlKCZpaW5mby0+aV9kYXRhX3NlbSk7CiAJbmFtZSA9IGttYWxsb2MoVURGX05BTUVfTEVOLCBHRlBfTk9GUyk7CiAJaWYgKCFuYW1lKSB7CiAJCWVyciA9IC1FTk9NRU07CiAJCWdvdG8gb3V0X25vX2VudHJ5OwogCX0KIAotCWlpbmZvID0gVURGX0koaW5vZGUpOwogCWlub2RlLT5pX2RhdGEuYV9vcHMgPSAmdWRmX3N5bWxpbmtfYW9wczsKIAlpbm9kZS0+aV9vcCA9ICZ1ZGZfc3ltbGlua19pbm9kZV9vcGVyYXRpb25zOwogCkBAIC05MTIsNyArODk2LDcgQEAKIAkJc3RydWN0IGtlcm5lbF9sYl9hZGRyIGVsb2M7CiAJCXVpbnQzMl90IGJzaXplOwogCi0JCWJsb2NrID0gdWRmX25ld19ibG9jayhpbm9kZS0+aV9zYiwgaW5vZGUsCisJCWJsb2NrID0gdWRmX25ld19ibG9jayhzYiwgaW5vZGUsCiAJCQkJaWluZm8tPmlfbG9jYXRpb24ucGFydGl0aW9uUmVmZXJlbmNlTnVtLAogCQkJCWlpbmZvLT5pX2xvY2F0aW9uLmxvZ2ljYWxCbG9ja051bSwgJmVycik7CiAJCWlmICghYmxvY2spCkBAIC05MjMsMTcgKzkwNywxNyBAQAogCQllbG9jLmxvZ2ljYWxCbG9ja051bSA9IGJsb2NrOwogCQllbG9jLnBhcnRpdGlvblJlZmVyZW5jZU51bSA9CiAJCQkJaWluZm8tPmlfbG9jYXRpb24ucGFydGl0aW9uUmVmZXJlbmNlTnVtOwotCQlic2l6ZSA9IGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZTsKKwkJYnNpemUgPSBzYi0+c19ibG9ja3NpemU7CiAJCWlpbmZvLT5pX2xlbkV4dGVudHMgPSBic2l6ZTsKIAkJdWRmX2FkZF9hZXh0KGlub2RlLCAmZXBvcywgJmVsb2MsIGJzaXplLCAwKTsKIAkJYnJlbHNlKGVwb3MuYmgpOwogCi0JCWJsb2NrID0gdWRmX2dldF9wYmxvY2soaW5vZGUtPmlfc2IsIGJsb2NrLAorCQlibG9jayA9IHVkZl9nZXRfcGJsb2NrKHNiLCBibG9jaywKIAkJCQlpaW5mby0+aV9sb2NhdGlvbi5wYXJ0aXRpb25SZWZlcmVuY2VOdW0sCiAJCQkJMCk7Ci0JCWVwb3MuYmggPSB1ZGZfdGdldGJsayhpbm9kZS0+aV9zYiwgYmxvY2spOworCQllcG9zLmJoID0gdWRmX3RnZXRibGsoc2IsIGJsb2NrKTsKIAkJbG9ja19idWZmZXIoZXBvcy5iaCk7Ci0JCW1lbXNldChlcG9zLmJoLT5iX2RhdGEsIDB4MDAsIGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSk7CisJCW1lbXNldChlcG9zLmJoLT5iX2RhdGEsIDB4MDAsIGJzaXplKTsKIAkJc2V0X2J1ZmZlcl91cHRvZGF0ZShlcG9zLmJoKTsKIAkJdW5sb2NrX2J1ZmZlcihlcG9zLmJoKTsKIAkJbWFya19idWZmZXJfZGlydHlfaW5vZGUoZXBvcy5iaCwgaW5vZGUpOwpAQCAtOTQxLDcgKzkyNSw3IEBACiAJfSBlbHNlCiAJCWVhID0gaWluZm8tPmlfZXh0LmlfZGF0YSArIGlpbmZvLT5pX2xlbkVBdHRyOwogCi0JZW9mZnNldCA9IGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSAtIHVkZl9leHQwX29mZnNldChpbm9kZSk7CisJZW9mZnNldCA9IHNiLT5zX2Jsb2Nrc2l6ZSAtIHVkZl9leHQwX29mZnNldChpbm9kZSk7CiAJcGMgPSAoc3RydWN0IHBhdGhDb21wb25lbnQgKillYTsKIAogCWlmICgqc3ltbmFtZSA9PSAnLycpIHsKQEAgLTk4MSw3ICs5NjUsNyBAQAogCQl9CiAKIAkJaWYgKHBjLT5jb21wb25lbnRUeXBlID09IDUpIHsKLQkJCW5hbWVsZW4gPSB1ZGZfcHV0X2ZpbGVuYW1lKGlub2RlLT5pX3NiLCBjb21wc3RhcnQsIG5hbWUsCisJCQluYW1lbGVuID0gdWRmX3B1dF9maWxlbmFtZShzYiwgY29tcHN0YXJ0LCBuYW1lLAogCQkJCQkJICAgc3ltbmFtZSAtIGNvbXBzdGFydCk7CiAJCQlpZiAoIW5hbWVsZW4pCiAJCQkJZ290byBvdXRfbm9fZW50cnk7CkBAIC0xMDE1LDI3ICs5OTksMTYgQEAKIAlmaSA9IHVkZl9hZGRfZW50cnkoZGlyLCBkZW50cnksICZmaWJoLCAmY2ZpLCAmZXJyKTsKIAlpZiAoIWZpKQogCQlnb3RvIG91dF9ub19lbnRyeTsKLQljZmkuaWNiLmV4dExlbmd0aCA9IGNwdV90b19sZTMyKGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSk7CisJY2ZpLmljYi5leHRMZW5ndGggPSBjcHVfdG9fbGUzMihzYi0+c19ibG9ja3NpemUpOwogCWNmaS5pY2IuZXh0TG9jYXRpb24gPSBjcHVfdG9fbGVsYihpaW5mby0+aV9sb2NhdGlvbik7Ci0JYmggPSBVREZfU0IoaW5vZGUtPmlfc2IpLT5zX2x2aWRfYmg7Ci0JaWYgKGJoKSB7Ci0JCXN0cnVjdCBsb2dpY2FsVm9sSW50ZWdyaXR5RGVzYyAqbHZpZCA9Ci0JCQkJKHN0cnVjdCBsb2dpY2FsVm9sSW50ZWdyaXR5RGVzYyAqKWJoLT5iX2RhdGE7Ci0JCXN0cnVjdCBsb2dpY2FsVm9sSGVhZGVyRGVzYyAqbHZoZDsKLQkJdWludDY0X3QgdW5pcXVlSUQ7Ci0JCWx2aGQgPSAoc3RydWN0IGxvZ2ljYWxWb2xIZWFkZXJEZXNjICopCi0JCQkJbHZpZC0+bG9naWNhbFZvbENvbnRlbnRzVXNlOwotCQl1bmlxdWVJRCA9IGxlNjRfdG9fY3B1KGx2aGQtPnVuaXF1ZUlEKTsKKwlpZiAoVURGX1NCKGlub2RlLT5pX3NiKS0+c19sdmlkX2JoKSB7CiAJCSooX19sZTMyICopKChzdHJ1Y3QgYWxsb2NEZXNjSW1wVXNlICopY2ZpLmljYi5pbXBVc2UpLT5pbXBVc2UgPQotCQkJY3B1X3RvX2xlMzIodW5pcXVlSUQgJiAweDAwMDAwMDAwRkZGRkZGRkZVTCk7Ci0JCWlmICghKCsrdW5pcXVlSUQgJiAweDAwMDAwMDAwRkZGRkZGRkZVTCkpCi0JCQl1bmlxdWVJRCArPSAxNjsKLQkJbHZoZC0+dW5pcXVlSUQgPSBjcHVfdG9fbGU2NCh1bmlxdWVJRCk7Ci0JCW1hcmtfYnVmZmVyX2RpcnR5KGJoKTsKKwkJCWNwdV90b19sZTMyKGx2aWRfZ2V0X3VuaXF1ZV9pZChzYikpOwogCX0KIAl1ZGZfd3JpdGVfZmkoZGlyLCAmY2ZpLCBmaSwgJmZpYmgsIE5VTEwsIE5VTEwpOwogCWlmIChVREZfSShkaXIpLT5pX2FsbG9jX3R5cGUgPT0gSUNCVEFHX0ZMQUdfQURfSU5fSUNCKQogCQltYXJrX2lub2RlX2RpcnR5KGRpcik7CisJdXBfd3JpdGUoJmlpbmZvLT5pX2RhdGFfc2VtKTsKIAlpZiAoZmliaC5zYmggIT0gZmliaC5lYmgpCiAJCWJyZWxzZShmaWJoLmViaCk7CiAJYnJlbHNlKGZpYmguc2JoKTsKQEAgLTEwNDQsMTAgKzEwMTcsMTAgQEAKIAogb3V0OgogCWtmcmVlKG5hbWUpOwotCXVubG9ja19rZXJuZWwoKTsKIAlyZXR1cm4gZXJyOwogCiBvdXRfbm9fZW50cnk6CisJdXBfd3JpdGUoJmlpbmZvLT5pX2RhdGFfc2VtKTsKIAlpbm9kZV9kZWNfbGlua19jb3VudChpbm9kZSk7CiAJaXB1dChpbm9kZSk7CiAJZ290byBvdXQ7CkBAIC0xMDYwLDM2ICsxMDMzLDIwIEBACiAJc3RydWN0IHVkZl9maWxlaWRlbnRfYmggZmliaDsKIAlzdHJ1Y3QgZmlsZUlkZW50RGVzYyBjZmksICpmaTsKIAlpbnQgZXJyOwotCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CiAKLQlsb2NrX2tlcm5lbCgpOwogCWlmIChpbm9kZS0+aV9ubGluayA+PSAoMjU2IDw8IHNpemVvZihpbm9kZS0+aV9ubGluaykpIC0gMSkgewotCQl1bmxvY2tfa2VybmVsKCk7CiAJCXJldHVybiAtRU1MSU5LOwogCX0KIAogCWZpID0gdWRmX2FkZF9lbnRyeShkaXIsIGRlbnRyeSwgJmZpYmgsICZjZmksICZlcnIpOwogCWlmICghZmkpIHsKLQkJdW5sb2NrX2tlcm5lbCgpOwogCQlyZXR1cm4gZXJyOwogCX0KIAljZmkuaWNiLmV4dExlbmd0aCA9IGNwdV90b19sZTMyKGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSk7CiAJY2ZpLmljYi5leHRMb2NhdGlvbiA9IGNwdV90b19sZWxiKFVERl9JKGlub2RlKS0+aV9sb2NhdGlvbik7Ci0JYmggPSBVREZfU0IoaW5vZGUtPmlfc2IpLT5zX2x2aWRfYmg7Ci0JaWYgKGJoKSB7Ci0JCXN0cnVjdCBsb2dpY2FsVm9sSW50ZWdyaXR5RGVzYyAqbHZpZCA9Ci0JCQkJKHN0cnVjdCBsb2dpY2FsVm9sSW50ZWdyaXR5RGVzYyAqKWJoLT5iX2RhdGE7Ci0JCXN0cnVjdCBsb2dpY2FsVm9sSGVhZGVyRGVzYyAqbHZoZDsKLQkJdWludDY0X3QgdW5pcXVlSUQ7Ci0JCWx2aGQgPSAoc3RydWN0IGxvZ2ljYWxWb2xIZWFkZXJEZXNjICopCi0JCQkJKGx2aWQtPmxvZ2ljYWxWb2xDb250ZW50c1VzZSk7Ci0JCXVuaXF1ZUlEID0gbGU2NF90b19jcHUobHZoZC0+dW5pcXVlSUQpOworCWlmIChVREZfU0IoaW5vZGUtPmlfc2IpLT5zX2x2aWRfYmgpIHsKIAkJKihfX2xlMzIgKikoKHN0cnVjdCBhbGxvY0Rlc2NJbXBVc2UgKiljZmkuaWNiLmltcFVzZSktPmltcFVzZSA9Ci0JCQljcHVfdG9fbGUzMih1bmlxdWVJRCAmIDB4MDAwMDAwMDBGRkZGRkZGRlVMKTsKLQkJaWYgKCEoKyt1bmlxdWVJRCAmIDB4MDAwMDAwMDBGRkZGRkZGRlVMKSkKLQkJCXVuaXF1ZUlEICs9IDE2OwotCQlsdmhkLT51bmlxdWVJRCA9IGNwdV90b19sZTY0KHVuaXF1ZUlEKTsKLQkJbWFya19idWZmZXJfZGlydHkoYmgpOworCQkJY3B1X3RvX2xlMzIobHZpZF9nZXRfdW5pcXVlX2lkKGlub2RlLT5pX3NiKSk7CiAJfQogCXVkZl93cml0ZV9maShkaXIsICZjZmksIGZpLCAmZmliaCwgTlVMTCwgTlVMTCk7CiAJaWYgKFVERl9JKGRpciktPmlfYWxsb2NfdHlwZSA9PSBJQ0JUQUdfRkxBR19BRF9JTl9JQ0IpCkBAIC0xMTAzLDcgKzEwNjAsNiBAQAogCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOwogCWlob2xkKGlub2RlKTsKIAlkX2luc3RhbnRpYXRlKGRlbnRyeSwgaW5vZGUpOwotCXVubG9ja19rZXJuZWwoKTsKIAogCXJldHVybiAwOwogfQpAQCAtMTEyNCw3ICsxMDgwLDYgQEAKIAlzdHJ1Y3Qga2VybmVsX2xiX2FkZHIgdGxvYzsKIAlzdHJ1Y3QgdWRmX2lub2RlX2luZm8gKm9sZF9paW5mbyA9IFVERl9JKG9sZF9pbm9kZSk7CiAKLQlsb2NrX2tlcm5lbCgpOwogCW9maSA9IHVkZl9maW5kX2VudHJ5KG9sZF9kaXIsICZvbGRfZGVudHJ5LT5kX25hbWUsICZvZmliaCwgJm9jZmkpOwogCWlmIChvZmkpIHsKIAkJaWYgKG9maWJoLnNiaCAhPSBvZmliaC5lYmgpCkBAIC0xMjQ4LDcgKzEyMDMsNiBAQAogCQkJYnJlbHNlKG5maWJoLmViaCk7CiAJCWJyZWxzZShuZmliaC5zYmgpOwogCX0KLQl1bmxvY2tfa2VybmVsKCk7CiAKIAlyZXR1cm4gcmV0dmFsOwogfQpAQCAtMTI2MSw3ICsxMjE1LDYgQEAKIAlzdHJ1Y3QgZmlsZUlkZW50RGVzYyBjZmk7CiAJc3RydWN0IHVkZl9maWxlaWRlbnRfYmggZmliaDsKIAotCWxvY2tfa2VybmVsKCk7CiAJaWYgKCF1ZGZfZmluZF9lbnRyeShjaGlsZC0+ZF9pbm9kZSwgJmRvdGRvdCwgJmZpYmgsICZjZmkpKQogCQlnb3RvIG91dF91bmxvY2s7CiAKQEAgLTEyNzMsMTEgKzEyMjYsOSBAQAogCWlub2RlID0gdWRmX2lnZXQoY2hpbGQtPmRfaW5vZGUtPmlfc2IsICZ0bG9jKTsKIAlpZiAoIWlub2RlKQogCQlnb3RvIG91dF91bmxvY2s7Ci0JdW5sb2NrX2tlcm5lbCgpOwogCiAJcmV0dXJuIGRfb2J0YWluX2FsaWFzKGlub2RlKTsKIG91dF91bmxvY2s6Ci0JdW5sb2NrX2tlcm5lbCgpOwogCXJldHVybiBFUlJfUFRSKC1FQUNDRVMpOwogfQogCmRpZmYgLS1naXQgYS9mcy91ZGYvcGFydGl0aW9uLmMgYi9mcy91ZGYvcGFydGl0aW9uLmMKaW5kZXggNzQ1ZWIyMC4uYTcxMDkwZSAxMDA2NDQKLS0tIGEvZnMvdWRmL3BhcnRpdGlvbi5jCisrKyBiL2ZzL3VkZi9wYXJ0aXRpb24uYwpAQCAtMjUsNiArMjUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogCiB1aW50MzJfdCB1ZGZfZ2V0X3BibG9jayhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB1aW50MzJfdCBibG9jaywKIAkJCXVpbnQxNl90IHBhcnRpdGlvbiwgdWludDMyX3Qgb2Zmc2V0KQpAQCAtMTU5LDcgKzE2MCw5IEBACiAJc3RydWN0IHVkZl9zYl9pbmZvICpzYmkgPSBVREZfU0Ioc2IpOwogCXUxNiByZWFsbG9jYXRpb25UYWJsZUxlbjsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCWludCByZXQgPSAwOwogCisJbXV0ZXhfbG9jaygmc2JpLT5zX2FsbG9jX211dGV4KTsKIAlmb3IgKGkgPSAwOyBpIDwgc2JpLT5zX3BhcnRpdGlvbnM7IGkrKykgewogCQlzdHJ1Y3QgdWRmX3BhcnRfbWFwICptYXAgPSAmc2JpLT5zX3BhcnRtYXBzW2ldOwogCQlpZiAob2xkX2Jsb2NrID4gbWFwLT5zX3BhcnRpdGlvbl9yb290ICYmCkBAIC0xNzUsOCArMTc4LDEwIEBACiAJCQkJCWJyZWFrOwogCQkJCX0KIAotCQkJaWYgKCFzdCkKLQkJCQlyZXR1cm4gMTsKKwkJCWlmICghc3QpIHsKKwkJCQlyZXQgPSAxOworCQkJCWdvdG8gb3V0OworCQkJfQogCiAJCQlyZWFsbG9jYXRpb25UYWJsZUxlbiA9CiAJCQkJCWxlMTZfdG9fY3B1KHN0LT5yZWFsbG9jYXRpb25UYWJsZUxlbik7CkBAIC0yMDcsMTQgKzIxMiwxNiBAQAogCQkJCQkJICAgICAoKG9sZF9ibG9jayAtCiAJCQkJCQkJbWFwLT5zX3BhcnRpdGlvbl9yb290KSAmCiAJCQkJCQkgICAgIChzZGF0YS0+c19wYWNrZXRfbGVuIC0gMSkpOwotCQkJCQlyZXR1cm4gMDsKKwkJCQkJcmV0ID0gMDsKKwkJCQkJZ290byBvdXQ7CiAJCQkJfSBlbHNlIGlmIChvcmlnTG9jID09IHBhY2tldCkgewogCQkJCQkqbmV3X2Jsb2NrID0gbGUzMl90b19jcHUoCiAJCQkJCQkJZW50cnktPm1hcHBlZExvY2F0aW9uKSArCiAJCQkJCQkgICAgICgob2xkX2Jsb2NrIC0KIAkJCQkJCQltYXAtPnNfcGFydGl0aW9uX3Jvb3QpICYKIAkJCQkJCSAgICAgKHNkYXRhLT5zX3BhY2tldF9sZW4gLSAxKSk7Ci0JCQkJCXJldHVybiAwOworCQkJCQlyZXQgPSAwOworCQkJCQlnb3RvIG91dDsKIAkJCQl9IGVsc2UgaWYgKG9yaWdMb2MgPiBwYWNrZXQpCiAJCQkJCWJyZWFrOwogCQkJfQpAQCAtMjUxLDIwICsyNTgsMjQgQEAKIAkJCQkJICAgICAgc3QtPm1hcEVudHJ5W2tdLm1hcHBlZExvY2F0aW9uKSArCiAJCQkJCSgob2xkX2Jsb2NrIC0gbWFwLT5zX3BhcnRpdGlvbl9yb290KSAmCiAJCQkJCSAoc2RhdGEtPnNfcGFja2V0X2xlbiAtIDEpKTsKLQkJCQlyZXR1cm4gMDsKKwkJCQlyZXQgPSAwOworCQkJCWdvdG8gb3V0OwogCQkJfQogCi0JCQlyZXR1cm4gMTsKKwkJCXJldCA9IDE7CisJCQlnb3RvIG91dDsKIAkJfSAvKiBpZiBvbGRfYmxvY2sgKi8KIAl9CiAKIAlpZiAoaSA9PSBzYmktPnNfcGFydGl0aW9ucykgewogCQkvKiBvdXRzaWRlIG9mIHBhcnRpdGlvbnMgKi8KIAkJLyogZm9yIG5vdywgZmFpbCA9KSAqLwotCQlyZXR1cm4gMTsKKwkJcmV0ID0gMTsKIAl9CiAKLQlyZXR1cm4gMDsKK291dDoKKwltdXRleF91bmxvY2soJnNiaS0+c19hbGxvY19tdXRleCk7CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIHVpbnQzMl90IHVkZl90cnlfcmVhZF9tZXRhKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHVpbnQzMl90IGJsb2NrLApkaWZmIC0tZ2l0IGEvZnMvdWRmL3N1cGVyLmMgYi9mcy91ZGYvc3VwZXIuYwppbmRleCBiNTM5ZDUzLi43YjI3YjA2IDEwMDY0NAotLS0gYS9mcy91ZGYvc3VwZXIuYworKysgYi9mcy91ZGYvc3VwZXIuYwpAQCAtNDgsNyArNDgsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KICNpbmNsdWRlIDxsaW51eC9jZHJvbS5oPgogI2luY2x1ZGUgPGxpbnV4L25scy5oPgotI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KICNpbmNsdWRlIDxsaW51eC92ZnMuaD4KICNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CkBAIC0xMzUsNiArMTM0LDcgQEAKIAllaS0+aV9uZXh0X2FsbG9jX2Jsb2NrID0gMDsKIAllaS0+aV9uZXh0X2FsbG9jX2dvYWwgPSAwOwogCWVpLT5pX3N0cmF0NDA5NiA9IDA7CisJaW5pdF9yd3NlbSgmZWktPmlfZGF0YV9zZW0pOwogCiAJcmV0dXJuICZlaS0+dmZzX2lub2RlOwogfQpAQCAtNTc0LDEzICs1NzQsMTQgQEAKIAlpZiAoIXVkZl9wYXJzZV9vcHRpb25zKG9wdGlvbnMsICZ1b3B0LCB0cnVlKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlsb2NrX2tlcm5lbCgpOworCXdyaXRlX2xvY2soJnNiaS0+c19jcmVkX2xvY2spOwogCXNiaS0+c19mbGFncyA9IHVvcHQuZmxhZ3M7CiAJc2JpLT5zX3VpZCAgID0gdW9wdC51aWQ7CiAJc2JpLT5zX2dpZCAgID0gdW9wdC5naWQ7CiAJc2JpLT5zX3VtYXNrID0gdW9wdC51bWFzazsKIAlzYmktPnNfZm1vZGUgPSB1b3B0LmZtb2RlOwogCXNiaS0+c19kbW9kZSA9IHVvcHQuZG1vZGU7CisJd3JpdGVfdW5sb2NrKCZzYmktPnNfY3JlZF9sb2NrKTsKIAogCWlmIChzYmktPnNfbHZpZF9iaCkgewogCQlpbnQgd3JpdGVfcmV2ID0gbGUxNl90b19jcHUodWRmX3NiX2x2aWRpdShzYmkpLT5taW5VREZXcml0ZVJldik7CkBAIC01OTcsNyArNTk4LDYgQEAKIAkJdWRmX29wZW5fbHZpZChzYik7CiAKIG91dF91bmxvY2s6Ci0JdW5sb2NrX2tlcm5lbCgpOwogCXJldHVybiBlcnJvcjsKIH0KIApAQCAtOTY2LDkgKzk2Niw5IEBACiAJCShzaXplb2Yoc3RydWN0IGJ1ZmZlcl9oZWFkICopICogbnJfZ3JvdXBzKTsKIAogCWlmIChzaXplIDw9IFBBR0VfU0laRSkKLQkJYml0bWFwID0ga21hbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKKwkJYml0bWFwID0ga3phbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKIAllbHNlCi0JCWJpdG1hcCA9IHZtYWxsb2Moc2l6ZSk7IC8qIFRPRE86IGdldCByaWQgb2Ygdm1hbGxvYyAqLworCQliaXRtYXAgPSB2emFsbG9jKHNpemUpOyAvKiBUT0RPOiBnZXQgcmlkIG9mIHZ6YWxsb2MgKi8KIAogCWlmIChiaXRtYXAgPT0gTlVMTCkgewogCQl1ZGZfZXJyb3Ioc2IsIF9fZnVuY19fLApAQCAtOTc3LDcgKzk3Nyw2IEBACiAJCXJldHVybiBOVUxMOwogCX0KIAotCW1lbXNldChiaXRtYXAsIDB4MDAsIHNpemUpOwogCWJpdG1hcC0+c19ibG9ja19iaXRtYXAgPSAoc3RydWN0IGJ1ZmZlcl9oZWFkICoqKShiaXRtYXAgKyAxKTsKIAliaXRtYXAtPnNfbnJfZ3JvdXBzID0gbnJfZ3JvdXBzOwogCXJldHVybiBiaXRtYXA7CkBAIC0xNzgxLDYgKzE3ODAsOCBAQAogCiAJaWYgKCFiaCkKIAkJcmV0dXJuOworCisJbXV0ZXhfbG9jaygmc2JpLT5zX2FsbG9jX211dGV4KTsKIAlsdmlkID0gKHN0cnVjdCBsb2dpY2FsVm9sSW50ZWdyaXR5RGVzYyAqKWJoLT5iX2RhdGE7CiAJbHZpZGl1ID0gdWRmX3NiX2x2aWRpdShzYmkpOwogCkBAIC0xNzk3LDYgKzE3OTgsNyBAQAogCWx2aWQtPmRlc2NUYWcudGFnQ2hlY2tzdW0gPSB1ZGZfdGFnX2NoZWNrc3VtKCZsdmlkLT5kZXNjVGFnKTsKIAltYXJrX2J1ZmZlcl9kaXJ0eShiaCk7CiAJc2JpLT5zX2x2aWRfZGlydHkgPSAwOworCW11dGV4X3VubG9jaygmc2JpLT5zX2FsbG9jX211dGV4KTsKIH0KIAogc3RhdGljIHZvaWQgdWRmX2Nsb3NlX2x2aWQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKQEAgLTE4MDksNiArMTgxMSw3IEBACiAJaWYgKCFiaCkKIAkJcmV0dXJuOwogCisJbXV0ZXhfbG9jaygmc2JpLT5zX2FsbG9jX211dGV4KTsKIAlsdmlkID0gKHN0cnVjdCBsb2dpY2FsVm9sSW50ZWdyaXR5RGVzYyAqKWJoLT5iX2RhdGE7CiAJbHZpZGl1ID0gdWRmX3NiX2x2aWRpdShzYmkpOwogCWx2aWRpdS0+aW1wSWRlbnQuaWRlbnRTdWZmaXhbMF0gPSBVREZfT1NfQ0xBU1NfVU5JWDsKQEAgLTE4MjksNiArMTgzMiwzNCBAQAogCWx2aWQtPmRlc2NUYWcudGFnQ2hlY2tzdW0gPSB1ZGZfdGFnX2NoZWNrc3VtKCZsdmlkLT5kZXNjVGFnKTsKIAltYXJrX2J1ZmZlcl9kaXJ0eShiaCk7CiAJc2JpLT5zX2x2aWRfZGlydHkgPSAwOworCW11dGV4X3VubG9jaygmc2JpLT5zX2FsbG9jX211dGV4KTsKK30KKwordTY0IGx2aWRfZ2V0X3VuaXF1ZV9pZChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisJc3RydWN0IHVkZl9zYl9pbmZvICpzYmkgPSBVREZfU0Ioc2IpOworCXN0cnVjdCBsb2dpY2FsVm9sSW50ZWdyaXR5RGVzYyAqbHZpZDsKKwlzdHJ1Y3QgbG9naWNhbFZvbEhlYWRlckRlc2MgKmx2aGQ7CisJdTY0IHVuaXF1ZUlEOworCXU2NCByZXQ7CisKKwliaCA9IHNiaS0+c19sdmlkX2JoOworCWlmICghYmgpCisJCXJldHVybiAwOworCisJbHZpZCA9IChzdHJ1Y3QgbG9naWNhbFZvbEludGVncml0eURlc2MgKiliaC0+Yl9kYXRhOworCWx2aGQgPSAoc3RydWN0IGxvZ2ljYWxWb2xIZWFkZXJEZXNjICopbHZpZC0+bG9naWNhbFZvbENvbnRlbnRzVXNlOworCisJbXV0ZXhfbG9jaygmc2JpLT5zX2FsbG9jX211dGV4KTsKKwlyZXQgPSB1bmlxdWVJRCA9IGxlNjRfdG9fY3B1KGx2aGQtPnVuaXF1ZUlEKTsKKwlpZiAoISgrK3VuaXF1ZUlEICYgMHhGRkZGRkZGRikpCisJCXVuaXF1ZUlEICs9IDE2OworCWx2aGQtPnVuaXF1ZUlEID0gY3B1X3RvX2xlNjQodW5pcXVlSUQpOworCW11dGV4X3VubG9jaygmc2JpLT5zX2FsbG9jX211dGV4KTsKKwltYXJrX2J1ZmZlcl9kaXJ0eShiaCk7CisKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgdm9pZCB1ZGZfc2JfZnJlZV9iaXRtYXAoc3RydWN0IHVkZl9iaXRtYXAgKmJpdG1hcCkKQEAgLTE4ODYsOCArMTkxNyw2IEBACiAJc3RydWN0IGtlcm5lbF9sYl9hZGRyIHJvb3RkaXIsIGZpbGVzZXQ7CiAJc3RydWN0IHVkZl9zYl9pbmZvICpzYmk7CiAKLQlsb2NrX2tlcm5lbCgpOwotCiAJdW9wdC5mbGFncyA9ICgxIDw8IFVERl9GTEFHX1VTRV9BRF9JTl9JQ0IpIHwgKDEgPDwgVURGX0ZMQUdfU1RSSUNUKTsKIAl1b3B0LnVpZCA9IC0xOwogCXVvcHQuZ2lkID0gLTE7CkBAIC0xODk2LDEwICsxOTI1LDggQEAKIAl1b3B0LmRtb2RlID0gVURGX0lOVkFMSURfTU9ERTsKIAogCXNiaSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB1ZGZfc2JfaW5mbyksIEdGUF9LRVJORUwpOwotCWlmICghc2JpKSB7Ci0JCXVubG9ja19rZXJuZWwoKTsKKwlpZiAoIXNiaSkKIAkJcmV0dXJuIC1FTk9NRU07Ci0JfQogCiAJc2ItPnNfZnNfaW5mbyA9IHNiaTsKIApAQCAtMTkzNiw2ICsxOTYzLDcgQEAKIAlzYmktPnNfZm1vZGUgPSB1b3B0LmZtb2RlOwogCXNiaS0+c19kbW9kZSA9IHVvcHQuZG1vZGU7CiAJc2JpLT5zX25sc19tYXAgPSB1b3B0Lm5sc19tYXA7CisJcndsb2NrX2luaXQoJnNiaS0+c19jcmVkX2xvY2spOwogCiAJaWYgKHVvcHQuc2Vzc2lvbiA9PSAweEZGRkZGRkZGKQogCQlzYmktPnNfc2Vzc2lvbiA9IHVkZl9nZXRfbGFzdF9zZXNzaW9uKHNiKTsKQEAgLTIwNDUsNyArMjA3Myw2IEBACiAJCWdvdG8gZXJyb3Jfb3V0OwogCX0KIAlzYi0+c19tYXhieXRlcyA9IE1BWF9MRlNfRklMRVNJWkU7Ci0JdW5sb2NrX2tlcm5lbCgpOwogCXJldHVybiAwOwogCiBlcnJvcl9vdXQ6CkBAIC0yMDY2LDcgKzIwOTMsNiBAQAogCWtmcmVlKHNiaSk7CiAJc2ItPnNfZnNfaW5mbyA9IE5VTEw7CiAKLQl1bmxvY2tfa2VybmVsKCk7CiAJcmV0dXJuIC1FSU5WQUw7CiB9CiAKQEAgLTIxMDUsOCArMjEzMSw2IEBACiAKIAlzYmkgPSBVREZfU0Ioc2IpOwogCi0JbG9ja19rZXJuZWwoKTsKLQogCWlmIChzYmktPnNfdmF0X2lub2RlKQogCQlpcHV0KHNiaS0+c192YXRfaW5vZGUpOwogCWlmIChzYmktPnNfcGFydGl0aW9ucykKQEAgLTIxMjIsOCArMjE0Niw2IEBACiAJa2ZyZWUoc2JpLT5zX3BhcnRtYXBzKTsKIAlrZnJlZShzYi0+c19mc19pbmZvKTsKIAlzYi0+c19mc19pbmZvID0gTlVMTDsKLQotCXVubG9ja19rZXJuZWwoKTsKIH0KIAogc3RhdGljIGludCB1ZGZfc3luY19mcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgd2FpdCkKQEAgLTIxODYsOCArMjIwOCw2IEBACiAJdWludDE2X3QgaWRlbnQ7CiAJc3RydWN0IHNwYWNlQml0bWFwRGVzYyAqYm07CiAKLQlsb2NrX2tlcm5lbCgpOwotCiAJbG9jLmxvZ2ljYWxCbG9ja051bSA9IGJpdG1hcC0+c19leHRQb3NpdGlvbjsKIAlsb2MucGFydGl0aW9uUmVmZXJlbmNlTnVtID0gVURGX1NCKHNiKS0+c19wYXJ0aXRpb247CiAJYmggPSB1ZGZfcmVhZF9wdGFnZ2VkKHNiLCAmbG9jLCAwLCAmaWRlbnQpOwpAQCAtMjIyNCwxMCArMjI0NCw3IEBACiAJCX0KIAl9CiAJYnJlbHNlKGJoKTsKLQogb3V0OgotCXVubG9ja19rZXJuZWwoKTsKLQogCXJldHVybiBhY2N1bTsKIH0KIApAQCAtMjI0MCw4ICsyMjU3LDcgQEAKIAlpbnQ4X3QgZXR5cGU7CiAJc3RydWN0IGV4dGVudF9wb3NpdGlvbiBlcG9zOwogCi0JbG9ja19rZXJuZWwoKTsKLQorCW11dGV4X2xvY2soJlVERl9TQihzYiktPnNfYWxsb2NfbXV0ZXgpOwogCWVwb3MuYmxvY2sgPSBVREZfSSh0YWJsZSktPmlfbG9jYXRpb247CiAJZXBvcy5vZmZzZXQgPSBzaXplb2Yoc3RydWN0IHVuYWxsb2NTcGFjZUVudHJ5KTsKIAllcG9zLmJoID0gTlVMTDsKQEAgLTIyNTAsOCArMjI2Niw3IEBACiAJCWFjY3VtICs9IChlbGVuID4+IHRhYmxlLT5pX3NiLT5zX2Jsb2Nrc2l6ZV9iaXRzKTsKIAogCWJyZWxzZShlcG9zLmJoKTsKLQotCXVubG9ja19rZXJuZWwoKTsKKwltdXRleF91bmxvY2soJlVERl9TQihzYiktPnNfYWxsb2NfbXV0ZXgpOwogCiAJcmV0dXJuIGFjY3VtOwogfQpkaWZmIC0tZ2l0IGEvZnMvdWRmL3N5bWxpbmsuYyBiL2ZzL3VkZi9zeW1saW5rLmMKaW5kZXggMTYwNjQ3OC4uYjFkNDQ4OCAxMDA2NDQKLS0tIGEvZnMvdWRmL3N5bWxpbmsuYworKysgYi9mcy91ZGYvc3ltbGluay5jCkBAIC0yNyw3ICsyNyw2IEBACiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgotI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KICNpbmNsdWRlICJ1ZGZfaS5oIgogCkBAIC03OCwxMyArNzcsMTYgQEAKIAlpbnQgZXJyID0gLUVJTzsKIAl1bnNpZ25lZCBjaGFyICpwID0ga21hcChwYWdlKTsKIAlzdHJ1Y3QgdWRmX2lub2RlX2luZm8gKmlpbmZvOworCXVpbnQzMl90IHBvczsKIAotCWxvY2tfa2VybmVsKCk7CiAJaWluZm8gPSBVREZfSShpbm9kZSk7CisJcG9zID0gdWRmX2Jsb2NrX21hcChpbm9kZSwgMCk7CisKKwlkb3duX3JlYWQoJmlpbmZvLT5pX2RhdGFfc2VtKTsKIAlpZiAoaWluZm8tPmlfYWxsb2NfdHlwZSA9PSBJQ0JUQUdfRkxBR19BRF9JTl9JQ0IpIHsKIAkJc3ltbGluayA9IGlpbmZvLT5pX2V4dC5pX2RhdGEgKyBpaW5mby0+aV9sZW5FQXR0cjsKIAl9IGVsc2UgewotCQliaCA9IHNiX2JyZWFkKGlub2RlLT5pX3NiLCB1ZGZfYmxvY2tfbWFwKGlub2RlLCAwKSk7CisJCWJoID0gc2JfYnJlYWQoaW5vZGUtPmlfc2IsIHBvcyk7CiAKIAkJaWYgKCFiaCkKIAkJCWdvdG8gb3V0OwpAQCAtOTUsMTQgKzk3LDE0IEBACiAJdWRmX3BjX3RvX2NoYXIoaW5vZGUtPmlfc2IsIHN5bWxpbmssIGlub2RlLT5pX3NpemUsIHApOwogCWJyZWxzZShiaCk7CiAKLQl1bmxvY2tfa2VybmVsKCk7CisJdXBfcmVhZCgmaWluZm8tPmlfZGF0YV9zZW0pOwogCVNldFBhZ2VVcHRvZGF0ZShwYWdlKTsKIAlrdW5tYXAocGFnZSk7CiAJdW5sb2NrX3BhZ2UocGFnZSk7CiAJcmV0dXJuIDA7CiAKIG91dDoKLQl1bmxvY2tfa2VybmVsKCk7CisJdXBfcmVhZCgmaWluZm8tPmlfZGF0YV9zZW0pOwogCVNldFBhZ2VFcnJvcihwYWdlKTsKIAlrdW5tYXAocGFnZSk7CiAJdW5sb2NrX3BhZ2UocGFnZSk7CmRpZmYgLS1naXQgYS9mcy91ZGYvdWRmX2kuaCBiL2ZzL3VkZi91ZGZfaS5oCmluZGV4IGU1OGQxZGUuLmQxYmQzMWUgMTAwNjQ0Ci0tLSBhL2ZzL3VkZi91ZGZfaS5oCisrKyBiL2ZzL3VkZi91ZGZfaS5oCkBAIC0xLDYgKzEsMTggQEAKICNpZm5kZWYgX1VERl9JX0gKICNkZWZpbmUgX1VERl9JX0gKIAorLyoKKyAqIFRoZSBpX2RhdGFfc2VtIGFuZCBpX211dGV4IHNlcnZlIGZvciBwcm90ZWN0aW9uIG9mIGFsbG9jYXRpb24gaW5mb3JtYXRpb24KKyAqIG9mIGEgcmVndWxhciBmaWxlcyBhbmQgc3ltbGlua3MuIFRoaXMgaW5jbHVkZXMgYWxsIGV4dGVudHMgYmVsb25naW5nIHRvCisgKiB0aGUgZmlsZS9zeW1saW5rLCBhIGZhY3Qgd2hldGhlciBkYXRhIGFyZSBpbi1pbm9kZSBvciBpbiBleHRlcm5hbCBkYXRhCisgKiBibG9ja3MsIHByZWFsbG9jYXRpb24sIGdvYWwgYmxvY2sgaW5mb3JtYXRpb24uLi4gV2hlbiBleHRlbnRzIGFyZSByZWFkLAorICogaV9tdXRleCBvciBpX2RhdGFfc2VtIG11c3QgYmUgaGVsZCAoZm9yIHJlYWRpbmcgaXMgZW5vdWdoIGluIGNhc2Ugb2YKKyAqIGlfZGF0YV9zZW0pLiBXaGVuIGV4dGVudHMgYXJlIGNoYW5nZWQsIGlfZGF0YV9zZW0gbXVzdCBiZSBoZWxkIGZvciB3cml0aW5nCisgKiBhbmQgYWxzbyBpX211dGV4IG11c3QgYmUgaGVsZC4KKyAqCisgKiBGb3IgZGlyZWN0b3JpZXMgaV9tdXRleCBpcyB1c2VkIGZvciBhbGwgdGhlIG5lY2Vzc2FyeSBwcm90ZWN0aW9uLgorICovCisKIHN0cnVjdCB1ZGZfaW5vZGVfaW5mbyB7CiAJc3RydWN0IHRpbWVzcGVjCQlpX2NydGltZTsKIAkvKiBQaHlzaWNhbCBhZGRyZXNzIG9mIGlub2RlICovCkBAIC0yMSw2ICszMyw3IEBACiAJCXN0cnVjdCBsb25nX2FkCQkqaV9sYWQ7CiAJCV9fdTgJCSppX2RhdGE7CiAJfSBpX2V4dDsKKwlzdHJ1Y3Qgcndfc2VtYXBob3JlCWlfZGF0YV9zZW07CiAJc3RydWN0IGlub2RlIHZmc19pbm9kZTsKIH07CiAKZGlmZiAtLWdpdCBhL2ZzL3VkZi91ZGZfc2IuaCBiL2ZzL3VkZi91ZGZfc2IuaAppbmRleCBkMTEzYjcyLi40ODU4YzE5IDEwMDY0NAotLS0gYS9mcy91ZGYvdWRmX3NiLmgKKysrIGIvZnMvdWRmL3VkZl9zYi5oCkBAIC0yLDYgKzIsNyBAQAogI2RlZmluZSBfX0xJTlVYX1VERl9TQl9ICiAKICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgogCiAvKiBTaW5jZSBVREYgMi4wMSBpcyBJU08gMTMzNDYgYmFzZWQuLi4gKi8KICNkZWZpbmUgVURGX1NVUEVSX01BR0lDCQkJMHgxNTAxMzM0NgpAQCAtMTI4LDYgKzEyOSw4IEBACiAJdWlkX3QJCQlzX3VpZDsKIAltb2RlX3QJCQlzX2Ztb2RlOwogCW1vZGVfdAkJCXNfZG1vZGU7CisJLyogTG9jayBwcm90ZWN0aW5nIGNvbnNpc3RlbmN5IG9mIGFib3ZlIHBlcm1pc3Npb24gc2V0dGluZ3MgKi8KKwlyd2xvY2tfdAkJc19jcmVkX2xvY2s7CiAKIAkvKiBSb290IEluZm8gKi8KIAlzdHJ1Y3QgdGltZXNwZWMJCXNfcmVjb3JkX3RpbWU7CkBAIC0xMzksNyArMTQyLDcgQEAKIAlfX3UxNgkJCXNfdWRmcmV2OwogCiAJLyogTWlzY2VsbGFuZW91cyBmbGFncyAqLwotCV9fdTMyCQkJc19mbGFnczsKKwl1bnNpZ25lZCBsb25nCQlzX2ZsYWdzOwogCiAJLyogRW5jb2RpbmcgaW5mbyAqLwogCXN0cnVjdCBubHNfdGFibGUJKnNfbmxzX21hcDsKQEAgLTE2MSw4ICsxNjQsMTkgQEAKIAogaW50IHVkZl9jb21wdXRlX25yX2dyb3VwcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB1MzIgcGFydGl0aW9uKTsKIAotI2RlZmluZSBVREZfUVVFUllfRkxBRyhYLFkpCQkJKCBVREZfU0IoWCktPnNfZmxhZ3MgJiAoIDEgPDwgKFkpICkgKQotI2RlZmluZSBVREZfU0VUX0ZMQUcoWCxZKQkJCSggVURGX1NCKFgpLT5zX2ZsYWdzIHw9ICggMSA8PCAoWSkgKSApCi0jZGVmaW5lIFVERl9DTEVBUl9GTEFHKFgsWSkJCQkoIFVERl9TQihYKS0+c19mbGFncyAmPSB+KCAxIDw8IChZKSApICkKK3N0YXRpYyBpbmxpbmUgaW50IFVERl9RVUVSWV9GTEFHKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCBmbGFnKQoreworCXJldHVybiB0ZXN0X2JpdChmbGFnLCAmVURGX1NCKHNiKS0+c19mbGFncyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBVREZfU0VUX0ZMQUcoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IGZsYWcpCit7CisJc2V0X2JpdChmbGFnLCAmVURGX1NCKHNiKS0+c19mbGFncyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBVREZfQ0xFQVJfRkxBRyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgZmxhZykKK3sKKwljbGVhcl9iaXQoZmxhZywgJlVERl9TQihzYiktPnNfZmxhZ3MpOworfQogCiAjZW5kaWYgLyogX19MSU5VWF9VREZfU0JfSCAqLwpkaWZmIC0tZ2l0IGEvZnMvdWRmL3VkZmRlY2wuaCBiL2ZzL3VkZi91ZGZkZWNsLmgKaW5kZXggNjk5NWFiMS4uZWJhNDgyMCAxMDA2NDQKLS0tIGEvZnMvdWRmL3VkZmRlY2wuaAorKysgYi9mcy91ZGYvdWRmZGVjbC5oCkBAIC0xMTEsNiArMTExLDggQEAKIH07CiAKIC8qIHN1cGVyLmMgKi8KKworX19hdHRyaWJ1dGVfXygoZm9ybWF0KHByaW50ZiwgMywgNCkpKQogZXh0ZXJuIHZvaWQgdWRmX3dhcm5pbmcoc3RydWN0IHN1cGVyX2Jsb2NrICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCAuLi4pOwogc3RhdGljIGlubGluZSB2b2lkIHVkZl91cGRhdGVkX2x2aWQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKIHsKQEAgLTEyMyw2ICsxMjUsNyBAQAogCXNiLT5zX2RpcnQgPSAxOwogCVVERl9TQihzYiktPnNfbHZpZF9kaXJ0eSA9IDE7CiB9CitleHRlcm4gdTY0IGx2aWRfZ2V0X3VuaXF1ZV9pZChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKTsKIAogLyogbmFtZWkuYyAqLwogZXh0ZXJuIGludCB1ZGZfd3JpdGVfZmkoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGVJZGVudERlc2MgKiwKQEAgLTEzMyw3ICsxMzYsNiBAQAogZXh0ZXJuIGxvbmcgdWRmX2lvY3RsKHN0cnVjdCBmaWxlICosIHVuc2lnbmVkIGludCwgdW5zaWduZWQgbG9uZyk7CiAvKiBpbm9kZS5jICovCiBleHRlcm4gc3RydWN0IGlub2RlICp1ZGZfaWdldChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgc3RydWN0IGtlcm5lbF9sYl9hZGRyICopOwotZXh0ZXJuIGludCB1ZGZfc3luY19pbm9kZShzdHJ1Y3QgaW5vZGUgKik7CiBleHRlcm4gdm9pZCB1ZGZfZXhwYW5kX2ZpbGVfYWRpbmljYihzdHJ1Y3QgaW5vZGUgKiwgaW50LCBpbnQgKik7CiBleHRlcm4gc3RydWN0IGJ1ZmZlcl9oZWFkICp1ZGZfZXhwYW5kX2Rpcl9hZGluaWNiKHN0cnVjdCBpbm9kZSAqLCBpbnQgKiwgaW50ICopOwogZXh0ZXJuIHN0cnVjdCBidWZmZXJfaGVhZCAqdWRmX2JyZWFkKHN0cnVjdCBpbm9kZSAqLCBpbnQsIGludCwgaW50ICopOwpkaWZmIC0tZ2l0IGEvZnMveGZzL2xpbnV4LTIuNi9zdi5oIGIvZnMveGZzL2xpbnV4LTIuNi9zdi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZGZjN2MzLi4wMDAwMDAwCi0tLSBhL2ZzL3hmcy9saW51eC0yLjYvc3YuaAorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMiwyMDA1IFNpbGljb24gR3JhcGhpY3MsIEluYy4KLSAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0gKi8KLSNpZm5kZWYgX19YRlNfU1VQUE9SVF9TVl9IX18KLSNkZWZpbmUgX19YRlNfU1VQUE9SVF9TVl9IX18KLQotI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+Ci0KLS8qCi0gKiBTeW5jaHJvbmlzYXRpb24gdmFyaWFibGVzLgotICoKLSAqIChQYXJhbWV0ZXJzICJwcmkiLCAic3ZmIiBhbmQgInJ0cyIgYXJlIG5vdCBpbXBsZW1lbnRlZCkKLSAqLwotCi10eXBlZGVmIHN0cnVjdCBzdl9zIHsKLQl3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0ZXJzOwotfSBzdl90OwotCi1zdGF0aWMgaW5saW5lIHZvaWQgX3N2X3dhaXQoc3ZfdCAqc3YsIHNwaW5sb2NrX3QgKmxvY2spCi17Ci0JREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7Ci0KLQlhZGRfd2FpdF9xdWV1ZV9leGNsdXNpdmUoJnN2LT53YWl0ZXJzLCAmd2FpdCk7Ci0JX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7Ci0Jc3Bpbl91bmxvY2sobG9jayk7Ci0KLQlzY2hlZHVsZSgpOwotCi0JcmVtb3ZlX3dhaXRfcXVldWUoJnN2LT53YWl0ZXJzLCAmd2FpdCk7Ci19Ci0KLSNkZWZpbmUgc3ZfaW5pdChzdixmbGFnLG5hbWUpIFwKLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCYoc3YpLT53YWl0ZXJzKQotI2RlZmluZSBzdl9kZXN0cm95KHN2KSBcCi0JLypOT1RISU5HKi8KLSNkZWZpbmUgc3Zfd2FpdChzdiwgcHJpLCBsb2NrLCBzKSBcCi0JX3N2X3dhaXQoc3YsIGxvY2spCi0jZGVmaW5lIHN2X3NpZ25hbChzdikgXAotCXdha2VfdXAoJihzdiktPndhaXRlcnMpCi0jZGVmaW5lIHN2X2Jyb2FkY2FzdChzdikgXAotCXdha2VfdXBfYWxsKCYoc3YpLT53YWl0ZXJzKQotCi0jZW5kaWYgLyogX19YRlNfU1VQUE9SVF9TVl9IX18gKi8KZGlmZiAtLWdpdCBhL2ZzL3hmcy9saW51eC0yLjYveGZzX2FvcHMuYyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX2FvcHMuYwppbmRleCA2OTFmNjEyLi5lYzdiYmI1IDEwMDY0NAotLS0gYS9mcy94ZnMvbGludXgtMi42L3hmc19hb3BzLmMKKysrIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfYW9wcy5jCkBAIC0zOCwxNSArMzgsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3BhZ2V2ZWMuaD4KICNpbmNsdWRlIDxsaW51eC93cml0ZWJhY2suaD4KIAotLyoKLSAqIFR5cGVzIG9mIEkvTyBmb3IgYm1hcCBjbHVzdGVyaW5nIGFuZCBJL08gY29tcGxldGlvbiB0cmFja2luZy4KLSAqLwotZW51bSB7Ci0JSU9fUkVBRCwJLyogbWFwcGluZyBmb3IgYSByZWFkICovCi0JSU9fREVMQVksCS8qIG1hcHBpbmcgY292ZXJzIGRlbGFsbG9jIHJlZ2lvbiAqLwotCUlPX1VOV1JJVFRFTiwJLyogbWFwcGluZyBjb3ZlcnMgYWxsb2NhdGVkIGJ1dCB1bmluaXRpYWxpemVkIGRhdGEgKi8KLQlJT19ORVcJCS8qIGp1c3QgYWxsb2NhdGVkICovCi19OwogCiAvKgogICogUHJpbWUgbnVtYmVyIG9mIGhhc2ggYnVja2V0cyBzaW5jZSBhZGRyZXNzIGlzIHVzZWQgYXMgdGhlIGtleS4KQEAgLTE4Miw5ICsxNzMsNiBAQAogCXhmc19pbm9kZV90CQkqaXAgPSBYRlNfSShpb2VuZC0+aW9faW5vZGUpOwogCXhmc19mc2l6ZV90CQlpc2l6ZTsKIAotCUFTU0VSVCgoaXAtPmlfZC5kaV9tb2RlICYgU19JRk1UKSA9PSBTX0lGUkVHKTsKLQlBU1NFUlQoaW9lbmQtPmlvX3R5cGUgIT0gSU9fUkVBRCk7Ci0KIAlpZiAodW5saWtlbHkoaW9lbmQtPmlvX2Vycm9yKSkKIAkJcmV0dXJuIDA7CiAKQEAgLTI0NCwxMCArMjMyLDggQEAKIAkgKiBXZSBtaWdodCBoYXZlIHRvIHVwZGF0ZSB0aGUgb24tZGlzayBmaWxlIHNpemUgYWZ0ZXIgZXh0ZW5kaW5nCiAJICogd3JpdGVzLgogCSAqLwotCWlmIChpb2VuZC0+aW9fdHlwZSAhPSBJT19SRUFEKSB7Ci0JCWVycm9yID0geGZzX3NldGZpbGVzaXplKGlvZW5kKTsKLQkJQVNTRVJUKCFlcnJvciB8fCBlcnJvciA9PSBFQUdBSU4pOwotCX0KKwllcnJvciA9IHhmc19zZXRmaWxlc2l6ZShpb2VuZCk7CisJQVNTRVJUKCFlcnJvciB8fCBlcnJvciA9PSBFQUdBSU4pOwogCiAJLyoKIAkgKiBJZiB3ZSBkaWRuJ3QgY29tcGxldGUgcHJvY2Vzc2luZyBvZiB0aGUgaW9lbmQsIHJlcXVldWUgaXQgdG8gdGhlCkBAIC0zMTgsMTQgKzMwNCw2MyBAQAogeGZzX21hcF9ibG9ja3MoCiAJc3RydWN0IGlub2RlCQkqaW5vZGUsCiAJbG9mZl90CQkJb2Zmc2V0LAotCXNzaXplX3QJCQljb3VudCwKIAlzdHJ1Y3QgeGZzX2JtYnRfaXJlYwkqaW1hcCwKLQlpbnQJCQlmbGFncykKKwlpbnQJCQl0eXBlLAorCWludAkJCW5vbmJsb2NraW5nKQogewotCWludAkJCW5tYXBzID0gMTsKLQlpbnQJCQluZXcgPSAwOworCXN0cnVjdCB4ZnNfaW5vZGUJKmlwID0gWEZTX0koaW5vZGUpOworCXN0cnVjdCB4ZnNfbW91bnQJKm1wID0gaXAtPmlfbW91bnQ7CisJc3NpemVfdAkJCWNvdW50ID0gMSA8PCBpbm9kZS0+aV9ibGtiaXRzOworCXhmc19maWxlb2ZmX3QJCW9mZnNldF9mc2IsIGVuZF9mc2I7CisJaW50CQkJZXJyb3IgPSAwOworCWludAkJCWJtYXBpX2ZsYWdzID0gWEZTX0JNQVBJX0VOVElSRTsKKwlpbnQJCQluaW1hcHMgPSAxOwogCi0JcmV0dXJuIC14ZnNfaW9tYXAoWEZTX0koaW5vZGUpLCBvZmZzZXQsIGNvdW50LCBmbGFncywgaW1hcCwgJm5tYXBzLCAmbmV3KTsKKwlpZiAoWEZTX0ZPUkNFRF9TSFVURE9XTihtcCkpCisJCXJldHVybiAtWEZTX0VSUk9SKEVJTyk7CisKKwlpZiAodHlwZSA9PSBJT19VTldSSVRURU4pCisJCWJtYXBpX2ZsYWdzIHw9IFhGU19CTUFQSV9JR1NUQVRFOworCisJaWYgKCF4ZnNfaWxvY2tfbm93YWl0KGlwLCBYRlNfSUxPQ0tfU0hBUkVEKSkgeworCQlpZiAobm9uYmxvY2tpbmcpCisJCQlyZXR1cm4gLVhGU19FUlJPUihFQUdBSU4pOworCQl4ZnNfaWxvY2soaXAsIFhGU19JTE9DS19TSEFSRUQpOworCX0KKworCUFTU0VSVChpcC0+aV9kLmRpX2Zvcm1hdCAhPSBYRlNfRElOT0RFX0ZNVF9CVFJFRSB8fAorCSAgICAgICAoaXAtPmlfZGYuaWZfZmxhZ3MgJiBYRlNfSUZFWFRFTlRTKSk7CisJQVNTRVJUKG9mZnNldCA8PSBtcC0+bV9tYXhpb2Zmc2V0KTsKKworCWlmIChvZmZzZXQgKyBjb3VudCA+IG1wLT5tX21heGlvZmZzZXQpCisJCWNvdW50ID0gbXAtPm1fbWF4aW9mZnNldCAtIG9mZnNldDsKKwllbmRfZnNiID0gWEZTX0JfVE9fRlNCKG1wLCAoeGZzX3Vmc2l6ZV90KW9mZnNldCArIGNvdW50KTsKKwlvZmZzZXRfZnNiID0gWEZTX0JfVE9fRlNCVChtcCwgb2Zmc2V0KTsKKwllcnJvciA9IHhmc19ibWFwaShOVUxMLCBpcCwgb2Zmc2V0X2ZzYiwgZW5kX2ZzYiAtIG9mZnNldF9mc2IsCisJCQkgIGJtYXBpX2ZsYWdzLCAgTlVMTCwgMCwgaW1hcCwgJm5pbWFwcywgTlVMTCk7CisJeGZzX2l1bmxvY2soaXAsIFhGU19JTE9DS19TSEFSRUQpOworCisJaWYgKGVycm9yKQorCQlyZXR1cm4gLVhGU19FUlJPUihlcnJvcik7CisKKwlpZiAodHlwZSA9PSBJT19ERUxBTExPQyAmJgorCSAgICAoIW5pbWFwcyB8fCBpc251bGxzdGFydGJsb2NrKGltYXAtPmJyX3N0YXJ0YmxvY2spKSkgeworCQllcnJvciA9IHhmc19pb21hcF93cml0ZV9hbGxvY2F0ZShpcCwgb2Zmc2V0LCBjb3VudCwgaW1hcCk7CisJCWlmICghZXJyb3IpCisJCQl0cmFjZV94ZnNfbWFwX2Jsb2Nrc19hbGxvYyhpcCwgb2Zmc2V0LCBjb3VudCwgdHlwZSwgaW1hcCk7CisJCXJldHVybiAtWEZTX0VSUk9SKGVycm9yKTsKKwl9CisKKyNpZmRlZiBERUJVRworCWlmICh0eXBlID09IElPX1VOV1JJVFRFTikgeworCQlBU1NFUlQobmltYXBzKTsKKwkJQVNTRVJUKGltYXAtPmJyX3N0YXJ0YmxvY2sgIT0gSE9MRVNUQVJUQkxPQ0spOworCQlBU1NFUlQoaW1hcC0+YnJfc3RhcnRibG9jayAhPSBERUxBWVNUQVJUQkxPQ0spOworCX0KKyNlbmRpZgorCWlmIChuaW1hcHMpCisJCXRyYWNlX3hmc19tYXBfYmxvY2tzX2ZvdW5kKGlwLCBvZmZzZXQsIGNvdW50LCB0eXBlLCBpbWFwKTsKKwlyZXR1cm4gMDsKIH0KIAogU1RBVElDIGludApAQCAtMzgwLDI2ICs0MTUsMTggQEAKIAogCXN1Ym1pdF9iaW8od2JjLT5zeW5jX21vZGUgPT0gV0JfU1lOQ19BTEwgPwogCQkgICBXUklURV9TWU5DX1BMVUcgOiBXUklURSwgYmlvKTsKLQlBU1NFUlQoIWJpb19mbGFnZ2VkKGJpbywgQklPX0VPUE5PVFNVUFApKTsKLQliaW9fcHV0KGJpbyk7CiB9CiAKIFNUQVRJQyBzdHJ1Y3QgYmlvICoKIHhmc19hbGxvY19pb2VuZF9iaW8oCiAJc3RydWN0IGJ1ZmZlcl9oZWFkCSpiaCkKIHsKLQlzdHJ1Y3QgYmlvCQkqYmlvOwogCWludAkJCW52ZWNzID0gYmlvX2dldF9ucl92ZWNzKGJoLT5iX2JkZXYpOwotCi0JZG8gewotCQliaW8gPSBiaW9fYWxsb2MoR0ZQX05PSU8sIG52ZWNzKTsKLQkJbnZlY3MgPj49IDE7Ci0JfSB3aGlsZSAoIWJpbyk7CisJc3RydWN0IGJpbwkJKmJpbyA9IGJpb19hbGxvYyhHRlBfTk9JTywgbnZlY3MpOwogCiAJQVNTRVJUKGJpby0+YmlfcHJpdmF0ZSA9PSBOVUxMKTsKIAliaW8tPmJpX3NlY3RvciA9IGJoLT5iX2Jsb2NrbnIgKiAoYmgtPmJfc2l6ZSA+PiA5KTsKIAliaW8tPmJpX2JkZXYgPSBiaC0+Yl9iZGV2OwotCWJpb19nZXQoYmlvKTsKIAlyZXR1cm4gYmlvOwogfQogCkBAIC00NzAsOSArNDk3LDggQEAKIAkvKiBQYXNzIDEgLSBzdGFydCB3cml0ZWJhY2sgKi8KIAlkbyB7CiAJCW5leHQgPSBpb2VuZC0+aW9fbGlzdDsKLQkJZm9yIChiaCA9IGlvZW5kLT5pb19idWZmZXJfaGVhZDsgYmg7IGJoID0gYmgtPmJfcHJpdmF0ZSkgeworCQlmb3IgKGJoID0gaW9lbmQtPmlvX2J1ZmZlcl9oZWFkOyBiaDsgYmggPSBiaC0+Yl9wcml2YXRlKQogCQkJeGZzX3N0YXJ0X2J1ZmZlcl93cml0ZWJhY2soYmgpOwotCQl9CiAJfSB3aGlsZSAoKGlvZW5kID0gbmV4dCkgIT0gTlVMTCk7CiAKIAkvKiBQYXNzIDIgLSBzdWJtaXQgSS9PICovCkBAIC02MDAsMTE3ICs2MjYsMTMgQEAKIAlBU1NFUlQoaW1hcC0+YnJfc3RhcnRibG9jayAhPSBIT0xFU1RBUlRCTE9DSyk7CiAJQVNTRVJUKGltYXAtPmJyX3N0YXJ0YmxvY2sgIT0gREVMQVlTVEFSVEJMT0NLKTsKIAotCWxvY2tfYnVmZmVyKGJoKTsKIAl4ZnNfbWFwX2J1ZmZlcihpbm9kZSwgYmgsIGltYXAsIG9mZnNldCk7Ci0JYmgtPmJfYmRldiA9IHhmc19maW5kX2JkZXZfZm9yX2lub2RlKGlub2RlKTsKIAlzZXRfYnVmZmVyX21hcHBlZChiaCk7CiAJY2xlYXJfYnVmZmVyX2RlbGF5KGJoKTsKIAljbGVhcl9idWZmZXJfdW53cml0dGVuKGJoKTsKIH0KIAogLyoKLSAqIExvb2sgZm9yIGEgcGFnZSBhdCBpbmRleCB0aGF0IGlzIHN1aXRhYmxlIGZvciBjbHVzdGVyaW5nLgotICovCi1TVEFUSUMgdW5zaWduZWQgaW50Ci14ZnNfcHJvYmVfcGFnZSgKLQlzdHJ1Y3QgcGFnZQkJKnBhZ2UsCi0JdW5zaWduZWQgaW50CQlwZ19vZmZzZXQpCi17Ci0Jc3RydWN0IGJ1ZmZlcl9oZWFkCSpiaCwgKmhlYWQ7Ci0JaW50CQkJcmV0ID0gMDsKLQotCWlmIChQYWdlV3JpdGViYWNrKHBhZ2UpKQotCQlyZXR1cm4gMDsKLQlpZiAoIVBhZ2VEaXJ0eShwYWdlKSkKLQkJcmV0dXJuIDA7Ci0JaWYgKCFwYWdlLT5tYXBwaW5nKQotCQlyZXR1cm4gMDsKLQlpZiAoIXBhZ2VfaGFzX2J1ZmZlcnMocGFnZSkpCi0JCXJldHVybiAwOwotCi0JYmggPSBoZWFkID0gcGFnZV9idWZmZXJzKHBhZ2UpOwotCWRvIHsKLQkJaWYgKCFidWZmZXJfdXB0b2RhdGUoYmgpKQotCQkJYnJlYWs7Ci0JCWlmICghYnVmZmVyX21hcHBlZChiaCkpCi0JCQlicmVhazsKLQkJcmV0ICs9IGJoLT5iX3NpemU7Ci0JCWlmIChyZXQgPj0gcGdfb2Zmc2V0KQotCQkJYnJlYWs7Ci0JfSB3aGlsZSAoKGJoID0gYmgtPmJfdGhpc19wYWdlKSAhPSBoZWFkKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLVNUQVRJQyBzaXplX3QKLXhmc19wcm9iZV9jbHVzdGVyKAotCXN0cnVjdCBpbm9kZQkJKmlub2RlLAotCXN0cnVjdCBwYWdlCQkqc3RhcnRwYWdlLAotCXN0cnVjdCBidWZmZXJfaGVhZAkqYmgsCi0Jc3RydWN0IGJ1ZmZlcl9oZWFkCSpoZWFkKQotewotCXN0cnVjdCBwYWdldmVjCQlwdmVjOwotCXBnb2ZmX3QJCQl0aW5kZXgsIHRsYXN0LCB0bG9mZjsKLQlzaXplX3QJCQl0b3RhbCA9IDA7Ci0JaW50CQkJZG9uZSA9IDAsIGk7Ci0KLQkvKiBGaXJzdCBzdW0gZm9yd2FyZHMgaW4gdGhpcyBwYWdlICovCi0JZG8gewotCQlpZiAoIWJ1ZmZlcl91cHRvZGF0ZShiaCkgfHwgIWJ1ZmZlcl9tYXBwZWQoYmgpKQotCQkJcmV0dXJuIHRvdGFsOwotCQl0b3RhbCArPSBiaC0+Yl9zaXplOwotCX0gd2hpbGUgKChiaCA9IGJoLT5iX3RoaXNfcGFnZSkgIT0gaGVhZCk7Ci0KLQkvKiBpZiB3ZSByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIHBhZ2UsIHN1bSBmb3J3YXJkcyBpbiBmb2xsb3dpbmcgcGFnZXMgKi8KLQl0bGFzdCA9IGlfc2l6ZV9yZWFkKGlub2RlKSA+PiBQQUdFX0NBQ0hFX1NISUZUOwotCXRpbmRleCA9IHN0YXJ0cGFnZS0+aW5kZXggKyAxOwotCi0JLyogUHJ1bmUgdGhpcyBiYWNrIHRvIGF2b2lkIHBhdGhvbG9naWNhbCBiZWhhdmlvciAqLwotCXRsb2ZmID0gbWluKHRsYXN0LCBzdGFydHBhZ2UtPmluZGV4ICsgNjQpOwotCi0JcGFnZXZlY19pbml0KCZwdmVjLCAwKTsKLQl3aGlsZSAoIWRvbmUgJiYgdGluZGV4IDw9IHRsb2ZmKSB7Ci0JCXVuc2lnbmVkIGxlbiA9IG1pbl90KHBnb2ZmX3QsIFBBR0VWRUNfU0laRSwgdGxhc3QgLSB0aW5kZXggKyAxKTsKLQotCQlpZiAoIXBhZ2V2ZWNfbG9va3VwKCZwdmVjLCBpbm9kZS0+aV9tYXBwaW5nLCB0aW5kZXgsIGxlbikpCi0JCQlicmVhazsKLQotCQlmb3IgKGkgPSAwOyBpIDwgcGFnZXZlY19jb3VudCgmcHZlYyk7IGkrKykgewotCQkJc3RydWN0IHBhZ2UgKnBhZ2UgPSBwdmVjLnBhZ2VzW2ldOwotCQkJc2l6ZV90IHBnX29mZnNldCwgcGdfbGVuID0gMDsKLQotCQkJaWYgKHRpbmRleCA9PSB0bGFzdCkgewotCQkJCXBnX29mZnNldCA9Ci0JCQkJICAgIGlfc2l6ZV9yZWFkKGlub2RlKSAmIChQQUdFX0NBQ0hFX1NJWkUgLSAxKTsKLQkJCQlpZiAoIXBnX29mZnNldCkgewotCQkJCQlkb25lID0gMTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfSBlbHNlCi0JCQkJcGdfb2Zmc2V0ID0gUEFHRV9DQUNIRV9TSVpFOwotCi0JCQlpZiAocGFnZS0+aW5kZXggPT0gdGluZGV4ICYmIHRyeWxvY2tfcGFnZShwYWdlKSkgewotCQkJCXBnX2xlbiA9IHhmc19wcm9iZV9wYWdlKHBhZ2UsIHBnX29mZnNldCk7Ci0JCQkJdW5sb2NrX3BhZ2UocGFnZSk7Ci0JCQl9Ci0KLQkJCWlmICghcGdfbGVuKSB7Ci0JCQkJZG9uZSA9IDE7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCXRvdGFsICs9IHBnX2xlbjsKLQkJCXRpbmRleCsrOwotCQl9Ci0KLQkJcGFnZXZlY19yZWxlYXNlKCZwdmVjKTsKLQkJY29uZF9yZXNjaGVkKCk7Ci0JfQotCi0JcmV0dXJuIHRvdGFsOwotfQotCi0vKgogICogVGVzdCBpZiBhIGdpdmVuIHBhZ2UgaXMgc3VpdGFibGUgZm9yIHdyaXRpbmcgYXMgcGFydCBvZiBhbiB1bndyaXR0ZW4KICAqIG9yIGRlbGF5ZWQgYWxsb2NhdGUgZXh0ZW50LgogICovCkBAIC03MzEsOSArNjUzLDkgQEAKIAkJCWlmIChidWZmZXJfdW53cml0dGVuKGJoKSkKIAkJCQlhY2NlcHRhYmxlID0gKHR5cGUgPT0gSU9fVU5XUklUVEVOKTsKIAkJCWVsc2UgaWYgKGJ1ZmZlcl9kZWxheShiaCkpCi0JCQkJYWNjZXB0YWJsZSA9ICh0eXBlID09IElPX0RFTEFZKTsKKwkJCQlhY2NlcHRhYmxlID0gKHR5cGUgPT0gSU9fREVMQUxMT0MpOwogCQkJZWxzZSBpZiAoYnVmZmVyX2RpcnR5KGJoKSAmJiBidWZmZXJfbWFwcGVkKGJoKSkKLQkJCQlhY2NlcHRhYmxlID0gKHR5cGUgPT0gSU9fTkVXKTsKKwkJCQlhY2NlcHRhYmxlID0gKHR5cGUgPT0gSU9fT1ZFUldSSVRFKTsKIAkJCWVsc2UKIAkJCQlicmVhazsKIAkJfSB3aGlsZSAoKGJoID0gYmgtPmJfdGhpc19wYWdlKSAhPSBoZWFkKTsKQEAgLTc1OCw4ICs2ODAsNyBAQAogCWxvZmZfdAkJCXRpbmRleCwKIAlzdHJ1Y3QgeGZzX2JtYnRfaXJlYwkqaW1hcCwKIAl4ZnNfaW9lbmRfdAkJKippb2VuZHAsCi0Jc3RydWN0IHdyaXRlYmFja19jb250cm9sICp3YmMsCi0JaW50CQkJYWxsX2JoKQorCXN0cnVjdCB3cml0ZWJhY2tfY29udHJvbCAqd2JjKQogewogCXN0cnVjdCBidWZmZXJfaGVhZAkqYmgsICpoZWFkOwogCXhmc19vZmZfdAkJZW5kX29mZnNldDsKQEAgLTgxNCwzNyArNzM1LDMwIEBACiAJCQljb250aW51ZTsKIAkJfQogCi0JCWlmIChidWZmZXJfdW53cml0dGVuKGJoKSB8fCBidWZmZXJfZGVsYXkoYmgpKSB7CisJCWlmIChidWZmZXJfdW53cml0dGVuKGJoKSB8fCBidWZmZXJfZGVsYXkoYmgpIHx8CisJCSAgICBidWZmZXJfbWFwcGVkKGJoKSkgewogCQkJaWYgKGJ1ZmZlcl91bndyaXR0ZW4oYmgpKQogCQkJCXR5cGUgPSBJT19VTldSSVRURU47CisJCQllbHNlIGlmIChidWZmZXJfZGVsYXkoYmgpKQorCQkJCXR5cGUgPSBJT19ERUxBTExPQzsKIAkJCWVsc2UKLQkJCQl0eXBlID0gSU9fREVMQVk7CisJCQkJdHlwZSA9IElPX09WRVJXUklURTsKIAogCQkJaWYgKCF4ZnNfaW1hcF92YWxpZChpbm9kZSwgaW1hcCwgb2Zmc2V0KSkgewogCQkJCWRvbmUgPSAxOwogCQkJCWNvbnRpbnVlOwogCQkJfQogCi0JCQlBU1NFUlQoaW1hcC0+YnJfc3RhcnRibG9jayAhPSBIT0xFU1RBUlRCTE9DSyk7Ci0JCQlBU1NFUlQoaW1hcC0+YnJfc3RhcnRibG9jayAhPSBERUxBWVNUQVJUQkxPQ0spOwotCi0JCQl4ZnNfbWFwX2F0X29mZnNldChpbm9kZSwgYmgsIGltYXAsIG9mZnNldCk7CisJCQlsb2NrX2J1ZmZlcihiaCk7CisJCQlpZiAodHlwZSAhPSBJT19PVkVSV1JJVEUpCisJCQkJeGZzX21hcF9hdF9vZmZzZXQoaW5vZGUsIGJoLCBpbWFwLCBvZmZzZXQpOwogCQkJeGZzX2FkZF90b19pb2VuZChpbm9kZSwgYmgsIG9mZnNldCwgdHlwZSwKIAkJCQkJIGlvZW5kcCwgZG9uZSk7CiAKIAkJCXBhZ2VfZGlydHktLTsKIAkJCWNvdW50Kys7CiAJCX0gZWxzZSB7Ci0JCQl0eXBlID0gSU9fTkVXOwotCQkJaWYgKGJ1ZmZlcl9tYXBwZWQoYmgpICYmIGFsbF9iaCkgewotCQkJCWxvY2tfYnVmZmVyKGJoKTsKLQkJCQl4ZnNfYWRkX3RvX2lvZW5kKGlub2RlLCBiaCwgb2Zmc2V0LAotCQkJCQkJdHlwZSwgaW9lbmRwLCBkb25lKTsKLQkJCQljb3VudCsrOwotCQkJCXBhZ2VfZGlydHktLTsKLQkJCX0gZWxzZSB7Ci0JCQkJZG9uZSA9IDE7Ci0JCQl9CisJCQlkb25lID0gMTsKIAkJfQogCX0gd2hpbGUgKG9mZnNldCArPSBsZW4sIChiaCA9IGJoLT5iX3RoaXNfcGFnZSkgIT0gaGVhZCk7CiAKQEAgLTg3Niw3ICs3OTAsNiBAQAogCXN0cnVjdCB4ZnNfYm1idF9pcmVjCSppbWFwLAogCXhmc19pb2VuZF90CQkqKmlvZW5kcCwKIAlzdHJ1Y3Qgd3JpdGViYWNrX2NvbnRyb2wgKndiYywKLQlpbnQJCQlhbGxfYmgsCiAJcGdvZmZfdAkJCXRsYXN0KQogewogCXN0cnVjdCBwYWdldmVjCQlwdmVjOwpAQCAtODkxLDcgKzgwNCw3IEBACiAKIAkJZm9yIChpID0gMDsgaSA8IHBhZ2V2ZWNfY291bnQoJnB2ZWMpOyBpKyspIHsKIAkJCWRvbmUgPSB4ZnNfY29udmVydF9wYWdlKGlub2RlLCBwdmVjLnBhZ2VzW2ldLCB0aW5kZXgrKywKLQkJCQkJaW1hcCwgaW9lbmRwLCB3YmMsIGFsbF9iaCk7CisJCQkJCWltYXAsIGlvZW5kcCwgd2JjKTsKIAkJCWlmIChkb25lKQogCQkJCWJyZWFrOwogCQl9CkBAIC05MzUsNyArODQ4LDcgQEAKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQJKmJoLCAqaGVhZDsKIAlsb2ZmX3QJCQlvZmZzZXQgPSBwYWdlX29mZnNldChwYWdlKTsKIAotCWlmICgheGZzX2lzX2RlbGF5ZWRfcGFnZShwYWdlLCBJT19ERUxBWSkpCisJaWYgKCF4ZnNfaXNfZGVsYXllZF9wYWdlKHBhZ2UsIElPX0RFTEFMTE9DKSkKIAkJZ290byBvdXRfaW52YWxpZGF0ZTsKIAogCWlmIChYRlNfRk9SQ0VEX1NIVVRET1dOKGlwLT5pX21vdW50KSkKQEAgLTEwMDIsMTAgKzkxNSwxMCBAQAogCXVuc2lnbmVkIGludAkJdHlwZTsKIAlfX3VpbnQ2NF90ICAgICAgICAgICAgICBlbmRfb2Zmc2V0OwogCXBnb2ZmX3QgICAgICAgICAgICAgICAgIGVuZF9pbmRleCwgbGFzdF9pbmRleDsKLQlzc2l6ZV90CQkJc2l6ZSwgbGVuOwotCWludAkJCWZsYWdzLCBlcnIsIGltYXBfdmFsaWQgPSAwLCB1cHRvZGF0ZSA9IDE7CisJc3NpemVfdAkJCWxlbjsKKwlpbnQJCQllcnIsIGltYXBfdmFsaWQgPSAwLCB1cHRvZGF0ZSA9IDE7CiAJaW50CQkJY291bnQgPSAwOwotCWludAkJCWFsbF9iaCA9IDA7CisJaW50CQkJbm9uYmxvY2tpbmcgPSAwOwogCiAJdHJhY2VfeGZzX3dyaXRlcGFnZShpbm9kZSwgcGFnZSwgMCk7CiAKQEAgLTEwNTYsMTAgKzk2OSwxNCBAQAogCiAJYmggPSBoZWFkID0gcGFnZV9idWZmZXJzKHBhZ2UpOwogCW9mZnNldCA9IHBhZ2Vfb2Zmc2V0KHBhZ2UpOwotCWZsYWdzID0gQk1BUElfUkVBRDsKLQl0eXBlID0gSU9fTkVXOworCXR5cGUgPSBJT19PVkVSV1JJVEU7CisKKwlpZiAod2JjLT5zeW5jX21vZGUgPT0gV0JfU1lOQ19OT05FICYmIHdiYy0+bm9uYmxvY2tpbmcpCisJCW5vbmJsb2NraW5nID0gMTsKIAogCWRvIHsKKwkJaW50IG5ld19pb2VuZCA9IDA7CisKIAkJaWYgKG9mZnNldCA+PSBlbmRfb2Zmc2V0KQogCQkJYnJlYWs7CiAJCWlmICghYnVmZmVyX3VwdG9kYXRlKGJoKSkKQEAgLTEwNzYsOTAgKzk5Myw1NCBAQAogCQkJY29udGludWU7CiAJCX0KIAotCQlpZiAoaW1hcF92YWxpZCkKLQkJCWltYXBfdmFsaWQgPSB4ZnNfaW1hcF92YWxpZChpbm9kZSwgJmltYXAsIG9mZnNldCk7Ci0KLQkJaWYgKGJ1ZmZlcl91bndyaXR0ZW4oYmgpIHx8IGJ1ZmZlcl9kZWxheShiaCkpIHsKLQkJCWludCBuZXdfaW9lbmQgPSAwOwotCi0JCQkvKgotCQkJICogTWFrZSBzdXJlIHdlIGRvbid0IHVzZSBhIHJlYWQtb25seSBpb21hcAotCQkJICovCi0JCQlpZiAoZmxhZ3MgPT0gQk1BUElfUkVBRCkKLQkJCQlpbWFwX3ZhbGlkID0gMDsKLQotCQkJaWYgKGJ1ZmZlcl91bndyaXR0ZW4oYmgpKSB7CisJCWlmIChidWZmZXJfdW53cml0dGVuKGJoKSkgeworCQkJaWYgKHR5cGUgIT0gSU9fVU5XUklUVEVOKSB7CiAJCQkJdHlwZSA9IElPX1VOV1JJVFRFTjsKLQkJCQlmbGFncyA9IEJNQVBJX1dSSVRFIHwgQk1BUElfSUdOU1RBVEU7Ci0JCQl9IGVsc2UgaWYgKGJ1ZmZlcl9kZWxheShiaCkpIHsKLQkJCQl0eXBlID0gSU9fREVMQVk7Ci0JCQkJZmxhZ3MgPSBCTUFQSV9BTExPQ0FURTsKLQotCQkJCWlmICh3YmMtPnN5bmNfbW9kZSA9PSBXQl9TWU5DX05PTkUpCi0JCQkJCWZsYWdzIHw9IEJNQVBJX1RSWUxPQ0s7CisJCQkJaW1hcF92YWxpZCA9IDA7CiAJCQl9Ci0KLQkJCWlmICghaW1hcF92YWxpZCkgewotCQkJCS8qCi0JCQkJICogSWYgd2UgZGlkbid0IGhhdmUgYSB2YWxpZCBtYXBwaW5nIHRoZW4gd2UKLQkJCQkgKiBuZWVkIHRvIGVuc3VyZSB0aGF0IHdlIHB1dCB0aGUgbmV3IG1hcHBpbmcKLQkJCQkgKiBpbiBhIG5ldyBpb2VuZCBzdHJ1Y3R1cmUuIFRoaXMgbmVlZHMgdG8gYmUKLQkJCQkgKiBkb25lIHRvIGVuc3VyZSB0aGF0IHRoZSBpb2VuZHMgY29ycmVjdGx5Ci0JCQkJICogcmVmbGVjdCB0aGUgYmxvY2sgbWFwcGluZ3MgYXQgaW8gY29tcGxldGlvbgotCQkJCSAqIGZvciB1bndyaXR0ZW4gZXh0ZW50IGNvbnZlcnNpb24uCi0JCQkJICovCi0JCQkJbmV3X2lvZW5kID0gMTsKLQkJCQllcnIgPSB4ZnNfbWFwX2Jsb2Nrcyhpbm9kZSwgb2Zmc2V0LCBsZW4sCi0JCQkJCQkmaW1hcCwgZmxhZ3MpOwotCQkJCWlmIChlcnIpCi0JCQkJCWdvdG8gZXJyb3I7Ci0JCQkJaW1hcF92YWxpZCA9IHhmc19pbWFwX3ZhbGlkKGlub2RlLCAmaW1hcCwKLQkJCQkJCQkgICAgb2Zmc2V0KTsKLQkJCX0KLQkJCWlmIChpbWFwX3ZhbGlkKSB7Ci0JCQkJeGZzX21hcF9hdF9vZmZzZXQoaW5vZGUsIGJoLCAmaW1hcCwgb2Zmc2V0KTsKLQkJCQl4ZnNfYWRkX3RvX2lvZW5kKGlub2RlLCBiaCwgb2Zmc2V0LCB0eXBlLAotCQkJCQkJICZpb2VuZCwgbmV3X2lvZW5kKTsKLQkJCQljb3VudCsrOworCQl9IGVsc2UgaWYgKGJ1ZmZlcl9kZWxheShiaCkpIHsKKwkJCWlmICh0eXBlICE9IElPX0RFTEFMTE9DKSB7CisJCQkJdHlwZSA9IElPX0RFTEFMTE9DOworCQkJCWltYXBfdmFsaWQgPSAwOwogCQkJfQogCQl9IGVsc2UgaWYgKGJ1ZmZlcl91cHRvZGF0ZShiaCkpIHsKLQkJCS8qCi0JCQkgKiB3ZSBnb3QgaGVyZSBiZWNhdXNlIHRoZSBidWZmZXIgaXMgYWxyZWFkeSBtYXBwZWQuCi0JCQkgKiBUaGF0IG1lYW5zIGl0IG11c3QgYWxyZWFkeSBoYXZlIGV4dGVudHMgYWxsb2NhdGVkCi0JCQkgKiB1bmRlcm5lYXRoIGl0LiBNYXAgdGhlIGV4dGVudCBieSByZWFkaW5nIGl0LgotCQkJICovCi0JCQlpZiAoIWltYXBfdmFsaWQgfHwgZmxhZ3MgIT0gQk1BUElfUkVBRCkgewotCQkJCWZsYWdzID0gQk1BUElfUkVBRDsKLQkJCQlzaXplID0geGZzX3Byb2JlX2NsdXN0ZXIoaW5vZGUsIHBhZ2UsIGJoLCBoZWFkKTsKLQkJCQllcnIgPSB4ZnNfbWFwX2Jsb2Nrcyhpbm9kZSwgb2Zmc2V0LCBzaXplLAotCQkJCQkJJmltYXAsIGZsYWdzKTsKLQkJCQlpZiAoZXJyKQotCQkJCQlnb3RvIGVycm9yOwotCQkJCWltYXBfdmFsaWQgPSB4ZnNfaW1hcF92YWxpZChpbm9kZSwgJmltYXAsCi0JCQkJCQkJICAgIG9mZnNldCk7Ci0JCQl9Ci0KLQkJCS8qCi0JCQkgKiBXZSBzZXQgdGhlIHR5cGUgdG8gSU9fTkVXIGluIGNhc2Ugd2UgYXJlIGRvaW5nIGEKLQkJCSAqIHNtYWxsIHdyaXRlIGF0IEVPRiB0aGF0IGlzIGV4dGVuZGluZyB0aGUgZmlsZSBidXQKLQkJCSAqIHdpdGhvdXQgbmVlZGluZyBhbiBhbGxvY2F0aW9uLiBXZSBuZWVkIHRvIHVwZGF0ZSB0aGUKLQkJCSAqIGZpbGUgc2l6ZSBvbiBJL08gY29tcGxldGlvbiBpbiB0aGlzIGNhc2Ugc28gaXQgaXMKLQkJCSAqIHRoZSBzYW1lIGNhc2UgYXMgaGF2aW5nIGp1c3QgYWxsb2NhdGVkIGEgbmV3IGV4dGVudAotCQkJICogdGhhdCB3ZSBhcmUgd3JpdGluZyBpbnRvIGZvciB0aGUgZmlyc3QgdGltZS4KLQkJCSAqLwotCQkJdHlwZSA9IElPX05FVzsKLQkJCWlmICh0cnlsb2NrX2J1ZmZlcihiaCkpIHsKLQkJCQlpZiAoaW1hcF92YWxpZCkKLQkJCQkJYWxsX2JoID0gMTsKLQkJCQl4ZnNfYWRkX3RvX2lvZW5kKGlub2RlLCBiaCwgb2Zmc2V0LCB0eXBlLAotCQkJCQkJJmlvZW5kLCAhaW1hcF92YWxpZCk7Ci0JCQkJY291bnQrKzsKLQkJCX0gZWxzZSB7CisJCQlpZiAodHlwZSAhPSBJT19PVkVSV1JJVEUpIHsKKwkJCQl0eXBlID0gSU9fT1ZFUldSSVRFOwogCQkJCWltYXBfdmFsaWQgPSAwOwogCQkJfQotCQl9IGVsc2UgaWYgKFBhZ2VVcHRvZGF0ZShwYWdlKSkgewotCQkJQVNTRVJUKGJ1ZmZlcl9tYXBwZWQoYmgpKTsKLQkJCWltYXBfdmFsaWQgPSAwOworCQl9IGVsc2UgeworCQkJaWYgKFBhZ2VVcHRvZGF0ZShwYWdlKSkgeworCQkJCUFTU0VSVChidWZmZXJfbWFwcGVkKGJoKSk7CisJCQkJaW1hcF92YWxpZCA9IDA7CisJCQl9CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmIChpbWFwX3ZhbGlkKQorCQkJaW1hcF92YWxpZCA9IHhmc19pbWFwX3ZhbGlkKGlub2RlLCAmaW1hcCwgb2Zmc2V0KTsKKwkJaWYgKCFpbWFwX3ZhbGlkKSB7CisJCQkvKgorCQkJICogSWYgd2UgZGlkbid0IGhhdmUgYSB2YWxpZCBtYXBwaW5nIHRoZW4gd2UgbmVlZCB0bworCQkJICogcHV0IHRoZSBuZXcgbWFwcGluZyBpbnRvIGEgc2VwYXJhdGUgaW9lbmQgc3RydWN0dXJlLgorCQkJICogVGhpcyBlbnN1cmVzIG5vbi1jb250aWd1b3VzIGV4dGVudHMgYWx3YXlzIGhhdmUKKwkJCSAqIHNlcGFyYXRlIGlvZW5kcywgd2hpY2ggaXMgcGFydGljdWxhcmx5IGltcG9ydGFudAorCQkJICogZm9yIHVud3JpdHRlbiBleHRlbnQgY29udmVyc2lvbiBhdCBJL08gY29tcGxldGlvbgorCQkJICogdGltZS4KKwkJCSAqLworCQkJbmV3X2lvZW5kID0gMTsKKwkJCWVyciA9IHhmc19tYXBfYmxvY2tzKGlub2RlLCBvZmZzZXQsICZpbWFwLCB0eXBlLAorCQkJCQkgICAgIG5vbmJsb2NraW5nKTsKKwkJCWlmIChlcnIpCisJCQkJZ290byBlcnJvcjsKKwkJCWltYXBfdmFsaWQgPSB4ZnNfaW1hcF92YWxpZChpbm9kZSwgJmltYXAsIG9mZnNldCk7CisJCX0KKwkJaWYgKGltYXBfdmFsaWQpIHsKKwkJCWxvY2tfYnVmZmVyKGJoKTsKKwkJCWlmICh0eXBlICE9IElPX09WRVJXUklURSkKKwkJCQl4ZnNfbWFwX2F0X29mZnNldChpbm9kZSwgYmgsICZpbWFwLCBvZmZzZXQpOworCQkJeGZzX2FkZF90b19pb2VuZChpbm9kZSwgYmgsIG9mZnNldCwgdHlwZSwgJmlvZW5kLAorCQkJCQkgbmV3X2lvZW5kKTsKKwkJCWNvdW50Kys7CiAJCX0KIAogCQlpZiAoIWlvaGVhZCkKQEAgLTExODgsNyArMTA2OSw3IEBACiAJCQllbmRfaW5kZXggPSBsYXN0X2luZGV4OwogCiAJCXhmc19jbHVzdGVyX3dyaXRlKGlub2RlLCBwYWdlLT5pbmRleCArIDEsICZpbWFwLCAmaW9lbmQsCi0JCQkJCXdiYywgYWxsX2JoLCBlbmRfaW5kZXgpOworCQkJCSAgd2JjLCBlbmRfaW5kZXgpOwogCX0KIAogCWlmIChpb2hlYWQpCkBAIC0xMjU3LDEzICsxMTM4LDE5IEBACiAJaW50CQkJY3JlYXRlLAogCWludAkJCWRpcmVjdCkKIHsKLQlpbnQJCQlmbGFncyA9IGNyZWF0ZSA/IEJNQVBJX1dSSVRFIDogQk1BUElfUkVBRDsKKwlzdHJ1Y3QgeGZzX2lub2RlCSppcCA9IFhGU19JKGlub2RlKTsKKwlzdHJ1Y3QgeGZzX21vdW50CSptcCA9IGlwLT5pX21vdW50OworCXhmc19maWxlb2ZmX3QJCW9mZnNldF9mc2IsIGVuZF9mc2I7CisJaW50CQkJZXJyb3IgPSAwOworCWludAkJCWxvY2ttb2RlID0gMDsKIAlzdHJ1Y3QgeGZzX2JtYnRfaXJlYwlpbWFwOworCWludAkJCW5pbWFwcyA9IDE7CiAJeGZzX29mZl90CQlvZmZzZXQ7CiAJc3NpemVfdAkJCXNpemU7Ci0JaW50CQkJbmltYXAgPSAxOwogCWludAkJCW5ldyA9IDA7Ci0JaW50CQkJZXJyb3I7CisKKwlpZiAoWEZTX0ZPUkNFRF9TSFVURE9XTihtcCkpCisJCXJldHVybiAtWEZTX0VSUk9SKEVJTyk7CiAKIAlvZmZzZXQgPSAoeGZzX29mZl90KWlibG9jayA8PCBpbm9kZS0+aV9ibGtiaXRzOwogCUFTU0VSVChiaF9yZXN1bHQtPmJfc2l6ZSA+PSAoMSA8PCBpbm9kZS0+aV9ibGtiaXRzKSk7CkBAIC0xMjcyLDE1ICsxMTU5LDQ1IEBACiAJaWYgKCFjcmVhdGUgJiYgZGlyZWN0ICYmIG9mZnNldCA+PSBpX3NpemVfcmVhZChpbm9kZSkpCiAJCXJldHVybiAwOwogCi0JaWYgKGRpcmVjdCAmJiBjcmVhdGUpCi0JCWZsYWdzIHw9IEJNQVBJX0RJUkVDVDsKKwlpZiAoY3JlYXRlKSB7CisJCWxvY2ttb2RlID0gWEZTX0lMT0NLX0VYQ0w7CisJCXhmc19pbG9jayhpcCwgbG9ja21vZGUpOworCX0gZWxzZSB7CisJCWxvY2ttb2RlID0geGZzX2lsb2NrX21hcF9zaGFyZWQoaXApOworCX0KIAotCWVycm9yID0geGZzX2lvbWFwKFhGU19JKGlub2RlKSwgb2Zmc2V0LCBzaXplLCBmbGFncywgJmltYXAsICZuaW1hcCwKLQkJCSAgJm5ldyk7CisJQVNTRVJUKG9mZnNldCA8PSBtcC0+bV9tYXhpb2Zmc2V0KTsKKwlpZiAob2Zmc2V0ICsgc2l6ZSA+IG1wLT5tX21heGlvZmZzZXQpCisJCXNpemUgPSBtcC0+bV9tYXhpb2Zmc2V0IC0gb2Zmc2V0OworCWVuZF9mc2IgPSBYRlNfQl9UT19GU0IobXAsICh4ZnNfdWZzaXplX3Qpb2Zmc2V0ICsgc2l6ZSk7CisJb2Zmc2V0X2ZzYiA9IFhGU19CX1RPX0ZTQlQobXAsIG9mZnNldCk7CisKKwllcnJvciA9IHhmc19ibWFwaShOVUxMLCBpcCwgb2Zmc2V0X2ZzYiwgZW5kX2ZzYiAtIG9mZnNldF9mc2IsCisJCQkgIFhGU19CTUFQSV9FTlRJUkUsICBOVUxMLCAwLCAmaW1hcCwgJm5pbWFwcywgTlVMTCk7CiAJaWYgKGVycm9yKQotCQlyZXR1cm4gLWVycm9yOwotCWlmIChuaW1hcCA9PSAwKQotCQlyZXR1cm4gMDsKKwkJZ290byBvdXRfdW5sb2NrOworCisJaWYgKGNyZWF0ZSAmJgorCSAgICAoIW5pbWFwcyB8fAorCSAgICAgKGltYXAuYnJfc3RhcnRibG9jayA9PSBIT0xFU1RBUlRCTE9DSyB8fAorCSAgICAgIGltYXAuYnJfc3RhcnRibG9jayA9PSBERUxBWVNUQVJUQkxPQ0spKSkgeworCQlpZiAoZGlyZWN0KSB7CisJCQllcnJvciA9IHhmc19pb21hcF93cml0ZV9kaXJlY3QoaXAsIG9mZnNldCwgc2l6ZSwKKwkJCQkJCSAgICAgICAmaW1hcCwgbmltYXBzKTsKKwkJfSBlbHNlIHsKKwkJCWVycm9yID0geGZzX2lvbWFwX3dyaXRlX2RlbGF5KGlwLCBvZmZzZXQsIHNpemUsICZpbWFwKTsKKwkJfQorCQlpZiAoZXJyb3IpCisJCQlnb3RvIG91dF91bmxvY2s7CisKKwkJdHJhY2VfeGZzX2dldF9ibG9ja3NfYWxsb2MoaXAsIG9mZnNldCwgc2l6ZSwgMCwgJmltYXApOworCX0gZWxzZSBpZiAobmltYXBzKSB7CisJCXRyYWNlX3hmc19nZXRfYmxvY2tzX2ZvdW5kKGlwLCBvZmZzZXQsIHNpemUsIDAsICZpbWFwKTsKKwl9IGVsc2UgeworCQl0cmFjZV94ZnNfZ2V0X2Jsb2Nrc19ub3Rmb3VuZChpcCwgb2Zmc2V0LCBzaXplKTsKKwkJZ290byBvdXRfdW5sb2NrOworCX0KKwl4ZnNfaXVubG9jayhpcCwgbG9ja21vZGUpOwogCiAJaWYgKGltYXAuYnJfc3RhcnRibG9jayAhPSBIT0xFU1RBUlRCTE9DSyAmJgogCSAgICBpbWFwLmJyX3N0YXJ0YmxvY2sgIT0gREVMQVlTVEFSVEJMT0NLKSB7CkBAIC0xMzQ3LDYgKzEyNjQsMTAgQEAKIAl9CiAKIAlyZXR1cm4gMDsKKworb3V0X3VubG9jazoKKwl4ZnNfaXVubG9jayhpcCwgbG9ja21vZGUpOworCXJldHVybiAtZXJyb3I7CiB9CiAKIGludApAQCAtMTQzNCw3ICsxMzU1LDcgQEAKIAlzc2l6ZV90CQkJcmV0OwogCiAJaWYgKHJ3ICYgV1JJVEUpIHsKLQkJaW9jYi0+cHJpdmF0ZSA9IHhmc19hbGxvY19pb2VuZChpbm9kZSwgSU9fTkVXKTsKKwkJaW9jYi0+cHJpdmF0ZSA9IHhmc19hbGxvY19pb2VuZChpbm9kZSwgSU9fRElSRUNUKTsKIAogCQlyZXQgPSBfX2Jsb2NrZGV2X2RpcmVjdF9JTyhydywgaW9jYiwgaW5vZGUsIGJkZXYsIGlvdiwKIAkJCQkJICAgIG9mZnNldCwgbnJfc2VncywKZGlmZiAtLWdpdCBhL2ZzL3hmcy9saW51eC0yLjYveGZzX2FvcHMuaCBiL2ZzL3hmcy9saW51eC0yLjYveGZzX2FvcHMuaAppbmRleCBjNTA1N2ZiLi43MWY3MjFlIDEwMDY0NAotLS0gYS9mcy94ZnMvbGludXgtMi42L3hmc19hb3BzLmgKKysrIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfYW9wcy5oCkBAIC0yMyw2ICsyMywyMiBAQAogZXh0ZXJuIG1lbXBvb2xfdCAqeGZzX2lvZW5kX3Bvb2w7CiAKIC8qCisgKiBUeXBlcyBvZiBJL08gZm9yIGJtYXAgY2x1c3RlcmluZyBhbmQgSS9PIGNvbXBsZXRpb24gdHJhY2tpbmcuCisgKi8KK2VudW0geworCUlPX0RJUkVDVCA9IDAsCS8qIHNwZWNpYWwgY2FzZSBmb3IgZGlyZWN0IEkvTyBpb2VuZHMgKi8KKwlJT19ERUxBTExPQywJLyogbWFwcGluZyBjb3ZlcnMgZGVsYWxsb2MgcmVnaW9uICovCisJSU9fVU5XUklUVEVOLAkvKiBtYXBwaW5nIGNvdmVycyBhbGxvY2F0ZWQgYnV0IHVuaW5pdGlhbGl6ZWQgZGF0YSAqLworCUlPX09WRVJXUklURSwJLyogbWFwcGluZyBjb3ZlcnMgYWxyZWFkeSBhbGxvY2F0ZWQgZXh0ZW50ICovCit9OworCisjZGVmaW5lIFhGU19JT19UWVBFUyBcCisJeyAwLAkJCSIiIH0sIFwKKwl7IElPX0RFTEFMTE9DLAkJImRlbGFsbG9jIiB9LCBcCisJeyBJT19VTldSSVRURU4sCQkidW53cml0dGVuIiB9LCBcCisJeyBJT19PVkVSV1JJVEUsCQkib3ZlcndyaXRlIiB9CisKKy8qCiAgKiB4ZnNfaW9lbmQgc3RydWN0IG1hbmFnZXMgbGFyZ2UgZXh0ZW50IHdyaXRlcyBmb3IgWEZTLgogICogSXQgY2FuIG1hbmFnZSBzZXZlcmFsIG11bHRpLXBhZ2UgYmlvJ3MgYXQgb25jZS4KICAqLwpkaWZmIC0tZ2l0IGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfYnVmLmMgYi9mcy94ZnMvbGludXgtMi42L3hmc19idWYuYwppbmRleCA0YzVkZWI2Li45MmYxZjJhIDEwMDY0NAotLS0gYS9mcy94ZnMvbGludXgtMi42L3hmc19idWYuYworKysgYi9mcy94ZnMvbGludXgtMi42L3hmc19idWYuYwpAQCAtNDQsMTIgKzQ0LDcgQEAKIAogc3RhdGljIGttZW1fem9uZV90ICp4ZnNfYnVmX3pvbmU7CiBTVEFUSUMgaW50IHhmc2J1ZmQodm9pZCAqKTsKLVNUQVRJQyBpbnQgeGZzYnVmZF93YWtldXAoc3RydWN0IHNocmlua2VyICosIGludCwgZ2ZwX3QpOwogU1RBVElDIHZvaWQgeGZzX2J1Zl9kZWx3cmlfcXVldWUoeGZzX2J1Zl90ICosIGludCk7Ci1zdGF0aWMgc3RydWN0IHNocmlua2VyIHhmc19idWZfc2hha2UgPSB7Ci0JLnNocmluayA9IHhmc2J1ZmRfd2FrZXVwLAotCS5zZWVrcyA9IERFRkFVTFRfU0VFS1MsCi19OwogCiBzdGF0aWMgc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKnhmc2xvZ2Rfd29ya3F1ZXVlOwogc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKnhmc2RhdGFkX3dvcmtxdWV1ZTsKQEAgLTE2OCw4ICsxNjMsNzkgQEAKIH0KIAogLyoKLSAqCUludGVybmFsIHhmc19idWZfdCBvYmplY3QgbWFuaXB1bGF0aW9uCisgKiB4ZnNfYnVmX2xydV9hZGQgLSBhZGQgYSBidWZmZXIgdG8gdGhlIExSVS4KKyAqCisgKiBUaGUgTFJVIHRha2VzIGEgbmV3IHJlZmVyZW5jZSB0byB0aGUgYnVmZmVyIHNvIHRoYXQgaXQgd2lsbCBvbmx5IGJlIGZyZWVkCisgKiBvbmNlIHRoZSBzaHJpbmtlciB0YWtlcyB0aGUgYnVmZmVyIG9mZiB0aGUgTFJVLgogICovCitTVEFUSUMgdm9pZAoreGZzX2J1Zl9scnVfYWRkKAorCXN0cnVjdCB4ZnNfYnVmCSpicCkKK3sKKwlzdHJ1Y3QgeGZzX2J1ZnRhcmcgKmJ0cCA9IGJwLT5iX3RhcmdldDsKKworCXNwaW5fbG9jaygmYnRwLT5idF9scnVfbG9jayk7CisJaWYgKGxpc3RfZW1wdHkoJmJwLT5iX2xydSkpIHsKKwkJYXRvbWljX2luYygmYnAtPmJfaG9sZCk7CisJCWxpc3RfYWRkX3RhaWwoJmJwLT5iX2xydSwgJmJ0cC0+YnRfbHJ1KTsKKwkJYnRwLT5idF9scnVfbnIrKzsKKwl9CisJc3Bpbl91bmxvY2soJmJ0cC0+YnRfbHJ1X2xvY2spOworfQorCisvKgorICogeGZzX2J1Zl9scnVfZGVsIC0gcmVtb3ZlIGEgYnVmZmVyIGZyb20gdGhlIExSVQorICoKKyAqIFRoZSB1bmxvY2tlZCBjaGVjayBpcyBzYWZlIGhlcmUgYmVjYXVzZSBpdCBvbmx5IG9jY3VycyB3aGVuIHRoZXJlIGFyZSBub3QKKyAqIGJfbHJ1X3JlZiBjb3VudHMgbGVmdCBvbiB0aGUgaW5vZGUgdW5kZXIgdGhlIHBhZy0+cGFnX2J1Zl9sb2NrLiBpdCBpcyB0aGVyZQorICogdG8gb3B0aW1pc2UgdGhlIHNocmlua2VyIHJlbW92aW5nIHRoZSBidWZmZXIgZnJvbSB0aGUgTFJVIGFuZCBjYWxsaW5nCisgKiB4ZnNfYnVmX2ZyZWUoKS4gaS5lLiBpdCByZW1vdmVzIGFuIHVubmVjY2Vzc2FyeSByb3VuZCB0cmlwIG9uIHRoZQorICogYnRfbHJ1X2xvY2suCisgKi8KK1NUQVRJQyB2b2lkCit4ZnNfYnVmX2xydV9kZWwoCisJc3RydWN0IHhmc19idWYJKmJwKQoreworCXN0cnVjdCB4ZnNfYnVmdGFyZyAqYnRwID0gYnAtPmJfdGFyZ2V0OworCisJaWYgKGxpc3RfZW1wdHkoJmJwLT5iX2xydSkpCisJCXJldHVybjsKKworCXNwaW5fbG9jaygmYnRwLT5idF9scnVfbG9jayk7CisJaWYgKCFsaXN0X2VtcHR5KCZicC0+Yl9scnUpKSB7CisJCWxpc3RfZGVsX2luaXQoJmJwLT5iX2xydSk7CisJCWJ0cC0+YnRfbHJ1X25yLS07CisJfQorCXNwaW5fdW5sb2NrKCZidHAtPmJ0X2xydV9sb2NrKTsKK30KKworLyoKKyAqIFdoZW4gd2UgbWFyayBhIGJ1ZmZlciBzdGFsZSwgd2UgcmVtb3ZlIHRoZSBidWZmZXIgZnJvbSB0aGUgTFJVIGFuZCBjbGVhciB0aGUKKyAqIGJfbHJ1X3JlZiBjb3VudCBzbyB0aGF0IHRoZSBidWZmZXIgaXMgZnJlZWQgaW1tZWRpYXRlbHkgd2hlbiB0aGUgYnVmZmVyCisgKiByZWZlcmVuY2UgY291bnQgZmFsbHMgdG8gemVyby4gSWYgdGhlIGJ1ZmZlciBpcyBhbHJlYWR5IG9uIHRoZSBMUlUsIHdlIG5lZWQKKyAqIHRvIHJlbW92ZSB0aGUgcmVmZXJlbmNlIHRoYXQgTFJVIGhvbGRzIG9uIHRoZSBidWZmZXIuCisgKgorICogVGhpcyBwcmV2ZW50cyBidWlsZC11cCBvZiBzdGFsZSBidWZmZXJzIG9uIHRoZSBMUlUuCisgKi8KK3ZvaWQKK3hmc19idWZfc3RhbGUoCisJc3RydWN0IHhmc19idWYJKmJwKQoreworCWJwLT5iX2ZsYWdzIHw9IFhCRl9TVEFMRTsKKwlhdG9taWNfc2V0KCYoYnApLT5iX2xydV9yZWYsIDApOworCWlmICghbGlzdF9lbXB0eSgmYnAtPmJfbHJ1KSkgeworCQlzdHJ1Y3QgeGZzX2J1ZnRhcmcgKmJ0cCA9IGJwLT5iX3RhcmdldDsKKworCQlzcGluX2xvY2soJmJ0cC0+YnRfbHJ1X2xvY2spOworCQlpZiAoIWxpc3RfZW1wdHkoJmJwLT5iX2xydSkpIHsKKwkJCWxpc3RfZGVsX2luaXQoJmJwLT5iX2xydSk7CisJCQlidHAtPmJ0X2xydV9uci0tOworCQkJYXRvbWljX2RlYygmYnAtPmJfaG9sZCk7CisJCX0KKwkJc3Bpbl91bmxvY2soJmJ0cC0+YnRfbHJ1X2xvY2spOworCX0KKwlBU1NFUlQoYXRvbWljX3JlYWQoJmJwLT5iX2hvbGQpID49IDEpOworfQogCiBTVEFUSUMgdm9pZAogX3hmc19idWZfaW5pdGlhbGl6ZSgKQEAgLTE4Niw3ICsyNTIsOSBAQAogCiAJbWVtc2V0KGJwLCAwLCBzaXplb2YoeGZzX2J1Zl90KSk7CiAJYXRvbWljX3NldCgmYnAtPmJfaG9sZCwgMSk7CisJYXRvbWljX3NldCgmYnAtPmJfbHJ1X3JlZiwgMSk7CiAJaW5pdF9jb21wbGV0aW9uKCZicC0+Yl9pb3dhaXQpOworCUlOSVRfTElTVF9IRUFEKCZicC0+Yl9scnUpOwogCUlOSVRfTElTVF9IRUFEKCZicC0+Yl9saXN0KTsKIAlSQl9DTEVBUl9OT0RFKCZicC0+Yl9yYm5vZGUpOwogCXNlbWFfaW5pdCgmYnAtPmJfc2VtYSwgMCk7IC8qIGhlbGQsIG5vIHdhaXRlcnMgKi8KQEAgLTI2Miw2ICszMzAsOCBAQAogewogCXRyYWNlX3hmc19idWZfZnJlZShicCwgX1JFVF9JUF8pOwogCisJQVNTRVJUKGxpc3RfZW1wdHkoJmJwLT5iX2xydSkpOworCiAJaWYgKGJwLT5iX2ZsYWdzICYgKF9YQkZfUEFHRV9DQUNIRXxfWEJGX1BBR0VTKSkgewogCQl1aW50CQlpOwogCkBAIC0zMzcsNyArNDA3LDYgQEAKIAkJCQkJX19mdW5jX18sIGdmcF9tYXNrKTsKIAogCQkJWEZTX1NUQVRTX0lOQyh4Yl9wYWdlX3JldHJpZXMpOwotCQkJeGZzYnVmZF93YWtldXAoTlVMTCwgMCwgZ2ZwX21hc2spOwogCQkJY29uZ2VzdGlvbl93YWl0KEJMS19SV19BU1lOQywgSFovNTApOwogCQkJZ290byByZXRyeTsKIAkJfQpAQCAtODI4LDYgKzg5Nyw3IEBACiAKIAlpZiAoIXBhZykgewogCQlBU1NFUlQoIWJwLT5iX3JlbHNlKTsKKwkJQVNTRVJUKGxpc3RfZW1wdHkoJmJwLT5iX2xydSkpOwogCQlBU1NFUlQoUkJfRU1QVFlfTk9ERSgmYnAtPmJfcmJub2RlKSk7CiAJCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZicC0+Yl9ob2xkKSkKIAkJCXhmc19idWZfZnJlZShicCk7CkBAIC04MzUsMTMgKzkwNSwxOSBAQAogCX0KIAogCUFTU0VSVCghUkJfRU1QVFlfTk9ERSgmYnAtPmJfcmJub2RlKSk7CisKIAlBU1NFUlQoYXRvbWljX3JlYWQoJmJwLT5iX2hvbGQpID4gMCk7CiAJaWYgKGF0b21pY19kZWNfYW5kX2xvY2soJmJwLT5iX2hvbGQsICZwYWctPnBhZ19idWZfbG9jaykpIHsKIAkJaWYgKGJwLT5iX3JlbHNlKSB7CiAJCQlhdG9taWNfaW5jKCZicC0+Yl9ob2xkKTsKIAkJCXNwaW5fdW5sb2NrKCZwYWctPnBhZ19idWZfbG9jayk7CiAJCQlicC0+Yl9yZWxzZShicCk7CisJCX0gZWxzZSBpZiAoIShicC0+Yl9mbGFncyAmIFhCRl9TVEFMRSkgJiYKKwkJCSAgIGF0b21pY19yZWFkKCZicC0+Yl9scnVfcmVmKSkgeworCQkJeGZzX2J1Zl9scnVfYWRkKGJwKTsKKwkJCXNwaW5fdW5sb2NrKCZwYWctPnBhZ19idWZfbG9jayk7CiAJCX0gZWxzZSB7CisJCQl4ZnNfYnVmX2xydV9kZWwoYnApOwogCQkJQVNTRVJUKCEoYnAtPmJfZmxhZ3MgJiAoWEJGX0RFTFdSSXxfWEJGX0RFTFdSSV9RKSkpOwogCQkJcmJfZXJhc2UoJmJwLT5iX3Jibm9kZSwgJnBhZy0+cGFnX2J1Zl90cmVlKTsKIAkJCXNwaW5fdW5sb2NrKCZwYWctPnBhZ19idWZfbG9jayk7CkBAIC0xNDM4LDUxICsxNTE0LDg0IEBACiAgKi8KIAogLyoKLSAqCVdhaXQgZm9yIGFueSBidWZzIHdpdGggY2FsbGJhY2tzIHRoYXQgaGF2ZSBiZWVuIHN1Ym1pdHRlZCBidXQKLSAqCWhhdmUgbm90IHlldCByZXR1cm5lZC4uLiB3YWxrIHRoZSBoYXNoIGxpc3QgZm9yIHRoZSB0YXJnZXQuCisgKiBXYWl0IGZvciBhbnkgYnVmcyB3aXRoIGNhbGxiYWNrcyB0aGF0IGhhdmUgYmVlbiBzdWJtaXR0ZWQgYnV0IGhhdmUgbm90IHlldAorICogcmV0dXJuZWQuIFRoZXNlIGJ1ZmZlcnMgd2lsbCBoYXZlIGFuIGVsZXZhdGVkIGhvbGQgY291bnQsIHNvIHdhaXQgb24gdGhvc2UKKyAqIHdoaWxlIGZyZWVpbmcgYWxsIHRoZSBidWZmZXJzIG9ubHkgaGVsZCBieSB0aGUgTFJVLgogICovCiB2b2lkCiB4ZnNfd2FpdF9idWZ0YXJnKAogCXN0cnVjdCB4ZnNfYnVmdGFyZwkqYnRwKQogewotCXN0cnVjdCB4ZnNfcGVyYWcJKnBhZzsKLQl1aW50CQkJaTsKKwlzdHJ1Y3QgeGZzX2J1ZgkJKmJwOwogCi0JZm9yIChpID0gMDsgaSA8IGJ0cC0+YnRfbW91bnQtPm1fc2Iuc2JfYWdjb3VudDsgaSsrKSB7Ci0JCXBhZyA9IHhmc19wZXJhZ19nZXQoYnRwLT5idF9tb3VudCwgaSk7Ci0JCXNwaW5fbG9jaygmcGFnLT5wYWdfYnVmX2xvY2spOwotCQl3aGlsZSAocmJfZmlyc3QoJnBhZy0+cGFnX2J1Zl90cmVlKSkgewotCQkJc3Bpbl91bmxvY2soJnBhZy0+cGFnX2J1Zl9sb2NrKTsKK3Jlc3RhcnQ6CisJc3Bpbl9sb2NrKCZidHAtPmJ0X2xydV9sb2NrKTsKKwl3aGlsZSAoIWxpc3RfZW1wdHkoJmJ0cC0+YnRfbHJ1KSkgeworCQlicCA9IGxpc3RfZmlyc3RfZW50cnkoJmJ0cC0+YnRfbHJ1LCBzdHJ1Y3QgeGZzX2J1ZiwgYl9scnUpOworCQlpZiAoYXRvbWljX3JlYWQoJmJwLT5iX2hvbGQpID4gMSkgeworCQkJc3Bpbl91bmxvY2soJmJ0cC0+YnRfbHJ1X2xvY2spOwogCQkJZGVsYXkoMTAwKTsKLQkJCXNwaW5fbG9jaygmcGFnLT5wYWdfYnVmX2xvY2spOworCQkJZ290byByZXN0YXJ0OwogCQl9Ci0JCXNwaW5fdW5sb2NrKCZwYWctPnBhZ19idWZfbG9jayk7Ci0JCXhmc19wZXJhZ19wdXQocGFnKTsKKwkJLyoKKwkJICogY2xlYXIgdGhlIExSVSByZWZlcmVuY2UgY291bnQgc28gdGhlIGJ1ZmVyIGRvZXNuJ3QgZ2V0CisJCSAqIGlnbm9yZWQgaW4geGZzX2J1Zl9yZWxlKCkuCisJCSAqLworCQlhdG9taWNfc2V0KCZicC0+Yl9scnVfcmVmLCAwKTsKKwkJc3Bpbl91bmxvY2soJmJ0cC0+YnRfbHJ1X2xvY2spOworCQl4ZnNfYnVmX3JlbGUoYnApOworCQlzcGluX2xvY2soJmJ0cC0+YnRfbHJ1X2xvY2spOwogCX0KKwlzcGluX3VubG9jaygmYnRwLT5idF9scnVfbG9jayk7CiB9CiAKLS8qCi0gKglidWZ0YXJnIGxpc3QgZm9yIGRlbHdyaXRlIHF1ZXVlIHByb2Nlc3NpbmcKLSAqLwotc3RhdGljIExJU1RfSEVBRCh4ZnNfYnVmdGFyZ19saXN0KTsKLXN0YXRpYyBERUZJTkVfU1BJTkxPQ0soeGZzX2J1ZnRhcmdfbG9jayk7Ci0KLVNUQVRJQyB2b2lkCi14ZnNfcmVnaXN0ZXJfYnVmdGFyZygKLQl4ZnNfYnVmdGFyZ190ICAgICAgICAgICAqYnRwKQoraW50Cit4ZnNfYnVmdGFyZ19zaHJpbmsoCisJc3RydWN0IHNocmlua2VyCQkqc2hyaW5rLAorCWludAkJCW5yX3RvX3NjYW4sCisJZ2ZwX3QJCQltYXNrKQogewotCXNwaW5fbG9jaygmeGZzX2J1ZnRhcmdfbG9jayk7Ci0JbGlzdF9hZGQoJmJ0cC0+YnRfbGlzdCwgJnhmc19idWZ0YXJnX2xpc3QpOwotCXNwaW5fdW5sb2NrKCZ4ZnNfYnVmdGFyZ19sb2NrKTsKLX0KKwlzdHJ1Y3QgeGZzX2J1ZnRhcmcJKmJ0cCA9IGNvbnRhaW5lcl9vZihzaHJpbmssCisJCQkJCXN0cnVjdCB4ZnNfYnVmdGFyZywgYnRfc2hyaW5rZXIpOworCXN0cnVjdCB4ZnNfYnVmCQkqYnA7CisJTElTVF9IRUFEKGRpc3Bvc2UpOwogCi1TVEFUSUMgdm9pZAoteGZzX3VucmVnaXN0ZXJfYnVmdGFyZygKLQl4ZnNfYnVmdGFyZ190ICAgICAgICAgICAqYnRwKQotewotCXNwaW5fbG9jaygmeGZzX2J1ZnRhcmdfbG9jayk7Ci0JbGlzdF9kZWwoJmJ0cC0+YnRfbGlzdCk7Ci0Jc3Bpbl91bmxvY2soJnhmc19idWZ0YXJnX2xvY2spOworCWlmICghbnJfdG9fc2NhbikKKwkJcmV0dXJuIGJ0cC0+YnRfbHJ1X25yOworCisJc3Bpbl9sb2NrKCZidHAtPmJ0X2xydV9sb2NrKTsKKwl3aGlsZSAoIWxpc3RfZW1wdHkoJmJ0cC0+YnRfbHJ1KSkgeworCQlpZiAobnJfdG9fc2Nhbi0tIDw9IDApCisJCQlicmVhazsKKworCQlicCA9IGxpc3RfZmlyc3RfZW50cnkoJmJ0cC0+YnRfbHJ1LCBzdHJ1Y3QgeGZzX2J1ZiwgYl9scnUpOworCisJCS8qCisJCSAqIERlY3JlbWVudCB0aGUgYl9scnVfcmVmIGNvdW50IHVubGVzcyB0aGUgdmFsdWUgaXMgYWxyZWFkeQorCQkgKiB6ZXJvLiBJZiB0aGUgdmFsdWUgaXMgYWxyZWFkeSB6ZXJvLCB3ZSBuZWVkIHRvIHJlY2xhaW0gdGhlCisJCSAqIGJ1ZmZlciwgb3RoZXJ3aXNlIGl0IGdldHMgYW5vdGhlciB0cmlwIHRocm91Z2ggdGhlIExSVS4KKwkJICovCisJCWlmICghYXRvbWljX2FkZF91bmxlc3MoJmJwLT5iX2xydV9yZWYsIC0xLCAwKSkgeworCQkJbGlzdF9tb3ZlX3RhaWwoJmJwLT5iX2xydSwgJmJ0cC0+YnRfbHJ1KTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyoKKwkJICogcmVtb3ZlIHRoZSBidWZmZXIgZnJvbSB0aGUgTFJVIG5vdyB0byBhdm9pZCBuZWVkaW5nIGFub3RoZXIKKwkJICogbG9jayByb3VuZCB0cmlwIGluc2lkZSB4ZnNfYnVmX3JlbGUoKS4KKwkJICovCisJCWxpc3RfbW92ZSgmYnAtPmJfbHJ1LCAmZGlzcG9zZSk7CisJCWJ0cC0+YnRfbHJ1X25yLS07CisJfQorCXNwaW5fdW5sb2NrKCZidHAtPmJ0X2xydV9sb2NrKTsKKworCXdoaWxlICghbGlzdF9lbXB0eSgmZGlzcG9zZSkpIHsKKwkJYnAgPSBsaXN0X2ZpcnN0X2VudHJ5KCZkaXNwb3NlLCBzdHJ1Y3QgeGZzX2J1ZiwgYl9scnUpOworCQlsaXN0X2RlbF9pbml0KCZicC0+Yl9scnUpOworCQl4ZnNfYnVmX3JlbGUoYnApOworCX0KKworCXJldHVybiBidHAtPmJ0X2xydV9ucjsKIH0KIAogdm9pZApAQCAtMTQ5MCwxNyArMTU5OSwxNCBAQAogCXN0cnVjdCB4ZnNfbW91bnQJKm1wLAogCXN0cnVjdCB4ZnNfYnVmdGFyZwkqYnRwKQogeworCXVucmVnaXN0ZXJfc2hyaW5rZXIoJmJ0cC0+YnRfc2hyaW5rZXIpOworCiAJeGZzX2ZsdXNoX2J1ZnRhcmcoYnRwLCAxKTsKIAlpZiAobXAtPm1fZmxhZ3MgJiBYRlNfTU9VTlRfQkFSUklFUikKIAkJeGZzX2Jsa2Rldl9pc3N1ZV9mbHVzaChidHApOwogCWlwdXQoYnRwLT5idF9tYXBwaW5nLT5ob3N0KTsKIAotCS8qIFVucmVnaXN0ZXIgdGhlIGJ1ZnRhcmcgZmlyc3Qgc28gdGhhdCB3ZSBkb24ndCBnZXQgYQotCSAqIHdha2V1cCBmaW5kaW5nIGEgbm9uLWV4aXN0ZW50IHRhc2sKLQkgKi8KLQl4ZnNfdW5yZWdpc3Rlcl9idWZ0YXJnKGJ0cCk7CiAJa3RocmVhZF9zdG9wKGJ0cC0+YnRfdGFzayk7Ci0KIAlrbWVtX2ZyZWUoYnRwKTsKIH0KIApAQCAtMTU5NywyMCArMTcwMywxMyBAQAogCXhmc19idWZ0YXJnX3QJCSpidHAsCiAJY29uc3QgY2hhcgkJKmZzbmFtZSkKIHsKLQlpbnQJZXJyb3IgPSAwOwotCi0JSU5JVF9MSVNUX0hFQUQoJmJ0cC0+YnRfbGlzdCk7CiAJSU5JVF9MSVNUX0hFQUQoJmJ0cC0+YnRfZGVsd3JpdGVfcXVldWUpOwogCXNwaW5fbG9ja19pbml0KCZidHAtPmJ0X2RlbHdyaXRlX2xvY2spOwogCWJ0cC0+YnRfZmxhZ3MgPSAwOwogCWJ0cC0+YnRfdGFzayA9IGt0aHJlYWRfcnVuKHhmc2J1ZmQsIGJ0cCwgInhmc2J1ZmQvJXMiLCBmc25hbWUpOwotCWlmIChJU19FUlIoYnRwLT5idF90YXNrKSkgewotCQllcnJvciA9IFBUUl9FUlIoYnRwLT5idF90YXNrKTsKLQkJZ290byBvdXRfZXJyb3I7Ci0JfQotCXhmc19yZWdpc3Rlcl9idWZ0YXJnKGJ0cCk7Ci1vdXRfZXJyb3I6Ci0JcmV0dXJuIGVycm9yOworCWlmIChJU19FUlIoYnRwLT5idF90YXNrKSkKKwkJcmV0dXJuIFBUUl9FUlIoYnRwLT5idF90YXNrKTsKKwlyZXR1cm4gMDsKIH0KIAogeGZzX2J1ZnRhcmdfdCAqCkBAIC0xNjI3LDEyICsxNzI2LDE3IEBACiAJYnRwLT5idF9tb3VudCA9IG1wOwogCWJ0cC0+YnRfZGV2ID0gIGJkZXYtPmJkX2RldjsKIAlidHAtPmJ0X2JkZXYgPSBiZGV2OworCUlOSVRfTElTVF9IRUFEKCZidHAtPmJ0X2xydSk7CisJc3Bpbl9sb2NrX2luaXQoJmJ0cC0+YnRfbHJ1X2xvY2spOwogCWlmICh4ZnNfc2V0c2l6ZV9idWZ0YXJnX2Vhcmx5KGJ0cCwgYmRldikpCiAJCWdvdG8gZXJyb3I7CiAJaWYgKHhmc19tYXBwaW5nX2J1ZnRhcmcoYnRwLCBiZGV2KSkKIAkJZ290byBlcnJvcjsKIAlpZiAoeGZzX2FsbG9jX2RlbHdyaXRlX3F1ZXVlKGJ0cCwgZnNuYW1lKSkKIAkJZ290byBlcnJvcjsKKwlidHAtPmJ0X3Nocmlua2VyLnNocmluayA9IHhmc19idWZ0YXJnX3NocmluazsKKwlidHAtPmJ0X3Nocmlua2VyLnNlZWtzID0gREVGQVVMVF9TRUVLUzsKKwlyZWdpc3Rlcl9zaHJpbmtlcigmYnRwLT5idF9zaHJpbmtlcik7CiAJcmV0dXJuIGJ0cDsKIAogZXJyb3I6CkBAIC0xNzM3LDI3ICsxODQxLDYgQEAKIAlmbHVzaF93b3JrcXVldWUocXVldWUpOwogfQogCi1TVEFUSUMgaW50Ci14ZnNidWZkX3dha2V1cCgKLQlzdHJ1Y3Qgc2hyaW5rZXIJCSpzaHJpbmssCi0JaW50CQkJcHJpb3JpdHksCi0JZ2ZwX3QJCQltYXNrKQotewotCXhmc19idWZ0YXJnX3QJCSpidHA7Ci0KLQlzcGluX2xvY2soJnhmc19idWZ0YXJnX2xvY2spOwotCWxpc3RfZm9yX2VhY2hfZW50cnkoYnRwLCAmeGZzX2J1ZnRhcmdfbGlzdCwgYnRfbGlzdCkgewotCQlpZiAodGVzdF9iaXQoWEJUX0ZPUkNFX1NMRUVQLCAmYnRwLT5idF9mbGFncykpCi0JCQljb250aW51ZTsKLQkJaWYgKGxpc3RfZW1wdHkoJmJ0cC0+YnRfZGVsd3JpdGVfcXVldWUpKQotCQkJY29udGludWU7Ci0JCXNldF9iaXQoWEJUX0ZPUkNFX0ZMVVNILCAmYnRwLT5idF9mbGFncyk7Ci0JCXdha2VfdXBfcHJvY2VzcyhidHAtPmJ0X3Rhc2spOwotCX0KLQlzcGluX3VubG9jaygmeGZzX2J1ZnRhcmdfbG9jayk7Ci0JcmV0dXJuIDA7Ci19Ci0KIC8qCiAgKiBNb3ZlIGFzIG1hbnkgYnVmZmVycyBhcyBzcGVjaWZpZWQgdG8gdGhlIHN1cHBsaWVkIGxpc3QKICAqIGlkaWNhdGluZyBpZiB3ZSBza2lwcGVkIGFueSBidWZmZXJzIHRvIHByZXZlbnQgZGVhZGxvY2tzLgpAQCAtMTk1Miw3ICsyMDM1LDYgQEAKIAlpZiAoIXhmc2NvbnZlcnRkX3dvcmtxdWV1ZSkKIAkJZ290byBvdXRfZGVzdHJveV94ZnNkYXRhZF93b3JrcXVldWU7CiAKLQlyZWdpc3Rlcl9zaHJpbmtlcigmeGZzX2J1Zl9zaGFrZSk7CiAJcmV0dXJuIDA7CiAKICBvdXRfZGVzdHJveV94ZnNkYXRhZF93b3JrcXVldWU6CkBAIC0xOTY4LDcgKzIwNTAsNiBAQAogdm9pZAogeGZzX2J1Zl90ZXJtaW5hdGUodm9pZCkKIHsKLQl1bnJlZ2lzdGVyX3Nocmlua2VyKCZ4ZnNfYnVmX3NoYWtlKTsKIAlkZXN0cm95X3dvcmtxdWV1ZSh4ZnNjb252ZXJ0ZF93b3JrcXVldWUpOwogCWRlc3Ryb3lfd29ya3F1ZXVlKHhmc2RhdGFkX3dvcmtxdWV1ZSk7CiAJZGVzdHJveV93b3JrcXVldWUoeGZzbG9nZF93b3JrcXVldWUpOwpkaWZmIC0tZ2l0IGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfYnVmLmggYi9mcy94ZnMvbGludXgtMi42L3hmc19idWYuaAppbmRleCAzODNhM2YzLi5hNzZjMjQyIDEwMDY0NAotLS0gYS9mcy94ZnMvbGludXgtMi42L3hmc19idWYuaAorKysgYi9mcy94ZnMvbGludXgtMi42L3hmc19idWYuaApAQCAtMTI4LDEwICsxMjgsMTUgQEAKIAogCS8qIHBlciBkZXZpY2UgZGVsd3JpIHF1ZXVlICovCiAJc3RydWN0IHRhc2tfc3RydWN0CSpidF90YXNrOwotCXN0cnVjdCBsaXN0X2hlYWQJYnRfbGlzdDsKIAlzdHJ1Y3QgbGlzdF9oZWFkCWJ0X2RlbHdyaXRlX3F1ZXVlOwogCXNwaW5sb2NrX3QJCWJ0X2RlbHdyaXRlX2xvY2s7CiAJdW5zaWduZWQgbG9uZwkJYnRfZmxhZ3M7CisKKwkvKiBMUlUgY29udHJvbCBzdHJ1Y3R1cmVzICovCisJc3RydWN0IHNocmlua2VyCQlidF9zaHJpbmtlcjsKKwlzdHJ1Y3QgbGlzdF9oZWFkCWJ0X2xydTsKKwlzcGlubG9ja190CQlidF9scnVfbG9jazsKKwl1bnNpZ25lZCBpbnQJCWJ0X2xydV9ucjsKIH0geGZzX2J1ZnRhcmdfdDsKIAogLyoKQEAgLTE2NCw5ICsxNjksMTEgQEAKIAl4ZnNfb2ZmX3QJCWJfZmlsZV9vZmZzZXQ7CS8qIG9mZnNldCBpbiBmaWxlICovCiAJc2l6ZV90CQkJYl9idWZmZXJfbGVuZ3RoOy8qIHNpemUgb2YgYnVmZmVyIGluIGJ5dGVzICovCiAJYXRvbWljX3QJCWJfaG9sZDsJCS8qIHJlZmVyZW5jZSBjb3VudCAqLworCWF0b21pY190CQliX2xydV9yZWY7CS8qIGxydSByZWNsYWltIHJlZiBjb3VudCAqLwogCXhmc19idWZfZmxhZ3NfdAkJYl9mbGFnczsJLyogc3RhdHVzIGZsYWdzICovCiAJc3RydWN0IHNlbWFwaG9yZQliX3NlbWE7CQkvKiBzZW1hcGhvcmUgZm9yIGxvY2thYmxlcyAqLwogCisJc3RydWN0IGxpc3RfaGVhZAliX2xydTsJCS8qIGxydSBsaXN0ICovCiAJd2FpdF9xdWV1ZV9oZWFkX3QJYl93YWl0ZXJzOwkvKiB1bnBpbiB3YWl0ZXJzICovCiAJc3RydWN0IGxpc3RfaGVhZAliX2xpc3Q7CiAJc3RydWN0IHhmc19wZXJhZwkqYl9wYWc7CQkvKiBjb250YWlucyByYnRyZWUgcm9vdCAqLwpAQCAtMjY0LDcgKzI3MSw4IEBACiAjZGVmaW5lIFhGU19CVUZfWkVST0ZMQUdTKGJwKQkoKGJwKS0+Yl9mbGFncyAmPSBcCiAJCX4oWEJGX1JFQUR8WEJGX1dSSVRFfFhCRl9BU1lOQ3xYQkZfREVMV1JJfFhCRl9PUkRFUkVEKSkKIAotI2RlZmluZSBYRlNfQlVGX1NUQUxFKGJwKQkoKGJwKS0+Yl9mbGFncyB8PSBYQkZfU1RBTEUpCit2b2lkIHhmc19idWZfc3RhbGUoc3RydWN0IHhmc19idWYgKmJwKTsKKyNkZWZpbmUgWEZTX0JVRl9TVEFMRShicCkJeGZzX2J1Zl9zdGFsZShicCk7CiAjZGVmaW5lIFhGU19CVUZfVU5TVEFMRShicCkJKChicCktPmJfZmxhZ3MgJj0gflhCRl9TVEFMRSkKICNkZWZpbmUgWEZTX0JVRl9JU1NUQUxFKGJwKQkoKGJwKS0+Yl9mbGFncyAmIFhCRl9TVEFMRSkKICNkZWZpbmUgWEZTX0JVRl9TVVBFUl9TVEFMRShicCkJZG8gewkJCQlcCkBAIC0zMjgsOSArMzM2LDE1IEBACiAjZGVmaW5lIFhGU19CVUZfU0laRShicCkJCSgoYnApLT5iX2J1ZmZlcl9sZW5ndGgpCiAjZGVmaW5lIFhGU19CVUZfU0VUX1NJWkUoYnAsIGNudCkJKChicCktPmJfYnVmZmVyX2xlbmd0aCA9IChjbnQpKQogCi0jZGVmaW5lIFhGU19CVUZfU0VUX1ZUWVBFX1JFRihicCwgdHlwZSwgcmVmKQlkbyB7IH0gd2hpbGUgKDApCitzdGF0aWMgaW5saW5lIHZvaWQKK3hmc19idWZfc2V0X3JlZigKKwlzdHJ1Y3QgeGZzX2J1ZgkqYnAsCisJaW50CQlscnVfcmVmKQoreworCWF0b21pY19zZXQoJmJwLT5iX2xydV9yZWYsIGxydV9yZWYpOworfQorI2RlZmluZSBYRlNfQlVGX1NFVF9WVFlQRV9SRUYoYnAsIHR5cGUsIHJlZikJeGZzX2J1Zl9zZXRfcmVmKGJwLCByZWYpCiAjZGVmaW5lIFhGU19CVUZfU0VUX1ZUWVBFKGJwLCB0eXBlKQkJZG8geyB9IHdoaWxlICgwKQotI2RlZmluZSBYRlNfQlVGX1NFVF9SRUYoYnAsIHJlZikJCWRvIHsgfSB3aGlsZSAoMCkKIAogI2RlZmluZSBYRlNfQlVGX0lTUElOTkVEKGJwKQlhdG9taWNfcmVhZCgmKChicCktPmJfcGluX2NvdW50KSkKIApkaWZmIC0tZ2l0IGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfZXhwb3J0LmMgYi9mcy94ZnMvbGludXgtMi42L3hmc19leHBvcnQuYwppbmRleCAzNzY0ZDc0Li5mYzAxMTRkIDEwMDY0NAotLS0gYS9mcy94ZnMvbGludXgtMi42L3hmc19leHBvcnQuYworKysgYi9mcy94ZnMvbGludXgtMi42L3hmc19leHBvcnQuYwpAQCAtNzAsOCArNzAsMTYgQEAKIAllbHNlCiAJCWZpbGVpZF90eXBlID0gRklMRUlEX0lOTzMyX0dFTl9QQVJFTlQ7CiAKLQkvKiBmaWxlc3lzdGVtIG1heSBjb250YWluIDY0Yml0IGlub2RlIG51bWJlcnMgKi8KLQlpZiAoIShYRlNfTShpbm9kZS0+aV9zYiktPm1fZmxhZ3MgJiBYRlNfTU9VTlRfU01BTExfSU5VTVMpKQorCS8qCisJICogSWYgdGhlIHRoZSBmaWxlc3lzdGVtIG1heSBjb250YWluIDY0Yml0IGlub2RlIG51bWJlcnMsIHdlIG5lZWQKKwkgKiB0byB1c2UgbGFyZ2VyIGZpbGUgaGFuZGxlcyB0aGF0IGNhbiByZXByZXNlbnQgdGhlbS4KKwkgKgorCSAqIFdoaWxlIHdlIG9ubHkgYWxsb2NhdGUgaW5vZGVzIHRoYXQgZG8gbm90IGZpdCBpbnRvIDMyIGJpdHMgYW55CisJICogbGFyZ2UgZW5vdWdoIGZpbGVzeXN0ZW0gbWF5IGNvbnRhaW4gdGhlbSwgdGh1cyB0aGUgc2xpZ2h0bHkKKwkgKiBjb25mdXNpbmcgbG9va2luZyBjb25kaXRpb25hbCBiZWxvdy4KKwkgKi8KKwlpZiAoIShYRlNfTShpbm9kZS0+aV9zYiktPm1fZmxhZ3MgJiBYRlNfTU9VTlRfU01BTExfSU5VTVMpIHx8CisJICAgIChYRlNfTShpbm9kZS0+aV9zYiktPm1fZmxhZ3MgJiBYRlNfTU9VTlRfMzJCSVRJTk9ERVMpKQogCQlmaWxlaWRfdHlwZSB8PSBYRlNfRklMRUlEX1RZUEVfNjRGTEFHOwogCiAJLyoKZGlmZiAtLWdpdCBhL2ZzL3hmcy9saW51eC0yLjYveGZzX2xpbnV4LmggYi9mcy94ZnMvbGludXgtMi42L3hmc19saW51eC5oCmluZGV4IDIxNGRkZDcuLjA5NjQ5NDkgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy9saW51eC0yLjYveGZzX2xpbnV4LmgKKysrIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfbGludXguaApAQCAtMzcsNyArMzcsNiBAQAogCiAjaW5jbHVkZSA8a21lbS5oPgogI2luY2x1ZGUgPG1ybG9jay5oPgotI2luY2x1ZGUgPHN2Lmg+CiAjaW5jbHVkZSA8dGltZS5oPgogCiAjaW5jbHVkZSA8c3VwcG9ydC9kZWJ1Zy5oPgpkaWZmIC0tZ2l0IGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfc3VwZXIuYyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX3N1cGVyLmMKaW5kZXggMDY0Zjk2NC4uYzUxZmFhYSAxMDA2NDQKLS0tIGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfc3VwZXIuYworKysgYi9mcy94ZnMvbGludXgtMi42L3hmc19zdXBlci5jCkBAIC04MzQsOCArODM0LDExIEBACiAJc3RydWN0IHhmc19haWwJCSphaWxwLAogCXhmc19sc25fdAkJdGhyZXNob2xkX2xzbikKIHsKLQlhaWxwLT54YV90YXJnZXQgPSB0aHJlc2hvbGRfbHNuOwotCXdha2VfdXBfcHJvY2VzcyhhaWxwLT54YV90YXNrKTsKKwkvKiBvbmx5IGV2ZXIgbW92ZSB0aGUgdGFyZ2V0IGZvcndhcmRzICovCisJaWYgKFhGU19MU05fQ01QKHRocmVzaG9sZF9sc24sIGFpbHAtPnhhX3RhcmdldCkgPiAwKSB7CisJCWFpbHAtPnhhX3RhcmdldCA9IHRocmVzaG9sZF9sc247CisJCXdha2VfdXBfcHJvY2VzcyhhaWxwLT54YV90YXNrKTsKKwl9CiB9CiAKIFNUQVRJQyBpbnQKQEAgLTg0Nyw4ICs4NTAsMTcgQEAKIAlsb25nCQl0b3V0ID0gMDsgLyogbWlsbGlzZWNvbmRzICovCiAKIAl3aGlsZSAoIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSkgewotCQlzY2hlZHVsZV90aW1lb3V0X2ludGVycnVwdGlibGUodG91dCA/Ci0JCQkJbXNlY3NfdG9famlmZmllcyh0b3V0KSA6IE1BWF9TQ0hFRFVMRV9USU1FT1VUKTsKKwkJLyoKKwkJICogZm9yIHNob3J0IHNsZWVwcyBpbmRpY2F0aW5nIGNvbmdlc3Rpb24sIGRvbid0IGFsbG93IHVzIHRvCisJCSAqIGdldCB3b2tlbiBlYXJseS4gT3RoZXJ3aXNlIGFsbCB3ZSBkbyBpcyBiYW5nIG9uIHRoZSBBSUwgbG9jaworCQkgKiB3aXRob3V0IG1ha2luZyBwcm9ncmVzcy4KKwkJICovCisJCWlmICh0b3V0ICYmIHRvdXQgPD0gMjApCisJCQlfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfS0lMTEFCTEUpOworCQllbHNlCisJCQlfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCXNjaGVkdWxlX3RpbWVvdXQodG91dCA/CisJCQkJIG1zZWNzX3RvX2ppZmZpZXModG91dCkgOiBNQVhfU0NIRURVTEVfVElNRU9VVCk7CiAKIAkJLyogc3dzdXNwICovCiAJCXRyeV90b19mcmVlemUoKTsKQEAgLTExMTgsNiArMTEzMCw4IEBACiAJICovCiAJQVNTRVJUKCFyd3NlbV9pc19sb2NrZWQoJmlwLT5pX2lvbG9jay5tcl9sb2NrKSk7CiAJbXJsb2NrX2luaXQoJmlwLT5pX2lvbG9jaywgTVJMT0NLX0JBUlJJRVIsICJ4ZnNpbyIsIGlwLT5pX2lubyk7CisJbG9ja2RlcF9zZXRfY2xhc3NfYW5kX25hbWUoJmlwLT5pX2lvbG9jay5tcl9sb2NrLAorCQkJJnhmc19pb2xvY2tfcmVjbGFpbWFibGUsICJ4ZnNfaW9sb2NrX3JlY2xhaW1hYmxlIik7CiAKIAl4ZnNfaW5hY3RpdmUoaXApOwogfQpkaWZmIC0tZ2l0IGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfc3luYy5jIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfc3luYy5jCmluZGV4IGFmYjBkN2MuLmEwMjQ4MGQgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy9saW51eC0yLjYveGZzX3N5bmMuYworKysgYi9mcy94ZnMvbGludXgtMi42L3hmc19zeW5jLmMKQEAgLTUzLDE0ICs1MywzMCBAQAogewogCXN0cnVjdCBpbm9kZQkJKmlub2RlID0gVkZTX0koaXApOwogCisJQVNTRVJUKHJjdV9yZWFkX2xvY2tfaGVsZCgpKTsKKworCS8qCisJICogY2hlY2sgZm9yIHN0YWxlIFJDVSBmcmVlZCBpbm9kZQorCSAqCisJICogSWYgdGhlIGlub2RlIGhhcyBiZWVuIHJlYWxsb2NhdGVkLCBpdCBkb2Vzbid0IG1hdHRlciBpZiBpdCdzIG5vdCBpbgorCSAqIHRoZSBBRyB3ZSBhcmUgd2Fsa2luZyAtIHdlIGFyZSB3YWxraW5nIGZvciB3cml0ZWJhY2ssIHNvIGlmIGl0CisJICogcGFzc2VzIGFsbCB0aGUgInZhbGlkIGlub2RlIiBjaGVja3MgYW5kIGlzIGRpcnR5LCB0aGVuIHdlJ2xsIHdyaXRlCisJICogaXQgYmFjayBhbnl3YXkuICBJZiBpdCBoYXMgYmVlbiByZWFsbG9jYXRlZCBhbmQgc3RpbGwgYmVpbmcKKwkgKiBpbml0aWFsaXNlZCwgdGhlIFhGU19JTkVXIGNoZWNrIGJlbG93IHdpbGwgY2F0Y2ggaXQuCisJICovCisJc3Bpbl9sb2NrKCZpcC0+aV9mbGFnc19sb2NrKTsKKwlpZiAoIWlwLT5pX2lubykKKwkJZ290byBvdXRfdW5sb2NrX25vZW50OworCisJLyogYXZvaWQgbmV3IG9yIHJlY2xhaW1hYmxlIGlub2Rlcy4gTGVhdmUgZm9yIHJlY2xhaW0gY29kZSB0byBmbHVzaCAqLworCWlmIChfX3hmc19pZmxhZ3NfdGVzdChpcCwgWEZTX0lORVcgfCBYRlNfSVJFQ0xBSU1BQkxFIHwgWEZTX0lSRUNMQUlNKSkKKwkJZ290byBvdXRfdW5sb2NrX25vZW50OworCXNwaW5fdW5sb2NrKCZpcC0+aV9mbGFnc19sb2NrKTsKKwogCS8qIG5vdGhpbmcgdG8gc3luYyBkdXJpbmcgc2h1dGRvd24gKi8KIAlpZiAoWEZTX0ZPUkNFRF9TSFVURE9XTihpcC0+aV9tb3VudCkpCiAJCXJldHVybiBFRlNDT1JSVVBURUQ7CiAKLQkvKiBhdm9pZCBuZXcgb3IgcmVjbGFpbWFibGUgaW5vZGVzLiBMZWF2ZSBmb3IgcmVjbGFpbSBjb2RlIHRvIGZsdXNoICovCi0JaWYgKHhmc19pZmxhZ3NfdGVzdChpcCwgWEZTX0lORVcgfCBYRlNfSVJFQ0xBSU1BQkxFIHwgWEZTX0lSRUNMQUlNKSkKLQkJcmV0dXJuIEVOT0VOVDsKLQogCS8qIElmIHdlIGNhbid0IGdyYWIgdGhlIGlub2RlLCBpdCBtdXN0IG9uIGl0J3Mgd2F5IHRvIHJlY2xhaW0uICovCiAJaWYgKCFpZ3JhYihpbm9kZSkpCiAJCXJldHVybiBFTk9FTlQ7CkBAIC03Miw2ICs4OCwxMCBAQAogCiAJLyogaW5vZGUgaXMgdmFsaWQgKi8KIAlyZXR1cm4gMDsKKworb3V0X3VubG9ja19ub2VudDoKKwlzcGluX3VubG9jaygmaXAtPmlfZmxhZ3NfbG9jayk7CisJcmV0dXJuIEVOT0VOVDsKIH0KIAogU1RBVElDIGludApAQCAtOTgsMTIgKzExOCwxMiBAQAogCQlpbnQJCWVycm9yID0gMDsKIAkJaW50CQlpOwogCi0JCXJlYWRfbG9jaygmcGFnLT5wYWdfaWNpX2xvY2spOworCQlyY3VfcmVhZF9sb2NrKCk7CiAJCW5yX2ZvdW5kID0gcmFkaXhfdHJlZV9nYW5nX2xvb2t1cCgmcGFnLT5wYWdfaWNpX3Jvb3QsCiAJCQkJCSh2b2lkICoqKWJhdGNoLCBmaXJzdF9pbmRleCwKIAkJCQkJWEZTX0xPT0tVUF9CQVRDSCk7CiAJCWlmICghbnJfZm91bmQpIHsKLQkJCXJlYWRfdW5sb2NrKCZwYWctPnBhZ19pY2lfbG9jayk7CisJCQlyY3VfcmVhZF91bmxvY2soKTsKIAkJCWJyZWFrOwogCQl9CiAKQEAgLTExOCwxOCArMTM4LDI2IEBACiAJCQkJYmF0Y2hbaV0gPSBOVUxMOwogCiAJCQkvKgotCQkJICogVXBkYXRlIHRoZSBpbmRleCBmb3IgdGhlIG5leHQgbG9va3VwLiBDYXRjaCBvdmVyZmxvd3MKLQkJCSAqIGludG8gdGhlIG5leHQgQUcgcmFuZ2Ugd2hpY2ggY2FuIG9jY3VyIGlmIHdlIGhhdmUgaW5vZGVzCi0JCQkgKiBpbiB0aGUgbGFzdCBibG9jayBvZiB0aGUgQUcgYW5kIHdlIGFyZSBjdXJyZW50bHkKLQkJCSAqIHBvaW50aW5nIHRvIHRoZSBsYXN0IGlub2RlLgorCQkJICogVXBkYXRlIHRoZSBpbmRleCBmb3IgdGhlIG5leHQgbG9va3VwLiBDYXRjaAorCQkJICogb3ZlcmZsb3dzIGludG8gdGhlIG5leHQgQUcgcmFuZ2Ugd2hpY2ggY2FuIG9jY3VyIGlmCisJCQkgKiB3ZSBoYXZlIGlub2RlcyBpbiB0aGUgbGFzdCBibG9jayBvZiB0aGUgQUcgYW5kIHdlCisJCQkgKiBhcmUgY3VycmVudGx5IHBvaW50aW5nIHRvIHRoZSBsYXN0IGlub2RlLgorCQkJICoKKwkJCSAqIEJlY2F1c2Ugd2UgbWF5IHNlZSBpbm9kZXMgdGhhdCBhcmUgZnJvbSB0aGUgd3JvbmcgQUcKKwkJCSAqIGR1ZSB0byBSQ1UgZnJlZWluZyBhbmQgcmVhbGxvY2F0aW9uLCBvbmx5IHVwZGF0ZSB0aGUKKwkJCSAqIGluZGV4IGlmIGl0IGxpZXMgaW4gdGhpcyBBRy4gSXQgd2FzIGEgcmFjZSB0aGF0IGxlYWQKKwkJCSAqIHVzIHRvIHNlZSB0aGlzIGlub2RlLCBzbyBhbm90aGVyIGxvb2t1cCBmcm9tIHRoZQorCQkJICogc2FtZSBpbmRleCB3aWxsIG5vdCBmaW5kIGl0IGFnYWluLgogCQkJICovCisJCQlpZiAoWEZTX0lOT19UT19BR05PKG1wLCBpcC0+aV9pbm8pICE9IHBhZy0+cGFnX2Fnbm8pCisJCQkJY29udGludWU7CiAJCQlmaXJzdF9pbmRleCA9IFhGU19JTk9fVE9fQUdJTk8obXAsIGlwLT5pX2lubyArIDEpOwogCQkJaWYgKGZpcnN0X2luZGV4IDwgWEZTX0lOT19UT19BR0lOTyhtcCwgaXAtPmlfaW5vKSkKIAkJCQlkb25lID0gMTsKIAkJfQogCiAJCS8qIHVubG9jayBub3cgd2UndmUgZ3JhYmJlZCB0aGUgaW5vZGVzLiAqLwotCQlyZWFkX3VubG9jaygmcGFnLT5wYWdfaWNpX2xvY2spOworCQlyY3VfcmVhZF91bmxvY2soKTsKIAogCQlmb3IgKGkgPSAwOyBpIDwgbnJfZm91bmQ7IGkrKykgewogCQkJaWYgKCFiYXRjaFtpXSkKQEAgLTU5MiwxMiArNjIwLDEyIEBACiAJc3RydWN0IHhmc19wZXJhZyAqcGFnOwogCiAJcGFnID0geGZzX3BlcmFnX2dldChtcCwgWEZTX0lOT19UT19BR05PKG1wLCBpcC0+aV9pbm8pKTsKLQl3cml0ZV9sb2NrKCZwYWctPnBhZ19pY2lfbG9jayk7CisJc3Bpbl9sb2NrKCZwYWctPnBhZ19pY2lfbG9jayk7CiAJc3Bpbl9sb2NrKCZpcC0+aV9mbGFnc19sb2NrKTsKIAlfX3hmc19pbm9kZV9zZXRfcmVjbGFpbV90YWcocGFnLCBpcCk7CiAJX194ZnNfaWZsYWdzX3NldChpcCwgWEZTX0lSRUNMQUlNQUJMRSk7CiAJc3Bpbl91bmxvY2soJmlwLT5pX2ZsYWdzX2xvY2spOwotCXdyaXRlX3VubG9jaygmcGFnLT5wYWdfaWNpX2xvY2spOworCXNwaW5fdW5sb2NrKCZwYWctPnBhZ19pY2lfbG9jayk7CiAJeGZzX3BlcmFnX3B1dChwYWcpOwogfQogCkBAIC02MzksOSArNjY3LDE0IEBACiAJc3RydWN0IHhmc19pbm9kZQkqaXAsCiAJaW50CQkJZmxhZ3MpCiB7CisJQVNTRVJUKHJjdV9yZWFkX2xvY2tfaGVsZCgpKTsKKworCS8qIHF1aWNrIGNoZWNrIGZvciBzdGFsZSBSQ1UgZnJlZWQgaW5vZGUgKi8KKwlpZiAoIWlwLT5pX2lubykKKwkJcmV0dXJuIDE7CiAKIAkvKgotCSAqIGRvIHNvbWUgdW5sb2NrZWQgY2hlY2tzIGZpcnN0IHRvIGF2b2lkIHVubmVjY2VhcnkgbG9jayB0cmFmZmljLgorCSAqIGRvIHNvbWUgdW5sb2NrZWQgY2hlY2tzIGZpcnN0IHRvIGF2b2lkIHVubmVjZXNzYXJ5IGxvY2sgdHJhZmZpYy4KIAkgKiBUaGUgZmlyc3QgaXMgYSBmbHVzaCBsb2NrIGNoZWNrLCB0aGUgc2Vjb25kIGlzIGEgYWxyZWFkeSBpbiByZWNsYWltCiAJICogY2hlY2suIE9ubHkgZG8gdGhlc2UgY2hlY2tzIGlmIHdlIGFyZSBub3QgZ29pbmcgdG8gYmxvY2sgb24gbG9ja3MuCiAJICovCkBAIC02NTQsMTEgKzY4NywxNiBAQAogCSAqIFRoZSByYWRpeCB0cmVlIGxvY2sgaGVyZSBwcm90ZWN0cyBhIHRocmVhZCBpbiB4ZnNfaWdldCBmcm9tIHJhY2luZwogCSAqIHdpdGggdXMgc3RhcnRpbmcgcmVjbGFpbSBvbiB0aGUgaW5vZGUuICBPbmNlIHdlIGhhdmUgdGhlCiAJICogWEZTX0lSRUNMQUlNIGZsYWcgc2V0IGl0IHdpbGwgbm90IHRvdWNoIHVzLgorCSAqCisJICogRHVlIHRvIFJDVSBsb29rdXAsIHdlIG1heSBmaW5kIGlub2RlcyB0aGF0IGhhdmUgYmVlbiBmcmVlZCBhbmQgb25seQorCSAqIGhhdmUgWEZTX0lSRUNMQUlNIHNldC4gIEluZGVlZCwgd2UgbWF5IHNlZSByZWFsbG9jYXRlZCBpbm9kZXMgdGhhdAorCSAqIGFyZW4ndCBjYW5kaWRhdGVzIGZvciByZWNsYWltIGF0IGFsbCwgc28gd2UgbXVzdCBjaGVjayB0aGUKKwkgKiBYRlNfSVJFQ0xBSU1BQkxFIGlzIHNldCBmaXJzdCBiZWZvcmUgcHJvY2VlZGluZyB0byByZWNsYWltLgogCSAqLwogCXNwaW5fbG9jaygmaXAtPmlfZmxhZ3NfbG9jayk7Ci0JQVNTRVJUX0FMV0FZUyhfX3hmc19pZmxhZ3NfdGVzdChpcCwgWEZTX0lSRUNMQUlNQUJMRSkpOwotCWlmIChfX3hmc19pZmxhZ3NfdGVzdChpcCwgWEZTX0lSRUNMQUlNKSkgewotCQkvKiBpZ25vcmUgYXMgaXQgaXMgYWxyZWFkeSB1bmRlciByZWNsYWltICovCisJaWYgKCFfX3hmc19pZmxhZ3NfdGVzdChpcCwgWEZTX0lSRUNMQUlNQUJMRSkgfHwKKwkgICAgX194ZnNfaWZsYWdzX3Rlc3QoaXAsIFhGU19JUkVDTEFJTSkpIHsKKwkJLyogbm90IGEgcmVjbGFpbSBjYW5kaWRhdGUuICovCiAJCXNwaW5fdW5sb2NrKCZpcC0+aV9mbGFnc19sb2NrKTsKIAkJcmV0dXJuIDE7CiAJfQpAQCAtNzk1LDEyICs4MzMsMTIgQEAKIAkgKiBhZGRlZCB0byB0aGUgdHJlZSBhc3NlcnQgdGhhdCBpdCdzIGJlZW4gdGhlcmUgYmVmb3JlIHRvIGNhdGNoCiAJICogcHJvYmxlbXMgd2l0aCB0aGUgaW5vZGUgbGlmZSB0aW1lIGVhcmx5IG9uLgogCSAqLwotCXdyaXRlX2xvY2soJnBhZy0+cGFnX2ljaV9sb2NrKTsKKwlzcGluX2xvY2soJnBhZy0+cGFnX2ljaV9sb2NrKTsKIAlpZiAoIXJhZGl4X3RyZWVfZGVsZXRlKCZwYWctPnBhZ19pY2lfcm9vdCwKIAkJCQlYRlNfSU5PX1RPX0FHSU5PKGlwLT5pX21vdW50LCBpcC0+aV9pbm8pKSkKIAkJQVNTRVJUKDApOwogCV9feGZzX2lub2RlX2NsZWFyX3JlY2xhaW0ocGFnLCBpcCk7Ci0Jd3JpdGVfdW5sb2NrKCZwYWctPnBhZ19pY2lfbG9jayk7CisJc3Bpbl91bmxvY2soJnBhZy0+cGFnX2ljaV9sb2NrKTsKIAogCS8qCiAJICogSGVyZSB3ZSBkbyBhbiAoYWxtb3N0KSBzcHVyaW91cyBpbm9kZSBsb2NrIGluIG9yZGVyIHRvIGNvb3JkaW5hdGUKQEAgLTg2NCwxNCArOTAyLDE0IEBACiAJCQlzdHJ1Y3QgeGZzX2lub2RlICpiYXRjaFtYRlNfTE9PS1VQX0JBVENIXTsKIAkJCWludAlpOwogCi0JCQl3cml0ZV9sb2NrKCZwYWctPnBhZ19pY2lfbG9jayk7CisJCQlyY3VfcmVhZF9sb2NrKCk7CiAJCQlucl9mb3VuZCA9IHJhZGl4X3RyZWVfZ2FuZ19sb29rdXBfdGFnKAogCQkJCQkmcGFnLT5wYWdfaWNpX3Jvb3QsCiAJCQkJCSh2b2lkICoqKWJhdGNoLCBmaXJzdF9pbmRleCwKIAkJCQkJWEZTX0xPT0tVUF9CQVRDSCwKIAkJCQkJWEZTX0lDSV9SRUNMQUlNX1RBRyk7CiAJCQlpZiAoIW5yX2ZvdW5kKSB7Ci0JCQkJd3JpdGVfdW5sb2NrKCZwYWctPnBhZ19pY2lfbG9jayk7CisJCQkJcmN1X3JlYWRfdW5sb2NrKCk7CiAJCQkJYnJlYWs7CiAJCQl9CiAKQEAgLTg5MSwxNCArOTI5LDI0IEBACiAJCQkJICogb2NjdXIgaWYgd2UgaGF2ZSBpbm9kZXMgaW4gdGhlIGxhc3QgYmxvY2sgb2YKIAkJCQkgKiB0aGUgQUcgYW5kIHdlIGFyZSBjdXJyZW50bHkgcG9pbnRpbmcgdG8gdGhlCiAJCQkJICogbGFzdCBpbm9kZS4KKwkJCQkgKgorCQkJCSAqIEJlY2F1c2Ugd2UgbWF5IHNlZSBpbm9kZXMgdGhhdCBhcmUgZnJvbSB0aGUKKwkJCQkgKiB3cm9uZyBBRyBkdWUgdG8gUkNVIGZyZWVpbmcgYW5kCisJCQkJICogcmVhbGxvY2F0aW9uLCBvbmx5IHVwZGF0ZSB0aGUgaW5kZXggaWYgaXQKKwkJCQkgKiBsaWVzIGluIHRoaXMgQUcuIEl0IHdhcyBhIHJhY2UgdGhhdCBsZWFkIHVzCisJCQkJICogdG8gc2VlIHRoaXMgaW5vZGUsIHNvIGFub3RoZXIgbG9va3VwIGZyb20KKwkJCQkgKiB0aGUgc2FtZSBpbmRleCB3aWxsIG5vdCBmaW5kIGl0IGFnYWluLgogCQkJCSAqLworCQkJCWlmIChYRlNfSU5PX1RPX0FHTk8obXAsIGlwLT5pX2lubykgIT0KKwkJCQkJCQkJcGFnLT5wYWdfYWdubykKKwkJCQkJY29udGludWU7CiAJCQkJZmlyc3RfaW5kZXggPSBYRlNfSU5PX1RPX0FHSU5PKG1wLCBpcC0+aV9pbm8gKyAxKTsKIAkJCQlpZiAoZmlyc3RfaW5kZXggPCBYRlNfSU5PX1RPX0FHSU5PKG1wLCBpcC0+aV9pbm8pKQogCQkJCQlkb25lID0gMTsKIAkJCX0KIAogCQkJLyogdW5sb2NrIG5vdyB3ZSd2ZSBncmFiYmVkIHRoZSBpbm9kZXMuICovCi0JCQl3cml0ZV91bmxvY2soJnBhZy0+cGFnX2ljaV9sb2NrKTsKKwkJCXJjdV9yZWFkX3VubG9jaygpOwogCiAJCQlmb3IgKGkgPSAwOyBpIDwgbnJfZm91bmQ7IGkrKykgewogCQkJCWlmICghYmF0Y2hbaV0pCmRpZmYgLS1naXQgYS9mcy94ZnMvbGludXgtMi42L3hmc190cmFjZS5oIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfdHJhY2UuaAppbmRleCBhY2VmMmU5Li42NDdhZjJhIDEwMDY0NAotLS0gYS9mcy94ZnMvbGludXgtMi42L3hmc190cmFjZS5oCisrKyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX3RyYWNlLmgKQEAgLTc2Niw4ICs3NjYsOCBAQAogCQlfX2ZpZWxkKGludCwgY3Vycl9yZXMpCiAJCV9fZmllbGQoaW50LCB1bml0X3JlcykKIAkJX19maWVsZCh1bnNpZ25lZCBpbnQsIGZsYWdzKQotCQlfX2ZpZWxkKHZvaWQgKiwgcmVzZXJ2ZV9oZWFkcSkKLQkJX19maWVsZCh2b2lkICosIHdyaXRlX2hlYWRxKQorCQlfX2ZpZWxkKGludCwgcmVzZXJ2ZXEpCisJCV9fZmllbGQoaW50LCB3cml0ZXEpCiAJCV9fZmllbGQoaW50LCBncmFudF9yZXNlcnZlX2N5Y2xlKQogCQlfX2ZpZWxkKGludCwgZ3JhbnRfcmVzZXJ2ZV9ieXRlcykKIAkJX19maWVsZChpbnQsIGdyYW50X3dyaXRlX2N5Y2xlKQpAQCAtNzg0LDE5ICs3ODQsMjEgQEAKIAkJX19lbnRyeS0+Y3Vycl9yZXMgPSB0aWMtPnRfY3Vycl9yZXM7CiAJCV9fZW50cnktPnVuaXRfcmVzID0gdGljLT50X3VuaXRfcmVzOwogCQlfX2VudHJ5LT5mbGFncyA9IHRpYy0+dF9mbGFnczsKLQkJX19lbnRyeS0+cmVzZXJ2ZV9oZWFkcSA9IGxvZy0+bF9yZXNlcnZlX2hlYWRxOwotCQlfX2VudHJ5LT53cml0ZV9oZWFkcSA9IGxvZy0+bF93cml0ZV9oZWFkcTsKLQkJX19lbnRyeS0+Z3JhbnRfcmVzZXJ2ZV9jeWNsZSA9IGxvZy0+bF9ncmFudF9yZXNlcnZlX2N5Y2xlOwotCQlfX2VudHJ5LT5ncmFudF9yZXNlcnZlX2J5dGVzID0gbG9nLT5sX2dyYW50X3Jlc2VydmVfYnl0ZXM7Ci0JCV9fZW50cnktPmdyYW50X3dyaXRlX2N5Y2xlID0gbG9nLT5sX2dyYW50X3dyaXRlX2N5Y2xlOwotCQlfX2VudHJ5LT5ncmFudF93cml0ZV9ieXRlcyA9IGxvZy0+bF9ncmFudF93cml0ZV9ieXRlczsKKwkJX19lbnRyeS0+cmVzZXJ2ZXEgPSBsaXN0X2VtcHR5KCZsb2ctPmxfcmVzZXJ2ZXEpOworCQlfX2VudHJ5LT53cml0ZXEgPSBsaXN0X2VtcHR5KCZsb2ctPmxfd3JpdGVxKTsKKwkJeGxvZ19jcmFja19ncmFudF9oZWFkKCZsb2ctPmxfZ3JhbnRfcmVzZXJ2ZV9oZWFkLAorCQkJCSZfX2VudHJ5LT5ncmFudF9yZXNlcnZlX2N5Y2xlLAorCQkJCSZfX2VudHJ5LT5ncmFudF9yZXNlcnZlX2J5dGVzKTsKKwkJeGxvZ19jcmFja19ncmFudF9oZWFkKCZsb2ctPmxfZ3JhbnRfd3JpdGVfaGVhZCwKKwkJCQkmX19lbnRyeS0+Z3JhbnRfd3JpdGVfY3ljbGUsCisJCQkJJl9fZW50cnktPmdyYW50X3dyaXRlX2J5dGVzKTsKIAkJX19lbnRyeS0+Y3Vycl9jeWNsZSA9IGxvZy0+bF9jdXJyX2N5Y2xlOwogCQlfX2VudHJ5LT5jdXJyX2Jsb2NrID0gbG9nLT5sX2N1cnJfYmxvY2s7Ci0JCV9fZW50cnktPnRhaWxfbHNuID0gbG9nLT5sX3RhaWxfbHNuOworCQlfX2VudHJ5LT50YWlsX2xzbiA9IGF0b21pYzY0X3JlYWQoJmxvZy0+bF90YWlsX2xzbik7CiAJKSwKIAlUUF9wcmludGsoImRldiAlZDolZCB0eXBlICVzIHRfb2NudCAldSB0X2NudCAldSB0X2N1cnJfcmVzICV1ICIKLQkJICAidF91bml0X3JlcyAldSB0X2ZsYWdzICVzIHJlc2VydmVfaGVhZHEgMHglcCAiCi0JCSAgIndyaXRlX2hlYWRxIDB4JXAgZ3JhbnRfcmVzZXJ2ZV9jeWNsZSAlZCAiCisJCSAgInRfdW5pdF9yZXMgJXUgdF9mbGFncyAlcyByZXNlcnZlcSAlcyAiCisJCSAgIndyaXRlcSAlcyBncmFudF9yZXNlcnZlX2N5Y2xlICVkICIKIAkJICAiZ3JhbnRfcmVzZXJ2ZV9ieXRlcyAlZCBncmFudF93cml0ZV9jeWNsZSAlZCAiCiAJCSAgImdyYW50X3dyaXRlX2J5dGVzICVkIGN1cnJfY3ljbGUgJWQgY3Vycl9ibG9jayAlZCAiCiAJCSAgInRhaWxfY3ljbGUgJWQgdGFpbF9ibG9jayAlZCIsCkBAIC04MDcsOCArODA5LDggQEAKIAkJICBfX2VudHJ5LT5jdXJyX3JlcywKIAkJICBfX2VudHJ5LT51bml0X3JlcywKIAkJICBfX3ByaW50X2ZsYWdzKF9fZW50cnktPmZsYWdzLCAifCIsIFhMT0dfVElDX0ZMQUdTKSwKLQkJICBfX2VudHJ5LT5yZXNlcnZlX2hlYWRxLAotCQkgIF9fZW50cnktPndyaXRlX2hlYWRxLAorCQkgIF9fZW50cnktPnJlc2VydmVxID8gImVtcHR5IiA6ICJhY3RpdmUiLAorCQkgIF9fZW50cnktPndyaXRlcSA/ICJlbXB0eSIgOiAiYWN0aXZlIiwKIAkJICBfX2VudHJ5LT5ncmFudF9yZXNlcnZlX2N5Y2xlLAogCQkgIF9fZW50cnktPmdyYW50X3Jlc2VydmVfYnl0ZXMsCiAJCSAgX19lbnRyeS0+Z3JhbnRfd3JpdGVfY3ljbGUsCkBAIC04MzUsNiArODM3LDcgQEAKIERFRklORV9MT0dHUkFOVF9FVkVOVCh4ZnNfbG9nX2dyYW50X3dha2UxKTsKIERFRklORV9MT0dHUkFOVF9FVkVOVCh4ZnNfbG9nX2dyYW50X3NsZWVwMik7CiBERUZJTkVfTE9HR1JBTlRfRVZFTlQoeGZzX2xvZ19ncmFudF93YWtlMik7CitERUZJTkVfTE9HR1JBTlRfRVZFTlQoeGZzX2xvZ19ncmFudF93YWtlX3VwKTsKIERFRklORV9MT0dHUkFOVF9FVkVOVCh4ZnNfbG9nX3JlZ3JhbnRfd3JpdGVfZW50ZXIpOwogREVGSU5FX0xPR0dSQU5UX0VWRU5UKHhmc19sb2dfcmVncmFudF93cml0ZV9leGl0KTsKIERFRklORV9MT0dHUkFOVF9FVkVOVCh4ZnNfbG9nX3JlZ3JhbnRfd3JpdGVfZXJyb3IpOwpAQCAtODQyLDYgKzg0NSw3IEBACiBERUZJTkVfTE9HR1JBTlRfRVZFTlQoeGZzX2xvZ19yZWdyYW50X3dyaXRlX3dha2UxKTsKIERFRklORV9MT0dHUkFOVF9FVkVOVCh4ZnNfbG9nX3JlZ3JhbnRfd3JpdGVfc2xlZXAyKTsKIERFRklORV9MT0dHUkFOVF9FVkVOVCh4ZnNfbG9nX3JlZ3JhbnRfd3JpdGVfd2FrZTIpOworREVGSU5FX0xPR0dSQU5UX0VWRU5UKHhmc19sb2dfcmVncmFudF93cml0ZV93YWtlX3VwKTsKIERFRklORV9MT0dHUkFOVF9FVkVOVCh4ZnNfbG9nX3JlZ3JhbnRfcmVzZXJ2ZV9lbnRlcik7CiBERUZJTkVfTE9HR1JBTlRfRVZFTlQoeGZzX2xvZ19yZWdyYW50X3Jlc2VydmVfZXhpdCk7CiBERUZJTkVfTE9HR1JBTlRfRVZFTlQoeGZzX2xvZ19yZWdyYW50X3Jlc2VydmVfc3ViKTsKQEAgLTkzNSwxMCArOTM5LDEwIEBACiBERUZJTkVfUEFHRV9FVkVOVCh4ZnNfcmVsZWFzZXBhZ2UpOwogREVGSU5FX1BBR0VfRVZFTlQoeGZzX2ludmFsaWRhdGVwYWdlKTsKIAotREVDTEFSRV9FVkVOVF9DTEFTUyh4ZnNfaW9tYXBfY2xhc3MsCitERUNMQVJFX0VWRU5UX0NMQVNTKHhmc19pbWFwX2NsYXNzLAogCVRQX1BST1RPKHN0cnVjdCB4ZnNfaW5vZGUgKmlwLCB4ZnNfb2ZmX3Qgb2Zmc2V0LCBzc2l6ZV90IGNvdW50LAotCQkgaW50IGZsYWdzLCBzdHJ1Y3QgeGZzX2JtYnRfaXJlYyAqaXJlYyksCi0JVFBfQVJHUyhpcCwgb2Zmc2V0LCBjb3VudCwgZmxhZ3MsIGlyZWMpLAorCQkgaW50IHR5cGUsIHN0cnVjdCB4ZnNfYm1idF9pcmVjICppcmVjKSwKKwlUUF9BUkdTKGlwLCBvZmZzZXQsIGNvdW50LCB0eXBlLCBpcmVjKSwKIAlUUF9TVFJVQ1RfX2VudHJ5KAogCQlfX2ZpZWxkKGRldl90LCBkZXYpCiAJCV9fZmllbGQoeGZzX2lub190LCBpbm8pCkBAIC05NDYsNyArOTUwLDcgQEAKIAkJX19maWVsZChsb2ZmX3QsIG5ld19zaXplKQogCQlfX2ZpZWxkKGxvZmZfdCwgb2Zmc2V0KQogCQlfX2ZpZWxkKHNpemVfdCwgY291bnQpCi0JCV9fZmllbGQoaW50LCBmbGFncykKKwkJX19maWVsZChpbnQsIHR5cGUpCiAJCV9fZmllbGQoeGZzX2ZpbGVvZmZfdCwgc3RhcnRvZmYpCiAJCV9fZmllbGQoeGZzX2ZzYmxvY2tfdCwgc3RhcnRibG9jaykKIAkJX19maWVsZCh4ZnNfZmlsYmxrc190LCBibG9ja2NvdW50KQpAQCAtOTU4LDEzICs5NjIsMTMgQEAKIAkJX19lbnRyeS0+bmV3X3NpemUgPSBpcC0+aV9uZXdfc2l6ZTsKIAkJX19lbnRyeS0+b2Zmc2V0ID0gb2Zmc2V0OwogCQlfX2VudHJ5LT5jb3VudCA9IGNvdW50OwotCQlfX2VudHJ5LT5mbGFncyA9IGZsYWdzOworCQlfX2VudHJ5LT50eXBlID0gdHlwZTsKIAkJX19lbnRyeS0+c3RhcnRvZmYgPSBpcmVjID8gaXJlYy0+YnJfc3RhcnRvZmYgOiAwOwogCQlfX2VudHJ5LT5zdGFydGJsb2NrID0gaXJlYyA/IGlyZWMtPmJyX3N0YXJ0YmxvY2sgOiAwOwogCQlfX2VudHJ5LT5ibG9ja2NvdW50ID0gaXJlYyA/IGlyZWMtPmJyX2Jsb2NrY291bnQgOiAwOwogCSksCiAJVFBfcHJpbnRrKCJkZXYgJWQ6JWQgaW5vIDB4JWxseCBzaXplIDB4JWxseCBuZXdfc2l6ZSAweCVsbHggIgotCQkgICJvZmZzZXQgMHglbGx4IGNvdW50ICV6ZCBmbGFncyAlcyAiCisJCSAgIm9mZnNldCAweCVsbHggY291bnQgJXpkIHR5cGUgJXMgIgogCQkgICJzdGFydG9mZiAweCVsbHggc3RhcnRibG9jayAlbGxkIGJsb2NrY291bnQgMHglbGx4IiwKIAkJICBNQUpPUihfX2VudHJ5LT5kZXYpLCBNSU5PUihfX2VudHJ5LT5kZXYpLAogCQkgIF9fZW50cnktPmlubywKQEAgLTk3MiwyMCArOTc2LDIxIEBACiAJCSAgX19lbnRyeS0+bmV3X3NpemUsCiAJCSAgX19lbnRyeS0+b2Zmc2V0LAogCQkgIF9fZW50cnktPmNvdW50LAotCQkgIF9fcHJpbnRfZmxhZ3MoX19lbnRyeS0+ZmxhZ3MsICJ8IiwgQk1BUElfRkxBR1MpLAorCQkgIF9fcHJpbnRfc3ltYm9saWMoX19lbnRyeS0+dHlwZSwgWEZTX0lPX1RZUEVTKSwKIAkJICBfX2VudHJ5LT5zdGFydG9mZiwKIAkJICAoX19pbnQ2NF90KV9fZW50cnktPnN0YXJ0YmxvY2ssCiAJCSAgX19lbnRyeS0+YmxvY2tjb3VudCkKICkKIAogI2RlZmluZSBERUZJTkVfSU9NQVBfRVZFTlQobmFtZSkJXAotREVGSU5FX0VWRU5UKHhmc19pb21hcF9jbGFzcywgbmFtZSwJXAorREVGSU5FX0VWRU5UKHhmc19pbWFwX2NsYXNzLCBuYW1lLAlcCiAJVFBfUFJPVE8oc3RydWN0IHhmc19pbm9kZSAqaXAsIHhmc19vZmZfdCBvZmZzZXQsIHNzaXplX3QgY291bnQsCVwKLQkJIGludCBmbGFncywgc3RydWN0IHhmc19ibWJ0X2lyZWMgKmlyZWMpLAkJXAotCVRQX0FSR1MoaXAsIG9mZnNldCwgY291bnQsIGZsYWdzLCBpcmVjKSkKLURFRklORV9JT01BUF9FVkVOVCh4ZnNfaW9tYXBfZW50ZXIpOwotREVGSU5FX0lPTUFQX0VWRU5UKHhmc19pb21hcF9mb3VuZCk7Ci1ERUZJTkVfSU9NQVBfRVZFTlQoeGZzX2lvbWFwX2FsbG9jKTsKKwkJIGludCB0eXBlLCBzdHJ1Y3QgeGZzX2JtYnRfaXJlYyAqaXJlYyksCQlcCisJVFBfQVJHUyhpcCwgb2Zmc2V0LCBjb3VudCwgdHlwZSwgaXJlYykpCitERUZJTkVfSU9NQVBfRVZFTlQoeGZzX21hcF9ibG9ja3NfZm91bmQpOworREVGSU5FX0lPTUFQX0VWRU5UKHhmc19tYXBfYmxvY2tzX2FsbG9jKTsKK0RFRklORV9JT01BUF9FVkVOVCh4ZnNfZ2V0X2Jsb2Nrc19mb3VuZCk7CitERUZJTkVfSU9NQVBfRVZFTlQoeGZzX2dldF9ibG9ja3NfYWxsb2MpOwogCiBERUNMQVJFX0VWRU5UX0NMQVNTKHhmc19zaW1wbGVfaW9fY2xhc3MsCiAJVFBfUFJPVE8oc3RydWN0IHhmc19pbm9kZSAqaXAsIHhmc19vZmZfdCBvZmZzZXQsIHNzaXplX3QgY291bnQpLApAQCAtMTAyMiw2ICsxMDI3LDcgQEAKIAlUUF9BUkdTKGlwLCBvZmZzZXQsIGNvdW50KSkKIERFRklORV9TSU1QTEVfSU9fRVZFTlQoeGZzX2RlbGFsbG9jX2Vub3NwYyk7CiBERUZJTkVfU0lNUExFX0lPX0VWRU5UKHhmc191bndyaXR0ZW5fY29udmVydCk7CitERUZJTkVfU0lNUExFX0lPX0VWRU5UKHhmc19nZXRfYmxvY2tzX25vdGZvdW5kKTsKIAogCiBUUkFDRV9FVkVOVCh4ZnNfaXRydW5jYXRlX3N0YXJ0LApAQCAtMTQyMCw2ICsxNDI2LDcgQEAKIAlUUF9QUk9UTyhzdHJ1Y3QgeGZzX2FsbG9jX2FyZyAqYXJncyksIFwKIAlUUF9BUkdTKGFyZ3MpKQogREVGSU5FX0FMTE9DX0VWRU5UKHhmc19hbGxvY19leGFjdF9kb25lKTsKK0RFRklORV9BTExPQ19FVkVOVCh4ZnNfYWxsb2NfZXhhY3Rfbm90Zm91bmQpOwogREVGSU5FX0FMTE9DX0VWRU5UKHhmc19hbGxvY19leGFjdF9lcnJvcik7CiBERUZJTkVfQUxMT0NfRVZFTlQoeGZzX2FsbG9jX25lYXJfbm9taW5sZWZ0KTsKIERFRklORV9BTExPQ19FVkVOVCh4ZnNfYWxsb2NfbmVhcl9maXJzdCk7CmRpZmYgLS1naXQgYS9mcy94ZnMvcXVvdGEveGZzX2RxdW90LmMgYi9mcy94ZnMvcXVvdGEveGZzX2RxdW90LmMKaW5kZXggZmFmOGUxYS4uZDIyYWEzMSAxMDA2NDQKLS0tIGEvZnMveGZzL3F1b3RhL3hmc19kcXVvdC5jCisrKyBiL2ZzL3hmcy9xdW90YS94ZnNfZHF1b3QuYwpAQCAtMTQ5LDcgKzE0OSw2IEBACiAJQVNTRVJUKGxpc3RfZW1wdHkoJmRxcC0+cV9mcmVlbGlzdCkpOwogCiAJbXV0ZXhfZGVzdHJveSgmZHFwLT5xX3Fsb2NrKTsKLQlzdl9kZXN0cm95KCZkcXAtPnFfcGlud2FpdCk7CiAJa21lbV96b25lX2ZyZWUoeGZzX0dxbS0+cW1fZHF6b25lLCBkcXApOwogCiAJYXRvbWljX2RlYygmeGZzX0dxbS0+cW1fdG90YWxkcXVvdHMpOwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19hZy5oIGIvZnMveGZzL3hmc19hZy5oCmluZGV4IDYzYzdhMWEuLjU4NjMyY2MgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfYWcuaAorKysgYi9mcy94ZnMveGZzX2FnLmgKQEAgLTIyNyw3ICsyMjcsNyBAQAogCiAJYXRvbWljX3QgICAgICAgIHBhZ2ZfZnN0cm1zOyAgICAvKiAjIG9mIGZpbGVzdHJlYW1zIGFjdGl2ZSBpbiB0aGlzIEFHICovCiAKLQlyd2xvY2tfdAlwYWdfaWNpX2xvY2s7CS8qIGluY29yZSBpbm9kZSBsb2NrICovCisJc3BpbmxvY2tfdAlwYWdfaWNpX2xvY2s7CS8qIGluY29yZSBpbm9kZSBjYWNoZSBsb2NrICovCiAJc3RydWN0IHJhZGl4X3RyZWVfcm9vdCBwYWdfaWNpX3Jvb3Q7CS8qIGluY29yZSBpbm9kZSBjYWNoZSByb290ICovCiAJaW50CQlwYWdfaWNpX3JlY2xhaW1hYmxlOwkvKiByZWNsYWltYWJsZSBpbm9kZXMgKi8KIAlzdHJ1Y3QgbXV0ZXgJcGFnX2ljaV9yZWNsYWltX2xvY2s7CS8qIHNlcmlhbGlzYXRpb24gcG9pbnQgKi8KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfYWxsb2MuYyBiL2ZzL3hmcy94ZnNfYWxsb2MuYwppbmRleCAxMTJhYmM0Li5mYTg3MjNmIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2FsbG9jLmMKKysrIGIvZnMveGZzL3hmc19hbGxvYy5jCkBAIC01NzcsNjEgKzU3Nyw1OCBAQAogCXhmc19leHRsZW5fdAlybGVuOwkvKiBsZW5ndGggb2YgcmV0dXJuZWQgZXh0ZW50ICovCiAKIAlBU1NFUlQoYXJncy0+YWxpZ25tZW50ID09IDEpOworCiAJLyoKIAkgKiBBbGxvY2F0ZS9pbml0aWFsaXplIGEgY3Vyc29yIGZvciB0aGUgYnktbnVtYmVyIGZyZWVzcGFjZSBidHJlZS4KIAkgKi8KIAlibm9fY3VyID0geGZzX2FsbG9jYnRfaW5pdF9jdXJzb3IoYXJncy0+bXAsIGFyZ3MtPnRwLCBhcmdzLT5hZ2JwLAotCQlhcmdzLT5hZ25vLCBYRlNfQlROVU1fQk5PKTsKKwkJCQkJICBhcmdzLT5hZ25vLCBYRlNfQlROVU1fQk5PKTsKKwogCS8qCiAJICogTG9va3VwIGJubyBhbmQgbWlubGVuIGluIHRoZSBidHJlZSAobWlubGVuIGlzIGlycmVsZXZhbnQsIHJlYWxseSkuCiAJICogTG9vayBmb3IgdGhlIGNsb3Nlc3QgZnJlZSBibG9jayA8PSBibm8sIGl0IG11c3QgY29udGFpbiBibm8KIAkgKiBpZiBhbnkgZnJlZSBibG9jayBkb2VzLgogCSAqLwotCWlmICgoZXJyb3IgPSB4ZnNfYWxsb2NfbG9va3VwX2xlKGJub19jdXIsIGFyZ3MtPmFnYm5vLCBhcmdzLT5taW5sZW4sICZpKSkpCisJZXJyb3IgPSB4ZnNfYWxsb2NfbG9va3VwX2xlKGJub19jdXIsIGFyZ3MtPmFnYm5vLCBhcmdzLT5taW5sZW4sICZpKTsKKwlpZiAoZXJyb3IpCiAJCWdvdG8gZXJyb3IwOwotCWlmICghaSkgewotCQkvKgotCQkgKiBEaWRuJ3QgZmluZCBpdCwgcmV0dXJuIG51bGwuCi0JCSAqLwotCQl4ZnNfYnRyZWVfZGVsX2N1cnNvcihibm9fY3VyLCBYRlNfQlRSRUVfTk9FUlJPUik7Ci0JCWFyZ3MtPmFnYm5vID0gTlVMTEFHQkxPQ0s7Ci0JCXJldHVybiAwOwotCX0KKwlpZiAoIWkpCisJCWdvdG8gbm90X2ZvdW5kOworCiAJLyoKIAkgKiBHcmFiIHRoZSBmcmVlc3BhY2UgcmVjb3JkLgogCSAqLwotCWlmICgoZXJyb3IgPSB4ZnNfYWxsb2NfZ2V0X3JlYyhibm9fY3VyLCAmZmJubywgJmZsZW4sICZpKSkpCisJZXJyb3IgPSB4ZnNfYWxsb2NfZ2V0X3JlYyhibm9fY3VyLCAmZmJubywgJmZsZW4sICZpKTsKKwlpZiAoZXJyb3IpCiAJCWdvdG8gZXJyb3IwOwogCVhGU19XQU5UX0NPUlJVUFRFRF9HT1RPKGkgPT0gMSwgZXJyb3IwKTsKIAlBU1NFUlQoZmJubyA8PSBhcmdzLT5hZ2Jubyk7CiAJbWluZW5kID0gYXJncy0+YWdibm8gKyBhcmdzLT5taW5sZW47CiAJbWF4ZW5kID0gYXJncy0+YWdibm8gKyBhcmdzLT5tYXhsZW47CiAJZmVuZCA9IGZibm8gKyBmbGVuOworCiAJLyoKIAkgKiBHaXZlIHVwIGlmIHRoZSBmcmVlc3BhY2UgaXNuJ3QgbG9uZyBlbm91Z2ggZm9yIHRoZSBtaW5pbXVtIHJlcXVlc3QuCiAJICovCi0JaWYgKGZlbmQgPCBtaW5lbmQpIHsKLQkJeGZzX2J0cmVlX2RlbF9jdXJzb3IoYm5vX2N1ciwgWEZTX0JUUkVFX05PRVJST1IpOwotCQlhcmdzLT5hZ2JubyA9IE5VTExBR0JMT0NLOwotCQlyZXR1cm4gMDsKLQl9CisJaWYgKGZlbmQgPCBtaW5lbmQpCisJCWdvdG8gbm90X2ZvdW5kOworCiAJLyoKIAkgKiBFbmQgb2YgZXh0ZW50IHdpbGwgYmUgc21hbGxlciBvZiB0aGUgZnJlZXNwYWNlIGVuZCBhbmQgdGhlCiAJICogbWF4aW1hbCByZXF1ZXN0ZWQgZW5kLgotCSAqLwotCWVuZCA9IFhGU19BR0JMT0NLX01JTihmZW5kLCBtYXhlbmQpOwotCS8qCisJICoKIAkgKiBGaXggdGhlIGxlbmd0aCBhY2NvcmRpbmcgdG8gbW9kIGFuZCBwcm9kIGlmIGdpdmVuLgogCSAqLworCWVuZCA9IFhGU19BR0JMT0NLX01JTihmZW5kLCBtYXhlbmQpOwogCWFyZ3MtPmxlbiA9IGVuZCAtIGFyZ3MtPmFnYm5vOwogCXhmc19hbGxvY19maXhfbGVuKGFyZ3MpOwotCWlmICgheGZzX2FsbG9jX2ZpeF9taW5sZWZ0KGFyZ3MpKSB7Ci0JCXhmc19idHJlZV9kZWxfY3Vyc29yKGJub19jdXIsIFhGU19CVFJFRV9OT0VSUk9SKTsKLQkJcmV0dXJuIDA7Ci0JfQorCWlmICgheGZzX2FsbG9jX2ZpeF9taW5sZWZ0KGFyZ3MpKQorCQlnb3RvIG5vdF9mb3VuZDsKKwogCXJsZW4gPSBhcmdzLT5sZW47CiAJQVNTRVJUKGFyZ3MtPmFnYm5vICsgcmxlbiA8PSBmZW5kKTsKIAllbmQgPSBhcmdzLT5hZ2JubyArIHJsZW47CisKIAkvKgogCSAqIFdlIGFyZSBhbGxvY2F0aW5nIGFnYm5vIGZvciBybGVuIFthZ2JubyAuLiBlbmRdCiAJICogQWxsb2NhdGUvaW5pdGlhbGl6ZSBhIGN1cnNvciBmb3IgdGhlIGJ5LXNpemUgYnRyZWUuCkBAIC02NDAsMTYgKzYzNywyNSBAQAogCQlhcmdzLT5hZ25vLCBYRlNfQlROVU1fQ05UKTsKIAlBU1NFUlQoYXJncy0+YWdibm8gKyBhcmdzLT5sZW4gPD0KIAkJYmUzMl90b19jcHUoWEZTX0JVRl9UT19BR0YoYXJncy0+YWdicCktPmFnZl9sZW5ndGgpKTsKLQlpZiAoKGVycm9yID0geGZzX2FsbG9jX2ZpeHVwX3RyZWVzKGNudF9jdXIsIGJub19jdXIsIGZibm8sIGZsZW4sCi0JCQlhcmdzLT5hZ2JubywgYXJncy0+bGVuLCBYRlNBX0ZJWFVQX0JOT19PSykpKSB7CisJZXJyb3IgPSB4ZnNfYWxsb2NfZml4dXBfdHJlZXMoY250X2N1ciwgYm5vX2N1ciwgZmJubywgZmxlbiwgYXJncy0+YWdibm8sCisJCQkJICAgICAgYXJncy0+bGVuLCBYRlNBX0ZJWFVQX0JOT19PSyk7CisJaWYgKGVycm9yKSB7CiAJCXhmc19idHJlZV9kZWxfY3Vyc29yKGNudF9jdXIsIFhGU19CVFJFRV9FUlJPUik7CiAJCWdvdG8gZXJyb3IwOwogCX0KKwogCXhmc19idHJlZV9kZWxfY3Vyc29yKGJub19jdXIsIFhGU19CVFJFRV9OT0VSUk9SKTsKIAl4ZnNfYnRyZWVfZGVsX2N1cnNvcihjbnRfY3VyLCBYRlNfQlRSRUVfTk9FUlJPUik7CiAKLQl0cmFjZV94ZnNfYWxsb2NfZXhhY3RfZG9uZShhcmdzKTsKIAlhcmdzLT53YXNmcm9tZmwgPSAwOworCXRyYWNlX3hmc19hbGxvY19leGFjdF9kb25lKGFyZ3MpOworCXJldHVybiAwOworCitub3RfZm91bmQ6CisJLyogRGlkbid0IGZpbmQgaXQsIHJldHVybiBudWxsLiAqLworCXhmc19idHJlZV9kZWxfY3Vyc29yKGJub19jdXIsIFhGU19CVFJFRV9OT0VSUk9SKTsKKwlhcmdzLT5hZ2JubyA9IE5VTExBR0JMT0NLOworCXRyYWNlX3hmc19hbGxvY19leGFjdF9ub3Rmb3VuZChhcmdzKTsKIAlyZXR1cm4gMDsKIAogZXJyb3IwOgpAQCAtNjU5LDYgKzY2NSw5NSBAQAogfQogCiAvKgorICogU2VhcmNoIHRoZSBidHJlZSBpbiBhIGdpdmVuIGRpcmVjdGlvbiB2aWEgdGhlIHNlYXJjaCBjdXJzb3IgYW5kIGNvbXBhcmUKKyAqIHRoZSByZWNvcmRzIGZvdW5kIGFnYWluc3QgdGhlIGdvb2QgZXh0ZW50IHdlJ3ZlIGFscmVhZHkgZm91bmQuCisgKi8KK1NUQVRJQyBpbnQKK3hmc19hbGxvY19maW5kX2Jlc3RfZXh0ZW50KAorCXN0cnVjdCB4ZnNfYWxsb2NfYXJnCSphcmdzLAkvKiBhbGxvY2F0aW9uIGFyZ3VtZW50IHN0cnVjdHVyZSAqLworCXN0cnVjdCB4ZnNfYnRyZWVfY3VyCSoqZ2N1ciwJLyogZ29vZCBjdXJzb3IgKi8KKwlzdHJ1Y3QgeGZzX2J0cmVlX2N1cgkqKnNjdXIsCS8qIHNlYXJjaGluZyBjdXJzb3IgKi8KKwl4ZnNfYWdibG9ja190CQlnZGlmZiwJLyogZGlmZmVyZW5jZSBmb3Igc2VhcmNoIGNvbXBhcmlzb24gKi8KKwl4ZnNfYWdibG9ja190CQkqc2JubywJLyogZXh0ZW50IGZvdW5kIGJ5IHNlYXJjaCAqLworCXhmc19leHRsZW5fdAkJKnNsZW4sCisJeGZzX2V4dGxlbl90CQkqc2xlbmEsCS8qIGFsaWduZWQgbGVuZ3RoICovCisJaW50CQkJZGlyKQkvKiAwID0gc2VhcmNoIHJpZ2h0LCAxID0gc2VhcmNoIGxlZnQgKi8KK3sKKwl4ZnNfYWdibG9ja190CQlibm87CisJeGZzX2FnYmxvY2tfdAkJbmV3OworCXhmc19hZ2Jsb2NrX3QJCXNkaWZmOworCWludAkJCWVycm9yOworCWludAkJCWk7CisKKwkvKiBUaGUgZ29vZCBleHRlbnQgaXMgcGVyZmVjdCwgbm8gbmVlZCB0byAgc2VhcmNoLiAqLworCWlmICghZ2RpZmYpCisJCWdvdG8gb3V0X3VzZV9nb29kOworCisJLyoKKwkgKiBMb29rIHVudGlsIHdlIGZpbmQgYSBiZXR0ZXIgb25lLCBydW4gb3V0IG9mIHNwYWNlIG9yIHJ1biBvZmYgdGhlIGVuZC4KKwkgKi8KKwlkbyB7CisJCWVycm9yID0geGZzX2FsbG9jX2dldF9yZWMoKnNjdXIsIHNibm8sIHNsZW4sICZpKTsKKwkJaWYgKGVycm9yKQorCQkJZ290byBlcnJvcjA7CisJCVhGU19XQU5UX0NPUlJVUFRFRF9HT1RPKGkgPT0gMSwgZXJyb3IwKTsKKwkJeGZzX2FsbG9jX2NvbXB1dGVfYWxpZ25lZCgqc2JubywgKnNsZW4sIGFyZ3MtPmFsaWdubWVudCwKKwkJCQkJICBhcmdzLT5taW5sZW4sICZibm8sIHNsZW5hKTsKKworCQkvKgorCQkgKiBUaGUgZ29vZCBleHRlbnQgaXMgY2xvc2VyIHRoYW4gdGhpcyBvbmUuCisJCSAqLworCQlpZiAoIWRpcikgeworCQkJaWYgKGJubyA+PSBhcmdzLT5hZ2JubyArIGdkaWZmKQorCQkJCWdvdG8gb3V0X3VzZV9nb29kOworCQl9IGVsc2UgeworCQkJaWYgKGJubyA8PSBhcmdzLT5hZ2JubyAtIGdkaWZmKQorCQkJCWdvdG8gb3V0X3VzZV9nb29kOworCQl9CisKKwkJLyoKKwkJICogU2FtZSBkaXN0YW5jZSwgY29tcGFyZSBsZW5ndGggYW5kIHBpY2sgdGhlIGJlc3QuCisJCSAqLworCQlpZiAoKnNsZW5hID49IGFyZ3MtPm1pbmxlbikgeworCQkJYXJncy0+bGVuID0gWEZTX0VYVExFTl9NSU4oKnNsZW5hLCBhcmdzLT5tYXhsZW4pOworCQkJeGZzX2FsbG9jX2ZpeF9sZW4oYXJncyk7CisKKwkJCXNkaWZmID0geGZzX2FsbG9jX2NvbXB1dGVfZGlmZihhcmdzLT5hZ2JubywgYXJncy0+bGVuLAorCQkJCQkJICAgICAgIGFyZ3MtPmFsaWdubWVudCwgKnNibm8sCisJCQkJCQkgICAgICAgKnNsZW4sICZuZXcpOworCisJCQkvKgorCQkJICogQ2hvb3NlIGNsb3NlciBzaXplIGFuZCBpbnZhbGlkYXRlIG90aGVyIGN1cnNvci4KKwkJCSAqLworCQkJaWYgKHNkaWZmIDwgZ2RpZmYpCisJCQkJZ290byBvdXRfdXNlX3NlYXJjaDsKKwkJCWdvdG8gb3V0X3VzZV9nb29kOworCQl9CisKKwkJaWYgKCFkaXIpCisJCQllcnJvciA9IHhmc19idHJlZV9pbmNyZW1lbnQoKnNjdXIsIDAsICZpKTsKKwkJZWxzZQorCQkJZXJyb3IgPSB4ZnNfYnRyZWVfZGVjcmVtZW50KCpzY3VyLCAwLCAmaSk7CisJCWlmIChlcnJvcikKKwkJCWdvdG8gZXJyb3IwOworCX0gd2hpbGUgKGkpOworCitvdXRfdXNlX2dvb2Q6CisJeGZzX2J0cmVlX2RlbF9jdXJzb3IoKnNjdXIsIFhGU19CVFJFRV9OT0VSUk9SKTsKKwkqc2N1ciA9IE5VTEw7CisJcmV0dXJuIDA7CisKK291dF91c2Vfc2VhcmNoOgorCXhmc19idHJlZV9kZWxfY3Vyc29yKCpnY3VyLCBYRlNfQlRSRUVfTk9FUlJPUik7CisJKmdjdXIgPSBOVUxMOworCXJldHVybiAwOworCitlcnJvcjA6CisJLyogY2FsbGVyIGludmFsaWRhdGVzIGN1cnNvcnMgKi8KKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qCiAgKiBBbGxvY2F0ZSBhIHZhcmlhYmxlIGV4dGVudCBuZWFyIGJubyBpbiB0aGUgYWxsb2NhdGlvbiBncm91cCBhZ25vLgogICogRXh0ZW50J3MgbGVuZ3RoIChyZXR1cm5lZCBpbiBsZW4pIHdpbGwgYmUgYmV0d2VlbiBtaW5sZW4gYW5kIG1heGxlbiwKICAqIGFuZCBvZiB0aGUgZm9ybSBrICogcHJvZCArIG1vZCB1bmxlc3MgdGhlcmUncyBub3RoaW5nIHRoYXQgbGFyZ2UuCkBAIC05MjUsMjAzICsxMDIwLDQ1IEBACiAJCQl9CiAJCX0KIAl9IHdoaWxlIChibm9fY3VyX2x0IHx8IGJub19jdXJfZ3QpOworCiAJLyoKIAkgKiBHb3QgYm90aCBjdXJzb3JzIHN0aWxsIGFjdGl2ZSwgbmVlZCB0byBmaW5kIGJldHRlciBlbnRyeS4KIAkgKi8KIAlpZiAoYm5vX2N1cl9sdCAmJiBibm9fY3VyX2d0KSB7Ci0JCS8qCi0JCSAqIExlZnQgc2lkZSBpcyBsb25nIGVub3VnaCwgbG9vayBmb3IgYSByaWdodCBzaWRlIGVudHJ5LgotCQkgKi8KIAkJaWYgKGx0bGVuYSA+PSBhcmdzLT5taW5sZW4pIHsKIAkJCS8qCi0JCQkgKiBGaXggdXAgdGhlIGxlbmd0aC4KKwkJCSAqIExlZnQgc2lkZSBpcyBnb29kLCBsb29rIGZvciBhIHJpZ2h0IHNpZGUgZW50cnkuCiAJCQkgKi8KIAkJCWFyZ3MtPmxlbiA9IFhGU19FWFRMRU5fTUlOKGx0bGVuYSwgYXJncy0+bWF4bGVuKTsKIAkJCXhmc19hbGxvY19maXhfbGVuKGFyZ3MpOwotCQkJcmxlbiA9IGFyZ3MtPmxlbjsKLQkJCWx0ZGlmZiA9IHhmc19hbGxvY19jb21wdXRlX2RpZmYoYXJncy0+YWdibm8sIHJsZW4sCisJCQlsdGRpZmYgPSB4ZnNfYWxsb2NfY29tcHV0ZV9kaWZmKGFyZ3MtPmFnYm5vLCBhcmdzLT5sZW4sCiAJCQkJYXJncy0+YWxpZ25tZW50LCBsdGJubywgbHRsZW4sICZsdG5ldyk7CisKKwkJCWVycm9yID0geGZzX2FsbG9jX2ZpbmRfYmVzdF9leHRlbnQoYXJncywKKwkJCQkJCSZibm9fY3VyX2x0LCAmYm5vX2N1cl9ndCwKKwkJCQkJCWx0ZGlmZiwgJmd0Ym5vLCAmZ3RsZW4sICZndGxlbmEsCisJCQkJCQkwIC8qIHNlYXJjaCByaWdodCAqLyk7CisJCX0gZWxzZSB7CisJCQlBU1NFUlQoZ3RsZW5hID49IGFyZ3MtPm1pbmxlbik7CisKIAkJCS8qCi0JCQkgKiBOb3QgcGVyZmVjdC4KLQkJCSAqLwotCQkJaWYgKGx0ZGlmZikgewotCQkJCS8qCi0JCQkJICogTG9vayB1bnRpbCB3ZSBmaW5kIGEgYmV0dGVyIG9uZSwgcnVuIG91dCBvZgotCQkJCSAqIHNwYWNlLCBvciBydW4gb2ZmIHRoZSBlbmQuCi0JCQkJICovCi0JCQkJd2hpbGUgKGJub19jdXJfbHQgJiYgYm5vX2N1cl9ndCkgewotCQkJCQlpZiAoKGVycm9yID0geGZzX2FsbG9jX2dldF9yZWMoCi0JCQkJCQkJYm5vX2N1cl9ndCwgJmd0Ym5vLAotCQkJCQkJCSZndGxlbiwgJmkpKSkKLQkJCQkJCWdvdG8gZXJyb3IwOwotCQkJCQlYRlNfV0FOVF9DT1JSVVBURURfR09UTyhpID09IDEsIGVycm9yMCk7Ci0JCQkJCXhmc19hbGxvY19jb21wdXRlX2FsaWduZWQoZ3Ribm8sIGd0bGVuLAotCQkJCQkJYXJncy0+YWxpZ25tZW50LCBhcmdzLT5taW5sZW4sCi0JCQkJCQkmZ3Ribm9hLCAmZ3RsZW5hKTsKLQkJCQkJLyoKLQkJCQkJICogVGhlIGxlZnQgb25lIGlzIGNsZWFybHkgYmV0dGVyLgotCQkJCQkgKi8KLQkJCQkJaWYgKGd0Ym5vYSA+PSBhcmdzLT5hZ2JubyArIGx0ZGlmZikgewotCQkJCQkJeGZzX2J0cmVlX2RlbF9jdXJzb3IoCi0JCQkJCQkJYm5vX2N1cl9ndCwKLQkJCQkJCQlYRlNfQlRSRUVfTk9FUlJPUik7Ci0JCQkJCQlibm9fY3VyX2d0ID0gTlVMTDsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJCS8qCi0JCQkJCSAqIElmIHdlIHJlYWNoIGEgYmlnIGVub3VnaCBlbnRyeSwKLQkJCQkJICogY29tcGFyZSB0aGUgdHdvIGFuZCBwaWNrIHRoZSBiZXN0LgotCQkJCQkgKi8KLQkJCQkJaWYgKGd0bGVuYSA+PSBhcmdzLT5taW5sZW4pIHsKLQkJCQkJCWFyZ3MtPmxlbiA9Ci0JCQkJCQkJWEZTX0VYVExFTl9NSU4oZ3RsZW5hLAotCQkJCQkJCQlhcmdzLT5tYXhsZW4pOwotCQkJCQkJeGZzX2FsbG9jX2ZpeF9sZW4oYXJncyk7Ci0JCQkJCQlybGVuID0gYXJncy0+bGVuOwotCQkJCQkJZ3RkaWZmID0geGZzX2FsbG9jX2NvbXB1dGVfZGlmZigKLQkJCQkJCQlhcmdzLT5hZ2JubywgcmxlbiwKLQkJCQkJCQlhcmdzLT5hbGlnbm1lbnQsCi0JCQkJCQkJZ3Ribm8sIGd0bGVuLCAmZ3RuZXcpOwotCQkJCQkJLyoKLQkJCQkJCSAqIFJpZ2h0IHNpZGUgaXMgYmV0dGVyLgotCQkJCQkJICovCi0JCQkJCQlpZiAoZ3RkaWZmIDwgbHRkaWZmKSB7Ci0JCQkJCQkJeGZzX2J0cmVlX2RlbF9jdXJzb3IoCi0JCQkJCQkJCWJub19jdXJfbHQsCi0JCQkJCQkJCVhGU19CVFJFRV9OT0VSUk9SKTsKLQkJCQkJCQlibm9fY3VyX2x0ID0gTlVMTDsKLQkJCQkJCX0KLQkJCQkJCS8qCi0JCQkJCQkgKiBMZWZ0IHNpZGUgaXMgYmV0dGVyLgotCQkJCQkJICovCi0JCQkJCQllbHNlIHsKLQkJCQkJCQl4ZnNfYnRyZWVfZGVsX2N1cnNvcigKLQkJCQkJCQkJYm5vX2N1cl9ndCwKLQkJCQkJCQkJWEZTX0JUUkVFX05PRVJST1IpOwotCQkJCQkJCWJub19jdXJfZ3QgPSBOVUxMOwotCQkJCQkJfQotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQkJLyoKLQkJCQkJICogRmVsbCBvZmYgdGhlIHJpZ2h0IGVuZC4KLQkJCQkJICovCi0JCQkJCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfaW5jcmVtZW50KAotCQkJCQkJCWJub19jdXJfZ3QsIDAsICZpKSkpCi0JCQkJCQlnb3RvIGVycm9yMDsKLQkJCQkJaWYgKCFpKSB7Ci0JCQkJCQl4ZnNfYnRyZWVfZGVsX2N1cnNvcigKLQkJCQkJCQlibm9fY3VyX2d0LAotCQkJCQkJCVhGU19CVFJFRV9OT0VSUk9SKTsKLQkJCQkJCWJub19jdXJfZ3QgPSBOVUxMOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQkvKgotCQkJICogVGhlIGxlZnQgc2lkZSBpcyBwZXJmZWN0LCB0cmFzaCB0aGUgcmlnaHQgc2lkZS4KLQkJCSAqLwotCQkJZWxzZSB7Ci0JCQkJeGZzX2J0cmVlX2RlbF9jdXJzb3IoYm5vX2N1cl9ndCwKLQkJCQkJCSAgICAgWEZTX0JUUkVFX05PRVJST1IpOwotCQkJCWJub19jdXJfZ3QgPSBOVUxMOwotCQkJfQotCQl9Ci0JCS8qCi0JCSAqIEl0J3MgdGhlIHJpZ2h0IHNpZGUgdGhhdCB3YXMgZm91bmQgZmlyc3QsIGxvb2sgbGVmdC4KLQkJICovCi0JCWVsc2UgewotCQkJLyoKLQkJCSAqIEZpeCB1cCB0aGUgbGVuZ3RoLgorCQkJICogUmlnaHQgc2lkZSBpcyBnb29kLCBsb29rIGZvciBhIGxlZnQgc2lkZSBlbnRyeS4KIAkJCSAqLwogCQkJYXJncy0+bGVuID0gWEZTX0VYVExFTl9NSU4oZ3RsZW5hLCBhcmdzLT5tYXhsZW4pOwogCQkJeGZzX2FsbG9jX2ZpeF9sZW4oYXJncyk7Ci0JCQlybGVuID0gYXJncy0+bGVuOwotCQkJZ3RkaWZmID0geGZzX2FsbG9jX2NvbXB1dGVfZGlmZihhcmdzLT5hZ2JubywgcmxlbiwKKwkJCWd0ZGlmZiA9IHhmc19hbGxvY19jb21wdXRlX2RpZmYoYXJncy0+YWdibm8sIGFyZ3MtPmxlbiwKIAkJCQlhcmdzLT5hbGlnbm1lbnQsIGd0Ym5vLCBndGxlbiwgJmd0bmV3KTsKLQkJCS8qCi0JCQkgKiBSaWdodCBzaWRlIGVudHJ5IGlzbid0IHBlcmZlY3QuCi0JCQkgKi8KLQkJCWlmIChndGRpZmYpIHsKLQkJCQkvKgotCQkJCSAqIExvb2sgdW50aWwgd2UgZmluZCBhIGJldHRlciBvbmUsIHJ1biBvdXQgb2YKLQkJCQkgKiBzcGFjZSwgb3IgcnVuIG9mZiB0aGUgZW5kLgotCQkJCSAqLwotCQkJCXdoaWxlIChibm9fY3VyX2x0ICYmIGJub19jdXJfZ3QpIHsKLQkJCQkJaWYgKChlcnJvciA9IHhmc19hbGxvY19nZXRfcmVjKAotCQkJCQkJCWJub19jdXJfbHQsICZsdGJubywKLQkJCQkJCQkmbHRsZW4sICZpKSkpCi0JCQkJCQlnb3RvIGVycm9yMDsKLQkJCQkJWEZTX1dBTlRfQ09SUlVQVEVEX0dPVE8oaSA9PSAxLCBlcnJvcjApOwotCQkJCQl4ZnNfYWxsb2NfY29tcHV0ZV9hbGlnbmVkKGx0Ym5vLCBsdGxlbiwKLQkJCQkJCWFyZ3MtPmFsaWdubWVudCwgYXJncy0+bWlubGVuLAotCQkJCQkJJmx0Ym5vYSwgJmx0bGVuYSk7Ci0JCQkJCS8qCi0JCQkJCSAqIFRoZSByaWdodCBvbmUgaXMgY2xlYXJseSBiZXR0ZXIuCi0JCQkJCSAqLwotCQkJCQlpZiAobHRibm9hIDw9IGFyZ3MtPmFnYm5vIC0gZ3RkaWZmKSB7Ci0JCQkJCQl4ZnNfYnRyZWVfZGVsX2N1cnNvcigKLQkJCQkJCQlibm9fY3VyX2x0LAotCQkJCQkJCVhGU19CVFJFRV9OT0VSUk9SKTsKLQkJCQkJCWJub19jdXJfbHQgPSBOVUxMOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQkJLyoKLQkJCQkJICogSWYgd2UgcmVhY2ggYSBiaWcgZW5vdWdoIGVudHJ5LAotCQkJCQkgKiBjb21wYXJlIHRoZSB0d28gYW5kIHBpY2sgdGhlIGJlc3QuCi0JCQkJCSAqLwotCQkJCQlpZiAobHRsZW5hID49IGFyZ3MtPm1pbmxlbikgewotCQkJCQkJYXJncy0+bGVuID0gWEZTX0VYVExFTl9NSU4oCi0JCQkJCQkJbHRsZW5hLCBhcmdzLT5tYXhsZW4pOwotCQkJCQkJeGZzX2FsbG9jX2ZpeF9sZW4oYXJncyk7Ci0JCQkJCQlybGVuID0gYXJncy0+bGVuOwotCQkJCQkJbHRkaWZmID0geGZzX2FsbG9jX2NvbXB1dGVfZGlmZigKLQkJCQkJCQlhcmdzLT5hZ2JubywgcmxlbiwKLQkJCQkJCQlhcmdzLT5hbGlnbm1lbnQsCi0JCQkJCQkJbHRibm8sIGx0bGVuLCAmbHRuZXcpOwotCQkJCQkJLyoKLQkJCQkJCSAqIExlZnQgc2lkZSBpcyBiZXR0ZXIuCi0JCQkJCQkgKi8KLQkJCQkJCWlmIChsdGRpZmYgPCBndGRpZmYpIHsKLQkJCQkJCQl4ZnNfYnRyZWVfZGVsX2N1cnNvcigKLQkJCQkJCQkJYm5vX2N1cl9ndCwKLQkJCQkJCQkJWEZTX0JUUkVFX05PRVJST1IpOwotCQkJCQkJCWJub19jdXJfZ3QgPSBOVUxMOwotCQkJCQkJfQotCQkJCQkJLyoKLQkJCQkJCSAqIFJpZ2h0IHNpZGUgaXMgYmV0dGVyLgotCQkJCQkJICovCi0JCQkJCQllbHNlIHsKLQkJCQkJCQl4ZnNfYnRyZWVfZGVsX2N1cnNvcigKLQkJCQkJCQkJYm5vX2N1cl9sdCwKLQkJCQkJCQkJWEZTX0JUUkVFX05PRVJST1IpOwotCQkJCQkJCWJub19jdXJfbHQgPSBOVUxMOwotCQkJCQkJfQotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQkJLyoKLQkJCQkJICogRmVsbCBvZmYgdGhlIGxlZnQgZW5kLgotCQkJCQkgKi8KLQkJCQkJaWYgKChlcnJvciA9IHhmc19idHJlZV9kZWNyZW1lbnQoCi0JCQkJCQkJYm5vX2N1cl9sdCwgMCwgJmkpKSkKLQkJCQkJCWdvdG8gZXJyb3IwOwotCQkJCQlpZiAoIWkpIHsKLQkJCQkJCXhmc19idHJlZV9kZWxfY3Vyc29yKGJub19jdXJfbHQsCi0JCQkJCQkJWEZTX0JUUkVFX05PRVJST1IpOwotCQkJCQkJYm5vX2N1cl9sdCA9IE5VTEw7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCS8qCi0JCQkgKiBUaGUgcmlnaHQgc2lkZSBpcyBwZXJmZWN0LCB0cmFzaCB0aGUgbGVmdCBzaWRlLgotCQkJICovCi0JCQllbHNlIHsKLQkJCQl4ZnNfYnRyZWVfZGVsX2N1cnNvcihibm9fY3VyX2x0LAotCQkJCQlYRlNfQlRSRUVfTk9FUlJPUik7Ci0JCQkJYm5vX2N1cl9sdCA9IE5VTEw7Ci0JCQl9CisKKwkJCWVycm9yID0geGZzX2FsbG9jX2ZpbmRfYmVzdF9leHRlbnQoYXJncywKKwkJCQkJCSZibm9fY3VyX2d0LCAmYm5vX2N1cl9sdCwKKwkJCQkJCWd0ZGlmZiwgJmx0Ym5vLCAmbHRsZW4sICZsdGxlbmEsCisJCQkJCQkxIC8qIHNlYXJjaCBsZWZ0ICovKTsKIAkJfQorCisJCWlmIChlcnJvcikKKwkJCWdvdG8gZXJyb3IwOwogCX0KKwogCS8qCiAJICogSWYgd2UgY291bGRuJ3QgZ2V0IGFueXRoaW5nLCBnaXZlIHVwLgogCSAqLwpAQCAtMTEzMCw2ICsxMDY3LDcgQEAKIAkJYXJncy0+YWdibm8gPSBOVUxMQUdCTE9DSzsKIAkJcmV0dXJuIDA7CiAJfQorCiAJLyoKIAkgKiBBdCB0aGlzIHBvaW50IHdlIGhhdmUgc2VsZWN0ZWQgYSBmcmVlc3BhY2UgZW50cnksIGVpdGhlciB0byB0aGUKIAkgKiBsZWZ0IG9yIHRvIHRoZSByaWdodC4gIElmIGl0J3Mgb24gdGhlIHJpZ2h0LCBjb3B5IGFsbCB0aGUKQEAgLTExNDYsNiArMTA4NCw3IEBACiAJCWogPSAxOwogCX0gZWxzZQogCQlqID0gMDsKKwogCS8qCiAJICogRml4IHVwIHRoZSBsZW5ndGggYW5kIGNvbXB1dGUgdGhlIHVzZWZ1bCBhZGRyZXNzLgogCSAqLwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19hdHRyX2xlYWYuYyBiL2ZzL3hmcy94ZnNfYXR0cl9sZWFmLmMKaW5kZXggYTZjZmY4ZS4uNzFlOTBkYzIgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfYXR0cl9sZWFmLmMKKysrIGIvZnMveGZzL3hmc19hdHRyX2xlYWYuYwpAQCAtNjM3LDcgKzYzNyw3IEBACiAJICogSXQgZGlkbid0IGFsbCBmaXQsIHNvIHdlIGhhdmUgdG8gc29ydCBldmVyeXRoaW5nIG9uIGhhc2h2YWwuCiAJICovCiAJc2JzaXplID0gc2YtPmhkci5jb3VudCAqIHNpemVvZigqc2J1Zik7Ci0Jc2JwID0gc2J1ZiA9IGttZW1fYWxsb2Moc2JzaXplLCBLTV9TTEVFUCk7CisJc2JwID0gc2J1ZiA9IGttZW1fYWxsb2Moc2JzaXplLCBLTV9TTEVFUCB8IEtNX05PRlMpOwogCiAJLyoKIAkgKiBTY2FuIHRoZSBhdHRyaWJ1dGUgbGlzdCBmb3IgdGhlIHJlc3Qgb2YgdGhlIGVudHJpZXMsIHN0b3JpbmcKQEAgLTIzODYsNyArMjM4Niw3IEBACiAJCQkJYXJncy5kcCA9IGNvbnRleHQtPmRwOwogCQkJCWFyZ3Mud2hpY2hmb3JrID0gWEZTX0FUVFJfRk9SSzsKIAkJCQlhcmdzLnZhbHVlbGVuID0gdmFsdWVsZW47Ci0JCQkJYXJncy52YWx1ZSA9IGttZW1fYWxsb2ModmFsdWVsZW4sIEtNX1NMRUVQKTsKKwkJCQlhcmdzLnZhbHVlID0ga21lbV9hbGxvYyh2YWx1ZWxlbiwgS01fU0xFRVAgfCBLTV9OT0ZTKTsKIAkJCQlhcmdzLnJtdGJsa25vID0gYmUzMl90b19jcHUobmFtZV9ybXQtPnZhbHVlYmxrKTsKIAkJCQlhcmdzLnJtdGJsa2NudCA9IFhGU19CX1RPX0ZTQihhcmdzLmRwLT5pX21vdW50LCB2YWx1ZWxlbik7CiAJCQkJcmV0dmFsID0geGZzX2F0dHJfcm10dmFsX2dldCgmYXJncyk7CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2J0cmVlLmMgYi9mcy94ZnMveGZzX2J0cmVlLmMKaW5kZXggMDRmOWNjYS4uMmY5ZTk3YyAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19idHJlZS5jCisrKyBiL2ZzL3hmcy94ZnNfYnRyZWUuYwpAQCAtNjM0LDkgKzYzNCw4IEBACiAJCXJldHVybiBlcnJvcjsKIAl9CiAJQVNTRVJUKCFicCB8fCAhWEZTX0JVRl9HRVRFUlJPUihicCkpOwotCWlmIChicCAhPSBOVUxMKSB7CisJaWYgKGJwKQogCQlYRlNfQlVGX1NFVF9WVFlQRV9SRUYoYnAsIEJfRlNfTUFQLCByZWZ2YWwpOwotCX0KIAkqYnBwID0gYnA7CiAJcmV0dXJuIDA7CiB9CkBAIC05NDQsMTMgKzk0MywxMyBAQAogCXN3aXRjaCAoY3VyLT5iY19idG51bSkgewogCWNhc2UgWEZTX0JUTlVNX0JOTzoKIAljYXNlIFhGU19CVE5VTV9DTlQ6Ci0JCVhGU19CVUZfU0VUX1ZUWVBFX1JFRigqYnBwLCBCX0ZTX01BUCwgWEZTX0FMTE9DX0JUUkVFX1JFRik7CisJCVhGU19CVUZfU0VUX1ZUWVBFX1JFRihicCwgQl9GU19NQVAsIFhGU19BTExPQ19CVFJFRV9SRUYpOwogCQlicmVhazsKIAljYXNlIFhGU19CVE5VTV9JTk86Ci0JCVhGU19CVUZfU0VUX1ZUWVBFX1JFRigqYnBwLCBCX0ZTX0lOT01BUCwgWEZTX0lOT19CVFJFRV9SRUYpOworCQlYRlNfQlVGX1NFVF9WVFlQRV9SRUYoYnAsIEJfRlNfSU5PTUFQLCBYRlNfSU5PX0JUUkVFX1JFRik7CiAJCWJyZWFrOwogCWNhc2UgWEZTX0JUTlVNX0JNQVA6Ci0JCVhGU19CVUZfU0VUX1ZUWVBFX1JFRigqYnBwLCBCX0ZTX01BUCwgWEZTX0JNQVBfQlRSRUVfUkVGKTsKKwkJWEZTX0JVRl9TRVRfVlRZUEVfUkVGKGJwLCBCX0ZTX01BUCwgWEZTX0JNQVBfQlRSRUVfUkVGKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJQVNTRVJUKDApOwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19idWZfaXRlbS5jIGIvZnMveGZzL3hmc19idWZfaXRlbS5jCmluZGV4IDI2ODZkMGQuLmVkMmI2NWYgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfYnVmX2l0ZW0uYworKysgYi9mcy94ZnMveGZzX2J1Zl9pdGVtLmMKQEAgLTE0Miw3ICsxNDIsNyBAQAogI2VuZGlmCiAKIFNUQVRJQyB2b2lkCXhmc19idWZfZXJyb3JfcmVsc2UoeGZzX2J1Zl90ICpicCk7Ci1TVEFUSUMgdm9pZAl4ZnNfYnVmX2RvX2NhbGxiYWNrcyh4ZnNfYnVmX3QgKmJwLCB4ZnNfbG9nX2l0ZW1fdCAqbGlwKTsKK1NUQVRJQyB2b2lkCXhmc19idWZfZG9fY2FsbGJhY2tzKHN0cnVjdCB4ZnNfYnVmICpicCk7CiAKIC8qCiAgKiBUaGlzIHJldHVybnMgdGhlIG51bWJlciBvZiBsb2cgaW92ZWNzIG5lZWRlZCB0byBsb2cgdGhlCkBAIC00NTAsNyArNDUwLDcgQEAKIAkJICogeGZzX3RyYW5zX2FpbF9kZWxldGUoKSBkcm9wcyB0aGUgQUlMIGxvY2suCiAJCSAqLwogCQlpZiAoYmlwLT5ibGlfZmxhZ3MgJiBYRlNfQkxJX1NUQUxFX0lOT0RFKSB7Ci0JCQl4ZnNfYnVmX2RvX2NhbGxiYWNrcyhicCwgKHhmc19sb2dfaXRlbV90ICopYmlwKTsKKwkJCXhmc19idWZfZG9fY2FsbGJhY2tzKGJwKTsKIAkJCVhGU19CVUZfU0VUX0ZTUFJJVkFURShicCwgTlVMTCk7CiAJCQlYRlNfQlVGX0NMUl9JT0RPTkVfRlVOQyhicCk7CiAJCX0gZWxzZSB7CkBAIC05MTgsMTUgKzkxOCwyNiBAQAogCVhGU19CVUZfU0VUX0lPRE9ORV9GVU5DKGJwLCB4ZnNfYnVmX2lvZG9uZV9jYWxsYmFja3MpOwogfQogCisvKgorICogV2UgY2FuIGhhdmUgbWFueSBjYWxsYmFja3Mgb24gYSBidWZmZXIuIFJ1bm5pbmcgdGhlIGNhbGxiYWNrcyBpbmRpdmlkdWFsbHkKKyAqIGNhbiBjYXVzZSBhIGxvdCBvZiBjb250ZW50aW9uIG9uIHRoZSBBSUwgbG9jaywgc28gd2UgYWxsb3cgZm9yIGEgc2luZ2xlCisgKiBjYWxsYmFjayB0byBiZSBhYmxlIHRvIHNjYW4gdGhlIHJlbWFpbmluZyBsaXAtPmxpX2Jpb19saXN0IGZvciBvdGhlciBpdGVtcworICogb2YgdGhlIHNhbWUgdHlwZSBhbmQgY2FsbGJhY2sgdG8gYmUgcHJvY2Vzc2VkIGluIHRoZSBmaXJzdCBjYWxsLgorICoKKyAqIEFzIGEgcmVzdWx0LCB0aGUgbG9vcCB3YWxraW5nIHRoZSBjYWxsYmFjayBsaXN0IGJlbG93IHdpbGwgYWxzbyBtb2RpZnkgdGhlCisgKiBsaXN0LiBpdCByZW1vdmVzIHRoZSBmaXJzdCBpdGVtIGZyb20gdGhlIGxpc3QgYW5kIHRoZW4gcnVucyB0aGUgY2FsbGJhY2suCisgKiBUaGUgbG9vcCB0aGVuIHJlc3RhcnRzIGZyb20gdGhlIG5ldyBoZWFkIG9mIHRoZSBsaXN0LiBUaGlzIGFsbG93cyB0aGUKKyAqIGNhbGxiYWNrIHRvIHNjYW4gYW5kIG1vZGlmeSB0aGUgbGlzdCBhdHRhY2hlZCB0byB0aGUgYnVmZmVyIGFuZCB3ZSBkb24ndAorICogaGF2ZSB0byBjYXJlIGFib3V0IG1haW50YWluaW5nIGEgbmV4dCBpdGVtIHBvaW50ZXIuCisgKi8KIFNUQVRJQyB2b2lkCiB4ZnNfYnVmX2RvX2NhbGxiYWNrcygKLQl4ZnNfYnVmX3QJKmJwLAotCXhmc19sb2dfaXRlbV90CSpsaXApCisJc3RydWN0IHhmc19idWYJCSpicCkKIHsKLQl4ZnNfbG9nX2l0ZW1fdAkqbmxpcDsKKwlzdHJ1Y3QgeGZzX2xvZ19pdGVtCSpsaXA7CiAKLQl3aGlsZSAobGlwICE9IE5VTEwpIHsKLQkJbmxpcCA9IGxpcC0+bGlfYmlvX2xpc3Q7CisJd2hpbGUgKChsaXAgPSBYRlNfQlVGX0ZTUFJJVkFURShicCwgeGZzX2xvZ19pdGVtX3QgKikpICE9IE5VTEwpIHsKKwkJWEZTX0JVRl9TRVRfRlNQUklWQVRFKGJwLCBsaXAtPmxpX2Jpb19saXN0KTsKIAkJQVNTRVJUKGxpcC0+bGlfY2IgIT0gTlVMTCk7CiAJCS8qCiAJCSAqIENsZWFyIHRoZSBuZXh0IHBvaW50ZXIgc28gd2UgZG9uJ3QgaGF2ZSBhbnkKQEAgLTkzNiw3ICs5NDcsNiBAQAogCQkgKi8KIAkJbGlwLT5saV9iaW9fbGlzdCA9IE5VTEw7CiAJCWxpcC0+bGlfY2IoYnAsIGxpcCk7Ci0JCWxpcCA9IG5saXA7CiAJfQogfQogCkBAIC05NzAsNyArOTgwLDcgQEAKIAkJCUFTU0VSVChYRlNfQlVGX1RBUkdFVChicCkgPT0gbXAtPm1fZGRldl90YXJncCk7CiAJCQlYRlNfQlVGX1NVUEVSX1NUQUxFKGJwKTsKIAkJCXRyYWNlX3hmc19idWZfaXRlbV9pb2RvbmUoYnAsIF9SRVRfSVBfKTsKLQkJCXhmc19idWZfZG9fY2FsbGJhY2tzKGJwLCBsaXApOworCQkJeGZzX2J1Zl9kb19jYWxsYmFja3MoYnApOwogCQkJWEZTX0JVRl9TRVRfRlNQUklWQVRFKGJwLCBOVUxMKTsKIAkJCVhGU19CVUZfQ0xSX0lPRE9ORV9GVU5DKGJwKTsKIAkJCXhmc19idWZfaW9lbmQoYnAsIDApOwpAQCAtMTAyOSw3ICsxMDM5LDcgQEAKIAkJcmV0dXJuOwogCX0KIAotCXhmc19idWZfZG9fY2FsbGJhY2tzKGJwLCBsaXApOworCXhmc19idWZfZG9fY2FsbGJhY2tzKGJwKTsKIAlYRlNfQlVGX1NFVF9GU1BSSVZBVEUoYnAsIE5VTEwpOwogCVhGU19CVUZfQ0xSX0lPRE9ORV9GVU5DKGJwKTsKIAl4ZnNfYnVmX2lvZW5kKGJwLCAwKTsKQEAgLTEwNjMsNyArMTA3Myw3IEBACiAJICogV2UgaGF2ZSB0byB1bnBpbiB0aGUgcGlubmVkIGJ1ZmZlcnMgc28gZG8gdGhlCiAJICogY2FsbGJhY2tzLgogCSAqLwotCXhmc19idWZfZG9fY2FsbGJhY2tzKGJwLCBsaXApOworCXhmc19idWZfZG9fY2FsbGJhY2tzKGJwKTsKIAlYRlNfQlVGX1NFVF9GU1BSSVZBVEUoYnAsIE5VTEwpOwogCVhGU19CVUZfQ0xSX0lPRE9ORV9GVU5DKGJwKTsKIAlYRlNfQlVGX1NFVF9CUkVMU0VfRlVOQyhicCxOVUxMKTsKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfYnVmX2l0ZW0uaCBiL2ZzL3hmcy94ZnNfYnVmX2l0ZW0uaAppbmRleCAwZTJlZDQzLi5iNmVjZDIwIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2J1Zl9pdGVtLmgKKysrIGIvZnMveGZzL3hmc19idWZfaXRlbS5oCkBAIC0xMDUsMTcgKzEwNSw2IEBACiAJeGZzX2J1Zl9sb2dfZm9ybWF0X3QJYmxpX2Zvcm1hdDsJLyogaW4tbG9nIGhlYWRlciAqLwogfSB4ZnNfYnVmX2xvZ19pdGVtX3Q7CiAKLS8qCi0gKiBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIGR1cmluZyByZWNvdmVyeSB0byByZWNvcmQgdGhlIGJ1ZiBsb2cKLSAqIGl0ZW1zIHdoaWNoIGhhdmUgYmVlbiBjYW5jZWxlZCBhbmQgc2hvdWxkIG5vdCBiZSByZXBsYXllZC4KLSAqLwotdHlwZWRlZiBzdHJ1Y3QgeGZzX2J1Zl9jYW5jZWwgewotCXhmc19kYWRkcl90CQliY19ibGtubzsKLQl1aW50CQkJYmNfbGVuOwotCWludAkJCWJjX3JlZmNvdW50OwotCXN0cnVjdCB4ZnNfYnVmX2NhbmNlbAkqYmNfbmV4dDsKLX0geGZzX2J1Zl9jYW5jZWxfdDsKLQogdm9pZAl4ZnNfYnVmX2l0ZW1faW5pdChzdHJ1Y3QgeGZzX2J1ZiAqLCBzdHJ1Y3QgeGZzX21vdW50ICopOwogdm9pZAl4ZnNfYnVmX2l0ZW1fcmVsc2Uoc3RydWN0IHhmc19idWYgKik7CiB2b2lkCXhmc19idWZfaXRlbV9sb2coeGZzX2J1Zl9sb2dfaXRlbV90ICosIHVpbnQsIHVpbnQpOwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19leHRmcmVlX2l0ZW0uYyBiL2ZzL3hmcy94ZnNfZXh0ZnJlZV9pdGVtLmMKaW5kZXggYTU1ZTY4Ny4uNzVmMmVmNiAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19leHRmcmVlX2l0ZW0uYworKysgYi9mcy94ZnMveGZzX2V4dGZyZWVfaXRlbS5jCkBAIC00OCw2ICs0OCwyOCBAQAogfQogCiAvKgorICogRnJlZWluZyB0aGUgZWZpIHJlcXVpcmVzIHRoYXQgd2UgcmVtb3ZlIGl0IGZyb20gdGhlIEFJTCBpZiBpdCBoYXMgYWxyZWFkeQorICogYmVlbiBwbGFjZWQgdGhlcmUuIEhvd2V2ZXIsIHRoZSBFRkkgbWF5IG5vdCB5ZXQgaGF2ZSBiZWVuIHBsYWNlZCBpbiB0aGUgQUlMCisgKiB3aGVuIGNhbGxlZCBieSB4ZnNfZWZpX3JlbGVhc2UoKSBmcm9tIEVGRCBwcm9jZXNzaW5nIGR1ZSB0byB0aGUgb3JkZXJpbmcgb2YKKyAqIGNvbW1pdHRlZCB2cyB1bnBpbiBvcGVyYXRpb25zIGluIGJ1bGsgaW5zZXJ0IG9wZXJhdGlvbnMuIEhlbmNlIHRoZQorICogdGVzdF9hbmRfY2xlYXJfYml0KFhGU19FRklfQ09NTUlUVEVEKSB0byBlbnN1cmUgb25seSB0aGUgbGFzdCBjYWxsZXIgZnJlZXMKKyAqIHRoZSBFRkkuCisgKi8KK1NUQVRJQyB2b2lkCitfX3hmc19lZmlfcmVsZWFzZSgKKwlzdHJ1Y3QgeGZzX2VmaV9sb2dfaXRlbQkqZWZpcCkKK3sKKwlzdHJ1Y3QgeGZzX2FpbAkJKmFpbHAgPSBlZmlwLT5lZmlfaXRlbS5saV9haWxwOworCisJaWYgKCF0ZXN0X2FuZF9jbGVhcl9iaXQoWEZTX0VGSV9DT01NSVRURUQsICZlZmlwLT5lZmlfZmxhZ3MpKSB7CisJCXNwaW5fbG9jaygmYWlscC0+eGFfbG9jayk7CisJCS8qIHhmc190cmFuc19haWxfZGVsZXRlKCkgZHJvcHMgdGhlIEFJTCBsb2NrLiAqLworCQl4ZnNfdHJhbnNfYWlsX2RlbGV0ZShhaWxwLCAmZWZpcC0+ZWZpX2l0ZW0pOworCQl4ZnNfZWZpX2l0ZW1fZnJlZShlZmlwKTsKKwl9Cit9CisKKy8qCiAgKiBUaGlzIHJldHVybnMgdGhlIG51bWJlciBvZiBpb3ZlY3MgbmVlZGVkIHRvIGxvZyB0aGUgZ2l2ZW4gZWZpIGl0ZW0uCiAgKiBXZSBvbmx5IG5lZWQgMSBpb3ZlYyBmb3IgYW4gZWZpIGl0ZW0uICBJdCBqdXN0IGxvZ3MgdGhlIGVmaV9sb2dfZm9ybWF0CiAgKiBzdHJ1Y3R1cmUuCkBAIC03NCw3ICs5Niw4IEBACiAJc3RydWN0IHhmc19lZmlfbG9nX2l0ZW0JKmVmaXAgPSBFRklfSVRFTShsaXApOwogCXVpbnQJCQlzaXplOwogCi0JQVNTRVJUKGVmaXAtPmVmaV9uZXh0X2V4dGVudCA9PSBlZmlwLT5lZmlfZm9ybWF0LmVmaV9uZXh0ZW50cyk7CisJQVNTRVJUKGF0b21pY19yZWFkKCZlZmlwLT5lZmlfbmV4dF9leHRlbnQpID09CisJCQkJZWZpcC0+ZWZpX2Zvcm1hdC5lZmlfbmV4dGVudHMpOwogCiAJZWZpcC0+ZWZpX2Zvcm1hdC5lZmlfdHlwZSA9IFhGU19MSV9FRkk7CiAKQEAgLTk5LDEwICsxMjIsMTIgQEAKIH0KIAogLyoKLSAqIFdoaWxlIEVGSXMgY2Fubm90IHJlYWxseSBiZSBwaW5uZWQsIHRoZSB1bnBpbiBvcGVyYXRpb24gaXMgdGhlCi0gKiBsYXN0IHBsYWNlIGF0IHdoaWNoIHRoZSBFRkkgaXMgbWFuaXB1bGF0ZWQgZHVyaW5nIGEgdHJhbnNhY3Rpb24uCi0gKiBIZXJlIHdlIGNvb3JkaW5hdGUgd2l0aCB4ZnNfZWZpX2NhbmNlbCgpIHRvIGRldGVybWluZSB3aG8gZ2V0cyB0bwotICogZnJlZSB0aGUgRUZJLgorICogV2hpbGUgRUZJcyBjYW5ub3QgcmVhbGx5IGJlIHBpbm5lZCwgdGhlIHVucGluIG9wZXJhdGlvbiBpcyB0aGUgbGFzdCBwbGFjZSBhdAorICogd2hpY2ggdGhlIEVGSSBpcyBtYW5pcHVsYXRlZCBkdXJpbmcgYSB0cmFuc2FjdGlvbi4gIElmIHdlIGFyZSBiZWluZyBhc2tlZCB0bworICogcmVtb3ZlIHRoZSBFRkkgaXQncyBiZWNhdXNlIHRoZSB0cmFuc2FjdGlvbiBoYXMgYmVlbiBjYW5jZWxsZWQgYW5kIGJ5CisgKiBkZWZpbml0aW9uIHRoYXQgbWVhbnMgdGhlIEVGSSBjYW5ub3QgYmUgaW4gdGhlIEFJTCBzbyByZW1vdmUgaXQgZnJvbSB0aGUKKyAqIHRyYW5zYWN0aW9uIGFuZCBmcmVlIGl0LiAgT3RoZXJ3aXNlIGNvb3JkaW5hdGUgd2l0aCB4ZnNfZWZpX3JlbGVhc2UoKSAodmlhCisgKiBYRlNfRUZJX0NPTU1JVFRFRCkgdG8gZGV0ZXJtaW5lIHdobyBnZXRzIHRvIGZyZWUgdGhlIEVGSS4KICAqLwogU1RBVElDIHZvaWQKIHhmc19lZmlfaXRlbV91bnBpbigKQEAgLTExMCwyMCArMTM1LDE0IEBACiAJaW50CQkJcmVtb3ZlKQogewogCXN0cnVjdCB4ZnNfZWZpX2xvZ19pdGVtCSplZmlwID0gRUZJX0lURU0obGlwKTsKLQlzdHJ1Y3QgeGZzX2FpbAkJKmFpbHAgPSBsaXAtPmxpX2FpbHA7CiAKLQlzcGluX2xvY2soJmFpbHAtPnhhX2xvY2spOwotCWlmIChlZmlwLT5lZmlfZmxhZ3MgJiBYRlNfRUZJX0NBTkNFTEVEKSB7Ci0JCWlmIChyZW1vdmUpCi0JCQl4ZnNfdHJhbnNfZGVsX2l0ZW0obGlwKTsKLQotCQkvKiB4ZnNfdHJhbnNfYWlsX2RlbGV0ZSgpIGRyb3BzIHRoZSBBSUwgbG9jay4gKi8KLQkJeGZzX3RyYW5zX2FpbF9kZWxldGUoYWlscCwgbGlwKTsKKwlpZiAocmVtb3ZlKSB7CisJCUFTU0VSVCghKGxpcC0+bGlfZmxhZ3MgJiBYRlNfTElfSU5fQUlMKSk7CisJCXhmc190cmFuc19kZWxfaXRlbShsaXApOwogCQl4ZnNfZWZpX2l0ZW1fZnJlZShlZmlwKTsKLQl9IGVsc2UgewotCQllZmlwLT5lZmlfZmxhZ3MgfD0gWEZTX0VGSV9DT01NSVRURUQ7Ci0JCXNwaW5fdW5sb2NrKCZhaWxwLT54YV9sb2NrKTsKKwkJcmV0dXJuOwogCX0KKwlfX3hmc19lZmlfcmVsZWFzZShlZmlwKTsKIH0KIAogLyoKQEAgLTE1MiwxNiArMTcxLDIwIEBACiB9CiAKIC8qCi0gKiBUaGUgRUZJIGlzIGxvZ2dlZCBvbmx5IG9uY2UgYW5kIGNhbm5vdCBiZSBtb3ZlZCBpbiB0aGUgbG9nLCBzbwotICogc2ltcGx5IHJldHVybiB0aGUgbHNuIGF0IHdoaWNoIGl0J3MgYmVlbiBsb2dnZWQuICBUaGUgY2FuY2VsZWQKLSAqIGZsYWcgaXMgbm90IHBhaWQgYW55IGF0dGVudGlvbiBoZXJlLiAgQ2hlY2tpbmcgZm9yIHRoYXQgaXMgZGVsYXllZAotICogdW50aWwgdGhlIEVGSSBpcyB1bnBpbm5lZC4KKyAqIFRoZSBFRkkgaXMgbG9nZ2VkIG9ubHkgb25jZSBhbmQgY2Fubm90IGJlIG1vdmVkIGluIHRoZSBsb2csIHNvIHNpbXBseSByZXR1cm4KKyAqIHRoZSBsc24gYXQgd2hpY2ggaXQncyBiZWVuIGxvZ2dlZC4gIEZvciBidWxrIHRyYW5zYWN0aW9uIGNvbW1pdHRlZAorICogcHJvY2Vzc2luZywgdGhlIEVGSSBtYXkgYmUgcHJvY2Vzc2VkIGJ1dCBub3QgeWV0IHVucGlubmVkIHByaW9yIHRvIHRoZSBFRkQKKyAqIGJlaW5nIHByb2Nlc3NlZC4gU2V0IHRoZSBYRlNfRUZJX0NPTU1JVFRFRCBmbGFnIHNvIHRoaXMgY2FzZSBjYW4gYmUgZGV0ZWN0ZWQKKyAqIHdoZW4gcHJvY2Vzc2luZyB0aGUgRUZELgogICovCiBTVEFUSUMgeGZzX2xzbl90CiB4ZnNfZWZpX2l0ZW1fY29tbWl0dGVkKAogCXN0cnVjdCB4ZnNfbG9nX2l0ZW0JKmxpcCwKIAl4ZnNfbHNuX3QJCWxzbikKIHsKKwlzdHJ1Y3QgeGZzX2VmaV9sb2dfaXRlbQkqZWZpcCA9IEVGSV9JVEVNKGxpcCk7CisKKwlzZXRfYml0KFhGU19FRklfQ09NTUlUVEVELCAmZWZpcC0+ZWZpX2ZsYWdzKTsKIAlyZXR1cm4gbHNuOwogfQogCkBAIC0yMzAsNiArMjUzLDcgQEAKIAl4ZnNfbG9nX2l0ZW1faW5pdChtcCwgJmVmaXAtPmVmaV9pdGVtLCBYRlNfTElfRUZJLCAmeGZzX2VmaV9pdGVtX29wcyk7CiAJZWZpcC0+ZWZpX2Zvcm1hdC5lZmlfbmV4dGVudHMgPSBuZXh0ZW50czsKIAllZmlwLT5lZmlfZm9ybWF0LmVmaV9pZCA9IChfX3BzaW50X3QpKHZvaWQqKWVmaXA7CisJYXRvbWljX3NldCgmZWZpcC0+ZWZpX25leHRfZXh0ZW50LCAwKTsKIAogCXJldHVybiBlZmlwOwogfQpAQCAtMjg5LDM3ICszMTMsMTggQEAKIH0KIAogLyoKLSAqIFRoaXMgaXMgY2FsbGVkIGJ5IHRoZSBlZmQgaXRlbSBjb2RlIGJlbG93IHRvIHJlbGVhc2UgcmVmZXJlbmNlcyB0bwotICogdGhlIGdpdmVuIGVmaSBpdGVtLiAgRWFjaCBlZmQgY2FsbHMgdGhpcyB3aXRoIHRoZSBudW1iZXIgb2YKLSAqIGV4dGVudHMgdGhhdCBpdCBoYXMgbG9nZ2VkLCBhbmQgd2hlbiB0aGUgc3VtIG9mIHRoZXNlIHJlYWNoZXMKLSAqIHRoZSB0b3RhbCBudW1iZXIgb2YgZXh0ZW50cyBsb2dnZWQgYnkgdGhpcyBlZmkgaXRlbSB3ZSBjYW4gZnJlZQotICogdGhlIGVmaSBpdGVtLgotICoKLSAqIEZyZWVpbmcgdGhlIGVmaSBpdGVtIHJlcXVpcmVzIHRoYXQgd2UgcmVtb3ZlIGl0IGZyb20gdGhlIEFJTC4KLSAqIFdlJ2xsIHVzZSB0aGUgQUlMIGxvY2sgdG8gcHJvdGVjdCBvdXIgY291bnRlcnMgYXMgd2VsbCBhcwotICogdGhlIHJlbW92YWwgZnJvbSB0aGUgQUlMLgorICogVGhpcyBpcyBjYWxsZWQgYnkgdGhlIGVmZCBpdGVtIGNvZGUgYmVsb3cgdG8gcmVsZWFzZSByZWZlcmVuY2VzIHRvIHRoZSBnaXZlbgorICogZWZpIGl0ZW0uICBFYWNoIGVmZCBjYWxscyB0aGlzIHdpdGggdGhlIG51bWJlciBvZiBleHRlbnRzIHRoYXQgaXQgaGFzCisgKiBsb2dnZWQsIGFuZCB3aGVuIHRoZSBzdW0gb2YgdGhlc2UgcmVhY2hlcyB0aGUgdG90YWwgbnVtYmVyIG9mIGV4dGVudHMgbG9nZ2VkCisgKiBieSB0aGlzIGVmaSBpdGVtIHdlIGNhbiBmcmVlIHRoZSBlZmkgaXRlbS4KICAqLwogdm9pZAogeGZzX2VmaV9yZWxlYXNlKHhmc19lZmlfbG9nX2l0ZW1fdAkqZWZpcCwKIAkJdWludAkJCW5leHRlbnRzKQogewotCXN0cnVjdCB4ZnNfYWlsCQkqYWlscCA9IGVmaXAtPmVmaV9pdGVtLmxpX2FpbHA7Ci0JaW50CQkJZXh0ZW50c19sZWZ0OwotCi0JQVNTRVJUKGVmaXAtPmVmaV9uZXh0X2V4dGVudCA+IDApOwotCUFTU0VSVChlZmlwLT5lZmlfZmxhZ3MgJiBYRlNfRUZJX0NPTU1JVFRFRCk7Ci0KLQlzcGluX2xvY2soJmFpbHAtPnhhX2xvY2spOwotCUFTU0VSVChlZmlwLT5lZmlfbmV4dF9leHRlbnQgPj0gbmV4dGVudHMpOwotCWVmaXAtPmVmaV9uZXh0X2V4dGVudCAtPSBuZXh0ZW50czsKLQlleHRlbnRzX2xlZnQgPSBlZmlwLT5lZmlfbmV4dF9leHRlbnQ7Ci0JaWYgKGV4dGVudHNfbGVmdCA9PSAwKSB7Ci0JCS8qIHhmc190cmFuc19haWxfZGVsZXRlKCkgZHJvcHMgdGhlIEFJTCBsb2NrLiAqLwotCQl4ZnNfdHJhbnNfYWlsX2RlbGV0ZShhaWxwLCAoeGZzX2xvZ19pdGVtX3QgKillZmlwKTsKLQkJeGZzX2VmaV9pdGVtX2ZyZWUoZWZpcCk7Ci0JfSBlbHNlIHsKLQkJc3Bpbl91bmxvY2soJmFpbHAtPnhhX2xvY2spOwotCX0KKwlBU1NFUlQoYXRvbWljX3JlYWQoJmVmaXAtPmVmaV9uZXh0X2V4dGVudCkgPj0gbmV4dGVudHMpOworCWlmIChhdG9taWNfc3ViX2FuZF90ZXN0KG5leHRlbnRzLCAmZWZpcC0+ZWZpX25leHRfZXh0ZW50KSkKKwkJX194ZnNfZWZpX3JlbGVhc2UoZWZpcCk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IHhmc19lZmRfbG9nX2l0ZW0gKkVGRF9JVEVNKHN0cnVjdCB4ZnNfbG9nX2l0ZW0gKmxpcCkKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfZXh0ZnJlZV9pdGVtLmggYi9mcy94ZnMveGZzX2V4dGZyZWVfaXRlbS5oCmluZGV4IDBkMjJjNTYuLjM3NWY2OGUgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfZXh0ZnJlZV9pdGVtLmgKKysrIGIvZnMveGZzL3hmc19leHRmcmVlX2l0ZW0uaApAQCAtMTExLDExICsxMTEsMTAgQEAKICNkZWZpbmUJWEZTX0VGSV9NQVhfRkFTVF9FWFRFTlRTCTE2CiAKIC8qCi0gKiBEZWZpbmUgRUZJIGZsYWdzLgorICogRGVmaW5lIEVGSSBmbGFnIGJpdHMuIE1hbmlwdWxhdGVkIGJ5IHNldC9jbGVhci90ZXN0X2JpdCBvcGVyYXRvcnMuCiAgKi8KLSNkZWZpbmUJWEZTX0VGSV9SRUNPVkVSRUQJMHgxCi0jZGVmaW5lCVhGU19FRklfQ09NTUlUVEVECTB4MgotI2RlZmluZQlYRlNfRUZJX0NBTkNFTEVECTB4NAorI2RlZmluZQlYRlNfRUZJX1JFQ09WRVJFRAkxCisjZGVmaW5lCVhGU19FRklfQ09NTUlUVEVECTIKIAogLyoKICAqIFRoaXMgaXMgdGhlICJleHRlbnQgZnJlZSBpbnRlbnRpb24iIGxvZyBpdGVtLiAgSXQgaXMgdXNlZApAQCAtMTI1LDggKzEyNCw4IEBACiAgKi8KIHR5cGVkZWYgc3RydWN0IHhmc19lZmlfbG9nX2l0ZW0gewogCXhmc19sb2dfaXRlbV90CQllZmlfaXRlbTsKLQl1aW50CQkJZWZpX2ZsYWdzOwkvKiBtaXNjIGZsYWdzICovCi0JdWludAkJCWVmaV9uZXh0X2V4dGVudDsKKwlhdG9taWNfdAkJZWZpX25leHRfZXh0ZW50OworCXVuc2lnbmVkIGxvbmcJCWVmaV9mbGFnczsJLyogbWlzYyBmbGFncyAqLwogCXhmc19lZmlfbG9nX2Zvcm1hdF90CWVmaV9mb3JtYXQ7CiB9IHhmc19lZmlfbG9nX2l0ZW1fdDsKIApkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19mc29wcy5jIGIvZnMveGZzL3hmc19mc29wcy5jCmluZGV4IGE3YzExNmUuLmY1NmQzMGUgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfZnNvcHMuYworKysgYi9mcy94ZnMveGZzX2Zzb3BzLmMKQEAgLTM3NCw2ICszNzQsNyBAQAogCQltcC0+bV9tYXhpY291bnQgPSBpY291bnQgPDwgbXAtPm1fc2Iuc2JfaW5vcGJsb2c7CiAJfSBlbHNlCiAJCW1wLT5tX21heGljb3VudCA9IDA7CisJeGZzX3NldF9sb3dfc3BhY2VfdGhyZXNob2xkcyhtcCk7CiAKIAkvKiB1cGRhdGUgc2Vjb25kYXJ5IHN1cGVyYmxvY2tzLiAqLwogCWZvciAoYWdubyA9IDE7IGFnbm8gPCBuYWdjb3VudDsgYWdubysrKSB7CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2lnZXQuYyBiL2ZzL3hmcy94ZnNfaWdldC5jCmluZGV4IGQ3ZGU1YTMuLmNiOWI2ZDEgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfaWdldC5jCisrKyBiL2ZzL3hmcy94ZnNfaWdldC5jCkBAIC00Myw2ICs0MywxNyBAQAogCiAKIC8qCisgKiBEZWZpbmUgeGZzIGlub2RlIGlvbG9jayBsb2NrZGVwIGNsYXNzZXMuIFdlIG5lZWQgdG8gZW5zdXJlIHRoYXQgYWxsIGFjdGl2ZQorICogaW5vZGVzIGFyZSBjb25zaWRlcmVkIHRoZSBzYW1lIGZvciBsb2NrZGVwIHB1cnBvc2VzLCBpbmNsdWRpbmcgaW5vZGVzIHRoYXQKKyAqIGFyZSByZWN5Y2xlZCB0aHJvdWdoIHRoZSBYRlNfSVJFQ0xBSU1BQkxFIHN0YXRlLiBUaGlzIGlzIHRoZSB0aGUgb25seSB3YXkgdG8KKyAqIGd1YXJhbnRlZSB0aGUgbG9ja3MgYXJlIGNvbnNpZGVyZWQgdGhlIHNhbWUgd2hlbiB0aGVyZSBhcmUgbXVsdGlwbGUgbG9jaworICogaW5pdGlhbGlzYXRpb24gc2l0ZdGVLiBBbHNvLCBkZWZpbmUgYSByZWNsYWltYWJsZSBpbm9kZSBjbGFzcyBzbyBpdCBpcworICogb2J2aW91cyBpbiBsb2NrZGVwIHJlcG9ydHMgd2hpY2ggY2xhc3MgdGhlIHJlcG9ydCBpcyBhZ2FpbnN0LgorICovCitzdGF0aWMgc3RydWN0IGxvY2tfY2xhc3Nfa2V5IHhmc19pb2xvY2tfYWN0aXZlOworc3RydWN0IGxvY2tfY2xhc3Nfa2V5IHhmc19pb2xvY2tfcmVjbGFpbWFibGU7CisKKy8qCiAgKiBBbGxvY2F0ZSBhbmQgaW5pdGlhbGlzZSBhbiB4ZnNfaW5vZGUuCiAgKi8KIFNUQVRJQyBzdHJ1Y3QgeGZzX2lub2RlICoKQEAgLTY5LDggKzgwLDExIEBACiAJQVNTRVJUKGF0b21pY19yZWFkKCZpcC0+aV9waW5jb3VudCkgPT0gMCk7CiAJQVNTRVJUKCFzcGluX2lzX2xvY2tlZCgmaXAtPmlfZmxhZ3NfbG9jaykpOwogCUFTU0VSVChjb21wbGV0aW9uX2RvbmUoJmlwLT5pX2ZsdXNoKSk7CisJQVNTRVJUKGlwLT5pX2lubyA9PSAwKTsKIAogCW1ybG9ja19pbml0KCZpcC0+aV9pb2xvY2ssIE1STE9DS19CQVJSSUVSLCAieGZzaW8iLCBpcC0+aV9pbm8pOworCWxvY2tkZXBfc2V0X2NsYXNzX2FuZF9uYW1lKCZpcC0+aV9pb2xvY2subXJfbG9jaywKKwkJCSZ4ZnNfaW9sb2NrX2FjdGl2ZSwgInhmc19pb2xvY2tfYWN0aXZlIik7CiAKIAkvKiBpbml0aWFsaXNlIHRoZSB4ZnMgaW5vZGUgKi8KIAlpcC0+aV9pbm8gPSBpbm87CkBAIC04NSw5ICs5OSw2IEBACiAJaXAtPmlfc2l6ZSA9IDA7CiAJaXAtPmlfbmV3X3NpemUgPSAwOwogCi0JLyogcHJldmVudCBhbnlvbmUgZnJvbSB1c2luZyB0aGlzIHlldCAqLwotCVZGU19JKGlwKS0+aV9zdGF0ZSA9IElfTkVXOwotCiAJcmV0dXJuIGlwOwogfQogCkBAIC0xNDUsNyArMTU2LDE4IEBACiAJQVNTRVJUKCFzcGluX2lzX2xvY2tlZCgmaXAtPmlfZmxhZ3NfbG9jaykpOwogCUFTU0VSVChjb21wbGV0aW9uX2RvbmUoJmlwLT5pX2ZsdXNoKSk7CiAKLQljYWxsX3JjdSgmaXAtPmlfdm5vZGUuaV9yY3UsIHhmc19pbm9kZV9mcmVlX2NhbGxiYWNrKTsKKwkvKgorCSAqIEJlY2F1c2Ugd2UgdXNlIFJDVSBmcmVlaW5nIHdlIG5lZWQgdG8gZW5zdXJlIHRoZSBpbm9kZSBhbHdheXMKKwkgKiBhcHBlYXJzIHRvIGJlIHJlY2xhaW1lZCB3aXRoIGFuIGludmFsaWQgaW5vZGUgbnVtYmVyIHdoZW4gaW4gdGhlCisJICogZnJlZSBzdGF0ZS4gVGhlIGlwLT5pX2ZsYWdzX2xvY2sgcHJvdmlkZXMgdGhlIGJhcnJpZXIgYWdhaW5zdCBsb29rdXAKKwkgKiByYWNlcy4KKwkgKi8KKwlzcGluX2xvY2soJmlwLT5pX2ZsYWdzX2xvY2spOworCWlwLT5pX2ZsYWdzID0gWEZTX0lSRUNMQUlNOworCWlwLT5pX2lubyA9IDA7CisJc3Bpbl91bmxvY2soJmlwLT5pX2ZsYWdzX2xvY2spOworCisJY2FsbF9yY3UoJlZGU19JKGlwKS0+aV9yY3UsIHhmc19pbm9kZV9mcmVlX2NhbGxiYWNrKTsKIH0KIAogLyoKQEAgLTE1NSwxNCArMTc3LDI5IEBACiB4ZnNfaWdldF9jYWNoZV9oaXQoCiAJc3RydWN0IHhmc19wZXJhZwkqcGFnLAogCXN0cnVjdCB4ZnNfaW5vZGUJKmlwLAorCXhmc19pbm9fdAkJaW5vLAogCWludAkJCWZsYWdzLAotCWludAkJCWxvY2tfZmxhZ3MpIF9fcmVsZWFzZXMocGFnLT5wYWdfaWNpX2xvY2spCisJaW50CQkJbG9ja19mbGFncykgX19yZWxlYXNlcyhSQ1UpCiB7CiAJc3RydWN0IGlub2RlCQkqaW5vZGUgPSBWRlNfSShpcCk7CiAJc3RydWN0IHhmc19tb3VudAkqbXAgPSBpcC0+aV9tb3VudDsKIAlpbnQJCQllcnJvcjsKIAorCS8qCisJICogY2hlY2sgZm9yIHJlLXVzZSBvZiBhbiBpbm9kZSB3aXRoaW4gYW4gUkNVIGdyYWNlIHBlcmlvZCBkdWUgdG8gdGhlCisJICogcmFkaXggdHJlZSBub2RlcyBub3QgYmVpbmcgdXBkYXRlZCB5ZXQuIFdlIG1vbml0b3IgZm9yIHRoaXMgYnkKKwkgKiBzZXR0aW5nIHRoZSBpbm9kZSBudW1iZXIgdG8gemVybyBiZWZvcmUgZnJlZWluZyB0aGUgaW5vZGUgc3RydWN0dXJlLgorCSAqIElmIHRoZSBpbm9kZSBoYXMgYmVlbiByZWFsbG9jYXRlZCBhbmQgc2V0IHVwLCB0aGVuIHRoZSBpbm9kZSBudW1iZXIKKwkgKiB3aWxsIG5vdCBtYXRjaCwgc28gY2hlY2sgZm9yIHRoYXQsIHRvby4KKwkgKi8KIAlzcGluX2xvY2soJmlwLT5pX2ZsYWdzX2xvY2spOworCWlmIChpcC0+aV9pbm8gIT0gaW5vKSB7CisJCXRyYWNlX3hmc19pZ2V0X3NraXAoaXApOworCQlYRlNfU1RBVFNfSU5DKHhzX2lnX2ZyZWN5Y2xlKTsKKwkJZXJyb3IgPSBFQUdBSU47CisJCWdvdG8gb3V0X2Vycm9yOworCX0KKwogCiAJLyoKIAkgKiBJZiB3ZSBhcmUgcmFjaW5nIHdpdGggYW5vdGhlciBjYWNoZSBoaXQgdGhhdCBpcyBjdXJyZW50bHkKQEAgLTIwNSw3ICsyNDIsNyBAQAogCQlpcC0+aV9mbGFncyB8PSBYRlNfSVJFQ0xBSU07CiAKIAkJc3Bpbl91bmxvY2soJmlwLT5pX2ZsYWdzX2xvY2spOwotCQlyZWFkX3VubG9jaygmcGFnLT5wYWdfaWNpX2xvY2spOworCQlyY3VfcmVhZF91bmxvY2soKTsKIAogCQllcnJvciA9IC1pbm9kZV9pbml0X2Fsd2F5cyhtcC0+bV9zdXBlciwgaW5vZGUpOwogCQlpZiAoZXJyb3IpIHsKQEAgLTIxMyw3ICsyNTAsNyBAQAogCQkJICogUmUtaW5pdGlhbGl6aW5nIHRoZSBpbm9kZSBmYWlsZWQsIGFuZCB3ZSBhcmUgaW4gZGVlcAogCQkJICogdHJvdWJsZS4gIFRyeSB0byByZS1hZGQgaXQgdG8gdGhlIHJlY2xhaW0gbGlzdC4KIAkJCSAqLwotCQkJcmVhZF9sb2NrKCZwYWctPnBhZ19pY2lfbG9jayk7CisJCQlyY3VfcmVhZF9sb2NrKCk7CiAJCQlzcGluX2xvY2soJmlwLT5pX2ZsYWdzX2xvY2spOwogCiAJCQlpcC0+aV9mbGFncyAmPSB+WEZTX0lORVc7CkBAIC0yMjMsMTQgKzI2MCwyMCBAQAogCQkJZ290byBvdXRfZXJyb3I7CiAJCX0KIAotCQl3cml0ZV9sb2NrKCZwYWctPnBhZ19pY2lfbG9jayk7CisJCXNwaW5fbG9jaygmcGFnLT5wYWdfaWNpX2xvY2spOwogCQlzcGluX2xvY2soJmlwLT5pX2ZsYWdzX2xvY2spOwogCQlpcC0+aV9mbGFncyAmPSB+KFhGU19JUkVDTEFJTUFCTEUgfCBYRlNfSVJFQ0xBSU0pOwogCQlpcC0+aV9mbGFncyB8PSBYRlNfSU5FVzsKIAkJX194ZnNfaW5vZGVfY2xlYXJfcmVjbGFpbV90YWcobXAsIHBhZywgaXApOwogCQlpbm9kZS0+aV9zdGF0ZSA9IElfTkVXOworCisJCUFTU0VSVCghcndzZW1faXNfbG9ja2VkKCZpcC0+aV9pb2xvY2subXJfbG9jaykpOworCQltcmxvY2tfaW5pdCgmaXAtPmlfaW9sb2NrLCBNUkxPQ0tfQkFSUklFUiwgInhmc2lvIiwgaXAtPmlfaW5vKTsKKwkJbG9ja2RlcF9zZXRfY2xhc3NfYW5kX25hbWUoJmlwLT5pX2lvbG9jay5tcl9sb2NrLAorCQkJCSZ4ZnNfaW9sb2NrX2FjdGl2ZSwgInhmc19pb2xvY2tfYWN0aXZlIik7CisKIAkJc3Bpbl91bmxvY2soJmlwLT5pX2ZsYWdzX2xvY2spOwotCQl3cml0ZV91bmxvY2soJnBhZy0+cGFnX2ljaV9sb2NrKTsKKwkJc3Bpbl91bmxvY2soJnBhZy0+cGFnX2ljaV9sb2NrKTsKIAl9IGVsc2UgewogCQkvKiBJZiB0aGUgVkZTIGlub2RlIGlzIGJlaW5nIHRvcm4gZG93biwgcGF1c2UgYW5kIHRyeSBhZ2Fpbi4gKi8KIAkJaWYgKCFpZ3JhYihpbm9kZSkpIHsKQEAgLTI0MSw3ICsyODQsNyBAQAogCiAJCS8qIFdlJ3ZlIGdvdCBhIGxpdmUgb25lLiAqLwogCQlzcGluX3VubG9jaygmaXAtPmlfZmxhZ3NfbG9jayk7Ci0JCXJlYWRfdW5sb2NrKCZwYWctPnBhZ19pY2lfbG9jayk7CisJCXJjdV9yZWFkX3VubG9jaygpOwogCQl0cmFjZV94ZnNfaWdldF9oaXQoaXApOwogCX0KIApAQCAtMjU1LDcgKzI5OCw3IEBACiAKIG91dF9lcnJvcjoKIAlzcGluX3VubG9jaygmaXAtPmlfZmxhZ3NfbG9jayk7Ci0JcmVhZF91bmxvY2soJnBhZy0+cGFnX2ljaV9sb2NrKTsKKwlyY3VfcmVhZF91bmxvY2soKTsKIAlyZXR1cm4gZXJyb3I7CiB9CiAKQEAgLTMwOCw3ICszNTEsNyBAQAogCQkJQlVHKCk7CiAJfQogCi0Jd3JpdGVfbG9jaygmcGFnLT5wYWdfaWNpX2xvY2spOworCXNwaW5fbG9jaygmcGFnLT5wYWdfaWNpX2xvY2spOwogCiAJLyogaW5zZXJ0IHRoZSBuZXcgaW5vZGUgKi8KIAllcnJvciA9IHJhZGl4X3RyZWVfaW5zZXJ0KCZwYWctPnBhZ19pY2lfcm9vdCwgYWdpbm8sIGlwKTsKQEAgLTMyMywxNCArMzY2LDE0IEBACiAJaXAtPmlfdWRxdW90ID0gaXAtPmlfZ2RxdW90ID0gTlVMTDsKIAl4ZnNfaWZsYWdzX3NldChpcCwgWEZTX0lORVcpOwogCi0Jd3JpdGVfdW5sb2NrKCZwYWctPnBhZ19pY2lfbG9jayk7CisJc3Bpbl91bmxvY2soJnBhZy0+cGFnX2ljaV9sb2NrKTsKIAlyYWRpeF90cmVlX3ByZWxvYWRfZW5kKCk7CiAKIAkqaXBwID0gaXA7CiAJcmV0dXJuIDA7CiAKIG91dF9wcmVsb2FkX2VuZDoKLQl3cml0ZV91bmxvY2soJnBhZy0+cGFnX2ljaV9sb2NrKTsKKwlzcGluX3VubG9jaygmcGFnLT5wYWdfaWNpX2xvY2spOwogCXJhZGl4X3RyZWVfcHJlbG9hZF9lbmQoKTsKIAlpZiAobG9ja19mbGFncykKIAkJeGZzX2l1bmxvY2soaXAsIGxvY2tfZmxhZ3MpOwpAQCAtMzc3LDcgKzQyMCw3IEBACiAJeGZzX2FnaW5vX3QJYWdpbm87CiAKIAkvKiByZWplY3QgaW5vZGUgbnVtYmVycyBvdXRzaWRlIGV4aXN0aW5nIEFHcyAqLwotCWlmIChYRlNfSU5PX1RPX0FHTk8obXAsIGlubykgPj0gbXAtPm1fc2Iuc2JfYWdjb3VudCkKKwlpZiAoIWlubyB8fCBYRlNfSU5PX1RPX0FHTk8obXAsIGlubykgPj0gbXAtPm1fc2Iuc2JfYWdjb3VudCkKIAkJcmV0dXJuIEVJTlZBTDsKIAogCS8qIGdldCB0aGUgcGVyYWcgc3RydWN0dXJlIGFuZCBlbnN1cmUgdGhhdCBpdCdzIGlub2RlIGNhcGFibGUgKi8KQEAgLTM4NiwxNSArNDI5LDE1IEBACiAKIGFnYWluOgogCWVycm9yID0gMDsKLQlyZWFkX2xvY2soJnBhZy0+cGFnX2ljaV9sb2NrKTsKKwlyY3VfcmVhZF9sb2NrKCk7CiAJaXAgPSByYWRpeF90cmVlX2xvb2t1cCgmcGFnLT5wYWdfaWNpX3Jvb3QsIGFnaW5vKTsKIAogCWlmIChpcCkgewotCQllcnJvciA9IHhmc19pZ2V0X2NhY2hlX2hpdChwYWcsIGlwLCBmbGFncywgbG9ja19mbGFncyk7CisJCWVycm9yID0geGZzX2lnZXRfY2FjaGVfaGl0KHBhZywgaXAsIGlubywgZmxhZ3MsIGxvY2tfZmxhZ3MpOwogCQlpZiAoZXJyb3IpCiAJCQlnb3RvIG91dF9lcnJvcl9vcl9hZ2FpbjsKIAl9IGVsc2UgewotCQlyZWFkX3VubG9jaygmcGFnLT5wYWdfaWNpX2xvY2spOworCQlyY3VfcmVhZF91bmxvY2soKTsKIAkJWEZTX1NUQVRTX0lOQyh4c19pZ19taXNzZWQpOwogCiAJCWVycm9yID0geGZzX2lnZXRfY2FjaGVfbWlzcyhtcCwgcGFnLCB0cCwgaW5vLCAmaXAsCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2lub2RlLmMgYi9mcy94ZnMveGZzX2lub2RlLmMKaW5kZXggMTA4YzdhMC4uYmU3Y2Y2MiAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19pbm9kZS5jCisrKyBiL2ZzL3hmcy94ZnNfaW5vZGUuYwpAQCAtODg3LDcgKzg4Nyw3IEBACiAJICogYXJvdW5kIGZvciBhIHdoaWxlLiAgVGhpcyBoZWxwcyB0byBrZWVwIHJlY2VudGx5IGFjY2Vzc2VkCiAJICogbWV0YS1kYXRhIGluLWNvcmUgbG9uZ2VyLgogCSAqLwotCVhGU19CVUZfU0VUX1JFRihicCwgWEZTX0lOT19SRUYpOworCXhmc19idWZfc2V0X3JlZihicCwgWEZTX0lOT19SRUYpOwogCiAJLyoKIAkgKiBVc2UgeGZzX3RyYW5zX2JyZWxzZSgpIHRvIHJlbGVhc2UgdGhlIGJ1ZmZlciBjb250YWluaW5nIHRoZQpAQCAtMjAwMCwxNyArMjAwMCwzMyBAQAogCQkgKi8KIAkJZm9yIChpID0gMDsgaSA8IG5pbm9kZXM7IGkrKykgewogcmV0cnk6Ci0JCQlyZWFkX2xvY2soJnBhZy0+cGFnX2ljaV9sb2NrKTsKKwkJCXJjdV9yZWFkX2xvY2soKTsKIAkJCWlwID0gcmFkaXhfdHJlZV9sb29rdXAoJnBhZy0+cGFnX2ljaV9yb290LAogCQkJCQlYRlNfSU5PX1RPX0FHSU5PKG1wLCAoaW51bSArIGkpKSk7CiAKLQkJCS8qIElub2RlIG5vdCBpbiBtZW1vcnkgb3Igc3RhbGUsIG5vdGhpbmcgdG8gZG8gKi8KLQkJCWlmICghaXAgfHwgeGZzX2lmbGFnc190ZXN0KGlwLCBYRlNfSVNUQUxFKSkgewotCQkJCXJlYWRfdW5sb2NrKCZwYWctPnBhZ19pY2lfbG9jayk7CisJCQkvKiBJbm9kZSBub3QgaW4gbWVtb3J5LCBub3RoaW5nIHRvIGRvICovCisJCQlpZiAoIWlwKSB7CisJCQkJcmN1X3JlYWRfdW5sb2NrKCk7CiAJCQkJY29udGludWU7CiAJCQl9CiAKIAkJCS8qCisJCQkgKiBiZWNhdXNlIHRoaXMgaXMgYW4gUkNVIHByb3RlY3RlZCBsb29rdXAsIHdlIGNvdWxkCisJCQkgKiBmaW5kIGEgcmVjZW50bHkgZnJlZWQgb3IgZXZlbiByZWFsbG9jYXRlZCBpbm9kZQorCQkJICogZHVyaW5nIHRoZSBsb29rdXAuIFdlIG5lZWQgdG8gY2hlY2sgdW5kZXIgdGhlCisJCQkgKiBpX2ZsYWdzX2xvY2sgZm9yIGEgdmFsaWQgaW5vZGUgaGVyZS4gU2tpcCBpdCBpZiBpdAorCQkJICogaXMgbm90IHZhbGlkLCB0aGUgd3JvbmcgaW5vZGUgb3Igc3RhbGUuCisJCQkgKi8KKwkJCXNwaW5fbG9jaygmaXAtPmlfZmxhZ3NfbG9jayk7CisJCQlpZiAoaXAtPmlfaW5vICE9IGludW0gKyBpIHx8CisJCQkgICAgX194ZnNfaWZsYWdzX3Rlc3QoaXAsIFhGU19JU1RBTEUpKSB7CisJCQkJc3Bpbl91bmxvY2soJmlwLT5pX2ZsYWdzX2xvY2spOworCQkJCXJjdV9yZWFkX3VubG9jaygpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJc3Bpbl91bmxvY2soJmlwLT5pX2ZsYWdzX2xvY2spOworCisJCQkvKgogCQkJICogRG9uJ3QgdHJ5IHRvIGxvY2svdW5sb2NrIHRoZSBjdXJyZW50IGlub2RlLCBidXQgd2UKIAkJCSAqIF9jYW5ub3RfIHNraXAgdGhlIG90aGVyIGlub2RlcyB0aGF0IHdlIGRpZCBub3QgZmluZAogCQkJICogaW4gdGhlIGxpc3QgYXR0YWNoZWQgdG8gdGhlIGJ1ZmZlciBhbmQgYXJlIG5vdApAQCAtMjAxOSwxMSArMjAzNSwxMSBAQAogCQkJICovCiAJCQlpZiAoaXAgIT0gZnJlZV9pcCAmJgogCQkJICAgICF4ZnNfaWxvY2tfbm93YWl0KGlwLCBYRlNfSUxPQ0tfRVhDTCkpIHsKLQkJCQlyZWFkX3VubG9jaygmcGFnLT5wYWdfaWNpX2xvY2spOworCQkJCXJjdV9yZWFkX3VubG9jaygpOwogCQkJCWRlbGF5KDEpOwogCQkJCWdvdG8gcmV0cnk7CiAJCQl9Ci0JCQlyZWFkX3VubG9jaygmcGFnLT5wYWdfaWNpX2xvY2spOworCQkJcmN1X3JlYWRfdW5sb2NrKCk7CiAKIAkJCXhmc19pZmxvY2soaXApOwogCQkJeGZzX2lmbGFnc19zZXQoaXAsIFhGU19JU1RBTEUpOwpAQCAtMjYyOSw3ICsyNjQ1LDcgQEAKIAogCW1hc2sgPSB+KCgoWEZTX0lOT0RFX0NMVVNURVJfU0laRShtcCkgPj4gbXAtPm1fc2Iuc2JfaW5vZGVsb2cpKSAtIDEpOwogCWZpcnN0X2luZGV4ID0gWEZTX0lOT19UT19BR0lOTyhtcCwgaXAtPmlfaW5vKSAmIG1hc2s7Ci0JcmVhZF9sb2NrKCZwYWctPnBhZ19pY2lfbG9jayk7CisJcmN1X3JlYWRfbG9jaygpOwogCS8qIHJlYWxseSBuZWVkIGEgZ2FuZyBsb29rdXAgcmFuZ2UgY2FsbCBoZXJlICovCiAJbnJfZm91bmQgPSByYWRpeF90cmVlX2dhbmdfbG9va3VwKCZwYWctPnBhZ19pY2lfcm9vdCwgKHZvaWQqKilpbGlzdCwKIAkJCQkJZmlyc3RfaW5kZXgsIGlub2Rlc19wZXJfY2x1c3Rlcik7CkBAIC0yNjQwLDkgKzI2NTYsMjEgQEAKIAkJaXEgPSBpbGlzdFtpXTsKIAkJaWYgKGlxID09IGlwKQogCQkJY29udGludWU7Ci0JCS8qIGlmIHRoZSBpbm9kZSBsaWVzIG91dHNpZGUgdGhpcyBjbHVzdGVyLCB3ZSdyZSBkb25lLiAqLwotCQlpZiAoKFhGU19JTk9fVE9fQUdJTk8obXAsIGlxLT5pX2lubykgJiBtYXNrKSAhPSBmaXJzdF9pbmRleCkKLQkJCWJyZWFrOworCisJCS8qCisJCSAqIGJlY2F1c2UgdGhpcyBpcyBhbiBSQ1UgcHJvdGVjdGVkIGxvb2t1cCwgd2UgY291bGQgZmluZCBhCisJCSAqIHJlY2VudGx5IGZyZWVkIG9yIGV2ZW4gcmVhbGxvY2F0ZWQgaW5vZGUgZHVyaW5nIHRoZSBsb29rdXAuCisJCSAqIFdlIG5lZWQgdG8gY2hlY2sgdW5kZXIgdGhlIGlfZmxhZ3NfbG9jayBmb3IgYSB2YWxpZCBpbm9kZQorCQkgKiBoZXJlLiBTa2lwIGl0IGlmIGl0IGlzIG5vdCB2YWxpZCBvciB0aGUgd3JvbmcgaW5vZGUuCisJCSAqLworCQlzcGluX2xvY2soJmlwLT5pX2ZsYWdzX2xvY2spOworCQlpZiAoIWlwLT5pX2lubyB8fAorCQkgICAgKFhGU19JTk9fVE9fQUdJTk8obXAsIGlxLT5pX2lubykgJiBtYXNrKSAhPSBmaXJzdF9pbmRleCkgeworCQkJc3Bpbl91bmxvY2soJmlwLT5pX2ZsYWdzX2xvY2spOworCQkJY29udGludWU7CisJCX0KKwkJc3Bpbl91bmxvY2soJmlwLT5pX2ZsYWdzX2xvY2spOworCiAJCS8qCiAJCSAqIERvIGFuIHVuLXByb3RlY3RlZCBjaGVjayB0byBzZWUgaWYgdGhlIGlub2RlIGlzIGRpcnR5IGFuZAogCQkgKiBpcyBhIGNhbmRpZGF0ZSBmb3IgZmx1c2hpbmcuICBUaGVzZSBjaGVja3Mgd2lsbCBiZSByZXBlYXRlZApAQCAtMjY5Miw3ICsyNzIwLDcgQEAKIAl9CiAKIG91dF9mcmVlOgotCXJlYWRfdW5sb2NrKCZwYWctPnBhZ19pY2lfbG9jayk7CisJcmN1X3JlYWRfdW5sb2NrKCk7CiAJa21lbV9mcmVlKGlsaXN0KTsKIG91dF9wdXQ6CiAJeGZzX3BlcmFnX3B1dChwYWcpOwpAQCAtMjcwNCw3ICsyNzMyLDcgQEAKIAkgKiBDb3JydXB0aW9uIGRldGVjdGVkIGluIHRoZSBjbHVzdGVyaW5nIGxvb3AuICBJbnZhbGlkYXRlIHRoZQogCSAqIGlub2RlIGJ1ZmZlciBhbmQgc2h1dCBkb3duIHRoZSBmaWxlc3lzdGVtLgogCSAqLwotCXJlYWRfdW5sb2NrKCZwYWctPnBhZ19pY2lfbG9jayk7CisJcmN1X3JlYWRfdW5sb2NrKCk7CiAJLyoKIAkgKiBDbGVhbiB1cCB0aGUgYnVmZmVyLiAgSWYgaXQgd2FzIEJfREVMV1JJLCBqdXN0IHJlbGVhc2UgaXQgLS0KIAkgKiBicmVsc2UgY2FuIGhhbmRsZSBpdCB3aXRoIG5vIHByb2JsZW1zLiAgSWYgbm90LCBzaHV0IGRvd24gdGhlCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2lub2RlLmggYi9mcy94ZnMveGZzX2lub2RlLmgKaW5kZXggZmIyY2EyZS4uNWM5NWZhOCAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19pbm9kZS5oCisrKyBiL2ZzL3hmcy94ZnNfaW5vZGUuaApAQCAtMzc2LDEyICszNzYsMTMgQEAKIC8qCiAgKiBJbi1jb3JlIGlub2RlIGZsYWdzLgogICovCi0jZGVmaW5lIFhGU19JUkVDTEFJTSAgICAweDAwMDEgIC8qIHdlIGhhdmUgc3RhcnRlZCByZWNsYWltaW5nIHRoaXMgaW5vZGUgICAgKi8KLSNkZWZpbmUgWEZTX0lTVEFMRQkweDAwMDIJLyogaW5vZGUgaGFzIGJlZW4gc3RhbGVkICovCi0jZGVmaW5lIFhGU19JUkVDTEFJTUFCTEUgMHgwMDA0IC8qIGlub2RlIGNhbiBiZSByZWNsYWltZWQgKi8KLSNkZWZpbmUgWEZTX0lORVcJMHgwMDA4CS8qIGlub2RlIGhhcyBqdXN0IGJlZW4gYWxsb2NhdGVkICovCi0jZGVmaW5lIFhGU19JRklMRVNUUkVBTQkweDAwMTAJLyogaW5vZGUgaXMgaW4gYSBmaWxlc3RyZWFtIGRpcmVjdG9yeSAqLwotI2RlZmluZSBYRlNfSVRSVU5DQVRFRAkweDAwMjAJLyogdHJ1bmNhdGVkIGRvd24gc28gZmx1c2gtb24tY2xvc2UgKi8KKyNkZWZpbmUgWEZTX0lSRUNMQUlNCQkweDAwMDEgIC8qIHN0YXJ0ZWQgcmVjbGFpbWluZyB0aGlzIGlub2RlICovCisjZGVmaW5lIFhGU19JU1RBTEUJCTB4MDAwMgkvKiBpbm9kZSBoYXMgYmVlbiBzdGFsZWQgKi8KKyNkZWZpbmUgWEZTX0lSRUNMQUlNQUJMRQkweDAwMDQJLyogaW5vZGUgY2FuIGJlIHJlY2xhaW1lZCAqLworI2RlZmluZSBYRlNfSU5FVwkJMHgwMDA4CS8qIGlub2RlIGhhcyBqdXN0IGJlZW4gYWxsb2NhdGVkICovCisjZGVmaW5lIFhGU19JRklMRVNUUkVBTQkJMHgwMDEwCS8qIGlub2RlIGlzIGluIGEgZmlsZXN0cmVhbSBkaXJlY3RvcnkgKi8KKyNkZWZpbmUgWEZTX0lUUlVOQ0FURUQJCTB4MDAyMAkvKiB0cnVuY2F0ZWQgZG93biBzbyBmbHVzaC1vbi1jbG9zZSAqLworI2RlZmluZSBYRlNfSURJUlRZX1JFTEVBU0UJMHgwMDQwCS8qIGRpcnR5IHJlbGVhc2UgYWxyZWFkeSBzZWVuICovCiAKIC8qCiAgKiBGbGFncyBmb3IgaW5vZGUgbG9ja2luZy4KQEAgLTQzOCw2ICs0MzksOCBAQAogI2RlZmluZSBYRlNfSU9MT0NLX0RFUChmbGFncykJKCgoZmxhZ3MpICYgWEZTX0lPTE9DS19ERVBfTUFTSykgPj4gWEZTX0lPTE9DS19TSElGVCkKICNkZWZpbmUgWEZTX0lMT0NLX0RFUChmbGFncykJKCgoZmxhZ3MpICYgWEZTX0lMT0NLX0RFUF9NQVNLKSA+PiBYRlNfSUxPQ0tfU0hJRlQpCiAKK2V4dGVybiBzdHJ1Y3QgbG9ja19jbGFzc19rZXkgeGZzX2lvbG9ja19yZWNsYWltYWJsZTsKKwogLyoKICAqIEZsYWdzIGZvciB4ZnNfaXRydW5jYXRlX3N0YXJ0KCkuCiAgKi8KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfaW5vZGVfaXRlbS5jIGIvZnMveGZzL3hmc19pbm9kZV9pdGVtLmMKaW5kZXggN2M4ZDMwYy4uZmQ0ZjM5OCAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19pbm9kZV9pdGVtLmMKKysrIGIvZnMveGZzL3hmc19pbm9kZV9pdGVtLmMKQEAgLTg0MiwxNSArODQyLDY0IEBACiAgKiBmbHVzaGVkIHRvIGRpc2suICBJdCBpcyByZXNwb25zaWJsZSBmb3IgcmVtb3ZpbmcgdGhlIGlub2RlIGl0ZW0KICAqIGZyb20gdGhlIEFJTCBpZiBpdCBoYXMgbm90IGJlZW4gcmUtbG9nZ2VkLCBhbmQgdW5sb2NraW5nIHRoZSBpbm9kZSdzCiAgKiBmbHVzaCBsb2NrLgorICoKKyAqIFRvIHJlZHVjZSBBSUwgbG9jayB0cmFmZmljIGFzIG11Y2ggYXMgcG9zc2libGUsIHdlIHNjYW4gdGhlIGJ1ZmZlciBsb2cgaXRlbQorICogbGlzdCBmb3Igb3RoZXIgaW5vZGVzIHRoYXQgd2lsbCBydW4gdGhpcyBmdW5jdGlvbi4gV2UgcmVtb3ZlIHRoZW0gZnJvbSB0aGUKKyAqIGJ1ZmZlciBsaXN0IHNvIHdlIGNhbiBwcm9jZXNzIGFsbCB0aGUgaW5vZGUgSU8gY29tcGxldGlvbnMgaW4gb25lIEFJTCBsb2NrCisgKiB0cmF2ZXJzYWwuCiAgKi8KIHZvaWQKIHhmc19pZmx1c2hfZG9uZSgKIAlzdHJ1Y3QgeGZzX2J1ZgkJKmJwLAogCXN0cnVjdCB4ZnNfbG9nX2l0ZW0JKmxpcCkKIHsKLQlzdHJ1Y3QgeGZzX2lub2RlX2xvZ19pdGVtICppaXAgPSBJTk9ERV9JVEVNKGxpcCk7Ci0JeGZzX2lub2RlX3QJCSppcCA9IGlpcC0+aWxpX2lub2RlOworCXN0cnVjdCB4ZnNfaW5vZGVfbG9nX2l0ZW0gKmlpcDsKKwlzdHJ1Y3QgeGZzX2xvZ19pdGVtCSpibGlwOworCXN0cnVjdCB4ZnNfbG9nX2l0ZW0JKm5leHQ7CisJc3RydWN0IHhmc19sb2dfaXRlbQkqcHJldjsKIAlzdHJ1Y3QgeGZzX2FpbAkJKmFpbHAgPSBsaXAtPmxpX2FpbHA7CisJaW50CQkJbmVlZF9haWwgPSAwOworCisJLyoKKwkgKiBTY2FuIHRoZSBidWZmZXIgSU8gY29tcGxldGlvbnMgZm9yIG90aGVyIGlub2RlcyBiZWluZyBjb21wbGV0ZWQgYW5kCisJICogYXR0YWNoIHRoZW0gdG8gdGhlIGN1cnJlbnQgaW5vZGUgbG9nIGl0ZW0uCisJICovCisJYmxpcCA9IFhGU19CVUZfRlNQUklWQVRFKGJwLCB4ZnNfbG9nX2l0ZW1fdCAqKTsKKwlwcmV2ID0gTlVMTDsKKwl3aGlsZSAoYmxpcCAhPSBOVUxMKSB7CisJCWlmIChsaXAtPmxpX2NiICE9IHhmc19pZmx1c2hfZG9uZSkgeworCQkJcHJldiA9IGJsaXA7CisJCQlibGlwID0gYmxpcC0+bGlfYmlvX2xpc3Q7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIHJlbW92ZSBmcm9tIGxpc3QgKi8KKwkJbmV4dCA9IGJsaXAtPmxpX2Jpb19saXN0OworCQlpZiAoIXByZXYpIHsKKwkJCVhGU19CVUZfU0VUX0ZTUFJJVkFURShicCwgbmV4dCk7CisJCX0gZWxzZSB7CisJCQlwcmV2LT5saV9iaW9fbGlzdCA9IG5leHQ7CisJCX0KKworCQkvKiBhZGQgdG8gY3VycmVudCBsaXN0ICovCisJCWJsaXAtPmxpX2Jpb19saXN0ID0gbGlwLT5saV9iaW9fbGlzdDsKKwkJbGlwLT5saV9iaW9fbGlzdCA9IGJsaXA7CisKKwkJLyoKKwkJICogd2hpbGUgd2UgaGF2ZSB0aGUgaXRlbSwgZG8gdGhlIHVubG9ja2VkIGNoZWNrIGZvciBuZWVkaW5nCisJCSAqIHRoZSBBSUwgbG9jay4KKwkJICovCisJCWlpcCA9IElOT0RFX0lURU0oYmxpcCk7CisJCWlmIChpaXAtPmlsaV9sb2dnZWQgJiYgYmxpcC0+bGlfbHNuID09IGlpcC0+aWxpX2ZsdXNoX2xzbikKKwkJCW5lZWRfYWlsKys7CisKKwkJYmxpcCA9IG5leHQ7CisJfQorCisJLyogbWFrZSBzdXJlIHdlIGNhcHR1cmUgdGhlIHN0YXRlIG9mIHRoZSBpbml0aWFsIGlub2RlLiAqLworCWlpcCA9IElOT0RFX0lURU0obGlwKTsKKwlpZiAoaWlwLT5pbGlfbG9nZ2VkICYmIGxpcC0+bGlfbHNuID09IGlpcC0+aWxpX2ZsdXNoX2xzbikKKwkJbmVlZF9haWwrKzsKIAogCS8qCiAJICogV2Ugb25seSB3YW50IHRvIHB1bGwgdGhlIGl0ZW0gZnJvbSB0aGUgQUlMIGlmIGl0IGlzCkBAIC04NjEsMjggKzkxMCwzNyBAQAogCSAqIHRoZSBsb2NrIHNpbmNlIGl0J3MgY2hlYXBlciwgYW5kIHRoZW4gd2UgcmVjaGVjayB3aGlsZQogCSAqIGhvbGRpbmcgdGhlIGxvY2sgYmVmb3JlIHJlbW92aW5nIHRoZSBpbm9kZSBmcm9tIHRoZSBBSUwuCiAJICovCi0JaWYgKGlpcC0+aWxpX2xvZ2dlZCAmJiBsaXAtPmxpX2xzbiA9PSBpaXAtPmlsaV9mbHVzaF9sc24pIHsKKwlpZiAobmVlZF9haWwpIHsKKwkJc3RydWN0IHhmc19sb2dfaXRlbSAqbG9nX2l0ZW1zW25lZWRfYWlsXTsKKwkJaW50IGkgPSAwOwogCQlzcGluX2xvY2soJmFpbHAtPnhhX2xvY2spOwotCQlpZiAobGlwLT5saV9sc24gPT0gaWlwLT5pbGlfZmx1c2hfbHNuKSB7Ci0JCQkvKiB4ZnNfdHJhbnNfYWlsX2RlbGV0ZSgpIGRyb3BzIHRoZSBBSUwgbG9jay4gKi8KLQkJCXhmc190cmFuc19haWxfZGVsZXRlKGFpbHAsIGxpcCk7Ci0JCX0gZWxzZSB7Ci0JCQlzcGluX3VubG9jaygmYWlscC0+eGFfbG9jayk7CisJCWZvciAoYmxpcCA9IGxpcDsgYmxpcDsgYmxpcCA9IGJsaXAtPmxpX2Jpb19saXN0KSB7CisJCQlpaXAgPSBJTk9ERV9JVEVNKGJsaXApOworCQkJaWYgKGlpcC0+aWxpX2xvZ2dlZCAmJgorCQkJICAgIGJsaXAtPmxpX2xzbiA9PSBpaXAtPmlsaV9mbHVzaF9sc24pIHsKKwkJCQlsb2dfaXRlbXNbaSsrXSA9IGJsaXA7CisJCQl9CisJCQlBU1NFUlQoaSA8PSBuZWVkX2FpbCk7CiAJCX0KKwkJLyogeGZzX3RyYW5zX2FpbF9kZWxldGVfYnVsaygpIGRyb3BzIHRoZSBBSUwgbG9jay4gKi8KKwkJeGZzX3RyYW5zX2FpbF9kZWxldGVfYnVsayhhaWxwLCBsb2dfaXRlbXMsIGkpOwogCX0KIAotCWlpcC0+aWxpX2xvZ2dlZCA9IDA7CiAKIAkvKgotCSAqIENsZWFyIHRoZSBpbGlfbGFzdF9maWVsZHMgYml0cyBub3cgdGhhdCB3ZSBrbm93IHRoYXQgdGhlCi0JICogZGF0YSBjb3JyZXNwb25kaW5nIHRvIHRoZW0gaXMgc2FmZWx5IG9uIGRpc2suCisJICogY2xlYW4gdXAgYW5kIHVubG9jayB0aGUgZmx1c2ggbG9jayBub3cgd2UgYXJlIGRvbmUuIFdlIGNhbiBjbGVhciB0aGUKKwkgKiBpbGlfbGFzdF9maWVsZHMgYml0cyBub3cgdGhhdCB3ZSBrbm93IHRoYXQgdGhlIGRhdGEgY29ycmVzcG9uZGluZyB0bworCSAqIHRoZW0gaXMgc2FmZWx5IG9uIGRpc2suCiAJICovCi0JaWlwLT5pbGlfbGFzdF9maWVsZHMgPSAwOworCWZvciAoYmxpcCA9IGxpcDsgYmxpcDsgYmxpcCA9IG5leHQpIHsKKwkJbmV4dCA9IGJsaXAtPmxpX2Jpb19saXN0OworCQlibGlwLT5saV9iaW9fbGlzdCA9IE5VTEw7CiAKLQkvKgotCSAqIFJlbGVhc2UgdGhlIGlub2RlJ3MgZmx1c2ggbG9jayBzaW5jZSB3ZSdyZSBkb25lIHdpdGggaXQuCi0JICovCi0JeGZzX2lmdW5sb2NrKGlwKTsKKwkJaWlwID0gSU5PREVfSVRFTShibGlwKTsKKwkJaWlwLT5pbGlfbG9nZ2VkID0gMDsKKwkJaWlwLT5pbGlfbGFzdF9maWVsZHMgPSAwOworCQl4ZnNfaWZ1bmxvY2soaWlwLT5pbGlfaW5vZGUpOworCX0KIH0KIAogLyoKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfaW9tYXAuYyBiL2ZzL3hmcy94ZnNfaW9tYXAuYwppbmRleCAyMDU3NjE0Li41NTU4MmJkIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2lvbWFwLmMKKysrIGIvZnMveGZzL3hmc19pb21hcC5jCkBAIC00NywxMjcgKzQ3LDggQEAKIAogI2RlZmluZSBYRlNfV1JJVEVJT19BTElHTihtcCxvZmYpCSgoKG9mZikgPj4gbXAtPm1fd3JpdGVpb19sb2cpIFwKIAkJCQkJCTw8IG1wLT5tX3dyaXRlaW9fbG9nKQotI2RlZmluZSBYRlNfU1RSQVRfV1JJVEVfSU1BUFMJMgogI2RlZmluZSBYRlNfV1JJVEVfSU1BUFMJCVhGU19CTUFQX01BWF9OTUFQCiAKLVNUQVRJQyBpbnQgeGZzX2lvbWFwX3dyaXRlX2RpcmVjdChzdHJ1Y3QgeGZzX2lub2RlICosIHhmc19vZmZfdCwgc2l6ZV90LAotCQkJCSAgaW50LCBzdHJ1Y3QgeGZzX2JtYnRfaXJlYyAqLCBpbnQgKik7Ci1TVEFUSUMgaW50IHhmc19pb21hcF93cml0ZV9kZWxheShzdHJ1Y3QgeGZzX2lub2RlICosIHhmc19vZmZfdCwgc2l6ZV90LCBpbnQsCi0JCQkJIHN0cnVjdCB4ZnNfYm1idF9pcmVjICosIGludCAqKTsKLVNUQVRJQyBpbnQgeGZzX2lvbWFwX3dyaXRlX2FsbG9jYXRlKHN0cnVjdCB4ZnNfaW5vZGUgKiwgeGZzX29mZl90LCBzaXplX3QsCi0JCQkJc3RydWN0IHhmc19ibWJ0X2lyZWMgKiwgaW50ICopOwotCi1pbnQKLXhmc19pb21hcCgKLQlzdHJ1Y3QgeGZzX2lub2RlCSppcCwKLQl4ZnNfb2ZmX3QJCW9mZnNldCwKLQlzc2l6ZV90CQkJY291bnQsCi0JaW50CQkJZmxhZ3MsCi0Jc3RydWN0IHhmc19ibWJ0X2lyZWMJKmltYXAsCi0JaW50CQkJKm5pbWFwcywKLQlpbnQJCQkqbmV3KQotewotCXN0cnVjdCB4ZnNfbW91bnQJKm1wID0gaXAtPmlfbW91bnQ7Ci0JeGZzX2ZpbGVvZmZfdAkJb2Zmc2V0X2ZzYiwgZW5kX2ZzYjsKLQlpbnQJCQllcnJvciA9IDA7Ci0JaW50CQkJbG9ja21vZGUgPSAwOwotCWludAkJCWJtYXBpX2ZsYWdzID0gMDsKLQotCUFTU0VSVCgoaXAtPmlfZC5kaV9tb2RlICYgU19JRk1UKSA9PSBTX0lGUkVHKTsKLQotCSpuZXcgPSAwOwotCi0JaWYgKFhGU19GT1JDRURfU0hVVERPV04obXApKQotCQlyZXR1cm4gWEZTX0VSUk9SKEVJTyk7Ci0KLQl0cmFjZV94ZnNfaW9tYXBfZW50ZXIoaXAsIG9mZnNldCwgY291bnQsIGZsYWdzLCBOVUxMKTsKLQotCXN3aXRjaCAoZmxhZ3MgJiAoQk1BUElfUkVBRCB8IEJNQVBJX1dSSVRFIHwgQk1BUElfQUxMT0NBVEUpKSB7Ci0JY2FzZSBCTUFQSV9SRUFEOgotCQlsb2NrbW9kZSA9IHhmc19pbG9ja19tYXBfc2hhcmVkKGlwKTsKLQkJYm1hcGlfZmxhZ3MgPSBYRlNfQk1BUElfRU5USVJFOwotCQlicmVhazsKLQljYXNlIEJNQVBJX1dSSVRFOgotCQlsb2NrbW9kZSA9IFhGU19JTE9DS19FWENMOwotCQlpZiAoZmxhZ3MgJiBCTUFQSV9JR05TVEFURSkKLQkJCWJtYXBpX2ZsYWdzIHw9IFhGU19CTUFQSV9JR1NUQVRFfFhGU19CTUFQSV9FTlRJUkU7Ci0JCXhmc19pbG9jayhpcCwgbG9ja21vZGUpOwotCQlicmVhazsKLQljYXNlIEJNQVBJX0FMTE9DQVRFOgotCQlsb2NrbW9kZSA9IFhGU19JTE9DS19TSEFSRUQ7Ci0JCWJtYXBpX2ZsYWdzID0gWEZTX0JNQVBJX0VOVElSRTsKLQotCQkvKiBBdHRlbXB0IG5vbi1ibG9ja2luZyBsb2NrICovCi0JCWlmIChmbGFncyAmIEJNQVBJX1RSWUxPQ0spIHsKLQkJCWlmICgheGZzX2lsb2NrX25vd2FpdChpcCwgbG9ja21vZGUpKQotCQkJCXJldHVybiBYRlNfRVJST1IoRUFHQUlOKTsKLQkJfSBlbHNlIHsKLQkJCXhmc19pbG9jayhpcCwgbG9ja21vZGUpOwotCQl9Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCUJVRygpOwotCX0KLQotCUFTU0VSVChvZmZzZXQgPD0gbXAtPm1fbWF4aW9mZnNldCk7Ci0JaWYgKCh4ZnNfZnNpemVfdClvZmZzZXQgKyBjb3VudCA+IG1wLT5tX21heGlvZmZzZXQpCi0JCWNvdW50ID0gbXAtPm1fbWF4aW9mZnNldCAtIG9mZnNldDsKLQllbmRfZnNiID0gWEZTX0JfVE9fRlNCKG1wLCAoeGZzX3Vmc2l6ZV90KW9mZnNldCArIGNvdW50KTsKLQlvZmZzZXRfZnNiID0gWEZTX0JfVE9fRlNCVChtcCwgb2Zmc2V0KTsKLQotCWVycm9yID0geGZzX2JtYXBpKE5VTEwsIGlwLCBvZmZzZXRfZnNiLAotCQkJKHhmc19maWxibGtzX3QpKGVuZF9mc2IgLSBvZmZzZXRfZnNiKSwKLQkJCWJtYXBpX2ZsYWdzLCAgTlVMTCwgMCwgaW1hcCwKLQkJCW5pbWFwcywgTlVMTCk7Ci0KLQlpZiAoZXJyb3IpCi0JCWdvdG8gb3V0OwotCi0Jc3dpdGNoIChmbGFncyAmIChCTUFQSV9XUklURXxCTUFQSV9BTExPQ0FURSkpIHsKLQljYXNlIEJNQVBJX1dSSVRFOgotCQkvKiBJZiB3ZSBmb3VuZCBhbiBleHRlbnQsIHJldHVybiBpdCAqLwotCQlpZiAoKm5pbWFwcyAmJgotCQkgICAgKGltYXAtPmJyX3N0YXJ0YmxvY2sgIT0gSE9MRVNUQVJUQkxPQ0spICYmCi0JCSAgICAoaW1hcC0+YnJfc3RhcnRibG9jayAhPSBERUxBWVNUQVJUQkxPQ0spKSB7Ci0JCQl0cmFjZV94ZnNfaW9tYXBfZm91bmQoaXAsIG9mZnNldCwgY291bnQsIGZsYWdzLCBpbWFwKTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJaWYgKGZsYWdzICYgQk1BUElfRElSRUNUKSB7Ci0JCQllcnJvciA9IHhmc19pb21hcF93cml0ZV9kaXJlY3QoaXAsIG9mZnNldCwgY291bnQsIGZsYWdzLAotCQkJCQkJICAgICAgIGltYXAsIG5pbWFwcyk7Ci0JCX0gZWxzZSB7Ci0JCQllcnJvciA9IHhmc19pb21hcF93cml0ZV9kZWxheShpcCwgb2Zmc2V0LCBjb3VudCwgZmxhZ3MsCi0JCQkJCQkgICAgICBpbWFwLCBuaW1hcHMpOwotCQl9Ci0JCWlmICghZXJyb3IpIHsKLQkJCXRyYWNlX3hmc19pb21hcF9hbGxvYyhpcCwgb2Zmc2V0LCBjb3VudCwgZmxhZ3MsIGltYXApOwotCQl9Ci0JCSpuZXcgPSAxOwotCQlicmVhazsKLQljYXNlIEJNQVBJX0FMTE9DQVRFOgotCQkvKiBJZiB3ZSBmb3VuZCBhbiBleHRlbnQsIHJldHVybiBpdCAqLwotCQl4ZnNfaXVubG9jayhpcCwgbG9ja21vZGUpOwotCQlsb2NrbW9kZSA9IDA7Ci0KLQkJaWYgKCpuaW1hcHMgJiYgIWlzbnVsbHN0YXJ0YmxvY2soaW1hcC0+YnJfc3RhcnRibG9jaykpIHsKLQkJCXRyYWNlX3hmc19pb21hcF9mb3VuZChpcCwgb2Zmc2V0LCBjb3VudCwgZmxhZ3MsIGltYXApOwotCQkJYnJlYWs7Ci0JCX0KLQotCQllcnJvciA9IHhmc19pb21hcF93cml0ZV9hbGxvY2F0ZShpcCwgb2Zmc2V0LCBjb3VudCwKLQkJCQkJCSBpbWFwLCBuaW1hcHMpOwotCQlicmVhazsKLQl9Ci0KLQlBU1NFUlQoKm5pbWFwcyA8PSAxKTsKLQotb3V0OgotCWlmIChsb2NrbW9kZSkKLQkJeGZzX2l1bmxvY2soaXAsIGxvY2ttb2RlKTsKLQlyZXR1cm4gWEZTX0VSUk9SKGVycm9yKTsKLX0KLQogU1RBVElDIGludAogeGZzX2lvbWFwX2VvZl9hbGlnbl9sYXN0X2ZzYigKIAl4ZnNfbW91bnRfdAkqbXAsCkBAIC0yMzYsMTQgKzExNywxMyBAQAogCXJldHVybiBFRlNDT1JSVVBURUQ7CiB9CiAKLVNUQVRJQyBpbnQKK2ludAogeGZzX2lvbWFwX3dyaXRlX2RpcmVjdCgKIAl4ZnNfaW5vZGVfdAkqaXAsCiAJeGZzX29mZl90CW9mZnNldCwKIAlzaXplX3QJCWNvdW50LAotCWludAkJZmxhZ3MsCiAJeGZzX2JtYnRfaXJlY190ICppbWFwLAotCWludAkJKm5tYXBzKQorCWludAkJbm1hcHMpCiB7CiAJeGZzX21vdW50X3QJKm1wID0gaXAtPmlfbW91bnQ7CiAJeGZzX2ZpbGVvZmZfdAlvZmZzZXRfZnNiOwpAQCAtMjc5LDcgKzE1OSw3IEBACiAJCWlmIChlcnJvcikKIAkJCWdvdG8gZXJyb3Jfb3V0OwogCX0gZWxzZSB7Ci0JCWlmICgqbm1hcHMgJiYgKGltYXAtPmJyX3N0YXJ0YmxvY2sgPT0gSE9MRVNUQVJUQkxPQ0spKQorCQlpZiAobm1hcHMgJiYgKGltYXAtPmJyX3N0YXJ0YmxvY2sgPT0gSE9MRVNUQVJUQkxPQ0spKQogCQkJbGFzdF9mc2IgPSBNSU4obGFzdF9mc2IsICh4ZnNfZmlsZW9mZl90KQogCQkJCQlpbWFwLT5icl9ibG9ja2NvdW50ICsKIAkJCQkJaW1hcC0+YnJfc3RhcnRvZmYpOwpAQCAtMzMxLDcgKzIxMSw3IEBACiAJeGZzX3RyYW5zX2lqb2luKHRwLCBpcCk7CiAKIAlibWFwaV9mbGFnID0gWEZTX0JNQVBJX1dSSVRFOwotCWlmICgoZmxhZ3MgJiBCTUFQSV9ESVJFQ1QpICYmIChvZmZzZXQgPCBpcC0+aV9zaXplIHx8IGV4dHN6KSkKKwlpZiAob2Zmc2V0IDwgaXAtPmlfc2l6ZSB8fCBleHRzeikKIAkJYm1hcGlfZmxhZyB8PSBYRlNfQk1BUElfUFJFQUxMT0M7CiAKIAkvKgpAQCAtMzcwLDcgKzI1MCw2IEBACiAJCWdvdG8gZXJyb3Jfb3V0OwogCX0KIAotCSpubWFwcyA9IDE7CiAJcmV0dXJuIDA7CiAKIGVycm9yMDoJLyogQ2FuY2VsIGJtYXAsIHVubG9jayBpbm9kZSwgdW5yZXNlcnZlIHF1b3RhIGJsb2NrcywgY2FuY2VsIHRyYW5zICovCkBAIC0zNzksNyArMjU4LDYgQEAKIAogZXJyb3IxOgkvKiBKdXN0IGNhbmNlbCB0cmFuc2FjdGlvbiAqLwogCXhmc190cmFuc19jYW5jZWwodHAsIFhGU19UUkFOU19SRUxFQVNFX0xPR19SRVMgfCBYRlNfVFJBTlNfQUJPUlQpOwotCSpubWFwcyA9IDA7CS8qIG5vdGhpbmcgc2V0LXVwIGhlcmUgKi8KIAogZXJyb3Jfb3V0OgogCXJldHVybiBYRlNfRVJST1IoZXJyb3IpOwpAQCAtMzg5LDYgKzI2Nyw5IEBACiAgKiBJZiB0aGUgY2FsbGVyIGlzIGRvaW5nIGEgd3JpdGUgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZSwgdGhlbiBleHRlbmQgdGhlCiAgKiBhbGxvY2F0aW9uIG91dCB0byB0aGUgZmlsZSBzeXN0ZW0ncyB3cml0ZSBpb3NpemUuICBXZSBjbGVhbiB1cCBhbnkgZXh0cmEKICAqIHNwYWNlIGxlZnQgb3ZlciB3aGVuIHRoZSBmaWxlIGlzIGNsb3NlZCBpbiB4ZnNfaW5hY3RpdmUoKS4KKyAqCisgKiBJZiB3ZSBmaW5kIHdlIGFscmVhZHkgaGF2ZSBkZWxhbGxvYyBwcmVhbGxvY2F0aW9uIGJleW9uZCBFT0YsIGRvbid0IGRvIG1vcmUKKyAqIHByZWFsbG9jYXRpb24gYXMgaXQgaXQgbm90IG5lZWRlZC4KICAqLwogU1RBVElDIGludAogeGZzX2lvbWFwX2VvZl93YW50X3ByZWFsbG9jYXRlKApAQCAtMzk2LDcgKzI3Nyw2IEBACiAJeGZzX2lub2RlX3QJKmlwLAogCXhmc19vZmZfdAlvZmZzZXQsCiAJc2l6ZV90CQljb3VudCwKLQlpbnQJCWlvZmxhZywKIAl4ZnNfYm1idF9pcmVjX3QgKmltYXAsCiAJaW50CQluaW1hcHMsCiAJaW50CQkqcHJlYWxsb2MpCkBAIC00MDUsNiArMjg1LDcgQEAKIAl4ZnNfZmlsYmxrc190ICAgY291bnRfZnNiOwogCXhmc19mc2Jsb2NrX3QJZmlyc3RibG9jazsKIAlpbnQJCW4sIGVycm9yLCBpbWFwczsKKwlpbnQJCWZvdW5kX2RlbGFsbG9jID0gMDsKIAogCSpwcmVhbGxvYyA9IDA7CiAJaWYgKChvZmZzZXQgKyBjb3VudCkgPD0gaXAtPmlfc2l6ZSkKQEAgLTQyOSwyMCArMzEwLDY2IEBACiAJCQkJcmV0dXJuIDA7CiAJCQlzdGFydF9mc2IgKz0gaW1hcFtuXS5icl9ibG9ja2NvdW50OwogCQkJY291bnRfZnNiIC09IGltYXBbbl0uYnJfYmxvY2tjb3VudDsKKworCQkJaWYgKGltYXBbbl0uYnJfc3RhcnRibG9jayA9PSBERUxBWVNUQVJUQkxPQ0spCisJCQkJZm91bmRfZGVsYWxsb2MgPSAxOwogCQl9CiAJfQotCSpwcmVhbGxvYyA9IDE7CisJaWYgKCFmb3VuZF9kZWxhbGxvYykKKwkJKnByZWFsbG9jID0gMTsKIAlyZXR1cm4gMDsKIH0KIAotU1RBVElDIGludAorLyoKKyAqIElmIHdlIGRvbid0IGhhdmUgYSB1c2VyIHNwZWNpZmllZCBwcmVhbGxvY2F0aW9uIHNpemUsIGR5bmFtaWNhbGx5IGluY3JlYXNlCisgKiB0aGUgcHJlYWxsb2NhdGlvbiBzaXplIGFzIHRoZSBzaXplIG9mIHRoZSBmaWxlIGdyb3dzLiBDYXAgdGhlIG1heGltdW0gc2l6ZQorICogYXQgYSBzaW5nbGUgZXh0ZW50IG9yIGxlc3MgaWYgdGhlIGZpbGVzeXN0ZW0gaXMgbmVhciBmdWxsLiBUaGUgY2xvc2VyIHRoZQorICogZmlsZXN5c3RlbSBpcyB0byBmdWxsLCB0aGUgc21hbGxlciB0aGUgbWF4aW11bSBwcmVhbG9jYXRpb24uCisgKi8KK1NUQVRJQyB4ZnNfZnNibG9ja190Cit4ZnNfaW9tYXBfcHJlYWxsb2Nfc2l6ZSgKKwlzdHJ1Y3QgeGZzX21vdW50CSptcCwKKwlzdHJ1Y3QgeGZzX2lub2RlCSppcCkKK3sKKwl4ZnNfZnNibG9ja190CQlhbGxvY19ibG9ja3MgPSAwOworCisJaWYgKCEobXAtPm1fZmxhZ3MgJiBYRlNfTU9VTlRfREZMVF9JT1NJWkUpKSB7CisJCWludCBzaGlmdCA9IDA7CisJCWludDY0X3QgZnJlZXNwOworCisJCWFsbG9jX2Jsb2NrcyA9IFhGU19CX1RPX0ZTQihtcCwgaXAtPmlfc2l6ZSk7CisJCWFsbG9jX2Jsb2NrcyA9IFhGU19GSUxFT0ZGX01JTihNQVhFWFRMRU4sCisJCQkJCXJvdW5kZG93bl9wb3dfb2ZfdHdvKGFsbG9jX2Jsb2NrcykpOworCisJCXhmc19pY3NiX3N5bmNfY291bnRlcnMobXAsIFhGU19JQ1NCX0xBWllfQ09VTlQpOworCQlmcmVlc3AgPSBtcC0+bV9zYi5zYl9mZGJsb2NrczsKKwkJaWYgKGZyZWVzcCA8IG1wLT5tX2xvd19zcGFjZVtYRlNfTE9XU1BfNV9QQ05UXSkgeworCQkJc2hpZnQgPSAyOworCQkJaWYgKGZyZWVzcCA8IG1wLT5tX2xvd19zcGFjZVtYRlNfTE9XU1BfNF9QQ05UXSkKKwkJCQlzaGlmdCsrOworCQkJaWYgKGZyZWVzcCA8IG1wLT5tX2xvd19zcGFjZVtYRlNfTE9XU1BfM19QQ05UXSkKKwkJCQlzaGlmdCsrOworCQkJaWYgKGZyZWVzcCA8IG1wLT5tX2xvd19zcGFjZVtYRlNfTE9XU1BfMl9QQ05UXSkKKwkJCQlzaGlmdCsrOworCQkJaWYgKGZyZWVzcCA8IG1wLT5tX2xvd19zcGFjZVtYRlNfTE9XU1BfMV9QQ05UXSkKKwkJCQlzaGlmdCsrOworCQl9CisJCWlmIChzaGlmdCkKKwkJCWFsbG9jX2Jsb2NrcyA+Pj0gc2hpZnQ7CisJfQorCisJaWYgKGFsbG9jX2Jsb2NrcyA8IG1wLT5tX3dyaXRlaW9fYmxvY2tzKQorCQlhbGxvY19ibG9ja3MgPSBtcC0+bV93cml0ZWlvX2Jsb2NrczsKKworCXJldHVybiBhbGxvY19ibG9ja3M7Cit9CisKK2ludAogeGZzX2lvbWFwX3dyaXRlX2RlbGF5KAogCXhmc19pbm9kZV90CSppcCwKIAl4ZnNfb2ZmX3QJb2Zmc2V0LAogCXNpemVfdAkJY291bnQsCi0JaW50CQlpb2ZsYWcsCi0JeGZzX2JtYnRfaXJlY190ICpyZXRfaW1hcCwKLQlpbnQJCSpubWFwcykKKwl4ZnNfYm1idF9pcmVjX3QgKnJldF9pbWFwKQogewogCXhmc19tb3VudF90CSptcCA9IGlwLT5pX21vdW50OwogCXhmc19maWxlb2ZmX3QJb2Zmc2V0X2ZzYjsKQEAgLTQ2OSwxNiArMzk2LDE5IEBACiAJZXh0c3ogPSB4ZnNfZ2V0X2V4dHN6X2hpbnQoaXApOwogCW9mZnNldF9mc2IgPSBYRlNfQl9UT19GU0JUKG1wLCBvZmZzZXQpOwogCisKIAllcnJvciA9IHhmc19pb21hcF9lb2Zfd2FudF9wcmVhbGxvY2F0ZShtcCwgaXAsIG9mZnNldCwgY291bnQsCi0JCQkJaW9mbGFnLCBpbWFwLCBYRlNfV1JJVEVfSU1BUFMsICZwcmVhbGxvYyk7CisJCQkJaW1hcCwgWEZTX1dSSVRFX0lNQVBTLCAmcHJlYWxsb2MpOwogCWlmIChlcnJvcikKIAkJcmV0dXJuIGVycm9yOwogCiByZXRyeToKIAlpZiAocHJlYWxsb2MpIHsKKwkJeGZzX2ZzYmxvY2tfdAlhbGxvY19ibG9ja3MgPSB4ZnNfaW9tYXBfcHJlYWxsb2Nfc2l6ZShtcCwgaXApOworCiAJCWFsaWduZWRfb2Zmc2V0ID0gWEZTX1dSSVRFSU9fQUxJR04obXAsIChvZmZzZXQgKyBjb3VudCAtIDEpKTsKIAkJaW9hbGlnbiA9IFhGU19CX1RPX0ZTQlQobXAsIGFsaWduZWRfb2Zmc2V0KTsKLQkJbGFzdF9mc2IgPSBpb2FsaWduICsgbXAtPm1fd3JpdGVpb19ibG9ja3M7CisJCWxhc3RfZnNiID0gaW9hbGlnbiArIGFsbG9jX2Jsb2NrczsKIAl9IGVsc2UgewogCQlsYXN0X2ZzYiA9IFhGU19CX1RPX0ZTQihtcCwgKCh4ZnNfdWZzaXplX3QpKG9mZnNldCArIGNvdW50KSkpOwogCX0KQEAgLTQ5NiwyMiArNDI2LDMxIEBACiAJCQkgIFhGU19CTUFQSV9ERUxBWSB8IFhGU19CTUFQSV9XUklURSB8CiAJCQkgIFhGU19CTUFQSV9FTlRJUkUsICZmaXJzdGJsb2NrLCAxLCBpbWFwLAogCQkJICAmbmltYXBzLCBOVUxMKTsKLQlpZiAoZXJyb3IgJiYgKGVycm9yICE9IEVOT1NQQykpCisJc3dpdGNoIChlcnJvcikgeworCWNhc2UgMDoKKwljYXNlIEVOT1NQQzoKKwljYXNlIEVEUVVPVDoKKwkJYnJlYWs7CisJZGVmYXVsdDoKIAkJcmV0dXJuIFhGU19FUlJPUihlcnJvcik7CisJfQogCiAJLyoKLQkgKiBJZiBibWFwaSByZXR1cm5lZCB1cyBub3RoaW5nLCBhbmQgaWYgd2UgZGlkbid0IGdldCBiYWNrIEVEUVVPVCwKLQkgKiB0aGVuIHdlIG11c3QgaGF2ZSBydW4gb3V0IG9mIHNwYWNlIC0gZmx1c2ggYWxsIG90aGVyIGlub2RlcyB3aXRoCi0JICogZGVsYWxsb2MgYmxvY2tzIGFuZCByZXRyeSB3aXRob3V0IEVPRiBwcmVhbGxvY2F0aW9uLgorCSAqIElmIGJtYXBpIHJldHVybmVkIHVzIG5vdGhpbmcsIHdlIGdvdCBlaXRoZXIgRU5PU1BDIG9yIEVEUVVPVC4gIEZvcgorCSAqIEVOT1NQQywgKiBmbHVzaCBhbGwgb3RoZXIgaW5vZGVzIHdpdGggZGVsYWxsb2MgYmxvY2tzIHRvIGZyZWUgdXAKKwkgKiBzb21lIG9mIHRoZSBleGNlc3MgcmVzZXJ2ZWQgbWV0YWRhdGEgc3BhY2UuIEZvciBib3RoIGNhc2VzLCByZXRyeQorCSAqIHdpdGhvdXQgRU9GIHByZWFsbG9jYXRpb24uCiAJICovCiAJaWYgKG5pbWFwcyA9PSAwKSB7CiAJCXRyYWNlX3hmc19kZWxhbGxvY19lbm9zcGMoaXAsIG9mZnNldCwgY291bnQpOwogCQlpZiAoZmx1c2hlZCkKLQkJCXJldHVybiBYRlNfRVJST1IoRU5PU1BDKTsKKwkJCXJldHVybiBYRlNfRVJST1IoZXJyb3IgPyBlcnJvciA6IEVOT1NQQyk7CiAKLQkJeGZzX2l1bmxvY2soaXAsIFhGU19JTE9DS19FWENMKTsKLQkJeGZzX2ZsdXNoX2lub2RlcyhpcCk7Ci0JCXhmc19pbG9jayhpcCwgWEZTX0lMT0NLX0VYQ0wpOworCQlpZiAoZXJyb3IgPT0gRU5PU1BDKSB7CisJCQl4ZnNfaXVubG9jayhpcCwgWEZTX0lMT0NLX0VYQ0wpOworCQkJeGZzX2ZsdXNoX2lub2RlcyhpcCk7CisJCQl4ZnNfaWxvY2soaXAsIFhGU19JTE9DS19FWENMKTsKKwkJfQogCiAJCWZsdXNoZWQgPSAxOwogCQllcnJvciA9IDA7CkBAIC01MjMsOCArNDYyLDYgQEAKIAkJcmV0dXJuIHhmc19jbW5fZXJyX2ZzYmxvY2tfemVybyhpcCwgJmltYXBbMF0pOwogCiAJKnJldF9pbWFwID0gaW1hcFswXTsKLQkqbm1hcHMgPSAxOwotCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTUzOCwxMyArNDc1LDEyIEBACiAgKiBXZSBubyBsb25nZXIgYm90aGVyIHRvIGxvb2sgYXQgdGhlIGluY29taW5nIG1hcCAtIGFsbCB3ZSBoYXZlIHRvCiAgKiBndWFyYW50ZWUgaXMgdGhhdCB3aGF0ZXZlciB3ZSBhbGxvY2F0ZSBmaWxscyB0aGUgcmVxdWlyZWQgcmFuZ2UuCiAgKi8KLVNUQVRJQyBpbnQKK2ludAogeGZzX2lvbWFwX3dyaXRlX2FsbG9jYXRlKAogCXhmc19pbm9kZV90CSppcCwKIAl4ZnNfb2ZmX3QJb2Zmc2V0LAogCXNpemVfdAkJY291bnQsCi0JeGZzX2JtYnRfaXJlY190ICppbWFwLAotCWludAkJKnJldG1hcCkKKwl4ZnNfYm1idF9pcmVjX3QgKmltYXApCiB7CiAJeGZzX21vdW50X3QJKm1wID0gaXAtPmlfbW91bnQ7CiAJeGZzX2ZpbGVvZmZfdAlvZmZzZXRfZnNiLCBsYXN0X2Jsb2NrOwpAQCAtNTU3LDggKzQ5Myw2IEBACiAJaW50CQllcnJvciA9IDA7CiAJaW50CQlucmVzOwogCi0JKnJldG1hcCA9IDA7Ci0KIAkvKgogCSAqIE1ha2Ugc3VyZSB0aGF0IHRoZSBkcXVvdHMgYXJlIHRoZXJlLgogCSAqLwpAQCAtNjgwLDcgKzYxNCw2IEBACiAJCWlmICgob2Zmc2V0X2ZzYiA+PSBpbWFwLT5icl9zdGFydG9mZikgJiYKIAkJICAgIChvZmZzZXRfZnNiIDwgKGltYXAtPmJyX3N0YXJ0b2ZmICsKIAkJCQkgICBpbWFwLT5icl9ibG9ja2NvdW50KSkpIHsKLQkJCSpyZXRtYXAgPSAxOwogCQkJWEZTX1NUQVRTX0lOQyh4c194c3RyYXRfcXVpY2spOwogCQkJcmV0dXJuIDA7CiAJCX0KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfaW9tYXAuaCBiL2ZzL3hmcy94ZnNfaW9tYXAuaAppbmRleCA3NzQ4YTQzLi44MDYxNTc2IDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2lvbWFwLmgKKysrIGIvZnMveGZzL3hmc19pb21hcC5oCkBAIC0xOCwzMCArMTgsMTUgQEAKICNpZm5kZWYgX19YRlNfSU9NQVBfSF9fCiAjZGVmaW5lIF9fWEZTX0lPTUFQX0hfXwogCi0vKiBiYXNlIGV4dGVudCBtYW5pcHVsYXRpb24gY2FsbHMgKi8KLSNkZWZpbmUgQk1BUElfUkVBRAkoMSA8PCAwKQkvKiByZWFkIGV4dGVudHMgKi8KLSNkZWZpbmUgQk1BUElfV1JJVEUJKDEgPDwgMSkJLyogY3JlYXRlIGV4dGVudHMgKi8KLSNkZWZpbmUgQk1BUElfQUxMT0NBVEUJKDEgPDwgMikJLyogZGVsYXllZCBhbGxvY2F0ZSB0byByZWFsIGV4dGVudHMgKi8KLQotLyogbW9kaWZpZXJzICovCi0jZGVmaW5lIEJNQVBJX0lHTlNUQVRFCSgxIDw8IDQpCS8qIGlnbm9yZSB1bndyaXR0ZW4gc3RhdGUgb24gcmVhZCAqLwotI2RlZmluZSBCTUFQSV9ESVJFQ1QJKDEgPDwgNSkJLyogZGlyZWN0IGluc3RlYWQgb2YgYnVmZmVyZWQgd3JpdGUgKi8KLSNkZWZpbmUgQk1BUElfTU1BCSgxIDw8IDYpCS8qIGFsbG9jYXRlIGZvciBtbWFwIHdyaXRlICovCi0jZGVmaW5lIEJNQVBJX1RSWUxPQ0sJKDEgPDwgNykJLyogbm9uLWJsb2NraW5nIHJlcXVlc3QgKi8KLQotI2RlZmluZSBCTUFQSV9GTEFHUyBcCi0JeyBCTUFQSV9SRUFELAkJIlJFQUQiIH0sIFwKLQl7IEJNQVBJX1dSSVRFLAkJIldSSVRFIiB9LCBcCi0JeyBCTUFQSV9BTExPQ0FURSwJIkFMTE9DQVRFIiB9LCBcCi0JeyBCTUFQSV9JR05TVEFURSwJIklHTlNUQVRFIiB9LCBcCi0JeyBCTUFQSV9ESVJFQ1QsCQkiRElSRUNUIiB9LCBcCi0JeyBCTUFQSV9UUllMT0NLLAkiVFJZTE9DSyIgfQotCiBzdHJ1Y3QgeGZzX2lub2RlOwogc3RydWN0IHhmc19ibWJ0X2lyZWM7CiAKLWV4dGVybiBpbnQgeGZzX2lvbWFwKHN0cnVjdCB4ZnNfaW5vZGUgKiwgeGZzX29mZl90LCBzc2l6ZV90LCBpbnQsCi0JCSAgICAgc3RydWN0IHhmc19ibWJ0X2lyZWMgKiwgaW50ICosIGludCAqKTsKK2V4dGVybiBpbnQgeGZzX2lvbWFwX3dyaXRlX2RpcmVjdChzdHJ1Y3QgeGZzX2lub2RlICosIHhmc19vZmZfdCwgc2l6ZV90LAorCQkJc3RydWN0IHhmc19ibWJ0X2lyZWMgKiwgaW50KTsKK2V4dGVybiBpbnQgeGZzX2lvbWFwX3dyaXRlX2RlbGF5KHN0cnVjdCB4ZnNfaW5vZGUgKiwgeGZzX29mZl90LCBzaXplX3QsCisJCQlzdHJ1Y3QgeGZzX2JtYnRfaXJlYyAqKTsKK2V4dGVybiBpbnQgeGZzX2lvbWFwX3dyaXRlX2FsbG9jYXRlKHN0cnVjdCB4ZnNfaW5vZGUgKiwgeGZzX29mZl90LCBzaXplX3QsCisJCQlzdHJ1Y3QgeGZzX2JtYnRfaXJlYyAqKTsKIGV4dGVybiBpbnQgeGZzX2lvbWFwX3dyaXRlX3Vud3JpdHRlbihzdHJ1Y3QgeGZzX2lub2RlICosIHhmc19vZmZfdCwgc2l6ZV90KTsKIAogI2VuZGlmIC8qIF9fWEZTX0lPTUFQX0hfXyovCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2xvZy5jIGIvZnMveGZzL3hmc19sb2cuYwppbmRleCBjZWU0YWI5Li4wYmYyNGIxIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2xvZy5jCisrKyBiL2ZzL3hmcy94ZnNfbG9nLmMKQEAgLTQ3LDcgKzQ3LDcgQEAKIAkJCQl4ZnNfYnVmdGFyZ190CSpsb2dfdGFyZ2V0LAogCQkJCXhmc19kYWRkcl90CWJsa19vZmZzZXQsCiAJCQkJaW50CQludW1fYmJsa3MpOwotU1RBVElDIGludAkgeGxvZ19zcGFjZV9sZWZ0KHhsb2dfdCAqbG9nLCBpbnQgY3ljbGUsIGludCBieXRlcyk7CitTVEFUSUMgaW50CSB4bG9nX3NwYWNlX2xlZnQoc3RydWN0IGxvZyAqbG9nLCBhdG9taWM2NF90ICpoZWFkKTsKIFNUQVRJQyBpbnQJIHhsb2dfc3luYyh4bG9nX3QgKmxvZywgeGxvZ19pbl9jb3JlX3QgKmljbG9nKTsKIFNUQVRJQyB2b2lkCSB4bG9nX2RlYWxsb2NfbG9nKHhsb2dfdCAqbG9nKTsKIApAQCAtNzAsNyArNzAsNyBAQAogLyogbG9jYWwgZnVuY3Rpb25zIHRvIG1hbmlwdWxhdGUgZ3JhbnQgaGVhZCAqLwogU1RBVElDIGludCAgeGxvZ19ncmFudF9sb2dfc3BhY2UoeGxvZ190CQkqbG9nLAogCQkJCSB4bG9nX3RpY2tldF90CSp4dGljKTsKLVNUQVRJQyB2b2lkIHhsb2dfZ3JhbnRfcHVzaF9haWwoeGZzX21vdW50X3QJKm1wLAorU1RBVElDIHZvaWQgeGxvZ19ncmFudF9wdXNoX2FpbChzdHJ1Y3QgbG9nCSpsb2csCiAJCQkJaW50CQluZWVkX2J5dGVzKTsKIFNUQVRJQyB2b2lkIHhsb2dfcmVncmFudF9yZXNlcnZlX2xvZ19zcGFjZSh4bG9nX3QJICpsb2csCiAJCQkJCSAgIHhsb2dfdGlja2V0X3QgKnRpY2tldCk7CkBAIC04MSw5OCArODEsNzMgQEAKIAogI2lmIGRlZmluZWQoREVCVUcpCiBTVEFUSUMgdm9pZAl4bG9nX3ZlcmlmeV9kZXN0X3B0cih4bG9nX3QgKmxvZywgY2hhciAqcHRyKTsKLVNUQVRJQyB2b2lkCXhsb2dfdmVyaWZ5X2dyYW50X2hlYWQoeGxvZ190ICpsb2csIGludCBlcXVhbHMpOworU1RBVElDIHZvaWQJeGxvZ192ZXJpZnlfZ3JhbnRfdGFpbChzdHJ1Y3QgbG9nICpsb2cpOwogU1RBVElDIHZvaWQJeGxvZ192ZXJpZnlfaWNsb2coeGxvZ190ICpsb2csIHhsb2dfaW5fY29yZV90ICppY2xvZywKIAkJCQkgIGludCBjb3VudCwgYm9vbGVhbl90IHN5bmNpbmcpOwogU1RBVElDIHZvaWQJeGxvZ192ZXJpZnlfdGFpbF9sc24oeGxvZ190ICpsb2csIHhsb2dfaW5fY29yZV90ICppY2xvZywKIAkJCQkgICAgIHhmc19sc25fdCB0YWlsX2xzbik7CiAjZWxzZQogI2RlZmluZSB4bG9nX3ZlcmlmeV9kZXN0X3B0cihhLGIpCi0jZGVmaW5lIHhsb2dfdmVyaWZ5X2dyYW50X2hlYWQoYSxiKQorI2RlZmluZSB4bG9nX3ZlcmlmeV9ncmFudF90YWlsKGEpCiAjZGVmaW5lIHhsb2dfdmVyaWZ5X2ljbG9nKGEsYixjLGQpCiAjZGVmaW5lIHhsb2dfdmVyaWZ5X3RhaWxfbHNuKGEsYixjKQogI2VuZGlmCiAKIFNUQVRJQyBpbnQJeGxvZ19pY2xvZ3NfZW1wdHkoeGxvZ190ICpsb2cpOwogCi0KIHN0YXRpYyB2b2lkCi14bG9nX2luc190aWNrZXRxKHN0cnVjdCB4bG9nX3RpY2tldCAqKnFwLCBzdHJ1Y3QgeGxvZ190aWNrZXQgKnRpYykKK3hsb2dfZ3JhbnRfc3ViX3NwYWNlKAorCXN0cnVjdCBsb2cJKmxvZywKKwlhdG9taWM2NF90CSpoZWFkLAorCWludAkJYnl0ZXMpCiB7Ci0JaWYgKCpxcCkgewotCQl0aWMtPnRfbmV4dAkgICAgPSAoKnFwKTsKLQkJdGljLT50X3ByZXYJICAgID0gKCpxcCktPnRfcHJldjsKLQkJKCpxcCktPnRfcHJldi0+dF9uZXh0ID0gdGljOwotCQkoKnFwKS0+dF9wcmV2CSAgICA9IHRpYzsKLQl9IGVsc2UgewotCQl0aWMtPnRfcHJldiA9IHRpYy0+dF9uZXh0ID0gdGljOwotCQkqcXAgPSB0aWM7Ci0JfQorCWludDY0X3QJaGVhZF92YWwgPSBhdG9taWM2NF9yZWFkKGhlYWQpOworCWludDY0X3QgbmV3LCBvbGQ7CiAKLQl0aWMtPnRfZmxhZ3MgfD0gWExPR19USUNfSU5fUTsKKwlkbyB7CisJCWludAljeWNsZSwgc3BhY2U7CisKKwkJeGxvZ19jcmFja19ncmFudF9oZWFkX3ZhbChoZWFkX3ZhbCwgJmN5Y2xlLCAmc3BhY2UpOworCisJCXNwYWNlIC09IGJ5dGVzOworCQlpZiAoc3BhY2UgPCAwKSB7CisJCQlzcGFjZSArPSBsb2ctPmxfbG9nc2l6ZTsKKwkJCWN5Y2xlLS07CisJCX0KKworCQlvbGQgPSBoZWFkX3ZhbDsKKwkJbmV3ID0geGxvZ19hc3NpZ25fZ3JhbnRfaGVhZF92YWwoY3ljbGUsIHNwYWNlKTsKKwkJaGVhZF92YWwgPSBhdG9taWM2NF9jbXB4Y2hnKGhlYWQsIG9sZCwgbmV3KTsKKwl9IHdoaWxlIChoZWFkX3ZhbCAhPSBvbGQpOwogfQogCiBzdGF0aWMgdm9pZAoteGxvZ19kZWxfdGlja2V0cShzdHJ1Y3QgeGxvZ190aWNrZXQgKipxcCwgc3RydWN0IHhsb2dfdGlja2V0ICp0aWMpCit4bG9nX2dyYW50X2FkZF9zcGFjZSgKKwlzdHJ1Y3QgbG9nCSpsb2csCisJYXRvbWljNjRfdAkqaGVhZCwKKwlpbnQJCWJ5dGVzKQogewotCWlmICh0aWMgPT0gdGljLT50X25leHQpIHsKLQkJKnFwID0gTlVMTDsKLQl9IGVsc2UgewotCQkqcXAgPSB0aWMtPnRfbmV4dDsKLQkJdGljLT50X25leHQtPnRfcHJldiA9IHRpYy0+dF9wcmV2OwotCQl0aWMtPnRfcHJldi0+dF9uZXh0ID0gdGljLT50X25leHQ7Ci0JfQorCWludDY0X3QJaGVhZF92YWwgPSBhdG9taWM2NF9yZWFkKGhlYWQpOworCWludDY0X3QgbmV3LCBvbGQ7CiAKLQl0aWMtPnRfbmV4dCA9IHRpYy0+dF9wcmV2ID0gTlVMTDsKLQl0aWMtPnRfZmxhZ3MgJj0gflhMT0dfVElDX0lOX1E7Ci19CisJZG8geworCQlpbnQJCXRtcDsKKwkJaW50CQljeWNsZSwgc3BhY2U7CiAKLXN0YXRpYyB2b2lkCi14bG9nX2dyYW50X3N1Yl9zcGFjZShzdHJ1Y3QgbG9nICpsb2csIGludCBieXRlcykKLXsKLQlsb2ctPmxfZ3JhbnRfd3JpdGVfYnl0ZXMgLT0gYnl0ZXM7Ci0JaWYgKGxvZy0+bF9ncmFudF93cml0ZV9ieXRlcyA8IDApIHsKLQkJbG9nLT5sX2dyYW50X3dyaXRlX2J5dGVzICs9IGxvZy0+bF9sb2dzaXplOwotCQlsb2ctPmxfZ3JhbnRfd3JpdGVfY3ljbGUtLTsKLQl9CisJCXhsb2dfY3JhY2tfZ3JhbnRfaGVhZF92YWwoaGVhZF92YWwsICZjeWNsZSwgJnNwYWNlKTsKIAotCWxvZy0+bF9ncmFudF9yZXNlcnZlX2J5dGVzIC09IGJ5dGVzOwotCWlmICgobG9nKS0+bF9ncmFudF9yZXNlcnZlX2J5dGVzIDwgMCkgewotCQlsb2ctPmxfZ3JhbnRfcmVzZXJ2ZV9ieXRlcyArPSBsb2ctPmxfbG9nc2l6ZTsKLQkJbG9nLT5sX2dyYW50X3Jlc2VydmVfY3ljbGUtLTsKLQl9CisJCXRtcCA9IGxvZy0+bF9sb2dzaXplIC0gc3BhY2U7CisJCWlmICh0bXAgPiBieXRlcykKKwkJCXNwYWNlICs9IGJ5dGVzOworCQllbHNlIHsKKwkJCXNwYWNlID0gYnl0ZXMgLSB0bXA7CisJCQljeWNsZSsrOworCQl9CiAKLX0KLQotc3RhdGljIHZvaWQKLXhsb2dfZ3JhbnRfYWRkX3NwYWNlX3dyaXRlKHN0cnVjdCBsb2cgKmxvZywgaW50IGJ5dGVzKQotewotCWludCB0bXAgPSBsb2ctPmxfbG9nc2l6ZSAtIGxvZy0+bF9ncmFudF93cml0ZV9ieXRlczsKLQlpZiAodG1wID4gYnl0ZXMpCi0JCWxvZy0+bF9ncmFudF93cml0ZV9ieXRlcyArPSBieXRlczsKLQllbHNlIHsKLQkJbG9nLT5sX2dyYW50X3dyaXRlX2N5Y2xlKys7Ci0JCWxvZy0+bF9ncmFudF93cml0ZV9ieXRlcyA9IGJ5dGVzIC0gdG1wOwotCX0KLX0KLQotc3RhdGljIHZvaWQKLXhsb2dfZ3JhbnRfYWRkX3NwYWNlX3Jlc2VydmUoc3RydWN0IGxvZyAqbG9nLCBpbnQgYnl0ZXMpCi17Ci0JaW50IHRtcCA9IGxvZy0+bF9sb2dzaXplIC0gbG9nLT5sX2dyYW50X3Jlc2VydmVfYnl0ZXM7Ci0JaWYgKHRtcCA+IGJ5dGVzKQotCQlsb2ctPmxfZ3JhbnRfcmVzZXJ2ZV9ieXRlcyArPSBieXRlczsKLQllbHNlIHsKLQkJbG9nLT5sX2dyYW50X3Jlc2VydmVfY3ljbGUrKzsKLQkJbG9nLT5sX2dyYW50X3Jlc2VydmVfYnl0ZXMgPSBieXRlcyAtIHRtcDsKLQl9Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZAoteGxvZ19ncmFudF9hZGRfc3BhY2Uoc3RydWN0IGxvZyAqbG9nLCBpbnQgYnl0ZXMpCi17Ci0JeGxvZ19ncmFudF9hZGRfc3BhY2Vfd3JpdGUobG9nLCBieXRlcyk7Ci0JeGxvZ19ncmFudF9hZGRfc3BhY2VfcmVzZXJ2ZShsb2csIGJ5dGVzKTsKKwkJb2xkID0gaGVhZF92YWw7CisJCW5ldyA9IHhsb2dfYXNzaWduX2dyYW50X2hlYWRfdmFsKGN5Y2xlLCBzcGFjZSk7CisJCWhlYWRfdmFsID0gYXRvbWljNjRfY21weGNoZyhoZWFkLCBvbGQsIG5ldyk7CisJfSB3aGlsZSAoaGVhZF92YWwgIT0gb2xkKTsKIH0KIAogc3RhdGljIHZvaWQKQEAgLTM1NSw3ICszMzAsNyBAQAogCiAJCXRyYWNlX3hmc19sb2dfcmVzZXJ2ZShsb2csIGludGVybmFsX3RpY2tldCk7CiAKLQkJeGxvZ19ncmFudF9wdXNoX2FpbChtcCwgaW50ZXJuYWxfdGlja2V0LT50X3VuaXRfcmVzKTsKKwkJeGxvZ19ncmFudF9wdXNoX2FpbChsb2csIGludGVybmFsX3RpY2tldC0+dF91bml0X3Jlcyk7CiAJCXJldHZhbCA9IHhsb2dfcmVncmFudF93cml0ZV9sb2dfc3BhY2UobG9nLCBpbnRlcm5hbF90aWNrZXQpOwogCX0gZWxzZSB7CiAJCS8qIG1heSBzbGVlcCBpZiBuZWVkIHRvIGFsbG9jYXRlIG1vcmUgdGlja2V0cyAqLwpAQCAtMzY5LDcgKzM0NCw3IEBACiAKIAkJdHJhY2VfeGZzX2xvZ19yZXNlcnZlKGxvZywgaW50ZXJuYWxfdGlja2V0KTsKIAotCQl4bG9nX2dyYW50X3B1c2hfYWlsKG1wLAorCQl4bG9nX2dyYW50X3B1c2hfYWlsKGxvZywKIAkJCQkgICAgKGludGVybmFsX3RpY2tldC0+dF91bml0X3JlcyAqCiAJCQkJICAgICBpbnRlcm5hbF90aWNrZXQtPnRfY250KSk7CiAJCXJldHZhbCA9IHhsb2dfZ3JhbnRfbG9nX3NwYWNlKGxvZywgaW50ZXJuYWxfdGlja2V0KTsKQEAgLTU4NCw4ICs1NTksOCBAQAogCQlpZiAoIShpY2xvZy0+aWNfc3RhdGUgPT0gWExPR19TVEFURV9BQ1RJVkUgfHwKIAkJICAgICAgaWNsb2ctPmljX3N0YXRlID09IFhMT0dfU1RBVEVfRElSVFkpKSB7CiAJCQlpZiAoIVhMT0dfRk9SQ0VEX1NIVVRET1dOKGxvZykpIHsKLQkJCQlzdl93YWl0KCZpY2xvZy0+aWNfZm9yY2Vfd2FpdCwgUE1FTSwKLQkJCQkJJmxvZy0+bF9pY2xvZ2xvY2ssIHMpOworCQkJCXhsb2dfd2FpdCgmaWNsb2ctPmljX2ZvcmNlX3dhaXQsCisJCQkJCQkJJmxvZy0+bF9pY2xvZ2xvY2spOwogCQkJfSBlbHNlIHsKIAkJCQlzcGluX3VubG9jaygmbG9nLT5sX2ljbG9nbG9jayk7CiAJCQl9CkBAIC02MjUsOCArNjAwLDggQEAKIAkJCXx8IGljbG9nLT5pY19zdGF0ZSA9PSBYTE9HX1NUQVRFX0RJUlRZCiAJCQl8fCBpY2xvZy0+aWNfc3RhdGUgPT0gWExPR19TVEFURV9JT0VSUk9SKSApIHsKIAotCQkJCXN2X3dhaXQoJmljbG9nLT5pY19mb3JjZV93YWl0LCBQTUVNLAotCQkJCQkmbG9nLT5sX2ljbG9nbG9jaywgcyk7CisJCQkJeGxvZ193YWl0KCZpY2xvZy0+aWNfZm9yY2Vfd2FpdCwKKwkJCQkJCQkmbG9nLT5sX2ljbG9nbG9jayk7CiAJCX0gZWxzZSB7CiAJCQlzcGluX3VubG9jaygmbG9nLT5sX2ljbG9nbG9jayk7CiAJCX0KQEAgLTcwMyw1NSArNjc4LDQ2IEBACiB7CiAJeGxvZ190aWNrZXRfdAkqdGljOwogCXhsb2dfdAkJKmxvZyA9IG1wLT5tX2xvZzsKLQlpbnQJCW5lZWRfYnl0ZXMsIGZyZWVfYnl0ZXMsIGN5Y2xlLCBieXRlczsKKwlpbnQJCW5lZWRfYnl0ZXMsIGZyZWVfYnl0ZXM7CiAKIAlpZiAoWExPR19GT1JDRURfU0hVVERPV04obG9nKSkKIAkJcmV0dXJuOwogCi0JaWYgKHRhaWxfbHNuID09IDApIHsKLQkJLyogbmVlZGVkIHNpbmNlIHN5bmNfbHNuIGlzIDY0IGJpdHMgKi8KLQkJc3Bpbl9sb2NrKCZsb2ctPmxfaWNsb2dsb2NrKTsKLQkJdGFpbF9sc24gPSBsb2ctPmxfbGFzdF9zeW5jX2xzbjsKLQkJc3Bpbl91bmxvY2soJmxvZy0+bF9pY2xvZ2xvY2spOwotCX0KKwlpZiAodGFpbF9sc24gPT0gMCkKKwkJdGFpbF9sc24gPSBhdG9taWM2NF9yZWFkKCZsb2ctPmxfbGFzdF9zeW5jX2xzbik7CiAKLQlzcGluX2xvY2soJmxvZy0+bF9ncmFudF9sb2NrKTsKKwkvKiB0YWlsX2xzbiA9PSAxIGltcGxpZXMgdGhhdCB3ZSB3ZXJlbid0IHBhc3NlZCBhIHZhbGlkIHZhbHVlLiAgKi8KKwlpZiAodGFpbF9sc24gIT0gMSkKKwkJYXRvbWljNjRfc2V0KCZsb2ctPmxfdGFpbF9sc24sIHRhaWxfbHNuKTsKIAotCS8qIEFsc28gYW4gaW52YWxpZCBsc24uICAxIGltcGxpZXMgdGhhdCB3ZSBhcmVuJ3QgcGFzc2luZyBpbiBhIHZhbGlkCi0JICogdGFpbF9sc24uCi0JICovCi0JaWYgKHRhaWxfbHNuICE9IDEpIHsKLQkJbG9nLT5sX3RhaWxfbHNuID0gdGFpbF9sc247Ci0JfQotCi0JaWYgKCh0aWMgPSBsb2ctPmxfd3JpdGVfaGVhZHEpKSB7CisJaWYgKCFsaXN0X2VtcHR5X2NhcmVmdWwoJmxvZy0+bF93cml0ZXEpKSB7CiAjaWZkZWYgREVCVUcKIAkJaWYgKGxvZy0+bF9mbGFncyAmIFhMT0dfQUNUSVZFX1JFQ09WRVJZKQogCQkJcGFuaWMoIlJlY292ZXJ5IHByb2JsZW0iKTsKICNlbmRpZgotCQljeWNsZSA9IGxvZy0+bF9ncmFudF93cml0ZV9jeWNsZTsKLQkJYnl0ZXMgPSBsb2ctPmxfZ3JhbnRfd3JpdGVfYnl0ZXM7Ci0JCWZyZWVfYnl0ZXMgPSB4bG9nX3NwYWNlX2xlZnQobG9nLCBjeWNsZSwgYnl0ZXMpOwotCQlkbyB7CisJCXNwaW5fbG9jaygmbG9nLT5sX2dyYW50X3dyaXRlX2xvY2spOworCQlmcmVlX2J5dGVzID0geGxvZ19zcGFjZV9sZWZ0KGxvZywgJmxvZy0+bF9ncmFudF93cml0ZV9oZWFkKTsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeSh0aWMsICZsb2ctPmxfd3JpdGVxLCB0X3F1ZXVlKSB7CiAJCQlBU1NFUlQodGljLT50X2ZsYWdzICYgWExPR19USUNfUEVSTV9SRVNFUlYpOwogCiAJCQlpZiAoZnJlZV9ieXRlcyA8IHRpYy0+dF91bml0X3JlcyAmJiB0YWlsX2xzbiAhPSAxKQogCQkJCWJyZWFrOwogCQkJdGFpbF9sc24gPSAwOwogCQkJZnJlZV9ieXRlcyAtPSB0aWMtPnRfdW5pdF9yZXM7Ci0JCQlzdl9zaWduYWwoJnRpYy0+dF93YWl0KTsKLQkJCXRpYyA9IHRpYy0+dF9uZXh0OwotCQl9IHdoaWxlICh0aWMgIT0gbG9nLT5sX3dyaXRlX2hlYWRxKTsKKwkJCXRyYWNlX3hmc19sb2dfcmVncmFudF93cml0ZV93YWtlX3VwKGxvZywgdGljKTsKKwkJCXdha2VfdXAoJnRpYy0+dF93YWl0KTsKKwkJfQorCQlzcGluX3VubG9jaygmbG9nLT5sX2dyYW50X3dyaXRlX2xvY2spOwogCX0KLQlpZiAoKHRpYyA9IGxvZy0+bF9yZXNlcnZlX2hlYWRxKSkgeworCisJaWYgKCFsaXN0X2VtcHR5X2NhcmVmdWwoJmxvZy0+bF9yZXNlcnZlcSkpIHsKICNpZmRlZiBERUJVRwogCQlpZiAobG9nLT5sX2ZsYWdzICYgWExPR19BQ1RJVkVfUkVDT1ZFUlkpCiAJCQlwYW5pYygiUmVjb3ZlcnkgcHJvYmxlbSIpOwogI2VuZGlmCi0JCWN5Y2xlID0gbG9nLT5sX2dyYW50X3Jlc2VydmVfY3ljbGU7Ci0JCWJ5dGVzID0gbG9nLT5sX2dyYW50X3Jlc2VydmVfYnl0ZXM7Ci0JCWZyZWVfYnl0ZXMgPSB4bG9nX3NwYWNlX2xlZnQobG9nLCBjeWNsZSwgYnl0ZXMpOwotCQlkbyB7CisJCXNwaW5fbG9jaygmbG9nLT5sX2dyYW50X3Jlc2VydmVfbG9jayk7CisJCWZyZWVfYnl0ZXMgPSB4bG9nX3NwYWNlX2xlZnQobG9nLCAmbG9nLT5sX2dyYW50X3Jlc2VydmVfaGVhZCk7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkodGljLCAmbG9nLT5sX3Jlc2VydmVxLCB0X3F1ZXVlKSB7CiAJCQlpZiAodGljLT50X2ZsYWdzICYgWExPR19USUNfUEVSTV9SRVNFUlYpCiAJCQkJbmVlZF9ieXRlcyA9IHRpYy0+dF91bml0X3Jlcyp0aWMtPnRfY250OwogCQkJZWxzZQpAQCAtNzYwLDEyICs3MjYsMTIgQEAKIAkJCQlicmVhazsKIAkJCXRhaWxfbHNuID0gMDsKIAkJCWZyZWVfYnl0ZXMgLT0gbmVlZF9ieXRlczsKLQkJCXN2X3NpZ25hbCgmdGljLT50X3dhaXQpOwotCQkJdGljID0gdGljLT50X25leHQ7Ci0JCX0gd2hpbGUgKHRpYyAhPSBsb2ctPmxfcmVzZXJ2ZV9oZWFkcSk7CisJCQl0cmFjZV94ZnNfbG9nX2dyYW50X3dha2VfdXAobG9nLCB0aWMpOworCQkJd2FrZV91cCgmdGljLT50X3dhaXQpOworCQl9CisJCXNwaW5fdW5sb2NrKCZsb2ctPmxfZ3JhbnRfcmVzZXJ2ZV9sb2NrKTsKIAl9Ci0Jc3Bpbl91bmxvY2soJmxvZy0+bF9ncmFudF9sb2NrKTsKLX0JLyogeGZzX2xvZ19tb3ZlX3RhaWwgKi8KK30KIAogLyoKICAqIERldGVybWluZSBpZiB3ZSBoYXZlIGEgdHJhbnNhY3Rpb24gdGhhdCBoYXMgZ29uZSB0byBkaXNrCkBAIC04MzEsMjMgKzc5NywxOSBAQAogICogV2UgbWF5IGJlIGhvbGRpbmcgdGhlIGxvZyBpY2xvZyBsb2NrIHVwb24gZW50ZXJpbmcgdGhpcyByb3V0aW5lLgogICovCiB4ZnNfbHNuX3QKLXhsb2dfYXNzaWduX3RhaWxfbHNuKHhmc19tb3VudF90ICptcCkKK3hsb2dfYXNzaWduX3RhaWxfbHNuKAorCXN0cnVjdCB4ZnNfbW91bnQJKm1wKQogewotCXhmc19sc25fdCB0YWlsX2xzbjsKLQl4bG9nX3QJICAqbG9nID0gbXAtPm1fbG9nOworCXhmc19sc25fdAkJdGFpbF9sc247CisJc3RydWN0IGxvZwkJKmxvZyA9IG1wLT5tX2xvZzsKIAogCXRhaWxfbHNuID0geGZzX3RyYW5zX2FpbF90YWlsKG1wLT5tX2FpbCk7Ci0Jc3Bpbl9sb2NrKCZsb2ctPmxfZ3JhbnRfbG9jayk7Ci0JaWYgKHRhaWxfbHNuICE9IDApIHsKLQkJbG9nLT5sX3RhaWxfbHNuID0gdGFpbF9sc247Ci0JfSBlbHNlIHsKLQkJdGFpbF9sc24gPSBsb2ctPmxfdGFpbF9sc24gPSBsb2ctPmxfbGFzdF9zeW5jX2xzbjsKLQl9Ci0Jc3Bpbl91bmxvY2soJmxvZy0+bF9ncmFudF9sb2NrKTsKKwlpZiAoIXRhaWxfbHNuKQorCQl0YWlsX2xzbiA9IGF0b21pYzY0X3JlYWQoJmxvZy0+bF9sYXN0X3N5bmNfbHNuKTsKIAorCWF0b21pYzY0X3NldCgmbG9nLT5sX3RhaWxfbHNuLCB0YWlsX2xzbik7CiAJcmV0dXJuIHRhaWxfbHNuOwotfQkvKiB4bG9nX2Fzc2lnbl90YWlsX2xzbiAqLwotCit9CiAKIC8qCiAgKiBSZXR1cm4gdGhlIHNwYWNlIGluIHRoZSBsb2cgYmV0d2VlbiB0aGUgdGFpbCBhbmQgdGhlIGhlYWQuICBUaGUgaGVhZApAQCAtODY0LDIxICs4MjYsMjYgQEAKICAqIHJlc3VsdCBpcyB0aGF0IHdlIHJldHVybiB0aGUgc2l6ZSBvZiB0aGUgbG9nIGFzIHRoZSBhbW91bnQgb2Ygc3BhY2UgbGVmdC4KICAqLwogU1RBVElDIGludAoteGxvZ19zcGFjZV9sZWZ0KHhsb2dfdCAqbG9nLCBpbnQgY3ljbGUsIGludCBieXRlcykKK3hsb2dfc3BhY2VfbGVmdCgKKwlzdHJ1Y3QgbG9nCSpsb2csCisJYXRvbWljNjRfdAkqaGVhZCkKIHsKLQlpbnQgZnJlZV9ieXRlczsKLQlpbnQgdGFpbF9ieXRlczsKLQlpbnQgdGFpbF9jeWNsZTsKKwlpbnQJCWZyZWVfYnl0ZXM7CisJaW50CQl0YWlsX2J5dGVzOworCWludAkJdGFpbF9jeWNsZTsKKwlpbnQJCWhlYWRfY3ljbGU7CisJaW50CQloZWFkX2J5dGVzOwogCi0JdGFpbF9ieXRlcyA9IEJCVE9CKEJMT0NLX0xTTihsb2ctPmxfdGFpbF9sc24pKTsKLQl0YWlsX2N5Y2xlID0gQ1lDTEVfTFNOKGxvZy0+bF90YWlsX2xzbik7Ci0JaWYgKCh0YWlsX2N5Y2xlID09IGN5Y2xlKSAmJiAoYnl0ZXMgPj0gdGFpbF9ieXRlcykpIHsKLQkJZnJlZV9ieXRlcyA9IGxvZy0+bF9sb2dzaXplIC0gKGJ5dGVzIC0gdGFpbF9ieXRlcyk7Ci0JfSBlbHNlIGlmICgodGFpbF9jeWNsZSArIDEpIDwgY3ljbGUpIHsKKwl4bG9nX2NyYWNrX2dyYW50X2hlYWQoaGVhZCwgJmhlYWRfY3ljbGUsICZoZWFkX2J5dGVzKTsKKwl4bG9nX2NyYWNrX2F0b21pY19sc24oJmxvZy0+bF90YWlsX2xzbiwgJnRhaWxfY3ljbGUsICZ0YWlsX2J5dGVzKTsKKwl0YWlsX2J5dGVzID0gQkJUT0IodGFpbF9ieXRlcyk7CisJaWYgKHRhaWxfY3ljbGUgPT0gaGVhZF9jeWNsZSAmJiBoZWFkX2J5dGVzID49IHRhaWxfYnl0ZXMpCisJCWZyZWVfYnl0ZXMgPSBsb2ctPmxfbG9nc2l6ZSAtIChoZWFkX2J5dGVzIC0gdGFpbF9ieXRlcyk7CisJZWxzZSBpZiAodGFpbF9jeWNsZSArIDEgPCBoZWFkX2N5Y2xlKQogCQlyZXR1cm4gMDsKLQl9IGVsc2UgaWYgKHRhaWxfY3ljbGUgPCBjeWNsZSkgewotCQlBU1NFUlQodGFpbF9jeWNsZSA9PSAoY3ljbGUgLSAxKSk7Ci0JCWZyZWVfYnl0ZXMgPSB0YWlsX2J5dGVzIC0gYnl0ZXM7CisJZWxzZSBpZiAodGFpbF9jeWNsZSA8IGhlYWRfY3ljbGUpIHsKKwkJQVNTRVJUKHRhaWxfY3ljbGUgPT0gKGhlYWRfY3ljbGUgLSAxKSk7CisJCWZyZWVfYnl0ZXMgPSB0YWlsX2J5dGVzIC0gaGVhZF9ieXRlczsKIAl9IGVsc2UgewogCQkvKgogCQkgKiBUaGUgcmVzZXJ2YXRpb24gaGVhZCBpcyBiZWhpbmQgdGhlIHRhaWwuCkBAIC04ODksMTIgKzg1NiwxMiBAQAogCQkJInhsb2dfc3BhY2VfbGVmdDogaGVhZCBiZWhpbmQgdGFpbFxuIgogCQkJIiAgdGFpbF9jeWNsZSA9ICVkLCB0YWlsX2J5dGVzID0gJWRcbiIKIAkJCSIgIEdIICAgY3ljbGUgPSAlZCwgR0ggICBieXRlcyA9ICVkIiwKLQkJCXRhaWxfY3ljbGUsIHRhaWxfYnl0ZXMsIGN5Y2xlLCBieXRlcyk7CisJCQl0YWlsX2N5Y2xlLCB0YWlsX2J5dGVzLCBoZWFkX2N5Y2xlLCBoZWFkX2J5dGVzKTsKIAkJQVNTRVJUKDApOwogCQlmcmVlX2J5dGVzID0gbG9nLT5sX2xvZ3NpemU7CiAJfQogCXJldHVybiBmcmVlX2J5dGVzOwotfQkvKiB4bG9nX3NwYWNlX2xlZnQgKi8KK30KIAogCiAvKgpAQCAtMTA0NywxMiArMTAxNCwxNiBAQAogCWxvZy0+bF9mbGFncwkgICB8PSBYTE9HX0FDVElWRV9SRUNPVkVSWTsKIAogCWxvZy0+bF9wcmV2X2Jsb2NrICA9IC0xOwotCWxvZy0+bF90YWlsX2xzbgkgICA9IHhsb2dfYXNzaWduX2xzbigxLCAwKTsKIAkvKiBsb2ctPmxfdGFpbF9sc24gPSAweDEwMDAwMDAwMExMOyBjeWNsZSA9IDE7IGN1cnJlbnQgYmxvY2sgPSAwICovCi0JbG9nLT5sX2xhc3Rfc3luY19sc24gPSBsb2ctPmxfdGFpbF9sc247CisJeGxvZ19hc3NpZ25fYXRvbWljX2xzbigmbG9nLT5sX3RhaWxfbHNuLCAxLCAwKTsKKwl4bG9nX2Fzc2lnbl9hdG9taWNfbHNuKCZsb2ctPmxfbGFzdF9zeW5jX2xzbiwgMSwgMCk7CiAJbG9nLT5sX2N1cnJfY3ljbGUgID0gMTsJICAgIC8qIDAgaXMgYmFkIHNpbmNlIHRoaXMgaXMgaW5pdGlhbCB2YWx1ZSAqLwotCWxvZy0+bF9ncmFudF9yZXNlcnZlX2N5Y2xlID0gMTsKLQlsb2ctPmxfZ3JhbnRfd3JpdGVfY3ljbGUgPSAxOworCXhsb2dfYXNzaWduX2dyYW50X2hlYWQoJmxvZy0+bF9ncmFudF9yZXNlcnZlX2hlYWQsIDEsIDApOworCXhsb2dfYXNzaWduX2dyYW50X2hlYWQoJmxvZy0+bF9ncmFudF93cml0ZV9oZWFkLCAxLCAwKTsKKwlJTklUX0xJU1RfSEVBRCgmbG9nLT5sX3Jlc2VydmVxKTsKKwlJTklUX0xJU1RfSEVBRCgmbG9nLT5sX3dyaXRlcSk7CisJc3Bpbl9sb2NrX2luaXQoJmxvZy0+bF9ncmFudF9yZXNlcnZlX2xvY2spOworCXNwaW5fbG9ja19pbml0KCZsb2ctPmxfZ3JhbnRfd3JpdGVfbG9jayk7CiAKIAllcnJvciA9IEVGU0NPUlJVUFRFRDsKIAlpZiAoeGZzX3NiX3ZlcnNpb25faGFzc2VjdG9yKCZtcC0+bV9zYikpIHsKQEAgLTEwOTQsOCArMTA2NSw3IEBACiAJbG9nLT5sX3hidWYgPSBicDsKIAogCXNwaW5fbG9ja19pbml0KCZsb2ctPmxfaWNsb2dsb2NrKTsKLQlzcGluX2xvY2tfaW5pdCgmbG9nLT5sX2dyYW50X2xvY2spOwotCXN2X2luaXQoJmxvZy0+bF9mbHVzaF93YWl0LCAwLCAiZmx1c2hfd2FpdCIpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmxvZy0+bF9mbHVzaF93YWl0KTsKIAogCS8qIGxvZyByZWNvcmQgc2l6ZSBtdXN0IGJlIG11bHRpcGxlIG9mIEJCU0laRTsgc2VlIHhsb2dfcmVjX2hlYWRlcl90ICovCiAJQVNTRVJUKChYRlNfQlVGX1NJWkUoYnApICYgQkJNQVNLKSA9PSAwKTsKQEAgLTExNTEsOCArMTEyMSw4IEBACiAKIAkJQVNTRVJUKFhGU19CVUZfSVNCVVNZKGljbG9nLT5pY19icCkpOwogCQlBU1NFUlQoWEZTX0JVRl9WQUxVU0VNQShpY2xvZy0+aWNfYnApIDw9IDApOwotCQlzdl9pbml0KCZpY2xvZy0+aWNfZm9yY2Vfd2FpdCwgU1ZfREVGQVVMVCwgImljbG9nLWZvcmNlIik7Ci0JCXN2X2luaXQoJmljbG9nLT5pY193cml0ZV93YWl0LCBTVl9ERUZBVUxULCAiaWNsb2ctd3JpdGUiKTsKKwkJaW5pdF93YWl0cXVldWVfaGVhZCgmaWNsb2ctPmljX2ZvcmNlX3dhaXQpOworCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZpY2xvZy0+aWNfd3JpdGVfd2FpdCk7CiAKIAkJaWNsb2dwID0gJmljbG9nLT5pY19uZXh0OwogCX0KQEAgLTExNjcsMTUgKzExMzcsMTEgQEAKIG91dF9mcmVlX2ljbG9nOgogCWZvciAoaWNsb2cgPSBsb2ctPmxfaWNsb2c7IGljbG9nOyBpY2xvZyA9IHByZXZfaWNsb2cpIHsKIAkJcHJldl9pY2xvZyA9IGljbG9nLT5pY19uZXh0OwotCQlpZiAoaWNsb2ctPmljX2JwKSB7Ci0JCQlzdl9kZXN0cm95KCZpY2xvZy0+aWNfZm9yY2Vfd2FpdCk7Ci0JCQlzdl9kZXN0cm95KCZpY2xvZy0+aWNfd3JpdGVfd2FpdCk7CisJCWlmIChpY2xvZy0+aWNfYnApCiAJCQl4ZnNfYnVmX2ZyZWUoaWNsb2ctPmljX2JwKTsKLQkJfQogCQlrbWVtX2ZyZWUoaWNsb2cpOwogCX0KIAlzcGlubG9ja19kZXN0cm95KCZsb2ctPmxfaWNsb2dsb2NrKTsKLQlzcGlubG9ja19kZXN0cm95KCZsb2ctPmxfZ3JhbnRfbG9jayk7CiAJeGZzX2J1Zl9mcmVlKGxvZy0+bF94YnVmKTsKIG91dF9mcmVlX2xvZzoKIAlrbWVtX2ZyZWUobG9nKTsKQEAgLTEyMjMsNjEgKzExODksNjAgQEAKICAqIHdhdGVyIG1hcmsuICBJbiB0aGlzIG1hbm5lciwgd2Ugd291bGQgYmUgY3JlYXRpbmcgYSBsb3cgd2F0ZXIgbWFyay4KICAqLwogU1RBVElDIHZvaWQKLXhsb2dfZ3JhbnRfcHVzaF9haWwoeGZzX21vdW50X3QJKm1wLAotCQkgICAgaW50CQluZWVkX2J5dGVzKQoreGxvZ19ncmFudF9wdXNoX2FpbCgKKwlzdHJ1Y3QgbG9nCSpsb2csCisJaW50CQluZWVkX2J5dGVzKQogewotICAgIHhsb2dfdAkqbG9nID0gbXAtPm1fbG9nOwkvKiBwb2ludGVyIHRvIHRoZSBsb2cgKi8KLSAgICB4ZnNfbHNuX3QJdGFpbF9sc247CQkvKiBsc24gb2YgdGhlIGxvZyB0YWlsICovCi0gICAgeGZzX2xzbl90CXRocmVzaG9sZF9sc24gPSAwOwkvKiBsc24gd2UnZCBsaWtlIHRvIGJlIGF0ICovCi0gICAgaW50CQlmcmVlX2Jsb2NrczsJCS8qIGZyZWUgYmxvY2tzIGxlZnQgdG8gd3JpdGUgdG8gKi8KLSAgICBpbnQJCWZyZWVfYnl0ZXM7CQkvKiBmcmVlIGJ5dGVzIGxlZnQgdG8gd3JpdGUgdG8gKi8KLSAgICBpbnQJCXRocmVzaG9sZF9ibG9jazsJLyogYmxvY2sgaW4gbHNuIHdlJ2QgbGlrZSB0byBiZSBhdCAqLwotICAgIGludAkJdGhyZXNob2xkX2N5Y2xlOwkvKiBsc24gY3ljbGUgd2UnZCBsaWtlIHRvIGJlIGF0ICovCi0gICAgaW50CQlmcmVlX3RocmVzaG9sZDsKKwl4ZnNfbHNuX3QJdGhyZXNob2xkX2xzbiA9IDA7CisJeGZzX2xzbl90CWxhc3Rfc3luY19sc247CisJaW50CQlmcmVlX2Jsb2NrczsKKwlpbnQJCWZyZWVfYnl0ZXM7CisJaW50CQl0aHJlc2hvbGRfYmxvY2s7CisJaW50CQl0aHJlc2hvbGRfY3ljbGU7CisJaW50CQlmcmVlX3RocmVzaG9sZDsKIAotICAgIEFTU0VSVChCVE9CQihuZWVkX2J5dGVzKSA8IGxvZy0+bF9sb2dCQnNpemUpOworCUFTU0VSVChCVE9CQihuZWVkX2J5dGVzKSA8IGxvZy0+bF9sb2dCQnNpemUpOwogCi0gICAgc3Bpbl9sb2NrKCZsb2ctPmxfZ3JhbnRfbG9jayk7Ci0gICAgZnJlZV9ieXRlcyA9IHhsb2dfc3BhY2VfbGVmdChsb2csCi0JCQkJIGxvZy0+bF9ncmFudF9yZXNlcnZlX2N5Y2xlLAotCQkJCSBsb2ctPmxfZ3JhbnRfcmVzZXJ2ZV9ieXRlcyk7Ci0gICAgdGFpbF9sc24gPSBsb2ctPmxfdGFpbF9sc247Ci0gICAgZnJlZV9ibG9ja3MgPSBCVE9CQlQoZnJlZV9ieXRlcyk7CisJZnJlZV9ieXRlcyA9IHhsb2dfc3BhY2VfbGVmdChsb2csICZsb2ctPmxfZ3JhbnRfcmVzZXJ2ZV9oZWFkKTsKKwlmcmVlX2Jsb2NrcyA9IEJUT0JCVChmcmVlX2J5dGVzKTsKIAotICAgIC8qCi0gICAgICogU2V0IHRoZSB0aHJlc2hvbGQgZm9yIHRoZSBtaW5pbXVtIG51bWJlciBvZiBmcmVlIGJsb2NrcyBpbiB0aGUKLSAgICAgKiBsb2cgdG8gdGhlIG1heGltdW0gb2Ygd2hhdCB0aGUgY2FsbGVyIG5lZWRzLCBvbmUgcXVhcnRlciBvZiB0aGUKLSAgICAgKiBsb2csIGFuZCAyNTYgYmxvY2tzLgotICAgICAqLwotICAgIGZyZWVfdGhyZXNob2xkID0gQlRPQkIobmVlZF9ieXRlcyk7Ci0gICAgZnJlZV90aHJlc2hvbGQgPSBNQVgoZnJlZV90aHJlc2hvbGQsIChsb2ctPmxfbG9nQkJzaXplID4+IDIpKTsKLSAgICBmcmVlX3RocmVzaG9sZCA9IE1BWChmcmVlX3RocmVzaG9sZCwgMjU2KTsKLSAgICBpZiAoZnJlZV9ibG9ja3MgPCBmcmVlX3RocmVzaG9sZCkgewotCXRocmVzaG9sZF9ibG9jayA9IEJMT0NLX0xTTih0YWlsX2xzbikgKyBmcmVlX3RocmVzaG9sZDsKLQl0aHJlc2hvbGRfY3ljbGUgPSBDWUNMRV9MU04odGFpbF9sc24pOwotCWlmICh0aHJlc2hvbGRfYmxvY2sgPj0gbG9nLT5sX2xvZ0JCc2l6ZSkgewotCSAgICB0aHJlc2hvbGRfYmxvY2sgLT0gbG9nLT5sX2xvZ0JCc2l6ZTsKLQkgICAgdGhyZXNob2xkX2N5Y2xlICs9IDE7Ci0JfQotCXRocmVzaG9sZF9sc24gPSB4bG9nX2Fzc2lnbl9sc24odGhyZXNob2xkX2N5Y2xlLCB0aHJlc2hvbGRfYmxvY2spOwotCi0JLyogRG9uJ3QgcGFzcyBpbiBhbiBsc24gZ3JlYXRlciB0aGFuIHRoZSBsc24gb2YgdGhlIGxhc3QKLQkgKiBsb2cgcmVjb3JkIGtub3duIHRvIGJlIG9uIGRpc2suCisJLyoKKwkgKiBTZXQgdGhlIHRocmVzaG9sZCBmb3IgdGhlIG1pbmltdW0gbnVtYmVyIG9mIGZyZWUgYmxvY2tzIGluIHRoZQorCSAqIGxvZyB0byB0aGUgbWF4aW11bSBvZiB3aGF0IHRoZSBjYWxsZXIgbmVlZHMsIG9uZSBxdWFydGVyIG9mIHRoZQorCSAqIGxvZywgYW5kIDI1NiBibG9ja3MuCiAJICovCi0JaWYgKFhGU19MU05fQ01QKHRocmVzaG9sZF9sc24sIGxvZy0+bF9sYXN0X3N5bmNfbHNuKSA+IDApCi0JICAgIHRocmVzaG9sZF9sc24gPSBsb2ctPmxfbGFzdF9zeW5jX2xzbjsKLSAgICB9Ci0gICAgc3Bpbl91bmxvY2soJmxvZy0+bF9ncmFudF9sb2NrKTsKKwlmcmVlX3RocmVzaG9sZCA9IEJUT0JCKG5lZWRfYnl0ZXMpOworCWZyZWVfdGhyZXNob2xkID0gTUFYKGZyZWVfdGhyZXNob2xkLCAobG9nLT5sX2xvZ0JCc2l6ZSA+PiAyKSk7CisJZnJlZV90aHJlc2hvbGQgPSBNQVgoZnJlZV90aHJlc2hvbGQsIDI1Nik7CisJaWYgKGZyZWVfYmxvY2tzID49IGZyZWVfdGhyZXNob2xkKQorCQlyZXR1cm47CiAKLSAgICAvKgotICAgICAqIEdldCB0aGUgdHJhbnNhY3Rpb24gbGF5ZXIgdG8ga2ljayB0aGUgZGlydHkgYnVmZmVycyBvdXQgdG8KLSAgICAgKiBkaXNrIGFzeW5jaHJvbm91c2x5LiBObyBwb2ludCBpbiB0cnlpbmcgdG8gZG8gdGhpcyBpZgotICAgICAqIHRoZSBmaWxlc3lzdGVtIGlzIHNodXR0aW5nIGRvd24uCi0gICAgICovCi0gICAgaWYgKHRocmVzaG9sZF9sc24gJiYKLQkhWExPR19GT1JDRURfU0hVVERPV04obG9nKSkKLQkgICAgeGZzX3RyYW5zX2FpbF9wdXNoKGxvZy0+bF9haWxwLCB0aHJlc2hvbGRfbHNuKTsKLX0JLyogeGxvZ19ncmFudF9wdXNoX2FpbCAqLworCXhsb2dfY3JhY2tfYXRvbWljX2xzbigmbG9nLT5sX3RhaWxfbHNuLCAmdGhyZXNob2xkX2N5Y2xlLAorCQkJCQkJJnRocmVzaG9sZF9ibG9jayk7CisJdGhyZXNob2xkX2Jsb2NrICs9IGZyZWVfdGhyZXNob2xkOworCWlmICh0aHJlc2hvbGRfYmxvY2sgPj0gbG9nLT5sX2xvZ0JCc2l6ZSkgeworCQl0aHJlc2hvbGRfYmxvY2sgLT0gbG9nLT5sX2xvZ0JCc2l6ZTsKKwkJdGhyZXNob2xkX2N5Y2xlICs9IDE7CisJfQorCXRocmVzaG9sZF9sc24gPSB4bG9nX2Fzc2lnbl9sc24odGhyZXNob2xkX2N5Y2xlLAorCQkJCQl0aHJlc2hvbGRfYmxvY2spOworCS8qCisJICogRG9uJ3QgcGFzcyBpbiBhbiBsc24gZ3JlYXRlciB0aGFuIHRoZSBsc24gb2YgdGhlIGxhc3QKKwkgKiBsb2cgcmVjb3JkIGtub3duIHRvIGJlIG9uIGRpc2suIFVzZSBhIHNuYXBzaG90IG9mIHRoZSBsYXN0IHN5bmMgbHNuCisJICogc28gdGhhdCBpdCBkb2Vzbid0IGNoYW5nZSBiZXR3ZWVuIHRoZSBjb21wYXJlIGFuZCB0aGUgc2V0LgorCSAqLworCWxhc3Rfc3luY19sc24gPSBhdG9taWM2NF9yZWFkKCZsb2ctPmxfbGFzdF9zeW5jX2xzbik7CisJaWYgKFhGU19MU05fQ01QKHRocmVzaG9sZF9sc24sIGxhc3Rfc3luY19sc24pID4gMCkKKwkJdGhyZXNob2xkX2xzbiA9IGxhc3Rfc3luY19sc247CisKKwkvKgorCSAqIEdldCB0aGUgdHJhbnNhY3Rpb24gbGF5ZXIgdG8ga2ljayB0aGUgZGlydHkgYnVmZmVycyBvdXQgdG8KKwkgKiBkaXNrIGFzeW5jaHJvbm91c2x5LiBObyBwb2ludCBpbiB0cnlpbmcgdG8gZG8gdGhpcyBpZgorCSAqIHRoZSBmaWxlc3lzdGVtIGlzIHNodXR0aW5nIGRvd24uCisJICovCisJaWYgKCFYTE9HX0ZPUkNFRF9TSFVURE9XTihsb2cpKQorCQl4ZnNfdHJhbnNfYWlsX3B1c2gobG9nLT5sX2FpbHAsIHRocmVzaG9sZF9sc24pOworfQogCiAvKgogICogVGhlIGJkc3RyYXQgY2FsbGJhY2sgZnVuY3Rpb24gZm9yIGxvZyBidWZzLiBUaGlzIGdpdmVzIHVzIGEgY2VudHJhbApAQCAtMTM3Miw5ICsxMzM3LDggQEAKIAkJIHJvdW5kb2ZmIDwgQkJUT0IoMSkpKTsKIAogCS8qIG1vdmUgZ3JhbnQgaGVhZHMgYnkgcm91bmRvZmYgaW4gc3luYyAqLwotCXNwaW5fbG9jaygmbG9nLT5sX2dyYW50X2xvY2spOwotCXhsb2dfZ3JhbnRfYWRkX3NwYWNlKGxvZywgcm91bmRvZmYpOwotCXNwaW5fdW5sb2NrKCZsb2ctPmxfZ3JhbnRfbG9jayk7CisJeGxvZ19ncmFudF9hZGRfc3BhY2UobG9nLCAmbG9nLT5sX2dyYW50X3Jlc2VydmVfaGVhZCwgcm91bmRvZmYpOworCXhsb2dfZ3JhbnRfYWRkX3NwYWNlKGxvZywgJmxvZy0+bF9ncmFudF93cml0ZV9oZWFkLCByb3VuZG9mZik7CiAKIAkvKiBwdXQgY3ljbGUgbnVtYmVyIGluIGV2ZXJ5IGJsb2NrICovCiAJeGxvZ19wYWNrX2RhdGEobG9nLCBpY2xvZywgcm91bmRvZmYpOyAKQEAgLTE0ODksMTUgKzE0NTMsMTIgQEAKIAogCWljbG9nID0gbG9nLT5sX2ljbG9nOwogCWZvciAoaT0wOyBpPGxvZy0+bF9pY2xvZ19idWZzOyBpKyspIHsKLQkJc3ZfZGVzdHJveSgmaWNsb2ctPmljX2ZvcmNlX3dhaXQpOwotCQlzdl9kZXN0cm95KCZpY2xvZy0+aWNfd3JpdGVfd2FpdCk7CiAJCXhmc19idWZfZnJlZShpY2xvZy0+aWNfYnApOwogCQluZXh0X2ljbG9nID0gaWNsb2ctPmljX25leHQ7CiAJCWttZW1fZnJlZShpY2xvZyk7CiAJCWljbG9nID0gbmV4dF9pY2xvZzsKIAl9CiAJc3BpbmxvY2tfZGVzdHJveSgmbG9nLT5sX2ljbG9nbG9jayk7Ci0Jc3BpbmxvY2tfZGVzdHJveSgmbG9nLT5sX2dyYW50X2xvY2spOwogCiAJeGZzX2J1Zl9mcmVlKGxvZy0+bF94YnVmKTsKIAlsb2ctPmxfbXAtPm1fbG9nID0gTlVMTDsKQEAgLTIyMzIsNyArMjE5Myw3IEBACiAJCQkJbG93ZXN0X2xzbiA9IHhsb2dfZ2V0X2xvd2VzdF9sc24obG9nKTsKIAkJCQlpZiAobG93ZXN0X2xzbiAmJgogCQkJCSAgICBYRlNfTFNOX0NNUChsb3dlc3RfbHNuLAotCQkJCSAgICAJCWJlNjRfdG9fY3B1KGljbG9nLT5pY19oZWFkZXIuaF9sc24pKSA8IDApIHsKKwkJCQkJCWJlNjRfdG9fY3B1KGljbG9nLT5pY19oZWFkZXIuaF9sc24pKSA8IDApIHsKIAkJCQkJaWNsb2cgPSBpY2xvZy0+aWNfbmV4dDsKIAkJCQkJY29udGludWU7IC8qIExlYXZlIHRoaXMgaWNsb2cgZm9yCiAJCQkJCQkgICAqIGFub3RoZXIgdGhyZWFkICovCkBAIC0yMjQwLDIzICsyMjAxLDIxIEBACiAKIAkJCQlpY2xvZy0+aWNfc3RhdGUgPSBYTE9HX1NUQVRFX0NBTExCQUNLOwogCi0JCQkJc3Bpbl91bmxvY2soJmxvZy0+bF9pY2xvZ2xvY2spOwogCi0JCQkJLyogbF9sYXN0X3N5bmNfbHNuIGZpZWxkIHByb3RlY3RlZCBieQotCQkJCSAqIGxfZ3JhbnRfbG9jay4gRG9uJ3Qgd29ycnkgYWJvdXQgaWNsb2cncyBsc24uCi0JCQkJICogTm8gb25lIGVsc2UgY2FuIGJlIGhlcmUgZXhjZXB0IHVzLgorCQkJCS8qCisJCQkJICogdXBkYXRlIHRoZSBsYXN0X3N5bmNfbHNuIGJlZm9yZSB3ZSBkcm9wIHRoZQorCQkJCSAqIGljbG9nbG9jayB0byBlbnN1cmUgd2UgYXJlIHRoZSBvbmx5IG9uZSB0aGF0CisJCQkJICogY2FuIHVwZGF0ZSBpdC4KIAkJCQkgKi8KLQkJCQlzcGluX2xvY2soJmxvZy0+bF9ncmFudF9sb2NrKTsKLQkJCQlBU1NFUlQoWEZTX0xTTl9DTVAobG9nLT5sX2xhc3Rfc3luY19sc24sCi0JCQkJICAgICAgIGJlNjRfdG9fY3B1KGljbG9nLT5pY19oZWFkZXIuaF9sc24pKSA8PSAwKTsKLQkJCQlsb2ctPmxfbGFzdF9zeW5jX2xzbiA9Ci0JCQkJCWJlNjRfdG9fY3B1KGljbG9nLT5pY19oZWFkZXIuaF9sc24pOwotCQkJCXNwaW5fdW5sb2NrKCZsb2ctPmxfZ3JhbnRfbG9jayk7CisJCQkJQVNTRVJUKFhGU19MU05fQ01QKGF0b21pYzY0X3JlYWQoJmxvZy0+bF9sYXN0X3N5bmNfbHNuKSwKKwkJCQkJYmU2NF90b19jcHUoaWNsb2ctPmljX2hlYWRlci5oX2xzbikpIDw9IDApOworCQkJCWF0b21pYzY0X3NldCgmbG9nLT5sX2xhc3Rfc3luY19sc24sCisJCQkJCWJlNjRfdG9fY3B1KGljbG9nLT5pY19oZWFkZXIuaF9sc24pKTsKIAotCQkJfSBlbHNlIHsKLQkJCQlzcGluX3VubG9jaygmbG9nLT5sX2ljbG9nbG9jayk7CisJCQl9IGVsc2UKIAkJCQlpb2Vycm9ycysrOwotCQkJfQorCisJCQlzcGluX3VubG9jaygmbG9nLT5sX2ljbG9nbG9jayk7CiAKIAkJCS8qCiAJCQkgKiBLZWVwIHByb2Nlc3NpbmcgZW50cmllcyBpbiB0aGUgY2FsbGJhY2sgbGlzdCB1bnRpbApAQCAtMjI5Nyw3ICsyMjU2LDcgQEAKIAkJCXhsb2dfc3RhdGVfY2xlYW5fbG9nKGxvZyk7CiAKIAkJCS8qIHdha2UgdXAgdGhyZWFkcyB3YWl0aW5nIGluIHhmc19sb2dfZm9yY2UoKSAqLwotCQkJc3ZfYnJvYWRjYXN0KCZpY2xvZy0+aWNfZm9yY2Vfd2FpdCk7CisJCQl3YWtlX3VwX2FsbCgmaWNsb2ctPmljX2ZvcmNlX3dhaXQpOwogCiAJCQlpY2xvZyA9IGljbG9nLT5pY19uZXh0OwogCQl9IHdoaWxlIChmaXJzdF9pY2xvZyAhPSBpY2xvZyk7CkBAIC0yMzQ0LDcgKzIzMDMsNyBAQAogCXNwaW5fdW5sb2NrKCZsb2ctPmxfaWNsb2dsb2NrKTsKIAogCWlmICh3YWtlKQotCQlzdl9icm9hZGNhc3QoJmxvZy0+bF9mbHVzaF93YWl0KTsKKwkJd2FrZV91cF9hbGwoJmxvZy0+bF9mbHVzaF93YWl0KTsKIH0KIAogCkBAIC0yMzk1LDcgKzIzNTQsNyBAQAogCSAqIGljbG9nIGJ1ZmZlciwgd2Ugd2FrZSB0aGVtIGFsbCwgb25lIHdpbGwgZ2V0IHRvIGRvIHRoZQogCSAqIEkvTywgdGhlIG90aGVycyBnZXQgdG8gd2FpdCBmb3IgdGhlIHJlc3VsdC4KIAkgKi8KLQlzdl9icm9hZGNhc3QoJmljbG9nLT5pY193cml0ZV93YWl0KTsKKwl3YWtlX3VwX2FsbCgmaWNsb2ctPmljX3dyaXRlX3dhaXQpOwogCXNwaW5fdW5sb2NrKCZsb2ctPmxfaWNsb2dsb2NrKTsKIAl4bG9nX3N0YXRlX2RvX2NhbGxiYWNrKGxvZywgYWJvcnRlZCwgaWNsb2cpOwkvKiBhbHNvIGNsZWFucyBsb2cgKi8KIH0JLyogeGxvZ19zdGF0ZV9kb25lX3N5bmNpbmcgKi8KQEAgLTI0NDQsNyArMjQwMyw3IEBACiAJCVhGU19TVEFUU19JTkMoeHNfbG9nX25vaWNsb2dzKTsKIAogCQkvKiBXYWl0IGZvciBsb2cgd3JpdGVzIHRvIGhhdmUgZmx1c2hlZCAqLwotCQlzdl93YWl0KCZsb2ctPmxfZmx1c2hfd2FpdCwgMCwgJmxvZy0+bF9pY2xvZ2xvY2ssIDApOworCQl4bG9nX3dhaXQoJmxvZy0+bF9mbHVzaF93YWl0LCAmbG9nLT5sX2ljbG9nbG9jayk7CiAJCWdvdG8gcmVzdGFydDsKIAl9CiAKQEAgLTI1MjcsNiArMjQ4NiwxOCBAQAogICoKICAqIE9uY2UgYSB0aWNrZXQgZ2V0cyBwdXQgb250byB0aGUgcmVzZXJ2ZXEsIGl0IHdpbGwgb25seSByZXR1cm4gYWZ0ZXIKICAqIHRoZSBuZWVkZWQgcmVzZXJ2YXRpb24gaXMgc2F0aXNmaWVkLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgc3RydWN0dXJlZCBzbyB0aGF0IGl0IGhhcyBhIGxvY2sgZnJlZSBmYXN0IHBhdGguIFRoaXMgaXMKKyAqIG5lY2Vzc2FyeSBiZWNhdXNlIGV2ZXJ5IG5ldyB0cmFuc2FjdGlvbiByZXNlcnZhdGlvbiB3aWxsIGNvbWUgdGhyb3VnaCB0aGlzCisgKiBwYXRoLiBIZW5jZSBhbnkgbG9jayB3aWxsIGJlIGdsb2JhbGx5IGhvdCBpZiB3ZSB0YWtlIGl0IHVuY29uZGl0aW9uYWxseSBvbgorICogZXZlcnkgcGFzcy4KKyAqCisgKiBBcyB0aWNrZXRzIGFyZSBvbmx5IGV2ZXIgbW92ZWQgb24gYW5kIG9mZiB0aGUgcmVzZXJ2ZXEgdW5kZXIgdGhlCisgKiBsX2dyYW50X3Jlc2VydmVfbG9jaywgd2Ugb25seSBuZWVkIHRvIHRha2UgdGhhdCBsb2NrIGlmIHdlIGFyZSBnb2luZworICogdG8gYWRkIHRoZSB0aWNrZXQgdG8gdGhlIHF1ZXVlIGFuZCBzbGVlcC4gV2UgY2FuIGF2b2lkIHRha2luZyB0aGUgbG9jayBpZiB0aGUKKyAqIHRpY2tldCB3YXMgbmV2ZXIgYWRkZWQgdG8gdGhlIHJlc2VydmVxIGJlY2F1c2UgdGhlIHRfcXVldWUgbGlzdCBoZWFkIHdpbGwgYmUKKyAqIGVtcHR5IGFuZCB3ZSBob2xkIHRoZSBvbmx5IHJlZmVyZW5jZSB0byBpdCBzbyBpdCBjYW4gc2FmZWx5IGJlIGNoZWNrZWQKKyAqIHVubG9ja2VkLgogICovCiBTVEFUSUMgaW50CiB4bG9nX2dyYW50X2xvZ19zcGFjZSh4bG9nX3QJICAgKmxvZywKQEAgLTI1MzQsMjQgKzI1MDUsMjcgQEAKIHsKIAlpbnQJCSBmcmVlX2J5dGVzOwogCWludAkJIG5lZWRfYnl0ZXM7Ci0jaWZkZWYgREVCVUcKLQl4ZnNfbHNuX3QJIHRhaWxfbHNuOwotI2VuZGlmCi0KIAogI2lmZGVmIERFQlVHCiAJaWYgKGxvZy0+bF9mbGFncyAmIFhMT0dfQUNUSVZFX1JFQ09WRVJZKQogCQlwYW5pYygiZ3JhbnQgUmVjb3ZlcnkgcHJvYmxlbSIpOwogI2VuZGlmCiAKLQkvKiBJcyB0aGVyZSBzcGFjZSBvciBkbyB3ZSBuZWVkIHRvIHNsZWVwPyAqLwotCXNwaW5fbG9jaygmbG9nLT5sX2dyYW50X2xvY2spOwotCiAJdHJhY2VfeGZzX2xvZ19ncmFudF9lbnRlcihsb2csIHRpYyk7CiAKKwluZWVkX2J5dGVzID0gdGljLT50X3VuaXRfcmVzOworCWlmICh0aWMtPnRfZmxhZ3MgJiBYRlNfTE9HX1BFUk1fUkVTRVJWKQorCQluZWVkX2J5dGVzICo9IHRpYy0+dF9vY250OworCiAJLyogc29tZXRoaW5nIGlzIGFscmVhZHkgc2xlZXBpbmc7IGluc2VydCBuZXcgdHJhbnNhY3Rpb24gYXQgZW5kICovCi0JaWYgKGxvZy0+bF9yZXNlcnZlX2hlYWRxKSB7Ci0JCXhsb2dfaW5zX3RpY2tldHEoJmxvZy0+bF9yZXNlcnZlX2hlYWRxLCB0aWMpOworCWlmICghbGlzdF9lbXB0eV9jYXJlZnVsKCZsb2ctPmxfcmVzZXJ2ZXEpKSB7CisJCXNwaW5fbG9jaygmbG9nLT5sX2dyYW50X3Jlc2VydmVfbG9jayk7CisJCS8qIHJlY2hlY2sgdGhlIHF1ZXVlIG5vdyB3ZSBhcmUgbG9ja2VkICovCisJCWlmIChsaXN0X2VtcHR5KCZsb2ctPmxfcmVzZXJ2ZXEpKSB7CisJCQlzcGluX3VubG9jaygmbG9nLT5sX2dyYW50X3Jlc2VydmVfbG9jayk7CisJCQlnb3RvIHJlZG87CisJCX0KKwkJbGlzdF9hZGRfdGFpbCgmdGljLT50X3F1ZXVlLCAmbG9nLT5sX3Jlc2VydmVxKTsKIAogCQl0cmFjZV94ZnNfbG9nX2dyYW50X3NsZWVwMShsb2csIHRpYyk7CiAKQEAgLTI1NjMsNzIgKzI1MzcsNTcgQEAKIAkJCWdvdG8gZXJyb3JfcmV0dXJuOwogCiAJCVhGU19TVEFUU19JTkMoeHNfc2xlZXBfbG9nc3BhY2UpOwotCQlzdl93YWl0KCZ0aWMtPnRfd2FpdCwgUElOT0R8UExUV0FJVCwgJmxvZy0+bF9ncmFudF9sb2NrLCBzKTsKKwkJeGxvZ193YWl0KCZ0aWMtPnRfd2FpdCwgJmxvZy0+bF9ncmFudF9yZXNlcnZlX2xvY2spOworCiAJCS8qCiAJCSAqIElmIHdlIGdvdCBhbiBlcnJvciwgYW5kIHRoZSBmaWxlc3lzdGVtIGlzIHNodXR0aW5nIGRvd24sCiAJCSAqIHdlJ2xsIGNhdGNoIGl0IGRvd24gYmVsb3cuIFNvIGp1c3QgY29udGludWUuLi4KIAkJICovCiAJCXRyYWNlX3hmc19sb2dfZ3JhbnRfd2FrZTEobG9nLCB0aWMpOwotCQlzcGluX2xvY2soJmxvZy0+bF9ncmFudF9sb2NrKTsKIAl9Ci0JaWYgKHRpYy0+dF9mbGFncyAmIFhGU19MT0dfUEVSTV9SRVNFUlYpCi0JCW5lZWRfYnl0ZXMgPSB0aWMtPnRfdW5pdF9yZXMqdGljLT50X29jbnQ7Ci0JZWxzZQotCQluZWVkX2J5dGVzID0gdGljLT50X3VuaXRfcmVzOwogCiByZWRvOgogCWlmIChYTE9HX0ZPUkNFRF9TSFVURE9XTihsb2cpKQotCQlnb3RvIGVycm9yX3JldHVybjsKKwkJZ290byBlcnJvcl9yZXR1cm5fdW5sb2NrZWQ7CiAKLQlmcmVlX2J5dGVzID0geGxvZ19zcGFjZV9sZWZ0KGxvZywgbG9nLT5sX2dyYW50X3Jlc2VydmVfY3ljbGUsCi0JCQkJICAgICBsb2ctPmxfZ3JhbnRfcmVzZXJ2ZV9ieXRlcyk7CisJZnJlZV9ieXRlcyA9IHhsb2dfc3BhY2VfbGVmdChsb2csICZsb2ctPmxfZ3JhbnRfcmVzZXJ2ZV9oZWFkKTsKIAlpZiAoZnJlZV9ieXRlcyA8IG5lZWRfYnl0ZXMpIHsKLQkJaWYgKCh0aWMtPnRfZmxhZ3MgJiBYTE9HX1RJQ19JTl9RKSA9PSAwKQotCQkJeGxvZ19pbnNfdGlja2V0cSgmbG9nLT5sX3Jlc2VydmVfaGVhZHEsIHRpYyk7CisJCXNwaW5fbG9jaygmbG9nLT5sX2dyYW50X3Jlc2VydmVfbG9jayk7CisJCWlmIChsaXN0X2VtcHR5KCZ0aWMtPnRfcXVldWUpKQorCQkJbGlzdF9hZGRfdGFpbCgmdGljLT50X3F1ZXVlLCAmbG9nLT5sX3Jlc2VydmVxKTsKIAogCQl0cmFjZV94ZnNfbG9nX2dyYW50X3NsZWVwMihsb2csIHRpYyk7CiAKLQkJc3Bpbl91bmxvY2soJmxvZy0+bF9ncmFudF9sb2NrKTsKLQkJeGxvZ19ncmFudF9wdXNoX2FpbChsb2ctPmxfbXAsIG5lZWRfYnl0ZXMpOwotCQlzcGluX2xvY2soJmxvZy0+bF9ncmFudF9sb2NrKTsKLQotCQlYRlNfU1RBVFNfSU5DKHhzX3NsZWVwX2xvZ3NwYWNlKTsKLQkJc3Zfd2FpdCgmdGljLT50X3dhaXQsIFBJTk9EfFBMVFdBSVQsICZsb2ctPmxfZ3JhbnRfbG9jaywgcyk7Ci0KLQkJc3Bpbl9sb2NrKCZsb2ctPmxfZ3JhbnRfbG9jayk7CiAJCWlmIChYTE9HX0ZPUkNFRF9TSFVURE9XTihsb2cpKQogCQkJZ290byBlcnJvcl9yZXR1cm47CiAKLQkJdHJhY2VfeGZzX2xvZ19ncmFudF93YWtlMihsb2csIHRpYyk7CisJCXhsb2dfZ3JhbnRfcHVzaF9haWwobG9nLCBuZWVkX2J5dGVzKTsKIAorCQlYRlNfU1RBVFNfSU5DKHhzX3NsZWVwX2xvZ3NwYWNlKTsKKwkJeGxvZ193YWl0KCZ0aWMtPnRfd2FpdCwgJmxvZy0+bF9ncmFudF9yZXNlcnZlX2xvY2spOworCisJCXRyYWNlX3hmc19sb2dfZ3JhbnRfd2FrZTIobG9nLCB0aWMpOwogCQlnb3RvIHJlZG87Ci0JfSBlbHNlIGlmICh0aWMtPnRfZmxhZ3MgJiBYTE9HX1RJQ19JTl9RKQotCQl4bG9nX2RlbF90aWNrZXRxKCZsb2ctPmxfcmVzZXJ2ZV9oZWFkcSwgdGljKTsKKwl9CisKKwlpZiAoIWxpc3RfZW1wdHkoJnRpYy0+dF9xdWV1ZSkpIHsKKwkJc3Bpbl9sb2NrKCZsb2ctPmxfZ3JhbnRfcmVzZXJ2ZV9sb2NrKTsKKwkJbGlzdF9kZWxfaW5pdCgmdGljLT50X3F1ZXVlKTsKKwkJc3Bpbl91bmxvY2soJmxvZy0+bF9ncmFudF9yZXNlcnZlX2xvY2spOworCX0KIAogCS8qIHdlJ3ZlIGdvdCBlbm91Z2ggc3BhY2UgKi8KLQl4bG9nX2dyYW50X2FkZF9zcGFjZShsb2csIG5lZWRfYnl0ZXMpOwotI2lmZGVmIERFQlVHCi0JdGFpbF9sc24gPSBsb2ctPmxfdGFpbF9sc247Ci0JLyoKLQkgKiBDaGVjayB0byBtYWtlIHN1cmUgdGhlIGdyYW50IHdyaXRlIGhlYWQgZGlkbid0IGp1c3Qgb3ZlciBsYXAgdGhlCi0JICogdGFpbC4gIElmIHRoZSBjeWNsZXMgYXJlIHRoZSBzYW1lLCB3ZSBjYW4ndCBiZSBvdmVybGFwcGluZy4KLQkgKiBPdGhlcndpc2UsIG1ha2Ugc3VyZSB0aGF0IHRoZSBjeWNsZXMgZGlmZmVyIGJ5IGV4YWN0bHkgb25lIGFuZAotCSAqIGNoZWNrIHRoZSBieXRlIGNvdW50LgotCSAqLwotCWlmIChDWUNMRV9MU04odGFpbF9sc24pICE9IGxvZy0+bF9ncmFudF93cml0ZV9jeWNsZSkgewotCQlBU1NFUlQobG9nLT5sX2dyYW50X3dyaXRlX2N5Y2xlLTEgPT0gQ1lDTEVfTFNOKHRhaWxfbHNuKSk7Ci0JCUFTU0VSVChsb2ctPmxfZ3JhbnRfd3JpdGVfYnl0ZXMgPD0gQkJUT0IoQkxPQ0tfTFNOKHRhaWxfbHNuKSkpOwotCX0KLSNlbmRpZgorCXhsb2dfZ3JhbnRfYWRkX3NwYWNlKGxvZywgJmxvZy0+bF9ncmFudF9yZXNlcnZlX2hlYWQsIG5lZWRfYnl0ZXMpOworCXhsb2dfZ3JhbnRfYWRkX3NwYWNlKGxvZywgJmxvZy0+bF9ncmFudF93cml0ZV9oZWFkLCBuZWVkX2J5dGVzKTsKIAl0cmFjZV94ZnNfbG9nX2dyYW50X2V4aXQobG9nLCB0aWMpOwotCXhsb2dfdmVyaWZ5X2dyYW50X2hlYWQobG9nLCAxKTsKLQlzcGluX3VubG9jaygmbG9nLT5sX2dyYW50X2xvY2spOworCXhsb2dfdmVyaWZ5X2dyYW50X3RhaWwobG9nKTsKIAlyZXR1cm4gMDsKIAotIGVycm9yX3JldHVybjoKLQlpZiAodGljLT50X2ZsYWdzICYgWExPR19USUNfSU5fUSkKLQkJeGxvZ19kZWxfdGlja2V0cSgmbG9nLT5sX3Jlc2VydmVfaGVhZHEsIHRpYyk7Ci0KK2Vycm9yX3JldHVybl91bmxvY2tlZDoKKwlzcGluX2xvY2soJmxvZy0+bF9ncmFudF9yZXNlcnZlX2xvY2spOworZXJyb3JfcmV0dXJuOgorCWxpc3RfZGVsX2luaXQoJnRpYy0+dF9xdWV1ZSk7CisJc3Bpbl91bmxvY2soJmxvZy0+bF9ncmFudF9yZXNlcnZlX2xvY2spOwogCXRyYWNlX3hmc19sb2dfZ3JhbnRfZXJyb3IobG9nLCB0aWMpOwogCiAJLyoKQEAgLTI2MzgsNyArMjU5Nyw2IEBACiAJICovCiAJdGljLT50X2N1cnJfcmVzID0gMDsKIAl0aWMtPnRfY250ID0gMDsgLyogdW5ncmFudCB3aWxsIGdpdmUgYmFjayB1bml0X3JlcyAqIHRfY250LiAqLwotCXNwaW5fdW5sb2NrKCZsb2ctPmxfZ3JhbnRfbG9jayk7CiAJcmV0dXJuIFhGU19FUlJPUihFSU8pOwogfQkvKiB4bG9nX2dyYW50X2xvZ19zcGFjZSAqLwogCkBAIC0yNjQ2LDE3ICsyNjA0LDE0IEBACiAvKgogICogUmVwbGVuaXNoIHRoZSBieXRlIHJlc2VydmF0aW9uIHJlcXVpcmVkIGJ5IG1vdmluZyB0aGUgZ3JhbnQgd3JpdGUgaGVhZC4KICAqCi0gKgorICogU2ltaWxhciB0byB4bG9nX2dyYW50X2xvZ19zcGFjZSwgdGhlIGZ1bmN0aW9uIGlzIHN0cnVjdHVyZWQgdG8gaGF2ZSBhIGxvY2sKKyAqIGZyZWUgZmFzdCBwYXRoLgogICovCiBTVEFUSUMgaW50CiB4bG9nX3JlZ3JhbnRfd3JpdGVfbG9nX3NwYWNlKHhsb2dfdAkgICAqbG9nLAogCQkJICAgICB4bG9nX3RpY2tldF90ICp0aWMpCiB7CiAJaW50CQlmcmVlX2J5dGVzLCBuZWVkX2J5dGVzOwotCXhsb2dfdGlja2V0X3QJKm50aWM7Ci0jaWZkZWYgREVCVUcKLQl4ZnNfbHNuX3QJdGFpbF9sc247Ci0jZW5kaWYKIAogCXRpYy0+dF9jdXJyX3JlcyA9IHRpYy0+dF91bml0X3JlczsKIAl4bG9nX3RpY19yZXNldF9yZXModGljKTsKQEAgLTI2NjksMTIgKzI2MjQsOSBAQAogCQlwYW5pYygicmVncmFudCBSZWNvdmVyeSBwcm9ibGVtIik7CiAjZW5kaWYKIAotCXNwaW5fbG9jaygmbG9nLT5sX2dyYW50X2xvY2spOwotCiAJdHJhY2VfeGZzX2xvZ19yZWdyYW50X3dyaXRlX2VudGVyKGxvZywgdGljKTsKLQogCWlmIChYTE9HX0ZPUkNFRF9TSFVURE9XTihsb2cpKQotCQlnb3RvIGVycm9yX3JldHVybjsKKwkJZ290byBlcnJvcl9yZXR1cm5fdW5sb2NrZWQ7CiAKIAkvKiBJZiB0aGVyZSBhcmUgb3RoZXIgd2FpdGVycyBvbiB0aGUgcXVldWUgdGhlbiBnaXZlIHRoZW0gYQogCSAqIGNoYW5jZSBhdCBsb2dzcGFjZSBiZWZvcmUgdXMuIFdha2UgdXAgdGhlIGZpcnN0IHdhaXRlcnMsCkBAIC0yNjgzLDkyICsyNjM1LDc2IEBACiAJICogdGhpcyB0cmFuc2FjdGlvbi4KIAkgKi8KIAluZWVkX2J5dGVzID0gdGljLT50X3VuaXRfcmVzOwotCWlmICgobnRpYyA9IGxvZy0+bF93cml0ZV9oZWFkcSkpIHsKLQkJZnJlZV9ieXRlcyA9IHhsb2dfc3BhY2VfbGVmdChsb2csIGxvZy0+bF9ncmFudF93cml0ZV9jeWNsZSwKLQkJCQkJICAgICBsb2ctPmxfZ3JhbnRfd3JpdGVfYnl0ZXMpOwotCQlkbyB7CisJaWYgKCFsaXN0X2VtcHR5X2NhcmVmdWwoJmxvZy0+bF93cml0ZXEpKSB7CisJCXN0cnVjdCB4bG9nX3RpY2tldCAqbnRpYzsKKworCQlzcGluX2xvY2soJmxvZy0+bF9ncmFudF93cml0ZV9sb2NrKTsKKwkJZnJlZV9ieXRlcyA9IHhsb2dfc3BhY2VfbGVmdChsb2csICZsb2ctPmxfZ3JhbnRfd3JpdGVfaGVhZCk7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkobnRpYywgJmxvZy0+bF93cml0ZXEsIHRfcXVldWUpIHsKIAkJCUFTU0VSVChudGljLT50X2ZsYWdzICYgWExPR19USUNfUEVSTV9SRVNFUlYpOwogCiAJCQlpZiAoZnJlZV9ieXRlcyA8IG50aWMtPnRfdW5pdF9yZXMpCiAJCQkJYnJlYWs7CiAJCQlmcmVlX2J5dGVzIC09IG50aWMtPnRfdW5pdF9yZXM7Ci0JCQlzdl9zaWduYWwoJm50aWMtPnRfd2FpdCk7Ci0JCQludGljID0gbnRpYy0+dF9uZXh0OwotCQl9IHdoaWxlIChudGljICE9IGxvZy0+bF93cml0ZV9oZWFkcSk7CisJCQl3YWtlX3VwKCZudGljLT50X3dhaXQpOworCQl9CiAKLQkJaWYgKG50aWMgIT0gbG9nLT5sX3dyaXRlX2hlYWRxKSB7Ci0JCQlpZiAoKHRpYy0+dF9mbGFncyAmIFhMT0dfVElDX0lOX1EpID09IDApCi0JCQkJeGxvZ19pbnNfdGlja2V0cSgmbG9nLT5sX3dyaXRlX2hlYWRxLCB0aWMpOwotCisJCWlmIChudGljICE9IGxpc3RfZmlyc3RfZW50cnkoJmxvZy0+bF93cml0ZXEsCisJCQkJCQlzdHJ1Y3QgeGxvZ190aWNrZXQsIHRfcXVldWUpKSB7CisJCQlpZiAobGlzdF9lbXB0eSgmdGljLT50X3F1ZXVlKSkKKwkJCQlsaXN0X2FkZF90YWlsKCZ0aWMtPnRfcXVldWUsICZsb2ctPmxfd3JpdGVxKTsKIAkJCXRyYWNlX3hmc19sb2dfcmVncmFudF93cml0ZV9zbGVlcDEobG9nLCB0aWMpOwogCi0JCQlzcGluX3VubG9jaygmbG9nLT5sX2dyYW50X2xvY2spOwotCQkJeGxvZ19ncmFudF9wdXNoX2FpbChsb2ctPmxfbXAsIG5lZWRfYnl0ZXMpOwotCQkJc3Bpbl9sb2NrKCZsb2ctPmxfZ3JhbnRfbG9jayk7CisJCQl4bG9nX2dyYW50X3B1c2hfYWlsKGxvZywgbmVlZF9ieXRlcyk7CiAKIAkJCVhGU19TVEFUU19JTkMoeHNfc2xlZXBfbG9nc3BhY2UpOwotCQkJc3Zfd2FpdCgmdGljLT50X3dhaXQsIFBJTk9EfFBMVFdBSVQsCi0JCQkJJmxvZy0+bF9ncmFudF9sb2NrLCBzKTsKLQotCQkJLyogSWYgd2UncmUgc2h1dHRpbmcgZG93biwgdGhpcyB0aWMgaXMgYWxyZWFkeQotCQkJICogb2ZmIHRoZSBxdWV1ZSAqLwotCQkJc3Bpbl9sb2NrKCZsb2ctPmxfZ3JhbnRfbG9jayk7Ci0JCQlpZiAoWExPR19GT1JDRURfU0hVVERPV04obG9nKSkKLQkJCQlnb3RvIGVycm9yX3JldHVybjsKLQorCQkJeGxvZ193YWl0KCZ0aWMtPnRfd2FpdCwgJmxvZy0+bF9ncmFudF93cml0ZV9sb2NrKTsKIAkJCXRyYWNlX3hmc19sb2dfcmVncmFudF93cml0ZV93YWtlMShsb2csIHRpYyk7Ci0JCX0KKwkJfSBlbHNlCisJCQlzcGluX3VubG9jaygmbG9nLT5sX2dyYW50X3dyaXRlX2xvY2spOwogCX0KIAogcmVkbzoKIAlpZiAoWExPR19GT1JDRURfU0hVVERPV04obG9nKSkKLQkJZ290byBlcnJvcl9yZXR1cm47CisJCWdvdG8gZXJyb3JfcmV0dXJuX3VubG9ja2VkOwogCi0JZnJlZV9ieXRlcyA9IHhsb2dfc3BhY2VfbGVmdChsb2csIGxvZy0+bF9ncmFudF93cml0ZV9jeWNsZSwKLQkJCQkgICAgIGxvZy0+bF9ncmFudF93cml0ZV9ieXRlcyk7CisJZnJlZV9ieXRlcyA9IHhsb2dfc3BhY2VfbGVmdChsb2csICZsb2ctPmxfZ3JhbnRfd3JpdGVfaGVhZCk7CiAJaWYgKGZyZWVfYnl0ZXMgPCBuZWVkX2J5dGVzKSB7Ci0JCWlmICgodGljLT50X2ZsYWdzICYgWExPR19USUNfSU5fUSkgPT0gMCkKLQkJCXhsb2dfaW5zX3RpY2tldHEoJmxvZy0+bF93cml0ZV9oZWFkcSwgdGljKTsKLQkJc3Bpbl91bmxvY2soJmxvZy0+bF9ncmFudF9sb2NrKTsKLQkJeGxvZ19ncmFudF9wdXNoX2FpbChsb2ctPmxfbXAsIG5lZWRfYnl0ZXMpOwotCQlzcGluX2xvY2soJmxvZy0+bF9ncmFudF9sb2NrKTsKKwkJc3Bpbl9sb2NrKCZsb2ctPmxfZ3JhbnRfd3JpdGVfbG9jayk7CisJCWlmIChsaXN0X2VtcHR5KCZ0aWMtPnRfcXVldWUpKQorCQkJbGlzdF9hZGRfdGFpbCgmdGljLT50X3F1ZXVlLCAmbG9nLT5sX3dyaXRlcSk7CiAKLQkJWEZTX1NUQVRTX0lOQyh4c19zbGVlcF9sb2dzcGFjZSk7Ci0JCXRyYWNlX3hmc19sb2dfcmVncmFudF93cml0ZV9zbGVlcDIobG9nLCB0aWMpOwotCi0JCXN2X3dhaXQoJnRpYy0+dF93YWl0LCBQSU5PRHxQTFRXQUlULCAmbG9nLT5sX2dyYW50X2xvY2ssIHMpOwotCi0JCS8qIElmIHdlJ3JlIHNodXR0aW5nIGRvd24sIHRoaXMgdGljIGlzIGFscmVhZHkgb2ZmIHRoZSBxdWV1ZSAqLwotCQlzcGluX2xvY2soJmxvZy0+bF9ncmFudF9sb2NrKTsKIAkJaWYgKFhMT0dfRk9SQ0VEX1NIVVRET1dOKGxvZykpCiAJCQlnb3RvIGVycm9yX3JldHVybjsKIAorCQl4bG9nX2dyYW50X3B1c2hfYWlsKGxvZywgbmVlZF9ieXRlcyk7CisKKwkJWEZTX1NUQVRTX0lOQyh4c19zbGVlcF9sb2dzcGFjZSk7CisJCXRyYWNlX3hmc19sb2dfcmVncmFudF93cml0ZV9zbGVlcDIobG9nLCB0aWMpOworCQl4bG9nX3dhaXQoJnRpYy0+dF93YWl0LCAmbG9nLT5sX2dyYW50X3dyaXRlX2xvY2spOworCiAJCXRyYWNlX3hmc19sb2dfcmVncmFudF93cml0ZV93YWtlMihsb2csIHRpYyk7CiAJCWdvdG8gcmVkbzsKLQl9IGVsc2UgaWYgKHRpYy0+dF9mbGFncyAmIFhMT0dfVElDX0lOX1EpCi0JCXhsb2dfZGVsX3RpY2tldHEoJmxvZy0+bF93cml0ZV9oZWFkcSwgdGljKTsKKwl9CisKKwlpZiAoIWxpc3RfZW1wdHkoJnRpYy0+dF9xdWV1ZSkpIHsKKwkJc3Bpbl9sb2NrKCZsb2ctPmxfZ3JhbnRfd3JpdGVfbG9jayk7CisJCWxpc3RfZGVsX2luaXQoJnRpYy0+dF9xdWV1ZSk7CisJCXNwaW5fdW5sb2NrKCZsb2ctPmxfZ3JhbnRfd3JpdGVfbG9jayk7CisJfQogCiAJLyogd2UndmUgZ290IGVub3VnaCBzcGFjZSAqLwotCXhsb2dfZ3JhbnRfYWRkX3NwYWNlX3dyaXRlKGxvZywgbmVlZF9ieXRlcyk7Ci0jaWZkZWYgREVCVUcKLQl0YWlsX2xzbiA9IGxvZy0+bF90YWlsX2xzbjsKLQlpZiAoQ1lDTEVfTFNOKHRhaWxfbHNuKSAhPSBsb2ctPmxfZ3JhbnRfd3JpdGVfY3ljbGUpIHsKLQkJQVNTRVJUKGxvZy0+bF9ncmFudF93cml0ZV9jeWNsZS0xID09IENZQ0xFX0xTTih0YWlsX2xzbikpOwotCQlBU1NFUlQobG9nLT5sX2dyYW50X3dyaXRlX2J5dGVzIDw9IEJCVE9CKEJMT0NLX0xTTih0YWlsX2xzbikpKTsKLQl9Ci0jZW5kaWYKLQorCXhsb2dfZ3JhbnRfYWRkX3NwYWNlKGxvZywgJmxvZy0+bF9ncmFudF93cml0ZV9oZWFkLCBuZWVkX2J5dGVzKTsKIAl0cmFjZV94ZnNfbG9nX3JlZ3JhbnRfd3JpdGVfZXhpdChsb2csIHRpYyk7Ci0KLQl4bG9nX3ZlcmlmeV9ncmFudF9oZWFkKGxvZywgMSk7Ci0Jc3Bpbl91bmxvY2soJmxvZy0+bF9ncmFudF9sb2NrKTsKKwl4bG9nX3ZlcmlmeV9ncmFudF90YWlsKGxvZyk7CiAJcmV0dXJuIDA7CiAKIAorIGVycm9yX3JldHVybl91bmxvY2tlZDoKKwlzcGluX2xvY2soJmxvZy0+bF9ncmFudF93cml0ZV9sb2NrKTsKICBlcnJvcl9yZXR1cm46Ci0JaWYgKHRpYy0+dF9mbGFncyAmIFhMT0dfVElDX0lOX1EpCi0JCXhsb2dfZGVsX3RpY2tldHEoJmxvZy0+bF9yZXNlcnZlX2hlYWRxLCB0aWMpOwotCisJbGlzdF9kZWxfaW5pdCgmdGljLT50X3F1ZXVlKTsKKwlzcGluX3VubG9jaygmbG9nLT5sX2dyYW50X3dyaXRlX2xvY2spOwogCXRyYWNlX3hmc19sb2dfcmVncmFudF93cml0ZV9lcnJvcihsb2csIHRpYyk7CiAKIAkvKgpAQCAtMjc3OCw3ICsyNzE0LDYgQEAKIAkgKi8KIAl0aWMtPnRfY3Vycl9yZXMgPSAwOwogCXRpYy0+dF9jbnQgPSAwOyAvKiB1bmdyYW50IHdpbGwgZ2l2ZSBiYWNrIHVuaXRfcmVzICogdF9jbnQuICovCi0Jc3Bpbl91bmxvY2soJmxvZy0+bF9ncmFudF9sb2NrKTsKIAlyZXR1cm4gWEZTX0VSUk9SKEVJTyk7CiB9CS8qIHhsb2dfcmVncmFudF93cml0ZV9sb2dfc3BhY2UgKi8KIApAQCAtMjc5OSwyNyArMjczNCwyNCBAQAogCWlmICh0aWNrZXQtPnRfY250ID4gMCkKIAkJdGlja2V0LT50X2NudC0tOwogCi0Jc3Bpbl9sb2NrKCZsb2ctPmxfZ3JhbnRfbG9jayk7Ci0JeGxvZ19ncmFudF9zdWJfc3BhY2UobG9nLCB0aWNrZXQtPnRfY3Vycl9yZXMpOworCXhsb2dfZ3JhbnRfc3ViX3NwYWNlKGxvZywgJmxvZy0+bF9ncmFudF9yZXNlcnZlX2hlYWQsCisJCQkJCXRpY2tldC0+dF9jdXJyX3Jlcyk7CisJeGxvZ19ncmFudF9zdWJfc3BhY2UobG9nLCAmbG9nLT5sX2dyYW50X3dyaXRlX2hlYWQsCisJCQkJCXRpY2tldC0+dF9jdXJyX3Jlcyk7CiAJdGlja2V0LT50X2N1cnJfcmVzID0gdGlja2V0LT50X3VuaXRfcmVzOwogCXhsb2dfdGljX3Jlc2V0X3Jlcyh0aWNrZXQpOwogCiAJdHJhY2VfeGZzX2xvZ19yZWdyYW50X3Jlc2VydmVfc3ViKGxvZywgdGlja2V0KTsKIAotCXhsb2dfdmVyaWZ5X2dyYW50X2hlYWQobG9nLCAxKTsKLQogCS8qIGp1c3QgcmV0dXJuIGlmIHdlIHN0aWxsIGhhdmUgc29tZSBvZiB0aGUgcHJlLXJlc2VydmVkIHNwYWNlICovCi0JaWYgKHRpY2tldC0+dF9jbnQgPiAwKSB7Ci0JCXNwaW5fdW5sb2NrKCZsb2ctPmxfZ3JhbnRfbG9jayk7CisJaWYgKHRpY2tldC0+dF9jbnQgPiAwKQogCQlyZXR1cm47Ci0JfQogCi0JeGxvZ19ncmFudF9hZGRfc3BhY2VfcmVzZXJ2ZShsb2csIHRpY2tldC0+dF91bml0X3Jlcyk7CisJeGxvZ19ncmFudF9hZGRfc3BhY2UobG9nLCAmbG9nLT5sX2dyYW50X3Jlc2VydmVfaGVhZCwKKwkJCQkJdGlja2V0LT50X3VuaXRfcmVzKTsKIAogCXRyYWNlX3hmc19sb2dfcmVncmFudF9yZXNlcnZlX2V4aXQobG9nLCB0aWNrZXQpOwogCi0JeGxvZ192ZXJpZnlfZ3JhbnRfaGVhZChsb2csIDApOwotCXNwaW5fdW5sb2NrKCZsb2ctPmxfZ3JhbnRfbG9jayk7CiAJdGlja2V0LT50X2N1cnJfcmVzID0gdGlja2V0LT50X3VuaXRfcmVzOwogCXhsb2dfdGljX3Jlc2V0X3Jlcyh0aWNrZXQpOwogfQkvKiB4bG9nX3JlZ3JhbnRfcmVzZXJ2ZV9sb2dfc3BhY2UgKi8KQEAgLTI4NDMsMjggKzI3NzUsMjkgQEAKIHhsb2dfdW5ncmFudF9sb2dfc3BhY2UoeGxvZ190CSAgICAgKmxvZywKIAkJICAgICAgIHhsb2dfdGlja2V0X3QgKnRpY2tldCkKIHsKKwlpbnQJYnl0ZXM7CisKIAlpZiAodGlja2V0LT50X2NudCA+IDApCiAJCXRpY2tldC0+dF9jbnQtLTsKIAotCXNwaW5fbG9jaygmbG9nLT5sX2dyYW50X2xvY2spOwogCXRyYWNlX3hmc19sb2dfdW5ncmFudF9lbnRlcihsb2csIHRpY2tldCk7Ci0KLQl4bG9nX2dyYW50X3N1Yl9zcGFjZShsb2csIHRpY2tldC0+dF9jdXJyX3Jlcyk7Ci0KIAl0cmFjZV94ZnNfbG9nX3VuZ3JhbnRfc3ViKGxvZywgdGlja2V0KTsKIAotCS8qIElmIHRoaXMgaXMgYSBwZXJtYW5lbnQgcmVzZXJ2YXRpb24gdGlja2V0LCB3ZSBtYXkgYmUgYWJsZSB0byBmcmVlCisJLyoKKwkgKiBJZiB0aGlzIGlzIGEgcGVybWFuZW50IHJlc2VydmF0aW9uIHRpY2tldCwgd2UgbWF5IGJlIGFibGUgdG8gZnJlZQogCSAqIHVwIG1vcmUgc3BhY2UgYmFzZWQgb24gdGhlIHJlbWFpbmluZyBjb3VudC4KIAkgKi8KKwlieXRlcyA9IHRpY2tldC0+dF9jdXJyX3JlczsKIAlpZiAodGlja2V0LT50X2NudCA+IDApIHsKIAkJQVNTRVJUKHRpY2tldC0+dF9mbGFncyAmIFhMT0dfVElDX1BFUk1fUkVTRVJWKTsKLQkJeGxvZ19ncmFudF9zdWJfc3BhY2UobG9nLCB0aWNrZXQtPnRfdW5pdF9yZXMqdGlja2V0LT50X2NudCk7CisJCWJ5dGVzICs9IHRpY2tldC0+dF91bml0X3Jlcyp0aWNrZXQtPnRfY250OwogCX0KIAorCXhsb2dfZ3JhbnRfc3ViX3NwYWNlKGxvZywgJmxvZy0+bF9ncmFudF9yZXNlcnZlX2hlYWQsIGJ5dGVzKTsKKwl4bG9nX2dyYW50X3N1Yl9zcGFjZShsb2csICZsb2ctPmxfZ3JhbnRfd3JpdGVfaGVhZCwgYnl0ZXMpOworCiAJdHJhY2VfeGZzX2xvZ191bmdyYW50X2V4aXQobG9nLCB0aWNrZXQpOwogCi0JeGxvZ192ZXJpZnlfZ3JhbnRfaGVhZChsb2csIDEpOwotCXNwaW5fdW5sb2NrKCZsb2ctPmxfZ3JhbnRfbG9jayk7CiAJeGZzX2xvZ19tb3ZlX3RhaWwobG9nLT5sX21wLCAxKTsKIH0JLyogeGxvZ191bmdyYW50X2xvZ19zcGFjZSAqLwogCkBAIC0yOTAxLDExICsyODM0LDExIEBACiAKIAlpZiAoaWNsb2ctPmljX3N0YXRlID09IFhMT0dfU1RBVEVfV0FOVF9TWU5DKSB7CiAJCS8qIHVwZGF0ZSB0YWlsIGJlZm9yZSB3cml0aW5nIHRvIGljbG9nICovCi0JCXhsb2dfYXNzaWduX3RhaWxfbHNuKGxvZy0+bF9tcCk7CisJCXhmc19sc25fdCB0YWlsX2xzbiA9IHhsb2dfYXNzaWduX3RhaWxfbHNuKGxvZy0+bF9tcCk7CiAJCXN5bmMrKzsKIAkJaWNsb2ctPmljX3N0YXRlID0gWExPR19TVEFURV9TWU5DSU5HOwotCQlpY2xvZy0+aWNfaGVhZGVyLmhfdGFpbF9sc24gPSBjcHVfdG9fYmU2NChsb2ctPmxfdGFpbF9sc24pOwotCQl4bG9nX3ZlcmlmeV90YWlsX2xzbihsb2csIGljbG9nLCBsb2ctPmxfdGFpbF9sc24pOworCQlpY2xvZy0+aWNfaGVhZGVyLmhfdGFpbF9sc24gPSBjcHVfdG9fYmU2NCh0YWlsX2xzbik7CisJCXhsb2dfdmVyaWZ5X3RhaWxfbHNuKGxvZywgaWNsb2csIHRhaWxfbHNuKTsKIAkJLyogY3ljbGUgaW5jcmVtZW50ZWQgd2hlbiBpbmNyZW1lbnRpbmcgY3Vycl9ibG9jayAqLwogCX0KIAlzcGluX3VubG9jaygmbG9nLT5sX2ljbG9nbG9jayk7CkBAIC0zMDg4LDcgKzMwMjEsNyBAQAogCQkJcmV0dXJuIFhGU19FUlJPUihFSU8pOwogCQl9CiAJCVhGU19TVEFUU19JTkMoeHNfbG9nX2ZvcmNlX3NsZWVwKTsKLQkJc3Zfd2FpdCgmaWNsb2ctPmljX2ZvcmNlX3dhaXQsIFBJTk9ELCAmbG9nLT5sX2ljbG9nbG9jaywgcyk7CisJCXhsb2dfd2FpdCgmaWNsb2ctPmljX2ZvcmNlX3dhaXQsICZsb2ctPmxfaWNsb2dsb2NrKTsKIAkJLyoKIAkJICogTm8gbmVlZCB0byBncmFiIHRoZSBsb2cgbG9jayBoZXJlIHNpbmNlIHdlJ3JlCiAJCSAqIG9ubHkgZGVjaWRpbmcgd2hldGhlciBvciBub3QgdG8gcmV0dXJuIEVJTwpAQCAtMzIwNiw4ICszMTM5LDggQEAKIAogCQkJCVhGU19TVEFUU19JTkMoeHNfbG9nX2ZvcmNlX3NsZWVwKTsKIAotCQkJCXN2X3dhaXQoJmljbG9nLT5pY19wcmV2LT5pY193cml0ZV93YWl0LAotCQkJCQlQU1dQLCAmbG9nLT5sX2ljbG9nbG9jaywgcyk7CisJCQkJeGxvZ193YWl0KCZpY2xvZy0+aWNfcHJldi0+aWNfd3JpdGVfd2FpdCwKKwkJCQkJCQkmbG9nLT5sX2ljbG9nbG9jayk7CiAJCQkJaWYgKGxvZ19mbHVzaGVkKQogCQkJCQkqbG9nX2ZsdXNoZWQgPSAxOwogCQkJCWFscmVhZHlfc2xlcHQgPSAxOwpAQCAtMzIzNSw3ICszMTY4LDcgQEAKIAkJCQlyZXR1cm4gWEZTX0VSUk9SKEVJTyk7CiAJCQl9CiAJCQlYRlNfU1RBVFNfSU5DKHhzX2xvZ19mb3JjZV9zbGVlcCk7Ci0JCQlzdl93YWl0KCZpY2xvZy0+aWNfZm9yY2Vfd2FpdCwgUFNXUCwgJmxvZy0+bF9pY2xvZ2xvY2ssIHMpOworCQkJeGxvZ193YWl0KCZpY2xvZy0+aWNfZm9yY2Vfd2FpdCwgJmxvZy0+bF9pY2xvZ2xvY2spOwogCQkJLyoKIAkJCSAqIE5vIG5lZWQgdG8gZ3JhYiB0aGUgbG9nIGxvY2sgaGVyZSBzaW5jZSB3ZSdyZQogCQkJICogb25seSBkZWNpZGluZyB3aGV0aGVyIG9yIG5vdCB0byByZXR1cm4gRUlPCkBAIC0zMzEwLDEwICszMjQzLDggQEAKIAl4bG9nX3RpY2tldF90CSp0aWNrZXQpCiB7CiAJQVNTRVJUKGF0b21pY19yZWFkKCZ0aWNrZXQtPnRfcmVmKSA+IDApOwotCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZ0aWNrZXQtPnRfcmVmKSkgewotCQlzdl9kZXN0cm95KCZ0aWNrZXQtPnRfd2FpdCk7CisJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJnRpY2tldC0+dF9yZWYpKQogCQlrbWVtX3pvbmVfZnJlZSh4ZnNfbG9nX3RpY2tldF96b25lLCB0aWNrZXQpOwotCX0KIH0KIAogeGxvZ190aWNrZXRfdCAqCkBAIC0zNDM1LDYgKzMzNjYsNyBAQAogICAgICAgICB9CiAKIAlhdG9taWNfc2V0KCZ0aWMtPnRfcmVmLCAxKTsKKwlJTklUX0xJU1RfSEVBRCgmdGljLT50X3F1ZXVlKTsKIAl0aWMtPnRfdW5pdF9yZXMJCT0gdW5pdF9ieXRlczsKIAl0aWMtPnRfY3Vycl9yZXMJCT0gdW5pdF9ieXRlczsKIAl0aWMtPnRfY250CQk9IGNudDsKQEAgLTM0NDUsNyArMzM3Nyw3IEBACiAJdGljLT50X3RyYW5zX3R5cGUJPSAwOwogCWlmICh4ZmxhZ3MgJiBYRlNfTE9HX1BFUk1fUkVTRVJWKQogCQl0aWMtPnRfZmxhZ3MgfD0gWExPR19USUNfUEVSTV9SRVNFUlY7Ci0Jc3ZfaW5pdCgmdGljLT50X3dhaXQsIFNWX0RFRkFVTFQsICJsb2d0aWNrIik7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmdGljLT50X3dhaXQpOwogCiAJeGxvZ190aWNfcmVzZXRfcmVzKHRpYyk7CiAKQEAgLTM0ODQsMTggKzM0MTYsMjUgQEAKIH0KIAogU1RBVElDIHZvaWQKLXhsb2dfdmVyaWZ5X2dyYW50X2hlYWQoeGxvZ190ICpsb2csIGludCBlcXVhbHMpCit4bG9nX3ZlcmlmeV9ncmFudF90YWlsKAorCXN0cnVjdCBsb2cJKmxvZykKIHsKLSAgICBpZiAobG9nLT5sX2dyYW50X3Jlc2VydmVfY3ljbGUgPT0gbG9nLT5sX2dyYW50X3dyaXRlX2N5Y2xlKSB7Ci0JaWYgKGVxdWFscykKLQkgICAgQVNTRVJUKGxvZy0+bF9ncmFudF9yZXNlcnZlX2J5dGVzID49IGxvZy0+bF9ncmFudF93cml0ZV9ieXRlcyk7Ci0JZWxzZQotCSAgICBBU1NFUlQobG9nLT5sX2dyYW50X3Jlc2VydmVfYnl0ZXMgPiBsb2ctPmxfZ3JhbnRfd3JpdGVfYnl0ZXMpOwotICAgIH0gZWxzZSB7Ci0JQVNTRVJUKGxvZy0+bF9ncmFudF9yZXNlcnZlX2N5Y2xlLTEgPT0gbG9nLT5sX2dyYW50X3dyaXRlX2N5Y2xlKTsKLQlBU1NFUlQobG9nLT5sX2dyYW50X3dyaXRlX2J5dGVzID49IGxvZy0+bF9ncmFudF9yZXNlcnZlX2J5dGVzKTsKLSAgICB9Ci19CS8qIHhsb2dfdmVyaWZ5X2dyYW50X2hlYWQgKi8KKwlpbnQJCXRhaWxfY3ljbGUsIHRhaWxfYmxvY2tzOworCWludAkJY3ljbGUsIHNwYWNlOworCisJLyoKKwkgKiBDaGVjayB0byBtYWtlIHN1cmUgdGhlIGdyYW50IHdyaXRlIGhlYWQgZGlkbid0IGp1c3Qgb3ZlciBsYXAgdGhlCisJICogdGFpbC4gIElmIHRoZSBjeWNsZXMgYXJlIHRoZSBzYW1lLCB3ZSBjYW4ndCBiZSBvdmVybGFwcGluZy4KKwkgKiBPdGhlcndpc2UsIG1ha2Ugc3VyZSB0aGF0IHRoZSBjeWNsZXMgZGlmZmVyIGJ5IGV4YWN0bHkgb25lIGFuZAorCSAqIGNoZWNrIHRoZSBieXRlIGNvdW50LgorCSAqLworCXhsb2dfY3JhY2tfZ3JhbnRfaGVhZCgmbG9nLT5sX2dyYW50X3dyaXRlX2hlYWQsICZjeWNsZSwgJnNwYWNlKTsKKwl4bG9nX2NyYWNrX2F0b21pY19sc24oJmxvZy0+bF90YWlsX2xzbiwgJnRhaWxfY3ljbGUsICZ0YWlsX2Jsb2Nrcyk7CisJaWYgKHRhaWxfY3ljbGUgIT0gY3ljbGUpIHsKKwkJQVNTRVJUKGN5Y2xlIC0gMSA9PSB0YWlsX2N5Y2xlKTsKKwkJQVNTRVJUKHNwYWNlIDw9IEJCVE9CKHRhaWxfYmxvY2tzKSk7CisJfQorfQogCiAvKiBjaGVjayBpZiBpdCB3aWxsIGZpdCAqLwogU1RBVElDIHZvaWQKQEAgLTM3MTYsMTIgKzM2NTUsMTAgQEAKIAkJeGxvZ19jaWxfZm9yY2UobG9nKTsKIAogCS8qCi0JICogV2UgbXVzdCBob2xkIGJvdGggdGhlIEdSQU5UIGxvY2sgYW5kIHRoZSBMT0cgbG9jaywKLQkgKiBiZWZvcmUgd2UgbWFyayB0aGUgZmlsZXN5c3RlbSBTSFVURE9XTiBhbmQgd2FrZQotCSAqIGV2ZXJ5Ym9keSB1cCB0byB0ZWxsIHRoZSBiYWQgbmV3cy4KKwkgKiBtYXJrIHRoZSBmaWxlc3lzdGVtIGFuZCB0aGUgYXMgaW4gYSBzaHV0ZG93biBzdGF0ZSBhbmQgd2FrZQorCSAqIGV2ZXJ5Ym9keSB1cCB0byB0ZWxsIHRoZW0gdGhlIGJhZCBuZXdzLgogCSAqLwogCXNwaW5fbG9jaygmbG9nLT5sX2ljbG9nbG9jayk7Ci0Jc3Bpbl9sb2NrKCZsb2ctPmxfZ3JhbnRfbG9jayk7CiAJbXAtPm1fZmxhZ3MgfD0gWEZTX01PVU5UX0ZTX1NIVVRET1dOOwogCWlmIChtcC0+bV9zYl9icCkKIAkJWEZTX0JVRl9ET05FKG1wLT5tX3NiX2JwKTsKQEAgLTM3NDIsMjcgKzM2NzksMjEgQEAKIAlzcGluX3VubG9jaygmbG9nLT5sX2ljbG9nbG9jayk7CiAKIAkvKgotCSAqIFdlIGRvbid0IHdhbnQgYW55Ym9keSB3YWl0aW5nIGZvciBsb2cgcmVzZXJ2YXRpb25zCi0JICogYWZ0ZXIgdGhpcy4gVGhhdCBtZWFucyB3ZSBoYXZlIHRvIHdha2UgdXAgZXZlcnlib2R5Ci0JICogcXVldWVkIHVwIG9uIHJlc2VydmVfaGVhZHEgYXMgd2VsbCBhcyB3cml0ZV9oZWFkcS4KLQkgKiBJbiBhZGRpdGlvbiwgd2UgbWFrZSBzdXJlIGluIHhsb2dfe3JlfWdyYW50X2xvZ19zcGFjZQotCSAqIHRoYXQgd2UgZG9uJ3QgZW5xdWV1ZSBhbnl0aGluZyBvbmNlIHRoZSBTSFVURE9XTiBmbGFnCi0JICogaXMgc2V0LCBhbmQgdGhpcyBhY3Rpb24gaXMgcHJvdGVjdGVkIGJ5IHRoZSBHUkFOVExPQ0suCisJICogV2UgZG9uJ3Qgd2FudCBhbnlib2R5IHdhaXRpbmcgZm9yIGxvZyByZXNlcnZhdGlvbnMgYWZ0ZXIgdGhpcy4gVGhhdAorCSAqIG1lYW5zIHdlIGhhdmUgdG8gd2FrZSB1cCBldmVyeWJvZHkgcXVldWVkIHVwIG9uIHJlc2VydmVxIGFzIHdlbGwgYXMKKwkgKiB3cml0ZXEuICBJbiBhZGRpdGlvbiwgd2UgbWFrZSBzdXJlIGluIHhsb2dfe3JlfWdyYW50X2xvZ19zcGFjZSB0aGF0CisJICogd2UgZG9uJ3QgZW5xdWV1ZSBhbnl0aGluZyBvbmNlIHRoZSBTSFVURE9XTiBmbGFnIGlzIHNldCwgYW5kIHRoaXMKKwkgKiBhY3Rpb24gaXMgcHJvdGVjdGVkIGJ5IHRoZSBncmFudCBsb2Nrcy4KIAkgKi8KLQlpZiAoKHRpYyA9IGxvZy0+bF9yZXNlcnZlX2hlYWRxKSkgewotCQlkbyB7Ci0JCQlzdl9zaWduYWwoJnRpYy0+dF93YWl0KTsKLQkJCXRpYyA9IHRpYy0+dF9uZXh0OwotCQl9IHdoaWxlICh0aWMgIT0gbG9nLT5sX3Jlc2VydmVfaGVhZHEpOwotCX0KKwlzcGluX2xvY2soJmxvZy0+bF9ncmFudF9yZXNlcnZlX2xvY2spOworCWxpc3RfZm9yX2VhY2hfZW50cnkodGljLCAmbG9nLT5sX3Jlc2VydmVxLCB0X3F1ZXVlKQorCQl3YWtlX3VwKCZ0aWMtPnRfd2FpdCk7CisJc3Bpbl91bmxvY2soJmxvZy0+bF9ncmFudF9yZXNlcnZlX2xvY2spOwogCi0JaWYgKCh0aWMgPSBsb2ctPmxfd3JpdGVfaGVhZHEpKSB7Ci0JCWRvIHsKLQkJCXN2X3NpZ25hbCgmdGljLT50X3dhaXQpOwotCQkJdGljID0gdGljLT50X25leHQ7Ci0JCX0gd2hpbGUgKHRpYyAhPSBsb2ctPmxfd3JpdGVfaGVhZHEpOwotCX0KLQlzcGluX3VubG9jaygmbG9nLT5sX2dyYW50X2xvY2spOworCXNwaW5fbG9jaygmbG9nLT5sX2dyYW50X3dyaXRlX2xvY2spOworCWxpc3RfZm9yX2VhY2hfZW50cnkodGljLCAmbG9nLT5sX3dyaXRlcSwgdF9xdWV1ZSkKKwkJd2FrZV91cCgmdGljLT50X3dhaXQpOworCXNwaW5fdW5sb2NrKCZsb2ctPmxfZ3JhbnRfd3JpdGVfbG9jayk7CiAKIAlpZiAoIShsb2ctPmxfaWNsb2ctPmljX3N0YXRlICYgWExPR19TVEFURV9JT0VSUk9SKSkgewogCQlBU1NFUlQoIWxvZ2Vycm9yKTsKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfbG9nX2NpbC5jIGIvZnMveGZzL3hmc19sb2dfY2lsLmMKaW5kZXggMjNkNmNlYi4uOWRjODEyNSAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19sb2dfY2lsLmMKKysrIGIvZnMveGZzL3hmc19sb2dfY2lsLmMKQEAgLTYxLDcgKzYxLDcgQEAKIAlJTklUX0xJU1RfSEVBRCgmY2lsLT54Y19jb21taXR0aW5nKTsKIAlzcGluX2xvY2tfaW5pdCgmY2lsLT54Y19jaWxfbG9jayk7CiAJaW5pdF9yd3NlbSgmY2lsLT54Y19jdHhfbG9jayk7Ci0Jc3ZfaW5pdCgmY2lsLT54Y19jb21taXRfd2FpdCwgU1ZfREVGQVVMVCwgImNpbHdhaXQiKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZjaWwtPnhjX2NvbW1pdF93YWl0KTsKIAogCUlOSVRfTElTVF9IRUFEKCZjdHgtPmNvbW1pdHRpbmcpOwogCUlOSVRfTElTVF9IRUFEKCZjdHgtPmJ1c3lfZXh0ZW50cyk7CkBAIC0zNjEsMTUgKzM2MSwxMCBAQAogCWludAlhYm9ydCkKIHsKIAlzdHJ1Y3QgeGZzX2NpbF9jdHgJKmN0eCA9IGFyZ3M7Ci0Jc3RydWN0IHhmc19sb2dfdmVjCSpsdjsKLQlpbnQJCQlhYm9ydGZsYWcgPSBhYm9ydCA/IFhGU19MSV9BQk9SVEVEIDogMDsKIAlzdHJ1Y3QgeGZzX2J1c3lfZXh0ZW50CSpidXN5cCwgKm47CiAKLQkvKiB1bnBpbiBhbGwgdGhlIGxvZyBpdGVtcyAqLwotCWZvciAobHYgPSBjdHgtPmx2X2NoYWluOyBsdjsgbHYgPSBsdi0+bHZfbmV4dCApIHsKLQkJeGZzX3RyYW5zX2l0ZW1fY29tbWl0dGVkKGx2LT5sdl9pdGVtLCBjdHgtPnN0YXJ0X2xzbiwKLQkJCQkJCQlhYm9ydGZsYWcpOwotCX0KKwl4ZnNfdHJhbnNfY29tbWl0dGVkX2J1bGsoY3R4LT5jaWwtPnhjX2xvZy0+bF9haWxwLCBjdHgtPmx2X2NoYWluLAorCQkJCQljdHgtPnN0YXJ0X2xzbiwgYWJvcnQpOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGJ1c3lwLCBuLCAmY3R4LT5idXN5X2V4dGVudHMsIGxpc3QpCiAJCXhmc19hbGxvY19idXN5X2NsZWFyKGN0eC0+Y2lsLT54Y19sb2ctPmxfbXAsIGJ1c3lwKTsKQEAgLTU2OCw3ICs1NjMsNyBAQAogCQkJICogSXQgaXMgc3RpbGwgYmVpbmcgcHVzaGVkISBXYWl0IGZvciB0aGUgcHVzaCB0bwogCQkJICogY29tcGxldGUsIHRoZW4gc3RhcnQgYWdhaW4gZnJvbSB0aGUgYmVnaW5uaW5nLgogCQkJICovCi0JCQlzdl93YWl0KCZjaWwtPnhjX2NvbW1pdF93YWl0LCAwLCAmY2lsLT54Y19jaWxfbG9jaywgMCk7CisJCQl4bG9nX3dhaXQoJmNpbC0+eGNfY29tbWl0X3dhaXQsICZjaWwtPnhjX2NpbF9sb2NrKTsKIAkJCWdvdG8gcmVzdGFydDsKIAkJfQogCX0KQEAgLTU5Miw3ICs1ODcsNyBAQAogCSAqLwogCXNwaW5fbG9jaygmY2lsLT54Y19jaWxfbG9jayk7CiAJY3R4LT5jb21taXRfbHNuID0gY29tbWl0X2xzbjsKLQlzdl9icm9hZGNhc3QoJmNpbC0+eGNfY29tbWl0X3dhaXQpOworCXdha2VfdXBfYWxsKCZjaWwtPnhjX2NvbW1pdF93YWl0KTsKIAlzcGluX3VubG9jaygmY2lsLT54Y19jaWxfbG9jayk7CiAKIAkvKiByZWxlYXNlIHRoZSBob3VuZHMhICovCkBAIC03NTcsNyArNzUyLDcgQEAKIAkJCSAqIEl0IGlzIHN0aWxsIGJlaW5nIHB1c2hlZCEgV2FpdCBmb3IgdGhlIHB1c2ggdG8KIAkJCSAqIGNvbXBsZXRlLCB0aGVuIHN0YXJ0IGFnYWluIGZyb20gdGhlIGJlZ2lubmluZy4KIAkJCSAqLwotCQkJc3Zfd2FpdCgmY2lsLT54Y19jb21taXRfd2FpdCwgMCwgJmNpbC0+eGNfY2lsX2xvY2ssIDApOworCQkJeGxvZ193YWl0KCZjaWwtPnhjX2NvbW1pdF93YWl0LCAmY2lsLT54Y19jaWxfbG9jayk7CiAJCQlnb3RvIHJlc3RhcnQ7CiAJCX0KIAkJaWYgKGN0eC0+c2VxdWVuY2UgIT0gc2VxdWVuY2UpCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2xvZ19wcml2LmggYi9mcy94ZnMveGZzX2xvZ19wcml2LmgKaW5kZXggZWRjZGZlMC4uZDVmOGJlOCAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19sb2dfcHJpdi5oCisrKyBiL2ZzL3hmcy94ZnNfbG9nX3ByaXYuaApAQCAtMjEsNyArMjEsNiBAQAogc3RydWN0IHhmc19idWY7CiBzdHJ1Y3QgbG9nOwogc3RydWN0IHhsb2dfdGlja2V0Owotc3RydWN0IHhmc19idWZfY2FuY2VsOwogc3RydWN0IHhmc19tb3VudDsKIAogLyoKQEAgLTU0LDcgKzUzLDYgQEAKIAlCVE9CQihYTE9HX01BWF9JQ0xPR1MgPDwgKHhmc19zYl92ZXJzaW9uX2hhc2xvZ3YyKCZsb2ctPmxfbXAtPm1fc2IpID8gXAogCSBYTE9HX01BWF9SRUNPUkRfQlNISUZUIDogWExPR19CSUdfUkVDT1JEX0JTSElGVCkpCiAKLQogc3RhdGljIGlubGluZSB4ZnNfbHNuX3QgeGxvZ19hc3NpZ25fbHNuKHVpbnQgY3ljbGUsIHVpbnQgYmxvY2spCiB7CiAJcmV0dXJuICgoeGZzX2xzbl90KWN5Y2xlIDw8IDMyKSB8IGJsb2NrOwpAQCAtMTMzLDEyICsxMzEsMTAgQEAKICAqLwogI2RlZmluZSBYTE9HX1RJQ19JTklURUQJCTB4MQkvKiBoYXMgYmVlbiBpbml0aWFsaXplZCAqLwogI2RlZmluZSBYTE9HX1RJQ19QRVJNX1JFU0VSVgkweDIJLyogcGVybWFuZW50IHJlc2VydmF0aW9uICovCi0jZGVmaW5lIFhMT0dfVElDX0lOX1EJCTB4NAogCiAjZGVmaW5lIFhMT0dfVElDX0ZMQUdTIFwKIAl7IFhMT0dfVElDX0lOSVRFRCwJIlhMT0dfVElDX0lOSVRFRCIgfSwgXAotCXsgWExPR19USUNfUEVSTV9SRVNFUlYsCSJYTE9HX1RJQ19QRVJNX1JFU0VSViIgfSwgXAotCXsgWExPR19USUNfSU5fUSwJIlhMT0dfVElDX0lOX1EiIH0KKwl7IFhMT0dfVElDX1BFUk1fUkVTRVJWLAkiWExPR19USUNfUEVSTV9SRVNFUlYiIH0KIAogI2VuZGlmCS8qIF9fS0VSTkVMX18gKi8KIApAQCAtMjQ0LDkgKzI0MCw4IEBACiB9IHhsb2dfcmVzX3Q7CiAKIHR5cGVkZWYgc3RydWN0IHhsb2dfdGlja2V0IHsKLQlzdl90CQkgICB0X3dhaXQ7CSAvKiB0aWNrZXQgd2FpdCBxdWV1ZSAgICAgICAgICAgIDogMjAgKi8KLQlzdHJ1Y3QgeGxvZ190aWNrZXQgKnRfbmV4dDsJIC8qCQkJICAgICAgICAgOjR8OCAqLwotCXN0cnVjdCB4bG9nX3RpY2tldCAqdF9wcmV2OwkgLyoJCQkJIDo0fDggKi8KKwl3YWl0X3F1ZXVlX2hlYWRfdCAgdF93YWl0OwkgLyogdGlja2V0IHdhaXQgcXVldWUgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkICAgdF9xdWV1ZTsJIC8qIHJlc2VydmUvd3JpdGUgcXVldWUgKi8KIAl4bG9nX3RpZF90CSAgIHRfdGlkOwkgLyogdHJhbnNhY3Rpb24gaWRlbnRpZmllcgkgOiA0ICAqLwogCWF0b21pY190CSAgIHRfcmVmOwkgLyogdGlja2V0IHJlZmVyZW5jZSBjb3VudCAgICAgICA6IDQgICovCiAJaW50CQkgICB0X2N1cnJfcmVzOwkgLyogY3VycmVudCByZXNlcnZhdGlvbiBpbiBieXRlcyA6IDQgICovCkBAIC0zNTMsOCArMzQ4LDggQEAKICAqIGFuZCBtb3ZlIGV2ZXJ5dGhpbmcgZWxzZSBvdXQgdG8gc3Vic2VxdWVudCBjYWNoZWxpbmVzLgogICovCiB0eXBlZGVmIHN0cnVjdCB4bG9nX2luX2NvcmUgewotCXN2X3QJCQlpY19mb3JjZV93YWl0OwotCXN2X3QJCQlpY193cml0ZV93YWl0OworCXdhaXRfcXVldWVfaGVhZF90CWljX2ZvcmNlX3dhaXQ7CisJd2FpdF9xdWV1ZV9oZWFkX3QJaWNfd3JpdGVfd2FpdDsKIAlzdHJ1Y3QgeGxvZ19pbl9jb3JlCSppY19uZXh0OwogCXN0cnVjdCB4bG9nX2luX2NvcmUJKmljX3ByZXY7CiAJc3RydWN0IHhmc19idWYJCSppY19icDsKQEAgLTQyMSw3ICs0MTYsNyBAQAogCXN0cnVjdCB4ZnNfY2lsX2N0eAkqeGNfY3R4OwogCXN0cnVjdCByd19zZW1hcGhvcmUJeGNfY3R4X2xvY2s7CiAJc3RydWN0IGxpc3RfaGVhZAl4Y19jb21taXR0aW5nOwotCXN2X3QJCQl4Y19jb21taXRfd2FpdDsKKwl3YWl0X3F1ZXVlX2hlYWRfdAl4Y19jb21taXRfd2FpdDsKIAl4ZnNfbHNuX3QJCXhjX2N1cnJlbnRfc2VxdWVuY2U7CiB9OwogCkBAIC00OTEsNyArNDg2LDcgQEAKIAlzdHJ1Y3QgeGZzX2J1ZnRhcmcJKmxfdGFyZzsgICAgICAgIC8qIGJ1ZnRhcmcgb2YgbG9nICovCiAJdWludAkJCWxfZmxhZ3M7CiAJdWludAkJCWxfcXVvdGFvZmZzX2ZsYWc7IC8qIFhGU19EUV8qLCBmb3IgUVVPVEFPRkZzICovCi0Jc3RydWN0IHhmc19idWZfY2FuY2VsCSoqbF9idWZfY2FuY2VsX3RhYmxlOworCXN0cnVjdCBsaXN0X2hlYWQJKmxfYnVmX2NhbmNlbF90YWJsZTsKIAlpbnQJCQlsX2ljbG9nX2hzaXplOyAgLyogc2l6ZSBvZiBpY2xvZyBoZWFkZXIgKi8KIAlpbnQJCQlsX2ljbG9nX2hlYWRzOyAgLyogIyBvZiBpY2xvZyBoZWFkZXIgc2VjdG9ycyAqLwogCXVpbnQJCQlsX3NlY3RCQnNpemU7ICAgLyogc2VjdG9yIHNpemUgaW4gQkJzICgyXm4pICovCkBAIC01MDMsMjkgKzQ5OCw0MCBAQAogCWludAkJCWxfbG9nQkJzaXplOyAgICAvKiBzaXplIG9mIGxvZyBpbiBCQiBjaHVua3MgKi8KIAogCS8qIFRoZSBmb2xsb3dpbmcgYmxvY2sgb2YgZmllbGRzIGFyZSBjaGFuZ2VkIHdoaWxlIGhvbGRpbmcgaWNsb2dsb2NrICovCi0Jc3ZfdAkJCWxfZmx1c2hfd2FpdCBfX19fY2FjaGVsaW5lX2FsaWduZWRfaW5fc21wOworCXdhaXRfcXVldWVfaGVhZF90CWxfZmx1c2hfd2FpdCBfX19fY2FjaGVsaW5lX2FsaWduZWRfaW5fc21wOwogCQkJCQkJLyogd2FpdGluZyBmb3IgaWNsb2cgZmx1c2ggKi8KIAlpbnQJCQlsX2NvdmVyZWRfc3RhdGU7Lyogc3RhdGUgb2YgImNvdmVyaW5nIGRpc2sKIAkJCQkJCSAqIGxvZyBlbnRyaWVzIiAqLwogCXhsb2dfaW5fY29yZV90CQkqbF9pY2xvZzsgICAgICAgLyogaGVhZCBsb2cgcXVldWUJKi8KIAlzcGlubG9ja190CQlsX2ljbG9nbG9jazsgICAgLyogZ3JhYiB0byBjaGFuZ2UgaWNsb2cgc3RhdGUgKi8KLQl4ZnNfbHNuX3QJCWxfdGFpbF9sc247ICAgICAvKiBsc24gb2YgMXN0IExSIHdpdGggdW5mbHVzaGVkCi0JCQkJCQkgKiBidWZmZXJzICovCi0JeGZzX2xzbl90CQlsX2xhc3Rfc3luY19sc247LyogbHNuIG9mIGxhc3QgTFIgb24gZGlzayAqLwogCWludAkJCWxfY3Vycl9jeWNsZTsgICAvKiBDeWNsZSBudW1iZXIgb2YgbG9nIHdyaXRlcyAqLwogCWludAkJCWxfcHJldl9jeWNsZTsgICAvKiBDeWNsZSBudW1iZXIgYmVmb3JlIGxhc3QKIAkJCQkJCSAqIGJsb2NrIGluY3JlbWVudCAqLwogCWludAkJCWxfY3Vycl9ibG9jazsgICAvKiBjdXJyZW50IGxvZ2ljYWwgbG9nIGJsb2NrICovCiAJaW50CQkJbF9wcmV2X2Jsb2NrOyAgIC8qIHByZXZpb3VzIGxvZ2ljYWwgbG9nIGJsb2NrICovCiAKLQkvKiBUaGUgZm9sbG93aW5nIGJsb2NrIG9mIGZpZWxkcyBhcmUgY2hhbmdlZCB3aGlsZSBob2xkaW5nIGdyYW50X2xvY2sgKi8KLQlzcGlubG9ja190CQlsX2dyYW50X2xvY2sgX19fX2NhY2hlbGluZV9hbGlnbmVkX2luX3NtcDsKLQl4bG9nX3RpY2tldF90CQkqbF9yZXNlcnZlX2hlYWRxOwotCXhsb2dfdGlja2V0X3QJCSpsX3dyaXRlX2hlYWRxOwotCWludAkJCWxfZ3JhbnRfcmVzZXJ2ZV9jeWNsZTsKLQlpbnQJCQlsX2dyYW50X3Jlc2VydmVfYnl0ZXM7Ci0JaW50CQkJbF9ncmFudF93cml0ZV9jeWNsZTsKLQlpbnQJCQlsX2dyYW50X3dyaXRlX2J5dGVzOworCS8qCisJICogbF9sYXN0X3N5bmNfbHNuIGFuZCBsX3RhaWxfbHNuIGFyZSBhdG9taWNzIHNvIHRoZXkgY2FuIGJlIHNldCBhbmQKKwkgKiByZWFkIHdpdGhvdXQgbmVlZGluZyB0byBob2xkIHNwZWNpZmljIGxvY2tzLiBUbyBhdm9pZCBvcGVyYXRpb25zCisJICogY29udGVuZGluZyB3aXRoIG90aGVyIGhvdCBvYmplY3RzLCBwbGFjZSBlYWNoIG9mIHRoZW0gb24gYSBzZXBhcmF0ZQorCSAqIGNhY2hlbGluZS4KKwkgKi8KKwkvKiBsc24gb2YgbGFzdCBMUiBvbiBkaXNrICovCisJYXRvbWljNjRfdAkJbF9sYXN0X3N5bmNfbHNuIF9fX19jYWNoZWxpbmVfYWxpZ25lZF9pbl9zbXA7CisJLyogbHNuIG9mIDFzdCBMUiB3aXRoIHVuZmx1c2hlZCAqIGJ1ZmZlcnMgKi8KKwlhdG9taWM2NF90CQlsX3RhaWxfbHNuIF9fX19jYWNoZWxpbmVfYWxpZ25lZF9pbl9zbXA7CisKKwkvKgorCSAqIHRpY2tldCBncmFudCBsb2NrcywgcXVldWVzIGFuZCBhY2NvdW50aW5nIGhhdmUgdGhlaXIgb3duIGNhY2hsaW5lcworCSAqIGFzIHRoZXNlIGFyZSBxdWl0ZSBob3QgYW5kIGNhbiBiZSBvcGVyYXRlZCBvbiBjb25jdXJyZW50bHkuCisJICovCisJc3BpbmxvY2tfdAkJbF9ncmFudF9yZXNlcnZlX2xvY2sgX19fX2NhY2hlbGluZV9hbGlnbmVkX2luX3NtcDsKKwlzdHJ1Y3QgbGlzdF9oZWFkCWxfcmVzZXJ2ZXE7CisJYXRvbWljNjRfdAkJbF9ncmFudF9yZXNlcnZlX2hlYWQ7CisKKwlzcGlubG9ja190CQlsX2dyYW50X3dyaXRlX2xvY2sgX19fX2NhY2hlbGluZV9hbGlnbmVkX2luX3NtcDsKKwlzdHJ1Y3QgbGlzdF9oZWFkCWxfd3JpdGVxOworCWF0b21pYzY0X3QJCWxfZ3JhbnRfd3JpdGVfaGVhZDsKIAogCS8qIFRoZSBmb2xsb3dpbmcgZmllbGQgYXJlIHVzZWQgZm9yIGRlYnVnZ2luZzsgbmVlZCB0byBob2xkIGljbG9nbG9jayAqLwogI2lmZGVmIERFQlVHCkBAIC01MzQsNiArNTQwLDkgQEAKIAogfSB4bG9nX3Q7CiAKKyNkZWZpbmUgWExPR19CVUZfQ0FOQ0VMX0JVQ0tFVChsb2csIGJsa25vKSBcCisJKChsb2cpLT5sX2J1Zl9jYW5jZWxfdGFibGUgKyAoKF9fdWludDY0X3QpYmxrbm8gJSBYTE9HX0JDX1RBQkxFX1NJWkUpKQorCiAjZGVmaW5lIFhMT0dfRk9SQ0VEX1NIVVRET1dOKGxvZykJKChsb2cpLT5sX2ZsYWdzICYgWExPR19JT19FUlJPUikKIAogLyogY29tbW9uIHJvdXRpbmVzICovCkBAIC01NjIsNiArNTcxLDYxIEBACiAJCQkJeGxvZ19pbl9jb3JlX3QgKipjb21taXRfaWNsb2csIHVpbnQgZmxhZ3MpOwogCiAvKgorICogV2hlbiB3ZSBjcmFjayBhbiBhdG9taWMgTFNOLCB3ZSBzYW1wbGUgaXQgZmlyc3Qgc28gdGhhdCB0aGUgdmFsdWUgd2lsbCBub3QKKyAqIGNoYW5nZSB3aGlsZSB3ZSBhcmUgY3JhY2tpbmcgaXQgaW50byB0aGUgY29tcG9uZW50IHZhbHVlcy4gVGhpcyBtZWFucyB3ZQorICogd2lsbCBhbHdheXMgZ2V0IGNvbnNpc3RlbnQgY29tcG9uZW50IHZhbHVlcyB0byB3b3JrIGZyb20uIFRoaXMgc2hvdWxkIGFsd2F5cworICogYmUgdXNlZCB0byBzbWFwbGUgYW5kIGNyYWNrIExTTnMgdGFodCBhcmUgc3RvcmVkIGFuZCB1cGRhdGVkIGluIGF0b21pYworICogdmFyaWFibGVzLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQKK3hsb2dfY3JhY2tfYXRvbWljX2xzbihhdG9taWM2NF90ICpsc24sIHVpbnQgKmN5Y2xlLCB1aW50ICpibG9jaykKK3sKKwl4ZnNfbHNuX3QgdmFsID0gYXRvbWljNjRfcmVhZChsc24pOworCisJKmN5Y2xlID0gQ1lDTEVfTFNOKHZhbCk7CisJKmJsb2NrID0gQkxPQ0tfTFNOKHZhbCk7Cit9CisKKy8qCisgKiBDYWxjdWxhdGUgYW5kIGFzc2lnbiBhIHZhbHVlIHRvIGFuIGF0b21pYyBMU04gdmFyaWFibGUgZnJvbSBjb21wb25lbnQgcGllY2VzLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQKK3hsb2dfYXNzaWduX2F0b21pY19sc24oYXRvbWljNjRfdCAqbHNuLCB1aW50IGN5Y2xlLCB1aW50IGJsb2NrKQoreworCWF0b21pYzY0X3NldChsc24sIHhsb2dfYXNzaWduX2xzbihjeWNsZSwgYmxvY2spKTsKK30KKworLyoKKyAqIFdoZW4gd2UgY3JhY2sgdGhlIGdyYW50IGhlYWQsIHdlIHNhbXBsZSBpdCBmaXJzdCBzbyB0aGF0IHRoZSB2YWx1ZSB3aWxsIG5vdAorICogY2hhbmdlIHdoaWxlIHdlIGFyZSBjcmFja2luZyBpdCBpbnRvIHRoZSBjb21wb25lbnQgdmFsdWVzLiBUaGlzIG1lYW5zIHdlCisgKiB3aWxsIGFsd2F5cyBnZXQgY29uc2lzdGVudCBjb21wb25lbnQgdmFsdWVzIHRvIHdvcmsgZnJvbS4KKyAqLworc3RhdGljIGlubGluZSB2b2lkCit4bG9nX2NyYWNrX2dyYW50X2hlYWRfdmFsKGludDY0X3QgdmFsLCBpbnQgKmN5Y2xlLCBpbnQgKnNwYWNlKQoreworCSpjeWNsZSA9IHZhbCA+PiAzMjsKKwkqc3BhY2UgPSB2YWwgJiAweGZmZmZmZmZmOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK3hsb2dfY3JhY2tfZ3JhbnRfaGVhZChhdG9taWM2NF90ICpoZWFkLCBpbnQgKmN5Y2xlLCBpbnQgKnNwYWNlKQoreworCXhsb2dfY3JhY2tfZ3JhbnRfaGVhZF92YWwoYXRvbWljNjRfcmVhZChoZWFkKSwgY3ljbGUsIHNwYWNlKTsKK30KKworc3RhdGljIGlubGluZSBpbnQ2NF90Cit4bG9nX2Fzc2lnbl9ncmFudF9oZWFkX3ZhbChpbnQgY3ljbGUsIGludCBzcGFjZSkKK3sKKwlyZXR1cm4gKChpbnQ2NF90KWN5Y2xlIDw8IDMyKSB8IHNwYWNlOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK3hsb2dfYXNzaWduX2dyYW50X2hlYWQoYXRvbWljNjRfdCAqaGVhZCwgaW50IGN5Y2xlLCBpbnQgc3BhY2UpCit7CisJYXRvbWljNjRfc2V0KGhlYWQsIHhsb2dfYXNzaWduX2dyYW50X2hlYWRfdmFsKGN5Y2xlLCBzcGFjZSkpOworfQorCisvKgogICogQ29tbWl0dGVkIEl0ZW0gTGlzdCBpbnRlcmZhY2VzCiAgKi8KIGludAl4bG9nX2NpbF9pbml0KHN0cnVjdCBsb2cgKmxvZyk7CkBAIC01ODUsNiArNjQ5LDIxIEBACiAgKi8KICNkZWZpbmUgWExPR19VTk1PVU5UX1JFQ19UWVBFCSgtMVUpCiAKKy8qCisgKiBXcmFwcGVyIGZ1bmN0aW9uIGZvciB3YWl0aW5nIG9uIGEgd2FpdCBxdWV1ZSBzZXJpYWxpc2VkIGFnYWluc3Qgd2FrZXVwcworICogYnkgYSBzcGlubG9jay4gVGhpcyBtYXRjaGVzIHRoZSBzZW1hbnRpY3Mgb2YgYWxsIHRoZSB3YWl0IHF1ZXVlcyB1c2VkIGluIHRoZQorICogbG9nIGNvZGUuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCB4bG9nX3dhaXQod2FpdF9xdWV1ZV9oZWFkX3QgKndxLCBzcGlubG9ja190ICpsb2NrKQoreworCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOworCisJYWRkX3dhaXRfcXVldWVfZXhjbHVzaXZlKHdxLCAmd2FpdCk7CisJX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJc3Bpbl91bmxvY2sobG9jayk7CisJc2NoZWR1bGUoKTsKKwlyZW1vdmVfd2FpdF9xdWV1ZSh3cSwgJndhaXQpOworfQogI2VuZGlmCS8qIF9fS0VSTkVMX18gKi8KIAogI2VuZGlmCS8qIF9fWEZTX0xPR19QUklWX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19sb2dfcmVjb3Zlci5jIGIvZnMveGZzL3hmc19sb2dfcmVjb3Zlci5jCmluZGV4IDk2NmQzZjkuLjIwNGQ4ZTUgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfbG9nX3JlY292ZXIuYworKysgYi9mcy94ZnMveGZzX2xvZ19yZWNvdmVyLmMKQEAgLTUzLDYgKzUzLDE3IEBACiAjZW5kaWYKIAogLyoKKyAqIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgZHVyaW5nIHJlY292ZXJ5IHRvIHJlY29yZCB0aGUgYnVmIGxvZyBpdGVtcyB3aGljaAorICogaGF2ZSBiZWVuIGNhbmNlbGVkIGFuZCBzaG91bGQgbm90IGJlIHJlcGxheWVkLgorICovCitzdHJ1Y3QgeGZzX2J1Zl9jYW5jZWwgeworCXhmc19kYWRkcl90CQliY19ibGtubzsKKwl1aW50CQkJYmNfbGVuOworCWludAkJCWJjX3JlZmNvdW50OworCXN0cnVjdCBsaXN0X2hlYWQJYmNfbGlzdDsKK307CisKKy8qCiAgKiBTZWN0b3IgYWxpZ25lZCBidWZmZXIgcm91dGluZXMgZm9yIGJ1ZmZlciBjcmVhdGUvcmVhZC93cml0ZS9hY2Nlc3MKICAqLwogCkBAIC05MjUsMTIgKzkzNiwxMiBAQAogCWxvZy0+bF9jdXJyX2N5Y2xlID0gYmUzMl90b19jcHUocmhlYWQtPmhfY3ljbGUpOwogCWlmIChmb3VuZCA9PSAyKQogCQlsb2ctPmxfY3Vycl9jeWNsZSsrOwotCWxvZy0+bF90YWlsX2xzbiA9IGJlNjRfdG9fY3B1KHJoZWFkLT5oX3RhaWxfbHNuKTsKLQlsb2ctPmxfbGFzdF9zeW5jX2xzbiA9IGJlNjRfdG9fY3B1KHJoZWFkLT5oX2xzbik7Ci0JbG9nLT5sX2dyYW50X3Jlc2VydmVfY3ljbGUgPSBsb2ctPmxfY3Vycl9jeWNsZTsKLQlsb2ctPmxfZ3JhbnRfcmVzZXJ2ZV9ieXRlcyA9IEJCVE9CKGxvZy0+bF9jdXJyX2Jsb2NrKTsKLQlsb2ctPmxfZ3JhbnRfd3JpdGVfY3ljbGUgPSBsb2ctPmxfY3Vycl9jeWNsZTsKLQlsb2ctPmxfZ3JhbnRfd3JpdGVfYnl0ZXMgPSBCQlRPQihsb2ctPmxfY3Vycl9ibG9jayk7CisJYXRvbWljNjRfc2V0KCZsb2ctPmxfdGFpbF9sc24sIGJlNjRfdG9fY3B1KHJoZWFkLT5oX3RhaWxfbHNuKSk7CisJYXRvbWljNjRfc2V0KCZsb2ctPmxfbGFzdF9zeW5jX2xzbiwgYmU2NF90b19jcHUocmhlYWQtPmhfbHNuKSk7CisJeGxvZ19hc3NpZ25fZ3JhbnRfaGVhZCgmbG9nLT5sX2dyYW50X3Jlc2VydmVfaGVhZCwgbG9nLT5sX2N1cnJfY3ljbGUsCisJCQkJCUJCVE9CKGxvZy0+bF9jdXJyX2Jsb2NrKSk7CisJeGxvZ19hc3NpZ25fZ3JhbnRfaGVhZCgmbG9nLT5sX2dyYW50X3dyaXRlX2hlYWQsIGxvZy0+bF9jdXJyX2N5Y2xlLAorCQkJCQlCQlRPQihsb2ctPmxfY3Vycl9ibG9jaykpOwogCiAJLyoKIAkgKiBMb29rIGZvciB1bm1vdW50IHJlY29yZC4gIElmIHdlIGZpbmQgaXQsIHRoZW4gd2Uga25vdyB0aGVyZQpAQCAtOTYwLDcgKzk3MSw3IEBACiAJfQogCWFmdGVyX3Vtb3VudF9ibGsgPSAoaSArIGhibGtzICsgKGludCkKIAkJQlRPQkIoYmUzMl90b19jcHUocmhlYWQtPmhfbGVuKSkpICUgbG9nLT5sX2xvZ0JCc2l6ZTsKLQl0YWlsX2xzbiA9IGxvZy0+bF90YWlsX2xzbjsKKwl0YWlsX2xzbiA9IGF0b21pYzY0X3JlYWQoJmxvZy0+bF90YWlsX2xzbik7CiAJaWYgKCpoZWFkX2JsayA9PSBhZnRlcl91bW91bnRfYmxrICYmCiAJICAgIGJlMzJfdG9fY3B1KHJoZWFkLT5oX251bV9sb2dvcHMpID09IDEpIHsKIAkJdW1vdW50X2RhdGFfYmxrID0gKGkgKyBoYmxrcykgJSBsb2ctPmxfbG9nQkJzaXplOwpAQCAtOTc1LDEyICs5ODYsMTAgQEAKIAkJCSAqIGxvZyByZWNvcmRzIHdpbGwgcG9pbnQgcmVjb3ZlcnkgdG8gYWZ0ZXIgdGhlCiAJCQkgKiBjdXJyZW50IHVubW91bnQgcmVjb3JkLgogCQkJICovCi0JCQlsb2ctPmxfdGFpbF9sc24gPQotCQkJCXhsb2dfYXNzaWduX2xzbihsb2ctPmxfY3Vycl9jeWNsZSwKLQkJCQkJCWFmdGVyX3Vtb3VudF9ibGspOwotCQkJbG9nLT5sX2xhc3Rfc3luY19sc24gPQotCQkJCXhsb2dfYXNzaWduX2xzbihsb2ctPmxfY3Vycl9jeWNsZSwKLQkJCQkJCWFmdGVyX3Vtb3VudF9ibGspOworCQkJeGxvZ19hc3NpZ25fYXRvbWljX2xzbigmbG9nLT5sX3RhaWxfbHNuLAorCQkJCQlsb2ctPmxfY3Vycl9jeWNsZSwgYWZ0ZXJfdW1vdW50X2Jsayk7CisJCQl4bG9nX2Fzc2lnbl9hdG9taWNfbHNuKCZsb2ctPmxfbGFzdF9zeW5jX2xzbiwKKwkJCQkJbG9nLT5sX2N1cnJfY3ljbGUsIGFmdGVyX3Vtb3VudF9ibGspOwogCQkJKnRhaWxfYmxrID0gYWZ0ZXJfdW1vdW50X2JsazsKIAogCQkJLyoKQEAgLTE2MDUsODIgKzE2MTQsNDUgQEAKICAqIHJlY29yZCBpbiB0aGUgdGFibGUgdG8gdGVsbCB1cyBob3cgbWFueSB0aW1lcyB3ZSBleHBlY3QgdG8gc2VlIHRoaXMKICAqIHJlY29yZCBkdXJpbmcgdGhlIHNlY29uZCBwYXNzLgogICovCi1TVEFUSUMgdm9pZAoteGxvZ19yZWNvdmVyX2RvX2J1ZmZlcl9wYXNzMSgKLQl4bG9nX3QJCQkqbG9nLAotCXhmc19idWZfbG9nX2Zvcm1hdF90CSpidWZfZikKK1NUQVRJQyBpbnQKK3hsb2dfcmVjb3Zlcl9idWZmZXJfcGFzczEoCisJc3RydWN0IGxvZwkJKmxvZywKKwl4bG9nX3JlY292ZXJfaXRlbV90CSppdGVtKQogewotCXhmc19idWZfY2FuY2VsX3QJKmJjcDsKLQl4ZnNfYnVmX2NhbmNlbF90CSpuZXh0cDsKLQl4ZnNfYnVmX2NhbmNlbF90CSpwcmV2cDsKLQl4ZnNfYnVmX2NhbmNlbF90CSoqYnVja2V0OwotCXhmc19kYWRkcl90CQlibGtubyA9IDA7Ci0JdWludAkJCWxlbiA9IDA7Ci0JdXNob3J0CQkJZmxhZ3MgPSAwOwotCi0Jc3dpdGNoIChidWZfZi0+YmxmX3R5cGUpIHsKLQljYXNlIFhGU19MSV9CVUY6Ci0JCWJsa25vID0gYnVmX2YtPmJsZl9ibGtubzsKLQkJbGVuID0gYnVmX2YtPmJsZl9sZW47Ci0JCWZsYWdzID0gYnVmX2YtPmJsZl9mbGFnczsKLQkJYnJlYWs7Ci0JfQorCXhmc19idWZfbG9nX2Zvcm1hdF90CSpidWZfZiA9IGl0ZW0tPnJpX2J1ZlswXS5pX2FkZHI7CisJc3RydWN0IGxpc3RfaGVhZAkqYnVja2V0OworCXN0cnVjdCB4ZnNfYnVmX2NhbmNlbAkqYmNwOwogCiAJLyoKIAkgKiBJZiB0aGlzIGlzbid0IGEgY2FuY2VsIGJ1ZmZlciBpdGVtLCB0aGVuIGp1c3QgcmV0dXJuLgogCSAqLwotCWlmICghKGZsYWdzICYgWEZTX0JMRl9DQU5DRUwpKSB7CisJaWYgKCEoYnVmX2YtPmJsZl9mbGFncyAmIFhGU19CTEZfQ0FOQ0VMKSkgewogCQl0cmFjZV94ZnNfbG9nX3JlY292ZXJfYnVmX25vdF9jYW5jZWwobG9nLCBidWZfZik7Ci0JCXJldHVybjsKKwkJcmV0dXJuIDA7CiAJfQogCiAJLyoKLQkgKiBJbnNlcnQgYW4geGZzX2J1Zl9jYW5jZWwgcmVjb3JkIGludG8gdGhlIGhhc2ggdGFibGUgb2YKLQkgKiB0aGVtLiAgSWYgdGhlcmUgaXMgYWxyZWFkeSBhbiBpZGVudGljYWwgcmVjb3JkLCBidW1wCi0JICogaXRzIHJlZmVyZW5jZSBjb3VudC4KKwkgKiBJbnNlcnQgYW4geGZzX2J1Zl9jYW5jZWwgcmVjb3JkIGludG8gdGhlIGhhc2ggdGFibGUgb2YgdGhlbS4KKwkgKiBJZiB0aGVyZSBpcyBhbHJlYWR5IGFuIGlkZW50aWNhbCByZWNvcmQsIGJ1bXAgaXRzIHJlZmVyZW5jZSBjb3VudC4KIAkgKi8KLQlidWNrZXQgPSAmbG9nLT5sX2J1Zl9jYW5jZWxfdGFibGVbKF9fdWludDY0X3QpYmxrbm8gJQotCQkJCQkgIFhMT0dfQkNfVEFCTEVfU0laRV07Ci0JLyoKLQkgKiBJZiB0aGUgaGFzaCBidWNrZXQgaXMgZW1wdHkgdGhlbiBqdXN0IGluc2VydCBhIG5ldyByZWNvcmQgaW50bwotCSAqIHRoZSBidWNrZXQuCi0JICovCi0JaWYgKCpidWNrZXQgPT0gTlVMTCkgewotCQliY3AgPSAoeGZzX2J1Zl9jYW5jZWxfdCAqKWttZW1fYWxsb2Moc2l6ZW9mKHhmc19idWZfY2FuY2VsX3QpLAotCQkJCQkJICAgICBLTV9TTEVFUCk7Ci0JCWJjcC0+YmNfYmxrbm8gPSBibGtubzsKLQkJYmNwLT5iY19sZW4gPSBsZW47Ci0JCWJjcC0+YmNfcmVmY291bnQgPSAxOwotCQliY3AtPmJjX25leHQgPSBOVUxMOwotCQkqYnVja2V0ID0gYmNwOwotCQlyZXR1cm47Ci0JfQotCi0JLyoKLQkgKiBUaGUgaGFzaCBidWNrZXQgaXMgbm90IGVtcHR5LCBzbyBzZWFyY2ggZm9yIGR1cGxpY2F0ZXMgb2Ygb3VyCi0JICogcmVjb3JkLiAgSWYgd2UgZmluZCBvbmUgdGhlbSBqdXN0IGJ1bXAgaXRzIHJlZmNvdW50LiAgSWYgbm90Ci0JICogdGhlbiBhZGQgdXMgYXQgdGhlIGVuZCBvZiB0aGUgbGlzdC4KLQkgKi8KLQlwcmV2cCA9IE5VTEw7Ci0JbmV4dHAgPSAqYnVja2V0OwotCXdoaWxlIChuZXh0cCAhPSBOVUxMKSB7Ci0JCWlmIChuZXh0cC0+YmNfYmxrbm8gPT0gYmxrbm8gJiYgbmV4dHAtPmJjX2xlbiA9PSBsZW4pIHsKLQkJCW5leHRwLT5iY19yZWZjb3VudCsrOworCWJ1Y2tldCA9IFhMT0dfQlVGX0NBTkNFTF9CVUNLRVQobG9nLCBidWZfZi0+YmxmX2Jsa25vKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGJjcCwgYnVja2V0LCBiY19saXN0KSB7CisJCWlmIChiY3AtPmJjX2Jsa25vID09IGJ1Zl9mLT5ibGZfYmxrbm8gJiYKKwkJICAgIGJjcC0+YmNfbGVuID09IGJ1Zl9mLT5ibGZfbGVuKSB7CisJCQliY3AtPmJjX3JlZmNvdW50Kys7CiAJCQl0cmFjZV94ZnNfbG9nX3JlY292ZXJfYnVmX2NhbmNlbF9yZWZfaW5jKGxvZywgYnVmX2YpOwotCQkJcmV0dXJuOworCQkJcmV0dXJuIDA7CiAJCX0KLQkJcHJldnAgPSBuZXh0cDsKLQkJbmV4dHAgPSBuZXh0cC0+YmNfbmV4dDsKIAl9Ci0JQVNTRVJUKHByZXZwICE9IE5VTEwpOwotCWJjcCA9ICh4ZnNfYnVmX2NhbmNlbF90ICopa21lbV9hbGxvYyhzaXplb2YoeGZzX2J1Zl9jYW5jZWxfdCksCi0JCQkJCSAgICAgS01fU0xFRVApOwotCWJjcC0+YmNfYmxrbm8gPSBibGtubzsKLQliY3AtPmJjX2xlbiA9IGxlbjsKKworCWJjcCA9IGttZW1fYWxsb2Moc2l6ZW9mKHN0cnVjdCB4ZnNfYnVmX2NhbmNlbCksIEtNX1NMRUVQKTsKKwliY3AtPmJjX2Jsa25vID0gYnVmX2YtPmJsZl9ibGtubzsKKwliY3AtPmJjX2xlbiA9IGJ1Zl9mLT5ibGZfbGVuOwogCWJjcC0+YmNfcmVmY291bnQgPSAxOwotCWJjcC0+YmNfbmV4dCA9IE5VTEw7Ci0JcHJldnAtPmJjX25leHQgPSBiY3A7CisJbGlzdF9hZGRfdGFpbCgmYmNwLT5iY19saXN0LCBidWNrZXQpOworCiAJdHJhY2VfeGZzX2xvZ19yZWNvdmVyX2J1Zl9jYW5jZWxfYWRkKGxvZywgYnVmX2YpOworCXJldHVybiAwOwogfQogCiAvKgpAQCAtMTY5OCwxNCArMTY3MCwxMyBAQAogICovCiBTVEFUSUMgaW50CiB4bG9nX2NoZWNrX2J1ZmZlcl9jYW5jZWxsZWQoCi0JeGxvZ190CQkJKmxvZywKKwlzdHJ1Y3QgbG9nCQkqbG9nLAogCXhmc19kYWRkcl90CQlibGtubywKIAl1aW50CQkJbGVuLAogCXVzaG9ydAkJCWZsYWdzKQogewotCXhmc19idWZfY2FuY2VsX3QJKmJjcDsKLQl4ZnNfYnVmX2NhbmNlbF90CSpwcmV2cDsKLQl4ZnNfYnVmX2NhbmNlbF90CSoqYnVja2V0OworCXN0cnVjdCBsaXN0X2hlYWQJKmJ1Y2tldDsKKwlzdHJ1Y3QgeGZzX2J1Zl9jYW5jZWwJKmJjcDsKIAogCWlmIChsb2ctPmxfYnVmX2NhbmNlbF90YWJsZSA9PSBOVUxMKSB7CiAJCS8qCkBAIC0xNzE2LDEyOCArMTY4Nyw3MCBAQAogCQlyZXR1cm4gMDsKIAl9CiAKLQlidWNrZXQgPSAmbG9nLT5sX2J1Zl9jYW5jZWxfdGFibGVbKF9fdWludDY0X3QpYmxrbm8gJQotCQkJCQkgIFhMT0dfQkNfVEFCTEVfU0laRV07Ci0JYmNwID0gKmJ1Y2tldDsKLQlpZiAoYmNwID09IE5VTEwpIHsKLQkJLyoKLQkJICogVGhlcmUgaXMgbm8gY29ycmVzcG9uZGluZyBlbnRyeSBpbiB0aGUgdGFibGUgYnVpbHQKLQkJICogaW4gcGFzcyBvbmUsIHNvIHRoaXMgYnVmZmVyIGhhcyBub3QgYmVlbiBjYW5jZWxsZWQuCi0JCSAqLwotCQlBU1NFUlQoIShmbGFncyAmIFhGU19CTEZfQ0FOQ0VMKSk7Ci0JCXJldHVybiAwOworCS8qCisJICogU2VhcmNoIGZvciBhbiBlbnRyeSBpbiB0aGUgIGNhbmNlbCB0YWJsZSB0aGF0IG1hdGNoZXMgb3VyIGJ1ZmZlci4KKwkgKi8KKwlidWNrZXQgPSBYTE9HX0JVRl9DQU5DRUxfQlVDS0VUKGxvZywgYmxrbm8pOworCWxpc3RfZm9yX2VhY2hfZW50cnkoYmNwLCBidWNrZXQsIGJjX2xpc3QpIHsKKwkJaWYgKGJjcC0+YmNfYmxrbm8gPT0gYmxrbm8gJiYgYmNwLT5iY19sZW4gPT0gbGVuKQorCQkJZ290byBmb3VuZDsKIAl9CiAKIAkvKgotCSAqIFNlYXJjaCBmb3IgYW4gZW50cnkgaW4gdGhlIGJ1ZmZlciBjYW5jZWwgdGFibGUgdGhhdAotCSAqIG1hdGNoZXMgb3VyIGJ1ZmZlci4KLQkgKi8KLQlwcmV2cCA9IE5VTEw7Ci0Jd2hpbGUgKGJjcCAhPSBOVUxMKSB7Ci0JCWlmIChiY3AtPmJjX2Jsa25vID09IGJsa25vICYmIGJjcC0+YmNfbGVuID09IGxlbikgewotCQkJLyoKLQkJCSAqIFdlJ3ZlIGdvIGEgbWF0Y2gsIHNvIHJldHVybiAxIHNvIHRoYXQgdGhlCi0JCQkgKiByZWNvdmVyeSBvZiB0aGlzIGJ1ZmZlciBpcyBjYW5jZWxsZWQuCi0JCQkgKiBJZiB0aGlzIGJ1ZmZlciBpcyBhY3R1YWxseSBhIGJ1ZmZlciBjYW5jZWwKLQkJCSAqIGxvZyBpdGVtLCB0aGVuIGRlY3JlbWVudCB0aGUgcmVmY291bnQgb24gdGhlCi0JCQkgKiBvbmUgaW4gdGhlIHRhYmxlIGFuZCByZW1vdmUgaXQgaWYgdGhpcyBpcyB0aGUKLQkJCSAqIGxhc3QgcmVmZXJlbmNlLgotCQkJICovCi0JCQlpZiAoZmxhZ3MgJiBYRlNfQkxGX0NBTkNFTCkgewotCQkJCWJjcC0+YmNfcmVmY291bnQtLTsKLQkJCQlpZiAoYmNwLT5iY19yZWZjb3VudCA9PSAwKSB7Ci0JCQkJCWlmIChwcmV2cCA9PSBOVUxMKSB7Ci0JCQkJCQkqYnVja2V0ID0gYmNwLT5iY19uZXh0OwotCQkJCQl9IGVsc2UgewotCQkJCQkJcHJldnAtPmJjX25leHQgPSBiY3AtPmJjX25leHQ7Ci0JCQkJCX0KLQkJCQkJa21lbV9mcmVlKGJjcCk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIDE7Ci0JCX0KLQkJcHJldnAgPSBiY3A7Ci0JCWJjcCA9IGJjcC0+YmNfbmV4dDsKLQl9Ci0JLyoKLQkgKiBXZSBkaWRuJ3QgZmluZCBhIGNvcnJlc3BvbmRpbmcgZW50cnkgaW4gdGhlIHRhYmxlLCBzbwotCSAqIHJldHVybiAwIHNvIHRoYXQgdGhlIGJ1ZmZlciBpcyBOT1QgY2FuY2VsbGVkLgorCSAqIFdlIGRpZG4ndCBmaW5kIGEgY29ycmVzcG9uZGluZyBlbnRyeSBpbiB0aGUgdGFibGUsIHNvIHJldHVybiAwIHNvCisJICogdGhhdCB0aGUgYnVmZmVyIGlzIE5PVCBjYW5jZWxsZWQuCiAJICovCiAJQVNTRVJUKCEoZmxhZ3MgJiBYRlNfQkxGX0NBTkNFTCkpOwogCXJldHVybiAwOwotfQogCi1TVEFUSUMgaW50Ci14bG9nX3JlY292ZXJfZG9fYnVmZmVyX3Bhc3MyKAotCXhsb2dfdAkJCSpsb2csCi0JeGZzX2J1Zl9sb2dfZm9ybWF0X3QJKmJ1Zl9mKQotewotCXhmc19kYWRkcl90CQlibGtubyA9IDA7Ci0JdXNob3J0CQkJZmxhZ3MgPSAwOwotCXVpbnQJCQlsZW4gPSAwOwotCi0Jc3dpdGNoIChidWZfZi0+YmxmX3R5cGUpIHsKLQljYXNlIFhGU19MSV9CVUY6Ci0JCWJsa25vID0gYnVmX2YtPmJsZl9ibGtubzsKLQkJZmxhZ3MgPSBidWZfZi0+YmxmX2ZsYWdzOwotCQlsZW4gPSBidWZfZi0+YmxmX2xlbjsKLQkJYnJlYWs7Citmb3VuZDoKKwkvKgorCSAqIFdlJ3ZlIGdvIGEgbWF0Y2gsIHNvIHJldHVybiAxIHNvIHRoYXQgdGhlIHJlY292ZXJ5IG9mIHRoaXMgYnVmZmVyCisJICogaXMgY2FuY2VsbGVkLiAgSWYgdGhpcyBidWZmZXIgaXMgYWN0dWFsbHkgYSBidWZmZXIgY2FuY2VsIGxvZworCSAqIGl0ZW0sIHRoZW4gZGVjcmVtZW50IHRoZSByZWZjb3VudCBvbiB0aGUgb25lIGluIHRoZSB0YWJsZSBhbmQKKwkgKiByZW1vdmUgaXQgaWYgdGhpcyBpcyB0aGUgbGFzdCByZWZlcmVuY2UuCisJICovCisJaWYgKGZsYWdzICYgWEZTX0JMRl9DQU5DRUwpIHsKKwkJaWYgKC0tYmNwLT5iY19yZWZjb3VudCA9PSAwKSB7CisJCQlsaXN0X2RlbCgmYmNwLT5iY19saXN0KTsKKwkJCWttZW1fZnJlZShiY3ApOworCQl9CiAJfQotCi0JcmV0dXJuIHhsb2dfY2hlY2tfYnVmZmVyX2NhbmNlbGxlZChsb2csIGJsa25vLCBsZW4sIGZsYWdzKTsKKwlyZXR1cm4gMTsKIH0KIAogLyoKLSAqIFBlcmZvcm0gcmVjb3ZlcnkgZm9yIGEgYnVmZmVyIGZ1bGwgb2YgaW5vZGVzLiAgSW4gdGhlc2UgYnVmZmVycywKLSAqIHRoZSBvbmx5IGRhdGEgd2hpY2ggc2hvdWxkIGJlIHJlY292ZXJlZCBpcyB0aGF0IHdoaWNoIGNvcnJlc3BvbmRzCi0gKiB0byB0aGUgZGlfbmV4dF91bmxpbmtlZCBwb2ludGVycyBpbiB0aGUgb24gZGlzayBpbm9kZSBzdHJ1Y3R1cmVzLgotICogVGhlIHJlc3Qgb2YgdGhlIGRhdGEgZm9yIHRoZSBpbm9kZXMgaXMgYWx3YXlzIGxvZ2dlZCB0aHJvdWdoIHRoZQotICogaW5vZGVzIHRoZW1zZWx2ZXMgcmF0aGVyIHRoYW4gdGhlIGlub2RlIGJ1ZmZlciBhbmQgaXMgcmVjb3ZlcmVkCi0gKiBpbiB4bG9nX3JlY292ZXJfZG9faW5vZGVfdHJhbnMoKS4KKyAqIFBlcmZvcm0gcmVjb3ZlcnkgZm9yIGEgYnVmZmVyIGZ1bGwgb2YgaW5vZGVzLiAgSW4gdGhlc2UgYnVmZmVycywgdGhlIG9ubHkKKyAqIGRhdGEgd2hpY2ggc2hvdWxkIGJlIHJlY292ZXJlZCBpcyB0aGF0IHdoaWNoIGNvcnJlc3BvbmRzIHRvIHRoZQorICogZGlfbmV4dF91bmxpbmtlZCBwb2ludGVycyBpbiB0aGUgb24gZGlzayBpbm9kZSBzdHJ1Y3R1cmVzLiAgVGhlIHJlc3Qgb2YgdGhlCisgKiBkYXRhIGZvciB0aGUgaW5vZGVzIGlzIGFsd2F5cyBsb2dnZWQgdGhyb3VnaCB0aGUgaW5vZGVzIHRoZW1zZWx2ZXMgcmF0aGVyCisgKiB0aGFuIHRoZSBpbm9kZSBidWZmZXIgYW5kIGlzIHJlY292ZXJlZCBpbiB4bG9nX3JlY292ZXJfaW5vZGVfcGFzczIoKS4KICAqCi0gKiBUaGUgb25seSB0aW1lIHdoZW4gYnVmZmVycyBmdWxsIG9mIGlub2RlcyBhcmUgZnVsbHkgcmVjb3ZlcmVkIGlzCi0gKiB3aGVuIHRoZSBidWZmZXIgaXMgZnVsbCBvZiBuZXdseSBhbGxvY2F0ZWQgaW5vZGVzLiAgSW4gdGhpcyBjYXNlCi0gKiB0aGUgYnVmZmVyIHdpbGwgbm90IGJlIG1hcmtlZCBhcyBhbiBpbm9kZSBidWZmZXIgYW5kIHNvIHdpbGwgYmUKLSAqIHNlbnQgdG8geGxvZ19yZWNvdmVyX2RvX3JlZ19idWZmZXIoKSBiZWxvdyBkdXJpbmcgcmVjb3ZlcnkuCisgKiBUaGUgb25seSB0aW1lIHdoZW4gYnVmZmVycyBmdWxsIG9mIGlub2RlcyBhcmUgZnVsbHkgcmVjb3ZlcmVkIGlzIHdoZW4gdGhlCisgKiBidWZmZXIgaXMgZnVsbCBvZiBuZXdseSBhbGxvY2F0ZWQgaW5vZGVzLiAgSW4gdGhpcyBjYXNlIHRoZSBidWZmZXIgd2lsbAorICogbm90IGJlIG1hcmtlZCBhcyBhbiBpbm9kZSBidWZmZXIgYW5kIHNvIHdpbGwgYmUgc2VudCB0bworICogeGxvZ19yZWNvdmVyX2RvX3JlZ19idWZmZXIoKSBiZWxvdyBkdXJpbmcgcmVjb3ZlcnkuCiAgKi8KIFNUQVRJQyBpbnQKIHhsb2dfcmVjb3Zlcl9kb19pbm9kZV9idWZmZXIoCi0JeGZzX21vdW50X3QJCSptcCwKKwlzdHJ1Y3QgeGZzX21vdW50CSptcCwKIAl4bG9nX3JlY292ZXJfaXRlbV90CSppdGVtLAotCXhmc19idWZfdAkJKmJwLAorCXN0cnVjdCB4ZnNfYnVmCQkqYnAsCiAJeGZzX2J1Zl9sb2dfZm9ybWF0X3QJKmJ1Zl9mKQogewogCWludAkJCWk7Ci0JaW50CQkJaXRlbV9pbmRleDsKLQlpbnQJCQliaXQ7Ci0JaW50CQkJbmJpdHM7Ci0JaW50CQkJcmVnX2J1Zl9vZmZzZXQ7Ci0JaW50CQkJcmVnX2J1Zl9ieXRlczsKKwlpbnQJCQlpdGVtX2luZGV4ID0gMDsKKwlpbnQJCQliaXQgPSAwOworCWludAkJCW5iaXRzID0gMDsKKwlpbnQJCQlyZWdfYnVmX29mZnNldCA9IDA7CisJaW50CQkJcmVnX2J1Zl9ieXRlcyA9IDA7CiAJaW50CQkJbmV4dF91bmxpbmtlZF9vZmZzZXQ7CiAJaW50CQkJaW5vZGVzX3Blcl9idWY7CiAJeGZzX2FnaW5vX3QJCSpsb2dnZWRfbmV4dHA7CiAJeGZzX2FnaW5vX3QJCSpidWZmZXJfbmV4dHA7Ci0JdW5zaWduZWQgaW50CQkqZGF0YV9tYXAgPSBOVUxMOwotCXVuc2lnbmVkIGludAkJbWFwX3NpemUgPSAwOwogCiAJdHJhY2VfeGZzX2xvZ19yZWNvdmVyX2J1Zl9pbm9kZV9idWYobXAtPm1fbG9nLCBidWZfZik7CiAKLQlzd2l0Y2ggKGJ1Zl9mLT5ibGZfdHlwZSkgewotCWNhc2UgWEZTX0xJX0JVRjoKLQkJZGF0YV9tYXAgPSBidWZfZi0+YmxmX2RhdGFfbWFwOwotCQltYXBfc2l6ZSA9IGJ1Zl9mLT5ibGZfbWFwX3NpemU7Ci0JCWJyZWFrOwotCX0KLQkvKgotCSAqIFNldCB0aGUgdmFyaWFibGVzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGN1cnJlbnQgcmVnaW9uIHRvCi0JICogMCBzbyB0aGF0IHdlJ2xsIGluaXRpYWxpemUgdGhlbSBvbiB0aGUgZmlyc3QgcGFzcyB0aHJvdWdoCi0JICogdGhlIGxvb3AuCi0JICovCi0JcmVnX2J1Zl9vZmZzZXQgPSAwOwotCXJlZ19idWZfYnl0ZXMgPSAwOwotCWJpdCA9IDA7Ci0JbmJpdHMgPSAwOwotCWl0ZW1faW5kZXggPSAwOwogCWlub2Rlc19wZXJfYnVmID0gWEZTX0JVRl9DT1VOVChicCkgPj4gbXAtPm1fc2Iuc2JfaW5vZGVsb2c7CiAJZm9yIChpID0gMDsgaSA8IGlub2Rlc19wZXJfYnVmOyBpKyspIHsKIAkJbmV4dF91bmxpbmtlZF9vZmZzZXQgPSAoaSAqIG1wLT5tX3NiLnNiX2lub2Rlc2l6ZSkgKwpAQCAtMTg1MiwxOCArMTc2NSwxOCBAQAogCQkJICogdGhlIGN1cnJlbnQgZGlfbmV4dF91bmxpbmtlZCBmaWVsZC4KIAkJCSAqLwogCQkJYml0ICs9IG5iaXRzOwotCQkJYml0ID0geGZzX25leHRfYml0KGRhdGFfbWFwLCBtYXBfc2l6ZSwgYml0KTsKKwkJCWJpdCA9IHhmc19uZXh0X2JpdChidWZfZi0+YmxmX2RhdGFfbWFwLAorCQkJCQkgICBidWZfZi0+YmxmX21hcF9zaXplLCBiaXQpOwogCiAJCQkvKgogCQkJICogSWYgdGhlcmUgYXJlIG5vIG1vcmUgbG9nZ2VkIHJlZ2lvbnMgaW4gdGhlCiAJCQkgKiBidWZmZXIsIHRoZW4gd2UncmUgZG9uZS4KIAkJCSAqLwotCQkJaWYgKGJpdCA9PSAtMSkgeworCQkJaWYgKGJpdCA9PSAtMSkKIAkJCQlyZXR1cm4gMDsKLQkJCX0KIAotCQkJbmJpdHMgPSB4ZnNfY29udGlnX2JpdHMoZGF0YV9tYXAsIG1hcF9zaXplLAotCQkJCQkJCSBiaXQpOworCQkJbmJpdHMgPSB4ZnNfY29udGlnX2JpdHMoYnVmX2YtPmJsZl9kYXRhX21hcCwKKwkJCQkJCWJ1Zl9mLT5ibGZfbWFwX3NpemUsIGJpdCk7CiAJCQlBU1NFUlQobmJpdHMgPiAwKTsKIAkJCXJlZ19idWZfb2Zmc2V0ID0gYml0IDw8IFhGU19CTEZfU0hJRlQ7CiAJCQlyZWdfYnVmX2J5dGVzID0gbmJpdHMgPDwgWEZTX0JMRl9TSElGVDsKQEAgLTE4NzUsOSArMTc4OCw4IEBACiAJCSAqIGRpX25leHRfdW5saW5rZWQgZmllbGQsIHRoZW4gbW92ZSBvbiB0byB0aGUgbmV4dAogCQkgKiBkaV9uZXh0X3VubGlua2VkIGZpZWxkLgogCQkgKi8KLQkJaWYgKG5leHRfdW5saW5rZWRfb2Zmc2V0IDwgcmVnX2J1Zl9vZmZzZXQpIHsKKwkJaWYgKG5leHRfdW5saW5rZWRfb2Zmc2V0IDwgcmVnX2J1Zl9vZmZzZXQpCiAJCQljb250aW51ZTsKLQkJfQogCiAJCUFTU0VSVChpdGVtLT5yaV9idWZbaXRlbV9pbmRleF0uaV9hZGRyICE9IE5VTEwpOwogCQlBU1NFUlQoKGl0ZW0tPnJpX2J1ZltpdGVtX2luZGV4XS5pX2xlbiAlIFhGU19CTEZfQ0hVTkspID09IDApOwpAQCAtMTkxMywzNiArMTgyNSwyOSBAQAogICogZ2l2ZW4gYnVmZmVyLiAgVGhlIGJpdG1hcCBpbiB0aGUgYnVmIGxvZyBmb3JtYXQgc3RydWN0dXJlIGluZGljYXRlcwogICogd2hlcmUgdG8gcGxhY2UgdGhlIGxvZ2dlZCBkYXRhLgogICovCi0vKkFSR1NVU0VEKi8KIFNUQVRJQyB2b2lkCiB4bG9nX3JlY292ZXJfZG9fcmVnX2J1ZmZlcigKIAlzdHJ1Y3QgeGZzX21vdW50CSptcCwKIAl4bG9nX3JlY292ZXJfaXRlbV90CSppdGVtLAotCXhmc19idWZfdAkJKmJwLAorCXN0cnVjdCB4ZnNfYnVmCQkqYnAsCiAJeGZzX2J1Zl9sb2dfZm9ybWF0X3QJKmJ1Zl9mKQogewogCWludAkJCWk7CiAJaW50CQkJYml0OwogCWludAkJCW5iaXRzOwotCXVuc2lnbmVkIGludAkJKmRhdGFfbWFwID0gTlVMTDsKLQl1bnNpZ25lZCBpbnQJCW1hcF9zaXplID0gMDsKIAlpbnQgICAgICAgICAgICAgICAgICAgICBlcnJvcjsKIAogCXRyYWNlX3hmc19sb2dfcmVjb3Zlcl9idWZfcmVnX2J1ZihtcC0+bV9sb2csIGJ1Zl9mKTsKIAotCXN3aXRjaCAoYnVmX2YtPmJsZl90eXBlKSB7Ci0JY2FzZSBYRlNfTElfQlVGOgotCQlkYXRhX21hcCA9IGJ1Zl9mLT5ibGZfZGF0YV9tYXA7Ci0JCW1hcF9zaXplID0gYnVmX2YtPmJsZl9tYXBfc2l6ZTsKLQkJYnJlYWs7Ci0JfQogCWJpdCA9IDA7CiAJaSA9IDE7ICAvKiAwIGlzIHRoZSBidWYgZm9ybWF0IHN0cnVjdHVyZSAqLwogCXdoaWxlICgxKSB7Ci0JCWJpdCA9IHhmc19uZXh0X2JpdChkYXRhX21hcCwgbWFwX3NpemUsIGJpdCk7CisJCWJpdCA9IHhmc19uZXh0X2JpdChidWZfZi0+YmxmX2RhdGFfbWFwLAorCQkJCSAgIGJ1Zl9mLT5ibGZfbWFwX3NpemUsIGJpdCk7CiAJCWlmIChiaXQgPT0gLTEpCiAJCQlicmVhazsKLQkJbmJpdHMgPSB4ZnNfY29udGlnX2JpdHMoZGF0YV9tYXAsIG1hcF9zaXplLCBiaXQpOworCQluYml0cyA9IHhmc19jb250aWdfYml0cyhidWZfZi0+YmxmX2RhdGFfbWFwLAorCQkJCQlidWZfZi0+YmxmX21hcF9zaXplLCBiaXQpOwogCQlBU1NFUlQobmJpdHMgPiAwKTsKIAkJQVNTRVJUKGl0ZW0tPnJpX2J1ZltpXS5pX2FkZHIgIT0gTlVMTCk7CiAJCUFTU0VSVChpdGVtLT5yaV9idWZbaV0uaV9sZW4gJSBYRlNfQkxGX0NIVU5LID09IDApOwpAQCAtMjE3Niw3NyArMjA4MSw0NiBAQAogICogZm9yIG1vcmUgZGV0YWlscyBvbiB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIHRhYmxlIG9mIGNhbmNlbCByZWNvcmRzLgogICovCiBTVEFUSUMgaW50Ci14bG9nX3JlY292ZXJfZG9fYnVmZmVyX3RyYW5zKAoreGxvZ19yZWNvdmVyX2J1ZmZlcl9wYXNzMigKIAl4bG9nX3QJCQkqbG9nLAotCXhsb2dfcmVjb3Zlcl9pdGVtX3QJKml0ZW0sCi0JaW50CQkJcGFzcykKKwl4bG9nX3JlY292ZXJfaXRlbV90CSppdGVtKQogewogCXhmc19idWZfbG9nX2Zvcm1hdF90CSpidWZfZiA9IGl0ZW0tPnJpX2J1ZlswXS5pX2FkZHI7Ci0JeGZzX21vdW50X3QJCSptcDsKKwl4ZnNfbW91bnRfdAkJKm1wID0gbG9nLT5sX21wOwogCXhmc19idWZfdAkJKmJwOwogCWludAkJCWVycm9yOwotCWludAkJCWNhbmNlbDsKLQl4ZnNfZGFkZHJfdAkJYmxrbm87Ci0JaW50CQkJbGVuOwotCXVzaG9ydAkJCWZsYWdzOwogCXVpbnQJCQlidWZfZmxhZ3M7CiAKLQlpZiAocGFzcyA9PSBYTE9HX1JFQ09WRVJfUEFTUzEpIHsKLQkJLyoKLQkJICogSW4gdGhpcyBwYXNzIHdlJ3JlIG9ubHkgbG9va2luZyBmb3IgYnVmIGl0ZW1zCi0JCSAqIHdpdGggdGhlIFhGU19CTEZfQ0FOQ0VMIGJpdCBzZXQuCi0JCSAqLwotCQl4bG9nX3JlY292ZXJfZG9fYnVmZmVyX3Bhc3MxKGxvZywgYnVmX2YpOworCS8qCisJICogSW4gdGhpcyBwYXNzIHdlIG9ubHkgd2FudCB0byByZWNvdmVyIGFsbCB0aGUgYnVmZmVycyB3aGljaCBoYXZlCisJICogbm90IGJlZW4gY2FuY2VsbGVkIGFuZCBhcmUgbm90IGNhbmNlbGxhdGlvbiBidWZmZXJzIHRoZW1zZWx2ZXMuCisJICovCisJaWYgKHhsb2dfY2hlY2tfYnVmZmVyX2NhbmNlbGxlZChsb2csIGJ1Zl9mLT5ibGZfYmxrbm8sCisJCQlidWZfZi0+YmxmX2xlbiwgYnVmX2YtPmJsZl9mbGFncykpIHsKKwkJdHJhY2VfeGZzX2xvZ19yZWNvdmVyX2J1Zl9jYW5jZWwobG9nLCBidWZfZik7CiAJCXJldHVybiAwOwotCX0gZWxzZSB7Ci0JCS8qCi0JCSAqIEluIHRoaXMgcGFzcyB3ZSB3YW50IHRvIHJlY292ZXIgYWxsIHRoZSBidWZmZXJzCi0JCSAqIHdoaWNoIGhhdmUgbm90IGJlZW4gY2FuY2VsbGVkIGFuZCBhcmUgbm90Ci0JCSAqIGNhbmNlbGxhdGlvbiBidWZmZXJzIHRoZW1zZWx2ZXMuICBUaGUgcm91dGluZQotCQkgKiB3ZSBjYWxsIGhlcmUgd2lsbCB0ZWxsIHVzIHdoZXRoZXIgb3Igbm90IHRvCi0JCSAqIGNvbnRpbnVlIHdpdGggdGhlIHJlcGxheSBvZiB0aGlzIGJ1ZmZlci4KLQkJICovCi0JCWNhbmNlbCA9IHhsb2dfcmVjb3Zlcl9kb19idWZmZXJfcGFzczIobG9nLCBidWZfZik7Ci0JCWlmIChjYW5jZWwpIHsKLQkJCXRyYWNlX3hmc19sb2dfcmVjb3Zlcl9idWZfY2FuY2VsKGxvZywgYnVmX2YpOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQl9Ci0JdHJhY2VfeGZzX2xvZ19yZWNvdmVyX2J1Zl9yZWNvdmVyKGxvZywgYnVmX2YpOwotCXN3aXRjaCAoYnVmX2YtPmJsZl90eXBlKSB7Ci0JY2FzZSBYRlNfTElfQlVGOgotCQlibGtubyA9IGJ1Zl9mLT5ibGZfYmxrbm87Ci0JCWxlbiA9IGJ1Zl9mLT5ibGZfbGVuOwotCQlmbGFncyA9IGJ1Zl9mLT5ibGZfZmxhZ3M7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXhmc19mc19jbW5fZXJyKENFX0FMRVJULCBsb2ctPmxfbXAsCi0JCQkieGZzX2xvZ19yZWNvdmVyOiB1bmtub3duIGJ1ZmZlciB0eXBlIDB4JXgsIGxvZ2RldiAlcyIsCi0JCQlidWZfZi0+YmxmX3R5cGUsIGxvZy0+bF9tcC0+bV9sb2duYW1lID8KLQkJCWxvZy0+bF9tcC0+bV9sb2duYW1lIDogImludGVybmFsIik7Ci0JCVhGU19FUlJPUl9SRVBPUlQoInhsb2dfcmVjb3Zlcl9kb19idWZmZXJfdHJhbnMiLAotCQkJCSBYRlNfRVJSTEVWRUxfTE9XLCBsb2ctPmxfbXApOwotCQlyZXR1cm4gWEZTX0VSUk9SKEVGU0NPUlJVUFRFRCk7CiAJfQogCi0JbXAgPSBsb2ctPmxfbXA7CisJdHJhY2VfeGZzX2xvZ19yZWNvdmVyX2J1Zl9yZWNvdmVyKGxvZywgYnVmX2YpOworCiAJYnVmX2ZsYWdzID0gWEJGX0xPQ0s7Ci0JaWYgKCEoZmxhZ3MgJiBYRlNfQkxGX0lOT0RFX0JVRikpCisJaWYgKCEoYnVmX2YtPmJsZl9mbGFncyAmIFhGU19CTEZfSU5PREVfQlVGKSkKIAkJYnVmX2ZsYWdzIHw9IFhCRl9NQVBQRUQ7CiAKLQlicCA9IHhmc19idWZfcmVhZChtcC0+bV9kZGV2X3RhcmdwLCBibGtubywgbGVuLCBidWZfZmxhZ3MpOworCWJwID0geGZzX2J1Zl9yZWFkKG1wLT5tX2RkZXZfdGFyZ3AsIGJ1Zl9mLT5ibGZfYmxrbm8sIGJ1Zl9mLT5ibGZfbGVuLAorCQkJICBidWZfZmxhZ3MpOwogCWlmIChYRlNfQlVGX0lTRVJST1IoYnApKSB7Ci0JCXhmc19pb2Vycm9yX2FsZXJ0KCJ4bG9nX3JlY292ZXJfZG8uLihyZWFkIzEpIiwgbG9nLT5sX21wLAotCQkJCSAgYnAsIGJsa25vKTsKKwkJeGZzX2lvZXJyb3JfYWxlcnQoInhsb2dfcmVjb3Zlcl9kby4uKHJlYWQjMSkiLCBtcCwKKwkJCQkgIGJwLCBidWZfZi0+YmxmX2Jsa25vKTsKIAkJZXJyb3IgPSBYRlNfQlVGX0dFVEVSUk9SKGJwKTsKIAkJeGZzX2J1Zl9yZWxzZShicCk7CiAJCXJldHVybiBlcnJvcjsKIAl9CiAKIAllcnJvciA9IDA7Ci0JaWYgKGZsYWdzICYgWEZTX0JMRl9JTk9ERV9CVUYpIHsKKwlpZiAoYnVmX2YtPmJsZl9mbGFncyAmIFhGU19CTEZfSU5PREVfQlVGKSB7CiAJCWVycm9yID0geGxvZ19yZWNvdmVyX2RvX2lub2RlX2J1ZmZlcihtcCwgaXRlbSwgYnAsIGJ1Zl9mKTsKLQl9IGVsc2UgaWYgKGZsYWdzICYKKwl9IGVsc2UgaWYgKGJ1Zl9mLT5ibGZfZmxhZ3MgJgogCQkgIChYRlNfQkxGX1VEUVVPVF9CVUZ8WEZTX0JMRl9QRFFVT1RfQlVGfFhGU19CTEZfR0RRVU9UX0JVRikpIHsKIAkJeGxvZ19yZWNvdmVyX2RvX2RxdW90X2J1ZmZlcihtcCwgbG9nLCBpdGVtLCBicCwgYnVmX2YpOwogCX0gZWxzZSB7CkBAIC0yMjg2LDE2ICsyMTYwLDE0IEBACiB9CiAKIFNUQVRJQyBpbnQKLXhsb2dfcmVjb3Zlcl9kb19pbm9kZV90cmFucygKK3hsb2dfcmVjb3Zlcl9pbm9kZV9wYXNzMigKIAl4bG9nX3QJCQkqbG9nLAotCXhsb2dfcmVjb3Zlcl9pdGVtX3QJKml0ZW0sCi0JaW50CQkJcGFzcykKKwl4bG9nX3JlY292ZXJfaXRlbV90CSppdGVtKQogewogCXhmc19pbm9kZV9sb2dfZm9ybWF0X3QJKmluX2Y7Ci0JeGZzX21vdW50X3QJCSptcDsKKwl4ZnNfbW91bnRfdAkJKm1wID0gbG9nLT5sX21wOwogCXhmc19idWZfdAkJKmJwOwogCXhmc19kaW5vZGVfdAkJKmRpcDsKLQl4ZnNfaW5vX3QJCWlubzsKIAlpbnQJCQlsZW47CiAJeGZzX2NhZGRyX3QJCXNyYzsKIAl4ZnNfY2FkZHJfdAkJZGVzdDsKQEAgLTIzMDUsMTAgKzIxNzcsNiBAQAogCXhmc19pY2Rpbm9kZV90CQkqZGljcDsKIAlpbnQJCQluZWVkX2ZyZWUgPSAwOwogCi0JaWYgKHBhc3MgPT0gWExPR19SRUNPVkVSX1BBU1MxKSB7Ci0JCXJldHVybiAwOwotCX0KLQogCWlmIChpdGVtLT5yaV9idWZbMF0uaV9sZW4gPT0gc2l6ZW9mKHhmc19pbm9kZV9sb2dfZm9ybWF0X3QpKSB7CiAJCWluX2YgPSBpdGVtLT5yaV9idWZbMF0uaV9hZGRyOwogCX0gZWxzZSB7CkBAIC0yMzE4LDggKzIxODYsNiBAQAogCQlpZiAoZXJyb3IpCiAJCQlnb3RvIGVycm9yOwogCX0KLQlpbm8gPSBpbl9mLT5pbGZfaW5vOwotCW1wID0gbG9nLT5sX21wOwogCiAJLyoKIAkgKiBJbm9kZSBidWZmZXJzIGNhbiBiZSBmcmVlZCwgbG9vayBvdXQgZm9yIGl0LApAQCAtMjM1NCw4ICsyMjIwLDggQEAKIAkJeGZzX2J1Zl9yZWxzZShicCk7CiAJCXhmc19mc19jbW5fZXJyKENFX0FMRVJULCBtcCwKIAkJCSJ4ZnNfaW5vZGVfcmVjb3ZlcjogQmFkIGlub2RlIG1hZ2ljIG51bWJlciwgZGlubyBwdHIgPSAweCVwLCBkaW5vIGJwID0gMHglcCwgaW5vID0gJUxkIiwKLQkJCWRpcCwgYnAsIGlubyk7Ci0JCVhGU19FUlJPUl9SRVBPUlQoInhsb2dfcmVjb3Zlcl9kb19pbm9kZV90cmFucygxKSIsCisJCQlkaXAsIGJwLCBpbl9mLT5pbGZfaW5vKTsKKwkJWEZTX0VSUk9SX1JFUE9SVCgieGxvZ19yZWNvdmVyX2lub2RlX3Bhc3MyKDEpIiwKIAkJCQkgWEZTX0VSUkxFVkVMX0xPVywgbXApOwogCQllcnJvciA9IEVGU0NPUlJVUFRFRDsKIAkJZ290byBlcnJvcjsKQEAgLTIzNjUsOCArMjIzMSw4IEBACiAJCXhmc19idWZfcmVsc2UoYnApOwogCQl4ZnNfZnNfY21uX2VycihDRV9BTEVSVCwgbXAsCiAJCQkieGZzX2lub2RlX3JlY292ZXI6IEJhZCBpbm9kZSBsb2cgcmVjb3JkLCByZWMgcHRyIDB4JXAsIGlubyAlTGQiLAotCQkJaXRlbSwgaW5vKTsKLQkJWEZTX0VSUk9SX1JFUE9SVCgieGxvZ19yZWNvdmVyX2RvX2lub2RlX3RyYW5zKDIpIiwKKwkJCWl0ZW0sIGluX2YtPmlsZl9pbm8pOworCQlYRlNfRVJST1JfUkVQT1JUKCJ4bG9nX3JlY292ZXJfaW5vZGVfcGFzczIoMikiLAogCQkJCSBYRlNfRVJSTEVWRUxfTE9XLCBtcCk7CiAJCWVycm9yID0gRUZTQ09SUlVQVEVEOwogCQlnb3RvIGVycm9yOwpAQCAtMjM5NCwxMiArMjI2MCwxMiBAQAogCWlmICh1bmxpa2VseSgoZGljcC0+ZGlfbW9kZSAmIFNfSUZNVCkgPT0gU19JRlJFRykpIHsKIAkJaWYgKChkaWNwLT5kaV9mb3JtYXQgIT0gWEZTX0RJTk9ERV9GTVRfRVhURU5UUykgJiYKIAkJICAgIChkaWNwLT5kaV9mb3JtYXQgIT0gWEZTX0RJTk9ERV9GTVRfQlRSRUUpKSB7Ci0JCQlYRlNfQ09SUlVQVElPTl9FUlJPUigieGxvZ19yZWNvdmVyX2RvX2lub2RlX3RyYW5zKDMpIiwKKwkJCVhGU19DT1JSVVBUSU9OX0VSUk9SKCJ4bG9nX3JlY292ZXJfaW5vZGVfcGFzczIoMykiLAogCQkJCQkgWEZTX0VSUkxFVkVMX0xPVywgbXAsIGRpY3ApOwogCQkJeGZzX2J1Zl9yZWxzZShicCk7CiAJCQl4ZnNfZnNfY21uX2VycihDRV9BTEVSVCwgbXAsCiAJCQkJInhmc19pbm9kZV9yZWNvdmVyOiBCYWQgcmVndWxhciBpbm9kZSBsb2cgcmVjb3JkLCByZWMgcHRyIDB4JXAsIGlubyBwdHIgPSAweCVwLCBpbm8gYnAgPSAweCVwLCBpbm8gJUxkIiwKLQkJCQlpdGVtLCBkaXAsIGJwLCBpbm8pOworCQkJCWl0ZW0sIGRpcCwgYnAsIGluX2YtPmlsZl9pbm8pOwogCQkJZXJyb3IgPSBFRlNDT1JSVVBURUQ7CiAJCQlnb3RvIGVycm9yOwogCQl9CkBAIC0yNDA3LDQwICsyMjczLDQwIEBACiAJCWlmICgoZGljcC0+ZGlfZm9ybWF0ICE9IFhGU19ESU5PREVfRk1UX0VYVEVOVFMpICYmCiAJCSAgICAoZGljcC0+ZGlfZm9ybWF0ICE9IFhGU19ESU5PREVfRk1UX0JUUkVFKSAmJgogCQkgICAgKGRpY3AtPmRpX2Zvcm1hdCAhPSBYRlNfRElOT0RFX0ZNVF9MT0NBTCkpIHsKLQkJCVhGU19DT1JSVVBUSU9OX0VSUk9SKCJ4bG9nX3JlY292ZXJfZG9faW5vZGVfdHJhbnMoNCkiLAorCQkJWEZTX0NPUlJVUFRJT05fRVJST1IoInhsb2dfcmVjb3Zlcl9pbm9kZV9wYXNzMig0KSIsCiAJCQkJCSAgICAgWEZTX0VSUkxFVkVMX0xPVywgbXAsIGRpY3ApOwogCQkJeGZzX2J1Zl9yZWxzZShicCk7CiAJCQl4ZnNfZnNfY21uX2VycihDRV9BTEVSVCwgbXAsCiAJCQkJInhmc19pbm9kZV9yZWNvdmVyOiBCYWQgZGlyIGlub2RlIGxvZyByZWNvcmQsIHJlYyBwdHIgMHglcCwgaW5vIHB0ciA9IDB4JXAsIGlubyBicCA9IDB4JXAsIGlubyAlTGQiLAotCQkJCWl0ZW0sIGRpcCwgYnAsIGlubyk7CisJCQkJaXRlbSwgZGlwLCBicCwgaW5fZi0+aWxmX2lubyk7CiAJCQllcnJvciA9IEVGU0NPUlJVUFRFRDsKIAkJCWdvdG8gZXJyb3I7CiAJCX0KIAl9CiAJaWYgKHVubGlrZWx5KGRpY3AtPmRpX25leHRlbnRzICsgZGljcC0+ZGlfYW5leHRlbnRzID4gZGljcC0+ZGlfbmJsb2NrcykpewotCQlYRlNfQ09SUlVQVElPTl9FUlJPUigieGxvZ19yZWNvdmVyX2RvX2lub2RlX3RyYW5zKDUpIiwKKwkJWEZTX0NPUlJVUFRJT05fRVJST1IoInhsb2dfcmVjb3Zlcl9pbm9kZV9wYXNzMig1KSIsCiAJCQkJICAgICBYRlNfRVJSTEVWRUxfTE9XLCBtcCwgZGljcCk7CiAJCXhmc19idWZfcmVsc2UoYnApOwogCQl4ZnNfZnNfY21uX2VycihDRV9BTEVSVCwgbXAsCiAJCQkieGZzX2lub2RlX3JlY292ZXI6IEJhZCBpbm9kZSBsb2cgcmVjb3JkLCByZWMgcHRyIDB4JXAsIGRpbm8gcHRyIDB4JXAsIGRpbm8gYnAgMHglcCwgaW5vICVMZCwgdG90YWwgZXh0ZW50cyA9ICVkLCBuYmxvY2tzID0gJUxkIiwKLQkJCWl0ZW0sIGRpcCwgYnAsIGlubywKKwkJCWl0ZW0sIGRpcCwgYnAsIGluX2YtPmlsZl9pbm8sCiAJCQlkaWNwLT5kaV9uZXh0ZW50cyArIGRpY3AtPmRpX2FuZXh0ZW50cywKIAkJCWRpY3AtPmRpX25ibG9ja3MpOwogCQllcnJvciA9IEVGU0NPUlJVUFRFRDsKIAkJZ290byBlcnJvcjsKIAl9CiAJaWYgKHVubGlrZWx5KGRpY3AtPmRpX2ZvcmtvZmYgPiBtcC0+bV9zYi5zYl9pbm9kZXNpemUpKSB7Ci0JCVhGU19DT1JSVVBUSU9OX0VSUk9SKCJ4bG9nX3JlY292ZXJfZG9faW5vZGVfdHJhbnMoNikiLAorCQlYRlNfQ09SUlVQVElPTl9FUlJPUigieGxvZ19yZWNvdmVyX2lub2RlX3Bhc3MyKDYpIiwKIAkJCQkgICAgIFhGU19FUlJMRVZFTF9MT1csIG1wLCBkaWNwKTsKIAkJeGZzX2J1Zl9yZWxzZShicCk7CiAJCXhmc19mc19jbW5fZXJyKENFX0FMRVJULCBtcCwKIAkJCSJ4ZnNfaW5vZGVfcmVjb3ZlcjogQmFkIGlub2RlIGxvZyByZWMgcHRyIDB4JXAsIGRpbm8gcHRyIDB4JXAsIGRpbm8gYnAgMHglcCwgaW5vICVMZCwgZm9ya29mZiAweCV4IiwKLQkJCWl0ZW0sIGRpcCwgYnAsIGlubywgZGljcC0+ZGlfZm9ya29mZik7CisJCQlpdGVtLCBkaXAsIGJwLCBpbl9mLT5pbGZfaW5vLCBkaWNwLT5kaV9mb3Jrb2ZmKTsKIAkJZXJyb3IgPSBFRlNDT1JSVVBURUQ7CiAJCWdvdG8gZXJyb3I7CiAJfQogCWlmICh1bmxpa2VseShpdGVtLT5yaV9idWZbMV0uaV9sZW4gPiBzaXplb2Yoc3RydWN0IHhmc19pY2Rpbm9kZSkpKSB7Ci0JCVhGU19DT1JSVVBUSU9OX0VSUk9SKCJ4bG9nX3JlY292ZXJfZG9faW5vZGVfdHJhbnMoNykiLAorCQlYRlNfQ09SUlVQVElPTl9FUlJPUigieGxvZ19yZWNvdmVyX2lub2RlX3Bhc3MyKDcpIiwKIAkJCQkgICAgIFhGU19FUlJMRVZFTF9MT1csIG1wLCBkaWNwKTsKIAkJeGZzX2J1Zl9yZWxzZShicCk7CiAJCXhmc19mc19jbW5fZXJyKENFX0FMRVJULCBtcCwKQEAgLTI1MzIsNyArMjM5OCw3IEBACiAJCQlicmVhazsKIAogCQlkZWZhdWx0OgotCQkJeGxvZ193YXJuKCJYRlM6IHhsb2dfcmVjb3Zlcl9kb19pbm9kZV90cmFuczogSW52YWxpZCBmbGFnIik7CisJCQl4bG9nX3dhcm4oIlhGUzogeGxvZ19yZWNvdmVyX2lub2RlX3Bhc3MyOiBJbnZhbGlkIGZsYWciKTsKIAkJCUFTU0VSVCgwKTsKIAkJCXhmc19idWZfcmVsc2UoYnApOwogCQkJZXJyb3IgPSBFSU87CkBAIC0yNTU2LDE4ICsyNDIyLDExIEBACiAgKiBvZiB0aGF0IHR5cGUuCiAgKi8KIFNUQVRJQyBpbnQKLXhsb2dfcmVjb3Zlcl9kb19xdW90YW9mZl90cmFucygKK3hsb2dfcmVjb3Zlcl9xdW90YW9mZl9wYXNzMSgKIAl4bG9nX3QJCQkqbG9nLAotCXhsb2dfcmVjb3Zlcl9pdGVtX3QJKml0ZW0sCi0JaW50CQkJcGFzcykKKwl4bG9nX3JlY292ZXJfaXRlbV90CSppdGVtKQogewotCXhmc19xb2ZmX2xvZ2Zvcm1hdF90CSpxb2ZmX2Y7Ci0KLQlpZiAocGFzcyA9PSBYTE9HX1JFQ09WRVJfUEFTUzIpIHsKLQkJcmV0dXJuICgwKTsKLQl9Ci0KLQlxb2ZmX2YgPSBpdGVtLT5yaV9idWZbMF0uaV9hZGRyOworCXhmc19xb2ZmX2xvZ2Zvcm1hdF90CSpxb2ZmX2YgPSBpdGVtLT5yaV9idWZbMF0uaV9hZGRyOwogCUFTU0VSVChxb2ZmX2YpOwogCiAJLyoKQEAgLTI1ODgsMjIgKzI0NDcsMTcgQEAKICAqIFJlY292ZXIgYSBkcXVvdCByZWNvcmQKICAqLwogU1RBVElDIGludAoteGxvZ19yZWNvdmVyX2RvX2RxdW90X3RyYW5zKAoreGxvZ19yZWNvdmVyX2RxdW90X3Bhc3MyKAogCXhsb2dfdAkJCSpsb2csCi0JeGxvZ19yZWNvdmVyX2l0ZW1fdAkqaXRlbSwKLQlpbnQJCQlwYXNzKQorCXhsb2dfcmVjb3Zlcl9pdGVtX3QJKml0ZW0pCiB7Ci0JeGZzX21vdW50X3QJCSptcDsKKwl4ZnNfbW91bnRfdAkJKm1wID0gbG9nLT5sX21wOwogCXhmc19idWZfdAkJKmJwOwogCXN0cnVjdCB4ZnNfZGlza19kcXVvdAkqZGRxLCAqcmVjZGRxOwogCWludAkJCWVycm9yOwogCXhmc19kcV9sb2dmb3JtYXRfdAkqZHFfZjsKIAl1aW50CQkJdHlwZTsKIAotCWlmIChwYXNzID09IFhMT0dfUkVDT1ZFUl9QQVNTMSkgewotCQlyZXR1cm4gMDsKLQl9Ci0JbXAgPSBsb2ctPmxfbXA7CiAKIAkvKgogCSAqIEZpbGVzeXN0ZW1zIGFyZSByZXF1aXJlZCB0byBzZW5kIGluIHF1b3RhIGZsYWdzIGF0IG1vdW50IHRpbWUuCkBAIC0yNjQ3LDcgKzI1MDEsNyBAQAogCWlmICgoZXJyb3IgPSB4ZnNfcW1fZHFjaGVjayhyZWNkZHEsCiAJCQkgICBkcV9mLT5xbGZfaWQsCiAJCQkgICAwLCBYRlNfUU1PUFRfRE9XQVJOLAotCQkJICAgInhsb2dfcmVjb3Zlcl9kb19kcXVvdF90cmFucyAobG9nIGNvcHkpIikpKSB7CisJCQkgICAieGxvZ19yZWNvdmVyX2RxdW90X3Bhc3MyIChsb2cgY29weSkiKSkpIHsKIAkJcmV0dXJuIFhGU19FUlJPUihFSU8pOwogCX0KIAlBU1NFUlQoZHFfZi0+cWxmX2xlbiA9PSAxKTsKQEAgLTI2NzAsNyArMjUyNCw3IEBACiAJICogbWluaW1hbCBpbml0aWFsaXphdGlvbiB0aGVuLgogCSAqLwogCWlmICh4ZnNfcW1fZHFjaGVjayhkZHEsIGRxX2YtPnFsZl9pZCwgMCwgWEZTX1FNT1BUX0RPV0FSTiwKLQkJCSAgICJ4bG9nX3JlY292ZXJfZG9fZHF1b3RfdHJhbnMiKSkgeworCQkJICAgInhsb2dfcmVjb3Zlcl9kcXVvdF9wYXNzMiIpKSB7CiAJCXhmc19idWZfcmVsc2UoYnApOwogCQlyZXR1cm4gWEZTX0VSUk9SKEVJTyk7CiAJfQpAQCAtMjY5MywzOCArMjU0NywzMSBAQAogICogTFNOLgogICovCiBTVEFUSUMgaW50Ci14bG9nX3JlY292ZXJfZG9fZWZpX3RyYW5zKAoreGxvZ19yZWNvdmVyX2VmaV9wYXNzMigKIAl4bG9nX3QJCQkqbG9nLAogCXhsb2dfcmVjb3Zlcl9pdGVtX3QJKml0ZW0sCi0JeGZzX2xzbl90CQlsc24sCi0JaW50CQkJcGFzcykKKwl4ZnNfbHNuX3QJCWxzbikKIHsKIAlpbnQJCQllcnJvcjsKLQl4ZnNfbW91bnRfdAkJKm1wOworCXhmc19tb3VudF90CQkqbXAgPSBsb2ctPmxfbXA7CiAJeGZzX2VmaV9sb2dfaXRlbV90CSplZmlwOwogCXhmc19lZmlfbG9nX2Zvcm1hdF90CSplZmlfZm9ybWF0cDsKIAotCWlmIChwYXNzID09IFhMT0dfUkVDT1ZFUl9QQVNTMSkgewotCQlyZXR1cm4gMDsKLQl9Ci0KIAllZmlfZm9ybWF0cCA9IGl0ZW0tPnJpX2J1ZlswXS5pX2FkZHI7CiAKLQltcCA9IGxvZy0+bF9tcDsKIAllZmlwID0geGZzX2VmaV9pbml0KG1wLCBlZmlfZm9ybWF0cC0+ZWZpX25leHRlbnRzKTsKIAlpZiAoKGVycm9yID0geGZzX2VmaV9jb3B5X2Zvcm1hdCgmKGl0ZW0tPnJpX2J1ZlswXSksCiAJCQkJCSAmKGVmaXAtPmVmaV9mb3JtYXQpKSkpIHsKIAkJeGZzX2VmaV9pdGVtX2ZyZWUoZWZpcCk7CiAJCXJldHVybiBlcnJvcjsKIAl9Ci0JZWZpcC0+ZWZpX25leHRfZXh0ZW50ID0gZWZpX2Zvcm1hdHAtPmVmaV9uZXh0ZW50czsKLQllZmlwLT5lZmlfZmxhZ3MgfD0gWEZTX0VGSV9DT01NSVRURUQ7CisJYXRvbWljX3NldCgmZWZpcC0+ZWZpX25leHRfZXh0ZW50LCBlZmlfZm9ybWF0cC0+ZWZpX25leHRlbnRzKTsKIAogCXNwaW5fbG9jaygmbG9nLT5sX2FpbHAtPnhhX2xvY2spOwogCS8qCiAJICogeGZzX3RyYW5zX2FpbF91cGRhdGUoKSBkcm9wcyB0aGUgQUlMIGxvY2suCiAJICovCi0JeGZzX3RyYW5zX2FpbF91cGRhdGUobG9nLT5sX2FpbHAsICh4ZnNfbG9nX2l0ZW1fdCAqKWVmaXAsIGxzbik7CisJeGZzX3RyYW5zX2FpbF91cGRhdGUobG9nLT5sX2FpbHAsICZlZmlwLT5lZmlfaXRlbSwgbHNuKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMjczNywxMSArMjU4NCwxMCBAQAogICogZWZkIGZvcm1hdCBzdHJ1Y3R1cmUuICBJZiB3ZSBmaW5kIGl0LCB3ZSByZW1vdmUgdGhlIGVmaSBmcm9tIHRoZQogICogQUlMIGFuZCBmcmVlIGl0LgogICovCi1TVEFUSUMgdm9pZAoteGxvZ19yZWNvdmVyX2RvX2VmZF90cmFucygKK1NUQVRJQyBpbnQKK3hsb2dfcmVjb3Zlcl9lZmRfcGFzczIoCiAJeGxvZ190CQkJKmxvZywKLQl4bG9nX3JlY292ZXJfaXRlbV90CSppdGVtLAotCWludAkJCXBhc3MpCisJeGxvZ19yZWNvdmVyX2l0ZW1fdAkqaXRlbSkKIHsKIAl4ZnNfZWZkX2xvZ19mb3JtYXRfdAkqZWZkX2Zvcm1hdHA7CiAJeGZzX2VmaV9sb2dfaXRlbV90CSplZmlwID0gTlVMTDsKQEAgLTI3NTAsMTAgKzI1OTYsNiBAQAogCXN0cnVjdCB4ZnNfYWlsX2N1cnNvcgljdXI7CiAJc3RydWN0IHhmc19haWwJCSphaWxwID0gbG9nLT5sX2FpbHA7CiAKLQlpZiAocGFzcyA9PSBYTE9HX1JFQ09WRVJfUEFTUzEpIHsKLQkJcmV0dXJuOwotCX0KLQogCWVmZF9mb3JtYXRwID0gaXRlbS0+cmlfYnVmWzBdLmlfYWRkcjsKIAlBU1NFUlQoKGl0ZW0tPnJpX2J1ZlswXS5pX2xlbiA9PSAoc2l6ZW9mKHhmc19lZmRfbG9nX2Zvcm1hdF8zMl90KSArCiAJCSgoZWZkX2Zvcm1hdHAtPmVmZF9uZXh0ZW50cyAtIDEpICogc2l6ZW9mKHhmc19leHRlbnRfMzJfdCkpKSkgfHwKQEAgLTI3ODUsNjIgKzI2MjcsNiBAQAogCX0KIAl4ZnNfdHJhbnNfYWlsX2N1cnNvcl9kb25lKGFpbHAsICZjdXIpOwogCXNwaW5fdW5sb2NrKCZhaWxwLT54YV9sb2NrKTsKLX0KLQotLyoKLSAqIFBlcmZvcm0gdGhlIHRyYW5zYWN0aW9uCi0gKgotICogSWYgdGhlIHRyYW5zYWN0aW9uIG1vZGlmaWVzIGEgYnVmZmVyIG9yIGlub2RlLCBkbyBpdCBub3cuICBPdGhlcndpc2UsCi0gKiBFRklzIGFuZCBFRkRzIGdldCBxdWV1ZWQgdXAgYnkgYWRkaW5nIGVudHJpZXMgaW50byB0aGUgQUlMIGZvciB0aGVtLgotICovCi1TVEFUSUMgaW50Ci14bG9nX3JlY292ZXJfZG9fdHJhbnMoCi0JeGxvZ190CQkJKmxvZywKLQl4bG9nX3JlY292ZXJfdAkJKnRyYW5zLAotCWludAkJCXBhc3MpCi17Ci0JaW50CQkJZXJyb3IgPSAwOwotCXhsb2dfcmVjb3Zlcl9pdGVtX3QJKml0ZW07Ci0KLQllcnJvciA9IHhsb2dfcmVjb3Zlcl9yZW9yZGVyX3RyYW5zKGxvZywgdHJhbnMsIHBhc3MpOwotCWlmIChlcnJvcikKLQkJcmV0dXJuIGVycm9yOwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShpdGVtLCAmdHJhbnMtPnJfaXRlbXEsIHJpX2xpc3QpIHsKLQkJdHJhY2VfeGZzX2xvZ19yZWNvdmVyX2l0ZW1fcmVjb3Zlcihsb2csIHRyYW5zLCBpdGVtLCBwYXNzKTsKLQkJc3dpdGNoIChJVEVNX1RZUEUoaXRlbSkpIHsKLQkJY2FzZSBYRlNfTElfQlVGOgotCQkJZXJyb3IgPSB4bG9nX3JlY292ZXJfZG9fYnVmZmVyX3RyYW5zKGxvZywgaXRlbSwgcGFzcyk7Ci0JCQlicmVhazsKLQkJY2FzZSBYRlNfTElfSU5PREU6Ci0JCQllcnJvciA9IHhsb2dfcmVjb3Zlcl9kb19pbm9kZV90cmFucyhsb2csIGl0ZW0sIHBhc3MpOwotCQkJYnJlYWs7Ci0JCWNhc2UgWEZTX0xJX0VGSToKLQkJCWVycm9yID0geGxvZ19yZWNvdmVyX2RvX2VmaV90cmFucyhsb2csIGl0ZW0sCi0JCQkJCQkJICB0cmFucy0+cl9sc24sIHBhc3MpOwotCQkJYnJlYWs7Ci0JCWNhc2UgWEZTX0xJX0VGRDoKLQkJCXhsb2dfcmVjb3Zlcl9kb19lZmRfdHJhbnMobG9nLCBpdGVtLCBwYXNzKTsKLQkJCWVycm9yID0gMDsKLQkJCWJyZWFrOwotCQljYXNlIFhGU19MSV9EUVVPVDoKLQkJCWVycm9yID0geGxvZ19yZWNvdmVyX2RvX2RxdW90X3RyYW5zKGxvZywgaXRlbSwgcGFzcyk7Ci0JCQlicmVhazsKLQkJY2FzZSBYRlNfTElfUVVPVEFPRkY6Ci0JCQllcnJvciA9IHhsb2dfcmVjb3Zlcl9kb19xdW90YW9mZl90cmFucyhsb2csIGl0ZW0sCi0JCQkJCQkJICAgICAgIHBhc3MpOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQl4bG9nX3dhcm4oCi0JIlhGUzogaW52YWxpZCBpdGVtIHR5cGUgKCVkKSB4bG9nX3JlY292ZXJfZG9fdHJhbnMiLCBJVEVNX1RZUEUoaXRlbSkpOwotCQkJQVNTRVJUKDApOwotCQkJZXJyb3IgPSBYRlNfRVJST1IoRUlPKTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJaWYgKGVycm9yKQotCQkJcmV0dXJuIGVycm9yOwotCX0KIAogCXJldHVybiAwOwogfQpAQCAtMjg1Miw3ICsyNjM4LDcgQEAKICAqLwogU1RBVElDIHZvaWQKIHhsb2dfcmVjb3Zlcl9mcmVlX3RyYW5zKAotCXhsb2dfcmVjb3Zlcl90CQkqdHJhbnMpCisJc3RydWN0IHhsb2dfcmVjb3ZlcgkqdHJhbnMpCiB7CiAJeGxvZ19yZWNvdmVyX2l0ZW1fdAkqaXRlbSwgKm47CiAJaW50CQkJaTsKQEAgLTI4NzEsMTcgKzI2NTcsOTUgQEAKIH0KIAogU1RBVElDIGludAoreGxvZ19yZWNvdmVyX2NvbW1pdF9wYXNzMSgKKwlzdHJ1Y3QgbG9nCQkqbG9nLAorCXN0cnVjdCB4bG9nX3JlY292ZXIJKnRyYW5zLAorCXhsb2dfcmVjb3Zlcl9pdGVtX3QJKml0ZW0pCit7CisJdHJhY2VfeGZzX2xvZ19yZWNvdmVyX2l0ZW1fcmVjb3Zlcihsb2csIHRyYW5zLCBpdGVtLCBYTE9HX1JFQ09WRVJfUEFTUzEpOworCisJc3dpdGNoIChJVEVNX1RZUEUoaXRlbSkpIHsKKwljYXNlIFhGU19MSV9CVUY6CisJCXJldHVybiB4bG9nX3JlY292ZXJfYnVmZmVyX3Bhc3MxKGxvZywgaXRlbSk7CisJY2FzZSBYRlNfTElfUVVPVEFPRkY6CisJCXJldHVybiB4bG9nX3JlY292ZXJfcXVvdGFvZmZfcGFzczEobG9nLCBpdGVtKTsKKwljYXNlIFhGU19MSV9JTk9ERToKKwljYXNlIFhGU19MSV9FRkk6CisJY2FzZSBYRlNfTElfRUZEOgorCWNhc2UgWEZTX0xJX0RRVU9UOgorCQkvKiBub3RoaW5nIHRvIGRvIGluIHBhc3MgMSAqLworCQlyZXR1cm4gMDsKKwlkZWZhdWx0OgorCQl4bG9nX3dhcm4oCisJIlhGUzogaW52YWxpZCBpdGVtIHR5cGUgKCVkKSB4bG9nX3JlY292ZXJfY29tbWl0X3Bhc3MxIiwKKwkJCUlURU1fVFlQRShpdGVtKSk7CisJCUFTU0VSVCgwKTsKKwkJcmV0dXJuIFhGU19FUlJPUihFSU8pOworCX0KK30KKworU1RBVElDIGludAoreGxvZ19yZWNvdmVyX2NvbW1pdF9wYXNzMigKKwlzdHJ1Y3QgbG9nCQkqbG9nLAorCXN0cnVjdCB4bG9nX3JlY292ZXIJKnRyYW5zLAorCXhsb2dfcmVjb3Zlcl9pdGVtX3QJKml0ZW0pCit7CisJdHJhY2VfeGZzX2xvZ19yZWNvdmVyX2l0ZW1fcmVjb3Zlcihsb2csIHRyYW5zLCBpdGVtLCBYTE9HX1JFQ09WRVJfUEFTUzIpOworCisJc3dpdGNoIChJVEVNX1RZUEUoaXRlbSkpIHsKKwljYXNlIFhGU19MSV9CVUY6CisJCXJldHVybiB4bG9nX3JlY292ZXJfYnVmZmVyX3Bhc3MyKGxvZywgaXRlbSk7CisJY2FzZSBYRlNfTElfSU5PREU6CisJCXJldHVybiB4bG9nX3JlY292ZXJfaW5vZGVfcGFzczIobG9nLCBpdGVtKTsKKwljYXNlIFhGU19MSV9FRkk6CisJCXJldHVybiB4bG9nX3JlY292ZXJfZWZpX3Bhc3MyKGxvZywgaXRlbSwgdHJhbnMtPnJfbHNuKTsKKwljYXNlIFhGU19MSV9FRkQ6CisJCXJldHVybiB4bG9nX3JlY292ZXJfZWZkX3Bhc3MyKGxvZywgaXRlbSk7CisJY2FzZSBYRlNfTElfRFFVT1Q6CisJCXJldHVybiB4bG9nX3JlY292ZXJfZHF1b3RfcGFzczIobG9nLCBpdGVtKTsKKwljYXNlIFhGU19MSV9RVU9UQU9GRjoKKwkJLyogbm90aGluZyB0byBkbyBpbiBwYXNzMiAqLworCQlyZXR1cm4gMDsKKwlkZWZhdWx0OgorCQl4bG9nX3dhcm4oCisJIlhGUzogaW52YWxpZCBpdGVtIHR5cGUgKCVkKSB4bG9nX3JlY292ZXJfY29tbWl0X3Bhc3MyIiwKKwkJCUlURU1fVFlQRShpdGVtKSk7CisJCUFTU0VSVCgwKTsKKwkJcmV0dXJuIFhGU19FUlJPUihFSU8pOworCX0KK30KKworLyoKKyAqIFBlcmZvcm0gdGhlIHRyYW5zYWN0aW9uLgorICoKKyAqIElmIHRoZSB0cmFuc2FjdGlvbiBtb2RpZmllcyBhIGJ1ZmZlciBvciBpbm9kZSwgZG8gaXQgbm93LiAgT3RoZXJ3aXNlLAorICogRUZJcyBhbmQgRUZEcyBnZXQgcXVldWVkIHVwIGJ5IGFkZGluZyBlbnRyaWVzIGludG8gdGhlIEFJTCBmb3IgdGhlbS4KKyAqLworU1RBVElDIGludAogeGxvZ19yZWNvdmVyX2NvbW1pdF90cmFucygKLQl4bG9nX3QJCQkqbG9nLAotCXhsb2dfcmVjb3Zlcl90CQkqdHJhbnMsCisJc3RydWN0IGxvZwkJKmxvZywKKwlzdHJ1Y3QgeGxvZ19yZWNvdmVyCSp0cmFucywKIAlpbnQJCQlwYXNzKQogewotCWludAkJCWVycm9yOworCWludAkJCWVycm9yID0gMDsKKwl4bG9nX3JlY292ZXJfaXRlbV90CSppdGVtOwogCiAJaGxpc3RfZGVsKCZ0cmFucy0+cl9saXN0KTsKLQlpZiAoKGVycm9yID0geGxvZ19yZWNvdmVyX2RvX3RyYW5zKGxvZywgdHJhbnMsIHBhc3MpKSkKKworCWVycm9yID0geGxvZ19yZWNvdmVyX3Jlb3JkZXJfdHJhbnMobG9nLCB0cmFucywgcGFzcyk7CisJaWYgKGVycm9yKQogCQlyZXR1cm4gZXJyb3I7Ci0JeGxvZ19yZWNvdmVyX2ZyZWVfdHJhbnModHJhbnMpOwkJCS8qIG5vIGVycm9yICovCisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGl0ZW0sICZ0cmFucy0+cl9pdGVtcSwgcmlfbGlzdCkgeworCQlpZiAocGFzcyA9PSBYTE9HX1JFQ09WRVJfUEFTUzEpCisJCQllcnJvciA9IHhsb2dfcmVjb3Zlcl9jb21taXRfcGFzczEobG9nLCB0cmFucywgaXRlbSk7CisJCWVsc2UKKwkJCWVycm9yID0geGxvZ19yZWNvdmVyX2NvbW1pdF9wYXNzMihsb2csIHRyYW5zLCBpdGVtKTsKKwkJaWYgKGVycm9yKQorCQkJcmV0dXJuIGVycm9yOworCX0KKworCXhsb2dfcmVjb3Zlcl9mcmVlX3RyYW5zKHRyYW5zKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMzAxMSw3ICsyODc1LDcgQEAKIAl4ZnNfZXh0ZW50X3QJCSpleHRwOwogCXhmc19mc2Jsb2NrX3QJCXN0YXJ0YmxvY2tfZnNiOwogCi0JQVNTRVJUKCEoZWZpcC0+ZWZpX2ZsYWdzICYgWEZTX0VGSV9SRUNPVkVSRUQpKTsKKwlBU1NFUlQoIXRlc3RfYml0KFhGU19FRklfUkVDT1ZFUkVELCAmZWZpcC0+ZWZpX2ZsYWdzKSk7CiAKIAkvKgogCSAqIEZpcnN0IGNoZWNrIHRoZSB2YWxpZGl0eSBvZiB0aGUgZXh0ZW50cyBkZXNjcmliZWQgYnkgdGhlCkBAIC0zMDUwLDcgKzI5MTQsNyBAQAogCQkJCQkgZXh0cC0+ZXh0X2xlbik7CiAJfQogCi0JZWZpcC0+ZWZpX2ZsYWdzIHw9IFhGU19FRklfUkVDT1ZFUkVEOworCXNldF9iaXQoWEZTX0VGSV9SRUNPVkVSRUQsICZlZmlwLT5lZmlfZmxhZ3MpOwogCWVycm9yID0geGZzX3RyYW5zX2NvbW1pdCh0cCwgMCk7CiAJcmV0dXJuIGVycm9yOwogCkBAIC0zMTA3LDcgKzI5NzEsNyBAQAogCQkgKiBTa2lwIEVGSXMgdGhhdCB3ZSd2ZSBhbHJlYWR5IHByb2Nlc3NlZC4KIAkJICovCiAJCWVmaXAgPSAoeGZzX2VmaV9sb2dfaXRlbV90ICopbGlwOwotCQlpZiAoZWZpcC0+ZWZpX2ZsYWdzICYgWEZTX0VGSV9SRUNPVkVSRUQpIHsKKwkJaWYgKHRlc3RfYml0KFhGU19FRklfUkVDT1ZFUkVELCAmZWZpcC0+ZWZpX2ZsYWdzKSkgewogCQkJbGlwID0geGZzX3RyYW5zX2FpbF9jdXJzb3JfbmV4dChhaWxwLCAmY3VyKTsKIAkJCWNvbnRpbnVlOwogCQl9CkBAIC0zNzI0LDcgKzM1ODgsNyBAQAogCXhmc19kYWRkcl90CWhlYWRfYmxrLAogCXhmc19kYWRkcl90CXRhaWxfYmxrKQogewotCWludAkJZXJyb3I7CisJaW50CQllcnJvciwgaTsKIAogCUFTU0VSVChoZWFkX2JsayAhPSB0YWlsX2Jsayk7CiAKQEAgLTM3MzIsMTAgKzM1OTYsMTIgQEAKIAkgKiBGaXJzdCBkbyBhIHBhc3MgdG8gZmluZCBhbGwgb2YgdGhlIGNhbmNlbGxlZCBidWYgbG9nIGl0ZW1zLgogCSAqIFN0b3JlIHRoZW0gaW4gdGhlIGJ1Zl9jYW5jZWxfdGFibGUgZm9yIHVzZSBpbiB0aGUgc2Vjb25kIHBhc3MuCiAJICovCi0JbG9nLT5sX2J1Zl9jYW5jZWxfdGFibGUgPQotCQkoeGZzX2J1Zl9jYW5jZWxfdCAqKilrbWVtX3phbGxvYyhYTE9HX0JDX1RBQkxFX1NJWkUgKgotCQkJCQkJIHNpemVvZih4ZnNfYnVmX2NhbmNlbF90KiksCisJbG9nLT5sX2J1Zl9jYW5jZWxfdGFibGUgPSBrbWVtX3phbGxvYyhYTE9HX0JDX1RBQkxFX1NJWkUgKgorCQkJCQkJIHNpemVvZihzdHJ1Y3QgbGlzdF9oZWFkKSwKIAkJCQkJCSBLTV9TTEVFUCk7CisJZm9yIChpID0gMDsgaSA8IFhMT0dfQkNfVEFCTEVfU0laRTsgaSsrKQorCQlJTklUX0xJU1RfSEVBRCgmbG9nLT5sX2J1Zl9jYW5jZWxfdGFibGVbaV0pOworCiAJZXJyb3IgPSB4bG9nX2RvX3JlY292ZXJ5X3Bhc3MobG9nLCBoZWFkX2JsaywgdGFpbF9ibGssCiAJCQkJICAgICAgWExPR19SRUNPVkVSX1BBU1MxKTsKIAlpZiAoZXJyb3IgIT0gMCkgewpAQCAtMzc1NCw3ICszNjIwLDcgQEAKIAkJaW50CWk7CiAKIAkJZm9yIChpID0gMDsgaSA8IFhMT0dfQkNfVEFCTEVfU0laRTsgaSsrKQotCQkJQVNTRVJUKGxvZy0+bF9idWZfY2FuY2VsX3RhYmxlW2ldID09IE5VTEwpOworCQkJQVNTRVJUKGxpc3RfZW1wdHkoJmxvZy0+bF9idWZfY2FuY2VsX3RhYmxlW2ldKSk7CiAJfQogI2VuZGlmCS8qIERFQlVHICovCiAKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfbW91bnQuYyBiL2ZzL3hmcy94ZnNfbW91bnQuYwppbmRleCAxOWU5ZGZhMS4uZDQ0N2FlZiAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19tb3VudC5jCisrKyBiL2ZzL3hmcy94ZnNfbW91bnQuYwpAQCAtNDcyLDcgKzQ3Miw3IEBACiAJCQlnb3RvIG91dF91bndpbmQ7CiAJCXBhZy0+cGFnX2Fnbm8gPSBpbmRleDsKIAkJcGFnLT5wYWdfbW91bnQgPSBtcDsKLQkJcndsb2NrX2luaXQoJnBhZy0+cGFnX2ljaV9sb2NrKTsKKwkJc3Bpbl9sb2NrX2luaXQoJnBhZy0+cGFnX2ljaV9sb2NrKTsKIAkJbXV0ZXhfaW5pdCgmcGFnLT5wYWdfaWNpX3JlY2xhaW1fbG9jayk7CiAJCUlOSVRfUkFESVhfVFJFRSgmcGFnLT5wYWdfaWNpX3Jvb3QsIEdGUF9BVE9NSUMpOwogCQlzcGluX2xvY2tfaW5pdCgmcGFnLT5wYWdfYnVmX2xvY2spOwpAQCAtOTc1LDYgKzk3NSwyNCBAQAogfQogCiAvKgorICogcHJlY2FsY3VsYXRlIHRoZSBsb3cgc3BhY2UgdGhyZXNob2xkcyBmb3IgZHluYW1pYyBzcGVjdWxhdGl2ZSBwcmVhbGxvY2F0aW9uLgorICovCit2b2lkCit4ZnNfc2V0X2xvd19zcGFjZV90aHJlc2hvbGRzKAorCXN0cnVjdCB4ZnNfbW91bnQJKm1wKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IFhGU19MT1dTUF9NQVg7IGkrKykgeworCQlfX3VpbnQ2NF90IHNwYWNlID0gbXAtPm1fc2Iuc2JfZGJsb2NrczsKKworCQlkb19kaXYoc3BhY2UsIDEwMCk7CisJCW1wLT5tX2xvd19zcGFjZVtpXSA9IHNwYWNlICogKGkgKyAxKTsKKwl9Cit9CisKKworLyoKICAqIFNldCB3aGV0aGVyIHdlJ3JlIHVzaW5nIGlub2RlIGFsaWdubWVudC4KICAqLwogU1RBVElDIHZvaWQKQEAgLTExOTYsNiArMTIxNCw5IEBACiAJICovCiAJeGZzX3NldF9yd19zaXplcyhtcCk7CiAKKwkvKiBzZXQgdGhlIGxvdyBzcGFjZSB0aHJlc2hvbGRzIGZvciBkeW5hbWljIHByZWFsbG9jYXRpb24gKi8KKwl4ZnNfc2V0X2xvd19zcGFjZV90aHJlc2hvbGRzKG1wKTsKKwogCS8qCiAJICogU2V0IHRoZSBpbm9kZSBjbHVzdGVyIHNpemUuCiAJICogVGhpcyBtYXkgc3RpbGwgYmUgb3ZlcnJpZGRlbiBieSB0aGUgZmlsZSBzeXN0ZW0KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfbW91bnQuaCBiL2ZzL3hmcy94ZnNfbW91bnQuaAppbmRleCA1ODYxYjQ5Li5hNjJlODk3IDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX21vdW50LmgKKysrIGIvZnMveGZzL3hmc19tb3VudC5oCkBAIC0xMDMsNiArMTAzLDE2IEBACiAJeGZzX21vZF9pbmNvcmVfc2IobXAsIGZpZWxkLCBkZWx0YSwgcnN2ZCkKICNlbmRpZgogCisvKiBkeW5hbWljIHByZWFsbG9jYXRpb24gZnJlZSBzcGFjZSB0aHJlc2hvbGRzLCA1JSBkb3duIHRvIDElICovCitlbnVtIHsKKwlYRlNfTE9XU1BfMV9QQ05UID0gMCwKKwlYRlNfTE9XU1BfMl9QQ05ULAorCVhGU19MT1dTUF8zX1BDTlQsCisJWEZTX0xPV1NQXzRfUENOVCwKKwlYRlNfTE9XU1BfNV9QQ05ULAorCVhGU19MT1dTUF9NQVgsCit9OworCiB0eXBlZGVmIHN0cnVjdCB4ZnNfbW91bnQgewogCXN0cnVjdCBzdXBlcl9ibG9jawkqbV9zdXBlcjsKIAl4ZnNfdGlkX3QJCW1fdGlkOwkJLyogbmV4dCB1bnVzZWQgdGlkIGZvciBmcyAqLwpAQCAtMjAyLDYgKzIxMiw4IEBACiAJX19pbnQ2NF90CQltX3VwZGF0ZV9mbGFnczsJLyogc2IgZmxhZ3Mgd2UgbmVlZCB0byB1cGRhdGUKIAkJCQkJCSAgIG9uIHRoZSBuZXh0IHJlbW91bnQscncgKi8KIAlzdHJ1Y3Qgc2hyaW5rZXIJCW1faW5vZGVfc2hyaW5rOwkvKiBpbm9kZSByZWNsYWltIHNocmlua2VyICovCisJaW50NjRfdAkJCW1fbG93X3NwYWNlW1hGU19MT1dTUF9NQVhdOworCQkJCQkJLyogbG93IGZyZWUgc3BhY2UgdGhyZXNob2xkcyAqLwogfSB4ZnNfbW91bnRfdDsKIAogLyoKQEAgLTM3OSw2ICszOTEsOCBAQAogCiBleHRlcm4gaW50CXhmc19kZXZfaXNfcmVhZF9vbmx5KHN0cnVjdCB4ZnNfbW91bnQgKiwgY2hhciAqKTsKIAorZXh0ZXJuIHZvaWQJeGZzX3NldF9sb3dfc3BhY2VfdGhyZXNob2xkcyhzdHJ1Y3QgeGZzX21vdW50ICopOworCiAjZW5kaWYJLyogX19LRVJORUxfXyAqLwogCiBleHRlcm4gdm9pZAl4ZnNfbW9kX3NiKHN0cnVjdCB4ZnNfdHJhbnMgKiwgX19pbnQ2NF90KTsKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfdHJhbnMuYyBiL2ZzL3hmcy94ZnNfdHJhbnMuYwppbmRleCBmNmQ5NTZiLi5mODBhMDY3IDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX3RyYW5zLmMKKysrIGIvZnMveGZzL3hmc190cmFucy5jCkBAIC0xMzUwLDcgKzEzNTAsNyBAQAogICogdGhleSBjb3VsZCBiZSBpbW1lZGlhdGVseSBmbHVzaGVkIGFuZCB3ZSdkIGhhdmUgdG8gcmFjZSB3aXRoIHRoZSBmbHVzaGVyCiAgKiB0cnlpbmcgdG8gcHVsbCB0aGUgaXRlbSBmcm9tIHRoZSBBSUwgYXMgd2UgYWRkIGl0LgogICovCi12b2lkCitzdGF0aWMgdm9pZAogeGZzX3RyYW5zX2l0ZW1fY29tbWl0dGVkKAogCXN0cnVjdCB4ZnNfbG9nX2l0ZW0JKmxpcCwKIAl4ZnNfbHNuX3QJCWNvbW1pdF9sc24sCkBAIC0xNDI1LDYgKzE0MjUsODMgQEAKIAl4ZnNfdHJhbnNfZnJlZSh0cCk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdm9pZAoreGZzX2xvZ19pdGVtX2JhdGNoX2luc2VydCgKKwlzdHJ1Y3QgeGZzX2FpbAkJKmFpbHAsCisJc3RydWN0IHhmc19sb2dfaXRlbQkqKmxvZ19pdGVtcywKKwlpbnQJCQlucl9pdGVtcywKKwl4ZnNfbHNuX3QJCWNvbW1pdF9sc24pCit7CisJaW50CWk7CisKKwlzcGluX2xvY2soJmFpbHAtPnhhX2xvY2spOworCS8qIHhmc190cmFuc19haWxfdXBkYXRlX2J1bGsgZHJvcHMgYWlscC0+eGFfbG9jayAqLworCXhmc190cmFuc19haWxfdXBkYXRlX2J1bGsoYWlscCwgbG9nX2l0ZW1zLCBucl9pdGVtcywgY29tbWl0X2xzbik7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnJfaXRlbXM7IGkrKykKKwkJSU9QX1VOUElOKGxvZ19pdGVtc1tpXSwgMCk7Cit9CisKKy8qCisgKiBCdWxrIG9wZXJhdGlvbiB2ZXJzaW9uIG9mIHhmc190cmFuc19jb21taXR0ZWQgdGhhdCB0YWtlcyBhIGxvZyB2ZWN0b3Igb2YKKyAqIGl0ZW1zIHRvIGluc2VydCBpbnRvIHRoZSBBSUwuIFRoaXMgdXNlcyBidWxrIEFJTCBpbnNlcnRpb24gdGVjaG5pcXVlcyB0bworICogbWluaW1pc2UgbG9jayB0cmFmZmljLgorICovCit2b2lkCit4ZnNfdHJhbnNfY29tbWl0dGVkX2J1bGsoCisJc3RydWN0IHhmc19haWwJCSphaWxwLAorCXN0cnVjdCB4ZnNfbG9nX3ZlYwkqbG9nX3ZlY3RvciwKKwl4ZnNfbHNuX3QJCWNvbW1pdF9sc24sCisJaW50CQkJYWJvcnRlZCkKK3sKKyNkZWZpbmUgTE9HX0lURU1fQkFUQ0hfU0laRQkzMgorCXN0cnVjdCB4ZnNfbG9nX2l0ZW0JKmxvZ19pdGVtc1tMT0dfSVRFTV9CQVRDSF9TSVpFXTsKKwlzdHJ1Y3QgeGZzX2xvZ192ZWMJKmx2OworCWludAkJCWkgPSAwOworCisJLyogdW5waW4gYWxsIHRoZSBsb2cgaXRlbXMgKi8KKwlmb3IgKGx2ID0gbG9nX3ZlY3RvcjsgbHY7IGx2ID0gbHYtPmx2X25leHQgKSB7CisJCXN0cnVjdCB4ZnNfbG9nX2l0ZW0JKmxpcCA9IGx2LT5sdl9pdGVtOworCQl4ZnNfbHNuX3QJCWl0ZW1fbHNuOworCisJCWlmIChhYm9ydGVkKQorCQkJbGlwLT5saV9mbGFncyB8PSBYRlNfTElfQUJPUlRFRDsKKwkJaXRlbV9sc24gPSBJT1BfQ09NTUlUVEVEKGxpcCwgY29tbWl0X2xzbik7CisKKwkJLyogaXRlbV9sc24gb2YgLTEgbWVhbnMgdGhlIGl0ZW0gd2FzIGZyZWVkICovCisJCWlmIChYRlNfTFNOX0NNUChpdGVtX2xzbiwgKHhmc19sc25fdCktMSkgPT0gMCkKKwkJCWNvbnRpbnVlOworCisJCWlmIChpdGVtX2xzbiAhPSBjb21taXRfbHNuKSB7CisKKwkJCS8qCisJCQkgKiBOb3QgYSBidWxrIHVwZGF0ZSBvcHRpb24gZHVlIHRvIHVudXN1YWwgaXRlbV9sc24uCisJCQkgKiBQdXNoIGludG8gQUlMIGltbWVkaWF0ZWx5LCByZWNoZWNraW5nIHRoZSBsc24gb25jZQorCQkJICogd2UgaGF2ZSB0aGUgYWlsIGxvY2suIFRoZW4gdW5waW4gdGhlIGl0ZW0uCisJCQkgKi8KKwkJCXNwaW5fbG9jaygmYWlscC0+eGFfbG9jayk7CisJCQlpZiAoWEZTX0xTTl9DTVAoaXRlbV9sc24sIGxpcC0+bGlfbHNuKSA+IDApCisJCQkJeGZzX3RyYW5zX2FpbF91cGRhdGUoYWlscCwgbGlwLCBpdGVtX2xzbik7CisJCQllbHNlCisJCQkJc3Bpbl91bmxvY2soJmFpbHAtPnhhX2xvY2spOworCQkJSU9QX1VOUElOKGxpcCwgMCk7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIEl0ZW0gaXMgYSBjYW5kaWRhdGUgZm9yIGJ1bGsgQUlMIGluc2VydC4gICovCisJCWxvZ19pdGVtc1tpKytdID0gbHYtPmx2X2l0ZW07CisJCWlmIChpID49IExPR19JVEVNX0JBVENIX1NJWkUpIHsKKwkJCXhmc19sb2dfaXRlbV9iYXRjaF9pbnNlcnQoYWlscCwgbG9nX2l0ZW1zLAorCQkJCQlMT0dfSVRFTV9CQVRDSF9TSVpFLCBjb21taXRfbHNuKTsKKwkJCWkgPSAwOworCQl9CisJfQorCisJLyogbWFrZSBzdXJlIHdlIGluc2VydCB0aGUgcmVtYWluZGVyISAqLworCWlmIChpKQorCQl4ZnNfbG9nX2l0ZW1fYmF0Y2hfaW5zZXJ0KGFpbHAsIGxvZ19pdGVtcywgaSwgY29tbWl0X2xzbik7Cit9CisKIC8qCiAgKiBDYWxsZWQgZnJvbSB0aGUgdHJhbnNfY29tbWl0IGNvZGUgd2hlbiB3ZSBub3RpY2UgdGhhdAogICogdGhlIGZpbGVzeXN0ZW0gaXMgaW4gdGhlIG1pZGRsZSBvZiBhIGZvcmNlZCBzaHV0ZG93bi4KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfdHJhbnMuaCBiL2ZzL3hmcy94ZnNfdHJhbnMuaAppbmRleCAyNDYyODZiLi5jMjA0MmI3IDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX3RyYW5zLmgKKysrIGIvZnMveGZzL3hmc190cmFucy5oCkBAIC0yOTQsOCArMjk0LDggQEAKICNkZWZpbmUJWEZTX0FMTE9DX0JUUkVFX1JFRgkyCiAjZGVmaW5lCVhGU19CTUFQX0JUUkVFX1JFRgkyCiAjZGVmaW5lCVhGU19ESVJfQlRSRUVfUkVGCTIKKyNkZWZpbmUJWEZTX0lOT19SRUYJCTIKICNkZWZpbmUJWEZTX0FUVFJfQlRSRUVfUkVGCTEKLSNkZWZpbmUJWEZTX0lOT19SRUYJCTEKICNkZWZpbmUJWEZTX0RRVU9UX1JFRgkJMQogCiAjaWZkZWYgX19LRVJORUxfXwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc190cmFuc19haWwuYyBiL2ZzL3hmcy94ZnNfdHJhbnNfYWlsLmMKaW5kZXggZGM5MDY5NS4uYzViYmJjNCAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc190cmFuc19haWwuYworKysgYi9mcy94ZnMveGZzX3RyYW5zX2FpbC5jCkBAIC0yOCw4ICsyOCw4IEBACiAjaW5jbHVkZSAieGZzX3RyYW5zX3ByaXYuaCIKICNpbmNsdWRlICJ4ZnNfZXJyb3IuaCIKIAotU1RBVElDIHZvaWQgeGZzX2FpbF9pbnNlcnQoc3RydWN0IHhmc19haWwgKiwgeGZzX2xvZ19pdGVtX3QgKik7Ci1TVEFUSUMgeGZzX2xvZ19pdGVtX3QgKiB4ZnNfYWlsX2RlbGV0ZShzdHJ1Y3QgeGZzX2FpbCAqLCB4ZnNfbG9nX2l0ZW1fdCAqKTsKK1NUQVRJQyB2b2lkIHhmc19haWxfc3BsaWNlKHN0cnVjdCB4ZnNfYWlsICosIHN0cnVjdCBsaXN0X2hlYWQgKiwgeGZzX2xzbl90KTsKK1NUQVRJQyB2b2lkIHhmc19haWxfZGVsZXRlKHN0cnVjdCB4ZnNfYWlsICosIHhmc19sb2dfaXRlbV90ICopOwogU1RBVElDIHhmc19sb2dfaXRlbV90ICogeGZzX2FpbF9taW4oc3RydWN0IHhmc19haWwgKik7CiBTVEFUSUMgeGZzX2xvZ19pdGVtX3QgKiB4ZnNfYWlsX25leHQoc3RydWN0IHhmc19haWwgKiwgeGZzX2xvZ19pdGVtX3QgKik7CiAKQEAgLTQ0OSwxMjkgKzQ0OSwxNTIgQEAKIAkJeGZzX2xvZ19tb3ZlX3RhaWwoYWlscC0+eGFfbW91bnQsIDEpOwogfQkvKiB4ZnNfdHJhbnNfdW5sb2NrZWRfaXRlbSAqLwogCi0KIC8qCi0gKiBVcGRhdGUgdGhlIHBvc2l0aW9uIG9mIHRoZSBpdGVtIGluIHRoZSBBSUwgd2l0aCB0aGUgbmV3Ci0gKiBsc24uICBJZiBpdCBpcyBub3QgeWV0IGluIHRoZSBBSUwsIGFkZCBpdC4gIE90aGVyd2lzZSwgbW92ZQotICogaXQgdG8gaXRzIG5ldyBwb3NpdGlvbiBieSByZW1vdmluZyBpdCBhbmQgcmUtYWRkaW5nIGl0LgorICogeGZzX3RyYW5zX2FpbF91cGRhdGUgLSBidWxrIEFJTCBpbnNlcnRpb24gb3BlcmF0aW9uLgogICoKLSAqIFdha2V1cCBhbnlvbmUgd2l0aCBhbiBsc24gbGVzcyB0aGFuIHRoZSBpdGVtJ3MgbHNuLiAgSWYgdGhlIGl0ZW0KLSAqIHdlIG1vdmUgaW4gdGhlIEFJTCBpcyB0aGUgbWluaW11bSBvbmUsIHVwZGF0ZSB0aGUgdGFpbCBsc24gaW4gdGhlCi0gKiBsb2cgbWFuYWdlci4KKyAqIEB4ZnNfdHJhbnNfYWlsX3VwZGF0ZSB0YWtlcyBhbiBhcnJheSBvZiBsb2cgaXRlbXMgdGhhdCBhbGwgbmVlZCB0byBiZQorICogcG9zaXRpb25lZCBhdCB0aGUgc2FtZSBMU04gaW4gdGhlIEFJTC4gSWYgYW4gaXRlbSBpcyBub3QgaW4gdGhlIEFJTCwgaXQgd2lsbAorICogYmUgYWRkZWQuICBPdGhlcndpc2UsIGl0IHdpbGwgYmUgcmVwb3NpdGlvbmVkICBieSByZW1vdmluZyBpdCBhbmQgcmUtYWRkaW5nCisgKiBpdCB0byB0aGUgQUlMLiBJZiB3ZSBtb3ZlIHRoZSBmaXJzdCBpdGVtIGluIHRoZSBBSUwsIHVwZGF0ZSB0aGUgbG9nIHRhaWwgdG8KKyAqIG1hdGNoIHRoZSBuZXcgbWluaW11bSBMU04gaW4gdGhlIEFJTC4KICAqCi0gKiBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIHdpdGggdGhlIEFJTCBsb2NrIGhlbGQuICBUaGUgbG9jawotICogaXMgZHJvcHBlZCBiZWZvcmUgcmV0dXJuaW5nLgorICogVGhpcyBmdW5jdGlvbiB0YWtlcyB0aGUgQUlMIGxvY2sgb25jZSB0byBleGVjdXRlIHRoZSB1cGRhdGUgb3BlcmF0aW9ucyBvbgorICogYWxsIHRoZSBpdGVtcyBpbiB0aGUgYXJyYXksIGFuZCBhcyBzdWNoIHNob3VsZCBub3QgYmUgY2FsbGVkIHdpdGggdGhlIEFJTAorICogbG9jayBoZWxkLiBBcyBhIHJlc3VsdCwgb25jZSB3ZSBoYXZlIHRoZSBBSUwgbG9jaywgd2UgbmVlZCB0byBjaGVjayBlYWNoIGxvZworICogaXRlbSBMU04gdG8gY29uZmlybSBpdCBuZWVkcyB0byBiZSBtb3ZlZCBmb3J3YXJkIGluIHRoZSBBSUwuCisgKgorICogVG8gb3B0aW1pc2UgdGhlIGluc2VydCBvcGVyYXRpb24sIHdlIGRlbGV0ZSBhbGwgdGhlIGl0ZW1zIGZyb20gdGhlIEFJTCBpbgorICogdGhlIGZpcnN0IHBhc3MsIG1vdmluZyB0aGVtIGludG8gYSB0ZW1wb3JhcnkgbGlzdCwgdGhlbiBzcGxpY2UgdGhlIHRlbXBvcmFyeQorICogbGlzdCBpbnRvIHRoZSBjb3JyZWN0IHBvc2l0aW9uIGluIHRoZSBBSUwuIFRoaXMgYXZvaWRzIG5lZWRpbmcgdG8gZG8gYW4KKyAqIGluc2VydCBvcGVyYXRpb24gb24gZXZlcnkgaXRlbS4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIHdpdGggdGhlIEFJTCBsb2NrIGhlbGQuICBUaGUgbG9jayBpcyBkcm9wcGVkCisgKiBiZWZvcmUgcmV0dXJuaW5nLgogICovCiB2b2lkCi14ZnNfdHJhbnNfYWlsX3VwZGF0ZSgKLQlzdHJ1Y3QgeGZzX2FpbAkqYWlscCwKLQl4ZnNfbG9nX2l0ZW1fdAkqbGlwLAotCXhmc19sc25fdAlsc24pIF9fcmVsZWFzZXMoYWlscC0+eGFfbG9jaykKK3hmc190cmFuc19haWxfdXBkYXRlX2J1bGsoCisJc3RydWN0IHhmc19haWwJCSphaWxwLAorCXN0cnVjdCB4ZnNfbG9nX2l0ZW0JKipsb2dfaXRlbXMsCisJaW50CQkJbnJfaXRlbXMsCisJeGZzX2xzbl90CQlsc24pIF9fcmVsZWFzZXMoYWlscC0+eGFfbG9jaykKIHsKLQl4ZnNfbG9nX2l0ZW1fdAkJKmRsaXAgPSBOVUxMOwotCXhmc19sb2dfaXRlbV90CQkqbWxpcDsJLyogcHRyIHRvIG1pbmltdW0gbGlwICovCisJeGZzX2xvZ19pdGVtX3QJCSptbGlwOwogCXhmc19sc25fdAkJdGFpbF9sc247CisJaW50CQkJbWxpcF9jaGFuZ2VkID0gMDsKKwlpbnQJCQlpOworCUxJU1RfSEVBRCh0bXApOwogCiAJbWxpcCA9IHhmc19haWxfbWluKGFpbHApOwogCi0JaWYgKGxpcC0+bGlfZmxhZ3MgJiBYRlNfTElfSU5fQUlMKSB7Ci0JCWRsaXAgPSB4ZnNfYWlsX2RlbGV0ZShhaWxwLCBsaXApOwotCQlBU1NFUlQoZGxpcCA9PSBsaXApOwotCQl4ZnNfdHJhbnNfYWlsX2N1cnNvcl9jbGVhcihhaWxwLCBkbGlwKTsKLQl9IGVsc2UgewotCQlsaXAtPmxpX2ZsYWdzIHw9IFhGU19MSV9JTl9BSUw7Ci0JfQorCWZvciAoaSA9IDA7IGkgPCBucl9pdGVtczsgaSsrKSB7CisJCXN0cnVjdCB4ZnNfbG9nX2l0ZW0gKmxpcCA9IGxvZ19pdGVtc1tpXTsKKwkJaWYgKGxpcC0+bGlfZmxhZ3MgJiBYRlNfTElfSU5fQUlMKSB7CisJCQkvKiBjaGVjayBpZiB3ZSByZWFsbHkgbmVlZCB0byBtb3ZlIHRoZSBpdGVtICovCisJCQlpZiAoWEZTX0xTTl9DTVAobHNuLCBsaXAtPmxpX2xzbikgPD0gMCkKKwkJCQljb250aW51ZTsKIAotCWxpcC0+bGlfbHNuID0gbHNuOwotCXhmc19haWxfaW5zZXJ0KGFpbHAsIGxpcCk7Ci0KLQlpZiAobWxpcCA9PSBkbGlwKSB7Ci0JCW1saXAgPSB4ZnNfYWlsX21pbihhaWxwKTsKLQkJLyoKLQkJICogSXQgaXMgbm90IHNhZmUgdG8gYWNjZXNzIG1saXAgYWZ0ZXIgdGhlIEFJTCBsb2NrIGlzCi0JCSAqIGRyb3BwZWQsIHNvIHdlIG11c3QgZ2V0IGEgY29weSBvZiBsaV9sc24gYmVmb3JlIHdlIGRvCi0JCSAqIHNvLiAgVGhpcyBpcyBlc3BlY2lhbGx5IGltcG9ydGFudCBvbiAzMi1iaXQgcGxhdGZvcm1zCi0JCSAqIHdoZXJlIGFjY2Vzc2luZyBhbmQgdXBkYXRpbmcgNjQtYml0IHZhbHVlcyBsaWtlIGxpX2xzbgotCQkgKiBpcyBub3QgYXRvbWljLgotCQkgKi8KLQkJdGFpbF9sc24gPSBtbGlwLT5saV9sc247Ci0JCXNwaW5fdW5sb2NrKCZhaWxwLT54YV9sb2NrKTsKLQkJeGZzX2xvZ19tb3ZlX3RhaWwoYWlscC0+eGFfbW91bnQsIHRhaWxfbHNuKTsKLQl9IGVsc2UgewotCQlzcGluX3VubG9jaygmYWlscC0+eGFfbG9jayk7Ci0JfQotCi0KLX0JLyogeGZzX3RyYW5zX3VwZGF0ZV9haWwgKi8KLQotLyoKLSAqIERlbGV0ZSB0aGUgZ2l2ZW4gaXRlbSBmcm9tIHRoZSBBSUwuICBJdCBtdXN0IGFscmVhZHkgYmUgaW4KLSAqIHRoZSBBSUwuCi0gKgotICogV2FrZXVwIGFueW9uZSB3aXRoIGFuIGxzbiBsZXNzIHRoYW4gaXRlbSdzIGxzbi4gICAgSWYgdGhlIGl0ZW0KLSAqIHdlIGRlbGV0ZSBpbiB0aGUgQUlMIGlzIHRoZSBtaW5pbXVtIG9uZSwgdXBkYXRlIHRoZSB0YWlsIGxzbiBpbiB0aGUKLSAqIGxvZyBtYW5hZ2VyLgotICoKLSAqIENsZWFyIHRoZSBJTl9BSUwgZmxhZyBmcm9tIHRoZSBpdGVtLCByZXNldCBpdHMgbHNuIHRvIDAsIGFuZAotICogYnVtcCB0aGUgQUlMJ3MgZ2VuZXJhdGlvbiBjb3VudCB0byBpbmRpY2F0ZSB0aGF0IHRoZSB0cmVlCi0gKiBoYXMgY2hhbmdlZC4KLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIHdpdGggdGhlIEFJTCBsb2NrIGhlbGQuICBUaGUgbG9jawotICogaXMgZHJvcHBlZCBiZWZvcmUgcmV0dXJuaW5nLgotICovCi12b2lkCi14ZnNfdHJhbnNfYWlsX2RlbGV0ZSgKLQlzdHJ1Y3QgeGZzX2FpbAkqYWlscCwKLQl4ZnNfbG9nX2l0ZW1fdAkqbGlwKSBfX3JlbGVhc2VzKGFpbHAtPnhhX2xvY2spCi17Ci0JeGZzX2xvZ19pdGVtX3QJCSpkbGlwOwotCXhmc19sb2dfaXRlbV90CQkqbWxpcDsKLQl4ZnNfbHNuX3QJCXRhaWxfbHNuOwotCi0JaWYgKGxpcC0+bGlfZmxhZ3MgJiBYRlNfTElfSU5fQUlMKSB7Ci0JCW1saXAgPSB4ZnNfYWlsX21pbihhaWxwKTsKLQkJZGxpcCA9IHhmc19haWxfZGVsZXRlKGFpbHAsIGxpcCk7Ci0JCUFTU0VSVChkbGlwID09IGxpcCk7Ci0JCXhmc190cmFuc19haWxfY3Vyc29yX2NsZWFyKGFpbHAsIGRsaXApOwotCi0KLQkJbGlwLT5saV9mbGFncyAmPSB+WEZTX0xJX0lOX0FJTDsKLQkJbGlwLT5saV9sc24gPSAwOwotCi0JCWlmIChtbGlwID09IGRsaXApIHsKLQkJCW1saXAgPSB4ZnNfYWlsX21pbihhaWxwKTsKLQkJCS8qCi0JCQkgKiBJdCBpcyBub3Qgc2FmZSB0byBhY2Nlc3MgbWxpcCBhZnRlciB0aGUgQUlMIGxvY2sKLQkJCSAqIGlzIGRyb3BwZWQsIHNvIHdlIG11c3QgZ2V0IGEgY29weSBvZiBsaV9sc24KLQkJCSAqIGJlZm9yZSB3ZSBkbyBzby4gIFRoaXMgaXMgZXNwZWNpYWxseSBpbXBvcnRhbnQKLQkJCSAqIG9uIDMyLWJpdCBwbGF0Zm9ybXMgd2hlcmUgYWNjZXNzaW5nIGFuZCB1cGRhdGluZwotCQkJICogNjQtYml0IHZhbHVlcyBsaWtlIGxpX2xzbiBpcyBub3QgYXRvbWljLgotCQkJICovCi0JCQl0YWlsX2xzbiA9IG1saXAgPyBtbGlwLT5saV9sc24gOiAwOwotCQkJc3Bpbl91bmxvY2soJmFpbHAtPnhhX2xvY2spOwotCQkJeGZzX2xvZ19tb3ZlX3RhaWwoYWlscC0+eGFfbW91bnQsIHRhaWxfbHNuKTsKKwkJCXhmc19haWxfZGVsZXRlKGFpbHAsIGxpcCk7CisJCQlpZiAobWxpcCA9PSBsaXApCisJCQkJbWxpcF9jaGFuZ2VkID0gMTsKIAkJfSBlbHNlIHsKLQkJCXNwaW5fdW5sb2NrKCZhaWxwLT54YV9sb2NrKTsKKwkJCWxpcC0+bGlfZmxhZ3MgfD0gWEZTX0xJX0lOX0FJTDsKIAkJfQorCQlsaXAtPmxpX2xzbiA9IGxzbjsKKwkJbGlzdF9hZGQoJmxpcC0+bGlfYWlsLCAmdG1wKTsKIAl9Ci0JZWxzZSB7Ci0JCS8qCi0JCSAqIElmIHRoZSBmaWxlIHN5c3RlbSBpcyBub3QgYmVpbmcgc2h1dGRvd24sIHdlIGFyZSBpbgotCQkgKiBzZXJpb3VzIHRyb3VibGUgaWYgd2UgZ2V0IHRvIHRoaXMgc3RhZ2UuCi0JCSAqLwotCQlzdHJ1Y3QgeGZzX21vdW50CSptcCA9IGFpbHAtPnhhX21vdW50OwogCisJeGZzX2FpbF9zcGxpY2UoYWlscCwgJnRtcCwgbHNuKTsKKworCWlmICghbWxpcF9jaGFuZ2VkKSB7CiAJCXNwaW5fdW5sb2NrKCZhaWxwLT54YV9sb2NrKTsKLQkJaWYgKCFYRlNfRk9SQ0VEX1NIVVRET1dOKG1wKSkgewotCQkJeGZzX2Ntbl9lcnIoWEZTX1BUQUdfQUlMREVMRVRFLCBDRV9BTEVSVCwgbXAsCi0JCSIlczogYXR0ZW1wdGluZyB0byBkZWxldGUgYSBsb2cgaXRlbSB0aGF0IGlzIG5vdCBpbiB0aGUgQUlMIiwKLQkJCQkJX19mdW5jX18pOwotCQkJeGZzX2ZvcmNlX3NodXRkb3duKG1wLCBTSFVURE9XTl9DT1JSVVBUX0lOQ09SRSk7Ci0JCX0KKwkJcmV0dXJuOwogCX0KKworCS8qCisJICogSXQgaXMgbm90IHNhZmUgdG8gYWNjZXNzIG1saXAgYWZ0ZXIgdGhlIEFJTCBsb2NrIGlzIGRyb3BwZWQsIHNvIHdlCisJICogbXVzdCBnZXQgYSBjb3B5IG9mIGxpX2xzbiBiZWZvcmUgd2UgZG8gc28uICBUaGlzIGlzIGVzcGVjaWFsbHkKKwkgKiBpbXBvcnRhbnQgb24gMzItYml0IHBsYXRmb3JtcyB3aGVyZSBhY2Nlc3NpbmcgYW5kIHVwZGF0aW5nIDY0LWJpdAorCSAqIHZhbHVlcyBsaWtlIGxpX2xzbiBpcyBub3QgYXRvbWljLgorCSAqLworCW1saXAgPSB4ZnNfYWlsX21pbihhaWxwKTsKKwl0YWlsX2xzbiA9IG1saXAtPmxpX2xzbjsKKwlzcGluX3VubG9jaygmYWlscC0+eGFfbG9jayk7CisJeGZzX2xvZ19tb3ZlX3RhaWwoYWlscC0+eGFfbW91bnQsIHRhaWxfbHNuKTsKIH0KIAorLyoKKyAqIHhmc190cmFuc19haWxfZGVsZXRlX2J1bGsgLSByZW1vdmUgbXVsdGlwbGUgbG9nIGl0ZW1zIGZyb20gdGhlIEFJTAorICoKKyAqIEB4ZnNfdHJhbnNfYWlsX2RlbGV0ZV9idWxrIHRha2VzIGFuIGFycmF5IG9mIGxvZyBpdGVtcyB0aGF0IGFsbCBuZWVkIHRvCisgKiByZW1vdmVkIGZyb20gdGhlIEFJTC4gVGhlIGNhbGxlciBpcyBhbHJlYWR5IGhvbGRpbmcgdGhlIEFJTCBsb2NrLCBhbmQgZG9uZQorICogYWxsIHRoZSBjaGVja3MgbmVjZXNzYXJ5IHRvIGVuc3VyZSB0aGUgaXRlbXMgcGFzc2VkIGluIHZpYSBAbG9nX2l0ZW1zIGFyZQorICogcmVhZHkgZm9yIGRlbGV0aW9uLiBUaGlzIGluY2x1ZGVzIGNoZWNraW5nIHRoYXQgdGhlIGl0ZW1zIGFyZSBpbiB0aGUgQUlMLgorICoKKyAqIEZvciBlYWNoIGxvZyBpdGVtIHRvIGJlIHJlbW92ZWQsIHVubGluayBpdCAgZnJvbSB0aGUgQUlMLCBjbGVhciB0aGUgSU5fQUlMCisgKiBmbGFnIGZyb20gdGhlIGl0ZW0gYW5kIHJlc2V0IHRoZSBpdGVtJ3MgbHNuIHRvIDAuIElmIHdlIHJlbW92ZSB0aGUgZmlyc3QKKyAqIGl0ZW0gaW4gdGhlIEFJTCwgdXBkYXRlIHRoZSBsb2cgdGFpbCB0byBtYXRjaCB0aGUgbmV3IG1pbmltdW0gTFNOIGluIHRoZQorICogQUlMLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCBub3QgZHJvcCB0aGUgQUlMIGxvY2sgdW50aWwgYWxsIGl0ZW1zIGFyZSByZW1vdmVkIGZyb20KKyAqIHRoZSBBSUwgdG8gbWluaW1pc2UgdGhlIGFtb3VudCBvZiBsb2NrIHRyYWZmaWMgb24gdGhlIEFJTC4gVGhpcyBkb2VzIG5vdAorICogZ3JlYXRseSBpbmNyZWFzZSB0aGUgQUlMIGhvbGQgdGltZSwgYnV0IGRvZXMgc2lnbmlmaWNhbnRseSByZWR1Y2UgdGhlIGFtb3VudAorICogb2YgdHJhZmZpYyBvbiB0aGUgbG9jaywgZXNwZWNpYWxseSBkdXJpbmcgSU8gY29tcGxldGlvbi4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIHdpdGggdGhlIEFJTCBsb2NrIGhlbGQuICBUaGUgbG9jayBpcyBkcm9wcGVkCisgKiBiZWZvcmUgcmV0dXJuaW5nLgorICovCit2b2lkCit4ZnNfdHJhbnNfYWlsX2RlbGV0ZV9idWxrKAorCXN0cnVjdCB4ZnNfYWlsCQkqYWlscCwKKwlzdHJ1Y3QgeGZzX2xvZ19pdGVtCSoqbG9nX2l0ZW1zLAorCWludAkJCW5yX2l0ZW1zKSBfX3JlbGVhc2VzKGFpbHAtPnhhX2xvY2spCit7CisJeGZzX2xvZ19pdGVtX3QJCSptbGlwOworCXhmc19sc25fdAkJdGFpbF9sc247CisJaW50CQkJbWxpcF9jaGFuZ2VkID0gMDsKKwlpbnQJCQlpOwogCisJbWxpcCA9IHhmc19haWxfbWluKGFpbHApOworCisJZm9yIChpID0gMDsgaSA8IG5yX2l0ZW1zOyBpKyspIHsKKwkJc3RydWN0IHhmc19sb2dfaXRlbSAqbGlwID0gbG9nX2l0ZW1zW2ldOworCQlpZiAoIShsaXAtPmxpX2ZsYWdzICYgWEZTX0xJX0lOX0FJTCkpIHsKKwkJCXN0cnVjdCB4ZnNfbW91bnQJKm1wID0gYWlscC0+eGFfbW91bnQ7CisKKwkJCXNwaW5fdW5sb2NrKCZhaWxwLT54YV9sb2NrKTsKKwkJCWlmICghWEZTX0ZPUkNFRF9TSFVURE9XTihtcCkpIHsKKwkJCQl4ZnNfY21uX2VycihYRlNfUFRBR19BSUxERUxFVEUsIENFX0FMRVJULCBtcCwKKwkJIiVzOiBhdHRlbXB0aW5nIHRvIGRlbGV0ZSBhIGxvZyBpdGVtIHRoYXQgaXMgbm90IGluIHRoZSBBSUwiLAorCQkJCQkJX19mdW5jX18pOworCQkJCXhmc19mb3JjZV9zaHV0ZG93bihtcCwgU0hVVERPV05fQ09SUlVQVF9JTkNPUkUpOworCQkJfQorCQkJcmV0dXJuOworCQl9CisKKwkJeGZzX2FpbF9kZWxldGUoYWlscCwgbGlwKTsKKwkJbGlwLT5saV9mbGFncyAmPSB+WEZTX0xJX0lOX0FJTDsKKwkJbGlwLT5saV9sc24gPSAwOworCQlpZiAobWxpcCA9PSBsaXApCisJCQltbGlwX2NoYW5nZWQgPSAxOworCX0KKworCWlmICghbWxpcF9jaGFuZ2VkKSB7CisJCXNwaW5fdW5sb2NrKCZhaWxwLT54YV9sb2NrKTsKKwkJcmV0dXJuOworCX0KKworCS8qCisJICogSXQgaXMgbm90IHNhZmUgdG8gYWNjZXNzIG1saXAgYWZ0ZXIgdGhlIEFJTCBsb2NrIGlzIGRyb3BwZWQsIHNvIHdlCisJICogbXVzdCBnZXQgYSBjb3B5IG9mIGxpX2xzbiBiZWZvcmUgd2UgZG8gc28uICBUaGlzIGlzIGVzcGVjaWFsbHkKKwkgKiBpbXBvcnRhbnQgb24gMzItYml0IHBsYXRmb3JtcyB3aGVyZSBhY2Nlc3NpbmcgYW5kIHVwZGF0aW5nIDY0LWJpdAorCSAqIHZhbHVlcyBsaWtlIGxpX2xzbiBpcyBub3QgYXRvbWljLiBJdCBpcyBwb3NzaWJsZSB3ZSd2ZSBlbXB0aWVkIHRoZQorCSAqIEFJTCBoZXJlLCBzbyBpZiB0aGF0IGlzIHRoZSBjYXNlLCBwYXNzIGFuIExTTiBvZiAwIHRvIHRoZSB0YWlsIG1vdmUuCisJICovCisJbWxpcCA9IHhmc19haWxfbWluKGFpbHApOworCXRhaWxfbHNuID0gbWxpcCA/IG1saXAtPmxpX2xzbiA6IDA7CisJc3Bpbl91bmxvY2soJmFpbHAtPnhhX2xvY2spOworCXhmc19sb2dfbW92ZV90YWlsKGFpbHAtPnhhX21vdW50LCB0YWlsX2xzbik7Cit9CiAKIC8qCiAgKiBUaGUgYWN0aXZlIGl0ZW0gbGlzdCAoQUlMKSBpcyBhIGRvdWJseSBsaW5rZWQgbGlzdCBvZiBsb2cKQEAgLTYyMywxNiArNjQ2LDEzIEBACiB9CiAKIC8qCi0gKiBJbnNlcnQgdGhlIGdpdmVuIGxvZyBpdGVtIGludG8gdGhlIEFJTC4KLSAqIFdlIGFsbW9zdCBhbHdheXMgaW5zZXJ0IGF0IHRoZSBlbmQgb2YgdGhlIGxpc3QsIHNvIG9uIGluc2VydHMKLSAqIHdlIHNlYXJjaCBmcm9tIHRoZSBlbmQgb2YgdGhlIGxpc3QgdG8gZmluZCB3aGVyZSB0aGUKLSAqIG5ldyBpdGVtIGJlbG9uZ3MuCisgKiBzcGxpY2UgdGhlIGxvZyBpdGVtIGxpc3QgaW50byB0aGUgQUlMIGF0IHRoZSBnaXZlbiBMU04uCiAgKi8KIFNUQVRJQyB2b2lkCi14ZnNfYWlsX2luc2VydCgKK3hmc19haWxfc3BsaWNlKAogCXN0cnVjdCB4ZnNfYWlsCSphaWxwLAotCXhmc19sb2dfaXRlbV90CSpsaXApCi0vKiBBUkdTVVNFRCAqLworCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsCisJeGZzX2xzbl90CWxzbikKIHsKIAl4ZnNfbG9nX2l0ZW1fdAkqbmV4dF9saXA7CiAKQEAgLTY0MCwzOSArNjYwLDMzIEBACiAJICogSWYgdGhlIGxpc3QgaXMgZW1wdHksIGp1c3QgaW5zZXJ0IHRoZSBpdGVtLgogCSAqLwogCWlmIChsaXN0X2VtcHR5KCZhaWxwLT54YV9haWwpKSB7Ci0JCWxpc3RfYWRkKCZsaXAtPmxpX2FpbCwgJmFpbHAtPnhhX2FpbCk7CisJCWxpc3Rfc3BsaWNlKGxpc3QsICZhaWxwLT54YV9haWwpOwogCQlyZXR1cm47CiAJfQogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9yZXZlcnNlKG5leHRfbGlwLCAmYWlscC0+eGFfYWlsLCBsaV9haWwpIHsKLQkJaWYgKFhGU19MU05fQ01QKG5leHRfbGlwLT5saV9sc24sIGxpcC0+bGlfbHNuKSA8PSAwKQorCQlpZiAoWEZTX0xTTl9DTVAobmV4dF9saXAtPmxpX2xzbiwgbHNuKSA8PSAwKQogCQkJYnJlYWs7CiAJfQogCiAJQVNTRVJUKCgmbmV4dF9saXAtPmxpX2FpbCA9PSAmYWlscC0+eGFfYWlsKSB8fAotCSAgICAgICAoWEZTX0xTTl9DTVAobmV4dF9saXAtPmxpX2xzbiwgbGlwLT5saV9sc24pIDw9IDApKTsKKwkgICAgICAgKFhGU19MU05fQ01QKG5leHRfbGlwLT5saV9sc24sIGxzbikgPD0gMCkpOwogCi0JbGlzdF9hZGQoJmxpcC0+bGlfYWlsLCAmbmV4dF9saXAtPmxpX2FpbCk7Ci0KLQl4ZnNfYWlsX2NoZWNrKGFpbHAsIGxpcCk7CisJbGlzdF9zcGxpY2VfaW5pdChsaXN0LCAmbmV4dF9saXAtPmxpX2FpbCk7CiAJcmV0dXJuOwogfQogCiAvKgogICogRGVsZXRlIHRoZSBnaXZlbiBpdGVtIGZyb20gdGhlIEFJTC4gIFJldHVybiBhIHBvaW50ZXIgdG8gdGhlIGl0ZW0uCiAgKi8KLS8qQVJHU1VTRUQqLwotU1RBVElDIHhmc19sb2dfaXRlbV90ICoKK1NUQVRJQyB2b2lkCiB4ZnNfYWlsX2RlbGV0ZSgKIAlzdHJ1Y3QgeGZzX2FpbAkqYWlscCwKIAl4ZnNfbG9nX2l0ZW1fdAkqbGlwKQotLyogQVJHU1VTRUQgKi8KIHsKIAl4ZnNfYWlsX2NoZWNrKGFpbHAsIGxpcCk7Ci0KIAlsaXN0X2RlbCgmbGlwLT5saV9haWwpOwotCi0JcmV0dXJuIGxpcDsKKwl4ZnNfdHJhbnNfYWlsX2N1cnNvcl9jbGVhcihhaWxwLCBsaXApOwogfQogCiAvKgpAQCAtNjgyLDcgKzY5Niw2IEBACiBTVEFUSUMgeGZzX2xvZ19pdGVtX3QgKgogeGZzX2FpbF9taW4oCiAJc3RydWN0IHhmc19haWwJKmFpbHApCi0vKiBBUkdTVVNFRCAqLwogewogCWlmIChsaXN0X2VtcHR5KCZhaWxwLT54YV9haWwpKQogCQlyZXR1cm4gTlVMTDsKQEAgLTY5OSw3ICs3MTIsNiBAQAogeGZzX2FpbF9uZXh0KAogCXN0cnVjdCB4ZnNfYWlsCSphaWxwLAogCXhmc19sb2dfaXRlbV90CSpsaXApCi0vKiBBUkdTVVNFRCAqLwogewogCWlmIChsaXAtPmxpX2FpbC5uZXh0ID09ICZhaWxwLT54YV9haWwpCiAJCXJldHVybiBOVUxMOwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc190cmFuc19leHRmcmVlLmMgYi9mcy94ZnMveGZzX3RyYW5zX2V4dGZyZWUuYwppbmRleCBmNzgzZDVlLi5mNzU5MGY1IDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX3RyYW5zX2V4dGZyZWUuYworKysgYi9mcy94ZnMveGZzX3RyYW5zX2V4dGZyZWUuYwpAQCAtNjksMTIgKzY5LDE2IEBACiAJdHAtPnRfZmxhZ3MgfD0gWEZTX1RSQU5TX0RJUlRZOwogCWVmaXAtPmVmaV9pdGVtLmxpX2Rlc2MtPmxpZF9mbGFncyB8PSBYRlNfTElEX0RJUlRZOwogCi0JbmV4dF9leHRlbnQgPSBlZmlwLT5lZmlfbmV4dF9leHRlbnQ7CisJLyoKKwkgKiBhdG9taWNfaW5jX3JldHVybiBnaXZlcyB1cyB0aGUgdmFsdWUgYWZ0ZXIgdGhlIGluY3JlbWVudDsKKwkgKiB3ZSB3YW50IHRvIHVzZSBpdCBhcyBhbiBhcnJheSBpbmRleCBzbyB3ZSBuZWVkIHRvIHN1YnRyYWN0IDEgZnJvbQorCSAqIGl0LgorCSAqLworCW5leHRfZXh0ZW50ID0gYXRvbWljX2luY19yZXR1cm4oJmVmaXAtPmVmaV9uZXh0X2V4dGVudCkgLSAxOwogCUFTU0VSVChuZXh0X2V4dGVudCA8IGVmaXAtPmVmaV9mb3JtYXQuZWZpX25leHRlbnRzKTsKIAlleHRwID0gJihlZmlwLT5lZmlfZm9ybWF0LmVmaV9leHRlbnRzW25leHRfZXh0ZW50XSk7CiAJZXh0cC0+ZXh0X3N0YXJ0ID0gc3RhcnRfYmxvY2s7CiAJZXh0cC0+ZXh0X2xlbiA9IGV4dF9sZW47Ci0JZWZpcC0+ZWZpX25leHRfZXh0ZW50Kys7CiB9CiAKIApkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc190cmFuc19wcml2LmggYi9mcy94ZnMveGZzX3RyYW5zX3ByaXYuaAppbmRleCA2MmRhODZjLi4zNTE2MmMyIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX3RyYW5zX3ByaXYuaAorKysgYi9mcy94ZnMveGZzX3RyYW5zX3ByaXYuaApAQCAtMjIsMTUgKzIyLDE3IEBACiBzdHJ1Y3QgeGZzX2xvZ19pdGVtX2Rlc2M7CiBzdHJ1Y3QgeGZzX21vdW50Owogc3RydWN0IHhmc190cmFuczsKK3N0cnVjdCB4ZnNfYWlsOworc3RydWN0IHhmc19sb2dfdmVjOwogCiB2b2lkCXhmc190cmFuc19hZGRfaXRlbShzdHJ1Y3QgeGZzX3RyYW5zICosIHN0cnVjdCB4ZnNfbG9nX2l0ZW0gKik7CiB2b2lkCXhmc190cmFuc19kZWxfaXRlbShzdHJ1Y3QgeGZzX2xvZ19pdGVtICopOwogdm9pZAl4ZnNfdHJhbnNfZnJlZV9pdGVtcyhzdHJ1Y3QgeGZzX3RyYW5zICp0cCwgeGZzX2xzbl90IGNvbW1pdF9sc24sCiAJCQkJaW50IGZsYWdzKTsKLXZvaWQJeGZzX3RyYW5zX2l0ZW1fY29tbWl0dGVkKHN0cnVjdCB4ZnNfbG9nX2l0ZW0gKmxpcCwKLQkJCQl4ZnNfbHNuX3QgY29tbWl0X2xzbiwgaW50IGFib3J0ZWQpOwogdm9pZAl4ZnNfdHJhbnNfdW5yZXNlcnZlX2FuZF9tb2Rfc2Ioc3RydWN0IHhmc190cmFucyAqdHApOwogCit2b2lkCXhmc190cmFuc19jb21taXR0ZWRfYnVsayhzdHJ1Y3QgeGZzX2FpbCAqYWlscCwgc3RydWN0IHhmc19sb2dfdmVjICpsdiwKKwkJCQl4ZnNfbHNuX3QgY29tbWl0X2xzbiwgaW50IGFib3J0ZWQpOwogLyoKICAqIEFJTCB0cmF2ZXJzYWwgY3Vyc29yLgogICoKQEAgLTczLDEyICs3NSwyOSBAQAogLyoKICAqIEZyb20geGZzX3RyYW5zX2FpbC5jCiAgKi8KLXZvaWQJCQl4ZnNfdHJhbnNfYWlsX3VwZGF0ZShzdHJ1Y3QgeGZzX2FpbCAqYWlscCwKLQkJCQkJc3RydWN0IHhmc19sb2dfaXRlbSAqbGlwLCB4ZnNfbHNuX3QgbHNuKQotCQkJCQlfX3JlbGVhc2VzKGFpbHAtPnhhX2xvY2spOwotdm9pZAkJCXhmc190cmFuc19haWxfZGVsZXRlKHN0cnVjdCB4ZnNfYWlsICphaWxwLAotCQkJCQlzdHJ1Y3QgeGZzX2xvZ19pdGVtICpsaXApCi0JCQkJCV9fcmVsZWFzZXMoYWlscC0+eGFfbG9jayk7Cit2b2lkCXhmc190cmFuc19haWxfdXBkYXRlX2J1bGsoc3RydWN0IHhmc19haWwgKmFpbHAsCisJCQkJc3RydWN0IHhmc19sb2dfaXRlbSAqKmxvZ19pdGVtcywgaW50IG5yX2l0ZW1zLAorCQkJCXhmc19sc25fdCBsc24pIF9fcmVsZWFzZXMoYWlscC0+eGFfbG9jayk7CitzdGF0aWMgaW5saW5lIHZvaWQKK3hmc190cmFuc19haWxfdXBkYXRlKAorCXN0cnVjdCB4ZnNfYWlsCQkqYWlscCwKKwlzdHJ1Y3QgeGZzX2xvZ19pdGVtCSpsaXAsCisJeGZzX2xzbl90CQlsc24pIF9fcmVsZWFzZXMoYWlscC0+eGFfbG9jaykKK3sKKwl4ZnNfdHJhbnNfYWlsX3VwZGF0ZV9idWxrKGFpbHAsICZsaXAsIDEsIGxzbik7Cit9CisKK3ZvaWQJeGZzX3RyYW5zX2FpbF9kZWxldGVfYnVsayhzdHJ1Y3QgeGZzX2FpbCAqYWlscCwKKwkJCQlzdHJ1Y3QgeGZzX2xvZ19pdGVtICoqbG9nX2l0ZW1zLCBpbnQgbnJfaXRlbXMpCisJCQkJX19yZWxlYXNlcyhhaWxwLT54YV9sb2NrKTsKK3N0YXRpYyBpbmxpbmUgdm9pZAoreGZzX3RyYW5zX2FpbF9kZWxldGUoCisJc3RydWN0IHhmc19haWwJKmFpbHAsCisJeGZzX2xvZ19pdGVtX3QJKmxpcCkgX19yZWxlYXNlcyhhaWxwLT54YV9sb2NrKQoreworCXhmc190cmFuc19haWxfZGVsZXRlX2J1bGsoYWlscCwgJmxpcCwgMSk7Cit9CisKIHZvaWQJCQl4ZnNfdHJhbnNfYWlsX3B1c2goc3RydWN0IHhmc19haWwgKiwgeGZzX2xzbl90KTsKIHZvaWQJCQl4ZnNfdHJhbnNfdW5sb2NrZWRfaXRlbShzdHJ1Y3QgeGZzX2FpbCAqLAogCQkJCQl4ZnNfbG9nX2l0ZW1fdCAqKTsKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfdm5vZGVvcHMuYyBiL2ZzL3hmcy94ZnNfdm5vZGVvcHMuYwppbmRleCA4ZTRhNjNjLi5kOGU2ZjhjIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX3Zub2Rlb3BzLmMKKysrIGIvZnMveGZzL3hmc192bm9kZW9wcy5jCkBAIC05NjQsMjkgKzk2NCw0OCBAQAogCQkJeGZzX2ZsdXNoX3BhZ2VzKGlwLCAwLCAtMSwgWEJGX0FTWU5DLCBGSV9OT05FKTsKIAl9CiAKLQlpZiAoaXAtPmlfZC5kaV9ubGluayAhPSAwKSB7Ci0JCWlmICgoKChpcC0+aV9kLmRpX21vZGUgJiBTX0lGTVQpID09IFNfSUZSRUcpICYmCi0JCSAgICAgKChpcC0+aV9zaXplID4gMCkgfHwgKFZOX0NBQ0hFRChWRlNfSShpcCkpID4gMCB8fAotCQkgICAgICAgaXAtPmlfZGVsYXllZF9ibGtzID4gMCkpICYmCi0JCSAgICAgKGlwLT5pX2RmLmlmX2ZsYWdzICYgWEZTX0lGRVhURU5UUykpICAmJgotCQkgICAgKCEoaXAtPmlfZC5kaV9mbGFncyAmCi0JCQkJKFhGU19ESUZMQUdfUFJFQUxMT0MgfCBYRlNfRElGTEFHX0FQUEVORCkpKSkgeworCWlmIChpcC0+aV9kLmRpX25saW5rID09IDApCisJCXJldHVybiAwOwogCi0JCQkvKgotCQkJICogSWYgd2UgY2FuJ3QgZ2V0IHRoZSBpb2xvY2sganVzdCBza2lwIHRydW5jYXRpbmcKLQkJCSAqIHRoZSBibG9ja3MgcGFzdCBFT0YgYmVjYXVzZSB3ZSBjb3VsZCBkZWFkbG9jawotCQkJICogd2l0aCB0aGUgbW1hcF9zZW0gb3RoZXJ3aXNlLiAgV2UnbGwgZ2V0IGFub3RoZXIKLQkJCSAqIGNoYW5jZSB0byBkcm9wIHRoZW0gb25jZSB0aGUgbGFzdCByZWZlcmVuY2UgdG8KLQkJCSAqIHRoZSBpbm9kZSBpcyBkcm9wcGVkLCBzbyB3ZSdsbCBuZXZlciBsZWFrIGJsb2NrcwotCQkJICogcGVybWFuZW50bHkuCi0JCQkgKi8KLQkJCWVycm9yID0geGZzX2ZyZWVfZW9mYmxvY2tzKG1wLCBpcCwKLQkJCQkJCSAgIFhGU19GUkVFX0VPRl9UUllMT0NLKTsKLQkJCWlmIChlcnJvcikKLQkJCQlyZXR1cm4gZXJyb3I7Ci0JCX0KKwlpZiAoKCgoaXAtPmlfZC5kaV9tb2RlICYgU19JRk1UKSA9PSBTX0lGUkVHKSAmJgorCSAgICAgKChpcC0+aV9zaXplID4gMCkgfHwgKFZOX0NBQ0hFRChWRlNfSShpcCkpID4gMCB8fAorCSAgICAgICBpcC0+aV9kZWxheWVkX2Jsa3MgPiAwKSkgJiYKKwkgICAgIChpcC0+aV9kZi5pZl9mbGFncyAmIFhGU19JRkVYVEVOVFMpKSAgJiYKKwkgICAgKCEoaXAtPmlfZC5kaV9mbGFncyAmIChYRlNfRElGTEFHX1BSRUFMTE9DIHwgWEZTX0RJRkxBR19BUFBFTkQpKSkpIHsKKworCQkvKgorCQkgKiBJZiB3ZSBjYW4ndCBnZXQgdGhlIGlvbG9jayBqdXN0IHNraXAgdHJ1bmNhdGluZyB0aGUgYmxvY2tzCisJCSAqIHBhc3QgRU9GIGJlY2F1c2Ugd2UgY291bGQgZGVhZGxvY2sgd2l0aCB0aGUgbW1hcF9zZW0KKwkJICogb3RoZXJ3aXNlLiAgV2UnbGwgZ2V0IGFub3RoZXIgY2hhbmNlIHRvIGRyb3AgdGhlbSBvbmNlIHRoZQorCQkgKiBsYXN0IHJlZmVyZW5jZSB0byB0aGUgaW5vZGUgaXMgZHJvcHBlZCwgc28gd2UnbGwgbmV2ZXIgbGVhaworCQkgKiBibG9ja3MgcGVybWFuZW50bHkuCisJCSAqCisJCSAqIEZ1cnRoZXIsIGNoZWNrIGlmIHRoZSBpbm9kZSBpcyBiZWluZyBvcGVuZWQsIHdyaXR0ZW4gYW5kCisJCSAqIGNsb3NlZCBmcmVxdWVudGx5IGFuZCB3ZSBoYXZlIGRlbGF5ZWQgYWxsb2NhdGlvbiBibG9ja3MKKwkJICogb3VzdGFuZGluZyAoZS5nLiBzdHJlYW1pbmcgd3JpdGVzIGZyb20gdGhlIE5GUyBzZXJ2ZXIpLAorCQkgKiB0cnVuY2F0aW5nIHRoZSBibG9ja3MgcGFzdCBFT0Ygd2lsbCBjYXVzZSBmcmFnbWVudGF0aW9uIHRvCisJCSAqIG9jY3VyLgorCQkgKgorCQkgKiBJbiB0aGlzIGNhc2UgZG9uJ3QgZG8gdGhlIHRydW5jYXRpb24sIGVpdGhlciwgYnV0IHdlIGhhdmUgdG8KKwkJICogYmUgY2FyZWZ1bCBob3cgd2UgZGV0ZWN0IHRoaXMgY2FzZS4gQmxvY2tzIGJleW9uZCBFT0Ygc2hvdworCQkgKiB1cCBhcyBpX2RlbGF5ZWRfYmxrcyBldmVuIHdoZW4gdGhlIGlub2RlIGlzIGNsZWFuLCBzbyB3ZQorCQkgKiBuZWVkIHRvIHRydW5jYXRlIHRoZW0gYXdheSBmaXJzdCBiZWZvcmUgY2hlY2tpbmcgZm9yIGEgZGlydHkKKwkJICogcmVsZWFzZS4gSGVuY2Ugb24gdGhlIGZpcnN0IGRpcnR5IGNsb3NlIHdlIHdpbGwgc3RpbGwgcmVtb3ZlCisJCSAqIHRoZSBzcGVjdWxhdGl2ZSBhbGxvY2F0aW9uLCBidXQgYWZ0ZXIgdGhhdCB3ZSB3aWxsIGxlYXZlIGl0CisJCSAqIGluIHBsYWNlLgorCQkgKi8KKwkJaWYgKHhmc19pZmxhZ3NfdGVzdChpcCwgWEZTX0lESVJUWV9SRUxFQVNFKSkKKwkJCXJldHVybiAwOworCisJCWVycm9yID0geGZzX2ZyZWVfZW9mYmxvY2tzKG1wLCBpcCwKKwkJCQkJICAgWEZTX0ZSRUVfRU9GX1RSWUxPQ0spOworCQlpZiAoZXJyb3IpCisJCQlyZXR1cm4gZXJyb3I7CisKKwkJLyogZGVsYWxsb2MgYmxvY2tzIGFmdGVyIHRydW5jYXRpb24gbWVhbnMgaXQgcmVhbGx5IGlzIGRpcnR5ICovCisJCWlmIChpcC0+aV9kZWxheWVkX2Jsa3MpCisJCQl4ZnNfaWZsYWdzX3NldChpcCwgWEZTX0lESVJUWV9SRUxFQVNFKTsKIAl9Ci0KIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tZ2VuZXJpYy9pby5oIGIvaW5jbHVkZS9hc20tZ2VuZXJpYy9pby5oCmluZGV4IDM1NzdjYTEuLjQ2NDRjOWEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWdlbmVyaWMvaW8uaAorKysgYi9pbmNsdWRlL2FzbS1nZW5lcmljL2lvLmgKQEAgLTIxMSw2ICsyMTEsMzYgQEAKIH0KICNlbmRpZgogCitzdGF0aWMgaW5saW5lIHZvaWQgcmVhZHNsKGNvbnN0IHZvaWQgX19pb21lbSAqYWRkciwgdm9pZCAqYnVmLCBpbnQgbGVuKQoreworCWluc2woKHVuc2lnbmVkIGxvbmcpYWRkciwgYnVmLCBsZW4pOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcmVhZHN3KGNvbnN0IHZvaWQgX19pb21lbSAqYWRkciwgdm9pZCAqYnVmLCBpbnQgbGVuKQoreworCWluc3coKHVuc2lnbmVkIGxvbmcpYWRkciwgYnVmLCBsZW4pOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcmVhZHNiKGNvbnN0IHZvaWQgX19pb21lbSAqYWRkciwgdm9pZCAqYnVmLCBpbnQgbGVuKQoreworCWluc2IoKHVuc2lnbmVkIGxvbmcpYWRkciwgYnVmLCBsZW4pOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgd3JpdGVzbChjb25zdCB2b2lkIF9faW9tZW0gKmFkZHIsIGNvbnN0IHZvaWQgKmJ1ZiwgaW50IGxlbikKK3sKKwlvdXRzbCgodW5zaWduZWQgbG9uZylhZGRyLCBidWYsIGxlbik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB3cml0ZXN3KGNvbnN0IHZvaWQgX19pb21lbSAqYWRkciwgY29uc3Qgdm9pZCAqYnVmLCBpbnQgbGVuKQoreworCW91dHN3KCh1bnNpZ25lZCBsb25nKWFkZHIsIGJ1ZiwgbGVuKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHdyaXRlc2IoY29uc3Qgdm9pZCBfX2lvbWVtICphZGRyLCBjb25zdCB2b2lkICpidWYsIGludCBsZW4pCit7CisJb3V0c2IoKHVuc2lnbmVkIGxvbmcpYWRkciwgYnVmLCBsZW4pOworfQorCiAjaWZuZGVmIENPTkZJR19HRU5FUklDX0lPTUFQCiAjZGVmaW5lIGlvcmVhZDgoYWRkcikJCXJlYWRiKGFkZHIpCiAjZGVmaW5lIGlvcmVhZDE2KGFkZHIpCQlyZWFkdyhhZGRyKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tZ2VuZXJpYy92bWxpbnV4Lmxkcy5oIGIvaW5jbHVkZS9hc20tZ2VuZXJpYy92bWxpbnV4Lmxkcy5oCmluZGV4IGJkNjlkNzkuLjA1Y2JhZDAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWdlbmVyaWMvdm1saW51eC5sZHMuaAorKysgYi9pbmNsdWRlL2FzbS1nZW5lcmljL3ZtbGludXgubGRzLmgKQEAgLTY3LDcgKzY3LDggQEAKICAqIEFsaWduIHRvIGEgMzIgYnl0ZSBib3VuZGFyeSBlcXVhbCB0byB0aGUKICAqIGFsaWdubWVudCBnY2MgNC41IHVzZXMgZm9yIGEgc3RydWN0CiAgKi8KLSNkZWZpbmUgU1RSVUNUX0FMSUdOKCkgLiA9IEFMSUdOKDMyKQorI2RlZmluZSBTVFJVQ1RfQUxJR05NRU5UIDMyCisjZGVmaW5lIFNUUlVDVF9BTElHTigpIC4gPSBBTElHTihTVFJVQ1RfQUxJR05NRU5UKQogCiAvKiBUaGUgYWN0dWFsIGNvbmZpZ3VyYXRpb24gZGV0ZXJtaW5lIGlmIHRoZSBpbml0L2V4aXQgc2VjdGlvbnMKICAqIGFyZSBoYW5kbGVkIGFzIHRleHQvZGF0YSBvciB0aGV5IGNhbiBiZSBkaXNjYXJkZWQgKHdoaWNoCkBAIC0xNDYsNiArMTQ3LDEzIEBACiAjZGVmaW5lIFRSQUNFX1NZU0NBTExTKCkKICNlbmRpZgogCisKKyNkZWZpbmUgS0VSTkVMX0RUQigpCQkJCQkJCVwKKwlTVFJVQ1RfQUxJR04oKTsJCQkJCQkJXAorCVZNTElOVVhfU1lNQk9MKF9fZHRiX3N0YXJ0KSA9IC47CQkJCVwKKwkqKC5kdGIuaW5pdC5yb2RhdGEpCQkJCQkJXAorCVZNTElOVVhfU1lNQk9MKF9fZHRiX2VuZCkgPSAuOworCiAvKiAuZGF0YSBzZWN0aW9uICovCiAjZGVmaW5lIERBVEFfREFUQQkJCQkJCQlcCiAJKiguZGF0YSkJCQkJCQkJXApAQCAtNDY4LDcgKzQ3Niw4IEBACiAJTUNPVU5UX1JFQygpCQkJCQkJCVwKIAlERVZfRElTQ0FSRChpbml0LnJvZGF0YSkJCQkJCVwKIAlDUFVfRElTQ0FSRChpbml0LnJvZGF0YSkJCQkJCVwKLQlNRU1fRElTQ0FSRChpbml0LnJvZGF0YSkKKwlNRU1fRElTQ0FSRChpbml0LnJvZGF0YSkJCQkJCVwKKwlLRVJORUxfRFRCKCkKIAogI2RlZmluZSBJTklUX1RFWFQJCQkJCQkJXAogCSooLmluaXQudGV4dCkJCQkJCQkJXApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kcm0vZHJtUC5oIGIvaW5jbHVkZS9kcm0vZHJtUC5oCmluZGV4IDI3NGVhYWEuLmE0Njk0YzYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvZHJtL2RybVAuaAorKysgYi9pbmNsdWRlL2RybS9kcm1QLmgKQEAgLTY4Myw2ICs2ODMsMjEgQEAKIAl2b2lkICpkcml2ZXJfcHJpdjsgLyoqPCBQcml2YXRlIHN0cnVjdHVyZSBmb3IgZHJpdmVyIHRvIHVzZSAqLwogfTsKIAorLyogU2l6ZSBvZiByaW5nYnVmZmVyIGZvciB2YmxhbmsgdGltZXN0YW1wcy4gSnVzdCBkb3VibGUtYnVmZmVyCisgKiBpbiBpbml0aWFsIGltcGxlbWVudGF0aW9uLgorICovCisjZGVmaW5lIERSTV9WQkxBTktUSU1FX1JCU0laRSAyCisKKy8qIEZsYWdzIGFuZCByZXR1cm4gY29kZXMgZm9yIGdldF92YmxhbmtfdGltZXN0YW1wKCkgZHJpdmVyIGZ1bmN0aW9uLiAqLworI2RlZmluZSBEUk1fQ0FMTEVEX0ZST01fVkJMSVJRIDEKKyNkZWZpbmUgRFJNX1ZCTEFOS1RJTUVfU0NBTk9VVFBPU19NRVRIT0QgKDEgPDwgMCkKKyNkZWZpbmUgRFJNX1ZCTEFOS1RJTUVfSU5WQkwgICAgICAgICAgICAgKDEgPDwgMSkKKworLyogZ2V0X3NjYW5vdXRfcG9zaXRpb24oKSByZXR1cm4gZmxhZ3MgKi8KKyNkZWZpbmUgRFJNX1NDQU5PVVRQT1NfVkFMSUQgICAgICAgICgxIDw8IDApCisjZGVmaW5lIERSTV9TQ0FOT1VUUE9TX0lOVkJMICAgICAgICAoMSA8PCAxKQorI2RlZmluZSBEUk1fU0NBTk9VVFBPU19BQ0NVUkFURSAgICAgKDEgPDwgMikKKwogLyoqCiAgKiBEUk0gZHJpdmVyIHN0cnVjdHVyZS4gVGhpcyBzdHJ1Y3R1cmUgcmVwcmVzZW50IHRoZSBjb21tb24gY29kZSBmb3IKICAqIGEgZmFtaWx5IG9mIGNhcmRzLiBUaGVyZSB3aWxsIG9uZSBkcm1fZGV2aWNlIGZvciBlYWNoIGNhcmQgcHJlc2VudApAQCAtNzYwLDYgKzc3NSw2OCBAQAogCSAqLwogCWludCAoKmRldmljZV9pc19hZ3ApIChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKIAorCS8qKgorCSAqIENhbGxlZCBieSB2YmxhbmsgdGltZXN0YW1waW5nIGNvZGUuCisJICoKKwkgKiBSZXR1cm4gdGhlIGN1cnJlbnQgZGlzcGxheSBzY2Fub3V0IHBvc2l0aW9uIGZyb20gYSBjcnRjLgorCSAqCisJICogXHBhcmFtIGRldiAgRFJNIGRldmljZS4KKwkgKiBccGFyYW0gY3J0YyBJZCBvZiB0aGUgY3J0YyB0byBxdWVyeS4KKwkgKiBccGFyYW0gKnZwb3MgVGFyZ2V0IGxvY2F0aW9uIGZvciBjdXJyZW50IHZlcnRpY2FsIHNjYW5vdXQgcG9zaXRpb24uCisJICogXHBhcmFtICpocG9zIFRhcmdldCBsb2NhdGlvbiBmb3IgY3VycmVudCBob3Jpem9udGFsIHNjYW5vdXQgcG9zaXRpb24uCisJICoKKwkgKiBSZXR1cm5zIHZwb3MgYXMgYSBwb3NpdGl2ZSBudW1iZXIgd2hpbGUgaW4gYWN0aXZlIHNjYW5vdXQgYXJlYS4KKwkgKiBSZXR1cm5zIHZwb3MgYXMgYSBuZWdhdGl2ZSBudW1iZXIgaW5zaWRlIHZibGFuaywgY291bnRpbmcgdGhlIG51bWJlcgorCSAqIG9mIHNjYW5saW5lcyB0byBnbyB1bnRpbCBlbmQgb2YgdmJsYW5rLCBlLmcuLCAtMSBtZWFucyAib25lIHNjYW5saW5lCisJICogdW50aWwgc3RhcnQgb2YgYWN0aXZlIHNjYW5vdXQgLyBlbmQgb2YgdmJsYW5rLiIKKwkgKgorCSAqIFxyZXR1cm4gRmxhZ3MsIG9yJ2VkIHRvZ2V0aGVyIGFzIGZvbGxvd3M6CisJICoKKwkgKiBEUk1fU0NBTk9VVFBPU19WQUxJRCA9IFF1ZXJ5IHN1Y2Nlc3NmdWxsLgorCSAqIERSTV9TQ0FOT1VUUE9TX0lOVkJMID0gSW5zaWRlIHZibGFuay4KKwkgKiBEUk1fU0NBTk9VVFBPU19BQ0NVUkFURSA9IFJldHVybmVkIHBvc2l0aW9uIGlzIGFjY3VyYXRlLiBBIGxhY2sgb2YKKwkgKiB0aGlzIGZsYWcgbWVhbnMgdGhhdCByZXR1cm5lZCBwb3NpdGlvbiBtYXkgYmUgb2Zmc2V0IGJ5IGEgY29uc3RhbnQKKwkgKiBidXQgdW5rbm93biBzbWFsbCBudW1iZXIgb2Ygc2NhbmxpbmVzIHdydC4gcmVhbCBzY2Fub3V0IHBvc2l0aW9uLgorCSAqCisJICovCisJaW50ICgqZ2V0X3NjYW5vdXRfcG9zaXRpb24pIChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgY3J0YywKKwkJCQkgICAgIGludCAqdnBvcywgaW50ICpocG9zKTsKKworCS8qKgorCSAqIENhbGxlZCBieSBcYyBkcm1fZ2V0X2xhc3RfdmJsdGltZXN0YW1wLiBTaG91bGQgcmV0dXJuIGEgcHJlY2lzZQorCSAqIHRpbWVzdGFtcCB3aGVuIHRoZSBtb3N0IHJlY2VudCBWQkxBTksgaW50ZXJ2YWwgZW5kZWQgb3Igd2lsbCBlbmQuCisJICoKKwkgKiBTcGVjaWZpY2FsbHksIHRoZSB0aW1lc3RhbXAgaW4gQHZibGFua190aW1lIHNob3VsZCBjb3JyZXNwb25kIGFzCisJICogY2xvc2VseSBhcyBwb3NzaWJsZSB0byB0aGUgdGltZSB3aGVuIHRoZSBmaXJzdCB2aWRlbyBzY2FubGluZSBvZgorCSAqIHRoZSB2aWRlbyBmcmFtZSBhZnRlciB0aGUgZW5kIG9mIFZCTEFOSyB3aWxsIHN0YXJ0IHNjYW5uaW5nIG91dCwKKwkgKiB0aGUgdGltZSBpbW1tZWRpYXRlbHkgYWZ0ZXIgZW5kIG9mIHRoZSBWQkxBTksgaW50ZXJ2YWwuIElmIHRoZQorCSAqIEBjcnRjIGlzIGN1cnJlbnRseSBpbnNpZGUgVkJMQU5LLCB0aGlzIHdpbGwgYmUgYSB0aW1lIGluIHRoZSBmdXR1cmUuCisJICogSWYgdGhlIEBjcnRjIGlzIGN1cnJlbnRseSBzY2FubmluZyBvdXQgYSBmcmFtZSwgdGhpcyB3aWxsIGJlIHRoZQorCSAqIHBhc3Qgc3RhcnQgdGltZSBvZiB0aGUgY3VycmVudCBzY2Fub3V0LiBUaGlzIGlzIG1lYW50IHRvIGFkaGVyZQorCSAqIHRvIHRoZSBPcGVuTUwgT01MX3N5bmNfY29udHJvbCBleHRlbnNpb24gc3BlY2lmaWNhdGlvbi4KKwkgKgorCSAqIFxwYXJhbSBkZXYgZGV2IERSTSBkZXZpY2UgaGFuZGxlLgorCSAqIFxwYXJhbSBjcnRjIGNydGMgZm9yIHdoaWNoIHRpbWVzdGFtcCBzaG91bGQgYmUgcmV0dXJuZWQuCisJICogXHBhcmFtICptYXhfZXJyb3IgTWF4aW11bSBhbGxvd2FibGUgdGltZXN0YW1wIGVycm9yIGluIG5hbm9zZWNvbmRzLgorCSAqICAgICAgICAgICAgICAgICAgIEltcGxlbWVudGF0aW9uIHNob3VsZCBzdHJpdmUgdG8gcHJvdmlkZSB0aW1lc3RhbXAKKwkgKiAgICAgICAgICAgICAgICAgICB3aXRoIGFuIGVycm9yIG9mIGF0IG1vc3QgKm1heF9lcnJvciBuYW5vc2Vjb25kcy4KKwkgKiAgICAgICAgICAgICAgICAgICBSZXR1cm5zIHRydWUgdXBwZXIgYm91bmQgb24gZXJyb3IgZm9yIHRpbWVzdGFtcC4KKwkgKiBccGFyYW0gKnZibGFua190aW1lIFRhcmdldCBsb2NhdGlvbiBmb3IgcmV0dXJuZWQgdmJsYW5rIHRpbWVzdGFtcC4KKwkgKiBccGFyYW0gZmxhZ3MgMCA9IERlZmF1bHRzLCBubyBzcGVjaWFsIHRyZWF0bWVudCBuZWVkZWQuCisJICogXHBhcmFtICAgICAgIERSTV9DQUxMRURfRlJPTV9WQkxJUlEgPSBGdW5jdGlvbiBpcyBjYWxsZWQgZnJvbSB2YmxhbmsKKwkgKgkgICAgICAgIGlycSBoYW5kbGVyLiBTb21lIGRyaXZlcnMgbmVlZCB0byBhcHBseSBzb21lIHdvcmthcm91bmRzCisJICogICAgICAgICAgICAgIGZvciBncHUtc3BlY2lmaWMgdmJsYW5rIGlycSBxdWlya3MgaWYgZmxhZyBpcyBzZXQuCisJICoKKwkgKiBccmV0dXJucworCSAqIFplcm8gaWYgdGltZXN0YW1waW5nIGlzbid0IHN1cHBvcnRlZCBpbiBjdXJyZW50IGRpc3BsYXkgbW9kZSBvciBhCisJICogbmVnYXRpdmUgbnVtYmVyIG9uIGZhaWx1cmUuIEEgcG9zaXRpdmUgc3RhdHVzIGNvZGUgb24gc3VjY2VzcywKKwkgKiB3aGljaCBkZXNjcmliZXMgaG93IHRoZSB2YmxhbmtfdGltZSB0aW1lc3RhbXAgd2FzIGNvbXB1dGVkLgorCSAqLworCWludCAoKmdldF92YmxhbmtfdGltZXN0YW1wKSAoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGNydGMsCisJCQkJICAgICBpbnQgKm1heF9lcnJvciwKKwkJCQkgICAgIHN0cnVjdCB0aW1ldmFsICp2YmxhbmtfdGltZSwKKwkJCQkgICAgIHVuc2lnbmVkIGZsYWdzKTsKKwogCS8qIHRoZXNlIGhhdmUgdG8gYmUgZmlsbGVkIGluICovCiAKIAlpcnFyZXR1cm5fdCgqaXJxX2hhbmRsZXIpIChEUk1fSVJRX0FSR1MpOwpAQCAtOTgzLDYgKzEwNjAsOCBAQAogCiAJd2FpdF9xdWV1ZV9oZWFkX3QgKnZibF9xdWV1ZTsgICAvKio8IFZCTEFOSyB3YWl0IHF1ZXVlICovCiAJYXRvbWljX3QgKl92YmxhbmtfY291bnQ7ICAgICAgICAvKio8IG51bWJlciBvZiBWQkxBTksgaW50ZXJydXB0cyAoZHJpdmVyIG11c3QgYWxsb2MgdGhlIHJpZ2h0IG51bWJlciBvZiBjb3VudGVycykgKi8KKwlzdHJ1Y3QgdGltZXZhbCAqX3ZibGFua190aW1lOyAgIC8qKjwgdGltZXN0YW1wIG9mIGN1cnJlbnQgdmJsYW5rX2NvdW50IChkcml2ZXJzIG11c3QgYWxsb2MgcmlnaHQgbnVtYmVyIG9mIGZpZWxkcykgKi8KKwlzcGlubG9ja190IHZibGFua190aW1lX2xvY2s7ICAgIC8qKjwgUHJvdGVjdHMgdmJsYW5rIGNvdW50IGFuZCB0aW1lIHVwZGF0ZXMgZHVyaW5nIHZibGFuayBlbmFibGUvZGlzYWJsZSAqLwogCXNwaW5sb2NrX3QgdmJsX2xvY2s7CiAJYXRvbWljX3QgKnZibGFua19yZWZjb3VudDsgICAgICAvKiBudW1iZXIgb2YgdXNlcnMgb2YgdmJsYW5rIGludGVycnVwdHNwZXIgY3J0YyAqLwogCXUzMiAqbGFzdF92Ymxhbms7ICAgICAgICAgICAgICAgLyogcHJvdGVjdGVkIGJ5IGRldi0+dmJsX2xvY2ssIHVzZWQgKi8KQEAgLTEwNDEsMTIgKzExMjAsMTQgQEAKIAkvKkB7ICovCiAJc3BpbmxvY2tfdCBvYmplY3RfbmFtZV9sb2NrOwogCXN0cnVjdCBpZHIgb2JqZWN0X25hbWVfaWRyOwotCXVpbnQzMl90IGludmFsaWRhdGVfZG9tYWluczsgICAgLyogZG9tYWlucyBwZW5kaW5nIGludmFsaWRhdGlvbiAqLwotCXVpbnQzMl90IGZsdXNoX2RvbWFpbnM7ICAgICAgICAgLyogZG9tYWlucyBwZW5kaW5nIGZsdXNoICovCiAJLypAfSAqLwotCisJaW50IHN3aXRjaF9wb3dlcl9zdGF0ZTsKIH07CiAKKyNkZWZpbmUgRFJNX1NXSVRDSF9QT1dFUl9PTiAwCisjZGVmaW5lIERSTV9TV0lUQ0hfUE9XRVJfT0ZGIDEKKyNkZWZpbmUgRFJNX1NXSVRDSF9QT1dFUl9DSEFOR0lORyAyCisKIHN0YXRpYyBfX2lubGluZV9fIGludCBkcm1fY29yZV9jaGVja19mZWF0dXJlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCiAJCQkJCSAgICAgaW50IGZlYXR1cmUpCiB7CkBAIC0xMjg0LDExICsxMzY1LDIyIEBACiAJCQkgICBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbHApOwogZXh0ZXJuIGludCBkcm1fdmJsYW5rX3dhaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50ICp2Ymxfc2VxKTsKIGV4dGVybiB1MzIgZHJtX3ZibGFua19jb3VudChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgY3J0Yyk7CitleHRlcm4gdTMyIGRybV92YmxhbmtfY291bnRfYW5kX3RpbWUoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGNydGMsCisJCQkJICAgICBzdHJ1Y3QgdGltZXZhbCAqdmJsYW5rdGltZSk7CiBleHRlcm4gdm9pZCBkcm1faGFuZGxlX3ZibGFuayhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgY3J0Yyk7CiBleHRlcm4gaW50IGRybV92YmxhbmtfZ2V0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBjcnRjKTsKIGV4dGVybiB2b2lkIGRybV92YmxhbmtfcHV0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBjcnRjKTsKIGV4dGVybiB2b2lkIGRybV92Ymxhbmtfb2ZmKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBjcnRjKTsKIGV4dGVybiB2b2lkIGRybV92YmxhbmtfY2xlYW51cChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKK2V4dGVybiB1MzIgZHJtX2dldF9sYXN0X3ZibHRpbWVzdGFtcChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgY3J0YywKKwkJCQkgICAgIHN0cnVjdCB0aW1ldmFsICp0dmJsYW5rLCB1bnNpZ25lZCBmbGFncyk7CitleHRlcm4gaW50IGRybV9jYWxjX3ZibHRpbWVzdGFtcF9mcm9tX3NjYW5vdXRwb3Moc3RydWN0IGRybV9kZXZpY2UgKmRldiwKKwkJCQkJCSBpbnQgY3J0YywgaW50ICptYXhfZXJyb3IsCisJCQkJCQkgc3RydWN0IHRpbWV2YWwgKnZibGFua190aW1lLAorCQkJCQkJIHVuc2lnbmVkIGZsYWdzLAorCQkJCQkJIHN0cnVjdCBkcm1fY3J0YyAqcmVmY3J0Yyk7CitleHRlcm4gdm9pZCBkcm1fY2FsY190aW1lc3RhbXBpbmdfY29uc3RhbnRzKHN0cnVjdCBkcm1fY3J0YyAqY3J0Yyk7CisKIC8qIE1vZGVzZXR0aW5nIHN1cHBvcnQgKi8KIGV4dGVybiB2b2lkIGRybV92YmxhbmtfcHJlX21vZGVzZXQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGNydGMpOwogZXh0ZXJuIHZvaWQgZHJtX3ZibGFua19wb3N0X21vZGVzZXQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGNydGMpOwpAQCAtMTMyMSw3ICsxNDEzLDYgQEAKIGV4dGVybiBpbnQgZHJtX2FncF9iaW5kKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBkcm1fYWdwX2JpbmRpbmcgKnJlcXVlc3QpOwogZXh0ZXJuIGludCBkcm1fYWdwX2JpbmRfaW9jdGwoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdm9pZCAqZGF0YSwKIAkJCXN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2KTsKLWV4dGVybiB2b2lkIGRybV9hZ3BfY2hpcHNldF9mbHVzaChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKIAogCQkJCS8qIFN0dWIgc3VwcG9ydCAoZHJtX3N0dWIuaCkgKi8KIGV4dGVybiBpbnQgZHJtX3NldG1hc3Rlcl9pb2N0bChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB2b2lkICpkYXRhLApAQCAtMTM0MCw2ICsxNDMxLDkgQEAKIGV4dGVybiBpbnQgZHJtX3B1dF9taW5vcihzdHJ1Y3QgZHJtX21pbm9yICoqbWlub3IpOwogZXh0ZXJuIHVuc2lnbmVkIGludCBkcm1fZGVidWc7CiAKK2V4dGVybiB1bnNpZ25lZCBpbnQgZHJtX3ZibGFua19vZmZkZWxheTsKK2V4dGVybiB1bnNpZ25lZCBpbnQgZHJtX3RpbWVzdGFtcF9wcmVjaXNpb247CisKIGV4dGVybiBzdHJ1Y3QgY2xhc3MgKmRybV9jbGFzczsKIGV4dGVybiBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmRybV9wcm9jX3Jvb3Q7CiBleHRlcm4gc3RydWN0IGRlbnRyeSAqZHJtX2RlYnVnZnNfcm9vdDsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZHJtL2RybV9jcnRjLmggYi9pbmNsdWRlL2RybS9kcm1fY3J0Yy5oCmluZGV4IDAyOWFhNjguLmFjZDdmYWQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvZHJtL2RybV9jcnRjLmgKKysrIGIvaW5jbHVkZS9kcm0vZHJtX2NydGMuaApAQCAtMzUxLDggKzM1MSwxNCBAQAogCiAJYm9vbCBlbmFibGVkOwogCisJLyogUmVxdWVzdGVkIG1vZGUgZnJvbSBtb2Rlc2V0dGluZy4gKi8KIAlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSBtb2RlOwogCisJLyogUHJvZ3JhbW1lZCBtb2RlIGluIGh3LCBhZnRlciBhZGp1c3RtZW50cyBmb3IgZW5jb2RlcnMsCisJICogY3J0YywgcGFuZWwgc2NhbGluZyBldGMuIE5lZWRlZCBmb3IgdGltZXN0YW1waW5nIGV0Yy4KKwkgKi8KKwlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSBod21vZGU7CisKIAlpbnQgeCwgeTsKIAljb25zdCBzdHJ1Y3QgZHJtX2NydGNfZnVuY3MgKmZ1bmNzOwogCkBAIC0zNjAsNiArMzY2LDkgQEAKIAl1aW50MzJfdCBnYW1tYV9zaXplOwogCXVpbnQxNl90ICpnYW1tYV9zdG9yZTsKIAorCS8qIENvbnN0YW50cyBuZWVkZWQgZm9yIHByZWNpc2UgdmJsYW5rIGFuZCBzd2FwIHRpbWVzdGFtcGluZy4gKi8KKwlzNjQgZnJhbWVkdXJfbnMsIGxpbmVkdXJfbnMsIHBpeGVsZHVyX25zOworCiAJLyogaWYgeW91IGFyZSB1c2luZyB0aGUgaGVscGVyICovCiAJdm9pZCAqaGVscGVyX3ByaXZhdGU7CiB9OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kcm0vZHJtX2ZiX2hlbHBlci5oIGIvaW5jbHVkZS9kcm0vZHJtX2ZiX2hlbHBlci5oCmluZGV4IGYyMmU3ZmUuLmFhYzI3YmQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvZHJtL2RybV9mYl9oZWxwZXIuaAorKysgYi9pbmNsdWRlL2RybS9kcm1fZmJfaGVscGVyLmgKQEAgLTEyMSw5ICsxMjEsNiBAQAogdm9pZCBkcm1fZmJfaGVscGVyX3Jlc3RvcmUodm9pZCk7CiB2b2lkIGRybV9mYl9oZWxwZXJfZmlsbF92YXIoc3RydWN0IGZiX2luZm8gKmluZm8sIHN0cnVjdCBkcm1fZmJfaGVscGVyICpmYl9oZWxwZXIsCiAJCQkgICAgdWludDMyX3QgZmJfd2lkdGgsIHVpbnQzMl90IGZiX2hlaWdodCk7Ci12b2lkIGRybV9mYl9oZWxwZXJfZmlsbF9maXgoc3RydWN0IGZiX2luZm8gKmluZm8sIHVpbnQzMl90IHBpdGNoLAotCQkJICAgIHVpbnQzMl90IGRlcHRoKTsKLQogaW50IGRybV9mYl9oZWxwZXJfc2V0Y21hcChzdHJ1Y3QgZmJfY21hcCAqY21hcCwgc3RydWN0IGZiX2luZm8gKmluZm8pOwogCiBib29sIGRybV9mYl9oZWxwZXJfaG90cGx1Z19ldmVudChzdHJ1Y3QgZHJtX2ZiX2hlbHBlciAqZmJfaGVscGVyKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZHJtL2RybV9tbS5oIGIvaW5jbHVkZS9kcm0vZHJtX21tLmgKaW5kZXggYmYwMTUzMS4uZTM5MTc3NyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9kcm0vZHJtX21tLmgKKysrIGIvaW5jbHVkZS9kcm0vZHJtX21tLmgKQEAgLTYyLDExICs2MiwxNCBAQAogCXN0cnVjdCBsaXN0X2hlYWQgdW51c2VkX25vZGVzOwogCWludCBudW1fdW51c2VkOwogCXNwaW5sb2NrX3QgdW51c2VkX2xvY2s7CisJdW5zaWduZWQgaW50IHNjYW5fY2hlY2tfcmFuZ2UgOiAxOwogCXVuc2lnbmVkIHNjYW5fYWxpZ25tZW50OwogCXVuc2lnbmVkIGxvbmcgc2Nhbl9zaXplOwogCXVuc2lnbmVkIGxvbmcgc2Nhbl9oaXRfc3RhcnQ7CiAJdW5zaWduZWQgc2Nhbl9oaXRfc2l6ZTsKIAl1bnNpZ25lZCBzY2FubmVkX2Jsb2NrczsKKwl1bnNpZ25lZCBsb25nIHNjYW5fc3RhcnQ7CisJdW5zaWduZWQgbG9uZyBzY2FuX2VuZDsKIH07CiAKIC8qCkBAIC0xNDUsNiArMTQ4LDEwIEBACiAKIHZvaWQgZHJtX21tX2luaXRfc2NhbihzdHJ1Y3QgZHJtX21tICptbSwgdW5zaWduZWQgbG9uZyBzaXplLAogCQkgICAgICB1bnNpZ25lZCBhbGlnbm1lbnQpOwordm9pZCBkcm1fbW1faW5pdF9zY2FuX3dpdGhfcmFuZ2Uoc3RydWN0IGRybV9tbSAqbW0sIHVuc2lnbmVkIGxvbmcgc2l6ZSwKKwkJCQkgdW5zaWduZWQgYWxpZ25tZW50LAorCQkJCSB1bnNpZ25lZCBsb25nIHN0YXJ0LAorCQkJCSB1bnNpZ25lZCBsb25nIGVuZCk7CiBpbnQgZHJtX21tX3NjYW5fYWRkX2Jsb2NrKHN0cnVjdCBkcm1fbW1fbm9kZSAqbm9kZSk7CiBpbnQgZHJtX21tX3NjYW5fcmVtb3ZlX2Jsb2NrKHN0cnVjdCBkcm1fbW1fbm9kZSAqbm9kZSk7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZHJtL2RybV9wY2lpZHMuaCBiL2luY2x1ZGUvZHJtL2RybV9wY2lpZHMuaAppbmRleCA4ODNjMWQ0Li5mZTI5YWUzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2RybS9kcm1fcGNpaWRzLmgKKysrIGIvaW5jbHVkZS9kcm0vZHJtX3BjaWlkcy5oCkBAIC0xNDIsNiArMTQyLDQyIEBACiAJezB4MTAwMiwgMHg1ZTRjLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1JWNDEwfFJBREVPTl9ORVdfTUVNTUFQfSwgXAogCXsweDEwMDIsIDB4NWU0ZCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9SVjQxMHxSQURFT05fTkVXX01FTU1BUH0sIFwKIAl7MHgxMDAyLCAweDVlNGYsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUlY0MTB8UkFERU9OX05FV19NRU1NQVB9LCBcCisJezB4MTAwMiwgMHg2NzIwLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX0JBUlRTfFJBREVPTl9JU19NT0JJTElUWXxSQURFT05fTkVXX01FTU1BUH0sIFwKKwl7MHgxMDAyLCAweDY3MjEsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfQkFSVFN8UkFERU9OX0lTX01PQklMSVRZfFJBREVPTl9ORVdfTUVNTUFQfSwgXAorCXsweDEwMDIsIDB4NjcyMiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9CQVJUU3xSQURFT05fTkVXX01FTU1BUH0sIFwKKwl7MHgxMDAyLCAweDY3MjMsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfQkFSVFN8UkFERU9OX05FV19NRU1NQVB9LCBcCisJezB4MTAwMiwgMHg2NzI0LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX0JBUlRTfFJBREVPTl9JU19NT0JJTElUWXxSQURFT05fTkVXX01FTU1BUH0sIFwKKwl7MHgxMDAyLCAweDY3MjUsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfQkFSVFN8UkFERU9OX0lTX01PQklMSVRZfFJBREVPTl9ORVdfTUVNTUFQfSwgXAorCXsweDEwMDIsIDB4NjcyNiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9CQVJUU3xSQURFT05fTkVXX01FTU1BUH0sIFwKKwl7MHgxMDAyLCAweDY3MjcsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfQkFSVFN8UkFERU9OX05FV19NRU1NQVB9LCBcCisJezB4MTAwMiwgMHg2NzI4LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX0JBUlRTfFJBREVPTl9ORVdfTUVNTUFQfSwgXAorCXsweDEwMDIsIDB4NjcyOSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9CQVJUU3xSQURFT05fTkVXX01FTU1BUH0sIFwKKwl7MHgxMDAyLCAweDY3MzgsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfQkFSVFN8UkFERU9OX05FV19NRU1NQVB9LCBcCisJezB4MTAwMiwgMHg2NzM5LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX0JBUlRTfFJBREVPTl9ORVdfTUVNTUFQfSwgXAorCXsweDEwMDIsIDB4Njc0MCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9UVVJLU3xSQURFT05fSVNfTU9CSUxJVFl8UkFERU9OX05FV19NRU1NQVB9LCBcCisJezB4MTAwMiwgMHg2NzQxLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1RVUktTfFJBREVPTl9JU19NT0JJTElUWXxSQURFT05fTkVXX01FTU1BUH0sIFwKKwl7MHgxMDAyLCAweDY3NDIsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfVFVSS1N8UkFERU9OX0lTX01PQklMSVRZfFJBREVPTl9ORVdfTUVNTUFQfSwgXAorCXsweDEwMDIsIDB4Njc0MywgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9UVVJLU3xSQURFT05fSVNfTU9CSUxJVFl8UkFERU9OX05FV19NRU1NQVB9LCBcCisJezB4MTAwMiwgMHg2NzQ0LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1RVUktTfFJBREVPTl9JU19NT0JJTElUWXxSQURFT05fTkVXX01FTU1BUH0sIFwKKwl7MHgxMDAyLCAweDY3NDUsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfVFVSS1N8UkFERU9OX0lTX01PQklMSVRZfFJBREVPTl9ORVdfTUVNTUFQfSwgXAorCXsweDEwMDIsIDB4Njc0NiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9UVVJLU3xSQURFT05fTkVXX01FTU1BUH0sIFwKKwl7MHgxMDAyLCAweDY3NDcsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfVFVSS1N8UkFERU9OX05FV19NRU1NQVB9LCBcCisJezB4MTAwMiwgMHg2NzQ4LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1RVUktTfFJBREVPTl9ORVdfTUVNTUFQfSwgXAorCXsweDEwMDIsIDB4Njc0OSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9UVVJLU3xSQURFT05fTkVXX01FTU1BUH0sIFwKKwl7MHgxMDAyLCAweDY3NTAsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfVFVSS1N8UkFERU9OX05FV19NRU1NQVB9LCBcCisJezB4MTAwMiwgMHg2NzU4LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1RVUktTfFJBREVPTl9ORVdfTUVNTUFQfSwgXAorCXsweDEwMDIsIDB4Njc1OSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9UVVJLU3xSQURFT05fTkVXX01FTU1BUH0sIFwKKwl7MHgxMDAyLCAweDY3NjAsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfQ0FJQ09TfFJBREVPTl9JU19NT0JJTElUWXxSQURFT05fTkVXX01FTU1BUH0sIFwKKwl7MHgxMDAyLCAweDY3NjEsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfQ0FJQ09TfFJBREVPTl9JU19NT0JJTElUWXxSQURFT05fTkVXX01FTU1BUH0sIFwKKwl7MHgxMDAyLCAweDY3NjIsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfQ0FJQ09TfFJBREVPTl9ORVdfTUVNTUFQfSwgXAorCXsweDEwMDIsIDB4Njc2MywgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9DQUlDT1N8UkFERU9OX05FV19NRU1NQVB9LCBcCisJezB4MTAwMiwgMHg2NzY0LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX0NBSUNPU3xSQURFT05fSVNfTU9CSUxJVFl8UkFERU9OX05FV19NRU1NQVB9LCBcCisJezB4MTAwMiwgMHg2NzY1LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX0NBSUNPU3xSQURFT05fSVNfTU9CSUxJVFl8UkFERU9OX05FV19NRU1NQVB9LCBcCisJezB4MTAwMiwgMHg2NzY2LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX0NBSUNPU3xSQURFT05fTkVXX01FTU1BUH0sIFwKKwl7MHgxMDAyLCAweDY3NjcsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfQ0FJQ09TfFJBREVPTl9ORVdfTUVNTUFQfSwgXAorCXsweDEwMDIsIDB4Njc2OCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9DQUlDT1N8UkFERU9OX05FV19NRU1NQVB9LCBcCisJezB4MTAwMiwgMHg2NzcwLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX0NBSUNPU3xSQURFT05fTkVXX01FTU1BUH0sIFwKKwl7MHgxMDAyLCAweDY3NzksIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfQ0FJQ09TfFJBREVPTl9ORVdfTUVNTUFQfSwgXAogCXsweDEwMDIsIDB4Njg4MCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9DWVBSRVNTfFJBREVPTl9JU19NT0JJTElUWXxSQURFT05fTkVXX01FTU1BUH0sIFwKIAl7MHgxMDAyLCAweDY4ODgsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfQ1lQUkVTU3xSQURFT05fTkVXX01FTU1BUH0sIFwKIAl7MHgxMDAyLCAweDY4ODksIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfQ1lQUkVTU3xSQURFT05fTkVXX01FTU1BUH0sIFwKQEAgLTQxOSw2ICs0NTUsMTAgQEAKIAl7MHgxMDAyLCAweDk3MTMsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUlM4ODB8UkFERU9OX0lTX01PQklMSVRZfFJBREVPTl9ORVdfTUVNTUFQfFJBREVPTl9JU19JR1B9LCBcCiAJezB4MTAwMiwgMHg5NzE0LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1JTODgwfFJBREVPTl9ORVdfTUVNTUFQfFJBREVPTl9JU19JR1B9LCBcCiAJezB4MTAwMiwgMHg5NzE1LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1JTODgwfFJBREVPTl9ORVdfTUVNTUFQfFJBREVPTl9JU19JR1B9LCBcCisJezB4MTAwMiwgMHg5ODAyLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1BBTE18UkFERU9OX05FV19NRU1NQVB8UkFERU9OX0lTX0lHUH0sIFwKKwl7MHgxMDAyLCAweDk4MDMsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUEFMTXxSQURFT05fTkVXX01FTU1BUHxSQURFT05fSVNfSUdQfSwgXAorCXsweDEwMDIsIDB4OTgwNCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9QQUxNfFJBREVPTl9ORVdfTUVNTUFQfFJBREVPTl9JU19JR1B9LCBcCisJezB4MTAwMiwgMHg5ODA1LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1BBTE18UkFERU9OX05FV19NRU1NQVB8UkFERU9OX0lTX0lHUH0sIFwKIAl7MCwgMCwgMH0KIAogI2RlZmluZSByMTI4X1BDSV9JRFMgXApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kcm0vaTkxNV9kcm0uaCBiL2luY2x1ZGUvZHJtL2k5MTVfZHJtLmgKaW5kZXggYTI3NzZlMi4uMDAzOWYxZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9kcm0vaTkxNV9kcm0uaAorKysgYi9pbmNsdWRlL2RybS9pOTE1X2RybS5oCkBAIC0yODksNiArMjg5LDcgQEAKICNkZWZpbmUgSTkxNV9QQVJBTV9IQVNfQkxUCQkgMTEKICNkZWZpbmUgSTkxNV9QQVJBTV9IQVNfUkVMQVhFRF9GRU5DSU5HCSAxMgogI2RlZmluZSBJOTE1X1BBUkFNX0hBU19DT0hFUkVOVF9SSU5HUwkgMTMKKyNkZWZpbmUgSTkxNV9QQVJBTV9IQVNfRVhFQ19DT05TVEFOVFMJIDE0CiAKIHR5cGVkZWYgc3RydWN0IGRybV9pOTE1X2dldHBhcmFtIHsKIAlpbnQgcGFyYW07CkBAIC02MzUsNiArNjM2LDE3IEBACiAjZGVmaW5lIEk5MTVfRVhFQ19SRU5ERVIgICAgICAgICAgICAgICAgICgxPDwwKQogI2RlZmluZSBJOTE1X0VYRUNfQlNEICAgICAgICAgICAgICAgICAgICAoMjw8MCkKICNkZWZpbmUgSTkxNV9FWEVDX0JMVCAgICAgICAgICAgICAgICAgICAgKDM8PDApCisKKy8qIFVzZWQgZm9yIHN3aXRjaGluZyB0aGUgY29uc3RhbnRzIGFkZHJlc3NpbmcgbW9kZSBvbiBnZW40KyBSRU5ERVIgcmluZy4KKyAqIEdlbjYrIG9ubHkgc3VwcG9ydHMgcmVsYXRpdmUgYWRkcmVzc2luZyB0byBkeW5hbWljIHN0YXRlIChkZWZhdWx0KSBhbmQKKyAqIGFic29sdXRlIGFkZHJlc3NpbmcuCisgKgorICogVGhlc2UgZmxhZ3MgYXJlIGlnbm9yZWQgZm9yIHRoZSBCU0QgYW5kIEJMVCByaW5ncy4KKyAqLworI2RlZmluZSBJOTE1X0VYRUNfQ09OU1RBTlRTX01BU0sgCSgzPDw2KQorI2RlZmluZSBJOTE1X0VYRUNfQ09OU1RBTlRTX1JFTF9HRU5FUkFMICgwPDw2KSAvKiBkZWZhdWx0ICovCisjZGVmaW5lIEk5MTVfRVhFQ19DT05TVEFOVFNfQUJTT0xVVEUgCSgxPDw2KQorI2RlZmluZSBJOTE1X0VYRUNfQ09OU1RBTlRTX1JFTF9TVVJGQUNFICgyPDw2KSAvKiBnZW40LzUgb25seSAqLwogCV9fdTY0IGZsYWdzOwogCV9fdTY0IHJzdmQxOwogCV9fdTY0IHJzdmQyOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kcm0vaW50ZWwtZ3R0LmggYi9pbmNsdWRlL2RybS9pbnRlbC1ndHQuaAppbmRleCBkM2M4MTk0Ni4uOWUzNDNjMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9kcm0vaW50ZWwtZ3R0LmgKKysrIGIvaW5jbHVkZS9kcm0vaW50ZWwtZ3R0LmgKQEAgLTIsMTcgKzIsNDAgQEAKIAogI2lmbmRlZiBfRFJNX0lOVEVMX0dUVF9ICiAjZGVmaW5lCV9EUk1fSU5URUxfR1RUX0gKLXN0cnVjdCBpbnRlbF9ndHQgewotCS8qIE51bWJlciBvZiBzdG9sZW4gZ3R0IGVudHJpZXMgYXQgdGhlIGJlZ2lubmluZy4gKi8KLQl1bnNpZ25lZCBpbnQgZ3R0X3N0b2xlbl9lbnRyaWVzOworCitjb25zdCBzdHJ1Y3QgaW50ZWxfZ3R0IHsKKwkvKiBTaXplIG9mIG1lbW9yeSByZXNlcnZlZCBmb3IgZ3JhcGhpY3MgYnkgdGhlIEJJT1MgKi8KKwl1bnNpZ25lZCBpbnQgc3RvbGVuX3NpemU7CiAJLyogVG90YWwgbnVtYmVyIG9mIGd0dCBlbnRyaWVzLiAqLwogCXVuc2lnbmVkIGludCBndHRfdG90YWxfZW50cmllczsKIAkvKiBQYXJ0IG9mIHRoZSBndHQgdGhhdCBpcyBtYXBwYWJsZSBieSB0aGUgY3B1LCBmb3IgdGhvc2UgY2hpcHMgd2hlcmUKIAkgKiB0aGlzIGlzIG5vdCB0aGUgZnVsbCBndHQuICovCiAJdW5zaWduZWQgaW50IGd0dF9tYXBwYWJsZV9lbnRyaWVzOwotfTsKKwkvKiBXaGV0aGVyIGk5MTUgbmVlZHMgdG8gdXNlIHRoZSBkbWFyIGFwaXMgb3Igbm90LiAqLworCXVuc2lnbmVkIGludCBuZWVkc19kbWFyIDogMTsKK30gKmludGVsX2d0dF9nZXQodm9pZCk7CiAKLXN0cnVjdCBpbnRlbF9ndHQgKmludGVsX2d0dF9nZXQodm9pZCk7Cit2b2lkIGludGVsX2d0dF9jaGlwc2V0X2ZsdXNoKHZvaWQpOwordm9pZCBpbnRlbF9ndHRfdW5tYXBfbWVtb3J5KHN0cnVjdCBzY2F0dGVybGlzdCAqc2dfbGlzdCwgaW50IG51bV9zZyk7Cit2b2lkIGludGVsX2d0dF9jbGVhcl9yYW5nZSh1bnNpZ25lZCBpbnQgZmlyc3RfZW50cnksIHVuc2lnbmVkIGludCBudW1fZW50cmllcyk7CitpbnQgaW50ZWxfZ3R0X21hcF9tZW1vcnkoc3RydWN0IHBhZ2UgKipwYWdlcywgdW5zaWduZWQgaW50IG51bV9lbnRyaWVzLAorCQkJIHN0cnVjdCBzY2F0dGVybGlzdCAqKnNnX2xpc3QsIGludCAqbnVtX3NnKTsKK3ZvaWQgaW50ZWxfZ3R0X2luc2VydF9zZ19lbnRyaWVzKHN0cnVjdCBzY2F0dGVybGlzdCAqc2dfbGlzdCwKKwkJCQkgdW5zaWduZWQgaW50IHNnX2xlbiwKKwkJCQkgdW5zaWduZWQgaW50IHBnX3N0YXJ0LAorCQkJCSB1bnNpZ25lZCBpbnQgZmxhZ3MpOwordm9pZCBpbnRlbF9ndHRfaW5zZXJ0X3BhZ2VzKHVuc2lnbmVkIGludCBmaXJzdF9lbnRyeSwgdW5zaWduZWQgaW50IG51bV9lbnRyaWVzLAorCQkJICAgIHN0cnVjdCBwYWdlICoqcGFnZXMsIHVuc2lnbmVkIGludCBmbGFncyk7CisKKy8qIFNwZWNpYWwgZ3R0IG1lbW9yeSB0eXBlcyAqLworI2RlZmluZSBBR1BfRENBQ0hFX01FTU9SWQkxCisjZGVmaW5lIEFHUF9QSFlTX01FTU9SWQkJMgorCisvKiBOZXcgY2FjaGluZyBhdHRyaWJ1dGVzIGZvciBnZW42L3NhbmR5YnJpZGdlICovCisjZGVmaW5lIEFHUF9VU0VSX0NBQ0hFRF9NRU1PUllfTExDX01MQyAoQUdQX1VTRVJfVFlQRVMgKyAyKQorI2RlZmluZSBBR1BfVVNFUl9VTkNBQ0hFRF9NRU1PUlkgKEFHUF9VU0VSX1RZUEVTICsgNCkKKworLyogZmxhZyBmb3IgR0ZEVCB0eXBlICovCisjZGVmaW5lIEFHUF9VU0VSX0NBQ0hFRF9NRU1PUllfR0ZEVCAoMSA8PCAzKQogCiAjZW5kaWYKLQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kcm0vbm91dmVhdV9kcm0uaCBiL2luY2x1ZGUvZHJtL25vdXZlYXVfZHJtLmgKaW5kZXggYmM1NTkwYi4uZTJjZmU4MCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9kcm0vbm91dmVhdV9kcm0uaAorKysgYi9pbmNsdWRlL2RybS9ub3V2ZWF1X2RybS5oCkBAIC03MSwxNiArNzEsMTQgQEAKICNkZWZpbmUgTk9VVkVBVV9HRVRQQVJBTV9QQ0lfVkVORE9SICAgICAgMwogI2RlZmluZSBOT1VWRUFVX0dFVFBBUkFNX1BDSV9ERVZJQ0UgICAgICA0CiAjZGVmaW5lIE5PVVZFQVVfR0VUUEFSQU1fQlVTX1RZUEUgICAgICAgIDUKLSNkZWZpbmUgTk9VVkVBVV9HRVRQQVJBTV9GQl9QSFlTSUNBTCAgICAgNgotI2RlZmluZSBOT1VWRUFVX0dFVFBBUkFNX0FHUF9QSFlTSUNBTCAgICA3CiAjZGVmaW5lIE5PVVZFQVVfR0VUUEFSQU1fRkJfU0laRSAgICAgICAgIDgKICNkZWZpbmUgTk9VVkVBVV9HRVRQQVJBTV9BR1BfU0laRSAgICAgICAgOQotI2RlZmluZSBOT1VWRUFVX0dFVFBBUkFNX1BDSV9QSFlTSUNBTCAgICAxMAogI2RlZmluZSBOT1VWRUFVX0dFVFBBUkFNX0NISVBTRVRfSUQgICAgICAxMQogI2RlZmluZSBOT1VWRUFVX0dFVFBBUkFNX1ZNX1ZSQU1fQkFTRSAgICAxMgogI2RlZmluZSBOT1VWRUFVX0dFVFBBUkFNX0dSQVBIX1VOSVRTICAgICAxMwogI2RlZmluZSBOT1VWRUFVX0dFVFBBUkFNX1BUSU1FUl9USU1FICAgICAxNAogI2RlZmluZSBOT1VWRUFVX0dFVFBBUkFNX0hBU19CT19VU0FHRSAgICAxNQorI2RlZmluZSBOT1VWRUFVX0dFVFBBUkFNX0hBU19QQUdFRkxJUCAgICAxNgogc3RydWN0IGRybV9ub3V2ZWF1X2dldHBhcmFtIHsKIAl1aW50NjRfdCBwYXJhbTsKIAl1aW50NjRfdCB2YWx1ZTsKQEAgLTE3MSw3ICsxNjksNiBAQAogfTsKIAogI2RlZmluZSBOT1VWRUFVX0dFTV9DUFVfUFJFUF9OT1dBSVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQotI2RlZmluZSBOT1VWRUFVX0dFTV9DUFVfUFJFUF9OT0JMT0NLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgogI2RlZmluZSBOT1VWRUFVX0dFTV9DUFVfUFJFUF9XUklURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAogc3RydWN0IGRybV9ub3V2ZWF1X2dlbV9jcHVfcHJlcCB7CiAJdWludDMyX3QgaGFuZGxlOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kcm0vcmFkZW9uX2RybS5oIGIvaW5jbHVkZS9kcm0vcmFkZW9uX2RybS5oCmluZGV4IDEwZjhiNTMuLmU5NWE4NmIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvZHJtL3JhZGVvbl9kcm0uaAorKysgYi9pbmNsdWRlL2RybS9yYWRlb25fZHJtLmgKQEAgLTkwNiw2ICs5MDYsNyBAQAogI2RlZmluZSBSQURFT05fSU5GT19BQ0NFTF9XT1JLSU5HMgkweDA1CiAjZGVmaW5lIFJBREVPTl9JTkZPX1RJTElOR19DT05GSUcJMHgwNgogI2RlZmluZSBSQURFT05fSU5GT19XQU5UX0hZUEVSWgkJMHgwNworI2RlZmluZSBSQURFT05fSU5GT19XQU5UX0NNQVNLCQkweDA4IC8qIGdldCBhY2Nlc3MgdG8gQ01BU0sgb24gcjMwMCAqLwogCiBzdHJ1Y3QgZHJtX3JhZGVvbl9pbmZvIHsKIAl1aW50MzJfdAkJcmVxdWVzdDsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZHJtL3R0bS90dG1fYm9fYXBpLmggYi9pbmNsdWRlL2RybS90dG0vdHRtX2JvX2FwaS5oCmluZGV4IGJlYWZjMTUuLjUwODUyYWEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvZHJtL3R0bS90dG1fYm9fYXBpLmgKKysrIGIvaW5jbHVkZS9kcm0vdHRtL3R0bV9ib19hcGkuaApAQCAtNzQsNiArNzQsOCBAQAogICogQGlzX2lvbWVtOgkJaXMgdGhpcyBpbyBtZW1vcnkgPwogICogQHNpemU6CQlzaXplIGluIGJ5dGUKICAqIEBvZmZzZXQ6CQlvZmZzZXQgZnJvbSB0aGUgYmFzZSBhZGRyZXNzCisgKiBAaW9fcmVzZXJ2ZWRfdm06ICAgICBUaGUgVk0gc3lzdGVtIGhhcyBhIHJlZmNvdW50IGluIEBpb19yZXNlcnZlZF9jb3VudAorICogQGlvX3Jlc2VydmVkX2NvdW50OiAgUmVmY291bnRpbmcgdGhlIG51bWJlcnMgb2YgY2FsbGVycyB0byB0dG1fbWVtX2lvX3Jlc2VydmUKICAqCiAgKiBTdHJ1Y3R1cmUgaW5kaWNhdGluZyB0aGUgYnVzIHBsYWNlbWVudCBvZiBhbiBvYmplY3QuCiAgKi8KQEAgLTgzLDcgKzg1LDggQEAKIAl1bnNpZ25lZCBsb25nCXNpemU7CiAJdW5zaWduZWQgbG9uZwlvZmZzZXQ7CiAJYm9vbAkJaXNfaW9tZW07Ci0JYm9vbAkJaW9fcmVzZXJ2ZWQ7CisJYm9vbAkJaW9fcmVzZXJ2ZWRfdm07CisJdWludDY0X3QgICAgICAgIGlvX3Jlc2VydmVkX2NvdW50OwogfTsKIAogCkBAIC0xNTQsNyArMTU3LDYgQEAKICAqIGtlZXBzIG9uZSByZWZjb3VudC4gV2hlbiB0aGlzIHJlZmNvdW50IHJlYWNoZXMgemVybywKICAqIHRoZSBvYmplY3QgaXMgZGVzdHJveWVkLgogICogQGV2ZW50X3F1ZXVlOiBRdWV1ZSBmb3IgcHJvY2Vzc2VzIHdhaXRpbmcgb24gYnVmZmVyIG9iamVjdCBzdGF0dXMgY2hhbmdlLgotICogQGxvY2s6IHNwaW5sb2NrIHByb3RlY3RpbmcgbW9zdGx5IHN5bmNocm9uaXphdGlvbiBtZW1iZXJzLgogICogQG1lbTogc3RydWN0dXJlIGRlc2NyaWJpbmcgY3VycmVudCBwbGFjZW1lbnQuCiAgKiBAcGVyc2lzdGFudF9zd2FwX3N0b3JhZ2U6IFVzdWFsbHkgdGhlIHN3YXAgc3RvcmFnZSBpcyBkZWxldGVkIGZvciBidWZmZXJzCiAgKiBwaW5uZWQgaW4gcGh5c2ljYWwgbWVtb3J5LiBJZiB0aGlzIGJlaGF2aW91ciBpcyBub3QgZGVzaXJlZCwgdGhpcyBtZW1iZXIKQEAgLTIxMyw3ICsyMTUsNiBAQAogCXN0cnVjdCBrcmVmIGtyZWY7CiAJc3RydWN0IGtyZWYgbGlzdF9rcmVmOwogCXdhaXRfcXVldWVfaGVhZF90IGV2ZW50X3F1ZXVlOwotCXNwaW5sb2NrX3QgbG9jazsKIAogCS8qKgogCSAqIE1lbWJlcnMgcHJvdGVjdGVkIGJ5IHRoZSBibzo6cmVzZXJ2ZWQgbG9jay4KQEAgLTIzNyw2ICsyMzgsNyBAQAogCXN0cnVjdCBsaXN0X2hlYWQgbHJ1OwogCXN0cnVjdCBsaXN0X2hlYWQgZGRlc3Ryb3k7CiAJc3RydWN0IGxpc3RfaGVhZCBzd2FwOworCXN0cnVjdCBsaXN0X2hlYWQgaW9fcmVzZXJ2ZV9scnU7CiAJdWludDMyX3QgdmFsX3NlcTsKIAlib29sIHNlcV92YWxpZDsKIApAQCAtMjQ4LDEwICsyNTAsMTAgQEAKIAlhdG9taWNfdCByZXNlcnZlZDsKIAogCS8qKgotCSAqIE1lbWJlcnMgcHJvdGVjdGVkIGJ5IHRoZSBibzo6bG9jaworCSAqIE1lbWJlcnMgcHJvdGVjdGVkIGJ5IHN0cnVjdCBidWZmZXJfb2JqZWN0X2RldmljZTo6ZmVuY2VfbG9jawogCSAqIEluIGFkZGl0aW9uLCBzZXR0aW5nIHN5bmNfb2JqIHRvIGFueXRoaW5nIGVsc2UKIAkgKiB0aGFuIE5VTEwgcmVxdWlyZXMgYm86OnJlc2VydmVkIHRvIGJlIGhlbGQuIFRoaXMgYWxsb3dzIGZvcgotCSAqIGNoZWNraW5nIE5VTEwgd2hpbGUgcmVzZXJ2ZWQgYnV0IG5vdCBob2xkaW5nIGJvOjpsb2NrLgorCSAqIGNoZWNraW5nIE5VTEwgd2hpbGUgcmVzZXJ2ZWQgYnV0IG5vdCBob2xkaW5nIHRoZSBtZW50aW9uZWQgbG9jay4KIAkgKi8KIAogCXZvaWQgKnN5bmNfb2JqX2FyZzsKQEAgLTM2NCw2ICszNjYsNDQgQEAKICAqLwogZXh0ZXJuIHZvaWQgdHRtX2JvX3VucmVmKHN0cnVjdCB0dG1fYnVmZmVyX29iamVjdCAqKmJvKTsKIAorCisvKioKKyAqIHR0bV9ib19saXN0X3JlZl9zdWIKKyAqCisgKiBAYm86IFRoZSBidWZmZXIgb2JqZWN0LgorICogQGNvdW50OiBUaGUgbnVtYmVyIG9mIHJlZmVyZW5jZXMgd2l0aCB3aGljaCB0byBkZWNyZWFzZSBAYm86Omxpc3Rfa3JlZjsKKyAqIEBuZXZlcl9mcmVlOiBUaGUgcmVmY291bnQgc2hvdWxkIG5vdCByZWFjaCB6ZXJvIHdpdGggdGhpcyBvcGVyYXRpb24uCisgKgorICogUmVsZWFzZSBAY291bnQgbHJ1IGxpc3QgcmVmZXJlbmNlcyB0byB0aGlzIGJ1ZmZlciBvYmplY3QuCisgKi8KK2V4dGVybiB2b2lkIHR0bV9ib19saXN0X3JlZl9zdWIoc3RydWN0IHR0bV9idWZmZXJfb2JqZWN0ICpibywgaW50IGNvdW50LAorCQkJCWJvb2wgbmV2ZXJfZnJlZSk7CisKKy8qKgorICogdHRtX2JvX2FkZF90b19scnUKKyAqCisgKiBAYm86IFRoZSBidWZmZXIgb2JqZWN0LgorICoKKyAqIEFkZCB0aGlzIGJvIHRvIHRoZSByZWxldmFudCBtZW0gdHlwZSBscnUgYW5kLCBpZiBpdCdzIGJhY2tlZCBieQorICogc3lzdGVtIHBhZ2VzICh0dG1zKSB0byB0aGUgc3dhcCBsaXN0LgorICogVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCB3aXRoIHN0cnVjdCB0dG1fYm9fZ2xvYmFsOjpscnVfbG9jayBoZWxkLCBhbmQKKyAqIGlzIHR5cGljYWxseSBjYWxsZWQgaW1tZWRpYXRlbHkgcHJpb3IgdG8gdW5yZXNlcnZpbmcgYSBiby4KKyAqLworZXh0ZXJuIHZvaWQgdHRtX2JvX2FkZF90b19scnUoc3RydWN0IHR0bV9idWZmZXJfb2JqZWN0ICpibyk7CisKKy8qKgorICogdHRtX2JvX2RlbF9mcm9tX2xydQorICoKKyAqIEBibzogVGhlIGJ1ZmZlciBvYmplY3QuCisgKgorICogUmVtb3ZlIHRoaXMgYm8gZnJvbSBhbGwgbHJ1IGxpc3RzIHVzZWQgdG8gbG9va3VwIGFuZCByZXNlcnZlIGFuIG9iamVjdC4KKyAqIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgd2l0aCBzdHJ1Y3QgdHRtX2JvX2dsb2JhbDo6bHJ1X2xvY2sgaGVsZCwKKyAqIGFuZCBpcyB1c3VhbGx5IGNhbGxlZCBqdXN0IGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBibyBoYXMgYmVlbiByZXNlcnZlZCB0bworICogYXZvaWQgcmVjdXJzaXZlIHJlc2VydmF0aW9uIGZyb20gbHJ1IGxpc3RzLgorICovCitleHRlcm4gaW50IHR0bV9ib19kZWxfZnJvbV9scnUoc3RydWN0IHR0bV9idWZmZXJfb2JqZWN0ICpibyk7CisKKwogLyoqCiAgKiB0dG1fYm9fbG9ja19kZWxheWVkX3dvcmtxdWV1ZQogICoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZHJtL3R0bS90dG1fYm9fZHJpdmVyLmggYi9pbmNsdWRlL2RybS90dG0vdHRtX2JvX2RyaXZlci5oCmluZGV4IDhlMGM4NDguLjFkYThhZjYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvZHJtL3R0bS90dG1fYm9fZHJpdmVyLmgKKysrIGIvaW5jbHVkZS9kcm0vdHRtL3R0bV9ib19kcml2ZXIuaApAQCAtMTc5LDMwICsxNzksNiBAQAogI2RlZmluZSBUVE1fTUVNVFlQRV9GTEFHX01BUFBBQkxFICAgICAgKDEgPDwgMSkJLyogTWVtb3J5IG1hcHBhYmxlICovCiAjZGVmaW5lIFRUTV9NRU1UWVBFX0ZMQUdfQ01BICAgICAgICAgICAoMSA8PCAzKQkvKiBDYW4ndCBtYXAgYXBlcnR1cmUgKi8KIAotLyoqCi0gKiBzdHJ1Y3QgdHRtX21lbV90eXBlX21hbmFnZXIKLSAqCi0gKiBAaGFzX3R5cGU6IFRoZSBtZW1vcnkgdHlwZSBoYXMgYmVlbiBpbml0aWFsaXplZC4KLSAqIEB1c2VfdHlwZTogVGhlIG1lbW9yeSB0eXBlIGlzIGVuYWJsZWQuCi0gKiBAZmxhZ3M6IFRUTV9NRU1UWVBFX1hYIGZsYWdzIGlkZW50aWZ5aW5nIHRoZSB0cmFpdHMgb2YgdGhlIG1lbW9yeQotICogbWFuYWdlZCBieSB0aGlzIG1lbW9yeSB0eXBlLgotICogQGdwdV9vZmZzZXQ6IElmIHVzZWQsIHRoZSBHUFUgb2Zmc2V0IG9mIHRoZSBmaXJzdCBtYW5hZ2VkIHBhZ2Ugb2YKLSAqIGZpeGVkIG1lbW9yeSBvciB0aGUgZmlyc3QgbWFuYWdlZCBsb2NhdGlvbiBpbiBhbiBhcGVydHVyZS4KLSAqIEBzaXplOiBTaXplIG9mIHRoZSBtYW5hZ2VkIHJlZ2lvbi4KLSAqIEBhdmFpbGFibGVfY2FjaGluZzogQSBtYXNrIG9mIGF2YWlsYWJsZSBjYWNoaW5nIHR5cGVzLCBUVE1fUExfRkxBR19YWCwKLSAqIGFzIGRlZmluZWQgaW4gdHRtX3BsYWNlbWVudF9jb21tb24uaAotICogQGRlZmF1bHRfY2FjaGluZzogVGhlIGRlZmF1bHQgY2FjaGluZyBwb2xpY3kgdXNlZCBmb3IgYSBidWZmZXIgb2JqZWN0Ci0gKiBwbGFjZWQgaW4gdGhpcyBtZW1vcnkgdHlwZSBpZiB0aGUgdXNlciBkb2Vzbid0IHByb3ZpZGUgb25lLgotICogQG1hbmFnZXI6IFRoZSByYW5nZSBtYW5hZ2VyIHVzZWQgZm9yIHRoaXMgbWVtb3J5IHR5cGUuIEZJWE1FOiBJZiB0aGUgYXBlcnR1cmUKLSAqIGhhcyBhIHBhZ2Ugc2l6ZSBkaWZmZXJlbnQgZnJvbSB0aGUgdW5kZXJseWluZyBzeXN0ZW0sIHRoZSBncmFudWxhcml0eQotICogb2YgdGhpcyBtYW5hZ2VyIHNob3VsZCB0YWtlIGNhcmUgb2YgdGhpcy4gQnV0IHRoZSByYW5nZSBhbGxvY2F0aW5nIGNvZGUKLSAqIGluIHR0bV9iby5jIG5lZWRzIHRvIGJlIG1vZGlmaWVkIGZvciB0aGlzLgotICogQGxydTogVGhlIGxydSBsaXN0IGZvciB0aGlzIG1lbW9yeSB0eXBlLgotICoKLSAqIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gaWRlbnRpZnkgYW5kIG1hbmFnZSBtZW1vcnkgdHlwZXMgZm9yIGEgZGV2aWNlLgotICogSXQncyBzZXQgdXAgYnkgdGhlIHR0bV9ib19kcml2ZXI6OmluaXRfbWVtX3R5cGUgbWV0aG9kLgotICovCi0KIHN0cnVjdCB0dG1fbWVtX3R5cGVfbWFuYWdlcjsKIAogc3RydWN0IHR0bV9tZW1fdHlwZV9tYW5hZ2VyX2Z1bmMgewpAQCAtMjg3LDYgKzI2MywzNiBAQAogCXZvaWQgKCpkZWJ1Zykoc3RydWN0IHR0bV9tZW1fdHlwZV9tYW5hZ2VyICptYW4sIGNvbnN0IGNoYXIgKnByZWZpeCk7CiB9OwogCisvKioKKyAqIHN0cnVjdCB0dG1fbWVtX3R5cGVfbWFuYWdlcgorICoKKyAqIEBoYXNfdHlwZTogVGhlIG1lbW9yeSB0eXBlIGhhcyBiZWVuIGluaXRpYWxpemVkLgorICogQHVzZV90eXBlOiBUaGUgbWVtb3J5IHR5cGUgaXMgZW5hYmxlZC4KKyAqIEBmbGFnczogVFRNX01FTVRZUEVfWFggZmxhZ3MgaWRlbnRpZnlpbmcgdGhlIHRyYWl0cyBvZiB0aGUgbWVtb3J5CisgKiBtYW5hZ2VkIGJ5IHRoaXMgbWVtb3J5IHR5cGUuCisgKiBAZ3B1X29mZnNldDogSWYgdXNlZCwgdGhlIEdQVSBvZmZzZXQgb2YgdGhlIGZpcnN0IG1hbmFnZWQgcGFnZSBvZgorICogZml4ZWQgbWVtb3J5IG9yIHRoZSBmaXJzdCBtYW5hZ2VkIGxvY2F0aW9uIGluIGFuIGFwZXJ0dXJlLgorICogQHNpemU6IFNpemUgb2YgdGhlIG1hbmFnZWQgcmVnaW9uLgorICogQGF2YWlsYWJsZV9jYWNoaW5nOiBBIG1hc2sgb2YgYXZhaWxhYmxlIGNhY2hpbmcgdHlwZXMsIFRUTV9QTF9GTEFHX1hYLAorICogYXMgZGVmaW5lZCBpbiB0dG1fcGxhY2VtZW50X2NvbW1vbi5oCisgKiBAZGVmYXVsdF9jYWNoaW5nOiBUaGUgZGVmYXVsdCBjYWNoaW5nIHBvbGljeSB1c2VkIGZvciBhIGJ1ZmZlciBvYmplY3QKKyAqIHBsYWNlZCBpbiB0aGlzIG1lbW9yeSB0eXBlIGlmIHRoZSB1c2VyIGRvZXNuJ3QgcHJvdmlkZSBvbmUuCisgKiBAZnVuYzogc3RydWN0dXJlIHBvaW50ZXIgaW1wbGVtZW50aW5nIHRoZSByYW5nZSBtYW5hZ2VyLiBTZWUgYWJvdmUKKyAqIEBwcml2OiBEcml2ZXIgcHJpdmF0ZSBjbG9zdXJlIGZvciBAZnVuYy4KKyAqIEBpb19yZXNlcnZlX211dGV4OiBNdXRleCBvcHRpb25hbGx5IHByb3RlY3Rpbmcgc2hhcmVkIGlvX3Jlc2VydmUgc3RydWN0dXJlcworICogQHVzZV9pb19yZXNlcnZlX2xydTogVXNlIGFuIGxydSBsaXN0IHRvIHRyeSB0byB1bnJlc2VydmUgaW9fbWVtX3JlZ2lvbnMKKyAqIHJlc2VydmVkIGJ5IHRoZSBUVE0gdm0gc3lzdGVtLgorICogQGlvX3Jlc2VydmVfbHJ1OiBPcHRpb25hbCBscnUgbGlzdCBmb3IgdW5yZXNlcnZpbmcgaW8gbWVtIHJlZ2lvbnMuCisgKiBAaW9fcmVzZXJ2ZV9mYXN0cGF0aDogT25seSB1c2UgYmRldjo6ZHJpdmVyOjppb19tZW1fcmVzZXJ2ZSB0byBvYnRhaW4KKyAqIHN0YXRpYyBpbmZvcm1hdGlvbi4gYmRldjo6ZHJpdmVyOjppb19tZW1fZnJlZSBpcyBuZXZlciB1c2VkLgorICogQGxydTogVGhlIGxydSBsaXN0IGZvciB0aGlzIG1lbW9yeSB0eXBlLgorICoKKyAqIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gaWRlbnRpZnkgYW5kIG1hbmFnZSBtZW1vcnkgdHlwZXMgZm9yIGEgZGV2aWNlLgorICogSXQncyBzZXQgdXAgYnkgdGhlIHR0bV9ib19kcml2ZXI6OmluaXRfbWVtX3R5cGUgbWV0aG9kLgorICovCisKKworCiBzdHJ1Y3QgdHRtX21lbV90eXBlX21hbmFnZXIgewogCXN0cnVjdCB0dG1fYm9fZGV2aWNlICpiZGV2OwogCkBAIC0zMDMsNiArMzA5LDE1IEBACiAJdWludDMyX3QgZGVmYXVsdF9jYWNoaW5nOwogCWNvbnN0IHN0cnVjdCB0dG1fbWVtX3R5cGVfbWFuYWdlcl9mdW5jICpmdW5jOwogCXZvaWQgKnByaXY7CisJc3RydWN0IG11dGV4IGlvX3Jlc2VydmVfbXV0ZXg7CisJYm9vbCB1c2VfaW9fcmVzZXJ2ZV9scnU7CisJYm9vbCBpb19yZXNlcnZlX2Zhc3RwYXRoOworCisJLyoKKwkgKiBQcm90ZWN0ZWQgYnkgQGlvX3Jlc2VydmVfbXV0ZXg6CisJICovCisKKwlzdHJ1Y3QgbGlzdF9oZWFkIGlvX3Jlc2VydmVfbHJ1OwogCiAJLyoKIAkgKiBQcm90ZWN0ZWQgYnkgdGhlIGdsb2JhbC0+bHJ1X2xvY2suCkBAIC01MTAsOSArNTI1LDEyIEBACiAgKgogICogQGRyaXZlcjogUG9pbnRlciB0byBhIHN0cnVjdCB0dG1fYm9fZHJpdmVyIHN0cnVjdCBzZXR1cCBieSB0aGUgZHJpdmVyLgogICogQG1hbjogQW4gYXJyYXkgb2YgbWVtX3R5cGVfbWFuYWdlcnMuCisgKiBAZmVuY2VfbG9jazogUHJvdGVjdHMgdGhlIHN5bmNocm9uaXppbmcgbWVtYmVycyBvbiAqYWxsKiBib3MgYmVsb25naW5nCisgKiB0byB0aGlzIGRldmljZS4KICAqIEBhZGRyX3NwYWNlX21tOiBSYW5nZSBtYW5hZ2VyIGZvciB0aGUgZGV2aWNlIGFkZHJlc3Mgc3BhY2UuCiAgKiBscnVfbG9jazogU3BpbmxvY2sgdGhhdCBwcm90ZWN0cyB0aGUgYnVmZmVyK2RldmljZSBscnUgbGlzdHMgYW5kCiAgKiBkZGVzdHJveSBsaXN0cy4KKyAqIEB2YWxfc2VxOiBDdXJyZW50IHZhbGlkYXRpb24gc2VxdWVuY2UuCiAgKiBAbmljZV9tb2RlOiBUcnkgbmljZWx5IHRvIHdhaXQgZm9yIGJ1ZmZlciBpZGxlIHdoZW4gY2xlYW5pbmcgYSBtYW5hZ2VyLgogICogSWYgYSBHUFUgbG9ja3VwIGhhcyBiZWVuIGRldGVjdGVkLCB0aGlzIGlzIGZvcmNlZCB0byAwLgogICogQGRldl9tYXBwaW5nOiBBIHBvaW50ZXIgdG8gdGhlIHN0cnVjdCBhZGRyZXNzX3NwYWNlIHJlcHJlc2VudGluZyB0aGUKQEAgLTUzMSw2ICs1NDksNyBAQAogCXN0cnVjdCB0dG1fYm9fZHJpdmVyICpkcml2ZXI7CiAJcndsb2NrX3Qgdm1fbG9jazsKIAlzdHJ1Y3QgdHRtX21lbV90eXBlX21hbmFnZXIgbWFuW1RUTV9OVU1fTUVNX1RZUEVTXTsKKwlzcGlubG9ja190IGZlbmNlX2xvY2s7CiAJLyoKIAkgKiBQcm90ZWN0ZWQgYnkgdGhlIHZtIGxvY2suCiAJICovCkBAIC01NDEsNiArNTYwLDcgQEAKIAkgKiBQcm90ZWN0ZWQgYnkgdGhlIGdsb2JhbDpscnUgbG9jay4KIAkgKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkIGRkZXN0cm95OworCXVpbnQzMl90IHZhbF9zZXE7CiAKIAkvKgogCSAqIFByb3RlY3RlZCBieSBsb2FkIC8gZmlyc3RvcGVuIC8gbGFzdGNsb3NlIC91bmxvYWQgc3luYy4KQEAgLTc1MywzMSArNzczLDYgQEAKIAogZXh0ZXJuIGludCB0dG1fYm9fd2FpdF9jcHUoc3RydWN0IHR0bV9idWZmZXJfb2JqZWN0ICpibywgYm9vbCBub193YWl0KTsKIAotLyoqCi0gKiB0dG1fYm9fcGNpX29mZnNldCAtIEdldCB0aGUgUENJIG9mZnNldCBmb3IgdGhlIGJ1ZmZlciBvYmplY3QgbWVtb3J5LgotICoKLSAqIEBibyBQb2ludGVyIHRvIGEgc3RydWN0IHR0bV9idWZmZXJfb2JqZWN0LgotICogQGJ1c19iYXNlIE9uIHJldHVybiB0aGUgYmFzZSBvZiB0aGUgUENJIHJlZ2lvbgotICogQGJ1c19vZmZzZXQgT24gcmV0dXJuIHRoZSBieXRlIG9mZnNldCBpbnRvIHRoZSBQQ0kgcmVnaW9uCi0gKiBAYnVzX3NpemUgT24gcmV0dXJuIHRoZSBieXRlIHNpemUgb2YgdGhlIGJ1ZmZlciBvYmplY3Qgb3IgemVybyBpZgotICogdGhlIGJ1ZmZlciBvYmplY3QgbWVtb3J5IGlzIG5vdCBhY2Nlc3NpYmxlIHRocm91Z2ggYSBQQ0kgcmVnaW9uLgotICoKLSAqIFJldHVybnM6Ci0gKiAtRUlOVkFMIGlmIHRoZSBidWZmZXIgb2JqZWN0IGlzIGN1cnJlbnRseSBub3QgbWFwcGFibGUuCi0gKiAwIG90aGVyd2lzZS4KLSAqLwotCi1leHRlcm4gaW50IHR0bV9ib19wY2lfb2Zmc2V0KHN0cnVjdCB0dG1fYm9fZGV2aWNlICpiZGV2LAotCQkJICAgICBzdHJ1Y3QgdHRtX21lbV9yZWcgKm1lbSwKLQkJCSAgICAgdW5zaWduZWQgbG9uZyAqYnVzX2Jhc2UsCi0JCQkgICAgIHVuc2lnbmVkIGxvbmcgKmJ1c19vZmZzZXQsCi0JCQkgICAgIHVuc2lnbmVkIGxvbmcgKmJ1c19zaXplKTsKLQotZXh0ZXJuIGludCB0dG1fbWVtX2lvX3Jlc2VydmUoc3RydWN0IHR0bV9ib19kZXZpY2UgKmJkZXYsCi0JCQkJc3RydWN0IHR0bV9tZW1fcmVnICptZW0pOwotZXh0ZXJuIHZvaWQgdHRtX21lbV9pb19mcmVlKHN0cnVjdCB0dG1fYm9fZGV2aWNlICpiZGV2LAotCQkJCXN0cnVjdCB0dG1fbWVtX3JlZyAqbWVtKTsKLQogZXh0ZXJuIHZvaWQgdHRtX2JvX2dsb2JhbF9yZWxlYXNlKHN0cnVjdCBkcm1fZ2xvYmFsX3JlZmVyZW5jZSAqcmVmKTsKIGV4dGVybiBpbnQgdHRtX2JvX2dsb2JhbF9pbml0KHN0cnVjdCBkcm1fZ2xvYmFsX3JlZmVyZW5jZSAqcmVmKTsKIApAQCAtODEwLDYgKzgwNSwyMiBAQAogZXh0ZXJuIHZvaWQgdHRtX2JvX3VubWFwX3ZpcnR1YWwoc3RydWN0IHR0bV9idWZmZXJfb2JqZWN0ICpibyk7CiAKIC8qKgorICogdHRtX2JvX3VubWFwX3ZpcnR1YWwKKyAqCisgKiBAYm86IHRlYXIgZG93biB0aGUgdmlydHVhbCBtYXBwaW5ncyBmb3IgdGhpcyBCTworICoKKyAqIFRoZSBjYWxsZXIgbXVzdCB0YWtlIHR0bV9tZW1faW9fbG9jayBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLgorICovCitleHRlcm4gdm9pZCB0dG1fYm9fdW5tYXBfdmlydHVhbF9sb2NrZWQoc3RydWN0IHR0bV9idWZmZXJfb2JqZWN0ICpibyk7CisKK2V4dGVybiBpbnQgdHRtX21lbV9pb19yZXNlcnZlX3ZtKHN0cnVjdCB0dG1fYnVmZmVyX29iamVjdCAqYm8pOworZXh0ZXJuIHZvaWQgdHRtX21lbV9pb19mcmVlX3ZtKHN0cnVjdCB0dG1fYnVmZmVyX29iamVjdCAqYm8pOworZXh0ZXJuIGludCB0dG1fbWVtX2lvX2xvY2soc3RydWN0IHR0bV9tZW1fdHlwZV9tYW5hZ2VyICptYW4sCisJCQkgICBib29sIGludGVycnVwdGlibGUpOworZXh0ZXJuIHZvaWQgdHRtX21lbV9pb191bmxvY2soc3RydWN0IHR0bV9tZW1fdHlwZV9tYW5hZ2VyICptYW4pOworCisKKy8qKgogICogdHRtX2JvX3Jlc2VydmU6CiAgKgogICogQGJvOiBBIHBvaW50ZXIgdG8gYSBzdHJ1Y3QgdHRtX2J1ZmZlcl9vYmplY3QuCkBAIC04NTksMTEgKzg3MCw0NCBAQAogICogdHJ5IGFnYWluLiAob25seSBpZiB1c2Vfc2VxdWVuY2UgPT0gMSkuCiAgKiAtRVJFU1RBUlRTWVM6IEEgd2FpdCBmb3IgdGhlIGJ1ZmZlciB0byBiZWNvbWUgdW5yZXNlcnZlZCB3YXMgaW50ZXJydXB0ZWQgYnkKICAqIGEgc2lnbmFsLiBSZWxlYXNlIGFsbCBidWZmZXIgcmVzZXJ2YXRpb25zIGFuZCByZXR1cm4gdG8gdXNlci1zcGFjZS4KKyAqIC1FQlVTWTogVGhlIGZ1bmN0aW9uIG5lZWRlZCB0byBzbGVlcCwgYnV0IEBub193YWl0IHdhcyB0cnVlCisgKiAtRURFQURMSzogQm8gYWxyZWFkeSByZXNlcnZlZCB1c2luZyBAc2VxdWVuY2UuIFRoaXMgZXJyb3IgY29kZSB3aWxsIG9ubHkKKyAqIGJlIHJldHVybmVkIGlmIEB1c2Vfc2VxdWVuY2UgaXMgc2V0IHRvIHRydWUuCiAgKi8KIGV4dGVybiBpbnQgdHRtX2JvX3Jlc2VydmUoc3RydWN0IHR0bV9idWZmZXJfb2JqZWN0ICpibywKIAkJCSAgYm9vbCBpbnRlcnJ1cHRpYmxlLAogCQkJICBib29sIG5vX3dhaXQsIGJvb2wgdXNlX3NlcXVlbmNlLCB1aW50MzJfdCBzZXF1ZW5jZSk7CiAKKworLyoqCisgKiB0dG1fYm9fcmVzZXJ2ZV9sb2NrZWQ6CisgKgorICogQGJvOiBBIHBvaW50ZXIgdG8gYSBzdHJ1Y3QgdHRtX2J1ZmZlcl9vYmplY3QuCisgKiBAaW50ZXJydXB0aWJsZTogU2xlZXAgaW50ZXJydXB0aWJsZSBpZiB3YWl0aW5nLgorICogQG5vX3dhaXQ6IERvbid0IHNsZWVwIHdoaWxlIHRyeWluZyB0byByZXNlcnZlLCByYXRoZXIgcmV0dXJuIC1FQlVTWS4KKyAqIEB1c2Vfc2VxdWVuY2U6IElmIEBibyBpcyBhbHJlYWR5IHJlc2VydmVkLCBPbmx5IHNsZWVwIHdhaXRpbmcgZm9yCisgKiBpdCB0byBiZWNvbWUgdW5yZXNlcnZlZCBpZiBAc2VxdWVuY2UgPCAoQGJvKS0+c2VxdWVuY2UuCisgKgorICogTXVzdCBiZSBjYWxsZWQgd2l0aCBzdHJ1Y3QgdHRtX2JvX2dsb2JhbDo6bHJ1X2xvY2sgaGVsZCwKKyAqIGFuZCB3aWxsIG5vdCByZW1vdmUgcmVzZXJ2ZWQgYnVmZmVycyBmcm9tIHRoZSBscnUgbGlzdHMuCisgKiBUaGUgZnVuY3Rpb24gbWF5IHJlbGVhc2UgdGhlIExSVSBzcGlubG9jayBpZiBpdCBuZWVkcyB0byBzbGVlcC4KKyAqIE90aGVyd2lzZSBpZGVudGljYWwgdG8gdHRtX2JvX3Jlc2VydmUuCisgKgorICogUmV0dXJuczoKKyAqIC1FQUdBSU46IFRoZSByZXNlcnZhdGlvbiBtYXkgY2F1c2UgYSBkZWFkbG9jay4KKyAqIFJlbGVhc2UgYWxsIGJ1ZmZlciByZXNlcnZhdGlvbnMsIHdhaXQgZm9yIEBibyB0byBiZWNvbWUgdW5yZXNlcnZlZCBhbmQKKyAqIHRyeSBhZ2Fpbi4gKG9ubHkgaWYgdXNlX3NlcXVlbmNlID09IDEpLgorICogLUVSRVNUQVJUU1lTOiBBIHdhaXQgZm9yIHRoZSBidWZmZXIgdG8gYmVjb21lIHVucmVzZXJ2ZWQgd2FzIGludGVycnVwdGVkIGJ5CisgKiBhIHNpZ25hbC4gUmVsZWFzZSBhbGwgYnVmZmVyIHJlc2VydmF0aW9ucyBhbmQgcmV0dXJuIHRvIHVzZXItc3BhY2UuCisgKiAtRUJVU1k6IFRoZSBmdW5jdGlvbiBuZWVkZWQgdG8gc2xlZXAsIGJ1dCBAbm9fd2FpdCB3YXMgdHJ1ZQorICogLUVERUFETEs6IEJvIGFscmVhZHkgcmVzZXJ2ZWQgdXNpbmcgQHNlcXVlbmNlLiBUaGlzIGVycm9yIGNvZGUgd2lsbCBvbmx5CisgKiBiZSByZXR1cm5lZCBpZiBAdXNlX3NlcXVlbmNlIGlzIHNldCB0byB0cnVlLgorICovCitleHRlcm4gaW50IHR0bV9ib19yZXNlcnZlX2xvY2tlZChzdHJ1Y3QgdHRtX2J1ZmZlcl9vYmplY3QgKmJvLAorCQkJCSBib29sIGludGVycnVwdGlibGUsCisJCQkJIGJvb2wgbm9fd2FpdCwgYm9vbCB1c2Vfc2VxdWVuY2UsCisJCQkJIHVpbnQzMl90IHNlcXVlbmNlKTsKKwogLyoqCiAgKiB0dG1fYm9fdW5yZXNlcnZlCiAgKgpAQCAtODc0LDYgKzkxOCwxNiBAQAogZXh0ZXJuIHZvaWQgdHRtX2JvX3VucmVzZXJ2ZShzdHJ1Y3QgdHRtX2J1ZmZlcl9vYmplY3QgKmJvKTsKIAogLyoqCisgKiB0dG1fYm9fdW5yZXNlcnZlX2xvY2tlZAorICoKKyAqIEBibzogQSBwb2ludGVyIHRvIGEgc3RydWN0IHR0bV9idWZmZXJfb2JqZWN0LgorICoKKyAqIFVucmVzZXJ2ZSBhIHByZXZpb3VzIHJlc2VydmF0aW9uIG9mIEBiby4KKyAqIE5lZWRzIHRvIGJlIGNhbGxlZCB3aXRoIHN0cnVjdCB0dG1fYm9fZ2xvYmFsOjpscnVfbG9jayBoZWxkLgorICovCitleHRlcm4gdm9pZCB0dG1fYm9fdW5yZXNlcnZlX2xvY2tlZChzdHJ1Y3QgdHRtX2J1ZmZlcl9vYmplY3QgKmJvKTsKKworLyoqCiAgKiB0dG1fYm9fd2FpdF91bnJlc2VydmVkCiAgKgogICogQGJvOiBBIHBvaW50ZXIgdG8gYSBzdHJ1Y3QgdHRtX2J1ZmZlcl9vYmplY3QuCmRpZmYgLS1naXQgYS9pbmNsdWRlL2RybS90dG0vdHRtX2V4ZWNidWZfdXRpbC5oIGIvaW5jbHVkZS9kcm0vdHRtL3R0bV9leGVjYnVmX3V0aWwuaAppbmRleCBjZDJjNDc1Li4yNmNjN2Y5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2RybS90dG0vdHRtX2V4ZWNidWZfdXRpbC5oCisrKyBiL2luY2x1ZGUvZHJtL3R0bS90dG1fZXhlY2J1Zl91dGlsLmgKQEAgLTQxLDcgKzQxLDEwIEBACiAgKiBAYm86ICAgICAgICAgICAgIHJlZmNvdW50ZWQgYnVmZmVyIG9iamVjdCBwb2ludGVyLgogICogQG5ld19zeW5jX29ial9hcmc6IE5ldyBzeW5jX29ial9hcmcgZm9yIEBibywgdG8gYmUgdXNlZCBvbmNlCiAgKiBhZGRpbmcgYSBuZXcgc3luYyBvYmplY3QuCi0gKiBAcmVzZXJ2aWVkOiAgICAgIEluZGljYXRlcyB3aGV0aGVyIEBibyBoYXMgYmVlbiByZXNlcnZlZCBmb3IgdmFsaWRhdGlvbi4KKyAqIEByZXNlcnZlZDogICAgICAgSW5kaWNhdGVzIHdoZXRoZXIgQGJvIGhhcyBiZWVuIHJlc2VydmVkIGZvciB2YWxpZGF0aW9uLgorICogQHJlbW92ZWQ6ICAgICAgICBJbmRpY2F0ZXMgd2hldGhlciBAYm8gaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIGxydSBsaXN0cy4KKyAqIEBwdXRfY291bnQ6ICAgICAgTnVtYmVyIG9mIG91dHN0YW5kaW5nIHJlZmVyZW5jZXMgb24gYm86Omxpc3Rfa3JlZi4KKyAqIEBvbGRfc3luY19vYmo6ICAgUG9pbnRlciB0byBhIHN5bmMgb2JqZWN0IGFib3V0IHRvIGJlIHVucmVmZXJlbmNlZAogICovCiAKIHN0cnVjdCB0dG1fdmFsaWRhdGVfYnVmZmVyIHsKQEAgLTQ5LDYgKzUyLDkgQEAKIAlzdHJ1Y3QgdHRtX2J1ZmZlcl9vYmplY3QgKmJvOwogCXZvaWQgKm5ld19zeW5jX29ial9hcmc7CiAJYm9vbCByZXNlcnZlZDsKKwlib29sIHJlbW92ZWQ7CisJaW50IHB1dF9jb3VudDsKKwl2b2lkICpvbGRfc3luY19vYmo7CiB9OwogCiAvKioKQEAgLTY2LDcgKzcyLDYgQEAKICAqIGZ1bmN0aW9uIHR0bV9ldV9yZXNlcnZlX2J1ZmZlcnMKICAqCiAgKiBAbGlzdDogICAgdGhyZWFkIHByaXZhdGUgbGlzdCBvZiB0dG1fdmFsaWRhdGVfYnVmZmVyIHN0cnVjdHMuCi0gKiBAdmFsX3NlcTogQSB1bmlxdWUgc2VxdWVuY2UgbnVtYmVyLgogICoKICAqIFRyaWVzIHRvIHJlc2VydmUgYm9zIHBvaW50ZWQgdG8gYnkgdGhlIGxpc3QgZW50cmllcyBmb3IgdmFsaWRhdGlvbi4KICAqIElmIHRoZSBmdW5jdGlvbiByZXR1cm5zIDAsIGFsbCBidWZmZXJzIGFyZSBtYXJrZWQgYXMgInVuZmVuY2VkIiwKQEAgLTg4LDcgKzkzLDcgQEAKICAqIGhhcyBmYWlsZWQuCiAgKi8KIAotZXh0ZXJuIGludCB0dG1fZXVfcmVzZXJ2ZV9idWZmZXJzKHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsIHVpbnQzMl90IHZhbF9zZXEpOworZXh0ZXJuIGludCB0dG1fZXVfcmVzZXJ2ZV9idWZmZXJzKHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QpOwogCiAvKioKICAqIGZ1bmN0aW9uIHR0bV9ldV9mZW5jZV9idWZmZXJfb2JqZWN0cy4KZGlmZiAtLWdpdCBhL2luY2x1ZGUva2V5cy9lbmNyeXB0ZWQtdHlwZS5oIGIvaW5jbHVkZS9rZXlzL2VuY3J5cHRlZC10eXBlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTU4NTUwMQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUva2V5cy9lbmNyeXB0ZWQtdHlwZS5oCkBAIC0wLDAgKzEsMjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgSUJNIENvcnBvcmF0aW9uCisgKiBBdXRob3I6IE1pbWkgWm9oYXIgPHpvaGFyQHVzLmlibS5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfS0VZU19FTkNSWVBURURfVFlQRV9ICisjZGVmaW5lIF9LRVlTX0VOQ1JZUFRFRF9UWVBFX0gKKworI2luY2x1ZGUgPGxpbnV4L2tleS5oPgorI2luY2x1ZGUgPGxpbnV4L3JjdXBkYXRlLmg+CisKK3N0cnVjdCBlbmNyeXB0ZWRfa2V5X3BheWxvYWQgeworCXN0cnVjdCByY3VfaGVhZCByY3U7CisJY2hhciAqbWFzdGVyX2Rlc2M7CS8qIGRhdGFibG9iOiBtYXN0ZXIga2V5IG5hbWUgKi8KKwljaGFyICpkYXRhbGVuOwkJLyogZGF0YWJsb2I6IGRlY3J5cHRlZCBrZXkgbGVuZ3RoICovCisJdTggKml2OwkJCS8qIGRhdGFibG9iOiBpdiAqLworCXU4ICplbmNyeXB0ZWRfZGF0YTsJLyogZGF0YWJsb2I6IGVuY3J5cHRlZCBkYXRhICovCisJdW5zaWduZWQgc2hvcnQgZGF0YWJsb2JfbGVuOwkvKiBsZW5ndGggb2YgZGF0YWJsb2IgKi8KKwl1bnNpZ25lZCBzaG9ydCBkZWNyeXB0ZWRfZGF0YWxlbjsJLyogZGVjcnlwdGVkIGRhdGEgbGVuZ3RoICovCisJdTggZGVjcnlwdGVkX2RhdGFbMF07CS8qIGRlY3J5cHRlZCBkYXRhICsgIGRhdGFibG9iICsgaG1hYyAqLworfTsKKworZXh0ZXJuIHN0cnVjdCBrZXlfdHlwZSBrZXlfdHlwZV9lbmNyeXB0ZWQ7CisKKyNlbmRpZiAvKiBfS0VZU19FTkNSWVBURURfVFlQRV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2tleXMvdHJ1c3RlZC10eXBlLmggYi9pbmNsdWRlL2tleXMvdHJ1c3RlZC10eXBlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTZmODJlNQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUva2V5cy90cnVzdGVkLXR5cGUuaApAQCAtMCwwICsxLDMxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIElCTSBDb3Jwb3JhdGlvbgorICogQXV0aG9yOiBEYXZpZCBTYWZmb3JkIDxzYWZmb3JkQHVzLmlibS5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfS0VZU19UUlVTVEVEX1RZUEVfSAorI2RlZmluZSBfS0VZU19UUlVTVEVEX1RZUEVfSAorCisjaW5jbHVkZSA8bGludXgva2V5Lmg+CisjaW5jbHVkZSA8bGludXgvcmN1cGRhdGUuaD4KKworI2RlZmluZSBNSU5fS0VZX1NJWkUJCQkzMgorI2RlZmluZSBNQVhfS0VZX1NJWkUJCQkxMjgKKyNkZWZpbmUgTUFYX0JMT0JfU0laRQkJCTMyMAorCitzdHJ1Y3QgdHJ1c3RlZF9rZXlfcGF5bG9hZCB7CisJc3RydWN0IHJjdV9oZWFkIHJjdTsKKwl1bnNpZ25lZCBpbnQga2V5X2xlbjsKKwl1bnNpZ25lZCBpbnQgYmxvYl9sZW47CisJdW5zaWduZWQgY2hhciBtaWdyYXRhYmxlOworCXVuc2lnbmVkIGNoYXIga2V5W01BWF9LRVlfU0laRSArIDFdOworCXVuc2lnbmVkIGNoYXIgYmxvYltNQVhfQkxPQl9TSVpFXTsKK307CisKK2V4dGVybiBzdHJ1Y3Qga2V5X3R5cGUga2V5X3R5cGVfdHJ1c3RlZDsKKworI2VuZGlmIC8qIF9LRVlTX1RSVVNURURfVFlQRV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L0tidWlsZCBiL2luY2x1ZGUvbGludXgvS2J1aWxkCmluZGV4IGEzNTRjMTkuLmQxNTgwYzEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvS2J1aWxkCisrKyBiL2luY2x1ZGUvbGludXgvS2J1aWxkCkBAIC0yMCwxNSArMjAsMTggQEAKIG9iamhkci15ICs9IHZlcnNpb24uaAogCiBpZm5lcSAoJCh3aWxkY2FyZCAkKHNyY3RyZWUpL2FyY2gvJChTUkNBUkNIKS9pbmNsdWRlL2FzbS9hLm91dC5oIFwKLQkJICAkKHNyY3RyZWUpL2luY2x1ZGUvYXNtLSQoU1JDQVJDSCkvYS5vdXQuaCksKQorCQkgICQoc3JjdHJlZSkvaW5jbHVkZS9hc20tJChTUkNBUkNIKS9hLm91dC5oIFwKKwkJICAkKElOU1RBTExfSERSX1BBVEgpL2luY2x1ZGUvYXNtLSovYS5vdXQuaCksKQogaGVhZGVyLXkgKz0gYS5vdXQuaAogZW5kaWYKIGlmbmVxICgkKHdpbGRjYXJkICQoc3JjdHJlZSkvYXJjaC8kKFNSQ0FSQ0gpL2luY2x1ZGUvYXNtL2t2bS5oIFwKLQkJICAkKHNyY3RyZWUpL2luY2x1ZGUvYXNtLSQoU1JDQVJDSCkva3ZtLmgpLCkKKwkJICAkKHNyY3RyZWUpL2luY2x1ZGUvYXNtLSQoU1JDQVJDSCkva3ZtLmggXAorCQkgICQoSU5TVEFMTF9IRFJfUEFUSCkvaW5jbHVkZS9hc20tKi9rdm0uaCksKQogaGVhZGVyLXkgKz0ga3ZtLmgKIGVuZGlmCiBpZm5lcSAoJCh3aWxkY2FyZCAkKHNyY3RyZWUpL2FyY2gvJChTUkNBUkNIKS9pbmNsdWRlL2FzbS9rdm1fcGFyYS5oIFwKLQkJICAkKHNyY3RyZWUpL2luY2x1ZGUvYXNtLSQoU1JDQVJDSCkva3ZtX3BhcmEuaCksKQorCQkgICQoc3JjdHJlZSkvaW5jbHVkZS9hc20tJChTUkNBUkNIKS9rdm1fcGFyYS5oIFwKKwkJICAkKElOU1RBTExfSERSX1BBVEgpL2luY2x1ZGUvYXNtLSova3ZtX3BhcmEuaCksKQogaGVhZGVyLXkgKz0ga3ZtX3BhcmEuaAogZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9hZ3BfYmFja2VuZC5oIGIvaW5jbHVkZS9saW51eC9hZ3BfYmFja2VuZC5oCmluZGV4IDA5ZWE0YTEuLmVhZjZjZDcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvYWdwX2JhY2tlbmQuaAorKysgYi9pbmNsdWRlL2xpbnV4L2FncF9iYWNrZW5kLmgKQEAgLTEwMiwxMCArMTAyLDggQEAKIGV4dGVybiBpbnQgYWdwX2NvcHlfaW5mbyhzdHJ1Y3QgYWdwX2JyaWRnZV9kYXRhICosIHN0cnVjdCBhZ3Bfa2Vybl9pbmZvICopOwogZXh0ZXJuIGludCBhZ3BfYmluZF9tZW1vcnkoc3RydWN0IGFncF9tZW1vcnkgKiwgb2ZmX3QpOwogZXh0ZXJuIGludCBhZ3BfdW5iaW5kX21lbW9yeShzdHJ1Y3QgYWdwX21lbW9yeSAqKTsKLWV4dGVybiBpbnQgYWdwX3JlYmluZF9tZW1vcnkodm9pZCk7CiBleHRlcm4gdm9pZCBhZ3BfZW5hYmxlKHN0cnVjdCBhZ3BfYnJpZGdlX2RhdGEgKiwgdTMyKTsKIGV4dGVybiBzdHJ1Y3QgYWdwX2JyaWRnZV9kYXRhICphZ3BfYmFja2VuZF9hY3F1aXJlKHN0cnVjdCBwY2lfZGV2ICopOwogZXh0ZXJuIHZvaWQgYWdwX2JhY2tlbmRfcmVsZWFzZShzdHJ1Y3QgYWdwX2JyaWRnZV9kYXRhICopOwotZXh0ZXJuIHZvaWQgYWdwX2ZsdXNoX2NoaXBzZXQoc3RydWN0IGFncF9icmlkZ2VfZGF0YSAqKTsKIAogI2VuZGlmCQkJCS8qIF9BR1BfQkFDS0VORF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2F1ZGl0LmggYi9pbmNsdWRlL2xpbnV4L2F1ZGl0LmgKaW5kZXggOGI1YzA2Mi4uMzU5ZGYwNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9hdWRpdC5oCisrKyBiL2luY2x1ZGUvbGludXgvYXVkaXQuaApAQCAtMzcyLDYgKzM3Miw3IEBACiBzdHJ1Y3QgYXVkaXRfY29udGV4dDsKIHN0cnVjdCBpbm9kZTsKIHN0cnVjdCBuZXRsaW5rX3NrYl9wYXJtczsKK3N0cnVjdCBwYXRoOwogc3RydWN0IGxpbnV4X2JpbnBybTsKIHN0cnVjdCBtcV9hdHRyOwogc3RydWN0IG1xc3RhdDsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvY2FwYWJpbGl0eS5oIGIvaW5jbHVkZS9saW51eC9jYXBhYmlsaXR5LmgKaW5kZXggOTAwMTJiOS4uZmIxNmEzNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9jYXBhYmlsaXR5LmgKKysrIGIvaW5jbHVkZS9saW51eC9jYXBhYmlsaXR5LmgKQEAgLTI0Niw3ICsyNDYsNiBAQAogLyogQWxsb3cgY29uZmlndXJhdGlvbiBvZiB0aGUgc2VjdXJlIGF0dGVudGlvbiBrZXkgKi8KIC8qIEFsbG93IGFkbWluaXN0cmF0aW9uIG9mIHRoZSByYW5kb20gZGV2aWNlICovCiAvKiBBbGxvdyBleGFtaW5hdGlvbiBhbmQgY29uZmlndXJhdGlvbiBvZiBkaXNrIHF1b3RhcyAqLwotLyogQWxsb3cgY29uZmlndXJpbmcgdGhlIGtlcm5lbCdzIHN5c2xvZyAocHJpbnRrIGJlaGF2aW91cikgKi8KIC8qIEFsbG93IHNldHRpbmcgdGhlIGRvbWFpbm5hbWUgKi8KIC8qIEFsbG93IHNldHRpbmcgdGhlIGhvc3RuYW1lICovCiAvKiBBbGxvdyBjYWxsaW5nIGJkZmx1c2goKSAqLwpAQCAtMzUyLDcgKzM1MSwxMSBAQAogCiAjZGVmaW5lIENBUF9NQUNfQURNSU4gICAgICAgIDMzCiAKLSNkZWZpbmUgQ0FQX0xBU1RfQ0FQICAgICAgICAgQ0FQX01BQ19BRE1JTgorLyogQWxsb3cgY29uZmlndXJpbmcgdGhlIGtlcm5lbCdzIHN5c2xvZyAocHJpbnRrIGJlaGF2aW91cikgKi8KKworI2RlZmluZSBDQVBfU1lTTE9HICAgICAgICAgICAzNAorCisjZGVmaW5lIENBUF9MQVNUX0NBUCAgICAgICAgIENBUF9TWVNMT0cKIAogI2RlZmluZSBjYXBfdmFsaWQoeCkgKCh4KSA+PSAwICYmICh4KSA8PSBDQVBfTEFTVF9DQVApCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZGNhY2hlLmggYi9pbmNsdWRlL2xpbnV4L2RjYWNoZS5oCmluZGV4IGJkMDc3NTguLjU5ZmNkMjQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZGNhY2hlLmgKKysrIGIvaW5jbHVkZS9saW51eC9kY2FjaGUuaApAQCAtMzA3LDcgKzMwNyw3IEBACiAgKiBfX2RfcmN1X3RvX3JlZmNvdW50IC0gdGFrZSBhIHJlZmNvdW50IG9uIGRlbnRyeSBpZiBzZXF1ZW5jZSBjaGVjayBpcyBvawogICogQGRlbnRyeTogZGVudHJ5IHRvIHRha2UgYSByZWYgb24KICAqIEBzZXE6IHNlcWNvdW50IHRvIHZlcmlmeSBhZ2FpbnN0Ci0gKiBAUmV0dXJuczogMCBvbiBmYWlsdXJlLCBlbHNlIDEuCisgKiBSZXR1cm5zOiAwIG9uIGZhaWx1cmUsIGVsc2UgMS4KICAqCiAgKiBfX2RfcmN1X3RvX3JlZmNvdW50IG9wZXJhdGVzIG9uIGEgZGVudHJ5LHNlcSBwYWlyIHRoYXQgd2FzIHJldHVybmVkCiAgKiBieSBfX2RfbG9va3VwX3JjdSwgdG8gZ2V0IGEgcmVmZXJlbmNlIG9uIGFuIHJjdS13YWxrIGRlbnRyeS4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZGNvb2tpZXMuaCBiL2luY2x1ZGUvbGludXgvZGNvb2tpZXMuaAppbmRleCAyNGM4MDZmLi41YWMzYmRkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2Rjb29raWVzLmgKKysrIGIvaW5jbHVkZS9saW51eC9kY29va2llcy5oCkBAIC0xMywxMCArMTMsMTAgQEAKICNpZmRlZiBDT05GSUdfUFJPRklMSU5HCiAgCiAjaW5jbHVkZSA8bGludXgvZGNhY2hlLmg+Ci0jaW5jbHVkZSA8bGludXgvcGF0aC5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAgCiBzdHJ1Y3QgZGNvb2tpZV91c2VyOworc3RydWN0IHBhdGg7CiAgCiAvKioKICAqIGRjb29raWVfcmVnaXN0ZXIgLSByZWdpc3RlciBhIHVzZXIgb2YgZGNvb2tpZXMKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZGV2aWNlLmggYi9pbmNsdWRlL2xpbnV4L2RldmljZS5oCmluZGV4IGRkNDg5NTMuLjFiZjVjZjAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZGV2aWNlLmgKKysrIGIvaW5jbHVkZS9saW51eC9kZXZpY2UuaApAQCAtMzAsOSArMzAsOCBAQAogc3RydWN0IGRldmljZV9kcml2ZXI7CiBzdHJ1Y3QgZHJpdmVyX3ByaXZhdGU7CiBzdHJ1Y3QgY2xhc3M7Ci1zdHJ1Y3QgY2xhc3NfcHJpdmF0ZTsKK3N0cnVjdCBzdWJzeXNfcHJpdmF0ZTsKIHN0cnVjdCBidXNfdHlwZTsKLXN0cnVjdCBidXNfdHlwZV9wcml2YXRlOwogc3RydWN0IGRldmljZV9ub2RlOwogCiBzdHJ1Y3QgYnVzX2F0dHJpYnV0ZSB7CkBAIC02NSw3ICs2NCw3IEBACiAKIAljb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyAqcG07CiAKLQlzdHJ1Y3QgYnVzX3R5cGVfcHJpdmF0ZSAqcDsKKwlzdHJ1Y3Qgc3Vic3lzX3ByaXZhdGUgKnA7CiB9OwogCiBleHRlcm4gaW50IF9fbXVzdF9jaGVjayBidXNfcmVnaXN0ZXIoc3RydWN0IGJ1c190eXBlICpidXMpOwpAQCAtMTk3LDYgKzE5Niw3IEBACiAKIAlzdHJ1Y3QgY2xhc3NfYXR0cmlidXRlCQkqY2xhc3NfYXR0cnM7CiAJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUJCSpkZXZfYXR0cnM7CisJc3RydWN0IGJpbl9hdHRyaWJ1dGUJCSpkZXZfYmluX2F0dHJzOwogCXN0cnVjdCBrb2JqZWN0CQkJKmRldl9rb2JqOwogCiAJaW50ICgqZGV2X3VldmVudCkoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3Qga29ial91ZXZlbnRfZW52ICplbnYpOwpAQCAtMjEzLDcgKzIxMyw3IEBACiAKIAljb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyAqcG07CiAKLQlzdHJ1Y3QgY2xhc3NfcHJpdmF0ZSAqcDsKKwlzdHJ1Y3Qgc3Vic3lzX3ByaXZhdGUgKnA7CiB9OwogCiBzdHJ1Y3QgY2xhc3NfZGV2X2l0ZXIgewpAQCAtNTA4LDEzICs1MDgsMTMgQEAKIAogc3RhdGljIGlubGluZSB2b2lkIGRldmljZV9lbmFibGVfYXN5bmNfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7Ci0JaWYgKGRldi0+cG93ZXIuc3RhdHVzID09IERQTV9PTikKKwlpZiAoIWRldi0+cG93ZXIuaW5fc3VzcGVuZCkKIAkJZGV2LT5wb3dlci5hc3luY19zdXNwZW5kID0gdHJ1ZTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIGRldmljZV9kaXNhYmxlX2FzeW5jX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQogewotCWlmIChkZXYtPnBvd2VyLnN0YXR1cyA9PSBEUE1fT04pCisJaWYgKCFkZXYtPnBvd2VyLmluX3N1c3BlbmQpCiAJCWRldi0+cG93ZXIuYXN5bmNfc3VzcGVuZCA9IGZhbHNlOwogfQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2R5bmFtaWNfZGVidWcuaCBiL2luY2x1ZGUvbGludXgvZHluYW1pY19kZWJ1Zy5oCmluZGV4IGE5MGIzODkuLjFjNzAwMjggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZHluYW1pY19kZWJ1Zy5oCisrKyBiL2luY2x1ZGUvbGludXgvZHluYW1pY19kZWJ1Zy5oCkBAIC00NCwzNCArNDQsMjQgQEAKIGV4dGVybiBpbnQgZGRlYnVnX3JlbW92ZV9tb2R1bGUoY29uc3QgY2hhciAqbW9kX25hbWUpOwogCiAjZGVmaW5lIGR5bmFtaWNfcHJfZGVidWcoZm10LCAuLi4pIGRvIHsJCQkJCVwKLQlfX2xhYmVsX18gZG9fcHJpbnRrOwkJCQkJCVwKLQlfX2xhYmVsX18gb3V0OwkJCQkJCQlcCiAJc3RhdGljIHN0cnVjdCBfZGRlYnVnIGRlc2NyaXB0b3IJCQkJXAogCV9fdXNlZAkJCQkJCQkJXAogCV9fYXR0cmlidXRlX18oKHNlY3Rpb24oIl9fdmVyYm9zZSIpLCBhbGlnbmVkKDgpKSkgPQkJXAogCXsgS0JVSUxEX01PRE5BTUUsIF9fZnVuY19fLCBfX0ZJTEVfXywgZm10LCBfX0xJTkVfXywJCVwKIAkJX0RQUklOVEtfRkxBR1NfREVGQVVMVCB9OwkJCQlcCi0JSlVNUF9MQUJFTCgmZGVzY3JpcHRvci5lbmFibGVkLCBkb19wcmludGspOwkJCVwKLQlnb3RvIG91dDsJCQkJCQkJXAotZG9fcHJpbnRrOgkJCQkJCQkJXAotCXByaW50ayhLRVJOX0RFQlVHIHByX2ZtdChmbXQpLAkjI19fVkFfQVJHU19fKTsJCQlcCi1vdXQ6CTsJCQkJCQkJCVwKKwlpZiAodW5saWtlbHkoZGVzY3JpcHRvci5lbmFibGVkKSkJCQkJXAorCQlwcmludGsoS0VSTl9ERUJVRyBwcl9mbXQoZm10KSwJIyNfX1ZBX0FSR1NfXyk7CQlcCiAJfSB3aGlsZSAoMCkKIAogCiAjZGVmaW5lIGR5bmFtaWNfZGV2X2RiZyhkZXYsIGZtdCwgLi4uKSBkbyB7CQkJCVwKLQlfX2xhYmVsX18gZG9fcHJpbnRrOwkJCQkJCVwKLQlfX2xhYmVsX18gb3V0OwkJCQkJCQlcCiAJc3RhdGljIHN0cnVjdCBfZGRlYnVnIGRlc2NyaXB0b3IJCQkJXAogCV9fdXNlZAkJCQkJCQkJXAogCV9fYXR0cmlidXRlX18oKHNlY3Rpb24oIl9fdmVyYm9zZSIpLCBhbGlnbmVkKDgpKSkgPQkJXAogCXsgS0JVSUxEX01PRE5BTUUsIF9fZnVuY19fLCBfX0ZJTEVfXywgZm10LCBfX0xJTkVfXywJCVwKIAkJX0RQUklOVEtfRkxBR1NfREVGQVVMVCB9OwkJCQlcCi0JSlVNUF9MQUJFTCgmZGVzY3JpcHRvci5lbmFibGVkLCBkb19wcmludGspOwkJCVwKLQlnb3RvIG91dDsJCQkJCQkJXAotZG9fcHJpbnRrOgkJCQkJCQkJXAotCWRldl9wcmludGsoS0VSTl9ERUJVRywgZGV2LCBmbXQsICMjX19WQV9BUkdTX18pOwkJXAotb3V0Ogk7CQkJCQkJCQlcCisJaWYgKHVubGlrZWx5KGRlc2NyaXB0b3IuZW5hYmxlZCkpCQkJCVwKKwkJZGV2X3ByaW50ayhLRVJOX0RFQlVHLCBkZXYsIGZtdCwgIyNfX1ZBX0FSR1NfXyk7CVwKIAl9IHdoaWxlICgwKQogCiAjZWxzZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9leHQzX2ZzLmggYi9pbmNsdWRlL2xpbnV4L2V4dDNfZnMuaAppbmRleCA2Y2UxYmNhLi42NTk5MGVmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2V4dDNfZnMuaAorKysgYi9pbmNsdWRlL2xpbnV4L2V4dDNfZnMuaApAQCAtNzI0LDIxICs3MjQsMzAgQEAKIAkJCQkJIH5FWFQzX0RJUl9ST1VORCkKICNkZWZpbmUgRVhUM19NQVhfUkVDX0xFTgkJKCgxPDwxNiktMSkKIAorLyoKKyAqIFRlc3RzIGFnYWluc3QgTUFYX1JFQ19MRU4gZXRjIHdlcmUgcHV0IGluIHBsYWNlIGZvciA2NGsgYmxvY2sKKyAqIHNpemVzOyBpZiB0aGF0IGlzIG5vdCBwb3NzaWJsZSBvbiB0aGlzIGFyY2gsIHdlIGNhbiBza2lwCisgKiB0aG9zZSB0ZXN0cyBhbmQgc3BlZWQgdGhpbmdzIHVwLgorICovCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGV4dDNfcmVjX2xlbl9mcm9tX2Rpc2soX19sZTE2IGRsZW4pCiB7CiAJdW5zaWduZWQgbGVuID0gbGUxNl90b19jcHUoZGxlbik7CiAKKyNpZiAoUEFHRV9DQUNIRV9TSVpFID49IDY1NTM2KQogCWlmIChsZW4gPT0gRVhUM19NQVhfUkVDX0xFTikKIAkJcmV0dXJuIDEgPDwgMTY7CisjZW5kaWYKIAlyZXR1cm4gbGVuOwogfQogCiBzdGF0aWMgaW5saW5lIF9fbGUxNiBleHQzX3JlY19sZW5fdG9fZGlzayh1bnNpZ25lZCBsZW4pCiB7CisjaWYgKFBBR0VfQ0FDSEVfU0laRSA+PSA2NTUzNikKIAlpZiAobGVuID09ICgxIDw8IDE2KSkKIAkJcmV0dXJuIGNwdV90b19sZTE2KEVYVDNfTUFYX1JFQ19MRU4pOwogCWVsc2UgaWYgKGxlbiA+ICgxIDw8IDE2KSkKIAkJQlVHKCk7CisjZW5kaWYKIAlyZXR1cm4gY3B1X3RvX2xlMTYobGVuKTsKIH0KIApAQCAtODU2LDYgKzg2NSw3IEBACiBleHRlcm4gaW50IGV4dDNfc2hvdWxkX3JldHJ5X2FsbG9jKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCAqcmV0cmllcyk7CiBleHRlcm4gdm9pZCBleHQzX2luaXRfYmxvY2tfYWxsb2NfaW5mbyhzdHJ1Y3QgaW5vZGUgKik7CiBleHRlcm4gdm9pZCBleHQzX3Jzdl93aW5kb3dfYWRkKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBleHQzX3Jlc2VydmVfd2luZG93X25vZGUgKnJzdik7CitleHRlcm4gaW50IGV4dDNfdHJpbV9mcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3QgZnN0cmltX3JhbmdlICpyYW5nZSk7CiAKIC8qIGRpci5jICovCiBleHRlcm4gaW50IGV4dDNfY2hlY2tfZGlyX2VudHJ5KGNvbnN0IGNoYXIgKiwgc3RydWN0IGlub2RlICosCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2ZpcmV3aXJlLmggYi9pbmNsdWRlL2xpbnV4L2ZpcmV3aXJlLmgKaW5kZXggMWNkNjM3ZS4uOWEzZjVmOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9maXJld2lyZS5oCisrKyBiL2luY2x1ZGUvbGludXgvZmlyZXdpcmUuaApAQCAtMzAyLDkgKzMwMiw5IEBACiBzdHJ1Y3QgZndfdHJhbnNhY3Rpb24gewogCWludCBub2RlX2lkOyAvKiBUaGUgZ2VuZXJhdGlvbiBpcyBpbXBsaWVkOyBpdCBpcyBhbHdheXMgdGhlIGN1cnJlbnQuICovCiAJaW50IHRsYWJlbDsKLQlpbnQgdGltZXN0YW1wOwogCXN0cnVjdCBsaXN0X2hlYWQgbGluazsKIAlzdHJ1Y3QgZndfY2FyZCAqY2FyZDsKKwlib29sIGlzX3NwbGl0X3RyYW5zYWN0aW9uOwogCXN0cnVjdCB0aW1lcl9saXN0IHNwbGl0X3RpbWVvdXRfdGltZXI7CiAKIAlzdHJ1Y3QgZndfcGFja2V0IHBhY2tldDsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZmlybXdhcmUtbWFwLmggYi9pbmNsdWRlL2xpbnV4L2Zpcm13YXJlLW1hcC5oCmluZGV4IGM2ZGNjMWQuLjQzZmU1MmZjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2Zpcm13YXJlLW1hcC5oCisrKyBiL2luY2x1ZGUvbGludXgvZmlybXdhcmUtbWFwLmgKQEAgLTE3LDcgKzE3LDYgQEAKICNkZWZpbmUgX0xJTlVYX0ZJUk1XQVJFX01BUF9ICiAKICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+Ci0jaW5jbHVkZSA8bGludXgva29iamVjdC5oPgogCiAvKgogICogcHJvdmlkZSBhIGR1bW15IGludGVyZmFjZSBpZiBDT05GSUdfRklSTVdBUkVfTUVNTUFQIGlzIGRpc2FibGVkCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2ZsZXhfYXJyYXkuaCBiL2luY2x1ZGUvbGludXgvZmxleF9hcnJheS5oCmluZGV4IDYzMWI3N2YuLjcwZTRlZmEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZmxleF9hcnJheS5oCisrKyBiL2luY2x1ZGUvbGludXgvZmxleF9hcnJheS5oCkBAIC03MSw3ICs3MSw3IEBACiBpbnQgZmxleF9hcnJheV9zaHJpbmsoc3RydWN0IGZsZXhfYXJyYXkgKmZhKTsKIAogI2RlZmluZSBmbGV4X2FycmF5X3B1dF9wdHIoZmEsIG5yLCBzcmMsIGdmcCkgXAotCWZsZXhfYXJyYXlfcHV0KGZhLCBuciwgJih2b2lkICopKHNyYyksIGdmcCkKKwlmbGV4X2FycmF5X3B1dChmYSwgbnIsICh2b2lkICopJihzcmMpLCBnZnApCiAKIHZvaWQgKmZsZXhfYXJyYXlfZ2V0X3B0cihzdHJ1Y3QgZmxleF9hcnJheSAqZmEsIHVuc2lnbmVkIGludCBlbGVtZW50X25yKTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9mcy5oIGIvaW5jbHVkZS9saW51eC9mcy5oCmluZGV4IGJhZjNlNTUuLmY4NGQ5OTIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZnMuaAorKysgYi9pbmNsdWRlL2xpbnV4L2ZzLmgKQEAgLTM4Miw3ICszODIsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3BhdGguaD4KICNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CiAjaW5jbHVkZSA8bGludXgvY2FjaGUuaD4KLSNpbmNsdWRlIDxsaW51eC9rb2JqZWN0Lmg+CiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L3JhZGl4LXRyZWUuaD4KICNpbmNsdWRlIDxsaW51eC9wcmlvX3RyZWUuaD4KQEAgLTQwMiw2ICs0MDEsNyBAQAogc3RydWN0IGlvdmVjOwogc3RydWN0IG5hbWVpZGF0YTsKIHN0cnVjdCBraW9jYjsKK3N0cnVjdCBrb2JqZWN0Owogc3RydWN0IHBpcGVfaW5vZGVfaW5mbzsKIHN0cnVjdCBwb2xsX3RhYmxlX3N0cnVjdDsKIHN0cnVjdCBrc3RhdGZzOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9mdXNlLmggYi9pbmNsdWRlL2xpbnV4L2Z1c2UuaAppbmRleCBjM2M1NzhlLi5kNDY0ZGU1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2Z1c2UuaAorKysgYi9pbmNsdWRlL2xpbnV4L2Z1c2UuaApAQCAtNDEsNiArNDEsMTIgQEAKICAqIDcuMTUKICAqICAtIGFkZCBzdG9yZSBub3RpZnkKICAqICAtIGFkZCByZXRyaWV2ZSBub3RpZnkKKyAqCisgKiA3LjE2CisgKiAgLSBhZGQgQkFUQ0hfRk9SR0VUIHJlcXVlc3QKKyAqICAtIEZVU0VfSU9DVExfVU5SRVNUUklDVEVEIHNoYWxsIG5vdyByZXR1cm4gd2l0aCBhcnJheSBvZiAnc3RydWN0CisgKiAgICBmdXNlX2lvY3RsX2lvdmVjJyBpbnN0ZWFkIG9mIGFtYmlndW91cyAnc3RydWN0IGlvdmVjJworICogIC0gYWRkIEZVU0VfSU9DVExfMzJCSVQgZmxhZwogICovCiAKICNpZm5kZWYgX0xJTlVYX0ZVU0VfSApAQCAtNzIsNyArNzgsNyBAQAogI2RlZmluZSBGVVNFX0tFUk5FTF9WRVJTSU9OIDcKIAogLyoqIE1pbm9yIHZlcnNpb24gbnVtYmVyIG9mIHRoaXMgaW50ZXJmYWNlICovCi0jZGVmaW5lIEZVU0VfS0VSTkVMX01JTk9SX1ZFUlNJT04gMTUKKyNkZWZpbmUgRlVTRV9LRVJORUxfTUlOT1JfVkVSU0lPTiAxNgogCiAvKiogVGhlIG5vZGUgSUQgb2YgdGhlIHJvb3QgaW5vZGUgKi8KICNkZWZpbmUgRlVTRV9ST09UX0lEIDEKQEAgLTIwMCwxMiArMjA2LDE0IEBACiAgKiBGVVNFX0lPQ1RMX0NPTVBBVDogMzJiaXQgY29tcGF0IGlvY3RsIG9uIDY0Yml0IG1hY2hpbmUKICAqIEZVU0VfSU9DVExfVU5SRVNUUklDVEVEOiBub3QgcmVzdHJpY3RlZCB0byB3ZWxsLWZvcm1lZCBpb2N0bHMsIHJldHJ5IGFsbG93ZWQKICAqIEZVU0VfSU9DVExfUkVUUlk6IHJldHJ5IHdpdGggbmV3IGlvdmVjcworICogRlVTRV9JT0NUTF8zMkJJVDogMzJiaXQgaW9jdGwKICAqCiAgKiBGVVNFX0lPQ1RMX01BWF9JT1Y6IG1heGltdW0gb2YgaW5faW92ZWNzICsgb3V0X2lvdmVjcwogICovCiAjZGVmaW5lIEZVU0VfSU9DVExfQ09NUEFUCSgxIDw8IDApCiAjZGVmaW5lIEZVU0VfSU9DVExfVU5SRVNUUklDVEVECSgxIDw8IDEpCiAjZGVmaW5lIEZVU0VfSU9DVExfUkVUUlkJKDEgPDwgMikKKyNkZWZpbmUgRlVTRV9JT0NUTF8zMkJJVAkoMSA8PCAzKQogCiAjZGVmaW5lIEZVU0VfSU9DVExfTUFYX0lPVgkyNTYKIApAQCAtMjU2LDYgKzI2NCw3IEBACiAJRlVTRV9JT0NUTCAgICAgICAgID0gMzksCiAJRlVTRV9QT0xMICAgICAgICAgID0gNDAsCiAJRlVTRV9OT1RJRllfUkVQTFkgID0gNDEsCisJRlVTRV9CQVRDSF9GT1JHRVQgID0gNDIsCiAKIAkvKiBDVVNFIHNwZWNpZmljIG9wZXJhdGlvbnMgKi8KIAlDVVNFX0lOSVQgICAgICAgICAgPSA0MDk2LApAQCAtMjkwLDYgKzI5OSwxNiBAQAogCV9fdTY0CW5sb29rdXA7CiB9OwogCitzdHJ1Y3QgZnVzZV9mb3JnZXRfb25lIHsKKwlfX3U2NAlub2RlaWQ7CisJX191NjQJbmxvb2t1cDsKK307CisKK3N0cnVjdCBmdXNlX2JhdGNoX2ZvcmdldF9pbiB7CisJX191MzIJY291bnQ7CisJX191MzIJZHVtbXk7Cit9OworCiBzdHJ1Y3QgZnVzZV9nZXRhdHRyX2luIHsKIAlfX3UzMglnZXRhdHRyX2ZsYWdzOwogCV9fdTMyCWR1bW15OwpAQCAtNTEwLDYgKzUyOSwxMSBAQAogCV9fdTMyCW91dF9zaXplOwogfTsKIAorc3RydWN0IGZ1c2VfaW9jdGxfaW92ZWMgeworCV9fdTY0CWJhc2U7CisJX191NjQJbGVuOworfTsKKwogc3RydWN0IGZ1c2VfaW9jdGxfb3V0IHsKIAlfX3MzMglyZXN1bHQ7CiAJX191MzIJZmxhZ3M7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2dwaW8taTJjbXV4LmggYi9pbmNsdWRlL2xpbnV4L2dwaW8taTJjbXV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGEzMzNiYgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvZ3Bpby1pMmNtdXguaApAQCAtMCwwICsxLDM4IEBACisvKgorICogZ3Bpby1pMmNtdXggaW50ZXJmYWNlIHRvIHBsYXRmb3JtIGNvZGUKKyAqCisgKiBQZXRlciBLb3JzZ2FhcmQgPHBldGVyLmtvcnNnYWFyZEBiYXJjby5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaWZuZGVmIF9MSU5VWF9HUElPX0kyQ01VWF9ICisjZGVmaW5lIF9MSU5VWF9HUElPX0kyQ01VWF9ICisKKy8qIE1VWCBoYXMgbm8gc3BlY2lmaWMgaWRsZSBtb2RlICovCisjZGVmaW5lIEdQSU9fSTJDTVVYX05PX0lETEUJKCh1bnNpZ25lZCktMSkKKworLyoqCisgKiBzdHJ1Y3QgZ3Bpb19pMmNtdXhfcGxhdGZvcm1fZGF0YSAtIFBsYXRmb3JtLWRlcGVuZGVudCBkYXRhIGZvciBncGlvLWkyY211eAorICogQHBhcmVudDogUGFyZW50IEkyQyBidXMgYWRhcHRlciBudW1iZXIKKyAqIEBiYXNlX25yOiBCYXNlIEkyQyBidXMgbnVtYmVyIHRvIG51bWJlciBhZGFwdGVycyBmcm9tIG9yIHplcm8gZm9yIGR5bmFtaWMKKyAqIEB2YWx1ZXM6IEFycmF5IG9mIGJpdG1hc2tzIG9mIEdQSU8gc2V0dGluZ3MgKGxvdy9oaWdoKSBmb3IgZWFjaAorICoJcG9zaXRpb24KKyAqIEBuX3ZhbHVlczogTnVtYmVyIG9mIG11bHRpcGxleGVyIHBvc2l0aW9ucyAoYnVzc2VzIHRvIGluc3RhbnRpYXRlKQorICogQGdwaW9zOiBBcnJheSBvZiBHUElPIG51bWJlcnMgdXNlZCB0byBjb250cm9sIE1VWAorICogQG5fZ3Bpb3M6IE51bWJlciBvZiBHUElPcyB1c2VkIHRvIGNvbnRyb2wgTVVYCisgKiBAaWRsZTogQml0bWFzayB0byB3cml0ZSB0byBNVVggd2hlbiBpZGxlIG9yIEdQSU9fSTJDTVVYX05PX0lETEUgaWYgbm90IHVzZWQKKyAqLworc3RydWN0IGdwaW9faTJjbXV4X3BsYXRmb3JtX2RhdGEgeworCWludCBwYXJlbnQ7CisJaW50IGJhc2VfbnI7CisJY29uc3QgdW5zaWduZWQgKnZhbHVlczsKKwlpbnQgbl92YWx1ZXM7CisJY29uc3QgdW5zaWduZWQgKmdwaW9zOworCWludCBuX2dwaW9zOworCXVuc2lnbmVkIGlkbGU7Cit9OworCisjZW5kaWYgLyogX0xJTlVYX0dQSU9fSTJDTVVYX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaGlkLmggYi9pbmNsdWRlL2xpbnV4L2hpZC5oCmluZGV4IGJiMGY1NmYuLjIwYjk4MDEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaGlkLmgKKysrIGIvaW5jbHVkZS9saW51eC9oaWQuaApAQCAtODIwLDYgKzgyMCw0OSBAQAogCWhkZXYtPmxsX2RyaXZlci0+c3RvcChoZGV2KTsKIH0KIAorLyoqCisgKiBoaWRfaHdfb3BlbiAtIHNpZ25hbCB1bmRlcmxheWluZyBIVyB0byBzdGFydCBkZWxpdmVyaW5nIGV2ZW50cworICoKKyAqIEBoZGV2OiBoaWQgZGV2aWNlCisgKgorICogVGVsbCB1bmRlcmx5aW5nIEhXIHRvIHN0YXJ0IGRlbGl2ZXJpbmcgZXZlbnRzIGZyb20gdGhlIGRldmljZS4KKyAqIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBzb21ldGltZSBhZnRlciBzdWNjZXNzZnVsIGNhbGwKKyAqIHRvIGhpZF9oaXdfc3RhcnQoKS4KKyAqLworc3RhdGljIGlubGluZSBpbnQgX19tdXN0X2NoZWNrIGhpZF9od19vcGVuKHN0cnVjdCBoaWRfZGV2aWNlICpoZGV2KQoreworCXJldHVybiBoZGV2LT5sbF9kcml2ZXItPm9wZW4oaGRldik7Cit9CisKKy8qKgorICogaGlkX2h3X2Nsb3NlIC0gc2lnbmFsIHVuZGVybGF5aW5nIEhXIHRvIHN0b3AgZGVsaXZlcmluZyBldmVudHMKKyAqCisgKiBAaGRldjogaGlkIGRldmljZQorICoKKyAqIFRoaXMgZnVuY3Rpb24gaW5kaWNhdGVzIHRoYXQgd2UgYXJlIG5vdCBpbnRlcmVzdGVkIGluIHRoZSBldmVudHMKKyAqIGZyb20gdGhpcyBkZXZpY2UgYW55bW9yZS4gRGVsaXZlcnkgb2YgZXZlbnRzIG1heSBvciBtYXkgbm90IHN0b3AsCisgKiBkZXBlbmRpbmcgb24gdGhlIG51bWJlciBvZiB1c2VycyBzdGlsbCBvdXRzdGFuZGluZy4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIGhpZF9od19jbG9zZShzdHJ1Y3QgaGlkX2RldmljZSAqaGRldikKK3sKKwloZGV2LT5sbF9kcml2ZXItPmNsb3NlKGhkZXYpOworfQorCisvKioKKyAqIGhpZF9od19wb3dlciAtIHJlcXVlc3RzIHVuZGVybHlpbmcgSFcgdG8gZ28gaW50byBnaXZlbiBwb3dlciBtb2RlCisgKgorICogQGhkZXY6IGhpZCBkZXZpY2UKKyAqIEBsZXZlbDogcmVxdWVzdGVkIHBvd2VyIGxldmVsIChvbmUgb2YgJVBNX0hJTlRfKiBkZWZpbmVzKQorICoKKyAqIFRoaXMgZnVuY3Rpb24gcmVxdWVzdHMgdW5kZXJseWluZyBoYXJkd2FyZSB0byBlbnRlciByZXF1ZXN0ZWQgcG93ZXIKKyAqIG1vZGUuCisgKi8KKworc3RhdGljIGlubGluZSBpbnQgaGlkX2h3X3Bvd2VyKHN0cnVjdCBoaWRfZGV2aWNlICpoZGV2LCBpbnQgbGV2ZWwpCit7CisJcmV0dXJuIGhkZXYtPmxsX2RyaXZlci0+cG93ZXIgPyBoZGV2LT5sbF9kcml2ZXItPnBvd2VyKGhkZXYsIGxldmVsKSA6IDA7Cit9CisKIHZvaWQgaGlkX3JlcG9ydF9yYXdfZXZlbnQoc3RydWN0IGhpZF9kZXZpY2UgKmhpZCwgaW50IHR5cGUsIHU4ICpkYXRhLCBpbnQgc2l6ZSwKIAkJaW50IGludGVycnVwdCk7CiAKQEAgLTgzOCwxMiArODgxLDMyIEBACiAjZGVmaW5lIGhpZF9waWRmZl9pbml0IE5VTEwKICNlbmRpZgogCi0jZGVmaW5lIGRiZ19oaWQoZm9ybWF0LCBhcmcuLi4pIGlmIChoaWRfZGVidWcpIFwKLQkJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6ICIgZm9ybWF0ICxcCi0JCQkJX19GSUxFX18gLCAjIyBhcmcpCi0jZGVmaW5lIGVycl9oaWQoZm9ybWF0LCBhcmcuLi4pIHByaW50ayhLRVJOX0VSUiAiJXM6ICIgZm9ybWF0ICJcbiIgLCBcCi0JCV9fRklMRV9fICwgIyMgYXJnKQotI2VuZGlmIC8qIEhJRF9GRiAqLworI2RlZmluZSBkYmdfaGlkKGZvcm1hdCwgYXJnLi4uKQkJCQkJCVwKK2RvIHsJCQkJCQkJCQlcCisJaWYgKGhpZF9kZWJ1ZykJCQkJCQkJXAorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6ICIgZm9ybWF0LCBfX0ZJTEVfXywgIyNhcmcpOwlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIGhpZF9wcmludGsobGV2ZWwsIGhpZCwgZm10LCBhcmcuLi4pCQlcCisJZGV2X3ByaW50ayhsZXZlbCwgJihoaWQpLT5kZXYsIGZtdCwgIyNhcmcpCisjZGVmaW5lIGhpZF9lbWVyZyhoaWQsIGZtdCwgYXJnLi4uKQkJCVwKKwlkZXZfZW1lcmcoJihoaWQpLT5kZXYsIGZtdCwgIyNhcmcpCisjZGVmaW5lIGhpZF9jcml0KGhpZCwgZm10LCBhcmcuLi4pCQkJXAorCWRldl9jcml0KCYoaGlkKS0+ZGV2LCBmbXQsICMjYXJnKQorI2RlZmluZSBoaWRfYWxlcnQoaGlkLCBmbXQsIGFyZy4uLikJCQlcCisJZGV2X2FsZXJ0KCYoaGlkKS0+ZGV2LCBmbXQsICMjYXJnKQorI2RlZmluZSBoaWRfZXJyKGhpZCwgZm10LCBhcmcuLi4pCQkJXAorCWRldl9lcnIoJihoaWQpLT5kZXYsIGZtdCwgIyNhcmcpCisjZGVmaW5lIGhpZF9ub3RpY2UoaGlkLCBmbXQsIGFyZy4uLikJCQlcCisJZGV2X25vdGljZSgmKGhpZCktPmRldiwgZm10LCAjI2FyZykKKyNkZWZpbmUgaGlkX3dhcm4oaGlkLCBmbXQsIGFyZy4uLikJCQlcCisJZGV2X3dhcm4oJihoaWQpLT5kZXYsIGZtdCwgIyNhcmcpCisjZGVmaW5lIGhpZF9pbmZvKGhpZCwgZm10LCBhcmcuLi4pCQkJXAorCWRldl9pbmZvKCYoaGlkKS0+ZGV2LCBmbXQsICMjYXJnKQorI2RlZmluZSBoaWRfZGJnKGhpZCwgZm10LCBhcmcuLi4pCQkJXAorCWRldl9kYmcoJihoaWQpLT5kZXYsIGZtdCwgIyNhcmcpCisKKyNlbmRpZiAvKiBfX0tFUk5FTF9fICovCiAKICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2hydGltZXIuaCBiL2luY2x1ZGUvbGludXgvaHJ0aW1lci5oCmluZGV4IDMzMDU4NmYuLmYzNzZkZGMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaHJ0aW1lci5oCisrKyBiL2luY2x1ZGUvbGludXgvaHJ0aW1lci5oCkBAIC0xMzEsNyArMTMxLDYgQEAKICAqIEBpbmRleDoJCWNsb2NrIHR5cGUgaW5kZXggZm9yIHBlcl9jcHUgc3VwcG9ydCB3aGVuIG1vdmluZyBhCiAgKgkJCXRpbWVyIHRvIGEgYmFzZSBvbiBhbm90aGVyIGNwdS4KICAqIEBhY3RpdmU6CQlyZWQgYmxhY2sgdHJlZSByb290IG5vZGUgZm9yIHRoZSBhY3RpdmUgdGltZXJzCi0gKiBAZmlyc3Q6CQlwb2ludGVyIHRvIHRoZSB0aW1lciBub2RlIHdoaWNoIGV4cGlyZXMgZmlyc3QKICAqIEByZXNvbHV0aW9uOgkJdGhlIHJlc29sdXRpb24gb2YgdGhlIGNsb2NrLCBpbiBuYW5vc2Vjb25kcwogICogQGdldF90aW1lOgkJZnVuY3Rpb24gdG8gcmV0cmlldmUgdGhlIGN1cnJlbnQgdGltZSBvZiB0aGUgY2xvY2sKICAqIEBzb2Z0aXJxX3RpbWU6CXRoZSB0aW1lIHdoZW4gcnVubmluZyB0aGUgaHJ0aW1lciBxdWV1ZSBpbiB0aGUgc29mdGlycQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pMmMuaCBiL2luY2x1ZGUvbGludXgvaTJjLmgKaW5kZXggNTZjZmUyMy4uOTAzNTc2ZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pMmMuaAorKysgYi9pbmNsdWRlL2xpbnV4L2kyYy5oCkBAIC01Nyw5ICs1NywxMCBAQAogICogdHJhbnNtaXQgYW4gYXJiaXRyYXJ5IG51bWJlciBvZiBtZXNzYWdlcyB3aXRob3V0IGludGVycnVwdGlvbi4KICAqIEBjb3VudCBtdXN0IGJlIGJlIGxlc3MgdGhhbiA2NGsgc2luY2UgbXNnLmxlbiBpcyB1MTYuCiAgKi8KLWV4dGVybiBpbnQgaTJjX21hc3Rlcl9zZW5kKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIGNvbnN0IGNoYXIgKmJ1ZiwKK2V4dGVybiBpbnQgaTJjX21hc3Rlcl9zZW5kKGNvbnN0IHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIGNvbnN0IGNoYXIgKmJ1ZiwKIAkJCSAgIGludCBjb3VudCk7Ci1leHRlcm4gaW50IGkyY19tYXN0ZXJfcmVjdihzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBjaGFyICpidWYsIGludCBjb3VudCk7CitleHRlcm4gaW50IGkyY19tYXN0ZXJfcmVjdihjb25zdCBzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBjaGFyICpidWYsCisJCQkgICBpbnQgY291bnQpOwogCiAvKiBUcmFuc2ZlciBudW0gbWVzc2FnZXMuCiAgKi8KQEAgLTc4LDIzICs3OSwyNSBAQAogLyogTm93IGZvbGxvdyB0aGUgJ25pY2UnIGFjY2VzcyByb3V0aW5lcy4gVGhlc2UgYWxzbyBkb2N1bWVudCB0aGUgY2FsbGluZwogICAgY29udmVudGlvbnMgb2YgaTJjX3NtYnVzX3hmZXIuICovCiAKLWV4dGVybiBzMzIgaTJjX3NtYnVzX3JlYWRfYnl0ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KTsKLWV4dGVybiBzMzIgaTJjX3NtYnVzX3dyaXRlX2J5dGUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggdmFsdWUpOwotZXh0ZXJuIHMzMiBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggY29tbWFuZCk7Ci1leHRlcm4gczMyIGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKK2V4dGVybiBzMzIgaTJjX3NtYnVzX3JlYWRfYnl0ZShjb25zdCBzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KTsKK2V4dGVybiBzMzIgaTJjX3NtYnVzX3dyaXRlX2J5dGUoY29uc3Qgc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggdmFsdWUpOworZXh0ZXJuIHMzMiBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY29uc3Qgc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKKwkJCQkgICAgdTggY29tbWFuZCk7CitleHRlcm4gczMyIGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY29uc3Qgc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKIAkJCQkgICAgIHU4IGNvbW1hbmQsIHU4IHZhbHVlKTsKLWV4dGVybiBzMzIgaTJjX3NtYnVzX3JlYWRfd29yZF9kYXRhKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IGNvbW1hbmQpOwotZXh0ZXJuIHMzMiBpMmNfc21idXNfd3JpdGVfd29yZF9kYXRhKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCitleHRlcm4gczMyIGkyY19zbWJ1c19yZWFkX3dvcmRfZGF0YShjb25zdCBzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAorCQkJCSAgICB1OCBjb21tYW5kKTsKK2V4dGVybiBzMzIgaTJjX3NtYnVzX3dyaXRlX3dvcmRfZGF0YShjb25zdCBzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAogCQkJCSAgICAgdTggY29tbWFuZCwgdTE2IHZhbHVlKTsKIC8qIFJldHVybnMgdGhlIG51bWJlciBvZiByZWFkIGJ5dGVzICovCi1leHRlcm4gczMyIGkyY19zbWJ1c19yZWFkX2Jsb2NrX2RhdGEoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKK2V4dGVybiBzMzIgaTJjX3NtYnVzX3JlYWRfYmxvY2tfZGF0YShjb25zdCBzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAogCQkJCSAgICAgdTggY29tbWFuZCwgdTggKnZhbHVlcyk7Ci1leHRlcm4gczMyIGkyY19zbWJ1c193cml0ZV9ibG9ja19kYXRhKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCitleHRlcm4gczMyIGkyY19zbWJ1c193cml0ZV9ibG9ja19kYXRhKGNvbnN0IHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCiAJCQkJICAgICAgdTggY29tbWFuZCwgdTggbGVuZ3RoLCBjb25zdCB1OCAqdmFsdWVzKTsKIC8qIFJldHVybnMgdGhlIG51bWJlciBvZiByZWFkIGJ5dGVzICovCi1leHRlcm4gczMyIGkyY19zbWJ1c19yZWFkX2kyY19ibG9ja19kYXRhKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCitleHRlcm4gczMyIGkyY19zbWJ1c19yZWFkX2kyY19ibG9ja19kYXRhKGNvbnN0IHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCiAJCQkJCSB1OCBjb21tYW5kLCB1OCBsZW5ndGgsIHU4ICp2YWx1ZXMpOwotZXh0ZXJuIHMzMiBpMmNfc21idXNfd3JpdGVfaTJjX2Jsb2NrX2RhdGEoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKK2V4dGVybiBzMzIgaTJjX3NtYnVzX3dyaXRlX2kyY19ibG9ja19kYXRhKGNvbnN0IHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCiAJCQkJCSAgdTggY29tbWFuZCwgdTggbGVuZ3RoLAogCQkJCQkgIGNvbnN0IHU4ICp2YWx1ZXMpOwogI2VuZGlmIC8qIEkyQyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pMmMvZHM2MjAuaCBiL2luY2x1ZGUvbGludXgvaTJjL2RzNjIwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzM2YmI4NwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvaTJjL2RzNjIwLmgKQEAgLTAsMCArMSwyMSBAQAorI2lmbmRlZiBfTElOVVhfRFM2MjBfSAorI2RlZmluZSBfTElOVVhfRFM2MjBfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKworLyogcGxhdGZvcm0gZGF0YSBmb3IgdGhlIERTNjIwIHRlbXBlcmF0dXJlIHNlbnNvciBhbmQgdGhlcm1vc3RhdCAqLworCitzdHJ1Y3QgZHM2MjBfcGxhdGZvcm1fZGF0YSB7CisJLyoKKwkgKiAgVGhlcm1vc3RhdCBvdXRwdXQgcGluIFBPIG1vZGU6CisJICogIDAgPSBhbHdheXMgbG93IChkZWZhdWx0KQorCSAqICAxID0gUE9fTE9XCisJICogIDIgPSBQT19ISUdICisJICoKKwkgKiAoc2VlIERvY3VtZW50YXRpb24vaHdtb24vZHM2MjApCisJICovCisJaW50IHBvbW9kZTsKK307CisKKyNlbmRpZiAvKiBfTElOVVhfRFM2MjBfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pbnRlbC1ndHQuaCBiL2luY2x1ZGUvbGludXgvaW50ZWwtZ3R0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkMTlhYjIuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9saW51eC9pbnRlbC1ndHQuaAorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLS8qCi0gKiBDb21tb24gSW50ZWwgQUdQR0FSVCBhbmQgR1RUIGRlZmluaXRpb25zLgotICovCi0jaWZuZGVmIF9JTlRFTF9HVFRfSAotI2RlZmluZSBfSU5URUxfR1RUX0gKLQotI2luY2x1ZGUgPGxpbnV4L2FncF9iYWNrZW5kLmg+Ci0KLS8qIFRoaXMgaXMgZm9yIEludGVsIG9ubHkgR1RUIGNvbnRyb2xzLgotICoKLSAqIFNhbmR5YnJpZGdlOiBBR1BfVVNFUl9DQUNIRURfTUVNT1JZIGRlZmF1bHQgdG8gTExDIG9ubHkKLSAqLwotCi0jZGVmaW5lIEFHUF9VU0VSX0NBQ0hFRF9NRU1PUllfTExDX01MQyAoQUdQX1VTRVJfVFlQRVMgKyAyKQotI2RlZmluZSBBR1BfVVNFUl9VTkNBQ0hFRF9NRU1PUlkgKEFHUF9VU0VSX1RZUEVTICsgNCkKLQotLyogZmxhZyBmb3IgR0ZEVCB0eXBlICovCi0jZGVmaW5lIEFHUF9VU0VSX0NBQ0hFRF9NRU1PUllfR0ZEVCAoMSA8PCAzKQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvamJkMi5oIGIvaW5jbHVkZS9saW51eC9qYmQyLmgKaW5kZXggMmFlODZhYS4uMjdlNzljMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9qYmQyLmgKKysrIGIvaW5jbHVkZS9saW51eC9qYmQyLmgKQEAgLTk0LDcgKzk0LDcgQEAKICAqCiAgKiBUaGlzIGlzIGFuIG9wYXF1ZSBkYXRhdHlwZS4KICAqKi8KLXR5cGVkZWYgc3RydWN0IGhhbmRsZV9zCQloYW5kbGVfdDsJLyogQXRvbWljIG9wZXJhdGlvbiB0eXBlICovCit0eXBlZGVmIHN0cnVjdCBqYmQyX2pvdXJuYWxfaGFuZGxlIGhhbmRsZV90OwkvKiBBdG9taWMgb3BlcmF0aW9uIHR5cGUgKi8KIAogCiAvKioKQEAgLTQxNiw3ICs0MTYsNyBAQAogICogaW4gc28gaXQgY2FuIGJlIGZpeGVkIGxhdGVyLgogICovCiAKLXN0cnVjdCBoYW5kbGVfcworc3RydWN0IGpiZDJfam91cm5hbF9oYW5kbGUKIHsKIAkvKiBXaGljaCBjb21wb3VuZCB0cmFuc2FjdGlvbiBpcyB0aGlzIHVwZGF0ZSBhIHBhcnQgb2Y/ICovCiAJdHJhbnNhY3Rpb25fdAkJKmhfdHJhbnNhY3Rpb247CkBAIC0xMTU4LDYgKzExNTgsMjIgQEAKIAlrbWVtX2NhY2hlX2ZyZWUoamJkMl9oYW5kbGVfY2FjaGUsIGhhbmRsZSk7CiB9CiAKKy8qCisgKiBqYmQyX2lub2RlIG1hbmFnZW1lbnQgKG9wdGlvbmFsLCBmb3IgdGhvc2UgZmlsZSBzeXN0ZW1zIHRoYXQgd2FudCB0byB1c2UKKyAqIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCBqYmQyX2lub2RlIHN0cnVjdHVyZXMpCisgKi8KK2V4dGVybiBzdHJ1Y3Qga21lbV9jYWNoZSAqamJkMl9pbm9kZV9jYWNoZTsKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgamJkMl9pbm9kZSAqamJkMl9hbGxvY19pbm9kZShnZnBfdCBnZnBfZmxhZ3MpCit7CisJcmV0dXJuIGttZW1fY2FjaGVfYWxsb2MoamJkMl9pbm9kZV9jYWNoZSwgZ2ZwX2ZsYWdzKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGpiZDJfZnJlZV9pbm9kZShzdHJ1Y3QgamJkMl9pbm9kZSAqamlub2RlKQoreworCWttZW1fY2FjaGVfZnJlZShqYmQyX2lub2RlX2NhY2hlLCBqaW5vZGUpOworfQorCiAvKiBQcmltYXJ5IHJldm9rZSBzdXBwb3J0ICovCiAjZGVmaW5lIEpPVVJOQUxfUkVWT0tFX0RFRkFVTFRfSEFTSCAyNTYKIGV4dGVybiBpbnQJICAgamJkMl9qb3VybmFsX2luaXRfcmV2b2tlKGpvdXJuYWxfdCAqLCBpbnQpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9rZXJuZWwuaCBiL2luY2x1ZGUvbGludXgva2VybmVsLmgKaW5kZXggYjZkZTlhNi4uZDBmYmMwNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9rZXJuZWwuaAorKysgYi9pbmNsdWRlL2xpbnV4L2tlcm5lbC5oCkBAIC01Niw2ICs1Niw4IEBACiAKICNkZWZpbmUgRklFTERfU0laRU9GKHQsIGYpIChzaXplb2YoKCh0KikwKS0+ZikpCiAjZGVmaW5lIERJVl9ST1VORF9VUChuLGQpICgoKG4pICsgKGQpIC0gMSkgLyAoZCkpCisKKy8qIFRoZSBgY29uc3QnIGluIHJvdW5kdXAoKSBwcmV2ZW50cyBnY2MtMy4zIGZyb20gY2FsbGluZyBfX2RpdmRpMyAqLwogI2RlZmluZSByb3VuZHVwKHgsIHkpICgJCQkJCVwKIHsJCQkJCQkJXAogCWNvbnN0IHR5cGVvZih5KSBfX3kgPSB5OwkJCVwKQEAgLTI2Myw2ICsyNjUsNyBAQAogfQogCiBleHRlcm4gaW50IGhleF90b19iaW4oY2hhciBjaCk7CitleHRlcm4gdm9pZCBoZXgyYmluKHU4ICpkc3QsIGNvbnN0IGNoYXIgKnNyYywgc2l6ZV90IGNvdW50KTsKIAogLyoKICAqIEdlbmVyYWwgdHJhY2luZyByZWxhdGVkIHV0aWxpdHkgZnVuY3Rpb25zIC0gdHJhY2VfcHJpbnRrKCksCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2tyZWYuaCBiL2luY2x1ZGUvbGludXgva3JlZi5oCmluZGV4IDZjYzM4ZmMuLmQ0YTYyYWIyZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9rcmVmLmgKKysrIGIvaW5jbHVkZS9saW51eC9rcmVmLmgKQEAgLTI0LDUgKzI0LDcgQEAKIHZvaWQga3JlZl9pbml0KHN0cnVjdCBrcmVmICprcmVmKTsKIHZvaWQga3JlZl9nZXQoc3RydWN0IGtyZWYgKmtyZWYpOwogaW50IGtyZWZfcHV0KHN0cnVjdCBrcmVmICprcmVmLCB2b2lkICgqcmVsZWFzZSkgKHN0cnVjdCBrcmVmICprcmVmKSk7CitpbnQga3JlZl9zdWIoc3RydWN0IGtyZWYgKmtyZWYsIHVuc2lnbmVkIGludCBjb3VudCwKKwkgICAgIHZvaWQgKCpyZWxlYXNlKSAoc3RydWN0IGtyZWYgKmtyZWYpKTsKIAogI2VuZGlmIC8qIF9LUkVGX0hfICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2xpYmF0YS5oIGIvaW5jbHVkZS9saW51eC9saWJhdGEuaAppbmRleCBkOTQ3YjEyLi5jOWM1ZDdhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2xpYmF0YS5oCisrKyBiL2luY2x1ZGUvbGludXgvbGliYXRhLmgKQEAgLTk5Niw4ICs5OTYsNyBAQAogZXh0ZXJuIGludCBhdGFfc2FzX3BvcnRfc3RhcnQoc3RydWN0IGF0YV9wb3J0ICphcCk7CiBleHRlcm4gdm9pZCBhdGFfc2FzX3BvcnRfc3RvcChzdHJ1Y3QgYXRhX3BvcnQgKmFwKTsKIGV4dGVybiBpbnQgYXRhX3Nhc19zbGF2ZV9jb25maWd1cmUoc3RydWN0IHNjc2lfZGV2aWNlICosIHN0cnVjdCBhdGFfcG9ydCAqKTsKLWV4dGVybiBpbnQgYXRhX3Nhc19xdWV1ZWNtZChzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQsIHZvaWQgKCpkb25lKShzdHJ1Y3Qgc2NzaV9jbW5kICopLAotCQkJICAgIHN0cnVjdCBhdGFfcG9ydCAqYXApOworZXh0ZXJuIGludCBhdGFfc2FzX3F1ZXVlY21kKHN0cnVjdCBzY3NpX2NtbmQgKmNtZCwgc3RydWN0IGF0YV9wb3J0ICphcCk7CiBleHRlcm4gaW50IHNhdGFfc2NyX3ZhbGlkKHN0cnVjdCBhdGFfbGluayAqbGluayk7CiBleHRlcm4gaW50IHNhdGFfc2NyX3JlYWQoc3RydWN0IGF0YV9saW5rICpsaW5rLCBpbnQgcmVnLCB1MzIgKnZhbCk7CiBleHRlcm4gaW50IHNhdGFfc2NyX3dyaXRlKHN0cnVjdCBhdGFfbGluayAqbGluaywgaW50IHJlZywgdTMyIHZhbCk7CkBAIC0xMDQwLDggKzEwMzksNyBAQAogCQkJCQlzdHJ1Y3QgYXRhX3Rhc2tmaWxlICp0ZiwgdTE2ICppZCk7CiBleHRlcm4gdm9pZCBhdGFfcWNfY29tcGxldGUoc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYyk7CiBleHRlcm4gaW50IGF0YV9xY19jb21wbGV0ZV9tdWx0aXBsZShzdHJ1Y3QgYXRhX3BvcnQgKmFwLCB1MzIgcWNfYWN0aXZlKTsKLWV4dGVybiB2b2lkIGF0YV9zY3NpX3NpbXVsYXRlKHN0cnVjdCBhdGFfZGV2aWNlICpkZXYsIHN0cnVjdCBzY3NpX2NtbmQgKmNtZCwKLQkJCSAgICAgIHZvaWQgKCpkb25lKShzdHJ1Y3Qgc2NzaV9jbW5kICopKTsKK2V4dGVybiB2b2lkIGF0YV9zY3NpX3NpbXVsYXRlKHN0cnVjdCBhdGFfZGV2aWNlICpkZXYsIHN0cnVjdCBzY3NpX2NtbmQgKmNtZCk7CiBleHRlcm4gaW50IGF0YV9zdGRfYmlvc19wYXJhbShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYsCiAJCQkgICAgICBzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LAogCQkJICAgICAgc2VjdG9yX3QgY2FwYWNpdHksIGludCBnZW9tW10pOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9sb2NrZC9kZWJ1Zy5oIGIvaW5jbHVkZS9saW51eC9sb2NrZC9kZWJ1Zy5oCmluZGV4IDM0YjJiN2YuLjI1N2QzNzcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbG9ja2QvZGVidWcuaAorKysgYi9pbmNsdWRlL2xpbnV4L2xvY2tkL2RlYnVnLmgKQEAgLTQ0LDE0ICs0NCw0IEBACiAjZGVmaW5lIE5MTURCR19YRFIJCTB4MDEwMAogI2RlZmluZSBOTE1EQkdfQUxMCQkweDdmZmYKIAotCi0vKgotICogU3VwcG9ydCBmb3IgcHJpbnRpbmcgTkxNIGNvb2tpZXMgaW4gZHByaW50aygpCi0gKi8KLSNpZmRlZiBSUENfREVCVUcKLXN0cnVjdCBubG1fY29va2llOwotLyogQ2FsbCB0aGlzIGZ1bmN0aW9uIHdpdGggdGhlIEJLTCBoZWxkIChpdCB1c2VzIGEgc3RhdGljIGJ1ZmZlcikgKi8KLWV4dGVybiBjb25zdCBjaGFyICpubG1kYmdfY29va2llMmEoY29uc3Qgc3RydWN0IG5sbV9jb29raWUgKik7Ci0jZW5kaWYKLQogI2VuZGlmIC8qIExJTlVYX0xPQ0tEX0RFQlVHX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbG9ja2QvbG9ja2QuaCBiL2luY2x1ZGUvbGludXgvbG9ja2QvbG9ja2QuaAppbmRleCAyZGVlMDVlLi5mZjlhYmZmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2xvY2tkL2xvY2tkLmgKKysrIGIvaW5jbHVkZS9saW51eC9sb2NrZC9sb2NrZC5oCkBAIC0yMDIsOSArMjAyLDkgQEAKICAqIExvY2tkIGNsaWVudCBmdW5jdGlvbnMKICAqLwogc3RydWN0IG5sbV9ycXN0ICogbmxtX2FsbG9jX2NhbGwoc3RydWN0IG5sbV9ob3N0ICpob3N0KTsKLXZvaWQJCSAgbmxtX3JlbGVhc2VfY2FsbChzdHJ1Y3QgbmxtX3Jxc3QgKik7CiBpbnQJCSAgbmxtX2FzeW5jX2NhbGwoc3RydWN0IG5sbV9ycXN0ICosIHUzMiwgY29uc3Qgc3RydWN0IHJwY19jYWxsX29wcyAqKTsKIGludAkJICBubG1fYXN5bmNfcmVwbHkoc3RydWN0IG5sbV9ycXN0ICosIHUzMiwgY29uc3Qgc3RydWN0IHJwY19jYWxsX29wcyAqKTsKK3ZvaWQJCSAgbmxtY2xudF9yZWxlYXNlX2NhbGwoc3RydWN0IG5sbV9ycXN0ICopOwogc3RydWN0IG5sbV93YWl0ICogbmxtY2xudF9wcmVwYXJlX2Jsb2NrKHN0cnVjdCBubG1faG9zdCAqaG9zdCwgc3RydWN0IGZpbGVfbG9jayAqZmwpOwogdm9pZAkJICBubG1jbG50X2ZpbmlzaF9ibG9jayhzdHJ1Y3QgbmxtX3dhaXQgKmJsb2NrKTsKIGludAkJICBubG1jbG50X2Jsb2NrKHN0cnVjdCBubG1fd2FpdCAqYmxvY2ssIHN0cnVjdCBubG1fcnFzdCAqcmVxLCBsb25nIHRpbWVvdXQpOwpAQCAtMjIzLDEzICsyMjMsMTQgQEAKIAkJCQkJY29uc3QgdTMyIHZlcnNpb24sCiAJCQkJCWNvbnN0IGNoYXIgKmhvc3RuYW1lLAogCQkJCQlpbnQgbm9yZXN2cG9ydCk7Cit2b2lkCQkgIG5sbWNsbnRfcmVsZWFzZV9ob3N0KHN0cnVjdCBubG1faG9zdCAqKTsKIHN0cnVjdCBubG1faG9zdCAgKm5sbXN2Y19sb29rdXBfaG9zdChjb25zdCBzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLAogCQkJCQljb25zdCBjaGFyICpob3N0bmFtZSwKIAkJCQkJY29uc3Qgc2l6ZV90IGhvc3RuYW1lX2xlbik7Cit2b2lkCQkgIG5sbXN2Y19yZWxlYXNlX2hvc3Qoc3RydWN0IG5sbV9ob3N0ICopOwogc3RydWN0IHJwY19jbG50ICogbmxtX2JpbmRfaG9zdChzdHJ1Y3QgbmxtX2hvc3QgKik7CiB2b2lkCQkgIG5sbV9yZWJpbmRfaG9zdChzdHJ1Y3QgbmxtX2hvc3QgKik7CiBzdHJ1Y3QgbmxtX2hvc3QgKiBubG1fZ2V0X2hvc3Qoc3RydWN0IG5sbV9ob3N0ICopOwotdm9pZAkJICBubG1fcmVsZWFzZV9ob3N0KHN0cnVjdCBubG1faG9zdCAqKTsKIHZvaWQJCSAgbmxtX3NodXRkb3duX2hvc3RzKHZvaWQpOwogdm9pZAkJICBubG1faG9zdF9yZWJvb3RlZChjb25zdCBzdHJ1Y3QgbmxtX3JlYm9vdCAqKTsKIApAQCAtMjY3LDYgKzI2OCw3IEBACiB2b2lkCQkgIG5sbXN2Y190cmF2ZXJzZV9ibG9ja3Moc3RydWN0IG5sbV9ob3N0ICosIHN0cnVjdCBubG1fZmlsZSAqLAogCQkJCQlubG1faG9zdF9tYXRjaF9mbl90IG1hdGNoKTsKIHZvaWQJCSAgbmxtc3ZjX2dyYW50X3JlcGx5KHN0cnVjdCBubG1fY29va2llICosIF9fYmUzMik7Cit2b2lkCQkgIG5sbXN2Y19yZWxlYXNlX2NhbGwoc3RydWN0IG5sbV9ycXN0ICopOwogCiAvKgogICogRmlsZSBoYW5kbGluZyBmb3IgdGhlIHNlcnZlciBwZXJzb25hbGl0eQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tYmNhY2hlLmggYi9pbmNsdWRlL2xpbnV4L21iY2FjaGUuaAppbmRleCA1NGNiYmFjLi41NTI1ZDM3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21iY2FjaGUuaAorKysgYi9pbmNsdWRlL2xpbnV4L21iY2FjaGUuaApAQCAtMTgsNiArMTgsMTcgQEAKIAl9IGVfaW5kZXg7CiB9OwogCitzdHJ1Y3QgbWJfY2FjaGUgeworCXN0cnVjdCBsaXN0X2hlYWQJCWNfY2FjaGVfbGlzdDsKKwljb25zdCBjaGFyCQkJKmNfbmFtZTsKKwlhdG9taWNfdAkJCWNfZW50cnlfY291bnQ7CisJaW50CQkJCWNfbWF4X2VudHJpZXM7CisJaW50CQkJCWNfYnVja2V0X2JpdHM7CisJc3RydWN0IGttZW1fY2FjaGUJCSpjX2VudHJ5X2NhY2hlOworCXN0cnVjdCBsaXN0X2hlYWQJCSpjX2Jsb2NrX2hhc2g7CisJc3RydWN0IGxpc3RfaGVhZAkJKmNfaW5kZXhfaGFzaDsKK307CisKIC8qIEZ1bmN0aW9ucyBvbiBjYWNoZXMgKi8KIAogc3RydWN0IG1iX2NhY2hlICptYl9jYWNoZV9jcmVhdGUoY29uc3QgY2hhciAqLCBpbnQpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tZmQvdG1pby5oIGIvaW5jbHVkZS9saW51eC9tZmQvdG1pby5oCmluZGV4IDA4NWYwNDEuLjhlNzAzMTAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbWZkL3RtaW8uaAorKysgYi9pbmNsdWRlL2xpbnV4L21mZC90bWlvLmgKQEAgLTU3LDYgKzU3LDEwIEBACiAgKiBpcyBjb25maWd1cmVkIGluIDQtYml0IG1vZGUuCiAgKi8KICNkZWZpbmUgVE1JT19NTUNfQkxLU1pfMkJZVEVTCQkoMSA8PCAxKQorLyoKKyAqIFNvbWUgY29udHJvbGxlcnMgY2FuIHN1cHBvcnQgU0RJTyBJUlEgc2lnbmFsbGluZy4KKyAqLworI2RlZmluZSBUTUlPX01NQ19TRElPX0lSUQkJKDEgPDwgMikKIAogaW50IHRtaW9fY29yZV9tbWNfZW5hYmxlKHZvaWQgX19pb21lbSAqY25mLCBpbnQgc2hpZnQsIHVuc2lnbmVkIGxvbmcgYmFzZSk7CiBpbnQgdG1pb19jb3JlX21tY19yZXN1bWUodm9pZCBfX2lvbWVtICpjbmYsIGludCBzaGlmdCwgdW5zaWduZWQgbG9uZyBiYXNlKTsKQEAgLTY2LDYgKzcwLDcgQEAKIHN0cnVjdCB0bWlvX21tY19kbWEgewogCXZvaWQgKmNoYW5fcHJpdl90eDsKIAl2b2lkICpjaGFuX3ByaXZfcng7CisJaW50IGFsaWdubWVudF9zaGlmdDsKIH07CiAKIC8qCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21tYy9kd19tbWMuaCBiL2luY2x1ZGUvbGludXgvbW1jL2R3X21tYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2YjAyNjEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L21tYy9kd19tbWMuaApAQCAtMCwwICsxLDIxNyBAQAorLyoKKyAqIFN5bm9wc3lzIERlc2lnbldhcmUgTXVsdGltZWRpYSBDYXJkIEludGVyZmFjZSBkcml2ZXIKKyAqICAoQmFzZWQgb24gTlhQIGRyaXZlciBmb3IgbHBjIDMxeHgpCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA5IE5YUCBTZW1pY29uZHVjdG9ycworICogQ29weXJpZ2h0IChDKSAyMDA5LCAyMDEwIEltYWdpbmF0aW9uIFRlY2hub2xvZ2llcyBMdGQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaWZuZGVmIF9MSU5VWF9NTUNfRFdfTU1DX0hfCisjZGVmaW5lIF9MSU5VWF9NTUNfRFdfTU1DX0hfCisKKyNkZWZpbmUgTUFYX01DSV9TTE9UUwkyCisKK2VudW0gZHdfbWNpX3N0YXRlIHsKKwlTVEFURV9JRExFID0gMCwKKwlTVEFURV9TRU5ESU5HX0NNRCwKKwlTVEFURV9TRU5ESU5HX0RBVEEsCisJU1RBVEVfREFUQV9CVVNZLAorCVNUQVRFX1NFTkRJTkdfU1RPUCwKKwlTVEFURV9EQVRBX0VSUk9SLAorfTsKKworZW51bSB7CisJRVZFTlRfQ01EX0NPTVBMRVRFID0gMCwKKwlFVkVOVF9YRkVSX0NPTVBMRVRFLAorCUVWRU5UX0RBVEFfQ09NUExFVEUsCisJRVZFTlRfREFUQV9FUlJPUiwKKwlFVkVOVF9YRkVSX0VSUk9SCit9OworCitzdHJ1Y3QgbW1jX2RhdGE7CisKKy8qKgorICogc3RydWN0IGR3X21jaSAtIE1NQyBjb250cm9sbGVyIHN0YXRlIHNoYXJlZCBiZXR3ZWVuIGFsbCBzbG90cworICogQGxvY2s6IFNwaW5sb2NrIHByb3RlY3RpbmcgdGhlIHF1ZXVlIGFuZCBhc3NvY2lhdGVkIGRhdGEuCisgKiBAcmVnczogUG9pbnRlciB0byBNTUlPIHJlZ2lzdGVycy4KKyAqIEBzZzogU2NhdHRlcmxpc3QgZW50cnkgY3VycmVudGx5IGJlaW5nIHByb2Nlc3NlZCBieSBQSU8gY29kZSwgaWYgYW55LgorICogQHBpb19vZmZzZXQ6IE9mZnNldCBpbnRvIHRoZSBjdXJyZW50IHNjYXR0ZXJsaXN0IGVudHJ5LgorICogQGN1cl9zbG90OiBUaGUgc2xvdCB3aGljaCBpcyBjdXJyZW50bHkgdXNpbmcgdGhlIGNvbnRyb2xsZXIuCisgKiBAbXJxOiBUaGUgcmVxdWVzdCBjdXJyZW50bHkgYmVpbmcgcHJvY2Vzc2VkIG9uIEBjdXJfc2xvdCwKKyAqCW9yIE5VTEwgaWYgdGhlIGNvbnRyb2xsZXIgaXMgaWRsZS4KKyAqIEBjbWQ6IFRoZSBjb21tYW5kIGN1cnJlbnRseSBiZWluZyBzZW50IHRvIHRoZSBjYXJkLCBvciBOVUxMLgorICogQGRhdGE6IFRoZSBkYXRhIGN1cnJlbnRseSBiZWluZyB0cmFuc2ZlcnJlZCwgb3IgTlVMTCBpZiBubyBkYXRhCisgKgl0cmFuc2ZlciBpcyBpbiBwcm9ncmVzcy4KKyAqIEB1c2VfZG1hOiBXaGV0aGVyIERNQSBjaGFubmVsIGlzIGluaXRpYWxpemVkIG9yIG5vdC4KKyAqIEBzZ19kbWE6IEJ1cyBhZGRyZXNzIG9mIERNQSBidWZmZXIuCisgKiBAc2dfY3B1OiBWaXJ0dWFsIGFkZHJlc3Mgb2YgRE1BIGJ1ZmZlci4KKyAqIEBkbWFfb3BzOiBQb2ludGVyIHRvIHBsYXRmb3JtLXNwZWNpZmljIERNQSBjYWxsYmFja3MuCisgKiBAY21kX3N0YXR1czogU25hcHNob3Qgb2YgU1IgdGFrZW4gdXBvbiBjb21wbGV0aW9uIG9mIHRoZSBjdXJyZW50CisgKgljb21tYW5kLiBPbmx5IHZhbGlkIHdoZW4gRVZFTlRfQ01EX0NPTVBMRVRFIGlzIHBlbmRpbmcuCisgKiBAZGF0YV9zdGF0dXM6IFNuYXBzaG90IG9mIFNSIHRha2VuIHVwb24gY29tcGxldGlvbiBvZiB0aGUgY3VycmVudAorICoJZGF0YSB0cmFuc2Zlci4gT25seSB2YWxpZCB3aGVuIEVWRU5UX0RBVEFfQ09NUExFVEUgb3IKKyAqCUVWRU5UX0RBVEFfRVJST1IgaXMgcGVuZGluZy4KKyAqIEBzdG9wX2NtZHI6IFZhbHVlIHRvIGJlIGxvYWRlZCBpbnRvIENNRFIgd2hlbiB0aGUgc3RvcCBjb21tYW5kIGlzCisgKgl0byBiZSBzZW50LgorICogQGRpcl9zdGF0dXM6IERpcmVjdGlvbiBvZiBjdXJyZW50IHRyYW5zZmVyLgorICogQHRhc2tsZXQ6IFRhc2tsZXQgcnVubmluZyB0aGUgcmVxdWVzdCBzdGF0ZSBtYWNoaW5lLgorICogQGNhcmRfdGFza2xldDogVGFza2xldCBoYW5kbGluZyBjYXJkIGRldGVjdC4KKyAqIEBwZW5kaW5nX2V2ZW50czogQml0bWFzayBvZiBldmVudHMgZmxhZ2dlZCBieSB0aGUgaW50ZXJydXB0IGhhbmRsZXIKKyAqCXRvIGJlIHByb2Nlc3NlZCBieSB0aGUgdGFza2xldC4KKyAqIEBjb21wbGV0ZWRfZXZlbnRzOiBCaXRtYXNrIG9mIGV2ZW50cyB3aGljaCB0aGUgc3RhdGUgbWFjaGluZSBoYXMKKyAqCXByb2Nlc3NlZC4KKyAqIEBzdGF0ZTogVGFza2xldCBzdGF0ZS4KKyAqIEBxdWV1ZTogTGlzdCBvZiBzbG90cyB3YWl0aW5nIGZvciBhY2Nlc3MgdG8gdGhlIGNvbnRyb2xsZXIuCisgKiBAYnVzX2h6OiBUaGUgcmF0ZSBvZiBAbWNrIGluIEh6LiBUaGlzIGZvcm1zIHRoZSBiYXNpcyBmb3IgTU1DIGJ1cworICoJcmF0ZSBhbmQgdGltZW91dCBjYWxjdWxhdGlvbnMuCisgKiBAY3VycmVudF9zcGVlZDogQ29uZmlndXJlZCByYXRlIG9mIHRoZSBjb250cm9sbGVyLgorICogQG51bV9zbG90czogTnVtYmVyIG9mIHNsb3RzIGF2YWlsYWJsZS4KKyAqIEBwZGV2OiBQbGF0Zm9ybSBkZXZpY2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBNTUMgY29udHJvbGxlci4KKyAqIEBwZGF0YTogUGxhdGZvcm0gZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlIE1NQyBjb250cm9sbGVyLgorICogQHNsb3Q6IFNsb3RzIHNoYXJpbmcgdGhpcyBNTUMgY29udHJvbGxlci4KKyAqIEBkYXRhX3NoaWZ0OiBsb2cyIG9mIEZJRk8gaXRlbSBzaXplLgorICogQHB1c2hfZGF0YTogUG9pbnRlciB0byBGSUZPIHB1c2ggZnVuY3Rpb24uCisgKiBAcHVsbF9kYXRhOiBQb2ludGVyIHRvIEZJRk8gcHVsbCBmdW5jdGlvbi4KKyAqIEBxdWlya3M6IFNldCBvZiBxdWlya3MgdGhhdCBhcHBseSB0byBzcGVjaWZpYyB2ZXJzaW9ucyBvZiB0aGUgSVAuCisgKgorICogTG9ja2luZworICogPT09PT09PQorICoKKyAqIEBsb2NrIGlzIGEgc29mdGlycS1zYWZlIHNwaW5sb2NrIHByb3RlY3RpbmcgQHF1ZXVlIGFzIHdlbGwgYXMKKyAqIEBjdXJfc2xvdCwgQG1ycSBhbmQgQHN0YXRlLiBUaGVzZSBtdXN0IGFsd2F5cyBiZSB1cGRhdGVkCisgKiBhdCB0aGUgc2FtZSB0aW1lIHdoaWxlIGhvbGRpbmcgQGxvY2suCisgKgorICogVGhlIEBtcnEgZmllbGQgb2Ygc3RydWN0IGR3X21jaV9zbG90IGlzIGFsc28gcHJvdGVjdGVkIGJ5IEBsb2NrLAorICogYW5kIG11c3QgYWx3YXlzIGJlIHdyaXR0ZW4gYXQgdGhlIHNhbWUgdGltZSBhcyB0aGUgc2xvdCBpcyBhZGRlZCB0bworICogQHF1ZXVlLgorICoKKyAqIEBwZW5kaW5nX2V2ZW50cyBhbmQgQGNvbXBsZXRlZF9ldmVudHMgYXJlIGFjY2Vzc2VkIHVzaW5nIGF0b21pYyBiaXQKKyAqIG9wZXJhdGlvbnMsIHNvIHRoZXkgZG9uJ3QgbmVlZCBhbnkgbG9ja2luZy4KKyAqCisgKiBOb25lIG9mIHRoZSBmaWVsZHMgdG91Y2hlZCBieSB0aGUgaW50ZXJydXB0IGhhbmRsZXIgbmVlZCBhbnkKKyAqIGxvY2tpbmcuIEhvd2V2ZXIsIG9yZGVyaW5nIGlzIGltcG9ydGFudDogQmVmb3JlIEVWRU5UX0RBVEFfRVJST1Igb3IKKyAqIEVWRU5UX0RBVEFfQ09NUExFVEUgaXMgc2V0IGluIEBwZW5kaW5nX2V2ZW50cywgYWxsIGRhdGEtcmVsYXRlZAorICogaW50ZXJydXB0cyBtdXN0IGJlIGRpc2FibGVkIGFuZCBAZGF0YV9zdGF0dXMgdXBkYXRlZCB3aXRoIGEKKyAqIHNuYXBzaG90IG9mIFNSLiBTaW1pbGFybHksIGJlZm9yZSBFVkVOVF9DTURfQ09NUExFVEUgaXMgc2V0LCB0aGUKKyAqIENNRFJEWSBpbnRlcnVwdCBtdXN0IGJlIGRpc2FibGVkIGFuZCBAY21kX3N0YXR1cyB1cGRhdGVkIHdpdGggYQorICogc25hcHNob3Qgb2YgU1IsIGFuZCBiZWZvcmUgRVZFTlRfWEZFUl9DT01QTEVURSBjYW4gYmUgc2V0LCB0aGUKKyAqIGJ5dGVzX3hmZXJlZCBmaWVsZCBvZiBAZGF0YSBtdXN0IGJlIHdyaXR0ZW4uIFRoaXMgaXMgZW5zdXJlZCBieQorICogdXNpbmcgYmFycmllcnMuCisgKi8KK3N0cnVjdCBkd19tY2kgeworCXNwaW5sb2NrX3QJCWxvY2s7CisJdm9pZCBfX2lvbWVtCQkqcmVnczsKKworCXN0cnVjdCBzY2F0dGVybGlzdAkqc2c7CisJdW5zaWduZWQgaW50CQlwaW9fb2Zmc2V0OworCisJc3RydWN0IGR3X21jaV9zbG90CSpjdXJfc2xvdDsKKwlzdHJ1Y3QgbW1jX3JlcXVlc3QJKm1ycTsKKwlzdHJ1Y3QgbW1jX2NvbW1hbmQJKmNtZDsKKwlzdHJ1Y3QgbW1jX2RhdGEJCSpkYXRhOworCisJLyogRE1BIGludGVyZmFjZSBtZW1iZXJzKi8KKwlpbnQJCQl1c2VfZG1hOworCisJZG1hX2FkZHJfdAkJc2dfZG1hOworCXZvaWQJCQkqc2dfY3B1OworCXN0cnVjdCBkd19tY2lfZG1hX29wcwkqZG1hX29wczsKKyNpZmRlZiBDT05GSUdfTU1DX0RXX0lETUFDCisJdW5zaWduZWQgaW50CQlyaW5nX3NpemU7CisjZWxzZQorCXN0cnVjdCBkd19tY2lfZG1hX2RhdGEJKmRtYV9kYXRhOworI2VuZGlmCisJdTMyCQkJY21kX3N0YXR1czsKKwl1MzIJCQlkYXRhX3N0YXR1czsKKwl1MzIJCQlzdG9wX2NtZHI7CisJdTMyCQkJZGlyX3N0YXR1czsKKwlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QJdGFza2xldDsKKwlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QJY2FyZF90YXNrbGV0OworCXVuc2lnbmVkIGxvbmcJCXBlbmRpbmdfZXZlbnRzOworCXVuc2lnbmVkIGxvbmcJCWNvbXBsZXRlZF9ldmVudHM7CisJZW51bSBkd19tY2lfc3RhdGUJc3RhdGU7CisJc3RydWN0IGxpc3RfaGVhZAlxdWV1ZTsKKworCXUzMgkJCWJ1c19oejsKKwl1MzIJCQljdXJyZW50X3NwZWVkOworCXUzMgkJCW51bV9zbG90czsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlCSpwZGV2OworCXN0cnVjdCBkd19tY2lfYm9hcmQJKnBkYXRhOworCXN0cnVjdCBkd19tY2lfc2xvdAkqc2xvdFtNQVhfTUNJX1NMT1RTXTsKKworCS8qIEZJRk8gcHVzaCBhbmQgcHVsbCAqLworCWludAkJCWRhdGFfc2hpZnQ7CisJdm9pZCAoKnB1c2hfZGF0YSkoc3RydWN0IGR3X21jaSAqaG9zdCwgdm9pZCAqYnVmLCBpbnQgY250KTsKKwl2b2lkICgqcHVsbF9kYXRhKShzdHJ1Y3QgZHdfbWNpICpob3N0LCB2b2lkICpidWYsIGludCBjbnQpOworCisJLyogV29ya2Fyb3VuZCBmbGFncyAqLworCXUzMgkJCXF1aXJrczsKK307CisKKy8qIERNQSBvcHMgZm9yIEludGVybmFsL0V4dGVybmFsIERNQUMgaW50ZXJmYWNlICovCitzdHJ1Y3QgZHdfbWNpX2RtYV9vcHMgeworCS8qIERNQSBPcHMgKi8KKwlpbnQgKCppbml0KShzdHJ1Y3QgZHdfbWNpICpob3N0KTsKKwl2b2lkICgqc3RhcnQpKHN0cnVjdCBkd19tY2kgKmhvc3QsIHVuc2lnbmVkIGludCBzZ19sZW4pOworCXZvaWQgKCpjb21wbGV0ZSkoc3RydWN0IGR3X21jaSAqaG9zdCk7CisJdm9pZCAoKnN0b3ApKHN0cnVjdCBkd19tY2kgKmhvc3QpOworCXZvaWQgKCpjbGVhbnVwKShzdHJ1Y3QgZHdfbWNpICpob3N0KTsKKwl2b2lkICgqZXhpdCkoc3RydWN0IGR3X21jaSAqaG9zdCk7Cit9OworCisvKiBJUCBRdWlya3MvZmxhZ3MuICovCisvKiBObyBzcGVjaWFsIHF1aXJrcyBvciBmbGFncyB0byBjYXRlciBmb3IgKi8KKyNkZWZpbmUgRFdfTUNJX1FVSVJLX05PTkUJCTAKKy8qIERUTyBmaXggZm9yIGNvbW1hbmQgdHJhbnNtaXNzaW9uIHdpdGggSURNQUMgY29uZmlndXJlZCAqLworI2RlZmluZSBEV19NQ0lfUVVJUktfSURNQUNfRFRPCQkxCisvKiBkZWxheSBuZWVkZWQgYmV0d2VlbiByZXRyaWVzIG9uIHNvbWUgMi4xMWEgaW1wbGVtZW50YXRpb25zICovCisjZGVmaW5lIERXX01DSV9RVUlSS19SRVRSWV9ERUxBWQkyCisvKiBIaWdoIFNwZWVkIENhcGFibGUgLSBTdXBwb3J0cyBIUyBjYXJkcyAodXB0byA1ME1IeikgKi8KKyNkZWZpbmUgRFdfTUNJX1FVSVJLX0hJR0hTUEVFRAkJNAorCisKK3N0cnVjdCBkbWFfcGRhdGE7CisKK3N0cnVjdCBibG9ja19zZXR0aW5ncyB7CisJdW5zaWduZWQgc2hvcnQJbWF4X3NlZ3M7CS8qIHNlZSBibGtfcXVldWVfbWF4X3NlZ21lbnRzICovCisJdW5zaWduZWQgaW50CW1heF9ibGtfc2l6ZTsJLyogbWF4aW11bSBzaXplIG9mIG9uZSBtbWMgYmxvY2sgKi8KKwl1bnNpZ25lZCBpbnQJbWF4X2Jsa19jb3VudDsJLyogbWF4aW11bSBudW1iZXIgb2YgYmxvY2tzIGluIG9uZSByZXEqLworCXVuc2lnbmVkIGludAltYXhfcmVxX3NpemU7CS8qIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIGluIG9uZSByZXEqLworCXVuc2lnbmVkIGludAltYXhfc2VnX3NpemU7CS8qIHNlZSBibGtfcXVldWVfbWF4X3NlZ21lbnRfc2l6ZSAqLworfTsKKworLyogQm9hcmQgcGxhdGZvcm0gZGF0YSAqLworc3RydWN0IGR3X21jaV9ib2FyZCB7CisJdTMyIG51bV9zbG90czsKKworCXUzMiBxdWlya3M7IC8qIFdvcmthcm91bmQgLyBRdWlyayBmbGFncyAqLworCXVuc2lnbmVkIGludCBidXNfaHo7IC8qIEJ1cyBzcGVlZCAqLworCisJLyogZGVsYXkgaW4gbVMgYmVmb3JlIGRldGVjdGluZyBjYXJkcyBhZnRlciBpbnRlcnJ1cHQgKi8KKwl1MzIgZGV0ZWN0X2RlbGF5X21zOworCisJaW50ICgqaW5pdCkodTMyIHNsb3RfaWQsIGlycV9oYW5kbGVyX3QgLCB2b2lkICopOworCWludCAoKmdldF9ybykodTMyIHNsb3RfaWQpOworCWludCAoKmdldF9jZCkodTMyIHNsb3RfaWQpOworCWludCAoKmdldF9vY3IpKHUzMiBzbG90X2lkKTsKKwlpbnQgKCpnZXRfYnVzX3dkKSh1MzIgc2xvdF9pZCk7CisJLyoKKwkgKiBFbmFibGUgcG93ZXIgdG8gc2VsZWN0ZWQgc2xvdCBhbmQgc2V0IHZvbHRhZ2UgdG8gZGVzaXJlZCBsZXZlbC4KKwkgKiBWb2x0YWdlIGxldmVscyBhcmUgc3BlY2lmaWVkIHVzaW5nIE1NQ19WRERfeHh4IGRlZmluZXMgZGVmaW5lZAorCSAqIGluIGxpbnV4L21tYy9ob3N0LmggZmlsZS4KKwkgKi8KKwl2b2lkICgqc2V0cG93ZXIpKHUzMiBzbG90X2lkLCB1MzIgdm9sdCk7CisJdm9pZCAoKmV4aXQpKHUzMiBzbG90X2lkKTsKKwl2b2lkICgqc2VsZWN0X3Nsb3QpKHUzMiBzbG90X2lkKTsKKworCXN0cnVjdCBkd19tY2lfZG1hX29wcyAqZG1hX29wczsKKwlzdHJ1Y3QgZG1hX3BkYXRhICpkYXRhOworCXN0cnVjdCBibG9ja19zZXR0aW5ncyAqYmxrX3NldHRpbmdzOworfTsKKworI2VuZGlmIC8qIF9MSU5VWF9NTUNfRFdfTU1DX0hfICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21tYy9ob3N0LmggYi9pbmNsdWRlL2xpbnV4L21tYy9ob3N0LmgKaW5kZXggMzBmNmZhZC4uYmNiNzkzZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tbWMvaG9zdC5oCisrKyBiL2luY2x1ZGUvbGludXgvbW1jL2hvc3QuaApAQCAtMTMxLDYgKzEzMSw5IEBACiAJdW5zaWduZWQgaW50CQlmX21heDsKIAl1bnNpZ25lZCBpbnQJCWZfaW5pdDsKIAl1MzIJCQlvY3JfYXZhaWw7CisJdTMyCQkJb2NyX2F2YWlsX3NkaW87CS8qIFNESU8tc3BlY2lmaWMgT0NSICovCisJdTMyCQkJb2NyX2F2YWlsX3NkOwkvKiBTRC1zcGVjaWZpYyBPQ1IgKi8KKwl1MzIJCQlvY3JfYXZhaWxfbW1jOwkvKiBNTUMtc3BlY2lmaWMgT0NSICovCiAJc3RydWN0IG5vdGlmaWVyX2Jsb2NrCXBtX25vdGlmeTsKIAogI2RlZmluZSBNTUNfVkREXzE2NV8xOTUJCTB4MDAwMDAwODAJLyogVkREIHZvbHRhZ2UgMS42NSAtIDEuOTUgKi8KQEAgLTE2OSw5ICsxNzIsMjAgQEAKICNkZWZpbmUgTU1DX0NBUF8xXzJWX0REUgkoMSA8PCAxMikJLyogY2FuIHN1cHBvcnQgKi8KIAkJCQkJCS8qIEREUiBtb2RlIGF0IDEuMlYgKi8KICNkZWZpbmUgTU1DX0NBUF9QT1dFUl9PRkZfQ0FSRAkoMSA8PCAxMykJLyogQ2FuIHBvd2VyIG9mZiBhZnRlciBib290ICovCisjZGVmaW5lIE1NQ19DQVBfQlVTX1dJRFRIX1RFU1QJKDEgPDwgMTQpCS8qIENNRDE0L0NNRDE5IGJ1cyB3aWR0aCBvayAqLwogCiAJbW1jX3BtX2ZsYWdfdAkJcG1fY2FwczsJLyogc3VwcG9ydGVkIHBtIGZlYXR1cmVzICovCiAKKyNpZmRlZiBDT05GSUdfTU1DX0NMS0dBVEUKKwlpbnQJCQljbGtfcmVxdWVzdHM7CS8qIGludGVybmFsIHJlZmVyZW5jZSBjb3VudGVyICovCisJdW5zaWduZWQgaW50CQljbGtfZGVsYXk7CS8qIG51bWJlciBvZiBNQ0kgY2xrIGhvbGQgY3ljbGVzICovCisJYm9vbAkJCWNsa19nYXRlZDsJLyogY2xvY2sgZ2F0ZWQgKi8KKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QJY2xrX2dhdGVfd29yazsgLyogZGVsYXllZCBjbG9jayBnYXRlICovCisJdW5zaWduZWQgaW50CQljbGtfb2xkOwkvKiBvbGQgY2xvY2sgdmFsdWUgY2FjaGUgKi8KKwlzcGlubG9ja190CQljbGtfbG9jazsJLyogbG9jayBmb3IgY2xrIGZpZWxkcyAqLworCXN0cnVjdCBtdXRleAkJY2xrX2dhdGVfbXV0ZXg7CS8qIG11dGV4IGZvciBjbG9jayBnYXRpbmcgKi8KKyNlbmRpZgorCiAJLyogaG9zdCBzcGVjaWZpYyBibG9jayBkYXRhICovCiAJdW5zaWduZWQgaW50CQltYXhfc2VnX3NpemU7CS8qIHNlZSBibGtfcXVldWVfbWF4X3NlZ21lbnRfc2l6ZSAqLwogCXVuc2lnbmVkIHNob3J0CQltYXhfc2VnczsJLyogc2VlIGJsa19xdWV1ZV9tYXhfc2VnbWVudHMgKi8KQEAgLTMwNyw1ICszMjEsMTAgQEAKIAlyZXR1cm4gIShob3N0LT5jYXBzICYgTU1DX0NBUF9OT05SRU1PVkFCTEUpICYmIG1tY19hc3N1bWVfcmVtb3ZhYmxlOwogfQogCitzdGF0aWMgaW5saW5lIGludCBtbWNfY2FyZF9pc19wb3dlcmVkX3Jlc3VtZWQoc3RydWN0IG1tY19ob3N0ICpob3N0KQoreworCXJldHVybiBob3N0LT5wbV9mbGFncyAmIE1NQ19QTV9LRUVQX1BPV0VSOworfQorCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tbWMvbW1jLmggYi9pbmNsdWRlL2xpbnV4L21tYy9tbWMuaAppbmRleCA5NTZmYmQ4Ny4uNjEyMzAxZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tbWMvbW1jLmgKKysrIGIvaW5jbHVkZS9saW51eC9tbWMvbW1jLmgKQEAgLTQwLDcgKzQwLDkgQEAKICNkZWZpbmUgTU1DX1JFQURfREFUX1VOVElMX1NUT1AgIDExICAgLyogYWR0YyBbMzE6MF0gZGFkciAgICAgICAgUjEgICovCiAjZGVmaW5lIE1NQ19TVE9QX1RSQU5TTUlTU0lPTiAgICAxMiAgIC8qIGFjICAgICAgICAgICAgICAgICAgICAgIFIxYiAqLwogI2RlZmluZSBNTUNfU0VORF9TVEFUVVMgICAgICAgICAgMTMgICAvKiBhYyAgIFszMToxNl0gUkNBICAgICAgICBSMSAgKi8KKyNkZWZpbmUgTU1DX0JVU19URVNUX1IgICAgICAgICAgIDE0ICAgLyogYWR0YyAgICAgICAgICAgICAgICAgICAgUjEgICovCiAjZGVmaW5lIE1NQ19HT19JTkFDVElWRV9TVEFURSAgICAxNSAgIC8qIGFjICAgWzMxOjE2XSBSQ0EgICAgICAgICAgICAqLworI2RlZmluZSBNTUNfQlVTX1RFU1RfVyAgICAgICAgICAgMTkgICAvKiBhZHRjICAgICAgICAgICAgICAgICAgICBSMSAgKi8KICNkZWZpbmUgTU1DX1NQSV9SRUFEX09DUiAgICAgICAgIDU4ICAgLyogc3BpICAgICAgICAgICAgICAgICAgc3BpX1IzICovCiAjZGVmaW5lIE1NQ19TUElfQ1JDX09OX09GRiAgICAgICA1OSAgIC8qIHNwaSAgWzA6MF0gZmxhZyAgICAgIHNwaV9SMSAqLwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21tYy9zZGhjaS5oIGIvaW5jbHVkZS9saW51eC9tbWMvc2RoY2kuaAppbmRleCAxZmRjNjczLi44M2JkOWY3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21tYy9zZGhjaS5oCisrKyBiL2luY2x1ZGUvbGludXgvbW1jL3NkaGNpLmgKQEAgLTgzLDYgKzgzLDggQEAKICNkZWZpbmUgU0RIQ0lfUVVJUktfTVVMVElCTE9DS19SRUFEX0FDTUQxMgkJKDE8PDI4KQogLyogQ29udHJvbGxlciBkb2Vzbid0IGhhdmUgSElTUEQgYml0IGZpZWxkIGluIEhJLVNQRUVEIFNEIGNhcmQgKi8KICNkZWZpbmUgU0RIQ0lfUVVJUktfTk9fSElTUERfQklUCQkJKDE8PDI5KQorLyogQ29udHJvbGxlciB0cmVhdHMgQURNQSBkZXNjcmlwdG9ycyB3aXRoIGxlbmd0aCAwMDAwaCBpbmNvcnJlY3RseSAqLworI2RlZmluZSBTREhDSV9RVUlSS19CUk9LRU5fQURNQV9aRVJPTEVOX0RFU0MJCSgxPDwzMCkKIAogCWludCBpcnE7CQkvKiBEZXZpY2UgSVJRICovCiAJdm9pZCBfX2lvbWVtICppb2FkZHI7CS8qIE1hcHBlZCBhZGRyZXNzICovCkBAIC0xMzksNiArMTQxLDEwIEBACiAKIAl1bnNpZ25lZCBpbnQgY2FwczsJLyogQWx0ZXJuYXRpdmUgY2FwYWJpbGl0aWVzICovCiAKKwl1bnNpZ25lZCBpbnQgICAgICAgICAgICBvY3JfYXZhaWxfc2RpbzsJLyogT0NSIGJpdCBtYXNrcyAqLworCXVuc2lnbmVkIGludCAgICAgICAgICAgIG9jcl9hdmFpbF9zZDsKKwl1bnNpZ25lZCBpbnQgICAgICAgICAgICBvY3JfYXZhaWxfbW1jOworCiAJdW5zaWduZWQgbG9uZyBwcml2YXRlWzBdIF9fX19jYWNoZWxpbmVfYWxpZ25lZDsKIH07CiAjZW5kaWYgLyogX19TREhDSV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25mczMuaCBiL2luY2x1ZGUvbGludXgvbmZzMy5oCmluZGV4IGFjMzM4MDYuLjZjY2ZlM2IgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmZzMy5oCisrKyBiL2luY2x1ZGUvbGludXgvbmZzMy5oCkBAIC0xMSw2ICsxMSw5IEBACiAjZGVmaW5lIE5GUzNfTUFYR1JPVVBTCQkxNgogI2RlZmluZSBORlMzX0ZIU0laRQkJNjQKICNkZWZpbmUgTkZTM19DT09LSUVTSVpFCQk0CisjZGVmaW5lIE5GUzNfQ1JFQVRFVkVSRlNJWkUJOAorI2RlZmluZSBORlMzX0NPT0tJRVZFUkZTSVpFCTgKKyNkZWZpbmUgTkZTM19XUklURVZFUkZTSVpFCTgKICNkZWZpbmUgTkZTM19GSUZPX0RFVgkJKC0xKQogI2RlZmluZSBORlMzTU9ERV9GTVQJCTAxNzAwMDAKICNkZWZpbmUgTkZTM01PREVfRElSCQkwMDQwMDAwCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25mczQuaCBiL2luY2x1ZGUvbGludXgvbmZzNC5oCmluZGV4IDQ5MjViMjIuLjliNDYzMDAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmZzNC5oCisrKyBiL2luY2x1ZGUvbGludXgvbmZzNC5oCkBAIC0xMTEsOSArMTExLDEzIEBACiAKICNkZWZpbmUgRVhDSEdJRDRfRkxBR19TVVBQX01PVkVEX1JFRkVSCQkweDAwMDAwMDAxCiAjZGVmaW5lIEVYQ0hHSUQ0X0ZMQUdfU1VQUF9NT1ZFRF9NSUdSCQkweDAwMDAwMDAyCisjZGVmaW5lIEVYQ0hHSUQ0X0ZMQUdfQklORF9QUklOQ19TVEFURUlECTB4MDAwMDAxMDAKKwogI2RlZmluZSBFWENIR0lENF9GTEFHX1VTRV9OT05fUE5GUwkJMHgwMDAxMDAwMAogI2RlZmluZSBFWENIR0lENF9GTEFHX1VTRV9QTkZTX01EUwkJMHgwMDAyMDAwMAogI2RlZmluZSBFWENIR0lENF9GTEFHX1VTRV9QTkZTX0RTCQkweDAwMDQwMDAwCisjZGVmaW5lIEVYQ0hHSUQ0X0ZMQUdfTUFTS19QTkZTCQkJMHgwMDA3MDAwMAorCiAjZGVmaW5lIEVYQ0hHSUQ0X0ZMQUdfVVBEX0NPTkZJUk1FRF9SRUNfQQkweDQwMDAwMDAwCiAjZGVmaW5lIEVYQ0hHSUQ0X0ZMQUdfQ09ORklSTUVEX1IJCTB4ODAwMDAwMDAKIC8qCkBAIC0xMjEsOCArMTI1LDggQEAKICAqIHRoZXkncmUgc2V0IGluIHRoZSBhcmd1bWVudCBvciByZXNwb25zZSwgaGF2ZSBzZXBhcmF0ZQogICogaW52YWxpZCBmbGFnIG1hc2tzIGZvciBhcmcgKF9BKSBhbmQgcmVzcCAoX1IpLgogICovCi0jZGVmaW5lIEVYQ0hHSUQ0X0ZMQUdfTUFTS19BCQkJMHg0MDA3MDAwMwotI2RlZmluZSBFWENIR0lENF9GTEFHX01BU0tfUgkJCTB4ODAwNzAwMDMKKyNkZWZpbmUgRVhDSEdJRDRfRkxBR19NQVNLX0EJCQkweDQwMDcwMTAzCisjZGVmaW5lIEVYQ0hHSUQ0X0ZMQUdfTUFTS19SCQkJMHg4MDA3MDEwMwogCiAjZGVmaW5lIFNFUTRfU1RBVFVTX0NCX1BBVEhfRE9XTgkJMHgwMDAwMDAwMQogI2RlZmluZSBTRVE0X1NUQVRVU19DQl9HU1NfQ09OVEVYVFNfRVhQSVJJTkcJMHgwMDAwMDAwMgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZnNfZnNfc2IuaCBiL2luY2x1ZGUvbGludXgvbmZzX2ZzX3NiLmgKaW5kZXggNDUyZDk2NC4uYjE5NzU2MyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZnNfZnNfc2IuaAorKysgYi9pbmNsdWRlL2xpbnV4L25mc19mc19zYi5oCkBAIC00NywxMSArNDcsNiBAQAogCXU2NAkJCWNsX2NsaWVudGlkOwkvKiBjb25zdGFudCAqLwogCXVuc2lnbmVkIGxvbmcJCWNsX3N0YXRlOwogCi0Jc3RydWN0IHJiX3Jvb3QJCWNsX29wZW5vd25lcl9pZDsKLQlzdHJ1Y3QgcmJfcm9vdAkJY2xfbG9ja293bmVyX2lkOwotCi0Jc3RydWN0IGxpc3RfaGVhZAljbF9kZWxlZ2F0aW9uczsKLQlzdHJ1Y3QgcmJfcm9vdAkJY2xfc3RhdGVfb3duZXJzOwogCXNwaW5sb2NrX3QJCWNsX2xvY2s7CiAKIAl1bnNpZ25lZCBsb25nCQljbF9sZWFzZV90aW1lOwpAQCAtNzEsNiArNjYsNyBAQAogCSAqLwogCWNoYXIJCQljbF9pcGFkZHJbNDhdOwogCXVuc2lnbmVkIGNoYXIJCWNsX2lkX3VuaXF1aWZpZXI7CisJdTMyCQkJY2xfY2JfaWRlbnQ7CS8qIHY0LjAgY2FsbGJhY2sgaWRlbnRpZmllciAqLwogCWNvbnN0IHN0cnVjdCBuZnM0X21pbm9yX3ZlcnNpb25fb3BzICpjbF9tdm9wczsKICNlbmRpZiAvKiBDT05GSUdfTkZTX1Y0ICovCiAKQEAgLTE0OCw3ICsxNDQsMTQgQEAKIAkJCQkJCSAgIHRoYXQgYXJlIHN1cHBvcnRlZCBvbiB0aGlzCiAJCQkJCQkgICBmaWxlc3lzdGVtICovCiAJc3RydWN0IHBuZnNfbGF5b3V0ZHJpdmVyX3R5cGUgICpwbmZzX2N1cnJfbGQ7IC8qIEFjdGl2ZSBsYXlvdXQgZHJpdmVyICovCisJc3RydWN0IHJwY193YWl0X3F1ZXVlCXJvY19ycGN3YWl0cTsKKworCS8qIHRoZSBmb2xsb3dpbmcgZmllbGRzIGFyZSBwcm90ZWN0ZWQgYnkgbmZzX2NsaWVudC0+Y2xfbG9jayAqLworCXN0cnVjdCByYl9yb290CQlzdGF0ZV9vd25lcnM7CisJc3RydWN0IHJiX3Jvb3QJCW9wZW5vd25lcl9pZDsKKwlzdHJ1Y3QgcmJfcm9vdAkJbG9ja293bmVyX2lkOwogI2VuZGlmCisJc3RydWN0IGxpc3RfaGVhZAlkZWxlZ2F0aW9uczsKIAl2b2lkICgqZGVzdHJveSkoc3RydWN0IG5mc19zZXJ2ZXIgKik7CiAKIAlhdG9taWNfdCBhY3RpdmU7IC8qIEtlZXAgdHJhY2Ugb2YgYW55IGFjdGl2aXR5IHRvIHRoaXMgc2VydmVyICovCkBAIC0xOTYsNiArMTk5LDcgQEAKIAkJCQkJCSAqIG9wIGZvciBkeW5hbWljIHJlc2l6aW5nICovCiAJaW50CQl0YXJnZXRfbWF4X3Nsb3RzOwkvKiBTZXQgYnkgQ0JfUkVDQUxMX1NMT1QgYXMKIAkJCQkJCSAqIHRoZSBuZXcgbWF4X3Nsb3RzICovCisJc3RydWN0IGNvbXBsZXRpb24gY29tcGxldGU7CiB9OwogCiBzdGF0aWMgaW5saW5lIGludCBzbG90X2lkeChzdHJ1Y3QgbmZzNF9zbG90X3RhYmxlICp0YmwsIHN0cnVjdCBuZnM0X3Nsb3QgKnNwKQpAQCAtMjEyLDcgKzIxNiw2IEBACiAJdW5zaWduZWQgbG9uZwkJCXNlc3Npb25fc3RhdGU7CiAJdTMyCQkJCWhhc2hfYWxnOwogCXUzMgkJCQlzc3ZfbGVuOwotCXN0cnVjdCBjb21wbGV0aW9uCQljb21wbGV0ZTsKIAogCS8qIFRoZSBmb3JlIGFuZCBiYWNrIGNoYW5uZWwgKi8KIAlzdHJ1Y3QgbmZzNF9jaGFubmVsX2F0dHJzCWZjX2F0dHJzOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZnNfeGRyLmggYi9pbmNsdWRlL2xpbnV4L25mc194ZHIuaAppbmRleCA4MGYwNzE5Li5iMDA2ODU3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25mc194ZHIuaAorKysgYi9pbmNsdWRlL2xpbnV4L25mc194ZHIuaApAQCAtMjA4LDYgKzIwOCw3IEBACiAJc3RydWN0IGlub2RlICppbm9kZTsKIAlzdHJ1Y3QgbmZzX29wZW5fY29udGV4dCAqY3R4OwogCXN0cnVjdCBuZnM0X3NlcXVlbmNlX2FyZ3Mgc2VxX2FyZ3M7CisJbmZzNF9zdGF0ZWlkIHN0YXRlaWQ7CiB9OwogCiBzdHJ1Y3QgbmZzNF9sYXlvdXRnZXRfcmVzIHsKQEAgLTIyMyw3ICsyMjQsNiBAQAogCXN0cnVjdCBuZnM0X2xheW91dGdldF9hcmdzIGFyZ3M7CiAJc3RydWN0IG5mczRfbGF5b3V0Z2V0X3JlcyByZXM7CiAJc3RydWN0IHBuZnNfbGF5b3V0X3NlZ21lbnQgKipsc2VncHA7Ci0JaW50IHN0YXR1czsKIH07CiAKIHN0cnVjdCBuZnM0X2dldGRldmljZWluZm9fYXJncyB7CkBAIC0zMTcsNiArMzE3LDcgQEAKIHN0cnVjdCBuZnNfbG93bmVyIHsKIAlfX3U2NAkJCWNsaWVudGlkOwogCV9fdTY0CQkJaWQ7CisJZGV2X3QJCQlzX2RldjsKIH07CiAKIHN0cnVjdCBuZnNfbG9ja19hcmdzIHsKQEAgLTQ4NCw2ICs0ODUsNyBAQAogCXN0cnVjdCBuZnNfZmggKgkJZmg7CiAJc3RydWN0IG5mc19mYXR0ciAqCWZhdHRyOwogCXVuc2lnbmVkIGNoYXIJCWRfdHlwZTsKKwlzdHJ1Y3QgbmZzX3NlcnZlciAqCXNlcnZlcjsKIH07CiAKIC8qCkBAIC0xMDg5LDcgKzEwOTEsNyBAQAogCWludAkoKnBhdGhjb25mKSAoc3RydWN0IG5mc19zZXJ2ZXIgKiwgc3RydWN0IG5mc19maCAqLAogCQkJICAgICBzdHJ1Y3QgbmZzX3BhdGhjb25mICopOwogCWludAkoKnNldF9jYXBhYmlsaXRpZXMpKHN0cnVjdCBuZnNfc2VydmVyICosIHN0cnVjdCBuZnNfZmggKik7Ci0JX19iZTMyICooKmRlY29kZV9kaXJlbnQpKHN0cnVjdCB4ZHJfc3RyZWFtICosIHN0cnVjdCBuZnNfZW50cnkgKiwgc3RydWN0IG5mc19zZXJ2ZXIgKiwgaW50IHBsdXMpOworCWludAkoKmRlY29kZV9kaXJlbnQpKHN0cnVjdCB4ZHJfc3RyZWFtICosIHN0cnVjdCBuZnNfZW50cnkgKiwgaW50KTsKIAl2b2lkCSgqcmVhZF9zZXR1cCkgICAoc3RydWN0IG5mc19yZWFkX2RhdGEgKiwgc3RydWN0IHJwY19tZXNzYWdlICopOwogCWludAkoKnJlYWRfZG9uZSkgIChzdHJ1Y3QgcnBjX3Rhc2sgKiwgc3RydWN0IG5mc19yZWFkX2RhdGEgKik7CiAJdm9pZAkoKndyaXRlX3NldHVwKSAgKHN0cnVjdCBuZnNfd3JpdGVfZGF0YSAqLCBzdHJ1Y3QgcnBjX21lc3NhZ2UgKik7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L29mX2FkZHJlc3MuaCBiL2luY2x1ZGUvbGludXgvb2ZfYWRkcmVzcy5oCmluZGV4IDhhZWEwNmYuLjJmZWRhNmVlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L29mX2FkZHJlc3MuaAorKysgYi9pbmNsdWRlL2xpbnV4L29mX2FkZHJlc3MuaApAQCAtMyw3ICszLDcgQEAKICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9vZi5oPgogCi1leHRlcm4gdTY0IG9mX3RyYW5zbGF0ZV9hZGRyZXNzKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsIGNvbnN0IHUzMiAqYWRkcik7CitleHRlcm4gdTY0IG9mX3RyYW5zbGF0ZV9hZGRyZXNzKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsIGNvbnN0IF9fYmUzMiAqYWRkcik7CiBleHRlcm4gaW50IG9mX2FkZHJlc3NfdG9fcmVzb3VyY2Uoc3RydWN0IGRldmljZV9ub2RlICpkZXYsIGludCBpbmRleCwKIAkJCQkgIHN0cnVjdCByZXNvdXJjZSAqcik7CiBleHRlcm4gdm9pZCBfX2lvbWVtICpvZl9pb21hcChzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldmljZSwgaW50IGluZGV4KTsKQEAgLTIxLDcgKzIxLDcgQEAKICNlbmRpZgogCiAjaWZkZWYgQ09ORklHX1BDSQotZXh0ZXJuIGNvbnN0IHUzMiAqb2ZfZ2V0X3BjaV9hZGRyZXNzKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZGV2LCBpbnQgYmFyX25vLAorZXh0ZXJuIGNvbnN0IF9fYmUzMiAqb2ZfZ2V0X3BjaV9hZGRyZXNzKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZGV2LCBpbnQgYmFyX25vLAogCQkJICAgICAgIHU2NCAqc2l6ZSwgdW5zaWduZWQgaW50ICpmbGFncyk7CiBleHRlcm4gaW50IG9mX3BjaV9hZGRyZXNzX3RvX3Jlc291cmNlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZGV2LCBpbnQgYmFyLAogCQkJCSAgICAgIHN0cnVjdCByZXNvdXJjZSAqcik7CkBAIC0zMiw3ICszMiw3IEBACiAJcmV0dXJuIC1FTk9TWVM7CiB9CiAKLXN0YXRpYyBpbmxpbmUgY29uc3QgdTMyICpvZl9nZXRfcGNpX2FkZHJlc3Moc3RydWN0IGRldmljZV9ub2RlICpkZXYsCitzdGF0aWMgaW5saW5lIGNvbnN0IF9fYmUzMiAqb2ZfZ2V0X3BjaV9hZGRyZXNzKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZGV2LAogCQlpbnQgYmFyX25vLCB1NjQgKnNpemUsIHVuc2lnbmVkIGludCAqZmxhZ3MpCiB7CiAJcmV0dXJuIE5VTEw7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L29mX2ZkdC5oIGIvaW5jbHVkZS9saW51eC9vZl9mZHQuaAppbmRleCA3YmJmNWIzLi4wZWYyMmExIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L29mX2ZkdC5oCisrKyBiL2luY2x1ZGUvbGludXgvb2ZfZmR0LmgKQEAgLTU4LDYgKzU4LDIzIEBACiB9OwogCiAjaWYgZGVmaW5lZChDT05GSUdfT0ZfRkxBVFRSRUUpCisKK3N0cnVjdCBkZXZpY2Vfbm9kZTsKKworLyogRm9yIHNjYW5uaW5nIGFuIGFyYml0cmFyeSBkZXZpY2UtdHJlZSBhdCBhbnkgdGltZSAqLworZXh0ZXJuIGNoYXIgKm9mX2ZkdF9nZXRfc3RyaW5nKHN0cnVjdCBib290X3BhcmFtX2hlYWRlciAqYmxvYiwgdTMyIG9mZnNldCk7CitleHRlcm4gdm9pZCAqb2ZfZmR0X2dldF9wcm9wZXJ0eShzdHJ1Y3QgYm9vdF9wYXJhbV9oZWFkZXIgKmJsb2IsCisJCQkJIHVuc2lnbmVkIGxvbmcgbm9kZSwKKwkJCQkgY29uc3QgY2hhciAqbmFtZSwKKwkJCQkgdW5zaWduZWQgbG9uZyAqc2l6ZSk7CitleHRlcm4gaW50IG9mX2ZkdF9pc19jb21wYXRpYmxlKHN0cnVjdCBib290X3BhcmFtX2hlYWRlciAqYmxvYiwKKwkJCQl1bnNpZ25lZCBsb25nIG5vZGUsCisJCQkJY29uc3QgY2hhciAqY29tcGF0KTsKK2V4dGVybiBpbnQgb2ZfZmR0X21hdGNoKHN0cnVjdCBib290X3BhcmFtX2hlYWRlciAqYmxvYiwgdW5zaWduZWQgbG9uZyBub2RlLAorCQkJY29uc3QgY2hhciAqKmNvbXBhdCk7CitleHRlcm4gdm9pZCBvZl9mZHRfdW5mbGF0dGVuX3RyZWUodW5zaWduZWQgbG9uZyAqYmxvYiwKKwkJCSAgICAgICBzdHJ1Y3QgZGV2aWNlX25vZGUgKipteW5vZGVzKTsKKwogLyogVEJEOiBUZW1wb3JhcnkgZXhwb3J0IG9mIGZkdCBnbG9iYWxzIC0gcmVtb3ZlIHdoZW4gY29kZSBmdWxseSBtZXJnZWQgKi8KIGV4dGVybiBpbnQgX19pbml0ZGF0YSBkdF9yb290X2FkZHJfY2VsbHM7CiBleHRlcm4gaW50IF9faW5pdGRhdGEgZHRfcm9vdF9zaXplX2NlbGxzOwpAQCAtNzEsNiArODgsNyBAQAogZXh0ZXJuIHZvaWQgKm9mX2dldF9mbGF0X2R0X3Byb3AodW5zaWduZWQgbG9uZyBub2RlLCBjb25zdCBjaGFyICpuYW1lLAogCQkJCSB1bnNpZ25lZCBsb25nICpzaXplKTsKIGV4dGVybiBpbnQgb2ZfZmxhdF9kdF9pc19jb21wYXRpYmxlKHVuc2lnbmVkIGxvbmcgbm9kZSwgY29uc3QgY2hhciAqbmFtZSk7CitleHRlcm4gaW50IG9mX2ZsYXRfZHRfbWF0Y2godW5zaWduZWQgbG9uZyBub2RlLCBjb25zdCBjaGFyICoqbWF0Y2hlcyk7CiBleHRlcm4gdW5zaWduZWQgbG9uZyBvZl9nZXRfZmxhdF9kdF9yb290KHZvaWQpOwogCiBleHRlcm4gaW50IGVhcmx5X2luaXRfZHRfc2Nhbl9jaG9zZW4odW5zaWduZWQgbG9uZyBub2RlLCBjb25zdCBjaGFyICp1bmFtZSwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvb2ZfbmV0LmggYi9pbmNsdWRlL2xpbnV4L29mX25ldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5MTMwODEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L29mX25ldC5oCkBAIC0wLDAgKzEsMTUgQEAKKy8qCisgKiBPRiBoZWxwZXJzIGZvciBuZXR3b3JrIGRldmljZXMuCisgKgorICogVGhpcyBmaWxlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBHUEx2MgorICovCisKKyNpZm5kZWYgX19MSU5VWF9PRl9ORVRfSAorI2RlZmluZSBfX0xJTlVYX09GX05FVF9ICisKKyNpZmRlZiBDT05GSUdfT0ZfTkVUCisjaW5jbHVkZSA8bGludXgvb2YuaD4KK2V4dGVybiBjb25zdCB2b2lkICpvZl9nZXRfbWFjX2FkZHJlc3Moc3RydWN0IGRldmljZV9ub2RlICpucCk7CisjZW5kaWYKKworI2VuZGlmIC8qIF9fTElOVVhfT0ZfTkVUX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGNpX2lkcy5oIGIvaW5jbHVkZS9saW51eC9wY2lfaWRzLmgKaW5kZXggY2I4NDVjMS4uYWI0NzczMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wY2lfaWRzLmgKKysrIGIvaW5jbHVkZS9saW51eC9wY2lfaWRzLmgKQEAgLTUxOCw2ICs1MTgsNyBAQAogI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FNRF8xMUhfTkJfTUlTQwkweDEzMDMKICNkZWZpbmUgUENJX0RFVklDRV9JRF9BTURfMTFIX05CX0xJTksJMHgxMzA0CiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQU1EXzE1SF9OQl9NSVNDCTB4MTYwMworI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FNRF9DTkIxN0hfRjMJMHgxNzAzCiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQU1EX0xBTkNFCQkweDIwMDAKICNkZWZpbmUgUENJX0RFVklDRV9JRF9BTURfTEFOQ0VfSE9NRQkweDIwMDEKICNkZWZpbmUgUENJX0RFVklDRV9JRF9BTURfU0NTSQkJMHgyMDIwCkBAIC0xNjUwLDYgKzE2NTEsMTEgQEAKICNkZWZpbmUgUENJX0RFVklDRV9JRF9PMl82ODM2CQkweDY4MzYKICNkZWZpbmUgUENJX0RFVklDRV9JRF9PMl82ODEyCQkweDY4NzIKICNkZWZpbmUgUENJX0RFVklDRV9JRF9PMl82OTMzCQkweDY5MzMKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9PMl84MTIwCQkweDgxMjAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9PMl84MjIwCQkweDgyMjAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9PMl84MjIxCQkweDgyMjEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9PMl84MzIwCQkweDgzMjAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9PMl84MzIxCQkweDgzMjEKIAogI2RlZmluZSBQQ0lfVkVORE9SX0lEXzNERlgJCTB4MTIxYQogI2RlZmluZSBQQ0lfREVWSUNFX0lEXzNERlhfVk9PRE9PCTB4MDAwMQpAQCAtMjM2Myw2ICsyMzY5LDggQEAKICNkZWZpbmUgUENJX0RFVklDRV9JRF9KTUlDUk9OX0pNQjM4WF9TRAkweDIzODEKICNkZWZpbmUgUENJX0RFVklDRV9JRF9KTUlDUk9OX0pNQjM4WF9NTUMgMHgyMzgyCiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSk1JQ1JPTl9KTUIzOFhfTVMJMHgyMzgzCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSk1JQ1JPTl9KTUIzODhfU0QJMHgyMzkxCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSk1JQ1JPTl9KTUIzODhfRVNEIDB4MjM5MgogCiAjZGVmaW5lIFBDSV9WRU5ET1JfSURfS09SRU5JWAkJMHgxOTgyCiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfS09SRU5JWF9KRVRDQVJERjAJMHgxNjAwCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BpcGVfZnNfaS5oIGIvaW5jbHVkZS9saW51eC9waXBlX2ZzX2kuaAppbmRleCBiYjI3ZDdlLi43NzI1N2M5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BpcGVfZnNfaS5oCisrKyBiL2luY2x1ZGUvbGludXgvcGlwZV9mc19pLmgKQEAgLTMwLDYgKzMwLDcgQEAKICAqCXN0cnVjdCBwaXBlX2lub2RlX2luZm8gLSBhIGxpbnV4IGtlcm5lbCBwaXBlCiAgKglAd2FpdDogcmVhZGVyL3dyaXRlciB3YWl0IHBvaW50IGluIGNhc2Ugb2YgZW1wdHkvZnVsbCBwaXBlCiAgKglAbnJidWZzOiB0aGUgbnVtYmVyIG9mIG5vbi1lbXB0eSBwaXBlIGJ1ZmZlcnMgaW4gdGhpcyBwaXBlCisgKglAYnVmZmVyczogdG90YWwgbnVtYmVyIG9mIGJ1ZmZlcnMgKHNob3VsZCBiZSBhIHBvd2VyIG9mIDIpCiAgKglAY3VyYnVmOiB0aGUgY3VycmVudCBwaXBlIGJ1ZmZlciBlbnRyeQogICoJQHRtcF9wYWdlOiBjYWNoZWQgcmVsZWFzZWQgcGFnZQogICoJQHJlYWRlcnM6IG51bWJlciBvZiBjdXJyZW50IHJlYWRlcnMgb2YgdGhpcyBwaXBlCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BtLmggYi9pbmNsdWRlL2xpbnV4L3BtLmgKaW5kZXggNDBmM2Y0NS4uZGQ5YzdhYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wbS5oCisrKyBiL2luY2x1ZGUvbGludXgvcG0uaApAQCAtMzY3LDQ1ICszNjcsNiBAQAogCQkJCQl7IC5ldmVudCA9IFBNX0VWRU5UX0FVVE9fUkVTVU1FLCB9KQogCiAvKioKLSAqIERldmljZSBwb3dlciBtYW5hZ2VtZW50IHN0YXRlcwotICoKLSAqIFRoZXNlIHN0YXRlIGxhYmVscyBhcmUgdXNlZCBpbnRlcm5hbGx5IGJ5IHRoZSBQTSBjb3JlIHRvIGluZGljYXRlIHRoZSBjdXJyZW50Ci0gKiBzdGF0dXMgb2YgYSBkZXZpY2Ugd2l0aCByZXNwZWN0IHRvIHRoZSBQTSBjb3JlIG9wZXJhdGlvbnMuCi0gKgotICogRFBNX09OCQlEZXZpY2UgaXMgcmVnYXJkZWQgYXMgb3BlcmF0aW9uYWwuICBTZXQgdGhpcyB3YXkKLSAqCQkJaW5pdGlhbGx5IGFuZCB3aGVuIC0+Y29tcGxldGUoKSBpcyBhYm91dCB0byBiZSBjYWxsZWQuCi0gKgkJCUFsc28gc2V0IHdoZW4gLT5wcmVwYXJlKCkgZmFpbHMuCi0gKgotICogRFBNX1BSRVBBUklORwlEZXZpY2UgaXMgZ29pbmcgdG8gYmUgcHJlcGFyZWQgZm9yIGEgUE0gdHJhbnNpdGlvbi4gIFNldAotICoJCQl3aGVuIC0+cHJlcGFyZSgpIGlzIGFib3V0IHRvIGJlIGNhbGxlZC4KLSAqCi0gKiBEUE1fUkVTVU1JTkcJCURldmljZSBpcyBnb2luZyB0byBiZSByZXN1bWVkLiAgU2V0IHdoZW4gLT5yZXN1bWUoKSwKLSAqCQkJLT50aGF3KCksIG9yIC0+cmVzdG9yZSgpIGlzIGFib3V0IHRvIGJlIGNhbGxlZC4KLSAqCi0gKiBEUE1fU1VTUEVORElORwlEZXZpY2UgaGFzIGJlZW4gcHJlcGFyZWQgZm9yIGEgcG93ZXIgdHJhbnNpdGlvbi4gIFNldAotICoJCQl3aGVuIC0+cHJlcGFyZSgpIGhhcyBqdXN0IHN1Y2NlZWRlZC4KLSAqCi0gKiBEUE1fT0ZGCQlEZXZpY2UgaXMgcmVnYXJkZWQgYXMgaW5hY3RpdmUuICBTZXQgaW1tZWRpYXRlbHkgYWZ0ZXIKLSAqCQkJLT5zdXNwZW5kKCksIC0+ZnJlZXplKCksIG9yIC0+cG93ZXJvZmYoKSBoYXMgc3VjY2VlZGVkLgotICoJCQlBbHNvIHNldCB3aGVuIC0+cmVzdW1lKClfbm9pcnEsIC0+dGhhd19ub2lycSgpLCBvcgotICoJCQktPnJlc3RvcmVfbm9pcnEoKSBpcyBhYm91dCB0byBiZSBjYWxsZWQuCi0gKgotICogRFBNX09GRl9JUlEJCURldmljZSBpcyBpbiBhICJkZWVwIHNsZWVwIi4gIFNldCBpbW1lZGlhdGVseSBhZnRlcgotICoJCQktPnN1c3BlbmRfbm9pcnEoKSwgLT5mcmVlemVfbm9pcnEoKSwgb3IKLSAqCQkJLT5wb3dlcm9mZl9ub2lycSgpIGhhcyBqdXN0IHN1Y2NlZWRlZC4KLSAqLwotCi1lbnVtIGRwbV9zdGF0ZSB7Ci0JRFBNX0lOVkFMSUQsCi0JRFBNX09OLAotCURQTV9QUkVQQVJJTkcsCi0JRFBNX1JFU1VNSU5HLAotCURQTV9TVVNQRU5ESU5HLAotCURQTV9PRkYsCi0JRFBNX09GRl9JUlEsCi19OwotCi0vKioKICAqIERldmljZSBydW4tdGltZSBwb3dlciBtYW5hZ2VtZW50IHN0YXR1cy4KICAqCiAgKiBUaGVzZSBzdGF0dXMgbGFiZWxzIGFyZSB1c2VkIGludGVybmFsbHkgYnkgdGhlIFBNIGNvcmUgdG8gaW5kaWNhdGUgdGhlCkBAIC00NjMsOCArNDI0LDggQEAKIHN0cnVjdCBkZXZfcG1faW5mbyB7CiAJcG1fbWVzc2FnZV90CQlwb3dlcl9zdGF0ZTsKIAl1bnNpZ25lZCBpbnQJCWNhbl93YWtldXA6MTsKLQl1bnNpZ25lZAkJYXN5bmNfc3VzcGVuZDoxOwotCWVudW0gZHBtX3N0YXRlCQlzdGF0dXM7CQkvKiBPd25lZCBieSB0aGUgUE0gY29yZSAqLworCXVuc2lnbmVkIGludAkJYXN5bmNfc3VzcGVuZDoxOworCXVuc2lnbmVkIGludAkJaW5fc3VzcGVuZDoxOwkvKiBPd25lZCBieSB0aGUgUE0gY29yZSAqLwogCXNwaW5sb2NrX3QJCWxvY2s7CiAjaWZkZWYgQ09ORklHX1BNX1NMRUVQCiAJc3RydWN0IGxpc3RfaGVhZAllbnRyeTsKQEAgLTQ4Niw2ICs0NDcsNyBAQAogCXVuc2lnbmVkIGludAkJcnVuX3dha2U6MTsKIAl1bnNpZ25lZCBpbnQJCXJ1bnRpbWVfYXV0bzoxOwogCXVuc2lnbmVkIGludAkJbm9fY2FsbGJhY2tzOjE7CisJdW5zaWduZWQgaW50CQlpcnFfc2FmZToxOwogCXVuc2lnbmVkIGludAkJdXNlX2F1dG9zdXNwZW5kOjE7CiAJdW5zaWduZWQgaW50CQl0aW1lcl9hdXRvc3VzcGVuZHM6MTsKIAllbnVtIHJwbV9yZXF1ZXN0CXJlcXVlc3Q7CkBAIC02MTAsNCArNTcyLDExIEBACiAjZGVmaW5lIFBNX0FQTQkxCiAjZGVmaW5lIFBNX0FDUEkJMgogCitleHRlcm4gaW50IHBtX2dlbmVyaWNfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpOworZXh0ZXJuIGludCBwbV9nZW5lcmljX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpOworZXh0ZXJuIGludCBwbV9nZW5lcmljX2ZyZWV6ZShzdHJ1Y3QgZGV2aWNlICpkZXYpOworZXh0ZXJuIGludCBwbV9nZW5lcmljX3RoYXcoc3RydWN0IGRldmljZSAqZGV2KTsKK2V4dGVybiBpbnQgcG1fZ2VuZXJpY19yZXN0b3JlKHN0cnVjdCBkZXZpY2UgKmRldik7CitleHRlcm4gaW50IHBtX2dlbmVyaWNfcG93ZXJvZmYoc3RydWN0IGRldmljZSAqZGV2KTsKKwogI2VuZGlmIC8qIF9MSU5VWF9QTV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BtX3J1bnRpbWUuaCBiL2luY2x1ZGUvbGludXgvcG1fcnVudGltZS5oCmluZGV4IGQxOWYxY2MuLmQzNGYwNjcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcG1fcnVudGltZS5oCisrKyBiL2luY2x1ZGUvbGludXgvcG1fcnVudGltZS5oCkBAIC00MCw2ICs0MCw3IEBACiBleHRlcm4gaW50IHBtX2dlbmVyaWNfcnVudGltZV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldik7CiBleHRlcm4gaW50IHBtX2dlbmVyaWNfcnVudGltZV9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KTsKIGV4dGVybiB2b2lkIHBtX3J1bnRpbWVfbm9fY2FsbGJhY2tzKHN0cnVjdCBkZXZpY2UgKmRldik7CitleHRlcm4gdm9pZCBwbV9ydW50aW1lX2lycV9zYWZlKHN0cnVjdCBkZXZpY2UgKmRldik7CiBleHRlcm4gdm9pZCBfX3BtX3J1bnRpbWVfdXNlX2F1dG9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldiwgYm9vbCB1c2UpOwogZXh0ZXJuIHZvaWQgcG1fcnVudGltZV9zZXRfYXV0b3N1c3BlbmRfZGVsYXkoc3RydWN0IGRldmljZSAqZGV2LCBpbnQgZGVsYXkpOwogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgcG1fcnVudGltZV9hdXRvc3VzcGVuZF9leHBpcmF0aW9uKHN0cnVjdCBkZXZpY2UgKmRldik7CkBAIC04MSw2ICs4MiwxMSBAQAogCQkmJiAhZGV2LT5wb3dlci5kaXNhYmxlX2RlcHRoOwogfQogCitzdGF0aWMgaW5saW5lIGJvb2wgcG1fcnVudGltZV9lbmFibGVkKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gIWRldi0+cG93ZXIuZGlzYWJsZV9kZXB0aDsKK30KKwogc3RhdGljIGlubGluZSB2b2lkIHBtX3J1bnRpbWVfbWFya19sYXN0X2J1c3koc3RydWN0IGRldmljZSAqZGV2KQogewogCUFDQ0VTU19PTkNFKGRldi0+cG93ZXIubGFzdF9idXN5KSA9IGppZmZpZXM7CkBAIC0xMTksMTEgKzEyNSwxMyBAQAogc3RhdGljIGlubGluZSBib29sIGRldmljZV9ydW5fd2FrZShzdHJ1Y3QgZGV2aWNlICpkZXYpIHsgcmV0dXJuIGZhbHNlOyB9CiBzdGF0aWMgaW5saW5lIHZvaWQgZGV2aWNlX3NldF9ydW5fd2FrZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGJvb2wgZW5hYmxlKSB7fQogc3RhdGljIGlubGluZSBib29sIHBtX3J1bnRpbWVfc3VzcGVuZGVkKHN0cnVjdCBkZXZpY2UgKmRldikgeyByZXR1cm4gZmFsc2U7IH0KK3N0YXRpYyBpbmxpbmUgYm9vbCBwbV9ydW50aW1lX2VuYWJsZWQoc3RydWN0IGRldmljZSAqZGV2KSB7IHJldHVybiBmYWxzZTsgfQogCiBzdGF0aWMgaW5saW5lIGludCBwbV9nZW5lcmljX3J1bnRpbWVfaWRsZShzdHJ1Y3QgZGV2aWNlICpkZXYpIHsgcmV0dXJuIDA7IH0KIHN0YXRpYyBpbmxpbmUgaW50IHBtX2dlbmVyaWNfcnVudGltZV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikgeyByZXR1cm4gMDsgfQogc3RhdGljIGlubGluZSBpbnQgcG1fZ2VuZXJpY19ydW50aW1lX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpIHsgcmV0dXJuIDA7IH0KIHN0YXRpYyBpbmxpbmUgdm9pZCBwbV9ydW50aW1lX25vX2NhbGxiYWNrcyhzdHJ1Y3QgZGV2aWNlICpkZXYpIHt9CitzdGF0aWMgaW5saW5lIHZvaWQgcG1fcnVudGltZV9pcnFfc2FmZShzdHJ1Y3QgZGV2aWNlICpkZXYpIHt9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBwbV9ydW50aW1lX21hcmtfbGFzdF9idXN5KHN0cnVjdCBkZXZpY2UgKmRldikge30KIHN0YXRpYyBpbmxpbmUgdm9pZCBfX3BtX3J1bnRpbWVfdXNlX2F1dG9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldiwKQEAgLTE5Niw2ICsyMDQsMTEgQEAKIAlyZXR1cm4gX19wbV9ydW50aW1lX2lkbGUoZGV2LCBSUE1fR0VUX1BVVCk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgaW50IHBtX3J1bnRpbWVfcHV0X3N5bmNfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIF9fcG1fcnVudGltZV9zdXNwZW5kKGRldiwgUlBNX0dFVF9QVVQpOworfQorCiBzdGF0aWMgaW5saW5lIGludCBwbV9ydW50aW1lX3B1dF9zeW5jX2F1dG9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlyZXR1cm4gX19wbV9ydW50aW1lX3N1c3BlbmQoZGV2LCBSUE1fR0VUX1BVVCB8IFJQTV9BVVRPKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcXVvdGFvcHMuaCBiL2luY2x1ZGUvbGludXgvcXVvdGFvcHMuaAppbmRleCBkMWE5MTkzLi4yMjNiMTRjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3F1b3Rhb3BzLmgKKysrIGIvaW5jbHVkZS9saW51eC9xdW90YW9wcy5oCkBAIC0zMSw4ICszMSw5IEBACiAjZGVmaW5lIHF1b3RhX2Vycm9yKHNiLCBmbXQsIGFyZ3MuLi4pIFwKIAlfX3F1b3RhX2Vycm9yKChzYiksIF9fZnVuY19fLCBmbXQgLCAjIyBhcmdzKQogCi1leHRlcm4gdm9pZCBfX3F1b3RhX2Vycm9yKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGNvbnN0IGNoYXIgKmZ1bmMsCi0JCQkgY29uc3QgY2hhciAqZm10LCAuLi4pOworZXh0ZXJuIF9fYXR0cmlidXRlX18oKGZvcm1hdCAocHJpbnRmLCAzLCA0KSkpCit2b2lkIF9fcXVvdGFfZXJyb3Ioc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgY29uc3QgY2hhciAqZnVuYywKKwkJICAgY29uc3QgY2hhciAqZm10LCAuLi4pOwogCiAvKgogICogZGVjbGFyYXRpb24gb2YgcXVvdGFfZnVuY3Rpb24gY2FsbHMgaW4ga2VybmVsLgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9yYXJfcmVnaXN0ZXIuaCBiL2luY2x1ZGUvbGludXgvcmFyX3JlZ2lzdGVyLmgKaW5kZXggZmZhODA1Ny4uNWM2MTE4MSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9yYXJfcmVnaXN0ZXIuaAorKysgYi9pbmNsdWRlL2xpbnV4L3Jhcl9yZWdpc3Rlci5oCkBAIC0zNCwxMSArMzQsMjcgQEAKIAogc3RydWN0IHJhcl9kZXZpY2U7CiAKKyNpZiBkZWZpbmVkKENPTkZJR19SQVJfUkVHSVNURVIpCiBpbnQgcmVnaXN0ZXJfcmFyKGludCBudW0sCiAJCWludCAoKmNhbGxiYWNrKSh1bnNpZ25lZCBsb25nIGRhdGEpLCB1bnNpZ25lZCBsb25nIGRhdGEpOwogdm9pZCB1bnJlZ2lzdGVyX3JhcihpbnQgbnVtKTsKIGludCByYXJfZ2V0X2FkZHJlc3MoaW50IHJhcl9pbmRleCwgZG1hX2FkZHJfdCAqc3RhcnQsIGRtYV9hZGRyX3QgKmVuZCk7CiBpbnQgcmFyX2xvY2soaW50IHJhcl9pbmRleCk7CisjZWxzZQorZXh0ZXJuIHZvaWQgdW5yZWdpc3Rlcl9yYXIoaW50IG51bSkgIHsgfQorZXh0ZXJuIGludCByYXJfbG9jayhpbnQgcmFyX2luZGV4KSB7IHJldHVybiAtRUlPOyB9CisKK2V4dGVybiBpbmxpbmUgaW50IHJlZ2lzdGVyX3JhcihpbnQgbnVtLAorCQlpbnQgKCpjYWxsYmFjaykodW5zaWduZWQgbG9uZyBkYXRhKSwgdW5zaWduZWQgbG9uZyBkYXRhKQoreworCXJldHVybiAtRU5PREVWOworfQorCitleHRlcm4gaW50IHJhcl9nZXRfYWRkcmVzcyhpbnQgcmFyX2luZGV4LCBkbWFfYWRkcl90ICpzdGFydCwgZG1hX2FkZHJfdCAqZW5kKQoreworCXJldHVybiAtRU5PREVWOworfQorI2VuZGlmCS8qIFJBUl9SRUdJU1RFUiAqLwogCiAjZW5kaWYgIC8qIF9fS0VSTkVMX18gKi8KICNlbmRpZiAgLyogX1JBUl9SRUdJU1RFUl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3J0Yy5oIGIvaW5jbHVkZS9saW51eC9ydGMuaAppbmRleCAxNGRiYzgzLi4zYzk5NWI0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3J0Yy5oCisrKyBiL2luY2x1ZGUvbGludXgvcnRjLmgKQEAgLTEwNywxMiArMTA3LDE3IEBACiBleHRlcm4gaW50IHJ0Y192YWxpZF90bShzdHJ1Y3QgcnRjX3RpbWUgKnRtKTsKIGV4dGVybiBpbnQgcnRjX3RtX3RvX3RpbWUoc3RydWN0IHJ0Y190aW1lICp0bSwgdW5zaWduZWQgbG9uZyAqdGltZSk7CiBleHRlcm4gdm9pZCBydGNfdGltZV90b190bSh1bnNpZ25lZCBsb25nIHRpbWUsIHN0cnVjdCBydGNfdGltZSAqdG0pOwora3RpbWVfdCBydGNfdG1fdG9fa3RpbWUoc3RydWN0IHJ0Y190aW1lIHRtKTsKK3N0cnVjdCBydGNfdGltZSBydGNfa3RpbWVfdG9fdG0oa3RpbWVfdCBrdCk7CisKIAogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgvY2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVycXVldWUuaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KIAogZXh0ZXJuIHN0cnVjdCBjbGFzcyAqcnRjX2NsYXNzOwogCkBAIC0xNTEsNyArMTU2LDE5IEBACiB9OwogCiAjZGVmaW5lIFJUQ19ERVZJQ0VfTkFNRV9TSVpFIDIwCi1zdHJ1Y3QgcnRjX3Rhc2s7Cit0eXBlZGVmIHN0cnVjdCBydGNfdGFzayB7CisJdm9pZCAoKmZ1bmMpKHZvaWQgKnByaXZhdGVfZGF0YSk7CisJdm9pZCAqcHJpdmF0ZV9kYXRhOworfSBydGNfdGFza190OworCisKK3N0cnVjdCBydGNfdGltZXIgeworCXN0cnVjdCBydGNfdGFzawl0YXNrOworCXN0cnVjdCB0aW1lcnF1ZXVlX25vZGUgbm9kZTsKKwlrdGltZV90IHBlcmlvZDsKKwlpbnQgZW5hYmxlZDsKK307CisKIAogLyogZmxhZ3MgKi8KICNkZWZpbmUgUlRDX0RFVl9CVVNZIDAKQEAgLTE3OSwxNiArMTk2LDEzIEBACiAJc3BpbmxvY2tfdCBpcnFfdGFza19sb2NrOwogCWludCBpcnFfZnJlcTsKIAlpbnQgbWF4X3VzZXJfZnJlcTsKLSNpZmRlZiBDT05GSUdfUlRDX0lOVEZfREVWX1VJRV9FTVVMCi0Jc3RydWN0IHdvcmtfc3RydWN0IHVpZV90YXNrOwotCXN0cnVjdCB0aW1lcl9saXN0IHVpZV90aW1lcjsKLQkvKiBUaG9zZSBmaWVsZHMgYXJlIHByb3RlY3RlZCBieSBydGMtPmlycV9sb2NrICovCi0JdW5zaWduZWQgaW50IG9sZHNlY3M7Ci0JdW5zaWduZWQgaW50IHVpZV9pcnFfYWN0aXZlOjE7Ci0JdW5zaWduZWQgaW50IHN0b3BfdWllX3BvbGxpbmc6MTsKLQl1bnNpZ25lZCBpbnQgdWllX3Rhc2tfYWN0aXZlOjE7Ci0JdW5zaWduZWQgaW50IHVpZV90aW1lcl9hY3RpdmU6MTsKLSNlbmRpZgorCisJc3RydWN0IHRpbWVycXVldWVfaGVhZCB0aW1lcnF1ZXVlOworCXN0cnVjdCBydGNfdGltZXIgYWllX3RpbWVyOworCXN0cnVjdCBydGNfdGltZXIgdWllX3J0Y3RpbWVyOworCXN0cnVjdCBocnRpbWVyIHBpZV90aW1lcjsgLyogc3ViIHNlY29uZCBleHAsIHNvIG5lZWRzIGhydGltZXIgKi8KKwlpbnQgcGllX2VuYWJsZWQ7CisJc3RydWN0IHdvcmtfc3RydWN0IGlycXdvcms7CiB9OwogI2RlZmluZSB0b19ydGNfZGV2aWNlKGQpIGNvbnRhaW5lcl9vZihkLCBzdHJ1Y3QgcnRjX2RldmljZSwgZGV2KQogCkBAIC0yMjQsMTUgKzIzOCwyMiBAQAogZXh0ZXJuIGludCBydGNfZGV2X3VwZGF0ZV9pcnFfZW5hYmxlX2VtdWwoc3RydWN0IHJ0Y19kZXZpY2UgKnJ0YywKIAkJCQkJCXVuc2lnbmVkIGludCBlbmFibGVkKTsKIAotdHlwZWRlZiBzdHJ1Y3QgcnRjX3Rhc2sgewotCXZvaWQgKCpmdW5jKSh2b2lkICpwcml2YXRlX2RhdGEpOwotCXZvaWQgKnByaXZhdGVfZGF0YTsKLX0gcnRjX3Rhc2tfdDsKK3ZvaWQgcnRjX2FpZV91cGRhdGVfaXJxKHZvaWQgKnByaXZhdGUpOwordm9pZCBydGNfdWllX3VwZGF0ZV9pcnEodm9pZCAqcHJpdmF0ZSk7CitlbnVtIGhydGltZXJfcmVzdGFydCBydGNfcGllX3VwZGF0ZV9pcnEoc3RydWN0IGhydGltZXIgKnRpbWVyKTsKIAogaW50IHJ0Y19yZWdpc3RlcihydGNfdGFza190ICp0YXNrKTsKIGludCBydGNfdW5yZWdpc3RlcihydGNfdGFza190ICp0YXNrKTsKIGludCBydGNfY29udHJvbChydGNfdGFza190ICp0LCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CiAKK3ZvaWQgcnRjX3RpbWVyX2VucXVldWUoc3RydWN0IHJ0Y19kZXZpY2UgKnJ0Yywgc3RydWN0IHJ0Y190aW1lciAqdGltZXIpOwordm9pZCBydGNfdGltZXJfcmVtb3ZlKHN0cnVjdCBydGNfZGV2aWNlICpydGMsIHN0cnVjdCBydGNfdGltZXIgKnRpbWVyKTsKK3ZvaWQgcnRjX3RpbWVyX2luaXQoc3RydWN0IHJ0Y190aW1lciAqdGltZXIsIHZvaWQgKCpmKSh2b2lkKiBwKSwgdm9pZCogZGF0YSk7CitpbnQgcnRjX3RpbWVyX3N0YXJ0KHN0cnVjdCBydGNfZGV2aWNlICpydGMsIHN0cnVjdCBydGNfdGltZXIqIHRpbWVyLAorCQkJa3RpbWVfdCBleHBpcmVzLCBrdGltZV90IHBlcmlvZCk7CitpbnQgcnRjX3RpbWVyX2NhbmNlbChzdHJ1Y3QgcnRjX2RldmljZSAqcnRjLCBzdHJ1Y3QgcnRjX3RpbWVyKiB0aW1lcik7Cit2b2lkIHJ0Y190aW1lcl9kb193b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CisKIHN0YXRpYyBpbmxpbmUgYm9vbCBpc19sZWFwX3llYXIodW5zaWduZWQgaW50IHllYXIpCiB7CiAJcmV0dXJuICghKHllYXIgJSA0KSAmJiAoeWVhciAlIDEwMCkpIHx8ICEoeWVhciAlIDQwMCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NjaGVkLmggYi9pbmNsdWRlL2xpbnV4L3NjaGVkLmgKaW5kZXggMzQxYWNiYi4uYWJjNTI3YSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zY2hlZC5oCisrKyBiL2luY2x1ZGUvbGludXgvc2NoZWQuaApAQCAtNzAsNyArNzAsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgogI2luY2x1ZGUgPGxpbnV4L3NlbS5oPgogI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgotI2luY2x1ZGUgPGxpbnV4L3BhdGguaD4KICNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KICNpbmNsdWRlIDxsaW51eC9waWQuaD4KQEAgLTg4LDcgKzg3LDYgQEAKICNpbmNsdWRlIDxsaW51eC90aW1lci5oPgogI2luY2x1ZGUgPGxpbnV4L2hydGltZXIuaD4KICNpbmNsdWRlIDxsaW51eC90YXNrX2lvX2FjY291bnRpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9rb2JqZWN0Lmg+CiAjaW5jbHVkZSA8bGludXgvbGF0ZW5jeXRvcC5oPgogI2luY2x1ZGUgPGxpbnV4L2NyZWQuaD4KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zZWN1cml0eS5oIGIvaW5jbHVkZS9saW51eC9zZWN1cml0eS5oCmluZGV4IDFhYzQyNDcuLmM2NDJiYjggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc2VjdXJpdHkuaAorKysgYi9pbmNsdWRlL2xpbnV4L3NlY3VyaXR5LmgKQEAgLTEwNTgsOCArMTA1OCw3IEBACiAgKglAY3JlZCBwb2ludHMgdG8gdGhlIGNyZWRlbnRpYWxzIHRvIHByb3ZpZGUgdGhlIGNvbnRleHQgYWdhaW5zdCB3aGljaCB0bwogICoJZXZhbHVhdGUgdGhlIHNlY3VyaXR5IGRhdGEgb24gdGhlIGtleS4KICAqCUBwZXJtIGRlc2NyaWJlcyB0aGUgY29tYmluYXRpb24gb2YgcGVybWlzc2lvbnMgcmVxdWlyZWQgb2YgdGhpcyBrZXkuCi0gKglSZXR1cm4gMSBpZiBwZXJtaXNzaW9uIGdyYW50ZWQsIDAgaWYgcGVybWlzc2lvbiBkZW5pZWQgYW5kIC12ZSBpdCB0aGUKLSAqCW5vcm1hbCBwZXJtaXNzaW9ucyBtb2RlbCBzaG91bGQgYmUgZWZmZWN0ZWQuCisgKglSZXR1cm4gMCBpZiBwZXJtaXNzaW9uIGlzIGdyYW50ZWQsIC12ZSBlcnJvciBvdGhlcndpc2UuCiAgKiBAa2V5X2dldHNlY3VyaXR5OgogICoJR2V0IGEgdGV4dHVhbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgc2VjdXJpdHkgY29udGV4dCBhdHRhY2hlZCB0byBhIGtleQogICoJZm9yIHRoZSBwdXJwb3NlcyBvZiBob25vdXJpbmcgS0VZQ1RMX0dFVFNFQ1VSSVRZLiAgVGhpcyBmdW5jdGlvbgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zbGFiX2RlZi5oIGIvaW5jbHVkZS9saW51eC9zbGFiX2RlZi5oCmluZGV4IDc5MWE1MDIuLjgzMjAzYWUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc2xhYl9kZWYuaAorKysgYi9pbmNsdWRlL2xpbnV4L3NsYWJfZGVmLmgKQEAgLTEzOCwxMSArMTM4LDEyIEBACiB2b2lkICpfX2ttYWxsb2Moc2l6ZV90IHNpemUsIGdmcF90IGZsYWdzKTsKIAogI2lmZGVmIENPTkZJR19UUkFDSU5HCi1leHRlcm4gdm9pZCAqa21lbV9jYWNoZV9hbGxvY19ub3RyYWNlKHN0cnVjdCBrbWVtX2NhY2hlICpjYWNoZXAsIGdmcF90IGZsYWdzKTsKK2V4dGVybiB2b2lkICprbWVtX2NhY2hlX2FsbG9jX3RyYWNlKHNpemVfdCBzaXplLAorCQkJCSAgICBzdHJ1Y3Qga21lbV9jYWNoZSAqY2FjaGVwLCBnZnBfdCBmbGFncyk7CiBleHRlcm4gc2l6ZV90IHNsYWJfYnVmZmVyX3NpemUoc3RydWN0IGttZW1fY2FjaGUgKmNhY2hlcCk7CiAjZWxzZQogc3RhdGljIF9fYWx3YXlzX2lubGluZSB2b2lkICoKLWttZW1fY2FjaGVfYWxsb2Nfbm90cmFjZShzdHJ1Y3Qga21lbV9jYWNoZSAqY2FjaGVwLCBnZnBfdCBmbGFncykKK2ttZW1fY2FjaGVfYWxsb2NfdHJhY2Uoc2l6ZV90IHNpemUsIHN0cnVjdCBrbWVtX2NhY2hlICpjYWNoZXAsIGdmcF90IGZsYWdzKQogewogCXJldHVybiBrbWVtX2NhY2hlX2FsbG9jKGNhY2hlcCwgZmxhZ3MpOwogfQpAQCAtMTc5LDEwICsxODAsNyBAQAogI2VuZGlmCiAJCQljYWNoZXAgPSBtYWxsb2Nfc2l6ZXNbaV0uY3NfY2FjaGVwOwogCi0JCXJldCA9IGttZW1fY2FjaGVfYWxsb2Nfbm90cmFjZShjYWNoZXAsIGZsYWdzKTsKLQotCQl0cmFjZV9rbWFsbG9jKF9USElTX0lQXywgcmV0LAotCQkJICAgICAgc2l6ZSwgc2xhYl9idWZmZXJfc2l6ZShjYWNoZXApLCBmbGFncyk7CisJCXJldCA9IGttZW1fY2FjaGVfYWxsb2NfdHJhY2Uoc2l6ZSwgY2FjaGVwLCBmbGFncyk7CiAKIAkJcmV0dXJuIHJldDsKIAl9CkBAIC0xOTQsMTQgKzE5MiwxNiBAQAogZXh0ZXJuIHZvaWQgKmttZW1fY2FjaGVfYWxsb2Nfbm9kZShzdHJ1Y3Qga21lbV9jYWNoZSAqLCBnZnBfdCBmbGFncywgaW50IG5vZGUpOwogCiAjaWZkZWYgQ09ORklHX1RSQUNJTkcKLWV4dGVybiB2b2lkICprbWVtX2NhY2hlX2FsbG9jX25vZGVfbm90cmFjZShzdHJ1Y3Qga21lbV9jYWNoZSAqY2FjaGVwLAotCQkJCQkgICBnZnBfdCBmbGFncywKLQkJCQkJICAgaW50IG5vZGVpZCk7CitleHRlcm4gdm9pZCAqa21lbV9jYWNoZV9hbGxvY19ub2RlX3RyYWNlKHNpemVfdCBzaXplLAorCQkJCQkgc3RydWN0IGttZW1fY2FjaGUgKmNhY2hlcCwKKwkJCQkJIGdmcF90IGZsYWdzLAorCQkJCQkgaW50IG5vZGVpZCk7CiAjZWxzZQogc3RhdGljIF9fYWx3YXlzX2lubGluZSB2b2lkICoKLWttZW1fY2FjaGVfYWxsb2Nfbm9kZV9ub3RyYWNlKHN0cnVjdCBrbWVtX2NhY2hlICpjYWNoZXAsCi0JCQkgICAgICBnZnBfdCBmbGFncywKLQkJCSAgICAgIGludCBub2RlaWQpCitrbWVtX2NhY2hlX2FsbG9jX25vZGVfdHJhY2Uoc2l6ZV90IHNpemUsCisJCQkgICAgc3RydWN0IGttZW1fY2FjaGUgKmNhY2hlcCwKKwkJCSAgICBnZnBfdCBmbGFncywKKwkJCSAgICBpbnQgbm9kZWlkKQogewogCXJldHVybiBrbWVtX2NhY2hlX2FsbG9jX25vZGUoY2FjaGVwLCBmbGFncywgbm9kZWlkKTsKIH0KQEAgLTIxMCw3ICsyMTAsNiBAQAogc3RhdGljIF9fYWx3YXlzX2lubGluZSB2b2lkICprbWFsbG9jX25vZGUoc2l6ZV90IHNpemUsIGdmcF90IGZsYWdzLCBpbnQgbm9kZSkKIHsKIAlzdHJ1Y3Qga21lbV9jYWNoZSAqY2FjaGVwOwotCXZvaWQgKnJldDsKIAogCWlmIChfX2J1aWx0aW5fY29uc3RhbnRfcChzaXplKSkgewogCQlpbnQgaSA9IDA7CkBAIC0yMzQsMTMgKzIzMyw3IEBACiAjZW5kaWYKIAkJCWNhY2hlcCA9IG1hbGxvY19zaXplc1tpXS5jc19jYWNoZXA7CiAKLQkJcmV0ID0ga21lbV9jYWNoZV9hbGxvY19ub2RlX25vdHJhY2UoY2FjaGVwLCBmbGFncywgbm9kZSk7Ci0KLQkJdHJhY2Vfa21hbGxvY19ub2RlKF9USElTX0lQXywgcmV0LAotCQkJCSAgIHNpemUsIHNsYWJfYnVmZmVyX3NpemUoY2FjaGVwKSwKLQkJCQkgICBmbGFncywgbm9kZSk7Ci0KLQkJcmV0dXJuIHJldDsKKwkJcmV0dXJuIGttZW1fY2FjaGVfYWxsb2Nfbm9kZV90cmFjZShzaXplLCBjYWNoZXAsIGZsYWdzLCBub2RlKTsKIAl9CiAJcmV0dXJuIF9fa21hbGxvY19ub2RlKHNpemUsIGZsYWdzLCBub2RlKTsKIH0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc2x1Yl9kZWYuaCBiL2luY2x1ZGUvbGludXgvc2x1Yl9kZWYuaAppbmRleCBlNGY1ZWQxLi44YjZlOGFlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NsdWJfZGVmLmgKKysrIGIvaW5jbHVkZS9saW51eC9zbHViX2RlZi5oCkBAIC0xMCw5ICsxMCw4IEBACiAjaW5jbHVkZSA8bGludXgvZ2ZwLmg+CiAjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CiAjaW5jbHVkZSA8bGludXgva29iamVjdC5oPgotI2luY2x1ZGUgPGxpbnV4L2ttZW1sZWFrLmg+CiAKLSNpbmNsdWRlIDx0cmFjZS9ldmVudHMva21lbS5oPgorI2luY2x1ZGUgPGxpbnV4L2ttZW1sZWFrLmg+CiAKIGVudW0gc3RhdF9pdGVtIHsKIAlBTExPQ19GQVNUUEFUSCwJCS8qIEFsbG9jYXRpb24gZnJvbSBjcHUgc2xhYiAqLwpAQCAtMjE2LDMxICsyMTUsNDAgQEAKIHZvaWQgKmttZW1fY2FjaGVfYWxsb2Moc3RydWN0IGttZW1fY2FjaGUgKiwgZ2ZwX3QpOwogdm9pZCAqX19rbWFsbG9jKHNpemVfdCBzaXplLCBnZnBfdCBmbGFncyk7CiAKK3N0YXRpYyBfX2Fsd2F5c19pbmxpbmUgdm9pZCAqCitrbWFsbG9jX29yZGVyKHNpemVfdCBzaXplLCBnZnBfdCBmbGFncywgdW5zaWduZWQgaW50IG9yZGVyKQoreworCXZvaWQgKnJldCA9ICh2b2lkICopIF9fZ2V0X2ZyZWVfcGFnZXMoZmxhZ3MgfCBfX0dGUF9DT01QLCBvcmRlcik7CisJa21lbWxlYWtfYWxsb2MocmV0LCBzaXplLCAxLCBmbGFncyk7CisJcmV0dXJuIHJldDsKK30KKwogI2lmZGVmIENPTkZJR19UUkFDSU5HCi1leHRlcm4gdm9pZCAqa21lbV9jYWNoZV9hbGxvY19ub3RyYWNlKHN0cnVjdCBrbWVtX2NhY2hlICpzLCBnZnBfdCBnZnBmbGFncyk7CitleHRlcm4gdm9pZCAqCitrbWVtX2NhY2hlX2FsbG9jX3RyYWNlKHN0cnVjdCBrbWVtX2NhY2hlICpzLCBnZnBfdCBnZnBmbGFncywgc2l6ZV90IHNpemUpOworZXh0ZXJuIHZvaWQgKmttYWxsb2Nfb3JkZXJfdHJhY2Uoc2l6ZV90IHNpemUsIGdmcF90IGZsYWdzLCB1bnNpZ25lZCBpbnQgb3JkZXIpOwogI2Vsc2UKIHN0YXRpYyBfX2Fsd2F5c19pbmxpbmUgdm9pZCAqCi1rbWVtX2NhY2hlX2FsbG9jX25vdHJhY2Uoc3RydWN0IGttZW1fY2FjaGUgKnMsIGdmcF90IGdmcGZsYWdzKQora21lbV9jYWNoZV9hbGxvY190cmFjZShzdHJ1Y3Qga21lbV9jYWNoZSAqcywgZ2ZwX3QgZ2ZwZmxhZ3MsIHNpemVfdCBzaXplKQogewogCXJldHVybiBrbWVtX2NhY2hlX2FsbG9jKHMsIGdmcGZsYWdzKTsKIH0KKworc3RhdGljIF9fYWx3YXlzX2lubGluZSB2b2lkICoKK2ttYWxsb2Nfb3JkZXJfdHJhY2Uoc2l6ZV90IHNpemUsIGdmcF90IGZsYWdzLCB1bnNpZ25lZCBpbnQgb3JkZXIpCit7CisJcmV0dXJuIGttYWxsb2Nfb3JkZXIoc2l6ZSwgZmxhZ3MsIG9yZGVyKTsKK30KICNlbmRpZgogCiBzdGF0aWMgX19hbHdheXNfaW5saW5lIHZvaWQgKmttYWxsb2NfbGFyZ2Uoc2l6ZV90IHNpemUsIGdmcF90IGZsYWdzKQogewogCXVuc2lnbmVkIGludCBvcmRlciA9IGdldF9vcmRlcihzaXplKTsKLQl2b2lkICpyZXQgPSAodm9pZCAqKSBfX2dldF9mcmVlX3BhZ2VzKGZsYWdzIHwgX19HRlBfQ09NUCwgb3JkZXIpOwotCi0Ja21lbWxlYWtfYWxsb2MocmV0LCBzaXplLCAxLCBmbGFncyk7Ci0JdHJhY2Vfa21hbGxvYyhfVEhJU19JUF8sIHJldCwgc2l6ZSwgUEFHRV9TSVpFIDw8IG9yZGVyLCBmbGFncyk7Ci0KLQlyZXR1cm4gcmV0OworCXJldHVybiBrbWFsbG9jX29yZGVyX3RyYWNlKHNpemUsIGZsYWdzLCBvcmRlcik7CiB9CiAKIHN0YXRpYyBfX2Fsd2F5c19pbmxpbmUgdm9pZCAqa21hbGxvYyhzaXplX3Qgc2l6ZSwgZ2ZwX3QgZmxhZ3MpCiB7Ci0Jdm9pZCAqcmV0OwotCiAJaWYgKF9fYnVpbHRpbl9jb25zdGFudF9wKHNpemUpKSB7CiAJCWlmIChzaXplID4gU0xVQl9NQVhfU0laRSkKIAkJCXJldHVybiBrbWFsbG9jX2xhcmdlKHNpemUsIGZsYWdzKTsKQEAgLTI1MSwxMSArMjU5LDcgQEAKIAkJCWlmICghcykKIAkJCQlyZXR1cm4gWkVST19TSVpFX1BUUjsKIAotCQkJcmV0ID0ga21lbV9jYWNoZV9hbGxvY19ub3RyYWNlKHMsIGZsYWdzKTsKLQotCQkJdHJhY2Vfa21hbGxvYyhfVEhJU19JUF8sIHJldCwgc2l6ZSwgcy0+c2l6ZSwgZmxhZ3MpOwotCi0JCQlyZXR1cm4gcmV0OworCQkJcmV0dXJuIGttZW1fY2FjaGVfYWxsb2NfdHJhY2UocywgZmxhZ3MsIHNpemUpOwogCQl9CiAJfQogCXJldHVybiBfX2ttYWxsb2Moc2l6ZSwgZmxhZ3MpOwpAQCAtMjY2LDE0ICsyNzAsMTQgQEAKIHZvaWQgKmttZW1fY2FjaGVfYWxsb2Nfbm9kZShzdHJ1Y3Qga21lbV9jYWNoZSAqLCBnZnBfdCBmbGFncywgaW50IG5vZGUpOwogCiAjaWZkZWYgQ09ORklHX1RSQUNJTkcKLWV4dGVybiB2b2lkICprbWVtX2NhY2hlX2FsbG9jX25vZGVfbm90cmFjZShzdHJ1Y3Qga21lbV9jYWNoZSAqcywKK2V4dGVybiB2b2lkICprbWVtX2NhY2hlX2FsbG9jX25vZGVfdHJhY2Uoc3RydWN0IGttZW1fY2FjaGUgKnMsCiAJCQkJCSAgIGdmcF90IGdmcGZsYWdzLAotCQkJCQkgICBpbnQgbm9kZSk7CisJCQkJCSAgIGludCBub2RlLCBzaXplX3Qgc2l6ZSk7CiAjZWxzZQogc3RhdGljIF9fYWx3YXlzX2lubGluZSB2b2lkICoKLWttZW1fY2FjaGVfYWxsb2Nfbm9kZV9ub3RyYWNlKHN0cnVjdCBrbWVtX2NhY2hlICpzLAora21lbV9jYWNoZV9hbGxvY19ub2RlX3RyYWNlKHN0cnVjdCBrbWVtX2NhY2hlICpzLAogCQkJICAgICAgZ2ZwX3QgZ2ZwZmxhZ3MsCi0JCQkgICAgICBpbnQgbm9kZSkKKwkJCSAgICAgIGludCBub2RlLCBzaXplX3Qgc2l6ZSkKIHsKIAlyZXR1cm4ga21lbV9jYWNoZV9hbGxvY19ub2RlKHMsIGdmcGZsYWdzLCBub2RlKTsKIH0KQEAgLTI4MSw4ICsyODUsNiBAQAogCiBzdGF0aWMgX19hbHdheXNfaW5saW5lIHZvaWQgKmttYWxsb2Nfbm9kZShzaXplX3Qgc2l6ZSwgZ2ZwX3QgZmxhZ3MsIGludCBub2RlKQogewotCXZvaWQgKnJldDsKLQogCWlmIChfX2J1aWx0aW5fY29uc3RhbnRfcChzaXplKSAmJgogCQlzaXplIDw9IFNMVUJfTUFYX1NJWkUgJiYgIShmbGFncyAmIFNMVUJfRE1BKSkgewogCQkJc3RydWN0IGttZW1fY2FjaGUgKnMgPSBrbWFsbG9jX3NsYWIoc2l6ZSk7CkBAIC0yOTAsMTIgKzI5Miw3IEBACiAJCWlmICghcykKIAkJCXJldHVybiBaRVJPX1NJWkVfUFRSOwogCi0JCXJldCA9IGttZW1fY2FjaGVfYWxsb2Nfbm9kZV9ub3RyYWNlKHMsIGZsYWdzLCBub2RlKTsKLQotCQl0cmFjZV9rbWFsbG9jX25vZGUoX1RISVNfSVBfLCByZXQsCi0JCQkJICAgc2l6ZSwgcy0+c2l6ZSwgZmxhZ3MsIG5vZGUpOwotCi0JCXJldHVybiByZXQ7CisJCXJldHVybiBrbWVtX2NhY2hlX2FsbG9jX25vZGVfdHJhY2UocywgZmxhZ3MsIG5vZGUsIHNpemUpOwogCX0KIAlyZXR1cm4gX19rbWFsbG9jX25vZGUoc2l6ZSwgZmxhZ3MsIG5vZGUpOwogfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zb255cGkuaCBiL2luY2x1ZGUvbGludXgvc29ueXBpLmgKaW5kZXggNGY5NWMxYS4uMGU2ZGMzOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zb255cGkuaAorKysgYi9pbmNsdWRlL2xpbnV4L3NvbnlwaS5oCkBAIC0xMTIsNiArMTEyLDcgQEAKICNkZWZpbmUgU09OWVBJX0VWRU5UX1ZPTFVNRV9ERUNfUFJFU1NFRAkJNzAKICNkZWZpbmUgU09OWVBJX0VWRU5UX0JSSUdIVE5FU1NfUFJFU1NFRAkJNzEKICNkZWZpbmUgU09OWVBJX0VWRU5UX01FRElBX1BSRVNTRUQJCTcyCisjZGVmaW5lIFNPTllQSV9FVkVOVF9WRU5ET1JfUFJFU1NFRAkJNzMKIAogLyogZ2V0L3NldCBicmlnaHRuZXNzICovCiAjZGVmaW5lIFNPTllQSV9JT0NHQlJUCQlfSU9SKCd2JywgMCwgX191OCkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc3VucnBjL2F1dGguaCBiL2luY2x1ZGUvbGludXgvc3VucnBjL2F1dGguaAppbmRleCBiMjAyNDc1Li44NTIxMDY3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3N1bnJwYy9hdXRoLmgKKysrIGIvaW5jbHVkZS9saW51eC9zdW5ycGMvYXV0aC5oCkBAIC0xMTAsOSArMTEwLDkgQEAKIAlfX2JlMzIgKgkJKCpjcm1hcnNoYWwpKHN0cnVjdCBycGNfdGFzayAqLCBfX2JlMzIgKik7CiAJaW50CQkJKCpjcnJlZnJlc2gpKHN0cnVjdCBycGNfdGFzayAqKTsKIAlfX2JlMzIgKgkJKCpjcnZhbGlkYXRlKShzdHJ1Y3QgcnBjX3Rhc2sgKiwgX19iZTMyICopOwotCWludAkJCSgqY3J3cmFwX3JlcSkoc3RydWN0IHJwY190YXNrICosIGt4ZHJwcm9jX3QsCisJaW50CQkJKCpjcndyYXBfcmVxKShzdHJ1Y3QgcnBjX3Rhc2sgKiwga3hkcmVwcm9jX3QsCiAJCQkJCQl2b2lkICosIF9fYmUzMiAqLCB2b2lkICopOwotCWludAkJCSgqY3J1bndyYXBfcmVzcCkoc3RydWN0IHJwY190YXNrICosIGt4ZHJwcm9jX3QsCisJaW50CQkJKCpjcnVud3JhcF9yZXNwKShzdHJ1Y3QgcnBjX3Rhc2sgKiwga3hkcmRwcm9jX3QsCiAJCQkJCQl2b2lkICosIF9fYmUzMiAqLCB2b2lkICopOwogfTsKIApAQCAtMTM5LDggKzEzOSw4IEBACiB2b2lkCQkJcHV0X3JwY2NyZWQoc3RydWN0IHJwY19jcmVkICopOwogX19iZTMyICoJCXJwY2F1dGhfbWFyc2hjcmVkKHN0cnVjdCBycGNfdGFzayAqLCBfX2JlMzIgKik7CiBfX2JlMzIgKgkJcnBjYXV0aF9jaGVja3ZlcmYoc3RydWN0IHJwY190YXNrICosIF9fYmUzMiAqKTsKLWludAkJCXJwY2F1dGhfd3JhcF9yZXEoc3RydWN0IHJwY190YXNrICp0YXNrLCBreGRycHJvY190IGVuY29kZSwgdm9pZCAqcnFzdHAsIF9fYmUzMiAqZGF0YSwgdm9pZCAqb2JqKTsKLWludAkJCXJwY2F1dGhfdW53cmFwX3Jlc3Aoc3RydWN0IHJwY190YXNrICp0YXNrLCBreGRycHJvY190IGRlY29kZSwgdm9pZCAqcnFzdHAsIF9fYmUzMiAqZGF0YSwgdm9pZCAqb2JqKTsKK2ludAkJCXJwY2F1dGhfd3JhcF9yZXEoc3RydWN0IHJwY190YXNrICp0YXNrLCBreGRyZXByb2NfdCBlbmNvZGUsIHZvaWQgKnJxc3RwLCBfX2JlMzIgKmRhdGEsIHZvaWQgKm9iaik7CitpbnQJCQlycGNhdXRoX3Vud3JhcF9yZXNwKHN0cnVjdCBycGNfdGFzayAqdGFzaywga3hkcmRwcm9jX3QgZGVjb2RlLCB2b2lkICpycXN0cCwgX19iZTMyICpkYXRhLCB2b2lkICpvYmopOwogaW50CQkJcnBjYXV0aF9yZWZyZXNoY3JlZChzdHJ1Y3QgcnBjX3Rhc2sgKik7CiB2b2lkCQkJcnBjYXV0aF9pbnZhbGNyZWQoc3RydWN0IHJwY190YXNrICopOwogaW50CQkJcnBjYXV0aF91cHRvZGF0ZWNyZWQoc3RydWN0IHJwY190YXNrICopOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zdW5ycGMvYmNfeHBydC5oIGIvaW5jbHVkZS9saW51eC9zdW5ycGMvYmNfeHBydC5oCmluZGV4IDdjOTEyNjAuLmM1MGI0NTggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc3VucnBjL2JjX3hwcnQuaAorKysgYi9pbmNsdWRlL2xpbnV4L3N1bnJwYy9iY194cHJ0LmgKQEAgLTQzLDEwICs0MywxOCBAQAogICovCiBzdGF0aWMgaW5saW5lIGludCBzdmNfaXNfYmFja2NoYW5uZWwoY29uc3Qgc3RydWN0IHN2Y19ycXN0ICpycXN0cCkKIHsKLQlpZiAocnFzdHAtPnJxX3NlcnZlci0+YmNfeHBydCkKKwlpZiAocnFzdHAtPnJxX3NlcnZlci0+c3ZfYmNfeHBydCkKIAkJcmV0dXJuIDE7CiAJcmV0dXJuIDA7CiB9CitzdGF0aWMgaW5saW5lIHN0cnVjdCBuZnM0X3Nlc3Npb25pZCAqYmNfeHBydF9zaWQoc3RydWN0IHN2Y19ycXN0ICpycXN0cCkKK3sKKwlpZiAoc3ZjX2lzX2JhY2tjaGFubmVsKHJxc3RwKSkKKwkJcmV0dXJuIChzdHJ1Y3QgbmZzNF9zZXNzaW9uaWQgKikKKwkJCXJxc3RwLT5ycV9zZXJ2ZXItPnN2X2JjX3hwcnQtPnhwdF9iY19zaWQ7CisJcmV0dXJuIE5VTEw7Cit9CisKICNlbHNlIC8qIENPTkZJR19ORlNfVjRfMSAqLwogc3RhdGljIGlubGluZSBpbnQgeHBydF9zZXR1cF9iYWNrY2hhbm5lbChzdHJ1Y3QgcnBjX3hwcnQgKnhwcnQsCiAJCQkJCSB1bnNpZ25lZCBpbnQgbWluX3JlcXMpCkBAIC01OSw2ICs2NywxMSBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW5saW5lIHN0cnVjdCBuZnM0X3Nlc3Npb25pZCAqYmNfeHBydF9zaWQoc3RydWN0IHN2Y19ycXN0ICpycXN0cCkKK3sKKwlyZXR1cm4gTlVMTDsKK30KKwogc3RhdGljIGlubGluZSB2b2lkIHhwcnRfZnJlZV9iY19yZXF1ZXN0KHN0cnVjdCBycGNfcnFzdCAqcmVxKQogewogfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zdW5ycGMvY2FjaGUuaCBiL2luY2x1ZGUvbGludXgvc3VucnBjL2NhY2hlLmgKaW5kZXggNjk1MGM5OC4uNzhhYTEwNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zdW5ycGMvY2FjaGUuaAorKysgYi9pbmNsdWRlL2xpbnV4L3N1bnJwYy9jYWNoZS5oCkBAIC0xMyw2ICsxMyw3IEBACiAjaWZuZGVmIF9MSU5VWF9TVU5SUENfQ0FDSEVfSF8KICNkZWZpbmUgX0xJTlVYX1NVTlJQQ19DQUNIRV9IXwogCisjaW5jbHVkZSA8bGludXgva3JlZi5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxhc20vYXRvbWljLmg+CiAjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zdW5ycGMvY2xudC5oIGIvaW5jbHVkZS9saW51eC9zdW5ycGMvY2xudC5oCmluZGV4IGE1YTU1ZjIuLmVmOTQ3NmEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc3VucnBjL2NsbnQuaAorKysgYi9pbmNsdWRlL2xpbnV4L3N1bnJwYy9jbG50LmgKQEAgLTg5LDggKzg5LDggQEAKICAqLwogc3RydWN0IHJwY19wcm9jaW5mbyB7CiAJdTMyCQkJcF9wcm9jOwkJLyogUlBDIHByb2NlZHVyZSBudW1iZXIgKi8KLQlreGRycHJvY190CQlwX2VuY29kZTsJLyogWERSIGVuY29kZSBmdW5jdGlvbiAqLwotCWt4ZHJwcm9jX3QJCXBfZGVjb2RlOwkvKiBYRFIgZGVjb2RlIGZ1bmN0aW9uICovCisJa3hkcmVwcm9jX3QJCXBfZW5jb2RlOwkvKiBYRFIgZW5jb2RlIGZ1bmN0aW9uICovCisJa3hkcmRwcm9jX3QJCXBfZGVjb2RlOwkvKiBYRFIgZGVjb2RlIGZ1bmN0aW9uICovCiAJdW5zaWduZWQgaW50CQlwX2FyZ2xlbjsJLyogYXJndW1lbnQgaGRyIGxlbmd0aCAodTMyKSAqLwogCXVuc2lnbmVkIGludAkJcF9yZXBsZW47CS8qIHJlcGx5IGhkciBsZW5ndGggKHUzMikgKi8KIAl1bnNpZ25lZCBpbnQJCXBfY291bnQ7CS8qIGNhbGwgY291bnQgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc3VucnBjL3N2Yy5oIGIvaW5jbHVkZS9saW51eC9zdW5ycGMvc3ZjLmgKaW5kZXggNWEzMDg1Yi4uYzgxZDRkOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zdW5ycGMvc3ZjLmgKKysrIGIvaW5jbHVkZS9saW51eC9zdW5ycGMvc3ZjLmgKQEAgLTk5LDcgKzk5LDcgQEAKIAlzcGlubG9ja190CQlzdl9jYl9sb2NrOwkvKiBwcm90ZWN0cyB0aGUgc3ZjX2NiX2xpc3QgKi8KIAl3YWl0X3F1ZXVlX2hlYWRfdAlzdl9jYl93YWl0cTsJLyogc2xlZXAgaGVyZSBpZiB0aGVyZSBhcmUgbm8KIAkJCQkJCSAqIGVudHJpZXMgaW4gdGhlIHN2Y19jYl9saXN0ICovCi0Jc3RydWN0IHN2Y194cHJ0CQkqYmNfeHBydDsKKwlzdHJ1Y3Qgc3ZjX3hwcnQJCSpzdl9iY194cHJ0OwkvKiBjYWxsYmFjayBvbiBmb3JlIGNoYW5uZWwgKi8KICNlbmRpZiAvKiBDT05GSUdfTkZTX1Y0XzEgKi8KIH07CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc3VucnBjL3N2Y194cHJ0LmggYi9pbmNsdWRlL2xpbnV4L3N1bnJwYy9zdmNfeHBydC5oCmluZGV4IGFlYTBkNDM4Li4zNTdkYTVlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3N1bnJwYy9zdmNfeHBydC5oCisrKyBiL2luY2x1ZGUvbGludXgvc3VucnBjL3N2Y194cHJ0LmgKQEAgLTc4LDYgKzc4LDcgQEAKIAlzaXplX3QJCQl4cHRfcmVtb3RlbGVuOwkvKiBsZW5ndGggb2YgYWRkcmVzcyAqLwogCXN0cnVjdCBycGNfd2FpdF9xdWV1ZQl4cHRfYmNfcGVuZGluZzsJLyogYmFja2NoYW5uZWwgd2FpdCBxdWV1ZSAqLwogCXN0cnVjdCBsaXN0X2hlYWQJeHB0X3VzZXJzOwkvKiBjYWxsYmFja3Mgb24gZnJlZSAqLworCXZvaWQJCQkqeHB0X2JjX3NpZDsJLyogYmFjayBjaGFubmVsIHNlc3Npb24gSUQgKi8KIAogCXN0cnVjdCBuZXQJCSp4cHRfbmV0OwogfTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc3VucnBjL3hkci5oIGIvaW5jbHVkZS9saW51eC9zdW5ycGMveGRyLmgKaW5kZXggNDk4YWI5My4uZmM4NGI3YSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zdW5ycGMveGRyLmgKKysrIGIvaW5jbHVkZS9saW51eC9zdW5ycGMveGRyLmgKQEAgLTMzLDggKzMzLDggQEAKIH07CiAKIC8qCi0gKiBUaGlzIGlzIHRoZSBnZW5lcmljIFhEUiBmdW5jdGlvbi4gcnFzdHAgaXMgZWl0aGVyIGEgcnBjX3Jxc3QgKGNsaWVudAotICogc2lkZSkgb3Igc3ZjX3Jxc3QgcG9pbnRlciAoc2VydmVyIHNpZGUpLgorICogVGhpcyBpcyB0aGUgbGVnYWN5IGdlbmVyaWMgWERSIGZ1bmN0aW9uLiBycXN0cCBpcyBlaXRoZXIgYSBycGNfcnFzdAorICogKGNsaWVudCBzaWRlKSBvciBzdmNfcnFzdCBwb2ludGVyIChzZXJ2ZXIgc2lkZSkuCiAgKiBFbmNvZGUgZnVuY3Rpb25zIGFsd2F5cyBhc3N1bWUgdGhlcmUncyBlbm91Z2ggcm9vbSBpbiB0aGUgYnVmZmVyLgogICovCiB0eXBlZGVmIGludAkoKmt4ZHJwcm9jX3QpKHZvaWQgKnJxc3RwLCBfX2JlMzIgKmRhdGEsIHZvaWQgKm9iaik7CkBAIC0yMDEsMTQgKzIwMSwyMiBAQAogCiAJX19iZTMyICplbmQ7CQkvKiBlbmQgb2YgYXZhaWxhYmxlIGJ1ZmZlciBzcGFjZSAqLwogCXN0cnVjdCBrdmVjICppb3Y7CS8qIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQga3ZlYyAqLworCXN0cnVjdCBrdmVjIHNjcmF0Y2g7CS8qIFNjcmF0Y2ggYnVmZmVyICovCisJc3RydWN0IHBhZ2UgKipwYWdlX3B0cjsJLyogcG9pbnRlciB0byB0aGUgY3VycmVudCBwYWdlICovCiB9OwogCisvKgorICogVGhlc2UgYXJlIHRoZSB4ZHJfc3RyZWFtIHN0eWxlIGdlbmVyaWMgWERSIGVuY29kZSBhbmQgZGVjb2RlIGZ1bmN0aW9ucy4KKyAqLwordHlwZWRlZiB2b2lkCSgqa3hkcmVwcm9jX3QpKHZvaWQgKnJxc3RwLCBzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCB2b2lkICpvYmopOwordHlwZWRlZiBpbnQJKCpreGRyZHByb2NfdCkodm9pZCAqcnFzdHAsIHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHZvaWQgKm9iaik7CisKIGV4dGVybiB2b2lkIHhkcl9pbml0X2VuY29kZShzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBzdHJ1Y3QgeGRyX2J1ZiAqYnVmLCBfX2JlMzIgKnApOwogZXh0ZXJuIF9fYmUzMiAqeGRyX3Jlc2VydmVfc3BhY2Uoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgc2l6ZV90IG5ieXRlcyk7CiBleHRlcm4gdm9pZCB4ZHJfd3JpdGVfcGFnZXMoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgc3RydWN0IHBhZ2UgKipwYWdlcywKIAkJdW5zaWduZWQgaW50IGJhc2UsIHVuc2lnbmVkIGludCBsZW4pOwogZXh0ZXJuIHZvaWQgeGRyX2luaXRfZGVjb2RlKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHN0cnVjdCB4ZHJfYnVmICpidWYsIF9fYmUzMiAqcCk7Ci1leHRlcm4gX19iZTMyICp4ZHJfaW5saW5lX3BlZWsoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgc2l6ZV90IG5ieXRlcyk7CitleHRlcm4gdm9pZCB4ZHJfc2V0X3NjcmF0Y2hfYnVmZmVyKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHZvaWQgKmJ1Ziwgc2l6ZV90IGJ1Zmxlbik7CiBleHRlcm4gX19iZTMyICp4ZHJfaW5saW5lX2RlY29kZShzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBzaXplX3QgbmJ5dGVzKTsKIGV4dGVybiB2b2lkIHhkcl9yZWFkX3BhZ2VzKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHVuc2lnbmVkIGludCBsZW4pOwogZXh0ZXJuIHZvaWQgeGRyX2VudGVyX3BhZ2Uoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgdW5zaWduZWQgaW50IGxlbik7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3N1c3BlbmQuaCBiL2luY2x1ZGUvbGludXgvc3VzcGVuZC5oCmluZGV4IDI2Njk3NTEuLjE0NGIzNGIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc3VzcGVuZC5oCisrKyBiL2luY2x1ZGUvbGludXgvc3VzcGVuZC5oCkBAIC0yOTIsNyArMjkyLDcgQEAKIC8qIGRyaXZlcnMvYmFzZS9wb3dlci93YWtldXAuYyAqLwogZXh0ZXJuIGJvb2wgZXZlbnRzX2NoZWNrX2VuYWJsZWQ7CiAKLWV4dGVybiBib29sIHBtX2NoZWNrX3dha2V1cF9ldmVudHModm9pZCk7CitleHRlcm4gYm9vbCBwbV93YWtldXBfcGVuZGluZyh2b2lkKTsKIGV4dGVybiBib29sIHBtX2dldF93YWtldXBfY291bnQodW5zaWduZWQgaW50ICpjb3VudCk7CiBleHRlcm4gYm9vbCBwbV9zYXZlX3dha2V1cF9jb3VudCh1bnNpZ25lZCBpbnQgY291bnQpOwogI2Vsc2UgLyogIUNPTkZJR19QTV9TTEVFUCAqLwpAQCAtMzA5LDcgKzMwOSw3IEBACiAKICNkZWZpbmUgcG1fbm90aWZpZXIoZm4sIHByaSkJZG8geyAodm9pZCkoZm4pOyB9IHdoaWxlICgwKQogCi1zdGF0aWMgaW5saW5lIGJvb2wgcG1fY2hlY2tfd2FrZXVwX2V2ZW50cyh2b2lkKSB7IHJldHVybiB0cnVlOyB9CitzdGF0aWMgaW5saW5lIGJvb2wgcG1fd2FrZXVwX3BlbmRpbmcodm9pZCkgeyByZXR1cm4gZmFsc2U7IH0KICNlbmRpZiAvKiAhQ09ORklHX1BNX1NMRUVQICovCiAKIGV4dGVybiBzdHJ1Y3QgbXV0ZXggcG1fbXV0ZXg7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3RwbS5oIGIvaW5jbHVkZS9saW51eC90cG0uaAppbmRleCBhYzVkMWMxLi5mZGM3MThhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3RwbS5oCisrKyBiL2luY2x1ZGUvbGludXgvdHBtLmgKQEAgLTMxLDYgKzMxLDcgQEAKIAogZXh0ZXJuIGludCB0cG1fcGNyX3JlYWQodTMyIGNoaXBfbnVtLCBpbnQgcGNyX2lkeCwgdTggKnJlc19idWYpOwogZXh0ZXJuIGludCB0cG1fcGNyX2V4dGVuZCh1MzIgY2hpcF9udW0sIGludCBwY3JfaWR4LCBjb25zdCB1OCAqaGFzaCk7CitleHRlcm4gaW50IHRwbV9zZW5kKHUzMiBjaGlwX251bSwgdm9pZCAqY21kLCBzaXplX3QgYnVmbGVuKTsKICNlbHNlCiBzdGF0aWMgaW5saW5lIGludCB0cG1fcGNyX3JlYWQodTMyIGNoaXBfbnVtLCBpbnQgcGNyX2lkeCwgdTggKnJlc19idWYpIHsKIAlyZXR1cm4gLUVOT0RFVjsKQEAgLTM4LDUgKzM5LDggQEAKIHN0YXRpYyBpbmxpbmUgaW50IHRwbV9wY3JfZXh0ZW5kKHUzMiBjaGlwX251bSwgaW50IHBjcl9pZHgsIGNvbnN0IHU4ICpoYXNoKSB7CiAJcmV0dXJuIC1FTk9ERVY7CiB9CitzdGF0aWMgaW5saW5lIGludCB0cG1fc2VuZCh1MzIgY2hpcF9udW0sIHZvaWQgKmNtZCwgc2l6ZV90IGJ1ZmxlbikgeworCXJldHVybiAtRU5PREVWOworfQogI2VuZGlmCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdHBtX2NvbW1hbmQuaCBiL2luY2x1ZGUvbGludXgvdHBtX2NvbW1hbmQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Mjc1MTJlCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC90cG1fY29tbWFuZC5oCkBAIC0wLDAgKzEsMjggQEAKKyNpZm5kZWYgX19MSU5VWF9UUE1fQ09NTUFORF9IX18KKyNkZWZpbmUgX19MSU5VWF9UUE1fQ09NTUFORF9IX18KKworLyoKKyAqIFRQTSBDb21tYW5kIGNvbnN0YW50cyBmcm9tIHNwZWNpZmljYXRpb25zIGF0CisgKiBodHRwOi8vd3d3LnRydXN0ZWRjb21wdXRpbmdncm91cC5vcmcKKyAqLworCisvKiBDb21tYW5kIFRBR1MgKi8KKyNkZWZpbmUgVFBNX1RBR19SUVVfQ09NTUFORCAgICAgICAgICAgICAxOTMKKyNkZWZpbmUgVFBNX1RBR19SUVVfQVVUSDFfQ09NTUFORCAgICAgICAxOTQKKyNkZWZpbmUgVFBNX1RBR19SUVVfQVVUSDJfQ09NTUFORCAgICAgICAxOTUKKyNkZWZpbmUgVFBNX1RBR19SU1BfQ09NTUFORCAgICAgICAgICAgICAxOTYKKyNkZWZpbmUgVFBNX1RBR19SU1BfQVVUSDFfQ09NTUFORCAgICAgICAxOTcKKyNkZWZpbmUgVFBNX1RBR19SU1BfQVVUSDJfQ09NTUFORCAgICAgICAxOTgKKworLyogQ29tbWFuZCBPcmRpbmFscyAqLworI2RlZmluZSBUUE1fT1JEX0dFVFJBTkRPTSAgICAgICAgICAgICAgIDcwCisjZGVmaW5lIFRQTV9PUkRfT1NBUCAgICAgICAgICAgICAgICAgICAgMTEKKyNkZWZpbmUgVFBNX09SRF9PSUFQICAgICAgICAgICAgICAgICAgICAxMAorI2RlZmluZSBUUE1fT1JEX1NFQUwgICAgICAgICAgICAgICAgICAgIDIzCisjZGVmaW5lIFRQTV9PUkRfVU5TRUFMICAgICAgICAgICAgICAgICAgMjQKKworLyogT3RoZXIgY29uc3RhbnRzICovCisjZGVmaW5lIFNSS0hBTkRMRSAgICAgICAgICAgICAgICAgICAgICAgMHg0MDAwMDAwMAorI2RlZmluZSBUUE1fTk9OQ0VfU0laRSAgICAgICAgICAgICAgICAgIDIwCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC90cmFjZXBvaW50LmggYi9pbmNsdWRlL2xpbnV4L3RyYWNlcG9pbnQuaAppbmRleCBkM2U0Zjg3Li5jNjgxNDYxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3RyYWNlcG9pbnQuaAorKysgYi9pbmNsdWRlL2xpbnV4L3RyYWNlcG9pbnQuaApAQCAtMzIsNyArMzIsNyBAQAogCWludCBzdGF0ZTsJCQkvKiBTdGF0ZS4gKi8KIAl2b2lkICgqcmVnZnVuYykodm9pZCk7CiAJdm9pZCAoKnVucmVnZnVuYykodm9pZCk7Ci0Jc3RydWN0IHRyYWNlcG9pbnRfZnVuYyAqZnVuY3M7CisJc3RydWN0IHRyYWNlcG9pbnRfZnVuYyBfX3JjdSAqZnVuY3M7CiB9IF9fYXR0cmlidXRlX18oKGFsaWduZWQoMzIpKSk7CQkvKgogCQkJCQkgKiBBbGlnbmVkIG9uIDMyIGJ5dGVzIGJlY2F1c2UgaXQgaXMKIAkJCQkJICogZ2xvYmFsbHkgdmlzaWJsZSBhbmQgZ2NjIGhhcHBpbHkKQEAgLTMyNiw3ICszMjYsNyBAQAogICoJCW1lbWNweShfX2VudHJ5LT5wcmV2X2NvbW0sIHByZXYtPmNvbW0sIFRBU0tfQ09NTV9MRU4pOwogICoJCV9fZW50cnktPm5leHRfcGlkCT0gbmV4dC0+cGlkOwogICoJCV9fZW50cnktPm5leHRfcHJpbwk9IG5leHQtPnByaW87Ci0gKgkpCisgKgkpLAogICoKICAqCSoKICAqCSogRm9ybWF0dGVkIG91dHB1dCBvZiBhIHRyYWNlIHJlY29yZCB2aWEgVFBfcHJpbnRrKCkuCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3ZnYV9zd2l0Y2hlcm9vLmggYi9pbmNsdWRlL2xpbnV4L3ZnYV9zd2l0Y2hlcm9vLmgKaW5kZXggYWU5YWIxMy4uNGI5YTdmNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC92Z2Ffc3dpdGNoZXJvby5oCisrKyBiL2luY2x1ZGUvbGludXgvdmdhX3N3aXRjaGVyb28uaApAQCAtMzMsNiArMzMsNyBAQAogdm9pZCB2Z2Ffc3dpdGNoZXJvb191bnJlZ2lzdGVyX2NsaWVudChzdHJ1Y3QgcGNpX2RldiAqZGV2KTsKIGludCB2Z2Ffc3dpdGNoZXJvb19yZWdpc3Rlcl9jbGllbnQoc3RydWN0IHBjaV9kZXYgKmRldiwKIAkJCQkgICB2b2lkICgqc2V0X2dwdV9zdGF0ZSkoc3RydWN0IHBjaV9kZXYgKmRldiwgZW51bSB2Z2Ffc3dpdGNoZXJvb19zdGF0ZSksCisJCQkJICAgdm9pZCAoKnJlcHJvYmUpKHN0cnVjdCBwY2lfZGV2ICpkZXYpLAogCQkJCSAgIGJvb2wgKCpjYW5fc3dpdGNoKShzdHJ1Y3QgcGNpX2RldiAqZGV2KSk7CiAKIHZvaWQgdmdhX3N3aXRjaGVyb29fY2xpZW50X2ZiX3NldChzdHJ1Y3QgcGNpX2RldiAqZGV2LApAQCAtNDgsNiArNDksNyBAQAogc3RhdGljIGlubGluZSB2b2lkIHZnYV9zd2l0Y2hlcm9vX3VucmVnaXN0ZXJfY2xpZW50KHN0cnVjdCBwY2lfZGV2ICpkZXYpIHt9CiBzdGF0aWMgaW5saW5lIGludCB2Z2Ffc3dpdGNoZXJvb19yZWdpc3Rlcl9jbGllbnQoc3RydWN0IHBjaV9kZXYgKmRldiwKIAkJCQkJICB2b2lkICgqc2V0X2dwdV9zdGF0ZSkoc3RydWN0IHBjaV9kZXYgKmRldiwgZW51bSB2Z2Ffc3dpdGNoZXJvb19zdGF0ZSksCisJCQkJCSAgdm9pZCAoKnJlcHJvYmUpKHN0cnVjdCBwY2lfZGV2ICpkZXYpLAogCQkJCQkgIGJvb2wgKCpjYW5fc3dpdGNoKShzdHJ1Y3QgcGNpX2RldiAqZGV2KSkgeyByZXR1cm4gMDsgfQogc3RhdGljIGlubGluZSB2b2lkIHZnYV9zd2l0Y2hlcm9vX2NsaWVudF9mYl9zZXQoc3RydWN0IHBjaV9kZXYgKmRldiwgc3RydWN0IGZiX2luZm8gKmluZm8pIHt9CiBzdGF0aWMgaW5saW5lIGludCB2Z2Ffc3dpdGNoZXJvb19yZWdpc3Rlcl9oYW5kbGVyKHN0cnVjdCB2Z2Ffc3dpdGNoZXJvb19oYW5kbGVyICpoYW5kbGVyKSB7IHJldHVybiAwOyB9CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3hhdHRyLmggYi9pbmNsdWRlL2xpbnV4L3hhdHRyLmgKaW5kZXggZjFlNWJkZS4uZTYxMzFlZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC94YXR0ci5oCisrKyBiL2luY2x1ZGUvbGludXgveGF0dHIuaApAQCAtNDAsOSArNDAsMTMgQEAKICNkZWZpbmUgWEFUVFJfU01BQ0tfU1VGRklYICJTTUFDSzY0IgogI2RlZmluZSBYQVRUUl9TTUFDS19JUElOICJTTUFDSzY0SVBJTiIKICNkZWZpbmUgWEFUVFJfU01BQ0tfSVBPVVQgIlNNQUNLNjRJUE9VVCIKKyNkZWZpbmUgWEFUVFJfU01BQ0tfRVhFQyAiU01BQ0s2NEVYRUMiCisjZGVmaW5lIFhBVFRSX1NNQUNLX1RSQU5TTVVURSAiU01BQ0s2NFRSQU5TTVVURSIKICNkZWZpbmUgWEFUVFJfTkFNRV9TTUFDSyBYQVRUUl9TRUNVUklUWV9QUkVGSVggWEFUVFJfU01BQ0tfU1VGRklYCiAjZGVmaW5lIFhBVFRSX05BTUVfU01BQ0tJUElOCVhBVFRSX1NFQ1VSSVRZX1BSRUZJWCBYQVRUUl9TTUFDS19JUElOCiAjZGVmaW5lIFhBVFRSX05BTUVfU01BQ0tJUE9VVAlYQVRUUl9TRUNVUklUWV9QUkVGSVggWEFUVFJfU01BQ0tfSVBPVVQKKyNkZWZpbmUgWEFUVFJfTkFNRV9TTUFDS0VYRUMJWEFUVFJfU0VDVVJJVFlfUFJFRklYIFhBVFRSX1NNQUNLX0VYRUMKKyNkZWZpbmUgWEFUVFJfTkFNRV9TTUFDS1RSQU5TTVVURSBYQVRUUl9TRUNVUklUWV9QUkVGSVggWEFUVFJfU01BQ0tfVFJBTlNNVVRFCiAKICNkZWZpbmUgWEFUVFJfQ0FQU19TVUZGSVggImNhcGFiaWxpdHkiCiAjZGVmaW5lIFhBVFRSX05BTUVfQ0FQUyBYQVRUUl9TRUNVUklUWV9QUkVGSVggWEFUVFJfQ0FQU19TVUZGSVgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdHJhY2UvZGVmaW5lX3RyYWNlLmggYi9pbmNsdWRlL3RyYWNlL2RlZmluZV90cmFjZS5oCmluZGV4IGIwYjRlYjIuLmRhMzliMjIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdHJhY2UvZGVmaW5lX3RyYWNlLmgKKysrIGIvaW5jbHVkZS90cmFjZS9kZWZpbmVfdHJhY2UuaApAQCAtMjEsNiArMjEsMTYgQEAKICN1bmRlZiBDUkVBVEVfVFJBQ0VfUE9JTlRTCiAKICNpbmNsdWRlIDxsaW51eC9zdHJpbmdpZnkuaD4KKy8qCisgKiBtb2R1bGUuaCBpbmNsdWRlcyB0cmFjZXBvaW50cywgYW5kIGJlY2F1c2UgZnRyYWNlLmgKKyAqIHB1bGxzIGluIG1vZHVsZS5oOgorICogIHRyYWNlL2Z0cmFjZS5oIC0+IGxpbnV4L2Z0cmFjZV9ldmVudC5oIC0+IGxpbnV4L3BlcmZfZXZlbnQuaCAtPgorICogIGxpbnV4L2Z0cmFjZS5oIC0+IGxpbnV4L21vZHVsZS5oCisgKiB3ZSBtdXN0IGluY2x1ZGUgbW9kdWxlLmggaGVyZSBiZWZvcmUgd2UgcGxheSB3aXRoIGFueSBvZgorICogdGhlIFRSQUNFX0VWRU5UKCkgbWFjcm9zLCBvdGhlcndpc2UgdGhlIHRyYWNlcG9pbnRzIGluY2x1ZGVkCisgKiBieSBtb2R1bGUuaCBtYXkgYnJlYWsgdGhlIGJ1aWxkLgorICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICN1bmRlZiBUUkFDRV9FVkVOVAogI2RlZmluZSBUUkFDRV9FVkVOVChuYW1lLCBwcm90bywgYXJncywgdHN0cnVjdCwgYXNzaWduLCBwcmludCkJXApkaWZmIC0tZ2l0IGEvaW5jbHVkZS90cmFjZS9ldmVudHMvc2tiLmggYi9pbmNsdWRlL3RyYWNlL2V2ZW50cy9za2IuaAppbmRleCA3NWNlOWQ1Li5mMTAyOTNjIDEwMDY0NAotLS0gYS9pbmNsdWRlL3RyYWNlL2V2ZW50cy9za2IuaAorKysgYi9pbmNsdWRlL3RyYWNlL2V2ZW50cy9za2IuaApAQCAtMjUsOSArMjUsNyBAQAogCiAJVFBfZmFzdF9hc3NpZ24oCiAJCV9fZW50cnktPnNrYmFkZHIgPSBza2I7Ci0JCWlmIChza2IpIHsKLQkJCV9fZW50cnktPnByb3RvY29sID0gbnRvaHMoc2tiLT5wcm90b2NvbCk7Ci0JCX0KKwkJX19lbnRyeS0+cHJvdG9jb2wgPSBudG9ocyhza2ItPnByb3RvY29sKTsKIAkJX19lbnRyeS0+bG9jYXRpb24gPSBsb2NhdGlvbjsKIAkpLAogCmRpZmYgLS1naXQgYS9rZXJuZWwvTWFrZWZpbGUgYi9rZXJuZWwvTWFrZWZpbGUKaW5kZXggMGI1ZmYwOC4uNTY2OWY3MSAxMDA2NDQKLS0tIGEva2VybmVsL01ha2VmaWxlCisrKyBiL2tlcm5lbC9NYWtlZmlsZQpAQCAtMTAwLDYgKzEwMCw3IEBACiBvYmotJChDT05GSUdfVFJBQ0lORykgKz0gdHJhY2UvCiBvYmotJChDT05GSUdfWDg2X0RTKSArPSB0cmFjZS8KIG9iai0kKENPTkZJR19SSU5HX0JVRkZFUikgKz0gdHJhY2UvCitvYmotJChDT05GSUdfVFJBQ0VQT0lOVFMpICs9IHRyYWNlLwogb2JqLSQoQ09ORklHX1NNUCkgKz0gc2NoZWRfY3B1cHJpLm8KIG9iai0kKENPTkZJR19JUlFfV09SSykgKz0gaXJxX3dvcmsubwogb2JqLSQoQ09ORklHX1BFUkZfRVZFTlRTKSArPSBwZXJmX2V2ZW50Lm8KQEAgLTEyMSw3ICsxMjIsNyBAQAogIyBjb25maWdfZGF0YS5oIGNvbnRhaW5zIHRoZSBzYW1lIGluZm9ybWF0aW9uIGFzIGlrY29uZmlnLmggYnV0IGd6aXBwZWQuCiAjIEluZm8gZnJvbSBjb25maWdfZGF0YSBjYW4gYmUgZXh0cmFjdGVkIGZyb20gL3Byb2MvY29uZmlnKgogdGFyZ2V0cyArPSBjb25maWdfZGF0YS5negotJChvYmopL2NvbmZpZ19kYXRhLmd6OiAuY29uZmlnIEZPUkNFCiskKG9iaikvY29uZmlnX2RhdGEuZ3o6ICQoS0NPTkZJR19DT05GSUcpIEZPUkNFCiAJJChjYWxsIGlmX2NoYW5nZWQsZ3ppcCkKIAogcXVpZXRfY21kX2lrY29uZmlnZ3ogPSBJS0NGRyAgICRACmRpZmYgLS1naXQgYS9rZXJuZWwvZXhpdC5jIGIva2VybmVsL2V4aXQuYwppbmRleCA4OWM3NDg2Li5mOWE0NWViIDEwMDY0NAotLS0gYS9rZXJuZWwvZXhpdC5jCisrKyBiL2tlcm5lbC9leGl0LmMKQEAgLTk5NCw2ICs5OTQsMTUgQEAKIAlleGl0X2ZzKHRzayk7CiAJY2hlY2tfc3RhY2tfdXNhZ2UoKTsKIAlleGl0X3RocmVhZCgpOworCisJLyoKKwkgKiBGbHVzaCBpbmhlcml0ZWQgY291bnRlcnMgdG8gdGhlIHBhcmVudCAtIGJlZm9yZSB0aGUgcGFyZW50CisJICogZ2V0cyB3b2tlbiB1cCBieSBjaGlsZC1leGl0IG5vdGlmaWNhdGlvbnMuCisJICoKKwkgKiBiZWNhdXNlIG9mIGNncm91cCBtb2RlLCBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgY2dyb3VwX2V4aXQoKQorCSAqLworCXBlcmZfZXZlbnRfZXhpdF90YXNrKHRzayk7CisKIAljZ3JvdXBfZXhpdCh0c2ssIDEpOwogCiAJaWYgKGdyb3VwX2RlYWQpCkBAIC0xMDA3LDExICsxMDE2LDYgQEAKIAkgKiBGSVhNRTogZG8gdGhhdCBvbmx5IHdoZW4gbmVlZGVkLCB1c2luZyBzY2hlZF9leGl0IHRyYWNlcG9pbnQKIAkgKi8KIAlmbHVzaF9wdHJhY2VfaHdfYnJlYWtwb2ludCh0c2spOwotCS8qCi0JICogRmx1c2ggaW5oZXJpdGVkIGNvdW50ZXJzIHRvIHRoZSBwYXJlbnQgLSBiZWZvcmUgdGhlIHBhcmVudAotCSAqIGdldHMgd29rZW4gdXAgYnkgY2hpbGQtZXhpdCBub3RpZmljYXRpb25zLgotCSAqLwotCXBlcmZfZXZlbnRfZXhpdF90YXNrKHRzayk7CiAKIAlleGl0X25vdGlmeSh0c2ssIGdyb3VwX2RlYWQpOwogI2lmZGVmIENPTkZJR19OVU1BCmRpZmYgLS1naXQgYS9rZXJuZWwvZnJlZXplci5jIGIva2VybmVsL2ZyZWV6ZXIuYwppbmRleCBiZDFkNDJiLi42NmVjZDJlIDEwMDY0NAotLS0gYS9rZXJuZWwvZnJlZXplci5jCisrKyBiL2tlcm5lbC9mcmVlemVyLmMKQEAgLTEwNCw4ICsxMDQsMTMgQEAKIAl9CiAKIAlpZiAoc2hvdWxkX3NlbmRfc2lnbmFsKHApKSB7Ci0JCWlmICghc2lnbmFsX3BlbmRpbmcocCkpCi0JCQlmYWtlX3NpZ25hbF93YWtlX3VwKHApOworCQlmYWtlX3NpZ25hbF93YWtlX3VwKHApOworCQkvKgorCQkgKiBmYWtlX3NpZ25hbF93YWtlX3VwKCkgZ29lcyB0aHJvdWdoIHAncyBzY2hlZHVsZXIKKwkJICogbG9jayBhbmQgZ3VhcmFudGVlcyB0aGF0IFRBU0tfU1RPUFBFRC9UUkFDRUQgLT4KKwkJICogVEFTS19SVU5OSU5HIHRyYW5zaXRpb24gY2FuJ3QgcmFjZSB3aXRoIHRhc2sgc3RhdGUKKwkJICogdGVzdGluZyBpbiB0cnlfdG9fZnJlZXplX3Rhc2tzKCkuCisJCSAqLwogCX0gZWxzZSBpZiAoc2lnX29ubHkpIHsKIAkJcmV0dXJuIGZhbHNlOwogCX0gZWxzZSB7CmRpZmYgLS1naXQgYS9rZXJuZWwvcGVyZl9ldmVudC5jIGIva2VybmVsL3BlcmZfZXZlbnQuYwppbmRleCAxMTg0N2JmLi5iNzgyYjdhIDEwMDY0NAotLS0gYS9rZXJuZWwvcGVyZl9ldmVudC5jCisrKyBiL2tlcm5lbC9wZXJmX2V2ZW50LmMKQEAgLTM4LDYgKzM4LDEyIEBACiAKICNpbmNsdWRlIDxhc20vaXJxX3JlZ3MuaD4KIAorZW51bSBldmVudF90eXBlX3QgeworCUVWRU5UX0ZMRVhJQkxFID0gMHgxLAorCUVWRU5UX1BJTk5FRCA9IDB4MiwKKwlFVkVOVF9BTEwgPSBFVkVOVF9GTEVYSUJMRSB8IEVWRU5UX1BJTk5FRCwKK307CisKIGF0b21pY190IHBlcmZfdGFza19ldmVudHMgX19yZWFkX21vc3RseTsKIHN0YXRpYyBhdG9taWNfdCBucl9tbWFwX2V2ZW50cyBfX3JlYWRfbW9zdGx5Owogc3RhdGljIGF0b21pY190IG5yX2NvbW1fZXZlbnRzIF9fcmVhZF9tb3N0bHk7CkBAIC02NSw2ICs3MSwxMiBAQAogCiBzdGF0aWMgYXRvbWljNjRfdCBwZXJmX2V2ZW50X2lkOwogCitzdGF0aWMgdm9pZCBjcHVfY3R4X3NjaGVkX291dChzdHJ1Y3QgcGVyZl9jcHVfY29udGV4dCAqY3B1Y3R4LAorCQkJICAgICAgZW51bSBldmVudF90eXBlX3QgZXZlbnRfdHlwZSk7CisKK3N0YXRpYyB2b2lkIGNwdV9jdHhfc2NoZWRfaW4oc3RydWN0IHBlcmZfY3B1X2NvbnRleHQgKmNwdWN0eCwKKwkJCSAgICAgZW51bSBldmVudF90eXBlX3QgZXZlbnRfdHlwZSk7CisKIHZvaWQgX193ZWFrIHBlcmZfZXZlbnRfcHJpbnRfZGVidWcodm9pZCkJeyB9CiAKIGV4dGVybiBfX3dlYWsgY29uc3QgY2hhciAqcGVyZl9wbXVfbmFtZSh2b2lkKQpAQCAtNzIsNiArODQsMTEgQEAKIAlyZXR1cm4gInBtdSI7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdTY0IHBlcmZfY2xvY2sodm9pZCkKK3sKKwlyZXR1cm4gbG9jYWxfY2xvY2soKTsKK30KKwogdm9pZCBwZXJmX3BtdV9kaXNhYmxlKHN0cnVjdCBwbXUgKnBtdSkKIHsKIAlpbnQgKmNvdW50ID0gdGhpc19jcHVfcHRyKHBtdS0+cG11X2Rpc2FibGVfY291bnQpOwpAQCAtMjQwLDExICsyNTcsNiBAQAogCXB1dF9jdHgoY3R4KTsKIH0KIAotc3RhdGljIGlubGluZSB1NjQgcGVyZl9jbG9jayh2b2lkKQotewotCXJldHVybiBsb2NhbF9jbG9jaygpOwotfQotCiAvKgogICogVXBkYXRlIHRoZSByZWNvcmQgb2YgdGhlIGN1cnJlbnQgdGltZSBpbiBhIGNvbnRleHQuCiAgKi8KQEAgLTI1Niw2ICsyNjgsMTIgQEAKIAljdHgtPnRpbWVzdGFtcCA9IG5vdzsKIH0KIAorc3RhdGljIHU2NCBwZXJmX2V2ZW50X3RpbWUoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50KQoreworCXN0cnVjdCBwZXJmX2V2ZW50X2NvbnRleHQgKmN0eCA9IGV2ZW50LT5jdHg7CisJcmV0dXJuIGN0eCA/IGN0eC0+dGltZSA6IDA7Cit9CisKIC8qCiAgKiBVcGRhdGUgdGhlIHRvdGFsX3RpbWVfZW5hYmxlZCBhbmQgdG90YWxfdGltZV9ydW5uaW5nIGZpZWxkcyBmb3IgYSBldmVudC4KICAqLwpAQCAtMjY5LDcgKzI4Nyw3IEBACiAJCXJldHVybjsKIAogCWlmIChjdHgtPmlzX2FjdGl2ZSkKLQkJcnVuX2VuZCA9IGN0eC0+dGltZTsKKwkJcnVuX2VuZCA9IHBlcmZfZXZlbnRfdGltZShldmVudCk7CiAJZWxzZQogCQlydW5fZW5kID0gZXZlbnQtPnRzdGFtcF9zdG9wcGVkOwogCkBAIC0yNzgsNyArMjk2LDcgQEAKIAlpZiAoZXZlbnQtPnN0YXRlID09IFBFUkZfRVZFTlRfU1RBVEVfSU5BQ1RJVkUpCiAJCXJ1bl9lbmQgPSBldmVudC0+dHN0YW1wX3N0b3BwZWQ7CiAJZWxzZQotCQlydW5fZW5kID0gY3R4LT50aW1lOworCQlydW5fZW5kID0gcGVyZl9ldmVudF90aW1lKGV2ZW50KTsKIAogCWV2ZW50LT50b3RhbF90aW1lX3J1bm5pbmcgPSBydW5fZW5kIC0gZXZlbnQtPnRzdGFtcF9ydW5uaW5nOwogfQpAQCAtNTM0LDYgKzU1Miw3IEBACiAJCSAgc3RydWN0IHBlcmZfY3B1X2NvbnRleHQgKmNwdWN0eCwKIAkJICBzdHJ1Y3QgcGVyZl9ldmVudF9jb250ZXh0ICpjdHgpCiB7CisJdTY0IHRzdGFtcCA9IHBlcmZfZXZlbnRfdGltZShldmVudCk7CiAJdTY0IGRlbHRhOwogCS8qCiAJICogQW4gZXZlbnQgd2hpY2ggY291bGQgbm90IGJlIGFjdGl2YXRlZCBiZWNhdXNlIG9mCkBAIC01NDUsNyArNTY0LDcgQEAKIAkgICAgJiYgIWV2ZW50X2ZpbHRlcl9tYXRjaChldmVudCkpIHsKIAkJZGVsdGEgPSBjdHgtPnRpbWUgLSBldmVudC0+dHN0YW1wX3N0b3BwZWQ7CiAJCWV2ZW50LT50c3RhbXBfcnVubmluZyArPSBkZWx0YTsKLQkJZXZlbnQtPnRzdGFtcF9zdG9wcGVkID0gY3R4LT50aW1lOworCQlldmVudC0+dHN0YW1wX3N0b3BwZWQgPSB0c3RhbXA7CiAJfQogCiAJaWYgKGV2ZW50LT5zdGF0ZSAhPSBQRVJGX0VWRU5UX1NUQVRFX0FDVElWRSkKQEAgLTU1Niw3ICs1NzUsNyBAQAogCQlldmVudC0+cGVuZGluZ19kaXNhYmxlID0gMDsKIAkJZXZlbnQtPnN0YXRlID0gUEVSRl9FVkVOVF9TVEFURV9PRkY7CiAJfQotCWV2ZW50LT50c3RhbXBfc3RvcHBlZCA9IGN0eC0+dGltZTsKKwlldmVudC0+dHN0YW1wX3N0b3BwZWQgPSB0c3RhbXA7CiAJZXZlbnQtPnBtdS0+ZGVsKGV2ZW50LCAwKTsKIAlldmVudC0+b25jcHUgPSAtMTsKIApAQCAtNzY4LDYgKzc4Nyw4IEBACiAJCSBzdHJ1Y3QgcGVyZl9jcHVfY29udGV4dCAqY3B1Y3R4LAogCQkgc3RydWN0IHBlcmZfZXZlbnRfY29udGV4dCAqY3R4KQogeworCXU2NCB0c3RhbXAgPSBwZXJmX2V2ZW50X3RpbWUoZXZlbnQpOworCiAJaWYgKGV2ZW50LT5zdGF0ZSA8PSBQRVJGX0VWRU5UX1NUQVRFX09GRikKIAkJcmV0dXJuIDA7CiAKQEAgLTc4NCw5ICs4MDUsOSBAQAogCQlyZXR1cm4gLUVBR0FJTjsKIAl9CiAKLQlldmVudC0+dHN0YW1wX3J1bm5pbmcgKz0gY3R4LT50aW1lIC0gZXZlbnQtPnRzdGFtcF9zdG9wcGVkOworCWV2ZW50LT50c3RhbXBfcnVubmluZyArPSB0c3RhbXAgLSBldmVudC0+dHN0YW1wX3N0b3BwZWQ7CiAKLQlldmVudC0+c2hhZG93X2N0eF90aW1lID0gY3R4LT50aW1lIC0gY3R4LT50aW1lc3RhbXA7CisJZXZlbnQtPnNoYWRvd19jdHhfdGltZSA9IHRzdGFtcCAtIGN0eC0+dGltZXN0YW1wOwogCiAJaWYgKCFpc19zb2Z0d2FyZV9ldmVudChldmVudCkpCiAJCWNwdWN0eC0+YWN0aXZlX29uY3B1Kys7CkBAIC04OTgsMTEgKzkxOSwxMyBAQAogc3RhdGljIHZvaWQgYWRkX2V2ZW50X3RvX2N0eChzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQsCiAJCQkgICAgICAgc3RydWN0IHBlcmZfZXZlbnRfY29udGV4dCAqY3R4KQogeworCXU2NCB0c3RhbXAgPSBwZXJmX2V2ZW50X3RpbWUoZXZlbnQpOworCiAJbGlzdF9hZGRfZXZlbnQoZXZlbnQsIGN0eCk7CiAJcGVyZl9ncm91cF9hdHRhY2goZXZlbnQpOwotCWV2ZW50LT50c3RhbXBfZW5hYmxlZCA9IGN0eC0+dGltZTsKLQlldmVudC0+dHN0YW1wX3J1bm5pbmcgPSBjdHgtPnRpbWU7Ci0JZXZlbnQtPnRzdGFtcF9zdG9wcGVkID0gY3R4LT50aW1lOworCWV2ZW50LT50c3RhbXBfZW5hYmxlZCA9IHRzdGFtcDsKKwlldmVudC0+dHN0YW1wX3J1bm5pbmcgPSB0c3RhbXA7CisJZXZlbnQtPnRzdGFtcF9zdG9wcGVkID0gdHN0YW1wOwogfQogCiAvKgpAQCAtOTM3LDcgKzk2MCw3IEBACiAKIAlhZGRfZXZlbnRfdG9fY3R4KGV2ZW50LCBjdHgpOwogCi0JaWYgKGV2ZW50LT5jcHUgIT0gLTEgJiYgZXZlbnQtPmNwdSAhPSBzbXBfcHJvY2Vzc29yX2lkKCkpCisJaWYgKCFldmVudF9maWx0ZXJfbWF0Y2goZXZlbnQpKQogCQlnb3RvIHVubG9jazsKIAogCS8qCkBAIC0xMDQyLDE0ICsxMDY1LDEzIEBACiAJCQkJCXN0cnVjdCBwZXJmX2V2ZW50X2NvbnRleHQgKmN0eCkKIHsKIAlzdHJ1Y3QgcGVyZl9ldmVudCAqc3ViOworCXU2NCB0c3RhbXAgPSBwZXJmX2V2ZW50X3RpbWUoZXZlbnQpOwogCiAJZXZlbnQtPnN0YXRlID0gUEVSRl9FVkVOVF9TVEFURV9JTkFDVElWRTsKLQlldmVudC0+dHN0YW1wX2VuYWJsZWQgPSBjdHgtPnRpbWUgLSBldmVudC0+dG90YWxfdGltZV9lbmFibGVkOworCWV2ZW50LT50c3RhbXBfZW5hYmxlZCA9IHRzdGFtcCAtIGV2ZW50LT50b3RhbF90aW1lX2VuYWJsZWQ7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeShzdWIsICZldmVudC0+c2libGluZ19saXN0LCBncm91cF9lbnRyeSkgewotCQlpZiAoc3ViLT5zdGF0ZSA+PSBQRVJGX0VWRU5UX1NUQVRFX0lOQUNUSVZFKSB7Ci0JCQlzdWItPnRzdGFtcF9lbmFibGVkID0KLQkJCQljdHgtPnRpbWUgLSBzdWItPnRvdGFsX3RpbWVfZW5hYmxlZDsKLQkJfQorCQlpZiAoc3ViLT5zdGF0ZSA+PSBQRVJGX0VWRU5UX1NUQVRFX0lOQUNUSVZFKQorCQkJc3ViLT50c3RhbXBfZW5hYmxlZCA9IHRzdGFtcCAtIHN1Yi0+dG90YWxfdGltZV9lbmFibGVkOwogCX0KIH0KIApAQCAtMTA4Miw3ICsxMTA0LDcgQEAKIAkJZ290byB1bmxvY2s7CiAJX19wZXJmX2V2ZW50X21hcmtfZW5hYmxlZChldmVudCwgY3R4KTsKIAotCWlmIChldmVudC0+Y3B1ICE9IC0xICYmIGV2ZW50LT5jcHUgIT0gc21wX3Byb2Nlc3Nvcl9pZCgpKQorCWlmICghZXZlbnRfZmlsdGVyX21hdGNoKGV2ZW50KSkKIAkJZ290byB1bmxvY2s7CiAKIAkvKgpAQCAtMTE5MywxMiArMTIxNSw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLWVudW0gZXZlbnRfdHlwZV90IHsKLQlFVkVOVF9GTEVYSUJMRSA9IDB4MSwKLQlFVkVOVF9QSU5ORUQgPSAweDIsCi0JRVZFTlRfQUxMID0gRVZFTlRfRkxFWElCTEUgfCBFVkVOVF9QSU5ORUQsCi19OwotCiBzdGF0aWMgdm9pZCBjdHhfc2NoZWRfb3V0KHN0cnVjdCBwZXJmX2V2ZW50X2NvbnRleHQgKmN0eCwKIAkJCSAgc3RydWN0IHBlcmZfY3B1X2NvbnRleHQgKmNwdWN0eCwKIAkJCSAgZW51bSBldmVudF90eXBlX3QgZXZlbnRfdHlwZSkKQEAgLTE0MzUsNyArMTQ1MSw3IEBACiAJbGlzdF9mb3JfZWFjaF9lbnRyeShldmVudCwgJmN0eC0+cGlubmVkX2dyb3VwcywgZ3JvdXBfZW50cnkpIHsKIAkJaWYgKGV2ZW50LT5zdGF0ZSA8PSBQRVJGX0VWRU5UX1NUQVRFX09GRikKIAkJCWNvbnRpbnVlOwotCQlpZiAoZXZlbnQtPmNwdSAhPSAtMSAmJiBldmVudC0+Y3B1ICE9IHNtcF9wcm9jZXNzb3JfaWQoKSkKKwkJaWYgKCFldmVudF9maWx0ZXJfbWF0Y2goZXZlbnQpKQogCQkJY29udGludWU7CiAKIAkJaWYgKGdyb3VwX2Nhbl9nb19vbihldmVudCwgY3B1Y3R4LCAxKSkKQEAgLTE0NjcsNyArMTQ4Myw3IEBACiAJCSAqIExpc3RlbiB0byB0aGUgJ2NwdScgc2NoZWR1bGluZyBmaWx0ZXIgY29uc3RyYWludAogCQkgKiBvZiBldmVudHM6CiAJCSAqLwotCQlpZiAoZXZlbnQtPmNwdSAhPSAtMSAmJiBldmVudC0+Y3B1ICE9IHNtcF9wcm9jZXNzb3JfaWQoKSkKKwkJaWYgKCFldmVudF9maWx0ZXJfbWF0Y2goZXZlbnQpKQogCQkJY29udGludWU7CiAKIAkJaWYgKGdyb3VwX2Nhbl9nb19vbihldmVudCwgY3B1Y3R4LCBjYW5fYWRkX2h3KSkgewpAQCAtMTY5NCw3ICsxNzEwLDcgQEAKIAkJaWYgKGV2ZW50LT5zdGF0ZSAhPSBQRVJGX0VWRU5UX1NUQVRFX0FDVElWRSkKIAkJCWNvbnRpbnVlOwogCi0JCWlmIChldmVudC0+Y3B1ICE9IC0xICYmIGV2ZW50LT5jcHUgIT0gc21wX3Byb2Nlc3Nvcl9pZCgpKQorCQlpZiAoIWV2ZW50X2ZpbHRlcl9tYXRjaChldmVudCkpCiAJCQljb250aW51ZTsKIAogCQlod2MgPSAmZXZlbnQtPmh3OwpAQCAtMzg5Myw3ICszOTA5LDcgQEAKIAlpZiAoZXZlbnQtPnN0YXRlIDwgUEVSRl9FVkVOVF9TVEFURV9JTkFDVElWRSkKIAkJcmV0dXJuIDA7CiAKLQlpZiAoZXZlbnQtPmNwdSAhPSAtMSAmJiBldmVudC0+Y3B1ICE9IHNtcF9wcm9jZXNzb3JfaWQoKSkKKwlpZiAoIWV2ZW50X2ZpbHRlcl9tYXRjaChldmVudCkpCiAJCXJldHVybiAwOwogCiAJaWYgKGV2ZW50LT5hdHRyLmNvbW0gfHwgZXZlbnQtPmF0dHIubW1hcCB8fApAQCAtNDAzMCw3ICs0MDQ2LDcgQEAKIAlpZiAoZXZlbnQtPnN0YXRlIDwgUEVSRl9FVkVOVF9TVEFURV9JTkFDVElWRSkKIAkJcmV0dXJuIDA7CiAKLQlpZiAoZXZlbnQtPmNwdSAhPSAtMSAmJiBldmVudC0+Y3B1ICE9IHNtcF9wcm9jZXNzb3JfaWQoKSkKKwlpZiAoIWV2ZW50X2ZpbHRlcl9tYXRjaChldmVudCkpCiAJCXJldHVybiAwOwogCiAJaWYgKGV2ZW50LT5hdHRyLmNvbW0pCkBAIC00MTc4LDcgKzQxOTQsNyBAQAogCWlmIChldmVudC0+c3RhdGUgPCBQRVJGX0VWRU5UX1NUQVRFX0lOQUNUSVZFKQogCQlyZXR1cm4gMDsKIAotCWlmIChldmVudC0+Y3B1ICE9IC0xICYmIGV2ZW50LT5jcHUgIT0gc21wX3Byb2Nlc3Nvcl9pZCgpKQorCWlmICghZXZlbnRfZmlsdGVyX21hdGNoKGV2ZW50KSkKIAkJcmV0dXJuIDA7CiAKIAlpZiAoKCFleGVjdXRhYmxlICYmIGV2ZW50LT5hdHRyLm1tYXBfZGF0YSkgfHwKZGlmZiAtLWdpdCBhL2tlcm5lbC9wb3dlci9NYWtlZmlsZSBiL2tlcm5lbC9wb3dlci9NYWtlZmlsZQppbmRleCBmOTA2M2M2Li5iNzU1OTcyIDEwMDY0NAotLS0gYS9rZXJuZWwvcG93ZXIvTWFrZWZpbGUKKysrIGIva2VybmVsL3Bvd2VyL01ha2VmaWxlCkBAIC0xLDcgKzEsNCBAQAotCi1pZmVxICgkKENPTkZJR19QTV9ERUJVRykseSkKLUVYVFJBX0NGTEFHUwkrPQktRERFQlVHCi1lbmRpZgorY2NmbGFncy0kKENPTkZJR19QTV9ERUJVRykJOj0JLURERUJVRwogCiBvYmotJChDT05GSUdfUE0pCQkrPSBtYWluLm8KIG9iai0kKENPTkZJR19QTV9TTEVFUCkJCSs9IGNvbnNvbGUubwpkaWZmIC0tZ2l0IGEva2VybmVsL3Bvd2VyL2hpYmVybmF0ZS5jIGIva2VybmVsL3Bvd2VyL2hpYmVybmF0ZS5jCmluZGV4IDA0OGQwYjUuLjg3MGY3MmIgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9wb3dlci9oaWJlcm5hdGUuYworKysgYi9rZXJuZWwvcG93ZXIvaGliZXJuYXRlLmMKQEAgLTYyLDcgKzYyLDcgQEAKIHsKIAlpZiAob3BzICYmICEob3BzLT5iZWdpbiAmJiBvcHMtPmVuZCAmJiAgb3BzLT5wcmVfc25hcHNob3QKIAkgICAgJiYgb3BzLT5wcmVwYXJlICYmIG9wcy0+ZmluaXNoICYmIG9wcy0+ZW50ZXIgJiYgb3BzLT5wcmVfcmVzdG9yZQotCSAgICAmJiBvcHMtPnJlc3RvcmVfY2xlYW51cCkpIHsKKwkgICAgJiYgb3BzLT5yZXN0b3JlX2NsZWFudXAgJiYgb3BzLT5sZWF2ZSkpIHsKIAkJV0FSTl9PTigxKTsKIAkJcmV0dXJuOwogCX0KQEAgLTI3OCw3ICsyNzgsNyBAQAogCQlnb3RvIEVuYWJsZV9pcnFzOwogCX0KIAotCWlmIChoaWJlcm5hdGlvbl90ZXN0KFRFU1RfQ09SRSkgfHwgIXBtX2NoZWNrX3dha2V1cF9ldmVudHMoKSkKKwlpZiAoaGliZXJuYXRpb25fdGVzdChURVNUX0NPUkUpIHx8IHBtX3dha2V1cF9wZW5kaW5nKCkpCiAJCWdvdG8gUG93ZXJfdXA7CiAKIAlpbl9zdXNwZW5kID0gMTsKQEAgLTUxNiw3ICs1MTYsNyBAQAogCiAJbG9jYWxfaXJxX2Rpc2FibGUoKTsKIAlzeXNkZXZfc3VzcGVuZChQTVNHX0hJQkVSTkFURSk7Ci0JaWYgKCFwbV9jaGVja193YWtldXBfZXZlbnRzKCkpIHsKKwlpZiAocG1fd2FrZXVwX3BlbmRpbmcoKSkgewogCQllcnJvciA9IC1FQUdBSU47CiAJCWdvdG8gUG93ZXJfdXA7CiAJfQpAQCAtNjQ3LDYgKzY0Nyw3IEBACiAJCXN3c3VzcF9mcmVlKCk7CiAJCWlmICghZXJyb3IpCiAJCQlwb3dlcl9kb3duKCk7CisJCWluX3N1c3BlbmQgPSAwOwogCQlwbV9yZXN0b3JlX2dmcF9tYXNrKCk7CiAJfSBlbHNlIHsKIAkJcHJfZGVidWcoIlBNOiBJbWFnZSByZXN0b3JlZCBzdWNjZXNzZnVsbHkuXG4iKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9wb3dlci9wcm9jZXNzLmMgYi9rZXJuZWwvcG93ZXIvcHJvY2Vzcy5jCmluZGV4IGU1MGI0YzEuLmQ2ZDJhMTAgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9wb3dlci9wcm9jZXNzLmMKKysrIGIva2VybmVsL3Bvd2VyL3Byb2Nlc3MuYwpAQCAtNjQsNiArNjQsMTIgQEAKIAkJCSAqIHBlcnR1cmIgYSB0YXNrIGluIFRBU0tfU1RPUFBFRCBvciBUQVNLX1RSQUNFRC4KIAkJCSAqIEl0IGlzICJmcm96ZW4gZW5vdWdoIi4gIElmIHRoZSB0YXNrIGRvZXMgd2FrZQogCQkJICogdXAsIGl0IHdpbGwgaW1tZWRpYXRlbHkgY2FsbCB0cnlfdG9fZnJlZXplLgorCQkJICoKKwkJCSAqIEJlY2F1c2UgZnJlZXplX3Rhc2soKSBnb2VzIHRocm91Z2ggcCdzCisJCQkgKiBzY2hlZHVsZXIgbG9jayBhZnRlciBzZXR0aW5nIFRJRl9GUkVFWkUsIGl0J3MKKwkJCSAqIGd1YXJhbnRlZWQgdGhhdCBlaXRoZXIgd2Ugc2VlIFRBU0tfUlVOTklORyBvcgorCQkJICogdHJ5X3RvX3N0b3AoKSBhZnRlciBzY2hlZHVsZSgpIGluIHB0cmFjZS9zaWduYWwKKwkJCSAqIHN0b3Agc2VlcyBUSUZfRlJFRVpFLgogCQkJICovCiAJCQlpZiAoIXRhc2tfaXNfc3RvcHBlZF9vcl90cmFjZWQocCkgJiYKIAkJCSAgICAhZnJlZXplcl9zaG91bGRfc2tpcChwKSkKQEAgLTc5LDcgKzg1LDcgQEAKIAkJaWYgKCF0b2RvIHx8IHRpbWVfYWZ0ZXIoamlmZmllcywgZW5kX3RpbWUpKQogCQkJYnJlYWs7CiAKLQkJaWYgKCFwbV9jaGVja193YWtldXBfZXZlbnRzKCkpIHsKKwkJaWYgKHBtX3dha2V1cF9wZW5kaW5nKCkpIHsKIAkJCXdha2V1cCA9IHRydWU7CiAJCQlicmVhazsKIAkJfQpkaWZmIC0tZ2l0IGEva2VybmVsL3Bvd2VyL3N1c3BlbmQuYyBiL2tlcm5lbC9wb3dlci9zdXNwZW5kLmMKaW5kZXggMDMxZDVlMy4uODg1MGRmNiAxMDA2NDQKLS0tIGEva2VybmVsL3Bvd2VyL3N1c3BlbmQuYworKysgYi9rZXJuZWwvcG93ZXIvc3VzcGVuZC5jCkBAIC0xNjQsNyArMTY0LDcgQEAKIAogCWVycm9yID0gc3lzZGV2X3N1c3BlbmQoUE1TR19TVVNQRU5EKTsKIAlpZiAoIWVycm9yKSB7Ci0JCWlmICghc3VzcGVuZF90ZXN0KFRFU1RfQ09SRSkgJiYgcG1fY2hlY2tfd2FrZXVwX2V2ZW50cygpKSB7CisJCWlmICghKHN1c3BlbmRfdGVzdChURVNUX0NPUkUpIHx8IHBtX3dha2V1cF9wZW5kaW5nKCkpKSB7CiAJCQllcnJvciA9IHN1c3BlbmRfb3BzLT5lbnRlcihzdGF0ZSk7CiAJCQlldmVudHNfY2hlY2tfZW5hYmxlZCA9IGZhbHNlOwogCQl9CmRpZmYgLS1naXQgYS9rZXJuZWwvcHJpbnRrLmMgYi9rZXJuZWwvcHJpbnRrLmMKaW5kZXggNDY0MmE1Yy4uZjY0Yjg5OSAxMDA2NDQKLS0tIGEva2VybmVsL3ByaW50ay5jCisrKyBiL2tlcm5lbC9wcmludGsuYwpAQCAtMjczLDEyICsyNzMsMTIgQEAKIAkgKiBhdCBvcGVuIHRpbWUuCiAJICovCiAJaWYgKHR5cGUgPT0gU1lTTE9HX0FDVElPTl9PUEVOIHx8ICFmcm9tX2ZpbGUpIHsKLQkJaWYgKGRtZXNnX3Jlc3RyaWN0ICYmICFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQotCQkJcmV0dXJuIC1FUEVSTTsKKwkJaWYgKGRtZXNnX3Jlc3RyaWN0ICYmICFjYXBhYmxlKENBUF9TWVNMT0cpKQorCQkJZ290byB3YXJuOyAvKiBzd2l0Y2ggdG8gcmV0dXJuIC1FUEVSTSBhZnRlciAyLjYuMzkgKi8KIAkJaWYgKCh0eXBlICE9IFNZU0xPR19BQ1RJT05fUkVBRF9BTEwgJiYKIAkJICAgICB0eXBlICE9IFNZU0xPR19BQ1RJT05fU0laRV9CVUZGRVIpICYmCi0JCSAgICAhY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKLQkJCXJldHVybiAtRVBFUk07CisJCSAgICAhY2FwYWJsZShDQVBfU1lTTE9HKSkKKwkJCWdvdG8gd2FybjsgLyogc3dpdGNoIHRvIHJldHVybiAtRVBFUk0gYWZ0ZXIgMi42LjM5ICovCiAJfQogCiAJZXJyb3IgPSBzZWN1cml0eV9zeXNsb2codHlwZSk7CkBAIC00MjIsNiArNDIyLDEyIEBACiAJfQogb3V0OgogCXJldHVybiBlcnJvcjsKK3dhcm46CisJLyogcmVtb3ZlIGFmdGVyIDIuNi4zOSAqLworCWlmIChjYXBhYmxlKENBUF9TWVNfQURNSU4pKQorCQlXQVJOX09OQ0UoMSwgIkF0dGVtcHQgdG8gYWNjZXNzIHN5c2xvZyB3aXRoIENBUF9TWVNfQURNSU4gIgorCQkgICJidXQgbm8gQ0FQX1NZU0xPRyAoZGVwcmVjYXRlZCBhbmQgZGVuaWVkKS5cbiIpOworCXJldHVybiAtRVBFUk07CiB9CiAKIFNZU0NBTExfREVGSU5FMyhzeXNsb2csIGludCwgdHlwZSwgY2hhciBfX3VzZXIgKiwgYnVmLCBpbnQsIGxlbikKZGlmZiAtLWdpdCBhL2tlcm5lbC90cmFjZS9NYWtlZmlsZSBiL2tlcm5lbC90cmFjZS9NYWtlZmlsZQppbmRleCA1M2YzMzgxLi43NjFjNTEwIDEwMDY0NAotLS0gYS9rZXJuZWwvdHJhY2UvTWFrZWZpbGUKKysrIGIva2VybmVsL3RyYWNlL01ha2VmaWxlCkBAIC01Miw3ICs1Miw3IEBACiBlbmRpZgogb2JqLSQoQ09ORklHX0VWRU5UX1RSQUNJTkcpICs9IHRyYWNlX2V2ZW50c19maWx0ZXIubwogb2JqLSQoQ09ORklHX0tQUk9CRV9FVkVOVCkgKz0gdHJhY2Vfa3Byb2JlLm8KLW9iai0kKENPTkZJR19FVkVOVF9UUkFDSU5HKSArPSBwb3dlci10cmFjZXMubworb2JqLSQoQ09ORklHX1RSQUNFUE9JTlRTKSArPSBwb3dlci10cmFjZXMubwogaWZlcSAoJChDT05GSUdfVFJBQ0lORykseSkKIG9iai0kKENPTkZJR19LR0RCX0tEQikgKz0gdHJhY2Vfa2RiLm8KIGVuZGlmCmRpZmYgLS1naXQgYS9rZXJuZWwvdHJhY2UvdHJhY2UuYyBiL2tlcm5lbC90cmFjZS90cmFjZS5jCmluZGV4IGY4Y2Y5NTkuLmRjNTNlY2IgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90cmFjZS90cmFjZS5jCisrKyBiL2tlcm5lbC90cmFjZS90cmFjZS5jCkBAIC0xMzEzLDEyICsxMzEzLDEwIEBACiAKIAlfX3RoaXNfY3B1X2luYyh1c2VyX3N0YWNrX2NvdW50KTsKIAotCi0KIAlldmVudCA9IHRyYWNlX2J1ZmZlcl9sb2NrX3Jlc2VydmUoYnVmZmVyLCBUUkFDRV9VU0VSX1NUQUNLLAogCQkJCQkgIHNpemVvZigqZW50cnkpLCBmbGFncywgcGMpOwogCWlmICghZXZlbnQpCi0JCXJldHVybjsKKwkJZ290byBvdXRfZHJvcF9jb3VudDsKIAllbnRyeQk9IHJpbmdfYnVmZmVyX2V2ZW50X2RhdGEoZXZlbnQpOwogCiAJZW50cnktPnRnaWQJCT0gY3VycmVudC0+dGdpZDsKQEAgLTEzMzMsOCArMTMzMSw4IEBACiAJaWYgKCFmaWx0ZXJfY2hlY2tfZGlzY2FyZChjYWxsLCBlbnRyeSwgYnVmZmVyLCBldmVudCkpCiAJCXJpbmdfYnVmZmVyX3VubG9ja19jb21taXQoYnVmZmVyLCBldmVudCk7CiAKKyBvdXRfZHJvcF9jb3VudDoKIAlfX3RoaXNfY3B1X2RlYyh1c2VyX3N0YWNrX2NvdW50KTsKLQogIG91dDoKIAlwcmVlbXB0X2VuYWJsZSgpOwogfQpkaWZmIC0tZ2l0IGEvbGliL2R5bmFtaWNfZGVidWcuYyBiL2xpYi9keW5hbWljX2RlYnVnLmMKaW5kZXggMzA5NDMxOC4uYjMzNWFjYiAxMDA2NDQKLS0tIGEvbGliL2R5bmFtaWNfZGVidWcuYworKysgYi9saWIvZHluYW1pY19kZWJ1Zy5jCkBAIC0xNDEsMTEgKzE0MSwxMCBAQAogCQkJZWxzZSBpZiAoIWRwLT5mbGFncykKIAkJCQlkdC0+bnVtX2VuYWJsZWQrKzsKIAkJCWRwLT5mbGFncyA9IG5ld2ZsYWdzOwotCQkJaWYgKG5ld2ZsYWdzKSB7Ci0JCQkJanVtcF9sYWJlbF9lbmFibGUoJmRwLT5lbmFibGVkKTsKLQkJCX0gZWxzZSB7Ci0JCQkJanVtcF9sYWJlbF9kaXNhYmxlKCZkcC0+ZW5hYmxlZCk7Ci0JCQl9CisJCQlpZiAobmV3ZmxhZ3MpCisJCQkJZHAtPmVuYWJsZWQgPSAxOworCQkJZWxzZQorCQkJCWRwLT5lbmFibGVkID0gMDsKIAkJCWlmICh2ZXJib3NlKQogCQkJCXByaW50ayhLRVJOX0lORk8KIAkJCQkJImRkZWJ1ZzogY2hhbmdlZCAlczolZCBbJXNdJXMgJXNcbiIsCmRpZmYgLS1naXQgYS9saWIvaGV4ZHVtcC5jIGIvbGliL2hleGR1bXAuYwppbmRleCA1ZDdhNDgwLi5iNjZiMmJkIDEwMDY0NAotLS0gYS9saWIvaGV4ZHVtcC5jCisrKyBiL2xpYi9oZXhkdW1wLmMKQEAgLTM0LDYgKzM0LDIyIEBACiBFWFBPUlRfU1lNQk9MKGhleF90b19iaW4pOwogCiAvKioKKyAqIGhleDJiaW4gLSBjb252ZXJ0IGFuIGFzY2lpIGhleGFkZWNpbWFsIHN0cmluZyB0byBpdHMgYmluYXJ5IHJlcHJlc2VudGF0aW9uCisgKiBAZHN0OiBiaW5hcnkgcmVzdWx0CisgKiBAc3JjOiBhc2NpaSBoZXhhZGVjaW1hbCBzdHJpbmcKKyAqIEBjb3VudDogcmVzdWx0IGxlbmd0aAorICovCit2b2lkIGhleDJiaW4odTggKmRzdCwgY29uc3QgY2hhciAqc3JjLCBzaXplX3QgY291bnQpCit7CisJd2hpbGUgKGNvdW50LS0pIHsKKwkJKmRzdCA9IGhleF90b19iaW4oKnNyYysrKSA8PCA0OworCQkqZHN0ICs9IGhleF90b19iaW4oKnNyYysrKTsKKwkJZHN0Kys7CisJfQorfQorRVhQT1JUX1NZTUJPTChoZXgyYmluKTsKKworLyoqCiAgKiBoZXhfZHVtcF90b19idWZmZXIgLSBjb252ZXJ0IGEgYmxvYiBvZiBkYXRhIHRvICJoZXggQVNDSUkiIGluIG1lbW9yeQogICogQGJ1ZjogZGF0YSBibG9iIHRvIGR1bXAKICAqIEBsZW46IG51bWJlciBvZiBieXRlcyBpbiB0aGUgQGJ1ZgpkaWZmIC0tZ2l0IGEvbGliL2tyZWYuYyBiL2xpYi9rcmVmLmMKaW5kZXggZDNkMjI3YS4uM2VmYjg4MiAxMDA2NDQKLS0tIGEvbGliL2tyZWYuYworKysgYi9saWIva3JlZi5jCkBAIC02Miw2ICs2MiwzNiBAQAogCXJldHVybiAwOwogfQogCisKKy8qKgorICoga3JlZl9zdWIgLSBzdWJ0cmFjdCBhIG51bWJlciBvZiByZWZjb3VudHMgZm9yIG9iamVjdC4KKyAqIEBrcmVmOiBvYmplY3QuCisgKiBAY291bnQ6IE51bWJlciBvZiByZWNvdW50cyB0byBzdWJ0cmFjdC4KKyAqIEByZWxlYXNlOiBwb2ludGVyIHRvIHRoZSBmdW5jdGlvbiB0aGF0IHdpbGwgY2xlYW4gdXAgdGhlIG9iamVjdCB3aGVuIHRoZQorICoJICAgICBsYXN0IHJlZmVyZW5jZSB0byB0aGUgb2JqZWN0IGlzIHJlbGVhc2VkLgorICoJICAgICBUaGlzIHBvaW50ZXIgaXMgcmVxdWlyZWQsIGFuZCBpdCBpcyBub3QgYWNjZXB0YWJsZSB0byBwYXNzIGtmcmVlCisgKgkgICAgIGluIGFzIHRoaXMgZnVuY3Rpb24uCisgKgorICogU3VidHJhY3QgQGNvdW50IGZyb20gdGhlIHJlZmNvdW50LCBhbmQgaWYgMCwgY2FsbCByZWxlYXNlKCkuCisgKiBSZXR1cm4gMSBpZiB0aGUgb2JqZWN0IHdhcyByZW1vdmVkLCBvdGhlcndpc2UgcmV0dXJuIDAuICBCZXdhcmUsIGlmIHRoaXMKKyAqIGZ1bmN0aW9uIHJldHVybnMgMCwgeW91IHN0aWxsIGNhbiBub3QgY291bnQgb24gdGhlIGtyZWYgZnJvbSByZW1haW5pbmcgaW4KKyAqIG1lbW9yeS4gIE9ubHkgdXNlIHRoZSByZXR1cm4gdmFsdWUgaWYgeW91IHdhbnQgdG8gc2VlIGlmIHRoZSBrcmVmIGlzIG5vdworICogZ29uZSwgbm90IHByZXNlbnQuCisgKi8KK2ludCBrcmVmX3N1YihzdHJ1Y3Qga3JlZiAqa3JlZiwgdW5zaWduZWQgaW50IGNvdW50LAorCSAgICAgdm9pZCAoKnJlbGVhc2UpKHN0cnVjdCBrcmVmICprcmVmKSkKK3sKKwlXQVJOX09OKHJlbGVhc2UgPT0gTlVMTCk7CisJV0FSTl9PTihyZWxlYXNlID09ICh2b2lkICgqKShzdHJ1Y3Qga3JlZiAqKSlrZnJlZSk7CisKKwlpZiAoYXRvbWljX3N1Yl9hbmRfdGVzdCgoaW50KSBjb3VudCwgJmtyZWYtPnJlZmNvdW50KSkgeworCQlyZWxlYXNlKGtyZWYpOworCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKIEVYUE9SVF9TWU1CT0woa3JlZl9pbml0KTsKIEVYUE9SVF9TWU1CT0woa3JlZl9nZXQpOwogRVhQT1JUX1NZTUJPTChrcmVmX3B1dCk7CitFWFBPUlRfU1lNQk9MKGtyZWZfc3ViKTsKZGlmZiAtLWdpdCBhL21tL3NsYWIuYyBiL21tL3NsYWIuYwppbmRleCBlOWY5Mjk4Li4yNjQwMzc0IDEwMDY0NAotLS0gYS9tbS9zbGFiLmMKKysrIGIvbW0vc2xhYi5jCkBAIC0zNjUzLDExICszNjUzLDE4IEBACiBFWFBPUlRfU1lNQk9MKGttZW1fY2FjaGVfYWxsb2MpOwogCiAjaWZkZWYgQ09ORklHX1RSQUNJTkcKLXZvaWQgKmttZW1fY2FjaGVfYWxsb2Nfbm90cmFjZShzdHJ1Y3Qga21lbV9jYWNoZSAqY2FjaGVwLCBnZnBfdCBmbGFncykKK3ZvaWQgKgora21lbV9jYWNoZV9hbGxvY190cmFjZShzaXplX3Qgc2l6ZSwgc3RydWN0IGttZW1fY2FjaGUgKmNhY2hlcCwgZ2ZwX3QgZmxhZ3MpCiB7Ci0JcmV0dXJuIF9fY2FjaGVfYWxsb2MoY2FjaGVwLCBmbGFncywgX19idWlsdGluX3JldHVybl9hZGRyZXNzKDApKTsKKwl2b2lkICpyZXQ7CisKKwlyZXQgPSBfX2NhY2hlX2FsbG9jKGNhY2hlcCwgZmxhZ3MsIF9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcygwKSk7CisKKwl0cmFjZV9rbWFsbG9jKF9SRVRfSVBfLCByZXQsCisJCSAgICAgIHNpemUsIHNsYWJfYnVmZmVyX3NpemUoY2FjaGVwKSwgZmxhZ3MpOworCXJldHVybiByZXQ7CiB9Ci1FWFBPUlRfU1lNQk9MKGttZW1fY2FjaGVfYWxsb2Nfbm90cmFjZSk7CitFWFBPUlRfU1lNQk9MKGttZW1fY2FjaGVfYWxsb2NfdHJhY2UpOwogI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfTlVNQQpAQCAtMzY3NSwzMSArMzY4MiwzMiBAQAogRVhQT1JUX1NZTUJPTChrbWVtX2NhY2hlX2FsbG9jX25vZGUpOwogCiAjaWZkZWYgQ09ORklHX1RSQUNJTkcKLXZvaWQgKmttZW1fY2FjaGVfYWxsb2Nfbm9kZV9ub3RyYWNlKHN0cnVjdCBrbWVtX2NhY2hlICpjYWNoZXAsCi0JCQkJICAgIGdmcF90IGZsYWdzLAotCQkJCSAgICBpbnQgbm9kZWlkKQordm9pZCAqa21lbV9jYWNoZV9hbGxvY19ub2RlX3RyYWNlKHNpemVfdCBzaXplLAorCQkJCSAgc3RydWN0IGttZW1fY2FjaGUgKmNhY2hlcCwKKwkJCQkgIGdmcF90IGZsYWdzLAorCQkJCSAgaW50IG5vZGVpZCkKIHsKLQlyZXR1cm4gX19jYWNoZV9hbGxvY19ub2RlKGNhY2hlcCwgZmxhZ3MsIG5vZGVpZCwKKwl2b2lkICpyZXQ7CisKKwlyZXQgPSBfX2NhY2hlX2FsbG9jX25vZGUoY2FjaGVwLCBmbGFncywgbm9kZWlkLAogCQkJCSAgX19idWlsdGluX3JldHVybl9hZGRyZXNzKDApKTsKKwl0cmFjZV9rbWFsbG9jX25vZGUoX1JFVF9JUF8sIHJldCwKKwkJCSAgIHNpemUsIHNsYWJfYnVmZmVyX3NpemUoY2FjaGVwKSwKKwkJCSAgIGZsYWdzLCBub2RlaWQpOworCXJldHVybiByZXQ7CiB9Ci1FWFBPUlRfU1lNQk9MKGttZW1fY2FjaGVfYWxsb2Nfbm9kZV9ub3RyYWNlKTsKK0VYUE9SVF9TWU1CT0woa21lbV9jYWNoZV9hbGxvY19ub2RlX3RyYWNlKTsKICNlbmRpZgogCiBzdGF0aWMgX19hbHdheXNfaW5saW5lIHZvaWQgKgogX19kb19rbWFsbG9jX25vZGUoc2l6ZV90IHNpemUsIGdmcF90IGZsYWdzLCBpbnQgbm9kZSwgdm9pZCAqY2FsbGVyKQogewogCXN0cnVjdCBrbWVtX2NhY2hlICpjYWNoZXA7Ci0Jdm9pZCAqcmV0OwogCiAJY2FjaGVwID0ga21lbV9maW5kX2dlbmVyYWxfY2FjaGVwKHNpemUsIGZsYWdzKTsKIAlpZiAodW5saWtlbHkoWkVST19PUl9OVUxMX1BUUihjYWNoZXApKSkKIAkJcmV0dXJuIGNhY2hlcDsKLQlyZXQgPSBrbWVtX2NhY2hlX2FsbG9jX25vZGVfbm90cmFjZShjYWNoZXAsIGZsYWdzLCBub2RlKTsKLQotCXRyYWNlX2ttYWxsb2Nfbm9kZSgodW5zaWduZWQgbG9uZykgY2FsbGVyLCByZXQsCi0JCQkgICBzaXplLCBjYWNoZXAtPmJ1ZmZlcl9zaXplLCBmbGFncywgbm9kZSk7Ci0KLQlyZXR1cm4gcmV0OworCXJldHVybiBrbWVtX2NhY2hlX2FsbG9jX25vZGVfdHJhY2Uoc2l6ZSwgY2FjaGVwLCBmbGFncywgbm9kZSk7CiB9CiAKICNpZiBkZWZpbmVkKENPTkZJR19ERUJVR19TTEFCKSB8fCBkZWZpbmVkKENPTkZJR19UUkFDSU5HKQpkaWZmIC0tZ2l0IGEvbW0vc2x1Yi5jIGIvbW0vc2x1Yi5jCmluZGV4IGEyZmUxNzIuLjAwOGNkNzQgMTAwNjQ0Ci0tLSBhL21tL3NsdWIuYworKysgYi9tbS9zbHViLmMKQEAgLTI4LDYgKzI4LDggQEAKICNpbmNsdWRlIDxsaW51eC9tYXRoNjQuaD4KICNpbmNsdWRlIDxsaW51eC9mYXVsdC1pbmplY3QuaD4KIAorI2luY2x1ZGUgPHRyYWNlL2V2ZW50cy9rbWVtLmg+CisKIC8qCiAgKiBMb2NrIG9yZGVyOgogICogICAxLiBzbGFiX2xvY2socGFnZSkKQEAgLTE3NzQsMTEgKzE3NzYsMjEgQEAKIEVYUE9SVF9TWU1CT0woa21lbV9jYWNoZV9hbGxvYyk7CiAKICNpZmRlZiBDT05GSUdfVFJBQ0lORwotdm9pZCAqa21lbV9jYWNoZV9hbGxvY19ub3RyYWNlKHN0cnVjdCBrbWVtX2NhY2hlICpzLCBnZnBfdCBnZnBmbGFncykKK3ZvaWQgKmttZW1fY2FjaGVfYWxsb2NfdHJhY2Uoc3RydWN0IGttZW1fY2FjaGUgKnMsIGdmcF90IGdmcGZsYWdzLCBzaXplX3Qgc2l6ZSkKIHsKLQlyZXR1cm4gc2xhYl9hbGxvYyhzLCBnZnBmbGFncywgTlVNQV9OT19OT0RFLCBfUkVUX0lQXyk7CisJdm9pZCAqcmV0ID0gc2xhYl9hbGxvYyhzLCBnZnBmbGFncywgTlVNQV9OT19OT0RFLCBfUkVUX0lQXyk7CisJdHJhY2Vfa21hbGxvYyhfUkVUX0lQXywgcmV0LCBzaXplLCBzLT5zaXplLCBnZnBmbGFncyk7CisJcmV0dXJuIHJldDsKIH0KLUVYUE9SVF9TWU1CT0woa21lbV9jYWNoZV9hbGxvY19ub3RyYWNlKTsKK0VYUE9SVF9TWU1CT0woa21lbV9jYWNoZV9hbGxvY190cmFjZSk7CisKK3ZvaWQgKmttYWxsb2Nfb3JkZXJfdHJhY2Uoc2l6ZV90IHNpemUsIGdmcF90IGZsYWdzLCB1bnNpZ25lZCBpbnQgb3JkZXIpCit7CisJdm9pZCAqcmV0ID0ga21hbGxvY19vcmRlcihzaXplLCBmbGFncywgb3JkZXIpOworCXRyYWNlX2ttYWxsb2MoX1JFVF9JUF8sIHJldCwgc2l6ZSwgUEFHRV9TSVpFIDw8IG9yZGVyLCBmbGFncyk7CisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0woa21hbGxvY19vcmRlcl90cmFjZSk7CiAjZW5kaWYKIAogI2lmZGVmIENPTkZJR19OVU1BCkBAIC0xNzk0LDEzICsxODA2LDE3IEBACiBFWFBPUlRfU1lNQk9MKGttZW1fY2FjaGVfYWxsb2Nfbm9kZSk7CiAKICNpZmRlZiBDT05GSUdfVFJBQ0lORwotdm9pZCAqa21lbV9jYWNoZV9hbGxvY19ub2RlX25vdHJhY2Uoc3RydWN0IGttZW1fY2FjaGUgKnMsCit2b2lkICprbWVtX2NhY2hlX2FsbG9jX25vZGVfdHJhY2Uoc3RydWN0IGttZW1fY2FjaGUgKnMsCiAJCQkJICAgIGdmcF90IGdmcGZsYWdzLAotCQkJCSAgICBpbnQgbm9kZSkKKwkJCQkgICAgaW50IG5vZGUsIHNpemVfdCBzaXplKQogewotCXJldHVybiBzbGFiX2FsbG9jKHMsIGdmcGZsYWdzLCBub2RlLCBfUkVUX0lQXyk7CisJdm9pZCAqcmV0ID0gc2xhYl9hbGxvYyhzLCBnZnBmbGFncywgbm9kZSwgX1JFVF9JUF8pOworCisJdHJhY2Vfa21hbGxvY19ub2RlKF9SRVRfSVBfLCByZXQsCisJCQkgICBzaXplLCBzLT5zaXplLCBnZnBmbGFncywgbm9kZSk7CisJcmV0dXJuIHJldDsKIH0KLUVYUE9SVF9TWU1CT0woa21lbV9jYWNoZV9hbGxvY19ub2RlX25vdHJhY2UpOworRVhQT1JUX1NZTUJPTChrbWVtX2NhY2hlX2FsbG9jX25vZGVfdHJhY2UpOwogI2VuZGlmCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvbmV0LzlwL3Byb3RvY29sLmMgYi9uZXQvOXAvcHJvdG9jb2wuYwppbmRleCA3OThiZWFjLi4xZTMwOGYyIDEwMDY0NAotLS0gYS9uZXQvOXAvcHJvdG9jb2wuYworKysgYi9uZXQvOXAvcHJvdG9jb2wuYwpAQCAtMTc4LDI3ICsxNzgsMjQgQEAKIAkJCWJyZWFrOwogCQljYXNlICdzJzp7CiAJCQkJY2hhciAqKnNwdHIgPSB2YV9hcmcoYXAsIGNoYXIgKiopOwotCQkJCWludDE2X3QgbGVuOwotCQkJCWludCBzaXplOworCQkJCXVpbnQxNl90IGxlbjsKIAogCQkJCWVycmNvZGUgPSBwOXBkdV9yZWFkZihwZHUsIHByb3RvX3ZlcnNpb24sCiAJCQkJCQkJCSJ3IiwgJmxlbik7CiAJCQkJaWYgKGVycmNvZGUpCiAJCQkJCWJyZWFrOwogCi0JCQkJc2l6ZSA9IG1heF90KGludDE2X3QsIGxlbiwgMCk7Ci0KLQkJCQkqc3B0ciA9IGttYWxsb2Moc2l6ZSArIDEsIEdGUF9LRVJORUwpOworCQkJCSpzcHRyID0ga21hbGxvYyhsZW4gKyAxLCBHRlBfS0VSTkVMKTsKIAkJCQlpZiAoKnNwdHIgPT0gTlVMTCkgewogCQkJCQllcnJjb2RlID0gLUVGQVVMVDsKIAkJCQkJYnJlYWs7CiAJCQkJfQotCQkJCWlmIChwZHVfcmVhZChwZHUsICpzcHRyLCBzaXplKSkgeworCQkJCWlmIChwZHVfcmVhZChwZHUsICpzcHRyLCBsZW4pKSB7CiAJCQkJCWVycmNvZGUgPSAtRUZBVUxUOwogCQkJCQlrZnJlZSgqc3B0cik7CiAJCQkJCSpzcHRyID0gTlVMTDsKIAkJCQl9IGVsc2UKLQkJCQkJKCpzcHRyKVtzaXplXSA9IDA7CisJCQkJCSgqc3B0cilbbGVuXSA9IDA7CiAJCQl9CiAJCQlicmVhazsKIAkJY2FzZSAnUSc6ewpAQCAtMjM0LDE0ICsyMzEsMTQgQEAKIAkJCX0KIAkJCWJyZWFrOwogCQljYXNlICdEJzp7Ci0JCQkJaW50MzJfdCAqY291bnQgPSB2YV9hcmcoYXAsIGludDMyX3QgKik7CisJCQkJdWludDMyX3QgKmNvdW50ID0gdmFfYXJnKGFwLCB1aW50MzJfdCAqKTsKIAkJCQl2b2lkICoqZGF0YSA9IHZhX2FyZyhhcCwgdm9pZCAqKik7CiAKIAkJCQllcnJjb2RlID0KIAkJCQkgICAgcDlwZHVfcmVhZGYocGR1LCBwcm90b192ZXJzaW9uLCAiZCIsIGNvdW50KTsKIAkJCQlpZiAoIWVycmNvZGUpIHsKIAkJCQkJKmNvdW50ID0KLQkJCQkJICAgIG1pbl90KGludDMyX3QsICpjb3VudCwKKwkJCQkJICAgIG1pbl90KHVpbnQzMl90LCAqY291bnQsCiAJCQkJCQkgIHBkdS0+c2l6ZSAtIHBkdS0+b2Zmc2V0KTsKIAkJCQkJKmRhdGEgPSAmcGR1LT5zZGF0YVtwZHUtPm9mZnNldF07CiAJCQkJfQpAQCAtNDA0LDkgKzQwMSwxMCBAQAogCQkJYnJlYWs7CiAJCWNhc2UgJ3MnOnsKIAkJCQljb25zdCBjaGFyICpzcHRyID0gdmFfYXJnKGFwLCBjb25zdCBjaGFyICopOwotCQkJCWludDE2X3QgbGVuID0gMDsKKwkJCQl1aW50MTZfdCBsZW4gPSAwOwogCQkJCWlmIChzcHRyKQotCQkJCQlsZW4gPSBtaW5fdChpbnQxNl90LCBzdHJsZW4oc3B0ciksIFVTSFJUX01BWCk7CisJCQkJCWxlbiA9IG1pbl90KHVpbnQxNl90LCBzdHJsZW4oc3B0ciksCisJCQkJCQkJCVVTSFJUX01BWCk7CiAKIAkJCQllcnJjb2RlID0gcDlwZHVfd3JpdGVmKHBkdSwgcHJvdG9fdmVyc2lvbiwKIAkJCQkJCQkJInciLCBsZW4pOwpAQCAtNDM4LDcgKzQzNiw3IEBACiAJCQkJCQkgc3RidWYtPm5fZ2lkLCBzdGJ1Zi0+bl9tdWlkKTsKIAkJCX0gYnJlYWs7CiAJCWNhc2UgJ0QnOnsKLQkJCQlpbnQzMl90IGNvdW50ID0gdmFfYXJnKGFwLCBpbnQzMl90KTsKKwkJCQl1aW50MzJfdCBjb3VudCA9IHZhX2FyZyhhcCwgdWludDMyX3QpOwogCQkJCWNvbnN0IHZvaWQgKmRhdGEgPSB2YV9hcmcoYXAsIGNvbnN0IHZvaWQgKik7CiAKIAkJCQllcnJjb2RlID0gcDlwZHVfd3JpdGVmKHBkdSwgcHJvdG9fdmVyc2lvbiwgImQiLApkaWZmIC0tZ2l0IGEvbmV0L3N1bnJwYy9hdXRoLmMgYi9uZXQvc3VucnBjL2F1dGguYwppbmRleCBhZmU2Nzg0Li42N2UzMTI3IDEwMDY0NAotLS0gYS9uZXQvc3VucnBjL2F1dGguYworKysgYi9uZXQvc3VucnBjL2F1dGguYwpAQCAtNTYzLDggKzU2MywxNyBAQAogCXJldHVybiBjcmVkLT5jcl9vcHMtPmNydmFsaWRhdGUodGFzaywgcCk7CiB9CiAKK3N0YXRpYyB2b2lkIHJwY2F1dGhfd3JhcF9yZXFfZW5jb2RlKGt4ZHJlcHJvY190IGVuY29kZSwgc3RydWN0IHJwY19ycXN0ICpycXN0cCwKKwkJCQkgICBfX2JlMzIgKmRhdGEsIHZvaWQgKm9iaikKK3sKKwlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CisKKwl4ZHJfaW5pdF9lbmNvZGUoJnhkciwgJnJxc3RwLT5ycV9zbmRfYnVmLCBkYXRhKTsKKwllbmNvZGUocnFzdHAsICZ4ZHIsIG9iaik7Cit9CisKIGludAotcnBjYXV0aF93cmFwX3JlcShzdHJ1Y3QgcnBjX3Rhc2sgKnRhc2ssIGt4ZHJwcm9jX3QgZW5jb2RlLCB2b2lkICpycXN0cCwKK3JwY2F1dGhfd3JhcF9yZXEoc3RydWN0IHJwY190YXNrICp0YXNrLCBreGRyZXByb2NfdCBlbmNvZGUsIHZvaWQgKnJxc3RwLAogCQlfX2JlMzIgKmRhdGEsIHZvaWQgKm9iaikKIHsKIAlzdHJ1Y3QgcnBjX2NyZWQgKmNyZWQgPSB0YXNrLT50a19ycXN0cC0+cnFfY3JlZDsKQEAgLTU3NCwxMSArNTgzLDIyIEBACiAJaWYgKGNyZWQtPmNyX29wcy0+Y3J3cmFwX3JlcSkKIAkJcmV0dXJuIGNyZWQtPmNyX29wcy0+Y3J3cmFwX3JlcSh0YXNrLCBlbmNvZGUsIHJxc3RwLCBkYXRhLCBvYmopOwogCS8qIEJ5IGRlZmF1bHQsIHdlIGVuY29kZSB0aGUgYXJndW1lbnRzIG5vcm1hbGx5LiAqLwotCXJldHVybiBlbmNvZGUocnFzdHAsIGRhdGEsIG9iaik7CisJcnBjYXV0aF93cmFwX3JlcV9lbmNvZGUoZW5jb2RlLCBycXN0cCwgZGF0YSwgb2JqKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorcnBjYXV0aF91bndyYXBfcmVxX2RlY29kZShreGRyZHByb2NfdCBkZWNvZGUsIHN0cnVjdCBycGNfcnFzdCAqcnFzdHAsCisJCQkgIF9fYmUzMiAqZGF0YSwgdm9pZCAqb2JqKQoreworCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKKworCXhkcl9pbml0X2RlY29kZSgmeGRyLCAmcnFzdHAtPnJxX3Jjdl9idWYsIGRhdGEpOworCXJldHVybiBkZWNvZGUocnFzdHAsICZ4ZHIsIG9iaik7CiB9CiAKIGludAotcnBjYXV0aF91bndyYXBfcmVzcChzdHJ1Y3QgcnBjX3Rhc2sgKnRhc2ssIGt4ZHJwcm9jX3QgZGVjb2RlLCB2b2lkICpycXN0cCwKK3JwY2F1dGhfdW53cmFwX3Jlc3Aoc3RydWN0IHJwY190YXNrICp0YXNrLCBreGRyZHByb2NfdCBkZWNvZGUsIHZvaWQgKnJxc3RwLAogCQlfX2JlMzIgKmRhdGEsIHZvaWQgKm9iaikKIHsKIAlzdHJ1Y3QgcnBjX2NyZWQgKmNyZWQgPSB0YXNrLT50a19ycXN0cC0+cnFfY3JlZDsKQEAgLTU4OSw3ICs2MDksNyBAQAogCQlyZXR1cm4gY3JlZC0+Y3Jfb3BzLT5jcnVud3JhcF9yZXNwKHRhc2ssIGRlY29kZSwgcnFzdHAsCiAJCQkJCQkgICBkYXRhLCBvYmopOwogCS8qIEJ5IGRlZmF1bHQsIHdlIGRlY29kZSB0aGUgYXJndW1lbnRzIG5vcm1hbGx5LiAqLwotCXJldHVybiBkZWNvZGUocnFzdHAsIGRhdGEsIG9iaik7CisJcmV0dXJuIHJwY2F1dGhfdW53cmFwX3JlcV9kZWNvZGUoZGVjb2RlLCBycXN0cCwgZGF0YSwgb2JqKTsKIH0KIAogaW50CmRpZmYgLS1naXQgYS9uZXQvc3VucnBjL2F1dGhfZ3NzL2F1dGhfZ3NzLmMgYi9uZXQvc3VucnBjL2F1dGhfZ3NzL2F1dGhfZ3NzLmMKaW5kZXggMzgzNWNlMy4uNDVkYmYxNSAxMDA2NDQKLS0tIGEvbmV0L3N1bnJwYy9hdXRoX2dzcy9hdXRoX2dzcy5jCisrKyBiL25ldC9zdW5ycGMvYXV0aF9nc3MvYXV0aF9nc3MuYwpAQCAtMTIzMSw5ICsxMjMxLDE5IEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKK3N0YXRpYyB2b2lkIGdzc193cmFwX3JlcV9lbmNvZGUoa3hkcmVwcm9jX3QgZW5jb2RlLCBzdHJ1Y3QgcnBjX3Jxc3QgKnJxc3RwLAorCQkJCV9fYmUzMiAqcCwgdm9pZCAqb2JqKQoreworCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKKworCXhkcl9pbml0X2VuY29kZSgmeGRyLCAmcnFzdHAtPnJxX3NuZF9idWYsIHApOworCWVuY29kZShycXN0cCwgJnhkciwgb2JqKTsKK30KKwogc3RhdGljIGlubGluZSBpbnQKIGdzc193cmFwX3JlcV9pbnRlZyhzdHJ1Y3QgcnBjX2NyZWQgKmNyZWQsIHN0cnVjdCBnc3NfY2xfY3R4ICpjdHgsCi0JCWt4ZHJwcm9jX3QgZW5jb2RlLCBzdHJ1Y3QgcnBjX3Jxc3QgKnJxc3RwLCBfX2JlMzIgKnAsIHZvaWQgKm9iaikKKwkJICAga3hkcmVwcm9jX3QgZW5jb2RlLCBzdHJ1Y3QgcnBjX3Jxc3QgKnJxc3RwLAorCQkgICBfX2JlMzIgKnAsIHZvaWQgKm9iaikKIHsKIAlzdHJ1Y3QgeGRyX2J1Zgkqc25kX2J1ZiA9ICZycXN0cC0+cnFfc25kX2J1ZjsKIAlzdHJ1Y3QgeGRyX2J1ZglpbnRlZ19idWY7CkBAIC0xMjQ5LDkgKzEyNTksNyBAQAogCW9mZnNldCA9ICh1OCAqKXAgLSAodTggKilzbmRfYnVmLT5oZWFkWzBdLmlvdl9iYXNlOwogCSpwKysgPSBodG9ubChycXN0cC0+cnFfc2Vxbm8pOwogCi0Jc3RhdHVzID0gZW5jb2RlKHJxc3RwLCBwLCBvYmopOwotCWlmIChzdGF0dXMpCi0JCXJldHVybiBzdGF0dXM7CisJZ3NzX3dyYXBfcmVxX2VuY29kZShlbmNvZGUsIHJxc3RwLCBwLCBvYmopOwogCiAJaWYgKHhkcl9idWZfc3Vic2VnbWVudChzbmRfYnVmLCAmaW50ZWdfYnVmLAogCQkJCW9mZnNldCwgc25kX2J1Zi0+bGVuIC0gb2Zmc2V0KSkKQEAgLTEzMjUsNyArMTMzMyw4IEBACiAKIHN0YXRpYyBpbmxpbmUgaW50CiBnc3Nfd3JhcF9yZXFfcHJpdihzdHJ1Y3QgcnBjX2NyZWQgKmNyZWQsIHN0cnVjdCBnc3NfY2xfY3R4ICpjdHgsCi0JCWt4ZHJwcm9jX3QgZW5jb2RlLCBzdHJ1Y3QgcnBjX3Jxc3QgKnJxc3RwLCBfX2JlMzIgKnAsIHZvaWQgKm9iaikKKwkJICBreGRyZXByb2NfdCBlbmNvZGUsIHN0cnVjdCBycGNfcnFzdCAqcnFzdHAsCisJCSAgX19iZTMyICpwLCB2b2lkICpvYmopCiB7CiAJc3RydWN0IHhkcl9idWYJKnNuZF9idWYgPSAmcnFzdHAtPnJxX3NuZF9idWY7CiAJdTMyCQlvZmZzZXQ7CkBAIC0xMzQyLDkgKzEzNTEsNyBAQAogCW9mZnNldCA9ICh1OCAqKXAgLSAodTggKilzbmRfYnVmLT5oZWFkWzBdLmlvdl9iYXNlOwogCSpwKysgPSBodG9ubChycXN0cC0+cnFfc2Vxbm8pOwogCi0Jc3RhdHVzID0gZW5jb2RlKHJxc3RwLCBwLCBvYmopOwotCWlmIChzdGF0dXMpCi0JCXJldHVybiBzdGF0dXM7CisJZ3NzX3dyYXBfcmVxX2VuY29kZShlbmNvZGUsIHJxc3RwLCBwLCBvYmopOwogCiAJc3RhdHVzID0gYWxsb2NfZW5jX3BhZ2VzKHJxc3RwKTsKIAlpZiAoc3RhdHVzKQpAQCAtMTM5NCw3ICsxNDAxLDcgQEAKIAogc3RhdGljIGludAogZ3NzX3dyYXBfcmVxKHN0cnVjdCBycGNfdGFzayAqdGFzaywKLQkgICAgIGt4ZHJwcm9jX3QgZW5jb2RlLCB2b2lkICpycXN0cCwgX19iZTMyICpwLCB2b2lkICpvYmopCisJICAgICBreGRyZXByb2NfdCBlbmNvZGUsIHZvaWQgKnJxc3RwLCBfX2JlMzIgKnAsIHZvaWQgKm9iaikKIHsKIAlzdHJ1Y3QgcnBjX2NyZWQgKmNyZWQgPSB0YXNrLT50a19ycXN0cC0+cnFfY3JlZDsKIAlzdHJ1Y3QgZ3NzX2NyZWQJKmdzc19jcmVkID0gY29udGFpbmVyX29mKGNyZWQsIHN0cnVjdCBnc3NfY3JlZCwKQEAgLTE0MDcsMTIgKzE0MTQsMTQgQEAKIAkJLyogVGhlIHNwZWMgc2VlbXMgYSBsaXR0bGUgYW1iaWd1b3VzIGhlcmUsIGJ1dCBJIHRoaW5rIHRoYXQgbm90CiAJCSAqIHdyYXBwaW5nIGNvbnRleHQgZGVzdHJ1Y3Rpb24gcmVxdWVzdHMgbWFrZXMgdGhlIG1vc3Qgc2Vuc2UuCiAJCSAqLwotCQlzdGF0dXMgPSBlbmNvZGUocnFzdHAsIHAsIG9iaik7CisJCWdzc193cmFwX3JlcV9lbmNvZGUoZW5jb2RlLCBycXN0cCwgcCwgb2JqKTsKKwkJc3RhdHVzID0gMDsKIAkJZ290byBvdXQ7CiAJfQogCXN3aXRjaCAoZ3NzX2NyZWQtPmdjX3NlcnZpY2UpIHsKIAkJY2FzZSBSUENfR1NTX1NWQ19OT05FOgotCQkJc3RhdHVzID0gZW5jb2RlKHJxc3RwLCBwLCBvYmopOworCQkJZ3NzX3dyYXBfcmVxX2VuY29kZShlbmNvZGUsIHJxc3RwLCBwLCBvYmopOworCQkJc3RhdHVzID0gMDsKIAkJCWJyZWFrOwogCQljYXNlIFJQQ19HU1NfU1ZDX0lOVEVHUklUWToKIAkJCXN0YXR1cyA9IGdzc193cmFwX3JlcV9pbnRlZyhjcmVkLCBjdHgsIGVuY29kZSwKQEAgLTE0OTQsMTAgKzE1MDMsMTkgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludAorZ3NzX3Vud3JhcF9yZXFfZGVjb2RlKGt4ZHJkcHJvY190IGRlY29kZSwgc3RydWN0IHJwY19ycXN0ICpycXN0cCwKKwkJICAgICAgX19iZTMyICpwLCB2b2lkICpvYmopCit7CisJc3RydWN0IHhkcl9zdHJlYW0geGRyOworCisJeGRyX2luaXRfZGVjb2RlKCZ4ZHIsICZycXN0cC0+cnFfcmN2X2J1ZiwgcCk7CisJcmV0dXJuIGRlY29kZShycXN0cCwgJnhkciwgb2JqKTsKK30KIAogc3RhdGljIGludAogZ3NzX3Vud3JhcF9yZXNwKHN0cnVjdCBycGNfdGFzayAqdGFzaywKLQkJa3hkcnByb2NfdCBkZWNvZGUsIHZvaWQgKnJxc3RwLCBfX2JlMzIgKnAsIHZvaWQgKm9iaikKKwkJa3hkcmRwcm9jX3QgZGVjb2RlLCB2b2lkICpycXN0cCwgX19iZTMyICpwLCB2b2lkICpvYmopCiB7CiAJc3RydWN0IHJwY19jcmVkICpjcmVkID0gdGFzay0+dGtfcnFzdHAtPnJxX2NyZWQ7CiAJc3RydWN0IGdzc19jcmVkICpnc3NfY3JlZCA9IGNvbnRhaW5lcl9vZihjcmVkLCBzdHJ1Y3QgZ3NzX2NyZWQsCkBAIC0xNTI4LDcgKzE1NDYsNyBAQAogCWNyZWQtPmNyX2F1dGgtPmF1X3JzbGFjayA9IGNyZWQtPmNyX2F1dGgtPmF1X3ZlcmZzaXplICsgKHAgLSBzYXZlZHApCiAJCQkJCQkrIChzYXZlZGxlbiAtIGhlYWQtPmlvdl9sZW4pOwogb3V0X2RlY29kZToKLQlzdGF0dXMgPSBkZWNvZGUocnFzdHAsIHAsIG9iaik7CisJc3RhdHVzID0gZ3NzX3Vud3JhcF9yZXFfZGVjb2RlKGRlY29kZSwgcnFzdHAsIHAsIG9iaik7CiBvdXQ6CiAJZ3NzX3B1dF9jdHgoY3R4KTsKIAlkcHJpbnRrKCJSUEM6ICU1dSBnc3NfdW53cmFwX3Jlc3AgcmV0dXJuaW5nICVkXG4iLCB0YXNrLT50a19waWQsCmRpZmYgLS1naXQgYS9uZXQvc3VucnBjL2JjX3N2Yy5jIGIvbmV0L3N1bnJwYy9iY19zdmMuYwppbmRleCA3ZGNmZTBjLi4xZGQxYTY4IDEwMDY0NAotLS0gYS9uZXQvc3VucnBjL2JjX3N2Yy5jCisrKyBiL25ldC9zdW5ycGMvYmNfc3ZjLmMKQEAgLTU5LDggKzU5LDggQEAKIAkJcmV0ID0gdGFzay0+dGtfc3RhdHVzOwogCQlycGNfcHV0X3Rhc2sodGFzayk7CiAJfQotCXJldHVybiByZXQ7CiAJZHByaW50aygiUlBDOiAgICAgICBiY19zZW5kIHJldD0gJWRcbiIsIHJldCk7CisJcmV0dXJuIHJldDsKIH0KIAogI2VuZGlmIC8qIENPTkZJR19ORlNfVjRfMSAqLwpkaWZmIC0tZ2l0IGEvbmV0L3N1bnJwYy9jbG50LmMgYi9uZXQvc3VucnBjL2NsbnQuYwppbmRleCA5MmNlOTRmLi41N2QzNDRjIDEwMDY0NAotLS0gYS9uZXQvc3VucnBjL2NsbnQuYworKysgYi9uZXQvc3VucnBjL2NsbnQuYwpAQCAtMTA5NSw3ICsxMDk1LDcgQEAKIHJwY194ZHJfZW5jb2RlKHN0cnVjdCBycGNfdGFzayAqdGFzaykKIHsKIAlzdHJ1Y3QgcnBjX3Jxc3QJKnJlcSA9IHRhc2stPnRrX3Jxc3RwOwotCWt4ZHJwcm9jX3QJZW5jb2RlOworCWt4ZHJlcHJvY190CWVuY29kZTsKIAlfX2JlMzIJCSpwOwogCiAJZHByaW50X3N0YXR1cyh0YXNrKTsKQEAgLTE1MzUsNyArMTUzNSw3IEBACiB7CiAJc3RydWN0IHJwY19jbG50CSpjbG50ID0gdGFzay0+dGtfY2xpZW50OwogCXN0cnVjdCBycGNfcnFzdAkqcmVxID0gdGFzay0+dGtfcnFzdHA7Ci0Ja3hkcnByb2NfdAlkZWNvZGUgPSB0YXNrLT50a19tc2cucnBjX3Byb2MtPnBfZGVjb2RlOworCWt4ZHJkcHJvY190CWRlY29kZSA9IHRhc2stPnRrX21zZy5ycGNfcHJvYy0+cF9kZWNvZGU7CiAJX19iZTMyCQkqcDsKIAogCWRwcmludGsoIlJQQzogJTV1IGNhbGxfZGVjb2RlIChzdGF0dXMgJWQpXG4iLApAQCAtMTc3NiwxMiArMTc3NiwxMSBAQAogCWdvdG8gb3V0X2dhcmJhZ2U7CiB9CiAKLXN0YXRpYyBpbnQgcnBjcHJvY19lbmNvZGVfbnVsbCh2b2lkICpycXN0cCwgX19iZTMyICpkYXRhLCB2b2lkICpvYmopCitzdGF0aWMgdm9pZCBycGNwcm9jX2VuY29kZV9udWxsKHZvaWQgKnJxc3RwLCBzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCB2b2lkICpvYmopCiB7Ci0JcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgcnBjcHJvY19kZWNvZGVfbnVsbCh2b2lkICpycXN0cCwgX19iZTMyICpkYXRhLCB2b2lkICpvYmopCitzdGF0aWMgaW50IHJwY3Byb2NfZGVjb2RlX251bGwodm9pZCAqcnFzdHAsIHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHZvaWQgKm9iaikKIHsKIAlyZXR1cm4gMDsKIH0KQEAgLTE4MzAsMjMgKzE4MjksMTUgQEAKIAkJCSAgY29uc3Qgc3RydWN0IHJwY190YXNrICp0YXNrKQogewogCWNvbnN0IGNoYXIgKnJwY193YWl0cSA9ICJub25lIjsKLQljaGFyICpwLCBhY3Rpb25bS1NZTV9TWU1CT0xfTEVOXTsKIAogCWlmIChSUENfSVNfUVVFVUVEKHRhc2spKQogCQlycGNfd2FpdHEgPSBycGNfcW5hbWUodGFzay0+dGtfd2FpdHF1ZXVlKTsKIAotCS8qIG1hcCB0a19hY3Rpb24gcG9pbnRlciB0byBhIGZ1bmN0aW9uIG5hbWU7IHRoZW4gdHJpbSBvZmYKLQkgKiB0aGUgIisweDAgW3N1bnJwY10iICovCi0Jc3ByaW50X3N5bWJvbChhY3Rpb24sICh1bnNpZ25lZCBsb25nKXRhc2stPnRrX2FjdGlvbik7Ci0JcCA9IHN0cmNocihhY3Rpb24sICcrJyk7Ci0JaWYgKHApCi0JCSpwID0gJ1wwJzsKLQotCXByaW50ayhLRVJOX0lORk8gIiU1dSAlMDR4ICU2ZCAlOHAgJThwICU4bGQgJThwICVzdiV1ICVzIGE6JXMgcTolc1xuIiwKKwlwcmludGsoS0VSTl9JTkZPICIlNXUgJTA0eCAlNmQgJThwICU4cCAlOGxkICU4cCAlc3YldSAlcyBhOiVwcyBxOiVzXG4iLAogCQl0YXNrLT50a19waWQsIHRhc2stPnRrX2ZsYWdzLCB0YXNrLT50a19zdGF0dXMsCiAJCWNsbnQsIHRhc2stPnRrX3Jxc3RwLCB0YXNrLT50a190aW1lb3V0LCB0YXNrLT50a19vcHMsCiAJCWNsbnQtPmNsX3Byb3RuYW1lLCBjbG50LT5jbF92ZXJzLCBycGNfcHJvY19uYW1lKHRhc2spLAotCQlhY3Rpb24sIHJwY193YWl0cSk7CisJCXRhc2stPnRrX2FjdGlvbiwgcnBjX3dhaXRxKTsKIH0KIAogdm9pZCBycGNfc2hvd190YXNrcyh2b2lkKQpkaWZmIC0tZ2l0IGEvbmV0L3N1bnJwYy9ycGNfcGlwZS5jIGIvbmV0L3N1bnJwYy9ycGNfcGlwZS5jCmluZGV4IDA5ZjAxZjQuLjcyYmM1MzYgMTAwNjQ0Ci0tLSBhL25ldC9zdW5ycGMvcnBjX3BpcGUuYworKysgYi9uZXQvc3VucnBjL3JwY19waXBlLmMKQEAgLTQ3NCw3ICs0NzQsNyBAQAogewogCXN0cnVjdCBpbm9kZSAqaW5vZGU7CiAKLQlCVUdfT04oIWRfdW5oYXNoZWQoZGVudHJ5KSk7CisJZF9kcm9wKGRlbnRyeSk7CiAJaW5vZGUgPSBycGNfZ2V0X2lub2RlKGRpci0+aV9zYiwgbW9kZSk7CiAJaWYgKCFpbm9kZSkKIAkJZ290byBvdXRfZXJyOwpkaWZmIC0tZ2l0IGEvbmV0L3N1bnJwYy9ycGNiX2NsbnQuYyBiL25ldC9zdW5ycGMvcnBjYl9jbG50LmMKaW5kZXggZmE2ZDdjYS4uYzY1MmU0YyAxMDA2NDQKLS0tIGEvbmV0L3N1bnJwYy9ycGNiX2NsbnQuYworKysgYi9uZXQvc3VucnBjL3JwY2JfY2xudC5jCkBAIC01NywxMCArNTcsNiBAQAogCVJQQ0JQUk9DX0dFVFNUQVQsCiB9OwogCi0jZGVmaW5lIFJQQ0JfSElHSFBST0NfMgkJUlBDQlBST0NfQ0FMTElUCi0jZGVmaW5lIFJQQ0JfSElHSFBST0NfMwkJUlBDQlBST0NfVEFERFIyVUFERFIKLSNkZWZpbmUgUlBDQl9ISUdIUFJPQ180CQlSUENCUFJPQ19HRVRTVEFUCi0KIC8qCiAgKiByX293bmVyCiAgKgpAQCAtNjkzLDQ2ICs2ODksMzcgQEAKICAqIFhEUiBmdW5jdGlvbnMgZm9yIHJwY2JpbmQKICAqLwogCi1zdGF0aWMgaW50IHJwY2JfZW5jX21hcHBpbmcoc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwKLQkJCSAgICBjb25zdCBzdHJ1Y3QgcnBjYmluZF9hcmdzICpycGNiKQorc3RhdGljIHZvaWQgcnBjYl9lbmNfbWFwcGluZyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKKwkJCSAgICAgY29uc3Qgc3RydWN0IHJwY2JpbmRfYXJncyAqcnBjYikKIHsKIAlzdHJ1Y3QgcnBjX3Rhc2sgKnRhc2sgPSByZXEtPnJxX3Rhc2s7Ci0Jc3RydWN0IHhkcl9zdHJlYW0geGRyOworCV9fYmUzMiAqcDsKIAogCWRwcmludGsoIlJQQzogJTV1IGVuY29kaW5nIFBNQVBfJXMgY2FsbCAoJXUsICV1LCAlZCwgJXUpXG4iLAogCQkJdGFzay0+dGtfcGlkLCB0YXNrLT50a19tc2cucnBjX3Byb2MtPnBfbmFtZSwKIAkJCXJwY2ItPnJfcHJvZywgcnBjYi0+cl92ZXJzLCBycGNiLT5yX3Byb3QsIHJwY2ItPnJfcG9ydCk7CiAKLQl4ZHJfaW5pdF9lbmNvZGUoJnhkciwgJnJlcS0+cnFfc25kX2J1ZiwgcCk7Ci0KLQlwID0geGRyX3Jlc2VydmVfc3BhY2UoJnhkciwgc2l6ZW9mKF9fYmUzMikgKiBSUENCX21hcHBpbmdhcmdzX3N6KTsKLQlpZiAodW5saWtlbHkocCA9PSBOVUxMKSkKLQkJcmV0dXJuIC1FSU87Ci0KLQkqcCsrID0gaHRvbmwocnBjYi0+cl9wcm9nKTsKLQkqcCsrID0gaHRvbmwocnBjYi0+cl92ZXJzKTsKLQkqcCsrID0gaHRvbmwocnBjYi0+cl9wcm90KTsKLQkqcCAgID0gaHRvbmwocnBjYi0+cl9wb3J0KTsKLQotCXJldHVybiAwOworCXAgPSB4ZHJfcmVzZXJ2ZV9zcGFjZSh4ZHIsIFJQQ0JfbWFwcGluZ2FyZ3Nfc3ogPDwgMik7CisJKnArKyA9IGNwdV90b19iZTMyKHJwY2ItPnJfcHJvZyk7CisJKnArKyA9IGNwdV90b19iZTMyKHJwY2ItPnJfdmVycyk7CisJKnArKyA9IGNwdV90b19iZTMyKHJwY2ItPnJfcHJvdCk7CisJKnAgICA9IGNwdV90b19iZTMyKHJwY2ItPnJfcG9ydCk7CiB9CiAKLXN0YXRpYyBpbnQgcnBjYl9kZWNfZ2V0cG9ydChzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLAorc3RhdGljIGludCBycGNiX2RlY19nZXRwb3J0KHN0cnVjdCBycGNfcnFzdCAqcmVxLCBzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAogCQkJICAgIHN0cnVjdCBycGNiaW5kX2FyZ3MgKnJwY2IpCiB7CiAJc3RydWN0IHJwY190YXNrICp0YXNrID0gcmVxLT5ycV90YXNrOwotCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKIAl1bnNpZ25lZCBsb25nIHBvcnQ7Ci0KLQl4ZHJfaW5pdF9kZWNvZGUoJnhkciwgJnJlcS0+cnFfcmN2X2J1ZiwgcCk7CisJX19iZTMyICpwOwogCiAJcnBjYi0+cl9wb3J0ID0gMDsKIAotCXAgPSB4ZHJfaW5saW5lX2RlY29kZSgmeGRyLCBzaXplb2YoX19iZTMyKSk7CisJcCA9IHhkcl9pbmxpbmVfZGVjb2RlKHhkciwgNCk7CiAJaWYgKHVubGlrZWx5KHAgPT0gTlVMTCkpCiAJCXJldHVybiAtRUlPOwogCi0JcG9ydCA9IG50b2hsKCpwKTsKKwlwb3J0ID0gYmUzMl90b19jcHVwKHApOwogCWRwcmludGsoIlJQQzogJTV1IFBNQVBfJXMgcmVzdWx0OiAlbHVcbiIsIHRhc2stPnRrX3BpZCwKIAkJCXRhc2stPnRrX21zZy5ycGNfcHJvYy0+cF9uYW1lLCBwb3J0KTsKIAlpZiAodW5saWtlbHkocG9ydCA+IFVTSFJUX01BWCkpCkBAIC03NDIsMjAgKzcyOSwxOCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHJwY2JfZGVjX3NldChzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLAorc3RhdGljIGludCBycGNiX2RlY19zZXQoc3RydWN0IHJwY19ycXN0ICpyZXEsIHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCiAJCQl1bnNpZ25lZCBpbnQgKmJvb2xwKQogewogCXN0cnVjdCBycGNfdGFzayAqdGFzayA9IHJlcS0+cnFfdGFzazsKLQlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CisJX19iZTMyICpwOwogCi0JeGRyX2luaXRfZGVjb2RlKCZ4ZHIsICZyZXEtPnJxX3Jjdl9idWYsIHApOwotCi0JcCA9IHhkcl9pbmxpbmVfZGVjb2RlKCZ4ZHIsIHNpemVvZihfX2JlMzIpKTsKKwlwID0geGRyX2lubGluZV9kZWNvZGUoeGRyLCA0KTsKIAlpZiAodW5saWtlbHkocCA9PSBOVUxMKSkKIAkJcmV0dXJuIC1FSU87CiAKIAkqYm9vbHAgPSAwOwotCWlmICgqcCkKKwlpZiAoKnAgIT0geGRyX3plcm8pCiAJCSpib29scCA9IDE7CiAKIAlkcHJpbnRrKCJSUEM6ICU1dSBSUENCXyVzIGNhbGwgJXNcbiIsCkBAIC03NjQsNzMgKzc0OSw1MyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGVuY29kZV9ycGNiX3N0cmluZyhzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBjb25zdCBjaGFyICpzdHJpbmcsCi0JCQkJY29uc3QgdTMyIG1heHN0cmxlbikKK3N0YXRpYyB2b2lkIGVuY29kZV9ycGNiX3N0cmluZyhzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBjb25zdCBjaGFyICpzdHJpbmcsCisJCQkgICAgICAgY29uc3QgdTMyIG1heHN0cmxlbikKIHsKLQl1MzIgbGVuOwogCV9fYmUzMiAqcDsKKwl1MzIgbGVuOwogCi0JaWYgKHVubGlrZWx5KHN0cmluZyA9PSBOVUxMKSkKLQkJcmV0dXJuIC1FSU87CiAJbGVuID0gc3RybGVuKHN0cmluZyk7Ci0JaWYgKHVubGlrZWx5KGxlbiA+IG1heHN0cmxlbikpCi0JCXJldHVybiAtRUlPOwotCi0JcCA9IHhkcl9yZXNlcnZlX3NwYWNlKHhkciwgc2l6ZW9mKF9fYmUzMikgKyBsZW4pOwotCWlmICh1bmxpa2VseShwID09IE5VTEwpKQotCQlyZXR1cm4gLUVJTzsKKwlCVUdfT04obGVuID4gbWF4c3RybGVuKTsKKwlwID0geGRyX3Jlc2VydmVfc3BhY2UoeGRyLCA0ICsgbGVuKTsKIAl4ZHJfZW5jb2RlX29wYXF1ZShwLCBzdHJpbmcsIGxlbik7Ci0KLQlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBycGNiX2VuY19nZXRhZGRyKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsCi0JCQkgICAgY29uc3Qgc3RydWN0IHJwY2JpbmRfYXJncyAqcnBjYikKK3N0YXRpYyB2b2lkIHJwY2JfZW5jX2dldGFkZHIoc3RydWN0IHJwY19ycXN0ICpyZXEsIHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCisJCQkgICAgIGNvbnN0IHN0cnVjdCBycGNiaW5kX2FyZ3MgKnJwY2IpCiB7CiAJc3RydWN0IHJwY190YXNrICp0YXNrID0gcmVxLT5ycV90YXNrOwotCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKKwlfX2JlMzIgKnA7CiAKIAlkcHJpbnRrKCJSUEM6ICU1dSBlbmNvZGluZyBSUENCXyVzIGNhbGwgKCV1LCAldSwgJyVzJywgJyVzJylcbiIsCiAJCQl0YXNrLT50a19waWQsIHRhc2stPnRrX21zZy5ycGNfcHJvYy0+cF9uYW1lLAogCQkJcnBjYi0+cl9wcm9nLCBycGNiLT5yX3ZlcnMsCiAJCQlycGNiLT5yX25ldGlkLCBycGNiLT5yX2FkZHIpOwogCi0JeGRyX2luaXRfZW5jb2RlKCZ4ZHIsICZyZXEtPnJxX3NuZF9idWYsIHApOworCXAgPSB4ZHJfcmVzZXJ2ZV9zcGFjZSh4ZHIsIChSUENCX3Byb2dyYW1fc3ogKyBSUENCX3ZlcnNpb25fc3opIDw8IDIpOworCSpwKysgPSBjcHVfdG9fYmUzMihycGNiLT5yX3Byb2cpOworCSpwID0gY3B1X3RvX2JlMzIocnBjYi0+cl92ZXJzKTsKIAotCXAgPSB4ZHJfcmVzZXJ2ZV9zcGFjZSgmeGRyLAotCQkJc2l6ZW9mKF9fYmUzMikgKiAoUlBDQl9wcm9ncmFtX3N6ICsgUlBDQl92ZXJzaW9uX3N6KSk7Ci0JaWYgKHVubGlrZWx5KHAgPT0gTlVMTCkpCi0JCXJldHVybiAtRUlPOwotCSpwKysgPSBodG9ubChycGNiLT5yX3Byb2cpOwotCSpwID0gaHRvbmwocnBjYi0+cl92ZXJzKTsKLQotCWlmIChlbmNvZGVfcnBjYl9zdHJpbmcoJnhkciwgcnBjYi0+cl9uZXRpZCwgUlBDQklORF9NQVhORVRJRExFTikpCi0JCXJldHVybiAtRUlPOwotCWlmIChlbmNvZGVfcnBjYl9zdHJpbmcoJnhkciwgcnBjYi0+cl9hZGRyLCBSUENCSU5EX01BWFVBRERSTEVOKSkKLQkJcmV0dXJuIC1FSU87Ci0JaWYgKGVuY29kZV9ycGNiX3N0cmluZygmeGRyLCBycGNiLT5yX293bmVyLCBSUENCX01BWE9XTkVSTEVOKSkKLQkJcmV0dXJuIC1FSU87Ci0KLQlyZXR1cm4gMDsKKwllbmNvZGVfcnBjYl9zdHJpbmcoeGRyLCBycGNiLT5yX25ldGlkLCBSUENCSU5EX01BWE5FVElETEVOKTsKKwllbmNvZGVfcnBjYl9zdHJpbmcoeGRyLCBycGNiLT5yX2FkZHIsIFJQQ0JJTkRfTUFYVUFERFJMRU4pOworCWVuY29kZV9ycGNiX3N0cmluZyh4ZHIsIHJwY2ItPnJfb3duZXIsIFJQQ0JfTUFYT1dORVJMRU4pOwogfQogCi1zdGF0aWMgaW50IHJwY2JfZGVjX2dldGFkZHIoc3RydWN0IHJwY19ycXN0ICpyZXEsIF9fYmUzMiAqcCwKK3N0YXRpYyBpbnQgcnBjYl9kZWNfZ2V0YWRkcihzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKIAkJCSAgICBzdHJ1Y3QgcnBjYmluZF9hcmdzICpycGNiKQogewogCXN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIGFkZHJlc3M7CiAJc3RydWN0IHNvY2thZGRyICpzYXAgPSAoc3RydWN0IHNvY2thZGRyICopJmFkZHJlc3M7CiAJc3RydWN0IHJwY190YXNrICp0YXNrID0gcmVxLT5ycV90YXNrOwotCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKKwlfX2JlMzIgKnA7CiAJdTMyIGxlbjsKIAogCXJwY2ItPnJfcG9ydCA9IDA7CiAKLQl4ZHJfaW5pdF9kZWNvZGUoJnhkciwgJnJlcS0+cnFfcmN2X2J1ZiwgcCk7Ci0KLQlwID0geGRyX2lubGluZV9kZWNvZGUoJnhkciwgc2l6ZW9mKF9fYmUzMikpOworCXAgPSB4ZHJfaW5saW5lX2RlY29kZSh4ZHIsIDQpOwogCWlmICh1bmxpa2VseShwID09IE5VTEwpKQogCQlnb3RvIG91dF9mYWlsOwotCWxlbiA9IG50b2hsKCpwKTsKKwlsZW4gPSBiZTMyX3RvX2NwdXAocCk7CiAKIAkvKgogCSAqIElmIHRoZSByZXR1cm5lZCB1bml2ZXJzYWwgYWRkcmVzcyBpcyBhIG51bGwgc3RyaW5nLApAQCAtODQ1LDcgKzgxMCw3IEBACiAJaWYgKHVubGlrZWx5KGxlbiA+IFJQQ0JJTkRfTUFYVUFERFJMRU4pKQogCQlnb3RvIG91dF9mYWlsOwogCi0JcCA9IHhkcl9pbmxpbmVfZGVjb2RlKCZ4ZHIsIGxlbik7CisJcCA9IHhkcl9pbmxpbmVfZGVjb2RlKHhkciwgbGVuKTsKIAlpZiAodW5saWtlbHkocCA9PSBOVUxMKSkKIAkJZ290byBvdXRfZmFpbDsKIAlkcHJpbnRrKCJSUEM6ICU1dSBSUENCXyVzIHJlcGx5OiAlc1xuIiwgdGFzay0+dGtfcGlkLApAQCAtODcxLDggKzgzNiw4IEBACiBzdGF0aWMgc3RydWN0IHJwY19wcm9jaW5mbyBycGNiX3Byb2NlZHVyZXMyW10gPSB7CiAJW1JQQ0JQUk9DX1NFVF0gPSB7CiAJCS5wX3Byb2MJCT0gUlBDQlBST0NfU0VULAotCQkucF9lbmNvZGUJPSAoa3hkcnByb2NfdClycGNiX2VuY19tYXBwaW5nLAotCQkucF9kZWNvZGUJPSAoa3hkcnByb2NfdClycGNiX2RlY19zZXQsCisJCS5wX2VuY29kZQk9IChreGRyZXByb2NfdClycGNiX2VuY19tYXBwaW5nLAorCQkucF9kZWNvZGUJPSAoa3hkcmRwcm9jX3QpcnBjYl9kZWNfc2V0LAogCQkucF9hcmdsZW4JPSBSUENCX21hcHBpbmdhcmdzX3N6LAogCQkucF9yZXBsZW4JPSBSUENCX3NldHJlc19zeiwKIAkJLnBfc3RhdGlkeAk9IFJQQ0JQUk9DX1NFVCwKQEAgLTg4MSw4ICs4NDYsOCBAQAogCX0sCiAJW1JQQ0JQUk9DX1VOU0VUXSA9IHsKIAkJLnBfcHJvYwkJPSBSUENCUFJPQ19VTlNFVCwKLQkJLnBfZW5jb2RlCT0gKGt4ZHJwcm9jX3QpcnBjYl9lbmNfbWFwcGluZywKLQkJLnBfZGVjb2RlCT0gKGt4ZHJwcm9jX3QpcnBjYl9kZWNfc2V0LAorCQkucF9lbmNvZGUJPSAoa3hkcmVwcm9jX3QpcnBjYl9lbmNfbWFwcGluZywKKwkJLnBfZGVjb2RlCT0gKGt4ZHJkcHJvY190KXJwY2JfZGVjX3NldCwKIAkJLnBfYXJnbGVuCT0gUlBDQl9tYXBwaW5nYXJnc19zeiwKIAkJLnBfcmVwbGVuCT0gUlBDQl9zZXRyZXNfc3osCiAJCS5wX3N0YXRpZHgJPSBSUENCUFJPQ19VTlNFVCwKQEAgLTg5MSw4ICs4NTYsOCBAQAogCX0sCiAJW1JQQ0JQUk9DX0dFVFBPUlRdID0gewogCQkucF9wcm9jCQk9IFJQQ0JQUk9DX0dFVFBPUlQsCi0JCS5wX2VuY29kZQk9IChreGRycHJvY190KXJwY2JfZW5jX21hcHBpbmcsCi0JCS5wX2RlY29kZQk9IChreGRycHJvY190KXJwY2JfZGVjX2dldHBvcnQsCisJCS5wX2VuY29kZQk9IChreGRyZXByb2NfdClycGNiX2VuY19tYXBwaW5nLAorCQkucF9kZWNvZGUJPSAoa3hkcmRwcm9jX3QpcnBjYl9kZWNfZ2V0cG9ydCwKIAkJLnBfYXJnbGVuCT0gUlBDQl9tYXBwaW5nYXJnc19zeiwKIAkJLnBfcmVwbGVuCT0gUlBDQl9nZXRwb3J0cmVzX3N6LAogCQkucF9zdGF0aWR4CT0gUlBDQlBST0NfR0VUUE9SVCwKQEAgLTkwNCw4ICs4NjksOCBAQAogc3RhdGljIHN0cnVjdCBycGNfcHJvY2luZm8gcnBjYl9wcm9jZWR1cmVzM1tdID0gewogCVtSUENCUFJPQ19TRVRdID0gewogCQkucF9wcm9jCQk9IFJQQ0JQUk9DX1NFVCwKLQkJLnBfZW5jb2RlCT0gKGt4ZHJwcm9jX3QpcnBjYl9lbmNfZ2V0YWRkciwKLQkJLnBfZGVjb2RlCT0gKGt4ZHJwcm9jX3QpcnBjYl9kZWNfc2V0LAorCQkucF9lbmNvZGUJPSAoa3hkcmVwcm9jX3QpcnBjYl9lbmNfZ2V0YWRkciwKKwkJLnBfZGVjb2RlCT0gKGt4ZHJkcHJvY190KXJwY2JfZGVjX3NldCwKIAkJLnBfYXJnbGVuCT0gUlBDQl9nZXRhZGRyYXJnc19zeiwKIAkJLnBfcmVwbGVuCT0gUlBDQl9zZXRyZXNfc3osCiAJCS5wX3N0YXRpZHgJPSBSUENCUFJPQ19TRVQsCkBAIC05MTQsOCArODc5LDggQEAKIAl9LAogCVtSUENCUFJPQ19VTlNFVF0gPSB7CiAJCS5wX3Byb2MJCT0gUlBDQlBST0NfVU5TRVQsCi0JCS5wX2VuY29kZQk9IChreGRycHJvY190KXJwY2JfZW5jX2dldGFkZHIsCi0JCS5wX2RlY29kZQk9IChreGRycHJvY190KXJwY2JfZGVjX3NldCwKKwkJLnBfZW5jb2RlCT0gKGt4ZHJlcHJvY190KXJwY2JfZW5jX2dldGFkZHIsCisJCS5wX2RlY29kZQk9IChreGRyZHByb2NfdClycGNiX2RlY19zZXQsCiAJCS5wX2FyZ2xlbgk9IFJQQ0JfZ2V0YWRkcmFyZ3Nfc3osCiAJCS5wX3JlcGxlbgk9IFJQQ0Jfc2V0cmVzX3N6LAogCQkucF9zdGF0aWR4CT0gUlBDQlBST0NfVU5TRVQsCkBAIC05MjQsOCArODg5LDggQEAKIAl9LAogCVtSUENCUFJPQ19HRVRBRERSXSA9IHsKIAkJLnBfcHJvYwkJPSBSUENCUFJPQ19HRVRBRERSLAotCQkucF9lbmNvZGUJPSAoa3hkcnByb2NfdClycGNiX2VuY19nZXRhZGRyLAotCQkucF9kZWNvZGUJPSAoa3hkcnByb2NfdClycGNiX2RlY19nZXRhZGRyLAorCQkucF9lbmNvZGUJPSAoa3hkcmVwcm9jX3QpcnBjYl9lbmNfZ2V0YWRkciwKKwkJLnBfZGVjb2RlCT0gKGt4ZHJkcHJvY190KXJwY2JfZGVjX2dldGFkZHIsCiAJCS5wX2FyZ2xlbgk9IFJQQ0JfZ2V0YWRkcmFyZ3Nfc3osCiAJCS5wX3JlcGxlbgk9IFJQQ0JfZ2V0YWRkcnJlc19zeiwKIAkJLnBfc3RhdGlkeAk9IFJQQ0JQUk9DX0dFVEFERFIsCkBAIC05MzcsOCArOTAyLDggQEAKIHN0YXRpYyBzdHJ1Y3QgcnBjX3Byb2NpbmZvIHJwY2JfcHJvY2VkdXJlczRbXSA9IHsKIAlbUlBDQlBST0NfU0VUXSA9IHsKIAkJLnBfcHJvYwkJPSBSUENCUFJPQ19TRVQsCi0JCS5wX2VuY29kZQk9IChreGRycHJvY190KXJwY2JfZW5jX2dldGFkZHIsCi0JCS5wX2RlY29kZQk9IChreGRycHJvY190KXJwY2JfZGVjX3NldCwKKwkJLnBfZW5jb2RlCT0gKGt4ZHJlcHJvY190KXJwY2JfZW5jX2dldGFkZHIsCisJCS5wX2RlY29kZQk9IChreGRyZHByb2NfdClycGNiX2RlY19zZXQsCiAJCS5wX2FyZ2xlbgk9IFJQQ0JfZ2V0YWRkcmFyZ3Nfc3osCiAJCS5wX3JlcGxlbgk9IFJQQ0Jfc2V0cmVzX3N6LAogCQkucF9zdGF0aWR4CT0gUlBDQlBST0NfU0VULApAQCAtOTQ3LDggKzkxMiw4IEBACiAJfSwKIAlbUlBDQlBST0NfVU5TRVRdID0gewogCQkucF9wcm9jCQk9IFJQQ0JQUk9DX1VOU0VULAotCQkucF9lbmNvZGUJPSAoa3hkcnByb2NfdClycGNiX2VuY19nZXRhZGRyLAotCQkucF9kZWNvZGUJPSAoa3hkcnByb2NfdClycGNiX2RlY19zZXQsCisJCS5wX2VuY29kZQk9IChreGRyZXByb2NfdClycGNiX2VuY19nZXRhZGRyLAorCQkucF9kZWNvZGUJPSAoa3hkcmRwcm9jX3QpcnBjYl9kZWNfc2V0LAogCQkucF9hcmdsZW4JPSBSUENCX2dldGFkZHJhcmdzX3N6LAogCQkucF9yZXBsZW4JPSBSUENCX3NldHJlc19zeiwKIAkJLnBfc3RhdGlkeAk9IFJQQ0JQUk9DX1VOU0VULApAQCAtOTU3LDggKzkyMiw4IEBACiAJfSwKIAlbUlBDQlBST0NfR0VUQUREUl0gPSB7CiAJCS5wX3Byb2MJCT0gUlBDQlBST0NfR0VUQUREUiwKLQkJLnBfZW5jb2RlCT0gKGt4ZHJwcm9jX3QpcnBjYl9lbmNfZ2V0YWRkciwKLQkJLnBfZGVjb2RlCT0gKGt4ZHJwcm9jX3QpcnBjYl9kZWNfZ2V0YWRkciwKKwkJLnBfZW5jb2RlCT0gKGt4ZHJlcHJvY190KXJwY2JfZW5jX2dldGFkZHIsCisJCS5wX2RlY29kZQk9IChreGRyZHByb2NfdClycGNiX2RlY19nZXRhZGRyLAogCQkucF9hcmdsZW4JPSBSUENCX2dldGFkZHJhcmdzX3N6LAogCQkucF9yZXBsZW4JPSBSUENCX2dldGFkZHJyZXNfc3osCiAJCS5wX3N0YXRpZHgJPSBSUENCUFJPQ19HRVRBRERSLApAQCAtOTkzLDE5ICs5NTgsMTkgQEAKIAogc3RhdGljIHN0cnVjdCBycGNfdmVyc2lvbiBycGNiX3ZlcnNpb24yID0gewogCS5udW1iZXIJCT0gUlBDQlZFUlNfMiwKLQkubnJwcm9jcwk9IFJQQ0JfSElHSFBST0NfMiwKKwkubnJwcm9jcwk9IEFSUkFZX1NJWkUocnBjYl9wcm9jZWR1cmVzMiksCiAJLnByb2NzCQk9IHJwY2JfcHJvY2VkdXJlczIKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcnBjX3ZlcnNpb24gcnBjYl92ZXJzaW9uMyA9IHsKIAkubnVtYmVyCQk9IFJQQ0JWRVJTXzMsCi0JLm5ycHJvY3MJPSBSUENCX0hJR0hQUk9DXzMsCisJLm5ycHJvY3MJPSBBUlJBWV9TSVpFKHJwY2JfcHJvY2VkdXJlczMpLAogCS5wcm9jcwkJPSBycGNiX3Byb2NlZHVyZXMzCiB9OwogCiBzdGF0aWMgc3RydWN0IHJwY192ZXJzaW9uIHJwY2JfdmVyc2lvbjQgPSB7CiAJLm51bWJlcgkJPSBSUENCVkVSU180LAotCS5ucnByb2NzCT0gUlBDQl9ISUdIUFJPQ180LAorCS5ucnByb2NzCT0gQVJSQVlfU0laRShycGNiX3Byb2NlZHVyZXM0KSwKIAkucHJvY3MJCT0gcnBjYl9wcm9jZWR1cmVzNAogfTsKIApkaWZmIC0tZ2l0IGEvbmV0L3N1bnJwYy9zdmMuYyBiL25ldC9zdW5ycGMvc3ZjLmMKaW5kZXggNjM1OWM0Mi4uMGU2NTljNiAxMDA2NDQKLS0tIGEvbmV0L3N1bnJwYy9zdmMuYworKysgYi9uZXQvc3VucnBjL3N2Yy5jCkBAIC00ODgsMTAgKzQ4OCw2IEBACiAJaWYgKHN2Y19zZXJ2X2lzX3Bvb2xlZChzZXJ2KSkKIAkJc3ZjX3Bvb2xfbWFwX3B1dCgpOwogCi0jaWYgZGVmaW5lZChDT05GSUdfTkZTX1Y0XzEpCi0Jc3ZjX3NvY2tfZGVzdHJveShzZXJ2LT5iY194cHJ0KTsKLSNlbmRpZiAvKiBDT05GSUdfTkZTX1Y0XzEgKi8KLQogCXN2Y191bnJlZ2lzdGVyKHNlcnYpOwogCWtmcmVlKHNlcnYtPnN2X3Bvb2xzKTsKIAlrZnJlZShzZXJ2KTsKQEAgLTExNDcsNyArMTE0Myw2IEBACiAgZHJvcGl0OgogCXN2Y19hdXRob3Jpc2UocnFzdHApOwkvKiBkb2Vzbid0IGh1cnQgdG8gY2FsbCB0aGlzIHR3aWNlICovCiAJZHByaW50aygic3ZjOiBzdmNfcHJvY2VzcyBkcm9waXRcbiIpOwotCXN2Y19kcm9wKHJxc3RwKTsKIAlyZXR1cm4gMDsKIAogZXJyX3Nob3J0X2xlbjoKQEAgLTEyMTgsNyArMTIxMyw2IEBACiAJc3RydWN0IGt2ZWMJCSpyZXN2ID0gJnJxc3RwLT5ycV9yZXMuaGVhZFswXTsKIAlzdHJ1Y3Qgc3ZjX3NlcnYJCSpzZXJ2ID0gcnFzdHAtPnJxX3NlcnZlcjsKIAl1MzIJCQlkaXI7Ci0JaW50CQkJZXJyb3I7CiAKIAkvKgogCSAqIFNldHVwIHJlc3BvbnNlIHhkcl9idWYuCkBAIC0xMjQ2LDExICsxMjQwLDEzIEBACiAJCXJldHVybiAwOwogCX0KIAotCWVycm9yID0gc3ZjX3Byb2Nlc3NfY29tbW9uKHJxc3RwLCBhcmd2LCByZXN2KTsKLQlpZiAoZXJyb3IgPD0gMCkKLQkJcmV0dXJuIGVycm9yOwotCi0JcmV0dXJuIHN2Y19zZW5kKHJxc3RwKTsKKwkvKiBSZXR1cm5zIDEgZm9yIHNlbmQsIDAgZm9yIGRyb3AgKi8KKwlpZiAoc3ZjX3Byb2Nlc3NfY29tbW9uKHJxc3RwLCBhcmd2LCByZXN2KSkKKwkJcmV0dXJuIHN2Y19zZW5kKHJxc3RwKTsKKwllbHNlIHsKKwkJc3ZjX2Ryb3AocnFzdHApOworCQlyZXR1cm4gMDsKKwl9CiB9CiAKICNpZiBkZWZpbmVkKENPTkZJR19ORlNfVjRfMSkKQEAgLTEyNjQsMTAgKzEyNjAsOSBAQAogewogCXN0cnVjdCBrdmVjCSphcmd2ID0gJnJxc3RwLT5ycV9hcmcuaGVhZFswXTsKIAlzdHJ1Y3Qga3ZlYwkqcmVzdiA9ICZycXN0cC0+cnFfcmVzLmhlYWRbMF07Ci0JaW50IAkJZXJyb3I7CiAKIAkvKiBCdWlsZCB0aGUgc3ZjX3Jxc3QgdXNlZCBieSB0aGUgY29tbW9uIHByb2Nlc3Npbmcgcm91dGluZSAqLwotCXJxc3RwLT5ycV94cHJ0ID0gc2Vydi0+YmNfeHBydDsKKwlycXN0cC0+cnFfeHBydCA9IHNlcnYtPnN2X2JjX3hwcnQ7CiAJcnFzdHAtPnJxX3hpZCA9IHJlcS0+cnFfeGlkOwogCXJxc3RwLT5ycV9wcm90ID0gcmVxLT5ycV94cHJ0LT5wcm90OwogCXJxc3RwLT5ycV9zZXJ2ZXIgPSBzZXJ2OwpAQCAtMTI5MiwxMiArMTI4NywxNSBAQAogCXN2Y19nZXR1MzIoYXJndik7CS8qIFhJRCAqLwogCXN2Y19nZXRubChhcmd2KTsJLyogQ0FMTERJUiAqLwogCi0JZXJyb3IgPSBzdmNfcHJvY2Vzc19jb21tb24ocnFzdHAsIGFyZ3YsIHJlc3YpOwotCWlmIChlcnJvciA8PSAwKQotCQlyZXR1cm4gZXJyb3I7Ci0KLQltZW1jcHkoJnJlcS0+cnFfc25kX2J1ZiwgJnJxc3RwLT5ycV9yZXMsIHNpemVvZihyZXEtPnJxX3NuZF9idWYpKTsKLQlyZXR1cm4gYmNfc2VuZChyZXEpOworCS8qIFJldHVybnMgMSBmb3Igc2VuZCwgMCBmb3IgZHJvcCAqLworCWlmIChzdmNfcHJvY2Vzc19jb21tb24ocnFzdHAsIGFyZ3YsIHJlc3YpKSB7CisJCW1lbWNweSgmcmVxLT5ycV9zbmRfYnVmLCAmcnFzdHAtPnJxX3JlcywKKwkJCQkJCXNpemVvZihyZXEtPnJxX3NuZF9idWYpKTsKKwkJcmV0dXJuIGJjX3NlbmQocmVxKTsKKwl9IGVsc2UgeworCQkvKiBOb3RoaW5nIHRvIGRvIHRvIGRyb3AgcmVxdWVzdCAqLworCQlyZXR1cm4gMDsKKwl9CiB9CiBFWFBPUlRfU1lNQk9MKGJjX3N2Y19wcm9jZXNzKTsKICNlbmRpZiAvKiBDT05GSUdfTkZTX1Y0XzEgKi8KZGlmZiAtLWdpdCBhL25ldC9zdW5ycGMvc3Zjc29jay5jIGIvbmV0L3N1bnJwYy9zdmNzb2NrLmMKaW5kZXggMDc5MTllMS4uZDI2NWFhNyAxMDA2NDQKLS0tIGEvbmV0L3N1bnJwYy9zdmNzb2NrLmMKKysrIGIvbmV0L3N1bnJwYy9zdmNzb2NrLmMKQEAgLTY2LDYgKzY2LDEzIEBACiBzdGF0aWMgc3RydWN0IHN2Y194cHJ0ICpzdmNfY3JlYXRlX3NvY2tldChzdHJ1Y3Qgc3ZjX3NlcnYgKiwgaW50LAogCQkJCQkgIHN0cnVjdCBuZXQgKiwgc3RydWN0IHNvY2thZGRyICosCiAJCQkJCSAgaW50LCBpbnQpOworI2lmIGRlZmluZWQoQ09ORklHX05GU19WNF8xKQorc3RhdGljIHN0cnVjdCBzdmNfeHBydCAqc3ZjX2JjX2NyZWF0ZV9zb2NrZXQoc3RydWN0IHN2Y19zZXJ2ICosIGludCwKKwkJCQkJICAgICBzdHJ1Y3QgbmV0ICosIHN0cnVjdCBzb2NrYWRkciAqLAorCQkJCQkgICAgIGludCwgaW50KTsKK3N0YXRpYyB2b2lkIHN2Y19iY19zb2NrX2ZyZWUoc3RydWN0IHN2Y194cHJ0ICp4cHJ0KTsKKyNlbmRpZiAvKiBDT05GSUdfTkZTX1Y0XzEgKi8KKwogI2lmZGVmIENPTkZJR19ERUJVR19MT0NLX0FMTE9DCiBzdGF0aWMgc3RydWN0IGxvY2tfY2xhc3Nfa2V5IHN2Y19rZXlbMl07CiBzdGF0aWMgc3RydWN0IGxvY2tfY2xhc3Nfa2V5IHN2Y19zbG9ja19rZXlbMl07CkBAIC0xMTg0LDYgKzExOTEsNTcgQEAKIAlyZXR1cm4gc3ZjX2NyZWF0ZV9zb2NrZXQoc2VydiwgSVBQUk9UT19UQ1AsIG5ldCwgc2EsIHNhbGVuLCBmbGFncyk7CiB9CiAKKyNpZiBkZWZpbmVkKENPTkZJR19ORlNfVjRfMSkKK3N0YXRpYyBzdHJ1Y3Qgc3ZjX3hwcnQgKnN2Y19iY19jcmVhdGVfc29ja2V0KHN0cnVjdCBzdmNfc2VydiAqLCBpbnQsCisJCQkJCSAgICAgc3RydWN0IG5ldCAqLCBzdHJ1Y3Qgc29ja2FkZHIgKiwKKwkJCQkJICAgICBpbnQsIGludCk7CitzdGF0aWMgdm9pZCBzdmNfYmNfc29ja19mcmVlKHN0cnVjdCBzdmNfeHBydCAqeHBydCk7CisKK3N0YXRpYyBzdHJ1Y3Qgc3ZjX3hwcnQgKnN2Y19iY190Y3BfY3JlYXRlKHN0cnVjdCBzdmNfc2VydiAqc2VydiwKKwkJCQkgICAgICAgc3RydWN0IG5ldCAqbmV0LAorCQkJCSAgICAgICBzdHJ1Y3Qgc29ja2FkZHIgKnNhLCBpbnQgc2FsZW4sCisJCQkJICAgICAgIGludCBmbGFncykKK3sKKwlyZXR1cm4gc3ZjX2JjX2NyZWF0ZV9zb2NrZXQoc2VydiwgSVBQUk9UT19UQ1AsIG5ldCwgc2EsIHNhbGVuLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIHN2Y19iY190Y3Bfc29ja19kZXRhY2goc3RydWN0IHN2Y194cHJ0ICp4cHJ0KQoreworfQorCitzdGF0aWMgc3RydWN0IHN2Y194cHJ0X29wcyBzdmNfdGNwX2JjX29wcyA9IHsKKwkueHBvX2NyZWF0ZSA9IHN2Y19iY190Y3BfY3JlYXRlLAorCS54cG9fZGV0YWNoID0gc3ZjX2JjX3RjcF9zb2NrX2RldGFjaCwKKwkueHBvX2ZyZWUgPSBzdmNfYmNfc29ja19mcmVlLAorCS54cG9fcHJlcF9yZXBseV9oZHIgPSBzdmNfdGNwX3ByZXBfcmVwbHlfaGRyLAorfTsKKworc3RhdGljIHN0cnVjdCBzdmNfeHBydF9jbGFzcyBzdmNfdGNwX2JjX2NsYXNzID0geworCS54Y2xfbmFtZSA9ICJ0Y3AtYmMiLAorCS54Y2xfb3duZXIgPSBUSElTX01PRFVMRSwKKwkueGNsX29wcyA9ICZzdmNfdGNwX2JjX29wcywKKwkueGNsX21heF9wYXlsb2FkID0gUlBDU1ZDX01BWFBBWUxPQURfVENQLAorfTsKKworc3RhdGljIHZvaWQgc3ZjX2luaXRfYmNfeHBydF9zb2NrKHZvaWQpCit7CisJc3ZjX3JlZ194cHJ0X2NsYXNzKCZzdmNfdGNwX2JjX2NsYXNzKTsKK30KKworc3RhdGljIHZvaWQgc3ZjX2NsZWFudXBfYmNfeHBydF9zb2NrKHZvaWQpCit7CisJc3ZjX3VucmVnX3hwcnRfY2xhc3MoJnN2Y190Y3BfYmNfY2xhc3MpOworfQorI2Vsc2UgLyogQ09ORklHX05GU19WNF8xICovCitzdGF0aWMgdm9pZCBzdmNfaW5pdF9iY194cHJ0X3NvY2sodm9pZCkKK3sKK30KKworc3RhdGljIHZvaWQgc3ZjX2NsZWFudXBfYmNfeHBydF9zb2NrKHZvaWQpCit7Cit9CisjZW5kaWYgLyogQ09ORklHX05GU19WNF8xICovCisKIHN0YXRpYyBzdHJ1Y3Qgc3ZjX3hwcnRfb3BzIHN2Y190Y3Bfb3BzID0gewogCS54cG9fY3JlYXRlID0gc3ZjX3RjcF9jcmVhdGUsCiAJLnhwb19yZWN2ZnJvbSA9IHN2Y190Y3BfcmVjdmZyb20sCkBAIC0xMjA3LDEyICsxMjY1LDE0IEBACiB7CiAJc3ZjX3JlZ194cHJ0X2NsYXNzKCZzdmNfdGNwX2NsYXNzKTsKIAlzdmNfcmVnX3hwcnRfY2xhc3MoJnN2Y191ZHBfY2xhc3MpOworCXN2Y19pbml0X2JjX3hwcnRfc29jaygpOwogfQogCiB2b2lkIHN2Y19jbGVhbnVwX3hwcnRfc29jayh2b2lkKQogewogCXN2Y191bnJlZ194cHJ0X2NsYXNzKCZzdmNfdGNwX2NsYXNzKTsKIAlzdmNfdW5yZWdfeHBydF9jbGFzcygmc3ZjX3VkcF9jbGFzcyk7CisJc3ZjX2NsZWFudXBfYmNfeHBydF9zb2NrKCk7CiB9CiAKIHN0YXRpYyB2b2lkIHN2Y190Y3BfaW5pdChzdHJ1Y3Qgc3ZjX3NvY2sgKnN2c2ssIHN0cnVjdCBzdmNfc2VydiAqc2VydikKQEAgLTE1MDksNDEgKzE1NjksNDUgQEAKIAlrZnJlZShzdnNrKTsKIH0KIAorI2lmIGRlZmluZWQoQ09ORklHX05GU19WNF8xKQogLyoKLSAqIENyZWF0ZSBhIHN2Y194cHJ0LgotICoKLSAqIEZvciBpbnRlcm5hbCB1c2Ugb25seSAoZS5nLiBuZnN2NC4xIGJhY2tjaGFubmVsKS4KLSAqIENhbGxlcnMgc2hvdWxkIHR5cGljYWxseSB1c2UgdGhlIHhwb19jcmVhdGUoKSBtZXRob2QuCisgKiBDcmVhdGUgYSBiYWNrIGNoYW5uZWwgc3ZjX3hwcnQgd2hpY2ggc2hhcmVzIHRoZSBmb3JlIGNoYW5uZWwgc29ja2V0LgogICovCi1zdHJ1Y3Qgc3ZjX3hwcnQgKnN2Y19zb2NrX2NyZWF0ZShzdHJ1Y3Qgc3ZjX3NlcnYgKnNlcnYsIGludCBwcm90KQorc3RhdGljIHN0cnVjdCBzdmNfeHBydCAqc3ZjX2JjX2NyZWF0ZV9zb2NrZXQoc3RydWN0IHN2Y19zZXJ2ICpzZXJ2LAorCQkJCQkgICAgIGludCBwcm90b2NvbCwKKwkJCQkJICAgICBzdHJ1Y3QgbmV0ICpuZXQsCisJCQkJCSAgICAgc3RydWN0IHNvY2thZGRyICpzaW4sIGludCBsZW4sCisJCQkJCSAgICAgaW50IGZsYWdzKQogewogCXN0cnVjdCBzdmNfc29jayAqc3ZzazsKLQlzdHJ1Y3Qgc3ZjX3hwcnQgKnhwcnQgPSBOVUxMOworCXN0cnVjdCBzdmNfeHBydCAqeHBydDsKIAotCWRwcmludGsoInN2YzogJXNcbiIsIF9fZnVuY19fKTsKKwlpZiAocHJvdG9jb2wgIT0gSVBQUk9UT19UQ1ApIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAic3ZjOiBvbmx5IFRDUCBzb2NrZXRzIgorCQkJIiBzdXBwb3J0ZWQgb24gc2hhcmVkIGJhY2sgY2hhbm5lbFxuIik7CisJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworCX0KKwogCXN2c2sgPSBremFsbG9jKHNpemVvZigqc3ZzayksIEdGUF9LRVJORUwpOwogCWlmICghc3ZzaykKLQkJZ290byBvdXQ7CisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwogCiAJeHBydCA9ICZzdnNrLT5za194cHJ0OwotCWlmIChwcm90ID09IElQUFJPVE9fVENQKQotCQlzdmNfeHBydF9pbml0KCZzdmNfdGNwX2NsYXNzLCB4cHJ0LCBzZXJ2KTsKLQllbHNlIGlmIChwcm90ID09IElQUFJPVE9fVURQKQotCQlzdmNfeHBydF9pbml0KCZzdmNfdWRwX2NsYXNzLCB4cHJ0LCBzZXJ2KTsKLQllbHNlCi0JCUJVRygpOwotb3V0OgotCWRwcmludGsoInN2YzogJXMgcmV0dXJuICVwXG4iLCBfX2Z1bmNfXywgeHBydCk7CisJc3ZjX3hwcnRfaW5pdCgmc3ZjX3RjcF9iY19jbGFzcywgeHBydCwgc2Vydik7CisKKwlzZXJ2LT5zdl9iY194cHJ0ID0geHBydDsKKwogCXJldHVybiB4cHJ0OwogfQotRVhQT1JUX1NZTUJPTF9HUEwoc3ZjX3NvY2tfY3JlYXRlKTsKIAogLyoKLSAqIERlc3Ryb3kgYSBzdmNfc29jay4KKyAqIEZyZWUgYSBiYWNrIGNoYW5uZWwgc3ZjX3NvY2suCiAgKi8KLXZvaWQgc3ZjX3NvY2tfZGVzdHJveShzdHJ1Y3Qgc3ZjX3hwcnQgKnhwcnQpCitzdGF0aWMgdm9pZCBzdmNfYmNfc29ja19mcmVlKHN0cnVjdCBzdmNfeHBydCAqeHBydCkKIHsKLQlpZiAoeHBydCkKKwlpZiAoeHBydCkgeworCQlrZnJlZSh4cHJ0LT54cHRfYmNfc2lkKTsKIAkJa2ZyZWUoY29udGFpbmVyX29mKHhwcnQsIHN0cnVjdCBzdmNfc29jaywgc2tfeHBydCkpOworCX0KIH0KLUVYUE9SVF9TWU1CT0xfR1BMKHN2Y19zb2NrX2Rlc3Ryb3kpOworI2VuZGlmIC8qIENPTkZJR19ORlNfVjRfMSAqLwpkaWZmIC0tZ2l0IGEvbmV0L3N1bnJwYy94ZHIuYyBiL25ldC9zdW5ycGMveGRyLmMKaW5kZXggY2Q5ZTg0MS4uNjc5Y2Q2NyAxMDA2NDQKLS0tIGEvbmV0L3N1bnJwYy94ZHIuYworKysgYi9uZXQvc3VucnBjL3hkci5jCkBAIC01NTIsNiArNTUyLDc0IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTCh4ZHJfd3JpdGVfcGFnZXMpOwogCitzdGF0aWMgdm9pZCB4ZHJfc2V0X2lvdihzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBzdHJ1Y3Qga3ZlYyAqaW92LAorCQlfX2JlMzIgKnAsIHVuc2lnbmVkIGludCBsZW4pCit7CisJaWYgKGxlbiA+IGlvdi0+aW92X2xlbikKKwkJbGVuID0gaW92LT5pb3ZfbGVuOworCWlmIChwID09IE5VTEwpCisJCXAgPSAoX19iZTMyKilpb3YtPmlvdl9iYXNlOworCXhkci0+cCA9IHA7CisJeGRyLT5lbmQgPSAoX19iZTMyKikoaW92LT5pb3ZfYmFzZSArIGxlbik7CisJeGRyLT5pb3YgPSBpb3Y7CisJeGRyLT5wYWdlX3B0ciA9IE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgeGRyX3NldF9wYWdlX2Jhc2Uoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKKwkJdW5zaWduZWQgaW50IGJhc2UsIHVuc2lnbmVkIGludCBsZW4pCit7CisJdW5zaWduZWQgaW50IHBnbnI7CisJdW5zaWduZWQgaW50IG1heGxlbjsKKwl1bnNpZ25lZCBpbnQgcGdvZmY7CisJdW5zaWduZWQgaW50IHBnZW5kOworCXZvaWQgKmthZGRyOworCisJbWF4bGVuID0geGRyLT5idWYtPnBhZ2VfbGVuOworCWlmIChiYXNlID49IG1heGxlbikKKwkJcmV0dXJuIC1FSU5WQUw7CisJbWF4bGVuIC09IGJhc2U7CisJaWYgKGxlbiA+IG1heGxlbikKKwkJbGVuID0gbWF4bGVuOworCisJYmFzZSArPSB4ZHItPmJ1Zi0+cGFnZV9iYXNlOworCisJcGduciA9IGJhc2UgPj4gUEFHRV9TSElGVDsKKwl4ZHItPnBhZ2VfcHRyID0gJnhkci0+YnVmLT5wYWdlc1twZ25yXTsKKwlrYWRkciA9IHBhZ2VfYWRkcmVzcygqeGRyLT5wYWdlX3B0cik7CisKKwlwZ29mZiA9IGJhc2UgJiB+UEFHRV9NQVNLOworCXhkci0+cCA9IChfX2JlMzIqKShrYWRkciArIHBnb2ZmKTsKKworCXBnZW5kID0gcGdvZmYgKyBsZW47CisJaWYgKHBnZW5kID4gUEFHRV9TSVpFKQorCQlwZ2VuZCA9IFBBR0VfU0laRTsKKwl4ZHItPmVuZCA9IChfX2JlMzIqKShrYWRkciArIHBnZW5kKTsKKwl4ZHItPmlvdiA9IE5VTEw7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHhkcl9zZXRfbmV4dF9wYWdlKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIpCit7CisJdW5zaWduZWQgaW50IG5ld2Jhc2U7CisKKwluZXdiYXNlID0gKDEgKyB4ZHItPnBhZ2VfcHRyIC0geGRyLT5idWYtPnBhZ2VzKSA8PCBQQUdFX1NISUZUOworCW5ld2Jhc2UgLT0geGRyLT5idWYtPnBhZ2VfYmFzZTsKKworCWlmICh4ZHJfc2V0X3BhZ2VfYmFzZSh4ZHIsIG5ld2Jhc2UsIFBBR0VfU0laRSkgPCAwKQorCQl4ZHJfc2V0X2lvdih4ZHIsIHhkci0+YnVmLT50YWlsLCBOVUxMLCB4ZHItPmJ1Zi0+bGVuKTsKK30KKworc3RhdGljIGJvb2wgeGRyX3NldF9uZXh0X2J1ZmZlcihzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyKQoreworCWlmICh4ZHItPnBhZ2VfcHRyICE9IE5VTEwpCisJCXhkcl9zZXRfbmV4dF9wYWdlKHhkcik7CisJZWxzZSBpZiAoeGRyLT5pb3YgPT0geGRyLT5idWYtPmhlYWQpIHsKKwkJaWYgKHhkcl9zZXRfcGFnZV9iYXNlKHhkciwgMCwgUEFHRV9TSVpFKSA8IDApCisJCQl4ZHJfc2V0X2lvdih4ZHIsIHhkci0+YnVmLT50YWlsLCBOVUxMLCB4ZHItPmJ1Zi0+bGVuKTsKKwl9CisJcmV0dXJuIHhkci0+cCAhPSB4ZHItPmVuZDsKK30KKwogLyoqCiAgKiB4ZHJfaW5pdF9kZWNvZGUgLSBJbml0aWFsaXplIGFuIHhkcl9zdHJlYW0gZm9yIGRlY29kaW5nIGRhdGEuCiAgKiBAeGRyOiBwb2ludGVyIHRvIHhkcl9zdHJlYW0gc3RydWN0CkBAIC01NjAsNDEgKzYyOCw2NyBAQAogICovCiB2b2lkIHhkcl9pbml0X2RlY29kZShzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBzdHJ1Y3QgeGRyX2J1ZiAqYnVmLCBfX2JlMzIgKnApCiB7Ci0Jc3RydWN0IGt2ZWMgKmlvdiA9IGJ1Zi0+aGVhZDsKLQl1bnNpZ25lZCBpbnQgbGVuID0gaW92LT5pb3ZfbGVuOwotCi0JaWYgKGxlbiA+IGJ1Zi0+bGVuKQotCQlsZW4gPSBidWYtPmxlbjsKIAl4ZHItPmJ1ZiA9IGJ1ZjsKLQl4ZHItPmlvdiA9IGlvdjsKLQl4ZHItPnAgPSBwOwotCXhkci0+ZW5kID0gKF9fYmUzMiAqKSgoY2hhciAqKWlvdi0+aW92X2Jhc2UgKyBsZW4pOworCXhkci0+c2NyYXRjaC5pb3ZfYmFzZSA9IE5VTEw7CisJeGRyLT5zY3JhdGNoLmlvdl9sZW4gPSAwOworCWlmIChidWYtPmhlYWRbMF0uaW92X2xlbiAhPSAwKQorCQl4ZHJfc2V0X2lvdih4ZHIsIGJ1Zi0+aGVhZCwgcCwgYnVmLT5sZW4pOworCWVsc2UgaWYgKGJ1Zi0+cGFnZV9sZW4gIT0gMCkKKwkJeGRyX3NldF9wYWdlX2Jhc2UoeGRyLCAwLCBidWYtPmxlbik7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTCh4ZHJfaW5pdF9kZWNvZGUpOwogCi0vKioKLSAqIHhkcl9pbmxpbmVfcGVlayAtIEFsbG93IHJlYWQtYWhlYWQgaW4gdGhlIFhEUiBkYXRhIHN0cmVhbQotICogQHhkcjogcG9pbnRlciB0byB4ZHJfc3RyZWFtIHN0cnVjdAotICogQG5ieXRlczogbnVtYmVyIG9mIGJ5dGVzIG9mIGRhdGEgdG8gZGVjb2RlCi0gKgotICogQ2hlY2sgaWYgdGhlIGlucHV0IGJ1ZmZlciBpcyBsb25nIGVub3VnaCB0byBlbmFibGUgdXMgdG8gZGVjb2RlCi0gKiAnbmJ5dGVzJyBtb3JlIGJ5dGVzIG9mIGRhdGEgc3RhcnRpbmcgYXQgdGhlIGN1cnJlbnQgcG9zaXRpb24uCi0gKiBJZiBzbyByZXR1cm4gdGhlIGN1cnJlbnQgcG9pbnRlciB3aXRob3V0IHVwZGF0aW5nIHRoZSBjdXJyZW50Ci0gKiBwb2ludGVyIHBvc2l0aW9uLgotICovCi1fX2JlMzIgKiB4ZHJfaW5saW5lX3BlZWsoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgc2l6ZV90IG5ieXRlcykKK3N0YXRpYyBfX2JlMzIgKiBfX3hkcl9pbmxpbmVfZGVjb2RlKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHNpemVfdCBuYnl0ZXMpCiB7CiAJX19iZTMyICpwID0geGRyLT5wOwogCV9fYmUzMiAqcSA9IHAgKyBYRFJfUVVBRExFTihuYnl0ZXMpOwogCiAJaWYgKHVubGlrZWx5KHEgPiB4ZHItPmVuZCB8fCBxIDwgcCkpCiAJCXJldHVybiBOVUxMOworCXhkci0+cCA9IHE7CiAJcmV0dXJuIHA7CiB9Ci1FWFBPUlRfU1lNQk9MX0dQTCh4ZHJfaW5saW5lX3BlZWspOwogCiAvKioKLSAqIHhkcl9pbmxpbmVfZGVjb2RlIC0gUmV0cmlldmUgbm9uLXBhZ2UgWERSIGRhdGEgdG8gZGVjb2RlCisgKiB4ZHJfc2V0X3NjcmF0Y2hfYnVmZmVyIC0gQXR0YWNoIGEgc2NyYXRjaCBidWZmZXIgZm9yIGRlY29kaW5nIGRhdGEuCisgKiBAeGRyOiBwb2ludGVyIHRvIHhkcl9zdHJlYW0gc3RydWN0CisgKiBAYnVmOiBwb2ludGVyIHRvIGFuIGVtcHR5IGJ1ZmZlcgorICogQGJ1Zmxlbjogc2l6ZSBvZiAnYnVmJworICoKKyAqIFRoZSBzY3JhdGNoIGJ1ZmZlciBpcyB1c2VkIHdoZW4gZGVjb2RpbmcgZnJvbSBhbiBhcnJheSBvZiBwYWdlcy4KKyAqIElmIGFuIHhkcl9pbmxpbmVfZGVjb2RlKCkgY2FsbCBzcGFucyBhY3Jvc3MgcGFnZSBib3VuZGFyaWVzLCB0aGVuCisgKiB3ZSBjb3B5IHRoZSBkYXRhIGludG8gdGhlIHNjcmF0Y2ggYnVmZmVyIGluIG9yZGVyIHRvIGFsbG93IGxpbmVhcgorICogYWNjZXNzLgorICovCit2b2lkIHhkcl9zZXRfc2NyYXRjaF9idWZmZXIoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgdm9pZCAqYnVmLCBzaXplX3QgYnVmbGVuKQoreworCXhkci0+c2NyYXRjaC5pb3ZfYmFzZSA9IGJ1ZjsKKwl4ZHItPnNjcmF0Y2guaW92X2xlbiA9IGJ1ZmxlbjsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHhkcl9zZXRfc2NyYXRjaF9idWZmZXIpOworCitzdGF0aWMgX19iZTMyICp4ZHJfY29weV90b19zY3JhdGNoKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHNpemVfdCBuYnl0ZXMpCit7CisJX19iZTMyICpwOworCXZvaWQgKmNwZGVzdCA9IHhkci0+c2NyYXRjaC5pb3ZfYmFzZTsKKwlzaXplX3QgY3BsZW4gPSAoY2hhciAqKXhkci0+ZW5kIC0gKGNoYXIgKil4ZHItPnA7CisKKwlpZiAobmJ5dGVzID4geGRyLT5zY3JhdGNoLmlvdl9sZW4pCisJCXJldHVybiBOVUxMOworCW1lbWNweShjcGRlc3QsIHhkci0+cCwgY3BsZW4pOworCWNwZGVzdCArPSBjcGxlbjsKKwluYnl0ZXMgLT0gY3BsZW47CisJaWYgKCF4ZHJfc2V0X25leHRfYnVmZmVyKHhkcikpCisJCXJldHVybiBOVUxMOworCXAgPSBfX3hkcl9pbmxpbmVfZGVjb2RlKHhkciwgbmJ5dGVzKTsKKwlpZiAocCA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKwltZW1jcHkoY3BkZXN0LCBwLCBuYnl0ZXMpOworCXJldHVybiB4ZHItPnNjcmF0Y2guaW92X2Jhc2U7Cit9CisKKy8qKgorICogeGRyX2lubGluZV9kZWNvZGUgLSBSZXRyaWV2ZSBYRFIgZGF0YSB0byBkZWNvZGUKICAqIEB4ZHI6IHBvaW50ZXIgdG8geGRyX3N0cmVhbSBzdHJ1Y3QKICAqIEBuYnl0ZXM6IG51bWJlciBvZiBieXRlcyBvZiBkYXRhIHRvIGRlY29kZQogICoKQEAgLTYwNSwxMyArNjk5LDE2IEBACiAgKi8KIF9fYmUzMiAqIHhkcl9pbmxpbmVfZGVjb2RlKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHNpemVfdCBuYnl0ZXMpCiB7Ci0JX19iZTMyICpwID0geGRyLT5wOwotCV9fYmUzMiAqcSA9IHAgKyBYRFJfUVVBRExFTihuYnl0ZXMpOworCV9fYmUzMiAqcDsKIAotCWlmICh1bmxpa2VseShxID4geGRyLT5lbmQgfHwgcSA8IHApKQorCWlmIChuYnl0ZXMgPT0gMCkKKwkJcmV0dXJuIHhkci0+cDsKKwlpZiAoeGRyLT5wID09IHhkci0+ZW5kICYmICF4ZHJfc2V0X25leHRfYnVmZmVyKHhkcikpCiAJCXJldHVybiBOVUxMOwotCXhkci0+cCA9IHE7Ci0JcmV0dXJuIHA7CisJcCA9IF9feGRyX2lubGluZV9kZWNvZGUoeGRyLCBuYnl0ZXMpOworCWlmIChwICE9IE5VTEwpCisJCXJldHVybiBwOworCXJldHVybiB4ZHJfY29weV90b19zY3JhdGNoKHhkciwgbmJ5dGVzKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHhkcl9pbmxpbmVfZGVjb2RlKTsKIApAQCAtNjcxLDE2ICs3NjgsMTIgQEAKICAqLwogdm9pZCB4ZHJfZW50ZXJfcGFnZShzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCB1bnNpZ25lZCBpbnQgbGVuKQogewotCWNoYXIgKiBrYWRkciA9IHBhZ2VfYWRkcmVzcyh4ZHItPmJ1Zi0+cGFnZXNbMF0pOwogCXhkcl9yZWFkX3BhZ2VzKHhkciwgbGVuKTsKIAkvKgogCSAqIFBvc2l0aW9uIGN1cnJlbnQgcG9pbnRlciBhdCBiZWdpbm5pbmcgb2YgdGFpbCwgYW5kCiAJICogc2V0IHJlbWFpbmluZyBtZXNzYWdlIGxlbmd0aC4KIAkgKi8KLQlpZiAobGVuID4gUEFHRV9DQUNIRV9TSVpFIC0geGRyLT5idWYtPnBhZ2VfYmFzZSkKLQkJbGVuID0gUEFHRV9DQUNIRV9TSVpFIC0geGRyLT5idWYtPnBhZ2VfYmFzZTsKLQl4ZHItPnAgPSAoX19iZTMyICopKGthZGRyICsgeGRyLT5idWYtPnBhZ2VfYmFzZSk7Ci0JeGRyLT5lbmQgPSAoX19iZTMyICopKChjaGFyICopeGRyLT5wICsgbGVuKTsKKwl4ZHJfc2V0X3BhZ2VfYmFzZSh4ZHIsIDAsIGxlbik7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTCh4ZHJfZW50ZXJfcGFnZSk7CiAKZGlmZiAtLWdpdCBhL3NjcmlwdHMvLmdpdGlnbm9yZSBiL3NjcmlwdHMvLmdpdGlnbm9yZQppbmRleCBjNWQ1ZGI1Li5lMjc0MWQyIDEwMDY0NAotLS0gYS9zY3JpcHRzLy5naXRpZ25vcmUKKysrIGIvc2NyaXB0cy8uZ2l0aWdub3JlCkBAIC03LDMgKzcsNCBAQAogYmluMmMKIHVuaWZkZWYKIGloZXgyZncKK3JlY29yZG1jb3VudApkaWZmIC0tZ2l0IGEvc2NyaXB0cy9NYWtlZmlsZS5saWIgYi9zY3JpcHRzL01ha2VmaWxlLmxpYgppbmRleCA0YzcyYzExLi4zOTZkYTE2IDEwMDY0NAotLS0gYS9zY3JpcHRzL01ha2VmaWxlLmxpYgorKysgYi9zY3JpcHRzL01ha2VmaWxlLmxpYgpAQCAtMjAwLDYgKzIwMCwyOSBAQAogY21kX2d6aXAgPSAoY2F0ICQoZmlsdGVyLW91dCBGT1JDRSwkXikgfCBnemlwIC1mIC05ID4gJEApIHx8IFwKIAkocm0gLWYgJEAgOyBmYWxzZSkKIAorIyBEVEMKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgR2VuZXJhdGUgYW4gYXNzZW1ibHkgZmlsZSB0byB3cmFwIHRoZSBvdXRwdXQgb2YgdGhlIGRldmljZSB0cmVlIGNvbXBpbGVyCitxdWlldF9jbWRfZHRfU19kdGI9IERUQiAgICAkQAorY21kX2R0X1NfZHRiPQkJCQkJCVwKKygJCQkJCQkJXAorCWVjaG8gJ1wjaW5jbHVkZSA8YXNtLWdlbmVyaWMvdm1saW51eC5sZHMuaD4nOyAJXAorCWVjaG8gJy5zZWN0aW9uIC5kdGIuaW5pdC5yb2RhdGEsImEiJzsJCVwKKwllY2hvICcuYmFsaWduIFNUUlVDVF9BTElHTk1FTlQnOwkJXAorCWVjaG8gJy5nbG9iYWwgX19kdGJfJCgqRilfYmVnaW4nOwkJXAorCWVjaG8gJ19fZHRiXyQoKkYpX2JlZ2luOic7CQkJXAorCWVjaG8gJy5pbmNiaW4gIiQ8IiAnOwkJCQlcCisJZWNobyAnX19kdGJfJCgqRilfZW5kOic7CQkJXAorCWVjaG8gJy5nbG9iYWwgX19kdGJfJCgqRilfZW5kJzsJCQlcCisJZWNobyAnLmJhbGlnbiBTVFJVQ1RfQUxJR05NRU5UJzsgCQlcCispID4gJEAKKworJChvYmopLyUuZHRiLlM6ICQob2JqKS8lLmR0YgorCSQoY2FsbCBjbWQsZHRfU19kdGIpCisKK3F1aWV0X2NtZF9kdGMgPSBEVEMgICAgICRACitjbWRfZHRjID0gJChvYmp0cmVlKS9zY3JpcHRzL2R0Yy9kdGMgLU8gZHRiIC1vICRAIC1iIDAgJChEVENfRkxBR1MpICQ8CiAKICMgQnppcDIKICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9zY3JpcHRzL2Jhc2ljL2ZpeGRlcC5jIGIvc2NyaXB0cy9iYXNpYy9maXhkZXAuYwppbmRleCBlYTI2YjIzLi5jOWExNmFiIDEwMDY0NAotLS0gYS9zY3JpcHRzL2Jhc2ljL2ZpeGRlcC5jCisrKyBiL3NjcmlwdHMvYmFzaWMvZml4ZGVwLmMKQEAgLTEzOCwzOCArMTM4LDM2IEBACiAJcHJpbnRmKCJjbWRfJXMgOj0gJXNcblxuIiwgdGFyZ2V0LCBjbWRsaW5lKTsKIH0KIAotY2hhciAqIHN0cl9jb25maWcgID0gTlVMTDsKLWludCAgICBzaXplX2NvbmZpZyA9IDA7Ci1pbnQgICAgbGVuX2NvbmZpZyAgPSAwOworc3RydWN0IGl0ZW0geworCXN0cnVjdCBpdGVtCSpuZXh0OworCXVuc2lnbmVkIGludAlsZW47CisJdW5zaWduZWQgaW50CWhhc2g7CisJY2hhcgkJbmFtZVswXTsKK307CiAKLS8qCi0gKiBHcm93IHRoZSBjb25maWd1cmF0aW9uIHN0cmluZyB0byBhIGRlc2lyZWQgbGVuZ3RoLgotICogVXN1YWxseSB0aGUgZmlyc3QgZ3Jvd3RoIGlzIHBsZW50eS4KLSAqLwotc3RhdGljIHZvaWQgZ3Jvd19jb25maWcoaW50IGxlbikKKyNkZWZpbmUgSEFTSFNaIDI1Ngorc3RhdGljIHN0cnVjdCBpdGVtICpoYXNodGFiW0hBU0hTWl07CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgc3RyaGFzaChjb25zdCBjaGFyICpzdHIsIHVuc2lnbmVkIGludCBzeikKIHsKLQl3aGlsZSAobGVuX2NvbmZpZyArIGxlbiA+IHNpemVfY29uZmlnKSB7Ci0JCWlmIChzaXplX2NvbmZpZyA9PSAwKQotCQkJc2l6ZV9jb25maWcgPSAyMDQ4OwotCQlzdHJfY29uZmlnID0gcmVhbGxvYyhzdHJfY29uZmlnLCBzaXplX2NvbmZpZyAqPSAyKTsKLQkJaWYgKHN0cl9jb25maWcgPT0gTlVMTCkKLQkJCXsgcGVycm9yKCJmaXhkZXA6bWFsbG9jIik7IGV4aXQoMSk7IH0KLQl9CisJLyogZm52MzIgaGFzaCAqLworCXVuc2lnbmVkIGludCBpLCBoYXNoID0gMjE2NjEzNjI2MVU7CisKKwlmb3IgKGkgPSAwOyBpIDwgc3o7IGkrKykKKwkJaGFzaCA9IChoYXNoIF4gc3RyW2ldKSAqIDB4MDEwMDAxOTM7CisJcmV0dXJuIGhhc2g7CiB9CiAKLQotCiAvKgogICogTG9va3VwIGEgdmFsdWUgaW4gdGhlIGNvbmZpZ3VyYXRpb24gc3RyaW5nLgogICovCi1zdGF0aWMgaW50IGlzX2RlZmluZWRfY29uZmlnKGNvbnN0IGNoYXIgKiBuYW1lLCBpbnQgbGVuKQorc3RhdGljIGludCBpc19kZWZpbmVkX2NvbmZpZyhjb25zdCBjaGFyICpuYW1lLCBpbnQgbGVuLCB1bnNpZ25lZCBpbnQgaGFzaCkKIHsKLQljb25zdCBjaGFyICogcGNvbmZpZzsKLQljb25zdCBjaGFyICogcGxhc3QgPSBzdHJfY29uZmlnICsgbGVuX2NvbmZpZyAtIGxlbjsKLQlmb3IgKCBwY29uZmlnID0gc3RyX2NvbmZpZyArIDE7IHBjb25maWcgPCBwbGFzdDsgcGNvbmZpZysrICkgewotCQlpZiAocGNvbmZpZ1sgLTFdID09ICdcbicKLQkJJiYgIHBjb25maWdbbGVuXSA9PSAnXG4nCi0JCSYmICAhbWVtY21wKHBjb25maWcsIG5hbWUsIGxlbikpCisJc3RydWN0IGl0ZW0gKmF1eDsKKworCWZvciAoYXV4ID0gaGFzaHRhYltoYXNoICUgSEFTSFNaXTsgYXV4OyBhdXggPSBhdXgtPm5leHQpIHsKKwkJaWYgKGF1eC0+aGFzaCA9PSBoYXNoICYmIGF1eC0+bGVuID09IGxlbiAmJgorCQkgICAgbWVtY21wKGF1eC0+bmFtZSwgbmFtZSwgbGVuKSA9PSAwKQogCQkJcmV0dXJuIDE7CiAJfQogCXJldHVybiAwOwpAQCAtMTc4LDEzICsxNzYsMTkgQEAKIC8qCiAgKiBBZGQgYSBuZXcgdmFsdWUgdG8gdGhlIGNvbmZpZ3VyYXRpb24gc3RyaW5nLgogICovCi1zdGF0aWMgdm9pZCBkZWZpbmVfY29uZmlnKGNvbnN0IGNoYXIgKiBuYW1lLCBpbnQgbGVuKQorc3RhdGljIHZvaWQgZGVmaW5lX2NvbmZpZyhjb25zdCBjaGFyICpuYW1lLCBpbnQgbGVuLCB1bnNpZ25lZCBpbnQgaGFzaCkKIHsKLQlncm93X2NvbmZpZyhsZW4gKyAxKTsKKwlzdHJ1Y3QgaXRlbSAqYXV4ID0gbWFsbG9jKHNpemVvZigqYXV4KSArIGxlbik7CiAKLQltZW1jcHkoc3RyX2NvbmZpZytsZW5fY29uZmlnLCBuYW1lLCBsZW4pOwotCWxlbl9jb25maWcgKz0gbGVuOwotCXN0cl9jb25maWdbbGVuX2NvbmZpZysrXSA9ICdcbic7CisJaWYgKCFhdXgpIHsKKwkJcGVycm9yKCJmaXhkZXA6bWFsbG9jIik7CisJCWV4aXQoMSk7CisJfQorCW1lbWNweShhdXgtPm5hbWUsIG5hbWUsIGxlbik7CisJYXV4LT5sZW4gPSBsZW47CisJYXV4LT5oYXNoID0gaGFzaDsKKwlhdXgtPm5leHQgPSBoYXNodGFiW2hhc2ggJSBIQVNIU1pdOworCWhhc2h0YWJbaGFzaCAlIEhBU0hTWl0gPSBhdXg7CiB9CiAKIC8qCkBAIC0xOTIsNDAgKzE5Niw0OSBAQAogICovCiBzdGF0aWMgdm9pZCBjbGVhcl9jb25maWcodm9pZCkKIHsKLQlsZW5fY29uZmlnID0gMDsKLQlkZWZpbmVfY29uZmlnKCIiLCAwKTsKKwlzdHJ1Y3QgaXRlbSAqYXV4LCAqbmV4dDsKKwl1bnNpZ25lZCBpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBIQVNIU1o7IGkrKykgeworCQlmb3IgKGF1eCA9IGhhc2h0YWJbaV07IGF1eDsgYXV4ID0gbmV4dCkgeworCQkJbmV4dCA9IGF1eC0+bmV4dDsKKwkJCWZyZWUoYXV4KTsKKwkJfQorCQloYXNodGFiW2ldID0gTlVMTDsKKwl9CiB9CiAKIC8qCiAgKiBSZWNvcmQgdGhlIHVzZSBvZiBhIENPTkZJR18qIHdvcmQuCiAgKi8KLXN0YXRpYyB2b2lkIHVzZV9jb25maWcoY2hhciAqbSwgaW50IHNsZW4pCitzdGF0aWMgdm9pZCB1c2VfY29uZmlnKGNvbnN0IGNoYXIgKm0sIGludCBzbGVuKQogewotCWNoYXIgc1tQQVRIX01BWF07Ci0JY2hhciAqcDsKKwl1bnNpZ25lZCBpbnQgaGFzaCA9IHN0cmhhc2gobSwgc2xlbik7CisJaW50IGMsIGk7CiAKLQlpZiAoaXNfZGVmaW5lZF9jb25maWcobSwgc2xlbikpCisJaWYgKGlzX2RlZmluZWRfY29uZmlnKG0sIHNsZW4sIGhhc2gpKQogCSAgICByZXR1cm47CiAKLQlkZWZpbmVfY29uZmlnKG0sIHNsZW4pOworCWRlZmluZV9jb25maWcobSwgc2xlbiwgaGFzaCk7CiAKLQltZW1jcHkocywgbSwgc2xlbik7IHNbc2xlbl0gPSAwOwotCi0JZm9yIChwID0gczsgcCA8IHMgKyBzbGVuOyBwKyspIHsKLQkJaWYgKCpwID09ICdfJykKLQkJCSpwID0gJy8nOworCXByaW50ZigiICAgICQod2lsZGNhcmQgaW5jbHVkZS9jb25maWcvIik7CisJZm9yIChpID0gMDsgaSA8IHNsZW47IGkrKykgeworCQljID0gbVtpXTsKKwkJaWYgKGMgPT0gJ18nKQorCQkJYyA9ICcvJzsKIAkJZWxzZQotCQkJKnAgPSB0b2xvd2VyKChpbnQpKnApOworCQkJYyA9IHRvbG93ZXIoYyk7CisJCXB1dGNoYXIoYyk7CiAJfQotCXByaW50ZigiICAgICQod2lsZGNhcmQgaW5jbHVkZS9jb25maWcvJXMuaCkgXFxcbiIsIHMpOworCXByaW50ZigiLmgpIFxcXG4iKTsKIH0KIAotc3RhdGljIHZvaWQgcGFyc2VfY29uZmlnX2ZpbGUoY2hhciAqbWFwLCBzaXplX3QgbGVuKQorc3RhdGljIHZvaWQgcGFyc2VfY29uZmlnX2ZpbGUoY29uc3QgY2hhciAqbWFwLCBzaXplX3QgbGVuKQogewotCWludCAqZW5kID0gKGludCAqKSAobWFwICsgbGVuKTsKKwljb25zdCBpbnQgKmVuZCA9IChjb25zdCBpbnQgKikgKG1hcCArIGxlbik7CiAJLyogc3RhcnQgYXQgKzEsIHNvIHRoYXQgcCBjYW4gbmV2ZXIgYmUgPCBtYXAgKi8KLQlpbnQgKm0gICA9IChpbnQgKikgbWFwICsgMTsKLQljaGFyICpwLCAqcTsKKwljb25zdCBpbnQgKm0gICA9IChjb25zdCBpbnQgKikgbWFwICsgMTsKKwljb25zdCBjaGFyICpwLCAqcTsKIAogCWZvciAoOyBtIDwgZW5kOyBtKyspIHsKIAkJaWYgKCptID09IElOVF9DT05GKSB7IHAgPSAoY2hhciAqKSBtICA7IGdvdG8gY29uZjsgfQpAQCAtMjY1LDcgKzI3OCw3IEBACiAJcmV0dXJuIG1lbWNtcChzICsgc2xlbiAtIHN1Ymxlbiwgc3ViLCBzdWJsZW4pOwogfQogCi1zdGF0aWMgdm9pZCBkb19jb25maWdfZmlsZShjaGFyICpmaWxlbmFtZSkKK3N0YXRpYyB2b2lkIGRvX2NvbmZpZ19maWxlKGNvbnN0IGNoYXIgKmZpbGVuYW1lKQogewogCXN0cnVjdCBzdGF0IHN0OwogCWludCBmZDsKQEAgLTI3Myw3ICsyODYsNyBAQAogCiAJZmQgPSBvcGVuKGZpbGVuYW1lLCBPX1JET05MWSk7CiAJaWYgKGZkIDwgMCkgewotCQlmcHJpbnRmKHN0ZGVyciwgImZpeGRlcDogIik7CisJCWZwcmludGYoc3RkZXJyLCAiZml4ZGVwOiBlcnJvciBvcGVuaW5nIGNvbmZpZyBmaWxlOiAiKTsKIAkJcGVycm9yKGZpbGVuYW1lKTsKIAkJZXhpdCgyKTsKIAl9CkBAIC0zNDQsMTEgKzM1NywxNSBAQAogCiAJZmQgPSBvcGVuKGRlcGZpbGUsIE9fUkRPTkxZKTsKIAlpZiAoZmQgPCAwKSB7Ci0JCWZwcmludGYoc3RkZXJyLCAiZml4ZGVwOiAiKTsKKwkJZnByaW50ZihzdGRlcnIsICJmaXhkZXA6IGVycm9yIG9wZW5pbmcgZGVwZmlsZTogIik7CiAJCXBlcnJvcihkZXBmaWxlKTsKIAkJZXhpdCgyKTsKIAl9Ci0JZnN0YXQoZmQsICZzdCk7CisJaWYgKGZzdGF0KGZkLCAmc3QpIDwgMCkgeworICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZml4ZGVwOiBlcnJvciBmc3RhdCdpbmcgZGVwZmlsZTogIik7CisgICAgICAgICAgICAgICAgcGVycm9yKGRlcGZpbGUpOworICAgICAgICAgICAgICAgIGV4aXQoMik7CisgICAgICAgIH0KIAlpZiAoc3Quc3Rfc2l6ZSA9PSAwKSB7CiAJCWZwcmludGYoc3RkZXJyLCJmaXhkZXA6ICVzIGlzIGVtcHR5XG4iLGRlcGZpbGUpOwogCQljbG9zZShmZCk7CmRpZmYgLS1naXQgYS9zY3JpcHRzL2NoZWNrc3lzY2FsbHMuc2ggYi9zY3JpcHRzL2NoZWNrc3lzY2FsbHMuc2gKaW5kZXggNmJiNDJlNy4uM2FiMzE2ZSAxMDA3NTUKLS0tIGEvc2NyaXB0cy9jaGVja3N5c2NhbGxzLnNoCisrKyBiL3NjcmlwdHMvY2hlY2tzeXNjYWxscy5zaApAQCAtNiw3ICs2LDcgQEAKICMgYW5kIGxpc3RlZCBiZWxvdyBzbyB0aGV5IGFyZSBpZ25vcmVkLgogIwogIyBVc2FnZToKLSMgc3lzY2FsbGNoayBnY2MgZ2NjLW9wdGlvbnMKKyMgY2hlY2tzeXNjYWxscy5zaCBnY2MgZ2NjLW9wdGlvbnMKICMKIAogaWdub3JlX2xpc3QoKSB7CkBAIC0yMDQsNSArMjA0LDUgQEAKIFwjZW5kaWYvcCcgJDEKIH0KIAotKGlnbm9yZV9saXN0ICYmIHN5c2NhbGxfbGlzdCAke3NyY3RyZWV9L2FyY2gveDg2L2luY2x1ZGUvYXNtL3VuaXN0ZF8zMi5oKSB8IFwKKyhpZ25vcmVfbGlzdCAmJiBzeXNjYWxsX2xpc3QgJChkaXJuYW1lICQwKS8uLi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS91bmlzdGRfMzIuaCkgfCBcCiAkKiAtRSAteCBjIC0gPiAvZGV2L251bGwKZGlmZiAtLWdpdCBhL3NjcmlwdHMvY29jY2luZWxsZS9taXNjL2RvdWJsZWluaXQuY29jY2kgYi9zY3JpcHRzL2NvY2NpbmVsbGUvbWlzYy9kb3VibGVpbml0LmNvY2NpCmluZGV4IDU1ZDdkYzEuLjE1NmIyMGEgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMvY29jY2luZWxsZS9taXNjL2RvdWJsZWluaXQuY29jY2kKKysrIGIvc2NyaXB0cy9jb2NjaW5lbGxlL21pc2MvZG91YmxlaW5pdC5jb2NjaQpAQCAtNyw3ICs3LDcgQEAKIC8vIENvcHlyaWdodDogKEMpIDIwMTAgSnVsaWEgTGF3YWxsLCBESUtVLiAgR1BMdjIuCiAvLyBDb3B5cmlnaHQ6IChDKSAyMDEwIEdpbGxlcyBNdWxsZXIsIElOUklBL0xpUDYuICBHUEx2Mi4KIC8vIFVSTDogaHR0cDovL2NvY2NpbmVsbGUubGlwNi5mci8KLS8vIENvbW1lbnRzOgorLy8gQ29tbWVudHM6IHJlcXVpcmVzIGF0IGxlYXN0IENvY2NpbmVsbGUgMC4yLjQsIGxleCBvciBwYXJzZSBlcnJvciBvdGhlcndpc2UKIC8vIE9wdGlvbnM6IC1ub19pbmNsdWRlcyAtaW5jbHVkZV9oZWFkZXJzCiAKIHZpcnR1YWwgb3JnCkBAIC0xOSw3ICsxOSw3IEBACiBleHByZXNzaW9uIEU7CiBAQAogCi1zdHJ1Y3QgSSBzID1AcDAgeyAuLi4gLmZsZEBwID0gRSwgLi4ufTsKK3N0cnVjdCBJIHMgPUBwMCB7IC4uLiwgLmZsZEBwID0gRSwgLi4ufTsKIAogQHNACiBpZGVudGlmaWVyIEksIHMsIHIuZmxkOwpAQCAtMjcsNyArMjcsNyBAQAogZXhwcmVzc2lvbiBFOwogQEAKIAotc3RydWN0IEkgcyA9QHAwIHsgLi4uIC5mbGRAcCA9IEUsIC4uLn07CitzdHJ1Y3QgSSBzID1AcDAgeyAuLi4sIC5mbGRAcCA9IEUsIC4uLn07CiAKIEBzY3JpcHQ6cHl0aG9uIGRlcGVuZHMgb24gb3JnQAogcDAgPDwgci5wMDsKZGlmZiAtLWdpdCBhL3NjcmlwdHMvY29jY2luZWxsZS9udWxsL2RlcmVmX251bGwuY29jY2kgYi9zY3JpcHRzL2NvY2NpbmVsbGUvbnVsbC9kZXJlZl9udWxsLmNvY2NpCmluZGV4IDk5NjlkNzYuLmNkYWM2Y2YgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMvY29jY2luZWxsZS9udWxsL2RlcmVmX251bGwuY29jY2kKKysrIGIvc2NyaXB0cy9jb2NjaW5lbGxlL251bGwvZGVyZWZfbnVsbC5jb2NjaQpAQCAtMTEsMjEgKzExLDEwIEBACiAvLyBPcHRpb25zOgogCiB2aXJ0dWFsIGNvbnRleHQKLXZpcnR1YWwgcGF0Y2gKIHZpcnR1YWwgb3JnCiB2aXJ0dWFsIHJlcG9ydAogCi1AaW5pdGlhbGl6ZTpweXRob24gZGVwZW5kcyBvbiAhY29udGV4dCAmJiBwYXRjaCAmJiAhb3JnICYmICFyZXBvcnRACi0KLWltcG9ydCBzeXMKLXByaW50ID4+IHN5cy5zdGRlcnIsICJUaGlzIHNlbWFudGljIHBhdGNoIGRvZXMgbm90IHN1cHBvcnQgdGhlICdwYXRjaCcgbW9kZS4iCi0KLUBkZXBlbmRzIG9uIHBhdGNoQAotQEAKLQotdGhpc19ydWxlX3Nob3VsZF9uZXZlcl9tYXRjaGVzKCk7Ci0KLUBpZm0gZGVwZW5kcyBvbiAhcGF0Y2hACitAaWZtQAogZXhwcmVzc2lvbiAqRTsKIHN0YXRlbWVudCBTMSxTMjsKIHBvc2l0aW9uIHAxOwpAQCAtMzUsNyArMjQsNyBAQAogCiAvLyBUaGUgZm9sbG93aW5nIHR3byBydWxlcyBhcmUgc2VwYXJhdGUsIGJlY2F1c2UgYm90aCBjYW4gbWF0Y2ggYSBzaW5nbGUKIC8vIGV4cHJlc3Npb24gaW4gZGlmZmVyZW50IHdheXMKLUBwcjEgZGVwZW5kcyBvbiAhcGF0Y2ggZXhwcmVzc2lvbkAKK0BwcjEgZXhwcmVzc2lvbkAKIGV4cHJlc3Npb24gKmlmbS5FOwogaWRlbnRpZmllciBmOwogcG9zaXRpb24gcDE7CkBAIC00Myw3ICszMiw3IEBACiAKICAoRSAhPSBOVUxMICYmIC4uLikgPyA8Ky4uLkUtPmZAcDEuLi4rPiA6IC4uLgogCi1AcHIyIGRlcGVuZHMgb24gIXBhdGNoIGV4cHJlc3Npb25ACitAcHIyIGV4cHJlc3Npb25ACiBleHByZXNzaW9uICppZm0uRTsKIGlkZW50aWZpZXIgZjsKIHBvc2l0aW9uIHAyOwpAQCAtNTksNyArNDgsNyBAQAogCiAvLyBGb3Igb3JnIGFuZCByZXBvcnQgbW9kZXMKIAotQHIgZGVwZW5kcyBvbiAhY29udGV4dCAmJiAhcGF0Y2ggJiYgKG9yZyB8fCByZXBvcnQpIGV4aXN0c0AKK0ByIGRlcGVuZHMgb24gIWNvbnRleHQgJiYgKG9yZyB8fCByZXBvcnQpIGV4aXN0c0AKIGV4cHJlc3Npb24gc3ViRSA8PSBpZm0uRTsKIGV4cHJlc3Npb24gKmlmbS5FOwogZXhwcmVzc2lvbiBFMSxFMjsKQEAgLTk5LDcgKzg4LDcgQEAKIH0KIGVsc2UgUzMKIAotQHNjcmlwdDpweXRob24gZGVwZW5kcyBvbiAhY29udGV4dCAmJiAhcGF0Y2ggJiYgIW9yZyAmJiByZXBvcnRACitAc2NyaXB0OnB5dGhvbiBkZXBlbmRzIG9uICFjb250ZXh0ICYmICFvcmcgJiYgcmVwb3J0QAogcCA8PCByLnA7CiBwMSA8PCBpZm0ucDE7CiB4IDw8IGlmbS5FOwpAQCAtMTA5LDcgKzk4LDcgQEAKIGNvY2NpbGliLnJlcG9ydC5wcmludF9yZXBvcnQocFswXSwgbXNnKQogY29jY2kuaW5jbHVkZV9tYXRjaChGYWxzZSkKIAotQHNjcmlwdDpweXRob24gZGVwZW5kcyBvbiAhY29udGV4dCAmJiAhcGF0Y2ggJiYgb3JnICYmICFyZXBvcnRACitAc2NyaXB0OnB5dGhvbiBkZXBlbmRzIG9uICFjb250ZXh0ICYmIG9yZyAmJiAhcmVwb3J0QAogcCA8PCByLnA7CiBwMSA8PCBpZm0ucDE7CiB4IDw8IGlmbS5FOwpAQCAtMTIwLDcgKzEwOSw3IEBACiBjb2NjaS5wcmludF9tYWluKG1zZ19zYWZlLHApCiBjb2NjaS5pbmNsdWRlX21hdGNoKEZhbHNlKQogCi1AcyBkZXBlbmRzIG9uICFjb250ZXh0ICYmICFwYXRjaCAmJiAob3JnIHx8IHJlcG9ydCkgZXhpc3RzQAorQHMgZGVwZW5kcyBvbiAhY29udGV4dCAmJiAob3JnIHx8IHJlcG9ydCkgZXhpc3RzQAogZXhwcmVzc2lvbiBzdWJFIDw9IGlmbS5FOwogZXhwcmVzc2lvbiAqaWZtLkU7CiBleHByZXNzaW9uIEUxLEUyOwpAQCAtMTU5LDcgKzE0OCw3IEBACiB9CiBlbHNlIFMzCiAKLUBzY3JpcHQ6cHl0aG9uIGRlcGVuZHMgb24gIWNvbnRleHQgJiYgIXBhdGNoICYmICFvcmcgJiYgcmVwb3J0QAorQHNjcmlwdDpweXRob24gZGVwZW5kcyBvbiAhY29udGV4dCAmJiAhb3JnICYmIHJlcG9ydEAKIHAgPDwgcy5wOwogcDEgPDwgaWZtLnAxOwogeCA8PCBpZm0uRTsKQEAgLTE2OCw3ICsxNTcsNyBAQAogbXNnPSJFUlJPUjogJXMgaXMgTlVMTCBidXQgZGVyZWZlcmVuY2VkLiIgJSAoeCkKIGNvY2NpbGliLnJlcG9ydC5wcmludF9yZXBvcnQocFswXSwgbXNnKQogCi1Ac2NyaXB0OnB5dGhvbiBkZXBlbmRzIG9uICFjb250ZXh0ICYmICFwYXRjaCAmJiBvcmcgJiYgIXJlcG9ydEAKK0BzY3JpcHQ6cHl0aG9uIGRlcGVuZHMgb24gIWNvbnRleHQgJiYgb3JnICYmICFyZXBvcnRACiBwIDw8IHMucDsKIHAxIDw8IGlmbS5wMTsKIHggPDwgaWZtLkU7CkBAIC0xODAsNyArMTY5LDcgQEAKIAogLy8gRm9yIGNvbnRleHQgbW9kZQogCi1AZGVwZW5kcyBvbiBjb250ZXh0ICYmICFwYXRjaCAmJiAhb3JnICYmICFyZXBvcnQgZXhpc3RzQAorQGRlcGVuZHMgb24gY29udGV4dCAmJiAhb3JnICYmICFyZXBvcnQgZXhpc3RzQAogZXhwcmVzc2lvbiBzdWJFIDw9IGlmbS5FOwogZXhwcmVzc2lvbiAqaWZtLkU7CiBleHByZXNzaW9uIEUxLEUyOwpAQCAtMjIzLDcgKzIxMiw3IEBACiAvLyBUaGUgZm9sbG93aW5nIHRocmVlIHJ1bGVzIGFyZSBkdXBsaWNhdGVzIG9mIGlmbSwgcHIxIGFuZCBwcjIgcmVzcGVjdGl2ZWx5LgogLy8gSXQgaXMgbmVlZCBiZWNhdXNlIHRoZSBwcmV2aW91cyBydWxlIGFzIGFscmVhZHkgbWFkZSBhICJjaGFuZ2UiLgogCi1AaWZtMSBkZXBlbmRzIG9uICFwYXRjaEAKK0BpZm0xQAogZXhwcmVzc2lvbiAqRTsKIHN0YXRlbWVudCBTMSxTMjsKIHBvc2l0aW9uIHAxOwpAQCAtMjMxLDcgKzIyMCw3IEBACiAKIGlmQHAxICgoRSA9PSBOVUxMICYmIC4uLikgfHwgLi4uKSBTMSBlbHNlIFMyCiAKLUBwcjExIGRlcGVuZHMgb24gIXBhdGNoIGV4cHJlc3Npb25ACitAcHIxMSBleHByZXNzaW9uQAogZXhwcmVzc2lvbiAqaWZtMS5FOwogaWRlbnRpZmllciBmOwogcG9zaXRpb24gcDE7CkBAIC0yMzksNyArMjI4LDcgQEAKIAogIChFICE9IE5VTEwgJiYgLi4uKSA/IDwrLi4uRS0+ZkBwMS4uLis+IDogLi4uCiAKLUBwcjEyIGRlcGVuZHMgb24gIXBhdGNoIGV4cHJlc3Npb25ACitAcHIxMiBleHByZXNzaW9uQAogZXhwcmVzc2lvbiAqaWZtMS5FOwogaWRlbnRpZmllciBmOwogcG9zaXRpb24gcDI7CkBAIC0yNTMsNyArMjQyLDcgQEAKICBzaXplb2YoPCsuLi5FLT5mQHAyLi4uKz4pCiApCiAKLUBkZXBlbmRzIG9uIGNvbnRleHQgJiYgIXBhdGNoICYmICFvcmcgJiYgIXJlcG9ydCBleGlzdHNACitAZGVwZW5kcyBvbiBjb250ZXh0ICYmICFvcmcgJiYgIXJlcG9ydCBleGlzdHNACiBleHByZXNzaW9uIHN1YkUgPD0gaWZtMS5FOwogZXhwcmVzc2lvbiAqaWZtMS5FOwogZXhwcmVzc2lvbiBFMSxFMjsKZGlmZiAtLWdpdCBhL3NjcmlwdHMvY29uZmlnIGIvc2NyaXB0cy9jb25maWcKaW5kZXggNjA4ZDdmZC4uYTdjN2M0YiAxMDA3NTUKLS0tIGEvc2NyaXB0cy9jb25maWcKKysrIGIvc2NyaXB0cy9jb25maWcKQEAgLTEwLDggKzEwLDEwIEBACiAJLS1lbmFibGV8LWUgb3B0aW9uICAgRW5hYmxlIG9wdGlvbgogCS0tZGlzYWJsZXwtZCBvcHRpb24gIERpc2FibGUgb3B0aW9uCiAJLS1tb2R1bGV8LW0gb3B0aW9uICAgVHVybiBvcHRpb24gaW50byBhIG1vZHVsZQotCS0tc2V0LXN0ciBvcHRpb24gdmFsdWUKLQkgICAgICAgICAgICAgICAgICAgICBTZXQgb3B0aW9uIHRvICJ2YWx1ZSIKKwktLXNldC1zdHIgb3B0aW9uIHN0cmluZworCSAgICAgICAgICAgICAgICAgICAgIFNldCBvcHRpb24gdG8gInN0cmluZyIKKwktLXNldC12YWwgb3B0aW9uIHZhbHVlCisJICAgICAgICAgICAgICAgICAgICAgU2V0IG9wdGlvbiB0byB2YWx1ZQogCS0tc3RhdGV8LXMgb3B0aW9uICAgIFByaW50IHN0YXRlIG9mIG9wdGlvbiAobix5LG0sdW5kZWYpCiAKIAktLWVuYWJsZS1hZnRlcnwtRSBiZWZvcmVvcHQgb3B0aW9uCkBAIC04Niw3ICs4OCw3IEBACiAJCUI9JEFSRwogCQlzaGlmdCAyCiAJCTs7Ci0JLS0qKQorCS0qKQogCQljaGVja2FyZyAiJDEiCiAJCXNoaWZ0CiAJCTs7CkBAIC0xMDksNiArMTExLDExIEBACiAJCXNoaWZ0CiAJCTs7CiAKKwktLXNldC12YWwpCisJCXNldF92YXIgIkNPTkZJR18kQVJHIiAiQ09ORklHXyRBUkc9JDEiCisJCXNoaWZ0CisJCTs7CisKIAktLXN0YXRlfC1zKQogCQlpZiBncmVwIC1xICIjIENPTkZJR18kQVJHIGlzIG5vdCBzZXQiICRGTiA7IHRoZW4KIAkJCWVjaG8gbgpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9kdGMvTWFrZWZpbGUgYi9zY3JpcHRzL2R0Yy9NYWtlZmlsZQppbmRleCAwMWNkYjM2Li4wNGEzMWMxIDEwMDY0NAotLS0gYS9zY3JpcHRzL2R0Yy9NYWtlZmlsZQorKysgYi9zY3JpcHRzL2R0Yy9NYWtlZmlsZQpAQCAtNCw3ICs0LDcgQEAKIGFsd2F5cwkJOj0gJChob3N0cHJvZ3MteSkKIAogZHRjLW9ianMJOj0gZHRjLm8gZmxhdHRyZWUubyBmc3RyZWUubyBkYXRhLm8gbGl2ZXRyZWUubyB0cmVlc291cmNlLm8gXAotCQkgICBzcmNwb3MubyBjaGVja3MubworCQkgICBzcmNwb3MubyBjaGVja3MubyB1dGlsLm8KIGR0Yy1vYmpzCSs9IGR0Yy1sZXhlci5sZXgubyBkdGMtcGFyc2VyLnRhYi5vCiAKICMgU291cmNlIGZpbGVzIG5lZWQgdG8gZ2V0IGF0IHRoZSB1c2Vyc3BhY2UgdmVyc2lvbiBvZiBsaWJmZHRfZW52LmggdG8gY29tcGlsZQpAQCAtMTksNiArMTksNyBAQAogSE9TVENGTEFHU19saXZldHJlZS5vIDo9ICQoSE9TVENGTEFHU19EVEMpCiBIT1NUQ0ZMQUdTX3NyY3Bvcy5vIDo9ICQoSE9TVENGTEFHU19EVEMpCiBIT1NUQ0ZMQUdTX3RyZWVzb3VyY2UubyA6PSAkKEhPU1RDRkxBR1NfRFRDKQorSE9TVENGTEFHU191dGlsLm8gOj0gJChIT1NUQ0ZMQUdTX0RUQykKIAogSE9TVENGTEFHU19kdGMtbGV4ZXIubGV4Lm8gOj0gJChIT1NUQ0ZMQUdTX0RUQykKIEhPU1RDRkxBR1NfZHRjLXBhcnNlci50YWIubyA6PSAkKEhPU1RDRkxBR1NfRFRDKQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9kdGMvY2hlY2tzLmMgYi9zY3JpcHRzL2R0Yy9jaGVja3MuYwppbmRleCA5NTQ4NTc5Li5hNjYyYTAwIDEwMDY0NAotLS0gYS9zY3JpcHRzL2R0Yy9jaGVja3MuYworKysgYi9zY3JpcHRzL2R0Yy9jaGVja3MuYwpAQCAtMjc4LDMyICsyNzgsMTEyIEBACiB9CiBQUk9QX0NIRUNLKHByb3BlcnR5X25hbWVfY2hhcnMsIFBST1BOT0RFQ0hBUlMsIEVSUk9SKTsKIAotc3RhdGljIHZvaWQgY2hlY2tfZXhwbGljaXRfcGhhbmRsZXMoc3RydWN0IGNoZWNrICpjLCBzdHJ1Y3Qgbm9kZSAqcm9vdCwKLQkJCQkJICBzdHJ1Y3Qgbm9kZSAqbm9kZSkKKyNkZWZpbmUgREVTQ0xBQkVMX0ZNVAkiJXMlcyVzJXMlcyIKKyNkZWZpbmUgREVTQ0xBQkVMX0FSR1Mobm9kZSxwcm9wLG1hcmspCQlcCisJKChtYXJrKSA/ICJ2YWx1ZSBvZiAiIDogIiIpLAkJXAorCSgocHJvcCkgPyAiJyIgOiAiIiksIFwKKwkoKHByb3ApID8gKHByb3ApLT5uYW1lIDogIiIpLCBcCisJKChwcm9wKSA/ICInIGluICIgOiAiIiksIChub2RlKS0+ZnVsbHBhdGgKKworc3RhdGljIHZvaWQgY2hlY2tfZHVwbGljYXRlX2xhYmVsKHN0cnVjdCBjaGVjayAqYywgc3RydWN0IG5vZGUgKmR0LAorCQkJCSAgY29uc3QgY2hhciAqbGFiZWwsIHN0cnVjdCBub2RlICpub2RlLAorCQkJCSAgc3RydWN0IHByb3BlcnR5ICpwcm9wLCBzdHJ1Y3QgbWFya2VyICptYXJrKQogewotCXN0cnVjdCBwcm9wZXJ0eSAqcHJvcDsKKwlzdHJ1Y3Qgbm9kZSAqb3RoZXJub2RlID0gTlVMTDsKKwlzdHJ1Y3QgcHJvcGVydHkgKm90aGVycHJvcCA9IE5VTEw7CisJc3RydWN0IG1hcmtlciAqb3RoZXJtYXJrID0gTlVMTDsKKworCW90aGVybm9kZSA9IGdldF9ub2RlX2J5X2xhYmVsKGR0LCBsYWJlbCk7CisKKwlpZiAoIW90aGVybm9kZSkKKwkJb3RoZXJwcm9wID0gZ2V0X3Byb3BlcnR5X2J5X2xhYmVsKGR0LCBsYWJlbCwgJm90aGVybm9kZSk7CisJaWYgKCFvdGhlcm5vZGUpCisJCW90aGVybWFyayA9IGdldF9tYXJrZXJfbGFiZWwoZHQsIGxhYmVsLCAmb3RoZXJub2RlLAorCQkJCQkgICAgICAgJm90aGVycHJvcCk7CisKKwlpZiAoIW90aGVybm9kZSkKKwkJcmV0dXJuOworCisJaWYgKChvdGhlcm5vZGUgIT0gbm9kZSkgfHwgKG90aGVycHJvcCAhPSBwcm9wKSB8fCAob3RoZXJtYXJrICE9IG1hcmspKQorCQlGQUlMKGMsICJEdXBsaWNhdGUgbGFiZWwgJyVzJyBvbiAiIERFU0NMQUJFTF9GTVQKKwkJICAgICAiIGFuZCAiIERFU0NMQUJFTF9GTVQsCisJCSAgICAgbGFiZWwsIERFU0NMQUJFTF9BUkdTKG5vZGUsIHByb3AsIG1hcmspLAorCQkgICAgIERFU0NMQUJFTF9BUkdTKG90aGVybm9kZSwgb3RoZXJwcm9wLCBvdGhlcm1hcmspKTsKK30KKworc3RhdGljIHZvaWQgY2hlY2tfZHVwbGljYXRlX2xhYmVsX25vZGUoc3RydWN0IGNoZWNrICpjLCBzdHJ1Y3Qgbm9kZSAqZHQsCisJCQkJICAgICAgIHN0cnVjdCBub2RlICpub2RlKQoreworCXN0cnVjdCBsYWJlbCAqbDsKKworCWZvcl9lYWNoX2xhYmVsKG5vZGUtPmxhYmVscywgbCkKKwkJY2hlY2tfZHVwbGljYXRlX2xhYmVsKGMsIGR0LCBsLT5sYWJlbCwgbm9kZSwgTlVMTCwgTlVMTCk7Cit9CitzdGF0aWMgdm9pZCBjaGVja19kdXBsaWNhdGVfbGFiZWxfcHJvcChzdHJ1Y3QgY2hlY2sgKmMsIHN0cnVjdCBub2RlICpkdCwKKwkJCQkgICAgICAgc3RydWN0IG5vZGUgKm5vZGUsIHN0cnVjdCBwcm9wZXJ0eSAqcHJvcCkKK3sKKwlzdHJ1Y3QgbWFya2VyICptID0gcHJvcC0+dmFsLm1hcmtlcnM7CisJc3RydWN0IGxhYmVsICpsOworCisJZm9yX2VhY2hfbGFiZWwocHJvcC0+bGFiZWxzLCBsKQorCQljaGVja19kdXBsaWNhdGVfbGFiZWwoYywgZHQsIGwtPmxhYmVsLCBub2RlLCBwcm9wLCBOVUxMKTsKKworCWZvcl9lYWNoX21hcmtlcl9vZl90eXBlKG0sIExBQkVMKQorCQljaGVja19kdXBsaWNhdGVfbGFiZWwoYywgZHQsIG0tPnJlZiwgbm9kZSwgcHJvcCwgbSk7Cit9CitDSEVDSyhkdXBsaWNhdGVfbGFiZWwsIE5VTEwsIGNoZWNrX2R1cGxpY2F0ZV9sYWJlbF9ub2RlLAorICAgICAgY2hlY2tfZHVwbGljYXRlX2xhYmVsX3Byb3AsIE5VTEwsIEVSUk9SKTsKKworc3RhdGljIHZvaWQgY2hlY2tfZXhwbGljaXRfcGhhbmRsZXMoc3RydWN0IGNoZWNrICpjLCBzdHJ1Y3Qgbm9kZSAqcm9vdCwKKwkJCQkgICAgc3RydWN0IG5vZGUgKm5vZGUsIHN0cnVjdCBwcm9wZXJ0eSAqcHJvcCkKK3sKKwlzdHJ1Y3QgbWFya2VyICptOwogCXN0cnVjdCBub2RlICpvdGhlcjsKIAljZWxsX3QgcGhhbmRsZTsKIAotCXByb3AgPSBnZXRfcHJvcGVydHkobm9kZSwgImxpbnV4LHBoYW5kbGUiKTsKLQlpZiAoISBwcm9wKQotCQlyZXR1cm47IC8qIE5vIHBoYW5kbGUsIHRoYXQncyBmaW5lICovCisJaWYgKCFzdHJlcShwcm9wLT5uYW1lLCAicGhhbmRsZSIpCisJICAgICYmICFzdHJlcShwcm9wLT5uYW1lLCAibGludXgscGhhbmRsZSIpKQorCQlyZXR1cm47CiAKIAlpZiAocHJvcC0+dmFsLmxlbiAhPSBzaXplb2YoY2VsbF90KSkgewotCQlGQUlMKGMsICIlcyBoYXMgYmFkIGxlbmd0aCAoJWQpIGxpbnV4LHBoYW5kbGUgcHJvcGVydHkiLAotCQkgICAgIG5vZGUtPmZ1bGxwYXRoLCBwcm9wLT52YWwubGVuKTsKKwkJRkFJTChjLCAiJXMgaGFzIGJhZCBsZW5ndGggKCVkKSAlcyBwcm9wZXJ0eSIsCisJCSAgICAgbm9kZS0+ZnVsbHBhdGgsIHByb3AtPnZhbC5sZW4sIHByb3AtPm5hbWUpOworCQlyZXR1cm47CisJfQorCisJbSA9IHByb3AtPnZhbC5tYXJrZXJzOworCWZvcl9lYWNoX21hcmtlcl9vZl90eXBlKG0sIFJFRl9QSEFORExFKSB7CisJCWFzc2VydChtLT5vZmZzZXQgPT0gMCk7CisJCWlmIChub2RlICE9IGdldF9ub2RlX2J5X3JlZihyb290LCBtLT5yZWYpKQorCQkJLyogIlNldCB0aGlzIG5vZGUncyBwaGFuZGxlIGVxdWFsIHRvIHNvbWUKKwkJCSAqIG90aGVyIG5vZGUncyBwaGFuZGxlIi4gIFRoYXQncyBub25zZW5zaWNhbAorCQkJICogYnkgY29uc3RydWN0aW9uLiAqLyB7CisJCQlGQUlMKGMsICIlcyBpbiAlcyBpcyBhIHJlZmVyZW5jZSB0byBhbm90aGVyIG5vZGUiLAorCQkJICAgICBwcm9wLT5uYW1lLCBub2RlLT5mdWxscGF0aCk7CisJCQlyZXR1cm47CisJCX0KKwkJLyogQnV0IHNldHRpbmcgdGhpcyBub2RlJ3MgcGhhbmRsZSBlcXVhbCB0byBpdHMgb3duCisJCSAqIHBoYW5kbGUgaXMgYWxsb3dlZCAtIHRoYXQgbWVhbnMgYWxsb2NhdGUgYSB1bmlxdWUKKwkJICogcGhhbmRsZSBmb3IgdGhpcyBub2RlLCBldmVuIGlmIGl0J3Mgbm90IG90aGVyd2lzZQorCQkgKiByZWZlcmVuY2VkLiAgVGhlIHZhbHVlIHdpbGwgYmUgZmlsbGVkIGluIGxhdGVyLCBzbworCQkgKiBubyBmdXJ0aGVyIGNoZWNraW5nIGZvciBub3cuICovCiAJCXJldHVybjsKIAl9CiAKIAlwaGFuZGxlID0gcHJvcHZhbF9jZWxsKHByb3ApOworCiAJaWYgKChwaGFuZGxlID09IDApIHx8IChwaGFuZGxlID09IC0xKSkgewotCQlGQUlMKGMsICIlcyBoYXMgaW52YWxpZCBsaW51eCxwaGFuZGxlIHZhbHVlIDB4JXgiLAotCQkgICAgIG5vZGUtPmZ1bGxwYXRoLCBwaGFuZGxlKTsKKwkJRkFJTChjLCAiJXMgaGFzIGJhZCB2YWx1ZSAoMHgleCkgaW4gJXMgcHJvcGVydHkiLAorCQkgICAgIG5vZGUtPmZ1bGxwYXRoLCBwaGFuZGxlLCBwcm9wLT5uYW1lKTsKIAkJcmV0dXJuOwogCX0KIAorCWlmIChub2RlLT5waGFuZGxlICYmIChub2RlLT5waGFuZGxlICE9IHBoYW5kbGUpKQorCQlGQUlMKGMsICIlcyBoYXMgJXMgcHJvcGVydHkgd2hpY2ggcmVwbGFjZXMgZXhpc3RpbmcgcGhhbmRsZSBpbmZvcm1hdGlvbiIsCisJCSAgICAgbm9kZS0+ZnVsbHBhdGgsIHByb3AtPm5hbWUpOworCiAJb3RoZXIgPSBnZXRfbm9kZV9ieV9waGFuZGxlKHJvb3QsIHBoYW5kbGUpOwotCWlmIChvdGhlcikgeworCWlmIChvdGhlciAmJiAob3RoZXIgIT0gbm9kZSkpIHsKIAkJRkFJTChjLCAiJXMgaGFzIGR1cGxpY2F0ZWQgcGhhbmRsZSAweCV4IChzZWVuIGJlZm9yZSBhdCAlcykiLAogCQkgICAgIG5vZGUtPmZ1bGxwYXRoLCBwaGFuZGxlLCBvdGhlci0+ZnVsbHBhdGgpOwogCQlyZXR1cm47CkBAIC0zMTEsNyArMzkxLDcgQEAKIAogCW5vZGUtPnBoYW5kbGUgPSBwaGFuZGxlOwogfQotTk9ERV9DSEVDSyhleHBsaWNpdF9waGFuZGxlcywgTlVMTCwgRVJST1IpOworUFJPUF9DSEVDSyhleHBsaWNpdF9waGFuZGxlcywgTlVMTCwgRVJST1IpOwogCiBzdGF0aWMgdm9pZCBjaGVja19uYW1lX3Byb3BlcnRpZXMoc3RydWN0IGNoZWNrICpjLCBzdHJ1Y3Qgbm9kZSAqcm9vdCwKIAkJCQkgIHN0cnVjdCBub2RlICpub2RlKQpAQCAtNTQ5LDYgKzYyOSw5IEBACiAJJmR1cGxpY2F0ZV9ub2RlX25hbWVzLCAmZHVwbGljYXRlX3Byb3BlcnR5X25hbWVzLAogCSZub2RlX25hbWVfY2hhcnMsICZub2RlX25hbWVfZm9ybWF0LCAmcHJvcGVydHlfbmFtZV9jaGFycywKIAkmbmFtZV9pc19zdHJpbmcsICZuYW1lX3Byb3BlcnRpZXMsCisKKwkmZHVwbGljYXRlX2xhYmVsLAorCiAJJmV4cGxpY2l0X3BoYW5kbGVzLAogCSZwaGFuZGxlX3JlZmVyZW5jZXMsICZwYXRoX3JlZmVyZW5jZXMsCiAKZGlmZiAtLWdpdCBhL3NjcmlwdHMvZHRjL2R0Yy1sZXhlci5sIGIvc2NyaXB0cy9kdGMvZHRjLWxleGVyLmwKaW5kZXggYTYyN2JiZS4uZTg2NmVhNSAxMDA2NDQKLS0tIGEvc2NyaXB0cy9kdGMvZHRjLWxleGVyLmwKKysrIGIvc2NyaXB0cy9kdGMvZHRjLWxleGVyLmwKQEAgLTE4LDcgKzE4LDcgQEAKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTQQogICovCiAKLSVvcHRpb24gbm95eXdyYXAgbm9pbnB1dCBub3VucHV0IHl5bGluZW5vCislb3B0aW9uIG5veXl3cmFwIG5vdW5wdXQgbm9pbnB1dCBuZXZlci1pbnRlcmFjdGl2ZQogCiAleCBJTkNMVURFCiAleCBCWVRFU1RSSU5HCkBAIC0zOCw2ICszOCwxMyBAQAogI2luY2x1ZGUgInNyY3Bvcy5oIgogI2luY2x1ZGUgImR0Yy1wYXJzZXIudGFiLmgiCiAKK1lZTFRZUEUgeXlsbG9jOworCisvKiBDQVVUSU9OOiB0aGlzIHdpbGwgc3RvcCB3b3JraW5nIGlmIHdlIGV2ZXIgdXNlIHl5bGVzcygpIG9yIHl5dW5wdXQoKSAqLworI2RlZmluZQlZWV9VU0VSX0FDVElPTiBcCisJeyBcCisJCXNyY3Bvc191cGRhdGUoJnl5bGxvYywgeXl0ZXh0LCB5eWxlbmcpOyBcCisJfQogCiAvKiNkZWZpbmUgTEVYREVCVUcJMSovCiAKQEAgLTQ3LDE1ICs1NCwxMCBAQAogI2RlZmluZSBEUFJJTlQoZm10LCAuLi4pCWRvIHsgfSB3aGlsZSAoMCkKICNlbmRpZgogCi1zdGF0aWMgaW50IGR0c192ZXJzaW9uOyAvKiA9IDAgKi8KK3N0YXRpYyBpbnQgZHRzX3ZlcnNpb24gPSAxOwogCi0jZGVmaW5lIEJFR0lOX0RFRkFVTFQoKQlpZiAoZHRzX3ZlcnNpb24gPT0gMCkgeyBcCi0JCQkJRFBSSU5UKCI8SU5JVElBTD5cbiIpOyBcCi0JCQkJQkVHSU4oSU5JVElBTCk7IFwKLQkJCX0gZWxzZSB7IFwKLQkJCQlEUFJJTlQoIjxWMT5cbiIpOyBcCisjZGVmaW5lIEJFR0lOX0RFRkFVTFQoKQkJRFBSSU5UKCI8VjE+XG4iKTsgXAogCQkJCUJFR0lOKFYxKTsgXAotCQkJfQogCiBzdGF0aWMgdm9pZCBwdXNoX2lucHV0X2ZpbGUoY29uc3QgY2hhciAqZmlsZW5hbWUpOwogc3RhdGljIGludCBwb3BfaW5wdXRfZmlsZSh2b2lkKTsKQEAgLTc1LDE4ICs3NywxMyBAQAogCQl9CiAKIDwqPntTVFJJTkd9CXsKLQkJCXl5bGxvYy5maWxlID0gc3JjcG9zX2ZpbGU7Ci0JCQl5eWxsb2MuZmlyc3RfbGluZSA9IHl5bGluZW5vOwogCQkJRFBSSU5UKCJTdHJpbmc6ICVzXG4iLCB5eXRleHQpOwogCQkJeXlsdmFsLmRhdGEgPSBkYXRhX2NvcHlfZXNjYXBlX3N0cmluZyh5eXRleHQrMSwKIAkJCQkJeXlsZW5nLTIpOwotCQkJeXlsbG9jLmZpcnN0X2xpbmUgPSB5eWxpbmVubzsKIAkJCXJldHVybiBEVF9TVFJJTkc7CiAJCX0KIAogPCo+Ii9kdHMtdjEvIgl7Ci0JCQl5eWxsb2MuZmlsZSA9IHNyY3Bvc19maWxlOwotCQkJeXlsbG9jLmZpcnN0X2xpbmUgPSB5eWxpbmVubzsKIAkJCURQUklOVCgiS2V5d29yZDogL2R0cy12MS9cbiIpOwogCQkJZHRzX3ZlcnNpb24gPSAxOwogCQkJQkVHSU5fREVGQVVMVCgpOwpAQCAtOTQsMTA2ICs5MSw1NyBAQAogCQl9CiAKIDwqPiIvbWVtcmVzZXJ2ZS8iCXsKLQkJCXl5bGxvYy5maWxlID0gc3JjcG9zX2ZpbGU7Ci0JCQl5eWxsb2MuZmlyc3RfbGluZSA9IHl5bGluZW5vOwogCQkJRFBSSU5UKCJLZXl3b3JkOiAvbWVtcmVzZXJ2ZS9cbiIpOwogCQkJQkVHSU5fREVGQVVMVCgpOwogCQkJcmV0dXJuIERUX01FTVJFU0VSVkU7CiAJCX0KIAogPCo+e0xBQkVMfToJewotCQkJeXlsbG9jLmZpbGUgPSBzcmNwb3NfZmlsZTsKLQkJCXl5bGxvYy5maXJzdF9saW5lID0geXlsaW5lbm87CiAJCQlEUFJJTlQoIkxhYmVsOiAlc1xuIiwgeXl0ZXh0KTsKLQkJCXl5bHZhbC5sYWJlbHJlZiA9IHN0cmR1cCh5eXRleHQpOworCQkJeXlsdmFsLmxhYmVscmVmID0geHN0cmR1cCh5eXRleHQpOwogCQkJeXlsdmFsLmxhYmVscmVmW3l5bGVuZy0xXSA9ICdcMCc7CiAJCQlyZXR1cm4gRFRfTEFCRUw7CiAJCX0KIAotPElOSVRJQUw+W2JvZGhdIyB7Ci0JCQl5eWxsb2MuZmlsZSA9IHNyY3Bvc19maWxlOwotCQkJeXlsbG9jLmZpcnN0X2xpbmUgPSB5eWxpbmVubzsKLQkJCWlmICgqeXl0ZXh0ID09ICdiJykKLQkJCQl5eWx2YWwuY2Jhc2UgPSAyOwotCQkJZWxzZSBpZiAoKnl5dGV4dCA9PSAnbycpCi0JCQkJeXlsdmFsLmNiYXNlID0gODsKLQkJCWVsc2UgaWYgKCp5eXRleHQgPT0gJ2QnKQotCQkJCXl5bHZhbC5jYmFzZSA9IDEwOwotCQkJZWxzZQotCQkJCXl5bHZhbC5jYmFzZSA9IDE2OwotCQkJRFBSSU5UKCJCYXNlOiAlZFxuIiwgeXlsdmFsLmNiYXNlKTsKLQkJCXJldHVybiBEVF9CQVNFOwotCQl9Ci0KLTxJTklUSUFMPlswLTlhLWZBLUZdKwl7Ci0JCQl5eWxsb2MuZmlsZSA9IHNyY3Bvc19maWxlOwotCQkJeXlsbG9jLmZpcnN0X2xpbmUgPSB5eWxpbmVubzsKLQkJCXl5bHZhbC5saXRlcmFsID0gc3RyZHVwKHl5dGV4dCk7Ci0JCQlEUFJJTlQoIkxpdGVyYWw6ICclcydcbiIsIHl5bHZhbC5saXRlcmFsKTsKLQkJCXJldHVybiBEVF9MRUdBQ1lMSVRFUkFMOwotCQl9Ci0KIDxWMT5bMC05XSt8MFt4WF1bMC05YS1mQS1GXSsgICAgICB7Ci0JCQl5eWxsb2MuZmlsZSA9IHNyY3Bvc19maWxlOwotCQkJeXlsbG9jLmZpcnN0X2xpbmUgPSB5eWxpbmVubzsKLQkJCXl5bHZhbC5saXRlcmFsID0gc3RyZHVwKHl5dGV4dCk7CisJCQl5eWx2YWwubGl0ZXJhbCA9IHhzdHJkdXAoeXl0ZXh0KTsKIAkJCURQUklOVCgiTGl0ZXJhbDogJyVzJ1xuIiwgeXlsdmFsLmxpdGVyYWwpOwogCQkJcmV0dXJuIERUX0xJVEVSQUw7CiAJCX0KIAotXCZ7TEFCRUx9CXsJLyogbGFiZWwgcmVmZXJlbmNlICovCi0JCQl5eWxsb2MuZmlsZSA9IHNyY3Bvc19maWxlOwotCQkJeXlsbG9jLmZpcnN0X2xpbmUgPSB5eWxpbmVubzsKKzwqPlwme0xBQkVMfQl7CS8qIGxhYmVsIHJlZmVyZW5jZSAqLwogCQkJRFBSSU5UKCJSZWY6ICVzXG4iLCB5eXRleHQrMSk7Ci0JCQl5eWx2YWwubGFiZWxyZWYgPSBzdHJkdXAoeXl0ZXh0KzEpOworCQkJeXlsdmFsLmxhYmVscmVmID0geHN0cmR1cCh5eXRleHQrMSk7CiAJCQlyZXR1cm4gRFRfUkVGOwogCQl9CiAKLSImey8ie1BBVEhDSEFSfStcfQl7CS8qIG5ldy1zdHlsZSBwYXRoIHJlZmVyZW5jZSAqLwotCQkJeXlsbG9jLmZpbGUgPSBzcmNwb3NfZmlsZTsKLQkJCXl5bGxvYy5maXJzdF9saW5lID0geXlsaW5lbm87Cis8Kj4iJnsvIntQQVRIQ0hBUn0rXH0JewkvKiBuZXctc3R5bGUgcGF0aCByZWZlcmVuY2UgKi8KIAkJCXl5dGV4dFt5eWxlbmctMV0gPSAnXDAnOwogCQkJRFBSSU5UKCJSZWY6ICVzXG4iLCB5eXRleHQrMik7Ci0JCQl5eWx2YWwubGFiZWxyZWYgPSBzdHJkdXAoeXl0ZXh0KzIpOwotCQkJcmV0dXJuIERUX1JFRjsKLQkJfQotCi08SU5JVElBTD4iJi8ie1BBVEhDSEFSfSsgewkvKiBvbGQtc3R5bGUgcGF0aCByZWZlcmVuY2UgKi8KLQkJCXl5bGxvYy5maWxlID0gc3JjcG9zX2ZpbGU7Ci0JCQl5eWxsb2MuZmlyc3RfbGluZSA9IHl5bGluZW5vOwotCQkJRFBSSU5UKCJSZWY6ICVzXG4iLCB5eXRleHQrMSk7Ci0JCQl5eWx2YWwubGFiZWxyZWYgPSBzdHJkdXAoeXl0ZXh0KzEpOworCQkJeXlsdmFsLmxhYmVscmVmID0geHN0cmR1cCh5eXRleHQrMik7CiAJCQlyZXR1cm4gRFRfUkVGOwogCQl9CiAKIDxCWVRFU1RSSU5HPlswLTlhLWZBLUZdezJ9IHsKLQkJCXl5bGxvYy5maWxlID0gc3JjcG9zX2ZpbGU7Ci0JCQl5eWxsb2MuZmlyc3RfbGluZSA9IHl5bGluZW5vOwogCQkJeXlsdmFsLmJ5dGUgPSBzdHJ0b2woeXl0ZXh0LCBOVUxMLCAxNik7CiAJCQlEUFJJTlQoIkJ5dGU6ICUwMnhcbiIsIChpbnQpeXlsdmFsLmJ5dGUpOwogCQkJcmV0dXJuIERUX0JZVEU7CiAJCX0KIAogPEJZVEVTVFJJTkc+Il0iCXsKLQkJCXl5bGxvYy5maWxlID0gc3JjcG9zX2ZpbGU7Ci0JCQl5eWxsb2MuZmlyc3RfbGluZSA9IHl5bGluZW5vOwogCQkJRFBSSU5UKCIvQllURVNUUklOR1xuIik7CiAJCQlCRUdJTl9ERUZBVUxUKCk7CiAJCQlyZXR1cm4gJ10nOwogCQl9CiAKIDxQUk9QTk9ERU5BTUU+e1BST1BOT0RFQ0hBUn0rIHsKLQkJCXl5bGxvYy5maWxlID0gc3JjcG9zX2ZpbGU7Ci0JCQl5eWxsb2MuZmlyc3RfbGluZSA9IHl5bGluZW5vOwogCQkJRFBSSU5UKCJQcm9wTm9kZU5hbWU6ICVzXG4iLCB5eXRleHQpOwotCQkJeXlsdmFsLnByb3Bub2RlbmFtZSA9IHN0cmR1cCh5eXRleHQpOworCQkJeXlsdmFsLnByb3Bub2RlbmFtZSA9IHhzdHJkdXAoeXl0ZXh0KTsKIAkJCUJFR0lOX0RFRkFVTFQoKTsKIAkJCXJldHVybiBEVF9QUk9QTk9ERU5BTUU7CiAJCX0KIAogIi9pbmNiaW4vIgl7Ci0JCQl5eWxsb2MuZmlsZSA9IHNyY3Bvc19maWxlOwotCQkJeXlsbG9jLmZpcnN0X2xpbmUgPSB5eWxpbmVubzsKIAkJCURQUklOVCgiQmluYXJ5IEluY2x1ZGVcbiIpOwogCQkJcmV0dXJuIERUX0lOQ0JJTjsKIAkJfQpAQCAtMjAzLDggKzE1MSw2IEBACiA8Kj57TElORUNPTU1FTlR9KyAvKiBlYXQgQysrLXN0eWxlIGNvbW1lbnRzICovCiAKIDwqPi4JCXsKLQkJCXl5bGxvYy5maWxlID0gc3JjcG9zX2ZpbGU7Ci0JCQl5eWxsb2MuZmlyc3RfbGluZSA9IHl5bGluZW5vOwogCQkJRFBSSU5UKCJDaGFyOiAlYyAoXFx4JTAyeClcbiIsIHl5dGV4dFswXSwKIAkJCQkodW5zaWduZWQpeXl0ZXh0WzBdKTsKIAkJCWlmICh5eXRleHRbMF0gPT0gJ1snKSB7CkBAIC0yMjEsMTAwICsxNjcsMjUgQEAKIAogJSUKIAotCi0vKgotICogU3RhY2sgb2YgbmVzdGVkIGluY2x1ZGUgZmlsZSBjb250ZXh0cy4KLSAqLwotCi1zdHJ1Y3QgaW5jbF9maWxlIHsKLQlzdHJ1Y3QgZHRjX2ZpbGUgKmZpbGU7Ci0JWVlfQlVGRkVSX1NUQVRFIHl5X3ByZXZfYnVmOwotCWludCB5eV9wcmV2X2xpbmVubzsKLQlzdHJ1Y3QgaW5jbF9maWxlICpwcmV2OwotfTsKLQotc3RhdGljIHN0cnVjdCBpbmNsX2ZpbGUgKmluY2xfZmlsZV9zdGFjazsKLQotCi0vKgotICogRGV0ZWN0IGluZmluaXRlIGluY2x1ZGUgcmVjdXJzaW9uLgotICovCi0jZGVmaW5lIE1BWF9JTkNMVURFX0RFUFRICSgxMDApCi0KLXN0YXRpYyBpbnQgaW5jbF9kZXB0aCA9IDA7Ci0KLQogc3RhdGljIHZvaWQgcHVzaF9pbnB1dF9maWxlKGNvbnN0IGNoYXIgKmZpbGVuYW1lKQogewotCXN0cnVjdCBpbmNsX2ZpbGUgKmluY2xfZmlsZTsKLQlzdHJ1Y3QgZHRjX2ZpbGUgKm5ld2ZpbGU7Ci0Jc3RydWN0IHNlYXJjaF9wYXRoIHNlYXJjaCwgKnNlYXJjaHB0ciA9IE5VTEw7Ci0KIAlhc3NlcnQoZmlsZW5hbWUpOwogCi0JaWYgKGluY2xfZGVwdGgrKyA+PSBNQVhfSU5DTFVERV9ERVBUSCkKLQkJZGllKCJJbmNsdWRlcyBuZXN0ZWQgdG9vIGRlZXBseSIpOworCXNyY2ZpbGVfcHVzaChmaWxlbmFtZSk7CiAKLQlpZiAoc3JjcG9zX2ZpbGUpIHsKLQkJc2VhcmNoLmRpciA9IHNyY3Bvc19maWxlLT5kaXI7Ci0JCXNlYXJjaC5uZXh0ID0gTlVMTDsKLQkJc2VhcmNoLnByZXYgPSBOVUxMOwotCQlzZWFyY2hwdHIgPSAmc2VhcmNoOwotCX0KKwl5eWluID0gY3VycmVudF9zcmNmaWxlLT5mOwogCi0JbmV3ZmlsZSA9IGR0Y19vcGVuX2ZpbGUoZmlsZW5hbWUsIHNlYXJjaHB0cik7Ci0KLQlpbmNsX2ZpbGUgPSB4bWFsbG9jKHNpemVvZihzdHJ1Y3QgaW5jbF9maWxlKSk7Ci0KLQkvKgotCSAqIFNhdmUgY3VycmVudCBjb250ZXh0LgotCSAqLwotCWluY2xfZmlsZS0+eXlfcHJldl9idWYgPSBZWV9DVVJSRU5UX0JVRkZFUjsKLQlpbmNsX2ZpbGUtPnl5X3ByZXZfbGluZW5vID0geXlsaW5lbm87Ci0JaW5jbF9maWxlLT5maWxlID0gc3JjcG9zX2ZpbGU7Ci0JaW5jbF9maWxlLT5wcmV2ID0gaW5jbF9maWxlX3N0YWNrOwotCi0JaW5jbF9maWxlX3N0YWNrID0gaW5jbF9maWxlOwotCi0JLyoKLQkgKiBFc3RhYmxpc2ggbmV3IGNvbnRleHQuCi0JICovCi0Jc3JjcG9zX2ZpbGUgPSBuZXdmaWxlOwotCXl5bGluZW5vID0gMTsKLQl5eWluID0gbmV3ZmlsZS0+ZmlsZTsKLQl5eV9zd2l0Y2hfdG9fYnVmZmVyKHl5X2NyZWF0ZV9idWZmZXIoeXlpbiwgWVlfQlVGX1NJWkUpKTsKKwl5eXB1c2hfYnVmZmVyX3N0YXRlKHl5X2NyZWF0ZV9idWZmZXIoeXlpbiwgWVlfQlVGX1NJWkUpKTsKIH0KIAogCiBzdGF0aWMgaW50IHBvcF9pbnB1dF9maWxlKHZvaWQpCiB7Ci0Jc3RydWN0IGluY2xfZmlsZSAqaW5jbF9maWxlOwotCi0JaWYgKGluY2xfZmlsZV9zdGFjayA9PSAwKQorCWlmIChzcmNmaWxlX3BvcCgpID09IDApCiAJCXJldHVybiAwOwogCi0JZHRjX2Nsb3NlX2ZpbGUoc3JjcG9zX2ZpbGUpOwotCi0JLyoKLQkgKiBQb3AuCi0JICovCi0JLS1pbmNsX2RlcHRoOwotCWluY2xfZmlsZSA9IGluY2xfZmlsZV9zdGFjazsKLQlpbmNsX2ZpbGVfc3RhY2sgPSBpbmNsX2ZpbGUtPnByZXY7Ci0KLQkvKgotCSAqIFJlY292ZXIgb2xkIGNvbnRleHQuCi0JICovCi0JeXlfZGVsZXRlX2J1ZmZlcihZWV9DVVJSRU5UX0JVRkZFUik7Ci0JeXlfc3dpdGNoX3RvX2J1ZmZlcihpbmNsX2ZpbGUtPnl5X3ByZXZfYnVmKTsKLQl5eWxpbmVubyA9IGluY2xfZmlsZS0+eXlfcHJldl9saW5lbm87Ci0Jc3JjcG9zX2ZpbGUgPSBpbmNsX2ZpbGUtPmZpbGU7Ci0JeXlpbiA9IGluY2xfZmlsZS0+ZmlsZSA/IGluY2xfZmlsZS0+ZmlsZS0+ZmlsZSA6IE5VTEw7Ci0KLQkvKgotCSAqIEZyZWUgb2xkIHN0YXRlLgotCSAqLwotCWZyZWUoaW5jbF9maWxlKTsKKwl5eXBvcF9idWZmZXJfc3RhdGUoKTsKKwl5eWluID0gY3VycmVudF9zcmNmaWxlLT5mOwogCiAJcmV0dXJuIDE7CiB9CmRpZmYgLS1naXQgYS9zY3JpcHRzL2R0Yy9kdGMtbGV4ZXIubGV4LmNfc2hpcHBlZCBiL3NjcmlwdHMvZHRjL2R0Yy1sZXhlci5sZXguY19zaGlwcGVkCmluZGV4IGUyN2NjNjMuLjUwYzQ0MjAgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMvZHRjL2R0Yy1sZXhlci5sZXguY19zaGlwcGVkCisrKyBiL3NjcmlwdHMvZHRjL2R0Yy1sZXhlci5sZXguY19zaGlwcGVkCkBAIC0xNzAsMjAgKzE3MCw3IEBACiAjZGVmaW5lIEVPQl9BQ1RfRU5EX09GX0ZJTEUgMQogI2RlZmluZSBFT0JfQUNUX0xBU1RfTUFUQ0ggMgogCi0gICAgLyogTm90ZTogV2Ugc3BlY2lmaWNhbGx5IG9taXQgdGhlIHRlc3QgZm9yIHl5X3J1bGVfY2FuX21hdGNoX2VvbCBiZWNhdXNlIGl0IHJlcXVpcmVzCi0gICAgICogICAgICAgYWNjZXNzIHRvIHRoZSBsb2NhbCB2YXJpYWJsZSB5eV9hY3QuIFNpbmNlIHl5bGVzcygpIGlzIGEgbWFjcm8sIGl0IHdvdWxkIGJyZWFrCi0gICAgICogICAgICAgZXhpc3Rpbmcgc2Nhbm5lcnMgdGhhdCBjYWxsIHl5bGVzcygpIGZyb20gT1VUU0lERSB5eWxleC4gCi0gICAgICogICAgICAgT25lIG9idmlvdXMgc29sdXRpb24gaXQgdG8gbWFrZSB5eV9hY3QgYSBnbG9iYWwuIEkgdHJpZWQgdGhhdCwgYW5kIHNhdwotICAgICAqICAgICAgIGEgNSUgcGVyZm9ybWFuY2UgaGl0IGluIGEgbm9uLXl5bGluZW5vIHNjYW5uZXIsIGJlY2F1c2UgeXlfYWN0IGlzCi0gICAgICogICAgICAgbm9ybWFsbHkgZGVjbGFyZWQgYXMgYSByZWdpc3RlciB2YXJpYWJsZS0tIHNvIGl0IGlzIG5vdCB3b3J0aCBpdC4KLSAgICAgKi8KLSAgICAjZGVmaW5lICBZWV9MRVNTX0xJTkVOTyhuKSBcCi0gICAgICAgICAgICBkbyB7IFwKLSAgICAgICAgICAgICAgICBpbnQgeXlsO1wKLSAgICAgICAgICAgICAgICBmb3IgKCB5eWwgPSBuOyB5eWwgPCB5eWxlbmc7ICsreXlsIClcCi0gICAgICAgICAgICAgICAgICAgIGlmICggeXl0ZXh0W3l5bF0gPT0gJ1xuJyApXAotICAgICAgICAgICAgICAgICAgICAgICAgLS15eWxpbmVubztcCi0gICAgICAgICAgICB9d2hpbGUoMCkKKyAgICAjZGVmaW5lIFlZX0xFU1NfTElORU5PKG4pCiAgICAgCiAvKiBSZXR1cm4gYWxsIGJ1dCB0aGUgZmlyc3QgIm4iIG1hdGNoZWQgY2hhcmFjdGVycyBiYWNrIHRvIHRoZSBpbnB1dCBzdHJlYW0uICovCiAjZGVmaW5lIHl5bGVzcyhuKSBcCkBAIC0zODUsOCArMzcyLDggQEAKIAkqeXlfY3AgPSAnXDAnOyBcCiAJKHl5X2NfYnVmX3ApID0geXlfY3A7CiAKLSNkZWZpbmUgWVlfTlVNX1JVTEVTIDIwCi0jZGVmaW5lIFlZX0VORF9PRl9CVUZGRVIgMjEKKyNkZWZpbmUgWVlfTlVNX1JVTEVTIDE3CisjZGVmaW5lIFlZX0VORF9PRl9CVUZGRVIgMTgKIC8qIFRoaXMgc3RydWN0IGlzIG5vdCB1c2VkIGluIHRoaXMgc2Nhbm5lciwKICAgIGJ1dCBpdHMgcHJlc2VuY2UgaXMgbmVjZXNzYXJ5LiAqLwogc3RydWN0IHl5X3RyYW5zX2luZm8KQEAgLTM5NCwyMCArMzgxLDE5IEBACiAJZmxleF9pbnQzMl90IHl5X3ZlcmlmeTsKIAlmbGV4X2ludDMyX3QgeXlfbnh0OwogCX07Ci1zdGF0aWMgeXljb25zdCBmbGV4X2ludDE2X3QgeXlfYWNjZXB0WzEwNF0gPQorc3RhdGljIHl5Y29uc3QgZmxleF9pbnQxNl90IHl5X2FjY2VwdFs5NF0gPQogICAgIHsgICAwLAogICAgICAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLAotICAgICAgIDIxLCAgIDE5LCAgIDE2LCAgIDE2LCAgIDE5LCAgIDE5LCAgIDE5LCAgICA3LCAgICA3LCAgIDE5LAotICAgICAgICA3LCAgIDE5LCAgIDE5LCAgIDE5LCAgIDE5LCAgIDEzLCAgIDE0LCAgIDE0LCAgIDE5LCAgICA4LAotICAgICAgICA4LCAgIDE2LCAgICAwLCAgICAyLCAgICAwLCAgICAwLCAgICA5LCAgICAwLCAgICAwLCAgICAwLAotICAgICAgICAwLCAgICAwLCAgICAwLCAgICA3LCAgICA3LCAgICA1LCAgICAwLCAgICA2LCAgICAwLCAgIDEyLAotICAgICAgIDEyLCAgIDE0LCAgIDE0LCAgICA4LCAgICAwLCAgIDExLCAgICA5LCAgICAwLCAgICAwLCAgICAwLAotICAgICAgICAwLCAgIDE4LCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICA4LCAgICAwLCAgIDE3LCAgICAwLAotICAgICAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgIDEwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLAotICAgICAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAzLCAgIDE1LAorICAgICAgIDE4LCAgIDE2LCAgIDEzLCAgIDEzLCAgIDE2LCAgIDE2LCAgIDE2LCAgIDE2LCAgIDE2LCAgIDE2LAorICAgICAgIDE2LCAgIDEwLCAgIDExLCAgIDExLCAgICA2LCAgICA2LCAgIDEzLCAgICAwLCAgICAyLCAgICAwLAorICAgICAgICA3LCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICA1LCAgICAwLAorICAgICAgICA5LCAgICA5LCAgIDExLCAgIDExLCAgICA2LCAgICAwLCAgICA3LCAgICAwLCAgICAwLCAgICAwLAorICAgICAgICAwLCAgIDE1LCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICA2LCAgICAwLCAgIDE0LCAgICAwLAorICAgICAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICA4LCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLAorICAgICAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAzLCAgIDEyLAogICAgICAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAxLCAgICAwLAotCiAgICAgICAgIDAsICAgIDQsICAgIDAKKwogICAgIH0gOwogCiBzdGF0aWMgeXljb25zdCBmbGV4X2ludDMyX3QgeXlfZWNbMjU2XSA9CkBAIC00MTYsMTYgKzQwMiwxNiBAQAogICAgICAgICAyLCAgICAyLCAgICAyLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLAogICAgICAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLAogICAgICAgICAxLCAgICAyLCAgICAxLCAgICA0LCAgICA1LCAgICAxLCAgICAxLCAgICA2LCAgICAxLCAgICAxLAotICAgICAgICAxLCAgICA3LCAgICA4LCAgICA4LCAgICA5LCAgICA4LCAgIDEwLCAgIDExLCAgIDEyLCAgIDEzLAotICAgICAgIDEzLCAgIDEzLCAgIDEzLCAgIDEzLCAgIDEzLCAgIDEzLCAgIDEzLCAgIDE0LCAgICAxLCAgICAxLAotICAgICAgICAxLCAgICAxLCAgICA4LCAgICA4LCAgIDE1LCAgIDE1LCAgIDE1LCAgIDE1LCAgIDE1LCAgIDE1LAotICAgICAgIDE2LCAgIDE2LCAgIDE2LCAgIDE2LCAgIDE2LCAgIDE2LCAgIDE2LCAgIDE2LCAgIDE2LCAgIDE2LAotICAgICAgIDE2LCAgIDE2LCAgIDE2LCAgIDE2LCAgIDE2LCAgIDE2LCAgIDE2LCAgIDE3LCAgIDE2LCAgIDE2LAotICAgICAgICAxLCAgIDE4LCAgIDE5LCAgICAxLCAgIDE2LCAgICAxLCAgIDE1LCAgIDIwLCAgIDIxLCAgIDIyLAorICAgICAgICAxLCAgICA3LCAgICA1LCAgICA1LCAgICA4LCAgICA1LCAgICA5LCAgIDEwLCAgIDExLCAgIDEyLAorICAgICAgIDEyLCAgIDEyLCAgIDEyLCAgIDEyLCAgIDEyLCAgIDEyLCAgIDEyLCAgIDEzLCAgICAxLCAgICAxLAorICAgICAgICAxLCAgICAxLCAgICA1LCAgICA1LCAgIDE0LCAgIDE0LCAgIDE0LCAgIDE0LCAgIDE0LCAgIDE0LAorICAgICAgIDE1LCAgIDE1LCAgIDE1LCAgIDE1LCAgIDE1LCAgIDE1LCAgIDE1LCAgIDE1LCAgIDE1LCAgIDE1LAorICAgICAgIDE1LCAgIDE1LCAgIDE1LCAgIDE1LCAgIDE1LCAgIDE1LCAgIDE1LCAgIDE2LCAgIDE1LCAgIDE1LAorICAgICAgICAxLCAgIDE3LCAgIDE4LCAgICAxLCAgIDE1LCAgICAxLCAgIDE0LCAgIDE5LCAgIDIwLCAgIDIxLAogCi0gICAgICAgMjMsICAgMTUsICAgMTYsICAgMjQsICAgMjUsICAgMTYsICAgMTYsICAgMjYsICAgMjcsICAgMjgsCi0gICAgICAgMjQsICAgMTYsICAgMTYsICAgMjksICAgMzAsICAgMzEsICAgMzIsICAgMzMsICAgMTYsICAgMTcsCi0gICAgICAgMTYsICAgMTYsICAgMzQsICAgIDEsICAgMzUsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsCisgICAgICAgMjIsICAgMTQsICAgMTUsICAgMTUsICAgMjMsICAgMTUsICAgMTUsICAgMjQsICAgMjUsICAgMjYsCisgICAgICAgMTUsICAgMTUsICAgMTUsICAgMjcsICAgMjgsICAgMjksICAgMzAsICAgMzEsICAgMTUsICAgMTYsCisgICAgICAgMTUsICAgMTUsICAgMzIsICAgIDEsICAgMzMsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsCiAgICAgICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsCiAgICAgICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsCiAgICAgICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsCkBAIC00NDIsMTM2ICs0MjgsMTE0IEBACiAgICAgICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEKICAgICB9IDsKIAotc3RhdGljIHl5Y29uc3QgZmxleF9pbnQzMl90IHl5X21ldGFbMzZdID0KK3N0YXRpYyB5eWNvbnN0IGZsZXhfaW50MzJfdCB5eV9tZXRhWzM0XSA9CiAgICAgeyAgIDAsCi0gICAgICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDIsICAgIDEsICAgIDIsICAgIDIsICAgIDIsICAgIDMsCi0gICAgICAgIDQsICAgIDQsICAgIDQsICAgIDUsICAgIDYsICAgIDcsICAgIDcsICAgIDEsICAgIDEsICAgIDYsCi0gICAgICAgIDYsICAgIDYsICAgIDYsICAgIDcsICAgIDcsICAgIDcsICAgIDcsICAgIDcsICAgIDcsICAgIDcsCi0gICAgICAgIDcsICAgIDcsICAgIDcsICAgIDgsICAgIDEKKyAgICAgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMiwgICAgMSwgICAgMiwgICAgMiwgICAgMywgICAgNCwKKyAgICAgICAgNCwgICAgNCwgICAgNSwgICAgNiwgICAgNywgICAgNywgICAgMSwgICAgMSwgICAgNiwgICAgNiwKKyAgICAgICAgNiwgICAgNiwgICAgNywgICAgNywgICAgNywgICAgNywgICAgNywgICAgNywgICAgNywgICAgNywKKyAgICAgICAgNywgICAgOCwgICAgMQogICAgIH0gOwogCi1zdGF0aWMgeXljb25zdCBmbGV4X2ludDE2X3QgeXlfYmFzZVsxMTddID0KK3N0YXRpYyB5eWNvbnN0IGZsZXhfaW50MTZfdCB5eV9iYXNlWzEwNl0gPQogICAgIHsgICAwLAotICAgICAgICAwLCAgICAwLCAgIDMwLCAgICAwLCAgIDQ0LCAgICAwLCAgIDY3LCAgICAwLCAgIDk3LCAgMTA1LAotICAgICAgMzAyLCAgMzAzLCAgIDM1LCAgIDQ0LCAgIDQwLCAgIDk0LCAgMTEyLCAgICAwLCAgMTI5LCAgMTUyLAotICAgICAgMjk2LCAgMjk1LCAgMTU5LCAgICAwLCAgMTc2LCAgMzAzLCAgICAwLCAgMTE2LCAgIDk1LCAgMTY1LAotICAgICAgIDQ5LCAgIDQ2LCAgMTAyLCAgMzAzLCAgMjk2LCAgICAwLCAgICAwLCAgMjg4LCAgMjkwLCAgMjkzLAotICAgICAgMjY0LCAgMjY2LCAgMjcwLCAgICAwLCAgICAwLCAgMzAzLCAgICAwLCAgMzAzLCAgMjY0LCAgMzAzLAotICAgICAgICAwLCAgICAwLCAgMTk1LCAgMTAxLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgMjg0LCAgMTI1LAotICAgICAgMjc3LCAgMjY1LCAgMjI1LCAgMjMwLCAgMjE2LCAgMjE4LCAgICAwLCAgMjAyLCAgMjI0LCAgMjIxLAotICAgICAgMjE3LCAgMTA3LCAgMTk2LCAgMTg4LCAgMzAzLCAgMjA2LCAgMTc5LCAgMTg2LCAgMTc4LCAgMTg1LAotICAgICAgMTgzLCAgMTYyLCAgMTYxLCAgMTUwLCAgMTY5LCAgMTYwLCAgMTQ1LCAgMTI1LCAgMzAzLCAgMzAzLAotICAgICAgMTM3LCAgMTA5LCAgMTkwLCAgMTAzLCAgMjAzLCAgMTY3LCAgMTA4LCAgMTk3LCAgMzAzLCAgMTIzLAorICAgICAgICAwLCAgICAwLCAgMjM3LCAgMjM2LCAgIDI1LCAgICAwLCAgIDQ3LCAgICAwLCAgIDMwLCAgIDcxLAorICAgICAgMjQ0LCAgMjQ3LCAgIDgyLCAgIDg0LCAgIDg0LCAgMjExLCAgIDk1LCAgMjI5LCAgMjE4LCAgICAwLAorICAgICAgMTExLCAgMjQ3LCAgICAwLCAgIDg0LCAgIDgzLCAgIDk1LCAgMTA2LCAgIDg2LCAgMjQ3LCAgMjM3LAorICAgICAgICAwLCAgMjMwLCAgMjMxLCAgMjM0LCAgMjA3LCAgMjA5LCAgMjEyLCAgMjIwLCAgMjQ3LCAgMjA2LAorICAgICAgMjQ3LCAgMjE4LCAgICAwLCAgMTA2LCAgMTE2LCAgICAwLCAgICAwLCAgICAwLCAgMjIzLCAgIDg5LAorICAgICAgMjI2LCAgMjE5LCAgMTk5LCAgMjA2LCAgMjAwLCAgMjA0LCAgICAwLCAgMTkwLCAgMjEzLCAgMjEyLAorICAgICAgMjAyLCAgIDkxLCAgMTc4LCAgMTYxLCAgMjQ3LCAgMTcyLCAgMTQ0LCAgMTUwLCAgMTQwLCAgMTMwLAorICAgICAgMTQwLCAgMTI0LCAgMTI4LCAgMTIwLCAgMTM4LCAgMTM3LCAgMTIzLCAgMTIyLCAgMjQ3LCAgMjQ3LAorICAgICAgMTM0LCAgMTE0LCAgMTMyLCAgIDg2LCAgMTM1LCAgMTI1LCAgIDkwLCAgMTM2LCAgMjQ3LCAgIDk3LAorICAgICAgIDI5LCAgMjQ3LCAgMjQ3LCAgMTUzLCAgMTU2LCAgMTYxLCAgMTY1LCAgMTcwLCAgMTc2LCAgMTgwLAogCi0gICAgICAgMjksICAzMDMsICAzMDMsICAyMTUsICAyMjEsICAyMjYsICAyMjksICAyMzQsICAyNDAsICAyNDYsCi0gICAgICAyNTAsICAyNTcsICAyNjUsICAyNzAsICAyNzUsICAyODIKKyAgICAgIDE4NywgIDE5NSwgIDIwMCwgIDIwNSwgIDIxMgogICAgIH0gOwogCi1zdGF0aWMgeXljb25zdCBmbGV4X2ludDE2X3QgeXlfZGVmWzExN10gPQorc3RhdGljIHl5Y29uc3QgZmxleF9pbnQxNl90IHl5X2RlZlsxMDZdID0KICAgICB7ICAgMCwKLSAgICAgIDEwMywgICAgMSwgICAgMSwgICAgMywgICAgMywgICAgNSwgIDEwMywgICAgNywgICAgMywgICAgMywKLSAgICAgIDEwMywgIDEwMywgIDEwMywgIDEwMywgIDEwNCwgIDEwNSwgIDEwMywgIDEwNiwgIDEwMywgICAxOSwKLSAgICAgICAxOSwgICAyMCwgIDEwMywgIDEwNywgICAyMCwgIDEwMywgIDEwOCwgIDEwOSwgIDEwNSwgIDEwMywKLSAgICAgIDEwMywgIDEwMywgIDEwNCwgIDEwMywgIDEwNCwgIDExMCwgIDExMSwgIDEwMywgIDExMiwgIDExMywKLSAgICAgIDEwMywgIDEwMywgIDEwMywgIDEwNiwgICAxOSwgIDEwMywgICAyMCwgIDEwMywgIDEwMywgIDEwMywKLSAgICAgICAyMCwgIDEwOCwgIDEwOSwgIDEwMywgIDExNCwgIDExMCwgIDExMSwgIDExNSwgIDExMiwgIDExMiwKLSAgICAgIDExMywgIDEwMywgIDEwMywgIDEwMywgIDEwMywgIDEwMywgIDExNCwgIDExNSwgIDEwMywgIDEwMywKLSAgICAgIDEwMywgIDEwMywgIDEwMywgIDEwMywgIDEwMywgIDEwMywgIDEwMywgIDEwMywgIDEwMywgIDEwMywKLSAgICAgIDEwMywgIDEwMywgIDEwMywgIDEwMywgIDEwMywgIDEwMywgIDEwMywgIDEwMywgIDEwMywgIDEwMywKLSAgICAgIDEwMywgIDEwMywgIDEwMywgIDEwMywgIDEwMywgIDExNiwgIDEwMywgIDExNiwgIDEwMywgIDExNiwKKyAgICAgICA5MywgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgNSwgICA5MywgICAgNywgICAgMSwgICAgMSwKKyAgICAgICA5MywgICA5MywgICA5MywgICA5MywgICA5NCwgICA5NSwgICA5MywgICA5NiwgICAxNywgICA5NywKKyAgICAgICA5NiwgICA5MywgICA5OCwgICA5OSwgICA5MywgICA5MywgICA5MywgICA5NCwgICA5MywgICA5NCwKKyAgICAgIDEwMCwgICA5MywgIDEwMSwgIDEwMiwgICA5MywgICA5MywgICA5MywgICA5NiwgICA5MywgICA5MywKKyAgICAgICA5MywgICA5NiwgICA5OCwgICA5OSwgICA5MywgIDEwMywgIDEwMCwgIDEwNCwgIDEwMSwgIDEwMSwKKyAgICAgIDEwMiwgICA5MywgICA5MywgICA5MywgICA5MywgICA5MywgIDEwMywgIDEwNCwgICA5MywgICA5MywKKyAgICAgICA5MywgICA5MywgICA5MywgICA5MywgICA5MywgICA5MywgICA5MywgICA5MywgICA5MywgICA5MywKKyAgICAgICA5MywgICA5MywgICA5MywgICA5MywgICA5MywgICA5MywgICA5MywgICA5MywgICA5MywgICA5MywKKyAgICAgICA5MywgICA5MywgICA5MywgICA5MywgICA5MywgIDEwNSwgICA5MywgIDEwNSwgICA5MywgIDEwNSwKKyAgICAgICA5MywgICA5MywgICAgMCwgICA5MywgICA5MywgICA5MywgICA5MywgICA5MywgICA5MywgICA5MywKIAotICAgICAgMTAzLCAgMTAzLCAgICAwLCAgMTAzLCAgMTAzLCAgMTAzLCAgMTAzLCAgMTAzLCAgMTAzLCAgMTAzLAotICAgICAgMTAzLCAgMTAzLCAgMTAzLCAgMTAzLCAgMTAzLCAgMTAzCisgICAgICAgOTMsICAgOTMsICAgOTMsICAgOTMsICAgOTMKICAgICB9IDsKIAotc3RhdGljIHl5Y29uc3QgZmxleF9pbnQxNl90IHl5X254dFszMzldID0KK3N0YXRpYyB5eWNvbnN0IGZsZXhfaW50MTZfdCB5eV9ueHRbMjgxXSA9CiAgICAgeyAgIDAsCi0gICAgICAgMTIsICAgMTMsICAgMTQsICAgMTUsICAgMTIsICAgMTYsICAgMTIsICAgMTIsICAgMTIsICAgMTcsCi0gICAgICAgMTgsICAgMTgsICAgMTgsICAgMTIsICAgMTksICAgMjAsICAgMjAsICAgMTIsICAgMTIsICAgMjEsCi0gICAgICAgMTksICAgMjEsICAgMTksICAgMjIsICAgMjAsICAgMjAsICAgMjAsICAgMjAsICAgMjAsICAgMjAsCi0gICAgICAgMjAsICAgMjAsICAgMjAsICAgMTIsICAgMTIsICAgMTIsICAgMzIsICAgMzIsICAxMDIsICAgMjMsCi0gICAgICAgMTIsICAgMTIsICAgMTIsICAgMzQsICAgMjAsICAgMzIsICAgMzIsICAgMzIsICAgMzIsICAgMjAsCi0gICAgICAgMjAsICAgMjAsICAgMjAsICAgMjAsICAgMjQsICAgMjQsICAgMjQsICAgMzUsICAgMjUsICAgNTQsCi0gICAgICAgNTQsICAgNTQsICAgMjYsICAgMjUsICAgMjUsICAgMjUsICAgMjUsICAgMTIsICAgMTMsICAgMTQsCi0gICAgICAgMTUsICAgMjcsICAgMTIsICAgMjcsICAgMjcsICAgMjcsICAgMjMsICAgMjcsICAgMjcsICAgMjcsCi0gICAgICAgMTIsICAgMjgsICAgMjgsICAgMjgsICAgMTIsICAgMTIsICAgMjgsICAgMjgsICAgMjgsICAgMjgsCi0gICAgICAgMjgsICAgMjgsICAgMjgsICAgMjgsICAgMjgsICAgMjgsICAgMjgsICAgMjgsICAgMjgsICAgMjgsCisgICAgICAgMTIsICAgMTMsICAgMTQsICAgMTUsICAgMTIsICAgMTYsICAgMTIsICAgMTIsICAgMTcsICAgMTIsCisgICAgICAgMTIsICAgMTIsICAgMTIsICAgMTgsICAgMTgsICAgMTgsICAgMTIsICAgMTIsICAgMTgsICAgMTgsCisgICAgICAgMTgsICAgMTgsICAgMTgsICAgMTgsICAgMTgsICAgMTgsICAgMTgsICAgMTgsICAgMTgsICAgMTgsCisgICAgICAgMTgsICAgMTIsICAgMTIsICAgMTksICAgMjAsICAgMjAsICAgMjAsICAgOTIsICAgMjEsICAgMjUsCisgICAgICAgMjYsICAgMjYsICAgMjIsICAgMjEsICAgMjEsICAgMjEsICAgMjEsICAgMTIsICAgMTMsICAgMTQsCisgICAgICAgMTUsICAgMjMsICAgMTYsICAgMjMsICAgMjMsICAgMTksICAgMjMsICAgMjMsICAgMjMsICAgMTIsCisgICAgICAgMjQsICAgMjQsICAgMjQsICAgMTIsICAgMTIsICAgMjQsICAgMjQsICAgMjQsICAgMjQsICAgMjQsCisgICAgICAgMjQsICAgMjQsICAgMjQsICAgMjQsICAgMjQsICAgMjQsICAgMjQsICAgMjQsICAgMTIsICAgMTIsCisgICAgICAgMjUsICAgMjYsICAgMjYsICAgMjcsICAgMjcsICAgMjcsICAgMjcsICAgMjksICAgNDMsICAgMjksCisgICAgICAgNDMsICAgNDMsICAgNDUsICAgNDUsICAgNDUsICAgNTAsICAgMzksICAgNTksICAgNDYsICAgOTMsCiAKLSAgICAgICAxMiwgICAxMiwgICAyOSwgICAzNiwgIDEwMywgICAzNCwgICAxNywgICAzMCwgICAzMSwgICAzMSwKLSAgICAgICAyOSwgICA1NCwgICA1NCwgICA1NCwgICAxNywgICAzMCwgICAzMSwgICAzMSwgICAzOSwgICAzNSwKLSAgICAgICA1MiwgICA0MCwgICA1MiwgICA1MiwgICA1MiwgIDEwMywgICA3OCwgICAzOCwgICAzOCwgICA0NiwKLSAgICAgIDEwMSwgICA2MCwgICA3OSwgICA0MSwgICA2OSwgICA5NywgICA0MiwgICA5NCwgICA0MywgICA0NSwKLSAgICAgICA0NSwgICA0NSwgICA0NiwgICA0NSwgICA0NywgICA0NywgICA5MywgICA5MiwgICA0NSwgICA0NSwKLSAgICAgICA0NSwgICA0NSwgICA0NywgICA0NywgICA0NywgICA0NywgICA0NywgICA0NywgICA0NywgICA0NywKLSAgICAgICA0NywgICA0NywgICA0NywgICA0NywgICA0NywgICAzOSwgICA0NywgICA5MSwgICA0MCwgICA5MCwKLSAgICAgICA5OSwgICA0NywgICA0NywgICA0NywgICA0NywgICA1NCwgICA1NCwgICA1NCwgICA4OSwgICA4OCwKLSAgICAgICA0MSwgICA1NSwgICA4NywgICA0OSwgIDEwMCwgICA0MywgICA1MSwgICA1MSwgICA1MSwgICA4NiwKLSAgICAgICA1MSwgICA5NSwgICA5NSwgICA5NiwgICA4NSwgICA1MSwgICA1MSwgICA1MSwgICA1MSwgICA1MiwKKyAgICAgICAzMCwgICAzMywgICAzMCwgICAzNCwgICA0NSwgICA0NSwgICA0NSwgICAyNywgICAyNywgICA2OCwKKyAgICAgICA0MywgICA5MSwgICA0MywgICA0MywgICA2OSwgICAzNSwgICA4NywgICAzNiwgICAzOSwgICAzNywKKyAgICAgICA0MiwgICA0MiwgICA0MiwgICAzOSwgICA0MiwgICA0NSwgICA0NSwgICA0NSwgICA4OSwgICA0MiwKKyAgICAgICA0MiwgICA0MiwgICA0MiwgICA4NSwgICA4NSwgICA4NiwgICA4NSwgICA4NSwgICA4NiwgICA4OSwKKyAgICAgICA4NCwgICA5MCwgICA4MywgICA4MiwgICA4MSwgICA4MCwgICA3OSwgICA3OCwgICA3NywgICA3NiwKKyAgICAgICA3NSwgICA3NCwgICA5MCwgICAyOCwgICAyOCwgICAyOCwgICAyOCwgICAyOCwgICAyOCwgICAyOCwKKyAgICAgICAyOCwgICAzMSwgICAzMSwgICAzMSwgICAzOCwgICAzOCwgICAzOCwgICAzOCwgICA0MSwgICA3MywKKyAgICAgICA0MSwgICA0MywgICA3MiwgICA0MywgICA3MSwgICA0MywgICA0MywgICA0NCwgICAzMywgICA0NCwKKyAgICAgICA0NCwgICA0NCwgICA0NCwgICA0NywgICA2OSwgICA0NywgICA0NywgICA0OSwgICA0OSwgICA0OSwKKyAgICAgICA0OSwgICA0OSwgICA0OSwgICA0OSwgICA0OSwgICA1MSwgICA1MSwgICA1MSwgICA1MSwgICA1MSwKIAotICAgICAgIDk5LCAgIDUyLCAgIDUyLCAgIDUyLCAgIDk1LCAgIDk1LCAgIDk2LCAgIDg0LCAgIDQ2LCAgIDgzLAotICAgICAgIDgyLCAgIDgxLCAgIDM5LCAgIDc5LCAgMTAwLCAgIDMzLCAgIDMzLCAgIDMzLCAgIDMzLCAgIDMzLAotICAgICAgIDMzLCAgIDMzLCAgIDMzLCAgIDM3LCAgIDgwLCAgIDc3LCAgIDM3LCAgIDM3LCAgIDM3LCAgIDQ0LAotICAgICAgIDQwLCAgIDQ0LCAgIDUwLCAgIDc2LCAgIDUwLCAgIDUyLCAgIDc1LCAgIDUyLCAgIDc0LCAgIDUyLAotICAgICAgIDUyLCAgIDUzLCAgIDczLCAgIDUzLCAgIDUzLCAgIDUzLCAgIDUzLCAgIDU2LCAgIDU2LCAgIDU2LAotICAgICAgIDcyLCAgIDU2LCAgIDU2LCAgIDU3LCAgIDcxLCAgIDU3LCAgIDU3LCAgIDU5LCAgIDU5LCAgIDU5LAotICAgICAgIDU5LCAgIDU5LCAgIDU5LCAgIDU5LCAgIDU5LCAgIDYxLCAgIDYxLCAgIDYxLCAgIDYxLCAgIDYxLAotICAgICAgIDYxLCAgIDYxLCAgIDYxLCAgIDY3LCAgIDcwLCAgIDY3LCAgIDY4LCAgIDY4LCAgIDY4LCAgIDYyLAotICAgICAgIDY4LCAgIDY4LCAgIDk4LCAgIDk4LCAgIDk4LCAgIDk4LCAgIDk4LCAgIDk4LCAgIDk4LCAgIDk4LAotICAgICAgIDYwLCAgIDY2LCAgIDY1LCAgIDY0LCAgIDYzLCAgIDYyLCAgIDYwLCAgIDU4LCAgMTAzLCAgIDQ4LAotCi0gICAgICAgNDgsICAxMDMsICAgMTEsICAxMDMsICAxMDMsICAxMDMsICAxMDMsICAxMDMsICAxMDMsICAxMDMsCi0gICAgICAxMDMsICAxMDMsICAxMDMsICAxMDMsICAxMDMsICAxMDMsICAxMDMsICAxMDMsICAxMDMsICAxMDMsCi0gICAgICAxMDMsICAxMDMsICAxMDMsICAxMDMsICAxMDMsICAxMDMsICAxMDMsICAxMDMsICAxMDMsICAxMDMsCi0gICAgICAxMDMsICAxMDMsICAxMDMsICAxMDMsICAxMDMsICAxMDMsICAxMDMsICAxMDMKKyAgICAgICA1MSwgICA1MSwgICA1MSwgICA1NywgICA3MCwgICA1NywgICA1OCwgICA1OCwgICA1OCwgICA2NywKKyAgICAgICA1OCwgICA1OCwgICA4OCwgICA4OCwgICA4OCwgICA4OCwgICA4OCwgICA4OCwgICA4OCwgICA4OCwKKyAgICAgICAzNCwgICA2NiwgICA2NSwgICA2NCwgICA2MywgICA2MiwgICA2MSwgICA2MCwgICA1MiwgICA1MCwKKyAgICAgICAzOSwgICA1NiwgICAzOSwgICA1NSwgICA1NCwgICA1MywgICA1MiwgICA1MCwgICA0OCwgICA5MywKKyAgICAgICA0MCwgICAzOSwgICAzMiwgICA5MywgICAxOSwgICAxOSwgICAxMSwgICA5MywgICA5MywgICA5MywKKyAgICAgICA5MywgICA5MywgICA5MywgICA5MywgICA5MywgICA5MywgICA5MywgICA5MywgICA5MywgICA5MywKKyAgICAgICA5MywgICA5MywgICA5MywgICA5MywgICA5MywgICA5MywgICA5MywgICA5MywgICA5MywgICA5MywKKyAgICAgICA5MywgICA5MywgICA5MywgICA5MywgICA5MywgICA5MywgICA5MywgICA5MywgICA5MywgICA5MwogICAgIH0gOwogCi1zdGF0aWMgeXljb25zdCBmbGV4X2ludDE2X3QgeXlfY2hrWzMzOV0gPQorc3RhdGljIHl5Y29uc3QgZmxleF9pbnQxNl90IHl5X2Noa1syODFdID0KICAgICB7ICAgMCwKICAgICAgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwKICAgICAgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwKICAgICAgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwKLSAgICAgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMywgICAxMywgICAxMywgIDEwMSwgICAgMywKLSAgICAgICAgMywgICAgMywgICAgMywgICAxNSwgICAgMywgICAxNCwgICAxNCwgICAzMiwgICAzMiwgICAgMywKLSAgICAgICAgMywgICAgMywgICAgMywgICAgMywgICAgNSwgICAgNSwgICAgNSwgICAxNSwgICAgNSwgICAzMSwKLSAgICAgICAzMSwgICAzMSwgICAgNSwgICAgNSwgICAgNSwgICAgNSwgICAgNSwgICAgNywgICAgNywgICAgNywKKyAgICAgICAgMSwgICAgMSwgICAgMSwgICAgNSwgICAgNSwgICAgNSwgICAgNSwgICA5MSwgICAgNSwgICAgOSwKKyAgICAgICAgOSwgICAgOSwgICAgNSwgICAgNSwgICAgNSwgICAgNSwgICAgNSwgICAgNywgICAgNywgICAgNywKICAgICAgICAgNywgICAgNywgICAgNywgICAgNywgICAgNywgICAgNywgICAgNywgICAgNywgICAgNywgICAgNywKICAgICAgICAgNywgICAgNywgICAgNywgICAgNywgICAgNywgICAgNywgICAgNywgICAgNywgICAgNywgICAgNywKICAgICAgICAgNywgICAgNywgICAgNywgICAgNywgICAgNywgICAgNywgICAgNywgICAgNywgICAgNywgICAgNywKKyAgICAgICAxMCwgICAxMCwgICAxMCwgICAxMywgICAxMywgICAxNCwgICAxNCwgICAxNSwgICAyNCwgICAyOCwKKyAgICAgICAyNCwgICAyNCwgICAyNSwgICAyNSwgICAyNSwgICA1MCwgICAyNCwgICA1MCwgICAyNSwgICA5MCwKIAotICAgICAgICA3LCAgICA3LCAgICA5LCAgIDE2LCAgIDI5LCAgIDMzLCAgICA5LCAgICA5LCAgICA5LCAgICA5LAotICAgICAgIDEwLCAgIDU0LCAgIDU0LCAgIDU0LCAgIDEwLCAgIDEwLCAgIDEwLCAgIDEwLCAgIDE3LCAgIDMzLAotICAgICAgIDI4LCAgIDE3LCAgIDI4LCAgIDI4LCAgIDI4LCAgMTAwLCAgIDcyLCAgIDE2LCAgIDI5LCAgIDI4LAotICAgICAgIDk3LCAgIDYwLCAgIDcyLCAgIDE3LCAgIDYwLCAgIDk0LCAgIDE3LCAgIDkyLCAgIDE3LCAgIDE5LAotICAgICAgIDE5LCAgIDE5LCAgIDE5LCAgIDE5LCAgIDE5LCAgIDE5LCAgIDkxLCAgIDg4LCAgIDE5LCAgIDE5LAotICAgICAgIDE5LCAgIDE5LCAgIDE5LCAgIDE5LCAgIDE5LCAgIDE5LCAgIDE5LCAgIDE5LCAgIDE5LCAgIDE5LAotICAgICAgIDE5LCAgIDE5LCAgIDIwLCAgIDIwLCAgIDIwLCAgIDIzLCAgIDIwLCAgIDg3LCAgIDIzLCAgIDg2LAotICAgICAgIDk2LCAgIDIwLCAgIDIwLCAgIDIwLCAgIDIwLCAgIDMwLCAgIDMwLCAgIDMwLCAgIDg1LCAgIDg0LAotICAgICAgIDIzLCAgIDMwLCAgIDgzLCAgIDIzLCAgIDk2LCAgIDIzLCAgIDI1LCAgIDI1LCAgIDI1LCAgIDgyLAotICAgICAgIDI1LCAgIDkzLCAgIDkzLCAgIDkzLCAgIDgxLCAgIDI1LCAgIDI1LCAgIDI1LCAgIDI1LCAgIDUzLAorICAgICAgIDE1LCAgIDE3LCAgIDI4LCAgIDE3LCAgIDI2LCAgIDI2LCAgIDI2LCAgIDI3LCAgIDI3LCAgIDYyLAorICAgICAgIDQ0LCAgIDg3LCAgIDQ0LCAgIDQ0LCAgIDYyLCAgIDE3LCAgIDg0LCAgIDE3LCAgIDQ0LCAgIDE3LAorICAgICAgIDIxLCAgIDIxLCAgIDIxLCAgIDIxLCAgIDIxLCAgIDQ1LCAgIDQ1LCAgIDQ1LCAgIDg2LCAgIDIxLAorICAgICAgIDIxLCAgIDIxLCAgIDIxLCAgIDgzLCAgIDgzLCAgIDgzLCAgIDg1LCAgIDg1LCAgIDg1LCAgIDg4LAorICAgICAgIDgyLCAgIDg2LCAgIDgxLCAgIDc4LCAgIDc3LCAgIDc2LCAgIDc1LCAgIDc0LCAgIDczLCAgIDcyLAorICAgICAgIDcxLCAgIDcwLCAgIDg4LCAgIDk0LCAgIDk0LCAgIDk0LCAgIDk0LCAgIDk0LCAgIDk0LCAgIDk0LAorICAgICAgIDk0LCAgIDk1LCAgIDk1LCAgIDk1LCAgIDk2LCAgIDk2LCAgIDk2LCAgIDk2LCAgIDk3LCAgIDY5LAorICAgICAgIDk3LCAgIDk4LCAgIDY4LCAgIDk4LCAgIDY3LCAgIDk4LCAgIDk4LCAgIDk5LCAgIDY2LCAgIDk5LAorICAgICAgIDk5LCAgIDk5LCAgIDk5LCAgMTAwLCAgIDY0LCAgMTAwLCAgMTAwLCAgMTAxLCAgMTAxLCAgMTAxLAorICAgICAgMTAxLCAgMTAxLCAgMTAxLCAgMTAxLCAgMTAxLCAgMTAyLCAgMTAyLCAgMTAyLCAgMTAyLCAgMTAyLAogCi0gICAgICAgOTgsICAgNTMsICAgNTMsICAgNTMsICAgOTUsICAgOTUsICAgOTUsICAgODAsICAgNTMsICAgNzksCi0gICAgICAgNzgsICAgNzcsICAgNzYsICAgNzQsICAgOTgsICAxMDQsICAxMDQsICAxMDQsICAxMDQsICAxMDQsCi0gICAgICAxMDQsICAxMDQsICAxMDQsICAxMDUsICAgNzMsICAgNzEsICAxMDUsICAxMDUsICAxMDUsICAxMDYsCi0gICAgICAgNzAsICAxMDYsICAxMDcsICAgNjksICAxMDcsICAxMDgsICAgNjgsICAxMDgsICAgNjYsICAxMDgsCi0gICAgICAxMDgsICAxMDksICAgNjUsICAxMDksICAxMDksICAxMDksICAxMDksICAxMTAsICAxMTAsICAxMTAsCi0gICAgICAgNjQsICAxMTAsICAxMTAsICAxMTEsICAgNjMsICAxMTEsICAxMTEsICAxMTIsICAxMTIsICAxMTIsCi0gICAgICAxMTIsICAxMTIsICAxMTIsICAxMTIsICAxMTIsICAxMTMsICAxMTMsICAxMTMsICAxMTMsICAxMTMsCi0gICAgICAxMTMsICAxMTMsICAxMTMsICAxMTQsICAgNjIsICAxMTQsICAxMTUsICAxMTUsICAxMTUsICAgNjEsCi0gICAgICAxMTUsICAxMTUsICAxMTYsICAxMTYsICAxMTYsICAxMTYsICAxMTYsICAxMTYsICAxMTYsICAxMTYsCi0gICAgICAgNTksICAgNDksICAgNDMsICAgNDIsICAgNDEsICAgNDAsICAgMzksICAgMzgsICAgMzUsICAgMjIsCi0KLSAgICAgICAyMSwgICAxMSwgIDEwMywgIDEwMywgIDEwMywgIDEwMywgIDEwMywgIDEwMywgIDEwMywgIDEwMywKLSAgICAgIDEwMywgIDEwMywgIDEwMywgIDEwMywgIDEwMywgIDEwMywgIDEwMywgIDEwMywgIDEwMywgIDEwMywKLSAgICAgIDEwMywgIDEwMywgIDEwMywgIDEwMywgIDEwMywgIDEwMywgIDEwMywgIDEwMywgIDEwMywgIDEwMywKLSAgICAgIDEwMywgIDEwMywgIDEwMywgIDEwMywgIDEwMywgIDEwMywgIDEwMywgIDEwMworICAgICAgMTAyLCAgMTAyLCAgMTAyLCAgMTAzLCAgIDYzLCAgMTAzLCAgMTA0LCAgMTA0LCAgMTA0LCAgIDYxLAorICAgICAgMTA0LCAgMTA0LCAgMTA1LCAgMTA1LCAgMTA1LCAgMTA1LCAgMTA1LCAgMTA1LCAgMTA1LCAgMTA1LAorICAgICAgIDYwLCAgIDU5LCAgIDU4LCAgIDU2LCAgIDU1LCAgIDU0LCAgIDUzLCAgIDUyLCAgIDUxLCAgIDQ5LAorICAgICAgIDQyLCAgIDQwLCAgIDM4LCAgIDM3LCAgIDM2LCAgIDM1LCAgIDM0LCAgIDMzLCAgIDMyLCAgIDMwLAorICAgICAgIDE5LCAgIDE4LCAgIDE2LCAgIDExLCAgICA0LCAgICAzLCAgIDkzLCAgIDkzLCAgIDkzLCAgIDkzLAorICAgICAgIDkzLCAgIDkzLCAgIDkzLCAgIDkzLCAgIDkzLCAgIDkzLCAgIDkzLCAgIDkzLCAgIDkzLCAgIDkzLAorICAgICAgIDkzLCAgIDkzLCAgIDkzLCAgIDkzLCAgIDkzLCAgIDkzLCAgIDkzLCAgIDkzLCAgIDkzLCAgIDkzLAorICAgICAgIDkzLCAgIDkzLCAgIDkzLCAgIDkzLCAgIDkzLCAgIDkzLCAgIDkzLCAgIDkzLCAgIDkzLCAgIDkzCiAgICAgfSA7CiAKLS8qIFRhYmxlIG9mIGJvb2xlYW5zLCB0cnVlIGlmIHJ1bGUgY291bGQgbWF0Y2ggZW9sLiAqLwotc3RhdGljIHl5Y29uc3QgZmxleF9pbnQzMl90IHl5X3J1bGVfY2FuX21hdGNoX2VvbFsyMV0gPQotICAgIHsgICAwLAotMSwgMSwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMSwgMSwgMSwgMCwgCi0gICAgMCwgICAgIH07Ci0KIHN0YXRpYyB5eV9zdGF0ZV90eXBlIHl5X2xhc3RfYWNjZXB0aW5nX3N0YXRlOwogc3RhdGljIGNoYXIgKnl5X2xhc3RfYWNjZXB0aW5nX2Nwb3M7CiAKQEAgLTYxNiw2ICs1ODAsMTMgQEAKICNpbmNsdWRlICJzcmNwb3MuaCIKICNpbmNsdWRlICJkdGMtcGFyc2VyLnRhYi5oIgogCitZWUxUWVBFIHl5bGxvYzsKKworLyogQ0FVVElPTjogdGhpcyB3aWxsIHN0b3Agd29ya2luZyBpZiB3ZSBldmVyIHVzZSB5eWxlc3MoKSBvciB5eXVucHV0KCkgKi8KKyNkZWZpbmUJWVlfVVNFUl9BQ1RJT04gXAorCXsgXAorCQlzcmNwb3NfdXBkYXRlKCZ5eWxsb2MsIHl5dGV4dCwgeXlsZW5nKTsgXAorCX0KIAogLyojZGVmaW5lIExFWERFQlVHCTEqLwogCkBAIC02MjUsMTkgKzU5NiwxNCBAQAogI2RlZmluZSBEUFJJTlQoZm10LCAuLi4pCWRvIHsgfSB3aGlsZSAoMCkKICNlbmRpZgogCi1zdGF0aWMgaW50IGR0c192ZXJzaW9uOyAvKiA9IDAgKi8KK3N0YXRpYyBpbnQgZHRzX3ZlcnNpb24gPSAxOwogCi0jZGVmaW5lIEJFR0lOX0RFRkFVTFQoKQlpZiAoZHRzX3ZlcnNpb24gPT0gMCkgeyBcCi0JCQkJRFBSSU5UKCI8SU5JVElBTD5cbiIpOyBcCi0JCQkJQkVHSU4oSU5JVElBTCk7IFwKLQkJCX0gZWxzZSB7IFwKLQkJCQlEUFJJTlQoIjxWMT5cbiIpOyBcCisjZGVmaW5lIEJFR0lOX0RFRkFVTFQoKQkJRFBSSU5UKCI8VjE+XG4iKTsgXAogCQkJCUJFR0lOKFYxKTsgXAotCQkJfQogCiBzdGF0aWMgdm9pZCBwdXNoX2lucHV0X2ZpbGUoY29uc3QgY2hhciAqZmlsZW5hbWUpOwogc3RhdGljIGludCBwb3BfaW5wdXRfZmlsZSh2b2lkKTsKLSNsaW5lIDY0MSAiZHRjLWxleGVyLmxleC5jIgorI2xpbmUgNjA3ICJkdGMtbGV4ZXIubGV4LmMiCiAKICNkZWZpbmUgSU5JVElBTCAwCiAjZGVmaW5lIElOQ0xVREUgMQpAQCAtODI2LDkgKzc5Miw5IEBACiAJcmVnaXN0ZXIgY2hhciAqeXlfY3AsICp5eV9icDsKIAlyZWdpc3RlciBpbnQgeXlfYWN0OwogICAgIAotI2xpbmUgNjQgImR0Yy1sZXhlci5sIgorI2xpbmUgNjYgImR0Yy1sZXhlci5sIgogCi0jbGluZSA4MzIgImR0Yy1sZXhlci5sZXguYyIKKyNsaW5lIDc5OCAiZHRjLWxleGVyLmxleC5jIgogCiAJaWYgKCAhKHl5X2luaXQpICkKIAkJewpAQCAtODgxLDM1ICs4NDcsMjEgQEAKIAkJCXdoaWxlICggeXlfY2hrW3l5X2Jhc2VbeXlfY3VycmVudF9zdGF0ZV0gKyB5eV9jXSAhPSB5eV9jdXJyZW50X3N0YXRlICkKIAkJCQl7CiAJCQkJeXlfY3VycmVudF9zdGF0ZSA9IChpbnQpIHl5X2RlZlt5eV9jdXJyZW50X3N0YXRlXTsKLQkJCQlpZiAoIHl5X2N1cnJlbnRfc3RhdGUgPj0gMTA0ICkKKwkJCQlpZiAoIHl5X2N1cnJlbnRfc3RhdGUgPj0gOTQgKQogCQkJCQl5eV9jID0geXlfbWV0YVsodW5zaWduZWQgaW50KSB5eV9jXTsKIAkJCQl9CiAJCQl5eV9jdXJyZW50X3N0YXRlID0geXlfbnh0W3l5X2Jhc2VbeXlfY3VycmVudF9zdGF0ZV0gKyAodW5zaWduZWQgaW50KSB5eV9jXTsKIAkJCSsreXlfY3A7CiAJCQl9Ci0JCXdoaWxlICggeXlfYmFzZVt5eV9jdXJyZW50X3N0YXRlXSAhPSAzMDMgKTsKKwkJd2hpbGUgKCB5eV9jdXJyZW50X3N0YXRlICE9IDkzICk7CisJCXl5X2NwID0gKHl5X2xhc3RfYWNjZXB0aW5nX2Nwb3MpOworCQl5eV9jdXJyZW50X3N0YXRlID0gKHl5X2xhc3RfYWNjZXB0aW5nX3N0YXRlKTsKIAogeXlfZmluZF9hY3Rpb246CiAJCXl5X2FjdCA9IHl5X2FjY2VwdFt5eV9jdXJyZW50X3N0YXRlXTsKLQkJaWYgKCB5eV9hY3QgPT0gMCApCi0JCQl7IC8qIGhhdmUgdG8gYmFjayB1cCAqLwotCQkJeXlfY3AgPSAoeXlfbGFzdF9hY2NlcHRpbmdfY3Bvcyk7Ci0JCQl5eV9jdXJyZW50X3N0YXRlID0gKHl5X2xhc3RfYWNjZXB0aW5nX3N0YXRlKTsKLQkJCXl5X2FjdCA9IHl5X2FjY2VwdFt5eV9jdXJyZW50X3N0YXRlXTsKLQkJCX0KIAogCQlZWV9ET19CRUZPUkVfQUNUSU9OOwogCi0JCWlmICggeXlfYWN0ICE9IFlZX0VORF9PRl9CVUZGRVIgJiYgeXlfcnVsZV9jYW5fbWF0Y2hfZW9sW3l5X2FjdF0gKQotCQkJewotCQkJaW50IHl5bDsKLQkJCWZvciAoIHl5bCA9IDA7IHl5bCA8IHl5bGVuZzsgKyt5eWwgKQotCQkJCWlmICggeXl0ZXh0W3l5bF0gPT0gJ1xuJyApCi0JCQkJCSAgIAotICAgIHl5bGluZW5vKys7Ci07Ci0JCQl9Ci0KIGRvX2FjdGlvbjoJLyogVGhpcyBsYWJlbCBpcyB1c2VkIG9ubHkgdG8gYWNjZXNzIEVPRiBhY3Rpb25zLiAqLwogCiAJCXN3aXRjaCAoIHl5X2FjdCApCkBAIC05MjQsNyArODc2LDcgQEAKIGNhc2UgMToKIC8qIHJ1bGUgMSBjYW4gbWF0Y2ggZW9sICovCiBZWV9SVUxFX1NFVFVQCi0jbGluZSA2NSAiZHRjLWxleGVyLmwiCisjbGluZSA2NyAiZHRjLWxleGVyLmwiCiB7CiAJCQljaGFyICpuYW1lID0gc3RyY2hyKHl5dGV4dCwgJ1wiJykgKyAxOwogCQkJeXl0ZXh0W3l5bGVuZy0xXSA9ICdcMCc7CkBAIC05MzYsNyArODg4LDcgQEAKIGNhc2UgWVlfU1RBVEVfRU9GKEJZVEVTVFJJTkcpOgogY2FzZSBZWV9TVEFURV9FT0YoUFJPUE5PREVOQU1FKToKIGNhc2UgWVlfU1RBVEVfRU9GKFYxKToKLSNsaW5lIDcxICJkdGMtbGV4ZXIubCIKKyNsaW5lIDczICJkdGMtbGV4ZXIubCIKIHsKIAkJCWlmICghcG9wX2lucHV0X2ZpbGUoKSkgewogCQkJCXl5dGVybWluYXRlKCk7CkBAIC05NDYsMjMgKzg5OCwxOCBAQAogY2FzZSAyOgogLyogcnVsZSAyIGNhbiBtYXRjaCBlb2wgKi8KIFlZX1JVTEVfU0VUVVAKLSNsaW5lIDc3ICJkdGMtbGV4ZXIubCIKKyNsaW5lIDc5ICJkdGMtbGV4ZXIubCIKIHsKLQkJCXl5bGxvYy5maWxlID0gc3JjcG9zX2ZpbGU7Ci0JCQl5eWxsb2MuZmlyc3RfbGluZSA9IHl5bGluZW5vOwogCQkJRFBSSU5UKCJTdHJpbmc6ICVzXG4iLCB5eXRleHQpOwogCQkJeXlsdmFsLmRhdGEgPSBkYXRhX2NvcHlfZXNjYXBlX3N0cmluZyh5eXRleHQrMSwKIAkJCQkJeXlsZW5nLTIpOwotCQkJeXlsbG9jLmZpcnN0X2xpbmUgPSB5eWxpbmVubzsKIAkJCXJldHVybiBEVF9TVFJJTkc7CiAJCX0KIAlZWV9CUkVBSwogY2FzZSAzOgogWVlfUlVMRV9TRVRVUAotI2xpbmUgODcgImR0Yy1sZXhlci5sIgorI2xpbmUgODYgImR0Yy1sZXhlci5sIgogewotCQkJeXlsbG9jLmZpbGUgPSBzcmNwb3NfZmlsZTsKLQkJCXl5bGxvYy5maXJzdF9saW5lID0geXlsaW5lbm87CiAJCQlEUFJJTlQoIktleXdvcmQ6IC9kdHMtdjEvXG4iKTsKIAkJCWR0c192ZXJzaW9uID0gMTsKIAkJCUJFR0lOX0RFRkFVTFQoKTsKQEAgLTk3MSwxMCArOTE4LDggQEAKIAlZWV9CUkVBSwogY2FzZSA0OgogWVlfUlVMRV9TRVRVUAotI2xpbmUgOTYgImR0Yy1sZXhlci5sIgorI2xpbmUgOTMgImR0Yy1sZXhlci5sIgogewotCQkJeXlsbG9jLmZpbGUgPSBzcmNwb3NfZmlsZTsKLQkJCXl5bGxvYy5maXJzdF9saW5lID0geXlsaW5lbm87CiAJCQlEUFJJTlQoIktleXdvcmQ6IC9tZW1yZXNlcnZlL1xuIik7CiAJCQlCRUdJTl9ERUZBVUxUKCk7CiAJCQlyZXR1cm4gRFRfTUVNUkVTRVJWRTsKQEAgLTk4MiwxNTggKzkyNywxMDAgQEAKIAlZWV9CUkVBSwogY2FzZSA1OgogWVlfUlVMRV9TRVRVUAotI2xpbmUgMTA0ICJkdGMtbGV4ZXIubCIKKyNsaW5lIDk5ICJkdGMtbGV4ZXIubCIKIHsKLQkJCXl5bGxvYy5maWxlID0gc3JjcG9zX2ZpbGU7Ci0JCQl5eWxsb2MuZmlyc3RfbGluZSA9IHl5bGluZW5vOwogCQkJRFBSSU5UKCJMYWJlbDogJXNcbiIsIHl5dGV4dCk7Ci0JCQl5eWx2YWwubGFiZWxyZWYgPSBzdHJkdXAoeXl0ZXh0KTsKKwkJCXl5bHZhbC5sYWJlbHJlZiA9IHhzdHJkdXAoeXl0ZXh0KTsKIAkJCXl5bHZhbC5sYWJlbHJlZlt5eWxlbmctMV0gPSAnXDAnOwogCQkJcmV0dXJuIERUX0xBQkVMOwogCQl9CiAJWVlfQlJFQUsKIGNhc2UgNjoKIFlZX1JVTEVfU0VUVVAKLSNsaW5lIDExMyAiZHRjLWxleGVyLmwiCisjbGluZSAxMDYgImR0Yy1sZXhlci5sIgogewotCQkJeXlsbG9jLmZpbGUgPSBzcmNwb3NfZmlsZTsKLQkJCXl5bGxvYy5maXJzdF9saW5lID0geXlsaW5lbm87Ci0JCQlpZiAoKnl5dGV4dCA9PSAnYicpCi0JCQkJeXlsdmFsLmNiYXNlID0gMjsKLQkJCWVsc2UgaWYgKCp5eXRleHQgPT0gJ28nKQotCQkJCXl5bHZhbC5jYmFzZSA9IDg7Ci0JCQllbHNlIGlmICgqeXl0ZXh0ID09ICdkJykKLQkJCQl5eWx2YWwuY2Jhc2UgPSAxMDsKLQkJCWVsc2UKLQkJCQl5eWx2YWwuY2Jhc2UgPSAxNjsKLQkJCURQUklOVCgiQmFzZTogJWRcbiIsIHl5bHZhbC5jYmFzZSk7Ci0JCQlyZXR1cm4gRFRfQkFTRTsKLQkJfQotCVlZX0JSRUFLCi1jYXNlIDc6Ci1ZWV9SVUxFX1NFVFVQCi0jbGluZSAxMjggImR0Yy1sZXhlci5sIgotewotCQkJeXlsbG9jLmZpbGUgPSBzcmNwb3NfZmlsZTsKLQkJCXl5bGxvYy5maXJzdF9saW5lID0geXlsaW5lbm87Ci0JCQl5eWx2YWwubGl0ZXJhbCA9IHN0cmR1cCh5eXRleHQpOwotCQkJRFBSSU5UKCJMaXRlcmFsOiAnJXMnXG4iLCB5eWx2YWwubGl0ZXJhbCk7Ci0JCQlyZXR1cm4gRFRfTEVHQUNZTElURVJBTDsKLQkJfQotCVlZX0JSRUFLCi1jYXNlIDg6Ci1ZWV9SVUxFX1NFVFVQCi0jbGluZSAxMzYgImR0Yy1sZXhlci5sIgotewotCQkJeXlsbG9jLmZpbGUgPSBzcmNwb3NfZmlsZTsKLQkJCXl5bGxvYy5maXJzdF9saW5lID0geXlsaW5lbm87Ci0JCQl5eWx2YWwubGl0ZXJhbCA9IHN0cmR1cCh5eXRleHQpOworCQkJeXlsdmFsLmxpdGVyYWwgPSB4c3RyZHVwKHl5dGV4dCk7CiAJCQlEUFJJTlQoIkxpdGVyYWw6ICclcydcbiIsIHl5bHZhbC5saXRlcmFsKTsKIAkJCXJldHVybiBEVF9MSVRFUkFMOwogCQl9CiAJWVlfQlJFQUsKLWNhc2UgOToKK2Nhc2UgNzoKIFlZX1JVTEVfU0VUVVAKLSNsaW5lIDE0NCAiZHRjLWxleGVyLmwiCisjbGluZSAxMTIgImR0Yy1sZXhlci5sIgogewkvKiBsYWJlbCByZWZlcmVuY2UgKi8KLQkJCXl5bGxvYy5maWxlID0gc3JjcG9zX2ZpbGU7Ci0JCQl5eWxsb2MuZmlyc3RfbGluZSA9IHl5bGluZW5vOwogCQkJRFBSSU5UKCJSZWY6ICVzXG4iLCB5eXRleHQrMSk7Ci0JCQl5eWx2YWwubGFiZWxyZWYgPSBzdHJkdXAoeXl0ZXh0KzEpOworCQkJeXlsdmFsLmxhYmVscmVmID0geHN0cmR1cCh5eXRleHQrMSk7CiAJCQlyZXR1cm4gRFRfUkVGOwogCQl9CiAJWVlfQlJFQUsKLWNhc2UgMTA6CitjYXNlIDg6CiBZWV9SVUxFX1NFVFVQCi0jbGluZSAxNTIgImR0Yy1sZXhlci5sIgorI2xpbmUgMTE4ICJkdGMtbGV4ZXIubCIKIHsJLyogbmV3LXN0eWxlIHBhdGggcmVmZXJlbmNlICovCi0JCQl5eWxsb2MuZmlsZSA9IHNyY3Bvc19maWxlOwotCQkJeXlsbG9jLmZpcnN0X2xpbmUgPSB5eWxpbmVubzsKIAkJCXl5dGV4dFt5eWxlbmctMV0gPSAnXDAnOwogCQkJRFBSSU5UKCJSZWY6ICVzXG4iLCB5eXRleHQrMik7Ci0JCQl5eWx2YWwubGFiZWxyZWYgPSBzdHJkdXAoeXl0ZXh0KzIpOworCQkJeXlsdmFsLmxhYmVscmVmID0geHN0cmR1cCh5eXRleHQrMik7CiAJCQlyZXR1cm4gRFRfUkVGOwogCQl9CiAJWVlfQlJFQUsKLWNhc2UgMTE6CitjYXNlIDk6CiBZWV9SVUxFX1NFVFVQCi0jbGluZSAxNjEgImR0Yy1sZXhlci5sIgotewkvKiBvbGQtc3R5bGUgcGF0aCByZWZlcmVuY2UgKi8KLQkJCXl5bGxvYy5maWxlID0gc3JjcG9zX2ZpbGU7Ci0JCQl5eWxsb2MuZmlyc3RfbGluZSA9IHl5bGluZW5vOwotCQkJRFBSSU5UKCJSZWY6ICVzXG4iLCB5eXRleHQrMSk7Ci0JCQl5eWx2YWwubGFiZWxyZWYgPSBzdHJkdXAoeXl0ZXh0KzEpOwotCQkJcmV0dXJuIERUX1JFRjsKLQkJfQotCVlZX0JSRUFLCi1jYXNlIDEyOgotWVlfUlVMRV9TRVRVUAotI2xpbmUgMTY5ICJkdGMtbGV4ZXIubCIKKyNsaW5lIDEyNSAiZHRjLWxleGVyLmwiCiB7Ci0JCQl5eWxsb2MuZmlsZSA9IHNyY3Bvc19maWxlOwotCQkJeXlsbG9jLmZpcnN0X2xpbmUgPSB5eWxpbmVubzsKIAkJCXl5bHZhbC5ieXRlID0gc3RydG9sKHl5dGV4dCwgTlVMTCwgMTYpOwogCQkJRFBSSU5UKCJCeXRlOiAlMDJ4XG4iLCAoaW50KXl5bHZhbC5ieXRlKTsKIAkJCXJldHVybiBEVF9CWVRFOwogCQl9CiAJWVlfQlJFQUsKLWNhc2UgMTM6CitjYXNlIDEwOgogWVlfUlVMRV9TRVRVUAotI2xpbmUgMTc3ICJkdGMtbGV4ZXIubCIKKyNsaW5lIDEzMSAiZHRjLWxleGVyLmwiCiB7Ci0JCQl5eWxsb2MuZmlsZSA9IHNyY3Bvc19maWxlOwotCQkJeXlsbG9jLmZpcnN0X2xpbmUgPSB5eWxpbmVubzsKIAkJCURQUklOVCgiL0JZVEVTVFJJTkdcbiIpOwogCQkJQkVHSU5fREVGQVVMVCgpOwogCQkJcmV0dXJuICddJzsKIAkJfQogCVlZX0JSRUFLCi1jYXNlIDE0OgorY2FzZSAxMToKIFlZX1JVTEVfU0VUVVAKLSNsaW5lIDE4NSAiZHRjLWxleGVyLmwiCisjbGluZSAxMzcgImR0Yy1sZXhlci5sIgogewotCQkJeXlsbG9jLmZpbGUgPSBzcmNwb3NfZmlsZTsKLQkJCXl5bGxvYy5maXJzdF9saW5lID0geXlsaW5lbm87CiAJCQlEUFJJTlQoIlByb3BOb2RlTmFtZTogJXNcbiIsIHl5dGV4dCk7Ci0JCQl5eWx2YWwucHJvcG5vZGVuYW1lID0gc3RyZHVwKHl5dGV4dCk7CisJCQl5eWx2YWwucHJvcG5vZGVuYW1lID0geHN0cmR1cCh5eXRleHQpOwogCQkJQkVHSU5fREVGQVVMVCgpOwogCQkJcmV0dXJuIERUX1BST1BOT0RFTkFNRTsKIAkJfQogCVlZX0JSRUFLCi1jYXNlIDE1OgorY2FzZSAxMjoKIFlZX1JVTEVfU0VUVVAKLSNsaW5lIDE5NCAiZHRjLWxleGVyLmwiCisjbGluZSAxNDQgImR0Yy1sZXhlci5sIgogewotCQkJeXlsbG9jLmZpbGUgPSBzcmNwb3NfZmlsZTsKLQkJCXl5bGxvYy5maXJzdF9saW5lID0geXlsaW5lbm87CiAJCQlEUFJJTlQoIkJpbmFyeSBJbmNsdWRlXG4iKTsKIAkJCXJldHVybiBEVF9JTkNCSU47CiAJCX0KIAlZWV9CUkVBSwotY2FzZSAxNjoKLS8qIHJ1bGUgMTYgY2FuIG1hdGNoIGVvbCAqLworY2FzZSAxMzoKKy8qIHJ1bGUgMTMgY2FuIG1hdGNoIGVvbCAqLwogWVlfUlVMRV9TRVRVUAotI2xpbmUgMjAxICJkdGMtbGV4ZXIubCIKKyNsaW5lIDE0OSAiZHRjLWxleGVyLmwiCiAvKiBlYXQgd2hpdGVzcGFjZSAqLwogCVlZX0JSRUFLCi1jYXNlIDE3OgotLyogcnVsZSAxNyBjYW4gbWF0Y2ggZW9sICovCitjYXNlIDE0OgorLyogcnVsZSAxNCBjYW4gbWF0Y2ggZW9sICovCiBZWV9SVUxFX1NFVFVQCi0jbGluZSAyMDIgImR0Yy1sZXhlci5sIgorI2xpbmUgMTUwICJkdGMtbGV4ZXIubCIKIC8qIGVhdCBDLXN0eWxlIGNvbW1lbnRzICovCiAJWVlfQlJFQUsKLWNhc2UgMTg6Ci0vKiBydWxlIDE4IGNhbiBtYXRjaCBlb2wgKi8KK2Nhc2UgMTU6CisvKiBydWxlIDE1IGNhbiBtYXRjaCBlb2wgKi8KIFlZX1JVTEVfU0VUVVAKLSNsaW5lIDIwMyAiZHRjLWxleGVyLmwiCisjbGluZSAxNTEgImR0Yy1sZXhlci5sIgogLyogZWF0IEMrKy1zdHlsZSBjb21tZW50cyAqLwogCVlZX0JSRUFLCi1jYXNlIDE5OgorY2FzZSAxNjoKIFlZX1JVTEVfU0VUVVAKLSNsaW5lIDIwNSAiZHRjLWxleGVyLmwiCisjbGluZSAxNTMgImR0Yy1sZXhlci5sIgogewotCQkJeXlsbG9jLmZpbGUgPSBzcmNwb3NfZmlsZTsKLQkJCXl5bGxvYy5maXJzdF9saW5lID0geXlsaW5lbm87CiAJCQlEUFJJTlQoIkNoYXI6ICVjIChcXHglMDJ4KVxuIiwgeXl0ZXh0WzBdLAogCQkJCSh1bnNpZ25lZCl5eXRleHRbMF0pOwogCQkJaWYgKHl5dGV4dFswXSA9PSAnWycpIHsKQEAgLTExNDgsMTIgKzEwMzUsMTIgQEAKIAkJCXJldHVybiB5eXRleHRbMF07CiAJCX0KIAlZWV9CUkVBSwotY2FzZSAyMDoKK2Nhc2UgMTc6CiBZWV9SVUxFX1NFVFVQCi0jbGluZSAyMjIgImR0Yy1sZXhlci5sIgorI2xpbmUgMTY4ICJkdGMtbGV4ZXIubCIKIEVDSE87CiAJWVlfQlJFQUsKLSNsaW5lIDExNTcgImR0Yy1sZXhlci5sZXguYyIKKyNsaW5lIDEwNDQgImR0Yy1sZXhlci5sZXguYyIKIAogCWNhc2UgWVlfRU5EX09GX0JVRkZFUjoKIAkJewpAQCAtMTIxOCw3ICsxMTA1LDggQEAKIAogCQkJZWxzZQogCQkJCXsKLQkJCQl5eV9jcCA9ICh5eV9jX2J1Zl9wKTsKKwkJCQl5eV9jcCA9ICh5eV9sYXN0X2FjY2VwdGluZ19jcG9zKTsKKwkJCQl5eV9jdXJyZW50X3N0YXRlID0gKHl5X2xhc3RfYWNjZXB0aW5nX3N0YXRlKTsKIAkJCQlnb3RvIHl5X2ZpbmRfYWN0aW9uOwogCQkJCX0KIAkJCX0KQEAgLTE0NDMsNyArMTMzMSw3IEBACiAJCXdoaWxlICggeXlfY2hrW3l5X2Jhc2VbeXlfY3VycmVudF9zdGF0ZV0gKyB5eV9jXSAhPSB5eV9jdXJyZW50X3N0YXRlICkKIAkJCXsKIAkJCXl5X2N1cnJlbnRfc3RhdGUgPSAoaW50KSB5eV9kZWZbeXlfY3VycmVudF9zdGF0ZV07Ci0JCQlpZiAoIHl5X2N1cnJlbnRfc3RhdGUgPj0gMTA0ICkKKwkJCWlmICggeXlfY3VycmVudF9zdGF0ZSA+PSA5NCApCiAJCQkJeXlfYyA9IHl5X21ldGFbKHVuc2lnbmVkIGludCkgeXlfY107CiAJCQl9CiAJCXl5X2N1cnJlbnRfc3RhdGUgPSB5eV9ueHRbeXlfYmFzZVt5eV9jdXJyZW50X3N0YXRlXSArICh1bnNpZ25lZCBpbnQpIHl5X2NdOwpAQCAtMTQ3MSwxMSArMTM1OSwxMSBAQAogCXdoaWxlICggeXlfY2hrW3l5X2Jhc2VbeXlfY3VycmVudF9zdGF0ZV0gKyB5eV9jXSAhPSB5eV9jdXJyZW50X3N0YXRlICkKIAkJewogCQl5eV9jdXJyZW50X3N0YXRlID0gKGludCkgeXlfZGVmW3l5X2N1cnJlbnRfc3RhdGVdOwotCQlpZiAoIHl5X2N1cnJlbnRfc3RhdGUgPj0gMTA0ICkKKwkJaWYgKCB5eV9jdXJyZW50X3N0YXRlID49IDk0ICkKIAkJCXl5X2MgPSB5eV9tZXRhWyh1bnNpZ25lZCBpbnQpIHl5X2NdOwogCQl9CiAJeXlfY3VycmVudF9zdGF0ZSA9IHl5X254dFt5eV9iYXNlW3l5X2N1cnJlbnRfc3RhdGVdICsgKHVuc2lnbmVkIGludCkgeXlfY107Ci0JeXlfaXNfamFtID0gKHl5X2N1cnJlbnRfc3RhdGUgPT0gMTAzKTsKKwl5eV9pc19qYW0gPSAoeXlfY3VycmVudF9zdGF0ZSA9PSA5Myk7CiAKIAlyZXR1cm4geXlfaXNfamFtID8gMCA6IHl5X2N1cnJlbnRfc3RhdGU7CiB9CkBAIC0xNTUwLDExICsxNDM4LDYgQEAKIAkqKHl5X2NfYnVmX3ApID0gJ1wwJzsJLyogcHJlc2VydmUgeXl0ZXh0ICovCiAJKHl5X2hvbGRfY2hhcikgPSAqKysoeXlfY19idWZfcCk7CiAKLQlpZiAoIGMgPT0gJ1xuJyApCi0JCSAgIAotICAgIHl5bGluZW5vKys7Ci07Ci0KIAlyZXR1cm4gYzsKIH0KICNlbmRpZgkvKiBpZm5kZWYgWVlfTk9fSU5QVVQgKi8KQEAgLTE2NjksMTAgKzE1NTIsNiBAQAogCXl5ZnJlZSgodm9pZCAqKSBiICApOwogfQogCi0jaWZuZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gaW50IGlzYXR0eSAoaW50ICk7Ci0jZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KLSAgICAKIC8qIEluaXRpYWxpemVzIG9yIHJlaW5pdGlhbGl6ZXMgYSBidWZmZXIuCiAgKiBUaGlzIGZ1bmN0aW9uIGlzIHNvbWV0aW1lcyBjYWxsZWQgbW9yZSB0aGFuIG9uY2Ugb24gdGhlIHNhbWUgYnVmZmVyLAogICogc3VjaCBhcyBkdXJpbmcgYSB5eXJlc3RhcnQoKSBvciBhdCBFT0YuCkBAIC0xNjk2LDcgKzE1NzUsNyBAQAogICAgICAgICBiLT55eV9ic19jb2x1bW4gPSAwOwogICAgIH0KIAotICAgICAgICBiLT55eV9pc19pbnRlcmFjdGl2ZSA9IGZpbGUgPyAoaXNhdHR5KCBmaWxlbm8oZmlsZSkgKSA+IDApIDogMDsKKyAgICAgICAgYi0+eXlfaXNfaW50ZXJhY3RpdmUgPSAwOwogICAgIAogCWVycm5vID0gb2Vycm5vOwogfQpAQCAtMjAyNSw5ICsxOTA0LDYgQEAKICAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmcm9tIHl5bGV4X2Rlc3Ryb3koKSwgc28gZG9uJ3QgYWxsb2NhdGUgaGVyZS4KICAgICAgKi8KIAotICAgIC8qIFdlIGRvIG5vdCB0b3VjaCB5eWxpbmVubyB1bmxlc3MgdGhlIG9wdGlvbiBpcyBlbmFibGVkLiAqLwotICAgIHl5bGluZW5vID0gIDE7Ci0gICAgCiAgICAgKHl5X2J1ZmZlcl9zdGFjaykgPSAwOwogICAgICh5eV9idWZmZXJfc3RhY2tfdG9wKSA9IDA7CiAgICAgKHl5X2J1ZmZlcl9zdGFja19tYXgpID0gMDsKQEAgLTIxMjAsMTA0ICsxOTk2LDI5IEBACiAKICNkZWZpbmUgWVlUQUJMRVNfTkFNRSAieXl0YWJsZXMiCiAKLSNsaW5lIDIyMiAiZHRjLWxleGVyLmwiCisjbGluZSAxNjggImR0Yy1sZXhlci5sIgogCiAKIAotCi0vKgotICogU3RhY2sgb2YgbmVzdGVkIGluY2x1ZGUgZmlsZSBjb250ZXh0cy4KLSAqLwotCi1zdHJ1Y3QgaW5jbF9maWxlIHsKLQlzdHJ1Y3QgZHRjX2ZpbGUgKmZpbGU7Ci0JWVlfQlVGRkVSX1NUQVRFIHl5X3ByZXZfYnVmOwotCWludCB5eV9wcmV2X2xpbmVubzsKLQlzdHJ1Y3QgaW5jbF9maWxlICpwcmV2OwotfTsKLQotc3RhdGljIHN0cnVjdCBpbmNsX2ZpbGUgKmluY2xfZmlsZV9zdGFjazsKLQotCi0vKgotICogRGV0ZWN0IGluZmluaXRlIGluY2x1ZGUgcmVjdXJzaW9uLgotICovCi0jZGVmaW5lIE1BWF9JTkNMVURFX0RFUFRICSgxMDApCi0KLXN0YXRpYyBpbnQgaW5jbF9kZXB0aCA9IDA7Ci0KLQogc3RhdGljIHZvaWQgcHVzaF9pbnB1dF9maWxlKGNvbnN0IGNoYXIgKmZpbGVuYW1lKQogewotCXN0cnVjdCBpbmNsX2ZpbGUgKmluY2xfZmlsZTsKLQlzdHJ1Y3QgZHRjX2ZpbGUgKm5ld2ZpbGU7Ci0Jc3RydWN0IHNlYXJjaF9wYXRoIHNlYXJjaCwgKnNlYXJjaHB0ciA9IE5VTEw7Ci0KIAlhc3NlcnQoZmlsZW5hbWUpOwogCi0JaWYgKGluY2xfZGVwdGgrKyA+PSBNQVhfSU5DTFVERV9ERVBUSCkKLQkJZGllKCJJbmNsdWRlcyBuZXN0ZWQgdG9vIGRlZXBseSIpOworCXNyY2ZpbGVfcHVzaChmaWxlbmFtZSk7CiAKLQlpZiAoc3JjcG9zX2ZpbGUpIHsKLQkJc2VhcmNoLmRpciA9IHNyY3Bvc19maWxlLT5kaXI7Ci0JCXNlYXJjaC5uZXh0ID0gTlVMTDsKLQkJc2VhcmNoLnByZXYgPSBOVUxMOwotCQlzZWFyY2hwdHIgPSAmc2VhcmNoOwotCX0KKwl5eWluID0gY3VycmVudF9zcmNmaWxlLT5mOwogCi0JbmV3ZmlsZSA9IGR0Y19vcGVuX2ZpbGUoZmlsZW5hbWUsIHNlYXJjaHB0cik7Ci0KLQlpbmNsX2ZpbGUgPSB4bWFsbG9jKHNpemVvZihzdHJ1Y3QgaW5jbF9maWxlKSk7Ci0KLQkvKgotCSAqIFNhdmUgY3VycmVudCBjb250ZXh0LgotCSAqLwotCWluY2xfZmlsZS0+eXlfcHJldl9idWYgPSBZWV9DVVJSRU5UX0JVRkZFUjsKLQlpbmNsX2ZpbGUtPnl5X3ByZXZfbGluZW5vID0geXlsaW5lbm87Ci0JaW5jbF9maWxlLT5maWxlID0gc3JjcG9zX2ZpbGU7Ci0JaW5jbF9maWxlLT5wcmV2ID0gaW5jbF9maWxlX3N0YWNrOwotCi0JaW5jbF9maWxlX3N0YWNrID0gaW5jbF9maWxlOwotCi0JLyoKLQkgKiBFc3RhYmxpc2ggbmV3IGNvbnRleHQuCi0JICovCi0Jc3JjcG9zX2ZpbGUgPSBuZXdmaWxlOwotCXl5bGluZW5vID0gMTsKLQl5eWluID0gbmV3ZmlsZS0+ZmlsZTsKLQl5eV9zd2l0Y2hfdG9fYnVmZmVyKHl5X2NyZWF0ZV9idWZmZXIoeXlpbixZWV9CVUZfU0laRSkpOworCXl5cHVzaF9idWZmZXJfc3RhdGUoeXlfY3JlYXRlX2J1ZmZlcih5eWluLFlZX0JVRl9TSVpFKSk7CiB9CiAKIAogc3RhdGljIGludCBwb3BfaW5wdXRfZmlsZSh2b2lkKQogewotCXN0cnVjdCBpbmNsX2ZpbGUgKmluY2xfZmlsZTsKLQotCWlmIChpbmNsX2ZpbGVfc3RhY2sgPT0gMCkKKwlpZiAoc3JjZmlsZV9wb3AoKSA9PSAwKQogCQlyZXR1cm4gMDsKIAotCWR0Y19jbG9zZV9maWxlKHNyY3Bvc19maWxlKTsKLQotCS8qCi0JICogUG9wLgotCSAqLwotCS0taW5jbF9kZXB0aDsKLQlpbmNsX2ZpbGUgPSBpbmNsX2ZpbGVfc3RhY2s7Ci0JaW5jbF9maWxlX3N0YWNrID0gaW5jbF9maWxlLT5wcmV2OwotCi0JLyoKLQkgKiBSZWNvdmVyIG9sZCBjb250ZXh0LgotCSAqLwotCXl5X2RlbGV0ZV9idWZmZXIoWVlfQ1VSUkVOVF9CVUZGRVIpOwotCXl5X3N3aXRjaF90b19idWZmZXIoaW5jbF9maWxlLT55eV9wcmV2X2J1Zik7Ci0JeXlsaW5lbm8gPSBpbmNsX2ZpbGUtPnl5X3ByZXZfbGluZW5vOwotCXNyY3Bvc19maWxlID0gaW5jbF9maWxlLT5maWxlOwotCXl5aW4gPSBpbmNsX2ZpbGUtPmZpbGUgPyBpbmNsX2ZpbGUtPmZpbGUtPmZpbGUgOiBOVUxMOwotCi0JLyoKLQkgKiBGcmVlIG9sZCBzdGF0ZS4KLQkgKi8KLQlmcmVlKGluY2xfZmlsZSk7CisJeXlwb3BfYnVmZmVyX3N0YXRlKCk7CisJeXlpbiA9IGN1cnJlbnRfc3JjZmlsZS0+ZjsKIAogCXJldHVybiAxOwogfQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9kdGMvZHRjLXBhcnNlci50YWIuY19zaGlwcGVkIGIvc2NyaXB0cy9kdGMvZHRjLXBhcnNlci50YWIuY19zaGlwcGVkCmluZGV4IDI3MTI5MzcuLjliZTJlZWEgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMvZHRjL2R0Yy1wYXJzZXIudGFiLmNfc2hpcHBlZAorKysgYi9zY3JpcHRzL2R0Yy9kdGMtcGFyc2VyLnRhYi5jX3NoaXBwZWQKQEAgLTEsMjQgKzEsMjMgQEAKLS8qIEEgQmlzb24gcGFyc2VyLCBtYWRlIGJ5IEdOVSBCaXNvbiAyLjMuICAqLworCisvKiBBIEJpc29uIHBhcnNlciwgbWFkZSBieSBHTlUgQmlzb24gMi40LjEuICAqLwogCiAvKiBTa2VsZXRvbiBpbXBsZW1lbnRhdGlvbiBmb3IgQmlzb24ncyBZYWNjLWxpa2UgcGFyc2VycyBpbiBDCi0KLSAgIENvcHlyaWdodCAoQykgMTk4NCwgMTk4OSwgMTk5MCwgMjAwMCwgMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwgMjAwNgorICAgCisgICAgICBDb3B5cmlnaHQgKEMpIDE5ODQsIDE5ODksIDE5OTAsIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYKICAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAgIAogICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQorICAgCiAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsCi0gICBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4gICovCisgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCiAKIC8qIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHlvdSBtYXkgY3JlYXRlIGEgbGFyZ2VyIHdvcmsgdGhhdCBjb250YWlucwogICAgcGFydCBvciBhbGwgb2YgdGhlIEJpc29uIHBhcnNlciBza2VsZXRvbiBhbmQgZGlzdHJpYnV0ZSB0aGF0IHdvcmsKQEAgLTI5LDcgKzI4LDcgQEAKICAgIHNwZWNpYWwgZXhjZXB0aW9uLCB3aGljaCB3aWxsIGNhdXNlIHRoZSBza2VsZXRvbiBhbmQgdGhlIHJlc3VsdGluZwogICAgQmlzb24gb3V0cHV0IGZpbGVzIHRvIGJlIGxpY2Vuc2VkIHVuZGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKICAgIExpY2Vuc2Ugd2l0aG91dCB0aGlzIHNwZWNpYWwgZXhjZXB0aW9uLgotCisgICAKICAgIFRoaXMgc3BlY2lhbCBleGNlcHRpb24gd2FzIGFkZGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gaW4KICAgIHZlcnNpb24gMi4yIG9mIEJpc29uLiAgKi8KIApAQCAtNDcsNyArNDYsNyBAQAogI2RlZmluZSBZWUJJU09OIDEKIAogLyogQmlzb24gdmVyc2lvbi4gICovCi0jZGVmaW5lIFlZQklTT05fVkVSU0lPTiAiMi4zIgorI2RlZmluZSBZWUJJU09OX1ZFUlNJT04gIjIuNC4xIgogCiAvKiBTa2VsZXRvbiBuYW1lLiAgKi8KICNkZWZpbmUgWVlTS0VMRVRPTl9OQU1FICJ5YWNjLmMiCkBAIC01NSw1NSArNTQsMzIgQEAKIC8qIFB1cmUgcGFyc2Vycy4gICovCiAjZGVmaW5lIFlZUFVSRSAwCiAKKy8qIFB1c2ggcGFyc2Vycy4gICovCisjZGVmaW5lIFlZUFVTSCAwCisKKy8qIFB1bGwgcGFyc2Vycy4gICovCisjZGVmaW5lIFlZUFVMTCAxCisKIC8qIFVzaW5nIGxvY2F0aW9ucy4gICovCi0jZGVmaW5lIFlZTFNQX05FRURFRCAxCi0KLQotCi0vKiBUb2tlbnMuICAqLwotI2lmbmRlZiBZWVRPS0VOVFlQRQotIyBkZWZpbmUgWVlUT0tFTlRZUEUKLSAgIC8qIFB1dCB0aGUgdG9rZW5zIGludG8gdGhlIHN5bWJvbCB0YWJsZSwgc28gdGhhdCBHREIgYW5kIG90aGVyIGRlYnVnZ2VycwotICAgICAga25vdyBhYm91dCB0aGVtLiAgKi8KLSAgIGVudW0geXl0b2tlbnR5cGUgewotICAgICBEVF9WMSA9IDI1OCwKLSAgICAgRFRfTUVNUkVTRVJWRSA9IDI1OSwKLSAgICAgRFRfUFJPUE5PREVOQU1FID0gMjYwLAotICAgICBEVF9MSVRFUkFMID0gMjYxLAotICAgICBEVF9MRUdBQ1lMSVRFUkFMID0gMjYyLAotICAgICBEVF9CQVNFID0gMjYzLAotICAgICBEVF9CWVRFID0gMjY0LAotICAgICBEVF9TVFJJTkcgPSAyNjUsCi0gICAgIERUX0xBQkVMID0gMjY2LAotICAgICBEVF9SRUYgPSAyNjcsCi0gICAgIERUX0lOQ0JJTiA9IDI2OAotICAgfTsKLSNlbmRpZgotLyogVG9rZW5zLiAgKi8KLSNkZWZpbmUgRFRfVjEgMjU4Ci0jZGVmaW5lIERUX01FTVJFU0VSVkUgMjU5Ci0jZGVmaW5lIERUX1BST1BOT0RFTkFNRSAyNjAKLSNkZWZpbmUgRFRfTElURVJBTCAyNjEKLSNkZWZpbmUgRFRfTEVHQUNZTElURVJBTCAyNjIKLSNkZWZpbmUgRFRfQkFTRSAyNjMKLSNkZWZpbmUgRFRfQllURSAyNjQKLSNkZWZpbmUgRFRfU1RSSU5HIDI2NQotI2RlZmluZSBEVF9MQUJFTCAyNjYKLSNkZWZpbmUgRFRfUkVGIDI2NwotI2RlZmluZSBEVF9JTkNCSU4gMjY4Ci0KKyNkZWZpbmUgWVlMU1BfTkVFREVEIDAKIAogCiAKIC8qIENvcHkgdGhlIGZpcnN0IHBhcnQgb2YgdXNlciBkZWNsYXJhdGlvbnMuICAqLwotI2xpbmUgMjMgImR0Yy1wYXJzZXIueSIKKworLyogTGluZSAxODkgb2YgeWFjYy5jICAqLworI2xpbmUgMjEgImR0Yy1wYXJzZXIueSIKIAogI2luY2x1ZGUgPHN0ZGlvLmg+CiAKICNpbmNsdWRlICJkdGMuaCIKICNpbmNsdWRlICJzcmNwb3MuaCIKIAorWVlMVFlQRSB5eWxsb2M7CisKIGV4dGVybiBpbnQgeXlsZXgodm9pZCk7CitleHRlcm4gdm9pZCBwcmludF9lcnJvcihjaGFyIGNvbnN0ICpmbXQsIC4uLik7CitleHRlcm4gdm9pZCB5eWVycm9yKGNoYXIgY29uc3QgKnMpOwogCiBleHRlcm4gc3RydWN0IGJvb3RfaW5mbyAqdGhlX2Jvb3RfaW5mbzsKIGV4dGVybiBpbnQgdHJlZXNvdXJjZV9lcnJvcjsKQEAgLTExMSw2ICs4Nyw5IEBACiBzdGF0aWMgdW5zaWduZWQgbG9uZyBsb25nIGV2YWxfbGl0ZXJhbChjb25zdCBjaGFyICpzLCBpbnQgYmFzZSwgaW50IGJpdHMpOwogCiAKKy8qIExpbmUgMTg5IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDkyICJkdGMtcGFyc2VyLnRhYi5jIgorCiAvKiBFbmFibGluZyB0cmFjZXMuICAqLwogI2lmbmRlZiBZWURFQlVHCiAjIGRlZmluZSBZWURFQlVHIDAKQEAgLTEyOSwxMCArMTA4LDM1IEBACiAjIGRlZmluZSBZWVRPS0VOX1RBQkxFIDAKICNlbmRpZgogCisKKy8qIFRva2Vucy4gICovCisjaWZuZGVmIFlZVE9LRU5UWVBFCisjIGRlZmluZSBZWVRPS0VOVFlQRQorICAgLyogUHV0IHRoZSB0b2tlbnMgaW50byB0aGUgc3ltYm9sIHRhYmxlLCBzbyB0aGF0IEdEQiBhbmQgb3RoZXIgZGVidWdnZXJzCisgICAgICBrbm93IGFib3V0IHRoZW0uICAqLworICAgZW51bSB5eXRva2VudHlwZSB7CisgICAgIERUX1YxID0gMjU4LAorICAgICBEVF9NRU1SRVNFUlZFID0gMjU5LAorICAgICBEVF9QUk9QTk9ERU5BTUUgPSAyNjAsCisgICAgIERUX0xJVEVSQUwgPSAyNjEsCisgICAgIERUX0JBU0UgPSAyNjIsCisgICAgIERUX0JZVEUgPSAyNjMsCisgICAgIERUX1NUUklORyA9IDI2NCwKKyAgICAgRFRfTEFCRUwgPSAyNjUsCisgICAgIERUX1JFRiA9IDI2NiwKKyAgICAgRFRfSU5DQklOID0gMjY3CisgICB9OworI2VuZGlmCisKKworCiAjaWYgISBkZWZpbmVkIFlZU1RZUEUgJiYgISBkZWZpbmVkIFlZU1RZUEVfSVNfREVDTEFSRUQKIHR5cGVkZWYgdW5pb24gWVlTVFlQRQotI2xpbmUgMzcgImR0Yy1wYXJzZXIueSIKIHsKKworLyogTGluZSAyMTQgb2YgeWFjYy5jICAqLworI2xpbmUgMzkgImR0Yy1wYXJzZXIueSIKKwogCWNoYXIgKnByb3Bub2RlbmFtZTsKIAljaGFyICpsaXRlcmFsOwogCWNoYXIgKmxhYmVscmVmOwpAQCAtMTQ3LDM0ICsxNTEsMjMgQEAKIAlzdHJ1Y3Qgbm9kZSAqbm9kZTsKIAlzdHJ1Y3Qgbm9kZSAqbm9kZWxpc3Q7CiAJc3RydWN0IHJlc2VydmVfaW5mbyAqcmU7Ci19Ci0vKiBMaW5lIDE4NyBvZiB5YWNjLmMuICAqLwotI2xpbmUgMTUzICJkdGMtcGFyc2VyLnRhYi5jIgotCVlZU1RZUEU7CisKKworCisvKiBMaW5lIDIxNCBvZiB5YWNjLmMgICovCisjbGluZSAxNTkgImR0Yy1wYXJzZXIudGFiLmMiCit9IFlZU1RZUEU7CisjIGRlZmluZSBZWVNUWVBFX0lTX1RSSVZJQUwgMQogIyBkZWZpbmUgeXlzdHlwZSBZWVNUWVBFIC8qIG9ic29sZXNjZW50OyB3aWxsIGJlIHdpdGhkcmF3biAqLwogIyBkZWZpbmUgWVlTVFlQRV9JU19ERUNMQVJFRCAxCi0jIGRlZmluZSBZWVNUWVBFX0lTX1RSSVZJQUwgMQotI2VuZGlmCi0KLSNpZiAhIGRlZmluZWQgWVlMVFlQRSAmJiAhIGRlZmluZWQgWVlMVFlQRV9JU19ERUNMQVJFRAotdHlwZWRlZiBzdHJ1Y3QgWVlMVFlQRQotewotICBpbnQgZmlyc3RfbGluZTsKLSAgaW50IGZpcnN0X2NvbHVtbjsKLSAgaW50IGxhc3RfbGluZTsKLSAgaW50IGxhc3RfY29sdW1uOwotfSBZWUxUWVBFOwotIyBkZWZpbmUgeXlsdHlwZSBZWUxUWVBFIC8qIG9ic29sZXNjZW50OyB3aWxsIGJlIHdpdGhkcmF3biAqLwotIyBkZWZpbmUgWVlMVFlQRV9JU19ERUNMQVJFRCAxCi0jIGRlZmluZSBZWUxUWVBFX0lTX1RSSVZJQUwgMQogI2VuZGlmCiAKIAogLyogQ29weSB0aGUgc2Vjb25kIHBhcnQgb2YgdXNlciBkZWNsYXJhdGlvbnMuICAqLwogCiAKLS8qIExpbmUgMjE2IG9mIHlhY2MuYy4gICovCi0jbGluZSAxNzggImR0Yy1wYXJzZXIudGFiLmMiCisvKiBMaW5lIDI2NCBvZiB5YWNjLmMgICovCisjbGluZSAxNzEgImR0Yy1wYXJzZXIudGFiLmMiCiAKICNpZmRlZiBzaG9ydAogIyB1bmRlZiBzaG9ydApAQCAtMjQ5LDE0ICsyNDIsMTQgQEAKICNpZiAoZGVmaW5lZCBfX1NURENfXyB8fCBkZWZpbmVkIF9fQzk5X19GVU5DX18gXAogICAgICB8fCBkZWZpbmVkIF9fY3BsdXNwbHVzIHx8IGRlZmluZWQgX01TQ19WRVIpCiBzdGF0aWMgaW50Ci1ZWUlEIChpbnQgaSkKK1lZSUQgKGludCB5eWkpCiAjZWxzZQogc3RhdGljIGludAotWVlJRCAoaSkKLSAgICBpbnQgaTsKK1lZSUQgKHl5aSkKKyAgICBpbnQgeXlpOwogI2VuZGlmCiB7Ci0gIHJldHVybiBpOworICByZXR1cm4geXlpOwogfQogI2VuZGlmCiAKQEAgLTMzMiwxNSArMzI1LDEzIEBACiAKICNpZiAoISBkZWZpbmVkIHl5b3ZlcmZsb3cgXAogICAgICAmJiAoISBkZWZpbmVkIF9fY3BsdXNwbHVzIFwKLQkgfHwgKGRlZmluZWQgWVlMVFlQRV9JU19UUklWSUFMICYmIFlZTFRZUEVfSVNfVFJJVklBTCBcCi0JICAgICAmJiBkZWZpbmVkIFlZU1RZUEVfSVNfVFJJVklBTCAmJiBZWVNUWVBFX0lTX1RSSVZJQUwpKSkKKwkgfHwgKGRlZmluZWQgWVlTVFlQRV9JU19UUklWSUFMICYmIFlZU1RZUEVfSVNfVFJJVklBTCkpKQogCiAvKiBBIHR5cGUgdGhhdCBpcyBwcm9wZXJseSBhbGlnbmVkIGZvciBhbnkgc3RhY2sgbWVtYmVyLiAgKi8KIHVuaW9uIHl5YWxsb2MKIHsKLSAgeXl0eXBlX2ludDE2IHl5c3M7Ci0gIFlZU1RZUEUgeXl2czsKLSAgICBZWUxUWVBFIHl5bHM7CisgIHl5dHlwZV9pbnQxNiB5eXNzX2FsbG9jOworICBZWVNUWVBFIHl5dnNfYWxsb2M7CiB9OwogCiAvKiBUaGUgc2l6ZSBvZiB0aGUgbWF4aW11bSBnYXAgYmV0d2VlbiBvbmUgYWxpZ25lZCBzdGFjayBhbmQgdGhlIG5leHQuICAqLwpAQCAtMzQ5LDggKzM0MCw4IEBACiAvKiBUaGUgc2l6ZSBvZiBhbiBhcnJheSBsYXJnZSB0byBlbm91Z2ggdG8gaG9sZCBhbGwgc3RhY2tzLCBlYWNoIHdpdGgKICAgIE4gZWxlbWVudHMuICAqLwogIyBkZWZpbmUgWVlTVEFDS19CWVRFUyhOKSBcCi0gICAgICgoTikgKiAoc2l6ZW9mICh5eXR5cGVfaW50MTYpICsgc2l6ZW9mIChZWVNUWVBFKSArIHNpemVvZiAoWVlMVFlQRSkpIFwKLSAgICAgICsgMiAqIFlZU1RBQ0tfR0FQX01BWElNVU0pCisgICAgICgoTikgKiAoc2l6ZW9mICh5eXR5cGVfaW50MTYpICsgc2l6ZW9mIChZWVNUWVBFKSkgXAorICAgICAgKyBZWVNUQUNLX0dBUF9NQVhJTVVNKQogCiAvKiBDb3B5IENPVU5UIG9iamVjdHMgZnJvbSBGUk9NIHRvIFRPLiAgVGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gZG8KICAgIG5vdCBvdmVybGFwLiAgKi8KQEAgLTM3NSwxMiArMzY2LDEyIEBACiAgICBlbGVtZW50cyBpbiB0aGUgc3RhY2ssIGFuZCBZWVBUUiBnaXZlcyB0aGUgbmV3IGxvY2F0aW9uIG9mIHRoZQogICAgc3RhY2suICBBZHZhbmNlIFlZUFRSIHRvIGEgcHJvcGVybHkgYWxpZ25lZCBsb2NhdGlvbiBmb3IgdGhlIG5leHQKICAgIHN0YWNrLiAgKi8KLSMgZGVmaW5lIFlZU1RBQ0tfUkVMT0NBVEUoU3RhY2spCQkJCQlcCisjIGRlZmluZSBZWVNUQUNLX1JFTE9DQVRFKFN0YWNrX2FsbG9jLCBTdGFjaykJCQkJXAogICAgIGRvCQkJCQkJCQkJXAogICAgICAgewkJCQkJCQkJCVwKIAlZWVNJWkVfVCB5eW5ld2J5dGVzOwkJCQkJCVwKLQlZWUNPUFkgKCZ5eXB0ci0+U3RhY2ssIFN0YWNrLCB5eXNpemUpOwkJCQlcCi0JU3RhY2sgPSAmeXlwdHItPlN0YWNrOwkJCQkJCVwKKwlZWUNPUFkgKCZ5eXB0ci0+U3RhY2tfYWxsb2MsIFN0YWNrLCB5eXNpemUpOwkJCVwKKwlTdGFjayA9ICZ5eXB0ci0+U3RhY2tfYWxsb2M7CQkJCQlcCiAJeXluZXdieXRlcyA9IHl5c3RhY2tzaXplICogc2l6ZW9mICgqU3RhY2spICsgWVlTVEFDS19HQVBfTUFYSU1VTTsgXAogCXl5cHRyICs9IHl5bmV3Ynl0ZXMgLyBzaXplb2YgKCp5eXB0cik7CQkJCVwKICAgICAgIH0JCQkJCQkJCQlcCkBAIC0zODksMjIgKzM4MCwyMiBAQAogI2VuZGlmCiAKIC8qIFlZRklOQUwgLS0gU3RhdGUgbnVtYmVyIG9mIHRoZSB0ZXJtaW5hdGlvbiBzdGF0ZS4gICovCi0jZGVmaW5lIFlZRklOQUwgIDkKKyNkZWZpbmUgWVlGSU5BTCAgNAogLyogWVlMQVNUIC0tIExhc3QgaW5kZXggaW4gWVlUQUJMRS4gICovCi0jZGVmaW5lIFlZTEFTVCAgIDczCisjZGVmaW5lIFlZTEFTVCAgIDU2CiAKIC8qIFlZTlRPS0VOUyAtLSBOdW1iZXIgb2YgdGVybWluYWxzLiAgKi8KLSNkZWZpbmUgWVlOVE9LRU5TICAyNworI2RlZmluZSBZWU5UT0tFTlMgIDI1CiAvKiBZWU5OVFMgLS0gTnVtYmVyIG9mIG5vbnRlcm1pbmFscy4gICovCi0jZGVmaW5lIFlZTk5UUyAgMjAKKyNkZWZpbmUgWVlOTlRTICAxNgogLyogWVlOUlVMRVMgLS0gTnVtYmVyIG9mIHJ1bGVzLiAgKi8KLSNkZWZpbmUgWVlOUlVMRVMgIDQ1CisjZGVmaW5lIFlZTlJVTEVTICAzOQogLyogWVlOUlVMRVMgLS0gTnVtYmVyIG9mIHN0YXRlcy4gICovCi0jZGVmaW5lIFlZTlNUQVRFUyAgNzYKKyNkZWZpbmUgWVlOU1RBVEVTICA2NwogCiAvKiBZWVRSQU5TTEFURShZWUxFWCkgLS0gQmlzb24gc3ltYm9sIG51bWJlciBjb3JyZXNwb25kaW5nIHRvIFlZTEVYLiAgKi8KICNkZWZpbmUgWVlVTkRFRlRPSyAgMgotI2RlZmluZSBZWU1BWFVUT0sgICAyNjgKKyNkZWZpbmUgWVlNQVhVVE9LICAgMjY3CiAKICNkZWZpbmUgWVlUUkFOU0xBVEUoWVlYKQkJCQkJCVwKICAgKCh1bnNpZ25lZCBpbnQpIChZWVgpIDw9IFlZTUFYVVRPSyA/IHl5dHJhbnNsYXRlW1lZWF0gOiBZWVVOREVGVE9LKQpAQCAtNDE2LDE1ICs0MDcsMTUgQEAKICAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAogICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCiAgICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKLSAgICAgIDI0LCAgICAyNiwgICAgIDIsICAgICAyLCAgICAyNSwgICAgMTUsICAgICAyLCAgICAxNiwgICAgIDIsICAgICAyLAotICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgMTQsCi0gICAgICAyMCwgICAgMTksICAgIDIxLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKKyAgICAgIDIyLCAgICAyNCwgICAgIDIsICAgICAyLCAgICAyMywgICAgIDIsICAgICAyLCAgICAxNCwgICAgIDIsICAgICAyLAorICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgMTMsCisgICAgICAxOCwgICAgMTcsICAgIDE5LCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKICAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAogICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCi0gICAgICAgMiwgICAgMjIsICAgICAyLCAgICAyMywgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKKyAgICAgICAyLCAgICAyMCwgICAgIDIsICAgIDIxLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAogICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCiAgICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKLSAgICAgICAyLCAgICAgMiwgICAgIDIsICAgIDE3LCAgICAgMiwgICAgMTgsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgMTUsICAgICAyLCAgICAxNiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCiAgICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKICAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAogICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCkBAIC00MzgsNyArNDI5LDcgQEAKICAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAogICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCiAgICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMSwgICAgIDIsICAgICAzLCAgICAgNCwKLSAgICAgICA1LCAgICAgNiwgICAgIDcsICAgICA4LCAgICAgOSwgICAgMTAsICAgIDExLCAgICAxMiwgICAgMTMKKyAgICAgICA1LCAgICAgNiwgICAgIDcsICAgICA4LCAgICAgOSwgICAgMTAsICAgIDExLCAgICAxMgogfTsKIAogI2lmIFlZREVCVUcKQEAgLTQ0Niw0MSArNDM3LDM3IEBACiAgICBZWVJIUy4gICovCiBzdGF0aWMgY29uc3QgeXl0eXBlX3VpbnQ4IHl5cHJoc1tdID0KIHsKLSAgICAgICAwLCAgICAgMCwgICAgIDMsICAgICA4LCAgICAxMSwgICAgMTIsICAgIDE1LCAgICAyMSwgICAgMjIsICAgIDI1LAotICAgICAgMjcsICAgIDM0LCAgICAzNiwgICAgMzgsICAgIDQxLCAgICA0NywgICAgNDgsICAgIDUxLCAgICA1NywgICAgNjEsCi0gICAgICA2NCwgICAgNjksICAgIDc0LCAgICA3NywgICAgODcsICAgIDkzLCAgICA5NiwgICAgOTcsICAgMTAwLCAgIDEwMywKLSAgICAgMTA0LCAgIDEwNywgICAxMTAsICAgMTEzLCAgIDExNCwgICAxMTYsICAgMTE4LCAgIDEyMSwgICAxMjIsICAgMTI1LAotICAgICAxMjgsICAgMTI5LCAgIDEzMiwgICAxMzUsICAgMTM5LCAgIDE0MAorICAgICAgIDAsICAgICAwLCAgICAgMywgICAgIDgsICAgICA5LCAgICAxMiwgICAgMTcsICAgIDIwLCAgICAyMiwgICAgMjUsCisgICAgICAyOSwgICAgMzMsICAgIDM5LCAgICA0MCwgICAgNDMsICAgIDQ4LCAgICA1MSwgICAgNTQsICAgIDU3LCAgICA2MiwKKyAgICAgIDY3LCAgICA3MCwgICAgODAsICAgIDg2LCAgICA4OSwgICAgOTAsICAgIDkzLCAgICA5NiwgICAgOTcsICAgMTAwLAorICAgICAxMDMsICAgMTA2LCAgIDEwOCwgICAxMDksICAgMTEyLCAgIDExNSwgICAxMTYsICAgMTE5LCAgIDEyMiwgICAxMjUKIH07CiAKIC8qIFlZUkhTIC0tIEEgYC0xJy1zZXBhcmF0ZWQgbGlzdCBvZiB0aGUgcnVsZXMnIFJIUy4gICovCiBzdGF0aWMgY29uc3QgeXl0eXBlX2ludDggeXlyaHNbXSA9CiB7Ci0gICAgICAyOCwgICAgIDAsICAgIC0xLCAgICAgMywgICAgMTQsICAgIDI5LCAgICAzNCwgICAgLTEsICAgIDMxLCAgICAzNCwKLSAgICAgIC0xLCAgICAtMSwgICAgMzAsICAgIDI5LCAgICAtMSwgICAgNDYsICAgICA0LCAgICAzMywgICAgMzMsICAgIDE0LAotICAgICAgLTEsICAgIC0xLCAgICAzMiwgICAgMzEsICAgIC0xLCAgICAzMCwgICAgLTEsICAgIDQ2LCAgICAgNCwgICAgMzMsCi0gICAgICAxNSwgICAgMzMsICAgIDE0LCAgICAtMSwgICAgIDYsICAgIC0xLCAgICAgNywgICAgLTEsICAgIDE2LCAgICAzNSwKLSAgICAgIC0xLCAgICAxNywgICAgMzYsICAgIDQ0LCAgICAxOCwgICAgMTQsICAgIC0xLCAgICAtMSwgICAgMzYsICAgIDM3LAotICAgICAgLTEsICAgIDQ2LCAgICAgNSwgICAgMTksICAgIDM4LCAgICAxNCwgICAgLTEsICAgIDQ2LCAgICAgNSwgICAgMTQsCi0gICAgICAtMSwgICAgMzksICAgIDEwLCAgICAtMSwgICAgMzksICAgIDIwLCAgICA0MCwgICAgMjEsICAgIC0xLCAgICAzOSwKLSAgICAgIDIyLCAgICA0MywgICAgMjMsICAgIC0xLCAgICAzOSwgICAgMTIsICAgIC0xLCAgICAzOSwgICAgMTMsICAgIDI0LAotICAgICAgMTAsICAgIDI1LCAgICAzMywgICAgMjUsICAgIDMzLCAgICAyNiwgICAgLTEsICAgIDM5LCAgICAxMywgICAgMjQsCi0gICAgICAxMCwgICAgMjYsICAgIC0xLCAgICAzOCwgICAgMTEsICAgIC0xLCAgICAtMSwgICAgMzgsICAgIDI1LCAgICAtMSwKLSAgICAgIDM5LCAgICAxMSwgICAgLTEsICAgIC0xLCAgICA0MCwgICAgNDIsICAgIC0xLCAgICA0MCwgICAgMTIsICAgIC0xLAotICAgICAgNDAsICAgIDExLCAgICAtMSwgICAgLTEsICAgICA4LCAgICAtMSwgICAgIDYsICAgIC0xLCAgICA0MSwgICAgIDcsCi0gICAgICAtMSwgICAgLTEsICAgIDQzLCAgICAgOSwgICAgLTEsICAgIDQzLCAgICAxMSwgICAgLTEsICAgIC0xLCAgICA0NSwKLSAgICAgIDQ0LCAgICAtMSwgICAgNDUsICAgIDM3LCAgICAtMSwgICAgNDYsICAgICA1LCAgICAzNSwgICAgLTEsICAgIC0xLAotICAgICAgMTEsICAgIC0xCisgICAgICAyNiwgICAgIDAsICAgIC0xLCAgICAgMywgICAgMTMsICAgIDI3LCAgICAzMCwgICAgLTEsICAgIC0xLCAgICAyOCwKKyAgICAgIDI3LCAgICAtMSwgICAgIDQsICAgIDI5LCAgICAyOSwgICAgMTMsICAgIC0xLCAgICAxMCwgICAgMjgsICAgIC0xLAorICAgICAgIDYsICAgIC0xLCAgICAxNCwgICAgMzEsICAgIC0xLCAgICAzMCwgICAgMTQsICAgIDMxLCAgICAtMSwgICAgMzAsCisgICAgICAxMSwgICAgMzEsICAgIC0xLCAgICAxNSwgICAgMzIsICAgIDM5LCAgICAxNiwgICAgMTMsICAgIC0xLCAgICAtMSwKKyAgICAgIDMyLCAgICAzMywgICAgLTEsICAgICA1LCAgICAxNywgICAgMzQsICAgIDEzLCAgICAtMSwgICAgIDUsICAgIDEzLAorICAgICAgLTEsICAgIDEwLCAgICAzMywgICAgLTEsICAgIDM1LCAgICAgOSwgICAgLTEsICAgIDM1LCAgICAxOCwgICAgMzYsCisgICAgICAxOSwgICAgLTEsICAgIDM1LCAgICAyMCwgICAgMzgsICAgIDIxLCAgICAtMSwgICAgMzUsICAgIDExLCAgICAtMSwKKyAgICAgIDM1LCAgICAxMiwgICAgMjIsICAgICA5LCAgICAyMywgICAgMjksICAgIDIzLCAgICAyOSwgICAgMjQsICAgIC0xLAorICAgICAgMzUsICAgIDEyLCAgICAyMiwgICAgIDksICAgIDI0LCAgICAtMSwgICAgMzQsICAgIDEwLCAgICAtMSwgICAgLTEsCisgICAgICAzNCwgICAgMjMsICAgIC0xLCAgICAzNSwgICAgMTAsICAgIC0xLCAgICAtMSwgICAgMzYsICAgIDM3LCAgICAtMSwKKyAgICAgIDM2LCAgICAxMSwgICAgLTEsICAgIDM2LCAgICAxMCwgICAgLTEsICAgICA2LCAgICAtMSwgICAgLTEsICAgIDM4LAorICAgICAgIDgsICAgIC0xLCAgICAzOCwgICAgMTAsICAgIC0xLCAgICAtMSwgICAgNDAsICAgIDM5LCAgICAtMSwgICAgNDAsCisgICAgICAzMywgICAgLTEsICAgICA1LCAgICAzMSwgICAgLTEsICAgIDEwLCAgICA0MCwgICAgLTEKIH07CiAKIC8qIFlZUkxJTkVbWVlOXSAtLSBzb3VyY2UgbGluZSB3aGVyZSBydWxlIG51bWJlciBZWU4gd2FzIGRlZmluZWQuICAqLwogc3RhdGljIGNvbnN0IHl5dHlwZV91aW50MTYgeXlybGluZVtdID0KIHsKLSAgICAgICAwLCAgICA4OSwgICAgODksICAgIDkzLCAgIDEwMSwgICAxMDQsICAgMTExLCAgIDExOSwgICAxMjIsICAgMTI5LAotICAgICAxMzMsICAgMTQwLCAgIDE0NCwgICAxNTEsICAgMTU4LCAgIDE2NiwgICAxNjksICAgMTc2LCAgIDE4MCwgICAxODcsCi0gICAgIDE5MSwgICAxOTUsICAgMTk5LCAgIDIwMywgICAyMjAsICAgMjMxLCAgIDIzOSwgICAyNDIsICAgMjQ2LCAgIDI1NCwKLSAgICAgMjU3LCAgIDI2MSwgICAyNjYsICAgMjc0LCAgIDI3NywgICAyODEsICAgMjg1LCAgIDI5MywgICAyOTYsICAgMzAwLAotICAgICAzMDgsICAgMzExLCAgIDMxNSwgICAzMjMsICAgMzMxLCAgIDMzNAorICAgICAgIDAsICAgIDg2LCAgICA4NiwgICAgOTUsICAgIDk4LCAgIDEwNSwgICAxMDksICAgMTE3LCAgIDEyNCwgICAxMjgsCisgICAgIDEzMiwgICAxNDUsICAgMTUzLCAgIDE1NiwgICAxNjMsICAgMTY3LCAgIDE3MSwgICAxNzksICAgMTgzLCAgIDE4NywKKyAgICAgMTkxLCAgIDE5NSwgICAyMTIsICAgMjIyLCAgIDIzMCwgICAyMzMsICAgMjM3LCAgIDI0NSwgICAyNDgsICAgMjUyLAorICAgICAyNTcsICAgMjY0LCAgIDI3MiwgICAyNzUsICAgMjc5LCAgIDI4NywgICAyOTAsICAgMjk0LCAgIDMwMiwgICAzMDYKIH07CiAjZW5kaWYKIApAQCAtNDkwLDEzICs0NzcsMTIgQEAKIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCB5eXRuYW1lW10gPQogewogICAiJGVuZCIsICJlcnJvciIsICIkdW5kZWZpbmVkIiwgIkRUX1YxIiwgIkRUX01FTVJFU0VSVkUiLAotICAiRFRfUFJPUE5PREVOQU1FIiwgIkRUX0xJVEVSQUwiLCAiRFRfTEVHQUNZTElURVJBTCIsICJEVF9CQVNFIiwKLSAgIkRUX0JZVEUiLCAiRFRfU1RSSU5HIiwgIkRUX0xBQkVMIiwgIkRUX1JFRiIsICJEVF9JTkNCSU4iLCAiJzsnIiwgIictJyIsCi0gICInLyciLCAiJ3snIiwgIid9JyIsICInPSciLCAiJzwnIiwgIic+JyIsICInWyciLCAiJ10nIiwgIicoJyIsICInLCciLAotICAiJyknIiwgIiRhY2NlcHQiLCAic291cmNlZmlsZSIsICJtZW1yZXNlcnZlcyIsICJtZW1yZXNlcnZlIiwKLSAgInYwX21lbXJlc2VydmVzIiwgInYwX21lbXJlc2VydmUiLCAiYWRkciIsICJkZXZpY2V0cmVlIiwgIm5vZGVkZWYiLAotICAicHJvcGxpc3QiLCAicHJvcGRlZiIsICJwcm9wZGF0YSIsICJwcm9wZGF0YXByZWZpeCIsICJjZWxsbGlzdCIsCi0gICJjZWxsYmFzZSIsICJjZWxsdmFsIiwgImJ5dGVzdHJpbmciLCAic3Vibm9kZXMiLCAic3Vibm9kZSIsICJsYWJlbCIsIDAKKyAgIkRUX1BST1BOT0RFTkFNRSIsICJEVF9MSVRFUkFMIiwgIkRUX0JBU0UiLCAiRFRfQllURSIsICJEVF9TVFJJTkciLAorICAiRFRfTEFCRUwiLCAiRFRfUkVGIiwgIkRUX0lOQ0JJTiIsICInOyciLCAiJy8nIiwgIid7JyIsICInfSciLCAiJz0nIiwKKyAgIic8JyIsICInPiciLCAiJ1snIiwgIiddJyIsICInKCciLCAiJywnIiwgIicpJyIsICIkYWNjZXB0IiwgInNvdXJjZWZpbGUiLAorICAibWVtcmVzZXJ2ZXMiLCAibWVtcmVzZXJ2ZSIsICJhZGRyIiwgImRldmljZXRyZWUiLCAibm9kZWRlZiIsICJwcm9wbGlzdCIsCisgICJwcm9wZGVmIiwgInByb3BkYXRhIiwgInByb3BkYXRhcHJlZml4IiwgImNlbGxsaXN0IiwgImNlbGx2YWwiLAorICAiYnl0ZXN0cmluZyIsICJzdWJub2RlcyIsICJzdWJub2RlIiwgMAogfTsKICNlbmRpZgogCkBAIC01MDYsMjkgKzQ5MiwyNyBAQAogc3RhdGljIGNvbnN0IHl5dHlwZV91aW50MTYgeXl0b2tudW1bXSA9CiB7CiAgICAgICAgMCwgICAyNTYsICAgMjU3LCAgIDI1OCwgICAyNTksICAgMjYwLCAgIDI2MSwgICAyNjIsICAgMjYzLCAgIDI2NCwKLSAgICAgMjY1LCAgIDI2NiwgICAyNjcsICAgMjY4LCAgICA1OSwgICAgNDUsICAgIDQ3LCAgIDEyMywgICAxMjUsICAgIDYxLAotICAgICAgNjAsICAgIDYyLCAgICA5MSwgICAgOTMsICAgIDQwLCAgICA0NCwgICAgNDEKKyAgICAgMjY1LCAgIDI2NiwgICAyNjcsICAgIDU5LCAgICA0NywgICAxMjMsICAgMTI1LCAgICA2MSwgICAgNjAsICAgIDYyLAorICAgICAgOTEsICAgIDkzLCAgICA0MCwgICAgNDQsICAgIDQxCiB9OwogIyBlbmRpZgogCiAvKiBZWVIxW1lZTl0gLS0gU3ltYm9sIG51bWJlciBvZiBzeW1ib2wgdGhhdCBydWxlIFlZTiBkZXJpdmVzLiAgKi8KIHN0YXRpYyBjb25zdCB5eXR5cGVfdWludDggeXlyMVtdID0KIHsKLSAgICAgICAwLCAgICAyNywgICAgMjgsICAgIDI4LCAgICAyOSwgICAgMjksICAgIDMwLCAgICAzMSwgICAgMzEsICAgIDMyLAotICAgICAgMzIsICAgIDMzLCAgICAzMywgICAgMzQsICAgIDM1LCAgICAzNiwgICAgMzYsICAgIDM3LCAgICAzNywgICAgMzgsCi0gICAgICAzOCwgICAgMzgsICAgIDM4LCAgICAzOCwgICAgMzgsICAgIDM4LCAgICAzOSwgICAgMzksICAgIDM5LCAgICA0MCwKLSAgICAgIDQwLCAgICA0MCwgICAgNDAsICAgIDQxLCAgICA0MSwgICAgNDIsICAgIDQyLCAgICA0MywgICAgNDMsICAgIDQzLAotICAgICAgNDQsICAgIDQ0LCAgICA0NCwgICAgNDUsICAgIDQ2LCAgICA0NgorICAgICAgIDAsICAgIDI1LCAgICAyNiwgICAgMjcsICAgIDI3LCAgICAyOCwgICAgMjgsICAgIDI5LCAgICAzMCwgICAgMzAsCisgICAgICAzMCwgICAgMzEsICAgIDMyLCAgICAzMiwgICAgMzMsICAgIDMzLCAgICAzMywgICAgMzQsICAgIDM0LCAgICAzNCwKKyAgICAgIDM0LCAgICAzNCwgICAgMzQsICAgIDM0LCAgICAzNSwgICAgMzUsICAgIDM1LCAgICAzNiwgICAgMzYsICAgIDM2LAorICAgICAgMzYsICAgIDM3LCAgICAzOCwgICAgMzgsICAgIDM4LCAgICAzOSwgICAgMzksICAgIDM5LCAgICA0MCwgICAgNDAKIH07CiAKIC8qIFlZUjJbWVlOXSAtLSBOdW1iZXIgb2Ygc3ltYm9scyBjb21wb3NpbmcgcmlnaHQgaGFuZCBzaWRlIG9mIHJ1bGUgWVlOLiAgKi8KIHN0YXRpYyBjb25zdCB5eXR5cGVfdWludDggeXlyMltdID0KIHsKLSAgICAgICAwLCAgICAgMiwgICAgIDQsICAgICAyLCAgICAgMCwgICAgIDIsICAgICA1LCAgICAgMCwgICAgIDIsICAgICAxLAotICAgICAgIDYsICAgICAxLCAgICAgMSwgICAgIDIsICAgICA1LCAgICAgMCwgICAgIDIsICAgICA1LCAgICAgMywgICAgIDIsCi0gICAgICAgNCwgICAgIDQsICAgICAyLCAgICAgOSwgICAgIDUsICAgICAyLCAgICAgMCwgICAgIDIsICAgICAyLCAgICAgMCwKLSAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAwLCAgICAgMSwgICAgIDEsICAgICAyLCAgICAgMCwgICAgIDIsICAgICAyLAotICAgICAgIDAsICAgICAyLCAgICAgMiwgICAgIDMsICAgICAwLCAgICAgMQorICAgICAgIDAsICAgICAyLCAgICAgNCwgICAgIDAsICAgICAyLCAgICAgNCwgICAgIDIsICAgICAxLCAgICAgMiwgICAgIDMsCisgICAgICAgMywgICAgIDUsICAgICAwLCAgICAgMiwgICAgIDQsICAgICAyLCAgICAgMiwgICAgIDIsICAgICA0LCAgICAgNCwKKyAgICAgICAyLCAgICAgOSwgICAgIDUsICAgICAyLCAgICAgMCwgICAgIDIsICAgICAyLCAgICAgMCwgICAgIDIsICAgICAyLAorICAgICAgIDIsICAgICAxLCAgICAgMCwgICAgIDIsICAgICAyLCAgICAgMCwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIKIH07CiAKIC8qIFlZREVGQUNUW1NUQVRFLU5BTUVdIC0tIERlZmF1bHQgcnVsZSB0byByZWR1Y2Ugd2l0aCBpbiBzdGF0ZQpAQCAtNTM2LDg2ICs1MjAsNzkgQEAKICAgIG1lYW5zIHRoZSBkZWZhdWx0IGlzIGFuIGVycm9yLiAgKi8KIHN0YXRpYyBjb25zdCB5eXR5cGVfdWludDggeXlkZWZhY3RbXSA9CiB7Ci0gICAgICAgNywgICAgIDAsICAgIDQ1LCAgICAgMCwgICAgIDksICAgICAwLCAgICAgNywgICAgIDAsICAgICA0LCAgICAgMSwKLSAgICAgICAwLCAgICAgMywgICAgIDgsICAgICAwLCAgICAgMCwgICAgIDQsICAgICAwLCAgICAxNSwgICAgMTMsICAgIDExLAotICAgICAgMTIsICAgICAwLCAgICAgMiwgICAgIDUsICAgICAwLCAgICA0MCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgMTYsCi0gICAgICAgMCwgICAgNDAsICAgICAwLCAgICAgMCwgICAgIDYsICAgICAwLCAgICA0MiwgICAgNDEsICAgICAwLCAgICAxMCwKLSAgICAgIDE0LCAgICAxOCwgICAgMjYsICAgIDQzLCAgICAgMCwgICAgIDAsICAgIDI1LCAgICAxNywgICAgMjcsICAgIDE5LAotICAgICAgMjgsICAgIDIyLCAgICAgMCwgICAgMjksICAgIDM3LCAgICAgMCwgICAgMzMsICAgICAwLCAgICAgMCwgICAgMzUsCi0gICAgICAzNCwgICAgMzIsICAgIDMxLCAgICAyMCwgICAgIDAsICAgIDMwLCAgICAzOCwgICAgMzksICAgIDIxLCAgICAgMCwKLSAgICAgIDI0LCAgICAzNiwgICAgIDAsICAgICAwLCAgICAgMCwgICAgMjMKKyAgICAgICAwLCAgICAgMCwgICAgIDAsICAgICAzLCAgICAgMSwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDMsICAgICA3LAorICAgICAgIDAsICAgICA2LCAgICAgMCwgICAgIDIsICAgICA0LCAgICAgMCwgICAgMTIsICAgICA4LCAgICAgMCwgICAgIDAsCisgICAgICAgNSwgICAgMzUsICAgIDEwLCAgICAgOSwgICAgIDAsICAgICAwLCAgICAxMywgICAgIDAsICAgIDM1LCAgICAxNSwKKyAgICAgIDI0LCAgICAzOCwgICAgMTYsICAgIDM5LCAgICAgMCwgICAgMzcsICAgIDM2LCAgICAgMCwgICAgIDAsICAgIDExLAorICAgICAgMjMsICAgIDE0LCAgICAyNSwgICAgMTcsICAgIDI2LCAgICAyMCwgICAgIDAsICAgIDI3LCAgICAzMiwgICAgIDAsCisgICAgICAgMCwgICAgIDAsICAgICAwLCAgICAzMSwgICAgMzAsICAgIDI5LCAgICAxOCwgICAgMjgsICAgIDMzLCAgICAzNCwKKyAgICAgIDE5LCAgICAgMCwgICAgMjIsICAgICAwLCAgICAgMCwgICAgIDAsICAgIDIxCiB9OwogCiAvKiBZWURFRkdPVE9bTlRFUk0tTlVNXS4gICovCiBzdGF0aWMgY29uc3QgeXl0eXBlX2ludDggeXlkZWZnb3RvW10gPQogewotICAgICAgLTEsICAgICAzLCAgICAxNCwgICAgIDQsICAgICA1LCAgICAgNiwgICAgMjcsICAgIDExLCAgICAxOCwgICAgMjUsCi0gICAgICAyOSwgICAgNDQsICAgIDQ1LCAgICA1NiwgICAgNjQsICAgIDY1LCAgICA1NywgICAgMzAsICAgIDMxLCAgICAgNworICAgICAgLTEsICAgICAyLCAgICAgNywgICAgIDgsICAgIDEwLCAgICAxMywgICAgMTcsICAgIDIxLCAgICAyNiwgICAgMzcsCisgICAgICAzOCwgICAgNTAsICAgIDU3LCAgICA1MSwgICAgMjcsICAgIDI4CiB9OwogCiAvKiBZWVBBQ1RbU1RBVEUtTlVNXSAtLSBJbmRleCBpbiBZWVRBQkxFIG9mIHRoZSBwb3J0aW9uIGRlc2NyaWJpbmcKICAgIFNUQVRFLU5VTS4gICovCi0jZGVmaW5lIFlZUEFDVF9OSU5GIC0xNAorI2RlZmluZSBZWVBBQ1RfTklORiAtMTIKIHN0YXRpYyBjb25zdCB5eXR5cGVfaW50OCB5eXBhY3RbXSA9CiB7Ci0gICAgICAzMCwgICAtMTEsICAgLTE0LCAgICAgNywgICAtMTQsICAgIC0xLCAgICAyNywgICAgMTMsICAgIDI3LCAgIC0xNCwKLSAgICAgICA4LCAgIC0xNCwgICAtMTQsICAgIDQwLCAgICAtMSwgICAgMjcsICAgIDM1LCAgIC0xNCwgICAtMTQsICAgLTE0LAotICAgICAtMTQsICAgIDIxLCAgIC0xNCwgICAtMTQsICAgIDQwLCAgICAyNCwgICAgNDAsICAgIDI4LCAgICA0MCwgICAtMTQsCi0gICAgICAzMiwgICAgMjQsICAgIDQ2LCAgICAzOCwgICAtMTQsICAgIDM5LCAgIC0xNCwgICAtMTQsICAgIDI2LCAgIC0xNCwKLSAgICAgLTE0LCAgIC0xNCwgICAtMTQsICAgLTE0LCAgICAtOSwgICAgMTAsICAgLTE0LCAgIC0xNCwgICAtMTQsICAgLTE0LAotICAgICAtMTQsICAgLTE0LCAgICAzMSwgICAtMTQsICAgLTE0LCAgICA0NCwgICAgLTIsICAgICAzLCAgICAyMywgICAtMTQsCi0gICAgIC0xNCwgICAtMTQsICAgLTE0LCAgIC0xNCwgICAgNTAsICAgLTE0LCAgIC0xNCwgICAtMTQsICAgLTE0LCAgICA0MCwKLSAgICAgLTE0LCAgIC0xNCwgICAgMzMsICAgIDQwLCAgICAzNiwgICAtMTQKKyAgICAgIDEwLCAgIC0xMSwgICAgMTgsICAgIC0xLCAgIC0xMiwgICAgMjIsICAgIC0xLCAgICAxNSwgICAgLTEsICAgLTEyLAorICAgICAgMjIsICAgLTEyLCAgICAyMCwgICAgIDEsICAgLTEyLCAgICAxNywgICAtMTIsICAgLTEyLCAgICAyMCwgICAgMjAsCisgICAgIC0xMiwgICAgIDYsICAgLTEyLCAgIC0xMiwgICAgMjEsICAgICA2LCAgIC0xMiwgICAgMjMsICAgICA2LCAgIC0xMiwKKyAgICAgLTEyLCAgIC0xMiwgICAtMTIsICAgLTEyLCAgICAyOCwgICAtMTIsICAgLTEyLCAgICAtNiwgICAgMTMsICAgLTEyLAorICAgICAtMTIsICAgLTEyLCAgIC0xMiwgICAtMTIsICAgLTEyLCAgIC0xMiwgICAgMjQsICAgLTEyLCAgIC0xMiwgICAgMzMsCisgICAgICAtNSwgICAgIDAsICAgIC00LCAgIC0xMiwgICAtMTIsICAgLTEyLCAgIC0xMiwgICAtMTIsICAgLTEyLCAgIC0xMiwKKyAgICAgLTEyLCAgICAyMiwgICAtMTIsICAgIDI1LCAgICAyMiwgICAgMTksICAgLTEyCiB9OwogCiAvKiBZWVBHT1RPW05URVJNLU5VTV0uICAqLwogc3RhdGljIGNvbnN0IHl5dHlwZV9pbnQ4IHl5cGdvdG9bXSA9CiB7Ci0gICAgIC0xNCwgICAtMTQsICAgIDQ4LCAgICAyOSwgICAgNTMsICAgLTE0LCAgIC0xMywgICAgNDcsICAgIDM0LCAgIC0xNCwKLSAgICAgIDM3LCAgIC0xNCwgICAtMTQsICAgLTE0LCAgIC0xNCwgICAtMTQsICAgLTE0LCAgICA0MiwgICAtMTQsICAgIC03CisgICAgIC0xMiwgICAtMTIsICAgIDM2LCAgICAzOSwgICAtMTAsICAgLTEyLCAgICAgOCwgICAtMTIsICAgIDEyLCAgIC0xMiwKKyAgICAgLTEyLCAgIC0xMiwgICAtMTIsICAgLTEyLCAgICAyNywgICAgMzEKIH07CiAKIC8qIFlZVEFCTEVbWVlQQUNUW1NUQVRFLU5VTV1dLiAgV2hhdCB0byBkbyBpbiBzdGF0ZSBTVEFURS1OVU0uICBJZgogICAgcG9zaXRpdmUsIHNoaWZ0IHRoYXQgdG9rZW4uICBJZiBuZWdhdGl2ZSwgcmVkdWNlIHRoZSBydWxlIHdoaWNoCiAgICBudW1iZXIgaXMgdGhlIG9wcG9zaXRlLiAgSWYgemVybywgZG8gd2hhdCBZWURFRkFDVCBzYXlzLgogICAgSWYgWVlUQUJMRV9OSU5GLCBzeW50YXggZXJyb3IuICAqLwotI2RlZmluZSBZWVRBQkxFX05JTkYgLTQ1Ci1zdGF0aWMgY29uc3QgeXl0eXBlX2ludDggeXl0YWJsZVtdID0KKyNkZWZpbmUgWVlUQUJMRV9OSU5GIC0xCitzdGF0aWMgY29uc3QgeXl0eXBlX3VpbnQ4IHl5dGFibGVbXSA9CiB7Ci0gICAgICAyMSwgICAgMTYsICAgIDQ2LCAgICAgOCwgICAgNTksICAgIDQ3LCAgICA2MCwgICAgIDksICAgIDE2LCAgICA2MSwKLSAgICAgIDYyLCAgICAyOCwgICAgNjYsICAgIDMzLCAgICA2NywgICAgMTAsICAgIDQ4LCAgICAxMywgICAgMzIsICAgIDYzLAotICAgICAgNDksICAgIDUwLCAgICA1MSwgICAgNTIsICAgIDMyLCAgICAxNywgICAgNjgsICAgIDE5LCAgICAyMCwgICAtNDQsCi0gICAgICA1MywgICAtNDQsICAgIDU0LCAgICAgMSwgICAtNDQsICAgICAyLCAgICAyNiwgICAgMTUsICAgICAyLCAgICAyNCwKLSAgICAgIDQxLCAgICAgMiwgICAgMzQsICAgIDE3LCAgICAxNSwgICAgNDIsICAgIDE5LCAgICAyMCwgICAgNjksICAgIDcwLAotICAgICAgMzUsICAgIDM4LCAgICAzOSwgICAgNDAsICAgIDU4LCAgICA1NSwgICAgNzIsICAgIDcxLCAgICA3MywgICAgMTIsCi0gICAgICA3NCwgICAgMjIsICAgIDc1LCAgICAyMywgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgIDM2LCAgICAgMCwKLSAgICAgICAwLCAgICAgMCwgICAgNDMsICAgIDM3CisgICAgICAxNSwgICAgNTMsICAgICAzLCAgICAgNSwgICAgNDAsICAgIDU0LCAgICA1NSwgICAgNDEsICAgIDU4LCAgICAgNiwKKyAgICAgIDU5LCAgICAyNCwgICAgMTgsICAgICAxLCAgICA1NiwgICAgMTksICAgIDI1LCAgICA0MiwgICAgIDQsICAgIDYxLAorICAgICAgNjIsICAgIDYwLCAgICA0MywgICAgNDQsICAgIDQ1LCAgICA0NiwgICAgMjIsICAgIDIzLCAgICAgOSwgICAgMTIsCisgICAgICAyMCwgICAgNDcsICAgIDMxLCAgICA0OCwgICAgMjksICAgIDE2LCAgICAxNiwgICAgMzIsICAgIDMwLCAgICAzNCwKKyAgICAgIDM1LCAgICAzOSwgICAgNTIsICAgIDY2LCAgICAxNCwgICAgMTEsICAgIDQ5LCAgICAgMCwgICAgNjQsICAgICAwLAorICAgICAgIDAsICAgIDYzLCAgICAgMCwgICAgIDAsICAgIDY1LCAgICAzNiwgICAgMzMKIH07CiAKIHN0YXRpYyBjb25zdCB5eXR5cGVfaW50OCB5eWNoZWNrW10gPQogewotICAgICAgMTMsICAgICA4LCAgICAxMSwgICAgMTQsICAgICA2LCAgICAxNCwgICAgIDgsICAgICAwLCAgICAxNSwgICAgMTEsCi0gICAgICAxMiwgICAgMjQsICAgICA5LCAgICAyNiwgICAgMTEsICAgIDE2LCAgICAyNSwgICAgIDQsICAgIDI1LCAgICAyMSwKLSAgICAgIDEwLCAgICAxMSwgICAgMTIsICAgIDEzLCAgICAzMSwgICAgMTcsICAgIDIzLCAgICAgNiwgICAgIDcsICAgICA1LAotICAgICAgMjAsICAgICA0LCAgICAyMiwgICAgIDMsICAgICA0LCAgICAxMSwgICAgMTUsICAgICA4LCAgICAxMSwgICAgIDQsCi0gICAgICAxNCwgICAgMTEsICAgIDE0LCAgICAxNywgICAgMTUsICAgIDE5LCAgICAgNiwgICAgIDcsICAgIDI1LCAgICAyNiwKLSAgICAgIDE4LCAgICAgNSwgICAgMTQsICAgIDE0LCAgICAxMCwgICAgMjQsICAgIDY5LCAgICAgNywgICAgMjUsICAgICA2LAotICAgICAgNzMsICAgIDE0LCAgICAyNiwgICAgMTUsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAzMSwgICAgLTEsCi0gICAgICAtMSwgICAgLTEsICAgIDM4LCAgICAzMQorICAgICAgMTAsICAgICA2LCAgICAxMywgICAgIDQsICAgIDEwLCAgICAxMCwgICAgMTEsICAgIDEzLCAgICAgOCwgICAgMTAsCisgICAgICAxMCwgICAgIDUsICAgIDExLCAgICAgMywgICAgMTksICAgIDE0LCAgICAxMCwgICAgMjMsICAgICAwLCAgICAyMywKKyAgICAgIDI0LCAgICAyMSwgICAgIDksICAgIDEwLCAgICAxMSwgICAgMTIsICAgIDE4LCAgICAxOSwgICAgIDYsICAgIDE0LAorICAgICAgMTMsICAgIDE4LCAgICAyNCwgICAgMjAsICAgIDEzLCAgICAxNSwgICAgMTUsICAgIDI1LCAgICAxNywgICAgMTYsCisgICAgICAyOCwgICAgMTMsICAgICA5LCAgICAyNCwgICAgIDgsICAgICA2LCAgICAyMiwgICAgLTEsICAgIDIzLCAgICAtMSwKKyAgICAgIC0xLCAgICA2MSwgICAgLTEsICAgIC0xLCAgICA2NCwgICAgMjgsICAgIDI1CiB9OwogCiAvKiBZWVNUT1NbU1RBVEUtTlVNXSAtLSBUaGUgKGludGVybmFsIG51bWJlciBvZiB0aGUpIGFjY2Vzc2luZwogICAgc3ltYm9sIG9mIHN0YXRlIFNUQVRFLU5VTS4gICovCiBzdGF0aWMgY29uc3QgeXl0eXBlX3VpbnQ4IHl5c3Rvc1tdID0KIHsKLSAgICAgICAwLCAgICAgMywgICAgMTEsICAgIDI4LCAgICAzMCwgICAgMzEsICAgIDMyLCAgICA0NiwgICAgMTQsICAgICAwLAotICAgICAgMTYsICAgIDM0LCAgICAzMSwgICAgIDQsICAgIDI5LCAgICAzMCwgICAgNDYsICAgIDE3LCAgICAzNSwgICAgIDYsCi0gICAgICAgNywgICAgMzMsICAgIDM0LCAgICAyOSwgICAgIDQsICAgIDM2LCAgICAxNSwgICAgMzMsICAgIDMzLCAgICAzNywKLSAgICAgIDQ0LCAgICA0NSwgICAgNDYsICAgIDMzLCAgICAxNCwgICAgMTgsICAgIDM3LCAgICA0NCwgICAgIDUsICAgIDE0LAotICAgICAgMTQsICAgIDE0LCAgICAxOSwgICAgMzUsICAgIDM4LCAgICAzOSwgICAgMTEsICAgIDE0LCAgICAyNSwgICAgMTAsCi0gICAgICAxMSwgICAgMTIsICAgIDEzLCAgICAyMCwgICAgMjIsICAgIDI0LCAgICA0MCwgICAgNDMsICAgIDEwLCAgICAgNiwKLSAgICAgICA4LCAgICAxMSwgICAgMTIsICAgIDIxLCAgICA0MSwgICAgNDIsICAgICA5LCAgICAxMSwgICAgMjMsICAgIDI1LAotICAgICAgMjYsICAgICA3LCAgICAzMywgICAgMjUsICAgIDMzLCAgICAyNgorICAgICAgIDAsICAgICAzLCAgICAyNiwgICAgMTMsICAgICAwLCAgICAgNCwgICAgMTAsICAgIDI3LCAgICAyOCwgICAgIDYsCisgICAgICAyOSwgICAgMjgsICAgIDE0LCAgICAzMCwgICAgMjcsICAgIDI5LCAgICAxNSwgICAgMzEsICAgIDExLCAgICAxNCwKKyAgICAgIDEzLCAgICAzMiwgICAgMzEsICAgIDMxLCAgICAgNSwgICAgMTAsICAgIDMzLCAgICAzOSwgICAgNDAsICAgIDEzLAorICAgICAgMTcsICAgIDMxLCAgICAzMywgICAgNDAsICAgIDE2LCAgICAzMywgICAgMzksICAgIDM0LCAgICAzNSwgICAgMTMsCisgICAgICAxMCwgICAgMTMsICAgIDIzLCAgICAgOSwgICAgMTAsICAgIDExLCAgICAxMiwgICAgMTgsICAgIDIwLCAgICAyMiwKKyAgICAgIDM2LCAgICAzOCwgICAgIDksICAgICA2LCAgICAxMCwgICAgMTEsICAgIDE5LCAgICAzNywgICAgIDgsICAgIDEwLAorICAgICAgMjEsICAgIDIzLCAgICAyNCwgICAgMjksICAgIDIzLCAgICAyOSwgICAgMjQKIH07CiAKICNkZWZpbmUgeXllcnJvawkJKHl5ZXJyc3RhdHVzID0gMCkKQEAgLTcyOCw3ICs3MDUsNyBAQAogICAgIHsJCQkJCQkJCQkgIFwKICAgICAgIFlZRlBSSU5URiAoc3RkZXJyLCAiJXMgIiwgVGl0bGUpOwkJCQkJICBcCiAgICAgICB5eV9zeW1ib2xfcHJpbnQgKHN0ZGVyciwJCQkJCQkgIFwKLQkJICBUeXBlLCBWYWx1ZSwgTG9jYXRpb24pOyBcCisJCSAgVHlwZSwgVmFsdWUpOyBcCiAgICAgICBZWUZQUklOVEYgKHN0ZGVyciwgIlxuIik7CQkJCQkJICBcCiAgICAgfQkJCQkJCQkJCSAgXAogfSB3aGlsZSAoWVlJRCAoMCkpCkBAIC03NDIsMTkgKzcxOSwxNyBAQAogI2lmIChkZWZpbmVkIF9fU1REQ19fIHx8IGRlZmluZWQgX19DOTlfX0ZVTkNfXyBcCiAgICAgIHx8IGRlZmluZWQgX19jcGx1c3BsdXMgfHwgZGVmaW5lZCBfTVNDX1ZFUikKIHN0YXRpYyB2b2lkCi15eV9zeW1ib2xfdmFsdWVfcHJpbnQgKEZJTEUgKnl5b3V0cHV0LCBpbnQgeXl0eXBlLCBZWVNUWVBFIGNvbnN0ICogY29uc3QgeXl2YWx1ZXAsIFlZTFRZUEUgY29uc3QgKiBjb25zdCB5eWxvY2F0aW9ucCkKK3l5X3N5bWJvbF92YWx1ZV9wcmludCAoRklMRSAqeXlvdXRwdXQsIGludCB5eXR5cGUsIFlZU1RZUEUgY29uc3QgKiBjb25zdCB5eXZhbHVlcCkKICNlbHNlCiBzdGF0aWMgdm9pZAoteXlfc3ltYm9sX3ZhbHVlX3ByaW50ICh5eW91dHB1dCwgeXl0eXBlLCB5eXZhbHVlcCwgeXlsb2NhdGlvbnApCit5eV9zeW1ib2xfdmFsdWVfcHJpbnQgKHl5b3V0cHV0LCB5eXR5cGUsIHl5dmFsdWVwKQogICAgIEZJTEUgKnl5b3V0cHV0OwogICAgIGludCB5eXR5cGU7CiAgICAgWVlTVFlQRSBjb25zdCAqIGNvbnN0IHl5dmFsdWVwOwotICAgIFlZTFRZUEUgY29uc3QgKiBjb25zdCB5eWxvY2F0aW9ucDsKICNlbmRpZgogewogICBpZiAoIXl5dmFsdWVwKQogICAgIHJldHVybjsKLSAgWVlVU0UgKHl5bG9jYXRpb25wKTsKICMgaWZkZWYgWVlQUklOVAogICBpZiAoeXl0eXBlIDwgWVlOVE9LRU5TKQogICAgIFlZUFJJTlQgKHl5b3V0cHV0LCB5eXRva251bVt5eXR5cGVdLCAqeXl2YWx1ZXApOwpAQCAtNzc2LDE0ICs3NTEsMTMgQEAKICNpZiAoZGVmaW5lZCBfX1NURENfXyB8fCBkZWZpbmVkIF9fQzk5X19GVU5DX18gXAogICAgICB8fCBkZWZpbmVkIF9fY3BsdXNwbHVzIHx8IGRlZmluZWQgX01TQ19WRVIpCiBzdGF0aWMgdm9pZAoteXlfc3ltYm9sX3ByaW50IChGSUxFICp5eW91dHB1dCwgaW50IHl5dHlwZSwgWVlTVFlQRSBjb25zdCAqIGNvbnN0IHl5dmFsdWVwLCBZWUxUWVBFIGNvbnN0ICogY29uc3QgeXlsb2NhdGlvbnApCit5eV9zeW1ib2xfcHJpbnQgKEZJTEUgKnl5b3V0cHV0LCBpbnQgeXl0eXBlLCBZWVNUWVBFIGNvbnN0ICogY29uc3QgeXl2YWx1ZXApCiAjZWxzZQogc3RhdGljIHZvaWQKLXl5X3N5bWJvbF9wcmludCAoeXlvdXRwdXQsIHl5dHlwZSwgeXl2YWx1ZXAsIHl5bG9jYXRpb25wKQoreXlfc3ltYm9sX3ByaW50ICh5eW91dHB1dCwgeXl0eXBlLCB5eXZhbHVlcCkKICAgICBGSUxFICp5eW91dHB1dDsKICAgICBpbnQgeXl0eXBlOwogICAgIFlZU1RZUEUgY29uc3QgKiBjb25zdCB5eXZhbHVlcDsKLSAgICBZWUxUWVBFIGNvbnN0ICogY29uc3QgeXlsb2NhdGlvbnA7CiAjZW5kaWYKIHsKICAgaWYgKHl5dHlwZSA8IFlZTlRPS0VOUykKQEAgLTc5MSw5ICs3NjUsNyBAQAogICBlbHNlCiAgICAgWVlGUFJJTlRGICh5eW91dHB1dCwgIm50ZXJtICVzICgiLCB5eXRuYW1lW3l5dHlwZV0pOwogCi0gIFlZX0xPQ0FUSU9OX1BSSU5UICh5eW91dHB1dCwgKnl5bG9jYXRpb25wKTsKLSAgWVlGUFJJTlRGICh5eW91dHB1dCwgIjogIik7Ci0gIHl5X3N5bWJvbF92YWx1ZV9wcmludCAoeXlvdXRwdXQsIHl5dHlwZSwgeXl2YWx1ZXAsIHl5bG9jYXRpb25wKTsKKyAgeXlfc3ltYm9sX3ZhbHVlX3ByaW50ICh5eW91dHB1dCwgeXl0eXBlLCB5eXZhbHVlcCk7CiAgIFlZRlBSSU5URiAoeXlvdXRwdXQsICIpIik7CiB9CiAKQEAgLTgwNSwxNyArNzc3LDIwIEBACiAjaWYgKGRlZmluZWQgX19TVERDX18gfHwgZGVmaW5lZCBfX0M5OV9fRlVOQ19fIFwKICAgICAgfHwgZGVmaW5lZCBfX2NwbHVzcGx1cyB8fCBkZWZpbmVkIF9NU0NfVkVSKQogc3RhdGljIHZvaWQKLXl5X3N0YWNrX3ByaW50ICh5eXR5cGVfaW50MTYgKmJvdHRvbSwgeXl0eXBlX2ludDE2ICp0b3ApCit5eV9zdGFja19wcmludCAoeXl0eXBlX2ludDE2ICp5eWJvdHRvbSwgeXl0eXBlX2ludDE2ICp5eXRvcCkKICNlbHNlCiBzdGF0aWMgdm9pZAoteXlfc3RhY2tfcHJpbnQgKGJvdHRvbSwgdG9wKQotICAgIHl5dHlwZV9pbnQxNiAqYm90dG9tOwotICAgIHl5dHlwZV9pbnQxNiAqdG9wOworeXlfc3RhY2tfcHJpbnQgKHl5Ym90dG9tLCB5eXRvcCkKKyAgICB5eXR5cGVfaW50MTYgKnl5Ym90dG9tOworICAgIHl5dHlwZV9pbnQxNiAqeXl0b3A7CiAjZW5kaWYKIHsKICAgWVlGUFJJTlRGIChzdGRlcnIsICJTdGFjayBub3ciKTsKLSAgZm9yICg7IGJvdHRvbSA8PSB0b3A7ICsrYm90dG9tKQotICAgIFlZRlBSSU5URiAoc3RkZXJyLCAiICVkIiwgKmJvdHRvbSk7CisgIGZvciAoOyB5eWJvdHRvbSA8PSB5eXRvcDsgeXlib3R0b20rKykKKyAgICB7CisgICAgICBpbnQgeXlib3QgPSAqeXlib3R0b207CisgICAgICBZWUZQUklOVEYgKHN0ZGVyciwgIiAlZCIsIHl5Ym90KTsKKyAgICB9CiAgIFlZRlBSSU5URiAoc3RkZXJyLCAiXG4iKTsKIH0KIApAQCAtODMzLDEyICs4MDgsMTEgQEAKICNpZiAoZGVmaW5lZCBfX1NURENfXyB8fCBkZWZpbmVkIF9fQzk5X19GVU5DX18gXAogICAgICB8fCBkZWZpbmVkIF9fY3BsdXNwbHVzIHx8IGRlZmluZWQgX01TQ19WRVIpCiBzdGF0aWMgdm9pZAoteXlfcmVkdWNlX3ByaW50IChZWVNUWVBFICp5eXZzcCwgWVlMVFlQRSAqeXlsc3AsIGludCB5eXJ1bGUpCit5eV9yZWR1Y2VfcHJpbnQgKFlZU1RZUEUgKnl5dnNwLCBpbnQgeXlydWxlKQogI2Vsc2UKIHN0YXRpYyB2b2lkCi15eV9yZWR1Y2VfcHJpbnQgKHl5dnNwLCB5eWxzcCwgeXlydWxlKQoreXlfcmVkdWNlX3ByaW50ICh5eXZzcCwgeXlydWxlKQogICAgIFlZU1RZUEUgKnl5dnNwOwotICAgIFlZTFRZUEUgKnl5bHNwOwogICAgIGludCB5eXJ1bGU7CiAjZW5kaWYKIHsKQEAgLTg1MCwxOCArODI0LDE4IEBACiAgIC8qIFRoZSBzeW1ib2xzIGJlaW5nIHJlZHVjZWQuICAqLwogICBmb3IgKHl5aSA9IDA7IHl5aSA8IHl5bnJoczsgeXlpKyspCiAgICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiICAgJCVkID0gIiwgeXlpICsgMSk7CisgICAgICBZWUZQUklOVEYgKHN0ZGVyciwgIiAgICQlZCA9ICIsIHl5aSArIDEpOwogICAgICAgeXlfc3ltYm9sX3ByaW50IChzdGRlcnIsIHl5cmhzW3l5cHJoc1t5eXJ1bGVdICsgeXlpXSwKIAkJICAgICAgICYoeXl2c3BbKHl5aSArIDEpIC0gKHl5bnJocyldKQotCQkgICAgICAgLCAmKHl5bHNwWyh5eWkgKyAxKSAtICh5eW5yaHMpXSkJCSAgICAgICApOwotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiXG4iKTsKKwkJICAgICAgIAkJICAgICAgICk7CisgICAgICBZWUZQUklOVEYgKHN0ZGVyciwgIlxuIik7CiAgICAgfQogfQogCiAjIGRlZmluZSBZWV9SRURVQ0VfUFJJTlQoUnVsZSkJCVwKIGRvIHsJCQkJCVwKICAgaWYgKHl5ZGVidWcpCQkJCVwKLSAgICB5eV9yZWR1Y2VfcHJpbnQgKHl5dnNwLCB5eWxzcCwgUnVsZSk7IFwKKyAgICB5eV9yZWR1Y2VfcHJpbnQgKHl5dnNwLCBSdWxlKTsgXAogfSB3aGlsZSAoWVlJRCAoMCkpCiAKIC8qIE5vbnplcm8gbWVhbnMgcHJpbnQgcGFyc2UgdHJhY2UuICBJdCBpcyBsZWZ0IHVuaW5pdGlhbGl6ZWQgc28gdGhhdApAQCAtMTExMiwxOCArMTA4NiwxNiBAQAogI2lmIChkZWZpbmVkIF9fU1REQ19fIHx8IGRlZmluZWQgX19DOTlfX0ZVTkNfXyBcCiAgICAgIHx8IGRlZmluZWQgX19jcGx1c3BsdXMgfHwgZGVmaW5lZCBfTVNDX1ZFUikKIHN0YXRpYyB2b2lkCi15eWRlc3RydWN0IChjb25zdCBjaGFyICp5eW1zZywgaW50IHl5dHlwZSwgWVlTVFlQRSAqeXl2YWx1ZXAsIFlZTFRZUEUgKnl5bG9jYXRpb25wKQoreXlkZXN0cnVjdCAoY29uc3QgY2hhciAqeXltc2csIGludCB5eXR5cGUsIFlZU1RZUEUgKnl5dmFsdWVwKQogI2Vsc2UKIHN0YXRpYyB2b2lkCi15eWRlc3RydWN0ICh5eW1zZywgeXl0eXBlLCB5eXZhbHVlcCwgeXlsb2NhdGlvbnApCit5eWRlc3RydWN0ICh5eW1zZywgeXl0eXBlLCB5eXZhbHVlcCkKICAgICBjb25zdCBjaGFyICp5eW1zZzsKICAgICBpbnQgeXl0eXBlOwogICAgIFlZU1RZUEUgKnl5dmFsdWVwOwotICAgIFlZTFRZUEUgKnl5bG9jYXRpb25wOwogI2VuZGlmCiB7CiAgIFlZVVNFICh5eXZhbHVlcCk7Ci0gIFlZVVNFICh5eWxvY2F0aW9ucCk7CiAKICAgaWYgKCF5eW1zZykKICAgICB5eW1zZyA9ICJEZWxldGluZyI7CkBAIC0xMTM2LDEwICsxMTA4LDggQEAKIAlicmVhazsKICAgICB9CiB9Ci0MCiAKIC8qIFByZXZlbnQgd2FybmluZ3MgZnJvbSAtV21pc3NpbmctcHJvdG90eXBlcy4gICovCi0KICNpZmRlZiBZWVBBUlNFX1BBUkFNCiAjaWYgZGVmaW5lZCBfX1NURENfXyB8fCBkZWZpbmVkIF9fY3BsdXNwbHVzCiBpbnQgeXlwYXJzZSAodm9pZCAqWVlQQVJTRV9QQVJBTSk7CkBAIC0xMTU1LDIzICsxMTI1LDIwIEBACiAjZW5kaWYgLyogISBZWVBBUlNFX1BBUkFNICovCiAKIAotCi0vKiBUaGUgbG9vay1haGVhZCBzeW1ib2wuICAqLworLyogVGhlIGxvb2thaGVhZCBzeW1ib2wuICAqLwogaW50IHl5Y2hhcjsKIAotLyogVGhlIHNlbWFudGljIHZhbHVlIG9mIHRoZSBsb29rLWFoZWFkIHN5bWJvbC4gICovCisvKiBUaGUgc2VtYW50aWMgdmFsdWUgb2YgdGhlIGxvb2thaGVhZCBzeW1ib2wuICAqLwogWVlTVFlQRSB5eWx2YWw7CiAKIC8qIE51bWJlciBvZiBzeW50YXggZXJyb3JzIHNvIGZhci4gICovCiBpbnQgeXluZXJyczsKLS8qIExvY2F0aW9uIGRhdGEgZm9yIHRoZSBsb29rLWFoZWFkIHN5bWJvbC4gICovCi1ZWUxUWVBFIHl5bGxvYzsKIAogCiAKLS8qLS0tLS0tLS0tLS4KLXwgeXlwYXJzZS4gIHwKLWAtLS0tLS0tLS0tKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS4KK3wgeXlwYXJzZSBvciB5eXB1c2hfcGFyc2UuICB8CitgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKICNpZmRlZiBZWVBBUlNFX1BBUkFNCiAjaWYgKGRlZmluZWQgX19TVERDX18gfHwgZGVmaW5lZCBfX0M5OV9fRlVOQ19fIFwKQEAgLTExOTUsMTQgKzExNjIsMzkgQEAKICNlbmRpZgogI2VuZGlmCiB7Ci0gIAotICBpbnQgeXlzdGF0ZTsKKworCisgICAgaW50IHl5c3RhdGU7CisgICAgLyogTnVtYmVyIG9mIHRva2VucyB0byBzaGlmdCBiZWZvcmUgZXJyb3IgbWVzc2FnZXMgZW5hYmxlZC4gICovCisgICAgaW50IHl5ZXJyc3RhdHVzOworCisgICAgLyogVGhlIHN0YWNrcyBhbmQgdGhlaXIgdG9vbHM6CisgICAgICAgYHl5c3MnOiByZWxhdGVkIHRvIHN0YXRlcy4KKyAgICAgICBgeXl2cyc6IHJlbGF0ZWQgdG8gc2VtYW50aWMgdmFsdWVzLgorCisgICAgICAgUmVmZXIgdG8gdGhlIHN0YWNrcyB0aHJ1IHNlcGFyYXRlIHBvaW50ZXJzLCB0byBhbGxvdyB5eW92ZXJmbG93CisgICAgICAgdG8gcmVhbGxvY2F0ZSB0aGVtIGVsc2V3aGVyZS4gICovCisKKyAgICAvKiBUaGUgc3RhdGUgc3RhY2suICAqLworICAgIHl5dHlwZV9pbnQxNiB5eXNzYVtZWUlOSVRERVBUSF07CisgICAgeXl0eXBlX2ludDE2ICp5eXNzOworICAgIHl5dHlwZV9pbnQxNiAqeXlzc3A7CisKKyAgICAvKiBUaGUgc2VtYW50aWMgdmFsdWUgc3RhY2suICAqLworICAgIFlZU1RZUEUgeXl2c2FbWVlJTklUREVQVEhdOworICAgIFlZU1RZUEUgKnl5dnM7CisgICAgWVlTVFlQRSAqeXl2c3A7CisKKyAgICBZWVNJWkVfVCB5eXN0YWNrc2l6ZTsKKwogICBpbnQgeXluOwogICBpbnQgeXlyZXN1bHQ7Ci0gIC8qIE51bWJlciBvZiB0b2tlbnMgdG8gc2hpZnQgYmVmb3JlIGVycm9yIG1lc3NhZ2VzIGVuYWJsZWQuICAqLwotICBpbnQgeXllcnJzdGF0dXM7Ci0gIC8qIExvb2stYWhlYWQgdG9rZW4gYXMgYW4gaW50ZXJuYWwgKHRyYW5zbGF0ZWQpIHRva2VuIG51bWJlci4gICovCi0gIGludCB5eXRva2VuID0gMDsKKyAgLyogTG9va2FoZWFkIHRva2VuIGFzIGFuIGludGVybmFsICh0cmFuc2xhdGVkKSB0b2tlbiBudW1iZXIuICAqLworICBpbnQgeXl0b2tlbjsKKyAgLyogVGhlIHZhcmlhYmxlcyB1c2VkIHRvIHJldHVybiBzZW1hbnRpYyB2YWx1ZSBhbmQgbG9jYXRpb24gZnJvbSB0aGUKKyAgICAgYWN0aW9uIHJvdXRpbmVzLiAgKi8KKyAgWVlTVFlQRSB5eXZhbDsKKwogI2lmIFlZRVJST1JfVkVSQk9TRQogICAvKiBCdWZmZXIgZm9yIGVycm9yIG1lc3NhZ2VzLCBhbmQgaXRzIGFsbG9jYXRlZCBzaXplLiAgKi8KICAgY2hhciB5eW1zZ2J1ZlsxMjhdOwpAQCAtMTIxMCw2NCArMTIwMiwzMCBAQAogICBZWVNJWkVfVCB5eW1zZ19hbGxvYyA9IHNpemVvZiB5eW1zZ2J1ZjsKICNlbmRpZgogCi0gIC8qIFRocmVlIHN0YWNrcyBhbmQgdGhlaXIgdG9vbHM6Ci0gICAgIGB5eXNzJzogcmVsYXRlZCB0byBzdGF0ZXMsCi0gICAgIGB5eXZzJzogcmVsYXRlZCB0byBzZW1hbnRpYyB2YWx1ZXMsCi0gICAgIGB5eWxzJzogcmVsYXRlZCB0byBsb2NhdGlvbnMuCi0KLSAgICAgUmVmZXIgdG8gdGhlIHN0YWNrcyB0aHJ1IHNlcGFyYXRlIHBvaW50ZXJzLCB0byBhbGxvdyB5eW92ZXJmbG93Ci0gICAgIHRvIHJlYWxsb2NhdGUgdGhlbSBlbHNld2hlcmUuICAqLwotCi0gIC8qIFRoZSBzdGF0ZSBzdGFjay4gICovCi0gIHl5dHlwZV9pbnQxNiB5eXNzYVtZWUlOSVRERVBUSF07Ci0gIHl5dHlwZV9pbnQxNiAqeXlzcyA9IHl5c3NhOwotICB5eXR5cGVfaW50MTYgKnl5c3NwOwotCi0gIC8qIFRoZSBzZW1hbnRpYyB2YWx1ZSBzdGFjay4gICovCi0gIFlZU1RZUEUgeXl2c2FbWVlJTklUREVQVEhdOwotICBZWVNUWVBFICp5eXZzID0geXl2c2E7Ci0gIFlZU1RZUEUgKnl5dnNwOwotCi0gIC8qIFRoZSBsb2NhdGlvbiBzdGFjay4gICovCi0gIFlZTFRZUEUgeXlsc2FbWVlJTklUREVQVEhdOwotICBZWUxUWVBFICp5eWxzID0geXlsc2E7Ci0gIFlZTFRZUEUgKnl5bHNwOwotICAvKiBUaGUgbG9jYXRpb25zIHdoZXJlIHRoZSBlcnJvciBzdGFydGVkIGFuZCBlbmRlZC4gICovCi0gIFlZTFRZUEUgeXllcnJvcl9yYW5nZVsyXTsKLQotI2RlZmluZSBZWVBPUFNUQUNLKE4pICAgKHl5dnNwIC09IChOKSwgeXlzc3AgLT0gKE4pLCB5eWxzcCAtPSAoTikpCi0KLSAgWVlTSVpFX1QgeXlzdGFja3NpemUgPSBZWUlOSVRERVBUSDsKLQotICAvKiBUaGUgdmFyaWFibGVzIHVzZWQgdG8gcmV0dXJuIHNlbWFudGljIHZhbHVlIGFuZCBsb2NhdGlvbiBmcm9tIHRoZQotICAgICBhY3Rpb24gcm91dGluZXMuICAqLwotICBZWVNUWVBFIHl5dmFsOwotICBZWUxUWVBFIHl5bG9jOworI2RlZmluZSBZWVBPUFNUQUNLKE4pICAgKHl5dnNwIC09IChOKSwgeXlzc3AgLT0gKE4pKQogCiAgIC8qIFRoZSBudW1iZXIgb2Ygc3ltYm9scyBvbiB0aGUgUkhTIG9mIHRoZSByZWR1Y2VkIHJ1bGUuCiAgICAgIEtlZXAgdG8gemVybyB3aGVuIG5vIHN5bWJvbCBzaG91bGQgYmUgcG9wcGVkLiAgKi8KICAgaW50IHl5bGVuID0gMDsKIAorICB5eXRva2VuID0gMDsKKyAgeXlzcyA9IHl5c3NhOworICB5eXZzID0geXl2c2E7CisgIHl5c3RhY2tzaXplID0gWVlJTklUREVQVEg7CisKICAgWVlEUFJJTlRGICgoc3RkZXJyLCAiU3RhcnRpbmcgcGFyc2VcbiIpKTsKIAogICB5eXN0YXRlID0gMDsKICAgeXllcnJzdGF0dXMgPSAwOwogICB5eW5lcnJzID0gMDsKLSAgeXljaGFyID0gWVlFTVBUWTsJCS8qIENhdXNlIGEgdG9rZW4gdG8gYmUgcmVhZC4gICovCisgIHl5Y2hhciA9IFlZRU1QVFk7IC8qIENhdXNlIGEgdG9rZW4gdG8gYmUgcmVhZC4gICovCiAKICAgLyogSW5pdGlhbGl6ZSBzdGFjayBwb2ludGVycy4KICAgICAgV2FzdGUgb25lIGVsZW1lbnQgb2YgdmFsdWUgYW5kIGxvY2F0aW9uIHN0YWNrCiAgICAgIHNvIHRoYXQgdGhleSBzdGF5IG9uIHRoZSBzYW1lIGxldmVsIGFzIHRoZSBzdGF0ZSBzdGFjay4KICAgICAgVGhlIHdhc3RlZCBlbGVtZW50cyBhcmUgbmV2ZXIgaW5pdGlhbGl6ZWQuICAqLwotCiAgIHl5c3NwID0geXlzczsKICAgeXl2c3AgPSB5eXZzOwotICB5eWxzcCA9IHl5bHM7Ci0jaWYgWVlMVFlQRV9JU19UUklWSUFMCi0gIC8qIEluaXRpYWxpemUgdGhlIGRlZmF1bHQgbG9jYXRpb24gYmVmb3JlIHBhcnNpbmcgc3RhcnRzLiAgKi8KLSAgeXlsbG9jLmZpcnN0X2xpbmUgICA9IHl5bGxvYy5sYXN0X2xpbmUgICA9IDE7Ci0gIHl5bGxvYy5maXJzdF9jb2x1bW4gPSB5eWxsb2MubGFzdF9jb2x1bW4gPSAwOwotI2VuZGlmCiAKICAgZ290byB5eXNldHN0YXRlOwogCkBAIC0xMjk0LDcgKzEyNTIsNiBAQAogCSAgIG1lbW9yeS4gICovCiAJWVlTVFlQRSAqeXl2czEgPSB5eXZzOwogCXl5dHlwZV9pbnQxNiAqeXlzczEgPSB5eXNzOwotCVlZTFRZUEUgKnl5bHMxID0geXlsczsKIAogCS8qIEVhY2ggc3RhY2sgcG9pbnRlciBhZGRyZXNzIGlzIGZvbGxvd2VkIGJ5IHRoZSBzaXplIG9mIHRoZQogCSAgIGRhdGEgaW4gdXNlIGluIHRoYXQgc3RhY2ssIGluIGJ5dGVzLiAgVGhpcyB1c2VkIHRvIGJlIGEKQEAgLTEzMDMsOSArMTI2MCw4IEBACiAJeXlvdmVyZmxvdyAoWVlfKCJtZW1vcnkgZXhoYXVzdGVkIiksCiAJCSAgICAmeXlzczEsIHl5c2l6ZSAqIHNpemVvZiAoKnl5c3NwKSwKIAkJICAgICZ5eXZzMSwgeXlzaXplICogc2l6ZW9mICgqeXl2c3ApLAotCQkgICAgJnl5bHMxLCB5eXNpemUgKiBzaXplb2YgKCp5eWxzcCksCiAJCSAgICAmeXlzdGFja3NpemUpOwotCXl5bHMgPSB5eWxzMTsKKwogCXl5c3MgPSB5eXNzMTsKIAl5eXZzID0geXl2czE7CiAgICAgICB9CkBAIC0xMzI2LDkgKzEyODIsOCBAQAogCSAgKHVuaW9uIHl5YWxsb2MgKikgWVlTVEFDS19BTExPQyAoWVlTVEFDS19CWVRFUyAoeXlzdGFja3NpemUpKTsKIAlpZiAoISB5eXB0cikKIAkgIGdvdG8geXlleGhhdXN0ZWRsYWI7Ci0JWVlTVEFDS19SRUxPQ0FURSAoeXlzcyk7Ci0JWVlTVEFDS19SRUxPQ0FURSAoeXl2cyk7Ci0JWVlTVEFDS19SRUxPQ0FURSAoeXlscyk7CisJWVlTVEFDS19SRUxPQ0FURSAoeXlzc19hbGxvYywgeXlzcyk7CisJWVlTVEFDS19SRUxPQ0FURSAoeXl2c19hbGxvYywgeXl2cyk7CiAjICB1bmRlZiBZWVNUQUNLX1JFTE9DQVRFCiAJaWYgKHl5c3MxICE9IHl5c3NhKQogCSAgWVlTVEFDS19GUkVFICh5eXNzMSk7CkBAIC0xMzM4LDcgKzEyOTMsNiBAQAogCiAgICAgICB5eXNzcCA9IHl5c3MgKyB5eXNpemUgLSAxOwogICAgICAgeXl2c3AgPSB5eXZzICsgeXlzaXplIC0gMTsKLSAgICAgIHl5bHNwID0geXlscyArIHl5c2l6ZSAtIDE7CiAKICAgICAgIFlZRFBSSU5URiAoKHN0ZGVyciwgIlN0YWNrIHNpemUgaW5jcmVhc2VkIHRvICVsdVxuIiwKIAkJICAodW5zaWduZWQgbG9uZyBpbnQpIHl5c3RhY2tzaXplKSk7CkBAIC0xMzQ5LDYgKzEzMDMsOSBAQAogCiAgIFlZRFBSSU5URiAoKHN0ZGVyciwgIkVudGVyaW5nIHN0YXRlICVkXG4iLCB5eXN0YXRlKSk7CiAKKyAgaWYgKHl5c3RhdGUgPT0gWVlGSU5BTCkKKyAgICBZWUFDQ0VQVDsKKwogICBnb3RvIHl5YmFja3VwOwogCiAvKi0tLS0tLS0tLS0tLgpAQCAtMTM1NywxNiArMTMxNCwxNiBAQAogeXliYWNrdXA6CiAKICAgLyogRG8gYXBwcm9wcmlhdGUgcHJvY2Vzc2luZyBnaXZlbiB0aGUgY3VycmVudCBzdGF0ZS4gIFJlYWQgYQotICAgICBsb29rLWFoZWFkIHRva2VuIGlmIHdlIG5lZWQgb25lIGFuZCBkb24ndCBhbHJlYWR5IGhhdmUgb25lLiAgKi8KKyAgICAgbG9va2FoZWFkIHRva2VuIGlmIHdlIG5lZWQgb25lIGFuZCBkb24ndCBhbHJlYWR5IGhhdmUgb25lLiAgKi8KIAotICAvKiBGaXJzdCB0cnkgdG8gZGVjaWRlIHdoYXQgdG8gZG8gd2l0aG91dCByZWZlcmVuY2UgdG8gbG9vay1haGVhZCB0b2tlbi4gICovCisgIC8qIEZpcnN0IHRyeSB0byBkZWNpZGUgd2hhdCB0byBkbyB3aXRob3V0IHJlZmVyZW5jZSB0byBsb29rYWhlYWQgdG9rZW4uICAqLwogICB5eW4gPSB5eXBhY3RbeXlzdGF0ZV07CiAgIGlmICh5eW4gPT0gWVlQQUNUX05JTkYpCiAgICAgZ290byB5eWRlZmF1bHQ7CiAKLSAgLyogTm90IGtub3duID0+IGdldCBhIGxvb2stYWhlYWQgdG9rZW4gaWYgZG9uJ3QgYWxyZWFkeSBoYXZlIG9uZS4gICovCisgIC8qIE5vdCBrbm93biA9PiBnZXQgYSBsb29rYWhlYWQgdG9rZW4gaWYgZG9uJ3QgYWxyZWFkeSBoYXZlIG9uZS4gICovCiAKLSAgLyogWVlDSEFSIGlzIGVpdGhlciBZWUVNUFRZIG9yIFlZRU9GIG9yIGEgdmFsaWQgbG9vay1haGVhZCBzeW1ib2wuICAqLworICAvKiBZWUNIQVIgaXMgZWl0aGVyIFlZRU1QVFkgb3IgWVlFT0Ygb3IgYSB2YWxpZCBsb29rYWhlYWQgc3ltYm9sLiAgKi8KICAgaWYgKHl5Y2hhciA9PSBZWUVNUFRZKQogICAgIHsKICAgICAgIFlZRFBSSU5URiAoKHN0ZGVyciwgIlJlYWRpbmcgYSB0b2tlbjogIikpOwpAQCAtMTM5OCwyNCArMTM1NSwyMCBAQAogICAgICAgZ290byB5eXJlZHVjZTsKICAgICB9CiAKLSAgaWYgKHl5biA9PSBZWUZJTkFMKQotICAgIFlZQUNDRVBUOwotCiAgIC8qIENvdW50IHRva2VucyBzaGlmdGVkIHNpbmNlIGVycm9yOyBhZnRlciB0aHJlZSwgdHVybiBvZmYgZXJyb3IKICAgICAgc3RhdHVzLiAgKi8KICAgaWYgKHl5ZXJyc3RhdHVzKQogICAgIHl5ZXJyc3RhdHVzLS07CiAKLSAgLyogU2hpZnQgdGhlIGxvb2stYWhlYWQgdG9rZW4uICAqLworICAvKiBTaGlmdCB0aGUgbG9va2FoZWFkIHRva2VuLiAgKi8KICAgWVlfU1lNQk9MX1BSSU5UICgiU2hpZnRpbmciLCB5eXRva2VuLCAmeXlsdmFsLCAmeXlsbG9jKTsKIAotICAvKiBEaXNjYXJkIHRoZSBzaGlmdGVkIHRva2VuIHVubGVzcyBpdCBpcyBlb2YuICAqLwotICBpZiAoeXljaGFyICE9IFlZRU9GKQotICAgIHl5Y2hhciA9IFlZRU1QVFk7CisgIC8qIERpc2NhcmQgdGhlIHNoaWZ0ZWQgdG9rZW4uICAqLworICB5eWNoYXIgPSBZWUVNUFRZOwogCiAgIHl5c3RhdGUgPSB5eW47CiAgICorK3l5dnNwID0geXlsdmFsOwotICAqKyt5eWxzcCA9IHl5bGxvYzsKKwogICBnb3RvIHl5bmV3c3RhdGU7CiAKIApAQCAtMTQ0NiwzMzcgKzEzOTksMzg3IEBACiAgICAgIEdDQyB3YXJuaW5nIHRoYXQgWVlWQUwgbWF5IGJlIHVzZWQgdW5pbml0aWFsaXplZC4gICovCiAgIHl5dmFsID0geXl2c3BbMS15eWxlbl07CiAKLSAgLyogRGVmYXVsdCBsb2NhdGlvbi4gICovCi0gIFlZTExPQ19ERUZBVUxUICh5eWxvYywgKHl5bHNwIC0geXlsZW4pLCB5eWxlbik7CisKICAgWVlfUkVEVUNFX1BSSU5UICh5eW4pOwogICBzd2l0Y2ggKHl5bikKICAgICB7CiAgICAgICAgIGNhc2UgMjoKLSNsaW5lIDkwICJkdGMtcGFyc2VyLnkiCisKKy8qIExpbmUgMTQ1NSBvZiB5YWNjLmMgICovCisjbGluZSA4NyAiZHRjLXBhcnNlci55IgogICAgIHsKLQkJCXRoZV9ib290X2luZm8gPSBidWlsZF9ib290X2luZm8oKHl5dnNwWygzKSAtICg0KV0ucmUpLCAoeXl2c3BbKDQpIC0gKDQpXS5ub2RlKSwgMCk7CisJCQl0aGVfYm9vdF9pbmZvID0gYnVpbGRfYm9vdF9pbmZvKCh5eXZzcFsoMykgLSAoNCldLnJlKSwgKHl5dnNwWyg0KSAtICg0KV0ubm9kZSksCisJCQkJCQkJZ3Vlc3NfYm9vdF9jcHVpZCgoeXl2c3BbKDQpIC0gKDQpXS5ub2RlKSkpOwogCQk7fQogICAgIGJyZWFrOwogCiAgIGNhc2UgMzoKLSNsaW5lIDk0ICJkdGMtcGFyc2VyLnkiCisKKy8qIExpbmUgMTQ1NSBvZiB5YWNjLmMgICovCisjbGluZSA5NSAiZHRjLXBhcnNlci55IgogICAgIHsKLQkJCXRoZV9ib290X2luZm8gPSBidWlsZF9ib290X2luZm8oKHl5dnNwWygxKSAtICgyKV0ucmUpLCAoeXl2c3BbKDIpIC0gKDIpXS5ub2RlKSwgMCk7CisJCQkoeXl2YWwucmUpID0gTlVMTDsKIAkJO30KICAgICBicmVhazsKIAogICBjYXNlIDQ6Ci0jbGluZSAxMDEgImR0Yy1wYXJzZXIueSIKKworLyogTGluZSAxNDU1IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDk5ICJkdGMtcGFyc2VyLnkiCiAgICAgewotCQkJKHl5dmFsLnJlKSA9IE5VTEw7CisJCQkoeXl2YWwucmUpID0gY2hhaW5fcmVzZXJ2ZV9lbnRyeSgoeXl2c3BbKDEpIC0gKDIpXS5yZSksICh5eXZzcFsoMikgLSAoMildLnJlKSk7CiAJCTt9CiAgICAgYnJlYWs7CiAKICAgY2FzZSA1OgotI2xpbmUgMTA1ICJkdGMtcGFyc2VyLnkiCisKKy8qIExpbmUgMTQ1NSBvZiB5YWNjLmMgICovCisjbGluZSAxMDYgImR0Yy1wYXJzZXIueSIKICAgICB7Ci0JCQkoeXl2YWwucmUpID0gY2hhaW5fcmVzZXJ2ZV9lbnRyeSgoeXl2c3BbKDEpIC0gKDIpXS5yZSksICh5eXZzcFsoMikgLSAoMildLnJlKSk7CisJCQkoeXl2YWwucmUpID0gYnVpbGRfcmVzZXJ2ZV9lbnRyeSgoeXl2c3BbKDIpIC0gKDQpXS5hZGRyKSwgKHl5dnNwWygzKSAtICg0KV0uYWRkcikpOwogCQk7fQogICAgIGJyZWFrOwogCiAgIGNhc2UgNjoKLSNsaW5lIDExMiAiZHRjLXBhcnNlci55IgorCisvKiBMaW5lIDE0NTUgb2YgeWFjYy5jICAqLworI2xpbmUgMTEwICJkdGMtcGFyc2VyLnkiCiAgICAgewotCQkJKHl5dmFsLnJlKSA9IGJ1aWxkX3Jlc2VydmVfZW50cnkoKHl5dnNwWygzKSAtICg1KV0uYWRkciksICh5eXZzcFsoNCkgLSAoNSldLmFkZHIpLCAoeXl2c3BbKDEpIC0gKDUpXS5sYWJlbHJlZikpOworCQkJYWRkX2xhYmVsKCYoeXl2c3BbKDIpIC0gKDIpXS5yZSktPmxhYmVscywgKHl5dnNwWygxKSAtICgyKV0ubGFiZWxyZWYpKTsKKwkJCSh5eXZhbC5yZSkgPSAoeXl2c3BbKDIpIC0gKDIpXS5yZSk7CiAJCTt9CiAgICAgYnJlYWs7CiAKICAgY2FzZSA3OgotI2xpbmUgMTE5ICJkdGMtcGFyc2VyLnkiCi0gICAgewotCQkJKHl5dmFsLnJlKSA9IE5VTEw7Ci0JCTt9Ci0gICAgYnJlYWs7CiAKLSAgY2FzZSA4OgotI2xpbmUgMTIzICJkdGMtcGFyc2VyLnkiCi0gICAgewotCQkJKHl5dmFsLnJlKSA9IGNoYWluX3Jlc2VydmVfZW50cnkoKHl5dnNwWygxKSAtICgyKV0ucmUpLCAoeXl2c3BbKDIpIC0gKDIpXS5yZSkpOwotCQk7fQotICAgIGJyZWFrOwotCi0gIGNhc2UgOToKLSNsaW5lIDEzMCAiZHRjLXBhcnNlci55IgotICAgIHsKLQkJCSh5eXZhbC5yZSkgPSAoeXl2c3BbKDEpIC0gKDEpXS5yZSk7Ci0JCTt9Ci0gICAgYnJlYWs7Ci0KLSAgY2FzZSAxMDoKLSNsaW5lIDEzNCAiZHRjLXBhcnNlci55IgotICAgIHsKLQkJCSh5eXZhbC5yZSkgPSBidWlsZF9yZXNlcnZlX2VudHJ5KCh5eXZzcFsoMykgLSAoNildLmFkZHIpLCAoeXl2c3BbKDUpIC0gKDYpXS5hZGRyKSAtICh5eXZzcFsoMykgLSAoNildLmFkZHIpICsgMSwgKHl5dnNwWygxKSAtICg2KV0ubGFiZWxyZWYpKTsKLQkJO30KLSAgICBicmVhazsKLQotICBjYXNlIDExOgotI2xpbmUgMTQxICJkdGMtcGFyc2VyLnkiCisvKiBMaW5lIDE0NTUgb2YgeWFjYy5jICAqLworI2xpbmUgMTE4ICJkdGMtcGFyc2VyLnkiCiAgICAgewogCQkJKHl5dmFsLmFkZHIpID0gZXZhbF9saXRlcmFsKCh5eXZzcFsoMSkgLSAoMSldLmxpdGVyYWwpLCAwLCA2NCk7CiAJCTt9CiAgICAgYnJlYWs7CiAKLSAgY2FzZSAxMjoKLSNsaW5lIDE0NSAiZHRjLXBhcnNlci55IgorICBjYXNlIDg6CisKKy8qIExpbmUgMTQ1NSBvZiB5YWNjLmMgICovCisjbGluZSAxMjUgImR0Yy1wYXJzZXIueSIKICAgICB7Ci0JCQkoeXl2YWwuYWRkcikgPSBldmFsX2xpdGVyYWwoKHl5dnNwWygxKSAtICgxKV0ubGl0ZXJhbCksIDE2LCA2NCk7CisJCQkoeXl2YWwubm9kZSkgPSBuYW1lX25vZGUoKHl5dnNwWygyKSAtICgyKV0ubm9kZSksICIiKTsKIAkJO30KICAgICBicmVhazsKIAotICBjYXNlIDEzOgotI2xpbmUgMTUyICJkdGMtcGFyc2VyLnkiCisgIGNhc2UgOToKKworLyogTGluZSAxNDU1IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDEyOSAiZHRjLXBhcnNlci55IgogICAgIHsKLQkJCSh5eXZhbC5ub2RlKSA9IG5hbWVfbm9kZSgoeXl2c3BbKDIpIC0gKDIpXS5ub2RlKSwgIiIsIE5VTEwpOworCQkJKHl5dmFsLm5vZGUpID0gbWVyZ2Vfbm9kZXMoKHl5dnNwWygxKSAtICgzKV0ubm9kZSksICh5eXZzcFsoMykgLSAoMyldLm5vZGUpKTsKIAkJO30KICAgICBicmVhazsKIAotICBjYXNlIDE0OgotI2xpbmUgMTU5ICJkdGMtcGFyc2VyLnkiCisgIGNhc2UgMTA6CisKKy8qIExpbmUgMTQ1NSBvZiB5YWNjLmMgICovCisjbGluZSAxMzMgImR0Yy1wYXJzZXIueSIKKyAgICB7CisJCQlzdHJ1Y3Qgbm9kZSAqdGFyZ2V0ID0gZ2V0X25vZGVfYnlfcmVmKCh5eXZzcFsoMSkgLSAoMyldLm5vZGUpLCAoeXl2c3BbKDIpIC0gKDMpXS5sYWJlbHJlZikpOworCisJCQlpZiAodGFyZ2V0KQorCQkJCW1lcmdlX25vZGVzKHRhcmdldCwgKHl5dnNwWygzKSAtICgzKV0ubm9kZSkpOworCQkJZWxzZQorCQkJCXByaW50X2Vycm9yKCJsYWJlbCBvciBwYXRoLCAnJXMnLCBub3QgZm91bmQiLCAoeXl2c3BbKDIpIC0gKDMpXS5sYWJlbHJlZikpOworCQkJKHl5dmFsLm5vZGUpID0gKHl5dnNwWygxKSAtICgzKV0ubm9kZSk7CisJCTt9CisgICAgYnJlYWs7CisKKyAgY2FzZSAxMToKKworLyogTGluZSAxNDU1IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDE0NiAiZHRjLXBhcnNlci55IgogICAgIHsKIAkJCSh5eXZhbC5ub2RlKSA9IGJ1aWxkX25vZGUoKHl5dnNwWygyKSAtICg1KV0ucHJvcGxpc3QpLCAoeXl2c3BbKDMpIC0gKDUpXS5ub2RlbGlzdCkpOwogCQk7fQogICAgIGJyZWFrOwogCi0gIGNhc2UgMTU6Ci0jbGluZSAxNjYgImR0Yy1wYXJzZXIueSIKKyAgY2FzZSAxMjoKKworLyogTGluZSAxNDU1IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDE1MyAiZHRjLXBhcnNlci55IgogICAgIHsKIAkJCSh5eXZhbC5wcm9wbGlzdCkgPSBOVUxMOwogCQk7fQogICAgIGJyZWFrOwogCi0gIGNhc2UgMTY6Ci0jbGluZSAxNzAgImR0Yy1wYXJzZXIueSIKKyAgY2FzZSAxMzoKKworLyogTGluZSAxNDU1IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDE1NyAiZHRjLXBhcnNlci55IgogICAgIHsKIAkJCSh5eXZhbC5wcm9wbGlzdCkgPSBjaGFpbl9wcm9wZXJ0eSgoeXl2c3BbKDIpIC0gKDIpXS5wcm9wKSwgKHl5dnNwWygxKSAtICgyKV0ucHJvcGxpc3QpKTsKIAkJO30KICAgICBicmVhazsKIAorICBjYXNlIDE0OgorCisvKiBMaW5lIDE0NTUgb2YgeWFjYy5jICAqLworI2xpbmUgMTY0ICJkdGMtcGFyc2VyLnkiCisgICAgeworCQkJKHl5dmFsLnByb3ApID0gYnVpbGRfcHJvcGVydHkoKHl5dnNwWygxKSAtICg0KV0ucHJvcG5vZGVuYW1lKSwgKHl5dnNwWygzKSAtICg0KV0uZGF0YSkpOworCQk7fQorICAgIGJyZWFrOworCisgIGNhc2UgMTU6CisKKy8qIExpbmUgMTQ1NSBvZiB5YWNjLmMgICovCisjbGluZSAxNjggImR0Yy1wYXJzZXIueSIKKyAgICB7CisJCQkoeXl2YWwucHJvcCkgPSBidWlsZF9wcm9wZXJ0eSgoeXl2c3BbKDEpIC0gKDIpXS5wcm9wbm9kZW5hbWUpLCBlbXB0eV9kYXRhKTsKKwkJO30KKyAgICBicmVhazsKKworICBjYXNlIDE2OgorCisvKiBMaW5lIDE0NTUgb2YgeWFjYy5jICAqLworI2xpbmUgMTcyICJkdGMtcGFyc2VyLnkiCisgICAgeworCQkJYWRkX2xhYmVsKCYoeXl2c3BbKDIpIC0gKDIpXS5wcm9wKS0+bGFiZWxzLCAoeXl2c3BbKDEpIC0gKDIpXS5sYWJlbHJlZikpOworCQkJKHl5dmFsLnByb3ApID0gKHl5dnNwWygyKSAtICgyKV0ucHJvcCk7CisJCTt9CisgICAgYnJlYWs7CisKICAgY2FzZSAxNzoKLSNsaW5lIDE3NyAiZHRjLXBhcnNlci55IgotICAgIHsKLQkJCSh5eXZhbC5wcm9wKSA9IGJ1aWxkX3Byb3BlcnR5KCh5eXZzcFsoMikgLSAoNSldLnByb3Bub2RlbmFtZSksICh5eXZzcFsoNCkgLSAoNSldLmRhdGEpLCAoeXl2c3BbKDEpIC0gKDUpXS5sYWJlbHJlZikpOwotCQk7fQotICAgIGJyZWFrOwogCi0gIGNhc2UgMTg6Ci0jbGluZSAxODEgImR0Yy1wYXJzZXIueSIKLSAgICB7Ci0JCQkoeXl2YWwucHJvcCkgPSBidWlsZF9wcm9wZXJ0eSgoeXl2c3BbKDIpIC0gKDMpXS5wcm9wbm9kZW5hbWUpLCBlbXB0eV9kYXRhLCAoeXl2c3BbKDEpIC0gKDMpXS5sYWJlbHJlZikpOwotCQk7fQotICAgIGJyZWFrOwotCi0gIGNhc2UgMTk6Ci0jbGluZSAxODggImR0Yy1wYXJzZXIueSIKKy8qIExpbmUgMTQ1NSBvZiB5YWNjLmMgICovCisjbGluZSAxODAgImR0Yy1wYXJzZXIueSIKICAgICB7CiAJCQkoeXl2YWwuZGF0YSkgPSBkYXRhX21lcmdlKCh5eXZzcFsoMSkgLSAoMildLmRhdGEpLCAoeXl2c3BbKDIpIC0gKDIpXS5kYXRhKSk7CiAJCTt9CiAgICAgYnJlYWs7CiAKKyAgY2FzZSAxODoKKworLyogTGluZSAxNDU1IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDE4NCAiZHRjLXBhcnNlci55IgorICAgIHsKKwkJCSh5eXZhbC5kYXRhKSA9IGRhdGFfbWVyZ2UoKHl5dnNwWygxKSAtICg0KV0uZGF0YSksICh5eXZzcFsoMykgLSAoNCldLmRhdGEpKTsKKwkJO30KKyAgICBicmVhazsKKworICBjYXNlIDE5OgorCisvKiBMaW5lIDE0NTUgb2YgeWFjYy5jICAqLworI2xpbmUgMTg4ICJkdGMtcGFyc2VyLnkiCisgICAgeworCQkJKHl5dmFsLmRhdGEpID0gZGF0YV9tZXJnZSgoeXl2c3BbKDEpIC0gKDQpXS5kYXRhKSwgKHl5dnNwWygzKSAtICg0KV0uZGF0YSkpOworCQk7fQorICAgIGJyZWFrOworCiAgIGNhc2UgMjA6CisKKy8qIExpbmUgMTQ1NSBvZiB5YWNjLmMgICovCiAjbGluZSAxOTIgImR0Yy1wYXJzZXIueSIKICAgICB7Ci0JCQkoeXl2YWwuZGF0YSkgPSBkYXRhX21lcmdlKCh5eXZzcFsoMSkgLSAoNCldLmRhdGEpLCAoeXl2c3BbKDMpIC0gKDQpXS5kYXRhKSk7Ci0JCTt9Ci0gICAgYnJlYWs7Ci0KLSAgY2FzZSAyMToKLSNsaW5lIDE5NiAiZHRjLXBhcnNlci55IgotICAgIHsKLQkJCSh5eXZhbC5kYXRhKSA9IGRhdGFfbWVyZ2UoKHl5dnNwWygxKSAtICg0KV0uZGF0YSksICh5eXZzcFsoMykgLSAoNCldLmRhdGEpKTsKLQkJO30KLSAgICBicmVhazsKLQotICBjYXNlIDIyOgotI2xpbmUgMjAwICJkdGMtcGFyc2VyLnkiCi0gICAgewogCQkJKHl5dmFsLmRhdGEpID0gZGF0YV9hZGRfbWFya2VyKCh5eXZzcFsoMSkgLSAoMildLmRhdGEpLCBSRUZfUEFUSCwgKHl5dnNwWygyKSAtICgyKV0ubGFiZWxyZWYpKTsKIAkJO30KICAgICBicmVhazsKIAotICBjYXNlIDIzOgotI2xpbmUgMjA0ICJkdGMtcGFyc2VyLnkiCisgIGNhc2UgMjE6CisKKy8qIExpbmUgMTQ1NSBvZiB5YWNjLmMgICovCisjbGluZSAxOTYgImR0Yy1wYXJzZXIueSIKICAgICB7Ci0JCQlzdHJ1Y3Qgc2VhcmNoX3BhdGggcGF0aCA9IHsgc3JjcG9zX2ZpbGUtPmRpciwgTlVMTCwgTlVMTCB9OwotCQkJc3RydWN0IGR0Y19maWxlICpmaWxlID0gZHRjX29wZW5fZmlsZSgoeXl2c3BbKDQpIC0gKDkpXS5kYXRhKS52YWwsICZwYXRoKTsKLQkJCXN0cnVjdCBkYXRhIGQgPSBlbXB0eV9kYXRhOworCQkJRklMRSAqZiA9IHNyY2ZpbGVfcmVsYXRpdmVfb3BlbigoeXl2c3BbKDQpIC0gKDkpXS5kYXRhKS52YWwsIE5VTEwpOworCQkJc3RydWN0IGRhdGEgZDsKIAogCQkJaWYgKCh5eXZzcFsoNikgLSAoOSldLmFkZHIpICE9IDApCi0JCQkJaWYgKGZzZWVrKGZpbGUtPmZpbGUsICh5eXZzcFsoNikgLSAoOSldLmFkZHIpLCBTRUVLX1NFVCkgIT0gMCkKLQkJCQkJeXllcnJvcmYoIkNvdWxkbid0IHNlZWsgdG8gb2Zmc2V0ICVsbHUgaW4gXCIlc1wiOiAlcyIsCi0JCQkJCQkgKHVuc2lnbmVkIGxvbmcgbG9uZykoeXl2c3BbKDYpIC0gKDkpXS5hZGRyKSwKLQkJCQkJCSAoeXl2c3BbKDQpIC0gKDkpXS5kYXRhKS52YWwsIHN0cmVycm9yKGVycm5vKSk7CisJCQkJaWYgKGZzZWVrKGYsICh5eXZzcFsoNikgLSAoOSldLmFkZHIpLCBTRUVLX1NFVCkgIT0gMCkKKwkJCQkJcHJpbnRfZXJyb3IoIkNvdWxkbid0IHNlZWsgdG8gb2Zmc2V0ICVsbHUgaW4gXCIlc1wiOiAlcyIsCisJCQkJCQkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpKHl5dnNwWyg2KSAtICg5KV0uYWRkciksCisJCQkJCQkgICAgICh5eXZzcFsoNCkgLSAoOSldLmRhdGEpLnZhbCwKKwkJCQkJCSAgICAgc3RyZXJyb3IoZXJybm8pKTsKIAotCQkJZCA9IGRhdGFfY29weV9maWxlKGZpbGUtPmZpbGUsICh5eXZzcFsoOCkgLSAoOSldLmFkZHIpKTsKKwkJCWQgPSBkYXRhX2NvcHlfZmlsZShmLCAoeXl2c3BbKDgpIC0gKDkpXS5hZGRyKSk7CiAKIAkJCSh5eXZhbC5kYXRhKSA9IGRhdGFfbWVyZ2UoKHl5dnNwWygxKSAtICg5KV0uZGF0YSksIGQpOwotCQkJZHRjX2Nsb3NlX2ZpbGUoZmlsZSk7CisJCQlmY2xvc2UoZik7CiAJCTt9CiAgICAgYnJlYWs7CiAKLSAgY2FzZSAyNDoKLSNsaW5lIDIyMSAiZHRjLXBhcnNlci55IgorICBjYXNlIDIyOgorCisvKiBMaW5lIDE0NTUgb2YgeWFjYy5jICAqLworI2xpbmUgMjEzICJkdGMtcGFyc2VyLnkiCiAgICAgewotCQkJc3RydWN0IHNlYXJjaF9wYXRoIHBhdGggPSB7IHNyY3Bvc19maWxlLT5kaXIsIE5VTEwsIE5VTEwgfTsKLQkJCXN0cnVjdCBkdGNfZmlsZSAqZmlsZSA9IGR0Y19vcGVuX2ZpbGUoKHl5dnNwWyg0KSAtICg1KV0uZGF0YSkudmFsLCAmcGF0aCk7CisJCQlGSUxFICpmID0gc3JjZmlsZV9yZWxhdGl2ZV9vcGVuKCh5eXZzcFsoNCkgLSAoNSldLmRhdGEpLnZhbCwgTlVMTCk7CiAJCQlzdHJ1Y3QgZGF0YSBkID0gZW1wdHlfZGF0YTsKIAotCQkJZCA9IGRhdGFfY29weV9maWxlKGZpbGUtPmZpbGUsIC0xKTsKKwkJCWQgPSBkYXRhX2NvcHlfZmlsZShmLCAtMSk7CiAKIAkJCSh5eXZhbC5kYXRhKSA9IGRhdGFfbWVyZ2UoKHl5dnNwWygxKSAtICg1KV0uZGF0YSksIGQpOwotCQkJZHRjX2Nsb3NlX2ZpbGUoZmlsZSk7CisJCQlmY2xvc2UoZik7CiAJCTt9CiAgICAgYnJlYWs7CiAKLSAgY2FzZSAyNToKLSNsaW5lIDIzMiAiZHRjLXBhcnNlci55IgorICBjYXNlIDIzOgorCisvKiBMaW5lIDE0NTUgb2YgeWFjYy5jICAqLworI2xpbmUgMjIzICJkdGMtcGFyc2VyLnkiCiAgICAgewogCQkJKHl5dmFsLmRhdGEpID0gZGF0YV9hZGRfbWFya2VyKCh5eXZzcFsoMSkgLSAoMildLmRhdGEpLCBMQUJFTCwgKHl5dnNwWygyKSAtICgyKV0ubGFiZWxyZWYpKTsKIAkJO30KICAgICBicmVhazsKIAotICBjYXNlIDI2OgotI2xpbmUgMjM5ICJkdGMtcGFyc2VyLnkiCisgIGNhc2UgMjQ6CisKKy8qIExpbmUgMTQ1NSBvZiB5YWNjLmMgICovCisjbGluZSAyMzAgImR0Yy1wYXJzZXIueSIKICAgICB7CiAJCQkoeXl2YWwuZGF0YSkgPSBlbXB0eV9kYXRhOwogCQk7fQogICAgIGJyZWFrOwogCi0gIGNhc2UgMjc6Ci0jbGluZSAyNDMgImR0Yy1wYXJzZXIueSIKKyAgY2FzZSAyNToKKworLyogTGluZSAxNDU1IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDIzNCAiZHRjLXBhcnNlci55IgogICAgIHsKIAkJCSh5eXZhbC5kYXRhKSA9ICh5eXZzcFsoMSkgLSAoMildLmRhdGEpOwogCQk7fQogICAgIGJyZWFrOwogCi0gIGNhc2UgMjg6Ci0jbGluZSAyNDcgImR0Yy1wYXJzZXIueSIKKyAgY2FzZSAyNjoKKworLyogTGluZSAxNDU1IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDIzOCAiZHRjLXBhcnNlci55IgogICAgIHsKIAkJCSh5eXZhbC5kYXRhKSA9IGRhdGFfYWRkX21hcmtlcigoeXl2c3BbKDEpIC0gKDIpXS5kYXRhKSwgTEFCRUwsICh5eXZzcFsoMikgLSAoMildLmxhYmVscmVmKSk7CiAJCTt9CiAgICAgYnJlYWs7CiAKLSAgY2FzZSAyOToKLSNsaW5lIDI1NCAiZHRjLXBhcnNlci55IgorICBjYXNlIDI3OgorCisvKiBMaW5lIDE0NTUgb2YgeWFjYy5jICAqLworI2xpbmUgMjQ1ICJkdGMtcGFyc2VyLnkiCiAgICAgewogCQkJKHl5dmFsLmRhdGEpID0gZW1wdHlfZGF0YTsKIAkJO30KICAgICBicmVhazsKIAotICBjYXNlIDMwOgotI2xpbmUgMjU4ICJkdGMtcGFyc2VyLnkiCisgIGNhc2UgMjg6CisKKy8qIExpbmUgMTQ1NSBvZiB5YWNjLmMgICovCisjbGluZSAyNDkgImR0Yy1wYXJzZXIueSIKICAgICB7CiAJCQkoeXl2YWwuZGF0YSkgPSBkYXRhX2FwcGVuZF9jZWxsKCh5eXZzcFsoMSkgLSAoMildLmRhdGEpLCAoeXl2c3BbKDIpIC0gKDIpXS5jZWxsKSk7CiAJCTt9CiAgICAgYnJlYWs7CiAKLSAgY2FzZSAzMToKLSNsaW5lIDI2MiAiZHRjLXBhcnNlci55IgorICBjYXNlIDI5OgorCisvKiBMaW5lIDE0NTUgb2YgeWFjYy5jICAqLworI2xpbmUgMjUzICJkdGMtcGFyc2VyLnkiCiAgICAgewogCQkJKHl5dmFsLmRhdGEpID0gZGF0YV9hcHBlbmRfY2VsbChkYXRhX2FkZF9tYXJrZXIoKHl5dnNwWygxKSAtICgyKV0uZGF0YSksIFJFRl9QSEFORExFLAogCQkJCQkJCSAgICAgICh5eXZzcFsoMikgLSAoMildLmxhYmVscmVmKSksIC0xKTsKIAkJO30KICAgICBicmVhazsKIAotICBjYXNlIDMyOgotI2xpbmUgMjY3ICJkdGMtcGFyc2VyLnkiCisgIGNhc2UgMzA6CisKKy8qIExpbmUgMTQ1NSBvZiB5YWNjLmMgICovCisjbGluZSAyNTggImR0Yy1wYXJzZXIueSIKICAgICB7CiAJCQkoeXl2YWwuZGF0YSkgPSBkYXRhX2FkZF9tYXJrZXIoKHl5dnNwWygxKSAtICgyKV0uZGF0YSksIExBQkVMLCAoeXl2c3BbKDIpIC0gKDIpXS5sYWJlbHJlZikpOwogCQk7fQogICAgIGJyZWFrOwogCi0gIGNhc2UgMzM6Ci0jbGluZSAyNzQgImR0Yy1wYXJzZXIueSIKLSAgICB7Ci0JCQkoeXl2YWwuY2Jhc2UpID0gMTY7Ci0JCTt9Ci0gICAgYnJlYWs7CisgIGNhc2UgMzE6CiAKLSAgY2FzZSAzNToKLSNsaW5lIDI4MiAiZHRjLXBhcnNlci55IgorLyogTGluZSAxNDU1IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDI2NSAiZHRjLXBhcnNlci55IgogICAgIHsKIAkJCSh5eXZhbC5jZWxsKSA9IGV2YWxfbGl0ZXJhbCgoeXl2c3BbKDEpIC0gKDEpXS5saXRlcmFsKSwgMCwgMzIpOwogCQk7fQogICAgIGJyZWFrOwogCi0gIGNhc2UgMzY6Ci0jbGluZSAyODYgImR0Yy1wYXJzZXIueSIKLSAgICB7Ci0JCQkoeXl2YWwuY2VsbCkgPSBldmFsX2xpdGVyYWwoKHl5dnNwWygyKSAtICgyKV0ubGl0ZXJhbCksICh5eXZzcFsoMSkgLSAoMildLmNiYXNlKSwgMzIpOwotCQk7fQotICAgIGJyZWFrOworICBjYXNlIDMyOgogCi0gIGNhc2UgMzc6Ci0jbGluZSAyOTMgImR0Yy1wYXJzZXIueSIKKy8qIExpbmUgMTQ1NSBvZiB5YWNjLmMgICovCisjbGluZSAyNzIgImR0Yy1wYXJzZXIueSIKICAgICB7CiAJCQkoeXl2YWwuZGF0YSkgPSBlbXB0eV9kYXRhOwogCQk7fQogICAgIGJyZWFrOwogCi0gIGNhc2UgMzg6Ci0jbGluZSAyOTcgImR0Yy1wYXJzZXIueSIKKyAgY2FzZSAzMzoKKworLyogTGluZSAxNDU1IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDI3NiAiZHRjLXBhcnNlci55IgogICAgIHsKIAkJCSh5eXZhbC5kYXRhKSA9IGRhdGFfYXBwZW5kX2J5dGUoKHl5dnNwWygxKSAtICgyKV0uZGF0YSksICh5eXZzcFsoMikgLSAoMildLmJ5dGUpKTsKIAkJO30KICAgICBicmVhazsKIAotICBjYXNlIDM5OgotI2xpbmUgMzAxICJkdGMtcGFyc2VyLnkiCisgIGNhc2UgMzQ6CisKKy8qIExpbmUgMTQ1NSBvZiB5YWNjLmMgICovCisjbGluZSAyODAgImR0Yy1wYXJzZXIueSIKICAgICB7CiAJCQkoeXl2YWwuZGF0YSkgPSBkYXRhX2FkZF9tYXJrZXIoKHl5dnNwWygxKSAtICgyKV0uZGF0YSksIExBQkVMLCAoeXl2c3BbKDIpIC0gKDIpXS5sYWJlbHJlZikpOwogCQk7fQogICAgIGJyZWFrOwogCi0gIGNhc2UgNDA6Ci0jbGluZSAzMDggImR0Yy1wYXJzZXIueSIKKyAgY2FzZSAzNToKKworLyogTGluZSAxNDU1IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDI4NyAiZHRjLXBhcnNlci55IgogICAgIHsKIAkJCSh5eXZhbC5ub2RlbGlzdCkgPSBOVUxMOwogCQk7fQogICAgIGJyZWFrOwogCi0gIGNhc2UgNDE6Ci0jbGluZSAzMTIgImR0Yy1wYXJzZXIueSIKKyAgY2FzZSAzNjoKKworLyogTGluZSAxNDU1IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDI5MSAiZHRjLXBhcnNlci55IgogICAgIHsKIAkJCSh5eXZhbC5ub2RlbGlzdCkgPSBjaGFpbl9ub2RlKCh5eXZzcFsoMSkgLSAoMildLm5vZGUpLCAoeXl2c3BbKDIpIC0gKDIpXS5ub2RlbGlzdCkpOwogCQk7fQogICAgIGJyZWFrOwogCi0gIGNhc2UgNDI6Ci0jbGluZSAzMTYgImR0Yy1wYXJzZXIueSIKKyAgY2FzZSAzNzoKKworLyogTGluZSAxNDU1IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDI5NSAiZHRjLXBhcnNlci55IgogICAgIHsKLQkJCXl5ZXJyb3IoInN5bnRheCBlcnJvcjogcHJvcGVydGllcyBtdXN0IHByZWNlZGUgc3Vibm9kZXMiKTsKKwkJCXByaW50X2Vycm9yKCJzeW50YXggZXJyb3I6IHByb3BlcnRpZXMgbXVzdCBwcmVjZWRlIHN1Ym5vZGVzIik7CiAJCQlZWUVSUk9SOwogCQk7fQogICAgIGJyZWFrOwogCi0gIGNhc2UgNDM6Ci0jbGluZSAzMjQgImR0Yy1wYXJzZXIueSIKKyAgY2FzZSAzODoKKworLyogTGluZSAxNDU1IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDMwMyAiZHRjLXBhcnNlci55IgogICAgIHsKLQkJCSh5eXZhbC5ub2RlKSA9IG5hbWVfbm9kZSgoeXl2c3BbKDMpIC0gKDMpXS5ub2RlKSwgKHl5dnNwWygyKSAtICgzKV0ucHJvcG5vZGVuYW1lKSwgKHl5dnNwWygxKSAtICgzKV0ubGFiZWxyZWYpKTsKKwkJCSh5eXZhbC5ub2RlKSA9IG5hbWVfbm9kZSgoeXl2c3BbKDIpIC0gKDIpXS5ub2RlKSwgKHl5dnNwWygxKSAtICgyKV0ucHJvcG5vZGVuYW1lKSk7CiAJCTt9CiAgICAgYnJlYWs7CiAKLSAgY2FzZSA0NDoKLSNsaW5lIDMzMSAiZHRjLXBhcnNlci55IgotICAgIHsKLQkJCSh5eXZhbC5sYWJlbHJlZikgPSBOVUxMOwotCQk7fQotICAgIGJyZWFrOworICBjYXNlIDM5OgogCi0gIGNhc2UgNDU6Ci0jbGluZSAzMzUgImR0Yy1wYXJzZXIueSIKKy8qIExpbmUgMTQ1NSBvZiB5YWNjLmMgICovCisjbGluZSAzMDcgImR0Yy1wYXJzZXIueSIKICAgICB7Ci0JCQkoeXl2YWwubGFiZWxyZWYpID0gKHl5dnNwWygxKSAtICgxKV0ubGFiZWxyZWYpOworCQkJYWRkX2xhYmVsKCYoeXl2c3BbKDIpIC0gKDIpXS5ub2RlKS0+bGFiZWxzLCAoeXl2c3BbKDEpIC0gKDIpXS5sYWJlbHJlZikpOworCQkJKHl5dmFsLm5vZGUpID0gKHl5dnNwWygyKSAtICgyKV0ubm9kZSk7CiAJCTt9CiAgICAgYnJlYWs7CiAKIAotLyogTGluZSAxMjY3IG9mIHlhY2MuYy4gICovCi0jbGluZSAxNzgwICJkdGMtcGFyc2VyLnRhYi5jIgorCisvKiBMaW5lIDE0NTUgb2YgeWFjYy5jICAqLworI2xpbmUgMTc4MyAiZHRjLXBhcnNlci50YWIuYyIKICAgICAgIGRlZmF1bHQ6IGJyZWFrOwogICAgIH0KICAgWVlfU1lNQk9MX1BSSU5UICgiLT4gJCQgPSIsIHl5cjFbeXluXSwgJnl5dmFsLCAmeXlsb2MpOwpAQCAtMTc4Niw3ICsxNzg5LDYgQEAKICAgWVlfU1RBQ0tfUFJJTlQgKHl5c3MsIHl5c3NwKTsKIAogICAqKyt5eXZzcCA9IHl5dmFsOwotICAqKyt5eWxzcCA9IHl5bG9jOwogCiAgIC8qIE5vdyBgc2hpZnQnIHRoZSByZXN1bHQgb2YgdGhlIHJlZHVjdGlvbi4gIERldGVybWluZSB3aGF0IHN0YXRlCiAgICAgIHRoYXQgZ29lcyB0bywgYmFzZWQgb24gdGhlIHN0YXRlIHdlIHBvcHBlZCBiYWNrIHRvIGFuZCB0aGUgcnVsZQpAQCAtMTg0OCwxMSArMTg1MCwxMSBAQAogI2VuZGlmCiAgICAgfQogCi0gIHl5ZXJyb3JfcmFuZ2VbMF0gPSB5eWxsb2M7CisKIAogICBpZiAoeXllcnJzdGF0dXMgPT0gMykKICAgICB7Ci0gICAgICAvKiBJZiBqdXN0IHRyaWVkIGFuZCBmYWlsZWQgdG8gcmV1c2UgbG9vay1haGVhZCB0b2tlbiBhZnRlciBhbgorICAgICAgLyogSWYganVzdCB0cmllZCBhbmQgZmFpbGVkIHRvIHJldXNlIGxvb2thaGVhZCB0b2tlbiBhZnRlciBhbgogCSBlcnJvciwgZGlzY2FyZCBpdC4gICovCiAKICAgICAgIGlmICh5eWNoYXIgPD0gWVlFT0YpCkBAIC0xODY0LDEyICsxODY2LDEyIEBACiAgICAgICBlbHNlCiAJewogCSAgeXlkZXN0cnVjdCAoIkVycm9yOiBkaXNjYXJkaW5nIiwKLQkJICAgICAgeXl0b2tlbiwgJnl5bHZhbCwgJnl5bGxvYyk7CisJCSAgICAgIHl5dG9rZW4sICZ5eWx2YWwpOwogCSAgeXljaGFyID0gWVlFTVBUWTsKIAl9CiAgICAgfQogCi0gIC8qIEVsc2Ugd2lsbCB0cnkgdG8gcmV1c2UgbG9vay1haGVhZCB0b2tlbiBhZnRlciBzaGlmdGluZyB0aGUgZXJyb3IKKyAgLyogRWxzZSB3aWxsIHRyeSB0byByZXVzZSBsb29rYWhlYWQgdG9rZW4gYWZ0ZXIgc2hpZnRpbmcgdGhlIGVycm9yCiAgICAgIHRva2VuLiAgKi8KICAgZ290byB5eWVycmxhYjE7CiAKQEAgLTE4ODUsNyArMTg4Nyw2IEBACiAgIGlmICgvKkNPTlNUQ09ORCovIDApCiAgICAgIGdvdG8geXllcnJvcmxhYjsKIAotICB5eWVycm9yX3JhbmdlWzBdID0geXlsc3BbMS15eWxlbl07CiAgIC8qIERvIG5vdCByZWNsYWltIHRoZSBzeW1ib2xzIG9mIHRoZSBydWxlIHdoaWNoIGFjdGlvbiB0cmlnZ2VyZWQKICAgICAgdGhpcyBZWUVSUk9SLiAgKi8KICAgWVlQT1BTVEFDSyAoeXlsZW4pOwpAQCAtMTkxOSwyNCArMTkyMCwxNiBAQAogICAgICAgaWYgKHl5c3NwID09IHl5c3MpCiAJWVlBQk9SVDsKIAotICAgICAgeXllcnJvcl9yYW5nZVswXSA9ICp5eWxzcDsKKwogICAgICAgeXlkZXN0cnVjdCAoIkVycm9yOiBwb3BwaW5nIiwKLQkJICB5eXN0b3NbeXlzdGF0ZV0sIHl5dnNwLCB5eWxzcCk7CisJCSAgeXlzdG9zW3l5c3RhdGVdLCB5eXZzcCk7CiAgICAgICBZWVBPUFNUQUNLICgxKTsKICAgICAgIHl5c3RhdGUgPSAqeXlzc3A7CiAgICAgICBZWV9TVEFDS19QUklOVCAoeXlzcywgeXlzc3ApOwogICAgIH0KIAotICBpZiAoeXluID09IFlZRklOQUwpCi0gICAgWVlBQ0NFUFQ7Ci0KICAgKisreXl2c3AgPSB5eWx2YWw7CiAKLSAgeXllcnJvcl9yYW5nZVsxXSA9IHl5bGxvYzsKLSAgLyogVXNpbmcgWVlMTE9DIGlzIHRlbXB0aW5nLCBidXQgd291bGQgY2hhbmdlIHRoZSBsb2NhdGlvbiBvZgotICAgICB0aGUgbG9vay1haGVhZC4gIFlZTE9DIGlzIGF2YWlsYWJsZSB0aG91Z2guICAqLwotICBZWUxMT0NfREVGQVVMVCAoeXlsb2MsICh5eWVycm9yX3JhbmdlIC0gMSksIDIpOwotICAqKyt5eWxzcCA9IHl5bG9jOwogCiAgIC8qIFNoaWZ0IHRoZSBlcnJvciB0b2tlbi4gICovCiAgIFlZX1NZTUJPTF9QUklOVCAoIlNoaWZ0aW5nIiwgeXlzdG9zW3l5bl0sIHl5dnNwLCB5eWxzcCk7CkBAIC0xOTU5LDcgKzE5NTIsNyBAQAogICB5eXJlc3VsdCA9IDE7CiAgIGdvdG8geXlyZXR1cm47CiAKLSNpZm5kZWYgeXlvdmVyZmxvdworI2lmICFkZWZpbmVkKHl5b3ZlcmZsb3cpIHx8IFlZRVJST1JfVkVSQk9TRQogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLgogfCB5eWV4aGF1c3RlZGxhYiAtLSBtZW1vcnkgZXhoYXVzdGlvbiBjb21lcyBoZXJlLiAgfAogYC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpAQCAtMTk3MCw5ICsxOTYzLDkgQEAKICNlbmRpZgogCiB5eXJldHVybjoKLSAgaWYgKHl5Y2hhciAhPSBZWUVPRiAmJiB5eWNoYXIgIT0gWVlFTVBUWSkKKyAgaWYgKHl5Y2hhciAhPSBZWUVNUFRZKQogICAgICB5eWRlc3RydWN0ICgiQ2xlYW51cDogZGlzY2FyZGluZyBsb29rYWhlYWQiLAotCQkgeXl0b2tlbiwgJnl5bHZhbCwgJnl5bGxvYyk7CisJCSB5eXRva2VuLCAmeXlsdmFsKTsKICAgLyogRG8gbm90IHJlY2xhaW0gdGhlIHN5bWJvbHMgb2YgdGhlIHJ1bGUgd2hpY2ggYWN0aW9uIHRyaWdnZXJlZAogICAgICB0aGlzIFlZQUJPUlQgb3IgWVlBQ0NFUFQuICAqLwogICBZWVBPUFNUQUNLICh5eWxlbik7CkBAIC0xOTgwLDcgKzE5NzMsNyBAQAogICB3aGlsZSAoeXlzc3AgIT0geXlzcykKICAgICB7CiAgICAgICB5eWRlc3RydWN0ICgiQ2xlYW51cDogcG9wcGluZyIsCi0JCSAgeXlzdG9zWyp5eXNzcF0sIHl5dnNwLCB5eWxzcCk7CisJCSAgeXlzdG9zWyp5eXNzcF0sIHl5dnNwKTsKICAgICAgIFlZUE9QU1RBQ0sgKDEpOwogICAgIH0KICNpZm5kZWYgeXlvdmVyZmxvdwpAQCAtMTk5NiwyOSArMTk4OSwyNCBAQAogfQogCiAKLSNsaW5lIDM0MCAiZHRjLXBhcnNlci55IgorCisvKiBMaW5lIDE2NzUgb2YgeWFjYy5jICAqLworI2xpbmUgMzEzICJkdGMtcGFyc2VyLnkiCiAKIAotdm9pZCB5eWVycm9yZihjaGFyIGNvbnN0ICpzLCAuLi4pCit2b2lkIHByaW50X2Vycm9yKGNoYXIgY29uc3QgKmZtdCwgLi4uKQogewotCWNvbnN0IGNoYXIgKmZuYW1lID0gc3JjcG9zX2ZpbGUgPyBzcmNwb3NfZmlsZS0+bmFtZSA6ICI8bm8tZmlsZT4iOwogCXZhX2xpc3QgdmE7Ci0JdmFfc3RhcnQodmEsIHMpOwogCi0JaWYgKHN0cmNtcChmbmFtZSwgIi0iKSA9PSAwKQotCQlmbmFtZSA9ICJzdGRpbiI7Ci0KLQlmcHJpbnRmKHN0ZGVyciwgIiVzOiVkICIsIGZuYW1lLCB5eWxsb2MuZmlyc3RfbGluZSk7Ci0JdmZwcmludGYoc3RkZXJyLCBzLCB2YSk7Ci0JZnByaW50ZihzdGRlcnIsICJcbiIpOworCXZhX3N0YXJ0KHZhLCBmbXQpOworCXNyY3Bvc192ZXJyb3IoJnl5bGxvYywgZm10LCB2YSk7CisJdmFfZW5kKHZhKTsKIAogCXRyZWVzb3VyY2VfZXJyb3IgPSAxOwotCXZhX2VuZCh2YSk7CiB9CiAKLXZvaWQgeXllcnJvciAoY2hhciBjb25zdCAqcykKLXsKLQl5eWVycm9yZigiJXMiLCBzKTsKK3ZvaWQgeXllcnJvcihjaGFyIGNvbnN0ICpzKSB7CisJcHJpbnRfZXJyb3IoIiVzIiwgcyk7CiB9CiAKIHN0YXRpYyB1bnNpZ25lZCBsb25nIGxvbmcgZXZhbF9saXRlcmFsKGNvbnN0IGNoYXIgKnMsIGludCBiYXNlLCBpbnQgYml0cykKQEAgLTIwMjksMTIgKzIwMTcsMTIgQEAKIAllcnJubyA9IDA7CiAJdmFsID0gc3RydG91bGwocywgJmUsIGJhc2UpOwogCWlmICgqZSkKLQkJeXllcnJvcigiYmFkIGNoYXJhY3RlcnMgaW4gbGl0ZXJhbCIpOworCQlwcmludF9lcnJvcigiYmFkIGNoYXJhY3RlcnMgaW4gbGl0ZXJhbCIpOwogCWVsc2UgaWYgKChlcnJubyA9PSBFUkFOR0UpCiAJCSB8fCAoKGJpdHMgPCA2NCkgJiYgKHZhbCA+PSAoMVVMTCA8PCBiaXRzKSkpKQotCQl5eWVycm9yKCJsaXRlcmFsIG91dCBvZiByYW5nZSIpOworCQlwcmludF9lcnJvcigibGl0ZXJhbCBvdXQgb2YgcmFuZ2UiKTsKIAllbHNlIGlmIChlcnJubyAhPSAwKQotCQl5eWVycm9yKCJiYWQgbGl0ZXJhbCIpOworCQlwcmludF9lcnJvcigiYmFkIGxpdGVyYWwiKTsKIAlyZXR1cm4gdmFsOwogfQogCmRpZmYgLS1naXQgYS9zY3JpcHRzL2R0Yy9kdGMtcGFyc2VyLnRhYi5oX3NoaXBwZWQgYi9zY3JpcHRzL2R0Yy9kdGMtcGFyc2VyLnRhYi5oX3NoaXBwZWQKaW5kZXggYmE5OTEwMC4uOTVjOTU0NyAxMDA2NDQKLS0tIGEvc2NyaXB0cy9kdGMvZHRjLXBhcnNlci50YWIuaF9zaGlwcGVkCisrKyBiL3NjcmlwdHMvZHRjL2R0Yy1wYXJzZXIudGFiLmhfc2hpcHBlZApAQCAtMSwyNCArMSwyMyBAQAotLyogQSBCaXNvbiBwYXJzZXIsIG1hZGUgYnkgR05VIEJpc29uIDIuMy4gICovCisKKy8qIEEgQmlzb24gcGFyc2VyLCBtYWRlIGJ5IEdOVSBCaXNvbiAyLjQuMS4gICovCiAKIC8qIFNrZWxldG9uIGludGVyZmFjZSBmb3IgQmlzb24ncyBZYWNjLWxpa2UgcGFyc2VycyBpbiBDCi0KLSAgIENvcHlyaWdodCAoQykgMTk4NCwgMTk4OSwgMTk5MCwgMjAwMCwgMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwgMjAwNgorICAgCisgICAgICBDb3B5cmlnaHQgKEMpIDE5ODQsIDE5ODksIDE5OTAsIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYKICAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAgIAogICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQorICAgCiAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsCi0gICBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4gICovCisgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCiAKIC8qIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHlvdSBtYXkgY3JlYXRlIGEgbGFyZ2VyIHdvcmsgdGhhdCBjb250YWlucwogICAgcGFydCBvciBhbGwgb2YgdGhlIEJpc29uIHBhcnNlciBza2VsZXRvbiBhbmQgZGlzdHJpYnV0ZSB0aGF0IHdvcmsKQEAgLTI5LDEwICsyOCwxMSBAQAogICAgc3BlY2lhbCBleGNlcHRpb24sIHdoaWNoIHdpbGwgY2F1c2UgdGhlIHNrZWxldG9uIGFuZCB0aGUgcmVzdWx0aW5nCiAgICBCaXNvbiBvdXRwdXQgZmlsZXMgdG8gYmUgbGljZW5zZWQgdW5kZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwogICAgTGljZW5zZSB3aXRob3V0IHRoaXMgc3BlY2lhbCBleGNlcHRpb24uCi0KKyAgIAogICAgVGhpcyBzcGVjaWFsIGV4Y2VwdGlvbiB3YXMgYWRkZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBpbgogICAgdmVyc2lvbiAyLjIgb2YgQmlzb24uICAqLwogCisKIC8qIFRva2Vucy4gICovCiAjaWZuZGVmIFlZVE9LRU5UWVBFCiAjIGRlZmluZSBZWVRPS0VOVFlQRQpAQCAtNDMsMzUgKzQzLDI0IEBACiAgICAgIERUX01FTVJFU0VSVkUgPSAyNTksCiAgICAgIERUX1BST1BOT0RFTkFNRSA9IDI2MCwKICAgICAgRFRfTElURVJBTCA9IDI2MSwKLSAgICAgRFRfTEVHQUNZTElURVJBTCA9IDI2MiwKLSAgICAgRFRfQkFTRSA9IDI2MywKLSAgICAgRFRfQllURSA9IDI2NCwKLSAgICAgRFRfU1RSSU5HID0gMjY1LAotICAgICBEVF9MQUJFTCA9IDI2NiwKLSAgICAgRFRfUkVGID0gMjY3LAotICAgICBEVF9JTkNCSU4gPSAyNjgKKyAgICAgRFRfQkFTRSA9IDI2MiwKKyAgICAgRFRfQllURSA9IDI2MywKKyAgICAgRFRfU1RSSU5HID0gMjY0LAorICAgICBEVF9MQUJFTCA9IDI2NSwKKyAgICAgRFRfUkVGID0gMjY2LAorICAgICBEVF9JTkNCSU4gPSAyNjcKICAgIH07CiAjZW5kaWYKLS8qIFRva2Vucy4gICovCi0jZGVmaW5lIERUX1YxIDI1OAotI2RlZmluZSBEVF9NRU1SRVNFUlZFIDI1OQotI2RlZmluZSBEVF9QUk9QTk9ERU5BTUUgMjYwCi0jZGVmaW5lIERUX0xJVEVSQUwgMjYxCi0jZGVmaW5lIERUX0xFR0FDWUxJVEVSQUwgMjYyCi0jZGVmaW5lIERUX0JBU0UgMjYzCi0jZGVmaW5lIERUX0JZVEUgMjY0Ci0jZGVmaW5lIERUX1NUUklORyAyNjUKLSNkZWZpbmUgRFRfTEFCRUwgMjY2Ci0jZGVmaW5lIERUX1JFRiAyNjcKLSNkZWZpbmUgRFRfSU5DQklOIDI2OAotCiAKIAogCiAjaWYgISBkZWZpbmVkIFlZU1RZUEUgJiYgISBkZWZpbmVkIFlZU1RZUEVfSVNfREVDTEFSRUQKIHR5cGVkZWYgdW5pb24gWVlTVFlQRQotI2xpbmUgMzcgImR0Yy1wYXJzZXIueSIKIHsKKworLyogTGluZSAxNjc2IG9mIHlhY2MuYyAgKi8KKyNsaW5lIDM5ICJkdGMtcGFyc2VyLnkiCisKIAljaGFyICpwcm9wbm9kZW5hbWU7CiAJY2hhciAqbGl0ZXJhbDsKIAljaGFyICpsYWJlbHJlZjsKQEAgLTg2LDI4ICs3NSwxNyBAQAogCXN0cnVjdCBub2RlICpub2RlOwogCXN0cnVjdCBub2RlICpub2RlbGlzdDsKIAlzdHJ1Y3QgcmVzZXJ2ZV9pbmZvICpyZTsKLX0KLS8qIExpbmUgMTQ4OSBvZiB5YWNjLmMuICAqLwotI2xpbmUgOTIgImR0Yy1wYXJzZXIudGFiLmgiCi0JWVlTVFlQRTsKKworCisKKy8qIExpbmUgMTY3NiBvZiB5YWNjLmMgICovCisjbGluZSA4MyAiZHRjLXBhcnNlci50YWIuaCIKK30gWVlTVFlQRTsKKyMgZGVmaW5lIFlZU1RZUEVfSVNfVFJJVklBTCAxCiAjIGRlZmluZSB5eXN0eXBlIFlZU1RZUEUgLyogb2Jzb2xlc2NlbnQ7IHdpbGwgYmUgd2l0aGRyYXduICovCiAjIGRlZmluZSBZWVNUWVBFX0lTX0RFQ0xBUkVEIDEKLSMgZGVmaW5lIFlZU1RZUEVfSVNfVFJJVklBTCAxCiAjZW5kaWYKIAogZXh0ZXJuIFlZU1RZUEUgeXlsdmFsOwogCi0jaWYgISBkZWZpbmVkIFlZTFRZUEUgJiYgISBkZWZpbmVkIFlZTFRZUEVfSVNfREVDTEFSRUQKLXR5cGVkZWYgc3RydWN0IFlZTFRZUEUKLXsKLSAgaW50IGZpcnN0X2xpbmU7Ci0gIGludCBmaXJzdF9jb2x1bW47Ci0gIGludCBsYXN0X2xpbmU7Ci0gIGludCBsYXN0X2NvbHVtbjsKLX0gWVlMVFlQRTsKLSMgZGVmaW5lIHl5bHR5cGUgWVlMVFlQRSAvKiBvYnNvbGVzY2VudDsgd2lsbCBiZSB3aXRoZHJhd24gKi8KLSMgZGVmaW5lIFlZTFRZUEVfSVNfREVDTEFSRUQgMQotIyBkZWZpbmUgWVlMVFlQRV9JU19UUklWSUFMIDEKLSNlbmRpZgogCi1leHRlcm4gWVlMVFlQRSB5eWxsb2M7CmRpZmYgLS1naXQgYS9zY3JpcHRzL2R0Yy9kdGMtcGFyc2VyLnkgYi9zY3JpcHRzL2R0Yy9kdGMtcGFyc2VyLnkKaW5kZXggYjJhYjU2Mi4uNWU4NGE2NyAxMDA2NDQKLS0tIGEvc2NyaXB0cy9kdGMvZHRjLXBhcnNlci55CisrKyBiL3NjcmlwdHMvZHRjL2R0Yy1wYXJzZXIueQpAQCAtMTgsMTUgKzE4LDE3IEBACiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0EKICAqLwogCi0lbG9jYXRpb25zCi0KICV7CiAjaW5jbHVkZSA8c3RkaW8uaD4KIAogI2luY2x1ZGUgImR0Yy5oIgogI2luY2x1ZGUgInNyY3Bvcy5oIgogCitZWUxUWVBFIHl5bGxvYzsKKwogZXh0ZXJuIGludCB5eWxleCh2b2lkKTsKK2V4dGVybiB2b2lkIHByaW50X2Vycm9yKGNoYXIgY29uc3QgKmZtdCwgLi4uKTsKK2V4dGVybiB2b2lkIHl5ZXJyb3IoY2hhciBjb25zdCAqcyk7CiAKIGV4dGVybiBzdHJ1Y3QgYm9vdF9pbmZvICp0aGVfYm9vdF9pbmZvOwogZXh0ZXJuIGludCB0cmVlc291cmNlX2Vycm9yOwpAQCAtNTUsNyArNTcsNiBAQAogJXRva2VuIERUX01FTVJFU0VSVkUKICV0b2tlbiA8cHJvcG5vZGVuYW1lPiBEVF9QUk9QTk9ERU5BTUUKICV0b2tlbiA8bGl0ZXJhbD4gRFRfTElURVJBTAotJXRva2VuIDxsaXRlcmFsPiBEVF9MRUdBQ1lMSVRFUkFMCiAldG9rZW4gPGNiYXNlPiBEVF9CQVNFCiAldG9rZW4gPGJ5dGU+IERUX0JZVEUKICV0b2tlbiA8ZGF0YT4gRFRfU1RSSU5HCkBAIC02NywxMSArNjgsOCBAQAogJXR5cGUgPGRhdGE+IHByb3BkYXRhcHJlZml4CiAldHlwZSA8cmU+IG1lbXJlc2VydmUKICV0eXBlIDxyZT4gbWVtcmVzZXJ2ZXMKLSV0eXBlIDxyZT4gdjBfbWVtcmVzZXJ2ZQotJXR5cGUgPHJlPiB2MF9tZW1yZXNlcnZlcwogJXR5cGUgPGFkZHI+IGFkZHIKICV0eXBlIDxkYXRhPiBjZWxsbGlzdAotJXR5cGUgPGNiYXNlPiBjZWxsYmFzZQogJXR5cGUgPGNlbGw+IGNlbGx2YWwKICV0eXBlIDxkYXRhPiBieXRlc3RyaW5nCiAldHlwZSA8cHJvcD4gcHJvcGRlZgpAQCAtODEsMTggKzc5LDE0IEBACiAldHlwZSA8bm9kZT4gbm9kZWRlZgogJXR5cGUgPG5vZGU+IHN1Ym5vZGUKICV0eXBlIDxub2RlbGlzdD4gc3Vibm9kZXMKLSV0eXBlIDxsYWJlbHJlZj4gbGFiZWwKIAogJSUKIAogc291cmNlZmlsZToKIAkgIERUX1YxICc7JyBtZW1yZXNlcnZlcyBkZXZpY2V0cmVlCiAJCXsKLQkJCXRoZV9ib290X2luZm8gPSBidWlsZF9ib290X2luZm8oJDMsICQ0LCAwKTsKLQkJfQotCXwgdjBfbWVtcmVzZXJ2ZXMgZGV2aWNldHJlZQotCQl7Ci0JCQl0aGVfYm9vdF9pbmZvID0gYnVpbGRfYm9vdF9pbmZvKCQxLCAkMiwgMCk7CisJCQl0aGVfYm9vdF9pbmZvID0gYnVpbGRfYm9vdF9pbmZvKCQzLCAkNCwKKwkJCQkJCQlndWVzc19ib290X2NwdWlkKCQ0KSk7CiAJCX0KIAk7CiAKQEAgLTEwOCwzMSArMTAyLDE0IEBACiAJOwogCiBtZW1yZXNlcnZlOgotCSAgbGFiZWwgRFRfTUVNUkVTRVJWRSBhZGRyIGFkZHIgJzsnCisJICBEVF9NRU1SRVNFUlZFIGFkZHIgYWRkciAnOycKIAkJewotCQkJJCQgPSBidWlsZF9yZXNlcnZlX2VudHJ5KCQzLCAkNCwgJDEpOworCQkJJCQgPSBidWlsZF9yZXNlcnZlX2VudHJ5KCQyLCAkMyk7CiAJCX0KLQk7Ci0KLXYwX21lbXJlc2VydmVzOgotCSAgLyogZW1wdHkgKi8KKwl8IERUX0xBQkVMIG1lbXJlc2VydmUKIAkJewotCQkJJCQgPSBOVUxMOwotCQl9Ci0JfCB2MF9tZW1yZXNlcnZlIHYwX21lbXJlc2VydmVzCi0JCXsKLQkJCSQkID0gY2hhaW5fcmVzZXJ2ZV9lbnRyeSgkMSwgJDIpOwotCQl9OwotCTsKLQotdjBfbWVtcmVzZXJ2ZToKLQkgIG1lbXJlc2VydmUKLQkJewotCQkJJCQgPSAkMTsKLQkJfQotCXwgbGFiZWwgRFRfTUVNUkVTRVJWRSBhZGRyICctJyBhZGRyICc7JwotCQl7Ci0JCQkkJCA9IGJ1aWxkX3Jlc2VydmVfZW50cnkoJDMsICQ1IC0gJDMgKyAxLCAkMSk7CisJCQlhZGRfbGFiZWwoJiQyLT5sYWJlbHMsICQxKTsKKwkJCSQkID0gJDI7CiAJCX0KIAk7CiAKQEAgLTE0MSwxNiArMTE4LDI2IEBACiAJCXsKIAkJCSQkID0gZXZhbF9saXRlcmFsKCQxLCAwLCA2NCk7CiAJCX0KLQl8IERUX0xFR0FDWUxJVEVSQUwKLQkJewotCQkJJCQgPSBldmFsX2xpdGVyYWwoJDEsIDE2LCA2NCk7Ci0JCX0KIAkgIDsKIAogZGV2aWNldHJlZToKIAkgICcvJyBub2RlZGVmCiAJCXsKLQkJCSQkID0gbmFtZV9ub2RlKCQyLCAiIiwgTlVMTCk7CisJCQkkJCA9IG5hbWVfbm9kZSgkMiwgIiIpOworCQl9CisJfCBkZXZpY2V0cmVlICcvJyBub2RlZGVmCisJCXsKKwkJCSQkID0gbWVyZ2Vfbm9kZXMoJDEsICQzKTsKKwkJfQorCXwgZGV2aWNldHJlZSBEVF9SRUYgbm9kZWRlZgorCQl7CisJCQlzdHJ1Y3Qgbm9kZSAqdGFyZ2V0ID0gZ2V0X25vZGVfYnlfcmVmKCQxLCAkMik7CisKKwkJCWlmICh0YXJnZXQpCisJCQkJbWVyZ2Vfbm9kZXModGFyZ2V0LCAkMyk7CisJCQllbHNlCisJCQkJcHJpbnRfZXJyb3IoImxhYmVsIG9yIHBhdGgsICclcycsIG5vdCBmb3VuZCIsICQyKTsKKwkJCSQkID0gJDE7CiAJCX0KIAk7CiAKQEAgLTE3MywxMyArMTYwLDE4IEBACiAJOwogCiBwcm9wZGVmOgotCSAgbGFiZWwgRFRfUFJPUE5PREVOQU1FICc9JyBwcm9wZGF0YSAnOycKKwkgIERUX1BST1BOT0RFTkFNRSAnPScgcHJvcGRhdGEgJzsnCiAJCXsKLQkJCSQkID0gYnVpbGRfcHJvcGVydHkoJDIsICQ0LCAkMSk7CisJCQkkJCA9IGJ1aWxkX3Byb3BlcnR5KCQxLCAkMyk7CiAJCX0KLQl8IGxhYmVsIERUX1BST1BOT0RFTkFNRSAnOycKKwl8IERUX1BST1BOT0RFTkFNRSAnOycKIAkJewotCQkJJCQgPSBidWlsZF9wcm9wZXJ0eSgkMiwgZW1wdHlfZGF0YSwgJDEpOworCQkJJCQgPSBidWlsZF9wcm9wZXJ0eSgkMSwgZW1wdHlfZGF0YSk7CisJCX0KKwl8IERUX0xBQkVMIHByb3BkZWYKKwkJeworCQkJYWRkX2xhYmVsKCYkMi0+bGFiZWxzLCAkMSk7CisJCQkkJCA9ICQyOwogCQl9CiAJOwogCkBAIC0yMDIsMzEgKzE5NCwzMCBAQAogCQl9CiAJfCBwcm9wZGF0YXByZWZpeCBEVF9JTkNCSU4gJygnIERUX1NUUklORyAnLCcgYWRkciAnLCcgYWRkciAnKScKIAkJewotCQkJc3RydWN0IHNlYXJjaF9wYXRoIHBhdGggPSB7IHNyY3Bvc19maWxlLT5kaXIsIE5VTEwsIE5VTEwgfTsKLQkJCXN0cnVjdCBkdGNfZmlsZSAqZmlsZSA9IGR0Y19vcGVuX2ZpbGUoJDQudmFsLCAmcGF0aCk7Ci0JCQlzdHJ1Y3QgZGF0YSBkID0gZW1wdHlfZGF0YTsKKwkJCUZJTEUgKmYgPSBzcmNmaWxlX3JlbGF0aXZlX29wZW4oJDQudmFsLCBOVUxMKTsKKwkJCXN0cnVjdCBkYXRhIGQ7CiAKIAkJCWlmICgkNiAhPSAwKQotCQkJCWlmIChmc2VlayhmaWxlLT5maWxlLCAkNiwgU0VFS19TRVQpICE9IDApCi0JCQkJCXl5ZXJyb3JmKCJDb3VsZG4ndCBzZWVrIHRvIG9mZnNldCAlbGx1IGluIFwiJXNcIjogJXMiLAotCQkJCQkJICh1bnNpZ25lZCBsb25nIGxvbmcpJDYsCi0JCQkJCQkgJDQudmFsLCBzdHJlcnJvcihlcnJubykpOworCQkJCWlmIChmc2VlayhmLCAkNiwgU0VFS19TRVQpICE9IDApCisJCQkJCXByaW50X2Vycm9yKCJDb3VsZG4ndCBzZWVrIHRvIG9mZnNldCAlbGx1IGluIFwiJXNcIjogJXMiLAorCQkJCQkJICAgICAodW5zaWduZWQgbG9uZyBsb25nKSQ2LAorCQkJCQkJICAgICAkNC52YWwsCisJCQkJCQkgICAgIHN0cmVycm9yKGVycm5vKSk7CiAKLQkJCWQgPSBkYXRhX2NvcHlfZmlsZShmaWxlLT5maWxlLCAkOCk7CisJCQlkID0gZGF0YV9jb3B5X2ZpbGUoZiwgJDgpOwogCiAJCQkkJCA9IGRhdGFfbWVyZ2UoJDEsIGQpOwotCQkJZHRjX2Nsb3NlX2ZpbGUoZmlsZSk7CisJCQlmY2xvc2UoZik7CiAJCX0KIAl8IHByb3BkYXRhcHJlZml4IERUX0lOQ0JJTiAnKCcgRFRfU1RSSU5HICcpJwogCQl7Ci0JCQlzdHJ1Y3Qgc2VhcmNoX3BhdGggcGF0aCA9IHsgc3JjcG9zX2ZpbGUtPmRpciwgTlVMTCwgTlVMTCB9OwotCQkJc3RydWN0IGR0Y19maWxlICpmaWxlID0gZHRjX29wZW5fZmlsZSgkNC52YWwsICZwYXRoKTsKKwkJCUZJTEUgKmYgPSBzcmNmaWxlX3JlbGF0aXZlX29wZW4oJDQudmFsLCBOVUxMKTsKIAkJCXN0cnVjdCBkYXRhIGQgPSBlbXB0eV9kYXRhOwogCi0JCQlkID0gZGF0YV9jb3B5X2ZpbGUoZmlsZS0+ZmlsZSwgLTEpOworCQkJZCA9IGRhdGFfY29weV9maWxlKGYsIC0xKTsKIAogCQkJJCQgPSBkYXRhX21lcmdlKCQxLCBkKTsKLQkJCWR0Y19jbG9zZV9maWxlKGZpbGUpOworCQkJZmNsb3NlKGYpOwogCQl9CiAJfCBwcm9wZGF0YSBEVF9MQUJFTAogCQl7CkBAIC0yNjksMjMgKzI2MCwxMSBAQAogCQl9CiAJOwogCi1jZWxsYmFzZToKLQkgIC8qIGVtcHR5ICovCi0JCXsKLQkJCSQkID0gMTY7Ci0JCX0KLQl8IERUX0JBU0UKLQk7Ci0KIGNlbGx2YWw6CiAJICBEVF9MSVRFUkFMCiAJCXsKIAkJCSQkID0gZXZhbF9saXRlcmFsKCQxLCAwLCAzMik7CiAJCX0KLQl8IGNlbGxiYXNlIERUX0xFR0FDWUxJVEVSQUwKLQkJewotCQkJJCQgPSBldmFsX2xpdGVyYWwoJDIsICQxLCAzMik7Ci0JCX0KIAk7CiAKIGJ5dGVzdHJpbmc6CkBAIC0zMDgsNTcgKzI4Nyw0NCBAQAogCQl7CiAJCQkkJCA9IE5VTEw7CiAJCX0KLQl8ICBzdWJub2RlIHN1Ym5vZGVzCisJfCBzdWJub2RlIHN1Ym5vZGVzCiAJCXsKIAkJCSQkID0gY2hhaW5fbm9kZSgkMSwgJDIpOwogCQl9CiAJfCBzdWJub2RlIHByb3BkZWYKIAkJewotCQkJeXllcnJvcigic3ludGF4IGVycm9yOiBwcm9wZXJ0aWVzIG11c3QgcHJlY2VkZSBzdWJub2RlcyIpOworCQkJcHJpbnRfZXJyb3IoInN5bnRheCBlcnJvcjogcHJvcGVydGllcyBtdXN0IHByZWNlZGUgc3Vibm9kZXMiKTsKIAkJCVlZRVJST1I7CiAJCX0KIAk7CiAKIHN1Ym5vZGU6Ci0JICBsYWJlbCBEVF9QUk9QTk9ERU5BTUUgbm9kZWRlZgorCSAgRFRfUFJPUE5PREVOQU1FIG5vZGVkZWYKIAkJewotCQkJJCQgPSBuYW1lX25vZGUoJDMsICQyLCAkMSk7CisJCQkkJCA9IG5hbWVfbm9kZSgkMiwgJDEpOwogCQl9Ci0JOwotCi1sYWJlbDoKLQkgIC8qIGVtcHR5ICovCisJfCBEVF9MQUJFTCBzdWJub2RlCiAJCXsKLQkJCSQkID0gTlVMTDsKLQkJfQotCXwgRFRfTEFCRUwKLQkJewotCQkJJCQgPSAkMTsKKwkJCWFkZF9sYWJlbCgmJDItPmxhYmVscywgJDEpOworCQkJJCQgPSAkMjsKIAkJfQogCTsKIAogJSUKIAotdm9pZCB5eWVycm9yZihjaGFyIGNvbnN0ICpzLCAuLi4pCit2b2lkIHByaW50X2Vycm9yKGNoYXIgY29uc3QgKmZtdCwgLi4uKQogewotCWNvbnN0IGNoYXIgKmZuYW1lID0gc3JjcG9zX2ZpbGUgPyBzcmNwb3NfZmlsZS0+bmFtZSA6ICI8bm8tZmlsZT4iOwogCXZhX2xpc3QgdmE7Ci0JdmFfc3RhcnQodmEsIHMpOwogCi0JaWYgKHN0cmNtcChmbmFtZSwgIi0iKSA9PSAwKQotCQlmbmFtZSA9ICJzdGRpbiI7Ci0KLQlmcHJpbnRmKHN0ZGVyciwgIiVzOiVkICIsIGZuYW1lLCB5eWxsb2MuZmlyc3RfbGluZSk7Ci0JdmZwcmludGYoc3RkZXJyLCBzLCB2YSk7Ci0JZnByaW50ZihzdGRlcnIsICJcbiIpOworCXZhX3N0YXJ0KHZhLCBmbXQpOworCXNyY3Bvc192ZXJyb3IoJnl5bGxvYywgZm10LCB2YSk7CisJdmFfZW5kKHZhKTsKIAogCXRyZWVzb3VyY2VfZXJyb3IgPSAxOwotCXZhX2VuZCh2YSk7CiB9CiAKLXZvaWQgeXllcnJvciAoY2hhciBjb25zdCAqcykKLXsKLQl5eWVycm9yZigiJXMiLCBzKTsKK3ZvaWQgeXllcnJvcihjaGFyIGNvbnN0ICpzKSB7CisJcHJpbnRfZXJyb3IoIiVzIiwgcyk7CiB9CiAKIHN0YXRpYyB1bnNpZ25lZCBsb25nIGxvbmcgZXZhbF9saXRlcmFsKGNvbnN0IGNoYXIgKnMsIGludCBiYXNlLCBpbnQgYml0cykKQEAgLTM2OSwxMSArMzM1LDExIEBACiAJZXJybm8gPSAwOwogCXZhbCA9IHN0cnRvdWxsKHMsICZlLCBiYXNlKTsKIAlpZiAoKmUpCi0JCXl5ZXJyb3IoImJhZCBjaGFyYWN0ZXJzIGluIGxpdGVyYWwiKTsKKwkJcHJpbnRfZXJyb3IoImJhZCBjaGFyYWN0ZXJzIGluIGxpdGVyYWwiKTsKIAllbHNlIGlmICgoZXJybm8gPT0gRVJBTkdFKQogCQkgfHwgKChiaXRzIDwgNjQpICYmICh2YWwgPj0gKDFVTEwgPDwgYml0cykpKSkKLQkJeXllcnJvcigibGl0ZXJhbCBvdXQgb2YgcmFuZ2UiKTsKKwkJcHJpbnRfZXJyb3IoImxpdGVyYWwgb3V0IG9mIHJhbmdlIik7CiAJZWxzZSBpZiAoZXJybm8gIT0gMCkKLQkJeXllcnJvcigiYmFkIGxpdGVyYWwiKTsKKwkJcHJpbnRfZXJyb3IoImJhZCBsaXRlcmFsIik7CiAJcmV0dXJuIHZhbDsKIH0KZGlmZiAtLWdpdCBhL3NjcmlwdHMvZHRjL2R0Yy5jIGIvc2NyaXB0cy9kdGMvZHRjLmMKaW5kZXggZDhmZDQzYi4uY2JjMDE5MyAxMDA2NDQKLS0tIGEvc2NyaXB0cy9kdGMvZHRjLmMKKysrIGIvc2NyaXB0cy9kdGMvZHRjLmMKQEAgLTMwLDMwICszMCw3IEBACiBpbnQgcmVzZXJ2ZW51bTsJCS8qIE51bWJlciBvZiBtZW1vcnkgcmVzZXJ2YXRpb24gc2xvdHMgKi8KIGludCBtaW5zaXplOwkJLyogTWluaW11bSBibG9iIHNpemUgKi8KIGludCBwYWRzaXplOwkJLyogQWRkaXRpb25hbCBwYWRkaW5nIHRvIGJsb2IgKi8KLQotY2hhciAqam9pbl9wYXRoKGNvbnN0IGNoYXIgKnBhdGgsIGNvbnN0IGNoYXIgKm5hbWUpCi17Ci0JaW50IGxlbnAgPSBzdHJsZW4ocGF0aCk7Ci0JaW50IGxlbm4gPSBzdHJsZW4obmFtZSk7Ci0JaW50IGxlbjsKLQlpbnQgbmVlZHNsYXNoID0gMTsKLQljaGFyICpzdHI7Ci0KLQlsZW4gPSBsZW5wICsgbGVubiArIDI7Ci0JaWYgKChsZW5wID4gMCkgJiYgKHBhdGhbbGVucC0xXSA9PSAnLycpKSB7Ci0JCW5lZWRzbGFzaCA9IDA7Ci0JCWxlbi0tOwotCX0KLQotCXN0ciA9IHhtYWxsb2MobGVuKTsKLQltZW1jcHkoc3RyLCBwYXRoLCBsZW5wKTsKLQlpZiAobmVlZHNsYXNoKSB7Ci0JCXN0cltsZW5wXSA9ICcvJzsKLQkJbGVucCsrOwotCX0KLQltZW1jcHkoc3RyK2xlbnAsIG5hbWUsIGxlbm4rMSk7Ci0JcmV0dXJuIHN0cjsKLX0KK2ludCBwaGFuZGxlX2Zvcm1hdCA9IFBIQU5ETEVfQk9USDsJLyogVXNlIGxpbnV4LHBoYW5kbGUgb3IgcGhhbmRsZSBwcm9wZXJ0aWVzICovCiAKIHN0YXRpYyB2b2lkIGZpbGxfZnVsbHBhdGhzKHN0cnVjdCBub2RlICp0cmVlLCBjb25zdCBjaGFyICpwcmVmaXgpCiB7CkBAIC0xMDQsOCArODEsMTUgQEAKIAlmcHJpbnRmKHN0ZGVyciwgIlx0XHRTZXQgdGhlIHBoeXNpY2FsIGJvb3QgY3B1XG4iKTsKIAlmcHJpbnRmKHN0ZGVyciwgIlx0LWZcbiIpOwogCWZwcmludGYoc3RkZXJyLCAiXHRcdEZvcmNlIC0gdHJ5IHRvIHByb2R1Y2Ugb3V0cHV0IGV2ZW4gaWYgdGhlIGlucHV0IHRyZWUgaGFzIGVycm9yc1xuIik7CisJZnByaW50ZihzdGRlcnIsICJcdC1zXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIlx0XHRTb3J0IG5vZGVzIGFuZCBwcm9wZXJ0aWVzIGJlZm9yZSBvdXRwdXR0aW5nIChvbmx5IHVzZWZ1bCBmb3Jcblx0XHRjb21wYXJpbmcgdHJlZXMpXG4iKTsKIAlmcHJpbnRmKHN0ZGVyciwgIlx0LXZcbiIpOwogCWZwcmludGYoc3RkZXJyLCAiXHRcdFByaW50IERUQyB2ZXJzaW9uIGFuZCBleGl0XG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIlx0LUggPHBoYW5kbGUgZm9ybWF0PlxuIik7CisJZnByaW50ZihzdGRlcnIsICJcdFx0cGhhbmRsZSBmb3JtYXRzIGFyZTpcbiIpOworCWZwcmludGYoc3RkZXJyLCAiXHRcdFx0bGVnYWN5IC0gXCJsaW51eCxwaGFuZGxlXCIgcHJvcGVydGllcyBvbmx5XG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIlx0XHRcdGVwYXByIC0gXCJwaGFuZGxlXCIgcHJvcGVydGllcyBvbmx5XG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIlx0XHRcdGJvdGggLSBCb3RoIFwibGludXgscGhhbmRsZVwiIGFuZCBcInBoYW5kbGVcIiBwcm9wZXJ0aWVzXG4iKTsKIAlleGl0KDMpOwogfQogCkBAIC0xMTUsNyArOTksNyBAQAogCWNvbnN0IGNoYXIgKmluZm9ybSA9ICJkdHMiOwogCWNvbnN0IGNoYXIgKm91dGZvcm0gPSAiZHRzIjsKIAljb25zdCBjaGFyICpvdXRuYW1lID0gIi0iOwotCWludCBmb3JjZSA9IDAsIGNoZWNrID0gMDsKKwlpbnQgZm9yY2UgPSAwLCBjaGVjayA9IDAsIHNvcnQgPSAwOwogCWNvbnN0IGNoYXIgKmFyZzsKIAlpbnQgb3B0OwogCUZJTEUgKm91dGYgPSBOVUxMOwpAQCAtMTI3LDcgKzExMSw3IEBACiAJbWluc2l6ZSAgICA9IDA7CiAJcGFkc2l6ZSAgICA9IDA7CiAKLQl3aGlsZSAoKG9wdCA9IGdldG9wdChhcmdjLCBhcmd2LCAiaEk6TzpvOlY6UjpTOnA6ZmNxYjp2IikpICE9IEVPRikgeworCXdoaWxlICgob3B0ID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsICJoSTpPOm86VjpSOlM6cDpmY3FiOnZIOnMiKSkgIT0gRU9GKSB7CiAJCXN3aXRjaCAob3B0KSB7CiAJCWNhc2UgJ0knOgogCQkJaW5mb3JtID0gb3B0YXJnOwpAQCAtMTY1LDYgKzE0OSwyMiBAQAogCQljYXNlICd2JzoKIAkJCXByaW50ZigiVmVyc2lvbjogJXNcbiIsIERUQ19WRVJTSU9OKTsKIAkJCWV4aXQoMCk7CisJCWNhc2UgJ0gnOgorCQkJaWYgKHN0cmVxKG9wdGFyZywgImxlZ2FjeSIpKQorCQkJCXBoYW5kbGVfZm9ybWF0ID0gUEhBTkRMRV9MRUdBQ1k7CisJCQllbHNlIGlmIChzdHJlcShvcHRhcmcsICJlcGFwciIpKQorCQkJCXBoYW5kbGVfZm9ybWF0ID0gUEhBTkRMRV9FUEFQUjsKKwkJCWVsc2UgaWYgKHN0cmVxKG9wdGFyZywgImJvdGgiKSkKKwkJCQlwaGFuZGxlX2Zvcm1hdCA9IFBIQU5ETEVfQk9USDsKKwkJCWVsc2UKKwkJCQlkaWUoIkludmFsaWQgYXJndW1lbnQgXCIlc1wiIHRvIC1IIG9wdGlvblxuIiwKKwkJCQkgICAgb3B0YXJnKTsKKwkJCWJyZWFrOworCisJCWNhc2UgJ3MnOgorCQkJc29ydCA9IDE7CisJCQlicmVhazsKKwogCQljYXNlICdoJzoKIAkJZGVmYXVsdDoKIAkJCXVzYWdlKCk7CkBAIC0xODIsNiArMTgyLDkgQEAKIAlpZiAobWluc2l6ZSAmJiBwYWRzaXplKQogCQlkaWUoIkNhbid0IHNldCBib3RoIC1wIGFuZCAtU1xuIik7CiAKKwlpZiAobWluc2l6ZSkKKwkJZnByaW50ZihzdGRlcnIsICJEVEM6IFVzZSBvZiBcIi1TXCIgaXMgZGVwcmVjYXRlZDsgaXQgd2lsbCBiZSByZW1vdmVkIHNvb24sIHVzZSBcIi1wXCIgaW5zdGVhZFxuIik7CisKIAlmcHJpbnRmKHN0ZGVyciwgIkRUQzogJXMtPiVzICBvbiBmaWxlIFwiJXNcIlxuIiwKIAkJaW5mb3JtLCBvdXRmb3JtLCBhcmcpOwogCkBAIC0yMDAsNiArMjAzLDggQEAKIAlmaWxsX2Z1bGxwYXRocyhiaS0+ZHQsICIiKTsKIAlwcm9jZXNzX2NoZWNrcyhmb3JjZSwgYmkpOwogCisJaWYgKHNvcnQpCisJCXNvcnRfdHJlZShiaSk7CiAKIAlpZiAoc3RyZXEob3V0bmFtZSwgIi0iKSkgewogCQlvdXRmID0gc3Rkb3V0OwpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9kdGMvZHRjLmggYi9zY3JpcHRzL2R0Yy9kdGMuaAppbmRleCAwOGQ1NGM4Li5mMzdjOTdlIDEwMDY0NAotLS0gYS9zY3JpcHRzL2R0Yy9kdGMuaAorKysgYi9zY3JpcHRzL2R0Yy9kdGMuaApAQCAtMzQsNyArMzQsMTcgQEAKICNpbmNsdWRlIDxsaWJmZHRfZW52Lmg+CiAjaW5jbHVkZSA8ZmR0Lmg+CiAKKyNpbmNsdWRlICJ1dGlsLmgiCisKKyNpZmRlZiBERUJVRworI2RlZmluZSBkZWJ1ZyhmbXQsYXJncy4uLikJcHJpbnRmKGZtdCwgIyNhcmdzKQorI2Vsc2UKKyNkZWZpbmUgZGVidWcoZm10LGFyZ3MuLi4pCisjZW5kaWYKKworCiAjZGVmaW5lIERFRkFVTFRfRkRUX1ZFUlNJT04JMTcKKwogLyoKICAqIENvbW1hbmQgbGluZSBvcHRpb25zCiAgKi8KQEAgLTQyLDM2ICs1MiwxMSBAQAogZXh0ZXJuIGludCByZXNlcnZlbnVtOwkJLyogTnVtYmVyIG9mIG1lbW9yeSByZXNlcnZhdGlvbiBzbG90cyAqLwogZXh0ZXJuIGludCBtaW5zaXplOwkJLyogTWluaW11bSBibG9iIHNpemUgKi8KIGV4dGVybiBpbnQgcGFkc2l6ZTsJCS8qIEFkZGl0aW9uYWwgcGFkZGluZyB0byBibG9iICovCitleHRlcm4gaW50IHBoYW5kbGVfZm9ybWF0OwkvKiBVc2UgbGludXgscGhhbmRsZSBvciBwaGFuZGxlIHByb3BlcnRpZXMgKi8KIAotc3RhdGljIGlubGluZSB2b2lkIF9fYXR0cmlidXRlX18oKG5vcmV0dXJuKSkgZGllKGNoYXIgKiBzdHIsIC4uLikKLXsKLQl2YV9saXN0IGFwOwotCi0JdmFfc3RhcnQoYXAsIHN0cik7Ci0JZnByaW50ZihzdGRlcnIsICJGQVRBTCBFUlJPUjogIik7Ci0JdmZwcmludGYoc3RkZXJyLCBzdHIsIGFwKTsKLQlleGl0KDEpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgKnhtYWxsb2Moc2l6ZV90IGxlbikKLXsKLQl2b2lkICpuZXcgPSBtYWxsb2MobGVuKTsKLQotCWlmICghIG5ldykKLQkJZGllKCJtYWxsb2MoKSBmYWlsZWRcbiIpOwotCi0JcmV0dXJuIG5ldzsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkICp4cmVhbGxvYyh2b2lkICpwLCBzaXplX3QgbGVuKQotewotCXZvaWQgKm5ldyA9IHJlYWxsb2MocCwgbGVuKTsKLQotCWlmICghIG5ldykKLQkJZGllKCJyZWFsbG9jKCkgZmFpbGVkIChsZW49JWQpXG4iLCBsZW4pOwotCi0JcmV0dXJuIG5ldzsKLX0KKyNkZWZpbmUgUEhBTkRMRV9MRUdBQ1kJMHgxCisjZGVmaW5lIFBIQU5ETEVfRVBBUFIJMHgyCisjZGVmaW5lIFBIQU5ETEVfQk9USAkweDMKIAogdHlwZWRlZiB1aW50MzJfdCBjZWxsX3Q7CiAKQEAgLTE0MCwxMyArMTI1LDE4IEBACiAjZGVmaW5lIE1BWF9OT0RFTkFNRV9MRU4JMzEKIAogLyogTGl2ZSB0cmVlcyAqLworc3RydWN0IGxhYmVsIHsKKwljaGFyICpsYWJlbDsKKwlzdHJ1Y3QgbGFiZWwgKm5leHQ7Cit9OworCiBzdHJ1Y3QgcHJvcGVydHkgewogCWNoYXIgKm5hbWU7CiAJc3RydWN0IGRhdGEgdmFsOwogCiAJc3RydWN0IHByb3BlcnR5ICpuZXh0OwogCi0JY2hhciAqbGFiZWw7CisJc3RydWN0IGxhYmVsICpsYWJlbHM7CiB9OwogCiBzdHJ1Y3Qgbm9kZSB7CkBAIC0xNjMsMjIgKzE1MywyOCBAQAogCWNlbGxfdCBwaGFuZGxlOwogCWludCBhZGRyX2NlbGxzLCBzaXplX2NlbGxzOwogCi0JY2hhciAqbGFiZWw7CisJc3RydWN0IGxhYmVsICpsYWJlbHM7CiB9OwogCisjZGVmaW5lIGZvcl9lYWNoX2xhYmVsKGwwLCBsKSBcCisJZm9yICgobCkgPSAobDApOyAobCk7IChsKSA9IChsKS0+bmV4dCkKKwogI2RlZmluZSBmb3JfZWFjaF9wcm9wZXJ0eShuLCBwKSBcCiAJZm9yICgocCkgPSAobiktPnByb3BsaXN0OyAocCk7IChwKSA9IChwKS0+bmV4dCkKIAogI2RlZmluZSBmb3JfZWFjaF9jaGlsZChuLCBjKQlcCiAJZm9yICgoYykgPSAobiktPmNoaWxkcmVuOyAoYyk7IChjKSA9IChjKS0+bmV4dF9zaWJsaW5nKQogCi1zdHJ1Y3QgcHJvcGVydHkgKmJ1aWxkX3Byb3BlcnR5KGNoYXIgKm5hbWUsIHN0cnVjdCBkYXRhIHZhbCwgY2hhciAqbGFiZWwpOwordm9pZCBhZGRfbGFiZWwoc3RydWN0IGxhYmVsICoqbGFiZWxzLCBjaGFyICpsYWJlbCk7CisKK3N0cnVjdCBwcm9wZXJ0eSAqYnVpbGRfcHJvcGVydHkoY2hhciAqbmFtZSwgc3RydWN0IGRhdGEgdmFsKTsKIHN0cnVjdCBwcm9wZXJ0eSAqY2hhaW5fcHJvcGVydHkoc3RydWN0IHByb3BlcnR5ICpmaXJzdCwgc3RydWN0IHByb3BlcnR5ICpsaXN0KTsKIHN0cnVjdCBwcm9wZXJ0eSAqcmV2ZXJzZV9wcm9wZXJ0aWVzKHN0cnVjdCBwcm9wZXJ0eSAqZmlyc3QpOwogCiBzdHJ1Y3Qgbm9kZSAqYnVpbGRfbm9kZShzdHJ1Y3QgcHJvcGVydHkgKnByb3BsaXN0LCBzdHJ1Y3Qgbm9kZSAqY2hpbGRyZW4pOwotc3RydWN0IG5vZGUgKm5hbWVfbm9kZShzdHJ1Y3Qgbm9kZSAqbm9kZSwgY2hhciAqbmFtZSwgY2hhciAqbGFiZWwpOworc3RydWN0IG5vZGUgKm5hbWVfbm9kZShzdHJ1Y3Qgbm9kZSAqbm9kZSwgY2hhciAqbmFtZSk7CiBzdHJ1Y3Qgbm9kZSAqY2hhaW5fbm9kZShzdHJ1Y3Qgbm9kZSAqZmlyc3QsIHN0cnVjdCBub2RlICpsaXN0KTsKK3N0cnVjdCBub2RlICptZXJnZV9ub2RlcyhzdHJ1Y3Qgbm9kZSAqb2xkX25vZGUsIHN0cnVjdCBub2RlICpuZXdfbm9kZSk7CiAKIHZvaWQgYWRkX3Byb3BlcnR5KHN0cnVjdCBub2RlICpub2RlLCBzdHJ1Y3QgcHJvcGVydHkgKnByb3ApOwogdm9pZCBhZGRfY2hpbGQoc3RydWN0IG5vZGUgKnBhcmVudCwgc3RydWN0IG5vZGUgKmNoaWxkKTsKQEAgLTE4Niw2ICsxODIsMTAgQEAKIGNvbnN0IGNoYXIgKmdldF91bml0bmFtZShzdHJ1Y3Qgbm9kZSAqbm9kZSk7CiBzdHJ1Y3QgcHJvcGVydHkgKmdldF9wcm9wZXJ0eShzdHJ1Y3Qgbm9kZSAqbm9kZSwgY29uc3QgY2hhciAqcHJvcG5hbWUpOwogY2VsbF90IHByb3B2YWxfY2VsbChzdHJ1Y3QgcHJvcGVydHkgKnByb3ApOworc3RydWN0IHByb3BlcnR5ICpnZXRfcHJvcGVydHlfYnlfbGFiZWwoc3RydWN0IG5vZGUgKnRyZWUsIGNvbnN0IGNoYXIgKmxhYmVsLAorCQkJCSAgICAgICBzdHJ1Y3Qgbm9kZSAqKm5vZGUpOworc3RydWN0IG1hcmtlciAqZ2V0X21hcmtlcl9sYWJlbChzdHJ1Y3Qgbm9kZSAqdHJlZSwgY29uc3QgY2hhciAqbGFiZWwsCisJCQkJc3RydWN0IG5vZGUgKipub2RlLCBzdHJ1Y3QgcHJvcGVydHkgKipwcm9wKTsKIHN0cnVjdCBub2RlICpnZXRfc3Vibm9kZShzdHJ1Y3Qgbm9kZSAqbm9kZSwgY29uc3QgY2hhciAqbm9kZW5hbWUpOwogc3RydWN0IG5vZGUgKmdldF9ub2RlX2J5X3BhdGgoc3RydWN0IG5vZGUgKnRyZWUsIGNvbnN0IGNoYXIgKnBhdGgpOwogc3RydWN0IG5vZGUgKmdldF9ub2RlX2J5X2xhYmVsKHN0cnVjdCBub2RlICp0cmVlLCBjb25zdCBjaGFyICpsYWJlbCk7CkBAIC0xOTMsNiArMTkzLDggQEAKIHN0cnVjdCBub2RlICpnZXRfbm9kZV9ieV9yZWYoc3RydWN0IG5vZGUgKnRyZWUsIGNvbnN0IGNoYXIgKnJlZik7CiBjZWxsX3QgZ2V0X25vZGVfcGhhbmRsZShzdHJ1Y3Qgbm9kZSAqcm9vdCwgc3RydWN0IG5vZGUgKm5vZGUpOwogCit1aW50MzJfdCBndWVzc19ib290X2NwdWlkKHN0cnVjdCBub2RlICp0cmVlKTsKKwogLyogQm9vdCBpbmZvICh0cmVlIHBsdXMgbWVtcmVzZXJ2ZSBpbmZvcm1hdGlvbiAqLwogCiBzdHJ1Y3QgcmVzZXJ2ZV9pbmZvIHsKQEAgLTIwMCwxMCArMjAyLDEwIEBACiAKIAlzdHJ1Y3QgcmVzZXJ2ZV9pbmZvICpuZXh0OwogCi0JY2hhciAqbGFiZWw7CisJc3RydWN0IGxhYmVsICpsYWJlbHM7CiB9OwogCi1zdHJ1Y3QgcmVzZXJ2ZV9pbmZvICpidWlsZF9yZXNlcnZlX2VudHJ5KHVpbnQ2NF90IHN0YXJ0LCB1aW50NjRfdCBsZW4sIGNoYXIgKmxhYmVsKTsKK3N0cnVjdCByZXNlcnZlX2luZm8gKmJ1aWxkX3Jlc2VydmVfZW50cnkodWludDY0X3Qgc3RhcnQsIHVpbnQ2NF90IGxlbik7CiBzdHJ1Y3QgcmVzZXJ2ZV9pbmZvICpjaGFpbl9yZXNlcnZlX2VudHJ5KHN0cnVjdCByZXNlcnZlX2luZm8gKmZpcnN0LAogCQkJCQkgc3RydWN0IHJlc2VydmVfaW5mbyAqbGlzdCk7CiBzdHJ1Y3QgcmVzZXJ2ZV9pbmZvICphZGRfcmVzZXJ2ZV9lbnRyeShzdHJ1Y3QgcmVzZXJ2ZV9pbmZvICpsaXN0LApAQCAtMjE4LDYgKzIyMCw3IEBACiAKIHN0cnVjdCBib290X2luZm8gKmJ1aWxkX2Jvb3RfaW5mbyhzdHJ1Y3QgcmVzZXJ2ZV9pbmZvICpyZXNlcnZlbGlzdCwKIAkJCQkgIHN0cnVjdCBub2RlICp0cmVlLCB1aW50MzJfdCBib290X2NwdWlkX3BoeXMpOwordm9pZCBzb3J0X3RyZWUoc3RydWN0IGJvb3RfaW5mbyAqYmkpOwogCiAvKiBDaGVja3MgKi8KIApAQCAtMjM5LDggKzI0Miw0IEBACiAKIHN0cnVjdCBib290X2luZm8gKmR0X2Zyb21fZnMoY29uc3QgY2hhciAqZGlybmFtZSk7CiAKLS8qIG1pc2MgKi8KLQotY2hhciAqam9pbl9wYXRoKGNvbnN0IGNoYXIgKnBhdGgsIGNvbnN0IGNoYXIgKm5hbWUpOwotCiAjZW5kaWYgLyogX0RUQ19IICovCmRpZmYgLS1naXQgYS9zY3JpcHRzL2R0Yy9mbGF0dHJlZS5jIGIvc2NyaXB0cy9kdGMvZmxhdHRyZWUuYwppbmRleCA3NmFjZDI4Li5lYWQwMzMyIDEwMDY0NAotLS0gYS9zY3JpcHRzL2R0Yy9mbGF0dHJlZS5jCisrKyBiL3NjcmlwdHMvZHRjL2ZsYXR0cmVlLmMKQEAgLTUyLDkgKzUyLDkgQEAKIAl2b2lkICgqc3RyaW5nKSh2b2lkICosIGNoYXIgKiwgaW50KTsKIAl2b2lkICgqYWxpZ24pKHZvaWQgKiwgaW50KTsKIAl2b2lkICgqZGF0YSkodm9pZCAqLCBzdHJ1Y3QgZGF0YSk7Ci0Jdm9pZCAoKmJlZ2lubm9kZSkodm9pZCAqLCBjb25zdCBjaGFyICopOwotCXZvaWQgKCplbmRub2RlKSh2b2lkICosIGNvbnN0IGNoYXIgKik7Ci0Jdm9pZCAoKnByb3BlcnR5KSh2b2lkICosIGNvbnN0IGNoYXIgKik7CisJdm9pZCAoKmJlZ2lubm9kZSkodm9pZCAqLCBzdHJ1Y3QgbGFiZWwgKmxhYmVscyk7CisJdm9pZCAoKmVuZG5vZGUpKHZvaWQgKiwgc3RydWN0IGxhYmVsICpsYWJlbHMpOworCXZvaWQgKCpwcm9wZXJ0eSkodm9pZCAqLCBzdHJ1Y3QgbGFiZWwgKmxhYmVscyk7CiB9OwogCiBzdGF0aWMgdm9pZCBiaW5fZW1pdF9jZWxsKHZvaWQgKmUsIGNlbGxfdCB2YWwpCkBAIC04OSwxNyArODksMTcgQEAKIAkqZHRidWYgPSBkYXRhX2FwcGVuZF9kYXRhKCpkdGJ1ZiwgZC52YWwsIGQubGVuKTsKIH0KIAotc3RhdGljIHZvaWQgYmluX2VtaXRfYmVnaW5ub2RlKHZvaWQgKmUsIGNvbnN0IGNoYXIgKmxhYmVsKQorc3RhdGljIHZvaWQgYmluX2VtaXRfYmVnaW5ub2RlKHZvaWQgKmUsIHN0cnVjdCBsYWJlbCAqbGFiZWxzKQogewogCWJpbl9lbWl0X2NlbGwoZSwgRkRUX0JFR0lOX05PREUpOwogfQogCi1zdGF0aWMgdm9pZCBiaW5fZW1pdF9lbmRub2RlKHZvaWQgKmUsIGNvbnN0IGNoYXIgKmxhYmVsKQorc3RhdGljIHZvaWQgYmluX2VtaXRfZW5kbm9kZSh2b2lkICplLCBzdHJ1Y3QgbGFiZWwgKmxhYmVscykKIHsKIAliaW5fZW1pdF9jZWxsKGUsIEZEVF9FTkRfTk9ERSk7CiB9CiAKLXN0YXRpYyB2b2lkIGJpbl9lbWl0X3Byb3BlcnR5KHZvaWQgKmUsIGNvbnN0IGNoYXIgKmxhYmVsKQorc3RhdGljIHZvaWQgYmluX2VtaXRfcHJvcGVydHkodm9pZCAqZSwgc3RydWN0IGxhYmVsICpsYWJlbHMpCiB7CiAJYmluX2VtaXRfY2VsbChlLCBGRFRfUFJPUCk7CiB9CkBAIC0xMjcsMTEgKzEyNywyMSBAQAogCWZwcmludGYoZiwgIiVzXHQ9IC4gKyAlZFxuIiwgbGFiZWwsIG9mZnNldCk7CiB9CiAKKyNkZWZpbmUgQVNNX0VNSVRfQkVMT05HKGYsIGZtdCwgLi4uKSBcCisJeyBcCisJCWZwcmludGYoKGYpLCAiXHQuYnl0ZVx0KCgiIGZtdCAiKSA+PiAyNCkgJiAweGZmXG4iLCBfX1ZBX0FSR1NfXyk7IFwKKwkJZnByaW50ZigoZiksICJcdC5ieXRlXHQoKCIgZm10ICIpID4+IDE2KSAmIDB4ZmZcbiIsIF9fVkFfQVJHU19fKTsgXAorCQlmcHJpbnRmKChmKSwgIlx0LmJ5dGVcdCgoIiBmbXQgIikgPj4gOCkgJiAweGZmXG4iLCBfX1ZBX0FSR1NfXyk7IFwKKwkJZnByaW50ZigoZiksICJcdC5ieXRlXHQoIiBmbXQgIikgJiAweGZmXG4iLCBfX1ZBX0FSR1NfXyk7IFwKKwl9CisKIHN0YXRpYyB2b2lkIGFzbV9lbWl0X2NlbGwodm9pZCAqZSwgY2VsbF90IHZhbCkKIHsKIAlGSUxFICpmID0gZTsKIAotCWZwcmludGYoZiwgIlx0LmxvbmdcdDB4JXhcbiIsIHZhbCk7CisJZnByaW50ZihmLCAiXHQuYnl0ZSAweCUwMng7IC5ieXRlIDB4JTAyeDsgLmJ5dGUgMHglMDJ4OyAuYnl0ZSAweCUwMnhcbiIsCisJCSh2YWwgPj4gMjQpICYgMHhmZiwgKHZhbCA+PiAxNikgJiAweGZmLAorCQkodmFsID4+IDgpICYgMHhmZiwgdmFsICYgMHhmZik7CiB9CiAKIHN0YXRpYyB2b2lkIGFzbV9lbWl0X3N0cmluZyh2b2lkICplLCBjaGFyICpzdHIsIGludCBsZW4pCkBAIC0xNTYsNyArMTY2LDcgQEAKIHsKIAlGSUxFICpmID0gZTsKIAotCWZwcmludGYoZiwgIlx0LmJhbGlnblx0JWRcbiIsIGEpOworCWZwcmludGYoZiwgIlx0LmJhbGlnblx0JWQsIDBcbiIsIGEpOwogfQogCiBzdGF0aWMgdm9pZCBhc21fZW1pdF9kYXRhKHZvaWQgKmUsIHN0cnVjdCBkYXRhIGQpCkBAIC0xNjksOCArMTc5LDcgQEAKIAkJZW1pdF9vZmZzZXRfbGFiZWwoZiwgbS0+cmVmLCBtLT5vZmZzZXQpOwogCiAJd2hpbGUgKChkLmxlbiAtIG9mZikgPj0gc2l6ZW9mKHVpbnQzMl90KSkgewotCQlmcHJpbnRmKGYsICJcdC5sb25nXHQweCV4XG4iLAotCQkJZmR0MzJfdG9fY3B1KCooKHVpbnQzMl90ICopKGQudmFsK29mZikpKSk7CisJCWFzbV9lbWl0X2NlbGwoZSwgZmR0MzJfdG9fY3B1KCooKHVpbnQzMl90ICopKGQudmFsK29mZikpKSk7CiAJCW9mZiArPSBzaXplb2YodWludDMyX3QpOwogCX0KIApAQCAtMTgyLDM3ICsxOTEsNDMgQEAKIAlhc3NlcnQob2ZmID09IGQubGVuKTsKIH0KIAotc3RhdGljIHZvaWQgYXNtX2VtaXRfYmVnaW5ub2RlKHZvaWQgKmUsIGNvbnN0IGNoYXIgKmxhYmVsKQorc3RhdGljIHZvaWQgYXNtX2VtaXRfYmVnaW5ub2RlKHZvaWQgKmUsIHN0cnVjdCBsYWJlbCAqbGFiZWxzKQogewogCUZJTEUgKmYgPSBlOworCXN0cnVjdCBsYWJlbCAqbDsKIAotCWlmIChsYWJlbCkgewotCQlmcHJpbnRmKGYsICJcdC5nbG9ibFx0JXNcbiIsIGxhYmVsKTsKLQkJZnByaW50ZihmLCAiJXM6XG4iLCBsYWJlbCk7CisJZm9yX2VhY2hfbGFiZWwobGFiZWxzLCBsKSB7CisJCWZwcmludGYoZiwgIlx0Lmdsb2JsXHQlc1xuIiwgbC0+bGFiZWwpOworCQlmcHJpbnRmKGYsICIlczpcbiIsIGwtPmxhYmVsKTsKIAl9Ci0JZnByaW50ZihmLCAiXHQubG9uZ1x0RkRUX0JFR0lOX05PREVcbiIpOworCWZwcmludGYoZiwgIlx0LyogRkRUX0JFR0lOX05PREUgKi9cbiIpOworCWFzbV9lbWl0X2NlbGwoZSwgRkRUX0JFR0lOX05PREUpOwogfQogCi1zdGF0aWMgdm9pZCBhc21fZW1pdF9lbmRub2RlKHZvaWQgKmUsIGNvbnN0IGNoYXIgKmxhYmVsKQorc3RhdGljIHZvaWQgYXNtX2VtaXRfZW5kbm9kZSh2b2lkICplLCBzdHJ1Y3QgbGFiZWwgKmxhYmVscykKIHsKIAlGSUxFICpmID0gZTsKKwlzdHJ1Y3QgbGFiZWwgKmw7CiAKLQlmcHJpbnRmKGYsICJcdC5sb25nXHRGRFRfRU5EX05PREVcbiIpOwotCWlmIChsYWJlbCkgewotCQlmcHJpbnRmKGYsICJcdC5nbG9ibFx0JXNfZW5kXG4iLCBsYWJlbCk7Ci0JCWZwcmludGYoZiwgIiVzX2VuZDpcbiIsIGxhYmVsKTsKKwlmcHJpbnRmKGYsICJcdC8qIEZEVF9FTkRfTk9ERSAqL1xuIik7CisJYXNtX2VtaXRfY2VsbChlLCBGRFRfRU5EX05PREUpOworCWZvcl9lYWNoX2xhYmVsKGxhYmVscywgbCkgeworCQlmcHJpbnRmKGYsICJcdC5nbG9ibFx0JXNfZW5kXG4iLCBsLT5sYWJlbCk7CisJCWZwcmludGYoZiwgIiVzX2VuZDpcbiIsIGwtPmxhYmVsKTsKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIGFzbV9lbWl0X3Byb3BlcnR5KHZvaWQgKmUsIGNvbnN0IGNoYXIgKmxhYmVsKQorc3RhdGljIHZvaWQgYXNtX2VtaXRfcHJvcGVydHkodm9pZCAqZSwgc3RydWN0IGxhYmVsICpsYWJlbHMpCiB7CiAJRklMRSAqZiA9IGU7CisJc3RydWN0IGxhYmVsICpsOwogCi0JaWYgKGxhYmVsKSB7Ci0JCWZwcmludGYoZiwgIlx0Lmdsb2JsXHQlc1xuIiwgbGFiZWwpOwotCQlmcHJpbnRmKGYsICIlczpcbiIsIGxhYmVsKTsKKwlmb3JfZWFjaF9sYWJlbChsYWJlbHMsIGwpIHsKKwkJZnByaW50ZihmLCAiXHQuZ2xvYmxcdCVzXG4iLCBsLT5sYWJlbCk7CisJCWZwcmludGYoZiwgIiVzOlxuIiwgbC0+bGFiZWwpOwogCX0KLQlmcHJpbnRmKGYsICJcdC5sb25nXHRGRFRfUFJPUFxuIik7CisJZnByaW50ZihmLCAiXHQvKiBGRFRfUFJPUCAqL1xuIik7CisJYXNtX2VtaXRfY2VsbChlLCBGRFRfUFJPUCk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgZW1pdHRlciBhc21fZW1pdHRlciA9IHsKQEAgLTI0OCw3ICsyNjMsNyBAQAogCXN0cnVjdCBub2RlICpjaGlsZDsKIAlpbnQgc2Vlbl9uYW1lX3Byb3AgPSAwOwogCi0JZW1pdC0+YmVnaW5ub2RlKGV0YXJnZXQsIHRyZWUtPmxhYmVsKTsKKwllbWl0LT5iZWdpbm5vZGUoZXRhcmdldCwgdHJlZS0+bGFiZWxzKTsKIAogCWlmICh2aS0+ZmxhZ3MgJiBGVEZfRlVMTFBBVEgpCiAJCWVtaXQtPnN0cmluZyhldGFyZ2V0LCB0cmVlLT5mdWxscGF0aCwgMCk7CkBAIC0yNjUsNyArMjgwLDcgQEAKIAogCQluYW1lb2ZmID0gc3RyaW5ndGFibGVfaW5zZXJ0KHN0cmJ1ZiwgcHJvcC0+bmFtZSk7CiAKLQkJZW1pdC0+cHJvcGVydHkoZXRhcmdldCwgcHJvcC0+bGFiZWwpOworCQllbWl0LT5wcm9wZXJ0eShldGFyZ2V0LCBwcm9wLT5sYWJlbHMpOwogCQllbWl0LT5jZWxsKGV0YXJnZXQsIHByb3AtPnZhbC5sZW4pOwogCQllbWl0LT5jZWxsKGV0YXJnZXQsIG5hbWVvZmYpOwogCkBAIC0yOTIsNyArMzA3LDcgQEAKIAkJZmxhdHRlbl90cmVlKGNoaWxkLCBlbWl0LCBldGFyZ2V0LCBzdHJidWYsIHZpKTsKIAl9CiAKLQllbWl0LT5lbmRub2RlKGV0YXJnZXQsIHRyZWUtPmxhYmVsKTsKKwllbWl0LT5lbmRub2RlKGV0YXJnZXQsIHRyZWUtPmxhYmVscyk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgZGF0YSBmbGF0dGVuX3Jlc2VydmVfbGlzdChzdHJ1Y3QgcmVzZXJ2ZV9pbmZvICpyZXNlcnZlbGlzdCwKQEAgLTQxMywxMCArNDI4LDEzIEBACiAJaWYgKHBhZGxlbiA+IDApCiAJCWJsb2IgPSBkYXRhX2FwcGVuZF96ZXJvZXMoYmxvYiwgcGFkbGVuKTsKIAotCWZ3cml0ZShibG9iLnZhbCwgYmxvYi5sZW4sIDEsIGYpOwotCi0JaWYgKGZlcnJvcihmKSkKLQkJZGllKCJFcnJvciB3cml0aW5nIGRldmljZSB0cmVlIGJsb2I6ICVzXG4iLCBzdHJlcnJvcihlcnJubykpOworCWlmIChmd3JpdGUoYmxvYi52YWwsIGJsb2IubGVuLCAxLCBmKSAhPSAxKSB7CisJCWlmIChmZXJyb3IoZikpCisJCQlkaWUoIkVycm9yIHdyaXRpbmcgZGV2aWNlIHRyZWUgYmxvYjogJXNcbiIsCisJCQkgICAgc3RyZXJyb3IoZXJybm8pKTsKKwkJZWxzZQorCQkJZGllKCJTaG9ydCB3cml0ZSBvbiBkZXZpY2UgdHJlZSBibG9iXG4iKTsKKwl9CiAKIAkvKgogCSAqIGRhdGFfbWVyZ2UoKSBmcmVlcyB0aGUgcmlnaHQtaGFuZCBlbGVtZW50IHNvIG9ubHkgdGhlIGJsb2IKQEAgLTQ1NSwzOSArNDczLDQ0IEBACiAJCWRpZSgiVW5rbm93biBkZXZpY2UgdHJlZSBibG9iIHZlcnNpb24gJWRcbiIsIHZlcnNpb24pOwogCiAJZnByaW50ZihmLCAiLyogYXV0b2dlbmVyYXRlZCBieSBkdGMsIGRvIG5vdCBlZGl0ICovXG5cbiIpOwotCWZwcmludGYoZiwgIiNkZWZpbmUgRkRUX01BR0lDIDB4JXhcbiIsIEZEVF9NQUdJQyk7Ci0JZnByaW50ZihmLCAiI2RlZmluZSBGRFRfQkVHSU5fTk9ERSAweCV4XG4iLCBGRFRfQkVHSU5fTk9ERSk7Ci0JZnByaW50ZihmLCAiI2RlZmluZSBGRFRfRU5EX05PREUgMHgleFxuIiwgRkRUX0VORF9OT0RFKTsKLQlmcHJpbnRmKGYsICIjZGVmaW5lIEZEVF9QUk9QIDB4JXhcbiIsIEZEVF9QUk9QKTsKLQlmcHJpbnRmKGYsICIjZGVmaW5lIEZEVF9FTkQgMHgleFxuIiwgRkRUX0VORCk7Ci0JZnByaW50ZihmLCAiXG4iKTsKIAogCWVtaXRfbGFiZWwoZiwgc3ltcHJlZml4LCAiYmxvYl9zdGFydCIpOwogCWVtaXRfbGFiZWwoZiwgc3ltcHJlZml4LCAiaGVhZGVyIik7Ci0JZnByaW50ZihmLCAiXHQubG9uZ1x0RkRUX01BR0lDXHRcdFx0XHQvKiBtYWdpYyAqL1xuIik7Ci0JZnByaW50ZihmLCAiXHQubG9uZ1x0XyVzX2Jsb2JfYWJzX2VuZCAtIF8lc19ibG9iX3N0YXJ0XHQvKiB0b3RhbHNpemUgKi9cbiIsCi0JCXN5bXByZWZpeCwgc3ltcHJlZml4KTsKLQlmcHJpbnRmKGYsICJcdC5sb25nXHRfJXNfc3RydWN0X3N0YXJ0IC0gXyVzX2Jsb2Jfc3RhcnRcdC8qIG9mZl9kdF9zdHJ1Y3QgKi9cbiIsCi0JCXN5bXByZWZpeCwgc3ltcHJlZml4KTsKLQlmcHJpbnRmKGYsICJcdC5sb25nXHRfJXNfc3RyaW5nc19zdGFydCAtIF8lc19ibG9iX3N0YXJ0XHQvKiBvZmZfZHRfc3RyaW5ncyAqL1xuIiwKLQkJc3ltcHJlZml4LCBzeW1wcmVmaXgpOwotCWZwcmludGYoZiwgIlx0LmxvbmdcdF8lc19yZXNlcnZlX21hcCAtIF8lc19ibG9iX3N0YXJ0XHQvKiBvZmZfZHRfc3RyaW5ncyAqL1xuIiwKLQkJc3ltcHJlZml4LCBzeW1wcmVmaXgpOwotCWZwcmludGYoZiwgIlx0LmxvbmdcdCVkXHRcdFx0XHRcdC8qIHZlcnNpb24gKi9cbiIsIHZpLT52ZXJzaW9uKTsKLQlmcHJpbnRmKGYsICJcdC5sb25nXHQlZFx0XHRcdFx0XHQvKiBsYXN0X2NvbXBfdmVyc2lvbiAqL1xuIiwKLQkJdmktPmxhc3RfY29tcF92ZXJzaW9uKTsKLQotCWlmICh2aS0+ZmxhZ3MgJiBGVEZfQk9PVENQVUlEKQotCQlmcHJpbnRmKGYsICJcdC5sb25nXHQlaVx0XHRcdFx0XHQvKiBib290X2NwdWlkX3BoeXMgKi9cbiIsCi0JCQliaS0+Ym9vdF9jcHVpZF9waHlzKTsKLQotCWlmICh2aS0+ZmxhZ3MgJiBGVEZfU1RSVEFCU0laRSkKLQkJZnByaW50ZihmLCAiXHQubG9uZ1x0XyVzX3N0cmluZ3NfZW5kIC0gXyVzX3N0cmluZ3Nfc3RhcnRcdC8qIHNpemVfZHRfc3RyaW5ncyAqL1xuIiwKKwlmcHJpbnRmKGYsICJcdC8qIG1hZ2ljICovXG4iKTsKKwlhc21fZW1pdF9jZWxsKGYsIEZEVF9NQUdJQyk7CisJZnByaW50ZihmLCAiXHQvKiB0b3RhbHNpemUgKi9cbiIpOworCUFTTV9FTUlUX0JFTE9ORyhmLCAiXyVzX2Jsb2JfYWJzX2VuZCAtIF8lc19ibG9iX3N0YXJ0IiwKIAkJCXN5bXByZWZpeCwgc3ltcHJlZml4KTsKKwlmcHJpbnRmKGYsICJcdC8qIG9mZl9kdF9zdHJ1Y3QgKi9cbiIpOworCUFTTV9FTUlUX0JFTE9ORyhmLCAiXyVzX3N0cnVjdF9zdGFydCAtIF8lc19ibG9iX3N0YXJ0IiwKKwkJc3ltcHJlZml4LCBzeW1wcmVmaXgpOworCWZwcmludGYoZiwgIlx0Lyogb2ZmX2R0X3N0cmluZ3MgKi9cbiIpOworCUFTTV9FTUlUX0JFTE9ORyhmLCAiXyVzX3N0cmluZ3Nfc3RhcnQgLSBfJXNfYmxvYl9zdGFydCIsCisJCXN5bXByZWZpeCwgc3ltcHJlZml4KTsKKwlmcHJpbnRmKGYsICJcdC8qIG9mZl9tZW1fcnN2bWFwICovXG4iKTsKKwlBU01fRU1JVF9CRUxPTkcoZiwgIl8lc19yZXNlcnZlX21hcCAtIF8lc19ibG9iX3N0YXJ0IiwKKwkJc3ltcHJlZml4LCBzeW1wcmVmaXgpOworCWZwcmludGYoZiwgIlx0LyogdmVyc2lvbiAqL1xuIik7CisJYXNtX2VtaXRfY2VsbChmLCB2aS0+dmVyc2lvbik7CisJZnByaW50ZihmLCAiXHQvKiBsYXN0X2NvbXBfdmVyc2lvbiAqL1xuIik7CisJYXNtX2VtaXRfY2VsbChmLCB2aS0+bGFzdF9jb21wX3ZlcnNpb24pOwogCi0JaWYgKHZpLT5mbGFncyAmIEZURl9TVFJVQ1RTSVpFKQotCQlmcHJpbnRmKGYsICJcdC5sb25nXHRfJXNfc3RydWN0X2VuZCAtIF8lc19zdHJ1Y3Rfc3RhcnRcdC8qIHNpemVfZHRfc3RydWN0ICovXG4iLAorCWlmICh2aS0+ZmxhZ3MgJiBGVEZfQk9PVENQVUlEKSB7CisJCWZwcmludGYoZiwgIlx0LyogYm9vdF9jcHVpZF9waHlzICovXG4iKTsKKwkJYXNtX2VtaXRfY2VsbChmLCBiaS0+Ym9vdF9jcHVpZF9waHlzKTsKKwl9CisKKwlpZiAodmktPmZsYWdzICYgRlRGX1NUUlRBQlNJWkUpIHsKKwkJZnByaW50ZihmLCAiXHQvKiBzaXplX2R0X3N0cmluZ3MgKi9cbiIpOworCQlBU01fRU1JVF9CRUxPTkcoZiwgIl8lc19zdHJpbmdzX2VuZCAtIF8lc19zdHJpbmdzX3N0YXJ0IiwKKwkJCQlzeW1wcmVmaXgsIHN5bXByZWZpeCk7CisJfQorCisJaWYgKHZpLT5mbGFncyAmIEZURl9TVFJVQ1RTSVpFKSB7CisJCWZwcmludGYoZiwgIlx0Lyogc2l6ZV9kdF9zdHJ1Y3QgKi9cbiIpOworCQlBU01fRU1JVF9CRUxPTkcoZiwgIl8lc19zdHJ1Y3RfZW5kIC0gXyVzX3N0cnVjdF9zdGFydCIsCiAJCQlzeW1wcmVmaXgsIHN5bXByZWZpeCk7CisJfQogCiAJLyoKIAkgKiBSZXNlcnZlIG1hcCBlbnRyaWVzLgpAQCAtNTA1LDE2ICs1MjgsMTcgQEAKIAkgKiBhcyBpdCBhcHBlYXJzIC5xdWFkIGlzbid0IGF2YWlsYWJsZSBpbiBzb21lIGFzc2VtYmxlcnMuCiAJICovCiAJZm9yIChyZSA9IGJpLT5yZXNlcnZlbGlzdDsgcmU7IHJlID0gcmUtPm5leHQpIHsKLQkJaWYgKHJlLT5sYWJlbCkgewotCQkJZnByaW50ZihmLCAiXHQuZ2xvYmxcdCVzXG4iLCByZS0+bGFiZWwpOwotCQkJZnByaW50ZihmLCAiJXM6XG4iLCByZS0+bGFiZWwpOworCQlzdHJ1Y3QgbGFiZWwgKmw7CisKKwkJZm9yX2VhY2hfbGFiZWwocmUtPmxhYmVscywgbCkgeworCQkJZnByaW50ZihmLCAiXHQuZ2xvYmxcdCVzXG4iLCBsLT5sYWJlbCk7CisJCQlmcHJpbnRmKGYsICIlczpcbiIsIGwtPmxhYmVsKTsKIAkJfQotCQlmcHJpbnRmKGYsICJcdC5sb25nXHQweCUwOHgsIDB4JTA4eFxuIiwKLQkJCSh1bnNpZ25lZCBpbnQpKHJlLT5yZS5hZGRyZXNzID4+IDMyKSwKLQkJCSh1bnNpZ25lZCBpbnQpKHJlLT5yZS5hZGRyZXNzICYgMHhmZmZmZmZmZikpOwotCQlmcHJpbnRmKGYsICJcdC5sb25nXHQweCUwOHgsIDB4JTA4eFxuIiwKLQkJCSh1bnNpZ25lZCBpbnQpKHJlLT5yZS5zaXplID4+IDMyKSwKLQkJCSh1bnNpZ25lZCBpbnQpKHJlLT5yZS5zaXplICYgMHhmZmZmZmZmZikpOworCQlBU01fRU1JVF9CRUxPTkcoZiwgIjB4JTA4eCIsICh1bnNpZ25lZCBpbnQpKHJlLT5yZS5hZGRyZXNzID4+IDMyKSk7CisJCUFTTV9FTUlUX0JFTE9ORyhmLCAiMHglMDh4IiwKKwkJCQkodW5zaWduZWQgaW50KShyZS0+cmUuYWRkcmVzcyAmIDB4ZmZmZmZmZmYpKTsKKwkJQVNNX0VNSVRfQkVMT05HKGYsICIweCUwOHgiLCAodW5zaWduZWQgaW50KShyZS0+cmUuc2l6ZSA+PiAzMikpOworCQlBU01fRU1JVF9CRUxPTkcoZiwgIjB4JTA4eCIsICh1bnNpZ25lZCBpbnQpKHJlLT5yZS5zaXplICYgMHhmZmZmZmZmZikpOwogCX0KIAlmb3IgKGkgPSAwOyBpIDwgcmVzZXJ2ZW51bTsgaSsrKSB7CiAJCWZwcmludGYoZiwgIlx0LmxvbmdcdDAsIDBcblx0LmxvbmdcdDAsIDBcbiIpOwpAQCAtNTI0LDcgKzU0OCw5IEBACiAKIAllbWl0X2xhYmVsKGYsIHN5bXByZWZpeCwgInN0cnVjdF9zdGFydCIpOwogCWZsYXR0ZW5fdHJlZShiaS0+ZHQsICZhc21fZW1pdHRlciwgZiwgJnN0cmJ1ZiwgdmkpOwotCWZwcmludGYoZiwgIlx0LmxvbmdcdEZEVF9FTkRcbiIpOworCisJZnByaW50ZihmLCAiXHQvKiBGRFRfRU5EICovXG4iKTsKKwlhc21fZW1pdF9jZWxsKGYsIEZEVF9FTkQpOwogCWVtaXRfbGFiZWwoZiwgc3ltcHJlZml4LCAic3RydWN0X2VuZCIpOwogCiAJZW1pdF9sYWJlbChmLCBzeW1wcmVmaXgsICJzdHJpbmdzX3N0YXJ0Iik7CkBAIC02MDEsNyArNjI3LDcgQEAKIAkJbGVuKys7CiAJfSB3aGlsZSAoKCpwKyspICE9ICdcMCcpOwogCi0Jc3RyID0gc3RyZHVwKGluYi0+cHRyKTsKKwlzdHIgPSB4c3RyZHVwKGluYi0+cHRyKTsKIAogCWluYi0+cHRyICs9IGxlbjsKIApAQCAtNjQzLDcgKzY2OSw3IEBACiAJCXArKzsKIAl9CiAKLQlyZXR1cm4gc3RyZHVwKGluYi0+YmFzZSArIG9mZnNldCk7CisJcmV0dXJuIHhzdHJkdXAoaW5iLT5iYXNlICsgb2Zmc2V0KTsKIH0KIAogc3RhdGljIHN0cnVjdCBwcm9wZXJ0eSAqZmxhdF9yZWFkX3Byb3BlcnR5KHN0cnVjdCBpbmJ1ZiAqZHRidWYsCkBAIC02NjMsNyArNjg5LDcgQEAKIAogCXZhbCA9IGZsYXRfcmVhZF9kYXRhKGR0YnVmLCBwcm9wbGVuKTsKIAotCXJldHVybiBidWlsZF9wcm9wZXJ0eShuYW1lLCB2YWwsIE5VTEwpOworCXJldHVybiBidWlsZF9wcm9wZXJ0eShuYW1lLCB2YWwpOwogfQogCiAKQEAgLTY4OCw3ICs3MTQsNyBAQAogCQlpZiAocmUuc2l6ZSA9PSAwKQogCQkJYnJlYWs7CiAKLQkJbmV3ID0gYnVpbGRfcmVzZXJ2ZV9lbnRyeShyZS5hZGRyZXNzLCByZS5zaXplLCBOVUxMKTsKKwkJbmV3ID0gYnVpbGRfcmVzZXJ2ZV9lbnRyeShyZS5hZGRyZXNzLCByZS5zaXplKTsKIAkJcmVzZXJ2ZWxpc3QgPSBhZGRfcmVzZXJ2ZV9lbnRyeShyZXNlcnZlbGlzdCwgbmV3KTsKIAl9CiAKQEAgLTcxMCw3ICs3MzYsNyBAQAogCWlmICghc3RyZXEocHBhdGgsICIvIikpCiAJCXBsZW4rKzsKIAotCXJldHVybiBzdHJkdXAoY3BhdGggKyBwbGVuKTsKKwlyZXR1cm4geHN0cmR1cChjcGF0aCArIHBsZW4pOwogfQogCiBzdGF0aWMgc3RydWN0IG5vZGUgKnVuZmxhdHRlbl90cmVlKHN0cnVjdCBpbmJ1ZiAqZHRidWYsCkBAIC03NzYsNyArODAyLDcgQEAKIAogc3RydWN0IGJvb3RfaW5mbyAqZHRfZnJvbV9ibG9iKGNvbnN0IGNoYXIgKmZuYW1lKQogewotCXN0cnVjdCBkdGNfZmlsZSAqZHRjZjsKKwlGSUxFICpmOwogCXVpbnQzMl90IG1hZ2ljLCB0b3RhbHNpemUsIHZlcnNpb24sIHNpemVfZHQsIGJvb3RfY3B1aWRfcGh5czsKIAl1aW50MzJfdCBvZmZfZHQsIG9mZl9zdHIsIG9mZl9tZW1fcnN2bWFwOwogCWludCByYzsKQEAgLTc5MSwxNCArODE3LDE0IEBACiAJdWludDMyX3QgdmFsOwogCWludCBmbGFncyA9IDA7CiAKLQlkdGNmID0gZHRjX29wZW5fZmlsZShmbmFtZSwgTlVMTCk7CisJZiA9IHNyY2ZpbGVfcmVsYXRpdmVfb3BlbihmbmFtZSwgTlVMTCk7CiAKLQlyYyA9IGZyZWFkKCZtYWdpYywgc2l6ZW9mKG1hZ2ljKSwgMSwgZHRjZi0+ZmlsZSk7Ci0JaWYgKGZlcnJvcihkdGNmLT5maWxlKSkKKwlyYyA9IGZyZWFkKCZtYWdpYywgc2l6ZW9mKG1hZ2ljKSwgMSwgZik7CisJaWYgKGZlcnJvcihmKSkKIAkJZGllKCJFcnJvciByZWFkaW5nIERUIGJsb2IgbWFnaWMgbnVtYmVyOiAlc1xuIiwKIAkJICAgIHN0cmVycm9yKGVycm5vKSk7CiAJaWYgKHJjIDwgMSkgewotCQlpZiAoZmVvZihkdGNmLT5maWxlKSkKKwkJaWYgKGZlb2YoZikpCiAJCQlkaWUoIkVPRiByZWFkaW5nIERUIGJsb2IgbWFnaWMgbnVtYmVyXG4iKTsKIAkJZWxzZQogCQkJZGllKCJNeXN0ZXJpb3VzIHNob3J0IHJlYWQgcmVhZGluZyBtYWdpYyBudW1iZXJcbiIpOwpAQCAtODA4LDExICs4MzQsMTEgQEAKIAlpZiAobWFnaWMgIT0gRkRUX01BR0lDKQogCQlkaWUoIkJsb2IgaGFzIGluY29ycmVjdCBtYWdpYyBudW1iZXJcbiIpOwogCi0JcmMgPSBmcmVhZCgmdG90YWxzaXplLCBzaXplb2YodG90YWxzaXplKSwgMSwgZHRjZi0+ZmlsZSk7Ci0JaWYgKGZlcnJvcihkdGNmLT5maWxlKSkKKwlyYyA9IGZyZWFkKCZ0b3RhbHNpemUsIHNpemVvZih0b3RhbHNpemUpLCAxLCBmKTsKKwlpZiAoZmVycm9yKGYpKQogCQlkaWUoIkVycm9yIHJlYWRpbmcgRFQgYmxvYiBzaXplOiAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKTsKIAlpZiAocmMgPCAxKSB7Ci0JCWlmIChmZW9mKGR0Y2YtPmZpbGUpKQorCQlpZiAoZmVvZihmKSkKIAkJCWRpZSgiRU9GIHJlYWRpbmcgRFQgYmxvYiBzaXplXG4iKTsKIAkJZWxzZQogCQkJZGllKCJNeXN0ZXJpb3VzIHNob3J0IHJlYWQgcmVhZGluZyBibG9iIHNpemVcbiIpOwpAQCAtODMyLDEyICs4NTgsMTIgQEAKIAlwID0gYmxvYiArIHNpemVvZihtYWdpYykgICsgc2l6ZW9mKHRvdGFsc2l6ZSk7CiAKIAl3aGlsZSAoc2l6ZWxlZnQpIHsKLQkJaWYgKGZlb2YoZHRjZi0+ZmlsZSkpCisJCWlmIChmZW9mKGYpKQogCQkJZGllKCJFT0YgYmVmb3JlIHJlYWRpbmcgJWQgYnl0ZXMgb2YgRFQgYmxvYlxuIiwKIAkJCSAgICB0b3RhbHNpemUpOwogCi0JCXJjID0gZnJlYWQocCwgMSwgc2l6ZWxlZnQsIGR0Y2YtPmZpbGUpOwotCQlpZiAoZmVycm9yKGR0Y2YtPmZpbGUpKQorCQlyYyA9IGZyZWFkKHAsIDEsIHNpemVsZWZ0LCBmKTsKKwkJaWYgKGZlcnJvcihmKSkKIAkJCWRpZSgiRXJyb3IgcmVhZGluZyBEVCBibG9iOiAlc1xuIiwKIAkJCSAgICBzdHJlcnJvcihlcnJubykpOwogCkBAIC05MDAsNyArOTI2LDcgQEAKIAogCWZyZWUoYmxvYik7CiAKLQlkdGNfY2xvc2VfZmlsZShkdGNmKTsKKwlmY2xvc2UoZik7CiAKIAlyZXR1cm4gYnVpbGRfYm9vdF9pbmZvKHJlc2VydmVsaXN0LCB0cmVlLCBib290X2NwdWlkX3BoeXMpOwogfQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9kdGMvZnN0cmVlLmMgYi9zY3JpcHRzL2R0Yy9mc3RyZWUuYwppbmRleCA4ZmUxYmRmLi5mMzc3NDUzIDEwMDY0NAotLS0gYS9zY3JpcHRzL2R0Yy9mc3RyZWUuYworKysgYi9zY3JpcHRzL2R0Yy9mc3RyZWUuYwpAQCAtNTgsMTAgKzU4LDkgQEAKIAkJCQkJIldBUk5JTkc6IENhbm5vdCBvcGVuICVzOiAlc1xuIiwKIAkJCQkJdG1wbmFtLCBzdHJlcnJvcihlcnJubykpOwogCQkJfSBlbHNlIHsKLQkJCQlwcm9wID0gYnVpbGRfcHJvcGVydHkoc3RyZHVwKGRlLT5kX25hbWUpLAorCQkJCXByb3AgPSBidWlsZF9wcm9wZXJ0eSh4c3RyZHVwKGRlLT5kX25hbWUpLAogCQkJCQkJICAgICAgZGF0YV9jb3B5X2ZpbGUocGZpbGUsCi0JCQkJCQkJCSAgICAgc3Quc3Rfc2l6ZSksCi0JCQkJCQkgICAgICBOVUxMKTsKKwkJCQkJCQkJICAgICBzdC5zdF9zaXplKSk7CiAJCQkJYWRkX3Byb3BlcnR5KHRyZWUsIHByb3ApOwogCQkJCWZjbG9zZShwZmlsZSk7CiAJCQl9CkBAIC02OSw4ICs2OCw3IEBACiAJCQlzdHJ1Y3Qgbm9kZSAqbmV3Y2hpbGQ7CiAKIAkJCW5ld2NoaWxkID0gcmVhZF9mc3RyZWUodG1wbmFtKTsKLQkJCW5ld2NoaWxkID0gbmFtZV9ub2RlKG5ld2NoaWxkLCBzdHJkdXAoZGUtPmRfbmFtZSksCi0JCQkJCSAgICAgTlVMTCk7CisJCQluZXdjaGlsZCA9IG5hbWVfbm9kZShuZXdjaGlsZCwgeHN0cmR1cChkZS0+ZF9uYW1lKSk7CiAJCQlhZGRfY2hpbGQodHJlZSwgbmV3Y2hpbGQpOwogCQl9CiAKQEAgLTg2LDggKzg0LDggQEAKIAlzdHJ1Y3Qgbm9kZSAqdHJlZTsKIAogCXRyZWUgPSByZWFkX2ZzdHJlZShkaXJuYW1lKTsKLQl0cmVlID0gbmFtZV9ub2RlKHRyZWUsICIiLCBOVUxMKTsKKwl0cmVlID0gbmFtZV9ub2RlKHRyZWUsICIiKTsKIAotCXJldHVybiBidWlsZF9ib290X2luZm8oTlVMTCwgdHJlZSwgMCk7CisJcmV0dXJuIGJ1aWxkX2Jvb3RfaW5mbyhOVUxMLCB0cmVlLCBndWVzc19ib290X2NwdWlkKHRyZWUpKTsKIH0KIApkaWZmIC0tZ2l0IGEvc2NyaXB0cy9kdGMvbGl2ZXRyZWUuYyBiL3NjcmlwdHMvZHRjL2xpdmV0cmVlLmMKaW5kZXggMGNhM2RlNS4uYzkyMDlkNSAxMDA2NDQKLS0tIGEvc2NyaXB0cy9kdGMvbGl2ZXRyZWUuYworKysgYi9zY3JpcHRzL2R0Yy9saXZldHJlZS5jCkBAIC0yNCwxNyArMjQsMzAgQEAKICAqIFRyZWUgYnVpbGRpbmcgZnVuY3Rpb25zCiAgKi8KIAotc3RydWN0IHByb3BlcnR5ICpidWlsZF9wcm9wZXJ0eShjaGFyICpuYW1lLCBzdHJ1Y3QgZGF0YSB2YWwsIGNoYXIgKmxhYmVsKQordm9pZCBhZGRfbGFiZWwoc3RydWN0IGxhYmVsICoqbGFiZWxzLCBjaGFyICpsYWJlbCkKK3sKKwlzdHJ1Y3QgbGFiZWwgKm5ldzsKKworCS8qIE1ha2Ugc3VyZSB0aGUgbGFiZWwgaXNuJ3QgYWxyZWFkeSB0aGVyZSAqLworCWZvcl9lYWNoX2xhYmVsKCpsYWJlbHMsIG5ldykKKwkJaWYgKHN0cmVxKG5ldy0+bGFiZWwsIGxhYmVsKSkKKwkJCXJldHVybjsKKworCW5ldyA9IHhtYWxsb2Moc2l6ZW9mKCpuZXcpKTsKKwluZXctPmxhYmVsID0gbGFiZWw7CisJbmV3LT5uZXh0ID0gKmxhYmVsczsKKwkqbGFiZWxzID0gbmV3OworfQorCitzdHJ1Y3QgcHJvcGVydHkgKmJ1aWxkX3Byb3BlcnR5KGNoYXIgKm5hbWUsIHN0cnVjdCBkYXRhIHZhbCkKIHsKIAlzdHJ1Y3QgcHJvcGVydHkgKm5ldyA9IHhtYWxsb2Moc2l6ZW9mKCpuZXcpKTsKIAorCW1lbXNldChuZXcsIDAsIHNpemVvZigqbmV3KSk7CisKIAluZXctPm5hbWUgPSBuYW1lOwogCW5ldy0+dmFsID0gdmFsOwogCi0JbmV3LT5uZXh0ID0gTlVMTDsKLQotCW5ldy0+bGFiZWwgPSBsYWJlbDsKLQogCXJldHVybiBuZXc7CiB9CiAKQEAgLTc4LDE3ICs5MSw4MiBAQAogCXJldHVybiBuZXc7CiB9CiAKLXN0cnVjdCBub2RlICpuYW1lX25vZGUoc3RydWN0IG5vZGUgKm5vZGUsIGNoYXIgKm5hbWUsIGNoYXIgKiBsYWJlbCkKK3N0cnVjdCBub2RlICpuYW1lX25vZGUoc3RydWN0IG5vZGUgKm5vZGUsIGNoYXIgKm5hbWUpCiB7CiAJYXNzZXJ0KG5vZGUtPm5hbWUgPT0gTlVMTCk7CiAKIAlub2RlLT5uYW1lID0gbmFtZTsKIAotCW5vZGUtPmxhYmVsID0gbGFiZWw7Ci0KIAlyZXR1cm4gbm9kZTsKIH0KIAorc3RydWN0IG5vZGUgKm1lcmdlX25vZGVzKHN0cnVjdCBub2RlICpvbGRfbm9kZSwgc3RydWN0IG5vZGUgKm5ld19ub2RlKQoreworCXN0cnVjdCBwcm9wZXJ0eSAqbmV3X3Byb3AsICpvbGRfcHJvcDsKKwlzdHJ1Y3Qgbm9kZSAqbmV3X2NoaWxkLCAqb2xkX2NoaWxkOworCXN0cnVjdCBsYWJlbCAqbDsKKworCS8qIEFkZCBuZXcgbm9kZSBsYWJlbHMgdG8gb2xkIG5vZGUgKi8KKwlmb3JfZWFjaF9sYWJlbChuZXdfbm9kZS0+bGFiZWxzLCBsKQorCQlhZGRfbGFiZWwoJm9sZF9ub2RlLT5sYWJlbHMsIGwtPmxhYmVsKTsKKworCS8qIE1vdmUgcHJvcGVydGllcyBmcm9tIHRoZSBuZXcgbm9kZSB0byB0aGUgb2xkIG5vZGUuICBJZiB0aGVyZQorCSAqIGlzIGEgY29sbGlzaW9uLCByZXBsYWNlIHRoZSBvbGQgdmFsdWUgd2l0aCB0aGUgbmV3ICovCisJd2hpbGUgKG5ld19ub2RlLT5wcm9wbGlzdCkgeworCQkvKiBQb3AgdGhlIHByb3BlcnR5IG9mZiB0aGUgbGlzdCAqLworCQluZXdfcHJvcCA9IG5ld19ub2RlLT5wcm9wbGlzdDsKKwkJbmV3X25vZGUtPnByb3BsaXN0ID0gbmV3X3Byb3AtPm5leHQ7CisJCW5ld19wcm9wLT5uZXh0ID0gTlVMTDsKKworCQkvKiBMb29rIGZvciBhIGNvbGxpc2lvbiwgc2V0IG5ldyB2YWx1ZSBpZiB0aGVyZSBpcyAqLworCQlmb3JfZWFjaF9wcm9wZXJ0eShvbGRfbm9kZSwgb2xkX3Byb3ApIHsKKwkJCWlmIChzdHJlcShvbGRfcHJvcC0+bmFtZSwgbmV3X3Byb3AtPm5hbWUpKSB7CisJCQkJLyogQWRkIG5ldyBsYWJlbHMgdG8gb2xkIHByb3BlcnR5ICovCisJCQkJZm9yX2VhY2hfbGFiZWwobmV3X3Byb3AtPmxhYmVscywgbCkKKwkJCQkJYWRkX2xhYmVsKCZvbGRfcHJvcC0+bGFiZWxzLCBsLT5sYWJlbCk7CisKKwkJCQlvbGRfcHJvcC0+dmFsID0gbmV3X3Byb3AtPnZhbDsKKwkJCQlmcmVlKG5ld19wcm9wKTsKKwkJCQluZXdfcHJvcCA9IE5VTEw7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQkvKiBpZiBubyBjb2xsaXNpb24gb2NjdXJyZWQsIGFkZCBwcm9wZXJ0eSB0byB0aGUgb2xkIG5vZGUuICovCisJCWlmIChuZXdfcHJvcCkKKwkJCWFkZF9wcm9wZXJ0eShvbGRfbm9kZSwgbmV3X3Byb3ApOworCX0KKworCS8qIE1vdmUgdGhlIG92ZXJyaWRlIGNoaWxkIG5vZGVzIGludG8gdGhlIHByaW1hcnkgbm9kZS4gIElmCisJICogdGhlcmUgaXMgYSBjb2xsaXNpb24sIHRoZW4gbWVyZ2UgdGhlIG5vZGVzLiAqLworCXdoaWxlIChuZXdfbm9kZS0+Y2hpbGRyZW4pIHsKKwkJLyogUG9wIHRoZSBjaGlsZCBub2RlIG9mZiB0aGUgbGlzdCAqLworCQluZXdfY2hpbGQgPSBuZXdfbm9kZS0+Y2hpbGRyZW47CisJCW5ld19ub2RlLT5jaGlsZHJlbiA9IG5ld19jaGlsZC0+bmV4dF9zaWJsaW5nOworCQluZXdfY2hpbGQtPnBhcmVudCA9IE5VTEw7CisJCW5ld19jaGlsZC0+bmV4dF9zaWJsaW5nID0gTlVMTDsKKworCQkvKiBTZWFyY2ggZm9yIGEgY29sbGlzaW9uLiAgTWVyZ2UgaWYgdGhlcmUgaXMgKi8KKwkJZm9yX2VhY2hfY2hpbGQob2xkX25vZGUsIG9sZF9jaGlsZCkgeworCQkJaWYgKHN0cmVxKG9sZF9jaGlsZC0+bmFtZSwgbmV3X2NoaWxkLT5uYW1lKSkgeworCQkJCW1lcmdlX25vZGVzKG9sZF9jaGlsZCwgbmV3X2NoaWxkKTsKKwkJCQluZXdfY2hpbGQgPSBOVUxMOworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJLyogaWYgbm8gY29sbGlzaW9uIG9jY3VyZWQsIGFkZCBjaGlsZCB0byB0aGUgb2xkIG5vZGUuICovCisJCWlmIChuZXdfY2hpbGQpCisJCQlhZGRfY2hpbGQob2xkX25vZGUsIG5ld19jaGlsZCk7CisJfQorCisJLyogVGhlIG5ldyBub2RlIGNvbnRlbnRzIGFyZSBub3cgbWVyZ2VkIGludG8gdGhlIG9sZCBub2RlLiAgRnJlZQorCSAqIHRoZSBuZXcgbm9kZS4gKi8KKwlmcmVlKG5ld19ub2RlKTsKKworCXJldHVybiBvbGRfbm9kZTsKK30KKwogc3RydWN0IG5vZGUgKmNoYWluX25vZGUoc3RydWN0IG5vZGUgKmZpcnN0LCBzdHJ1Y3Qgbm9kZSAqbGlzdCkKIHsKIAlhc3NlcnQoZmlyc3QtPm5leHRfc2libGluZyA9PSBOVUxMKTsKQEAgLTEyNCwxOCArMjAyLDE1IEBACiAJKnAgPSBjaGlsZDsKIH0KIAotc3RydWN0IHJlc2VydmVfaW5mbyAqYnVpbGRfcmVzZXJ2ZV9lbnRyeSh1aW50NjRfdCBhZGRyZXNzLCB1aW50NjRfdCBzaXplLAotCQkJCQkgY2hhciAqbGFiZWwpCitzdHJ1Y3QgcmVzZXJ2ZV9pbmZvICpidWlsZF9yZXNlcnZlX2VudHJ5KHVpbnQ2NF90IGFkZHJlc3MsIHVpbnQ2NF90IHNpemUpCiB7CiAJc3RydWN0IHJlc2VydmVfaW5mbyAqbmV3ID0geG1hbGxvYyhzaXplb2YoKm5ldykpOwogCisJbWVtc2V0KG5ldywgMCwgc2l6ZW9mKCpuZXcpKTsKKwogCW5ldy0+cmUuYWRkcmVzcyA9IGFkZHJlc3M7CiAJbmV3LT5yZS5zaXplID0gc2l6ZTsKIAotCW5ldy0+bmV4dCA9IE5VTEw7Ci0KLQluZXctPmxhYmVsID0gbGFiZWw7Ci0KIAlyZXR1cm4gbmV3OwogfQogCkBAIC0yMDgsNiArMjgzLDYwIEBACiAJcmV0dXJuIGZkdDMyX3RvX2NwdSgqKChjZWxsX3QgKilwcm9wLT52YWwudmFsKSk7CiB9CiAKK3N0cnVjdCBwcm9wZXJ0eSAqZ2V0X3Byb3BlcnR5X2J5X2xhYmVsKHN0cnVjdCBub2RlICp0cmVlLCBjb25zdCBjaGFyICpsYWJlbCwKKwkJCQkgICAgICAgc3RydWN0IG5vZGUgKipub2RlKQoreworCXN0cnVjdCBwcm9wZXJ0eSAqcHJvcDsKKwlzdHJ1Y3Qgbm9kZSAqYzsKKworCSpub2RlID0gdHJlZTsKKworCWZvcl9lYWNoX3Byb3BlcnR5KHRyZWUsIHByb3ApIHsKKwkJc3RydWN0IGxhYmVsICpsOworCisJCWZvcl9lYWNoX2xhYmVsKHByb3AtPmxhYmVscywgbCkKKwkJCWlmIChzdHJlcShsLT5sYWJlbCwgbGFiZWwpKQorCQkJCXJldHVybiBwcm9wOworCX0KKworCWZvcl9lYWNoX2NoaWxkKHRyZWUsIGMpIHsKKwkJcHJvcCA9IGdldF9wcm9wZXJ0eV9ieV9sYWJlbChjLCBsYWJlbCwgbm9kZSk7CisJCWlmIChwcm9wKQorCQkJcmV0dXJuIHByb3A7CisJfQorCisJKm5vZGUgPSBOVUxMOworCXJldHVybiBOVUxMOworfQorCitzdHJ1Y3QgbWFya2VyICpnZXRfbWFya2VyX2xhYmVsKHN0cnVjdCBub2RlICp0cmVlLCBjb25zdCBjaGFyICpsYWJlbCwKKwkJCQlzdHJ1Y3Qgbm9kZSAqKm5vZGUsIHN0cnVjdCBwcm9wZXJ0eSAqKnByb3ApCit7CisJc3RydWN0IG1hcmtlciAqbTsKKwlzdHJ1Y3QgcHJvcGVydHkgKnA7CisJc3RydWN0IG5vZGUgKmM7CisKKwkqbm9kZSA9IHRyZWU7CisKKwlmb3JfZWFjaF9wcm9wZXJ0eSh0cmVlLCBwKSB7CisJCSpwcm9wID0gcDsKKwkJbSA9IHAtPnZhbC5tYXJrZXJzOworCQlmb3JfZWFjaF9tYXJrZXJfb2ZfdHlwZShtLCBMQUJFTCkKKwkJCWlmIChzdHJlcShtLT5yZWYsIGxhYmVsKSkKKwkJCQlyZXR1cm4gbTsKKwl9CisKKwlmb3JfZWFjaF9jaGlsZCh0cmVlLCBjKSB7CisJCW0gPSBnZXRfbWFya2VyX2xhYmVsKGMsIGxhYmVsLCBub2RlLCBwcm9wKTsKKwkJaWYgKG0pCisJCQlyZXR1cm4gbTsKKwl9CisKKwkqcHJvcCA9IE5VTEw7CisJKm5vZGUgPSBOVUxMOworCXJldHVybiBOVUxMOworfQorCiBzdHJ1Y3Qgbm9kZSAqZ2V0X3N1Ym5vZGUoc3RydWN0IG5vZGUgKm5vZGUsIGNvbnN0IGNoYXIgKm5vZGVuYW1lKQogewogCXN0cnVjdCBub2RlICpjaGlsZDsKQEAgLTI0NSwxMSArMzc0LDEzIEBACiBzdHJ1Y3Qgbm9kZSAqZ2V0X25vZGVfYnlfbGFiZWwoc3RydWN0IG5vZGUgKnRyZWUsIGNvbnN0IGNoYXIgKmxhYmVsKQogewogCXN0cnVjdCBub2RlICpjaGlsZCwgKm5vZGU7CisJc3RydWN0IGxhYmVsICpsOwogCiAJYXNzZXJ0KGxhYmVsICYmIChzdHJsZW4obGFiZWwpID4gMCkpOwogCi0JaWYgKHRyZWUtPmxhYmVsICYmIHN0cmVxKHRyZWUtPmxhYmVsLCBsYWJlbCkpCi0JCXJldHVybiB0cmVlOworCWZvcl9lYWNoX2xhYmVsKHRyZWUtPmxhYmVscywgbCkKKwkJaWYgKHN0cmVxKGwtPmxhYmVsLCBsYWJlbCkpCisJCQlyZXR1cm4gdHJlZTsKIAogCWZvcl9lYWNoX2NoaWxkKHRyZWUsIGNoaWxkKSB7CiAJCW5vZGUgPSBnZXRfbm9kZV9ieV9sYWJlbChjaGlsZCwgbGFiZWwpOwpAQCAtMjkzLDE2ICs0MjQsMTg2IEBACiAJaWYgKChub2RlLT5waGFuZGxlICE9IDApICYmIChub2RlLT5waGFuZGxlICE9IC0xKSkKIAkJcmV0dXJuIG5vZGUtPnBoYW5kbGU7CiAKLQlhc3NlcnQoISBnZXRfcHJvcGVydHkobm9kZSwgImxpbnV4LHBoYW5kbGUiKSk7Ci0KIAl3aGlsZSAoZ2V0X25vZGVfYnlfcGhhbmRsZShyb290LCBwaGFuZGxlKSkKIAkJcGhhbmRsZSsrOwogCiAJbm9kZS0+cGhhbmRsZSA9IHBoYW5kbGU7Ci0JYWRkX3Byb3BlcnR5KG5vZGUsCi0JCSAgICAgYnVpbGRfcHJvcGVydHkoImxpbnV4LHBoYW5kbGUiLAotCQkJCSAgICBkYXRhX2FwcGVuZF9jZWxsKGVtcHR5X2RhdGEsIHBoYW5kbGUpLAotCQkJCSAgICBOVUxMKSk7CisKKwlpZiAoIWdldF9wcm9wZXJ0eShub2RlLCAibGludXgscGhhbmRsZSIpCisJICAgICYmIChwaGFuZGxlX2Zvcm1hdCAmIFBIQU5ETEVfTEVHQUNZKSkKKwkJYWRkX3Byb3BlcnR5KG5vZGUsCisJCQkgICAgIGJ1aWxkX3Byb3BlcnR5KCJsaW51eCxwaGFuZGxlIiwKKwkJCQkJICAgIGRhdGFfYXBwZW5kX2NlbGwoZW1wdHlfZGF0YSwgcGhhbmRsZSkpKTsKKworCWlmICghZ2V0X3Byb3BlcnR5KG5vZGUsICJwaGFuZGxlIikKKwkgICAgJiYgKHBoYW5kbGVfZm9ybWF0ICYgUEhBTkRMRV9FUEFQUikpCisJCWFkZF9wcm9wZXJ0eShub2RlLAorCQkJICAgICBidWlsZF9wcm9wZXJ0eSgicGhhbmRsZSIsCisJCQkJCSAgICBkYXRhX2FwcGVuZF9jZWxsKGVtcHR5X2RhdGEsIHBoYW5kbGUpKSk7CisKKwkvKiBJZiB0aGUgbm9kZSAqZG9lcyogaGF2ZSBhIHBoYW5kbGUgcHJvcGVydHksIHdlIG11c3QKKwkgKiBiZSBkZWFsaW5nIHdpdGggYSBzZWxmLXJlZmVyZW5jaW5nIHBoYW5kbGUsIHdoaWNoIHdpbGwgYmUKKwkgKiBmaXhlZCB1cCBtb21lbnRhcmlseSBpbiB0aGUgY2FsbGVyICovCiAKIAlyZXR1cm4gbm9kZS0+cGhhbmRsZTsKIH0KKwordWludDMyX3QgZ3Vlc3NfYm9vdF9jcHVpZChzdHJ1Y3Qgbm9kZSAqdHJlZSkKK3sKKwlzdHJ1Y3Qgbm9kZSAqY3B1cywgKmJvb3RjcHU7CisJc3RydWN0IHByb3BlcnR5ICpyZWc7CisKKwljcHVzID0gZ2V0X25vZGVfYnlfcGF0aCh0cmVlLCAiL2NwdXMiKTsKKwlpZiAoIWNwdXMpCisJCXJldHVybiAwOworCisKKwlib290Y3B1ID0gY3B1cy0+Y2hpbGRyZW47CisJaWYgKCFib290Y3B1KQorCQlyZXR1cm4gMDsKKworCXJlZyA9IGdldF9wcm9wZXJ0eShib290Y3B1LCAicmVnIik7CisJaWYgKCFyZWcgfHwgKHJlZy0+dmFsLmxlbiAhPSBzaXplb2YodWludDMyX3QpKSkKKwkJcmV0dXJuIDA7CisKKwkvKiBGSVhNRTogU2FuaXR5IGNoZWNrIG5vZGU/ICovCisKKwlyZXR1cm4gcHJvcHZhbF9jZWxsKHJlZyk7Cit9CisKK3N0YXRpYyBpbnQgY21wX3Jlc2VydmVfaW5mbyhjb25zdCB2b2lkICpheCwgY29uc3Qgdm9pZCAqYngpCit7CisJY29uc3Qgc3RydWN0IHJlc2VydmVfaW5mbyAqYSwgKmI7CisKKwlhID0gKigoY29uc3Qgc3RydWN0IHJlc2VydmVfaW5mbyAqIGNvbnN0ICopYXgpOworCWIgPSAqKChjb25zdCBzdHJ1Y3QgcmVzZXJ2ZV9pbmZvICogY29uc3QgKilieCk7CisKKwlpZiAoYS0+cmUuYWRkcmVzcyA8IGItPnJlLmFkZHJlc3MpCisJCXJldHVybiAtMTsKKwllbHNlIGlmIChhLT5yZS5hZGRyZXNzID4gYi0+cmUuYWRkcmVzcykKKwkJcmV0dXJuIDE7CisJZWxzZSBpZiAoYS0+cmUuc2l6ZSA8IGItPnJlLnNpemUpCisJCXJldHVybiAtMTsKKwllbHNlIGlmIChhLT5yZS5zaXplID4gYi0+cmUuc2l6ZSkKKwkJcmV0dXJuIDE7CisJZWxzZQorCQlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc29ydF9yZXNlcnZlX2VudHJpZXMoc3RydWN0IGJvb3RfaW5mbyAqYmkpCit7CisJc3RydWN0IHJlc2VydmVfaW5mbyAqcmksICoqdGJsOworCWludCBuID0gMCwgaSA9IDA7CisKKwlmb3IgKHJpID0gYmktPnJlc2VydmVsaXN0OworCSAgICAgcmk7CisJICAgICByaSA9IHJpLT5uZXh0KQorCQluKys7CisKKwlpZiAobiA9PSAwKQorCQlyZXR1cm47CisKKwl0YmwgPSB4bWFsbG9jKG4gKiBzaXplb2YoKnRibCkpOworCisJZm9yIChyaSA9IGJpLT5yZXNlcnZlbGlzdDsKKwkgICAgIHJpOworCSAgICAgcmkgPSByaS0+bmV4dCkKKwkJdGJsW2krK10gPSByaTsKKworCXFzb3J0KHRibCwgbiwgc2l6ZW9mKCp0YmwpLCBjbXBfcmVzZXJ2ZV9pbmZvKTsKKworCWJpLT5yZXNlcnZlbGlzdCA9IHRibFswXTsKKwlmb3IgKGkgPSAwOyBpIDwgKG4tMSk7IGkrKykKKwkJdGJsW2ldLT5uZXh0ID0gdGJsW2krMV07CisJdGJsW24tMV0tPm5leHQgPSBOVUxMOworCisJZnJlZSh0YmwpOworfQorCitzdGF0aWMgaW50IGNtcF9wcm9wKGNvbnN0IHZvaWQgKmF4LCBjb25zdCB2b2lkICpieCkKK3sKKwljb25zdCBzdHJ1Y3QgcHJvcGVydHkgKmEsICpiOworCisJYSA9ICooKGNvbnN0IHN0cnVjdCBwcm9wZXJ0eSAqIGNvbnN0ICopYXgpOworCWIgPSAqKChjb25zdCBzdHJ1Y3QgcHJvcGVydHkgKiBjb25zdCAqKWJ4KTsKKworCXJldHVybiBzdHJjbXAoYS0+bmFtZSwgYi0+bmFtZSk7Cit9CisKK3N0YXRpYyB2b2lkIHNvcnRfcHJvcGVydGllcyhzdHJ1Y3Qgbm9kZSAqbm9kZSkKK3sKKwlpbnQgbiA9IDAsIGkgPSAwOworCXN0cnVjdCBwcm9wZXJ0eSAqcHJvcCwgKip0Ymw7CisKKwlmb3JfZWFjaF9wcm9wZXJ0eShub2RlLCBwcm9wKQorCQluKys7CisKKwlpZiAobiA9PSAwKQorCQlyZXR1cm47CisKKwl0YmwgPSB4bWFsbG9jKG4gKiBzaXplb2YoKnRibCkpOworCisJZm9yX2VhY2hfcHJvcGVydHkobm9kZSwgcHJvcCkKKwkJdGJsW2krK10gPSBwcm9wOworCisJcXNvcnQodGJsLCBuLCBzaXplb2YoKnRibCksIGNtcF9wcm9wKTsKKworCW5vZGUtPnByb3BsaXN0ID0gdGJsWzBdOworCWZvciAoaSA9IDA7IGkgPCAobi0xKTsgaSsrKQorCQl0YmxbaV0tPm5leHQgPSB0YmxbaSsxXTsKKwl0Ymxbbi0xXS0+bmV4dCA9IE5VTEw7CisKKwlmcmVlKHRibCk7Cit9CisKK3N0YXRpYyBpbnQgY21wX3N1Ym5vZGUoY29uc3Qgdm9pZCAqYXgsIGNvbnN0IHZvaWQgKmJ4KQoreworCWNvbnN0IHN0cnVjdCBub2RlICphLCAqYjsKKworCWEgPSAqKChjb25zdCBzdHJ1Y3Qgbm9kZSAqIGNvbnN0ICopYXgpOworCWIgPSAqKChjb25zdCBzdHJ1Y3Qgbm9kZSAqIGNvbnN0ICopYngpOworCisJcmV0dXJuIHN0cmNtcChhLT5uYW1lLCBiLT5uYW1lKTsKK30KKworc3RhdGljIHZvaWQgc29ydF9zdWJub2RlcyhzdHJ1Y3Qgbm9kZSAqbm9kZSkKK3sKKwlpbnQgbiA9IDAsIGkgPSAwOworCXN0cnVjdCBub2RlICpzdWJub2RlLCAqKnRibDsKKworCWZvcl9lYWNoX2NoaWxkKG5vZGUsIHN1Ym5vZGUpCisJCW4rKzsKKworCWlmIChuID09IDApCisJCXJldHVybjsKKworCXRibCA9IHhtYWxsb2MobiAqIHNpemVvZigqdGJsKSk7CisKKwlmb3JfZWFjaF9jaGlsZChub2RlLCBzdWJub2RlKQorCQl0YmxbaSsrXSA9IHN1Ym5vZGU7CisKKwlxc29ydCh0YmwsIG4sIHNpemVvZigqdGJsKSwgY21wX3N1Ym5vZGUpOworCisJbm9kZS0+Y2hpbGRyZW4gPSB0YmxbMF07CisJZm9yIChpID0gMDsgaSA8IChuLTEpOyBpKyspCisJCXRibFtpXS0+bmV4dF9zaWJsaW5nID0gdGJsW2krMV07CisJdGJsW24tMV0tPm5leHRfc2libGluZyA9IE5VTEw7CisKKwlmcmVlKHRibCk7Cit9CisKK3N0YXRpYyB2b2lkIHNvcnRfbm9kZShzdHJ1Y3Qgbm9kZSAqbm9kZSkKK3sKKwlzdHJ1Y3Qgbm9kZSAqYzsKKworCXNvcnRfcHJvcGVydGllcyhub2RlKTsKKwlzb3J0X3N1Ym5vZGVzKG5vZGUpOworCWZvcl9lYWNoX2NoaWxkKG5vZGUsIGMpCisJCXNvcnRfbm9kZShjKTsKK30KKwordm9pZCBzb3J0X3RyZWUoc3RydWN0IGJvb3RfaW5mbyAqYmkpCit7CisJc29ydF9yZXNlcnZlX2VudHJpZXMoYmkpOworCXNvcnRfbm9kZShiaS0+ZHQpOworfQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9kdGMvc3JjcG9zLmMgYi9zY3JpcHRzL2R0Yy9zcmNwb3MuYwppbmRleCA5NjQxYjc2Li4yZGJjODc0IDEwMDY0NAotLS0gYS9zY3JpcHRzL2R0Yy9zcmNwb3MuYworKysgYi9zY3JpcHRzL2R0Yy9zcmNwb3MuYwpAQCAtMTcsMTAwICsxNywyMzIgQEAKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTQQogICovCiAKKyNkZWZpbmUgX0dOVV9TT1VSQ0UKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKICNpbmNsdWRlICJkdGMuaCIKICNpbmNsdWRlICJzcmNwb3MuaCIKIAotLyoKLSAqIExpa2UgeXlsaW5lbm8sIHRoaXMgaXMgdGhlIGN1cnJlbnQgb3BlbiBmaWxlIHBvcy4KLSAqLwogCi1zdHJ1Y3QgZHRjX2ZpbGUgKnNyY3Bvc19maWxlOwotCi1zdGF0aWMgaW50IGR0Y19vcGVuX29uZShzdHJ1Y3QgZHRjX2ZpbGUgKmZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpzZWFyY2gsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmbmFtZSkKK3N0YXRpYyBjaGFyICpkaXJuYW1lKGNvbnN0IGNoYXIgKnBhdGgpCiB7CisJY29uc3QgY2hhciAqc2xhc2ggPSBzdHJyY2hyKHBhdGgsICcvJyk7CisKKwlpZiAoc2xhc2gpIHsKKwkJaW50IGxlbiA9IHNsYXNoIC0gcGF0aDsKKwkJY2hhciAqZGlyID0geG1hbGxvYyhsZW4gKyAxKTsKKworCQltZW1jcHkoZGlyLCBwYXRoLCBsZW4pOworCQlkaXJbbGVuXSA9ICdcMCc7CisJCXJldHVybiBkaXI7CisJfQorCXJldHVybiBOVUxMOworfQorCitzdHJ1Y3Qgc3JjZmlsZV9zdGF0ZSAqY3VycmVudF9zcmNmaWxlOyAvKiA9IE5VTEwgKi8KKworLyogRGV0ZWN0IGluZmluaXRlIGluY2x1ZGUgcmVjdXJzaW9uLiAqLworI2RlZmluZSBNQVhfU1JDRklMRV9ERVBUSCAgICAgKDEwMCkKK3N0YXRpYyBpbnQgc3JjZmlsZV9kZXB0aDsgLyogPSAwICovCisKK0ZJTEUgKnNyY2ZpbGVfcmVsYXRpdmVfb3Blbihjb25zdCBjaGFyICpmbmFtZSwgY2hhciAqKmZ1bGxuYW1lcCkKK3sKKwlGSUxFICpmOwogCWNoYXIgKmZ1bGxuYW1lOwogCi0JaWYgKHNlYXJjaCkgewotCQlmdWxsbmFtZSA9IHhtYWxsb2Moc3RybGVuKHNlYXJjaCkgKyBzdHJsZW4oZm5hbWUpICsgMik7Ci0KLQkJc3RyY3B5KGZ1bGxuYW1lLCBzZWFyY2gpOwotCQlzdHJjYXQoZnVsbG5hbWUsICIvIik7Ci0JCXN0cmNhdChmdWxsbmFtZSwgZm5hbWUpOwotCX0gZWxzZSB7Ci0JCWZ1bGxuYW1lID0gc3RyZHVwKGZuYW1lKTsKLQl9Ci0KLQlmaWxlLT5maWxlID0gZm9wZW4oZnVsbG5hbWUsICJyIik7Ci0JaWYgKCFmaWxlLT5maWxlKSB7Ci0JCWZyZWUoZnVsbG5hbWUpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlmaWxlLT5uYW1lID0gZnVsbG5hbWU7Ci0JcmV0dXJuIDE7Ci19Ci0KLQotc3RydWN0IGR0Y19maWxlICpkdGNfb3Blbl9maWxlKGNvbnN0IGNoYXIgKmZuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBzZWFyY2hfcGF0aCAqc2VhcmNoKQotewotCXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2VhcmNoX3BhdGggZGVmYXVsdF9zZWFyY2ggPSB7IE5VTEwsIE5VTEwsIE5VTEwgfTsKLQotCXN0cnVjdCBkdGNfZmlsZSAqZmlsZTsKLQljb25zdCBjaGFyICpzbGFzaDsKLQotCWZpbGUgPSB4bWFsbG9jKHNpemVvZihzdHJ1Y3QgZHRjX2ZpbGUpKTsKLQotCXNsYXNoID0gc3RycmNocihmbmFtZSwgJy8nKTsKLQlpZiAoc2xhc2gpIHsKLQkJY2hhciAqZGlyID0geG1hbGxvYyhzbGFzaCAtIGZuYW1lICsgMSk7Ci0KLQkJbWVtY3B5KGRpciwgZm5hbWUsIHNsYXNoIC0gZm5hbWUpOwotCQlkaXJbc2xhc2ggLSBmbmFtZV0gPSAwOwotCQlmaWxlLT5kaXIgPSBkaXI7Ci0JfSBlbHNlIHsKLQkJZmlsZS0+ZGlyID0gTlVMTDsKLQl9Ci0KIAlpZiAoc3RyZXEoZm5hbWUsICItIikpIHsKLQkJZmlsZS0+bmFtZSA9ICJzdGRpbiI7Ci0JCWZpbGUtPmZpbGUgPSBzdGRpbjsKLQkJcmV0dXJuIGZpbGU7CisJCWYgPSBzdGRpbjsKKwkJZnVsbG5hbWUgPSB4c3RyZHVwKCI8c3RkaW4+Iik7CisJfSBlbHNlIHsKKwkJaWYgKCFjdXJyZW50X3NyY2ZpbGUgfHwgIWN1cnJlbnRfc3JjZmlsZS0+ZGlyCisJCSAgICB8fCAoZm5hbWVbMF0gPT0gJy8nKSkKKwkJCWZ1bGxuYW1lID0geHN0cmR1cChmbmFtZSk7CisJCWVsc2UKKwkJCWZ1bGxuYW1lID0gam9pbl9wYXRoKGN1cnJlbnRfc3JjZmlsZS0+ZGlyLCBmbmFtZSk7CisKKwkJZiA9IGZvcGVuKGZ1bGxuYW1lLCAiciIpOworCQlpZiAoIWYpCisJCQlkaWUoIkNvdWxkbid0IG9wZW4gXCIlc1wiOiAlc1xuIiwgZm5hbWUsCisJCQkgICAgc3RyZXJyb3IoZXJybm8pKTsKIAl9CiAKLQlpZiAoZm5hbWVbMF0gPT0gJy8nKSB7Ci0JCWZpbGUtPmZpbGUgPSBmb3BlbihmbmFtZSwgInIiKTsKLQkJaWYgKCFmaWxlLT5maWxlKQotCQkJZ290byBmYWlsOworCWlmIChmdWxsbmFtZXApCisJCSpmdWxsbmFtZXAgPSBmdWxsbmFtZTsKKwllbHNlCisJCWZyZWUoZnVsbG5hbWUpOwogCi0JCWZpbGUtPm5hbWUgPSBzdHJkdXAoZm5hbWUpOwotCQlyZXR1cm4gZmlsZTsKLQl9Ci0KLQlpZiAoIXNlYXJjaCkKLQkJc2VhcmNoID0gJmRlZmF1bHRfc2VhcmNoOwotCi0Jd2hpbGUgKHNlYXJjaCkgewotCQlpZiAoZHRjX29wZW5fb25lKGZpbGUsIHNlYXJjaC0+ZGlyLCBmbmFtZSkpCi0JCQlyZXR1cm4gZmlsZTsKLQotCQlpZiAoZXJybm8gIT0gRU5PRU5UKQotCQkJZ290byBmYWlsOwotCi0JCXNlYXJjaCA9IHNlYXJjaC0+bmV4dDsKLQl9Ci0KLWZhaWw6Ci0JZGllKCJDb3VsZG4ndCBvcGVuIFwiJXNcIjogJXNcbiIsIGZuYW1lLCBzdHJlcnJvcihlcnJubykpOworCXJldHVybiBmOwogfQogCi12b2lkIGR0Y19jbG9zZV9maWxlKHN0cnVjdCBkdGNfZmlsZSAqZmlsZSkKK3ZvaWQgc3JjZmlsZV9wdXNoKGNvbnN0IGNoYXIgKmZuYW1lKQogewotCWlmIChmY2xvc2UoZmlsZS0+ZmlsZSkpCi0JCWRpZSgiRXJyb3IgY2xvc2luZyBcIiVzXCI6ICVzXG4iLCBmaWxlLT5uYW1lLCBzdHJlcnJvcihlcnJubykpOworCXN0cnVjdCBzcmNmaWxlX3N0YXRlICpzcmNmaWxlOwogCi0JZnJlZShmaWxlLT5kaXIpOwotCWZyZWUoZmlsZSk7CisJaWYgKHNyY2ZpbGVfZGVwdGgrKyA+PSBNQVhfU1JDRklMRV9ERVBUSCkKKwkJZGllKCJJbmNsdWRlcyBuZXN0ZWQgdG9vIGRlZXBseSIpOworCisJc3JjZmlsZSA9IHhtYWxsb2Moc2l6ZW9mKCpzcmNmaWxlKSk7CisKKwlzcmNmaWxlLT5mID0gc3JjZmlsZV9yZWxhdGl2ZV9vcGVuKGZuYW1lLCAmc3JjZmlsZS0+bmFtZSk7CisJc3JjZmlsZS0+ZGlyID0gZGlybmFtZShzcmNmaWxlLT5uYW1lKTsKKwlzcmNmaWxlLT5wcmV2ID0gY3VycmVudF9zcmNmaWxlOworCisJc3JjZmlsZS0+bGluZW5vID0gMTsKKwlzcmNmaWxlLT5jb2xubyA9IDE7CisKKwljdXJyZW50X3NyY2ZpbGUgPSBzcmNmaWxlOworfQorCitpbnQgc3JjZmlsZV9wb3Aodm9pZCkKK3sKKwlzdHJ1Y3Qgc3JjZmlsZV9zdGF0ZSAqc3JjZmlsZSA9IGN1cnJlbnRfc3JjZmlsZTsKKworCWFzc2VydChzcmNmaWxlKTsKKworCWN1cnJlbnRfc3JjZmlsZSA9IHNyY2ZpbGUtPnByZXY7CisKKwlpZiAoZmNsb3NlKHNyY2ZpbGUtPmYpKQorCQlkaWUoIkVycm9yIGNsb3NpbmcgXCIlc1wiOiAlc1xuIiwgc3JjZmlsZS0+bmFtZSwKKwkJICAgIHN0cmVycm9yKGVycm5vKSk7CisKKwkvKiBGSVhNRTogV2UgYWxsb3cgdGhlIHNyY2ZpbGVfc3RhdGUgc3RydWN0dXJlIHRvIGxlYWssCisJICogYmVjYXVzZSBpdCBjb3VsZCBzdGlsbCBiZSByZWZlcmVuY2VkIGZyb20gYSBsb2NhdGlvbgorCSAqIHZhcmlhYmxlIGJlaW5nIGNhcnJpZWQgdGhyb3VnaCB0aGUgcGFyc2VyIHNvbWV3aGVyZS4gIFRvCisJICogZml4IHRoaXMgd2UgY291bGQgZWl0aGVyIGFsbG9jYXRlIGFsbCB0aGUgZmlsZXMgZnJvbSBhCisJICogdGFibGUsIG9yIHVzZSBhIHBvb2wgYWxsb2NhdG9yLiAqLworCisJcmV0dXJuIGN1cnJlbnRfc3JjZmlsZSA/IDEgOiAwOworfQorCisvKgorICogVGhlIGVtcHR5IHNvdXJjZSBwb3NpdGlvbi4KKyAqLworCitzdHJ1Y3Qgc3JjcG9zIHNyY3Bvc19lbXB0eSA9IHsKKwkuZmlyc3RfbGluZSA9IDAsCisJLmZpcnN0X2NvbHVtbiA9IDAsCisJLmxhc3RfbGluZSA9IDAsCisJLmxhc3RfY29sdW1uID0gMCwKKwkuZmlsZSA9IE5VTEwsCit9OworCisjZGVmaW5lIFRBQl9TSVpFICAgICAgOAorCit2b2lkIHNyY3Bvc191cGRhdGUoc3RydWN0IHNyY3BvcyAqcG9zLCBjb25zdCBjaGFyICp0ZXh0LCBpbnQgbGVuKQoreworCWludCBpOworCisJcG9zLT5maWxlID0gY3VycmVudF9zcmNmaWxlOworCisJcG9zLT5maXJzdF9saW5lID0gY3VycmVudF9zcmNmaWxlLT5saW5lbm87CisJcG9zLT5maXJzdF9jb2x1bW4gPSBjdXJyZW50X3NyY2ZpbGUtPmNvbG5vOworCisJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQorCQlpZiAodGV4dFtpXSA9PSAnXG4nKSB7CisJCQljdXJyZW50X3NyY2ZpbGUtPmxpbmVubysrOworCQkJY3VycmVudF9zcmNmaWxlLT5jb2xubyA9IDE7CisJCX0gZWxzZSBpZiAodGV4dFtpXSA9PSAnXHQnKSB7CisJCQljdXJyZW50X3NyY2ZpbGUtPmNvbG5vID0KKwkJCQlBTElHTihjdXJyZW50X3NyY2ZpbGUtPmNvbG5vLCBUQUJfU0laRSk7CisJCX0gZWxzZSB7CisJCQljdXJyZW50X3NyY2ZpbGUtPmNvbG5vKys7CisJCX0KKworCXBvcy0+bGFzdF9saW5lID0gY3VycmVudF9zcmNmaWxlLT5saW5lbm87CisJcG9zLT5sYXN0X2NvbHVtbiA9IGN1cnJlbnRfc3JjZmlsZS0+Y29sbm87Cit9CisKK3N0cnVjdCBzcmNwb3MgKgorc3JjcG9zX2NvcHkoc3RydWN0IHNyY3BvcyAqcG9zKQoreworCXN0cnVjdCBzcmNwb3MgKnBvc19uZXc7CisKKwlwb3NfbmV3ID0geG1hbGxvYyhzaXplb2Yoc3RydWN0IHNyY3BvcykpOworCW1lbWNweShwb3NfbmV3LCBwb3MsIHNpemVvZihzdHJ1Y3Qgc3JjcG9zKSk7CisKKwlyZXR1cm4gcG9zX25ldzsKK30KKworCisKK3ZvaWQKK3NyY3Bvc19kdW1wKHN0cnVjdCBzcmNwb3MgKnBvcykKK3sKKwlwcmludGYoImZpbGUgICAgICAgIDogXCIlc1wiXG4iLAorCSAgICAgICBwb3MtPmZpbGUgPyAoY2hhciAqKSBwb3MtPmZpbGUgOiAiPG5vIGZpbGU+Iik7CisJcHJpbnRmKCJmaXJzdF9saW5lICA6ICVkXG4iLCBwb3MtPmZpcnN0X2xpbmUpOworCXByaW50ZigiZmlyc3RfY29sdW1uOiAlZFxuIiwgcG9zLT5maXJzdF9jb2x1bW4pOworCXByaW50ZigibGFzdF9saW5lICAgOiAlZFxuIiwgcG9zLT5sYXN0X2xpbmUpOworCXByaW50ZigibGFzdF9jb2x1bW4gOiAlZFxuIiwgcG9zLT5sYXN0X2NvbHVtbik7CisJcHJpbnRmKCJmaWxlICAgICAgICA6ICVzXG4iLCBwb3MtPmZpbGUtPm5hbWUpOworfQorCisKK2NoYXIgKgorc3JjcG9zX3N0cmluZyhzdHJ1Y3Qgc3JjcG9zICpwb3MpCit7CisJY29uc3QgY2hhciAqZm5hbWUgPSAiPG5vLWZpbGU+IjsKKwljaGFyICpwb3Nfc3RyOworCWludCByYzsKKworCWlmIChwb3MpCisJCWZuYW1lID0gcG9zLT5maWxlLT5uYW1lOworCisKKwlpZiAocG9zLT5maXJzdF9saW5lICE9IHBvcy0+bGFzdF9saW5lKQorCQlyYyA9IGFzcHJpbnRmKCZwb3Nfc3RyLCAiJXM6JWQuJWQtJWQuJWQiLCBmbmFtZSwKKwkJCSAgICAgIHBvcy0+Zmlyc3RfbGluZSwgcG9zLT5maXJzdF9jb2x1bW4sCisJCQkgICAgICBwb3MtPmxhc3RfbGluZSwgcG9zLT5sYXN0X2NvbHVtbik7CisJZWxzZSBpZiAocG9zLT5maXJzdF9jb2x1bW4gIT0gcG9zLT5sYXN0X2NvbHVtbikKKwkJcmMgPSBhc3ByaW50ZigmcG9zX3N0ciwgIiVzOiVkLiVkLSVkIiwgZm5hbWUsCisJCQkgICAgICBwb3MtPmZpcnN0X2xpbmUsIHBvcy0+Zmlyc3RfY29sdW1uLAorCQkJICAgICAgcG9zLT5sYXN0X2NvbHVtbik7CisJZWxzZQorCQlyYyA9IGFzcHJpbnRmKCZwb3Nfc3RyLCAiJXM6JWQuJWQiLCBmbmFtZSwKKwkJCSAgICAgIHBvcy0+Zmlyc3RfbGluZSwgcG9zLT5maXJzdF9jb2x1bW4pOworCisJaWYgKHJjID09IC0xKQorCQlkaWUoIkNvdWxkbid0IGFsbG9jYXRlIGluIHNyY3BvcyBzdHJpbmciKTsKKworCXJldHVybiBwb3Nfc3RyOworfQorCit2b2lkCitzcmNwb3NfdmVycm9yKHN0cnVjdCBzcmNwb3MgKnBvcywgY2hhciBjb25zdCAqZm10LCB2YV9saXN0IHZhKQoreworICAgICAgIGNvbnN0IGNoYXIgKnNyY3N0cjsKKworICAgICAgIHNyY3N0ciA9IHNyY3Bvc19zdHJpbmcocG9zKTsKKworICAgICAgIGZwcmludGYoc3Rkb3V0LCAiRXJyb3I6ICVzICIsIHNyY3N0cik7CisgICAgICAgdmZwcmludGYoc3Rkb3V0LCBmbXQsIHZhKTsKKyAgICAgICBmcHJpbnRmKHN0ZG91dCwgIlxuIik7Cit9CisKK3ZvaWQKK3NyY3Bvc19lcnJvcihzdHJ1Y3Qgc3JjcG9zICpwb3MsIGNoYXIgY29uc3QgKmZtdCwgLi4uKQoreworCXZhX2xpc3QgdmE7CisKKwl2YV9zdGFydCh2YSwgZm10KTsKKwlzcmNwb3NfdmVycm9yKHBvcywgZm10LCB2YSk7CisJdmFfZW5kKHZhKTsKK30KKworCit2b2lkCitzcmNwb3Nfd2FybihzdHJ1Y3Qgc3JjcG9zICpwb3MsIGNoYXIgY29uc3QgKmZtdCwgLi4uKQoreworCWNvbnN0IGNoYXIgKnNyY3N0cjsKKwl2YV9saXN0IHZhOworCXZhX3N0YXJ0KHZhLCBmbXQpOworCisJc3Jjc3RyID0gc3JjcG9zX3N0cmluZyhwb3MpOworCisJZnByaW50ZihzdGRlcnIsICJXYXJuaW5nOiAlcyAiLCBzcmNzdHIpOworCXZmcHJpbnRmKHN0ZGVyciwgZm10LCB2YSk7CisJZnByaW50ZihzdGRlcnIsICJcbiIpOworCisJdmFfZW5kKHZhKTsKIH0KZGlmZiAtLWdpdCBhL3NjcmlwdHMvZHRjL3NyY3Bvcy5oIGIvc2NyaXB0cy9kdGMvc3JjcG9zLmgKaW5kZXggZTE3YzdjMC4uYmQ3OTY2ZSAxMDA2NDQKLS0tIGEvc2NyaXB0cy9kdGMvc3JjcG9zLmgKKysrIGIvc2NyaXB0cy9kdGMvc3JjcG9zLmgKQEAgLTE3LDY5ICsxNyw3MCBAQAogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNBCiAgKi8KIAotLyoKLSAqIEF1Z21lbnQgdGhlIHN0YW5kYXJkIFlZTFRZUEUgd2l0aCBhIGZpbGVudW0gaW5kZXggaW50byBhbgotICogYXJyYXkgb2YgYWxsIG9wZW5lZCBmaWxlbmFtZXMuCi0gKi8KKyNpZm5kZWYgX1NSQ1BPU19IXworI2RlZmluZSBfU1JDUE9TX0hfCiAKICNpbmNsdWRlIDxzdGRpby5oPgogCi1zdHJ1Y3QgZHRjX2ZpbGUgeworc3RydWN0IHNyY2ZpbGVfc3RhdGUgeworCUZJTEUgKmY7CisJY2hhciAqbmFtZTsKIAljaGFyICpkaXI7Ci0JY29uc3QgY2hhciAqbmFtZTsKLQlGSUxFICpmaWxlOworCWludCBsaW5lbm8sIGNvbG5vOworCXN0cnVjdCBzcmNmaWxlX3N0YXRlICpwcmV2OwogfTsKIAotI2lmICEgZGVmaW5lZChZWUxUWVBFKSAmJiAhIGRlZmluZWQoWVlMVFlQRV9JU19ERUNMQVJFRCkKLXR5cGVkZWYgc3RydWN0IFlZTFRZUEUgeworZXh0ZXJuIHN0cnVjdCBzcmNmaWxlX3N0YXRlICpjdXJyZW50X3NyY2ZpbGU7IC8qID0gTlVMTCAqLworCitGSUxFICpzcmNmaWxlX3JlbGF0aXZlX29wZW4oY29uc3QgY2hhciAqZm5hbWUsIGNoYXIgKipmdWxsbmFtZXApOwordm9pZCBzcmNmaWxlX3B1c2goY29uc3QgY2hhciAqZm5hbWUpOworaW50IHNyY2ZpbGVfcG9wKHZvaWQpOworCitzdHJ1Y3Qgc3JjcG9zIHsKICAgICBpbnQgZmlyc3RfbGluZTsKICAgICBpbnQgZmlyc3RfY29sdW1uOwogICAgIGludCBsYXN0X2xpbmU7CiAgICAgaW50IGxhc3RfY29sdW1uOwotICAgIHN0cnVjdCBkdGNfZmlsZSAqZmlsZTsKLX0gWVlMVFlQRTsKLQotI2RlZmluZSBZWUxUWVBFX0lTX0RFQ0xBUkVECTEKLSNkZWZpbmUgWVlMVFlQRV9JU19UUklWSUFMCTEKLSNlbmRpZgotCi0vKiBDYXRlciB0byBvbGQgcGFyc2VyIHRlbXBsYXRlcy4gKi8KLSNpZm5kZWYgWVlJRAotI2RlZmluZSBZWUlEKG4pCShuKQotI2VuZGlmCi0KLSNkZWZpbmUgWVlMTE9DX0RFRkFVTFQoQ3VycmVudCwgUmhzLCBOKQkJCQkJXAotICAgIGRvCQkJCQkJCQkJXAotICAgICAgaWYgKFlZSUQgKE4pKQkJCQkJCQlcCi0JewkJCQkJCQkJXAotCSAgKEN1cnJlbnQpLmZpcnN0X2xpbmUgICA9IFlZUkhTTE9DIChSaHMsIDEpLmZpcnN0X2xpbmU7CVwKLQkgIChDdXJyZW50KS5maXJzdF9jb2x1bW4gPSBZWVJIU0xPQyAoUmhzLCAxKS5maXJzdF9jb2x1bW47CVwKLQkgIChDdXJyZW50KS5sYXN0X2xpbmUgICAgPSBZWVJIU0xPQyAoUmhzLCBOKS5sYXN0X2xpbmU7CQlcCi0JICAoQ3VycmVudCkubGFzdF9jb2x1bW4gID0gWVlSSFNMT0MgKFJocywgTikubGFzdF9jb2x1bW47CVwKLQkgIChDdXJyZW50KS5maWxlICAgICAgICAgPSBZWVJIU0xPQyAoUmhzLCBOKS5maWxlOwkJXAotCX0JCQkJCQkJCVwKLSAgICAgIGVsc2UJCQkJCQkJCVwKLQl7CQkJCQkJCQlcCi0JICAoQ3VycmVudCkuZmlyc3RfbGluZSAgID0gKEN1cnJlbnQpLmxhc3RfbGluZSAgID0JCVwKLQkgICAgWVlSSFNMT0MgKFJocywgMCkubGFzdF9saW5lOwkJCQlcCi0JICAoQ3VycmVudCkuZmlyc3RfY29sdW1uID0gKEN1cnJlbnQpLmxhc3RfY29sdW1uID0JCVwKLQkgICAgWVlSSFNMT0MgKFJocywgMCkubGFzdF9jb2x1bW47CQkJCVwKLQkgIChDdXJyZW50KS5maWxlICAgICAgICAgPSBZWVJIU0xPQyAoUmhzLCAwKS5maWxlOwkJXAotCX0JCQkJCQkJCVwKLSAgICB3aGlsZSAoWVlJRCAoMCkpCi0KLQotCi1leHRlcm4gdm9pZCB5eWVycm9yKGNoYXIgY29uc3QgKik7Ci1leHRlcm4gdm9pZCB5eWVycm9yZihjaGFyIGNvbnN0ICosIC4uLikgX19hdHRyaWJ1dGVfXygoZm9ybWF0KHByaW50ZiwgMSwgMikpKTsKLQotZXh0ZXJuIHN0cnVjdCBkdGNfZmlsZSAqc3JjcG9zX2ZpbGU7Ci0KLXN0cnVjdCBzZWFyY2hfcGF0aCB7Ci0JY29uc3QgY2hhciAqZGlyOyAvKiBOVUxMIGZvciBjdXJyZW50IGRpcmVjdG9yeSAqLwotCXN0cnVjdCBzZWFyY2hfcGF0aCAqcHJldiwgKm5leHQ7CisgICAgc3RydWN0IHNyY2ZpbGVfc3RhdGUgKmZpbGU7CiB9OwogCi1leHRlcm4gc3RydWN0IGR0Y19maWxlICpkdGNfb3Blbl9maWxlKGNvbnN0IGNoYXIgKmZuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3Qgc2VhcmNoX3BhdGggKnNlYXJjaCk7Ci1leHRlcm4gdm9pZCBkdGNfY2xvc2VfZmlsZShzdHJ1Y3QgZHRjX2ZpbGUgKmZpbGUpOworI2RlZmluZSBZWUxUWVBFIHN0cnVjdCBzcmNwb3MKKworI2RlZmluZSBZWUxMT0NfREVGQVVMVChDdXJyZW50LCBSaHMsIE4pCQkJCQkJXAorCWRvIHsJCQkJCQkJCQlcCisJCWlmIChOKSB7CQkJCQkJCVwKKwkJCShDdXJyZW50KS5maXJzdF9saW5lID0gWVlSSFNMT0MoUmhzLCAxKS5maXJzdF9saW5lOwlcCisJCQkoQ3VycmVudCkuZmlyc3RfY29sdW1uID0gWVlSSFNMT0MoUmhzLCAxKS5maXJzdF9jb2x1bW47CVwKKwkJCShDdXJyZW50KS5sYXN0X2xpbmUgPSBZWVJIU0xPQyhSaHMsIE4pLmxhc3RfbGluZTsJXAorCQkJKEN1cnJlbnQpLmxhc3RfY29sdW1uICA9IFlZUkhTTE9DIChSaHMsIE4pLmxhc3RfY29sdW1uOwlcCisJCQkoQ3VycmVudCkuZmlsZSA9IFlZUkhTTE9DKFJocywgTikuZmlsZTsJCQlcCisJCX0gZWxzZSB7CQkJCQkJCVwKKwkJCShDdXJyZW50KS5maXJzdF9saW5lID0gKEN1cnJlbnQpLmxhc3RfbGluZSA9CQlcCisJCQkJWVlSSFNMT0MoUmhzLCAwKS5sYXN0X2xpbmU7CQkJXAorCQkJKEN1cnJlbnQpLmZpcnN0X2NvbHVtbiA9IChDdXJyZW50KS5sYXN0X2NvbHVtbiA9CVwKKwkJCQlZWVJIU0xPQyhSaHMsIDApLmxhc3RfY29sdW1uOwkJCVwKKwkJCShDdXJyZW50KS5maWxlID0gWVlSSFNMT0MgKFJocywgMCkuZmlsZTsJCVwKKwkJfQkJCQkJCQkJXAorCX0gd2hpbGUgKDApCisKKworLyoKKyAqIEZpY3Rpb25hbCBzb3VyY2UgcG9zaXRpb24gdXNlZCBmb3IgSVIgbm9kZXMgdGhhdCBhcmUKKyAqIGNyZWF0ZWQgd2l0aG91dCBvdGhlcndpc2Uga25vd2luZyBhIHRydWUgc291cmNlIHBvc2l0aW9uLgorICogRm9yIGV4YW1wbGUsY29uc3RhbnQgZGVmaW5pdGlvbnMgZnJvbSB0aGUgY29tbWFuZCBsaW5lLgorICovCitleHRlcm4gc3RydWN0IHNyY3BvcyBzcmNwb3NfZW1wdHk7CisKK2V4dGVybiB2b2lkIHNyY3Bvc191cGRhdGUoc3RydWN0IHNyY3BvcyAqcG9zLCBjb25zdCBjaGFyICp0ZXh0LCBpbnQgbGVuKTsKK2V4dGVybiBzdHJ1Y3Qgc3JjcG9zICpzcmNwb3NfY29weShzdHJ1Y3Qgc3JjcG9zICpwb3MpOworZXh0ZXJuIGNoYXIgKnNyY3Bvc19zdHJpbmcoc3RydWN0IHNyY3BvcyAqcG9zKTsKK2V4dGVybiB2b2lkIHNyY3Bvc19kdW1wKHN0cnVjdCBzcmNwb3MgKnBvcyk7CisKK2V4dGVybiB2b2lkIHNyY3Bvc192ZXJyb3Ioc3RydWN0IHNyY3BvcyAqcG9zLCBjaGFyIGNvbnN0ICosIHZhX2xpc3QgdmEpCisgICAgIF9fYXR0cmlidXRlX18oKGZvcm1hdChwcmludGYsIDIsIDApKSk7CitleHRlcm4gdm9pZCBzcmNwb3NfZXJyb3Ioc3RydWN0IHNyY3BvcyAqcG9zLCBjaGFyIGNvbnN0ICosIC4uLikKKyAgICAgX19hdHRyaWJ1dGVfXygoZm9ybWF0KHByaW50ZiwgMiwgMykpKTsKK2V4dGVybiB2b2lkIHNyY3Bvc193YXJuKHN0cnVjdCBzcmNwb3MgKnBvcywgY2hhciBjb25zdCAqLCAuLi4pCisgICAgIF9fYXR0cmlidXRlX18oKGZvcm1hdChwcmludGYsIDIsIDMpKSk7CisKKyNlbmRpZiAvKiBfU1JDUE9TX0hfICovCmRpZmYgLS1naXQgYS9zY3JpcHRzL2R0Yy90cmVlc291cmNlLmMgYi9zY3JpcHRzL2R0Yy90cmVlc291cmNlLmMKaW5kZXggMTUyMWZmMS4uYzA5YWFmYSAxMDA2NDQKLS0tIGEvc2NyaXB0cy9kdGMvdHJlZXNvdXJjZS5jCisrKyBiL3NjcmlwdHMvZHRjL3RyZWVzb3VyY2UuYwpAQCAtMzIsOCArMzIsOCBAQAogCXRoZV9ib290X2luZm8gPSBOVUxMOwogCXRyZWVzb3VyY2VfZXJyb3IgPSAwOwogCi0Jc3JjcG9zX2ZpbGUgPSBkdGNfb3Blbl9maWxlKGZuYW1lLCBOVUxMKTsKLQl5eWluID0gc3JjcG9zX2ZpbGUtPmZpbGU7CisJc3JjZmlsZV9wdXNoKGZuYW1lKTsKKwl5eWluID0gY3VycmVudF9zcmNmaWxlLT5mOwogCiAJaWYgKHl5cGFyc2UoKSAhPSAwKQogCQlkaWUoIlVuYWJsZSB0byBwYXJzZSBpbnB1dCB0cmVlXG4iKTsKQEAgLTYzLDI2ICs2MywyMCBAQAogewogCWNvbnN0IGNoYXIgKnN0ciA9IHZhbC52YWw7CiAJaW50IGk7Ci0JaW50IG5ld2NodW5rID0gMTsKIAlzdHJ1Y3QgbWFya2VyICptID0gdmFsLm1hcmtlcnM7CiAKIAlhc3NlcnQoc3RyW3ZhbC5sZW4tMV0gPT0gJ1wwJyk7CiAKKwl3aGlsZSAobSAmJiAobS0+b2Zmc2V0ID09IDApKSB7CisJCWlmIChtLT50eXBlID09IExBQkVMKQorCQkJZnByaW50ZihmLCAiJXM6ICIsIG0tPnJlZik7CisJCW0gPSBtLT5uZXh0OworCX0KKwlmcHJpbnRmKGYsICJcIiIpOworCiAJZm9yIChpID0gMDsgaSA8ICh2YWwubGVuLTEpOyBpKyspIHsKIAkJY2hhciBjID0gc3RyW2ldOwogCi0JCWlmIChuZXdjaHVuaykgewotCQkJd2hpbGUgKG0gJiYgKG0tPm9mZnNldCA8PSBpKSkgewotCQkJCWlmIChtLT50eXBlID09IExBQkVMKSB7Ci0JCQkJCWFzc2VydChtLT5vZmZzZXQgPT0gaSk7Ci0JCQkJCWZwcmludGYoZiwgIiVzOiAiLCBtLT5yZWYpOwotCQkJCX0KLQkJCQltID0gbS0+bmV4dDsKLQkJCX0KLQkJCWZwcmludGYoZiwgIlwiIik7Ci0JCQluZXdjaHVuayA9IDA7Ci0JCX0KLQogCQlzd2l0Y2ggKGMpIHsKIAkJY2FzZSAnXGEnOgogCQkJZnByaW50ZihmLCAiXFxhIik7CkBAIC0xMTMsNyArMTA3LDE0IEBACiAJCQlicmVhazsKIAkJY2FzZSAnXDAnOgogCQkJZnByaW50ZihmLCAiXCIsICIpOwotCQkJbmV3Y2h1bmsgPSAxOworCQkJd2hpbGUgKG0gJiYgKG0tPm9mZnNldCA8IGkpKSB7CisJCQkJaWYgKG0tPnR5cGUgPT0gTEFCRUwpIHsKKwkJCQkJYXNzZXJ0KG0tPm9mZnNldCA9PSAoaSsxKSk7CisJCQkJCWZwcmludGYoZiwgIiVzOiAiLCBtLT5yZWYpOworCQkJCX0KKwkJCQltID0gbS0+bmV4dDsKKwkJCX0KKwkJCWZwcmludGYoZiwgIlwiIik7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCWlmIChpc3ByaW50KGMpKQpAQCAtMjM0LDEwICsyMzUsMTEgQEAKIHsKIAlzdHJ1Y3QgcHJvcGVydHkgKnByb3A7CiAJc3RydWN0IG5vZGUgKmNoaWxkOworCXN0cnVjdCBsYWJlbCAqbDsKIAogCXdyaXRlX3ByZWZpeChmLCBsZXZlbCk7Ci0JaWYgKHRyZWUtPmxhYmVsKQotCQlmcHJpbnRmKGYsICIlczogIiwgdHJlZS0+bGFiZWwpOworCWZvcl9lYWNoX2xhYmVsKHRyZWUtPmxhYmVscywgbCkKKwkJZnByaW50ZihmLCAiJXM6ICIsIGwtPmxhYmVsKTsKIAlpZiAodHJlZS0+bmFtZSAmJiAoKnRyZWUtPm5hbWUpKQogCQlmcHJpbnRmKGYsICIlcyB7XG4iLCB0cmVlLT5uYW1lKTsKIAllbHNlCkBAIC0yNDUsOCArMjQ3LDggQEAKIAogCWZvcl9lYWNoX3Byb3BlcnR5KHRyZWUsIHByb3ApIHsKIAkJd3JpdGVfcHJlZml4KGYsIGxldmVsKzEpOwotCQlpZiAocHJvcC0+bGFiZWwpCi0JCQlmcHJpbnRmKGYsICIlczogIiwgcHJvcC0+bGFiZWwpOworCQlmb3JfZWFjaF9sYWJlbChwcm9wLT5sYWJlbHMsIGwpCisJCQlmcHJpbnRmKGYsICIlczogIiwgbC0+bGFiZWwpOwogCQlmcHJpbnRmKGYsICIlcyIsIHByb3AtPm5hbWUpOwogCQl3cml0ZV9wcm9wdmFsKGYsIHByb3ApOwogCX0KQEAgLTI2Niw4ICsyNjgsMTAgQEAKIAlmcHJpbnRmKGYsICIvZHRzLXYxLztcblxuIik7CiAKIAlmb3IgKHJlID0gYmktPnJlc2VydmVsaXN0OyByZTsgcmUgPSByZS0+bmV4dCkgewotCQlpZiAocmUtPmxhYmVsKQotCQkJZnByaW50ZihmLCAiJXM6ICIsIHJlLT5sYWJlbCk7CisJCXN0cnVjdCBsYWJlbCAqbDsKKworCQlmb3JfZWFjaF9sYWJlbChyZS0+bGFiZWxzLCBsKQorCQkJZnByaW50ZihmLCAiJXM6ICIsIGwtPmxhYmVsKTsKIAkJZnByaW50ZihmLCAiL21lbXJlc2VydmUvXHQweCUwMTZsbHggMHglMDE2bGx4O1xuIiwKIAkJCSh1bnNpZ25lZCBsb25nIGxvbmcpcmUtPnJlLmFkZHJlc3MsCiAJCQkodW5zaWduZWQgbG9uZyBsb25nKXJlLT5yZS5zaXplKTsKZGlmZiAtLWdpdCBhL3NjcmlwdHMvZHRjL3V0aWwuYyBiL3NjcmlwdHMvZHRjL3V0aWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kN2FjMjdkCi0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9kdGMvdXRpbC5jCkBAIC0wLDAgKzEsNTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwOCBKb24gTG9lbGlnZXIsIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQorICogTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0EKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgInV0aWwuaCIKKworY2hhciAqeHN0cmR1cChjb25zdCBjaGFyICpzKQoreworCWludCBsZW4gPSBzdHJsZW4ocykgKyAxOworCWNoYXIgKmR1cCA9IHhtYWxsb2MobGVuKTsKKworCW1lbWNweShkdXAsIHMsIGxlbik7CisKKwlyZXR1cm4gZHVwOworfQorCitjaGFyICpqb2luX3BhdGgoY29uc3QgY2hhciAqcGF0aCwgY29uc3QgY2hhciAqbmFtZSkKK3sKKwlpbnQgbGVucCA9IHN0cmxlbihwYXRoKTsKKwlpbnQgbGVubiA9IHN0cmxlbihuYW1lKTsKKwlpbnQgbGVuOworCWludCBuZWVkc2xhc2ggPSAxOworCWNoYXIgKnN0cjsKKworCWxlbiA9IGxlbnAgKyBsZW5uICsgMjsKKwlpZiAoKGxlbnAgPiAwKSAmJiAocGF0aFtsZW5wLTFdID09ICcvJykpIHsKKwkJbmVlZHNsYXNoID0gMDsKKwkJbGVuLS07CisJfQorCisJc3RyID0geG1hbGxvYyhsZW4pOworCW1lbWNweShzdHIsIHBhdGgsIGxlbnApOworCWlmIChuZWVkc2xhc2gpIHsKKwkJc3RyW2xlbnBdID0gJy8nOworCQlsZW5wKys7CisJfQorCW1lbWNweShzdHIrbGVucCwgbmFtZSwgbGVubisxKTsKKwlyZXR1cm4gc3RyOworfQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9kdGMvdXRpbC5oIGIvc2NyaXB0cy9kdGMvdXRpbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljZWFkODQKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL2R0Yy91dGlsLmgKQEAgLTAsMCArMSw1NiBAQAorI2lmbmRlZiBfVVRJTF9ICisjZGVmaW5lIF9VVElMX0gKKworLyoKKyAqIENvcHlyaWdodCAyMDA4IEpvbiBMb2VsaWdlciwgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlCisgKiBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTQQorICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2F0dHJpYnV0ZV9fKChub3JldHVybikpIGRpZShjaGFyICogc3RyLCAuLi4pCit7CisJdmFfbGlzdCBhcDsKKworCXZhX3N0YXJ0KGFwLCBzdHIpOworCWZwcmludGYoc3RkZXJyLCAiRkFUQUwgRVJST1I6ICIpOworCXZmcHJpbnRmKHN0ZGVyciwgc3RyLCBhcCk7CisJZXhpdCgxKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkICp4bWFsbG9jKHNpemVfdCBsZW4pCit7CisJdm9pZCAqbmV3ID0gbWFsbG9jKGxlbik7CisKKwlpZiAoIW5ldykKKwkJZGllKCJtYWxsb2MoKSBmYWlsZWRcbiIpOworCisJcmV0dXJuIG5ldzsKK30KKworc3RhdGljIGlubGluZSB2b2lkICp4cmVhbGxvYyh2b2lkICpwLCBzaXplX3QgbGVuKQoreworCXZvaWQgKm5ldyA9IHJlYWxsb2MocCwgbGVuKTsKKworCWlmICghbmV3KQorCQlkaWUoInJlYWxsb2MoKSBmYWlsZWQgKGxlbj0lZClcbiIsIGxlbik7CisKKwlyZXR1cm4gbmV3OworfQorCitleHRlcm4gY2hhciAqeHN0cmR1cChjb25zdCBjaGFyICpzKTsKK2V4dGVybiBjaGFyICpqb2luX3BhdGgoY29uc3QgY2hhciAqcGF0aCwgY29uc3QgY2hhciAqbmFtZSk7CisKKyNlbmRpZiAvKiBfVVRJTF9IICovCmRpZmYgLS1naXQgYS9zY3JpcHRzL2R0Yy92ZXJzaW9uX2dlbi5oIGIvc2NyaXB0cy9kdGMvdmVyc2lvbl9nZW4uaAppbmRleCA2NThmZjQyLi42MTU4Yjg2IDEwMDY0NAotLS0gYS9zY3JpcHRzL2R0Yy92ZXJzaW9uX2dlbi5oCisrKyBiL3NjcmlwdHMvZHRjL3ZlcnNpb25fZ2VuLmgKQEAgLTEgKzEgQEAKLSNkZWZpbmUgRFRDX1ZFUlNJT04gIkRUQyAxLjIuMCIKKyNkZWZpbmUgRFRDX1ZFUlNJT04gIkRUQyAxLjIuMC1nMzdjMGI2YTAiCmRpZmYgLS1naXQgYS9zY3JpcHRzL2dlbmtzeW1zL3BhcnNlLmNfc2hpcHBlZCBiL3NjcmlwdHMvZ2Vua3N5bXMvcGFyc2UuY19zaGlwcGVkCmluZGV4IGVhZWU0NGUuLjgwOWI5NDkgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMvZ2Vua3N5bXMvcGFyc2UuY19zaGlwcGVkCisrKyBiL3NjcmlwdHMvZ2Vua3N5bXMvcGFyc2UuY19zaGlwcGVkCkBAIC0xNjAsNyArMTYwLDcgQEAKIAogCiAjaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8bWFsbG9jLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSAiZ2Vua3N5bXMuaCIKIAogc3RhdGljIGludCBpc190eXBlZGVmOwpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9nZW5rc3ltcy9wYXJzZS55IGIvc2NyaXB0cy9nZW5rc3ltcy9wYXJzZS55CmluZGV4IDEwZDdkYzcuLjA5YTI2NWMgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMvZ2Vua3N5bXMvcGFyc2UueQorKysgYi9zY3JpcHRzL2dlbmtzeW1zL3BhcnNlLnkKQEAgLTI0LDcgKzI0LDcgQEAKICV7CiAKICNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxtYWxsb2MuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlICJnZW5rc3ltcy5oIgogCiBzdGF0aWMgaW50IGlzX3R5cGVkZWY7CmRpZmYgLS1naXQgYS9zY3JpcHRzL2hlYWRlcnMuc2ggYi9zY3JpcHRzL2hlYWRlcnMuc2gKaW5kZXggMWRkY2RkMy4uOTc4YjQyYiAxMDA3NTUKLS0tIGEvc2NyaXB0cy9oZWFkZXJzLnNoCisrKyBiL3NjcmlwdHMvaGVhZGVycy5zaApAQCAtMTMsNyArMTMsNyBAQAogCWZpCiB9CiAKLWFyY2hzPSQobHMgJHtzcmN0cmVlfS9hcmNoKQorYXJjaHM9JHtIRFJfQVJDSF9MSVNUOi0kKGxzICR7c3JjdHJlZX0vYXJjaCl9CiAKIGZvciBhcmNoIGluICR7YXJjaHN9OyBkbwogCWNhc2UgJHthcmNofSBpbgpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9oZWFkZXJzX2NoZWNrLnBsIGIvc2NyaXB0cy9oZWFkZXJzX2NoZWNrLnBsCmluZGV4IDUwZDZjZmQuLjc5NTdlN2EgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMvaGVhZGVyc19jaGVjay5wbAorKysgYi9zY3JpcHRzL2hlYWRlcnNfY2hlY2sucGwKQEAgLTY0LDEwICs2NCwxMCBAQAogCiBzdWIgY2hlY2tfZGVjbGFyYXRpb25zCiB7Ci0JaWYgKCRsaW5lID1+bS9eXHMqZXh0ZXJuXGIvKSB7CisJaWYgKCRsaW5lID1+bS9eKFxzKmV4dGVybnx1bnNpZ25lZHxjaGFyfHNob3J0fGludHxsb25nfHZvaWQpXGIvKSB7CiAJCXByaW50ZiBTVERFUlIgIiRmaWxlbmFtZTokbGluZW5vOiAiIC4KLQkJICAgICAgICAgICAgICAidXNlcnNwYWNlIGNhbm5vdCBjYWxsIGZ1bmN0aW9uIG9yIHZhcmlhYmxlICIgLgotCQkgICAgICAgICAgICAgICJkZWZpbmVkIGluIHRoZSBrZXJuZWxcbiI7CisJCQkgICAgICAidXNlcnNwYWNlIGNhbm5vdCByZWZlcmVuY2UgZnVuY3Rpb24gb3IgIiAuCisJCQkgICAgICAidmFyaWFibGUgZGVmaW5lZCBpbiB0aGUga2VybmVsXG4iOwogCX0KIH0KIApkaWZmIC0tZ2l0IGEvc2NyaXB0cy9oZWFkZXJzX2luc3RhbGwucGwgYi9zY3JpcHRzL2hlYWRlcnNfaW5zdGFsbC5wbAppbmRleCA0Y2EzYmUzLi5lZmIzYmUxIDEwMDY0NAotLS0gYS9zY3JpcHRzL2hlYWRlcnNfaW5zdGFsbC5wbAorKysgYi9zY3JpcHRzL2hlYWRlcnNfaW5zdGFsbC5wbApAQCAtNDUsNiArNDUsMTMgQEAKIAljbG9zZSAkaW47CiAKIAlzeXN0ZW0gJHVuaWZkZWYgLiAiICR0bXBmaWxlID4gJGluc3RhbGxkaXIvJGZpbGUiOworCSMgdW5pZmRlZiB3aWxsIGV4aXQgMCBvbiBzdWNjZXNzLCBhbmQgd2lsbCBleGl0IDEgd2hlbiB0aGUKKwkjIGZpbGUgd2FzIHByb2Nlc3NlZCBzdWNjZXNzZnVsbHkgYnV0IG5vIGNoYW5nZXMgd2VyZSBtYWRlLAorCSMgc28gYWJvcnQgb25seSB3aGVuIGl0J3MgaGlnaGVyIHRoYW4gdGhhdC4KKwlteSAkZSA9ICQ/ID4+IDg7CisJaWYgKCRlID4gMSkgeworCQlkaWUgIiR0bXBmaWxlOiAkIVxuIjsKKwl9CiAJdW5saW5rICR0bXBmaWxlOwogfQogZXhpdCAwOwpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9rY29uZmlnL2NvbmYuYyBiL3NjcmlwdHMva2NvbmZpZy9jb25mLmMKaW5kZXggNTQ1OWEzOC4uNjU5MzI2YyAxMDA2NDQKLS0tIGEvc2NyaXB0cy9rY29uZmlnL2NvbmYuYworKysgYi9zY3JpcHRzL2tjb25maWcvY29uZi5jCkBAIC01MjksOCArNTI5LDYgQEAKIAkJfQogCQlicmVhazsKIAljYXNlIHNhdmVkZWZjb25maWc6Ci0JCWNvbmZfcmVhZChOVUxMKTsKLQkJYnJlYWs7CiAJY2FzZSBzaWxlbnRvbGRjb25maWc6CiAJY2FzZSBvbGRhc2tjb25maWc6CiAJY2FzZSBvbGRjb25maWc6CmRpZmYgLS1naXQgYS9zY3JpcHRzL2tjb25maWcvY29uZmRhdGEuYyBiL3NjcmlwdHMva2NvbmZpZy9jb25mZGF0YS5jCmluZGV4IDlkZjgwMTEuLjYxYzM1YmYgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMva2NvbmZpZy9jb25mZGF0YS5jCisrKyBiL3NjcmlwdHMva2NvbmZpZy9jb25mZGF0YS5jCkBAIC00NDAsMTIgKzQ0MCwxMSBAQAogCWZwdXRzKCJcIlxuIiwgb3V0KTsKIH0KIAotc3RhdGljIHZvaWQgY29uZl93cml0ZV9zeW1ib2woc3RydWN0IHN5bWJvbCAqc3ltLCBlbnVtIHN5bWJvbF90eXBlIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSUxFICpvdXQsIGJvb2wgd3JpdGVfbm8pCitzdGF0aWMgdm9pZCBjb25mX3dyaXRlX3N5bWJvbChzdHJ1Y3Qgc3ltYm9sICpzeW0sIEZJTEUgKm91dCwgYm9vbCB3cml0ZV9ubykKIHsKIAljb25zdCBjaGFyICpzdHI7CiAKLQlzd2l0Y2ggKHR5cGUpIHsKKwlzd2l0Y2ggKHN5bS0+dHlwZSkgewogCWNhc2UgU19CT09MRUFOOgogCWNhc2UgU19UUklTVEFURToKIAkJc3dpdGNoIChzeW1fZ2V0X3RyaXN0YXRlX3ZhbHVlKHN5bSkpIHsKQEAgLTUzMiw3ICs1MzEsNyBAQAogCQkJCQkJZ290byBuZXh0X21lbnU7CiAJCQkJfQogCQkJfQotCQkJY29uZl93cml0ZV9zeW1ib2woc3ltLCBzeW0tPnR5cGUsIG91dCwgdHJ1ZSk7CisJCQljb25mX3dyaXRlX3N5bWJvbChzeW0sIG91dCwgdHJ1ZSk7CiAJCX0KIG5leHRfbWVudToKIAkJaWYgKG1lbnUtPmxpc3QgIT0gTlVMTCkgewpAQCAtNTYxLDcgKzU2MCw2IEBACiAJY29uc3QgY2hhciAqYmFzZW5hbWU7CiAJY29uc3QgY2hhciAqc3RyOwogCWNoYXIgZGlybmFtZVtQQVRIX01BWCsxXSwgdG1wbmFtZVtQQVRIX01BWCsxXSwgbmV3bmFtZVtQQVRIX01BWCsxXTsKLQllbnVtIHN5bWJvbF90eXBlIHR5cGU7CiAJdGltZV90IG5vdzsKIAlpbnQgdXNlX3RpbWVzdGFtcCA9IDE7CiAJY2hhciAqZW52OwpAQCAtNjMzLDE0ICs2MzEsOCBAQAogCQkJaWYgKCEoc3ltLT5mbGFncyAmIFNZTUJPTF9XUklURSkpCiAJCQkJZ290byBuZXh0OwogCQkJc3ltLT5mbGFncyAmPSB+U1lNQk9MX1dSSVRFOwotCQkJdHlwZSA9IHN5bS0+dHlwZTsKLQkJCWlmICh0eXBlID09IFNfVFJJU1RBVEUpIHsKLQkJCQlzeW1fY2FsY192YWx1ZShtb2R1bGVzX3N5bSk7Ci0JCQkJaWYgKG1vZHVsZXNfc3ltLT5jdXJyLnRyaSA9PSBubykKLQkJCQkJdHlwZSA9IFNfQk9PTEVBTjsKLQkJCX0KIAkJCS8qIFdyaXRlIGNvbmZpZyBzeW1ib2wgdG8gZmlsZSAqLwotCQkJY29uZl93cml0ZV9zeW1ib2woc3ltLCB0eXBlLCBvdXQsIHRydWUpOworCQkJY29uZl93cml0ZV9zeW1ib2woc3ltLCBvdXQsIHRydWUpOwogCQl9CiAKIG5leHQ6CkBAIC04MzMsOCArODI1LDcgQEAKIAkJICAgICAgICIgKiBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBDIGNvbmZpZzogZG9uJ3QgZWRpdFxuIgogCQkgICAgICAgIiAqICVzXG4iCiAJCSAgICAgICAiICogJXMiCi0JCSAgICAgICAiICovXG4iCi0JCSAgICAgICAiI2RlZmluZSBBVVRPQ09ORl9JTkNMVURFRFxuIiwKKwkJICAgICAgICIgKi9cbiIsCiAJCSAgICAgICByb290bWVudS5wcm9tcHQtPnRleHQsIGN0aW1lKCZub3cpKTsKIAogCWZvcl9hbGxfc3ltYm9scyhpLCBzeW0pIHsKQEAgLTg0Myw3ICs4MzQsNyBAQAogCQkJY29udGludWU7CiAKIAkJLyogd3JpdGUgc3ltYm9sIHRvIGNvbmZpZyBmaWxlICovCi0JCWNvbmZfd3JpdGVfc3ltYm9sKHN5bSwgc3ltLT50eXBlLCBvdXQsIGZhbHNlKTsKKwkJY29uZl93cml0ZV9zeW1ib2woc3ltLCBvdXQsIGZhbHNlKTsKIAogCQkvKiB1cGRhdGUgYXV0b2NvbmYgYW5kIHRyaXN0YXRlIGZpbGVzICovCiAJCXN3aXRjaCAoc3ltLT50eXBlKSB7CkBAIC05NDYsNyArOTM3LDcgQEAKIAlpbnQgY250LCBkZWY7CiAKIAkvKgotCSAqIElmIGNob2ljZSBpcyBtb2QgdGhlbiB3ZSBtYXkgaGF2ZSBtb3JlIGl0ZW1zIHNsZWN0ZWQKKwkgKiBJZiBjaG9pY2UgaXMgbW9kIHRoZW4gd2UgbWF5IGhhdmUgbW9yZSBpdGVtcyBzZWxlY3RlZAogCSAqIGFuZCBpZiBubyB0aGVuIG5vLW9uZS4KIAkgKiBJbiBib3RoIGNhc2VzIHN0b3AuCiAJICovCkBAIC0xMDQyLDEwICsxMDMzLDEwIEBACiAKIAkvKgogCSAqIFdlIGhhdmUgZGlmZmVyZW50IHR5cGUgb2YgY2hvaWNlIGJsb2Nrcy4KLQkgKiBJZiBjdXJyLnRyaSBlcXVhbCB0byBtb2QgdGhlbiB3ZSBjYW4gc2VsZWN0IHNldmVyYWwKKwkgKiBJZiBjdXJyLnRyaSBlcXVhbHMgdG8gbW9kIHRoZW4gd2UgY2FuIHNlbGVjdCBzZXZlcmFsCiAJICogY2hvaWNlIHN5bWJvbHMgaW4gb25lIGJsb2NrLgogCSAqIEluIHRoaXMgY2FzZSB3ZSBkbyBub3RoaW5nLgotCSAqIElmIGN1cnIudHJpIGVxdWFsIHllcyB0aGVuIG9ubHkgb25lIHN5bWJvbCBjYW4gYmUKKwkgKiBJZiBjdXJyLnRyaSBlcXVhbHMgeWVzIHRoZW4gb25seSBvbmUgc3ltYm9sIGNhbiBiZQogCSAqIHNlbGVjdGVkIGluIGEgY2hvaWNlIGJsb2NrIGFuZCB3ZSBzZXQgaXQgdG8geWVzLAogCSAqIGFuZCB0aGUgcmVzdCB0byBuby4KIAkgKi8KZGlmZiAtLWdpdCBhL3NjcmlwdHMva2NvbmZpZy9leHByLmMgYi9zY3JpcHRzL2tjb25maWcvZXhwci5jCmluZGV4IDMzMGU3YzAuLjAwMTAwMzQgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMva2NvbmZpZy9leHByLmMKKysrIGIvc2NyaXB0cy9rY29uZmlnL2V4cHIuYwpAQCAtNjQsNyArNjQsNyBAQAogCXJldHVybiBlMiA/IGV4cHJfYWxsb2NfdHdvKEVfT1IsIGUxLCBlMikgOiBlMTsKIH0KIAotc3RydWN0IGV4cHIgKmV4cHJfY29weShzdHJ1Y3QgZXhwciAqb3JnKQorc3RydWN0IGV4cHIgKmV4cHJfY29weShjb25zdCBzdHJ1Y3QgZXhwciAqb3JnKQogewogCXN0cnVjdCBleHByICplOwogCkBAIC0xMDEzLDYgKzEwMTMsNDggQEAKICNlbmRpZgogfQogCitzdGF0aWMgaW5saW5lIHN0cnVjdCBleHByICoKK2V4cHJfZ2V0X2xlZnRtb3N0X3N5bWJvbChjb25zdCBzdHJ1Y3QgZXhwciAqZSkKK3sKKworCWlmIChlID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJd2hpbGUgKGUtPnR5cGUgIT0gRV9TWU1CT0wpCisJCWUgPSBlLT5sZWZ0LmV4cHI7CisKKwlyZXR1cm4gZXhwcl9jb3B5KGUpOworfQorCisvKgorICogR2l2ZW4gZXhwcmVzc2lvbiBgZTEnIGFuZCBgZTInLCByZXR1cm5zIHRoZSBsZWFmIG9mIHRoZSBsb25nZXN0CisgKiBzdWItZXhwcmVzc2lvbiBvZiBgZTEnIG5vdCBjb250YWluaW5nICdlMi4KKyAqLworc3RydWN0IGV4cHIgKmV4cHJfc2ltcGxpZnlfdW5tZXRfZGVwKHN0cnVjdCBleHByICplMSwgc3RydWN0IGV4cHIgKmUyKQoreworCXN0cnVjdCBleHByICpyZXQ7CisKKwlzd2l0Y2ggKGUxLT50eXBlKSB7CisJY2FzZSBFX09SOgorCQlyZXR1cm4gZXhwcl9hbGxvY19hbmQoCisJCSAgICBleHByX3NpbXBsaWZ5X3VubWV0X2RlcChlMS0+bGVmdC5leHByLCBlMiksCisJCSAgICBleHByX3NpbXBsaWZ5X3VubWV0X2RlcChlMS0+cmlnaHQuZXhwciwgZTIpKTsKKwljYXNlIEVfQU5EOiB7CisJCXN0cnVjdCBleHByICplOworCQllID0gZXhwcl9hbGxvY19hbmQoZXhwcl9jb3B5KGUxKSwgZXhwcl9jb3B5KGUyKSk7CisJCWUgPSBleHByX2VsaW1pbmF0ZV9kdXBzKGUpOworCQlyZXQgPSAoIWV4cHJfZXEoZSwgZTEpKSA/IGUxIDogTlVMTDsKKwkJZXhwcl9mcmVlKGUpOworCQlicmVhazsKKwkJfQorCWRlZmF1bHQ6CisJCXJldCA9IGUxOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gZXhwcl9nZXRfbGVmdG1vc3Rfc3ltYm9sKHJldCk7Cit9CisKIHZvaWQgZXhwcl9wcmludChzdHJ1Y3QgZXhwciAqZSwgdm9pZCAoKmZuKSh2b2lkICosIHN0cnVjdCBzeW1ib2wgKiwgY29uc3QgY2hhciAqKSwgdm9pZCAqZGF0YSwgaW50IHByZXZ0b2tlbikKIHsKIAlpZiAoIWUpIHsKZGlmZiAtLWdpdCBhL3NjcmlwdHMva2NvbmZpZy9leHByLmggYi9zY3JpcHRzL2tjb25maWcvZXhwci5oCmluZGV4IGU1NzgyNmMuLjNkMjM4ZGIgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMva2NvbmZpZy9leHByLmgKKysrIGIvc2NyaXB0cy9rY29uZmlnL2V4cHIuaApAQCAtMTkyLDcgKzE5Miw3IEBACiBzdHJ1Y3QgZXhwciAqZXhwcl9hbGxvY19jb21wKGVudW0gZXhwcl90eXBlIHR5cGUsIHN0cnVjdCBzeW1ib2wgKnMxLCBzdHJ1Y3Qgc3ltYm9sICpzMik7CiBzdHJ1Y3QgZXhwciAqZXhwcl9hbGxvY19hbmQoc3RydWN0IGV4cHIgKmUxLCBzdHJ1Y3QgZXhwciAqZTIpOwogc3RydWN0IGV4cHIgKmV4cHJfYWxsb2Nfb3Ioc3RydWN0IGV4cHIgKmUxLCBzdHJ1Y3QgZXhwciAqZTIpOwotc3RydWN0IGV4cHIgKmV4cHJfY29weShzdHJ1Y3QgZXhwciAqb3JnKTsKK3N0cnVjdCBleHByICpleHByX2NvcHkoY29uc3Qgc3RydWN0IGV4cHIgKm9yZyk7CiB2b2lkIGV4cHJfZnJlZShzdHJ1Y3QgZXhwciAqZSk7CiBpbnQgZXhwcl9lcShzdHJ1Y3QgZXhwciAqZTEsIHN0cnVjdCBleHByICplMik7CiB2b2lkIGV4cHJfZWxpbWluYXRlX2VxKHN0cnVjdCBleHByICoqZXAxLCBzdHJ1Y3QgZXhwciAqKmVwMik7CkBAIC0yMDcsNiArMjA3LDcgQEAKIHN0cnVjdCBleHByICpleHByX2V4dHJhY3RfZXFfb3Ioc3RydWN0IGV4cHIgKiplcDEsIHN0cnVjdCBleHByICoqZXAyKTsKIHZvaWQgZXhwcl9leHRyYWN0X2VxKGVudW0gZXhwcl90eXBlIHR5cGUsIHN0cnVjdCBleHByICoqZXAsIHN0cnVjdCBleHByICoqZXAxLCBzdHJ1Y3QgZXhwciAqKmVwMik7CiBzdHJ1Y3QgZXhwciAqZXhwcl90cmFuc19jb21wYXJlKHN0cnVjdCBleHByICplLCBlbnVtIGV4cHJfdHlwZSB0eXBlLCBzdHJ1Y3Qgc3ltYm9sICpzeW0pOworc3RydWN0IGV4cHIgKmV4cHJfc2ltcGxpZnlfdW5tZXRfZGVwKHN0cnVjdCBleHByICplMSwgc3RydWN0IGV4cHIgKmUyKTsKIAogdm9pZCBleHByX2ZwcmludChzdHJ1Y3QgZXhwciAqZSwgRklMRSAqb3V0KTsKIHN0cnVjdCBnc3RyOyAvKiBmb3J3YXJkICovCmRpZmYgLS1naXQgYS9zY3JpcHRzL2tjb25maWcvbGtjLmggYi9zY3JpcHRzL2tjb25maWcvbGtjLmgKaW5kZXggM2Y3MjQwZC4uZmViZjBjOSAxMDA2NDQKLS0tIGEvc2NyaXB0cy9rY29uZmlnL2xrYy5oCisrKyBiL3NjcmlwdHMva2NvbmZpZy9sa2MuaApAQCAtMTQsNiArMTQsNyBAQAogc3RhdGljIGlubGluZSBjb25zdCBjaGFyICpnZXR0ZXh0KGNvbnN0IGNoYXIgKnR4dCkgeyByZXR1cm4gdHh0OyB9CiBzdGF0aWMgaW5saW5lIHZvaWQgdGV4dGRvbWFpbihjb25zdCBjaGFyICpkb21haW5uYW1lKSB7fQogc3RhdGljIGlubGluZSB2b2lkIGJpbmR0ZXh0ZG9tYWluKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKmRpcikge30KK3N0YXRpYyBpbmxpbmUgY2hhciAqYmluZF90ZXh0ZG9tYWluX2NvZGVzZXQoY29uc3QgY2hhciAqZG4sIGNoYXIgKmMpIHsgcmV0dXJuIGM7IH0KICNlbmRpZgogCiAjaWZkZWYgX19jcGx1c3BsdXMKQEAgLTY3LDEwICs2OCwxMiBAQAogCWVudW0gc3ltYm9sX3R5cGUgc3R5cGU7CiB9OwogCisjaWZkZWYgWVlERUJVRworZXh0ZXJuIGludCB6Y29uZmRlYnVnOworI2VuZGlmCisKIGludCB6Y29uZnBhcnNlKHZvaWQpOwogdm9pZCB6Y29uZmR1bXAoRklMRSAqb3V0KTsKLQotZXh0ZXJuIGludCB6Y29uZmRlYnVnOwogdm9pZCB6Y29uZl9zdGFydGhlbHAodm9pZCk7CiBGSUxFICp6Y29uZl9mb3Blbihjb25zdCBjaGFyICpuYW1lKTsKIHZvaWQgemNvbmZfaW5pdHNjYW4oY29uc3QgY2hhciAqbmFtZSk7CmRpZmYgLS1naXQgYS9zY3JpcHRzL2tjb25maWcvbWVudS5jIGIvc2NyaXB0cy9rY29uZmlnL21lbnUuYwppbmRleCA1Zjc3ZGNiLi41ZmRmMTBkIDEwMDY0NAotLS0gYS9zY3JpcHRzL2tjb25maWcvbWVudS5jCisrKyBiL3NjcmlwdHMva2NvbmZpZy9tZW51LmMKQEAgLTIwMyw3ICsyMDMsNyBAQAogCX0KIH0KIAotc3RhdGljIGludCBtZW51X3JhbmdlX3ZhbGlkX3N5bShzdHJ1Y3Qgc3ltYm9sICpzeW0sIHN0cnVjdCBzeW1ib2wgKnN5bTIpCitzdGF0aWMgaW50IG1lbnVfdmFsaWRhdGVfbnVtYmVyKHN0cnVjdCBzeW1ib2wgKnN5bSwgc3RydWN0IHN5bWJvbCAqc3ltMikKIHsKIAlyZXR1cm4gc3ltMi0+dHlwZSA9PSBTX0lOVCB8fCBzeW0yLT50eXBlID09IFNfSEVYIHx8CiAJICAgICAgIChzeW0yLT50eXBlID09IFNfVU5LTk9XTiAmJiBzeW1fc3RyaW5nX3ZhbGlkKHN5bSwgc3ltMi0+bmFtZSkpOwpAQCAtMjIxLDYgKzIyMSwxNSBAQAogCQkJCXByb3Bfd2Fybihwcm9wLAogCQkJCSAgICAiZGVmYXVsdCBmb3IgY29uZmlnIHN5bWJvbCAnJXMnIgogCQkJCSAgICAiIG11c3QgYmUgYSBzaW5nbGUgc3ltYm9sIiwgc3ltLT5uYW1lKTsKKwkJCWlmIChwcm9wLT5leHByLT50eXBlICE9IEVfU1lNQk9MKQorCQkJCWJyZWFrOworCQkJc3ltMiA9IHByb3BfZ2V0X3N5bWJvbChwcm9wKTsKKwkJCWlmIChzeW0tPnR5cGUgPT0gU19IRVggfHwgc3ltLT50eXBlID09IFNfSU5UKSB7CisJCQkJaWYgKCFtZW51X3ZhbGlkYXRlX251bWJlcihzeW0sIHN5bTIpKQorCQkJCQlwcm9wX3dhcm4ocHJvcCwKKwkJCQkJICAgICInJXMnOiBudW1iZXIgaXMgaW52YWxpZCIsCisJCQkJCSAgICBzeW0tPm5hbWUpOworCQkJfQogCQkJYnJlYWs7CiAJCWNhc2UgUF9TRUxFQ1Q6CiAJCQlzeW0yID0gcHJvcF9nZXRfc3ltYm9sKHByb3ApOwpAQCAtMjQwLDggKzI0OSw4IEBACiAJCQlpZiAoc3ltLT50eXBlICE9IFNfSU5UICYmIHN5bS0+dHlwZSAhPSBTX0hFWCkKIAkJCQlwcm9wX3dhcm4ocHJvcCwgInJhbmdlIGlzIG9ubHkgYWxsb3dlZCAiCiAJCQkJICAgICAgICAgICAgICAgICJmb3IgaW50IG9yIGhleCBzeW1ib2xzIik7Ci0JCQlpZiAoIW1lbnVfcmFuZ2VfdmFsaWRfc3ltKHN5bSwgcHJvcC0+ZXhwci0+bGVmdC5zeW0pIHx8Ci0JCQkgICAgIW1lbnVfcmFuZ2VfdmFsaWRfc3ltKHN5bSwgcHJvcC0+ZXhwci0+cmlnaHQuc3ltKSkKKwkJCWlmICghbWVudV92YWxpZGF0ZV9udW1iZXIoc3ltLCBwcm9wLT5leHByLT5sZWZ0LnN5bSkgfHwKKwkJCSAgICAhbWVudV92YWxpZGF0ZV9udW1iZXIoc3ltLCBwcm9wLT5leHByLT5yaWdodC5zeW0pKQogCQkJCXByb3Bfd2Fybihwcm9wLCAicmFuZ2UgaXMgaW52YWxpZCIpOwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CmRpZmYgLS1naXQgYS9zY3JpcHRzL2tjb25maWcvbmNvbmYuYyBiL3NjcmlwdHMva2NvbmZpZy9uY29uZi5jCmluZGV4IDI3MmE5ODcuLmRiNTYzNzcgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMva2NvbmZpZy9uY29uZi5jCisrKyBiL3NjcmlwdHMva2NvbmZpZy9uY29uZi5jCkBAIC0yNDgsNyArMjQ4LDcgQEAKICJPbmx5IHJlbGV2YW50IGxpbmVzIGFyZSBzaG93bi5cbiIKICJcblxuIgogIlNlYXJjaCBleGFtcGxlczpcbiIKLSJFeGFtcGxlczogVVNCICAgPSA+IGZpbmQgYWxsIHN5bWJvbHMgY29udGFpbmluZyBVU0JcbiIKKyJFeGFtcGxlczogVVNCICA9PiBmaW5kIGFsbCBzeW1ib2xzIGNvbnRhaW5pbmcgVVNCXG4iCiAiICAgICAgICAgIF5VU0IgPT4gZmluZCBhbGwgc3ltYm9scyBzdGFydGluZyB3aXRoIFVTQlxuIgogIiAgICAgICAgICBVU0IkID0+IGZpbmQgYWxsIHN5bWJvbHMgZW5kaW5nIHdpdGggVVNCXG4iCiAiXG4iKTsKQEAgLTEyNjYsOSArMTI2NiwxMyBAQAogCQkJaWYgKGNoaWxkLT5zeW0gPT0gc3ltX2dldF9jaG9pY2VfdmFsdWUobWVudS0+c3ltKSkKIAkJCQlpdGVtX21ha2UoY2hpbGQsICc6JywgIjxYPiAlcyIsCiAJCQkJCQlfKG1lbnVfZ2V0X3Byb21wdChjaGlsZCkpKTsKLQkJCWVsc2UKKwkJCWVsc2UgaWYgKGNoaWxkLT5zeW0pCiAJCQkJaXRlbV9tYWtlKGNoaWxkLCAnOicsICIgICAgJXMiLAogCQkJCQkJXyhtZW51X2dldF9wcm9tcHQoY2hpbGQpKSk7CisJCQllbHNlCisJCQkJaXRlbV9tYWtlKGNoaWxkLCAnOicsICIqKiogJXMgKioqIiwKKwkJCQkJCV8obWVudV9nZXRfcHJvbXB0KGNoaWxkKSkpOworCiAJCQlpZiAoY2hpbGQtPnN5bSA9PSBhY3RpdmUpewogCQkJCWxhc3RfdG9wX3JvdyA9IHRvcF9yb3coY3Vyc2VzX21lbnUpOwogCQkJCXNlbGVjdGVkX2luZGV4ID0gaTsKQEAgLTEzMzQsNyArMTMzOCw3IEBACiAJCQlicmVhazsKIAogCQljaGlsZCA9IGl0ZW1fZGF0YSgpOwotCQlpZiAoIWNoaWxkIHx8ICFtZW51X2lzX3Zpc2libGUoY2hpbGQpKQorCQlpZiAoIWNoaWxkIHx8ICFtZW51X2lzX3Zpc2libGUoY2hpbGQpIHx8ICFjaGlsZC0+c3ltKQogCQkJY29udGludWU7CiAJCXN3aXRjaCAocmVzKSB7CiAJCWNhc2UgJyAnOgpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9rY29uZmlnL3N5bWJvbC5jIGIvc2NyaXB0cy9rY29uZmlnL3N5bWJvbC5jCmluZGV4IGFmNmU5ZjMuLmE3OTZjOTUgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMva2NvbmZpZy9zeW1ib2wuYworKysgYi9zY3JpcHRzL2tjb25maWcvc3ltYm9sLmMKQEAgLTM1MSwxMiArMzUxLDE2IEBACiAJCQl9CiAJCWNhbGNfbmV3dmFsOgogCQkJaWYgKHN5bS0+ZGlyX2RlcC50cmkgPT0gbm8gJiYgc3ltLT5yZXZfZGVwLnRyaSAhPSBubykgeworCQkJCXN0cnVjdCBleHByICplOworCQkJCWUgPSBleHByX3NpbXBsaWZ5X3VubWV0X2RlcChzeW0tPnJldl9kZXAuZXhwciwKKwkJCQkgICAgc3ltLT5kaXJfZGVwLmV4cHIpOwogCQkJCWZwcmludGYoc3RkZXJyLCAid2FybmluZzogKCIpOwotCQkJCWV4cHJfZnByaW50KHN5bS0+cmV2X2RlcC5leHByLCBzdGRlcnIpOworCQkJCWV4cHJfZnByaW50KGUsIHN0ZGVycik7CiAJCQkJZnByaW50ZihzdGRlcnIsICIpIHNlbGVjdHMgJXMgd2hpY2ggaGFzIHVubWV0IGRpcmVjdCBkZXBlbmRlbmNpZXMgKCIsCiAJCQkJCXN5bS0+bmFtZSk7CiAJCQkJZXhwcl9mcHJpbnQoc3ltLT5kaXJfZGVwLmV4cHIsIHN0ZGVycik7CiAJCQkJZnByaW50ZihzdGRlcnIsICIpXG4iKTsKKwkJCQlleHByX2ZyZWUoZSk7CiAJCQl9CiAJCQluZXd2YWwudHJpID0gRVhQUl9PUihuZXd2YWwudHJpLCBzeW0tPnJldl9kZXAudHJpKTsKIAkJfQpAQCAtNjg2LDcgKzY5MCw3IEBACiAJCXN3aXRjaCAoc3ltLT50eXBlKSB7CiAJCWNhc2UgU19CT09MRUFOOgogCQljYXNlIFNfVFJJU1RBVEU6Ci0JCQkvKiBUaGUgdmlzaWJpbGl0eSBpbWF5IGxpbWl0IHRoZSB2YWx1ZSBmcm9tIHllcyA9PiBtb2QgKi8KKwkJCS8qIFRoZSB2aXNpYmlsaXR5IG1heSBsaW1pdCB0aGUgdmFsdWUgZnJvbSB5ZXMgPT4gbW9kICovCiAJCQl2YWwgPSBFWFBSX0FORChleHByX2NhbGNfdmFsdWUocHJvcC0+ZXhwciksIHByb3AtPnZpc2libGUudHJpKTsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9ta3Vib290LnNoIGIvc2NyaXB0cy9ta3Vib290LnNoCmluZGV4IDJlM2QzY2QuLjQ0NjczOWMgMTAwNzU1Ci0tLSBhL3NjcmlwdHMvbWt1Ym9vdC5zaAorKysgYi9zY3JpcHRzL21rdWJvb3Quc2gKQEAgLTExLDcgKzExLDcgQEAKIAlpZiBbIC16ICIke01LSU1BR0V9IiBdOyB0aGVuCiAJCSMgRG9lc24ndCBleGlzdAogCQllY2hvICcibWtpbWFnZSIgY29tbWFuZCBub3QgZm91bmQgLSBVLUJvb3QgaW1hZ2VzIHdpbGwgbm90IGJlIGJ1aWx0JyA+JjIKLQkJZXhpdCAwOworCQlleGl0IDE7CiAJZmkKIGZpCiAKZGlmZiAtLWdpdCBhL3NjcmlwdHMvbW9kL21vZHBvc3QuYyBiL3NjcmlwdHMvbW9kL21vZHBvc3QuYwppbmRleCAzMzEyMmNhLi45N2QyMjU5IDEwMDY0NAotLS0gYS9zY3JpcHRzL21vZC9tb2Rwb3N0LmMKKysrIGIvc2NyaXB0cy9tb2QvbW9kcG9zdC5jCkBAIC03OTAsNiArNzkwLDcgQEAKIHsKIAkiLmNvbW1lbnQqIiwKIAkiLmRlYnVnKiIsCisJIi56ZGVidWcqIiwJCS8qIENvbXByZXNzZWQgZGVidWcgc2VjdGlvbnMuICovCiAJIi5HQ0MtY29tbWFuZC1saW5lIiwJLyogbW4xMDMwMCAqLwogCSIubWRlYnVnKiIsICAgICAgICAvKiBhbHBoYSwgc2NvcmUsIG1pcHMgZXRjLiAqLwogCSIucGRyIiwgICAgICAgICAgICAvKiBhbHBoYSwgc2NvcmUsIG1pcHMgZXRjLiAqLwpAQCAtMTQ0MSw3ICsxNDQyLDcgQEAKIAlpbnQgc2VjdGlvbiA9IHNobmR4MnNlY2luZGV4KHNlY2hkci0+c2hfaW5mbyk7CiAKIAlyZXR1cm4gKHZvaWQgKillbGYtPmhkciArIHNlY2hkcnNbc2VjdGlvbl0uc2hfb2Zmc2V0ICsKLQkJci0+cl9vZmZzZXQgLSBzZWNoZHJzW3NlY3Rpb25dLnNoX2FkZHI7CisJCXItPnJfb2Zmc2V0OwogfQogCiBzdGF0aWMgaW50IGFkZGVuZF8zODZfcmVsKHN0cnVjdCBlbGZfaW5mbyAqZWxmLCBFbGZfU2hkciAqc2VjaGRyLCBFbGZfUmVsYSAqcikKZGlmZiAtLWdpdCBhL3NjcmlwdHMvcGFja2FnZS9idWlsZGRlYiBiL3NjcmlwdHMvcGFja2FnZS9idWlsZGRlYgppbmRleCA0OWI3NGUxLi5iMGIyMzU3IDEwMDY0NAotLS0gYS9zY3JpcHRzL3BhY2thZ2UvYnVpbGRkZWIKKysrIGIvc2NyaXB0cy9wYWNrYWdlL2J1aWxkZGViCkBAIC0yNSw4ICsyNSw0NCBAQAogCWNob3duIC1SIHJvb3Q6cm9vdCAiJHBkaXIiCiAJY2htb2QgLVIgZ28tdyAiJHBkaXIiCiAKKwkjIEF0dGVtcHQgdG8gZmluZCB0aGUgY29ycmVjdCBEZWJpYW4gYXJjaGl0ZWN0dXJlCisJbG9jYWwgZm9yY2VhcmNoPSIiIGRlYmFyY2g9IiIKKwljYXNlICIkVVRTX01BQ0hJTkUiIGluCisJaTM4NnxpYTY0fGFscGhhKQorCQlkZWJhcmNoPSIkVVRTX01BQ0hJTkUiIDs7CisJeDg2XzY0KQorCQlkZWJhcmNoPWFtZDY0IDs7CisJc3BhcmMqKQorCQlkZWJhcmNoPXNwYXJjIDs7CisJczM5MCopCisJCWRlYmFyY2g9czM5MCA7OworCXBwYyopCisJCWRlYmFyY2g9cG93ZXJwYyA7OworCXBhcmlzYyopCisJCWRlYmFyY2g9aHBwYSA7OworCW1pcHMqKQorCQlkZWJhcmNoPW1pcHMkKGdyZXAgLXEgQ1BVX0xJVFRMRV9FTkRJQU49eSAuY29uZmlnICYmIGVjaG8gZWwpIDs7CisJYXJtKikKKwkJZGViYXJjaD1hcm0kKGdyZXAgLXEgQ09ORklHX0FFQUJJPXkgLmNvbmZpZyAmJiBlY2hvIGVsKSA7OworCSopCisJCWVjaG8gIiIgPiYyCisJCWVjaG8gIioqICoqICoqICBXQVJOSU5HICAqKiAqKiAqKiIgPiYyCisJCWVjaG8gIiIgPiYyCisJCWVjaG8gIllvdXIgYXJjaGl0ZWN0dXJlIGRvZXNuJ3QgaGF2ZSBpdCdzIGVxdWl2YWxlbnQiID4mMgorCQllY2hvICJEZWJpYW4gdXNlcnNwYWNlIGFyY2hpdGVjdHVyZSBkZWZpbmVkISIgPiYyCisJCWVjaG8gIkZhbGxpbmcgYmFjayB0byB1c2luZyB5b3VyIGN1cnJlbnQgdXNlcnNwYWNlIGluc3RlYWQhIiA+JjIKKwkJZWNobyAiUGxlYXNlIGFkZCBzdXBwb3J0IGZvciAkVVRTX01BQ0hJTkUgdG8gJHswfSAuLi4iID4mMgorCQllY2hvICIiID4mMgorCWVzYWMKKwlpZiBbIC1uICIkS0JVSUxEX0RFQkFSQ0giIF0gOyB0aGVuCisJCWRlYmFyY2g9IiRLQlVJTERfREVCQVJDSCIKKwlmaQorCWlmIFsgLW4gIiRkZWJhcmNoIiBdIDsgdGhlbgorCQlmb3JjZWFyY2g9Ii1EQXJjaGl0ZWN0dXJlPSRkZWJhcmNoIgorCWZpCisKIAkjIENyZWF0ZSB0aGUgcGFja2FnZQotCWRwa2ctZ2VuY29udHJvbCAtaXNwIC1wJHBuYW1lIC1QIiRwZGlyIgorCWRwa2ctZ2VuY29udHJvbCAtaXNwICRmb3JjZWFyY2ggLXAkcG5hbWUgLVAiJHBkaXIiCiAJZHBrZyAtLWJ1aWxkICIkcGRpciIgLi4KIH0KIApAQCAtNDAsMTcgKzc2LDI3IEBACiBmaQogdG1wZGlyPSIkb2JqdHJlZS9kZWJpYW4vdG1wIgogZndkaXI9IiRvYmp0cmVlL2RlYmlhbi9md3RtcCIKK2tlcm5lbF9oZWFkZXJzX2Rpcj0iJG9ianRyZWUvZGViaWFuL2hkcnRtcCIKK2xpYmNfaGVhZGVyc19kaXI9IiRvYmp0cmVlL2RlYmlhbi9oZWFkZXJ0bXAiCiBwYWNrYWdlbmFtZT1saW51eC1pbWFnZS0kdmVyc2lvbgogZndwYWNrYWdlbmFtZT1saW51eC1maXJtd2FyZS1pbWFnZQora2VybmVsX2hlYWRlcnNfcGFja2FnZW5hbWU9bGludXgtaGVhZGVycy0kdmVyc2lvbgorbGliY19oZWFkZXJzX3BhY2thZ2VuYW1lPWxpbnV4LWxpYmMtZGV2CiAKIGlmIFsgIiRBUkNIIiA9ICJ1bSIgXSA7IHRoZW4KIAlwYWNrYWdlbmFtZT11c2VyLW1vZGUtbGludXgtJHZlcnNpb24KIGZpCiAKICMgU2V0dXAgdGhlIGRpcmVjdG9yeSBzdHJ1Y3R1cmUKLXJtIC1yZiAiJHRtcGRpciIgIiRmd2RpciIKLW1rZGlyIC1wICIkdG1wZGlyL0RFQklBTiIgIiR0bXBkaXIvbGliIiAiJHRtcGRpci9ib290IiAiJHRtcGRpci91c3Ivc2hhcmUvZG9jLyRwYWNrYWdlbmFtZSIKLW1rZGlyIC1wICIkZndkaXIvREVCSUFOIiAiJGZ3ZGlyL2xpYiIgIiRmd2Rpci91c3Ivc2hhcmUvZG9jLyRmd3BhY2thZ2VuYW1lIgorcm0gLXJmICIkdG1wZGlyIiAiJGZ3ZGlyIiAiJGtlcm5lbF9oZWFkZXJzX2RpciIgIiRsaWJjX2hlYWRlcnNfZGlyIgorbWtkaXIgLW0gNzU1IC1wICIkdG1wZGlyL0RFQklBTiIKK21rZGlyIC1wICAiJHRtcGRpci9saWIiICIkdG1wZGlyL2Jvb3QiICIkdG1wZGlyL3Vzci9zaGFyZS9kb2MvJHBhY2thZ2VuYW1lIgorbWtkaXIgLW0gNzU1IC1wICIkZndkaXIvREVCSUFOIgorbWtkaXIgLXAgIiRmd2Rpci9saWIiICIkZndkaXIvdXNyL3NoYXJlL2RvYy8kZndwYWNrYWdlbmFtZSIKK21rZGlyIC1tIDc1NSAtcCAiJGxpYmNfaGVhZGVyc19kaXIvREVCSUFOIgorbWtkaXIgLXAgIiRsaWJjX2hlYWRlcnNfZGlyL3Vzci9zaGFyZS9kb2MvJGxpYmNfaGVhZGVyc19wYWNrYWdlbmFtZSIKK21rZGlyIC1tIDc1NSAtcCAiJGtlcm5lbF9oZWFkZXJzX2Rpci9ERUJJQU4iCitta2RpciAtcCAiJGtlcm5lbF9oZWFkZXJzX2Rpci91c3Ivc2hhcmUvZG9jLyRrZXJuZWxfaGVhZGVyc19wYWNrYWdlbmFtZSIKIGlmIFsgIiRBUkNIIiA9ICJ1bSIgXSA7IHRoZW4KIAlta2RpciAtcCAiJHRtcGRpci91c3IvbGliL3VtbC9tb2R1bGVzLyR2ZXJzaW9uIiAiJHRtcGRpci91c3IvYmluIgogZmkKQEAgLTgxLDYgKzEyNyw5IEBACiAJZmkKIGZpCiAKK21ha2UgaGVhZGVyc19jaGVjaworbWFrZSBoZWFkZXJzX2luc3RhbGwgSU5TVEFMTF9IRFJfUEFUSD0iJGxpYmNfaGVhZGVyc19kaXIvdXNyIgorCiAjIEluc3RhbGwgdGhlIG1haW50YWluZXIgc2NyaXB0cwogIyBOb3RlOiBob29rIHNjcmlwdHMgdW5kZXIgL2V0Yy9rZXJuZWwgYXJlIGFsc28gZXhlY3V0ZWQgYnkgb2ZmaWNpYWwgRGViaWFuCiAjIGtlcm5lbCBwYWNrYWdlcywgYXMgd2VsbCBhcyBrZXJuZWwgcGFja2FnZXMgYnVpbHQgdXNpbmcgbWFrZS1rcGtnCkBAIC0xODgsNiArMjM3LDMwIEBACiAKIGZpCiAKKyMgQnVpbGQgaGVhZGVyIHBhY2thZ2UKK2ZpbmQgLiAtbmFtZSBNYWtlZmlsZSAtbyAtbmFtZSBLY29uZmlnXCogLW8gLW5hbWUgXCoucGwgPiAvdG1wL2ZpbGVzJCQKK2ZpbmQgYXJjaC94ODYvaW5jbHVkZSBpbmNsdWRlIHNjcmlwdHMgLXR5cGUgZiA+PiAvdG1wL2ZpbGVzJCQKKyhjZCAkb2JqdHJlZTsgZmluZCAuY29uZmlnIE1vZHVsZS5zeW12ZXJzIGluY2x1ZGUgc2NyaXB0cyAtdHlwZSBmID4+IC90bXAvb2JqZmlsZXMkJCkKK2Rlc3RkaXI9JGtlcm5lbF9oZWFkZXJzX2Rpci91c3Ivc3JjL2xpbnV4LWhlYWRlcnMtJHZlcnNpb24KK21rZGlyIC1wICIkZGVzdGRpciIKK3RhciAtYyAtZiAtIC1UIC90bXAvZmlsZXMkJCB8IChjZCAkZGVzdGRpcjsgdGFyIC14ZiAtKQorKGNkICRvYmp0cmVlOyB0YXIgLWMgLWYgLSAtVCAvdG1wL29iamZpbGVzJCQpIHwgKGNkICRkZXN0ZGlyOyB0YXIgLXhmIC0pCitybSAtZiAvdG1wL2ZpbGVzJCQgL3RtcC9vYmpmaWxlcyQkCithcmNoPSQoZHBrZyAtLXByaW50LWFyY2hpdGVjdHVyZSkKKworY2F0IDw8RU9GID4+IGRlYmlhbi9jb250cm9sCisKK1BhY2thZ2U6ICRrZXJuZWxfaGVhZGVyc19wYWNrYWdlbmFtZQorUHJvdmlkZXM6IGxpbnV4LWhlYWRlcnMsIGxpbnV4LWhlYWRlcnMtMi42CitBcmNoaXRlY3R1cmU6ICRhcmNoCitEZXNjcmlwdGlvbjogTGludXgga2VybmVsIGhlYWRlcnMgZm9yICRLRVJORUxSRUxFQVNFIG9uICRhcmNoCisgVGhpcyBwYWNrYWdlIHByb3ZpZGVzIGtlcm5lbCBoZWFkZXIgZmlsZXMgZm9yICRLRVJORUxSRUxFQVNFIG9uICRhcmNoCisgLgorIFRoaXMgaXMgdXNlZnVsIGZvciBwZW9wbGUgd2hvIG5lZWQgdG8gYnVpbGQgZXh0ZXJuYWwgbW9kdWxlcworRU9GCisKK2NyZWF0ZV9wYWNrYWdlICIka2VybmVsX2hlYWRlcnNfcGFja2FnZW5hbWUiICIka2VybmVsX2hlYWRlcnNfZGlyIgorCiAjIERvIHdlIGhhdmUgZmlybXdhcmU/IE1vdmUgaXQgb3V0IG9mIHRoZSB3YXkgYW5kIGJ1aWxkIGl0IGludG8gYSBwYWNrYWdlLgogaWYgWyAtZSAiJHRtcGRpci9saWIvZmlybXdhcmUiIF07IHRoZW4KIAltdiAiJHRtcGRpci9saWIvZmlybXdhcmUiICIkZndkaXIvbGliLyIKQEAgLTIwMyw2ICsyNzYsMTggQEAKIAljcmVhdGVfcGFja2FnZSAiJGZ3cGFja2FnZW5hbWUiICIkZndkaXIiCiBmaQogCitjYXQgPDxFT0YgPj4gZGViaWFuL2NvbnRyb2wKKworUGFja2FnZTogJGxpYmNfaGVhZGVyc19wYWNrYWdlbmFtZQorU2VjdGlvbjogZGV2ZWwKK1Byb3ZpZGVzOiBsaW51eC1rZXJuZWwtaGVhZGVycworQXJjaGl0ZWN0dXJlOiBhbnkKK0Rlc2NyaXB0aW9uOiBMaW51eCBzdXBwb3J0IGhlYWRlcnMgZm9yIHVzZXJzcGFjZSBkZXZlbG9wbWVudAorIFRoaXMgcGFja2FnZSBwcm92aWRlcyB1c2Vyc3BhY2VzIGhlYWRlcnMgZnJvbSB0aGUgTGludXgga2VybmVsLiAgVGhlc2UgaGVhZGVycworIGFyZSB1c2VkIGJ5IHRoZSBpbnN0YWxsZWQgaGVhZGVycyBmb3IgR05VIGdsaWJjIGFuZCBvdGhlciBzeXN0ZW0gbGlicmFyaWVzLgorRU9GCisKK2NyZWF0ZV9wYWNrYWdlICIkbGliY19oZWFkZXJzX3BhY2thZ2VuYW1lIiAiJGxpYmNfaGVhZGVyc19kaXIiCiBjcmVhdGVfcGFja2FnZSAiJHBhY2thZ2VuYW1lIiAiJHRtcGRpciIKIAogZXhpdCAwCmRpZmYgLS1naXQgYS9zY3JpcHRzL3RhZ3Muc2ggYi9zY3JpcHRzL3RhZ3Muc2gKaW5kZXggYmJiZTU4NC4uOTJmZGM0NSAxMDA3NTUKLS0tIGEvc2NyaXB0cy90YWdzLnNoCisrKyBiL3NjcmlwdHMvdGFncy5zaApAQCAtMTIzLDcgKzEyMyw3IEBACiAJLUkgX19fX2NhY2hlbGluZV9pbnRlcm5vZGVhbGlnbmVkX2luX3NtcCAgICAgICAgICAgICAgICBcCiAJLUkgRVhQT1JUX1NZTUJPTCxFWFBPUlRfU1lNQk9MX0dQTCAgICAgICAgICAgICAgICAgICAgICBcCiAJLUkgREVGSU5FX1RSQUNFLEVYUE9SVF9UUkFDRVBPSU5UX1NZTUJPTCxFWFBPUlRfVFJBQ0VQT0lOVF9TWU1CT0xfR1BMIFwKLQktLWV4dHJhPStmIC0tYy1raW5kcz0tcHggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwktLWV4dHJhPStmIC0tYy1raW5kcz0rcHggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKIAktLXJlZ2V4LWFzbT0nL15FTlRSWVwoKFteKV0qKVwpLiovXDEvJyAgICAgICAgICAgICAgICAgIFwKIAktLXJlZ2V4LWM9Jy9eU1lTQ0FMTF9ERUZJTkVbWzpkaWdpdDpdXT9cKChbXiwpXSopLiovc3lzX1wxLycgXAogCS0tcmVnZXgtYysrPScvXlRSQUNFX0VWRU5UXCgoW14sKV0qKS4qL3RyYWNlX1wxLycJCVwKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L0tjb25maWcgYi9zZWN1cml0eS9LY29uZmlnCmluZGV4IGU4MGRhOTUuLjk1YWNjZDQgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L0tjb25maWcKKysrIGIvc2VjdXJpdHkvS2NvbmZpZwpAQCAtMjEsNiArMjEsMzcgQEAKIAogCSAgSWYgeW91IGFyZSB1bnN1cmUgYXMgdG8gd2hldGhlciB0aGlzIGlzIHJlcXVpcmVkLCBhbnN3ZXIgTi4KIAorY29uZmlnIFRSVVNURURfS0VZUworCXRyaXN0YXRlICJUUlVTVEVEIEtFWVMiCisJZGVwZW5kcyBvbiBLRVlTICYmIFRDR19UUE0KKwlzZWxlY3QgQ1JZUFRPCisJc2VsZWN0IENSWVBUT19ITUFDCisJc2VsZWN0IENSWVBUT19TSEExCisJaGVscAorCSAgVGhpcyBvcHRpb24gcHJvdmlkZXMgc3VwcG9ydCBmb3IgY3JlYXRpbmcsIHNlYWxpbmcsIGFuZCB1bnNlYWxpbmcKKwkgIGtleXMgaW4gdGhlIGtlcm5lbC4gVHJ1c3RlZCBrZXlzIGFyZSByYW5kb20gbnVtYmVyIHN5bW1ldHJpYyBrZXlzLAorCSAgZ2VuZXJhdGVkIGFuZCBSU0Etc2VhbGVkIGJ5IHRoZSBUUE0uIFRoZSBUUE0gb25seSB1bnNlYWxzIHRoZSBrZXlzLAorCSAgaWYgdGhlIGJvb3QgUENScyBhbmQgb3RoZXIgY3JpdGVyaWEgbWF0Y2guICBVc2Vyc3BhY2Ugd2lsbCBvbmx5IGV2ZXIKKwkgIHNlZSBlbmNyeXB0ZWQgYmxvYnMuCisKKwkgIElmIHlvdSBhcmUgdW5zdXJlIGFzIHRvIHdoZXRoZXIgdGhpcyBpcyByZXF1aXJlZCwgYW5zd2VyIE4uCisKK2NvbmZpZyBFTkNSWVBURURfS0VZUworCXRyaXN0YXRlICJFTkNSWVBURUQgS0VZUyIKKwlkZXBlbmRzIG9uIEtFWVMgJiYgVFJVU1RFRF9LRVlTCisJc2VsZWN0IENSWVBUT19BRVMKKwlzZWxlY3QgQ1JZUFRPX0NCQworCXNlbGVjdCBDUllQVE9fU0hBMjU2CisJc2VsZWN0IENSWVBUT19STkcKKwloZWxwCisJICBUaGlzIG9wdGlvbiBwcm92aWRlcyBzdXBwb3J0IGZvciBjcmVhdGUvZW5jcnlwdGluZy9kZWNyeXB0aW5nIGtleXMKKwkgIGluIHRoZSBrZXJuZWwuICBFbmNyeXB0ZWQga2V5cyBhcmUga2VybmVsIGdlbmVyYXRlZCByYW5kb20gbnVtYmVycywKKwkgIHdoaWNoIGFyZSBlbmNyeXB0ZWQvZGVjcnlwdGVkIHdpdGggYSAnbWFzdGVyJyBzeW1tZXRyaWMga2V5LiBUaGUKKwkgICdtYXN0ZXInIGtleSBjYW4gYmUgZWl0aGVyIGEgdHJ1c3RlZC1rZXkgb3IgdXNlci1rZXkgdHlwZS4KKwkgIFVzZXJzcGFjZSBvbmx5IGV2ZXIgc2Vlcy9zdG9yZXMgZW5jcnlwdGVkIGJsb2JzLgorCisJICBJZiB5b3UgYXJlIHVuc3VyZSBhcyB0byB3aGV0aGVyIHRoaXMgaXMgcmVxdWlyZWQsIGFuc3dlciBOLgorCiBjb25maWcgS0VZU19ERUJVR19QUk9DX0tFWVMKIAlib29sICJFbmFibGUgdGhlIC9wcm9jL2tleXMgZmlsZSBieSB3aGljaCBrZXlzIG1heSBiZSB2aWV3ZWQiCiAJZGVwZW5kcyBvbiBLRVlTCmRpZmYgLS1naXQgYS9zZWN1cml0eS9hcHBhcm1vci9pbmNsdWRlL2ZpbGUuaCBiL3NlY3VyaXR5L2FwcGFybW9yL2luY2x1ZGUvZmlsZS5oCmluZGV4IGJlMzZmZWEuLmFiOGM2ZDggMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L2FwcGFybW9yL2luY2x1ZGUvZmlsZS5oCisrKyBiL3NlY3VyaXR5L2FwcGFybW9yL2luY2x1ZGUvZmlsZS5oCkBAIC0xNSwxMiArMTUsMTEgQEAKICNpZm5kZWYgX19BQV9GSUxFX0gKICNkZWZpbmUgX19BQV9GSUxFX0gKIAotI2luY2x1ZGUgPGxpbnV4L3BhdGguaD4KLQogI2luY2x1ZGUgImRvbWFpbi5oIgogI2luY2x1ZGUgIm1hdGNoLmgiCiAKIHN0cnVjdCBhYV9wcm9maWxlOworc3RydWN0IHBhdGg7CiAKIC8qCiAgKiBXZSB1c2UgTUFZX0VYRUMsIE1BWV9XUklURSwgTUFZX1JFQUQsIE1BWV9BUFBFTkQgYW5kIHRoZSBmb2xsb3dpbmcgZmxhZ3MKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L2FwcGFybW9yL2luY2x1ZGUvbWF0Y2guaCBiL3NlY3VyaXR5L2FwcGFybW9yL2luY2x1ZGUvbWF0Y2guaAppbmRleCA3MzRhNmQzLi4xOWJhMTZlIDEwMDY0NAotLS0gYS9zZWN1cml0eS9hcHBhcm1vci9pbmNsdWRlL21hdGNoLmgKKysrIGIvc2VjdXJpdHkvYXBwYXJtb3IvaW5jbHVkZS9tYXRjaC5oCkBAIC0xNSw2ICsxNSw3IEBACiAjaWZuZGVmIF9fQUFfTUFUQ0hfSAogI2RlZmluZSBfX0FBX01BVENIX0gKIAorI2luY2x1ZGUgPGxpbnV4L2tyZWYuaD4KICNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KIAogI2RlZmluZSBERkFfTk9NQVRDSAkJCTAKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L2tleXMvTWFrZWZpbGUgYi9zZWN1cml0eS9rZXlzL01ha2VmaWxlCmluZGV4IDc0ZDU0NDcuLjZjOTQxMDUgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L2tleXMvTWFrZWZpbGUKKysrIGIvc2VjdXJpdHkva2V5cy9NYWtlZmlsZQpAQCAtMTMsNiArMTMsOCBAQAogCXJlcXVlc3Rfa2V5X2F1dGgubyBcCiAJdXNlcl9kZWZpbmVkLm8KIAorb2JqLSQoQ09ORklHX1RSVVNURURfS0VZUykgKz0gdHJ1c3RlZF9kZWZpbmVkLm8KK29iai0kKENPTkZJR19FTkNSWVBURURfS0VZUykgKz0gZW5jcnlwdGVkX2RlZmluZWQubwogb2JqLSQoQ09ORklHX0tFWVNfQ09NUEFUKSArPSBjb21wYXQubwogb2JqLSQoQ09ORklHX1BST0NfRlMpICs9IHByb2Mubwogb2JqLSQoQ09ORklHX1NZU0NUTCkgKz0gc3lzY3RsLm8KZGlmZiAtLWdpdCBhL3NlY3VyaXR5L2tleXMvZW5jcnlwdGVkX2RlZmluZWQuYyBiL3NlY3VyaXR5L2tleXMvZW5jcnlwdGVkX2RlZmluZWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMmQyN2M4Ci0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJpdHkva2V5cy9lbmNyeXB0ZWRfZGVmaW5lZC5jCkBAIC0wLDAgKzEsOTAzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIElCTSBDb3Jwb3JhdGlvbgorICoKKyAqIEF1dGhvcjoKKyAqIE1pbWkgWm9oYXIgPHpvaGFyQHVzLmlibS5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UuCisgKgorICogU2VlIERvY3VtZW50YXRpb24va2V5cy10cnVzdGVkLWVuY3J5cHRlZC50eHQKKyAqLworCisjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvcGFyc2VyLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8a2V5cy91c2VyLXR5cGUuaD4KKyNpbmNsdWRlIDxrZXlzL3RydXN0ZWQtdHlwZS5oPgorI2luY2x1ZGUgPGtleXMvZW5jcnlwdGVkLXR5cGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXktdHlwZS5oPgorI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgorI2luY2x1ZGUgPGxpbnV4L3JjdXBkYXRlLmg+CisjaW5jbHVkZSA8bGludXgvc2NhdHRlcmxpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9jcnlwdG8uaD4KKyNpbmNsdWRlIDxjcnlwdG8vaGFzaC5oPgorI2luY2x1ZGUgPGNyeXB0by9zaGEuaD4KKyNpbmNsdWRlIDxjcnlwdG8vYWVzLmg+CisKKyNpbmNsdWRlICJlbmNyeXB0ZWRfZGVmaW5lZC5oIgorCitzdGF0aWMgY29uc3QgY2hhciBLRVlfVFJVU1RFRF9QUkVGSVhbXSA9ICJ0cnVzdGVkOiI7CitzdGF0aWMgY29uc3QgY2hhciBLRVlfVVNFUl9QUkVGSVhbXSA9ICJ1c2VyOiI7CitzdGF0aWMgY29uc3QgY2hhciBoYXNoX2FsZ1tdID0gInNoYTI1NiI7CitzdGF0aWMgY29uc3QgY2hhciBobWFjX2FsZ1tdID0gImhtYWMoc2hhMjU2KSI7CitzdGF0aWMgY29uc3QgY2hhciBibGtjaXBoZXJfYWxnW10gPSAiY2JjKGFlcykiOworc3RhdGljIHVuc2lnbmVkIGludCBpdnNpemU7CitzdGF0aWMgaW50IGJsa3NpemU7CisKKyNkZWZpbmUgS0VZX1RSVVNURURfUFJFRklYX0xFTiAoc2l6ZW9mIChLRVlfVFJVU1RFRF9QUkVGSVgpIC0gMSkKKyNkZWZpbmUgS0VZX1VTRVJfUFJFRklYX0xFTiAoc2l6ZW9mIChLRVlfVVNFUl9QUkVGSVgpIC0gMSkKKyNkZWZpbmUgSEFTSF9TSVpFIFNIQTI1Nl9ESUdFU1RfU0laRQorI2RlZmluZSBNQVhfREFUQV9TSVpFIDQwOTYKKyNkZWZpbmUgTUlOX0RBVEFfU0laRSAgMjAKKworc3RydWN0IHNkZXNjIHsKKwlzdHJ1Y3Qgc2hhc2hfZGVzYyBzaGFzaDsKKwljaGFyIGN0eFtdOworfTsKKworc3RhdGljIHN0cnVjdCBjcnlwdG9fc2hhc2ggKmhhc2hhbGc7CitzdGF0aWMgc3RydWN0IGNyeXB0b19zaGFzaCAqaG1hY2FsZzsKKworZW51bSB7CisJT3B0X2VyciA9IC0xLCBPcHRfbmV3LCBPcHRfbG9hZCwgT3B0X3VwZGF0ZQorfTsKKworc3RhdGljIGNvbnN0IG1hdGNoX3RhYmxlX3Qga2V5X3Rva2VucyA9IHsKKwl7T3B0X25ldywgIm5ldyJ9LAorCXtPcHRfbG9hZCwgImxvYWQifSwKKwl7T3B0X3VwZGF0ZSwgInVwZGF0ZSJ9LAorCXtPcHRfZXJyLCBOVUxMfQorfTsKKworc3RhdGljIGludCBhZXNfZ2V0X3NpemVzKHZvaWQpCit7CisJc3RydWN0IGNyeXB0b19ibGtjaXBoZXIgKnRmbTsKKworCXRmbSA9IGNyeXB0b19hbGxvY19ibGtjaXBoZXIoYmxrY2lwaGVyX2FsZywgMCwgQ1JZUFRPX0FMR19BU1lOQyk7CisJaWYgKElTX0VSUih0Zm0pKSB7CisJCXByX2VycigiZW5jcnlwdGVkX2tleTogZmFpbGVkIHRvIGFsbG9jX2NpcGhlciAoJWxkKVxuIiwKKwkJICAgICAgIFBUUl9FUlIodGZtKSk7CisJCXJldHVybiBQVFJfRVJSKHRmbSk7CisJfQorCWl2c2l6ZSA9IGNyeXB0b19ibGtjaXBoZXJfaXZzaXplKHRmbSk7CisJYmxrc2l6ZSA9IGNyeXB0b19ibGtjaXBoZXJfYmxvY2tzaXplKHRmbSk7CisJY3J5cHRvX2ZyZWVfYmxrY2lwaGVyKHRmbSk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiB2YWxpZF9tYXN0ZXJfZGVzYyAtIHZlcmlmeSB0aGUgJ2tleS10eXBlOmRlc2MnIG9mIGEgbmV3L3VwZGF0ZWQgbWFzdGVyLWtleQorICoKKyAqIGtleS10eXBlOj0gInRydXN0ZWQ6IiB8ICJlbmNyeXB0ZWQ6IgorICogZGVzYzo9IG1hc3Rlci1rZXkgZGVzY3JpcHRpb24KKyAqCisgKiBWZXJpZnkgdGhhdCAna2V5LXR5cGUnIGlzIHZhbGlkIGFuZCB0aGF0ICdkZXNjJyBleGlzdHMuIE9uIGtleSB1cGRhdGUsCisgKiBvbmx5IHRoZSBtYXN0ZXIga2V5IGRlc2NyaXB0aW9uIGlzIHBlcm1pdHRlZCB0byBjaGFuZ2UsIG5vdCB0aGUga2V5LXR5cGUuCisgKiBUaGUga2V5LXR5cGUgcmVtYWlucyBjb25zdGFudC4KKyAqCisgKiBPbiBzdWNjZXNzIHJldHVybnMgMCwgb3RoZXJ3aXNlIC1FSU5WQUwuCisgKi8KK3N0YXRpYyBpbnQgdmFsaWRfbWFzdGVyX2Rlc2MoY29uc3QgY2hhciAqbmV3X2Rlc2MsIGNvbnN0IGNoYXIgKm9yaWdfZGVzYykKK3sKKwlpZiAoIW1lbWNtcChuZXdfZGVzYywgS0VZX1RSVVNURURfUFJFRklYLCBLRVlfVFJVU1RFRF9QUkVGSVhfTEVOKSkgeworCQlpZiAoc3RybGVuKG5ld19kZXNjKSA9PSBLRVlfVFJVU1RFRF9QUkVGSVhfTEVOKQorCQkJZ290byBvdXQ7CisJCWlmIChvcmlnX2Rlc2MpCisJCQlpZiAobWVtY21wKG5ld19kZXNjLCBvcmlnX2Rlc2MsIEtFWV9UUlVTVEVEX1BSRUZJWF9MRU4pKQorCQkJCWdvdG8gb3V0OworCX0gZWxzZSBpZiAoIW1lbWNtcChuZXdfZGVzYywgS0VZX1VTRVJfUFJFRklYLCBLRVlfVVNFUl9QUkVGSVhfTEVOKSkgeworCQlpZiAoc3RybGVuKG5ld19kZXNjKSA9PSBLRVlfVVNFUl9QUkVGSVhfTEVOKQorCQkJZ290byBvdXQ7CisJCWlmIChvcmlnX2Rlc2MpCisJCQlpZiAobWVtY21wKG5ld19kZXNjLCBvcmlnX2Rlc2MsIEtFWV9VU0VSX1BSRUZJWF9MRU4pKQorCQkJCWdvdG8gb3V0OworCX0gZWxzZQorCQlnb3RvIG91dDsKKwlyZXR1cm4gMDsKK291dDoKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworLyoKKyAqIGRhdGFibG9iX3BhcnNlIC0gcGFyc2UgdGhlIGtleWN0bCBkYXRhCisgKgorICogZGF0YWJsb2IgZm9ybWF0OgorICogbmV3IDxtYXN0ZXIta2V5IG5hbWU+IDxkZWNyeXB0ZWQgZGF0YSBsZW5ndGg+CisgKiBsb2FkIDxtYXN0ZXIta2V5IG5hbWU+IDxkZWNyeXB0ZWQgZGF0YSBsZW5ndGg+IDxlbmNyeXB0ZWQgaXYgKyBkYXRhPgorICogdXBkYXRlIDxuZXctbWFzdGVyLWtleSBuYW1lPgorICoKKyAqIFRva2VuaXplcyBhIGNvcHkgb2YgdGhlIGtleWN0bCBkYXRhLCByZXR1cm5pbmcgYSBwb2ludGVyIHRvIGVhY2ggdG9rZW4sCisgKiB3aGljaCBpcyBudWxsIHRlcm1pbmF0ZWQuCisgKgorICogT24gc3VjY2VzcyByZXR1cm5zIDAsIG90aGVyd2lzZSAtRUlOVkFMLgorICovCitzdGF0aWMgaW50IGRhdGFibG9iX3BhcnNlKGNoYXIgKmRhdGFibG9iLCBjaGFyICoqbWFzdGVyX2Rlc2MsCisJCQkgIGNoYXIgKipkZWNyeXB0ZWRfZGF0YWxlbiwgY2hhciAqKmhleF9lbmNvZGVkX2l2KQoreworCXN1YnN0cmluZ190IGFyZ3NbTUFYX09QVF9BUkdTXTsKKwlpbnQgcmV0ID0gLUVJTlZBTDsKKwlpbnQga2V5X2NtZDsKKwljaGFyICpwOworCisJcCA9IHN0cnNlcCgmZGF0YWJsb2IsICIgXHQiKTsKKwlpZiAoIXApCisJCXJldHVybiByZXQ7CisJa2V5X2NtZCA9IG1hdGNoX3Rva2VuKHAsIGtleV90b2tlbnMsIGFyZ3MpOworCisJKm1hc3Rlcl9kZXNjID0gc3Ryc2VwKCZkYXRhYmxvYiwgIiBcdCIpOworCWlmICghKm1hc3Rlcl9kZXNjKQorCQlnb3RvIG91dDsKKworCWlmICh2YWxpZF9tYXN0ZXJfZGVzYygqbWFzdGVyX2Rlc2MsIE5VTEwpIDwgMCkKKwkJZ290byBvdXQ7CisKKwlpZiAoZGVjcnlwdGVkX2RhdGFsZW4pIHsKKwkJKmRlY3J5cHRlZF9kYXRhbGVuID0gc3Ryc2VwKCZkYXRhYmxvYiwgIiBcdCIpOworCQlpZiAoISpkZWNyeXB0ZWRfZGF0YWxlbikKKwkJCWdvdG8gb3V0OworCX0KKworCXN3aXRjaCAoa2V5X2NtZCkgeworCWNhc2UgT3B0X25ldzoKKwkJaWYgKCFkZWNyeXB0ZWRfZGF0YWxlbikKKwkJCWJyZWFrOworCQlyZXQgPSAwOworCQlicmVhazsKKwljYXNlIE9wdF9sb2FkOgorCQlpZiAoIWRlY3J5cHRlZF9kYXRhbGVuKQorCQkJYnJlYWs7CisJCSpoZXhfZW5jb2RlZF9pdiA9IHN0cnNlcCgmZGF0YWJsb2IsICIgXHQiKTsKKwkJaWYgKCEqaGV4X2VuY29kZWRfaXYpCisJCQlicmVhazsKKwkJcmV0ID0gMDsKKwkJYnJlYWs7CisJY2FzZSBPcHRfdXBkYXRlOgorCQlpZiAoZGVjcnlwdGVkX2RhdGFsZW4pCisJCQlicmVhazsKKwkJcmV0ID0gMDsKKwkJYnJlYWs7CisJY2FzZSBPcHRfZXJyOgorCQlicmVhazsKKwl9CitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIGRhdGFibG9iX2Zvcm1hdCAtIGZvcm1hdCBhcyBhbiBhc2NpaSBzdHJpbmcsIGJlZm9yZSBjb3B5aW5nIHRvIHVzZXJzcGFjZQorICovCitzdGF0aWMgY2hhciAqZGF0YWJsb2JfZm9ybWF0KHN0cnVjdCBlbmNyeXB0ZWRfa2V5X3BheWxvYWQgKmVwYXlsb2FkLAorCQkJICAgICBzaXplX3QgYXNjaWlibG9iX2xlbikKK3sKKwljaGFyICphc2NpaV9idWYsICpidWZwOworCXU4ICppdiA9IGVwYXlsb2FkLT5pdjsKKwlpbnQgbGVuOworCWludCBpOworCisJYXNjaWlfYnVmID0ga21hbGxvYyhhc2NpaWJsb2JfbGVuICsgMSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFhc2NpaV9idWYpCisJCWdvdG8gb3V0OworCisJYXNjaWlfYnVmW2FzY2lpYmxvYl9sZW5dID0gJ1wwJzsKKworCS8qIGNvcHkgZGF0YWJsb2IgbWFzdGVyX2Rlc2MgYW5kIGRhdGFsZW4gc3RyaW5ncyAqLworCWxlbiA9IHNwcmludGYoYXNjaWlfYnVmLCAiJXMgJXMgIiwgZXBheWxvYWQtPm1hc3Rlcl9kZXNjLAorCQkgICAgICBlcGF5bG9hZC0+ZGF0YWxlbik7CisKKwkvKiBjb252ZXJ0IHRoZSBoZXggZW5jb2RlZCBpdiwgZW5jcnlwdGVkLWRhdGEgYW5kIEhNQUMgdG8gYXNjaWkgKi8KKwlidWZwID0gJmFzY2lpX2J1ZltsZW5dOworCWZvciAoaSA9IDA7IGkgPCAoYXNjaWlibG9iX2xlbiAtIGxlbikgLyAyOyBpKyspCisJCWJ1ZnAgPSBwYWNrX2hleF9ieXRlKGJ1ZnAsIGl2W2ldKTsKK291dDoKKwlyZXR1cm4gYXNjaWlfYnVmOworfQorCisvKgorICogcmVxdWVzdF90cnVzdGVkX2tleSAtIHJlcXVlc3QgdGhlIHRydXN0ZWQga2V5CisgKgorICogVHJ1c3RlZCBrZXlzIGFyZSBzZWFsZWQgdG8gUENScyBhbmQgb3RoZXIgbWV0YWRhdGEuIEFsdGhvdWdoIHVzZXJzcGFjZQorICogbWFuYWdlcyBib3RoIHRydXN0ZWQvZW5jcnlwdGVkIGtleS10eXBlcywgbGlrZSB0aGUgZW5jcnlwdGVkIGtleSB0eXBlCisgKiBkYXRhLCB0cnVzdGVkIGtleSB0eXBlIGRhdGEgaXMgbm90IHZpc2libGUgZGVjcnlwdGVkIGZyb20gdXNlcnNwYWNlLgorICovCitzdGF0aWMgc3RydWN0IGtleSAqcmVxdWVzdF90cnVzdGVkX2tleShjb25zdCBjaGFyICp0cnVzdGVkX2Rlc2MsCisJCQkJICAgICAgIHU4ICoqbWFzdGVyX2tleSwgc2l6ZV90ICptYXN0ZXJfa2V5bGVuKQoreworCXN0cnVjdCB0cnVzdGVkX2tleV9wYXlsb2FkICp0cGF5bG9hZDsKKwlzdHJ1Y3Qga2V5ICp0a2V5OworCisJdGtleSA9IHJlcXVlc3Rfa2V5KCZrZXlfdHlwZV90cnVzdGVkLCB0cnVzdGVkX2Rlc2MsIE5VTEwpOworCWlmIChJU19FUlIodGtleSkpCisJCWdvdG8gZXJyb3I7CisKKwlkb3duX3JlYWQoJnRrZXktPnNlbSk7CisJdHBheWxvYWQgPSByY3VfZGVyZWZlcmVuY2UodGtleS0+cGF5bG9hZC5kYXRhKTsKKwkqbWFzdGVyX2tleSA9IHRwYXlsb2FkLT5rZXk7CisJKm1hc3Rlcl9rZXlsZW4gPSB0cGF5bG9hZC0+a2V5X2xlbjsKK2Vycm9yOgorCXJldHVybiB0a2V5OworfQorCisvKgorICogcmVxdWVzdF91c2VyX2tleSAtIHJlcXVlc3QgdGhlIHVzZXIga2V5CisgKgorICogVXNlIGEgdXNlciBwcm92aWRlZCBrZXkgdG8gZW5jcnlwdC9kZWNyeXB0IGFuIGVuY3J5cHRlZC1rZXkuCisgKi8KK3N0YXRpYyBzdHJ1Y3Qga2V5ICpyZXF1ZXN0X3VzZXJfa2V5KGNvbnN0IGNoYXIgKm1hc3Rlcl9kZXNjLCB1OCAqKm1hc3Rlcl9rZXksCisJCQkJICAgIHNpemVfdCAqbWFzdGVyX2tleWxlbikKK3sKKwlzdHJ1Y3QgdXNlcl9rZXlfcGF5bG9hZCAqdXBheWxvYWQ7CisJc3RydWN0IGtleSAqdWtleTsKKworCXVrZXkgPSByZXF1ZXN0X2tleSgma2V5X3R5cGVfdXNlciwgbWFzdGVyX2Rlc2MsIE5VTEwpOworCWlmIChJU19FUlIodWtleSkpCisJCWdvdG8gZXJyb3I7CisKKwlkb3duX3JlYWQoJnVrZXktPnNlbSk7CisJdXBheWxvYWQgPSByY3VfZGVyZWZlcmVuY2UodWtleS0+cGF5bG9hZC5kYXRhKTsKKwkqbWFzdGVyX2tleSA9IHVwYXlsb2FkLT5kYXRhOworCSptYXN0ZXJfa2V5bGVuID0gdXBheWxvYWQtPmRhdGFsZW47CitlcnJvcjoKKwlyZXR1cm4gdWtleTsKK30KKworc3RhdGljIHN0cnVjdCBzZGVzYyAqYWxsb2Nfc2Rlc2Moc3RydWN0IGNyeXB0b19zaGFzaCAqYWxnKQoreworCXN0cnVjdCBzZGVzYyAqc2Rlc2M7CisJaW50IHNpemU7CisKKwlzaXplID0gc2l6ZW9mKHN0cnVjdCBzaGFzaF9kZXNjKSArIGNyeXB0b19zaGFzaF9kZXNjc2l6ZShhbGcpOworCXNkZXNjID0ga21hbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXNkZXNjKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwlzZGVzYy0+c2hhc2gudGZtID0gYWxnOworCXNkZXNjLT5zaGFzaC5mbGFncyA9IDB4MDsKKwlyZXR1cm4gc2Rlc2M7Cit9CisKK3N0YXRpYyBpbnQgY2FsY19obWFjKHU4ICpkaWdlc3QsIGNvbnN0IHU4ICprZXksIHVuc2lnbmVkIGludCBrZXlsZW4sCisJCSAgICAgY29uc3QgdTggKmJ1ZiwgdW5zaWduZWQgaW50IGJ1ZmxlbikKK3sKKwlzdHJ1Y3Qgc2Rlc2MgKnNkZXNjOworCWludCByZXQ7CisKKwlzZGVzYyA9IGFsbG9jX3NkZXNjKGhtYWNhbGcpOworCWlmIChJU19FUlIoc2Rlc2MpKSB7CisJCXByX2luZm8oImVuY3J5cHRlZF9rZXk6IGNhbid0IGFsbG9jICVzXG4iLCBobWFjX2FsZyk7CisJCXJldHVybiBQVFJfRVJSKHNkZXNjKTsKKwl9CisKKwlyZXQgPSBjcnlwdG9fc2hhc2hfc2V0a2V5KGhtYWNhbGcsIGtleSwga2V5bGVuKTsKKwlpZiAoIXJldCkKKwkJcmV0ID0gY3J5cHRvX3NoYXNoX2RpZ2VzdCgmc2Rlc2MtPnNoYXNoLCBidWYsIGJ1ZmxlbiwgZGlnZXN0KTsKKwlrZnJlZShzZGVzYyk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBjYWxjX2hhc2godTggKmRpZ2VzdCwgY29uc3QgdTggKmJ1ZiwgdW5zaWduZWQgaW50IGJ1ZmxlbikKK3sKKwlzdHJ1Y3Qgc2Rlc2MgKnNkZXNjOworCWludCByZXQ7CisKKwlzZGVzYyA9IGFsbG9jX3NkZXNjKGhhc2hhbGcpOworCWlmIChJU19FUlIoc2Rlc2MpKSB7CisJCXByX2luZm8oImVuY3J5cHRlZF9rZXk6IGNhbid0IGFsbG9jICVzXG4iLCBoYXNoX2FsZyk7CisJCXJldHVybiBQVFJfRVJSKHNkZXNjKTsKKwl9CisKKwlyZXQgPSBjcnlwdG9fc2hhc2hfZGlnZXN0KCZzZGVzYy0+c2hhc2gsIGJ1ZiwgYnVmbGVuLCBkaWdlc3QpOworCWtmcmVlKHNkZXNjKTsKKwlyZXR1cm4gcmV0OworfQorCitlbnVtIGRlcml2ZWRfa2V5X3R5cGUgeyBFTkNfS0VZLCBBVVRIX0tFWSB9OworCisvKiBEZXJpdmUgYXV0aGVudGljYXRpb24vZW5jcnlwdGlvbiBrZXkgZnJvbSB0cnVzdGVkIGtleSAqLworc3RhdGljIGludCBnZXRfZGVyaXZlZF9rZXkodTggKmRlcml2ZWRfa2V5LCBlbnVtIGRlcml2ZWRfa2V5X3R5cGUga2V5X3R5cGUsCisJCQkgICBjb25zdCB1OCAqbWFzdGVyX2tleSwgc2l6ZV90IG1hc3Rlcl9rZXlsZW4pCit7CisJdTggKmRlcml2ZWRfYnVmOworCXVuc2lnbmVkIGludCBkZXJpdmVkX2J1Zl9sZW47CisJaW50IHJldDsKKworCWRlcml2ZWRfYnVmX2xlbiA9IHN0cmxlbigiQVVUSF9LRVkiKSArIDEgKyBtYXN0ZXJfa2V5bGVuOworCWlmIChkZXJpdmVkX2J1Zl9sZW4gPCBIQVNIX1NJWkUpCisJCWRlcml2ZWRfYnVmX2xlbiA9IEhBU0hfU0laRTsKKworCWRlcml2ZWRfYnVmID0ga3phbGxvYyhkZXJpdmVkX2J1Zl9sZW4sIEdGUF9LRVJORUwpOworCWlmICghZGVyaXZlZF9idWYpIHsKKwkJcHJfZXJyKCJlbmNyeXB0ZWRfa2V5OiBvdXQgb2YgbWVtb3J5XG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCWlmIChrZXlfdHlwZSkKKwkJc3RyY3B5KGRlcml2ZWRfYnVmLCAiQVVUSF9LRVkiKTsKKwllbHNlCisJCXN0cmNweShkZXJpdmVkX2J1ZiwgIkVOQ19LRVkiKTsKKworCW1lbWNweShkZXJpdmVkX2J1ZiArIHN0cmxlbihkZXJpdmVkX2J1ZikgKyAxLCBtYXN0ZXJfa2V5LAorCSAgICAgICBtYXN0ZXJfa2V5bGVuKTsKKwlyZXQgPSBjYWxjX2hhc2goZGVyaXZlZF9rZXksIGRlcml2ZWRfYnVmLCBkZXJpdmVkX2J1Zl9sZW4pOworCWtmcmVlKGRlcml2ZWRfYnVmKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGluaXRfYmxrY2lwaGVyX2Rlc2Moc3RydWN0IGJsa2NpcGhlcl9kZXNjICpkZXNjLCBjb25zdCB1OCAqa2V5LAorCQkJICAgICAgIHVuc2lnbmVkIGludCBrZXlfbGVuLCBjb25zdCB1OCAqaXYsCisJCQkgICAgICAgdW5zaWduZWQgaW50IGl2c2l6ZSkKK3sKKwlpbnQgcmV0OworCisJZGVzYy0+dGZtID0gY3J5cHRvX2FsbG9jX2Jsa2NpcGhlcihibGtjaXBoZXJfYWxnLCAwLCBDUllQVE9fQUxHX0FTWU5DKTsKKwlpZiAoSVNfRVJSKGRlc2MtPnRmbSkpIHsKKwkJcHJfZXJyKCJlbmNyeXB0ZWRfa2V5OiBmYWlsZWQgdG8gbG9hZCAlcyB0cmFuc2Zvcm0gKCVsZClcbiIsCisJCSAgICAgICBibGtjaXBoZXJfYWxnLCBQVFJfRVJSKGRlc2MtPnRmbSkpOworCQlyZXR1cm4gUFRSX0VSUihkZXNjLT50Zm0pOworCX0KKwlkZXNjLT5mbGFncyA9IDA7CisKKwlyZXQgPSBjcnlwdG9fYmxrY2lwaGVyX3NldGtleShkZXNjLT50Zm0sIGtleSwga2V5X2xlbik7CisJaWYgKHJldCA8IDApIHsKKwkJcHJfZXJyKCJlbmNyeXB0ZWRfa2V5OiBmYWlsZWQgdG8gc2V0a2V5ICglZClcbiIsIHJldCk7CisJCWNyeXB0b19mcmVlX2Jsa2NpcGhlcihkZXNjLT50Zm0pOworCQlyZXR1cm4gcmV0OworCX0KKwljcnlwdG9fYmxrY2lwaGVyX3NldF9pdihkZXNjLT50Zm0sIGl2LCBpdnNpemUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGtleSAqcmVxdWVzdF9tYXN0ZXJfa2V5KHN0cnVjdCBlbmNyeXB0ZWRfa2V5X3BheWxvYWQgKmVwYXlsb2FkLAorCQkJCSAgICAgIHU4ICoqbWFzdGVyX2tleSwgc2l6ZV90ICptYXN0ZXJfa2V5bGVuKQoreworCXN0cnVjdCBrZXkgKm1rZXkgPSBOVUxMOworCisJaWYgKCFzdHJuY21wKGVwYXlsb2FkLT5tYXN0ZXJfZGVzYywgS0VZX1RSVVNURURfUFJFRklYLAorCQkgICAgIEtFWV9UUlVTVEVEX1BSRUZJWF9MRU4pKSB7CisJCW1rZXkgPSByZXF1ZXN0X3RydXN0ZWRfa2V5KGVwYXlsb2FkLT5tYXN0ZXJfZGVzYyArCisJCQkJCSAgIEtFWV9UUlVTVEVEX1BSRUZJWF9MRU4sCisJCQkJCSAgIG1hc3Rlcl9rZXksIG1hc3Rlcl9rZXlsZW4pOworCX0gZWxzZSBpZiAoIXN0cm5jbXAoZXBheWxvYWQtPm1hc3Rlcl9kZXNjLCBLRVlfVVNFUl9QUkVGSVgsCisJCQkgICAgS0VZX1VTRVJfUFJFRklYX0xFTikpIHsKKwkJbWtleSA9IHJlcXVlc3RfdXNlcl9rZXkoZXBheWxvYWQtPm1hc3Rlcl9kZXNjICsKKwkJCQkJS0VZX1VTRVJfUFJFRklYX0xFTiwKKwkJCQkJbWFzdGVyX2tleSwgbWFzdGVyX2tleWxlbik7CisJfSBlbHNlCisJCWdvdG8gb3V0OworCisJaWYgKElTX0VSUihta2V5KSkKKwkJcHJfaW5mbygiZW5jcnlwdGVkX2tleToga2V5ICVzIG5vdCBmb3VuZCIsCisJCQllcGF5bG9hZC0+bWFzdGVyX2Rlc2MpOworCWlmIChta2V5KQorCQlkdW1wX21hc3Rlcl9rZXkoKm1hc3Rlcl9rZXksICptYXN0ZXJfa2V5bGVuKTsKK291dDoKKwlyZXR1cm4gbWtleTsKK30KKworLyogQmVmb3JlIHJldHVybmluZyBkYXRhIHRvIHVzZXJzcGFjZSwgZW5jcnlwdCBkZWNyeXB0ZWQgZGF0YS4gKi8KK3N0YXRpYyBpbnQgZGVyaXZlZF9rZXlfZW5jcnlwdChzdHJ1Y3QgZW5jcnlwdGVkX2tleV9wYXlsb2FkICplcGF5bG9hZCwKKwkJCSAgICAgICBjb25zdCB1OCAqZGVyaXZlZF9rZXksCisJCQkgICAgICAgdW5zaWduZWQgaW50IGRlcml2ZWRfa2V5bGVuKQoreworCXN0cnVjdCBzY2F0dGVybGlzdCBzZ19pblsyXTsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3Qgc2dfb3V0WzFdOworCXN0cnVjdCBibGtjaXBoZXJfZGVzYyBkZXNjOworCXVuc2lnbmVkIGludCBlbmNyeXB0ZWRfZGF0YWxlbjsKKwl1bnNpZ25lZCBpbnQgcGFkbGVuOworCWNoYXIgcGFkWzE2XTsKKwlpbnQgcmV0OworCisJZW5jcnlwdGVkX2RhdGFsZW4gPSByb3VuZHVwKGVwYXlsb2FkLT5kZWNyeXB0ZWRfZGF0YWxlbiwgYmxrc2l6ZSk7CisJcGFkbGVuID0gZW5jcnlwdGVkX2RhdGFsZW4gLSBlcGF5bG9hZC0+ZGVjcnlwdGVkX2RhdGFsZW47CisKKwlyZXQgPSBpbml0X2Jsa2NpcGhlcl9kZXNjKCZkZXNjLCBkZXJpdmVkX2tleSwgZGVyaXZlZF9rZXlsZW4sCisJCQkJICBlcGF5bG9hZC0+aXYsIGl2c2l6ZSk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0OworCWR1bXBfZGVjcnlwdGVkX2RhdGEoZXBheWxvYWQpOworCisJbWVtc2V0KHBhZCwgMCwgc2l6ZW9mIHBhZCk7CisJc2dfaW5pdF90YWJsZShzZ19pbiwgMik7CisJc2dfc2V0X2J1Zigmc2dfaW5bMF0sIGVwYXlsb2FkLT5kZWNyeXB0ZWRfZGF0YSwKKwkJICAgZXBheWxvYWQtPmRlY3J5cHRlZF9kYXRhbGVuKTsKKwlzZ19zZXRfYnVmKCZzZ19pblsxXSwgcGFkLCBwYWRsZW4pOworCisJc2dfaW5pdF90YWJsZShzZ19vdXQsIDEpOworCXNnX3NldF9idWYoc2dfb3V0LCBlcGF5bG9hZC0+ZW5jcnlwdGVkX2RhdGEsIGVuY3J5cHRlZF9kYXRhbGVuKTsKKworCXJldCA9IGNyeXB0b19ibGtjaXBoZXJfZW5jcnlwdCgmZGVzYywgc2dfb3V0LCBzZ19pbiwgZW5jcnlwdGVkX2RhdGFsZW4pOworCWNyeXB0b19mcmVlX2Jsa2NpcGhlcihkZXNjLnRmbSk7CisJaWYgKHJldCA8IDApCisJCXByX2VycigiZW5jcnlwdGVkX2tleTogZmFpbGVkIHRvIGVuY3J5cHQgKCVkKVxuIiwgcmV0KTsKKwllbHNlCisJCWR1bXBfZW5jcnlwdGVkX2RhdGEoZXBheWxvYWQsIGVuY3J5cHRlZF9kYXRhbGVuKTsKK291dDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGRhdGFibG9iX2htYWNfYXBwZW5kKHN0cnVjdCBlbmNyeXB0ZWRfa2V5X3BheWxvYWQgKmVwYXlsb2FkLAorCQkJCWNvbnN0IHU4ICptYXN0ZXJfa2V5LCBzaXplX3QgbWFzdGVyX2tleWxlbikKK3sKKwl1OCBkZXJpdmVkX2tleVtIQVNIX1NJWkVdOworCXU4ICpkaWdlc3Q7CisJaW50IHJldDsKKworCXJldCA9IGdldF9kZXJpdmVkX2tleShkZXJpdmVkX2tleSwgQVVUSF9LRVksIG1hc3Rlcl9rZXksIG1hc3Rlcl9rZXlsZW4pOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dDsKKworCWRpZ2VzdCA9IGVwYXlsb2FkLT5tYXN0ZXJfZGVzYyArIGVwYXlsb2FkLT5kYXRhYmxvYl9sZW47CisJcmV0ID0gY2FsY19obWFjKGRpZ2VzdCwgZGVyaXZlZF9rZXksIHNpemVvZiBkZXJpdmVkX2tleSwKKwkJCWVwYXlsb2FkLT5tYXN0ZXJfZGVzYywgZXBheWxvYWQtPmRhdGFibG9iX2xlbik7CisJaWYgKCFyZXQpCisJCWR1bXBfaG1hYyhOVUxMLCBkaWdlc3QsIEhBU0hfU0laRSk7CitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworLyogdmVyaWZ5IEhNQUMgYmVmb3JlIGRlY3J5cHRpbmcgZW5jcnlwdGVkIGtleSAqLworc3RhdGljIGludCBkYXRhYmxvYl9obWFjX3ZlcmlmeShzdHJ1Y3QgZW5jcnlwdGVkX2tleV9wYXlsb2FkICplcGF5bG9hZCwKKwkJCQljb25zdCB1OCAqbWFzdGVyX2tleSwgc2l6ZV90IG1hc3Rlcl9rZXlsZW4pCit7CisJdTggZGVyaXZlZF9rZXlbSEFTSF9TSVpFXTsKKwl1OCBkaWdlc3RbSEFTSF9TSVpFXTsKKwlpbnQgcmV0OworCisJcmV0ID0gZ2V0X2Rlcml2ZWRfa2V5KGRlcml2ZWRfa2V5LCBBVVRIX0tFWSwgbWFzdGVyX2tleSwgbWFzdGVyX2tleWxlbik7CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0OworCisJcmV0ID0gY2FsY19obWFjKGRpZ2VzdCwgZGVyaXZlZF9rZXksIHNpemVvZiBkZXJpdmVkX2tleSwKKwkJCWVwYXlsb2FkLT5tYXN0ZXJfZGVzYywgZXBheWxvYWQtPmRhdGFibG9iX2xlbik7CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0OworCXJldCA9IG1lbWNtcChkaWdlc3QsIGVwYXlsb2FkLT5tYXN0ZXJfZGVzYyArIGVwYXlsb2FkLT5kYXRhYmxvYl9sZW4sCisJCSAgICAgc2l6ZW9mIGRpZ2VzdCk7CisJaWYgKHJldCkgeworCQlyZXQgPSAtRUlOVkFMOworCQlkdW1wX2htYWMoImRhdGFibG9iIiwKKwkJCSAgZXBheWxvYWQtPm1hc3Rlcl9kZXNjICsgZXBheWxvYWQtPmRhdGFibG9iX2xlbiwKKwkJCSAgSEFTSF9TSVpFKTsKKwkJZHVtcF9obWFjKCJjYWxjIiwgZGlnZXN0LCBIQVNIX1NJWkUpOworCX0KK291dDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGRlcml2ZWRfa2V5X2RlY3J5cHQoc3RydWN0IGVuY3J5cHRlZF9rZXlfcGF5bG9hZCAqZXBheWxvYWQsCisJCQkgICAgICAgY29uc3QgdTggKmRlcml2ZWRfa2V5LAorCQkJICAgICAgIHVuc2lnbmVkIGludCBkZXJpdmVkX2tleWxlbikKK3sKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3Qgc2dfaW5bMV07CisJc3RydWN0IHNjYXR0ZXJsaXN0IHNnX291dFsyXTsKKwlzdHJ1Y3QgYmxrY2lwaGVyX2Rlc2MgZGVzYzsKKwl1bnNpZ25lZCBpbnQgZW5jcnlwdGVkX2RhdGFsZW47CisJY2hhciBwYWRbMTZdOworCWludCByZXQ7CisKKwllbmNyeXB0ZWRfZGF0YWxlbiA9IHJvdW5kdXAoZXBheWxvYWQtPmRlY3J5cHRlZF9kYXRhbGVuLCBibGtzaXplKTsKKwlyZXQgPSBpbml0X2Jsa2NpcGhlcl9kZXNjKCZkZXNjLCBkZXJpdmVkX2tleSwgZGVyaXZlZF9rZXlsZW4sCisJCQkJICBlcGF5bG9hZC0+aXYsIGl2c2l6ZSk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0OworCWR1bXBfZW5jcnlwdGVkX2RhdGEoZXBheWxvYWQsIGVuY3J5cHRlZF9kYXRhbGVuKTsKKworCW1lbXNldChwYWQsIDAsIHNpemVvZiBwYWQpOworCXNnX2luaXRfdGFibGUoc2dfaW4sIDEpOworCXNnX2luaXRfdGFibGUoc2dfb3V0LCAyKTsKKwlzZ19zZXRfYnVmKHNnX2luLCBlcGF5bG9hZC0+ZW5jcnlwdGVkX2RhdGEsIGVuY3J5cHRlZF9kYXRhbGVuKTsKKwlzZ19zZXRfYnVmKCZzZ19vdXRbMF0sIGVwYXlsb2FkLT5kZWNyeXB0ZWRfZGF0YSwKKwkJICAgZXBheWxvYWQtPmRlY3J5cHRlZF9kYXRhbGVuKTsKKwlzZ19zZXRfYnVmKCZzZ19vdXRbMV0sIHBhZCwgc2l6ZW9mIHBhZCk7CisKKwlyZXQgPSBjcnlwdG9fYmxrY2lwaGVyX2RlY3J5cHQoJmRlc2MsIHNnX291dCwgc2dfaW4sIGVuY3J5cHRlZF9kYXRhbGVuKTsKKwljcnlwdG9fZnJlZV9ibGtjaXBoZXIoZGVzYy50Zm0pOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dDsKKwlkdW1wX2RlY3J5cHRlZF9kYXRhKGVwYXlsb2FkKTsKK291dDoKKwlyZXR1cm4gcmV0OworfQorCisvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIGRlY3J5cHRlZCBrZXkgYW5kIGRhdGFibG9iLiAqLworc3RhdGljIHN0cnVjdCBlbmNyeXB0ZWRfa2V5X3BheWxvYWQgKmVuY3J5cHRlZF9rZXlfYWxsb2Moc3RydWN0IGtleSAqa2V5LAorCQkJCQkJCSBjb25zdCBjaGFyICptYXN0ZXJfZGVzYywKKwkJCQkJCQkgY29uc3QgY2hhciAqZGF0YWxlbikKK3sKKwlzdHJ1Y3QgZW5jcnlwdGVkX2tleV9wYXlsb2FkICplcGF5bG9hZCA9IE5VTEw7CisJdW5zaWduZWQgc2hvcnQgZGF0YWJsb2JfbGVuOworCXVuc2lnbmVkIHNob3J0IGRlY3J5cHRlZF9kYXRhbGVuOworCXVuc2lnbmVkIGludCBlbmNyeXB0ZWRfZGF0YWxlbjsKKwlsb25nIGRsZW47CisJaW50IHJldDsKKworCXJldCA9IHN0cmljdF9zdHJ0b2woZGF0YWxlbiwgMTAsICZkbGVuKTsKKwlpZiAocmV0IDwgMCB8fCBkbGVuIDwgTUlOX0RBVEFfU0laRSB8fCBkbGVuID4gTUFYX0RBVEFfU0laRSkKKwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisKKwlkZWNyeXB0ZWRfZGF0YWxlbiA9IGRsZW47CisJZW5jcnlwdGVkX2RhdGFsZW4gPSByb3VuZHVwKGRlY3J5cHRlZF9kYXRhbGVuLCBibGtzaXplKTsKKworCWRhdGFibG9iX2xlbiA9IHN0cmxlbihtYXN0ZXJfZGVzYykgKyAxICsgc3RybGVuKGRhdGFsZW4pICsgMQorCSAgICArIGl2c2l6ZSArIDEgKyBlbmNyeXB0ZWRfZGF0YWxlbjsKKworCXJldCA9IGtleV9wYXlsb2FkX3Jlc2VydmUoa2V5LCBkZWNyeXB0ZWRfZGF0YWxlbiArIGRhdGFibG9iX2xlbgorCQkJCSAgKyBIQVNIX1NJWkUgKyAxKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIEVSUl9QVFIocmV0KTsKKworCWVwYXlsb2FkID0ga3phbGxvYyhzaXplb2YoKmVwYXlsb2FkKSArIGRlY3J5cHRlZF9kYXRhbGVuICsKKwkJCSAgIGRhdGFibG9iX2xlbiArIEhBU0hfU0laRSArIDEsIEdGUF9LRVJORUwpOworCWlmICghZXBheWxvYWQpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJZXBheWxvYWQtPmRlY3J5cHRlZF9kYXRhbGVuID0gZGVjcnlwdGVkX2RhdGFsZW47CisJZXBheWxvYWQtPmRhdGFibG9iX2xlbiA9IGRhdGFibG9iX2xlbjsKKwlyZXR1cm4gZXBheWxvYWQ7Cit9CisKK3N0YXRpYyBpbnQgZW5jcnlwdGVkX2tleV9kZWNyeXB0KHN0cnVjdCBlbmNyeXB0ZWRfa2V5X3BheWxvYWQgKmVwYXlsb2FkLAorCQkJCSBjb25zdCBjaGFyICpoZXhfZW5jb2RlZF9pdikKK3sKKwlzdHJ1Y3Qga2V5ICpta2V5OworCXU4IGRlcml2ZWRfa2V5W0hBU0hfU0laRV07CisJdTggKm1hc3Rlcl9rZXk7CisJdTggKmhtYWM7CisJY29uc3QgY2hhciAqaGV4X2VuY29kZWRfZGF0YTsKKwl1bnNpZ25lZCBpbnQgZW5jcnlwdGVkX2RhdGFsZW47CisJc2l6ZV90IG1hc3Rlcl9rZXlsZW47CisJc2l6ZV90IGFzY2lpbGVuOworCWludCByZXQ7CisKKwllbmNyeXB0ZWRfZGF0YWxlbiA9IHJvdW5kdXAoZXBheWxvYWQtPmRlY3J5cHRlZF9kYXRhbGVuLCBibGtzaXplKTsKKwlhc2NpaWxlbiA9IChpdnNpemUgKyAxICsgZW5jcnlwdGVkX2RhdGFsZW4gKyBIQVNIX1NJWkUpICogMjsKKwlpZiAoc3RybGVuKGhleF9lbmNvZGVkX2l2KSAhPSBhc2NpaWxlbikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwloZXhfZW5jb2RlZF9kYXRhID0gaGV4X2VuY29kZWRfaXYgKyAoMiAqIGl2c2l6ZSkgKyAyOworCWhleDJiaW4oZXBheWxvYWQtPml2LCBoZXhfZW5jb2RlZF9pdiwgaXZzaXplKTsKKwloZXgyYmluKGVwYXlsb2FkLT5lbmNyeXB0ZWRfZGF0YSwgaGV4X2VuY29kZWRfZGF0YSwgZW5jcnlwdGVkX2RhdGFsZW4pOworCisJaG1hYyA9IGVwYXlsb2FkLT5tYXN0ZXJfZGVzYyArIGVwYXlsb2FkLT5kYXRhYmxvYl9sZW47CisJaGV4MmJpbihobWFjLCBoZXhfZW5jb2RlZF9kYXRhICsgKGVuY3J5cHRlZF9kYXRhbGVuICogMiksIEhBU0hfU0laRSk7CisKKwlta2V5ID0gcmVxdWVzdF9tYXN0ZXJfa2V5KGVwYXlsb2FkLCAmbWFzdGVyX2tleSwgJm1hc3Rlcl9rZXlsZW4pOworCWlmIChJU19FUlIobWtleSkpCisJCXJldHVybiBQVFJfRVJSKG1rZXkpOworCisJcmV0ID0gZGF0YWJsb2JfaG1hY192ZXJpZnkoZXBheWxvYWQsIG1hc3Rlcl9rZXksIG1hc3Rlcl9rZXlsZW4pOworCWlmIChyZXQgPCAwKSB7CisJCXByX2VycigiZW5jcnlwdGVkX2tleTogYmFkIGhtYWMgKCVkKVxuIiwgcmV0KTsKKwkJZ290byBvdXQ7CisJfQorCisJcmV0ID0gZ2V0X2Rlcml2ZWRfa2V5KGRlcml2ZWRfa2V5LCBFTkNfS0VZLCBtYXN0ZXJfa2V5LCBtYXN0ZXJfa2V5bGVuKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXQ7CisKKwlyZXQgPSBkZXJpdmVkX2tleV9kZWNyeXB0KGVwYXlsb2FkLCBkZXJpdmVkX2tleSwgc2l6ZW9mIGRlcml2ZWRfa2V5KTsKKwlpZiAocmV0IDwgMCkKKwkJcHJfZXJyKCJlbmNyeXB0ZWRfa2V5OiBmYWlsZWQgdG8gZGVjcnlwdCBrZXkgKCVkKVxuIiwgcmV0KTsKK291dDoKKwl1cF9yZWFkKCZta2V5LT5zZW0pOworCWtleV9wdXQobWtleSk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgX19la2V5X2luaXQoc3RydWN0IGVuY3J5cHRlZF9rZXlfcGF5bG9hZCAqZXBheWxvYWQsCisJCQljb25zdCBjaGFyICptYXN0ZXJfZGVzYywgY29uc3QgY2hhciAqZGF0YWxlbikKK3sKKwllcGF5bG9hZC0+bWFzdGVyX2Rlc2MgPSBlcGF5bG9hZC0+ZGVjcnlwdGVkX2RhdGEKKwkgICAgKyBlcGF5bG9hZC0+ZGVjcnlwdGVkX2RhdGFsZW47CisJZXBheWxvYWQtPmRhdGFsZW4gPSBlcGF5bG9hZC0+bWFzdGVyX2Rlc2MgKyBzdHJsZW4obWFzdGVyX2Rlc2MpICsgMTsKKwllcGF5bG9hZC0+aXYgPSBlcGF5bG9hZC0+ZGF0YWxlbiArIHN0cmxlbihkYXRhbGVuKSArIDE7CisJZXBheWxvYWQtPmVuY3J5cHRlZF9kYXRhID0gZXBheWxvYWQtPml2ICsgaXZzaXplICsgMTsKKworCW1lbWNweShlcGF5bG9hZC0+bWFzdGVyX2Rlc2MsIG1hc3Rlcl9kZXNjLCBzdHJsZW4obWFzdGVyX2Rlc2MpKTsKKwltZW1jcHkoZXBheWxvYWQtPmRhdGFsZW4sIGRhdGFsZW4sIHN0cmxlbihkYXRhbGVuKSk7Cit9CisKKy8qCisgKiBlbmNyeXB0ZWRfaW5pdCAtIGluaXRpYWxpemUgYW4gZW5jcnlwdGVkIGtleQorICoKKyAqIEZvciBhIG5ldyBrZXksIHVzZSBhIHJhbmRvbSBudW1iZXIgZm9yIGJvdGggdGhlIGl2IGFuZCBkYXRhCisgKiBpdHNlbGYuICBGb3IgYW4gb2xkIGtleSwgZGVjcnlwdCB0aGUgaGV4IGVuY29kZWQgZGF0YS4KKyAqLworc3RhdGljIGludCBlbmNyeXB0ZWRfaW5pdChzdHJ1Y3QgZW5jcnlwdGVkX2tleV9wYXlsb2FkICplcGF5bG9hZCwKKwkJCSAgY29uc3QgY2hhciAqbWFzdGVyX2Rlc2MsIGNvbnN0IGNoYXIgKmRhdGFsZW4sCisJCQkgIGNvbnN0IGNoYXIgKmhleF9lbmNvZGVkX2l2KQoreworCWludCByZXQgPSAwOworCisJX19la2V5X2luaXQoZXBheWxvYWQsIG1hc3Rlcl9kZXNjLCBkYXRhbGVuKTsKKwlpZiAoIWhleF9lbmNvZGVkX2l2KSB7CisJCWdldF9yYW5kb21fYnl0ZXMoZXBheWxvYWQtPml2LCBpdnNpemUpOworCisJCWdldF9yYW5kb21fYnl0ZXMoZXBheWxvYWQtPmRlY3J5cHRlZF9kYXRhLAorCQkJCSBlcGF5bG9hZC0+ZGVjcnlwdGVkX2RhdGFsZW4pOworCX0gZWxzZQorCQlyZXQgPSBlbmNyeXB0ZWRfa2V5X2RlY3J5cHQoZXBheWxvYWQsIGhleF9lbmNvZGVkX2l2KTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogZW5jcnlwdGVkX2luc3RhbnRpYXRlIC0gaW5zdGFudGlhdGUgYW4gZW5jcnlwdGVkIGtleQorICoKKyAqIERlY3J5cHQgYW4gZXhpc3RpbmcgZW5jcnlwdGVkIGRhdGFibG9iIG9yIGNyZWF0ZSBhIG5ldyBlbmNyeXB0ZWQga2V5CisgKiBiYXNlZCBvbiBhIGtlcm5lbCByYW5kb20gbnVtYmVyLgorICoKKyAqIE9uIHN1Y2Nlc3MsIHJldHVybiAwLiBPdGhlcndpc2UgcmV0dXJuIGVycm5vLgorICovCitzdGF0aWMgaW50IGVuY3J5cHRlZF9pbnN0YW50aWF0ZShzdHJ1Y3Qga2V5ICprZXksIGNvbnN0IHZvaWQgKmRhdGEsCisJCQkJIHNpemVfdCBkYXRhbGVuKQoreworCXN0cnVjdCBlbmNyeXB0ZWRfa2V5X3BheWxvYWQgKmVwYXlsb2FkID0gTlVMTDsKKwljaGFyICpkYXRhYmxvYiA9IE5VTEw7CisJY2hhciAqbWFzdGVyX2Rlc2MgPSBOVUxMOworCWNoYXIgKmRlY3J5cHRlZF9kYXRhbGVuID0gTlVMTDsKKwljaGFyICpoZXhfZW5jb2RlZF9pdiA9IE5VTEw7CisJaW50IHJldDsKKworCWlmIChkYXRhbGVuIDw9IDAgfHwgZGF0YWxlbiA+IDMyNzY3IHx8ICFkYXRhKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWRhdGFibG9iID0ga21hbGxvYyhkYXRhbGVuICsgMSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkYXRhYmxvYikKKwkJcmV0dXJuIC1FTk9NRU07CisJZGF0YWJsb2JbZGF0YWxlbl0gPSAwOworCW1lbWNweShkYXRhYmxvYiwgZGF0YSwgZGF0YWxlbik7CisJcmV0ID0gZGF0YWJsb2JfcGFyc2UoZGF0YWJsb2IsICZtYXN0ZXJfZGVzYywgJmRlY3J5cHRlZF9kYXRhbGVuLAorCQkJICAgICAmaGV4X2VuY29kZWRfaXYpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dDsKKworCWVwYXlsb2FkID0gZW5jcnlwdGVkX2tleV9hbGxvYyhrZXksIG1hc3Rlcl9kZXNjLCBkZWNyeXB0ZWRfZGF0YWxlbik7CisJaWYgKElTX0VSUihlcGF5bG9hZCkpIHsKKwkJcmV0ID0gUFRSX0VSUihlcGF5bG9hZCk7CisJCWdvdG8gb3V0OworCX0KKwlyZXQgPSBlbmNyeXB0ZWRfaW5pdChlcGF5bG9hZCwgbWFzdGVyX2Rlc2MsIGRlY3J5cHRlZF9kYXRhbGVuLAorCQkJICAgICBoZXhfZW5jb2RlZF9pdik7CisJaWYgKHJldCA8IDApIHsKKwkJa2ZyZWUoZXBheWxvYWQpOworCQlnb3RvIG91dDsKKwl9CisKKwlyY3VfYXNzaWduX3BvaW50ZXIoa2V5LT5wYXlsb2FkLmRhdGEsIGVwYXlsb2FkKTsKK291dDoKKwlrZnJlZShkYXRhYmxvYik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgZW5jcnlwdGVkX3JjdV9mcmVlKHN0cnVjdCByY3VfaGVhZCAqcmN1KQoreworCXN0cnVjdCBlbmNyeXB0ZWRfa2V5X3BheWxvYWQgKmVwYXlsb2FkOworCisJZXBheWxvYWQgPSBjb250YWluZXJfb2YocmN1LCBzdHJ1Y3QgZW5jcnlwdGVkX2tleV9wYXlsb2FkLCByY3UpOworCW1lbXNldChlcGF5bG9hZC0+ZGVjcnlwdGVkX2RhdGEsIDAsIGVwYXlsb2FkLT5kZWNyeXB0ZWRfZGF0YWxlbik7CisJa2ZyZWUoZXBheWxvYWQpOworfQorCisvKgorICogZW5jcnlwdGVkX3VwZGF0ZSAtIHVwZGF0ZSB0aGUgbWFzdGVyIGtleSBkZXNjcmlwdGlvbgorICoKKyAqIENoYW5nZSB0aGUgbWFzdGVyIGtleSBkZXNjcmlwdGlvbiBmb3IgYW4gZXhpc3RpbmcgZW5jcnlwdGVkIGtleS4KKyAqIFRoZSBuZXh0IHJlYWQgd2lsbCByZXR1cm4gYW4gZW5jcnlwdGVkIGRhdGFibG9iIHVzaW5nIHRoZSBuZXcKKyAqIG1hc3RlciBrZXkgZGVzY3JpcHRpb24uCisgKgorICogT24gc3VjY2VzcywgcmV0dXJuIDAuIE90aGVyd2lzZSByZXR1cm4gZXJybm8uCisgKi8KK3N0YXRpYyBpbnQgZW5jcnlwdGVkX3VwZGF0ZShzdHJ1Y3Qga2V5ICprZXksIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBkYXRhbGVuKQoreworCXN0cnVjdCBlbmNyeXB0ZWRfa2V5X3BheWxvYWQgKmVwYXlsb2FkID0ga2V5LT5wYXlsb2FkLmRhdGE7CisJc3RydWN0IGVuY3J5cHRlZF9rZXlfcGF5bG9hZCAqbmV3X2VwYXlsb2FkOworCWNoYXIgKmJ1ZjsKKwljaGFyICpuZXdfbWFzdGVyX2Rlc2MgPSBOVUxMOworCWludCByZXQgPSAwOworCisJaWYgKGRhdGFsZW4gPD0gMCB8fCBkYXRhbGVuID4gMzI3NjcgfHwgIWRhdGEpCisJCXJldHVybiAtRUlOVkFMOworCisJYnVmID0ga21hbGxvYyhkYXRhbGVuICsgMSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFidWYpCisJCXJldHVybiAtRU5PTUVNOworCisJYnVmW2RhdGFsZW5dID0gMDsKKwltZW1jcHkoYnVmLCBkYXRhLCBkYXRhbGVuKTsKKwlyZXQgPSBkYXRhYmxvYl9wYXJzZShidWYsICZuZXdfbWFzdGVyX2Rlc2MsIE5VTEwsIE5VTEwpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dDsKKworCXJldCA9IHZhbGlkX21hc3Rlcl9kZXNjKG5ld19tYXN0ZXJfZGVzYywgZXBheWxvYWQtPm1hc3Rlcl9kZXNjKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXQ7CisKKwluZXdfZXBheWxvYWQgPSBlbmNyeXB0ZWRfa2V5X2FsbG9jKGtleSwgbmV3X21hc3Rlcl9kZXNjLAorCQkJCQkgICBlcGF5bG9hZC0+ZGF0YWxlbik7CisJaWYgKElTX0VSUihuZXdfZXBheWxvYWQpKSB7CisJCXJldCA9IFBUUl9FUlIobmV3X2VwYXlsb2FkKTsKKwkJZ290byBvdXQ7CisJfQorCisJX19la2V5X2luaXQobmV3X2VwYXlsb2FkLCBuZXdfbWFzdGVyX2Rlc2MsIGVwYXlsb2FkLT5kYXRhbGVuKTsKKworCW1lbWNweShuZXdfZXBheWxvYWQtPml2LCBlcGF5bG9hZC0+aXYsIGl2c2l6ZSk7CisJbWVtY3B5KG5ld19lcGF5bG9hZC0+ZGVjcnlwdGVkX2RhdGEsIGVwYXlsb2FkLT5kZWNyeXB0ZWRfZGF0YSwKKwkgICAgICAgZXBheWxvYWQtPmRlY3J5cHRlZF9kYXRhbGVuKTsKKworCXJjdV9hc3NpZ25fcG9pbnRlcihrZXktPnBheWxvYWQuZGF0YSwgbmV3X2VwYXlsb2FkKTsKKwljYWxsX3JjdSgmZXBheWxvYWQtPnJjdSwgZW5jcnlwdGVkX3JjdV9mcmVlKTsKK291dDoKKwlrZnJlZShidWYpOworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBlbmNyeXB0ZWRfcmVhZCAtIGZvcm1hdCBhbmQgY29weSB0aGUgZW5jcnlwdGVkIGRhdGEgdG8gdXNlcnNwYWNlCisgKgorICogVGhlIHJlc3VsdGluZyBkYXRhYmxvYiBmb3JtYXQgaXM6CisgKiA8bWFzdGVyLWtleSBuYW1lPiA8ZGVjcnlwdGVkIGRhdGEgbGVuZ3RoPiA8ZW5jcnlwdGVkIGl2PiA8ZW5jcnlwdGVkIGRhdGE+CisgKgorICogT24gc3VjY2VzcywgcmV0dXJuIHRvIHVzZXJzcGFjZSB0aGUgZW5jcnlwdGVkIGtleSBkYXRhYmxvYiBzaXplLgorICovCitzdGF0aWMgbG9uZyBlbmNyeXB0ZWRfcmVhZChjb25zdCBzdHJ1Y3Qga2V5ICprZXksIGNoYXIgX191c2VyICpidWZmZXIsCisJCQkgICBzaXplX3QgYnVmbGVuKQoreworCXN0cnVjdCBlbmNyeXB0ZWRfa2V5X3BheWxvYWQgKmVwYXlsb2FkOworCXN0cnVjdCBrZXkgKm1rZXk7CisJdTggKm1hc3Rlcl9rZXk7CisJc2l6ZV90IG1hc3Rlcl9rZXlsZW47CisJY2hhciBkZXJpdmVkX2tleVtIQVNIX1NJWkVdOworCWNoYXIgKmFzY2lpX2J1ZjsKKwlzaXplX3QgYXNjaWlibG9iX2xlbjsKKwlpbnQgcmV0OworCisJZXBheWxvYWQgPSByY3VfZGVyZWZlcmVuY2VfcHJvdGVjdGVkKGtleS0+cGF5bG9hZC5kYXRhLAorCQkJCSAgcndzZW1faXNfbG9ja2VkKCYoKHN0cnVjdCBrZXkgKilrZXkpLT5zZW0pKTsKKworCS8qIHJldHVybnMgdGhlIGhleCBlbmNvZGVkIGl2LCBlbmNyeXB0ZWQtZGF0YSwgYW5kIGhtYWMgYXMgYXNjaWkgKi8KKwlhc2NpaWJsb2JfbGVuID0gZXBheWxvYWQtPmRhdGFibG9iX2xlbiArIGl2c2l6ZSArIDEKKwkgICAgKyByb3VuZHVwKGVwYXlsb2FkLT5kZWNyeXB0ZWRfZGF0YWxlbiwgYmxrc2l6ZSkKKwkgICAgKyAoSEFTSF9TSVpFICogMik7CisKKwlpZiAoIWJ1ZmZlciB8fCBidWZsZW4gPCBhc2NpaWJsb2JfbGVuKQorCQlyZXR1cm4gYXNjaWlibG9iX2xlbjsKKworCW1rZXkgPSByZXF1ZXN0X21hc3Rlcl9rZXkoZXBheWxvYWQsICZtYXN0ZXJfa2V5LCAmbWFzdGVyX2tleWxlbik7CisJaWYgKElTX0VSUihta2V5KSkKKwkJcmV0dXJuIFBUUl9FUlIobWtleSk7CisKKwlyZXQgPSBnZXRfZGVyaXZlZF9rZXkoZGVyaXZlZF9rZXksIEVOQ19LRVksIG1hc3Rlcl9rZXksIG1hc3Rlcl9rZXlsZW4pOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dDsKKworCXJldCA9IGRlcml2ZWRfa2V5X2VuY3J5cHQoZXBheWxvYWQsIGRlcml2ZWRfa2V5LCBzaXplb2YgZGVyaXZlZF9rZXkpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dDsKKworCXJldCA9IGRhdGFibG9iX2htYWNfYXBwZW5kKGVwYXlsb2FkLCBtYXN0ZXJfa2V5LCBtYXN0ZXJfa2V5bGVuKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXQ7CisKKwlhc2NpaV9idWYgPSBkYXRhYmxvYl9mb3JtYXQoZXBheWxvYWQsIGFzY2lpYmxvYl9sZW4pOworCWlmICghYXNjaWlfYnVmKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gb3V0OworCX0KKworCXVwX3JlYWQoJm1rZXktPnNlbSk7CisJa2V5X3B1dChta2V5KTsKKworCWlmIChjb3B5X3RvX3VzZXIoYnVmZmVyLCBhc2NpaV9idWYsIGFzY2lpYmxvYl9sZW4pICE9IDApCisJCXJldCA9IC1FRkFVTFQ7CisJa2ZyZWUoYXNjaWlfYnVmKTsKKworCXJldHVybiBhc2NpaWJsb2JfbGVuOworb3V0OgorCXVwX3JlYWQoJm1rZXktPnNlbSk7CisJa2V5X3B1dChta2V5KTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogZW5jcnlwdGVkX2Rlc3Ryb3kgLSBiZWZvcmUgZnJlZWluZyB0aGUga2V5LCBjbGVhciB0aGUgZGVjcnlwdGVkIGRhdGEKKyAqCisgKiBCZWZvcmUgZnJlZWluZyB0aGUga2V5LCBjbGVhciB0aGUgbWVtb3J5IGNvbnRhaW5pbmcgdGhlIGRlY3J5cHRlZAorICoga2V5IGRhdGEuCisgKi8KK3N0YXRpYyB2b2lkIGVuY3J5cHRlZF9kZXN0cm95KHN0cnVjdCBrZXkgKmtleSkKK3sKKwlzdHJ1Y3QgZW5jcnlwdGVkX2tleV9wYXlsb2FkICplcGF5bG9hZCA9IGtleS0+cGF5bG9hZC5kYXRhOworCisJaWYgKCFlcGF5bG9hZCkKKwkJcmV0dXJuOworCisJbWVtc2V0KGVwYXlsb2FkLT5kZWNyeXB0ZWRfZGF0YSwgMCwgZXBheWxvYWQtPmRlY3J5cHRlZF9kYXRhbGVuKTsKKwlrZnJlZShrZXktPnBheWxvYWQuZGF0YSk7Cit9CisKK3N0cnVjdCBrZXlfdHlwZSBrZXlfdHlwZV9lbmNyeXB0ZWQgPSB7CisJLm5hbWUgPSAiZW5jcnlwdGVkIiwKKwkuaW5zdGFudGlhdGUgPSBlbmNyeXB0ZWRfaW5zdGFudGlhdGUsCisJLnVwZGF0ZSA9IGVuY3J5cHRlZF91cGRhdGUsCisJLm1hdGNoID0gdXNlcl9tYXRjaCwKKwkuZGVzdHJveSA9IGVuY3J5cHRlZF9kZXN0cm95LAorCS5kZXNjcmliZSA9IHVzZXJfZGVzY3JpYmUsCisJLnJlYWQgPSBlbmNyeXB0ZWRfcmVhZCwKK307CitFWFBPUlRfU1lNQk9MX0dQTChrZXlfdHlwZV9lbmNyeXB0ZWQpOworCitzdGF0aWMgdm9pZCBlbmNyeXB0ZWRfc2hhc2hfcmVsZWFzZSh2b2lkKQoreworCWlmIChoYXNoYWxnKQorCQljcnlwdG9fZnJlZV9zaGFzaChoYXNoYWxnKTsKKwlpZiAoaG1hY2FsZykKKwkJY3J5cHRvX2ZyZWVfc2hhc2goaG1hY2FsZyk7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGVuY3J5cHRlZF9zaGFzaF9hbGxvYyh2b2lkKQoreworCWludCByZXQ7CisKKwlobWFjYWxnID0gY3J5cHRvX2FsbG9jX3NoYXNoKGhtYWNfYWxnLCAwLCBDUllQVE9fQUxHX0FTWU5DKTsKKwlpZiAoSVNfRVJSKGhtYWNhbGcpKSB7CisJCXByX2luZm8oImVuY3J5cHRlZF9rZXk6IGNvdWxkIG5vdCBhbGxvY2F0ZSBjcnlwdG8gJXNcbiIsCisJCQlobWFjX2FsZyk7CisJCXJldHVybiBQVFJfRVJSKGhtYWNhbGcpOworCX0KKworCWhhc2hhbGcgPSBjcnlwdG9fYWxsb2Nfc2hhc2goaGFzaF9hbGcsIDAsIENSWVBUT19BTEdfQVNZTkMpOworCWlmIChJU19FUlIoaGFzaGFsZykpIHsKKwkJcHJfaW5mbygiZW5jcnlwdGVkX2tleTogY291bGQgbm90IGFsbG9jYXRlIGNyeXB0byAlc1xuIiwKKwkJCWhhc2hfYWxnKTsKKwkJcmV0ID0gUFRSX0VSUihoYXNoYWxnKTsKKwkJZ290byBoYXNoYWxnX2ZhaWw7CisJfQorCisJcmV0dXJuIDA7CisKK2hhc2hhbGdfZmFpbDoKKwljcnlwdG9fZnJlZV9zaGFzaChobWFjYWxnKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9faW5pdCBpbml0X2VuY3J5cHRlZCh2b2lkKQoreworCWludCByZXQ7CisKKwlyZXQgPSBlbmNyeXB0ZWRfc2hhc2hfYWxsb2MoKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwlyZXQgPSByZWdpc3Rlcl9rZXlfdHlwZSgma2V5X3R5cGVfZW5jcnlwdGVkKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXQ7CisJcmV0dXJuIGFlc19nZXRfc2l6ZXMoKTsKK291dDoKKwllbmNyeXB0ZWRfc2hhc2hfcmVsZWFzZSgpOworCXJldHVybiByZXQ7CisKK30KKworc3RhdGljIHZvaWQgX19leGl0IGNsZWFudXBfZW5jcnlwdGVkKHZvaWQpCit7CisJZW5jcnlwdGVkX3NoYXNoX3JlbGVhc2UoKTsKKwl1bnJlZ2lzdGVyX2tleV90eXBlKCZrZXlfdHlwZV9lbmNyeXB0ZWQpOworfQorCitsYXRlX2luaXRjYWxsKGluaXRfZW5jcnlwdGVkKTsKK21vZHVsZV9leGl0KGNsZWFudXBfZW5jcnlwdGVkKTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkva2V5cy9lbmNyeXB0ZWRfZGVmaW5lZC5oIGIvc2VjdXJpdHkva2V5cy9lbmNyeXB0ZWRfZGVmaW5lZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlZjVlMmYKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cml0eS9rZXlzL2VuY3J5cHRlZF9kZWZpbmVkLmgKQEAgLTAsMCArMSw1NCBAQAorI2lmbmRlZiBfX0VOQ1JZUFRFRF9LRVlfSAorI2RlZmluZSBfX0VOQ1JZUFRFRF9LRVlfSAorCisjZGVmaW5lIEVOQ1JZUFRFRF9ERUJVRyAwCisKKyNpZiBFTkNSWVBURURfREVCVUcKK3N0YXRpYyBpbmxpbmUgdm9pZCBkdW1wX21hc3Rlcl9rZXkoY29uc3QgdTggKm1hc3Rlcl9rZXksIHNpemVfdCBtYXN0ZXJfa2V5bGVuKQoreworCXByaW50X2hleF9kdW1wKEtFUk5fRVJSLCAibWFzdGVyIGtleTogIiwgRFVNUF9QUkVGSVhfTk9ORSwgMzIsIDEsCisJCSAgICAgICBtYXN0ZXJfa2V5LCBtYXN0ZXJfa2V5bGVuLCAwKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGR1bXBfZGVjcnlwdGVkX2RhdGEoc3RydWN0IGVuY3J5cHRlZF9rZXlfcGF5bG9hZCAqZXBheWxvYWQpCit7CisJcHJpbnRfaGV4X2R1bXAoS0VSTl9FUlIsICJkZWNyeXB0ZWQgZGF0YTogIiwgRFVNUF9QUkVGSVhfTk9ORSwgMzIsIDEsCisJCSAgICAgICBlcGF5bG9hZC0+ZGVjcnlwdGVkX2RhdGEsCisJCSAgICAgICBlcGF5bG9hZC0+ZGVjcnlwdGVkX2RhdGFsZW4sIDApOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZHVtcF9lbmNyeXB0ZWRfZGF0YShzdHJ1Y3QgZW5jcnlwdGVkX2tleV9wYXlsb2FkICplcGF5bG9hZCwKKwkJCQkgICAgICAgdW5zaWduZWQgaW50IGVuY3J5cHRlZF9kYXRhbGVuKQoreworCXByaW50X2hleF9kdW1wKEtFUk5fRVJSLCAiZW5jcnlwdGVkIGRhdGE6ICIsIERVTVBfUFJFRklYX05PTkUsIDMyLCAxLAorCQkgICAgICAgZXBheWxvYWQtPmVuY3J5cHRlZF9kYXRhLCBlbmNyeXB0ZWRfZGF0YWxlbiwgMCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkdW1wX2htYWMoY29uc3QgY2hhciAqc3RyLCBjb25zdCB1OCAqZGlnZXN0LAorCQkJICAgICB1bnNpZ25lZCBpbnQgaG1hY19zaXplKQoreworCWlmIChzdHIpCisJCXByX2luZm8oImVuY3J5cHRlZF9rZXk6ICVzIiwgc3RyKTsKKwlwcmludF9oZXhfZHVtcChLRVJOX0VSUiwgImhtYWM6ICIsIERVTVBfUFJFRklYX05PTkUsIDMyLCAxLCBkaWdlc3QsCisJCSAgICAgICBobWFjX3NpemUsIDApOworfQorI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCBkdW1wX21hc3Rlcl9rZXkoY29uc3QgdTggKm1hc3Rlcl9rZXksIHNpemVfdCBtYXN0ZXJfa2V5bGVuKQoreworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZHVtcF9kZWNyeXB0ZWRfZGF0YShzdHJ1Y3QgZW5jcnlwdGVkX2tleV9wYXlsb2FkICplcGF5bG9hZCkKK3sKK30KKworc3RhdGljIGlubGluZSB2b2lkIGR1bXBfZW5jcnlwdGVkX2RhdGEoc3RydWN0IGVuY3J5cHRlZF9rZXlfcGF5bG9hZCAqZXBheWxvYWQsCisJCQkJICAgICAgIHVuc2lnbmVkIGludCBlbmNyeXB0ZWRfZGF0YWxlbikKK3sKK30KKworc3RhdGljIGlubGluZSB2b2lkIGR1bXBfaG1hYyhjb25zdCBjaGFyICpzdHIsIGNvbnN0IHU4ICpkaWdlc3QsCisJCQkgICAgIHVuc2lnbmVkIGludCBobWFjX3NpemUpCit7Cit9CisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkva2V5cy90cnVzdGVkX2RlZmluZWQuYyBiL3NlY3VyaXR5L2tleXMvdHJ1c3RlZF9kZWZpbmVkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTc1ZTlmMgotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyaXR5L2tleXMvdHJ1c3RlZF9kZWZpbmVkLmMKQEAgLTAsMCArMSwxMTc1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIElCTSBDb3Jwb3JhdGlvbgorICoKKyAqIEF1dGhvcjoKKyAqIERhdmlkIFNhZmZvcmQgPHNhZmZvcmRAdXMuaWJtLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZS4KKyAqCisgKiBTZWUgRG9jdW1lbnRhdGlvbi9rZXlzLXRydXN0ZWQtZW5jcnlwdGVkLnR4dAorICovCisKKyNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9wYXJzZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxrZXlzL3VzZXItdHlwZS5oPgorI2luY2x1ZGUgPGtleXMvdHJ1c3RlZC10eXBlLmg+CisjaW5jbHVkZSA8bGludXgva2V5LXR5cGUuaD4KKyNpbmNsdWRlIDxsaW51eC9yY3VwZGF0ZS5oPgorI2luY2x1ZGUgPGxpbnV4L2NyeXB0by5oPgorI2luY2x1ZGUgPGNyeXB0by9oYXNoLmg+CisjaW5jbHVkZSA8Y3J5cHRvL3NoYS5oPgorI2luY2x1ZGUgPGxpbnV4L2NhcGFiaWxpdHkuaD4KKyNpbmNsdWRlIDxsaW51eC90cG0uaD4KKyNpbmNsdWRlIDxsaW51eC90cG1fY29tbWFuZC5oPgorCisjaW5jbHVkZSAidHJ1c3RlZF9kZWZpbmVkLmgiCisKK3N0YXRpYyBjb25zdCBjaGFyIGhtYWNfYWxnW10gPSAiaG1hYyhzaGExKSI7CitzdGF0aWMgY29uc3QgY2hhciBoYXNoX2FsZ1tdID0gInNoYTEiOworCitzdHJ1Y3Qgc2Rlc2MgeworCXN0cnVjdCBzaGFzaF9kZXNjIHNoYXNoOworCWNoYXIgY3R4W107Cit9OworCitzdGF0aWMgc3RydWN0IGNyeXB0b19zaGFzaCAqaGFzaGFsZzsKK3N0YXRpYyBzdHJ1Y3QgY3J5cHRvX3NoYXNoICpobWFjYWxnOworCitzdGF0aWMgc3RydWN0IHNkZXNjICppbml0X3NkZXNjKHN0cnVjdCBjcnlwdG9fc2hhc2ggKmFsZykKK3sKKwlzdHJ1Y3Qgc2Rlc2MgKnNkZXNjOworCWludCBzaXplOworCisJc2l6ZSA9IHNpemVvZihzdHJ1Y3Qgc2hhc2hfZGVzYykgKyBjcnlwdG9fc2hhc2hfZGVzY3NpemUoYWxnKTsKKwlzZGVzYyA9IGttYWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzZGVzYykKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisJc2Rlc2MtPnNoYXNoLnRmbSA9IGFsZzsKKwlzZGVzYy0+c2hhc2guZmxhZ3MgPSAweDA7CisJcmV0dXJuIHNkZXNjOworfQorCitzdGF0aWMgaW50IFRTU19zaGExKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGEsIHVuc2lnbmVkIGludCBkYXRhbGVuLAorCQkgICAgdW5zaWduZWQgY2hhciAqZGlnZXN0KQoreworCXN0cnVjdCBzZGVzYyAqc2Rlc2M7CisJaW50IHJldDsKKworCXNkZXNjID0gaW5pdF9zZGVzYyhoYXNoYWxnKTsKKwlpZiAoSVNfRVJSKHNkZXNjKSkgeworCQlwcl9pbmZvKCJ0cnVzdGVkX2tleTogY2FuJ3QgYWxsb2MgJXNcbiIsIGhhc2hfYWxnKTsKKwkJcmV0dXJuIFBUUl9FUlIoc2Rlc2MpOworCX0KKworCXJldCA9IGNyeXB0b19zaGFzaF9kaWdlc3QoJnNkZXNjLT5zaGFzaCwgZGF0YSwgZGF0YWxlbiwgZGlnZXN0KTsKKwlrZnJlZShzZGVzYyk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBUU1NfcmF3aG1hYyh1bnNpZ25lZCBjaGFyICpkaWdlc3QsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmtleSwKKwkJICAgICAgIHVuc2lnbmVkIGludCBrZXlsZW4sIC4uLikKK3sKKwlzdHJ1Y3Qgc2Rlc2MgKnNkZXNjOworCXZhX2xpc3QgYXJncDsKKwl1bnNpZ25lZCBpbnQgZGxlbjsKKwl1bnNpZ25lZCBjaGFyICpkYXRhOworCWludCByZXQ7CisKKwlzZGVzYyA9IGluaXRfc2Rlc2MoaG1hY2FsZyk7CisJaWYgKElTX0VSUihzZGVzYykpIHsKKwkJcHJfaW5mbygidHJ1c3RlZF9rZXk6IGNhbid0IGFsbG9jICVzXG4iLCBobWFjX2FsZyk7CisJCXJldHVybiBQVFJfRVJSKHNkZXNjKTsKKwl9CisKKwlyZXQgPSBjcnlwdG9fc2hhc2hfc2V0a2V5KGhtYWNhbGcsIGtleSwga2V5bGVuKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXQ7CisJcmV0ID0gY3J5cHRvX3NoYXNoX2luaXQoJnNkZXNjLT5zaGFzaCk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0OworCisJdmFfc3RhcnQoYXJncCwga2V5bGVuKTsKKwlmb3IgKDs7KSB7CisJCWRsZW4gPSB2YV9hcmcoYXJncCwgdW5zaWduZWQgaW50KTsKKwkJaWYgKGRsZW4gPT0gMCkKKwkJCWJyZWFrOworCQlkYXRhID0gdmFfYXJnKGFyZ3AsIHVuc2lnbmVkIGNoYXIgKik7CisJCWlmIChkYXRhID09IE5VTEwpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJcmV0ID0gY3J5cHRvX3NoYXNoX3VwZGF0ZSgmc2Rlc2MtPnNoYXNoLCBkYXRhLCBkbGVuKTsKKwkJaWYgKHJldCA8IDApCisJCQlnb3RvIG91dDsKKwl9CisJdmFfZW5kKGFyZ3ApOworCWlmICghcmV0KQorCQlyZXQgPSBjcnlwdG9fc2hhc2hfZmluYWwoJnNkZXNjLT5zaGFzaCwgZGlnZXN0KTsKK291dDoKKwlrZnJlZShzZGVzYyk7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIGNhbGN1bGF0ZSBhdXRob3JpemF0aW9uIGluZm8gZmllbGRzIHRvIHNlbmQgdG8gVFBNCisgKi8KK3N0YXRpYyBpbnQgVFNTX2F1dGhobWFjKHVuc2lnbmVkIGNoYXIgKmRpZ2VzdCwgY29uc3QgdW5zaWduZWQgY2hhciAqa2V5LAorCQkJdW5zaWduZWQgaW50IGtleWxlbiwgdW5zaWduZWQgY2hhciAqaDEsCisJCQl1bnNpZ25lZCBjaGFyICpoMiwgdW5zaWduZWQgY2hhciBoMywgLi4uKQoreworCXVuc2lnbmVkIGNoYXIgcGFyYW1kaWdlc3RbU0hBMV9ESUdFU1RfU0laRV07CisJc3RydWN0IHNkZXNjICpzZGVzYzsKKwl1bnNpZ25lZCBpbnQgZGxlbjsKKwl1bnNpZ25lZCBjaGFyICpkYXRhOworCXVuc2lnbmVkIGNoYXIgYzsKKwlpbnQgcmV0OworCXZhX2xpc3QgYXJncDsKKworCXNkZXNjID0gaW5pdF9zZGVzYyhoYXNoYWxnKTsKKwlpZiAoSVNfRVJSKHNkZXNjKSkgeworCQlwcl9pbmZvKCJ0cnVzdGVkX2tleTogY2FuJ3QgYWxsb2MgJXNcbiIsIGhhc2hfYWxnKTsKKwkJcmV0dXJuIFBUUl9FUlIoc2Rlc2MpOworCX0KKworCWMgPSBoMzsKKwlyZXQgPSBjcnlwdG9fc2hhc2hfaW5pdCgmc2Rlc2MtPnNoYXNoKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXQ7CisJdmFfc3RhcnQoYXJncCwgaDMpOworCWZvciAoOzspIHsKKwkJZGxlbiA9IHZhX2FyZyhhcmdwLCB1bnNpZ25lZCBpbnQpOworCQlpZiAoZGxlbiA9PSAwKQorCQkJYnJlYWs7CisJCWRhdGEgPSB2YV9hcmcoYXJncCwgdW5zaWduZWQgY2hhciAqKTsKKwkJcmV0ID0gY3J5cHRvX3NoYXNoX3VwZGF0ZSgmc2Rlc2MtPnNoYXNoLCBkYXRhLCBkbGVuKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCXZhX2VuZChhcmdwKTsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCXZhX2VuZChhcmdwKTsKKwlyZXQgPSBjcnlwdG9fc2hhc2hfZmluYWwoJnNkZXNjLT5zaGFzaCwgcGFyYW1kaWdlc3QpOworCWlmICghcmV0KQorCQlyZXQgPSBUU1NfcmF3aG1hYyhkaWdlc3QsIGtleSwga2V5bGVuLCBTSEExX0RJR0VTVF9TSVpFLAorCQkJCSAgcGFyYW1kaWdlc3QsIFRQTV9OT05DRV9TSVpFLCBoMSwKKwkJCQkgIFRQTV9OT05DRV9TSVpFLCBoMiwgMSwgJmMsIDAsIDApOworb3V0OgorCWtmcmVlKHNkZXNjKTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogdmVyaWZ5IHRoZSBBVVRIMV9DT01NQU5EIChTZWFsKSByZXN1bHQgZnJvbSBUUE0KKyAqLworc3RhdGljIGludCBUU1NfY2hlY2tobWFjMSh1bnNpZ25lZCBjaGFyICpidWZmZXIsCisJCQkgIGNvbnN0IHVpbnQzMl90IGNvbW1hbmQsCisJCQkgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKm9ub25jZSwKKwkJCSAgY29uc3QgdW5zaWduZWQgY2hhciAqa2V5LAorCQkJICB1bnNpZ25lZCBpbnQga2V5bGVuLCAuLi4pCit7CisJdWludDMyX3QgYnVmc2l6ZTsKKwl1aW50MTZfdCB0YWc7CisJdWludDMyX3Qgb3JkaW5hbDsKKwl1aW50MzJfdCByZXN1bHQ7CisJdW5zaWduZWQgY2hhciAqZW5vbmNlOworCXVuc2lnbmVkIGNoYXIgKmNvbnRpbnVlZmxhZzsKKwl1bnNpZ25lZCBjaGFyICphdXRoZGF0YTsKKwl1bnNpZ25lZCBjaGFyIHRlc3RobWFjW1NIQTFfRElHRVNUX1NJWkVdOworCXVuc2lnbmVkIGNoYXIgcGFyYW1kaWdlc3RbU0hBMV9ESUdFU1RfU0laRV07CisJc3RydWN0IHNkZXNjICpzZGVzYzsKKwl1bnNpZ25lZCBpbnQgZGxlbjsKKwl1bnNpZ25lZCBpbnQgZHBvczsKKwl2YV9saXN0IGFyZ3A7CisJaW50IHJldDsKKworCWJ1ZnNpemUgPSBMT0FEMzIoYnVmZmVyLCBUUE1fU0laRV9PRkZTRVQpOworCXRhZyA9IExPQUQxNihidWZmZXIsIDApOworCW9yZGluYWwgPSBjb21tYW5kOworCXJlc3VsdCA9IExPQUQzMk4oYnVmZmVyLCBUUE1fUkVUVVJOX09GRlNFVCk7CisJaWYgKHRhZyA9PSBUUE1fVEFHX1JTUF9DT01NQU5EKQorCQlyZXR1cm4gMDsKKwlpZiAodGFnICE9IFRQTV9UQUdfUlNQX0FVVEgxX0NPTU1BTkQpCisJCXJldHVybiAtRUlOVkFMOworCWF1dGhkYXRhID0gYnVmZmVyICsgYnVmc2l6ZSAtIFNIQTFfRElHRVNUX1NJWkU7CisJY29udGludWVmbGFnID0gYXV0aGRhdGEgLSAxOworCWVub25jZSA9IGNvbnRpbnVlZmxhZyAtIFRQTV9OT05DRV9TSVpFOworCisJc2Rlc2MgPSBpbml0X3NkZXNjKGhhc2hhbGcpOworCWlmIChJU19FUlIoc2Rlc2MpKSB7CisJCXByX2luZm8oInRydXN0ZWRfa2V5OiBjYW4ndCBhbGxvYyAlc1xuIiwgaGFzaF9hbGcpOworCQlyZXR1cm4gUFRSX0VSUihzZGVzYyk7CisJfQorCXJldCA9IGNyeXB0b19zaGFzaF9pbml0KCZzZGVzYy0+c2hhc2gpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dDsKKwlyZXQgPSBjcnlwdG9fc2hhc2hfdXBkYXRlKCZzZGVzYy0+c2hhc2gsIChjb25zdCB1OCAqKSZyZXN1bHQsCisJCQkJICBzaXplb2YgcmVzdWx0KTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXQ7CisJcmV0ID0gY3J5cHRvX3NoYXNoX3VwZGF0ZSgmc2Rlc2MtPnNoYXNoLCAoY29uc3QgdTggKikmb3JkaW5hbCwKKwkJCQkgIHNpemVvZiBvcmRpbmFsKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXQ7CisJdmFfc3RhcnQoYXJncCwga2V5bGVuKTsKKwlmb3IgKDs7KSB7CisJCWRsZW4gPSB2YV9hcmcoYXJncCwgdW5zaWduZWQgaW50KTsKKwkJaWYgKGRsZW4gPT0gMCkKKwkJCWJyZWFrOworCQlkcG9zID0gdmFfYXJnKGFyZ3AsIHVuc2lnbmVkIGludCk7CisJCXJldCA9IGNyeXB0b19zaGFzaF91cGRhdGUoJnNkZXNjLT5zaGFzaCwgYnVmZmVyICsgZHBvcywgZGxlbik7CisJCWlmIChyZXQgPCAwKSB7CisJCQl2YV9lbmQoYXJncCk7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKwl2YV9lbmQoYXJncCk7CisJcmV0ID0gY3J5cHRvX3NoYXNoX2ZpbmFsKCZzZGVzYy0+c2hhc2gsIHBhcmFtZGlnZXN0KTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXQ7CisKKwlyZXQgPSBUU1NfcmF3aG1hYyh0ZXN0aG1hYywga2V5LCBrZXlsZW4sIFNIQTFfRElHRVNUX1NJWkUsIHBhcmFtZGlnZXN0LAorCQkJICBUUE1fTk9OQ0VfU0laRSwgZW5vbmNlLCBUUE1fTk9OQ0VfU0laRSwgb25vbmNlLAorCQkJICAxLCBjb250aW51ZWZsYWcsIDAsIDApOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dDsKKworCWlmIChtZW1jbXAodGVzdGhtYWMsIGF1dGhkYXRhLCBTSEExX0RJR0VTVF9TSVpFKSkKKwkJcmV0ID0gLUVJTlZBTDsKK291dDoKKwlrZnJlZShzZGVzYyk7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIHZlcmlmeSB0aGUgQVVUSDJfQ09NTUFORCAodW5zZWFsKSByZXN1bHQgZnJvbSBUUE0KKyAqLworc3RhdGljIGludCBUU1NfY2hlY2tobWFjMih1bnNpZ25lZCBjaGFyICpidWZmZXIsCisJCQkgIGNvbnN0IHVpbnQzMl90IGNvbW1hbmQsCisJCQkgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKm9ub25jZSwKKwkJCSAgY29uc3QgdW5zaWduZWQgY2hhciAqa2V5MSwKKwkJCSAgdW5zaWduZWQgaW50IGtleWxlbjEsCisJCQkgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmtleTIsCisJCQkgIHVuc2lnbmVkIGludCBrZXlsZW4yLCAuLi4pCit7CisJdWludDMyX3QgYnVmc2l6ZTsKKwl1aW50MTZfdCB0YWc7CisJdWludDMyX3Qgb3JkaW5hbDsKKwl1aW50MzJfdCByZXN1bHQ7CisJdW5zaWduZWQgY2hhciAqZW5vbmNlMTsKKwl1bnNpZ25lZCBjaGFyICpjb250aW51ZWZsYWcxOworCXVuc2lnbmVkIGNoYXIgKmF1dGhkYXRhMTsKKwl1bnNpZ25lZCBjaGFyICplbm9uY2UyOworCXVuc2lnbmVkIGNoYXIgKmNvbnRpbnVlZmxhZzI7CisJdW5zaWduZWQgY2hhciAqYXV0aGRhdGEyOworCXVuc2lnbmVkIGNoYXIgdGVzdGhtYWMxW1NIQTFfRElHRVNUX1NJWkVdOworCXVuc2lnbmVkIGNoYXIgdGVzdGhtYWMyW1NIQTFfRElHRVNUX1NJWkVdOworCXVuc2lnbmVkIGNoYXIgcGFyYW1kaWdlc3RbU0hBMV9ESUdFU1RfU0laRV07CisJc3RydWN0IHNkZXNjICpzZGVzYzsKKwl1bnNpZ25lZCBpbnQgZGxlbjsKKwl1bnNpZ25lZCBpbnQgZHBvczsKKwl2YV9saXN0IGFyZ3A7CisJaW50IHJldDsKKworCWJ1ZnNpemUgPSBMT0FEMzIoYnVmZmVyLCBUUE1fU0laRV9PRkZTRVQpOworCXRhZyA9IExPQUQxNihidWZmZXIsIDApOworCW9yZGluYWwgPSBjb21tYW5kOworCXJlc3VsdCA9IExPQUQzMk4oYnVmZmVyLCBUUE1fUkVUVVJOX09GRlNFVCk7CisKKwlpZiAodGFnID09IFRQTV9UQUdfUlNQX0NPTU1BTkQpCisJCXJldHVybiAwOworCWlmICh0YWcgIT0gVFBNX1RBR19SU1BfQVVUSDJfQ09NTUFORCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJYXV0aGRhdGExID0gYnVmZmVyICsgYnVmc2l6ZSAtIChTSEExX0RJR0VTVF9TSVpFICsgMQorCQkJKyBTSEExX0RJR0VTVF9TSVpFICsgU0hBMV9ESUdFU1RfU0laRSk7CisJYXV0aGRhdGEyID0gYnVmZmVyICsgYnVmc2l6ZSAtIChTSEExX0RJR0VTVF9TSVpFKTsKKwljb250aW51ZWZsYWcxID0gYXV0aGRhdGExIC0gMTsKKwljb250aW51ZWZsYWcyID0gYXV0aGRhdGEyIC0gMTsKKwllbm9uY2UxID0gY29udGludWVmbGFnMSAtIFRQTV9OT05DRV9TSVpFOworCWVub25jZTIgPSBjb250aW51ZWZsYWcyIC0gVFBNX05PTkNFX1NJWkU7CisKKwlzZGVzYyA9IGluaXRfc2Rlc2MoaGFzaGFsZyk7CisJaWYgKElTX0VSUihzZGVzYykpIHsKKwkJcHJfaW5mbygidHJ1c3RlZF9rZXk6IGNhbid0IGFsbG9jICVzXG4iLCBoYXNoX2FsZyk7CisJCXJldHVybiBQVFJfRVJSKHNkZXNjKTsKKwl9CisJcmV0ID0gY3J5cHRvX3NoYXNoX2luaXQoJnNkZXNjLT5zaGFzaCk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0OworCXJldCA9IGNyeXB0b19zaGFzaF91cGRhdGUoJnNkZXNjLT5zaGFzaCwgKGNvbnN0IHU4ICopJnJlc3VsdCwKKwkJCQkgIHNpemVvZiByZXN1bHQpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dDsKKwlyZXQgPSBjcnlwdG9fc2hhc2hfdXBkYXRlKCZzZGVzYy0+c2hhc2gsIChjb25zdCB1OCAqKSZvcmRpbmFsLAorCQkJCSAgc2l6ZW9mIG9yZGluYWwpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dDsKKworCXZhX3N0YXJ0KGFyZ3AsIGtleWxlbjIpOworCWZvciAoOzspIHsKKwkJZGxlbiA9IHZhX2FyZyhhcmdwLCB1bnNpZ25lZCBpbnQpOworCQlpZiAoZGxlbiA9PSAwKQorCQkJYnJlYWs7CisJCWRwb3MgPSB2YV9hcmcoYXJncCwgdW5zaWduZWQgaW50KTsKKwkJcmV0ID0gY3J5cHRvX3NoYXNoX3VwZGF0ZSgmc2Rlc2MtPnNoYXNoLCBidWZmZXIgKyBkcG9zLCBkbGVuKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCXZhX2VuZChhcmdwKTsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCXZhX2VuZChhcmdwKTsKKwlyZXQgPSBjcnlwdG9fc2hhc2hfZmluYWwoJnNkZXNjLT5zaGFzaCwgcGFyYW1kaWdlc3QpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dDsKKworCXJldCA9IFRTU19yYXdobWFjKHRlc3RobWFjMSwga2V5MSwga2V5bGVuMSwgU0hBMV9ESUdFU1RfU0laRSwKKwkJCSAgcGFyYW1kaWdlc3QsIFRQTV9OT05DRV9TSVpFLCBlbm9uY2UxLAorCQkJICBUUE1fTk9OQ0VfU0laRSwgb25vbmNlLCAxLCBjb250aW51ZWZsYWcxLCAwLCAwKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXQ7CisJaWYgKG1lbWNtcCh0ZXN0aG1hYzEsIGF1dGhkYXRhMSwgU0hBMV9ESUdFU1RfU0laRSkpIHsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCXJldCA9IFRTU19yYXdobWFjKHRlc3RobWFjMiwga2V5Miwga2V5bGVuMiwgU0hBMV9ESUdFU1RfU0laRSwKKwkJCSAgcGFyYW1kaWdlc3QsIFRQTV9OT05DRV9TSVpFLCBlbm9uY2UyLAorCQkJICBUUE1fTk9OQ0VfU0laRSwgb25vbmNlLCAxLCBjb250aW51ZWZsYWcyLCAwLCAwKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXQ7CisJaWYgKG1lbWNtcCh0ZXN0aG1hYzIsIGF1dGhkYXRhMiwgU0hBMV9ESUdFU1RfU0laRSkpCisJCXJldCA9IC1FSU5WQUw7CitvdXQ6CisJa2ZyZWUoc2Rlc2MpOworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBGb3Iga2V5IHNwZWNpZmljIHRwbSByZXF1ZXN0cywgd2Ugd2lsbCBnZW5lcmF0ZSBhbmQgc2VuZCBvdXIKKyAqIG93biBUUE0gY29tbWFuZCBwYWNrZXRzIHVzaW5nIHRoZSBkcml2ZXJzIHNlbmQgZnVuY3Rpb24uCisgKi8KK3N0YXRpYyBpbnQgdHJ1c3RlZF90cG1fc2VuZChjb25zdCB1MzIgY2hpcF9udW0sIHVuc2lnbmVkIGNoYXIgKmNtZCwKKwkJCSAgICBzaXplX3QgYnVmbGVuKQoreworCWludCByYzsKKworCWR1bXBfdHBtX2J1ZihjbWQpOworCXJjID0gdHBtX3NlbmQoY2hpcF9udW0sIGNtZCwgYnVmbGVuKTsKKwlkdW1wX3RwbV9idWYoY21kKTsKKwlpZiAocmMgPiAwKQorCQkvKiBDYW4ndCByZXR1cm4gcG9zaXRpdmUgcmV0dXJuIGNvZGVzIHZhbHVlcyB0byBrZXljdGwgKi8KKwkJcmMgPSAtRVBFUk07CisJcmV0dXJuIHJjOworfQorCisvKgorICogZ2V0IGEgcmFuZG9tIHZhbHVlIGZyb20gVFBNCisgKi8KK3N0YXRpYyBpbnQgdHBtX2dldF9yYW5kb20oc3RydWN0IHRwbV9idWYgKnRiLCB1bnNpZ25lZCBjaGFyICpidWYsIHVpbnQzMl90IGxlbikKK3sKKwlpbnQgcmV0OworCisJSU5JVF9CVUYodGIpOworCXN0b3JlMTYodGIsIFRQTV9UQUdfUlFVX0NPTU1BTkQpOworCXN0b3JlMzIodGIsIFRQTV9HRVRSQU5ET01fU0laRSk7CisJc3RvcmUzMih0YiwgVFBNX09SRF9HRVRSQU5ET00pOworCXN0b3JlMzIodGIsIGxlbik7CisJcmV0ID0gdHJ1c3RlZF90cG1fc2VuZChUUE1fQU5ZX05VTSwgdGItPmRhdGEsIHNpemVvZiB0Yi0+ZGF0YSk7CisJaWYgKCFyZXQpCisJCW1lbWNweShidWYsIHRiLT5kYXRhICsgVFBNX0dFVFJBTkRPTV9TSVpFLCBsZW4pOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbXlfZ2V0X3JhbmRvbSh1bnNpZ25lZCBjaGFyICpidWYsIGludCBsZW4pCit7CisJc3RydWN0IHRwbV9idWYgKnRiOworCWludCByZXQ7CisKKwl0YiA9IGttYWxsb2Moc2l6ZW9mICp0YiwgR0ZQX0tFUk5FTCk7CisJaWYgKCF0YikKKwkJcmV0dXJuIC1FTk9NRU07CisJcmV0ID0gdHBtX2dldF9yYW5kb20odGIsIGJ1ZiwgbGVuKTsKKworCWtmcmVlKHRiKTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogTG9jayBhIHRydXN0ZWQga2V5LCBieSBleHRlbmRpbmcgYSBzZWxlY3RlZCBQQ1IuCisgKgorICogUHJldmVudHMgYSB0cnVzdGVkIGtleSB0aGF0IGlzIHNlYWxlZCB0byBQQ1JzIGZyb20gYmVpbmcgYWNjZXNzZWQuCisgKiBUaGlzIHVzZXMgdGhlIHRwbSBkcml2ZXIncyBleHRlbmQgZnVuY3Rpb24uCisgKi8KK3N0YXRpYyBpbnQgcGNybG9jayhjb25zdCBpbnQgcGNybnVtKQoreworCXVuc2lnbmVkIGNoYXIgaGFzaFtTSEExX0RJR0VTVF9TSVpFXTsKKwlpbnQgcmV0OworCisJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQorCQlyZXR1cm4gLUVQRVJNOworCXJldCA9IG15X2dldF9yYW5kb20oaGFzaCwgU0hBMV9ESUdFU1RfU0laRSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisJcmV0dXJuIHRwbV9wY3JfZXh0ZW5kKFRQTV9BTllfTlVNLCBwY3JudW0sIGhhc2gpID8gLUVJTlZBTCA6IDA7Cit9CisKKy8qCisgKiBDcmVhdGUgYW4gb2JqZWN0IHNwZWNpZmljIGF1dGhvcmlzYXRpb24gcHJvdG9jb2wgKE9TQVApIHNlc3Npb24KKyAqLworc3RhdGljIGludCBvc2FwKHN0cnVjdCB0cG1fYnVmICp0Yiwgc3RydWN0IG9zYXBzZXNzICpzLAorCQljb25zdCB1bnNpZ25lZCBjaGFyICprZXksIHVpbnQxNl90IHR5cGUsIHVpbnQzMl90IGhhbmRsZSkKK3sKKwl1bnNpZ25lZCBjaGFyIGVub25jZVtUUE1fTk9OQ0VfU0laRV07CisJdW5zaWduZWQgY2hhciBvbm9uY2VbVFBNX05PTkNFX1NJWkVdOworCWludCByZXQ7CisKKwlyZXQgPSB0cG1fZ2V0X3JhbmRvbSh0Yiwgb25vbmNlLCBUUE1fTk9OQ0VfU0laRSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlJTklUX0JVRih0Yik7CisJc3RvcmUxNih0YiwgVFBNX1RBR19SUVVfQ09NTUFORCk7CisJc3RvcmUzMih0YiwgVFBNX09TQVBfU0laRSk7CisJc3RvcmUzMih0YiwgVFBNX09SRF9PU0FQKTsKKwlzdG9yZTE2KHRiLCB0eXBlKTsKKwlzdG9yZTMyKHRiLCBoYW5kbGUpOworCXN0b3JlYnl0ZXModGIsIG9ub25jZSwgVFBNX05PTkNFX1NJWkUpOworCisJcmV0ID0gdHJ1c3RlZF90cG1fc2VuZChUUE1fQU5ZX05VTSwgdGItPmRhdGEsIE1BWF9CVUZfU0laRSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlzLT5oYW5kbGUgPSBMT0FEMzIodGItPmRhdGEsIFRQTV9EQVRBX09GRlNFVCk7CisJbWVtY3B5KHMtPmVub25jZSwgJih0Yi0+ZGF0YVtUUE1fREFUQV9PRkZTRVQgKyBzaXplb2YodWludDMyX3QpXSksCisJICAgICAgIFRQTV9OT05DRV9TSVpFKTsKKwltZW1jcHkoZW5vbmNlLCAmKHRiLT5kYXRhW1RQTV9EQVRBX09GRlNFVCArIHNpemVvZih1aW50MzJfdCkgKworCQkJCSAgVFBNX05PTkNFX1NJWkVdKSwgVFBNX05PTkNFX1NJWkUpOworCXJldHVybiBUU1NfcmF3aG1hYyhzLT5zZWNyZXQsIGtleSwgU0hBMV9ESUdFU1RfU0laRSwgVFBNX05PTkNFX1NJWkUsCisJCQkgICBlbm9uY2UsIFRQTV9OT05DRV9TSVpFLCBvbm9uY2UsIDAsIDApOworfQorCisvKgorICogQ3JlYXRlIGFuIG9iamVjdCBpbmRlcGVuZGVudCBhdXRob3Jpc2F0aW9uIHByb3RvY29sIChvaWFwKSBzZXNzaW9uCisgKi8KK3N0YXRpYyBpbnQgb2lhcChzdHJ1Y3QgdHBtX2J1ZiAqdGIsIHVpbnQzMl90ICpoYW5kbGUsIHVuc2lnbmVkIGNoYXIgKm5vbmNlKQoreworCWludCByZXQ7CisKKwlJTklUX0JVRih0Yik7CisJc3RvcmUxNih0YiwgVFBNX1RBR19SUVVfQ09NTUFORCk7CisJc3RvcmUzMih0YiwgVFBNX09JQVBfU0laRSk7CisJc3RvcmUzMih0YiwgVFBNX09SRF9PSUFQKTsKKwlyZXQgPSB0cnVzdGVkX3RwbV9zZW5kKFRQTV9BTllfTlVNLCB0Yi0+ZGF0YSwgTUFYX0JVRl9TSVpFKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCSpoYW5kbGUgPSBMT0FEMzIodGItPmRhdGEsIFRQTV9EQVRBX09GRlNFVCk7CisJbWVtY3B5KG5vbmNlLCAmdGItPmRhdGFbVFBNX0RBVEFfT0ZGU0VUICsgc2l6ZW9mKHVpbnQzMl90KV0sCisJICAgICAgIFRQTV9OT05DRV9TSVpFKTsKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IHRwbV9kaWdlc3RzIHsKKwl1bnNpZ25lZCBjaGFyIGVuY2F1dGhbU0hBMV9ESUdFU1RfU0laRV07CisJdW5zaWduZWQgY2hhciBwdWJhdXRoW1NIQTFfRElHRVNUX1NJWkVdOworCXVuc2lnbmVkIGNoYXIgeG9yd29ya1tTSEExX0RJR0VTVF9TSVpFICogMl07CisJdW5zaWduZWQgY2hhciB4b3JoYXNoW1NIQTFfRElHRVNUX1NJWkVdOworCXVuc2lnbmVkIGNoYXIgbm9uY2VvZGRbVFBNX05PTkNFX1NJWkVdOworfTsKKworLyoKKyAqIEhhdmUgdGhlIFRQTSBzZWFsKGVuY3J5cHQpIHRoZSB0cnVzdGVkIGtleSwgcG9zc2libHkgYmFzZWQgb24KKyAqIFBsYXRmb3JtIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXJzIChQQ1JzKS4gQVVUSDEgZm9yIHNlYWxpbmcga2V5LgorICovCitzdGF0aWMgaW50IHRwbV9zZWFsKHN0cnVjdCB0cG1fYnVmICp0YiwgdWludDE2X3Qga2V5dHlwZSwKKwkJICAgIHVpbnQzMl90IGtleWhhbmRsZSwgY29uc3QgdW5zaWduZWQgY2hhciAqa2V5YXV0aCwKKwkJICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGEsIHVpbnQzMl90IGRhdGFsZW4sCisJCSAgICB1bnNpZ25lZCBjaGFyICpibG9iLCB1aW50MzJfdCAqYmxvYmxlbiwKKwkJICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJsb2JhdXRoLAorCQkgICAgY29uc3QgdW5zaWduZWQgY2hhciAqcGNyaW5mbywgdWludDMyX3QgcGNyaW5mb3NpemUpCit7CisJc3RydWN0IG9zYXBzZXNzIHNlc3M7CisJc3RydWN0IHRwbV9kaWdlc3RzICp0ZDsKKwl1bnNpZ25lZCBjaGFyIGNvbnQ7CisJdWludDMyX3Qgb3JkaW5hbDsKKwl1aW50MzJfdCBwY3JzaXplOworCXVpbnQzMl90IGRhdHNpemU7CisJaW50IHNlYWxpbmZvc2l6ZTsKKwlpbnQgZW5jZGF0YXNpemU7CisJaW50IHN0b3JlZHNpemU7CisJaW50IHJldDsKKwlpbnQgaTsKKworCS8qIGFsbG9jIHNvbWUgd29yayBzcGFjZSBmb3IgYWxsIHRoZSBoYXNoZXMgKi8KKwl0ZCA9IGttYWxsb2Moc2l6ZW9mICp0ZCwgR0ZQX0tFUk5FTCk7CisJaWYgKCF0ZCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkvKiBnZXQgc2Vzc2lvbiBmb3Igc2VhbGluZyBrZXkgKi8KKwlyZXQgPSBvc2FwKHRiLCAmc2Vzcywga2V5YXV0aCwga2V5dHlwZSwga2V5aGFuZGxlKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwlkdW1wX3Nlc3MoJnNlc3MpOworCisJLyogY2FsY3VsYXRlIGVuY3J5cHRlZCBhdXRob3JpemF0aW9uIHZhbHVlICovCisJbWVtY3B5KHRkLT54b3J3b3JrLCBzZXNzLnNlY3JldCwgU0hBMV9ESUdFU1RfU0laRSk7CisJbWVtY3B5KHRkLT54b3J3b3JrICsgU0hBMV9ESUdFU1RfU0laRSwgc2Vzcy5lbm9uY2UsIFNIQTFfRElHRVNUX1NJWkUpOworCXJldCA9IFRTU19zaGExKHRkLT54b3J3b3JrLCBTSEExX0RJR0VTVF9TSVpFICogMiwgdGQtPnhvcmhhc2gpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gdHBtX2dldF9yYW5kb20odGIsIHRkLT5ub25jZW9kZCwgVFBNX05PTkNFX1NJWkUpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCW9yZGluYWwgPSBodG9ubChUUE1fT1JEX1NFQUwpOworCWRhdHNpemUgPSBodG9ubChkYXRhbGVuKTsKKwlwY3JzaXplID0gaHRvbmwocGNyaW5mb3NpemUpOworCWNvbnQgPSAwOworCisJLyogZW5jcnlwdCBkYXRhIGF1dGhvcml6YXRpb24ga2V5ICovCisJZm9yIChpID0gMDsgaSA8IFNIQTFfRElHRVNUX1NJWkU7ICsraSkKKwkJdGQtPmVuY2F1dGhbaV0gPSB0ZC0+eG9yaGFzaFtpXSBeIGJsb2JhdXRoW2ldOworCisJLyogY2FsY3VsYXRlIGF1dGhvcml6YXRpb24gSE1BQyB2YWx1ZSAqLworCWlmIChwY3JpbmZvc2l6ZSA9PSAwKSB7CisJCS8qIG5vIHBjciBpbmZvIHNwZWNpZmllZCAqLworCQlyZXQgPSBUU1NfYXV0aGhtYWModGQtPnB1YmF1dGgsIHNlc3Muc2VjcmV0LCBTSEExX0RJR0VTVF9TSVpFLAorCQkJCSAgIHNlc3MuZW5vbmNlLCB0ZC0+bm9uY2VvZGQsIGNvbnQsCisJCQkJICAgc2l6ZW9mKHVpbnQzMl90KSwgJm9yZGluYWwsIFNIQTFfRElHRVNUX1NJWkUsCisJCQkJICAgdGQtPmVuY2F1dGgsIHNpemVvZih1aW50MzJfdCksICZwY3JzaXplLAorCQkJCSAgIHNpemVvZih1aW50MzJfdCksICZkYXRzaXplLCBkYXRhbGVuLCBkYXRhLCAwLAorCQkJCSAgIDApOworCX0gZWxzZSB7CisJCS8qIHBjciBpbmZvIHNwZWNpZmllZCAqLworCQlyZXQgPSBUU1NfYXV0aGhtYWModGQtPnB1YmF1dGgsIHNlc3Muc2VjcmV0LCBTSEExX0RJR0VTVF9TSVpFLAorCQkJCSAgIHNlc3MuZW5vbmNlLCB0ZC0+bm9uY2VvZGQsIGNvbnQsCisJCQkJICAgc2l6ZW9mKHVpbnQzMl90KSwgJm9yZGluYWwsIFNIQTFfRElHRVNUX1NJWkUsCisJCQkJICAgdGQtPmVuY2F1dGgsIHNpemVvZih1aW50MzJfdCksICZwY3JzaXplLAorCQkJCSAgIHBjcmluZm9zaXplLCBwY3JpbmZvLCBzaXplb2YodWludDMyX3QpLAorCQkJCSAgICZkYXRzaXplLCBkYXRhbGVuLCBkYXRhLCAwLCAwKTsKKwl9CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwkvKiBidWlsZCBhbmQgc2VuZCB0aGUgVFBNIHJlcXVlc3QgcGFja2V0ICovCisJSU5JVF9CVUYodGIpOworCXN0b3JlMTYodGIsIFRQTV9UQUdfUlFVX0FVVEgxX0NPTU1BTkQpOworCXN0b3JlMzIodGIsIFRQTV9TRUFMX1NJWkUgKyBwY3JpbmZvc2l6ZSArIGRhdGFsZW4pOworCXN0b3JlMzIodGIsIFRQTV9PUkRfU0VBTCk7CisJc3RvcmUzMih0Yiwga2V5aGFuZGxlKTsKKwlzdG9yZWJ5dGVzKHRiLCB0ZC0+ZW5jYXV0aCwgU0hBMV9ESUdFU1RfU0laRSk7CisJc3RvcmUzMih0YiwgcGNyaW5mb3NpemUpOworCXN0b3JlYnl0ZXModGIsIHBjcmluZm8sIHBjcmluZm9zaXplKTsKKwlzdG9yZTMyKHRiLCBkYXRhbGVuKTsKKwlzdG9yZWJ5dGVzKHRiLCBkYXRhLCBkYXRhbGVuKTsKKwlzdG9yZTMyKHRiLCBzZXNzLmhhbmRsZSk7CisJc3RvcmVieXRlcyh0YiwgdGQtPm5vbmNlb2RkLCBUUE1fTk9OQ0VfU0laRSk7CisJc3RvcmU4KHRiLCBjb250KTsKKwlzdG9yZWJ5dGVzKHRiLCB0ZC0+cHViYXV0aCwgU0hBMV9ESUdFU1RfU0laRSk7CisKKwlyZXQgPSB0cnVzdGVkX3RwbV9zZW5kKFRQTV9BTllfTlVNLCB0Yi0+ZGF0YSwgTUFYX0JVRl9TSVpFKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCS8qIGNhbGN1bGF0ZSB0aGUgc2l6ZSBvZiB0aGUgcmV0dXJuZWQgQmxvYiAqLworCXNlYWxpbmZvc2l6ZSA9IExPQUQzMih0Yi0+ZGF0YSwgVFBNX0RBVEFfT0ZGU0VUICsgc2l6ZW9mKHVpbnQzMl90KSk7CisJZW5jZGF0YXNpemUgPSBMT0FEMzIodGItPmRhdGEsIFRQTV9EQVRBX09GRlNFVCArIHNpemVvZih1aW50MzJfdCkgKworCQkJICAgICBzaXplb2YodWludDMyX3QpICsgc2VhbGluZm9zaXplKTsKKwlzdG9yZWRzaXplID0gc2l6ZW9mKHVpbnQzMl90KSArIHNpemVvZih1aW50MzJfdCkgKyBzZWFsaW5mb3NpemUgKworCSAgICBzaXplb2YodWludDMyX3QpICsgZW5jZGF0YXNpemU7CisKKwkvKiBjaGVjayB0aGUgSE1BQyBpbiB0aGUgcmVzcG9uc2UgKi8KKwlyZXQgPSBUU1NfY2hlY2tobWFjMSh0Yi0+ZGF0YSwgb3JkaW5hbCwgdGQtPm5vbmNlb2RkLCBzZXNzLnNlY3JldCwKKwkJCSAgICAgU0hBMV9ESUdFU1RfU0laRSwgc3RvcmVkc2l6ZSwgVFBNX0RBVEFfT0ZGU0VULCAwLAorCQkJICAgICAwKTsKKworCS8qIGNvcHkgdGhlIHJldHVybmVkIGJsb2IgdG8gY2FsbGVyICovCisJaWYgKCFyZXQpIHsKKwkJbWVtY3B5KGJsb2IsIHRiLT5kYXRhICsgVFBNX0RBVEFfT0ZGU0VULCBzdG9yZWRzaXplKTsKKwkJKmJsb2JsZW4gPSBzdG9yZWRzaXplOworCX0KKwlyZXR1cm4gcmV0OworfQorCisvKgorICogdXNlIHRoZSBBVVRIMl9DT01NQU5EIGZvcm0gb2YgdW5zZWFsLCB0byBhdXRob3JpemUgYm90aCBrZXkgYW5kIGJsb2IKKyAqLworc3RhdGljIGludCB0cG1fdW5zZWFsKHN0cnVjdCB0cG1fYnVmICp0YiwKKwkJICAgICAgdWludDMyX3Qga2V5aGFuZGxlLCBjb25zdCB1bnNpZ25lZCBjaGFyICprZXlhdXRoLAorCQkgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpibG9iLCBpbnQgYmxvYmxlbiwKKwkJICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqYmxvYmF1dGgsCisJCSAgICAgIHVuc2lnbmVkIGNoYXIgKmRhdGEsIHVuc2lnbmVkIGludCAqZGF0YWxlbikKK3sKKwl1bnNpZ25lZCBjaGFyIG5vbmNlb2RkW1RQTV9OT05DRV9TSVpFXTsKKwl1bnNpZ25lZCBjaGFyIGVub25jZTFbVFBNX05PTkNFX1NJWkVdOworCXVuc2lnbmVkIGNoYXIgZW5vbmNlMltUUE1fTk9OQ0VfU0laRV07CisJdW5zaWduZWQgY2hhciBhdXRoZGF0YTFbU0hBMV9ESUdFU1RfU0laRV07CisJdW5zaWduZWQgY2hhciBhdXRoZGF0YTJbU0hBMV9ESUdFU1RfU0laRV07CisJdWludDMyX3QgYXV0aGhhbmRsZTEgPSAwOworCXVpbnQzMl90IGF1dGhoYW5kbGUyID0gMDsKKwl1bnNpZ25lZCBjaGFyIGNvbnQgPSAwOworCXVpbnQzMl90IG9yZGluYWw7CisJdWludDMyX3Qga2V5aG5kbDsKKwlpbnQgcmV0OworCisJLyogc2Vzc2lvbnMgZm9yIHVuc2VhbGluZyBrZXkgYW5kIGRhdGEgKi8KKwlyZXQgPSBvaWFwKHRiLCAmYXV0aGhhbmRsZTEsIGVub25jZTEpOworCWlmIChyZXQgPCAwKSB7CisJCXByX2luZm8oInRydXN0ZWRfa2V5OiBvaWFwIGZhaWxlZCAoJWQpXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKwlyZXQgPSBvaWFwKHRiLCAmYXV0aGhhbmRsZTIsIGVub25jZTIpOworCWlmIChyZXQgPCAwKSB7CisJCXByX2luZm8oInRydXN0ZWRfa2V5OiBvaWFwIGZhaWxlZCAoJWQpXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCW9yZGluYWwgPSBodG9ubChUUE1fT1JEX1VOU0VBTCk7CisJa2V5aG5kbCA9IGh0b25sKFNSS0hBTkRMRSk7CisJcmV0ID0gdHBtX2dldF9yYW5kb20odGIsIG5vbmNlb2RkLCBUUE1fTk9OQ0VfU0laRSk7CisJaWYgKHJldCA8IDApIHsKKwkJcHJfaW5mbygidHJ1c3RlZF9rZXk6IHRwbV9nZXRfcmFuZG9tIGZhaWxlZCAoJWQpXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKwlyZXQgPSBUU1NfYXV0aGhtYWMoYXV0aGRhdGExLCBrZXlhdXRoLCBUUE1fTk9OQ0VfU0laRSwKKwkJCSAgIGVub25jZTEsIG5vbmNlb2RkLCBjb250LCBzaXplb2YodWludDMyX3QpLAorCQkJICAgJm9yZGluYWwsIGJsb2JsZW4sIGJsb2IsIDAsIDApOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCXJldCA9IFRTU19hdXRoaG1hYyhhdXRoZGF0YTIsIGJsb2JhdXRoLCBUUE1fTk9OQ0VfU0laRSwKKwkJCSAgIGVub25jZTIsIG5vbmNlb2RkLCBjb250LCBzaXplb2YodWludDMyX3QpLAorCQkJICAgJm9yZGluYWwsIGJsb2JsZW4sIGJsb2IsIDAsIDApOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJLyogYnVpbGQgYW5kIHNlbmQgVFBNIHJlcXVlc3QgcGFja2V0ICovCisJSU5JVF9CVUYodGIpOworCXN0b3JlMTYodGIsIFRQTV9UQUdfUlFVX0FVVEgyX0NPTU1BTkQpOworCXN0b3JlMzIodGIsIFRQTV9VTlNFQUxfU0laRSArIGJsb2JsZW4pOworCXN0b3JlMzIodGIsIFRQTV9PUkRfVU5TRUFMKTsKKwlzdG9yZTMyKHRiLCBrZXloYW5kbGUpOworCXN0b3JlYnl0ZXModGIsIGJsb2IsIGJsb2JsZW4pOworCXN0b3JlMzIodGIsIGF1dGhoYW5kbGUxKTsKKwlzdG9yZWJ5dGVzKHRiLCBub25jZW9kZCwgVFBNX05PTkNFX1NJWkUpOworCXN0b3JlOCh0YiwgY29udCk7CisJc3RvcmVieXRlcyh0YiwgYXV0aGRhdGExLCBTSEExX0RJR0VTVF9TSVpFKTsKKwlzdG9yZTMyKHRiLCBhdXRoaGFuZGxlMik7CisJc3RvcmVieXRlcyh0Yiwgbm9uY2VvZGQsIFRQTV9OT05DRV9TSVpFKTsKKwlzdG9yZTgodGIsIGNvbnQpOworCXN0b3JlYnl0ZXModGIsIGF1dGhkYXRhMiwgU0hBMV9ESUdFU1RfU0laRSk7CisKKwlyZXQgPSB0cnVzdGVkX3RwbV9zZW5kKFRQTV9BTllfTlVNLCB0Yi0+ZGF0YSwgTUFYX0JVRl9TSVpFKTsKKwlpZiAocmV0IDwgMCkgeworCQlwcl9pbmZvKCJ0cnVzdGVkX2tleTogYXV0aGhtYWMgZmFpbGVkICglZClcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJKmRhdGFsZW4gPSBMT0FEMzIodGItPmRhdGEsIFRQTV9EQVRBX09GRlNFVCk7CisJcmV0ID0gVFNTX2NoZWNraG1hYzIodGItPmRhdGEsIG9yZGluYWwsIG5vbmNlb2RkLAorCQkJICAgICBrZXlhdXRoLCBTSEExX0RJR0VTVF9TSVpFLAorCQkJICAgICBibG9iYXV0aCwgU0hBMV9ESUdFU1RfU0laRSwKKwkJCSAgICAgc2l6ZW9mKHVpbnQzMl90KSwgVFBNX0RBVEFfT0ZGU0VULAorCQkJICAgICAqZGF0YWxlbiwgVFBNX0RBVEFfT0ZGU0VUICsgc2l6ZW9mKHVpbnQzMl90KSwgMCwKKwkJCSAgICAgMCk7CisJaWYgKHJldCA8IDApIHsKKwkJcHJfaW5mbygidHJ1c3RlZF9rZXk6IFRTU19jaGVja2htYWMyIGZhaWxlZCAoJWQpXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKwltZW1jcHkoZGF0YSwgdGItPmRhdGEgKyBUUE1fREFUQV9PRkZTRVQgKyBzaXplb2YodWludDMyX3QpLCAqZGF0YWxlbik7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBIYXZlIHRoZSBUUE0gc2VhbChlbmNyeXB0KSB0aGUgc3ltbWV0cmljIGtleQorICovCitzdGF0aWMgaW50IGtleV9zZWFsKHN0cnVjdCB0cnVzdGVkX2tleV9wYXlsb2FkICpwLAorCQkgICAgc3RydWN0IHRydXN0ZWRfa2V5X29wdGlvbnMgKm8pCit7CisJc3RydWN0IHRwbV9idWYgKnRiOworCWludCByZXQ7CisKKwl0YiA9IGt6YWxsb2Moc2l6ZW9mICp0YiwgR0ZQX0tFUk5FTCk7CisJaWYgKCF0YikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkvKiBpbmNsdWRlIG1pZ3JhdGFibGUgZmxhZyBhdCBlbmQgb2Ygc2VhbGVkIGtleSAqLworCXAtPmtleVtwLT5rZXlfbGVuXSA9IHAtPm1pZ3JhdGFibGU7CisKKwlyZXQgPSB0cG1fc2VhbCh0Yiwgby0+a2V5dHlwZSwgby0+a2V5aGFuZGxlLCBvLT5rZXlhdXRoLAorCQkgICAgICAgcC0+a2V5LCBwLT5rZXlfbGVuICsgMSwgcC0+YmxvYiwgJnAtPmJsb2JfbGVuLAorCQkgICAgICAgby0+YmxvYmF1dGgsIG8tPnBjcmluZm8sIG8tPnBjcmluZm9fbGVuKTsKKwlpZiAocmV0IDwgMCkKKwkJcHJfaW5mbygidHJ1c3RlZF9rZXk6IHNya3NlYWwgZmFpbGVkICglZClcbiIsIHJldCk7CisKKwlrZnJlZSh0Yik7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIEhhdmUgdGhlIFRQTSB1bnNlYWwoZGVjcnlwdCkgdGhlIHN5bW1ldHJpYyBrZXkKKyAqLworc3RhdGljIGludCBrZXlfdW5zZWFsKHN0cnVjdCB0cnVzdGVkX2tleV9wYXlsb2FkICpwLAorCQkgICAgICBzdHJ1Y3QgdHJ1c3RlZF9rZXlfb3B0aW9ucyAqbykKK3sKKwlzdHJ1Y3QgdHBtX2J1ZiAqdGI7CisJaW50IHJldDsKKworCXRiID0ga3phbGxvYyhzaXplb2YgKnRiLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXRiKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJldCA9IHRwbV91bnNlYWwodGIsIG8tPmtleWhhbmRsZSwgby0+a2V5YXV0aCwgcC0+YmxvYiwgcC0+YmxvYl9sZW4sCisJCQkgby0+YmxvYmF1dGgsIHAtPmtleSwgJnAtPmtleV9sZW4pOworCWlmIChyZXQgPCAwKQorCQlwcl9pbmZvKCJ0cnVzdGVkX2tleTogc3JrdW5zZWFsIGZhaWxlZCAoJWQpXG4iLCByZXQpOworCWVsc2UKKwkJLyogcHVsbCBtaWdyYXRhYmxlIGZsYWcgb3V0IG9mIHNlYWxlZCBrZXkgKi8KKwkJcC0+bWlncmF0YWJsZSA9IHAtPmtleVstLXAtPmtleV9sZW5dOworCisJa2ZyZWUodGIpOworCXJldHVybiByZXQ7Cit9CisKK2VudW0geworCU9wdF9lcnIgPSAtMSwKKwlPcHRfbmV3LCBPcHRfbG9hZCwgT3B0X3VwZGF0ZSwKKwlPcHRfa2V5aGFuZGxlLCBPcHRfa2V5YXV0aCwgT3B0X2Jsb2JhdXRoLAorCU9wdF9wY3JpbmZvLCBPcHRfcGNybG9jaywgT3B0X21pZ3JhdGFibGUKK307CisKK3N0YXRpYyBjb25zdCBtYXRjaF90YWJsZV90IGtleV90b2tlbnMgPSB7CisJe09wdF9uZXcsICJuZXcifSwKKwl7T3B0X2xvYWQsICJsb2FkIn0sCisJe09wdF91cGRhdGUsICJ1cGRhdGUifSwKKwl7T3B0X2tleWhhbmRsZSwgImtleWhhbmRsZT0lcyJ9LAorCXtPcHRfa2V5YXV0aCwgImtleWF1dGg9JXMifSwKKwl7T3B0X2Jsb2JhdXRoLCAiYmxvYmF1dGg9JXMifSwKKwl7T3B0X3BjcmluZm8sICJwY3JpbmZvPSVzIn0sCisJe09wdF9wY3Jsb2NrLCAicGNybG9jaz0lcyJ9LAorCXtPcHRfbWlncmF0YWJsZSwgIm1pZ3JhdGFibGU9JXMifSwKKwl7T3B0X2VyciwgTlVMTH0KK307CisKKy8qIGNhbiBoYXZlIHplcm8gb3IgbW9yZSB0b2tlbj0gb3B0aW9ucyAqLworc3RhdGljIGludCBnZXRvcHRpb25zKGNoYXIgKmMsIHN0cnVjdCB0cnVzdGVkX2tleV9wYXlsb2FkICpwYXksCisJCSAgICAgIHN0cnVjdCB0cnVzdGVkX2tleV9vcHRpb25zICpvcHQpCit7CisJc3Vic3RyaW5nX3QgYXJnc1tNQVhfT1BUX0FSR1NdOworCWNoYXIgKnAgPSBjOworCWludCB0b2tlbjsKKwlpbnQgcmVzOworCXVuc2lnbmVkIGxvbmcgaGFuZGxlOworCXVuc2lnbmVkIGxvbmcgbG9jazsKKworCXdoaWxlICgocCA9IHN0cnNlcCgmYywgIiBcdCIpKSkgeworCQlpZiAoKnAgPT0gJ1wwJyB8fCAqcCA9PSAnICcgfHwgKnAgPT0gJ1x0JykKKwkJCWNvbnRpbnVlOworCQl0b2tlbiA9IG1hdGNoX3Rva2VuKHAsIGtleV90b2tlbnMsIGFyZ3MpOworCisJCXN3aXRjaCAodG9rZW4pIHsKKwkJY2FzZSBPcHRfcGNyaW5mbzoKKwkJCW9wdC0+cGNyaW5mb19sZW4gPSBzdHJsZW4oYXJnc1swXS5mcm9tKSAvIDI7CisJCQlpZiAob3B0LT5wY3JpbmZvX2xlbiA+IE1BWF9QQ1JJTkZPX1NJWkUpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQloZXgyYmluKG9wdC0+cGNyaW5mbywgYXJnc1swXS5mcm9tLCBvcHQtPnBjcmluZm9fbGVuKTsKKwkJCWJyZWFrOworCQljYXNlIE9wdF9rZXloYW5kbGU6CisJCQlyZXMgPSBzdHJpY3Rfc3RydG91bChhcmdzWzBdLmZyb20sIDE2LCAmaGFuZGxlKTsKKwkJCWlmIChyZXMgPCAwKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJb3B0LT5rZXl0eXBlID0gU0VBTF9rZXl0eXBlOworCQkJb3B0LT5rZXloYW5kbGUgPSBoYW5kbGU7CisJCQlicmVhazsKKwkJY2FzZSBPcHRfa2V5YXV0aDoKKwkJCWlmIChzdHJsZW4oYXJnc1swXS5mcm9tKSAhPSAyICogU0hBMV9ESUdFU1RfU0laRSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCWhleDJiaW4ob3B0LT5rZXlhdXRoLCBhcmdzWzBdLmZyb20sIFNIQTFfRElHRVNUX1NJWkUpOworCQkJYnJlYWs7CisJCWNhc2UgT3B0X2Jsb2JhdXRoOgorCQkJaWYgKHN0cmxlbihhcmdzWzBdLmZyb20pICE9IDIgKiBTSEExX0RJR0VTVF9TSVpFKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJaGV4MmJpbihvcHQtPmJsb2JhdXRoLCBhcmdzWzBdLmZyb20sIFNIQTFfRElHRVNUX1NJWkUpOworCQkJYnJlYWs7CisJCWNhc2UgT3B0X21pZ3JhdGFibGU6CisJCQlpZiAoKmFyZ3NbMF0uZnJvbSA9PSAnMCcpCisJCQkJcGF5LT5taWdyYXRhYmxlID0gMDsKKwkJCWVsc2UKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCWJyZWFrOworCQljYXNlIE9wdF9wY3Jsb2NrOgorCQkJcmVzID0gc3RyaWN0X3N0cnRvdWwoYXJnc1swXS5mcm9tLCAxMCwgJmxvY2spOworCQkJaWYgKHJlcyA8IDApCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlvcHQtPnBjcmxvY2sgPSBsb2NrOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGRhdGFibG9iX3BhcnNlIC0gcGFyc2UgdGhlIGtleWN0bCBkYXRhIGFuZCBmaWxsIGluIHRoZQorICogCQkgICAgcGF5bG9hZCBhbmQgb3B0aW9ucyBzdHJ1Y3R1cmVzCisgKgorICogT24gc3VjY2VzcyByZXR1cm5zIDAsIG90aGVyd2lzZSAtRUlOVkFMLgorICovCitzdGF0aWMgaW50IGRhdGFibG9iX3BhcnNlKGNoYXIgKmRhdGFibG9iLCBzdHJ1Y3QgdHJ1c3RlZF9rZXlfcGF5bG9hZCAqcCwKKwkJCSAgc3RydWN0IHRydXN0ZWRfa2V5X29wdGlvbnMgKm8pCit7CisJc3Vic3RyaW5nX3QgYXJnc1tNQVhfT1BUX0FSR1NdOworCWxvbmcga2V5bGVuOworCWludCByZXQgPSAtRUlOVkFMOworCWludCBrZXlfY21kOworCWNoYXIgKmM7CisKKwkvKiBtYWluIGNvbW1hbmQgKi8KKwljID0gc3Ryc2VwKCZkYXRhYmxvYiwgIiBcdCIpOworCWlmICghYykKKwkJcmV0dXJuIC1FSU5WQUw7CisJa2V5X2NtZCA9IG1hdGNoX3Rva2VuKGMsIGtleV90b2tlbnMsIGFyZ3MpOworCXN3aXRjaCAoa2V5X2NtZCkgeworCWNhc2UgT3B0X25ldzoKKwkJLyogZmlyc3QgYXJndW1lbnQgaXMga2V5IHNpemUgKi8KKwkJYyA9IHN0cnNlcCgmZGF0YWJsb2IsICIgXHQiKTsKKwkJaWYgKCFjKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCXJldCA9IHN0cmljdF9zdHJ0b2woYywgMTAsICZrZXlsZW4pOworCQlpZiAocmV0IDwgMCB8fCBrZXlsZW4gPCBNSU5fS0VZX1NJWkUgfHwga2V5bGVuID4gTUFYX0tFWV9TSVpFKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCXAtPmtleV9sZW4gPSBrZXlsZW47CisJCXJldCA9IGdldG9wdGlvbnMoZGF0YWJsb2IsIHAsIG8pOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisJCXJldCA9IE9wdF9uZXc7CisJCWJyZWFrOworCWNhc2UgT3B0X2xvYWQ6CisJCS8qIGZpcnN0IGFyZ3VtZW50IGlzIHNlYWxlZCBibG9iICovCisJCWMgPSBzdHJzZXAoJmRhdGFibG9iLCAiIFx0Iik7CisJCWlmICghYykKKwkJCXJldHVybiAtRUlOVkFMOworCQlwLT5ibG9iX2xlbiA9IHN0cmxlbihjKSAvIDI7CisJCWlmIChwLT5ibG9iX2xlbiA+IE1BWF9CTE9CX1NJWkUpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaGV4MmJpbihwLT5ibG9iLCBjLCBwLT5ibG9iX2xlbik7CisJCXJldCA9IGdldG9wdGlvbnMoZGF0YWJsb2IsIHAsIG8pOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisJCXJldCA9IE9wdF9sb2FkOworCQlicmVhazsKKwljYXNlIE9wdF91cGRhdGU6CisJCS8qIGFsbCBhcmd1bWVudHMgYXJlIG9wdGlvbnMgKi8KKwkJcmV0ID0gZ2V0b3B0aW9ucyhkYXRhYmxvYiwgcCwgbyk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwkJcmV0ID0gT3B0X3VwZGF0ZTsKKwkJYnJlYWs7CisJY2FzZSBPcHRfZXJyOgorCQlyZXR1cm4gLUVJTlZBTDsKKwkJYnJlYWs7CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdHJ1c3RlZF9rZXlfb3B0aW9ucyAqdHJ1c3RlZF9vcHRpb25zX2FsbG9jKHZvaWQpCit7CisJc3RydWN0IHRydXN0ZWRfa2V5X29wdGlvbnMgKm9wdGlvbnM7CisKKwlvcHRpb25zID0ga3phbGxvYyhzaXplb2YgKm9wdGlvbnMsIEdGUF9LRVJORUwpOworCWlmIChvcHRpb25zKSB7CisJCS8qIHNldCBhbnkgbm9uLXplcm8gZGVmYXVsdHMgKi8KKwkJb3B0aW9ucy0+a2V5dHlwZSA9IFNSS19rZXl0eXBlOworCQlvcHRpb25zLT5rZXloYW5kbGUgPSBTUktIQU5ETEU7CisJfQorCXJldHVybiBvcHRpb25zOworfQorCitzdGF0aWMgc3RydWN0IHRydXN0ZWRfa2V5X3BheWxvYWQgKnRydXN0ZWRfcGF5bG9hZF9hbGxvYyhzdHJ1Y3Qga2V5ICprZXkpCit7CisJc3RydWN0IHRydXN0ZWRfa2V5X3BheWxvYWQgKnAgPSBOVUxMOworCWludCByZXQ7CisKKwlyZXQgPSBrZXlfcGF5bG9hZF9yZXNlcnZlKGtleSwgc2l6ZW9mICpwKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHA7CisJcCA9IGt6YWxsb2Moc2l6ZW9mICpwLCBHRlBfS0VSTkVMKTsKKwlpZiAocCkKKwkJcC0+bWlncmF0YWJsZSA9IDE7IC8qIG1pZ3JhdGFibGUgYnkgZGVmYXVsdCAqLworCXJldHVybiBwOworfQorCisvKgorICogdHJ1c3RlZF9pbnN0YW50aWF0ZSAtIGNyZWF0ZSBhIG5ldyB0cnVzdGVkIGtleQorICoKKyAqIFVuc2VhbCBhbiBleGlzdGluZyB0cnVzdGVkIGJsb2Igb3IsIGZvciBhIG5ldyBrZXksIGdldCBhCisgKiByYW5kb20ga2V5LCB0aGVuIHNlYWwgYW5kIGNyZWF0ZSBhIHRydXN0ZWQga2V5LXR5cGUga2V5LAorICogYWRkaW5nIGl0IHRvIHRoZSBzcGVjaWZpZWQga2V5cmluZy4KKyAqCisgKiBPbiBzdWNjZXNzLCByZXR1cm4gMC4gT3RoZXJ3aXNlIHJldHVybiBlcnJuby4KKyAqLworc3RhdGljIGludCB0cnVzdGVkX2luc3RhbnRpYXRlKHN0cnVjdCBrZXkgKmtleSwgY29uc3Qgdm9pZCAqZGF0YSwKKwkJCSAgICAgICBzaXplX3QgZGF0YWxlbikKK3sKKwlzdHJ1Y3QgdHJ1c3RlZF9rZXlfcGF5bG9hZCAqcGF5bG9hZCA9IE5VTEw7CisJc3RydWN0IHRydXN0ZWRfa2V5X29wdGlvbnMgKm9wdGlvbnMgPSBOVUxMOworCWNoYXIgKmRhdGFibG9iOworCWludCByZXQgPSAwOworCWludCBrZXlfY21kOworCisJaWYgKGRhdGFsZW4gPD0gMCB8fCBkYXRhbGVuID4gMzI3NjcgfHwgIWRhdGEpCisJCXJldHVybiAtRUlOVkFMOworCisJZGF0YWJsb2IgPSBrbWFsbG9jKGRhdGFsZW4gKyAxLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRhdGFibG9iKQorCQlyZXR1cm4gLUVOT01FTTsKKwltZW1jcHkoZGF0YWJsb2IsIGRhdGEsIGRhdGFsZW4pOworCWRhdGFibG9iW2RhdGFsZW5dID0gJ1wwJzsKKworCW9wdGlvbnMgPSB0cnVzdGVkX29wdGlvbnNfYWxsb2MoKTsKKwlpZiAoIW9wdGlvbnMpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBvdXQ7CisJfQorCXBheWxvYWQgPSB0cnVzdGVkX3BheWxvYWRfYWxsb2Moa2V5KTsKKwlpZiAoIXBheWxvYWQpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBvdXQ7CisJfQorCisJa2V5X2NtZCA9IGRhdGFibG9iX3BhcnNlKGRhdGFibG9iLCBwYXlsb2FkLCBvcHRpb25zKTsKKwlpZiAoa2V5X2NtZCA8IDApIHsKKwkJcmV0ID0ga2V5X2NtZDsKKwkJZ290byBvdXQ7CisJfQorCisJZHVtcF9wYXlsb2FkKHBheWxvYWQpOworCWR1bXBfb3B0aW9ucyhvcHRpb25zKTsKKworCXN3aXRjaCAoa2V5X2NtZCkgeworCWNhc2UgT3B0X2xvYWQ6CisJCXJldCA9IGtleV91bnNlYWwocGF5bG9hZCwgb3B0aW9ucyk7CisJCWR1bXBfcGF5bG9hZChwYXlsb2FkKTsKKwkJZHVtcF9vcHRpb25zKG9wdGlvbnMpOworCQlpZiAocmV0IDwgMCkKKwkJCXByX2luZm8oInRydXN0ZWRfa2V5OiBrZXlfdW5zZWFsIGZhaWxlZCAoJWQpXG4iLCByZXQpOworCQlicmVhazsKKwljYXNlIE9wdF9uZXc6CisJCXJldCA9IG15X2dldF9yYW5kb20ocGF5bG9hZC0+a2V5LCBwYXlsb2FkLT5rZXlfbGVuKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCXByX2luZm8oInRydXN0ZWRfa2V5OiBrZXlfY3JlYXRlIGZhaWxlZCAoJWQpXG4iLCByZXQpOworCQkJZ290byBvdXQ7CisJCX0KKwkJcmV0ID0ga2V5X3NlYWwocGF5bG9hZCwgb3B0aW9ucyk7CisJCWlmIChyZXQgPCAwKQorCQkJcHJfaW5mbygidHJ1c3RlZF9rZXk6IGtleV9zZWFsIGZhaWxlZCAoJWQpXG4iLCByZXQpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisJaWYgKCFyZXQgJiYgb3B0aW9ucy0+cGNybG9jaykKKwkJcmV0ID0gcGNybG9jayhvcHRpb25zLT5wY3Jsb2NrKTsKK291dDoKKwlrZnJlZShkYXRhYmxvYik7CisJa2ZyZWUob3B0aW9ucyk7CisJaWYgKCFyZXQpCisJCXJjdV9hc3NpZ25fcG9pbnRlcihrZXktPnBheWxvYWQuZGF0YSwgcGF5bG9hZCk7CisJZWxzZQorCQlrZnJlZShwYXlsb2FkKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCB0cnVzdGVkX3JjdV9mcmVlKHN0cnVjdCByY3VfaGVhZCAqcmN1KQoreworCXN0cnVjdCB0cnVzdGVkX2tleV9wYXlsb2FkICpwOworCisJcCA9IGNvbnRhaW5lcl9vZihyY3UsIHN0cnVjdCB0cnVzdGVkX2tleV9wYXlsb2FkLCByY3UpOworCW1lbXNldChwLT5rZXksIDAsIHAtPmtleV9sZW4pOworCWtmcmVlKHApOworfQorCisvKgorICogdHJ1c3RlZF91cGRhdGUgLSByZXNlYWwgYW4gZXhpc3Rpbmcga2V5IHdpdGggbmV3IFBDUiB2YWx1ZXMKKyAqLworc3RhdGljIGludCB0cnVzdGVkX3VwZGF0ZShzdHJ1Y3Qga2V5ICprZXksIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBkYXRhbGVuKQoreworCXN0cnVjdCB0cnVzdGVkX2tleV9wYXlsb2FkICpwID0ga2V5LT5wYXlsb2FkLmRhdGE7CisJc3RydWN0IHRydXN0ZWRfa2V5X3BheWxvYWQgKm5ld19wOworCXN0cnVjdCB0cnVzdGVkX2tleV9vcHRpb25zICpuZXdfbzsKKwljaGFyICpkYXRhYmxvYjsKKwlpbnQgcmV0ID0gMDsKKworCWlmICghcC0+bWlncmF0YWJsZSkKKwkJcmV0dXJuIC1FUEVSTTsKKwlpZiAoZGF0YWxlbiA8PSAwIHx8IGRhdGFsZW4gPiAzMjc2NyB8fCAhZGF0YSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlkYXRhYmxvYiA9IGttYWxsb2MoZGF0YWxlbiArIDEsIEdGUF9LRVJORUwpOworCWlmICghZGF0YWJsb2IpCisJCXJldHVybiAtRU5PTUVNOworCW5ld19vID0gdHJ1c3RlZF9vcHRpb25zX2FsbG9jKCk7CisJaWYgKCFuZXdfbykgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIG91dDsKKwl9CisJbmV3X3AgPSB0cnVzdGVkX3BheWxvYWRfYWxsb2Moa2V5KTsKKwlpZiAoIW5ld19wKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gb3V0OworCX0KKworCW1lbWNweShkYXRhYmxvYiwgZGF0YSwgZGF0YWxlbik7CisJZGF0YWJsb2JbZGF0YWxlbl0gPSAnXDAnOworCXJldCA9IGRhdGFibG9iX3BhcnNlKGRhdGFibG9iLCBuZXdfcCwgbmV3X28pOworCWlmIChyZXQgIT0gT3B0X3VwZGF0ZSkgeworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisJLyogY29weSBvbGQga2V5IHZhbHVlcywgYW5kIHJlc2VhbCB3aXRoIG5ldyBwY3JzICovCisJbmV3X3AtPm1pZ3JhdGFibGUgPSBwLT5taWdyYXRhYmxlOworCW5ld19wLT5rZXlfbGVuID0gcC0+a2V5X2xlbjsKKwltZW1jcHkobmV3X3AtPmtleSwgcC0+a2V5LCBwLT5rZXlfbGVuKTsKKwlkdW1wX3BheWxvYWQocCk7CisJZHVtcF9wYXlsb2FkKG5ld19wKTsKKworCXJldCA9IGtleV9zZWFsKG5ld19wLCBuZXdfbyk7CisJaWYgKHJldCA8IDApIHsKKwkJcHJfaW5mbygidHJ1c3RlZF9rZXk6IGtleV9zZWFsIGZhaWxlZCAoJWQpXG4iLCByZXQpOworCQlrZnJlZShuZXdfcCk7CisJCWdvdG8gb3V0OworCX0KKwlpZiAobmV3X28tPnBjcmxvY2spIHsKKwkJcmV0ID0gcGNybG9jayhuZXdfby0+cGNybG9jayk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlwcl9pbmZvKCJ0cnVzdGVkX2tleTogcGNybG9jayBmYWlsZWQgKCVkKVxuIiwgcmV0KTsKKwkJCWtmcmVlKG5ld19wKTsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCXJjdV9hc3NpZ25fcG9pbnRlcihrZXktPnBheWxvYWQuZGF0YSwgbmV3X3ApOworCWNhbGxfcmN1KCZwLT5yY3UsIHRydXN0ZWRfcmN1X2ZyZWUpOworb3V0OgorCWtmcmVlKGRhdGFibG9iKTsKKwlrZnJlZShuZXdfbyk7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIHRydXN0ZWRfcmVhZCAtIGNvcHkgdGhlIHNlYWxlZCBibG9iIGRhdGEgdG8gdXNlcnNwYWNlIGluIGhleC4KKyAqIE9uIHN1Y2Nlc3MsIHJldHVybiB0byB1c2Vyc3BhY2UgdGhlIHRydXN0ZWQga2V5IGRhdGFibG9iIHNpemUuCisgKi8KK3N0YXRpYyBsb25nIHRydXN0ZWRfcmVhZChjb25zdCBzdHJ1Y3Qga2V5ICprZXksIGNoYXIgX191c2VyICpidWZmZXIsCisJCQkgc2l6ZV90IGJ1ZmxlbikKK3sKKwlzdHJ1Y3QgdHJ1c3RlZF9rZXlfcGF5bG9hZCAqcDsKKwljaGFyICphc2NpaV9idWY7CisJY2hhciAqYnVmcDsKKwlpbnQgaTsKKworCXAgPSByY3VfZGVyZWZlcmVuY2VfcHJvdGVjdGVkKGtleS0+cGF5bG9hZC5kYXRhLAorCQkJcndzZW1faXNfbG9ja2VkKCYoKHN0cnVjdCBrZXkgKilrZXkpLT5zZW0pKTsKKwlpZiAoIXApCisJCXJldHVybiAtRUlOVkFMOworCWlmICghYnVmZmVyIHx8IGJ1ZmxlbiA8PSAwKQorCQlyZXR1cm4gMiAqIHAtPmJsb2JfbGVuOworCWFzY2lpX2J1ZiA9IGttYWxsb2MoMiAqIHAtPmJsb2JfbGVuLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWFzY2lpX2J1ZikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlidWZwID0gYXNjaWlfYnVmOworCWZvciAoaSA9IDA7IGkgPCBwLT5ibG9iX2xlbjsgaSsrKQorCQlidWZwID0gcGFja19oZXhfYnl0ZShidWZwLCBwLT5ibG9iW2ldKTsKKwlpZiAoKGNvcHlfdG9fdXNlcihidWZmZXIsIGFzY2lpX2J1ZiwgMiAqIHAtPmJsb2JfbGVuKSkgIT0gMCkgeworCQlrZnJlZShhc2NpaV9idWYpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisJa2ZyZWUoYXNjaWlfYnVmKTsKKwlyZXR1cm4gMiAqIHAtPmJsb2JfbGVuOworfQorCisvKgorICogdHJ1c3RlZF9kZXN0cm95IC0gYmVmb3JlIGZyZWVpbmcgdGhlIGtleSwgY2xlYXIgdGhlIGRlY3J5cHRlZCBkYXRhCisgKi8KK3N0YXRpYyB2b2lkIHRydXN0ZWRfZGVzdHJveShzdHJ1Y3Qga2V5ICprZXkpCit7CisJc3RydWN0IHRydXN0ZWRfa2V5X3BheWxvYWQgKnAgPSBrZXktPnBheWxvYWQuZGF0YTsKKworCWlmICghcCkKKwkJcmV0dXJuOworCW1lbXNldChwLT5rZXksIDAsIHAtPmtleV9sZW4pOworCWtmcmVlKGtleS0+cGF5bG9hZC5kYXRhKTsKK30KKworc3RydWN0IGtleV90eXBlIGtleV90eXBlX3RydXN0ZWQgPSB7CisJLm5hbWUgPSAidHJ1c3RlZCIsCisJLmluc3RhbnRpYXRlID0gdHJ1c3RlZF9pbnN0YW50aWF0ZSwKKwkudXBkYXRlID0gdHJ1c3RlZF91cGRhdGUsCisJLm1hdGNoID0gdXNlcl9tYXRjaCwKKwkuZGVzdHJveSA9IHRydXN0ZWRfZGVzdHJveSwKKwkuZGVzY3JpYmUgPSB1c2VyX2Rlc2NyaWJlLAorCS5yZWFkID0gdHJ1c3RlZF9yZWFkLAorfTsKKworRVhQT1JUX1NZTUJPTF9HUEwoa2V5X3R5cGVfdHJ1c3RlZCk7CisKK3N0YXRpYyB2b2lkIHRydXN0ZWRfc2hhc2hfcmVsZWFzZSh2b2lkKQoreworCWlmIChoYXNoYWxnKQorCQljcnlwdG9fZnJlZV9zaGFzaChoYXNoYWxnKTsKKwlpZiAoaG1hY2FsZykKKwkJY3J5cHRvX2ZyZWVfc2hhc2goaG1hY2FsZyk7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHRydXN0ZWRfc2hhc2hfYWxsb2Modm9pZCkKK3sKKwlpbnQgcmV0OworCisJaG1hY2FsZyA9IGNyeXB0b19hbGxvY19zaGFzaChobWFjX2FsZywgMCwgQ1JZUFRPX0FMR19BU1lOQyk7CisJaWYgKElTX0VSUihobWFjYWxnKSkgeworCQlwcl9pbmZvKCJ0cnVzdGVkX2tleTogY291bGQgbm90IGFsbG9jYXRlIGNyeXB0byAlc1xuIiwKKwkJCWhtYWNfYWxnKTsKKwkJcmV0dXJuIFBUUl9FUlIoaG1hY2FsZyk7CisJfQorCisJaGFzaGFsZyA9IGNyeXB0b19hbGxvY19zaGFzaChoYXNoX2FsZywgMCwgQ1JZUFRPX0FMR19BU1lOQyk7CisJaWYgKElTX0VSUihoYXNoYWxnKSkgeworCQlwcl9pbmZvKCJ0cnVzdGVkX2tleTogY291bGQgbm90IGFsbG9jYXRlIGNyeXB0byAlc1xuIiwKKwkJCWhhc2hfYWxnKTsKKwkJcmV0ID0gUFRSX0VSUihoYXNoYWxnKTsKKwkJZ290byBoYXNoYWxnX2ZhaWw7CisJfQorCisJcmV0dXJuIDA7CisKK2hhc2hhbGdfZmFpbDoKKwljcnlwdG9fZnJlZV9zaGFzaChobWFjYWxnKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9faW5pdCBpbml0X3RydXN0ZWQodm9pZCkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gdHJ1c3RlZF9zaGFzaF9hbGxvYygpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCXJldCA9IHJlZ2lzdGVyX2tleV90eXBlKCZrZXlfdHlwZV90cnVzdGVkKTsKKwlpZiAocmV0IDwgMCkKKwkJdHJ1c3RlZF9zaGFzaF9yZWxlYXNlKCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGNsZWFudXBfdHJ1c3RlZCh2b2lkKQoreworCXRydXN0ZWRfc2hhc2hfcmVsZWFzZSgpOworCXVucmVnaXN0ZXJfa2V5X3R5cGUoJmtleV90eXBlX3RydXN0ZWQpOworfQorCitsYXRlX2luaXRjYWxsKGluaXRfdHJ1c3RlZCk7Cittb2R1bGVfZXhpdChjbGVhbnVwX3RydXN0ZWQpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9zZWN1cml0eS9rZXlzL3RydXN0ZWRfZGVmaW5lZC5oIGIvc2VjdXJpdHkva2V5cy90cnVzdGVkX2RlZmluZWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjQ5ZmJkCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJpdHkva2V5cy90cnVzdGVkX2RlZmluZWQuaApAQCAtMCwwICsxLDEzNCBAQAorI2lmbmRlZiBfX1RSVVNURURfS0VZX0gKKyNkZWZpbmUgX19UUlVTVEVEX0tFWV9ICisKKy8qIGltcGxlbWVudGF0aW9uIHNwZWNpZmljIFRQTSBjb25zdGFudHMgKi8KKyNkZWZpbmUgTUFYX1BDUklORk9fU0laRQkJNjQKKyNkZWZpbmUgTUFYX0JVRl9TSVpFCQkJNTEyCisjZGVmaW5lIFRQTV9HRVRSQU5ET01fU0laRQkJMTQKKyNkZWZpbmUgVFBNX09TQVBfU0laRQkJCTM2CisjZGVmaW5lIFRQTV9PSUFQX1NJWkUJCQkxMAorI2RlZmluZSBUUE1fU0VBTF9TSVpFCQkJODcKKyNkZWZpbmUgVFBNX1VOU0VBTF9TSVpFCQkJMTA0CisjZGVmaW5lIFRQTV9TSVpFX09GRlNFVAkJCTIKKyNkZWZpbmUgVFBNX1JFVFVSTl9PRkZTRVQJCTYKKyNkZWZpbmUgVFBNX0RBVEFfT0ZGU0VUCQkJMTAKKworI2RlZmluZSBMT0FEMzIoYnVmZmVyLCBvZmZzZXQpCShudG9obCgqKHVpbnQzMl90ICopJmJ1ZmZlcltvZmZzZXRdKSkKKyNkZWZpbmUgTE9BRDMyTihidWZmZXIsIG9mZnNldCkJKCoodWludDMyX3QgKikmYnVmZmVyW29mZnNldF0pCisjZGVmaW5lIExPQUQxNihidWZmZXIsIG9mZnNldCkJKG50b2hzKCoodWludDE2X3QgKikmYnVmZmVyW29mZnNldF0pKQorCitzdHJ1Y3QgdHBtX2J1ZiB7CisJaW50IGxlbjsKKwl1bnNpZ25lZCBjaGFyIGRhdGFbTUFYX0JVRl9TSVpFXTsKK307CisKKyNkZWZpbmUgSU5JVF9CVUYodGIpICh0Yi0+bGVuID0gMCkKKworc3RydWN0IG9zYXBzZXNzIHsKKwl1aW50MzJfdCBoYW5kbGU7CisJdW5zaWduZWQgY2hhciBzZWNyZXRbU0hBMV9ESUdFU1RfU0laRV07CisJdW5zaWduZWQgY2hhciBlbm9uY2VbVFBNX05PTkNFX1NJWkVdOworfTsKKworLyogZGlzY3JldGUgdmFsdWVzLCBidXQgaGF2ZSB0byBzdG9yZSBpbiB1aW50MTZfdCBmb3IgVFBNIHVzZSAqLworZW51bSB7CisJU0VBTF9rZXl0eXBlID0gMSwKKwlTUktfa2V5dHlwZSA9IDQKK307CisKK3N0cnVjdCB0cnVzdGVkX2tleV9vcHRpb25zIHsKKwl1aW50MTZfdCBrZXl0eXBlOworCXVpbnQzMl90IGtleWhhbmRsZTsKKwl1bnNpZ25lZCBjaGFyIGtleWF1dGhbU0hBMV9ESUdFU1RfU0laRV07CisJdW5zaWduZWQgY2hhciBibG9iYXV0aFtTSEExX0RJR0VTVF9TSVpFXTsKKwl1aW50MzJfdCBwY3JpbmZvX2xlbjsKKwl1bnNpZ25lZCBjaGFyIHBjcmluZm9bTUFYX1BDUklORk9fU0laRV07CisJaW50IHBjcmxvY2s7Cit9OworCisjZGVmaW5lIFRQTV9ERUJVRyAwCisKKyNpZiBUUE1fREVCVUcKK3N0YXRpYyBpbmxpbmUgdm9pZCBkdW1wX29wdGlvbnMoc3RydWN0IHRydXN0ZWRfa2V5X29wdGlvbnMgKm8pCit7CisJcHJfaW5mbygidHJ1c3RlZF9rZXk6IHNlYWxpbmcga2V5IHR5cGUgJWRcbiIsIG8tPmtleXR5cGUpOworCXByX2luZm8oInRydXN0ZWRfa2V5OiBzZWFsaW5nIGtleSBoYW5kbGUgJTBYXG4iLCBvLT5rZXloYW5kbGUpOworCXByX2luZm8oInRydXN0ZWRfa2V5OiBwY3Jsb2NrICVkXG4iLCBvLT5wY3Jsb2NrKTsKKwlwcl9pbmZvKCJ0cnVzdGVkX2tleTogcGNyaW5mbyAlZFxuIiwgby0+cGNyaW5mb19sZW4pOworCXByaW50X2hleF9kdW1wKEtFUk5fSU5GTywgInBjcmluZm8gIiwgRFVNUF9QUkVGSVhfTk9ORSwKKwkJICAgICAgIDE2LCAxLCBvLT5wY3JpbmZvLCBvLT5wY3JpbmZvX2xlbiwgMCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkdW1wX3BheWxvYWQoc3RydWN0IHRydXN0ZWRfa2V5X3BheWxvYWQgKnApCit7CisJcHJfaW5mbygidHJ1c3RlZF9rZXk6IGtleV9sZW4gJWRcbiIsIHAtPmtleV9sZW4pOworCXByaW50X2hleF9kdW1wKEtFUk5fSU5GTywgImtleSAiLCBEVU1QX1BSRUZJWF9OT05FLAorCQkgICAgICAgMTYsIDEsIHAtPmtleSwgcC0+a2V5X2xlbiwgMCk7CisJcHJfaW5mbygidHJ1c3RlZF9rZXk6IGJsb2JsZW4gJWRcbiIsIHAtPmJsb2JfbGVuKTsKKwlwcmludF9oZXhfZHVtcChLRVJOX0lORk8sICJibG9iICIsIERVTVBfUFJFRklYX05PTkUsCisJCSAgICAgICAxNiwgMSwgcC0+YmxvYiwgcC0+YmxvYl9sZW4sIDApOworCXByX2luZm8oInRydXN0ZWRfa2V5OiBtaWdyYXRhYmxlICVkXG4iLCBwLT5taWdyYXRhYmxlKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGR1bXBfc2VzcyhzdHJ1Y3Qgb3NhcHNlc3MgKnMpCit7CisJcHJpbnRfaGV4X2R1bXAoS0VSTl9JTkZPLCAidHJ1c3RlZC1rZXk6IGhhbmRsZSAiLCBEVU1QX1BSRUZJWF9OT05FLAorCQkgICAgICAgMTYsIDEsICZzLT5oYW5kbGUsIDQsIDApOworCXByX2luZm8oInRydXN0ZWQta2V5OiBzZWNyZXQ6XG4iKTsKKwlwcmludF9oZXhfZHVtcChLRVJOX0lORk8sICIiLCBEVU1QX1BSRUZJWF9OT05FLAorCQkgICAgICAgMTYsIDEsICZzLT5zZWNyZXQsIFNIQTFfRElHRVNUX1NJWkUsIDApOworCXByX2luZm8oInRydXN0ZWQta2V5OiBlbm9uY2U6XG4iKTsKKwlwcmludF9oZXhfZHVtcChLRVJOX0lORk8sICIiLCBEVU1QX1BSRUZJWF9OT05FLAorCQkgICAgICAgMTYsIDEsICZzLT5lbm9uY2UsIFNIQTFfRElHRVNUX1NJWkUsIDApOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZHVtcF90cG1fYnVmKHVuc2lnbmVkIGNoYXIgKmJ1ZikKK3sKKwlpbnQgbGVuOworCisJcHJfaW5mbygiXG50cnVzdGVkLWtleTogdHBtIGJ1ZmZlclxuIik7CisJbGVuID0gTE9BRDMyKGJ1ZiwgVFBNX1NJWkVfT0ZGU0VUKTsKKwlwcmludF9oZXhfZHVtcChLRVJOX0lORk8sICIiLCBEVU1QX1BSRUZJWF9OT05FLCAxNiwgMSwgYnVmLCBsZW4sIDApOworfQorI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCBkdW1wX29wdGlvbnMoc3RydWN0IHRydXN0ZWRfa2V5X29wdGlvbnMgKm8pCit7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkdW1wX3BheWxvYWQoc3RydWN0IHRydXN0ZWRfa2V5X3BheWxvYWQgKnApCit7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkdW1wX3Nlc3Moc3RydWN0IG9zYXBzZXNzICpzKQoreworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZHVtcF90cG1fYnVmKHVuc2lnbmVkIGNoYXIgKmJ1ZikKK3sKK30KKyNlbmRpZgorCitzdGF0aWMgaW5saW5lIHZvaWQgc3RvcmU4KHN0cnVjdCB0cG1fYnVmICpidWYsIGNvbnN0IHVuc2lnbmVkIGNoYXIgdmFsdWUpCit7CisJYnVmLT5kYXRhW2J1Zi0+bGVuKytdID0gdmFsdWU7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzdG9yZTE2KHN0cnVjdCB0cG1fYnVmICpidWYsIGNvbnN0IHVpbnQxNl90IHZhbHVlKQoreworCSoodWludDE2X3QgKikgJiBidWYtPmRhdGFbYnVmLT5sZW5dID0gaHRvbnModmFsdWUpOworCWJ1Zi0+bGVuICs9IHNpemVvZiB2YWx1ZTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHN0b3JlMzIoc3RydWN0IHRwbV9idWYgKmJ1ZiwgY29uc3QgdWludDMyX3QgdmFsdWUpCit7CisJKih1aW50MzJfdCAqKSAmIGJ1Zi0+ZGF0YVtidWYtPmxlbl0gPSBodG9ubCh2YWx1ZSk7CisJYnVmLT5sZW4gKz0gc2l6ZW9mIHZhbHVlOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc3RvcmVieXRlcyhzdHJ1Y3QgdHBtX2J1ZiAqYnVmLCBjb25zdCB1bnNpZ25lZCBjaGFyICppbiwKKwkJCSAgICAgIGNvbnN0IGludCBsZW4pCit7CisJbWVtY3B5KGJ1Zi0+ZGF0YSArIGJ1Zi0+bGVuLCBpbiwgbGVuKTsKKwlidWYtPmxlbiArPSBsZW47Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NlbGludXgvaG9va3MuYyBiL3NlY3VyaXR5L3NlbGludXgvaG9va3MuYwppbmRleCA2ZjYzN2QyLi5lMjc2ZWI0IDEwMDY0NAotLS0gYS9zZWN1cml0eS9zZWxpbnV4L2hvb2tzLmMKKysrIGIvc2VjdXJpdHkvc2VsaW51eC9ob29rcy5jCkBAIC0yNTI1LDcgKzI1MjUsMTAgQEAKIAlzaWQgPSB0c2VjLT5zaWQ7CiAJbmV3c2lkID0gdHNlYy0+Y3JlYXRlX3NpZDsKIAotCWlmICghbmV3c2lkIHx8ICEoc2JzZWMtPmZsYWdzICYgU0VfU0JMQUJFTFNVUFApKSB7CisJaWYgKChzYnNlYy0+ZmxhZ3MgJiBTRV9TQklOSVRJQUxJWkVEKSAmJgorCSAgICAoc2JzZWMtPmJlaGF2aW9yID09IFNFQ1VSSVRZX0ZTX1VTRV9NTlRQT0lOVCkpCisJCW5ld3NpZCA9IHNic2VjLT5tbnRwb2ludF9zaWQ7CisJZWxzZSBpZiAoIW5ld3NpZCB8fCAhKHNic2VjLT5mbGFncyAmIFNFX1NCTEFCRUxTVVBQKSkgewogCQlyYyA9IHNlY3VyaXR5X3RyYW5zaXRpb25fc2lkKHNpZCwgZHNlYy0+c2lkLAogCQkJCQkgICAgIGlub2RlX21vZGVfdG9fc2VjdXJpdHlfY2xhc3MoaW5vZGUtPmlfbW9kZSksCiAJCQkJCSAgICAgJm5ld3NpZCk7CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zZWxpbnV4L2luY2x1ZGUvYXZjLmggYi9zZWN1cml0eS9zZWxpbnV4L2luY2x1ZGUvYXZjLmgKaW5kZXggZTk0ZTgyZi4uNTYxNTA4MSAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc2VsaW51eC9pbmNsdWRlL2F2Yy5oCisrKyBiL3NlY3VyaXR5L3NlbGludXgvaW5jbHVkZS9hdmMuaApAQCAtMTUsNyArMTUsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2F1ZGl0Lmg+CiAjaW5jbHVkZSA8bGludXgvbHNtX2F1ZGl0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW42Lmg+Ci0jaW5jbHVkZSA8bGludXgvcGF0aC5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KICNpbmNsdWRlICJmbGFzay5oIgogI2luY2x1ZGUgImF2X3Blcm1pc3Npb25zLmgiCmRpZmYgLS1naXQgYS9zZWN1cml0eS9zZWxpbnV4L2luY2x1ZGUvY2xhc3NtYXAuaCBiL3NlY3VyaXR5L3NlbGludXgvaW5jbHVkZS9jbGFzc21hcC5oCmluZGV4IDg4NThkMmIuLjdlZDM2NjMgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NlbGludXgvaW5jbHVkZS9jbGFzc21hcC5oCisrKyBiL3NlY3VyaXR5L3NlbGludXgvaW5jbHVkZS9jbGFzc21hcC5oCkBAIC0xNDIsNyArMTQyLDcgQEAKIAkgICAgIm5vZGVfYmluZCIsICJuYW1lX2Nvbm5lY3QiLCBOVUxMIH0gfSwKIAl7ICJtZW1wcm90ZWN0IiwgeyAibW1hcF96ZXJvIiwgTlVMTCB9IH0sCiAJeyAicGVlciIsIHsgInJlY3YiLCBOVUxMIH0gfSwKLQl7ICJjYXBhYmlsaXR5MiIsIHsgIm1hY19vdmVycmlkZSIsICJtYWNfYWRtaW4iLCBOVUxMIH0gfSwKKwl7ICJjYXBhYmlsaXR5MiIsIHsgIm1hY19vdmVycmlkZSIsICJtYWNfYWRtaW4iLCAic3lzbG9nIiwgTlVMTCB9IH0sCiAJeyAia2VybmVsX3NlcnZpY2UiLCB7ICJ1c2VfYXNfb3ZlcnJpZGUiLCAiY3JlYXRlX2ZpbGVzX2FzIiwgTlVMTCB9IH0sCiAJeyAidHVuX3NvY2tldCIsCiAJICB7IENPTU1PTl9TT0NLX1BFUk1TLCBOVUxMIH0gfSwKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NlbGludXgvbmxtc2d0YWIuYyBiL3NlY3VyaXR5L3NlbGludXgvbmxtc2d0YWIuYwppbmRleCA3NWVjMGM2Li44YjAyYjIxIDEwMDY0NAotLS0gYS9zZWN1cml0eS9zZWxpbnV4L25sbXNndGFiLmMKKysrIGIvc2VjdXJpdHkvc2VsaW51eC9ubG1zZ3RhYi5jCkBAIC02NSw2ICs2NSw4IEBACiAJeyBSVE1fTkVXQUREUkxBQkVMLAlORVRMSU5LX1JPVVRFX1NPQ0tFVF9fTkxNU0dfV1JJVEUgfSwKIAl7IFJUTV9ERUxBRERSTEFCRUwsCU5FVExJTktfUk9VVEVfU09DS0VUX19OTE1TR19XUklURSB9LAogCXsgUlRNX0dFVEFERFJMQUJFTCwJTkVUTElOS19ST1VURV9TT0NLRVRfX05MTVNHX1JFQUQgIH0sCisJeyBSVE1fR0VURENCLAkJTkVUTElOS19ST1VURV9TT0NLRVRfX05MTVNHX1JFQUQgIH0sCisJeyBSVE1fU0VURENCLAkJTkVUTElOS19ST1VURV9TT0NLRVRfX05MTVNHX1dSSVRFIH0sCiB9OwogCiBzdGF0aWMgc3RydWN0IG5sbXNnX3Blcm0gbmxtc2dfZmlyZXdhbGxfcGVybXNbXSA9CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zZWxpbnV4L3NlbGludXhmcy5jIGIvc2VjdXJpdHkvc2VsaW51eC9zZWxpbnV4ZnMuYwppbmRleCA0M2RlYWMyLi5lYTM5Y2I3IDEwMDY0NAotLS0gYS9zZWN1cml0eS9zZWxpbnV4L3NlbGludXhmcy5jCisrKyBiL3NlY3VyaXR5L3NlbGludXgvc2VsaW51eGZzLmMKQEAgLTE0MSwxOSArMTQxLDI0IEBACiAJCQkJIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQogCiB7Ci0JY2hhciAqcGFnZTsKKwljaGFyICpwYWdlID0gTlVMTDsKIAlzc2l6ZV90IGxlbmd0aDsKIAlpbnQgbmV3X3ZhbHVlOwogCisJbGVuZ3RoID0gLUVOT01FTTsKIAlpZiAoY291bnQgPj0gUEFHRV9TSVpFKQotCQlyZXR1cm4gLUVOT01FTTsKLQlpZiAoKnBwb3MgIT0gMCkgewotCQkvKiBObyBwYXJ0aWFsIHdyaXRlcy4gKi8KLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQorCQlnb3RvIG91dDsKKworCS8qIE5vIHBhcnRpYWwgd3JpdGVzLiAqLworCWxlbmd0aCA9IEVJTlZBTDsKKwlpZiAoKnBwb3MgIT0gMCkKKwkJZ290byBvdXQ7CisKKwlsZW5ndGggPSAtRU5PTUVNOwogCXBhZ2UgPSAoY2hhciAqKWdldF96ZXJvZWRfcGFnZShHRlBfS0VSTkVMKTsKIAlpZiAoIXBhZ2UpCi0JCXJldHVybiAtRU5PTUVNOworCQlnb3RvIG91dDsKKwogCWxlbmd0aCA9IC1FRkFVTFQ7CiAJaWYgKGNvcHlfZnJvbV91c2VyKHBhZ2UsIGJ1ZiwgY291bnQpKQogCQlnb3RvIG91dDsKQEAgLTI2OCwyMCArMjczLDI1IEBACiAJCQkJIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQogCiB7Ci0JY2hhciAqcGFnZTsKKwljaGFyICpwYWdlID0gTlVMTDsKIAlzc2l6ZV90IGxlbmd0aDsKIAlpbnQgbmV3X3ZhbHVlOwogCWV4dGVybiBpbnQgc2VsaW51eF9kaXNhYmxlKHZvaWQpOwogCisJbGVuZ3RoID0gLUVOT01FTTsKIAlpZiAoY291bnQgPj0gUEFHRV9TSVpFKQotCQlyZXR1cm4gLUVOT01FTTsKLQlpZiAoKnBwb3MgIT0gMCkgewotCQkvKiBObyBwYXJ0aWFsIHdyaXRlcy4gKi8KLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQorCQlnb3RvIG91dDs7CisKKwkvKiBObyBwYXJ0aWFsIHdyaXRlcy4gKi8KKwlsZW5ndGggPSAtRUlOVkFMOworCWlmICgqcHBvcyAhPSAwKQorCQlnb3RvIG91dDsKKworCWxlbmd0aCA9IC1FTk9NRU07CiAJcGFnZSA9IChjaGFyICopZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwpOwogCWlmICghcGFnZSkKLQkJcmV0dXJuIC1FTk9NRU07CisJCWdvdG8gb3V0OworCiAJbGVuZ3RoID0gLUVGQVVMVDsKIAlpZiAoY29weV9mcm9tX3VzZXIocGFnZSwgYnVmLCBjb3VudCkpCiAJCWdvdG8gb3V0OwpAQCAtMjkyLDcgKzMwMiw3IEBACiAKIAlpZiAobmV3X3ZhbHVlKSB7CiAJCWxlbmd0aCA9IHNlbGludXhfZGlzYWJsZSgpOwotCQlpZiAobGVuZ3RoIDwgMCkKKwkJaWYgKGxlbmd0aCkKIAkJCWdvdG8gb3V0OwogCQlhdWRpdF9sb2coY3VycmVudC0+YXVkaXRfY29udGV4dCwgR0ZQX0tFUk5FTCwgQVVESVRfTUFDX1NUQVRVUywKIAkJCSJzZWxpbnV4PTAgYXVpZD0ldSBzZXM9JXUiLApAQCAtNDkzLDcgKzUwMyw2IEBACiAJCQkgICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKIAogewotCWludCByZXQ7CiAJc3NpemVfdCBsZW5ndGg7CiAJdm9pZCAqZGF0YSA9IE5VTEw7CiAKQEAgLTUwMywxNyArNTEyLDE5IEBACiAJaWYgKGxlbmd0aCkKIAkJZ290byBvdXQ7CiAKLQlpZiAoKnBwb3MgIT0gMCkgewotCQkvKiBObyBwYXJ0aWFsIHdyaXRlcy4gKi8KLQkJbGVuZ3RoID0gLUVJTlZBTDsKKwkvKiBObyBwYXJ0aWFsIHdyaXRlcy4gKi8KKwlsZW5ndGggPSAtRUlOVkFMOworCWlmICgqcHBvcyAhPSAwKQogCQlnb3RvIG91dDsKLQl9CiAKLQlpZiAoKGNvdW50ID4gNjQgKiAxMDI0ICogMTAyNCkKLQkgICAgfHwgKGRhdGEgPSB2bWFsbG9jKGNvdW50KSkgPT0gTlVMTCkgewotCQlsZW5ndGggPSAtRU5PTUVNOworCWxlbmd0aCA9IC1FRkJJRzsKKwlpZiAoY291bnQgPiA2NCAqIDEwMjQgKiAxMDI0KQogCQlnb3RvIG91dDsKLQl9CisKKwlsZW5ndGggPSAtRU5PTUVNOworCWRhdGEgPSB2bWFsbG9jKGNvdW50KTsKKwlpZiAoIWRhdGEpCisJCWdvdG8gb3V0OwogCiAJbGVuZ3RoID0gLUVGQVVMVDsKIAlpZiAoY29weV9mcm9tX3VzZXIoZGF0YSwgYnVmLCBjb3VudCkgIT0gMCkKQEAgLTUyMywyMyArNTM0LDE5IEBACiAJaWYgKGxlbmd0aCkKIAkJZ290byBvdXQ7CiAKLQlyZXQgPSBzZWxfbWFrZV9ib29scygpOwotCWlmIChyZXQpIHsKLQkJbGVuZ3RoID0gcmV0OworCWxlbmd0aCA9IHNlbF9tYWtlX2Jvb2xzKCk7CisJaWYgKGxlbmd0aCkKIAkJZ290byBvdXQxOwotCX0KIAotCXJldCA9IHNlbF9tYWtlX2NsYXNzZXMoKTsKLQlpZiAocmV0KSB7Ci0JCWxlbmd0aCA9IHJldDsKKwlsZW5ndGggPSBzZWxfbWFrZV9jbGFzc2VzKCk7CisJaWYgKGxlbmd0aCkKIAkJZ290byBvdXQxOwotCX0KIAotCXJldCA9IHNlbF9tYWtlX3BvbGljeWNhcCgpOwotCWlmIChyZXQpCi0JCWxlbmd0aCA9IHJldDsKLQllbHNlCi0JCWxlbmd0aCA9IGNvdW50OworCWxlbmd0aCA9IHNlbF9tYWtlX3BvbGljeWNhcCgpOworCWlmIChsZW5ndGgpCisJCWdvdG8gb3V0MTsKKworCWxlbmd0aCA9IGNvdW50OwogCiBvdXQxOgogCWF1ZGl0X2xvZyhjdXJyZW50LT5hdWRpdF9jb250ZXh0LCBHRlBfS0VSTkVMLCBBVURJVF9NQUNfUE9MSUNZX0xPQUQsCkBAIC01NTksMjYgKzU2NiwyNiBAQAogCiBzdGF0aWMgc3NpemVfdCBzZWxfd3JpdGVfY29udGV4dChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSkKIHsKLQljaGFyICpjYW5vbjsKKwljaGFyICpjYW5vbiA9IE5VTEw7CiAJdTMyIHNpZCwgbGVuOwogCXNzaXplX3QgbGVuZ3RoOwogCiAJbGVuZ3RoID0gdGFza19oYXNfc2VjdXJpdHkoY3VycmVudCwgU0VDVVJJVFlfX0NIRUNLX0NPTlRFWFQpOwogCWlmIChsZW5ndGgpCi0JCXJldHVybiBsZW5ndGg7CisJCWdvdG8gb3V0OwogCiAJbGVuZ3RoID0gc2VjdXJpdHlfY29udGV4dF90b19zaWQoYnVmLCBzaXplLCAmc2lkKTsKLQlpZiAobGVuZ3RoIDwgMCkKLQkJcmV0dXJuIGxlbmd0aDsKKwlpZiAobGVuZ3RoKQorCQlnb3RvIG91dDsKIAogCWxlbmd0aCA9IHNlY3VyaXR5X3NpZF90b19jb250ZXh0KHNpZCwgJmNhbm9uLCAmbGVuKTsKLQlpZiAobGVuZ3RoIDwgMCkKLQkJcmV0dXJuIGxlbmd0aDsKKwlpZiAobGVuZ3RoKQorCQlnb3RvIG91dDsKIAorCWxlbmd0aCA9IC1FUkFOR0U7CiAJaWYgKGxlbiA+IFNJTVBMRV9UUkFOU0FDVElPTl9MSU1JVCkgewogCQlwcmludGsoS0VSTl9FUlIgIlNFTGludXg6ICVzOiAgY29udGV4dCBzaXplICgldSkgZXhjZWVkcyAiCiAJCQkicGF5bG9hZCBtYXhcbiIsIF9fZnVuY19fLCBsZW4pOwotCQlsZW5ndGggPSAtRVJBTkdFOwogCQlnb3RvIG91dDsKIAl9CiAKQEAgLTYwMiwyMyArNjA5LDI4IEBACiBzdGF0aWMgc3NpemVfdCBzZWxfd3JpdGVfY2hlY2tyZXFwcm90KHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLAogCQkJCSAgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQogewotCWNoYXIgKnBhZ2U7CisJY2hhciAqcGFnZSA9IE5VTEw7CiAJc3NpemVfdCBsZW5ndGg7CiAJdW5zaWduZWQgaW50IG5ld192YWx1ZTsKIAogCWxlbmd0aCA9IHRhc2tfaGFzX3NlY3VyaXR5KGN1cnJlbnQsIFNFQ1VSSVRZX19TRVRDSEVDS1JFUVBST1QpOwogCWlmIChsZW5ndGgpCi0JCXJldHVybiBsZW5ndGg7CisJCWdvdG8gb3V0OwogCisJbGVuZ3RoID0gLUVOT01FTTsKIAlpZiAoY291bnQgPj0gUEFHRV9TSVpFKQotCQlyZXR1cm4gLUVOT01FTTsKLQlpZiAoKnBwb3MgIT0gMCkgewotCQkvKiBObyBwYXJ0aWFsIHdyaXRlcy4gKi8KLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQorCQlnb3RvIG91dDsKKworCS8qIE5vIHBhcnRpYWwgd3JpdGVzLiAqLworCWxlbmd0aCA9IC1FSU5WQUw7CisJaWYgKCpwcG9zICE9IDApCisJCWdvdG8gb3V0OworCisJbGVuZ3RoID0gLUVOT01FTTsKIAlwYWdlID0gKGNoYXIgKilnZXRfemVyb2VkX3BhZ2UoR0ZQX0tFUk5FTCk7CiAJaWYgKCFwYWdlKQotCQlyZXR1cm4gLUVOT01FTTsKKwkJZ290byBvdXQ7CisKIAlsZW5ndGggPSAtRUZBVUxUOwogCWlmIChjb3B5X2Zyb21fdXNlcihwYWdlLCBidWYsIGNvdW50KSkKIAkJZ290byBvdXQ7CkBAIC02OTMsNyArNzA1LDcgQEAKIAogc3RhdGljIHNzaXplX3Qgc2VsX3dyaXRlX2FjY2VzcyhzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSkKIHsKLQljaGFyICpzY29uLCAqdGNvbjsKKwljaGFyICpzY29uID0gTlVMTCwgKnRjb24gPSBOVUxMOwogCXUzMiBzc2lkLCB0c2lkOwogCXUxNiB0Y2xhc3M7CiAJc3RydWN0IGF2X2RlY2lzaW9uIGF2ZDsKQEAgLTcwMSwyNyArNzEzLDI5IEBACiAKIAlsZW5ndGggPSB0YXNrX2hhc19zZWN1cml0eShjdXJyZW50LCBTRUNVUklUWV9fQ09NUFVURV9BVik7CiAJaWYgKGxlbmd0aCkKLQkJcmV0dXJuIGxlbmd0aDsKKwkJZ290byBvdXQ7CiAKIAlsZW5ndGggPSAtRU5PTUVNOwogCXNjb24gPSBremFsbG9jKHNpemUgKyAxLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXNjb24pCi0JCXJldHVybiBsZW5ndGg7CisJCWdvdG8gb3V0OwogCisJbGVuZ3RoID0gLUVOT01FTTsKIAl0Y29uID0ga3phbGxvYyhzaXplICsgMSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCF0Y29uKQogCQlnb3RvIG91dDsKIAogCWxlbmd0aCA9IC1FSU5WQUw7CiAJaWYgKHNzY2FuZihidWYsICIlcyAlcyAlaHUiLCBzY29uLCB0Y29uLCAmdGNsYXNzKSAhPSAzKQotCQlnb3RvIG91dDI7CisJCWdvdG8gb3V0OwogCiAJbGVuZ3RoID0gc2VjdXJpdHlfY29udGV4dF90b19zaWQoc2Nvbiwgc3RybGVuKHNjb24pICsgMSwgJnNzaWQpOwotCWlmIChsZW5ndGggPCAwKQotCQlnb3RvIG91dDI7CisJaWYgKGxlbmd0aCkKKwkJZ290byBvdXQ7CisKIAlsZW5ndGggPSBzZWN1cml0eV9jb250ZXh0X3RvX3NpZCh0Y29uLCBzdHJsZW4odGNvbikgKyAxLCAmdHNpZCk7Ci0JaWYgKGxlbmd0aCA8IDApCi0JCWdvdG8gb3V0MjsKKwlpZiAobGVuZ3RoKQorCQlnb3RvIG91dDsKIAogCXNlY3VyaXR5X2NvbXB1dGVfYXZfdXNlcihzc2lkLCB0c2lkLCB0Y2xhc3MsICZhdmQpOwogCkBAIC03MzAsMTMzICs3NDQsMTMxIEBACiAJCQkgIGF2ZC5hbGxvd2VkLCAweGZmZmZmZmZmLAogCQkJICBhdmQuYXVkaXRhbGxvdywgYXZkLmF1ZGl0ZGVueSwKIAkJCSAgYXZkLnNlcW5vLCBhdmQuZmxhZ3MpOwotb3V0MjoKLQlrZnJlZSh0Y29uKTsKIG91dDoKKwlrZnJlZSh0Y29uKTsKIAlrZnJlZShzY29uKTsKIAlyZXR1cm4gbGVuZ3RoOwogfQogCiBzdGF0aWMgc3NpemVfdCBzZWxfd3JpdGVfY3JlYXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyICpidWYsIHNpemVfdCBzaXplKQogewotCWNoYXIgKnNjb24sICp0Y29uOworCWNoYXIgKnNjb24gPSBOVUxMLCAqdGNvbiA9IE5VTEw7CiAJdTMyIHNzaWQsIHRzaWQsIG5ld3NpZDsKIAl1MTYgdGNsYXNzOwogCXNzaXplX3QgbGVuZ3RoOwotCWNoYXIgKm5ld2NvbjsKKwljaGFyICpuZXdjb24gPSBOVUxMOwogCXUzMiBsZW47CiAKIAlsZW5ndGggPSB0YXNrX2hhc19zZWN1cml0eShjdXJyZW50LCBTRUNVUklUWV9fQ09NUFVURV9DUkVBVEUpOwogCWlmIChsZW5ndGgpCi0JCXJldHVybiBsZW5ndGg7CisJCWdvdG8gb3V0OwogCiAJbGVuZ3RoID0gLUVOT01FTTsKIAlzY29uID0ga3phbGxvYyhzaXplICsgMSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFzY29uKQotCQlyZXR1cm4gbGVuZ3RoOworCQlnb3RvIG91dDsKIAorCWxlbmd0aCA9IC1FTk9NRU07CiAJdGNvbiA9IGt6YWxsb2Moc2l6ZSArIDEsIEdGUF9LRVJORUwpOwogCWlmICghdGNvbikKIAkJZ290byBvdXQ7CiAKIAlsZW5ndGggPSAtRUlOVkFMOwogCWlmIChzc2NhbmYoYnVmLCAiJXMgJXMgJWh1Iiwgc2NvbiwgdGNvbiwgJnRjbGFzcykgIT0gMykKLQkJZ290byBvdXQyOworCQlnb3RvIG91dDsKIAogCWxlbmd0aCA9IHNlY3VyaXR5X2NvbnRleHRfdG9fc2lkKHNjb24sIHN0cmxlbihzY29uKSArIDEsICZzc2lkKTsKLQlpZiAobGVuZ3RoIDwgMCkKLQkJZ290byBvdXQyOworCWlmIChsZW5ndGgpCisJCWdvdG8gb3V0OworCiAJbGVuZ3RoID0gc2VjdXJpdHlfY29udGV4dF90b19zaWQodGNvbiwgc3RybGVuKHRjb24pICsgMSwgJnRzaWQpOwotCWlmIChsZW5ndGggPCAwKQotCQlnb3RvIG91dDI7CisJaWYgKGxlbmd0aCkKKwkJZ290byBvdXQ7CiAKIAlsZW5ndGggPSBzZWN1cml0eV90cmFuc2l0aW9uX3NpZF91c2VyKHNzaWQsIHRzaWQsIHRjbGFzcywgJm5ld3NpZCk7Ci0JaWYgKGxlbmd0aCA8IDApCi0JCWdvdG8gb3V0MjsKKwlpZiAobGVuZ3RoKQorCQlnb3RvIG91dDsKIAogCWxlbmd0aCA9IHNlY3VyaXR5X3NpZF90b19jb250ZXh0KG5ld3NpZCwgJm5ld2NvbiwgJmxlbik7Ci0JaWYgKGxlbmd0aCA8IDApCi0JCWdvdG8gb3V0MjsKKwlpZiAobGVuZ3RoKQorCQlnb3RvIG91dDsKIAorCWxlbmd0aCA9IC1FUkFOR0U7CiAJaWYgKGxlbiA+IFNJTVBMRV9UUkFOU0FDVElPTl9MSU1JVCkgewogCQlwcmludGsoS0VSTl9FUlIgIlNFTGludXg6ICVzOiAgY29udGV4dCBzaXplICgldSkgZXhjZWVkcyAiCiAJCQkicGF5bG9hZCBtYXhcbiIsIF9fZnVuY19fLCBsZW4pOwotCQlsZW5ndGggPSAtRVJBTkdFOwotCQlnb3RvIG91dDM7CisJCWdvdG8gb3V0OwogCX0KIAogCW1lbWNweShidWYsIG5ld2NvbiwgbGVuKTsKIAlsZW5ndGggPSBsZW47Ci1vdXQzOgotCWtmcmVlKG5ld2Nvbik7Ci1vdXQyOgotCWtmcmVlKHRjb24pOwogb3V0OgorCWtmcmVlKG5ld2Nvbik7CisJa2ZyZWUodGNvbik7CiAJa2ZyZWUoc2Nvbik7CiAJcmV0dXJuIGxlbmd0aDsKIH0KIAogc3RhdGljIHNzaXplX3Qgc2VsX3dyaXRlX3JlbGFiZWwoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUpCiB7Ci0JY2hhciAqc2NvbiwgKnRjb247CisJY2hhciAqc2NvbiA9IE5VTEwsICp0Y29uID0gTlVMTDsKIAl1MzIgc3NpZCwgdHNpZCwgbmV3c2lkOwogCXUxNiB0Y2xhc3M7CiAJc3NpemVfdCBsZW5ndGg7Ci0JY2hhciAqbmV3Y29uOworCWNoYXIgKm5ld2NvbiA9IE5VTEw7CiAJdTMyIGxlbjsKIAogCWxlbmd0aCA9IHRhc2tfaGFzX3NlY3VyaXR5KGN1cnJlbnQsIFNFQ1VSSVRZX19DT01QVVRFX1JFTEFCRUwpOwogCWlmIChsZW5ndGgpCi0JCXJldHVybiBsZW5ndGg7CisJCWdvdG8gb3V0OwogCiAJbGVuZ3RoID0gLUVOT01FTTsKIAlzY29uID0ga3phbGxvYyhzaXplICsgMSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFzY29uKQotCQlyZXR1cm4gbGVuZ3RoOworCQlnb3RvIG91dDsKIAorCWxlbmd0aCA9IC1FTk9NRU07CiAJdGNvbiA9IGt6YWxsb2Moc2l6ZSArIDEsIEdGUF9LRVJORUwpOwogCWlmICghdGNvbikKIAkJZ290byBvdXQ7CiAKIAlsZW5ndGggPSAtRUlOVkFMOwogCWlmIChzc2NhbmYoYnVmLCAiJXMgJXMgJWh1Iiwgc2NvbiwgdGNvbiwgJnRjbGFzcykgIT0gMykKLQkJZ290byBvdXQyOworCQlnb3RvIG91dDsKIAogCWxlbmd0aCA9IHNlY3VyaXR5X2NvbnRleHRfdG9fc2lkKHNjb24sIHN0cmxlbihzY29uKSArIDEsICZzc2lkKTsKLQlpZiAobGVuZ3RoIDwgMCkKLQkJZ290byBvdXQyOworCWlmIChsZW5ndGgpCisJCWdvdG8gb3V0OworCiAJbGVuZ3RoID0gc2VjdXJpdHlfY29udGV4dF90b19zaWQodGNvbiwgc3RybGVuKHRjb24pICsgMSwgJnRzaWQpOwotCWlmIChsZW5ndGggPCAwKQotCQlnb3RvIG91dDI7CisJaWYgKGxlbmd0aCkKKwkJZ290byBvdXQ7CiAKIAlsZW5ndGggPSBzZWN1cml0eV9jaGFuZ2Vfc2lkKHNzaWQsIHRzaWQsIHRjbGFzcywgJm5ld3NpZCk7Ci0JaWYgKGxlbmd0aCA8IDApCi0JCWdvdG8gb3V0MjsKKwlpZiAobGVuZ3RoKQorCQlnb3RvIG91dDsKIAogCWxlbmd0aCA9IHNlY3VyaXR5X3NpZF90b19jb250ZXh0KG5ld3NpZCwgJm5ld2NvbiwgJmxlbik7Ci0JaWYgKGxlbmd0aCA8IDApCi0JCWdvdG8gb3V0MjsKKwlpZiAobGVuZ3RoKQorCQlnb3RvIG91dDsKIAotCWlmIChsZW4gPiBTSU1QTEVfVFJBTlNBQ1RJT05fTElNSVQpIHsKLQkJbGVuZ3RoID0gLUVSQU5HRTsKLQkJZ290byBvdXQzOwotCX0KKwlsZW5ndGggPSAtRVJBTkdFOworCWlmIChsZW4gPiBTSU1QTEVfVFJBTlNBQ1RJT05fTElNSVQpCisJCWdvdG8gb3V0OwogCiAJbWVtY3B5KGJ1ZiwgbmV3Y29uLCBsZW4pOwogCWxlbmd0aCA9IGxlbjsKLW91dDM6Ci0Ja2ZyZWUobmV3Y29uKTsKLW91dDI6Ci0Ja2ZyZWUodGNvbik7CiBvdXQ6CisJa2ZyZWUobmV3Y29uKTsKKwlrZnJlZSh0Y29uKTsKIAlrZnJlZShzY29uKTsKIAlyZXR1cm4gbGVuZ3RoOwogfQogCiBzdGF0aWMgc3NpemVfdCBzZWxfd3JpdGVfdXNlcihzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSkKIHsKLQljaGFyICpjb24sICp1c2VyLCAqcHRyOwotCXUzMiBzaWQsICpzaWRzOworCWNoYXIgKmNvbiA9IE5VTEwsICp1c2VyID0gTlVMTCwgKnB0cjsKKwl1MzIgc2lkLCAqc2lkcyA9IE5VTEw7CiAJc3NpemVfdCBsZW5ndGg7CiAJY2hhciAqbmV3Y29uOwogCWludCBpLCByYzsKQEAgLTg2NCwyOCArODc2LDI5IEBACiAKIAlsZW5ndGggPSB0YXNrX2hhc19zZWN1cml0eShjdXJyZW50LCBTRUNVUklUWV9fQ09NUFVURV9VU0VSKTsKIAlpZiAobGVuZ3RoKQotCQlyZXR1cm4gbGVuZ3RoOworCQlnb3RvIG91dDs7CiAKIAlsZW5ndGggPSAtRU5PTUVNOwogCWNvbiA9IGt6YWxsb2Moc2l6ZSArIDEsIEdGUF9LRVJORUwpOwogCWlmICghY29uKQotCQlyZXR1cm4gbGVuZ3RoOworCQlnb3RvIG91dDs7CiAKKwlsZW5ndGggPSAtRU5PTUVNOwogCXVzZXIgPSBremFsbG9jKHNpemUgKyAxLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXVzZXIpCiAJCWdvdG8gb3V0OwogCiAJbGVuZ3RoID0gLUVJTlZBTDsKIAlpZiAoc3NjYW5mKGJ1ZiwgIiVzICVzIiwgY29uLCB1c2VyKSAhPSAyKQotCQlnb3RvIG91dDI7CisJCWdvdG8gb3V0OwogCiAJbGVuZ3RoID0gc2VjdXJpdHlfY29udGV4dF90b19zaWQoY29uLCBzdHJsZW4oY29uKSArIDEsICZzaWQpOwotCWlmIChsZW5ndGggPCAwKQotCQlnb3RvIG91dDI7CisJaWYgKGxlbmd0aCkKKwkJZ290byBvdXQ7CiAKIAlsZW5ndGggPSBzZWN1cml0eV9nZXRfdXNlcl9zaWRzKHNpZCwgdXNlciwgJnNpZHMsICZuc2lkcyk7Ci0JaWYgKGxlbmd0aCA8IDApCi0JCWdvdG8gb3V0MjsKKwlpZiAobGVuZ3RoKQorCQlnb3RvIG91dDsKIAogCWxlbmd0aCA9IHNwcmludGYoYnVmLCAiJXUiLCBuc2lkcykgKyAxOwogCXB0ciA9IGJ1ZiArIGxlbmd0aDsKQEAgLTg5Myw4MiArOTA2LDgwIEBACiAJCXJjID0gc2VjdXJpdHlfc2lkX3RvX2NvbnRleHQoc2lkc1tpXSwgJm5ld2NvbiwgJmxlbik7CiAJCWlmIChyYykgewogCQkJbGVuZ3RoID0gcmM7Ci0JCQlnb3RvIG91dDM7CisJCQlnb3RvIG91dDsKIAkJfQogCQlpZiAoKGxlbmd0aCArIGxlbikgPj0gU0lNUExFX1RSQU5TQUNUSU9OX0xJTUlUKSB7CiAJCQlrZnJlZShuZXdjb24pOwogCQkJbGVuZ3RoID0gLUVSQU5HRTsKLQkJCWdvdG8gb3V0MzsKKwkJCWdvdG8gb3V0OwogCQl9CiAJCW1lbWNweShwdHIsIG5ld2NvbiwgbGVuKTsKIAkJa2ZyZWUobmV3Y29uKTsKIAkJcHRyICs9IGxlbjsKIAkJbGVuZ3RoICs9IGxlbjsKIAl9Ci1vdXQzOgotCWtmcmVlKHNpZHMpOwotb3V0MjoKLQlrZnJlZSh1c2VyKTsKIG91dDoKKwlrZnJlZShzaWRzKTsKKwlrZnJlZSh1c2VyKTsKIAlrZnJlZShjb24pOwogCXJldHVybiBsZW5ndGg7CiB9CiAKIHN0YXRpYyBzc2l6ZV90IHNlbF93cml0ZV9tZW1iZXIoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUpCiB7Ci0JY2hhciAqc2NvbiwgKnRjb247CisJY2hhciAqc2NvbiA9IE5VTEwsICp0Y29uID0gTlVMTDsKIAl1MzIgc3NpZCwgdHNpZCwgbmV3c2lkOwogCXUxNiB0Y2xhc3M7CiAJc3NpemVfdCBsZW5ndGg7Ci0JY2hhciAqbmV3Y29uOworCWNoYXIgKm5ld2NvbiA9IE5VTEw7CiAJdTMyIGxlbjsKIAogCWxlbmd0aCA9IHRhc2tfaGFzX3NlY3VyaXR5KGN1cnJlbnQsIFNFQ1VSSVRZX19DT01QVVRFX01FTUJFUik7CiAJaWYgKGxlbmd0aCkKLQkJcmV0dXJuIGxlbmd0aDsKKwkJZ290byBvdXQ7CiAKIAlsZW5ndGggPSAtRU5PTUVNOwogCXNjb24gPSBremFsbG9jKHNpemUgKyAxLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXNjb24pCi0JCXJldHVybiBsZW5ndGg7CisJCWdvdG8gb3V0OzsKIAorCWxlbmd0aCA9IC1FTk9NRU07CiAJdGNvbiA9IGt6YWxsb2Moc2l6ZSArIDEsIEdGUF9LRVJORUwpOwogCWlmICghdGNvbikKIAkJZ290byBvdXQ7CiAKIAlsZW5ndGggPSAtRUlOVkFMOwogCWlmIChzc2NhbmYoYnVmLCAiJXMgJXMgJWh1Iiwgc2NvbiwgdGNvbiwgJnRjbGFzcykgIT0gMykKLQkJZ290byBvdXQyOworCQlnb3RvIG91dDsKIAogCWxlbmd0aCA9IHNlY3VyaXR5X2NvbnRleHRfdG9fc2lkKHNjb24sIHN0cmxlbihzY29uKSArIDEsICZzc2lkKTsKLQlpZiAobGVuZ3RoIDwgMCkKLQkJZ290byBvdXQyOworCWlmIChsZW5ndGgpCisJCWdvdG8gb3V0OworCiAJbGVuZ3RoID0gc2VjdXJpdHlfY29udGV4dF90b19zaWQodGNvbiwgc3RybGVuKHRjb24pICsgMSwgJnRzaWQpOwotCWlmIChsZW5ndGggPCAwKQotCQlnb3RvIG91dDI7CisJaWYgKGxlbmd0aCkKKwkJZ290byBvdXQ7CiAKIAlsZW5ndGggPSBzZWN1cml0eV9tZW1iZXJfc2lkKHNzaWQsIHRzaWQsIHRjbGFzcywgJm5ld3NpZCk7Ci0JaWYgKGxlbmd0aCA8IDApCi0JCWdvdG8gb3V0MjsKKwlpZiAobGVuZ3RoKQorCQlnb3RvIG91dDsKIAogCWxlbmd0aCA9IHNlY3VyaXR5X3NpZF90b19jb250ZXh0KG5ld3NpZCwgJm5ld2NvbiwgJmxlbik7Ci0JaWYgKGxlbmd0aCA8IDApCi0JCWdvdG8gb3V0MjsKKwlpZiAobGVuZ3RoKQorCQlnb3RvIG91dDsKIAorCWxlbmd0aCA9IC1FUkFOR0U7CiAJaWYgKGxlbiA+IFNJTVBMRV9UUkFOU0FDVElPTl9MSU1JVCkgewogCQlwcmludGsoS0VSTl9FUlIgIlNFTGludXg6ICVzOiAgY29udGV4dCBzaXplICgldSkgZXhjZWVkcyAiCiAJCQkicGF5bG9hZCBtYXhcbiIsIF9fZnVuY19fLCBsZW4pOwotCQlsZW5ndGggPSAtRVJBTkdFOwotCQlnb3RvIG91dDM7CisJCWdvdG8gb3V0OwogCX0KIAogCW1lbWNweShidWYsIG5ld2NvbiwgbGVuKTsKIAlsZW5ndGggPSBsZW47Ci1vdXQzOgotCWtmcmVlKG5ld2Nvbik7Ci1vdXQyOgotCWtmcmVlKHRjb24pOwogb3V0OgorCWtmcmVlKG5ld2Nvbik7CisJa2ZyZWUodGNvbik7CiAJa2ZyZWUoc2Nvbik7CiAJcmV0dXJuIGxlbmd0aDsKIH0KQEAgLTk3OCw3ICs5ODksNiBAQAogCXN0cnVjdCBpbm9kZSAqcmV0ID0gbmV3X2lub2RlKHNiKTsKIAogCWlmIChyZXQpIHsKLQkJcmV0LT5pX2lubyA9IGdldF9uZXh0X2lubygpOwogCQlyZXQtPmlfbW9kZSA9IG1vZGU7CiAJCXJldC0+aV9hdGltZSA9IHJldC0+aV9tdGltZSA9IHJldC0+aV9jdGltZSA9IENVUlJFTlRfVElNRTsKIAl9CkBAIC05OTgsMTYgKzEwMDgsMTQgQEAKIAogCW11dGV4X2xvY2soJnNlbF9tdXRleCk7CiAKLQlpZiAoaW5kZXggPj0gYm9vbF9udW0gfHwgc3RyY21wKG5hbWUsIGJvb2xfcGVuZGluZ19uYW1lc1tpbmRleF0pKSB7Ci0JCXJldCA9IC1FSU5WQUw7CisJcmV0ID0gLUVJTlZBTDsKKwlpZiAoaW5kZXggPj0gYm9vbF9udW0gfHwgc3RyY21wKG5hbWUsIGJvb2xfcGVuZGluZ19uYW1lc1tpbmRleF0pKQogCQlnb3RvIG91dDsKLQl9CiAKKwlyZXQgPSAtRU5PTUVNOwogCXBhZ2UgPSAoY2hhciAqKWdldF96ZXJvZWRfcGFnZShHRlBfS0VSTkVMKTsKLQlpZiAoIXBhZ2UpIHsKLQkJcmV0ID0gLUVOT01FTTsKKwlpZiAoIXBhZ2UpCiAJCWdvdG8gb3V0OwotCX0KIAogCWN1cl9lbmZvcmNpbmcgPSBzZWN1cml0eV9nZXRfYm9vbF92YWx1ZShpbmRleCk7CiAJaWYgKGN1cl9lbmZvcmNpbmcgPCAwKSB7CkBAIC0xMDE5LDggKzEwMjcsNyBAQAogCXJldCA9IHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKGJ1ZiwgY291bnQsIHBwb3MsIHBhZ2UsIGxlbmd0aCk7CiBvdXQ6CiAJbXV0ZXhfdW5sb2NrKCZzZWxfbXV0ZXgpOwotCWlmIChwYWdlKQotCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpcGFnZSk7CisJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKXBhZ2UpOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTEwNDAsMjYgKzEwNDcsMjMgQEAKIAlpZiAobGVuZ3RoKQogCQlnb3RvIG91dDsKIAotCWlmIChpbmRleCA+PSBib29sX251bSB8fCBzdHJjbXAobmFtZSwgYm9vbF9wZW5kaW5nX25hbWVzW2luZGV4XSkpIHsKLQkJbGVuZ3RoID0gLUVJTlZBTDsKKwlsZW5ndGggPSAtRUlOVkFMOworCWlmIChpbmRleCA+PSBib29sX251bSB8fCBzdHJjbXAobmFtZSwgYm9vbF9wZW5kaW5nX25hbWVzW2luZGV4XSkpCiAJCWdvdG8gb3V0OwotCX0KIAotCWlmIChjb3VudCA+PSBQQUdFX1NJWkUpIHsKLQkJbGVuZ3RoID0gLUVOT01FTTsKKwlsZW5ndGggPSAtRU5PTUVNOworCWlmIChjb3VudCA+PSBQQUdFX1NJWkUpCiAJCWdvdG8gb3V0OwotCX0KIAotCWlmICgqcHBvcyAhPSAwKSB7Ci0JCS8qIE5vIHBhcnRpYWwgd3JpdGVzLiAqLwotCQlsZW5ndGggPSAtRUlOVkFMOworCS8qIE5vIHBhcnRpYWwgd3JpdGVzLiAqLworCWxlbmd0aCA9IC1FSU5WQUw7CisJaWYgKCpwcG9zICE9IDApCiAJCWdvdG8gb3V0OwotCX0KKworCWxlbmd0aCA9IC1FTk9NRU07CiAJcGFnZSA9IChjaGFyICopZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwpOwotCWlmICghcGFnZSkgewotCQlsZW5ndGggPSAtRU5PTUVNOworCWlmICghcGFnZSkKIAkJZ290byBvdXQ7Ci0JfQogCiAJbGVuZ3RoID0gLUVGQVVMVDsKIAlpZiAoY29weV9mcm9tX3VzZXIocGFnZSwgYnVmLCBjb3VudCkpCkBAIC0xMDc3LDggKzEwODEsNyBAQAogCiBvdXQ6CiAJbXV0ZXhfdW5sb2NrKCZzZWxfbXV0ZXgpOwotCWlmIChwYWdlKQotCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpIHBhZ2UpOworCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZykgcGFnZSk7CiAJcmV0dXJuIGxlbmd0aDsKIH0KIApAQCAtMTEwMiwxOSArMTEwNSwxOSBAQAogCWlmIChsZW5ndGgpCiAJCWdvdG8gb3V0OwogCi0JaWYgKGNvdW50ID49IFBBR0VfU0laRSkgewotCQlsZW5ndGggPSAtRU5PTUVNOworCWxlbmd0aCA9IC1FTk9NRU07CisJaWYgKGNvdW50ID49IFBBR0VfU0laRSkKIAkJZ290byBvdXQ7Ci0JfQotCWlmICgqcHBvcyAhPSAwKSB7Ci0JCS8qIE5vIHBhcnRpYWwgd3JpdGVzLiAqLworCisJLyogTm8gcGFydGlhbCB3cml0ZXMuICovCisJbGVuZ3RoID0gLUVJTlZBTDsKKwlpZiAoKnBwb3MgIT0gMCkKIAkJZ290byBvdXQ7Ci0JfQorCisJbGVuZ3RoID0gLUVOT01FTTsKIAlwYWdlID0gKGNoYXIgKilnZXRfemVyb2VkX3BhZ2UoR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwYWdlKSB7Ci0JCWxlbmd0aCA9IC1FTk9NRU07CisJaWYgKCFwYWdlKQogCQlnb3RvIG91dDsKLQl9CiAKIAlsZW5ndGggPSAtRUZBVUxUOwogCWlmIChjb3B5X2Zyb21fdXNlcihwYWdlLCBidWYsIGNvdW50KSkKQEAgLTExMjQsMTUgKzExMjcsMTYgQEAKIAlpZiAoc3NjYW5mKHBhZ2UsICIlZCIsICZuZXdfdmFsdWUpICE9IDEpCiAJCWdvdG8gb3V0OwogCisJbGVuZ3RoID0gMDsKIAlpZiAobmV3X3ZhbHVlICYmIGJvb2xfcGVuZGluZ192YWx1ZXMpCi0JCXNlY3VyaXR5X3NldF9ib29scyhib29sX251bSwgYm9vbF9wZW5kaW5nX3ZhbHVlcyk7CisJCWxlbmd0aCA9IHNlY3VyaXR5X3NldF9ib29scyhib29sX251bSwgYm9vbF9wZW5kaW5nX3ZhbHVlcyk7CiAKLQlsZW5ndGggPSBjb3VudDsKKwlpZiAoIWxlbmd0aCkKKwkJbGVuZ3RoID0gY291bnQ7CiAKIG91dDoKIAltdXRleF91bmxvY2soJnNlbF9tdXRleCk7Ci0JaWYgKHBhZ2UpCi0JCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZykgcGFnZSk7CisJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKSBwYWdlKTsKIAlyZXR1cm4gbGVuZ3RoOwogfQogCkBAIC0xMTczLDcgKzExNzcsNyBAQAogCiBzdGF0aWMgaW50IHNlbF9tYWtlX2Jvb2xzKHZvaWQpCiB7Ci0JaW50IGksIHJldCA9IDA7CisJaW50IGksIHJldDsKIAlzc2l6ZV90IGxlbjsKIAlzdHJ1Y3QgZGVudHJ5ICpkZW50cnkgPSBOVUxMOwogCXN0cnVjdCBkZW50cnkgKmRpciA9IGJvb2xfZGlyOwpAQCAtMTE5NCwzOCArMTE5OCw0MCBAQAogCiAJc2VsX3JlbW92ZV9lbnRyaWVzKGRpcik7CiAKKwlyZXQgPSAtRU5PTUVNOwogCXBhZ2UgPSAoY2hhciAqKWdldF96ZXJvZWRfcGFnZShHRlBfS0VSTkVMKTsKIAlpZiAoIXBhZ2UpCi0JCXJldHVybiAtRU5PTUVNOworCQlnb3RvIG91dDsKIAogCXJldCA9IHNlY3VyaXR5X2dldF9ib29scygmbnVtLCAmbmFtZXMsICZ2YWx1ZXMpOwotCWlmIChyZXQgIT0gMCkKKwlpZiAocmV0KQogCQlnb3RvIG91dDsKIAogCWZvciAoaSA9IDA7IGkgPCBudW07IGkrKykgeworCQlyZXQgPSAtRU5PTUVNOwogCQlkZW50cnkgPSBkX2FsbG9jX25hbWUoZGlyLCBuYW1lc1tpXSk7Ci0JCWlmICghZGVudHJ5KSB7Ci0JCQlyZXQgPSAtRU5PTUVNOwotCQkJZ290byBlcnI7Ci0JCX0KLQkJaW5vZGUgPSBzZWxfbWFrZV9pbm9kZShkaXItPmRfc2IsIFNfSUZSRUcgfCBTX0lSVUdPIHwgU19JV1VTUik7Ci0JCWlmICghaW5vZGUpIHsKLQkJCXJldCA9IC1FTk9NRU07Ci0JCQlnb3RvIGVycjsKLQkJfQorCQlpZiAoIWRlbnRyeSkKKwkJCWdvdG8gb3V0OwogCisJCXJldCA9IC1FTk9NRU07CisJCWlub2RlID0gc2VsX21ha2VfaW5vZGUoZGlyLT5kX3NiLCBTX0lGUkVHIHwgU19JUlVHTyB8IFNfSVdVU1IpOworCQlpZiAoIWlub2RlKQorCQkJZ290byBvdXQ7CisKKwkJcmV0ID0gLUVJTlZBTDsKIAkJbGVuID0gc25wcmludGYocGFnZSwgUEFHRV9TSVpFLCAiLyVzLyVzIiwgQk9PTF9ESVJfTkFNRSwgbmFtZXNbaV0pOwotCQlpZiAobGVuIDwgMCkgewotCQkJcmV0ID0gLUVJTlZBTDsKLQkJCWdvdG8gZXJyOwotCQl9IGVsc2UgaWYgKGxlbiA+PSBQQUdFX1NJWkUpIHsKLQkJCXJldCA9IC1FTkFNRVRPT0xPTkc7Ci0JCQlnb3RvIGVycjsKLQkJfQorCQlpZiAobGVuIDwgMCkKKwkJCWdvdG8gb3V0OworCisJCXJldCA9IC1FTkFNRVRPT0xPTkc7CisJCWlmIChsZW4gPj0gUEFHRV9TSVpFKQorCQkJZ290byBvdXQ7CisKIAkJaXNlYyA9IChzdHJ1Y3QgaW5vZGVfc2VjdXJpdHlfc3RydWN0ICopaW5vZGUtPmlfc2VjdXJpdHk7CiAJCXJldCA9IHNlY3VyaXR5X2dlbmZzX3NpZCgic2VsaW51eGZzIiwgcGFnZSwgU0VDQ0xBU1NfRklMRSwgJnNpZCk7CiAJCWlmIChyZXQpCi0JCQlnb3RvIGVycjsKKwkJCWdvdG8gb3V0OworCiAJCWlzZWMtPnNpZCA9IHNpZDsKIAkJaXNlYy0+aW5pdGlhbGl6ZWQgPSAxOwogCQlpbm9kZS0+aV9mb3AgPSAmc2VsX2Jvb2xfb3BzOwpAQCAtMTIzNSwxMCArMTI0MSwxMiBAQAogCWJvb2xfbnVtID0gbnVtOwogCWJvb2xfcGVuZGluZ19uYW1lcyA9IG5hbWVzOwogCWJvb2xfcGVuZGluZ192YWx1ZXMgPSB2YWx1ZXM7CisKKwlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpcGFnZSk7CisJcmV0dXJuIDA7CiBvdXQ6CiAJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKXBhZ2UpOwotCXJldHVybiByZXQ7Ci1lcnI6CisKIAlpZiAobmFtZXMpIHsKIAkJZm9yIChpID0gMDsgaSA8IG51bTsgaSsrKQogCQkJa2ZyZWUobmFtZXNbaV0pOwpAQCAtMTI0Niw4ICsxMjU0LDggQEAKIAl9CiAJa2ZyZWUodmFsdWVzKTsKIAlzZWxfcmVtb3ZlX2VudHJpZXMoZGlyKTsKLQlyZXQgPSAtRU5PTUVNOwotCWdvdG8gb3V0OworCisJcmV0dXJuIHJldDsKIH0KIAogI2RlZmluZSBOVUxMX0ZJTEVfTkFNRSAibnVsbCIKQEAgLTEyNjksNDcgKzEyNzcsNDEgQEAKIAkJCQkJICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKIAogewotCWNoYXIgKnBhZ2U7CisJY2hhciAqcGFnZSA9IE5VTEw7CiAJc3NpemVfdCByZXQ7CiAJaW50IG5ld192YWx1ZTsKIAotCWlmIChjb3VudCA+PSBQQUdFX1NJWkUpIHsKLQkJcmV0ID0gLUVOT01FTTsKKwlyZXQgPSB0YXNrX2hhc19zZWN1cml0eShjdXJyZW50LCBTRUNVUklUWV9fU0VUU0VDUEFSQU0pOworCWlmIChyZXQpCiAJCWdvdG8gb3V0OwotCX0KIAotCWlmICgqcHBvcyAhPSAwKSB7Ci0JCS8qIE5vIHBhcnRpYWwgd3JpdGVzLiAqLwotCQlyZXQgPSAtRUlOVkFMOworCXJldCA9IC1FTk9NRU07CisJaWYgKGNvdW50ID49IFBBR0VfU0laRSkKIAkJZ290byBvdXQ7Ci0JfQogCisJLyogTm8gcGFydGlhbCB3cml0ZXMuICovCisJcmV0ID0gLUVJTlZBTDsKKwlpZiAoKnBwb3MgIT0gMCkKKwkJZ290byBvdXQ7CisKKwlyZXQgPSAtRU5PTUVNOwogCXBhZ2UgPSAoY2hhciAqKWdldF96ZXJvZWRfcGFnZShHRlBfS0VSTkVMKTsKLQlpZiAoIXBhZ2UpIHsKLQkJcmV0ID0gLUVOT01FTTsKKwlpZiAoIXBhZ2UpCiAJCWdvdG8gb3V0OwotCX0KIAotCWlmIChjb3B5X2Zyb21fdXNlcihwYWdlLCBidWYsIGNvdW50KSkgewotCQlyZXQgPSAtRUZBVUxUOwotCQlnb3RvIG91dF9mcmVlOwotCX0KLQotCWlmIChzc2NhbmYocGFnZSwgIiV1IiwgJm5ld192YWx1ZSkgIT0gMSkgewotCQlyZXQgPSAtRUlOVkFMOworCXJldCA9IC1FRkFVTFQ7CisJaWYgKGNvcHlfZnJvbV91c2VyKHBhZ2UsIGJ1ZiwgY291bnQpKQogCQlnb3RvIG91dDsKLQl9CiAKLQlpZiAobmV3X3ZhbHVlICE9IGF2Y19jYWNoZV90aHJlc2hvbGQpIHsKLQkJcmV0ID0gdGFza19oYXNfc2VjdXJpdHkoY3VycmVudCwgU0VDVVJJVFlfX1NFVFNFQ1BBUkFNKTsKLQkJaWYgKHJldCkKLQkJCWdvdG8gb3V0X2ZyZWU7Ci0JCWF2Y19jYWNoZV90aHJlc2hvbGQgPSBuZXdfdmFsdWU7Ci0JfQorCXJldCA9IC1FSU5WQUw7CisJaWYgKHNzY2FuZihwYWdlLCAiJXUiLCAmbmV3X3ZhbHVlKSAhPSAxKQorCQlnb3RvIG91dDsKKworCWF2Y19jYWNoZV90aHJlc2hvbGQgPSBuZXdfdmFsdWU7CisKIAlyZXQgPSBjb3VudDsKLW91dF9mcmVlOgotCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylwYWdlKTsKIG91dDoKKwlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpcGFnZSk7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMTMxNywxOSArMTMxOSwxOCBAQAogCQkJCSAgICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKIHsKIAljaGFyICpwYWdlOwotCXNzaXplX3QgcmV0ID0gMDsKKwlzc2l6ZV90IGxlbmd0aDsKIAogCXBhZ2UgPSAoY2hhciAqKV9fZ2V0X2ZyZWVfcGFnZShHRlBfS0VSTkVMKTsKLQlpZiAoIXBhZ2UpIHsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBvdXQ7Ci0JfQotCXJldCA9IGF2Y19nZXRfaGFzaF9zdGF0cyhwYWdlKTsKLQlpZiAocmV0ID49IDApCi0JCXJldCA9IHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKGJ1ZiwgY291bnQsIHBwb3MsIHBhZ2UsIHJldCk7CisJaWYgKCFwYWdlKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWxlbmd0aCA9IGF2Y19nZXRfaGFzaF9zdGF0cyhwYWdlKTsKKwlpZiAobGVuZ3RoID49IDApCisJCWxlbmd0aCA9IHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKGJ1ZiwgY291bnQsIHBwb3MsIHBhZ2UsIGxlbmd0aCk7CiAJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKXBhZ2UpOwotb3V0OgotCXJldHVybiByZXQ7CisKKwlyZXR1cm4gbGVuZ3RoOwogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBzZWxfYXZjX2NhY2hlX3RocmVzaG9sZF9vcHMgPSB7CkBAIC0xNDExLDcgKzE0MTIsNyBAQAogCiBzdGF0aWMgaW50IHNlbF9tYWtlX2F2Y19maWxlcyhzdHJ1Y3QgZGVudHJ5ICpkaXIpCiB7Ci0JaW50IGksIHJldCA9IDA7CisJaW50IGk7CiAJc3RhdGljIHN0cnVjdCB0cmVlX2Rlc2NyIGZpbGVzW10gPSB7CiAJCXsgImNhY2hlX3RocmVzaG9sZCIsCiAJCSAgJnNlbF9hdmNfY2FjaGVfdGhyZXNob2xkX29wcywgU19JUlVHT3xTX0lXVVNSIH0sCkBAIC0xNDI2LDIyICsxNDI3LDE5IEBACiAJCXN0cnVjdCBkZW50cnkgKmRlbnRyeTsKIAogCQlkZW50cnkgPSBkX2FsbG9jX25hbWUoZGlyLCBmaWxlc1tpXS5uYW1lKTsKLQkJaWYgKCFkZW50cnkpIHsKLQkJCXJldCA9IC1FTk9NRU07Ci0JCQlnb3RvIG91dDsKLQkJfQorCQlpZiAoIWRlbnRyeSkKKwkJCXJldHVybiAtRU5PTUVNOwogCiAJCWlub2RlID0gc2VsX21ha2VfaW5vZGUoZGlyLT5kX3NiLCBTX0lGUkVHfGZpbGVzW2ldLm1vZGUpOwotCQlpZiAoIWlub2RlKSB7Ci0JCQlyZXQgPSAtRU5PTUVNOwotCQkJZ290byBvdXQ7Ci0JCX0KKwkJaWYgKCFpbm9kZSkKKwkJCXJldHVybiAtRU5PTUVNOworCiAJCWlub2RlLT5pX2ZvcCA9IGZpbGVzW2ldLm9wczsKIAkJaW5vZGUtPmlfaW5vID0gKytzZWxfbGFzdF9pbm87CiAJCWRfYWRkKGRlbnRyeSwgaW5vZGUpOwogCX0KLW91dDoKLQlyZXR1cm4gcmV0OworCisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBzc2l6ZV90IHNlbF9yZWFkX2luaXRjb24oc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsCkBAIC0xNDU1LDcgKzE0NTMsNyBAQAogCWlub2RlID0gZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZTsKIAlzaWQgPSBpbm9kZS0+aV9pbm8mU0VMX0lOT19NQVNLOwogCXJldCA9IHNlY3VyaXR5X3NpZF90b19jb250ZXh0KHNpZCwgJmNvbiwgJmxlbik7Ci0JaWYgKHJldCA8IDApCisJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAogCXJldCA9IHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKGJ1ZiwgY291bnQsIHBwb3MsIGNvbiwgbGVuKTsKQEAgLTE0NzAsMjggKzE0NjgsMjUgQEAKIAogc3RhdGljIGludCBzZWxfbWFrZV9pbml0Y29uX2ZpbGVzKHN0cnVjdCBkZW50cnkgKmRpcikKIHsKLQlpbnQgaSwgcmV0ID0gMDsKKwlpbnQgaTsKIAogCWZvciAoaSA9IDE7IGkgPD0gU0VDSU5JVFNJRF9OVU07IGkrKykgewogCQlzdHJ1Y3QgaW5vZGUgKmlub2RlOwogCQlzdHJ1Y3QgZGVudHJ5ICpkZW50cnk7CiAJCWRlbnRyeSA9IGRfYWxsb2NfbmFtZShkaXIsIHNlY3VyaXR5X2dldF9pbml0aWFsX3NpZF9jb250ZXh0KGkpKTsKLQkJaWYgKCFkZW50cnkpIHsKLQkJCXJldCA9IC1FTk9NRU07Ci0JCQlnb3RvIG91dDsKLQkJfQorCQlpZiAoIWRlbnRyeSkKKwkJCXJldHVybiAtRU5PTUVNOwogCiAJCWlub2RlID0gc2VsX21ha2VfaW5vZGUoZGlyLT5kX3NiLCBTX0lGUkVHfFNfSVJVR08pOwotCQlpZiAoIWlub2RlKSB7Ci0JCQlyZXQgPSAtRU5PTUVNOwotCQkJZ290byBvdXQ7Ci0JCX0KKwkJaWYgKCFpbm9kZSkKKwkJCXJldHVybiAtRU5PTUVNOworCiAJCWlub2RlLT5pX2ZvcCA9ICZzZWxfaW5pdGNvbl9vcHM7CiAJCWlub2RlLT5pX2lubyA9IGl8U0VMX0lOSVRDT05fSU5PX09GRlNFVDsKIAkJZF9hZGQoZGVudHJ5LCBpbm9kZSk7CiAJfQotb3V0OgotCXJldHVybiByZXQ7CisKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgc2VsX2Rpdih1bnNpZ25lZCBsb25nIGEsIHVuc2lnbmVkIGxvbmcgYikKQEAgLTE1MjcsMTUgKzE1MjIsMTMgQEAKIAl1bnNpZ25lZCBsb25nIGlubyA9IGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUtPmlfaW5vOwogCiAJcGFnZSA9IChjaGFyICopX19nZXRfZnJlZV9wYWdlKEdGUF9LRVJORUwpOwotCWlmICghcGFnZSkgewotCQlyYyA9IC1FTk9NRU07Ci0JCWdvdG8gb3V0OwotCX0KKwlpZiAoIXBhZ2UpCisJCXJldHVybiAtRU5PTUVNOwogCiAJbGVuID0gc25wcmludGYocGFnZSwgUEFHRV9TSVpFLCAiJWQiLCBzZWxfaW5vX3RvX2NsYXNzKGlubykpOwogCXJjID0gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIoYnVmLCBjb3VudCwgcHBvcywgcGFnZSwgbGVuKTsKIAlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpcGFnZSk7Ci1vdXQ6CisKIAlyZXR1cm4gcmM7CiB9CiAKQEAgLTE1NTIsMTUgKzE1NDUsMTMgQEAKIAl1bnNpZ25lZCBsb25nIGlubyA9IGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUtPmlfaW5vOwogCiAJcGFnZSA9IChjaGFyICopX19nZXRfZnJlZV9wYWdlKEdGUF9LRVJORUwpOwotCWlmICghcGFnZSkgewotCQlyYyA9IC1FTk9NRU07Ci0JCWdvdG8gb3V0OwotCX0KKwlpZiAoIXBhZ2UpCisJCXJldHVybiAtRU5PTUVNOwogCiAJbGVuID0gc25wcmludGYocGFnZSwgUEFHRV9TSVpFLCAiJWQiLCBzZWxfaW5vX3RvX3Blcm0oaW5vKSk7CiAJcmMgPSBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcihidWYsIGNvdW50LCBwcG9zLCBwYWdlLCBsZW4pOwogCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylwYWdlKTsKLW91dDoKKwogCXJldHVybiByYzsKIH0KIApAQCAtMTU5MSwzOSArMTU4MiwzNyBAQAogc3RhdGljIGludCBzZWxfbWFrZV9wZXJtX2ZpbGVzKGNoYXIgKm9iamNsYXNzLCBpbnQgY2xhc3N2YWx1ZSwKIAkJCQlzdHJ1Y3QgZGVudHJ5ICpkaXIpCiB7Ci0JaW50IGksIHJjID0gMCwgbnBlcm1zOworCWludCBpLCByYywgbnBlcm1zOwogCWNoYXIgKipwZXJtczsKIAogCXJjID0gc2VjdXJpdHlfZ2V0X3Blcm1pc3Npb25zKG9iamNsYXNzLCAmcGVybXMsICZucGVybXMpOwogCWlmIChyYykKLQkJZ290byBvdXQ7CisJCXJldHVybiByYzsKIAogCWZvciAoaSA9IDA7IGkgPCBucGVybXM7IGkrKykgewogCQlzdHJ1Y3QgaW5vZGUgKmlub2RlOwogCQlzdHJ1Y3QgZGVudHJ5ICpkZW50cnk7CiAKKwkJcmMgPSAtRU5PTUVNOwogCQlkZW50cnkgPSBkX2FsbG9jX25hbWUoZGlyLCBwZXJtc1tpXSk7Ci0JCWlmICghZGVudHJ5KSB7Ci0JCQlyYyA9IC1FTk9NRU07Ci0JCQlnb3RvIG91dDE7Ci0JCX0KKwkJaWYgKCFkZW50cnkpCisJCQlnb3RvIG91dDsKIAorCQlyYyA9IC1FTk9NRU07CiAJCWlub2RlID0gc2VsX21ha2VfaW5vZGUoZGlyLT5kX3NiLCBTX0lGUkVHfFNfSVJVR08pOwotCQlpZiAoIWlub2RlKSB7Ci0JCQlyYyA9IC1FTk9NRU07Ci0JCQlnb3RvIG91dDE7Ci0JCX0KKwkJaWYgKCFpbm9kZSkKKwkJCWdvdG8gb3V0OworCiAJCWlub2RlLT5pX2ZvcCA9ICZzZWxfcGVybV9vcHM7CiAJCS8qIGkrMSBzaW5jZSBwZXJtIHZhbHVlcyBhcmUgMS1pbmRleGVkICovCiAJCWlub2RlLT5pX2lubyA9IHNlbF9wZXJtX3RvX2lubyhjbGFzc3ZhbHVlLCBpICsgMSk7CiAJCWRfYWRkKGRlbnRyeSwgaW5vZGUpOwogCX0KLQotb3V0MToKKwlyYyA9IDA7CitvdXQ6CiAJZm9yIChpID0gMDsgaSA8IG5wZXJtczsgaSsrKQogCQlrZnJlZShwZXJtc1tpXSk7CiAJa2ZyZWUocGVybXMpOwotb3V0OgogCXJldHVybiByYzsKIH0KIApAQCAtMTYzNSwzNCArMTYyNCwyNyBAQAogCWludCByYzsKIAogCWRlbnRyeSA9IGRfYWxsb2NfbmFtZShkaXIsICJpbmRleCIpOwotCWlmICghZGVudHJ5KSB7Ci0JCXJjID0gLUVOT01FTTsKLQkJZ290byBvdXQ7Ci0JfQorCWlmICghZGVudHJ5KQorCQlyZXR1cm4gLUVOT01FTTsKIAogCWlub2RlID0gc2VsX21ha2VfaW5vZGUoZGlyLT5kX3NiLCBTX0lGUkVHfFNfSVJVR08pOwotCWlmICghaW5vZGUpIHsKLQkJcmMgPSAtRU5PTUVNOwotCQlnb3RvIG91dDsKLQl9CisJaWYgKCFpbm9kZSkKKwkJcmV0dXJuIC1FTk9NRU07CiAKIAlpbm9kZS0+aV9mb3AgPSAmc2VsX2NsYXNzX29wczsKIAlpbm9kZS0+aV9pbm8gPSBzZWxfY2xhc3NfdG9faW5vKGluZGV4KTsKIAlkX2FkZChkZW50cnksIGlub2RlKTsKIAogCWRlbnRyeSA9IGRfYWxsb2NfbmFtZShkaXIsICJwZXJtcyIpOwotCWlmICghZGVudHJ5KSB7Ci0JCXJjID0gLUVOT01FTTsKLQkJZ290byBvdXQ7Ci0JfQorCWlmICghZGVudHJ5KQorCQlyZXR1cm4gLUVOT01FTTsKIAogCXJjID0gc2VsX21ha2VfZGlyKGRpci0+ZF9pbm9kZSwgZGVudHJ5LCAmbGFzdF9jbGFzc19pbm8pOwogCWlmIChyYykKLQkJZ290byBvdXQ7CisJCXJldHVybiByYzsKIAogCXJjID0gc2VsX21ha2VfcGVybV9maWxlcyhjbGFzc25hbWUsIGluZGV4LCBkZW50cnkpOwogCi1vdXQ6CiAJcmV0dXJuIHJjOwogfQogCkBAIC0xNjkyLDE1ICsxNjc0LDE1IEBACiAKIHN0YXRpYyBpbnQgc2VsX21ha2VfY2xhc3Nlcyh2b2lkKQogewotCWludCByYyA9IDAsIG5jbGFzc2VzLCBpOworCWludCByYywgbmNsYXNzZXMsIGk7CiAJY2hhciAqKmNsYXNzZXM7CiAKIAkvKiBkZWxldGUgYW55IGV4aXN0aW5nIGVudHJpZXMgKi8KIAlzZWxfcmVtb3ZlX2NsYXNzZXMoKTsKIAogCXJjID0gc2VjdXJpdHlfZ2V0X2NsYXNzZXMoJmNsYXNzZXMsICZuY2xhc3Nlcyk7Ci0JaWYgKHJjIDwgMCkKLQkJZ290byBvdXQ7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CiAKIAkvKiArMiBzaW5jZSBjbGFzc2VzIGFyZSAxLWluZGV4ZWQgKi8KIAlsYXN0X2NsYXNzX2lubyA9IHNlbF9jbGFzc190b19pbm8obmNsYXNzZXMgKyAyKTsKQEAgLTE3MDgsMjkgKzE2OTAsMjcgQEAKIAlmb3IgKGkgPSAwOyBpIDwgbmNsYXNzZXM7IGkrKykgewogCQlzdHJ1Y3QgZGVudHJ5ICpjbGFzc19uYW1lX2RpcjsKIAorCQlyYyA9IC1FTk9NRU07CiAJCWNsYXNzX25hbWVfZGlyID0gZF9hbGxvY19uYW1lKGNsYXNzX2RpciwgY2xhc3Nlc1tpXSk7Ci0JCWlmICghY2xhc3NfbmFtZV9kaXIpIHsKLQkJCXJjID0gLUVOT01FTTsKLQkJCWdvdG8gb3V0MTsKLQkJfQorCQlpZiAoIWNsYXNzX25hbWVfZGlyKQorCQkJZ290byBvdXQ7CiAKIAkJcmMgPSBzZWxfbWFrZV9kaXIoY2xhc3NfZGlyLT5kX2lub2RlLCBjbGFzc19uYW1lX2RpciwKIAkJCQkmbGFzdF9jbGFzc19pbm8pOwogCQlpZiAocmMpCi0JCQlnb3RvIG91dDE7CisJCQlnb3RvIG91dDsKIAogCQkvKiBpKzEgc2luY2UgY2xhc3MgdmFsdWVzIGFyZSAxLWluZGV4ZWQgKi8KIAkJcmMgPSBzZWxfbWFrZV9jbGFzc19kaXJfZW50cmllcyhjbGFzc2VzW2ldLCBpICsgMSwKIAkJCQljbGFzc19uYW1lX2Rpcik7CiAJCWlmIChyYykKLQkJCWdvdG8gb3V0MTsKKwkJCWdvdG8gb3V0OwogCX0KLQotb3V0MToKKwlyYyA9IDA7CitvdXQ6CiAJZm9yIChpID0gMDsgaSA8IG5jbGFzc2VzOyBpKyspCiAJCWtmcmVlKGNsYXNzZXNbaV0pOwogCWtmcmVlKGNsYXNzZXMpOwotb3V0OgogCXJldHVybiByYzsKIH0KIApAQCAtMTc2NywxNCArMTc0NywxMiBAQAogc3RhdGljIGludCBzZWxfbWFrZV9kaXIoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwKIAkJCXVuc2lnbmVkIGxvbmcgKmlubykKIHsKLQlpbnQgcmV0ID0gMDsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlOwogCiAJaW5vZGUgPSBzZWxfbWFrZV9pbm9kZShkaXItPmlfc2IsIFNfSUZESVIgfCBTX0lSVUdPIHwgU19JWFVHTyk7Ci0JaWYgKCFpbm9kZSkgewotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIG91dDsKLQl9CisJaWYgKCFpbm9kZSkKKwkJcmV0dXJuIC1FTk9NRU07CisKIAlpbm9kZS0+aV9vcCA9ICZzaW1wbGVfZGlyX2lub2RlX29wZXJhdGlvbnM7CiAJaW5vZGUtPmlfZm9wID0gJnNpbXBsZV9kaXJfb3BlcmF0aW9uczsKIAlpbm9kZS0+aV9pbm8gPSArKygqaW5vKTsKQEAgLTE3ODMsOCArMTc2MSw4IEBACiAJZF9hZGQoZGVudHJ5LCBpbm9kZSk7CiAJLyogYnVtcCBsaW5rIGNvdW50IG9uIHBhcmVudCBkaXJlY3RvcnksIHRvbyAqLwogCWluY19ubGluayhkaXIpOwotb3V0OgotCXJldHVybiByZXQ7CisKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBzZWxfZmlsbF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB2b2lkICpkYXRhLCBpbnQgc2lsZW50KQpAQCAtMTgyMCwxMSArMTc5OCwxMCBAQAogCiAJcm9vdF9pbm9kZSA9IHNiLT5zX3Jvb3QtPmRfaW5vZGU7CiAKKwlyZXQgPSAtRU5PTUVNOwogCWRlbnRyeSA9IGRfYWxsb2NfbmFtZShzYi0+c19yb290LCBCT09MX0RJUl9OQU1FKTsKLQlpZiAoIWRlbnRyeSkgewotCQlyZXQgPSAtRU5PTUVNOworCWlmICghZGVudHJ5KQogCQlnb3RvIGVycjsKLQl9CiAKIAlyZXQgPSBzZWxfbWFrZV9kaXIocm9vdF9pbm9kZSwgZGVudHJ5LCAmc2VsX2xhc3RfaW5vKTsKIAlpZiAocmV0KQpAQCAtMTgzMiwxNyArMTgwOSwxNiBAQAogCiAJYm9vbF9kaXIgPSBkZW50cnk7CiAKKwlyZXQgPSAtRU5PTUVNOwogCWRlbnRyeSA9IGRfYWxsb2NfbmFtZShzYi0+c19yb290LCBOVUxMX0ZJTEVfTkFNRSk7Ci0JaWYgKCFkZW50cnkpIHsKLQkJcmV0ID0gLUVOT01FTTsKKwlpZiAoIWRlbnRyeSkKIAkJZ290byBlcnI7Ci0JfQogCisJcmV0ID0gLUVOT01FTTsKIAlpbm9kZSA9IHNlbF9tYWtlX2lub2RlKHNiLCBTX0lGQ0hSIHwgU19JUlVHTyB8IFNfSVdVR08pOwotCWlmICghaW5vZGUpIHsKLQkJcmV0ID0gLUVOT01FTTsKKwlpZiAoIWlub2RlKQogCQlnb3RvIGVycjsKLQl9CisKIAlpbm9kZS0+aV9pbm8gPSArK3NlbF9sYXN0X2lubzsKIAlpc2VjID0gKHN0cnVjdCBpbm9kZV9zZWN1cml0eV9zdHJ1Y3QgKilpbm9kZS0+aV9zZWN1cml0eTsKIAlpc2VjLT5zaWQgPSBTRUNJTklUU0lEX0RFVk5VTEw7CkBAIC0xODUzLDExICsxODI5LDEwIEBACiAJZF9hZGQoZGVudHJ5LCBpbm9kZSk7CiAJc2VsaW51eF9udWxsID0gZGVudHJ5OwogCisJcmV0ID0gLUVOT01FTTsKIAlkZW50cnkgPSBkX2FsbG9jX25hbWUoc2ItPnNfcm9vdCwgImF2YyIpOwotCWlmICghZGVudHJ5KSB7Ci0JCXJldCA9IC1FTk9NRU07CisJaWYgKCFkZW50cnkpCiAJCWdvdG8gZXJyOwotCX0KIAogCXJldCA9IHNlbF9tYWtlX2Rpcihyb290X2lub2RlLCBkZW50cnksICZzZWxfbGFzdF9pbm8pOwogCWlmIChyZXQpCkBAIC0xODY3LDExICsxODQyLDEwIEBACiAJaWYgKHJldCkKIAkJZ290byBlcnI7CiAKKwlyZXQgPSAtRU5PTUVNOwogCWRlbnRyeSA9IGRfYWxsb2NfbmFtZShzYi0+c19yb290LCAiaW5pdGlhbF9jb250ZXh0cyIpOwotCWlmICghZGVudHJ5KSB7Ci0JCXJldCA9IC1FTk9NRU07CisJaWYgKCFkZW50cnkpCiAJCWdvdG8gZXJyOwotCX0KIAogCXJldCA9IHNlbF9tYWtlX2Rpcihyb290X2lub2RlLCBkZW50cnksICZzZWxfbGFzdF9pbm8pOwogCWlmIChyZXQpCkBAIC0xODgxLDExICsxODU1LDEwIEBACiAJaWYgKHJldCkKIAkJZ290byBlcnI7CiAKKwlyZXQgPSAtRU5PTUVNOwogCWRlbnRyeSA9IGRfYWxsb2NfbmFtZShzYi0+c19yb290LCAiY2xhc3MiKTsKLQlpZiAoIWRlbnRyeSkgewotCQlyZXQgPSAtRU5PTUVNOworCWlmICghZGVudHJ5KQogCQlnb3RvIGVycjsKLQl9CiAKIAlyZXQgPSBzZWxfbWFrZV9kaXIocm9vdF9pbm9kZSwgZGVudHJ5LCAmc2VsX2xhc3RfaW5vKTsKIAlpZiAocmV0KQpAQCAtMTg5MywxMSArMTg2NiwxMCBAQAogCiAJY2xhc3NfZGlyID0gZGVudHJ5OwogCisJcmV0ID0gLUVOT01FTTsKIAlkZW50cnkgPSBkX2FsbG9jX25hbWUoc2ItPnNfcm9vdCwgInBvbGljeV9jYXBhYmlsaXRpZXMiKTsKLQlpZiAoIWRlbnRyeSkgewotCQlyZXQgPSAtRU5PTUVNOworCWlmICghZGVudHJ5KQogCQlnb3RvIGVycjsKLQl9CiAKIAlyZXQgPSBzZWxfbWFrZV9kaXIocm9vdF9pbm9kZSwgZGVudHJ5LCAmc2VsX2xhc3RfaW5vKTsKIAlpZiAocmV0KQpAQCAtMTkwNSwxMiArMTg3NywxMSBAQAogCiAJcG9saWN5Y2FwX2RpciA9IGRlbnRyeTsKIAotb3V0OgotCXJldHVybiByZXQ7CisJcmV0dXJuIDA7CiBlcnI6CiAJcHJpbnRrKEtFUk5fRVJSICJTRUxpbnV4OiAlczogIGZhaWxlZCB3aGlsZSBjcmVhdGluZyBpbm9kZXNcbiIsCiAJCV9fZnVuY19fKTsKLQlnb3RvIG91dDsKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgc3RydWN0IGRlbnRyeSAqc2VsX21vdW50KHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICpmc190eXBlLApAQCAtMTkzNCwxNCArMTkwNSwxNiBAQAogCWlmICghc2VsaW51eF9lbmFibGVkKQogCQlyZXR1cm4gMDsKIAllcnIgPSByZWdpc3Rlcl9maWxlc3lzdGVtKCZzZWxfZnNfdHlwZSk7Ci0JaWYgKCFlcnIpIHsKLQkJc2VsaW51eGZzX21vdW50ID0ga2Vybl9tb3VudCgmc2VsX2ZzX3R5cGUpOwotCQlpZiAoSVNfRVJSKHNlbGludXhmc19tb3VudCkpIHsKLQkJCXByaW50ayhLRVJOX0VSUiAic2VsaW51eGZzOiAgY291bGQgbm90IG1vdW50IVxuIik7Ci0JCQllcnIgPSBQVFJfRVJSKHNlbGludXhmc19tb3VudCk7Ci0JCQlzZWxpbnV4ZnNfbW91bnQgPSBOVUxMOwotCQl9CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCXNlbGludXhmc19tb3VudCA9IGtlcm5fbW91bnQoJnNlbF9mc190eXBlKTsKKwlpZiAoSVNfRVJSKHNlbGludXhmc19tb3VudCkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJzZWxpbnV4ZnM6ICBjb3VsZCBub3QgbW91bnQhXG4iKTsKKwkJZXJyID0gUFRSX0VSUihzZWxpbnV4ZnNfbW91bnQpOworCQlzZWxpbnV4ZnNfbW91bnQgPSBOVUxMOwogCX0KKwogCXJldHVybiBlcnI7CiB9CiAKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NlbGludXgvc3MvY29uZGl0aW9uYWwuYyBiL3NlY3VyaXR5L3NlbGludXgvc3MvY29uZGl0aW9uYWwuYwppbmRleCA2NTVmZTFjLi5jM2Y4NDVjIDEwMDY0NAotLS0gYS9zZWN1cml0eS9zZWxpbnV4L3NzL2NvbmRpdGlvbmFsLmMKKysrIGIvc2VjdXJpdHkvc2VsaW51eC9zcy9jb25kaXRpb25hbC5jCkBAIC0xOTMsNiArMTkzLDcgQEAKIHsKIAlzdHJ1Y3QgcG9saWN5ZGIgKnA7CiAJc3RydWN0IGNvbmRfYm9vbF9kYXR1bSAqYm9vbGRhdHVtOworCXN0cnVjdCBmbGV4X2FycmF5ICpmYTsKIAogCWJvb2xkYXR1bSA9IGRhdHVtOwogCXAgPSBkYXRhcDsKQEAgLTIwMCw3ICsyMDEsMTAgQEAKIAlpZiAoIWJvb2xkYXR1bS0+dmFsdWUgfHwgYm9vbGRhdHVtLT52YWx1ZSA+IHAtPnBfYm9vbHMubnByaW0pCiAJCXJldHVybiAtRUlOVkFMOwogCi0JcC0+cF9ib29sX3ZhbF90b19uYW1lW2Jvb2xkYXR1bS0+dmFsdWUgLSAxXSA9IGtleTsKKwlmYSA9IHAtPnN5bV92YWxfdG9fbmFtZVtTWU1fQk9PTFNdOworCWlmIChmbGV4X2FycmF5X3B1dF9wdHIoZmEsIGJvb2xkYXR1bS0+dmFsdWUgLSAxLCBrZXksCisJCQkgICAgICAgR0ZQX0tFUk5FTCB8IF9fR0ZQX1pFUk8pKQorCQlCVUcoKTsKIAlwLT5ib29sX3ZhbF90b19zdHJ1Y3RbYm9vbGRhdHVtLT52YWx1ZSAtIDFdID0gYm9vbGRhdHVtOwogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zZWxpbnV4L3NzL21scy5jIGIvc2VjdXJpdHkvc2VsaW51eC9zcy9tbHMuYwppbmRleCBiNGVmZjdhLi4xZWY4ZTRlIDEwMDY0NAotLS0gYS9zZWN1cml0eS9zZWxpbnV4L3NzL21scy5jCisrKyBiL3NlY3VyaXR5L3NlbGludXgvc3MvbWxzLmMKQEAgLTQ1LDcgKzQ1LDcgQEAKIAlsZW4gPSAxOyAvKiBmb3IgdGhlIGJlZ2lubmluZyAiOiIgKi8KIAlmb3IgKGwgPSAwOyBsIDwgMjsgbCsrKSB7CiAJCWludCBpbmRleF9zZW5zID0gY29udGV4dC0+cmFuZ2UubGV2ZWxbbF0uc2VuczsKLQkJbGVuICs9IHN0cmxlbihwb2xpY3lkYi5wX3NlbnNfdmFsX3RvX25hbWVbaW5kZXhfc2VucyAtIDFdKTsKKwkJbGVuICs9IHN0cmxlbihzeW1fbmFtZSgmcG9saWN5ZGIsIFNZTV9MRVZFTFMsIGluZGV4X3NlbnMgLSAxKSk7CiAKIAkJLyogY2F0ZWdvcmllcyAqLwogCQloZWFkID0gLTI7CkBAIC01NSwxNyArNTUsMTcgQEAKIAkJCWlmIChpIC0gcHJldiA+IDEpIHsKIAkJCQkvKiBvbmUgb3IgbW9yZSBuZWdhdGl2ZSBiaXRzIGFyZSBza2lwcGVkICovCiAJCQkJaWYgKGhlYWQgIT0gcHJldikgewotCQkJCQlubSA9IHBvbGljeWRiLnBfY2F0X3ZhbF90b19uYW1lW3ByZXZdOworCQkJCQlubSA9IHN5bV9uYW1lKCZwb2xpY3lkYiwgU1lNX0NBVFMsIHByZXYpOwogCQkJCQlsZW4gKz0gc3RybGVuKG5tKSArIDE7CiAJCQkJfQotCQkJCW5tID0gcG9saWN5ZGIucF9jYXRfdmFsX3RvX25hbWVbaV07CisJCQkJbm0gPSBzeW1fbmFtZSgmcG9saWN5ZGIsIFNZTV9DQVRTLCBpKTsKIAkJCQlsZW4gKz0gc3RybGVuKG5tKSArIDE7CiAJCQkJaGVhZCA9IGk7CiAJCQl9CiAJCQlwcmV2ID0gaTsKIAkJfQogCQlpZiAocHJldiAhPSBoZWFkKSB7Ci0JCQlubSA9IHBvbGljeWRiLnBfY2F0X3ZhbF90b19uYW1lW3ByZXZdOworCQkJbm0gPSBzeW1fbmFtZSgmcG9saWN5ZGIsIFNZTV9DQVRTLCBwcmV2KTsKIAkJCWxlbiArPSBzdHJsZW4obm0pICsgMTsKIAkJfQogCQlpZiAobCA9PSAwKSB7CkBAIC0xMDIsOCArMTAyLDggQEAKIAlzY29udGV4dHArKzsKIAogCWZvciAobCA9IDA7IGwgPCAyOyBsKyspIHsKLQkJc3RyY3B5KHNjb250ZXh0cCwKLQkJICAgICAgIHBvbGljeWRiLnBfc2Vuc192YWxfdG9fbmFtZVtjb250ZXh0LT5yYW5nZS5sZXZlbFtsXS5zZW5zIC0gMV0pOworCQlzdHJjcHkoc2NvbnRleHRwLCBzeW1fbmFtZSgmcG9saWN5ZGIsIFNZTV9MRVZFTFMsCisJCQkJCSAgIGNvbnRleHQtPnJhbmdlLmxldmVsW2xdLnNlbnMgLSAxKSk7CiAJCXNjb250ZXh0cCArPSBzdHJsZW4oc2NvbnRleHRwKTsKIAogCQkvKiBjYXRlZ29yaWVzICovCkBAIC0xMTgsNyArMTE4LDcgQEAKIAkJCQkJCSpzY29udGV4dHArKyA9ICcuJzsKIAkJCQkJZWxzZQogCQkJCQkJKnNjb250ZXh0cCsrID0gJywnOwotCQkJCQlubSA9IHBvbGljeWRiLnBfY2F0X3ZhbF90b19uYW1lW3ByZXZdOworCQkJCQlubSA9IHN5bV9uYW1lKCZwb2xpY3lkYiwgU1lNX0NBVFMsIHByZXYpOwogCQkJCQlzdHJjcHkoc2NvbnRleHRwLCBubSk7CiAJCQkJCXNjb250ZXh0cCArPSBzdHJsZW4obm0pOwogCQkJCX0KQEAgLTEyNiw3ICsxMjYsNyBAQAogCQkJCQkqc2NvbnRleHRwKysgPSAnOic7CiAJCQkJZWxzZQogCQkJCQkqc2NvbnRleHRwKysgPSAnLCc7Ci0JCQkJbm0gPSBwb2xpY3lkYi5wX2NhdF92YWxfdG9fbmFtZVtpXTsKKwkJCQlubSA9IHN5bV9uYW1lKCZwb2xpY3lkYiwgU1lNX0NBVFMsIGkpOwogCQkJCXN0cmNweShzY29udGV4dHAsIG5tKTsKIAkJCQlzY29udGV4dHAgKz0gc3RybGVuKG5tKTsKIAkJCQloZWFkID0gaTsKQEAgLTEzOSw3ICsxMzksNyBAQAogCQkJCSpzY29udGV4dHArKyA9ICcuJzsKIAkJCWVsc2UKIAkJCQkqc2NvbnRleHRwKysgPSAnLCc7Ci0JCQlubSA9IHBvbGljeWRiLnBfY2F0X3ZhbF90b19uYW1lW3ByZXZdOworCQkJbm0gPSBzeW1fbmFtZSgmcG9saWN5ZGIsIFNZTV9DQVRTLCBwcmV2KTsKIAkJCXN0cmNweShzY29udGV4dHAsIG5tKTsKIAkJCXNjb250ZXh0cCArPSBzdHJsZW4obm0pOwogCQl9CkBAIC0xNjYsNyArMTY2LDcgQEAKIAlpZiAoIWwtPnNlbnMgfHwgbC0+c2VucyA+IHAtPnBfbGV2ZWxzLm5wcmltKQogCQlyZXR1cm4gMDsKIAlsZXZkYXR1bSA9IGhhc2h0YWJfc2VhcmNoKHAtPnBfbGV2ZWxzLnRhYmxlLAotCQkJCSAgcC0+cF9zZW5zX3ZhbF90b19uYW1lW2wtPnNlbnMgLSAxXSk7CisJCQkJICBzeW1fbmFtZShwLCBTWU1fTEVWRUxTLCBsLT5zZW5zIC0gMSkpOwogCWlmICghbGV2ZGF0dW0pCiAJCXJldHVybiAwOwogCkBAIC00ODIsNyArNDgyLDggQEAKIAogCWZvciAobCA9IDA7IGwgPCAyOyBsKyspIHsKIAkJbGV2ZGF0dW0gPSBoYXNodGFiX3NlYXJjaChuZXdwLT5wX2xldmVscy50YWJsZSwKLQkJCW9sZHAtPnBfc2Vuc192YWxfdG9fbmFtZVtjLT5yYW5nZS5sZXZlbFtsXS5zZW5zIC0gMV0pOworCQkJCQkgIHN5bV9uYW1lKG9sZHAsIFNZTV9MRVZFTFMsCisJCQkJCQkgICBjLT5yYW5nZS5sZXZlbFtsXS5zZW5zIC0gMSkpOwogCiAJCWlmICghbGV2ZGF0dW0pCiAJCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTQ5Myw3ICs0OTQsNyBAQAogCQkJaW50IHJjOwogCiAJCQljYXRkYXR1bSA9IGhhc2h0YWJfc2VhcmNoKG5ld3AtPnBfY2F0cy50YWJsZSwKLQkJCQkJCSAgb2xkcC0+cF9jYXRfdmFsX3RvX25hbWVbaV0pOworCQkJCQkJICBzeW1fbmFtZShvbGRwLCBTWU1fQ0FUUywgaSkpOwogCQkJaWYgKCFjYXRkYXR1bSkKIAkJCQlyZXR1cm4gLUVJTlZBTDsKIAkJCXJjID0gZWJpdG1hcF9zZXRfYml0KCZiaXRtYXAsIGNhdGRhdHVtLT52YWx1ZSAtIDEsIDEpOwpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc2VsaW51eC9zcy9wb2xpY3lkYi5jIGIvc2VjdXJpdHkvc2VsaW51eC9zcy9wb2xpY3lkYi5jCmluZGV4IDk0ZjYzMGQuLmJlOWRlMzggMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NlbGludXgvc3MvcG9saWN5ZGIuYworKysgYi9zZWN1cml0eS9zZWxpbnV4L3NzL3BvbGljeWRiLmMKQEAgLTE0OCwzMiArMTQ4LDMwIEBACiAJaW50IHJjOwogCXN0cnVjdCByb2xlX2RhdHVtICpyb2xlOwogCisJcmMgPSAtRU5PTUVNOwogCXJvbGUgPSBremFsbG9jKHNpemVvZigqcm9sZSksIEdGUF9LRVJORUwpOwotCWlmICghcm9sZSkgewotCQlyYyA9IC1FTk9NRU07CisJaWYgKCFyb2xlKQogCQlnb3RvIG91dDsKLQl9CisKKwlyYyA9IC1FSU5WQUw7CiAJcm9sZS0+dmFsdWUgPSArK3AtPnBfcm9sZXMubnByaW07Ci0JaWYgKHJvbGUtPnZhbHVlICE9IE9CSkVDVF9SX1ZBTCkgewotCQlyYyA9IC1FSU5WQUw7Ci0JCWdvdG8gb3V0X2ZyZWVfcm9sZTsKLQl9CisJaWYgKHJvbGUtPnZhbHVlICE9IE9CSkVDVF9SX1ZBTCkKKwkJZ290byBvdXQ7CisKKwlyYyA9IC1FTk9NRU07CiAJa2V5ID0ga3N0cmR1cChPQkpFQ1RfUiwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFrZXkpIHsKLQkJcmMgPSAtRU5PTUVNOwotCQlnb3RvIG91dF9mcmVlX3JvbGU7Ci0JfQorCWlmICgha2V5KQorCQlnb3RvIG91dDsKKwogCXJjID0gaGFzaHRhYl9pbnNlcnQocC0+cF9yb2xlcy50YWJsZSwga2V5LCByb2xlKTsKIAlpZiAocmMpCi0JCWdvdG8gb3V0X2ZyZWVfa2V5Owotb3V0OgotCXJldHVybiByYzsKKwkJZ290byBvdXQ7CiAKLW91dF9mcmVlX2tleToKKwlyZXR1cm4gMDsKK291dDoKIAlrZnJlZShrZXkpOwotb3V0X2ZyZWVfcm9sZToKIAlrZnJlZShyb2xlKTsKLQlnb3RvIG91dDsKKwlyZXR1cm4gcmM7CiB9CiAKIHN0YXRpYyB1MzIgcmFuZ2V0cl9oYXNoKHN0cnVjdCBoYXNodGFiICpoLCBjb25zdCB2b2lkICprKQpAQCAtMjEzLDM1ICsyMTEsMzMgQEAKIAlmb3IgKGkgPSAwOyBpIDwgU1lNX05VTTsgaSsrKSB7CiAJCXJjID0gc3ltdGFiX2luaXQoJnAtPnN5bXRhYltpXSwgc3ltdGFiX3NpemVzW2ldKTsKIAkJaWYgKHJjKQotCQkJZ290byBvdXRfZnJlZV9zeW10YWI7CisJCQlnb3RvIG91dDsKIAl9CiAKIAlyYyA9IGF2dGFiX2luaXQoJnAtPnRlX2F2dGFiKTsKIAlpZiAocmMpCi0JCWdvdG8gb3V0X2ZyZWVfc3ltdGFiOworCQlnb3RvIG91dDsKIAogCXJjID0gcm9sZXNfaW5pdChwKTsKIAlpZiAocmMpCi0JCWdvdG8gb3V0X2ZyZWVfc3ltdGFiOworCQlnb3RvIG91dDsKIAogCXJjID0gY29uZF9wb2xpY3lkYl9pbml0KHApOwogCWlmIChyYykKLQkJZ290byBvdXRfZnJlZV9zeW10YWI7CisJCWdvdG8gb3V0OwogCiAJcC0+cmFuZ2VfdHIgPSBoYXNodGFiX2NyZWF0ZShyYW5nZXRyX2hhc2gsIHJhbmdldHJfY21wLCAyNTYpOwogCWlmICghcC0+cmFuZ2VfdHIpCi0JCWdvdG8gb3V0X2ZyZWVfc3ltdGFiOworCQlnb3RvIG91dDsKIAogCWViaXRtYXBfaW5pdCgmcC0+cG9saWN5Y2Fwcyk7CiAJZWJpdG1hcF9pbml0KCZwLT5wZXJtaXNzaXZlX21hcCk7CiAKKwlyZXR1cm4gMDsKIG91dDoKLQlyZXR1cm4gcmM7Ci0KLW91dF9mcmVlX3N5bXRhYjoKIAlmb3IgKGkgPSAwOyBpIDwgU1lNX05VTTsgaSsrKQogCQloYXNodGFiX2Rlc3Ryb3kocC0+c3ltdGFiW2ldLnRhYmxlKTsKLQlnb3RvIG91dDsKKwlyZXR1cm4gcmM7CiB9CiAKIC8qCkBAIC0yNTgsMTIgKzI1NCwxNyBAQAogewogCXN0cnVjdCBwb2xpY3lkYiAqcDsKIAlzdHJ1Y3QgY29tbW9uX2RhdHVtICpjb21kYXR1bTsKKwlzdHJ1Y3QgZmxleF9hcnJheSAqZmE7CiAKIAljb21kYXR1bSA9IGRhdHVtOwogCXAgPSBkYXRhcDsKIAlpZiAoIWNvbWRhdHVtLT52YWx1ZSB8fCBjb21kYXR1bS0+dmFsdWUgPiBwLT5wX2NvbW1vbnMubnByaW0pCiAJCXJldHVybiAtRUlOVkFMOwotCXAtPnBfY29tbW9uX3ZhbF90b19uYW1lW2NvbWRhdHVtLT52YWx1ZSAtIDFdID0ga2V5OworCisJZmEgPSBwLT5zeW1fdmFsX3RvX25hbWVbU1lNX0NPTU1PTlNdOworCWlmIChmbGV4X2FycmF5X3B1dF9wdHIoZmEsIGNvbWRhdHVtLT52YWx1ZSAtIDEsIGtleSwKKwkJCSAgICAgICBHRlBfS0VSTkVMIHwgX19HRlBfWkVSTykpCisJCUJVRygpOwogCXJldHVybiAwOwogfQogCkBAIC0yNzEsMTIgKzI3MiwxNiBAQAogewogCXN0cnVjdCBwb2xpY3lkYiAqcDsKIAlzdHJ1Y3QgY2xhc3NfZGF0dW0gKmNsYWRhdHVtOworCXN0cnVjdCBmbGV4X2FycmF5ICpmYTsKIAogCWNsYWRhdHVtID0gZGF0dW07CiAJcCA9IGRhdGFwOwogCWlmICghY2xhZGF0dW0tPnZhbHVlIHx8IGNsYWRhdHVtLT52YWx1ZSA+IHAtPnBfY2xhc3Nlcy5ucHJpbSkKIAkJcmV0dXJuIC1FSU5WQUw7Ci0JcC0+cF9jbGFzc192YWxfdG9fbmFtZVtjbGFkYXR1bS0+dmFsdWUgLSAxXSA9IGtleTsKKwlmYSA9IHAtPnN5bV92YWxfdG9fbmFtZVtTWU1fQ0xBU1NFU107CisJaWYgKGZsZXhfYXJyYXlfcHV0X3B0cihmYSwgY2xhZGF0dW0tPnZhbHVlIC0gMSwga2V5LAorCQkJICAgICAgIEdGUF9LRVJORUwgfCBfX0dGUF9aRVJPKSkKKwkJQlVHKCk7CiAJcC0+Y2xhc3NfdmFsX3RvX3N0cnVjdFtjbGFkYXR1bS0+dmFsdWUgLSAxXSA9IGNsYWRhdHVtOwogCXJldHVybiAwOwogfQpAQCAtMjg1LDYgKzI5MCw3IEBACiB7CiAJc3RydWN0IHBvbGljeWRiICpwOwogCXN0cnVjdCByb2xlX2RhdHVtICpyb2xlOworCXN0cnVjdCBmbGV4X2FycmF5ICpmYTsKIAogCXJvbGUgPSBkYXR1bTsKIAlwID0gZGF0YXA7CkBAIC0yOTIsNyArMjk4LDExIEBACiAJICAgIHx8IHJvbGUtPnZhbHVlID4gcC0+cF9yb2xlcy5ucHJpbQogCSAgICB8fCByb2xlLT5ib3VuZHMgPiBwLT5wX3JvbGVzLm5wcmltKQogCQlyZXR1cm4gLUVJTlZBTDsKLQlwLT5wX3JvbGVfdmFsX3RvX25hbWVbcm9sZS0+dmFsdWUgLSAxXSA9IGtleTsKKworCWZhID0gcC0+c3ltX3ZhbF90b19uYW1lW1NZTV9ST0xFU107CisJaWYgKGZsZXhfYXJyYXlfcHV0X3B0cihmYSwgcm9sZS0+dmFsdWUgLSAxLCBrZXksCisJCQkgICAgICAgR0ZQX0tFUk5FTCB8IF9fR0ZQX1pFUk8pKQorCQlCVUcoKTsKIAlwLT5yb2xlX3ZhbF90b19zdHJ1Y3Rbcm9sZS0+dmFsdWUgLSAxXSA9IHJvbGU7CiAJcmV0dXJuIDA7CiB9CkBAIC0zMDEsNiArMzExLDcgQEAKIHsKIAlzdHJ1Y3QgcG9saWN5ZGIgKnA7CiAJc3RydWN0IHR5cGVfZGF0dW0gKnR5cGRhdHVtOworCXN0cnVjdCBmbGV4X2FycmF5ICpmYTsKIAogCXR5cGRhdHVtID0gZGF0dW07CiAJcCA9IGRhdGFwOwpAQCAtMzEwLDggKzMyMSwxNSBAQAogCQkgICAgfHwgdHlwZGF0dW0tPnZhbHVlID4gcC0+cF90eXBlcy5ucHJpbQogCQkgICAgfHwgdHlwZGF0dW0tPmJvdW5kcyA+IHAtPnBfdHlwZXMubnByaW0pCiAJCQlyZXR1cm4gLUVJTlZBTDsKLQkJcC0+cF90eXBlX3ZhbF90b19uYW1lW3R5cGRhdHVtLT52YWx1ZSAtIDFdID0ga2V5OwotCQlwLT50eXBlX3ZhbF90b19zdHJ1Y3RbdHlwZGF0dW0tPnZhbHVlIC0gMV0gPSB0eXBkYXR1bTsKKwkJZmEgPSBwLT5zeW1fdmFsX3RvX25hbWVbU1lNX1RZUEVTXTsKKwkJaWYgKGZsZXhfYXJyYXlfcHV0X3B0cihmYSwgdHlwZGF0dW0tPnZhbHVlIC0gMSwga2V5LAorCQkJCSAgICAgICBHRlBfS0VSTkVMIHwgX19HRlBfWkVSTykpCisJCQlCVUcoKTsKKworCQlmYSA9IHAtPnR5cGVfdmFsX3RvX3N0cnVjdF9hcnJheTsKKwkJaWYgKGZsZXhfYXJyYXlfcHV0X3B0cihmYSwgdHlwZGF0dW0tPnZhbHVlIC0gMSwgdHlwZGF0dW0sCisJCQkJICAgICAgIEdGUF9LRVJORUwgfCBfX0dGUF9aRVJPKSkKKwkJCUJVRygpOwogCX0KIAogCXJldHVybiAwOwpAQCAtMzIxLDYgKzMzOSw3IEBACiB7CiAJc3RydWN0IHBvbGljeWRiICpwOwogCXN0cnVjdCB1c2VyX2RhdHVtICp1c3JkYXR1bTsKKwlzdHJ1Y3QgZmxleF9hcnJheSAqZmE7CiAKIAl1c3JkYXR1bSA9IGRhdHVtOwogCXAgPSBkYXRhcDsKQEAgLTMyOCw3ICszNDcsMTEgQEAKIAkgICAgfHwgdXNyZGF0dW0tPnZhbHVlID4gcC0+cF91c2Vycy5ucHJpbQogCSAgICB8fCB1c3JkYXR1bS0+Ym91bmRzID4gcC0+cF91c2Vycy5ucHJpbSkKIAkJcmV0dXJuIC1FSU5WQUw7Ci0JcC0+cF91c2VyX3ZhbF90b19uYW1lW3VzcmRhdHVtLT52YWx1ZSAtIDFdID0ga2V5OworCisJZmEgPSBwLT5zeW1fdmFsX3RvX25hbWVbU1lNX1VTRVJTXTsKKwlpZiAoZmxleF9hcnJheV9wdXRfcHRyKGZhLCB1c3JkYXR1bS0+dmFsdWUgLSAxLCBrZXksCisJCQkgICAgICAgR0ZQX0tFUk5FTCB8IF9fR0ZQX1pFUk8pKQorCQlCVUcoKTsKIAlwLT51c2VyX3ZhbF90b19zdHJ1Y3RbdXNyZGF0dW0tPnZhbHVlIC0gMV0gPSB1c3JkYXR1bTsKIAlyZXR1cm4gMDsKIH0KQEAgLTMzNyw2ICszNjAsNyBAQAogewogCXN0cnVjdCBwb2xpY3lkYiAqcDsKIAlzdHJ1Y3QgbGV2ZWxfZGF0dW0gKmxldmRhdHVtOworCXN0cnVjdCBmbGV4X2FycmF5ICpmYTsKIAogCWxldmRhdHVtID0gZGF0dW07CiAJcCA9IGRhdGFwOwpAQCAtMzQ1LDcgKzM2OSwxMCBAQAogCQlpZiAoIWxldmRhdHVtLT5sZXZlbC0+c2VucyB8fAogCQkgICAgbGV2ZGF0dW0tPmxldmVsLT5zZW5zID4gcC0+cF9sZXZlbHMubnByaW0pCiAJCQlyZXR1cm4gLUVJTlZBTDsKLQkJcC0+cF9zZW5zX3ZhbF90b19uYW1lW2xldmRhdHVtLT5sZXZlbC0+c2VucyAtIDFdID0ga2V5OworCQlmYSA9IHAtPnN5bV92YWxfdG9fbmFtZVtTWU1fTEVWRUxTXTsKKwkJaWYgKGZsZXhfYXJyYXlfcHV0X3B0cihmYSwgbGV2ZGF0dW0tPmxldmVsLT5zZW5zIC0gMSwga2V5LAorCQkJCSAgICAgICBHRlBfS0VSTkVMIHwgX19HRlBfWkVSTykpCisJCQlCVUcoKTsKIAl9CiAKIAlyZXR1cm4gMDsKQEAgLTM1NSw2ICszODIsNyBAQAogewogCXN0cnVjdCBwb2xpY3lkYiAqcDsKIAlzdHJ1Y3QgY2F0X2RhdHVtICpjYXRkYXR1bTsKKwlzdHJ1Y3QgZmxleF9hcnJheSAqZmE7CiAKIAljYXRkYXR1bSA9IGRhdHVtOwogCXAgPSBkYXRhcDsKQEAgLTM2Miw3ICszOTAsMTAgQEAKIAlpZiAoIWNhdGRhdHVtLT5pc2FsaWFzKSB7CiAJCWlmICghY2F0ZGF0dW0tPnZhbHVlIHx8IGNhdGRhdHVtLT52YWx1ZSA+IHAtPnBfY2F0cy5ucHJpbSkKIAkJCXJldHVybiAtRUlOVkFMOwotCQlwLT5wX2NhdF92YWxfdG9fbmFtZVtjYXRkYXR1bS0+dmFsdWUgLSAxXSA9IGtleTsKKwkJZmEgPSBwLT5zeW1fdmFsX3RvX25hbWVbU1lNX0NBVFNdOworCQlpZiAoZmxleF9hcnJheV9wdXRfcHRyKGZhLCBjYXRkYXR1bS0+dmFsdWUgLSAxLCBrZXksCisJCQkJICAgICAgIEdGUF9LRVJORUwgfCBfX0dGUF9aRVJPKSkKKwkJCUJVRygpOwogCX0KIAogCXJldHVybiAwOwpAQCAtMzgwLDQ3ICs0MTEsNiBAQAogCWNhdF9pbmRleCwKIH07CiAKLS8qCi0gKiBEZWZpbmUgdGhlIGNvbW1vbiB2YWxfdG9fbmFtZSBhcnJheSBhbmQgdGhlIGNsYXNzCi0gKiB2YWxfdG9fbmFtZSBhbmQgdmFsX3RvX3N0cnVjdCBhcnJheXMgaW4gYSBwb2xpY3kKLSAqIGRhdGFiYXNlIHN0cnVjdHVyZS4KLSAqCi0gKiBDYWxsZXIgbXVzdCBjbGVhbiB1cCB1cG9uIGZhaWx1cmUuCi0gKi8KLXN0YXRpYyBpbnQgcG9saWN5ZGJfaW5kZXhfY2xhc3NlcyhzdHJ1Y3QgcG9saWN5ZGIgKnApCi17Ci0JaW50IHJjOwotCi0JcC0+cF9jb21tb25fdmFsX3RvX25hbWUgPQotCQlrbWFsbG9jKHAtPnBfY29tbW9ucy5ucHJpbSAqIHNpemVvZihjaGFyICopLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXAtPnBfY29tbW9uX3ZhbF90b19uYW1lKSB7Ci0JCXJjID0gLUVOT01FTTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JcmMgPSBoYXNodGFiX21hcChwLT5wX2NvbW1vbnMudGFibGUsIGNvbW1vbl9pbmRleCwgcCk7Ci0JaWYgKHJjKQotCQlnb3RvIG91dDsKLQotCXAtPmNsYXNzX3ZhbF90b19zdHJ1Y3QgPQotCQlrbWFsbG9jKHAtPnBfY2xhc3Nlcy5ucHJpbSAqIHNpemVvZigqKHAtPmNsYXNzX3ZhbF90b19zdHJ1Y3QpKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwLT5jbGFzc192YWxfdG9fc3RydWN0KSB7Ci0JCXJjID0gLUVOT01FTTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JcC0+cF9jbGFzc192YWxfdG9fbmFtZSA9Ci0JCWttYWxsb2MocC0+cF9jbGFzc2VzLm5wcmltICogc2l6ZW9mKGNoYXIgKiksIEdGUF9LRVJORUwpOwotCWlmICghcC0+cF9jbGFzc192YWxfdG9fbmFtZSkgewotCQlyYyA9IC1FTk9NRU07Ci0JCWdvdG8gb3V0OwotCX0KLQotCXJjID0gaGFzaHRhYl9tYXAocC0+cF9jbGFzc2VzLnRhYmxlLCBjbGFzc19pbmRleCwgcCk7Ci1vdXQ6Ci0JcmV0dXJuIHJjOwotfQotCiAjaWZkZWYgREVCVUdfSEFTSEVTCiBzdGF0aWMgdm9pZCBzeW10YWJfaGFzaF9ldmFsKHN0cnVjdCBzeW10YWIgKnMpCiB7CkBAIC00NTgsOSArNDQ4LDkgQEAKICAqCiAgKiBDYWxsZXIgbXVzdCBjbGVhbiB1cCBvbiBmYWlsdXJlLgogICovCi1zdGF0aWMgaW50IHBvbGljeWRiX2luZGV4X290aGVycyhzdHJ1Y3QgcG9saWN5ZGIgKnApCitzdGF0aWMgaW50IHBvbGljeWRiX2luZGV4KHN0cnVjdCBwb2xpY3lkYiAqcCkKIHsKLQlpbnQgaSwgcmMgPSAwOworCWludCBpLCByYzsKIAogCXByaW50ayhLRVJOX0RFQlVHICJTRUxpbnV4OiAgJWQgdXNlcnMsICVkIHJvbGVzLCAlZCB0eXBlcywgJWQgYm9vbHMiLAogCSAgICAgICBwLT5wX3VzZXJzLm5wcmltLCBwLT5wX3JvbGVzLm5wcmltLCBwLT5wX3R5cGVzLm5wcmltLCBwLT5wX2Jvb2xzLm5wcmltKTsKQEAgLTQ3Nyw0NyArNDY3LDYzIEBACiAJc3ltdGFiX2hhc2hfZXZhbChwLT5zeW10YWIpOwogI2VuZGlmCiAKKwlyYyA9IC1FTk9NRU07CisJcC0+Y2xhc3NfdmFsX3RvX3N0cnVjdCA9CisJCWttYWxsb2MocC0+cF9jbGFzc2VzLm5wcmltICogc2l6ZW9mKCoocC0+Y2xhc3NfdmFsX3RvX3N0cnVjdCkpLAorCQkJR0ZQX0tFUk5FTCk7CisJaWYgKCFwLT5jbGFzc192YWxfdG9fc3RydWN0KQorCQlnb3RvIG91dDsKKworCXJjID0gLUVOT01FTTsKIAlwLT5yb2xlX3ZhbF90b19zdHJ1Y3QgPQogCQlrbWFsbG9jKHAtPnBfcm9sZXMubnByaW0gKiBzaXplb2YoKihwLT5yb2xlX3ZhbF90b19zdHJ1Y3QpKSwKIAkJCUdGUF9LRVJORUwpOwotCWlmICghcC0+cm9sZV92YWxfdG9fc3RydWN0KSB7Ci0JCXJjID0gLUVOT01FTTsKKwlpZiAoIXAtPnJvbGVfdmFsX3RvX3N0cnVjdCkKIAkJZ290byBvdXQ7Ci0JfQogCisJcmMgPSAtRU5PTUVNOwogCXAtPnVzZXJfdmFsX3RvX3N0cnVjdCA9CiAJCWttYWxsb2MocC0+cF91c2Vycy5ucHJpbSAqIHNpemVvZigqKHAtPnVzZXJfdmFsX3RvX3N0cnVjdCkpLAogCQkJR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwLT51c2VyX3ZhbF90b19zdHJ1Y3QpIHsKLQkJcmMgPSAtRU5PTUVNOworCWlmICghcC0+dXNlcl92YWxfdG9fc3RydWN0KQogCQlnb3RvIG91dDsKLQl9CiAKLQlwLT50eXBlX3ZhbF90b19zdHJ1Y3QgPQotCQlrbWFsbG9jKHAtPnBfdHlwZXMubnByaW0gKiBzaXplb2YoKihwLT50eXBlX3ZhbF90b19zdHJ1Y3QpKSwKLQkJCUdGUF9LRVJORUwpOwotCWlmICghcC0+dHlwZV92YWxfdG9fc3RydWN0KSB7Ci0JCXJjID0gLUVOT01FTTsKKwkvKiBZZXMsIEkgd2FudCB0aGUgc2l6ZW9mIHRoZSBwb2ludGVyLCBub3QgdGhlIHN0cnVjdHVyZSAqLworCXJjID0gLUVOT01FTTsKKwlwLT50eXBlX3ZhbF90b19zdHJ1Y3RfYXJyYXkgPSBmbGV4X2FycmF5X2FsbG9jKHNpemVvZihzdHJ1Y3QgdHlwZV9kYXR1bSAqKSwKKwkJCQkJCSAgICAgICBwLT5wX3R5cGVzLm5wcmltLAorCQkJCQkJICAgICAgIEdGUF9LRVJORUwgfCBfX0dGUF9aRVJPKTsKKwlpZiAoIXAtPnR5cGVfdmFsX3RvX3N0cnVjdF9hcnJheSkKIAkJZ290byBvdXQ7Ci0JfQogCi0JaWYgKGNvbmRfaW5pdF9ib29sX2luZGV4ZXMocCkpIHsKLQkJcmMgPSAtRU5PTUVNOworCXJjID0gZmxleF9hcnJheV9wcmVhbGxvYyhwLT50eXBlX3ZhbF90b19zdHJ1Y3RfYXJyYXksIDAsCisJCQkJIHAtPnBfdHlwZXMubnByaW0gLSAxLCBHRlBfS0VSTkVMIHwgX19HRlBfWkVSTyk7CisJaWYgKHJjKQogCQlnb3RvIG91dDsKLQl9CiAKLQlmb3IgKGkgPSBTWU1fUk9MRVM7IGkgPCBTWU1fTlVNOyBpKyspIHsKLQkJcC0+c3ltX3ZhbF90b19uYW1lW2ldID0KLQkJCWttYWxsb2MocC0+c3ltdGFiW2ldLm5wcmltICogc2l6ZW9mKGNoYXIgKiksIEdGUF9LRVJORUwpOwotCQlpZiAoIXAtPnN5bV92YWxfdG9fbmFtZVtpXSkgewotCQkJcmMgPSAtRU5PTUVNOworCXJjID0gLUVOT01FTTsKKwlpZiAoY29uZF9pbml0X2Jvb2xfaW5kZXhlcyhwKSkKKwkJZ290byBvdXQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgU1lNX05VTTsgaSsrKSB7CisJCXJjID0gLUVOT01FTTsKKwkJcC0+c3ltX3ZhbF90b19uYW1lW2ldID0gZmxleF9hcnJheV9hbGxvYyhzaXplb2YoY2hhciAqKSwKKwkJCQkJCQkgcC0+c3ltdGFiW2ldLm5wcmltLAorCQkJCQkJCSBHRlBfS0VSTkVMIHwgX19HRlBfWkVSTyk7CisJCWlmICghcC0+c3ltX3ZhbF90b19uYW1lW2ldKQogCQkJZ290byBvdXQ7Ci0JCX0KKworCQlyYyA9IGZsZXhfYXJyYXlfcHJlYWxsb2MocC0+c3ltX3ZhbF90b19uYW1lW2ldLAorCQkJCQkgMCwgcC0+c3ltdGFiW2ldLm5wcmltIC0gMSwKKwkJCQkJIEdGUF9LRVJORUwgfCBfX0dGUF9aRVJPKTsKKwkJaWYgKHJjKQorCQkJZ290byBvdXQ7CisKIAkJcmMgPSBoYXNodGFiX21hcChwLT5zeW10YWJbaV0udGFibGUsIGluZGV4X2ZbaV0sIHApOwogCQlpZiAocmMpCiAJCQlnb3RvIG91dDsKIAl9Ci0KKwlyYyA9IDA7CiBvdXQ6CiAJcmV0dXJuIHJjOwogfQpAQCAtNTQwLDkgKzU0NiwxMSBAQAogCXN0cnVjdCBjb21tb25fZGF0dW0gKmNvbWRhdHVtOwogCiAJa2ZyZWUoa2V5KTsKLQljb21kYXR1bSA9IGRhdHVtOwotCWhhc2h0YWJfbWFwKGNvbWRhdHVtLT5wZXJtaXNzaW9ucy50YWJsZSwgcGVybV9kZXN0cm95LCBOVUxMKTsKLQloYXNodGFiX2Rlc3Ryb3koY29tZGF0dW0tPnBlcm1pc3Npb25zLnRhYmxlKTsKKwlpZiAoZGF0dW0pIHsKKwkJY29tZGF0dW0gPSBkYXR1bTsKKwkJaGFzaHRhYl9tYXAoY29tZGF0dW0tPnBlcm1pc3Npb25zLnRhYmxlLCBwZXJtX2Rlc3Ryb3ksIE5VTEwpOworCQloYXNodGFiX2Rlc3Ryb3koY29tZGF0dW0tPnBlcm1pc3Npb25zLnRhYmxlKTsKKwl9CiAJa2ZyZWUoZGF0dW0pOwogCXJldHVybiAwOwogfQpAQCAtNTU0LDM4ICs1NjIsNDAgQEAKIAlzdHJ1Y3QgY29uc3RyYWludF9leHByICplLCAqZXRtcDsKIAogCWtmcmVlKGtleSk7Ci0JY2xhZGF0dW0gPSBkYXR1bTsKLQloYXNodGFiX21hcChjbGFkYXR1bS0+cGVybWlzc2lvbnMudGFibGUsIHBlcm1fZGVzdHJveSwgTlVMTCk7Ci0JaGFzaHRhYl9kZXN0cm95KGNsYWRhdHVtLT5wZXJtaXNzaW9ucy50YWJsZSk7Ci0JY29uc3RyYWludCA9IGNsYWRhdHVtLT5jb25zdHJhaW50czsKLQl3aGlsZSAoY29uc3RyYWludCkgewotCQllID0gY29uc3RyYWludC0+ZXhwcjsKLQkJd2hpbGUgKGUpIHsKLQkJCWViaXRtYXBfZGVzdHJveSgmZS0+bmFtZXMpOwotCQkJZXRtcCA9IGU7Ci0JCQllID0gZS0+bmV4dDsKLQkJCWtmcmVlKGV0bXApOworCWlmIChkYXR1bSkgeworCQljbGFkYXR1bSA9IGRhdHVtOworCQloYXNodGFiX21hcChjbGFkYXR1bS0+cGVybWlzc2lvbnMudGFibGUsIHBlcm1fZGVzdHJveSwgTlVMTCk7CisJCWhhc2h0YWJfZGVzdHJveShjbGFkYXR1bS0+cGVybWlzc2lvbnMudGFibGUpOworCQljb25zdHJhaW50ID0gY2xhZGF0dW0tPmNvbnN0cmFpbnRzOworCQl3aGlsZSAoY29uc3RyYWludCkgeworCQkJZSA9IGNvbnN0cmFpbnQtPmV4cHI7CisJCQl3aGlsZSAoZSkgeworCQkJCWViaXRtYXBfZGVzdHJveSgmZS0+bmFtZXMpOworCQkJCWV0bXAgPSBlOworCQkJCWUgPSBlLT5uZXh0OworCQkJCWtmcmVlKGV0bXApOworCQkJfQorCQkJY3RlbXAgPSBjb25zdHJhaW50OworCQkJY29uc3RyYWludCA9IGNvbnN0cmFpbnQtPm5leHQ7CisJCQlrZnJlZShjdGVtcCk7CiAJCX0KLQkJY3RlbXAgPSBjb25zdHJhaW50OwotCQljb25zdHJhaW50ID0gY29uc3RyYWludC0+bmV4dDsKLQkJa2ZyZWUoY3RlbXApOwotCX0KIAotCWNvbnN0cmFpbnQgPSBjbGFkYXR1bS0+dmFsaWRhdGV0cmFuczsKLQl3aGlsZSAoY29uc3RyYWludCkgewotCQllID0gY29uc3RyYWludC0+ZXhwcjsKLQkJd2hpbGUgKGUpIHsKLQkJCWViaXRtYXBfZGVzdHJveSgmZS0+bmFtZXMpOwotCQkJZXRtcCA9IGU7Ci0JCQllID0gZS0+bmV4dDsKLQkJCWtmcmVlKGV0bXApOworCQljb25zdHJhaW50ID0gY2xhZGF0dW0tPnZhbGlkYXRldHJhbnM7CisJCXdoaWxlIChjb25zdHJhaW50KSB7CisJCQllID0gY29uc3RyYWludC0+ZXhwcjsKKwkJCXdoaWxlIChlKSB7CisJCQkJZWJpdG1hcF9kZXN0cm95KCZlLT5uYW1lcyk7CisJCQkJZXRtcCA9IGU7CisJCQkJZSA9IGUtPm5leHQ7CisJCQkJa2ZyZWUoZXRtcCk7CisJCQl9CisJCQljdGVtcCA9IGNvbnN0cmFpbnQ7CisJCQljb25zdHJhaW50ID0gY29uc3RyYWludC0+bmV4dDsKKwkJCWtmcmVlKGN0ZW1wKTsKIAkJfQotCQljdGVtcCA9IGNvbnN0cmFpbnQ7Ci0JCWNvbnN0cmFpbnQgPSBjb25zdHJhaW50LT5uZXh0OwotCQlrZnJlZShjdGVtcCk7Ci0JfQogCi0Ja2ZyZWUoY2xhZGF0dW0tPmNvbWtleSk7CisJCWtmcmVlKGNsYWRhdHVtLT5jb21rZXkpOworCX0KIAlrZnJlZShkYXR1bSk7CiAJcmV0dXJuIDA7CiB9CkBAIC01OTUsOSArNjA1LDExIEBACiAJc3RydWN0IHJvbGVfZGF0dW0gKnJvbGU7CiAKIAlrZnJlZShrZXkpOwotCXJvbGUgPSBkYXR1bTsKLQllYml0bWFwX2Rlc3Ryb3koJnJvbGUtPmRvbWluYXRlcyk7Ci0JZWJpdG1hcF9kZXN0cm95KCZyb2xlLT50eXBlcyk7CisJaWYgKGRhdHVtKSB7CisJCXJvbGUgPSBkYXR1bTsKKwkJZWJpdG1hcF9kZXN0cm95KCZyb2xlLT5kb21pbmF0ZXMpOworCQllYml0bWFwX2Rlc3Ryb3koJnJvbGUtPnR5cGVzKTsKKwl9CiAJa2ZyZWUoZGF0dW0pOwogCXJldHVybiAwOwogfQpAQCAtNjE0LDExICs2MjYsMTMgQEAKIAlzdHJ1Y3QgdXNlcl9kYXR1bSAqdXNyZGF0dW07CiAKIAlrZnJlZShrZXkpOwotCXVzcmRhdHVtID0gZGF0dW07Ci0JZWJpdG1hcF9kZXN0cm95KCZ1c3JkYXR1bS0+cm9sZXMpOwotCWViaXRtYXBfZGVzdHJveSgmdXNyZGF0dW0tPnJhbmdlLmxldmVsWzBdLmNhdCk7Ci0JZWJpdG1hcF9kZXN0cm95KCZ1c3JkYXR1bS0+cmFuZ2UubGV2ZWxbMV0uY2F0KTsKLQllYml0bWFwX2Rlc3Ryb3koJnVzcmRhdHVtLT5kZmx0bGV2ZWwuY2F0KTsKKwlpZiAoZGF0dW0pIHsKKwkJdXNyZGF0dW0gPSBkYXR1bTsKKwkJZWJpdG1hcF9kZXN0cm95KCZ1c3JkYXR1bS0+cm9sZXMpOworCQllYml0bWFwX2Rlc3Ryb3koJnVzcmRhdHVtLT5yYW5nZS5sZXZlbFswXS5jYXQpOworCQllYml0bWFwX2Rlc3Ryb3koJnVzcmRhdHVtLT5yYW5nZS5sZXZlbFsxXS5jYXQpOworCQllYml0bWFwX2Rlc3Ryb3koJnVzcmRhdHVtLT5kZmx0bGV2ZWwuY2F0KTsKKwl9CiAJa2ZyZWUoZGF0dW0pOwogCXJldHVybiAwOwogfQpAQCAtNjI4LDkgKzY0MiwxMSBAQAogCXN0cnVjdCBsZXZlbF9kYXR1bSAqbGV2ZGF0dW07CiAKIAlrZnJlZShrZXkpOwotCWxldmRhdHVtID0gZGF0dW07Ci0JZWJpdG1hcF9kZXN0cm95KCZsZXZkYXR1bS0+bGV2ZWwtPmNhdCk7Ci0Ja2ZyZWUobGV2ZGF0dW0tPmxldmVsKTsKKwlpZiAoZGF0dW0pIHsKKwkJbGV2ZGF0dW0gPSBkYXR1bTsKKwkJZWJpdG1hcF9kZXN0cm95KCZsZXZkYXR1bS0+bGV2ZWwtPmNhdCk7CisJCWtmcmVlKGxldmRhdHVtLT5sZXZlbCk7CisJfQogCWtmcmVlKGRhdHVtKTsKIAlyZXR1cm4gMDsKIH0KQEAgLTY5NSwxMyArNzExLDE2IEBACiAJCWhhc2h0YWJfZGVzdHJveShwLT5zeW10YWJbaV0udGFibGUpOwogCX0KIAotCWZvciAoaSA9IDA7IGkgPCBTWU1fTlVNOyBpKyspCi0JCWtmcmVlKHAtPnN5bV92YWxfdG9fbmFtZVtpXSk7CisJZm9yIChpID0gMDsgaSA8IFNZTV9OVU07IGkrKykgeworCQlpZiAocC0+c3ltX3ZhbF90b19uYW1lW2ldKQorCQkJZmxleF9hcnJheV9mcmVlKHAtPnN5bV92YWxfdG9fbmFtZVtpXSk7CisJfQogCiAJa2ZyZWUocC0+Y2xhc3NfdmFsX3RvX3N0cnVjdCk7CiAJa2ZyZWUocC0+cm9sZV92YWxfdG9fc3RydWN0KTsKIAlrZnJlZShwLT51c2VyX3ZhbF90b19zdHJ1Y3QpOwotCWtmcmVlKHAtPnR5cGVfdmFsX3RvX3N0cnVjdCk7CisJaWYgKHAtPnR5cGVfdmFsX3RvX3N0cnVjdF9hcnJheSkKKwkJZmxleF9hcnJheV9mcmVlKHAtPnR5cGVfdmFsX3RvX3N0cnVjdF9hcnJheSk7CiAKIAlhdnRhYl9kZXN0cm95KCZwLT50ZV9hdnRhYik7CiAKQEAgLTc4NSwxOSArODA0LDIxIEBACiAKIAloZWFkID0gcC0+b2NvbnRleHRzW09DT05fSVNJRF07CiAJZm9yIChjID0gaGVhZDsgYzsgYyA9IGMtPm5leHQpIHsKKwkJcmMgPSAtRUlOVkFMOwogCQlpZiAoIWMtPmNvbnRleHRbMF0udXNlcikgewotCQkJcHJpbnRrKEtFUk5fRVJSICJTRUxpbnV4OiAgU0lEICVzIHdhcyBuZXZlciAiCi0JCQkgICAgICAgImRlZmluZWQuXG4iLCBjLT51Lm5hbWUpOwotCQkJcmMgPSAtRUlOVkFMOworCQkJcHJpbnRrKEtFUk5fRVJSICJTRUxpbnV4OiAgU0lEICVzIHdhcyBuZXZlciBkZWZpbmVkLlxuIiwKKwkJCQljLT51Lm5hbWUpOwogCQkJZ290byBvdXQ7CiAJCX0KLQkJaWYgKHNpZHRhYl9pbnNlcnQocywgYy0+c2lkWzBdLCAmYy0+Y29udGV4dFswXSkpIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiU0VMaW51eDogIHVuYWJsZSB0byBsb2FkIGluaXRpYWwgIgotCQkJICAgICAgICJTSUQgJXMuXG4iLCBjLT51Lm5hbWUpOwotCQkJcmMgPSAtRUlOVkFMOworCisJCXJjID0gc2lkdGFiX2luc2VydChzLCBjLT5zaWRbMF0sICZjLT5jb250ZXh0WzBdKTsKKwkJaWYgKHJjKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIlNFTGludXg6ICB1bmFibGUgdG8gbG9hZCBpbml0aWFsIFNJRCAlcy5cbiIsCisJCQkJYy0+dS5uYW1lKTsKIAkJCWdvdG8gb3V0OwogCQl9CiAJfQorCXJjID0gMDsKIG91dDoKIAlyZXR1cm4gcmM7CiB9CkBAIC04NDYsOCArODY3LDcgQEAKIAkJICogUm9sZSBtdXN0IGJlIGF1dGhvcml6ZWQgZm9yIHRoZSB0eXBlLgogCQkgKi8KIAkJcm9sZSA9IHAtPnJvbGVfdmFsX3RvX3N0cnVjdFtjLT5yb2xlIC0gMV07Ci0JCWlmICghZWJpdG1hcF9nZXRfYml0KCZyb2xlLT50eXBlcywKLQkJCQkgICAgIGMtPnR5cGUgLSAxKSkKKwkJaWYgKCFlYml0bWFwX2dldF9iaXQoJnJvbGUtPnR5cGVzLCBjLT50eXBlIC0gMSkpCiAJCQkvKiByb2xlIG1heSBub3QgYmUgYXNzb2NpYXRlZCB3aXRoIHR5cGUgKi8KIAkJCXJldHVybiAwOwogCkBAIC04NTgsOCArODc4LDcgQEAKIAkJaWYgKCF1c3JkYXR1bSkKIAkJCXJldHVybiAwOwogCi0JCWlmICghZWJpdG1hcF9nZXRfYml0KCZ1c3JkYXR1bS0+cm9sZXMsCi0JCQkJICAgICBjLT5yb2xlIC0gMSkpCisJCWlmICghZWJpdG1hcF9nZXRfYml0KCZ1c3JkYXR1bS0+cm9sZXMsIGMtPnJvbGUgLSAxKSkKIAkJCS8qIHVzZXIgbWF5IG5vdCBiZSBhc3NvY2lhdGVkIHdpdGggcm9sZSAqLwogCQkJcmV0dXJuIDA7CiAJfQpAQCAtODgxLDIwICs5MDAsMjIgQEAKIAlpbnQgcmM7CiAKIAlyYyA9IG5leHRfZW50cnkoYnVmLCBmcCwgc2l6ZW9mKHUzMikpOwotCWlmIChyYyA8IDApCisJaWYgKHJjKQogCQlnb3RvIG91dDsKIAorCXJjID0gLUVJTlZBTDsKIAlpdGVtcyA9IGxlMzJfdG9fY3B1KGJ1ZlswXSk7CiAJaWYgKGl0ZW1zID4gQVJSQVlfU0laRShidWYpKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiU0VMaW51eDogbWxzOiAgcmFuZ2Ugb3ZlcmZsb3dcbiIpOwotCQlyYyA9IC1FSU5WQUw7CiAJCWdvdG8gb3V0OwogCX0KKwogCXJjID0gbmV4dF9lbnRyeShidWYsIGZwLCBzaXplb2YodTMyKSAqIGl0ZW1zKTsKLQlpZiAocmMgPCAwKSB7CisJaWYgKHJjKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiU0VMaW51eDogbWxzOiAgdHJ1bmNhdGVkIHJhbmdlXG4iKTsKIAkJZ290byBvdXQ7CiAJfQorCiAJci0+bGV2ZWxbMF0uc2VucyA9IGxlMzJfdG9fY3B1KGJ1ZlswXSk7CiAJaWYgKGl0ZW1zID4gMSkKIAkJci0+bGV2ZWxbMV0uc2VucyA9IGxlMzJfdG9fY3B1KGJ1ZlsxXSk7CkBAIC05MDMsMTUgKzkyNCwxMyBAQAogCiAJcmMgPSBlYml0bWFwX3JlYWQoJnItPmxldmVsWzBdLmNhdCwgZnApOwogCWlmIChyYykgewotCQlwcmludGsoS0VSTl9FUlIgIlNFTGludXg6IG1sczogIGVycm9yIHJlYWRpbmcgbG93ICIKLQkJICAgICAgICJjYXRlZ29yaWVzXG4iKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJTRUxpbnV4OiBtbHM6ICBlcnJvciByZWFkaW5nIGxvdyBjYXRlZ29yaWVzXG4iKTsKIAkJZ290byBvdXQ7CiAJfQogCWlmIChpdGVtcyA+IDEpIHsKIAkJcmMgPSBlYml0bWFwX3JlYWQoJnItPmxldmVsWzFdLmNhdCwgZnApOwogCQlpZiAocmMpIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiU0VMaW51eDogbWxzOiAgZXJyb3IgcmVhZGluZyBoaWdoICIKLQkJCSAgICAgICAiY2F0ZWdvcmllc1xuIik7CisJCQlwcmludGsoS0VSTl9FUlIgIlNFTGludXg6IG1sczogIGVycm9yIHJlYWRpbmcgaGlnaCBjYXRlZ29yaWVzXG4iKTsKIAkJCWdvdG8gYmFkX2hpZ2g7CiAJCX0KIAl9IGVsc2UgewpAQCAtOTIyLDEyICs5NDEsMTEgQEAKIAkJfQogCX0KIAotCXJjID0gMDsKLW91dDoKLQlyZXR1cm4gcmM7CisJcmV0dXJuIDA7CiBiYWRfaGlnaDoKIAllYml0bWFwX2Rlc3Ryb3koJnItPmxldmVsWzBdLmNhdCk7Ci0JZ290byBvdXQ7CitvdXQ6CisJcmV0dXJuIHJjOwogfQogCiAvKgpAQCAtOTQyLDcgKzk2MCw3IEBACiAJaW50IHJjOwogCiAJcmMgPSBuZXh0X2VudHJ5KGJ1ZiwgZnAsIHNpemVvZiBidWYpOwotCWlmIChyYyA8IDApIHsKKwlpZiAocmMpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJTRUxpbnV4OiBjb250ZXh0IHRydW5jYXRlZFxuIik7CiAJCWdvdG8gb3V0OwogCX0KQEAgLTk1MCwxOSArOTY4LDIwIEBACiAJYy0+cm9sZSA9IGxlMzJfdG9fY3B1KGJ1ZlsxXSk7CiAJYy0+dHlwZSA9IGxlMzJfdG9fY3B1KGJ1ZlsyXSk7CiAJaWYgKHAtPnBvbGljeXZlcnMgPj0gUE9MSUNZREJfVkVSU0lPTl9NTFMpIHsKLQkJaWYgKG1sc19yZWFkX3JhbmdlX2hlbHBlcigmYy0+cmFuZ2UsIGZwKSkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJTRUxpbnV4OiBlcnJvciByZWFkaW5nIE1MUyByYW5nZSBvZiAiCi0JCQkgICAgICAgImNvbnRleHRcbiIpOwotCQkJcmMgPSAtRUlOVkFMOworCQlyYyA9IG1sc19yZWFkX3JhbmdlX2hlbHBlcigmYy0+cmFuZ2UsIGZwKTsKKwkJaWYgKHJjKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIlNFTGludXg6IGVycm9yIHJlYWRpbmcgTUxTIHJhbmdlIG9mIGNvbnRleHRcbiIpOwogCQkJZ290byBvdXQ7CiAJCX0KIAl9CiAKKwlyYyA9IC1FSU5WQUw7CiAJaWYgKCFwb2xpY3lkYl9jb250ZXh0X2lzdmFsaWQocCwgYykpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJTRUxpbnV4OiAgaW52YWxpZCBzZWN1cml0eSBjb250ZXh0XG4iKTsKIAkJY29udGV4dF9kZXN0cm95KGMpOwotCQlyYyA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OwogCX0KKwlyYyA9IDA7CiBvdXQ6CiAJcmV0dXJuIHJjOwogfQpAQCAtOTgxLDM3ICsxMDAwLDM2IEBACiAJX19sZTMyIGJ1ZlsyXTsKIAl1MzIgbGVuOwogCisJcmMgPSAtRU5PTUVNOwogCXBlcmRhdHVtID0ga3phbGxvYyhzaXplb2YoKnBlcmRhdHVtKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwZXJkYXR1bSkgewotCQlyYyA9IC1FTk9NRU07Ci0JCWdvdG8gb3V0OwotCX0KKwlpZiAoIXBlcmRhdHVtKQorCQlnb3RvIGJhZDsKIAogCXJjID0gbmV4dF9lbnRyeShidWYsIGZwLCBzaXplb2YgYnVmKTsKLQlpZiAocmMgPCAwKQorCWlmIChyYykKIAkJZ290byBiYWQ7CiAKIAlsZW4gPSBsZTMyX3RvX2NwdShidWZbMF0pOwogCXBlcmRhdHVtLT52YWx1ZSA9IGxlMzJfdG9fY3B1KGJ1ZlsxXSk7CiAKKwlyYyA9IC1FTk9NRU07CiAJa2V5ID0ga21hbGxvYyhsZW4gKyAxLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWtleSkgewotCQlyYyA9IC1FTk9NRU07CisJaWYgKCFrZXkpCiAJCWdvdG8gYmFkOwotCX0KKwogCXJjID0gbmV4dF9lbnRyeShrZXksIGZwLCBsZW4pOwotCWlmIChyYyA8IDApCisJaWYgKHJjKQogCQlnb3RvIGJhZDsKIAlrZXlbbGVuXSA9ICdcMCc7CiAKIAlyYyA9IGhhc2h0YWJfaW5zZXJ0KGgsIGtleSwgcGVyZGF0dW0pOwogCWlmIChyYykKIAkJZ290byBiYWQ7Ci1vdXQ6Ci0JcmV0dXJuIHJjOworCisJcmV0dXJuIDA7CiBiYWQ6CiAJcGVybV9kZXN0cm95KGtleSwgcGVyZGF0dW0sIE5VTEwpOwotCWdvdG8gb3V0OworCXJldHVybiByYzsKIH0KIAogc3RhdGljIGludCBjb21tb25fcmVhZChzdHJ1Y3QgcG9saWN5ZGIgKnAsIHN0cnVjdCBoYXNodGFiICpoLCB2b2lkICpmcCkKQEAgLTEwMjIsMTQgKzEwNDAsMTMgQEAKIAl1MzIgbGVuLCBuZWw7CiAJaW50IGksIHJjOwogCisJcmMgPSAtRU5PTUVNOwogCWNvbWRhdHVtID0ga3phbGxvYyhzaXplb2YoKmNvbWRhdHVtKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFjb21kYXR1bSkgewotCQlyYyA9IC1FTk9NRU07Ci0JCWdvdG8gb3V0OwotCX0KKwlpZiAoIWNvbWRhdHVtKQorCQlnb3RvIGJhZDsKIAogCXJjID0gbmV4dF9lbnRyeShidWYsIGZwLCBzaXplb2YgYnVmKTsKLQlpZiAocmMgPCAwKQorCWlmIChyYykKIAkJZ290byBiYWQ7CiAKIAlsZW4gPSBsZTMyX3RvX2NwdShidWZbMF0pOwpAQCAtMTA0MSwxMyArMTA1OCwxMyBAQAogCWNvbWRhdHVtLT5wZXJtaXNzaW9ucy5ucHJpbSA9IGxlMzJfdG9fY3B1KGJ1ZlsyXSk7CiAJbmVsID0gbGUzMl90b19jcHUoYnVmWzNdKTsKIAorCXJjID0gLUVOT01FTTsKIAlrZXkgPSBrbWFsbG9jKGxlbiArIDEsIEdGUF9LRVJORUwpOwotCWlmICgha2V5KSB7Ci0JCXJjID0gLUVOT01FTTsKKwlpZiAoIWtleSkKIAkJZ290byBiYWQ7Ci0JfQorCiAJcmMgPSBuZXh0X2VudHJ5KGtleSwgZnAsIGxlbik7Ci0JaWYgKHJjIDwgMCkKKwlpZiAocmMpCiAJCWdvdG8gYmFkOwogCWtleVtsZW5dID0gJ1wwJzsKIApAQCAtMTA2MCwxMSArMTA3NywxMCBAQAogCXJjID0gaGFzaHRhYl9pbnNlcnQoaCwga2V5LCBjb21kYXR1bSk7CiAJaWYgKHJjKQogCQlnb3RvIGJhZDsKLW91dDoKLQlyZXR1cm4gcmM7CisJcmV0dXJuIDA7CiBiYWQ6CiAJY29tbW9uX2Rlc3Ryb3koa2V5LCBjb21kYXR1bSwgTlVMTCk7Ci0JZ290byBvdXQ7CisJcmV0dXJuIHJjOwogfQogCiBzdGF0aWMgaW50IHJlYWRfY29uc19oZWxwZXIoc3RydWN0IGNvbnN0cmFpbnRfbm9kZSAqKm5vZGVwLCBpbnQgbmNvbnMsCkBAIC0xMDg4LDcgKzExMDQsNyBAQAogCQkJKm5vZGVwID0gYzsKIAogCQlyYyA9IG5leHRfZW50cnkoYnVmLCBmcCwgKHNpemVvZih1MzIpICogMikpOwotCQlpZiAocmMgPCAwKQorCQlpZiAocmMpCiAJCQlyZXR1cm4gcmM7CiAJCWMtPnBlcm1pc3Npb25zID0gbGUzMl90b19jcHUoYnVmWzBdKTsKIAkJbmV4cHIgPSBsZTMyX3RvX2NwdShidWZbMV0pOwpAQCAtMTEwNSw3ICsxMTIxLDcgQEAKIAkJCQljLT5leHByID0gZTsKIAogCQkJcmMgPSBuZXh0X2VudHJ5KGJ1ZiwgZnAsIChzaXplb2YodTMyKSAqIDMpKTsKLQkJCWlmIChyYyA8IDApCisJCQlpZiAocmMpCiAJCQkJcmV0dXJuIHJjOwogCQkJZS0+ZXhwcl90eXBlID0gbGUzMl90b19jcHUoYnVmWzBdKTsKIAkJCWUtPmF0dHIgPSBsZTMyX3RvX2NwdShidWZbMV0pOwpAQCAtMTEzMyw4ICsxMTQ5LDkgQEAKIAkJCQlpZiAoZGVwdGggPT0gKENFWFBSX01BWERFUFRIIC0gMSkpCiAJCQkJCXJldHVybiAtRUlOVkFMOwogCQkJCWRlcHRoKys7Ci0JCQkJaWYgKGViaXRtYXBfcmVhZCgmZS0+bmFtZXMsIGZwKSkKLQkJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQkJcmMgPSBlYml0bWFwX3JlYWQoJmUtPm5hbWVzLCBmcCk7CisJCQkJaWYgKHJjKQorCQkJCQlyZXR1cm4gcmM7CiAJCQkJYnJlYWs7CiAJCQlkZWZhdWx0OgogCQkJCXJldHVybiAtRUlOVkFMOwpAQCAtMTE1NywxNCArMTE3NCwxMyBAQAogCXUzMiBsZW4sIGxlbjIsIG5jb25zLCBuZWw7CiAJaW50IGksIHJjOwogCisJcmMgPSAtRU5PTUVNOwogCWNsYWRhdHVtID0ga3phbGxvYyhzaXplb2YoKmNsYWRhdHVtKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFjbGFkYXR1bSkgewotCQlyYyA9IC1FTk9NRU07Ci0JCWdvdG8gb3V0OwotCX0KKwlpZiAoIWNsYWRhdHVtKQorCQlnb3RvIGJhZDsKIAogCXJjID0gbmV4dF9lbnRyeShidWYsIGZwLCBzaXplb2YodTMyKSo2KTsKLQlpZiAocmMgPCAwKQorCWlmIChyYykKIAkJZ290byBiYWQ7CiAKIAlsZW4gPSBsZTMyX3RvX2NwdShidWZbMF0pOwpAQCAtMTE3OSwzMyArMTE5NSwzMCBAQAogCiAJbmNvbnMgPSBsZTMyX3RvX2NwdShidWZbNV0pOwogCisJcmMgPSAtRU5PTUVNOwogCWtleSA9IGttYWxsb2MobGVuICsgMSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFrZXkpIHsKLQkJcmMgPSAtRU5PTUVNOworCWlmICgha2V5KQogCQlnb3RvIGJhZDsKLQl9CisKIAlyYyA9IG5leHRfZW50cnkoa2V5LCBmcCwgbGVuKTsKLQlpZiAocmMgPCAwKQorCWlmIChyYykKIAkJZ290byBiYWQ7CiAJa2V5W2xlbl0gPSAnXDAnOwogCiAJaWYgKGxlbjIpIHsKKwkJcmMgPSAtRU5PTUVNOwogCQljbGFkYXR1bS0+Y29ta2V5ID0ga21hbGxvYyhsZW4yICsgMSwgR0ZQX0tFUk5FTCk7Ci0JCWlmICghY2xhZGF0dW0tPmNvbWtleSkgewotCQkJcmMgPSAtRU5PTUVNOworCQlpZiAoIWNsYWRhdHVtLT5jb21rZXkpCiAJCQlnb3RvIGJhZDsKLQkJfQogCQlyYyA9IG5leHRfZW50cnkoY2xhZGF0dW0tPmNvbWtleSwgZnAsIGxlbjIpOwotCQlpZiAocmMgPCAwKQorCQlpZiAocmMpCiAJCQlnb3RvIGJhZDsKIAkJY2xhZGF0dW0tPmNvbWtleVtsZW4yXSA9ICdcMCc7CiAKLQkJY2xhZGF0dW0tPmNvbWRhdHVtID0gaGFzaHRhYl9zZWFyY2gocC0+cF9jb21tb25zLnRhYmxlLAotCQkJCQkJICAgIGNsYWRhdHVtLT5jb21rZXkpOworCQlyYyA9IC1FSU5WQUw7CisJCWNsYWRhdHVtLT5jb21kYXR1bSA9IGhhc2h0YWJfc2VhcmNoKHAtPnBfY29tbW9ucy50YWJsZSwgY2xhZGF0dW0tPmNvbWtleSk7CiAJCWlmICghY2xhZGF0dW0tPmNvbWRhdHVtKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgIlNFTGludXg6ICB1bmtub3duIGNvbW1vbiAlc1xuIiwKLQkJCSAgICAgICBjbGFkYXR1bS0+Y29ta2V5KTsKLQkJCXJjID0gLUVJTlZBTDsKKwkJCXByaW50ayhLRVJOX0VSUiAiU0VMaW51eDogIHVua25vd24gY29tbW9uICVzXG4iLCBjbGFkYXR1bS0+Y29ta2V5KTsKIAkJCWdvdG8gYmFkOwogCQl9CiAJfQpAQCAtMTIyMiw3ICsxMjM1LDcgQEAKIAlpZiAocC0+cG9saWN5dmVycyA+PSBQT0xJQ1lEQl9WRVJTSU9OX1ZBTElEQVRFVFJBTlMpIHsKIAkJLyogZ3JhYiB0aGUgdmFsaWRhdGV0cmFucyBydWxlcyAqLwogCQlyYyA9IG5leHRfZW50cnkoYnVmLCBmcCwgc2l6ZW9mKHUzMikpOwotCQlpZiAocmMgPCAwKQorCQlpZiAocmMpCiAJCQlnb3RvIGJhZDsKIAkJbmNvbnMgPSBsZTMyX3RvX2NwdShidWZbMF0pOwogCQlyYyA9IHJlYWRfY29uc19oZWxwZXIoJmNsYWRhdHVtLT52YWxpZGF0ZXRyYW5zLCBuY29ucywgMSwgZnApOwpAQCAtMTIzNCwxMiArMTI0NywxMCBAQAogCWlmIChyYykKIAkJZ290byBiYWQ7CiAKLQlyYyA9IDA7Ci1vdXQ6Ci0JcmV0dXJuIHJjOworCXJldHVybiAwOwogYmFkOgogCWNsc19kZXN0cm95KGtleSwgY2xhZGF0dW0sIE5VTEwpOwotCWdvdG8gb3V0OworCXJldHVybiByYzsKIH0KIAogc3RhdGljIGludCByb2xlX3JlYWQoc3RydWN0IHBvbGljeWRiICpwLCBzdHJ1Y3QgaGFzaHRhYiAqaCwgdm9pZCAqZnApCkBAIC0xMjUwLDE3ICsxMjYxLDE2IEBACiAJX19sZTMyIGJ1ZlszXTsKIAl1MzIgbGVuOwogCisJcmMgPSAtRU5PTUVNOwogCXJvbGUgPSBremFsbG9jKHNpemVvZigqcm9sZSksIEdGUF9LRVJORUwpOwotCWlmICghcm9sZSkgewotCQlyYyA9IC1FTk9NRU07Ci0JCWdvdG8gb3V0OwotCX0KKwlpZiAoIXJvbGUpCisJCWdvdG8gYmFkOwogCiAJaWYgKHAtPnBvbGljeXZlcnMgPj0gUE9MSUNZREJfVkVSU0lPTl9CT1VOREFSWSkKIAkJdG9fcmVhZCA9IDM7CiAKIAlyYyA9IG5leHRfZW50cnkoYnVmLCBmcCwgc2l6ZW9mKGJ1ZlswXSkgKiB0b19yZWFkKTsKLQlpZiAocmMgPCAwKQorCWlmIChyYykKIAkJZ290byBiYWQ7CiAKIAlsZW4gPSBsZTMyX3RvX2NwdShidWZbMF0pOwpAQCAtMTI2OCwxMyArMTI3OCwxMyBAQAogCWlmIChwLT5wb2xpY3l2ZXJzID49IFBPTElDWURCX1ZFUlNJT05fQk9VTkRBUlkpCiAJCXJvbGUtPmJvdW5kcyA9IGxlMzJfdG9fY3B1KGJ1ZlsyXSk7CiAKKwlyYyA9IC1FTk9NRU07CiAJa2V5ID0ga21hbGxvYyhsZW4gKyAxLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWtleSkgewotCQlyYyA9IC1FTk9NRU07CisJaWYgKCFrZXkpCiAJCWdvdG8gYmFkOwotCX0KKwogCXJjID0gbmV4dF9lbnRyeShrZXksIGZwLCBsZW4pOwotCWlmIChyYyA8IDApCisJaWYgKHJjKQogCQlnb3RvIGJhZDsKIAlrZXlbbGVuXSA9ICdcMCc7CiAKQEAgLTEyODcsMTAgKzEyOTcsMTAgQEAKIAkJZ290byBiYWQ7CiAKIAlpZiAoc3RyY21wKGtleSwgT0JKRUNUX1IpID09IDApIHsKKwkJcmMgPSAtRUlOVkFMOwogCQlpZiAocm9sZS0+dmFsdWUgIT0gT0JKRUNUX1JfVkFMKSB7CiAJCQlwcmludGsoS0VSTl9FUlIgIlNFTGludXg6IFJvbGUgJXMgaGFzIHdyb25nIHZhbHVlICVkXG4iLAogCQkJICAgICAgIE9CSkVDVF9SLCByb2xlLT52YWx1ZSk7Ci0JCQlyYyA9IC1FSU5WQUw7CiAJCQlnb3RvIGJhZDsKIAkJfQogCQlyYyA9IDA7CkBAIC0xMzAwLDExICsxMzEwLDEwIEBACiAJcmMgPSBoYXNodGFiX2luc2VydChoLCBrZXksIHJvbGUpOwogCWlmIChyYykKIAkJZ290byBiYWQ7Ci1vdXQ6Ci0JcmV0dXJuIHJjOworCXJldHVybiAwOwogYmFkOgogCXJvbGVfZGVzdHJveShrZXksIHJvbGUsIE5VTEwpOwotCWdvdG8gb3V0OworCXJldHVybiByYzsKIH0KIAogc3RhdGljIGludCB0eXBlX3JlYWQoc3RydWN0IHBvbGljeWRiICpwLCBzdHJ1Y3QgaGFzaHRhYiAqaCwgdm9pZCAqZnApCkBAIC0xMzE1LDE3ICsxMzI0LDE2IEBACiAJX19sZTMyIGJ1Zls0XTsKIAl1MzIgbGVuOwogCisJcmMgPSAtRU5PTUVNOwogCXR5cGRhdHVtID0ga3phbGxvYyhzaXplb2YoKnR5cGRhdHVtKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCF0eXBkYXR1bSkgewotCQlyYyA9IC1FTk9NRU07Ci0JCXJldHVybiByYzsKLQl9CisJaWYgKCF0eXBkYXR1bSkKKwkJZ290byBiYWQ7CiAKIAlpZiAocC0+cG9saWN5dmVycyA+PSBQT0xJQ1lEQl9WRVJTSU9OX0JPVU5EQVJZKQogCQl0b19yZWFkID0gNDsKIAogCXJjID0gbmV4dF9lbnRyeShidWYsIGZwLCBzaXplb2YoYnVmWzBdKSAqIHRvX3JlYWQpOwotCWlmIChyYyA8IDApCisJaWYgKHJjKQogCQlnb3RvIGJhZDsKIAogCWxlbiA9IGxlMzJfdG9fY3B1KGJ1ZlswXSk7CkBAIC0xMzQzLDI0ICsxMzUxLDIyIEBACiAJCXR5cGRhdHVtLT5wcmltYXJ5ID0gbGUzMl90b19jcHUoYnVmWzJdKTsKIAl9CiAKKwlyYyA9IC1FTk9NRU07CiAJa2V5ID0ga21hbGxvYyhsZW4gKyAxLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWtleSkgewotCQlyYyA9IC1FTk9NRU07CisJaWYgKCFrZXkpCiAJCWdvdG8gYmFkOwotCX0KIAlyYyA9IG5leHRfZW50cnkoa2V5LCBmcCwgbGVuKTsKLQlpZiAocmMgPCAwKQorCWlmIChyYykKIAkJZ290byBiYWQ7CiAJa2V5W2xlbl0gPSAnXDAnOwogCiAJcmMgPSBoYXNodGFiX2luc2VydChoLCBrZXksIHR5cGRhdHVtKTsKIAlpZiAocmMpCiAJCWdvdG8gYmFkOwotb3V0OgotCXJldHVybiByYzsKKwlyZXR1cm4gMDsKIGJhZDoKIAl0eXBlX2Rlc3Ryb3koa2V5LCB0eXBkYXR1bSwgTlVMTCk7Ci0JZ290byBvdXQ7CisJcmV0dXJuIHJjOwogfQogCiAKQEAgLTEzNzYsMjIgKzEzODIsMTggQEAKIAltZW1zZXQobHAsIDAsIHNpemVvZigqbHApKTsKIAogCXJjID0gbmV4dF9lbnRyeShidWYsIGZwLCBzaXplb2YgYnVmKTsKLQlpZiAocmMgPCAwKSB7CisJaWYgKHJjKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiU0VMaW51eDogbWxzOiB0cnVuY2F0ZWQgbGV2ZWxcbiIpOwotCQlnb3RvIGJhZDsKKwkJcmV0dXJuIHJjOwogCX0KIAlscC0+c2VucyA9IGxlMzJfdG9fY3B1KGJ1ZlswXSk7CiAKLQlpZiAoZWJpdG1hcF9yZWFkKCZscC0+Y2F0LCBmcCkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJTRUxpbnV4OiBtbHM6ICBlcnJvciByZWFkaW5nIGxldmVsICIKLQkJICAgICAgICJjYXRlZ29yaWVzXG4iKTsKLQkJZ290byBiYWQ7CisJcmMgPSBlYml0bWFwX3JlYWQoJmxwLT5jYXQsIGZwKTsKKwlpZiAocmMpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJTRUxpbnV4OiBtbHM6ICBlcnJvciByZWFkaW5nIGxldmVsIGNhdGVnb3JpZXNcbiIpOworCQlyZXR1cm4gcmM7CiAJfQotCiAJcmV0dXJuIDA7Ci0KLWJhZDoKLQlyZXR1cm4gLUVJTlZBTDsKIH0KIAogc3RhdGljIGludCB1c2VyX3JlYWQoc3RydWN0IHBvbGljeWRiICpwLCBzdHJ1Y3QgaGFzaHRhYiAqaCwgdm9pZCAqZnApCkBAIC0xNDAyLDE3ICsxNDA0LDE2IEBACiAJX19sZTMyIGJ1ZlszXTsKIAl1MzIgbGVuOwogCisJcmMgPSAtRU5PTUVNOwogCXVzcmRhdHVtID0ga3phbGxvYyhzaXplb2YoKnVzcmRhdHVtKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCF1c3JkYXR1bSkgewotCQlyYyA9IC1FTk9NRU07Ci0JCWdvdG8gb3V0OwotCX0KKwlpZiAoIXVzcmRhdHVtKQorCQlnb3RvIGJhZDsKIAogCWlmIChwLT5wb2xpY3l2ZXJzID49IFBPTElDWURCX1ZFUlNJT05fQk9VTkRBUlkpCiAJCXRvX3JlYWQgPSAzOwogCiAJcmMgPSBuZXh0X2VudHJ5KGJ1ZiwgZnAsIHNpemVvZihidWZbMF0pICogdG9fcmVhZCk7Ci0JaWYgKHJjIDwgMCkKKwlpZiAocmMpCiAJCWdvdG8gYmFkOwogCiAJbGVuID0gbGUzMl90b19jcHUoYnVmWzBdKTsKQEAgLTE0MjAsMTMgKzE0MjEsMTIgQEAKIAlpZiAocC0+cG9saWN5dmVycyA+PSBQT0xJQ1lEQl9WRVJTSU9OX0JPVU5EQVJZKQogCQl1c3JkYXR1bS0+Ym91bmRzID0gbGUzMl90b19jcHUoYnVmWzJdKTsKIAorCXJjID0gLUVOT01FTTsKIAlrZXkgPSBrbWFsbG9jKGxlbiArIDEsIEdGUF9LRVJORUwpOwotCWlmICgha2V5KSB7Ci0JCXJjID0gLUVOT01FTTsKKwlpZiAoIWtleSkKIAkJZ290byBiYWQ7Ci0JfQogCXJjID0gbmV4dF9lbnRyeShrZXksIGZwLCBsZW4pOwotCWlmIChyYyA8IDApCisJaWYgKHJjKQogCQlnb3RvIGJhZDsKIAlrZXlbbGVuXSA9ICdcMCc7CiAKQEAgLTE0NDYsMTEgKzE0NDYsMTAgQEAKIAlyYyA9IGhhc2h0YWJfaW5zZXJ0KGgsIGtleSwgdXNyZGF0dW0pOwogCWlmIChyYykKIAkJZ290byBiYWQ7Ci1vdXQ6Ci0JcmV0dXJuIHJjOworCXJldHVybiAwOwogYmFkOgogCXVzZXJfZGVzdHJveShrZXksIHVzcmRhdHVtLCBOVUxMKTsKLQlnb3RvIG91dDsKKwlyZXR1cm4gcmM7CiB9CiAKIHN0YXRpYyBpbnQgc2Vuc19yZWFkKHN0cnVjdCBwb2xpY3lkYiAqcCwgc3RydWN0IGhhc2h0YWIgKmgsIHZvaWQgKmZwKQpAQCAtMTQ2MSw0NyArMTQ2MCw0MyBAQAogCV9fbGUzMiBidWZbMl07CiAJdTMyIGxlbjsKIAorCXJjID0gLUVOT01FTTsKIAlsZXZkYXR1bSA9IGt6YWxsb2Moc2l6ZW9mKCpsZXZkYXR1bSksIEdGUF9BVE9NSUMpOwotCWlmICghbGV2ZGF0dW0pIHsKLQkJcmMgPSAtRU5PTUVNOwotCQlnb3RvIG91dDsKLQl9CisJaWYgKCFsZXZkYXR1bSkKKwkJZ290byBiYWQ7CiAKIAlyYyA9IG5leHRfZW50cnkoYnVmLCBmcCwgc2l6ZW9mIGJ1Zik7Ci0JaWYgKHJjIDwgMCkKKwlpZiAocmMpCiAJCWdvdG8gYmFkOwogCiAJbGVuID0gbGUzMl90b19jcHUoYnVmWzBdKTsKIAlsZXZkYXR1bS0+aXNhbGlhcyA9IGxlMzJfdG9fY3B1KGJ1ZlsxXSk7CiAKKwlyYyA9IC1FTk9NRU07CiAJa2V5ID0ga21hbGxvYyhsZW4gKyAxLCBHRlBfQVRPTUlDKTsKLQlpZiAoIWtleSkgewotCQlyYyA9IC1FTk9NRU07CisJaWYgKCFrZXkpCiAJCWdvdG8gYmFkOwotCX0KIAlyYyA9IG5leHRfZW50cnkoa2V5LCBmcCwgbGVuKTsKLQlpZiAocmMgPCAwKQorCWlmIChyYykKIAkJZ290byBiYWQ7CiAJa2V5W2xlbl0gPSAnXDAnOwogCisJcmMgPSAtRU5PTUVNOwogCWxldmRhdHVtLT5sZXZlbCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBtbHNfbGV2ZWwpLCBHRlBfQVRPTUlDKTsKLQlpZiAoIWxldmRhdHVtLT5sZXZlbCkgewotCQlyYyA9IC1FTk9NRU07CisJaWYgKCFsZXZkYXR1bS0+bGV2ZWwpCiAJCWdvdG8gYmFkOwotCX0KLQlpZiAobWxzX3JlYWRfbGV2ZWwobGV2ZGF0dW0tPmxldmVsLCBmcCkpIHsKLQkJcmMgPSAtRUlOVkFMOworCisJcmMgPSBtbHNfcmVhZF9sZXZlbChsZXZkYXR1bS0+bGV2ZWwsIGZwKTsKKwlpZiAocmMpCiAJCWdvdG8gYmFkOwotCX0KIAogCXJjID0gaGFzaHRhYl9pbnNlcnQoaCwga2V5LCBsZXZkYXR1bSk7CiAJaWYgKHJjKQogCQlnb3RvIGJhZDsKLW91dDoKLQlyZXR1cm4gcmM7CisJcmV0dXJuIDA7CiBiYWQ6CiAJc2Vuc19kZXN0cm95KGtleSwgbGV2ZGF0dW0sIE5VTEwpOwotCWdvdG8gb3V0OworCXJldHVybiByYzsKIH0KIAogc3RhdGljIGludCBjYXRfcmVhZChzdHJ1Y3QgcG9saWN5ZGIgKnAsIHN0cnVjdCBoYXNodGFiICpoLCB2b2lkICpmcCkKQEAgLTE1MTIsMzkgKzE1MDcsMzUgQEAKIAlfX2xlMzIgYnVmWzNdOwogCXUzMiBsZW47CiAKKwlyYyA9IC1FTk9NRU07CiAJY2F0ZGF0dW0gPSBremFsbG9jKHNpemVvZigqY2F0ZGF0dW0pLCBHRlBfQVRPTUlDKTsKLQlpZiAoIWNhdGRhdHVtKSB7Ci0JCXJjID0gLUVOT01FTTsKLQkJZ290byBvdXQ7Ci0JfQorCWlmICghY2F0ZGF0dW0pCisJCWdvdG8gYmFkOwogCiAJcmMgPSBuZXh0X2VudHJ5KGJ1ZiwgZnAsIHNpemVvZiBidWYpOwotCWlmIChyYyA8IDApCisJaWYgKHJjKQogCQlnb3RvIGJhZDsKIAogCWxlbiA9IGxlMzJfdG9fY3B1KGJ1ZlswXSk7CiAJY2F0ZGF0dW0tPnZhbHVlID0gbGUzMl90b19jcHUoYnVmWzFdKTsKIAljYXRkYXR1bS0+aXNhbGlhcyA9IGxlMzJfdG9fY3B1KGJ1ZlsyXSk7CiAKKwlyYyA9IC1FTk9NRU07CiAJa2V5ID0ga21hbGxvYyhsZW4gKyAxLCBHRlBfQVRPTUlDKTsKLQlpZiAoIWtleSkgewotCQlyYyA9IC1FTk9NRU07CisJaWYgKCFrZXkpCiAJCWdvdG8gYmFkOwotCX0KIAlyYyA9IG5leHRfZW50cnkoa2V5LCBmcCwgbGVuKTsKLQlpZiAocmMgPCAwKQorCWlmIChyYykKIAkJZ290byBiYWQ7CiAJa2V5W2xlbl0gPSAnXDAnOwogCiAJcmMgPSBoYXNodGFiX2luc2VydChoLCBrZXksIGNhdGRhdHVtKTsKIAlpZiAocmMpCiAJCWdvdG8gYmFkOwotb3V0OgotCXJldHVybiByYzsKLQorCXJldHVybiAwOwogYmFkOgogCWNhdF9kZXN0cm95KGtleSwgY2F0ZGF0dW0sIE5VTEwpOwotCWdvdG8gb3V0OworCXJldHVybiByYzsKIH0KIAogc3RhdGljIGludCAoKnJlYWRfZltTWU1fTlVNXSkgKHN0cnVjdCBwb2xpY3lkYiAqcCwgc3RydWN0IGhhc2h0YWIgKmgsIHZvaWQgKmZwKSA9CkBAIC0xNTg1LDkgKzE1NzYsOSBAQAogCQkJcHJpbnRrKEtFUk5fRVJSCiAJCQkgICAgICAgIlNFTGludXg6IGJvdW5kYXJ5IHZpb2xhdGVkIHBvbGljeTogIgogCQkJICAgICAgICJ1c2VyPSVzIHJvbGU9JXMgYm91bmRzPSVzXG4iLAotCQkJICAgICAgIHAtPnBfdXNlcl92YWxfdG9fbmFtZVt1c2VyLT52YWx1ZSAtIDFdLAotCQkJICAgICAgIHAtPnBfcm9sZV92YWxfdG9fbmFtZVtiaXRdLAotCQkJICAgICAgIHAtPnBfdXNlcl92YWxfdG9fbmFtZVt1cHBlci0+dmFsdWUgLSAxXSk7CisJCQkgICAgICAgc3ltX25hbWUocCwgU1lNX1VTRVJTLCB1c2VyLT52YWx1ZSAtIDEpLAorCQkJICAgICAgIHN5bV9uYW1lKHAsIFNZTV9ST0xFUywgYml0KSwKKwkJCSAgICAgICBzeW1fbmFtZShwLCBTWU1fVVNFUlMsIHVwcGVyLT52YWx1ZSAtIDEpKTsKIAogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KQEAgLTE2MjIsOSArMTYxMyw5IEBACiAJCQlwcmludGsoS0VSTl9FUlIKIAkJCSAgICAgICAiU0VMaW51eDogYm91bmRhcnkgdmlvbGF0ZWQgcG9saWN5OiAiCiAJCQkgICAgICAgInJvbGU9JXMgdHlwZT0lcyBib3VuZHM9JXNcbiIsCi0JCQkgICAgICAgcC0+cF9yb2xlX3ZhbF90b19uYW1lW3JvbGUtPnZhbHVlIC0gMV0sCi0JCQkgICAgICAgcC0+cF90eXBlX3ZhbF90b19uYW1lW2JpdF0sCi0JCQkgICAgICAgcC0+cF9yb2xlX3ZhbF90b19uYW1lW3VwcGVyLT52YWx1ZSAtIDFdKTsKKwkJCSAgICAgICBzeW1fbmFtZShwLCBTWU1fUk9MRVMsIHJvbGUtPnZhbHVlIC0gMSksCisJCQkgICAgICAgc3ltX25hbWUocCwgU1lNX1RZUEVTLCBiaXQpLAorCQkJICAgICAgIHN5bV9uYW1lKHAsIFNZTV9ST0xFUywgdXBwZXItPnZhbHVlIC0gMSkpOwogCiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQpAQCAtMTY0OCwxMiArMTYzOSwxNSBAQAogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIAotCQl1cHBlciA9IHAtPnR5cGVfdmFsX3RvX3N0cnVjdFt1cHBlci0+Ym91bmRzIC0gMV07CisJCXVwcGVyID0gZmxleF9hcnJheV9nZXRfcHRyKHAtPnR5cGVfdmFsX3RvX3N0cnVjdF9hcnJheSwKKwkJCQkJICAgdXBwZXItPmJvdW5kcyAtIDEpOworCQlCVUdfT04oIXVwcGVyKTsKKwogCQlpZiAodXBwZXItPmF0dHJpYnV0ZSkgewogCQkJcHJpbnRrKEtFUk5fRVJSICJTRUxpbnV4OiB0eXBlICVzOiAiCiAJCQkgICAgICAgImJvdW5kZWQgYnkgYXR0cmlidXRlICVzIiwKIAkJCSAgICAgICAoY2hhciAqKSBrZXksCi0JCQkgICAgICAgcC0+cF90eXBlX3ZhbF90b19uYW1lW3VwcGVyLT52YWx1ZSAtIDFdKTsKKwkJCSAgICAgICBzeW1fbmFtZShwLCBTWU1fVFlQRVMsIHVwcGVyLT52YWx1ZSAtIDEpKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAJfQpAQCAtMjA2NiwxMyArMjA2MCwxNCBAQAogCiAJcmMgPSBwb2xpY3lkYl9pbml0KHApOwogCWlmIChyYykKLQkJZ290byBvdXQ7CisJCXJldHVybiByYzsKIAogCS8qIFJlYWQgdGhlIG1hZ2ljIG51bWJlciBhbmQgc3RyaW5nIGxlbmd0aC4gKi8KIAlyYyA9IG5leHRfZW50cnkoYnVmLCBmcCwgc2l6ZW9mKHUzMikgKiAyKTsKLQlpZiAocmMgPCAwKQorCWlmIChyYykKIAkJZ290byBiYWQ7CiAKKwlyYyA9IC1FSU5WQUw7CiAJaWYgKGxlMzJfdG9fY3B1KGJ1ZlswXSkgIT0gUE9MSUNZREJfTUFHSUMpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJTRUxpbnV4OiAgcG9saWN5ZGIgbWFnaWMgbnVtYmVyIDB4JXggZG9lcyAiCiAJCSAgICAgICAibm90IG1hdGNoIGV4cGVjdGVkIG1hZ2ljIG51bWJlciAweCV4XG4iLApAQCAtMjA4MCw2ICsyMDc1LDcgQEAKIAkJZ290byBiYWQ7CiAJfQogCisJcmMgPSAtRUlOVkFMOwogCWxlbiA9IGxlMzJfdG9fY3B1KGJ1ZlsxXSk7CiAJaWYgKGxlbiAhPSBzdHJsZW4oUE9MSUNZREJfU1RSSU5HKSkgewogCQlwcmludGsoS0VSTl9FUlIgIlNFTGludXg6ICBwb2xpY3lkYiBzdHJpbmcgbGVuZ3RoICVkIGRvZXMgbm90ICIKQEAgLTIwODcsMTkgKzIwODMsMjMgQEAKIAkJICAgICAgIGxlbiwgc3RybGVuKFBPTElDWURCX1NUUklORykpOwogCQlnb3RvIGJhZDsKIAl9CisKKwlyYyA9IC1FTk9NRU07CiAJcG9saWN5ZGJfc3RyID0ga21hbGxvYyhsZW4gKyAxLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXBvbGljeWRiX3N0cikgewogCQlwcmludGsoS0VSTl9FUlIgIlNFTGludXg6ICB1bmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBwb2xpY3lkYiAiCiAJCSAgICAgICAic3RyaW5nIG9mIGxlbmd0aCAlZFxuIiwgbGVuKTsKLQkJcmMgPSAtRU5PTUVNOwogCQlnb3RvIGJhZDsKIAl9CisKIAlyYyA9IG5leHRfZW50cnkocG9saWN5ZGJfc3RyLCBmcCwgbGVuKTsKLQlpZiAocmMgPCAwKSB7CisJaWYgKHJjKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiU0VMaW51eDogIHRydW5jYXRlZCBwb2xpY3lkYiBzdHJpbmcgaWRlbnRpZmllclxuIik7CiAJCWtmcmVlKHBvbGljeWRiX3N0cik7CiAJCWdvdG8gYmFkOwogCX0KKworCXJjID0gLUVJTlZBTDsKIAlwb2xpY3lkYl9zdHJbbGVuXSA9ICdcMCc7CiAJaWYgKHN0cmNtcChwb2xpY3lkYl9zdHIsIFBPTElDWURCX1NUUklORykpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJTRUxpbnV4OiAgcG9saWN5ZGIgc3RyaW5nICVzIGRvZXMgbm90IG1hdGNoICIKQEAgLTIxMTMsOSArMjExMywxMCBAQAogCiAJLyogUmVhZCB0aGUgdmVyc2lvbiBhbmQgdGFibGUgc2l6ZXMuICovCiAJcmMgPSBuZXh0X2VudHJ5KGJ1ZiwgZnAsIHNpemVvZih1MzIpKjQpOwotCWlmIChyYyA8IDApCisJaWYgKHJjKQogCQlnb3RvIGJhZDsKIAorCXJjID0gLUVJTlZBTDsKIAlwLT5wb2xpY3l2ZXJzID0gbGUzMl90b19jcHUoYnVmWzBdKTsKIAlpZiAocC0+cG9saWN5dmVycyA8IFBPTElDWURCX1ZFUlNJT05fTUlOIHx8CiAJICAgIHAtPnBvbGljeXZlcnMgPiBQT0xJQ1lEQl9WRVJTSU9OX01BWCkgewpAQCAtMjEyOCw2ICsyMTI5LDcgQEAKIAlpZiAoKGxlMzJfdG9fY3B1KGJ1ZlsxXSkgJiBQT0xJQ1lEQl9DT05GSUdfTUxTKSkgewogCQlwLT5tbHNfZW5hYmxlZCA9IDE7CiAKKwkJcmMgPSAtRUlOVkFMOwogCQlpZiAocC0+cG9saWN5dmVycyA8IFBPTElDWURCX1ZFUlNJT05fTUxTKSB7CiAJCQlwcmludGsoS0VSTl9FUlIgIlNFTGludXg6IHNlY3VyaXR5IHBvbGljeWRiIHZlcnNpb24gJWQgIgogCQkJCSIoTUxTKSBub3QgYmFja3dhcmRzIGNvbXBhdGlibGVcbiIsCkBAIC0yMTM4LDE0ICsyMTQwLDE5IEBACiAJcC0+cmVqZWN0X3Vua25vd24gPSAhIShsZTMyX3RvX2NwdShidWZbMV0pICYgUkVKRUNUX1VOS05PV04pOwogCXAtPmFsbG93X3Vua25vd24gPSAhIShsZTMyX3RvX2NwdShidWZbMV0pICYgQUxMT1dfVU5LTk9XTik7CiAKLQlpZiAocC0+cG9saWN5dmVycyA+PSBQT0xJQ1lEQl9WRVJTSU9OX1BPTENBUCAmJgotCSAgICBlYml0bWFwX3JlYWQoJnAtPnBvbGljeWNhcHMsIGZwKSAhPSAwKQotCQlnb3RvIGJhZDsKKwlpZiAocC0+cG9saWN5dmVycyA+PSBQT0xJQ1lEQl9WRVJTSU9OX1BPTENBUCkgeworCQlyYyA9IGViaXRtYXBfcmVhZCgmcC0+cG9saWN5Y2FwcywgZnApOworCQlpZiAocmMpCisJCQlnb3RvIGJhZDsKKwl9CiAKLQlpZiAocC0+cG9saWN5dmVycyA+PSBQT0xJQ1lEQl9WRVJTSU9OX1BFUk1JU1NJVkUgJiYKLQkgICAgZWJpdG1hcF9yZWFkKCZwLT5wZXJtaXNzaXZlX21hcCwgZnApICE9IDApCi0JCWdvdG8gYmFkOworCWlmIChwLT5wb2xpY3l2ZXJzID49IFBPTElDWURCX1ZFUlNJT05fUEVSTUlTU0lWRSkgeworCQlyYyA9IGViaXRtYXBfcmVhZCgmcC0+cGVybWlzc2l2ZV9tYXAsIGZwKTsKKwkJaWYgKHJjKQorCQkJZ290byBiYWQ7CisJfQogCisJcmMgPSAtRUlOVkFMOwogCWluZm8gPSBwb2xpY3lkYl9sb29rdXBfY29tcGF0KHAtPnBvbGljeXZlcnMpOwogCWlmICghaW5mbykgewogCQlwcmludGsoS0VSTl9FUlIgIlNFTGludXg6ICB1bmFibGUgdG8gZmluZCBwb2xpY3kgY29tcGF0IGluZm8gIgpAQCAtMjE1Myw2ICsyMTYwLDcgQEAKIAkJZ290byBiYWQ7CiAJfQogCisJcmMgPSAtRUlOVkFMOwogCWlmIChsZTMyX3RvX2NwdShidWZbMl0pICE9IGluZm8tPnN5bV9udW0gfHwKIAkJbGUzMl90b19jcHUoYnVmWzNdKSAhPSBpbmZvLT5vY29uX251bSkgewogCQlwcmludGsoS0VSTl9FUlIgIlNFTGludXg6ICBwb2xpY3lkYiB0YWJsZSBzaXplcyAoJWQsJWQpIGRvICIKQEAgLTIxNjQsNyArMjE3Miw3IEBACiAKIAlmb3IgKGkgPSAwOyBpIDwgaW5mby0+c3ltX251bTsgaSsrKSB7CiAJCXJjID0gbmV4dF9lbnRyeShidWYsIGZwLCBzaXplb2YodTMyKSoyKTsKLQkJaWYgKHJjIDwgMCkKKwkJaWYgKHJjKQogCQkJZ290byBiYWQ7CiAJCW5wcmltID0gbGUzMl90b19jcHUoYnVmWzBdKTsKIAkJbmVsID0gbGUzMl90b19jcHUoYnVmWzFdKTsKQEAgLTIxODgsNzggKzIxOTYsNzMgQEAKIAl9CiAKIAlyYyA9IG5leHRfZW50cnkoYnVmLCBmcCwgc2l6ZW9mKHUzMikpOwotCWlmIChyYyA8IDApCisJaWYgKHJjKQogCQlnb3RvIGJhZDsKIAluZWwgPSBsZTMyX3RvX2NwdShidWZbMF0pOwogCWx0ciA9IE5VTEw7CiAJZm9yIChpID0gMDsgaSA8IG5lbDsgaSsrKSB7CisJCXJjID0gLUVOT01FTTsKIAkJdHIgPSBremFsbG9jKHNpemVvZigqdHIpLCBHRlBfS0VSTkVMKTsKLQkJaWYgKCF0cikgewotCQkJcmMgPSAtRU5PTUVNOworCQlpZiAoIXRyKQogCQkJZ290byBiYWQ7Ci0JCX0KIAkJaWYgKGx0cikKIAkJCWx0ci0+bmV4dCA9IHRyOwogCQllbHNlCiAJCQlwLT5yb2xlX3RyID0gdHI7CiAJCXJjID0gbmV4dF9lbnRyeShidWYsIGZwLCBzaXplb2YodTMyKSozKTsKLQkJaWYgKHJjIDwgMCkKKwkJaWYgKHJjKQogCQkJZ290byBiYWQ7CisKKwkJcmMgPSAtRUlOVkFMOwogCQl0ci0+cm9sZSA9IGxlMzJfdG9fY3B1KGJ1ZlswXSk7CiAJCXRyLT50eXBlID0gbGUzMl90b19jcHUoYnVmWzFdKTsKIAkJdHItPm5ld19yb2xlID0gbGUzMl90b19jcHUoYnVmWzJdKTsKIAkJaWYgKCFwb2xpY3lkYl9yb2xlX2lzdmFsaWQocCwgdHItPnJvbGUpIHx8CiAJCSAgICAhcG9saWN5ZGJfdHlwZV9pc3ZhbGlkKHAsIHRyLT50eXBlKSB8fAotCQkgICAgIXBvbGljeWRiX3JvbGVfaXN2YWxpZChwLCB0ci0+bmV3X3JvbGUpKSB7Ci0JCQlyYyA9IC1FSU5WQUw7CisJCSAgICAhcG9saWN5ZGJfcm9sZV9pc3ZhbGlkKHAsIHRyLT5uZXdfcm9sZSkpCiAJCQlnb3RvIGJhZDsKLQkJfQogCQlsdHIgPSB0cjsKIAl9CiAKIAlyYyA9IG5leHRfZW50cnkoYnVmLCBmcCwgc2l6ZW9mKHUzMikpOwotCWlmIChyYyA8IDApCisJaWYgKHJjKQogCQlnb3RvIGJhZDsKIAluZWwgPSBsZTMyX3RvX2NwdShidWZbMF0pOwogCWxyYSA9IE5VTEw7CiAJZm9yIChpID0gMDsgaSA8IG5lbDsgaSsrKSB7CisJCXJjID0gLUVOT01FTTsKIAkJcmEgPSBremFsbG9jKHNpemVvZigqcmEpLCBHRlBfS0VSTkVMKTsKLQkJaWYgKCFyYSkgewotCQkJcmMgPSAtRU5PTUVNOworCQlpZiAoIXJhKQogCQkJZ290byBiYWQ7Ci0JCX0KIAkJaWYgKGxyYSkKIAkJCWxyYS0+bmV4dCA9IHJhOwogCQllbHNlCiAJCQlwLT5yb2xlX2FsbG93ID0gcmE7CiAJCXJjID0gbmV4dF9lbnRyeShidWYsIGZwLCBzaXplb2YodTMyKSoyKTsKLQkJaWYgKHJjIDwgMCkKKwkJaWYgKHJjKQogCQkJZ290byBiYWQ7CisKKwkJcmMgPSAtRUlOVkFMOwogCQlyYS0+cm9sZSA9IGxlMzJfdG9fY3B1KGJ1ZlswXSk7CiAJCXJhLT5uZXdfcm9sZSA9IGxlMzJfdG9fY3B1KGJ1ZlsxXSk7CiAJCWlmICghcG9saWN5ZGJfcm9sZV9pc3ZhbGlkKHAsIHJhLT5yb2xlKSB8fAotCQkgICAgIXBvbGljeWRiX3JvbGVfaXN2YWxpZChwLCByYS0+bmV3X3JvbGUpKSB7Ci0JCQlyYyA9IC1FSU5WQUw7CisJCSAgICAhcG9saWN5ZGJfcm9sZV9pc3ZhbGlkKHAsIHJhLT5uZXdfcm9sZSkpCiAJCQlnb3RvIGJhZDsKLQkJfQogCQlscmEgPSByYTsKIAl9CiAKLQlyYyA9IHBvbGljeWRiX2luZGV4X2NsYXNzZXMocCk7CisJcmMgPSBwb2xpY3lkYl9pbmRleChwKTsKIAlpZiAocmMpCiAJCWdvdG8gYmFkOwogCi0JcmMgPSBwb2xpY3lkYl9pbmRleF9vdGhlcnMocCk7Ci0JaWYgKHJjKQotCQlnb3RvIGJhZDsKLQorCXJjID0gLUVJTlZBTDsKIAlwLT5wcm9jZXNzX2NsYXNzID0gc3RyaW5nX3RvX3NlY3VyaXR5X2NsYXNzKHAsICJwcm9jZXNzIik7CiAJaWYgKCFwLT5wcm9jZXNzX2NsYXNzKQogCQlnb3RvIGJhZDsKLQlwLT5wcm9jZXNzX3RyYW5zX3Blcm1zID0gc3RyaW5nX3RvX2F2X3Blcm0ocCwgcC0+cHJvY2Vzc19jbGFzcywKLQkJCQkJCSAgICJ0cmFuc2l0aW9uIik7Ci0JcC0+cHJvY2Vzc190cmFuc19wZXJtcyB8PSBzdHJpbmdfdG9fYXZfcGVybShwLCBwLT5wcm9jZXNzX2NsYXNzLAotCQkJCQkJICAgICJkeW50cmFuc2l0aW9uIik7CisKKwlyYyA9IC1FSU5WQUw7CisJcC0+cHJvY2Vzc190cmFuc19wZXJtcyA9IHN0cmluZ190b19hdl9wZXJtKHAsIHAtPnByb2Nlc3NfY2xhc3MsICJ0cmFuc2l0aW9uIik7CisJcC0+cHJvY2Vzc190cmFuc19wZXJtcyB8PSBzdHJpbmdfdG9fYXZfcGVybShwLCBwLT5wcm9jZXNzX2NsYXNzLCAiZHludHJhbnNpdGlvbiIpOwogCWlmICghcC0+cHJvY2Vzc190cmFuc19wZXJtcykKIAkJZ290byBiYWQ7CiAKQEAgLTIzMTIsOCArMjMxNSw2IEBACiBvdXQ6CiAJcmV0dXJuIHJjOwogYmFkOgotCWlmICghcmMpCi0JCXJjID0gLUVJTlZBTDsKIAlwb2xpY3lkYl9kZXN0cm95KHApOwogCWdvdG8gb3V0OwogfQpAQCAtMzA3Niw3ICszMDc3LDcgQEAKIAlpZiAoIWluZm8pIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJTRUxpbnV4OiBjb21wYXRpYmlsaXR5IGxvb2t1cCBmYWlsZWQgZm9yIHBvbGljeSAiCiAJCSAgICAidmVyc2lvbiAlZCIsIHAtPnBvbGljeXZlcnMpOwotCQlyZXR1cm4gcmM7CisJCXJldHVybiAtRUlOVkFMOwogCX0KIAogCWJ1ZlswXSA9IGNwdV90b19sZTMyKHAtPnBvbGljeXZlcnMpOwpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc2VsaW51eC9zcy9wb2xpY3lkYi5oIGIvc2VjdXJpdHkvc2VsaW51eC9zcy9wb2xpY3lkYi5oCmluZGV4IDk1ZDNkN2QuLjRlM2FiOWQgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NlbGludXgvc3MvcG9saWN5ZGIuaAorKysgYi9zZWN1cml0eS9zZWxpbnV4L3NzL3BvbGljeWRiLmgKQEAgLTIwMywyMSArMjAzLDEzIEBACiAjZGVmaW5lIHBfY2F0cyBzeW10YWJbU1lNX0NBVFNdCiAKIAkvKiBzeW1ib2wgbmFtZXMgaW5kZXhlZCBieSAodmFsdWUgLSAxKSAqLwotCWNoYXIgKipzeW1fdmFsX3RvX25hbWVbU1lNX05VTV07Ci0jZGVmaW5lIHBfY29tbW9uX3ZhbF90b19uYW1lIHN5bV92YWxfdG9fbmFtZVtTWU1fQ09NTU9OU10KLSNkZWZpbmUgcF9jbGFzc192YWxfdG9fbmFtZSBzeW1fdmFsX3RvX25hbWVbU1lNX0NMQVNTRVNdCi0jZGVmaW5lIHBfcm9sZV92YWxfdG9fbmFtZSBzeW1fdmFsX3RvX25hbWVbU1lNX1JPTEVTXQotI2RlZmluZSBwX3R5cGVfdmFsX3RvX25hbWUgc3ltX3ZhbF90b19uYW1lW1NZTV9UWVBFU10KLSNkZWZpbmUgcF91c2VyX3ZhbF90b19uYW1lIHN5bV92YWxfdG9fbmFtZVtTWU1fVVNFUlNdCi0jZGVmaW5lIHBfYm9vbF92YWxfdG9fbmFtZSBzeW1fdmFsX3RvX25hbWVbU1lNX0JPT0xTXQotI2RlZmluZSBwX3NlbnNfdmFsX3RvX25hbWUgc3ltX3ZhbF90b19uYW1lW1NZTV9MRVZFTFNdCi0jZGVmaW5lIHBfY2F0X3ZhbF90b19uYW1lIHN5bV92YWxfdG9fbmFtZVtTWU1fQ0FUU10KKwlzdHJ1Y3QgZmxleF9hcnJheSAqc3ltX3ZhbF90b19uYW1lW1NZTV9OVU1dOwogCiAJLyogY2xhc3MsIHJvbGUsIGFuZCB1c2VyIGF0dHJpYnV0ZXMgaW5kZXhlZCBieSAodmFsdWUgLSAxKSAqLwogCXN0cnVjdCBjbGFzc19kYXR1bSAqKmNsYXNzX3ZhbF90b19zdHJ1Y3Q7CiAJc3RydWN0IHJvbGVfZGF0dW0gKipyb2xlX3ZhbF90b19zdHJ1Y3Q7CiAJc3RydWN0IHVzZXJfZGF0dW0gKip1c2VyX3ZhbF90b19zdHJ1Y3Q7Ci0Jc3RydWN0IHR5cGVfZGF0dW0gKip0eXBlX3ZhbF90b19zdHJ1Y3Q7CisJc3RydWN0IGZsZXhfYXJyYXkgKnR5cGVfdmFsX3RvX3N0cnVjdF9hcnJheTsKIAogCS8qIHR5cGUgZW5mb3JjZW1lbnQgYWNjZXNzIHZlY3RvcnMgYW5kIHRyYW5zaXRpb25zICovCiAJc3RydWN0IGF2dGFiIHRlX2F2dGFiOwpAQCAtMzIxLDYgKzMxMywxMyBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW5saW5lIGNoYXIgKnN5bV9uYW1lKHN0cnVjdCBwb2xpY3lkYiAqcCwgdW5zaWduZWQgaW50IHN5bV9udW0sIHVuc2lnbmVkIGludCBlbGVtZW50X25yKQoreworCXN0cnVjdCBmbGV4X2FycmF5ICpmYSA9IHAtPnN5bV92YWxfdG9fbmFtZVtzeW1fbnVtXTsKKworCXJldHVybiBmbGV4X2FycmF5X2dldF9wdHIoZmEsIGVsZW1lbnRfbnIpOworfQorCiBleHRlcm4gdTE2IHN0cmluZ190b19zZWN1cml0eV9jbGFzcyhzdHJ1Y3QgcG9saWN5ZGIgKnAsIGNvbnN0IGNoYXIgKm5hbWUpOwogZXh0ZXJuIHUzMiBzdHJpbmdfdG9fYXZfcGVybShzdHJ1Y3QgcG9saWN5ZGIgKnAsIHUxNiB0Y2xhc3MsIGNvbnN0IGNoYXIgKm5hbWUpOwogCmRpZmYgLS1naXQgYS9zZWN1cml0eS9zZWxpbnV4L3NzL3NlcnZpY2VzLmMgYi9zZWN1cml0eS9zZWxpbnV4L3NzL3NlcnZpY2VzLmMKaW5kZXggMjIzYzFmZi4uYTAzY2ZhZiAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc2VsaW51eC9zcy9zZXJ2aWNlcy5jCisrKyBiL3NlY3VyaXR5L3NlbGludXgvc3Mvc2VydmljZXMuYwpAQCAtNDY0LDcgKzQ2NCw3IEBACiAJaWYgKCFwZXJtaXNzaW9ucykKIAkJcmV0dXJuOwogCi0JdGNsYXNzX25hbWUgPSBwb2xpY3lkYi5wX2NsYXNzX3ZhbF90b19uYW1lW3RjbGFzcyAtIDFdOworCXRjbGFzc19uYW1lID0gc3ltX25hbWUoJnBvbGljeWRiLCBTWU1fQ0xBU1NFUywgdGNsYXNzIC0gMSk7CiAJdGNsYXNzX2RhdCA9IHBvbGljeWRiLmNsYXNzX3ZhbF90b19zdHJ1Y3RbdGNsYXNzIC0gMV07CiAJY29tbW9uX2RhdCA9IHRjbGFzc19kYXQtPmNvbWRhdHVtOwogCkBAIC01MzAsMTIgKzUzMCwxOCBAQAogCXN0cnVjdCBjb250ZXh0IGxvX3Njb250ZXh0OwogCXN0cnVjdCBjb250ZXh0IGxvX3Rjb250ZXh0OwogCXN0cnVjdCBhdl9kZWNpc2lvbiBsb19hdmQ7Ci0Jc3RydWN0IHR5cGVfZGF0dW0gKnNvdXJjZQotCQk9IHBvbGljeWRiLnR5cGVfdmFsX3RvX3N0cnVjdFtzY29udGV4dC0+dHlwZSAtIDFdOwotCXN0cnVjdCB0eXBlX2RhdHVtICp0YXJnZXQKLQkJPSBwb2xpY3lkYi50eXBlX3ZhbF90b19zdHJ1Y3RbdGNvbnRleHQtPnR5cGUgLSAxXTsKKwlzdHJ1Y3QgdHlwZV9kYXR1bSAqc291cmNlOworCXN0cnVjdCB0eXBlX2RhdHVtICp0YXJnZXQ7CiAJdTMyIG1hc2tlZCA9IDA7CiAKKwlzb3VyY2UgPSBmbGV4X2FycmF5X2dldF9wdHIocG9saWN5ZGIudHlwZV92YWxfdG9fc3RydWN0X2FycmF5LAorCQkJCSAgICBzY29udGV4dC0+dHlwZSAtIDEpOworCUJVR19PTighc291cmNlKTsKKworCXRhcmdldCA9IGZsZXhfYXJyYXlfZ2V0X3B0cihwb2xpY3lkYi50eXBlX3ZhbF90b19zdHJ1Y3RfYXJyYXksCisJCQkJICAgIHRjb250ZXh0LT50eXBlIC0gMSk7CisJQlVHX09OKCF0YXJnZXQpOworCiAJaWYgKHNvdXJjZS0+Ym91bmRzKSB7CiAJCW1lbXNldCgmbG9fYXZkLCAwLCBzaXplb2YobG9fYXZkKSk7CiAKQEAgLTcwMSwxNiArNzA3LDE2IEBACiAJY2hhciAqbyA9IE5VTEwsICpuID0gTlVMTCwgKnQgPSBOVUxMOwogCXUzMiBvbGVuLCBubGVuLCB0bGVuOwogCi0JaWYgKGNvbnRleHRfc3RydWN0X3RvX3N0cmluZyhvY29udGV4dCwgJm8sICZvbGVuKSA8IDApCisJaWYgKGNvbnRleHRfc3RydWN0X3RvX3N0cmluZyhvY29udGV4dCwgJm8sICZvbGVuKSkKIAkJZ290byBvdXQ7Ci0JaWYgKGNvbnRleHRfc3RydWN0X3RvX3N0cmluZyhuY29udGV4dCwgJm4sICZubGVuKSA8IDApCisJaWYgKGNvbnRleHRfc3RydWN0X3RvX3N0cmluZyhuY29udGV4dCwgJm4sICZubGVuKSkKIAkJZ290byBvdXQ7Ci0JaWYgKGNvbnRleHRfc3RydWN0X3RvX3N0cmluZyh0Y29udGV4dCwgJnQsICZ0bGVuKSA8IDApCisJaWYgKGNvbnRleHRfc3RydWN0X3RvX3N0cmluZyh0Y29udGV4dCwgJnQsICZ0bGVuKSkKIAkJZ290byBvdXQ7CiAJYXVkaXRfbG9nKGN1cnJlbnQtPmF1ZGl0X2NvbnRleHQsIEdGUF9BVE9NSUMsIEFVRElUX1NFTElOVVhfRVJSLAogCQkgICJzZWN1cml0eV92YWxpZGF0ZV90cmFuc2l0aW9uOiAgZGVuaWVkIGZvciIKIAkJICAiIG9sZGNvbnRleHQ9JXMgbmV3Y29udGV4dD0lcyB0YXNrY29udGV4dD0lcyB0Y2xhc3M9JXMiLAotCQkgIG8sIG4sIHQsIHBvbGljeWRiLnBfY2xhc3NfdmFsX3RvX25hbWVbdGNsYXNzLTFdKTsKKwkJICBvLCBuLCB0LCBzeW1fbmFtZSgmcG9saWN5ZGIsIFNZTV9DTEFTU0VTLCB0Y2xhc3MtMSkpOwogb3V0OgogCWtmcmVlKG8pOwogCWtmcmVlKG4pOwpAQCAtODAxLDEwICs4MDcsMTEgQEAKIAlzdHJ1Y3QgY29udGV4dCAqb2xkX2NvbnRleHQsICpuZXdfY29udGV4dDsKIAlzdHJ1Y3QgdHlwZV9kYXR1bSAqdHlwZTsKIAlpbnQgaW5kZXg7Ci0JaW50IHJjID0gLUVJTlZBTDsKKwlpbnQgcmM7CiAKIAlyZWFkX2xvY2soJnBvbGljeV9yd2xvY2spOwogCisJcmMgPSAtRUlOVkFMOwogCW9sZF9jb250ZXh0ID0gc2lkdGFiX3NlYXJjaCgmc2lkdGFiLCBvbGRfc2lkKTsKIAlpZiAoIW9sZF9jb250ZXh0KSB7CiAJCXByaW50ayhLRVJOX0VSUiAiU0VMaW51eDogJXM6IHVucmVjb2duaXplZCBTSUQgJXVcbiIsCkBAIC04MTIsNiArODE5LDcgQEAKIAkJZ290byBvdXQ7CiAJfQogCisJcmMgPSAtRUlOVkFMOwogCW5ld19jb250ZXh0ID0gc2lkdGFiX3NlYXJjaCgmc2lkdGFiLCBuZXdfc2lkKTsKIAlpZiAoIW5ld19jb250ZXh0KSB7CiAJCXByaW50ayhLRVJOX0VSUiAiU0VMaW51eDogJXM6IHVucmVjb2duaXplZCBTSUQgJXVcbiIsCkBAIC04MTksMjggKzgyNywyNyBAQAogCQlnb3RvIG91dDsKIAl9CiAKKwlyYyA9IDA7CiAJLyogdHlwZS9kb21haW4gdW5jaGFuZ2VkICovCi0JaWYgKG9sZF9jb250ZXh0LT50eXBlID09IG5ld19jb250ZXh0LT50eXBlKSB7Ci0JCXJjID0gMDsKKwlpZiAob2xkX2NvbnRleHQtPnR5cGUgPT0gbmV3X2NvbnRleHQtPnR5cGUpCiAJCWdvdG8gb3V0OwotCX0KIAogCWluZGV4ID0gbmV3X2NvbnRleHQtPnR5cGU7CiAJd2hpbGUgKHRydWUpIHsKLQkJdHlwZSA9IHBvbGljeWRiLnR5cGVfdmFsX3RvX3N0cnVjdFtpbmRleCAtIDFdOworCQl0eXBlID0gZmxleF9hcnJheV9nZXRfcHRyKHBvbGljeWRiLnR5cGVfdmFsX3RvX3N0cnVjdF9hcnJheSwKKwkJCQkJICBpbmRleCAtIDEpOwogCQlCVUdfT04oIXR5cGUpOwogCiAJCS8qIG5vdCBib3VuZGVkIGFueW1vcmUgKi8KLQkJaWYgKCF0eXBlLT5ib3VuZHMpIHsKLQkJCXJjID0gLUVQRVJNOworCQlyYyA9IC1FUEVSTTsKKwkJaWYgKCF0eXBlLT5ib3VuZHMpCiAJCQlicmVhazsKLQkJfQogCiAJCS8qIEBuZXdzaWQgaXMgYm91bmRlZCBieSBAb2xkc2lkICovCi0JCWlmICh0eXBlLT5ib3VuZHMgPT0gb2xkX2NvbnRleHQtPnR5cGUpIHsKLQkJCXJjID0gMDsKKwkJcmMgPSAwOworCQlpZiAodHlwZS0+Ym91bmRzID09IG9sZF9jb250ZXh0LT50eXBlKQogCQkJYnJlYWs7Ci0JCX0KKwogCQlpbmRleCA9IHR5cGUtPmJvdW5kczsKIAl9CiAKQEAgLTEwMDUsOSArMTAxMiw5IEBACiAJfQogCiAJLyogQ29tcHV0ZSB0aGUgc2l6ZSBvZiB0aGUgY29udGV4dC4gKi8KLQkqc2NvbnRleHRfbGVuICs9IHN0cmxlbihwb2xpY3lkYi5wX3VzZXJfdmFsX3RvX25hbWVbY29udGV4dC0+dXNlciAtIDFdKSArIDE7Ci0JKnNjb250ZXh0X2xlbiArPSBzdHJsZW4ocG9saWN5ZGIucF9yb2xlX3ZhbF90b19uYW1lW2NvbnRleHQtPnJvbGUgLSAxXSkgKyAxOwotCSpzY29udGV4dF9sZW4gKz0gc3RybGVuKHBvbGljeWRiLnBfdHlwZV92YWxfdG9fbmFtZVtjb250ZXh0LT50eXBlIC0gMV0pICsgMTsKKwkqc2NvbnRleHRfbGVuICs9IHN0cmxlbihzeW1fbmFtZSgmcG9saWN5ZGIsIFNZTV9VU0VSUywgY29udGV4dC0+dXNlciAtIDEpKSArIDE7CisJKnNjb250ZXh0X2xlbiArPSBzdHJsZW4oc3ltX25hbWUoJnBvbGljeWRiLCBTWU1fUk9MRVMsIGNvbnRleHQtPnJvbGUgLSAxKSkgKyAxOworCSpzY29udGV4dF9sZW4gKz0gc3RybGVuKHN5bV9uYW1lKCZwb2xpY3lkYiwgU1lNX1RZUEVTLCBjb250ZXh0LT50eXBlIC0gMSkpICsgMTsKIAkqc2NvbnRleHRfbGVuICs9IG1sc19jb21wdXRlX2NvbnRleHRfbGVuKGNvbnRleHQpOwogCiAJaWYgKCFzY29udGV4dCkKQEAgLTEwMjMsMTIgKzEwMzAsMTIgQEAKIAkgKiBDb3B5IHRoZSB1c2VyIG5hbWUsIHJvbGUgbmFtZSBhbmQgdHlwZSBuYW1lIGludG8gdGhlIGNvbnRleHQuCiAJICovCiAJc3ByaW50ZihzY29udGV4dHAsICIlczolczolcyIsCi0JCXBvbGljeWRiLnBfdXNlcl92YWxfdG9fbmFtZVtjb250ZXh0LT51c2VyIC0gMV0sCi0JCXBvbGljeWRiLnBfcm9sZV92YWxfdG9fbmFtZVtjb250ZXh0LT5yb2xlIC0gMV0sCi0JCXBvbGljeWRiLnBfdHlwZV92YWxfdG9fbmFtZVtjb250ZXh0LT50eXBlIC0gMV0pOwotCXNjb250ZXh0cCArPSBzdHJsZW4ocG9saWN5ZGIucF91c2VyX3ZhbF90b19uYW1lW2NvbnRleHQtPnVzZXIgLSAxXSkgKwotCQkgICAgIDEgKyBzdHJsZW4ocG9saWN5ZGIucF9yb2xlX3ZhbF90b19uYW1lW2NvbnRleHQtPnJvbGUgLSAxXSkgKwotCQkgICAgIDEgKyBzdHJsZW4ocG9saWN5ZGIucF90eXBlX3ZhbF90b19uYW1lW2NvbnRleHQtPnR5cGUgLSAxXSk7CisJCXN5bV9uYW1lKCZwb2xpY3lkYiwgU1lNX1VTRVJTLCBjb250ZXh0LT51c2VyIC0gMSksCisJCXN5bV9uYW1lKCZwb2xpY3lkYiwgU1lNX1JPTEVTLCBjb250ZXh0LT5yb2xlIC0gMSksCisJCXN5bV9uYW1lKCZwb2xpY3lkYiwgU1lNX1RZUEVTLCBjb250ZXh0LT50eXBlIC0gMSkpOworCXNjb250ZXh0cCArPSBzdHJsZW4oc3ltX25hbWUoJnBvbGljeWRiLCBTWU1fVVNFUlMsIGNvbnRleHQtPnVzZXIgLSAxKSkgKworCQkgICAgIDEgKyBzdHJsZW4oc3ltX25hbWUoJnBvbGljeWRiLCBTWU1fUk9MRVMsIGNvbnRleHQtPnJvbGUgLSAxKSkgKworCQkgICAgIDEgKyBzdHJsZW4oc3ltX25hbWUoJnBvbGljeWRiLCBTWU1fVFlQRVMsIGNvbnRleHQtPnR5cGUgLSAxKSk7CiAKIAltbHNfc2lkX3RvX2NvbnRleHQoY29udGV4dCwgJnNjb250ZXh0cCk7CiAKQEAgLTExODcsMTYgKzExOTQsMTMgQEAKIAlpZiAocmMpCiAJCWdvdG8gb3V0OwogCi0JaWYgKChwIC0gc2NvbnRleHQpIDwgc2NvbnRleHRfbGVuKSB7Ci0JCXJjID0gLUVJTlZBTDsKKwlyYyA9IC1FSU5WQUw7CisJaWYgKChwIC0gc2NvbnRleHQpIDwgc2NvbnRleHRfbGVuKQogCQlnb3RvIG91dDsKLQl9CiAKIAkvKiBDaGVjayB0aGUgdmFsaWRpdHkgb2YgdGhlIG5ldyBjb250ZXh0LiAqLwotCWlmICghcG9saWN5ZGJfY29udGV4dF9pc3ZhbGlkKHBvbCwgY3R4KSkgewotCQlyYyA9IC1FSU5WQUw7CisJaWYgKCFwb2xpY3lkYl9jb250ZXh0X2lzdmFsaWQocG9sLCBjdHgpKQogCQlnb3RvIG91dDsKLQl9CiAJcmMgPSAwOwogb3V0OgogCWlmIChyYykKQEAgLTEyMzUsMjcgKzEyMzksMjYgQEAKIAogCWlmIChmb3JjZSkgewogCQkvKiBTYXZlIGFub3RoZXIgY29weSBmb3Igc3RvcmluZyBpbiB1bmludGVycHJldGVkIGZvcm0gKi8KKwkJcmMgPSAtRU5PTUVNOwogCQlzdHIgPSBrc3RyZHVwKHNjb250ZXh0MiwgZ2ZwX2ZsYWdzKTsKLQkJaWYgKCFzdHIpIHsKLQkJCWtmcmVlKHNjb250ZXh0Mik7Ci0JCQlyZXR1cm4gLUVOT01FTTsKLQkJfQorCQlpZiAoIXN0cikKKwkJCWdvdG8gb3V0OwogCX0KIAogCXJlYWRfbG9jaygmcG9saWN5X3J3bG9jayk7Ci0JcmMgPSBzdHJpbmdfdG9fY29udGV4dF9zdHJ1Y3QoJnBvbGljeWRiLCAmc2lkdGFiLAotCQkJCSAgICAgIHNjb250ZXh0Miwgc2NvbnRleHRfbGVuLAotCQkJCSAgICAgICZjb250ZXh0LCBkZWZfc2lkKTsKKwlyYyA9IHN0cmluZ190b19jb250ZXh0X3N0cnVjdCgmcG9saWN5ZGIsICZzaWR0YWIsIHNjb250ZXh0MiwKKwkJCQkgICAgICBzY29udGV4dF9sZW4sICZjb250ZXh0LCBkZWZfc2lkKTsKIAlpZiAocmMgPT0gLUVJTlZBTCAmJiBmb3JjZSkgewogCQljb250ZXh0LnN0ciA9IHN0cjsKIAkJY29udGV4dC5sZW4gPSBzY29udGV4dF9sZW47CiAJCXN0ciA9IE5VTEw7CiAJfSBlbHNlIGlmIChyYykKLQkJZ290byBvdXQ7CisJCWdvdG8gb3V0X3VubG9jazsKIAlyYyA9IHNpZHRhYl9jb250ZXh0X3RvX3NpZCgmc2lkdGFiLCAmY29udGV4dCwgc2lkKTsKIAljb250ZXh0X2Rlc3Ryb3koJmNvbnRleHQpOwotb3V0Ogorb3V0X3VubG9jazoKIAlyZWFkX3VubG9jaygmcG9saWN5X3J3bG9jayk7CitvdXQ6CiAJa2ZyZWUoc2NvbnRleHQyKTsKIAlrZnJlZShzdHIpOwogCXJldHVybiByYzsKQEAgLTEzMTksMTggKzEzMjIsMTggQEAKIAljaGFyICpzID0gTlVMTCwgKnQgPSBOVUxMLCAqbiA9IE5VTEw7CiAJdTMyIHNsZW4sIHRsZW4sIG5sZW47CiAKLQlpZiAoY29udGV4dF9zdHJ1Y3RfdG9fc3RyaW5nKHNjb250ZXh0LCAmcywgJnNsZW4pIDwgMCkKKwlpZiAoY29udGV4dF9zdHJ1Y3RfdG9fc3RyaW5nKHNjb250ZXh0LCAmcywgJnNsZW4pKQogCQlnb3RvIG91dDsKLQlpZiAoY29udGV4dF9zdHJ1Y3RfdG9fc3RyaW5nKHRjb250ZXh0LCAmdCwgJnRsZW4pIDwgMCkKKwlpZiAoY29udGV4dF9zdHJ1Y3RfdG9fc3RyaW5nKHRjb250ZXh0LCAmdCwgJnRsZW4pKQogCQlnb3RvIG91dDsKLQlpZiAoY29udGV4dF9zdHJ1Y3RfdG9fc3RyaW5nKG5ld2NvbnRleHQsICZuLCAmbmxlbikgPCAwKQorCWlmIChjb250ZXh0X3N0cnVjdF90b19zdHJpbmcobmV3Y29udGV4dCwgJm4sICZubGVuKSkKIAkJZ290byBvdXQ7CiAJYXVkaXRfbG9nKGN1cnJlbnQtPmF1ZGl0X2NvbnRleHQsIEdGUF9BVE9NSUMsIEFVRElUX1NFTElOVVhfRVJSLAogCQkgICJzZWN1cml0eV9jb21wdXRlX3NpZDogIGludmFsaWQgY29udGV4dCAlcyIKIAkJICAiIGZvciBzY29udGV4dD0lcyIKIAkJICAiIHRjb250ZXh0PSVzIgogCQkgICIgdGNsYXNzPSVzIiwKLQkJICBuLCBzLCB0LCBwb2xpY3lkYi5wX2NsYXNzX3ZhbF90b19uYW1lW3RjbGFzcy0xXSk7CisJCSAgbiwgcywgdCwgc3ltX25hbWUoJnBvbGljeWRiLCBTWU1fQ0xBU1NFUywgdGNsYXNzLTEpKTsKIG91dDoKIAlrZnJlZShzKTsKIAlrZnJlZSh0KTsKQEAgLTE1NjksMjIgKzE1NzIsMTcgQEAKIAogc3RhdGljIGlubGluZSBpbnQgY29udmVydF9jb250ZXh0X2hhbmRsZV9pbnZhbGlkX2NvbnRleHQoc3RydWN0IGNvbnRleHQgKmNvbnRleHQpCiB7Ci0JaW50IHJjID0gMDsKKwljaGFyICpzOworCXUzMiBsZW47CiAKLQlpZiAoc2VsaW51eF9lbmZvcmNpbmcpIHsKLQkJcmMgPSAtRUlOVkFMOwotCX0gZWxzZSB7Ci0JCWNoYXIgKnM7Ci0JCXUzMiBsZW47CisJaWYgKHNlbGludXhfZW5mb3JjaW5nKQorCQlyZXR1cm4gLUVJTlZBTDsKIAotCQlpZiAoIWNvbnRleHRfc3RydWN0X3RvX3N0cmluZyhjb250ZXh0LCAmcywgJmxlbikpIHsKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcKLQkJICAgICAgICJTRUxpbnV4OiAgQ29udGV4dCAlcyB3b3VsZCBiZSBpbnZhbGlkIGlmIGVuZm9yY2luZ1xuIiwKLQkJCSAgICAgICBzKTsKLQkJCWtmcmVlKHMpOwotCQl9CisJaWYgKCFjb250ZXh0X3N0cnVjdF90b19zdHJpbmcoY29udGV4dCwgJnMsICZsZW4pKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIlNFTGludXg6ICBDb250ZXh0ICVzIHdvdWxkIGJlIGludmFsaWQgaWYgZW5mb3JjaW5nXG4iLCBzKTsKKwkJa2ZyZWUocyk7CiAJfQotCXJldHVybiByYzsKKwlyZXR1cm4gMDsKIH0KIAogc3RydWN0IGNvbnZlcnRfY29udGV4dF9hcmdzIHsKQEAgLTE2MjEsMTcgKzE2MTksMTcgQEAKIAogCWlmIChjLT5zdHIpIHsKIAkJc3RydWN0IGNvbnRleHQgY3R4OworCisJCXJjID0gLUVOT01FTTsKIAkJcyA9IGtzdHJkdXAoYy0+c3RyLCBHRlBfS0VSTkVMKTsKLQkJaWYgKCFzKSB7Ci0JCQlyYyA9IC1FTk9NRU07CisJCWlmICghcykKIAkJCWdvdG8gb3V0OwotCQl9CisKIAkJcmMgPSBzdHJpbmdfdG9fY29udGV4dF9zdHJ1Y3QoYXJncy0+bmV3cCwgTlVMTCwgcywKIAkJCQkJICAgICAgYy0+bGVuLCAmY3R4LCBTRUNTSURfTlVMTCk7CiAJCWtmcmVlKHMpOwogCQlpZiAoIXJjKSB7Ci0JCQlwcmludGsoS0VSTl9JTkZPCi0JCSAgICAgICAiU0VMaW51eDogIENvbnRleHQgJXMgYmVjYW1lIHZhbGlkIChtYXBwZWQpLlxuIiwKKwkJCXByaW50ayhLRVJOX0lORk8gIlNFTGludXg6ICBDb250ZXh0ICVzIGJlY2FtZSB2YWxpZCAobWFwcGVkKS5cbiIsCiAJCQkgICAgICAgYy0+c3RyKTsKIAkJCS8qIFJlcGxhY2Ugc3RyaW5nIHdpdGggbWFwcGVkIHJlcHJlc2VudGF0aW9uLiAqLwogCQkJa2ZyZWUoYy0+c3RyKTsKQEAgLTE2NDMsOCArMTY0MSw3IEBACiAJCQlnb3RvIG91dDsKIAkJfSBlbHNlIHsKIAkJCS8qIE90aGVyIGVycm9yIGNvbmRpdGlvbiwgZS5nLiBFTk9NRU0uICovCi0JCQlwcmludGsoS0VSTl9FUlIKLQkJICAgICAgICJTRUxpbnV4OiAgIFVuYWJsZSB0byBtYXAgY29udGV4dCAlcywgcmMgPSAlZC5cbiIsCisJCQlwcmludGsoS0VSTl9FUlIgIlNFTGludXg6ICAgVW5hYmxlIHRvIG1hcCBjb250ZXh0ICVzLCByYyA9ICVkLlxuIiwKIAkJCSAgICAgICBjLT5zdHIsIC1yYyk7CiAJCQlnb3RvIG91dDsKIAkJfQpAQCAtMTY1NCwyNSArMTY1MSwyNiBAQAogCWlmIChyYykKIAkJZ290byBvdXQ7CiAKLQlyYyA9IC1FSU5WQUw7Ci0KIAkvKiBDb252ZXJ0IHRoZSB1c2VyLiAqLworCXJjID0gLUVJTlZBTDsKIAl1c3JkYXR1bSA9IGhhc2h0YWJfc2VhcmNoKGFyZ3MtPm5ld3AtPnBfdXNlcnMudGFibGUsCi0JCQkJICBhcmdzLT5vbGRwLT5wX3VzZXJfdmFsX3RvX25hbWVbYy0+dXNlciAtIDFdKTsKKwkJCQkgIHN5bV9uYW1lKGFyZ3MtPm9sZHAsIFNZTV9VU0VSUywgYy0+dXNlciAtIDEpKTsKIAlpZiAoIXVzcmRhdHVtKQogCQlnb3RvIGJhZDsKIAljLT51c2VyID0gdXNyZGF0dW0tPnZhbHVlOwogCiAJLyogQ29udmVydCB0aGUgcm9sZS4gKi8KKwlyYyA9IC1FSU5WQUw7CiAJcm9sZSA9IGhhc2h0YWJfc2VhcmNoKGFyZ3MtPm5ld3AtPnBfcm9sZXMudGFibGUsCi0JCQkgICAgICBhcmdzLT5vbGRwLT5wX3JvbGVfdmFsX3RvX25hbWVbYy0+cm9sZSAtIDFdKTsKKwkJCSAgICAgIHN5bV9uYW1lKGFyZ3MtPm9sZHAsIFNZTV9ST0xFUywgYy0+cm9sZSAtIDEpKTsKIAlpZiAoIXJvbGUpCiAJCWdvdG8gYmFkOwogCWMtPnJvbGUgPSByb2xlLT52YWx1ZTsKIAogCS8qIENvbnZlcnQgdGhlIHR5cGUuICovCisJcmMgPSAtRUlOVkFMOwogCXR5cGRhdHVtID0gaGFzaHRhYl9zZWFyY2goYXJncy0+bmV3cC0+cF90eXBlcy50YWJsZSwKLQkJCQkgIGFyZ3MtPm9sZHAtPnBfdHlwZV92YWxfdG9fbmFtZVtjLT50eXBlIC0gMV0pOworCQkJCSAgc3ltX25hbWUoYXJncy0+b2xkcCwgU1lNX1RZUEVTLCBjLT50eXBlIC0gMSkpOwogCWlmICghdHlwZGF0dW0pCiAJCWdvdG8gYmFkOwogCWMtPnR5cGUgPSB0eXBkYXR1bS0+dmFsdWU7CkBAIC0xNzAwLDYgKzE2OTgsNyBAQAogCQlvYyA9IGFyZ3MtPm5ld3AtPm9jb250ZXh0c1tPQ09OX0lTSURdOwogCQl3aGlsZSAob2MgJiYgb2MtPnNpZFswXSAhPSBTRUNJTklUU0lEX1VOTEFCRUxFRCkKIAkJCW9jID0gb2MtPm5leHQ7CisJCXJjID0gLUVJTlZBTDsKIAkJaWYgKCFvYykgewogCQkJcHJpbnRrKEtFUk5fRVJSICJTRUxpbnV4OiAgdW5hYmxlIHRvIGxvb2sgdXAiCiAJCQkJIiB0aGUgaW5pdGlhbCBTSURzIGxpc3RcbiIpOwpAQCAtMTcxOSwxOSArMTcxOCwyMCBAQAogCX0KIAogCWNvbnRleHRfZGVzdHJveSgmb2xkYyk7CisKIAlyYyA9IDA7CiBvdXQ6CiAJcmV0dXJuIHJjOwogYmFkOgogCS8qIE1hcCBvbGQgcmVwcmVzZW50YXRpb24gdG8gc3RyaW5nIGFuZCBzYXZlIGl0LiAqLwotCWlmIChjb250ZXh0X3N0cnVjdF90b19zdHJpbmcoJm9sZGMsICZzLCAmbGVuKSkKLQkJcmV0dXJuIC1FTk9NRU07CisJcmMgPSBjb250ZXh0X3N0cnVjdF90b19zdHJpbmcoJm9sZGMsICZzLCAmbGVuKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKIAljb250ZXh0X2Rlc3Ryb3koJm9sZGMpOwogCWNvbnRleHRfZGVzdHJveShjKTsKIAljLT5zdHIgPSBzOwogCWMtPmxlbiA9IGxlbjsKLQlwcmludGsoS0VSTl9JTkZPCi0JICAgICAgICJTRUxpbnV4OiAgQ29udGV4dCAlcyBiZWNhbWUgaW52YWxpZCAodW5tYXBwZWQpLlxuIiwKKwlwcmludGsoS0VSTl9JTkZPICJTRUxpbnV4OiAgQ29udGV4dCAlcyBiZWNhbWUgaW52YWxpZCAodW5tYXBwZWQpLlxuIiwKIAkgICAgICAgYy0+c3RyKTsKIAlyYyA9IDA7CiAJZ290byBvdXQ7CkBAIC0yMDEyLDcgKzIwMTIsNyBAQAogCQkgICAgICB1MzIgYWRkcmxlbiwKIAkJICAgICAgdTMyICpvdXRfc2lkKQogewotCWludCByYyA9IDA7CisJaW50IHJjOwogCXN0cnVjdCBvY29udGV4dCAqYzsKIAogCXJlYWRfbG9jaygmcG9saWN5X3J3bG9jayk7CkBAIC0yMDIxLDEwICsyMDIxLDkgQEAKIAljYXNlIEFGX0lORVQ6IHsKIAkJdTMyIGFkZHI7CiAKLQkJaWYgKGFkZHJsZW4gIT0gc2l6ZW9mKHUzMikpIHsKLQkJCXJjID0gLUVJTlZBTDsKKwkJcmMgPSAtRUlOVkFMOworCQlpZiAoYWRkcmxlbiAhPSBzaXplb2YodTMyKSkKIAkJCWdvdG8gb3V0OwotCQl9CiAKIAkJYWRkciA9ICooKHUzMiAqKWFkZHJwKTsKIApAQCAtMjAzOCwxMCArMjAzNyw5IEBACiAJfQogCiAJY2FzZSBBRl9JTkVUNjoKLQkJaWYgKGFkZHJsZW4gIT0gc2l6ZW9mKHU2NCkgKiAyKSB7Ci0JCQlyYyA9IC1FSU5WQUw7CisJCXJjID0gLUVJTlZBTDsKKwkJaWYgKGFkZHJsZW4gIT0gc2l6ZW9mKHU2NCkgKiAyKQogCQkJZ290byBvdXQ7Ci0JCX0KIAkJYyA9IHBvbGljeWRiLm9jb250ZXh0c1tPQ09OX05PREU2XTsKIAkJd2hpbGUgKGMpIHsKIAkJCWlmIChtYXRjaF9pcHY2X2FkZHJtYXNrKGFkZHJwLCBjLT51Lm5vZGU2LmFkZHIsCkBAIC0yMDUyLDYgKzIwNTAsNyBAQAogCQlicmVhazsKIAogCWRlZmF1bHQ6CisJCXJjID0gMDsKIAkJKm91dF9zaWQgPSBTRUNJTklUU0lEX05PREU7CiAJCWdvdG8gb3V0OwogCX0KQEAgLTIwNjksNiArMjA2OCw3IEBACiAJCSpvdXRfc2lkID0gU0VDSU5JVFNJRF9OT0RFOwogCX0KIAorCXJjID0gMDsKIG91dDoKIAlyZWFkX3VubG9jaygmcG9saWN5X3J3bG9jayk7CiAJcmV0dXJuIHJjOwpAQCAtMjExMywyNCArMjExMywyMiBAQAogCiAJY29udGV4dF9pbml0KCZ1c2VyY29uKTsKIAorCXJjID0gLUVJTlZBTDsKIAlmcm9tY29uID0gc2lkdGFiX3NlYXJjaCgmc2lkdGFiLCBmcm9tc2lkKTsKLQlpZiAoIWZyb21jb24pIHsKLQkJcmMgPSAtRUlOVkFMOworCWlmICghZnJvbWNvbikKIAkJZ290byBvdXRfdW5sb2NrOwotCX0KIAorCXJjID0gLUVJTlZBTDsKIAl1c2VyID0gaGFzaHRhYl9zZWFyY2gocG9saWN5ZGIucF91c2Vycy50YWJsZSwgdXNlcm5hbWUpOwotCWlmICghdXNlcikgewotCQlyYyA9IC1FSU5WQUw7CisJaWYgKCF1c2VyKQogCQlnb3RvIG91dF91bmxvY2s7Ci0JfQorCiAJdXNlcmNvbi51c2VyID0gdXNlci0+dmFsdWU7CiAKKwlyYyA9IC1FTk9NRU07CiAJbXlzaWRzID0ga2NhbGxvYyhtYXhuZWwsIHNpemVvZigqbXlzaWRzKSwgR0ZQX0FUT01JQyk7Ci0JaWYgKCFteXNpZHMpIHsKLQkJcmMgPSAtRU5PTUVNOworCWlmICghbXlzaWRzKQogCQlnb3RvIG91dF91bmxvY2s7Ci0JfQogCiAJZWJpdG1hcF9mb3JfZWFjaF9wb3NpdGl2ZV9iaXQoJnVzZXItPnJvbGVzLCBybm9kZSwgaSkgewogCQlyb2xlID0gcG9saWN5ZGIucm9sZV92YWxfdG9fc3RydWN0W2ldOwpAQCAtMjE0NywxMiArMjE0NSwxMSBAQAogCQkJaWYgKG15bmVsIDwgbWF4bmVsKSB7CiAJCQkJbXlzaWRzW215bmVsKytdID0gc2lkOwogCQkJfSBlbHNlIHsKKwkJCQlyYyA9IC1FTk9NRU07CiAJCQkJbWF4bmVsICs9IFNJRFNfTkVMOwogCQkJCW15c2lkczIgPSBrY2FsbG9jKG1heG5lbCwgc2l6ZW9mKCpteXNpZHMyKSwgR0ZQX0FUT01JQyk7Ci0JCQkJaWYgKCFteXNpZHMyKSB7Ci0JCQkJCXJjID0gLUVOT01FTTsKKwkJCQlpZiAoIW15c2lkczIpCiAJCQkJCWdvdG8gb3V0X3VubG9jazsKLQkJCQl9CiAJCQkJbWVtY3B5KG15c2lkczIsIG15c2lkcywgbXluZWwgKiBzaXplb2YoKm15c2lkczIpKTsKIAkJCQlrZnJlZShteXNpZHMpOwogCQkJCW15c2lkcyA9IG15c2lkczI7CkBAIC0yMTYwLDcgKzIxNTcsNyBAQAogCQkJfQogCQl9CiAJfQotCisJcmMgPSAwOwogb3V0X3VubG9jazoKIAlyZWFkX3VubG9jaygmcG9saWN5X3J3bG9jayk7CiAJaWYgKHJjIHx8ICFteW5lbCkgewpAQCAtMjE2OCw5ICsyMTY1LDkgQEAKIAkJZ290byBvdXQ7CiAJfQogCisJcmMgPSAtRU5PTUVNOwogCW15c2lkczIgPSBrY2FsbG9jKG15bmVsLCBzaXplb2YoKm15c2lkczIpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIW15c2lkczIpIHsKLQkJcmMgPSAtRU5PTUVNOwogCQlrZnJlZShteXNpZHMpOwogCQlnb3RvIG91dDsKIAl9CkBAIC0yMjExLDcgKzIyMDgsNyBAQAogCXUxNiBzY2xhc3M7CiAJc3RydWN0IGdlbmZzICpnZW5mczsKIAlzdHJ1Y3Qgb2NvbnRleHQgKmM7Ci0JaW50IHJjID0gMCwgY21wID0gMDsKKwlpbnQgcmMsIGNtcCA9IDA7CiAKIAl3aGlsZSAocGF0aFswXSA9PSAnLycgJiYgcGF0aFsxXSA9PSAnLycpCiAJCXBhdGgrKzsKQEAgLTIyMTksNiArMjIxNiw3IEBACiAJcmVhZF9sb2NrKCZwb2xpY3lfcndsb2NrKTsKIAogCXNjbGFzcyA9IHVubWFwX2NsYXNzKG9yaWdfc2NsYXNzKTsKKwkqc2lkID0gU0VDSU5JVFNJRF9VTkxBQkVMRUQ7CiAKIAlmb3IgKGdlbmZzID0gcG9saWN5ZGIuZ2VuZnM7IGdlbmZzOyBnZW5mcyA9IGdlbmZzLT5uZXh0KSB7CiAJCWNtcCA9IHN0cmNtcChmc3R5cGUsIGdlbmZzLT5mc3R5cGUpOwpAQCAtMjIyNiwxMSArMjIyNCw5IEBACiAJCQlicmVhazsKIAl9CiAKLQlpZiAoIWdlbmZzIHx8IGNtcCkgewotCQkqc2lkID0gU0VDSU5JVFNJRF9VTkxBQkVMRUQ7Ci0JCXJjID0gLUVOT0VOVDsKKwlyYyA9IC1FTk9FTlQ7CisJaWYgKCFnZW5mcyB8fCBjbXApCiAJCWdvdG8gb3V0OwotCX0KIAogCWZvciAoYyA9IGdlbmZzLT5oZWFkOyBjOyBjID0gYy0+bmV4dCkgewogCQlsZW4gPSBzdHJsZW4oYy0+dS5uYW1lKTsKQEAgLTIyMzksMjEgKzIyMzUsMTggQEAKIAkJCWJyZWFrOwogCX0KIAotCWlmICghYykgewotCQkqc2lkID0gU0VDSU5JVFNJRF9VTkxBQkVMRUQ7Ci0JCXJjID0gLUVOT0VOVDsKKwlyYyA9IC1FTk9FTlQ7CisJaWYgKCFjKQogCQlnb3RvIG91dDsKLQl9CiAKIAlpZiAoIWMtPnNpZFswXSkgewotCQlyYyA9IHNpZHRhYl9jb250ZXh0X3RvX3NpZCgmc2lkdGFiLAotCQkJCQkgICAmYy0+Y29udGV4dFswXSwKLQkJCQkJICAgJmMtPnNpZFswXSk7CisJCXJjID0gc2lkdGFiX2NvbnRleHRfdG9fc2lkKCZzaWR0YWIsICZjLT5jb250ZXh0WzBdLCAmYy0+c2lkWzBdKTsKIAkJaWYgKHJjKQogCQkJZ290byBvdXQ7CiAJfQogCiAJKnNpZCA9IGMtPnNpZFswXTsKKwlyYyA9IDA7CiBvdXQ6CiAJcmVhZF91bmxvY2soJnBvbGljeV9yd2xvY2spOwogCXJldHVybiByYzsKQEAgLTIyODUsOCArMjI3OCw3IEBACiAJaWYgKGMpIHsKIAkJKmJlaGF2aW9yID0gYy0+di5iZWhhdmlvcjsKIAkJaWYgKCFjLT5zaWRbMF0pIHsKLQkJCXJjID0gc2lkdGFiX2NvbnRleHRfdG9fc2lkKCZzaWR0YWIsCi0JCQkJCQkgICAmYy0+Y29udGV4dFswXSwKKwkJCXJjID0gc2lkdGFiX2NvbnRleHRfdG9fc2lkKCZzaWR0YWIsICZjLT5jb250ZXh0WzBdLAogCQkJCQkJICAgJmMtPnNpZFswXSk7CiAJCQlpZiAocmMpCiAJCQkJZ290byBvdXQ7CkBAIC0yMzA5LDM0ICsyMzAxLDM5IEBACiAKIGludCBzZWN1cml0eV9nZXRfYm9vbHMoaW50ICpsZW4sIGNoYXIgKioqbmFtZXMsIGludCAqKnZhbHVlcykKIHsKLQlpbnQgaSwgcmMgPSAtRU5PTUVNOworCWludCBpLCByYzsKIAogCXJlYWRfbG9jaygmcG9saWN5X3J3bG9jayk7CiAJKm5hbWVzID0gTlVMTDsKIAkqdmFsdWVzID0gTlVMTDsKIAorCXJjID0gMDsKIAkqbGVuID0gcG9saWN5ZGIucF9ib29scy5ucHJpbTsKLQlpZiAoISpsZW4pIHsKLQkJcmMgPSAwOworCWlmICghKmxlbikKIAkJZ290byBvdXQ7Ci0JfQogCi0gICAgICAgKm5hbWVzID0ga2NhbGxvYygqbGVuLCBzaXplb2YoY2hhciAqKSwgR0ZQX0FUT01JQyk7CisJcmMgPSAtRU5PTUVNOworCSpuYW1lcyA9IGtjYWxsb2MoKmxlbiwgc2l6ZW9mKGNoYXIgKiksIEdGUF9BVE9NSUMpOwogCWlmICghKm5hbWVzKQogCQlnb3RvIGVycjsKIAotICAgICAgICp2YWx1ZXMgPSBrY2FsbG9jKCpsZW4sIHNpemVvZihpbnQpLCBHRlBfQVRPTUlDKTsKKwlyYyA9IC1FTk9NRU07CisJKnZhbHVlcyA9IGtjYWxsb2MoKmxlbiwgc2l6ZW9mKGludCksIEdGUF9BVE9NSUMpOwogCWlmICghKnZhbHVlcykKIAkJZ290byBlcnI7CiAKIAlmb3IgKGkgPSAwOyBpIDwgKmxlbjsgaSsrKSB7CiAJCXNpemVfdCBuYW1lX2xlbjsKKwogCQkoKnZhbHVlcylbaV0gPSBwb2xpY3lkYi5ib29sX3ZhbF90b19zdHJ1Y3RbaV0tPnN0YXRlOwotCQluYW1lX2xlbiA9IHN0cmxlbihwb2xpY3lkYi5wX2Jvb2xfdmFsX3RvX25hbWVbaV0pICsgMTsKLQkgICAgICAgKCpuYW1lcylbaV0gPSBrbWFsbG9jKHNpemVvZihjaGFyKSAqIG5hbWVfbGVuLCBHRlBfQVRPTUlDKTsKKwkJbmFtZV9sZW4gPSBzdHJsZW4oc3ltX25hbWUoJnBvbGljeWRiLCBTWU1fQk9PTFMsIGkpKSArIDE7CisKKwkJcmMgPSAtRU5PTUVNOworCQkoKm5hbWVzKVtpXSA9IGttYWxsb2Moc2l6ZW9mKGNoYXIpICogbmFtZV9sZW4sIEdGUF9BVE9NSUMpOwogCQlpZiAoISgqbmFtZXMpW2ldKQogCQkJZ290byBlcnI7Ci0JCXN0cm5jcHkoKCpuYW1lcylbaV0sIHBvbGljeWRiLnBfYm9vbF92YWxfdG9fbmFtZVtpXSwgbmFtZV9sZW4pOworCisJCXN0cm5jcHkoKCpuYW1lcylbaV0sIHN5bV9uYW1lKCZwb2xpY3lkYiwgU1lNX0JPT0xTLCBpKSwgbmFtZV9sZW4pOwogCQkoKm5hbWVzKVtpXVtuYW1lX2xlbiAtIDFdID0gMDsKIAl9CiAJcmMgPSAwOwpAQCAtMjM1NSwyNCArMjM1MiwyMyBAQAogCiBpbnQgc2VjdXJpdHlfc2V0X2Jvb2xzKGludCBsZW4sIGludCAqdmFsdWVzKQogewotCWludCBpLCByYyA9IDA7CisJaW50IGksIHJjOwogCWludCBsZW5wLCBzZXFubyA9IDA7CiAJc3RydWN0IGNvbmRfbm9kZSAqY3VyOwogCiAJd3JpdGVfbG9ja19pcnEoJnBvbGljeV9yd2xvY2spOwogCisJcmMgPSAtRUZBVUxUOwogCWxlbnAgPSBwb2xpY3lkYi5wX2Jvb2xzLm5wcmltOwotCWlmIChsZW4gIT0gbGVucCkgewotCQlyYyA9IC1FRkFVTFQ7CisJaWYgKGxlbiAhPSBsZW5wKQogCQlnb3RvIG91dDsKLQl9CiAKIAlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKIAkJaWYgKCEhdmFsdWVzW2ldICE9IHBvbGljeWRiLmJvb2xfdmFsX3RvX3N0cnVjdFtpXS0+c3RhdGUpIHsKIAkJCWF1ZGl0X2xvZyhjdXJyZW50LT5hdWRpdF9jb250ZXh0LCBHRlBfQVRPTUlDLAogCQkJCUFVRElUX01BQ19DT05GSUdfQ0hBTkdFLAogCQkJCSJib29sPSVzIHZhbD0lZCBvbGRfdmFsPSVkIGF1aWQ9JXUgc2VzPSV1IiwKLQkJCQlwb2xpY3lkYi5wX2Jvb2xfdmFsX3RvX25hbWVbaV0sCisJCQkJc3ltX25hbWUoJnBvbGljeWRiLCBTWU1fQk9PTFMsIGkpLAogCQkJCSEhdmFsdWVzW2ldLAogCQkJCXBvbGljeWRiLmJvb2xfdmFsX3RvX3N0cnVjdFtpXS0+c3RhdGUsCiAJCQkJYXVkaXRfZ2V0X2xvZ2ludWlkKGN1cnJlbnQpLApAQCAtMjM5MSw3ICsyMzg3LDcgQEAKIAl9CiAKIAlzZXFubyA9ICsrbGF0ZXN0X2dyYW50aW5nOwotCisJcmMgPSAwOwogb3V0OgogCXdyaXRlX3VubG9ja19pcnEoJnBvbGljeV9yd2xvY2spOwogCWlmICghcmMpIHsKQEAgLTI0MDUsMTYgKzI0MDEsMTUgQEAKIAogaW50IHNlY3VyaXR5X2dldF9ib29sX3ZhbHVlKGludCBib29sKQogewotCWludCByYyA9IDA7CisJaW50IHJjOwogCWludCBsZW47CiAKIAlyZWFkX2xvY2soJnBvbGljeV9yd2xvY2spOwogCisJcmMgPSAtRUZBVUxUOwogCWxlbiA9IHBvbGljeWRiLnBfYm9vbHMubnByaW07Ci0JaWYgKGJvb2wgPj0gbGVuKSB7Ci0JCXJjID0gLUVGQVVMVDsKKwlpZiAoYm9vbCA+PSBsZW4pCiAJCWdvdG8gb3V0OwotCX0KIAogCXJjID0gcG9saWN5ZGIuYm9vbF92YWxfdG9fc3RydWN0W2Jvb2xdLT5zdGF0ZTsKIG91dDoKQEAgLTI0NjQsOCArMjQ1OSw5IEBACiAJc3RydWN0IGNvbnRleHQgbmV3Y29uOwogCWNoYXIgKnM7CiAJdTMyIGxlbjsKLQlpbnQgcmMgPSAwOworCWludCByYzsKIAorCXJjID0gMDsKIAlpZiAoIXNzX2luaXRpYWxpemVkIHx8ICFwb2xpY3lkYi5tbHNfZW5hYmxlZCkgewogCQkqbmV3X3NpZCA9IHNpZDsKIAkJZ290byBvdXQ7CkBAIC0yNDc0LDE5ICsyNDcwLDIwIEBACiAJY29udGV4dF9pbml0KCZuZXdjb24pOwogCiAJcmVhZF9sb2NrKCZwb2xpY3lfcndsb2NrKTsKKworCXJjID0gLUVJTlZBTDsKIAljb250ZXh0MSA9IHNpZHRhYl9zZWFyY2goJnNpZHRhYiwgc2lkKTsKIAlpZiAoIWNvbnRleHQxKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiU0VMaW51eDogJXM6ICB1bnJlY29nbml6ZWQgU0lEICVkXG4iLAogCQkJX19mdW5jX18sIHNpZCk7Ci0JCXJjID0gLUVJTlZBTDsKIAkJZ290byBvdXRfdW5sb2NrOwogCX0KIAorCXJjID0gLUVJTlZBTDsKIAljb250ZXh0MiA9IHNpZHRhYl9zZWFyY2goJnNpZHRhYiwgbWxzX3NpZCk7CiAJaWYgKCFjb250ZXh0MikgewogCQlwcmludGsoS0VSTl9FUlIgIlNFTGludXg6ICVzOiAgdW5yZWNvZ25pemVkIFNJRCAlZFxuIiwKIAkJCV9fZnVuY19fLCBtbHNfc2lkKTsKLQkJcmMgPSAtRUlOVkFMOwogCQlnb3RvIG91dF91bmxvY2s7CiAJfQogCkBAIC0yNTAwLDIwICsyNDk3LDE3IEBACiAJLyogQ2hlY2sgdGhlIHZhbGlkaXR5IG9mIHRoZSBuZXcgY29udGV4dC4gKi8KIAlpZiAoIXBvbGljeWRiX2NvbnRleHRfaXN2YWxpZCgmcG9saWN5ZGIsICZuZXdjb24pKSB7CiAJCXJjID0gY29udmVydF9jb250ZXh0X2hhbmRsZV9pbnZhbGlkX2NvbnRleHQoJm5ld2Nvbik7Ci0JCWlmIChyYykKLQkJCWdvdG8gYmFkOworCQlpZiAocmMpIHsKKwkJCWlmICghY29udGV4dF9zdHJ1Y3RfdG9fc3RyaW5nKCZuZXdjb24sICZzLCAmbGVuKSkgeworCQkJCWF1ZGl0X2xvZyhjdXJyZW50LT5hdWRpdF9jb250ZXh0LCBHRlBfQVRPTUlDLCBBVURJVF9TRUxJTlVYX0VSUiwKKwkJCQkJICAic2VjdXJpdHlfc2lkX21sc19jb3B5OiBpbnZhbGlkIGNvbnRleHQgJXMiLCBzKTsKKwkJCQlrZnJlZShzKTsKKwkJCX0KKwkJCWdvdG8gb3V0X3VubG9jazsKKwkJfQogCX0KIAogCXJjID0gc2lkdGFiX2NvbnRleHRfdG9fc2lkKCZzaWR0YWIsICZuZXdjb24sIG5ld19zaWQpOwotCWdvdG8gb3V0X3VubG9jazsKLQotYmFkOgotCWlmICghY29udGV4dF9zdHJ1Y3RfdG9fc3RyaW5nKCZuZXdjb24sICZzLCAmbGVuKSkgewotCQlhdWRpdF9sb2coY3VycmVudC0+YXVkaXRfY29udGV4dCwgR0ZQX0FUT01JQywgQVVESVRfU0VMSU5VWF9FUlIsCi0JCQkgICJzZWN1cml0eV9zaWRfbWxzX2NvcHk6IGludmFsaWQgY29udGV4dCAlcyIsIHMpOwotCQlrZnJlZShzKTsKLQl9Ci0KIG91dF91bmxvY2s6CiAJcmVhZF91bmxvY2soJnBvbGljeV9yd2xvY2spOwogCWNvbnRleHRfZGVzdHJveSgmbmV3Y29uKTsKQEAgLTI1NDksNiArMjU0Myw4IEBACiAJc3RydWN0IGNvbnRleHQgKm5sYmxfY3R4OwogCXN0cnVjdCBjb250ZXh0ICp4ZnJtX2N0eDsKIAorCSpwZWVyX3NpZCA9IFNFQ1NJRF9OVUxMOworCiAJLyogaGFuZGxlIHRoZSBjb21tb24gKHdoaWNoIGFsc28gaGFwcGVucyB0byBiZSB0aGUgc2V0IG9mIGVhc3kpIGNhc2VzCiAJICogcmlnaHQgYXdheSwgdGhlc2UgdHdvIGlmIHN0YXRlbWVudHMgY2F0Y2ggZXZlcnl0aGluZyBpbnZvbHZpbmcgYQogCSAqIHNpbmdsZSBvciBhYnNlbnQgcGVlciBTSUQvbGFiZWwgKi8KQEAgLTI1NjcsNDAgKzI1NjMsMzcgQEAKIAkvKiB3ZSBkb24ndCBuZWVkIHRvIGNoZWNrIHNzX2luaXRpYWxpemVkIGhlcmUgc2luY2UgdGhlIG9ubHkgd2F5IGJvdGgKIAkgKiBubGJsX3NpZCBhbmQgeGZybV9zaWQgYXJlIG5vdCBlcXVhbCB0byBTRUNTSURfTlVMTCB3b3VsZCBiZSBpZiB0aGUKIAkgKiBzZWN1cml0eSBzZXJ2ZXIgd2FzIGluaXRpYWxpemVkIGFuZCBzc19pbml0aWFsaXplZCB3YXMgdHJ1ZSAqLwotCWlmICghcG9saWN5ZGIubWxzX2VuYWJsZWQpIHsKLQkJKnBlZXJfc2lkID0gU0VDU0lEX05VTEw7CisJaWYgKCFwb2xpY3lkYi5tbHNfZW5hYmxlZCkKIAkJcmV0dXJuIDA7Ci0JfQogCiAJcmVhZF9sb2NrKCZwb2xpY3lfcndsb2NrKTsKIAorCXJjID0gLUVJTlZBTDsKIAlubGJsX2N0eCA9IHNpZHRhYl9zZWFyY2goJnNpZHRhYiwgbmxibF9zaWQpOwogCWlmICghbmxibF9jdHgpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJTRUxpbnV4OiAlczogIHVucmVjb2duaXplZCBTSUQgJWRcbiIsCiAJCSAgICAgICBfX2Z1bmNfXywgbmxibF9zaWQpOwotCQlyYyA9IC1FSU5WQUw7Ci0JCWdvdG8gb3V0X3Nsb3dwYXRoOworCQlnb3RvIG91dDsKIAl9CisJcmMgPSAtRUlOVkFMOwogCXhmcm1fY3R4ID0gc2lkdGFiX3NlYXJjaCgmc2lkdGFiLCB4ZnJtX3NpZCk7CiAJaWYgKCF4ZnJtX2N0eCkgewogCQlwcmludGsoS0VSTl9FUlIgIlNFTGludXg6ICVzOiAgdW5yZWNvZ25pemVkIFNJRCAlZFxuIiwKIAkJICAgICAgIF9fZnVuY19fLCB4ZnJtX3NpZCk7Ci0JCXJjID0gLUVJTlZBTDsKLQkJZ290byBvdXRfc2xvd3BhdGg7CisJCWdvdG8gb3V0OwogCX0KIAlyYyA9IChtbHNfY29udGV4dF9jbXAobmxibF9jdHgsIHhmcm1fY3R4KSA/IDAgOiAtRUFDQ0VTKTsKKwlpZiAocmMpCisJCWdvdG8gb3V0OwogCi1vdXRfc2xvd3BhdGg6CisJLyogYXQgcHJlc2VudCBOZXRMYWJlbCBTSURzL2xhYmVscyByZWFsbHkgb25seSBjYXJyeSBNTFMKKwkgKiBpbmZvcm1hdGlvbiBzbyBpZiB0aGUgTUxTIHBvcnRpb24gb2YgdGhlIE5ldExhYmVsIFNJRAorCSAqIG1hdGNoZXMgdGhlIE1MUyBwb3J0aW9uIG9mIHRoZSBsYWJlbGVkIFhGUk0gU0lEL2xhYmVsCisJICogdGhlbiBwYXNzIGFsb25nIHRoZSBYRlJNIFNJRCBhcyBpdCBpcyB0aGUgbW9zdAorCSAqIGV4cHJlc3NpdmUgKi8KKwkqcGVlcl9zaWQgPSB4ZnJtX3NpZDsKK291dDoKIAlyZWFkX3VubG9jaygmcG9saWN5X3J3bG9jayk7Ci0JaWYgKHJjID09IDApCi0JCS8qIGF0IHByZXNlbnQgTmV0TGFiZWwgU0lEcy9sYWJlbHMgcmVhbGx5IG9ubHkgY2FycnkgTUxTCi0JCSAqIGluZm9ybWF0aW9uIHNvIGlmIHRoZSBNTFMgcG9ydGlvbiBvZiB0aGUgTmV0TGFiZWwgU0lECi0JCSAqIG1hdGNoZXMgdGhlIE1MUyBwb3J0aW9uIG9mIHRoZSBsYWJlbGVkIFhGUk0gU0lEL2xhYmVsCi0JCSAqIHRoZW4gcGFzcyBhbG9uZyB0aGUgWEZSTSBTSUQgYXMgaXQgaXMgdGhlIG1vc3QKLQkJICogZXhwcmVzc2l2ZSAqLwotCQkqcGVlcl9zaWQgPSB4ZnJtX3NpZDsKLQllbHNlCi0JCSpwZWVyX3NpZCA9IFNFQ1NJRF9OVUxMOwogCXJldHVybiByYzsKIH0KIApAQCAtMjYxOSwxMCArMjYxMiwxMSBAQAogCiBpbnQgc2VjdXJpdHlfZ2V0X2NsYXNzZXMoY2hhciAqKipjbGFzc2VzLCBpbnQgKm5jbGFzc2VzKQogewotCWludCByYyA9IC1FTk9NRU07CisJaW50IHJjOwogCiAJcmVhZF9sb2NrKCZwb2xpY3lfcndsb2NrKTsKIAorCXJjID0gLUVOT01FTTsKIAkqbmNsYXNzZXMgPSBwb2xpY3lkYi5wX2NsYXNzZXMubnByaW07CiAJKmNsYXNzZXMgPSBrY2FsbG9jKCpuY2xhc3Nlcywgc2l6ZW9mKCoqY2xhc3NlcyksIEdGUF9BVE9NSUMpOwogCWlmICghKmNsYXNzZXMpCkBAIC0yNjMwLDcgKzI2MjQsNyBAQAogCiAJcmMgPSBoYXNodGFiX21hcChwb2xpY3lkYi5wX2NsYXNzZXMudGFibGUsIGdldF9jbGFzc2VzX2NhbGxiYWNrLAogCQkJKmNsYXNzZXMpOwotCWlmIChyYyA8IDApIHsKKwlpZiAocmMpIHsKIAkJaW50IGk7CiAJCWZvciAoaSA9IDA7IGkgPCAqbmNsYXNzZXM7IGkrKykKIAkJCWtmcmVlKCgqY2xhc3NlcylbaV0pOwpAQCAtMjY1NywxOSArMjY1MSwyMCBAQAogCiBpbnQgc2VjdXJpdHlfZ2V0X3Blcm1pc3Npb25zKGNoYXIgKmNsYXNzLCBjaGFyICoqKnBlcm1zLCBpbnQgKm5wZXJtcykKIHsKLQlpbnQgcmMgPSAtRU5PTUVNLCBpOworCWludCByYywgaTsKIAlzdHJ1Y3QgY2xhc3NfZGF0dW0gKm1hdGNoOwogCiAJcmVhZF9sb2NrKCZwb2xpY3lfcndsb2NrKTsKIAorCXJjID0gLUVJTlZBTDsKIAltYXRjaCA9IGhhc2h0YWJfc2VhcmNoKHBvbGljeWRiLnBfY2xhc3Nlcy50YWJsZSwgY2xhc3MpOwogCWlmICghbWF0Y2gpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJTRUxpbnV4OiAlczogIHVucmVjb2duaXplZCBjbGFzcyAlc1xuIiwKIAkJCV9fZnVuY19fLCBjbGFzcyk7Ci0JCXJjID0gLUVJTlZBTDsKIAkJZ290byBvdXQ7CiAJfQogCisJcmMgPSAtRU5PTUVNOwogCSpucGVybXMgPSBtYXRjaC0+cGVybWlzc2lvbnMubnByaW07CiAJKnBlcm1zID0ga2NhbGxvYygqbnBlcm1zLCBzaXplb2YoKipwZXJtcyksIEdGUF9BVE9NSUMpOwogCWlmICghKnBlcm1zKQpAQCAtMjY3OCwxMyArMjY3MywxMyBAQAogCWlmIChtYXRjaC0+Y29tZGF0dW0pIHsKIAkJcmMgPSBoYXNodGFiX21hcChtYXRjaC0+Y29tZGF0dW0tPnBlcm1pc3Npb25zLnRhYmxlLAogCQkJCWdldF9wZXJtaXNzaW9uc19jYWxsYmFjaywgKnBlcm1zKTsKLQkJaWYgKHJjIDwgMCkKKwkJaWYgKHJjKQogCQkJZ290byBlcnI7CiAJfQogCiAJcmMgPSBoYXNodGFiX21hcChtYXRjaC0+cGVybWlzc2lvbnMudGFibGUsIGdldF9wZXJtaXNzaW9uc19jYWxsYmFjaywKIAkJCSpwZXJtcyk7Ci0JaWYgKHJjIDwgMCkKKwlpZiAocmMpCiAJCWdvdG8gZXJyOwogCiBvdXQ6CkBAIC0yNzk2LDM2ICsyNzkxLDM5IEBACiAJc3dpdGNoIChmaWVsZCkgewogCWNhc2UgQVVESVRfU1VCSl9VU0VSOgogCWNhc2UgQVVESVRfT0JKX1VTRVI6CisJCXJjID0gLUVJTlZBTDsKIAkJdXNlcmRhdHVtID0gaGFzaHRhYl9zZWFyY2gocG9saWN5ZGIucF91c2Vycy50YWJsZSwgcnVsZXN0cik7CiAJCWlmICghdXNlcmRhdHVtKQotCQkJcmMgPSAtRUlOVkFMOwotCQllbHNlCi0JCQl0bXBydWxlLT5hdV9jdHh0LnVzZXIgPSB1c2VyZGF0dW0tPnZhbHVlOworCQkJZ290byBvdXQ7CisJCXRtcHJ1bGUtPmF1X2N0eHQudXNlciA9IHVzZXJkYXR1bS0+dmFsdWU7CiAJCWJyZWFrOwogCWNhc2UgQVVESVRfU1VCSl9ST0xFOgogCWNhc2UgQVVESVRfT0JKX1JPTEU6CisJCXJjID0gLUVJTlZBTDsKIAkJcm9sZWRhdHVtID0gaGFzaHRhYl9zZWFyY2gocG9saWN5ZGIucF9yb2xlcy50YWJsZSwgcnVsZXN0cik7CiAJCWlmICghcm9sZWRhdHVtKQotCQkJcmMgPSAtRUlOVkFMOwotCQllbHNlCi0JCQl0bXBydWxlLT5hdV9jdHh0LnJvbGUgPSByb2xlZGF0dW0tPnZhbHVlOworCQkJZ290byBvdXQ7CisJCXRtcHJ1bGUtPmF1X2N0eHQucm9sZSA9IHJvbGVkYXR1bS0+dmFsdWU7CiAJCWJyZWFrOwogCWNhc2UgQVVESVRfU1VCSl9UWVBFOgogCWNhc2UgQVVESVRfT0JKX1RZUEU6CisJCXJjID0gLUVJTlZBTDsKIAkJdHlwZWRhdHVtID0gaGFzaHRhYl9zZWFyY2gocG9saWN5ZGIucF90eXBlcy50YWJsZSwgcnVsZXN0cik7CiAJCWlmICghdHlwZWRhdHVtKQotCQkJcmMgPSAtRUlOVkFMOwotCQllbHNlCi0JCQl0bXBydWxlLT5hdV9jdHh0LnR5cGUgPSB0eXBlZGF0dW0tPnZhbHVlOworCQkJZ290byBvdXQ7CisJCXRtcHJ1bGUtPmF1X2N0eHQudHlwZSA9IHR5cGVkYXR1bS0+dmFsdWU7CiAJCWJyZWFrOwogCWNhc2UgQVVESVRfU1VCSl9TRU46CiAJY2FzZSBBVURJVF9TVUJKX0NMUjoKIAljYXNlIEFVRElUX09CSl9MRVZfTE9XOgogCWNhc2UgQVVESVRfT0JKX0xFVl9ISUdIOgogCQlyYyA9IG1sc19mcm9tX3N0cmluZyhydWxlc3RyLCAmdG1wcnVsZS0+YXVfY3R4dCwgR0ZQX0FUT01JQyk7CisJCWlmIChyYykKKwkJCWdvdG8gb3V0OwogCQlicmVhazsKIAl9Ci0KKwlyYyA9IDA7CitvdXQ6CiAJcmVhZF91bmxvY2soJnBvbGljeV9yd2xvY2spOwogCiAJaWYgKHJjKSB7CkBAIC0zMDUwLDcgKzMwNDgsNyBAQAogaW50IHNlY3VyaXR5X25ldGxibF9zZWNhdHRyX3RvX3NpZChzdHJ1Y3QgbmV0bGJsX2xzbV9zZWNhdHRyICpzZWNhdHRyLAogCQkJCSAgIHUzMiAqc2lkKQogewotCWludCByYyA9IC1FSURSTTsKKwlpbnQgcmM7CiAJc3RydWN0IGNvbnRleHQgKmN0eDsKIAlzdHJ1Y3QgY29udGV4dCBjdHhfbmV3OwogCkBAIC0zMDYxLDE2ICszMDU5LDE1IEBACiAKIAlyZWFkX2xvY2soJnBvbGljeV9yd2xvY2spOwogCi0JaWYgKHNlY2F0dHItPmZsYWdzICYgTkVUTEJMX1NFQ0FUVFJfQ0FDSEUpIHsKKwlpZiAoc2VjYXR0ci0+ZmxhZ3MgJiBORVRMQkxfU0VDQVRUUl9DQUNIRSkKIAkJKnNpZCA9ICoodTMyICopc2VjYXR0ci0+Y2FjaGUtPmRhdGE7Ci0JCXJjID0gMDsKLQl9IGVsc2UgaWYgKHNlY2F0dHItPmZsYWdzICYgTkVUTEJMX1NFQ0FUVFJfU0VDSUQpIHsKKwllbHNlIGlmIChzZWNhdHRyLT5mbGFncyAmIE5FVExCTF9TRUNBVFRSX1NFQ0lEKQogCQkqc2lkID0gc2VjYXR0ci0+YXR0ci5zZWNpZDsKLQkJcmMgPSAwOwotCX0gZWxzZSBpZiAoc2VjYXR0ci0+ZmxhZ3MgJiBORVRMQkxfU0VDQVRUUl9NTFNfTFZMKSB7CisJZWxzZSBpZiAoc2VjYXR0ci0+ZmxhZ3MgJiBORVRMQkxfU0VDQVRUUl9NTFNfTFZMKSB7CisJCXJjID0gLUVJRFJNOwogCQljdHggPSBzaWR0YWJfc2VhcmNoKCZzaWR0YWIsIFNFQ0lOSVRTSURfTkVUTVNHKTsKIAkJaWYgKGN0eCA9PSBOVUxMKQotCQkJZ290byBuZXRsYmxfc2VjYXR0cl90b19zaWRfcmV0dXJuOworCQkJZ290byBvdXQ7CiAKIAkJY29udGV4dF9pbml0KCZjdHhfbmV3KTsKIAkJY3R4X25ldy51c2VyID0gY3R4LT51c2VyOwpAQCAtMzA3OCwzNCArMzA3NSwzNSBAQAogCQljdHhfbmV3LnR5cGUgPSBjdHgtPnR5cGU7CiAJCW1sc19pbXBvcnRfbmV0bGJsX2x2bCgmY3R4X25ldywgc2VjYXR0cik7CiAJCWlmIChzZWNhdHRyLT5mbGFncyAmIE5FVExCTF9TRUNBVFRSX01MU19DQVQpIHsKLQkJCWlmIChlYml0bWFwX25ldGxibF9pbXBvcnQoJmN0eF9uZXcucmFuZ2UubGV2ZWxbMF0uY2F0LAotCQkJCQkJICBzZWNhdHRyLT5hdHRyLm1scy5jYXQpICE9IDApCi0JCQkJZ290byBuZXRsYmxfc2VjYXR0cl90b19zaWRfcmV0dXJuOworCQkJcmMgPSBlYml0bWFwX25ldGxibF9pbXBvcnQoJmN0eF9uZXcucmFuZ2UubGV2ZWxbMF0uY2F0LAorCQkJCQkJICAgc2VjYXR0ci0+YXR0ci5tbHMuY2F0KTsKKwkJCWlmIChyYykKKwkJCQlnb3RvIG91dDsKIAkJCW1lbWNweSgmY3R4X25ldy5yYW5nZS5sZXZlbFsxXS5jYXQsCiAJCQkgICAgICAgJmN0eF9uZXcucmFuZ2UubGV2ZWxbMF0uY2F0LAogCQkJICAgICAgIHNpemVvZihjdHhfbmV3LnJhbmdlLmxldmVsWzBdLmNhdCkpOwogCQl9Ci0JCWlmIChtbHNfY29udGV4dF9pc3ZhbGlkKCZwb2xpY3lkYiwgJmN0eF9uZXcpICE9IDEpCi0JCQlnb3RvIG5ldGxibF9zZWNhdHRyX3RvX3NpZF9yZXR1cm5fY2xlYW51cDsKKwkJcmMgPSAtRUlEUk07CisJCWlmICghbWxzX2NvbnRleHRfaXN2YWxpZCgmcG9saWN5ZGIsICZjdHhfbmV3KSkKKwkJCWdvdG8gb3V0X2ZyZWU7CiAKIAkJcmMgPSBzaWR0YWJfY29udGV4dF90b19zaWQoJnNpZHRhYiwgJmN0eF9uZXcsIHNpZCk7Ci0JCWlmIChyYyAhPSAwKQotCQkJZ290byBuZXRsYmxfc2VjYXR0cl90b19zaWRfcmV0dXJuX2NsZWFudXA7CisJCWlmIChyYykKKwkJCWdvdG8gb3V0X2ZyZWU7CiAKIAkJc2VjdXJpdHlfbmV0bGJsX2NhY2hlX2FkZChzZWNhdHRyLCAqc2lkKTsKIAogCQllYml0bWFwX2Rlc3Ryb3koJmN0eF9uZXcucmFuZ2UubGV2ZWxbMF0uY2F0KTsKLQl9IGVsc2UgeworCX0gZWxzZQogCQkqc2lkID0gU0VDU0lEX05VTEw7Ci0JCXJjID0gMDsKLQl9CiAKLW5ldGxibF9zZWNhdHRyX3RvX3NpZF9yZXR1cm46CisJcmVhZF91bmxvY2soJnBvbGljeV9yd2xvY2spOworCXJldHVybiAwOworb3V0X2ZyZWU6CisJZWJpdG1hcF9kZXN0cm95KCZjdHhfbmV3LnJhbmdlLmxldmVsWzBdLmNhdCk7CitvdXQ6CiAJcmVhZF91bmxvY2soJnBvbGljeV9yd2xvY2spOwogCXJldHVybiByYzsKLW5ldGxibF9zZWNhdHRyX3RvX3NpZF9yZXR1cm5fY2xlYW51cDoKLQllYml0bWFwX2Rlc3Ryb3koJmN0eF9uZXcucmFuZ2UubGV2ZWxbMF0uY2F0KTsKLQlnb3RvIG5ldGxibF9zZWNhdHRyX3RvX3NpZF9yZXR1cm47CiB9CiAKIC8qKgpAQCAtMzEyNywyOCArMzEyNSwyMyBAQAogCQlyZXR1cm4gMDsKIAogCXJlYWRfbG9jaygmcG9saWN5X3J3bG9jayk7CisKKwlyYyA9IC1FTk9FTlQ7CiAJY3R4ID0gc2lkdGFiX3NlYXJjaCgmc2lkdGFiLCBzaWQpOwotCWlmIChjdHggPT0gTlVMTCkgewotCQlyYyA9IC1FTk9FTlQ7Ci0JCWdvdG8gbmV0bGJsX3NpZF90b19zZWNhdHRyX2ZhaWx1cmU7Ci0JfQotCXNlY2F0dHItPmRvbWFpbiA9IGtzdHJkdXAocG9saWN5ZGIucF90eXBlX3ZhbF90b19uYW1lW2N0eC0+dHlwZSAtIDFdLAorCWlmIChjdHggPT0gTlVMTCkKKwkJZ290byBvdXQ7CisKKwlyYyA9IC1FTk9NRU07CisJc2VjYXR0ci0+ZG9tYWluID0ga3N0cmR1cChzeW1fbmFtZSgmcG9saWN5ZGIsIFNZTV9UWVBFUywgY3R4LT50eXBlIC0gMSksCiAJCQkJICBHRlBfQVRPTUlDKTsKLQlpZiAoc2VjYXR0ci0+ZG9tYWluID09IE5VTEwpIHsKLQkJcmMgPSAtRU5PTUVNOwotCQlnb3RvIG5ldGxibF9zaWRfdG9fc2VjYXR0cl9mYWlsdXJlOwotCX0KKwlpZiAoc2VjYXR0ci0+ZG9tYWluID09IE5VTEwpCisJCWdvdG8gb3V0OworCiAJc2VjYXR0ci0+YXR0ci5zZWNpZCA9IHNpZDsKIAlzZWNhdHRyLT5mbGFncyB8PSBORVRMQkxfU0VDQVRUUl9ET01BSU5fQ1BZIHwgTkVUTEJMX1NFQ0FUVFJfU0VDSUQ7CiAJbWxzX2V4cG9ydF9uZXRsYmxfbHZsKGN0eCwgc2VjYXR0cik7CiAJcmMgPSBtbHNfZXhwb3J0X25ldGxibF9jYXQoY3R4LCBzZWNhdHRyKTsKLQlpZiAocmMgIT0gMCkKLQkJZ290byBuZXRsYmxfc2lkX3RvX3NlY2F0dHJfZmFpbHVyZTsKLQlyZWFkX3VubG9jaygmcG9saWN5X3J3bG9jayk7Ci0KLQlyZXR1cm4gMDsKLQotbmV0bGJsX3NpZF90b19zZWNhdHRyX2ZhaWx1cmU6CitvdXQ6CiAJcmVhZF91bmxvY2soJnBvbGljeV9yd2xvY2spOwogCXJldHVybiByYzsKIH0KZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NlbGludXgvc3Mvc2lkdGFiLmMgYi9zZWN1cml0eS9zZWxpbnV4L3NzL3NpZHRhYi5jCmluZGV4IGU4MTc5ODkuLjU4NDBhMzUgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NlbGludXgvc3Mvc2lkdGFiLmMKKysrIGIvc2VjdXJpdHkvc2VsaW51eC9zcy9zaWR0YWIuYwpAQCAtMTQ3LDYgKzE0NywxNyBAQAogCXJldHVybiByYzsKIH0KIAorc3RhdGljIHZvaWQgc2lkdGFiX3VwZGF0ZV9jYWNoZShzdHJ1Y3Qgc2lkdGFiICpzLCBzdHJ1Y3Qgc2lkdGFiX25vZGUgKm4sIGludCBsb2MpCit7CisJQlVHX09OKGxvYyA+PSBTSURUQUJfQ0FDSEVfTEVOKTsKKworCXdoaWxlIChsb2MgPiAwKSB7CisJCXMtPmNhY2hlW2xvY10gPSBzLT5jYWNoZVtsb2MgLSAxXTsKKwkJbG9jLS07CisJfQorCXMtPmNhY2hlWzBdID0gbjsKK30KKwogc3RhdGljIGlubGluZSB1MzIgc2lkdGFiX3NlYXJjaF9jb250ZXh0KHN0cnVjdCBzaWR0YWIgKnMsCiAJCQkJCQkgIHN0cnVjdCBjb250ZXh0ICpjb250ZXh0KQogewpAQCAtMTU2LDE0ICsxNjcsMzMgQEAKIAlmb3IgKGkgPSAwOyBpIDwgU0lEVEFCX1NJWkU7IGkrKykgewogCQljdXIgPSBzLT5odGFibGVbaV07CiAJCXdoaWxlIChjdXIpIHsKLQkJCWlmIChjb250ZXh0X2NtcCgmY3VyLT5jb250ZXh0LCBjb250ZXh0KSkKKwkJCWlmIChjb250ZXh0X2NtcCgmY3VyLT5jb250ZXh0LCBjb250ZXh0KSkgeworCQkJCXNpZHRhYl91cGRhdGVfY2FjaGUocywgY3VyLCBTSURUQUJfQ0FDSEVfTEVOIC0gMSk7CiAJCQkJcmV0dXJuIGN1ci0+c2lkOworCQkJfQogCQkJY3VyID0gY3VyLT5uZXh0OwogCQl9CiAJfQogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW5saW5lIHUzMiBzaWR0YWJfc2VhcmNoX2NhY2hlKHN0cnVjdCBzaWR0YWIgKnMsIHN0cnVjdCBjb250ZXh0ICpjb250ZXh0KQoreworCWludCBpOworCXN0cnVjdCBzaWR0YWJfbm9kZSAqbm9kZTsKKworCWZvciAoaSA9IDA7IGkgPCBTSURUQUJfQ0FDSEVfTEVOOyBpKyspIHsKKwkJbm9kZSA9IHMtPmNhY2hlW2ldOworCQlpZiAodW5saWtlbHkoIW5vZGUpKQorCQkJcmV0dXJuIDA7CisJCWlmIChjb250ZXh0X2NtcCgmbm9kZS0+Y29udGV4dCwgY29udGV4dCkpIHsKKwkJCXNpZHRhYl91cGRhdGVfY2FjaGUocywgbm9kZSwgaSk7CisJCQlyZXR1cm4gbm9kZS0+c2lkOworCQl9CisJfQorCXJldHVybiAwOworfQorCiBpbnQgc2lkdGFiX2NvbnRleHRfdG9fc2lkKHN0cnVjdCBzaWR0YWIgKnMsCiAJCQkgIHN0cnVjdCBjb250ZXh0ICpjb250ZXh0LAogCQkJICB1MzIgKm91dF9zaWQpCkBAIC0xNzQsNyArMjA0LDkgQEAKIAogCSpvdXRfc2lkID0gU0VDU0lEX05VTEw7CiAKLQlzaWQgPSBzaWR0YWJfc2VhcmNoX2NvbnRleHQocywgY29udGV4dCk7CisJc2lkICA9IHNpZHRhYl9zZWFyY2hfY2FjaGUocywgY29udGV4dCk7CisJaWYgKCFzaWQpCisJCXNpZCA9IHNpZHRhYl9zZWFyY2hfY29udGV4dChzLCBjb250ZXh0KTsKIAlpZiAoIXNpZCkgewogCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOwogCQkvKiBSZXNjYW4gbm93IHRoYXQgd2UgaG9sZCB0aGUgbG9jay4gKi8KQEAgLTI1OSwxMiArMjkxLDE1IEBACiB2b2lkIHNpZHRhYl9zZXQoc3RydWN0IHNpZHRhYiAqZHN0LCBzdHJ1Y3Qgc2lkdGFiICpzcmMpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgaTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZzcmMtPmxvY2ssIGZsYWdzKTsKIAlkc3QtPmh0YWJsZSA9IHNyYy0+aHRhYmxlOwogCWRzdC0+bmVsID0gc3JjLT5uZWw7CiAJZHN0LT5uZXh0X3NpZCA9IHNyYy0+bmV4dF9zaWQ7CiAJZHN0LT5zaHV0ZG93biA9IDA7CisJZm9yIChpID0gMDsgaSA8IFNJRFRBQl9DQUNIRV9MRU47IGkrKykKKwkJZHN0LT5jYWNoZVtpXSA9IE5VTEw7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3JjLT5sb2NrLCBmbGFncyk7CiB9CiAKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NlbGludXgvc3Mvc2lkdGFiLmggYi9zZWN1cml0eS9zZWxpbnV4L3NzL3NpZHRhYi5oCmluZGV4IDY0ZWE1YjEuLjg0ZGMxNTQgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NlbGludXgvc3Mvc2lkdGFiLmgKKysrIGIvc2VjdXJpdHkvc2VsaW51eC9zcy9zaWR0YWIuaApAQCAtMjYsNiArMjYsOCBAQAogCXVuc2lnbmVkIGludCBuZWw7CS8qIG51bWJlciBvZiBlbGVtZW50cyAqLwogCXVuc2lnbmVkIGludCBuZXh0X3NpZDsJLyogbmV4dCBTSUQgdG8gYWxsb2NhdGUgKi8KIAl1bnNpZ25lZCBjaGFyIHNodXRkb3duOworI2RlZmluZSBTSURUQUJfQ0FDSEVfTEVOCTMKKwlzdHJ1Y3Qgc2lkdGFiX25vZGUgKmNhY2hlW1NJRFRBQl9DQUNIRV9MRU5dOwogCXNwaW5sb2NrX3QgbG9jazsKIH07CiAKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NtYWNrL3NtYWNrLmggYi9zZWN1cml0eS9zbWFjay9zbWFjay5oCmluZGV4IDQzYWU3NDcuLjEyOWM0ZWIgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NtYWNrL3NtYWNrLmgKKysrIGIvc2VjdXJpdHkvc21hY2svc21hY2suaApAQCAtNTEsMTEgKzUxLDE4IEBACiAgKi8KIHN0cnVjdCBpbm9kZV9zbWFjayB7CiAJY2hhcgkJKnNta19pbm9kZTsJLyogbGFiZWwgb2YgdGhlIGZzbyAqLworCWNoYXIJCSpzbWtfdGFzazsJLyogbGFiZWwgb2YgdGhlIHRhc2sgKi8KIAlzdHJ1Y3QgbXV0ZXgJc21rX2xvY2s7CS8qIGluaXRpYWxpemF0aW9uIGxvY2sgKi8KIAlpbnQJCXNta19mbGFnczsJLyogc21hY2sgaW5vZGUgZmxhZ3MgKi8KIH07CiAKK3N0cnVjdCB0YXNrX3NtYWNrIHsKKwljaGFyCQkqc21rX3Rhc2s7CS8qIGxhYmVsIHVzZWQgZm9yIGFjY2VzcyBjb250cm9sICovCisJY2hhcgkJKnNta19mb3JrZWQ7CS8qIGxhYmVsIHdoZW4gZm9ya2VkICovCit9OworCiAjZGVmaW5lCVNNS19JTk9ERV9JTlNUQU5UCTB4MDEJLyogaW5vZGUgaXMgaW5zdGFudGlhdGVkICovCisjZGVmaW5lCVNNS19JTk9ERV9UUkFOU01VVEUJMHgwMgkvKiBkaXJlY3RvcnkgaXMgdHJhbnNtdXRpbmcgKi8KIAogLyoKICAqIEEgbGFiZWwgYWNjZXNzIHJ1bGUuCkBAIC0xNjEsNiArMTY4LDEwIEBACiAjZGVmaW5lIFNNQUNLX0NJUFNPX01BWENBVE5VTSAgICAgICAgICAgMjM5ICAgICAvKiBDSVBTTyAyLjIgc3RhbmRhcmQgKi8KIAogLyoKKyAqIEZsYWcgZm9yIHRyYW5zbXV0ZSBhY2Nlc3MKKyAqLworI2RlZmluZSBNQVlfVFJBTlNNVVRFCTY0CisvKgogICogSnVzdCB0byBtYWtlIHRoZSBjb21tb24gY2FzZXMgZWFzaWVyIHRvIGRlYWwgd2l0aAogICovCiAjZGVmaW5lIE1BWV9BTlkJCShNQVlfUkVBRCB8IE1BWV9XUklURSB8IE1BWV9BUFBFTkQgfCBNQVlfRVhFQykKQEAgLTE5MSw2ICsyMDIsNyBAQAogLyoKICAqIFRoZXNlIGZ1bmN0aW9ucyBhcmUgaW4gc21hY2tfYWNjZXNzLmMKICAqLworaW50IHNta19hY2Nlc3NfZW50cnkoY2hhciAqLCBjaGFyICopOwogaW50IHNta19hY2Nlc3MoY2hhciAqLCBjaGFyICosIGludCwgc3RydWN0IHNta19hdWRpdF9pbmZvICopOwogaW50IHNta19jdXJhY2MoY2hhciAqLCB1MzIsIHN0cnVjdCBzbWtfYXVkaXRfaW5mbyAqKTsKIGludCBzbWFja190b19jaXBzbyhjb25zdCBjaGFyICosIHN0cnVjdCBzbWFja19jaXBzbyAqKTsKQEAgLTIzNCw2ICsyNDYsMTUgQEAKIH0KIAogLyoKKyAqIElzIHRoZSBkaXJlY3RvcnkgdHJhbnNtdXRpbmc/CisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHNta19pbm9kZV90cmFuc211dGFibGUoY29uc3Qgc3RydWN0IGlub2RlICppc3ApCit7CisJc3RydWN0IGlub2RlX3NtYWNrICpzaXAgPSBpc3AtPmlfc2VjdXJpdHk7CisJcmV0dXJuIChzaXAtPnNta19mbGFncyAmIFNNS19JTk9ERV9UUkFOU01VVEUpICE9IDA7Cit9CisKKy8qCiAgKiBQcmVzZW50IGEgcG9pbnRlciB0byB0aGUgc21hY2sgbGFiZWwgaW4gYW4gaW5vZGUgYmxvYi4KICAqLwogc3RhdGljIGlubGluZSBjaGFyICpzbWtfb2ZfaW5vZGUoY29uc3Qgc3RydWN0IGlub2RlICppc3ApCkBAIC0yNDMsNiArMjY0LDMwIEBACiB9CiAKIC8qCisgKiBQcmVzZW50IGEgcG9pbnRlciB0byB0aGUgc21hY2sgbGFiZWwgaW4gYW4gdGFzayBibG9iLgorICovCitzdGF0aWMgaW5saW5lIGNoYXIgKnNta19vZl90YXNrKGNvbnN0IHN0cnVjdCB0YXNrX3NtYWNrICp0c3ApCit7CisJcmV0dXJuIHRzcC0+c21rX3Rhc2s7Cit9CisKKy8qCisgKiBQcmVzZW50IGEgcG9pbnRlciB0byB0aGUgZm9ya2VkIHNtYWNrIGxhYmVsIGluIGFuIHRhc2sgYmxvYi4KKyAqLworc3RhdGljIGlubGluZSBjaGFyICpzbWtfb2ZfZm9ya2VkKGNvbnN0IHN0cnVjdCB0YXNrX3NtYWNrICp0c3ApCit7CisJcmV0dXJuIHRzcC0+c21rX2ZvcmtlZDsKK30KKworLyoKKyAqIFByZXNlbnQgYSBwb2ludGVyIHRvIHRoZSBzbWFjayBsYWJlbCBpbiB0aGUgY3VycmVudCB0YXNrIGJsb2IuCisgKi8KK3N0YXRpYyBpbmxpbmUgY2hhciAqc21rX29mX2N1cnJlbnQodm9pZCkKK3sKKwlyZXR1cm4gc21rX29mX3Rhc2soY3VycmVudF9zZWN1cml0eSgpKTsKK30KKworLyoKICAqIGxvZ2dpbmcgZnVuY3Rpb25zCiAgKi8KICNkZWZpbmUgU01BQ0tfQVVESVRfREVOSUVEIDB4MQpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc21hY2svc21hY2tfYWNjZXNzLmMgYi9zZWN1cml0eS9zbWFjay9zbWFja19hY2Nlc3MuYwppbmRleCBmNGZhYzY0Li43YmE4NDc4IDEwMDY0NAotLS0gYS9zZWN1cml0eS9zbWFjay9zbWFja19hY2Nlc3MuYworKysgYi9zZWN1cml0eS9zbWFjay9zbWFja19hY2Nlc3MuYwpAQCAtNjcsNiArNjcsNDYgQEAKIGludCBsb2dfcG9saWN5ID0gU01BQ0tfQVVESVRfREVOSUVEOwogCiAvKioKKyAqIHNta19hY2Nlc3NfZW50cnkgLSBsb29rIHVwIG1hdGNoaW5nIGFjY2VzcyBydWxlCisgKiBAc3ViamVjdF9sYWJlbDogYSBwb2ludGVyIHRvIHRoZSBzdWJqZWN0J3MgU21hY2sgbGFiZWwKKyAqIEBvYmplY3RfbGFiZWw6IGEgcG9pbnRlciB0byB0aGUgb2JqZWN0J3MgU21hY2sgbGFiZWwKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGxvb2tzIHVwIHRoZSBzdWJqZWN0L29iamVjdCBwYWlyIGluIHRoZQorICogYWNjZXNzIHJ1bGUgbGlzdCBhbmQgcmV0dXJucyBwb2ludGVyIHRvIHRoZSBtYXRjaGluZyBydWxlIGlmIGZvdW5kLAorICogTlVMTCBvdGhlcndpc2UuCisgKgorICogTk9URToKKyAqIEV2ZW4gdGhvdWdoIFNtYWNrIGxhYmVscyBhcmUgdXN1YWxseSBzaGFyZWQgb24gc21hY2tfbGlzdAorICogbGFiZWxzIHRoYXQgY29tZSBpbiBvZmYgdGhlIG5ldHdvcmsgY2FuJ3QgYmUgaW1wb3J0ZWQKKyAqIGFuZCBhZGRlZCB0byB0aGUgbGlzdCBmb3IgbG9ja2luZyByZWFzb25zLgorICoKKyAqIFRoZXJlZm9yZSwgaXQgaXMgbmVjZXNzYXJ5IHRvIGNoZWNrIHRoZSBjb250ZW50cyBvZiB0aGUgbGFiZWxzLAorICogbm90IGp1c3QgdGhlIHBvaW50ZXIgdmFsdWVzLiBPZiBjb3Vyc2UsIGluIG1vc3QgY2FzZXMgdGhlIGxhYmVscworICogd2lsbCBiZSBvbiB0aGUgbGlzdCwgc28gY2hlY2tpbmcgdGhlIHBvaW50ZXJzIG1heSBiZSBhIHdvcnRod2hpbGUKKyAqIG9wdGltaXphdGlvbi4KKyAqLworaW50IHNta19hY2Nlc3NfZW50cnkoY2hhciAqc3ViamVjdF9sYWJlbCwgY2hhciAqb2JqZWN0X2xhYmVsKQoreworCXUzMiBtYXkgPSBNQVlfTk9UOworCXN0cnVjdCBzbWFja19ydWxlICpzcnA7CisKKwlyY3VfcmVhZF9sb2NrKCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3Uoc3JwLCAmc21hY2tfcnVsZV9saXN0LCBsaXN0KSB7CisJCWlmIChzcnAtPnNta19zdWJqZWN0ID09IHN1YmplY3RfbGFiZWwgfHwKKwkJICAgIHN0cmNtcChzcnAtPnNta19zdWJqZWN0LCBzdWJqZWN0X2xhYmVsKSA9PSAwKSB7CisJCQlpZiAoc3JwLT5zbWtfb2JqZWN0ID09IG9iamVjdF9sYWJlbCB8fAorCQkJICAgIHN0cmNtcChzcnAtPnNta19vYmplY3QsIG9iamVjdF9sYWJlbCkgPT0gMCkgeworCQkJCW1heSA9IHNycC0+c21rX2FjY2VzczsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKwlyY3VfcmVhZF91bmxvY2soKTsKKworCXJldHVybiBtYXk7Cit9CisKKy8qKgogICogc21rX2FjY2VzcyAtIGRldGVybWluZSBpZiBhIHN1YmplY3QgaGFzIGEgc3BlY2lmaWMgYWNjZXNzIHRvIGFuIG9iamVjdAogICogQHN1YmplY3RfbGFiZWw6IGEgcG9pbnRlciB0byB0aGUgc3ViamVjdCdzIFNtYWNrIGxhYmVsCiAgKiBAb2JqZWN0X2xhYmVsOiBhIHBvaW50ZXIgdG8gdGhlIG9iamVjdCdzIFNtYWNrIGxhYmVsCkBAIC05MCw3ICsxMzAsNiBAQAogCSAgICAgICBzdHJ1Y3Qgc21rX2F1ZGl0X2luZm8gKmEpCiB7CiAJdTMyIG1heSA9IE1BWV9OT1Q7Ci0Jc3RydWN0IHNtYWNrX3J1bGUgKnNycDsKIAlpbnQgcmMgPSAwOwogCiAJLyoKQEAgLTE0NCwxOCArMTgzLDcgQEAKIAkgKiBhY2Nlc3MgKGUuZy4gcmVhZCBpcyBpbmNsdWRlZCBpbiByZWFkd3JpdGUpIGl0J3MKIAkgKiBnb29kLgogCSAqLwotCXJjdV9yZWFkX2xvY2soKTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShzcnAsICZzbWFja19ydWxlX2xpc3QsIGxpc3QpIHsKLQkJaWYgKHNycC0+c21rX3N1YmplY3QgPT0gc3ViamVjdF9sYWJlbCB8fAotCQkgICAgc3RyY21wKHNycC0+c21rX3N1YmplY3QsIHN1YmplY3RfbGFiZWwpID09IDApIHsKLQkJCWlmIChzcnAtPnNta19vYmplY3QgPT0gb2JqZWN0X2xhYmVsIHx8Ci0JCQkgICAgc3RyY21wKHNycC0+c21rX29iamVjdCwgb2JqZWN0X2xhYmVsKSA9PSAwKSB7Ci0JCQkJbWF5ID0gc3JwLT5zbWtfYWNjZXNzOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotCXJjdV9yZWFkX3VubG9jaygpOworCW1heSA9IHNta19hY2Nlc3NfZW50cnkoc3ViamVjdF9sYWJlbCwgb2JqZWN0X2xhYmVsKTsKIAkvKgogCSAqIFRoaXMgaXMgYSBiaXQgbWFwIG9wZXJhdGlvbi4KIAkgKi8KQEAgLTE4NSw3ICsyMTMsNyBAQAogaW50IHNta19jdXJhY2MoY2hhciAqb2JqX2xhYmVsLCB1MzIgbW9kZSwgc3RydWN0IHNta19hdWRpdF9pbmZvICphKQogewogCWludCByYzsKLQljaGFyICpzcCA9IGN1cnJlbnRfc2VjdXJpdHkoKTsKKwljaGFyICpzcCA9IHNta19vZl9jdXJyZW50KCk7CiAKIAlyYyA9IHNta19hY2Nlc3Moc3AsIG9ial9sYWJlbCwgbW9kZSwgTlVMTCk7CiAJaWYgKHJjID09IDApCkBAIC0xOTYsNyArMjI0LDcgQEAKIAkgKiBvbmx5IG9uZSB0aGF0IGdldHMgcHJpdmlsZWdlIGFuZCBjdXJyZW50IGRvZXMgbm90CiAJICogaGF2ZSB0aGF0IGxhYmVsLgogCSAqLwotCWlmIChzbWFja19vbmx5Y2FwICE9IE5VTEwgJiYgc21hY2tfb25seWNhcCAhPSBjdXJyZW50LT5jcmVkLT5zZWN1cml0eSkKKwlpZiAoc21hY2tfb25seWNhcCAhPSBOVUxMICYmIHNtYWNrX29ubHljYXAgIT0gc3ApCiAJCWdvdG8gb3V0X2F1ZGl0OwogCiAJaWYgKGNhcGFibGUoQ0FQX01BQ19PVkVSUklERSkpCmRpZmYgLS1naXQgYS9zZWN1cml0eS9zbWFjay9zbWFja19sc20uYyBiL3NlY3VyaXR5L3NtYWNrL3NtYWNrX2xzbS5jCmluZGV4IGNjYjcxYTAuLjUzM2JmMzIgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NtYWNrL3NtYWNrX2xzbS5jCisrKyBiL3NlY3VyaXR5L3NtYWNrL3NtYWNrX2xzbS5jCkBAIC0zLDEyICszLDE0IEBACiAgKgogICogIFRoaXMgZmlsZSBjb250YWlucyB0aGUgc21hY2sgaG9vayBmdW5jdGlvbiBpbXBsZW1lbnRhdGlvbnMuCiAgKgotICogIEF1dGhvcjoKKyAqICBBdXRob3JzOgogICoJQ2FzZXkgU2NoYXVmbGVyIDxjYXNleUBzY2hhdWZsZXItY2EuY29tPgorICoJSmFya2tvIFNha2tpbmVuIDxleHQtamFya2tvLjIuc2Fra2luZW5Abm9raWEuY29tPgogICoKICAqICBDb3B5cmlnaHQgKEMpIDIwMDcgQ2FzZXkgU2NoYXVmbGVyIDxjYXNleUBzY2hhdWZsZXItY2EuY29tPgogICogIENvcHlyaWdodCAoQykgMjAwOSBIZXdsZXR0LVBhY2thcmQgRGV2ZWxvcG1lbnQgQ29tcGFueSwgTC5QLgogICogICAgICAgICAgICAgICAgUGF1bCBNb29yZSA8cGF1bC5tb29yZUBocC5jb20+CisgKiAgQ29weXJpZ2h0IChDKSAyMDEwIE5va2lhIENvcnBvcmF0aW9uCiAgKgogICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqCWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLApAQCAtMzUsNiArMzcsOSBAQAogCiAjZGVmaW5lIHRhc2tfc2VjdXJpdHkodGFzaykJKHRhc2tfY3JlZF94eHgoKHRhc2spLCBzZWN1cml0eSkpCiAKKyNkZWZpbmUgVFJBTlNfVFJVRQkiVFJVRSIKKyNkZWZpbmUgVFJBTlNfVFJVRV9TSVpFCTQKKwogLyoqCiAgKiBzbWtfZmV0Y2ggLSBGZXRjaCB0aGUgc21hY2sgbGFiZWwgZnJvbSBhIGZpbGUuCiAgKiBAaXA6IGEgcG9pbnRlciB0byB0aGUgaW5vZGUKQEAgLTQzLDcgKzQ4LDcgQEAKICAqIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBtYXN0ZXIgbGlzdCBlbnRyeSBmb3IgdGhlIFNtYWNrIGxhYmVsCiAgKiBvciBOVUxMIGlmIHRoZXJlIHdhcyBubyBsYWJlbCB0byBmZXRjaC4KICAqLwotc3RhdGljIGNoYXIgKnNta19mZXRjaChzdHJ1Y3QgaW5vZGUgKmlwLCBzdHJ1Y3QgZGVudHJ5ICpkcCkKK3N0YXRpYyBjaGFyICpzbWtfZmV0Y2goY29uc3QgY2hhciAqbmFtZSwgc3RydWN0IGlub2RlICppcCwgc3RydWN0IGRlbnRyeSAqZHApCiB7CiAJaW50IHJjOwogCWNoYXIgaW5bU01LX0xBQkVMTEVOXTsKQEAgLTUxLDcgKzU2LDcgQEAKIAlpZiAoaXAtPmlfb3AtPmdldHhhdHRyID09IE5VTEwpCiAJCXJldHVybiBOVUxMOwogCi0JcmMgPSBpcC0+aV9vcC0+Z2V0eGF0dHIoZHAsIFhBVFRSX05BTUVfU01BQ0ssIGluLCBTTUtfTEFCRUxMRU4pOworCXJjID0gaXAtPmlfb3AtPmdldHhhdHRyKGRwLCBuYW1lLCBpbiwgU01LX0xBQkVMTEVOKTsKIAlpZiAocmMgPCAwKQogCQlyZXR1cm4gTlVMTDsKIApAQCAtMTAzLDggKzEwOCw4IEBACiAJaWYgKHJjICE9IDApCiAJCXJldHVybiByYzsKIAotCXNwID0gY3VycmVudF9zZWN1cml0eSgpOwotCXRzcCA9IHRhc2tfc2VjdXJpdHkoY3RwKTsKKwlzcCA9IHNta19vZl9jdXJyZW50KCk7CisJdHNwID0gc21rX29mX3Rhc2sodGFza19zZWN1cml0eShjdHApKTsKIAlzbWtfYWRfaW5pdCgmYWQsIF9fZnVuY19fLCBMU01fQVVESVRfREFUQV9UQVNLKTsKIAlzbWtfYWRfc2V0ZmllbGRfdV90c2soJmFkLCBjdHApOwogCkBAIC0xMzgsOCArMTQzLDggQEAKIAlzbWtfYWRfaW5pdCgmYWQsIF9fZnVuY19fLCBMU01fQVVESVRfREFUQV9UQVNLKTsKIAlzbWtfYWRfc2V0ZmllbGRfdV90c2soJmFkLCBwdHApOwogCi0Jc3AgPSBjdXJyZW50X3NlY3VyaXR5KCk7Ci0JdHNwID0gdGFza19zZWN1cml0eShwdHApOworCXNwID0gc21rX29mX2N1cnJlbnQoKTsKKwl0c3AgPSBzbWtfb2ZfdGFzayh0YXNrX3NlY3VyaXR5KHB0cCkpOwogCS8qIHdlIHdvbid0IGxvZyBoZXJlLCBiZWNhdXNlIHJjIGNhbiBiZSBvdmVycmlkZW4gKi8KIAlyYyA9IHNta19hY2Nlc3ModHNwLCBzcCwgTUFZX1JFQURXUklURSwgTlVMTCk7CiAJaWYgKHJjICE9IDAgJiYgaGFzX2NhcGFiaWxpdHkocHRwLCBDQVBfTUFDX09WRVJSSURFKSkKQEAgLTE2MCw3ICsxNjUsNyBAQAogc3RhdGljIGludCBzbWFja19zeXNsb2coaW50IHR5cGVmcm9tX2ZpbGUpCiB7CiAJaW50IHJjID0gMDsKLQljaGFyICpzcCA9IGN1cnJlbnRfc2VjdXJpdHkoKTsKKwljaGFyICpzcCA9IHNta19vZl9jdXJyZW50KCk7CiAKIAlpZiAoY2FwYWJsZShDQVBfTUFDX09WRVJSSURFKSkKIAkJcmV0dXJuIDA7CkBAIC0zOTEsNiArMzk2LDQwIEBACiB9CiAKIC8qCisgKiBCUFJNIGhvb2tzCisgKi8KKworc3RhdGljIGludCBzbWFja19icHJtX3NldF9jcmVkcyhzdHJ1Y3QgbGludXhfYmlucHJtICpicHJtKQoreworCXN0cnVjdCB0YXNrX3NtYWNrICp0c3AgPSBicHJtLT5jcmVkLT5zZWN1cml0eTsKKwlzdHJ1Y3QgaW5vZGVfc21hY2sgKmlzcDsKKwlzdHJ1Y3QgZGVudHJ5ICpkcDsKKwlpbnQgcmM7CisKKwlyYyA9IGNhcF9icHJtX3NldF9jcmVkcyhicHJtKTsKKwlpZiAocmMgIT0gMCkKKwkJcmV0dXJuIHJjOworCisJaWYgKGJwcm0tPmNyZWRfcHJlcGFyZWQpCisJCXJldHVybiAwOworCisJaWYgKGJwcm0tPmZpbGUgPT0gTlVMTCB8fCBicHJtLT5maWxlLT5mX2RlbnRyeSA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKworCWRwID0gYnBybS0+ZmlsZS0+Zl9kZW50cnk7CisKKwlpZiAoZHAtPmRfaW5vZGUgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisKKwlpc3AgPSBkcC0+ZF9pbm9kZS0+aV9zZWN1cml0eTsKKworCWlmIChpc3AtPnNta190YXNrICE9IE5VTEwpCisJCXRzcC0+c21rX3Rhc2sgPSBpc3AtPnNta190YXNrOworCisJcmV0dXJuIDA7Cit9CisKKy8qCiAgKiBJbm9kZSBob29rcwogICovCiAKQEAgLTQwMiw3ICs0NDEsNyBAQAogICovCiBzdGF0aWMgaW50IHNtYWNrX2lub2RlX2FsbG9jX3NlY3VyaXR5KHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7Ci0JaW5vZGUtPmlfc2VjdXJpdHkgPSBuZXdfaW5vZGVfc21hY2soY3VycmVudF9zZWN1cml0eSgpKTsKKwlpbm9kZS0+aV9zZWN1cml0eSA9IG5ld19pbm9kZV9zbWFjayhzbWtfb2ZfY3VycmVudCgpKTsKIAlpZiAoaW5vZGUtPmlfc2VjdXJpdHkgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9NRU07CiAJcmV0dXJuIDA7CkBAIC00MzQsNiArNDczLDggQEAKIAkJCQkgICAgIGNoYXIgKipuYW1lLCB2b2lkICoqdmFsdWUsIHNpemVfdCAqbGVuKQogewogCWNoYXIgKmlzcCA9IHNta19vZl9pbm9kZShpbm9kZSk7CisJY2hhciAqZHNwID0gc21rX29mX2lub2RlKGRpcik7CisJdTMyIG1heTsKIAogCWlmIChuYW1lKSB7CiAJCSpuYW1lID0ga3N0cmR1cChYQVRUUl9TTUFDS19TVUZGSVgsIEdGUF9LRVJORUwpOwpAQCAtNDQyLDYgKzQ4MywxNiBAQAogCX0KIAogCWlmICh2YWx1ZSkgeworCQltYXkgPSBzbWtfYWNjZXNzX2VudHJ5KHNta19vZl9jdXJyZW50KCksIGRzcCk7CisKKwkJLyoKKwkJICogSWYgdGhlIGFjY2VzcyBydWxlIGFsbG93cyB0cmFuc211dGF0aW9uIGFuZAorCQkgKiB0aGUgZGlyZWN0b3J5IHJlcXVlc3RzIHRyYW5zbXV0YXRpb24gdGhlbgorCQkgKiBieSBhbGwgbWVhbnMgdHJhbnNtdXRlLgorCQkgKi8KKwkJaWYgKCgobWF5ICYgTUFZX1RSQU5TTVVURSkgIT0gMCkgJiYgc21rX2lub2RlX3RyYW5zbXV0YWJsZShkaXIpKQorCQkJaXNwID0gZHNwOworCiAJCSp2YWx1ZSA9IGtzdHJkdXAoaXNwLCBHRlBfS0VSTkVMKTsKIAkJaWYgKCp2YWx1ZSA9PSBOVUxMKQogCQkJcmV0dXJuIC1FTk9NRU07CkBAIC02NjQsNyArNzE1LDggQEAKIAogCWlmIChzdHJjbXAobmFtZSwgWEFUVFJfTkFNRV9TTUFDSykgPT0gMCB8fAogCSAgICBzdHJjbXAobmFtZSwgWEFUVFJfTkFNRV9TTUFDS0lQSU4pID09IDAgfHwKLQkgICAgc3RyY21wKG5hbWUsIFhBVFRSX05BTUVfU01BQ0tJUE9VVCkgPT0gMCkgeworCSAgICBzdHJjbXAobmFtZSwgWEFUVFJfTkFNRV9TTUFDS0lQT1VUKSA9PSAwIHx8CisJICAgIHN0cmNtcChuYW1lLCBYQVRUUl9OQU1FX1NNQUNLRVhFQykgPT0gMCkgewogCQlpZiAoIWNhcGFibGUoQ0FQX01BQ19BRE1JTikpCiAJCQlyYyA9IC1FUEVSTTsKIAkJLyoKQEAgLTY3NCw2ICs3MjYsMTIgQEAKIAkJaWYgKHNpemUgPT0gMCB8fCBzaXplID49IFNNS19MQUJFTExFTiB8fAogCQkgICAgc21rX2ltcG9ydCh2YWx1ZSwgc2l6ZSkgPT0gTlVMTCkKIAkJCXJjID0gLUVJTlZBTDsKKwl9IGVsc2UgaWYgKHN0cmNtcChuYW1lLCBYQVRUUl9OQU1FX1NNQUNLVFJBTlNNVVRFKSA9PSAwKSB7CisJCWlmICghY2FwYWJsZShDQVBfTUFDX0FETUlOKSkKKwkJCXJjID0gLUVQRVJNOworCQlpZiAoc2l6ZSAhPSBUUkFOU19UUlVFX1NJWkUgfHwKKwkJICAgIHN0cm5jbXAodmFsdWUsIFRSQU5TX1RSVUUsIFRSQU5TX1RSVUVfU0laRSkgIT0gMCkKKwkJCXJjID0gLUVJTlZBTDsKIAl9IGVsc2UKIAkJcmMgPSBjYXBfaW5vZGVfc2V0eGF0dHIoZGVudHJ5LCBuYW1lLCB2YWx1ZSwgc2l6ZSwgZmxhZ3MpOwogCkBAIC03MDAsMjYgKzc1OCwyMyBAQAogc3RhdGljIHZvaWQgc21hY2tfaW5vZGVfcG9zdF9zZXR4YXR0cihzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGNvbnN0IGNoYXIgKm5hbWUsCiAJCQkJICAgICAgY29uc3Qgdm9pZCAqdmFsdWUsIHNpemVfdCBzaXplLCBpbnQgZmxhZ3MpCiB7Ci0Jc3RydWN0IGlub2RlX3NtYWNrICppc3A7CiAJY2hhciAqbnNwOworCXN0cnVjdCBpbm9kZV9zbWFjayAqaXNwID0gZGVudHJ5LT5kX2lub2RlLT5pX3NlY3VyaXR5OwogCi0JLyoKLQkgKiBOb3QgU01BQ0sKLQkgKi8KLQlpZiAoc3RyY21wKG5hbWUsIFhBVFRSX05BTUVfU01BQ0spKQotCQlyZXR1cm47Ci0KLQlpc3AgPSBkZW50cnktPmRfaW5vZGUtPmlfc2VjdXJpdHk7Ci0KLQkvKgotCSAqIE5vIGxvY2tpbmcgaXMgZG9uZSBoZXJlLiBUaGlzIGlzIGEgcG9pbnRlcgotCSAqIGFzc2lnbm1lbnQuCi0JICovCi0JbnNwID0gc21rX2ltcG9ydCh2YWx1ZSwgc2l6ZSk7Ci0JaWYgKG5zcCAhPSBOVUxMKQotCQlpc3AtPnNta19pbm9kZSA9IG5zcDsKLQllbHNlCi0JCWlzcC0+c21rX2lub2RlID0gc21hY2tfa25vd25faW52YWxpZC5zbWtfa25vd247CisJaWYgKHN0cmNtcChuYW1lLCBYQVRUUl9OQU1FX1NNQUNLKSA9PSAwKSB7CisJCW5zcCA9IHNta19pbXBvcnQodmFsdWUsIHNpemUpOworCQlpZiAobnNwICE9IE5VTEwpCisJCQlpc3AtPnNta19pbm9kZSA9IG5zcDsKKwkJZWxzZQorCQkJaXNwLT5zbWtfaW5vZGUgPSBzbWFja19rbm93bl9pbnZhbGlkLnNta19rbm93bjsKKwl9IGVsc2UgaWYgKHN0cmNtcChuYW1lLCBYQVRUUl9OQU1FX1NNQUNLRVhFQykgPT0gMCkgeworCQluc3AgPSBzbWtfaW1wb3J0KHZhbHVlLCBzaXplKTsKKwkJaWYgKG5zcCAhPSBOVUxMKQorCQkJaXNwLT5zbWtfdGFzayA9IG5zcDsKKwkJZWxzZQorCQkJaXNwLT5zbWtfdGFzayA9IHNtYWNrX2tub3duX2ludmFsaWQuc21rX2tub3duOworCX0gZWxzZSBpZiAoc3RyY21wKG5hbWUsIFhBVFRSX05BTUVfU01BQ0tUUkFOU01VVEUpID09IDApCisJCWlzcC0+c21rX2ZsYWdzIHw9IFNNS19JTk9ERV9UUkFOU01VVEU7CiAKIAlyZXR1cm47CiB9CkBAIC03NTIsMTIgKzgwNywxNSBAQAogICovCiBzdGF0aWMgaW50IHNtYWNrX2lub2RlX3JlbW92ZXhhdHRyKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgY29uc3QgY2hhciAqbmFtZSkKIHsKKwlzdHJ1Y3QgaW5vZGVfc21hY2sgKmlzcDsKIAlzdHJ1Y3Qgc21rX2F1ZGl0X2luZm8gYWQ7CiAJaW50IHJjID0gMDsKIAogCWlmIChzdHJjbXAobmFtZSwgWEFUVFJfTkFNRV9TTUFDSykgPT0gMCB8fAogCSAgICBzdHJjbXAobmFtZSwgWEFUVFJfTkFNRV9TTUFDS0lQSU4pID09IDAgfHwKLQkgICAgc3RyY21wKG5hbWUsIFhBVFRSX05BTUVfU01BQ0tJUE9VVCkgPT0gMCkgeworCSAgICBzdHJjbXAobmFtZSwgWEFUVFJfTkFNRV9TTUFDS0lQT1VUKSA9PSAwIHx8CisJICAgIHN0cmNtcChuYW1lLCBYQVRUUl9OQU1FX1NNQUNLRVhFQykgPT0gMCB8fAorCSAgICBzdHJjbXAobmFtZSwgWEFUVFJfTkFNRV9TTUFDS1RSQU5TTVVURSkgPT0gMCkgewogCQlpZiAoIWNhcGFibGUoQ0FQX01BQ19BRE1JTikpCiAJCQlyYyA9IC1FUEVSTTsKIAl9IGVsc2UKQEAgLTc2OCw2ICs4MjYsMTEgQEAKIAlpZiAocmMgPT0gMCkKIAkJcmMgPSBzbWtfY3VyYWNjKHNta19vZl9pbm9kZShkZW50cnktPmRfaW5vZGUpLCBNQVlfV1JJVEUsICZhZCk7CiAKKwlpZiAocmMgPT0gMCkgeworCQlpc3AgPSBkZW50cnktPmRfaW5vZGUtPmlfc2VjdXJpdHk7CisJCWlzcC0+c21rX3Rhc2sgPSBOVUxMOworCX0KKwogCXJldHVybiByYzsKIH0KIApAQCAtODk1LDcgKzk1OCw3IEBACiAgKi8KIHN0YXRpYyBpbnQgc21hY2tfZmlsZV9hbGxvY19zZWN1cml0eShzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKLQlmaWxlLT5mX3NlY3VyaXR5ID0gY3VycmVudF9zZWN1cml0eSgpOworCWZpbGUtPmZfc2VjdXJpdHkgPSBzbWtfb2ZfY3VycmVudCgpOwogCXJldHVybiAwOwogfQogCkBAIC0xMDA1LDcgKzEwNjgsNyBAQAogICovCiBzdGF0aWMgaW50IHNtYWNrX2ZpbGVfc2V0X2Zvd25lcihzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKLQlmaWxlLT5mX3NlY3VyaXR5ID0gY3VycmVudF9zZWN1cml0eSgpOworCWZpbGUtPmZfc2VjdXJpdHkgPSBzbWtfb2ZfY3VycmVudCgpOwogCXJldHVybiAwOwogfQogCkBAIC0xMDI1LDcgKzEwODgsNyBAQAogewogCXN0cnVjdCBmaWxlICpmaWxlOwogCWludCByYzsKLQljaGFyICp0c3AgPSB0c2stPmNyZWQtPnNlY3VyaXR5OworCWNoYXIgKnRzcCA9IHNta19vZl90YXNrKHRzay0+Y3JlZC0+c2VjdXJpdHkpOwogCXN0cnVjdCBzbWtfYXVkaXRfaW5mbyBhZDsKIAogCS8qCkBAIC0xMDgyLDcgKzExNDUsOSBAQAogICovCiBzdGF0aWMgaW50IHNtYWNrX2NyZWRfYWxsb2NfYmxhbmsoc3RydWN0IGNyZWQgKmNyZWQsIGdmcF90IGdmcCkKIHsKLQljcmVkLT5zZWN1cml0eSA9IE5VTEw7CisJY3JlZC0+c2VjdXJpdHkgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgdGFza19zbWFjayksIGdmcCk7CisJaWYgKGNyZWQtPnNlY3VyaXR5ID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOwogCXJldHVybiAwOwogfQogCkBAIC0xMDk3LDcgKzExNjIsNyBAQAogICovCiBzdGF0aWMgdm9pZCBzbWFja19jcmVkX2ZyZWUoc3RydWN0IGNyZWQgKmNyZWQpCiB7Ci0JY3JlZC0+c2VjdXJpdHkgPSBOVUxMOworCWtmcmVlKGNyZWQtPnNlY3VyaXR5KTsKIH0KIAogLyoqCkBAIC0xMTExLDcgKzExNzYsMTYgQEAKIHN0YXRpYyBpbnQgc21hY2tfY3JlZF9wcmVwYXJlKHN0cnVjdCBjcmVkICpuZXcsIGNvbnN0IHN0cnVjdCBjcmVkICpvbGQsCiAJCQkgICAgICBnZnBfdCBnZnApCiB7Ci0JbmV3LT5zZWN1cml0eSA9IG9sZC0+c2VjdXJpdHk7CisJc3RydWN0IHRhc2tfc21hY2sgKm9sZF90c3AgPSBvbGQtPnNlY3VyaXR5OworCXN0cnVjdCB0YXNrX3NtYWNrICpuZXdfdHNwOworCisJbmV3X3RzcCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB0YXNrX3NtYWNrKSwgZ2ZwKTsKKwlpZiAobmV3X3RzcCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCW5ld190c3AtPnNta190YXNrID0gb2xkX3RzcC0+c21rX3Rhc2s7CisJbmV3X3RzcC0+c21rX2ZvcmtlZCA9IG9sZF90c3AtPnNta190YXNrOworCW5ldy0+c2VjdXJpdHkgPSBuZXdfdHNwOwogCXJldHVybiAwOwogfQogCkBAIC0xMTI0LDcgKzExOTgsMTEgQEAKICAqLwogc3RhdGljIHZvaWQgc21hY2tfY3JlZF90cmFuc2ZlcihzdHJ1Y3QgY3JlZCAqbmV3LCBjb25zdCBzdHJ1Y3QgY3JlZCAqb2xkKQogewotCW5ldy0+c2VjdXJpdHkgPSBvbGQtPnNlY3VyaXR5OworCXN0cnVjdCB0YXNrX3NtYWNrICpvbGRfdHNwID0gb2xkLT5zZWN1cml0eTsKKwlzdHJ1Y3QgdGFza19zbWFjayAqbmV3X3RzcCA9IG5ldy0+c2VjdXJpdHk7CisKKwluZXdfdHNwLT5zbWtfdGFzayA9IG9sZF90c3AtPnNta190YXNrOworCW5ld190c3AtPnNta19mb3JrZWQgPSBvbGRfdHNwLT5zbWtfdGFzazsKIH0KIAogLyoqCkBAIC0xMTM2LDEyICsxMjE0LDEzIEBACiAgKi8KIHN0YXRpYyBpbnQgc21hY2tfa2VybmVsX2FjdF9hcyhzdHJ1Y3QgY3JlZCAqbmV3LCB1MzIgc2VjaWQpCiB7CisJc3RydWN0IHRhc2tfc21hY2sgKm5ld190c3AgPSBuZXctPnNlY3VyaXR5OwogCWNoYXIgKnNtYWNrID0gc21hY2tfZnJvbV9zZWNpZChzZWNpZCk7CiAKIAlpZiAoc21hY2sgPT0gTlVMTCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQluZXctPnNlY3VyaXR5ID0gc21hY2s7CisJbmV3X3RzcC0+c21rX3Rhc2sgPSBzbWFjazsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTE1Nyw4ICsxMjM2LDEwIEBACiAJCQkJCXN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7CiAJc3RydWN0IGlub2RlX3NtYWNrICppc3AgPSBpbm9kZS0+aV9zZWN1cml0eTsKKwlzdHJ1Y3QgdGFza19zbWFjayAqdHNwID0gbmV3LT5zZWN1cml0eTsKIAotCW5ldy0+c2VjdXJpdHkgPSBpc3AtPnNta19pbm9kZTsKKwl0c3AtPnNta19mb3JrZWQgPSBpc3AtPnNta19pbm9kZTsKKwl0c3AtPnNta190YXNrID0gaXNwLT5zbWtfaW5vZGU7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTExNzUsNyArMTI1Niw3IEBACiAKIAlzbWtfYWRfaW5pdCgmYWQsIF9fZnVuY19fLCBMU01fQVVESVRfREFUQV9UQVNLKTsKIAlzbWtfYWRfc2V0ZmllbGRfdV90c2soJmFkLCBwKTsKLQlyZXR1cm4gc21rX2N1cmFjYyh0YXNrX3NlY3VyaXR5KHApLCBhY2Nlc3MsICZhZCk7CisJcmV0dXJuIHNta19jdXJhY2Moc21rX29mX3Rhc2sodGFza19zZWN1cml0eShwKSksIGFjY2VzcywgJmFkKTsKIH0KIAogLyoqCkBAIC0xMjIxLDcgKzEzMDIsNyBAQAogICovCiBzdGF0aWMgdm9pZCBzbWFja190YXNrX2dldHNlY2lkKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwgdTMyICpzZWNpZCkKIHsKLQkqc2VjaWQgPSBzbWFja190b19zZWNpZCh0YXNrX3NlY3VyaXR5KHApKTsKKwkqc2VjaWQgPSBzbWFja190b19zZWNpZChzbWtfb2ZfdGFzayh0YXNrX3NlY3VyaXR5KHApKSk7CiB9CiAKIC8qKgpAQCAtMTMzMywxNCArMTQxNCwxNSBAQAogCSAqIGNhbiB3cml0ZSB0aGUgcmVjZWl2ZXIuCiAJICovCiAJaWYgKHNlY2lkID09IDApCi0JCXJldHVybiBzbWtfY3VyYWNjKHRhc2tfc2VjdXJpdHkocCksIE1BWV9XUklURSwgJmFkKTsKKwkJcmV0dXJuIHNta19jdXJhY2Moc21rX29mX3Rhc2sodGFza19zZWN1cml0eShwKSksIE1BWV9XUklURSwKKwkJCQkgICZhZCk7CiAJLyoKIAkgKiBJZiB0aGUgc2VjaWQgaXNuJ3QgMCB3ZSdyZSBkZWFsaW5nIHdpdGggc29tZSBVU0IgSU8KIAkgKiBzcGVjaWZpYyBiZWhhdmlvci4gVGhpcyBpcyBub3QgY2xlYW4uIEZvciBvbmUgdGhpbmcKIAkgKiB3ZSBjYW4ndCB0YWtlIHByaXZpbGVnZSBpbnRvIGFjY291bnQuCiAJICovCi0JcmV0dXJuIHNta19hY2Nlc3Moc21hY2tfZnJvbV9zZWNpZChzZWNpZCksIHRhc2tfc2VjdXJpdHkocCksCi0JCQkgIE1BWV9XUklURSwgJmFkKTsKKwlyZXR1cm4gc21rX2FjY2VzcyhzbWFja19mcm9tX3NlY2lkKHNlY2lkKSwKKwkJCSAgc21rX29mX3Rhc2sodGFza19zZWN1cml0eShwKSksIE1BWV9XUklURSwgJmFkKTsKIH0KIAogLyoqCkBAIC0xMzUyLDEyICsxNDM0LDEyIEBACiBzdGF0aWMgaW50IHNtYWNrX3Rhc2tfd2FpdChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApCiB7CiAJc3RydWN0IHNta19hdWRpdF9pbmZvIGFkOwotCWNoYXIgKnNwID0gY3VycmVudF9zZWN1cml0eSgpOwotCWNoYXIgKnRzcCA9IHRhc2tfc2VjdXJpdHkocCk7CisJY2hhciAqc3AgPSBzbWtfb2ZfY3VycmVudCgpOworCWNoYXIgKnRzcCA9IHNta19vZl9mb3JrZWQodGFza19zZWN1cml0eShwKSk7CiAJaW50IHJjOwogCiAJLyogd2UgZG9uJ3QgbG9nIGhlcmUsIHdlIGNhbiBiZSBvdmVycmlkZW4gKi8KLQlyYyA9IHNta19hY2Nlc3Moc3AsIHRzcCwgTUFZX1dSSVRFLCBOVUxMKTsKKwlyYyA9IHNta19hY2Nlc3ModHNwLCBzcCwgTUFZX1dSSVRFLCBOVUxMKTsKIAlpZiAocmMgPT0gMCkKIAkJZ290byBvdXRfbG9nOwogCkBAIC0xMzc4LDcgKzE0NjAsNyBAQAogIG91dF9sb2c6CiAJc21rX2FkX2luaXQoJmFkLCBfX2Z1bmNfXywgTFNNX0FVRElUX0RBVEFfVEFTSyk7CiAJc21rX2FkX3NldGZpZWxkX3VfdHNrKCZhZCwgcCk7Ci0Jc21hY2tfbG9nKHNwLCB0c3AsIE1BWV9XUklURSwgcmMsICZhZCk7CisJc21hY2tfbG9nKHRzcCwgc3AsIE1BWV9XUklURSwgcmMsICZhZCk7CiAJcmV0dXJuIHJjOwogfQogCkBAIC0xMzkyLDcgKzE0NzQsNyBAQAogc3RhdGljIHZvaWQgc21hY2tfdGFza190b19pbm9kZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsIHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7CiAJc3RydWN0IGlub2RlX3NtYWNrICppc3AgPSBpbm9kZS0+aV9zZWN1cml0eTsKLQlpc3AtPnNta19pbm9kZSA9IHRhc2tfc2VjdXJpdHkocCk7CisJaXNwLT5zbWtfaW5vZGUgPSBzbWtfb2ZfdGFzayh0YXNrX3NlY3VyaXR5KHApKTsKIH0KIAogLyoKQEAgLTE0MTEsNyArMTQ5Myw3IEBACiAgKi8KIHN0YXRpYyBpbnQgc21hY2tfc2tfYWxsb2Nfc2VjdXJpdHkoc3RydWN0IHNvY2sgKnNrLCBpbnQgZmFtaWx5LCBnZnBfdCBnZnBfZmxhZ3MpCiB7Ci0JY2hhciAqY3NwID0gY3VycmVudF9zZWN1cml0eSgpOworCWNoYXIgKmNzcCA9IHNta19vZl9jdXJyZW50KCk7CiAJc3RydWN0IHNvY2tldF9zbWFjayAqc3NwOwogCiAJc3NwID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHNvY2tldF9zbWFjayksIGdmcF9mbGFncyk7CkBAIC0xNjY3LDEwICsxNzQ5LDEzIEBACiAJCXNzcC0+c21rX2luID0gc3A7CiAJZWxzZSBpZiAoc3RyY21wKG5hbWUsIFhBVFRSX1NNQUNLX0lQT1VUKSA9PSAwKSB7CiAJCXNzcC0+c21rX291dCA9IHNwOwotCQlyYyA9IHNtYWNrX25ldGxhYmVsKHNvY2stPnNrLCBTTUFDS19DSVBTT19TT0NLRVQpOwotCQlpZiAocmMgIT0gMCkKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIlNtYWNrOiBcIiVzXCIgbmV0bGJsIGVycm9yICVkLlxuIiwKLQkJCSAgICAgICBfX2Z1bmNfXywgLXJjKTsKKwkJaWYgKHNvY2stPnNrLT5za19mYW1pbHkgIT0gUEZfVU5JWCkgeworCQkJcmMgPSBzbWFja19uZXRsYWJlbChzb2NrLT5zaywgU01BQ0tfQ0lQU09fU09DS0VUKTsKKwkJCWlmIChyYyAhPSAwKQorCQkJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCQkJIlNtYWNrOiBcIiVzXCIgbmV0bGJsIGVycm9yICVkLlxuIiwKKwkJCQkJX19mdW5jX18sIC1yYyk7CisJCX0KIAl9IGVsc2UKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCkBAIC0xNzQ5LDcgKzE4MzQsNyBAQAogICovCiBzdGF0aWMgaW50IHNtYWNrX21zZ19tc2dfYWxsb2Nfc2VjdXJpdHkoc3RydWN0IG1zZ19tc2cgKm1zZykKIHsKLQltc2ctPnNlY3VyaXR5ID0gY3VycmVudF9zZWN1cml0eSgpOworCW1zZy0+c2VjdXJpdHkgPSBzbWtfb2ZfY3VycmVudCgpOwogCXJldHVybiAwOwogfQogCkBAIC0xNzg1LDcgKzE4NzAsNyBAQAogewogCXN0cnVjdCBrZXJuX2lwY19wZXJtICppc3AgPSAmc2hwLT5zaG1fcGVybTsKIAotCWlzcC0+c2VjdXJpdHkgPSBjdXJyZW50X3NlY3VyaXR5KCk7CisJaXNwLT5zZWN1cml0eSA9IHNta19vZl9jdXJyZW50KCk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE5MDgsNyArMTk5Myw3IEBACiB7CiAJc3RydWN0IGtlcm5faXBjX3Blcm0gKmlzcCA9ICZzbWEtPnNlbV9wZXJtOwogCi0JaXNwLT5zZWN1cml0eSA9IGN1cnJlbnRfc2VjdXJpdHkoKTsKKwlpc3AtPnNlY3VyaXR5ID0gc21rX29mX2N1cnJlbnQoKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMjAyNiw3ICsyMTExLDcgQEAKIHsKIAlzdHJ1Y3Qga2Vybl9pcGNfcGVybSAqa2lzcCA9ICZtc3EtPnFfcGVybTsKIAotCWtpc3AtPnNlY3VyaXR5ID0gY3VycmVudF9zZWN1cml0eSgpOworCWtpc3AtPnNlY3VyaXR5ID0gc21rX29mX2N1cnJlbnQoKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMjE5OCw5ICsyMjgzLDExIEBACiAJc3RydWN0IHN1cGVyX2Jsb2NrICpzYnA7CiAJc3RydWN0IHN1cGVyYmxvY2tfc21hY2sgKnNic3A7CiAJc3RydWN0IGlub2RlX3NtYWNrICppc3A7Ci0JY2hhciAqY3NwID0gY3VycmVudF9zZWN1cml0eSgpOworCWNoYXIgKmNzcCA9IHNta19vZl9jdXJyZW50KCk7CiAJY2hhciAqZmV0Y2hlZDsKIAljaGFyICpmaW5hbDsKKwljaGFyIHRyYXR0cltUUkFOU19UUlVFX1NJWkVdOworCWludCB0cmFuc2ZsYWcgPSAwOwogCXN0cnVjdCBkZW50cnkgKmRwOwogCiAJaWYgKGlub2RlID09IE5VTEwpCkBAIC0yMjY3LDkgKzIzNTQsMTAgQEAKIAkJYnJlYWs7CiAJY2FzZSBTT0NLRlNfTUFHSUM6CiAJCS8qCi0JCSAqIENhc2V5IHNheXMgc29ja2V0cyBnZXQgdGhlIHNtYWNrIG9mIHRoZSB0YXNrLgorCQkgKiBTb2NrZXQgYWNjZXNzIGlzIGNvbnRyb2xsZWQgYnkgdGhlIHNvY2tldAorCQkgKiBzdHJ1Y3R1cmVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgdGFzayBpbnZvbHZlZC4KIAkJICovCi0JCWZpbmFsID0gY3NwOworCQlmaW5hbCA9IHNtYWNrX2tub3duX3N0YXIuc21rX2tub3duOwogCQlicmVhazsKIAljYXNlIFBST0NfU1VQRVJfTUFHSUM6CiAJCS8qCkBAIC0yMjk2LDcgKzIzODQsMTYgQEAKIAkJLyoKIAkJICogVGhpcyBpc24ndCBhbiB1bmRlcnN0b29kIHNwZWNpYWwgY2FzZS4KIAkJICogR2V0IHRoZSB2YWx1ZSBmcm9tIHRoZSB4YXR0ci4KLQkJICoKKwkJICovCisKKwkJLyoKKwkJICogVU5JWCBkb21haW4gc29ja2V0cyB1c2UgbG93ZXIgbGV2ZWwgc29ja2V0IGRhdGEuCisJCSAqLworCQlpZiAoU19JU1NPQ0soaW5vZGUtPmlfbW9kZSkpIHsKKwkJCWZpbmFsID0gc21hY2tfa25vd25fc3Rhci5zbWtfa25vd247CisJCQlicmVhazsKKwkJfQorCQkvKgogCQkgKiBObyB4YXR0ciBzdXBwb3J0IG1lYW5zLCBhbGFzLCBubyBTTUFDSyBsYWJlbC4KIAkJICogVXNlIHRoZSBhZm9yZWFwcGxpZWQgZGVmYXVsdC4KIAkJICogSXQgd291bGQgYmUgY3VyaW91cyBpZiB0aGUgbGFiZWwgb2YgdGhlIHRhc2sKQEAgLTIzMDgsOSArMjQwNSwyMSBAQAogCQkgKiBHZXQgdGhlIGRlbnRyeSBmb3IgeGF0dHIuCiAJCSAqLwogCQlkcCA9IGRnZXQob3B0X2RlbnRyeSk7Ci0JCWZldGNoZWQgPSBzbWtfZmV0Y2goaW5vZGUsIGRwKTsKLQkJaWYgKGZldGNoZWQgIT0gTlVMTCkKKwkJZmV0Y2hlZCA9IHNta19mZXRjaChYQVRUUl9OQU1FX1NNQUNLLCBpbm9kZSwgZHApOworCQlpZiAoZmV0Y2hlZCAhPSBOVUxMKSB7CiAJCQlmaW5hbCA9IGZldGNoZWQ7CisJCQlpZiAoU19JU0RJUihpbm9kZS0+aV9tb2RlKSkgeworCQkJCXRyYXR0clswXSA9ICdcMCc7CisJCQkJaW5vZGUtPmlfb3AtPmdldHhhdHRyKGRwLAorCQkJCQlYQVRUUl9OQU1FX1NNQUNLVFJBTlNNVVRFLAorCQkJCQl0cmF0dHIsIFRSQU5TX1RSVUVfU0laRSk7CisJCQkJaWYgKHN0cm5jbXAodHJhdHRyLCBUUkFOU19UUlVFLAorCQkJCQkgICAgVFJBTlNfVFJVRV9TSVpFKSA9PSAwKQorCQkJCQl0cmFuc2ZsYWcgPSBTTUtfSU5PREVfVFJBTlNNVVRFOworCQkJfQorCQl9CisJCWlzcC0+c21rX3Rhc2sgPSBzbWtfZmV0Y2goWEFUVFJfTkFNRV9TTUFDS0VYRUMsIGlub2RlLCBkcCk7CisKIAkJZHB1dChkcCk7CiAJCWJyZWFrOwogCX0KQEAgLTIzMjAsNyArMjQyOSw3IEBACiAJZWxzZQogCQlpc3AtPnNta19pbm9kZSA9IGZpbmFsOwogCi0JaXNwLT5zbWtfZmxhZ3MgfD0gU01LX0lOT0RFX0lOU1RBTlQ7CisJaXNwLT5zbWtfZmxhZ3MgfD0gKFNNS19JTk9ERV9JTlNUQU5UIHwgdHJhbnNmbGFnKTsKIAogdW5sb2NrYW5kb3V0OgogCW11dGV4X3VubG9jaygmaXNwLT5zbWtfbG9jayk7CkBAIC0yMzQ1LDcgKzI0NTQsNyBAQAogCWlmIChzdHJjbXAobmFtZSwgImN1cnJlbnQiKSAhPSAwKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWNwID0ga3N0cmR1cCh0YXNrX3NlY3VyaXR5KHApLCBHRlBfS0VSTkVMKTsKKwljcCA9IGtzdHJkdXAoc21rX29mX3Rhc2sodGFza19zZWN1cml0eShwKSksIEdGUF9LRVJORUwpOwogCWlmIChjcCA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT01FTTsKIApAQCAtMjM2OSw2ICsyNDc4LDggQEAKIHN0YXRpYyBpbnQgc21hY2tfc2V0cHJvY2F0dHIoc3RydWN0IHRhc2tfc3RydWN0ICpwLCBjaGFyICpuYW1lLAogCQkJICAgICB2b2lkICp2YWx1ZSwgc2l6ZV90IHNpemUpCiB7CisJc3RydWN0IHRhc2tfc21hY2sgKnRzcDsKKwlzdHJ1Y3QgdGFza19zbWFjayAqb2xkdHNwOwogCXN0cnVjdCBjcmVkICpuZXc7CiAJY2hhciAqbmV3c21hY2s7CiAKQEAgLTIzOTgsMTAgKzI1MDksMTggQEAKIAlpZiAobmV3c21hY2sgPT0gc21hY2tfa25vd25fd2ViLnNta19rbm93bikKIAkJcmV0dXJuIC1FUEVSTTsKIAorCW9sZHRzcCA9IHAtPmNyZWQtPnNlY3VyaXR5OwogCW5ldyA9IHByZXBhcmVfY3JlZHMoKTsKIAlpZiAobmV3ID09IE5VTEwpCiAJCXJldHVybiAtRU5PTUVNOwotCW5ldy0+c2VjdXJpdHkgPSBuZXdzbWFjazsKKwl0c3AgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgdGFza19zbWFjayksIEdGUF9LRVJORUwpOworCWlmICh0c3AgPT0gTlVMTCkgeworCQlrZnJlZShuZXcpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJdHNwLT5zbWtfdGFzayA9IG5ld3NtYWNrOworCXRzcC0+c21rX2ZvcmtlZCA9IG9sZHRzcC0+c21rX2ZvcmtlZDsKKwluZXctPnNlY3VyaXR5ID0gdHNwOwogCWNvbW1pdF9jcmVkcyhuZXcpOwogCXJldHVybiBzaXplOwogfQpAQCAtMjQxOCwxNCArMjUzNywxOCBAQAogc3RhdGljIGludCBzbWFja191bml4X3N0cmVhbV9jb25uZWN0KHN0cnVjdCBzb2NrICpzb2NrLAogCQkJCSAgICAgc3RydWN0IHNvY2sgKm90aGVyLCBzdHJ1Y3Qgc29jayAqbmV3c2spCiB7Ci0Jc3RydWN0IGlub2RlICpzcCA9IFNPQ0tfSU5PREUoc29jay0+c2tfc29ja2V0KTsKLQlzdHJ1Y3QgaW5vZGUgKm9wID0gU09DS19JTk9ERShvdGhlci0+c2tfc29ja2V0KTsKKwlzdHJ1Y3Qgc29ja2V0X3NtYWNrICpzc3AgPSBzb2NrLT5za19zZWN1cml0eTsKKwlzdHJ1Y3Qgc29ja2V0X3NtYWNrICpvc3AgPSBvdGhlci0+c2tfc2VjdXJpdHk7CiAJc3RydWN0IHNta19hdWRpdF9pbmZvIGFkOworCWludCByYyA9IDA7CiAKIAlzbWtfYWRfaW5pdCgmYWQsIF9fZnVuY19fLCBMU01fQVVESVRfREFUQV9ORVQpOwogCXNta19hZF9zZXRmaWVsZF91X25ldF9zaygmYWQsIG90aGVyKTsKLQlyZXR1cm4gc21rX2FjY2VzcyhzbWtfb2ZfaW5vZGUoc3ApLCBzbWtfb2ZfaW5vZGUob3ApLAotCQkJCSBNQVlfUkVBRFdSSVRFLCAmYWQpOworCisJaWYgKCFjYXBhYmxlKENBUF9NQUNfT1ZFUlJJREUpKQorCQlyYyA9IHNta19hY2Nlc3Moc3NwLT5zbWtfb3V0LCBvc3AtPnNta19pbiwgTUFZX1dSSVRFLCAmYWQpOworCisJcmV0dXJuIHJjOwogfQogCiAvKioKQEAgLTI0MzgsMTMgKzI1NjEsMTggQEAKICAqLwogc3RhdGljIGludCBzbWFja191bml4X21heV9zZW5kKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBzb2NrZXQgKm90aGVyKQogewotCXN0cnVjdCBpbm9kZSAqc3AgPSBTT0NLX0lOT0RFKHNvY2spOwotCXN0cnVjdCBpbm9kZSAqb3AgPSBTT0NLX0lOT0RFKG90aGVyKTsKKwlzdHJ1Y3Qgc29ja2V0X3NtYWNrICpzc3AgPSBzb2NrLT5zay0+c2tfc2VjdXJpdHk7CisJc3RydWN0IHNvY2tldF9zbWFjayAqb3NwID0gb3RoZXItPnNrLT5za19zZWN1cml0eTsKIAlzdHJ1Y3Qgc21rX2F1ZGl0X2luZm8gYWQ7CisJaW50IHJjID0gMDsKIAogCXNta19hZF9pbml0KCZhZCwgX19mdW5jX18sIExTTV9BVURJVF9EQVRBX05FVCk7CiAJc21rX2FkX3NldGZpZWxkX3VfbmV0X3NrKCZhZCwgb3RoZXItPnNrKTsKLQlyZXR1cm4gc21rX2FjY2VzcyhzbWtfb2ZfaW5vZGUoc3ApLCBzbWtfb2ZfaW5vZGUob3ApLCBNQVlfV1JJVEUsICZhZCk7CisKKwlpZiAoIWNhcGFibGUoQ0FQX01BQ19PVkVSUklERSkpCisJCXJjID0gc21rX2FjY2Vzcyhzc3AtPnNta19vdXQsIG9zcC0+c21rX2luLCBNQVlfV1JJVEUsICZhZCk7CisKKwlyZXR1cm4gcmM7CiB9CiAKIC8qKgpAQCAtMjYyOSw3ICsyNzU3LDcgQEAKIAogLyoqCiAgKiBzbWFja19zb2NrZXRfZ2V0cGVlcnNlY19kZ3JhbSAtIHB1bGwgaW4gcGFja2V0IGxhYmVsCi0gKiBAc29jazogdGhlIHNvY2tldAorICogQHNvY2s6IHRoZSBwZWVyIHNvY2tldAogICogQHNrYjogcGFja2V0IGRhdGEKICAqIEBzZWNpZDogcG9pbnRlciB0byB3aGVyZSB0byBwdXQgdGhlIHNlY2lkIG9mIHRoZSBwYWNrZXQKICAqCkBAIC0yNjQwLDQxICsyNzY4LDM5IEBACiAKIHsKIAlzdHJ1Y3QgbmV0bGJsX2xzbV9zZWNhdHRyIHNlY2F0dHI7Ci0Jc3RydWN0IHNvY2sgKnNrOworCXN0cnVjdCBzb2NrZXRfc21hY2sgKnNwOwogCWNoYXIgc21hY2tbU01LX0xBQkVMTEVOXTsKLQlpbnQgZmFtaWx5ID0gUEZfSU5FVDsKLQl1MzIgczsKKwlpbnQgZmFtaWx5ID0gUEZfVU5TUEVDOworCXUzMiBzID0gMDsJLyogMCBpcyB0aGUgaW52YWxpZCBzZWNpZCAqLwogCWludCByYzsKIAotCS8qCi0JICogT25seSB3b3JrcyBmb3IgZmFtaWxpZXMgd2l0aCBwYWNrZXRzLgotCSAqLwotCWlmIChzb2NrICE9IE5VTEwpIHsKLQkJc2sgPSBzb2NrLT5zazsKLQkJaWYgKHNrLT5za19mYW1pbHkgIT0gUEZfSU5FVCAmJiBzay0+c2tfZmFtaWx5ICE9IFBGX0lORVQ2KQotCQkJcmV0dXJuIDA7Ci0JCWZhbWlseSA9IHNrLT5za19mYW1pbHk7CisJaWYgKHNrYiAhPSBOVUxMKSB7CisJCWlmIChza2ItPnByb3RvY29sID09IGh0b25zKEVUSF9QX0lQKSkKKwkJCWZhbWlseSA9IFBGX0lORVQ7CisJCWVsc2UgaWYgKHNrYi0+cHJvdG9jb2wgPT0gaHRvbnMoRVRIX1BfSVBWNikpCisJCQlmYW1pbHkgPSBQRl9JTkVUNjsKIAl9Ci0JLyoKLQkgKiBUcmFuc2xhdGUgd2hhdCBuZXRsYWJlbCBnYXZlIHVzLgotCSAqLwotCW5ldGxibF9zZWNhdHRyX2luaXQoJnNlY2F0dHIpOwotCXJjID0gbmV0bGJsX3NrYnVmZl9nZXRhdHRyKHNrYiwgZmFtaWx5LCAmc2VjYXR0cik7Ci0JaWYgKHJjID09IDApCi0JCXNtYWNrX2Zyb21fc2VjYXR0cigmc2VjYXR0ciwgc21hY2spOwotCW5ldGxibF9zZWNhdHRyX2Rlc3Ryb3koJnNlY2F0dHIpOworCWlmIChmYW1pbHkgPT0gUEZfVU5TUEVDICYmIHNvY2sgIT0gTlVMTCkKKwkJZmFtaWx5ID0gc29jay0+c2stPnNrX2ZhbWlseTsKIAotCS8qCi0JICogR2l2ZSB1cCBpZiB3ZSBjb3VsZG4ndCBnZXQgYW55dGhpbmcKLQkgKi8KLQlpZiAocmMgIT0gMCkKLQkJcmV0dXJuIHJjOwotCi0JcyA9IHNtYWNrX3RvX3NlY2lkKHNtYWNrKTsKKwlpZiAoZmFtaWx5ID09IFBGX1VOSVgpIHsKKwkJc3AgPSBzb2NrLT5zay0+c2tfc2VjdXJpdHk7CisJCXMgPSBzbWFja190b19zZWNpZChzcC0+c21rX291dCk7CisJfSBlbHNlIGlmIChmYW1pbHkgPT0gUEZfSU5FVCB8fCBmYW1pbHkgPT0gUEZfSU5FVDYpIHsKKwkJLyoKKwkJICogVHJhbnNsYXRlIHdoYXQgbmV0bGFiZWwgZ2F2ZSB1cy4KKwkJICovCisJCW5ldGxibF9zZWNhdHRyX2luaXQoJnNlY2F0dHIpOworCQlyYyA9IG5ldGxibF9za2J1ZmZfZ2V0YXR0cihza2IsIGZhbWlseSwgJnNlY2F0dHIpOworCQlpZiAocmMgPT0gMCkgeworCQkJc21hY2tfZnJvbV9zZWNhdHRyKCZzZWNhdHRyLCBzbWFjayk7CisJCQlzID0gc21hY2tfdG9fc2VjaWQoc21hY2spOworCQl9CisJCW5ldGxibF9zZWNhdHRyX2Rlc3Ryb3koJnNlY2F0dHIpOworCX0KKwkqc2VjaWQgPSBzOwogCWlmIChzID09IDApCiAJCXJldHVybiAtRUlOVkFMOwotCi0JKnNlY2lkID0gczsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMjY5NSw3ICsyODIxLDcgQEAKIAkJcmV0dXJuOwogCiAJc3NwID0gc2stPnNrX3NlY3VyaXR5OwotCXNzcC0+c21rX2luID0gc3NwLT5zbWtfb3V0ID0gY3VycmVudF9zZWN1cml0eSgpOworCXNzcC0+c21rX2luID0gc3NwLT5zbWtfb3V0ID0gc21rX29mX2N1cnJlbnQoKTsKIAkvKiBjc3NwLT5zbWtfcGFja2V0IGlzIGFscmVhZHkgc2V0IGluIHNtYWNrX2luZXRfY3NrX2Nsb25lKCkgKi8KIH0KIApAQCAtMjgxNiw3ICsyOTQyLDcgQEAKIHN0YXRpYyBpbnQgc21hY2tfa2V5X2FsbG9jKHN0cnVjdCBrZXkgKmtleSwgY29uc3Qgc3RydWN0IGNyZWQgKmNyZWQsCiAJCQkgICB1bnNpZ25lZCBsb25nIGZsYWdzKQogewotCWtleS0+c2VjdXJpdHkgPSBjcmVkLT5zZWN1cml0eTsKKwlrZXktPnNlY3VyaXR5ID0gc21rX29mX3Rhc2soY3JlZC0+c2VjdXJpdHkpOwogCXJldHVybiAwOwogfQogCkBAIC0yODQ1LDYgKzI5NzEsNyBAQAogewogCXN0cnVjdCBrZXkgKmtleXA7CiAJc3RydWN0IHNta19hdWRpdF9pbmZvIGFkOworCWNoYXIgKnRzcCA9IHNta19vZl90YXNrKGNyZWQtPnNlY3VyaXR5KTsKIAogCWtleXAgPSBrZXlfcmVmX3RvX3B0cihrZXlfcmVmKTsKIAlpZiAoa2V5cCA9PSBOVUxMKQpAQCAtMjg1OCwxNCArMjk4NSwxNCBAQAogCS8qCiAJICogVGhpcyBzaG91bGQgbm90IG9jY3VyCiAJICovCi0JaWYgKGNyZWQtPnNlY3VyaXR5ID09IE5VTEwpCisJaWYgKHRzcCA9PSBOVUxMKQogCQlyZXR1cm4gLUVBQ0NFUzsKICNpZmRlZiBDT05GSUdfQVVESVQKIAlzbWtfYWRfaW5pdCgmYWQsIF9fZnVuY19fLCBMU01fQVVESVRfREFUQV9LRVkpOwogCWFkLmEudS5rZXlfc3RydWN0LmtleSA9IGtleXAtPnNlcmlhbDsKIAlhZC5hLnUua2V5X3N0cnVjdC5rZXlfZGVzYyA9IGtleXAtPmRlc2NyaXB0aW9uOwogI2VuZGlmCi0JcmV0dXJuIHNta19hY2Nlc3MoY3JlZC0+c2VjdXJpdHksIGtleXAtPnNlY3VyaXR5LAorCXJldHVybiBzbWtfYWNjZXNzKHRzcCwga2V5cC0+c2VjdXJpdHksCiAJCQkJIE1BWV9SRUFEV1JJVEUsICZhZCk7CiB9CiAjZW5kaWYgLyogQ09ORklHX0tFWVMgKi8KQEAgLTMwNjcsNiArMzE5NCw4IEBACiAJLnNiX21vdW50ID0gCQkJc21hY2tfc2JfbW91bnQsCiAJLnNiX3Vtb3VudCA9IAkJCXNtYWNrX3NiX3Vtb3VudCwKIAorCS5icHJtX3NldF9jcmVkcyA9CQlzbWFja19icHJtX3NldF9jcmVkcywKKwogCS5pbm9kZV9hbGxvY19zZWN1cml0eSA9IAlzbWFja19pbm9kZV9hbGxvY19zZWN1cml0eSwKIAkuaW5vZGVfZnJlZV9zZWN1cml0eSA9IAkJc21hY2tfaW5vZGVfZnJlZV9zZWN1cml0eSwKIAkuaW5vZGVfaW5pdF9zZWN1cml0eSA9IAkJc21hY2tfaW5vZGVfaW5pdF9zZWN1cml0eSwKQEAgLTMyMDMsOSArMzMzMiwxNiBAQAogc3RhdGljIF9faW5pdCBpbnQgc21hY2tfaW5pdCh2b2lkKQogewogCXN0cnVjdCBjcmVkICpjcmVkOworCXN0cnVjdCB0YXNrX3NtYWNrICp0c3A7CiAKLQlpZiAoIXNlY3VyaXR5X21vZHVsZV9lbmFibGUoJnNtYWNrX29wcykpCisJdHNwID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHRhc2tfc21hY2spLCBHRlBfS0VSTkVMKTsKKwlpZiAodHNwID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJaWYgKCFzZWN1cml0eV9tb2R1bGVfZW5hYmxlKCZzbWFja19vcHMpKSB7CisJCWtmcmVlKHRzcCk7CiAJCXJldHVybiAwOworCX0KIAogCXByaW50ayhLRVJOX0lORk8gIlNtYWNrOiAgSW5pdGlhbGl6aW5nLlxuIik7CiAKQEAgLTMyMTMsNyArMzM0OSw5IEBACiAJICogU2V0IHRoZSBzZWN1cml0eSBzdGF0ZSBmb3IgdGhlIGluaXRpYWwgdGFzay4KIAkgKi8KIAljcmVkID0gKHN0cnVjdCBjcmVkICopIGN1cnJlbnQtPmNyZWQ7Ci0JY3JlZC0+c2VjdXJpdHkgPSAmc21hY2tfa25vd25fZmxvb3Iuc21rX2tub3duOworCXRzcC0+c21rX2ZvcmtlZCA9IHNtYWNrX2tub3duX2Zsb29yLnNta19rbm93bjsKKwl0c3AtPnNta190YXNrID0gc21hY2tfa25vd25fZmxvb3Iuc21rX2tub3duOworCWNyZWQtPnNlY3VyaXR5ID0gdHNwOwogCiAJLyogaW5pdGlhbGl6ZSB0aGUgc21hY2tfa25vd19saXN0ICovCiAJaW5pdF9zbWFja19rbm93X2xpc3QoKTsKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NtYWNrL3NtYWNrZnMuYyBiL3NlY3VyaXR5L3NtYWNrL3NtYWNrZnMuYwppbmRleCBkYzFmZDYyLi4zNjJkNWVkIDEwMDY0NAotLS0gYS9zZWN1cml0eS9zbWFjay9zbWFja2ZzLmMKKysrIGIvc2VjdXJpdHkvc21hY2svc21hY2tmcy5jCkBAIC0xMDksOSArMTA5LDEyIEBACiAgKiBTTUtfQUNDRVNTTEVOOiBNYXhpbXVtIGxlbmd0aCBmb3IgYSBydWxlIGFjY2VzcyBmaWVsZAogICogU01LX0xPQURMRU46IFNtYWNrIHJ1bGUgbGVuZ3RoCiAgKi8KLSNkZWZpbmUgU01LX0FDQ0VTUyAgICAicnd4YSIKLSNkZWZpbmUgU01LX0FDQ0VTU0xFTiAoc2l6ZW9mKFNNS19BQ0NFU1MpIC0gMSkKLSNkZWZpbmUgU01LX0xPQURMRU4gICAoU01LX0xBQkVMTEVOICsgU01LX0xBQkVMTEVOICsgU01LX0FDQ0VTU0xFTikKKyNkZWZpbmUgU01LX09BQ0NFU1MJInJ3eGEiCisjZGVmaW5lIFNNS19BQ0NFU1MJInJ3eGF0IgorI2RlZmluZSBTTUtfT0FDQ0VTU0xFTgkoc2l6ZW9mKFNNS19PQUNDRVNTKSAtIDEpCisjZGVmaW5lIFNNS19BQ0NFU1NMRU4JKHNpemVvZihTTUtfQUNDRVNTKSAtIDEpCisjZGVmaW5lIFNNS19PTE9BRExFTgkoU01LX0xBQkVMTEVOICsgU01LX0xBQkVMTEVOICsgU01LX09BQ0NFU1NMRU4pCisjZGVmaW5lIFNNS19MT0FETEVOCShTTUtfTEFCRUxMRU4gKyBTTUtfTEFCRUxMRU4gKyBTTUtfQUNDRVNTTEVOKQogCiAvKioKICAqIHNta19uZXRsYWJlbF9hdWRpdF9zZXQgLSBmaWxsIGEgbmV0bGJsX2F1ZGl0IHN0cnVjdApAQCAtMTIxLDcgKzEyNCw3IEBACiB7CiAJbmFwLT5sb2dpbnVpZCA9IGF1ZGl0X2dldF9sb2dpbnVpZChjdXJyZW50KTsKIAluYXAtPnNlc3Npb25pZCA9IGF1ZGl0X2dldF9zZXNzaW9uaWQoY3VycmVudCk7Ci0JbmFwLT5zZWNpZCA9IHNtYWNrX3RvX3NlY2lkKGN1cnJlbnRfc2VjdXJpdHkoKSk7CisJbmFwLT5zZWNpZCA9IHNtYWNrX3RvX3NlY2lkKHNta19vZl9jdXJyZW50KCkpOwogfQogCiAvKgpAQCAtMTc1LDYgKzE3OCw4IEBACiAJCXNlcV9wdXRjKHMsICd4Jyk7CiAJaWYgKHNycC0+c21rX2FjY2VzcyAmIE1BWV9BUFBFTkQpCiAJCXNlcV9wdXRjKHMsICdhJyk7CisJaWYgKHNycC0+c21rX2FjY2VzcyAmIE1BWV9UUkFOU01VVEUpCisJCXNlcV9wdXRjKHMsICd0Jyk7CiAJaWYgKHNycC0+c21rX2FjY2VzcyA9PSAwKQogCQlzZXFfcHV0YyhzLCAnLScpOwogCkBAIC0yNzMsMTAgKzI3OCwxNSBAQAogCWlmICghY2FwYWJsZShDQVBfTUFDX0FETUlOKSkKIAkJcmV0dXJuIC1FUEVSTTsKIAotCWlmICgqcHBvcyAhPSAwIHx8IGNvdW50ICE9IFNNS19MT0FETEVOKQorCWlmICgqcHBvcyAhPSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwkvKgorCSAqIE1pbm9yIGhhY2sgZm9yIGJhY2t3YXJkIGNvbXBhdGFiaWxpdHkKKwkgKi8KKwlpZiAoY291bnQgPCAoU01LX09MT0FETEVOKSB8fCBjb3VudCA+IFNNS19MT0FETEVOKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWRhdGEgPSBremFsbG9jKGNvdW50LCBHRlBfS0VSTkVMKTsKKwlkYXRhID0ga3phbGxvYyhTTUtfTE9BRExFTiwgR0ZQX0tFUk5FTCk7CiAJaWYgKGRhdGEgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKQEAgLTI4NSw2ICsyOTUsMTIgQEAKIAkJZ290byBvdXQ7CiAJfQogCisJLyoKKwkgKiBNb3JlIG9uIHRoZSBtaW5vciBoYWNrIGZvciBiYWNrd2FyZCBjb21wYXRhYmlsaXR5CisJICovCisJaWYgKGNvdW50ID09IChTTUtfT0xPQURMRU4pKQorCQlkYXRhW1NNS19PTE9BRExFTl0gPSAnLSc7CisKIAlydWxlID0ga3phbGxvYyhzaXplb2YoKnJ1bGUpLCBHRlBfS0VSTkVMKTsKIAlpZiAocnVsZSA9PSBOVUxMKSB7CiAJCXJjID0gLUVOT01FTTsKQEAgLTM0NSw2ICszNjEsMTcgQEAKIAkJZ290byBvdXRfZnJlZV9ydWxlOwogCX0KIAorCXN3aXRjaCAoZGF0YVtTTUtfTEFCRUxMRU4gKyBTTUtfTEFCRUxMRU4gKyA0XSkgeworCWNhc2UgJy0nOgorCQlicmVhazsKKwljYXNlICd0JzoKKwljYXNlICdUJzoKKwkJcnVsZS0+c21rX2FjY2VzcyB8PSBNQVlfVFJBTlNNVVRFOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlnb3RvIG91dF9mcmVlX3J1bGU7CisJfQorCiAJcmMgPSBzbWtfc2V0X2FjY2VzcyhydWxlKTsKIAogCWlmICghcmMpCkBAIC0xMTYwLDcgKzExODcsNyBAQAogCQkJCSBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKIHsKIAljaGFyIGluW1NNS19MQUJFTExFTl07Ci0JY2hhciAqc3AgPSBjdXJyZW50LT5jcmVkLT5zZWN1cml0eTsKKwljaGFyICpzcCA9IHNta19vZl90YXNrKGN1cnJlbnQtPmNyZWQtPnNlY3VyaXR5KTsKIAogCWlmICghY2FwYWJsZShDQVBfTUFDX0FETUlOKSkKIAkJcmV0dXJuIC1FUEVSTTsKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvTWFrZWZpbGUgYi90b29scy9wZXJmL01ha2VmaWxlCmluZGV4IDFiOWIxM2UuLjJiNTM4N2QgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvTWFrZWZpbGUKKysrIGIvdG9vbHMvcGVyZi9NYWtlZmlsZQpAQCAtMjI3LDcgKzIyNyw3IEBACiAgIENGTEFHU19PUFRJTUlaRSA9IC1PNgogZW5kaWYKIAotQ0ZMQUdTID0gLWdnZGIzIC1XYWxsIC1XZXh0cmEgLXN0ZD1nbnU5OSAtV2Vycm9yICQoQ0ZMQUdTX09QVElNSVpFKSAtRF9GT1JUSUZZX1NPVVJDRT0yICQoRVhUUkFfV0FSTklOR1MpICQoRVhUUkFfQ0ZMQUdTKQorQ0ZMQUdTID0gLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWdnZGIzIC1XYWxsIC1XZXh0cmEgLXN0ZD1nbnU5OSAtV2Vycm9yICQoQ0ZMQUdTX09QVElNSVpFKSAtRF9GT1JUSUZZX1NPVVJDRT0yICQoRVhUUkFfV0FSTklOR1MpICQoRVhUUkFfQ0ZMQUdTKQogRVhUTElCUyA9IC1scHRocmVhZCAtbHJ0IC1sZWxmIC1sbQogQUxMX0NGTEFHUyA9ICQoQ0ZMQUdTKSAtRF9MQVJHRUZJTEU2NF9TT1VSQ0UgLURfRklMRV9PRkZTRVRfQklUUz02NAogQUxMX0xERkxBR1MgPSAkKExERkxBR1MpCmRpZmYgLS1naXQgYS90b29scy9wZXJmL2J1aWx0aW4tcmVjb3JkLmMgYi90b29scy9wZXJmL2J1aWx0aW4tcmVjb3JkLmMKaW5kZXggN2JjMDQ5MC4uNzA2OWJkMyAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi9idWlsdGluLXJlY29yZC5jCisrKyBiL3Rvb2xzL3BlcmYvYnVpbHRpbi1yZWNvcmQuYwpAQCAtMzMxLDYgKzMzMSw5IEBACiAJCQllbHNlIGlmIChlcnIgPT0gIEVOT0RFViAmJiBjcHVfbGlzdCkgewogCQkJCWRpZSgiTm8gc3VjaCBkZXZpY2UgLSBkaWQgeW91IHNwZWNpZnkiCiAJCQkJCSIgYW4gb3V0LW9mLXJhbmdlIHByb2ZpbGUgQ1BVP1xuIik7CisJCQl9IGVsc2UgaWYgKGVyciA9PSBFTk9FTlQpIHsKKwkJCQlkaWUoIiVzIGV2ZW50IGlzIG5vdCBzdXBwb3J0ZWQuICIsCisJCQkJICAgICBldmVudF9uYW1lKGV2c2VsKSk7CiAJCQl9IGVsc2UgaWYgKGVyciA9PSBFSU5WQUwgJiYgc2FtcGxlX2lkX2FsbF9hdmFpbCkgewogCQkJCS8qCiAJCQkJICogT2xkIGtlcm5lbCwgbm8gYXR0ci0+c2FtcGxlX2lkX3R5cGVfYWxsIGZpZWxkCmRpZmYgLS1naXQgYS90b29scy9wZXJmL2J1aWx0aW4tc2NoZWQuYyBiL3Rvb2xzL3BlcmYvYnVpbHRpbi1zY2hlZC5jCmluZGV4IDdhNGViZWIuLmFiZDRiODQgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvYnVpbHRpbi1zY2hlZC5jCisrKyBiL3Rvb2xzL3BlcmYvYnVpbHRpbi1zY2hlZC5jCkBAIC00ODksNyArNDg5LDggQEAKIAogCWVyciA9IHB0aHJlYWRfYXR0cl9pbml0KCZhdHRyKTsKIAlCVUdfT04oZXJyKTsKLQllcnIgPSBwdGhyZWFkX2F0dHJfc2V0c3RhY2tzaXplKCZhdHRyLCAoc2l6ZV90KSgxNioxMDI0KSk7CisJZXJyID0gcHRocmVhZF9hdHRyX3NldHN0YWNrc2l6ZSgmYXR0ciwKKwkJCShzaXplX3QpIG1heCgxNiAqIDEwMjQsIFBUSFJFQURfU1RBQ0tfTUlOKSk7CiAJQlVHX09OKGVycik7CiAJZXJyID0gcHRocmVhZF9tdXRleF9sb2NrKCZzdGFydF93b3JrX211dGV4KTsKIAlCVUdfT04oZXJyKTsKQEAgLTE4NjEsNyArMTg2Miw3IEBACiAJcmVjX2FyZ2MgPSBBUlJBWV9TSVpFKHJlY29yZF9hcmdzKSArIGFyZ2MgLSAxOwogCXJlY19hcmd2ID0gY2FsbG9jKHJlY19hcmdjICsgMSwgc2l6ZW9mKGNoYXIgKikpOwogCi0JaWYgKHJlY19hcmd2KQorCWlmIChyZWNfYXJndiA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT01FTTsKIAogCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHJlY29yZF9hcmdzKTsgaSsrKQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9idWlsdGluLXN0YXQuYyBiL3Rvb2xzL3BlcmYvYnVpbHRpbi1zdGF0LmMKaW5kZXggMDJiMmQ4MC4uYzM4NWE2MyAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi9idWlsdGluLXN0YXQuYworKysgYi90b29scy9wZXJmL2J1aWx0aW4tc3RhdC5jCkBAIC0zMTYsNiArMzE2LDggQEAKIAkJCQkgICAgICAiXHQgQ29uc2lkZXIgdHdlYWtpbmciCiAJCQkJICAgICAgIiAvcHJvYy9zeXMva2VybmVsL3BlcmZfZXZlbnRfcGFyYW5vaWQgb3IgcnVubmluZyBhcyByb290LiIsCiAJCQkJICAgICAgc3lzdGVtX3dpZGUgPyAic3lzdGVtLXdpZGUgIiA6ICIiKTsKKwkJCX0gZWxzZSBpZiAoZXJybm8gPT0gRU5PRU5UKSB7CisJCQkJZXJyb3IoIiVzIGV2ZW50IGlzIG5vdCBzdXBwb3J0ZWQuICIsIGV2ZW50X25hbWUoY291bnRlcikpOwogCQkJfSBlbHNlIHsKIAkJCQllcnJvcigib3Blbl9jb3VudGVyIHJldHVybmVkIHdpdGggJWQgKCVzKS4gIgogCQkJCSAgICAgICIvYmluL2RtZXNnIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24uXG4iLApAQCAtNjgzLDggKzY4NSw3IEBACiAJCW5yX2NvdW50ZXJzID0gQVJSQVlfU0laRShkZWZhdWx0X2F0dHJzKTsKIAogCQlmb3IgKGMgPSAwOyBjIDwgQVJSQVlfU0laRShkZWZhdWx0X2F0dHJzKTsgKytjKSB7Ci0JCQlwb3MgPSBwZXJmX2V2c2VsX19uZXcoZGVmYXVsdF9hdHRyc1tjXS50eXBlLAotCQkJCQkgICAgICBkZWZhdWx0X2F0dHJzW2NdLmNvbmZpZywKKwkJCXBvcyA9IHBlcmZfZXZzZWxfX25ldygmZGVmYXVsdF9hdHRyc1tjXSwKIAkJCQkJICAgICAgbnJfY291bnRlcnMpOwogCQkJaWYgKHBvcyA9PSBOVUxMKQogCQkJCWdvdG8gb3V0OwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9idWlsdGluLXRlc3QuYyBiL3Rvb2xzL3BlcmYvYnVpbHRpbi10ZXN0LmMKaW5kZXggMWM5ODQzNC4uZWQ1Njk2MSAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi9idWlsdGluLXRlc3QuYworKysgYi90b29scy9wZXJmL2J1aWx0aW4tdGVzdC5jCkBAIC0yMzQsNiArMjM0LDcgQEAKIAlyZXR1cm4gZXJyOwogfQogCisjaW5jbHVkZSAidXRpbC9jcHVtYXAuaCIKICNpbmNsdWRlICJ1dGlsL2V2c2VsLmgiCiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAKQEAgLTI2NCw2ICsyNjUsNyBAQAogCWludCBlcnIgPSAtMSwgZmQ7CiAJc3RydWN0IHRocmVhZF9tYXAgKnRocmVhZHM7CiAJc3RydWN0IHBlcmZfZXZzZWwgKmV2c2VsOworCXN0cnVjdCBwZXJmX2V2ZW50X2F0dHIgYXR0cjsKIAl1bnNpZ25lZCBpbnQgbnJfb3Blbl9jYWxscyA9IDExMSwgaTsKIAlpbnQgaWQgPSB0cmFjZV9ldmVudF9faWQoInN5c19lbnRlcl9vcGVuIik7CiAKQEAgLTI3OCw3ICsyODAsMTAgQEAKIAkJcmV0dXJuIC0xOwogCX0KIAotCWV2c2VsID0gcGVyZl9ldnNlbF9fbmV3KFBFUkZfVFlQRV9UUkFDRVBPSU5ULCBpZCwgMCk7CisJbWVtc2V0KCZhdHRyLCAwLCBzaXplb2YoYXR0cikpOworCWF0dHIudHlwZSA9IFBFUkZfVFlQRV9UUkFDRVBPSU5UOworCWF0dHIuY29uZmlnID0gaWQ7CisJZXZzZWwgPSBwZXJmX2V2c2VsX19uZXcoJmF0dHIsIDApOwogCWlmIChldnNlbCA9PSBOVUxMKSB7CiAJCXByX2RlYnVnKCJwZXJmX2V2c2VsX19uZXdcbiIpOwogCQlnb3RvIG91dF90aHJlYWRfbWFwX2RlbGV0ZTsKQEAgLTMxNyw2ICszMjIsMTExIEBACiAJcmV0dXJuIGVycjsKIH0KIAorI2luY2x1ZGUgPHNjaGVkLmg+CisKK3N0YXRpYyBpbnQgdGVzdF9fb3Blbl9zeXNjYWxsX2V2ZW50X29uX2FsbF9jcHVzKHZvaWQpCit7CisJaW50IGVyciA9IC0xLCBmZCwgY3B1OworCXN0cnVjdCB0aHJlYWRfbWFwICp0aHJlYWRzOworCXN0cnVjdCBjcHVfbWFwICpjcHVzOworCXN0cnVjdCBwZXJmX2V2c2VsICpldnNlbDsKKwlzdHJ1Y3QgcGVyZl9ldmVudF9hdHRyIGF0dHI7CisJdW5zaWduZWQgaW50IG5yX29wZW5fY2FsbHMgPSAxMTEsIGk7CisJY3B1X3NldF90ICpjcHVfc2V0OworCXNpemVfdCBjcHVfc2V0X3NpemU7CisJaW50IGlkID0gdHJhY2VfZXZlbnRfX2lkKCJzeXNfZW50ZXJfb3BlbiIpOworCisJaWYgKGlkIDwgMCkgeworCQlwcl9kZWJ1ZygiaXMgZGVidWdmcyBtb3VudGVkIG9uIC9zeXMva2VybmVsL2RlYnVnP1xuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwl0aHJlYWRzID0gdGhyZWFkX21hcF9fbmV3KC0xLCBnZXRwaWQoKSk7CisJaWYgKHRocmVhZHMgPT0gTlVMTCkgeworCQlwcl9kZWJ1ZygidGhyZWFkX21hcF9fbmV3XG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWNwdXMgPSBjcHVfbWFwX19uZXcoTlVMTCk7CisJaWYgKHRocmVhZHMgPT0gTlVMTCkgeworCQlwcl9kZWJ1ZygidGhyZWFkX21hcF9fbmV3XG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWNwdV9zZXQgPSBDUFVfQUxMT0MoY3B1cy0+bnIpOworCisJaWYgKGNwdV9zZXQgPT0gTlVMTCkKKwkJZ290byBvdXRfdGhyZWFkX21hcF9kZWxldGU7CisKKwljcHVfc2V0X3NpemUgPSBDUFVfQUxMT0NfU0laRShjcHVzLT5ucik7CisJQ1BVX1pFUk9fUyhjcHVfc2V0X3NpemUsIGNwdV9zZXQpOworCisJbWVtc2V0KCZhdHRyLCAwLCBzaXplb2YoYXR0cikpOworCWF0dHIudHlwZSA9IFBFUkZfVFlQRV9UUkFDRVBPSU5UOworCWF0dHIuY29uZmlnID0gaWQ7CisJZXZzZWwgPSBwZXJmX2V2c2VsX19uZXcoJmF0dHIsIDApOworCWlmIChldnNlbCA9PSBOVUxMKSB7CisJCXByX2RlYnVnKCJwZXJmX2V2c2VsX19uZXdcbiIpOworCQlnb3RvIG91dF9jcHVfZnJlZTsKKwl9CisKKwlpZiAocGVyZl9ldnNlbF9fb3BlbihldnNlbCwgY3B1cywgdGhyZWFkcykgPCAwKSB7CisJCXByX2RlYnVnKCJmYWlsZWQgdG8gb3BlbiBjb3VudGVyOiAlcywgIgorCQkJICJ0d2VhayAvcHJvYy9zeXMva2VybmVsL3BlcmZfZXZlbnRfcGFyYW5vaWQ/XG4iLAorCQkJIHN0cmVycm9yKGVycm5vKSk7CisJCWdvdG8gb3V0X2V2c2VsX2RlbGV0ZTsKKwl9CisKKwlmb3IgKGNwdSA9IDA7IGNwdSA8IGNwdXMtPm5yOyArK2NwdSkgeworCQl1bnNpZ25lZCBpbnQgbmNhbGxzID0gbnJfb3Blbl9jYWxscyArIGNwdTsKKworCQlDUFVfU0VUKGNwdSwgY3B1X3NldCk7CisJCXNjaGVkX3NldGFmZmluaXR5KDAsIGNwdV9zZXRfc2l6ZSwgY3B1X3NldCk7CisJCWZvciAoaSA9IDA7IGkgPCBuY2FsbHM7ICsraSkgeworCQkJZmQgPSBvcGVuKCIvZXRjL3Bhc3N3ZCIsIE9fUkRPTkxZKTsKKwkJCWNsb3NlKGZkKTsKKwkJfQorCQlDUFVfQ0xSKGNwdSwgY3B1X3NldCk7CisJfQorCisJLyoKKwkgKiBIZXJlIHdlIG5lZWQgdG8gZXhwbGljaXRlbHkgcHJlYWxsb2NhdGUgdGhlIGNvdW50cywgYXMgaWYKKwkgKiB3ZSB1c2UgdGhlIGF1dG8gYWxsb2NhdGlvbiBpdCB3aWxsIGFsbG9jYXRlIGp1c3QgZm9yIDEgY3B1LAorCSAqIGFzIHdlIHN0YXJ0IGJ5IGNwdSAwLgorCSAqLworCWlmIChwZXJmX2V2c2VsX19hbGxvY19jb3VudHMoZXZzZWwsIGNwdXMtPm5yKSA8IDApIHsKKwkJcHJfZGVidWcoInBlcmZfZXZzZWxfX2FsbG9jX2NvdW50cyhuY3B1cz0lZClcbiIsIGNwdXMtPm5yKTsKKwkJZ290byBvdXRfY2xvc2VfZmQ7CisJfQorCisJZm9yIChjcHUgPSAwOyBjcHUgPCBjcHVzLT5ucjsgKytjcHUpIHsKKwkJdW5zaWduZWQgaW50IGV4cGVjdGVkOworCisJCWlmIChwZXJmX2V2c2VsX19yZWFkX29uX2NwdShldnNlbCwgY3B1LCAwKSA8IDApIHsKKwkJCXByX2RlYnVnKCJwZXJmX2V2c2VsX19vcGVuX3JlYWRfb25fY3B1XG4iKTsKKwkJCWdvdG8gb3V0X2Nsb3NlX2ZkOworCQl9CisKKwkJZXhwZWN0ZWQgPSBucl9vcGVuX2NhbGxzICsgY3B1OworCQlpZiAoZXZzZWwtPmNvdW50cy0+Y3B1W2NwdV0udmFsICE9IGV4cGVjdGVkKSB7CisJCQlwcl9kZWJ1ZygicGVyZl9ldnNlbF9fcmVhZF9vbl9jcHU6IGV4cGVjdGVkIHRvIGludGVyY2VwdCAlZCBjYWxscyBvbiBjcHUgJWQsIGdvdCAlTGRcbiIsCisJCQkJIGV4cGVjdGVkLCBjcHUsIGV2c2VsLT5jb3VudHMtPmNwdVtjcHVdLnZhbCk7CisJCQlnb3RvIG91dF9jbG9zZV9mZDsKKwkJfQorCX0KKworCWVyciA9IDA7CitvdXRfY2xvc2VfZmQ6CisJcGVyZl9ldnNlbF9fY2xvc2VfZmQoZXZzZWwsIDEsIHRocmVhZHMtPm5yKTsKK291dF9ldnNlbF9kZWxldGU6CisJcGVyZl9ldnNlbF9fZGVsZXRlKGV2c2VsKTsKK291dF9jcHVfZnJlZToKKwlDUFVfRlJFRShjcHVfc2V0KTsKK291dF90aHJlYWRfbWFwX2RlbGV0ZToKKwl0aHJlYWRfbWFwX19kZWxldGUodGhyZWFkcyk7CisJcmV0dXJuIGVycjsKK30KKwogc3RhdGljIHN0cnVjdCB0ZXN0IHsKIAljb25zdCBjaGFyICpkZXNjOwogCWludCAoKmZ1bmMpKHZvaWQpOwpAQCAtMzMwLDYgKzQ0MCwxMCBAQAogCQkuZnVuYyA9IHRlc3RfX29wZW5fc3lzY2FsbF9ldmVudCwKIAl9LAogCXsKKwkJLmRlc2MgPSAiZGV0ZWN0IG9wZW4gc3lzY2FsbCBldmVudCBvbiBhbGwgY3B1cyIsCisJCS5mdW5jID0gdGVzdF9fb3Blbl9zeXNjYWxsX2V2ZW50X29uX2FsbF9jcHVzLAorCX0sCisJewogCQkuZnVuYyA9IE5VTEwsCiAJfSwKIH07CmRpZmYgLS1naXQgYS90b29scy9wZXJmL2J1aWx0aW4tdG9wLmMgYi90b29scy9wZXJmL2J1aWx0aW4tdG9wLmMKaW5kZXggMWU2N2FiOS4uNmNlNDA0MiAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi9idWlsdGluLXRvcC5jCisrKyBiL3Rvb2xzL3BlcmYvYnVpbHRpbi10b3AuYwpAQCAtMTI0Nyw2ICsxMjQ3LDggQEAKIAkJCQlkaWUoIlBlcm1pc3Npb24gZXJyb3IgLSBhcmUgeW91IHJvb3Q/XG4iCiAJCQkJCSJcdCBDb25zaWRlciB0d2Vha2luZyIKIAkJCQkJIiAvcHJvYy9zeXMva2VybmVsL3BlcmZfZXZlbnRfcGFyYW5vaWQuXG4iKTsKKwkJCWlmIChlcnIgPT0gRU5PRU5UKQorCQkJCWRpZSgiJXMgZXZlbnQgaXMgbm90IHN1cHBvcnRlZC4gIiwgZXZlbnRfbmFtZShldnNlbCkpOwogCQkJLyoKIAkJCSAqIElmIGl0J3MgY3ljbGVzIHRoZW4gZmFsbCBiYWNrIHRvIGhydGltZXIKIAkJCSAqIGJhc2VkIGNwdS1jbG9jay10aWNrIHN3IGNvdW50ZXIsIHdoaWNoCmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvZXZzZWwuYyBiL3Rvb2xzL3BlcmYvdXRpbC9ldnNlbC5jCmluZGV4IGM5NTI2N2UuLmY1Y2ZlZDYgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9ldnNlbC5jCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9ldnNlbC5jCkBAIC02LDE0ICs2LDEzIEBACiAKICNkZWZpbmUgRkQoZSwgeCwgeSkgKCooaW50ICopeHlhcnJheV9fZW50cnkoZS0+ZmQsIHgsIHkpKQogCi1zdHJ1Y3QgcGVyZl9ldnNlbCAqcGVyZl9ldnNlbF9fbmV3KHUzMiB0eXBlLCB1NjQgY29uZmlnLCBpbnQgaWR4KQorc3RydWN0IHBlcmZfZXZzZWwgKnBlcmZfZXZzZWxfX25ldyhzdHJ1Y3QgcGVyZl9ldmVudF9hdHRyICphdHRyLCBpbnQgaWR4KQogewogCXN0cnVjdCBwZXJmX2V2c2VsICpldnNlbCA9IHphbGxvYyhzaXplb2YoKmV2c2VsKSk7CiAKIAlpZiAoZXZzZWwgIT0gTlVMTCkgewogCQlldnNlbC0+aWR4CSAgID0gaWR4OwotCQlldnNlbC0+YXR0ci50eXBlICAgPSB0eXBlOwotCQlldnNlbC0+YXR0ci5jb25maWcgPSBjb25maWc7CisJCWV2c2VsLT5hdHRyCSAgID0gKmF0dHI7CiAJCUlOSVRfTElTVF9IRUFEKCZldnNlbC0+bm9kZSk7CiAJfQogCkBAIC0xMjgsNTkgKzEyNyw3NSBAQAogCXJldHVybiAwOwogfQogCi1pbnQgcGVyZl9ldnNlbF9fb3Blbl9wZXJfY3B1KHN0cnVjdCBwZXJmX2V2c2VsICpldnNlbCwgc3RydWN0IGNwdV9tYXAgKmNwdXMpCitzdGF0aWMgaW50IF9fcGVyZl9ldnNlbF9fb3BlbihzdHJ1Y3QgcGVyZl9ldnNlbCAqZXZzZWwsIHN0cnVjdCBjcHVfbWFwICpjcHVzLAorCQkJICAgICAgc3RydWN0IHRocmVhZF9tYXAgKnRocmVhZHMpCiB7Ci0JaW50IGNwdTsKKwlpbnQgY3B1LCB0aHJlYWQ7CiAKLQlpZiAoZXZzZWwtPmZkID09IE5VTEwgJiYgcGVyZl9ldnNlbF9fYWxsb2NfZmQoZXZzZWwsIGNwdXMtPm5yLCAxKSA8IDApCisJaWYgKGV2c2VsLT5mZCA9PSBOVUxMICYmCisJICAgIHBlcmZfZXZzZWxfX2FsbG9jX2ZkKGV2c2VsLCBjcHVzLT5uciwgdGhyZWFkcy0+bnIpIDwgMCkKIAkJcmV0dXJuIC0xOwogCiAJZm9yIChjcHUgPSAwOyBjcHUgPCBjcHVzLT5ucjsgY3B1KyspIHsKLQkJRkQoZXZzZWwsIGNwdSwgMCkgPSBzeXNfcGVyZl9ldmVudF9vcGVuKCZldnNlbC0+YXR0ciwgLTEsCi0JCQkJCQkJY3B1cy0+bWFwW2NwdV0sIC0xLCAwKTsKLQkJaWYgKEZEKGV2c2VsLCBjcHUsIDApIDwgMCkKLQkJCWdvdG8gb3V0X2Nsb3NlOworCQlmb3IgKHRocmVhZCA9IDA7IHRocmVhZCA8IHRocmVhZHMtPm5yOyB0aHJlYWQrKykgeworCQkJRkQoZXZzZWwsIGNwdSwgdGhyZWFkKSA9IHN5c19wZXJmX2V2ZW50X29wZW4oJmV2c2VsLT5hdHRyLAorCQkJCQkJCQkgICAgIHRocmVhZHMtPm1hcFt0aHJlYWRdLAorCQkJCQkJCQkgICAgIGNwdXMtPm1hcFtjcHVdLCAtMSwgMCk7CisJCQlpZiAoRkQoZXZzZWwsIGNwdSwgdGhyZWFkKSA8IDApCisJCQkJZ290byBvdXRfY2xvc2U7CisJCX0KIAl9CiAKIAlyZXR1cm4gMDsKIAogb3V0X2Nsb3NlOgotCXdoaWxlICgtLWNwdSA+PSAwKSB7Ci0JCWNsb3NlKEZEKGV2c2VsLCBjcHUsIDApKTsKLQkJRkQoZXZzZWwsIGNwdSwgMCkgPSAtMTsKLQl9CisJZG8geworCQl3aGlsZSAoLS10aHJlYWQgPj0gMCkgeworCQkJY2xvc2UoRkQoZXZzZWwsIGNwdSwgdGhyZWFkKSk7CisJCQlGRChldnNlbCwgY3B1LCB0aHJlYWQpID0gLTE7CisJCX0KKwkJdGhyZWFkID0gdGhyZWFkcy0+bnI7CisJfSB3aGlsZSAoLS1jcHUgPj0gMCk7CiAJcmV0dXJuIC0xOwogfQogCitzdGF0aWMgc3RydWN0IHsKKwlzdHJ1Y3QgY3B1X21hcCBtYXA7CisJaW50IGNwdXNbMV07Cit9IGVtcHR5X2NwdV9tYXAgPSB7CisJLm1hcC5ucgk9IDEsCisJLmNwdXMJPSB7IC0xLCB9LAorfTsKKworc3RhdGljIHN0cnVjdCB7CisJc3RydWN0IHRocmVhZF9tYXAgbWFwOworCWludCB0aHJlYWRzWzFdOworfSBlbXB0eV90aHJlYWRfbWFwID0geworCS5tYXAubnIJID0gMSwKKwkudGhyZWFkcyA9IHsgLTEsIH0sCit9OworCitpbnQgcGVyZl9ldnNlbF9fb3BlbihzdHJ1Y3QgcGVyZl9ldnNlbCAqZXZzZWwsCisJCSAgICAgc3RydWN0IGNwdV9tYXAgKmNwdXMsIHN0cnVjdCB0aHJlYWRfbWFwICp0aHJlYWRzKQoreworCisJaWYgKGNwdXMgPT0gTlVMTCkgeworCQkvKiBXb3JrIGFyb3VuZCBvbGQgY29tcGlsZXIgd2FybmluZ3MgYWJvdXQgc3RyaWN0IGFsaWFzaW5nICovCisJCWNwdXMgPSAmZW1wdHlfY3B1X21hcC5tYXA7CisJfQorCisJaWYgKHRocmVhZHMgPT0gTlVMTCkKKwkJdGhyZWFkcyA9ICZlbXB0eV90aHJlYWRfbWFwLm1hcDsKKworCXJldHVybiBfX3BlcmZfZXZzZWxfX29wZW4oZXZzZWwsIGNwdXMsIHRocmVhZHMpOworfQorCitpbnQgcGVyZl9ldnNlbF9fb3Blbl9wZXJfY3B1KHN0cnVjdCBwZXJmX2V2c2VsICpldnNlbCwgc3RydWN0IGNwdV9tYXAgKmNwdXMpCit7CisJcmV0dXJuIF9fcGVyZl9ldnNlbF9fb3BlbihldnNlbCwgY3B1cywgJmVtcHR5X3RocmVhZF9tYXAubWFwKTsKK30KKwogaW50IHBlcmZfZXZzZWxfX29wZW5fcGVyX3RocmVhZChzdHJ1Y3QgcGVyZl9ldnNlbCAqZXZzZWwsIHN0cnVjdCB0aHJlYWRfbWFwICp0aHJlYWRzKQogewotCWludCB0aHJlYWQ7Ci0KLQlpZiAoZXZzZWwtPmZkID09IE5VTEwgJiYgcGVyZl9ldnNlbF9fYWxsb2NfZmQoZXZzZWwsIDEsIHRocmVhZHMtPm5yKSkKLQkJcmV0dXJuIC0xOwotCi0JZm9yICh0aHJlYWQgPSAwOyB0aHJlYWQgPCB0aHJlYWRzLT5ucjsgdGhyZWFkKyspIHsKLQkJRkQoZXZzZWwsIDAsIHRocmVhZCkgPSBzeXNfcGVyZl9ldmVudF9vcGVuKCZldnNlbC0+YXR0ciwKLQkJCQkJCQkgICB0aHJlYWRzLT5tYXBbdGhyZWFkXSwgLTEsIC0xLCAwKTsKLQkJaWYgKEZEKGV2c2VsLCAwLCB0aHJlYWQpIDwgMCkKLQkJCWdvdG8gb3V0X2Nsb3NlOwotCX0KLQotCXJldHVybiAwOwotCi1vdXRfY2xvc2U6Ci0Jd2hpbGUgKC0tdGhyZWFkID49IDApIHsKLQkJY2xvc2UoRkQoZXZzZWwsIDAsIHRocmVhZCkpOwotCQlGRChldnNlbCwgMCwgdGhyZWFkKSA9IC0xOwotCX0KLQlyZXR1cm4gLTE7Ci19Ci0KLWludCBwZXJmX2V2c2VsX19vcGVuKHN0cnVjdCBwZXJmX2V2c2VsICpldnNlbCwgCi0JCSAgICAgc3RydWN0IGNwdV9tYXAgKmNwdXMsIHN0cnVjdCB0aHJlYWRfbWFwICp0aHJlYWRzKQotewotCWlmICh0aHJlYWRzID09IE5VTEwpCi0JCXJldHVybiBwZXJmX2V2c2VsX19vcGVuX3Blcl9jcHUoZXZzZWwsIGNwdXMpOwotCi0JcmV0dXJuIHBlcmZfZXZzZWxfX29wZW5fcGVyX3RocmVhZChldnNlbCwgdGhyZWFkcyk7CisJcmV0dXJuIF9fcGVyZl9ldnNlbF9fb3BlbihldnNlbCwgJmVtcHR5X2NwdV9tYXAubWFwLCB0aHJlYWRzKTsKIH0KZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9ldnNlbC5oIGIvdG9vbHMvcGVyZi91dGlsL2V2c2VsLmgKaW5kZXggYTBjY2Q2OS4uYjJkNzU1ZiAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL2V2c2VsLmgKKysrIGIvdG9vbHMvcGVyZi91dGlsL2V2c2VsLmgKQEAgLTM3LDcgKzM3LDcgQEAKIHN0cnVjdCBjcHVfbWFwOwogc3RydWN0IHRocmVhZF9tYXA7CiAKLXN0cnVjdCBwZXJmX2V2c2VsICpwZXJmX2V2c2VsX19uZXcodTMyIHR5cGUsIHU2NCBjb25maWcsIGludCBpZHgpOworc3RydWN0IHBlcmZfZXZzZWwgKnBlcmZfZXZzZWxfX25ldyhzdHJ1Y3QgcGVyZl9ldmVudF9hdHRyICphdHRyLCBpbnQgaWR4KTsKIHZvaWQgcGVyZl9ldnNlbF9fZGVsZXRlKHN0cnVjdCBwZXJmX2V2c2VsICpldnNlbCk7CiAKIGludCBwZXJmX2V2c2VsX19hbGxvY19mZChzdHJ1Y3QgcGVyZl9ldnNlbCAqZXZzZWwsIGludCBuY3B1cywgaW50IG50aHJlYWRzKTsKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9wYXJzZS1ldmVudHMuYyBiL3Rvb2xzL3BlcmYvdXRpbC9wYXJzZS1ldmVudHMuYwppbmRleCA2NDkwODNmLi41Y2I2ZjRiIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvcGFyc2UtZXZlbnRzLmMKKysrIGIvdG9vbHMvcGVyZi91dGlsL3BhcnNlLWV2ZW50cy5jCkBAIC00OTAsNiArNDkwLDMxIEBACiAJcmV0dXJuIEVWVF9IQU5ETEVEX0FMTDsKIH0KIAorc3RhdGljIGludCBzdG9yZV9ldmVudF90eXBlKGNvbnN0IGNoYXIgKm9yZ25hbWUpCit7CisJY2hhciBmaWxlbmFtZVtQQVRIX01BWF0sICpjOworCUZJTEUgKmZpbGU7CisJaW50IGlkLCBuOworCisJc3ByaW50ZihmaWxlbmFtZSwgIiVzLyIsIGRlYnVnZnNfcGF0aCk7CisJc3RybmNhdChmaWxlbmFtZSwgb3JnbmFtZSwgc3RybGVuKG9yZ25hbWUpKTsKKwlzdHJjYXQoZmlsZW5hbWUsICIvaWQiKTsKKworCWMgPSBzdHJjaHIoZmlsZW5hbWUsICc6Jyk7CisJaWYgKGMpCisJCSpjID0gJy8nOworCisJZmlsZSA9IGZvcGVuKGZpbGVuYW1lLCAiciIpOworCWlmICghZmlsZSkKKwkJcmV0dXJuIDA7CisJbiA9IGZzY2FuZihmaWxlLCAiJWkiLCAmaWQpOworCWZjbG9zZShmaWxlKTsKKwlpZiAobiA8IDEpIHsKKwkJcHJfZXJyKCJjYW5ub3Qgc3RvcmUgZXZlbnQgSURcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIHBlcmZfaGVhZGVyX19wdXNoX2V2ZW50KGlkLCBvcmduYW1lKTsKK30KIAogc3RhdGljIGVudW0gZXZlbnRfcmVzdWx0IHBhcnNlX3RyYWNlcG9pbnRfZXZlbnQoY29uc3QgY2hhciAqKnN0cnAsCiAJCQkJICAgIHN0cnVjdCBwZXJmX2V2ZW50X2F0dHIgKmF0dHIpCkBAIC01MzMsOSArNTU4LDEzIEBACiAJCSpzdHJwICs9IHN0cmxlbihzeXNfbmFtZSkgKyBldnRfbGVuZ3RoOwogCQlyZXR1cm4gcGFyc2VfbXVsdGlwbGVfdHJhY2Vwb2ludF9ldmVudChzeXNfbmFtZSwgZXZ0X25hbWUsCiAJCQkJCQkgICAgICAgZmxhZ3MpOwotCX0gZWxzZQorCX0gZWxzZSB7CisJCWlmIChzdG9yZV9ldmVudF90eXBlKGV2dF9uYW1lKSA8IDApCisJCQlyZXR1cm4gRVZUX0ZBSUxFRDsKKwogCQlyZXR1cm4gcGFyc2Vfc2luZ2xlX3RyYWNlcG9pbnRfZXZlbnQoc3lzX25hbWUsIGV2dF9uYW1lLAogCQkJCQkJICAgICBldnRfbGVuZ3RoLCBhdHRyLCBzdHJwKTsKKwl9CiB9CiAKIHN0YXRpYyBlbnVtIGV2ZW50X3Jlc3VsdApAQCAtNzc4LDQxICs4MDcsMTEgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IHN0b3JlX2V2ZW50X3R5cGUoY29uc3QgY2hhciAqb3JnbmFtZSkKLXsKLQljaGFyIGZpbGVuYW1lW1BBVEhfTUFYXSwgKmM7Ci0JRklMRSAqZmlsZTsKLQlpbnQgaWQsIG47Ci0KLQlzcHJpbnRmKGZpbGVuYW1lLCAiJXMvIiwgZGVidWdmc19wYXRoKTsKLQlzdHJuY2F0KGZpbGVuYW1lLCBvcmduYW1lLCBzdHJsZW4ob3JnbmFtZSkpOwotCXN0cmNhdChmaWxlbmFtZSwgIi9pZCIpOwotCi0JYyA9IHN0cmNocihmaWxlbmFtZSwgJzonKTsKLQlpZiAoYykKLQkJKmMgPSAnLyc7Ci0KLQlmaWxlID0gZm9wZW4oZmlsZW5hbWUsICJyIik7Ci0JaWYgKCFmaWxlKQotCQlyZXR1cm4gMDsKLQluID0gZnNjYW5mKGZpbGUsICIlaSIsICZpZCk7Ci0JZmNsb3NlKGZpbGUpOwotCWlmIChuIDwgMSkgewotCQlwcl9lcnIoImNhbm5vdCBzdG9yZSBldmVudCBJRFxuIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlyZXR1cm4gcGVyZl9oZWFkZXJfX3B1c2hfZXZlbnQoaWQsIG9yZ25hbWUpOwotfQotCiBpbnQgcGFyc2VfZXZlbnRzKGNvbnN0IHN0cnVjdCBvcHRpb24gKm9wdCBfX3VzZWQsIGNvbnN0IGNoYXIgKnN0ciwgaW50IHVuc2V0IF9fdXNlZCkKIHsKIAlzdHJ1Y3QgcGVyZl9ldmVudF9hdHRyIGF0dHI7CiAJZW51bSBldmVudF9yZXN1bHQgcmV0OwogCi0JaWYgKHN0cmNocihzdHIsICc6JykpCi0JCWlmIChzdG9yZV9ldmVudF90eXBlKHN0cikgPCAwKQotCQkJcmV0dXJuIC0xOwotCiAJZm9yICg7OykgewogCQltZW1zZXQoJmF0dHIsIDAsIHNpemVvZihhdHRyKSk7CiAJCXJldCA9IHBhcnNlX2V2ZW50X3N5bWJvbHMoJnN0ciwgJmF0dHIpOwpAQCAtODI0LDcgKzgyMyw3IEBACiAKIAkJaWYgKHJldCAhPSBFVlRfSEFORExFRF9BTEwpIHsKIAkJCXN0cnVjdCBwZXJmX2V2c2VsICpldnNlbDsKLQkJCWV2c2VsID0gcGVyZl9ldnNlbF9fbmV3KGF0dHIudHlwZSwgYXR0ci5jb25maWcsCisJCQlldnNlbCA9IHBlcmZfZXZzZWxfX25ldygmYXR0ciwKIAkJCQkJCW5yX2NvdW50ZXJzKTsKIAkJCWlmIChldnNlbCA9PSBOVUxMKQogCQkJCXJldHVybiAtMTsKQEAgLTEwMTQsOCArMTAxMywxNSBAQAogCiBpbnQgcGVyZl9ldnNlbF9saXN0X19jcmVhdGVfZGVmYXVsdCh2b2lkKQogewotCXN0cnVjdCBwZXJmX2V2c2VsICpldnNlbCA9IHBlcmZfZXZzZWxfX25ldyhQRVJGX1RZUEVfSEFSRFdBUkUsCi0JCQkJCQkgICBQRVJGX0NPVU5UX0hXX0NQVV9DWUNMRVMsIDApOworCXN0cnVjdCBwZXJmX2V2c2VsICpldnNlbDsKKwlzdHJ1Y3QgcGVyZl9ldmVudF9hdHRyIGF0dHI7CisKKwltZW1zZXQoJmF0dHIsIDAsIHNpemVvZihhdHRyKSk7CisJYXR0ci50eXBlID0gUEVSRl9UWVBFX0hBUkRXQVJFOworCWF0dHIuY29uZmlnID0gUEVSRl9DT1VOVF9IV19DUFVfQ1lDTEVTOworCisJZXZzZWwgPSBwZXJmX2V2c2VsX19uZXcoJmF0dHIsIDApOworCiAJaWYgKGV2c2VsID09IE5VTEwpCiAJCXJldHVybiAtRU5PTUVNOwogCmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvc2Vzc2lvbi5jIGIvdG9vbHMvcGVyZi91dGlsL3Nlc3Npb24uYwppbmRleCA2ZmI0Njk0Li4zMTNkYWMyIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvc2Vzc2lvbi5jCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9zZXNzaW9uLmMKQEAgLTEwMDcsNyArMTAwNyw3IEBACiAJaWYgKHNpemUgPT0gMCkKIAkJc2l6ZSA9IDg7CiAKLQlpZiAoaGVhZCArIGV2ZW50LT5oZWFkZXIuc2l6ZSA+PSBtbWFwX3NpemUpIHsKKwlpZiAoaGVhZCArIGV2ZW50LT5oZWFkZXIuc2l6ZSA+IG1tYXBfc2l6ZSkgewogCQlpZiAobW1hcHNbbWFwX2lkeF0pIHsKIAkJCW11bm1hcChtbWFwc1ttYXBfaWR4XSwgbW1hcF9zaXplKTsKIAkJCW1tYXBzW21hcF9pZHhdID0gTlVMTDsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdm0vc2xhYmluZm8uYyBiL3Rvb2xzL3NsdWIvc2xhYmluZm8uYwpzaW1pbGFyaXR5IGluZGV4IDk5JQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL3ZtL3NsYWJpbmZvLmMKcmVuYW1lIHRvIHRvb2xzL3NsdWIvc2xhYmluZm8uYwppbmRleCA5MmU3MjlmLi41MTY1NTFjIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3ZtL3NsYWJpbmZvLmMKKysrIGIvdG9vbHMvc2x1Yi9zbGFiaW5mby5jCkBAIC02MDcsNyArNjA3LDcgQEAKIAl9CiAKIAlmb3IgKCA7ICpvcHQ7IG9wdCsrKQotCSAJc3dpdGNoICgqb3B0KSB7CisJCXN3aXRjaCAoKm9wdCkgewogCQljYXNlICdGJyA6IGNhc2UgJ2YnOgogCQkJaWYgKHNhbml0eSkKIAkJCQlyZXR1cm4gMDsKQEAgLTExMjcsNyArMTEyNyw3IEBACiAJCQkJY29udGludWU7CiAJCXN3aXRjaCAoZGUtPmRfdHlwZSkgewogCQkgICBjYXNlIERUX0xOSzoKLQkJICAgCWFsaWFzLT5uYW1lID0gc3RyZHVwKGRlLT5kX25hbWUpOworCQkJYWxpYXMtPm5hbWUgPSBzdHJkdXAoZGUtPmRfbmFtZSk7CiAJCQljb3VudCA9IHJlYWRsaW5rKGRlLT5kX25hbWUsIGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikpOwogCiAJCQlpZiAoY291bnQgPCAwKQpAQCAtMTE0Myw3ICsxMTQzLDcgQEAKIAkJICAgY2FzZSBEVF9ESVI6CiAJCQlpZiAoY2hkaXIoZGUtPmRfbmFtZSkpCiAJCQkJZmF0YWwoIlVuYWJsZSB0byBhY2Nlc3Mgc2xhYiAlc1xuIiwgc2xhYi0+bmFtZSk7Ci0JCSAgIAlzbGFiLT5uYW1lID0gc3RyZHVwKGRlLT5kX25hbWUpOworCQkJc2xhYi0+bmFtZSA9IHN0cmR1cChkZS0+ZF9uYW1lKTsKIAkJCXNsYWItPmFsaWFzID0gMDsKIAkJCXNsYWItPnJlZnMgPSAwOwogCQkJc2xhYi0+YWxpYXNlcyA9IGdldF9vYmooImFsaWFzZXMiKTsKZGlmZiAtLWdpdCBhL3Vzci9nZW5faW5pdF9jcGlvLmMgYi91c3IvZ2VuX2luaXRfY3Bpby5jCmluZGV4IGIyYjNjMmQuLjdmMDY4ODQgMTAwNjQ0Ci0tLSBhL3Vzci9nZW5faW5pdF9jcGlvLmMKKysrIGIvdXNyL2dlbl9pbml0X2NwaW8uYwpAQCAtMTA0LDYgKzEwNCw4IEBACiAJY2hhciBzWzI1Nl07CiAJdGltZV90IG10aW1lID0gdGltZShOVUxMKTsKIAorCWlmIChuYW1lWzBdID09ICcvJykKKwkJbmFtZSsrOwogCXNwcmludGYocywiJXMlMDhYJTA4WCUwOGxYJTA4bFglMDhYJTA4bFgiCiAJICAgICAgICIlMDhYJTA4WCUwOFglMDhYJTA4WCUwOFglMDhYIiwKIAkJIjA3MDcwMSIsCQkvKiBtYWdpYyAqLwpAQCAtMTUyLDYgKzE1NCw4IEBACiAJY2hhciBzWzI1Nl07CiAJdGltZV90IG10aW1lID0gdGltZShOVUxMKTsKIAorCWlmIChuYW1lWzBdID09ICcvJykKKwkJbmFtZSsrOwogCXNwcmludGYocywiJXMlMDhYJTA4WCUwOGxYJTA4bFglMDhYJTA4bFgiCiAJICAgICAgICIlMDhYJTA4WCUwOFglMDhYJTA4WCUwOFglMDhYIiwKIAkJIjA3MDcwMSIsCQkvKiBtYWdpYyAqLwpAQCAtMjQ1LDYgKzI0OSw4IEBACiAJZWxzZQogCQltb2RlIHw9IFNfSUZDSFI7CiAKKwlpZiAobmFtZVswXSA9PSAnLycpCisJCW5hbWUrKzsKIAlzcHJpbnRmKHMsIiVzJTA4WCUwOFglMDhsWCUwOGxYJTA4WCUwOGxYIgogCSAgICAgICAiJTA4WCUwOFglMDhYJTA4WCUwOFglMDhYJTA4WCIsCiAJCSIwNzA3MDEiLAkJLyogbWFnaWMgKi8KQEAgLTMwMywxOCArMzA5LDE4IEBACiAKIAltb2RlIHw9IFNfSUZSRUc7CiAKLQlyZXR2YWwgPSBzdGF0IChsb2NhdGlvbiwgJmJ1Zik7Ci0JaWYgKHJldHZhbCkgewotCQlmcHJpbnRmIChzdGRlcnIsICJGaWxlICVzIGNvdWxkIG5vdCBiZSBsb2NhdGVkXG4iLCBsb2NhdGlvbik7Ci0JCWdvdG8gZXJyb3I7Ci0JfQotCiAJZmlsZSA9IG9wZW4gKGxvY2F0aW9uLCBPX1JET05MWSk7CiAJaWYgKGZpbGUgPCAwKSB7CiAJCWZwcmludGYgKHN0ZGVyciwgIkZpbGUgJXMgY291bGQgbm90IGJlIG9wZW5lZCBmb3IgcmVhZGluZ1xuIiwgbG9jYXRpb24pOwogCQlnb3RvIGVycm9yOwogCX0KIAorCXJldHZhbCA9IGZzdGF0KGZpbGUsICZidWYpOworCWlmIChyZXR2YWwpIHsKKwkJZnByaW50ZihzdGRlcnIsICJGaWxlICVzIGNvdWxkIG5vdCBiZSBzdGF0KCknZWRcbiIsIGxvY2F0aW9uKTsKKwkJZ290byBlcnJvcjsKKwl9CisKIAlmaWxlYnVmID0gbWFsbG9jKGJ1Zi5zdF9zaXplKTsKIAlpZiAoIWZpbGVidWYpIHsKIAkJZnByaW50ZiAoc3RkZXJyLCAib3V0IG9mIG1lbW9yeVxuIik7CkBAIC0zMzIsNiArMzM4LDggQEAKIAkJLyogZGF0YSBnb2VzIG9uIGxhc3QgbGluayAqLwogCQlpZiAoaSA9PSBubGlua3MpIHNpemUgPSBidWYuc3Rfc2l6ZTsKIAorCQlpZiAobmFtZVswXSA9PSAnLycpCisJCQluYW1lKys7CiAJCW5hbWVzaXplID0gc3RybGVuKG5hbWUpICsgMTsKIAkJc3ByaW50ZihzLCIlcyUwOFglMDhYJTA4bFglMDhsWCUwOFglMDhsWCIKIAkJICAgICAgICIlMDhsWCUwOFglMDhYJTA4WCUwOFglMDhYJTA4WCIsCg==